ZGlmZiAtLWdpdCBhL0NsZWFuU3BlYy5tayBiL0NsZWFuU3BlYy5tawppbmRleCA3OTNjYmY0Li5lNTg0ZmZiIDEwMDY0NAotLS0gYS9DbGVhblNwZWMubWsKKysrIGIvQ2xlYW5TcGVjLm1rCkBAIC04MSw2ICs4MSw3IEBACiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYnN0YWdlZnJpZ2h0X3htbHBhcnNlckAxLjAuc28pCiAkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYnN0YWdlZnJpZ2h0X3NvZnRfKikKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvdm5kay9saWJzdGFnZWZyaWdodF9zb2Z0XyopCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9zeXN0ZW0vbGliL2xpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlnKikKIAogIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCmRpZmYgLS1naXQgYS9hcGV4L0FuZHJvaWQuYnAgYi9hcGV4L0FuZHJvaWQuYnAKaW5kZXggNTc1NjAzZi4uMGE5NTUxZCAxMDA2NDQKLS0tIGEvYXBleC9BbmRyb2lkLmJwCisrKyBiL2FwZXgvQW5kcm9pZC5icApAQCAtMTIsMjUgKzEyLDkzIEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAorYXBleF9kZWZhdWx0cyB7CisgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLWRlZmF1bHRzIiwKKyAgICBqYXZhX2xpYnM6IFsidXBkYXRhYmxlLW1lZGlhIl0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorICAgIG11bHRpbGliOiB7CisgICAgICAgIGZpcnN0OiB7CisgICAgICAgICAgICAvLyBFeHRyYWN0b3IgcHJvY2VzcyBydW5zIG9ubHkgd2l0aCB0aGUgcHJpbWFyeSBBQkkuCisgICAgICAgICAgICBuYXRpdmVfc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgICAgICAgICAvLyBFeHRyYWN0b3IgcGx1Z2lucworICAgICAgICAgICAgICAgICJsaWJhYWNleHRyYWN0b3IiLAorICAgICAgICAgICAgICAgICJsaWJhbXJleHRyYWN0b3IiLAorICAgICAgICAgICAgICAgICJsaWJmbGFjZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGlibWlkaWV4dHJhY3RvciIsCisgICAgICAgICAgICAgICAgImxpYm1rdmV4dHJhY3RvciIsCisgICAgICAgICAgICAgICAgImxpYm1wM2V4dHJhY3RvciIsCisgICAgICAgICAgICAgICAgImxpYm1wNGV4dHJhY3RvciIsCisgICAgICAgICAgICAgICAgImxpYm1wZWcyZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGlib2dnZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGlid2F2ZXh0cmFjdG9yIiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgICAgIGJvdGg6IHsKKyAgICAgICAgICAgIG5hdGl2ZV9zaGFyZWRfbGliczogWworICAgICAgICAgICAgICAgIC8vIE1lZGlhUGxheWVyMgorICAgICAgICAgICAgICAgICJsaWJtZWRpYTJfam5pIiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgfSwKKyAgICBrZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5rZXkiLAorICAgIGNlcnRpZmljYXRlOiAiOmNvbS5hbmRyb2lkLm1lZGlhLmNlcnRpZmljYXRlIiwKKworICAgIC8vIFVzZSBhIGN1c3RvbSBBbmRyb2lkTWFuaWZlc3QueG1sIHVzZWQgZm9yIEFQSSB0YXJnZXRpbmcuCisgICAgYW5kcm9pZE1hbmlmZXN0OiAiOmNvbS5hbmRyb2lkLm1lZGlhLWFuZHJvaWRNYW5pZmVzdCIsCit9CisKIGFwZXggewogICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYSIsCiAgICAgbWFuaWZlc3Q6ICJtYW5pZmVzdC5qc29uIiwKLSAgICBuYXRpdmVfc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgLy8gRXh0cmFjdG9yIHBsdWdpbnMKLSAgICAgICAgImxpYmFhY2V4dHJhY3RvciIsCi0gICAgICAgICJsaWJhbXJleHRyYWN0b3IiLAotICAgICAgICAibGliZmxhY2V4dHJhY3RvciIsCi0gICAgICAgICJsaWJtaWRpZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYm1rdmV4dHJhY3RvciIsCi0gICAgICAgICJsaWJtcDNleHRyYWN0b3IiLAotICAgICAgICAibGlibXA0ZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYm1wZWcyZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYm9nZ2V4dHJhY3RvciIsCi0gICAgICAgICJsaWJ3YXZleHRyYWN0b3IiLAotICAgICAgICAvLyBNZWRpYVBsYXllcjIKLSAgICAgICAgImxpYm1lZGlhMl9qbmkiLAorICAgIGRlZmF1bHRzOiBbImNvbS5hbmRyb2lkLm1lZGlhLWRlZmF1bHRzIl0sCit9CisKK2ZpbGVncm91cCB7CisgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLWFuZHJvaWRNYW5pZmVzdCIsCisgICAgc3JjczogWyJBbmRyb2lkTWFuaWZlc3QtbWVkaWEueG1sIl0sCit9CisKK2ZpbGVncm91cCB7CisgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtYW5kcm9pZE1hbmlmZXN0IiwKKyAgICBzcmNzOiBbIkFuZHJvaWRNYW5pZmVzdC1zd2NvZGVjLnhtbCJdLAorfQorCithcGV4X2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1kZWZhdWx0cyIsCisgICAgYmluYXJpZXM6IFsKKyAgICAgICAgIm1lZGlhc3djb2RlYyIsCiAgICAgXSwKLSAgICBrZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5rZXkiLAorICAgIHByZWJ1aWx0czogWworICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1tZWRpYXN3Y29kZWMucmMiLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1sZC5jb25maWcudHh0IiwKKyAgICAgICAgIm1lZGlhc3djb2RlYy5wb2xpY3kiLAorICAgIF0sCisgICAgdXNlX3ZlbmRvcjogdHJ1ZSwKKyAgICBrZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmtleSIsCisgICAgY2VydGlmaWNhdGU6ICI6Y29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5jZXJ0aWZpY2F0ZSIsCisKKyAgICAvLyBVc2UgYSBjdXN0b20gQW5kcm9pZE1hbmlmZXN0LnhtbCB1c2VkIGZvciBBUEkgdGFyZ2V0aW5nLgorICAgIGFuZHJvaWRNYW5pZmVzdDogIjpjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLWFuZHJvaWRNYW5pZmVzdCIsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtbWVkaWFzd2NvZGVjLnJjIiwKKyAgICBzcmM6ICJtZWRpYXN3Y29kZWMucmMiLAorICAgIGZpbGVuYW1lOiAiaW5pdC5yYyIsCisgICAgaW5zdGFsbGFibGU6IGZhbHNlLAorfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLWxkLmNvbmZpZy50eHQiLAorICAgIHNyYzogImxkLmNvbmZpZy50eHQiLAorICAgIGZpbGVuYW1lOiAibGQuY29uZmlnLnR4dCIsCisgICAgaW5zdGFsbGFibGU6IGZhbHNlLAorfQorCithcGV4IHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgbWFuaWZlc3Q6ICJtYW5pZmVzdF9jb2RlYy5qc29uIiwKKyAgICBkZWZhdWx0czogWyJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLWRlZmF1bHRzIl0sCiB9CiAKIGFwZXhfa2V5IHsKQEAgLTM4LDMgKzEwNiwxOSBAQAogICAgIHB1YmxpY19rZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5hdmJwdWJrZXkiLAogICAgIHByaXZhdGVfa2V5OiAiY29tLmFuZHJvaWQubWVkaWEucGVtIiwKIH0KKworYXBleF9rZXkgeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmtleSIsCisgICAgcHVibGljX2tleTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMuYXZicHVia2V5IiwKKyAgICBwcml2YXRlX2tleTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMucGVtIiwKK30KKworYW5kcm9pZF9hcHBfY2VydGlmaWNhdGUgeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5jZXJ0aWZpY2F0ZSIsCisgICAgY2VydGlmaWNhdGU6ICJjb20uYW5kcm9pZC5tZWRpYSIsCit9CisKK2FuZHJvaWRfYXBwX2NlcnRpZmljYXRlIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5jZXJ0aWZpY2F0ZSIsCisgICAgY2VydGlmaWNhdGU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKK30KZGlmZiAtLWdpdCBhL2FwZXgvQW5kcm9pZE1hbmlmZXN0LW1lZGlhLnhtbCBiL2FwZXgvQW5kcm9pZE1hbmlmZXN0LW1lZGlhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2QzZjNhCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9BbmRyb2lkTWFuaWZlc3QtbWVkaWEueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm1lZGlhIj4KKyAgPCEtLSBBUEVYIGRvZXMgbm90IGhhdmUgY2xhc3Nlcy5kZXggLS0+CisgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmhhc0NvZGU9ImZhbHNlIiAvPgorICA8dXNlcy1zZGsKKyAgICAgIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMjgiCisgICAgICBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjI4IgorICAvPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2FwZXgvQW5kcm9pZE1hbmlmZXN0LXN3Y29kZWMueG1sIGIvYXBleC9BbmRyb2lkTWFuaWZlc3Qtc3djb2RlYy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQyMGRjMAotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvQW5kcm9pZE1hbmlmZXN0LXN3Y29kZWMueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiPgorICA8IS0tIEFQRVggZG9lcyBub3QgaGF2ZSBjbGFzc2VzLmRleCAtLT4KKyAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6aGFzQ29kZT0iZmFsc2UiIC8+CisgIDx1c2VzLXNkaworICAgICAgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIyOCIKKyAgICAgIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMjgiCisgIC8+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5wazggYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnBrOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGY3NDFlCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5wazgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmF2YnB1YmtleSBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5hdmJwdWJrZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1OTcyMwotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5hdmJwdWJrZXkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLnBlbSBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3OWNkMwotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5wZW0KQEAgLTAsMCArMSw1MSBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJSktnSUJBQUtDQWdFQXZCNmxPRUVPUjU4S01jRmxheUVaanNYdVBnY2ZIaS9PUHhjdmZwaUdMQ3BPY0szbAorT1BDaFdVdkRSY0lITUI3Qk8rQ3NmeHMwSGdzSHZ2WmZOeW9OSW05OVdjakZiYm9pTzdXckJCQXJJc3pQcjE0WAorY2ZZMk54elQ5TEJqK0VxQW5iZEwrNE9RVzEvbnBMSE5FMHF0RGN4TDcxaXBialN1S05iNThFOXFHTDBLd3ZrUworZnd3dWVXaisrYmcvaXo3ZHEwbXo3aUtwbnhZc2NObTRSaEpqcWNHMlVzbWc0RWpocjhoNVVtT1VtVEpiT2JDLwordnpDbFhRcWVldXpTOE5UdEdWZ1EvQ0k5Z0MyV045dXBxMnAvMlQ3UDRVM28zQ1d2Qnl0VW9MS1IwVXlDODNleQorUzhYSmdPYTQydVdSM1QvZUpPSTFaUzRINlNyZzFvMlhDOFliOEVwckZJL05NNi8rLzVEWC9GZ0RpbXNzbEFQNgorUXE0K3BTdGU5di9GaldHcXk3UUJRYWVmRlJHUnVTNjN4SGNTWmhYQzlKMkNGZG54bzgrNjVRVDhyNHlmUUVlaQorQXgvMFE5NHlCN1ZJTDFwSUp4SEVvbktqdGQzaUtkRkVLUXpBREozZWRzbXRIeWJFUmRKS0N4Y205UUlyRENzQworNFlWVDluWDBPb0M5UkQ1ZDVFVkQ3VzVJNmVFblJ1NmlncktJS2dVVnBwZVlGUU5aRCtvK2VpTkphNHlvZ2dSbAoraDhzVDAveExLak1SeEFRN2ZhZmkxaitMQjJPN1VnSm1JRERBbmlkcThBb3o3aDNwTmkxMzlyTldyak5md2h1cworbk1jWnZMOWRUVnYyNkpXZUVTSFAvekFmQVg3ajFyZmtEd1IwMm9jUkxxdXdFVXMxK1VIQTI3V2kxYk1DQXdFQQorQVFLQ0FnQU8zUFQ4M3RiNy9hcldoNHMxemFXeFRCNG90SE5XOVR2OGJCNktpQTZCeXMzcnhUR0pNQ252WGpjTgorZWVrTGVrS1dNb2d1ZXIzQmFlbXd3dEovRDBsK1lRU3NaVnFEOHVMbGlOTDhQVExMU3hkVnFiOThkNUdOQlRBUgorOHlYUzVrQUhOZ1pBMXdJKzFmTDlaamJud1V5dS9HYzdmK3ZURTBKM1k1VFgwYzUyS2VtQndpQWQvWjVtWlU5UAorOTZpOW5iZng0cDdldjhwYkVXdHRkeVpDRXczZ3liZFlEeW93emxGV2pDWlp4aGhsaWo3KzdlSVlmd1Z4dG5jVAorQzBjWFZCdHZseSt3WEJ3ejFtWTUvNWNHUGlIZnprQ3FjbmRsZld5NHlrbWpjTGhvcXZ6bHM1MVlzMFhhYzJCRAorbTBQTkVWREI1VVdHdXY1UkE5eEQxMmdKdkJ0VTNEN2dnTXc2QzVSY1hKVCtqU1ltU0Z0RDJrbFdpK0l0OEEvTgorSHY0MnNvS3NrdDZKcVlBV0UxY3ZKM1BFcUg5QVNFSk5xMlIwWi9QbXVNMDAwVUp5elU5S0lkM1NOd2pYQTFYYworS245aFJnYTR1ZjllbEhUamtURHQ3OS84K1h2N2hqZXI5c0YvUy9ucDdnMDRyVWpJV2t1RmtDLzdOSzJ0UVNoMQorbWxqVjFzRDlTRjREUGZWSzc1THdKSmFRVWxJN1R0R2Q1S0o3Rnpad3ZiK3c4T0RycFczaGt0NkZjSTZLd0UvYQorUVQxVDJaOURrblhKU1lOZFdHcmo2dk1Ic1lNaXl6OElkQUhTQ3JPQjZlWENReHBpdGJuNlc3MVJhdzdmOVVhWgorVkRLNUFoVFU0OTNoa0dqMW5vNGNKd2VjWEluTWlnZy9jNHl3azJJYmg2SVY4TzBua1FLQ0FRRUEyK2RRUTBJRgordnZWZ21RMld4SEJEN00ybWJPeWY0M1lCWTZLYTZvUEJOR1BWcFpFOFg4TG9UYXZRTFYrU2dDa0g4VDZnWTdYUworNUw0WmUwSkZ4ZnVhMG8xcm02K0wyWHJPeDVGL0EyWTQwWWNQY2xFaWs1aDF3b1N3SC9KMWlIR2lFaFk4TnFldQorOUdDdmpRb2prZ1h4L1JuM056K2xwdlozMjlPM0g4NVJXV0dGMGw2MFJ3TE9raWcwWndVYjYxOXQ4YWZmbUdJbAorc3hkRHYybmZ5N090Slg4aUdEdWE3S2Y2NGR2VldRS0t0QUNXa0FScmxrY1dYM3VvRVN4a3BTRHh1ZSt6N25kSAorbzd1SExmTThUeCtSbitRdllXdVJXNVRQTGJFRE1iSVlyWDY1SVN0MnIvVDd2LzA0WGRBQzhZcENRUnl0bHFQSQorZnBEbTE1aHR5SEJpelFLQ0FRRUEydis1b3RSb1k1NkpkdUlTYVZHbHNKL0lidkt6REFJeVdtTTE0RXBSQ1I1RQorbHUrTXBUY1JBaUZRQWJIR1hyMXRNbFRGZFZGRDA5MFdBeklLYUt0QURGVkxYb2JJSGVHc3BuUkNxNU9wVnA5VworUnZMdFZ3THhmbEhBYzJ5TjkvTE50bkJxSFVndCtTMDFMQlBFbHliZEdIUVJUdHFBS1hoa3AzMXNNMjFPMzRHbworUHJpL0l4Z3VwV3h5a01hVzQ0S2lnMUNyNURLdmM4Y3dVc0d1eURkSm04b0JRZU5QVE1XcVNuWHRxb1RXU2FZZworMmt4aU1URm9rcmtTWGd1ZmI4d25nNk9YdC9RZWx5d3JoRzNoQXNsZFBPM0dkS2lkRFN4aFdaU2dwVVhYRmRBWAoreTRHTzBJY1JKQkYvV0p0WVRZdFIrbDg0blFBMi8xWWU0dWpGbFQwYWZ3S0NBUUVBbVhyWHBTbTJjdkkyQ256VworaHFKSWRrV09hNlczYm4xVk9PSXJ0NVJmeTU0R1pubDRwdW1WVTJpZ2NwcXEySEpLemRERkJ2TEhqOGt5WmJuNgora3RVcDJOekZoeks5cS91dnlOQSswdk9Nb29qZWVnNHcwTXp2RytXYU82SHc4RnRISDlLUEVpSjAxTEdLdFNpbgorYk9walhDQzhUNzVIY3NIQkpCZWZUejZqdm50M2VEMkxHNmpVM21QYk55LzByWkc4WFphcVUyUGxKaHNOdU5JLworVmFCQkw5T015MWNHcVRnUXZZUytZbEtJMWxzMnVxdXJINGJjRWFadnhoU3k1aUdaTlFvZERrb0lJVG5vZm1TdQorNmhhQmdCUTJFWXVQTjFra1JLS3dOUVkxZlJuZVFrMWdtQ3luYlBkaVdPK3Vya0N1UDEyeHRscjN1NGFNNTFyRworL01lYjNRS0NBUUVBMTJTeFptOVhoTE9ITElCSjc0QTRZTEdtNTBpWnhYUGJwbjd4bkhvN25hWkJlOXA4RUh0SworcFRleWd4Z2dyVW5PUHJTVnlUOTJZTWlRUC9CVndJQythK0x3VURac1dNZC9rZS9ES3hIK2VZNFp3NHBtMlMreAorNmJYcWZSd0Z2aHIzTFRyL2czRmNsamxhbE5HVWg3M1hzNWRrOXBOOWZreEZZMTYrcnc0UmgwNzA5VXVyNG82RQorUW51WmFyK0g1SmkxMGtYajZudlhpUjRlYnliRUMzUWxWNjZrOGZMcUtlNDRBU2hmNjFqZmtteHMzNGhGQTNFLworRXlBbjZvdXY4cnR2R2RBckJ1aDV0ZUhobzB5WEJMQ2NuYktYZ0dIZXBmaENmMkxwWmVSOUdaMGo2aXF4Rm5QaAorN2dHdnFLeVJleU5PSzl5L3g5dFFQRzZ0eml0M09jTnhiUUtDQVFFQXVEaGVET1NrWFBvcFhNdkxBS09IQklkWgorcmJRN29GVERIdDU5Z2J1Y003VTgvbDJZdGF4dUtPUUZCTG56UWEvYW1Ja2tydGtsWXdPc3o4RTI0ZDdObTM5dworeWtMSHdYMFhybWpBbTZNNFhLbUR2NjZhK2tTblNWNkxFYktaZGp2WFAwMkRWK3RHZVo1VnNuTnZKRHF1eE1zRAorZnZSVHNwQjhqOENwVTk2c3pla3hsL3RDUmhxYmR3LzRrVlRTajVCRisrT2FSUmNKckF5ajFCMnFmMXluQVpFMQorZ1V2VlBrRVlhOTE0emNyeGc5WElYVDRNN3lxQjdpOEtKZWdPdE90Y1dqSjd1VGlQKzYzOEF2eWdKTE1KblNyVgorK0hqRlpXRzZQOWJ0Wm1MSFNFQlJ2d0dPQWlscDBxZWpYbzg2NmwwZm1ubEd5N2VoS3o4dTNQenZubFBZalE9PQorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5wazggYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMucGs4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YTQyMTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMucGs4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy54NTA5LnBlbSBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy54NTA5LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2I5YjRmCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLng1MDkucGVtCkBAIC0wLDAgKzEsMzQgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRjNqQ0NBOGFnQXdJQkFnSUpBSU03MkpwRDR2NlhNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR0NNUXN3Q1FZRAorVlFRR0V3SlZVekVUTUJFR0ExVUVDQXdLUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnd3TlRXOTFiblJoYVc0ZworVm1sbGR6RVFNQTRHQTFVRUNnd0hRVzVrY205cFpERVFNQTRHQTFVRUN3d0hRVzVrY205cFpERWlNQ0FHQTFVRQorQXd3WlkyOXRMbUZ1WkhKdmFXUXViV1ZrYVdFdWMzZGpiMlJsWXpBZ0Z3MHhPVEF5TVRFd01qRXhNVEZhR0E4MAorTnpVM01ERXdOekF5TVRFeE1Wb3dnWUl4Q3pBSkJnTlZCQVlUQWxWVE1STXdFUVlEVlFRSURBcERZV3hwWm05eQorYm1saE1SWXdGQVlEVlFRSERBMU5iM1Z1ZEdGcGJpQldhV1YzTVJBd0RnWURWUVFLREFkQmJtUnliMmxrTVJBdworRGdZRFZRUUxEQWRCYm1SeWIybGtNU0l3SUFZRFZRUUREQmxqYjIwdVlXNWtjbTlwWkM1dFpXUnBZUzV6ZDJOdgorWkdWak1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBc3FYRTBBSVdwTFc5VGdxMgorblFHcGg3S1o2TDJROW94dmlxQ1ZIeElhUHFmaE0yU3dUYnljQURJUWVxcnJsUnhoZGRWa2pMdU1Va0phN21ldgorZkVSbWdwaU9mblBJbEdLNlBUczJnbGpDa3NrWmhGM2JnZmV5dUh0MHRzWU8rVWFOOE1Wb1pENy9RZGlFNDZ3MgorT01EQ2xHMVVxZ2lxT0JoTFRFTi9jSFhPYm5VaWlWWFVZcU44YVlaZjZMNkZzM3lRaTJaWmdmYnhUVkZld3FkdgorYUxMT3FDWW5WWVhaSCtaeGJYRVNBME0rV1hLZ1JLc1lUajJHWXMzZWtvMXJGaTRZNnVIVkx4NDV5YW9UNXUvaQorU3hQRWtvY3lNQ0t2R0pXdTRYbFNPZDNFalNPTWFxQ09ZVnlHTHhkbG5RV1FVN1BaRHFCU0owU3lzV2dwRkhwQgorSTE1YzJqaFJkWE9DZlE5WnREZlBaa0UwYTJBOGtKREFvRjFtelRwNkl2QkFXVXNsNW5IUHc1Q1drRnBOYWQvaAordHFxR0NTY1diaUtadXZyUTQvUlFObTNmMUsrbXhYOVRyakZpZ3BxTk82ZDRwR0FvMWZhNnNIUjN4V1B3L215cQoraDVaSmpWblhVNVlxNjRTNHhXT3NzZmpwT2c3UmZOdXZ6dWszb2szTVlzMW1ieDN2aFpPajVrbTFmM3FyZ1g5YworbVhqWW55WEQwakpCbTR1QUpXWExkSzlQbFp2bFhienRNQ3pZajgzMklvNHBGTEN0U3hrelg3NXQxZW0zNk52MAorbU5wNk50U1N5NlNGU3E4bDdJc1hWMkZOeVVpeUhXeFMvVVFtOHBZZzVRNWRXSHZFRUY3OFA2bFYwd1JhNkZRbAorQkJTZ3BxVEFJMDkyS0lqRER0QjdHUUNnVjVFQ0F3RUFBYU5UTUZFd0hRWURWUjBPQkJZRUZBRklkRlRERURmdAorZXdTU0FTN0ZhM09aNVRYek1COEdBMVVkSXdRWU1CYUFGQUZJZEZUREVEZnRld1NTQVM3RmEzT1o1VFh6TUE4RworQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBQzVlM3pYeXRoSkNHbXoxRm1BVgorOFkvVUkrR2xnNkcweC9rMDRXYVJHMERQTExqbEoxRjBMTTEvSVJlQlNnWGNZQUwwQ0FnUHljZi9yR1BPZ01GbQordFF4WXlqQlV4S2RqcElxVTVESm9WMWZlYW5HdmVJUnB0bzFZUktOZ0h1ekc5clpHUjRBZ1BudDZYNFl4bHEwNAorbEk3UXBXYWRYZTFteUFSSmhqM25pU05ZOSsyd0VJbmt4NFp1Q08xTHRJR3FuYmRjOGpROFlvVnFJRTVONGt1TQorY2N5UFlnc2RBQnRvcGJqTjkycnVldThzZkY4UjZST3krdE5nYjZPanBBQWV2dG5CZloyTFhxZk9iS2lySENLKworazZ3NFdTQjFVVW9aM1hnejhzSnRYZ29rdlllSW5rTjh0SHVUYWdIWVUyVlFUY0EwcmRCR01OLzFPbGpKcFdsTgorMFVVcTRmQVlVNmNONGxIeHIyTE05SWY0V3ZBemRMQVd2YUlackRxYVU0aS96WVQ5bDZyUjRsQzJLVzNFSFdvdgorblBYZmdFSko4QVAxaVJHaWJ2ZXczaTNTQjZYVFdGUVlUVUlCZUpmRHovS0RYUWFiUCt5elhXSVNkWkNVTVVweAorZitSYXFzYjVNb0thSmRWZ25TTDBtQnVuakN5SkR6emczNEo3b0d4Ni9CbndvaU9yd0xONFFhejVVOGpiclBTeAorcDlMZmxlQ2NPN1pkZUU4R0txeDBYMVQ0ZDd0cmFkdG14T1M4SXdyNG5pc2trSEdSa3pvenZWdnV5R0ttb04yaworMTYyVmZqcStkZGo3cUVwU2gzQlM2aEhVK3ZsTWJDOUwwdHJHeFB4RkVBSERyd3UwS3dHTmR1VGtpdS8zanZmQgorSlRnSDhQOW1EMWxvWXhSZG8rdmV0OGVRCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLng1MDkucGVtIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS54NTA5LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzkwOGZhCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS54NTA5LnBlbQpAQCAtMCwwICsxLDMzIEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUZ6RENDQTdTZ0F3SUJBZ0lKQU8wNURCQnVzYWFMTUEwR0NTcUdTSWIzRFFFQkN3VUFNSG94Q3pBSkJnTlYKK0JBWVRBbFZUTVJNd0VRWURWUVFJREFwRFlXeHBabTl5Ym1saE1SWXdGQVlEVlFRSERBMU5iM1Z1ZEdGcGJpQlcKK2FXVjNNUkF3RGdZRFZRUUtEQWRCYm1SeWIybGtNUkF3RGdZRFZRUUxEQWRCYm1SeWIybGtNUm93R0FZRFZRUUQKK0RCRmpiMjB1WVc1a2NtOXBaQzV0WldScFlUQWdGdzB4T1RBeE1qVXhOekUzTVRkYUdBODBOelUyTVRJeU1URTMKK01UY3hOMW93ZWpFTE1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ01Da05oYkdsbWIzSnVhV0V4RmpBVUJnTlYKK0JBY01EVTF2ZFc1MFlXbHVJRlpwWlhjeEVEQU9CZ05WQkFvTUIwRnVaSEp2YVdReEVEQU9CZ05WQkFzTUIwRnUKK1pISnZhV1F4R2pBWUJnTlZCQU1NRVdOdmJTNWhibVJ5YjJsa0xtMWxaR2xoTUlJQ0lqQU5CZ2txaGtpRzl3MEIKK0FRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQW1Oa1Z4VWJwL2JMYmVHYnZLcVlYendCeWNTRHBtT2hoLy8vbE5HWVEKKy9BTVVEMHE2RWFaelUyYmQ0YUwwck9HcWZvWWxoS2Qwa01WbU1VbWZkRTlPREFmS3hsZUVlRWFSbDJHSlM4YTkKK0FCaTc3MGwzR0hiQjJ4TUkyc0VXZU9EOXhzUEZGNitCeVBabW9VdU5oTXI0cFViWHNEcEUzaDhsanJnWEh0SWcKK2JoN29mYnZkZHJ1d0JWMGxTMWs5T1o5alBWR2hFS2tKbmhnUWE2N2N3Z2RqaXpBTWJJMERjejlndE1NYXdzRGoKK1oyYVFkMXIrdnhnaDEvWGtJL05NbVhDbkcyRVJ5dFhjSmVDNVM0Z0V0SGZUVFBvUDBGdVZnU0I2eTZkYWxNdVoKK0YwTkJadzhNdmdkeTNRSmlwMHVOYTM2SjYzQ01aS1RKV2JUZGxGcFBMMmhrMFBnYVl2amU4QzVYdGs1Mjgyd1QKK2RNb2NjOG4yeklYYnpiblNYR3ZqY05aaWIzUGZ1NTVZVW5YNmVUcVoxQnhsSjBGSFpBc0M0cXVGRldYeFlCWUQKK0xDUm9OTkZFdElEUXB1dnVIRjJEdUhORFVMcEFRankyeTYrN2VvdDBLRXNWb0RtWjRIOEJwdUFWVnUyU3hZTmIKK2dZZmxSOVNtTTB0bVllQWNSVDQ4cTN4cm9jR3lFSE1xdmdRUlVwUGZ2Y3QvOGw4eFZjRHpPSS9zSlZEcW1Zek0KK3UwQ2ozZmtTeXBHREpPTUYvZXNGU21Wdm9JMDF0UzdrYU5TNXZ2dEtZaWIvL3hxS1JDOWYwZENzR2ZGTG51VUsKK280S1liWVdZd015SnFFZC81L1p2WHlLSVBBRWVKTDE3NEw5K3dUa2MzY1Fwb0J3Sk40dCsyRTVNbmhPRXE2ZG8KKzVMMENBd0VBQWFOVE1GRXdIUVlEVlIwT0JCWUVGSGpOSy9HWmtvMVJkWnArOGlhdldYTDV4ejl3TUI4R0ExVWQKK0l3UVlNQmFBRkhqTksvR1prbzFSZFpwKzhpYXZXWEw1eHo5d01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUoKK0tvWklodmNOQVFFTEJRQURnZ0lCQUNtUFFNa3N1THJOVjF2Ykk0NFMxZjcwSTBGSGRCeGNoRkdCMzl6dUxiY24KK1NzWW9tL0xQdFlKaUQwRGw0YkI0ZWIrWm54a1FQMlhlUDZweWNtVUgyajFFV2V4Rnd2ZFV2bGZlOFF6K3dBZWMKK2FwNEF4aVg0WjJLZTJpdllvdElaRlVIZFpPTGtYMjBqczhXZXgxbXpZNDNNTFFuNUFQbDlnSzFWWlR4RGdnZVIKK0VPYkgxUytKVmpHd1FxWVpqMmU2Z05aSDM0UTI1TlE2OThSTDg1R0RrWXRTSVNBaWZKdGFKc1UvQjN2S204MkkKK2s5eE1pQ29vQ0g2YlJkR0hHMWp6ZTRTUnBpZGp4RW04Y3hraWFRYWdmY3VYZUNMemlYSnIzcUFNS1lpRVk2YnAKKzArYkFxQ3QzUzhPcnJOM1JRWmZRcm5sd2l0c00xakpKLytDK1dvRGc0ZVk1QUZyWERMdk5lS2gxcU8vZjh4disKK2ZDWGtRUGNWVnBoTGZSSDlveE5yU2dPV0JQNS9xSURINHMxWVVMOWx1R1Q2SCswOGRsdWUzUmtiekRiQnFzUXUKKzdmUS9CYnJJRy9HdVZLZ3lFTSthN0M5Z3Y3emM4NllsdWVWWUpFeXhLaWRubjdSeE9xeURCcXl5ZlhBM3p2bWUKK1Jybzd4SXJNSFBMN051M0FXandqWHpicC93MHordEVGUHNmVkIrT09IS3NXUGNVRzBIVVRKR2t5ZU8vdUhSak4KK3FQRWtrZjdCSEhVTzRWMmdqT0lkQ3NFTHhLd0hmN3ZzWlRPazQwRVY3NTFmWjdGREhNcjFlZGRRa2dINGVxQWIKK0RCNzl1UCtTTGZVbys0Mm40cTZlTW1vcXc4ZDc2YkJYUm9VaElvL01zNHNlYmhWMHNSdEFTNjdPUWlvYzlVVWcKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2FwZXgvbGQuY29uZmlnLnR4dCBiL2FwZXgvbGQuY29uZmlnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzQyMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvYXBleC9sZC5jb25maWcudHh0CkBAIC0wLDAgKzEsNzQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgQmlvbmljIGxvYWRlciBjb25maWcgZmlsZSBmb3IgdGhlIG1lZGlhIHN3Y29kZWMgQVBFWC4KKyMKKyMgVGhlcmUgYXJlIG5vIHZlcnNpb25lZCBBUEVYIHBhdGhzIGhlcmUgLSB0aGlzIEFQRVggbW9kdWxlIGRvZXMgbm90IHN1cHBvcnQKKyMgaGF2aW5nIHNldmVyYWwgdmVyc2lvbnMgbW91bnRlZC4KKworZGlyLnN3Y29kZWMgPSAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjL2Jpbi8KKworW3N3Y29kZWNdCithZGRpdGlvbmFsLm5hbWVzcGFjZXMgPSBwbGF0Zm9ybQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICJkZWZhdWx0IiBuYW1lc3BhY2UKKyMKKyMgVGhpcyBuYW1lc3BhY2UgaXMgZm9yIHRoZSBiaW5hcmllcyBhbmQgbGlicmFyaWVzIG9uIHRoZSBzd2NvZGVjIEFQRVguCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK25hbWVzcGFjZS5kZWZhdWx0Lmlzb2xhdGVkID0gdHJ1ZQorbmFtZXNwYWNlLmRlZmF1bHQudmlzaWJsZSA9IHRydWUKKworbmFtZXNwYWNlLmRlZmF1bHQuc2VhcmNoLnBhdGhzICAgICAgPSAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLyR7TElCfQorbmFtZXNwYWNlLmRlZmF1bHQuYXNhbi5zZWFyY2gucGF0aHMgPSAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLyR7TElCfQorCisjIEtlZXAgdGhlIGJlbG93IGluIHN5bmMgd2l0aCAic3BoYWwiIG5hbWVzcGFjZSBpbiBzeXN0ZW0ncyAvZXRjL2xkLmNvbmZpZy50eHQKKyMgQ29kZWMyIGhhcyBkZXBlbmRlbmNpZXMgb24gc29tZSBTUC1oYWxzIChlZy4gYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMi4wKQorIyBUaGVzZSBhcmUgZGxvcGVuJ2VkIGJ5IGxpYnZuZGtzdXBwb3J0LnNvLgorbmFtZXNwYWNlLmRlZmF1bHQuc2VhcmNoLnBhdGhzICs9IC9vZG0vJHtMSUJ9CituYW1lc3BhY2UuZGVmYXVsdC5zZWFyY2gucGF0aHMgKz0gL3ZlbmRvci8ke0xJQn0KKworbmFtZXNwYWNlLmRlZmF1bHQucGVybWl0dGVkLnBhdGhzICA9IC9vZG0vJHtMSUJ9CituYW1lc3BhY2UuZGVmYXVsdC5wZXJtaXR0ZWQucGF0aHMgKz0gL3ZlbmRvci8ke0xJQn0KK25hbWVzcGFjZS5kZWZhdWx0LnBlcm1pdHRlZC5wYXRocyArPSAvdmVuZG9yLyR7TElCfS9odworbmFtZXNwYWNlLmRlZmF1bHQucGVybWl0dGVkLnBhdGhzICs9IC9zeXN0ZW0vdmVuZG9yLyR7TElCfQorCituYW1lc3BhY2UuZGVmYXVsdC5hc2FuLnNlYXJjaC5wYXRocyArPSAvZGF0YS9hc2FuL29kbS8ke0xJQn0KK25hbWVzcGFjZS5kZWZhdWx0LmFzYW4uc2VhcmNoLnBhdGhzICs9ICAgICAgICAgICAvb2RtLyR7TElCfQorbmFtZXNwYWNlLmRlZmF1bHQuYXNhbi5zZWFyY2gucGF0aHMgKz0gL2RhdGEvYXNhbi92ZW5kb3IvJHtMSUJ9CituYW1lc3BhY2UuZGVmYXVsdC5hc2FuLnNlYXJjaC5wYXRocyArPSAgICAgICAgICAgL3ZlbmRvci8ke0xJQn0KKworbmFtZXNwYWNlLmRlZmF1bHQuYXNhbi5wZXJtaXR0ZWQucGF0aHMgID0gL2RhdGEvYXNhbi9vZG0vJHtMSUJ9CituYW1lc3BhY2UuZGVmYXVsdC5hc2FuLnBlcm1pdHRlZC5wYXRocyArPSAgICAgICAgICAgL29kbS8ke0xJQn0KK25hbWVzcGFjZS5kZWZhdWx0LmFzYW4ucGVybWl0dGVkLnBhdGhzICs9IC9kYXRhL2FzYW4vdmVuZG9yLyR7TElCfQorbmFtZXNwYWNlLmRlZmF1bHQuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gICAgICAgICAgIC92ZW5kb3IvJHtMSUJ9CisKK25hbWVzcGFjZS5kZWZhdWx0LmxpbmtzID0gcGxhdGZvcm0KKworIyBUT0RPOiByZXBsYWNlIHRoZSBmb2xsb3dpbmcgd2hlbiBhcGV4IGhhcyBhIHdheSB0byBhdXRvLWdlbmVyYXRlIHRoaXMgbGlzdAorIyBuYW1lc3BhY2UuZGVmYXVsdC5saW5rLnBsYXRmb3JtLnNoYXJlZF9saWJzICA9ICVMTE5ES19MSUJSQVJJRVMlCisjIG5hbWVzcGFjZS5kZWZhdWx0LmxpbmsucGxhdGZvcm0uc2hhcmVkX2xpYnMgKz0gJVNBTklUSVpFUl9SVU5USU1FX0xJQlJBUklFUyUKK25hbWVzcGFjZS5kZWZhdWx0LmxpbmsucGxhdGZvcm0uc2hhcmVkX2xpYnMgPSBsaWJFR0wuc286bGliR0xFU3YxX0NNLnNvOmxpYkdMRVN2Mi5zbzpsaWJHTEVTdjMuc286bGliUlMuc286bGliYW5kcm9pZF9uZXQuc286bGliYy5zbzpsaWJjbGFuZ19ydC5hc2FuLWFhcmNoNjQtYW5kcm9pZC5zbzpsaWJjbGFuZ19ydC5hc2FuLWFybS1hbmRyb2lkLnNvOmxpYmNsYW5nX3J0Lmh3YXNhbi1hYXJjaDY0LWFuZHJvaWQuc286bGliY2xhbmdfcnQuYXNhbi1pNjg2LWFuZHJvaWQuc286bGliY2xhbmdfcnQuYXNhbi14ODZfNjQtYW5kcm9pZC5zbzpsaWJkbC5zbzpsaWJmdDIuc286bGlibG9nLnNvOmxpYm0uc286bGlibWVkaWFuZGsuc286bGlibmF0aXZld2luZG93LnNvOmxpYm5ldXJhbG5ldHdvcmtzLnNvOmxpYnN5bmMuc286bGlidm5ka3N1cHBvcnQuc286bGlidnVsa2FuLnNvCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgInBsYXRmb3JtIiBuYW1lc3BhY2UKKyMKKyMgVGhpcyBuYW1lc3BhY2UgaXMgZm9yIGxpbmtpbmcgdG8gTExOREsgYW5kIEFTQU4gbGlicmFyaWVzIG9uIHRoZSBzeXN0ZW0uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK25hbWVzcGFjZS5wbGF0Zm9ybS5pc29sYXRlZCA9IHRydWUKKworbmFtZXNwYWNlLnBsYXRmb3JtLnNlYXJjaC5wYXRocyA9IC9zeXN0ZW0vJHtMSUJ9CituYW1lc3BhY2UucGxhdGZvcm0uYXNhbi5zZWFyY2gucGF0aHMgPSAvZGF0YS9hc2FuL3N5c3RlbS8ke0xJQn0KKworIyAvc3lzdGVtL2xpYi9saWJjLnNvLCBldGMgYXJlIHN5bWxpbmtzIHRvIC9hcGV4L2NvbS5hbmRyb2lkLmxpYi9saWIvYmlvbmljL2xpYmMuc28sIGV0Yy4KKyMgQWRkIC9hcGV4Ly4uLiBwYXQgdG8gdGhlIHBlcm1pdHRlZCBwYXRocyBiZWNhdXNlIGxpbmtlciB1c2VzIHJlYWxwYXRoKDMpCisjIHRvIGNoZWNrIHRoZSBhY2Nlc3NpYmlsaXR5IG9mIHRoZSBsaWIuIFdlIGNvdWxkIGFkZCB0aGlzIHRvIHNlYXJjaC5wYXRocworIyBpbnN0ZWFkIGJ1dCB0aGF0IG1ha2VzIHRoZSByZXNvbHV0aW9uIG9mIGJpb25pYyBsaWJzIGJlIGRlcGVuZGVudCBvbgorIyB0aGUgb3JkZXIgb2YgL3N5c3RlbS9saWIgYW5kIC9hcGV4Ly4uLiBpbiBzZWFyY2gucGF0aHMuIElmIC9hcGV4Ly4uLgorIyBpcyBhZnRlciAvc3lzdGVtL2xpYiwgdGhlbiAvYXBleC8uLi4gaXMgbmV2ZXIgdHJpZWQgYmVjYXVzZSBsaWJjLnNvCisjIGlzIGFsd2F5cyBmb3VuZCBpbiAvc3lzdGVtL2xpYiBidXQgZmFpbHMgdG8gcGFzcyB0aGUgYWNjZXNzaWJpbGl0eSB0ZXN0CisjIGJlY2F1c2Ugb2YgaXRzIHJlYWxwYXRoLiAgSXQncyBiZXR0ZXIgdG8gbm90IGRlcGVuZCBvbiB0aGUgb3JkZXJpbmcgaWYKKyMgcG9zc2libGUuCituYW1lc3BhY2UucGxhdGZvcm0ucGVybWl0dGVkLnBhdGhzID0gL2FwZXgvY29tLmFuZHJvaWQucnVudGltZS8ke0xJQn0vYmlvbmljCituYW1lc3BhY2UucGxhdGZvcm0uYXNhbi5wZXJtaXR0ZWQucGF0aHMgPSAvYXBleC9jb20uYW5kcm9pZC5ydW50aW1lLyR7TElCfS9iaW9uaWMKZGlmZiAtLWdpdCBhL2FwZXgvbWFuaWZlc3RfY29kZWMuanNvbiBiL2FwZXgvbWFuaWZlc3RfY29kZWMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmJjZWVjCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9tYW5pZmVzdF9jb2RlYy5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAibmFtZSI6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgInZlcnNpb24iOiAxCit9CmRpZmYgLS1naXQgYS9hcGV4L21lZGlhc3djb2RlYy5yYyBiL2FwZXgvbWVkaWFzd2NvZGVjLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNzQ4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L21lZGlhc3djb2RlYy5yYwpAQCAtMCwwICsxLDcgQEAKK3NlcnZpY2UgbWVkaWEuc3djb2RlYyAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjL2Jpbi9tZWRpYXN3Y29kZWMKKyAgICBjbGFzcyBtYWluCisgICAgdXNlciBtZWRpYWNvZGVjCisgICAgZ3JvdXAgY2FtZXJhIGRybXJwYyBtZWRpYWRybQorICAgIG92ZXJyaWRlCisgICAgaW9wcmlvIHJ0IDQKKyAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCmRpZmYgLS1naXQgYS9hcGV4L3Rlc3RpbmcvQW5kcm9pZC5icCBiL2FwZXgvdGVzdGluZy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMWNlZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L3Rlc3RpbmcvQW5kcm9pZC5icApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCithcGV4IHsKKyAgICBuYW1lOiAidGVzdF9jb20uYW5kcm9pZC5tZWRpYSIsCisgICAgbWFuaWZlc3Q6ICJ0ZXN0X21hbmlmZXN0Lmpzb24iLAorICAgIGZpbGVfY29udGV4dHM6ICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgZGVmYXVsdHM6IFsiY29tLmFuZHJvaWQubWVkaWEtZGVmYXVsdHMiXSwKKyAgICBpbnN0YWxsYWJsZTogZmFsc2UsCit9CisKK2FwZXggeworICAgIG5hbWU6ICJ0ZXN0X2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIG1hbmlmZXN0OiAidGVzdF9tYW5pZmVzdF9jb2RlYy5qc29uIiwKKyAgICBmaWxlX2NvbnRleHRzOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgZGVmYXVsdHM6IFsiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1kZWZhdWx0cyJdLAorICAgIGluc3RhbGxhYmxlOiBmYWxzZSwKK30KZGlmZiAtLWdpdCBhL2FwZXgvdGVzdGluZy90ZXN0X21hbmlmZXN0Lmpzb24gYi9hcGV4L3Rlc3RpbmcvdGVzdF9tYW5pZmVzdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmODFmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L3Rlc3RpbmcvdGVzdF9tYW5pZmVzdC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAibmFtZSI6ICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICJ2ZXJzaW9uIjogMgorfQpkaWZmIC0tZ2l0IGEvYXBleC90ZXN0aW5nL3Rlc3RfbWFuaWZlc3RfY29kZWMuanNvbiBiL2FwZXgvdGVzdGluZy90ZXN0X21hbmlmZXN0X2NvZGVjLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1NjQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvdGVzdGluZy90ZXN0X21hbmlmZXN0X2NvZGVjLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJuYW1lIjogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAidmVyc2lvbiI6IDIKK30KZGlmZiAtLWdpdCBhL2NhbWVyYS9BbmRyb2lkLmJwIGIvY2FtZXJhL0FuZHJvaWQuYnAKaW5kZXggMjRiMzkxOC4uMjE1ODhkNCAxMDA2NDQKLS0tIGEvY2FtZXJhL0FuZHJvaWQuYnAKKysrIGIvY2FtZXJhL0FuZHJvaWQuYnAKQEAgLTQzLDYgKzQzLDcgQEAKICAgICAgICAgIklDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmNwcCIsCiAgICAgICAgICJjYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcCIsCiAgICAgICAgICJjYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uY3BwIiwKKyAgICAgICAgImNhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uY3BwIiwKICAgICAgICAgImNhbWVyYTIvU3VibWl0SW5mby5jcHAiLAogICAgICAgICAiQ2FtZXJhQmFzZS5jcHAiLAogICAgICAgICAiQ2FtZXJhVXRpbHMuY3BwIiwKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAgYi9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwCmluZGV4IGUxNDNlMDUuLjkyZmU4NGIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcApAQCAtMjIsNyArMjIsNiBAQAogCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgotI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDA5LDYgKzQwOCw3OSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYU1ldGFkYXRhOjpyZW1vdmVQZXJtaXNzaW9uRW50cmllcyhtZXRhZGF0YV92ZW5kb3JfaWRfdCB2ZW5kb3JJZCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gKnRhZ3NSZW1vdmVkKSB7CisgICAgdWludDMyX3QgdGFnQ291bnQgPSAwOworICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiB0YWdzVG9SZW1vdmU7CisKKyAgICBpZiAodGFnc1JlbW92ZWQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHZUYWdzID0gVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0R2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOworICAgIGlmICgobnVsbHB0ciA9PSB2VGFncy5nZXQoKSkgfHwgKDAgPj0gdlRhZ3MtPmdldFRhZ0NvdW50KCkpKSB7CisgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZT4gY2FjaGUgPQorICAgICAgICAgICAgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOjpnZXRHbG9iYWxWZW5kb3JUYWdDYWNoZSgpOworICAgICAgICBpZiAoY2FjaGUuZ2V0KCkpIHsKKyAgICAgICAgICAgIGNhY2hlLT5nZXRWZW5kb3JUYWdEZXNjcmlwdG9yKHZlbmRvcklkLCAmdlRhZ3MpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChudWxscHRyICE9IHZUYWdzLmdldCgpKSAmJiAodlRhZ3MtPmdldFRhZ0NvdW50KCkgPiAwKSkgeworICAgICAgICB0YWdDb3VudCA9IHZUYWdzLT5nZXRUYWdDb3VudCgpOworICAgICAgICB1aW50MzJfdCAqdmVuZG9yVGFncyA9IG5ldyB1aW50MzJfdFt0YWdDb3VudF07CisgICAgICAgIGlmIChudWxscHRyID09IHZlbmRvclRhZ3MpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgdlRhZ3MtPmdldFRhZ0FycmF5KHZlbmRvclRhZ3MpOworCisgICAgICAgIHRhZ3NUb1JlbW92ZS5yZXNlcnZlKHRhZ0NvdW50KTsKKyAgICAgICAgdGFnc1RvUmVtb3ZlLmluc2VydCh0YWdzVG9SZW1vdmUuYmVnaW4oKSwgdmVuZG9yVGFncywgdmVuZG9yVGFncyArIHRhZ0NvdW50KTsKKworICAgICAgICBkZWxldGUgW10gdmVuZG9yVGFnczsKKyAgICAgICAgdGFnQ291bnQgPSAwOworICAgIH0KKworICAgIGF1dG8gdGFnc05lZWRpbmdQZXJtaXNzaW9uID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9wZXJtaXNzaW9uX25lZWRlZCgmdGFnQ291bnQpOworICAgIGlmICh0YWdDb3VudCA+IDApIHsKKyAgICAgICAgdGFnc1RvUmVtb3ZlLnJlc2VydmUodGFnc1RvUmVtb3ZlLmNhcGFjaXR5KCkgKyB0YWdDb3VudCk7CisgICAgICAgIHRhZ3NUb1JlbW92ZS5pbnNlcnQodGFnc1RvUmVtb3ZlLmVuZCgpLCB0YWdzTmVlZGluZ1Blcm1pc3Npb24sCisgICAgICAgICAgICAgICAgdGFnc05lZWRpbmdQZXJtaXNzaW9uICsgdGFnQ291bnQpOworICAgIH0KKworICAgIHRhZ3NSZW1vdmVkLT5yZXNlcnZlKHRhZ3NUb1JlbW92ZS5zaXplKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiB0YWdzVG9SZW1vdmUpIHsKKyAgICAgICAgaWYgKGV4aXN0cyhpdCkpIHsKKyAgICAgICAgICAgIGF1dG8gcmMgPSBlcmFzZShpdCk7CisgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBlcmFzZSB0YWc6ICV4IiwgX19mdW5jX18sIGl0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0YWdzUmVtb3ZlZC0+cHVzaF9iYWNrKGl0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFVwZGF0ZSB0aGUgYXZhaWxhYmxlIGNoYXJhY3RlcnN0aWNzIGFjY29yZGluZ2x5CisgICAgaWYgKGV4aXN0cyhBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTKSkgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gY3VycmVudEtleXM7CisKKyAgICAgICAgc3RkOjpzb3J0KHRhZ3NSZW1vdmVkLT5iZWdpbigpLCB0YWdzUmVtb3ZlZC0+ZW5kKCkpOworICAgICAgICBhdXRvIGtleXMgPSBmaW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVMpOworICAgICAgICBjdXJyZW50S2V5cy5yZXNlcnZlKGtleXMuY291bnQpOworICAgICAgICBjdXJyZW50S2V5cy5pbnNlcnQoY3VycmVudEtleXMuZW5kKCksIGtleXMuZGF0YS5pMzIsIGtleXMuZGF0YS5pMzIgKyBrZXlzLmNvdW50KTsKKyAgICAgICAgc3RkOjpzb3J0KGN1cnJlbnRLZXlzLmJlZ2luKCksIGN1cnJlbnRLZXlzLmVuZCgpKTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBuZXdLZXlzKGtleXMuY291bnQpOworICAgICAgICBhdXRvIGVuZCA9IHN0ZDo6c2V0X2RpZmZlcmVuY2UoY3VycmVudEtleXMuYmVnaW4oKSwgY3VycmVudEtleXMuZW5kKCksIHRhZ3NSZW1vdmVkLT5iZWdpbigpLAorICAgICAgICAgICAgICAgIHRhZ3NSZW1vdmVkLT5lbmQoKSwgbmV3S2V5cy5iZWdpbigpKTsKKyAgICAgICAgbmV3S2V5cy5yZXNpemUoZW5kIC0gbmV3S2V5cy5iZWdpbigpKTsKKworICAgICAgICB1cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUywgbmV3S2V5cy5kYXRhKCksIG5ld0tleXMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIHZvaWQgQ2FtZXJhTWV0YWRhdGE6OmR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0IHsKICAgICBkdW1wX2luZGVudGVkX2NhbWVyYV9tZXRhZGF0YShtQnVmZmVyLCBmZCwgdmVyYm9zaXR5LCBpbmRlbnRhdGlvbik7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvT1dORVJTIGIvY2FtZXJhL09XTkVSUwppbmRleCAxOGFjZmVlLi5kNmI5NWRhIDEwMDY0NAotLS0gYS9jYW1lcmEvT1dORVJTCisrKyBiL2NhbWVyYS9PV05FUlMKQEAgLTEsNiArMSw4IEBACi1jeWNoZW5AZ29vZ2xlLmNvbQogZXBlZXZAZ29vZ2xlLmNvbQogZXRhbHZhbGFAZ29vZ2xlLmNvbQoramNob3dkaGFyeUBnb29nbGUuY29tCiBzaHV6aGVud2FuZ0Bnb29nbGUuY29tCiB5aW5jaGlheWVoQGdvb2dsZS5jb20KKyMgYmFja3VwIG93bmVyCitjeWNoZW5AZ29vZ2xlLmNvbQogemhpanVuaGVAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwIGIvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCmluZGV4IGE4NmNjODcuLmQ3MTNkMmQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcAorKysgYi9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKQEAgLTMxNSw2ICszMTUsMTAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3NzaXplX3QgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0U2VjdGlvbkluZGV4KHVpbnQzMl90IHRhZykgY29uc3QgeworICAgIHJldHVybiBtVGFnVG9TZWN0aW9uTWFwLnZhbHVlRm9yKHRhZyk7Cit9CisKIHZvaWQgVmVuZG9yVGFnRGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQsIGludCB2ZXJib3NpdHksIGludCBpbmRlbnRhdGlvbikgY29uc3QgewogCiAgICAgc2l6ZV90IHNpemUgPSBtVGFnVG9OYW1lTWFwLnNpemUoKTsKQEAgLTQwNyw2ICs0MTEsMTEgQEAKICAgICByZXR1cm4gcmVzOwogfQogCitjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8bWV0YWRhdGFfdmVuZG9yX2lkX3QsIHNwPGFuZHJvaWQ6OlZlbmRvclRhZ0Rlc2NyaXB0b3I+PiAmCisgICAgICAgICAgICBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU6OmdldFZlbmRvcklkc0FuZFRhZ0Rlc2NyaXB0b3JzKCkgeworICAgIHJldHVybiBtVmVuZG9yTWFwOworfQorCiBpbnQgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOjpnZXRUYWdDb3VudChtZXRhZGF0YV92ZW5kb3JfaWRfdCBpZCkgY29uc3QgewogICAgIGludCByZXQgPSAwOwogICAgIGF1dG8gZGVzYyA9IG1WZW5kb3JNYXAuZmluZChpZCk7CmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwKaW5kZXggOWMwZjI4Yi4uM2U4OTkyYSAxMDA2NDQKLS0tIGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5haWRsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbApAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgICoKICAgICAgKiBBbHNvIHJldHVybnMgdGhlIHNldCBvZiBjdXJyZW50bHkta25vd24gY2FtZXJhIElEcyBhbmQgc3RhdGUgb2YgZWFjaCBkZXZpY2UuCiAgICAgICogQWRkaW5nIGEgbGlzdGVuZXIgd2lsbCB0cmlnZ2VyIHRoZSB0b3JjaCBzdGF0dXMgbGlzdGVuZXIgdG8gZmlyZSBmb3IgYWxsCi0gICAgICogZGV2aWNlcyB0aGF0IGhhdmUgYSBmbGFzaCB1bml0CisgICAgICogZGV2aWNlcyB0aGF0IGhhdmUgYSBmbGFzaCB1bml0LgogICAgICAqLwogICAgIENhbWVyYVN0YXR1c1tdIGFkZExpc3RlbmVyKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgbGlzdGVuZXIpOwogCkBAIC0xNDksOCArMTQ5LDEwIEBACiAgICAgY29uc3QgaW50IEFQSV9WRVJTSU9OXzEgPSAxOwogICAgIGNvbnN0IGludCBBUElfVkVSU0lPTl8yID0gMjsKIAotICAgIC8vIERldGVybWluZXMgaWYgYSBwYXJ0aWN1bGFyIEFQSSB2ZXJzaW9uIGlzIHN1cHBvcnRlZCBkaXJlY3RseQorICAgIC8vIERldGVybWluZXMgaWYgYSBwYXJ0aWN1bGFyIEFQSSB2ZXJzaW9uIGlzIHN1cHBvcnRlZCBkaXJlY3RseSBmb3IgYSBjYW1lcmFJZC4KICAgICBib29sZWFuIHN1cHBvcnRzQ2FtZXJhQXBpKFN0cmluZyBjYW1lcmFJZCwgaW50IGFwaVZlcnNpb24pOworICAgIC8vIERldGVybWluZXMgaWYgYSBjYW1lcmFJZCBpcyBhIGhpZGRlbiBwaHlzaWNhbCBjYW1lcmEgb2YgYSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAgICBib29sZWFuIGlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoU3RyaW5nIGNhbWVyYUlkKTsKIAogICAgIHZvaWQgc2V0VG9yY2hNb2RlKFN0cmluZyBjYW1lcmFJZCwgYm9vbGVhbiBlbmFibGVkLCBJQmluZGVyIGNsaWVudEJpbmRlcik7CiAKQEAgLTE2MCw2ICsxNjIsMjggQEAKICAgICAgKiBDYWxsZXJzIHJlcXVpcmUgdGhlIGFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkFfU0VORF9TWVNURU1fRVZFTlRTIHBlcm1pc3Npb24uCiAgICAgICovCiAgICAgY29uc3QgaW50IEVWRU5UX05PTkUgPSAwOwotICAgIGNvbnN0IGludCBFVkVOVF9VU0VSX1NXSVRDSEVEID0gMTsKKyAgICBjb25zdCBpbnQgRVZFTlRfVVNFUl9TV0lUQ0hFRCA9IDE7IC8vIFRoZSBhcmd1bWVudCBpcyB0aGUgc2V0IG9mIG5ldyBmb3JlZ3JvdW5kIHVzZXIgSURzLgogICAgIG9uZXdheSB2b2lkIG5vdGlmeVN5c3RlbUV2ZW50KGludCBldmVudElkLCBpbiBpbnRbXSBhcmdzKTsKKworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgY2FtZXJhIHNlcnZpY2Ugb2YgYSBkZXZpY2UgcGh5c2ljYWwgc3RhdHVzIGNoYW5nZS4gTWF5IG9ubHkgYmUgY2FsbGVkIGZyb20KKyAgICAgKiBhIHByaXZpbGVnZWQgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIG5ld1N0YXRlIGlzIGEgYml0ZmllbGQgY29uc2lzdGluZyBvZiBERVZJQ0VfU1RBVEVfKiB2YWx1ZXMgY29tYmluZWQgdG9nZXRoZXIuIFZhbGlkIHN0YXRlCisgICAgICogY29tYmluYXRpb25zIGFyZSBkZXZpY2Utc3BlY2lmaWMuIEF0IGRldmljZSBzdGFydHVwLCB0aGUgY2FtZXJhIHNlcnZpY2Ugd2lsbCBhc3N1bWUgdGhlIGRldmljZQorICAgICAqIHN0YXRlIGlzIE5PUk1BTCB1bnRpbCBvdGhlcndpc2Ugbm90aWZpZWQuCisgICAgICoKKyAgICAgKiBDYWxsZXJzIHJlcXVpcmUgdGhlIGFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkFfU0VORF9TWVNURU1fRVZFTlRTIHBlcm1pc3Npb24uCisgICAgICovCisgICAgb25ld2F5IHZvaWQgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobG9uZyBuZXdTdGF0ZSk7CisKKyAgICAvLyBCaXRmaWVsZCBjb25zdGFudHMgZm9yIG5vdGlmeURldmljZVN0YXRlQ2hhbmdlCisgICAgLy8gQWxsIGJpdHMgPj0gMzIgYXJlIGZvciBjdXN0b20gdmVuZG9yIHN0YXRlcworICAgIC8vIFdyaXR0ZW4gYXMgaW50cyBzaW5jZSBBSURMIGRvZXMgbm90IHN1cHBvcnQgbG9uZyBjb25zdGFudHMuCisgICAgY29uc3QgaW50IERFVklDRV9TVEFURV9OT1JNQUwgPSAwOworICAgIGNvbnN0IGludCBERVZJQ0VfU1RBVEVfQkFDS19DT1ZFUkVEID0gMTsKKyAgICBjb25zdCBpbnQgREVWSUNFX1NUQVRFX0ZST05UX0NPVkVSRUQgPSAyOworICAgIGNvbnN0IGludCBERVZJQ0VfU1RBVEVfRk9MREVEID0gNDsKKyAgICBjb25zdCBpbnQgREVWSUNFX1NUQVRFX0xBU1RfRlJBTUVXT1JLX0JJVCA9IDB4ODAwMDAwMDA7IC8vIDEgPDwgMzE7CisKIH0KZGlmZiAtLWdpdCBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5haWRsIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmFpZGwKaW5kZXggZjg3MWNlNC4uZTlkY2JkYiAxMDA2NDQKLS0tIGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmFpZGwKKysrIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmFpZGwKQEAgLTc2LDQgKzc2LDExIEBACiAgICAgY29uc3QgaW50IFRPUkNIX1NUQVRVU19VTktOT1dOID0gLTE7CiAKICAgICBvbmV3YXkgdm9pZCBvblRvcmNoU3RhdHVzQ2hhbmdlZChpbnQgc3RhdHVzLCBTdHJpbmcgY2FtZXJhSWQpOworCisgICAgLyoqCisgICAgICogTm90aWZ5IHJlZ2lzdGVyZWQgY2xpZW50cyBhYm91dCBjYW1lcmEgYWNjZXNzIHByaW9yaXR5IGNoYW5nZXMuCisgICAgICogQ2xpZW50cyB3aGljaCB3ZXJlIHByZXZpb3VzbHkgdW5hYmxlIHRvIG9wZW4gYSBjZXJ0YWluIGNhbWVyYSBkZXZpY2UKKyAgICAgKiBjYW4gcmV0cnkgYWZ0ZXIgcmVjZWl2aW5nIHRoaXMgY2FsbGJhY2suCisgICAgICovCisgICAgb25ld2F5IHZvaWQgb25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCgpOwogfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbAppbmRleCA0Y2VkMDhjLi40OWRmZGU4IDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbApAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYXB0dXJlUmVxdWVzdDsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuaW1wbC5DYW1lcmFNZXRhZGF0YU5hdGl2ZTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLk91dHB1dENvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLnBhcmFtcy5TZXNzaW9uQ29uZmlndXJhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIudXRpbHMuU3VibWl0SW5mbzsKIGltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKIApAQCAtODMsNiArODQsMTYgQEAKICAgICAgKi8KICAgICB2b2lkIGVuZENvbmZpZ3VyZShpbnQgb3BlcmF0aW5nTW9kZSwgaW4gQ2FtZXJhTWV0YWRhdGFOYXRpdmUgc2Vzc2lvblBhcmFtcyk7CiAKKyAgICAvKioKKyAgICAgICogQ2hlY2sgd2hldGhlciBhIHBhcnRpY3VsYXIgc2Vzc2lvbiBjb25maWd1cmF0aW9uIGhhcyBjYW1lcmEgZGV2aWNlCisgICAgICAqIHN1cHBvcnQuCisgICAgICAqCisgICAgICAqIEBwYXJhbSBzZXNzaW9uQ29uZmlndXJhdGlvbiBTcGVjaWZpYyBzZXNzaW9uIGNvbmZpZ3VyYXRpb24gdG8gYmUgdmVyaWZpZWQuCisgICAgICAqIEByZXR1cm4gdHJ1ZSAgLSBpbiBjYXNlIHRoZSBzdHJlYW0gY29tYmluYXRpb24gaXMgc3VwcG9ydGVkLgorICAgICAgKiAgICAgICAgIGZhbHNlIC0gaW4gY2FzZSB0aGVyZSBpcyBubyBkZXZpY2Ugc3VwcG9ydC4KKyAgICAgICovCisgICAgYm9vbGVhbiBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKGluIFNlc3Npb25Db25maWd1cmF0aW9uIHNlc3Npb25Db25maWd1cmF0aW9uKTsKKwogICAgIHZvaWQgZGVsZXRlU3RyZWFtKGludCBzdHJlYW1JZCk7CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9wYXJhbXMvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9wYXJhbXMvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmYxNTU2Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL3BhcmFtcy9TZXNzaW9uQ29uZmlndXJhdGlvbi5haWRsCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5wYXJhbXM7CisKKy8qKiBAaGlkZSAqLworcGFyY2VsYWJsZSBTZXNzaW9uQ29uZmlndXJhdGlvbiBjcHBfaGVhZGVyICJjYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oIjsKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uY3BwIGIvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAKaW5kZXggZmViMDRjMi4uNGU5YjI3ZCAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAKQEAgLTE2NywxNCArMTY3LDI0IEBACiB9CiAKIE91dHB1dENvbmZpZ3VyYXRpb246Ok91dHB1dENvbmZpZ3VyYXRpb24oc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCwgaW50IHJvdGF0aW9uLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgcGh5c2ljYWxJZCwKICAgICAgICAgaW50IHN1cmZhY2VTZXRJRCwgYm9vbCBpc1NoYXJlZCkgewogICAgIG1HYnBzLnB1c2hfYmFjayhnYnApOwogICAgIG1Sb3RhdGlvbiA9IHJvdGF0aW9uOwogICAgIG1TdXJmYWNlU2V0SUQgPSBzdXJmYWNlU2V0SUQ7CiAgICAgbUlzRGVmZXJyZWQgPSBmYWxzZTsKICAgICBtSXNTaGFyZWQgPSBpc1NoYXJlZDsKKyAgICBtUGh5c2ljYWxDYW1lcmFJZCA9IHBoeXNpY2FsSWQ7CiB9CiAKK091dHB1dENvbmZpZ3VyYXRpb246Ok91dHB1dENvbmZpZ3VyYXRpb24oCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+PiYgZ2JwcywKKyAgICBpbnQgcm90YXRpb24sIGNvbnN0IFN0cmluZzE2JiBwaHlzaWNhbENhbWVyYUlkLCBpbnQgc3VyZmFjZVNldElELCAgaW50IHN1cmZhY2VUeXBlLAorICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCBpc1NoYXJlZCkKKyAgOiBtR2JwcyhnYnBzKSwgbVJvdGF0aW9uKHJvdGF0aW9uKSwgbVN1cmZhY2VTZXRJRChzdXJmYWNlU2V0SUQpLCBtU3VyZmFjZVR5cGUoc3VyZmFjZVR5cGUpLAorICAgIG1XaWR0aCh3aWR0aCksIG1IZWlnaHQoaGVpZ2h0KSwgbUlzRGVmZXJyZWQoZmFsc2UpLCBtSXNTaGFyZWQoaXNTaGFyZWQpLAorICAgIG1QaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpIHsgfQorCiBzdGF0dXNfdCBPdXRwdXRDb25maWd1cmF0aW9uOjp3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdCB7CiAKICAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5jcHAgYi9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzMWEzMwotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmNwcApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2RlZmluZSBMT0dfVEFHICJTZXNzaW9uQ29uZmlndXJhdGlvbiIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXR1c190IFNlc3Npb25Db25maWd1cmF0aW9uOjpyZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgeworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIGludCBvcGVyYXRpbmdNb2RlID0gMDsKKworICAgIGlmIChwYXJjZWwgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJm9wZXJhdGluZ01vZGUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG9wZXJhdGluZyBtb2RlIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQgaW5wdXRXaWR0aCA9IDA7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmaW5wdXRXaWR0aCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgaW5wdXQgd2lkdGggZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludCBpbnB1dEhlaWdodCA9IDA7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmaW5wdXRIZWlnaHQpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGlucHV0IGhlaWdodCBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50IGlucHV0Rm9ybWF0ID0gLTE7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmaW5wdXRGb3JtYXQpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGlucHV0IGZvcm1hdCBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8T3V0cHV0Q29uZmlndXJhdGlvbj4gb3V0cHV0U3RyZWFtczsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZFBhcmNlbGFibGVWZWN0b3IoJm91dHB1dFN0cmVhbXMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG91dHB1dCBjb25maWd1cmF0aW9ucyBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgbU9wZXJhdGluZ01vZGUgPSBvcGVyYXRpbmdNb2RlOworICAgIG1JbnB1dFdpZHRoID0gaW5wdXRXaWR0aDsKKyAgICBtSW5wdXRIZWlnaHQgPSBpbnB1dEhlaWdodDsKKyAgICBtSW5wdXRGb3JtYXQgPSBpbnB1dEZvcm1hdDsKKyAgICBmb3IgKGF1dG8mIHN0cmVhbSA6IG91dHB1dFN0cmVhbXMpIHsKKyAgICAgICAgbU91dHB1dFN0cmVhbXMucHVzaF9iYWNrKHN0cmVhbSk7CisgICAgfQorCisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBTZXNzaW9uQ29uZmlndXJhdGlvbjo6d3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgY29uc3QgeworCisgICAgaWYgKHBhcmNlbCA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1PcGVyYXRpbmdNb2RlKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1JbnB1dFdpZHRoKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1JbnB1dEhlaWdodCk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtSW5wdXRGb3JtYXQpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBwYXJjZWwtPndyaXRlUGFyY2VsYWJsZVZlY3RvcihtT3V0cHV0U3RyZWFtcyk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBTZXNzaW9uQ29uZmlndXJhdGlvbjo6b3V0cHV0c0VxdWFsKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dENvbmZpZ3VyYXRpb24+JiBvdGhlck91dHB1dFN0cmVhbXMgPQorICAgICAgICAgICAgb3RoZXIuZ2V0T3V0cHV0Q29uZmlndXJhdGlvbnMoKTsKKworICAgIGlmIChtT3V0cHV0U3RyZWFtcy5zaXplKCkgIT0gIG90aGVyT3V0cHV0U3RyZWFtcy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1PdXRwdXRTdHJlYW1zW2ldICE9IG90aGVyT3V0cHV0U3RyZWFtc1tpXSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU2Vzc2lvbkNvbmZpZ3VyYXRpb246Om91dHB1dHNMZXNzVGhhbihjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxPdXRwdXRDb25maWd1cmF0aW9uPiYgb3RoZXJPdXRwdXRTdHJlYW1zID0KKyAgICAgICAgICAgIG90aGVyLmdldE91dHB1dENvbmZpZ3VyYXRpb25zKCk7CisKKyAgICBpZiAobU91dHB1dFN0cmVhbXMuc2l6ZSgpICE9ICBvdGhlck91dHB1dFN0cmVhbXMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBtT3V0cHV0U3RyZWFtcy5zaXplKCkgPCBvdGhlck91dHB1dFN0cmVhbXMuc2l6ZSgpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1PdXRwdXRTdHJlYW1zW2ldICE9IG90aGVyT3V0cHV0U3RyZWFtc1tpXSkgeworICAgICAgICAgICAgcmV0dXJuIG1PdXRwdXRTdHJlYW1zW2ldIDwgb3RoZXJPdXRwdXRTdHJlYW1zW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYjA2YzIKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiY2FtZXJhc2VydmVyIiwKKworICAgIHNyY3M6IFsibWFpbl9jYW1lcmFzZXJ2ZXIuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY2FtZXJhc2VydmljZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNCIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCisgICAgXSwKKworICAgIGluaXRfcmM6IFsiY2FtZXJhc2VydmVyLnJjIl0sCisKKyAgICB2aW50Zl9mcmFnbWVudHM6IFsKKyAgICAgICAgIm1hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wLnhtbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5tayBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhjOTRlNi4uMDAwMDAwMAotLS0gYS9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCW1haW5fY2FtZXJhc2VydmVyLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjYW1lcmFzZXJ2aWNlIFwKLQlsaWJsb2cgXAotCWxpYnV0aWxzIFwKLQlsaWJ1aSBcCi0JbGliZ3VpIFwKLQlsaWJiaW5kZXIgXAotCWxpYmhpZGx0cmFuc3BvcnQgXAotCWFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAgXAotCWFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNCBcCi0JYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDEuMCBcCi0JYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMgotCi1MT0NBTF9NT0RVTEU6PSBjYW1lcmFzZXJ2ZXIKLUxPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKLQotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvciAtV25vLXVudXNlZC1wYXJhbWV0ZXIKLQotTE9DQUxfSU5JVF9SQyA6PSBjYW1lcmFzZXJ2ZXIucmMKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhc2VydmVyL21haW5fY2FtZXJhc2VydmVyLmNwcCBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCmluZGV4IDM5NzI0MzYuLjUzYjNkODQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCisrKyBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCkBAIC0yNiw4ICsyNiw5IEBACiB7CiAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwogCi0gICAgLy8gU2V0IDMgdGhyZWFkcyBmb3IgSElETCBjYWxscwotICAgIGhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sKDMsIC8qd2lsbGpvaW4qLyBmYWxzZSk7CisgICAgLy8gU2V0IDUgdGhyZWFkcyBmb3IgSElETCBjYWxscy4gTm93IGNhbWVyYXNlcnZlciB3aWxsIHNlcnZlIEhJREwgY2FsbHMgaW4KKyAgICAvLyBhZGRpdGlvbiB0byBjb25zdW1pbmcgdGhlbSBmcm9tIHRoZSBDYW1lcmEgSEFMIGFzIHdlbGwuCisgICAgaGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2woNSwgLyp3aWxsam9pbiovIGZhbHNlKTsKIAogICAgIHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7CiAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYXNlcnZlci9tYW5pZmVzdF9hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMC54bWwgYi9jYW1lcmEvY2FtZXJhc2VydmVyL21hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDFjNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9tYW5pZmVzdF9hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMC54bWwKQEAgLTAsMCArMSwxMSBAQAorPG1hbmlmZXN0IHZlcnNpb249IjEuMCIgdHlwZT0iZnJhbWV3b3JrIj4KKyAgICA8aGFsPgorICAgICAgICA8bmFtZT5hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlPC9uYW1lPgorICAgICAgICA8dHJhbnNwb3J0Pmh3YmluZGVyPC90cmFuc3BvcnQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KKyAgICAgICAgPGludGVyZmFjZT4KKyAgICAgICAgICAgIDxuYW1lPklDYW1lcmFTZXJ2aWNlPC9uYW1lPgorICAgICAgICAgICAgPGluc3RhbmNlPmRlZmF1bHQ8L2luc3RhbmNlPgorICAgICAgICA8L2ludGVyZmFjZT4KKyAgICA8L2hhbD4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCmluZGV4IGQyODQ0NzcuLjg0NGJiODAgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xNzAsNiArMTcxLDEyIEBACiAgICAgc3RhdHVzX3QgZXJhc2UodWludDMyX3QgdGFnKTsKIAogICAgIC8qKgorICAgICAqIFJlbW92ZSBtZXRhZGF0YSBlbnRyaWVzIHRoYXQgbmVlZCBhZGRpdGlvbmFsIHBlcm1pc3Npb25zLgorICAgICAqLworICAgIHN0YXR1c190IHJlbW92ZVBlcm1pc3Npb25FbnRyaWVzKG1ldGFkYXRhX3ZlbmRvcl9pZF90IHZlbmRvcklkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gKnRhZ3NSZW1vdmVkIC8qb3V0Ki8pOworCisgICAgLyoqCiAgICAgICogU3dhcCB0aGUgdW5kZXJseWluZyBjYW1lcmEgbWV0YWRhdGEgYmV0d2VlbiB0aGlzIGFuZCB0aGUgb3RoZXIKICAgICAgKiBtZXRhZGF0YSBvYmplY3QuCiAgICAgICovCmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaAppbmRleCA5MDRmYmEyLi42ZjU1ODkwIDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmgKQEAgLTk5LDYgKzk5LDExIEBACiAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCB2ZXJib3NpdHksIGludCBpbmRlbnRhdGlvbikgY29uc3Q7CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBTZWN0aW9uIGZvciBjb3JyZXNwb25kaW5nIHRhZy4KKyAgICAgICAgICovCisgICAgICAgIHNzaXplX3QgZ2V0U2VjdGlvbkluZGV4KHVpbnQzMl90IHRhZykgY29uc3Q7CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFJlYWQgdmFsdWVzIFZlbmRvclRhZ0Rlc2NyaXB0b3Igb2JqZWN0IGZyb20gdGhlIGdpdmVuIHBhcmNlbC4KICAgICAgICAgICoKICAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCkBAIC0yMDYsNiArMjExLDkgQEAKICAgICAgKi8KICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0OwogCisgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPG1ldGFkYXRhX3ZlbmRvcl9pZF90LCBzcDxhbmRyb2lkOjpWZW5kb3JUYWdEZXNjcmlwdG9yPj4gJgorICAgICAgICAgICAgZ2V0VmVuZG9ySWRzQW5kVGFnRGVzY3JpcHRvcnMoKTsKKwogICBwcm90ZWN0ZWQ6CiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPG1ldGFkYXRhX3ZlbmRvcl9pZF90LCBzcDxhbmRyb2lkOjpWZW5kb3JUYWdEZXNjcmlwdG9yPj4gbVZlbmRvck1hcDsKICAgICBzdHJ1Y3QgdmVuZG9yX3RhZ19jYWNoZV9vcHMgbVZlbmRvckNhY2hlT3BzOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oCmluZGV4IGE4MGY0NGIuLjk1YzRmMzkgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmgKQEAgLTY1LDggKzY1LDE1IEBACiAgICAgT3V0cHV0Q29uZmlndXJhdGlvbihjb25zdCBhbmRyb2lkOjpQYXJjZWwmIHBhcmNlbCk7CiAKICAgICBPdXRwdXRDb25maWd1cmF0aW9uKHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsIGludCByb3RhdGlvbiwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBwaHlzaWNhbENhbWVyYUlkLAogICAgICAgICAgICAgaW50IHN1cmZhY2VTZXRJRCA9IElOVkFMSURfU0VUX0lELCBib29sIGlzU2hhcmVkID0gZmFsc2UpOwogCisgICAgT3V0cHV0Q29uZmlndXJhdGlvbihjb25zdCBzdGQ6OnZlY3RvcjxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4mIGdicHMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRpb24sIGNvbnN0IFN0cmluZzE2JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1cmZhY2VTZXRJRCA9IElOVkFMSURfU0VUX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1cmZhY2VUeXBlID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1VOS05PV04sIGludCB3aWR0aCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gMCwgYm9vbCBpc1NoYXJlZCA9IGZhbHNlKTsKKwogICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdCB7CiAgICAgICAgIHJldHVybiAoIG1Sb3RhdGlvbiA9PSBvdGhlci5tUm90YXRpb24gJiYKICAgICAgICAgICAgICAgICBtU3VyZmFjZVNldElEID09IG90aGVyLm1TdXJmYWNlU2V0SUQgJiYKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmggYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Mjg4ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NBTUVSQTJfU0VTU0lPTkNPTkZJR1VSQVRJT05fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NBTUVSQTJfU0VTU0lPTkNPTkZJR1VSQVRJT05fSAorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGNhbWVyYTIgeworbmFtZXNwYWNlIHBhcmFtcyB7CisKK2NsYXNzIE91dHB1dENvbmZpZ3VyYXRpb247CisKK2NsYXNzIFNlc3Npb25Db25maWd1cmF0aW9uIDogcHVibGljIGFuZHJvaWQ6OlBhcmNlbGFibGUgeworcHVibGljOgorCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0Q29uZmlndXJhdGlvbj4mIGdldE91dHB1dENvbmZpZ3VyYXRpb25zKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU91dHB1dFN0cmVhbXM7CisgICAgfQorCisgICAgaW50IGdldElucHV0V2lkdGgoKSBjb25zdCB7IHJldHVybiBtSW5wdXRXaWR0aDsgfQorICAgIGludCBnZXRJbnB1dEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1JbnB1dEhlaWdodDsgfQorICAgIGludCBnZXRJbnB1dEZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1JbnB1dEZvcm1hdDsgfQorICAgIGludCBnZXRPcGVyYXRpbmdNb2RlKCkgY29uc3QgeyByZXR1cm4gbU9wZXJhdGluZ01vZGU7IH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CisKKyAgICBTZXNzaW9uQ29uZmlndXJhdGlvbigpIDoKKyAgICAgICAgICAgIG1JbnB1dFdpZHRoKDApLAorICAgICAgICAgICAgbUlucHV0SGVpZ2h0KDApLAorICAgICAgICAgICAgbUlucHV0Rm9ybWF0KC0xKSwKKyAgICAgICAgICAgIG1PcGVyYXRpbmdNb2RlKC0xKSB7fQorCisgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24oY29uc3QgYW5kcm9pZDo6UGFyY2VsJiBwYXJjZWwpIHsKKyAgICAgICAgcmVhZEZyb21QYXJjZWwoJnBhcmNlbCk7CisgICAgfQorCisgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24oaW50IGlucHV0V2lkdGgsIGludCBpbnB1dEhlaWdodCwgaW50IGlucHV0Rm9ybWF0LCBpbnQgb3BlcmF0aW5nTW9kZSkgOgorICAgICAgICBtSW5wdXRXaWR0aChpbnB1dFdpZHRoKSwgbUlucHV0SGVpZ2h0KGlucHV0SGVpZ2h0KSwgbUlucHV0Rm9ybWF0KGlucHV0Rm9ybWF0KSwKKyAgICAgICAgbU9wZXJhdGluZ01vZGUob3BlcmF0aW5nTW9kZSkge30KKworICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gKG91dHB1dHNFcXVhbChvdGhlcikgJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRXaWR0aCA9PSBvdGhlci5tSW5wdXRXaWR0aCAmJgorICAgICAgICAgICAgICAgIG1JbnB1dEhlaWdodCA9PSBvdGhlci5tSW5wdXRIZWlnaHQgJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRGb3JtYXQgPT0gb3RoZXIubUlucHV0Rm9ybWF0ICYmCisgICAgICAgICAgICAgICAgbU9wZXJhdGluZ01vZGUgPT0gb3RoZXIubU9wZXJhdGluZ01vZGUpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKG1JbnB1dFdpZHRoICE9IG90aGVyLm1JbnB1dFdpZHRoKSB7CisgICAgICAgICAgICByZXR1cm4gbUlucHV0V2lkdGggPCBvdGhlci5tSW5wdXRXaWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSW5wdXRIZWlnaHQgIT0gb3RoZXIubUlucHV0SGVpZ2h0KSB7CisgICAgICAgICAgICByZXR1cm4gbUlucHV0SGVpZ2h0IDwgb3RoZXIubUlucHV0SGVpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1JbnB1dEZvcm1hdCAhPSBvdGhlci5tSW5wdXRGb3JtYXQpIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5wdXRGb3JtYXQgPCBvdGhlci5tSW5wdXRGb3JtYXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAobU9wZXJhdGluZ01vZGUgIT0gb3RoZXIubU9wZXJhdGluZ01vZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBtT3BlcmF0aW5nTW9kZSA8IG90aGVyLm1PcGVyYXRpbmdNb2RlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG91dHB1dHNMZXNzVGhhbihvdGhlcik7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICgqdGhpcyAhPSBvdGhlciAmJiAhKCp0aGlzIDwgb3RoZXIpKTsKKyAgICB9CisKKyAgICBib29sIG91dHB1dHNFcXVhbChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0OworICAgIGJvb2wgb3V0cHV0c0xlc3NUaGFuKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3Q7CisgICAgdm9pZCBhZGRPdXRwdXRDb25maWd1cmF0aW9uKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJmNvbmZpZykgeworICAgICAgICBtT3V0cHV0U3RyZWFtcy5wdXNoX2JhY2soY29uZmlnKTsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICBzdGQ6OnZlY3RvcjxPdXRwdXRDb25maWd1cmF0aW9uPiBtT3V0cHV0U3RyZWFtczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRXaWR0aCwgbUlucHV0SGVpZ2h0LCBtSW5wdXRGb3JtYXQsIG1PcGVyYXRpbmdNb2RlOworfTsKK30gLy8gbmFtZXNwYWNlIHBhcmFtcworfSAvLyBuYW1lc3BhY2UgY2FtZXJhMgorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKKwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6U2Vzc2lvbkNvbmZpZ3VyYXRpb247CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9BbmRyb2lkLmJwIGIvY2FtZXJhL25kay9BbmRyb2lkLmJwCmluZGV4IDk3Y2Y2YmYuLmQ5NmY0MDMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvQW5kcm9pZC5icAorKysgYi9jYW1lcmEvbmRrL0FuZHJvaWQuYnAKQEAgLTMwLDMgKzMwLDEyNSBAQAogICAgIHNyY3M6IFsiaW5jbHVkZS9jYW1lcmEvKiovKi5oIl0sCiAgICAgbGljZW5zZTogIk5PVElDRSIsCiB9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY2FtZXJhMm5kayIsCisgICAgc3JjczogWworICAgICAgICAiTmRrQ2FtZXJhTWFuYWdlci5jcHAiLAorICAgICAgICAiTmRrQ2FtZXJhTWV0YWRhdGEuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYURldmljZS5jcHAiLAorICAgICAgICAiTmRrQ2FwdHVyZVJlcXVlc3QuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAiLAorICAgICAgICAiaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmFuZHJvaWRfcnVudGltZSIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmNhbWVyYV9tZXRhZGF0YSIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICAgICAgIi1ERVhQT1JUPV9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5IChcImRlZmF1bHRcIikpKSIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICBdLAorICAgIHZlcnNpb25fc2NyaXB0OiAibGliY2FtZXJhMm5kay5tYXAudHh0IiwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjYW1lcmEybmRrX3ZlbmRvciIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5jcHAiLAorICAgICAgICAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCIsCisgICAgICAgICJuZGtfdmVuZG9yL2ltcGwvdXRpbHMuY3BwIiwKKyAgICAgICAgImltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAiLAorICAgICAgICAiTmRrQ2FtZXJhTWV0YWRhdGEuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCIsCisgICAgICAgICJOZGtDYW1lcmFNYW5hZ2VyLmNwcCIsCisgICAgICAgICJOZGtDYW1lcmFEZXZpY2UuY3BwIiwKKyAgICAgICAgIk5ka0NhcHR1cmVSZXF1ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgXSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgIi4iLAorICAgICAgICAiaW5jbHVkZSIsCisgICAgICAgICJpbXBsIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItREVYUE9SVD1fX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KFwiZGVmYXVsdFwiKSkpIiwKKyAgICAgICAgIi1EX19BTkRST0lEX1ZOREtfXyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjYW1lcmFfbWV0YWRhdGEiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2UuZGV2aWNlQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5jb21tb25AMi4wIiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAtaGVscGVyIiwKKyAgICAgICAgImxpYmFyZWN0IiwKKyAgICBdLAorICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7CisgICAgICAgIHBkazogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkFJbWFnZVJlYWRlclZlbmRvclRlc3QiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmNzOiBbIm5ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGliY2FtZXJhMm5ka192ZW5kb3IiLAorICAgICAgICAibGliY2FtZXJhX21ldGFkYXRhIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wLWhlbHBlciIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EX19BTkRST0lEX1ZOREtfXyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvQW5kcm9pZC5tayBiL2NhbWVyYS9uZGsvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNhZGRmMS4uMDAwMDAwMAotLS0gYS9jYW1lcmEvbmRrL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1BESyksIHRydWUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgICAgIFwKLSAgICBOZGtDYW1lcmFNYW5hZ2VyLmNwcCAgICAgICAgICAgXAotICAgIE5ka0NhbWVyYU1ldGFkYXRhLmNwcCAgICAgICAgICBcCi0gICAgTmRrQ2FtZXJhRGV2aWNlLmNwcCAgICAgICAgICAgIFwKLSAgICBOZGtDYXB0dXJlUmVxdWVzdC5jcHAgICAgICAgICAgXAotICAgIE5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCAgICBcCi0gICAgaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAgICAgICAgIFwKLSAgICBpbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAgICAgICAgXAotICAgIGltcGwvQUNhbWVyYURldmljZS5jcHAgICAgICAgICBcCi0gICAgaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCi0KLUxPQ0FMX01PRFVMRTo9IGxpYmNhbWVyYTJuZGsKLQotTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKLQotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4gLUQgRVhQT1JUPSdfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpJwotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvcgotCi1MT0NBTF9MREZMQUdTICs9IC1XbCwtLXZlcnNpb24tc2NyaXB0PSQoTE9DQUxfUEFUSCkvbGliY2FtZXJhMm5kay5tYXAudHh0Ci0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmJpbmRlciBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJndWkgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJhbmRyb2lkX3J1bnRpbWUgXAotICAgIGxpYmNhbWVyYV9jbGllbnQgXAotICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGliY2FtZXJhX21ldGFkYXRhIFwKLSAgICBsaWJtZWRpYW5kawotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLWVuZGlmCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCmluZGV4IGZkOTUyOTYuLjFhYzg0ODIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCisrKyBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmg+CiAjaW5jbHVkZSAiaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKIAorI2luY2x1ZGUgImltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyIKKwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIEVYUE9SVApAQCAtNzgsMTEgKzgwLDM5IEBACiAKICAgICBpZiAoc2Vzc2lvbi0+aXNDbG9zZWQoKSkgewogICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gJXAgaXMgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb24pOwotICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBDQVBUVVJFX1NFUVVFTkNFX0lEX05PTkU7CisgICAgICAgIGlmIChjYXB0dXJlU2VxdWVuY2VJZCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBDQVBUVVJFX1NFUVVFTkNFX0lEX05PTkU7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CiAgICAgfQogCi0gICAgcmV0dXJuIHNlc3Npb24tPmNhcHR1cmUoY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKKyAgICByZXR1cm4gc2Vzc2lvbi0+Y2FwdHVyZSgKKyAgICAgICAgICAgIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7Cit9CisKK0VYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmUoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyogbGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0ciB8fCByZXF1ZXN0cyA9PSBudWxscHRyIHx8IG51bVJlcXVlc3RzIDwgMSkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBpbnZhbGlkIGlucHV0OiBzZXNzaW9uICVwLCBudW1SZXF1ZXN0ICVkLCByZXF1ZXN0cyAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzZXNzaW9uLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBpZiAoc2Vzc2lvbi0+aXNDbG9zZWQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gJXAgaXMgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb24pOworICAgICAgICBpZiAoY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICAgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IENBUFRVUkVfU0VRVUVOQ0VfSURfTk9ORTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKKyAgICB9CisKKyAgICByZXR1cm4gc2Vzc2lvbi0+Y2FwdHVyZSgKKyAgICAgICAgICAgIGxjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOwogfQogCiBFWFBPUlQKQEAgLTk5LDcgKzEyOSw5IEBACiAKICAgICBpZiAoc2Vzc2lvbi0+aXNDbG9zZWQoKSkgewogICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gJXAgaXMgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb24pOwotICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBDQVBUVVJFX1NFUVVFTkNFX0lEX05PTkU7CisgICAgICAgIGlmIChjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgICAgICAgICAgKmNhcHR1cmVTZXF1ZW5jZUlkID0gQ0FQVFVSRV9TRVFVRU5DRV9JRF9OT05FOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwogICAgIH0KIApAQCAtMTA3LDYgKzEzOSwzMCBAQAogfQogCiBFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9zZXRSZXBlYXRpbmdSZXF1ZXN0KAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChzZXNzaW9uID09IG51bGxwdHIgfHwgcmVxdWVzdHMgPT0gbnVsbHB0ciB8fCBudW1SZXF1ZXN0cyA8IDEpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogaW52YWxpZCBpbnB1dDogc2Vzc2lvbiAlcCwgbnVtUmVxdWVzdCAlZCwgcmVxdWVzdHMgJXAiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2Vzc2lvbiwgbnVtUmVxdWVzdHMsIHJlcXVlc3RzKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgaWYgKHNlc3Npb24tPmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzZXNzaW9uICVwIGlzIGFscmVhZHkgY2xvc2VkIiwgX19GVU5DVElPTl9fLCBzZXNzaW9uKTsKKyAgICAgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBDQVBUVVJFX1NFUVVFTkNFX0lEX05PTkU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CisgICAgfQorCisgICAgcmV0dXJuIHNlc3Npb24tPnNldFJlcGVhdGluZ1JlcXVlc3QobGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7Cit9CisKK0VYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdG9wUmVwZWF0aW5nKEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0cikgewpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9OZGtDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9OZGtDYW1lcmFEZXZpY2UuY3BwCmluZGV4IDgxMmEzMTIuLjA5Yjg1ZDUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL05ka0NhbWVyYURldmljZS5jcHAKQEAgLTI0LDcgKzI0LDE1IEBACiAjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYURldmljZS5oPgogI2luY2x1ZGUgImltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmFjYW07CisKK2Jvb2wgYXJlV2luZG93VHlwZXNFcXVhbChBQ2FtZXJhV2luZG93VHlwZSAqYSwgQUNhbWVyYVdpbmRvd1R5cGUgKmIpIHsKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisgICAgcmV0dXJuIHV0aWxzOjppc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGEsIGIpOworI2Vsc2UKKyAgICByZXR1cm4gYSA9PSBiOworI2VuZGlmCit9CiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFEZXZpY2VfY2xvc2UoQUNhbWVyYURldmljZSogZGV2aWNlKSB7CkBAIC03MCw3ICs3OCwzNCBAQAogICAgICAgICAgICAgQUxPR0UoIiVzOiB1bmtub3duIHRlbXBsYXRlIElEICVkIiwgX19GVU5DVElPTl9fLCB0ZW1wbGF0ZUlkKTsKICAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwogICAgIH0KLSAgICByZXR1cm4gZGV2aWNlLT5jcmVhdGVDYXB0dXJlUmVxdWVzdCh0ZW1wbGF0ZUlkLCByZXF1ZXN0KTsKKyAgICByZXR1cm4gZGV2aWNlLT5jcmVhdGVDYXB0dXJlUmVxdWVzdCh0ZW1wbGF0ZUlkLCBudWxscHRyIC8qcGh5c2ljYWxJZExpc3QqLywgcmVxdWVzdCk7Cit9CisKK0VYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzKAorICAgICAgICBjb25zdCBBQ2FtZXJhRGV2aWNlKiBkZXZpY2UsCisgICAgICAgIEFDYW1lcmFEZXZpY2VfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkLAorICAgICAgICBjb25zdCBBQ2FtZXJhSWRMaXN0KiBwaHlzaWNhbENhbWVyYUlkTGlzdCwKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKGRldmljZSA9PSBudWxscHRyIHx8IHJlcXVlc3QgPT0gbnVsbHB0ciB8fCBwaHlzaWNhbENhbWVyYUlkTGlzdCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBhcmd1bWVudCEgZGV2aWNlICVwIHJlcXVlc3QgJXAsIHBoeXNpY2FsQ2FtZXJhSWRMaXN0ICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZSwgcmVxdWVzdCwgcGh5c2ljYWxDYW1lcmFJZExpc3QpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgc3dpdGNoICh0ZW1wbGF0ZUlkKSB7CisgICAgICAgIGNhc2UgVEVNUExBVEVfUFJFVklFVzoKKyAgICAgICAgY2FzZSBURU1QTEFURV9TVElMTF9DQVBUVVJFOgorICAgICAgICBjYXNlIFRFTVBMQVRFX1JFQ09SRDoKKyAgICAgICAgY2FzZSBURU1QTEFURV9WSURFT19TTkFQU0hPVDoKKyAgICAgICAgY2FzZSBURU1QTEFURV9aRVJPX1NIVVRURVJfTEFHOgorICAgICAgICBjYXNlIFRFTVBMQVRFX01BTlVBTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiB1bmtub3duIHRlbXBsYXRlIElEICVkIiwgX19GVU5DVElPTl9fLCB0ZW1wbGF0ZUlkKTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlLT5jcmVhdGVDYXB0dXJlUmVxdWVzdCh0ZW1wbGF0ZUlkLCBwaHlzaWNhbENhbWVyYUlkTGlzdCwgcmVxdWVzdCk7CiB9CiAKIEVYUE9SVApAQCAtOTYsNyArMTMxLDcgQEAKIAogRVhQT1JUCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2NyZWF0ZSgKLSAgICAgICAgQU5hdGl2ZVdpbmRvdyogd2luZG93LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0KSB7CisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3csIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmICh3aW5kb3cgPT0gbnVsbHB0ciB8fCBvdXQgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgb3V0ICVwIiwKQEAgLTEwOSw3ICsxNDQsNyBAQAogCiBFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfY3JlYXRlKAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3csIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXQpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKHdpbmRvdyA9PSBudWxscHRyIHx8IG91dCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGJhZCBhcmd1bWVudC4gd2luZG93ICVwLCBvdXQgJXAiLApAQCAtMTIxLDggKzE1NiwyMiBAQAogfQogCiBFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25QaHlzaWNhbE91dHB1dF9jcmVhdGUoCisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3csIGNvbnN0IGNoYXIqIHBoeXNpY2FsSWQsCisgICAgICAgIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmICh3aW5kb3cgPT0gbnVsbHB0ciB8fCBwaHlzaWNhbElkID09IG51bGxwdHIgfHwgb3V0ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogYmFkIGFyZ3VtZW50LiB3aW5kb3cgJXAsIHBoeXNpY2FsSWQgJXAsIG91dCAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB3aW5kb3csIHBoeXNpY2FsSWQsIG91dCk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICAqb3V0ID0gbmV3IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCh3aW5kb3csIGZhbHNlLCBwaHlzaWNhbElkKTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworRVhQT1JUCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2FkZChBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dCwKLSAgICAgICAgQU5hdGl2ZVdpbmRvdyogd2luZG93KSB7CisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3cpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmICgod2luZG93ID09IG51bGxwdHIpIHx8IChvdXQgPT0gbnVsbHB0cikpIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogYmFkIGFyZ3VtZW50LiB3aW5kb3cgJXAsIG91dCAlcCIsCkBAIC0xMzQsNyArMTgzLDcgQEAKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgaWYgKG91dC0+bVdpbmRvdyA9PSB3aW5kb3cpIHsKKyAgICBpZiAoYXJlV2luZG93VHlwZXNFcXVhbChvdXQtPm1XaW5kb3csIHdpbmRvdykpIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB0cnlpbmcgdG8gYWRkIHRoZSBzYW1lIHdpbmRvdyBhc3NvY2lhdGVkIHdpdGggdGhlIG91dHB1dCBjb25maWd1cmF0aW9uIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKQEAgLTE0Nyw3ICsxOTYsNyBAQAogCiBFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfcmVtb3ZlKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0LAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3cpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKCh3aW5kb3cgPT0gbnVsbHB0cikgfHwgKG91dCA9PSBudWxscHRyKSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgb3V0ICVwIiwKQEAgLTE1OSw3ICsyMDgsNyBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBpZiAob3V0LT5tV2luZG93ID09IHdpbmRvdykgeworICAgIGlmIChhcmVXaW5kb3dUeXBlc0VxdWFsKG91dC0+bVdpbmRvdywgd2luZG93KSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHRyeWluZyB0byByZW1vdmUgdGhlIHNhbWUgd2luZG93IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3V0cHV0IGNvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9OZGtDYW1lcmFNYW5hZ2VyLmNwcCBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWFuYWdlci5jcHAKaW5kZXggNjBiNDc2My4uMjNkMDFlZiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9OZGtDYW1lcmFNYW5hZ2VyLmNwcAorKysgYi9jYW1lcmEvbmRrL05ka0NhbWVyYU1hbmFnZXIuY3BwCkBAIC0yMiw5ICsyMiwxNSBAQAogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKICNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oPgotI2luY2x1ZGUgImltcGwvQUNhbWVyYU1hbmFnZXIuaCIKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworI2luY2x1ZGUgIm5ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5oIgorI2Vsc2UKKyNpbmNsdWRlICJpbXBsL0FDYW1lcmFNYW5hZ2VyLmgiCisjZW5kaWYKKyNpbmNsdWRlICJpbXBsL0FDYW1lcmFNZXRhZGF0YS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YWNhbTsKIAogRVhQT1JUCiBBQ2FtZXJhTWFuYWdlciogQUNhbWVyYU1hbmFnZXJfY3JlYXRlKCkgewpAQCAtOTksNiArMTA1LDYwIEBACiB9CiAKIEVYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYW1lcmFNYW5hZ2VyX3JlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgQUNhbWVyYU1hbmFnZXIqIC8qbWFuYWdlciovLCBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBhcmd1bWVudCEgY2FsbGJhY2sgaXMgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgaWYgKChjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLm9uQ2FtZXJhQXZhaWxhYmxlID09IG51bGxwdHIpIHx8CisgICAgICAgICAgICAoY2FsbGJhY2stPmF2YWlsYWJpbGl0eUNhbGxiYWNrcy5vbkNhbWVyYVVuYXZhaWxhYmxlID09IG51bGxwdHIpIHx8CisgICAgICAgICAgICAoY2FsbGJhY2stPm9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQgPT0gbnVsbHB0cikpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGFyZ3VtZW50ISBjYWxsYmFjayAlcCwgIgorICAgICAgICAgICAgICAgICJvbkNhbWVyYUF2YWlsYWJsZSAlcCwgb25DYW1lcmFVbmF2YWlsYWJsZSAlcCBvbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkICVwIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FsbGJhY2ssCisgICAgICAgICAgICAgICBjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLm9uQ2FtZXJhQXZhaWxhYmxlLAorICAgICAgICAgICAgICAgY2FsbGJhY2stPmF2YWlsYWJpbGl0eUNhbGxiYWNrcy5vbkNhbWVyYVVuYXZhaWxhYmxlLAorICAgICAgICAgICAgICAgY2FsbGJhY2stPm9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgYXV0byByZXNlcnZlZEVudHJpZXNDb3VudCA9IHNpemVvZihjYWxsYmFjay0+cmVzZXJ2ZWQpIC8gc2l6ZW9mKGNhbGxiYWNrLT5yZXNlcnZlZFswXSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNlcnZlZEVudHJpZXNDb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChjYWxsYmFjay0+cmVzZXJ2ZWRbaV0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGFyZ3VtZW50ISBjYWxsYmFjayByZXNlcnZlZCBlbnRyaWVzIG11c3QgYmUgc2V0IHRvIE5VTEwiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgIH0KKyAgICB9CisgICAgQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKS5yZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2soY2FsbGJhY2spOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhTWFuYWdlcl91bnJlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgQUNhbWVyYU1hbmFnZXIqIC8qbWFuYWdlciovLCBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChjYWxsYmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBhcmd1bWVudCEgY2FsbGJhY2sgaXMgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgaWYgKChjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLm9uQ2FtZXJhQXZhaWxhYmxlID09IG51bGxwdHIpIHx8CisgICAgICAgICAgICAoY2FsbGJhY2stPmF2YWlsYWJpbGl0eUNhbGxiYWNrcy5vbkNhbWVyYVVuYXZhaWxhYmxlID09IG51bGxwdHIpIHx8CisgICAgICAgICAgICAoY2FsbGJhY2stPm9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQgPT0gbnVsbHB0cikpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGFyZ3VtZW50ISBjYWxsYmFjayAlcCwgIgorICAgICAgICAgICAgICAgICJvbkNhbWVyYUF2YWlsYWJsZSAlcCwgb25DYW1lcmFVbmF2YWlsYWJsZSAlcCBvbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkICVwIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FsbGJhY2ssCisgICAgICAgICAgICAgICBjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLm9uQ2FtZXJhQXZhaWxhYmxlLAorICAgICAgICAgICAgICAgY2FsbGJhY2stPmF2YWlsYWJpbGl0eUNhbGxiYWNrcy5vbkNhbWVyYVVuYXZhaWxhYmxlLAorICAgICAgICAgICAgICAgY2FsbGJhY2stPm9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKS51bnJlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjayhjYWxsYmFjayk7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK0VYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcygKICAgICAgICAgQUNhbWVyYU1hbmFnZXIqIG1nciwgY29uc3QgY2hhciogY2FtZXJhSWQsIEFDYW1lcmFNZXRhZGF0YSoqIGNoYXJzKXsKICAgICBBVFJBQ0VfQ0FMTCgpOwpAQCAtMTA3LDcgKzE2NywxNCBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbWdyLCBjYW1lcmFJZCwgY2hhcnMpOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKICAgICB9Ci0gICAgcmV0dXJuIG1nci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkLCBjaGFycyk7CisgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBzcENoYXJzOworICAgIGNhbWVyYV9zdGF0dXNfdCBzdGF0dXMgPSBtZ3ItPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCwgJnNwQ2hhcnMpOworICAgIGlmIChzdGF0dXMgIT0gQUNBTUVSQV9PSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzcENoYXJzLT5pbmNTdHJvbmcoKHZvaWQqKSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MpOworICAgICpjaGFycyA9IHNwQ2hhcnMuZ2V0KCk7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7CiB9CiAKIEVYUE9SVApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9OZGtDYW1lcmFNZXRhZGF0YS5jcHAgYi9jYW1lcmEvbmRrL05ka0NhbWVyYU1ldGFkYXRhLmNwcAppbmRleCA2NWRlODFmLi45YTM5ZWQ4IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL05ka0NhbWVyYU1ldGFkYXRhLmNwcAorKysgYi9jYW1lcmEvbmRrL05ka0NhbWVyYU1ldGFkYXRhLmNwcApAQCAtNTcsMTMgKzU3LDMyIEBACiAgICAgICAgIEFMT0dFKCIlczogc3JjIGlzIG51bGwhIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQotICAgIHJldHVybiBuZXcgQUNhbWVyYU1ldGFkYXRhKCpzcmMpOworICAgIEFDYW1lcmFNZXRhZGF0YSogY29weSA9IG5ldyBBQ2FtZXJhTWV0YWRhdGEoKnNyYyk7CisgICAgY29weS0+aW5jU3Ryb25nKCh2b2lkKikgQUNhbWVyYU1ldGFkYXRhX2NvcHkpOworICAgIHJldHVybiBjb3B5OwogfQogCiBFWFBPUlQKIHZvaWQgQUNhbWVyYU1ldGFkYXRhX2ZyZWUoQUNhbWVyYU1ldGFkYXRhKiBtZXRhZGF0YSkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKG1ldGFkYXRhICE9IG51bGxwdHIpIHsKLSAgICAgICAgZGVsZXRlIG1ldGFkYXRhOworICAgICAgICBtZXRhZGF0YS0+ZGVjU3Ryb25nKCh2b2lkKikgQUNhbWVyYU1ldGFkYXRhX2ZyZWUpOwogICAgIH0KIH0KKworRVhQT1JUCitib29sIEFDYW1lcmFNZXRhZGF0YV9pc0xvZ2ljYWxNdWx0aUNhbWVyYShjb25zdCBBQ2FtZXJhTWV0YWRhdGEqIHN0YXRpY01ldGFkYXRhLAorICAgICAgICAvKm91dCovc2l6ZV90KiBudW1QaHlzaWNhbENhbWVyYXMsIC8qb3V0Ki9jb25zdCBjaGFyKmNvbnN0KiogcGh5c2ljYWxDYW1lcmFJZHMpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChudW1QaHlzaWNhbENhbWVyYXMgPT0gbnVsbHB0ciB8fCBwaHlzaWNhbENhbWVyYUlkcyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBpbnB1dDogbnVtUGh5c2ljYWxDYW1lcmFzICVwLCBwaHlzaWNhbENhbWVyYUlkcyAlcCIsCisgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbnVtUGh5c2ljYWxDYW1lcmFzLCBwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHN0YXRpY01ldGFkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGlucHV0OiBzdGF0aWNNZXRhZGF0YSBpcyBudWxsLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdGljTWV0YWRhdGEtPmlzTG9naWNhbE11bHRpQ2FtZXJhKG51bVBoeXNpY2FsQ2FtZXJhcywgcGh5c2ljYWxDYW1lcmFJZHMpOworfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9OZGtDYXB0dXJlUmVxdWVzdC5jcHAgYi9jYW1lcmEvbmRrL05ka0NhcHR1cmVSZXF1ZXN0LmNwcAppbmRleCBhYzE4NTZiLi44N2RlNGE5IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL05ka0NhcHR1cmVSZXF1ZXN0LmNwcAorKysgYi9jYW1lcmEvbmRrL05ka0NhcHR1cmVSZXF1ZXN0LmNwcApAQCAtMjcsNyArMjcsNyBAQAogCiBFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZSgKLSAgICAgICAgQU5hdGl2ZVdpbmRvdyogd2luZG93LCBBQ2FtZXJhT3V0cHV0VGFyZ2V0Kiogb3V0KSB7CisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3csIEFDYW1lcmFPdXRwdXRUYXJnZXQqKiBvdXQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmICh3aW5kb3cgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBpbnB1dCB3aW5kb3cgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CkBAIC05OCw2ICs5OCwyNyBAQAogfQogCiBFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3RfZ2V0Q29uc3RFbnRyeV9waHlzaWNhbENhbWVyYSgKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXEsIGNvbnN0IGNoYXIqIHBoeXNpY2FsSWQsCisgICAgICAgIHVpbnQzMl90IHRhZywgQUNhbWVyYU1ldGFkYXRhX2NvbnN0X2VudHJ5KiBlbnRyeSkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKHJlcSA9PSBudWxscHRyIHx8IGVudHJ5ID09IG51bGxwdHIgfHwgcGh5c2ljYWxJZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBhcmd1bWVudCEgcmVxICVwLCB0YWcgMHgleCwgZW50cnkgJXAsIHBoeXNpY2FsSWQgJXAiLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXEsIHRhZywgZW50cnksIHBoeXNpY2FsSWQpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvJiBwaHlzaWNhbFNldHRpbmdzID0gcmVxLT5waHlzaWNhbFNldHRpbmdzLmZpbmQocGh5c2ljYWxJZCk7CisgICAgaWYgKHBoeXNpY2FsU2V0dGluZ3MgPT0gcmVxLT5waHlzaWNhbFNldHRpbmdzLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGZpbmQgbWV0YWRhdGEgZm9yIHBoeXNpY2FsIGNhbWVyYSBpZCAgJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcGh5c2ljYWxJZCk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIHJldHVybiBwaHlzaWNhbFNldHRpbmdzLT5zZWNvbmQtPmdldENvbnN0RW50cnkodGFnLCBlbnRyeSk7Cit9CisKK0VYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9nZXRBbGxUYWdzKAogICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHJlcSwgLypvdXQqL2ludDMyX3QqIG51bVRhZ3MsIC8qb3V0Ki9jb25zdCB1aW50MzJfdCoqIHRhZ3MpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwpAQCAtMTMxLDEzICsxNTIsNDIgQEAKIAogI3VuZGVmIFNFVF9FTlRSWQogCisjZGVmaW5lIFNFVF9QSFlTSUNBTF9FTlRSWShOQU1FLE5ES19UWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorRVhQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcGh5c2ljYWxDYW1lcmFfIyNOQU1FKCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxLCBjb25zdCBjaGFyKiBwaHlzaWNhbElkLCB1aW50MzJfdCB0YWcsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50MzJfdCBjb3VudCwgY29uc3QgTkRLX1RZUEUqIGRhdGEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBVFJBQ0VfQ0FMTCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHJlcSA9PSBudWxscHRyIHx8IChjb3VudCA+IDAgJiYgZGF0YSA9PSBudWxscHRyKSB8fCBwaHlzaWNhbElkID09IG51bGxwdHIpIHsgICAgXAorICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgYXJndW1lbnQhIHJlcSAlcCwgdGFnIDB4JXgsIGNvdW50ICVkLCBkYXRhIDB4JXAsIHBoeXNpY2FsSWQgJXAiLCBcCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlcSwgdGFnLCBjb3VudCwgZGF0YSwgcGh5c2ljYWxJZCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHJlcS0+cGh5c2ljYWxTZXR0aW5ncy5maW5kKHBoeXNpY2FsSWQpID09IHJlcS0+cGh5c2ljYWxTZXR0aW5ncy5lbmQoKSkgeyAgICAgICAgXAorICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIG1ldGFkYXRhIGZvciBwaHlzaWNhbCBjYW1lcmEgaWQgJXMiLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcGh5c2ljYWxJZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gcmVxLT5waHlzaWNhbFNldHRpbmdzW3BoeXNpY2FsSWRdLT51cGRhdGUodGFnLCBjb3VudCwgZGF0YSk7ICAgICAgICAgICAgICAgICBcCit9CisKK1NFVF9QSFlTSUNBTF9FTlRSWSh1OCx1aW50OF90KQorU0VUX1BIWVNJQ0FMX0VOVFJZKGkzMixpbnQzMl90KQorU0VUX1BIWVNJQ0FMX0VOVFJZKGZsb2F0LGZsb2F0KQorU0VUX1BIWVNJQ0FMX0VOVFJZKGRvdWJsZSxkb3VibGUpCitTRVRfUEhZU0lDQUxfRU5UUlkoaTY0LGludDY0X3QpCitTRVRfUEhZU0lDQUxfRU5UUlkocmF0aW9uYWwsQUNhbWVyYU1ldGFkYXRhX3JhdGlvbmFsKQorCisjdW5kZWYgU0VUX1BIWVNJQ0FMX0VOVFJZCisKIEVYUE9SVAogdm9pZCBBQ2FwdHVyZVJlcXVlc3RfZnJlZShBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmIChyZXF1ZXN0ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBkZWxldGUgcmVxdWVzdC0+c2V0dGluZ3M7CisgICAgcmVxdWVzdC0+c2V0dGluZ3MuY2xlYXIoKTsKKyAgICByZXF1ZXN0LT5waHlzaWNhbFNldHRpbmdzLmNsZWFyKCk7CiAgICAgZGVsZXRlIHJlcXVlc3QtPnRhcmdldHM7CiAgICAgZGVsZXRlIHJlcXVlc3Q7CiAgICAgcmV0dXJuOwpAQCAtMTc0LDYgKzIyNCw5IEBACiAKICAgICBBQ2FwdHVyZVJlcXVlc3QqIHBSZXF1ZXN0ID0gbmV3IEFDYXB0dXJlUmVxdWVzdCgpOwogICAgIHBSZXF1ZXN0LT5zZXR0aW5ncyA9IG5ldyBBQ2FtZXJhTWV0YWRhdGEoKihzcmMtPnNldHRpbmdzKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBlbnRyeSA6IHNyYy0+cGh5c2ljYWxTZXR0aW5ncykgeworICAgICAgICBwUmVxdWVzdC0+cGh5c2ljYWxTZXR0aW5nc1tlbnRyeS5maXJzdF0gPSBuZXcgQUNhbWVyYU1ldGFkYXRhKCooZW50cnkuc2Vjb25kKSk7CisgICAgfQogICAgIHBSZXF1ZXN0LT50YXJnZXRzICA9IG5ldyBBQ2FtZXJhT3V0cHV0VGFyZ2V0cygpOwogICAgICoocFJlcXVlc3QtPnRhcmdldHMpICA9ICooc3JjLT50YXJnZXRzKTsKICAgICBwUmVxdWVzdC0+Y29udGV4dCA9IHNyYy0+Y29udGV4dDsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKaW5kZXggZjYwZTVmZC4uZDZmMTQxMiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKQEAgLTIzLDcgKzIzLDcgQEAKIAogQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjp+QUNhbWVyYUNhcHR1cmVTZXNzaW9uKCkgewogICAgIEFMT0dWKCJ+QUNhbWVyYUNhcHR1cmVTZXNzaW9uOiAlcCBub3RpZnkgZGV2aWNlIGVuZCBvZiBsaWZlIiwgdGhpcyk7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKICAgICBpZiAoZGV2ICE9IG51bGxwdHIgJiYgIWRldi0+aXNDbG9zZWQoKSkgewogICAgICAgICBkZXYtPmxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCk7CiAgICAgICAgIHsKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgICAgICAgbUNsb3NlZEJ5QXBwID0gdHJ1ZTsKICAgICB9CiAKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgIT0gbnVsbHB0cikgewogICAgICAgICBkZXYtPmxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCk7CiAgICAgfQpAQCAtNzMsNyArNzMsNyBAQAogCiBjYW1lcmFfc3RhdHVzX3QKIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6c3RvcFJlcGVhdGluZygpIHsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwpAQCAtOTEsNyArOTEsNyBAQAogCiBjYW1lcmFfc3RhdHVzX3QKIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6YWJvcnRDYXB0dXJlcygpIHsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwpAQCAtMTA3LDQ5ICsxMDcsOCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWNhbWVyYV9zdGF0dXNfdAotQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjpzZXRSZXBlYXRpbmdSZXF1ZXN0KAotICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzLAotICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAotICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwotICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7Ci0gICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwotICAgIH0KLQotICAgIGNhbWVyYV9zdGF0dXNfdCByZXQ7Ci0gICAgZGV2LT5sb2NrRGV2aWNlRm9yU2Vzc2lvbk9wcygpOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZXNzaW9uTG9jayk7Ci0gICAgICAgIHJldCA9IGRldi0+c2V0UmVwZWF0aW5nUmVxdWVzdHNMb2NrZWQoCi0gICAgICAgICAgICAgICAgdGhpcywgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKLSAgICB9Ci0gICAgZGV2LT51bmxvY2tEZXZpY2UoKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1jYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjpjYXB0dXJlKAotICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzLAotICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAotICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwotICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7Ci0gICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwotICAgIH0KLSAgICBjYW1lcmFfc3RhdHVzX3QgcmV0OwotICAgIGRldi0+bG9ja0RldmljZUZvclNlc3Npb25PcHMoKTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vzc2lvbkxvY2spOwotICAgICAgICByZXQgPSBkZXYtPmNhcHR1cmVMb2NrZWQodGhpcywgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKLSAgICB9Ci0gICAgZGV2LT51bmxvY2tEZXZpY2UoKTsKLSAgICByZXR1cm4gcmV0OwotfQotCiBjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjp1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0cHV0KSB7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKICAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKQEAgLTE2OCw3ICsxMjcsNyBAQAogQUNhbWVyYURldmljZSoKIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6Z2V0RGV2aWNlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vzc2lvbkxvY2spOwotICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKKyAgICBzcDxhY2FtOjpDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CiAgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJFcnJvcjogRGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uICVwIGhhcyBiZWVuIGNsb3NlZCEiLCB0aGlzKTsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC0xODIsOSArMTQxLDkgQEAKICAgICBtSXNDbG9zZWQgPSB0cnVlOwogfQogCi1zcDxDYW1lcmFEZXZpY2U+CitzcDxhY2FtOjpDYW1lcmFEZXZpY2U+CiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OmdldERldmljZVNwKCkgewotICAgIHNwPENhbWVyYURldmljZT4gZGV2aWNlID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXZpY2UgPSBtRGV2aWNlLnByb21vdGUoKTsKICAgICBpZiAoZGV2aWNlID09IG51bGxwdHIgfHwgZGV2aWNlLT5pc0Nsb3NlZCgpKSB7CiAgICAgICAgIEFMT0dXKCJEZXZpY2UgaXMgY2xvc2VkIGJ1dCBzZXNzaW9uICVkIGlzIG5vdCBub3RpZmllZCIsIG1JZCk7CiAgICAgICAgIHJldHVybiBudWxscHRyOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCmluZGV4IGEyMDY4ZTcuLjA4YTkyMjYgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgKQEAgLTE3LDE1ICsxNywyMiBAQAogI2RlZmluZSBfQUNBTUVSQV9DQVBUVVJFX1NFU1NJT05fSAogCiAjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEzLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYURldmljZS5oPgorCisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworI2luY2x1ZGUgIm5ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmgiCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvblZlbmRvci5oIgorI2Vsc2UKICNpbmNsdWRlICJBQ2FtZXJhRGV2aWNlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCiBzdHJ1Y3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IHsKLSAgICBleHBsaWNpdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQoQU5hdGl2ZVdpbmRvdyogd2luZG93LCBib29sIGlzU2hhcmVkID0gZmFsc2UpIDoKLSAgICAgICAgICAgIG1XaW5kb3cod2luZG93KSwgbUlzU2hhcmVkKGlzU2hhcmVkKSB7fTsKKyAgICBleHBsaWNpdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQoQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgYm9vbCBpc1NoYXJlZCA9IGZhbHNlLAorICAgICAgICAgICAgY29uc3QgY2hhciogcGh5c2ljYWxDYW1lcmFJZCA9ICIiKSA6CisgICAgICAgICAgICBtV2luZG93KHdpbmRvdyksIG1Jc1NoYXJlZChpc1NoYXJlZCksIG1QaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpIHt9OwogCiAgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0JiBvdGhlcikgY29uc3QgewogICAgICAgICByZXR1cm4gbVdpbmRvdyA9PSBvdGhlci5tV2luZG93OwpAQCAtNDAsMTEgKzQ3LDEzIEBACiAgICAgICAgIHJldHVybiBtV2luZG93ID4gb3RoZXIubVdpbmRvdzsKICAgICB9CiAKLSAgICBBTmF0aXZlV2luZG93KiBtV2luZG93OwotICAgIHN0ZDo6c2V0PEFOYXRpdmVXaW5kb3cgKj4gbVNoYXJlZFdpbmRvd3M7CisgICAgQUNhbWVyYVdpbmRvd1R5cGUqIG1XaW5kb3c7CisgICAgc3RkOjpzZXQ8QUNhbWVyYVdpbmRvd1R5cGUgKj4gbVNoYXJlZFdpbmRvd3M7CiAgICAgYm9vbCAgICAgICAgICAgbUlzU2hhcmVkOwogICAgIGludCAgICAgICAgICAgIG1Sb3RhdGlvbiA9IENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzA7CisgICAgc3RkOjpzdHJpbmcgbVBoeXNpY2FsQ2FtZXJhSWQ7CiB9OworI2VuZGlmCiAKIHN0cnVjdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIgewogICAgIHN0ZDo6c2V0PEFDYXB0dXJlU2Vzc2lvbk91dHB1dD4gbU91dHB1dHM7CkBAIC02MCw3ICs2OSw3IEBACiAgICAgICAgICAgICBpbnQgaWQsCiAgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIG91dHB1dHMsCiAgICAgICAgICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MqIGNiLAotICAgICAgICAgICAgQ2FtZXJhRGV2aWNlKiBkZXZpY2UpIDoKKyAgICAgICAgICAgIGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZSogZGV2aWNlKSA6CiAgICAgICAgICAgICBtSWQoaWQpLCBtT3V0cHV0KCpvdXRwdXRzKSwgbVVzZXJTZXNzaW9uQ2FsbGJhY2soKmNiKSwKICAgICAgICAgICAgIG1EZXZpY2UoZGV2aWNlKSB7fQogCkBAIC04MiwxMyArOTEsMTUgQEAKIAogICAgIGNhbWVyYV9zdGF0dXNfdCBhYm9ydENhcHR1cmVzKCk7CiAKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgIGNhbWVyYV9zdGF0dXNfdCBzZXRSZXBlYXRpbmdSZXF1ZXN0KAotICAgICAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKICAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKIAorICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICAgY2FtZXJhX3N0YXR1c190IGNhcHR1cmUoCi0gICAgICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzLAorICAgICAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAogICAgICAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKICAgICAgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpOwogCkBAIC05NywxOCArMTA4LDE4IEBACiAgICAgQUNhbWVyYURldmljZSogZ2V0RGV2aWNlKCk7CiAKICAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgQ2FtZXJhRGV2aWNlOworICAgIGZyaWVuZCBjbGFzcyBhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2U7CiAKICAgICAvLyBDbG9zZSBzZXNzaW9uIGJlY2F1c2UgYXBwIGNsb3NlIGNhbWVyYSBkZXZpY2UsIGNhbWVyYSBkZXZpY2UgZ290IEVSUk9SX0RJU0NPTk5FQ1RFRCwKICAgICAvLyBvciBhIG5ldyBzZXNzaW9uIGlzIHJlcGxhY2luZyB0aGlzIHNlc3Npb24uCiAgICAgdm9pZCBjbG9zZUJ5RGV2aWNlKCk7CiAKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGdldERldmljZVNwKCk7CisgICAgc3A8YW5kcm9pZDo6YWNhbTo6Q2FtZXJhRGV2aWNlPiBnZXREZXZpY2VTcCgpOwogCiAgICAgY29uc3QgaW50IG1JZDsKICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIgbU91dHB1dDsKICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MgbVVzZXJTZXNzaW9uQ2FsbGJhY2s7Ci0gICAgY29uc3Qgd3A8Q2FtZXJhRGV2aWNlPiBtRGV2aWNlOworICAgIGNvbnN0IHdwPGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZT4gbURldmljZTsKICAgICBib29sICBtSXNDbG9zZWQgPSBmYWxzZTsKICAgICBib29sICBtQ2xvc2VkQnlBcHAgPSBmYWxzZTsKICAgICBNdXRleCBtU2Vzc2lvbkxvY2s7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YmY4YTUKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgorCisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworI2luY2x1ZGUgIm5ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlVmVuZG9yLmluYyIKKyNlbHNlCisjaW5jbHVkZSAiQUNhbWVyYURldmljZS5pbmMiCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190CitBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OnNldFJlcGVhdGluZ1JlcXVlc3QoCisgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKKyAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKKyAgICB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0OworICAgIGRldi0+bG9ja0RldmljZUZvclNlc3Npb25PcHMoKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vzc2lvbkxvY2spOworICAgICAgICByZXQgPSBkZXYtPnNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKAorICAgICAgICAgICAgICAgIHRoaXMsIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7CisgICAgfQorICAgIGRldi0+dW5sb2NrRGV2aWNlKCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjpjYXB0dXJlKAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICBzcDxhY2FtOjpDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJFcnJvcjogRGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uICVwIGhhcyBiZWVuIGNsb3NlZCEiLCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CisgICAgfQorICAgIGNhbWVyYV9zdGF0dXNfdCByZXQ7CisgICAgZGV2LT5sb2NrRGV2aWNlRm9yU2Vzc2lvbk9wcygpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZXNzaW9uTG9jayk7CisgICAgICAgIHJldCA9IGRldi0+Y2FwdHVyZUxvY2tlZCh0aGlzLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworICAgIH0KKyAgICBkZXYtPnVubG9ja0RldmljZSgpOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAKaW5kZXggZmZhYmY3Yi4uNWU0ZmNkMCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcApAQCAtMjAsMTYgKzIwLDE3IEBACiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5oPgotI2luY2x1ZGUgPGNhbWVyYTIvU3VibWl0SW5mby5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSAiQUNhbWVyYURldmljZS5oIgogI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgogI2luY2x1ZGUgIkFDYXB0dXJlUmVxdWVzdC5oIgogI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgogCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKyNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaW5jIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKIC8vIFN0YXRpYyBtZW1iZXIgZGVmaW5pdGlvbnMKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NvbnRleHRLZXkgICAgICAgID0gIkNvbnRleHQiOwogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprRGV2aWNlS2V5ICAgICAgICAgPSAiRGV2aWNlIjsKQEAgLTM5LDYgKzQwLDcgQEAKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NhcHR1cmVSZXF1ZXN0S2V5ID0gIkNhcHR1cmVSZXF1ZXN0IjsKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a1RpbWVTdGFtcEtleSAgICAgID0gIlRpbWVTdGFtcCI7CiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDYXB0dXJlUmVzdWx0S2V5ICA9ICJDYXB0dXJlUmVzdWx0IjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a1BoeXNpY2FsQ2FwdHVyZVJlc3VsdEtleSA9ICJQaHlzaWNhbENhcHR1cmVSZXN1bHQiOwogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ2FwdHVyZUZhaWx1cmVLZXkgPSAiQ2FwdHVyZUZhaWx1cmUiOwogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprU2VxdWVuY2VJZEtleSAgICAgPSAiU2VxdWVuY2VJZCI7CiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtGcmFtZU51bWJlcktleSAgICA9ICJGcmFtZU51bWJlciI7CkBAIC01MCwxMSArNTIsMTEgQEAKIENhbWVyYURldmljZTo6Q2FtZXJhRGV2aWNlKAogICAgICAgICBjb25zdCBjaGFyKiBpZCwKICAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2IsCi0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzLAorICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzLAogICAgICAgICBBQ2FtZXJhRGV2aWNlKiB3cmFwcGVyKSA6CiAgICAgICAgIG1DYW1lcmFJZChpZCksCiAgICAgICAgIG1BcHBDYWxsYmFja3MoKmNiKSwKLSAgICAgICAgbUNoYXJzKHN0ZDo6bW92ZShjaGFycykpLAorICAgICAgICBtQ2hhcnMoY2hhcnMpLAogICAgICAgICBtU2VydmljZUNhbGxiYWNrKG5ldyBTZXJ2aWNlQ2FsbGJhY2sodGhpcykpLAogICAgICAgICBtV3JhcHBlcih3cmFwcGVyKSwKICAgICAgICAgbUluRXJyb3IoZmFsc2UpLApAQCAtNzQsNyArNzYsNyBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLWVyciksIGVycik7CiAgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CiAgICAgfQotICAgIG1IYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcigpOworICAgIG1IYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcihpZCk7CiAgICAgbUNiTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOwogCiAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhID0gbUNoYXJzLT5nZXRJbnRlcm5hbERhdGEoKTsKQEAgLTk1LDYgKzk3LDE0IEBACiAgICAgICAgIG1TaGFkaW5nTWFwU2l6ZVswXSA9IGVudHJ5LmRhdGEuaTMyWzBdOwogICAgICAgICBtU2hhZGluZ01hcFNpemVbMV0gPSBlbnRyeS5kYXRhLmkzMlsxXTsKICAgICB9CisKKyAgICBzaXplX3QgcGh5c2ljYWxJZENudCA9IDA7CisgICAgY29uc3QgY2hhcipjb25zdCogcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgaWYgKG1DaGFycy0+aXNMb2dpY2FsTXVsdGlDYW1lcmEoJnBoeXNpY2FsSWRDbnQsICZwaHlzaWNhbENhbWVyYUlkcykpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbElkQ250OyBpKyspIHsKKyAgICAgICAgICAgIG1QaHlzaWNhbElkcy5wdXNoX2JhY2socGh5c2ljYWxDYW1lcmFJZHNbaV0pOworICAgICAgICB9CisgICAgfQogfQogCiAvLyBEZXZpY2UgY2xvc2UgaW1wbGVtZW50YWl0b24KQEAgLTEyNyw4ICsxMzcsMjkgQEAKIGNhbWVyYV9zdGF0dXNfdAogQ2FtZXJhRGV2aWNlOjpjcmVhdGVDYXB0dXJlUmVxdWVzdCgKICAgICAgICAgQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCisgICAgICAgIGNvbnN0IEFDYW1lcmFJZExpc3QqIHBoeXNpY2FsSWRMaXN0LAogICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKKworICAgIGlmIChwaHlzaWNhbElkTGlzdCAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChwaHlzaWNhbElkTGlzdC0+bnVtQ2FtZXJhcyA+IHN0YXRpY19jYXN0PGludD4obVBoeXNpY2FsSWRzLnNpemUoKSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogcGh5c2ljYWxJZExpc3Qgc2l6ZSAlZCBleGNlZWRzIG51bWJlciBvZiBhdmFpbGFibGUgcGh5c2ljYWwgY2FtZXJhcyAlenUiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBoeXNpY2FsSWRMaXN0LT5udW1DYW1lcmFzLCBtUGh5c2ljYWxJZHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byBpID0gMDsgaSA8IHBoeXNpY2FsSWRMaXN0LT5udW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwaHlzaWNhbElkTGlzdC0+Y2FtZXJhSWRzW2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHBoeXNpY2FsSWQgaXMgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1QaHlzaWNhbElkcy5lbmQoKSA9PSBzdGQ6OmZpbmQoCisgICAgICAgICAgICAgICAgICAgIG1QaHlzaWNhbElkcy5iZWdpbigpLCBtUGh5c2ljYWxJZHMuZW5kKCksIHBoeXNpY2FsSWRMaXN0LT5jYW1lcmFJZHNbaV0pKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHBoeXNpY2FsSWQgJXMhIiwgX19GVU5DVElPTl9fLCBwaHlzaWNhbElkTGlzdC0+Y2FtZXJhSWRzW2ldKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTE0OSw2ICsxODAsMTIgQEAKICAgICB9CiAgICAgQUNhcHR1cmVSZXF1ZXN0KiBvdXRSZXEgPSBuZXcgQUNhcHR1cmVSZXF1ZXN0KCk7CiAgICAgb3V0UmVxLT5zZXR0aW5ncyA9IG5ldyBBQ2FtZXJhTWV0YWRhdGEocmF3UmVxdWVzdC5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFUVVFU1QpOworICAgIGlmIChwaHlzaWNhbElkTGlzdCAhPSBudWxscHRyKSB7CisgICAgICAgIGZvciAoYXV0byBpID0gMDsgaSA8IHBoeXNpY2FsSWRMaXN0LT5udW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgICAgIG91dFJlcS0+cGh5c2ljYWxTZXR0aW5ncy5lbXBsYWNlKHBoeXNpY2FsSWRMaXN0LT5jYW1lcmFJZHNbaV0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhTWV0YWRhdGEoKihvdXRSZXEtPnNldHRpbmdzKSkpOworICAgICAgICB9CisgICAgfQogICAgIG91dFJlcS0+dGFyZ2V0cyAgPSBuZXcgQUNhbWVyYU91dHB1dFRhcmdldHMoKTsKICAgICAqcmVxdWVzdCA9IG91dFJlcTsKICAgICByZXR1cm4gQUNBTUVSQV9PSzsKQEAgLTE5MCwxMDYgKzIyNyw2IEBACiAgICAgcmV0dXJuIEFDQU1FUkFfT0s7CiB9CiAKLWNhbWVyYV9zdGF0dXNfdAotQ2FtZXJhRGV2aWNlOjpjYXB0dXJlTG9ja2VkKAotICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCi0gICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCi0gICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCi0gICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKLSAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCi0gICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL2ZhbHNlKTsKLX0KLQotY2FtZXJhX3N0YXR1c190Ci1DYW1lcmFEZXZpY2U6OnNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKAotICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCi0gICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCi0gICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCi0gICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKLSAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCi0gICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL3RydWUpOwotfQotCi1jYW1lcmFfc3RhdHVzX3QKLUNhbWVyYURldmljZTo6c3VibWl0UmVxdWVzdHNMb2NrZWQoCi0gICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKLSAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKLSAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKLSAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKLSAgICAgICAgYm9vbCBpc1JlcGVhdGluZykgewotICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKLSAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKLSAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdWJtaXQgY2FwdHVyZSByZXF1ZXN0IGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvLyBGb3JtIHR3byB2ZWN0b3JzIG9mIGNhcHR1cmUgcmVxdWVzdCwgb25lIGZvciBpbnRlcm5hbCB0cmFja2luZwotICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpjYW1lcmEyOjpDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdExpc3Q7Ci0gICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+IHJlcXVlc3RzVjsKLSAgICByZXF1ZXN0c1Yuc2V0Q2FwYWNpdHkobnVtUmVxdWVzdHMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVxdWVzdHM7IGkrKykgewotICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxOwotICAgICAgICByZXQgPSBhbGxvY2F0ZUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RzW2ldLCByZXEpOwotICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb252ZXJ0IGNhcHR1cmUgcmVxdWVzdCB0byBpbnRlcm5hbCBmb3JtYXQgZmFpbHVyZSEgcmV0ICVkIiwgcmV0KTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlcS0+bVN1cmZhY2VMaXN0LmVtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDYXB0dXJlIHJlcXVlc3Qgd2l0aG91dCBvdXRwdXQgdGFyZ2V0IGNhbm5vdCBiZSBzdWJtaXR0ZWQhIik7Ci0gICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKLSAgICAgICAgfQotICAgICAgICByZXF1ZXN0TGlzdC5wdXNoX2JhY2soKihyZXEuZ2V0KCkpKTsKLSAgICAgICAgcmVxdWVzdHNWLnB1c2hfYmFjayhyZXEpOwotICAgIH0KLQotICAgIGlmIChpc1JlcGVhdGluZykgewotICAgICAgICByZXQgPSBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7Ci0gICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewotICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdG9wIHJlcGVhdGluZyBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYmluZGVyOjpTdGF0dXMgcmVtb3RlUmV0OwotICAgIGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6U3VibWl0SW5mbyBpbmZvOwotICAgIHJlbW90ZVJldCA9IG1SZW1vdGUtPnN1Ym1pdFJlcXVlc3RMaXN0KHJlcXVlc3RMaXN0LCBpc1JlcGVhdGluZywgJmluZm8pOwotICAgIGludCBzZXF1ZW5jZUlkID0gaW5mby5tUmVxdWVzdElkOwotICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gaW5mby5tTGFzdEZyYW1lTnVtYmVyOwotICAgIGlmIChzZXF1ZW5jZUlkIDwgMCkgewotICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN1Ym1pdCByZXF1ZXN0IHJlbW90ZSBmYWlsdXJlOiByZXQgJWQiLCBnZXRJZCgpLCBzZXF1ZW5jZUlkKTsKLSAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKLSAgICB9Ci0KLSAgICBDYWxsYmFja0hvbGRlciBjYkhvbGRlcihzZXNzaW9uLCByZXF1ZXN0c1YsIGlzUmVwZWF0aW5nLCBjYnMpOwotICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBjYkhvbGRlcikpOwotCi0gICAgaWYgKGlzUmVwZWF0aW5nKSB7Ci0gICAgICAgIC8vIHN0b3BSZXBlYXRpbmcgYWJvdmUgc2hvdWxkIGhhdmUgY2xlYW51cCByZXBlYXRpbmcgc2VxdWVuY2UgaWQKLSAgICAgICAgaWYgKG1SZXBlYXRpbmdTZXF1ZW5jZUlkICE9IFJFUVVFU1RfSURfTk9ORSkgewotICAgICAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKLSAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0U7Ci0gICAgICAgIH0KLSAgICAgICAgbVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBzZXF1ZW5jZUlkOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKSk7Ci0gICAgfQotCi0gICAgaWYgKG1JZGxlKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgbUhhbmRsZXIpOwotICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOwotICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uQWN0aXZlKTsKLSAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7Ci0gICAgfQotICAgIG1JZGxlID0gZmFsc2U7Ci0gICAgbUJ1c3lTZXNzaW9uID0gc2Vzc2lvbjsKLQotICAgIGlmIChjYXB0dXJlU2VxdWVuY2VJZCkgewotICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBzZXF1ZW5jZUlkOwotICAgIH0KLSAgICByZXR1cm4gQUNBTUVSQV9PSzsKLX0KLQogY2FtZXJhX3N0YXR1c190IENhbWVyYURldmljZTo6dXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbkxvY2tlZChBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dHB1dCkgewogICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKQEAgLTMyNSw4ICsyNjIsOSBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0Q29uZmlnKGlHQlAsIG91dHB1dC0+bVJvdGF0aW9uLCBPdXRwdXRDb25maWd1cmF0aW9uOjpJTlZBTElEX1NFVF9JRCwKLSAgICAgICAgICAgIHRydWUpOworICAgIFN0cmluZzE2IHBoeXNpY2FsSWQxNihvdXRwdXQtPm1QaHlzaWNhbENhbWVyYUlkLmNfc3RyKCkpOworICAgIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0Q29uZmlnKGlHQlAsIG91dHB1dC0+bVJvdGF0aW9uLCBwaHlzaWNhbElkMTYsCisgICAgICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uOjpJTlZBTElEX1NFVF9JRCwgdHJ1ZSk7CiAKICAgICBmb3IgKGF1dG8mIGFudyA6IG91dHB1dC0+bVNoYXJlZFdpbmRvd3MpIHsKICAgICAgICAgcmV0ID0gZ2V0SUdCUGZyb21BbncoYW53LCBpR0JQKTsKQEAgLTM3Miw4ICszMTAsMTIgQEAKICAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCAvKm91dCovc3A8Q2FwdHVyZVJlcXVlc3Q+JiBvdXRSZXEpIHsKICAgICBjYW1lcmFfc3RhdHVzX3QgcmV0OwogICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXEobmV3IENhcHR1cmVSZXF1ZXN0KCkpOwotICAgIHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucHVzaF9iYWNrKHtzdGQ6OnN0cmluZyhtQ2FtZXJhSWQuc3RyaW5nKCkpLAorICAgIHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucHVzaF9iYWNrKHtnZXRJZCgpLAogICAgICAgICAgICAgcmVxdWVzdC0+c2V0dGluZ3MtPmdldEludGVybmFsRGF0YSgpfSk7CisgICAgZm9yIChhdXRvJiBlbnRyeSA6IHJlcXVlc3QtPnBoeXNpY2FsU2V0dGluZ3MpIHsKKyAgICAgICAgcmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5wdXNoX2JhY2soe2VudHJ5LmZpcnN0LAorICAgICAgICAgICAgICAgIGVudHJ5LnNlY29uZC0+Z2V0SW50ZXJuYWxEYXRhKCl9KTsKKyAgICB9CiAgICAgcmVxLT5tSXNSZXByb2Nlc3MgPSBmYWxzZTsgLy8gTkRLIGRvZXMgbm90IHN1cHBvcnQgcmVwcm9jZXNzaW5nIHlldAogICAgIHJlcS0+bUNvbnRleHQgPSByZXF1ZXN0LT5jb250ZXh0OwogICAgIHJlcS0+bVN1cmZhY2VDb252ZXJ0ZWQgPSB0cnVlOyAvLyBzZXQgdG8gdHJ1ZSwgYW5kIGZpbGwgaW4gc3RyZWFtL3N1cmZhY2UgaWR4IHRvIHNwZWVkIHVwIElQQwpAQCAtNDE3LDEwICszNTksMTcgQEAKIH0KIAogQUNhcHR1cmVSZXF1ZXN0KgotQ2FtZXJhRGV2aWNlOjphbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4mIHJlcSkgeworQ2FtZXJhRGV2aWNlOjphbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4mIHJlcSwgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZUlkKSB7CiAgICAgQUNhcHR1cmVSZXF1ZXN0KiBwUmVxdWVzdCA9IG5ldyBBQ2FwdHVyZVJlcXVlc3QoKTsKLSAgICBDYW1lcmFNZXRhZGF0YSBjbG9uZSA9IHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MuYmVnaW4oKS0+c2V0dGluZ3M7Ci0gICAgcFJlcXVlc3QtPnNldHRpbmdzID0gbmV3IEFDYW1lcmFNZXRhZGF0YShjbG9uZS5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFUVVFU1QpOworICAgIGZvciAoYXV0byYgZW50cnkgOiByZXEtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzKSB7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIGNsb25lID0gZW50cnkuc2V0dGluZ3M7CisgICAgICAgIGlmIChlbnRyeS5pZCA9PSBkZXZpY2VJZCkgeworICAgICAgICAgICAgcFJlcXVlc3QtPnNldHRpbmdzID0gbmV3IEFDYW1lcmFNZXRhZGF0YShjbG9uZS5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFUVVFU1QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFJlcXVlc3QtPnBoeXNpY2FsU2V0dGluZ3MuZW1wbGFjZShlbnRyeS5pZCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFDYW1lcmFNZXRhZGF0YShjbG9uZS5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFUVVFU1QpKTsKKyAgICAgICAgfQorICAgIH0KICAgICBwUmVxdWVzdC0+dGFyZ2V0cyAgPSBuZXcgQUNhbWVyYU91dHB1dFRhcmdldHMoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcS0+bVN1cmZhY2VMaXN0LnNpemUoKTsgaSsrKSB7CiAgICAgICAgIEFOYXRpdmVXaW5kb3cqIGFudyA9IHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cqPihyZXEtPm1TdXJmYWNlTGlzdFtpXS5nZXQoKSk7CkBAIC00MzYsNyArMzg1LDggQEAKICAgICBpZiAocmVxID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBkZWxldGUgcmVxLT5zZXR0aW5nczsKKyAgICByZXEtPnNldHRpbmdzLmNsZWFyKCk7CisgICAgcmVxLT5waHlzaWNhbFNldHRpbmdzLmNsZWFyKCk7CiAgICAgZGVsZXRlIHJlcS0+dGFyZ2V0czsKICAgICBkZWxldGUgcmVxOwogfQpAQCAtNjQwLDggKzU5MCw5IEBACiAgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQorICAgICAgICBTdHJpbmcxNiBwaHlzaWNhbElkMTYob3V0Q29uZmlnLm1QaHlzaWNhbENhbWVyYUlkLmNfc3RyKCkpOwogICAgICAgICBvdXRwdXRTZXQuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAotICAgICAgICAgICAgICAgIGFudywgT3V0cHV0Q29uZmlndXJhdGlvbihpR0JQLCBvdXRDb25maWcubVJvdGF0aW9uLAorICAgICAgICAgICAgICAgIGFudywgT3V0cHV0Q29uZmlndXJhdGlvbihpR0JQLCBvdXRDb25maWcubVJvdGF0aW9uLCBwaHlzaWNhbElkMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uOjpJTlZBTElEX1NFVF9JRCwgb3V0Q29uZmlnLm1Jc1NoYXJlZCkpKTsKICAgICB9CiAgICAgYXV0byBhZGRTZXQgPSBvdXRwdXRTZXQ7CkBAIC04MjksNyArNzgwLDcgQEAKICAgICBpZiAoZXJyb3JDb2RlID09IGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfQlVGRkVSKSB7CiAgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSByZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZDsKICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0IG9uQnVmZmVyTG9zdCA9Ci0gICAgICAgICAgICAgICAgY2JoLm1DYWxsYmFja3Mub25DYXB0dXJlQnVmZmVyTG9zdDsKKyAgICAgICAgICAgICAgICBjYmgubU9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CiAgICAgICAgIGF1dG8gb3V0cHV0UGFpckl0ID0gbUNvbmZpZ3VyZWRPdXRwdXRzLmZpbmQoc3RyZWFtSWQpOwogICAgICAgICBpZiAob3V0cHV0UGFpckl0ID09IG1Db25maWd1cmVkT3V0cHV0cy5lbmQoKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogc3RyZWFtIGlkICVkIGRvZXMgbm90IGV4aXN0IiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CkBAIC04NDYsNyArNzk3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJZCgpLCBhbncsIGZyYW1lTnVtYmVyKTsKIAogICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3QsIG1IYW5kbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKICAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uQnVmZmVyTG9zdCk7CiAgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CkBAIC04NTgsNyArODA5LDcgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSB7IC8vIEhhbmRsZSBvdGhlciBjYXB0dXJlIGZhaWx1cmVzCiAgICAgICAgIC8vIEZpcmUgY2FwdHVyZSBmYWlsdXJlIGNhbGxiYWNrIGlmIHRoZXJlIGlzIG9uZSByZWdpc3RlcmVkCi0gICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG9uRXJyb3IgPSBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVGYWlsZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG9uRXJyb3IgPSBjYmgubU9uQ2FwdHVyZUZhaWxlZDsKICAgICAgICAgc3A8Q2FtZXJhQ2FwdHVyZUZhaWx1cmU+IGZhaWx1cmUobmV3IENhbWVyYUNhcHR1cmVGYWlsdXJlKCkpOwogICAgICAgICBmYWlsdXJlLT5mcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOwogICAgICAgICAvLyBUT0RPOiByZWZpbmUgdGhpcyB3aGVuIGltcGxlbWVudGluZyBmbHVzaApAQCAtODY4LDcgKzgxOSw3IEBACiAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVNVTFQpOwogCiAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlRmFpbCwgbUhhbmRsZXIpOwotICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOwogICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25FcnJvcik7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CkBAIC04ODIsNiArODMzLDkgQEAKICAgICByZXR1cm47CiB9CiAKK0NhbWVyYURldmljZTo6Q2FsbGJhY2tIYW5kbGVyOjpDYWxsYmFja0hhbmRsZXIoY29uc3QgY2hhciogaWQpIDogbUlkKGlkKSB7Cit9CisKIHZvaWQgQ2FtZXJhRGV2aWNlOjpDYWxsYmFja0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKQEAgLTg5MCw2ICs4NDQsNyBAQAogICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFFbmQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxQWJvcnQ6CkBAIC05NjAsNiArOTE1LDcgQEAKICAgICAgICAgY2FzZSBrV2hhdFNlc3Npb25TdGF0ZUNiOgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0OgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxRW5kOgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUFib3J0OgpAQCAtOTc3LDYgKzkzMyw3IEBACiAgICAgICAgICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCAmb2JqKTsKQEAgLTEwMjAsNyArOTc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgdGltZXN0YW1wISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwKTsKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwLCBtSWQpOwogICAgICAgICAgICAgICAgICAgICAoKm9uU3RhcnQpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIHRpbWVzdGFtcCk7CiAgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTA0MywxMSArMTAwMCw2OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gcmVzdWx0KHN0YXRpY19jYXN0PEFDYW1lcmFNZXRhZGF0YSo+KG9iai5nZXQoKSkpOwotICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3ApOworICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3AsIG1JZCk7CiAgICAgICAgICAgICAgICAgICAgICgqb25SZXN1bHQpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIHJlc3VsdC5nZXQoKSk7CiAgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG9uUmVzdWx0OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgbG9naWNhbENhbWVyYSBjYXB0dXJlIHJlc3VsdCBjYWxsYmFjayEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZVJlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJlc3VsdChzdGF0aWNfY2FzdDxBQ2FtZXJhTWV0YWRhdGEqPihvYmouZ2V0KCkpKTsKKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5LCAmb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBwaHlzaWNhbCBjYXB0dXJlIHJlc3VsdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBwaHlzaWNhbFJlc3VsdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyo+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbFJlc3VsdC0+bVBoeXNpY2FsUmVzdWx0SW5mbzsKKworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPEFDYW1lcmFNZXRhZGF0YT4+IHBoeXNpY2FsTWV0YWRhdGFDb3B5OworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBoeXNpY2FsUmVzdWx0SW5mby5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBwaHlzaWNhbElkOChwaHlzaWNhbFJlc3VsdEluZm9baV0ubVBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMucHVzaF9iYWNrKHBoeXNpY2FsSWQ4LmNfc3RyKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBjbG9uZSA9IHBoeXNpY2FsUmVzdWx0SW5mb1tpXS5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lLnVwZGF0ZShBTkRST0lEX1NZTkNfRlJBTUVfTlVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5c2ljYWxSZXN1bHQtPm1GcmFtZU51bWJlciwgLypkYXRhX2NvdW50Ki8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gbWV0YWRhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQUNhbWVyYU1ldGFkYXRhKGNsb25lLnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVTVUxUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5LnB1c2hfYmFjayhtZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gcGh5c2ljYWxDYW1lcmFJZFB0cnM7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEFDYW1lcmFNZXRhZGF0YSo+IHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRyczsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdEluZm8uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRQdHJzLnB1c2hfYmFjayhwaHlzaWNhbENhbWVyYUlkc1tpXS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRycy5wdXNoX2JhY2socGh5c2ljYWxNZXRhZGF0YUNvcHlbaV0uZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwLCBtSWQpOworICAgICAgICAgICAgICAgICAgICAoKm9uUmVzdWx0KShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCByZXN1bHQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxSZXN1bHRJbmZvLnNpemUoKSwgcGh5c2ljYWxDYW1lcmFJZFB0cnMuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRycy5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25GYWlsOwpAQCAtMTA2OSw3ICsxMDg0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFDYXB0dXJlRmFpbHVyZSo+KG9iai5nZXQoKSkpOwogICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUqIGZhaWx1cmUgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFDYW1lcmFDYXB0dXJlRmFpbHVyZSo+KGZhaWx1cmVTcC5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCk7CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCwgbUlkKTsKICAgICAgICAgICAgICAgICAgICAgKCpvbkZhaWwpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIGZhaWx1cmUpOwogICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTExNDYsNyArMTE2MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3ApOworICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3AsIG1JZCk7CiAgICAgICAgICAgICAgICAgICAgICgqb25CdWZmZXJMb3N0KShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCBhbncsIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTU4LDEyICsxMTczLDM0IEBACiB9CiAKIENhbWVyYURldmljZTo6Q2FsbGJhY2tIb2xkZXI6OkNhbGxiYWNrSG9sZGVyKAotICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKLSAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCi0gICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicykgOgotICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtUmVxdWVzdHMocmVxdWVzdHMpLAotICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksIG1DYWxsYmFja3MoZmlsbENiKGNicykpIHt9CisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicykgOgorICAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwgbVJlcXVlc3RzKHJlcXVlc3RzKSwKKyAgICAgICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwKKyAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKGZhbHNlKSB7CisgICAgaW5pdENhcHR1cmVDYWxsYmFja3MoY2JzKTsKKworICAgIGlmIChjYnMgIT0gbnVsbHB0cikgeworICAgICAgICBtT25DYXB0dXJlQ29tcGxldGVkID0gY2JzLT5vbkNhcHR1cmVDb21wbGV0ZWQ7CisgICAgfQorfQorCitDYW1lcmFEZXZpY2U6OkNhbGxiYWNrSG9sZGVyOjpDYWxsYmFja0hvbGRlcigKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAorICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBsY2JzKSA6CisgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtUmVxdWVzdHMocmVxdWVzdHMpLAorICAgICAgICBtSXNSZXBlYXRpbmcoaXNSZXBlYXRpbmcpLAorICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2sodHJ1ZSkgeworICAgIGluaXRDYXB0dXJlQ2FsbGJhY2tzKGxjYnMpOworCisgICAgaWYgKGxjYnMgIT0gbnVsbHB0cikgeworICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCA9IGxjYnMtPm9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQ7CisgICAgfQorfQogCiB2b2lkCiBDYW1lcmFEZXZpY2U6OmNoZWNrUmVwZWF0aW5nU2VxdWVuY2VDb21wbGV0ZUxvY2tlZCgKQEAgLTExODAsOSArMTIxNyw5IEBACiAgICAgICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVyYXNlKGNiSXQpOwogICAgICAgICAvLyBzZW5kIHNlcSBhYm9ydGVkIGNhbGxiYWNrCiAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlU2VxQWJvcnQsIG1IYW5kbGVyKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBjYmgubVNlc3Npb24pOwotICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgY2JoLm1DYWxsYmFja3Mub25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkKTsKICAgICAgICAgbXNnLT5zZXRJbnQzMihrU2VxdWVuY2VJZEtleSwgc2VxdWVuY2VJZCk7CiAgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwogICAgIH0gZWxzZSB7CkBAIC0xMjMwLDkgKzEyNjcsOSBAQAogICAgICAgICAgICAgbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZXJhc2UoY2JJdCk7CiAgICAgICAgICAgICAvLyBzZW5kIHNlcSBjb21wbGV0ZSBjYWxsYmFjawogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVTZXFFbmQsIG1IYW5kbGVyKTsKLSAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CiAgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBjYmgubVNlc3Npb24pOwotICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBjYmgubU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkKTsKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoa1NlcXVlbmNlSWRLZXksIHNlcXVlbmNlSWQpOwogICAgICAgICAgICAgbXNnLT5zZXRJbnQ2NChrRnJhbWVOdW1iZXJLZXksIGxhc3RGcmFtZU51bWJlcik7CiAKQEAgLTEzODksNyArMTQyNiw3IEBACiAgICAgYXV0byBpdCA9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKICAgICBpZiAoaXQgIT0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgewogICAgICAgICBDYWxsYmFja0hvbGRlciBjYmggPSAoKml0KS5zZWNvbmQ7Ci0gICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgb25TdGFydCA9IGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgb25TdGFydCA9IGNiaC5tT25DYXB0dXJlU3RhcnRlZDsKICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOwogICAgICAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogcmVxdWVzdCBpbmRleCAlZCBvdXQgb2YgYm91bmQgKHNpemUgJXp1KSIsCkBAIC0xMzk4LDcgKzE0MzUsNyBAQAogICAgICAgICB9CiAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gY2JoLm1SZXF1ZXN0c1tidXJzdElkXTsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVTdGFydCwgZGV2LT5tSGFuZGxlcik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CiAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvblN0YXJ0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKQEAgLTE0MTMsNyArMTQ1MCw2IEBACiAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvcykgewotICAgICh2b2lkKSBwaHlzaWNhbFJlc3VsdEluZm9zOwogICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwogCiAgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKQEAgLTE0NDksOSArMTQ4NSw2IEBACiAgICAgYXV0byBpdCA9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKICAgICBpZiAoaXQgIT0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgewogICAgICAgICBDYWxsYmFja0hvbGRlciBjYmggPSAoKml0KS5zZWNvbmQ7Ci0gICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG9uUmVzdWx0ID0gaXNQYXJ0aWFsUmVzdWx0ID8KLSAgICAgICAgICAgICAgICBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVQcm9ncmVzc2VkIDoKLSAgICAgICAgICAgICAgICBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVDb21wbGV0ZWQ7CiAgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiA9IGNiaC5tU2Vzc2lvbjsKICAgICAgICAgaWYgKChzaXplX3QpIGJ1cnN0SWQgPj0gY2JoLm1SZXF1ZXN0cy5zaXplKCkpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IHJlcXVlc3QgaW5kZXggJWQgb3V0IG9mIGJvdW5kIChzaXplICV6dSkiLApAQCAtMTQ2MSwxMyArMTQ5NCwyNyBAQAogICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IGNiaC5tUmVxdWVzdHNbYnVyc3RJZF07CiAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gcmVzdWx0KG5ldyBBQ2FtZXJhTWV0YWRhdGEoCiAgICAgICAgICAgICAgICAgbWV0YWRhdGFDb3B5LnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVTVUxUKSk7CisgICAgICAgIHNwPEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBwaHlzaWNhbFJlc3VsdCgKKyAgICAgICAgICAgICAgICBuZXcgQUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8ocGh5c2ljYWxSZXN1bHRJbmZvcywgZnJhbWVOdW1iZXIpKTsKIAotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVJlc3VsdCwgZGV2LT5tSGFuZGxlcik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoCisgICAgICAgICAgICAgICAgY2JoLm1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayA/IGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQgOiBrV2hhdENhcHR1cmVSZXN1bHQsCisgICAgICAgICAgICAgICAgZGV2LT5tSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvblJlc3VsdCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVzdWx0S2V5LCByZXN1bHQpOworICAgICAgICBpZiAoaXNQYXJ0aWFsUmVzdWx0KSB7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopY2JoLm1PbkNhcHR1cmVQcm9ncmVzc2VkKTsKKyAgICAgICAgfSBlbHNlIGlmIChjYmgubUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKSB7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopY2JoLm1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtQaHlzaWNhbENhcHR1cmVSZXN1bHRLZXksIHBoeXNpY2FsUmVzdWx0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYmgubU9uQ2FwdHVyZUNvbXBsZXRlZCk7CisgICAgICAgIH0KICAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKICAgICB9CiAKQEAgLTE1MTMsNSArMTU2MCw1IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotCit9IC8vIG5hbWVzcGFjZSBhY2FtCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaAppbmRleCAxMzY5MTQ4Li4xMDNlZmQ1IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8YXRvbWljPgogI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KQEAgLTQxLDE0ICs0MiwyNSBAQAogI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CiAKIC8vIFdyYXAgQUNhbWVyYUNhcHR1cmVGYWlsdXJlIHNvIGl0IGNhbiBiZSByZWYtY291bnRlZAogc3RydWN0IENhbWVyYUNhcHR1cmVGYWlsdXJlIDogcHVibGljIFJlZkJhc2UsIHB1YmxpYyBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUge307CiAKKy8vIFdyYXAgUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyBzbyB0aGF0IGl0IGNhbiBiZSByZWYtY291bnRlZAorc3RydWN0IEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgQUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8oY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4mIGluZm8sCisgICAgICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyKSA6CisgICAgICAgIG1QaHlzaWNhbFJlc3VsdEluZm8oaW5mbyksIG1GcmFtZU51bWJlcihmcmFtZU51bWJlcikge30KKworICAgIHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IG1QaHlzaWNhbFJlc3VsdEluZm87CisgICAgaW50NjRfdCBtRnJhbWVOdW1iZXI7Cit9OworCiBjbGFzcyBDYW1lcmFEZXZpY2UgZmluYWwgOiBwdWJsaWMgUmVmQmFzZSB7CiAgIHB1YmxpYzoKICAgICBDYW1lcmFEZXZpY2UoY29uc3QgY2hhciogaWQsIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNiLAotICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMsCisgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzLAogICAgICAgICAgICAgICAgICAgQUNhbWVyYURldmljZSogd3JhcHBlcik7CiAgICAgfkNhbWVyYURldmljZSgpOwogCkBAIC01Niw2ICs2OCw3IEBACiAKICAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVJlcXVlc3QoCiAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFJZExpc3QqIHBoeXNpY2FsSWRMaXN0LAogICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdCkgY29uc3Q7CiAKICAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVNlc3Npb24oCkBAIC0xMDgsMTkgKzEyMSwyMiBAQAogICAgIGNhbWVyYV9zdGF0dXNfdCB3YWl0VW50aWxJZGxlTG9ja2VkKCk7CiAKIAorICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICAgY2FtZXJhX3N0YXR1c190IGNhcHR1cmVMb2NrZWQoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAotICAgICAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKICAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKIAorICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICAgY2FtZXJhX3N0YXR1c190IHNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKLSAgICAgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCiAgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAogICAgICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCk7CiAKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgIGNhbWVyYV9zdGF0dXNfdCBzdWJtaXRSZXF1ZXN0c0xvY2tlZCgKICAgICAgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKLSAgICAgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCiAgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAogICAgICAgICAgICAgLypvdXQqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQsCiAgICAgICAgICAgICBib29sIGlzUmVwZWF0aW5nKTsKQEAgLTEzMCw3ICsxNDYsOCBAQAogICAgIGNhbWVyYV9zdGF0dXNfdCBhbGxvY2F0ZUNhcHR1cmVSZXF1ZXN0KAogICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBzcDxDYXB0dXJlUmVxdWVzdD4mIG91dFJlcSk7CiAKLSAgICBzdGF0aWMgQUNhcHR1cmVSZXF1ZXN0KiBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4mIHJlcSk7CisgICAgc3RhdGljIEFDYXB0dXJlUmVxdWVzdCogYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+JiByZXEsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlSWQpOwogICAgIHN0YXRpYyB2b2lkIGZyZWVBQ2FwdHVyZVJlcXVlc3QoQUNhcHR1cmVSZXF1ZXN0Kik7CiAKICAgICAvLyBvbmx5IEZvciBzZXNzaW9uIHRvIGhvbGQgZGV2aWNlIGxvY2sKQEAgLTE1Niw3ICsxNzMsNyBAQAogICAgIG11dGFibGUgTXV0ZXggbURldmljZUxvY2s7CiAgICAgY29uc3QgU3RyaW5nOCBtQ2FtZXJhSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYW1lcmEgSUQKICAgICBjb25zdCBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzIG1BcHBDYWxsYmFja3M7IC8vIENhbGxiYWNrIHRvIGFwcAotICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxBQ2FtZXJhTWV0YWRhdGE+IG1DaGFyczsgICAgLy8gQ2FtZXJhIGNoYXJhY3RlcmlzdGljcworICAgIGNvbnN0IHNwPEFDYW1lcmFNZXRhZGF0YT4gbUNoYXJzOyAgICAgICAgICAgICAgICAgLy8gQ2FtZXJhIGNoYXJhY3RlcmlzdGljcwogICAgIGNvbnN0IHNwPFNlcnZpY2VDYWxsYmFjaz4gbVNlcnZpY2VDYWxsYmFjazsKICAgICBBQ2FtZXJhRGV2aWNlKiBtV3JhcHBlcjsKIApAQCAtMTkxLDYgKzIwOCw3IEBACiAgICAgICAgIC8vIENhcHR1cmUgY2FsbGJhY2tzCiAgICAgICAgIGtXaGF0Q2FwdHVyZVN0YXJ0LCAgICAgLy8gb25DYXB0dXJlU3RhcnRlZAogICAgICAgICBrV2hhdENhcHR1cmVSZXN1bHQsICAgIC8vIG9uQ2FwdHVyZVByb2dyZXNzZWQsIG9uQ2FwdHVyZUNvbXBsZXRlZAorICAgICAgICBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0LCAvLyBvbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkCiAgICAgICAgIGtXaGF0Q2FwdHVyZUZhaWwsICAgICAgLy8gb25DYXB0dXJlRmFpbGVkCiAgICAgICAgIGtXaGF0Q2FwdHVyZVNlcUVuZCwgICAgLy8gb25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQKICAgICAgICAga1doYXRDYXB0dXJlU2VxQWJvcnQsICAvLyBvbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQKQEAgLTIwNiw2ICsyMjQsNyBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FwdHVyZVJlcXVlc3RLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtUaW1lU3RhbXBLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlUmVzdWx0S2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5OwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FwdHVyZUZhaWx1cmVLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtTZXF1ZW5jZUlkS2V5OwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrRnJhbWVOdW1iZXJLZXk7CkBAIC0yMTMsOSArMjMyLDExIEBACiAKICAgICBjbGFzcyBDYWxsYmFja0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBDYWxsYmFja0hhbmRsZXIoY29uc3QgY2hhciogaWQpOwogICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKIAogICAgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcgbUlkOwogICAgICAgICAvLyBUaGlzIGhhbmRsZXIgd2lsbCBjYWNoZSBhbGwgY2FwdHVyZSBzZXNzaW9uIHNwIHVudGlsIGtXaGF0Q2xlYW5VcFNlc3Npb25zCiAgICAgICAgIC8vIGlzIHByb2Nlc3NlZC4gVGhpcyBpcyB1c2VkIHRvIGd1YXJhbnRlZSB0aGUgbGFzdCBzZXNzaW9uIHJlZmVyZW5jZSBpcyBhbHdheXMKICAgICAgICAgLy8gYmVpbmcgcmVtb3ZlZCBpbiBjYWxsYmFjayB0aHJlYWQgd2l0aG91dCBob2xkaW5nIGNhbWVyYSBkZXZpY2UgbG9jawpAQCAtMjQ0LDE5ICsyNjUsNDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKICAgICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicyk7CisgICAgICAgIENhbGxiYWNrSG9sZGVyKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyogbGNicyk7CiAKLSAgICAgICAgc3RhdGljIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzIGZpbGxDYigKLSAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzKSB7CisgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgICAgICB2b2lkIGluaXRDYXB0dXJlQ2FsbGJhY2tzKFQqIGNicykgeworICAgICAgICAgICAgbUNvbnRleHQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVN0YXJ0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVByb2dyZXNzZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlRmFpbGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVCdWZmZXJMb3N0ID0gbnVsbHB0cjsKICAgICAgICAgICAgIGlmIChjYnMgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIHJldHVybiAqY2JzOworICAgICAgICAgICAgICAgIG1Db250ZXh0ID0gY2JzLT5jb250ZXh0OworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTdGFydGVkID0gY2JzLT5vbkNhcHR1cmVTdGFydGVkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVQcm9ncmVzc2VkID0gY2JzLT5vbkNhcHR1cmVQcm9ncmVzc2VkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVGYWlsZWQgPSBjYnMtPm9uQ2FwdHVyZUZhaWxlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQgPSBjYnMtPm9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQgPSBjYnMtPm9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlQnVmZmVyTG9zdCA9IGNicy0+b25DYXB0dXJlQnVmZmVyTG9zdDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB7IG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIgfTsKICAgICAgICAgfQotCiAgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICBtU2Vzc2lvbjsKICAgICAgICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+IG1SZXF1ZXN0czsKICAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc1JlcGVhdGluZzsKLSAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MgbUNhbGxiYWNrczsKKyAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjazsKKworICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgbU9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkNhcHR1cmVQcm9ncmVzc2VkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25DYXB0dXJlQ29tcGxldGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2ZhaWxlZCBtT25DYXB0dXJlRmFpbGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlRW5kIG1PbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUFib3J0IG1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfYnVmZmVyTG9zdCBtT25DYXB0dXJlQnVmZmVyTG9zdDsKICAgICB9OwogICAgIC8vIHNlcXVlbmNlIGlkIC0+IGNhbGxiYWNrcyBtYXAKICAgICBzdGQ6Om1hcDxpbnQsIENhbGxiYWNrSG9sZGVyPiBtU2VxdWVuY2VDYWxsYmFja01hcDsKQEAgLTI4Myw5ICszMzEsMTEgQEAKICAgICAvLyBNaXNjIHZhcmlhYmxlcwogICAgIGludDMyX3QgbVNoYWRpbmdNYXBTaXplWzJdOyAgIC8vIGNvbnN0IGFmdGVyIGNvbnN0cnVjdG9yCiAgICAgaW50MzJfdCBtUGFydGlhbFJlc3VsdENvdW50OyAgLy8gY29uc3QgYWZ0ZXIgY29uc3RydWN0b3IKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVBoeXNpY2FsSWRzOyAvLyBjb25zdCBhZnRlciBjb25zdHJ1Y3RvcgogCiB9OwogCit9IC8vIG5hbWVzcGFjZSBhY2FtOwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogLyoqCkBAIC0yOTQsOCArMzQ0LDggQEAKICAqLwogc3RydWN0IEFDYW1lcmFEZXZpY2UgewogICAgIEFDYW1lcmFEZXZpY2UoY29uc3QgY2hhciogaWQsIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNiLAotICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMpIDoKLSAgICAgICAgICAgIG1EZXZpY2UobmV3IENhbWVyYURldmljZShpZCwgY2IsIHN0ZDo6bW92ZShjaGFycyksIHRoaXMpKSB7fQorICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFycykgOgorICAgICAgICAgICAgbURldmljZShuZXcgYW5kcm9pZDo6YWNhbTo6Q2FtZXJhRGV2aWNlKGlkLCBjYiwgY2hhcnMsIHRoaXMpKSB7fQogCiAgICAgfkFDYW1lcmFEZXZpY2UoKSB7fTsKIApAQCAtMzA2LDggKzM1Niw5IEBACiAKICAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVJlcXVlc3QoCiAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFJZExpc3QqIHBoeXNpY2FsQ2FtZXJhSWRMaXN0LAogICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdCkgY29uc3QgewotICAgICAgICByZXR1cm4gbURldmljZS0+Y3JlYXRlQ2FwdHVyZVJlcXVlc3QodGVtcGxhdGVJZCwgcmVxdWVzdCk7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5jcmVhdGVDYXB0dXJlUmVxdWVzdCh0ZW1wbGF0ZUlkLCBwaHlzaWNhbENhbWVyYUlkTGlzdCwgcmVxdWVzdCk7CiAgICAgfQogCiAgICAgY2FtZXJhX3N0YXR1c190IGNyZWF0ZUNhcHR1cmVTZXNzaW9uKApAQCAtMzMxLDcgKzM4Miw3IEBACiAgICAgfQogCiAgIHByaXZhdGU6Ci0gICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6Q2FtZXJhRGV2aWNlPiBtRGV2aWNlOworICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZT4gbURldmljZTsKIH07CiAKICNlbmRpZiAvLyBfQUNBTUVSQV9ERVZJQ0VfSApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaW5jIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYzUzNTIKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5pbmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSAiQUNhbWVyYURldmljZS5oIgorI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgIkFDYXB0dXJlUmVxdWVzdC5oIgorI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Y2FwdHVyZUxvY2tlZCgKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL2ZhbHNlKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpzZXRSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL3RydWUpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190IENhbWVyYURldmljZTo6c3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkLAorICAgICAgICBib29sIGlzUmVwZWF0aW5nKSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN1Ym1pdCBjYXB0dXJlIHJlcXVlc3QgZmFpbGVkISByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIEZvcm0gdHdvIHZlY3RvcnMgb2YgY2FwdHVyZSByZXF1ZXN0LCBvbmUgZm9yIGludGVybmFsIHRyYWNraW5nCisgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OmNhbWVyYTI6OkNhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0TGlzdDsKKyAgICBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gcmVxdWVzdHNWOworICAgIHJlcXVlc3RzVi5zZXRDYXBhY2l0eShudW1SZXF1ZXN0cyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZXF1ZXN0czsgaSsrKSB7CisgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXE7CisgICAgICAgIHJldCA9IGFsbG9jYXRlQ2FwdHVyZVJlcXVlc3QocmVxdWVzdHNbaV0sIHJlcSk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkNvbnZlcnQgY2FwdHVyZSByZXF1ZXN0IHRvIGludGVybmFsIGZvcm1hdCBmYWlsdXJlISByZXQgJWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVxLT5tU3VyZmFjZUxpc3QuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0UoIkNhcHR1cmUgcmVxdWVzdCB3aXRob3V0IG91dHB1dCB0YXJnZXQgY2Fubm90IGJlIHN1Ym1pdHRlZCEiKTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICB9CisgICAgICAgIHJlcXVlc3RMaXN0LnB1c2hfYmFjaygqKHJlcS5nZXQoKSkpOworICAgICAgICByZXF1ZXN0c1YucHVzaF9iYWNrKHJlcSk7CisgICAgfQorCisgICAgaWYgKGlzUmVwZWF0aW5nKSB7CisgICAgICAgIHJldCA9IHN0b3BSZXBlYXRpbmdMb2NrZWQoKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN0b3AgcmVwZWF0aW5nIGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiaW5kZXI6OlN0YXR1cyByZW1vdGVSZXQ7CisgICAgaGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpTdWJtaXRJbmZvIGluZm87CisgICAgcmVtb3RlUmV0ID0gbVJlbW90ZS0+c3VibWl0UmVxdWVzdExpc3QocmVxdWVzdExpc3QsIGlzUmVwZWF0aW5nLCAmaW5mbyk7CisgICAgaW50IHNlcXVlbmNlSWQgPSBpbmZvLm1SZXF1ZXN0SWQ7CisgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIgPSBpbmZvLm1MYXN0RnJhbWVOdW1iZXI7CisgICAgaWYgKHNlcXVlbmNlSWQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgc3VibWl0IHJlcXVlc3QgcmVtb3RlIGZhaWx1cmU6IHJldCAlZCIsIGdldElkKCksIHNlcXVlbmNlSWQpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIENhbGxiYWNrSG9sZGVyIGNiSG9sZGVyKHNlc3Npb24sIHJlcXVlc3RzViwgaXNSZXBlYXRpbmcsIGNicyk7CisgICAgbVNlcXVlbmNlQ2FsbGJhY2tNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHNlcXVlbmNlSWQsIGNiSG9sZGVyKSk7CisKKyAgICBpZiAoaXNSZXBlYXRpbmcpIHsKKyAgICAgICAgLy8gc3RvcFJlcGVhdGluZyBhYm92ZSBzaG91bGQgaGF2ZSBjbGVhbnVwIHJlcGVhdGluZyBzZXF1ZW5jZSBpZAorICAgICAgICBpZiAobVJlcGVhdGluZ1NlcXVlbmNlSWQgIT0gUkVRVUVTVF9JRF9OT05FKSB7CisgICAgICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRTsKKyAgICAgICAgfQorICAgICAgICBtUmVwZWF0aW5nU2VxdWVuY2VJZCA9IHNlcXVlbmNlSWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpKTsKKyAgICB9CisKKyAgICBpZiAobUlkbGUpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25TdGF0ZUNiLCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2suY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2sub25BY3RpdmUpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICB9CisgICAgbUlkbGUgPSBmYWxzZTsKKyAgICBtQnVzeVNlc3Npb24gPSBzZXNzaW9uOworCisgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IHNlcXVlbmNlSWQ7CisgICAgfQorICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCit9IC8vIG5hbWVzcGFjZSBhY2FtCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcAppbmRleCBjNTlkMGU3Li45ZDQwZmQ3IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKQEAgLTI2LDkgKzI2LDEwIEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YWNhbTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0gewogLy8gU3RhdGljIG1lbWJlciBkZWZpbml0aW9ucwogY29uc3QgY2hhciogQ2FtZXJhTWFuYWdlckdsb2JhbDo6a0NhbWVyYUlkS2V5ICAgPSAiQ2FtZXJhSWQiOwogY29uc3QgY2hhciogQ2FtZXJhTWFuYWdlckdsb2JhbDo6a0NhbGxiYWNrRnBLZXkgPSAiQ2FsbGJhY2tGcCI7CkBAIC0xOTIsNiArMTkzLDIwIEBACiAgICAgfQogfQogCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OnJlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBDYWxsYmFjayBjYihjYWxsYmFjayk7CisgICAgbUNhbGxiYWNrcy5pbnNlcnQoY2IpOworfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OnVucmVnaXN0ZXJFeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIENhbGxiYWNrIGNiKGNhbGxiYWNrKTsKKyAgICBtQ2FsbGJhY2tzLmVyYXNlKGNiKTsKK30KKwogdm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpyZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrKAogICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTI4OCwxMiArMzAzLDQwIEBACiAgICAgICAgICAgICAoKmNiKShjb250ZXh0LCBjYW1lcmFJZC5jX3N0cigpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTZW5kU2luZ2xlQWNjZXNzQ2FsbGJhY2s6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0FjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkQ2FsbGJhY2sgY2I7CisgICAgICAgICAgICB2b2lkKiBjb250ZXh0OworICAgICAgICAgICAgQVN0cmluZyBjYW1lcmFJZDsKKyAgICAgICAgICAgIGJvb2wgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmY2IpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FtZXJhIGNhbGxiYWNrIGZwISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDb250ZXh0S2V5LCAmY29udGV4dCk7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYWxsYmFjayBjb250ZXh0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpjYikoY29udGV4dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIiVzOiB1bmtub3duIG1lc3NhZ2UgdHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgbXNnLT53aGF0KCkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogfQogCitiaW5kZXI6OlN0YXR1cyBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6Om9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQoKSB7CisgICAgc3A8Q2FtZXJhTWFuYWdlckdsb2JhbD4gY20gPSBtQ2FtZXJhTWFuYWdlci5wcm9tb3RlKCk7CisgICAgaWYgKGNtICE9IG51bGxwdHIpIHsKKyAgICAgICAgY20tPm9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGRlbGl2ZXIgY2FtZXJhIGFjY2VzcyBwcmlvcml0eSBjYWxsYmFjay4gR2xvYmFsIGNhbWVyYSBtYW5hZ2VyIGRpZWQiKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCiBiaW5kZXI6OlN0YXR1cyBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6Om9uU3RhdHVzQ2hhbmdlZCgKICAgICAgICAgaW50MzJfdCBzdGF0dXMsIGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCkgewogICAgIHNwPENhbWVyYU1hbmFnZXJHbG9iYWw+IGNtID0gbUNhbWVyYU1hbmFnZXIucHJvbW90ZSgpOwpAQCAtMzA1LDYgKzM0OCwxOSBAQAogICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKIH0KIAordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpvbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChhdXRvIGNiIDogbUNhbGxiYWNrcykgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZFNpbmdsZUFjY2Vzc0NhbGxiYWNrLCBtSGFuZGxlcik7CisgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0FjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkQ2FsbGJhY2sgY2JGcCA9IGNiLm1BY2Nlc3NQcmlvcml0eUNoYW5nZWQ7CisgICAgICAgIGlmIChjYkZwICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQgKikgY2JGcCk7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiLm1Db250ZXh0KTsKKyAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICB9CisgICAgfQorfQorCiB2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6Om9uU3RhdHVzQ2hhbmdlZCgKICAgICAgICAgaW50MzJfdCBzdGF0dXMsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTM0NSw2ICs0MDEsNyBAQAogICAgIH0KIH0KIAorfSAvLyBuYW1lc3BhY2UgYWNhbQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAvKioKQEAgLTQwMiw3ICs0NTksNyBAQAogfQogCiBjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU1hbmFnZXI6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKLSAgICAgICAgY29uc3QgY2hhciAqY2FtZXJhSWRTdHIsIEFDYW1lcmFNZXRhZGF0YSAqKmNoYXJhY3RlcmlzdGljcykgeworICAgICAgICBjb25zdCBjaGFyKiBjYW1lcmFJZFN0ciwgc3A8QUNhbWVyYU1ldGFkYXRhPiogY2hhcmFjdGVyaXN0aWNzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAogICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZT4gY3MgPSBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpLmdldENhbWVyYVNlcnZpY2UoKTsKQEAgLTQzNywxOCArNDk0LDE2IEBACiAgICAgICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkLAogICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFjaywKICAgICAgICAgLypvdXQqL0FDYW1lcmFEZXZpY2UqKiBvdXREZXZpY2UpIHsKLSAgICBBQ2FtZXJhTWV0YWRhdGEqIHJhd0NoYXJzOwotICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWQsICZyYXdDaGFycyk7CisgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFyczsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkLCAmY2hhcnMpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CiAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBjYW1lcmEgJXMuIGVyciAlZCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwgcmV0KTsKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgfQotICAgIHN0ZDo6dW5pcXVlX3B0cjxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzKHJhd0NoYXJzKTsKLSAgICByYXdDaGFycyA9IG51bGxwdHI7CiAKLSAgICBBQ2FtZXJhRGV2aWNlKiBkZXZpY2UgPSBuZXcgQUNhbWVyYURldmljZShjYW1lcmFJZCwgY2FsbGJhY2ssIHN0ZDo6bW92ZShjaGFycykpOworICAgIEFDYW1lcmFEZXZpY2UqIGRldmljZSA9IG5ldyBBQ2FtZXJhRGV2aWNlKGNhbWVyYUlkLCBjYWxsYmFjaywgY2hhcnMpOwogCiAgICAgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlPiBjcyA9IENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkuZ2V0Q2FtZXJhU2VydmljZSgpOwogICAgIGlmIChjcyA9PSBudWxscHRyKSB7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCmluZGV4IGNjNDJmNzcuLjhjMWRhMzYgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bWFwPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CiAKIC8qKgogICogUGVyLXByb2Nlc3Mgc2luZ2xldG9uIGluc3RhbmNlIG9mIENhbWVyYU1hbmdlci4gU2hhcmVkIGJ5IGFsbCBBQ2FtZXJhTWFuYWdlcgpAQCAtNTMsNiArNTQsMTEgQEAKICAgICB2b2lkIHVucmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjaygKICAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spOwogCisgICAgdm9pZCByZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyogY2FsbGJhY2spOworICAgIHZvaWQgdW5yZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyogY2FsbGJhY2spOworCiAgICAgLyoqCiAgICAgICogUmV0dXJuIGNhbWVyYSBJRHMgdGhhdCBzdXBwb3J0IGNhbWVyYTIKICAgICAgKi8KQEAgLTg1LDYgKzkxLDggQEAKICAgICAgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICAgICAgfQogCisgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCgpOworCiAgICAgICBwcml2YXRlOgogICAgICAgICBjb25zdCB3cDxDYW1lcmFNYW5hZ2VyR2xvYmFsPiBtQ2FtZXJhTWFuYWdlcjsKICAgICB9OwpAQCAtOTUsMTEgKzEwMywxOSBAQAogICAgICAgICBleHBsaWNpdCBDYWxsYmFjayhjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSA6CiAgICAgICAgICAgICBtQXZhaWxhYmxlKGNhbGxiYWNrLT5vbkNhbWVyYUF2YWlsYWJsZSksCiAgICAgICAgICAgICBtVW5hdmFpbGFibGUoY2FsbGJhY2stPm9uQ2FtZXJhVW5hdmFpbGFibGUpLAorICAgICAgICAgICAgbUFjY2Vzc1ByaW9yaXR5Q2hhbmdlZChudWxscHRyKSwKICAgICAgICAgICAgIG1Db250ZXh0KGNhbGxiYWNrLT5jb250ZXh0KSB7fQogCisgICAgICAgIGV4cGxpY2l0IENhbGxiYWNrKGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjaykgOgorICAgICAgICAgICAgbUF2YWlsYWJsZShjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLm9uQ2FtZXJhQXZhaWxhYmxlKSwKKyAgICAgICAgICAgIG1VbmF2YWlsYWJsZShjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLm9uQ2FtZXJhVW5hdmFpbGFibGUpLAorICAgICAgICAgICAgbUFjY2Vzc1ByaW9yaXR5Q2hhbmdlZChjYWxsYmFjay0+b25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCksCisgICAgICAgICAgICBtQ29udGV4dChjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLmNvbnRleHQpIHt9CisKICAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CiAgICAgICAgICAgICByZXR1cm4gKG1BdmFpbGFibGUgPT0gb3RoZXIubUF2YWlsYWJsZSAmJgogICAgICAgICAgICAgICAgICAgICBtVW5hdmFpbGFibGUgPT0gb3RoZXIubVVuYXZhaWxhYmxlICYmCisgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NQcmlvcml0eUNoYW5nZWQgPT0gb3RoZXIubUFjY2Vzc1ByaW9yaXR5Q2hhbmdlZCAmJgogICAgICAgICAgICAgICAgICAgICBtQ29udGV4dCA9PSBvdGhlci5tQ29udGV4dCk7CiAgICAgICAgIH0KICAgICAgICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CkBAIC0xMDgsNiArMTI0LDkgQEAKICAgICAgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgaWYgKG1Db250ZXh0ICE9IG90aGVyLm1Db250ZXh0KSByZXR1cm4gbUNvbnRleHQgPCBvdGhlci5tQ29udGV4dDsKKyAgICAgICAgICAgIGlmIChtQWNjZXNzUHJpb3JpdHlDaGFuZ2VkICE9IG90aGVyLm1BY2Nlc3NQcmlvcml0eUNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUFjY2Vzc1ByaW9yaXR5Q2hhbmdlZCA8IG90aGVyLm1BY2Nlc3NQcmlvcml0eUNoYW5nZWQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobUF2YWlsYWJsZSAhPSBvdGhlci5tQXZhaWxhYmxlKSByZXR1cm4gbUF2YWlsYWJsZSA8IG90aGVyLm1BdmFpbGFibGU7CiAgICAgICAgICAgICByZXR1cm4gbVVuYXZhaWxhYmxlIDwgb3RoZXIubVVuYXZhaWxhYmxlOwogICAgICAgICB9CkBAIC0xMTYsMTMgKzEzNSwxNSBAQAogICAgICAgICB9CiAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIG1BdmFpbGFibGU7CiAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIG1VbmF2YWlsYWJsZTsKKyAgICAgICAgQUNhbWVyYU1hbmFnZXJfQWNjZXNzUHJpb3JpdGllc0NoYW5nZWRDYWxsYmFjayBtQWNjZXNzUHJpb3JpdHlDaGFuZ2VkOwogICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dDsKICAgICB9OwogICAgIHN0ZDo6c2V0PENhbGxiYWNrPiBtQ2FsbGJhY2tzOwogCiAgICAgLy8gZGVmaW5pdGlvbiBvZiBoYW5kbGVyIGFuZCBtZXNzYWdlCiAgICAgZW51bSB7Ci0gICAgICAgIGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrCisgICAgICAgIGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrLAorICAgICAgICBrV2hhdFNlbmRTaW5nbGVBY2Nlc3NDYWxsYmFjaywKICAgICB9OwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FtZXJhSWRLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYWxsYmFja0ZwS2V5OwpAQCAtMTM1LDYgKzE1Niw3IEBACiAgICAgc3A8Q2FsbGJhY2tIYW5kbGVyPiBtSGFuZGxlcjsKICAgICBzcDxBTG9vcGVyPiAgICAgICAgIG1DYkxvb3BlcjsgLy8gTG9vcGVyIHRocmVhZCB3aGVyZSBjYWxsYmFja3MgYWN0dWFsbHkgaGFwcGVuIG9uCiAKKyAgICB2b2lkIG9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQoKTsKICAgICB2b2lkIG9uU3RhdHVzQ2hhbmdlZChpbnQzMl90IHN0YXR1cywgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpOwogICAgIHZvaWQgb25TdGF0dXNDaGFuZ2VkTG9ja2VkKGludDMyX3Qgc3RhdHVzLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCk7CiAgICAgLy8gVXRpbHMgZm9yIHN0YXR1cwpAQCAtMTcyLDYgKzE5NCw3IEBACiAgICAgfkNhbWVyYU1hbmFnZXJHbG9iYWwoKTsKIH07CiAKK30gLy8gbmFtZXNwYWNlIGFjYW07CiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOwogCiAvKioKQEAgLTE4MCwxMyArMjAzLDEzIEBACiAgKi8KIHN0cnVjdCBBQ2FtZXJhTWFuYWdlciB7CiAgICAgQUNhbWVyYU1hbmFnZXIoKSA6Ci0gICAgICAgICAgICBtR2xvYmFsTWFuYWdlcigmKGFuZHJvaWQ6OkNhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkpKSB7fQorICAgICAgICAgICAgbUdsb2JhbE1hbmFnZXIoJihhbmRyb2lkOjphY2FtOjpDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpKSkge30KICAgICB+QUNhbWVyYU1hbmFnZXIoKTsKICAgICBjYW1lcmFfc3RhdHVzX3QgZ2V0Q2FtZXJhSWRMaXN0KEFDYW1lcmFJZExpc3QqKiBjYW1lcmFJZExpc3QpOwogICAgIHN0YXRpYyB2b2lkICAgICBkZWxldGVDYW1lcmFJZExpc3QoQUNhbWVyYUlkTGlzdCogY2FtZXJhSWRMaXN0KTsKIAogICAgIGNhbWVyYV9zdGF0dXNfdCBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpjYW1lcmFJZCwgQUNhbWVyYU1ldGFkYXRhICoqY2hhcmFjdGVyaXN0aWNzKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkLCBhbmRyb2lkOjpzcDxBQ2FtZXJhTWV0YWRhdGE+KiBjaGFyYWN0ZXJpc3RpY3MpOwogICAgIGNhbWVyYV9zdGF0dXNfdCBvcGVuQ2FtZXJhKGNvbnN0IGNoYXIqIGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9BQ2FtZXJhRGV2aWNlKiogZGV2aWNlKTsKQEAgLTE5Niw3ICsyMTksNyBAQAogICAgICAgICBrQ2FtZXJhSWRMaXN0Tm90SW5pdCA9IC0xCiAgICAgfTsKICAgICBhbmRyb2lkOjpNdXRleCAgICAgICAgIG1Mb2NrOwotICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkNhbWVyYU1hbmFnZXJHbG9iYWw+IG1HbG9iYWxNYW5hZ2VyOworICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmFjYW06OkNhbWVyYU1hbmFnZXJHbG9iYWw+IG1HbG9iYWxNYW5hZ2VyOwogfTsKIAogI2VuZGlmIC8vX0FDQU1FUkFfTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwCmluZGV4IDlkMzQxYWUuLmQ4MzJkZWIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwCkBAIC0zNiw2ICszNiwxMCBAQAogICAgICAgICBmaWx0ZXJEdXJhdGlvbnMoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUyk7CiAgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TKTsKICAgICAgICAgZmlsdGVyRHVyYXRpb25zKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUQUxMX0RVUkFUSU9OUyk7CisgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfTUlOX0ZSQU1FX0RVUkFUSU9OUyk7CisgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RBTExfRFVSQVRJT05TKTsKKyAgICAgICAgZmlsdGVyRHVyYXRpb25zKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUyk7CisgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUQUxMX0RVUkFUSU9OUyk7CiAgICAgfQogICAgIC8vIFRPRE86IGZpbHRlciByZXF1ZXN0L3Jlc3VsdCBrZXlzCiB9CkBAIC01MCw2ICs1NCw3IEBACiAgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfUkVBRF9TRU5TT1JfU0VUVElOR1M6CiAgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQlVSU1RfQ0FQVFVSRToKICAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19ERVBUSF9PVVRQVVQ6CisgICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTE9HSUNBTF9NVUxUSV9DQU1FUkE6CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19ZVVZfUkVQUk9DRVNTSU5HOgogICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1BSSVZBVEVfUkVQUk9DRVNTSU5HOgpAQCAtNzksMTEgKzg0LDQyIEBACiAgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5LmRhdGEudThbaV07CiAgICAgICAgIGlmIChpc05ka1N1cHBvcnRlZENhcGFiaWxpdHkoY2FwYWJpbGl0eSkpIHsKICAgICAgICAgICAgIGNhcGFiaWxpdGllcy5wdXNoKGNhcGFiaWxpdHkpOworCisgICAgICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19MT0dJQ0FMX01VTFRJX0NBTUVSQSkgeworICAgICAgICAgICAgICAgIGRlcml2ZVBoeXNpY2FsQ2FtZXJhSWRzKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgbURhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTLCBjYXBhYmlsaXRpZXMpOwogfQogCit2b2lkCitBQ2FtZXJhTWV0YWRhdGE6OmRlcml2ZVBoeXNpY2FsQ2FtZXJhSWRzKCkgeworICAgIEFDYW1lcmFNZXRhZGF0YV9jb25zdF9lbnRyeSBlbnRyeTsKKyAgICBhdXRvIHJldCA9IGdldENvbnN0RW50cnkoQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9QSFlTSUNBTF9JRFMsICZlbnRyeSk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCIlczogR2V0IEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfUEhZU0lDQUxfSURTIGtleSBmYWlsZWQuIHJldCAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCogaWRzID0gZW50cnkuZGF0YS51ODsKKyAgICBzaXplX3Qgc3RhcnQgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7ICsraSkgeworICAgICAgICBpZiAoaWRzW2ldID09ICdcMCcpIHsKKyAgICAgICAgICAgIGlmIChzdGFydCAhPSBpKSB7CisgICAgICAgICAgICAgICAgbVN0YXRpY1BoeXNpY2FsQ2FtZXJhSWRWYWx1ZXMucHVzaF9iYWNrKFN0cmluZzgoKGNvbnN0IGNoYXIgKilpZHMrc3RhcnQpKTsKKyAgICAgICAgICAgICAgICBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMucHVzaF9iYWNrKG1TdGF0aWNQaHlzaWNhbENhbWVyYUlkVmFsdWVzLmJhY2soKS5zdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGFydCA9IGkrMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMuc2l6ZSgpIDwgMikgeworICAgICAgICBBTE9HVygiJXM6IExvZ2ljYWwgbXVsdGktY2FtZXJhIGRldmljZSBvbmx5IGhhcyAlenUgcGh5c2ljYWwgY2FtZXJhcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMuc2l6ZSgpKTsKKyAgICB9Cit9CiAKIHZvaWQKIEFDYW1lcmFNZXRhZGF0YTo6ZmlsdGVyRHVyYXRpb25zKHVpbnQzMl90IHRhZykgewpAQCAtMTQyLDYgKzE3OCwyNiBAQAogICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZHVyYXRpb24pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX01JTl9GUkFNRV9EVVJBVElPTlM6CisgICAgICAgICAgICBjYXNlIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVEFMTF9EVVJBVElPTlM6CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9IRUlDOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhkdXJhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlM6CisgICAgICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TOgorICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFJTUFHRV9GT1JNQVRfREVQVEhfSlBFRzsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayh3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZHVyYXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCByZWFjaCBoZXJlCiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmtvd24gdGFnIDB4JXgiLCBfX0ZVTkNUSU9OX18sIHRhZyk7CkBAIC0yMjgsNiArMjg0LDU2IEBACiAgICAgICAgICAgICAgICAgZmlsdGVyZWREZXB0aFN0cmVhbUNvbmZpZ3MpOwogICAgIH0KIAorICAgIGVudHJ5ID0gbURhdGEuZmluZChBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKyAgICBWZWN0b3I8aW50MzJfdD4gZmlsdGVyZWRIZWljU3RyZWFtQ29uZmlnczsKKyAgICBmaWx0ZXJlZEhlaWNTdHJlYW1Db25maWdzLnNldENhcGFjaXR5KGVudHJ5LmNvdW50KTsKKworICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGVudHJ5LmNvdW50OyBpICs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICAgICAgaW50MzJfdCBmb3JtYXQgPSBlbnRyeS5kYXRhLmkzMltpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IHdpZHRoID0gZW50cnkuZGF0YS5pMzJbaSArIFNUUkVBTV9XSURUSF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IGhlaWdodCA9IGVudHJ5LmRhdGEuaTMyW2kgKyBTVFJFQU1fSEVJR0hUX09GRlNFVF07CisgICAgICAgIGludDMyX3QgaXNJbnB1dCA9IGVudHJ5LmRhdGEuaTMyW2kgKyBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUXTsKKyAgICAgICAgaWYgKGlzSW5wdXQgPT0gQUNBTUVSQV9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OU19JTlBVVCkgeworICAgICAgICAgICAgLy8gSGlkZSBpbnB1dCBzdHJlYW1zCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBUcmFuc2xhdGUgSEFMIGZvcm1hdHMgdG8gTkRLIGZvcm1hdAorICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICAgICAgZm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9IRUlDOworICAgICAgICB9CisKKyAgICAgICAgZmlsdGVyZWRIZWljU3RyZWFtQ29uZmlncy5wdXNoX2JhY2soZm9ybWF0KTsKKyAgICAgICAgZmlsdGVyZWRIZWljU3RyZWFtQ29uZmlncy5wdXNoX2JhY2sod2lkdGgpOworICAgICAgICBmaWx0ZXJlZEhlaWNTdHJlYW1Db25maWdzLnB1c2hfYmFjayhoZWlnaHQpOworICAgICAgICBmaWx0ZXJlZEhlaWNTdHJlYW1Db25maWdzLnB1c2hfYmFjayhpc0lucHV0KTsKKyAgICB9CisgICAgbURhdGEudXBkYXRlKEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlMsIGZpbHRlcmVkSGVpY1N0cmVhbUNvbmZpZ3MpOworCisgICAgZW50cnkgPSBtRGF0YS5maW5kKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKyAgICBWZWN0b3I8aW50MzJfdD4gZmlsdGVyZWREeW5hbWljRGVwdGhTdHJlYW1Db25maWdzOworICAgIGZpbHRlcmVkRHluYW1pY0RlcHRoU3RyZWFtQ29uZmlncy5zZXRDYXBhY2l0eShlbnRyeS5jb3VudCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpICs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICAgICAgaW50MzJfdCBmb3JtYXQgPSBlbnRyeS5kYXRhLmkzMltpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IHdpZHRoID0gZW50cnkuZGF0YS5pMzJbaSArIFNUUkVBTV9XSURUSF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IGhlaWdodCA9IGVudHJ5LmRhdGEuaTMyW2kgKyBTVFJFQU1fSEVJR0hUX09GRlNFVF07CisgICAgICAgIGludDMyX3QgaXNJbnB1dCA9IGVudHJ5LmRhdGEuaTMyW2kgKyBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUXTsKKyAgICAgICAgaWYgKGlzSW5wdXQgPT0gQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfSU5QVVQpIHsKKyAgICAgICAgICAgIC8vIEhpZGUgaW5wdXQgc3RyZWFtcworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gVHJhbnNsYXRlIEhBTCBmb3JtYXRzIHRvIE5ESyBmb3JtYXQKKyAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IEFJTUFHRV9GT1JNQVRfREVQVEhfSlBFRzsKKyAgICAgICAgfQorCisgICAgICAgIGZpbHRlcmVkRHluYW1pY0RlcHRoU3RyZWFtQ29uZmlncy5wdXNoX2JhY2soZm9ybWF0KTsKKyAgICAgICAgZmlsdGVyZWREeW5hbWljRGVwdGhTdHJlYW1Db25maWdzLnB1c2hfYmFjayh3aWR0aCk7CisgICAgICAgIGZpbHRlcmVkRHluYW1pY0RlcHRoU3RyZWFtQ29uZmlncy5wdXNoX2JhY2soaGVpZ2h0KTsKKyAgICAgICAgZmlsdGVyZWREeW5hbWljRGVwdGhTdHJlYW1Db25maWdzLnB1c2hfYmFjayhpc0lucHV0KTsKKyAgICB9CisgICAgbURhdGEudXBkYXRlKEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TLAorICAgICAgICAgICAgZmlsdGVyZWREeW5hbWljRGVwdGhTdHJlYW1Db25maWdzKTsKIH0KIAogYm9vbApAQCAtMzIyLDYgKzQyOCwyNyBAQAogICAgIHJldHVybiBtRGF0YTsKIH0KIAorYm9vbAorQUNhbWVyYU1ldGFkYXRhOjppc0xvZ2ljYWxNdWx0aUNhbWVyYShzaXplX3QqIGNvdW50LCBjb25zdCBjaGFyKmNvbnN0KiogcGh5c2ljYWxDYW1lcmFJZHMpIGNvbnN0IHsKKyAgICBpZiAobVR5cGUgIT0gQUNNX0NIQVJBQ1RFUklTVElDUykgeworICAgICAgICBBTE9HRSgiJXMgbXVzdCBiZSBjYWxsZWQgZm9yIGEgc3RhdGljIG1ldGFkYXRhISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGNvdW50ID09IG51bGxwdHIgfHwgcGh5c2ljYWxDYW1lcmFJZHMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgaW5wdXQgY291bnQ6ICVwLCBwaHlzaWNhbENhbWVyYUlkczogJXAiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY291bnQsIHBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMuc2l6ZSgpID49IDIpIHsKKyAgICAgICAgKmNvdW50ID0gbVN0YXRpY1BoeXNpY2FsQ2FtZXJhSWRzLnNpemUoKTsKKyAgICAgICAgKnBoeXNpY2FsQ2FtZXJhSWRzID0gbVN0YXRpY1BoeXNpY2FsQ2FtZXJhSWRzLmRhdGEoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCiAvLyBUT0RPOiBzb21lIG9mIGtleSBiZWxvdyBzaG91bGQgYmUgaGlkZGVuIGZyb20gdXNlcgogLy8gZXg6IEFDQU1FUkFfUkVRVUVTVF9JRCBhbmQgQUNBTUVSQV9SRVBST0NFU1NfRUZGRUNUSVZFX0VYUE9TVVJFX0ZBQ1RPUgogLypAT35AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH4KQEAgLTQ0Myw3ICs1NzAsMTAgQEAKICAgICBBTkRST0lEX1NUQVRJU1RJQ1NfSU5GT19NQVhfSElTVE9HUkFNX0NPVU5ULAogICAgIEFORFJPSURfU1RBVElTVElDU19JTkZPX01BWF9TSEFSUE5FU1NfTUFQX1ZBTFVFLAogICAgIEFORFJPSURfU1RBVElTVElDU19JTkZPX1NIQVJQTkVTU19NQVBfU0laRSwKKyAgICBBTkRST0lEX0lORk9fU1VQUE9SVEVEX0JVRkZFUl9NQU5BR0VNRU5UX1ZFUlNJT04sCiAgICAgQU5EUk9JRF9ERVBUSF9NQVhfREVQVEhfU0FNUExFUywKKyAgICBBTkRST0lEX0hFSUNfSU5GT19TVVBQT1JURUQsCisgICAgQU5EUk9JRF9IRUlDX0lORk9fTUFYX0pQRUdfQVBQX1NFR01FTlRTX0NPVU5ULAogfSk7CiAKIC8qfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH4KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuaCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuaAppbmRleCBlNzZiODBjLi4zZDg5NWNiIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmgKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5oCkBAIC0xNywxMiArMTcsMTkgQEAKICNkZWZpbmUgX0FDQU1FUkFfTUVUQURBVEFfSAogCiAjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpbmNsdWRlIDxDYW1lcmFNZXRhZGF0YS5oPgordXNpbmcgQ2FtZXJhTWV0YWRhdGEgPSBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OmhlbHBlcjo6Q2FtZXJhTWV0YWRhdGE7CisjZWxzZQogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2VuZGlmCiAKICNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGEuaD4KIApAQCAtNTksNiArNjYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9jb25zdCB1aW50MzJfdCoqIHRhZ3MpIGNvbnN0OwogCiAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGdldEludGVybmFsRGF0YSgpIGNvbnN0OworICAgIGJvb2wgaXNMb2dpY2FsTXVsdGlDYW1lcmEoc2l6ZV90KiBjb3VudCwgY29uc3QgY2hhciogY29uc3QqKiBwaHlzaWNhbENhbWVyYUlkcykgY29uc3Q7CiAKICAgcHJpdmF0ZToKIApAQCAtNjgsNiArNzYsNyBAQAogICAgIHZvaWQgZmlsdGVyVW5zdXBwb3J0ZWRGZWF0dXJlcygpOyAvLyBIaWRlIGZlYXR1cmVzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IE5ESwogICAgIHZvaWQgZmlsdGVyU3RyZWFtQ29uZmlndXJhdGlvbnMoKTsgLy8gSGlkZSBpbnB1dCBzdHJlYW1zLCB0cmFuc2xhdGUgaGFsIGZvcm1hdCB0byBOREsgZm9ybWF0cwogICAgIHZvaWQgZmlsdGVyRHVyYXRpb25zKHVpbnQzMl90IHRhZyk7IC8vIHRyYW5zbGF0ZSBoYWwgZm9ybWF0IHRvIE5ESyBmb3JtYXRzCisgICAgdm9pZCBkZXJpdmVQaHlzaWNhbENhbWVyYUlkcygpOyAvLyBEZXJpdmUgYXJyYXkgb2YgcGh5c2ljYWwgaWRzLgogCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSU5URVJOQUxfVCwgdHlwZW5hbWUgTkRLX1Q+CiAgICAgY2FtZXJhX3N0YXR1c190IHVwZGF0ZUltcGwodWludDMyX3QgdGFnLCB1aW50MzJfdCBjb3VudCwgY29uc3QgTkRLX1QqIGRhdGEpIHsKQEAgLTEwNiw2ICsxMTUsOSBAQAogICAgIGNvbnN0IEFDQU1FUkFfTUVUQURBVEFfVFlQRSBtVHlwZTsKIAogICAgIHN0YXRpYyBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDMyX3Q+IHNTeXN0ZW1UYWdzOworCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IG1TdGF0aWNQaHlzaWNhbENhbWVyYUlkczsKKyAgICBzdGQ6OnZlY3RvcjxTdHJpbmc4PiBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZFZhbHVlczsKIH07CiAKICNlbmRpZiAvLyBfQUNBTUVSQV9NRVRBREFUQV9ICmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhcHR1cmVSZXF1ZXN0LmggYi9jYW1lcmEvbmRrL2ltcGwvQUNhcHR1cmVSZXF1ZXN0LmgKaW5kZXggMDZiMmNjMy4uMmZmY2FmZSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYXB0dXJlUmVxdWVzdC5oCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FwdHVyZVJlcXVlc3QuaApAQCAtMTgsMTEgKzE4LDE1IEBACiAKICNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FwdHVyZVJlcXVlc3QuaD4KICNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYXB0dXJlUmVxdWVzdFZlbmRvci5oIgorI2Vsc2UKIHN0cnVjdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0IHsKLSAgICBleHBsaWNpdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0KEFOYXRpdmVXaW5kb3cqIHdpbmRvdykgOiBtV2luZG93KHdpbmRvdykge307CisgICAgZXhwbGljaXQgQUNhbWVyYU91dHB1dFRhcmdldChBQ2FtZXJhV2luZG93VHlwZSogd2luZG93KSA6IG1XaW5kb3cod2luZG93KSB7fTsKIAogICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEFDYW1lcmFPdXRwdXRUYXJnZXQmIG90aGVyKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtV2luZG93ID09IG90aGVyLm1XaW5kb3c7CkBAIC0zNyw4ICs0MSw5IEBACiAgICAgICAgIHJldHVybiBtV2luZG93ID4gb3RoZXIubVdpbmRvdzsKICAgICB9CiAKLSAgICBBTmF0aXZlV2luZG93KiBtV2luZG93OworICAgIEFDYW1lcmFXaW5kb3dUeXBlKiBtV2luZG93OwogfTsKKyNlbmRpZgogCiBzdHJ1Y3QgQUNhbWVyYU91dHB1dFRhcmdldHMgewogICAgIHN0ZDo6c2V0PEFDYW1lcmFPdXRwdXRUYXJnZXQ+IG1PdXRwdXRzOwpAQCAtNTUsNyArNjAsOCBAQAogICAgICAgICByZXR1cm4gQUNBTUVSQV9PSzsKICAgICB9CiAKLSAgICBBQ2FtZXJhTWV0YWRhdGEqICAgICAgc2V0dGluZ3M7CisgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBzZXR0aW5nczsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPEFDYW1lcmFNZXRhZGF0YT4+IHBoeXNpY2FsU2V0dGluZ3M7CiAgICAgQUNhbWVyYU91dHB1dFRhcmdldHMqIHRhcmdldHM7CiAgICAgdm9pZCogICAgICAgICAgICAgICAgIGNvbnRleHQ7CiB9OwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCmluZGV4IDVlMGRiNjAuLmQxM2E4MTggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmgKQEAgLTM1LDEwICszNSwxMCBAQAogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogI2luY2x1ZGUgPHN0ZGJvb2wuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgogI2luY2x1ZGUgIk5ka0NhbWVyYUVycm9yLmgiCiAjaW5jbHVkZSAiTmRrQ2FtZXJhTWV0YWRhdGEuaCIKICNpbmNsdWRlICJOZGtDYXB0dXJlUmVxdWVzdC5oIgorI2luY2x1ZGUgIk5ka0NhbWVyYVdpbmRvd1R5cGUuaCIKIAogI2lmbmRlZiBfTkRLX0NBTUVSQV9DQVBUVVJFX1NFU1NJT05fSAogI2RlZmluZSBfTkRLX0NBTUVSQV9DQVBUVVJFX1NFU1NJT05fSApAQCAtMjQ2LDcgKzI0Niw3IEBACiAgKi8KIHR5cGVkZWYgdm9pZCAoKkFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfYnVmZmVyTG9zdCkoCiAgICAgICAgIHZvaWQqIGNvbnRleHQsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKLSAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBBTmF0aXZlV2luZG93KiB3aW5kb3csIGludDY0X3QgZnJhbWVOdW1iZXIpOworICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3csIGludDY0X3QgZnJhbWVOdW1iZXIpOwogCiB0eXBlZGVmIHN0cnVjdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyB7CiAgICAgLy8vIG9wdGlvbmFsIGFwcGxpY2F0aW9uIGNvbnRleHQuCkBAIC02NDMsNiArNjQzLDEwMyBAQAogICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXQqIG91dHB1dCkgX19JTlRST0RVQ0VEX0lOKDI4KTsKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjggKi8KIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQorLyoqCisgKiBUaGUgZGVmaW5pdGlvbiBvZiBmaW5hbCBjYXB0dXJlIHJlc3VsdCBjYWxsYmFjayB3aXRoIGxvZ2ljYWwgbXVsdGktY2FtZXJhIHN1cHBvcnQuCisgKgorICogVGhpcyBoYXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBmaW5hbCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCwgd2l0aAorICogYWRkZWQgYWJpbGl0eSB0byByZXR1cm4gcGh5c2ljYWwgY2FtZXJhIHJlc3VsdCBtZXRhZGF0YSB3aXRoaW4gYSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAqCisgKiBGb3IgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBJZCBhbmQgcmVzdWx0IG1ldGFkYXRhCisgKiBvZiB0aGUgdW5kZXJseWluZyBwaHlzaWNhbCBjYW1lcmFzLCB3aGljaCB0aGUgY29ycmVzcG9uZGluZyBjYXB0dXJlIHJlcXVlc3QgY29udGFpbnMgdGFyZ2V0cyBmb3IuCisgKiBJZiB0aGUgY2FwdHVyZSByZXF1ZXN0IGRvZXNuJ3QgY29udGFpbiB0YXJnZXRzIHNwZWNpZmljIHRvIGFueSBwaHlzaWNhbCBjYW1lcmEsIG9yIHRoZSBjdXJyZW50CisgKiBjYW1lcmEgZGV2aWNlIGlzbid0IGEgbG9naWNhbCBtdWx0aS1jYW1lcmEsIHBoeXNpY2FsUmVzdWx0Q291bnQgd2lsbCBiZSAwLgorICoKKyAqIEBwYXJhbSBjb250ZXh0IFRoZSBvcHRpb25hbCBhcHBsaWNhdGlvbiBjb250ZXh0IHByb3ZpZGVkIGJ5IHVzZXIgaW4KKyAqICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrc30uCisgKiBAcGFyYW0gc2Vzc2lvbiBUaGUgY2FtZXJhIGNhcHR1cmUgc2Vzc2lvbiBvZiBpbnRlcmVzdC4KKyAqIEBwYXJhbSByZXF1ZXN0IFRoZSBjYXB0dXJlIHJlcXVlc3Qgb2YgaW50ZXJlc3QuIE5vdGUgdGhhdCB0aGlzIHBvaW50ZXIgcG9pbnRzIHRvIGEgY29weSBvZgorICogICAgICAgICAgICAgICAgY2FwdHVyZSByZXF1ZXN0IHNlbnQgYnkgYXBwbGljYXRpb24sIHNvIHRoZSBhZGRyZXNzIGlzIGRpZmZlcmVudCB0byB3aGF0CisgKiAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBzZW50IGJ1dCB0aGUgY29udGVudCB3aWxsIG1hdGNoLiBUaGlzIHJlcXVlc3Qgd2lsbCBiZSBmcmVlZCBieQorICogICAgICAgICAgICAgICAgZnJhbWV3b3JrIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgY2FsbGJhY2sgcmV0dXJucy4KKyAqIEBwYXJhbSByZXN1bHQgVGhlIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIHJlcG9ydGVkIGJ5IGNhbWVyYSBkZXZpY2UuIFRoZSBtZW1vcnkgaXMgbWFuYWdlZCBieQorICogICAgICAgICAgICAgICAgY2FtZXJhIGZyYW1ld29yay4gRG8gbm90IGFjY2VzcyB0aGlzIHBvaW50ZXIgYWZ0ZXIgdGhpcyBjYWxsYmFjayByZXR1cm5zLgorICogQHBhcmFtIHBoeXNpY2FsUmVzdWx0Q291bnQgVGhlIG51bWJlciBvZiBwaHlzaWNhbCBjYW1lcmEgcmVzdWx0IG1ldGFkYXRhCisgKiBAcGFyYW0gcGh5c2ljYWxDYW1lcmFJZHMgVGhlIGFycmF5IG9mIHBoeXNpY2FsIGNhbWVyYSBJRHMgb24gd2hpY2ggdGhlCisgKiAgICAgICAgICAgICAgICBwaHlzaWNhbCByZXN1bHQgbWV0YWRhdGEgYXJlIHJlcG9ydGVkLgorICogQHBhcmFtIHBoeXNpY2FsUmVzdWx0cyBUaGUgYXJyYXkgb2YgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgcmVwb3J0ZWQgYnkgdGhlCisgKiAgICAgICAgICAgICAgICBwaHlzaWNhbCBjYW1lcmEgZGV2aWNlcy4KKyAqLwordHlwZWRlZiB2b2lkICgqQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCkoCisgICAgICAgIHZvaWQqIGNvbnRleHQsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBjb25zdCBBQ2FtZXJhTWV0YWRhdGEqIHJlc3VsdCwKKyAgICAgICAgc2l6ZV90IHBoeXNpY2FsUmVzdWx0Q291bnQsIGNvbnN0IGNoYXIqKiBwaHlzaWNhbENhbWVyYUlkcywKKyAgICAgICAgY29uc3QgQUNhbWVyYU1ldGFkYXRhKiogcGh5c2ljYWxSZXN1bHRzKTsKKworLyoqCisgKiBUaGlzIGhhcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzLAorICogd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgYW4gb25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCBjYWxsYmFjayBpcworICogdXNlZCwgaW5zdGVhZCBvZiBvbkNhcHR1cmVDb21wbGV0ZWQsIHRvIHN1cHBvcnQgbG9naWNhbCBtdWx0aS1jYW1lcmEuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MgeworICAgIC8qKgorICAgICAqIFNhbWUgYXMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MKKyAgICAgKi8KKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0ICAgICAgICAgb25DYXB0dXJlU3RhcnRlZDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCAgICAgICAgb25DYXB0dXJlUHJvZ3Jlc3NlZDsKKworICAgIC8qKgorICAgICAqIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gYW4gaW1hZ2UgY2FwdHVyZSBoYXMgZnVsbHkgY29tcGxldGVkIGFuZCBhbGwgdGhlCisgICAgICogcmVzdWx0IG1ldGFkYXRhIGlzIGF2YWlsYWJsZS4gRm9yIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEsIHRoaXMgY2FsbGJhY2sKKyAgICAgKiBhbHNvIHJldHVybnMgdGhlIHJlc3VsdCBtZXRhZGF0YSBmb3IgYWxsIHBoeXNpY2FsIGNhbWVyYXMgYmVpbmcKKyAgICAgKiBleHBsaWNpdGx5IHJlcXVlc3RlZCBvbi4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgY2FsbGJhY2sgd2lsbCBhbHdheXMgZmlyZSBhZnRlciB0aGUgbGFzdCB7QGxpbmsgb25DYXB0dXJlUHJvZ3Jlc3NlZH07CisgICAgICogaW4gb3RoZXIgd29yZHMsIG5vIG1vcmUgcGFydGlhbCByZXN1bHRzIHdpbGwgYmUgZGVsaXZlcmVkIG9uY2UgdGhlIGNvbXBsZXRlZCByZXN1bHQKKyAgICAgKiBpcyBhdmFpbGFibGUuPC9wPgorICAgICAqCisgICAgICogPHA+Rm9yIHBlcmZvcm1hbmNlLWludGVuc2l2ZSB1c2UtY2FzZXMgd2hlcmUgbGF0ZW5jeSBpcyBhIGZhY3RvciwgY29uc2lkZXIKKyAgICAgKiB1c2luZyB7QGxpbmsgb25DYXB0dXJlUHJvZ3Jlc3NlZH0gaW5zdGVhZC48L3A+CisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIEFDYXB0dXJlUmVxdWVzdCBwb2ludGVyIGluIHRoZSBjYWxsYmFjayB3aWxsIG5vdCBtYXRjaCB3aGF0IGFwcGxpY2F0aW9uIGhhcworICAgICAqIHN1Ym1pdHRlZCwgYnV0IHRoZSBjb250ZW50cyB0aGUgQUNhcHR1cmVSZXF1ZXN0IHdpbGwgbWF0Y2ggd2hhdCBhcHBsaWNhdGlvbiBzdWJtaXR0ZWQuPC9wPgorICAgICAqLworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZDsKKworICAgIC8qKgorICAgICAqIFNhbWUgYXMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MKKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2ZhaWxlZCAgICAgICAgb25DYXB0dXJlRmFpbGVkOworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VFbmQgICBvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlQWJvcnQgb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkOworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfYnVmZmVyTG9zdCAgICBvbkNhcHR1cmVCdWZmZXJMb3N0OworfSBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzOworCisvKioKKyAqIFRoaXMgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmUsIHdpdGggYWRkZWQKKyAqIHN1cHBvcnQgZm9yIGxvZ2ljYWwgbXVsdGktY2FtZXJhIHdoZXJlIHRoZSBjYXB0dXJlIGNhbGxiYWNrcyBzdXBwb3J0cyByZXN1bHQgbWV0YWRhdGEgZm9yCisgKiBwaHlzaWNhbCBjYW1lcmFzLgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZSgKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBjYWxsYmFja3MsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogVGhpcyBoYXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc2V0UmVwZWF0aW5nUmVxdWVzdCwgd2l0aCBhZGRlZAorICogc3VwcG9ydCBmb3IgbG9naWNhbCBtdWx0aS1jYW1lcmEgd2hlcmUgdGhlIGNhcHR1cmUgY2FsbGJhY2tzIHN1cHBvcnRzIHJlc3VsdCBtZXRhZGF0YSBmb3IKKyAqIHBoeXNpY2FsIGNhbWVyYXMuCisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9zZXRSZXBlYXRpbmdSZXF1ZXN0KAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGNhbGxiYWNrcywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLyogX05ES19DQU1FUkFfQ0FQVFVSRV9TRVNTSU9OX0ggKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYURldmljZS5oCmluZGV4IDdjMTNiMzQuLmNlZGY4M2EgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaApAQCAtMzQsMTAgKzM0LDEwIEBACiAgKi8KICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgogI2luY2x1ZGUgIk5ka0NhbWVyYUVycm9yLmgiCiAjaW5jbHVkZSAiTmRrQ2FwdHVyZVJlcXVlc3QuaCIKICNpbmNsdWRlICJOZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgorI2luY2x1ZGUgIk5ka0NhbWVyYVdpbmRvd1R5cGUuaCIKIAogI2lmbmRlZiBfTkRLX0NBTUVSQV9ERVZJQ0VfSAogI2RlZmluZSBfTkRLX0NBTUVSQV9ERVZJQ0VfSApAQCAtNTMsNiArNTMsMTcgQEAKICAqLwogdHlwZWRlZiBzdHJ1Y3QgQUNhbWVyYURldmljZSBBQ2FtZXJhRGV2aWNlOwogCisvKioKKyAqIFN0cnVjdCB0byBob2xkIGxpc3Qgb2YgY2FtZXJhIGRldmljZSBJZHMuIFRoaXMgY2FuIHJlZmVyIHRvIGVpdGhlciB0aGUgSWRzCisgKiBvZiBjb25uZWN0ZWQgY2FtZXJhIGRldmljZXMgcmV0dXJuZWQgZnJvbSB7QGxpbmsgQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhSWRMaXN0fSwKKyAqIG9yIHRoZSBwaHlzaWNhbCBjYW1lcmEgSWRzIHBhc3NlZCBpbnRvCisgKiB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICovCit0eXBlZGVmIHN0cnVjdCBBQ2FtZXJhSWRMaXN0IHsKKyAgICBpbnQgbnVtQ2FtZXJhczsgICAgICAgICAgLy8vPCBOdW1iZXIgb2YgY2FtZXJhIGRldmljZSBJZHMKKyAgICBjb25zdCBjaGFyKiogY2FtZXJhSWRzOyAgLy8vPCBsaXN0IG9mIGNhbWVyYSBkZXZpY2UgSWRzCit9IEFDYW1lcmFJZExpc3Q7CisKIC8vLyBFbnVtIGZvciBBQ2FtZXJhRGV2aWNlX0Vycm9yU3RhdGVDYWxsYmFjayBlcnJvciBjb2RlCiBlbnVtIHsKICAgICAvKioKQEAgLTM0NSw3ICszNTYsNyBAQAogICogQHNlZSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkCiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlKAotICAgICAgICBBTmF0aXZlV2luZG93KiBhbncsIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyNCk7CisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiBhbncsIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogRnJlZSBhIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCBvYmplY3QuCkBAIC02OTQsNyArNzA1LDcgQEAKICAqIEBzZWUgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZAogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2NyZWF0ZSgKLSAgICAgICAgQU5hdGl2ZVdpbmRvdyogYW53LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjgpOworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogYW53LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKICAqIEFkZCBhIG5hdGl2ZSB3aW5kb3cgdG8gc2hhcmVkIEFDYXB0dXJlU2Vzc2lvbk91dHB1dC4KQEAgLTcxMiw3ICs3MjMsNyBAQAogICogICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0LjwvbGk+PC91bD4KICAqLwogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9hZGQoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQsCi0gICAgICAgIEFOYXRpdmVXaW5kb3cgKmFudykgX19JTlRST0RVQ0VEX0lOKDI4KTsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUgKmFudykgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBSZW1vdmUgYSBuYXRpdmUgd2luZG93IGZyb20gc2hhcmVkIEFDYXB0dXJlU2Vzc2lvbk91dHB1dC4KQEAgLTcyOCw3ICs3MzksNyBAQAogICogICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0LjwvbGk+PC91bD4KICAqLwogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9yZW1vdmUoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQsCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIGFudykgX19JTlRST0RVQ0VEX0lOKDI4KTsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIGFudykgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBDcmVhdGUgYSBuZXcgY2FtZXJhIGNhcHR1cmUgc2Vzc2lvbiBzaW1pbGFyIHRvIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9ufS4gVGhpcwpAQCAtNzY1LDYgKzc3Niw3NyBAQAogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKworLyoqCisgKiBDcmVhdGUgYSBBQ2FwdHVyZVNlc3Npb25PdXRwdXQgb2JqZWN0IHVzZWQgZm9yIHN0cmVhbWluZyBmcm9tIGEgcGh5c2ljYWwKKyAqIGNhbWVyYSBhcyBwYXJ0IG9mIGEgbG9naWNhbCBjYW1lcmEgZGV2aWNlLgorICoKKyAqIDxwPlRoZSBBQ2FwdHVyZVNlc3Npb25PdXRwdXQgaXMgdXNlZCBpbiB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZH0gbWV0aG9kIHRvIGFkZAorICogYW4gb3V0cHV0IHtAbGluayBBTmF0aXZlV2luZG93fSB0byBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIuIFVzZQorICoge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlfSB0byBmcmVlIHRoZSBvYmplY3QgYW5kIGl0cyBtZW1vcnkgYWZ0ZXIgYXBwbGljYXRpb24gbm8gbG9uZ2VyCisgKiBuZWVkcyB0aGUge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dH0uPC9wPgorICoKKyAqIEBwYXJhbSBhbncgdGhlIHtAbGluayBBTmF0aXZlV2luZG93fSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXR9CisgKiBAcGFyYW0gcGh5c2ljYWxJZCB0aGUgSWQgb2YgdGhlIHBoeXNpY2FsIGNhbWVyYSB0aGlzIG91dHB1dCBpcyBhc3NvY2lhdGVkCisgKiAgICAgICAgICAgICAgICAgIHdpdGguCisgKiBAcGFyYW0gb3V0cHV0IHRoZSBvdXRwdXQge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dH0gd2lsbCBiZSBzdG9yZWQgaGVyZSBpZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgbWV0aG9kIGNhbGwgc3VjY2VlZHMuCisgKgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLiBUaGUgY3JlYXRlZCBjb250YWluZXIgd2lsbCBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxlZCBpbiB0aGUgb3V0cHV0IGFyZ3VtZW50LjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgYW53LCBwaHlzaWNhbElkIG9yIG91dHB1dCBpcyBOVUxMLjwvbGk+PC91bD4KKyAqCisgKiBAc2VlIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9hZGQKKyAqLworY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblBoeXNpY2FsT3V0cHV0X2NyZWF0ZSgKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIGFudywgY29uc3QgY2hhciogcGh5c2ljYWxJZCwKKyAgICAgICAgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dHB1dCkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBDcmVhdGUgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBBQ2FwdHVyZVJlcXVlc3QgZm9yIGNhcHR1cmluZyBpbWFnZXMsIGluaXRpYWxpemVkIHdpdGggdGVtcGxhdGUKKyAqIGZvciBhIHRhcmdldCB1c2UgY2FzZSwgd2l0aCB0aGUgYWJpbGl0eSB0byBzcGVjaWZ5IHBoeXNpY2FsIGNhbWVyYSBzZXR0aW5ncy4KKyAqCisgKiA8cD5UaGUgc2V0dGluZ3MgYXJlIGNob3NlbiB0byBiZSB0aGUgYmVzdCBvcHRpb25zIGZvciB0aGlzIGNhbWVyYSBkZXZpY2UsCisgKiBzbyBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gcmV1c2UgdGhlIHNhbWUgcmVxdWVzdCBmb3IgYSBkaWZmZXJlbnQgY2FtZXJhIGRldmljZS48L3A+CisgKgorICogPHA+Tm90ZSB0aGF0IGZvciBhbGwga2V5cyBpbiBwaHlzaWNhbCBjYW1lcmEgc2V0dGluZ3MsIG9ubHkgdGhlIGtleXMKKyAqIGFkdmVydGlzZWQgaW4gQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTIGFyZQorICogYXBwbGljYWJsZS4gQWxsIG90aGVyIGtleXMgYXJlIGlnbm9yZWQgYnkgdGhlIGNhbWVyYSBkZXZpY2UuPC9wPgorICoKKyAqIEBwYXJhbSBkZXZpY2UgdGhlIGNhbWVyYSBkZXZpY2Ugb2YgaW50ZXJlc3QKKyAqIEBwYXJhbSB0ZW1wbGF0ZUlkIHRoZSB0eXBlIG9mIGNhcHR1cmUgcmVxdWVzdCB0byBiZSBjcmVhdGVkLgorICogICAgICAgIFNlZSB7QGxpbmsgQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlfS4KKyAqIEBwYXJhbSBwaHlzaWNhbElkTGlzdCBUaGUgbGlzdCBvZiBwaHlzaWNhbCBjYW1lcmEgSWRzIHRoYXQgY2FuIGJlIHVzZWQgdG8KKyAqICAgICAgICBjdXN0b21pemUgdGhlIHJlcXVlc3QgZm9yIGEgc3BlY2lmaWMgcGh5c2ljYWwgY2FtZXJhLgorICogQHBhcmFtIHJlcXVlc3QgdGhlIG91dHB1dCByZXF1ZXN0IHdpbGwgYmUgc3RvcmVkIGhlcmUgaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy4gVGhlIGNyZWF0ZWQgY2FwdHVyZSByZXF1ZXN0IHdpbGwgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsZWQgaW4gcmVxdWVzdCBhcmd1bWVudC48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIGRldmljZSwgcGh5c2ljYWxJZExpc3QsIG9yIHJlcXVlc3QgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCB0ZW1wbGF0ZUlkIGlzIHVuZGVmaW5lZCBvciBjYW1lcmEgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQgdGVtcGxhdGUsIG9yIGlmIHNvbWUgSWRzIGluIHBoeXNpY2FsSWRMaXN0IGlzbid0IGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBwaHlzaWNhbCBjYW1lcmEgYmFja2luZyB0aGUgY3VycmVudCBjYW1lcmEgZGV2aWNlLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEfSBpZiB0aGUgY2FtZXJhIGRldmljZSBpcyBjbG9zZWQuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0V9IGlmIHRoZSBjYW1lcmEgZGV2aWNlIGVuY291bnRlcnMgZmF0YWwgZXJyb3IuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFfSBpZiB0aGUgY2FtZXJhIHNlcnZpY2UgZW5jb3VudGVycyBmYXRhbCBlcnJvci48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfVU5LTk9XTn0gaWYgdGhlIG1ldGhvZCBmYWlscyBmb3Igc29tZSBvdGhlciByZWFzb25zLjwvbGk+PC91bD4KKyAqCisgKiBAc2VlIFRFTVBMQVRFX1BSRVZJRVcKKyAqIEBzZWUgVEVNUExBVEVfUkVDT1JECisgKiBAc2VlIFRFTVBMQVRFX1NUSUxMX0NBUFRVUkUKKyAqIEBzZWUgVEVNUExBVEVfVklERU9fU05BUFNIT1QKKyAqIEBzZWUgVEVNUExBVEVfTUFOVUFMCisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkcygKKyAgICAgICAgY29uc3QgQUNhbWVyYURldmljZSogZGV2aWNlLCBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgY29uc3QgQUNhbWVyYUlkTGlzdCogcGh5c2ljYWxJZExpc3QsCisgICAgICAgIC8qb3V0Ki9BQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI5ICovCisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvKiBfTkRLX0NBTUVSQV9ERVZJQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaAppbmRleCBlYTc2NzM4Li4xMzZhNDk3IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaApAQCAtNzQsMTIgKzc0LDYgQEAKICAqLwogdm9pZCBBQ2FtZXJhTWFuYWdlcl9kZWxldGUoQUNhbWVyYU1hbmFnZXIqIG1hbmFnZXIpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKLS8vLyBTdHJ1Y3QgdG8gaG9sZCBsaXN0IG9mIGNhbWVyYSBkZXZpY2VzCi10eXBlZGVmIHN0cnVjdCBBQ2FtZXJhSWRMaXN0IHsKLSAgICBpbnQgbnVtQ2FtZXJhczsgICAgICAgICAgLy8vPCBOdW1iZXIgb2YgY29ubmVjdGVkIGNhbWVyYSBkZXZpY2VzCi0gICAgY29uc3QgY2hhcioqIGNhbWVyYUlkczsgIC8vLzwgbGlzdCBvZiBpZGVudGlmaWVyIG9mIGNvbm5lY3RlZCBjYW1lcmEgZGV2aWNlcwotfSBBQ2FtZXJhSWRMaXN0OwotCiAvKioKICAqIENyZWF0ZSBhIGxpc3Qgb2YgY3VycmVudGx5IGNvbm5lY3RlZCBjYW1lcmEgZGV2aWNlcywgaW5jbHVkaW5nCiAgKiBjYW1lcmFzIHRoYXQgbWF5IGJlIGluIHVzZSBieSBvdGhlciBjYW1lcmEgQVBJIGNsaWVudHMuCkBAIC0yNzgsNiArMjcyLDEwNSBAQAogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI0ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKworLyoqCisgKiBEZWZpbml0aW9uIG9mIGNhbWVyYSBhY2Nlc3MgcGVybWlzc2lvbiBjaGFuZ2UgY2FsbGJhY2suCisgKgorICogPHA+Tm90aWZpY2F0aW9uIHRoYXQgY2FtZXJhIGFjY2VzcyBwcmlvcml0aWVzIGhhdmUgY2hhbmdlZCBhbmQgdGhlIGNhbWVyYSBtYXkKKyAqIG5vdyBiZSBvcGVuYWJsZS4gQW4gYXBwbGljYXRpb24gdGhhdCB3YXMgcHJldmlvdXNseSBkZW5pZWQgY2FtZXJhIGFjY2VzcyBkdWUgdG8KKyAqIGEgaGlnaGVyLXByaW9yaXR5IHVzZXIgYWxyZWFkeSB1c2luZyB0aGUgY2FtZXJhLCBvciB0aGF0IHdhcyBkaXNjb25uZWN0ZWQgZnJvbSBhbgorICogYWN0aXZlIGNhbWVyYSBzZXNzaW9uIGR1ZSB0byBhIGhpZ2hlci1wcmlvcml0eSB1c2VyIHRyeWluZyB0byBvcGVuIHRoZSBjYW1lcmEsCisgKiBzaG91bGQgdHJ5IHRvIG9wZW4gdGhlIGNhbWVyYSBhZ2FpbiBpZiBpdCBzdGlsbCB3YW50cyB0byB1c2UgaXQuICBOb3RlIHRoYXQKKyAqIG11bHRpcGxlIGFwcGxpY2F0aW9ucyBtYXkgcmVjZWl2ZSB0aGlzIGNhbGxiYWNrIGF0IHRoZSBzYW1lIHRpbWUsIGFuZCBvbmx5IG9uZSBvZgorICogdGhlbSB3aWxsIHN1Y2NlZWQgaW4gb3BlbmluZyB0aGUgY2FtZXJhIGluIHByYWN0aWNlLCBkZXBlbmRpbmcgb24gZXhhY3QgYWNjZXNzCisgKiBwcmlvcml0eSBsZXZlbHMgYW5kIHRpbWluZy4gVGhpcyBtZXRob2QgaXMgdXNlZnVsIGluIGNhc2VzIHdoZXJlIG11bHRpcGxlCisgKiBhcHBsaWNhdGlvbnMgbWF5IGJlIGluIHRoZSByZXN1bWVkIHN0YXRlIGF0IHRoZSBzYW1lIHRpbWUsIGFuZCB0aGUgdXNlciBzd2l0Y2hlcworICogZm9jdXMgYmV0d2VlbiB0aGVtLCBvciBpZiB0aGUgY3VycmVudCBjYW1lcmEtdXNpbmcgYXBwbGljYXRpb24gbW92ZXMgYmV0d2VlbgorICogZnVsbC1zY3JlZW4gYW5kIFBpY3R1cmUtaW4tUGljdHVyZSAoUGlQKSBzdGF0ZXMuIEluIHN1Y2ggY2FzZXMsIHRoZSBjYW1lcmEKKyAqIGF2YWlsYWJsZS91bmF2YWlsYWJsZSBjYWxsYmFja3Mgd2lsbCBub3QgYmUgaW52b2tlZCwgYnV0IGFub3RoZXIgYXBwbGljYXRpb24gbWF5CisgKiBub3cgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgZm9yIGNhbWVyYSBhY2Nlc3MgdGhhbiB0aGUgY3VycmVudCBjYW1lcmEtdXNpbmcKKyAqIGFwcGxpY2F0aW9uLjwvcD4KKworICogQHBhcmFtIGNvbnRleHQgVGhlIG9wdGlvbmFsIGFwcGxpY2F0aW9uIGNvbnRleHQgcHJvdmlkZWQgYnkgdXNlciBpbgorICogICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUxpc3RlbmVyfS4KKyAqLwordHlwZWRlZiB2b2lkICgqQUNhbWVyYU1hbmFnZXJfQWNjZXNzUHJpb3JpdGllc0NoYW5nZWRDYWxsYmFjaykodm9pZCogY29udGV4dCk7CisKKy8qKgorICogQSBsaXN0ZW5lciBmb3IgY2FtZXJhIGRldmljZXMgYmVjb21pbmcgYXZhaWxhYmxlL3VuYXZhaWxhYmxlIHRvIG9wZW4gb3Igd2hlbgorICogdGhlIGNhbWVyYSBhY2Nlc3MgcGVybWlzc2lvbnMgY2hhbmdlLgorICoKKyAqIDxwPkNhbWVyYXMgYmVjb21lIGF2YWlsYWJsZSB3aGVuIHRoZXkgYXJlIG5vIGxvbmdlciBpbiB1c2UsIG9yIHdoZW4gYSBuZXcKKyAqIHJlbW92YWJsZSBjYW1lcmEgaXMgY29ubmVjdGVkLiBUaGV5IGJlY29tZSB1bmF2YWlsYWJsZSB3aGVuIHNvbWUKKyAqIGFwcGxpY2F0aW9uIG9yIHNlcnZpY2Ugc3RhcnRzIHVzaW5nIGEgY2FtZXJhLCBvciB3aGVuIGEgcmVtb3ZhYmxlIGNhbWVyYQorICogaXMgZGlzY29ubmVjdGVkLjwvcD4KKyAqCisgKiBAc2VlIEFDYW1lcmFNYW5hZ2VyX3JlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjaworICovCit0eXBlZGVmIHN0cnVjdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUxpc3RlbmVyIHsKKyAgICAvLy8KKyAgICBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgYXZhaWxhYmlsaXR5Q2FsbGJhY2tzOworCisgICAgLy8vIENhbGxlZCB3aGVuIHRoZXJlIGlzIGNhbWVyYSBhY2Nlc3MgcGVybWlzc2lvbiBjaGFuZ2UKKyAgICBBQ2FtZXJhTWFuYWdlcl9BY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZENhbGxiYWNrIG9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQ7CisKKyAgICAvLy8gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UsIHBsZWFzZSBlbnN1cmUgdGhhdCBhbGwgZW50cmllcyBhcmUgc2V0IHRvIE5VTEwKKyAgICB2b2lkICpyZXNlcnZlZFs2XTsKK30gQUNhbWVyYU1hbmFnZXJfRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFja3M7CisKKy8qKgorICogUmVnaXN0ZXIgY2FtZXJhIGV4dGVuZGVkIGF2YWlsYWJpbGl0eSBjYWxsYmFja3MuCisgKgorICogPHA+b25DYW1lcmFVbmF2YWlsYWJsZSB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBhIGNhbWVyYSBkZXZpY2UgaXMgb3BlbmVkIGJ5IGFueSBjYW1lcmEgQVBJCisgKiBjbGllbnQuIE90aGVyIGNhbWVyYSBBUEkgY2xpZW50cyBtYXkgc3RpbGwgYmUgYWJsZSB0byBvcGVuIHN1Y2ggYSBjYW1lcmEgZGV2aWNlLCBldmljdGluZyB0aGUKKyAqIGV4aXN0aW5nIGNsaWVudCBpZiB0aGV5IGhhdmUgaGlnaGVyIHByaW9yaXR5IHRoYW4gdGhlIGV4aXN0aW5nIGNsaWVudCBvZiBhIGNhbWVyYSBkZXZpY2UuCisgKiBTZWUge0BsaW5rIEFDYW1lcmFNYW5hZ2VyX29wZW5DYW1lcmF9IGZvciBtb3JlIGRldGFpbHMuPC9wPgorICoKKyAqIDxwPlRoZSBjYWxsYmFja3Mgd2lsbCBiZSBjYWxsZWQgb24gYSBkZWRpY2F0ZWQgdGhyZWFkIHNoYXJlZCBhbW9uZyBhbGwgQUNhbWVyYU1hbmFnZXIKKyAqIGluc3RhbmNlcy48L3A+CisgKgorICogPHA+U2luY2UgdGhpcyBjYWxsYmFjayB3aWxsIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgY2FtZXJhIHNlcnZpY2UsIHJlbWVtYmVyIHRvIHVucmVnaXN0ZXIgaXQKKyAqIG9uY2UgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZDsgb3RoZXJ3aXNlIHRoZSBjYWxsYmFjayB3aWxsIGNvbnRpbnVlIHRvIHJlY2VpdmUgZXZlbnRzCisgKiBpbmRlZmluaXRlbHkgYW5kIGl0IG1heSBwcmV2ZW50IG90aGVyIHJlc291cmNlcyBmcm9tIGJlaW5nIHJlbGVhc2VkLiBTcGVjaWZpY2FsbHksIHRoZQorICogY2FsbGJhY2tzIHdpbGwgYmUgaW52b2tlZCBpbmRlcGVuZGVudGx5IG9mIHRoZSBnZW5lcmFsIGFjdGl2aXR5IGxpZmVjeWNsZSBhbmQgaW5kZXBlbmRlbnRseQorICogb2YgdGhlIHN0YXRlIG9mIGluZGl2aWR1YWwgQUNhbWVyYU1hbmFnZXIgaW5zdGFuY2VzLjwvcD4KKyAqCisgKiBAcGFyYW0gbWFuYWdlciB0aGUge0BsaW5rIEFDYW1lcmFNYW5hZ2VyfSBvZiBpbnRlcmVzdC4KKyAqIEBwYXJhbSBjYWxsYmFjayB0aGUge0BsaW5rIEFDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzfSB0byBiZSByZWdpc3RlcmVkLgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIG1hbmFnZXIgb3IgY2FsbGJhY2sgaXMgTlVMTCwgb3IKKyAqICAgICAgICAgICAgICAgICAge0FDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzI29uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWR9CisgKiAgICAgICAgICAgICAgICAgIG9yIHtBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3Mjb25DYW1lcmFBdmFpbGFibGV9IG9yCisgKiAgICAgICAgICAgICAgICAgIHtBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3Mjb25DYW1lcmFVbmF2YWlsYWJsZX0gaXMgTlVMTC48L2xpPjwvdWw+CisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhTWFuYWdlcl9yZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgIEFDYW1lcmFNYW5hZ2VyKiBtYW5hZ2VyLAorICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyogY2FsbGJhY2spIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogVW5yZWdpc3RlciBjYW1lcmEgZXh0ZW5kZWQgYXZhaWxhYmlsaXR5IGNhbGxiYWNrcy4KKyAqCisgKiA8cD5SZW1vdmluZyBhIGNhbGxiYWNrIHRoYXQgaXNuJ3QgcmVnaXN0ZXJlZCBoYXMgbm8gZWZmZWN0LjwvcD4KKyAqCisgKiBAcGFyYW0gbWFuYWdlciB0aGUge0BsaW5rIEFDYW1lcmFNYW5hZ2VyfSBvZiBpbnRlcmVzdC4KKyAqIEBwYXJhbSBjYWxsYmFjayB0aGUge0BsaW5rIEFDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzfSB0byBiZSB1bnJlZ2lzdGVyZWQuCisgKgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgY2FsbGJhY2ssCisgKiAgICAgICAgICAgICAgICAgIHtBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyNvbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkfQorICogICAgICAgICAgICAgICAgICBvciB7QUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzI29uQ2FtZXJhQXZhaWxhYmxlfSBvcgorICogICAgICAgICAgICAgICAgICB7QUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzI29uQ2FtZXJhVW5hdmFpbGFibGV9IGlzIE5VTEwuPC9saT48L3VsPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU1hbmFnZXJfdW5yZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgIEFDYW1lcmFNYW5hZ2VyKiBtYW5hZ2VyLAorICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyogY2FsbGJhY2spIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KKwogX19FTkRfREVDTFMKIAogI2VuZGlmIC8qIF9OREtfQ0FNRVJBX01BTkFHRVJfSCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YS5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YS5oCmluZGV4IDYxMWUyNzAuLjliYmZiODMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGEuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhLmgKQEAgLTIzMyw2ICsyMzMsMjggQEAKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI5CisKKy8qKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGEgY2FtZXJhIGlzIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICoKKyAqIDxwPiBDaGVjayB3aGV0aGVyIGEgY2FtZXJhIGRldmljZSBpcyBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGJhc2VkIG9uIGl0cworICogc3RhdGljIG1ldGFkYXRhLiBJZiBpdCBpcywgYWxzbyByZXR1cm5zIGl0cyBwaHlzaWNhbCBzdWIgY2FtZXJhIElkcy48L3A+CisgKgorICogQHBhcmFtIHN0YXRpY01ldGFkYXRhIHRoZSBzdGF0aWMgbWV0YWRhdGEgb2YgdGhlIGNhbWVyYSBiZWluZyBjaGVja2VkLgorICogQHBhcmFtIG51bVBoeXNpY2FsQ2FtZXJhcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgcGh5c2ljYWwgY2FtZXJhcy4KKyAqIEBwYXJhbSBwaHlzaWNhbENhbWVyYUlkcyByZXR1cm5zIHRoZSBhcnJheSBvZiBwaHlzaWNhbCBjYW1lcmEgSWRzIGJhY2tpbmcgdGhpcyBsb2dpY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhIGRldmljZS4gTm90ZSB0aGF0IHRoaXMgcG9pbnRlciBpcyBvbmx5IHZhbGlkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGUgc3RhdGljTWV0YWRhdGEgb2JqZWN0LgorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEsIGZhbHNlIG90aGVyd2lzZS4KKyAqLworYm9vbCBBQ2FtZXJhTWV0YWRhdGFfaXNMb2dpY2FsTXVsdGlDYW1lcmEoY29uc3QgQUNhbWVyYU1ldGFkYXRhKiBzdGF0aWNNZXRhZGF0YSwKKyAgICAgICAgLypvdXQqL3NpemVfdCogbnVtUGh5c2ljYWxDYW1lcmFzLCAvKm91dCovY29uc3QgY2hhciogY29uc3QqKiBwaHlzaWNhbENhbWVyYUlkcykKKyAgICAgICAgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLyogX05ES19DQU1FUkFfTUVUQURBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmgKaW5kZXggYTlhZjc3ZS4uYzI2Y2E2OSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oCkBAIC03MSw2ICs3MSw4IEBACiAgICAgQUNBTUVSQV9ERVBUSCwKICAgICBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBLAogICAgIEFDQU1FUkFfRElTVE9SVElPTl9DT1JSRUNUSU9OLAorICAgIEFDQU1FUkFfSEVJQywKKyAgICBBQ0FNRVJBX0hFSUNfSU5GTywKICAgICBBQ0FNRVJBX1NFQ1RJT05fQ09VTlQsCiAKICAgICBBQ0FNRVJBX1ZFTkRPUiA9IDB4ODAwMApAQCAtMTEyLDYgKzExNCw4IEBACiAgICAgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fU1RBUlQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDE2LAorICAgIEFDQU1FUkFfSEVJQ19TVEFSVCAgICAgICAgICAgICA9IEFDQU1FUkFfSEVJQyAgICAgICAgICAgICAgPDwgMTYsCisgICAgQUNBTUVSQV9IRUlDX0lORk9fU1RBUlQgICAgICAgID0gQUNBTUVSQV9IRUlDX0lORk8gICAgICAgICA8PCAxNiwKICAgICBBQ0FNRVJBX1ZFTkRPUl9TVEFSVCAgICAgICAgICAgPSBBQ0FNRVJBX1ZFTkRPUiAgICAgICAgICAgIDw8IDE2CiB9IGFjYW1lcmFfbWV0YWRhdGFfc2VjdGlvbl9zdGFydF90OwogCkBAIC0xOTEyLDYgKzE5MTYsNyBAQAogICAgICAqICAgPGxpPkFDYXB0dXJlUmVxdWVzdDwvbGk+CiAgICAgICogPC91bD48L3A+CiAgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBpcyBhbHNvIHVzZWQgZm9yIEhFSUMgaW1hZ2UgY2FwdHVyZS48L3A+CiAgICAgICovCiAgICAgQUNBTUVSQV9KUEVHX0dQU19DT09SRElOQVRFUyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG91YmxlWzNdCiAgICAgICAgICAgICBBQ0FNRVJBX0pQRUdfU1RBUlQsCkBAIC0xOTI3LDYgKzE5MzIsNyBAQAogICAgICAqICAgPGxpPkFDYXB0dXJlUmVxdWVzdDwvbGk+CiAgICAgICogPC91bD48L3A+CiAgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBpcyBhbHNvIHVzZWQgZm9yIEhFSUMgaW1hZ2UgY2FwdHVyZS48L3A+CiAgICAgICovCiAgICAgQUNBTUVSQV9KUEVHX0dQU19QUk9DRVNTSU5HX01FVEhPRCA9ICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZQogICAgICAgICAgICAgQUNBTUVSQV9KUEVHX1NUQVJUICsgMSwKQEAgLTE5NDIsNiArMTk0OCw3IEBACiAgICAgICogICA8bGk+QUNhcHR1cmVSZXF1ZXN0PC9saT4KICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIGlzIGFsc28gdXNlZCBmb3IgSEVJQyBpbWFnZSBjYXB0dXJlLjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX0pQRUdfR1BTX1RJTUVTVEFNUCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQ2NAogICAgICAgICAgICAgQUNBTUVSQV9KUEVHX1NUQVJUICsgMiwKQEAgLTE5ODYsNiArMTk5MywxMCBAQAogICAgICAqIDwvY29kZT48L3ByZT4KICAgICAgKiA8cD5Gb3IgRVhURVJOQUwgY2FtZXJhcyB0aGUgc2Vuc29yIG9yaWVudGF0aW9uIHdpbGwgYWx3YXlzIGJlIHNldCB0byAwIGFuZCB0aGUgZmFjaW5nIHdpbGwKICAgICAgKiBhbHNvIGJlIHNldCB0byBFWFRFUk5BTC4gVGhlIGFib3ZlIGNvZGUgaXMgbm90IHJlbGV2YW50IGluIHN1Y2ggY2FzZS48L3A+CisgICAgICogPHA+VGhpcyB0YWcgaXMgYWxzbyB1c2VkIHRvIGRlc2NyaWJlIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgSEVJQyBpbWFnZSBjYXB0dXJlLCBpbiB3aGljaAorICAgICAqIGNhc2UgdGhlIHJvdGF0aW9uIGlzIHJlZmxlY3RlZCBieQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0V4aWZJbnRlcmZhY2UuaHRtbCNUQUdfT1JJRU5UQVRJT04iPkVYSUYgb3JpZW50YXRpb24gZmxhZzwvYT4sIGFuZCBub3QgYnkKKyAgICAgKiByb3RhdGluZyB0aGUgaW1hZ2UgZGF0YSBpdHNlbGYuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9PUklFTlRBVElPTgogICAgICAqLwpAQCAtMjAwMyw3ICsyMDE0LDggQEAKICAgICAgKiAgIDxsaT5BQ2FwdHVyZVJlcXVlc3Q8L2xpPgogICAgICAqIDwvdWw+PC9wPgogICAgICAqCi0gICAgICogPHA+ODUtOTUgaXMgdHlwaWNhbCB1c2FnZSByYW5nZS48L3A+CisgICAgICogPHA+ODUtOTUgaXMgdHlwaWNhbCB1c2FnZSByYW5nZS4gVGhpcyB0YWcgaXMgYWxzbyB1c2VkIHRvIGRlc2NyaWJlIHRoZSBxdWFsaXR5CisgICAgICogb2YgdGhlIEhFSUMgaW1hZ2UgY2FwdHVyZS48L3A+CiAgICAgICovCiAgICAgQUNBTUVSQV9KUEVHX1FVQUxJVFkgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZQogICAgICAgICAgICAgQUNBTUVSQV9KUEVHX1NUQVJUICsgNCwKQEAgLTIwMTksNiArMjAzMSw3IEBACiAgICAgICogICA8bGk+QUNhcHR1cmVSZXF1ZXN0PC9saT4KICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIGlzIGFsc28gdXNlZCB0byBkZXNjcmliZSB0aGUgcXVhbGl0eSBvZiB0aGUgSEVJQyBpbWFnZSBjYXB0dXJlLjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX0pQRUdfVEhVTUJOQUlMX1FVQUxJVFkgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlCiAgICAgICAgICAgICBBQ0FNRVJBX0pQRUdfU1RBUlQgKyA1LApAQCAtMjA1NSw2ICsyMDY4LDEwIEBACiAgICAgICogICBvcmllbnRhdGlvbiBpcyByZXF1ZXN0ZWQuIExFR0FDWSBkZXZpY2Ugd2lsbCBhbHdheXMgcmVwb3J0IHVucm90YXRlZCB0aHVtYm5haWwKICAgICAgKiAgIHNpemUuPC9saT4KICAgICAgKiA8L3VsPgorICAgICAqIDxwPlRoZSB0YWcgaXMgYWxzbyB1c2VkIGFzIHRodW1ibmFpbCBzaXplIGZvciBIRUlDIGltYWdlIGZvcm1hdCBjYXB0dXJlLCBpbiB3aGljaCBjYXNlIHRoZQorICAgICAqIHRoZSB0aHVtYm5haWwgcm90YXRpb24gaXMgcmVmbGVjdGVkIGJ5CisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvRXhpZkludGVyZmFjZS5odG1sI1RBR19PUklFTlRBVElPTiI+RVhJRiBvcmllbnRhdGlvbiBmbGFnPC9hPiwgYW5kIG5vdCBieQorICAgICAqIHJvdGF0aW5nIHRoZSB0aHVtYm5haWwgZGF0YSBpdHNlbGYuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX0pQRUdfT1JJRU5UQVRJT04KICAgICAgKi8KQEAgLTIwODgsNiArMjEwNSw3IEBACiAgICAgICogYW5kIHZpY2UgdmVyc2EuPC9saT4KICAgICAgKiA8bGk+QWxsIG5vbi08Y29kZT4oMCwgMCk8L2NvZGU+IHNpemVzIHdpbGwgaGF2ZSBub24temVybyB3aWR0aHMgYW5kIGhlaWdodHMuPC9saT4KICAgICAgKiA8L3VsPgorICAgICAqIDxwPlRoaXMgbGlzdCBpcyBhbHNvIHVzZWQgYXMgc3VwcG9ydGVkIHRodW1ibmFpbCBzaXplcyBmb3IgSEVJQyBpbWFnZSBmb3JtYXQgY2FwdHVyZS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMKICAgICAgKi8KQEAgLTI3ODMsNyArMjgwMSw3IEBACiAgICAgICogICB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMiBSQVcxMn0uPC9saT4KICAgICAgKiA8bGk+UHJvY2Vzc2VkIChidXQgbm90LXN0YWxsaW5nKTogYW55IG5vbi1SQVcgZm9ybWF0IHdpdGhvdXQgYSBzdGFsbCBkdXJhdGlvbi4gIFR5cGljYWxseQogICAgICAqICAge0BsaW5rIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODggWVVWXzQyMF84ODh9LAotICAgICAqICAgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvZ3JhcGhpY3MvSW1hZ2VGb3JtYXQuaHRtbCNOVjIxIj5OVjIxPC9hPiwgb3IgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvZ3JhcGhpY3MvSW1hZ2VGb3JtYXQuaHRtbCNZVjEyIj5ZVjEyPC9hPi48L2xpPgorICAgICAqICAgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvZ3JhcGhpY3MvSW1hZ2VGb3JtYXQuaHRtbCNOVjIxIj5OVjIxPC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvZ3JhcGhpY3MvSW1hZ2VGb3JtYXQuaHRtbCNZVjEyIj5ZVjEyPC9hPiwgb3Ige0BsaW5rIEFJTUFHRV9GT1JNQVRfWTggWTh9IC48L2xpPgogICAgICAqIDwvdWw+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMKQEAgLTMwMjgsNiArMzA0NiwyOCBAQAogICAgICAqLwogICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfU0VTU0lPTl9LRVlTID0gICAgICAgICAgICAgICAgICAgIC8vIGludDMyW25dCiAgICAgICAgICAgICBBQ0FNRVJBX1JFUVVFU1RfU1RBUlQgKyAxNiwKKyAgICAvKioKKyAgICAgKiA8cD5BIHN1YnNldCBvZiB0aGUgYXZhaWxhYmxlIHJlcXVlc3Qga2V5cyB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIGZvcgorICAgICAqIHBoeXNpY2FsIGRldmljZXMgYmFja2luZyBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDMyW25dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgaXMgYSBzdWJzZXQgb2YgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9SRVFVRVNUX0tFWVMgd2hpY2ggY29udGFpbnMgYSBsaXN0CisgICAgICogb2Yga2V5cyB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIHVzaW5nIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9DYXB0dXJlUmVxdWVzdC9CdWlsZGVyLmh0bWwjc2V0UGh5c2ljYWxDYW1lcmFLZXkiPkJ1aWxkZXIjc2V0UGh5c2ljYWxDYW1lcmFLZXk8L2E+LgorICAgICAqIFRoZSByZXNwZWN0aXZlIHZhbHVlIG9mIHN1Y2ggcmVxdWVzdCBrZXkgY2FuIGJlIG9idGFpbmVkIGJ5IGNhbGxpbmcKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvQ2FwdHVyZVJlcXVlc3QvQnVpbGRlci5odG1sI2dldFBoeXNpY2FsQ2FtZXJhS2V5Ij5CdWlsZGVyI2dldFBoeXNpY2FsQ2FtZXJhS2V5PC9hPi4gQ2FwdHVyZSByZXF1ZXN0cyB0aGF0IGNvbnRhaW4KKyAgICAgKiBpbmRpdmlkdWFsIHBoeXNpY2FsIGRldmljZSByZXF1ZXN0cyBtdXN0IGJlIGJ1aWx0IHZpYQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhRGV2aWNlLmh0bWwjY3JlYXRlQ2FwdHVyZVJlcXVlc3QoaW50LCI+U2V0KTwvYT4uPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUworICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZUyA9ICAgIC8vIGludDMyW25dCisgICAgICAgICAgICBBQ0FNRVJBX1JFUVVFU1RfU1RBUlQgKyAxNywKICAgICBBQ0FNRVJBX1JFUVVFU1RfRU5ELAogCiAgICAgLyoqCkBAIC0zMjUxLDYgKzMyOTEsNyBAQAogICAgICAqIDxsaT57QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4OCB9PC9saT4KICAgICAgKiA8bGk+e0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTAgfTwvbGk+CiAgICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX1JBVzEyIH08L2xpPgorICAgICAqIDxsaT57QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZOCB9PC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDxwPkFsbCBvdGhlciBmb3JtYXRzIG1heSBvciBtYXkgbm90IGhhdmUgYW4gYWxsb3dlZCBzdGFsbCBkdXJhdGlvbiBvbgogICAgICAqIGEgcGVyLWNhcGFiaWxpdHkgYmFzaXM7IHJlZmVyIHRvIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTCkBAIC0zMjg4LDYgKzMzMjksODEgQEAKICAgICAgKi8KICAgICBBQ0FNRVJBX1NDQUxFUl9DUk9QUElOR19UWVBFID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfY3JvcHBpbmdfdHlwZV90KQogICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfU1RBUlQgKyAxMywKKyAgICAvKioKKyAgICAgKiA8cD5SZWNvbW1lbmRlZCBzdHJlYW0gY29uZmlndXJhdGlvbnMgZm9yIGNvbW1vbiBjbGllbnQgdXNlIGNhc2VzLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDMyW24qNV0gKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NjYWxlcl9hdmFpbGFibGVfcmVjb21tZW5kZWRfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX3QpPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPk9wdGlvbmFsIHN1YnNldCBvZiB0aGUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyB0aGF0IGNvbnRhaW5zCisgICAgICogc2ltaWxhciB0dXBsZXMgbGlzdGVkIGFzCisgICAgICogKGkuZS4gd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBvdXRwdXQvaW5wdXQgc3RyZWFtLCB1c2VjYXNlIGJpdCBmaWVsZCkuCisgICAgICogQ2FtZXJhIGRldmljZXMgd2lsbCBiZSBhYmxlIHRvIHN1Z2dlc3QgcGFydGljdWxhciBzdHJlYW0gY29uZmlndXJhdGlvbnMgd2hpY2ggYXJlCisgICAgICogcG93ZXIgYW5kIHBlcmZvcm1hbmNlIGVmZmljaWVudCBmb3Igc3BlY2lmaWMgdXNlIGNhc2VzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dAorICAgICAqIHJldHJpZXZpbmcgdGhlIHN1Z2dlc3Rpb25zIHNlZQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmh0bWwjZ2V0UmVjb21tZW5kZWRTdHJlYW1Db25maWd1cmF0aW9uTWFwIj5DYW1lcmFDaGFyYWN0ZXJpc3RpY3MjZ2V0UmVjb21tZW5kZWRTdHJlYW1Db25maWd1cmF0aW9uTWFwPC9hPi48L3A+CisgICAgICogPHA+VGhlIGRhdGEgcmVwcmVzZW50YXRpb24gaXMgaW50WzVdLCB3aGljaCBtYXBzIHRvCisgICAgICogKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgb3V0cHV0L2lucHV0IHN0cmVhbSwgdXNlY2FzZSBiaXQgZmllbGQpLiBUaGUgYXJyYXkgY2FuIGJlCisgICAgICogcGFyc2VkIHVzaW5nIHRoZSBmb2xsb3dpbmcgcHNldWRvIGNvZGU6PC9wPgorICAgICAqIDxwPnN0cnVjdCBTdHJlYW1Db25maWd1cmF0aW9uIHsKKyAgICAgKiBpbnQzMl90IGZvcm1hdDsKKyAgICAgKiBpbnQzMl90IHdpZHRoOworICAgICAqIGludDMyX3QgaGVpZ2h0OworICAgICAqIGludDMyX3QgaXNJbnB1dDsgfTs8L3A+CisgICAgICogPHA+dm9pZCBnZXRQcmVmZXJyZWRTdHJlYW1Db25maWd1cmF0aW9ucygKKyAgICAgKiAgICAgaW50MzJfdCAqYXJyYXksIHNpemVfdCBjb3VudCwgaW50MzJfdCB1c2VjYXNlSWQsCisgICAgICogICAgIFZlY3RvciAmbHQ7IFN0cmVhbUNvbmZpZ3VyYXRpb24gJmd0OyAqIHNjcykgeworICAgICAqICAgICBjb25zdCBzaXplX3QgU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSA9IDU7CisgICAgICogICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fV0lEVEhfT0ZGU0VUID0gMDsKKyAgICAgKiAgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9IRUlHSFRfT0ZGU0VUID0gMTsKKyAgICAgKiAgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9GT1JNQVRfT0ZGU0VUID0gMjsKKyAgICAgKiAgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9JU19JTlBVVF9PRkZTRVQgPSAzOworICAgICAqICAgICBjb25zdCBzaXplX3QgU1RSRUFNX1VTRUNBU0VfQklUTUFQX09GRlNFVCA9IDQ7PC9wPgorICAgICAqIDxwcmU+PGNvZGU+Zm9yIChzaXplX3QgaSA9IDA7IGkgJmx0OyBjb3VudDsgaSs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICAgKiAgICAgaW50MzJfdCB3aWR0aCA9IGFycmF5W2kgKyBTVFJFQU1fV0lEVEhfT0ZGU0VUXTsKKyAgICAgKiAgICAgaW50MzJfdCBoZWlnaHQgPSBhcnJheVtpICsgU1RSRUFNX0hFSUdIVF9PRkZTRVRdOworICAgICAqICAgICBpbnQzMl90IGZvcm1hdCA9IGFycmF5W2kgKyBTVFJFQU1fRk9STUFUX09GRlNFVF07CisgICAgICogICAgIGludDMyX3QgaXNJbnB1dCA9IGFycmF5W2kgKyBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUXTsKKyAgICAgKiAgICAgaW50MzJfdCBzdXBwb3J0ZWRVc2VjYXNlcyA9IGFycmF5W2kgKyBTVFJFQU1fVVNFQ0FTRV9CSVRNQVBfT0ZGU0VUXTsKKyAgICAgKiAgICAgaWYgKHN1cHBvcnRlZFVzZWNhc2VzICZhbXA7ICgxICZsdDsmbHQ7IHVzZWNhc2VJZCkpIHsKKyAgICAgKiAgICAgICAgIFN0cmVhbUNvbmZpZ3VyYXRpb24gc2MgPSB7Zm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBpc0lucHV0fTsKKyAgICAgKiAgICAgICAgIHNjcy0mZ3Q7YWRkKHNjKTsKKyAgICAgKiAgICAgfQorICAgICAqIH0KKyAgICAgKiA8L2NvZGU+PC9wcmU+CisgICAgICogPHA+fTwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUworICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlMgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMltuKjVdIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfYXZhaWxhYmxlX3JlY29tbWVuZGVkX3N0cmVhbV9jb25maWd1cmF0aW9uc190KQorICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfU1RBUlQgKyAxNCwKKyAgICAvKioKKyAgICAgKiA8cD5SZWNvbW1lbmRlZCBtYXBwaW5ncyBvZiBpbWFnZSBmb3JtYXRzIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGlzCisgICAgICogY2FtZXJhIGRldmljZSBmb3IgaW5wdXQgc3RyZWFtcywgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBvdXRwdXQgZm9ybWF0cy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQzMjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIGlzIGEgcmVjb21tZW5kZWQgc3Vic2V0IG9mIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1hcHBpbmdzIGZvdW5kIGluCisgICAgICogYW5kcm9pZC5zY2FsZXIuYXZhaWxhYmxlSW5wdXRPdXRwdXRGb3JtYXRzTWFwLiBUaGUgc2FtZSByZXF1aXJlbWVudHMgYXBwbHkgaGVyZSBhcyB3ZWxsLgorICAgICAqIFRoZSBsaXN0IGhvd2V2ZXIgZG9lc24ndCBuZWVkIHRvIGNvbnRhaW4gYWxsIGF2YWlsYWJsZSBhbmQgc3VwcG9ydGVkIG1hcHBpbmdzLiBJbnN0ZWFkIG9mCisgICAgICogdGhpcyBkZXZlbG9wZXJzIG11c3QgbGlzdCBvbmx5IHJlY29tbWVuZGVkIGFuZCBlZmZpY2llbnQgZW50cmllcy4KKyAgICAgKiBJZiBzZXQsIHRoZSBpbmZvcm1hdGlvbiB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgWkVST19TSFVUVEVSX0xBRyByZWNvbW1lbmRlZCBzdHJlYW0KKyAgICAgKiBjb25maWd1cmF0aW9uIHNlZQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmh0bWwjZ2V0UmVjb21tZW5kZWRTdHJlYW1Db25maWd1cmF0aW9uTWFwIj5DYW1lcmFDaGFyYWN0ZXJpc3RpY3MjZ2V0UmVjb21tZW5kZWRTdHJlYW1Db25maWd1cmF0aW9uTWFwPC9hPi48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX0lOUFVUX09VVFBVVF9GT1JNQVRTX01BUCA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludDMyCisgICAgICAgICAgICBBQ0FNRVJBX1NDQUxFUl9TVEFSVCArIDE1LAogICAgIEFDQU1FUkFfU0NBTEVSX0VORCwKIAogICAgIC8qKgpAQCAtMzQ0OCw2ICszNTY0LDggQEAKICAgICAgKiA8cD5Tb21lIGRldmljZXMgbWF5IGNob29zZSB0byBwcm92aWRlIGEgc2Vjb25kIHNldCBvZiBjYWxpYnJhdGlvbgogICAgICAqIGluZm9ybWF0aW9uIGZvciBpbXByb3ZlZCBxdWFsaXR5LCBpbmNsdWRpbmcKICAgICAgKiBBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDIgYW5kIGl0cyBjb3JyZXNwb25kaW5nIG1hdHJpY2VzLjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTEKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NPTE9SX1RSQU5TRk9STTEKQEAgLTM0NzcsNiArMzU5NSw4IEBACiAgICAgICogPHA+SWYgdGhpcyBrZXkgaXMgcHJlc2VudCwgdGhlbiBBQ0FNRVJBX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0yLAogICAgICAqIEFDQU1FUkFfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTIsIGFuZAogICAgICAqIEFDQU1FUkFfU0VOU09SX0ZPUldBUkRfTUFUUklYMiB3aWxsIGFsc28gYmUgcHJlc2VudC48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgZm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGV2ZW4gaWYKKyAgICAgKiB0aGUgY2FtZXJhIGRldmljZSBoYXMgUkFXIGNhcGFiaWxpdHkuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0yCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0yCkBAIC0zNTA0LDYgKzM2MjQsOCBAQAogICAgICAqIGNvbG9yc3BhY2UpIGludG8gdGhpcyBjYW1lcmEgZGV2aWNlJ3MgbmF0aXZlIHNlbnNvciBjb2xvcgogICAgICAqIHNwYWNlIHVuZGVyIHRoZSBmaXJzdCByZWZlcmVuY2UgaWxsdW1pbmFudAogICAgICAqIChBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDEpLjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMQogICAgICAqLwpAQCAtMzUzMSw2ICszNjUzLDggQEAKICAgICAgKiAoQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyKS48L3A+CiAgICAgICogPHA+VGhpcyBtYXRyaXggd2lsbCBvbmx5IGJlIHByZXNlbnQgaWYgdGhlIHNlY29uZCByZWZlcmVuY2UKICAgICAgKiBpbGx1bWluYW50IGlzIHByZXNlbnQuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyCiAgICAgICovCkBAIC0zNTU5LDYgKzM2ODMsOCBAQAogICAgICAqIGFuZCB0aGUgQ0lFIFhZWiBjb2xvcnNwYWNlIHdoZW4gY2FsY3VsYXRpbmcgdGhpcyB0cmFuc2Zvcm0gd2lsbAogICAgICAqIG1hdGNoIHRoZSBzdGFuZGFyZCB3aGl0ZSBwb2ludCBmb3IgdGhlIGZpcnN0IHJlZmVyZW5jZSBpbGx1bWluYW50CiAgICAgICogKGkuZS4gbm8gY2hyb21hdGljIGFkYXB0YXRpb24gd2lsbCBiZSBhcHBsaWVkIGJ5IHRoaXMgdHJhbnNmb3JtKS48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgZm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGV2ZW4gaWYKKyAgICAgKiB0aGUgY2FtZXJhIGRldmljZSBoYXMgUkFXIGNhcGFiaWxpdHkuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDEKICAgICAgKi8KQEAgLTM1ODksNiArMzcxNSw4IEBACiAgICAgICogKGkuZS4gbm8gY2hyb21hdGljIGFkYXB0YXRpb24gd2lsbCBiZSBhcHBsaWVkIGJ5IHRoaXMgdHJhbnNmb3JtKS48L3A+CiAgICAgICogPHA+VGhpcyBtYXRyaXggd2lsbCBvbmx5IGJlIHByZXNlbnQgaWYgdGhlIHNlY29uZCByZWZlcmVuY2UKICAgICAgKiBpbGx1bWluYW50IGlzIHByZXNlbnQuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyCiAgICAgICovCkBAIC0zNjE1LDYgKzM3NDMsOCBAQAogICAgICAqIHRoaXMgbWF0cml4IGlzIGNob3NlbiBzbyB0aGF0IHRoZSBzdGFuZGFyZCB3aGl0ZSBwb2ludCBmb3IgdGhpcyByZWZlcmVuY2UKICAgICAgKiBpbGx1bWluYW50IGluIHRoZSByZWZlcmVuY2Ugc2Vuc29yIGNvbG9yc3BhY2UgaXMgbWFwcGVkIHRvIEQ1MCBpbiB0aGUKICAgICAgKiBDSUUgWFlaIGNvbG9yc3BhY2UuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxCiAgICAgICovCkBAIC0zNjQzLDYgKzM3NzMsOCBAQAogICAgICAqIENJRSBYWVogY29sb3JzcGFjZS48L3A+CiAgICAgICogPHA+VGhpcyBtYXRyaXggd2lsbCBvbmx5IGJlIHByZXNlbnQgaWYgdGhlIHNlY29uZCByZWZlcmVuY2UKICAgICAgKiBpbGx1bWluYW50IGlzIHByZXNlbnQuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyCiAgICAgICovCkBAIC0zNjc1LDYgKzM4MDcsNyBAQAogICAgICAqIGxldmVsIHZhbHVlcy4gRm9yIHJhdyBjYXB0dXJlIGluIHBhcnRpY3VsYXIsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZQogICAgICAqIHBpeGVscyBmcm9tIEFDQU1FUkFfU0VOU09SX09QVElDQUxfQkxBQ0tfUkVHSU9OUyB0byBjYWxjdWxhdGUgYmxhY2sKICAgICAgKiBsZXZlbCB2YWx1ZXMgZm9yIGVhY2ggZnJhbWUuPC9wPgorICAgICAqIDxwPkZvciBhIE1PTk9DSFJPTUUgY2FtZXJhIGRldmljZSwgYWxsIG9mIHRoZSAyeDIgY2hhbm5lbHMgbXVzdCBoYXZlIHRoZSBzYW1lIHZhbHVlcy48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0RZTkFNSUNfQkxBQ0tfTEVWRUwKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UCkBAIC0zNzY5LDYgKzM5MDIsOCBAQAogICAgICAqIHVzZWQgdG8gaW50ZXJwb2xhdGUgYmV0d2VlbiB0aGUgcHJvdmlkZWQgY29sb3IgdHJhbnNmb3JtcyB3aGVuCiAgICAgICogcHJvY2Vzc2luZyByYXcgc2Vuc29yIGRhdGEuPC9wPgogICAgICAqIDxwPlRoZSBvcmRlciBvZiB0aGUgdmFsdWVzIGlzIFIsIEcsIEI7IHdoZXJlIFIgaXMgaW4gdGhlIGxvd2VzdCBpbmRleC48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgZm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGV2ZW4gaWYKKyAgICAgKiB0aGUgY2FtZXJhIGRldmljZSBoYXMgUkFXIGNhcGFiaWxpdHkuPC9wPgogICAgICAqLwogICAgIEFDQU1FUkFfU0VOU09SX05FVVRSQUxfQ09MT1JfUE9JTlQgPSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhdGlvbmFsWzNdCiAgICAgICAgICAgICBBQ0FNRVJBX1NFTlNPUl9TVEFSVCArIDE4LApAQCAtMzc5OSw2ICszOTM0LDggQEAKICAgICAgKiB0aGF0IGNoYW5uZWwuPC9wPgogICAgICAqIDxwPkEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgbm9pc2UgbW9kZWwgY2FuIGJlIGZvdW5kIGluIHRoZQogICAgICAqIEFkb2JlIERORyBzcGVjaWZpY2F0aW9uIGZvciB0aGUgTm9pc2VQcm9maWxlIHRhZy48L3A+CisgICAgICogPHA+Rm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIHRoZXJlIGlzIG9ubHkgb25lIGNvbG9yIGNoYW5uZWwuIFNvIHRoZSBub2lzZSBtb2RlbCBjb2VmZmljaWVudHMKKyAgICAgKiB3aWxsIG9ubHkgY29udGFpbiBvbmUgUyBhbmQgb25lIE8uPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVAogICAgICAqLwpAQCAtMzg0NCw2ICszOTgxLDggQEAKICAgICAgKiA8bGk+UiAmZ3Q7IDEuMjAgd2lsbCByZXF1aXJlIHN0cm9uZyBzb2Z0d2FyZSBjb3JyZWN0aW9uIHRvIHByb2R1Y2UKICAgICAgKiBhIHVzdWFibGUgaW1hZ2UgKCZndDsyMCUgZGl2ZXJnZW5jZSkuPC9saT4KICAgICAgKiA8L3VsPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX1NFTlNPUl9HUkVFTl9TUExJVCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdAogICAgICAgICAgICAgQUNBTUVSQV9TRU5TT1JfU1RBUlQgKyAyMiwKQEAgLTM5OTYsNiArNDEzNSw3IEBACiAgICAgICogbGF5b3V0IGtleSAoc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UKSwgaS5lLiB0aGUKICAgICAgKiBudGggdmFsdWUgZ2l2ZW4gY29ycmVzcG9uZHMgdG8gdGhlIGJsYWNrIGxldmVsIG9mZnNldCBmb3IgdGhlIG50aAogICAgICAqIGNvbG9yIGNoYW5uZWwgbGlzdGVkIGluIHRoZSBDRkEuPC9wPgorICAgICAqIDxwPkZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBhbGwgb2YgdGhlIDJ4MiBjaGFubmVscyBtdXN0IGhhdmUgdGhlIHNhbWUgdmFsdWVzLjwvcD4KICAgICAgKiA8cD5UaGlzIGtleSB3aWxsIGJlIGF2YWlsYWJsZSBpZiBBQ0FNRVJBX1NFTlNPUl9PUFRJQ0FMX0JMQUNLX1JFR0lPTlMgaXMgYXZhaWxhYmxlIG9yIHRoZQogICAgICAqIGNhbWVyYSBkZXZpY2UgYWR2ZXJ0aXNlcyB0aGlzIGtleSB2aWEge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVMgfS48L3A+CiAgICAgICoKQEAgLTQwOTgsNyArNDIzOCw4IEBACiAgICAgLyoqCiAgICAgICogPHA+VGhlIGFycmFuZ2VtZW50IG9mIGNvbG9yIGZpbHRlcnMgb24gc2Vuc29yOwogICAgICAqIHJlcHJlc2VudHMgdGhlIGNvbG9ycyBpbiB0aGUgdG9wLWxlZnQgMngyIHNlY3Rpb24gb2YKLSAgICAgKiB0aGUgc2Vuc29yLCBpbiByZWFkaW5nIG9yZGVyLjwvcD4KKyAgICAgKiB0aGUgc2Vuc29yLCBpbiByZWFkaW5nIG9yZGVyLCBmb3IgYSBCYXllciBjYW1lcmEsIG9yIHRoZQorICAgICAqIGxpZ2h0IHNwZWN0cnVtIGl0IGNhcHR1cmVzIGZvciBNT05PQ0hST01FIGNhbWVyYS48L3A+CiAgICAgICoKICAgICAgKiA8cD5UeXBlOiBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zZW5zb3JfaW5mb19jb2xvcl9maWx0ZXJfYXJyYW5nZW1lbnRfdCk8L3A+CiAgICAgICoKQEAgLTQ1NjcsMTMgKzQ3MDgsMTMgQEAKICAgICAgKiAoeCx5KSDPtSAoMCAuLi4gTi0xLCAwIC4uLiBNLTEpIGlzIHRoZSB2YWx1ZSBvZiB0aGUgc2hhZGluZyBtYXAgYXQKICAgICAgKiBwaXhlbCAoICgoVy0xKS8oTi0xKSkgKiB4LCAoKEgtMSkvKE0tMSkpICogeSkgZm9yIHRoZSBmb3VyIGNvbG9yIGNoYW5uZWxzLgogICAgICAqIFRoZSBtYXAgaXMgYXNzdW1lZCB0byBiZSBiaWxpbmVhcmx5IGludGVycG9sYXRlZCBiZXR3ZWVuIHRoZSBzYW1wbGUgcG9pbnRzLjwvcD4KLSAgICAgKiA8cD5UaGUgY2hhbm5lbCBvcmRlciBpcyBbUiwgR2V2ZW4sIEdvZGQsIEJdLCB3aGVyZSBHZXZlbiBpcyB0aGUgZ3JlZW4KLSAgICAgKiBjaGFubmVsIGZvciB0aGUgZXZlbiByb3dzIG9mIGEgQmF5ZXIgcGF0dGVybiwgYW5kIEdvZGQgaXMgdGhlIG9kZCByb3dzLgorICAgICAqIDxwPkZvciBhIEJheWVyIGNhbWVyYSwgdGhlIGNoYW5uZWwgb3JkZXIgaXMgW1IsIEdldmVuLCBHb2RkLCBCXSwgd2hlcmUgR2V2ZW4gaXMKKyAgICAgKiB0aGUgZ3JlZW4gY2hhbm5lbCBmb3IgdGhlIGV2ZW4gcm93cyBvZiBhIEJheWVyIHBhdHRlcm4sIGFuZCBHb2RkIGlzIHRoZSBvZGQgcm93cy4KICAgICAgKiBUaGUgc2hhZGluZyBtYXAgaXMgc3RvcmVkIGluIGEgZnVsbHkgaW50ZXJsZWF2ZWQgZm9ybWF0LCBhbmQgaXRzIHNpemUKICAgICAgKiBpcyBwcm92aWRlZCBpbiB0aGUgY2FtZXJhIHN0YXRpYyBtZXRhZGF0YSBieSBBQ0FNRVJBX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFLjwvcD4KICAgICAgKiA8cD5UaGUgc2hhZGluZyBtYXAgd2lsbCBnZW5lcmFsbHkgaGF2ZSBvbiB0aGUgb3JkZXIgb2YgMzAtNDAgcm93cyBhbmQgY29sdW1ucywKICAgICAgKiBhbmQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gNjR4NjQuPC9wPgotICAgICAqIDxwPkFzIGFuIGV4YW1wbGUsIGdpdmVuIGEgdmVyeSBzbWFsbCBtYXAgZGVmaW5lZCBhczo8L3A+CisgICAgICogPHA+QXMgYW4gZXhhbXBsZSwgZ2l2ZW4gYSB2ZXJ5IHNtYWxsIG1hcCBmb3IgYSBCYXllciBjYW1lcmEgZGVmaW5lZCBhczo8L3A+CiAgICAgICogPHByZT48Y29kZT5BQ0FNRVJBX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFID0gWyA0LCAzIF0KICAgICAgKiBBQ0FNRVJBX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUCA9CiAgICAgICogWyAxLjMsIDEuMiwgMS4xNSwgMS4yLCAgMS4yLCAxLjIsIDEuMTUsIDEuMiwKQEAgLTQ1OTMsNiArNDczNCwxNyBAQAogICAgICAqIGltYWdlIG9mIGEgZ3JheSB3YWxsICh1c2luZyBiaWN1YmljIGludGVycG9sYXRpb24gZm9yIHZpc3VhbCBxdWFsaXR5KQogICAgICAqIGFzIGNhcHR1cmVkIGJ5IHRoZSBzZW5zb3IgZ2l2ZXM6PC9wPgogICAgICAqIDxwPjxpbWcgYWx0PSJJbWFnZSBvZiBhIHVuaWZvcm0gd2hpdGUgd2FsbCAoaW52ZXJzZSBzaGFkaW5nIG1hcCkiIHNyYz0iLi4vaW1hZ2VzL2NhbWVyYTIvbWV0YWRhdGEvYW5kcm9pZC5zdGF0aXN0aWNzLmxlbnNTaGFkaW5nTWFwL2ludl9zaGFkaW5nLnBuZyIgLz48L3A+CisgICAgICogPHA+Rm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGFsbCBvZiB0aGUgMngyIGNoYW5uZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSB2YWx1ZXMuIEFuIGV4YW1wbGUKKyAgICAgKiBzaGFkaW5nIG1hcCBmb3Igc3VjaCBhIGNhbWVyYSBpcyBkZWZpbmVkIGFzOjwvcD4KKyAgICAgKiA8cHJlPjxjb2RlPkFDQU1FUkFfTEVOU19JTkZPX1NIQURJTkdfTUFQX1NJWkUgPSBbIDQsIDMgXQorICAgICAqIEFDQU1FUkFfU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQID0KKyAgICAgKiBbIDEuMywgMS4zLCAxLjMsIDEuMywgIDEuMiwgMS4yLCAxLjIsIDEuMiwKKyAgICAgKiAgICAgMS4xLCAxLjEsIDEuMSwgMS4xLCAgMS4zLCAxLjMsIDEuMywgMS4zLAorICAgICAqICAgMS4yLCAxLjIsIDEuMiwgMS4yLCAgMS4xLCAxLjEsIDEuMSwgMS4xLAorICAgICAqICAgICAxLjAsIDEuMCwgMS4wLCAxLjAsICAxLjIsIDEuMiwgMS4yLCAxLjIsCisgICAgICogICAxLjMsIDEuMywgMS4zLCAxLjMsICAgMS4yLCAxLjIsIDEuMiwgMS4yLAorICAgICAqICAgICAxLjIsIDEuMiwgMS4yLCAxLjIsICAxLjMsIDEuMywgMS4zLCAxLjMgXQorICAgICAqIDwvY29kZT48L3ByZT4KICAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIFJBVyBpbWFnZSBkYXRhIG1pZ2h0IGJlIHN1YmplY3QgdG8gbGVucyBzaGFkaW5nCiAgICAgICogY29ycmVjdGlvbiBub3QgcmVwb3J0ZWQgb24gdGhpcyBtYXAuIFF1ZXJ5CiAgICAgICogQUNBTUVSQV9TRU5TT1JfSU5GT19MRU5TX1NIQURJTkdfQVBQTElFRCB0byBzZWUgaWYgUkFXIGltYWdlIGRhdGEgaGFzIHN1YmplY3QKQEAgLTQ5MzYsOCArNTA4OCw4IEBACiAgICAgICogb2YgcG9pbnRzIGNhbiBiZSBsZXNzIHRoYW4gbWF4ICh0aGF0IGlzLCB0aGUgcmVxdWVzdCBkb2Vzbid0IGhhdmUgdG8KICAgICAgKiBhbHdheXMgcHJvdmlkZSBhIGN1cnZlIHdpdGggbnVtYmVyIG9mIHBvaW50cyBlcXVpdmFsZW50IHRvCiAgICAgICogQUNBTUVSQV9UT05FTUFQX01BWF9DVVJWRV9QT0lOVFMpLjwvcD4KLSAgICAgKiA8cD5Gb3IgZGV2aWNlcyB3aXRoIE1PTk9DSFJPTUUgY2FwYWJpbGl0eSwgb25seSByZWQgY2hhbm5lbCBpcyB1c2VkLiBHcmVlbiBhbmQgYmx1ZSBjaGFubmVscwotICAgICAqIGFyZSBpZ25vcmVkLjwvcD4KKyAgICAgKiA8cD5Gb3IgZGV2aWNlcyB3aXRoIE1PTk9DSFJPTUUgY2FwYWJpbGl0eSwgYWxsIHRocmVlIGNoYW5uZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBzZXQgb2YKKyAgICAgKiBjb250cm9sIHBvaW50cy48L3A+CiAgICAgICogPHA+QSBmZXcgZXhhbXBsZXMsIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIGdyYXBoaWNhbCBtYXBwaW5nczsgdGhlc2UKICAgICAgKiBvbmx5IHNwZWNpZnkgdGhlIHJlZCBjaGFubmVsIGFuZCB0aGUgcHJlY2lzaW9uIGlzIGxpbWl0ZWQgdG8gNAogICAgICAqIGRpZ2l0cywgZm9yIGNvbmNpc2VuZXNzLjwvcD4KQEAgLTU0MTEsOSArNTU2MywxMjEgQEAKICAgICAgKi8KICAgICBBQ0FNRVJBX0RFUFRIX0RFUFRIX0lTX0VYQ0xVU0lWRSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9kZXB0aF9kZXB0aF9pc19leGNsdXNpdmVfdCkKICAgICAgICAgICAgIEFDQU1FUkFfREVQVEhfU1RBUlQgKyA0LAorICAgIC8qKgorICAgICAqIDxwPlJlY29tbWVuZGVkIGRlcHRoIHN0cmVhbSBjb25maWd1cmF0aW9ucyBmb3IgY29tbW9uIGNsaWVudCB1c2UgY2FzZXMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50MzJbbio1XTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5PcHRpb25hbCBzdWJzZXQgb2YgdGhlIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUyB0aGF0CisgICAgICogY29udGFpbnMgc2ltaWxhciB0dXBsZXMgbGlzdGVkIGFzCisgICAgICogKGkuZS4gd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBvdXRwdXQvaW5wdXQgc3RyZWFtLCB1c2VjYXNlIGJpdCBmaWVsZCkuCisgICAgICogQ2FtZXJhIGRldmljZXMgd2lsbCBiZSBhYmxlIHRvIHN1Z2dlc3QgcGFydGljdWxhciBkZXB0aCBzdHJlYW0gY29uZmlndXJhdGlvbnMgd2hpY2ggYXJlCisgICAgICogcG93ZXIgYW5kIHBlcmZvcm1hbmNlIGVmZmljaWVudCBmb3Igc3BlY2lmaWMgdXNlIGNhc2VzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dAorICAgICAqIHJldHJpZXZpbmcgdGhlIHN1Z2dlc3Rpb25zIHNlZQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmh0bWwjZ2V0UmVjb21tZW5kZWRTdHJlYW1Db25maWd1cmF0aW9uTWFwIj5DYW1lcmFDaGFyYWN0ZXJpc3RpY3MjZ2V0UmVjb21tZW5kZWRTdHJlYW1Db25maWd1cmF0aW9uTWFwPC9hPi48L3A+CisgICAgICogPHA+Rm9yIGRhdGEgcmVwcmVzZW50YXRpb24gcGxlYXNlIHJlZmVyIHRvCisgICAgICogQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OUzwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TCisgICAgICogQHNlZSBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TCisgICAgICovCisgICAgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfUkVDT01NRU5ERURfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50MzJbbio1XQorICAgICAgICAgICAgQUNBTUVSQV9ERVBUSF9TVEFSVCArIDUsCisgICAgLyoqCisgICAgICogPHA+VGhlIGF2YWlsYWJsZSBkeW5hbWljIGRlcHRoIGRhdGFzcGFjZSBzdHJlYW0KKyAgICAgKiBjb25maWd1cmF0aW9ucyB0aGF0IHRoaXMgY2FtZXJhIGRldmljZSBzdXBwb3J0cworICAgICAqIChpLmUuIGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgb3V0cHV0L2lucHV0IHN0cmVhbSkuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50MzJbbio0XSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGVwdGhfYXZhaWxhYmxlX2R5bmFtaWNfZGVwdGhfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX3QpPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoZXNlIGFyZSBvdXRwdXQgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIGZvciB1c2Ugd2l0aAorICAgICAqIGRhdGFTcGFjZSBEWU5BTUlDX0RFUFRILiBUaGUgY29uZmlndXJhdGlvbnMgYXJlCisgICAgICogbGlzdGVkIGFzIDxjb2RlPihmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGlucHV0Pyk8L2NvZGU+IHR1cGxlcy48L3A+CisgICAgICogPHA+T25seSBkZXZpY2VzIHRoYXQgc3VwcG9ydCBkZXB0aCBvdXRwdXQgZm9yIGF0IGxlYXN0CisgICAgICogdGhlIEhBTF9QSVhFTF9GT1JNQVRfWTE2IGRlbnNlIGRlcHRoIG1hcCBhbG9uZyB3aXRoCisgICAgICogSEFMX1BJWEVMX0ZPUk1BVF9CTE9CIHdpdGggdGhlIHNhbWUgc2l6ZSBvciBzaXplIHdpdGgKKyAgICAgKiB0aGUgc2FtZSBhc3BlY3QgcmF0aW8gY2FuIGhhdmUgZHluYW1pYyBkZXB0aCBkYXRhc3BhY2UKKyAgICAgKiBzdHJlYW0gY29uZmlndXJhdGlvbi4gQUNBTUVSQV9ERVBUSF9ERVBUSF9JU19FWENMVVNJVkUgYWxzbworICAgICAqIG5lZWRzIHRvIGJlIHNldCB0byBGQUxTRS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfREVQVEhfREVQVEhfSVNfRVhDTFVTSVZFCisgICAgICovCisgICAgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMltuKjRdIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9kZXB0aF9hdmFpbGFibGVfZHluYW1pY19kZXB0aF9zdHJlYW1fY29uZmlndXJhdGlvbnNfdCkKKyAgICAgICAgICAgIEFDQU1FUkFfREVQVEhfU1RBUlQgKyA2LAorICAgIC8qKgorICAgICAqIDxwPlRoaXMgbGlzdHMgdGhlIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gZm9yIGVhY2gKKyAgICAgKiBmb3JtYXQvc2l6ZSBjb21iaW5hdGlvbiBmb3IgZHluYW1pYyBkZXB0aCBvdXRwdXQgc3RyZWFtcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQ2NFs0Km5dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgc2hvdWxkIGNvcnJlc3BvbmQgdG8gdGhlIGZyYW1lIGR1cmF0aW9uIHdoZW4gb25seSB0aGF0CisgICAgICogc3RyZWFtIGlzIGFjdGl2ZSwgd2l0aCBhbGwgcHJvY2Vzc2luZyAodHlwaWNhbGx5IGluIGFuZHJvaWQuKi5tb2RlKQorICAgICAqIHNldCB0byBlaXRoZXIgT0ZGIG9yIEZBU1QuPC9wPgorICAgICAqIDxwPldoZW4gbXVsdGlwbGUgc3RyZWFtcyBhcmUgdXNlZCBpbiBhIHJlcXVlc3QsIHRoZSBtaW5pbXVtIGZyYW1lCisgICAgICogZHVyYXRpb24gd2lsbCBiZSBtYXgoaW5kaXZpZHVhbCBzdHJlYW0gbWluIGR1cmF0aW9ucykuPC9wPgorICAgICAqIDxwPlRoZSBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIG9mIGEgc3RyZWFtIChvZiBhIHBhcnRpY3VsYXIgZm9ybWF0LCBzaXplKQorICAgICAqIGlzIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgc3RyZWFtIGlzIGlucHV0IG9yIG91dHB1dC48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TID0gLy8gaW50NjRbNCpuXQorICAgICAgICAgICAgQUNBTUVSQV9ERVBUSF9TVEFSVCArIDcsCisgICAgLyoqCisgICAgICogPHA+VGhpcyBsaXN0cyB0aGUgbWF4aW11bSBzdGFsbCBkdXJhdGlvbiBmb3IgZWFjaAorICAgICAqIG91dHB1dCBmb3JtYXQvc2l6ZSBjb21iaW5hdGlvbiBmb3IgZHluYW1pYyBkZXB0aCBzdHJlYW1zLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDY0WzQqbl08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+QSBzdGFsbCBkdXJhdGlvbiBpcyBob3cgbXVjaCBleHRyYSB0aW1lIHdvdWxkIGdldCBhZGRlZAorICAgICAqIHRvIHRoZSBub3JtYWwgbWluaW11bSBmcmFtZSBkdXJhdGlvbiBmb3IgYSByZXBlYXRpbmcgcmVxdWVzdAorICAgICAqIHRoYXQgaGFzIHN0cmVhbXMgd2l0aCBub24temVybyBzdGFsbC48L3A+CisgICAgICogPHA+QWxsIGR5bmFtaWMgZGVwdGggb3V0cHV0IHN0cmVhbXMgbWF5IGhhdmUgYSBub256ZXJvIHN0YWxsCisgICAgICogZHVyYXRpb24uPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TID0gICAgIC8vIGludDY0WzQqbl0KKyAgICAgICAgICAgIEFDQU1FUkFfREVQVEhfU1RBUlQgKyA4LAogICAgIEFDQU1FUkFfREVQVEhfRU5ELAogCiAgICAgLyoqCisgICAgICogPHA+U3RyaW5nIGNvbnRhaW5pbmcgdGhlIGlkcyBvZiB0aGUgdW5kZXJseWluZyBwaHlzaWNhbCBjYW1lcmFzLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGJ5dGVbbl08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+Rm9yIGEgbG9naWNhbCBjYW1lcmEsIHRoaXMgaXMgY29uY2F0ZW5hdGlvbiBvZiBhbGwgdW5kZXJseWluZyBwaHlzaWNhbCBjYW1lcmEgSURzLgorICAgICAqIFRoZSBudWxsIHRlcm1pbmF0b3IgZm9yIHBoeXNpY2FsIGNhbWVyYSBJRCBtdXN0IGJlIHByZXNlcnZlZCBzbyB0aGF0IHRoZSB3aG9sZSBzdHJpbmcKKyAgICAgKiBjYW4gYmUgdG9rZW5pemVkIHVzaW5nICdcMCcgdG8gZ2VuZXJhdGUgbGlzdCBvZiBwaHlzaWNhbCBjYW1lcmEgSURzLjwvcD4KKyAgICAgKiA8cD5Gb3IgZXhhbXBsZSwgaWYgdGhlIHBoeXNpY2FsIGNhbWVyYSBJRHMgb2YgdGhlIGxvZ2ljYWwgY2FtZXJhIGFyZSAiMiIgYW5kICIzIiwgdGhlCisgICAgICogdmFsdWUgb2YgdGhpcyB0YWcgd2lsbCBiZSBbJzInLCAnXDAnLCAnMycsICdcMCddLjwvcD4KKyAgICAgKiA8cD5UaGUgbnVtYmVyIG9mIHBoeXNpY2FsIGNhbWVyYSBJRHMgbXVzdCBiZSBubyBsZXNzIHRoYW4gMi48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9QSFlTSUNBTF9JRFMgPSAgICAgICAgICAgICAgICAgLy8gYnl0ZVtuXQorICAgICAgICAgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TVEFSVCwKKyAgICAvKioKICAgICAgKiA8cD5UaGUgYWNjdXJhY3kgb2YgZnJhbWUgdGltZXN0YW1wIHN5bmNocm9uaXphdGlvbiBiZXR3ZWVuIHBoeXNpY2FsIGNhbWVyYXM8L3A+CiAgICAgICoKICAgICAgKiA8cD5UeXBlOiBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9sb2dpY2FsX211bHRpX2NhbWVyYV9zZW5zb3Jfc3luY190eXBlX3QpPC9wPgpAQCAtNTQzNCw2ICs1Njk4LDMyIEBACiAgICAgICovCiAgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TRU5TT1JfU1lOQ19UWVBFID0gICAgICAgICAgICAgLy8gYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfbG9naWNhbF9tdWx0aV9jYW1lcmFfc2Vuc29yX3N5bmNfdHlwZV90KQogICAgICAgICAgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TVEFSVCArIDEsCisgICAgLyoqCisgICAgICogPHA+U3RyaW5nIGNvbnRhaW5pbmcgdGhlIElEIG9mIHRoZSB1bmRlcmx5aW5nIGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogYnl0ZTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IGNhbGxiYWNrczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGUgSUQgb2YgdGhlIGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEgdGhhdCdzIGJhY2tpbmcgdGhlIGxvZ2ljYWwgY2FtZXJhLiBBbGwgY2FtZXJhCisgICAgICogc3RyZWFtcyBhbmQgbWV0YWRhdGEgdGhhdCBhcmUgbm90IHBoeXNpY2FsIGNhbWVyYSBzcGVjaWZpYyB3aWxsIGJlIG9yaWdpbmF0aW5nIGZyb20gdGhpcworICAgICAqIHBoeXNpY2FsIGNhbWVyYS48L3A+CisgICAgICogPHA+Rm9yIGEgbG9naWNhbCBjYW1lcmEgbWFkZSB1cCBvZiBwaHlzaWNhbCBjYW1lcmFzIHdoZXJlIGVhY2ggY2FtZXJhJ3MgbGVuc2VzIGhhdmUKKyAgICAgKiBkaWZmZXJlbnQgY2hhcmFjdGVyaXN0aWNzLCB0aGUgY2FtZXJhIGRldmljZSBtYXkgY2hvb3NlIHRvIHN3aXRjaCBiZXR3ZWVuIHRoZSBwaHlzaWNhbAorICAgICAqIGNhbWVyYXMgd2hlbiBhcHBsaWNhdGlvbiBjaGFuZ2VzIEZPQ0FMX0xFTkdUSCBvciBTQ0FMRVJfQ1JPUF9SRUdJT04uCisgICAgICogQXQgdGhlIHRpbWUgb2YgbGVucyBzd2l0Y2gsIHRoaXMgcmVzdWx0IG1ldGFkYXRhIHJlZmxlY3RzIHRoZSBuZXcgYWN0aXZlIHBoeXNpY2FsIGNhbWVyYQorICAgICAqIElELjwvcD4KKyAgICAgKiA8cD5UaGlzIGtleSB3aWxsIGJlIGF2YWlsYWJsZSBpZiB0aGUgY2FtZXJhIGRldmljZSBhZHZlcnRpc2VzIHRoaXMga2V5IHZpYSB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9SRVNVTFRfS0VZUyB9LgorICAgICAqIFdoZW4gYXZhaWxhYmxlLCB0aGlzIG11c3QgYmUgb25lIG9mIHZhbGlkIHBoeXNpY2FsIElEcyBiYWNraW5nIHRoaXMgbG9naWNhbCBtdWx0aS1jYW1lcmEuCisgICAgICogSWYgdGhpcyBrZXkgaXMgbm90IGF2YWlsYWJsZSBmb3IgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSwgdGhlIGNhbWVyYSBkZXZpY2UgaW1wbGVtZW50YXRpb24KKyAgICAgKiBtYXkgc3RpbGwgc3dpdGNoIGJldHdlZW4gZGlmZmVyZW50IGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmFzIGJhc2VkIG9uIHVzZSBjYXNlLCBidXQgdGhlCisgICAgICogY3VycmVudCBhY3RpdmUgcGh5c2ljYWwgY2FtZXJhIGluZm9ybWF0aW9uIHdvbid0IGJlIGF2YWlsYWJsZSB0byB0aGUgYXBwbGljYXRpb24uPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfQUNUSVZFX1BIWVNJQ0FMX0lEID0gICAgICAgICAgIC8vIGJ5dGUKKyAgICAgICAgICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfU1RBUlQgKyAyLAogICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfRU5ELAogCiAgICAgLyoqCkBAIC01NDU3LDggKzU3NDcsOCBAQAogICAgICAqIHdpbGwgbm90IHNsb3cgZG93biBjYXB0dXJlIHJhdGUgd2hlbiBhcHBseWluZyBjb3JyZWN0aW9uLiBGQVNUIG1heSBiZSB0aGUgc2FtZSBhcyBPRkYgaWYKICAgICAgKiBhbnkgY29ycmVjdGlvbiBhdCBhbGwgd291bGQgc2xvdyBkb3duIGNhcHR1cmUgcmF0ZS4gIEV2ZXJ5IG91dHB1dCBzdHJlYW0gd2lsbCBoYXZlIGEKICAgICAgKiBzaW1pbGFyIGFtb3VudCBvZiBlbmhhbmNlbWVudCBhcHBsaWVkLjwvcD4KLSAgICAgKiA8cD5UaGUgY29ycmVjdGlvbiBvbmx5IGFwcGxpZXMgdG8gcHJvY2Vzc2VkIG91dHB1dHMgc3VjaCBhcyBZVVYsIEpQRUcsIG9yIERFUFRIMTY7IGl0IGlzIG5vdAotICAgICAqIGFwcGxpZWQgdG8gYW55IFJBVyBvdXRwdXQuPC9wPgorICAgICAqIDxwPlRoZSBjb3JyZWN0aW9uIG9ubHkgYXBwbGllcyB0byBwcm9jZXNzZWQgb3V0cHV0cyBzdWNoIGFzIFlVViwgWTgsIEpQRUcsIG9yIERFUFRIMTY7IGl0IGlzCisgICAgICogbm90IGFwcGxpZWQgdG8gYW55IFJBVyBvdXRwdXQuPC9wPgogICAgICAqIDxwPlRoaXMgY29udHJvbCB3aWxsIGJlIG9uIGJ5IGRlZmF1bHQgb24gZGV2aWNlcyB0aGF0IHN1cHBvcnQgdGhpcyBjb250cm9sLiBBcHBsaWNhdGlvbnMKICAgICAgKiBkaXNhYmxpbmcgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIG5lZWQgdG8gcGF5IGV4dHJhIGF0dGVudGlvbiB3aXRoIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZgogICAgICAqIG1ldGVyaW5nIHJlZ2lvbnMsIGNyb3AgcmVnaW9uLCBhbmQgZmFjZSByZWN0YW5nbGVzLiBXaGVuIGRpc3RvcnRpb24gY29ycmVjdGlvbiBpcyBPRkYsCkBAIC01NTExLDYgKzU4MDEsODAgQEAKICAgICAgICAgICAgIEFDQU1FUkFfRElTVE9SVElPTl9DT1JSRUNUSU9OX1NUQVJUICsgMSwKICAgICBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTl9FTkQsCiAKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgYXZhaWxhYmxlIEhFSUMgKElTTy9JRUMgMjMwMDgtMTIpIHN0cmVhbQorICAgICAqIGNvbmZpZ3VyYXRpb25zIHRoYXQgdGhpcyBjYW1lcmEgZGV2aWNlIHN1cHBvcnRzCisgICAgICogKGkuZS4gZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBvdXRwdXQvaW5wdXQgc3RyZWFtKS48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQzMltuKjRdIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9oZWljX2F2YWlsYWJsZV9oZWljX3N0cmVhbV9jb25maWd1cmF0aW9uc190KTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGUgY29uZmlndXJhdGlvbnMgYXJlIGxpc3RlZCBhcyA8Y29kZT4oZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBpbnB1dD8pPC9jb2RlPiB0dXBsZXMuPC9wPgorICAgICAqIDxwPklmIHRoZSBjYW1lcmEgZGV2aWNlIHN1cHBvcnRzIEhFSUMgaW1hZ2UgZm9ybWF0LCBpdCB3aWxsIHN1cHBvcnQgaWRlbnRpY2FsIHNldCBvZiBzdHJlYW0KKyAgICAgKiBjb21iaW5hdGlvbnMgaW52b2x2aW5nIEhFSUMgaW1hZ2UgZm9ybWF0LCBjb21wYXJlZCB0byB0aGUgY29tYmluYXRpb25zIGludm9sdmluZyBKUEVHCisgICAgICogaW1hZ2UgZm9ybWF0IGFzIHJlcXVpcmVkIGJ5IHRoZSBkZXZpY2UncyBoYXJkd2FyZSBsZXZlbCBhbmQgY2FwYWJpbGl0aWVzLjwvcD4KKyAgICAgKiA8cD5BbGwgdGhlIHN0YXRpYywgY29udHJvbCwgYW5kIGR5bmFtaWMgbWV0YWRhdGEgdGFncyByZWxhdGVkIHRvIEpQRUcgYXBwbHkgdG8gSEVJQyBmb3JtYXRzLgorICAgICAqIENvbmZpZ3VyaW5nIEpQRUcgYW5kIEhFSUMgc3RyZWFtcyBhdCB0aGUgc2FtZSB0aW1lIGlzIG5vdCBzdXBwb3J0ZWQuPC9wPgorICAgICAqIDxwPkFsbCB0aGUgY29uZmlndXJhdGlvbiB0dXBsZXMgPGNvZGU+KGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgaW5wdXQ/KTwvY29kZT4gd2lsbCBjb250YWluCisgICAgICogQUlNQUdFX0ZPUk1BVF9IRUlDIGZvcm1hdCBhcyBPVVRQVVQgb25seS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OUyA9ICAgICAgICAgLy8gaW50MzJbbio0XSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfaGVpY19hdmFpbGFibGVfaGVpY19zdHJlYW1fY29uZmlndXJhdGlvbnNfdCkKKyAgICAgICAgICAgIEFDQU1FUkFfSEVJQ19TVEFSVCwKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGxpc3RzIHRoZSBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIGZvciBlYWNoCisgICAgICogZm9ybWF0L3NpemUgY29tYmluYXRpb24gZm9yIEhFSUMgb3V0cHV0IGZvcm1hdHMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50NjRbNCpuXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHNob3VsZCBjb3JyZXNwb25kIHRvIHRoZSBmcmFtZSBkdXJhdGlvbiB3aGVuIG9ubHkgdGhhdAorICAgICAqIHN0cmVhbSBpcyBhY3RpdmUsIHdpdGggYWxsIHByb2Nlc3NpbmcgKHR5cGljYWxseSBpbiBhbmRyb2lkLioubW9kZSkKKyAgICAgKiBzZXQgdG8gZWl0aGVyIE9GRiBvciBGQVNULjwvcD4KKyAgICAgKiA8cD5XaGVuIG11bHRpcGxlIHN0cmVhbXMgYXJlIHVzZWQgaW4gYSByZXF1ZXN0LCB0aGUgbWluaW11bSBmcmFtZQorICAgICAqIGR1cmF0aW9uIHdpbGwgYmUgbWF4KGluZGl2aWR1YWwgc3RyZWFtIG1pbiBkdXJhdGlvbnMpLjwvcD4KKyAgICAgKiA8cD5TZWUgQUNBTUVSQV9TRU5TT1JfRlJBTUVfRFVSQVRJT04gYW5kCisgICAgICogQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUyBmb3IgbW9yZSBkZXRhaWxzIGFib3V0CisgICAgICogY2FsY3VsYXRpbmcgdGhlIG1heCBmcmFtZSByYXRlLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUworICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfRlJBTUVfRFVSQVRJT04KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0hFSUNfQVZBSUxBQkxFX0hFSUNfTUlOX0ZSQU1FX0RVUkFUSU9OUyA9ICAgICAgICAgICAvLyBpbnQ2NFs0Km5dCisgICAgICAgICAgICBBQ0FNRVJBX0hFSUNfU1RBUlQgKyAxLAorICAgIC8qKgorICAgICAqIDxwPlRoaXMgbGlzdHMgdGhlIG1heGltdW0gc3RhbGwgZHVyYXRpb24gZm9yIGVhY2gKKyAgICAgKiBvdXRwdXQgZm9ybWF0L3NpemUgY29tYmluYXRpb24gZm9yIEhFSUMgc3RyZWFtcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQ2NFs0Km5dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPkEgc3RhbGwgZHVyYXRpb24gaXMgaG93IG11Y2ggZXh0cmEgdGltZSB3b3VsZCBnZXQgYWRkZWQKKyAgICAgKiB0byB0aGUgbm9ybWFsIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gZm9yIGEgcmVwZWF0aW5nIHJlcXVlc3QKKyAgICAgKiB0aGF0IGhhcyBzdHJlYW1zIHdpdGggbm9uLXplcm8gc3RhbGwuPC9wPgorICAgICAqIDxwPlRoaXMgZnVuY3Rpb25zIHNpbWlsYXJseSB0bworICAgICAqIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlMgZm9yIEhFSUMKKyAgICAgKiBzdHJlYW1zLjwvcD4KKyAgICAgKiA8cD5BbGwgSEVJQyBvdXRwdXQgc3RyZWFtIGZvcm1hdHMgbWF5IGhhdmUgYSBub256ZXJvIHN0YWxsCisgICAgICogZHVyYXRpb24uPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TCisgICAgICovCisgICAgQUNBTUVSQV9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUQUxMX0RVUkFUSU9OUyA9ICAgICAgICAgICAgICAgLy8gaW50NjRbNCpuXQorICAgICAgICAgICAgQUNBTUVSQV9IRUlDX1NUQVJUICsgMiwKKyAgICBBQ0FNRVJBX0hFSUNfRU5ELAorCiB9IGFjYW1lcmFfbWV0YWRhdGFfdGFnX3Q7CiAKIC8qKgpAQCAtNzAwNSw2ICs3MzY5LDEwIEBACiAgICAgICogPHA+SWYgdGhpcyBpcyBzdXBwb3J0ZWQsIGFuZHJvaWQuc2NhbGVyLnN0cmVhbUNvbmZpZ3VyYXRpb25NYXAgd2lsbAogICAgICAqIGFkZGl0aW9uYWxseSByZXR1cm4gYSBtaW4gZnJhbWUgZHVyYXRpb24gdGhhdCBpcyBncmVhdGVyIHRoYW4KICAgICAgKiB6ZXJvIGZvciBlYWNoIHN1cHBvcnRlZCBzaXplLWZvcm1hdCBjb21iaW5hdGlvbi48L3A+CisgICAgICogPHA+Rm9yIGNhbWVyYSBkZXZpY2VzIHdpdGggTE9HSUNBTF9NVUxUSV9DQU1FUkEgY2FwYWJpbGl0eSwgd2hlbiB0aGUgdW5kZXJseWluZyBhY3RpdmUKKyAgICAgKiBwaHlzaWNhbCBjYW1lcmEgc3dpdGNoZXMsIGV4cG9zdXJlVGltZSwgc2Vuc2l0aXZpdHksIGFuZCBsZW5zIHByb3BlcnRpZXMgbWF5IGNoYW5nZQorICAgICAqIGV2ZW4gaWYgQUUvQUYgaXMgbG9ja2VkLiBIb3dldmVyLCB0aGUgb3ZlcmFsbCBhdXRvIGV4cG9zdXJlIGFuZCBhdXRvIGZvY3VzIGV4cGVyaWVuY2UKKyAgICAgKiBmb3IgdXNlcnMgd2lsbCBiZSBjb25zaXN0ZW50LiBSZWZlciB0byBMT0dJQ0FMX01VTFRJX0NBTUVSQSBjYXBhYmlsaXR5IGZvciBkZXRhaWxzLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9CTEFDS19MRVZFTF9MT0NLCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfQUVfTE9DSwpAQCAtNzA2MCw2ICs3NDI4LDEwIEBACiAgICAgICogd2lsbCBhY2N1cmF0ZWx5IHJlcG9ydCB0aGUgdmFsdWVzIGFwcGxpZWQgYnkgQVdCIGluIHRoZSByZXN1bHQuPC9wPgogICAgICAqIDxwPkEgZ2l2ZW4gY2FtZXJhIGRldmljZSBtYXkgYWxzbyBzdXBwb3J0IGFkZGl0aW9uYWwgcG9zdC1wcm9jZXNzaW5nCiAgICAgICogY29udHJvbHMsIGJ1dCB0aGlzIGNhcGFiaWxpdHkgb25seSBjb3ZlcnMgdGhlIGFib3ZlIGxpc3Qgb2YgY29udHJvbHMuPC9wPgorICAgICAqIDxwPkZvciBjYW1lcmEgZGV2aWNlcyB3aXRoIExPR0lDQUxfTVVMVElfQ0FNRVJBIGNhcGFiaWxpdHksIHdoZW4gdW5kZXJseWluZyBhY3RpdmUKKyAgICAgKiBwaHlzaWNhbCBjYW1lcmEgc3dpdGNoZXMsIHRvbmVtYXAsIHdoaXRlIGJhbGFuY2UsIGFuZCBzaGFkaW5nIG1hcCBtYXkgY2hhbmdlIGV2ZW4gaWYKKyAgICAgKiBhd2IgaXMgbG9ja2VkLiBIb3dldmVyLCB0aGUgb3ZlcmFsbCBwb3N0LXByb2Nlc3NpbmcgZXhwZXJpZW5jZSBmb3IgdXNlcnMgd2lsbCBiZQorICAgICAqIGNvbnNpc3RlbnQuIFJlZmVyIHRvIExPR0lDQUxfTVVMVElfQ0FNRVJBIGNhcGFiaWxpdHkgZm9yIGRldGFpbHMuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTE9SX0NPUlJFQ1RJT05fQUJFUlJBVElPTl9NT0RFCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTE9SX0NPUlJFQ1RJT05fQVZBSUxBQkxFX0FCRVJSQVRJT05fTU9ERVMKQEAgLTcxNDMsNyArNzUxNSw3IEBACiAgICAgICogY2FtZXJhIGRldmljZSBjYW4gY2FwdHVyZSB0aGlzIHNpemUgZm9yIGF0IGxlYXN0IDEwIGZyYW1lcyBwZXIgc2Vjb25kLiAgQWxzbyB0aGUKICAgICAgKiBBQ0FNRVJBX0NPTlRST0xfQUVfQVZBSUxBQkxFX1RBUkdFVF9GUFNfUkFOR0VTIGVudHJ5IGxpc3RzIGF0IGxlYXN0IG9uZSBGUFMgcmFuZ2Ugd2hlcmUKICAgICAgKiB0aGUgbWluaW11bSBGUFMgaXMgJmd0Oz0gMSAvIG1pbmltdW1GcmFtZUR1cmF0aW9uIGZvciB0aGUgbGFyZ2VzdCBZVVZfNDIwXzg4OCBzaXplLjwvcD4KLSAgICAgKiA8cD5JZiB0aGUgZGV2aWNlIHN1cHBvcnRzIHRoZSB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMCB9LCB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMiB9LCB0aGVuIHRob3NlIGNhbiBhbHNvIGJlCisgICAgICogPHA+SWYgdGhlIGRldmljZSBzdXBwb3J0cyB0aGUge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTAgfSwge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTIgfSwge0BsaW5rIEFJTUFHRV9GT1JNQVRfWTggfSwgdGhlbiB0aG9zZSBjYW4gYWxzbyBiZQogICAgICAqIGNhcHR1cmVkIGF0IHRoZSBzYW1lIHJhdGUgYXMgdGhlIG1heGltdW0tc2l6ZSBZVVZfNDIwXzg4OCByZXNvbHV0aW9uIGlzLjwvcD4KICAgICAgKiA8cD5JbiBhZGRpdGlvbiwgdGhlIEFDQU1FUkFfU1lOQ19NQVhfTEFURU5DWSBmaWVsZCBpcyBndWFyYW50ZWQgdG8gaGF2ZSBhIHZhbHVlIGJldHdlZW4gMAogICAgICAqIGFuZCA0LCBpbmNsdXNpdmUuIEFDQU1FUkFfQ09OVFJPTF9BRV9MT0NLX0FWQUlMQUJMRSBhbmQgQUNBTUVSQV9DT05UUk9MX0FXQl9MT0NLX0FWQUlMQUJMRQpAQCAtNzE3Nyw4ICs3NTQ5LDggQEAKICAgICAgKiA8bGk+VGhlIEFDQU1FUkFfREVQVEhfREVQVEhfSVNfRVhDTFVTSVZFIGVudHJ5IGlzIGxpc3RlZCBieSB0aGlzIGRldmljZS48L2xpPgogICAgICAqIDxsaT5BcyBvZiBBbmRyb2lkIFAsIHRoZSBBQ0FNRVJBX0xFTlNfUE9TRV9SRUZFUkVOQ0UgZW50cnkgaXMgbGlzdGVkIGJ5IHRoaXMgZGV2aWNlLjwvbGk+CiAgICAgICogPGxpPkEgTElNSVRFRCBjYW1lcmEgd2l0aCBvbmx5IHRoZSBERVBUSF9PVVRQVVQgY2FwYWJpbGl0eSBkb2VzIG5vdCBoYXZlIHRvIHN1cHBvcnQKLSAgICAgKiAgIG5vcm1hbCBZVVZfNDIwXzg4OCwgSlBFRywgYW5kIFBSSVYtZm9ybWF0IG91dHB1dHMuIEl0IG9ubHkgaGFzIHRvIHN1cHBvcnQgdGhlIERFUFRIMTYKLSAgICAgKiAgIGZvcm1hdC48L2xpPgorICAgICAqICAgbm9ybWFsIFlVVl80MjBfODg4LCBZOCwgSlBFRywgYW5kIFBSSVYtZm9ybWF0IG91dHB1dHMuIEl0IG9ubHkgaGFzIHRvIHN1cHBvcnQgdGhlCisgICAgICogICBERVBUSDE2IGZvcm1hdC48L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPHA+R2VuZXJhbGx5LCBkZXB0aCBvdXRwdXQgb3BlcmF0ZXMgYXQgYSBzbG93ZXIgZnJhbWUgcmF0ZSB0aGFuIHN0YW5kYXJkIGNvbG9yIGNhcHR1cmUsCiAgICAgICogc28gdGhlIERFUFRIMTYgYW5kIERFUFRIX1BPSU5UX0NMT1VEIGZvcm1hdHMgd2lsbCBjb21tb25seSBoYXZlIGEgc3RhbGwgZHVyYXRpb24gdGhhdApAQCAtNzIwOSw4ICs3NTgxLDE0IEBACiAgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTU9USU9OX1RSQUNLSU5HICAgICAgICAgICA9IDEwLAogCiAgICAgLyoqCi0gICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgaXMgYSBsb2dpY2FsIGNhbWVyYSBiYWNrZWQgYnkgdHdvIG9yIG1vcmUgcGh5c2ljYWwgY2FtZXJhcyB0aGF0IGFyZQotICAgICAqIGFsc28gZXhwb3NlZCB0byB0aGUgYXBwbGljYXRpb24uPC9wPgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGlzIGEgbG9naWNhbCBjYW1lcmEgYmFja2VkIGJ5IHR3byBvciBtb3JlIHBoeXNpY2FsIGNhbWVyYXMuIEluCisgICAgICogQVBJIGxldmVsIDI4LCB0aGUgcGh5c2ljYWwgY2FtZXJhcyBtdXN0IGFsc28gYmUgZXhwb3NlZCB0byB0aGUgYXBwbGljYXRpb24gdmlhCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNYW5hZ2VyLmh0bWwjZ2V0Q2FtZXJhSWRMaXN0Ij5DYW1lcmFNYW5hZ2VyI2dldENhbWVyYUlkTGlzdDwvYT4uIFN0YXJ0aW5nIGZyb20gQVBJCisgICAgICogbGV2ZWwgMjksIHNvbWUgb3IgYWxsIHBoeXNpY2FsIGNhbWVyYXMgbWF5IG5vdCBiZSBpbmRlcGVuZGVudGx5IGV4cG9zZWQgdG8gdGhlCisgICAgICogYXBwbGljYXRpb24sIGluIHdoaWNoIGNhc2UgdGhlIHBoeXNpY2FsIGNhbWVyYSBJRHMgd2lsbCBub3QgYmUgYXZhaWxhYmxlIGluCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNYW5hZ2VyLmh0bWwjZ2V0Q2FtZXJhSWRMaXN0Ij5DYW1lcmFNYW5hZ2VyI2dldENhbWVyYUlkTGlzdDwvYT4uIEJ1dCB0aGUgYXBwbGljYXRpb24KKyAgICAgKiBjYW4gc3RpbGwgcXVlcnkgdGhlIHBoeXNpY2FsIGNhbWVyYXMnIGNoYXJhY3RlcmlzdGljcyBieSBjYWxsaW5nCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNYW5hZ2VyLmh0bWwjZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIj5DYW1lcmFNYW5hZ2VyI2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvYT4uPC9wPgogICAgICAqIDxwPkNhbWVyYSBhcHBsaWNhdGlvbiBzaG91bGRuJ3QgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIGF0IG1vc3QgMSByZWFyIGNhbWVyYSBhbmQgMSBmcm9udAogICAgICAqIGNhbWVyYSBpbiB0aGUgc3lzdGVtLiBGb3IgYW4gYXBwbGljYXRpb24gdGhhdCBzd2l0Y2hlcyBiZXR3ZWVuIGZyb250IGFuZCBiYWNrIGNhbWVyYXMsCiAgICAgICogdGhlIHJlY29tbWVuZGF0aW9uIGlzIHRvIHN3aXRjaCBiZXR3ZWVuIHRoZSBmaXJzdCByZWFyIGNhbWVyYSBhbmQgdGhlIGZpcnN0IGZyb250CkBAIC03MjMzLDcgKzc2MTEsNyBAQAogICAgICAqIDwvbGk+CiAgICAgICogPGxpPlRoZSBTRU5TT1JfSU5GT19USU1FU1RBTVBfU09VUkNFIG9mIHRoZSBsb2dpY2FsIGRldmljZSBhbmQgcGh5c2ljYWwgZGV2aWNlcyBtdXN0IGJlCiAgICAgICogICB0aGUgc2FtZS48L2xpPgotICAgICAqIDxsaT5UaGUgbG9naWNhbCBjYW1lcmEgZGV2aWNlIG11c3QgYmUgTElNSVRFRCBvciBoaWdoZXIgZGV2aWNlLjwvbGk+CisgICAgICogPGxpPlRoZSBsb2dpY2FsIGNhbWVyYSBtdXN0IGJlIExJTUlURUQgb3IgaGlnaGVyIGRldmljZS48L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogPHA+Qm90aCB0aGUgbG9naWNhbCBjYW1lcmEgZGV2aWNlIGFuZCBpdHMgdW5kZXJseWluZyBwaHlzaWNhbCBkZXZpY2VzIHN1cHBvcnQgdGhlCiAgICAgICogbWFuZGF0b3J5IHN0cmVhbSBjb21iaW5hdGlvbnMgcmVxdWlyZWQgZm9yIHRoZWlyIGRldmljZSBsZXZlbHMuPC9wPgpAQCAtNzI1MywyMiArNzYzMSwxMDggQEAKICAgICAgKiA8cD5Vc2luZyBwaHlzaWNhbCBzdHJlYW1zIGluIHBsYWNlIG9mIGEgbG9naWNhbCBzdHJlYW0gb2YgdGhlIHNhbWUgc2l6ZSBhbmQgZm9ybWF0IHdpbGwKICAgICAgKiBub3Qgc2xvdyBkb3duIHRoZSBmcmFtZSByYXRlIG9mIHRoZSBjYXB0dXJlLCBhcyBsb25nIGFzIHRoZSBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uCiAgICAgICogb2YgdGhlIHBoeXNpY2FsIGFuZCBsb2dpY2FsIHN0cmVhbXMgYXJlIHRoZSBzYW1lLjwvcD4KKyAgICAgKiA8cD5BIGxvZ2ljYWwgY2FtZXJhIGRldmljZSdzIGR5bmFtaWMgbWV0YWRhdGEgbWF5IGNvbnRhaW4KKyAgICAgKiBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX0FDVElWRV9QSFlTSUNBTF9JRCB0byBub3RpZnkgdGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBjdXJyZW50CisgICAgICogYWN0aXZlIHBoeXNpY2FsIGNhbWVyYSBJZC4gQW4gYWN0aXZlIHBoeXNpY2FsIGNhbWVyYSBpcyB0aGUgcGh5c2ljYWwgY2FtZXJhIGZyb20gd2hpY2gKKyAgICAgKiB0aGUgbG9naWNhbCBjYW1lcmEncyBtYWluIGltYWdlIGRhdGEgb3V0cHV0cyAoWVVWIG9yIFJBVykgYW5kIG1ldGFkYXRhIGNvbWUgZnJvbS4KKyAgICAgKiBJbiBhZGRpdGlvbiwgdGhpcyBzZXJ2ZXMgYXMgYW4gaW5kaWNhdGlvbiB3aGljaCBwaHlzaWNhbCBjYW1lcmEgaXMgdXNlZCB0byBvdXRwdXQgdG8KKyAgICAgKiBhIFJBVyBzdHJlYW0sIG9yIGluIGNhc2Ugb25seSBwaHlzaWNhbCBjYW1lcmFzIHN1cHBvcnQgUkFXLCB3aGljaCBwaHlzaWNhbCBSQVcgc3RyZWFtCisgICAgICogdGhlIGFwcGxpY2F0aW9uIHNob3VsZCByZXF1ZXN0LjwvcD4KKyAgICAgKiA8cD5Mb2dpY2FsIGNhbWVyYSdzIHN0YXRpYyBtZXRhZGF0YSB0YWdzIGJlbG93IGRlc2NyaWJlIHRoZSBkZWZhdWx0IGFjdGl2ZSBwaHlzaWNhbAorICAgICAqIGNhbWVyYS4gQW4gYWN0aXZlIHBoeXNpY2FsIGNhbWVyYSBpcyBkZWZhdWx0IGlmIGl0J3MgdXNlZCB3aGVuIGFwcGxpY2F0aW9uIGRpcmVjdGx5CisgICAgICogdXNlcyByZXF1ZXN0cyBidWlsdCBmcm9tIGEgdGVtcGxhdGUuIEFsbCB0ZW1wbGF0ZXMgd2lsbCBkZWZhdWx0IHRvIHRoZSBzYW1lIGFjdGl2ZQorICAgICAqIHBoeXNpY2FsIGNhbWVyYS48L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9JTkZPX1NFTlNJVElWSVRZX1JBTkdFPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQ8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9JTkZPX0VYUE9TVVJFX1RJTUVfUkFOR0U8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9JTkZPX01BWF9GUkFNRV9EVVJBVElPTjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0lORk9fUEhZU0lDQUxfU0laRTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0lORk9fV0hJVEVfTEVWRUw8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9JTkZPX0xFTlNfU0hBRElOR19BUFBMSUVEPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfQ0FMSUJSQVRJT05fVFJBTlNGT1JNMTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTI8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0xPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0ZPUldBUkRfTUFUUklYMTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0ZPUldBUkRfTUFUUklYMjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0JMQUNLX0xFVkVMX1BBVFRFUk48L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9NQVhfQU5BTE9HX1NFTlNJVElWSVRZPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfT1BUSUNBTF9CTEFDS19SRUdJT05TPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfQVZBSUxBQkxFX1RFU1RfUEFUVEVSTl9NT0RFUzwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19JTkZPX0hZUEVSRk9DQUxfRElTVEFOQ0U8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfSU5GT19NSU5JTVVNX0ZPQ1VTX0RJU1RBTkNFPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX0lORk9fRk9DVVNfRElTVEFOQ0VfQ0FMSUJSQVRJT048L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19QT1NFX1JFRkVSRU5DRTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19ESVNUT1JUSU9OPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPlRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSBjYXB0dXJlIHJlcXVlc3QgYW5kIHJlc3VsdCBtZXRhZGF0YSB0YWdzCisgICAgICogcmVxdWlyZWQgZm9yIGJhc2ljIGNhbWVyYSBmdW5jdGlvbmFsaXRpZXMgd2lsbCBiZSBzb2xlbHkgYmFzZWQgb24gdGhlCisgICAgICogbG9naWNhbCBjYW1lcmEgY2FwYWJpbHRpdHkuIE90aGVyIHJlcXVlc3QgYW5kIHJlc3VsdCBtZXRhZGF0YSB0YWdzLCBvbiB0aGUgb3RoZXIKKyAgICAgKiBoYW5kLCB3aWxsIGJlIGJhc2VkIG9uIGN1cnJlbnQgYWN0aXZlIHBoeXNpY2FsIGNhbWVyYS4gRm9yIGV4YW1wbGUsIHRoZSBwaHlzaWNhbAorICAgICAqIGNhbWVyYXMnIHNlbnNvciBzZW5zaXRpdml0eSBhbmQgbGVucyBjYXBhYmlsaXR5IGNvdWxkIGJlIGRpZmZlcmVudCBmcm9tIGVhY2ggb3RoZXIuCisgICAgICogU28gd2hlbiB0aGUgYXBwbGljYXRpb24gbWFudWFsbHkgY29udHJvbHMgc2Vuc29yIGV4cG9zdXJlIHRpbWUvZ2Fpbiwgb3IgZG9lcyBtYW51YWwKKyAgICAgKiBmb2N1cyBjb250cm9sLCBpdCBtdXN0IGNoZWNrcyB0aGUgY3VycmVudCBhY3RpdmUgcGh5c2ljYWwgY2FtZXJhJ3MgZXhwb3N1cmUsIGdhaW4sCisgICAgICogYW5kIGZvY3VzIGRpc3RhbmNlIHJhbmdlLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0RJU1RPUlRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19JTkZPX0ZPQ1VTX0RJU1RBTkNFX0NBTElCUkFUSU9OCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfSU5GT19IWVBFUkZPQ0FMX0RJU1RBTkNFCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfSU5GT19NSU5JTVVNX0ZPQ1VTX0RJU1RBTkNFCiAgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OCiAgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9SRUZFUkVOQ0UKICAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1JPVEFUSU9OCiAgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9UUkFOU0xBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9BQ1RJVkVfUEhZU0lDQUxfSUQKICAgICAgKiBAc2VlIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfU0VOU09SX1NZTkNfVFlQRQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQVZBSUxBQkxFX1RFU1RfUEFUVEVSTl9NT0RFUworICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQkxBQ0tfTEVWRUxfUEFUVEVSTgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQ0FMSUJSQVRJT05fVFJBTlNGT1JNMQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQ0FMSUJSQVRJT05fVFJBTlNGT1JNMgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfRk9SV0FSRF9NQVRSSVgxCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9GT1JXQVJEX01BVFJJWDIKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0VYUE9TVVJFX1RJTUVfUkFOR0UKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fTEVOU19TSEFESU5HX0FQUExJRUQKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fTUFYX0ZSQU1FX0RVUkFUSU9OCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1BIWVNJQ0FMX1NJWkUKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fU0VOU0lUSVZJVFlfUkFOR0UKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fV0hJVEVfTEVWRUwKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX01BWF9BTkFMT0dfU0VOU0lUSVZJVFkKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX09QVElDQUxfQkxBQ0tfUkVHSU9OUworICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDIKICAgICAgKi8KICAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19MT0dJQ0FMX01VTFRJX0NBTUVSQSAgICAgID0gMTEsCiAKICAgICAvKioKICAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBpcyBhIG1vbm9jaHJvbWUgY2FtZXJhIHRoYXQgZG9lc24ndCBjb250YWluIGEgY29sb3IgZmlsdGVyIGFycmF5LAotICAgICAqIGFuZCB0aGUgcGl4ZWwgdmFsdWVzIG9uIFUgYW5kIFYgcGxhbmVzIGFyZSBhbGwgMTI4LjwvcD4KKyAgICAgKiBhbmQgZm9yIFlVVl80MjBfODg4IHN0cmVhbSwgdGhlIHBpeGVsIHZhbHVlcyBvbiBVIGFuZCBWIHBsYW5lcyBhcmUgYWxsIDEyOC48L3A+CisgICAgICogPHA+QSBNT05PQ0hST01FIGNhbWVyYSBtdXN0IHN1cHBvcnQgdGhlIGd1YXJhbnRlZWQgc3RyZWFtIGNvbWJpbmF0aW9ucyByZXF1aXJlZCBmb3IKKyAgICAgKiBpdHMgZGV2aWNlIGxldmVsIGFuZCBjYXBhYmlsaXRpZXMuIEFkZGl0aW9uYWxseSwgaWYgdGhlIG1vbm9jaHJvbWUgY2FtZXJhIGRldmljZQorICAgICAqIHN1cHBvcnRzIFk4IGZvcm1hdCwgYWxsIG1hbmRhdG9yeSBzdHJlYW0gY29tYmluYXRpb24gcmVxdWlyZW1lbnRzIHJlbGF0ZWQgdG8ge0BsaW5rIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODggWVVWXzQyMF84ODh9IGFwcGx5CisgICAgICogdG8ge0BsaW5rIEFJTUFHRV9GT1JNQVRfWTggWTh9IGFzIHdlbGwuIFRoZXJlIGFyZSBubworICAgICAqIG1hbmRhdG9yeSBzdHJlYW0gY29tYmluYXRpb24gcmVxdWlyZW1lbnRzIHdpdGggcmVnYXJkIHRvCisgICAgICoge0BsaW5rIEFJTUFHRV9GT1JNQVRfWTggWTh9IGZvciBCYXllciBjYW1lcmEgZGV2aWNlcy48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoZSBTRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQgb2YgYSBNT05PQ0hST01FCisgICAgICogY2FtZXJhIHdpbGwgYmUgZWl0aGVyIE1PTk8gb3IgTklSLjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19NT05PQ0hST01FICAgICAgICAgICAgICAgID0gMTIsCiAKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBpcyBjYXBhYmxlIG9mIHdyaXRpbmcgaW1hZ2UgZGF0YSBpbnRvIGEgcmVnaW9uIG9mIG1lbW9yeQorICAgICAqIGluYWNjZXNzaWJsZSB0byBBbmRyb2lkIHVzZXJzcGFjZSBvciB0aGUgQW5kcm9pZCBrZXJuZWwsIGFuZCBvbmx5IGFjY2Vzc2libGUgdG8KKyAgICAgKiB0cnVzdGVkIGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgKFRFRSkuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1NFQ1VSRV9JTUFHRV9EQVRBICAgICAgICAgPSAxMywKKwogfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9yZXF1ZXN0X2F2YWlsYWJsZV9jYXBhYmlsaXRpZXNfdDsKIAogCkBAIC03Mjk0LDYgKzc3NTgsNjcgQEAKIAogfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfY3JvcHBpbmdfdHlwZV90OwogCisvLyBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TCit0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfc2NhbGVyX2F2YWlsYWJsZV9yZWNvbW1lbmRlZF9zdHJlYW1fY29uZmlndXJhdGlvbnMgeworICAgIC8qKgorICAgICAqIDxwPlByZXZpZXcgbXVzdCBvbmx5IGluY2x1ZGUgbm9uLXN0YWxsaW5nIHByb2Nlc3NlZCBzdHJlYW0gY29uZmlndXJhdGlvbnMgd2l0aAorICAgICAqIG91dHB1dCBmb3JtYXRzIGxpa2UgWVVWXzQyMF84ODgsIElNUExFTUVOVEFUSU9OX0RFRklORUQsIGV0Yy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19QUkVWSUVXCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAsCisKKyAgICAvKioKKyAgICAgKiA8cD5WaWRlbyByZWNvcmQgbXVzdCBpbmNsdWRlIHN0cmVhbSBjb25maWd1cmF0aW9ucyB0aGF0IG1hdGNoIHRoZSBhZHZlcnRpc2VkCisgICAgICogc3VwcG9ydGVkIG1lZGlhIHByb2ZpbGVzIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuaHRtbCI+Q2FtY29yZGVyUHJvZmlsZTwvYT4gd2l0aAorICAgICAqIElNUExFTUVOVEFUSU9OX0RFRklORUQgZm9ybWF0LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1JFQ09SRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxLAorCisgICAgLyoqCisgICAgICogPHA+VmlkZW8gc25hcHNob3QgbXVzdCBpbmNsdWRlIHN0cmVhbSBjb25maWd1cmF0aW9ucyBhdCBsZWFzdCBhcyBiaWcgYXMKKyAgICAgKiB0aGUgbWF4aW11bSBSRUNPUkQgcmVzb2x1dGlvbnMgYW5kIG9ubHkgd2l0aCBmb3JtYXQgQkxPQiArIERBVEFTUEFDRV9KRklGCisgICAgICogZm9ybWF0L2RhdGFzcGFjZSBjb21iaW5hdGlvbiAoSlBFRykuIEFkZGl0aW9uYWxseSB0aGUgY29uZmlndXJhdGlvbnMgc2hvdWxkbid0IGNhdXNlCisgICAgICogcHJldmlldyBnbGl0Y2hlcyBhbmQgYWxzbyBiZSBhYmxlIHRvIHJ1biBhdCAzMCBmcHMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfVklERU9fU05BUFNIT1QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MiwKKworICAgIC8qKgorICAgICAqIDxwPlJlY29tbWVuZGVkIHNuYXBzaG90IHN0cmVhbSBjb25maWd1cmF0aW9ucyBtdXN0IGluY2x1ZGUgYXQgbGVhc3Qgb25lIHdpdGgKKyAgICAgKiBzaXplIGNsb3NlIHRvIEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUgd2l0aCBCTE9CICsgREFUQVNQQUNFX0pGSUYKKyAgICAgKiBmb3JtYXQvZGF0YXNwYWNlIGNvbWJpbmF0aW9uIChKUEVHKS4gVGFraW5nIGludG8gYWNjb3VudCByZXN0cmljdGlvbnMgb24gYXNwZWN0CisgICAgICogcmF0aW8sIGFsaWdubWVudCBldGMuIHRoZSBhcmVhIG9mIHRoZSBtYXhpbXVtIHN1Z2dlc3RlZCBzaXplIHNob3VsZG7igJl0IGJlIGxlc3MgdGhhbgorICAgICAqIDk3JSBvZiB0aGUgc2Vuc29yIGFycmF5IHNpemUgYXJlYS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1NOQVBTSE9UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMsCisKKyAgICAvKioKKyAgICAgKiA8cD5JZiBzdXBwb3J0ZWQsIHJlY29tbWVuZGVkIGlucHV0IHN0cmVhbSBjb25maWd1cmF0aW9ucyBtdXN0IG9ubHkgYmUgYWR2ZXJ0aXNlZCB3aXRoCisgICAgICogWlNMIGFsb25nIHdpdGggb3RoZXIgcHJvY2Vzc2VkIGFuZC9vciBzdGFsbGluZyBvdXRwdXQgZm9ybWF0cy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19aU0wgICA9IDB4NCwKKworICAgIC8qKgorICAgICAqIDxwPklmIHN1cHBvcnRlZCwgcmVjb21tZW5kZWQgcmF3IHN0cmVhbSBjb25maWd1cmF0aW9ucyBtdXN0IG9ubHkgaW5jbHVkZSBSQVcgYmFzZWQKKyAgICAgKiBvdXRwdXQgZm9ybWF0cy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19SQVcgICA9IDB4NSwKKworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfUFVCTElDX0VORAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg2LAorCisgICAgLyoqCisgICAgICogPHA+VmVuZG9yIGRlZmluZWQgdXNlIGNhc2VzLiBUaGVzZSBkZXBlbmQgb24gdGhlIHZlbmRvciBpbXBsZW1lbnRhdGlvbi48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19WRU5ET1JfU1RBUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTgsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2F2YWlsYWJsZV9yZWNvbW1lbmRlZF9zdHJlYW1fY29uZmlndXJhdGlvbnNfdDsKKwogCiAvLyBBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDEKIHR5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9zZW5zb3JfcmVmZXJlbmNlX2lsbHVtaW5hbnQxIHsKQEAgLTc0NzAsNiArNzk5NSwyMSBAQAogICAgICAqLwogICAgIEFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UX1JHQiAgICAgICAgICAgICAgICAgPSA0LAogCisgICAgLyoqCisgICAgICogPHA+U2Vuc29yIGRvZXNuJ3QgaGF2ZSBhbnkgQmF5ZXIgY29sb3IgZmlsdGVyLgorICAgICAqIFN1Y2ggc2Vuc29yIGNhcHR1cmVzIHZpc2libGUgbGlnaHQgaW4gbW9ub2Nocm9tZS4gVGhlIGV4YWN0IHdlaWdodGluZyBhbmQKKyAgICAgKiB3YXZlbGVuZ3RocyBjYXB0dXJlZCBpcyBub3Qgc3BlY2lmaWVkLCBidXQgZ2VuZXJhbGx5IG9ubHkgaW5jbHVkZXMgdGhlIHZpc2libGUKKyAgICAgKiBmcmVxdWVuY2llcy4gVGhpcyB2YWx1ZSBpbXBsaWVzIGEgTU9OT0NIUk9NRSBjYW1lcmEuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UX01PTk8gICAgICAgICAgICAgICAgPSA1LAorCisgICAgLyoqCisgICAgICogPHA+U2Vuc29yIGhhcyBhIG5lYXIgaW5mcmFyZWQgZmlsdGVyIGNhcHR1cmluZyBsaWdodCB3aXRoIHdhdmVsZW5ndGggYmV0d2VlbgorICAgICAqIHJvdWdobHkgNzUwbm0gYW5kIDE0MDBubSwgYW5kIHRoZSBzYW1lIGZpbHRlciBjb3ZlcnMgdGhlIHdob2xlIHNlbnNvciBhcnJheS4gVGhpcworICAgICAqIHZhbHVlIGltcGxpZXMgYSBNT05PQ0hST01FIGNhbWVyYS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlRfTklSICAgICAgICAgICAgICAgICA9IDYsCisKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2Vuc29yX2luZm9fY29sb3JfZmlsdGVyX2FycmFuZ2VtZW50X3Q7CiAKIC8vIEFDQU1FUkFfU0VOU09SX0lORk9fVElNRVNUQU1QX1NPVVJDRQpAQCAtNzg5OCw2ICs4NDM4LDE2IEBACiAKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGVwdGhfZGVwdGhfaXNfZXhjbHVzaXZlX3Q7CiAKKy8vIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TCit0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfZGVwdGhfYXZhaWxhYmxlX2R5bmFtaWNfZGVwdGhfc3RyZWFtX2NvbmZpZ3VyYXRpb25zIHsKKyAgICBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisKKyAgICBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OU19JTlBVVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwKKworfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9kZXB0aF9hdmFpbGFibGVfZHluYW1pY19kZXB0aF9zdHJlYW1fY29uZmlndXJhdGlvbnNfdDsKKwogCiAvLyBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1NFTlNPUl9TWU5DX1RZUEUKIHR5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9sb2dpY2FsX211bHRpX2NhbWVyYV9zZW5zb3Jfc3luY190eXBlIHsKQEAgLTc5NDEsNiArODQ5MSwxNiBAQAogfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9kaXN0b3J0aW9uX2NvcnJlY3Rpb25fbW9kZV90OwogCiAKKy8vIEFDQU1FUkFfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlMKK3R5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9oZWljX2F2YWlsYWJsZV9oZWljX3N0cmVhbV9jb25maWd1cmF0aW9ucyB7CisgICAgQUNBTUVSQV9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQgICAgICAgICA9IDAsCisKKyAgICBBQ0FNRVJBX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TX0lOUFVUICAgICAgICAgID0gMSwKKworfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9oZWljX2F2YWlsYWJsZV9oZWljX3N0cmVhbV9jb25maWd1cmF0aW9uc190OworCisKKwogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwogCiBfX0VORF9ERUNMUwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFXaW5kb3dUeXBlLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYVdpbmRvd1R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWY2N2U5Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFXaW5kb3dUeXBlLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX05ES19DQU1FUkFfV0lORE9XX1RZUEVfSAorI2RlZmluZSBfTkRLX0NBTUVSQV9XSU5ET1dfVFlQRV9ICisKKy8qKgorICogQGFkZHRvZ3JvdXAgQ2FtZXJhCisgKiBAeworICovCisKKy8qKgorICogQGZpbGUgTmRrQ2FtZXJhV2luZG93VHlwZS5oCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCisgKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCisgKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgorICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgorICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgorICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgorICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KKyAqLworCisvKioKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB3aW5kb3cgdHlwZSB1c2VkIGJ5IE5ESyBhbmQgdGhlIFZOREsgdmFyaWFudHMgb2YgdGhlCisgKiBjYW1lcmEyIE5ESy4gVGhpcyBlbmFibGVzIHVzIHRvIHNoYXJlIHRoZSBhcGkgZGVmaW5pdGlvbiBoZWFkZXJzIGFuZCBhdm9pZAorICogY29kZSBkdXBsaWNhdGlvbiAoc2luY2UgdGhlIFZOREsgdmFyaWFudCBkb2Vzbid0IHVzZSBBTmF0aXZlV2luZG93IHVubGlrZSB0aGUKKyAqIE5ESyB2YXJpYW50KS4KKyAqLworI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgordHlwZWRlZiBuYXRpdmVfaGFuZGxlX3QgQUNhbWVyYVdpbmRvd1R5cGU7CisjZWxzZQorI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgordHlwZWRlZiBBTmF0aXZlV2luZG93IEFDYW1lcmFXaW5kb3dUeXBlOworI2VuZGlmCisKKyNlbmRpZiAvL19OREtfQ0FNRVJBX1dJTkRPV19UWVBFX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FwdHVyZVJlcXVlc3QuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FwdHVyZVJlcXVlc3QuaAppbmRleCA1MzQwZTc2Li5kM2Y4ODI2IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhcHR1cmVSZXF1ZXN0LmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYXB0dXJlUmVxdWVzdC5oCkBAIC0zNSw5ICszNSw5IEBACiAKICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgogI2luY2x1ZGUgIk5ka0NhbWVyYUVycm9yLmgiCiAjaW5jbHVkZSAiTmRrQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJOZGtDYW1lcmFXaW5kb3dUeXBlLmgiCiAKICNpZm5kZWYgX05ES19DQVBUVVJFX1JFUVVFU1RfSAogI2RlZmluZSBfTkRLX0NBUFRVUkVfUkVRVUVTVF9ICkBAIC0xMDEsNyArMTAxLDcgQEAKICAqCiAgKiBAc2VlIEFDYXB0dXJlUmVxdWVzdF9hZGRUYXJnZXQKICAqLwotY2FtZXJhX3N0YXR1c190IEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlKEFOYXRpdmVXaW5kb3cqIHdpbmRvdywKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZShBQ2FtZXJhV2luZG93VHlwZSogd2luZG93LAogICAgICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0Kiogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKQEAgLTM1OCw2ICszNTgsMjE5IEBACiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjggKi8KIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQorCisvKioKKyAqIEdldCBhIG1ldGFkYXRhIGVudHJ5IGZyb20gaW5wdXQge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0gZm9yCisgKiBhIHBoeXNpY2FsIGNhbWVyYSBiYWNraW5nIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEgZGV2aWNlLgorICoKKyAqIDxwPlNhbWUgYXMgQUNhcHR1cmVSZXF1ZXN0X2dldENvbnN0RW50cnksIGV4Y2VwdCB0aGF0IGlmIHRoZSBrZXkgaXMgY29udGFpbmVkCisgKiBpbiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhpcyBmdW5jdGlvbgorICogcmV0dXJucyB0aGUgZW50cnkgc2V0IGJ5IEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV8qIGNsYXNzIG9mCisgKiBmdW5jdGlvbnMgb24gdGhlIHBhcnRpY3VsYXIgcGh5c2ljYWwgY2FtZXJhLjwvcD4KKyAqCisgKiBAcGFyYW0gcmVxdWVzdCB0aGUge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0gb2YgaW50ZXJlc3QgY3JlYXRlZCBieQorICogICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSBwaHlzaWNhbElkIG9uZSBvZiB0aGUgcGh5c2ljYWwgSWRzIHVzZWQgd2hlbiByZXF1ZXN0IGlzIGNyZWF0ZWQgd2l0aAorICogICAgICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSB0YWcgdGhlIGNhcHR1cmUgcmVxdWVzdCBtZXRhZGF0YSB0YWcgaW4KKyAqICAgICAgICAgICAge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30KKyAqICAgICAgICAgICAgdGhhdCBpcyBzZXQgYnkgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhXyogY2xhc3Mgb2YgZnVuY3Rpb25zLgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIG1ldGFkYXRhLCBwaHlzaWNhbElkLCBvciBlbnRyeSBpcyBOVUxMLAorICogICAgICAgICBwaHlzaWNhbElkIGlzIG5vdCBvbmUgb2YgdGhlIElkcyB1c2VkIGluIGNyZWF0aW5nIHRoZSByZXF1ZXN0LCBvciBpZiB0aGUgY2FwdHVyZQorICogICAgICAgICByZXF1ZXN0IGlzIGEgcmVndWxhciByZXF1ZXN0IHdpdGggbm8gcGh5c2ljYWwgSWRzIGF0IGFsbC48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfTUVUQURBVEFfTk9UX0ZPVU5EfSBpZiB0aGUgY2FwdHVyZSByZXF1ZXN0IGRvZXMgbm90IGNvbnRhaW4gYW4KKyAqICAgICAgICAgICAgIGVudHJ5IG9mIGlucHV0IHRhZyB2YWx1ZS48L2xpPjwvdWw+CisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3RfZ2V0Q29uc3RFbnRyeV9waHlzaWNhbENhbWVyYSgKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBjb25zdCBjaGFyKiBwaHlzaWNhbElkLCB1aW50MzJfdCB0YWcsCisgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9jb25zdF9lbnRyeSogZW50cnkpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogU2V0L2NoYW5nZSBhIGNhbWVyYSBjYXB0dXJlIGNvbnRyb2wgZW50cnkgd2l0aCB1bnNpZ25lZCA4IGJpdHMgZGF0YSB0eXBlIGZvcgorICogYSBwaHlzaWNhbCBjYW1lcmEgYmFja2luZyBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGRldmljZS4KKyAqCisgKiA8cD5TYW1lIGFzIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV91OCwgZXhjZXB0IHRoYXQgaWYge0BsaW5rIHRhZ30gaXMgY29udGFpbmVkCisgKiBpbiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhpcyBmdW5jdGlvbgorICogc2V0cyB0aGUgZW50cnkgZm9yIGEgcGFydGljdWxhciBwaHlzaWNhbCBzdWItY2FtZXJhIGJhY2tpbmcgdGhlIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICogSWYge0BsaW5rIHRhZ30gaXMgbm90IGNvbnRhaW5lZCBpbgorICoge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoZSBrZXkgd2lsbCBiZSBpZ25vcmVkCisgKiBieSB0aGUgY2FtZXJhIGRldmljZS48L3A+CisgKgorICogQHBhcmFtIHJlcXVlc3QgdGhlIHtAbGluayBBQ2FwdHVyZVJlcXVlc3R9IG9mIGludGVyZXN0IGNyZWF0ZWQgYnkKKyAqICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkc30uCisgKiBAcGFyYW0gcGh5c2ljYWxJZCBvbmUgb2YgdGhlIHBoeXNpY2FsIElkcyB1c2VkIHdoZW4gcmVxdWVzdCBpcyBjcmVhdGVkIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkc30uCisgKiBAcGFyYW0gdGFnIG9uZSBvZiB0aGUgY2FwdHVyZSByZXF1ZXN0IG1ldGFkYXRhIHRhZ3MgaW4KKyAqICAgICAgICAgICAge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30uCisgKgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgcmVxdWVzdCBvciBwaHlzaWNhbElkIGlzIE5VTEwsIGNvdW50IGlzCisgKiAgICAgICAgICAgICBsYXJnZXIgdGhhbiB6ZXJvIHdoaWxlIGRhdGEgaXMgTlVMTCwgdGhlIGRhdGEgdHlwZSBvZiB0aGUgdGFnIGlzIG5vdCB1bnNpZ25lZCA4IGJpdHMsCisgKiAgICAgICAgICAgICB0aGUgdGFnIGlzIG5vdCBjb250cm9sbGFibGUgYnkgYXBwbGljYXRpb24sIHBoeXNpY2FsSWQgaXMgbm90IG9uZSBvZiB0aGUgSWRzIHVzZWQKKyAqICAgICAgICAgICAgIGluIGNyZWF0aW5nIHRoZSByZXF1ZXN0LCBvciBpZiB0aGUgY2FwdHVyZSByZXF1ZXN0IGlzIGEgcmVndWxhciByZXF1ZXN0IHdpdGggbm8KKyAqICAgICAgICAgICAgIHBoeXNpY2FsIElkcyBhdCBhbGwuPC9saT48L3VsPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX3U4KAorICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIGNvbnN0IGNoYXIqIHBoeXNpY2FsSWQsIHVpbnQzMl90IHRhZywKKyAgICAgICAgdWludDMyX3QgY291bnQsIGNvbnN0IHVpbnQ4X3QqIGRhdGEpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogU2V0L2NoYW5nZSBhIGNhbWVyYSBjYXB0dXJlIGNvbnRyb2wgZW50cnkgd2l0aCBzaWduZWQgMzIgYml0cyBkYXRhIHR5cGUgZm9yCisgKiBhIHBoeXNpY2FsIGNhbWVyYSBvZiBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGRldmljZS4KKyAqCisgKiA8cD5TYW1lIGFzIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9pMzIsIGV4Y2VwdCB0aGF0IGlmIHtAbGluayB0YWd9IGlzIGNvbnRhaW5lZAorICogaW4ge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoaXMgZnVuY3Rpb24KKyAqIHNldHMgdGhlIGVudHJ5IGZvciBhIHBhcnRpY3VsYXIgcGh5c2ljYWwgc3ViLWNhbWVyYSBiYWNraW5nIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAqIElmIHtAbGluayB0YWd9IGlzIG5vdCBjb250YWluZWQgaW4KKyAqIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGUga2V5IHdpbGwgYmUgaWdub3JlZAorICogYnkgdGhlIGNhbWVyYSBkZXZpY2UuPC9wPgorICoKKyAqIEBwYXJhbSByZXF1ZXN0IHRoZSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fSBvZiBpbnRlcmVzdCBjcmVhdGVkIGJ5CisgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHBoeXNpY2FsSWQgb25lIG9mIHRoZSBwaHlzaWNhbCBJZHMgdXNlZCB3aGVuIHJlcXVlc3QgaXMgY3JlYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHRhZyBvbmUgb2YgdGhlIGNhcHR1cmUgcmVxdWVzdCBtZXRhZGF0YSB0YWdzIGluCisgKiAgICAgICAgICAgIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlcXVlc3Qgb3IgcGh5c2ljYWxJZCBpcyBOVUxMLCBjb3VudCBpcworICogICAgICAgICAgICAgbGFyZ2VyIHRoYW4gemVybyB3aGlsZSBkYXRhIGlzIE5VTEwsIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHRhZyBpcyBub3Qgc2lnbmVkIDMyIGJpdHMsCisgKiAgICAgICAgICAgICB0aGUgdGFnIGlzIG5vdCBjb250cm9sbGFibGUgYnkgYXBwbGljYXRpb24sIHBoeXNpY2FsSWQgaXMgbm90IG9uZSBvZiB0aGUgSWRzIHVzZWQKKyAqICAgICAgICAgICAgIGluIGNyZWF0aW5nIHRoZSByZXF1ZXN0LCBvciBpZiB0aGUgY2FwdHVyZSByZXF1ZXN0IGlzIGEgcmVndWxhciByZXF1ZXN0IHdpdGggbm8KKyAqICAgICAgICAgICAgIHBoeXNpY2FsIElkcyBhdCBhbGwuPC9saT48L3VsPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX2kzMigKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBjb25zdCBjaGFyKiBwaHlzaWNhbElkLCB1aW50MzJfdCB0YWcsCisgICAgICAgIHVpbnQzMl90IGNvdW50LCBjb25zdCBpbnQzMl90KiBkYXRhKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIFNldC9jaGFuZ2UgYSBjYW1lcmEgY2FwdHVyZSBjb250cm9sIGVudHJ5IHdpdGggZmxvYXQgZGF0YSB0eXBlIGZvcgorICogYSBwaHlzaWNhbCBjYW1lcmEgb2YgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBkZXZpY2UuCisgKgorICogPHA+U2FtZSBhcyBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfZmxvYXQsIGV4Y2VwdCB0aGF0IGlmIHtAbGluayB0YWd9IGlzIGNvbnRhaW5lZAorICogaW4ge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoaXMgZnVuY3Rpb24KKyAqIHNldHMgdGhlIGVudHJ5IGZvciBhIHBhcnRpY3VsYXIgcGh5c2ljYWwgc3ViLWNhbWVyYSBiYWNraW5nIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAqIElmIHtAbGluayB0YWd9IGlzIG5vdCBjb250YWluZWQgaW4KKyAqIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGUga2V5IHdpbGwgYmUgaWdub3JlZAorICogYnkgdGhlIGNhbWVyYSBkZXZpY2UuPC9wPgorICoKKyAqIEBwYXJhbSByZXF1ZXN0IHRoZSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fSBvZiBpbnRlcmVzdCBjcmVhdGVkIGJ5CisgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHBoeXNpY2FsSWQgb25lIG9mIHRoZSBwaHlzaWNhbCBJZHMgdXNlZCB3aGVuIHJlcXVlc3QgaXMgY3JlYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHRhZyBvbmUgb2YgdGhlIGNhcHR1cmUgcmVxdWVzdCBtZXRhZGF0YSB0YWdzIGluCisgKiAgICAgICAgICAgIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlcXVlc3Qgb3IgcGh5c2ljYWxJZCBpcyBOVUxMLCBjb3VudCBpcworICogICAgICAgICAgICAgbGFyZ2VyIHRoYW4gemVybyB3aGlsZSBkYXRhIGlzIE5VTEwsIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHRhZyBpcyBub3QgZmxvYXQsCisgKiAgICAgICAgICAgICB0aGUgdGFnIGlzIG5vdCBjb250cm9sbGFibGUgYnkgYXBwbGljYXRpb24sIHBoeXNpY2FsSWQgaXMgbm90IG9uZSBvZiB0aGUgSWRzIHVzZWQKKyAqICAgICAgICAgICAgIGluIGNyZWF0aW5nIHRoZSByZXF1ZXN0LCBvciBpZiB0aGUgY2FwdHVyZSByZXF1ZXN0IGlzIGEgcmVndWxhciByZXF1ZXN0IHdpdGggbm8KKyAqICAgICAgICAgICAgIHBoeXNpY2FsIElkcyBhdCBhbGwuPC9saT48L3VsPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX2Zsb2F0KAorICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIGNvbnN0IGNoYXIqIHBoeXNpY2FsSWQsIHVpbnQzMl90IHRhZywKKyAgICAgICAgdWludDMyX3QgY291bnQsIGNvbnN0IGZsb2F0KiBkYXRhKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIFNldC9jaGFuZ2UgYSBjYW1lcmEgY2FwdHVyZSBjb250cm9sIGVudHJ5IHdpdGggc2lnbmVkIDY0IGJpdHMgZGF0YSB0eXBlIGZvcgorICogYSBwaHlzaWNhbCBjYW1lcmEgb2YgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBkZXZpY2UuCisgKgorICogPHA+U2FtZSBhcyBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfaTY0LCBleGNlcHQgdGhhdCBpZiB7QGxpbmsgdGFnfSBpcyBjb250YWluZWQKKyAqIGluIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGlzIGZ1bmN0aW9uCisgKiBzZXRzIHRoZSBlbnRyeSBmb3IgYSBwYXJ0aWN1bGFyIHBoeXNpY2FsIHN1Yi1jYW1lcmEgYmFja2luZyB0aGUgbG9naWNhbCBtdWx0aS1jYW1lcmEuCisgKiBJZiB7QGxpbmsgdGFnfSBpcyBub3QgY29udGFpbmVkIGluCisgKiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhlIGtleSB3aWxsIGJlIGlnbm9yZWQKKyAqIGJ5IHRoZSBjYW1lcmEgZGV2aWNlLjwvcD4KKyAqCisgKiBAcGFyYW0gcmVxdWVzdCB0aGUge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0gb2YgaW50ZXJlc3QgY3JlYXRlZCBieQorICogICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSBwaHlzaWNhbElkIG9uZSBvZiB0aGUgcGh5c2ljYWwgSWRzIHVzZWQgd2hlbiByZXF1ZXN0IGlzIGNyZWF0ZWQgd2l0aAorICogICAgICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSB0YWcgb25lIG9mIHRoZSBjYXB0dXJlIHJlcXVlc3QgbWV0YWRhdGEgdGFncyBpbgorICogICAgICAgICAgICB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfS4KKyAqCisgKiBAcmV0dXJuIDx1bD4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX09LfSBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZHMuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSfSBpZiByZXF1ZXN0IG9yIHBoeXNpY2FsSWQgaXMgTlVMTCwgY291bnQgaXMKKyAqICAgICAgICAgICAgIGxhcmdlciB0aGFuIHplcm8gd2hpbGUgZGF0YSBpcyBOVUxMLCB0aGUgZGF0YSB0eXBlIG9mIHRoZSB0YWcgaXMgbm90IHNpZ25lZCA2NCBiaXRzLAorICogICAgICAgICAgICAgdGhlIHRhZyBpcyBub3QgY29udHJvbGxhYmxlIGJ5IGFwcGxpY2F0aW9uLCBwaHlzaWNhbElkIGlzIG5vdCBvbmUgb2YgdGhlIElkcyB1c2VkCisgKiAgICAgICAgICAgICBpbiBjcmVhdGluZyB0aGUgcmVxdWVzdCwgb3IgaWYgdGhlIGNhcHR1cmUgcmVxdWVzdCBpcyBhIHJlZ3VsYXIgcmVxdWVzdCB3aXRoIG5vCisgKiAgICAgICAgICAgICBwaHlzaWNhbCBJZHMgYXQgYWxsLjwvbGk+PC91bD4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV9pNjQoCisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgY29uc3QgY2hhciogcGh5c2ljYWxJZCwgdWludDMyX3QgdGFnLAorICAgICAgICB1aW50MzJfdCBjb3VudCwgY29uc3QgaW50NjRfdCogZGF0YSkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBTZXQvY2hhbmdlIGEgY2FtZXJhIGNhcHR1cmUgY29udHJvbCBlbnRyeSB3aXRoIGRvdWJsZSBkYXRhIHR5cGUgZm9yCisgKiBhIHBoeXNpY2FsIGNhbWVyYSBvZiBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGRldmljZS4KKyAqCisgKiA8cD5TYW1lIGFzIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9kb3VibGUsIGV4Y2VwdCB0aGF0IGlmIHtAbGluayB0YWd9IGlzIGNvbnRhaW5lZAorICogaW4ge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoaXMgZnVuY3Rpb24KKyAqIHNldHMgdGhlIGVudHJ5IGZvciBhIHBhcnRpY3VsYXIgcGh5c2ljYWwgc3ViLWNhbWVyYSBiYWNraW5nIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAqIElmIHtAbGluayB0YWd9IGlzIG5vdCBjb250YWluZWQgaW4KKyAqIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGUga2V5IHdpbGwgYmUgaWdub3JlZAorICogYnkgdGhlIGNhbWVyYSBkZXZpY2UuPC9wPgorICoKKyAqIEBwYXJhbSByZXF1ZXN0IHRoZSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fSBvZiBpbnRlcmVzdCBjcmVhdGVkIGJ5CisgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHBoeXNpY2FsSWQgb25lIG9mIHRoZSBwaHlzaWNhbCBJZHMgdXNlZCB3aGVuIHJlcXVlc3QgaXMgY3JlYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHRhZyBvbmUgb2YgdGhlIGNhcHR1cmUgcmVxdWVzdCBtZXRhZGF0YSB0YWdzIGluCisgKiAgICAgICAgICAgIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlcXVlc3Qgb3IgcGh5c2ljYWxJZCBpcyBOVUxMLCBjb3VudCBpcworICogICAgICAgICAgICAgbGFyZ2VyIHRoYW4gemVybyB3aGlsZSBkYXRhIGlzIE5VTEwsIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHRhZyBpcyBub3QgZG91YmxlLAorICogICAgICAgICAgICAgdGhlIHRhZyBpcyBub3QgY29udHJvbGxhYmxlIGJ5IGFwcGxpY2F0aW9uLCBwaHlzaWNhbElkIGlzIG5vdCBvbmUgb2YgdGhlIElkcyB1c2VkCisgKiAgICAgICAgICAgICBpbiBjcmVhdGluZyB0aGUgcmVxdWVzdCwgb3IgaWYgdGhlIGNhcHR1cmUgcmVxdWVzdCBpcyBhIHJlZ3VsYXIgcmVxdWVzdCB3aXRoIG5vCisgKiAgICAgICAgICAgICBwaHlzaWNhbCBJZHMgYXQgYWxsLjwvbGk+PC91bD4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV9kb3VibGUoCisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgY29uc3QgY2hhciogcGh5c2ljYWxJZCwgdWludDMyX3QgdGFnLAorICAgICAgICB1aW50MzJfdCBjb3VudCwgY29uc3QgZG91YmxlKiBkYXRhKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIFNldC9jaGFuZ2UgYSBjYW1lcmEgY2FwdHVyZSBjb250cm9sIGVudHJ5IHdpdGggcmF0aW9uYWwgZGF0YSB0eXBlIGZvcgorICogYSBwaHlzaWNhbCBjYW1lcmEgb2YgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBkZXZpY2UuCisgKgorICogPHA+U2FtZSBhcyBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcmF0aW9uYWwsIGV4Y2VwdCB0aGF0IGlmIHtAbGluayB0YWd9IGlzIGNvbnRhaW5lZAorICogaW4ge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoaXMgZnVuY3Rpb24KKyAqIHNldHMgdGhlIGVudHJ5IGZvciBhIHBhcnRpY3VsYXIgcGh5c2ljYWwgc3ViLWNhbWVyYSBiYWNraW5nIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAqIElmIHtAbGluayB0YWd9IGlzIG5vdCBjb250YWluZWQgaW4KKyAqIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGUga2V5IHdpbGwgYmUgaWdub3JlZAorICogYnkgdGhlIGNhbWVyYSBkZXZpY2UuPC9wPgorICoKKyAqIEBwYXJhbSByZXF1ZXN0IHRoZSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fSBvZiBpbnRlcmVzdCBjcmVhdGVkIGJ5CisgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHBoeXNpY2FsSWQgb25lIG9mIHRoZSBwaHlzaWNhbCBJZHMgdXNlZCB3aGVuIHJlcXVlc3QgaXMgY3JlYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHRhZyBvbmUgb2YgdGhlIGNhcHR1cmUgcmVxdWVzdCBtZXRhZGF0YSB0YWdzIGluCisgKiAgICAgICAgICAgIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlcXVlc3Qgb3IgcGh5c2ljYWxJZCBpcyBOVUxMLCBjb3VudCBpcworICogICAgICAgICAgICAgbGFyZ2VyIHRoYW4gemVybyB3aGlsZSBkYXRhIGlzIE5VTEwsIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHRhZyBpcyBub3QgcmF0aW9uYWwsCisgKiAgICAgICAgICAgICB0aGUgdGFnIGlzIG5vdCBjb250cm9sbGFibGUgYnkgYXBwbGljYXRpb24sIHBoeXNpY2FsSWQgaXMgbm90IG9uZSBvZiB0aGUgSWRzIHVzZWQKKyAqICAgICAgICAgICAgIGluIGNyZWF0aW5nIHRoZSByZXF1ZXN0LCBvciBpZiB0aGUgY2FwdHVyZSByZXF1ZXN0IGlzIGEgcmVndWxhciByZXF1ZXN0IHdpdGggbm8KKyAqICAgICAgICAgICAgIHBoeXNpY2FsIElkcyBhdCBhbGwuPC9saT48L3VsPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX3JhdGlvbmFsKAorICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIGNvbnN0IGNoYXIqIHBoeXNpY2FsSWQsIHVpbnQzMl90IHRhZywKKyAgICAgICAgdWludDMyX3QgY291bnQsIGNvbnN0IEFDYW1lcmFNZXRhZGF0YV9yYXRpb25hbCogZGF0YSkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLyogX05ES19DQVBUVVJFX1JFUVVFU1RfSCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9saWJjYW1lcmEybmRrLm1hcC50eHQgYi9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dAppbmRleCBhMjllOTZkLi45NDZhOThlIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dAorKysgYi9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dApAQCAtMiwxMyArMiwxNiBAQAogICBnbG9iYWw6CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2Fib3J0Q2FwdHVyZXM7CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmU7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZTsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2Nsb3NlOwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9nZXREZXZpY2U7CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3NldFJlcGVhdGluZ1JlcXVlc3Q7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfc2V0UmVwZWF0aW5nUmVxdWVzdDsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0b3BSZXBlYXRpbmc7CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3VwZGF0ZVNoYXJlZE91dHB1dDsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQUNhbWVyYURldmljZV9jbG9zZTsKICAgICBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0OworICAgIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzOyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9uOwogICAgIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb25XaXRoU2Vzc2lvblBhcmFtZXRlcnM7ICMgaW50cm9kdWNlZD0yOAogICAgIEFDYW1lcmFEZXZpY2VfZ2V0SWQ7CkBAIC0yMCwxMCArMjMsMTMgQEAKICAgICBBQ2FtZXJhTWFuYWdlcl9vcGVuQ2FtZXJhOwogICAgIEFDYW1lcmFNYW5hZ2VyX3JlZ2lzdGVyQXZhaWxhYmlsaXR5Q2FsbGJhY2s7CiAgICAgQUNhbWVyYU1hbmFnZXJfdW5yZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrOworICAgIEFDYW1lcmFNYW5hZ2VyX3JlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjazsgIyBpbnRyb2R1Y2VkPTI5CisgICAgQUNhbWVyYU1hbmFnZXJfdW5yZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2s7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYW1lcmFNZXRhZGF0YV9jb3B5OwogICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlOwogICAgIEFDYW1lcmFNZXRhZGF0YV9nZXRBbGxUYWdzOwogICAgIEFDYW1lcmFNZXRhZGF0YV9nZXRDb25zdEVudHJ5OworICAgIEFDYW1lcmFNZXRhZGF0YV9pc0xvZ2ljYWxNdWx0aUNhbWVyYTsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGU7CiAgICAgQUNhbWVyYU91dHB1dFRhcmdldF9mcmVlOwogICAgIEFDYXB0dXJlUmVxdWVzdF9hZGRUYXJnZXQ7CkBAIC0zMSwxNCArMzcsMjEgQEAKICAgICBBQ2FwdHVyZVJlcXVlc3RfZnJlZTsKICAgICBBQ2FwdHVyZVJlcXVlc3RfZ2V0QWxsVGFnczsKICAgICBBQ2FwdHVyZVJlcXVlc3RfZ2V0Q29uc3RFbnRyeTsKKyAgICBBQ2FwdHVyZVJlcXVlc3RfZ2V0Q29uc3RFbnRyeV9waHlzaWNhbENhbWVyYTsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhcHR1cmVSZXF1ZXN0X2dldFVzZXJDb250ZXh0OyAjIGludHJvZHVjZWQ9MjgKICAgICBBQ2FwdHVyZVJlcXVlc3RfcmVtb3ZlVGFyZ2V0OwogICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9kb3VibGU7CisgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX2RvdWJsZTsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X2Zsb2F0OworICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV9mbG9hdDsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X2kzMjsKKyAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcGh5c2ljYWxDYW1lcmFfaTMyOyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfaTY0OworICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV9pNjQ7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9yYXRpb25hbDsKKyAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcGh5c2ljYWxDYW1lcmFfcmF0aW9uYWw7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV91ODsKKyAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcGh5c2ljYWxDYW1lcmFfdTg7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRVc2VyQ29udGV4dDsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZDsKICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfY3JlYXRlOwpAQCAtNDgsNiArNjEsNyBAQAogICAgIEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9jcmVhdGU7ICMgaW50cm9kdWNlZD0yOAogICAgIEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9hZGQ7ICMgaW50cm9kdWNlZD0yOAogICAgIEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9yZW1vdmU7ICMgaW50cm9kdWNlZD0yOAorICAgIEFDYXB0dXJlU2Vzc2lvblBoeXNpY2FsT3V0cHV0X2NyZWF0ZTsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2ZyZWU7CiAgIGxvY2FsOgogICAgICo7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25WZW5kb3IuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvblZlbmRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYWY4YzEKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25WZW5kb3IuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJ1dGlscy5oIgorCitzdHJ1Y3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IHsKKyAgICBleHBsaWNpdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQobmF0aXZlX2hhbmRsZV90KiB3aW5kb3csIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBoeXNpY2FsQ2FtZXJhSWQgPSAiIikgOgorICAgICAgICAgICAgbVdpbmRvdyh3aW5kb3cpLCBtSXNTaGFyZWQoaXNTaGFyZWQpLCBtUGh5c2ljYWxDYW1lcmFJZChwaHlzaWNhbENhbWVyYUlkKSB7fTsKKworICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChtV2luZG93ID09IG90aGVyLm1XaW5kb3cpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgIT0gb3RoZXIubVdpbmRvdzsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgPCBvdGhlci5tV2luZG93OworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyA+IG90aGVyLm1XaW5kb3c7CisgICAgfQorCisgICAgYW5kcm9pZDo6YWNhbTo6dXRpbHM6Om5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgbVdpbmRvdzsKKyAgICBzdGQ6OnNldDxhbmRyb2lkOjphY2FtOjp1dGlsczo6bmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlcj4gbVNoYXJlZFdpbmRvd3M7CisgICAgYm9vbCAgICAgICAgICAgbUlzU2hhcmVkOworICAgIGludCAgICAgICAgICAgIG1Sb3RhdGlvbiA9IENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzA7CisgICAgc3RkOjpzdHJpbmcgbVBoeXNpY2FsQ2FtZXJhSWQ7Cit9OworCisKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM4YTMxZQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCkBAIC0wLDAgKzEsMTYyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUNhbWVyYURldmljZVZlbmRvciIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPENhbWVyYU1ldGFkYXRhLmg+CisKKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oIgorI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgorI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgIkFDYXB0dXJlUmVxdWVzdC5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKKyNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaW5jIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCit1c2luZyBIQ2FtZXJhTWV0YWRhdGEgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhbWVyYU1ldGFkYXRhOwordXNpbmcgT3V0cHV0Q29uZmlndXJhdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6T3V0cHV0Q29uZmlndXJhdGlvbjsKK3VzaW5nIGhhcmR3YXJlOjpWb2lkOworCisvLyBTdGF0aWMgbWVtYmVyIGRlZmluaXRpb25zCitjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDb250ZXh0S2V5ICAgICAgICA9ICJDb250ZXh0IjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0RldmljZUtleSAgICAgICAgID0gIkRldmljZSI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtFcnJvckNvZGVLZXkgICAgICA9ICJFcnJvckNvZGUiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ2FsbGJhY2tGcEtleSAgICAgPSAiQ2FsbGJhY2siOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprU2Vzc2lvblNwS2V5ICAgICAgPSAiU2Vzc2lvblNwIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NhcHR1cmVSZXF1ZXN0S2V5ID0gIkNhcHR1cmVSZXF1ZXN0IjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a1RpbWVTdGFtcEtleSAgICAgID0gIlRpbWVTdGFtcCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDYXB0dXJlUmVzdWx0S2V5ICA9ICJDYXB0dXJlUmVzdWx0IjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a1BoeXNpY2FsQ2FwdHVyZVJlc3VsdEtleSA9ICJQaHlzaWNhbENhcHR1cmVSZXN1bHQiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ2FwdHVyZUZhaWx1cmVLZXkgPSAiQ2FwdHVyZUZhaWx1cmUiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprU2VxdWVuY2VJZEtleSAgICAgPSAiU2VxdWVuY2VJZCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtGcmFtZU51bWJlcktleSAgICA9ICJGcmFtZU51bWJlciI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtBbndLZXkgICAgICAgICAgICA9ICJBbnciOworCisvKioKKyAqIENhbWVyYURldmljZSBJbXBsZW1lbnRhdGlvbgorICovCitDYW1lcmFEZXZpY2U6OkNhbWVyYURldmljZSgKKyAgICAgICAgY29uc3QgY2hhciogaWQsCisgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNiLAorICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzLAorICAgICAgICBBQ2FtZXJhRGV2aWNlKiB3cmFwcGVyKSA6CisgICAgICAgIG1DYW1lcmFJZChpZCksCisgICAgICAgIG1BcHBDYWxsYmFja3MoKmNiKSwKKyAgICAgICAgbUNoYXJzKHN0ZDo6bW92ZShjaGFycykpLAorICAgICAgICBtU2VydmljZUNhbGxiYWNrKG5ldyBTZXJ2aWNlQ2FsbGJhY2sodGhpcykpLAorICAgICAgICBtV3JhcHBlcih3cmFwcGVyKSwKKyAgICAgICAgbUluRXJyb3IoZmFsc2UpLAorICAgICAgICBtRXJyb3IoQUNBTUVSQV9PSyksCisgICAgICAgIG1JZGxlKHRydWUpLAorICAgICAgICBtQ3VycmVudFNlc3Npb24obnVsbHB0cikgeworICAgIG1DbG9zaW5nID0gZmFsc2U7CisgICAgLy8gU2V0dXAgbG9vcGVyIHRocmVhZCB0byBwZXJmcm9tIGRldmljZSBjYWxsYmFja3MgdG8gYXBwCisgICAgbUNiTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbUNiTG9vcGVyLT5zZXROYW1lKCJDMk4tZGV2LWxvb3BlciIpOworICAgIHN0YXR1c190IGVyciA9IG1DYkxvb3Blci0+c3RhcnQoCisgICAgICAgICAgICAvKnJ1bk9uQ2FsbGluZ1RocmVhZCovZmFsc2UsCisgICAgICAgICAgICAvKmNhbkNhbGxKYXZhKi8gICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIFBSSU9SSVRZX0RFRkFVTFQpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc3RhcnQgY2FtZXJhIGRldmljZSBjYWxsYmFjayBsb29wZXI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgfQorICAgIG1IYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcigpOworICAgIG1DYkxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKKworICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSA9IG1DaGFycy0+Z2V0SW50ZXJuYWxEYXRhKCk7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX1JFUVVFU1RfUEFSVElBTF9SRVNVTFRfQ09VTlQpOworICAgIGlmIChlbnRyeS5jb3VudCAhPSAxKSB7CisgICAgICAgIEFMT0dXKCIlczogYmFkIGNvdW50ICV6dSBmb3IgcGFydGlhbCByZXN1bHQgY291bnQiLCBfX0ZVTkNUSU9OX18sIGVudHJ5LmNvdW50KTsKKyAgICAgICAgbVBhcnRpYWxSZXN1bHRDb3VudCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVBhcnRpYWxSZXN1bHRDb3VudCA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgIH0KKworICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFKTsKKyAgICBpZiAoZW50cnkuY291bnQgIT0gMikgeworICAgICAgICBBTE9HVygiJXM6IGJhZCBjb3VudCAlenUgZm9yIHNoYWRpbmcgbWFwIHNpemUiLCBfX0ZVTkNUSU9OX18sIGVudHJ5LmNvdW50KTsKKyAgICAgICAgbVNoYWRpbmdNYXBTaXplWzBdID0gMDsKKyAgICAgICAgbVNoYWRpbmdNYXBTaXplWzFdID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2hhZGluZ01hcFNpemVbMF0gPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICAgICAgbVNoYWRpbmdNYXBTaXplWzFdID0gZW50cnkuZGF0YS5pMzJbMV07CisgICAgfQorfQorCisvLyBEZXZpY2UgY2xvc2UgaW1wbGVtZW50YWl0b24KK0NhbWVyYURldmljZTo6fkNhbWVyYURldmljZSgpIHsKKyAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBtQ3VycmVudFNlc3Npb24ucHJvbW90ZSgpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKKyAgICAgICAgaWYgKCFpc0Nsb3NlZCgpKSB7CisgICAgICAgICAgICBkaXNjb25uZWN0TG9ja2VkKHNlc3Npb24pOworICAgICAgICB9CisgICAgICAgIG1DdXJyZW50U2Vzc2lvbiA9IG51bGxwdHI7CisgICAgICAgIGlmIChtQ2JMb29wZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUNiTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlci0+aWQoKSk7CisgICAgICAgICAgICBtQ2JMb29wZXItPnN0b3AoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQ2JMb29wZXIuY2xlYXIoKTsKKyAgICBtSGFuZGxlci5jbGVhcigpOworfQorCit2b2lkCitDYW1lcmFEZXZpY2U6OnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChzcDxBTWVzc2FnZT4mIG1zZykgeworICAgIG1zZy0+cG9zdCgpOworICAgIG1zZy5jbGVhcigpOworICAgIHNwPEFNZXNzYWdlPiBjbGVhbnVwTXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2xlYW5VcFNlc3Npb25zLCBtSGFuZGxlcik7CisgICAgY2xlYW51cE1zZy0+cG9zdCgpOworfQorCisvLyBUT0RPOiBjYWNoZWQgY3JlYXRlZCByZXF1ZXN0PworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KAorICAgICAgICBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgY29uc3QgQUNhbWVyYUlkTGlzdCogcGh5c2ljYWxDYW1lcmFJZExpc3QsCisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3QpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURldmljZUxvY2spOworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKG1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOworICAgIH0KKyAgICBDYW1lcmFNZXRhZGF0YSByYXdSZXF1ZXN0OworICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok5PX0VSUk9SOworICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoCisgICAgICAgIHV0aWxzOjpjb252ZXJ0VG9IaWRsKHRlbXBsYXRlSWQpLAorICAgICAgICBbJnN0YXR1cywgJnJhd1JlcXVlc3RdKGF1dG8gcywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJm1ldGFkYXRhKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok5PX0VSUk9SICYmIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGxDbG9uZWQobWV0YWRhdGEsICZyYXdSZXF1ZXN0KSkgeworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkbid0IGNyZWF0ZSBkZWZhdWx0IHJlcXVlc3QiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciB3aGlsZSB0cnlpbmcgdG8gY3JlYXRlIGRlZmF1bHQgcmVxdWVzdCAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgcmVtb3RlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChzdGF0dXMpOworICAgIH0KKyAgICBBQ2FwdHVyZVJlcXVlc3QqIG91dFJlcSA9IG5ldyBBQ2FwdHVyZVJlcXVlc3QoKTsKKyAgICBvdXRSZXEtPnNldHRpbmdzID0gbmV3IEFDYW1lcmFNZXRhZGF0YShyYXdSZXF1ZXN0LnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVRVUVTVCk7CisgICAgaWYgKHBoeXNpY2FsQ2FtZXJhSWRMaXN0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgZm9yIChhdXRvIGkgPSAwOyBpIDwgcGh5c2ljYWxDYW1lcmFJZExpc3QtPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICAgICAgb3V0UmVxLT5waHlzaWNhbFNldHRpbmdzLmVtcGxhY2UocGh5c2ljYWxDYW1lcmFJZExpc3QtPmNhbWVyYUlkc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFDYW1lcmFNZXRhZGF0YSgqKG91dFJlcS0+c2V0dGluZ3MpKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgb3V0UmVxLT50YXJnZXRzICA9IG5ldyBBQ2FtZXJhT3V0cHV0VGFyZ2V0cygpOworICAgICpyZXF1ZXN0ID0gb3V0UmVxOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Y3JlYXRlQ2FwdHVyZVNlc3Npb24oCisgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogICAgICAgb3V0cHV0cywKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzZXNzaW9uUGFyYW1ldGVycywKKyAgICAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFja3MsCisgICAgICAgIC8qb3V0Ki9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKiBzZXNzaW9uKSB7CisgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBjdXJyZW50U2Vzc2lvbiA9IG1DdXJyZW50U2Vzc2lvbi5wcm9tb3RlKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKGN1cnJlbnRTZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgY3VycmVudFNlc3Npb24tPmNsb3NlQnlEZXZpY2UoKTsKKyAgICAgICAgc3RvcFJlcGVhdGluZ0xvY2tlZCgpOworICAgIH0KKworICAgIC8vIENyZWF0ZSBuZXcgc2Vzc2lvbgorICAgIHJldCA9IGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQob3V0cHV0cywgc2Vzc2lvblBhcmFtZXRlcnMpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiRmFpbCB0byBjcmVhdGUgbmV3IHNlc3Npb24uIGNhbm5vdCBjb25maWd1cmUgc3RyZWFtcyIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogbmV3U2Vzc2lvbiA9IG5ldyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24oCisgICAgICAgICAgICBtTmV4dFNlc3Npb25JZCsrLCBvdXRwdXRzLCBjYWxsYmFja3MsIHRoaXMpOworCisgICAgLy8gc2V0IG5ldyBzZXNzaW9uIGFzIGN1cnJlbnQgc2Vzc2lvbgorICAgIG5ld1Nlc3Npb24tPmluY1N0cm9uZygodm9pZCAqKSBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9uKTsKKyAgICBtQ3VycmVudFNlc3Npb24gPSBuZXdTZXNzaW9uOworICAgIG1GbHVzaGluZyA9IGZhbHNlOworICAgICpzZXNzaW9uID0gbmV3U2Vzc2lvbjsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKwordm9pZCBDYW1lcmFEZXZpY2U6OmFkZFJlcXVlc3RTZXR0aW5nc01ldGFkYXRhKEFDYXB0dXJlUmVxdWVzdCAqYUNhcHR1cmVSZXF1ZXN0LAorICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gJnJlcSkgeworICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhQ29weSA9IGFDYXB0dXJlUmVxdWVzdC0+c2V0dGluZ3MtPmdldEludGVybmFsRGF0YSgpOworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpjYW1lcmFfbWV0YWRhdGEgPSBtZXRhZGF0YUNvcHkuZ2V0QW5kTG9jaygpOworICAgIEhDYW1lcmFNZXRhZGF0YSBoQ2FtZXJhTWV0YWRhdGE7CisgICAgdXRpbHM6OmNvbnZlcnRUb0hpZGwoY2FtZXJhX21ldGFkYXRhLCAmaENhbWVyYU1ldGFkYXRhKTsKKyAgICBtZXRhZGF0YUNvcHkudW5sb2NrKGNhbWVyYV9tZXRhZGF0YSk7CisgICAgcmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5yZXNpemUoMSk7CisgICAgcmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5nc1swXS5zZXR0aW5ncy5tZXRhZGF0YShzdGQ6Om1vdmUoaENhbWVyYU1ldGFkYXRhKSk7Cit9CisKK2NhbWVyYV9zdGF0dXNfdCBDYW1lcmFEZXZpY2U6OnVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb25Mb2NrZWQoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQpIHsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKG91dHB1dCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIGlmICghb3V0cHV0LT5tSXNTaGFyZWQpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIG91dHB1dCBjb25maWd1cmF0aW9uIGlzIG5vdCBzaGFyZWQiKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaW50MzJfdCBzdHJlYW1JZCA9IC0xOworICAgIGZvciAoYXV0byYga3ZQYWlyIDogbUNvbmZpZ3VyZWRPdXRwdXRzKSB7CisgICAgICAgIGlmICh1dGlsczo6aXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChrdlBhaXIuc2Vjb25kLmZpcnN0LCBvdXRwdXQtPm1XaW5kb3cpKSB7CisgICAgICAgICAgICBzdHJlYW1JZCA9IGt2UGFpci5maXJzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdHJlYW1JZCA8IDApIHsKKyAgICAgICAgQUxPR0UoIkVycm9yOiBJbnZhbGlkIG91dHB1dCBjb25maWd1cmF0aW9uIik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyIG91dENvbmZpZ1c7CisgICAgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3V0Q29uZmlnID0gb3V0Q29uZmlnVy5tT3V0cHV0Q29uZmlndXJhdGlvbjsKKyAgICBvdXRDb25maWcucm90YXRpb24gPSB1dGlsczo6Y29udmVydFRvSGlkbChvdXRwdXQtPm1Sb3RhdGlvbik7CisgICAgb3V0Q29uZmlnLndpbmRvd0dyb3VwSWQgPSAtMTsgLy8gbmRrIGRvZXNuJ3Qgc3VwcG9ydCBpbnRlciBPdXRwdXRDb25maWd1cmF0aW9uIGJ1ZmZlciBzaGFyaW5nLgorICAgIG91dENvbmZpZy53aW5kb3dIYW5kbGVzLnJlc2l6ZShvdXRwdXQtPm1TaGFyZWRXaW5kb3dzLnNpemUoKSArIDEpOworICAgIG91dENvbmZpZy53aW5kb3dIYW5kbGVzWzBdID0gb3V0cHV0LT5tV2luZG93OworICAgIG91dENvbmZpZy5waHlzaWNhbENhbWVyYUlkID0gb3V0cHV0LT5tUGh5c2ljYWxDYW1lcmFJZDsKKyAgICBpbnQgaSA9IDE7CisgICAgZm9yIChhdXRvJiBhbncgOiBvdXRwdXQtPm1TaGFyZWRXaW5kb3dzKSB7CisgICAgICAgIG91dENvbmZpZy53aW5kb3dIYW5kbGVzW2krK10gPSBhbnc7CisgICAgfQorCisgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT51cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKHN0cmVhbUlkLCBvdXRDb25maWcpOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIHVwZGF0aW5nIE91dHB1dENvbmZpZ3VyYXRpb246ICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICByZW1vdGVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHJlbW90ZVJldCkgeworICAgICAgICAgICAgY2FzZSBTdGF0dXM6Ok5PX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTdGF0dXM6OklOVkFMSURfT1BFUkFUSU9OOgorICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGludmFsaWQgb3BlcmF0aW9uIiwgZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICBjYXNlIFN0YXR1czo6QUxSRUFEWV9FWElTVFM6CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgb3V0cHV0IHN1cmZhY2UgYWxyZWFkeSBleGlzdHMiLCBnZXRJZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGludmFsaWQgaW5wdXQgYXJndW1lbnQiLCBnZXRJZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgZmFpbGVkIHRvIGFkZCBzaGFyZWQgb3V0cHV0IiwgZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBtQ29uZmlndXJlZE91dHB1dHNbc3RyZWFtSWRdID0gc3RkOjptYWtlX3BhaXIob3V0cHV0LT5tV2luZG93LCBvdXRDb25maWdXKTsKKworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6YWxsb2NhdGVDYXB0dXJlUmVxdWVzdExvY2tlZCgKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCAvKm91dCovc3A8Q2FwdHVyZVJlcXVlc3Q+ICZvdXRSZXEpIHsKKyAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxKG5ldyBDYXB0dXJlUmVxdWVzdCgpKTsKKyAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzLnJlc2l6ZSgxICsgcmVxdWVzdC0+cGh5c2ljYWxTZXR0aW5ncy5zaXplKCkpOworCisgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICBhbGxvY2F0ZU9uZUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGEoCisgICAgICAgICAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzW2luZGV4KytdLCBtQ2FtZXJhSWQsIHJlcXVlc3QtPnNldHRpbmdzKTsKKworICAgIGZvciAoYXV0byYgcGh5c2ljYWxFbnRyeSA6IHJlcXVlc3QtPnBoeXNpY2FsU2V0dGluZ3MpIHsKKyAgICAgICAgYWxsb2NhdGVPbmVDYXB0dXJlUmVxdWVzdE1ldGFkYXRhKAorICAgICAgICAgICAgICAgIHJlcS0+bUNhcHR1cmVSZXF1ZXN0LnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NbaW5kZXgrK10sCisgICAgICAgICAgICAgICAgcGh5c2ljYWxFbnRyeS5maXJzdCwgcGh5c2ljYWxFbnRyeS5zZWNvbmQpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHJlcXVlc3RTdHJlYW1JZHhMaXN0OworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHJlcXVlc3RTdXJmYWNlSWR4TGlzdDsKKyAgICBmb3IgKGF1dG8gb3V0cHV0VGFyZ2V0IDogcmVxdWVzdC0+dGFyZ2V0cy0+bU91dHB1dHMpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBhbncgPSBvdXRwdXRUYXJnZXQubVdpbmRvdzsKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICByZXEtPm1TdXJmYWNlTGlzdC5wdXNoX2JhY2soYW53KTsKKyAgICAgICAgLy8gbG9va3VwIHN0cmVhbS9zdXJmYWNlIElECisgICAgICAgIGZvciAoY29uc3QgYXV0byYga3ZQYWlyIDogbUNvbmZpZ3VyZWRPdXRwdXRzKSB7CisgICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSBrdlBhaXIuZmlyc3Q7CisgICAgICAgICAgICBjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlciYgb3V0Q29uZmlnID0ga3ZQYWlyLnNlY29uZC5zZWNvbmQ7CisgICAgICAgICAgICBjb25zdCBhdXRvJiB3aW5kb3dIYW5kbGVzID0gb3V0Q29uZmlnLm1PdXRwdXRDb25maWd1cmF0aW9uLndpbmRvd0hhbmRsZXM7CisgICAgICAgICAgICBmb3IgKGludCBzdXJmYWNlSWQgPSAwOyBzdXJmYWNlSWQgPCAoaW50KSB3aW5kb3dIYW5kbGVzLnNpemUoKTsgc3VyZmFjZUlkKyspIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0d28gbmF0aXZlIGhhbmRsZXMgYXJlIGVxdWl2YWxlbnQsIHNvIGFyZSB0aGVpciBzdXJmYWNlcy4KKyAgICAgICAgICAgICAgICBpZiAodXRpbHM6OmlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwod2luZG93SGFuZGxlc1tzdXJmYWNlSWRdLmdldE5hdGl2ZUhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW53KSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTdHJlYW1JZHhMaXN0LnB1c2hfYmFjayhzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTdXJmYWNlSWR4TGlzdC5wdXNoX2JhY2soc3VyZmFjZUlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgQUxPR0UoIlVuY29uZmlndXJlZCBvdXRwdXQgdGFyZ2V0ICVwIGluIGNhcHR1cmUgcmVxdWVzdCEiLCBhbncpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVxLT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzLnJlc2l6ZShyZXF1ZXN0U3RyZWFtSWR4TGlzdC5zaXplKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWVzdFN0cmVhbUlkeExpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgcmVxLT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzW2ldLnN0cmVhbUlkID0gcmVxdWVzdFN0cmVhbUlkeExpc3RbaV07CisgICAgICAgIHJlcS0+bUNhcHR1cmVSZXF1ZXN0LnN0cmVhbUFuZFdpbmRvd0lkc1tpXS53aW5kb3dJZCA9IHJlcXVlc3RTdXJmYWNlSWR4TGlzdFtpXTsKKyAgICB9CisgICAgb3V0UmVxID0gcmVxOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCit2b2lkIENhbWVyYURldmljZTo6YWxsb2NhdGVPbmVDYXB0dXJlUmVxdWVzdE1ldGFkYXRhKAorICAgICAgICBQaHlzaWNhbENhbWVyYVNldHRpbmdzJiBjYW1lcmFTZXR0aW5ncywKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGlkLCBjb25zdCBzcDxBQ2FtZXJhTWV0YWRhdGE+JiBtZXRhZGF0YSkgeworICAgIGNhbWVyYVNldHRpbmdzLmlkID0gaWQ7CisgICAgLy8gVE9ETzogRG8gd2UgcmVhbGx5IG5lZWQgdG8gY29weSB0aGUgbWV0YWRhdGEgaGVyZSA/CisgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGFDb3B5ID0gbWV0YWRhdGEtPmdldEludGVybmFsRGF0YSgpOworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpjYW1lcmFNZXRhZGF0YSA9IG1ldGFkYXRhQ29weS5nZXRBbmRMb2NrKCk7CisgICAgSENhbWVyYU1ldGFkYXRhIGhDYW1lcmFNZXRhZGF0YTsKKyAgICB1dGlsczo6Y29udmVydFRvSGlkbChjYW1lcmFNZXRhZGF0YSwgJmhDYW1lcmFNZXRhZGF0YSk7CisgICAgbWV0YWRhdGFDb3B5LnVubG9jayhjYW1lcmFNZXRhZGF0YSk7CisgICAgaWYgKG1ldGFkYXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGhDYW1lcmFNZXRhZGF0YS5kYXRhKCkgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSAhPSBudWxscHRyICYmCisgICAgICAgICAgICBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT53cml0ZSgKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oaENhbWVyYU1ldGFkYXRhLmRhdGEoKSksCisgICAgICAgICAgICAgICAgaENhbWVyYU1ldGFkYXRhLnNpemUoKSkpIHsKKyAgICAgICAgICAgIC8vIFRoZSBtZXRhZGF0YSBmaWVsZCBvZiB0aGUgdW5pb24gd291bGQndmUgYmVlbiBkZXN0cnVjdHVlZCwgc28gbm8gbmVlZAorICAgICAgICAgICAgLy8gdG8gcmUtc2l6ZSBpdC4KKyAgICAgICAgICAgIGNhbWVyYVNldHRpbmdzLnNldHRpbmdzLmZtcU1ldGFkYXRhU2l6ZShoQ2FtZXJhTWV0YWRhdGEuc2l6ZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJGbXEgd3JpdGUgY2FwdHVyZSByZXN1bHQgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gaHdiaW5kZXIiKTsKKyAgICAgICAgICAgIGNhbWVyYVNldHRpbmdzLnNldHRpbmdzLm1ldGFkYXRhKHN0ZDo6bW92ZShoQ2FtZXJhTWV0YWRhdGEpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCitBQ2FwdHVyZVJlcXVlc3QqCitDYW1lcmFEZXZpY2U6OmFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiYgcmVxLCBjb25zdCBjaGFyKiBkZXZpY2VJZCkgeworICAgIEFDYXB0dXJlUmVxdWVzdCogcFJlcXVlc3QgPSBuZXcgQUNhcHR1cmVSZXF1ZXN0KCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXEtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCA9IHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NbaV0uaWQ7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIGNsb25lOworICAgICAgICB1dGlsczo6Y29udmVydEZyb21IaWRsQ2xvbmVkKHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NbaV0uc2V0dGluZ3MubWV0YWRhdGEoKSwgJmNsb25lKTsKKyAgICAgICAgaWYgKGlkID09IGRldmljZUlkKSB7CisgICAgICAgICAgICBwUmVxdWVzdC0+c2V0dGluZ3MgPSBuZXcgQUNhbWVyYU1ldGFkYXRhKGNsb25lLnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVRVUVTVCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwUmVxdWVzdC0+cGh5c2ljYWxTZXR0aW5nc1tyZXEtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzW2ldLmlkXSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhTWV0YWRhdGEoY2xvbmUucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVFVRVNUKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwUmVxdWVzdC0+dGFyZ2V0cyA9IG5ldyBBQ2FtZXJhT3V0cHV0VGFyZ2V0cygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVxLT5tU3VyZmFjZUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBhbncgPSByZXEtPm1TdXJmYWNlTGlzdFtpXTsKKyAgICAgICAgQUNhbWVyYU91dHB1dFRhcmdldCBvdXRwdXRUYXJnZXQoYW53KTsKKyAgICAgICAgcFJlcXVlc3QtPnRhcmdldHMtPm1PdXRwdXRzLmluc2VydChvdXRwdXRUYXJnZXQpOworICAgIH0KKyAgICByZXR1cm4gcFJlcXVlc3Q7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6ZnJlZUFDYXB0dXJlUmVxdWVzdChBQ2FwdHVyZVJlcXVlc3QqIHJlcSkgeworICAgIGlmIChyZXEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJlcS0+c2V0dGluZ3MuY2xlYXIoKTsKKyAgICBkZWxldGUgcmVxLT50YXJnZXRzOworICAgIGRlbGV0ZSByZXE7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6bm90aWZ5U2Vzc2lvbkVuZE9mTGlmZUxvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24pIHsKKyAgICBpZiAoaXNDbG9zZWQoKSkgeworICAgICAgICAvLyBEZXZpY2UgaXMgY2xvc2luZyBhbHJlYWR5LiBkbyBub3RoaW5nCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUN1cnJlbnRTZXNzaW9uICE9IHNlc3Npb24pIHsKKyAgICAgICAgLy8gU2Vzc2lvbiBoYXMgYmVlbiByZXBsYWNlZCBieSBvdGhlciBzZWVzaW9uIG9yIGRldmljZSBpcyBjbG9zZWQKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ3VycmVudFNlc3Npb24gPSBudWxscHRyOworCisgICAgLy8gU2hvdWxkIG5vdCBoYXBwZW4KKyAgICBpZiAoIXNlc3Npb24tPm1Jc0Nsb3NlZCkgeworICAgICAgICBBTE9HRSgiRXJyb3I6IHVuY2xvc2VkIHNlc3Npb24gJXAgcmVhY2hlcyBlbmQgb2YgbGlmZSEiLCBzZXNzaW9uKTsKKyAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE5vIG5ldyBzZXNzaW9uLCB1bmNvbmZpZ3VyZSBub3cKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZChudWxscHRyLCBudWxscHRyKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIlVuY29uZmlndXJlIHN0cmVhbSBmYWlsZWQuIERldmljZSBtaWdodCBzdGlsbCBiZSBjb25maWd1cmVkISByZXQgJWQiLCByZXQpOworICAgIH0KK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpkaXNjb25uZWN0TG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4mIHNlc3Npb24pIHsKKyAgICBpZiAobUNsb3NpbmcuZXhjaGFuZ2UodHJ1ZSkpIHsKKyAgICAgICAgLy8gQWxyZWFkeSBjbG9zaW5nLCBqdXN0IHJldHVybgorICAgICAgICBBTE9HVygiQ2FtZXJhIGRldmljZSAlcyBpcyBhbHJlYWR5IGNsb3NpbmcuIiwgZ2V0SWQoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobVJlbW90ZSAhPSBudWxscHRyKSB7CisgICAgICAgIGF1dG8gcmV0ID0gbVJlbW90ZS0+ZGlzY29ubmVjdCgpOworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igd2hpbGUgZGlzY29ubmVjdGluZyBkZXZpY2UgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtUmVtb3RlID0gbnVsbHB0cjsKKworICAgIGlmIChzZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgc2Vzc2lvbi0+Y2xvc2VCeURldmljZSgpOworICAgIH0KK30KKworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OnN0b3BSZXBlYXRpbmdMb2NrZWQoKSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN0b3AgcmVwZWF0aW5nIGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKG1SZXBlYXRpbmdTZXF1ZW5jZUlkICE9IFJFUVVFU1RfSURfTk9ORSkgeworICAgICAgICBpbnQgcmVwZWF0aW5nU2VxdWVuY2VJZCA9IG1SZXBlYXRpbmdTZXF1ZW5jZUlkOworICAgICAgICBtUmVwZWF0aW5nU2VxdWVuY2VJZCA9IFJFUVVFU1RfSURfTk9ORTsKKworICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlcjsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+Y2FuY2VsUmVwZWF0aW5nUmVxdWVzdCgKKyAgICAgICAgICAgICAgICBbJnN0YXR1cywgJmxhc3RGcmFtZU51bWJlcl0oU3RhdHVzIHMsIGF1dG8gZnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgbGFzdEZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSB8fCBzdGF0dXMgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY2FuY2VsIGFjdGl2ZSByZXBlYXRpbmcgcmVxdWVzdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChzdGF0dXMpOworICAgICAgICB9CisgICAgICAgIGNoZWNrUmVwZWF0aW5nU2VxdWVuY2VDb21wbGV0ZUxvY2tlZChyZXBlYXRpbmdTZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpOworICAgIH0KKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmZsdXNoTG9ja2VkKEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbikgeworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBhYm9ydCBjYXB0dXJlcyBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGJlY2F1c2UgY3JlYXRpbmcgYSBuZXcgc2Vzc2lvbiB3aWxsIGNsb3NlCisgICAgLy8gcHJldmlvdXMgb25lIGFuZCB0aHVzIHJlamVjdCBhbnkgQVBJIGNhbGwgZnJvbSBwcmV2aW91cyBzZXNzaW9uLgorICAgIC8vIEJ1dCBzdGlsbCBnb29kIHRvIGNoZWNrIGhlcmUgaW4gY2FzZSBzb21ldGhpbmcgdW5leHBlY3RlZCBoYXBwZW4uCisgICAgaWYgKG1DdXJyZW50U2Vzc2lvbiAhPSBzZXNzaW9uKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgc2Vzc2lvbiAlcCBpcyBub3QgY3VycmVudCBhY3RpdmUgc2Vzc2lvbiEiLCBnZXRJZCgpLCBzZXNzaW9uKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKG1GbHVzaGluZykgeworICAgICAgICBBTE9HVygiQ2FtZXJhICVzIGlzIGFscmVhZHkgYWJvcnRpbmcgY2FwdHVyZXMiLCBnZXRJZCgpKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfT0s7CisgICAgfQorCisgICAgbUZsdXNoaW5nID0gdHJ1ZTsKKworICAgIC8vIFNlbmQgb25BY3RpdmUgY2FsbGJhY2sgdG8gZ3VhcmFudGVlIHRoZXJlIGlzIGFsd2F5cyBhY3RpdmUtPnJlYWR5IHRyYW5zaXRpb24KKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIG1IYW5kbGVyKTsKKyAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOworICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vbkFjdGl2ZSk7CisgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisKKyAgICAvLyBJZiBkZXZpY2UgaXMgYWxyZWFkeSBpZGxpbmcsIHNlbmQgY2FsbGJhY2sgYW5kIGV4aXQgZWFybHkKKyAgICBpZiAobUlkbGUpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25TdGF0ZUNiLCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2suY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2sub25SZWFkeSk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgICAgICBtRmx1c2hpbmcgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfT0s7CisgICAgfQorCisgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXI7CisgICAgU3RhdHVzIHN0YXR1czsKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1SZW1vdGUtPmZsdXNoKFsmc3RhdHVzLCAmbGFzdEZyYW1lTnVtYmVyXShhdXRvIHMsIGF1dG8gZnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCIlczogQWJvcnQgY2FwdHVyZXMgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwoc3RhdHVzKTsKKyAgICB9CisgICAgaWYgKG1SZXBlYXRpbmdTZXF1ZW5jZUlkICE9IFJFUVVFU1RfSURfTk9ORSkgeworICAgICAgICBjaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQobVJlcGVhdGluZ1NlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcik7CisgICAgfQorICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6d2FpdFVudGlsSWRsZUxvY2tlZCgpIHsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJXYWl0IHVudGlsIGNhbWVyYSAlcyBpZGxlIGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAobVJlcGVhdGluZ1NlcXVlbmNlSWQgIT0gUkVRVUVTVF9JRF9OT05FKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIHdvbid0IGdvIHRvIGlkbGUgd2hlbiB0aGVyZSBpcyByZXBlYXRpbmcgcmVxdWVzdCEiLCBnZXRJZCgpKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT53YWl0VW50aWxJZGxlKCk7CisgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gd2FpdFVudGlsSWRsZSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChyZW1vdGVSZXQpOworICAgIH0KKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzLAorICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzKSB7CisgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyIGVtcHR5T3V0cHV0OworICAgIGlmIChvdXRwdXRzID09IG51bGxwdHIpIHsKKyAgICAgICAgb3V0cHV0cyA9ICZlbXB0eU91dHB1dDsKKyAgICB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgc3RkOjpzZXQ8c3RkOjpwYWlyPG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIsIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyPj4gb3V0cHV0U2V0OworICAgIGZvciAoYXV0byBvdXRDb25maWcgOiBvdXRwdXRzLT5tT3V0cHV0cykgeworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudyA9IG91dENvbmZpZy5tV2luZG93OworICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlciBvdXRDb25maWdJbnNlcnRXOworICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uICZvdXRDb25maWdJbnNlcnQgPSBvdXRDb25maWdJbnNlcnRXLm1PdXRwdXRDb25maWd1cmF0aW9uOworICAgICAgICBvdXRDb25maWdJbnNlcnQucm90YXRpb24gPSB1dGlsczo6Y29udmVydFRvSGlkbChvdXRDb25maWcubVJvdGF0aW9uKTsKKyAgICAgICAgb3V0Q29uZmlnSW5zZXJ0LndpbmRvd0dyb3VwSWQgPSAtMTsKKyAgICAgICAgb3V0Q29uZmlnSW5zZXJ0LndpbmRvd0hhbmRsZXMucmVzaXplKG91dENvbmZpZy5tU2hhcmVkV2luZG93cy5zaXplKCkgKyAxKTsKKyAgICAgICAgb3V0Q29uZmlnSW5zZXJ0LndpbmRvd0hhbmRsZXNbMF0gPSBhbnc7CisgICAgICAgIG91dENvbmZpZ0luc2VydC5waHlzaWNhbENhbWVyYUlkID0gb3V0Q29uZmlnLm1QaHlzaWNhbENhbWVyYUlkOworICAgICAgICBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIHdyYXAoYW53KTsKKyAgICAgICAgb3V0cHV0U2V0Lmluc2VydChzdGQ6Om1ha2VfcGFpcihhbncsIG91dENvbmZpZ0luc2VydFcpKTsKKyAgICB9CisgICAgc3RkOjpzZXQ8c3RkOjpwYWlyPG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIsIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyPj4gYWRkU2V0ID0gb3V0cHV0U2V0OworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGRlbGV0ZUxpc3Q7CisKKyAgICAvLyBEZXRlcm1pbmUgd2hpY2ggc3RyZWFtcyBuZWVkIHRvIGJlIGNyZWF0ZWQsIHdoaWNoIHRvIGJlIGRlbGV0ZWQKKyAgICBmb3IgKGF1dG8mIGt2UGFpciA6IG1Db25maWd1cmVkT3V0cHV0cykgeworICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0ga3ZQYWlyLmZpcnN0OworICAgICAgICBhdXRvJiBvdXRwdXRQYWlyID0ga3ZQYWlyLnNlY29uZDsKKyAgICAgICAgaWYgKG91dHB1dFNldC5jb3VudChvdXRwdXRQYWlyKSkgeworICAgICAgICAgICAgZGVsZXRlTGlzdC5wdXNoX2JhY2soc3RyZWFtSWQpOyAvLyBOZWVkIHRvIGRlbGV0ZSBhIG5vIGxvbmdlciBuZWVkZWQgc3RyZWFtCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRTZXQuZXJhc2Uob3V0cHV0UGFpcik7ICAgICAgICAvLyBObyBuZWVkIHRvIGFkZCBhbHJlYWR5IGV4aXN0aW5nIHN0cmVhbQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gc3RvcFJlcGVhdGluZ0xvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBzdG9wIHJlcGVhdGluZyBmYWlsZWQsIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0ID0gd2FpdFVudGlsSWRsZUxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyB3YWl0IHVudGlsIGlkbGUgZmFpbGVkLCByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIFNlbmQgb25SZWFkeSB0byBwcmV2aW91cyBzZXNzaW9uCisgICAgLy8gQ3VycmVudFNlc3Npb24gd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGNvbmZpZ3VyZVN0cmVhbUxvY2tlZCwgc28gaGVyZQorICAgIC8vIG1DdXJyZW50U2Vzc2lvbiBpcyB0aGUgc2Vzc2lvbiB0byBiZSByZXBsYWNlZCBieSBhIG5ldyBzZXNzaW9uCisgICAgaWYgKCFtSWRsZSAmJiBtQ3VycmVudFNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgICBpZiAobUJ1c3lTZXNzaW9uICE9IG1DdXJyZW50U2Vzc2lvbikgeworICAgICAgICAgICAgQUxPR0UoIkN1cnJlbnQgc2Vzc2lvbiAhPSBidXN5IHNlc3Npb24iKTsKKyAgICAgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFOworICAgICAgICB9CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgbUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIG1CdXN5U2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2suY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIG1CdXN5U2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBtQnVzeVNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uUmVhZHkpOworICAgICAgICBtQnVzeVNlc3Npb24uY2xlYXIoKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfQorICAgIG1JZGxlID0gdHJ1ZTsKKworICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+YmVnaW5Db25maWd1cmUoKTsKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCl8fCByZW1vdGVSZXQgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBiZWdpbiBjb25maWd1cmUgZmFpbGVkIiwgZ2V0SWQoKSk7CisgICAgICAgIHJldHVybiB1dGlsczo6Y29udmVydEZyb21IaWRsKHJlbW90ZVJldCk7CisgICAgfQorCisgICAgLy8gZGVsZXRlIHRvLWJlLWRlbGV0ZWQgc3RyZWFtcworICAgIGZvciAoYXV0byBzdHJlYW1JZCA6IGRlbGV0ZUxpc3QpIHsKKyAgICAgICAgcmVtb3RlUmV0ID0gbVJlbW90ZS0+ZGVsZXRlU3RyZWFtKHN0cmVhbUlkKTsKKyAgICAgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpIHx8IHJlbW90ZVJldCAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBmYWlsZWQgdG8gcmVtb3ZlIHN0cmVhbSAlZCIsIGdldElkKCksIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIHJldHVybiB1dGlsczo6Y29udmVydEZyb21IaWRsKHJlbW90ZVJldCk7CisgICAgICAgIH0KKyAgICAgICAgbUNvbmZpZ3VyZWRPdXRwdXRzLmVyYXNlKHN0cmVhbUlkKTsKKyAgICB9CisKKyAgICAvLyBhZGQgbmV3IHN0cmVhbXMKKyAgICBmb3IgKGF1dG8gb3V0cHV0UGFpciA6IGFkZFNldCkgeworICAgICAgICBpbnQgc3RyZWFtSWQ7CisgICAgICAgIFN0YXR1cyBzdGF0dXM7CisgICAgICAgIGF1dG8gcmV0ID0gbVJlbW90ZS0+Y3JlYXRlU3RyZWFtKG91dHB1dFBhaXIuc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnN0cmVhbUlkXShTdGF0dXMgcywgYXV0byBzdHJlYW1faWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCA9IHN0cmVhbV9pZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSB8fCBzdGF0dXMgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgZmFpbGVkIHRvIGNyZWF0ZSBzdHJlYW0iLCBnZXRJZCgpKTsKKyAgICAgICAgICAgIHJldHVybiB1dGlsczo6Y29udmVydEZyb21IaWRsKHN0YXR1cyk7CisgICAgICAgIH0KKyAgICAgICAgbUNvbmZpZ3VyZWRPdXRwdXRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihzdHJlYW1JZCwgb3V0cHV0UGFpcikpOworICAgIH0KKworICAgIENhbWVyYU1ldGFkYXRhIHBhcmFtczsKKyAgICBIQ2FtZXJhTWV0YWRhdGEgaGlkbFBhcmFtczsKKyAgICBpZiAoKHNlc3Npb25QYXJhbWV0ZXJzICE9IG51bGxwdHIpICYmIChzZXNzaW9uUGFyYW1ldGVycy0+c2V0dGluZ3MgIT0gbnVsbHB0cikpIHsKKyAgICAgICAgcGFyYW1zLmFwcGVuZChzZXNzaW9uUGFyYW1ldGVycy0+c2V0dGluZ3MtPmdldEludGVybmFsRGF0YSgpKTsKKyAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnBhcmFtc19tZXRhZGF0YSA9IHBhcmFtcy5nZXRBbmRMb2NrKCk7CisgICAgICAgIHV0aWxzOjpjb252ZXJ0VG9IaWRsKHBhcmFtc19tZXRhZGF0YSwgJmhpZGxQYXJhbXMpOworICAgICAgICBwYXJhbXMudW5sb2NrKHBhcmFtc19tZXRhZGF0YSk7CisgICAgfQorICAgIHJlbW90ZVJldCA9IG1SZW1vdGUtPmVuZENvbmZpZ3VyZShTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Tk9STUFMX01PREUsIGhpZGxQYXJhbXMpOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3I6IGVuZENvbmZpZ3VyZSBmYWlsZWQgJXMiLCByZW1vdGVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChyZW1vdGVSZXQpOworfQorCit2b2lkCitDYW1lcmFEZXZpY2U6OnNldFJlbW90ZURldmljZShzcDxJQ2FtZXJhRGV2aWNlVXNlcj4gcmVtb3RlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKKyAgICBtUmVtb3RlID0gcmVtb3RlOworfQorCitib29sCitDYW1lcmFEZXZpY2U6OnNldERldmljZU1ldGFkYXRhUXVldWVzKCkgeworICAgICAgICBpZiAobVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgQUxPR0UoIm1SZW1vdGUgbXVzdCBub3QgYmUgbnVsbCB3aGlsZSB0cnlpbmcgdG8gZmV0Y2ggbWV0YWRhdGEgcXVldWVzIik7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gJnJlcVF1ZXVlID0gbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZTsKKyAgICAgICAgYXV0byByZXQgPQorICAgICAgICAgICAgbVJlbW90ZS0+Z2V0Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlKAorICAgICAgICAgICAgICAgIFsmcmVxUXVldWVdKGNvbnN0IGF1dG8gJm1xRGVzY3JpcHRvcikgeworICAgICAgICAgICAgICAgICAgICByZXFRdWV1ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8UmVxdWVzdE1ldGFkYXRhUXVldWU+KG1xRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgIGlmICghcmVxUXVldWUtPmlzVmFsaWQoKSB8fCByZXFRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpIDw9MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkVtcHR5IGZtcSBmcm9tIGNhbWVyYXNlcnZlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVxUXVldWUgPSBudWxscHRyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIlRyYW5zYWN0aW9uIGVycm9yIHRyeWluZyB0byBnZXQgY2FwdHVyZSByZXF1ZXN0IG1ldGFkYXRhIHF1ZXVlIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+ICZyZXNRdWV1ZSA9IG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZTsKKyAgICAgICAgcmV0ID0KKyAgICAgICAgICAgICAgICBtUmVtb3RlLT5nZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFsmcmVzUXVldWVdKGNvbnN0IGF1dG8gJm1xRGVzY3JpcHRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1F1ZXVlID0gc3RkOjptYWtlX3NoYXJlZDxSZXN1bHRNZXRhZGF0YVF1ZXVlPihtcURlc2NyaXB0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzUXVldWUtPmlzVmFsaWQoKSB8fCByZXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpIDw9MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRW1wdHkgZm1xIGZyb20gY2FtZXJhc2VydmVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIlRyYW5zYWN0aW9uIGVycm9yIHRyeWluZyB0byBnZXQgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgcXVldWUiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKK30KKworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpIGNvbnN0IHsKKyAgICBpZiAobVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogY2FtZXJhIGRldmljZSBhbHJlYWR5IGNsb3NlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQ7CisgICAgfQorICAgIGlmIChtSW5FcnJvcikgey8vIHRyaWdnZXJlZCBieSBvbkRldmljZUVycm9yCisgICAgICAgIEFMT0dFKCIlczogY2FtZXJhIGRldmljZSBoYXMgZW5jb3VudGVyZWQgYSBzZXJpb3VzIGVycm9yIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIG1FcnJvcjsKKyAgICB9CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoY2FtZXJhX3N0YXR1c190IGVycm9yKSB7CisgICAgbUluRXJyb3IgPSB0cnVlOworICAgIG1FcnJvciA9IGVycm9yOworICAgIHJldHVybjsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpGcmFtZU51bWJlclRyYWNrZXI6OnVwZGF0ZVRyYWNrZXIoaW50NjRfdCBmcmFtZU51bWJlciwgYm9vbCBpc0Vycm9yKSB7CisgICAgQUxPR1YoInVwZGF0ZVRyYWNrZXIgZnJhbWUgJSIgUFJJZDY0ICIgaXNFcnJvciAlZCIsIGZyYW1lTnVtYmVyLCBpc0Vycm9yKTsKKyAgICBpZiAoaXNFcnJvcikgeworICAgICAgICBtRnV0dXJlRXJyb3JTZXQuaW5zZXJ0KGZyYW1lTnVtYmVyKTsKKyAgICB9IGVsc2UgaWYgKGZyYW1lTnVtYmVyIDw9IG1Db21wbGV0ZWRGcmFtZU51bWJlcikgeworICAgICAgICBBTE9HRSgiRnJhbWUgbnVtYmVyICUiIFBSSWQ2NCAiIGRlY3JlYXNlZCEgY3VycmVudCBmbiAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIG1Db21wbGV0ZWRGcmFtZU51bWJlcik7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZnJhbWVOdW1iZXIgIT0gbUNvbXBsZXRlZEZyYW1lTnVtYmVyICsgMSkgeworICAgICAgICAgICAgQUxPR0UoIkZyYW1lIG51bWJlciBvdXQgb2Ygb3JkZXIuIEV4cGVjdCAlIiBQUklkNjQgIiBidXQgZ2V0ICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBsZXRlZEZyYW1lTnVtYmVyICsgMSwgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgLy8gRG8gbm90IGFzc2VydCBhcyBpbiBqYXZhIGltcGxlbWVudGF0aW9uCisgICAgICAgIH0KKyAgICAgICAgbUNvbXBsZXRlZEZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgfQorICAgIHVwZGF0ZSgpOworfQorCit2b2lkCitDYW1lcmFEZXZpY2U6OkZyYW1lTnVtYmVyVHJhY2tlcjo6dXBkYXRlKCkgeworICAgIGZvciAoYXV0byBpdCA9IG1GdXR1cmVFcnJvclNldC5iZWdpbigpOyBpdCAhPSBtRnV0dXJlRXJyb3JTZXQuZW5kKCk7KSB7CisgICAgICAgIGludDY0X3QgZXJyb3JGcmFtZU51bWJlciA9ICppdDsKKyAgICAgICAgaWYgKGVycm9yRnJhbWVOdW1iZXIgPT0gbUNvbXBsZXRlZEZyYW1lTnVtYmVyICsgMSkgeworICAgICAgICAgICAgbUNvbXBsZXRlZEZyYW1lTnVtYmVyKys7CisgICAgICAgICAgICBpdCA9IG1GdXR1cmVFcnJvclNldC5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSBpZiAoZXJyb3JGcmFtZU51bWJlciA8PSBtQ29tcGxldGVkRnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCBkZWFsIHdpdGggaXQgYW55d2F5CisgICAgICAgICAgICBBTE9HRSgiQ29tcGxldGQgZnJhbWUgbnVtYmVyIHBhc3NlZCB0aHJvdWdoIGN1cnJlbnQgZnJhbWUgbnVtYmVyISIpOworICAgICAgICAgICAgLy8gZXJhc2UgdGhlIG9sZCBlcnJvciBzaW5jZSBpdCdzIG5vIGxvbmdlciB1c2VmdWwKKyAgICAgICAgICAgIGl0ID0gbUZ1dHVyZUVycm9yU2V0LmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vcm1hbCByZXF1ZXN0cyBoYXNuJ3QgY2F0Y2hlZCB1cCBlcnJvciBmcmFtZXMsIGp1c3QgYnJlYWsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJVcGRhdGUgY29tcGxldGUgZnJhbWUgJSIgUFJJZDY0LCBtQ29tcGxldGVkRnJhbWVOdW1iZXIpOworfQorCit2b2lkCitDYW1lcmFEZXZpY2U6Om9uQ2FwdHVyZUVycm9yTG9ja2VkKAorICAgICAgICBFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICBpbnQgc2VxdWVuY2VJZCA9IHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQ7CisgICAgaW50NjRfdCBmcmFtZU51bWJlciA9IHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcjsKKyAgICBpbnQzMl90IGJ1cnN0SWQgPSByZXN1bHRFeHRyYXMuYnVyc3RJZDsKKyAgICBhdXRvIGl0ID0gbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKKyAgICBpZiAoaXQgPT0gbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogY2FwdHVyZSBzZXF1ZW5jZSBpbmRleCAlZCBub3QgZm91bmQhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlcXVlbmNlSWQpOworICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9ICgqaXQpLnNlY29uZDsKKyAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBjYmgubVNlc3Npb247CisgICAgaWYgKChzaXplX3QpIGJ1cnN0SWQgPj0gY2JoLm1SZXF1ZXN0cy5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogcmVxdWVzdCBpbmRleCAlZCBvdXQgb2YgYm91bmQgKHNpemUgJXp1KSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidXJzdElkLCBjYmgubVJlcXVlc3RzLnNpemUoKSk7CisgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gY2JoLm1SZXF1ZXN0c1tidXJzdElkXTsKKworICAgIC8vIEhhbmRsZSBidWZmZXIgZXJyb3IKKyAgICBpZiAoZXJyb3JDb2RlID09IEVycm9yQ29kZTo6Q0FNRVJBX0JVRkZFUikgeworICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gcmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfYnVmZmVyTG9zdCBvbkJ1ZmZlckxvc3QgPQorICAgICAgICAgICAgICAgIGNiaC5tT25DYXB0dXJlQnVmZmVyTG9zdDsKKyAgICAgICAgYXV0byBvdXRwdXRQYWlySXQgPSBtQ29uZmlndXJlZE91dHB1dHMuZmluZChzdHJlYW1JZCk7CisgICAgICAgIGlmIChvdXRwdXRQYWlySXQgPT0gbUNvbmZpZ3VyZWRPdXRwdXRzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBzdHJlYW0gaWQgJWQgZG9lcyBub3QgZXhpc3QiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgYXV0byYgd2luZG93SGFuZGxlcyA9IG91dHB1dFBhaXJJdC0+c2Vjb25kLnNlY29uZC5tT3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dIYW5kbGVzOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG91dEhhbmRsZSA6IHdpbmRvd0hhbmRsZXMpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byBzdHJlYW1BbmRXaW5kb3dJZCA6IHJlcXVlc3QtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHMpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHdpbmRvd0lkID0gc3RyZWFtQW5kV2luZG93SWQud2luZG93SWQ7CisgICAgICAgICAgICAgICAgaWYgKHV0aWxzOjppc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKHdpbmRvd0hhbmRsZXNbd2luZG93SWRdLG91dEhhbmRsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBhbncgPQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4od2luZG93SGFuZGxlc1t3aW5kb3dJZF0uZ2V0TmF0aXZlSGFuZGxlKCkpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQ2FtZXJhICVzIExvc3Qgb3V0cHV0IGJ1ZmZlciBmb3IgQU5XICVwIGZyYW1lICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJZCgpLCBhbncsIGZyYW1lTnVtYmVyKTsKKworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3QsIG1IYW5kbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uQnVmZmVyTG9zdCk7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQW53S2V5LCAodm9pZCopIGFudyk7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50NjQoa0ZyYW1lTnVtYmVyS2V5LCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIEhhbmRsZSBvdGhlciBjYXB0dXJlIGZhaWx1cmVzCisgICAgICAgIC8vIEZpcmUgY2FwdHVyZSBmYWlsdXJlIGNhbGxiYWNrIGlmIHRoZXJlIGlzIG9uZSByZWdpc3RlcmVkCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG9uRXJyb3IgPSBjYmgubU9uQ2FwdHVyZUZhaWxlZDsKKyAgICAgICAgc3A8Q2FtZXJhQ2FwdHVyZUZhaWx1cmU+IGZhaWx1cmUobmV3IENhbWVyYUNhcHR1cmVGYWlsdXJlKCkpOworICAgICAgICBmYWlsdXJlLT5mcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgICAgICAvLyBUT0RPOiByZWZpbmUgdGhpcyB3aGVuIGltcGxlbWVudGluZyBmbHVzaAorICAgICAgICBmYWlsdXJlLT5yZWFzb24gICAgICA9IENBUFRVUkVfRkFJTFVSRV9SRUFTT05fRVJST1I7CisgICAgICAgIGZhaWx1cmUtPnNlcXVlbmNlSWQgID0gc2VxdWVuY2VJZDsKKyAgICAgICAgZmFpbHVyZS0+d2FzSW1hZ2VDYXB0dXJlZCA9IChlcnJvckNvZGUgPT0gRXJyb3JDb2RlOjpDQU1FUkFfUkVTVUxUKTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZUZhaWwsIG1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uRXJyb3IpOworICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOworICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZUZhaWx1cmVLZXksIGZhaWx1cmUpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKworICAgICAgICAvLyBVcGRhdGUgdHJhY2tlcgorICAgICAgICBtRnJhbWVOdW1iZXJUcmFja2VyLnVwZGF0ZVRyYWNrZXIoZnJhbWVOdW1iZXIsIC8qaXNFcnJvciovdHJ1ZSk7CisgICAgICAgIGNoZWNrQW5kRmlyZVNlcXVlbmNlQ29tcGxldGVMb2NrZWQoKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYURldmljZTo6Q2FsbGJhY2tIYW5kbGVyOjpvbk1lc3NhZ2VSZWNlaXZlZCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRPbkRpc2Nvbm5lY3RlZDoKKyAgICAgICAgY2FzZSBrV2hhdE9uRXJyb3I6CisgICAgICAgIGNhc2Uga1doYXRTZXNzaW9uU3RhdGVDYjoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVSZXN1bHQ6CisgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUVuZDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFBYm9ydDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVCdWZmZXJMb3N0OgorICAgICAgICAgICAgQUxPR1YoIiVzOiBSZWNlaXZlZCBtc2cgJWQiLCBfX0ZVTkNUSU9OX18sIG1zZy0+d2hhdCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtXaGF0Q2xlYW5VcFNlc3Npb25zOgorICAgICAgICAgICAgbUNhY2hlZFNlc3Npb25zLmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6RXJyb3I6IHVua25vd24gZGV2aWNlIGNhbGxiYWNrICVkIiwgX19GVU5DVElPTl9fLCBtc2ctPndoYXQoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIENoZWNrIHRoZSBjb21tb24gcGFydCBvZiBhbGwgbWVzc2FnZQorICAgIHZvaWQqIGNvbnRleHQ7CisgICAgYm9vbCBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NvbnRleHRLZXksICZjb250ZXh0KTsKKyAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FsbGJhY2sgY29udGV4dCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdE9uRGlzY29ubmVjdGVkOgorICAgICAgICB7CisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlKiBkZXY7CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0RldmljZUtleSwgKHZvaWQqKikgJmRldik7CisgICAgICAgICAgICBpZiAoIWZvdW5kIHx8IGRldiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBkZXZpY2UgcG9pbnRlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFjayBvbkRpc2Nvbm5lY3RlZDsKKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uRGlzY29ubmVjdGVkKTsKKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIG9uRGlzY29ubmVjdGVkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9uRGlzY29ubmVjdGVkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKm9uRGlzY29ubmVjdGVkKShjb250ZXh0LCBkZXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdE9uRXJyb3I6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFDYW1lcmFEZXZpY2UqIGRldjsKKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrRGV2aWNlS2V5LCAodm9pZCoqKSAmZGV2KTsKKyAgICAgICAgICAgIGlmICghZm91bmQgfHwgZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGRldmljZSBwb2ludGVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUNhbWVyYURldmljZV9FcnJvclN0YXRlQ2FsbGJhY2sgb25FcnJvcjsKKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uRXJyb3IpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgb25FcnJvciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBlcnJvckNvZGU7CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZEludDMyKGtFcnJvckNvZGVLZXksICZlcnJvckNvZGUpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZXJyb3IgY29kZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvbkVycm9yID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKm9uRXJyb3IpKGNvbnRleHQsIGRldiwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTZXNzaW9uU3RhdGVDYjoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVSZXN1bHQ6CisgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUVuZDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFBYm9ydDoKKyAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVCdWZmZXJMb3N0OgorICAgICAgICB7CisgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrU2Vzc2lvblNwS2V5LCAmb2JqKTsKKyAgICAgICAgICAgIGlmICghZm91bmQgfHwgb2JqID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHNlc3Npb24gcG9pbnRlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbihzdGF0aWNfY2FzdDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qPihvYmouZ2V0KCkpKTsKKyAgICAgICAgICAgIEFDYW1lcmFEZXZpY2UqIGRldmljZSA9IHNlc3Npb24tPmdldERldmljZSgpOworICAgICAgICAgICAgbUNhY2hlZFNlc3Npb25zLnB1c2goc2Vzc2lvbik7CisgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdFNwID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVCdWZmZXJMb3N0OgorICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksICZvYmopOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgcmVxdWVzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTcCA9IHN0YXRpY19jYXN0PENhcHR1cmVSZXF1ZXN0Kj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFjayBvblN0YXRlOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBzdGF0ZSBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblN0YXRlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAoKm9uU3RhdGUpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTdGFydDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgb25TdGFydDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25TdGFydCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSBzdGFydCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblN0YXJ0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQ2NChrVGltZVN0YW1wS2V5LCAmdGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCB0aW1lc3RhbXAhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3AsIGRldmljZS0+Z2V0SWQoKSk7CisgICAgICAgICAgICAgICAgICAgICgqb25TdGFydCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgdGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25SZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIHJlc3VsdCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZVJlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJlc3VsdChzdGF0aWNfY2FzdDxBQ2FtZXJhTWV0YWRhdGEqPihvYmouZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwLCBkZXZpY2UtPmdldElkKCkpOworICAgICAgICAgICAgICAgICAgICAoKm9uUmVzdWx0KShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCByZXN1bHQuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBvblJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25SZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgcmVzdWx0IGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uUmVzdWx0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kT2JqZWN0KGtDYXB0dXJlUmVzdWx0S2V5LCAmb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIHJlc3VsdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gcmVzdWx0KHN0YXRpY19jYXN0PEFDYW1lcmFNZXRhZGF0YSo+KG9iai5nZXQoKSkpOworCisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kT2JqZWN0KGtQaHlzaWNhbENhcHR1cmVSZXN1bHRLZXksICZvYmopOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHBoeXNpY2FsIGNhcHR1cmUgcmVzdWx0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IHBoeXNpY2FsUmVzdWx0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvKj4ob2JqLmdldCgpKSk7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9Mb2NhbD4mIHBoeXNpY2FsUmVzdWx0SW5mbyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxSZXN1bHQtPm1QaHlzaWNhbFJlc3VsdEluZm87CisKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzcDxBQ2FtZXJhTWV0YWRhdGE+PiBwaHlzaWNhbE1ldGFkYXRhQ29weTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdEluZm8uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRzLnB1c2hfYmFjayhwaHlzaWNhbFJlc3VsdEluZm9baV0ucGh5c2ljYWxDYW1lcmFJZCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhIGNsb25lID0gcGh5c2ljYWxSZXN1bHRJbmZvW2ldLnBoeXNpY2FsTWV0YWRhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZS51cGRhdGUoQU5EUk9JRF9TWU5DX0ZSQU1FX05VTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeXNpY2FsUmVzdWx0LT5tRnJhbWVOdW1iZXIsIC8qZGF0YV9jb3VudCovMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IG1ldGFkYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFDYW1lcmFNZXRhZGF0YShjbG9uZS5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFU1VMVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhQ29weS5wdXNoX2JhY2sobWV0YWRhdGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBwaHlzaWNhbENhbWVyYUlkUHRyczsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgQUNhbWVyYU1ldGFkYXRhKj4gcGh5c2ljYWxNZXRhZGF0YUNvcHlQdHJzOworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBoeXNpY2FsUmVzdWx0SW5mby5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZFB0cnMucHVzaF9iYWNrKHBoeXNpY2FsQ2FtZXJhSWRzW2ldLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxNZXRhZGF0YUNvcHlQdHJzLnB1c2hfYmFjayhwaHlzaWNhbE1ldGFkYXRhQ29weVtpXS5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3AsIGRldmljZS0+Z2V0SWQoKSk7CisgICAgICAgICAgICAgICAgICAgICgqb25SZXN1bHQpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIHJlc3VsdC5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbFJlc3VsdEluZm8uc2l6ZSgpLCBwaHlzaWNhbENhbWVyYUlkUHRycy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxNZXRhZGF0YUNvcHlQdHJzLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG9uRmFpbDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25GYWlsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIGZhaWwgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob25GYWlsID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kT2JqZWN0KGtDYXB0dXJlRmFpbHVyZUtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSBmYWlsdXJlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3A8Q2FtZXJhQ2FwdHVyZUZhaWx1cmU+IGZhaWx1cmVTcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFDYXB0dXJlRmFpbHVyZSo+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUqIGZhaWx1cmUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFDYW1lcmFDYXB0dXJlRmFpbHVyZSo+KGZhaWx1cmVTcC5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCwgZGV2aWNlLT5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvbkZhaWwpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIGZhaWx1cmUpOworICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFFbmQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlRW5kIG9uU2VxRW5kOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblNlcUVuZCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgc2VxdWVuY2UgZW5kIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uU2VxRW5kID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgc2VxSWQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kSW50MzIoa1NlcXVlbmNlSWRLZXksICZzZXFJZCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZnJhbWUgbnVtYmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBmcmFtZU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQ2NChrRnJhbWVOdW1iZXJLZXksICZmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZnJhbWUgbnVtYmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKCpvblNlcUVuZCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgc2VxSWQsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxQWJvcnQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlQWJvcnQgb25TZXFBYm9ydDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25TZXFBYm9ydCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgc2VxdWVuY2UgZW5kIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uU2VxQWJvcnQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBzZXFJZDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQzMihrU2VxdWVuY2VJZEtleSwgJnNlcUlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBmcmFtZSBudW1iZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAoKm9uU2VxQWJvcnQpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHNlcUlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfYnVmZmVyTG9zdCBvbkJ1ZmZlckxvc3Q7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uQnVmZmVyTG9zdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgYnVmZmVyIGxvc3QgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob25CdWZmZXJMb3N0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0Fud0tleSwgKHZvaWQqKikgJmFudyk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgbmF0aXZlX2hhbmRsZV90ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZEludDY0KGtGcmFtZU51bWJlcktleSwgJmZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBmcmFtZSBudW1iZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCwgZGV2aWNlLT5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvbkJ1ZmZlckxvc3QpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIGFudywgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworQ2FtZXJhRGV2aWNlOjpDYWxsYmFja0hvbGRlcjo6Q2FsbGJhY2tIb2xkZXIoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicykgOgorICAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwgbVJlcXVlc3RzKHJlcXVlc3RzKSwKKyAgICAgICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwKKyAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKGZhbHNlKSB7CisgICAgaW5pdENhcHR1cmVDYWxsYmFja3MoY2JzKTsKKworICAgIGlmIChjYnMgIT0gbnVsbHB0cikgeworICAgICAgICBtT25DYXB0dXJlQ29tcGxldGVkID0gY2JzLT5vbkNhcHR1cmVDb21wbGV0ZWQ7CisgICAgfQorfQorCitDYW1lcmFEZXZpY2U6OkNhbGxiYWNrSG9sZGVyOjpDYWxsYmFja0hvbGRlcigKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAorICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBsY2JzKSA6CisgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtUmVxdWVzdHMocmVxdWVzdHMpLAorICAgICAgICBtSXNSZXBlYXRpbmcoaXNSZXBlYXRpbmcpLAorICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2sodHJ1ZSkgeworICAgIGluaXRDYXB0dXJlQ2FsbGJhY2tzKGxjYnMpOworCisgICAgaWYgKGxjYnMgIT0gbnVsbHB0cikgeworICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCA9IGxjYnMtPm9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQ7CisgICAgfQorfQorCit2b2lkCitDYW1lcmFEZXZpY2U6OmNoZWNrUmVwZWF0aW5nU2VxdWVuY2VDb21wbGV0ZUxvY2tlZCgKKyAgICBjb25zdCBpbnQgc2VxdWVuY2VJZCwgY29uc3QgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIpIHsKKyAgICBBTE9HVigiUmVwZWF0aW5nIHNlcUlkICVkIGxhc3RGcmFtZU51bWVyICUiIFBSSWQ2NCwgc2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICBpZiAobGFzdEZyYW1lTnVtYmVyID09IE5PX0ZSQU1FU19DQVBUVVJFRCkgeworICAgICAgICBpZiAobVNlcXVlbmNlQ2FsbGJhY2tNYXAuY291bnQoc2VxdWVuY2VJZCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coIk5vIGNhbGxiYWNrIGZvdW5kIGZvciBzZXF1ZW5jZUlkICVkIiwgc2VxdWVuY2VJZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gcmVtb3ZlIGNhbGxiYWNrIGhvbGRlciBmcm9tIGNhbGxiYWNrIG1hcAorICAgICAgICBhdXRvIGNiSXQgPSBtU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOworICAgICAgICBDYWxsYmFja0hvbGRlciBjYmggPSBjYkl0LT5zZWNvbmQ7CisgICAgICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVyYXNlKGNiSXQpOworICAgICAgICAvLyBzZW5kIHNlcSBhYm9ydGVkIGNhbGxiYWNrCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlU2VxQWJvcnQsIG1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBjYmgubVNlc3Npb24pOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgY2JoLm1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQpOworICAgICAgICBtc2ctPnNldEludDMyKGtTZXF1ZW5jZUlkS2V5LCBzZXF1ZW5jZUlkKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVXNlIG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcCB0byB0cmFjaworICAgICAgICBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHNlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcikpOworCisgICAgICAgIC8vIExhc3QgZnJhbWUgbWlnaHQgaGF2ZSBhcnJpdmVkLiBDaGVjayBub3cKKyAgICAgICAgY2hlY2tBbmRGaXJlU2VxdWVuY2VDb21wbGV0ZUxvY2tlZCgpOworICAgIH0KK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpjaGVja0FuZEZpcmVTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKCkgeworICAgIGludDY0X3QgY29tcGxldGVkRnJhbWVOdW1iZXIgPSBtRnJhbWVOdW1iZXJUcmFja2VyLmdldENvbXBsZXRlZEZyYW1lTnVtYmVyKCk7CisgICAgYXV0byBpdCA9IG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcC5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuZW5kKCkpIHsKKyAgICAgICAgaW50IHNlcXVlbmNlSWQgPSBpdC0+Zmlyc3Q7CisgICAgICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gaXQtPnNlY29uZDsKKyAgICAgICAgYm9vbCBzZXFDb21wbGV0ZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBoYXNDYWxsYmFjayAgPSB0cnVlOworCisgICAgICAgIGlmIChtUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dXKCJDYW1lcmEgJXMgY2xvc2VkIHdoaWxlIGNoZWNraW5nIHNlcXVlbmNlIGNvbXBsZXRlIiwgZ2V0SWQoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBjYWxsYmFjayBmb3IgdGhpcyBzZXF1ZW5jZQorICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGJlY2F1c2Ugd2UgYWx3YXlzIHJlZ2lzdGVyIGNhbGxiYWNrICh3aXRoIG51bGxwdHIgaW5zaWRlKQorICAgICAgICBpZiAobVNlcXVlbmNlQ2FsbGJhY2tNYXAuY291bnQoc2VxdWVuY2VJZCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coIk5vIGNhbGxiYWNrIGZvdW5kIGZvciBzZXF1ZW5jZUlkICVkIiwgc2VxdWVuY2VJZCk7CisgICAgICAgICAgICBoYXNDYWxsYmFjayA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxhc3RGcmFtZU51bWJlciA8PSBjb21wbGV0ZWRGcmFtZU51bWJlcikgeworICAgICAgICAgICAgQUxPR1YoInNlcSAlZCByZWFjaGVkIGxhc3QgZnJhbWUgJSIgUFJJZDY0ICIsIGNvbXBsZXRlZCAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIsIGNvbXBsZXRlZEZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgIHNlcUNvbXBsZXRlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VxQ29tcGxldGVkICYmIGhhc0NhbGxiYWNrKSB7CisgICAgICAgICAgICAvLyByZW1vdmUgY2FsbGJhY2sgaG9sZGVyIGZyb20gY2FsbGJhY2sgbWFwCisgICAgICAgICAgICBhdXRvIGNiSXQgPSBtU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOworICAgICAgICAgICAgQ2FsbGJhY2tIb2xkZXIgY2JoID0gY2JJdC0+c2Vjb25kOworICAgICAgICAgICAgbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZXJhc2UoY2JJdCk7CisgICAgICAgICAgICAvLyBzZW5kIHNlcSBjb21wbGV0ZSBjYWxsYmFjaworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVTZXFFbmQsIG1IYW5kbGVyKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKKyAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIGNiaC5tU2Vzc2lvbik7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgY2JoLm1PbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZCk7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKGtTZXF1ZW5jZUlkS2V5LCBzZXF1ZW5jZUlkKTsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50NjQoa0ZyYW1lTnVtYmVyS2V5LCBsYXN0RnJhbWVOdW1iZXIpOworCisgICAgICAgICAgICAvLyBDbGVhciB0aGUgc2Vzc2lvbiBzcCBiZWZvcmUgd2Ugc2VuZCBvdXQgdGhlIG1lc3NhZ2UKKyAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBndWFyYW50ZWUgdGhlIHJhcmUgY2FzZSB3aGVyZSB0aGUgbWVzc2FnZSBpcyBwcm9jZXNzZWQKKyAgICAgICAgICAgIC8vIGJlZm9yZSBjYmggZ29lcyBvdXQgb2Ygc2NvcGUgYW5kIGNhdXNpbmcgd2UgY2FsbCB0aGUgc2Vzc2lvbgorICAgICAgICAgICAgLy8gZGVzdHJ1Y3RvciB3aGlsZSBob2xkaW5nIGRldmljZSBsb2NrCisgICAgICAgICAgICBjYmgubVNlc3Npb24uY2xlYXIoKTsKKyAgICAgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm8gbmVlZCB0byB0cmFjayBzZXF1ZW5jZSBjb21wbGV0ZSBpZiB0aGVyZSBpcyBubyBjYWxsYmFjayByZWdpc3RlcmVkCisgICAgICAgIGlmIChzZXFDb21wbGV0ZWQgfHwgIWhhc0NhbGxiYWNrKSB7CisgICAgICAgICAgICBpdCA9IG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcC5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAgKiBDYW1lcmEgc2VydmljZSBjYWxsYmFjayBpbXBsZW1lbnRhdGlvbgorICAqLworYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPgorQ2FtZXJhRGV2aWNlOjpTZXJ2aWNlQ2FsbGJhY2s6Om9uRGV2aWNlRXJyb3IoCisgICAgICAgIEVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIEFMT0dEKCJEZXZpY2UgZXJyb3IgcmVjZWl2ZWQsIGNvZGUgJWQsIGZyYW1lIG51bWJlciAlIiBQUklkNjQgIiwgcmVxdWVzdCBJRCAlZCwgc3Vic2VxIElEICVkIiwKKyAgICAgICAgICAgIGVycm9yQ29kZSwgcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyLCByZXN1bHRFeHRyYXMucmVxdWVzdElkLCByZXN1bHRFeHRyYXMuYnVyc3RJZCk7CisgICAgYXV0byByZXQgPSBWb2lkKCk7CisgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZAorICAgIH0KKworICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiA9IGRldi0+bUN1cnJlbnRTZXNzaW9uLnByb21vdGUoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZGV2LT5tRGV2aWNlTG9jayk7CisgICAgaWYgKGRldi0+bVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKKyAgICB9CisgICAgc3dpdGNoIChlcnJvckNvZGUpIHsKKyAgICAgICAgY2FzZSBFcnJvckNvZGU6OkNBTUVSQV9ESVNDT05ORUNURUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENhbWVyYSBpcyBkaXNjb25uZWN0ZWQsIGNsb3NlIHRoZSBzZXNzaW9uIGFuZCBleHBlY3Qgbm8gbW9yZSBjYWxsYmFja3MKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLT5jbG9zZUJ5RGV2aWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXYtPm1DdXJyZW50U2Vzc2lvbiA9IG51bGxwdHI7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0T25EaXNjb25uZWN0ZWQsIGRldi0+bUhhbmRsZXIpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBkZXYtPm1BcHBDYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0RldmljZUtleSwgKHZvaWQqKSBkZXYtPmdldFdyYXBwZXIoKSk7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgZGV2LT5tQXBwQ2FsbGJhY2tzLm9uRGlzY29ubmVjdGVkKTsKKyAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIGVycm9yIGZyb20gY2FtZXJhIGRldmljZTogJWQiLCBlcnJvckNvZGUpOworICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX0RFVklDRToKKyAgICAgICAgY2FzZSBFcnJvckNvZGU6OkNBTUVSQV9TRVJWSUNFOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGVycm9yVmFsID0gOjpFUlJPUl9DQU1FUkFfREVWSUNFOworICAgICAgICAgICAgLy8gV2Uga2VlcCB0aGlzIHN3aXRjaCBzaW5jZSB0aGlzIGJsb2NrIG1pZ2h0IGJlIGVuY291bnRlcmVkIHdpdGgKKyAgICAgICAgICAgIC8vIG1vcmUgdGhhbiBqdXN0IDIgc3RhdGVzLiBUaGUgZGVmYXVsdCBmYWxsdGhyb3VnaCBjb3VsZCBoYXZlIHVzCisgICAgICAgICAgICAvLyBoYW5kbGluZyBtb3JlIHVubWF0Y2hlZCBlcnJvciBjYXNlcy4KKyAgICAgICAgICAgIHN3aXRjaCAoZXJyb3JDb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGU6OkNBTUVSQV9ERVZJQ0U6CisgICAgICAgICAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGU6OkNBTUVSQV9TRVJWSUNFOgorICAgICAgICAgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOworICAgICAgICAgICAgICAgICAgICBlcnJvclZhbCA9IDo6RVJST1JfQ0FNRVJBX1NFUlZJQ0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9VTktOT1dOKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0T25FcnJvciwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGRldi0+bUFwcENhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrRGV2aWNlS2V5LCAodm9pZCopIGRldi0+Z2V0V3JhcHBlcigpKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBkZXYtPm1BcHBDYWxsYmFja3Mub25FcnJvcik7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKGtFcnJvckNvZGVLZXksIGVycm9yVmFsKTsKKyAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBFcnJvckNvZGU6OkNBTUVSQV9SRVFVRVNUOgorICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX1JFU1VMVDoKKyAgICAgICAgY2FzZSBFcnJvckNvZGU6OkNBTUVSQV9CVUZGRVI6CisgICAgICAgICAgICBkZXYtPm9uQ2FwdHVyZUVycm9yTG9ja2VkKGVycm9yQ29kZSwgcmVzdWx0RXh0cmFzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCithbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+CitDYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6b25EZXZpY2VJZGxlKCkgeworICAgIEFMT0dWKCJDYW1lcmEgaXMgbm93IGlkbGUiKTsKKyAgICBhdXRvIHJldCA9IFZvaWQoKTsKKyAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChkZXYgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGRldi0+bURldmljZUxvY2spOworICAgIGlmIChkZXYtPmlzQ2xvc2VkKCkgfHwgZGV2LT5tUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoZGV2LT5tSWRsZSkgeworICAgICAgICAvLyBBbHJlYWR5IGluIGlkbGUgc3RhdGUuIFBvc3NpYmx5IG90aGVyIHRocmVhZCBkaWQgd2FpdFVudGlsSWRsZQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChkZXYtPm1DdXJyZW50U2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJvbkRldmljZUlkbGUgc2VuZGluZyBzdGF0ZSBjYiIpOworICAgICAgICBpZiAoZGV2LT5tQnVzeVNlc3Npb24gIT0gZGV2LT5tQ3VycmVudFNlc3Npb24pIHsKKyAgICAgICAgICAgIEFMT0dFKCJDdXJyZW50IHNlc3Npb24gIT0gYnVzeSBzZXNzaW9uIik7CisgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25TdGF0ZUNiLCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBkZXYtPm1CdXN5U2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2suY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIGRldi0+bUJ1c3lTZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGRldi0+bUJ1c3lTZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vblJlYWR5KTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGNsZWFyIHRoZSBzcCBmaXJzdCBzbyB0aGUgc2Vzc2lvbiBkZXN0cnVjdG9yIGNhbgorICAgICAgICAvLyBvbmx5IGhhcHBlbiBvbiBoYW5kbGVyIHRocmVhZCAod2hlcmUgd2UgZG9uJ3QgaG9sZCBkZXZpY2Uvc2Vzc2lvbiBsb2NrKQorICAgICAgICBkZXYtPm1CdXN5U2Vzc2lvbi5jbGVhcigpOworICAgICAgICBkZXYtPnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0KKyAgICBkZXYtPm1JZGxlID0gdHJ1ZTsKKyAgICBkZXYtPm1GbHVzaGluZyA9IGZhbHNlOworICAgIHJldHVybiByZXQ7Cit9CisKK2FuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4KK0NhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpvbkNhcHR1cmVTdGFydGVkKAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcCkgeworICAgIGF1dG8gcmV0ID0gVm9pZCgpOworCisgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZAorICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZGV2LT5tRGV2aWNlTG9jayk7CisgICAgaWYgKGRldi0+aXNDbG9zZWQoKSB8fCBkZXYtPm1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGludDMyX3Qgc2VxdWVuY2VJZCA9IHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQ7CisgICAgaW50MzJfdCBidXJzdElkID0gcmVzdWx0RXh0cmFzLmJ1cnN0SWQ7CisKKyAgICBhdXRvIGl0ID0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOworICAgIGlmIChpdCAhPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVuZCgpKSB7CisgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9ICgqaXQpLnNlY29uZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBvblN0YXJ0ID0gY2JoLm1PbkNhcHR1cmVTdGFydGVkOworICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBjYmgubVNlc3Npb247CisgICAgICAgIGlmICgoc2l6ZV90KSBidXJzdElkID49IGNiaC5tUmVxdWVzdHMuc2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiByZXF1ZXN0IGluZGV4ICVkIG91dCBvZiBib3VuZCAoc2l6ZSAlenUpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidXJzdElkLCBjYmgubVJlcXVlc3RzLnNpemUoKSk7CisgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOworICAgICAgICB9CisgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gY2JoLm1SZXF1ZXN0c1tidXJzdElkXTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVTdGFydCwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvblN0YXJ0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKKyAgICAgICAgbXNnLT5zZXRJbnQ2NChrVGltZVN0YW1wS2V5LCB0aW1lc3RhbXApOworICAgICAgICBkZXYtPnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCithbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+CitDYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6b25SZXN1bHRSZWNlaXZlZCgKKyAgICAgICAgY29uc3QgRm1xU2l6ZU9yTWV0YWRhdGEmIHJlc3VsdE1ldGFkYXRhLAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbFJlc3VsdEluZm9zKSB7CisgICAgYXV0byByZXQgPSBWb2lkKCk7CisKKyAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChkZXYgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCisgICAgfQorICAgIGludDMyX3Qgc2VxdWVuY2VJZCA9IHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQ7CisgICAgaW50NjRfdCBmcmFtZU51bWJlciA9IHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcjsKKyAgICBpbnQzMl90IGJ1cnN0SWQgPSByZXN1bHRFeHRyYXMuYnVyc3RJZDsKKyAgICBib29sICAgIGlzUGFydGlhbFJlc3VsdCA9IChyZXN1bHRFeHRyYXMucGFydGlhbFJlc3VsdENvdW50IDwgZGV2LT5tUGFydGlhbFJlc3VsdENvdW50KTsKKworICAgIGlmICghaXNQYXJ0aWFsUmVzdWx0KSB7CisgICAgICAgIEFMT0dWKCJTZXFJZCAlZCBmcmFtZSAlIiBQUklkNjQgIiByZXN1bHQgYXJyaXZlLiIsIHNlcXVlbmNlSWQsIGZyYW1lTnVtYmVyKTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZGV2LT5tRGV2aWNlTG9jayk7CisgICAgaWYgKGRldi0+bVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBkaXNjb25uZWN0ZWQKKyAgICB9CisKKyAgICBpZiAoZGV2LT5pc0Nsb3NlZCgpKSB7CisgICAgICAgIGlmICghaXNQYXJ0aWFsUmVzdWx0KSB7CisgICAgICAgICAgICBkZXYtPm1GcmFtZU51bWJlclRyYWNrZXIudXBkYXRlVHJhY2tlcihmcmFtZU51bWJlciwgLyppc0Vycm9yKi9mYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gZWFybHkgcmV0dXJuIHRvIGF2b2lkIGNhbGxiYWNrIHNlbnQgdG8gY2xvc2VkIGRldmljZXMKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YUNvcHk7CisgICAgY2FtZXJhX3N0YXR1c190IHN0YXR1cyA9IHJlYWRPbmVSZXN1bHRNZXRhZGF0YShyZXN1bHRNZXRhZGF0YSwKKyAgICAgICAgICAgIGRldi0+bUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLmdldCgpLCAmbWV0YWRhdGFDb3B5KTsKKyAgICBpZiAoc3RhdHVzICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiByZXN1bHQgbWV0YWRhdGEgY291bGRuJ3QgYmUgY29udmVydGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBtZXRhZGF0YUNvcHkudXBkYXRlKEFORFJPSURfTEVOU19JTkZPX1NIQURJTkdfTUFQX1NJWkUsIGRldi0+bVNoYWRpbmdNYXBTaXplLCAvKmRhdGFfY291bnQqLzIpOworICAgIG1ldGFkYXRhQ29weS51cGRhdGUoQU5EUk9JRF9TWU5DX0ZSQU1FX05VTUJFUiwgJmZyYW1lTnVtYmVyLCAvKmRhdGFfY291bnQqLzEpOworCisgICAgYXV0byBpdCA9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKKyAgICBpZiAoaXQgIT0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgeworICAgICAgICBDYWxsYmFja0hvbGRlciBjYmggPSAoKml0KS5zZWNvbmQ7CisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiA9IGNiaC5tU2Vzc2lvbjsKKyAgICAgICAgaWYgKChzaXplX3QpIGJ1cnN0SWQgPj0gY2JoLm1SZXF1ZXN0cy5zaXplKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IHJlcXVlc3QgaW5kZXggJWQgb3V0IG9mIGJvdW5kIChzaXplICV6dSkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1cnN0SWQsIGNiaC5tUmVxdWVzdHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgIH0KKyAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QgPSBjYmgubVJlcXVlc3RzW2J1cnN0SWRdOworICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJlc3VsdChuZXcgQUNhbWVyYU1ldGFkYXRhKAorICAgICAgICAgICAgICAgIG1ldGFkYXRhQ29weS5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFU1VMVCkpOworCisgICAgICAgIHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9Mb2NhbD4gbG9jYWxQaHlzaWNhbFJlc3VsdDsKKyAgICAgICAgbG9jYWxQaHlzaWNhbFJlc3VsdC5yZXNpemUocGh5c2ljYWxSZXN1bHRJbmZvcy5zaXplKCkpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBoeXNpY2FsUmVzdWx0SW5mb3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGxvY2FsUGh5c2ljYWxSZXN1bHRbaV0ucGh5c2ljYWxDYW1lcmFJZCA9IHBoeXNpY2FsUmVzdWx0SW5mb3NbaV0ucGh5c2ljYWxDYW1lcmFJZDsKKyAgICAgICAgICAgIHN0YXR1cyA9IHJlYWRPbmVSZXN1bHRNZXRhZGF0YShwaHlzaWNhbFJlc3VsdEluZm9zW2ldLnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIGRldi0+bUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAmbG9jYWxQaHlzaWNhbFJlc3VsdFtpXS5waHlzaWNhbE1ldGFkYXRhKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogcGh5c2ljYWwgY2FtZXJhIHJlc3VsdCBtZXRhZGF0YSBjb3VsZG4ndCBiZSBjb252ZXJ0ZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3A8QUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IHBoeXNpY2FsUmVzdWx0KAorICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyhsb2NhbFBoeXNpY2FsUmVzdWx0LCBmcmFtZU51bWJlcikpOworCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoCisgICAgICAgICAgICAgICAgY2JoLm1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayA/IGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQgOiBrV2hhdENhcHR1cmVSZXN1bHQsCisgICAgICAgICAgICAgICAgZGV2LT5tSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVzdWx0S2V5LCByZXN1bHQpOworICAgICAgICBpZiAoaXNQYXJ0aWFsUmVzdWx0KSB7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopY2JoLm1PbkNhcHR1cmVQcm9ncmVzc2VkKTsKKyAgICAgICAgfSBlbHNlIGlmIChjYmgubUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKSB7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopY2JoLm1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtQaHlzaWNhbENhcHR1cmVSZXN1bHRLZXksIHBoeXNpY2FsUmVzdWx0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYmgubU9uQ2FwdHVyZUNvbXBsZXRlZCk7CisgICAgICAgIH0KKyAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICB9CisKKyAgICBpZiAoIWlzUGFydGlhbFJlc3VsdCkgeworICAgICAgICBkZXYtPm1GcmFtZU51bWJlclRyYWNrZXIudXBkYXRlVHJhY2tlcihmcmFtZU51bWJlciwgLyppc0Vycm9yKi9mYWxzZSk7CisgICAgICAgIGRldi0+Y2hlY2tBbmRGaXJlU2VxdWVuY2VDb21wbGV0ZUxvY2tlZCgpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2FuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4KK0NhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpvblJlcGVhdGluZ1JlcXVlc3RFcnJvcigKKyAgICAgICAgdWludDY0X3QgbGFzdEZyYW1lTnVtYmVyLCBpbnQzMl90IHN0b3BwZWRTZXF1ZW5jZUlkKSB7CisgICAgYXV0byByZXQgPSBWb2lkKCk7CisKKyAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChkZXYgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGRldi0+bURldmljZUxvY2spOworCisgICAgaW50IHJlcGVhdGluZ1NlcXVlbmNlSWQgPSBkZXYtPm1SZXBlYXRpbmdTZXF1ZW5jZUlkOworICAgIGlmIChzdG9wcGVkU2VxdWVuY2VJZCA9PSByZXBlYXRpbmdTZXF1ZW5jZUlkKSB7CisgICAgICAgIGRldi0+bVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBSRVFVRVNUX0lEX05PTkU7CisgICAgfQorCisgICAgZGV2LT5jaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQocmVwZWF0aW5nU2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2NhbWVyYV9zdGF0dXNfdCBDYW1lcmFEZXZpY2U6OlNlcnZpY2VDYWxsYmFjazo6cmVhZE9uZVJlc3VsdE1ldGFkYXRhKAorICAgICAgICBjb25zdCBGbXFTaXplT3JNZXRhZGF0YSYgZm1xU2l6ZU9yTWV0YWRhdGEsIFJlc3VsdE1ldGFkYXRhUXVldWUqIG1ldGFkYXRhUXVldWUsCisgICAgICAgIENhbWVyYU1ldGFkYXRhKiBtZXRhZGF0YSkgeworICAgIGlmIChtZXRhZGF0YVF1ZXVlID09IG51bGxwdHIgfHwgbWV0YWRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgYm9vbCBjb252ZXJ0ZWQ7CisgICAgSENhbWVyYU1ldGFkYXRhIGhDYW1lcmFNZXRhZGF0YTsKKyAgICBpZiAoZm1xU2l6ZU9yTWV0YWRhdGEuZ2V0RGlzY3JpbWluYXRvcigpID09CisgICAgICAgICAgICBGbXFTaXplT3JNZXRhZGF0YTo6aGlkbF9kaXNjcmltaW5hdG9yOjpmbXFNZXRhZGF0YVNpemUpIHsKKyAgICAgICAgaENhbWVyYU1ldGFkYXRhLnJlc2l6ZShmbXFTaXplT3JNZXRhZGF0YS5mbXFNZXRhZGF0YVNpemUoKSk7CisgICAgICAgIGJvb2wgcmVhZCA9IG1ldGFkYXRhUXVldWUtPnJlYWQoCisgICAgICAgICAgICAgICAgaENhbWVyYU1ldGFkYXRhLmRhdGEoKSwgZm1xU2l6ZU9yTWV0YWRhdGEuZm1xTWV0YWRhdGFTaXplKCkpOworICAgICAgICBpZiAoIXJlYWQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBjYXB0dXJlIHJlcXVlc3Qgc2V0dGluZ3MgY291bGQndCBiZSByZWFkIGZyb20gZm1xIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogRG8gd2UgYWN0dWFsbHkgbmVlZCB0byBjbG9uZSBoZXJlID8KKyAgICAgICAgY29udmVydGVkID0gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbENsb25lZChoQ2FtZXJhTWV0YWRhdGEsIG1ldGFkYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb252ZXJ0ZWQgPSB1dGlsczo6Y29udmVydEZyb21IaWRsQ2xvbmVkKGZtcVNpemVPck1ldGFkYXRhLm1ldGFkYXRhKCksIG1ldGFkYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gY29udmVydGVkID8gQUNBTUVSQV9PSyA6IEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKK30KKworfSAvLyBuYW1lc3BhY2UgYWNhbQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MDkyZmQKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKQEAgLTAsMCArMSw0MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBfQUNBTUVSQV9ERVZJQ0VfSAorI2RlZmluZSBfQUNBTUVSQV9ERVZJQ0VfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL0lDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oPgorI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKKwordXNpbmcgSUNhbWVyYURldmljZUNhbGxiYWNrID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s7Cit1c2luZyBJQ2FtZXJhRGV2aWNlVXNlciA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZVVzZXI7Cit1c2luZyBDYXB0dXJlUmVzdWx0RXh0cmFzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVzdWx0RXh0cmFzOwordXNpbmcgUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKK3VzaW5nIFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M7Cit1c2luZyBTdWJtaXRJbmZvID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTdWJtaXRJbmZvOwordXNpbmcgQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKK3VzaW5nIEVycm9yQ29kZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6RXJyb3JDb2RlOwordXNpbmcgRm1xU2l6ZU9yTWV0YWRhdGEgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkZtcVNpemVPck1ldGFkYXRhOwordXNpbmcgU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOwordXNpbmcgU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpTdGF0dXM7Cit1c2luZyBSZXN1bHRNZXRhZGF0YVF1ZXVlID0gaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT47Cit1c2luZyBSZXF1ZXN0TWV0YWRhdGFRdWV1ZSA9IGhhcmR3YXJlOjpNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwordXNpbmcgQ2FtZXJhU3RhdHVzQW5kSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFTdGF0dXNBbmRJZDsKKwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgdXRpbHM6Om5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXI7Cit1c2luZyB1dGlsczo6Q2FwdHVyZVJlcXVlc3Q7Cit1c2luZyB1dGlsczo6T3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXI7CisKKy8vIFdyYXAgQUNhbWVyYUNhcHR1cmVGYWlsdXJlIHNvIGl0IGNhbiBiZSByZWYtY291bnRlZAorc3RydWN0IENhbWVyYUNhcHR1cmVGYWlsdXJlIDogcHVibGljIFJlZkJhc2UsIHB1YmxpYyBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgeyB9OworCisvLyBXcmFwIFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gc28gdGhhdCBpdCBjYW4gYmUgcmVmLWNvdW50ZWQKK3N0cnVjdCBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvTG9jYWwgeworICAgIHN0ZDo6c3RyaW5nIHBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgQ2FtZXJhTWV0YWRhdGEgcGh5c2ljYWxNZXRhZGF0YTsKK307CisKK3N0cnVjdCBBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzogcHVibGljIFJlZkJhc2UgeworICAgIEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvKGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9Mb2NhbD4mIGluZm8sCisgICAgICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyKSA6CisgICAgICAgIG1QaHlzaWNhbFJlc3VsdEluZm8oaW5mbyksIG1GcmFtZU51bWJlcihmcmFtZU51bWJlcikge30KKworICAgIHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9Mb2NhbD4gbVBoeXNpY2FsUmVzdWx0SW5mbzsKKyAgICBpbnQ2NF90IG1GcmFtZU51bWJlcjsKK307CisKK2NsYXNzIENhbWVyYURldmljZSBmaW5hbCA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgcHVibGljOgorICAgIENhbWVyYURldmljZShjb25zdCBjaGFyKiBpZCwgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2IsCisgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzLAorICAgICAgICAgICAgICAgICAgQUNhbWVyYURldmljZSogd3JhcHBlcik7CisgICAgfkNhbWVyYURldmljZSgpOworCisgICAgaW5saW5lIGNvbnN0IGNoYXIqIGdldElkKCkgY29uc3QgeyByZXR1cm4gbUNhbWVyYUlkLmNfc3RyKCk7IH0KKworICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlUmVxdWVzdCgKKyAgICAgICAgICAgIEFDYW1lcmFEZXZpY2VfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkLAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYUlkTGlzdCogcGh5c2ljYWxDYW1lcmFJZExpc3QsCisgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBjb25zdDsKKworICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlU2Vzc2lvbigKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogICAgICAgb3V0cHV0cywKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrcywKKyAgICAgICAgICAgIC8qb3V0Ki9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKiBzZXNzaW9uKTsKKworICAgIC8vIENhbGxiYWNrcyBmcm9tIGNhbWVyYSBzZXJ2aWNlCisgICAgY2xhc3MgU2VydmljZUNhbGxiYWNrIDogcHVibGljIElDYW1lcmFEZXZpY2VDYWxsYmFjayB7CisgICAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IFNlcnZpY2VDYWxsYmFjayhDYW1lcmFEZXZpY2UqIGRldmljZSkgOiBtRGV2aWNlKGRldmljZSkge30KKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBvbkRldmljZUVycm9yKEVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIG92ZXJyaWRlOworICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG9uRGV2aWNlSWRsZSgpIG92ZXJyaWRlOworICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG9uQ2FwdHVyZVN0YXJ0ZWQoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZXN0YW1wKSBvdmVycmlkZTsKKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBvblJlc3VsdFJlY2VpdmVkKGNvbnN0IEZtcVNpemVPck1ldGFkYXRhJiByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvcykgb3ZlcnJpZGU7CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gb25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IodWludDY0X3QgbGFzdEZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAgIGludDMyX3Qgc3RvcHBlZFNlcXVlbmNlSWQpIG92ZXJyaWRlOworICAgICAgcHJpdmF0ZToKKyAgICAgICAgY2FtZXJhX3N0YXR1c190IHJlYWRPbmVSZXN1bHRNZXRhZGF0YShjb25zdCBGbXFTaXplT3JNZXRhZGF0YSYgZm1xU2l6ZU9yTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgUmVzdWx0TWV0YWRhdGFRdWV1ZSogbWV0YWRhdGFRdWV1ZSwgQ2FtZXJhTWV0YWRhdGEqIG1ldGFkYXRhKTsKKyAgICAgICAgY29uc3Qgd3A8Q2FtZXJhRGV2aWNlPiBtRGV2aWNlOworICAgIH07CisgICAgaW5saW5lIHNwPElDYW1lcmFEZXZpY2VDYWxsYmFjaz4gZ2V0U2VydmljZUNhbGxiYWNrKCkgeworICAgICAgICByZXR1cm4gbVNlcnZpY2VDYWxsYmFjazsKKyAgICB9OworCisgICAgLy8gQ2FtZXJhIGRldmljZSBpcyBvbmx5IGZ1bmN0aW9uYWwgYWZ0ZXIgcmVtb3RlIGJlaW5nIHNldAorICAgIHZvaWQgc2V0UmVtb3RlRGV2aWNlKHNwPElDYW1lcmFEZXZpY2VVc2VyPiByZW1vdGUpOworCisgICAgYm9vbCBzZXREZXZpY2VNZXRhZGF0YVF1ZXVlcygpOworICAgIGlubGluZSBBQ2FtZXJhRGV2aWNlKiBnZXRXcmFwcGVyKCkgY29uc3QgeyByZXR1cm4gbVdyYXBwZXI7IH07CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgQUNhbWVyYUNhcHR1cmVTZXNzaW9uOworCisgICAgY2FtZXJhX3N0YXR1c190IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpIGNvbnN0OworCisgICAgLy8gZGV2aWNlIGdvZXMgaW50byBmYXRhbCBlcnJvciBzdGF0ZSBhZnRlciB0aGlzCisgICAgdm9pZCBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChjYW1lcmFfc3RhdHVzX3QgZXJyb3IpOworCisgICAgdm9pZCBkaXNjb25uZWN0TG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4mIHNlc3Npb24pOyAvLyBkaXNjb25uZWN0IGZyb20gY2FtZXJhIHNlcnZpY2UKKworICAgIGNhbWVyYV9zdGF0dXNfdCBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgZmx1c2hMb2NrZWQoQUNhbWVyYUNhcHR1cmVTZXNzaW9uKik7CisKKyAgICBjYW1lcmFfc3RhdHVzX3Qgd2FpdFVudGlsSWRsZUxvY2tlZCgpOworCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KKyAgICBjYW1lcmFfc3RhdHVzX3QgY2FwdHVyZUxvY2tlZChzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCk7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIGNhbWVyYV9zdGF0dXNfdCBzZXRSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZChzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCk7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIGNhbWVyYV9zdGF0dXNfdCBzdWJtaXRSZXF1ZXN0c0xvY2tlZCgKKyAgICAgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgICAgICAvKm91dCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKKyAgICAgICAgICAgIGJvb2wgaXNSZXBlYXRpbmcpOworCisgICAgdm9pZCBhZGRSZXF1ZXN0U2V0dGluZ3NNZXRhZGF0YShBQ2FwdHVyZVJlcXVlc3QgKmFDYXB0dXJlUmVxdWVzdCwgc3A8Q2FwdHVyZVJlcXVlc3Q+ICZyZXEpOworCisgICAgY2FtZXJhX3N0YXR1c190IHVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb25Mb2NrZWQoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQpOworCisgICAgLy8gU2luY2UgdGhpcyB3cml0ZXMgdG8gSUNhbWVyYURldmljZVVzZXIncyBmbXEsIGNsaWVudHMgbXVzdCB0YWtlIGNhcmUgdGhhdDoKKyAgICAvLyAgIGEpIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHNlcmlhbGx5LgorICAgIC8vICAgYikgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gYWNjb3JkYW5jZSB3aXRoIElDYW1lcmFEZXZpY2VVc2VyLnN1Ym1pdFJlcXVlc3RMaXN0LAorICAgIC8vICAgICAgb3RoZXJ3aXNlLCB0aGUgd3JvbmcgY2FwdHVyZSByZXF1ZXN0IG1pZ2h0IGhhdmUgdGhlIHdyb25nIHNldHRpbmdzCisgICAgLy8gICAgICBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggaXQuCisgICAgY2FtZXJhX3N0YXR1c190IGFsbG9jYXRlQ2FwdHVyZVJlcXVlc3RMb2NrZWQoCisgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIHNwPENhcHR1cmVSZXF1ZXN0PiYgb3V0UmVxKTsKKyAgICB2b2lkIGFsbG9jYXRlT25lQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YSgKKyAgICAgICAgICAgIFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MmIGNhbWVyYVNldHRpbmdzLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGlkLCBjb25zdCBzcDxBQ2FtZXJhTWV0YWRhdGE+JiBtZXRhZGF0YSk7CisKKyAgICBzdGF0aWMgQUNhcHR1cmVSZXF1ZXN0KiBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4mIHJlcSwgY29uc3QgY2hhciogZGV2aWNlSWQpOworICAgIHN0YXRpYyB2b2lkIGZyZWVBQ2FwdHVyZVJlcXVlc3QoQUNhcHR1cmVSZXF1ZXN0Kik7CisKKyAgICAvLyBvbmx5IEZvciBzZXNzaW9uIHRvIGhvbGQgZGV2aWNlIGxvY2sKKyAgICAvLyBBbHdheXMgZ3JhYiBkZXZpY2UgbG9jayBiZWZvcmUgZ3JhYmJpbmcgc2Vzc2lvbiBsb2NrCisgICAgdm9pZCBsb2NrRGV2aWNlRm9yU2Vzc2lvbk9wcygpIGNvbnN0IHsgbURldmljZUxvY2subG9jaygpOyB9OworICAgIHZvaWQgdW5sb2NrRGV2aWNlKCkgY29uc3QgeyBtRGV2aWNlTG9jay51bmxvY2soKTsgfTsKKworICAgIC8vIEZvciBjYXB0dXJlIHNlc3Npb24gdG8gbm90aWZ5IGl0cyBlbmQgb2YgbGlmZQorICAgIHZvaWQgbm90aWZ5U2Vzc2lvbkVuZE9mTGlmZUxvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24pOworCisgICAgY2FtZXJhX3N0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzLAorICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzKTsKKworICAgIC8vIElucHV0IG1lc3NhZ2Ugd2lsbCBiZSBwb3N0ZWQgYW5kIGNsZWFyZWQgYWZ0ZXIgdGhpcyByZXR1cm5zCisgICAgdm9pZCBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAoc3A8QU1lc3NhZ2U+JiBtc2cpOworCisgICAgbXV0YWJsZSBNdXRleCBtRGV2aWNlTG9jazsKKyAgICBjb25zdCBoaWRsX3N0cmluZyBtQ2FtZXJhSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYW1lcmEgSUQKKyAgICBjb25zdCBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzIG1BcHBDYWxsYmFja3M7IC8vIENhbGxiYWNrIHRvIGFwcAorICAgIGNvbnN0IHNwPEFDYW1lcmFNZXRhZGF0YT4gbUNoYXJzOyAgICAvLyBDYW1lcmEgY2hhcmFjdGVyaXN0aWNzCisgICAgY29uc3Qgc3A8U2VydmljZUNhbGxiYWNrPiBtU2VydmljZUNhbGxiYWNrOworICAgIEFDYW1lcmFEZXZpY2UqIG1XcmFwcGVyOworCisgICAgLy8gc3RyZWFtIGlkIC0+IHBhaXIgb2YgKEFDYW1lcmFXaW5kb3dUeXBlKiBmcm9tIGFwcGxpY2F0aW9uLCBPdXRwdXRDb25maWd1cmF0aW9uIHVzZWQgZm9yCisgICAgLy8gY2FtZXJhIHNlcnZpY2UpCisgICAgc3RkOjptYXA8aW50LCBzdGQ6OnBhaXI8bmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciwgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXI+PiBtQ29uZmlndXJlZE91dHB1dHM7CisKKyAgICAvLyBUT0RPOiBtYXliZSBhIGJvb2wgd2lsbCBzdWZmaWNlIGZvciBzeW5jaHJvbm91cyBpbXBsZW1lbnRhdGlvbj8KKyAgICBzdGQ6OmF0b21pY19ib29sIG1DbG9zaW5nOworICAgIGlubGluZSBib29sIGlzQ2xvc2VkKCkgeyByZXR1cm4gbUNsb3Npbmc7IH0KKworICAgIGJvb2wgbUluRXJyb3IgPSBmYWxzZTsKKyAgICBjYW1lcmFfc3RhdHVzX3QgbUVycm9yID0gQUNBTUVSQV9PSzsKKyAgICB2b2lkIG9uQ2FwdHVyZUVycm9yTG9ja2VkKAorICAgICAgICAgICAgRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CisKKyAgICBib29sIG1JZGxlID0gdHJ1ZTsKKyAgICAvLyBUaGlzIHdpbGwgYXZvaWQgYSBidXN5IHNlc3Npb24gYmVpbmcgZGVsZXRlZCBiZWZvcmUgaXQncyBiYWNrIHRvIGlkbGUgc3RhdGUKKyAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IG1CdXN5U2Vzc2lvbjsKKworICAgIHNwPElDYW1lcmFEZXZpY2VVc2VyPiBtUmVtb3RlOworCisgICAgLy8gTG9vcGVyIHRocmVhZCB0byBoYW5kbGUgY2FsbGJhY2sgdG8gYXBwCisgICAgc3A8QUxvb3Blcj4gbUNiTG9vcGVyOworICAgIC8vIGRlZmluaXRpb24gb2YgaGFuZGxlciBhbmQgbWVzc2FnZQorICAgIGVudW0geworICAgICAgICAvLyBEZXZpY2Ugc3RhdGUgY2FsbGJhY2tzCisgICAgICAgIGtXaGF0T25EaXNjb25uZWN0ZWQsICAgLy8gb25EaXNjb25uZWN0ZWQKKyAgICAgICAga1doYXRPbkVycm9yLCAgICAgICAgICAvLyBvbkVycm9yCisgICAgICAgIC8vIFNlc3Npb24gc3RhdGUgY2FsbGJhY2tzCisgICAgICAgIGtXaGF0U2Vzc2lvblN0YXRlQ2IsICAgLy8gb25SZWFkeSwgb25BY3RpdmUKKyAgICAgICAgLy8gQ2FwdHVyZSBjYWxsYmFja3MKKyAgICAgICAga1doYXRDYXB0dXJlU3RhcnQsICAgICAvLyBvbkNhcHR1cmVTdGFydGVkCisgICAgICAgIGtXaGF0Q2FwdHVyZVJlc3VsdCwgICAgLy8gb25DYXB0dXJlUHJvZ3Jlc3NlZCwgb25DYXB0dXJlQ29tcGxldGVkCisgICAgICAgIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQsIC8vIG9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQKKyAgICAgICAga1doYXRDYXB0dXJlRmFpbCwgICAgICAvLyBvbkNhcHR1cmVGYWlsZWQKKyAgICAgICAga1doYXRDYXB0dXJlU2VxRW5kLCAgICAvLyBvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZAorICAgICAgICBrV2hhdENhcHR1cmVTZXFBYm9ydCwgIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZAorICAgICAgICBrV2hhdENhcHR1cmVCdWZmZXJMb3N0LC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKKyAgICAgICAgLy8gSW50ZXJuYWwgY2xlYW51cAorICAgICAgICBrV2hhdENsZWFuVXBTZXNzaW9ucyAgIC8vIENsZWFudXAgY2FjaGVkIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4KKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ29udGV4dEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0RldmljZUtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0Vycm9yQ29kZUtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhbGxiYWNrRnBLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtTZXNzaW9uU3BLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlUmVxdWVzdEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga1RpbWVTdGFtcEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhcHR1cmVSZXN1bHRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtQaHlzaWNhbENhcHR1cmVSZXN1bHRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlRmFpbHVyZUtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga1NlcXVlbmNlSWRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtGcmFtZU51bWJlcktleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0Fud0tleTsKKworICAgIGNsYXNzIENhbGxiYWNrSGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgICBwdWJsaWM6CisgICAgICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworCisgICAgICBwcml2YXRlOgorICAgICAgICAvLyBUaGlzIGhhbmRsZXIgd2lsbCBjYWNoZSBhbGwgY2FwdHVyZSBzZXNzaW9uIHNwIHVudGlsIGtXaGF0Q2xlYW5VcFNlc3Npb25zCisgICAgICAgIC8vIGlzIHByb2Nlc3NlZC4gVGhpcyBpcyB1c2VkIHRvIGd1YXJhbnRlZSB0aGUgbGFzdCBzZXNzaW9uIHJlZmVyZW5jZSBpcyBhbHdheXMKKyAgICAgICAgLy8gYmVpbmcgcmVtb3ZlZCBpbiBjYWxsYmFjayB0aHJlYWQgd2l0aG91dCBob2xkaW5nIGNhbWVyYSBkZXZpY2UgbG9jaworICAgICAgICBWZWN0b3I8c3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPj4gbUNhY2hlZFNlc3Npb25zOworICAgIH07CisgICAgc3A8Q2FsbGJhY2tIYW5kbGVyPiBtSGFuZGxlcjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIENhcHR1cmUgc2Vzc2lvbiByZWxhdGVkIG1lbWJlcnMgKgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvLyBUaGUgY3VycmVudCBhY3RpdmUgc2Vzc2lvbgorICAgIHdwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gbUN1cnJlbnRTZXNzaW9uOworICAgIGJvb2wgbUZsdXNoaW5nID0gZmFsc2U7CisKKyAgICBpbnQgbU5leHRTZXNzaW9uSWQgPSAwOworICAgIC8vIFRPRE86IG1pZ2h0IG5lZWQgYW5vdGhlciBsb29wZXIvaGFuZGxlciB0byBoYW5kbGUgY2FsbGJhY2tzIGZyb20gc2VydmljZQorCisgICAgc3RhdGljIGNvbnN0IGludCBSRVFVRVNUX0lEX05PTkUgPSAtMTsKKyAgICBpbnQgbVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBSRVFVRVNUX0lEX05PTkU7CisKKyAgICAvLyBzZXF1ZW5jZSBpZCAtPiBsYXN0IGZyYW1lIG51bWJlciBtYXAKKyAgICBzdGQ6Om1hcDxpbnQzMl90LCBpbnQ2NF90PiBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXA7CisKKyAgICBzdHJ1Y3QgQ2FsbGJhY2tIb2xkZXIgeworICAgICAgICBDYWxsYmFja0hvbGRlcihzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4+JiAgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMpOworICAgICAgICBDYWxsYmFja0hvbGRlcihzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4+JiAgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMpOworCisgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgICAgICB2b2lkIGluaXRDYXB0dXJlQ2FsbGJhY2tzKFQqIGNicykgeworICAgICAgICAgICAgbUNvbnRleHQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVN0YXJ0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVByb2dyZXNzZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlRmFpbGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVCdWZmZXJMb3N0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGlmIChjYnMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1Db250ZXh0ID0gY2JzLT5jb250ZXh0OworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTdGFydGVkID0gY2JzLT5vbkNhcHR1cmVTdGFydGVkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVQcm9ncmVzc2VkID0gY2JzLT5vbkNhcHR1cmVQcm9ncmVzc2VkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVGYWlsZWQgPSBjYnMtPm9uQ2FwdHVyZUZhaWxlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQgPSBjYnMtPm9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQgPSBjYnMtPm9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlQnVmZmVyTG9zdCA9IGNicy0+b25DYXB0dXJlQnVmZmVyTG9zdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICBtU2Vzc2lvbjsKKyAgICAgICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0Pj4gIG1SZXF1ZXN0czsKKyAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc1JlcGVhdGluZzsKKyAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjazsKKworICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgbU9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkNhcHR1cmVQcm9ncmVzc2VkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25DYXB0dXJlQ29tcGxldGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2ZhaWxlZCBtT25DYXB0dXJlRmFpbGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlRW5kIG1PbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUFib3J0IG1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfYnVmZmVyTG9zdCBtT25DYXB0dXJlQnVmZmVyTG9zdDsKKyAgICB9OworICAgIC8vIHNlcXVlbmNlIGlkIC0+IGNhbGxiYWNrcyBtYXAKKyAgICBzdGQ6Om1hcDxpbnQsIENhbGxiYWNrSG9sZGVyPiBtU2VxdWVuY2VDYWxsYmFja01hcDsKKworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IE5PX0ZSQU1FU19DQVBUVVJFRCA9IC0xOworICAgIGNsYXNzIEZyYW1lTnVtYmVyVHJhY2tlciB7CisgICAgICBwdWJsaWM6CisgICAgICAgIC8vIFRPRE86IENhbGxlZCBpbiBvblJlc3VsdFJlY2VpdmVkIGFuZCBvbkNhcHR1cmVFcnJvckxvY2tlZAorICAgICAgICB2b2lkIHVwZGF0ZVRyYWNrZXIoaW50NjRfdCBmcmFtZU51bWJlciwgYm9vbCBpc0Vycm9yKTsKKyAgICAgICAgaW5saW5lIGludDY0X3QgZ2V0Q29tcGxldGVkRnJhbWVOdW1iZXIoKSB7IHJldHVybiBtQ29tcGxldGVkRnJhbWVOdW1iZXI7IH0KKyAgICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgdXBkYXRlKCk7CisgICAgICAgIHZvaWQgdXBkYXRlQ29tcGxldGVkRnJhbWVOdW1iZXIoaW50NjRfdCBmcmFtZU51bWJlcik7CisKKyAgICAgICAgaW50NjRfdCBtQ29tcGxldGVkRnJhbWVOdW1iZXIgPSBOT19GUkFNRVNfQ0FQVFVSRUQ7CisgICAgICAgIExpc3Q8aW50NjRfdD4gbVNraXBwZWRGcmFtZU51bWJlcnM7CisgICAgICAgIHN0ZDo6c2V0PGludDY0X3Q+IG1GdXR1cmVFcnJvclNldDsKKyAgICB9OworICAgIEZyYW1lTnVtYmVyVHJhY2tlciBtRnJhbWVOdW1iZXJUcmFja2VyOworCisgICAgdm9pZCBjaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQoY29uc3QgaW50IHNlcXVlbmNlSWQsIGNvbnN0IGludDY0X3QgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB2b2lkIGNoZWNrQW5kRmlyZVNlcXVlbmNlQ29tcGxldGVMb2NrZWQoKTsKKworICAgIC8vIE1pc2MgdmFyaWFibGVzCisgICAgaW50MzJfdCBtU2hhZGluZ01hcFNpemVbMl07ICAgLy8gY29uc3QgYWZ0ZXIgY29uc3RydWN0b3IKKyAgICBpbnQzMl90IG1QYXJ0aWFsUmVzdWx0Q291bnQ7ICAvLyBjb25zdCBhZnRlciBjb25zdHJ1Y3RvcgorICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4gbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKK307CisKK30gLy8gbmFtZXNwYWNlIGFjYW07Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOworCisvKioKKyAqIEFDYW1lcmFEZXZpY2Ugb3BhcXVlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBMZWF2ZSBvdXRzaWRlIG9mIGFuZHJvaWQgbmFtZXNwYWNlIGJlY2F1c2UgaXQncyBOREsgc3RydWN0CisgKi8KK3N0cnVjdCBBQ2FtZXJhRGV2aWNlIHsKKyAgICBBQ2FtZXJhRGV2aWNlKGNvbnN0IGNoYXIqIGlkLCBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYiwKKyAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMpIDoKKyAgICAgICAgICAgIG1EZXZpY2UobmV3IGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZShpZCwgY2IsIHN0ZDo6bW92ZShjaGFycyksIHRoaXMpKSB7fQorCisgICAgfkFDYW1lcmFEZXZpY2UoKSB7fTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqCisgICAgICogTkRLIHB1YmxpYyBBUElzICoKKyAgICAgKioqKioqKioqKioqKioqKioqKi8KKyAgICBpbmxpbmUgY29uc3QgY2hhciogZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlLT5nZXRJZCgpOyB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVJlcXVlc3QoCisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFJZExpc3QqIHBoeXNpY2FsQ2FtZXJhSWRMaXN0LAorICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURldmljZS0+Y3JlYXRlQ2FwdHVyZVJlcXVlc3QodGVtcGxhdGVJZCwgcGh5c2ljYWxDYW1lcmFJZExpc3QsIHJlcXVlc3QpOworICAgIH0KKworICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlU2Vzc2lvbigKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogICAgICAgb3V0cHV0cywKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrcywKKyAgICAgICAgICAgIC8qb3V0Ki9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKiBzZXNzaW9uKSB7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5jcmVhdGVDYXB0dXJlU2Vzc2lvbihvdXRwdXRzLCBzZXNzaW9uUGFyYW1ldGVycywgY2FsbGJhY2tzLCBzZXNzaW9uKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBEZXZpY2UgaW50ZXJhbCBBUElzICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaW5saW5lIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmFjYW06OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4gZ2V0U2VydmljZUNhbGxiYWNrKCkgeworICAgICAgICByZXR1cm4gbURldmljZS0+Z2V0U2VydmljZUNhbGxiYWNrKCk7CisgICAgfTsKKworICAgIC8vIENhbWVyYSBkZXZpY2UgaXMgb25seSBmdW5jdGlvbmFsIGFmdGVyIHJlbW90ZSBiZWluZyBzZXQKKyAgICBpbmxpbmUgdm9pZCBzZXRSZW1vdGVEZXZpY2UoYW5kcm9pZDo6c3A8YW5kcm9pZDo6YWNhbTo6SUNhbWVyYURldmljZVVzZXI+IHJlbW90ZSkgeworICAgICAgICBtRGV2aWNlLT5zZXRSZW1vdGVEZXZpY2UocmVtb3RlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgc2V0RGV2aWNlTWV0YWRhdGFRdWV1ZXMoKSB7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5zZXREZXZpY2VNZXRhZGF0YVF1ZXVlcygpOworICAgIH0KKyAgcHJpdmF0ZToKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2U+IG1EZXZpY2U7Cit9OworCisjZW5kaWYgLy8gX0FDQU1FUkFfREVWSUNFX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2VWZW5kb3IuaW5jIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZVZlbmRvci5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkNWE1MgotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2VWZW5kb3IuaW5jCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPENhbWVyYU1ldGFkYXRhLmg+CisKKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oIgorI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgorI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgIkFDYXB0dXJlUmVxdWVzdC5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Y2FwdHVyZUxvY2tlZCgKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL2ZhbHNlKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpzZXRSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL3RydWUpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190IENhbWVyYURldmljZTo6c3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm91dCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKKyAgICAgICAgYm9vbCBpc1JlcGVhdGluZykKK3sKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgc3VibWl0IGNhcHR1cmUgcmVxdWVzdCBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gRm9ybSB0d28gdmVjdG9ycyBvZiBjYXB0dXJlIHJlcXVlc3QsIG9uZSBmb3IgaW50ZXJuYWwgdHJhY2tpbmcKKyAgICBzdGQ6OnZlY3RvcjxmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0TGlzdDsKKyAgICBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+PiByZXF1ZXN0c1Y7CisgICAgcmVxdWVzdHNWLnNldENhcGFjaXR5KG51bVJlcXVlc3RzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVJlcXVlc3RzOyBpKyspIHsKKyAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcTsKKyAgICAgICAgcmV0ID0gYWxsb2NhdGVDYXB0dXJlUmVxdWVzdExvY2tlZChyZXF1ZXN0c1tpXSwgcmVxKTsKKyAgICAgICAgLy8gV2UgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kIHNpbmNlIGFmdGVyIHN1Ym1pdFJlcXVlc3RMaXN0IGlzIGNhbGxlZCwKKyAgICAgICAgLy8gdGhlIHJlcXVlc3QgbWV0YWRhdGEgcXVldWUgbWlnaHQgaGF2ZSByZW1vdmVkIHRoZSBjYXB0dXJlIHJlcXVlc3QKKyAgICAgICAgLy8gbWV0YWRhdGEuIFRoZXJlZm9yZSB3ZSBzaW1wbHkgYWRkIHRoZSBtZXRhZGF0YSB0byBpdHMgd3JhcHBlciBjbGFzcywKKyAgICAgICAgLy8gc28gdGhhdCBpdCBjYW4gYmUgcmV0cmlldmVkIGxhdGVyLgorICAgICAgICBhZGRSZXF1ZXN0U2V0dGluZ3NNZXRhZGF0YShyZXF1ZXN0c1tpXSwgcmVxKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ29udmVydCBjYXB0dXJlIHJlcXVlc3QgdG8gaW50ZXJuYWwgZm9ybWF0IGZhaWx1cmUhIHJldCAlZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGlmIChyZXEtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYXB0dXJlIHJlcXVlc3Qgd2l0aG91dCBvdXRwdXQgdGFyZ2V0IGNhbm5vdCBiZSBzdWJtaXR0ZWQhIik7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0TGlzdC5wdXNoX2JhY2sodXRpbHM6OmNvbnZlcnRUb0hpZGwocmVxLmdldCgpKSk7CisgICAgICAgIHJlcXVlc3RzVi5wdXNoX2JhY2socmVxKTsKKyAgICB9CisgICAgaWYgKGlzUmVwZWF0aW5nKSB7CisgICAgICAgIHJldCA9IHN0b3BSZXBlYXRpbmdMb2NrZWQoKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN0b3AgcmVwZWF0aW5nIGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTdWJtaXRJbmZvIGluZm87CisgICAgU3RhdHVzIHN0YXR1czsKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1SZW1vdGUtPnN1Ym1pdFJlcXVlc3RMaXN0KHJlcXVlc3RMaXN0LCBpc1JlcGVhdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmaW5mb10oYXV0byBzLCBhdXRvICZzdWJtaXRJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gc3VibWl0SW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGZvciBzdWJtaXRSZXF1ZXN0TGlzdCBjYWxsOiAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgcmVtb3RlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChzdGF0dXMpOworICAgIH0KKyAgICBpbnQzMl90IHNlcXVlbmNlSWQgPSBpbmZvLnJlcXVlc3RJZDsKKyAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IGluZm8ubGFzdEZyYW1lTnVtYmVyOworICAgIGlmIChzZXF1ZW5jZUlkIDwgMCkgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN1Ym1pdCByZXF1ZXN0IHJlbW90ZSBmYWlsdXJlOiByZXQgJWQiLCBnZXRJZCgpLCBzZXF1ZW5jZUlkKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBDYWxsYmFja0hvbGRlciBjYkhvbGRlcihzZXNzaW9uLCByZXF1ZXN0c1YsIGlzUmVwZWF0aW5nLCBjYnMpOworICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBjYkhvbGRlcikpOworICAgIGlmIChpc1JlcGVhdGluZykgeworICAgICAgICAvLyBzdG9wUmVwZWF0aW5nIGFib3ZlIHNob3VsZCBoYXZlIGNsZWFudXAgcmVwZWF0aW5nIHNlcXVlbmNlIGlkCisgICAgICAgIGlmIChtUmVwZWF0aW5nU2VxdWVuY2VJZCAhPSBSRVFVRVNUX0lEX05PTkUpIHsKKyAgICAgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFOworICAgICAgICB9CisgICAgICAgIG1SZXBlYXRpbmdTZXF1ZW5jZUlkID0gc2VxdWVuY2VJZDsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHNlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcikpOworICAgIH0KKworICAgIGlmIChtSWRsZSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIG1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vbkFjdGl2ZSk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0KKyAgICBtSWRsZSA9IGZhbHNlOworICAgIG1CdXN5U2Vzc2lvbiA9IHNlc3Npb247CisKKyAgICBpZiAoY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICAgICAgKmNhcHR1cmVTZXF1ZW5jZUlkID0gc2VxdWVuY2VJZDsKKyAgICB9CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFjYW0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzVlZTlkCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNTkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBQ2FtZXJhTWFuYWdlclZlbmRvciIKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCIKKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8VmVuZG9yVGFnRGVzY3JpcHRvci5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YWNhbTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCit1c2luZyBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFTdGF0dXNBbmRJZDsKK3VzaW5nIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6UHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpoZWxwZXI6OlZlbmRvclRhZ0Rlc2NyaXB0b3I7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OmhlbHBlcjo6VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOworCisvLyBTdGF0aWMgbWVtYmVyIGRlZmluaXRpb25zCitjb25zdCBjaGFyKiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjprQ2FtZXJhSWRLZXkgICA9ICJDYW1lcmFJZCI7Citjb25zdCBjaGFyKiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjprQ2FsbGJhY2tGcEtleSA9ICJDYWxsYmFja0ZwIjsKK2NvbnN0IGNoYXIqIENhbWVyYU1hbmFnZXJHbG9iYWw6OmtDb250ZXh0S2V5ICAgID0gIkNhbGxiYWNrQ29udGV4dCI7CitNdXRleCAgICAgICAgICAgICAgICBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpzTG9jazsKK0NhbWVyYU1hbmFnZXJHbG9iYWwqIENhbWVyYU1hbmFnZXJHbG9iYWw6OnNJbnN0YW5jZSA9IG51bGxwdHI7CisKKy8qKgorICogVGhlIHZlbmRvciB0YWcgZGVzY3JpcHRvciBjbGFzcyB0aGF0IHRha2VzIEhJREwgdmVuZG9yIHRhZyBpbmZvcm1hdGlvbiBhcworICogaW5wdXQuIE5vdCBwYXJ0IG9mIHZlbmRvciBhdmFpbGFibGUgVmVuZG9yVGFnRGVzY3JpcHRvciBjbGFzcyBiZWNhdXNlIHRoYXQgY2xhc3MgaXMgdXNlZCBieQorICogZGVmYXVsdCBIQUwgaW1wbGVtZW50YXRpb24gY29kZSBhcyB3ZWxsLgorICovCitjbGFzcyBIaWRsVmVuZG9yVGFnRGVzY3JpcHRvciA6IHB1YmxpYyBWZW5kb3JUYWdEZXNjcmlwdG9yIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBWZW5kb3JUYWdEZXNjcmlwdG9yIG9iamVjdCBmcm9tIHRoZSBISURMIFZlbmRvclRhZ1NlY3Rpb24KKyAgICAgKiB2ZWN0b3IuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgY3JlYXRlRGVzY3JpcHRvckZyb21IaWRsKGNvbnN0IGhpZGxfdmVjPFZlbmRvclRhZ1NlY3Rpb24+JiB2dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+ICpkZXNjcmlwdG9yKTsKK307CisKK3N0YXR1c190IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwoY29uc3QgaGlkbF92ZWM8VmVuZG9yVGFnU2VjdGlvbj4gJnZ0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gKmRlc2NyaXB0b3IpIHsKKyAgICBpbnQgdGFnQ291bnQgPSAwOworCisgICAgZm9yIChzaXplX3QgcyA9IDA7IHMgPCB2dHMuc2l6ZSgpOyBzKyspIHsKKyAgICAgICAgdGFnQ291bnQgKz0gdnRzW3NdLnRhZ3Muc2l6ZSgpOworICAgIH0KKworICAgIGlmICh0YWdDb3VudCA8IDAgfHwgdGFnQ291bnQgPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB0YWcgY291bnQgJWQgZnJvbSB2ZW5kb3IgdGFnIHNlY3Rpb25zIGlzIGludmFsaWQuIiwgX19GVU5DVElPTl9fLCB0YWdDb3VudCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgVmVjdG9yPHVpbnQzMl90PiB0YWdBcnJheTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHRhZ0FycmF5LnJlc2l6ZSh0YWdDb3VudCkgIT0gdGFnQ291bnQsCisgICAgICAgICAgICAiJXM6IHRvbyBtYW55ICgldSkgdmVuZG9yIHRhZ3MgZGVmaW5lZC4iLCBfX0ZVTkNUSU9OX18sIHRhZ0NvdW50KTsKKworICAgIHNwPEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkZXNjID0gbmV3IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgZGVzYy0+bVRhZ0NvdW50ID0gdGFnQ291bnQ7CisKKyAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgU3RyaW5nOD4gdGFnVG9TZWN0aW9uTWFwOworCisgICAgaW50IGlkeCA9IDA7CisgICAgZm9yIChzaXplX3QgcyA9IDA7IHMgPCB2dHMuc2l6ZSgpOyBzKyspIHsKKyAgICAgICAgY29uc3QgVmVuZG9yVGFnU2VjdGlvbiYgc2VjdGlvbiA9IHZ0c1tzXTsKKyAgICAgICAgY29uc3QgY2hhciAqc2VjdGlvbk5hbWUgPSBzZWN0aW9uLnNlY3Rpb25OYW1lLmNfc3RyKCk7CisgICAgICAgIGlmIChzZWN0aW9uTmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHNlY3Rpb24gbmFtZSBkZWZpbmVkIGZvciB2ZW5kb3IgdGFnIHNlY3Rpb24gJXp1LiIsIF9fRlVOQ1RJT05fXywgcyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFN0cmluZzggc2VjdGlvblN0cmluZyhzZWN0aW9uTmFtZSk7CisgICAgICAgIGRlc2MtPm1TZWN0aW9ucy5hZGQoc2VjdGlvblN0cmluZyk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzZWN0aW9uLnRhZ3Muc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRhZyA9IHNlY3Rpb24udGFnc1tqXS50YWdJZDsKKyAgICAgICAgICAgIGlmICh0YWcgPCBDQU1FUkFfTUVUQURBVEFfVkVORE9SX1RBR19CT1VOREFSWSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogdmVuZG9yIHRhZyAlZCBub3QgaW4gdmVuZG9yIHRhZyBzZWN0aW9uLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0YWdBcnJheS5lZGl0SXRlbUF0KGlkeCsrKSA9IHNlY3Rpb24udGFnc1tqXS50YWdJZDsKKworICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnTmFtZSA9IHNlY3Rpb24udGFnc1tqXS50YWdOYW1lLmNfc3RyKCk7CisgICAgICAgICAgICBpZiAodGFnTmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBubyB0YWcgbmFtZSBkZWZpbmVkIGZvciB2ZW5kb3IgdGFnICVkLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzYy0+bVRhZ1RvTmFtZU1hcC5hZGQodGFnLCBTdHJpbmc4KHRhZ05hbWUpKTsKKyAgICAgICAgICAgIHRhZ1RvU2VjdGlvbk1hcC5hZGQodGFnLCBzZWN0aW9uU3RyaW5nKTsKKworICAgICAgICAgICAgaW50IHRhZ1R5cGUgPSAoaW50KSBzZWN0aW9uLnRhZ3Nbal0udGFnVHlwZTsKKyAgICAgICAgICAgIGlmICh0YWdUeXBlIDwgMCB8fCB0YWdUeXBlID49IE5VTV9UWVBFUykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogdGFnIHR5cGUgJWQgZnJvbSB2ZW5kb3Igb3BzIGRvZXMgbm90IGV4aXN0LiIsIF9fRlVOQ1RJT05fXywgdGFnVHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc2MtPm1UYWdUb1R5cGVNYXAuZW1wbGFjZSh0YWcsIHRhZ1R5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YWdBcnJheS5zaXplKCk7ICsraSkgeworICAgICAgICB1aW50MzJfdCB0YWcgPSB0YWdBcnJheVtpXTsKKyAgICAgICAgU3RyaW5nOCBzZWN0aW9uU3RyaW5nID0gdGFnVG9TZWN0aW9uTWFwLnZhbHVlRm9yKHRhZyk7CisKKyAgICAgICAgLy8gU2V0IHVwIHRhZyB0byBzZWN0aW9uIGluZGV4IG1hcAorICAgICAgICBzc2l6ZV90IGluZGV4ID0gZGVzYy0+bVNlY3Rpb25zLmluZGV4T2Yoc2VjdGlvblN0cmluZyk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5kZXggPCAwLCAiaW5kZXggJXpkIG11c3QgYmUgbm9uLW5lZ2F0aXZlIiwgaW5kZXgpOworICAgICAgICBkZXNjLT5tVGFnVG9TZWN0aW9uTWFwLmFkZCh0YWcsIHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmRleCkpOworCisgICAgICAgIC8vIFNldCB1cCByZXZlcnNlIG1hcHBpbmcKKyAgICAgICAgc3NpemVfdCByZXZlcnNlSW5kZXggPSAtMTsKKyAgICAgICAgaWYgKChyZXZlcnNlSW5kZXggPSBkZXNjLT5tUmV2ZXJzZU1hcHBpbmcuaW5kZXhPZktleShzZWN0aW9uU3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCB1aW50MzJfdD4qIG5hbWVNYXBwZXIgPSBuZXcgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgdWludDMyX3Q+KCk7CisgICAgICAgICAgICByZXZlcnNlSW5kZXggPSBkZXNjLT5tUmV2ZXJzZU1hcHBpbmcuYWRkKHNlY3Rpb25TdHJpbmcsIG5hbWVNYXBwZXIpOworICAgICAgICB9CisgICAgICAgIGRlc2MtPm1SZXZlcnNlTWFwcGluZ1tyZXZlcnNlSW5kZXhdLT5hZGQoZGVzYy0+bVRhZ1RvTmFtZU1hcC52YWx1ZUZvcih0YWcpLCB0YWcpOworICAgIH0KKworICAgICpkZXNjcmlwdG9yID0gc3RkOjptb3ZlKGRlc2MpOworICAgIHJldHVybiBPSzsKK30KKworQ2FtZXJhTWFuYWdlckdsb2JhbCYKK0NhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChzTG9jayk7CisgICAgQ2FtZXJhTWFuYWdlckdsb2JhbCogaW5zdGFuY2UgPSBzSW5zdGFuY2U7CisgICAgaWYgKGluc3RhbmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgaW5zdGFuY2UgPSBuZXcgQ2FtZXJhTWFuYWdlckdsb2JhbCgpOworICAgICAgICBzSW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICB9CisgICAgcmV0dXJuICppbnN0YW5jZTsKK30KKworQ2FtZXJhTWFuYWdlckdsb2JhbDo6fkNhbWVyYU1hbmFnZXJHbG9iYWwoKSB7CisgICAgLy8gY2xlYXIgc0luc3RhbmNlIHNvIG5leHQgZ2V0SW5zdGFuY2UgY2FsbCBrbm93cyB0byBjcmVhdGUgYSBuZXcgb25lCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9zbChzTG9jayk7CisgICAgc0luc3RhbmNlID0gbnVsbHB0cjsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtQ2FtZXJhU2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIG1DYW1lcmFTZXJ2aWNlLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKKyAgICAgICAgbUNhbWVyYVNlcnZpY2UtPnJlbW92ZUxpc3RlbmVyKG1DYW1lcmFTZXJ2aWNlTGlzdGVuZXIpOworICAgIH0KKyAgICBtRGVhdGhOb3RpZmllci5jbGVhcigpOworICAgIGlmIChtQ2JMb29wZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtQ2JMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKKyAgICAgICAgbUNiTG9vcGVyLT5zdG9wKCk7CisgICAgfQorICAgIG1DYkxvb3Blci5jbGVhcigpOworICAgIG1IYW5kbGVyLmNsZWFyKCk7CisgICAgbUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5jbGVhcigpOworICAgIG1DYW1lcmFTZXJ2aWNlLmNsZWFyKCk7Cit9CisKK3N0YXRpYyBib29sIGlzQ2FtZXJhU2VydmljZURpc2FibGVkKCkgeworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBwcm9wZXJ0eV9nZXQoImNvbmZpZy5kaXNhYmxlX2NhbWVyYXNlcnZpY2UiLCB2YWx1ZSwgIjAiKTsKKyAgICByZXR1cm4gKHN0cm5jbXAodmFsdWUsICIwIiwgMikgIT0gMCAmJiBzdHJuY2FzZWNtcCh2YWx1ZSwgImZhbHNlIiwgNikgIT0gMCk7Cit9CisKK2Jvb2wgQ2FtZXJhTWFuYWdlckdsb2JhbDo6c2V0dXBWZW5kb3JUYWdzKCkgeworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZT4gdGFnQ2FjaGUgPSBuZXcgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlKCk7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgc3RkOjp2ZWN0b3I8UHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zPiBwcm92aWRlcklkc0FuZFZ0czsKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1DYW1lcmFTZXJ2aWNlLT5nZXRDYW1lcmFWZW5kb3JUYWdTZWN0aW9ucyhbJnN0YXR1cywgJnByb3ZpZGVySWRzQW5kVnRzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvICZJZHNBbmRWdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcklkc0FuZFZ0cyA9IElkc0FuZFZ0czsgfSk7CisKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXRyaWV2ZSBWZW5kb3JUYWdTZWN0aW9ucyAlcyIsIHJlbW90ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIENvbnZlcnQgZWFjaCBwcm92aWRlcnMgVmVuZG9yVGFnU2VjdGlvbnMgaW50byBhIFZlbmRvclRhZ0Rlc2NyaXB0b3IgYW5kCisgICAgLy8gYWRkIGl0IHRvIHRoZSBjYWNoZQorICAgIGZvciAoYXV0byAmcHJvdmlkZXJJZEFuZFZ0cyA6IHByb3ZpZGVySWRzQW5kVnRzKSB7CisgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHZlbmRvclRhZ0Rlc2NyaXB0b3I7CisgICAgICAgIGlmIChIaWRsVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21IaWRsKHByb3ZpZGVySWRBbmRWdHMudmVuZG9yVGFnU2VjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZW5kb3JUYWdEZXNjcmlwdG9yKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb252ZXJ0IGZyb20gSGlkbDogVmVuZG9yVGFnRGVzY3JpcHRvciIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRhZ0NhY2hlLT5hZGRWZW5kb3JEZXNjcmlwdG9yKHByb3ZpZGVySWRBbmRWdHMucHJvdmlkZXJJZCwgdmVuZG9yVGFnRGVzY3JpcHRvcik7CisgICAgfQorICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTo6c2V0QXNHbG9iYWxWZW5kb3JUYWdDYWNoZSh0YWdDYWNoZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3NwPElDYW1lcmFTZXJ2aWNlPiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRDYW1lcmFTZXJ2aWNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1DYW1lcmFTZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGlzQ2FtZXJhU2VydmljZURpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2FtZXJhU2VydmljZTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBjYW1lcmFTZXJ2aWNlQmluZGVyOworICAgICAgICBkbyB7CisgICAgICAgICAgICBjYW1lcmFTZXJ2aWNlQmluZGVyID0gSUNhbWVyYVNlcnZpY2U6OmdldFNlcnZpY2UoKTsKKyAgICAgICAgICAgIGlmIChjYW1lcmFTZXJ2aWNlQmluZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dXKCJDYW1lcmFTZXJ2aWNlIG5vdCBwdWJsaXNoZWQsIHdhaXRpbmcuLi4iKTsKKyAgICAgICAgICAgIHVzbGVlcChrQ2FtZXJhU2VydmljZVBvbGxEZWxheSk7CisgICAgICAgIH0gd2hpbGUodHJ1ZSk7CisgICAgICAgIGlmIChtRGVhdGhOb3RpZmllciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKHRoaXMpOworICAgICAgICB9CisgICAgICAgIGNhbWVyYVNlcnZpY2VCaW5kZXItPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCAwKTsKKyAgICAgICAgbUNhbWVyYVNlcnZpY2UgPSBjYW1lcmFTZXJ2aWNlQmluZGVyOworCisgICAgICAgIC8vIFNldHVwIGxvb3BlciB0aHJlYWQgdG8gcGVyZnJvbSBhdmFpbGlhYmlsaXR5IGNhbGxiYWNrcworICAgICAgICBpZiAobUNiTG9vcGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1DYkxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICAgICAgbUNiTG9vcGVyLT5zZXROYW1lKCJDMk4tbWdyLWxvb3BlciIpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNiTG9vcGVyLT5zdGFydCgKKyAgICAgICAgICAgICAgICAgICAgLypydW5PbkNhbGxpbmdUaHJlYWQqL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAvKmNhbkNhbGxKYXZhKi8gICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgUFJJT1JJVFlfREVGQVVMVCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc3RhcnQgY2FtZXJhIHNlcnZpY2UgbGlzdGVuZXIgbG9vcGVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgICAgICAgICAgbUNiTG9vcGVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUhhbmRsZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNiTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcgorICAgICAgICBpZiAobUNhbWVyYVNlcnZpY2VMaXN0ZW5lciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtQ2FtZXJhU2VydmljZUxpc3RlbmVyID0gbmV3IENhbWVyYVNlcnZpY2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBoaWRsX3ZlYzxDYW1lcmFTdGF0dXNBbmRJZD4gY2FtZXJhU3RhdHVzZXN7fTsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgICAgIGF1dG8gcmVtb3RlUmV0ID0gbUNhbWVyYVNlcnZpY2UtPmFkZExpc3RlbmVyKG1DYW1lcmFTZXJ2aWNlTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmY2FtZXJhU3RhdHVzZXNdKFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvICZyZXRTdGF0dXNlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYVN0YXR1c2VzID0gcmV0U3RhdHVzZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWRkIGxpc3RlbmVyIHRvIGNhbWVyYSBzZXJ2aWNlICVzIiwgcmVtb3RlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXR1cCB2ZW5kb3IgdGFncworICAgICAgICBpZiAoIXNldHVwVmVuZG9yVGFncygpKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCB1cCB2ZW5kb3IgdGFncyIpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8mIGMgOiBjYW1lcmFTdGF0dXNlcykgeworICAgICAgICAgICAgb25TdGF0dXNDaGFuZ2VkTG9ja2VkKGMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtQ2FtZXJhU2VydmljZTsKK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpEZWF0aE5vdGlmaWVyOjpzZXJ2aWNlRGllZCh1aW50NjRfdCBjb29raWUsIGNvbnN0IHdwPElCYXNlPiAmd2hvKSB7CisgICAgKHZvaWQpIGNvb2tpZTsKKyAgICAodm9pZCkgd2hvOworICAgIEFMT0dFKCJDYW1lcmEgc2VydmljZSBiaW5kZXJEaWVkISIpOworICAgIHNwPENhbWVyYU1hbmFnZXJHbG9iYWw+IGNtID0gbUNhbWVyYU1hbmFnZXIucHJvbW90ZSgpOworICAgIGlmIChjbSAhPSBudWxscHRyKSB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKGNtLT5tTG9jayk7CisgICAgICAgIGZvciAoYXV0byYgcGFpciA6IGNtLT5tRGV2aWNlU3RhdHVzTWFwKSB7CisgICAgICAgICAgICBDYW1lcmFTdGF0dXNBbmRJZCBjYW1lcmFTdGF0dXNBbmRJZDsKKyAgICAgICAgICAgIGNhbWVyYVN0YXR1c0FuZElkLmNhbWVyYUlkID0gcGFpci5maXJzdDsKKyAgICAgICAgICAgIGNhbWVyYVN0YXR1c0FuZElkLmRldmljZVN0YXR1cyA9IHBhaXIuc2Vjb25kOworICAgICAgICAgICAgY20tPm9uU3RhdHVzQ2hhbmdlZExvY2tlZChjYW1lcmFTdGF0dXNBbmRJZCk7CisgICAgICAgIH0KKyAgICAgICAgY20tPm1DYW1lcmFTZXJ2aWNlLmNsZWFyKCk7CisgICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyByZS1jb25uZWN0IGNhbGwgaGVyZT8KKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhTWFuYWdlckdsb2JhbDo6cmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjaykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQ2FsbGJhY2sgY2IoY2FsbGJhY2spOworICAgIGF1dG8gcGFpciA9IG1DYWxsYmFja3MuaW5zZXJ0KGNiKTsKKyAgICAvLyBTZW5kIGluaXRpYWwgY2FsbGJhY2tzIGlmIGNhbGxiYWNrIGlzIG5ld2x5IHJlZ2lzdGVyZWQKKyAgICBpZiAocGFpci5zZWNvbmQpIHsKKyAgICAgICAgZm9yIChhdXRvJiBwYWlyIDogbURldmljZVN0YXR1c01hcCkgeworICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGNhbWVyYUlkID0gcGFpci5maXJzdDsKKyAgICAgICAgICAgIENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMgPSBwYWlyLnNlY29uZDsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRTaW5nbGVDYWxsYmFjaywgbUhhbmRsZXIpOworICAgICAgICAgICAgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2sgY2IgPSBpc1N0YXR1c0F2YWlsYWJsZShzdGF0dXMpID8KKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2stPm9uQ2FtZXJhQXZhaWxhYmxlIDogY2FsbGJhY2stPm9uQ2FtZXJhVW5hdmFpbGFibGU7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkICopIGNiKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2FsbGJhY2stPmNvbnRleHQpOworICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoa0NhbWVyYUlkS2V5LCBBU3RyaW5nKGNhbWVyYUlkLmNfc3RyKCkpKTsKKyAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OnVucmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjaykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQ2FsbGJhY2sgY2IoY2FsbGJhY2spOworICAgIG1DYWxsYmFja3MuZXJhc2UoY2IpOworfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldENhbWVyYUlkTGlzdChzdGQ6OnZlY3RvcjxoaWRsX3N0cmluZz4qIGNhbWVyYUlkcykgeworICAgIC8vIEVuc3VyZSB0aGF0IHdlIGhhdmUgaW5pdGlhbGl6ZWQvcmVmcmVzaGVkIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBkZXZpY2VzCisgICAgYXV0byBjcyA9IGdldENhbWVyYVNlcnZpY2UoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgZm9yKGF1dG8mIGRldmljZVN0YXR1cyA6IG1EZXZpY2VTdGF0dXNNYXApIHsKKyAgICAgICAgaWYgKGRldmljZVN0YXR1cy5zZWNvbmQgPT0gQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX1BSRVNFTlQgfHwKKyAgICAgICAgICAgICAgICBkZXZpY2VTdGF0dXMuc2Vjb25kID09IENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX0VOVU1FUkFUSU5HKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjYW1lcmFJZHMtPnB1c2hfYmFjayhkZXZpY2VTdGF0dXMuZmlyc3QpOworICAgIH0KK30KKworYm9vbCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjp2YWxpZFN0YXR1cyhDYW1lcmFEZXZpY2VTdGF0dXMgc3RhdHVzKSB7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19OT1RfUFJFU0VOVDoKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19QUkVTRU5UOgorICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX0VOVU1FUkFUSU5HOgorICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX05PVF9BVkFJTEFCTEU6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgQ2FtZXJhTWFuYWdlckdsb2JhbDo6aXNTdGF0dXNBdmFpbGFibGUoQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cykgeworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfUFJFU0VOVDoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpDYWxsYmFja0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFNlbmRTaW5nbGVDYWxsYmFjazoKKyAgICAgICAgeworICAgICAgICAgICAgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2sgY2I7CisgICAgICAgICAgICB2b2lkKiBjb250ZXh0OworICAgICAgICAgICAgQVN0cmluZyBjYW1lcmFJZDsKKyAgICAgICAgICAgIGJvb2wgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmY2IpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FtZXJhIGNhbGxiYWNrIGZwISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDb250ZXh0S2V5LCAmY29udGV4dCk7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYWxsYmFjayBjb250ZXh0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoa0NhbWVyYUlkS2V5LCAmY2FtZXJhSWQpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FtZXJhIElEISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpjYikoY29udGV4dCwgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiB1bmtub3duIG1lc3NhZ2UgdHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgbXNnLT53aGF0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYU1hbmFnZXJHbG9iYWw6OkNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6b25TdGF0dXNDaGFuZ2VkKAorICAgICAgICBjb25zdCBDYW1lcmFTdGF0dXNBbmRJZCAmc3RhdHVzQW5kSWQpIHsKKyAgICBzcDxDYW1lcmFNYW5hZ2VyR2xvYmFsPiBjbSA9IG1DYW1lcmFNYW5hZ2VyLnByb21vdGUoKTsKKyAgICBpZiAoY20gIT0gbnVsbHB0cikgeworICAgICAgICBjbS0+b25TdGF0dXNDaGFuZ2VkKHN0YXR1c0FuZElkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGRlbGl2ZXIgc3RhdHVzIGNoYW5nZS4gR2xvYmFsIGNhbWVyYSBtYW5hZ2VyIGRpZWQiKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpvblN0YXR1c0NoYW5nZWQoCisgICAgICAgIGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgb25TdGF0dXNDaGFuZ2VkTG9ja2VkKHN0YXR1c0FuZElkKTsKK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpvblN0YXR1c0NoYW5nZWRMb2NrZWQoCisgICAgICAgIGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCkgeworICAgIGhpZGxfc3RyaW5nIGNhbWVyYUlkID0gc3RhdHVzQW5kSWQuY2FtZXJhSWQ7CisgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cyA9IHN0YXR1c0FuZElkLmRldmljZVN0YXR1czsKKyAgICBpZiAoIXZhbGlkU3RhdHVzKHN0YXR1cykpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHN0YXR1cyAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZmlyc3RTdGF0dXMgPSAobURldmljZVN0YXR1c01hcC5jb3VudChjYW1lcmFJZCkgPT0gMCk7CisgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG9sZFN0YXR1cyA9IGZpcnN0U3RhdHVzID8KKyAgICAgICAgICAgIHN0YXR1cyA6IC8vIGZpcnN0IHN0YXR1cworICAgICAgICAgICAgbURldmljZVN0YXR1c01hcFtjYW1lcmFJZF07CisKKyAgICBpZiAoIWZpcnN0U3RhdHVzICYmCisgICAgICAgICAgICBpc1N0YXR1c0F2YWlsYWJsZShzdGF0dXMpID09IGlzU3RhdHVzQXZhaWxhYmxlKG9sZFN0YXR1cykpIHsKKyAgICAgICAgLy8gTm8gc3RhdHVzIHVwZGF0ZS4gTm8gbmVlZCB0byBzZW5kIGNhbGxiYWNrCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2tzCisgICAgbURldmljZVN0YXR1c01hcFtjYW1lcmFJZF0gPSBzdGF0dXM7CisgICAgZm9yIChhdXRvIGNiIDogbUNhbGxiYWNrcykgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrLCBtSGFuZGxlcik7CisgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIGNiRnAgPSBpc1N0YXR1c0F2YWlsYWJsZShzdGF0dXMpID8KKyAgICAgICAgICAgICAgICBjYi5tQXZhaWxhYmxlIDogY2IubVVuYXZhaWxhYmxlOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkICopIGNiRnApOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiLm1Db250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRTdHJpbmcoa0NhbWVyYUlkS2V5LCBBU3RyaW5nKGNhbWVyYUlkLmNfc3RyKCkpKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX1BSRVNFTlQpIHsKKyAgICAgICAgbURldmljZVN0YXR1c01hcC5lcmFzZShjYW1lcmFJZCk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBhY2FtCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKy8qKgorICogQUNhbWVyYU1hbmdlciBJbXBsZW1lbnRhdGlvbgorICovCitjYW1lcmFfc3RhdHVzX3QKK0FDYW1lcmFNYW5hZ2VyOjpnZXRDYW1lcmFJZExpc3QoQUNhbWVyYUlkTGlzdCoqIGNhbWVyYUlkTGlzdCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBzdGQ6OnZlY3RvcjxoaWRsX3N0cmluZz4gaWRMaXN0OworICAgIENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkuZ2V0Q2FtZXJhSWRMaXN0KCZpZExpc3QpOworCisgICAgaW50IG51bUNhbWVyYXMgPSBpZExpc3Quc2l6ZSgpOworICAgIEFDYW1lcmFJZExpc3QgKm91dCA9IG5ldyBBQ2FtZXJhSWRMaXN0OworICAgIGlmICghb3V0KSB7CisgICAgICAgIEFMT0dFKCJBbGxvY2F0ZSBtZW1vcnkgZm9yIEFDYW1lcmFJZExpc3QgZmFpbGVkISIpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9OT1RfRU5PVUdIX01FTU9SWTsKKyAgICB9CisgICAgb3V0LT5udW1DYW1lcmFzID0gbnVtQ2FtZXJhczsKKyAgICBvdXQtPmNhbWVyYUlkcyA9IG5ldyBjb25zdCBjaGFyKltudW1DYW1lcmFzXTsKKyAgICBpZiAoIW91dC0+Y2FtZXJhSWRzKSB7CisgICAgICAgIEFMT0dFKCJBbGxvY2F0ZSBtZW1vcnkgZm9yIEFDYW1lcmFJZExpc3QgZmFpbGVkISIpOworICAgICAgICBkZWxldGVDYW1lcmFJZExpc3Qob3V0KTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfTk9UX0VOT1VHSF9NRU1PUlk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHNyYyA9IGlkTGlzdFtpXS5jX3N0cigpOworICAgICAgICBzaXplX3QgZHN0U2l6ZSA9IHN0cmxlbihzcmMpICsgMTsKKyAgICAgICAgY2hhciogZHN0ID0gbmV3IGNoYXJbZHN0U2l6ZV07CisgICAgICAgIGlmICghZHN0KSB7CisgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGUgbWVtb3J5IGZvciBBQ2FtZXJhSWRMaXN0IGZhaWxlZCEiKTsKKyAgICAgICAgICAgIGRlbGV0ZUNhbWVyYUlkTGlzdChvdXQpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfTk9UX0VOT1VHSF9NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgc3RybGNweShkc3QsIHNyYywgZHN0U2l6ZSk7CisgICAgICAgIG91dC0+Y2FtZXJhSWRzW2ldID0gZHN0OworICAgIH0KKyAgICAqY2FtZXJhSWRMaXN0ID0gb3V0OworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCit2b2lkCitBQ2FtZXJhTWFuYWdlcjo6ZGVsZXRlQ2FtZXJhSWRMaXN0KEFDYW1lcmFJZExpc3QqIGNhbWVyYUlkTGlzdCkgeworICAgIGlmIChjYW1lcmFJZExpc3QgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoY2FtZXJhSWRMaXN0LT5jYW1lcmFJZHMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYW1lcmFJZExpc3QtPm51bUNhbWVyYXM7IGkgKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FtZXJhSWRMaXN0LT5jYW1lcmFJZHNbaV0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBkZWxldGVbXSBjYW1lcmFJZExpc3QtPmNhbWVyYUlkc1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWxldGVbXSBjYW1lcmFJZExpc3QtPmNhbWVyYUlkczsKKyAgICAgICAgfQorICAgICAgICBkZWxldGUgY2FtZXJhSWRMaXN0OworICAgIH0KK30KKworY2FtZXJhX3N0YXR1c190IEFDYW1lcmFNYW5hZ2VyOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCisgICAgICAgIGNvbnN0IGNoYXIgKmNhbWVyYUlkU3RyLCBzcDxBQ2FtZXJhTWV0YWRhdGE+ICpjaGFyYWN0ZXJpc3RpY3MpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IGNzID0gQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKS5nZXRDYW1lcmFTZXJ2aWNlKCk7CisgICAgaWYgKGNzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgcmVhY2ggY2FtZXJhIHNlcnZpY2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisgICAgQ2FtZXJhTWV0YWRhdGEgcmF3TWV0YWRhdGE7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgYXV0byBzZXJ2aWNlUmV0ID0KKyAgICAgICAgY3MtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnJhd01ldGFkYXRhXSAoYXV0byBzICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJm1ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHM6OmNvbnZlcnRGcm9tSGlkbENsb25lZChtZXRhZGF0YSwgJnJhd01ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXNlcnZpY2VSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJHZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmcm9tIGNhbWVyYSBzZXJ2aWNlIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOyAvLyBzaG91bGQgbm90IHJlYWNoIGhlcmUKKyAgICB9CisKKyAgICAqY2hhcmFjdGVyaXN0aWNzID0gbmV3IEFDYW1lcmFNZXRhZGF0YSgKKyAgICAgICAgICAgIHJhd01ldGFkYXRhLnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fQ0hBUkFDVEVSSVNUSUNTKTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworY2FtZXJhX3N0YXR1c190CitBQ2FtZXJhTWFuYWdlcjo6b3BlbkNhbWVyYSgKKyAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWQsCisgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrLAorICAgICAgICAvKm91dCovQUNhbWVyYURldmljZSoqIG91dERldmljZSkgeworICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gcmF3Q2hhcnM7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCwgJnJhd0NoYXJzKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBnZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmb3IgY2FtZXJhICVzLiBlcnIgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsIHJldCk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIEFDYW1lcmFEZXZpY2UqIGRldmljZSA9IG5ldyBBQ2FtZXJhRGV2aWNlKGNhbWVyYUlkLCBjYWxsYmFjaywgc3RkOjptb3ZlKHJhd0NoYXJzKSk7CisKKyAgICBzcDxJQ2FtZXJhU2VydmljZT4gY3MgPSBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpLmdldENhbWVyYVNlcnZpY2UoKTsKKyAgICBpZiAoY3MgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCByZWFjaCBjYW1lcmEgc2VydmljZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBkZWxldGUgZGV2aWNlOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOworICAgIH0KKworICAgIHNwPElDYW1lcmFEZXZpY2VDYWxsYmFjaz4gY2FsbGJhY2tzID0gZGV2aWNlLT5nZXRTZXJ2aWNlQ2FsbGJhY2soKTsKKyAgICBzcDxJQ2FtZXJhRGV2aWNlVXNlcj4gZGV2aWNlUmVtb3RlOworCisgICAgLy8gTm8gd2F5IHRvIGdldCBwYWNrYWdlIG5hbWUgZnJvbSBuYXRpdmUuCisgICAgLy8gU2VuZCBhIHplcm8gbGVuZ3RoIHBhY2thZ2UgbmFtZSBhbmQgbGV0IGNhbWVyYSBzZXJ2aWNlIGZpZ3VyZSBpdCBvdXQgZnJvbSBVSUQKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpOT19FUlJPUjsKKyAgICBhdXRvIHNlcnZpY2VSZXQgPSBjcy0+Y29ubmVjdERldmljZSgKKyAgICAgICAgICAgIGNhbGxiYWNrcywgY2FtZXJhSWQsIFsmc3RhdHVzLCAmZGV2aWNlUmVtb3RlXShhdXRvIHMsIGF1dG8gJmRldmljZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlUmVtb3RlID0gZGV2aWNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICBpZiAoIXNlcnZpY2VSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCIlczogY29ubmVjdCBjYW1lcmEgZGV2aWNlIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIC8vIFRPRE86IENvbnZlcnQgc2VydmljZVJldCB0byBjYW1lcmFfc3RhdHVzX3QKKyAgICAgICAgZGVsZXRlIGRldmljZTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisgICAgaWYgKGRldmljZVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogY29ubmVjdCBjYW1lcmEgZGV2aWNlIGZhaWxlZCEgcmVtb3RlIGRldmljZSBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZGVsZXRlIGRldmljZTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisgICAgZGV2aWNlLT5zZXRSZW1vdGVEZXZpY2UoZGV2aWNlUmVtb3RlKTsKKyAgICBkZXZpY2UtPnNldERldmljZU1ldGFkYXRhUXVldWVzKCk7CisgICAgKm91dERldmljZSA9IGRldmljZTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworQUNhbWVyYU1hbmFnZXI6On5BQ2FtZXJhTWFuYWdlcigpIHsKKworfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY2OTM1MwotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9BQ0FNRVJBX01BTkFHRVJfSAorI2RlZmluZSBfQUNBTUVSQV9NQU5BR0VSX0gKKworI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZS5oPgorCisjaW5jbHVkZSA8Q2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKK3VzaW5nIElDYW1lcmFTZXJ2aWNlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6SUNhbWVyYVNlcnZpY2U7Cit1c2luZyBDYW1lcmFEZXZpY2VTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFEZXZpY2VTdGF0dXM7Cit1c2luZyBJQ2FtZXJhU2VydmljZUxpc3RlbmVyID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKK3VzaW5nIENhbWVyYVN0YXR1c0FuZElkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhU3RhdHVzQW5kSWQ7Cit1c2luZyBTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlN0YXR1czsKK3VzaW5nIFZlbmRvclRhZ1NlY3Rpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlZlbmRvclRhZ1NlY3Rpb247Cit1c2luZyBWZW5kb3JUYWcgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlZlbmRvclRhZzsKK3VzaW5nIElCYXNlID0gYW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyBoYXJkd2FyZTo6Vm9pZDsKKworLyoqCisgKiBQZXItcHJvY2VzcyBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgQ2FtZXJhTWFuZ2VyLiBTaGFyZWQgYnkgYWxsIEFDYW1lcmFNYW5hZ2VyCisgKiBpbnN0YW5jZXMuIENyZWF0ZWQgd2hlbiBmaXJzdCBBQ2FtZXJhTWFuYWdlciBpcyBjcmVhdGVkIGFuZCBkZXN0cm95ZWQgd2hlbgorICogYWxsIEFDYW1lcmFNYW5hZ2VyIGluc3RhbmNlcyBhcmUgZGVsZXRlZC4KKyAqCisgKiBUT0RPOiBtYXliZSBDYW1lcmFNYW5hZ2VyR2xvYmFsIGlzIGJldHRlciBzdWl0ZWQgaW4gbGliY2FtZXJhY2xpZW50PworICovCitjbGFzcyBDYW1lcmFNYW5hZ2VyR2xvYmFsIGZpbmFsIDogcHVibGljIFJlZkJhc2UgeworICBwdWJsaWM6CisgICAgc3RhdGljIENhbWVyYU1hbmFnZXJHbG9iYWwmIGdldEluc3RhbmNlKCk7CisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IGdldENhbWVyYVNlcnZpY2UoKTsKKworICAgIHZvaWQgcmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spOworICAgIHZvaWQgdW5yZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjayk7CisKKyAgICB2b2lkIHJlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzKiAvKmNhbGxiYWNrKi8pIHt9CisgICAgdm9pZCB1bnJlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzKiAvKmNhbGxiYWNrKi8pIHt9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gY2FtZXJhIElEcyB0aGF0IHN1cHBvcnQgY2FtZXJhMgorICAgICAqLworICAgIHZvaWQgZ2V0Q2FtZXJhSWRMaXN0KHN0ZDo6dmVjdG9yPGhpZGxfc3RyaW5nPiAqY2FtZXJhSWRzKTsKKworICBwcml2YXRlOgorICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBtQ2FtZXJhU2VydmljZTsKKyAgICBjb25zdCBpbnQgICAgICAgICAga0NhbWVyYVNlcnZpY2VQb2xsRGVsYXkgPSA1MDAwMDA7IC8vIDAuNXMKKyAgICBNdXRleCAgICAgICAgICAgICAgbUxvY2s7CisgICAgY2xhc3MgRGVhdGhOb3RpZmllciA6IHB1YmxpYyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQgeworICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBEZWF0aE5vdGlmaWVyKENhbWVyYU1hbmFnZXJHbG9iYWwqIGNtKSA6IG1DYW1lcmFNYW5hZ2VyKGNtKSB7fQorICAgICAgcHJvdGVjdGVkOgorICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCBpbXBsZW1lbnRhdGlvbgorICAgICAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQodWludDY0X3QgY29va2llLCBjb25zdCB3cDxJQmFzZT4gJndobyk7CisgICAgICBwcml2YXRlOgorICAgICAgICBjb25zdCB3cDxDYW1lcmFNYW5hZ2VyR2xvYmFsPiBtQ2FtZXJhTWFuYWdlcjsKKyAgICB9OworICAgIHNwPERlYXRoTm90aWZpZXI+IG1EZWF0aE5vdGlmaWVyOworCisgICAgY2xhc3MgQ2FtZXJhU2VydmljZUxpc3RlbmVyIGZpbmFsIDogcHVibGljIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgeworICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBDYW1lcmFTZXJ2aWNlTGlzdGVuZXIoQ2FtZXJhTWFuYWdlckdsb2JhbCogY20pIDogbUNhbWVyYU1hbmFnZXIoY20pIHt9CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gb25TdGF0dXNDaGFuZ2VkKAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhU3RhdHVzQW5kSWQgJnN0YXR1c0FuZElkKSBvdmVycmlkZTsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3Qgd3A8Q2FtZXJhTWFuYWdlckdsb2JhbD4gbUNhbWVyYU1hbmFnZXI7CisgICAgfTsKKyAgICBzcDxDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IG1DYW1lcmFTZXJ2aWNlTGlzdGVuZXI7CisKKyAgICAvLyBXcmFwcGVyIG9mIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyBzbyB3ZSBjYW4gc3RvcmUgaXQgaW4gc3RkOjpzZXQKKyAgICBzdHJ1Y3QgQ2FsbGJhY2sgeworICAgICAgICBleHBsaWNpdCBDYWxsYmFjayhjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSA6CisgICAgICAgICAgICBtQXZhaWxhYmxlKGNhbGxiYWNrLT5vbkNhbWVyYUF2YWlsYWJsZSksCisgICAgICAgICAgICBtVW5hdmFpbGFibGUoY2FsbGJhY2stPm9uQ2FtZXJhVW5hdmFpbGFibGUpLAorICAgICAgICAgICAgbUNvbnRleHQoY2FsbGJhY2stPmNvbnRleHQpIHt9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKG1BdmFpbGFibGUgPT0gb3RoZXIubUF2YWlsYWJsZSAmJgorICAgICAgICAgICAgICAgICAgICBtVW5hdmFpbGFibGUgPT0gb3RoZXIubVVuYXZhaWxhYmxlICYmCisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0ID09IG90aGVyLm1Db250ZXh0KTsKKyAgICAgICAgfQorICAgICAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgfQorICAgICAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IENhbGxiYWNrJiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAobUNvbnRleHQgIT0gb3RoZXIubUNvbnRleHQpIHJldHVybiBtQ29udGV4dCA8IG90aGVyLm1Db250ZXh0OworICAgICAgICAgICAgaWYgKG1BdmFpbGFibGUgIT0gb3RoZXIubUF2YWlsYWJsZSkgcmV0dXJuIG1BdmFpbGFibGUgPCBvdGhlci5tQXZhaWxhYmxlOworICAgICAgICAgICAgcmV0dXJuIG1VbmF2YWlsYWJsZSA8IG90aGVyLm1VbmF2YWlsYWJsZTsKKyAgICAgICAgfQorICAgICAgICBib29sIG9wZXJhdG9yID4gKGNvbnN0IENhbGxiYWNrJiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuICgqdGhpcyAhPSBvdGhlciAmJiAhKCp0aGlzIDwgb3RoZXIpKTsKKyAgICAgICAgfQorICAgICAgICBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFjayBtQXZhaWxhYmxlOworICAgICAgICBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFjayBtVW5hdmFpbGFibGU7CisgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0OworICAgIH07CisgICAgc3RkOjpzZXQ8Q2FsbGJhY2s+IG1DYWxsYmFja3M7CisKKyAgICAvLyBkZWZpbml0aW9uIG9mIGhhbmRsZXIgYW5kIG1lc3NhZ2UKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRTZW5kU2luZ2xlQ2FsbGJhY2sKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FtZXJhSWRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYWxsYmFja0ZwS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ29udGV4dEtleTsKKyAgICBjbGFzcyBDYWxsYmFja0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgICAgcHVibGljOgorICAgICAgICBDYWxsYmFja0hhbmRsZXIoKSB7fQorICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKyAgICB9OworICAgIHNwPENhbGxiYWNrSGFuZGxlcj4gbUhhbmRsZXI7CisgICAgc3A8QUxvb3Blcj4gICAgICAgICBtQ2JMb29wZXI7IC8vIExvb3BlciB0aHJlYWQgd2hlcmUgY2FsbGJhY2tzIGFjdHVhbGx5IGhhcHBlbiBvbgorCisgICAgdm9pZCBvblN0YXR1c0NoYW5nZWQoY29uc3QgQ2FtZXJhU3RhdHVzQW5kSWQgJnN0YXR1c0FuZElkKTsKKyAgICB2b2lkIG9uU3RhdHVzQ2hhbmdlZExvY2tlZChjb25zdCBDYW1lcmFTdGF0dXNBbmRJZCAmc3RhdHVzQW5kSWQpOworICAgIGJvb2wgc2V0dXBWZW5kb3JUYWdzKCk7CisKKyAgICAvLyBVdGlscyBmb3Igc3RhdHVzCisgICAgc3RhdGljIGJvb2wgdmFsaWRTdGF0dXMoQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cyk7CisgICAgc3RhdGljIGJvb2wgaXNTdGF0dXNBdmFpbGFibGUoQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cyk7CisKKyAgICAvLyBUaGUgc29ydCBsb2dpYyBtdXN0IG1hdGNoIHRoZSBsb2dpYyBpbgorICAgIC8vIGxpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHA6OmdldEFQSTFDb21wYXRpYmxlQ2FtZXJhRGV2aWNlSWRzCisgICAgc3RydWN0IENhbWVyYUlkQ29tcGFyYXRvciB7CisgICAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBoaWRsX3N0cmluZyYgYSwgY29uc3QgaGlkbF9zdHJpbmcmIGIpIGNvbnN0IHsKKyAgICAgICAgICAgIHVpbnQzMl90IGFVaW50ID0gMCwgYlVpbnQgPSAwOworICAgICAgICAgICAgYm9vbCBhSXNVaW50ID0gYmFzZTo6UGFyc2VVaW50KGEuY19zdHIoKSwgJmFVaW50KTsKKyAgICAgICAgICAgIGJvb2wgYklzVWludCA9IGJhc2U6OlBhcnNlVWludChiLmNfc3RyKCksICZiVWludCk7CisKKyAgICAgICAgICAgIC8vIFVpbnQgZGV2aWNlIElEcyBmaXJzdAorICAgICAgICAgICAgaWYgKGFJc1VpbnQgJiYgYklzVWludCkgeworICAgICAgICAgICAgICAgIHJldHVybiBhVWludCA8IGJVaW50OworICAgICAgICAgICAgfSBlbHNlIGlmIChhSXNVaW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJJc1VpbnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTaW1wbGUgc3RyaW5nIGNvbXBhcmUgaWYgYm90aCBpZCBhcmUgbm90IHVpbnQKKyAgICAgICAgICAgIHJldHVybiBhIDwgYjsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBNYXAgY2FtZXJhX2lkIC0+IHN0YXR1cworICAgIHN0ZDo6bWFwPGhpZGxfc3RyaW5nLCBDYW1lcmFEZXZpY2VTdGF0dXMsIENhbWVyYUlkQ29tcGFyYXRvcj4gbURldmljZVN0YXR1c01hcDsKKworICAgIC8vIEZvciB0aGUgc2luZ2xldG9uIGluc3RhbmNlCisgICAgc3RhdGljIE11dGV4IHNMb2NrOworICAgIHN0YXRpYyBDYW1lcmFNYW5hZ2VyR2xvYmFsKiBzSW5zdGFuY2U7CisgICAgQ2FtZXJhTWFuYWdlckdsb2JhbCgpIHt9OworICAgIH5DYW1lcmFNYW5hZ2VyR2xvYmFsKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhY2FtOworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLyoqCisgKiBBQ2FtZXJhTWFuYWdlciBvcGFxdWUgc3RydWN0IGRlZmluaXRpb24KKyAqIExlYXZlIG91dHNpZGUgb2YgYW5kcm9pZCBuYW1lc3BhY2UgYmVjYXVzZSBpdCdzIE5ESyBzdHJ1Y3QKKyAqLworc3RydWN0IEFDYW1lcmFNYW5hZ2VyIHsKKyAgICBBQ2FtZXJhTWFuYWdlcigpIDoKKyAgICAgICAgICAgIG1HbG9iYWxNYW5hZ2VyKCYoYW5kcm9pZDo6YWNhbTo6Q2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKSkpIHt9CisgICAgfkFDYW1lcmFNYW5hZ2VyKCk7CisgICAgY2FtZXJhX3N0YXR1c190IGdldENhbWVyYUlkTGlzdChBQ2FtZXJhSWRMaXN0KiogY2FtZXJhSWRMaXN0KTsKKyAgICBzdGF0aWMgdm9pZCAgICAgZGVsZXRlQ2FtZXJhSWRMaXN0KEFDYW1lcmFJZExpc3QqIGNhbWVyYUlkTGlzdCk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWQsIGFuZHJvaWQ6OnNwPEFDYW1lcmFNZXRhZGF0YT4qIGNoYXJhY3RlcmlzdGljcyk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3Qgb3BlbkNhbWVyYShjb25zdCBjaGFyKiBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovQUNhbWVyYURldmljZSoqIGRldmljZSk7CisKKyAgcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga0NhbWVyYUlkTGlzdE5vdEluaXQgPSAtMQorICAgIH07CisgICAgYW5kcm9pZDo6TXV0ZXggICAgICAgICBtTG9jazsKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjphY2FtOjpDYW1lcmFNYW5hZ2VyR2xvYmFsPiBtR2xvYmFsTWFuYWdlcjsKK307CisKKyNlbmRpZiAvL19BQ0FNRVJBX01BTkFHRVJfSApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhcHR1cmVSZXF1ZXN0VmVuZG9yLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FwdHVyZVJlcXVlc3RWZW5kb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDY3NjE1Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhcHR1cmVSZXF1ZXN0VmVuZG9yLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ1dGlscy5oIgorCitzdHJ1Y3QgQUNhbWVyYU91dHB1dFRhcmdldCB7CisgICAgZXhwbGljaXQgQUNhbWVyYU91dHB1dFRhcmdldChuYXRpdmVfaGFuZGxlX3QqIHdpbmRvdykgOiBtV2luZG93KHdpbmRvdykge307CisKKyAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyA9PSBvdGhlci5tV2luZG93OworICAgIH0KKyAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyAhPSBvdGhlci5tV2luZG93OworICAgIH0KKyAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IEFDYW1lcmFPdXRwdXRUYXJnZXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtV2luZG93IDwgb3RoZXIubVdpbmRvdzsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyA+IG90aGVyLm1XaW5kb3c7CisgICAgfQorCisgICAgYW5kcm9pZDo6YWNhbTo6dXRpbHM6Om5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgbVdpbmRvdzsKK307CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5jcHAgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyZDQ3YwotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmNwcApAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQUNhbWVyYVZlbmRvclV0aWxzIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CituYW1lc3BhY2UgdXRpbHMgeworCisvLyBDb252ZXJ0IENhcHR1cmVSZXF1ZXN0IHdyYXBwYWJsZSBieSBzcDw+IHRvIGhpZGwgQ2FwdHVyZVJlcXVlc3QuCitmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0Citjb252ZXJ0VG9IaWRsKGNvbnN0IENhcHR1cmVSZXF1ZXN0ICpjYXB0dXJlUmVxdWVzdCkgeworICAgIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3QgaENhcHR1cmVSZXF1ZXN0OworICAgIGhDYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzID0gY2FwdHVyZVJlcXVlc3QtPm1DYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzOworICAgIGhDYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHMgPSBjYXB0dXJlUmVxdWVzdC0+bUNhcHR1cmVSZXF1ZXN0LnN0cmVhbUFuZFdpbmRvd0lkczsKKyAgICByZXR1cm4gaENhcHR1cmVSZXF1ZXN0OworfQorCitIUm90YXRpb24gY29udmVydFRvSGlkbChpbnQgcm90YXRpb24pIHsKKyAgICBIUm90YXRpb24gaFJvdGF0aW9uID0gSFJvdGF0aW9uOjpSMDsKKyAgICBzd2l0Y2gocm90YXRpb24pIHsKKyAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl85MDoKKyAgICAgICAgICAgIGhSb3RhdGlvbiA9IEhSb3RhdGlvbjo6UjkwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMTgwOgorICAgICAgICAgICAgaFJvdGF0aW9uID0gSFJvdGF0aW9uOjpSMTgwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMjcwOgorICAgICAgICAgICAgaFJvdGF0aW9uID0gSFJvdGF0aW9uOjpSMjcwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGhSb3RhdGlvbjsKK30KKworYm9vbCBjb252ZXJ0RnJvbUhpZGxDbG9uZWQoY29uc3QgSENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSwgQ2FtZXJhTWV0YWRhdGEgKnJhd01ldGFkYXRhKSB7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhICpidWZmZXIgPSAoY2FtZXJhX21ldGFkYXRhX3QqKShtZXRhZGF0YS5kYXRhKCkpOworICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSBtZXRhZGF0YS5zaXplKCk7CisgICAgaW50IHJldCA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUoYnVmZmVyLCAmZXhwZWN0ZWRTaXplKTsKKyAgICBpZiAocmV0ID09IE9LIHx8IHJldCA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7CisgICAgICAgICpyYXdNZXRhZGF0YSA9IGJ1ZmZlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBjYWxsZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBOb3RlOiBleGlzdGluZyBkYXRhIGluIGRzdCB3aWxsIGJlIGdvbmUuIENhbGxlciBzdGlsbCBvd25zIHRoZSBtZW1vcnkgb2Ygc3JjCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNyYywgSENhbWVyYU1ldGFkYXRhKiBkc3QpIHsKKyAgICBpZiAoc3JjID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzaXplX3Qgc2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShzcmMpOworICAgIGRzdC0+c2V0VG9FeHRlcm5hbCgodWludDhfdCAqKSBzcmMsIHNpemUpOworICAgIHJldHVybjsKK30KKworVGVtcGxhdGVJZCBjb252ZXJ0VG9IaWRsKEFDYW1lcmFEZXZpY2VfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkKSB7CisgICAgc3dpdGNoKHRlbXBsYXRlSWQpIHsKKyAgICAgICAgY2FzZSBURU1QTEFURV9TVElMTF9DQVBUVVJFOgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6OlNUSUxMX0NBUFRVUkU7CisgICAgICAgIGNhc2UgVEVNUExBVEVfUkVDT1JEOgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6OlJFQ09SRDsKKyAgICAgICAgY2FzZSBURU1QTEFURV9WSURFT19TTkFQU0hPVDoKKyAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZUlkOjpWSURFT19TTkFQU0hPVDsKKyAgICAgICAgY2FzZSBURU1QTEFURV9aRVJPX1NIVVRURVJfTEFHOgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6OlpFUk9fU0hVVFRFUl9MQUc7CisgICAgICAgIGNhc2UgVEVNUExBVEVfTUFOVUFMOgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6Ok1BTlVBTDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZUlkOjpQUkVWSUVXOworICAgIH0KK30KKworY2FtZXJhX3N0YXR1c190IGNvbnZlcnRGcm9tSGlkbChTdGF0dXMgc3RhdHVzKSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IEFDQU1FUkFfT0s7CisgICAgc3dpdGNoKHN0YXR1cykgeworICAgICAgICBjYXNlIFN0YXR1czo6Tk9fRVJST1I6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkRJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6Q0FNRVJBX0lOX1VTRToKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfQ0FNRVJBX0lOX1VTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6TUFYX0NBTUVSQVNfSU5fVVNFOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9NQVhfQ0FNRVJBX0lOX1VTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDoKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkRFUFJFQ0FURURfSEFMOgorICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCByZWFjaCBoZXJlIHNpbmNlIHdlIGZpbHRlcmVkIGxlZ2FjeSBIQUxzIGVhcmxpZXIKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkRJU0FCTEVEOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQUJMRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OlBFUk1JU1NJT05fREVOSUVEOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9QRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6SU5WQUxJRF9PUEVSQVRJT046CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgxLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMikgeworICAgIGlmIChuaDEtPm51bUZkcyAhPTAgfHwgbmgyLT5udW1GZHMgIT0wKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHdpbmRvdyBuYXRpdmUgaGFuZGxlcyBiZWluZyBjb21wYXJlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChuaDEtPnZlcnNpb24gIT0gbmgyLT52ZXJzaW9uIHx8IG5oMS0+bnVtRmRzICE9IG5oMi0+bnVtRmRzIHx8CisgICAgICAgIG5oMS0+bnVtSW50cyAhPSBuaDItPm51bUludHMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5oMS0+bnVtSW50czsgaSsrKSB7CisgICAgICAgIGlmKG5oMS0+ZGF0YVtpXSAhPSBuaDItPmRhdGFbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgxLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMikgeworICAgIGlmIChpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKG5oMSwgbmgyKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChuaDEtPm51bUludHMgIT0gbmgyLT5udW1JbnRzKSB7CisgICAgICAgIHJldHVybiBuaDEtPm51bUludHMgPCBuaDItPm51bUludHM7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuaDEtPm51bUludHM7IGkrKykgeworICAgICAgICBpZiAobmgxLT5kYXRhW2ldICE9IG5oMi0+ZGF0YVtpXSkgeworICAgICAgICAgICAgcmV0dXJuIG5oMS0+ZGF0YVtpXSA8IG5oMi0+ZGF0YVtpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgaXNXaW5kb3dOYXRpdmVIYW5kbGVHcmVhdGVyVGhhbihjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMSwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDIpIHsKKyAgICByZXR1cm4gIWlzV2luZG93TmF0aXZlSGFuZGxlTGVzc1RoYW4obmgxLCBuaDIpICYmICFpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKG5oMSwgbmgyKTsKK30KKworYm9vbCBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzRXF1YWwoaGlkbF92ZWM8aGlkbF9oYW5kbGU+IGhhbmRsZXMxLCBoaWRsX3ZlYzxoaWRsX2hhbmRsZT4gaGFuZGxlczIpIHsKKyAgICBpZiAoaGFuZGxlczEuc2l6ZSgpICE9IGhhbmRsZXMyLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFuZGxlczEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKCFpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGhhbmRsZXMxW2ldLCBoYW5kbGVzMltpXSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzTGVzc1RoYW4oaGlkbF92ZWM8aGlkbF9oYW5kbGU+IGhhbmRsZXMxLCBoaWRsX3ZlYzxoaWRsX2hhbmRsZT5oYW5kbGVzMikgeworICAgIGlmIChoYW5kbGVzMS5zaXplKCkgIT0gaGFuZGxlczIuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBoYW5kbGVzMS5zaXplKCkgPCBoYW5kbGVzMi5zaXplKCk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFuZGxlczEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUxID0gaGFuZGxlczFbaV0uZ2V0TmF0aXZlSGFuZGxlKCk7CisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlMiA9IGhhbmRsZXMyW2ldLmdldE5hdGl2ZUhhbmRsZSgpOworICAgICAgICBpZiAoIWlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwoaGFuZGxlMSwgaGFuZGxlMikpIHsKKyAgICAgICAgICAgIHJldHVybiBpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuKGhhbmRsZTEsIGhhbmRsZTIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworfSAvLyBuYW1lc3BhY2UgdXRpbHMKK30gLy8gbmFtZXNwYWNlIGFjYW0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMTAwNmQKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5oCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmg+CisjaW5jbHVkZSA8Q2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEzLmg+CisKKyNpZm5kZWYgQ0FNRVJBX05ES19WRU5ET1JfSAorI2RlZmluZSBDQU1FUkFfTkRLX1ZFTkRPUl9ICisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgQ2FtZXJhTWV0YWRhdGEgPSBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OmhlbHBlcjo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBIQ2FtZXJhTWV0YWRhdGEgID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlN0YXR1czsKK3VzaW5nIFRlbXBsYXRlSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlRlbXBsYXRlSWQ7Cit1c2luZyBQaHlzaWNhbENhbWVyYVNldHRpbmdzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhbWVyYVNldHRpbmdzOwordXNpbmcgSFJvdGF0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpPdXRwdXRDb25maWd1cmF0aW9uOjpSb3RhdGlvbjsKK3VzaW5nIE91dHB1dENvbmZpZ3VyYXRpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6Ok91dHB1dENvbmZpZ3VyYXRpb247CisKKy8vIFV0aWxpdHkgY2xhc3Mgc28gdGhhdCBDYXB0dXJlUmVxdWVzdCBjYW4gYmUgc3RvcmVkIGJ5IHNwPD4KK3N0cnVjdCBDYXB0dXJlUmVxdWVzdCA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVxdWVzdCBtQ2FwdHVyZVJlcXVlc3Q7CisgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCAqPiBtU3VyZmFjZUxpc3Q7CisgIC8vUGh5c2ljYWwgY2FtZXJhIHNldHRpbmdzIG1ldGFkYXRhIGlzIHN0b3JlZCBoZXJlLCBzaW5jZSB0aGUgY2FwdHVyZSByZXF1ZXN0CisgIC8vbWlnaHQgbm90IGNvbnRhaW4gaXQuIFRoYXQncyBzaW5jZSwgZm1xIG1pZ2h0IGhhdmUgY29uc3VtZWQgaXQuCisgIGhpZGxfdmVjPFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+IG1QaHlzaWNhbENhbWVyYVNldHRpbmdzOworfTsKKworYm9vbCBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzRXF1YWwoaGlkbF92ZWM8aGlkbF9oYW5kbGU+IGhhbmRsZXMxLCBoaWRsX3ZlYzxoaWRsX2hhbmRsZT5oYW5kbGVzMik7CisKK2Jvb2wgYXJlV2luZG93TmF0aXZlSGFuZGxlc0xlc3NUaGFuKGhpZGxfdmVjPGhpZGxfaGFuZGxlPiBoYW5kbGVzMSwgaGlkbF92ZWM8aGlkbF9oYW5kbGU+aGFuZGxlczIpOworCitib29sIGlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDEsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgyKTsKKworYm9vbCBpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgxLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMik7CisKKy8vIENvbnZlbmllbmNlIHdyYXBwZXIgb3ZlciBpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuIGFuZCBpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsCitib29sIGlzV2luZG93TmF0aXZlSGFuZGxlR3JlYXRlclRoYW4oY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDEsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgyKTsKKworLy8gVXRpbGl0eSBjbGFzcyBzbyB0aGUgbmF0aXZlX2hhbmRsZV90IGNhbiBiZSBjb21wYXJlZCB3aXRoICBpdHMgY29udGVudHMgaW5zdGVhZAorLy8gb2YganVzdCByYXcgcG9pbnRlciBjb21wYXJpc29ucy4KK3N0cnVjdCBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIHsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKm1XaW5kb3cgPSBudWxscHRyOworCisgICAgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlcihuYXRpdmVfaGFuZGxlX3QgKm5oKSA6IG1XaW5kb3cobmgpIHsgfQorCisgICAgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlcigpID0gZGVmYXVsdDsKKworICAgIG9wZXJhdG9yIG5hdGl2ZV9oYW5kbGVfdCAqKCkgY29uc3QgeyByZXR1cm4gbVdpbmRvdzsgfQorCisgICAgYm9vbCBvcGVyYXRvciA9PShjb25zdCBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKG1XaW5kb3csIG90aGVyLm1XaW5kb3cpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXImIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChtV2luZG93LCBvdGhlci5tV2luZG93KTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXImIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuKG1XaW5kb3csIG90aGVyLm1XaW5kb3cpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFpc1dpbmRvd05hdGl2ZUhhbmRsZUdyZWF0ZXJUaGFuKG1XaW5kb3csIG90aGVyLm1XaW5kb3cpOworICAgIH0KKworfTsKKworLy8gV3JhcHBlciBhcm91bmQgT3V0cHV0Q29uZmlndXJhdGlvbi4gVGhpcyBpcyBuZWVkZWQgc2luY2UgSElETAorLy8gT3V0cHV0Q29uZmlndXJhdGlvbiBpcyBhdXRvLWdlbmVyYXRlZCBhbmQgbWFya2VkIGZpbmFsLiBUaGVyZWZvcmUsIG9wZXJhdG9yCisvLyBvdmVybG9hZHMgb3V0c2lkZSB0aGUgY2xhc3MsIHdpbGwgbm90IGdldCBwaWNrZWQgYnkgY2xhbmcgd2hpbGUgdHJ5aW5nIHRvCisvLyBzdG9yZSBPdXRwdXRDb25maWd1cmF0aW9uIGluIG1hcHMvc2V0cy4KK3N0cnVjdCBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlciB7CisgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBtT3V0cHV0Q29uZmlndXJhdGlvbjsKKworICAgIG9wZXJhdG9yIGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1PdXRwdXRDb25maWd1cmF0aW9uOworICAgIH0KKworICAgIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyKCkgPSBkZWZhdWx0OworCisgICAgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXIoT3V0cHV0Q29uZmlndXJhdGlvbiAmb3V0cHV0Q29uZmlndXJhdGlvbikKKyAgICAgICAgICAgIDogbU91dHB1dENvbmZpZ3VyYXRpb24oKG91dHB1dENvbmZpZ3VyYXRpb24pKSB7IH0KKworICAgIGJvb2wgb3BlcmF0b3IgPT0oY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmc2VsZiA9IG1PdXRwdXRDb25maWd1cmF0aW9uOworICAgICAgICByZXR1cm4gc2VsZi5yb3RhdGlvbiA9PSBvdGhlci5yb3RhdGlvbiAmJiBzZWxmLndpbmRvd0dyb3VwSWQgPT0gb3RoZXIud2luZG93R3JvdXBJZCAmJgorICAgICAgICAgICAgICAgIHNlbGYucGh5c2ljYWxDYW1lcmFJZCA9PSBvdGhlci5waHlzaWNhbENhbWVyYUlkICYmIHNlbGYud2lkdGggPT0gb3RoZXIud2lkdGggJiYKKyAgICAgICAgICAgICAgICBzZWxmLmhlaWdodCA9PSBvdGhlci5oZWlnaHQgJiYgc2VsZi5pc0RlZmVycmVkID09IG90aGVyLmlzRGVmZXJyZWQgJiYKKyAgICAgICAgICAgICAgICBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzRXF1YWwoc2VsZi53aW5kb3dIYW5kbGVzLCBvdGhlci53aW5kb3dIYW5kbGVzKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJnNlbGYgPSBtT3V0cHV0Q29uZmlndXJhdGlvbjsKKyAgICAgICAgaWYgKHNlbGYud2luZG93R3JvdXBJZCAhPSBvdGhlci53aW5kb3dHcm91cElkKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsZi53aW5kb3dHcm91cElkIDwgb3RoZXIud2luZG93R3JvdXBJZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxmLndpZHRoICE9IG90aGVyLndpZHRoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsZi53aWR0aCA8IG90aGVyLndpZHRoOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYuaGVpZ2h0ICE9IG90aGVyLmhlaWdodCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbGYuaGVpZ2h0IDwgb3RoZXIuaGVpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYucm90YXRpb24gIT0gb3RoZXIucm90YXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2VsZi5yb3RhdGlvbikgPCBzdGF0aWNfY2FzdDx1aW50MzJfdD4ob3RoZXIucm90YXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYuaXNEZWZlcnJlZCAhPSBvdGhlci5pc0RlZmVycmVkKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsZi5pc0RlZmVycmVkIDwgb3RoZXIuaXNEZWZlcnJlZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxmLnBoeXNpY2FsQ2FtZXJhSWQgIT0gb3RoZXIucGh5c2ljYWxDYW1lcmFJZCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbGYucGh5c2ljYWxDYW1lcmFJZCA8IG90aGVyLnBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFyZVdpbmRvd05hdGl2ZUhhbmRsZXNMZXNzVGhhbihzZWxmLndpbmRvd0hhbmRsZXMsIG90aGVyLndpbmRvd0hhbmRsZXMpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yID4gKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoKnRoaXMgIT0gb3RoZXIpICYmICEoKnRoaXMgPCBvdGhlcik7CisgICAgfQorfTsKKworLy8gQ29udmVydCBDYXB0dXJlUmVxdWVzdCB3cmFwcGFibGUgYnkgc3A8PiB0byBoaWRsIENhcHR1cmVSZXF1ZXN0LgorZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVxdWVzdCBjb252ZXJ0VG9IaWRsKAorICAgIGNvbnN0IENhcHR1cmVSZXF1ZXN0ICpjYXB0dXJlUmVxdWVzdCk7CisKK0hSb3RhdGlvbiBjb252ZXJ0VG9IaWRsKGludCByb3RhdGlvbik7CisKK2Jvb2wgY29udmVydEZyb21IaWRsQ2xvbmVkKGNvbnN0IEhDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEsIENhbWVyYU1ldGFkYXRhICpyYXdNZXRhZGF0YSk7CisKKy8vIE5vdGU6IGV4aXN0aW5nIGRhdGEgaW4gZHN0IHdpbGwgYmUgZ29uZS4gQ2FsbGVyIHN0aWxsIG93bnMgdGhlIG1lbW9yeSBvZiBzcmMKK3ZvaWQgY29udmVydFRvSGlkbChjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc3JjLCBIQ2FtZXJhTWV0YWRhdGEqIGRzdCk7CisKK1RlbXBsYXRlSWQgY29udmVydFRvSGlkbChBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCk7CisKK2NhbWVyYV9zdGF0dXNfdCBjb252ZXJ0RnJvbUhpZGwoU3RhdHVzIHN0YXR1cyk7CisKK30gLy8gbmFtZXNwYWNlIHV0aWxzCit9IC8vIG5hbWVzcGFjZSBhY2FtCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBDQU1FUkFfTkRLX1ZFTkRPUl9ICmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5ODkyMgotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci90ZXN0cy9BSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LmNwcApAQCAtMCwwICsxLDgwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQUltYWdlUmVhZGVyVmVuZG9yVGVzdCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYUVycm9yLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrSW1hZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtJbWFnZVJlYWRlci5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8VmVuZG9yVGFnRGVzY3JpcHRvci5oPgorCituYW1lc3BhY2UgeworCitzdGF0aWMgY29uc3RleHByIGludCBrRHVtbXlGZW5jZUZkID0gLTE7CitzdGF0aWMgY29uc3RleHByIGludCBrQ2FwdHVyZVdhaXRVcyA9IDEwMCAqIDEwMDA7CitzdGF0aWMgY29uc3RleHByIGludCBrQ2FwdHVyZVdhaXRSZXRyeSA9IDEwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga1Rlc3RJbWFnZVdpZHRoID0gNjQwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga1Rlc3RJbWFnZUhlaWdodCA9IDQ4MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtUZXN0SW1hZ2VGb3JtYXQgPSBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4OworCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OmhlbHBlcjo6VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOworCitjbGFzcyBDYW1lcmFIZWxwZXIgeworICAgcHVibGljOgorICAgIENhbWVyYUhlbHBlcihjb25zdCBjaGFyKiBpZCwgQUNhbWVyYU1hbmFnZXIgKm1hbmFnZXIpIDoKKyAgICAgICAgICAgIG1JbWdSZWFkZXJBbncobnVsbHB0ciksIG1DYW1lcmFJZChpZCksIG1DYW1lcmFNYW5hZ2VyKG1hbmFnZXIpIHt9CisgICAgfkNhbWVyYUhlbHBlcigpIHsgY2xvc2VDYW1lcmEoKTsgfQorCisgICAgc3RydWN0IFBoeXNpY2FsSW1nUmVhZGVySW5mbyB7CisgICAgICAgIGNvbnN0IGNoYXIqIHBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53OworICAgIH07CisgICAgaW50IGluaXRDYW1lcmEobmF0aXZlX2hhbmRsZV90KiBpbWdSZWFkZXJBbncsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbEltZ1JlYWRlckluZm8+JiBwaHlzaWNhbEltZ1JlYWRlcnMsCisgICAgICAgICAgICBib29sIHVzZVBoeXNpY2FsU2V0dGluZ3MpIHsKKyAgICAgICAgaWYgKGltZ1JlYWRlckFudyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGluaXRpYWxpemUgY2FtZXJhIGJlZm9yZSBpbWFnZSByZWFkZXIgZ2V0IGluaXRpYWxpemVkLiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChtSXNDYW1lcmFSZWFkeSkgeworICAgICAgICAgICAgQUxPR0UoImluaXRDYW1lcmEgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcmV0OworICAgICAgICBtSW1nUmVhZGVyQW53ID0gaW1nUmVhZGVyQW53OworCisgICAgICAgIHJldCA9IEFDYW1lcmFNYW5hZ2VyX29wZW5DYW1lcmEobUNhbWVyYU1hbmFnZXIsIG1DYW1lcmFJZCwgJm1EZXZpY2VDYiwgJm1EZXZpY2UpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBtRGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBjYW1lcmEsIHJldD0lZCwgbURldmljZT0lcC4iLCByZXQsIG1EZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGNhcHR1cmUgc2Vzc2lvbgorICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfY3JlYXRlKCZtT3V0cHV0cyk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2NyZWF0ZSBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldCA9IEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9jcmVhdGUobUltZ1JlYWRlckFudywgJm1JbWdSZWFkZXJPdXRwdXQpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkFDYXB0dXJlU2Vzc2lvbk91dHB1dF9jcmVhdGUgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkKG1PdXRwdXRzLCBtSW1nUmVhZGVyT3V0cHV0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gaWRQb2ludGVyTGlzdDsKKyAgICAgICAgZm9yIChhdXRvJiBwaHlzaWNhbFN0cmVhbSA6IHBoeXNpY2FsSW1nUmVhZGVycykgeworICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KiBzZXNzaW9uT3V0cHV0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHJldCA9IEFDYXB0dXJlU2Vzc2lvblBoeXNpY2FsT3V0cHV0X2NyZWF0ZShwaHlzaWNhbFN0cmVhbS5hbncsCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsU3RyZWFtLnBoeXNpY2FsQ2FtZXJhSWQsICZzZXNzaW9uT3V0cHV0KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVNlc3Npb25QaHlzaWNhbE91dHB1dF9jcmVhdGUgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkKG1PdXRwdXRzLCBzZXNzaW9uT3V0cHV0KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9hZGQgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRXh0cmFPdXRwdXRzLnB1c2hfYmFjayhzZXNzaW9uT3V0cHV0KTsKKyAgICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IGF0IG1vc3Qgb25lIHBoeXNpY2FsIHN0cmVhbSBwZXIgcGh5c2ljYWwgY2FtZXJhLgorICAgICAgICAgICAgbVBoeXNpY2FsQ2FtZXJhSWRzLnB1c2hfYmFjayhwaHlzaWNhbFN0cmVhbS5waHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgICAgIGlkUG9pbnRlckxpc3QucHVzaF9iYWNrKHBoeXNpY2FsU3RyZWFtLnBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICB9CisgICAgICAgIEFDYW1lcmFJZExpc3QgY2FtZXJhSWRMaXN0OworICAgICAgICBjYW1lcmFJZExpc3QubnVtQ2FtZXJhcyA9IGlkUG9pbnRlckxpc3Quc2l6ZSgpOworICAgICAgICBjYW1lcmFJZExpc3QuY2FtZXJhSWRzID0gaWRQb2ludGVyTGlzdC5kYXRhKCk7CisKKyAgICAgICAgcmV0ID0gQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbihtRGV2aWNlLCBtT3V0cHV0cywgJm1TZXNzaW9uQ2IsICZtU2Vzc2lvbik7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbiBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGNhcHR1cmUgcmVxdWVzdAorICAgICAgICBpZiAodXNlUGh5c2ljYWxTZXR0aW5ncykgeworICAgICAgICAgICAgcmV0ID0gQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHMobURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgVEVNUExBVEVfU1RJTExfQ0FQVFVSRSwgJmNhbWVyYUlkTGlzdCwgJm1TdGlsbFJlcXVlc3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdChtRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICBURU1QTEFURV9TVElMTF9DQVBUVVJFLCAmbVN0aWxsUmVxdWVzdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0IGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGUobUltZ1JlYWRlckFudywgJm1SZXFJbWdSZWFkZXJPdXRwdXQpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldChtU3RpbGxSZXF1ZXN0LCBtUmVxSW1nUmVhZGVyT3V0cHV0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVJlcXVlc3RfYWRkVGFyZ2V0IGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8mIHBoeXNpY2FsU3RyZWFtIDogcGh5c2ljYWxJbWdSZWFkZXJzKSB7CisgICAgICAgICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0KiBvdXRwdXRUYXJnZXQgPSBudWxscHRyOworICAgICAgICAgICAgcmV0ID0gQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGUocGh5c2ljYWxTdHJlYW0uYW53LCAmb3V0cHV0VGFyZ2V0KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldChtU3RpbGxSZXF1ZXN0LCBvdXRwdXRUYXJnZXQpOworICAgICAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZXFFeHRyYU91dHB1dHMucHVzaF9iYWNrKG91dHB1dFRhcmdldCk7CisgICAgICAgIH0KKworICAgICAgICBtSXNDYW1lcmFSZWFkeSA9IHRydWU7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworCisgICAgYm9vbCBpc0NhbWVyYVJlYWR5KCkgeyByZXR1cm4gbUlzQ2FtZXJhUmVhZHk7IH0KKworICAgIHZvaWQgY2xvc2VDYW1lcmEoKSB7CisgICAgICAgIC8vIERlc3Ryb3kgY2FwdHVyZSByZXF1ZXN0CisgICAgICAgIGlmIChtUmVxSW1nUmVhZGVyT3V0cHV0KSB7CisgICAgICAgICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2ZyZWUobVJlcUltZ1JlYWRlck91dHB1dCk7CisgICAgICAgICAgICBtUmVxSW1nUmVhZGVyT3V0cHV0ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8mIG91dHB1dFRhcmdldCA6IG1SZXFFeHRyYU91dHB1dHMpIHsKKyAgICAgICAgICAgIEFDYW1lcmFPdXRwdXRUYXJnZXRfZnJlZShvdXRwdXRUYXJnZXQpOworICAgICAgICB9CisgICAgICAgIG1SZXFFeHRyYU91dHB1dHMuY2xlYXIoKTsKKyAgICAgICAgaWYgKG1TdGlsbFJlcXVlc3QpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdF9mcmVlKG1TdGlsbFJlcXVlc3QpOworICAgICAgICAgICAgbVN0aWxsUmVxdWVzdCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgLy8gRGVzdHJveSBjYXB0dXJlIHNlc3Npb24KKyAgICAgICAgaWYgKG1TZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jbG9zZShtU2Vzc2lvbik7CisgICAgICAgICAgICBtU2Vzc2lvbiA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1JbWdSZWFkZXJPdXRwdXQpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlKG1JbWdSZWFkZXJPdXRwdXQpOworICAgICAgICAgICAgbUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvJiBleHRyYU91dHB1dCA6IG1FeHRyYU91dHB1dHMpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlKGV4dHJhT3V0cHV0KTsKKyAgICAgICAgfQorICAgICAgICBtRXh0cmFPdXRwdXRzLmNsZWFyKCk7CisgICAgICAgIGlmIChtT3V0cHV0cykgeworICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2ZyZWUobU91dHB1dHMpOworICAgICAgICAgICAgbU91dHB1dHMgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIC8vIERlc3Ryb3kgY2FtZXJhIGRldmljZQorICAgICAgICBpZiAobURldmljZSkgeworICAgICAgICAgICAgQUNhbWVyYURldmljZV9jbG9zZShtRGV2aWNlKTsKKyAgICAgICAgICAgIG1EZXZpY2UgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIG1Jc0NhbWVyYVJlYWR5ID0gZmFsc2U7CisgICAgfQorCisgICAgaW50IHRha2VQaWN0dXJlKCkgeworICAgICAgICBpbnQgc2VxSWQ7CisgICAgICAgIHJldHVybiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZShtU2Vzc2lvbiwgJm1DYXB0dXJlQ2FsbGJhY2tzLCAxLCAmbVN0aWxsUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXFJZCk7CisgICAgfQorCisgICAgaW50IHRha2VMb2dpY2FsQ2FtZXJhUGljdHVyZSgpIHsKKyAgICAgICAgaW50IHNlcUlkOworICAgICAgICByZXR1cm4gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZShtU2Vzc2lvbiwgJm1Mb2dpY2FsQ2FwdHVyZUNhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAxLCAmbVN0aWxsUmVxdWVzdCwgJnNlcUlkKTsKKyAgICB9CisKKyAgICBib29sIGNoZWNrQ2FsbGJhY2tzKGludCBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgaWYgKG1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCAhPSBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb21wbGV0ZWQgY2FwdHVyZSBjYWxsYWJhY2sgY291bnQgbm90IGFzIGV4cGVjdGVkLiBleHBlY3RlZCAlZCBhY3R1YWwgJWQiLAorICAgICAgICAgICAgICAgICAgcGljdHVyZUNvdW50LCBtQ29tcGxldGVkQ2FwdHVyZUNhbGxiYWNrQ291bnQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIG9uRGV2aWNlRGlzY29ubmVjdGVkKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFEZXZpY2UqIC8qZGV2aWNlKi8pIHt9CisKKyAgICBzdGF0aWMgdm9pZCBvbkRldmljZUVycm9yKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFEZXZpY2UqIC8qZGV2aWNlKi8sIGludCAvKmVycm9yQ29kZSovKSB7fQorCisgICAgc3RhdGljIHZvaWQgb25TZXNzaW9uQ2xvc2VkKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogLypzZXNzaW9uKi8pIHt9CisKKyAgICBzdGF0aWMgdm9pZCBvblNlc3Npb25SZWFkeSh2b2lkKiAvKm9iaiovLCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIC8qc2Vzc2lvbiovKSB7fQorCisgICAgc3RhdGljIHZvaWQgb25TZXNzaW9uQWN0aXZlKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogLypzZXNzaW9uKi8pIHt9CisKKyAgIHByaXZhdGU6CisgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyBtRGV2aWNlQ2J7dGhpcywgb25EZXZpY2VEaXNjb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25EZXZpY2VFcnJvcn07CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzIG1TZXNzaW9uQ2J7CisgICAgICAgIHRoaXMsIG9uU2Vzc2lvbkNsb3NlZCwgb25TZXNzaW9uUmVhZHksIG9uU2Vzc2lvbkFjdGl2ZX07CisKKyAgICBuYXRpdmVfaGFuZGxlX3QqIG1JbWdSZWFkZXJBbncgPSBudWxscHRyOyAgLy8gbm90IG93bmVkIGJ5IHVzLgorCisgICAgLy8gQ2FtZXJhIGRldmljZQorICAgIEFDYW1lcmFEZXZpY2UqIG1EZXZpY2UgPSBudWxscHRyOworICAgIC8vIENhcHR1cmUgc2Vzc2lvbgorICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogbU91dHB1dHMgPSBudWxscHRyOworICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCogbUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisgICAgc3RkOjp2ZWN0b3I8QUNhcHR1cmVTZXNzaW9uT3V0cHV0Kj4gbUV4dHJhT3V0cHV0czsKKworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogbVNlc3Npb24gPSBudWxscHRyOworICAgIC8vIENhcHR1cmUgcmVxdWVzdAorICAgIEFDYXB0dXJlUmVxdWVzdCogbVN0aWxsUmVxdWVzdCA9IG51bGxwdHI7CisgICAgQUNhbWVyYU91dHB1dFRhcmdldCogbVJlcUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisgICAgc3RkOjp2ZWN0b3I8QUNhbWVyYU91dHB1dFRhcmdldCo+IG1SZXFFeHRyYU91dHB1dHM7CisKKyAgICBib29sIG1Jc0NhbWVyYVJlYWR5ID0gZmFsc2U7CisgICAgY29uc3QgY2hhciogbUNhbWVyYUlkOworICAgIEFDYW1lcmFNYW5hZ2VyKiBtQ2FtZXJhTWFuYWdlcjsKKyAgICBpbnQgbUNvbXBsZXRlZENhcHR1cmVDYWxsYmFja0NvdW50ID0gMDsKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyBtQ2FwdHVyZUNhbGxiYWNrcyA9IHsKKyAgICAgICAgLy8gVE9ETzogQWRkIHRlc3RzIGZvciBvdGhlciBjYWxsYmFja3MKKyAgICAgICAgdGhpcywgLy8gY29udGV4dAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTdGFydGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVByb2dyZXNzZWQKKyAgICAgICAgW10odm9pZCogY3R4ICwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uICosIEFDYXB0dXJlUmVxdWVzdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUNhbWVyYU1ldGFkYXRhICopIHsKKyAgICAgICAgICAgIENhbWVyYUhlbHBlciAqY2ggPSBzdGF0aWNfY2FzdDxDYW1lcmFIZWxwZXIgKj4oY3R4KTsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGNoLT5tTXV0ZXgpOworICAgICAgICAgICAgY2gtPm1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCsrOworICAgICAgICB9LAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVGYWlsZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKKyAgICB9OworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1QaHlzaWNhbENhbWVyYUlkczsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzIG1Mb2dpY2FsQ2FwdHVyZUNhbGxiYWNrcyA9IHsKKyAgICAgICAgLy8gVE9ETzogQWRkIHRlc3RzIGZvciBvdGhlciBjYWxsYmFja3MKKyAgICAgICAgdGhpcywgLy8gY29udGV4dAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTdGFydGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVByb2dyZXNzZWQKKyAgICAgICAgW10odm9pZCogY3R4ICwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uICosIEFDYXB0dXJlUmVxdWVzdCAqLAorICAgICAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSAqLCBzaXplX3QgcGh5c2ljYWxSZXN1bHRDb3VudCwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogcGh5c2ljYWxDYW1lcmFJZHMsIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSoqIHBoeXNpY2FsUmVzdWx0cykgeworICAgICAgICAgICAgQ2FtZXJhSGVscGVyICpjaCA9IHN0YXRpY19jYXN0PENhbWVyYUhlbHBlciAqPihjdHgpOworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soY2gtPm1NdXRleCk7CisgICAgICAgICAgICBBU1NFUlRfRVEocGh5c2ljYWxSZXN1bHRDb3VudCwgY2gtPm1QaHlzaWNhbENhbWVyYUlkcy5zaXplKCkpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdENvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShwaHlzaWNhbENhbWVyYUlkc1tpXSAhPSBudWxscHRyKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShwaHlzaWNhbFJlc3VsdHNbaV0gIT0gbnVsbHB0cik7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKHN0ZDo6ZmluZChjaC0+bVBoeXNpY2FsQ2FtZXJhSWRzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICBjaC0+bVBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpLCBwaHlzaWNhbENhbWVyYUlkc1tpXSksCisgICAgICAgICAgICAgICAgICAgICAgICBjaC0+bVBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpKTsKKworICAgICAgICAgICAgICAgIC8vIFZlcmlmeSBmcmFtZU51bWJlciBhbmQgc2Vuc29yVGltZXN0YW1wIGV4aXN0IGluIHBoeXNpY2FsCisgICAgICAgICAgICAgICAgLy8gcmVzdWx0IG1ldGFkYXRhCisgICAgICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2NvbnN0X2VudHJ5IGVudHJ5OworICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9nZXRDb25zdEVudHJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxSZXN1bHRzW2ldLCBBQ0FNRVJBX1NZTkNfRlJBTUVfTlVNQkVSLCAmZW50cnkpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShlbnRyeS5jb3VudCwgMSk7CisgICAgICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2dldENvbnN0RW50cnkoCisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbFJlc3VsdHNbaV0sIEFDQU1FUkFfU0VOU09SX1RJTUVTVEFNUCwgJmVudHJ5KTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoZW50cnkuY291bnQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2gtPm1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCsrOworICAgICAgICB9LAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVGYWlsZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKKyAgICB9OworfTsKKworY2xhc3MgSW1hZ2VSZWFkZXJUZXN0Q2FzZSB7CisgICBwdWJsaWM6CisgICAgSW1hZ2VSZWFkZXJUZXN0Q2FzZShpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhJbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFzeW5jKQorICAgICAgICA6IG1XaWR0aCh3aWR0aCksCisgICAgICAgICAgbUhlaWdodChoZWlnaHQpLAorICAgICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgICAgICBtVXNhZ2UodXNhZ2UpLAorICAgICAgICAgIG1NYXhJbWFnZXMobWF4SW1hZ2VzKSwKKyAgICAgICAgICBtQXN5bmMoYXN5bmMpIHt9CisKKyAgICB+SW1hZ2VSZWFkZXJUZXN0Q2FzZSgpIHsKKyAgICAgICAgaWYgKG1JbWdSZWFkZXJBbncpIHsKKyAgICAgICAgICAgIEFJbWFnZVJlYWRlcl9kZWxldGUobUltZ1JlYWRlcik7CisgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGNhbGwgbmF0aXZlX2hhbmRsZV90X3JlbGVhc2Ugb24gaW1hZ2VSZWFkZXJBbncKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBpbml0SW1hZ2VSZWFkZXIoKSB7CisgICAgICAgIGlmIChtSW1nUmVhZGVyICE9IG51bGxwdHIgfHwgbUltZ1JlYWRlckFudyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHJlLWluaXRhbGl6ZSBpbWFnZSByZWFkZXIsIG1JbWdSZWFkZXI9JXAsIG1JbWdSZWFkZXJBbnc9JXAiLCBtSW1nUmVhZGVyLAorICAgICAgICAgICAgICAgICAgbUltZ1JlYWRlckFudyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSBBSW1hZ2VSZWFkZXJfbmV3V2l0aFVzYWdlKAorICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwgbUZvcm1hdCwgbVVzYWdlLCBtTWF4SW1hZ2VzLCAmbUltZ1JlYWRlcik7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IG1JbWdSZWFkZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgbmV3IEFJbWFnZVJlYWRlciwgcmV0PSVkLCBtSW1nUmVhZGVyPSVwIiwgcmV0LCBtSW1nUmVhZGVyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IEFJbWFnZVJlYWRlcl9zZXRJbWFnZUxpc3RlbmVyKG1JbWdSZWFkZXIsICZtUmVhZGVyQXZhaWxhYmxlQ2IpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgaW1hZ2UgYXZhaWxhYmxlIGxpc3RlbmVyLCByZXQ9JWQuIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfc2V0QnVmZmVyUmVtb3ZlZExpc3RlbmVyKG1JbWdSZWFkZXIsICZtUmVhZGVyRGV0YWNoZWRDYik7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBidWZmZXIgZGV0YWNoaW5nIGxpc3RlbmVyLCByZXQ9JWQuIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93TmF0aXZlSGFuZGxlKG1JbWdSZWFkZXIsICZtSW1nUmVhZGVyQW53KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgbUltZ1JlYWRlckFudyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBuYXRpdmVfaGFuZGxlX3QgZnJvbSBBSW1hZ2VSZWFkZXIsIHJldD0lZCwgbUltZ1JlYWRlckFudz0lcC4iLCByZXQsCisgICAgICAgICAgICAgICAgICBtSW1nUmVhZGVyQW53KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG5hdGl2ZV9oYW5kbGVfdCogZ2V0TmF0aXZlV2luZG93KCkgeyByZXR1cm4gbUltZ1JlYWRlckFudzsgfQorCisgICAgaW50IGdldEFjcXVpcmVkSW1hZ2VDb3VudCgpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgcmV0dXJuIG1BY3F1aXJlZEltYWdlQ291bnQ7CisgICAgfQorCisgICAgdm9pZCBIYW5kbGVJbWFnZUF2YWlsYWJsZShBSW1hZ2VSZWFkZXIqIHJlYWRlcikgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgICAgIEFJbWFnZSogb3V0SW1hZ2UgPSBudWxscHRyOworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQ7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIEFJbWFnZSB3aWxsIGJlIGRlbGV0ZWQgYXV0b21hdGljYWxseSB3aGVuIGl0IGdvZXMgb3V0IG9mCisgICAgICAgIC8vIHNjb3BlLgorICAgICAgICBhdXRvIGltYWdlRGVsZXRlciA9IFt0aGlzXShBSW1hZ2UqIGltZykgeworICAgICAgICAgICAgaWYgKG1Bc3luYykgeworICAgICAgICAgICAgICAgIEFJbWFnZV9kZWxldGVBc3luYyhpbWcsIGtEdW1teUZlbmNlRmQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBSW1hZ2VfZGVsZXRlKGltZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBSW1hZ2UsIGRlY2x0eXBlKGltYWdlRGVsZXRlcik+IGltZyhudWxscHRyLCBpbWFnZURlbGV0ZXIpOworCisgICAgICAgIGlmIChtQXN5bmMpIHsKKyAgICAgICAgICAgIGludCBvdXRGZW5jZUZkID0gMDsKKyAgICAgICAgICAgIC8vIFZlcml0eSB0aGF0IG91dEZlbmNlRmQncyB2YWx1ZSB3aWxsIGJlIGNoYW5nZWQgYnkKKyAgICAgICAgICAgIC8vIEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlQXN5bmMuCisgICAgICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZUFzeW5jKHJlYWRlciwgJm91dEltYWdlLCAmb3V0RmVuY2VGZCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBvdXRJbWFnZSA9PSBudWxscHRyIHx8IG91dEZlbmNlRmQgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWNxdWlyZSBpbWFnZSwgcmV0PSVkLCBvdXRJYW1nZT0lcCwgb3V0RmVuY2VGZD0lZC4iLCByZXQsIG91dEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgIG91dEZlbmNlRmQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGltZy5yZXNldChvdXRJbWFnZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZShyZWFkZXIsICZvdXRJbWFnZSk7CisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBvdXRJbWFnZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhY3F1aXJlIGltYWdlLCByZXQ9JWQsIG91dElhbWdlPSVwLiIsIHJldCwgb3V0SW1hZ2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGltZy5yZXNldChvdXRJbWFnZSk7CisgICAgICAgIH0KKworICAgICAgICBBSGFyZHdhcmVCdWZmZXIqIG91dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHJldCA9IEFJbWFnZV9nZXRIYXJkd2FyZUJ1ZmZlcihpbWcuZ2V0KCksICZvdXRCdWZmZXIpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBvdXRCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxkIHRvIGdldCBoYXJkd2FyZSBidWZmZXIsIHJldD0lZCwgb3V0QnVmZmVyPSVwLiIsIHJldCwgb3V0QnVmZmVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vIG5lZWQgdG8gcmVsZWFzZSBBSGFyZHdhcmVCdWZmZXIsIHNpbmNlIHdlIGRvbid0IGFjcXVpcmUgYWRkaXRpb25hbAorICAgICAgICAvLyByZWZlcmVuY2UgdG8gaXQuCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIG91dERlc2M7CisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9kZXNjcmliZShvdXRCdWZmZXIsICZvdXREZXNjKTsKKyAgICAgICAgaW50MzJfdCBpbWFnZVdpZHRoID0gMDsKKyAgICAgICAgaW50MzJfdCBpbWFnZUhlaWdodCA9IDA7CisgICAgICAgIGludDMyX3QgYnVmZmVyV2lkdGggPSBzdGF0aWNfY2FzdDxpbnQzMl90PihvdXREZXNjLndpZHRoKTsKKyAgICAgICAgaW50MzJfdCBidWZmZXJIZWlnaHQgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihvdXREZXNjLmhlaWdodCk7CisKKyAgICAgICAgQUltYWdlX2dldFdpZHRoKG91dEltYWdlLCAmaW1hZ2VXaWR0aCk7CisgICAgICAgIEFJbWFnZV9nZXRIZWlnaHQob3V0SW1hZ2UsICZpbWFnZUhlaWdodCk7CisgICAgICAgIGlmIChpbWFnZVdpZHRoICE9IG1XaWR0aCB8fCBpbWFnZUhlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgICAgICAgICBBTE9HRSgiTWlzbWF0Y2hlZCBvdXRwdXQgaW1hZ2UgZGltZW5zaW9uOiBleHBlY3RlZD0lZHglZCwgYWN0dWFsPSVkeCVkIiwgbVdpZHRoLAorICAgICAgICAgICAgICAgICAgbUhlaWdodCwgaW1hZ2VXaWR0aCwgaW1hZ2VIZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9SR0JBXzg4ODggfHwKKyAgICAgICAgICAgIG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9SR0JYXzg4ODggfHwKKyAgICAgICAgICAgIG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9SR0JfODg4IHx8CisgICAgICAgICAgICBtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfUkdCXzU2NSB8fAorICAgICAgICAgICAgbUZvcm1hdCA9PSBBSU1BR0VfRk9STUFUX1JHQkFfRlAxNiB8fAorICAgICAgICAgICAgbUZvcm1hdCA9PSBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4IHx8CisgICAgICAgICAgICBtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfWTgpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIG91dHB1dCBidWZmZXIgZGltZW5zaW9uIGZvciBjZXJ0YWluIGZvcm1hdHMuIERvbid0IGRvIHRoaXMgZm9yIGJsb2IgYmFzZWQKKyAgICAgICAgICAgIC8vIGZvcm1hdHMuCisgICAgICAgICAgICBpZiAoYnVmZmVyV2lkdGggIT0gbVdpZHRoIHx8IGJ1ZmZlckhlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk1pc21hdGNoZWQgb3V0cHV0IGJ1ZmZlciBkaW1lbnNpb246IGV4cGVjdGVkPSVkeCVkLCBhY3R1YWw9JWR4JWQiLCBtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgbUhlaWdodCwgYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChvdXREZXNjLnVzYWdlICYgbVVzYWdlKSAhPSBtVXNhZ2UpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNaXNtYXRjaGVkIG91dHB1dCBidWZmZXIgdXNhZ2U6IGFjdHVhbCAoJSIgUFJJdTY0ICIpLCBleHBlY3RlZCAoJSIgUFJJdTY0ICIpIiwKKyAgICAgICAgICAgICAgICAgIG91dERlc2MudXNhZ2UsIG1Vc2FnZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90KiBkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgaW50IGRhdGFMZW5ndGggPSAwOworICAgICAgICByZXQgPSBBSW1hZ2VfZ2V0UGxhbmVEYXRhKGltZy5nZXQoKSwgMCwgJmRhdGEsICZkYXRhTGVuZ3RoKTsKKyAgICAgICAgaWYgKG1Vc2FnZSAmIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTikgeworICAgICAgICAgICAgLy8gV2hlbiB3ZSBoYXZlIENQVV9SRUFEX09GVEVOIHVzYWdlIGJpdHMsIHdlIGNhbiBsb2NrIHRoZSBpbWFnZS4KKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IGRhdGEgPT0gbnVsbHB0ciB8fCBkYXRhTGVuZ3RoIDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWNjZXNzIENQVSBkYXRhLCByZXQ9JWQsIGRhdGE9JXAsIGRhdGFMZW5ndGg9JWQiLCByZXQsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgZGF0YUxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfSU1HUkVBREVSX0NBTk5PVF9MT0NLX0lNQUdFIHx8IGRhdGEgIT0gbnVsbHB0ciB8fCBkYXRhTGVuZ3RoICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiU2hvdWxkbid0IGJlIGFibGUgdG8gYWNjZXNzIENQVSBkYXRhLCByZXQ9JWQsIGRhdGE9JXAsIGRhdGFMZW5ndGg9JWQiLCByZXQsCisgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgZGF0YUxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE9ubHkgaW5jcmVhc2UgbUFjcXVpcmVkSW1hZ2VDb3VudCBpZiBhbGwgY2hlY2tzIHBhc3MuCisgICAgICAgIG1BY3F1aXJlZEltYWdlQ291bnQrKzsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBvbkltYWdlQXZhaWxhYmxlKHZvaWQqIG9iaiwgQUltYWdlUmVhZGVyKiByZWFkZXIpIHsKKyAgICAgICAgSW1hZ2VSZWFkZXJUZXN0Q2FzZSogdGhpeiA9IHJlaW50ZXJwcmV0X2Nhc3Q8SW1hZ2VSZWFkZXJUZXN0Q2FzZSo+KG9iaik7CisgICAgICAgIHRoaXotPkhhbmRsZUltYWdlQXZhaWxhYmxlKHJlYWRlcik7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQKKyAgICBvbkJ1ZmZlclJlbW92ZWQodm9pZCogLypvYmoqLywgQUltYWdlUmVhZGVyKiAvKnJlYWRlciovLCBBSGFyZHdhcmVCdWZmZXIqIC8qYnVmZmVyKi8pIHsKKyAgICAgICAgLy8gTm8tb3AsIGp1c3QgdG8gY2hlY2sgdGhlIGxpc3RlbmVyIGNhbiBiZSBzZXQgcHJvcGVybHkuCisgICAgfQorCisgICBwcml2YXRlOgorICAgIGludDMyX3QgbVdpZHRoOworICAgIGludDMyX3QgbUhlaWdodDsKKyAgICBpbnQzMl90IG1Gb3JtYXQ7CisgICAgdWludDY0X3QgbVVzYWdlOworICAgIGludDMyX3QgbU1heEltYWdlczsKKyAgICBib29sIG1Bc3luYzsKKworICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIGludCBtQWNxdWlyZWRJbWFnZUNvdW50ezB9OworCisgICAgQUltYWdlUmVhZGVyKiBtSW1nUmVhZGVyID0gbnVsbHB0cjsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIG1JbWdSZWFkZXJBbncgPSBudWxscHRyOworCisgICAgQUltYWdlUmVhZGVyX0ltYWdlTGlzdGVuZXIgbVJlYWRlckF2YWlsYWJsZUNie3RoaXMsIG9uSW1hZ2VBdmFpbGFibGV9OworICAgIEFJbWFnZVJlYWRlcl9CdWZmZXJSZW1vdmVkTGlzdGVuZXIgbVJlYWRlckRldGFjaGVkQ2J7dGhpcywgb25CdWZmZXJSZW1vdmVkfTsKK307CisKKworY2xhc3MgQUltYWdlUmVhZGVyVmVuZG9yVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICBwdWJsaWM6CisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbWVyYU1hbmFnZXIgPSBBQ2FtZXJhTWFuYWdlcl9jcmVhdGUoKTsKKyAgICAgICAgaWYgKG1DYW1lcmFNYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIEFDYW1lcmFNYW5hZ2VyLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUlkTGlzdChtQ2FtZXJhTWFuYWdlciwgJm1DYW1lcmFJZExpc3QpOworICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGNhbWVyYUlkTGlzdDogcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBBZGQgbW9yZSByaWdvcm91cyB0ZXN0cyBmb3IgdmVuZG9yIHRhZ3MKKyAgICAgICAgQVNTRVJUX05FKFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTo6Z2V0R2xvYmFsVmVuZG9yVGFnQ2FjaGUoKSwgbnVsbHB0cik7CisgICAgICAgIGlmIChtQ2FtZXJhSWRMaXN0LT5udW1DYW1lcmFzIDwgMSkgeworICAgICAgICAgICAgQUxPR1coIkRldmljZSBoYXMgbm8gY2FtZXJhIG9uIGJvYXJkLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIC8vIERlc3Ryb3kgY2FtZXJhIG1hbmFnZXIKKyAgICAgICAgaWYgKG1DYW1lcmFJZExpc3QpIHsKKyAgICAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX2RlbGV0ZUNhbWVyYUlkTGlzdChtQ2FtZXJhSWRMaXN0KTsKKyAgICAgICAgICAgIG1DYW1lcmFJZExpc3QgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGlmIChtQ2FtZXJhTWFuYWdlcikgeworICAgICAgICAgICAgQUNhbWVyYU1hbmFnZXJfZGVsZXRlKG1DYW1lcmFNYW5hZ2VyKTsKKyAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgdGFrZVBpY3R1cmVzKGNvbnN0IGNoYXIqIGlkLCB1aW50NjRfdCByZWFkZXJVc2FnZSwgaW50IHJlYWRlck1heEltYWdlcywKKyAgICAgICAgICAgIGJvb2wgcmVhZGVyQXN5bmMsIGludCBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgaW50IHJldCA9IDA7CisKKyAgICAgICAgSW1hZ2VSZWFkZXJUZXN0Q2FzZSB0ZXN0Q2FzZSgKKyAgICAgICAgICAgICAgICBrVGVzdEltYWdlV2lkdGgsIGtUZXN0SW1hZ2VIZWlnaHQsIGtUZXN0SW1hZ2VGb3JtYXQsIHJlYWRlclVzYWdlLCByZWFkZXJNYXhJbWFnZXMsCisgICAgICAgICAgICAgICAgcmVhZGVyQXN5bmMpOworICAgICAgICByZXQgPSB0ZXN0Q2FzZS5pbml0SW1hZ2VSZWFkZXIoKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBJbWFnZVJlYWRlciIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQ2FtZXJhSGVscGVyIGNhbWVyYUhlbHBlcihpZCwgbUNhbWVyYU1hbmFnZXIpOworICAgICAgICByZXQgPSBjYW1lcmFIZWxwZXIuaW5pdENhbWVyYSh0ZXN0Q2FzZS5nZXROYXRpdmVXaW5kb3coKSwKKyAgICAgICAgICAgICAgICB7fS8qcGh5c2ljYWxJbWFnZVJlYWRlcnMqLywgZmFsc2UvKnVzZVBoeXNpY2FsU2V0dGluZ3MqLyk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgY2FtZXJhIGhlbHBlciIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjYW1lcmFIZWxwZXIuaXNDYW1lcmFSZWFkeSgpKSB7CisgICAgICAgICAgICBBTE9HVygiQ2FtZXJhIGlzIG5vdCByZWFkeSBhZnRlciBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uLiBJdCdzIGVpdGhlciBkdWUgdG8gY2FtZXJhICIKKyAgICAgICAgICAgICAgICAgICJvbiBib2FyZCBsYWNrcyBCQUNLV0FSRFNfQ09NUEFUSUJMRSBjYXBhYmlsaXR5IG9yIHRoZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSAiCisgICAgICAgICAgICAgICAgICAiY2FtZXJhIG9uIGJvYXJkLiIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpY3R1cmVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICByZXQgPSBjYW1lcmFIZWxwZXIudGFrZVBpY3R1cmUoKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byB0YWtlIHBpY3R1cmUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTbGVlcCB1bnRpbCBhbGwgY2FwdHVyZSBmaW5pc2hlZAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtDYXB0dXJlV2FpdFJldHJ5ICogcGljdHVyZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHVzbGVlcChrQ2FwdHVyZVdhaXRVcyk7CisgICAgICAgICAgICBpZiAodGVzdENhc2UuZ2V0QWNxdWlyZWRJbWFnZUNvdW50KCkgPT0gcGljdHVyZUNvdW50KSB7CisgICAgICAgICAgICAgICAgQUxPR0koIlNlc3Npb24gdGFrZSB+JWQgbXMgdG8gY2FwdHVyZSAlZCBpbWFnZXMiLCBpICoga0NhcHR1cmVXYWl0VXMgLyAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmVDb3VudCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRlc3RDYXNlLmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpID09IHBpY3R1cmVDb3VudCAmJgorICAgICAgICAgICAgICAgIGNhbWVyYUhlbHBlci5jaGVja0NhbGxiYWNrcyhwaWN0dXJlQ291bnQpOworICAgIH0KKworICAgIGJvb2wgdGVzdFRha2VQaWN0dXJlc05hdGl2ZShjb25zdCBjaGFyKiBpZCkgeworICAgICAgICBmb3IgKGF1dG8mIHJlYWRlclVzYWdlIDoKKyAgICAgICAgICAgICB7QUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9SRUFEX09GVEVOfSkgeworICAgICAgICAgICAgZm9yIChhdXRvJiByZWFkZXJNYXhJbWFnZXMgOiB7MSwgNCwgOH0pIHsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIHJlYWRlckFzeW5jIDoge3RydWUsIGZhbHNlfSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIHBpY3R1cmVDb3VudCA6IHsxLCA0LCA4fSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWtlUGljdHVyZXMoaWQsIHJlYWRlclVzYWdlLCByZWFkZXJNYXhJbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlckFzeW5jLCBwaWN0dXJlQ291bnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlRlc3QgdGFrZVBpY3R1cmVzIGZhaWxlZCBmb3IgdGVzdCBjYXNlIHVzYWdlPSUiIFBSSXU2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIG1heEltYWdlcz0lZCwgYXN5bmM9JWQsIHBpY3R1cmVDb3VudD0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyVXNhZ2UsIHJlYWRlck1heEltYWdlcywgcmVhZGVyQXN5bmMsIHBpY3R1cmVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIENhbWVyYSBtYW5hZ2VyCisgICAgQUNhbWVyYU1hbmFnZXIqIG1DYW1lcmFNYW5hZ2VyID0gbnVsbHB0cjsKKyAgICBBQ2FtZXJhSWRMaXN0KiBtQ2FtZXJhSWRMaXN0ID0gbnVsbHB0cjsKKworICAgIGJvb2wgaXNDYXBhYmlsaXR5U3VwcG9ydGVkKEFDYW1lcmFNZXRhZGF0YSogc3RhdGljSW5mbywKKyAgICAgICAgICAgIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3JlcXVlc3RfYXZhaWxhYmxlX2NhcGFiaWxpdGllc190IGNhcCkgeworICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfY29uc3RfZW50cnkgZW50cnk7CisgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9nZXRDb25zdEVudHJ5KAorICAgICAgICAgICAgICAgIHN0YXRpY0luZm8sIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTLCAmZW50cnkpOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGVudHJ5LmRhdGEudThbaV0gPT0gY2FwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgaXNTaXplU3VwcG9ydGVkRm9yRm9ybWF0KEFDYW1lcmFNZXRhZGF0YSogc3RhdGljSW5mbywKKyAgICAgICAgICAgIGludDMyX3QgZm9ybWF0LCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfY29uc3RfZW50cnkgZW50cnk7CisgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9nZXRDb25zdEVudHJ5KHN0YXRpY0luZm8sCisgICAgICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUywgJmVudHJ5KTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpICs9IDQpIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS5kYXRhLmkzMltpXSA9PSBmb3JtYXQgJiYKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZGF0YS5pMzJbaSszXSA9PSBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCAmJgorICAgICAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLmkzMltpKzFdID09IHdpZHRoICYmCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTMyW2krMl0gPT0gaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZvaWQgZmluZENhbmRpZGF0ZUxvZ2ljYWxDYW1lcmEoY29uc3QgY2hhciAqKmNhbWVyYUlkLAorICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhKiogc3RhdGljTWV0YWRhdGEsCisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4qIGNhbmRpZGF0ZVBoeXNpY2FsSWRzKSB7CisgICAgICAgIC8vIEZpbmQgZmlyc3QgYXZhaWxhYmxlIGxvZ2ljYWwgY2FtZXJhCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNhbWVyYUlkTGlzdC0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgICAgICBjYW1lcmFfc3RhdHVzX3QgcmV0OworICAgICAgICAgICAgcmV0ID0gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhTWFuYWdlciwgbUNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzW2ldLCBzdGF0aWNNZXRhZGF0YSk7CisgICAgICAgICAgICBBU1NFUlRfRVEocmV0LCBBQ0FNRVJBX09LKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORSgqc3RhdGljTWV0YWRhdGEsIG51bGxwdHIpOworCisgICAgICAgICAgICBpZiAoIWlzQ2FwYWJpbGl0eVN1cHBvcnRlZCgqc3RhdGljTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0xPR0lDQUxfTVVMVElfQ0FNRVJBKSkgeworICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKCpzdGF0aWNNZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgKnN0YXRpY01ldGFkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hlY2sgcmV0dXJuZWQgcGh5c2ljYWwgY2FtZXJhIElkcyBhcmUgdmFsaWQKKyAgICAgICAgICAgIHNpemVfdCBwaHlzaWNhbENhbWVyYUlkQ250ID0gMDsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqY29uc3QqIHBoeXNpY2FsQ2FtZXJhSWRzID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGJvb2wgaXNMb2dpY2FsQ2FtZXJhID0gQUNhbWVyYU1ldGFkYXRhX2lzTG9naWNhbE11bHRpQ2FtZXJhKCpzdGF0aWNNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgJnBoeXNpY2FsQ2FtZXJhSWRDbnQsICZwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShpc0xvZ2ljYWxDYW1lcmEpOworICAgICAgICAgICAgQVNTRVJUX0dFKHBoeXNpY2FsQ2FtZXJhSWRDbnQsIDIpOworICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhKiBwaHlzaWNhbENhbWVyYU1ldGFkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNhbmRpZGF0ZVBoeXNpY2FsSWRzLT5jbGVhcigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwaHlzaWNhbENhbWVyYUlkQ250ICYmIGNhbmRpZGF0ZVBoeXNpY2FsSWRzLT5zaXplKCkgPCAyOyBqKyspIHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfR1Qoc3RybGVuKHBoeXNpY2FsQ2FtZXJhSWRzW2pdKSwgMCk7CisgICAgICAgICAgICAgICAgcmV0ID0gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIsIHBoeXNpY2FsQ2FtZXJhSWRzW2pdLCAmcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHJldCwgQUNBTUVSQV9PSyk7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEsIG51bGxwdHIpOworCisgICAgICAgICAgICAgICAgaWYgKGlzU2l6ZVN1cHBvcnRlZEZvckZvcm1hdChwaHlzaWNhbENhbWVyYU1ldGFkYXRhLCBrVGVzdEltYWdlRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAga1Rlc3RJbWFnZVdpZHRoLCBrVGVzdEltYWdlSGVpZ2h0KSkgeworICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVQaHlzaWNhbElkcy0+cHVzaF9iYWNrKHBoeXNpY2FsQ2FtZXJhSWRzW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWUocGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FuZGlkYXRlUGh5c2ljYWxJZHMtPnNpemUoKSA9PSAyKSB7CisgICAgICAgICAgICAgICAgKmNhbWVyYUlkID0gbUNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzW2ldOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWUoKnN0YXRpY01ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAqc3RhdGljTWV0YWRhdGEgPSBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICpjYW1lcmFJZCA9IG51bGxwdHI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RMb2dpY2FsQ2FtZXJhUGh5c2ljYWxTdHJlYW0oYm9vbCB1c2VQaHlzaWNhbFNldHRpbmdzKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkID0gbnVsbHB0cjsKKyAgICAgICAgQUNhbWVyYU1ldGFkYXRhKiBzdGF0aWNNZXRhZGF0YSA9IG51bGxwdHI7CisgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBwaHlzaWNhbENhbWVyYUlkczsKKworICAgICAgICBmaW5kQ2FuZGlkYXRlTG9naWNhbENhbWVyYSgmY2FtZXJhSWQsICZzdGF0aWNNZXRhZGF0YSwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICAgICAgaWYgKGNhbWVyYUlkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIENvdWxkbid0IGZpbmQgbG9naWNhbCBjYW1lcmEgdG8gdGVzdAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGVzdCBzdHJlYW1pbmcgdGhlIGxvZ2ljYWwgbXVsdGktY2FtZXJhCisgICAgICAgIHVpbnQ2NF90IHJlYWRlclVzYWdlID0gQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9SRUFEX09GVEVOOworICAgICAgICBpbnQzMl90IHJlYWRlck1heEltYWdlcyA9IDg7CisgICAgICAgIGJvb2wgcmVhZGVyQXN5bmMgPSBmYWxzZTsKKyAgICAgICAgY29uc3QgaW50IHBpY3R1cmVDb3VudCA9IDY7CisgICAgICAgIHN0ZDo6dmVjdG9yPEltYWdlUmVhZGVyVGVzdENhc2UqPiB0ZXN0Q2FzZXM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICBJbWFnZVJlYWRlclRlc3RDYXNlKiB0ZXN0Q2FzZSA9IG5ldyBJbWFnZVJlYWRlclRlc3RDYXNlKAorICAgICAgICAgICAgICAgICAgICBrVGVzdEltYWdlV2lkdGgsIGtUZXN0SW1hZ2VIZWlnaHQsIGtUZXN0SW1hZ2VGb3JtYXQsIHJlYWRlclVzYWdlLAorICAgICAgICAgICAgICAgICAgICByZWFkZXJNYXhJbWFnZXMsIHJlYWRlckFzeW5jKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSh0ZXN0Q2FzZS0+aW5pdEltYWdlUmVhZGVyKCksIDApOworICAgICAgICAgICAgdGVzdENhc2VzLnB1c2hfYmFjayh0ZXN0Q2FzZSk7CisgICAgICAgIH0KKworICAgICAgICBDYW1lcmFIZWxwZXIgY2FtZXJhSGVscGVyKGNhbWVyYUlkLCBtQ2FtZXJhTWFuYWdlcik7CisgICAgICAgIHN0ZDo6dmVjdG9yPENhbWVyYUhlbHBlcjo6UGh5c2ljYWxJbWdSZWFkZXJJbmZvPiBwaHlzaWNhbEltZ1JlYWRlckluZm87CisgICAgICAgIHBoeXNpY2FsSW1nUmVhZGVySW5mby5wdXNoX2JhY2soe3BoeXNpY2FsQ2FtZXJhSWRzWzBdLCB0ZXN0Q2FzZXNbMV0tPmdldE5hdGl2ZVdpbmRvdygpfSk7CisgICAgICAgIHBoeXNpY2FsSW1nUmVhZGVySW5mby5wdXNoX2JhY2soe3BoeXNpY2FsQ2FtZXJhSWRzWzFdLCB0ZXN0Q2FzZXNbMl0tPmdldE5hdGl2ZVdpbmRvdygpfSk7CisKKyAgICAgICAgaW50IHJldCA9IGNhbWVyYUhlbHBlci5pbml0Q2FtZXJhKHRlc3RDYXNlc1swXS0+Z2V0TmF0aXZlV2luZG93KCksCisgICAgICAgICAgICAgICAgcGh5c2ljYWxJbWdSZWFkZXJJbmZvLCB1c2VQaHlzaWNhbFNldHRpbmdzKTsKKyAgICAgICAgQVNTRVJUX0VRKHJldCwgMCk7CisKKyAgICAgICAgaWYgKCFjYW1lcmFIZWxwZXIuaXNDYW1lcmFSZWFkeSgpKSB7CisgICAgICAgICAgICBBTE9HVygiQ2FtZXJhIGlzIG5vdCByZWFkeSBhZnRlciBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uLiBJdCdzIGVpdGhlciBkdWUgdG8gY2FtZXJhICIKKyAgICAgICAgICAgICAgICAgICJvbiBib2FyZCBsYWNrcyBCQUNLV0FSRFNfQ09NUEFUSUJMRSBjYXBhYmlsaXR5IG9yIHRoZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSAiCisgICAgICAgICAgICAgICAgICAiY2FtZXJhIG9uIGJvYXJkLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaWN0dXJlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgcmV0ID0gY2FtZXJhSGVscGVyLnRha2VMb2dpY2FsQ2FtZXJhUGljdHVyZSgpOworICAgICAgICAgICAgQVNTRVJUX0VRKHJldCwgMCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTbGVlcCB1bnRpbCBhbGwgY2FwdHVyZSBmaW5pc2hlZAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtDYXB0dXJlV2FpdFJldHJ5ICogcGljdHVyZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHVzbGVlcChrQ2FwdHVyZVdhaXRVcyk7CisgICAgICAgICAgICBpZiAodGVzdENhc2VzWzBdLT5nZXRBY3F1aXJlZEltYWdlQ291bnQoKSA9PSBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiU2Vzc2lvbiB0YWtlIH4lZCBtcyB0byBjYXB0dXJlICVkIGltYWdlcyIsIGkgKiBrQ2FwdHVyZVdhaXRVcyAvIDEwMDAsCisgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZUNvdW50KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBU1NFUlRfRVEodGVzdENhc2VzWzBdLT5nZXRBY3F1aXJlZEltYWdlQ291bnQoKSwgcGljdHVyZUNvdW50KTsKKyAgICAgICAgQVNTRVJUX0VRKHRlc3RDYXNlc1sxXS0+Z2V0QWNxdWlyZWRJbWFnZUNvdW50KCksIHBpY3R1cmVDb3VudCk7CisgICAgICAgIEFTU0VSVF9FUSh0ZXN0Q2FzZXNbMl0tPmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpLCBwaWN0dXJlQ291bnQpOworICAgICAgICBBU1NFUlRfVFJVRShjYW1lcmFIZWxwZXIuY2hlY2tDYWxsYmFja3MocGljdHVyZUNvdW50KSk7CisKKyAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWUoc3RhdGljTWV0YWRhdGEpOworICAgIH0KK307CisKK1RFU1RfRihBSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LCBDcmVhdGVXaW5kb3dOYXRpdmVIYW5kbGUpIHsKKyAgICAvLyBXZSBhbHdheXMgdXNlIHRoZSBmaXJzdCBjYW1lcmEuCisgICAgY29uc3QgY2hhciogY2FtZXJhSWQgPSBtQ2FtZXJhSWRMaXN0LT5jYW1lcmFJZHNbMF07CisgICAgQVNTRVJUX1RSVUUoY2FtZXJhSWQgIT0gbnVsbHB0cik7CisKKyAgICBBQ2FtZXJhTWV0YWRhdGEqIHN0YXRpY01ldGFkYXRhID0gbnVsbHB0cjsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIsIGNhbWVyYUlkLCAmc3RhdGljTWV0YWRhdGEpOworICAgIEFTU0VSVF9FUShyZXQsIEFDQU1FUkFfT0spOworICAgIEFTU0VSVF9ORShzdGF0aWNNZXRhZGF0YSwgbnVsbHB0cik7CisKKyAgICBib29sIGlzQkMgPSBpc0NhcGFiaWxpdHlTdXBwb3J0ZWQoc3RhdGljTWV0YWRhdGEsCisgICAgICAgICAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19CQUNLV0FSRF9DT01QQVRJQkxFKTsKKworICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKHN0YXRpY01ldGFkYXRhKTsKKworICAgIGlmICghaXNCQykgeworICAgICAgICBBTE9HVygiQ2FtZXJhIGRvZXMgbm90IHN1cHBvcnQgQkFDS1dBUkRfQ09NUEFUSUJMRS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEVYUEVDVF9UUlVFKHRlc3RUYWtlUGljdHVyZXNOYXRpdmUoY2FtZXJhSWQpKTsKK30KKworVEVTVF9GKEFJbWFnZVJlYWRlclZlbmRvclRlc3QsIExvZ2ljYWxDYW1lcmFQaHlzaWNhbFN0cmVhbSkgeworICAgIHRlc3RMb2dpY2FsQ2FtZXJhUGh5c2ljYWxTdHJlYW0oZmFsc2UvKnVzZVBoeXNpY2FsU2V0dGluZ3MqLyk7CisgICAgdGVzdExvZ2ljYWxDYW1lcmFQaHlzaWNhbFN0cmVhbSh0cnVlLyp1c2VQaHlzaWNhbFNldHRpbmdzKi8pOworfQorCit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rIGIvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggNjU5NDg0Zi4uZTVjMTYzMSAxMDA2NDQKLS0tIGEvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTE5LDcgKzE5LDggQEAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKIAlWZW5kb3JUYWdEZXNjcmlwdG9yVGVzdHMuY3BwIFwKIAlDYW1lcmFCaW5kZXJUZXN0cy5jcHAgXAotCUNhbWVyYVpTTFRlc3RzLmNwcAorCUNhbWVyYVpTTFRlc3RzLmNwcCBcCisJQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbi5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGlibG9nIFwKZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCmluZGV4IDFkZTcwMTMuLjhmZTAyOWEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKKysrIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcApAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMy5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KIAogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgpAQCAtNDAsNiArNDEsNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9CbkNhbWVyYURldmljZUNhbGxiYWNrcy5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0Lmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvU3VibWl0SW5mby5oPgogCiAjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW1Db25zdW1lci5oPgpAQCAtNTUsNiArNTcsOCBAQAogI2luY2x1ZGUgPGFsZ29yaXRobT4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZURlZmF1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjsKIAogI2RlZmluZSBBU1NFUlRfTk9UX05VTEwoeCkgXAogICAgIEFTU0VSVF9UUlVFKCh4KSAhPSBudWxscHRyKQpAQCAtODYsNiArOTAsMTEgQEAKICAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgIH07CiAKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQoKSB7CisgICAgICAgIC8vIE5vIG9wCisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICB9CisKICAgICBib29sIHdhaXRGb3JOdW1DYW1lcmFzKHNpemVfdCBudW0pIGNvbnN0IHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCkBAIC00NzYsNyArNDg1LDggQEAKIAogICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlKG5ldyBTdXJmYWNlKGdiUHJvZHVjZXIsIC8qY29udHJvbGxlZEJ5QXBwKi9mYWxzZSkpOwogCi0gICAgICAgIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0cHV0KGdiUHJvZHVjZXIsIC8qcm90YXRpb24qLzApOworICAgICAgICBTdHJpbmcxNiBub1BoeXNpY2FsSWQ7CisgICAgICAgIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0cHV0KGdiUHJvZHVjZXIsIC8qcm90YXRpb24qLzAsIG5vUGh5c2ljYWxJZCk7CiAKICAgICAgICAgLy8gQ2FuIHdlIGNvbmZpZ3VyZT8KICAgICAgICAgcmVzID0gZGV2aWNlLT5iZWdpbkNvbmZpZ3VyZSgpOwpAQCAtNDkwLDYgKzUwMCwxOSBAQAogICAgICAgICBFWFBFQ1RfVFJVRShyZXMuaXNPaygpKSA8PCByZXM7CiAgICAgICAgIEVYUEVDVF9GQUxTRShjYWxsYmFja3MtPmhhZEVycm9yKCkpOwogCisgICAgICAgIC8vIFNlc3Npb24gY29uZmlndXJhdGlvbiBtdXN0IGFsc28gYmUgc3VwcG9ydGVkIGluIHRoaXMgY2FzZQorICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvbiBzZXNzaW9uQ29uZmlndXJhdGlvbiA9IHsgLyppbnB1dFdpZHRoKi8gMCwgLyppbnB1dEhlaWdodCovMCwKKyAgICAgICAgICAgICAgICAvKmlucHV0Rm9ybWF0Ki8gLTEsIENBTUVSQTNfU1RSRUFNX0NPTkZJR1VSQVRJT05fTk9STUFMX01PREV9OworICAgICAgICBzZXNzaW9uQ29uZmlndXJhdGlvbi5hZGRPdXRwdXRDb25maWd1cmF0aW9uKG91dHB1dCk7CisgICAgICAgIGJvb2wgcXVlcnlTdGF0dXM7CisgICAgICAgIHJlcyA9IGRldmljZS0+aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChzZXNzaW9uQ29uZmlndXJhdGlvbiwgJnF1ZXJ5U3RhdHVzKTsKKyAgICAgICAgRVhQRUNUX1RSVUUocmVzLmlzT2soKSB8fAorICAgICAgICAgICAgICAgIChyZXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkgPT0gSUNhbWVyYVNlcnZpY2VEZWZhdWx0OjpFUlJPUl9JTlZBTElEX09QRVJBVElPTikpCisgICAgICAgICAgICAgICAgPDwgcmVzOworICAgICAgICBpZiAocmVzLmlzT2soKSkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUocXVlcnlTdGF0dXMpOworICAgICAgICB9CisKICAgICAgICAgLy8gQ2FuIHdlIG1ha2UgcmVxdWVzdHM/CiAgICAgICAgIENhbWVyYU1ldGFkYXRhIHJlcXVlc3RUZW1wbGF0ZTsKICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdCgvKnByZXZpZXcgdGVtcGxhdGUqLzEsCmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbi5jcHAgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM1ZDJhMwotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS90ZXN0cy9DYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uLmNwcApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbiIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU7CisKK2NsYXNzIENhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24gOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3Byb3RlY3RlZDoKKworICAgIENhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24oKSA6IG51bUNhbWVyYXMoMCl7fQorICAgIC8vR3Rlc3QgaW50ZXJmYWNlCisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlOworICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZTsKKworICAgIGludDMyX3QgbnVtQ2FtZXJhczsKKyAgICBzcDxJQ2FtZXJhU2VydmljZT4gbUNhbWVyYVNlcnZpY2U7Cit9OworCit2b2lkIENhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb246OlNldFVwKCkgeworICAgIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgcmM7CisgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOworICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEuY2FtZXJhIikpOworICAgIG1DYW1lcmFTZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SUNhbWVyYVNlcnZpY2U+KGJpbmRlcik7CisgICAgcmMgPSBtQ2FtZXJhU2VydmljZS0+Z2V0TnVtYmVyT2ZDYW1lcmFzKAorICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpDQU1FUkFfVFlQRV9BTEwsICZudW1DYW1lcmFzKTsKKyAgICBFWFBFQ1RfVFJVRShyYy5pc09rKCkpOworfQorCit2b2lkIENhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb246OlRlYXJEb3duKCkgeworICAgIG1DYW1lcmFTZXJ2aWNlLmNsZWFyKCk7Cit9CisKKy8vIFJldm9raW5nIGFuZCBhY3F1aXJpbmcgcGVybWlzc2lvbnMgYXV0b21hdGljYWxseSBtaWdodCBub3QgYmUgcG9zc2libGUuCisvLyBUZXN0IHRoZSBmdW5jdGlvbmFsaXR5IGZvciByZW1vdmFsIG9mIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgbmVlZGluZworLy8gYSBjYW1lcmEgcGVybWlzc2lvbi4KK1RFU1RfRihDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uLCBUZXN0Q2FtZXJhUGVybWlzc2lvbikgeworICAgIGZvciAoaW50MzJfdCBjYW1lcmFJZCA9IDA7IGNhbWVyYUlkIDwgbnVtQ2FtZXJhczsgY2FtZXJhSWQrKykgeworCisgICAgICAgIFN0cmluZzE2IGNhbWVyYUlkU3RyID0gU3RyaW5nMTYoU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKSk7CisgICAgICAgIGJvb2wgaXNTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgYXV0byByYyA9IG1DYW1lcmFTZXJ2aWNlLT5zdXBwb3J0c0NhbWVyYUFwaShjYW1lcmFJZFN0ciwKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkFQSV9WRVJTSU9OXzIsICZpc1N1cHBvcnRlZCk7CisgICAgICAgIEVYUEVDVF9UUlVFKHJjLmlzT2soKSk7CisgICAgICAgIGlmICghaXNTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7CisgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHRhZ3NOZWVkaW5nUGVybWlzc2lvbjsKKyAgICAgICAgcmMgPSBtQ2FtZXJhU2VydmljZS0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkU3RyLCAmbWV0YWRhdGEpOworICAgICAgICBBU1NFUlRfVFJVRShyYy5pc09rKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UobWV0YWRhdGEuaXNFbXB0eSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKG1ldGFkYXRhLnJlbW92ZVBlcm1pc3Npb25FbnRyaWVzKENBTUVSQV9NRVRBREFUQV9JTlZBTElEX1ZFTkRPUl9JRCwKKyAgICAgICAgICAgICAgICAgICAgJnRhZ3NOZWVkaW5nUGVybWlzc2lvbiksIE5PX0VSUk9SKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgYXZhaWxhYmxlQ2hhcmFjdGVyaXN0aWNzID0KKyAgICAgICAgICAgICAgICBtZXRhZGF0YS5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVMpOworICAgICAgICBFWFBFQ1RfVFJVRSgwIDwgYXZhaWxhYmxlQ2hhcmFjdGVyaXN0aWNzLmNvdW50KTsKKworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gYXZhaWxhYmxlS2V5czsKKyAgICAgICAgYXZhaWxhYmxlS2V5cy5yZXNlcnZlKGF2YWlsYWJsZUNoYXJhY3RlcmlzdGljcy5jb3VudCk7CisgICAgICAgIGF2YWlsYWJsZUtleXMuaW5zZXJ0KGF2YWlsYWJsZUtleXMuYmVnaW4oKSwgYXZhaWxhYmxlQ2hhcmFjdGVyaXN0aWNzLmRhdGEuaTMyLAorICAgICAgICAgICAgICAgIGF2YWlsYWJsZUNoYXJhY3RlcmlzdGljcy5kYXRhLmkzMiArIGF2YWlsYWJsZUNoYXJhY3RlcmlzdGljcy5jb3VudCk7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZrZXkgOiB0YWdzTmVlZGluZ1Blcm1pc3Npb24pIHsKKyAgICAgICAgICAgIEFTU0VSVF9GQUxTRShtZXRhZGF0YS5leGlzdHMoa2V5KSk7CisgICAgICAgICAgICBhdXRvIGl0ID0gc3RkOjpmaW5kKGF2YWlsYWJsZUtleXMuYmVnaW4oKSwgYXZhaWxhYmxlS2V5cy5lbmQoKSwga2V5KTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGl0ID09IGF2YWlsYWJsZUtleXMuZW5kKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcCBiL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKaW5kZXggYjczOTUxZi4uYzM2MTY5MCAxMDA2NDQKLS0tIGEvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcAorKysgYi9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCkBAIC04Niw2ICs4Niw3IEBACiB1c2luZyBhbmRyb2lkOjpJTkZPX0ZPUk1BVF9DSEFOR0VEOwogdXNpbmcgYW5kcm9pZDo6SU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEOwogdXNpbmcgYW5kcm9pZDo6SU5WQUxJRF9PUEVSQVRJT047Cit1c2luZyBhbmRyb2lkOjpOQU1FX05PVF9GT1VORDsKIHVzaW5nIGFuZHJvaWQ6Ok5PX0VSUk9SOwogdXNpbmcgYW5kcm9pZDo6VU5LTk9XTl9FUlJPUjsKIApAQCAtMTAyLDcgKzEwMyw3IEBACiBzdGF0aWMgYm9vbCBnTW9ub3RvbmljVGltZSA9IGZhbHNlOyAgICAgLy8gdXNlIHN5c3RlbSBtb25vdG9uaWMgdGltZSBmb3IgdGltZXN0YW1wcwogc3RhdGljIGJvb2wgZ1BlcnNpc3RlbnRTdXJmYWNlID0gZmFsc2U7IC8vIHVzZSBwZXJzaXN0ZW50IHN1cmZhY2UKIHN0YXRpYyBlbnVtIHsKLSAgICBGT1JNQVRfTVA0LCBGT1JNQVRfSDI2NCwgRk9STUFUX0ZSQU1FUywgRk9STUFUX1JBV19GUkFNRVMKKyAgICBGT1JNQVRfTVA0LCBGT1JNQVRfSDI2NCwgRk9STUFUX1dFQk0sIEZPUk1BVF8zR1BQLCBGT1JNQVRfRlJBTUVTLCBGT1JNQVRfUkFXX0ZSQU1FUwogfSBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUX01QNDsgICAgICAgICAgIC8vIGRhdGEgZm9ybWF0IGZvciBvdXRwdXQKIHN0YXRpYyBBU3RyaW5nIGdDb2RlY05hbWUgPSAiIjsgICAgICAgICAvLyBjb2RlYyBuYW1lIG92ZXJyaWRlCiBzdGF0aWMgYm9vbCBnU2l6ZVNwZWNpZmllZCA9IGZhbHNlOyAgICAgLy8gd2FzIHNpemUgZXhwbGljaXRseSByZXF1ZXN0ZWQ/CkBAIC0xOTEsNyArMTkyLDcgQEAKICAgICBmb3JtYXQtPnNldEZsb2F0KCJmcmFtZS1yYXRlIiwgZGlzcGxheUZwcyk7CiAgICAgZm9ybWF0LT5zZXRJbnQzMigiaS1mcmFtZS1pbnRlcnZhbCIsIDEwKTsKIAotICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIHNwPGFuZHJvaWQ6OkFMb29wZXI+IGxvb3BlciA9IG5ldyBhbmRyb2lkOjpBTG9vcGVyOwogICAgIGxvb3Blci0+c2V0TmFtZSgic2NyZWVucmVjb3JkX2xvb3BlciIpOwogICAgIGxvb3Blci0+c3RhcnQoKTsKICAgICBBTE9HVigiQ3JlYXRpbmcgY29kZWMiKTsKQEAgLTI2NCwxMCArMjY1LDEwIEBACiAKICAgICAvLyBTZXQgdGhlIHJlZ2lvbiBvZiB0aGUgbGF5ZXIgc3RhY2sgd2UncmUgaW50ZXJlc3RlZCBpbiwgd2hpY2ggaW4gb3VyCiAgICAgLy8gY2FzZSBpcyAiYWxsIG9mIGl0Ii4KLSAgICBSZWN0IGxheWVyU3RhY2tSZWN0KG1haW5EcHlJbmZvLncsIG1haW5EcHlJbmZvLmgpOworICAgIFJlY3QgbGF5ZXJTdGFja1JlY3QobWFpbkRweUluZm8udmlld3BvcnRXLCBtYWluRHB5SW5mby52aWV3cG9ydEgpOwogCiAgICAgLy8gV2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgYXNwZWN0IHJhdGlvIG9mIHRoZSBkaXNwbGF5LgotICAgIGZsb2F0IGRpc3BsYXlBc3BlY3QgPSAoZmxvYXQpIG1haW5EcHlJbmZvLmggLyAoZmxvYXQpIG1haW5EcHlJbmZvLnc7CisgICAgZmxvYXQgZGlzcGxheUFzcGVjdCA9IChmbG9hdCkgbWFpbkRweUluZm8udmlld3BvcnRIIC8gKGZsb2F0KSBtYWluRHB5SW5mby52aWV3cG9ydFc7CiAKIAogICAgIC8vIFNldCB0aGUgd2F5IHdlIG1hcCB0aGUgb3V0cHV0IG9udG8gdGhlIGRpc3BsYXkgc3VyZmFjZSAod2hpY2ggd2lsbApAQCAtMzQ0LDIyICszNDUsNiBAQAogfQogCiAvKgotICogU2V0IHRoZSBtYWluIGRpc3BsYXkgd2lkdGggYW5kIGhlaWdodCB0byB0aGUgYWN0dWFsIHdpZHRoIGFuZCBoZWlnaHQKLSAqLwotc3RhdGljIHN0YXR1c190IGdldEFjdHVhbERpc3BsYXlTaXplKGNvbnN0IHNwPElCaW5kZXI+JiBtYWluRHB5LCBEaXNwbGF5SW5mbyogbWFpbkRweUluZm8pIHsKLSAgICBSZWN0IHZpZXdwb3J0OwotICAgIHN0YXR1c190IGVyciA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheVZpZXdwb3J0KG1haW5EcHksICZ2aWV3cG9ydCk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiB1bmFibGUgdG8gZ2V0IGRpc3BsYXkgdmlld3BvcnRcbiIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBtYWluRHB5SW5mby0+dyA9IHZpZXdwb3J0LndpZHRoKCk7Ci0gICAgbWFpbkRweUluZm8tPmggPSB2aWV3cG9ydC5oZWlnaHQoKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoKICAqIFJ1bnMgdGhlIE1lZGlhQ29kZWMgZW5jb2Rlciwgc2VuZGluZyB0aGUgb3V0cHV0IHRvIHRoZSBNZWRpYU11eGVyLiAgVGhlCiAgKiBpbnB1dCBmcmFtZXMgYXJlIGNvbWluZyBmcm9tIHRoZSB2aXJ0dWFsIGRpc3BsYXkgYXMgZmFzdCBhcyBTdXJmYWNlRmxpbmdlcgogICogd2FudHMgdG8gc2VuZCB0aGVtLgpAQCAtNDI5LDIyICs0MTQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZnVsIHN0dWZmIGlzIGhhcmQgdG8gZ2V0IGF0IHdpdGhvdXQgYSBEYWx2aWsgVk0uCiAgICAgICAgICAgICAgICAgICAgIGVyciA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8obWFpbkRweSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFpbkRweUluZm8pOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBnZXRBY3R1YWxEaXNwbGF5U2l6ZShtYWluRHB5LCAmbWFpbkRweUluZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IHVuYWJsZSB0byBzZXQgYWN0dWFsIGRpc3BsYXkgc2l6ZVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uICE9IG1haW5EcHlJbmZvLm9yaWVudGF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm9yaWVudGF0aW9uIGNoYW5nZWQsIG5vdyAlZCIsIG1haW5EcHlJbmZvLm9yaWVudGF0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OlRyYW5zYWN0aW9uIHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheVByb2plY3Rpb24odCwgdmlydHVhbERweSwgbWFpbkRweUluZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYXBwbHkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IG1haW5EcHlJbmZvLm9yaWVudGF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiZ2V0RGlzcGxheUluZm8obWFpbikgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3JpZW50YXRpb24gIT0gbWFpbkRweUluZm8ub3JpZW50YXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJvcmllbnRhdGlvbiBjaGFuZ2VkLCBub3cgJWQiLCBtYWluRHB5SW5mby5vcmllbnRhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OlRyYW5zYWN0aW9uIHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXREaXNwbGF5UHJvamVjdGlvbih0LCB2aXJ0dWFsRHB5LCBtYWluRHB5SW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0LmFwcGx5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IG1haW5EcHlJbmZvLm9yaWVudGF0aW9uOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCkBAIC02MDksOCArNTg2LDEyIEBACiAgICAgc2VsZi0+c3RhcnRUaHJlYWRQb29sKCk7CiAKICAgICAvLyBHZXQgbWFpbiBkaXNwbGF5IHBhcmFtZXRlcnMuCi0gICAgc3A8SUJpbmRlcj4gbWFpbkRweSA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0QnVpbHRJbkRpc3BsYXkoCi0gICAgICAgICAgICBJU3VyZmFjZUNvbXBvc2VyOjplRGlzcGxheUlkTWFpbik7CisgICAgY29uc3Qgc3A8SUJpbmRlcj4gbWFpbkRweSA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0SW50ZXJuYWxEaXNwbGF5VG9rZW4oKTsKKyAgICBpZiAobWFpbkRweSA9PSBudWxscHRyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IG5vIGRpc3BsYXlcbiIpOworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCiAgICAgRGlzcGxheUluZm8gbWFpbkRweUluZm87CiAgICAgZXJyID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhtYWluRHB5LCAmbWFpbkRweUluZm8pOwogICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKQEAgLTYxOCwyNSArNTk5LDE5IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgZXJyID0gZ2V0QWN0dWFsRGlzcGxheVNpemUobWFpbkRweSwgJm1haW5EcHlJbmZvKTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IHVuYWJsZSB0byBzZXQgYWN0dWFsIGRpc3BsYXkgc2l6ZVxuIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCiAgICAgaWYgKGdWZXJib3NlKSB7CiAgICAgICAgIHByaW50ZigiTWFpbiBkaXNwbGF5IGlzICVkeCVkIEAlLjJmZnBzIChvcmllbnRhdGlvbj0ldSlcbiIsCi0gICAgICAgICAgICAgICAgbWFpbkRweUluZm8udywgbWFpbkRweUluZm8uaCwgbWFpbkRweUluZm8uZnBzLAorICAgICAgICAgICAgICAgIG1haW5EcHlJbmZvLnZpZXdwb3J0VywgbWFpbkRweUluZm8udmlld3BvcnRILCBtYWluRHB5SW5mby5mcHMsCiAgICAgICAgICAgICAgICAgbWFpbkRweUluZm8ub3JpZW50YXRpb24pOwogICAgICAgICBmZmx1c2goc3Rkb3V0KTsKICAgICB9CiAKICAgICAvLyBFbmNvZGVyIGNhbid0IHRha2Ugb2RkIG51bWJlciBhcyBjb25maWcKICAgICBpZiAoZ1ZpZGVvV2lkdGggPT0gMCkgewotICAgICAgICBnVmlkZW9XaWR0aCA9IGZsb29yVG9FdmVuKG1haW5EcHlJbmZvLncpOworICAgICAgICBnVmlkZW9XaWR0aCA9IGZsb29yVG9FdmVuKG1haW5EcHlJbmZvLnZpZXdwb3J0Vyk7CiAgICAgfQogICAgIGlmIChnVmlkZW9IZWlnaHQgPT0gMCkgewotICAgICAgICBnVmlkZW9IZWlnaHQgPSBmbG9vclRvRXZlbihtYWluRHB5SW5mby5oKTsKKyAgICAgICAgZ1ZpZGVvSGVpZ2h0ID0gZmxvb3JUb0V2ZW4obWFpbkRweUluZm8udmlld3BvcnRIKTsKICAgICB9CiAKICAgICAvLyBDb25maWd1cmUgYW5kIHN0YXJ0IHRoZSBlbmNvZGVyLgpAQCAtNzE0LDcgKzY4OSw5IEBACiAgICAgc3A8TWVkaWFNdXhlcj4gbXV4ZXIgPSBOVUxMOwogICAgIEZJTEUqIHJhd0ZwID0gTlVMTDsKICAgICBzd2l0Y2ggKGdPdXRwdXRGb3JtYXQpIHsKLSAgICAgICAgY2FzZSBGT1JNQVRfTVA0OiB7CisgICAgICAgIGNhc2UgRk9STUFUX01QNDoKKyAgICAgICAgY2FzZSBGT1JNQVRfV0VCTToKKyAgICAgICAgY2FzZSBGT1JNQVRfM0dQUDogewogICAgICAgICAgICAgLy8gQ29uZmlndXJlIG11eGVyLiAgV2UgaGF2ZSB0byB3YWl0IGZvciB0aGUgQ1NEIGJsb2IgZnJvbSB0aGUgZW5jb2RlcgogICAgICAgICAgICAgLy8gYmVmb3JlIHdlIGNhbiBzdGFydCBpdC4KICAgICAgICAgICAgIGVyciA9IHVubGluayhmaWxlTmFtZSk7CkBAIC03MjcsNyArNzA0LDEzIEBACiAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogY291bGRuJ3Qgb3BlbiBmaWxlXG4iKTsKICAgICAgICAgICAgICAgICBhYm9ydCgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbXV4ZXIgPSBuZXcgTWVkaWFNdXhlcihmZCwgTWVkaWFNdXhlcjo6T1VUUFVUX0ZPUk1BVF9NUEVHXzQpOworICAgICAgICAgICAgaWYgKGdPdXRwdXRGb3JtYXQgPT0gRk9STUFUX01QNCkgeworICAgICAgICAgICAgICAgIG11eGVyID0gbmV3IE1lZGlhTXV4ZXIoZmQsIE1lZGlhTXV4ZXI6Ok9VVFBVVF9GT1JNQVRfTVBFR180KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZ091dHB1dEZvcm1hdCA9PSBGT1JNQVRfV0VCTSkgeworICAgICAgICAgICAgICAgIG11eGVyID0gbmV3IE1lZGlhTXV4ZXIoZmQsIE1lZGlhTXV4ZXI6Ok9VVFBVVF9GT1JNQVRfV0VCTSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG11eGVyID0gbmV3IE1lZGlhTXV4ZXIoZmQsIE1lZGlhTXV4ZXI6Ok9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNsb3NlKGZkKTsKICAgICAgICAgICAgIGlmIChnUm90YXRlKSB7CiAgICAgICAgICAgICAgICAgbXV4ZXItPnNldE9yaWVudGF0aW9uSGludCg5MCk7ICAvLyBUT0RPOiBkb2VzIHRoaXMgZG8gYW55dGhpbmc/CkBAIC0xMDQ3LDYgKzEwMzAsMTAgQEAKICAgICAgICAgICAgICAgICBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUX01QNDsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgImgyNjQiKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgZ091dHB1dEZvcm1hdCA9IEZPUk1BVF9IMjY0OworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAid2VibSIpID09IDApIHsKKyAgICAgICAgICAgICAgICBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUX1dFQk07CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICIzZ3BwIikgPT0gMCkgeworICAgICAgICAgICAgICAgIGdPdXRwdXRGb3JtYXQgPSBGT1JNQVRfM0dQUDsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgImZyYW1lcyIpID09IDApIHsKICAgICAgICAgICAgICAgICBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUX0ZSQU1FUzsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgInJhdy1mcmFtZXMiKSA9PSAwKSB7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsgYi9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKaW5kZXggN2ExMDMwMi4uNmViMmU5ZiAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpAQCAtOCw3ICs4LDcgQEAKICAgICAgICAgU2luZVNvdXJjZS5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYm1lZGlhX29teCBsaWJtZWRpYWV4dHJhY3RvciBsaWJ1dGlscyBsaWJiaW5kZXIgXAorICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJtZWRpYV9vbXggbGlidXRpbHMgbGliYmluZGVyIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJqcGVnIGxpYnVpIGxpYmd1aSBsaWJjdXRpbHMgbGlibG9nIFwKICAgICAgICAgbGliaGlkbGJhc2UgXAogICAgICAgICBhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAgXApAQCAtMzYsNyArMzYsNyBAQAogICAgICAgICByZWNvcmQuY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJtZWRpYWV4dHJhY3RvciBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKQEAgLTYxLDcgKzYxLDcgQEAKICAgICAgICAgcmVjb3JkdmlkZW8uY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJtZWRpYWV4dHJhY3RvciBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgICAgYXVkaW9sb29wLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibWVkaWFleHRyYWN0b3IgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCkBAIC0xMTEsNyArMTExLDcgQEAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlidWkgbGliZ3VpIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJtZWRpYSBsaWJjdXRpbHMgbGlibWVkaWFleHRyYWN0b3IKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJtZWRpYSBsaWJjdXRpbHMKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKICAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCkBAIC0yMDMsNyArMjAzLDcgQEAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCi0gICAgICAgIGxpYmN1dGlscyBsaWJjIGxpYm1lZGlhZXh0cmFjdG9yCisgICAgICAgIGxpYmN1dGlscyBsaWJjCiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAgICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXApkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcAppbmRleCA5ODBkMWQyLi5lNWE0MzM3IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcApAQCAtMTM4LDcgKzEzOCw3IEBACiAKICAgICBDSEVDSyghc3RhdGVCeVRyYWNrLmlzRW1wdHkoKSk7CiAKLSAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gYW5kcm9pZDo6QUxvb3Blcjo6R2V0Tm93VXMoKTsKICAgICBpbnQ2NF90IHN0YXJ0VGltZVJlbmRlciA9IC0xOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0ZUJ5VHJhY2suc2l6ZSgpOyArK2kpIHsKQEAgLTMwNyw3ICszMDcsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaW50NjRfdCBlbGFwc2VkVGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOworICAgIGludDY0X3QgZWxhcHNlZFRpbWVVcyA9IGFuZHJvaWQ6OkFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGVCeVRyYWNrLnNpemUoKTsgKytpKSB7CiAgICAgICAgIENvZGVjU3RhdGUgKnN0YXRlID0gJnN0YXRlQnlUcmFjay5lZGl0VmFsdWVBdChpKTsKQEAgLTQwMCw3ICs0MDAsNyBAQAogCiAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogCi0gICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgc3A8YW5kcm9pZDo6QUxvb3Blcj4gbG9vcGVyID0gbmV3IGFuZHJvaWQ6OkFMb29wZXI7CiAgICAgbG9vcGVyLT5zdGFydCgpOwogCiAgICAgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBjb21wb3NlckNsaWVudDsKQEAgLTQxMSwxMCArNDExLDEyIEBACiAgICAgICAgIGNvbXBvc2VyQ2xpZW50ID0gbmV3IFN1cmZhY2VDb21wb3NlckNsaWVudDsKICAgICAgICAgQ0hFQ0tfRVEoY29tcG9zZXJDbGllbnQtPmluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOwogCi0gICAgICAgIHNwPElCaW5kZXI+IGRpc3BsYXkoU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRCdWlsdEluRGlzcGxheSgKLSAgICAgICAgICAgICAgICBJU3VyZmFjZUNvbXBvc2VyOjplRGlzcGxheUlkTWFpbikpOworICAgICAgICBjb25zdCBzcDxJQmluZGVyPiBkaXNwbGF5ID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRJbnRlcm5hbERpc3BsYXlUb2tlbigpOworICAgICAgICBDSEVDSyhkaXNwbGF5ICE9IG51bGxwdHIpOworCiAgICAgICAgIERpc3BsYXlJbmZvIGluZm87Ci0gICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8oZGlzcGxheSwgJmluZm8pOworICAgICAgICBDSEVDS19FUShTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlJbmZvKGRpc3BsYXksICZpbmZvKSwgTk9fRVJST1IpOworCiAgICAgICAgIHNzaXplX3QgZGlzcGxheVdpZHRoID0gaW5mby53OwogICAgICAgICBzc2l6ZV90IGRpc3BsYXlIZWlnaHQgPSBpbmZvLmg7CiAKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvbWVkaWFmaWx0ZXIuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKaW5kZXggNjMwZGUyNS4uMmNmNjk1NSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKQEAgLTMxMCw3ICszMTAsNyBAQAogfQogCiBzdGF0aWMgaW50IGRlY29kZSgKLSAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKKyAgICAgICAgY29uc3Qgc3A8YW5kcm9pZDo6QUxvb3Blcj4gJmxvb3BlciwKICAgICAgICAgY29uc3QgY2hhciAqcGF0aCwKICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgIGJvb2wgcmVuZGVyU3VyZmFjZSwKQEAgLTQ2NSw3ICs0NjUsNyBAQAogICAgIGZpbHRlclN0YXRlLT5tU2lnbmFsbGVkSW5wdXRFT1MgPSBmYWxzZTsKICAgICBmaWx0ZXJTdGF0ZS0+bVNhd091dHB1dEVPUyA9IGZhbHNlOwogCi0gICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IGFuZHJvaWQ6OkFMb29wZXI6OkdldE5vd1VzKCk7CiAgICAgaW50NjRfdCBzdGFydFRpbWVSZW5kZXIgPSAtMTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGVCeVRyYWNrLnNpemUoKTsgKytpKSB7CkBAIC02NDMsNyArNjQzLDcgQEAKICAgICAgICAgICAgICAgICB1c2VUaW1lc3RhbXAsICZzdGFydFRpbWVSZW5kZXIpOwogICAgIH0KIAotICAgIGludDY0X3QgZWxhcHNlZFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKKyAgICBpbnQ2NF90IGVsYXBzZWRUaW1lVXMgPSBhbmRyb2lkOjpBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlQnlUcmFjay5zaXplKCk7ICsraSkgewogICAgICAgICBDb2RlY1N0YXRlICpzdGF0ZSA9ICZzdGF0ZUJ5VHJhY2suZWRpdFZhbHVlQXQoaSk7CkBAIC03MzcsNyArNzM3LDcgQEAKIAogICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKIAotICAgIGFuZHJvaWQ6OnNwPEFMb29wZXI+IGxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkFMb29wZXI+IGxvb3BlciA9IG5ldyBhbmRyb2lkOjpBTG9vcGVyOwogICAgIGxvb3Blci0+c3RhcnQoKTsKIAogICAgIGFuZHJvaWQ6OnNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gY29tcG9zZXJDbGllbnQ7CkBAIC03NDgsMTAgKzc0OCwxMiBAQAogICAgICAgICBjb21wb3NlckNsaWVudCA9IG5ldyBTdXJmYWNlQ29tcG9zZXJDbGllbnQ7CiAgICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgY29tcG9zZXJDbGllbnQtPmluaXRDaGVjaygpKTsKIAotICAgICAgICBhbmRyb2lkOjpzcDxJQmluZGVyPiBkaXNwbGF5KFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0QnVpbHRJbkRpc3BsYXkoCi0gICAgICAgICAgICAgICAgSVN1cmZhY2VDb21wb3Nlcjo6ZURpc3BsYXlJZE1haW4pKTsKKyAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8SUJpbmRlcj4gZGlzcGxheSA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0SW50ZXJuYWxEaXNwbGF5VG9rZW4oKTsKKyAgICAgICAgQ0hFQ0soZGlzcGxheSAhPSBudWxscHRyKTsKKwogICAgICAgICBEaXNwbGF5SW5mbyBpbmZvOwotICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlJbmZvKGRpc3BsYXksICZpbmZvKTsKKyAgICAgICAgQ0hFQ0tfRVEoU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhkaXNwbGF5LCAmaW5mbyksIE5PX0VSUk9SKTsKKwogICAgICAgICBzc2l6ZV90IGRpc3BsYXlXaWR0aCA9IGluZm8udzsKICAgICAgICAgc3NpemVfdCBkaXNwbGF5SGVpZ2h0ID0gaW5mby5oOwogCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKaW5kZXggNDRiMDAxNS4uOTVhMTZmMyAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcApAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgIlNpbmVTb3VyY2UuaCIKIAogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMjgsNiArMjcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5oPgpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAppbmRleCAwMzExNjc3Li5iZjM2YmUwIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcApAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KQEAgLTQ3LDkgKzQ2LDExIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSlBFR1NvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmg+CkBAIC03OCw2ICs3OSw3IEBACiBzdGF0aWMgYm9vbCBnUGxheWJhY2tBdWRpbzsKIHN0YXRpYyBib29sIGdXcml0ZU1QNDsKIHN0YXRpYyBib29sIGdEaXNwbGF5SGlzdG9ncmFtOworc3RhdGljIGJvb2wgZ1ZlcmJvc2UgPSBmYWxzZTsKIHN0YXRpYyBib29sIHNob3dQcm9ncmVzcyA9IHRydWU7CiBzdGF0aWMgU3RyaW5nOCBnV3JpdGVNUDRGaWxlbmFtZTsKIHN0YXRpYyBTdHJpbmc4IGdDb21wb25lbnROYW1lT3ZlcnJpZGU7CkBAIC0xNTksNiArMTYxLDExIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGlmIChnVmVyYm9zZSkgeworICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhID0gbWJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgInNhbXBsZSBmb3JtYXQ6ICVzXG4iLCBtZXRhLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIH0KKwogICAgICAgICBDSEVDS19FUSgKICAgICAgICAgICAgICAgICBmd3JpdGUoKGNvbnN0IHVpbnQ4X3QgKiltYnVmLT5kYXRhKCkgKyBtYnVmLT5yYW5nZV9vZmZzZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgMSwKQEAgLTIxOCwxMSArMjI1LDE1IEBACiAgICAgICAgIHBsYXllci0+c2V0U291cmNlKHJhd1NvdXJjZSk7CiAgICAgICAgIHJhd1NvdXJjZS5jbGVhcigpOwogCi0gICAgICAgIHBsYXllci0+c3RhcnQodHJ1ZSAvKiBzb3VyY2VBbHJlYWR5U3RhcnRlZCAqLyk7CisgICAgICAgIGVyciA9IHBsYXllci0+c3RhcnQodHJ1ZSAvKiBzb3VyY2VBbHJlYWR5U3RhcnRlZCAqLyk7CiAKLSAgICAgICAgc3RhdHVzX3QgZmluYWxTdGF0dXM7Ci0gICAgICAgIHdoaWxlICghcGxheWVyLT5yZWFjaGVkRU9TKCZmaW5hbFN0YXR1cykpIHsKLSAgICAgICAgICAgIHVzbGVlcCgxMDAwMDBsbCk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIHN0YXR1c190IGZpbmFsU3RhdHVzOworICAgICAgICAgICAgd2hpbGUgKCFwbGF5ZXItPnJlYWNoZWRFT1MoJmZpbmFsU3RhdHVzKSkgeworICAgICAgICAgICAgICAgIHVzbGVlcCgxMDAwMDBsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byBzdGFydCBwbGF5YmFjayBlcnI9JWQgKDB4JTA4eClcbiIsIGVyciwgZXJyKTsKICAgICAgICAgfQogCiAgICAgICAgIGRlbGV0ZSBwbGF5ZXI7CkBAIC0zNDgsNyArMzU5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGRlY29kZVRpbWVzVXMucHVzaChkZWxheURlY29kZVVzKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoc2hvd1Byb2dyZXNzICYmIChuKysgJSAxNikgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChnVmVyYm9zZSkgeworICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIiVsZCBzYW1wbGUgZm9ybWF0OiAlc1xuIiwgbnVtRnJhbWVzLCBtZXRhLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaG93UHJvZ3Jlc3MgJiYgKG4rKyAlIDE2KSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLiIpOwogICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKICAgICAgICAgICAgICAgICB9CkBAIC01NzksMTIgKzU5MywxMiBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBDSEVDSyhidWZmZXIgIT0gTlVMTCk7CisKICAgICAgICAgICAgIGlmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBDSEVDSyhidWZmZXIgIT0gTlVMTCk7Ci0KICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKICAgICAgICAgfQpAQCAtNjE1LDcgKzYyOSw3IEBACiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWwoaXN0KSBjb21wb25lbnRzXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtbSBtYXgtbnVtYmVyLW9mLWZyYW1lcy10by1kZWNvZGUgaW4gZWFjaCBwYXNzXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtYiBidWcgdG8gcmVwcm9kdWNlXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtcChyb2ZpbGVzKSBkdW1wIGRlY29kZXIgcHJvZmlsZXMgc3VwcG9ydGVkXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtaShuZm8pIGR1bXAgY29kZWMgaW5mbyAocHJvZmlsZXMgYW5kIGNvbG9yIGZvcm1hdHMgc3VwcG9ydGVkLCBkZXRhaWxzKVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXQoaHVtYm5haWwpIGV4dHJhY3QgdmlkZW8gdGh1bWJuYWlsIG9yIGFsYnVtIGFydFxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXMob2Z0d2FyZSkgcHJlZmVyIHNvZnR3YXJlIGNvZGVjXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtcihoYXJkd2FyZSkgZm9yY2UgdG8gdXNlIGhhcmR3YXJlIGNvZGVjXG4iKTsKQEAgLTYzMCw1NSArNjQ0LDEzNCBAQAogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1UIGFsbG9jYXRlIGJ1ZmZlcnMgZnJvbSBhIHN1cmZhY2UgdGV4dHVyZVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWQodW1wKSBvdXRwdXRfZmlsZW5hbWUgKHJhdyBzdHJlYW0gZGF0YSB0byBhIGZpbGUpXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtRCh1bXApIG91dHB1dF9maWxlbmFtZSAoZGVjb2RlZCBQQ00gZGF0YSB0byBhIGZpbGUpXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtdiBiZSBtb3JlIHZlcmJvc2VcbiIpOwogfQogCi1zdGF0aWMgdm9pZCBkdW1wQ29kZWNQcm9maWxlcyhib29sIHF1ZXJ5RGVjb2RlcnMpIHsKLSAgICBjb25zdCBjaGFyICprTWltZVR5cGVzW10gPSB7Ci0gICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsCi0gICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywKLSAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsCi0gICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVywKLSAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsCi0gICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5LAotICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04sIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMKLSAgICB9OwotCi0gICAgY29uc3QgY2hhciAqY29kZWNUeXBlID0gcXVlcnlEZWNvZGVycz8gImRlY29kZXIiIDogImVuY29kZXIiOwotICAgIHByaW50ZigiJXMgcHJvZmlsZXM6XG4iLCBjb2RlY1R5cGUpOworc3RhdGljIHZvaWQgZHVtcENvZGVjRGV0YWlscyhib29sIHF1ZXJ5RGVjb2RlcnMpIHsKKyAgICBjb25zdCBjaGFyICpjb2RlY1R5cGUgPSBxdWVyeURlY29kZXJzPyAiRGVjb2RlciIgOiAiRW5jb2RlciI7CisgICAgcHJpbnRmKCJcbiVzIGluZm9zIGJ5IG1lZGlhIHR5cGVzOlxuIgorICAgICAgICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIsIGNvZGVjVHlwZSk7CiAKICAgICBzcDxJTWVkaWFDb2RlY0xpc3Q+IGxpc3QgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKICAgICBzaXplX3QgbnVtQ29kZWNzID0gbGlzdC0+Y291bnRDb2RlY3MoKTsKIAotICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgc2l6ZW9mKGtNaW1lVHlwZXMpIC8gc2l6ZW9mKGtNaW1lVHlwZXNbMF0pOyArK2spIHsKLSAgICAgICAgcHJpbnRmKCJ0eXBlICclcyc6XG4iLCBrTWltZVR5cGVzW2tdKTsKKyAgICAvLyBnYXRoZXIgYWxsIG1lZGlhIHR5cGVzIHN1cHBvcnRlZCBieSBjb2RlYyBjbGFzcywgYW5kIGxpbmsgdG8gY29kZWNzIHRoYXQgc3VwcG9ydCB0aGVtCisgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgVmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4+IGFsbE1lZGlhVHlwZXM7CisgICAgZm9yIChzaXplX3QgY29kZWNfaXggPSAwOyBjb2RlY19peCA8IG51bUNvZGVjczsgKytjb2RlY19peCkgeworICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IGxpc3QtPmdldENvZGVjSW5mbyhjb2RlY19peCk7CisgICAgICAgIGlmIChpbmZvLT5pc0VuY29kZXIoKSA9PSAhcXVlcnlEZWNvZGVycykgeworICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+IHN1cHBvcnRlZE1lZGlhVHlwZXM7CisgICAgICAgICAgICBpbmZvLT5nZXRTdXBwb3J0ZWRNZWRpYVR5cGVzKCZzdXBwb3J0ZWRNZWRpYVR5cGVzKTsKKyAgICAgICAgICAgIGlmICghc3VwcG9ydGVkTWVkaWFUeXBlcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIndhcm5pbmc6ICVzIGRvZXMgbm90IHN1cHBvcnQgYW55IG1lZGlhIHR5cGVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+Z2V0Q29kZWNOYW1lKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IEFTdHJpbmcgJm1lZGlhVHlwZSA6IHN1cHBvcnRlZE1lZGlhVHlwZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsbE1lZGlhVHlwZXMuaW5kZXhPZktleShtZWRpYVR5cGUpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWxsTWVkaWFUeXBlcy5hZGQobWVkaWFUeXBlLCBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhbGxNZWRpYVR5cGVzLmVkaXRWYWx1ZUZvcihtZWRpYVR5cGUpLmFkZChpbmZvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IG51bUNvZGVjczsgKytpbmRleCkgewotICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBsaXN0LT5nZXRDb2RlY0luZm8oaW5kZXgpOwotICAgICAgICAgICAgaWYgKGluZm8gPT0gTlVMTCB8fCBpbmZvLT5pc0VuY29kZXIoKSAhPSAhcXVlcnlEZWNvZGVycykgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gY2FwcyA9IGluZm8tPmdldENhcGFiaWxpdGllc0ZvcihrTWltZVR5cGVzW2tdKTsKKyAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBib29sPiB2aXNpdGVkQ29kZWNzOworICAgIGZvciAoc2l6ZV90IHR5cGVfaXggPSAwOyB0eXBlX2l4IDwgYWxsTWVkaWFUeXBlcy5zaXplKCk7ICsrdHlwZV9peCkgeworICAgICAgICBjb25zdCBBU3RyaW5nICZtZWRpYVR5cGUgPSBhbGxNZWRpYVR5cGVzLmtleUF0KHR5cGVfaXgpOworICAgICAgICBwcmludGYoIlxuTWVkaWEgdHlwZSAnJXMnOlxuIiwgbWVkaWFUeXBlLmNfc3RyKCkpOworCisgICAgICAgIGZvciAoY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZpbmZvIDogYWxsTWVkaWFUeXBlcy52YWx1ZUF0KHR5cGVfaXgpKSB7CisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBjYXBzID0gaW5mby0+Z2V0Q2FwYWJpbGl0aWVzRm9yKG1lZGlhVHlwZS5jX3N0cigpKTsKICAgICAgICAgICAgIGlmIChjYXBzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIndhcm5pbmc6ICVzIGRvZXMgbm90IGhhdmUgY2FwYWJpbGl0aWVzIGZvciB0eXBlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+Z2V0Q29kZWNOYW1lKCksIG1lZGlhVHlwZS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByaW50ZigiICAlcyAnJXMnIHN1cHBvcnRzICIsCisgICAgICAgICAgICBwcmludGYoIiAgJXMgXCIlc1wiIHN1cHBvcnRzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1R5cGUsIGluZm8tPmdldENvZGVjTmFtZSgpKTsKIAotICAgICAgICAgICAgVmVjdG9yPE1lZGlhQ29kZWNJbmZvOjpQcm9maWxlTGV2ZWw+IHByb2ZpbGVMZXZlbHM7Ci0gICAgICAgICAgICBjYXBzLT5nZXRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKCZwcm9maWxlTGV2ZWxzKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlTGV2ZWxzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJOT1RISU5HLlxuIik7Ci0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBhdXRvIHByaW50TGlzdCA9IFtdKGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IFZlY3RvcjxBU3RyaW5nPiAmdmFsdWVzKXsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgICAlczogWyIsIHR5cGUpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgdmFsdWVzLnNpemUoKTsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4gICAgICAlcyVzIiwgdmFsdWVzW2pdLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9PSB2YWx1ZXMuc2l6ZSgpIC0gMSA/ICIgIiA6ICIsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50ZigiXVxuIik7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBpZiAodmlzaXRlZENvZGVjcy5pbmRleE9mS2V5KGluZm8tPmdldENvZGVjTmFtZSgpKSA8IDApIHsKKyAgICAgICAgICAgICAgICB2aXNpdGVkQ29kZWNzLmFkZChpbmZvLT5nZXRDb2RlY05hbWUoKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gYWxpYXNlczsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Z2V0QWxpYXNlcygmYWxpYXNlcyk7CisgICAgICAgICAgICAgICAgICAgIC8vIHF1b3RlIGFsaWFzCisgICAgICAgICAgICAgICAgICAgIGZvciAoQVN0cmluZyAmYWxpYXMgOiBhbGlhc2VzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcy5pbnNlcnQoIlwiIiwgMSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcy5hcHBlbmQoJyInKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcmludExpc3QoImFsaWFzZXMiLCBhbGlhc2VzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhdHRycyA9IGluZm8tPmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+IGxpc3Q7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKEFTdHJpbmdQcmludGYoImVuY29kZXI6ICVkIiwgISEoYXR0cnMgJiBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc0VuY29kZXIpKSk7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKEFTdHJpbmdQcmludGYoInZlbmRvcjogJWQiLCAhIShhdHRycyAmIE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzVmVuZG9yKSkpOworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChBU3RyaW5nUHJpbnRmKCJzb2Z0d2FyZS1vbmx5OiAlZCIsICEhKGF0dHJzICYgTWVkaWFDb2RlY0luZm86OmtGbGFnSXNTb2Z0d2FyZU9ubHkpKSk7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKEFTdHJpbmdQcmludGYoImh3LWFjY2VsZXJhdGVkOiAlZCIsICEhKGF0dHJzICYgTWVkaWFDb2RlY0luZm86OmtGbGFnSXNIYXJkd2FyZUFjY2VsZXJhdGVkKSkpOworICAgICAgICAgICAgICAgICAgICBwcmludExpc3QoQVN0cmluZ1ByaW50ZigiYXR0cmlidXRlczogJSN4IiwgYXR0cnMpLmNfc3RyKCksIGxpc3QpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByaW50ZigiICAgIG93bmVyOiBcIiVzXCJcbiIsIGluZm8tPmdldE93bmVyTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgICByYW5rOiAldVxuIiwgaW5mby0+Z2V0UmFuaygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgYWxpYXNlcywgYXR0cmlidXRlcywgb3duZXIsIHJhbms6IHNlZSBhYm92ZVxuIik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcHJvZmlsZUxldmVscy5zaXplKCk7ICsraikgewotICAgICAgICAgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNJbmZvOjpQcm9maWxlTGV2ZWwgJnByb2ZpbGVMZXZlbCA9IHByb2ZpbGVMZXZlbHNbal07CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+IGxpc3Q7CisgICAgICAgICAgICAgICAgVmVjdG9yPE1lZGlhQ29kZWNJbmZvOjpQcm9maWxlTGV2ZWw+IHByb2ZpbGVMZXZlbHM7CisgICAgICAgICAgICAgICAgY2Fwcy0+Z2V0U3VwcG9ydGVkUHJvZmlsZUxldmVscygmcHJvZmlsZUxldmVscyk7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBNZWRpYUNvZGVjSW5mbzo6UHJvZmlsZUxldmVsICZwbCA6IHByb2ZpbGVMZXZlbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmljZVByb2ZpbGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfQVVESU9fQUFDKSAgID8gYXNTdHJpbmdfQUFDT2JqZWN0KHBsLm1Qcm9maWxlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19NUEVHMikgPyBhc1N0cmluZ19NUEVHMlByb2ZpbGUocGwubVByb2ZpbGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX0gyNjMpICA/IGFzU3RyaW5nX0gyNjNQcm9maWxlKHBsLm1Qcm9maWxlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19NUEVHNCkgPyBhc1N0cmluZ19NUEVHNFByb2ZpbGUocGwubVByb2ZpbGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX0FWQykgICA/IGFzU3RyaW5nX0FWQ1Byb2ZpbGUocGwubVByb2ZpbGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX1ZQOCkgICA/IGFzU3RyaW5nX1ZQOFByb2ZpbGUocGwubVByb2ZpbGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX0hFVkMpICA/IGFzU3RyaW5nX0hFVkNQcm9maWxlKHBsLm1Qcm9maWxlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19WUDkpICAgPyBhc1N0cmluZ19WUDlQcm9maWxlKHBsLm1Qcm9maWxlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19BVjEpICAgPyBhc1N0cmluZ19BVjFQcm9maWxlKHBsLm1Qcm9maWxlKSA6Ij8/IjsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmljZUxldmVsID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX01QRUcyKSA/IGFzU3RyaW5nX01QRUcyTGV2ZWwocGwubUxldmVsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19IMjYzKSAgPyBhc1N0cmluZ19IMjYzTGV2ZWwocGwubUxldmVsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19NUEVHNCkgPyBhc1N0cmluZ19NUEVHNExldmVsKHBsLm1MZXZlbCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fQVZDKSAgID8gYXNTdHJpbmdfQVZDTGV2ZWwocGwubUxldmVsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19WUDgpICAgPyBhc1N0cmluZ19WUDhMZXZlbChwbC5tTGV2ZWwpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX0hFVkMpICA/IGFzU3RyaW5nX0hFVkNUaWVyTGV2ZWwocGwubUxldmVsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19WUDkpICAgPyBhc1N0cmluZ19WUDlMZXZlbChwbC5tTGV2ZWwpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX0FWMSkgICA/IGFzU3RyaW5nX0FWMUxldmVsKHBsLm1MZXZlbCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgIj8/IjsKIAotICAgICAgICAgICAgICAgIHByaW50ZigiJXMldS8ldSIsIGogPiAwID8gIiwgIiA6ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZUxldmVsLm1Qcm9maWxlLCBwcm9maWxlTGV2ZWwubUxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoQVN0cmluZ1ByaW50ZigiJSA1dS8lIDV1ICglcy8lcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsLm1Qcm9maWxlLCBwbC5tTGV2ZWwsIG5pY2VQcm9maWxlLCBuaWNlTGV2ZWwpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRMaXN0KCJwcm9maWxlL2xldmVscyIsIGxpc3QpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+IGxpc3Q7CisgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQzMl90PiBjb2xvcnM7CisgICAgICAgICAgICAgICAgY2Fwcy0+Z2V0U3VwcG9ydGVkQ29sb3JGb3JtYXRzKCZjb2xvcnMpOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgY29sb3IgOiBjb2xvcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoQVN0cmluZ1ByaW50ZigiJSN4ICglcykiLCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZ19Db2xvckZvcm1hdCgoaW50MzJfdCljb2xvcikpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRMaXN0KCJjb2xvcnMiLCBsaXN0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpbnRmKCIgICAgZGV0YWlsczogJXNcbiIsIGNhcHMtPmdldERldGFpbHMoKS0+ZGVidWdTdHJpbmcoNikuY19zdHIoKSk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC02ODgsNyArNzgxLDcgQEAKIAogICAgIGJvb2wgYXVkaW9Pbmx5ID0gZmFsc2U7CiAgICAgYm9vbCBsaXN0Q29tcG9uZW50cyA9IGZhbHNlOwotICAgIGJvb2wgZHVtcFByb2ZpbGVzID0gZmFsc2U7CisgICAgYm9vbCBkdW1wQ29kZWNJbmZvID0gZmFsc2U7CiAgICAgYm9vbCBleHRyYWN0VGh1bWJuYWlsID0gZmFsc2U7CiAgICAgYm9vbCBzZWVrVGVzdCA9IGZhbHNlOwogICAgIGJvb2wgdXNlU3VyZmFjZUFsbG9jID0gZmFsc2U7CkBAIC03MDUsMTAgKzc5OCwxMCBAQAogICAgIGdXcml0ZU1QNCA9IGZhbHNlOwogICAgIGdEaXNwbGF5SGlzdG9ncmFtID0gZmFsc2U7CiAKLSAgICBzcDxBTG9vcGVyPiBsb29wZXI7CisgICAgc3A8YW5kcm9pZDo6QUxvb3Blcj4gbG9vcGVyOwogCiAgICAgaW50IHJlczsKLSAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaGFxbjpsbTpiOnB0c3JvdzprTjp4U1RkOkQ6IikpID49IDApIHsKKyAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAidmhhcW46bG06YjppdHNyb3c6a046eFNUZDpEOiIpKSA+PSAwKSB7CiAgICAgICAgIHN3aXRjaCAocmVzKSB7CiAgICAgICAgICAgICBjYXNlICdhJzoKICAgICAgICAgICAgIHsKQEAgLTc3OCw5ICs4NzEsOSBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjYXNlICdwJzoKKyAgICAgICAgICAgIGNhc2UgJ2knOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGR1bXBQcm9maWxlcyA9IHRydWU7CisgICAgICAgICAgICAgICAgZHVtcENvZGVjSW5mbyA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTgzMiw2ICs5MjUsMTIgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSAndic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ1ZlcmJvc2UgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBjYXNlICc/JzoKICAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTkxNSw5ICsxMDE0LDkgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgaWYgKGR1bXBQcm9maWxlcykgewotICAgICAgICBkdW1wQ29kZWNQcm9maWxlcyh0cnVlIC8qIHF1ZXJ5RGVjb2RlcnMgKi8pOwotICAgICAgICBkdW1wQ29kZWNQcm9maWxlcyhmYWxzZSAvKiBxdWVyeURlY29kZXJzICovKTsKKyAgICBpZiAoZHVtcENvZGVjSW5mbykgeworICAgICAgICBkdW1wQ29kZWNEZXRhaWxzKHRydWUgLyogcXVlcnlEZWNvZGVycyAqLyk7CisgICAgICAgIGR1bXBDb2RlY0RldGFpbHMoZmFsc2UgLyogcXVlcnlEZWNvZGVycyAqLyk7CiAgICAgfQogCiAgICAgaWYgKGxpc3RDb21wb25lbnRzKSB7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAKaW5kZXggYjAxOTlkOC4uMzViZGJjMCAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcApAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lTdHJlYW1Tb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtMzIsNiArMzEsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogCkBAIC0zMTgsMTAgKzMxOCwxMiBAQAogICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gY29tcG9zZXJDbGllbnQgPSBuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OwogICAgIENIRUNLX0VRKGNvbXBvc2VyQ2xpZW50LT5pbml0Q2hlY2soKSwgKHN0YXR1c190KU9LKTsKIAotICAgIHNwPElCaW5kZXI+IGRpc3BsYXkoU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRCdWlsdEluRGlzcGxheSgKLSAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmVEaXNwbGF5SWRNYWluKSk7CisgICAgY29uc3Qgc3A8SUJpbmRlcj4gZGlzcGxheSA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0SW50ZXJuYWxEaXNwbGF5VG9rZW4oKTsKKyAgICBDSEVDSyhkaXNwbGF5ICE9IG51bGxwdHIpOworCiAgICAgRGlzcGxheUluZm8gaW5mbzsKLSAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlJbmZvKGRpc3BsYXksICZpbmZvKTsKKyAgICBDSEVDS19FUShTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlJbmZvKGRpc3BsYXksICZpbmZvKSwgTk9fRVJST1IpOworCiAgICAgc3NpemVfdCBkaXNwbGF5V2lkdGggPSBpbmZvLnc7CiAgICAgc3NpemVfdCBkaXNwbGF5SGVpZ2h0ID0gaW5mby5oOwogCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0RybUVuZ2luZUJhc2UuY3BwIGIvZHJtL2NvbW1vbi9Ecm1FbmdpbmVCYXNlLmNwcAppbmRleCBmNzM0OTA1Li5hZWM1OTU5IDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL0RybUVuZ2luZUJhc2UuY3BwCisrKyBiL2RybS9jb21tb24vRHJtRW5naW5lQmFzZS5jcHAKQEAgLTc5LDEyICs3OSwxMiBAQAogfQogCiBzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpjb25zdW1lUmlnaHRzKAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CiAgICAgcmV0dXJuIG9uQ29uc3VtZVJpZ2h0cyh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYWN0aW9uLCByZXNlcnZlKTsKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6c2V0UGxheWJhY2tTdGF0dXMoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKICAgICByZXR1cm4gb25TZXRQbGF5YmFja1N0YXR1cyh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgcGxheWJhY2tTdGF0dXMsIHBvc2l0aW9uKTsKIH0KIApAQCAtMTIwLDcgKzEyMCw3IEBACiB9CiAKIHN0YXR1c190IERybUVuZ2luZUJhc2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSkgewogCiAgICAgaWYgKCFtaW1lIHx8IG1pbWVbMF0gPT0gJ1wwJykgewpAQCAtMTMxLDcgKzEzMSw3IEBACiB9CiAKIHN0YXR1c190IERybUVuZ2luZUJhc2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpIHsKICAgICBpZiAoIW1pbWUgfHwgbWltZVswXSA9PSAnXDAnKSB7CiAgICAgICAgIHJldHVybiBvbk9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgdXJpKTsKQEAgLTEzOSwzMyArMTM5LDMzIEBACiAgICAgcmV0dXJuIG9uT3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCB1cmksIG1pbWUpOwogfQogCi1zdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6b3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgewogICAgIHJldHVybiBvbk9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYnVmLCBtaW1lVHlwZSk7CiB9CiAKLXN0YXR1c190IERybUVuZ2luZUJhc2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CitzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpIHsKICAgICByZXR1cm4gb25DbG9zZURlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlKTsKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgeworICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKICAgICByZXR1cm4gb25Jbml0aWFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOwogfQogCiBzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpkZWNyeXB0KAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgewogICAgIHJldHVybiBvbkRlY3J5cHQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGVuY0J1ZmZlciwgZGVjQnVmZmVyLCBJVik7CiB9CiAKIHN0YXR1c190IERybUVuZ2luZUJhc2U6OmZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgeworICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CiAgICAgcmV0dXJuIG9uRmluYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCk7CiB9CiAKIHNzaXplX3QgRHJtRW5naW5lQmFzZTo6cHJlYWQoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgewogICAgIHJldHVybiBvblByZWFkKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOwogfQogCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAgYi9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAKaW5kZXggNDRmOThkZC4uYTZkMzNiMCAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9JRHJtTWFuYWdlclNlcnZpY2UuY3BwCisrKyBiL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcApAQCAtMzksNyArMzksNyBAQAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIHN0YXRpYyB2b2lkIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YSgKLSAgICAgICAgY29uc3QgRGVjcnlwdEhhbmRsZSogaGFuZGxlLCBQYXJjZWwqIGRhdGEpIHsKKyAgICAgICAgY29uc3Qgc3A8RGVjcnlwdEhhbmRsZT4mIGhhbmRsZSwgUGFyY2VsKiBkYXRhKSB7CiAgICAgZGF0YS0+d3JpdGVJbnQzMihoYW5kbGUtPmRlY3J5cHRJZCk7CiAgICAgZGF0YS0+d3JpdGVTdHJpbmc4KGhhbmRsZS0+bWltZVR5cGUpOwogICAgIGRhdGEtPndyaXRlSW50MzIoaGFuZGxlLT5kZWNyeXB0QXBpVHlwZSk7CkBAIC02Nyw3ICs2Nyw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoCi0gICAgICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSwgY29uc3QgUGFyY2VsJiBkYXRhKSB7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBoYW5kbGUsIGNvbnN0IFBhcmNlbCYgZGF0YSkgewogICAgIGlmICgwID09IGRhdGEuZGF0YUF2YWlsKCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTk5LDcgKzk5LDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNsZWFyRGVjcnlwdEhhbmRsZShEZWNyeXB0SGFuZGxlKiBoYW5kbGUpIHsKK3N0YXRpYyB2b2lkIGNsZWFyRGVjcnlwdEhhbmRsZShzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlKSB7CiAgICAgaWYgKGhhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC00MTQsNyArNDE0LDcgQEAKIH0KIAogc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6Y29uc3VtZVJpZ2h0cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKICAgICBBTE9HVigiY29uc3VtZVJpZ2h0cyIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKIApAQCAtNDMxLDcgKzQzMSw3IEBACiB9CiAKIHN0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OnNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgewogICAgIEFMT0dWKCJzZXRQbGF5YmFja1N0YXR1cyIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKIApAQCAtNjAzLDcgKzYwMyw3IEBACiAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogfQogCi1EZWNyeXB0SGFuZGxlKiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbiIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTYyMSw3ICs2MjEsNyBAQAogCiAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fREVDUllQVF9TRVNTSU9OLCBkYXRhLCAmcmVwbHkpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gTlVMTDsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGU7CiAgICAgaWYgKDAgIT0gcmVwbHkuZGF0YUF2YWlsKCkpIHsKICAgICAgICAgaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKICAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIHJlcGx5KTsKQEAgLTYyOSw3ICs2MjksNyBAQAogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKLURlY3J5cHRIYW5kbGUqIEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpIHsKIAogICAgIEFMT0dWKCJFbnRlcmluZyBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb246IG1pbWU9JXMiLCBtaW1lPyBtaW1lOiAiTlVMTCIpOwpAQCAtNjQ2LDcgKzY0Niw3IEBACiAKICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9ERUNSWVBUX1NFU1NJT05fRlJPTV9VUkksIGRhdGEsICZyZXBseSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBOVUxMOworICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZTsKICAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgewogICAgICAgICBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOwogICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgcmVwbHkpOwpAQCAtNjU2LDcgKzY1Niw3IEBACiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotRGVjcnlwdEhhbmRsZSogQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uIik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtNjczLDcgKzY3Myw3IEBACiAKICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9ERUNSWVBUX1NFU1NJT05fRk9SX1NUUkVBTUlORywgZGF0YSwgJnJlcGx5KTsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IE5VTEw7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlOwogICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CiAgICAgICAgIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CiAgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CkBAIC02ODMsNyArNjgzLDcgQEAKICAgICByZXR1cm4gaGFuZGxlOwogfQogCi1zdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgQUxPR1YoImNsb3NlRGVjcnlwdFNlc3Npb24iKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAKQEAgLTY5OCw3ICs2OTgsNyBAQAogfQogCiBzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjppbml0aWFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgewogICAgIEFMT0dWKCJpbml0aWFsaXplRGVjcnlwdFVuaXQiKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC03MTgsNyArNzE4LDcgQEAKIH0KIAogc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6ZGVjcnlwdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKICAgICBBTE9HVigiZGVjcnlwdCIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTc1NCw3ICs3NTQsNyBAQAogfQogCiBzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpmaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKICAgICBBTE9HVigiZmluYWxpemVEZWNyeXB0VW5pdCIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKIApAQCAtNzcwLDcgKzc3MCw3IEBACiB9CiAKIHNzaXplX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6cHJlYWQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSB7CiAgICAgQUxPR1YoInJlYWQiKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC0xMTI4LDE2ICsxMTI4LDE2IEBACiAKICAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlIGhhbmRsZTsKLSAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YSgmaGFuZGxlLCBkYXRhKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIGRhdGEpOwogCiAgICAgICAgIGNvbnN0IGludCBhY3Rpb24gPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICBjb25zdCBib29sIHJlc2VydmUgPSBzdGF0aWNfY2FzdDxib29sPihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzCi0gICAgICAgICAgICA9IGNvbnN1bWVSaWdodHModW5pcXVlSWQsICZoYW5kbGUsIGFjdGlvbiwgcmVzZXJ2ZSk7CisgICAgICAgICAgICA9IGNvbnN1bWVSaWdodHModW5pcXVlSWQsIGhhbmRsZSwgYWN0aW9uLCByZXNlcnZlKTsKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKIAotICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogICAgIH0KIApAQCAtMTE0OCwxNiArMTE0OCwxNiBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7Ci0gICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoJmhhbmRsZSwgZGF0YSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAogICAgICAgICBjb25zdCBpbnQgcGxheWJhY2tTdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICBjb25zdCBpbnQ2NF90IHBvc2l0aW9uID0gZGF0YS5yZWFkSW50NjQoKTsKICAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzCi0gICAgICAgICAgICA9IHNldFBsYXliYWNrU3RhdHVzKHVuaXF1ZUlkLCAmaGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOworICAgICAgICAgICAgPSBzZXRQbGF5YmFja1N0YXR1cyh1bmlxdWVJZCwgaGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOwogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogCi0gICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgfQogCkBAIC0xMzI5LDEzICsxMzI5LDEzIEBACiAgICAgICAgIGNvbnN0IG9mZjY0X3QgbGVuZ3RoID0gZGF0YS5yZWFkSW50NjQoKTsKICAgICAgICAgY29uc3QgU3RyaW5nOCBtaW1lID0gZGF0YS5yZWFkU3RyaW5nOCgpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZQorICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUKICAgICAgICAgICAgID0gb3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBmZCwgb2Zmc2V0LCBsZW5ndGgsIG1pbWUuc3RyaW5nKCkpOwogCi0gICAgICAgIGlmIChOVUxMICE9IGhhbmRsZSkgewotICAgICAgICAgICAgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKGhhbmRsZSwgcmVwbHkpOworICAgICAgICBpZiAoTlVMTCAhPSBoYW5kbGUuZ2V0KCkpIHsKKyAgICAgICAgICAgIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YShoYW5kbGUuZ2V0KCksIHJlcGx5KTsKICAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwotICAgICAgICAgICAgZGVsZXRlIGhhbmRsZTsgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgICAgIGhhbmRsZS5jbGVhcigpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgfQpAQCAtMTM0OSwxMyArMTM0OSwxMyBAQAogICAgICAgICBjb25zdCBTdHJpbmc4IHVyaSA9IGRhdGEucmVhZFN0cmluZzgoKTsKICAgICAgICAgY29uc3QgU3RyaW5nOCBtaW1lID0gZGF0YS5yZWFkU3RyaW5nOCgpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgdXJpLnN0cmluZygpLCBtaW1lLnN0cmluZygpKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gb3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCB1cmkuc3RyaW5nKCksIG1pbWUuc3RyaW5nKCkpOwogCi0gICAgICAgIGlmIChOVUxMICE9IGhhbmRsZSkgewotICAgICAgICAgICAgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKGhhbmRsZSwgcmVwbHkpOworICAgICAgICBpZiAoTlVMTCAhPSBoYW5kbGUuZ2V0KCkpIHsKKyAgICAgICAgICAgIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YShoYW5kbGUuZ2V0KCksIHJlcGx5KTsKIAogICAgICAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7Ci0gICAgICAgICAgICBkZWxldGUgaGFuZGxlOyBoYW5kbGUgPSBOVUxMOworICAgICAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVigiTlVMTCBkZWNyeXB0SGFuZGxlIGlzIHJldHVybmVkIik7CiAgICAgICAgIH0KQEAgLTEzNzMsMTMgKzEzNzMsMTIgQEAKICAgICAgICAgICAgICAgICBidWZmZXJTaXplKTsKICAgICAgICAgY29uc3QgU3RyaW5nOCBtaW1lVHlwZShkYXRhLnJlYWRTdHJpbmc4KCkpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgYnVmLCBtaW1lVHlwZSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgYnVmLCBtaW1lVHlwZSk7CiAKICAgICAgICAgaWYgKGhhbmRsZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CiAgICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKLSAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGU7Ci0gICAgICAgICAgICBoYW5kbGUgPSBOVUxMOworICAgICAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVigiTlVMTCBkZWNyeXB0SGFuZGxlIGlzIHJldHVybmVkIik7CiAgICAgICAgIH0KQEAgLTEzOTMsNyArMTM5Miw3IEBACiAKICAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOwogICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKICAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gY2xvc2VEZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgaGFuZGxlKTsKQEAgLTE0MDgsOCArMTQwNyw4IEBACiAKICAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlIGhhbmRsZTsKLSAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YSgmaGFuZGxlLCBkYXRhKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIGRhdGEpOwogCiAgICAgICAgIGNvbnN0IGludCBkZWNyeXB0VW5pdElkID0gZGF0YS5yZWFkSW50MzIoKTsKIApAQCAtMTQxNywxNyArMTQxNiwxNyBAQAogICAgICAgICBjb25zdCB1aW50MzJfdCBidWZmZXJTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgaWYgKGJ1ZmZlclNpemUgPiBkYXRhLmRhdGFBdmFpbCgpKSB7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihCQURfVkFMVUUpOwotICAgICAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKCZoYW5kbGUpOworICAgICAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogICAgICAgICB9CiAgICAgICAgIERybUJ1ZmZlciogaGVhZGVySW5mbyA9IE5VTEw7CiAgICAgICAgIGhlYWRlckluZm8gPSBuZXcgRHJtQnVmZmVyKChjaGFyICopZGF0YS5yZWFkSW5wbGFjZShidWZmZXJTaXplKSwgYnVmZmVyU2l6ZSk7CiAKICAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzCi0gICAgICAgICAgICA9IGluaXRpYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgJmhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7CisgICAgICAgICAgICA9IGluaXRpYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgaGFuZGxlLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKIAotICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICBkZWxldGUgaGVhZGVySW5mbzsgaGVhZGVySW5mbyA9IE5VTEw7CiAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgfQpAQCAtMTQzOSw4ICsxNDM4LDggQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOwotICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKCZoYW5kbGUsIGRhdGEpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZTsKKyAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIGRhdGEpOwogCiAgICAgICAgIGNvbnN0IGludCBkZWNyeXB0VW5pdElkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgY29uc3QgdWludDMyX3QgZGVjQnVmZmVyU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CkBAIC0xNDUwLDcgKzE0NDksNyBAQAogICAgICAgICAgICAgZGVjQnVmZmVyU2l6ZSA+IE1BWF9CSU5ERVJfVFJBTlNBQ1RJT05fU0laRSkgewogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoQkFEX1ZBTFVFKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOwotICAgICAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKCZoYW5kbGUpOworICAgICAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTE0NzAsNyArMTQ2OSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMKLSAgICAgICAgICAgID0gZGVjcnlwdCh1bmlxdWVJZCwgJmhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgZW5jQnVmZmVyLCAmZGVjQnVmZmVyLCBJVik7CisgICAgICAgICAgICA9IGRlY3J5cHQodW5pcXVlSWQsIGhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgZW5jQnVmZmVyLCAmZGVjQnVmZmVyLCBJVik7CiAKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKIApAQCAtMTQ4MCw3ICsxNDc5LDcgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZShkZWNCdWZmZXItPmRhdGEsIHNpemUpOwogICAgICAgICB9CiAKLSAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKCZoYW5kbGUpOworICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgZGVsZXRlIGVuY0J1ZmZlcjsgZW5jQnVmZmVyID0gTlVMTDsKICAgICAgICAgZGVsZXRlIGRlY0J1ZmZlcjsgZGVjQnVmZmVyID0gTlVMTDsKICAgICAgICAgZGVsZXRlIFtdIGJ1ZmZlcjsgYnVmZmVyID0gTlVMTDsKQEAgLTE0OTUsMTMgKzE0OTQsMTMgQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOwotICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKCZoYW5kbGUsIGRhdGEpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKLSAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gZmluYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgJmhhbmRsZSwgZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IGZpbmFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsIGhhbmRsZSwgZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAKLSAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKCZoYW5kbGUpOworICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICB9CiAKQEAgLTE1MTIsOCArMTUxMSw4IEBACiAKICAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlIGhhbmRsZTsKLSAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YSgmaGFuZGxlLCBkYXRhKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIGRhdGEpOwogCiAgICAgICAgIGNvbnN0IHVpbnQzMl90IG51bUJ5dGVzID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgaWYgKG51bUJ5dGVzID4gTUFYX0JJTkRFUl9UUkFOU0FDVElPTl9TSVpFKSB7CkBAIC0xNTI0LDEzICsxNTIzLDEzIEBACiAKICAgICAgICAgY29uc3Qgb2ZmNjRfdCBvZmZzZXQgPSBkYXRhLnJlYWRJbnQ2NCgpOwogCi0gICAgICAgIHNzaXplX3QgcmVzdWx0ID0gcHJlYWQodW5pcXVlSWQsICZoYW5kbGUsIGJ1ZmZlciwgbnVtQnl0ZXMsIG9mZnNldCk7CisgICAgICAgIHNzaXplX3QgcmVzdWx0ID0gcHJlYWQodW5pcXVlSWQsIGhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKICAgICAgICAgaWYgKDAgPCByZXN1bHQpIHsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZShidWZmZXIsIHJlc3VsdCk7CiAgICAgICAgIH0KIAotICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICBkZWxldGUgW10gYnVmZmVyLCBidWZmZXIgPSBOVUxMOwogICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogICAgIH0KZGlmZiAtLWdpdCBhL2RybS9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmggYi9kcm0vY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oCmluZGV4IDQxNzEwN2YuLjczZjExYTQgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmgKKysrIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaApAQCAtNTksMTAgKzU5LDExIEBACiAKICAgICBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKTsKIAotICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwKKyAgICAgICAgICAgIGJvb2wgcmVzZXJ2ZSk7CiAKICAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CiAKICAgICBib29sIHZhbGlkYXRlQWN0aW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOwpAQCAtODAsMjcgKzgxLDI4IEBACiAgICAgRHJtU3VwcG9ydEluZm8qIGdldFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCk7CiAKICAgICBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpOwogCiAgICAgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSk7CiAKLSAgICBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKIAotICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKyAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpOwogCi0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOwogCi0gICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKIAotICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CisgICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQpOwogCi0gICAgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCk7CiAKIHByb3RlY3RlZDoKQEAgLTI2NSw3ICsyNjcsNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpID0gMDsKIAogICAgIC8qKgpAQCAtMjgwLDcgKzI4Miw4IEBACiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25TZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSA9IDA7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsCisgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBWYWxpZGF0ZXMgd2hldGhlciBhbiBhY3Rpb24gb24gdGhlIERSTSBjb250ZW50IGlzIGFsbG93ZWQgb3Igbm90LgpAQCAtMzgxLDcgKzM4NCw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKSA9IDA7CiAKICAgICAvKioKQEAgLTM5OCw3ICs0MDEsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCAvKiB1bmlxdWVJZCAqLywgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgIGludCAvKiB1bmlxdWVJZCAqLywgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sCiAgICAgICAgICAgICBpbnQgLyogZmQgKi8sIG9mZjY0X3QgLyogb2Zmc2V0ICovLCBvZmY2NF90IC8qIGxlbmd0aCAqLywKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIG1pbWUgKi8pIHsKIApAQCAtNDE1LDcgKzQxOCw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSkgPSAwOwogCiAgICAgLyoqCkBAIC00MzAsNyArNDMzLDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgLyogdW5pcXVlSWQgKi8sIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICBpbnQgLyogdW5pcXVlSWQgKi8sIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgY29uc3QgY2hhciogLyogdXJpICovLCBjb25zdCBjaGFyKiAvKiBtaW1lICovKSB7CiAKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwpAQCAtNDQ3LDcgKzQ1MCw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciYgLyogYnVmICovLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgLyogbWltZVR5cGUgKi8pIHsKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwpAQCAtNDYxLDcgKzQ2NCw3IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBJbml0aWFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudApAQCAtNDczLDcgKzQ3Niw3IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSA9IDA7CiAKICAgICAvKioKQEAgLTQ5Myw3ICs0OTYsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKICAgICAgKiAgICAgRFJNX0VSUk9SX0RFQ1JZUFQgZm9yIGZhaWx1cmUuCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpID0gMDsKIAogICAgIC8qKgpAQCAtNTA2LDcgKzUwOSw3IEBACiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25GaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgPSAwOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpID0gMDsKIAogICAgIC8qKgogICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYW4gb3BlbiBEUk0gZmlsZS4KQEAgLTUxOSw3ICs1MjIsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgcmVhZC4gUmV0dXJucyAtMSBmb3IgRmFpbHVyZS4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHNzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzc2l6ZV90IG9uUHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpID0gMDsKIH07CiAKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmggYi9kcm0vY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oCmluZGV4IGFjYzhlZDkuLjE4MzdhMTEgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmgKKysrIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaApAQCAtMjEwLDcgKzIxMCw3IEBACiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSA9IDA7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpID0gMDsKIAogICAgIC8qKgogICAgICAqIEluZm9ybXMgdGhlIERSTSBFbmdpbmUgYWJvdXQgdGhlIHBsYXliYWNrIGFjdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBEUk0gZmlsZXMuCkBAIC0yMjMsNyArMjIzLDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgPSAwOwogCiAgICAgLyoqCkBAIC0zMjcsNyArMzI3LDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKSA9IDA7CiAKICAgICAvKioKQEAgLTM0Miw3ICszNDIsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKSA9IDA7CiAKICAgICAvKioKQEAgLTM1NSw3ICszNTUsNyBAQAogICAgICAqIEByZXR1cm4KICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSA9IDA7CiAKICAgICAvKioKQEAgLTM2Niw3ICszNjYsNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBJbml0aWFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudApAQCAtMzc4LDcgKzM3OCw3IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pID0gMDsKIAogICAgIC8qKgpAQCAtMzk4LDcgKzM5OCw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9TRVNTSU9OX05PVF9PUEVORUQsIERSTV9FUlJPUl9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVELAogICAgICAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSA9IDA7CiAKICAgICAvKioKQEAgLTQxMSw3ICs0MTEsNyBAQAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhbiBvcGVuIERSTSBmaWxlLgpAQCAtNDI0LDcgKzQyNCw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyByZWFkLiBSZXR1cm5zIC0xIGZvciBGYWlsdXJlLgogICAgICAqLwotICAgIHZpcnR1YWwgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSA9IDA7CiB9OwogCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL2luY2x1ZGUvSURybU1hbmFnZXJTZXJ2aWNlLmggYi9kcm0vY29tbW9uL2luY2x1ZGUvSURybU1hbmFnZXJTZXJ2aWNlLmgKaW5kZXggMDM3NmI0OS4uODM2YWUwYSAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1NYW5hZ2VyU2VydmljZS5oCisrKyBiL2RybS9jb21tb24vaW5jbHVkZS9JRHJtTWFuYWdlclNlcnZpY2UuaApAQCAtMTE1LDEwICsxMTUsMTEgQEAKICAgICB2aXJ0dWFsIGludCBjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSA9IDA7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgPSAwOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLAorICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvbikgPSAwOwogCiAgICAgdmlydHVhbCBib29sIHZhbGlkYXRlQWN0aW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLApAQCAtMTM4LDI4ICsxMzksMjggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KSA9IDA7CiAKLSAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpID0gMDsKIAotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKSA9IDA7CiAKLSAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgPSAwOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpID0gMDsKIAotICAgIHZpcnR1YWwgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsb2ZmNjRfdCBvZmZzZXQpID0gMDsKIH07CiAKQEAgLTIwMywxMCArMjA0LDEwIEBACiAgICAgdmlydHVhbCBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKIAogICAgIHZpcnR1YWwgYm9vbCB2YWxpZGF0ZUFjdGlvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKQEAgLTIyNSwyOCArMjI2LDI4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBbGxTdXBwb3J0SW5mbygKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSk7CiAKLSAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLAogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1pbWUpOwogCi0gICAgdmlydHVhbCBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpOwogCi0gICAgdmlydHVhbCBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVik7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKIAotICAgIHZpcnR1YWwgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KTsKIH07CiAKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCmluZGV4IGJmMDRhODkuLmFmYmNiMzkgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcApAQCAtMjY3LDcgKzI2Nyw3IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXI6OmNvbnN1bWVSaWdodHMoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgewpAQCAtMjc4LDcgKzI3OCw3IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXI6OnNldFBsYXliYWNrU3RhdHVzKAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgaWYgKG1EZWNyeXB0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKQEAgLTM5NiwxNSArMzk2LDE1IEBACiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAotRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKICAgICBWZWN0b3I8U3RyaW5nOD4gcGx1Z0luSWRMaXN0ID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luSWRMaXN0KCk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOwotICAgIGlmIChOVUxMICE9IGhhbmRsZSkgeworICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgaWYgKE5VTEwgIT0gaGFuZGxlLmdldCgpKSB7CiAgICAgICAgIGhhbmRsZS0+ZGVjcnlwdElkID0gbURlY3J5cHRTZXNzaW9uSWQgKyAxOwogCiAgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CkBAIC00MjAsMTkgKzQyMCwxOSBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChEUk1fTk9fRVJST1IgIT0gcmVzdWx0KSB7Ci0gICAgICAgIGRlbGV0ZSBoYW5kbGU7IGhhbmRsZSA9IE5VTEw7CisgICAgICAgIGhhbmRsZS5jbGVhcigpOwogICAgIH0KICAgICByZXR1cm4gaGFuZGxlOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CiAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKLSAgICBpZiAoTlVMTCAhPSBoYW5kbGUpIHsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgIGlmIChOVUxMICE9IGhhbmRsZS5nZXQoKSkgewogICAgICAgICBoYW5kbGUtPmRlY3J5cHRJZCA9IG1EZWNyeXB0U2Vzc2lvbklkICsgMTsKIAogICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgewpAQCAtNDQ4LDIwICs0NDgsMjAgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoRFJNX05PX0VSUk9SICE9IHJlc3VsdCkgewotICAgICAgICBkZWxldGUgaGFuZGxlOyBoYW5kbGUgPSBOVUxMOworICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICAgICAgQUxPR1YoIkRybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbjogbm8gY2FwYWJsZSBwbHVnLWluIGZvdW5kIik7CiAgICAgfQogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKLURlY3J5cHRIYW5kbGUqIERybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKICAgICBWZWN0b3I8U3RyaW5nOD4gcGx1Z0luSWRMaXN0ID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luSWRMaXN0KCk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOwotICAgIGlmIChOVUxMICE9IGhhbmRsZSkgeworICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgaWYgKE5VTEwgIT0gaGFuZGxlLmdldCgpKSB7CiAgICAgICAgIGhhbmRsZS0+ZGVjcnlwdElkID0gbURlY3J5cHRTZXNzaW9uSWQgKyAxOwogCiAgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CkBAIC00NzcsMjAgKzQ3NywxOSBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChEUk1fTk9fRVJST1IgIT0gcmVzdWx0KSB7Ci0gICAgICAgIGRlbGV0ZSBoYW5kbGU7Ci0gICAgICAgIGhhbmRsZSA9IE5VTEw7CisgICAgICAgIGhhbmRsZS5jbGVhcigpOwogICAgICAgICBBTE9HVigiRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uOiBubyBjYXBhYmxlIHBsdWctaW4gZm91bmQiKTsKICAgICB9CiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotc3RhdHVzX3QgRHJtTWFuYWdlcjo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKK3N0YXR1c190IERybU1hbmFnZXI6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CiAgICAgICAgIElEcm1FbmdpbmUqIGRybUVuZ2luZSA9IG1EZWNyeXB0U2Vzc2lvbk1hcC52YWx1ZUZvcihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOwogICAgICAgICByZXN1bHQgPSBkcm1FbmdpbmUtPmNsb3NlRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUpOwotICAgICAgICBpZiAoRFJNX05PX0VSUk9SID09IHJlc3VsdCkgeworICAgICAgICBpZiAoRFJNX05PX0VSUk9SID09IHJlc3VsdCAmJiBOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgICAgIG1EZWNyeXB0U2Vzc2lvbk1hcC5yZW1vdmVJdGVtKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CiAgICAgICAgIH0KICAgICB9CkBAIC00OTgsNyArNDk3LDggQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlcjo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgeworICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgaWYgKG1EZWNyeXB0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKQEAgLTUwOCw3ICs1MDgsNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXR1c190IERybU1hbmFnZXI6OmRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKK3N0YXR1c190IERybU1hbmFnZXI6OmRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CiAKQEAgLTUyMiw3ICs1MjIsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyOjpmaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgewpAQCAtNTMyLDcgKzUzMiw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3NpemVfdCBEcm1NYW5hZ2VyOjpwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitzc2l6ZV90IERybU1hbmFnZXI6OnByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSB7CiAgICAgc3NpemVfdCByZXN1bHQgPSBERUNSWVBUX0ZJTEVfRVJST1I7CiAKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5oIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmgKaW5kZXggZTdjZGQzNi4uMjYyMjJiYyAxMDA2NDQKLS0tIGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmgKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmgKQEAgLTg5LDEwICs4OSwxMSBAQAogCiAgICAgaW50IGNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbik7CiAKLSAgICBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKKyAgICBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sCisgICAgICAgICAgICBib29sIHJlc2VydmUpOwogCiAgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOwogCiAgICAgYm9vbCB2YWxpZGF0ZUFjdGlvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKQEAgLTEwOSwyNSArMTEwLDI2IEBACiAKICAgICBzdGF0dXNfdCBnZXRBbGxTdXBwb3J0SW5mbyhpbnQgdW5pcXVlSWQsIGludCogbGVuZ3RoLCBEcm1TdXBwb3J0SW5mbyoqIGRybVN1cHBvcnRJbmZvQXJyYXkpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKTsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsCisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CiAKLSAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisgICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAotICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKIAotICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVik7CiAKLSAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOworICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkKTsKIAotICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpOwogCiAgICAgdm9pZCBvbkluZm8oY29uc3QgRHJtSW5mb0V2ZW50JiBldmVudCk7CmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcCBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCmluZGV4IGRhZDU5OWIuLjI2MDBhMmMgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCkBAIC01OCwyMiArNTgsMjYgQEAKICAgICByZXR1cm4gZHJtX3Blcm1fbGFiZWxzW2luZGV4XTsKIH0KIAotYm9vbCBEcm1NYW5hZ2VyU2VydmljZTo6c2VsaW51eElzUHJvdGVjdGVkQ2FsbEFsbG93ZWQocGlkX3Qgc3BpZCwgZHJtX3Blcm1fdCBwZXJtKSB7Citib29sIERybU1hbmFnZXJTZXJ2aWNlOjpzZWxpbnV4SXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChwaWRfdCBzcGlkLCBjb25zdCBjaGFyKiBzc2lkLCBkcm1fcGVybV90IHBlcm0pIHsKICAgICBpZiAoc2VsaW51eF9lbmFibGVkIDw9IDApIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgY2hhciAqc2N0eDsKKyAgICBjaGFyICpzY3R4ID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpzZWxpbnV4X2NsYXNzID0gImRybXNlcnZpY2UiOwogICAgIGNvbnN0IGNoYXIgKnN0cl9wZXJtID0gZ2V0X3Blcm1fbGFiZWwocGVybSk7CiAKLSAgICBpZiAoZ2V0cGlkY29uKHNwaWQsICZzY3R4KSAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJTRUxpbnV4OiBnZXRwaWRjb24ocGlkPSVkKSBmYWlsZWQuXG4iLCBzcGlkKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzc2lkID09IE5VTEwpIHsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMjEwMzUwNDIiKTsKKworICAgICAgICBpZiAoZ2V0cGlkY29uKHNwaWQsICZzY3R4KSAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiU0VMaW51eDogZ2V0cGlkY29uKHBpZD0lZCkgZmFpbGVkLlxuIiwgc3BpZCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBib29sIGFsbG93ZWQgPSAoc2VsaW51eF9jaGVja19hY2Nlc3Moc2N0eCwgZHJtc2VydmVyX2NvbnRleHQsIHNlbGludXhfY2xhc3MsCi0gICAgICAgICAgICBzdHJfcGVybSwgTlVMTCkgPT0gMCk7CisgICAgYm9vbCBhbGxvd2VkID0gKHNlbGludXhfY2hlY2tfYWNjZXNzKHNzaWQgPyBzc2lkIDogc2N0eCwgZHJtc2VydmVyX2NvbnRleHQsCisgICAgICAgICAgICBzZWxpbnV4X2NsYXNzLCBzdHJfcGVybSwgTlVMTCkgPT0gMCk7CiAgICAgZnJlZWNvbihzY3R4KTsKIAogICAgIHJldHVybiBhbGxvd2VkOwpAQCAtODYsMTAgKzkwLDExIEBACiAgICAgSVBDVGhyZWFkU3RhdGUqIGlwY1N0YXRlID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKICAgICB1aWRfdCB1aWQgPSBpcGNTdGF0ZS0+Z2V0Q2FsbGluZ1VpZCgpOwogICAgIHBpZF90IHNwaWQgPSBpcGNTdGF0ZS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGNoYXIqIHNzaWQgPSBpcGNTdGF0ZS0+Z2V0Q2FsbGluZ1NpZCgpOwogCiAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB0cnVzdGVkVWlkcy5zaXplKCk7ICsraSkgewogICAgICAgICBpZiAodHJ1c3RlZFVpZHNbaV0gPT0gdWlkKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2VsaW51eElzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoc3BpZCwgcGVybSk7CisgICAgICAgICAgICByZXR1cm4gc2VsaW51eElzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoc3BpZCwgc3NpZCwgcGVybSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtOTcsNyArMTAyLDkgQEAKIAogdm9pZCBEcm1NYW5hZ2VyU2VydmljZTo6aW5zdGFudGlhdGUoKSB7CiAgICAgQUxPR1YoImluc3RhbnRpYXRlIik7Ci0gICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmFkZFNlcnZpY2UoU3RyaW5nMTYoImRybS5kcm1NYW5hZ2VyIiksIG5ldyBEcm1NYW5hZ2VyU2VydmljZSgpKTsKKyAgICBzcDxEcm1NYW5hZ2VyU2VydmljZT4gc2VydmljZSA9IG5ldyBEcm1NYW5hZ2VyU2VydmljZSgpOworICAgIHNlcnZpY2UtPnNldFJlcXVlc3RpbmdTaWQodHJ1ZSk7CisgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmFkZFNlcnZpY2UoU3RyaW5nMTYoImRybS5kcm1NYW5hZ2VyIiksIHNlcnZpY2UpOwogCiAgICAgaWYgKDAgPj0gdHJ1c3RlZFVpZHMuc2l6ZSgpKSB7CiAgICAgICAgIC8vIFRPRE8KQEAgLTIwNiw3ICsyMTMsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6Y29uc3VtZVJpZ2h0cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgY29uc3VtZVJpZ2h0cyIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChDT05TVU1FX1JJR0hUUykpIHsKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9OT19QRVJNSVNTSU9OOwpAQCAtMjE1LDcgKzIyMiw3IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKICAgICBBTE9HVigiRW50ZXJpbmcgc2V0UGxheWJhY2tTdGF0dXMiKTsKICAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoU0VUX1BMQVlCQUNLX1NUQVRVUykpIHsKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9OT19QRVJNSVNTSU9OOwpAQCAtMjYyLDcgKzI2OSw3IEBACiAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5nZXRBbGxTdXBwb3J0SW5mbyh1bmlxdWVJZCwgbGVuZ3RoLCBkcm1TdXBwb3J0SW5mb0FycmF5KTsKIH0KIAotRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24iKTsKICAgICBpZiAoaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChPUEVOX0RFQ1JZUFRfU0VTU0lPTikpIHsKQEAgLTI3Miw3ICsyNzksNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24gd2l0aCB1cmkiKTsKICAgICBpZiAoaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChPUEVOX0RFQ1JZUFRfU0VTU0lPTikpIHsKQEAgLTI4Miw3ICsyODksNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24gZm9yIHN0cmVhbWluZyIpOwogICAgIGlmIChpc1Byb3RlY3RlZENhbGxBbGxvd2VkKE9QRU5fREVDUllQVF9TRVNTSU9OKSkgewpAQCAtMjkyLDcgKzI5OSw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBjbG9zZURlY3J5cHRTZXNzaW9uIik7CiAgICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKENMT1NFX0RFQ1JZUFRfU0VTU0lPTikpIHsKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9OT19QRVJNSVNTSU9OOwpAQCAtMzAwLDcgKzMwNyw3IEBACiAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5jbG9zZURlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlKTsKIH0KIAotc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIGluaXRpYWxpemVEZWNyeXB0VW5pdCIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChJTklUSUFMSVpFX0RFQ1JZUFRfVU5JVCkpIHsKQEAgLTMxMCw3ICszMTcsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6ZGVjcnlwdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgZGVjcnlwdCIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChERUNSWVBUKSkgewpAQCAtMzIwLDcgKzMyNyw3IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpmaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgZmluYWxpemVEZWNyeXB0VW5pdCIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChGSU5BTElaRV9ERUNSWVBUX1VOSVQpKSB7CiAgICAgICAgIHJldHVybiBEUk1fRVJST1JfTk9fUEVSTUlTU0lPTjsKQEAgLTMyOCw3ICszMzUsNyBAQAogICAgIHJldHVybiBtRHJtTWFuYWdlci0+ZmluYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCk7CiB9CiAKLXNzaXplX3QgRHJtTWFuYWdlclNlcnZpY2U6OnByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK3NzaXplX3QgRHJtTWFuYWdlclNlcnZpY2U6OnByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIHByZWFkIik7CiAgICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKFBSRUFEKSkgewpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5oIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5oCmluZGV4IDQ1Y2VlMmUuLjJlMjdhM2MgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuaAorKysgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmgKQEAgLTYwLDcgKzYwLDcgQEAKIAogICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRfcGVybV9sYWJlbChkcm1fcGVybV90IHBlcm0pOwogCi0gICAgc3RhdGljIGJvb2wgc2VsaW51eElzUHJvdGVjdGVkQ2FsbEFsbG93ZWQocGlkX3Qgc3BpZCwgZHJtX3Blcm1fdCBwZXJtKTsKKyAgICBzdGF0aWMgYm9vbCBzZWxpbnV4SXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChwaWRfdCBzcGlkLCBjb25zdCBjaGFyKiBzc2lkLCBkcm1fcGVybV90IHBlcm0pOwogCiAgICAgc3RhdGljIGJvb2wgaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChkcm1fcGVybV90IHBlcm0pOwogCkBAIC05NSwxMCArOTUsMTEgQEAKIAogICAgIGludCBjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsaW50IGFjdGlvbik7CiAKLSAgICBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKKyAgICBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sCisgICAgICAgICAgICBib29sIHJlc2VydmUpOwogCiAgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOwogCiAgICAgYm9vbCB2YWxpZGF0ZUFjdGlvbihpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsCiAgICAgICAgICAgICBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOwpAQCAtMTE1LDI2ICsxMTYsMjcgQEAKIAogICAgIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyICptaW1lKTsKIAotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKTsKIAotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLAorICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOwogCi0gICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSk7CiAKLSAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKLSAgICBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOwogCi0gICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKyAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCk7CiAKLSAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcAppbmRleCBjMDQ3ZWIxLi5iMGE0NDFiIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcApAQCAtMTgzLDcgKzE4Myw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5jb25zdW1lUmlnaHRzKAotICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBhY3Rpb24sIHJlc2VydmUpOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBhY3Rpb24sIHJlc2VydmUpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMTk0LDcgKzE5NCw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5zZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSwgcGxheWJhY2tTdGF0dXMsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgcGxheWJhY2tTdGF0dXMsIHBvc2l0aW9uKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTI2Nyw3ICsyNjcsNyBAQAogc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlckNsaWVudEltcGw6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpIHsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IE5VTEw7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlOwogICAgIGlmIChOVUxMICE9IHVyaSkgewogICAgICAgICBoYW5kbGUgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5vcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIHVyaSwgbWltZSk7CiAgICAgfQpAQCAtMjg0LDcgKzI4NCw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5jbG9zZURlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpKTsKKyAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC0yOTUsNyArMjk1LDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgJiYgKE5VTEwgIT0gaGVhZGVySW5mbykpIHsKICAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+aW5pdGlhbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKKyAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC0zMDgsNyArMzA4LDcgQEAKICAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgJiYgKE5VTEwgIT0gZW5jQnVmZmVyKQogICAgICAgICAmJiAoTlVMTCAhPSBkZWNCdWZmZXIpICYmIChOVUxMICE9ICpkZWNCdWZmZXIpKSB7CiAgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmRlY3J5cHQoCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICAgICAgZW5jQnVmZmVyLCBkZWNCdWZmZXIsIElWKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTMxOSw3ICszMTksNyBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+ZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIGRlY3J5cHRVbml0SWQpOworICAgICAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC0zMjksNyArMzI5LDcgQEAKICAgICBzc2l6ZV90IHJldENvZGUgPSBJTlZBTElEX1ZBTFVFOwogICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSAmJiAoTlVMTCAhPSBidWZmZXIpICYmICgwIDwgbnVtQnl0ZXMpKSB7CiAgICAgICAgIHJldENvZGUgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5wcmVhZCgKLSAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKICAgICB9CiAgICAgcmV0dXJuIHJldENvZGU7CiB9CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmgKaW5kZXggYTU3MWIzYS4uYjYyZGRiOSAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZS5oCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaApAQCAtMTk4LDcgKzE5OCw3IEBACiAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgKi8KIHN0YXR1c190IG9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVzZXJ2ZSk7CiAKQEAgLTIxNSwxMiArMjE1LDEyIEBACiAgKi8KICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQogc3RhdHVzX3Qgb25TZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb24pOwogI2Vsc2UKIHN0YXR1c190IG9uU2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYXliYWNrU3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24pOwogI2VuZGlmCkBAIC0zMzAsMTEgKzMzMCwxMSBAQAogICovCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKTsKICNlbHNlCiBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOwogI2VuZGlmCiAKQEAgLTM0OCw3ICszNDgsNyBAQAogICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAqLwogc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXJpKTsKIAogLyoqCkBAIC0zNjAsNyArMzYwLDcgQEAKICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAqLwogc3RhdHVzX3Qgb25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSk7CiAKIC8qKgogICogSW5pdGlhbGl6ZSBkZWNyeXB0aW9uIGZvciB0aGUgZ2l2ZW4gdW5pdCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQuCkBAIC0zNzMsNyArMzczLDcgQEAKICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgKi8KIHN0YXR1c190IG9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKIApAQCAtMzk0LDcgKzM5NCw3IEBACiAgKiAgICAgRFJNX0VSUk9SX0RFQ1JZUFQgZm9yIGZhaWx1cmUuCiAgKi8KIHN0YXR1c190IG9uRGVjcnlwdChpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwKICAgICAgICAgICAgICAgICAgICBEcm1CdWZmZXIqKiBkZWNCdWZmZXIpOwpAQCAtNDE2LDcgKzQxNiw3IEBACiAgKiAgICAgRFJNX0VSUk9SX1NFU1NJT05fTk9UX09QRU5FRCwgRFJNX0VSUk9SX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQsCiAgKiAgICAgRFJNX0VSUk9SX0RFQ1JZUFQgZm9yIGZhaWx1cmUuCiAgKi8KLXN0YXR1c190IG9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKIApAQCAtNDMwLDcgKzQzMCw3IEBACiAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICovCiBzdGF0dXNfdCBvbkZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQpOwogCiAvKioKQEAgLTQ0NSw3ICs0NDUsNyBAQAogICogQHJldHZhbCAtMSBGYWlsdXJlLgogICovCiBzc2l6ZV90IG9uUmVhZChpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICB2b2lkKiBwQnVmZmVyLAogICAgICAgICAgICAgICAgaW50IG51bUJ5dGVzKTsKIApAQCAtNDYzLDEyICs0NjMsMTIgQEAKICAqLwogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCiBvZmY2NF90IG9uTHNlZWsoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgaW50IHdoZW5jZSk7CiAjZWxzZQogb2ZmX3Qgb25Mc2VlayhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICBvZmZfdCBvZmZzZXQsCiAgICAgICAgICAgICAgIGludCB3aGVuY2UpOwogI2VuZGlmCkBAIC00ODYsMTMgKzQ4NiwxMyBAQAogICovCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKIHNzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCiAgICAgICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlcywKICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7CiAjZWxzZQogc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAogICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCk7CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcAppbmRleCA3M2VlYTg5Li43NjlkZTBjIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKQEAgLTI5NCw3ICsyOTQsNyBAQAogfQogCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkNvbnN1bWVSaWdodHMoaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGFjdGlvbiAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIC8qIHJlc2VydmUgKi8pIHsKICAgICAvLyBObyByaWdodHMgY29uc3VtcHRpb24KQEAgLTM3MiwxMSArMzcyLDEzIEBACiB9CiAKICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQotc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyhpbnQgLyogdW5pcXVlSWQgKi8sIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBwbGF5YmFja1N0YXR1cyAqLywgaW50NjRfdCAvKiBwb3NpdGlvbiAqLykgeworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyhpbnQgLyogdW5pcXVlSWQgKi8sCisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLCBpbnQgLyogcGxheWJhY2tTdGF0dXMgKi8sCisgICAgICAgIGludDY0X3QgLyogcG9zaXRpb24gKi8pIHsKICNlbHNlCi1zdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzKGludCAvKiB1bmlxdWVJZCAqLywgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIHBsYXliYWNrU3RhdHVzICovLCBpbnQgLyogcG9zaXRpb24gKi8pIHsKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uU2V0UGxheWJhY2tTdGF0dXMoaW50IC8qIHVuaXF1ZUlkICovLAorICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgaW50IC8qIHBsYXliYWNrU3RhdHVzICovLCBpbnQgLyogcG9zaXRpb24gKi8pIHsKICNlbmRpZgogICAgIC8vIE5vdCB1c2VkCiAgICAgTE9HX1ZFUkJPU0UoIkZ3ZExvY2tFbmdpbmU6Om9uU2V0UGxheWJhY2tTdGF0dXMiKTsKQEAgLTQ3MCwxMyArNDcyLDEzIEBACiAKICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24oaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IC8qIGxlbmd0aCAqLykgewogI2Vsc2UKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogbGVuZ3RoICovKSB7CkBAIC00ODcsNyArNDg5LDcgQEAKICAgICBMT0dfVkVSQk9TRSgiRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24iKTsKIAogICAgIGlmICgoLTEgPCBmZCkgJiYKLSAgICAgICAgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgJiYKKyAgICAgICAgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgJiYKICAgICAgICAgKCFkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSkgewogICAgICAgICBmaWxlRGVzYyA9IGR1cChmZCk7CiAgICAgfSBlbHNlIHsKQEAgLTUzMywxMiArNTM1LDEyIEBACiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSkgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogICAgIGNvbnN0IGNoYXIgZmlsZVRhZyBbXSA9ICJmaWxlOi8vIjsKIAotICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUgJiYgTlVMTCAhPSB1cmkgJiYgc3RybGVuKHVyaSkgPiBzaXplb2YoZmlsZVRhZykpIHsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpICYmIE5VTEwgIT0gdXJpICYmIHN0cmxlbih1cmkpID4gc2l6ZW9mKGZpbGVUYWcpKSB7CiAgICAgICAgIFN0cmluZzggdXJpVGFnID0gU3RyaW5nOCh1cmkpOwogICAgICAgICB1cmlUYWcudG9Mb3dlcigpOwogCkBAIC01NjIsMTEgKzU2NCwxMSBAQAogfQogCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIExPR19WRVJCT1NFKCJGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24iKTsKIAotICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUgJiYgZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSkgeworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkgJiYgZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSkgewogICAgICAgICBEZWNvZGVTZXNzaW9uKiBzZXNzaW9uID0gZGVjb2RlU2Vzc2lvbk1hcC5nZXRWYWx1ZShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOwogICAgICAgICBpZiAoTlVMTCAhPSBzZXNzaW9uICYmIHNlc3Npb24tPmZpbGVEZXNjID4gLTEpIHsKICAgICAgICAgICAgIEZ3ZExvY2tGaWxlX2RldGFjaChzZXNzaW9uLT5maWxlRGVzYyk7CkBAIC01NzYsNyArNTc4LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUpIHsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvKSB7CiAgICAgICAgICAgICBkZWxldGUgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm87CiAgICAgICAgICAgICBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7CkBAIC01ODQsOSArNTg2LDcgQEAKIAogICAgICAgICBkZWNyeXB0SGFuZGxlLT5jb3B5Q29udHJvbFZlY3Rvci5jbGVhcigpOwogICAgICAgICBkZWNyeXB0SGFuZGxlLT5leHRlbmRlZERhdGEuY2xlYXIoKTsKLQotICAgICAgICBkZWxldGUgZGVjcnlwdEhhbmRsZTsKLSAgICAgICAgZGVjcnlwdEhhbmRsZSA9IE5VTEw7CisgICAgICAgIGRlY3J5cHRIYW5kbGUuY2xlYXIoKTsKICAgICB9CiAKICAgICBMT0dfVkVSQk9TRSgiRndkTG9ja0VuZ2luZTo6b25DbG9zZURlY3J5cHRTZXNzaW9uIEV4aXQiKTsKQEAgLTU5NCw3ICs1OTQsNyBAQAogfQogCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogZGVjcnlwdFVuaXRJZCAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogLyogaGVhZGVySW5mbyAqLykgewogICAgIEFMT0dFKCJGd2RMb2NrRW5naW5lOjpvbkluaXRpYWxpemVEZWNyeXB0VW5pdCBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIERSTSBzY2hlbWUiKTsKQEAgLTYwMyw3ICs2MDMsNyBAQAogCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkRlY3J5cHQoCiAgICAgICAgICAgICBpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sCiAgICAgICAgICAgICBpbnQgLyogZGVjcnlwdFVuaXRJZCAqLywKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogLyogZW5jQnVmZmVyICovLAogICAgICAgICAgICAgRHJtQnVmZmVyKiogLyogZGVjQnVmZmVyICovLApAQCAtNjEzLDcgKzYxMyw3IEBACiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uRGVjcnlwdChpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogZGVjcnlwdFVuaXRJZCAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIC8qIGVuY0J1ZmZlciAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1CdWZmZXIqKiAvKiBkZWNCdWZmZXIgKi8pIHsKQEAgLTYyMiwxOSArNjIyLDE5IEBACiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uRmluYWxpemVEZWNyeXB0VW5pdChpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogZGVjcnlwdFVuaXRJZCAqLykgewogICAgIEFMT0dFKCJGd2RMb2NrRW5naW5lOjpvbkZpbmFsaXplRGVjcnlwdFVuaXQgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBEUk0gc2NoZW1lIik7CiAgICAgcmV0dXJuIERSTV9FUlJPUl9VTktOT1dOOwogfQogCiBzc2l6ZV90IEZ3ZExvY2tFbmdpbmU6Om9uUmVhZChpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQnl0ZXMpIHsKICAgICBzc2l6ZV90IHNpemUgPSAtMTsKIAotICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUgJiYKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpICYmCiAgICAgICAgIGRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgJiYKICAgICAgICAgTlVMTCAhPSBidWZmZXIgJiYKICAgICAgICAgbnVtQnl0ZXMgPiAtMSkgewpAQCAtNjU0LDE1ICs2NTQsMTUgQEAKIH0KIAogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCi1vZmY2NF90IEZ3ZExvY2tFbmdpbmU6Om9uTHNlZWsoaW50IC8qIHVuaXF1ZUlkICovLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorb2ZmNjRfdCBGd2RMb2NrRW5naW5lOjpvbkxzZWVrKGludCAvKiB1bmlxdWVJZCAqLywgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIGludCB3aGVuY2UpIHsKICNlbHNlCi1vZmZfdCBGd2RMb2NrRW5naW5lOjpvbkxzZWVrKGludCAvKiB1bmlxdWVJZCAqLywgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK29mZl90IEZ3ZExvY2tFbmdpbmU6Om9uTHNlZWsoaW50IC8qIHVuaXF1ZUlkICovLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSB7CiAjZW5kaWYKICAgICBvZmZfdCBvZmZ2YWwgPSAtMTsKIAotICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUgJiYgZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSkgeworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkgJiYgZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSkgewogICAgICAgICBEZWNvZGVTZXNzaW9uKiBzZXNzaW9uID0gZGVjb2RlU2Vzc2lvbk1hcC5nZXRWYWx1ZShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOwogICAgICAgICBpZiAoTlVMTCAhPSBzZXNzaW9uICYmIHNlc3Npb24tPmZpbGVEZXNjID4gLTEpIHsKICAgICAgICAgICAgIG9mZnZhbCA9IEZ3ZExvY2tGaWxlX2xzZWVrKHNlc3Npb24tPmZpbGVEZXNjLCBvZmZzZXQsIHdoZW5jZSk7CkBAIC02NzUsMTMgKzY3NSwxMyBAQAogCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKIHNzaXplX3QgRndkTG9ja0VuZ2luZTo6b25QcmVhZChpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCkgewogI2Vsc2UKIHNzaXplX3QgRndkTG9ja0VuZ2luZTo6b25QcmVhZChpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfdCBvZmZzZXQpIHsKQEAgLTY5MCw3ICs2OTAsNyBAQAogCiAgICAgRGVjb2RlU2Vzc2lvbiogZGVjb2RlclNlc3Npb24gPSBOVUxMOwogCi0gICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUpICYmCisgICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpICYmCiAgICAgICAgIChOVUxMICE9IChkZWNvZGVyU2Vzc2lvbiA9IGRlY29kZVNlc3Npb25NYXAuZ2V0VmFsdWUoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSkpICYmCiAgICAgICAgIChOVUxMICE9IGJ1ZmZlcikgJiYKICAgICAgICAgKG51bUJ5dGVzID4gLTEpICYmCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvaW5jbHVkZS9Ecm1QYXNzdGhydVBsdWdJbi5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L2luY2x1ZGUvRHJtUGFzc3RocnVQbHVnSW4uaAppbmRleCA3YjY2ZGM3Li40YWI1MjcyIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvaW5jbHVkZS9Ecm1QYXNzdGhydVBsdWdJbi5oCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9pbmNsdWRlL0RybVBhc3N0aHJ1UGx1Z0luLmgKQEAgLTUzLDEwICs1MywxMSBAQAogCiAgICAgaW50IG9uQ2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKTsKIAotICAgIHN0YXR1c190IG9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisgICAgc3RhdHVzX3Qgb25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOwogCiAgICAgc3RhdHVzX3Qgb25TZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CiAKICAgICBib29sIG9uVmFsaWRhdGVBY3Rpb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CkBAIC03NCwyNiArNzUsMjUgQEAKICAgICBEcm1TdXBwb3J0SW5mbyogb25HZXRTdXBwb3J0SW5mbyhpbnQgdW5pcXVlSWQpOwogCiAgICAgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsCisgICAgICAgICAgICBvZmY2NF90IGxlbmd0aCk7CiAKICAgICBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgY29uc3QgY2hhciogdXJpKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGNvbnN0IGNoYXIqIHVyaSk7CiAKLSAgICBzdGF0dXNfdCBvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKyAgICBzdGF0dXNfdCBvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSk7CiAKLSAgICBzdGF0dXNfdCBvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3RhdHVzX3Qgb25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOwogCi0gICAgc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVik7CiAKLSAgICBzdGF0dXNfdCBvbkZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CisgICAgc3RhdHVzX3Qgb25GaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCk7CiAKLSAgICBzc2l6ZV90IG9uUHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHNzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCk7Ci0KLXByaXZhdGU6Ci0gICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uSW1wbCgpOwogfTsKIAogfTsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9zcmMvRHJtUGFzc3RocnVQbHVnSW4uY3BwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L3NyYy9Ecm1QYXNzdGhydVBsdWdJbi5jcHAKaW5kZXggZDdmMmQyOC4uMGZhMzQ3OCAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L3NyYy9Ecm1QYXNzdGhydVBsdWdJbi5jcHAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L3NyYy9Ecm1QYXNzdGhydVBsdWdJbi5jcHAKQEAgLTE4MywxMyArMTgzLDEzIEBACiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLypkZWNyeXB0SGFuZGxlKi8sIGludCAvKmFjdGlvbiovLCBib29sIC8qcmVzZXJ2ZSovKSB7CisgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLypkZWNyeXB0SGFuZGxlKi8sIGludCAvKmFjdGlvbiovLCBib29sIC8qcmVzZXJ2ZSovKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkNvbnN1bWVSaWdodHMoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvblNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLCBpbnQgLypwbGF5YmFja1N0YXR1cyovLCBpbnQ2NF90IC8qcG9zaXRpb24qLykgeworICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qZGVjcnlwdEhhbmRsZSovLCBpbnQgLypwbGF5YmFja1N0YXR1cyovLCBpbnQ2NF90IC8qcG9zaXRpb24qLykgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25TZXRQbGF5YmFja1N0YXR1cygpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KQEAgLTIzNiw3ICsyMzYsOCBAQAogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCAvKmZkKi8sIG9mZjY0X3QgLypvZmZzZXQqLywgb2ZmNjRfdCAvKmxlbmd0aCovKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgLypmZCovLCBvZmY2NF90IC8qb2Zmc2V0Ki8sCisgICAgICAgICAgICBvZmY2NF90IC8qbGVuZ3RoKi8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uT3BlbkRlY3J5cHRTZXNzaW9uKCkgOiAlZCIsIHVuaXF1ZUlkKTsKIAogI2lmZGVmIEVOQUJMRV9QQVNTVEhSVV9ERUNSWVBUSU9OCkBAIC0yNDYsMzYgKzI0NywzOCBAQAogICAgIGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogI2Vsc2UKLSAgICAodm9pZCkoZGVjcnlwdEhhbmRsZSk7IC8vIHVudXNlZAorICAgICh2b2lkKShkZWNyeXB0SGFuZGxlLmdldCgpKTsgLy8gdW51c2VkCiAjZW5kaWYKIAogICAgIHJldHVybiBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IC8qdW5pcXVlSWQqLywgRGVjcnlwdEhhbmRsZSogLypkZWNyeXB0SGFuZGxlKi8sIGNvbnN0IGNoYXIqIC8qdXJpKi8pIHsKKyAgICAgICAgICAgIGludCAvKnVuaXF1ZUlkKi8sIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywgY29uc3QgY2hhciogLyp1cmkqLykgewogICAgIHJldHVybiBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKIH0KIAotc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKK3N0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25DbG9zZURlY3J5cHRTZXNzaW9uKCkgOiAlZCIsIHVuaXF1ZUlkKTsKLSAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSB7CisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgewogICAgICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbykgewogICAgICAgICAgICAgZGVsZXRlIGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvOyBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgZGVsZXRlIGRlY3J5cHRIYW5kbGU7IGRlY3J5cHRIYW5kbGUgPSBOVUxMOworICAgICAgICBkZWNyeXB0SGFuZGxlLmNsZWFyKCk7CiAgICAgfQogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLAotICAgICAgICAgICAgaW50IC8qZGVjcnlwdFVuaXRJZCovLCBjb25zdCBEcm1CdWZmZXIqIC8qaGVhZGVySW5mbyovKSB7CitzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLAorICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLypkZWNyeXB0SGFuZGxlKi8sCisgICAgICAgIGludCAvKmRlY3J5cHRVbml0SWQqLywgY29uc3QgRHJtQnVmZmVyKiAvKmhlYWRlckluZm8qLykgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25Jbml0aWFsaXplRGVjcnlwdFVuaXQoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiAvKmRlY3J5cHRIYW5kbGUqLywKLSAgICAgICAgICAgIGludCAvKmRlY3J5cHRVbml0SWQqLywgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiAvKklWKi8pIHsKK3N0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgLypkZWNyeXB0SGFuZGxlKi8sCisgICAgICAgIGludCAvKmRlY3J5cHRVbml0SWQqLywgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwKKyAgICAgICAgRHJtQnVmZmVyKiAvKklWKi8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uRGVjcnlwdCgpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgLyoqCiAgICAgICogQXMgYSB3b3JrYXJvdW5kIGltcGxlbWVudGF0aW9uIHBhc3N0aHJ1IHdvdWxkIGNvcHkgdGhlIGdpdmVuCkBAIC0yOTYsMTIgKzI5OSwxMiBAQAogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25GaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiAvKmRlY3J5cHRIYW5kbGUqLywgaW50IC8qZGVjcnlwdFVuaXRJZCovKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywgaW50IC8qZGVjcnlwdFVuaXRJZCovKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkZpbmFsaXplRGVjcnlwdFVuaXQoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKLXNzaXplX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uUHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiAvKmRlY3J5cHRIYW5kbGUqLywKK3NzaXplX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uUHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgLypkZWNyeXB0SGFuZGxlKi8sCiAgICAgICAgICAgICB2b2lkKiAvKmJ1ZmZlciovLCBzc2l6ZV90IC8qbnVtQnl0ZXMqLywgb2ZmNjRfdCAvKm9mZnNldCovKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblByZWFkKCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwIGIvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAKaW5kZXggOTFkMWY3ZS4uMDFlZmIyMiAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAKQEAgLTI3LDExICsyNywxMSBAQAogICAgICAgICAibGlibWVkaWFkcm1tZXRyaWNzX2xpdGUiLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAotICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMiIsCiAgICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCkBAIC01OSwxMyArNTksMTEgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCi0gICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsLmNwcCBiL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWwuY3BwCmluZGV4IDMwMzVjNWEuLjRkZGE1ZDcgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWwuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWwuY3BwCkBAIC0zMCwxNiArMzAsMTYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhZHJtL0NyeXB0b0hhbC5oPgogCit1c2luZyBkcm06OlYxXzA6OkJ1ZmZlclR5cGU7Cit1c2luZyBkcm06OlYxXzA6OkRlc3RpbmF0aW9uQnVmZmVyOwordXNpbmcgZHJtOjpWMV8wOjpJQ3J5cHRvRmFjdG9yeTsKK3VzaW5nIGRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKK3VzaW5nIGRybTo6VjFfMDo6TW9kZTsKK3VzaW5nIGRybTo6VjFfMDo6UGF0dGVybjsKK3VzaW5nIGRybTo6VjFfMDo6U2hhcmVkQnVmZmVyOwordXNpbmcgZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyBkcm06OlYxXzA6OlN1YlNhbXBsZTsKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpCdWZmZXJUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SUNyeXB0b0ZhY3Rvcnk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OklDcnlwdG9QbHVnaW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6Ok1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlBhdHRlcm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlNoYXJlZEJ1ZmZlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdWJTYW1wbGU7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKQEAgLTUwLDYgKzUwLDcgQEAKIHVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6bWFuYWdlcjo6VjFfMDo6SVNlcnZpY2VNYW5hZ2VyOwogdXNpbmcgOjphbmRyb2lkOjpzcDsKIAordHlwZWRlZiBkcm06OlYxXzI6OlN0YXR1cyBTdGF0dXNfVjFfMjsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC03Niw2ICs3NywxOCBAQAogICAgIH0KIH0KIAorc3RhdGljIHN0YXR1c190IHRvU3RhdHVzVF8xXzIoU3RhdHVzX1YxXzIgc3RhdHVzKSB7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NFU1NJT05fTE9TVF9TVEFURTs7CisgICAgY2FzZSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U7CisgICAgY2FzZSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0lOU1VGRklDSUVOVF9TRUNVUklUWToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIHRvU3RhdHVzVChzdGF0aWNfY2FzdDxTdGF0dXM+KHN0YXR1cykpOworICAgIH0KK30KIAogc3RhdGljIGhpZGxfdmVjPHVpbnQ4X3Q+IHRvSGlkbFZlYyhjb25zdCBWZWN0b3I8dWludDhfdD4gJnZlY3RvcikgewogICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHZlYzsKQEAgLTE5Niw2ICsyMDksOSBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZhY3Rvcmllcy5zaXplKCk7IGkrKykgewogICAgICAgICBpZiAobUZhY3Rvcmllc1tpXS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkpIHsKICAgICAgICAgICAgIG1QbHVnaW4gPSBtYWtlQ3J5cHRvUGx1Z2luKG1GYWN0b3JpZXNbaV0sIHV1aWQsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgaWYgKG1QbHVnaW4gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1QbHVnaW5WMV8yID0gZHJtOjpWMV8yOjpJQ3J5cHRvUGx1Z2luOjpjYXN0RnJvbShtUGx1Z2luKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMjE2LDYgKzIzMiw3IEBACiAgICAgfQogCiAgICAgbVBsdWdpbi5jbGVhcigpOworICAgIG1QbHVnaW5WMV8yLmNsZWFyKCk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0zODksMjEgKzQwNiwzMyBAQAogICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CiAgICAgdWludDMyX3QgYnl0ZXNXcml0dGVuID0gMDsKIAotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+ZGVjcnlwdChzZWN1cmUsIHRvSGlkbEFycmF5MTYoa2V5SWQpLCB0b0hpZGxBcnJheTE2KGl2KSwgaE1vZGUsCi0gICAgICAgICAgICBoUGF0dGVybiwgaFN1YlNhbXBsZXMsIGhTb3VyY2UsIG9mZnNldCwgaERlc3RpbmF0aW9uLAotICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIHVpbnQzMl90IGhCeXRlc1dyaXR0ZW4sIGhpZGxfc3RyaW5nIGhEZXRhaWxlZEVycm9yKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGhCeXRlc1dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgICAgICplcnJvckRldGFpbE1zZyA9IHRvU3RyaW5nOChoRGV0YWlsZWRFcnJvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICApOworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OwogCi0gICAgaWYgKCFoUmVzdWx0LmlzT2soKSkgewotICAgICAgICBlcnIgPSBERUFEX09CSkVDVDsKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmRlY3J5cHRfMV8yKHNlY3VyZSwgdG9IaWRsQXJyYXkxNihrZXlJZCksIHRvSGlkbEFycmF5MTYoaXYpLAorICAgICAgICAgICAgICAgIGhNb2RlLCBoUGF0dGVybiwgaFN1YlNhbXBsZXMsIGhTb3VyY2UsIG9mZnNldCwgaERlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXNfVjFfMiBzdGF0dXMsIHVpbnQzMl90IGhCeXRlc1dyaXR0ZW4sIGhpZGxfc3RyaW5nIGhEZXRhaWxlZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBoQnl0ZXNXcml0dGVuOworICAgICAgICAgICAgICAgICAgICAgICAgKmVycm9yRGV0YWlsTXNnID0gdG9TdHJpbmc4KGhEZXRhaWxlZEVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1RfMV8yKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpbi0+ZGVjcnlwdChzZWN1cmUsIHRvSGlkbEFycmF5MTYoa2V5SWQpLCB0b0hpZGxBcnJheTE2KGl2KSwKKyAgICAgICAgICAgICAgICBoTW9kZSwgaFBhdHRlcm4sIGhTdWJTYW1wbGVzLCBoU291cmNlLCBvZmZzZXQsIGhEZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgdWludDMyX3QgaEJ5dGVzV3JpdHRlbiwgaGlkbF9zdHJpbmcgaERldGFpbGVkRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBoQnl0ZXNXcml0dGVuOworICAgICAgICAgICAgICAgICAgICAgICAgKmVycm9yRGV0YWlsTXNnID0gdG9TdHJpbmc4KGhEZXRhaWxlZEVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOwogICAgIH0KIAorICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CiAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICByZXR1cm4gYnl0ZXNXcml0dGVuOwogICAgIH0KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAKaW5kZXggY2YwODYxMC4uNTg4OGFmMCAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAKQEAgLTIzLDggKzIzLDggQEAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjAvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21hbmFnZXIvMS4yL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGhpZGwvU2VydmljZU1hbmFnZW1lbnQuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0V2ZW50TWV0cmljLmg+CkBAIC00MSwxNCArNDEsMTYgQEAKIAogdXNpbmcgZHJtOjpWMV8wOjpLZXllZFZlY3RvcjsKIHVzaW5nIGRybTo6VjFfMDo6S2V5U3RhdHVzVHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6S2V5UmVxdWVzdFR5cGU7CiB1c2luZyBkcm06OlYxXzA6OktleVR5cGU7CiB1c2luZyBkcm06OlYxXzA6OktleVZhbHVlOwotdXNpbmcgZHJtOjpWMV8xOjpIZGNwTGV2ZWw7OwogdXNpbmcgZHJtOjpWMV8wOjpTZWN1cmVTdG9wOwotdXNpbmcgZHJtOjpWMV8xOjpTZWN1cmVTdG9wUmVsZWFzZTsKIHVzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcElkOwotdXNpbmcgZHJtOjpWMV8xOjpTZWN1cml0eUxldmVsOwogdXNpbmcgZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyBkcm06OlYxXzE6OkhkY3BMZXZlbDsKK3VzaW5nIGRybTo6VjFfMTo6U2VjdXJlU3RvcFJlbGVhc2U7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7Cit1c2luZyBkcm06OlYxXzI6OktleVNldElkOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpEcm1NZXRyaWNHcm91cDsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKQEAgLTU5LDYgKzYxLDEwIEBACiB1c2luZyA6OmFuZHJvaWQ6Om9zOjpQZXJzaXN0YWJsZUJ1bmRsZTsKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CiAKK3R5cGVkZWYgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZSBLZXlSZXF1ZXN0VHlwZV9WMV8xOwordHlwZWRlZiBkcm06OlYxXzI6OlN0YXR1cyBTdGF0dXNfVjFfMjsKK3R5cGVkZWYgZHJtOjpWMV8yOjpIZGNwTGV2ZWwgSGRjcExldmVsX1YxXzI7CisKIG5hbWVzcGFjZSB7CiAKIC8vIFRoaXMgY29uc3RhbnQgY29ycmVzcG9uZHMgdG8gdGhlIFBST1BFUlRZX0RFVklDRV9VTklRVUVfSUQgY29uc3RhbnQKQEAgLTEzOSwyNiArMTQ1LDU1IEBACiAgICAgfQogfQogCi1zdGF0aWMgRHJtUGx1Z2luOjpIZGNwTGV2ZWwgdG9IZGNwTGV2ZWwoSGRjcExldmVsIGxldmVsKSB7CitzdGF0aWMgU2VjdXJpdHlMZXZlbCB0b0hpZGxTZWN1cml0eUxldmVsKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCkgewogICAgIHN3aXRjaChsZXZlbCkgewotICAgIGNhc2UgSGRjcExldmVsOjpIRENQX05PTkU6CisgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsU3dTZWN1cmVDcnlwdG86CisgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOworICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFN3U2VjdXJlRGVjb2RlOgorICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0RFQ09ERTsKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUNyeXB0bzoKKyAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9DUllQVE87CisgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVEZWNvZGU6CisgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFOworICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlQWxsOgorICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0FMTDsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6VU5LTk9XTjsKKyAgICB9Cit9CisKK3N0YXRpYyBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUgdG9PZmZsaW5lTGljZW5zZVN0YXRlKAorICAgICAgICBPZmZsaW5lTGljZW5zZVN0YXRlIGxpY2Vuc2VTdGF0ZSkgeworICAgIHN3aXRjaChsaWNlbnNlU3RhdGUpIHsKKyAgICBjYXNlIE9mZmxpbmVMaWNlbnNlU3RhdGU6OlVTQUJMRToKKyAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVc2FibGU7CisgICAgY2FzZSBPZmZsaW5lTGljZW5zZVN0YXRlOjpJTkFDVElWRToKKyAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVSZWxlYXNlZDsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVVua25vd247CisgICAgfQorfQorCitzdGF0aWMgRHJtUGx1Z2luOjpIZGNwTGV2ZWwgdG9IZGNwTGV2ZWwoSGRjcExldmVsX1YxXzIgbGV2ZWwpIHsKKyAgICBzd2l0Y2gobGV2ZWwpIHsKKyAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX05PTkU6CiAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwTm9uZTsKLSAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9WMToKKyAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX1YxOgogICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYxOwotICAgIGNhc2UgSGRjcExldmVsOjpIRENQX1YyOgorICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjI6CiAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjI7Ci0gICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfVjJfMToKKyAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX1YyXzE6CiAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjJfMTsKLSAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9WMl8yOgorICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjJfMjoKICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMl8yOwotICAgIGNhc2UgSGRjcExldmVsOjpIRENQX05PX09VVFBVVDoKKyAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX1YyXzM6CisgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjJfMzsKKyAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX05PX09VVFBVVDoKICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BOb091dHB1dDsKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcExldmVsVW5rbm93bjsKICAgICB9CiB9Ci0KLQogc3RhdGljIDo6S2V5ZWRWZWN0b3IgdG9IaWRsS2V5ZWRWZWN0b3IoY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4mCiAgICAgICAgIGtleWVkVmVjdG9yKSB7CiAgICAgc3RkOjp2ZWN0b3I8S2V5VmFsdWU+IHN0ZEtleWVkVmVjdG9yOwpAQCAtMTk5LDYgKzIzNCwxNSBAQAogICAgIHJldHVybiBzZWN1cmVTdG9wSWRzOwogfQogCitzdGF0aWMgTGlzdDxWZWN0b3I8dWludDhfdD4+IHRvS2V5U2V0SWRzKGNvbnN0IGhpZGxfdmVjPEtleVNldElkPiYKKyAgICAgICAgaEtleVNldElkcykgeworICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBrZXlTZXRJZHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoS2V5U2V0SWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGtleVNldElkcy5wdXNoX2JhY2sodG9WZWN0b3IoaEtleVNldElkc1tpXSkpOworICAgIH0KKyAgICByZXR1cm4ga2V5U2V0SWRzOworfQorCiBzdGF0aWMgc3RhdHVzX3QgdG9TdGF0dXNUKFN0YXR1cyBzdGF0dXMpIHsKICAgICBzd2l0Y2ggKHN0YXR1cykgewogICAgIGNhc2UgU3RhdHVzOjpPSzoKQEAgLTIxNyw3ICsyNjEsNyBAQAogICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgU3RhdHVzOjpFUlJPUl9EUk1fSU5WQUxJRF9TVEFURToKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9UQU1QRVJfREVURUNURUQ7CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5WQUxJRF9TVEFURTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBTdGF0dXM6OkJBRF9WQUxVRToKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTIzOCw2ICsyODIsMTkgQEAKICAgICB9CiB9CiAKK3N0YXRpYyBzdGF0dXNfdCB0b1N0YXR1c1RfMV8yKFN0YXR1c19WMV8yIHN0YXR1cykgeworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgY2FzZSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX1JFU09VUkNFX0NPTlRFTlRJT046CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTjsKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRTsKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0lOU1VGRklDSUVOVF9TRUNVUklUWTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gdG9TdGF0dXNUKHN0YXRpY19jYXN0PFN0YXR1cz4oc3RhdHVzKSk7CisgICAgfQorfQorCiAKIE11dGV4IERybUhhbDo6bUxvY2s7CiAKQEAgLTI5NywzOSArMzU0LDUxIEBACiAKICAgICBzZXRMaXN0ZW5lcihOVUxMKTsKICAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKLQotICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBpZiAoIW1QbHVnaW5WMV8yLT5zZXRMaXN0ZW5lcihOVUxMKS5pc09rKCkpIHsKKyAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CiAgICAgICAgIGlmICghbVBsdWdpbi0+c2V0TGlzdGVuZXIoTlVMTCkuaXNPaygpKSB7CiAgICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7CiAgICAgICAgIH0KICAgICB9CiAgICAgbVBsdWdpbi5jbGVhcigpOwogICAgIG1QbHVnaW5WMV8xLmNsZWFyKCk7CisgICAgbVBsdWdpblYxXzIuY2xlYXIoKTsKIH0KIAogVmVjdG9yPHNwPElEcm1GYWN0b3J5Pj4gRHJtSGFsOjptYWtlRHJtRmFjdG9yaWVzKCkgewogICAgIFZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IGZhY3RvcmllczsKIAotICAgIGF1dG8gbWFuYWdlciA9IGhhcmR3YXJlOjpkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICBhdXRvIG1hbmFnZXIgPSBoYXJkd2FyZTo6ZGVmYXVsdFNlcnZpY2VNYW5hZ2VyMV8yKCk7CiAKICAgICBpZiAobWFuYWdlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1hbmFnZXItPmxpc3RCeUludGVyZmFjZShkcm06OlYxXzA6OklEcm1GYWN0b3J5OjpkZXNjcmlwdG9yLAorICAgICAgICBtYW5hZ2VyLT5saXN0TWFuaWZlc3RCeUludGVyZmFjZShkcm06OlYxXzA6OklEcm1GYWN0b3J5OjpkZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgIFsmZmFjdG9yaWVzXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gJnJlZ2lzdGVyZWQpIHsKICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZpbnN0YW5jZSA6IHJlZ2lzdGVyZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IGRybTo6VjFfMDo6SURybUZhY3Rvcnk6OmdldFNlcnZpY2UoaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJmb3VuZCBkcm1AMS4wIElEcm1GYWN0b3J5ICVzIiwgaW5zdGFuY2UuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVzLnB1c2hfYmFjayhmYWN0b3J5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICk7Ci0gICAgICAgIG1hbmFnZXItPmxpc3RCeUludGVyZmFjZShkcm06OlYxXzE6OklEcm1GYWN0b3J5OjpkZXNjcmlwdG9yLAorICAgICAgICBtYW5hZ2VyLT5saXN0TWFuaWZlc3RCeUludGVyZmFjZShkcm06OlYxXzE6OklEcm1GYWN0b3J5OjpkZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgIFsmZmFjdG9yaWVzXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gJnJlZ2lzdGVyZWQpIHsKICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZpbnN0YW5jZSA6IHJlZ2lzdGVyZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IGRybTo6VjFfMTo6SURybUZhY3Rvcnk6OmdldFNlcnZpY2UoaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJmb3VuZCBkcm1AMS4xIElEcm1GYWN0b3J5ICVzIiwgaW5zdGFuY2UuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVzLnB1c2hfYmFjayhmYWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CisgICAgICAgIG1hbmFnZXItPmxpc3RCeUludGVyZmFjZShkcm06OlYxXzI6OklEcm1GYWN0b3J5OjpkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgIFsmZmFjdG9yaWVzXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gJnJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZpbnN0YW5jZSA6IHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IGRybTo6VjFfMjo6SURybUZhY3Rvcnk6OmdldFNlcnZpY2UoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2soZmFjdG9yeSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTUwMSwzMiArNTcwLDgwIEBACiAgICAgcmV0dXJuIFZvaWQoKTsKIH0KIAotYm9vbCBEcm1IYWw6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKK1JldHVybjx2b2lkPiBEcm1IYWw6OnNlbmRTZXNzaW9uTG9zdFN0YXRlKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKSB7CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICBtRXZlbnRMb2NrLmxvY2soKTsKKyAgICBzcDxJRHJtQ2xpZW50PiBsaXN0ZW5lciA9IG1MaXN0ZW5lcjsKKyAgICBtRXZlbnRMb2NrLnVubG9jaygpOworCisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgUGFyY2VsIG9iajsKKyAgICAgICAgd3JpdGVCeXRlQXJyYXkob2JqLCBzZXNzaW9uSWQpOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTm90aWZ5TG9jayk7CisgICAgICAgIGxpc3RlbmVyLT5ub3RpZnkoRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRTZXNzaW9uTG9zdFN0YXRlLCAwLCAmb2JqKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworc3RhdHVzX3QgRHJtSGFsOjptYXRjaE1pbWVUeXBlQW5kU2VjdXJpdHlMZXZlbChjb25zdCBzcDxJRHJtRmFjdG9yeT4gJmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmlzU3VwcG9ydGVkKSB7CisgICAgKmlzU3VwcG9ydGVkID0gZmFsc2U7CisKKyAgICAvLyBoYW5kbGUgZGVmYXVsdCB2YWx1ZSBjYXNlcworICAgIGlmIChsZXZlbCA9PSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsVW5rbm93bikgeworICAgICAgICBpZiAobWltZVR5cGUgPT0gIiIpIHsKKyAgICAgICAgICAgIC8vIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpCisgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVR5cGUpCisgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSBmYWN0b3J5LT5pc0NvbnRlbnRUeXBlU3VwcG9ydGVkKG1pbWVUeXBlLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmIChtaW1lVHlwZSA9PSAiIikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPGRybTo6VjFfMjo6SURybUZhY3Rvcnk+IGZhY3RvcnlWMV8yID0gZHJtOjpWMV8yOjpJRHJtRmFjdG9yeTo6Y2FzdEZyb20oZmFjdG9yeSk7CisgICAgaWYgKGZhY3RvcnlWMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0gZWxzZSB7CisgICAgICAgICppc1N1cHBvcnRlZCA9IGZhY3RvcnlWMV8yLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZF8xXzIodXVpZCwKKyAgICAgICAgICAgICAgICBtaW1lVHlwZS5zdHJpbmcoKSwgdG9IaWRsU2VjdXJpdHlMZXZlbChsZXZlbCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorfQorCitzdGF0dXNfdCBEcm1IYWw6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmlzU3VwcG9ydGVkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAqaXNTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICBmb3IgKHNzaXplX3QgaSA9IG1GYWN0b3JpZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgaWYgKG1GYWN0b3JpZXNbaV0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7Ci0gICAgICAgICAgICBpZiAobWltZVR5cGUgIT0gIiIpIHsKLSAgICAgICAgICAgICAgICBpZiAobUZhY3Rvcmllc1tpXS0+aXNDb250ZW50VHlwZVN1cHBvcnRlZChtaW1lVHlwZS5zdHJpbmcoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtYXRjaE1pbWVUeXBlQW5kU2VjdXJpdHlMZXZlbChtRmFjdG9yaWVzW2ldLAorICAgICAgICAgICAgICAgICAgICB1dWlkLCBtaW1lVHlwZSwgbGV2ZWwsIGlzU3VwcG9ydGVkKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBEcm1IYWw6OmNyZWF0ZVBsdWdpbihjb25zdCB1aW50OF90IHV1aWRbMTZdLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBhcHBQYWNrYWdlTmFtZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICBmb3IgKHNzaXplX3QgaSA9IG1GYWN0b3JpZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgaWYgKG1GYWN0b3JpZXNbaV0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7Ci0gICAgICAgICAgICBtUGx1Z2luID0gbWFrZURybVBsdWdpbihtRmFjdG9yaWVzW2ldLCB1dWlkLCBhcHBQYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgICAgICBhdXRvIHBsdWdpbiA9IG1ha2VEcm1QbHVnaW4obUZhY3Rvcmllc1tpXSwgdXVpZCwgYXBwUGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKHBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVBsdWdpbiA9IHBsdWdpbjsKICAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMSA9IGRybTo6VjFfMTo6SURybVBsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7CisgICAgICAgICAgICAgICAgbVBsdWdpblYxXzIgPSBkcm06OlYxXzI6OklEcm1QbHVnaW46OmNhc3RGcm9tKG1QbHVnaW4pOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNTM0LDEzICs2NTEsMjIgQEAKICAgICBpZiAobVBsdWdpbiA9PSBOVUxMKSB7CiAgICAgICAgIG1Jbml0Q2hlY2sgPSBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAoIW1QbHVnaW4tPnNldExpc3RlbmVyKHRoaXMpLmlzT2soKSkgeworICAgICAgICBtSW5pdENoZWNrID0gT0s7CisgICAgICAgIGlmIChtUGx1Z2luVjFfMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIW1QbHVnaW5WMV8yLT5zZXRMaXN0ZW5lcih0aGlzKS5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIW1QbHVnaW4tPnNldExpc3RlbmVyKHRoaXMpLmlzT2soKSkgewogICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUluaXRDaGVjayA9IE9LOworICAgICAgICB9CisgICAgICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgICAgICBtUGx1Z2luLmNsZWFyKCk7CisgICAgICAgICAgICBtUGx1Z2luVjFfMS5jbGVhcigpOworICAgICAgICAgICAgbVBsdWdpblYxXzIuY2xlYXIoKTsKICAgICAgICAgfQogICAgIH0KIAorCiAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiB9CiAKQEAgLTU1NCwzMCArNjgwLDE1IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBJTklUX0NIRUNLKCk7CiAKLSAgICBTZWN1cml0eUxldmVsIGhTZWN1cml0eUxldmVsOworICAgIFNlY3VyaXR5TGV2ZWwgaFNlY3VyaXR5TGV2ZWwgPSB0b0hpZGxTZWN1cml0eUxldmVsKGxldmVsKTsKICAgICBib29sIHNldFNlY3VyaXR5TGV2ZWwgPSB0cnVlOwogCi0gICAgc3dpdGNoKGxldmVsKSB7Ci0gICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsU3dTZWN1cmVDcnlwdG86Ci0gICAgICAgIGhTZWN1cml0eUxldmVsID0gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0NSWVBUTzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsU3dTZWN1cmVEZWNvZGU6Ci0gICAgICAgIGhTZWN1cml0eUxldmVsID0gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0RFQ09ERTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVDcnlwdG86Ci0gICAgICAgIGhTZWN1cml0eUxldmVsID0gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0NSWVBUTzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVEZWNvZGU6Ci0gICAgICAgIGhTZWN1cml0eUxldmVsID0gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0RFQ09ERTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVBbGw6Ci0gICAgICAgIGhTZWN1cml0eUxldmVsID0gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0FMTDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsTWF4OgorICAgIGlmIChsZXZlbCA9PSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsTWF4KSB7CiAgICAgICAgIHNldFNlY3VyaXR5TGV2ZWwgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChoU2VjdXJpdHlMZXZlbCA9PSBTZWN1cml0eUxldmVsOjpVTktOT1dOKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgICAgIH0KICAgICB9CiAKICAgICBzdGF0dXNfdCAgZXJyID0gVU5LTk9XTl9FUlJPUjsKQEAgLTY1Nyw2ICs3NjgsMzkgQEAKICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiB9CiAKK3N0YXRpYyBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlIHRvS2V5UmVxdWVzdFR5cGUoCisgICAgICAgIEtleVJlcXVlc3RUeXBlIGtleVJlcXVlc3RUeXBlKSB7CisgICAgc3dpdGNoIChrZXlSZXF1ZXN0VHlwZSkgeworICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlOjpJTklUSUFMOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX0luaXRpYWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZTo6UkVORVdBTDoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZW5ld2FsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGU6OlJFTEVBU0U6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVsZWFzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1Vua25vd247CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlIHRvS2V5UmVxdWVzdFR5cGVfMV8xKAorICAgICAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xIGtleVJlcXVlc3RUeXBlKSB7CisgICAgc3dpdGNoIChrZXlSZXF1ZXN0VHlwZSkgeworICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlX1YxXzE6Ok5PTkU6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfTm9uZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlX1YxXzE6OlVQREFURToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9VcGRhdGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiB0b0tleVJlcXVlc3RUeXBlKHN0YXRpY19jYXN0PEtleVJlcXVlc3RUeXBlPihrZXlSZXF1ZXN0VHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCiBzdGF0dXNfdCBEcm1IYWw6OmdldEtleVJlcXVlc3QoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5pdERhdGEsIFN0cmluZzggY29uc3QgJm1pbWVUeXBlLAogICAgICAgICBEcm1QbHVnaW46OktleVR5cGUga2V5VHlwZSwgS2V5ZWRWZWN0b3I8U3RyaW5nOCwKQEAgLTY4Myw3MyArODI3LDUxIEBACiAgICAgOjpLZXllZFZlY3RvciBoT3B0aW9uYWxQYXJhbWV0ZXJzID0gdG9IaWRsS2V5ZWRWZWN0b3Iob3B0aW9uYWxQYXJhbWV0ZXJzKTsKIAogICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQ7CiAKLSAgICBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgewotICAgICAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9Ci0gICAgICAgICAgICBtUGx1Z2luVjFfMS0+Z2V0S2V5UmVxdWVzdF8xXzEoCisgICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRLZXlSZXF1ZXN0XzFfMigKKyAgICAgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsVmVjKGluaXREYXRhKSwKKyAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcobWltZVR5cGUpLCBoS2V5VHlwZSwgaE9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzX1YxXzIgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xIGhLZXlSZXF1ZXN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOworICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gdG9LZXlSZXF1ZXN0VHlwZV8xXzEoaEtleVJlcXVlc3RUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1RfMV8yKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIGlmIChtUGx1Z2luVjFfMSAhPSBOVUxMKSB7CisgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luVjFfMS0+Z2V0S2V5UmVxdWVzdF8xXzEoCiAgICAgICAgICAgICAgICAgdG9IaWRsVmVjKHNlc3Npb25JZCksIHRvSGlkbFZlYyhpbml0RGF0YSksCiAgICAgICAgICAgICAgICAgdG9IaWRsU3RyaW5nKG1pbWVUeXBlKSwgaEtleVR5cGUsIGhPcHRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZSBoS2V5UmVxdWVzdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgewotCi0gICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOwotICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChoS2V5UmVxdWVzdFR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlOjpJTklUSUFMOgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfSW5pdGlhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGU6OlJFTkVXQUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZW5ld2FsOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZTo6UkVMRUFTRToKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbGVhc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlOjpOT05FOgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfTm9uZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGU6OlVQREFURToKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1VwZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfVW5rbm93bjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0S2V5UmVxdWVzdCh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgIHRvSGlkbFZlYyhpbml0RGF0YSksIHRvSGlkbFN0cmluZyhtaW1lVHlwZSksIGhLZXlUeXBlLCBoT3B0aW9uYWxQYXJhbWV0ZXJzLAotICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgZHJtOjpWMV8wOjpLZXlSZXF1ZXN0VHlwZSBoS2V5UmVxdWVzdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgewotCi0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOwotCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaEtleVJlcXVlc3RUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8wOjpLZXlSZXF1ZXN0VHlwZTo6SU5JVElBTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX0luaXRpYWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlOjpSRU5FV0FMOgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVuZXdhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMDo6S2V5UmVxdWVzdFR5cGU6OlJFTEVBU0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZWxlYXNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Vbmtub3duOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xIGhLZXlSZXF1ZXN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IHRvS2V5UmVxdWVzdFR5cGVfMV8xKGhLZXlSZXF1ZXN0VHlwZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW4tPmdldEtleVJlcXVlc3QoCisgICAgICAgICAgICAgICAgdG9IaWRsVmVjKHNlc3Npb25JZCksIHRvSGlkbFZlYyhpbml0RGF0YSksCisgICAgICAgICAgICAgICAgdG9IaWRsU3RyaW5nKG1pbWVUeXBlKSwgaEtleVR5cGUsIGhPcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleVJlcXVlc3RUeXBlIGhLZXlSZXF1ZXN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IHRvS2V5UmVxdWVzdFR5cGUoaEtleVJlcXVlc3RUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CiAKICAgICBlcnIgPSBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOwogICAgIGtleVJlcXVlc3RUaW1lci5TZXRBdHRyaWJ1dGUoZXJyKTsKQEAgLTgzMSwxOCArOTUzLDMzIEBACiAgICAgSU5JVF9DSEVDSygpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdDsKIAotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0UHJvdmlzaW9uUmVxdWVzdCgKLSAgICAgICAgICAgIHRvSGlkbFN0cmluZyhjZXJ0VHlwZSksIHRvSGlkbFN0cmluZyhjZXJ0QXV0aG9yaXR5KSwKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRQcm92aXNpb25SZXF1ZXN0XzFfMigKKyAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcoY2VydFR5cGUpLCB0b0hpZGxTdHJpbmcoY2VydEF1dGhvcml0eSksCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1c19WMV8yIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUXzFfMihzdGF0dXMpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKKyAgICAgICAgICAgICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRQcm92aXNpb25SZXF1ZXN0KAorICAgICAgICAgICAgICAgIHRvSGlkbFN0cmluZyhjZXJ0VHlwZSksIHRvSGlkbFN0cmluZyhjZXJ0QXV0aG9yaXR5KSwKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CisgICAgfQogCiAgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKICAgICBtTWV0cmljcy5tR2V0UHJvdmlzaW9uUmVxdWVzdENvdW50ZXIuSW5jcmVtZW50KGVycik7CkBAIC05ODgsMjIgKzExMjUsMzEgQEAKICAgICB9CiAgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKIAotICAgIGlmIChtUGx1Z2luVjFfMSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICB9Ci0KICAgICAqY29ubmVjdGVkID0gRHJtUGx1Z2luOjprSGRjcExldmVsVW5rbm93bjsKICAgICAqbWF4ID0gRHJtUGx1Z2luOjprSGRjcExldmVsVW5rbm93bjsKIAotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldEhkY3BMZXZlbHMoCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgSGRjcExldmVsJiBoQ29ubmVjdGVkLCBjb25zdCBIZGNwTGV2ZWwmIGhNYXgpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmNvbm5lY3RlZCA9IHRvSGRjcExldmVsKGhDb25uZWN0ZWQpOwotICAgICAgICAgICAgICAgICAgICAqbWF4ID0gdG9IZGNwTGV2ZWwoaE1heCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICk7CisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQ7CisgICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRIZGNwTGV2ZWxzXzFfMigKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzX1YxXzIgc3RhdHVzLCBjb25zdCBIZGNwTGV2ZWxfVjFfMiYgaENvbm5lY3RlZCwgY29uc3QgSGRjcExldmVsX1YxXzImIGhNYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpjb25uZWN0ZWQgPSB0b0hkY3BMZXZlbChoQ29ubmVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICptYXggPSB0b0hkY3BMZXZlbChoTWF4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1RfMV8yKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIGlmIChtUGx1Z2luVjFfMSAhPSBOVUxMKSB7CisgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luVjFfMS0+Z2V0SGRjcExldmVscygKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgSGRjcExldmVsJiBoQ29ubmVjdGVkLCBjb25zdCBIZGNwTGV2ZWwmIGhNYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqY29ubmVjdGVkID0gdG9IZGNwTGV2ZWwoc3RhdGljX2Nhc3Q8SGRjcExldmVsX1YxXzI+KGhDb25uZWN0ZWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICptYXggPSB0b0hkY3BMZXZlbChzdGF0aWNfY2FzdDxIZGNwTGV2ZWxfVjFfMj4oaE1heCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CiAKICAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKIH0KQEAgLTEwNjUsNiArMTIxMSw3MyBAQAogICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOwogfQogCitzdGF0dXNfdCBEcm1IYWw6OmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAma2V5U2V0SWRzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtUGx1Z2luVjFfMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMi0+Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoCisgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8S2V5U2V0SWQ+JiBoS2V5U2V0SWRzKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGtleVNldElkcyA9IHRvS2V5U2V0SWRzKGhLZXlTZXRJZHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICApOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKK3N0YXR1c190IERybUhhbDo6cmVtb3ZlT2ZmbGluZUxpY2Vuc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVBsdWdpblYxXzIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgUmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gbVBsdWdpblYxXzItPnJlbW92ZU9mZmxpbmVMaWNlbnNlKHRvSGlkbFZlYyhrZXlTZXRJZCkpOworICAgIHJldHVybiBzdGF0dXMuaXNPaygpID8gdG9TdGF0dXNUKHN0YXR1cykgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsOjpnZXRPZmZsaW5lTGljZW5zZVN0YXRlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQsCisgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSAqbGljZW5zZVN0YXRlKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtUGx1Z2luVjFfMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisgICAgKmxpY2Vuc2VTdGF0ZSA9IERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVbmtub3duOworCisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmdldE9mZmxpbmVMaWNlbnNlU3RhdGUodG9IaWRsVmVjKGtleVNldElkKSwKKyAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBPZmZsaW5lTGljZW5zZVN0YXRlIGhMaWNlbnNlU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmxpY2Vuc2VTdGF0ZSA9IHRvT2ZmbGluZUxpY2Vuc2VTdGF0ZShoTGljZW5zZVN0YXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgKTsKKworICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOworfQorCiBzdGF0dXNfdCBEcm1IYWw6OmdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlICkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgcmV0dXJuIGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwobmFtZSwgdmFsdWUpOwpAQCAtMTM0MywyMiArMTU1NiwyMiBAQAogCiB2b2lkIERybUhhbDo6cmVwb3J0RnJhbWV3b3JrTWV0cmljcygpIGNvbnN0CiB7Ci0gICAgTWVkaWFBbmFseXRpY3NJdGVtIGl0ZW0oIm1lZGlhZHJtIik7Ci0gICAgaXRlbS5nZW5lcmF0ZVNlc3Npb25JRCgpOwotICAgIGl0ZW0uc2V0UGtnTmFtZShtTWV0cmljcy5HZXRBcHBQYWNrYWdlTmFtZSgpLmNfc3RyKCkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUFuYWx5dGljc0l0ZW0+IGl0ZW0oTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoIm1lZGlhZHJtIikpOworICAgIGl0ZW0tPmdlbmVyYXRlU2Vzc2lvbklEKCk7CisgICAgaXRlbS0+c2V0UGtnTmFtZShtTWV0cmljcy5HZXRBcHBQYWNrYWdlTmFtZSgpLmNfc3RyKCkpOwogICAgIFN0cmluZzggdmVuZG9yOwogICAgIFN0cmluZzggZGVzY3JpcHRpb247CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJ2ZW5kb3IiKSwgdmVuZG9yKTsKICAgICBpZiAocmVzdWx0ICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHZlbmRvciBmcm9tIGRybSBwbHVnaW46ICVkIiwgcmVzdWx0KTsKICAgICB9IGVsc2UgewotICAgICAgICBpdGVtLnNldENTdHJpbmcoInZlbmRvciIsIHZlbmRvci5jX3N0cigpKTsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZygidmVuZG9yIiwgdmVuZG9yLmNfc3RyKCkpOwogICAgIH0KICAgICByZXN1bHQgPSBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoImRlc2NyaXB0aW9uIiksIGRlc2NyaXB0aW9uKTsKICAgICBpZiAocmVzdWx0ICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGRlc2NyaXB0aW9uIGZyb20gZHJtIHBsdWdpbjogJWQiLCByZXN1bHQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGl0ZW0uc2V0Q1N0cmluZygiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbi5jX3N0cigpKTsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZygiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbi5jX3N0cigpKTsKICAgICB9CiAKICAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkTWV0cmljczsKQEAgLTEzNjksOSArMTU4Miw5IEBACiAgICAgc3RkOjpzdHJpbmcgYjY0RW5jb2RlZE1ldHJpY3MgPSB0b0Jhc2U2NFN0cmluZ05vUGFkKHNlcmlhbGl6ZWRNZXRyaWNzLmRhdGEoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZE1ldHJpY3Muc2l6ZSgpKTsKICAgICBpZiAoIWI2NEVuY29kZWRNZXRyaWNzLmVtcHR5KCkpIHsKLSAgICAgICAgaXRlbS5zZXRDU3RyaW5nKCJzZXJpYWxpemVkX21ldHJpY3MiLCBiNjRFbmNvZGVkTWV0cmljcy5jX3N0cigpKTsKKyAgICAgICAgaXRlbS0+c2V0Q1N0cmluZygic2VyaWFsaXplZF9tZXRyaWNzIiwgYjY0RW5jb2RlZE1ldHJpY3MuY19zdHIoKSk7CiAgICAgfQotICAgIGlmICghaXRlbS5zZWxmcmVjb3JkKCkpIHsKKyAgICBpZiAoIWl0ZW0tPnNlbGZyZWNvcmQoKSkgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlbGYgcmVjb3JkIGZyYW1ld29yayBtZXRyaWNzIik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0lEcm0uY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0lEcm0uY3BwCmluZGV4IDUwOTk2MWYuLjUxMjc0ZDEgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9JRHJtLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vSURybS5jcHAKQEAgLTYxLDcgKzYxLDEwIEBACiAgICAgR0VUX05VTUJFUl9PRl9TRVNTSU9OUywKICAgICBHRVRfU0VDVVJJVFlfTEVWRUwsCiAgICAgUkVNT1ZFX1NFQ1VSRV9TVE9QLAotICAgIEdFVF9TRUNVUkVfU1RPUF9JRFMKKyAgICBHRVRfU0VDVVJFX1NUT1BfSURTLAorICAgIEdFVF9PRkZMSU5FX0xJQ0VOU0VfS0VZU0VUX0lEUywKKyAgICBSRU1PVkVfT0ZGTElORV9MSUNFTlNFLAorICAgIEdFVF9PRkZMSU5FX0xJQ0VOU0VfU1RBVEUKIH07CiAKIHN0cnVjdCBCcERybSA6IHB1YmxpYyBCcEludGVyZmFjZTxJRHJtPiB7CkBAIC04MCwxOCArODMsMjIgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHZpcnR1YWwgYm9vbCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSkgeworICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCisgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsIGJvb2wgKmlzU3VwcG9ydGVkKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGUodXVpZCwgMTYpOwogICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChtaW1lVHlwZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihsZXZlbCk7CisKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KElTX0NSWVBUT19TVVBQT1JURUQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZDogYmluZGVyIGNhbGwgZmFpbGVkOiAlZCIsIHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9CisgICAgICAgICppc1N1cHBvcnRlZCA9IHN0YXRpY19jYXN0PGJvb2w+KHJlcGx5LnJlYWRJbnQzMigpKTsKIAotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCkgIT0gMDsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCkBAIC0xMjAsMTEgKzEyNywxMSBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuU2Vzc2lvbihEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzZWN1cml0eUxldmVsKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGxldmVsKTsKIAogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9TRVNTSU9OLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CkBAIC0zNzYsNiArMzgzLDUyIEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJmtleVNldElkcykgY29uc3QgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfT0ZGTElORV9MSUNFTlNFX0tFWVNFVF9JRFMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBrZXlTZXRJZHMuY2xlYXIoKTsKKyAgICAgICAgdWludDMyX3QgY291bnQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4ga2V5U2V0SWQ7CisgICAgICAgICAgICByZWFkVmVjdG9yKHJlcGx5LCBrZXlTZXRJZCk7CisgICAgICAgICAgICBrZXlTZXRJZHMucHVzaF9iYWNrKGtleVNldElkKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwga2V5U2V0SWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX09GRkxJTkVfTElDRU5TRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPZmZsaW5lTGljZW5zZVN0YXRlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQsCisgICAgICAgICAgICBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUgKmxpY2Vuc2VTdGF0ZSkgY29uc3QgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIGtleVNldElkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9PRkZMSU5FX0xJQ0VOU0VfU1RBVEUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgICpsaWNlbnNlU3RhdGUgPSBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGU6OmtPZmZsaW5lTGljZW5zZVN0YXRlVW5rbm93bjsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgKmxpY2Vuc2VTdGF0ZSA9IHN0YXRpY19jYXN0PERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZT4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSkgY29uc3QgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtNzE5LDcgKzc3MiwxMiBAQAogICAgICAgICAgICAgdWludDhfdCB1dWlkWzE2XTsKICAgICAgICAgICAgIGRhdGEucmVhZCh1dWlkLCBzaXplb2YodXVpZCkpOwogICAgICAgICAgICAgU3RyaW5nOCBtaW1lVHlwZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQsIG1pbWVUeXBlKSk7CisgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWw+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgYm9vbCBpc1N1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVR5cGUsIGxldmVsLCAmaXNTdXBwb3J0ZWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNTdXBwb3J0ZWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogCkBAIC05ODAsNiArMTAzOCw0NSBAQAogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBHRVRfT0ZGTElORV9MSUNFTlNFX0tFWVNFVF9JRFM6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBMaXN0PFZlY3Rvcjx1aW50OF90PiA+IGtleVNldElkczsKKyAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKGtleVNldElkcyk7CisgICAgICAgICAgICBzaXplX3QgY291bnQgPSBrZXlTZXRJZHMuc2l6ZSgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoY291bnQpOworICAgICAgICAgICAgTGlzdDxWZWN0b3I8dWludDhfdD4gPjo6aXRlcmF0b3IgaXRlciA9IGtleVNldElkcy5iZWdpbigpOworICAgICAgICAgICAgd2hpbGUoaXRlciAhPSBrZXlTZXRJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGl0ZXItPnNpemUoKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoaXRlci0+YXJyYXkoKSwgaXRlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBpdGVyKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBSRU1PVkVfT0ZGTElORV9MSUNFTlNFOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleVNldElkOworICAgICAgICAgICAgcmVhZFZlY3RvcihkYXRhLCBrZXlTZXRJZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZW1vdmVPZmZsaW5lTGljZW5zZShrZXlTZXRJZCkpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHRVRfT0ZGTElORV9MSUNFTlNFX1NUQVRFOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleVNldElkOworICAgICAgICAgICAgcmVhZFZlY3RvcihkYXRhLCBrZXlTZXRJZCk7CisgICAgICAgICAgICBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUgc3RhdGU7CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXRPZmZsaW5lTGljZW5zZVN0YXRlKGtleVNldElkLCAmc3RhdGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8RHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlPihzdGF0ZSkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgR0VUX1BST1BFUlRZX1NUUklORzoKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmNwcCBiL2RybS9saWJtZWRpYWRybS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmNwcAppbmRleCA1Y2I0OGJmLi44Y2Q2Zjk2IDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwCkBAIC0zNCwxNyArMzQsMTcgQEAKIHN0YXR1c190IHJlcG9ydFZlbmRvck1ldHJpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldHJpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKSB7Ci0gICAgTWVkaWFBbmFseXRpY3NJdGVtIGFuYWx5dGljc0l0ZW0obmFtZS5jX3N0cigpKTsKLSAgICBhbmFseXRpY3NJdGVtLmdlbmVyYXRlU2Vzc2lvbklEKCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQW5hbHl0aWNzSXRlbT4gYW5hbHl0aWNzSXRlbShNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShuYW1lLmNfc3RyKCkpKTsKKyAgICBhbmFseXRpY3NJdGVtLT5nZW5lcmF0ZVNlc3Npb25JRCgpOwogCiAgICAgc3RkOjpzdHJpbmcgYXBwX3BhY2thZ2VfbmFtZShhcHBQYWNrYWdlTmFtZS5jX3N0cigpLCBhcHBQYWNrYWdlTmFtZS5zaXplKCkpOwotICAgIGFuYWx5dGljc0l0ZW0uc2V0UGtnTmFtZShhcHBfcGFja2FnZV9uYW1lKTsKKyAgICBhbmFseXRpY3NJdGVtLT5zZXRQa2dOYW1lKGFwcF9wYWNrYWdlX25hbWUpOwogICAgIGlmIChtZXRyaWNzLnNpemUoKSA+IDApIHsKLSAgICAgICAgYW5hbHl0aWNzSXRlbS5zZXRDU3RyaW5nKGtTZXJpYWxpemVkTWV0cmljc0ZpZWxkLCBtZXRyaWNzLmNfc3RyKCkpOworICAgICAgICBhbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtTZXJpYWxpemVkTWV0cmljc0ZpZWxkLCBtZXRyaWNzLmNfc3RyKCkpOwogICAgIH0KIAotICAgIGlmICghYW5hbHl0aWNzSXRlbS5zZWxmcmVjb3JkKCkpIHsKLSAgICAgIEFMT0dFKCJzZWxmcmVjb3JkKCkgcmV0dXJuZWQgZmFsc2UuIHNlc3Npb0lkICUiIFBSSWQ2NCwgYW5hbHl0aWNzSXRlbS5nZXRTZXNzaW9uSUQoKSk7CisgICAgaWYgKCFhbmFseXRpY3NJdGVtLT5zZWxmcmVjb3JkKCkpIHsKKyAgICAgIEFMT0dFKCJzZWxmcmVjb3JkKCkgcmV0dXJuZWQgZmFsc2UuIHNlc3Npb0lkICUiIFBSSWQ2NCwgYW5hbHl0aWNzSXRlbS0+Z2V0U2Vzc2lvbklEKCkpOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS90ZXN0cy9BbmRyb2lkLmJwIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggNzYyODk2OC4uOWUwMTE1ZSAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTE3LDYgKzE3LDcgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCIsCiAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAogICAgICAgImxpYmJpbmRlciIsCiAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgImxpYmxvZyIsCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAKaW5kZXggMTU1OGU4Yi4uYmYzNTIyNCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcApAQCAtNjUsNyArNjUsMjAgQEAKICAgICAqcGx1Z2luID0gbmV3IENsZWFyS2V5Q2FzUGx1Z2luKGFwcERhdGEsIGNhbGxiYWNrKTsKICAgICByZXR1cm4gT0s7CiB9Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXR1c190IENsZWFyS2V5Q2FzRmFjdG9yeTo6Y3JlYXRlUGx1Z2luKAorICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwKKyAgICAgICAgdm9pZCAqYXBwRGF0YSwKKyAgICAgICAgQ2FzUGx1Z2luQ2FsbGJhY2tFeHQgY2FsbGJhY2ssCisgICAgICAgIENhc1BsdWdpbiAqKnBsdWdpbikgeworICAgIGlmICghaXNTeXN0ZW1JZFN1cHBvcnRlZChDQV9zeXN0ZW1faWQpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgKnBsdWdpbiA9IG5ldyBDbGVhcktleUNhc1BsdWdpbihhcHBEYXRhLCBjYWxsYmFjayk7CisgICAgcmV0dXJuIE9LOworfQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIGJvb2wgQ2xlYXJLZXlEZXNjcmFtYmxlckZhY3Rvcnk6OmlzU3lzdGVtSWRTdXBwb3J0ZWQoCiAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkKSBjb25zdCB7CiAgICAgcmV0dXJuIENBX3N5c3RlbV9pZCA9PSBzQ2xlYXJLZXlTeXN0ZW1JZDsKQEAgLTg0LDcgKzk3LDEzIEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiBDbGVhcktleUNhc1BsdWdpbjo6Q2xlYXJLZXlDYXNQbHVnaW4oCiAgICAgICAgIHZvaWQgKmFwcERhdGEsIENhc1BsdWdpbkNhbGxiYWNrIGNhbGxiYWNrKQotICAgIDogbUNhbGxiYWNrKGNhbGxiYWNrKSwgbUFwcERhdGEoYXBwRGF0YSkgeworICAgIDogbUNhbGxiYWNrKGNhbGxiYWNrKSwgbUNhbGxiYWNrRXh0KE5VTEwpLCBtQXBwRGF0YShhcHBEYXRhKSB7CisgICAgQUxPR1YoIkNUT1IiKTsKK30KKworQ2xlYXJLZXlDYXNQbHVnaW46OkNsZWFyS2V5Q2FzUGx1Z2luKAorICAgICAgICB2b2lkICphcHBEYXRhLCBDYXNQbHVnaW5DYWxsYmFja0V4dCBjYWxsYmFjaykKKyAgICA6IG1DYWxsYmFjayhOVUxMKSwgbUNhbGxiYWNrRXh0KGNhbGxiYWNrKSwgbUFwcERhdGEoYXBwRGF0YSkgewogICAgIEFMT0dWKCJDVE9SIik7CiB9CiAKQEAgLTE2NywxMSArMTg2LDMwIEBACiAgICAgLy8gRWNobyB0aGUgcmVjZWl2ZWQgZXZlbnQgdG8gdGhlIGNhbGxiYWNrLgogICAgIC8vIENsZWFyIGtleSBwbHVnaW4gZG9lc24ndCB1c2UgYW55IGV2ZW50LCBlY2hvJ2luZyBmb3IgdGVzdGluZyBvbmx5LgogICAgIGlmIChtQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICBtQ2FsbGJhY2soKHZvaWQqKW1BcHBEYXRhLCBldmVudCwgYXJnLCAodWludDhfdCopZXZlbnREYXRhLmRhdGEoKSwgZXZlbnREYXRhLnNpemUoKSk7CisgICAgICAgIG1DYWxsYmFjaygodm9pZCopbUFwcERhdGEsIGV2ZW50LCBhcmcsICh1aW50OF90KilldmVudERhdGEuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICBldmVudERhdGEuc2l6ZSgpKTsKKyAgICB9IGVsc2UgaWYgKG1DYWxsYmFja0V4dCAhPSBOVUxMKSB7CisgICAgICAgIG1DYWxsYmFja0V4dCgodm9pZCopbUFwcERhdGEsIGV2ZW50LCBhcmcsICh1aW50OF90KilldmVudERhdGEuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICBldmVudERhdGEuc2l6ZSgpLCBOVUxMKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDbGVhcktleUNhc1BsdWdpbjo6c2VuZFNlc3Npb25FdmVudCgKKyAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQsIGludDMyX3QgZXZlbnQsCisgICAgICAgIGludCBhcmcsIGNvbnN0IENhc0RhdGEgJmV2ZW50RGF0YSkgeworICAgIEFMT0dWKCJzZW5kU2Vzc2lvbkV2ZW50OiBzZXNzaW9uSWQ9JXMsIGV2ZW50PSVkLCBhcmc9JWQiLAorICAgICAgICAgIHNlc3Npb25JZFRvU3RyaW5nKHNlc3Npb25JZCkuc3RyaW5nKCksIGV2ZW50LCBhcmcpOworICAgIC8vIEVjaG8gdGhlIHJlY2VpdmVkIGV2ZW50IHRvIHRoZSBjYWxsYmFjay4KKyAgICAvLyBDbGVhciBrZXkgcGx1Z2luIGRvZXNuJ3QgdXNlIGFueSBldmVudCwgZWNobydpbmcgZm9yIHRlc3Rpbmcgb25seS4KKyAgICBpZiAobUNhbGxiYWNrRXh0ICE9IE5VTEwpIHsKKyAgICAgICAgbUNhbGxiYWNrRXh0KCh2b2lkKiltQXBwRGF0YSwgZXZlbnQsIGFyZywgKHVpbnQ4X3QqKWV2ZW50RGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YS5zaXplKCksICZzZXNzaW9uSWQpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQ2xlYXJLZXlDYXNQbHVnaW46OnByb3Zpc2lvbihjb25zdCBTdHJpbmc4ICZzdHIpIHsKICAgICBBTE9HVigicHJvdmlzaW9uOiBwcm92aXNpb25TdHJpbmc9JXMiLCBzdHIuc3RyaW5nKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1LZXlGZXRjaGVyTG9jayk7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5oIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uaAppbmRleCAzODllMTcyLi5mNDhkNWIxIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5oCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmgKQEAgLTQ3LDYgKzQ3LDExIEBACiAgICAgICAgICAgICB2b2lkICphcHBEYXRhLAogICAgICAgICAgICAgQ2FzUGx1Z2luQ2FsbGJhY2sgY2FsbGJhY2ssCiAgICAgICAgICAgICBDYXNQbHVnaW4gKipwbHVnaW4pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGx1Z2luKAorICAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCisgICAgICAgICAgICB2b2lkICphcHBEYXRhLAorICAgICAgICAgICAgQ2FzUGx1Z2luQ2FsbGJhY2tFeHQgY2FsbGJhY2ssCisgICAgICAgICAgICBDYXNQbHVnaW4gKipwbHVnaW4pIG92ZXJyaWRlOwogfTsKIAogY2xhc3MgQ2xlYXJLZXlEZXNjcmFtYmxlckZhY3RvcnkgOiBwdWJsaWMgRGVzY3JhbWJsZXJGYWN0b3J5IHsKQEAgLTYzLDYgKzY4LDcgQEAKIGNsYXNzIENsZWFyS2V5Q2FzUGx1Z2luIDogcHVibGljIENhc1BsdWdpbiB7CiBwdWJsaWM6CiAgICAgQ2xlYXJLZXlDYXNQbHVnaW4odm9pZCAqYXBwRGF0YSwgQ2FzUGx1Z2luQ2FsbGJhY2sgY2FsbGJhY2spOworICAgIENsZWFyS2V5Q2FzUGx1Z2luKHZvaWQgKmFwcERhdGEsIENhc1BsdWdpbkNhbGxiYWNrRXh0IGNhbGxiYWNrKTsKICAgICB2aXJ0dWFsIH5DbGVhcktleUNhc1BsdWdpbigpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcml2YXRlRGF0YSgKQEAgLTg1LDYgKzkxLDEwIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZW5kRXZlbnQoCiAgICAgICAgICAgICBpbnQzMl90IGV2ZW50LCBpbnQzMl90IGFyZywgY29uc3QgQ2FzRGF0YSAmZXZlbnREYXRhKSBvdmVycmlkZTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VuZFNlc3Npb25FdmVudCgKKyAgICAgICAgICAgIGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgaW50MzJfdCBldmVudCwgaW50MzJfdCBhcmcsIGNvbnN0IENhc0RhdGEgJmV2ZW50RGF0YSkgb3ZlcnJpZGU7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHByb3Zpc2lvbihjb25zdCBTdHJpbmc4ICZzdHIpIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWZyZXNoRW50aXRsZW1lbnRzKApAQCAtOTQsNiArMTA0LDcgQEAKICAgICBNdXRleCBtS2V5RmV0Y2hlckxvY2s7CiAgICAgc3RkOjp1bmlxdWVfcHRyPEtleUZldGNoZXI+IG1LZXlGZXRjaGVyOwogICAgIENhc1BsdWdpbkNhbGxiYWNrIG1DYWxsYmFjazsKKyAgICBDYXNQbHVnaW5DYWxsYmFja0V4dCBtQ2FsbGJhY2tFeHQ7CiAgICAgdm9pZCogbUFwcERhdGE7CiB9OwogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uY3BwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmNwcAppbmRleCA4NDA0YTgzLi4yOTY0NzkxIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5jcHAKQEAgLTYwLDYgKzYwLDE5IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNb2NrQ2FzRmFjdG9yeTo6Y3JlYXRlUGx1Z2luKAorICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwKKyAgICAgICAgdm9pZCogLyphcHBEYXRhKi8sCisgICAgICAgIENhc1BsdWdpbkNhbGxiYWNrRXh0IC8qY2FsbGJhY2sqLywKKyAgICAgICAgQ2FzUGx1Z2luICoqcGx1Z2luKSB7CisgICAgaWYgKCFpc1N5c3RlbUlkU3VwcG9ydGVkKENBX3N5c3RlbV9pZCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAqcGx1Z2luID0gbmV3IE1vY2tDYXNQbHVnaW4oKTsKKyAgICByZXR1cm4gT0s7Cit9CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogYm9vbCBNb2NrRGVzY3JhbWJsZXJGYWN0b3J5Ojppc1N5c3RlbUlkU3VwcG9ydGVkKGludDMyX3QgQ0Ffc3lzdGVtX2lkKSBjb25zdCB7CkBAIC0xNzAsNiArMTgzLDE2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNb2NrQ2FzUGx1Z2luOjpzZW5kU2Vzc2lvbkV2ZW50KAorICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCwgaW50MzJfdCBldmVudCwKKyAgICAgICAgaW50IC8qYXJnKi8sIGNvbnN0IENhc0RhdGEmIC8qZXZlbnREYXRhKi8pIHsKKyAgICBBTE9HVigic2VuZFNlc3Npb25FdmVudDogc2Vzc2lvbklkPSVzLCBldmVudD0lZCIsCisgICAgICAgICAgYXJyYXlUb1N0cmluZyhzZXNzaW9uSWQpLnN0cmluZygpLCBldmVudCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBNb2NrQ2FzUGx1Z2luOjpwcm92aXNpb24oY29uc3QgU3RyaW5nOCAmc3RyKSB7CiAgICAgQUxPR1YoInByb3Zpc2lvbjogcHJvdmlzaW9uU3RyaW5nPSVzIiwgc3RyLnN0cmluZygpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uaCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5oCmluZGV4IDgxMDY5OTAuLjc0YjU0MGMgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5oCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5oCkBAIC00Miw2ICs0MiwxMSBAQAogICAgICAgICAgICAgdm9pZCAqYXBwRGF0YSwKICAgICAgICAgICAgIENhc1BsdWdpbkNhbGxiYWNrIGNhbGxiYWNrLAogICAgICAgICAgICAgQ2FzUGx1Z2luICoqcGx1Z2luKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBsdWdpbigKKyAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAorICAgICAgICAgICAgdm9pZCAqYXBwRGF0YSwKKyAgICAgICAgICAgIENhc1BsdWdpbkNhbGxiYWNrRXh0IGNhbGxiYWNrLAorICAgICAgICAgICAgQ2FzUGx1Z2luICoqcGx1Z2luKSBvdmVycmlkZTsKIH07CiAKIGNsYXNzIE1vY2tEZXNjcmFtYmxlckZhY3RvcnkgOiBwdWJsaWMgRGVzY3JhbWJsZXJGYWN0b3J5IHsKQEAgLTgwLDcgKzg1LDExIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZW5kRXZlbnQoCiAgICAgICAgICAgICBpbnQzMl90IGV2ZW50LCBpbnQzMl90IGFyZywgY29uc3QgQ2FzRGF0YSAmZXZlbnREYXRhKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlzaW9uKGNvbnN0IFN0cmluZzggJnN0cikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZW5kU2Vzc2lvbkV2ZW50KAorICAgICAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQsCisgICAgICAgICAgICBpbnQzMl90IGV2ZW50LCBpbnQzMl90IGFyZywgY29uc3QgQ2FzRGF0YSAmZXZlbnREYXRhKSBvdmVycmlkZTsKKworICAgICB2aXJ0dWFsIHN0YXR1c190IHByb3Zpc2lvbihjb25zdCBTdHJpbmc4ICZzdHIpIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWZyZXNoRW50aXRsZW1lbnRzKAogICAgICAgICAgICAgaW50MzJfdCByZWZyZXNoVHlwZSwgY29uc3QgQ2FzRGF0YSAmcmVmcmVzaERhdGEpIG92ZXJyaWRlOwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL1V0aWxzLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9VdGlscy5jcHAKaW5kZXggOTNjNjQzYi4uZDQ4YjBhOCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL1V0aWxzLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vVXRpbHMuY3BwCkBAIC0yNyw0ICsyNywxOCBAQAogICAgIHJldHVybiBtZW1jbXAoKHZvaWQgKilsaHMuYXJyYXkoKSwgKHZvaWQgKilyaHMuYXJyYXkoKSwgcmhzLnNpemUoKSkgPCAwOwogfQogCitzdGQ6OnN0cmluZyBCeXRlQXJyYXlUb0hleFN0cmluZyhjb25zdCB1aW50OF90KiBpbl9idWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrSGV4Q2hhcnNbXSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKKworICAgIC8vIEVhY2ggaW5wdXQgYnl0ZSBjcmVhdGVzIHR3byBvdXRwdXQgaGV4IGNoYXJhY3RlcnMuCisgICAgc3RkOjpzdHJpbmcgb3V0X2J1ZmZlcihsZW5ndGggKiAyLCAnXDAnKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgY2hhciBieXRlID0gaW5fYnVmZmVyW2ldOworICAgICAgICBvdXRfYnVmZmVyWyhpICogMildID0ga0hleENoYXJzWyhieXRlID4+IDQpICYgMHhmXTsKKyAgICAgICAgb3V0X2J1ZmZlclsoaSAqIDIpICsgMV0gPSBrSGV4Q2hhcnNbYnl0ZSAmIDB4Zl07CisgICAgfQorICAgIHJldHVybiBvdXRfYnVmZmVyOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9VdGlscy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvVXRpbHMuaAppbmRleCAyNTQzMTI0Li5hYTU3MWMwIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9VdGlscy5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL1V0aWxzLmgKQEAgLTE3LDE0ICsxNywxNiBAQAogI2lmbmRlZiBDTEVBUktFWV9VVElMU19IXwogI2RlZmluZSBDTEVBUktFWV9VVElMU19IXwogCisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCituYW1lc3BhY2UgYW5kcm9pZCB7CiAvLyBBZGQgYSBjb21wYXJpc29uIG9wZXJhdG9yIGZvciB0aGlzIFZlY3RvciBzcGVjaWFsaXphdGlvbiBzbyB0aGF0IGl0IGNhbiBiZQogLy8gdXNlZCBhcyBhIGtleSBpbiBhIEtleWVkVmVjdG9yLgotbmFtZXNwYWNlIGFuZHJvaWQgewotCiBib29sIG9wZXJhdG9yPChjb25zdCBWZWN0b3I8dWludDhfdD4gJmxocywgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZyaHMpOwogCitzdGQ6OnN0cmluZyBCeXRlQXJyYXlUb0hleFN0cmluZyhjb25zdCB1aW50OF90KiBpbl9idWZmZXIsIHNpemVfdCBsZW5ndGgpOworCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQWVzQ3RyRGVjcnlwdG9yLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQWVzQ3RyRGVjcnlwdG9yLmNwcAppbmRleCAyZmNlMDc5MC4uMGFjODc5YyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BZXNDdHJEZWNyeXB0b3IuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQWVzQ3RyRGVjcnlwdG9yLmNwcApAQCAtMjYsNyArMjYsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdWJTYW1wbGU7CkBAIC03OSw3ICs3OSw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0FuZHJvaWQuYnAKaW5kZXggMzQxZDRmNi4uZTkxZTkxOCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQW5kcm9pZC5icApAQCAtMTQsOCArMTQsOCBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAvLwogCi1jY19iaW5hcnkgewotICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleSIsCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImNsZWFya2V5X3NlcnZpY2VfZGVmYXVsdHMiLAogICAgIHZlbmRvcjogdHJ1ZSwKIAogICAgIHNyY3M6IFsKQEAgLTI1LDIzICsyNSwyNCBAQAogICAgICAgICAiQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcCIsCiAgICAgICAgICJDcnlwdG9GYWN0b3J5LmNwcCIsCiAgICAgICAgICJDcnlwdG9QbHVnaW4uY3BwIiwKKyAgICAgICAgIkRldmljZUZpbGVzLmNwcCIsCiAgICAgICAgICJEcm1GYWN0b3J5LmNwcCIsCiAgICAgICAgICJEcm1QbHVnaW4uY3BwIiwKICAgICAgICAgIkluaXREYXRhUGFyc2VyLmNwcCIsCiAgICAgICAgICJKc29uV2ViS2V5LmNwcCIsCisgICAgICAgICJNZW1vcnlGaWxlU3lzdGVtLmNwcCIsCiAgICAgICAgICJTZXNzaW9uLmNwcCIsCiAgICAgICAgICJTZXNzaW9uTGlicmFyeS5jcHAiLAotICAgICAgICAic2VydmljZS5jcHAiLAogICAgIF0sCiAKICAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCiAKICAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAotICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkucmMiXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMiIsCiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjcnlwdG8iLApAQCAtNDksMTEgKzUwLDEzIEBACiAgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAogICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmNsZWFya2V5Y29tbW9uIiwKKyAgICAgICAgImxpYmNsZWFya2V5ZGV2aWNlZmlsZXMtcHJvdG9zIiwKICAgICAgICAgImxpYmpzbW4iLAogICAgIF0sCiAKQEAgLTY1LDQgKzY4LDI2IEBACiAgICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCiAgICAgfSwKIH0KK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGliY2xlYXJrZXlkZXZpY2VmaWxlcy1wcm90b3MiLAorICAgIHZlbmRvcjogdHJ1ZSwKIAorICAgIHByb3RvOiB7CisgICAgICAgIGV4cG9ydF9wcm90b19oZWFkZXJzOiB0cnVlLAorICAgICAgICB0eXBlOiAibGl0ZSIsCisgICAgfSwKKyAgICBzcmNzOiBbInByb3Rvcy9EZXZpY2VGaWxlcy5wcm90byJdLAorfQorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkiLAorICAgIGRlZmF1bHRzOiBbImNsZWFya2V5X3NlcnZpY2VfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInNlcnZpY2UuY3BwIl0sCisgICAgaW5pdF9yYzogWyJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleS5yYyJdLAorfQorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UtbGF6eS5jbGVhcmtleSIsCisgICAgb3ZlcnJpZGVzOiBbImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5Il0sCisgICAgZGVmYXVsdHM6IFsiY2xlYXJrZXlfc2VydmljZV9kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsic2VydmljZUxhenkuY3BwIl0sCisgICAgaW5pdF9yYzogWyJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS1sYXp5LmNsZWFya2V5LnJjIl0sCit9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Jhc2U2NC5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Jhc2U2NC5jcHAKaW5kZXggYzJlZDc1MS4uNjU3YTQyZiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CYXNlNjQuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQmFzZTY0LmNwcApAQCAtMjEsNyArMjEsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogc3A8QnVmZmVyPiBkZWNvZGVCYXNlNjQoY29uc3Qgc3RkOjpzdHJpbmcgJnMpIHsKQEAgLTE2OSw3ICsxNjksNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CdWZmZXIuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CdWZmZXIuY3BwCmluZGV4IGU1OGY1OGEuLjc1ZjgzOTUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQnVmZmVyLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0J1ZmZlci5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIEJ1ZmZlcjo6QnVmZmVyKHNpemVfdCBjYXBhY2l0eSkKQEAgLTQ3LDcgKzQ3LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcAppbmRleCAxYmE1YzZhLi4xNDEwZDc3IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwCkBAIC0yMiw3ICsyMiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBleHRlcm4gIkMiIHsKQEAgLTM4LDcgKzM4LDcgQEAKIH0gLy8gZXh0ZXJuICJDIgogCiB9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gIC8vIG5hbWVzcGFjZSBWMV8xCit9ICAvLyBuYW1lc3BhY2UgVjFfMgogfSAgLy8gbmFtZXNwYWNlIGRybQogfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9GYWN0b3J5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvRmFjdG9yeS5jcHAKaW5kZXggMDg0OGNlZi4uMmE0OGRiNiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9GYWN0b3J5LmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b0ZhY3RvcnkuY3BwCkBAIC0yNyw3ICsyNyw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBSZXR1cm48Ym9vbD4gQ3J5cHRvRmFjdG9yeTo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoCkBAIC02MCw3ICs2MCw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b1BsdWdpbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b1BsdWdpbi5jcHAKaW5kZXggZjMzZjk0ZS4uMjNhMzVlNSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9QbHVnaW4uY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvUGx1Z2luLmNwcApAQCAtMjcsNyArMjcsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpCdWZmZXJUeXBlOwpAQCAtNDIsMTAgKzQyLDQyIEBACiAgICAgcmV0dXJuIFZvaWQoKTsKIH0KIAorUmV0dXJuPHZvaWQ+IENyeXB0b1BsdWdpbjo6ZGVjcnlwdCgKKyAgICBib29sIHNlY3VyZSwKKyAgICBjb25zdCBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PiYga2V5SWQsCisgICAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCAxNj4mIGl2LAorICAgIE1vZGUgbW9kZSwKKyAgICBjb25zdCBQYXR0ZXJuJiBwYXR0ZXJuLAorICAgIGNvbnN0IGhpZGxfdmVjPFN1YlNhbXBsZT4mIHN1YlNhbXBsZXMsCisgICAgY29uc3QgU2hhcmVkQnVmZmVyJiBzb3VyY2UsCisgICAgdWludDY0X3Qgb2Zmc2V0LAorICAgIGNvbnN0IERlc3RpbmF0aW9uQnVmZmVyJiBkZXN0aW5hdGlvbiwKKyAgICBkZWNyeXB0X2NiIF9oaWRsX2NiKSB7CisKKyAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6RVJST1JfRFJNX1VOS05PV047CisgIGhpZGxfc3RyaW5nIGRldGFpbGVkRXJyb3I7CisgIHVpbnQzMl90IGJ5dGVzV3JpdHRlbiA9IDA7CisKKyAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBkZWNyeXB0XzFfMigKKyAgICAgIHNlY3VyZSwga2V5SWQsIGl2LCBtb2RlLCBwYXR0ZXJuLCBzdWJTYW1wbGVzLCBzb3VyY2UsIG9mZnNldCwgZGVzdGluYXRpb24sCisgICAgICBbJl0oU3RhdHVzX1YxXzIgaFN0YXR1cywgdWludDMyX3QgaEJ5dGVzV3JpdHRlbiwgaGlkbF9zdHJpbmcgaERldGFpbGVkRXJyb3IpIHsKKyAgICAgICAgc3RhdHVzID0gdG9TdGF0dXNfMV8wKGhTdGF0dXMpOworICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBoQnl0ZXNXcml0dGVuOworICAgICAgICAgIGRldGFpbGVkRXJyb3IgPSBoRGV0YWlsZWRFcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgICk7CisKKyAgc3RhdHVzID0gaFJlc3VsdC5pc09rKCkgPyBzdGF0dXMgOiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICBfaGlkbF9jYihzdGF0dXMsIGJ5dGVzV3JpdHRlbiwgZGV0YWlsZWRFcnJvcik7CisgIHJldHVybiBWb2lkKCk7Cit9CisKIC8vIFJldHVybnMgbmVnYXRpdmUgdmFsdWVzIGZvciBlcnJvciBjb2RlIGFuZCBwb3NpdGl2ZSB2YWx1ZXMgZm9yIHRoZSBzaXplIG9mCiAvLyBkZWNyeXB0ZWQgZGF0YS4gIEluIHRoZW9yeSwgdGhlIG91dHB1dCBzaXplIGNhbiBiZSBsYXJnZXIgdGhhbiB0aGUgaW5wdXQKIC8vIHNpemUsIGJ1dCBpbiBwcmFjdGljZSB0aGlzIHdpbGwgbmV2ZXIgaGFwcGVuIGZvciBBRVMtQ1RSLgotUmV0dXJuPHZvaWQ+IENyeXB0b1BsdWdpbjo6ZGVjcnlwdCgKK1JldHVybjx2b2lkPiBDcnlwdG9QbHVnaW46OmRlY3J5cHRfMV8yKAogICAgICAgICBib29sIHNlY3VyZSwKICAgICAgICAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCBLRVlfSURfU0laRT4mIGtleUlkLAogICAgICAgICBjb25zdCBoaWRsX2FycmF5PHVpbnQ4X3QsIEtFWV9JVl9TSVpFPiYgaXYsCkBAIC01NSwxNyArODcsMTcgQEAKICAgICAgICAgY29uc3QgU2hhcmVkQnVmZmVyJiBzb3VyY2UsCiAgICAgICAgIHVpbnQ2NF90IG9mZnNldCwKICAgICAgICAgY29uc3QgRGVzdGluYXRpb25CdWZmZXImIGRlc3RpbmF0aW9uLAotICAgICAgICBkZWNyeXB0X2NiIF9oaWRsX2NiKSB7CisgICAgICAgIGRlY3J5cHRfMV8yX2NiIF9oaWRsX2NiKSB7CiAgICAgVU5VU0VEKHBhdHRlcm4pOwogCiAgICAgaWYgKHNlY3VyZSkgewotICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAorICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCiAgICAgICAgICAgICAiU2VjdXJlIGRlY3J5cHRpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoIENsZWFyS2V5LiIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAogICAgIGlmIChtU2hhcmVkQnVmZmVyTWFwLmZpbmQoc291cmNlLmJ1ZmZlcklkKSA9PSBtU2hhcmVkQnVmZmVyTWFwLmVuZCgpKSB7Ci0gICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAorICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAogICAgICAgICAgICAgICAgInNvdXJjZSBkZWNyeXB0IGJ1ZmZlciBiYXNlIG5vdCBzZXQiKTsKICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQpAQCAtNzMsNyArMTA1LDcgQEAKICAgICBpZiAoZGVzdGluYXRpb24udHlwZSA9PSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZKSB7CiAgICAgICBjb25zdCBTaGFyZWRCdWZmZXImIGRlc3QgPSBkZXN0aW5hdGlvbi5ub25zZWN1cmVNZW1vcnk7CiAgICAgICBpZiAobVNoYXJlZEJ1ZmZlck1hcC5maW5kKGRlc3QuYnVmZmVySWQpID09IG1TaGFyZWRCdWZmZXJNYXAuZW5kKCkpIHsKLSAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAogICAgICAgICAgICAgICAgICAiZGVzdGluYXRpb24gZGVjcnlwdCBidWZmZXIgYmFzZSBub3Qgc2V0Iik7CiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgICB9CkBAIC04MSwxMiArMTEzLDEyIEBACiAKICAgICBzcDxJTWVtb3J5PiBzb3VyY2VCYXNlID0gbVNoYXJlZEJ1ZmZlck1hcFtzb3VyY2UuYnVmZmVySWRdOwogICAgIGlmIChzb3VyY2VCYXNlID09IG51bGxwdHIpIHsKLSAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgInNvdXJjZSBpcyBhIG51bGxwdHIiKTsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLCAic291cmNlIGlzIGEgbnVsbHB0ciIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAogICAgIGlmIChzb3VyY2Uub2Zmc2V0ICsgb2Zmc2V0ICsgc291cmNlLnNpemUgPiBzb3VyY2VCYXNlLT5nZXRTaXplKCkpIHsKLSAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgImludmFsaWQgYnVmZmVyIHNpemUiKTsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLCAiaW52YWxpZCBidWZmZXIgc2l6ZSIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIApAQCAtOTgsMTIgKzEzMCwxMiBAQAogICAgICAgICBjb25zdCBTaGFyZWRCdWZmZXImIGRlc3RCdWZmZXIgPSBkZXN0aW5hdGlvbi5ub25zZWN1cmVNZW1vcnk7CiAgICAgICAgIHNwPElNZW1vcnk+IGRlc3RCYXNlID0gbVNoYXJlZEJ1ZmZlck1hcFtkZXN0QnVmZmVyLmJ1ZmZlcklkXTsKICAgICAgICAgaWYgKGRlc3RCYXNlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsICJkZXN0aW5hdGlvbiBpcyBhIG51bGxwdHIiKTsKKyAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgImRlc3RpbmF0aW9uIGlzIGEgbnVsbHB0ciIpOwogICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChkZXN0QnVmZmVyLm9mZnNldCArIGRlc3RCdWZmZXIuc2l6ZSA+IGRlc3RCYXNlLT5nZXRTaXplKCkpIHsKLSAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsICJpbnZhbGlkIGJ1ZmZlciBzaXplIik7CisgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRSwgMCwgImludmFsaWQgYnVmZmVyIHNpemUiKTsKICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgICAgIH0KICAgICAgICAgZGVzdFB0ciA9IHN0YXRpY19jYXN0PHZvaWQgKj4oYmFzZSArIGRlc3RpbmF0aW9uLm5vbnNlY3VyZU1lbW9yeS5vZmZzZXQpOwpAQCAtMTI4LDcgKzE2MCw3IEBACiAKICAgICBpZiAobW9kZSA9PSBNb2RlOjpVTkVOQ1JZUFRFRCkgewogICAgICAgICBpZiAoaGF2ZUVuY3J5cHRlZFN1YnNhbXBsZXMpIHsKLSAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCisgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCiAgICAgICAgICAgICAgICAgICAgICJFbmNyeXB0ZWQgc3Vic2FtcGxlcyBmb3VuZCBpbiBhbGxlZ2VkbHkgdW5lbmNyeXB0ZWQgZGF0YS4iKTsKICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgICAgIH0KQEAgLTE0NCwyMiArMTc2LDIxIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBzdGF0aWNfY2FzdDxzc2l6ZV90PihvZmZzZXQpLCAiIik7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpPSywgc3RhdGljX2Nhc3Q8c3NpemVfdD4ob2Zmc2V0KSwgIiIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0gZWxzZSBpZiAobW9kZSA9PSBNb2RlOjpBRVNfQ1RSKSB7CiAgICAgICAgIHNpemVfdCBieXRlc0RlY3J5cHRlZDsKLSAgICAgICAgU3RhdHVzIHJlcyA9IG1TZXNzaW9uLT5kZWNyeXB0KGtleUlkLmRhdGEoKSwgaXYuZGF0YSgpLCBzcmNQdHIsCisgICAgICAgIFN0YXR1c19WMV8yIHJlcyA9IG1TZXNzaW9uLT5kZWNyeXB0KGtleUlkLmRhdGEoKSwgaXYuZGF0YSgpLCBzcmNQdHIsCiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdCo+KGRlc3RQdHIpLCB0b1ZlY3RvcihzdWJTYW1wbGVzKSwgJmJ5dGVzRGVjcnlwdGVkKTsKLSAgICAgICAgaWYgKHJlcyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBzdGF0aWNfY2FzdDxzc2l6ZV90PihieXRlc0RlY3J5cHRlZCksICIiKTsKKyAgICAgICAgaWYgKHJlcyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpPSywgc3RhdGljX2Nhc3Q8c3NpemVfdD4oYnl0ZXNEZWNyeXB0ZWQpLCAiIik7CiAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fREVDUllQVCwgc3RhdGljX2Nhc3Q8c3NpemVfdD4ocmVzKSwKLSAgICAgICAgICAgICAgICAgICAgIkRlY3J5cHRpb24gRXJyb3IiKTsKKyAgICAgICAgICAgIF9oaWRsX2NiKHJlcywgMCwgIkRlY3J5cHRpb24gRXJyb3IiKTsKICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAorICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCiAgICAgICAgICAgICAgICAgIlNlbGVjdGVkIGVuY3J5cHRpb24gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBDbGVhcktleSBEUk0gUGx1Z2luLiIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KQEAgLTE3OSw3ICsyMTAsNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9EZXZpY2VGaWxlcy5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RldmljZUZpbGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDE1YjZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9EZXZpY2VGaWxlcy5jcHAKQEAgLTAsMCArMSwyNTIgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgZmlsZSBhbmQgcHJvcHJpZXRhcnkKKy8vIHNvdXJjZSBjb2RlIG1heSBvbmx5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXaWRldmluZSBNYXN0ZXIKKy8vIExpY2Vuc2UgQWdyZWVtZW50LgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgIkRldmljZUZpbGVzLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisKKy8vIFByb3RvYnVmIGdlbmVyYXRlZCBjbGFzc2VzLgordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6Ok9mZmxpbmVGaWxlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6Okhhc2hlZEZpbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6TGljZW5zZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9BQ1RJVkU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6TGljZW5zZV9MaWNlbnNlU3RhdGVfUkVMRUFTSU5HOworCituYW1lc3BhY2UgeworY29uc3QgY2hhciBrTGljZW5zZUZpbGVOYW1lRXh0W10gPSAiLmxpYyI7CisKK2Jvb2wgSGFzaChjb25zdCBzdGQ6OnN0cmluZyYgZGF0YSwgc3RkOjpzdHJpbmcqIGhhc2gpIHsKKyAgICBpZiAoIWhhc2gpIHJldHVybiBmYWxzZTsKKworICAgIGhhc2gtPnJlc2l6ZShTSEEyNTZfRElHRVNUX0xFTkdUSCk7CisKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbnB1dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGRhdGEuZGF0YSgpKTsKKyAgICB1bnNpZ25lZCBjaGFyKiBvdXRwdXQgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPigmKCpoYXNoKVswXSk7CisgICAgU0hBMjU2KGlucHV0LCBkYXRhLnNpemUoKSwgb3V0cHV0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlN0b3JlTGljZW5zZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkLCBMaWNlbnNlU3RhdGUgc3RhdGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsaWNlbnNlUmVzcG9uc2UpIHsKKworICAgIE9mZmxpbmVGaWxlIGZpbGU7CisgICAgZmlsZS5zZXRfdHlwZShPZmZsaW5lRmlsZTo6TElDRU5TRSk7CisgICAgZmlsZS5zZXRfdmVyc2lvbihPZmZsaW5lRmlsZTo6VkVSU0lPTl8xKTsKKworICAgIExpY2Vuc2UqIGxpY2Vuc2UgPSBmaWxlLm11dGFibGVfbGljZW5zZSgpOworICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBrTGljZW5zZVN0YXRlQWN0aXZlOgorICAgICAgICAgICAgbGljZW5zZS0+c2V0X3N0YXRlKExpY2Vuc2VfTGljZW5zZVN0YXRlX0FDVElWRSk7CisgICAgICAgICAgICBsaWNlbnNlLT5zZXRfbGljZW5zZShsaWNlbnNlUmVzcG9uc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga0xpY2Vuc2VTdGF0ZVJlbGVhc2luZzoKKyAgICAgICAgICAgIGxpY2Vuc2UtPnNldF9zdGF0ZShMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9SRUxFQVNJTkcpOworICAgICAgICAgICAgbGljZW5zZS0+c2V0X2xpY2Vuc2UobGljZW5zZVJlc3BvbnNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIlN0b3JlTGljZW5zZTogVW5rbm93biBsaWNlbnNlIHN0YXRlOiAldSIsIHN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkRmlsZTsKKyAgICBmaWxlLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkRmlsZSk7CisKKyAgICByZXR1cm4gU3RvcmVGaWxlV2l0aEhhc2goa2V5U2V0SWQgKyBrTGljZW5zZUZpbGVOYW1lRXh0LCBzZXJpYWxpemVkRmlsZSk7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlN0b3JlRmlsZVdpdGhIYXNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRGaWxlKSB7CisgICAgc3RkOjpzdHJpbmcgaGFzaDsKKyAgICBpZiAoIUhhc2goc2VyaWFsaXplZEZpbGUsICZoYXNoKSkgeworICAgICAgICBBTE9HRSgiU3RvcmVGaWxlV2l0aEhhc2g6IEZhaWxlZCB0byBjb21wdXRlIGhhc2giKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEhhc2hlZEZpbGUgaGFzaEZpbGU7CisgICAgaGFzaEZpbGUuc2V0X2ZpbGUoc2VyaWFsaXplZEZpbGUpOworICAgIGhhc2hGaWxlLnNldF9oYXNoKGhhc2gpOworCisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZEhhc2hGaWxlOworICAgIGhhc2hGaWxlLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkSGFzaEZpbGUpOworCisgICAgcmV0dXJuIFN0b3JlRmlsZVJhdyhmaWxlTmFtZSwgc2VyaWFsaXplZEhhc2hGaWxlKTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6U3RvcmVGaWxlUmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRIYXNoRmlsZSkgeworICAgIE1lbW9yeUZpbGVTeXN0ZW06Ok1lbW9yeUZpbGUgbWVtRmlsZTsKKyAgICBtZW1GaWxlLnNldEZpbGVOYW1lKGZpbGVOYW1lKTsKKyAgICBtZW1GaWxlLnNldENvbnRlbnQoc2VyaWFsaXplZEhhc2hGaWxlKTsKKyAgICBtZW1GaWxlLnNldEZpbGVTaXplKHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCkpOworICAgIHNpemVfdCBsZW4gPSBtRmlsZUhhbmRsZS5Xcml0ZShmaWxlTmFtZSwgbWVtRmlsZSk7CisKKyAgICBpZiAobGVuICE9IHN0YXRpY19jYXN0PHNpemVfdD4oc2VyaWFsaXplZEhhc2hGaWxlLnNpemUoKSkpIHsKKyAgICAgICAgQUxPR0UoIlN0b3JlRmlsZVJhdzogRmFpbGVkIHRvIHdyaXRlICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIEFMT0dEKCJTdG9yZUZpbGVSYXc6IGV4cGVjdGVkPSV6ZCwgYWN0dWFsPSV6dSIsIHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCksIGxlbik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBTE9HRCgiU3RvcmVGaWxlUmF3OiB3cm90ZSAlenUgYnl0ZXMgdG8gJXMiLCBzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6UmV0cmlldmVMaWNlbnNlKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCwgTGljZW5zZVN0YXRlKiBzdGF0ZSwgc3RkOjpzdHJpbmcqIG9mZmxpbmVMaWNlbnNlKSB7CisKKyAgICBPZmZsaW5lRmlsZSBmaWxlOworICAgIGlmICghUmV0cmlldmVIYXNoZWRGaWxlKGtleVNldElkICsga0xpY2Vuc2VGaWxlTmFtZUV4dCwgJmZpbGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZmlsZS50eXBlKCkgIT0gT2ZmbGluZUZpbGU6OkxJQ0VOU0UpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlTGljZW5zZTogSW52YWxpZCBmaWxlIHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChmaWxlLnZlcnNpb24oKSAhPSBPZmZsaW5lRmlsZTo6VkVSU0lPTl8xKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUxpY2Vuc2U6IEludmFsaWQgZmlsZSB2ZXJzaW9uIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWZpbGUuaGFzX2xpY2Vuc2UoKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVMaWNlbnNlOiBMaWNlbnNlIG5vdCBwcmVzZW50Iik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBMaWNlbnNlIGxpY2Vuc2UgPSBmaWxlLmxpY2Vuc2UoKTsKKyAgICBzd2l0Y2ggKGxpY2Vuc2Uuc3RhdGUoKSkgeworICAgICAgICBjYXNlIExpY2Vuc2VfTGljZW5zZVN0YXRlX0FDVElWRToKKyAgICAgICAgICAgICpzdGF0ZSA9IGtMaWNlbnNlU3RhdGVBY3RpdmU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9SRUxFQVNJTkc6CisgICAgICAgICAgICAqc3RhdGUgPSBrTGljZW5zZVN0YXRlUmVsZWFzaW5nOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiUmV0cmlldmVMaWNlbnNlOiBVbnJlY29nbml6ZWQgbGljZW5zZSBzdGF0ZTogJXUiLAorICAgICAgICAgICAgICAgICAgICBrTGljZW5zZVN0YXRlVW5rbm93bik7CisgICAgICAgICAgICAqc3RhdGUgPSBrTGljZW5zZVN0YXRlVW5rbm93bjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAqb2ZmbGluZUxpY2Vuc2UgPSBsaWNlbnNlLmxpY2Vuc2UoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6RGVsZXRlTGljZW5zZShjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpIHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuUmVtb3ZlRmlsZShrZXlTZXRJZCArIGtMaWNlbnNlRmlsZU5hbWVFeHQpOworfQorCitib29sIERldmljZUZpbGVzOjpEZWxldGVBbGxMaWNlbnNlcygpIHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuUmVtb3ZlQWxsRmlsZXMoKTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6TGljZW5zZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpIHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuRmlsZUV4aXN0cyhrZXlTZXRJZCArIGtMaWNlbnNlRmlsZU5hbWVFeHQpOworfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gRGV2aWNlRmlsZXM6Okxpc3RMaWNlbnNlcygpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGljZW5zZXMgPSBtRmlsZUhhbmRsZS5MaXN0RmlsZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpY2Vuc2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nJiBsaWNlbnNlID0gbGljZW5zZXNbaV07CisgICAgICAgIGxpY2Vuc2UgPSBsaWNlbnNlLnN1YnN0cigwLCBsaWNlbnNlLnNpemUoKSAtIHN0cmxlbihrTGljZW5zZUZpbGVOYW1lRXh0KSk7CisgICAgfQorICAgIHJldHVybiBsaWNlbnNlczsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6UmV0cmlldmVIYXNoZWRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwgT2ZmbGluZUZpbGUqIGRlU2VyaWFsaXplZEZpbGUpIHsKKyAgICBpZiAoIWRlU2VyaWFsaXplZEZpbGUpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogaW52YWxpZCBmaWxlIHBhcmFtZXRlciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFGaWxlRXhpc3RzKGZpbGVOYW1lKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiAlcyBkb2VzIG5vdCBleGlzdCIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3NpemVfdCBieXRlcyA9IEdldEZpbGVTaXplKGZpbGVOYW1lKTsKKyAgICBpZiAoYnl0ZXMgPD0gMCkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBpbnZhbGlkIGZpbGUgc2l6ZTogJXMiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBjb3JydXB0ZWQgZmlsZSBzbyB0aGUgY2FsbGVyIHdpbGwgbm90IGdldCB0aGUgc2FtZSBlcnJvcgorICAgICAgICAvLyB3aGVuIHRyeWluZyB0byBhY2Nlc3MgdGhlIGZpbGUgcmVwZWF0ZWRseSwgY2F1c2luZyB0aGUgc3lzdGVtIHRvIHN0YWxsLgorICAgICAgICBSZW1vdmVGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRIYXNoRmlsZTsKKyAgICBzZXJpYWxpemVkSGFzaEZpbGUucmVzaXplKGJ5dGVzKTsKKyAgICBieXRlcyA9IG1GaWxlSGFuZGxlLlJlYWQoZmlsZU5hbWUsICZzZXJpYWxpemVkSGFzaEZpbGUpOworCisgICAgaWYgKGJ5dGVzICE9IHN0YXRpY19jYXN0PHNzaXplX3Q+KHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCkpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IEZhaWxlZCB0byByZWFkIGZyb20gJXMiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgQUxPR1YoIlJldHJpZXZlSGFzaGVkRmlsZTogZXhwZWN0ZWQ6ICV6ZCwgYWN0dWFsOiAlemQiLCBzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpLCBieXRlcyk7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgY29ycnVwdGVkIGZpbGUgc28gdGhlIGNhbGxlciB3aWxsIG5vdCBnZXQgdGhlIHNhbWUgZXJyb3IKKyAgICAgICAgLy8gd2hlbiB0cnlpbmcgdG8gYWNjZXNzIHRoZSBmaWxlIHJlcGVhdGVkbHksIGNhdXNpbmcgdGhlIHN5c3RlbSB0byBzdGFsbC4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBTE9HVigiUmV0cmlldmVIYXNoZWRGaWxlOiByZWFkICV6ZCBmcm9tICVzIiwgYnl0ZXMsIGZpbGVOYW1lLmNfc3RyKCkpOworCisgICAgSGFzaGVkRmlsZSBoYXNoRmlsZTsKKyAgICBpZiAoIWhhc2hGaWxlLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkSGFzaEZpbGUpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IFVuYWJsZSB0byBwYXJzZSBoYXNoIGZpbGUiKTsKKyAgICAgICAgLy8gUmVtb3ZlIGNvcnJ1cHQgZmlsZS4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBoYXNoOworICAgIGlmICghSGFzaChoYXNoRmlsZS5maWxlKCksICZoYXNoKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBIYXNoIGNvbXB1dGF0aW9uIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGhhc2ggIT0gaGFzaEZpbGUuaGFzaCgpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IEhhc2ggbWlzbWF0Y2giKTsKKyAgICAgICAgLy8gUmVtb3ZlIGNvcnJ1cHQgZmlsZS4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWRlU2VyaWFsaXplZEZpbGUtPlBhcnNlRnJvbVN0cmluZyhoYXNoRmlsZS5maWxlKCkpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IFVuYWJsZSB0byBwYXJzZSBmaWxlIik7CisgICAgICAgIC8vIFJlbW92ZSBjb3JydXB0IGZpbGUuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OkZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLkZpbGVFeGlzdHMoZmlsZU5hbWUpOworfQorCitib29sIERldmljZUZpbGVzOjpSZW1vdmVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgeworICAgIHJldHVybiBtRmlsZUhhbmRsZS5SZW1vdmVGaWxlKGZpbGVOYW1lKTsKK30KKworc3NpemVfdCBEZXZpY2VGaWxlczo6R2V0RmlsZVNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLkdldEZpbGVTaXplKGZpbGVOYW1lKTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtRmFjdG9yeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybUZhY3RvcnkuY3BwCmluZGV4IDc3NTU3ZjkuLjlmYjViYmUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtRmFjdG9yeS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1GYWN0b3J5LmNwcApAQCAtMzAsMTAgKzMwLDExIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CiAKIFJldHVybjxib29sPiBEcm1GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCgKQEAgLTQxLDYgKzQyLDEzIEBACiAgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjppc0NsZWFyS2V5VVVJRCh1dWlkLmRhdGEoKSk7CiB9CiAKK1JldHVybjxib29sPiBEcm1GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZF8xXzIoY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCAxNj4mIHV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nICZtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJpdHlMZXZlbCBsZXZlbCkgeworICAgIHJldHVybiBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKSAmJiBpc0NvbnRlbnRUeXBlU3VwcG9ydGVkKG1pbWVUeXBlKSAmJgorICAgICAgICAgICAgbGV2ZWwgPT0gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0NSWVBUTzsKK30KKwogUmV0dXJuPGJvb2w+IERybUZhY3Rvcnk6OmlzQ29udGVudFR5cGVTdXBwb3J0ZWQoY29uc3QgaGlkbF9zdHJpbmcgJm1pbWVUeXBlKSB7CiAgICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdGhlIG1pbWVUeXBlcyBoYW5kZWQgYnkgSW5pdERhdGFQYXJzZXIuCiAgICAgcmV0dXJuIG1pbWVUeXBlID09IGtJc29CbWZmVmlkZW9NaW1lVHlwZSB8fApAQCAtNzEsNyArNzksNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwCmluZGV4IDNiNjEwODUuLmQ3ZGFjYjggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtUGx1Z2luLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybVBsdWdpbi5jcHAKQEAgLTI1LDExICsyNSwxNSBAQAogI2luY2x1ZGUgIkNsZWFyS2V5RHJtUHJvcGVydGllcy5oIgogI2luY2x1ZGUgIlNlc3Npb24uaCIKICNpbmNsdWRlICJUeXBlQ29udmVydC5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCiAKIG5hbWVzcGFjZSB7Citjb25zdCBzdGQ6OnN0cmluZyBrS2V5U2V0SWRQcmVmaXgoImNraWQiKTsKK2NvbnN0IGludCBrS2V5U2V0SWRMZW5ndGggPSAxNjsKIGNvbnN0IGludCBrU2VjdXJlU3RvcElkU3RhcnQgPSAxMDA7Citjb25zdCBzdGQ6OnN0cmluZyBrT2ZmbGluZUxpY2Vuc2UoIlwidHlwZVwiOlwicGVyc2lzdGVudC1saWNlbnNlXCIiKTsKIGNvbnN0IHN0ZDo6c3RyaW5nIGtTdHJlYW1pbmcoIlN0cmVhbWluZyIpOwotY29uc3Qgc3RkOjpzdHJpbmcga09mZmxpbmUoIk9mZmxpbmUiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtUZW1wb3JhcnlMaWNlbnNlKCJcInR5cGVcIjpcInRlbXBvcmFyeVwiIik7CiBjb25zdCBzdGQ6OnN0cmluZyBrVHJ1ZSgiVHJ1ZSIpOwogCiBjb25zdCBzdGQ6OnN0cmluZyBrUXVlcnlLZXlMaWNlbnNlVHlwZSgiTGljZW5zZVR5cGUiKTsKQEAgLTU0LDE4ICs1OCwzMSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAorS2V5UmVxdWVzdFR5cGUgdG9LZXlSZXF1ZXN0VHlwZV9WMV8wKEtleVJlcXVlc3RUeXBlX1YxXzEga2V5UmVxdWVzdFR5cGUpIHsKKyAgc3dpdGNoIChrZXlSZXF1ZXN0VHlwZSkgeworICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6Tk9ORToKKyAgICBjYXNlIEtleVJlcXVlc3RUeXBlX1YxXzE6OlVQREFURToKKyAgICAgIHJldHVybiBLZXlSZXF1ZXN0VHlwZTo6VU5LTk9XTjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEtleVJlcXVlc3RUeXBlPihrZXlSZXF1ZXN0VHlwZSk7CisgIH0KK30KKwogRHJtUGx1Z2luOjpEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KQogICAgICAgICA6IG1TZXNzaW9uTGlicmFyeShzZXNzaW9uTGlicmFyeSksCiAgICAgICAgICAgbU9wZW5TZXNzaW9uT2tDb3VudCgwKSwKICAgICAgICAgICBtQ2xvc2VTZXNzaW9uT2tDb3VudCgwKSwKICAgICAgICAgICBtQ2xvc2VTZXNzaW9uTm90T3BlbmVkQ291bnQoMCksCi0gICAgICAgICAgbU5leHRTZWN1cmVTdG9wSWQoa1NlY3VyZVN0b3BJZFN0YXJ0KSB7CisgICAgICAgICAgbU5leHRTZWN1cmVTdG9wSWQoa1NlY3VyZVN0b3BJZFN0YXJ0KSwKKyAgICAgICAgICBtTW9ja0Vycm9yKFN0YXR1c19WMV8yOjpPSykgewogICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7CiAgICAgaW5pdFByb3BlcnRpZXMoKTsKICAgICBtU2VjdXJlU3RvcHMuY2xlYXIoKTsKKyAgICBtUmVsZWFzZUtleXNNYXAuY2xlYXIoKTsKKyAgICBzdGQ6OnNyYW5kKHN0ZDo6dGltZShudWxscHRyKSk7CiB9CiAKIHZvaWQgRHJtUGx1Z2luOjppbml0UHJvcGVydGllcygpIHsKQEAgLTc1LDYgKzkyLDcgQEAKICAgICBtU3RyaW5nUHJvcGVydGllc1trUGx1Z2luRGVzY3JpcHRpb25LZXldID0ga1BsdWdpbkRlc2NyaXB0aW9uVmFsdWU7CiAgICAgbVN0cmluZ1Byb3BlcnRpZXNba0FsZ29yaXRobXNLZXldID0ga0FsZ29yaXRobXNWYWx1ZTsKICAgICBtU3RyaW5nUHJvcGVydGllc1trTGlzdGVuZXJUZXN0U3VwcG9ydEtleV0gPSBrTGlzdGVuZXJUZXN0U3VwcG9ydFZhbHVlOworICAgIG1TdHJpbmdQcm9wZXJ0aWVzW2tEcm1FcnJvclRlc3RLZXldID0ga0RybUVycm9yVGVzdFZhbHVlOwogCiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWVWZWN0b3I7CiAgICAgdmFsdWVWZWN0b3IuY2xlYXIoKTsKQEAgLTEwMyw2ICsxMjEsNyBAQAogCiBSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpvcGVuU2Vzc2lvbihvcGVuU2Vzc2lvbl9jYiBfaGlkbF9jYikgewogICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmNyZWF0ZVNlc3Npb24oKTsKKyAgICBwcm9jZXNzTW9ja0Vycm9yKHNlc3Npb24pOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZCA9IHNlc3Npb24tPnNlc3Npb25JZCgpOwogCiAgICAgU3RhdHVzIHN0YXR1cyA9IHNldFNlY3VyaXR5TGV2ZWwoc2Vzc2lvbklkLCBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPKTsKQEAgLTExNCw2ICsxMzMsNyBAQAogUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6b3BlblNlc3Npb25fMV8xKFNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKICAgICAgICAgb3BlblNlc3Npb25fMV8xX2NiIF9oaWRsX2NiKSB7CiAgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+Y3JlYXRlU2Vzc2lvbigpOworICAgIHByb2Nlc3NNb2NrRXJyb3Ioc2Vzc2lvbik7CiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkID0gc2Vzc2lvbi0+c2Vzc2lvbklkKCk7CiAKICAgICBTdGF0dXMgc3RhdHVzID0gc2V0U2VjdXJpdHlMZXZlbChzZXNzaW9uSWQsIHNlY3VyaXR5TGV2ZWwpOwpAQCAtMTI5LDYgKzE0OSwxMCBAQAogCiAgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24odG9WZWN0b3Ioc2Vzc2lvbklkKSk7CiAgICAgaWYgKHNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgaWYgKHNlc3Npb24tPmdldE1vY2tFcnJvcigpICE9IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICAgICAgc2VuZFNlc3Npb25Mb3N0U3RhdGUoc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOworICAgICAgICB9CiAgICAgICAgIG1DbG9zZVNlc3Npb25Pa0NvdW50Kys7CiAgICAgICAgIG1TZXNzaW9uTGlicmFyeS0+ZGVzdHJveVNlc3Npb24oc2Vzc2lvbik7CiAgICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOwpAQCAtMTM3LDM1ICsxNjEsNzUgQEAKICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOwogfQogCi1TdGF0dXMgRHJtUGx1Z2luOjpnZXRLZXlSZXF1ZXN0Q29tbW9uKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzY29wZSwKK1N0YXR1c19WMV8yIERybVBsdWdpbjo6Z2V0S2V5UmVxdWVzdENvbW1vbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpbml0RGF0YSwKICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG1pbWVUeXBlLAogICAgICAgICBLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVZhbHVlPiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcmVxdWVzdCwKLSAgICAgICAgS2V5UmVxdWVzdFR5cGUgKmtleVJlcXVlc3RUeXBlLAorICAgICAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xICprZXlSZXF1ZXN0VHlwZSwKICAgICAgICAgc3RkOjpzdHJpbmcgKmRlZmF1bHRVcmwpIHsKICAgICAgICAgVU5VU0VEKG9wdGlvbmFsUGFyYW1ldGVycyk7CiAKKyAgICAvLyBHZXRLZXlSZXF1ZXN0T2ZmbGluZUtleVR5cGVOb3RTdXBwb3J0ZWQoKSBpbiB2dHMgMS4wIGFuZCAxLjEgZXhwZWN0cworICAgIC8vIEtleVR5cGU6Ok9GRkxJTkUgdG8gcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFIGluIGNsZWFya2V5IHBsdWdpbi4KKyAgICAvLyBUaG9zZSB0ZXN0cyBwYXNzIGluIGFuIGVtcHR5IGluaXREYXRhLCB3ZSB1c2UgdGhlIGVtcHR5IGluaXREYXRhIHRvCisgICAgLy8gc2lnbmFsIHN1Y2ggc3BlY2lmaWMgdXNlIGNhc2UuCisgICAgaWYgKGtleVR5cGUgPT0gS2V5VHlwZTo6T0ZGTElORSAmJiAwID09IGluaXREYXRhLnNpemUoKSkgeworICAgICAgICByZXR1cm4gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKwogICAgICpkZWZhdWx0VXJsID0gIiI7Ci0gICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGU6OlVOS05PV047CisgICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGVfVjFfMTo6VU5LTk9XTjsKICAgICAqcmVxdWVzdCA9IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KCk7CiAKLSAgICBpZiAoc2NvcGUuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgIGlmIChzY29wZS5zaXplKCkgPT0gMCB8fAorICAgICAgICAgICAgKGtleVR5cGUgIT0gS2V5VHlwZTo6U1RSRUFNSU5HICYmCisgICAgICAgICAgICBrZXlUeXBlICE9IEtleVR5cGU6Ok9GRkxJTkUgJiYKKyAgICAgICAgICAgIGtleVR5cGUgIT0gS2V5VHlwZTo6UkVMRUFTRSkpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1c19WMV8yOjpCQURfVkFMVUU7CiAgICAgfQogCi0gICAgaWYgKGtleVR5cGUgIT0gS2V5VHlwZTo6U1RSRUFNSU5HKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNjb3BlSWQgPSB0b1ZlY3RvcihzY29wZSk7CisgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbjsKKyAgICBpZiAoa2V5VHlwZSA9PSBLZXlUeXBlOjpTVFJFQU1JTkcgfHwga2V5VHlwZSA9PSBLZXlUeXBlOjpPRkZMSU5FKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZChzY29wZUlkLmJlZ2luKCksIHNjb3BlSWQuZW5kKCkpOworICAgICAgICBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgfSBlbHNlIGlmIChzZXNzaW9uLT5nZXRNb2NrRXJyb3IoKSAhPSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgIHJldHVybiBzZXNzaW9uLT5nZXRNb2NrRXJyb3IoKTsKKyAgICAgICAgfQorCisgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlX1YxXzE6OklOSVRJQUw7CiAgICAgfQogCi0gICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24odG9WZWN0b3Ioc2NvcGUpKTsKLSAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKLSAgICB9CisgICAgU3RhdHVzX1YxXzIgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzX1YxXzI+KAorICAgICAgICAgICAgc2Vzc2lvbi0+Z2V0S2V5UmVxdWVzdChpbml0RGF0YSwgbWltZVR5cGUsIGtleVR5cGUsIHJlcXVlc3QpKTsKIAotICAgIFN0YXR1cyBzdGF0dXMgPSBzZXNzaW9uLT5nZXRLZXlSZXF1ZXN0KGluaXREYXRhLCBtaW1lVHlwZSwgcmVxdWVzdCk7Ci0gICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGU6OklOSVRJQUw7CisgICAgaWYgKGtleVR5cGUgPT0gS2V5VHlwZTo6UkVMRUFTRSkgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZChzY29wZUlkLmJlZ2luKCksIHNjb3BlSWQuZW5kKCkpOworICAgICAgICBzdGQ6OnN0cmluZyByZXF1ZXN0U3RyaW5nKHJlcXVlc3QtPmJlZ2luKCksIHJlcXVlc3QtPmVuZCgpKTsKKyAgICAgICAgaWYgKHJlcXVlc3RTdHJpbmcuZmluZChrT2ZmbGluZUxpY2Vuc2UpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBlbXB0eVJlc3BvbnNlOworICAgICAgICAgICAgc3RkOjpzdHJpbmcga2V5U2V0SWRTdHJpbmcoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpOworICAgICAgICAgICAgaWYgKCFtRmlsZUhhbmRsZS5TdG9yZUxpY2Vuc2Uoa2V5U2V0SWRTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlUmVsZWFzaW5nLAorICAgICAgICAgICAgICAgICAgICBlbXB0eVJlc3BvbnNlKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJQcm9ibGVtIHJlbGVhc2luZyBvZmZsaW5lIGxpY2Vuc2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9VTktOT1dOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1SZWxlYXNlS2V5c01hcC5maW5kKGtleVNldElkU3RyaW5nKSA9PSBtUmVsZWFzZUtleXNNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5jcmVhdGVTZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgbVJlbGVhc2VLZXlzTWFwW2tleVNldElkU3RyaW5nXSA9IHNlc3Npb24tPnNlc3Npb25JZCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgia2V5IGlzIGluIHVzZSwgaWdub3JlIHJlbGVhc2UgcmVxdWVzdCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIk9mZmxpbmUgbGljZW5zZSBub3QgZm91bmQsIG5vdGhpbmcgdG8gcmVsZWFzZSIpOworICAgICAgICB9CisgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlX1YxXzE6OlJFTEVBU0U7CisgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE3OCwxNSArMjQyLDE1IEBACiAgICAgICAgIGdldEtleVJlcXVlc3RfY2IgX2hpZGxfY2IpIHsKICAgICBVTlVTRUQob3B0aW9uYWxQYXJhbWV0ZXJzKTsKIAotICAgIEtleVJlcXVlc3RUeXBlIGtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGU6OlVOS05PV047CisgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlX1YxXzE6OlVOS05PV047CiAgICAgc3RkOjpzdHJpbmcgZGVmYXVsdFVybCgiIik7CiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVxdWVzdDsKLSAgICBTdGF0dXMgc3RhdHVzID0gZ2V0S2V5UmVxdWVzdENvbW1vbigKKyAgICBTdGF0dXNfVjFfMiBzdGF0dXMgPSBnZXRLZXlSZXF1ZXN0Q29tbW9uKAogICAgICAgICAgICAgc2NvcGUsIGluaXREYXRhLCBtaW1lVHlwZSwga2V5VHlwZSwgb3B0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgICAgICAgJnJlcXVlc3QsICZrZXlSZXF1ZXN0VHlwZSwgJmRlZmF1bHRVcmwpOwogCi0gICAgX2hpZGxfY2Ioc3RhdHVzLCB0b0hpZGxWZWMocmVxdWVzdCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlPihrZXlSZXF1ZXN0VHlwZSksCisgICAgX2hpZGxfY2IodG9TdGF0dXNfMV8wKHN0YXR1cyksIHRvSGlkbFZlYyhyZXF1ZXN0KSwKKyAgICAgICAgICAgIHRvS2V5UmVxdWVzdFR5cGVfVjFfMChrZXlSZXF1ZXN0VHlwZSksCiAgICAgICAgICAgICBoaWRsX3N0cmluZyhkZWZhdWx0VXJsKSk7CiAgICAgcmV0dXJuIFZvaWQoKTsKIH0KQEAgLTIwMCwxMCArMjY0LDMxIEBACiAgICAgICAgIGdldEtleVJlcXVlc3RfMV8xX2NiIF9oaWRsX2NiKSB7CiAgICAgVU5VU0VEKG9wdGlvbmFsUGFyYW1ldGVycyk7CiAKLSAgICBLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpVTktOT1dOOworICAgIEtleVJlcXVlc3RUeXBlX1YxXzEga2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZV9WMV8xOjpVTktOT1dOOwogICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRVcmwoIiIpOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3Q7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IGdldEtleVJlcXVlc3RDb21tb24oCisgICAgU3RhdHVzX1YxXzIgc3RhdHVzID0gZ2V0S2V5UmVxdWVzdENvbW1vbigKKyAgICAgICAgICAgIHNjb3BlLCBpbml0RGF0YSwgbWltZVR5cGUsIGtleVR5cGUsIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgICZyZXF1ZXN0LCAma2V5UmVxdWVzdFR5cGUsICZkZWZhdWx0VXJsKTsKKworICAgIF9oaWRsX2NiKHRvU3RhdHVzXzFfMChzdGF0dXMpLCB0b0hpZGxWZWMocmVxdWVzdCksCisgICAgICAgICAgICBrZXlSZXF1ZXN0VHlwZSwgaGlkbF9zdHJpbmcoZGVmYXVsdFVybCkpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldEtleVJlcXVlc3RfMV8yKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICBLZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVZhbHVlPiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICBnZXRLZXlSZXF1ZXN0XzFfMl9jYiBfaGlkbF9jYikgeworICAgIFVOVVNFRChvcHRpb25hbFBhcmFtZXRlcnMpOworCisgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlX1YxXzE6OlVOS05PV047CisgICAgc3RkOjpzdHJpbmcgZGVmYXVsdFVybCgiIik7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVxdWVzdDsKKyAgICBTdGF0dXNfVjFfMiBzdGF0dXMgPSBnZXRLZXlSZXF1ZXN0Q29tbW9uKAogICAgICAgICAgICAgc2NvcGUsIGluaXREYXRhLCBtaW1lVHlwZSwga2V5VHlwZSwgb3B0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgICAgICAgJnJlcXVlc3QsICZrZXlSZXF1ZXN0VHlwZSwgJmRlZmF1bHRVcmwpOwogCkBAIC0yMjcsNiArMzEyLDMwIEBACiAgICAgbVBsYXlQb2xpY3kucHVzaF9iYWNrKHBvbGljeSk7CiB9CiAKK2Jvb2wgRHJtUGx1Z2luOjptYWtlS2V5U2V0SWQoc3RkOjpzdHJpbmcqIGtleVNldElkKSB7CisgICAgaWYgKCFrZXlTZXRJZCkgeworICAgICAgICBBTE9HRSgia2V5U2V0SWQgZGVzdGluYXRpb24gbm90IHByb3ZpZGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga3NpZChrS2V5U2V0SWRQcmVmaXguYmVnaW4oKSwga0tleVNldElkUHJlZml4LmVuZCgpKTsKKyAgICBrc2lkLnJlc2l6ZShrS2V5U2V0SWRMZW5ndGgpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJhbmRvbURhdGEoKGtLZXlTZXRJZExlbmd0aCAtIGtLZXlTZXRJZFByZWZpeC5zaXplKCkpIC8gMiwgMCk7CisKKyAgICB3aGlsZSAoa2V5U2V0SWQtPmVtcHR5KCkpIHsKKyAgICAgICAgZm9yIChhdXRvIGl0ciA9IHJhbmRvbURhdGEuYmVnaW4oKTsgaXRyICE9IHJhbmRvbURhdGEuZW5kKCk7ICsraXRyKSB7CisgICAgICAgICAgICAqaXRyID0gc3RkOjpyYW5kKCkgJSAweGZmOworICAgICAgICB9CisgICAgICAgICprZXlTZXRJZCA9IGtLZXlTZXRJZFByZWZpeCArIEJ5dGVBcnJheVRvSGV4U3RyaW5nKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhbmRvbURhdGEuZGF0YSgpKSwgcmFuZG9tRGF0YS5zaXplKCkpOworICAgICAgICBpZiAobUZpbGVIYW5kbGUuTGljZW5zZUV4aXN0cygqa2V5U2V0SWQpKSB7CisgICAgICAgICAgICAvLyBjb2xsaXNpb24sIHJlZ2VuZXJhdGUKKyAgICAgICAgICAgIEFMT0dWKCJSZXRyeSBnZW5lcmF0aW5nIEtleVNldElkIik7CisgICAgICAgICAgICBrZXlTZXRJZC0+Y2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6cHJvdmlkZUtleVJlc3BvbnNlKAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXNwb25zZSwKQEAgLTIzNywyMiArMzQ2LDYwIEBACiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCi0gICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24odG9WZWN0b3Ioc2NvcGUpKTsKKyAgICBzdGQ6OnN0cmluZyByZXNwb25zZVN0cmluZygKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJlc3BvbnNlLmRhdGEoKSksIHJlc3BvbnNlLnNpemUoKSk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2NvcGVJZCA9IHRvVmVjdG9yKHNjb3BlKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7CisgICAgc3RkOjpzdHJpbmcga2V5U2V0SWQ7CisKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICBib29sIGlzT2ZmbGluZUxpY2Vuc2UgPSByZXNwb25zZVN0cmluZy5maW5kKGtPZmZsaW5lTGljZW5zZSkgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgYm9vbCBpc1JlbGVhc2UgPSAobWVtY21wKHNjb3BlSWQuZGF0YSgpLCBrS2V5U2V0SWRQcmVmaXguZGF0YSgpLCBrS2V5U2V0SWRQcmVmaXguc2l6ZSgpKSA9PSAwKTsKKyAgICBpZiAoaXNSZWxlYXNlKSB7CisgICAgICAgIGtleVNldElkLmFzc2lnbihzY29wZUlkLmJlZ2luKCksIHNjb3BlSWQuZW5kKCkpOworCisgICAgICAgIGF1dG8gaXRlciA9IG1SZWxlYXNlS2V5c01hcC5maW5kKHN0ZDo6c3RyaW5nKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKSk7CisgICAgICAgIGlmIChpdGVyICE9IG1SZWxlYXNlS2V5c01hcC5lbmQoKSkgeworICAgICAgICAgICAgc2Vzc2lvbklkLmFzc2lnbihpdGVyLT5zZWNvbmQuYmVnaW4oKSwgaXRlci0+c2Vjb25kLmVuZCgpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHNlc3Npb25JZC5hc3NpZ24oc2NvcGVJZC5iZWdpbigpLCBzY29wZUlkLmVuZCgpKTsKKyAgICAgICAgLy8gbm9uIG9mZmxpbmUgbGljZW5zZSByZXR1cm5zIGVtcHR5IGtleVNldElkCisgICAgICAgIGtleVNldElkLmNsZWFyKCk7CisgICAgfQorCisgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKICAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVELCBoaWRsX3ZlYzx1aW50OF90PigpKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9Ci0KICAgICBzZXRQbGF5UG9saWN5KCk7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5U2V0SWQ7Ci0gICAga2V5U2V0SWQuY2xlYXIoKTsKIAotICAgIFN0YXR1cyBzdGF0dXMgPSBzZXNzaW9uLT5wcm92aWRlS2V5UmVzcG9uc2UocmVzcG9uc2UpOworICAgIHN0YXR1cyA9IHNlc3Npb24tPnByb3ZpZGVLZXlSZXNwb25zZShyZXNwb25zZSk7CiAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgIC8vIFRlc3QgY2FsbGluZyBBTWVkaWFEcm0gbGlzdGVuZXJzLgotICAgICAgICBzZW5kRXZlbnQoRXZlbnRUeXBlOjpWRU5ET1JfREVGSU5FRCwgdG9WZWN0b3Ioc2NvcGUpLCB0b1ZlY3RvcihzY29wZSkpOworICAgICAgICBpZiAoaXNPZmZsaW5lTGljZW5zZSkgeworICAgICAgICAgICAgaWYgKGlzUmVsZWFzZSkgeworICAgICAgICAgICAgICAgIG1GaWxlSGFuZGxlLkRlbGV0ZUxpY2Vuc2Uoa2V5U2V0SWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1ha2VLZXlTZXRJZCgma2V5U2V0SWQpKSB7CisgICAgICAgICAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX1VOS05PV04sIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICBzZW5kRXhwaXJhdGlvblVwZGF0ZSh0b1ZlY3RvcihzY29wZSksIDEwMCk7CisgICAgICAgICAgICAgICAgYm9vbCBvayA9IG1GaWxlSGFuZGxlLlN0b3JlTGljZW5zZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleVNldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhyZXNwb25zZS5iZWdpbigpLCByZXNwb25zZS5lbmQoKSkpOworICAgICAgICAgICAgICAgIGlmICghb2spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdG9yZSBvZmZsaW5lIGxpY2Vuc2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUZXN0IGNhbGxpbmcgQU1lZGlhRHJtIGxpc3RlbmVycy4KKyAgICAgICAgc2VuZEV2ZW50KEV2ZW50VHlwZTo6VkVORE9SX0RFRklORUQsIHNlc3Npb25JZCwgc2Vzc2lvbklkKTsKKworICAgICAgICBzZW5kRXhwaXJhdGlvblVwZGF0ZShzZXNzaW9uSWQsIDEwMCk7CiAKICAgICAgICAgc3RkOjp2ZWN0b3I8S2V5U3RhdHVzPiBrZXlzU3RhdHVzOwogICAgICAgICBLZXlTdGF0dXMga2V5U3RhdHVzOwpAQCAtMjY3LDE2ICs0MTQsNTEgQEAKICAgICAgICAga2V5U3RhdHVzLnR5cGUgPSBWMV8wOjpLZXlTdGF0dXNUeXBlOjpFWFBJUkVEOwogICAgICAgICBrZXlzU3RhdHVzLnB1c2hfYmFjayhrZXlTdGF0dXMpOwogCi0gICAgICAgIHNlbmRLZXlzQ2hhbmdlKHRvVmVjdG9yKHNjb3BlKSwga2V5c1N0YXR1cywgdHJ1ZSk7CisgICAgICAgIHNlbmRLZXlzQ2hhbmdlKHNlc3Npb25JZCwga2V5c1N0YXR1cywgdHJ1ZSk7CisKKyAgICAgICAgaW5zdGFsbFNlY3VyZVN0b3Aoc2Vzc2lvbklkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgicHJvdmlkZUtleVJlc3BvbnNlIHJldHVybnMgZXJyb3I9JWQiLCBzdGF0dXMpOwogICAgIH0KIAotICAgIGluc3RhbGxTZWN1cmVTdG9wKHNjb3BlKTsKLQotICAgIC8vIFJldHVybnMgc3RhdHVzIGFuZCBlbXB0eSBrZXlTZXRJZAotICAgIF9oaWRsX2NiKHN0YXR1cywgdG9IaWRsVmVjKGtleVNldElkKSk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5U2V0SWRWZWMoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpOworICAgIF9oaWRsX2NiKHN0YXR1cywgdG9IaWRsVmVjKGtleVNldElkVmVjKSk7CiAgICAgcmV0dXJuIFZvaWQoKTsKIH0KIAorUmV0dXJuPFN0YXR1cz4gRHJtUGx1Z2luOjpyZXN0b3JlS2V5cygKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGtleVNldElkKSB7CisgICAgICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDAgfHwga2V5U2V0SWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIERldmljZUZpbGVzOjpMaWNlbnNlU3RhdGUgbGljZW5zZVN0YXRlOworICAgICAgICBzdGQ6OnN0cmluZyBvZmZsaW5lTGljZW5zZTsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgICAgIGlmICghbUZpbGVIYW5kbGUuUmV0cmlldmVMaWNlbnNlKHN0ZDo6c3RyaW5nKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKSwKKyAgICAgICAgICAgICAgICAmbGljZW5zZVN0YXRlLCAmb2ZmbGluZUxpY2Vuc2UpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlc3RvcmUgb2ZmbGluZSBsaWNlbnNlIik7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVVua25vd24gPT0gbGljZW5zZVN0YXRlIHx8CisgICAgICAgICAgICAgICAgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVSZWxlYXNpbmcgPT0gbGljZW5zZVN0YXRlKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBsaWNlbnNlIHN0YXRlPSVkIiwgbGljZW5zZVN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgICAgICB9CisKKyAgICAgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24odG9WZWN0b3Ioc2Vzc2lvbklkKSk7CisgICAgICAgIGlmICghc2Vzc2lvbi5nZXQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzZXNzaW9uLT5wcm92aWRlS2V5UmVzcG9uc2Uoc3RkOjp2ZWN0b3I8dWludDhfdD4ob2ZmbGluZUxpY2Vuc2UuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICBvZmZsaW5lTGljZW5zZS5lbmQoKSkpOworICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVzdG9yZSBrZXlzIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKK30KKwogUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0UHJvcGVydHlTdHJpbmcoCiAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBwcm9wZXJ0eU5hbWUsIGdldFByb3BlcnR5U3RyaW5nX2NiIF9oaWRsX2NiKSB7CiAgICAgc3RkOjpzdHJpbmcgbmFtZShwcm9wZXJ0eU5hbWUuY19zdHIoKSk7CkBAIC0yOTIsNiArNDc0LDggQEAKICAgICAgICAgdmFsdWUgPSBtU3RyaW5nUHJvcGVydGllc1trQWxnb3JpdGhtc0tleV07CiAgICAgfSBlbHNlIGlmIChuYW1lID09IGtMaXN0ZW5lclRlc3RTdXBwb3J0S2V5KSB7CiAgICAgICAgIHZhbHVlID0gbVN0cmluZ1Byb3BlcnRpZXNba0xpc3RlbmVyVGVzdFN1cHBvcnRLZXldOworICAgIH0gZWxzZSBpZiAobmFtZSA9PSBrRHJtRXJyb3JUZXN0S2V5KSB7CisgICAgICAgIHZhbHVlID0gbVN0cmluZ1Byb3BlcnRpZXNba0RybUVycm9yVGVzdEtleV07CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0UoIkFwcCByZXF1ZXN0ZWQgdW5rbm93biBzdHJpbmcgcHJvcGVydHkgJXMiLCBuYW1lLmNfc3RyKCkpOwogICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAiIik7CkBAIC0zMzYsNiArNTIwLDIwIEBACiAgICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKICAgICB9CiAKKyAgICBpZiAobmFtZSA9PSBrRHJtRXJyb3JUZXN0S2V5KSB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBrUmVzb3VyY2VDb250ZW50aW9uVmFsdWUpIHsKKyAgICAgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX1JFU09VUkNFX0NPTlRFTlRJT047CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0ga0xvc3RTdGF0ZVZhbHVlKSB7CisgICAgICAgICAgICBtTW9ja0Vycm9yID0gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9TRVNTSU9OX0xPU1RfU1RBVEU7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0ga0ZyYW1lVG9vTGFyZ2VWYWx1ZSkgeworICAgICAgICAgICAgbU1vY2tFcnJvciA9IFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IGtJbnZhbGlkU3RhdGVWYWx1ZSkgIHsKKyAgICAgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0lOVkFMSURfU1RBVEU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTW9ja0Vycm9yID0gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9VTktOT1dOOworICAgICAgICB9CisgICAgfQorCiAgICAgbVN0cmluZ1Byb3BlcnRpZXNba2V5XSA9IHN0ZDo6c3RyaW5nKHZhbHVlLmNfc3RyKCkpOwogICAgIHJldHVybiBTdGF0dXM6Ok9LOwogfQpAQCAtMzQ2LDYgKzU0NCw5IEBACiAgICBpZiAobmFtZSA9PSBrRGV2aWNlSWRLZXkpIHsKICAgICAgIEFMT0dEKCJDYW5ub3Qgc2V0IGltbXV0YWJsZSBwcm9wZXJ0eTogJXMiLCBuYW1lLmNfc3RyKCkpOwogICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgfSBlbHNlIGlmIChuYW1lID09IGtDbGllbnRJZEtleSkgeworICAgICAgIG1CeXRlQXJyYXlQcm9wZXJ0aWVzW2tDbGllbnRJZEtleV0gPSB0b1ZlY3Rvcih2YWx1ZSk7CisgICAgICAgcmV0dXJuIFN0YXR1czo6T0s7CiAgICB9CiAKICAgIC8vIFNldHRpbmcgb2YgdW5kZWZpbmVkIHByb3BlcnRpZXMgaXMgbm90IHN1cHBvcnRlZApAQCAtNDgzLDYgKzY4NCw2MCBAQAogICAgIHJldHVybiBWb2lkKCk7CiB9CiAKK1JldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpY2Vuc2VOYW1lcyA9IG1GaWxlSGFuZGxlLkxpc3RMaWNlbnNlcygpOworICAgIHN0ZDo6dmVjdG9yPEtleVNldElkPiBrZXlTZXRJZHM7CisgICAgaWYgKG1Nb2NrRXJyb3IgIT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgIF9oaWRsX2NiKHRvU3RhdHVzXzFfMChtTW9ja0Vycm9yKSwga2V5U2V0SWRzKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBuYW1lIDogbGljZW5zZU5hbWVzKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtleVNldElkKG5hbWUuYmVnaW4oKSwgbmFtZS5lbmQoKSk7CisgICAgICAgIGtleVNldElkcy5wdXNoX2JhY2soa2V5U2V0SWQpOworICAgIH0KKyAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBrZXlTZXRJZHMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKKworUmV0dXJuPFN0YXR1cz4gRHJtUGx1Z2luOjpyZW1vdmVPZmZsaW5lTGljZW5zZShjb25zdCBLZXlTZXRJZCYga2V5U2V0SWQpIHsKKyAgICBpZiAobU1vY2tFcnJvciAhPSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgcmV0dXJuIHRvU3RhdHVzXzFfMChtTW9ja0Vycm9yKTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgbGljZW5zZU5hbWUoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpOworICAgIGlmIChtRmlsZUhhbmRsZS5EZWxldGVMaWNlbnNlKGxpY2Vuc2VOYW1lKSkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworfQorCitSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXRPZmZsaW5lTGljZW5zZVN0YXRlKGNvbnN0IEtleVNldElkJiBrZXlTZXRJZCwKKyAgICAgICAgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZV9jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6c3RyaW5nIGxpY2Vuc2VOYW1lKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKTsKKyAgICBEZXZpY2VGaWxlczo6TGljZW5zZVN0YXRlIHN0YXRlOworICAgIHN0ZDo6c3RyaW5nIGxpY2Vuc2U7CisgICAgT2ZmbGluZUxpY2Vuc2VTdGF0ZSBoTGljZW5zZVN0YXRlOworICAgIGlmIChtTW9ja0Vycm9yICE9IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICBfaGlkbF9jYih0b1N0YXR1c18xXzAobU1vY2tFcnJvciksIE9mZmxpbmVMaWNlbnNlU3RhdGU6OlVOS05PV04pOworICAgIH0gZWxzZSBpZiAobUZpbGVIYW5kbGUuUmV0cmlldmVMaWNlbnNlKGxpY2Vuc2VOYW1lLCAmc3RhdGUsICZsaWNlbnNlKSkgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2UgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVBY3RpdmU6CisgICAgICAgICAgICBoTGljZW5zZVN0YXRlID0gT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VVNBQkxFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVSZWxlYXNpbmc6CisgICAgICAgICAgICBoTGljZW5zZVN0YXRlID0gT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6SU5BQ1RJVkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVVua25vd246CisgICAgICAgICAgICBoTGljZW5zZVN0YXRlID0gT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VU5LTk9XTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIGhMaWNlbnNlU3RhdGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6QkFEX1ZBTFVFLCBPZmZsaW5lTGljZW5zZVN0YXRlOjpVTktOT1dOKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKwogUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0U2VjdXJlU3RvcHMoZ2V0U2VjdXJlU3RvcHNfY2IgX2hpZGxfY2IpIHsKICAgICBzdGQ6OnZlY3RvcjxTZWN1cmVTdG9wPiBzdG9wczsKICAgICBmb3IgKGF1dG8gaXRyID0gbVNlY3VyZVN0b3BzLmJlZ2luKCk7IGl0ciAhPSBtU2VjdXJlU3RvcHMuZW5kKCk7ICsraXRyKSB7CkBAIC01ODUsNyArODQwLDcgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19ICAvLyBuYW1lc3BhY2UgVjFfMQorfSAgLy8gbmFtZXNwYWNlIFYxXzIKIH0gIC8vIG5hbWVzcGFjZSBkcm0KIH0gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSW5pdERhdGFQYXJzZXIuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Jbml0RGF0YVBhcnNlci5jcHAKaW5kZXggZTJiYjY1MS4uOGViYjQyYiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Jbml0RGF0YVBhcnNlci5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Jbml0RGF0YVBhcnNlci5jcHAKQEAgLTMxLDcgKzMxLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIG5hbWVzcGFjZSB7CkBAIC00NSwyMSArNDUsMjIgQEAKIH0KIAogU3RhdHVzIEluaXREYXRhUGFyc2VyOjpwYXJzZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWltZVR5cGUsCisgICAgICAgIFYxXzA6OktleVR5cGUga2V5VHlwZSwKICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGxpY2Vuc2VSZXF1ZXN0KSB7CiAgICAgLy8gQnVpbGQgYSBsaXN0IG9mIHRoZSBrZXkgSURzCiAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+IGtleUlkczsKIAotICAgIGlmICh0eXBlID09IGtJc29CbWZmVmlkZW9NaW1lVHlwZSB8fAotICAgICAgICB0eXBlID09IGtJc29CbWZmQXVkaW9NaW1lVHlwZSB8fAotICAgICAgICB0eXBlID09IGtDZW5jSW5pdERhdGFGb3JtYXQpIHsKKyAgICBpZiAobWltZVR5cGUgPT0ga0lzb0JtZmZWaWRlb01pbWVUeXBlIHx8CisgICAgICAgIG1pbWVUeXBlID09IGtJc29CbWZmQXVkaW9NaW1lVHlwZSB8fAorICAgICAgICBtaW1lVHlwZSA9PSBrQ2VuY0luaXREYXRhRm9ybWF0KSB7CiAgICAgICAgIFN0YXR1cyByZXMgPSBwYXJzZVBzc2goaW5pdERhdGEsICZrZXlJZHMpOwogICAgICAgICBpZiAocmVzICE9IFN0YXR1czo6T0spIHsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUgPT0ga1dlYm1WaWRlb01pbWVUeXBlIHx8Ci0gICAgICAgIHR5cGUgPT0ga1dlYm1BdWRpb01pbWVUeXBlIHx8Ci0gICAgICAgIHR5cGUgPT0ga1dlYm1Jbml0RGF0YUZvcm1hdCkgeworICAgIH0gZWxzZSBpZiAobWltZVR5cGUgPT0ga1dlYm1WaWRlb01pbWVUeXBlIHx8CisgICAgICAgIG1pbWVUeXBlID09IGtXZWJtQXVkaW9NaW1lVHlwZSB8fAorICAgICAgICBtaW1lVHlwZSA9PSBrV2VibUluaXREYXRhRm9ybWF0KSB7CiAgICAgICAgIC8vIFdlYk0gImluaXQgZGF0YSIgaXMganVzdCBhIHNpbmdsZSBrZXkgSUQKICAgICAgICAgaWYgKGluaXREYXRhLnNpemUoKSAhPSBrS2V5SWRTaXplKSB7CiAgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKQEAgLTY5LDggKzcwLDEyIEBACiAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwogICAgIH0KIAorICAgIGlmIChrZXlUeXBlID09IFYxXzA6OktleVR5cGU6OlJFTEVBU0UpIHsKKyAgICAgICAgLy8gcmVzdG9yZSBrZXkKKyAgICB9CisKICAgICAvLyBCdWlsZCB0aGUgcmVxdWVzdAotICAgIHN0ZDo6c3RyaW5nIHJlcXVlc3RKc29uID0gZ2VuZXJhdGVSZXF1ZXN0KGtleUlkcyk7CisgICAgc3RkOjpzdHJpbmcgcmVxdWVzdEpzb24gPSBnZW5lcmF0ZVJlcXVlc3Qoa2V5VHlwZSwga2V5SWRzKTsKICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXF1ZXN0SnNvblZlYyA9IFN0clRvVmVjdG9yKHJlcXVlc3RKc29uKTsKIAogICAgIGxpY2Vuc2VSZXF1ZXN0LT5jbGVhcigpOwpAQCAtMTMxLDkgKzEzNiwxMSBAQAogICAgIHJldHVybiBTdGF0dXM6Ok9LOwogfQogCi1zdGQ6OnN0cmluZyBJbml0RGF0YVBhcnNlcjo6Z2VuZXJhdGVSZXF1ZXN0KGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPiYga2V5SWRzKSB7CitzdGQ6OnN0cmluZyBJbml0RGF0YVBhcnNlcjo6Z2VuZXJhdGVSZXF1ZXN0KFYxXzA6OktleVR5cGUga2V5VHlwZSwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+JiBrZXlJZHMpIHsKICAgICBjb25zdCBzdGQ6OnN0cmluZyBrUmVxdWVzdFByZWZpeCgie1wia2lkc1wiOlsiKTsKLSAgICBjb25zdCBzdGQ6OnN0cmluZyBrUmVxdWVzdFN1ZmZpeCgiXSxcInR5cGVcIjpcInRlbXBvcmFyeVwifSIpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtUZW1wb3JhcnlTZXNzaW9uKCJdLFwidHlwZVwiOlwidGVtcG9yYXJ5XCJ9Iik7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcga1BlcnNpc3RlbnRTZXNzaW9uKCJdLFwidHlwZVwiOlwicGVyc2lzdGVudC1saWNlbnNlXCJ9Iik7CiAKICAgICBzdGQ6OnN0cmluZyByZXF1ZXN0KGtSZXF1ZXN0UHJlZml4KTsKICAgICBzdGQ6OnN0cmluZyBlbmNvZGVkSWQ7CkBAIC0xNDcsNyArMTU0LDEyIEBACiAgICAgICAgIHJlcXVlc3QuYXBwZW5kKGVuY29kZWRJZCk7CiAgICAgICAgIHJlcXVlc3QucHVzaF9iYWNrKCdcIicpOwogICAgIH0KLSAgICByZXF1ZXN0LmFwcGVuZChrUmVxdWVzdFN1ZmZpeCk7CisgICAgaWYgKGtleVR5cGUgPT0gVjFfMDo6S2V5VHlwZTo6U1RSRUFNSU5HKSB7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKGtUZW1wb3JhcnlTZXNzaW9uKTsKKyAgICB9IGVsc2UgaWYgKGtleVR5cGUgPT0gVjFfMDo6S2V5VHlwZTo6T0ZGTElORSB8fAorICAgICAgICAgICAgICAgICAgIGtleVR5cGUgPT0gVjFfMDo6S2V5VHlwZTo6UkVMRUFTRSkgeworICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoa1BlcnNpc3RlbnRTZXNzaW9uKTsKKyAgICB9CiAKICAgICAvLyBBbmRyb2lkJ3MgQmFzZTY0IGVuY29kZXIgcHJvZHVjZXMgcGFkZGluZy4gRU1FIGZvcmJpZHMgcGFkZGluZy4KICAgICBjb25zdCBjaGFyIGtCYXNlNjRQYWRkaW5nID0gJz0nOwpAQCAtMTU3LDcgKzE2OSw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0pzb25XZWJLZXkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Kc29uV2ViS2V5LmNwcAppbmRleCBjY2NiNDFlLi5kOTM3NzdkIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0pzb25XZWJLZXkuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSnNvbldlYktleS5jcHAKQEAgLTIyLDE4ICsyMiwyMSBAQAogI2luY2x1ZGUgIkJhc2U2NC5oIgogCiBuYW1lc3BhY2UgeworY29uc3Qgc3RkOjpzdHJpbmcga0Jhc2U2NFBhZGRpbmcoIj0iKTsKIGNvbnN0IHN0ZDo6c3RyaW5nIGtLZXlzVGFnKCJrZXlzIik7CiBjb25zdCBzdGQ6OnN0cmluZyBrS2V5VHlwZVRhZygia3R5Iik7Ci1jb25zdCBzdGQ6OnN0cmluZyBrU3ltbWV0cmljS2V5VmFsdWUoIm9jdCIpOwogY29uc3Qgc3RkOjpzdHJpbmcga0tleVRhZygiayIpOwogY29uc3Qgc3RkOjpzdHJpbmcga0tleUlkVGFnKCJraWQiKTsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtCYXNlNjRQYWRkaW5nKCI9Iik7Citjb25zdCBzdGQ6OnN0cmluZyBrTWVkaWFTZXNzaW9uVHlwZSgidHlwZSIpOworY29uc3Qgc3RkOjpzdHJpbmcga1BlcnNpc3RlbnRMaWNlbnNlU2Vzc2lvbigicGVyc2lzdGVudC1saWNlbnNlIik7Citjb25zdCBzdGQ6OnN0cmluZyBrU3ltbWV0cmljS2V5VmFsdWUoIm9jdCIpOworY29uc3Qgc3RkOjpzdHJpbmcga1RlbXBvcmFyeUxpY2Vuc2VTZXNzaW9uKCJ0ZW1wb3JhcnkiKTsKIH0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogSnNvbldlYktleTo6SnNvbldlYktleSgpIHsKQEAgLTI2OCw3ICsyNzEsNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9NZW1vcnlGaWxlU3lzdGVtLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvTWVtb3J5RmlsZVN5c3RlbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjZDAwZgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvTWVtb3J5RmlsZVN5c3RlbS5jcHAKQEAgLTAsMCArMSw5MiBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBmaWxlIGFuZCBwcm9wcmlldGFyeQorLy8gc291cmNlIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFdpZGV2aW5lIE1hc3RlcgorLy8gTGljZW5zZSBBZ3JlZW1lbnQuCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJNZW1vcnlGaWxlU3lzdGVtLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzIgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKworc3RkOjpzdHJpbmcgTWVtb3J5RmlsZVN5c3RlbTo6R2V0RmlsZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKKyAgICBzaXplX3QgaW5kZXggPSBwYXRoLmZpbmRfbGFzdF9vZigiLyIpOworICAgIGlmIChpbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICByZXR1cm4gcGF0aC5zdWJzdHIoaW5kZXgrMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorfQorCitib29sIE1lbW9yeUZpbGVTeXN0ZW06OkZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdCB7CisgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGZpbGVOYW1lKTsKKyAgICByZXR1cm4gcmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpOworfQorCitzc2l6ZV90IE1lbW9yeUZpbGVTeXN0ZW06OkdldEZpbGVTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3QgeworICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChmaWxlTmFtZSk7CisgICAgaWYgKHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKSkgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3NpemVfdD4ocmVzdWx0LT5zZWNvbmQuZ2V0RmlsZVNpemUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgc2l6ZSBmb3IgJXMiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IE1lbW9yeUZpbGVTeXN0ZW06Okxpc3RGaWxlcygpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGlzdDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZpbGVuYW1lIDogbU1lbW9yeUZpbGVTeXN0ZW0pIHsKKyAgICAgICAgbGlzdC5wdXNoX2JhY2soZmlsZW5hbWUuZmlyc3QpOworICAgIH0KKyAgICByZXR1cm4gbGlzdDsKK30KKworc2l6ZV90IE1lbW9yeUZpbGVTeXN0ZW06OlJlYWQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBidWZmZXIpIHsKKyAgICBzdGQ6OnN0cmluZyBrZXkgPSBHZXRGaWxlTmFtZShwYXRoKTsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoa2V5KTsKKyAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRIYXNoRmlsZSA9IHJlc3VsdC0+c2Vjb25kLmdldENvbnRlbnQoKTsKKyAgICAgICAgYnVmZmVyLT5hc3NpZ24oc2VyaWFsaXplZEhhc2hGaWxlKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci0+c2l6ZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVhZCBmcm9tICVzIiwgcGF0aC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworc2l6ZV90IE1lbW9yeUZpbGVTeXN0ZW06OldyaXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBjb25zdCBNZW1vcnlGaWxlJiBtZW1vcnlGaWxlKSB7CisgICAgc3RkOjpzdHJpbmcga2V5ID0gR2V0RmlsZU5hbWUocGF0aCk7CisgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGtleSk7CisgICAgaWYgKHJlc3VsdCAhPSBtTWVtb3J5RmlsZVN5c3RlbS5lbmQoKSkgeworICAgICAgICBtTWVtb3J5RmlsZVN5c3RlbS5lcmFzZShrZXkpOworICAgIH0KKyAgICBtTWVtb3J5RmlsZVN5c3RlbS5pbnNlcnQoc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBNZW1vcnlGaWxlPihrZXksIG1lbW9yeUZpbGUpKTsKKyAgICByZXR1cm4gbWVtb3J5RmlsZS5nZXRGaWxlU2l6ZSgpOworfQorCitib29sIE1lbW9yeUZpbGVTeXN0ZW06OlJlbW92ZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSB7CisgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGZpbGVOYW1lKTsKKyAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CisgICAgICAgIG1NZW1vcnlGaWxlU3lzdGVtLmVyYXNlKHJlc3VsdCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3QgZmluZCBsaWNlbnNlIHRvIHJlbW92ZTogJXMiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBNZW1vcnlGaWxlU3lzdGVtOjpSZW1vdmVBbGxGaWxlcygpIHsKKyAgICBtTWVtb3J5RmlsZVN5c3RlbS5jbGVhcigpOworICAgIHJldHVybiBtTWVtb3J5RmlsZVN5c3RlbS5lbXB0eSgpOworfQorCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbi5jcHAKaW5kZXggMDdjOTI2OS4uYTlkNzAxNiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb24uY3BwCkBAIC0yOCw3ICsyOCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVZhbHVlOwpAQCAtNDIsOSArNDIsMTAgQEAKIFN0YXR1cyBTZXNzaW9uOjpnZXRLZXlSZXF1ZXN0KAogICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgVjFfMDo6S2V5VHlwZSBrZXlUeXBlLAogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90Pioga2V5UmVxdWVzdCkgY29uc3QgewogICAgIEluaXREYXRhUGFyc2VyIHBhcnNlcjsKLSAgICByZXR1cm4gcGFyc2VyLnBhcnNlKGluaXREYXRhLCBtaW1lVHlwZSwga2V5UmVxdWVzdCk7CisgICAgcmV0dXJuIHBhcnNlci5wYXJzZShpbml0RGF0YSwgbWltZVR5cGUsIGtleVR5cGUsIGtleVJlcXVlc3QpOwogfQogCiBTdGF0dXMgU2Vzc2lvbjo6cHJvdmlkZUtleVJlc3BvbnNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiByZXNwb25zZSkgewpAQCAtNjcsMjkgKzY4LDM0IEBACiAgICAgfQogfQogCi1TdGF0dXMgU2Vzc2lvbjo6ZGVjcnlwdCgKK1N0YXR1c19WMV8yIFNlc3Npb246OmRlY3J5cHQoCiAgICAgICAgIGNvbnN0IEtleUlkIGtleUlkLCBjb25zdCBJdiBpdiwgY29uc3QgdWludDhfdCogc3JjUHRyLAogICAgICAgICB1aW50OF90KiBkZXN0UHRyLCBjb25zdCBzdGQ6OnZlY3RvcjxTdWJTYW1wbGU+IHN1YlNhbXBsZXMsCiAgICAgICAgIHNpemVfdCogYnl0ZXNEZWNyeXB0ZWRPdXQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTWFwTG9jayk7CiAKKyAgICBpZiAoZ2V0TW9ja0Vycm9yKCkgIT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgIHJldHVybiBnZXRNb2NrRXJyb3IoKTsKKyAgICB9CisKICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlJZFZlY3RvcjsKICAgICBrZXlJZFZlY3Rvci5jbGVhcigpOwogICAgIGtleUlkVmVjdG9yLmluc2VydChrZXlJZFZlY3Rvci5lbmQoKSwga2V5SWQsIGtleUlkICsga0Jsb2NrU2l6ZSk7CiAgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ID46Oml0ZXJhdG9yIGl0cjsKICAgICBpdHIgPSBtS2V5TWFwLmZpbmQoa2V5SWRWZWN0b3IpOwogICAgIGlmIChpdHIgPT0gbUtleU1hcC5lbmQoKSkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fTk9fTElDRU5TRTsKKyAgICAgICAgcmV0dXJuIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fTk9fTElDRU5TRTsKICAgICB9CiAKICAgICBBZXNDdHJEZWNyeXB0b3IgZGVjcnlwdG9yOwotICAgIHJldHVybiBkZWNyeXB0b3IuZGVjcnlwdCgKKyAgICBTdGF0dXMgc3RhdHVzID0gZGVjcnlwdG9yLmRlY3J5cHQoCiAgICAgICAgICAgICBpdHItPnNlY29uZCAvKmtleSovLCBpdiwgc3JjUHRyLCBkZXN0UHRyLCBzdWJTYW1wbGVzLAogICAgICAgICAgICAgc3ViU2FtcGxlcy5zaXplKCksIGJ5dGVzRGVjcnlwdGVkT3V0KTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzX1YxXzI+KHN0YXR1cyk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb25MaWJyYXJ5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbkxpYnJhcnkuY3BwCmluZGV4IGI0MzE5ZTYuLjk5ZmIzMGYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbkxpYnJhcnkuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbkxpYnJhcnkuY3BwCkBAIC0yNCw3ICsyNCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKQEAgLTU5LDcgKzU5LDggQEAKIAogICAgIG1TZXNzaW9ucy5pbnNlcnQoc3RkOjpwYWlyPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LAogICAgICAgICAgICAgc3A8U2Vzc2lvbj4gPihzZXNzaW9uSWQsIG5ldyBTZXNzaW9uKHNlc3Npb25JZCkpKTsKLSAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3A8U2Vzc2lvbj4gPjo6aXRlcmF0b3IgaXRyID0gbVNlc3Npb25zLmZpbmQoc2Vzc2lvbklkKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3A8U2Vzc2lvbj4gPjo6aXRlcmF0b3IgaXRyID0KKyAgICAgICAgICAgIG1TZXNzaW9ucy5maW5kKHNlc3Npb25JZCk7CiAgICAgaWYgKGl0ciAhPSBtU2Vzc2lvbnMuZW5kKCkpIHsKICAgICAgICAgcmV0dXJuIGl0ci0+c2Vjb25kOwogICAgIH0gZWxzZSB7CkBAIC03MCw3ICs3MSw4IEBACiBzcDxTZXNzaW9uPiBTZXNzaW9uTGlicmFyeTo6ZmluZFNlc3Npb24oCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2Vzc2lvbnNMb2NrKTsKLSAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3A8U2Vzc2lvbj4gPjo6aXRlcmF0b3IgaXRyID0gbVNlc3Npb25zLmZpbmQoc2Vzc2lvbklkKTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3A8U2Vzc2lvbj4gPjo6aXRlcmF0b3IgaXRyID0KKyAgICAgICAgICAgIG1TZXNzaW9ucy5maW5kKHNlc3Npb25JZCk7CiAgICAgaWYgKGl0ciAhPSBtU2Vzc2lvbnMuZW5kKCkpIHsKICAgICAgICAgcmV0dXJuIGl0ci0+c2Vjb25kOwogICAgIH0gZWxzZSB7CkBAIC04NCw3ICs4Niw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5LnJjIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleS5yYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlODU2YS4uMDAwMDAwMAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5LnJjCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zZXJ2aWNlIHZlbmRvci5kcm0tY2xlYXJrZXktaGFsLTEtMSAvdmVuZG9yL2Jpbi9ody9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleQotICAgIGNsYXNzIGhhbAotICAgIHVzZXIgbWVkaWEKLSAgICBncm91cCBtZWRpYSBtZWRpYWRybQotICAgIGlvcHJpbyBydCA0Ci0gICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS1sYXp5LmNsZWFya2V5LnJjIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS1sYXp5LmNsZWFya2V5LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZmQzZDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMKQEAgLTAsMCArMSwxNCBAQAorc2VydmljZSB2ZW5kb3IuZHJtLWNsZWFya2V5LWhhbC0xLTIgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UtbGF6eS5jbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjA6OklDcnlwdG9GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMDo6SURybUZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xOjpJQ3J5cHRvRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjE6OklEcm1GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMjo6SUNyeXB0b0ZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yOjpJRHJtRmFjdG9yeSBjbGVhcmtleQorICAgIGRpc2FibGVkCisgICAgb25lc2hvdAorICAgIGNsYXNzIGhhbAorICAgIHVzZXIgbWVkaWEKKyAgICBncm91cCBtZWRpYSBtZWRpYWRybQorICAgIGlvcHJpbyBydCA0CisgICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleS5yYyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhNjY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkucmMKQEAgLTAsMCArMSwxMiBAQAorc2VydmljZSB2ZW5kb3IuZHJtLWNsZWFya2V5LWhhbC0xLTIgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wOjpJQ3J5cHRvRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjA6OklEcm1GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMTo6SUNyeXB0b0ZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xOjpJRHJtRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjI6OklDcnlwdG9GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMjo6SURybUZhY3RvcnkgY2xlYXJrZXkKKyAgICBjbGFzcyBoYWwKKyAgICB1c2VyIG1lZGlhCisgICAgZ3JvdXAgbWVkaWEgbWVkaWFkcm0KKyAgICBpb3ByaW8gcnQgNAorICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9BZXNDdHJEZWNyeXB0b3IuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9BZXNDdHJEZWNyeXB0b3IuaAppbmRleCAwYzdlZjIwLi43MjFmNGMwIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQWVzQ3RyRGVjcnlwdG9yLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Flc0N0ckRlY3J5cHRvci5oCkBAIC0yMiw3ICsyMiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKQEAgLTQyLDcgKzQyLDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQmFzZTY0LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQmFzZTY0LmgKaW5kZXggNGEzODViZC4uZWMzMGNjMSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Jhc2U2NC5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CYXNlNjQuaApAQCAtMjUsNyArMjUsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpzcDsKQEAgLTM4LDcgKzM4LDcgQEAKIHZvaWQgZW5jb2RlQmFzZTY0VXJsKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBzdGQ6OnN0cmluZyAqb3V0KTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CdWZmZXIuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CdWZmZXIuaAppbmRleCA1YmJiMjhhLi5jNDk3ZTM3IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQnVmZmVyLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0J1ZmZlci5oCkBAIC0yNSw3ICsyNSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OnNwOwpAQCAtNTQsNyArNTQsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleURybVByb3BlcnRpZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleURybVByb3BlcnRpZXMuaAppbmRleCBkNjViMjVjLi5iODNjZTY5IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oCkBAIC0yMiwzMCArMjIsNDAgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVmVuZG9yS2V5KCJ2ZW5kb3IiKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVmVuZG9yVmFsdWUoIkdvb2dsZSIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZXJzaW9uS2V5KCJ2ZXJzaW9uIik7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlcnNpb25WYWx1ZSgiMS4xIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlcnNpb25WYWx1ZSgiMS4yIik7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1BsdWdpbkRlc2NyaXB0aW9uS2V5KCJkZXNjcmlwdGlvbiIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtQbHVnaW5EZXNjcmlwdGlvblZhbHVlKCJDbGVhcktleSBDRE0iKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQWxnb3JpdGhtc0tleSgiYWxnb3JpdGhtcyIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtBbGdvcml0aG1zVmFsdWUoIiIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtMaXN0ZW5lclRlc3RTdXBwb3J0S2V5KCJsaXN0ZW5lclRlc3RTdXBwb3J0Iik7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0xpc3RlbmVyVGVzdFN1cHBvcnRWYWx1ZSgidHJ1ZSIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtEcm1FcnJvclRlc3RLZXkoImRybUVycm9yVGVzdCIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtEcm1FcnJvclRlc3RWYWx1ZSgiIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1Jlc291cmNlQ29udGVudGlvblZhbHVlKCJyZXNvdXJjZUNvbnRlbnRpb24iKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrTG9zdFN0YXRlVmFsdWUoImxvc3RTdGF0ZSIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtGcmFtZVRvb0xhcmdlVmFsdWUoImZyYW1lVG9vTGFyZ2UiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrSW52YWxpZFN0YXRlVmFsdWUoImludmFsaWRTdGF0ZSIpOwogCiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0RldmljZUlkS2V5KCJkZXZpY2VJZCIpOwogc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1Rlc3REZXZpY2VJZERhdGFbXSA9CiAgICAgICAgIHsweDAsIDB4MSwgMHgyLCAweDMsIDB4NCwgMHg1LCAweDYsIDB4NywKICAgICAgICAgIDB4OCwgMHg5LCAweGEsIDB4YiwgMHhjLCAweGQsIDB4ZSwgMHhmfTsKKworLy8gc2V0dGFibGUgYnl0ZSBhcnJheSBwcm9wZXJ0eQorc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtDbGllbnRJZEtleSgiY2xpZW50SWQiKTsKKwogLy8gVE9ETyBzdHViIG91dCBtZXRyaWNzIGZvciBudwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtNZXRyaWNzS2V5KCJtZXRyaWNzIik7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrTWV0cmljc0RhdGFbXSA9IHsgMCB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5VHlwZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleVR5cGVzLmgKaW5kZXggNDZjYjVlNC4uMDNjNDM0ZSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5VHlwZXMuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlUeXBlcy5oCkBAIC0xNywxNyArMTcsMTggQEAKICNpZm5kZWYgQ0xFQVJLRVlfTUFDUk9TX0hfCiAjZGVmaW5lIENMRUFSS0VZX01BQ1JPU19IXwogCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL3R5cGVzLmg+CiAKICNpbmNsdWRlIDxtYXA+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6S2V5VmFsdWU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKIAogY29uc3QgdWludDhfdCBrQmxvY2tTaXplID0gMTY7IC8vQUVTX0JMT0NLX1NJWkU7CkBAIC00Nyw3ICs0OCw3IEBACiAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFR5cGVOYW1lJikgPSBkZWxldGU7CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmgKaW5kZXggOTk1MjAyNy4uNjM2OGYzZCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaApAQCAtMTcsMTcgKzE3LDE3IEBACiAjaWZuZGVmIENMRUFSS0VZX0NSRUFURV9QTFVHSU5fRkFDVE9SSUVTX0hfCiAjZGVmaW5lIENMRUFSS0VZX0NSRUFURV9QTFVHSU5fRkFDVE9SSUVTX0hfCiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSUNyeXB0b0ZhY3RvcnkuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSUNyeXB0b0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSURybUZhY3RvcnkuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpJQ3J5cHRvRmFjdG9yeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SURybUZhY3Rvcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklDcnlwdG9GYWN0b3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpJRHJtRmFjdG9yeTsKIAogZXh0ZXJuICJDIiB7CiAgICAgSURybUZhY3RvcnkqIGNyZWF0ZURybUZhY3RvcnkoKTsKQEAgLTM1LDcgKzM1LDcgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19ICAvLyBuYW1lc3BhY2UgVjFfMQorfSAgLy8gbmFtZXNwYWNlIFYxXzIKIH0gIC8vIG5hbWVzcGFjZSBkcm0KIH0gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9GYWN0b3J5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvRmFjdG9yeS5oCmluZGV4IDE3NWFiNzYuLjIwM2JiMmQgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9GYWN0b3J5LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b0ZhY3RvcnkuaApAQCAtMTgsMTcgKzE4LDE3IEBACiAjZGVmaW5lIENMRUFSS0VZX0NSWVBUT19GQUNUT1JZX0hfCiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSUNyeXB0b1BsdWdpbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JQ3J5cHRvRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JQ3J5cHRvRmFjdG9yeS5oPgogCiAjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklDcnlwdG9GYWN0b3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpJQ3J5cHRvRmFjdG9yeTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKQEAgLTUyLDcgKzUyLDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvUGx1Z2luLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvUGx1Z2luLmgKaW5kZXggNmE3MzgwNi4uODY4MGYwYyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9QbHVnaW4uaApAQCAtMTcsNyArMTcsNyBAQAogI2lmbmRlZiBDTEVBUktFWV9DUllQVE9fUExVR0lOX0hfCiAjZGVmaW5lIENMRUFSS0VZX0NSWVBUT19QTFVHSU5fSF8KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lDcnlwdG9QbHVnaW4uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CiAKICNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCkBAIC0zMiwxNiArMzIsMTcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OklDcnlwdG9QbHVnaW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6Ok1vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlBhdHRlcm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlNoYXJlZEJ1ZmZlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdWJTYW1wbGU7CituYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwordXNpbmcgZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKK3VzaW5nIGRybTo6VjFfMDo6TW9kZTsKK3VzaW5nIGRybTo6VjFfMDo6UGF0dGVybjsKK3VzaW5nIGRybTo6VjFfMDo6U2hhcmVkQnVmZmVyOwordXNpbmcgZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyBkcm06OlYxXzA6OlN1YlNhbXBsZTsKKwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CkBAIC01MSw3ICs1Miw5IEBACiB1c2luZyA6OmFuZHJvaWQ6OmhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CiAKLXN0cnVjdCBDcnlwdG9QbHVnaW4gOiBwdWJsaWMgSUNyeXB0b1BsdWdpbiB7Cit0eXBlZGVmIGRybTo6VjFfMjo6U3RhdHVzIFN0YXR1c19WMV8yOworCitzdHJ1Y3QgQ3J5cHRvUGx1Z2luIDogcHVibGljIGRybTo6VjFfMjo6SUNyeXB0b1BsdWdpbiB7CiAgICAgZXhwbGljaXQgQ3J5cHRvUGx1Z2luKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKICAgICAgICAgbUluaXRTdGF0dXMgPSBzZXRNZWRpYURybVNlc3Npb24oc2Vzc2lvbklkKTsKICAgICB9CkBAIC04MCw2ICs4MywxOCBAQAogICAgICAgICAgICAgY29uc3QgRGVzdGluYXRpb25CdWZmZXImIGRlc3RpbmF0aW9uLAogICAgICAgICAgICAgZGVjcnlwdF9jYiBfaGlkbF9jYik7CiAKKyAgICBSZXR1cm48dm9pZD4gZGVjcnlwdF8xXzIoCisgICAgICAgICAgICBib29sIHNlY3VyZSwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgS0VZX0lEX1NJWkU+JiBrZXlJZCwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgS0VZX0lWX1NJWkU+JiBpdiwKKyAgICAgICAgICAgIE1vZGUgbW9kZSwKKyAgICAgICAgICAgIGNvbnN0IFBhdHRlcm4mIHBhdHRlcm4sCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxTdWJTYW1wbGU+JiBzdWJTYW1wbGVzLAorICAgICAgICAgICAgY29uc3QgU2hhcmVkQnVmZmVyJiBzb3VyY2UsCisgICAgICAgICAgICB1aW50NjRfdCBvZmZzZXQsCisgICAgICAgICAgICBjb25zdCBEZXN0aW5hdGlvbkJ1ZmZlciYgZGVzdGluYXRpb24sCisgICAgICAgICAgICBkZWNyeXB0XzFfMl9jYiBfaGlkbF9jYik7CisKICAgICBSZXR1cm48dm9pZD4gc2V0U2hhcmVkQnVmZmVyQmFzZShjb25zdCBoaWRsX21lbW9yeSYgYmFzZSwKICAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlcklkKTsKIApAQCAtOTYsNyArMTExLDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRGV2aWNlRmlsZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9EZXZpY2VGaWxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NGFlNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRGV2aWNlRmlsZXMuaApAQCAtMCwwICsxLDcxIEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIGZpbGUgYW5kIHByb3ByaWV0YXJ5CisvLyBzb3VyY2UgY29kZSBtYXkgb25seSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgV2lkZXZpbmUgTWFzdGVyCisvLyBMaWNlbnNlIEFncmVlbWVudC4KKy8vCisjaWZuZGVmIENMRUFSS0VZX0RFVklDRV9GSUxFU19IXworI2RlZmluZSBDTEVBUktFWV9ERVZJQ0VfRklMRVNfSF8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAicHJvdG9zL0RldmljZUZpbGVzLnBiLmgiCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorI2luY2x1ZGUgIk1lbW9yeUZpbGVTeXN0ZW0uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzIgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKworY2xhc3MgRGV2aWNlRmlsZXMgeworIHB1YmxpYzoKKyAgICB0eXBlZGVmIGVudW0geworICAgICAgICBrTGljZW5zZVN0YXRlVW5rbm93biwKKyAgICAgICAga0xpY2Vuc2VTdGF0ZUFjdGl2ZSwKKyAgICAgICAga0xpY2Vuc2VTdGF0ZVJlbGVhc2luZywKKyAgICB9IExpY2Vuc2VTdGF0ZTsKKworICAgIERldmljZUZpbGVzKCkge307CisgICAgdmlydHVhbCB+RGV2aWNlRmlsZXMoKSB7fTsKKworICAgIHZpcnR1YWwgYm9vbCBTdG9yZUxpY2Vuc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkLCBMaWNlbnNlU3RhdGUgc3RhdGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5UmVzcG9uc2UpOworCisgICAgdmlydHVhbCBib29sIFJldHJpZXZlTGljZW5zZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc2V0X2lkLCBMaWNlbnNlU3RhdGUqIHN0YXRlLCBzdGQ6OnN0cmluZyogb2ZmbGluZUxpY2Vuc2UpOworCisgICAgdmlydHVhbCBib29sIExpY2Vuc2VFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkKTsKKworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IExpc3RMaWNlbnNlcygpIGNvbnN0OworCisgICAgdmlydHVhbCBib29sIERlbGV0ZUxpY2Vuc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkKTsKKworICAgIHZpcnR1YWwgYm9vbCBEZWxldGVBbGxMaWNlbnNlcygpOworCisgcHJpdmF0ZToKKyAgICBib29sIEZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIGNvbnN0OworICAgIHNzaXplX3QgR2V0RmlsZVNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdDsKKyAgICBib29sIFJlbW92ZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKTsKKworICAgIGJvb2wgUmV0cmlldmVIYXNoZWRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwgT2ZmbGluZUZpbGUqIGRlU2VyaWFsaXplZEZpbGUpOworICAgIGJvb2wgU3RvcmVGaWxlUmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRGaWxlKTsKKyAgICBib29sIFN0b3JlRmlsZVdpdGhIYXNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRGaWxlKTsKKworICAgIE1lbW9yeUZpbGVTeXN0ZW0gbUZpbGVIYW5kbGU7CisKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oRGV2aWNlRmlsZXMpOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDTEVBUktFWV9ERVZJQ0VfRklMRVNfSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1GYWN0b3J5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtRmFjdG9yeS5oCmluZGV4IDZmNTgxOTUuLjRjYTg1NmQgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1GYWN0b3J5LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybUZhY3RvcnkuaApAQCAtMTcsMTUgKzE3LDE1IEBACiAjaWZuZGVmIENMRUFSS0VZX0RSTV9GQUNUT1JZX0hfCiAjZGVmaW5lIENMRUFSS0VZX0RSTV9GQUNUT1JZX0hfCiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybVBsdWdpbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1GYWN0b3J5Lmg+CiAKICNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7CkBAIC0zOSw2ICszOSwxMCBAQAogICAgIFJldHVybjxib29sPiBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PiYgdXVpZCkKICAgICAgICAgICAgIG92ZXJyaWRlOwogCisgICAgUmV0dXJuPGJvb2w+IGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkXzFfMihjb25zdCBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PiYgdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5TGV2ZWwgbGV2ZWwpIG92ZXJyaWRlOworCiAgICAgUmV0dXJuPGJvb2w+IGlzQ29udGVudFR5cGVTdXBwb3J0ZWQoY29uc3QgaGlkbF9zdHJpbmcgJm1pbWVUeXBlKQogICAgICAgICAgICAgb3ZlcnJpZGU7CiAKQEAgLTUyLDcgKzU2LDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtUGx1Z2luLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtUGx1Z2luLmgKaW5kZXggZmIwNjk1YS4uYmE1ZmE2NSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybVBsdWdpbi5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaApAQCAtMTcsMzIgKzE3LDQyIEBACiAjaWZuZGVmIENMRUFSS0VZX0RSTV9QTFVHSU5fSF8KICNkZWZpbmUgQ0xFQVJLRVlfRFJNX1BMVUdJTl9IXwogCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lEcm1QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSURybVBsdWdpbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtUGx1Z2luTGlzdGVuZXIuaD4KIAotI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0ZGlvLmg+CiAKKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisKKyNpbmNsdWRlICJEZXZpY2VGaWxlcy5oIgogI2luY2x1ZGUgIlNlc3Npb25MaWJyYXJ5LmgiCiAjaW5jbHVkZSAiVXRpbHMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpFdmVudFR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OklEcm1QbHVnaW5MaXN0ZW5lcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6S2V5U3RhdHVzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2VjdXJlU3RvcDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2VjdXJlU3RvcElkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTZXNzaW9uSWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklEcm1QbHVnaW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlOworbmFtZXNwYWNlIGRybSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTsKK3VzaW5nIGRybTo6VjFfMDo6RXZlbnRUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luTGlzdGVuZXI7Cit1c2luZyBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpLZXlTdGF0dXM7Cit1c2luZyBkcm06OlYxXzA6OktleVR5cGU7Cit1c2luZyBkcm06OlYxXzA6OktleVZhbHVlOwordXNpbmcgZHJtOjpWMV8wOjpTZWN1cmVTdG9wOwordXNpbmcgZHJtOjpWMV8wOjpTZWN1cmVTdG9wSWQ7Cit1c2luZyBkcm06OlYxXzA6OlNlc3Npb25JZDsKK3VzaW5nIGRybTo6VjFfMDo6U3RhdHVzOwordXNpbmcgZHJtOjpWMV8xOjpEcm1NZXRyaWNHcm91cDsKK3VzaW5nIGRybTo6VjFfMTo6SGRjcExldmVsOwordXNpbmcgZHJtOjpWMV8xOjpTZWN1cmVTdG9wUmVsZWFzZTsKK3VzaW5nIGRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKK3VzaW5nIGRybTo6VjFfMjo6SURybVBsdWdpbjsKK3VzaW5nIGRybTo6VjFfMjo6S2V5U2V0SWQ7Cit1c2luZyBkcm06OlYxXzI6Ok9mZmxpbmVMaWNlbnNlU3RhdGU7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CkBAIC01MCwxMCArNjAsMTUgQEAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CiB1c2luZyA6OmFuZHJvaWQ6OnNwOwogCit0eXBlZGVmIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGUgS2V5UmVxdWVzdFR5cGVfVjFfMTsKK3R5cGVkZWYgZHJtOjpWMV8yOjpJRHJtUGx1Z2luTGlzdGVuZXIgSURybVBsdWdpbkxpc3RlbmVyX1YxXzI7Cit0eXBlZGVmIGRybTo6VjFfMjo6U3RhdHVzIFN0YXR1c19WMV8yOwordHlwZWRlZiBkcm06OlYxXzI6OkhkY3BMZXZlbCBIZGNwTGV2ZWxfVjFfMjsKKwogc3RydWN0IERybVBsdWdpbiA6IHB1YmxpYyBJRHJtUGx1Z2luIHsKICAgICBleHBsaWNpdCBEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KTsKIAotICAgIHZpcnR1YWwgfkRybVBsdWdpbigpIHt9CisgICAgdmlydHVhbCB+RHJtUGx1Z2luKCkgeyBtRmlsZUhhbmRsZS5EZWxldGVBbGxMaWNlbnNlcygpOyB9CiAKICAgICBSZXR1cm48dm9pZD4gb3BlblNlc3Npb24ob3BlblNlc3Npb25fY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwogICAgIFJldHVybjx2b2lkPiBvcGVuU2Vzc2lvbl8xXzEoU2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsLApAQCAtNzcsNiArOTIsMTQgQEAKICAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5VmFsdWU+JiBvcHRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgIGdldEtleVJlcXVlc3RfMV8xX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKIAorICAgIFJldHVybjx2b2lkPiBnZXRLZXlSZXF1ZXN0XzFfMigKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgS2V5VHlwZSBrZXlUeXBlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgZ2V0S2V5UmVxdWVzdF8xXzJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCiAgICAgUmV0dXJuPHZvaWQ+IHByb3ZpZGVLZXlSZXNwb25zZSgKICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgcmVzcG9uc2UsCkBAIC05MSwxMyArMTE0LDcgQEAKIAogICAgIFJldHVybjxTdGF0dXM+IHJlc3RvcmVLZXlzKAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAotICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5U2V0SWQpIHsKLQotICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGtleVNldElkLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5U2V0SWQpIG92ZXJyaWRlOwogCiAgICAgUmV0dXJuPHZvaWQ+IHF1ZXJ5S2V5U3RhdHVzKAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLApAQCAtMTE1LDYgKzEzMiwxOCBAQAogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAorICAgIFJldHVybjx2b2lkPiBnZXRQcm92aXNpb25SZXF1ZXN0XzFfMigKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGNlcnRpZmljYXRlVHlwZSwKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGNlcnRpZmljYXRlQXV0aG9yaXR5LAorICAgICAgICBnZXRQcm92aXNpb25SZXF1ZXN0XzFfMl9jYiBfaGlkbF9jYikgeworICAgICAgICBVTlVTRUQoY2VydGlmaWNhdGVUeXBlKTsKKyAgICAgICAgVU5VU0VEKGNlcnRpZmljYXRlQXV0aG9yaXR5KTsKKworICAgICAgICBoaWRsX3N0cmluZyBkZWZhdWx0VXJsOworICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGhpZGxfdmVjPHVpbnQ4X3Q+KCksIGRlZmF1bHRVcmwpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKwogICAgIFJldHVybjx2b2lkPiBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXNwb25zZSwKICAgICAgICAgcHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlX2NiIF9oaWRsX2NiKSB7CkBAIC0xMzQsNiArMTYzLDEzIEBACiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCisgICAgUmV0dXJuPHZvaWQ+IGdldEhkY3BMZXZlbHNfMV8yKGdldEhkY3BMZXZlbHNfMV8yX2NiIF9oaWRsX2NiKSB7CisgICAgICAgIEhkY3BMZXZlbF9WMV8yIGNvbm5lY3RlZExldmVsID0gSGRjcExldmVsX1YxXzI6OkhEQ1BfTk9ORTsKKyAgICAgICAgSGRjcExldmVsX1YxXzIgbWF4TGV2ZWwgPSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9OT19PVVRQVVQ7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpPSywgY29ubmVjdGVkTGV2ZWwsIG1heExldmVsKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKICAgICBSZXR1cm48dm9pZD4gZ2V0TnVtYmVyT2ZTZXNzaW9ucyhnZXROdW1iZXJPZlNlc3Npb25zX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKIAogICAgIFJldHVybjx2b2lkPiBnZXRTZWN1cml0eUxldmVsKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCkBAIC0xNDEsNiArMTc3LDEzIEBACiAKICAgICBSZXR1cm48dm9pZD4gZ2V0TWV0cmljcyhnZXRNZXRyaWNzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKIAorICAgIFJldHVybjx2b2lkPiBnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhnZXRPZmZsaW5lTGljZW5zZUtleVNldElkc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48U3RhdHVzPiByZW1vdmVPZmZsaW5lTGljZW5zZShjb25zdCBLZXlTZXRJZCAma2V5U2V0SWQpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPHZvaWQ+IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoY29uc3QgS2V5U2V0SWQgJmtleVNldElkLAorICAgICAgICAgICAgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKICAgICBSZXR1cm48dm9pZD4gZ2V0UHJvcGVydHlTdHJpbmcoCiAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lLAogICAgICAgICBnZXRQcm9wZXJ0eVN0cmluZ19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CkBAIC0yNDgsMTIgKzI5MSwxNyBAQAogCiAgICAgUmV0dXJuPHZvaWQ+IHNldExpc3RlbmVyKGNvbnN0IHNwPElEcm1QbHVnaW5MaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICBtTGlzdGVuZXJWMV8yID0gSURybVBsdWdpbkxpc3RlbmVyX1YxXzI6OmNhc3RGcm9tKGxpc3RlbmVyKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9OwogCi0gICAgUmV0dXJuPHZvaWQ+IHNlbmRFdmVudChFdmVudFR5cGUgZXZlbnRUeXBlLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgIFJldHVybjx2b2lkPiBzZW5kRXZlbnQoCisgICAgICAgICAgICBFdmVudFR5cGUgZXZlbnRUeXBlLAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkYXRhKSB7Ci0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBpZiAobUxpc3RlbmVyVjFfMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJWMV8yLT5zZW5kRXZlbnQoZXZlbnRUeXBlLCBzZXNzaW9uSWQsIGRhdGEpOworICAgICAgICB9IGVsc2UgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBtTGlzdGVuZXItPnNlbmRFdmVudChldmVudFR5cGUsIHNlc3Npb25JZCwgZGF0YSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HRSgiTnVsbCBldmVudCBsaXN0ZW5lciwgZXZlbnQgbm90IHNlbnQiKTsKQEAgLTI2MSw4ICszMDksMTIgQEAKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CiAKLSAgICBSZXR1cm48dm9pZD4gc2VuZEV4cGlyYXRpb25VcGRhdGUoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwgaW50NjRfdCBleHBpcnlUaW1lSW5NUykgewotICAgICAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICBSZXR1cm48dm9pZD4gc2VuZEV4cGlyYXRpb25VcGRhdGUoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgaW50NjRfdCBleHBpcnlUaW1lSW5NUykgeworICAgICAgICBpZiAobUxpc3RlbmVyVjFfMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJWMV8yLT5zZW5kRXhwaXJhdGlvblVwZGF0ZShzZXNzaW9uSWQsIGV4cGlyeVRpbWVJbk1TKTsKKyAgICAgICAgfSBlbHNlIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgbUxpc3RlbmVyLT5zZW5kRXhwaXJhdGlvblVwZGF0ZShzZXNzaW9uSWQsIGV4cGlyeVRpbWVJbk1TKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCJOdWxsIGV2ZW50IGxpc3RlbmVyLCBldmVudCBub3Qgc2VudCIpOwpAQCAtMjcwLDkgKzMyMiwxMiBAQAogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAotICAgIFJldHVybjx2b2lkPiBzZW5kS2V5c0NoYW5nZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgIFJldHVybjx2b2lkPiBzZW5kS2V5c0NoYW5nZSgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCiAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXM+JiBrZXlTdGF0dXNMaXN0LCBib29sIGhhc05ld1VzYWJsZUtleSkgewotICAgICAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lclYxXzIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUxpc3RlbmVyVjFfMi0+c2VuZEtleXNDaGFuZ2Uoc2Vzc2lvbklkLCBrZXlTdGF0dXNMaXN0LCBoYXNOZXdVc2FibGVLZXkpOworICAgICAgICB9IGVsc2UgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBtTGlzdGVuZXItPnNlbmRLZXlzQ2hhbmdlKHNlc3Npb25JZCwga2V5U3RhdHVzTGlzdCwgaGFzTmV3VXNhYmxlS2V5KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCJOdWxsIGV2ZW50IGxpc3RlbmVyLCBldmVudCBub3Qgc2VudCIpOwpAQCAtMjgwLDYgKzMzNSwxNCBAQAogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAorICAgIFJldHVybjx2b2lkPiBzZW5kU2Vzc2lvbkxvc3RTdGF0ZSgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lclYxXzIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUxpc3RlbmVyVjFfMi0+c2VuZFNlc3Npb25Mb3N0U3RhdGUoc2Vzc2lvbklkKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKwogICAgIFJldHVybjx2b2lkPiBnZXRTZWN1cmVTdG9wcyhnZXRTZWN1cmVTdG9wc19jYiBfaGlkbF9jYik7CiAKICAgICBSZXR1cm48dm9pZD4gZ2V0U2VjdXJlU3RvcChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2VjdXJlU3RvcElkLApAQCAtMzAwLDE4ICszNjMsMTkgQEAKIHByaXZhdGU6CiAgICAgdm9pZCBpbml0UHJvcGVydGllcygpOwogICAgIHZvaWQgaW5zdGFsbFNlY3VyZVN0b3AoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCk7CisgICAgYm9vbCBtYWtlS2V5U2V0SWQoc3RkOjpzdHJpbmcqIGtleVNldElkKTsKICAgICB2b2lkIHNldFBsYXlQb2xpY3koKTsKIAogICAgIFJldHVybjxTdGF0dXM+IHNldFNlY3VyaXR5TGV2ZWwoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKICAgICAgICAgICAgIFNlY3VyaXR5TGV2ZWwgbGV2ZWwpOwogCi0gICAgU3RhdHVzIGdldEtleVJlcXVlc3RDb21tb24oY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAorICAgIFN0YXR1c19WMV8yIGdldEtleVJlcXVlc3RDb21tb24oY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAogICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGluaXREYXRhLAogICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG1pbWVUeXBlLAogICAgICAgICAgICAgS2V5VHlwZSBrZXlUeXBlLAogICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5VmFsdWU+JiBvcHRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcmVxdWVzdCwKLSAgICAgICAgICAgIEtleVJlcXVlc3RUeXBlICpnZXRLZXlSZXF1ZXN0VHlwZSwKKyAgICAgICAgICAgIEtleVJlcXVlc3RUeXBlX1YxXzEgKmdldEtleVJlcXVlc3RUeXBlLAogICAgICAgICAgICAgc3RkOjpzdHJpbmcgKmRlZmF1bHRVcmwpOwogCiAgICAgc3RydWN0IENsZWFya2V5U2VjdXJlU3RvcCB7CkBAIC0zMjMsMTkgKzM4NywzMSBAQAogICAgIHN0ZDo6dmVjdG9yPEtleVZhbHVlPiBtUGxheVBvbGljeTsKICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG1TdHJpbmdQcm9wZXJ0aWVzOwogICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiA+IG1CeXRlQXJyYXlQcm9wZXJ0aWVzOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiA+IG1SZWxlYXNlS2V5c01hcDsKICAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90PiwgU2VjdXJpdHlMZXZlbD4gbVNlY3VyaXR5TGV2ZWw7CiAgICAgc3A8SURybVBsdWdpbkxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3A8SURybVBsdWdpbkxpc3RlbmVyX1YxXzI+IG1MaXN0ZW5lclYxXzI7CiAgICAgU2Vzc2lvbkxpYnJhcnkgKm1TZXNzaW9uTGlicmFyeTsKICAgICBpbnQ2NF90IG1PcGVuU2Vzc2lvbk9rQ291bnQ7CiAgICAgaW50NjRfdCBtQ2xvc2VTZXNzaW9uT2tDb3VudDsKICAgICBpbnQ2NF90IG1DbG9zZVNlc3Npb25Ob3RPcGVuZWRDb3VudDsKICAgICB1aW50MzJfdCBtTmV4dFNlY3VyZVN0b3BJZDsKIAorICAgIC8vIHNldCBieSBwcm9wZXJ0eSB0byBtb2NrIGVycm9yIHNjZW5hcmlvcworICAgIFN0YXR1c19WMV8yIG1Nb2NrRXJyb3I7CisKKyAgICB2b2lkIHByb2Nlc3NNb2NrRXJyb3IoY29uc3Qgc3A8U2Vzc2lvbj4gJnNlc3Npb24pIHsKKyAgICAgICAgc2Vzc2lvbi0+c2V0TW9ja0Vycm9yKG1Nb2NrRXJyb3IpOworICAgICAgICBtTW9ja0Vycm9yID0gU3RhdHVzX1YxXzI6Ok9LOworICAgIH0KKworICAgIERldmljZUZpbGVzIG1GaWxlSGFuZGxlOworCiAgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOX0FORF9ORVcoRHJtUGx1Z2luKTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSW5pdERhdGFQYXJzZXIuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Jbml0RGF0YVBhcnNlci5oCmluZGV4IDMxODljNGEuLjg4OWY1MTEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Jbml0RGF0YVBhcnNlci5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Jbml0RGF0YVBhcnNlci5oCkBAIC0yNCw3ICsyNCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKQEAgLTM0LDcgKzM0LDggQEAKICAgICBJbml0RGF0YVBhcnNlcigpIHt9CiAKICAgICBTdGF0dXMgcGFyc2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWltZVR5cGUsCisgICAgICAgICAgICBWMV8wOjpLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogbGljZW5zZVJlcXVlc3QpOwogCiBwcml2YXRlOgpAQCAtNDMsMTIgKzQ0LDEyIEBACiAgICAgU3RhdHVzIHBhcnNlUHNzaChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCiAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCB1aW50OF90Kj4qIGtleUlkcyk7CiAKLSAgICBzdGQ6OnN0cmluZyBnZW5lcmF0ZVJlcXVlc3QoCisgICAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVSZXF1ZXN0KFYxXzA6OktleVR5cGUga2V5VHlwZSwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPiYga2V5SWRzKTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSnNvbldlYktleS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0pzb25XZWJLZXkuaAppbmRleCA0YWIwMzRjLi5lNTc0NzBjIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSnNvbldlYktleS5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Kc29uV2ViS2V5LmgKQEAgLTIzLDcgKzIzLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIGNsYXNzIEpzb25XZWJLZXkgewpAQCAtNTQsNyArNTQsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvTWVtb3J5RmlsZVN5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZDlmZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvTWVtb3J5RmlsZVN5c3RlbS5oCkBAIC0wLDAgKzEsNjggQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgZmlsZSBhbmQgcHJvcHJpZXRhcnkKKy8vIHNvdXJjZSBjb2RlIG1heSBvbmx5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXaWRldmluZSBNYXN0ZXIKKy8vIExpY2Vuc2UgQWdyZWVtZW50LgorLy8KKyNpZm5kZWYgQ0xFQVJLRVlfTUVNT1JZX0ZJTEVfU1lTVEVNX0hfCisjZGVmaW5lIENMRUFSS0VZX01FTU9SWV9GSUxFX1NZU1RFTV9IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBkcm0geworbmFtZXNwYWNlIFYxXzIgeworbmFtZXNwYWNlIGNsZWFya2V5IHsKKworLy8gVXNpbmcgYW5kcm9pZCBmaWxlIHN5c3RlbSByZXF1aXJlcyBjbGVhcmtleSBwbHVnaW4gdG8gdXBkYXRlCisvLyBpdHMgc2Vwb2xpY3kuIEhvd2V2ZXIsIHdlIGFyZSB1bmFibGUgdG8gdXBkYXRlIHNlcG9saWN5IGZvcgorLy8gb2xkZXIgdmVuZG9yIHBhcnRpdGlvbnMuIFRvIHByb3ZpZGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwKKy8vIGNsZWFya2V5IHBsdWdpbiBpbXBsZW1lbnRzIGEgdmVyeSBzaW1wbGUgZmlsZSBzeXN0ZW0gaW4gbWVtb3J5LgorLy8gVGhpcyBtZW1vcnkgZmlsZSBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBkaXJlY3Rvcnkgc3RydWN0dXJlLgorY2xhc3MgTWVtb3J5RmlsZVN5c3RlbSB7CisgcHVibGljOgorICAgIHN0cnVjdCBNZW1vcnlGaWxlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZmlsZU5hbWU7ICAvLyBleGNsdWRlcyBwYXRoCisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnQ7CisgICAgICAgIHNpemVfdCBmaWxlU2l6ZTsKKworICAgICAgICBzdGQ6OnN0cmluZyBnZXRDb250ZW50KCkgY29uc3QgeyByZXR1cm4gY29udGVudDsgfQorICAgICAgICBzaXplX3QgZ2V0RmlsZVNpemUoKSBjb25zdCB7IHJldHVybiBmaWxlU2l6ZTsgfQorICAgICAgICB2b2lkIHNldENvbnRlbnQoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUpIHsgY29udGVudCA9IGZpbGU7IH0KKyAgICAgICAgdm9pZCBzZXRGaWxlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeyBmaWxlTmFtZSA9IG5hbWU7IH0KKyAgICAgICAgdm9pZCBzZXRGaWxlU2l6ZShzaXplX3Qgc2l6ZSkgeworICAgICAgICAgICAgY29udGVudC5yZXNpemUoc2l6ZSk7IGZpbGVTaXplID0gc2l6ZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBNZW1vcnlGaWxlU3lzdGVtKCkge307CisgICAgdmlydHVhbCB+TWVtb3J5RmlsZVN5c3RlbSgpIHt9OworCisgICAgYm9vbCBGaWxlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3Q7CisgICAgc3NpemVfdCBHZXRGaWxlU2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBMaXN0RmlsZXMoKSBjb25zdDsKKyAgICBzaXplX3QgUmVhZChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aE5hbWUsIHN0ZDo6c3RyaW5nKiBidWZmZXIpOworICAgIGJvb2wgUmVtb3ZlQWxsRmlsZXMoKTsKKyAgICBib29sIFJlbW92ZUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKTsKKyAgICBzaXplX3QgV3JpdGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGhOYW1lLCBjb25zdCBNZW1vcnlGaWxlJiBtZW1vcnlGaWxlKTsKKworIHByaXZhdGU6CisgICAgLy8gTGljZW5zZSBmaWxlIG5hbWUgaXMgbWFkZSB1cCBvZiBhIHVuaXF1ZSBrZXlTZXRJZCwgdGhlcmVmb3JlLAorICAgIC8vIHRoZSBmaWxlbmFtZSBjYW4gYmUgdXNlZCBhcyB0aGUga2V5IHRvIGxvY2F0ZSBsaWNlbnNlcyBpbiB0aGUKKyAgICAvLyBtZW1vcnkgZmlsZSBzeXN0ZW0uCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIE1lbW9yeUZpbGU+IG1NZW1vcnlGaWxlU3lzdGVtOworCisgICAgc3RkOjpzdHJpbmcgR2V0RmlsZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOworCisgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE1lbW9yeUZpbGVTeXN0ZW0pOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDTEVBUktFWV9NRU1PUllfRklMRV9TWVNURU1fSF8KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbi5oCmluZGV4IGNkZGZjYTUuLmExNTllNWEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb24uaApAQCAtMjcsNDMgKzI3LDUzIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3ViU2FtcGxlOworbmFtZXNwYWNlIGRybSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTsKK3VzaW5nIGRybTo6VjFfMDo6U3RhdHVzOwordXNpbmcgZHJtOjpWMV8wOjpTdWJTYW1wbGU7CisKK3R5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7CiAKIGNsYXNzIFNlc3Npb24gOiBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgU2Vzc2lvbihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKQotICAgICAgICAgICAgOiBtU2Vzc2lvbklkKHNlc3Npb25JZCkge30KKyAgICAgICAgOiBtU2Vzc2lvbklkKHNlc3Npb25JZCksIG1Nb2NrRXJyb3IoU3RhdHVzX1YxXzI6Ok9LKSB7fQogICAgIHZpcnR1YWwgflNlc3Npb24oKSB7fQogCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCgpIGNvbnN0IHsgcmV0dXJuIG1TZXNzaW9uSWQ7IH0KIAogICAgIFN0YXR1cyBnZXRLZXlSZXF1ZXN0KAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIG1pbWVUeXBlLAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YVR5cGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWltZVR5cGUsCisgICAgICAgICAgICBWMV8wOjpLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90Pioga2V5UmVxdWVzdCkgY29uc3Q7CiAKICAgICBTdGF0dXMgcHJvdmlkZUtleVJlc3BvbnNlKAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlKTsKIAotICAgIFN0YXR1cyBkZWNyeXB0KAorICAgIFN0YXR1c19WMV8yIGRlY3J5cHQoCiAgICAgICAgICAgICBjb25zdCBLZXlJZCBrZXlJZCwgY29uc3QgSXYgaXYsIGNvbnN0IHVpbnQ4X3QqIHNyY1B0ciwKICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdFB0ciwgY29uc3Qgc3RkOjp2ZWN0b3I8U3ViU2FtcGxlPiBzdWJTYW1wbGVzLAogICAgICAgICAgICAgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCk7CiAKKyAgICB2b2lkIHNldE1vY2tFcnJvcihTdGF0dXNfVjFfMiBlcnJvcikge21Nb2NrRXJyb3IgPSBlcnJvcjt9CisgICAgU3RhdHVzX1YxXzIgZ2V0TW9ja0Vycm9yKCkgY29uc3Qge3JldHVybiBtTW9ja0Vycm9yO30KKwogcHJpdmF0ZToKICAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2Vzc2lvbik7CiAKICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtU2Vzc2lvbklkOwogICAgIEtleU1hcCBtS2V5TWFwOwogICAgIE11dGV4IG1NYXBMb2NrOworCisgICAgLy8gRm9yIG1vY2tpbmcgZXJyb3IgcmV0dXJuIHNjZW5hcmlvcworICAgIFN0YXR1c19WMV8yIG1Nb2NrRXJyb3I7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb25MaWJyYXJ5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbkxpYnJhcnkuaAppbmRleCAzMjZhMGMxLi4xZTU2N2I4IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbkxpYnJhcnkuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbkxpYnJhcnkuaApAQCAtMjYsNyArMjYsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpzcDsKQEAgLTU4LDcgKzU4LDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvVHlwZUNvbnZlcnQuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9UeXBlQ29udmVydC5oCmluZGV4IGNjMDYzMjkuLmIwZjg2MDcgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9UeXBlQ29udmVydC5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9UeXBlQ29udmVydC5oCkBAIC0yNCw3ICsyNCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwpAQCAtNjgsOCArNjgsMTkgQEAKICAgICByZXR1cm4gdmVjOwogfQogCitpbmxpbmUgU3RhdHVzIHRvU3RhdHVzXzFfMChTdGF0dXNfVjFfMiBzdGF0dXMpIHsKKyAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOgorICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U6CisgICAgY2FzZSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX1NFU1NJT05fTE9TVF9TVEFURToKKyAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9VTktOT1dOOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzPihzdGF0dXMpOworICB9Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAgLy8gbmFtZXNwYWNlIFYxXzEKK30gIC8vIG5hbWVzcGFjZSBWMV8yCiB9ICAvLyBuYW1lc3BhY2UgZHJtCiB9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3Byb3Rvcy9EZXZpY2VGaWxlcy5wcm90byBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvcHJvdG9zL0RldmljZUZpbGVzLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMTFmMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3Byb3Rvcy9EZXZpY2VGaWxlcy5wcm90bwpAQCAtMCwwICsxLDQ3IEBACisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBkZXZpY2VfZmlsZXMucHJvdG8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgZmlsZSBhbmQgcHJvcHJpZXRhcnkKKy8vIHNvdXJjZSBjb2RlIG1heSBvbmx5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXaWRldmluZSBNYXN0ZXIKKy8vIExpY2Vuc2UgQWdyZWVtZW50LgorLy8KKy8vIERlc2NyaXB0aW9uOgorLy8gICBGb3JtYXQgb2YgdmFyaW91cyBmaWxlcyBzdG9yZWQgYXQgdGhlIGRldmljZS4KKy8vCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBhbmRyb2lkLmhhcmR3YXJlLmRybS5WMV8yLmNsZWFya2V5OworCisvLyBuZWVkIHRoaXMgaWYgd2UgYXJlIHVzaW5nIGxpYnByb3RvYnVmLWNwcC0yLjMuMC1saXRlCitvcHRpb24gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FOworCittZXNzYWdlIExpY2Vuc2UgeworICBlbnVtIExpY2Vuc2VTdGF0ZSB7CisgICAgQUNUSVZFID0gMTsKKyAgICBSRUxFQVNJTkcgPSAyOworICB9CisKKyAgb3B0aW9uYWwgTGljZW5zZVN0YXRlIHN0YXRlID0gMTsKKyAgb3B0aW9uYWwgYnl0ZXMgbGljZW5zZSA9IDI7Cit9CisKK21lc3NhZ2UgT2ZmbGluZUZpbGUgeworICBlbnVtIEZpbGVUeXBlIHsKKyAgICBMSUNFTlNFID0gMTsKKyAgfQorCisgIGVudW0gRmlsZVZlcnNpb24geworICAgIFZFUlNJT05fMSA9IDE7CisgIH0KKworICBvcHRpb25hbCBGaWxlVHlwZSB0eXBlID0gMTsKKyAgb3B0aW9uYWwgRmlsZVZlcnNpb24gdmVyc2lvbiA9IDIgW2RlZmF1bHQgPSBWRVJTSU9OXzFdOworICBvcHRpb25hbCBMaWNlbnNlIGxpY2Vuc2UgPSAzOworCit9CisKK21lc3NhZ2UgSGFzaGVkRmlsZSB7CisgIG9wdGlvbmFsIGJ5dGVzIGZpbGUgPSAxOworICAvLyBBIHJhdyAobm90IGhleC1lbmNvZGVkKSBTSEEyNTYsIHRha2VuIG92ZXIgdGhlIGJ5dGVzIG9mICdmaWxlJy4KKyAgb3B0aW9uYWwgYnl0ZXMgaGFzaCA9IDI7Cit9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2UuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9zZXJ2aWNlLmNwcAppbmRleCA2YTk3YjcyLi5iMzllYTAxIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2UuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZS5jcHAKQEAgLTEzLDMyICsxMywyNCBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLSNkZWZpbmUgTE9HX1RBRyAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkiCi0KICNpbmNsdWRlIDxDcnlwdG9GYWN0b3J5Lmg+CiAjaW5jbHVkZSA8RHJtRmFjdG9yeS5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsTGF6eVV0aWxzLmg+CiAjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6am9pblJwY1RocmVhZHBvb2w7CiB1c2luZyA6OmFuZHJvaWQ6OnNwOwogCi11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpJQ3J5cHRvRmFjdG9yeTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklEcm1GYWN0b3J5OwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6Y2xlYXJrZXk6OkNyeXB0b0ZhY3Rvcnk7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpjbGVhcmtleTo6RHJtRmFjdG9yeTsKLQordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpJRHJtRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpDcnlwdG9GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6OkRybUZhY3Rvcnk7CiAKIGludCBtYWluKGludCAvKiBhcmdjICovLCBjaGFyKiogLyogYXJndiAqLykgewotICAgIEFMT0dEKCJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleSBzdGFydGluZy4uLiIpOwotCi0gICAgLy8gVGhlIERSTSBIQUwgbWF5IGNvbW11bmljYXRlIHRvIG90aGVyIHZlbmRvciBjb21wb25lbnRzIHZpYQotICAgIC8vIC9kZXYvdm5kYmluZGVyCi0gICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjppbml0V2l0aERyaXZlcigiL2Rldi92bmRiaW5kZXIiKTsKLQogICAgIHNwPElEcm1GYWN0b3J5PiBkcm1GYWN0b3J5ID0gbmV3IERybUZhY3Rvcnk7CiAgICAgc3A8SUNyeXB0b0ZhY3Rvcnk+IGNyeXB0b0ZhY3RvcnkgPSBuZXcgQ3J5cHRvRmFjdG9yeTsKIApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9zZXJ2aWNlTGF6eS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2VMYXp5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWZkODgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9zZXJ2aWNlTGF6eS5jcHAKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxDcnlwdG9GYWN0b3J5Lmg+CisjaW5jbHVkZSA8RHJtRmFjdG9yeS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsTGF6eVV0aWxzLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6am9pblJwY1RocmVhZHBvb2w7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpJQ3J5cHRvRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklEcm1GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6OkNyeXB0b0ZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6RHJtRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpMYXp5U2VydmljZVJlZ2lzdHJhcjsKKworaW50IG1haW4oaW50IC8qIGFyZ2MgKi8sIGNoYXIqKiAvKiBhcmd2ICovKSB7CisgICAgc3A8SURybUZhY3Rvcnk+IGRybUZhY3RvcnkgPSBuZXcgRHJtRmFjdG9yeTsKKyAgICBzcDxJQ3J5cHRvRmFjdG9yeT4gY3J5cHRvRmFjdG9yeSA9IG5ldyBDcnlwdG9GYWN0b3J5OworCisgICAgY29uZmlndXJlUnBjVGhyZWFkcG9vbCg4LCB0cnVlIC8qIGNhbGxlcldpbGxKb2luICovKTsKKworICAgIC8vIFNldHVwIGh3YmluZGVyIHNlcnZpY2UKKyAgICBMYXp5U2VydmljZVJlZ2lzdHJhciBzZXJ2aWNlUmVnaXN0cmFyOworCisgICAgLy8gU2V0dXAgaHdiaW5kZXIgc2VydmljZQorICAgIENIRUNLX0VRKHNlcnZpY2VSZWdpc3RyYXIucmVnaXN0ZXJTZXJ2aWNlKGRybUZhY3RvcnksICJjbGVhcmtleSIpLCBhbmRyb2lkOjpOT19FUlJPUikKKyAgICAgICAgPDwgIkZhaWxlZCB0byByZWdpc3RlciBDbGVhcmtleSBGYWN0b3J5IEhBTCI7CisgICAgQ0hFQ0tfRVEoc2VydmljZVJlZ2lzdHJhci5yZWdpc3RlclNlcnZpY2UoY3J5cHRvRmFjdG9yeSwgImNsZWFya2V5IiksIGFuZHJvaWQ6Ok5PX0VSUk9SKQorICAgICAgICA8PCAiRmFpbGVkIHRvIHJlZ2lzdGVyIENsZWFya2V5IENyeXB0byAgSEFMIjsKKworICAgIGpvaW5ScGNUaHJlYWRwb29sKCk7Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yN2JhNDcxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaApAQCAtMCwwICsxIEBACisuLi8uLi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb0NvbW1vblR5cGVzLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hZTdjOTlhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0NvbW1vblR5cGVzLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0NvbW1vblR5cGVzLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDU1ODY1N2UuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9QcmVzZW50YXRpb25JbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MWE5OTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCi0jZGVmaW5lIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCi0KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWVudW0gbWFzdGVyaW5nX2luZGljYXRpb24gewotICAgIE1BU1RFUklOR19OT1RfSU5ESUNBVEVELAotICAgIE1BU1RFUkVEX0ZPUl9TVEVSRU8sCi0gICAgTUFTVEVSRURfRk9SX1NVUlJPVU5ELAotICAgIE1BU1RFUkVEX0ZPUl8zRCwKLSAgICBNQVNURVJFRF9GT1JfSEVBRFBIT05FLAotfTsKLQotc3RydWN0IEF1ZGlvUHJlc2VudGF0aW9uIDogcHVibGljIFJlZkJhc2UgewotICAgIGludDMyX3QgbVByZXNlbnRhdGlvbklkOwotICAgIGludDMyX3QgbVByb2dyYW1JZDsKLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtTGFiZWxzOwotICAgIFN0cmluZzggbUxhbmd1YWdlOwotICAgIGludDMyX3QgbU1hc3RlcmluZ0luZGljYXRpb247Ci0gICAgYm9vbCBtQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZTsKLSAgICBib29sIG1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGU7Ci0gICAgYm9vbCBtRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZTsKLQotICAgIEF1ZGlvUHJlc2VudGF0aW9uKCkgewotICAgICAgICBtUHJlc2VudGF0aW9uSWQgPSAtMTsKLSAgICAgICAgbVByb2dyYW1JZCA9IC0xOwotICAgICAgICBtTGFuZ3VhZ2UgPSAiIjsKLSAgICAgICAgbU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJJTkdfTk9UX0lORElDQVRFRDsKLSAgICAgICAgbUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUgPSBmYWxzZTsKLSAgICAgICAgbVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSA9IGZhbHNlOwotICAgICAgICBtRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSA9IGZhbHNlOwotICAgIH0KLX07Ci0KLXR5cGVkZWYgVmVjdG9yPHNwPEF1ZGlvUHJlc2VudGF0aW9uPj4gQXVkaW9QcmVzZW50YXRpb25zOwotCi1jbGFzcyBBdWRpb1ByZXNlbnRhdGlvbkluZm8gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gcHVibGljOgotICAgIEF1ZGlvUHJlc2VudGF0aW9uSW5mbygpOwotCi0gICAgfkF1ZGlvUHJlc2VudGF0aW9uSW5mbygpOwotCi0gICAgdm9pZCBhZGRQcmVzZW50YXRpb24oc3A8QXVkaW9QcmVzZW50YXRpb24+IHByZXNlbnRhdGlvbik7Ci0KLSAgICBzaXplX3QgY291bnRQcmVzZW50YXRpb25zKCkgY29uc3Q7Ci0KLSAgICBjb25zdCBzcDxBdWRpb1ByZXNlbnRhdGlvbj4gZ2V0UHJlc2VudGF0aW9uKHNpemVfdCBpbmRleCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICAgIEF1ZGlvUHJlc2VudGF0aW9ucyBtUHJlc2VudGF0aW9uczsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQVVESU9fUFJFU0VOVEFUSU9OX0lORk9fSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi42YmZhZjExCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZDZmMWM5OQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaAppbmRleCA5MDViZWMxLi4xOThiMjdlIDEyMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaApAQCAtMSArMSBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitzdGFnZWZyaWdodC9EYXRhU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmggYi9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmgKaW5kZXggNTRjODA0Ny4uZDJhYjJmMSAxMjAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZUJhc2UuaApAQCAtMSArMSBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUJhc2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRXZlbnRMb2cuaCBiL2luY2x1ZGUvbWVkaWEvRXZlbnRMb2cuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi45YjJjNGJmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9FdmVudExvZy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9FdmVudExvZy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oIGIvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBlMmRkMDgyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvRXh0cmFjdG9yVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRXh0cmFjdG9yVXRpbHMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRXh0cmFjdG9yVXRpbHMuaCBiL2luY2x1ZGUvbWVkaWEvRXh0cmFjdG9yVXRpbHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oCnJlbmFtZSB0byBpbmNsdWRlL21lZGlhL0V4dHJhY3RvclV0aWxzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggNGIzNWZlMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmggYi9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2NDcyYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaApAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9BUElfSF8KKyNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9BUElfSF8KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPiAvLyBmb3Igc3RhdHVzX3QKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CitzdHJ1Y3QgQU1lZGlhRm9ybWF0OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBNZWRpYVRyYWNrOworY2xhc3MgTWV0YURhdGFCYXNlOworY2xhc3MgTWVkaWFCdWZmZXJCYXNlOworCitleHRlcm4gIkMiIHsKKworc3RydWN0IENEYXRhU291cmNlIHsKKyAgICBzc2l6ZV90ICgqcmVhZEF0KSh2b2lkICpoYW5kbGUsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgKCpnZXRTaXplKSh2b2lkICpoYW5kbGUsIG9mZjY0X3QgKnNpemUpOworICAgIHVpbnQzMl90ICgqZmxhZ3MpKHZvaWQgKmhhbmRsZSApOworICAgIGJvb2wgKCpnZXRVcmkpKHZvaWQgKmhhbmRsZSwgY2hhciAqdXJpU3RyaW5nLCBzaXplX3QgYnVmZmVyU2l6ZSk7CisgICAgdm9pZCAqaGFuZGxlOworfTsKKworZW51bSBDTWVkaWFUcmFja1JlYWRPcHRpb25zIDogdWludDMyX3QgeworICAgIFNFRUtfUFJFVklPVVNfU1lOQyA9IDAsCisgICAgU0VFS19ORVhUX1NZTkMgPSAxLAorICAgIFNFRUtfQ0xPU0VTVF9TWU5DID0gMiwKKyAgICBTRUVLX0NMT1NFU1QgPSAzLAorICAgIFNFRUtfRlJBTUVfSU5ERVggPSA0LAorICAgIFNFRUsgPSA4LAorICAgIE5PTkJMT0NLSU5HID0gMTYKK307CisKKy8qKgorICogb25seSB1c2UgQ01lZGlhQnVmZmVyIGFsbG9jYXRlZCBmcm9tIHRoZSBDTWVkaWFCdWZmZXJHcm91cCB0aGF0IGlzCisgKiBwcm92aWRlZCB0byBDTWVkaWFUcmFjazo6c3RhcnQoKQorICovCitzdHJ1Y3QgQ01lZGlhQnVmZmVyIHsKKyAgICB2b2lkICpoYW5kbGU7CisgICAgdm9pZCAoKnJlbGVhc2UpKHZvaWQgKmhhbmRsZSk7CisgICAgdm9pZCogKCpkYXRhKSh2b2lkICpoYW5kbGUpOworICAgIHNpemVfdCAoKnNpemUpKHZvaWQgKmhhbmRsZSk7CisgICAgc2l6ZV90ICgqcmFuZ2Vfb2Zmc2V0KSh2b2lkICpoYW5kbGUpOworICAgIHNpemVfdCAoKnJhbmdlX2xlbmd0aCkodm9pZCAqaGFuZGxlKTsKKyAgICB2b2lkICgqc2V0X3JhbmdlKSh2b2lkICpoYW5kbGUsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpOworICAgIEFNZWRpYUZvcm1hdCogKCptZXRhX2RhdGEpKHZvaWQgKmhhbmRsZSk7Cit9OworCitzdHJ1Y3QgQ01lZGlhQnVmZmVyR3JvdXAgeworICAgIHZvaWQgKmhhbmRsZTsKKyAgICBib29sICgqaW5pdCkodm9pZCAqaGFuZGxlLCBzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpOworICAgIHZvaWQgKCphZGRfYnVmZmVyKSh2b2lkICpoYW5kbGUsIHNpemVfdCBzaXplKTsKKyAgICBtZWRpYV9zdGF0dXNfdCAoKmFjcXVpcmVfYnVmZmVyKSh2b2lkICpoYW5kbGUsCisgICAgICAgICAgICBDTWVkaWFCdWZmZXIgKipidWZmZXIsIGJvb2wgbm9uQmxvY2tpbmcsIHNpemVfdCByZXF1ZXN0ZWRTaXplKTsKKyAgICBib29sICgqaGFzX2J1ZmZlcnMpKHZvaWQgKmhhbmRsZSk7Cit9OworCitzdHJ1Y3QgQ01lZGlhVHJhY2sgeworICAgIHZvaWQgKmRhdGE7CisgICAgdm9pZCAoKmZyZWUpKHZvaWQgKmRhdGEpOworCisgICAgbWVkaWFfc3RhdHVzX3QgKCpzdGFydCkodm9pZCAqZGF0YSwgQ01lZGlhQnVmZmVyR3JvdXAgKmJ1ZmZlckdyb3VwKTsKKyAgICBtZWRpYV9zdGF0dXNfdCAoKnN0b3ApKHZvaWQgKmRhdGEpOworICAgIG1lZGlhX3N0YXR1c190ICgqZ2V0Rm9ybWF0KSh2b2lkICpkYXRhLCBBTWVkaWFGb3JtYXQgKmZvcm1hdCk7CisgICAgbWVkaWFfc3RhdHVzX3QgKCpyZWFkKSh2b2lkICpkYXRhLCBDTWVkaWFCdWZmZXIgKipidWZmZXIsIHVpbnQzMl90IG9wdGlvbnMsIGludDY0X3Qgc2Vla1Bvc1VzKTsKKyAgICBib29sICAgICAoKnN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkKSh2b2lkICpkYXRhKTsKK307CisKK3N0cnVjdCBDTWVkaWFFeHRyYWN0b3IgeworICAgIHZvaWQgKmRhdGE7CisKKyAgICB2b2lkICgqZnJlZSkodm9pZCAqZGF0YSk7CisgICAgc2l6ZV90ICgqY291bnRUcmFja3MpKHZvaWQgKmRhdGEpOworICAgIENNZWRpYVRyYWNrKiAoKmdldFRyYWNrKSh2b2lkICpkYXRhLCBzaXplX3QgaW5kZXgpOworICAgIG1lZGlhX3N0YXR1c190ICgqZ2V0VHJhY2tNZXRhRGF0YSkoCisgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisKKyAgICBtZWRpYV9zdGF0dXNfdCAoKmdldE1ldGFEYXRhKSh2b2lkICpkYXRhLCBBTWVkaWFGb3JtYXQgKm1ldGEpOworICAgIHVpbnQzMl90ICgqZmxhZ3MpKHZvaWQgKmRhdGEpOworICAgIG1lZGlhX3N0YXR1c190ICgqc2V0TWVkaWFDYXMpKHZvaWQgKmRhdGEsIGNvbnN0IHVpbnQ4X3QqIGNhc1Rva2VuLCBzaXplX3Qgc2l6ZSk7CisgICAgY29uc3QgY2hhciAqICgqbmFtZSkodm9pZCAqZGF0YSk7Cit9OworCit0eXBlZGVmIENNZWRpYUV4dHJhY3RvciogKCpDcmVhdG9yRnVuYykoQ0RhdGFTb3VyY2UgKnNvdXJjZSwgdm9pZCAqbWV0YSk7Cit0eXBlZGVmIHZvaWQgKCpGcmVlTWV0YUZ1bmMpKHZvaWQgKm1ldGEpOworCisvLyBUaGUgc25pZmZlciBjYW4gb3B0aW9uYWxseSBmaWxsIGluIGFuIG9wYXF1ZSBvYmplY3QsICJtZXRhIiwgdGhhdCBoZWxwcworLy8gdGhlIGNvcnJlc3BvbmRpbmcgZXh0cmFjdG9yIGluaXRpYWxpemUgaXRzIHN0YXRlIHdpdGhvdXQgZHVwbGljYXRpbmcKKy8vIGVmZm9ydCBhbHJlYWR5IGV4ZXJ0ZWQgYnkgdGhlIHNuaWZmZXIuIElmICJmcmVlTWV0YSIgaXMgZ2l2ZW4sIGl0IHdpbGwgYmUKKy8vIGNhbGxlZCBhZ2FpbnN0IHRoZSBvcGFxdWUgb2JqZWN0IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHVzZWQuCit0eXBlZGVmIENyZWF0b3JGdW5jICgqU25pZmZlckZ1bmMpKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgdm9pZCAqKm1ldGEsIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEpOworCit0eXBlZGVmIENNZWRpYUV4dHJhY3RvciBDTWVkaWFFeHRyYWN0b3I7Cit0eXBlZGVmIENyZWF0b3JGdW5jIENyZWF0b3JGdW5jOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCB1aW50OF90IGJbMTZdOworfSBtZWRpYV91dWlkX3Q7CisKK3N0cnVjdCBFeHRyYWN0b3JEZWYgeworICAgIC8vIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgc3RydWN0dXJlCisgICAgY29uc3QgdWludDMyX3QgZGVmX3ZlcnNpb247CisKKyAgICAvLyBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dHJhY3Rvci4KKyAgICAvLyBTZWUgYmVsb3cgZm9yIGEgY29udmVuaWVuY2UgbWFjcm8gdG8gY3JlYXRlIHRoaXMgZnJvbSBhIHN0cmluZy4KKyAgICBtZWRpYV91dWlkX3QgZXh0cmFjdG9yX3V1aWQ7CisKKyAgICAvLyBWZXJzaW9uIG51bWJlciBvZiB0aGlzIGV4dHJhY3Rvci4gV2hlbiB0d28gZXh0cmFjdG9ycyB3aXRoIHRoZSBzYW1lCisgICAgLy8gdXVpZCBhcmUgZW5jb3VudGVyZWQsIHRoZSBvbmUgd2l0aCB0aGUgbGFyZ2VzdCB2ZXJzaW9uIG51bWJlciB3aWxsCisgICAgLy8gYmUgdXNlZC4KKyAgICBjb25zdCB1aW50MzJfdCBleHRyYWN0b3JfdmVyc2lvbjsKKworICAgIC8vIGEgaHVtYW4gcmVhZGFibGUgbmFtZQorICAgIGNvbnN0IGNoYXIgKmV4dHJhY3Rvcl9uYW1lOworCisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgU25pZmZlckZ1bmMgc25pZmY7CisgICAgICAgIH0gdjI7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBTbmlmZmVyRnVuYyBzbmlmZjsKKyAgICAgICAgICAgIC8vIGEgTlVMTCB0ZXJtaW5hdGVkIGxpc3Qgb2YgY29udGFpbmVyIG1pbWUgdHlwZXMgYW5kL29yIGZpbGUgZXh0ZW5zaW9ucworICAgICAgICAgICAgLy8gdGhhdCB0aGlzIGV4dHJhY3RvciBzdXBwb3J0cworICAgICAgICAgICAgY29uc3QgY2hhciAqKnN1cHBvcnRlZF90eXBlczsKKyAgICAgICAgfSB2MzsKKyAgICB9IHU7Cit9OworCisvLyB0aGUgQysrIGJhc2VkIEFQSSB3aGljaCBmaXJzdCBzaGlwcGVkIGluIFAgYW5kIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQKK2NvbnN0IHVpbnQzMl90IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX0xFR0FDWSA9IDE7CisKKy8vIHRoZSBmaXJzdCBDL05ESyBiYXNlZCBBUEkKK2NvbnN0IHVpbnQzMl90IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMSA9IDI7CisKKy8vIHRoZSBzZWNvbmQgQy9OREsgYmFzZWQgQVBJCitjb25zdCB1aW50MzJfdCBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIgPSAzOworCitjb25zdCB1aW50MzJfdCBFWFRSQUNUT1JERUZfVkVSU0lPTiA9IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMjsKKworLy8gZWFjaCBwbHVnaW4gbGlicmFyeSBleHBvcnRzIG9uZSBmdW5jdGlvbiBvZiB0aGlzIHR5cGUKK3R5cGVkZWYgRXh0cmFjdG9yRGVmICgqR2V0RXh0cmFjdG9yRGVmKSgpOworCit9IC8vIGV4dGVybiAiQyIKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9FWFRSQUNUT1JfUExVR0lOX0FQSV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NmYxNzcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmgKQEAgLTAsMCArMSw0OTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0VYVFJBQ1RPUl9QTFVHSU5fSEVMUEVSX0hfCisKKyNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9IRUxQRVJfSF8KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEYXRhU291cmNlQmFzZTsKK2NsYXNzIE1ldGFEYXRhQmFzZTsKK3N0cnVjdCBNZWRpYVRyYWNrOworCisKK2NsYXNzIE1lZGlhVHJhY2tIZWxwZXI7CisKK2NsYXNzIE1lZGlhQnVmZmVySGVscGVyIHsKK3ByaXZhdGU6CisgICAgZnJpZW5kIENNZWRpYVRyYWNrICp3cmFwKE1lZGlhVHJhY2tIZWxwZXIgKik7CisgICAgQ01lZGlhQnVmZmVyICptQnVmZmVyOworcHVibGljOgorICAgIE1lZGlhQnVmZmVySGVscGVyKENNZWRpYUJ1ZmZlciAqYnVmKSB7CisgICAgICAgIG1CdWZmZXIgPSBidWY7CisgICAgfQorCisgICAgdmlydHVhbCB+TWVkaWFCdWZmZXJIZWxwZXIoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSB7CisgICAgICAgIG1CdWZmZXItPnJlbGVhc2UobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQqIGRhdGEoKSB7CisgICAgICAgIHJldHVybiBtQnVmZmVyLT5kYXRhKG1CdWZmZXItPmhhbmRsZSk7CisgICAgfQorCisgICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXItPnNpemUobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9vZmZzZXQoKSB7CisgICAgICAgIHJldHVybiBtQnVmZmVyLT5yYW5nZV9vZmZzZXQobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9sZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBtQnVmZmVyLT5yYW5nZV9sZW5ndGgobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpIHsKKyAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKG1CdWZmZXItPmhhbmRsZSwgb2Zmc2V0LCBsZW5ndGgpOworICAgIH0KKyAgICB2aXJ0dWFsIEFNZWRpYUZvcm1hdCAqbWV0YV9kYXRhKCkgeworICAgICAgICByZXR1cm4gbUJ1ZmZlci0+bWV0YV9kYXRhKG1CdWZmZXItPmhhbmRsZSk7CisgICAgfQorfTsKKworY2xhc3MgTWVkaWFCdWZmZXJHcm91cEhlbHBlciB7Citwcml2YXRlOgorICAgIENNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CisgICAgc3RkOjptYXA8Q01lZGlhQnVmZmVyKiwgTWVkaWFCdWZmZXJIZWxwZXIqPiBtQnVmZmVySGVscGVyczsKK3B1YmxpYzoKKyAgICBNZWRpYUJ1ZmZlckdyb3VwSGVscGVyKENNZWRpYUJ1ZmZlckdyb3VwICpncm91cCkgeworICAgICAgICBtR3JvdXAgPSBncm91cDsKKyAgICB9CisgICAgfk1lZGlhQnVmZmVyR3JvdXBIZWxwZXIoKSB7CisgICAgICAgIC8vIGRlbGV0ZSBhbGwgZW50cmllcyBpbiBtYXAKKyAgICAgICAgQUxPR1YoImJ1ZmZlcmdyb3VwICVwIG1hcCBoYXMgJXp1IGVudHJpZXMiLCB0aGlzLCBtQnVmZmVySGVscGVycy5zaXplKCkpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQnVmZmVySGVscGVycy5iZWdpbigpOyBpdCAhPSBtQnVmZmVySGVscGVycy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgZGVsZXRlIGl0LT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBpbml0KHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCA9IDApIHsKKyAgICAgICAgcmV0dXJuIG1Hcm91cC0+aW5pdChtR3JvdXAtPmhhbmRsZSwgYnVmZmVycywgYnVmZmVyX3NpemUsIGdyb3d0aExpbWl0KTsKKyAgICB9CisgICAgdm9pZCBhZGRfYnVmZmVyKHNpemVfdCBzaXplKSB7CisgICAgICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihtR3JvdXAtPmhhbmRsZSwgc2l6ZSk7CisgICAgfQorICAgIG1lZGlhX3N0YXR1c190IGFjcXVpcmVfYnVmZmVyKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGJvb2wgbm9uQmxvY2tpbmcgPSBmYWxzZSwgc2l6ZV90IHJlcXVlc3RlZFNpemUgPSAwKSB7CisgICAgICAgIENNZWRpYUJ1ZmZlciAqYnVmID0gbnVsbHB0cjsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0KKyAgICAgICAgICAgICAgICBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKG1Hcm91cC0+aGFuZGxlLCAmYnVmLCBub25CbG9ja2luZywgcmVxdWVzdGVkU2l6ZSk7CisgICAgICAgIGlmIChyZXQgPT0gQU1FRElBX09LICYmIGJ1ZiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBhdXRvIGhlbHBlciA9IG1CdWZmZXJIZWxwZXJzLmZpbmQoYnVmKTsKKyAgICAgICAgICAgIGlmIChoZWxwZXIgPT0gbUJ1ZmZlckhlbHBlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciogbmV3SGVscGVyID0gbmV3IE1lZGlhQnVmZmVySGVscGVyKGJ1Zik7CisgICAgICAgICAgICAgICAgbUJ1ZmZlckhlbHBlcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGJ1ZiwgbmV3SGVscGVyKSk7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IG5ld0hlbHBlcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGhlbHBlci0+c2Vjb25kOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgYm9vbCBoYXNfYnVmZmVycygpIHsKKyAgICAgICAgcmV0dXJuIG1Hcm91cC0+aGFzX2J1ZmZlcnMobUdyb3VwLT5oYW5kbGUpOworICAgIH0KK307CisKK2NsYXNzIE1lZGlhVHJhY2tIZWxwZXIgeworcHVibGljOgorICAgIE1lZGlhVHJhY2tIZWxwZXIoKSA6IG1CdWZmZXJHcm91cChudWxscHRyKSB7CisgICAgfQorICAgIHZpcnR1YWwgfk1lZGlhVHJhY2tIZWxwZXIoKSB7CisgICAgICAgIGRlbGV0ZSBtQnVmZmVyR3JvdXA7CisgICAgfQorICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCkgPSAwOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqZm9ybWF0KSA9IDA7CisKKyAgICBjbGFzcyBSZWFkT3B0aW9ucyB7CisgICAgcHVibGljOgorICAgICAgICBlbnVtIFNlZWtNb2RlIDogaW50MzJfdCB7CisgICAgICAgICAgICBTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgICAgICAgICBTRUVLX05FWFRfU1lOQywKKyAgICAgICAgICAgIFNFRUtfQ0xPU0VTVF9TWU5DLAorICAgICAgICAgICAgU0VFS19DTE9TRVNULAorICAgICAgICAgICAgU0VFS19GUkFNRV9JTkRFWCwKKyAgICAgICAgfTsKKworICAgICAgICBSZWFkT3B0aW9ucyh1aW50MzJfdCBvcHRpb25zLCBpbnQ2NF90IHNlZWtQb3NVcykgeworICAgICAgICAgICAgbU9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICAgICAgbVNlZWtQb3NVcyA9IHNlZWtQb3NVczsKKyAgICAgICAgfQorICAgICAgICBib29sIGdldFNlZWtUbyhpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3QgeworICAgICAgICAgICAgaWYgKChtT3B0aW9ucyAmIENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUspID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqdGltZV91cyA9IG1TZWVrUG9zVXM7CisgICAgICAgICAgICAqbW9kZSA9IChTZWVrTW9kZSkgKG1PcHRpb25zICYgNyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBib29sIGdldE5vbkJsb2NraW5nKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1PcHRpb25zICYgQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6Tk9OQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICB1aW50MzJfdCBtT3B0aW9uczsKKyAgICAgICAgaW50NjRfdCBtU2Vla1Bvc1VzOworICAgIH07CisKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKSA9IDA7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkKCkgeyByZXR1cm4gZmFsc2U7IH0KK3Byb3RlY3RlZDoKKyAgICBmcmllbmQgQ01lZGlhVHJhY2sgKndyYXAoTWVkaWFUcmFja0hlbHBlciAqdHJhY2spOworICAgIE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKm1CdWZmZXJHcm91cDsKK307CisKK2lubGluZSBDTWVkaWFUcmFjayAqd3JhcChNZWRpYVRyYWNrSGVscGVyICp0cmFjaykgeworICAgIGlmICh0cmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBDTWVkaWFUcmFjayAqd3JhcHBlciA9IChDTWVkaWFUcmFjayopIG1hbGxvYyhzaXplb2YoQ01lZGlhVHJhY2spKTsKKyAgICB3cmFwcGVyLT5kYXRhID0gdHJhY2s7CisgICAgd3JhcHBlci0+ZnJlZSA9IFtdKHZvaWQgKmRhdGEpIC0+IHZvaWQgeworICAgICAgICBkZWxldGUgKE1lZGlhVHJhY2tIZWxwZXIqKShkYXRhKTsKKyAgICB9OworICAgIHdyYXBwZXItPnN0YXJ0ID0gW10odm9pZCAqZGF0YSwgQ01lZGlhQnVmZmVyR3JvdXAgKmJ1ZmZlckdyb3VwKSAtPiBtZWRpYV9zdGF0dXNfdCB7CisgICAgICAgIGlmICgoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5tQnVmZmVyR3JvdXApIHsKKyAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkbid0IGhhcHBlbiwgYnV0IGhhbmRsZSBpdCBhbnl3YXkKKyAgICAgICAgICAgIGRlbGV0ZSAoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5tQnVmZmVyR3JvdXA7CisgICAgICAgIH0KKyAgICAgICAgKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+bUJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIoYnVmZmVyR3JvdXApOworICAgICAgICByZXR1cm4gKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+c3RhcnQoKTsKKyAgICB9OworICAgIHdyYXBwZXItPnN0b3AgPSBbXSh2b2lkICpkYXRhKSAtPiBtZWRpYV9zdGF0dXNfdCB7CisgICAgICAgIHJldHVybiAoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5zdG9wKCk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5nZXRGb3JtYXQgPSBbXSh2b2lkICpkYXRhLCBBTWVkaWFGb3JtYXQgKm1ldGEpIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFUcmFja0hlbHBlciopZGF0YSktPmdldEZvcm1hdChtZXRhKTsKKyAgICB9OworICAgIHdyYXBwZXItPnJlYWQgPSBbXSh2b2lkICpkYXRhLCBDTWVkaWFCdWZmZXIgKipidWZmZXIsICB1aW50MzJfdCBvcHRpb25zLCBpbnQ2NF90IHNlZWtQb3NVcykKKyAgICAgICAgICAgIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnMgb3B0cyhvcHRpb25zLCBzZWVrUG9zVXMpOworICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmID0gTlVMTDsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+cmVhZCgmYnVmLCAmb3B0cyk7CisgICAgICAgIGlmIChyZXQgPT0gQU1FRElBX09LICYmIGJ1ZiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAqYnVmZmVyID0gYnVmLT5tQnVmZmVyOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfTsKKyAgICB3cmFwcGVyLT5zdXBwb3J0c05vbkJsb2NraW5nUmVhZCA9IFtdKHZvaWQgKmRhdGEpIC0+IGJvb2wgeworICAgICAgICAgICAgICAgIHJldHVybiAoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5zdXBwb3J0c05vbkJsb2NraW5nUmVhZCgpOworICAgIH07CisgICAgcmV0dXJuIHdyYXBwZXI7Cit9CisKKworLy8gZXh0cmFjdG9yIHBsdWdpbnMgY2FuIGRlcml2ZSBmcm9tIHRoaXMgY2xhc3Mgd2hpY2ggbG9va3MgcmVtYXJrYWJseQorLy8gbGlrZSBNZWRpYUV4dHJhY3RvciBhbmQgY2FuIGJlIGVhc2lseSB3cmFwcGVkIGluIHRoZSByZXF1aXJlZCBDIEFQSQorY2xhc3MgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcigpIHt9CisgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKSA9IDA7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpID0gMDsKKworICAgIGVudW0gR2V0VHJhY2tNZXRhRGF0YUZsYWdzIHsKKyAgICAgICAga0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSA9IDEKKyAgICB9OworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKSA9IDA7CisKKyAgICAvLyBSZXR1cm4gY29udGFpbmVyIHNwZWNpZmljIG1ldGEtZGF0YS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgICAvLyByZXR1cm5zIGFuIGVtcHR5IG1ldGFkYXRhIG9iamVjdC4KKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgPSAwOworCisgICAgZW51bSBGbGFncyB7CisgICAgICAgIENBTl9TRUVLX0JBQ0tXQVJEICA9IDEsICAvLyB0aGUgInNlZWsgMTBzZWNzIGJhY2sgYnV0dG9uIgorICAgICAgICBDQU5fU0VFS19GT1JXQVJEICAgPSAyLCAgLy8gdGhlICJzZWVrIDEwc2VjcyBmb3J3YXJkIGJ1dHRvbiIKKyAgICAgICAgQ0FOX1BBVVNFICAgICAgICAgID0gNCwKKyAgICAgICAgQ0FOX1NFRUsgICAgICAgICAgID0gOCwgIC8vIHRoZSAic2VlayBiYXIiCisgICAgfTsKKworICAgIC8vIElmIHN1YmNsYXNzZXMgZG8gX25vdF8gb3ZlcnJpZGUgdGhpcywgdGhlIGRlZmF1bHQgaXMKKyAgICAvLyBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSyB8IENBTl9QQVVTRQorICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSyB8IENBTl9QQVVTRTsKKyAgICB9OworCisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiPHVuc3BlY2lmaWVkPiI7IH0KKworcHJvdGVjdGVkOgorICAgIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKCkge30KKworcHJpdmF0ZToKKyAgICBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcihjb25zdCBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciAmKTsKKyAgICBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyICYpOworfTsKKworaW5saW5lIENNZWRpYUV4dHJhY3RvciAqd3JhcChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciAqZXh0cmFjdG9yKSB7CisgICAgQ01lZGlhRXh0cmFjdG9yICp3cmFwcGVyID0gKENNZWRpYUV4dHJhY3RvciopIG1hbGxvYyhzaXplb2YoQ01lZGlhRXh0cmFjdG9yKSk7CisgICAgd3JhcHBlci0+ZGF0YSA9IGV4dHJhY3RvcjsKKyAgICB3cmFwcGVyLT5mcmVlID0gW10odm9pZCAqZGF0YSkgLT4gdm9pZCB7CisgICAgICAgIGRlbGV0ZSAoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKShkYXRhKTsKKyAgICB9OworICAgIHdyYXBwZXItPmNvdW50VHJhY2tzID0gW10odm9pZCAqZGF0YSkgLT4gc2l6ZV90IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5jb3VudFRyYWNrcygpOworICAgIH07CisgICAgd3JhcHBlci0+Z2V0VHJhY2sgPSBbXSh2b2lkICpkYXRhLCBzaXplX3QgaW5kZXgpIC0+IENNZWRpYVRyYWNrKiB7CisgICAgICAgIHJldHVybiB3cmFwKCgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5nZXRUcmFjayhpbmRleCkpOworICAgIH07CisgICAgd3JhcHBlci0+Z2V0VHJhY2tNZXRhRGF0YSA9IFtdKAorICAgICAgICAgICAgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5nZXRUcmFja01ldGFEYXRhKG1ldGEsIGluZGV4LCBmbGFncyk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5nZXRNZXRhRGF0YSA9IFtdKAorICAgICAgICAgICAgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSkgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPmdldE1ldGFEYXRhKG1ldGEpOworICAgIH07CisgICAgd3JhcHBlci0+ZmxhZ3MgPSBbXSgKKyAgICAgICAgICAgIHZvaWQgKmRhdGEpIC0+IHVpbnQzMl90IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5mbGFncygpOworICAgIH07CisgICAgd3JhcHBlci0+c2V0TWVkaWFDYXMgPSBbXSgKKyAgICAgICAgICAgIHZvaWQgKmRhdGEsIGNvbnN0IHVpbnQ4X3QgKmNhc1Rva2VuLCBzaXplX3Qgc2l6ZSkgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPnNldE1lZGlhQ2FzKGNhc1Rva2VuLCBzaXplKTsKKyAgICB9OworICAgIHdyYXBwZXItPm5hbWUgPSBbXSgKKyAgICAgICAgICAgIHZvaWQgKmRhdGEpIC0+IGNvbnN0IGNoYXIgKiB7CisgICAgICAgIHJldHVybiAoKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKilkYXRhKS0+bmFtZSgpOworICAgIH07CisgICAgcmV0dXJuIHdyYXBwZXI7Cit9CisKKy8qIGFkZHMgc29tZSBjb252aWVuY2UgbWV0aG9kcyAqLworY2xhc3MgRGF0YVNvdXJjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgRGF0YVNvdXJjZUhlbHBlcihDRGF0YVNvdXJjZSAqY3NvdXJjZSkgeworICAgICAgICBtU291cmNlID0gY3NvdXJjZTsKKyAgICB9CisKKyAgICBleHBsaWNpdCBEYXRhU291cmNlSGVscGVyKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgeworICAgICAgICBtU291cmNlID0gc291cmNlLT5tU291cmNlOworICAgIH0KKworICAgIHZpcnR1YWwgfkRhdGFTb3VyY2VIZWxwZXIoKSB7fQorCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWRBdChtU291cmNlLT5oYW5kbGUsIG9mZnNldCwgZGF0YSwgc2l6ZSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPmdldFNpemUobVNvdXJjZS0+aGFuZGxlLCBzaXplKTsKKyAgICB9CisKKyAgICBib29sIGdldFVyaShjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5nZXRVcmkobVNvdXJjZS0+aGFuZGxlLCB1cmlTdHJpbmcsIGJ1ZmZlclNpemUpOworICAgIH0KKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5mbGFncyhtU291cmNlLT5oYW5kbGUpOworICAgIH0KKworICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZHM6CisgICAgYm9vbCBnZXRVSW50MTYob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4KSB7CisgICAgICAgICp4ID0gMDsKKworICAgICAgICB1aW50OF90IGJ5dGVbMl07CisgICAgICAgIGlmIChyZWFkQXQob2Zmc2V0LCBieXRlLCAyKSAhPSAyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAqeCA9IChieXRlWzBdIDw8IDgpIHwgYnl0ZVsxXTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAzIGJ5dGUgaW50LCByZXR1cm5lZCBhcyBhIDMyLWJpdCBpbnQKKyAgICBib29sIGdldFVJbnQyNChvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngpIHsKKyAgICAgICAgKnggPSAwOworCisgICAgICAgIHVpbnQ4X3QgYnl0ZVszXTsKKyAgICAgICAgaWYgKHJlYWRBdChvZmZzZXQsIGJ5dGUsIDMpICE9IDMpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgICp4ID0gKGJ5dGVbMF0gPDwgMTYpIHwgKGJ5dGVbMV0gPDwgOCkgfCBieXRlWzJdOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgZ2V0VUludDMyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCkgeworICAgICAgICAqeCA9IDA7CisKKyAgICAgICAgdWludDMyX3QgdG1wOworICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgNCkgIT0gNCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgKnggPSBudG9obCh0bXApOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgZ2V0VUludDY0KG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCkgeworICAgICAgICAqeCA9IDA7CisKKyAgICAgICAgdWludDY0X3QgdG1wOworICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgOCkgIT0gOCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgKnggPSAoKHVpbnQ2NF90KW50b2hsKHRtcCAmIDB4ZmZmZmZmZmYpIDw8IDMyKSB8IG50b2hsKHRtcCA+PiAzMik7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gcmVhZCBlaXRoZXIgaW50PE4+IG9yIGludDwyTj4gaW50byBhIHVpbnQ8Mk4+X3QsIHNpemUgaXMgdGhlIGludCBzaXplIGluIGJ5dGVzLgorICAgIGJvb2wgZ2V0VUludDE2VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPT0gMikgeworICAgICAgICAgICAgcmV0dXJuIGdldFVJbnQxNihvZmZzZXQsIHgpOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID09IDEpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdG1wOworICAgICAgICAgICAgaWYgKHJlYWRBdChvZmZzZXQsICZ0bXAsIDEpID09IDEpIHsKKyAgICAgICAgICAgICAgICAqeCA9IHRtcDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBnZXRVSW50MzJWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4LCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA9PSA0KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VUludDMyKG9mZnNldCwgeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPT0gMikgeworICAgICAgICAgICAgdWludDE2X3QgdG1wOworICAgICAgICAgICAgaWYgKGdldFVJbnQxNihvZmZzZXQsICZ0bXApKSB7CisgICAgICAgICAgICAgICAgKnggPSB0bXA7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgZ2V0VUludDY0VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPT0gOCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFVJbnQ2NChvZmZzZXQsIHgpOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID09IDQpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRtcDsKKyAgICAgICAgICAgIGlmIChnZXRVSW50MzIob2Zmc2V0LCAmdG1wKSkgeworICAgICAgICAgICAgICAgICp4ID0gdG1wOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBDRGF0YVNvdXJjZSAqbVNvdXJjZTsKK307CisKKworCisvLyBoZWxwZXJzIHRvIGNyZWF0ZSBhIG1lZGlhX3V1aWRfdCBmcm9tIGEgc3RyaW5nIGxpdGVyYWwKKworLy8gcHVycG9zZWx5IG5vdCBkZWZpbmVkIGFueXdoZXJlIHNvIHRoYXQgdGhpcyB3aWxsIGZhaWwgdG8gbGluayBpZgorLy8gZXhwcmVzc2lvbnMgYmVsb3cgYXJlIG5vdCBldmFsdWF0ZWQgYXQgY29tcGlsZSB0aW1lCitpbnQgaW52YWxpZF91dWlkX3N0cmluZyhjb25zdCBjaGFyICopOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Citjb25zdGV4cHIgdWludDhfdCBfZGlnaXRBdF8oY29uc3QgVCAoJnMpW05dLCBjb25zdCBzaXplX3QgbikgeworICAgIHJldHVybiBzW25dID49ICcwJyAmJiBzW25dIDw9ICc5JyA/IHNbbl0gLSAnMCcKKyAgICAgICAgICAgIDogc1tuXSA+PSAnYScgJiYgc1tuXSA8PSAnZicgPyBzW25dIC0gJ2EnICsgMTAKKyAgICAgICAgICAgICAgICAgICAgOiBzW25dID49ICdBJyAmJiBzW25dIDw9ICdGJyA/IHNbbl0gLSAnQScgKyAxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW52YWxpZF91dWlkX3N0cmluZygidXVpZDogYmFkIGRpZ2l0cyIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Citjb25zdGV4cHIgdWludDhfdCBfaGV4Qnl0ZUF0Xyhjb25zdCBUICgmcylbTl0sIHNpemVfdCBuKSB7CisgICAgcmV0dXJuIChfZGlnaXRBdF8ocywgbikgPDwgNCkgKyBfZGlnaXRBdF8ocywgbiArIDEpOworfQorCitjb25zdGV4cHIgYm9vbCBfYXNzZXJ0SXNEYXNoXyhjaGFyIGMpIHsKKyAgICByZXR1cm4gYyA9PSAnLScgPyB0cnVlIDogaW52YWxpZF91dWlkX3N0cmluZygiV3JvbmcgZm9ybWF0Iik7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgTj4KK2NvbnN0ZXhwciBtZWRpYV91dWlkX3QgY29uc3RVVUlEKGNvbnN0IGNoYXIgKCZzKSBbTl0pIHsKKyAgICBzdGF0aWNfYXNzZXJ0KE4gPT0gMzcsICJ1dWlkOiB3cm9uZyBsZW5ndGgiKTsKKyAgICByZXR1cm4KKyAgICAgICAgICAgIF9hc3NlcnRJc0Rhc2hfKHNbOF0pLAorICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1sxM10pLAorICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1sxOF0pLAorICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1syM10pLAorICAgICAgICAgICAgbWVkaWFfdXVpZF90IHt7CisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgNCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgNiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgOSksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTEpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDE0KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxNiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTkpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDIxKSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyNCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjYpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDI4KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAzMCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMzIpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDM0KSwKKyAgICAgICAgICAgIH19OworfQorLy8gQ29udmVuaWVuY2UgbWFjcm8gdG8gY3JlYXRlIGEgbWVkaWFfdXVpZF90IGZyb20gYSBzdHJpbmcgbGl0ZXJhbCwgd2hpY2ggc2hvdWxkCisvLyBiZSBmb3JtYXR0ZWQgYXMgIjEyMzQ1Njc4LTEyMzQtMTIzNC0xMjM0LTEyMzQ1Njc4OWFiYyIsIGFzIGdlbmVyYXRlZCBieQorLy8gZS5nLiBodHRwczovL3d3dy51dWlkZ2VuZXJhdG9yLm5ldC8gb3IgdGhlICd1dWlkZ2VuJyBsaW51eCBjb21tYW5kLgorLy8gSGV4IGRpZ2l0cyBtYXkgYmUgdXBwZXIgb3IgbG93ZXIgY2FzZS4KKy8vCisvLyBUaGUgbWFjcm8gY2FsbCBpcyBvdGhlcndpc2UgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nIHRoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkKKy8vIChlLmcuIFVVSUQoIjdkNjEzODU4LTU4MzctNGEzOC04NGM1LTMzMmQxY2RkZWUyNyIpIGlzIHRoZSBzYW1lIGFzCisvLyAgICAgICB7ezB4N2QsIDB4NjEsIDB4MzgsIDB4NTgsIDB4NTgsIDB4MzcsIDB4NGEsIDB4MzgsCisvLyAgICAgICAgIDB4ODQsIDB4YzUsIDB4MzMsIDB4MmQsIDB4MWMsIDB4ZGQsIDB4ZWUsIDB4Mjd9fSkKKworI2RlZmluZSBVVUlEKHN0cikgW117IGNvbnN0ZXhwciBtZWRpYV91dWlkX3QgdXVpZCA9IGNvbnN0VVVJRChzdHIpOyByZXR1cm4gdXVpZDsgfSgpCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9IRUxQRVJfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRyaWNzLmggYi9pbmNsdWRlL21lZGlhL01lZGlhTWV0cmljcy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjVmNzU3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhTWV0cmljcy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhTWV0cmljcy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVNvdXJjZS5oCmluZGV4IDJlMTQ3YzQuLjM0YmY2NWQgMTIwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhU291cmNlLmgKQEAgLTEgKzEgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy4uLy4uL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDVhNjMyODdhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5M2ViYTMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaApAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfU09VUkNFX0JBU0VfSF8KKworI2RlZmluZSBNRURJQV9TT1VSQ0VfQkFTRV9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVkaWFCdWZmZXJCYXNlOworc3RydWN0IENNZWRpYVRyYWNrOworCitjbGFzcyBTb3VyY2VCYXNlQWxsb2NUcmFja2VyIHsKK3B1YmxpYzoKKyAgICBTb3VyY2VCYXNlQWxsb2NUcmFja2VyKCkgeworICAgICAgICBBTE9HRCgic291cmNlYmFzZSBhbGxvY2F0ZWQ6ICVwIiwgdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgflNvdXJjZUJhc2VBbGxvY1RyYWNrZXIoKSB7CisgICAgICAgIEFMT0dEKCJzb3VyY2ViYXNlIGZyZWVkOiAlcCIsIHRoaXMpOworICAgIH0KK307CisKK3N0cnVjdCBNZWRpYVRyYWNrCisvLyAgICA6IHB1YmxpYyBTb3VyY2VCYXNlQWxsb2NUcmFja2VyCit7CisgICAgTWVkaWFUcmFjaygpOworCisgICAgLy8gVG8gYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgbWV0aG9kcyBvbiB0aGlzIG9iamVjdCwgZXhjZXB0CisgICAgLy8gZ2V0Rm9ybWF0KCkuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKKworICAgIC8vIEFueSBibG9ja2luZyByZWFkIGNhbGwgcmV0dXJucyBpbW1lZGlhdGVseSB3aXRoIGEgcmVzdWx0IG9mIE5PX0lOSVQuCisgICAgLy8gSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCBhbnkgbWV0aG9kcyBvdGhlciB0aGFuIHN0YXJ0IGFmdGVyIHRoaXMgY2FsbAorICAgIC8vIHJldHVybnMuIEFueSBidWZmZXJzIHRoZSBvYmplY3QgbWF5IGJlIGhvbGRpbmcgb250byBhdCB0aGUgdGltZSBvZgorICAgIC8vIHRoZSBzdG9wKCkgY2FsbCBhcmUgcmVsZWFzZWQuCisgICAgLy8gQWxzbywgaXQgaXMgaW1wZXJhdGl2ZSB0aGF0IGFueSBidWZmZXJzIG91dHB1dCBieSB0aGlzIG9iamVjdCBhbmQKKyAgICAvLyBoZWxkIG9udG8gYnkgY2FsbGVycyBiZSByZWxlYXNlZCBiZWZvcmUgYSBjYWxsIHRvIHN0b3AoKSAhISEKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEgb3V0cHV0IGJ5IHRoaXMgbWVkaWEgdHJhY2suCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlJiBmb3JtYXQpID0gMDsKKworICAgIC8vIE9wdGlvbnMgdGhhdCBtb2RpZnkgcmVhZCgpIGJlaGF2aW91ci4gVGhlIGRlZmF1bHQgaXMgdG8KKyAgICAvLyBhKSBub3QgcmVxdWVzdCBhIHNlZWsKKyAgICAvLyBiKSBub3QgYmUgbGF0ZSwgaS5lLiBsYXRlbmVzc191cyA9IDAKKyAgICBzdHJ1Y3QgUmVhZE9wdGlvbnMgeworICAgICAgICBlbnVtIFNlZWtNb2RlIDogaW50MzJfdCB7CisgICAgICAgICAgICBTRUVLX1BSRVZJT1VTX1NZTkMgPSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgICAgICAgICBTRUVLX05FWFRfU1lOQyA9IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DLAorICAgICAgICAgICAgU0VFS19DTE9TRVNUX1NZTkMgPSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQywKKyAgICAgICAgICAgIFNFRUtfQ0xPU0VTVCA9IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCwKKyAgICAgICAgICAgIFNFRUtfRlJBTUVfSU5ERVggPSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYLAorICAgICAgICB9OworCisgICAgICAgIFJlYWRPcHRpb25zKCkgeworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc2V0IGV2ZXJ5dGhpbmcgYmFjayB0byBkZWZhdWx0cy4KKyAgICAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIG1PcHRpb25zID0gMDsKKyAgICAgICAgICAgIG1TZWVrVGltZVVzID0gMDsKKyAgICAgICAgICAgIG1Ob25CbG9ja2luZyA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRTZWVrVG8oaW50NjRfdCB0aW1lX3VzLCBTZWVrTW9kZSBtb2RlID0gU0VFS19DTE9TRVNUX1NZTkMpOworICAgICAgICB2b2lkIGNsZWFyU2Vla1RvKCkgeworICAgICAgICAgICAgbU9wdGlvbnMgJj0gfmtTZWVrVG9fT3B0aW9uOworICAgICAgICAgICAgbVNlZWtUaW1lVXMgPSAwOworICAgICAgICAgICAgbVNlZWtNb2RlID0gU0VFS19DTE9TRVNUX1NZTkM7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBnZXRTZWVrVG8oaW50NjRfdCAqdGltZV91cywgU2Vla01vZGUgKm1vZGUpIGNvbnN0OworCisgICAgICAgIHZvaWQgc2V0Tm9uQmxvY2tpbmcoKTsKKyAgICAgICAgdm9pZCBjbGVhck5vbkJsb2NraW5nKCk7CisgICAgICAgIGJvb2wgZ2V0Tm9uQmxvY2tpbmcoKSBjb25zdDsKKworICAgICAgICAvLyBVc2VkIHRvIGNsZWFyIGFsbCBub24tcGVyc2lzdGVudCBvcHRpb25zIGZvciBtdWx0aXBsZSBidWZmZXIgcmVhZHMuCisgICAgICAgIHZvaWQgY2xlYXJOb25QZXJzaXN0ZW50KCkgeworICAgICAgICAgICAgY2xlYXJTZWVrVG8oKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgZW51bSBPcHRpb25zIHsKKyAgICAgICAgICAgIGtTZWVrVG9fT3B0aW9uICAgICAgPSAxLAorICAgICAgICB9OworCisgICAgICAgIHVpbnQzMl90IG1PcHRpb25zOworICAgICAgICBpbnQ2NF90IG1TZWVrVGltZVVzOworICAgICAgICBTZWVrTW9kZSBtU2Vla01vZGU7CisgICAgICAgIGJvb2wgbU5vbkJsb2NraW5nOworICAgIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7IC8vIHNlbnQgdGhyb3VnaCBCaW5kZXIKKworICAgIC8vIFJldHVybnMgYSBuZXcgYnVmZmVyIG9mIGRhdGEuIENhbGwgYmxvY2tzIHVudGlsIGEKKyAgICAvLyBidWZmZXIgaXMgYXZhaWxhYmxlLCBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCBvZiB0aGUgZW5kIG9mIHRoZSBzdHJlYW0KKyAgICAvLyBpcyByZWFjaGVkLgorICAgIC8vIEVuZCBvZiBzdHJlYW0gaXMgc2lnbmFsbGVkIGJ5IGEgcmVzdWx0IG9mIEVSUk9SX0VORF9PRl9TVFJFQU0uCisgICAgLy8gQSByZXN1bHQgb2YgSU5GT19GT1JNQVRfQ0hBTkdFRCBpbmRpY2F0ZXMgdGhhdCB0aGUgZm9ybWF0IG9mIHRoaXMKKyAgICAvLyBNZWRpYVNvdXJjZSBoYXMgY2hhbmdlZCBtaWQtc3RyZWFtLCB0aGUgY2xpZW50IGNhbiBjb250aW51ZSByZWFkaW5nCisgICAgLy8gYnV0IHNob3VsZCBiZSBwcmVwYXJlZCBmb3IgYnVmZmVycyBvZiB0aGUgbmV3IGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpID0gMDsKKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB8cmVhZHwgc3VwcG9ydHMgbm9uYmxvY2tpbmcgb3B0aW9uLCBvdGhlcndpc2UgZmFsc2UuCisgICAgLy8gfHJlYWRNdWx0aXBsZXwgaWYgc3VwcG9ydGVkLCBhbHdheXMgYWxsb3dzIHRoZSBub25ibG9ja2luZyBvcHRpb24uCisgICAgdmlydHVhbCBib29sIHN1cHBvcnROb25ibG9ja2luZ1JlYWQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5NZWRpYVRyYWNrKCk7CisKK3ByaXZhdGU6CisgICAgTWVkaWFUcmFjayhjb25zdCBNZWRpYVRyYWNrICYpOworICAgIE1lZGlhVHJhY2sgJm9wZXJhdG9yPShjb25zdCBNZWRpYVRyYWNrICYpOworfTsKKworY2xhc3MgTWVkaWFUcmFja0NVbndyYXBwZXIgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitwdWJsaWM6CisgICAgc3RhdGljIE1lZGlhVHJhY2tDVW53cmFwcGVyICpjcmVhdGUoQ01lZGlhVHJhY2sgKndyYXBwZXIpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYgZm9ybWF0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworCisgICAgdmlydHVhbCBib29sIHN1cHBvcnROb25ibG9ja2luZ1JlYWQoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1lZGlhVHJhY2tDVW53cmFwcGVyKCk7CisKK3ByaXZhdGU6CisgICAgZXhwbGljaXQgTWVkaWFUcmFja0NVbndyYXBwZXIoQ01lZGlhVHJhY2sgKndyYXBwZXIpOworICAgIENNZWRpYVRyYWNrICp3cmFwcGVyOworICAgIE1lZGlhQnVmZmVyR3JvdXAgKmJ1ZmZlckdyb3VwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9TT1VSQ0VfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oIGIvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYmJhNzkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3JQcml2LmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9FUlJPUl9QUklWX0gKKyNkZWZpbmUgX05ES19NRURJQV9FUlJPUl9QUklWX0gKKworI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKGFuZHJvaWQ6OnN0YXR1c190KTsKKworYW5kcm9pZDo6c3RhdHVzX3QgcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3IobWVkaWFfc3RhdHVzX3QpOworCisjZW5kaWYgLy8gX05ES19NRURJQV9FUlJPUl9QUklWX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmggYi9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZGE0YTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KKyAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KKyAqIERvIG5vdCBjaGFuZ2UgbWV0aG9kIHNpZ25hdHVyZXMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBjb25zdGFudHMuCisgKiBEbyBub3QgY2hhbmdlIHRoZSBzaXplIG9mIGFueSBvZiB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIGhlcmUuCisgKiBEbyBub3QgcmVmZXJlbmNlIHR5cGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBOREsuCisgKiBEbyBub3QgI2luY2x1ZGUgZmlsZXMgdGhhdCBhcmVuJ3QgcGFydCBvZiB0aGUgTkRLLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICisjZGVmaW5lIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAorCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgQU1lZGlhRm9ybWF0IHsKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpBTWVzc2FnZT4gbUZvcm1hdDsKKyAgICBhbmRyb2lkOjpTdHJpbmc4IG1EZWJ1ZzsKKyAgICBhbmRyb2lkOjpLZXllZFZlY3RvcjxhbmRyb2lkOjpTdHJpbmc4LCBhbmRyb2lkOjpTdHJpbmc4PiBtU3RyaW5nQ2FjaGU7Cit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyhzcDxBTWVzc2FnZT4gKik7Cit2b2lkIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoY29uc3QgQU1lZGlhRm9ybWF0KiBtRGF0YSwgc3A8QU1lc3NhZ2U+ICpkZXN0KTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmggYi9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oCmluZGV4IGUzZWYxMzQuLjg1ZTE3ZjkgMTIwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaApAQCAtMSArMSBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy4uLy4uL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9UaW1lQ2hlY2suaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oIGIvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGFkYWE0ODkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmggYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCmluZGV4IGNhMTE5ZDUuLjVmMTlmNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKKysrIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaApAQCAtNTM4LDYgKzUzOCwxMCBAQAogICAgICAgICBtVGltZXN0YW1wTXV0YXRvci5wdXNoKHRpbWVzdGFtcCk7CiAgICAgfQogCisgICAgdmlydHVhbCBFeHRlbmRlZFRpbWVzdGFtcCBnZXRUaW1lc3RhbXAoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVGltZXN0YW1wTXV0YXRvci5sYXN0KCk7CisgICAgfQorCiAgICAgLy8gRmx1c2hlcyB0aGUgc2hhcmVkIHJpbmcgYnVmZmVyIGlmIHRoZSBjbGllbnQgaGFkIHJlcXVlc3RlZCBpdCB1c2luZyBtU3RyZWFtaW5nLm1GbHVzaC4KICAgICAvLyBJZiBmbHVzaCBvY2N1cnMgdGhlbjoKICAgICAvLyAgIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQsIFNlcnZlclByb3h5OjptRmx1c2ggYW5kIFNlcnZlclByb3h5OjptRmx1c2hlZCB3aWxsIGJlIG1vZGlmaWVkCkBAIC01NTEsNiArNTU1LDkgQEAKICAgICAvLyBUb3RhbCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGZsdXNoZWQgZnJhbWVzIHNpbmNlIGNyZWF0aW9uIChuZXZlciByZXNldCkuCiAgICAgdmlydHVhbCBpbnQ2NF90ICAgICBmcmFtZXNGbHVzaGVkKCkgY29uc3QgeyByZXR1cm4gbUZsdXNoZWQ7IH0KIAorICAgIC8vIFNhZmUgZnJhbWVzIHJlYWR5IHF1ZXJ5IHdpdGggbm8gc2lkZSBlZmZlY3RzLgorICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZnJhbWVzUmVhZHlTYWZlKCkgY29uc3QgPSAwOworCiAgICAgLy8gR2V0IGR5bmFtaWMgYnVmZmVyIHNpemUgZnJvbSB0aGUgc2hhcmVkIGNvbnRyb2wgYmxvY2suCiAgICAgdWludDMyX3QgICAgICAgICAgICBnZXRCdWZmZXJTaXplSW5GcmFtZXMoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoKGludDMyX3QgKikmbUNibGstPm1CdWZmZXJTaXplSW5GcmFtZXMpOwpAQCAtNTg4LDggKzU5NSw3IEBACiAgICAgLy8gd2hpY2ggbWF5IGluY2x1ZGUgbm9uLWNvbnRpZ3VvdXMgZnJhbWVzCiAgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeSgpOwogCi0gICAgLy8gU2FmZSBmcmFtZXMgcmVhZHkgcXVlcnkgdXNlZCBieSBkdW1wKCkgLSB0aGlzIGhhcyBubyBzaWRlIGVmZmVjdHMuCi0gICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeVNhZmUoKSBjb25zdDsKKyAgICBzaXplX3QgICAgICAgICAgICAgIGZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0IG92ZXJyaWRlOyAvLyBmcmFtZXMgYXZhaWxhYmxlIHRvIHJlYWQgYnkgc2VydmVyLgogCiAgICAgLy8gQ3VycmVudGx5IEF1ZGlvRmxpbmdlciB3aWxsIGNhbGwgZnJhbWVzUmVhZHkoKSBmb3IgYSBmYXN0IHRyYWNrIGZyb20gdHdvIHRocmVhZHM6CiAgICAgLy8gRmFzdE1peGVyIHRocmVhZCwgYW5kIG5vcm1hbCBtaXhlciB0aHJlYWQuICBUaGlzIGlzIGRhbmdlcm91cywgYXMgdGhlIHByb3h5IGlzIGludGVuZGVkCkBAIC02OTMsNiArNjk5LDggQEAKICAgICAgICAgcmV0dXJuIG1DYmxrLT51Lm1TdHJlYW1pbmcubVJlYXI7IC8vIEZvciBjb21wbGV0ZW5lc3Mgb25seTsgbVJlYXIgd3JpdHRlbiBieSBzZXJ2ZXIuCiAgICAgfQogCisgICAgc2l6ZV90IGZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0IG92ZXJyaWRlOyAvLyBmcmFtZXMgYXZhaWxhYmxlIHRvIHJlYWQgYnkgY2xpZW50LgorCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QXVkaW9SZWNvcmRTZXJ2ZXJQcm94eSgpIHsgfQogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaCBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaAppbmRleCA1ZmQ4ZWIyLi5jMzU3Y2FhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmgKKysrIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oCkBAIC00MCw2ICs0MCw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CiAKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmgKaW5kZXggN2EyOWUzMS4uMmUyZmY3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmgKKysrIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmgKQEAgLTUyLDYgKzUyLDcgQEAKIAogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KTsKICAgICAgICAgICAgIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgICAgICAgc3RhdHVzX3QgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwogCiAgICAgICAgICAgICAvLyBCcFNvdW5kVHJpZ2dlckNsaWVudAogICAgICAgICAgICAgdmlydHVhbCB2b2lkIG9uUmVjb2duaXRpb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvT1dORVJTIGIvbWVkaWEvT1dORVJTCmluZGV4IDFmNjg3YTIuLjFlMmQxMjMgMTAwNjQ0Ci0tLSBhL21lZGlhL09XTkVSUworKysgYi9tZWRpYS9PV05FUlMKQEAgLTIsOCArMiwxMCBAQAogZHdrYW5nQGdvb2dsZS5jb20KIGVsYXVyZW50QGdvb2dsZS5jb20KIGVzc2lja0Bnb29nbGUuY29tCitna2FzdGVuQGdvb2dsZS5jb20KIGhrdWFuZ0Bnb29nbGUuY29tCiBodW5nYUBnb29nbGUuY29tCitqaWFiaW5AZ29vZ2xlLmNvbQogam10cml2aUBnb29nbGUuY29tCiBrcm9jYXJkQGdvb2dsZS5jb20KIGxham9zQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsgYi9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCmluZGV4IDcwYzI4MWEuLjFmMjQ0MTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tawpAQCAtNCw3ICs0LDYgQEAKIAogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKIAltYWluX2F1ZGlvc2VydmVyLmNwcCBcCi0JLi4vbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5haWRsCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYmFhdWRpb3NlcnZpY2UgXApAQCAtMTcsOSArMTYsMTIgQEAKIAlsaWJod2JpbmRlciBcCiAJbGlibWVkaWEgXAogCWxpYm1lZGlhbG9nc2VydmljZSBcCisJbGlibWVkaWF1dGlscyBcCiAJbGlibmJhaW8gXAorCWxpYm5ibG9nIFwKIAlsaWJzb3VuZHRyaWdnZXJzZXJ2aWNlIFwKLQlsaWJ1dGlscworCWxpYnV0aWxzIFwKKwlsaWJ2aWJyYXRvcgogCiAjIFRPRE8gb2JvZXNlcnZpY2UgaXMgdGhlIG9sZCBmb2xkZXIgbmFtZSBmb3IgYWF1ZGlvc2VydmljZS4gSXQgd2lsbCBiZSBjaGFuZ2VkLgogTE9DQUxfQ19JTkNMVURFUyA6PSBcCkBAIC00MCw5ICs0Miw2IEBACiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCiAJZXh0ZXJuYWwvc29uaWMgXAogCi1MT0NBTF9BSURMX0lOQ0xVREVTIDo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsCi0KICMgSWYgQVVESU9TRVJWRVJfTVVMVElMSUIgaW4gZGV2aWNlLm1rIGlzIG5vbi1lbXB0eSB0aGVuIGl0IGlzIHVzZWQgdG8gY29udHJvbAogIyB0aGUgTE9DQUxfTVVMVElMSUIgZm9yIGFsbCBhdWRpb3NlcnZlciBleGNsdXNpdmUgbGlicmFyaWVzLgogIyBUaGlzIGlzIHJlbGV2YW50IGZvciA2NCBiaXQgYXJjaGl0ZWN0dXJlcyB3aGVyZSBlaXRoZXIgb3IgYm90aApAQCAtNTQsMTMgKzUzLDkgQEAKICMgICBib3RoICAgIHRvIGJ1aWxkIGJvdGggMzIgYml0IGFuZCA2NCBiaXQgbGlicmFyaWVzLAogIyAgICAgICAgICAgYW5kIHVzZSBwcmltYXJ5IHRhcmdldCBhcmNoaXRlY3R1cmUgKDMyIG9yIDY0KSBmb3IgYXVkaW9zZXJ2ZXIuCiAjICAgZmlyc3QgICB0byBidWlsZCBsaWJyYXJpZXMgYW5kIGF1ZGlvc2VydmVyIGZvciB0aGUgcHJpbWFyeSB0YXJnZXQgYXJjaGl0ZWN0dXJlIG9ubHkuCi0jICAgPGVtcHR5PiB0byBidWlsZCBib3RoIDMyIGFuZCA2NCBiaXQgbGlicmFyaWVzIGFuZCAzMiBiaXQgYXVkaW9zZXJ2ZXIuCisjICAgPGVtcHR5PiB0byBidWlsZCBib3RoIDMyIGFuZCA2NCBiaXQgbGlicmFyaWVzIGFuZCBwcmltYXJ5IHRhcmdldCBhdWRpb3NlcnZlci4KIAotaWZlcSAoJChzdHJpcCAkKEFVRElPU0VSVkVSX01VTFRJTElCKSksKQotTE9DQUxfTVVMVElMSUIgOj0gMzIKLWVsc2UKIExPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCi1lbmRpZgogCiBMT0NBTF9NT0RVTEUgOj0gYXVkaW9zZXJ2ZXIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMgYi9tZWRpYS9hdWRpb3NlcnZlci9hdWRpb3NlcnZlci5yYwppbmRleCAxZjJlODJmLi5kZmIxYTNmIDEwMDY0NAotLS0gYS9tZWRpYS9hdWRpb3NlcnZlci9hdWRpb3NlcnZlci5yYworKysgYi9tZWRpYS9hdWRpb3NlcnZlci9hdWRpb3NlcnZlci5yYwpAQCAtNyw2ICs3LDcgQEAKICAgICBpb3ByaW8gcnQgNAogICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MgL2Rldi9zdHVuZS9mb3JlZ3JvdW5kL3Rhc2tzCiAgICAgb25yZXN0YXJ0IHJlc3RhcnQgdmVuZG9yLmF1ZGlvLWhhbC0yLTAKKyAgICBvbnJlc3RhcnQgcmVzdGFydCB2ZW5kb3IuYXVkaW8taGFsLTQtMC1tc2QKICAgICAjIEtlZXAgdGhlIG9yaWdpbmFsIHNlcnZpY2UgbmFtZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aGVuIHVwZ3JhZGluZwogICAgICMgTy1NUjEgZGV2aWNlcyB3aXRoIGZyYW1ld29yay1vbmx5LgogICAgIG9ucmVzdGFydCByZXN0YXJ0IGF1ZGlvLWhhbC0yLTAKQEAgLTE1LDMgKzE2LDYgQEAKICAgICBzdG9wIGF1ZGlvc2VydmVyCiBvbiBwcm9wZXJ0eTp2dHMubmF0aXZlX3NlcnZlci5vbj0wCiAgICAgc3RhcnQgYXVkaW9zZXJ2ZXIKKworb24gaW5pdAorICAgIG1rZGlyIC9kZXYvc29ja2V0L2F1ZGlvc2VydmVyIDA3NzUgYXVkaW9zZXJ2ZXIgYXVkaW9zZXJ2ZXIKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29yLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWRmYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3IuY3BwCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbENvbm5lY3Rpb24iCisKKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorI2luY2x1ZGUgIkFjY2Vzc29ySW1wbC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6YWRkKAorICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCwKKyAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvcikgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUFjY2Vzc29ycy5maW5kKGNvbm5lY3Rpb25JZCkgPT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICBtQWNjZXNzb3JzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25uZWN0aW9uSWQsIGFjY2Vzc29yKSk7CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6cmVtb3ZlKGludDY0X3QgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1BY2Nlc3NvcnMuZXJhc2UoY29ubmVjdGlvbklkKTsKKyAgICBhdXRvIGl0ID0gbUNvbm5lY3Rpb25Ub0Nvb2tpZS5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGl0ICE9IG1Db25uZWN0aW9uVG9Db29raWUuZW5kKCkpIHsKKyAgICAgICAgdWludDY0X3QgY29va2llID0gaXQtPnNlY29uZDsKKyAgICAgICAgbUNvbm5lY3Rpb25Ub0Nvb2tpZS5lcmFzZShpdCk7CisgICAgICAgIGF1dG8gY2l0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgICAgICBpZiAoY2l0ICE9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmVuZCgpKSB7CisgICAgICAgICAgICBjaXQtPnNlY29uZC5lcmFzZShjb25uZWN0aW9uSWQpOworICAgICAgICAgICAgaWYgKGNpdC0+c2Vjb25kLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbUNvb2tpZVRvQ29ubmVjdGlvbnMuZXJhc2UoY2l0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ6OmFkZENvb2tpZVRvQ29ubmVjdGlvbigKKyAgICAgICAgdWludDY0X3QgY29va2llLAorICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUFjY2Vzc29ycy5maW5kKGNvbm5lY3Rpb25JZCkgPT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1Db25uZWN0aW9uVG9Db29raWUuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbm5lY3Rpb25JZCwgY29va2llKSk7CisgICAgYXV0byBpdCA9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmZpbmQoY29va2llKTsKKyAgICBpZiAoaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgaXQtPnNlY29uZC5pbnNlcnQoY29ubmVjdGlvbklkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgY29va2llLCBzdGQ6OnNldDxpbnQ2NF90Pntjb25uZWN0aW9uSWR9KSk7CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6c2VydmljZURpZWQoCisgICAgICAgIHVpbnQ2NF90IGNvb2tpZSwKKyAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICApIHsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBjb25zdCB3cDxBY2Nlc3Nvcj4+IGNvbm5lY3Rpb25zVG9DbG9zZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKworICAgICAgICBhdXRvIGl0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgICAgICBpZiAoaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byBjb25JdCA9IGl0LT5zZWNvbmQuYmVnaW4oKTsgY29uSXQgIT0gaXQtPnNlY29uZC5lbmQoKTsgKytjb25JdCkgeworICAgICAgICAgICAgICAgIGF1dG8gYWNjZXNzb3JJdCA9IG1BY2Nlc3NvcnMuZmluZCgqY29uSXQpOworICAgICAgICAgICAgICAgIGlmIChhY2Nlc3Nvckl0ICE9IG1BY2Nlc3NvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnNUb0Nsb3NlLmluc2VydChzdGQ6Om1ha2VfcGFpcigqY29uSXQsIGFjY2Vzc29ySXQtPnNlY29uZCkpOworICAgICAgICAgICAgICAgICAgICBtQWNjZXNzb3JzLmVyYXNlKGFjY2Vzc29ySXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvblRvQ29va2llLmVyYXNlKCpjb25JdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5lcmFzZShpdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29ubmVjdGlvbnNUb0Nsb3NlLnNpemUoKSA+IDApIHsKKyAgICAgICAgc3A8QWNjZXNzb3I+IGFjY2Vzc29yOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBjb25uZWN0aW9uc1RvQ2xvc2UuYmVnaW4oKTsgaXQgIT0gY29ubmVjdGlvbnNUb0Nsb3NlLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBhY2Nlc3NvciA9IGl0LT5zZWNvbmQucHJvbW90ZSgpOworCisgICAgICAgICAgICBpZiAoYWNjZXNzb3IpIHsKKyAgICAgICAgICAgICAgICBhY2Nlc3Nvci0+Y2xvc2UoaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiY29ubmVjdGlvbiAlbGxkIGNsb3NlZCBvbiBkZWF0aCIsIChsb25nIGxvbmcpaXQtPmZpcnN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworbmFtZXNwYWNlIHsKK3N0YXRpYyBzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQgPQorICAgICAgICBuZXcgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCk7Cit9CisKK3NwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gQWNjZXNzb3I6OmdldENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpIHsKKyAgICByZXR1cm4gc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDsKK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3IgZm9sbG93LgorUmV0dXJuPHZvaWQ+IEFjY2Vzc29yOjpjb25uZWN0KGNvbm5lY3RfY2IgX2hpZGxfY2IpIHsKKyAgICBzcDxDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQ7CisgICAgY29uc3QgUXVldWVEZXNjcmlwdG9yKiBmbXFEZXNjOworCisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IGNvbm5lY3QoJmNvbm5lY3Rpb24sICZjb25uZWN0aW9uSWQsICZmbXFEZXNjLCBmYWxzZSk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgY29ubmVjdGlvbiwgY29ubmVjdGlvbklkLCAqZm1xRGVzYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBudWxscHRyLCAtMUxMLAorICAgICAgICAgICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzxCdWZmZXJTdGF0dXNNZXNzYWdlPigKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpoYXJkd2FyZTo6R3JhbnRvckRlc2NyaXB0b3I+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBuaGFuZGxlICovLCAwIC8qIHNpemUgKi8pKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworQWNjZXNzb3I6OkFjY2Vzc29yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgIDogbUltcGwobmV3IEltcGwoYWxsb2NhdG9yKSkge30KKworQWNjZXNzb3I6On5BY2Nlc3NvcigpIHsKK30KKworYm9vbCBBY2Nlc3Nvcjo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gKGJvb2wpbUltcGw7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+YWxsb2NhdGUoY29ubmVjdGlvbklkLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpmZXRjaCgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+ZmV0Y2goY29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6Y29ubmVjdCgKKyAgICAgICAgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwKKyAgICAgICAgY29uc3QgUXVldWVEZXNjcmlwdG9yKiogZm1xRGVzY1B0ciwgYm9vbCBsb2NhbCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPmNvbm5lY3QodGhpcywgY29ubmVjdGlvbiwgcENvbm5lY3Rpb25JZCwgZm1xRGVzY1B0cik7CisgICAgICAgIGlmICghbG9jYWwgJiYgc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHNwPEFjY2Vzc29yPiBhY2Nlc3Nvcih0aGlzKTsKKyAgICAgICAgICAgIHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQtPmFkZCgqcENvbm5lY3Rpb25JZCwgYWNjZXNzb3IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1JbXBsLT5jbG9zZShjb25uZWN0aW9uSWQpOworICAgICAgICBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50LT5yZW1vdmUoY29ubmVjdGlvbklkKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5jbGVhblVwKGNsZWFyQ2FjaGUpOworICAgIH0KK30KKworLy9JQWNjZXNzb3IqIEhJRExfRkVUQ0hfSUFjY2Vzc29yKGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8pIHsKKy8vICAgIHJldHVybiBuZXcgQWNjZXNzb3IoKTsKKy8vfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjg2ZjdiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3IuaApAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQUNDRVNTT1JfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0lBY2Nlc3Nvci5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgIkJ1ZmZlclN0YXR1cy5oIgorCisjaW5jbHVkZSA8c2V0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IEFjY2Vzc29yOworc3RydWN0IENvbm5lY3Rpb247CisKKy8qKgorICogUmVjZWl2ZXMgZGVhdGggbm90aWZpY2F0aW9ucyBmcm9tIHJlbW90ZSBjb25uZWN0aW9ucy4KKyAqIE9uIGRlYXRoIG5vdGlmaWNhdGlvbnMsIHRoZSBjb25uZWN0aW9ucyBhcmUgY2xvc2VkIGFuZCB1c2VkIHJlc291cmNlcworICogYXJlIHJlbGVhc2VkLgorICovCitzdHJ1Y3QgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50IDogcHVibGljIGhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudCB7CisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgbmV3bHkgY29ubmVjdGVkIGNvbm5lY3Rpb24gZnJvbSByZW1vdGUgcHJvY2Vzc2VzLgorICAgICAqLworICAgIHZvaWQgYWRkKGludDY0X3QgY29ubmVjdGlvbklkLCBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBjb25uZWN0aW9uLgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlKGludDY0X3QgY29ubmVjdGlvbklkKTsKKworICAgIHZvaWQgYWRkQ29va2llVG9Db25uZWN0aW9uKHVpbnQ2NF90IGNvb2tpZSwgaW50NjRfdCBjb25uZWN0aW9uSWQpOworCisgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKAorICAgICAgICAgICAgdWludDY0X3QgLyogY29va2llICovLAorICAgICAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICAgICAgKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnNldDxpbnQ2NF90Pj4gIG1Db29raWVUb0Nvbm5lY3Rpb25zOworICAgIHN0ZDo6bWFwPGludDY0X3QsIHVpbnQ2NF90PiBtQ29ubmVjdGlvblRvQ29va2llOworICAgIHN0ZDo6bWFwPGludDY0X3QsIGNvbnN0IHdwPEFjY2Vzc29yPj4gbUFjY2Vzc29yczsKK307CisKKy8qKgorICogQSBidWZmZXIgcG9vbCBhY2Nlc3NvciB3aGljaCBlbmFibGVzIGEgYnVmZmVyIHBvb2wgdG8gY29tbXVuaWNhdGUgd2l0aCBidWZmZXIKKyAqIHBvb2wgY2xpZW50cy4gMToxIGNvcnJlc3BvbmRlbnNlIGhvbGRzIGJldHdlZW4gYSBidWZmZXIgcG9vbCBhbmQgYW4gYWNjZXNzb3IuCisgKi8KK3N0cnVjdCBBY2Nlc3NvciA6IHB1YmxpYyBJQWNjZXNzb3IgeworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUFjY2Vzc29yIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gY29ubmVjdChjb25uZWN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgcG9vbCBhY2Nlc3NvciB3aGljaCB1c2VzIHRoZSBzcGVjaWZpZWQgYWxsb2NhdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGFsbG9jYXRvciBidWZmZXIgYWxsb2NhdG9yLgorICAgICAqLworICAgIGV4cGxpY2l0IEFjY2Vzc29yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKTsKKworICAgIC8qKiBEZXN0cnVjdHMgYSBidWZmZXIgcG9vbCBhY2Nlc3Nvci4gKi8KKyAgICB+QWNjZXNzb3IoKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFjY2Vzc29yIGlzIHZhbGlkLiAqLworICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgLyoqIEFsbG9jYXRlcyBhIGJ1ZmZlciBmcm9tIGEgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgY29ubmVjdGlvbiBpZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgLyoqCisgICAgICogRmV0Y2hlcyBhIGJ1ZmZlciBmb3IgdGhlIHNwZWNpZmllZCB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiByZWNlaXZpbmcgY29ubmVjdGlvbihjbGllbnQpLgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIHRoZSBpZCBvZiB0aGUgdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIgdG8gYmUgZmV0Y2hlZC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICB0aGUgbmF0aXZlIGhhbmRsZSBvZiB0aGUgZmV0Y2hlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGZldGNoZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGZldGNoKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIE1ha2VzIGEgY29ubmVjdGlvbiB0byB0aGUgYnVmZmVyIHBvb2wuIFRoZSBidWZmZXIgcG9vbCBjbGllbnQgdXNlcyB0aGUKKyAgICAgKiBjcmVhdGVkIGNvbm5lY3Rpb24gaW4gb3JkZXIgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgYnVmZmVyIHBvb2wuIEFuCisgICAgICogRk1RIGZvciBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgaXMgYWxzbyBjcmVhdGVkIGZvciB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb24gICAgY3JlYXRlZCBjb25uZWN0aW9uCisgICAgICogQHBhcmFtIHBDb25uZWN0aW9uSWQgdGhlIGlkIG9mIHRoZSBjcmVhdGVkIGNvbm5lY3Rpb24KKyAgICAgKiBAcGFyYW0gZm1xRGVzY1B0ciAgICBGTVEgZGVzY3JpcHRvciBmb3Igc2hhcmVkIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlIGJldHdlZW4gYSBidWZmZXIgcG9vbCBhbmQgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gbG9jYWwgICAgICAgICB0cnVlIHdoZW4gYSBjb25uZWN0aW9uIHJlcXVlc3QgY29tZXMgZnJvbSBsb2NhbCBwcm9jZXNzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5IG1hZGUuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNvbm5lY3QoCisgICAgICAgICAgICBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgY29uc3QgUXVldWVEZXNjcmlwdG9yKiogZm1xRGVzY1B0ciwgYm9vbCBsb2NhbCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIHBlcmZvbXMgcGVyaW9kaWMgY2FjaGUKKyAgICAgKiBjbGVhbmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGVhckNhY2hlICAgIGlmIGNsZWFyQ2FjaGUgaXMgdHJ1ZSwgaXQgZnJlZXMgYWxsIGJ1ZmZlcnMgd2FpdGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlY3ljbGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIGhpZGxfZGVhdGhfcmVjaXBpZW50IGZvciByZW1vdGUgY29ubmVjdGlvbiBkZWF0aC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiBnZXRDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKTsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBtSW1wbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3NvckltcGwuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3JJbXBsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTE3ZjE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3JJbXBsLmNwcApAQCAtMCwwICsxLDU0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbEFjY2Vzc29yIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkFjY2Vzc29ySW1wbC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCituYW1lc3BhY2UgeworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrQ2xlYW5VcER1cmF0aW9uVXMgPSA1MDAwMDA7IC8vIFRPRE8gdHVuZSAwLjUgc2VjCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtMb2dEdXJhdGlvblVzID0gNTAwMDAwMDsgLy8gNSBzZWNzCisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWluQWxsb2NCeXRlc0ZvckV2aWN0aW9uID0gMTAyNCoxMDI0KjE1OworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNaW5CdWZmZXJDb3VudEZvckV2aWN0aW9uID0gNDA7Cit9CisKKy8vIEJ1ZmZlciBzdHJ1Y3R1cmUgaW4gYnVmZmVycG9vbCBwcm9jZXNzCitzdHJ1Y3QgSW50ZXJuYWxCdWZmZXIgeworICAgIEJ1ZmZlcklkIG1JZDsKKyAgICBzaXplX3QgbU93bmVyQ291bnQ7CisgICAgc2l6ZV90IG1UcmFuc2FjdGlvbkNvdW50OworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gbUFsbG9jYXRpb247CisgICAgY29uc3Qgc2l6ZV90IG1BbGxvY1NpemU7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gbUNvbmZpZzsKKworICAgIEludGVybmFsQnVmZmVyKAorICAgICAgICAgICAgQnVmZmVySWQgaWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY1NpemUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmYWxsb2NDb25maWcpCisgICAgICAgICAgICA6IG1JZChpZCksIG1Pd25lckNvdW50KDApLCBtVHJhbnNhY3Rpb25Db3VudCgwKSwKKyAgICAgICAgICAgIG1BbGxvY2F0aW9uKGFsbG9jKSwgbUFsbG9jU2l6ZShhbGxvY1NpemUpLCBtQ29uZmlnKGFsbG9jQ29uZmlnKSB7fQorCisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUoKSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbi0+aGFuZGxlKCk7CisgICAgfQorfTsKKworc3RydWN0IFRyYW5zYWN0aW9uU3RhdHVzIHsKKyAgICBUcmFuc2FjdGlvbklkIG1JZDsKKyAgICBCdWZmZXJJZCBtQnVmZmVySWQ7CisgICAgQ29ubmVjdGlvbklkIG1TZW5kZXI7CisgICAgQ29ubmVjdGlvbklkIG1SZWNlaXZlcjsKKyAgICBCdWZmZXJTdGF0dXMgbVN0YXR1czsKKyAgICBpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICBib29sIG1TZW5kZXJWYWxpZGF0ZWQ7CisKKyAgICBUcmFuc2FjdGlvblN0YXR1cyhjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlLCBpbnQ2NF90IHRpbWVzdGFtcFVzKSB7CisgICAgICAgIG1JZCA9IG1lc3NhZ2UudHJhbnNhY3Rpb25JZDsKKyAgICAgICAgbUJ1ZmZlcklkID0gbWVzc2FnZS5idWZmZXJJZDsKKyAgICAgICAgbVN0YXR1cyA9IG1lc3NhZ2UubmV3U3RhdHVzOworICAgICAgICBtVGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgaWYgKG1TdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9UTykgeworICAgICAgICAgICAgbVNlbmRlciA9IG1lc3NhZ2UuY29ubmVjdGlvbklkOworICAgICAgICAgICAgbVJlY2VpdmVyID0gbWVzc2FnZS50YXJnZXRDb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtU2VuZGVyVmFsaWRhdGVkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TZW5kZXIgPSAtMUxMOworICAgICAgICAgICAgbVJlY2VpdmVyID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtU2VuZGVyVmFsaWRhdGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9OworCisvLyBIZWxwZXIgdGVtcGxhdGUgbWV0aG9kcyBmb3IgaGFuZGxpbmcgbWFwIG9mIHNldC4KK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIGluc2VydChzdGQ6Om1hcDxULCBzdGQ6OnNldDxVPj4gKm1hcE9mU2V0LCBUIGtleSwgVSB2YWx1ZSkgeworICAgIGF1dG8gaXRlciA9IG1hcE9mU2V0LT5maW5kKGtleSk7CisgICAgaWYgKGl0ZXIgPT0gbWFwT2ZTZXQtPmVuZCgpKSB7CisgICAgICAgIHN0ZDo6c2V0PFU+IHZhbHVlU2V0e3ZhbHVlfTsKKyAgICAgICAgbWFwT2ZTZXQtPmluc2VydChzdGQ6Om1ha2VfcGFpcihrZXksIHZhbHVlU2V0KSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoaXRlci0+c2Vjb25kLmZpbmQodmFsdWUpICA9PSBpdGVyLT5zZWNvbmQuZW5kKCkpIHsKKyAgICAgICAgaXRlci0+c2Vjb25kLmluc2VydCh2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIGVyYXNlKHN0ZDo6bWFwPFQsIHN0ZDo6c2V0PFU+PiAqbWFwT2ZTZXQsIFQga2V5LCBVIHZhbHVlKSB7CisgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICBhdXRvIGl0ZXIgPSBtYXBPZlNldC0+ZmluZChrZXkpOworICAgIGlmIChpdGVyICE9IG1hcE9mU2V0LT5lbmQoKSkgeworICAgICAgICBpZiAoaXRlci0+c2Vjb25kLmVyYXNlKHZhbHVlKSA+IDApIHsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0ZXItPnNlY29uZC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgbWFwT2ZTZXQtPmVyYXNlKGl0ZXIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIGNvbnRhaW5zKHN0ZDo6bWFwPFQsIHN0ZDo6c2V0PFU+PiAqbWFwT2ZTZXQsIFQga2V5LCBVIHZhbHVlKSB7CisgICAgYXV0byBpdGVyID0gbWFwT2ZTZXQtPmZpbmQoa2V5KTsKKyAgICBpZiAoaXRlciAhPSBtYXBPZlNldC0+ZW5kKCkpIHsKKyAgICAgICAgYXV0byBzZXRJdGVyID0gaXRlci0+c2Vjb25kLmZpbmQodmFsdWUpOworICAgICAgICByZXR1cm4gc2V0SXRlciAhPSBpdGVyLT5zZWNvbmQuZW5kKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworaW50MzJfdCBBY2Nlc3Nvcjo6SW1wbDo6c1BpZCA9IGdldHBpZCgpOwordWludDMyX3QgQWNjZXNzb3I6OkltcGw6OnNTZXFJZCA9IHRpbWUobnVsbHB0cik7CisKK0FjY2Vzc29yOjpJbXBsOjpJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICAgICAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvcikge30KKworQWNjZXNzb3I6OkltcGw6On5JbXBsKCkgeworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLAorICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsIGNvbnN0IFF1ZXVlRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpIHsKKyAgICBzcDxDb25uZWN0aW9uPiBuZXdDb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oKTsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgICAgIGlmIChuZXdDb25uZWN0aW9uKSB7CisgICAgICAgICAgICBDb25uZWN0aW9uSWQgaWQgPSAoaW50NjRfdClzUGlkIDw8IDMyIHwgc1NlcUlkOworICAgICAgICAgICAgc3RhdHVzID0gbUJ1ZmZlclBvb2wubU9ic2VydmVyLm9wZW4oaWQsIGZtcURlc2NQdHIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgbmV3Q29ubmVjdGlvbi0+aW5pdGlhbGl6ZShhY2Nlc3NvciwgaWQpOworICAgICAgICAgICAgICAgICpjb25uZWN0aW9uID0gbmV3Q29ubmVjdGlvbjsKKyAgICAgICAgICAgICAgICAqcENvbm5lY3Rpb25JZCA9IGlkOworICAgICAgICAgICAgICAgICsrc1NlcUlkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgICAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgbUJ1ZmZlclBvb2wuaGFuZGxlQ2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICBtQnVmZmVyUG9vbC5tT2JzZXJ2ZXIuY2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICAvLyBTaW5jZSBjbG9zZSMgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIHdvcmtzIGFyZSBmaW5pc2hlZCwgaXQgaXMgT0sgdG8KKyAgICAvLyBldmljdCB1bnVzZWQgYnVmZmVycy4KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKHRydWUpOworICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLAorICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6Ok9LOworICAgIGlmICghbUJ1ZmZlclBvb2wuZ2V0RnJlZUJ1ZmZlcihtQWxsb2NhdG9yLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpKSB7CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgIHNpemVfdCBhbGxvY1NpemU7CisgICAgICAgIHN0YXR1cyA9IG1BbGxvY2F0b3ItPmFsbG9jYXRlKHBhcmFtcywgJmFsbG9jLCAmYWxsb2NTaXplKTsKKyAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3RhdHVzID0gbUJ1ZmZlclBvb2wuYWRkTmV3QnVmZmVyKGFsbG9jLCBhbGxvY1NpemUsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImNyZWF0ZSBhIGJ1ZmZlciAlZCA6ICV1ICVwIiwKKyAgICAgICAgICAgICAgc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0ssICpidWZmZXJJZCwgKmhhbmRsZSk7CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgb3duQnVmZmVyIGZhaWx1cmUKKyAgICAgICAgbUJ1ZmZlclBvb2wuaGFuZGxlT3duQnVmZmVyKGNvbm5lY3Rpb25JZCwgKmJ1ZmZlcklkKTsKKyAgICB9CisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCgpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6ZmV0Y2goCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgYXV0byBmb3VuZCA9IG1CdWZmZXJQb29sLm1UcmFuc2FjdGlvbnMuZmluZCh0cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgIT0gbUJ1ZmZlclBvb2wubVRyYW5zYWN0aW9ucy5lbmQoKSAmJgorICAgICAgICAgICAgY29udGFpbnMoJm1CdWZmZXJQb29sLm1QZW5kaW5nVHJhbnNhY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkKSkgeworICAgICAgICBpZiAoZm91bmQtPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCAmJgorICAgICAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NICYmCisgICAgICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bUJ1ZmZlcklkID09IGJ1ZmZlcklkKSB7CisgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU3RhdHVzID0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GRVRDSDsKKyAgICAgICAgICAgIGF1dG8gYnVmZmVySXQgPSBtQnVmZmVyUG9vbC5tQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIGlmIChidWZmZXJJdCAhPSBtQnVmZmVyUG9vbC5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgIG1CdWZmZXJQb29sLm1TdGF0cy5vbkJ1ZmZlckZldGNoZWQoKTsKKyAgICAgICAgICAgICAgICAqaGFuZGxlID0gYnVmZmVySXQtPnNlY29uZC0+aGFuZGxlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCgpOworICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIC8vIHRyYW5zYWN0aW9uIHRpbWVvdXQsIGJ1ZmZlciBjYWNoZWluZyBUVEwgaGFuZGxpbmcKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoY2xlYXJDYWNoZSk7Cit9CisKK0FjY2Vzc29yOjpJbXBsOjpJbXBsOjpCdWZmZXJQb29sOjpCdWZmZXJQb29sKCkKKyAgICA6IG1UaW1lc3RhbXBVcyhnZXRUaW1lc3RhbXBOb3coKSksCisgICAgICBtTGFzdENsZWFuVXBVcyhtVGltZXN0YW1wVXMpLAorICAgICAgbUxhc3RMb2dVcyhtVGltZXN0YW1wVXMpLAorICAgICAgbVNlcSgwKSB7fQorCisKKy8vIFN0YXRpc3RpY3MgaGVscGVyCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTPgoraW50IHBlcmNlbnRhZ2UoVCBiYXNlLCBTIHRvdGFsKSB7CisgICAgcmV0dXJuIGludCh0b3RhbCA/IDAuNSArIDEwMC4gKiBzdGF0aWNfY2FzdDxTPihiYXNlKSAvIHRvdGFsIDogMCk7Cit9CisKK0FjY2Vzc29yOjpJbXBsOjpJbXBsOjpCdWZmZXJQb29sOjp+QnVmZmVyUG9vbCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIEFMT0dEKCJEZXN0cnVjdGlvbiAtIGJ1ZmZlcnBvb2wgJXAgIgorICAgICAgICAgICJjYWNoZWQ6ICV6dS8lenVNLCAlenUvJWQlJSBpbiB1c2U7ICIKKyAgICAgICAgICAiYWxsb2NzOiAlenUsICVkJSUgcmVjeWNsZWQ7ICIKKyAgICAgICAgICAidHJhbnNmZXJzOiAlenUsICVkJSUgdW5mZXRjZWQiLAorICAgICAgICAgIHRoaXMsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCwgbVN0YXRzLm1TaXplQ2FjaGVkID4+IDIwLAorICAgICAgICAgIG1TdGF0cy5tQnVmZmVyc0luVXNlLCBwZXJjZW50YWdlKG1TdGF0cy5tQnVmZmVyc0luVXNlLCBtU3RhdHMubUJ1ZmZlcnNDYWNoZWQpLAorICAgICAgICAgIG1TdGF0cy5tVG90YWxBbGxvY2F0aW9ucywgcGVyY2VudGFnZShtU3RhdHMubVRvdGFsUmVjeWNsZXMsIG1TdGF0cy5tVG90YWxBbGxvY2F0aW9ucyksCisgICAgICAgICAgbVN0YXRzLm1Ub3RhbFRyYW5zZmVycywKKyAgICAgICAgICBwZXJjZW50YWdlKG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMgLSBtU3RhdHMubVRvdGFsRmV0Y2hlcywgbVN0YXRzLm1Ub3RhbFRyYW5zZmVycykpOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVPd25CdWZmZXIoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisKKyAgICBib29sIGFkZGVkID0gaW5zZXJ0KCZtVXNpbmdCdWZmZXJzLCBjb25uZWN0aW9uSWQsIGJ1ZmZlcklkKTsKKyAgICBpZiAoYWRkZWQpIHsKKyAgICAgICAgYXV0byBpdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgIGl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQrKzsKKyAgICB9CisgICAgaW5zZXJ0KCZtVXNpbmdDb25uZWN0aW9ucywgYnVmZmVySWQsIGNvbm5lY3Rpb25JZCk7CisgICAgcmV0dXJuIGFkZGVkOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVSZWxlYXNlQnVmZmVyKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCkgeworICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtVXNpbmdCdWZmZXJzLCBjb25uZWN0aW9uSWQsIGJ1ZmZlcklkKTsKKyAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICBhdXRvIGl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgaXRlci0+c2Vjb25kLT5tT3duZXJDb3VudC0tOworICAgICAgICBpZiAoaXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoaXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQoYnVmZmVySWQpOworICAgICAgICB9CisgICAgfQorICAgIGVyYXNlKCZtVXNpbmdDb25uZWN0aW9ucywgYnVmZmVySWQsIGNvbm5lY3Rpb25JZCk7CisgICAgQUxPR1YoInJlbGVhc2UgYnVmZmVyICV1IDogJWQiLCBidWZmZXJJZCwgZGVsZXRlZCk7CisgICAgcmV0dXJuIGRlbGV0ZWQ7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVRyYW5zZmVyVG8oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGF1dG8gY29tcGxldGVkID0gbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5maW5kKAorICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoY29tcGxldGVkICE9IG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgLy8gYWxyZWFkeSBjb21wbGV0ZWQKKyAgICAgICAgbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5lcmFzZShjb21wbGV0ZWQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gdGhlIGJ1ZmZlciBzaG91bGQgZXhpc3QgYW5kIGJlIG93bmVkLgorICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgaWYgKGJ1ZmZlckl0ZXIgPT0gbUJ1ZmZlcnMuZW5kKCkgfHwKKyAgICAgICAgICAgICFjb250YWlucygmbVVzaW5nQnVmZmVycywgbWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYXV0byBmb3VuZCA9IG1UcmFuc2FjdGlvbnMuZmluZChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIC8vIHRyYW5zZmVyX2Zyb20gd2FzIHJlY2VpdmVkIGVhcmxpZXIuCisgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TZW5kZXIgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZDsKKyAgICAgICAgZm91bmQtPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCA9IHRydWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBUT0RPOiB2ZXJpZnkgdGhlcmUgaXMgdGFyZ2V0IGNvbm5lY3Rpb24gSWQKKyAgICBtU3RhdHMub25CdWZmZXJTZW50KCk7CisgICAgbVRyYW5zYWN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zYWN0aW9uU3RhdHVzPihtZXNzYWdlLCBtVGltZXN0YW1wVXMpKSk7CisgICAgaW5zZXJ0KCZtUGVuZGluZ1RyYW5zYWN0aW9ucywgbWVzc2FnZS50YXJnZXRDb25uZWN0aW9uSWQsCisgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCsrOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVUcmFuc2ZlckZyb20oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGF1dG8gZm91bmQgPSBtVHJhbnNhY3Rpb25zLmZpbmQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgPT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAvLyBUT0RPOiBpcyBpdCBmZWFzaWJsZSB0byBjaGVjayBvd25lcnNoaXAgaGVyZT8KKyAgICAgICAgbVN0YXRzLm9uQnVmZmVyU2VudCgpOworICAgICAgICBtVHJhbnNhY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2FjdGlvblN0YXR1cz4obWVzc2FnZSwgbVRpbWVzdGFtcFVzKSkpOworICAgICAgICBpbnNlcnQoJm1QZW5kaW5nVHJhbnNhY3Rpb25zLCBtZXNzYWdlLmNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQrKzsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobWVzc2FnZS5jb25uZWN0aW9uSWQgPT0gZm91bmQtPnNlY29uZC0+bVJlY2VpdmVyKSB7CisgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU3RhdHVzID0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVUcmFuc2ZlclJlc3VsdChjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgYXV0byBmb3VuZCA9IG1UcmFuc2FjdGlvbnMuZmluZChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtUGVuZGluZ1RyYW5zYWN0aW9ucywgbWVzc2FnZS5jb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgICAgICBpZiAoIWZvdW5kLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmluc2VydChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlLm5ld1N0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX09LKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlT3duQnVmZmVyKG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQtLTsKKyAgICAgICAgICAgIGlmIChidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAKKyAgICAgICAgICAgICAgICAmJiBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRyYW5zYWN0aW9ucy5lcmFzZShmb3VuZCk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInRyYW5zZmVyIGZpbmlzaGVkICVsbHUgJXUgLSAlZCIsICh1bnNpZ25lZCBsb25nIGxvbmcpbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkLCBkZWxldGVkKTsKKyAgICAgICAgcmV0dXJuIGRlbGV0ZWQ7CisgICAgfQorICAgIEFMT0dWKCJ0cmFuc2ZlciBub3QgZm91bmQgJWxsdSAldSIsICh1bnNpZ25lZCBsb25nIGxvbmcpbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6cHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCkgeworICAgIHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+IG1lc3NhZ2VzOworICAgIG1PYnNlcnZlci5nZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKG1lc3NhZ2VzKTsKKyAgICBtVGltZXN0YW1wVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBmb3IgKEJ1ZmZlclN0YXR1c01lc3NhZ2UmIG1lc3NhZ2U6IG1lc3NhZ2VzKSB7CisgICAgICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgICAgIHN3aXRjaCAobWVzc2FnZS5uZXdTdGF0dXMpIHsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpOT1RfVVNFRDoKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVSZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlVTRUQ6CisgICAgICAgICAgICAgICAgLy8gbm90IGhhcHBlbmluZworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RPOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyVG8obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTToKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVUcmFuc2ZlckZyb20obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfTE9TVDoKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRkVUQ0g6CisgICAgICAgICAgICAgICAgLy8gbm90IGhhcHBlbmluZworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX09LOgorICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0VSUk9SOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyUmVzdWx0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIEFMT0dXKCJidWZmZXIgc3RhdHVzIG1lc3NhZ2UgcHJvY2Vzc2luZyBmYWlsdXJlIC0gbWVzc2FnZSA6ICVkIGNvbm5lY3Rpb24gOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzLCAobG9uZyBsb25nKW1lc3NhZ2UuY29ubmVjdGlvbklkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtZXNzYWdlcy5jbGVhcigpOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVDbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgLy8gQ2xlYW5pbmcgYnVmZmVycworICAgIGF1dG8gYnVmZmVycyA9IG1Vc2luZ0J1ZmZlcnMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChidWZmZXJzICE9IG1Vc2luZ0J1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBCdWZmZXJJZCYgYnVmZmVySWQgOiBidWZmZXJzLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtVXNpbmdDb25uZWN0aW9ucywgYnVmZmVySWQsIGNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQtLTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGZyZWVidWZmZXIgaW5zZXJ0IGZhaWwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtVXNpbmdCdWZmZXJzLmVyYXNlKGJ1ZmZlcnMpOworICAgIH0KKworICAgIC8vIENsZWFuaW5nIHRyYW5zYWN0aW9ucworICAgIGF1dG8gcGVuZGluZyA9IG1QZW5kaW5nVHJhbnNhY3Rpb25zLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAocGVuZGluZyAhPSBtUGVuZGluZ1RyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICBmb3IgKGNvbnN0IFRyYW5zYWN0aW9uSWQmIHRyYW5zYWN0aW9uSWQgOiBwZW5kaW5nLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIGF1dG8gaXRlciA9IG1UcmFuc2FjdGlvbnMuZmluZCh0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgIGlmIChpdGVyICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWl0ZXItPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmluc2VydCh0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQgPSBpdGVyLT5zZWNvbmQtPm1CdWZmZXJJZDsKKyAgICAgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50LS07CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGZyZWVidWZmZXIgaW5zZXJ0IGZhaWwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVHJhbnNhY3Rpb25zLmVyYXNlKGl0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpnZXRGcmVlQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywgQnVmZmVySWQgKnBJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgYXV0byBidWZmZXJJdCA9IG1GcmVlQnVmZmVycy5iZWdpbigpOworICAgIGZvciAoO2J1ZmZlckl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKTsgKytidWZmZXJJdCkgeworICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCA9ICpidWZmZXJJdDsKKyAgICAgICAgaWYgKGFsbG9jYXRvci0+Y29tcGF0aWJsZShwYXJhbXMsIG1CdWZmZXJzW2J1ZmZlcklkXS0+bUNvbmZpZykpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChidWZmZXJJdCAhPSBtRnJlZUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgQnVmZmVySWQgaWQgPSAqYnVmZmVySXQ7CisgICAgICAgIG1GcmVlQnVmZmVycy5lcmFzZShidWZmZXJJdCk7CisgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclJlY3ljbGVkKG1CdWZmZXJzW2lkXS0+bUFsbG9jU2l6ZSk7CisgICAgICAgICpoYW5kbGUgPSBtQnVmZmVyc1tpZF0tPmhhbmRsZSgpOworICAgICAgICAqcElkID0gaWQ7CisgICAgICAgIEFMT0dWKCJyZWN5Y2xlIGEgYnVmZmVyICV1ICVwIiwgaWQsICpoYW5kbGUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmFkZE5ld0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY1NpemUsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpwSWQsCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworCisgICAgQnVmZmVySWQgYnVmZmVySWQgPSBtU2VxKys7CisgICAgaWYgKG1TZXEgPT0gQ29ubmVjdGlvbjo6U1lOQ19CVUZGRVJJRCkgeworICAgICAgICBtU2VxID0gMDsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPEludGVybmFsQnVmZmVyPiBidWZmZXIgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxJbnRlcm5hbEJ1ZmZlcj4oCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklkLCBhbGxvYywgYWxsb2NTaXplLCBwYXJhbXMpOworICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgYXV0byByZXMgPSBtQnVmZmVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgYnVmZmVySWQsIHN0ZDo6bW92ZShidWZmZXIpKSk7CisgICAgICAgIGlmIChyZXMuc2Vjb25kKSB7CisgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJBbGxvY2F0ZWQoYWxsb2NTaXplKTsKKyAgICAgICAgICAgICpoYW5kbGUgPSBhbGxvYy0+aGFuZGxlKCk7CisgICAgICAgICAgICAqcElkID0gYnVmZmVySWQ7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKGNsZWFyQ2FjaGUgfHwgbVRpbWVzdGFtcFVzID4gbUxhc3RDbGVhblVwVXMgKyBrQ2xlYW5VcER1cmF0aW9uVXMpIHsKKyAgICAgICAgbUxhc3RDbGVhblVwVXMgPSBtVGltZXN0YW1wVXM7CisgICAgICAgIGlmIChtVGltZXN0YW1wVXMgPiBtTGFzdExvZ1VzICsga0xvZ0R1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgIG1MYXN0TG9nVXMgPSBtVGltZXN0YW1wVXM7CisgICAgICAgICAgICBBTE9HRCgiYnVmZmVycG9vbCAlcCA6ICV6dSglenUgc2l6ZSkgdG90YWwgYnVmZmVycyAtICIKKyAgICAgICAgICAgICAgICAgICIlenUoJXp1IHNpemUpIHVzZWQgYnVmZmVycyAtICV6dS8lenUgKHJlY3ljbGUvYWxsb2MpIC0gIgorICAgICAgICAgICAgICAgICAgIiV6dS8lenUgKGZldGNoL3RyYW5zZmVyKSIsCisgICAgICAgICAgICAgICAgICB0aGlzLCBtU3RhdHMubUJ1ZmZlcnNDYWNoZWQsIG1TdGF0cy5tU2l6ZUNhY2hlZCwKKyAgICAgICAgICAgICAgICAgIG1TdGF0cy5tQnVmZmVyc0luVXNlLCBtU3RhdHMubVNpemVJblVzZSwKKyAgICAgICAgICAgICAgICAgIG1TdGF0cy5tVG90YWxSZWN5Y2xlcywgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1Ub3RhbEZldGNoZXMsIG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMpOworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byBmcmVlSXQgPSBtRnJlZUJ1ZmZlcnMuYmVnaW4oKTsgZnJlZUl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKTspIHsKKyAgICAgICAgICAgIGlmICghY2xlYXJDYWNoZSAmJiBtU3RhdHMubVNpemVDYWNoZWQgPCBrTWluQWxsb2NCeXRlc0ZvckV2aWN0aW9uCisgICAgICAgICAgICAgICAgICAgICYmIG1CdWZmZXJzLnNpemUoKSA8IGtNaW5CdWZmZXJDb3VudEZvckV2aWN0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGl0ID0gbUJ1ZmZlcnMuZmluZCgqZnJlZUl0KTsKKyAgICAgICAgICAgIGlmIChpdCAhPSBtQnVmZmVycy5lbmQoKSAmJgorICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmIGl0LT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJFdmljdGVkKGl0LT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBmcmVlSXQgPSBtRnJlZUJ1ZmZlcnMuZXJhc2UoZnJlZUl0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytmcmVlSXQ7CisgICAgICAgICAgICAgICAgQUxPR1coImJ1ZmZlcnBvb2wgaW5jb25zaXN0ZW50ISIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3NvckltcGwuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNGRiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3NvckltcGwuaApAQCAtMCwwICsxLDMwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQUNDRVNTT1JJTVBMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQUNDRVNTT1JJTVBMX0gKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitzdHJ1Y3QgSW50ZXJuYWxCdWZmZXI7CitzdHJ1Y3QgVHJhbnNhY3Rpb25TdGF0dXM7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgYSBidWZmZXIgcG9vbCBhY2Nlc3NvcihvciBhIGJ1ZmZlciBwb29sIGltcGxlbWVudGF0aW9uLikgKi8KK2NsYXNzIEFjY2Vzc29yOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKTsKKworICAgIH5JbXBsKCk7CisKKyAgICBSZXN1bHRTdGF0dXMgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLAorICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLCBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyKTsKKworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICBSZXN1bHRTdGF0dXMgZmV0Y2goQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUpOworCitwcml2YXRlOgorICAgIC8vIENvbm5lY3Rpb25JZCA9IHBpZCA6ICh0aW1lc3RhbXBfY3JlYXRlZCArIHNlcUlkKQorICAgIC8vIGluIG9yZGVyIHRvIGd1YXJhbnRlZSB1bmlxdWVuZXNzIGZvciBlYWNoIGNvbm5lY3Rpb24KKyAgICBzdGF0aWMgdWludDMyX3Qgc1NlcUlkOworICAgIHN0YXRpYyBpbnQzMl90IHNQaWQ7CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBwb29sIGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogSGFuZGxlcyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzLiBIYW5kbGVzIGJ1ZmZlciBhbGxvY2F0aW9uL3JlY3ljbGluZy4KKyAgICAgKiBIYW5kbGVzIGJ1ZmZlciB0cmFuc2ZlciBiZXR3ZWVuIGJ1ZmZlciBwb29sIGNsaWVudHMuCisgICAgICovCisgICAgc3RydWN0IEJ1ZmZlclBvb2wgeworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICAgICAgaW50NjRfdCBtTGFzdENsZWFuVXBVczsKKyAgICAgICAgaW50NjRfdCBtTGFzdExvZ1VzOworICAgICAgICBCdWZmZXJJZCBtU2VxOworICAgICAgICBCdWZmZXJTdGF0dXNPYnNlcnZlciBtT2JzZXJ2ZXI7CisKKyAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBzdGQ6OnNldDxCdWZmZXJJZD4+IG1Vc2luZ0J1ZmZlcnM7CisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnNldDxDb25uZWN0aW9uSWQ+PiBtVXNpbmdDb25uZWN0aW9uczsKKworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6c2V0PFRyYW5zYWN0aW9uSWQ+PiBtUGVuZGluZ1RyYW5zYWN0aW9uczsKKyAgICAgICAgLy8gVHJhbnNhY3Rpb25zIGNvbXBsZXRlZCBiZWZvcmUgVFJBTlNGRVJfVE8gbWVzc2FnZSBhcnJpdmFsLgorICAgICAgICAvLyBGZXRjaCBkb2VzIG5vdCBvY2N1ciBmb3IgdGhlIHRyYW5zYWN0aW9ucy4KKyAgICAgICAgLy8gT25seSB0cmFuc2FjdGlvbiBpZCBpcyBrZXB0IGZvciB0aGUgdHJhbnNhY3Rpb25zIGluIHNob3J0IGR1cmF0aW9uLgorICAgICAgICBzdGQ6OnNldDxUcmFuc2FjdGlvbklkPiBtQ29tcGxldGVkVHJhbnNhY3Rpb25zOworICAgICAgICAvLyBDdXJyZW50bHkgYWN0aXZlKHBlbmRpbmcpIHRyYW5zYXRpb25zJyBzdGF0dXMgJiBpbmZvcm1hdGlvbi4KKyAgICAgICAgc3RkOjptYXA8VHJhbnNhY3Rpb25JZCwgc3RkOjp1bmlxdWVfcHRyPFRyYW5zYWN0aW9uU3RhdHVzPj4KKyAgICAgICAgICAgICAgICBtVHJhbnNhY3Rpb25zOworCisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnVuaXF1ZV9wdHI8SW50ZXJuYWxCdWZmZXI+PiBtQnVmZmVyczsKKyAgICAgICAgc3RkOjpzZXQ8QnVmZmVySWQ+IG1GcmVlQnVmZmVyczsKKworICAgICAgICAvLy8gQnVmZmVyIHBvb2wgc3RhdGlzdGljcyB3aGljaCB0cmFja3MgYWxsb2NhdGlvbiBhbmQgdHJhbnNmZXIgc3RhdGlzdGljcy4KKyAgICAgICAgc3RydWN0IFN0YXRzIHsKKyAgICAgICAgICAgIC8vLyBUb3RhbCBzaXplIG9mIGFsbG9jYXRpb25zIHdoaWNoIGFyZSB1c2VkIG9yIGF2YWlsYWJsZSB0byB1c2UuCisgICAgICAgICAgICAvLy8gKGJ5dGVzIG9yIHBpeGVscykKKyAgICAgICAgICAgIHNpemVfdCBtU2l6ZUNhY2hlZDsKKyAgICAgICAgICAgIC8vLyAjIG9mIGNhY2hlZCBidWZmZXJzIHdoaWNoIGFyZSB1c2VkIG9yIGF2YWlsYWJsZSB0byB1c2UuCisgICAgICAgICAgICBzaXplX3QgbUJ1ZmZlcnNDYWNoZWQ7CisgICAgICAgICAgICAvLy8gVG90YWwgc2l6ZSBvZiBhbGxvY2F0aW9ucyB3aGljaCBhcmUgY3VycmVudGx5IHVzZWQuIChieXRlcyBvciBwaXhlbHMpCisgICAgICAgICAgICBzaXplX3QgbVNpemVJblVzZTsKKyAgICAgICAgICAgIC8vLyAjIG9mIGN1cnJlbnRseSB1c2VkIGJ1ZmZlcnMKKyAgICAgICAgICAgIHNpemVfdCBtQnVmZmVyc0luVXNlOworCisgICAgICAgICAgICAvLy8gIyBvZiBhbGxvY2F0aW9ucyBjYWxsZWQgb24gYnVmZmVycG9vbC4gKCMgb2YgZmV0Y2hlZCBmcm9tIEJsb2NrUG9vbCkKKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxBbGxvY2F0aW9uczsKKyAgICAgICAgICAgIC8vLyAjIG9mIGFsbG9jYXRpb25zIHRoYXQgd2VyZSBzZXJ2ZWQgZnJvbSB0aGUgY2FjaGUuCisgICAgICAgICAgICAvLy8gKCMgb2YgYWxsb2NhdG9yIGFsbG9jIHByZXZlbnRlZCkKKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxSZWN5Y2xlczsKKyAgICAgICAgICAgIC8vLyAjIG9mIGJ1ZmZlciB0cmFuc2ZlcnMgaW5pdGlhdGVkLgorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbFRyYW5zZmVyczsKKyAgICAgICAgICAgIC8vLyAjIG9mIHRyYW5zZmVycyB0aGF0IGhhZCB0byBiZSBmZXRjaGVkLgorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbEZldGNoZXM7CisKKyAgICAgICAgICAgIFN0YXRzKCkKKyAgICAgICAgICAgICAgICA6IG1TaXplQ2FjaGVkKDApLCBtQnVmZmVyc0NhY2hlZCgwKSwgbVNpemVJblVzZSgwKSwgbUJ1ZmZlcnNJblVzZSgwKSwKKyAgICAgICAgICAgICAgICAgIG1Ub3RhbEFsbG9jYXRpb25zKDApLCBtVG90YWxSZWN5Y2xlcygwKSwgbVRvdGFsVHJhbnNmZXJzKDApLCBtVG90YWxGZXRjaGVzKDApIHt9CisKKyAgICAgICAgICAgIC8vLyBBIG5ldyBidWZmZXIgaXMgYWxsb2NhdGVkIG9uIGFuIGFsbG9jYXRpb24gcmVxdWVzdC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJBbGxvY2F0ZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplQ2FjaGVkICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0NhY2hlZCsrOworCisgICAgICAgICAgICAgICAgbVNpemVJblVzZSArPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNJblVzZSsrOworCisgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGlzIGV2aWN0ZWQgYW5kIGRlc3Ryb3llZC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJFdmljdGVkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUNhY2hlZCAtPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNDYWNoZWQtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGlzIHJlY3ljbGVkIG9uIGFuIGFsbG9jYXRpb24gcmVxdWVzdC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJSZWN5Y2xlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVJblVzZSArPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNJblVzZSsrOworCisgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMrKzsKKyAgICAgICAgICAgICAgICBtVG90YWxSZWN5Y2xlcysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgYXZhaWxhYmxlIHRvIGJlIHJlY3ljbGVkLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlclVudXNlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVJblVzZSAtPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNJblVzZS0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgdHJhbnNmZXIgaXMgaW5pdGlhdGVkLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlclNlbnQoKSB7CisgICAgICAgICAgICAgICAgbVRvdGFsVHJhbnNmZXJzKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBmZXRjaCBpcyBpbnZva2VkIGJ5IGEgYnVmZmVyIHRyYW5zZmVyLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckZldGNoZWQoKSB7CisgICAgICAgICAgICAgICAgbVRvdGFsRmV0Y2hlcysrOworICAgICAgICAgICAgfQorICAgICAgICB9IG1TdGF0czsKKworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqIENyZWF0ZXMgYSBidWZmZXIgcG9vbC4gKi8KKyAgICAgICAgQnVmZmVyUG9vbCgpOworCisgICAgICAgIC8qKiBEZXN0cm95cyBhIGJ1ZmZlciBwb29sLiAqLworICAgICAgICB+QnVmZmVyUG9vbCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcm9jZXNzZXMgYWxsIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcywgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKyAgICAgICAgICogRWFjaCBzdGF0dXMgbWVzc2FnZSBpcyBoYW5kbGVkIGJ5IG1ldGhvZHMgd2l0aCAnaGFuZGxlJyBwcmVmaXguCisgICAgICAgICAqLworICAgICAgICB2b2lkIHByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgYnVmZmVyIGJlaW5nIG93bmVkIGJ5IGEgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHRoZSBidWZmZXIgb3duaW5nIGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIHRoZSBpZCBvZiB0aGUgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBidWZmZXIgaXMgb3duZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZU93bkJ1ZmZlcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSBidWZmZXIgYmVpbmcgcmVsZWFzZWQgYnkgYSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciBvd25pbmcgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGJ1ZmZlciBvd25lcnNoaXAgaXMgcmVsZWFzZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVJlbGVhc2VCdWZmZXIoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gc3RhcnQgbWVzc2FnZSBmcm9tIHRoZSBzZW5kZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlICAgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0cmFuc2Zlcl90byBtZXNzYWdlIGlzIGFja25vd2xlZGdlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlVHJhbnNmZXJUbyhjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGJlaW5nIGFja2VkIGJ5IHRoZSByZWNlaXZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgICBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRyYW5zZmVyX2Zyb20gbWVzc2FnZSBpcyBhY2tub3dsZWRnZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVRyYW5zZmVyRnJvbShjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHJlc3VsdCBtZXNzYWdlIGZyb20gdGhlIHJlY2VpdmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGV4aXNpdG5nIHRyYW5zYWN0aW9uIGlzIGZpbmlzaGVkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVUcmFuc2ZlclJlc3VsdChjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIGNvbm5lY3Rpb24gYmVpbmcgY2xvc2VkLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LiBBbGwgdGhlCisgICAgICAgICAqIGJ1ZmZlcnMgYW5kIHRyYW5zYWN0aW9ucyBvd25lZCBieSB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIGNsZWFuZWQgdXAuCisgICAgICAgICAqIFRoZSByZWxhdGVkIEZNUSB3aWxsIGJlIGNsZWFuZWQgdXAgdG9vLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGNvbm5lY3Rpb24gZXhpc3RlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlQ2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlY3ljbGVzIGEgZXhpc3RpbmcgZnJlZSBidWZmZXIgaWYgaXQgaXMgcG9zc2libGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbGxvY2F0b3IgdGhlIGJ1ZmZlciBhbGxvY2F0b3IKKyAgICAgICAgICogQHBhcmFtIHBhcmFtcyAgICB0aGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAgICAgKiBAcGFyYW0gcElkICAgICAgIHRoZSBpZCBvZiB0aGUgcmVjeWNsZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSByZWN5Y2xlZCBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gYSBidWZmZXIgaXMgcmVjeWNsZWQsIHtAY29kZSBmYWxzZX0KKyAgICAgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGdldEZyZWVCdWZmZXIoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICBCdWZmZXJJZCAqcElkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciB0byBidWZmZXJwb29sLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYWxsb2MgICAgIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gYWxsb2NTaXplIHRoZSBzaXplIG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gcGFyYW1zICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgICAqIEBwYXJhbSBwSWQgICAgICAgdGhlIGJ1ZmZlciBpZCBmb3IgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGUgICAgdGhlIG5hdGl2ZSBoYW5kbGUgZm9yIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYW4gYWxsb2NhdGlvbiBpcyBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkLgorICAgICAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBSZXN1bHRTdGF0dXMgYWRkTmV3QnVmZmVyKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY1NpemUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICBCdWZmZXJJZCAqcElkLAorICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIHBlcmZvcm1zIHBlcmlvZGljIGNhY2hlCisgICAgICAgICAqIGNsZWFuaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2xlYXJDYWNoZSAgICBpZiBjbGVhckNhY2hlIGlzIHRydWUsIGl0IGZyZWVzIGFsbCBidWZmZXJzCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdhaXRpbmcgdG8gYmUgcmVjeWNsZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlID0gZmFsc2UpOworCisgICAgICAgIGZyaWVuZCBjbGFzcyBBY2Nlc3Nvcjo6SW1wbDsKKyAgICB9IG1CdWZmZXJQb29sOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIHVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQUNDRVNTT1JJTVBMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FuZHJvaWQuYnAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZWE3MGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjkgQEAKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDEuMCIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJBY2Nlc3Nvci5jcHAiLAorICAgICAgICAiQWNjZXNzb3JJbXBsLmNwcCIsCisgICAgICAgICJCdWZmZXJQb29sQ2xpZW50LmNwcCIsCisgICAgICAgICJCdWZmZXJTdGF0dXMuY3BwIiwKKyAgICAgICAgIkNsaWVudE1hbmFnZXIuY3BwIiwKKyAgICAgICAgIkNvbm5lY3Rpb24uY3BwIiwKKyAgICBdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDEuMCIsCisgICAgXSwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDEuMCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclBvb2xDbGllbnQuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyUG9vbENsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE1MjBjYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclBvb2xDbGllbnQuY3BwCkBAIC0wLDAgKzEsNzA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQ2xpZW50IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xDbGllbnQuaCIKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtSZWNlaXZlVGltZW91dFVzID0gMTAwMDAwMDsgLy8gMTAwbXMKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtQb3N0TWF4UmV0cnkgPSAzOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0NhY2hlVHRsVXMgPSAxMDAwMDAwOyAvLyBUT0RPOiB0dW5lCisKK2NsYXNzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGwKKyAgICAgICAgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW1wbChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKTsKKworICAgIGV4cGxpY2l0IEltcGwoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgYm9vbCBpc1ZhbGlkKCkgeworICAgICAgICByZXR1cm4gbVZhbGlkOworICAgIH0KKworICAgIGJvb2wgaXNMb2NhbCgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWxpZCAmJiBtTG9jYWw7CisgICAgfQorCisgICAgQ29ubmVjdGlvbklkIGdldENvbm5lY3Rpb25JZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db25uZWN0aW9uSWQ7CisgICAgfQorCisgICAgc3A8SUFjY2Vzc29yPiAmZ2V0QWNjZXNzb3IoKSB7CisgICAgICAgIHJldHVybiBtQWNjZXNzb3I7CisgICAgfQorCisgICAgYm9vbCBpc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZSgKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgdm9pZCBwb3N0QnVmZmVyUmVsZWFzZShCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICBib29sIHBvc3RTZW5kKAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIENvbm5lY3Rpb25JZCByZWNlaXZlciwKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKK3ByaXZhdGU6CisKKyAgICBib29sIHBvc3RSZWNlaXZlKAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMpOworCisgICAgYm9vbCBwb3N0UmVjZWl2ZVJlc3VsdCgKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIGJvb2wgcmVzdWx0LCBib29sICpuZWVkc1N5bmMpOworCisgICAgdm9pZCB0cnlTeW5jRnJvbVJlbW90ZSgpOworCisgICAgYm9vbCBzeW5jUmVsZWFzZWQoKTsKKworICAgIHZvaWQgZXZpY3RDYWNoZXMoYm9vbCBjbGVhckNhY2hlID0gZmFsc2UpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlQnVmZmVySGFuZGxlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgIFJlc3VsdFN0YXR1cyBmZXRjaEJ1ZmZlckhhbmRsZSgKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgc3RydWN0IEJsb2NrUG9vbERhdGFEdG9yOworICAgIHN0cnVjdCBDbGllbnRCdWZmZXI7CisKKyAgICBib29sIG1Mb2NhbDsKKyAgICBib29sIG1WYWxpZDsKKyAgICBzcDxJQWNjZXNzb3I+IG1BY2Nlc3NvcjsKKyAgICBzcDxDb25uZWN0aW9uPiBtTG9jYWxDb25uZWN0aW9uOworICAgIHNwPElDb25uZWN0aW9uPiBtUmVtb3RlQ29ubmVjdGlvbjsKKyAgICB1aW50MzJfdCBtU2VxSWQ7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgICAgaW50NjRfdCBtTGFzdEV2aWN0Q2FjaGVVczsKKworICAgIC8vIENhY2hlZEJ1ZmZlcnMKKyAgICBzdHJ1Y3QgQnVmZmVyQ2FjaGUgeworICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBib29sIG1DcmVhdGluZzsKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNyZWF0ZUN2OworICAgICAgICBzdGQ6Om1hcDxCdWZmZXJJZCwgc3RkOjp1bmlxdWVfcHRyPENsaWVudEJ1ZmZlcj4+IG1CdWZmZXJzOworICAgICAgICBpbnQgbUFjdGl2ZTsKKyAgICAgICAgaW50NjRfdCBtTGFzdENoYW5nZVVzOworCisgICAgICAgIEJ1ZmZlckNhY2hlKCkgOiBtQ3JlYXRpbmcoZmFsc2UpLCBtQWN0aXZlKDApLCBtTGFzdENoYW5nZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7fQorCisgICAgICAgIHZvaWQgaW5jQWN0aXZlX2woKSB7CisgICAgICAgICAgICArK21BY3RpdmU7CisgICAgICAgICAgICBtTGFzdENoYW5nZVVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGRlY0FjdGl2ZV9sKCkgeworICAgICAgICAgICAgLS1tQWN0aXZlOworICAgICAgICAgICAgbUxhc3RDaGFuZ2VVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICB9CisgICAgfSBtQ2FjaGU7CisKKyAgICAvLyBGTVEgLSByZWxlYXNlIG5vdGlmaWVyCisgICAgc3RydWN0IHsKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgLy8gVE9ETzogdXNlIG9ubHkgb25lIGxpc3Q/KHVzaW5nIG9uZSBsaXN0IG1heSBkZWFseSBzZW5kaW5nIG1lc3NhZ2VzPykKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiBtUmVsZWFzaW5nSWRzOworICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+IG1SZWxlYXNlZElkczsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c0NoYW5uZWw+IG1TdGF0dXNDaGFubmVsOworICAgIH0gbVJlbGVhc2luZzsKKworICAgIC8vIFRoaXMgbG9jayBpcyBoZWxkIGR1cmluZyBzeW5jaHJvbml6YXRpb24gZnJvbSByZW1vdGUgc2lkZS4KKyAgICAvLyBJbiBvcmRlciB0byBtaW5pbWl6ZSByZW1vdGUgY2FsbHMgYW5kIGxvY2tpbmcgZHVydGFpb24sIHRoaXMgbG9jayBpcyBoZWxkCisgICAgLy8gYnkgYmVzdCBlZmZvcnQgYXBwcm9hY2ggdXNpbmcgdHJ5X2xvY2soKS4KKyAgICBzdGQ6Om11dGV4IG1SZW1vdGVTeW5jTG9jazsKK307CisKK3N0cnVjdCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpCbG9ja1Bvb2xEYXRhRHRvciB7CisgICAgQmxvY2tQb29sRGF0YUR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+ICZpbXBsKQorICAgICAgICAgICAgOiBtSW1wbChpbXBsKSB7fQorCisgICAgdm9pZCBvcGVyYXRvcigpKEJ1ZmZlclBvb2xEYXRhICpidWZmZXIpIHsKKyAgICAgICAgQnVmZmVySWQgaWQgPSBidWZmZXItPm1JZDsKKyAgICAgICAgZGVsZXRlIGJ1ZmZlcjsKKworICAgICAgICBhdXRvIGltcGwgPSBtSW1wbC5sb2NrKCk7CisgICAgICAgIGlmIChpbXBsICYmIGltcGwtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgaW1wbC0+cG9zdEJ1ZmZlclJlbGVhc2UoaWQpOworICAgICAgICB9CisgICAgfQorICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gbUltcGw7Cit9OworCitzdHJ1Y3QgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6Q2xpZW50QnVmZmVyIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtSW52YWxpZGF0ZWQ7IC8vIFRPRE86IGltcGxlbWVudAorICAgIGludDY0X3QgbUV4cGlyZVVzOworICAgIGJvb2wgbUhhc0NhY2hlOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICAgIEJ1ZmZlcklkIG1JZDsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKm1IYW5kbGU7CisgICAgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sRGF0YT4gbUNhY2hlOworCisgICAgdm9pZCB1cGRhdGVFeHBpcmUoKSB7CisgICAgICAgIG1FeHBpcmVVcyA9IGdldFRpbWVzdGFtcE5vdygpICsga0NhY2hlVHRsVXM7CisgICAgfQorCitwdWJsaWM6CisgICAgQ2xpZW50QnVmZmVyKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgaWQsIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKQorICAgICAgICAgICAgOiBtSW52YWxpZGF0ZWQoZmFsc2UpLCBtSGFzQ2FjaGUoZmFsc2UpLAorICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkKGNvbm5lY3Rpb25JZCksIG1JZChpZCksIG1IYW5kbGUoaGFuZGxlKSB7CisgICAgICAgICh2b2lkKW1JbnZhbGlkYXRlZDsKKyAgICAgICAgbUV4cGlyZVVzID0gZ2V0VGltZXN0YW1wTm93KCkgKyBrQ2FjaGVUdGxVczsKKyAgICB9CisKKyAgICB+Q2xpZW50QnVmZmVyKCkgeworICAgICAgICBpZiAobUhhbmRsZSkgeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShtSGFuZGxlKTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG1IYW5kbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBleHBpcmUoKSBjb25zdCB7CisgICAgICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIHJldHVybiBub3cgPj0gbUV4cGlyZVVzOworICAgIH0KKworICAgIGJvb2wgaGFzQ2FjaGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSGFzQ2FjaGU7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBmZXRjaENhY2hlKG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUpIHsKKyAgICAgICAgaWYgKG1IYXNDYWNoZSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBjYWNoZSA9IG1DYWNoZS5sb2NrKCk7CisgICAgICAgICAgICBpZiAoY2FjaGUpIHsKKyAgICAgICAgICAgICAgICAqcEhhbmRsZSA9IG1IYW5kbGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2FjaGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBjcmVhdGVDYWNoZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiAmaW1wbCwKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUpIHsKKyAgICAgICAgaWYgKCFtSGFzQ2FjaGUpIHsKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlcyBhIHJhdyBwdHIgaW4gb3JkZXIgdG8gYXZvaWQgc2VuZGluZyAjcG9zdEJ1ZmZlclJlbGVhc2UKKyAgICAgICAgICAgIC8vIGZyb20gZGVsZXRlciwgaW4gY2FzZSBvZiBuYXRpdmVfaGFuZGxlX2Nsb25lIGZhaWx1cmUuCisgICAgICAgICAgICBCdWZmZXJQb29sRGF0YSAqcHRyID0gbmV3IEJ1ZmZlclBvb2xEYXRhKG1Db25uZWN0aW9uSWQsIG1JZCk7CisgICAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBjYWNoZShwdHIsIEJsb2NrUG9vbERhdGFEdG9yKGltcGwpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FjaGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhY2hlID0gY2FjaGU7CisgICAgICAgICAgICAgICAgICAgIG1IYXNDYWNoZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICpwSGFuZGxlID0gbUhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICAgICBkZWxldGUgcHRyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGJvb2wgb25DYWNoZVJlbGVhc2UoKSB7CisgICAgICAgIGlmIChtSGFzQ2FjaGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSBtQ2FjaGUgaXMgbm90IHZhbGlkOworICAgICAgICAgICAgdXBkYXRlRXhwaXJlKCk7CisgICAgICAgICAgICBtSGFzQ2FjaGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9OworCitCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpJbXBsKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpCisgICAgOiBtTG9jYWwodHJ1ZSksIG1WYWxpZChmYWxzZSksIG1BY2Nlc3NvcihhY2Nlc3NvciksIG1TZXFJZCgwKSwKKyAgICAgIG1MYXN0RXZpY3RDYWNoZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7CisgICAgY29uc3QgUXVldWVEZXNjcmlwdG9yICpmbXFEZXNjOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBhY2Nlc3Nvci0+Y29ubmVjdCgKKyAgICAgICAgICAgICZtTG9jYWxDb25uZWN0aW9uLCAmbUNvbm5lY3Rpb25JZCwgJmZtcURlc2MsIHRydWUpOworICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c0NoYW5uZWw+KCpmbXFEZXNjKTsKKyAgICAgICAgbVZhbGlkID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbCAmJgorICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPmlzVmFsaWQoKTsKKyAgICB9Cit9CisKK0J1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkltcGwoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IpCisgICAgOiBtTG9jYWwoZmFsc2UpLCBtVmFsaWQoZmFsc2UpLCBtQWNjZXNzb3IoYWNjZXNzb3IpLCBtU2VxSWQoMCksCisgICAgICBtTGFzdEV2aWN0Q2FjaGVVcyhnZXRUaW1lc3RhbXBOb3coKSkgeworICAgIGJvb2wgdmFsaWQgPSBmYWxzZTsKKyAgICBzcDxJQ29ubmVjdGlvbj4mIG91dENvbm5lY3Rpb24gPSBtUmVtb3RlQ29ubmVjdGlvbjsKKyAgICBDb25uZWN0aW9uSWQmIGlkID0gbUNvbm5lY3Rpb25JZDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzQ2hhbm5lbD4mIG91dENoYW5uZWwgPQorICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbDsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBhY2Nlc3Nvci0+Y29ubmVjdCgKKyAgICAgICAgICAgIFsmdmFsaWQsICZvdXRDb25uZWN0aW9uLCAmaWQsICZvdXRDaGFubmVsXQorICAgICAgICAgICAgKFJlc3VsdFN0YXR1cyBzdGF0dXMsIHNwPElDb25uZWN0aW9uPiBjb25uZWN0aW9uLAorICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IFF1ZXVlRGVzY3JpcHRvciYgZGVzYykgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBvdXRDb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgaWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgICAgIG91dENoYW5uZWwgPSBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c0NoYW5uZWw+KGRlc2MpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0Q2hhbm5lbCAmJiBvdXRDaGFubmVsLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIG1WYWxpZCA9IHRyYW5zUmVzdWx0LmlzT2soKSAmJiB2YWxpZDsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjppc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKSB7CisgICAgYm9vbCBhY3RpdmUgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICBldmljdENhY2hlcyhjbGVhckNhY2hlKTsKKyAgICAgICAgKmxhc3RUcmFuc2FjdGlvblVzID0gbUNhY2hlLm1MYXN0Q2hhbmdlVXM7CisgICAgICAgIGFjdGl2ZSA9IG1DYWNoZS5tQWN0aXZlID4gMDsKKyAgICB9CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGNsZWFyQ2FjaGUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGFjdGl2ZTsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoIW1Mb2NhbCB8fCAhbUxvY2FsQ29ubmVjdGlvbiB8fCAhbVZhbGlkKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBCdWZmZXJJZCBidWZmZXJJZDsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG51bGxwdHI7CisgICAgYnVmZmVyLT5yZXNldCgpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBhbGxvY2F0ZUJ1ZmZlckhhbmRsZShwYXJhbXMsICZidWZmZXJJZCwgJmhhbmRsZSk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgICAgICBldmljdENhY2hlcygpOworICAgICAgICAgICAgYXV0byBjYWNoZUl0ID0gbUNhY2hlLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKGNhY2hlSXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogdmVyaWZ5IGl0IGlzIHJlY3ljbGVkLiAobm90IGhhdmluZyBhY3RpdmUgcmVmKQorICAgICAgICAgICAgICAgIG1DYWNoZS5tQnVmZmVycy5lcmFzZShjYWNoZUl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gY2xpZW50QnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTxDbGllbnRCdWZmZXI+KAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChjbGllbnRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IG1DYWNoZS5tQnVmZmVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJZCwgc3RkOjptb3ZlKGNsaWVudEJ1ZmZlcikpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnNlY29uZCkgeworICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gcmVzdWx0LmZpcnN0LT5zZWNvbmQtPmNyZWF0ZUNhY2hlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSwgcEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuaW5jQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoISpidWZmZXIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgY2FjaGUgY3JlYXRpb24gZmFpbHVyZSAlZDogJWxsZCIsCisgICAgICAgICAgICAgICAgICBoYW5kbGUgIT0gbnVsbHB0ciwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgcG9zdEJ1ZmZlclJlbGVhc2UoYnVmZmVySWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpyZWNlaXZlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoIW1WYWxpZCkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgaWYgKHRpbWVzdGFtcFVzICE9IDApIHsKKyAgICAgICAgdGltZXN0YW1wVXMgKz0ga1JlY2VpdmVUaW1lb3V0VXM7CisgICAgfQorICAgIGlmICghcG9zdFJlY2VpdmUoYnVmZmVySWQsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgYnVmZmVyLT5yZXNldCgpOworICAgIHdoaWxlKDEpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICBldmljdENhY2hlcygpOworICAgICAgICBhdXRvIGNhY2hlSXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgIGlmIChjYWNoZUl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgaWYgKGNhY2hlSXQtPnNlY29uZC0+aGFzQ2FjaGUoKSkgeworICAgICAgICAgICAgICAgICpidWZmZXIgPSBjYWNoZUl0LT5zZWNvbmQtPmZldGNoQ2FjaGUocEhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKCEqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRyYW5zZmVyIHRpbWVfb3V0CisgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiY2xpZW50IHJlY2VpdmUgZnJvbSByZWZlcmVuY2UgJWxsZCIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpidWZmZXIgPSBjYWNoZUl0LT5zZWNvbmQtPmNyZWF0ZUNhY2hlKHNoYXJlZF9mcm9tX3RoaXMoKSwgcEhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmluY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSBmcm9tIGNhY2hlICVsbGQiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFtQ2FjaGUubUNyZWF0aW5nKSB7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZmV0Y2hCdWZmZXJIYW5kbGUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsICZoYW5kbGUpOworICAgICAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGNsaWVudEJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q2xpZW50QnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSBtQ2FjaGUubUJ1ZmZlcnMuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoYnVmZmVySWQsIHN0ZDo6bW92ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50QnVmZmVyKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSByZXN1bHQuZmlyc3QtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5pbmNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGVDdi5ub3RpZnlfYWxsKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FjaGUubUNyZWF0ZUN2LndhaXQobG9jayk7CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBuZWVkc1N5bmMgPSBmYWxzZTsKKyAgICBib29sIHBvc3RlZCA9IHBvc3RSZWNlaXZlUmVzdWx0KGJ1ZmZlcklkLCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID8gdHJ1ZSA6IGZhbHNlLCAmbmVlZHNTeW5jKTsKKyAgICBBTE9HVigiY2xpZW50IHJlY2VpdmUgJWxsZCAtICV1IDogJXMgKCVkKSIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgKmJ1ZmZlciA/ICJvayIgOiAiZmFpbCIsIHBvc3RlZCk7CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGZhbHNlKTsKKyAgICB9CisgICAgaWYgKG5lZWRzU3luYyAmJiBtUmVtb3RlQ29ubmVjdGlvbikgeworICAgICAgICB0cnlTeW5jRnJvbVJlbW90ZSgpOworICAgIH0KKyAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICBpZiAoIXBvc3RlZCkgeworICAgICAgICAgICAgYnVmZmVyLT5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKwordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0QnVmZmVyUmVsZWFzZShCdWZmZXJJZCBidWZmZXJJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcy5wdXNoX2JhY2soYnVmZmVySWQpOworICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLCBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7Cit9CisKKy8vIFRPRE86IHJldmlzZSBhZC1ob2MgcG9zdGluZyBkYXRhIHN0cnVjdHVyZQorYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0U2VuZCgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIENvbm5lY3Rpb25JZCByZWNlaXZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCAqdGltZXN0YW1wVXMpIHsKKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIGJvb2wgbmVlZHNTeW5jID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgKnRpbWVzdGFtcFVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgICp0cmFuc2FjdGlvbklkID0gKG1Db25uZWN0aW9uSWQgPDwgMzIpIHwgbVNlcUlkKys7CisgICAgICAgIC8vIFRPRE86IHJldHJ5LCBhZGQgdGltZW91dCwgdGFyZ2V0PworICAgICAgICByZXQgPSAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RPLCBtQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgIHJlY2VpdmVyLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgbmVlZHNTeW5jID0gIW1Mb2NhbCAmJiBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5uZWVkc1N5bmMoKTsKKyAgICB9CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGZhbHNlKTsKKyAgICB9CisgICAgaWYgKG5lZWRzU3luYyAmJiBtUmVtb3RlQ29ubmVjdGlvbikgeworICAgICAgICB0cnlTeW5jRnJvbVJlbW90ZSgpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RSZWNlaXZlKAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrUG9zdE1heFJldHJ5OyArK2kpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICBpZiAodGltZXN0YW1wVXMgPT0gMCB8fCBub3cgPCB0aW1lc3RhbXBVcykgeworICAgICAgICAgICAgYm9vbCByZXN1bHQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTSwKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgLTEsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgLTEsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0UmVjZWl2ZVJlc3VsdCgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgYm9vbCByZXN1bHQsIGJvb2wgKm5lZWRzU3luYykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgIC8vIFRPRE86IHJldHJ5LCBhZGQgdGltZW91dAorICAgIGJvb2wgcmV0ID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgIHJlc3VsdCA/IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0sgOiBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0VSUk9SLAorICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgLTEsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAqbmVlZHNTeW5jID0gIW1Mb2NhbCAmJiBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5uZWVkc1N5bmMoKTsKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnRyeVN5bmNGcm9tUmVtb3RlKCkgeworICAgIGlmIChtUmVtb3RlU3luY0xvY2sudHJ5X2xvY2soKSkgeworICAgICAgICBib29sIG5lZWRzU3luYyA9IGZhbHNlOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgICAgIG5lZWRzU3luYyA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPm5lZWRzU3luYygpOworICAgICAgICB9CisgICAgICAgIGlmIChuZWVkc1N5bmMpIHsKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCA9IChtQ29ubmVjdGlvbklkIDw8IDMyKTsKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gQ29ubmVjdGlvbjo6U1lOQ19CVUZGRVJJRDsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IG1SZW1vdGVDb25uZWN0aW9uLT5mZXRjaCgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgIFtdCisgICAgICAgICAgICAgICAgICAgIChSZXN1bHRTdGF0dXMgb3V0U3RhdHVzLCBCdWZmZXIgb3V0QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgb3V0U3RhdHVzOworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIG91dEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgbVJlbW90ZVN5bmNMb2NrLnVubG9jaygpOworICAgIH0KK30KKworLy8gc2hvdWxkIGhhdmUgbUNhY2hlLm1Mb2NrCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnN5bmNSZWxlYXNlZCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICBpZiAobVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclJlbGVhc2UoCisgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICB9CisgICAgaWYgKG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgZm9yIChCdWZmZXJJZCYgaWQ6IG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKSB7CisgICAgICAgICAgICBBTE9HVigiY2xpZW50IHJlbGVhc2UgYnVmZmVyICVsbGQgLSAldSIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgaWQpOworICAgICAgICAgICAgYXV0byBmb3VuZCA9IG1DYWNoZS5tQnVmZmVycy5maW5kKGlkKTsKKyAgICAgICAgICAgIGlmIChmb3VuZCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZm91bmQtPnNlY29uZC0+b25DYWNoZVJlbGVhc2UoKSkgeworICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuZGVjQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbiEKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImNsaWVudCAlbGxkIGNhY2hlIHJlbGVhc2Ugc3RhdHVzIGluY29uc2l0ZW50ISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbiEKKyAgICAgICAgICAgICAgICBBTE9HVygiY2xpZW50ICVsbGQgY2FjaGUgc3RhdHVzIGluY29uc2l0ZW50ISIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gc2hvdWxkIGhhdmUgbUNhY2hlLm1Mb2NrCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmV2aWN0Q2FjaGVzKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgaWYgKG5vdyA+PSBtTGFzdEV2aWN0Q2FjaGVVcyArIGtDYWNoZVR0bFVzIHx8IGNsZWFyQ2FjaGUpIHsKKyAgICAgICAgc2l6ZV90IGV2aWN0ZWQgPSAwOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpOykgeworICAgICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5oYXNDYWNoZSgpICYmIChpdC0+c2Vjb25kLT5leHBpcmUoKSB8fCBjbGVhckNhY2hlKSkgeworICAgICAgICAgICAgICAgIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICArK2V2aWN0ZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImNhY2hlIGNvdW50ICVsbGQgOiB0b3RhbCAlenUsIGFjdGl2ZSAlZCwgZXZpY3RlZCAlenUiLAorICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIG1DYWNoZS5tQnVmZmVycy5zaXplKCksIG1DYWNoZS5tQWN0aXZlLCBldmljdGVkKTsKKyAgICAgICAgbUxhc3RFdmljdENhY2hlVXMgPSBub3c7CisgICAgfQorfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6YWxsb2NhdGVCdWZmZXJIYW5kbGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgaWYgKG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiBhbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtTG9jYWxDb25uZWN0aW9uLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICBwYXJhbXMsIGJ1ZmZlcklkLCAmYWxsb2NIYW5kbGUpOworICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKGFsbG9jSGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY2xpZW50IGFsbG9jYXRlIHJlc3VsdCAlbGxkICVkIDogJXUgY2xvbmUgJXAiLAorICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LLAorICAgICAgICAgICAgICAqaGFuZGxlID8gKmJ1ZmZlcklkIDogMCAsICpoYW5kbGUpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmZldGNoQnVmZmVySGFuZGxlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpIHsKKyAgICBzcDxJQ29ubmVjdGlvbj4gY29ubmVjdGlvbjsKKyAgICBpZiAobUxvY2FsKSB7CisgICAgICAgIGNvbm5lY3Rpb24gPSBtTG9jYWxDb25uZWN0aW9uOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbm5lY3Rpb24gPSBtUmVtb3RlQ29ubmVjdGlvbjsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBjb25uZWN0aW9uLT5mZXRjaCgKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgWyZzdGF0dXMsICZoYW5kbGVdCisgICAgICAgICAgICAoUmVzdWx0U3RhdHVzIG91dFN0YXR1cywgQnVmZmVyIG91dEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IG91dFN0YXR1czsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLmJ1ZmZlci5nZXROYXRpdmVIYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHRyYW5zUmVzdWx0LmlzT2soKSA/IHN0YXR1cyA6IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKKworQnVmZmVyUG9vbENsaWVudDo6QnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKSB7CisgICAgbUltcGwgPSBzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGFjY2Vzc29yKTsKK30KKworQnVmZmVyUG9vbENsaWVudDo6QnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvcikgeworICAgIG1JbXBsID0gc3RkOjptYWtlX3NoYXJlZDxJbXBsPihhY2Nlc3Nvcik7Cit9CisKK0J1ZmZlclBvb2xDbGllbnQ6On5CdWZmZXJQb29sQ2xpZW50KCkgeworICAgIC8vIFRPRE86IGhvdyB0byBoYW5kbGUgb3JwaGFuZWQgYnVmZmVycz8KK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50Ojppc1ZhbGlkKCkgeworICAgIHJldHVybiBtSW1wbCAmJiBtSW1wbC0+aXNWYWxpZCgpOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OmlzTG9jYWwoKSB7CisgICAgcmV0dXJuIG1JbXBsICYmIG1JbXBsLT5pc0xvY2FsKCk7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6aXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGlmICghaXNWYWxpZCgpKSB7CisgICAgICAgICpsYXN0VHJhbnNhY3Rpb25VcyA9IDA7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIG1JbXBsLT5pc0FjdGl2ZShsYXN0VHJhbnNhY3Rpb25VcywgY2xlYXJDYWNoZSk7Cit9CisKK0Nvbm5lY3Rpb25JZCBCdWZmZXJQb29sQ2xpZW50OjpnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPmdldENvbm5lY3Rpb25JZCgpOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpnZXRBY2Nlc3NvcihzcDxJQWNjZXNzb3I+ICphY2Nlc3NvcikgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgKmFjY2Vzc29yID0gbUltcGwtPmdldEFjY2Vzc29yKCk7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShwYXJhbXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpyZWNlaXZlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5yZWNlaXZlKHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCB0aW1lc3RhbXBVcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OnBvc3RTZW5kKAorICAgICAgICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcykgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgYm9vbCByZXN1bHQgPSBtSW1wbC0+cG9zdFNlbmQoCisgICAgICAgICAgICAgICAgYnVmZmVyLT5tSWQsIHJlY2VpdmVySWQsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdCA/IFJlc3VsdFN0YXR1czo6T0sgOiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyUG9vbENsaWVudC5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyUG9vbENsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3N2VmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJQb29sQ2xpZW50LmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlBPT0xDTElFTlRfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJQT09MQ0xJRU5UX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0lBY2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUNvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUFjY2Vzc29yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDb25uZWN0aW9uOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKKy8qKgorICogQSBidWZmZXIgcG9vbCBjbGllbnQgZm9yIGEgYnVmZmVyIHBvb2wuIEZvciBhIHNwZWNpZmljIGJ1ZmZlciBwb29sLCBhdCBtb3N0CisgKiBvbmUgYnVmZmVyIHBvb2wgY2xpZW50IGV4aXN0cyBwZXIgcHJvY2Vzcy4gVGhpcyBjbGFzcyB3aWxsIG5vdCBiZSBleHBvc2VkCisgKiBvdXRzaWRlLiBBIGJ1ZmZlciBwb29sIGNsaWVudCB3aWxsIGJlIHVzZWQgdmlhIENsaWVudE1hbmFnZXIuCisgKi8KK2NsYXNzIEJ1ZmZlclBvb2xDbGllbnQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgcG9vbCBjbGllbnQgZnJvbSBhIGxvY2FsIGJ1ZmZlciBwb29sCisgICAgICogKHZpYSBDbGllbnRNYW5hZ2VyI2NyZWF0ZSkuCisgICAgICovCisgICAgZXhwbGljaXQgQnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgcG9vbCBjbGllbnQgZnJvbSBhIHJlbW90ZSBidWZmZXIgcG9vbAorICAgICAqICh2aWEgQ2xpZW50TWFuYWdlciNyZWdpc3RlclNlbmRlcikuCisgICAgICogTm90ZTogQSBidWZmZXIgcG9vbCBjbGllbnQgY3JlYXRlZCB3aXRoIHJlbW90ZSBidWZmZXIgcG9vbCBjYW5ub3QKKyAgICAgKiBhbGxvY2F0ZSBhIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yKTsKKworICAgIC8qKiBEZXN0cnVjdHMgYSBidWZmZXIgcG9vbCBjbGllbnQuICovCisgICAgfkJ1ZmZlclBvb2xDbGllbnQoKTsKKworcHJpdmF0ZToKKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIGJvb2wgaXNMb2NhbCgpOworCisgICAgYm9vbCBpc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKTsKKworICAgIENvbm5lY3Rpb25JZCBnZXRDb25uZWN0aW9uSWQoKTsKKworICAgIFJlc3VsdFN0YXR1cyBnZXRBY2Nlc3NvcihzcDxJQWNjZXNzb3I+ICphY2Nlc3Nvcik7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcG9zdFNlbmQoQ29ubmVjdGlvbklkIHJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKKworICAgIGNsYXNzIEltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworCisgICAgZnJpZW5kIHN0cnVjdCBDbGllbnRNYW5hZ2VyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlBPT0xDTElFTlRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyU3RhdHVzLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclN0YXR1cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY5YWJjZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclN0YXR1cy5jcHAKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xTdGF0dXMiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAiQnVmZmVyU3RhdHVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworaW50NjRfdCBnZXRUaW1lc3RhbXBOb3coKSB7CisgICAgaW50NjRfdCBzdGFtcDsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgICAgLy8gVE9ETzogQ0xPQ0tfTU9OT1RPTklDX0NPQVJTRT8KKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKTsKKyAgICBzdGFtcCA9IHRzLnR2X25zZWMgLyAxMDAwOworICAgIHN0YW1wICs9ICh0cy50dl9zZWMgKiAxMDAwMDAwTEwpOworICAgIHJldHVybiBzdGFtcDsKK30KKworc3RhdGljIGNvbnN0ZXhwciBpbnQga051bUVsZW1lbnRzSW5RdWV1ZSA9IDEwMjQqMTY7CitzdGF0aWMgY29uc3RleHByIGludCBrTWluRWxlbWVudHNUb1N5bmNJblF1ZXVlID0gMTI4OworCitSZXN1bHRTdGF0dXMgQnVmZmVyU3RhdHVzT2JzZXJ2ZXI6Om9wZW4oCisgICAgICAgIENvbm5lY3Rpb25JZCBpZCwgY29uc3QgUXVldWVEZXNjcmlwdG9yKiogZm1xRGVzY1B0cikgeworICAgIGlmIChtQnVmZmVyU3RhdHVzUXVldWVzLmZpbmQoaWQpICE9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuZW5kKCkpIHsKKyAgICAgICAgLy8gVE9ETzogaWQgY29sbGlzaW9uIGxvZz8KKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4gcXVldWUgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNRdWV1ZT4oa051bUVsZW1lbnRzSW5RdWV1ZSk7CisgICAgaWYgKCFxdWV1ZSB8fCBxdWV1ZS0+aXNWYWxpZCgpID09IGZhbHNlKSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgIH0gZWxzZSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gcXVldWUtPmdldERlc2MoKTsKKyAgICB9CisgICAgYXV0byByZXN1bHQgPSBtQnVmZmVyU3RhdHVzUXVldWVzLmluc2VydCgKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKGlkLCBzdGQ6Om1vdmUocXVldWUpKSk7CisgICAgaWYgKCFyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclN0YXR1c09ic2VydmVyOjpjbG9zZShDb25uZWN0aW9uSWQgaWQpIHsKKyAgICBpZiAobUJ1ZmZlclN0YXR1c1F1ZXVlcy5maW5kKGlkKSA9PSBtQnVmZmVyU3RhdHVzUXVldWVzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBtQnVmZmVyU3RhdHVzUXVldWVzLmVyYXNlKGlkKTsKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKK30KKwordm9pZCBCdWZmZXJTdGF0dXNPYnNlcnZlcjo6Z2V0QnVmZmVyU3RhdHVzQ2hhbmdlcyhzdGQ6OnZlY3RvcjxCdWZmZXJTdGF0dXNNZXNzYWdlPiAmbWVzc2FnZXMpIHsKKyAgICBmb3IgKGF1dG8gaXQgPSBtQnVmZmVyU3RhdHVzUXVldWVzLmJlZ2luKCk7IGl0ICE9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSBtZXNzYWdlOworICAgICAgICBzaXplX3QgYXZhaWwgPSBpdC0+c2Vjb25kLT5hdmFpbGFibGVUb1JlYWQoKTsKKyAgICAgICAgd2hpbGUgKGF2YWlsID4gMCkgeworICAgICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5yZWFkKCZtZXNzYWdlLCAxKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHJlYWRzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nIChzcHVyaW91cyBjbGllbnQ/KQorICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgcmVhZCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWl0LT5maXJzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBpdC0+Zmlyc3Q7CisgICAgICAgICAgICBtZXNzYWdlcy5wdXNoX2JhY2sobWVzc2FnZSk7CisgICAgICAgICAgICAtLWF2YWlsOworICAgICAgICB9CisgICAgfQorfQorCitCdWZmZXJTdGF0dXNDaGFubmVsOjpCdWZmZXJTdGF0dXNDaGFubmVsKAorICAgICAgICBjb25zdCBRdWV1ZURlc2NyaXB0b3IgJmZtcURlc2MpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzUXVldWU+IHF1ZXVlID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzUXVldWU+KGZtcURlc2MpOworICAgIGlmICghcXVldWUgfHwgcXVldWUtPmlzVmFsaWQoKSA9PSBmYWxzZSkgeworICAgICAgICBtVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtVmFsaWQgID0gdHJ1ZTsKKyAgICBtQnVmZmVyU3RhdHVzUXVldWUgPSBzdGQ6Om1vdmUocXVldWUpOworfQorCitib29sIEJ1ZmZlclN0YXR1c0NoYW5uZWw6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1WYWxpZDsKK30KKworYm9vbCBCdWZmZXJTdGF0dXNDaGFubmVsOjpuZWVkc1N5bmMoKSB7CisgICAgaWYgKG1WYWxpZCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgcmV0dXJuIGF2YWlsICsga01pbkVsZW1lbnRzVG9TeW5jSW5RdWV1ZSA8IGtOdW1FbGVtZW50c0luUXVldWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBCdWZmZXJTdGF0dXNDaGFubmVsOjpwb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcGVuZGluZywgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcG9zdGVkKSB7CisgICAgaWYgKG1WYWxpZCAmJiBwZW5kaW5nLnNpemUoKSA+IDApIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gbUJ1ZmZlclN0YXR1c1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIGF2YWlsID0gc3RkOjptaW4oYXZhaWwsIHBlbmRpbmcuc2l6ZSgpKTsKKyAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSBtZXNzYWdlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMCA7IGkgPCBhdmFpbDsgKytpKSB7CisgICAgICAgICAgICBCdWZmZXJJZCBpZCA9IHBlbmRpbmcuZnJvbnQoKTsKKyAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzID0gQnVmZmVyU3RhdHVzOjpOT1RfVVNFRDsKKyAgICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQgPSBpZDsKKyAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZtZXNzYWdlLCAxKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHdyaXRlcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kaW5nPworICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgc2VudCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGVuZGluZy5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIHBvc3RlZC5wdXNoX2JhY2soaWQpOworICAgICAgICB9CisgICAgfQorfQorCitib29sIEJ1ZmZlclN0YXR1c0NoYW5uZWw6OnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICBCdWZmZXJTdGF0dXMgc3RhdHVzLCBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBDb25uZWN0aW9uSWQgdGFyZ2V0SWQsCisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCkgeworICAgIGlmIChtVmFsaWQpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gbUJ1ZmZlclN0YXR1c1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIHNpemVfdCBudW1QZW5kaW5nID0gcGVuZGluZy5zaXplKCk7CisgICAgICAgIGlmIChhdmFpbCA+PSBudW1QZW5kaW5nICsgMSkgeworICAgICAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSByZWxlYXNlLCBtZXNzYWdlOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1QZW5kaW5nOyArK2kpIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJJZCBpZCA9IHBlbmRpbmcuZnJvbnQoKTsKKyAgICAgICAgICAgICAgICByZWxlYXNlLm5ld1N0YXR1cyA9IEJ1ZmZlclN0YXR1czo6Tk9UX1VTRUQ7CisgICAgICAgICAgICAgICAgcmVsZWFzZS5idWZmZXJJZCA9IGlkOworICAgICAgICAgICAgICAgIHJlbGVhc2UuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgICAgIGlmICghbUJ1ZmZlclN0YXR1c1F1ZXVlLT53cml0ZSgmcmVsZWFzZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmc/CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgc2VudCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGVuZGluZy5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBwb3N0ZWQucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkID0gYnVmZmVySWQ7CisgICAgICAgICAgICBtZXNzYWdlLm5ld1N0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgbWVzc2FnZS50YXJnZXRDb25uZWN0aW9uSWQgPSB0YXJnZXRJZDsKKyAgICAgICAgICAgIC8vIFRPRE8gOiB0aW1lc2F0YW1wCisgICAgICAgICAgICBtZXNzYWdlLnRpbWVzdGFtcFVzID0gMDsKKyAgICAgICAgICAgIGlmICghbUJ1ZmZlclN0YXR1c1F1ZXVlLT53cml0ZSgmbWVzc2FnZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiB3cml0ZXMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyU3RhdHVzLmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJTdGF0dXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMThhOTIxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyU3RhdHVzLmgKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlNUQVRVU19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlNUQVRVU19ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bGlzdD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCisvKiogUmV0dXJucyBtb25vdG9uaWMgdGltZXN0YW1wIGluIFVzIHNpbmNlIGZpeGVkIHBvaW50IGluIHRpbWUuICovCitpbnQ2NF90IGdldFRpbWVzdGFtcE5vdygpOworCisvKioKKyAqIEEgY29sbGVjdGlvbiBvZiBGTVEgZm9yIGEgYnVmZmVyIHBvb2wuIGJ1ZmZlciBvd25lcnNoaXAvc3RhdHVzIGNoYW5nZQorICogbWVzc2FnZXMgYXJlIHNlbnQgdmlhIHRoZSBGTVFzIGZyb20gdGhlIGNsaWVudHMuCisgKi8KK2NsYXNzIEJ1ZmZlclN0YXR1c09ic2VydmVyIHsKK3ByaXZhdGU6CisgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzUXVldWU+PgorICAgICAgICAgICAgbUJ1ZmZlclN0YXR1c1F1ZXVlczsKKworcHVibGljOgorICAgIC8qKiBDcmVhdGVzIGFuIEZNUSBmb3IgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uKGNsaWVudCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBzcGVjaWZpZWQgY2xpZW50LgorICAgICAqIEBwYXJhbSBmbXFEZXNjUHRyICAgIGRvdWJsZSBwdHIgb2YgY3JlYXRlZCBGTVEncyBkZXNjcmlwdG9yLgorICAgICAqCisgICAgICogQHJldHVybiBPSyBpZiBGTVEgaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIG9wZW4oQ29ubmVjdGlvbklkIGlkLCBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyKTsKKworICAgIC8qKiBDbG9zZXMgYW4gRk1RIGZvciB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24oY2xpZW50KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIHNwZWNpZmllZCBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIGlmIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiBpcyBjbG9zZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgaWQpOworCisgICAgLyoqIFJldHJpZXZlcyBhbGwgcGVuZGluZyBGTVEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBmcm9tIGNsaWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZXMgIHJldHJpZXZlZCBwZW5kaW5nIG1lc3NhZ2VzLgorICAgICAqLworICAgIHZvaWQgZ2V0QnVmZmVyU3RhdHVzQ2hhbmdlcyhzdGQ6OnZlY3RvcjxCdWZmZXJTdGF0dXNNZXNzYWdlPiAmbWVzc2FnZXMpOworfTsKKworLyoqCisgKiBBbiBGTVEgZm9yIGEgYnVmZmVyIHBvb2wgY2xpZW50LiBCdWZmZXIgb3duZXJzaGlwL3N0YXR1cyBjaGFuZ2UgbWVzc2FnZXMKKyAqIGFyZSBzZW50IHZpYSB0aGUgZm1xIHRvIHRoZSBidWZmZXIgcG9vbC4KKyAqLworY2xhc3MgQnVmZmVyU3RhdHVzQ2hhbm5lbCB7Citwcml2YXRlOgorICAgIGJvb2wgbVZhbGlkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4gbUJ1ZmZlclN0YXR1c1F1ZXVlOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29ubmVjdHMgdG8gYW4gRk1RIGZyb20gYSBkZXNjcmlwdG9yIG9mIHRoZSBjcmVhdGVkIEZNUS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbXFEZXNjICAgRGVzY3JpcHRvciBvZiB0aGUgY3JlYXRlZCBGTVEuCisgICAgICovCisgICAgQnVmZmVyU3RhdHVzQ2hhbm5lbChjb25zdCBRdWV1ZURlc2NyaXB0b3IgJmZtcURlc2MpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgRk1RIGlzIGNvbm5lY3RlZCBzdWNjZXNzZnVsbHkuICovCisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBGTVEgbmVlZHMgdG8gYmUgc3luY2VkIGZyb20gdGhlIGJ1ZmZlciBwb29sICovCisgICAgYm9vbCBuZWVkc1N5bmMoKTsKKworICAgIC8qKgorICAgICAqIFBvc3RzIGEgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZSB0byB0aGUgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHBlbmRpbmcgICAgICAgY3VycmVudGx5IHBlbmRpbmcgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICogQHBhcmFtIHBvc3RlZCAgICAgICAgcG9zdGVkIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2VzLgorICAgICAqLworICAgIHZvaWQgcG9zdEJ1ZmZlclJlbGVhc2UoCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcGVuZGluZywgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcG9zdGVkKTsKKworICAgIC8qKgorICAgICAqIFBvc3RzIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIHJlZ2FyZGluZyB0aGUgc3BlY2lmaWVkIGJ1ZmZlcgorICAgICAqIHRyYW5zZmVyIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgSWQgb2YgdGhlIHNwZWNpZmllZCB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICBidWZmZXIgSWQgb2YgdGhlIHNwZWNpZmllZCB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gc3RhdHVzICAgICAgICBuZXcgc3RhdHVzIG9mIHRoZSBidWZmZXIuCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSB0YXJnZXRJZCAgICAgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIHJlY2VpdmVyKG9ubHkgd2hlbiB0aGUgc2VuZGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcG9zdHMgYSBzdGF0dXMgbWVzc2FnZSkuCisgICAgICogQHBhcmFtIHBlbmRpbmcgICAgICAgY3VycmVudGx5IHBlbmRpbmcgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICogQHBhcmFtIHBvc3RlZCAgICAgICAgcG9zdGVkIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgaXMgcG9zdGVkLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbCBwb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgQnVmZmVyU3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgdGFyZ2V0SWQsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlNUQVRVU19ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9DbGllbnRNYW5hZ2VyLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0NsaWVudE1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZWEwYTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9DbGllbnRNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDUwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xNYW5hZ2VyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJCdWZmZXJQb29sQ2xpZW50LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtSZWdpc3RlclRpbWVvdXRVcyA9IDUwMDAwMDsgLy8gMC41IHNlYworc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtDbGVhblVwRHVyYXRpb25VcyA9IDEwMDAwMDA7IC8vIFRPRE86IDEgc2VjIHR1bmUKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrQ2xpZW50VGltZW91dFVzID0gNTAwMDAwMDsgLy8gVE9ETzogNSBzZWNzIHR1bmUKKworLyoqCisgKiBUaGUgaG9sZGVyIG9mIHRoZSBjb29raWUgb2YgcmVtb3RlIElDbGllbnRNYW5hZ2VyLgorICogVGhlIGNvb2tpZSBpcyBwcm9jZXNzIGxvY2FsbHkgdW5pcXVlIGZvciBlYWNoIElDbGllbnRNYW5hZ2VyLgorICogKFRoZSBjb29raWUgaXMgdXNlZCB0byBub3RpZnkgZGVhdGggb2YgY2xpZW50cyB0byBidWZmZXJwb29sIHByb2Nlc3MuKQorICovCitjbGFzcyBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29va2llIGhvbGRlciBmb3IgcmVtb3RlIElDbGllbnRNYW5hZ2VyKHMpLgorICAgICAqLworICAgIENsaWVudE1hbmFnZXJDb29raWVIb2xkZXIoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgYSBjb29raWUgZm9yIGEgcmVtb3RlIElDbGllbnRNYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIG1hbmFnZXIgICB0aGUgc3BlY2lmaWVkIHJlbW90ZSBJQ2xpZW50TWFuYWdlci4KKyAgICAgKiBAcGFyYW0gYWRkZWQgICAgIHRydWUgd2hlbiB0aGUgc3BlY2lmaWVkIHJlbW90ZSBJQ2xpZW50TWFuYWdlciBpcyBhZGRlZAorICAgICAqICAgICAgICAgICAgICAgICAgbmV3bHksIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHByb2Nlc3MgbG9jYWxseSB1bmlxdWUgY29va2llIGZvciB0aGUgc3BlY2lmaWVkIElDbGllbnRNYW5hZ2VyLgorICAgICAqLworICAgIHVpbnQ2NF90IGdldENvb2tpZShjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJm1hbmFnZXIsIGJvb2wgKmFkZGVkKTsKKworcHJpdmF0ZToKKyAgICB1aW50NjRfdCBtU2VxSWQ7CisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6Omxpc3Q8c3RkOjpwYWlyPGNvbnN0IHdwPElDbGllbnRNYW5hZ2VyPiwgdWludDY0X3Q+PiBtTWFuYWdlcnM7Cit9OworCitDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyOjpDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyKCkgOiBtU2VxSWQoMCl7fQorCit1aW50NjRfdCBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyOjpnZXRDb29raWUoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmbWFuYWdlciwKKyAgICAgICAgYm9vbCAqYWRkZWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgZm9yIChhdXRvIGl0ID0gbU1hbmFnZXJzLmJlZ2luKCk7IGl0ICE9IG1NYW5hZ2Vycy5lbmQoKTspIHsKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+IGtleSA9IGl0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgIGlmIChrZXkpIHsKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2VzRXF1YWwoa2V5LCBtYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgICphZGRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0ID0gbU1hbmFnZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICB1aW50NjRfdCBpZCA9IG1TZXFJZCsrOworICAgICphZGRlZCA9IHRydWU7CisgICAgbU1hbmFnZXJzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihtYW5hZ2VyLCBpZCkpOworICAgIHJldHVybiBpZDsKK30KKworY2xhc3MgQ2xpZW50TWFuYWdlcjo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbCgpOworCisgICAgLy8gQm5SZWdpc3RlclNlbmRlcgorICAgIFJlc3VsdFN0YXR1cyByZWdpc3RlclNlbmRlcihjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKTsKKworICAgIC8vIEJwUmVnaXN0ZXJTZW5kZXIKKyAgICBSZXN1bHRTdGF0dXMgcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZyZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkIHNlbmRlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnJlY2VpdmVySWQpOworCisgICAgUmVzdWx0U3RhdHVzIGNyZWF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyBwb3N0U2VuZChDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICBSZXN1bHRTdGF0dXMgZ2V0QWNjZXNzb3IoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpOworCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSA9IGZhbHNlKTsKKworcHJpdmF0ZToKKyAgICAvLyBJbiBvcmRlciB0byBwcmV2ZW50IGRlYWRsb2NrIGJldHdlZW4gbXVsdGlwbGUgbG9ja3MsCisgICAgLy8gYWx3YXlzIGxvY2sgQ2xpZW50Q2FjaGUubG9jayBiZWZvcmUgbG9ja2luZyBBY3RpdmVDbGllbnRzLmxvY2suCisgICAgc3RydWN0IENsaWVudENhY2hlIHsKKyAgICAgICAgLy8gVGhpcyBsb2NrIGlzIGhlbGQgZm9yIGJyaWVmIGR1cmF0aW9uLgorICAgICAgICAvLyBCbG9ja2luZyBvcGVyYXRpb24gaXMgbm90IHBlcmZvcm1lZCB3aGlsZSBob2xkaW5nIHRoZSBsb2NrLgorICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6cGFpcjxjb25zdCB3cDxJQWNjZXNzb3I+LCBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+Pj4KKyAgICAgICAgICAgICAgICBtQ2xpZW50czsKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNvbm5lY3RDdjsKKyAgICAgICAgYm9vbCBtQ29ubmVjdGluZzsKKyAgICAgICAgaW50NjRfdCBtTGFzdENsZWFuVXBVczsKKworICAgICAgICBDbGllbnRDYWNoZSgpIDogbUNvbm5lY3RpbmcoZmFsc2UpLCBtTGFzdENsZWFuVXBVcyhnZXRUaW1lc3RhbXBOb3coKSkge30KKyAgICB9IG1DYWNoZTsKKworICAgIC8vIEFjdGl2ZSBjbGllbnRzIHdoaWNoIGNhbiBiZSByZXRyaWV2ZWQgdmlhIENvbm5lY3Rpb25JZAorICAgIHN0cnVjdCBBY3RpdmVDbGllbnRzIHsKKyAgICAgICAgLy8gVGhpcyBsb2NrIGlzIGhlbGQgZm9yIGJyaWVmIGR1cmF0aW9uLgorICAgICAgICAvLyBCbG9ja2luZyBvcGVyYXRpb24gaXMgbm90IHBlcmZvcm1lZCBob2xkaW5nIHRoZSBsb2NrLgorICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4+CisgICAgICAgICAgICAgICAgbUNsaWVudHM7CisgICAgfSBtQWN0aXZlOworCisgICAgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlciBtUmVtb3RlQ2xpZW50Q29va2llczsKK307CisKK0NsaWVudE1hbmFnZXI6OkltcGw6OkltcGwoKSB7fQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgIGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpIHsKKyAgICBjbGVhblVwKCk7CisgICAgaW50NjRfdCB0aW1lb3V0VXMgPSBnZXRUaW1lc3RhbXBOb3coKSArIGtSZWdpc3RlclRpbWVvdXRVczsKKyAgICBkbyB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubU11dGV4KTsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUNhY2hlLm1DbGllbnRzLmJlZ2luKCk7IGl0ICE9IG1DYWNoZS5tQ2xpZW50cy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBzQWNjZXNzb3IgPSBpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKHNBY2Nlc3NvciAmJiBpbnRlcmZhY2VzRXF1YWwoc0FjY2Vzc29yLCBhY2Nlc3NvcikpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50ID0gaXQtPnNlY29uZC5sb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudCkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgICAgICAgICAgICAgICpwQ29ubmVjdGlvbklkID0gY2xpZW50LT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmUubUNsaWVudHMuZmluZCgqcENvbm5lY3Rpb25JZCkgIT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyIGV4aXN0aW5nIGNvbm5lY3Rpb24gJWxsZCIsIChsb25nIGxvbmcpKnBDb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6QUxSRUFEWV9FWElTVFM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DbGllbnRzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW1DYWNoZS5tQ29ubmVjdGluZykgeworICAgICAgICAgICAgbUNhY2hlLm1Db25uZWN0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBSZXN1bHRTdGF0dXMgcmVzdWx0ID0gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEJ1ZmZlclBvb2xDbGllbnQ+KGFjY2Vzc29yKTsKKyAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgaWYgKCFjbGllbnQpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNsaWVudC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBpbnNlcnQgZmFpbC4gKG1hbGxvYyBmYWlsKQorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4gd2NsaWVudCA9IGNsaWVudDsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNsaWVudHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGFjY2Vzc29yLCB3Y2xpZW50KSk7CisgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbklkID0gY2xpZW50LT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZS5tQ2xpZW50cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29uSWQsIGNsaWVudCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqcENvbm5lY3Rpb25JZCA9IGNvbklkOworICAgICAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlciBuZXcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FjaGUubUNvbm5lY3RpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBtQ2FjaGUubUNvbm5lY3RDdi5ub3RpZnlfYWxsKCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIG1DYWNoZS5tQ29ubmVjdEN2LndhaXRfZm9yKAorICAgICAgICAgICAgICAgIGxvY2ssIHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHMoa1JlZ2lzdGVyVGltZW91dFVzKSk7CisgICAgfSB3aGlsZSAoZ2V0VGltZXN0YW1wTm93KCkgPCB0aW1lb3V0VXMpOworICAgIC8vIFRPRE86IHJldHVybiB0aW1lb3V0IGVycm9yCisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWdpc3RlclNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZyZWNlaXZlciwKKyAgICAgICAgQ29ubmVjdGlvbklkIHNlbmRlcklkLAorICAgICAgICBDb25uZWN0aW9uSWQgKnJlY2VpdmVySWQpIHsKKyAgICBzcDxJQWNjZXNzb3I+IGFjY2Vzc29yOworICAgIGJvb2wgbG9jYWwgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChzZW5kZXJJZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgaXQtPnNlY29uZC0+Z2V0QWNjZXNzb3IoJmFjY2Vzc29yKTsKKyAgICAgICAgbG9jYWwgPSBpdC0+c2Vjb25kLT5pc0xvY2FsKCk7CisgICAgfQorICAgIFJlc3VsdFN0YXR1cyBycyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgaWYgKGFjY2Vzc29yKSB7CisgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gcmVjZWl2ZXItPnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICAgICAgICAgIGFjY2Vzc29yLAorICAgICAgICAgICAgICAgIFsmcnMsIHJlY2VpdmVySWRdKAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkKSB7CisgICAgICAgICAgICAgICAgICAgIHJzID0gc3RhdHVzOworICAgICAgICAgICAgICAgICAgICAqcmVjZWl2ZXJJZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICB9IGVsc2UgaWYgKGxvY2FsICYmIHJzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHNwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gcmVjaXBpZW50ID0gQWNjZXNzb3I6OmdldENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpOworICAgICAgICAgICAgaWYgKHJlY2lwaWVudCkgIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2xpZW50IGRlYXRoIHJlY2lwaWVudCByZWdpc3RlcmVkICVsbGQiLCAobG9uZyBsb25nKSpyZWNlaXZlcklkKTsKKyAgICAgICAgICAgICAgICBib29sIGFkZGVkOworICAgICAgICAgICAgICAgIHVpbnQ2NF90IGNvb2tpZSA9IG1SZW1vdGVDbGllbnRDb29raWVzLmdldENvb2tpZShyZWNlaXZlciwgJmFkZGVkKTsKKyAgICAgICAgICAgICAgICByZWNpcGllbnQtPmFkZENvb2tpZVRvQ29ubmVjdGlvbihjb29raWUsICpyZWNlaXZlcklkKTsKKyAgICAgICAgICAgICAgICBpZiAoYWRkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgUmV0dXJuPGJvb2w+IHRyYW5zUmVzdWx0ID0gcmVjZWl2ZXItPmxpbmtUb0RlYXRoKHJlY2lwaWVudCwgY29va2llKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJzOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Y3JlYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKSB7CisgICAgY29uc3Qgc3A8QWNjZXNzb3I+IGFjY2Vzc29yID0gbmV3IEFjY2Vzc29yKGFsbG9jYXRvcik7CisgICAgaWYgKCFhY2Nlc3NvciB8fCAhYWNjZXNzb3ItPmlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEJ1ZmZlclBvb2xDbGllbnQ+KGFjY2Vzc29yKTsKKyAgICBpZiAoIWNsaWVudCB8fCAhY2xpZW50LT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIC8vIFNpbmNlIGEgbmV3IGJ1ZmZlcnBvb2wgaXMgY3JlYXRlZCwgZXZpY3QgbWVtb3JpZXMgd2hpY2ggYXJlIHVzZWQgYnkKKyAgICAvLyBleGlzdGluZyBidWZmZXJwb29scyBhbmQgY2xpZW50cy4KKyAgICBjbGVhblVwKHRydWUpOworICAgIHsKKyAgICAgICAgLy8gVE9ETzogaGFuZGxlIGluc2VydCBmYWlsLiAobWFsbG9jIGZhaWwpCisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTXV0ZXgpOworICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IHdjbGllbnQgPSBjbGllbnQ7CisgICAgICAgIG1DYWNoZS5tQ2xpZW50cy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYWNjZXNzb3IsIHdjbGllbnQpKTsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbklkID0gY2xpZW50LT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICAgICAgbUFjdGl2ZS5tQ2xpZW50cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29uSWQsIGNsaWVudCkpOworICAgICAgICB9CisgICAgICAgICpwQ29ubmVjdGlvbklkID0gY29uSWQ7CisgICAgICAgIEFMT0dWKCJjcmVhdGUgbmV3IGNvbm5lY3Rpb24gJWxsZCIsIChsb25nIGxvbmcpKnBDb25uZWN0aW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jazEobUNhY2hlLm1NdXRleCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2syKG1BY3RpdmUubU11dGV4KTsKKyAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGl0ICE9IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgc3A8SUFjY2Vzc29yPiBhY2Nlc3NvcjsKKyAgICAgICAgaXQtPnNlY29uZC0+Z2V0QWNjZXNzb3IoJmFjY2Vzc29yKTsKKyAgICAgICAgbUFjdGl2ZS5tQ2xpZW50cy5lcmFzZShjb25uZWN0aW9uSWQpOworICAgICAgICBmb3IgKGF1dG8gY2l0ID0gbUNhY2hlLm1DbGllbnRzLmJlZ2luKCk7IGNpdCAhPSBtQ2FjaGUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkZWFkIGNsaWVudCBjYWNoZXMKKyAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gY0FjY2Vzc29yID0gY2l0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoIWNBY2Nlc3NvciB8fCAoYWNjZXNzb3IgJiYgaW50ZXJmYWNlc0VxdWFsKGNBY2Nlc3NvciwgYWNjZXNzb3IpKSkgeworICAgICAgICAgICAgICAgIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5lcmFzZShjaXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaXQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPmFsbG9jYXRlKHBhcmFtcywgaGFuZGxlLCBidWZmZXIpOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6cmVjZWl2ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+cmVjZWl2ZSh0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgdGltZXN0YW1wVXMsIGhhbmRsZSwgYnVmZmVyKTsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnBvc3RTZW5kKAorICAgICAgICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90ICp0aW1lc3RhbXBVcykgeworICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQgPSBidWZmZXItPm1Db25uZWN0aW9uSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPnBvc3RTZW5kKHJlY2VpdmVySWQsIGJ1ZmZlciwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Z2V0QWNjZXNzb3IoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPmdldEFjY2Vzc29yKGFjY2Vzc29yKTsKK30KKwordm9pZCBDbGllbnRNYW5hZ2VyOjpJbXBsOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgaW50NjRfdCBsYXN0VHJhbnNhY3Rpb25VczsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jazEobUNhY2hlLm1NdXRleCk7CisgICAgaWYgKGNsZWFyQ2FjaGUgfHwgbUNhY2hlLm1MYXN0Q2xlYW5VcFVzICsga0NsZWFuVXBEdXJhdGlvblVzIDwgbm93KSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrMihtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGludCBjbGVhbmVkID0gMDsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5iZWdpbigpOyBpdCAhPSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpOykgeworICAgICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5pc0FjdGl2ZSgmbGFzdFRyYW5zYWN0aW9uVXMsIGNsZWFyQ2FjaGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxhc3RUcmFuc2FjdGlvblVzICsga0NsaWVudFRpbWVvdXRVcyA8IG5vdykgeworICAgICAgICAgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IGFjY2Vzc29yOworICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLT5nZXRBY2Nlc3NvcigmYWNjZXNzb3IpOworICAgICAgICAgICAgICAgICAgICBpdCA9IG1BY3RpdmUubUNsaWVudHMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICAgICArK2NsZWFuZWQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5iZWdpbigpOyBjaXQgIT0gbUNhY2hlLm1DbGllbnRzLmVuZCgpOykgeworICAgICAgICAgICAgLy8gY2xlYW4gdXAgZGVhZCBjbGllbnQgY2FjaGVzCisgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IGNBY2Nlc3NvciA9IGNpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKCFjQWNjZXNzb3IpIHsKKyAgICAgICAgICAgICAgICBjaXQgPSBtQ2FjaGUubUNsaWVudHMuZXJhc2UoY2l0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytjaXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiMgb2YgY2xlYW5lZCBjb25uZWN0aW9uczogJWQiLCBjbGVhbmVkKTsKKyAgICAgICAgbUNhY2hlLm1MYXN0Q2xlYW5VcFVzID0gbm93OworICAgIH0KK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQ2xpZW50TWFuYWdlciBmb2xsb3cuCitSZXR1cm48dm9pZD4gQ2xpZW50TWFuYWdlcjo6cmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklBY2Nlc3Nvcj4mIGJ1ZmZlclBvb2wsIHJlZ2lzdGVyU2VuZGVyX2NiIF9oaWRsX2NiKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQgPSAtMTsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1JbXBsLT5yZWdpc3RlclNlbmRlcihidWZmZXJQb29sLCAmY29ubmVjdGlvbklkKTsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb25uZWN0aW9uSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9oaWRsX2NiKFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1IsIC0xKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworLy8gTWV0aG9kcyBmb3IgbG9jYWwgdXNlLgorc3A8Q2xpZW50TWFuYWdlcj4gQ2xpZW50TWFuYWdlcjo6c0luc3RhbmNlOworc3RkOjptdXRleCBDbGllbnRNYW5hZ2VyOjpzSW5zdGFuY2VMb2NrOworCitzcDxDbGllbnRNYW5hZ2VyPiBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzSW5zdGFuY2VMb2NrKTsKKyAgICBpZiAoIXNJbnN0YW5jZSkgeworICAgICAgICBzSW5zdGFuY2UgPSBuZXcgQ2xpZW50TWFuYWdlcigpOworICAgIH0KKyAgICByZXR1cm4gc0luc3RhbmNlOworfQorCitDbGllbnRNYW5hZ2VyOjpDbGllbnRNYW5hZ2VyKCkgOiBtSW1wbChuZXcgSW1wbCgpKSB7fQorCitDbGllbnRNYW5hZ2VyOjp+Q2xpZW50TWFuYWdlcigpIHsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OmNyZWF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmNyZWF0ZShhbGxvY2F0b3IsIHBDb25uZWN0aW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPnJlZ2lzdGVyU2VuZGVyKHJlY2VpdmVyLCBzZW5kZXJJZCwgcmVjZWl2ZXJJZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+YWxsb2NhdGUoY29ubmVjdGlvbklkLCBwYXJhbXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpyZWNlaXZlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPnJlY2VpdmUoY29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6cG9zdFNlbmQoCisgICAgICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QqIHRpbWVzdGFtcFVzKSB7CisgICAgaWYgKG1JbXBsICYmIGJ1ZmZlcikgeworICAgICAgICByZXR1cm4gbUltcGwtPnBvc3RTZW5kKHJlY2VpdmVySWQsIGJ1ZmZlciwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBDbGllbnRNYW5hZ2VyOjpjbGVhblVwKCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBtSW1wbC0+Y2xlYW5VcCh0cnVlKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0Nvbm5lY3Rpb24uY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU4ZjU5NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0Nvbm5lY3Rpb24uY3BwCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUNvbm5lY3Rpb24gZm9sbG93LgorUmV0dXJuPHZvaWQ+IENvbm5lY3Rpb246OmZldGNoKHVpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIHVpbnQzMl90IGJ1ZmZlcklkLCBmZXRjaF9jYiBfaGlkbF9jYikgeworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIGlmIChidWZmZXJJZCAhPSBTWU5DX0JVRkZFUklEKSB7CisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgICAgICBzdGF0dXMgPSBtQWNjZXNzb3ItPmZldGNoKAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgJmhhbmRsZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBfaGlkbF9jYihzdGF0dXMsIEJ1ZmZlcntidWZmZXJJZCwgaGFuZGxlfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BY2Nlc3Nvci0+Y2xlYW5VcChmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBCdWZmZXJ7MCwgbnVsbHB0cn0pOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK0Nvbm5lY3Rpb246OkNvbm5lY3Rpb24oKSA6IG1Jbml0aWFsaXplZChmYWxzZSksIG1Db25uZWN0aW9uSWQoLTFMTCkge30KKworQ29ubmVjdGlvbjo6fkNvbm5lY3Rpb24oKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgbUFjY2Vzc29yLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbjo6aW5pdGlhbGl6ZSgKKyAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+JiBhY2Nlc3NvciwgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgICAgIG1BY2Nlc3NvciA9IGFjY2Vzc29yOworICAgICAgICBtQ29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KK30KKworUmVzdWx0U3RhdHVzIENvbm5lY3Rpb246OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLCBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIHJldHVybiBtQWNjZXNzb3ItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIENvbm5lY3Rpb246OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgbUFjY2Vzc29yLT5jbGVhblVwKGNsZWFyQ2FjaGUpOworICAgIH0KK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2UgZm9sbG93LgorCisvL0lDb25uZWN0aW9uKiBISURMX0ZFVENIX0lDb25uZWN0aW9uKGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8pIHsKKy8vICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbigpOworLy99CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0Nvbm5lY3Rpb24uaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0Nvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTljYjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DT05ORUNUSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQ09OTkVDVElPTl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0lDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpBY2Nlc3NvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ29ubmVjdGlvbiA6IHB1YmxpYyBJQ29ubmVjdGlvbiB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQ29ubmVjdGlvbiBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IGZldGNoKHVpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIHVpbnQzMl90IGJ1ZmZlcklkLCBmZXRjaF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZXMgYSBidWZmZXIgdXNpbmcgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLiBSZWN5Y2xlcyBhIGJ1ZmZlciBpZgorICAgICAqIGl0IGlzIHBvc3NpYmxlLiBUaGUgcmV0dXJuZWQgYnVmZmVyIGNhbiBiZSB0cmFuc2ZlcnJlZCB0byBvdGhlciByZW1vdGUKKyAgICAgKiBjbGllbnRzKENvbm5lY3Rpb24pLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtcyAgICBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICBJZCBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIGlmIGEgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIHBlcmZvcm1zIHBlcmlvZGljIGNhY2hlIGNsZWFuaW5nCisgICAgICogZnJvbSBidWZmZXJwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNsZWFyQ2FjaGUgICAgaWYgY2xlYXJDYWNoZSBpcyB0cnVlLCBidWZmZXJwb29sIGZyZWVzIGFsbCBidWZmZXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2FpdGluZyB0byBiZSByZWN5Y2xlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKTsKKworICAgIC8qKiBEZXN0cnVjdHMgYSBjb25uZWN0aW9uLiAqLworICAgIH5Db25uZWN0aW9uKCk7CisKKyAgICAvKiogQ3JlYXRlcyBhIGNvbm5lY3Rpb24uICovCisgICAgQ29ubmVjdGlvbigpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgd2l0aCB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBwb29sIGFuZCB0aGUgY29ubmVjdGlvbiBpZC4KKyAgICAgKiBUaGUgY29ubmVjdGlvbiBpZCBzaG91bGQgYmUgdW5pcXVlIGluIHRoZSB3aG9sZSBzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXNzb3IgICAgICB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBwb29sLgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIElkLgorICAgICAqLworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgIFNZTkNfQlVGRkVSSUQgPSBVSU5UMzJfTUFYLAorICAgIH07CisKK3ByaXZhdGU6CisgICAgYm9vbCBtSW5pdGlhbGl6ZWQ7CisgICAgc3A8QWNjZXNzb3I+IG1BY2Nlc3NvcjsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DT05ORUNUSU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL2luY2x1ZGUvYnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL2luY2x1ZGUvYnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTBmMDE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJQT09MVFlQRVNfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJQT09MVFlQRVNfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CisKK3N0cnVjdCBCdWZmZXJQb29sRGF0YSB7CisgICAgLy8gRm9yIGxvY2FsIHVzZSwgdG8gc3BlY2lmeSBhIGJ1ZmZlcnBvb2wgKGNsaWVudCBjb25uZWN0aW9uKSBmb3IgYnVmZmVycy4KKyAgICAvLyBSZXR1cm4gdmFsdWUgZnJvbSBjb25uZWN0I0lBY2Nlc3NvcihhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMS4wKS4KKyAgICBpbnQ2NF90IG1Db25uZWN0aW9uSWQ7CisgICAgLy8gQnVmZmVySWQKKyAgICB1aW50MzJfdCBtSWQ7CisKKyAgICBCdWZmZXJQb29sRGF0YSgpIDogbUNvbm5lY3Rpb25JZCgwKSwgbUlkKDApIHt9CisKKyAgICBCdWZmZXJQb29sRGF0YSgKKyAgICAgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkLCB1aW50MzJfdCBpZCkKKyAgICAgICAgICAgIDogbUNvbm5lY3Rpb25JZChjb25uZWN0aW9uSWQpLCBtSWQoaWQpIHt9CisKKyAgICB+QnVmZmVyUG9vbERhdGEoKSB7fQorfTsKKworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZTsKKwordHlwZWRlZiB1aW50MzJfdCBCdWZmZXJJZDsKK3R5cGVkZWYgdWludDY0X3QgVHJhbnNhY3Rpb25JZDsKK3R5cGVkZWYgaW50NjRfdCBDb25uZWN0aW9uSWQ7CisKK2VudW0gOiBDb25uZWN0aW9uSWQgeworICAgIElOVkFMSURfQ09OTkVDVElPTklEID0gMCwKK307CisKK3R5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTxCdWZmZXJTdGF0dXNNZXNzYWdlLCBrU3luY2hyb25pemVkUmVhZFdyaXRlPiBCdWZmZXJTdGF0dXNRdWV1ZTsKK3R5cGVkZWYgQnVmZmVyU3RhdHVzUXVldWU6OkRlc2NyaXB0b3IgUXVldWVEZXNjcmlwdG9yOworCisvKioKKyAqIEFsbG9jYXRpb24gd3JhcHBlciBjbGFzcyBmb3IgYnVmZmVyIHBvb2wuCisgKi8KK3N0cnVjdCBCdWZmZXJQb29sQWxsb2NhdGlvbiB7CisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICptSGFuZGxlOworCisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUoKSB7CisgICAgICAgIHJldHVybiBtSGFuZGxlOworICAgIH0KKworICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKSA6IG1IYW5kbGUoaGFuZGxlKSB7fQorCisgICAgfkJ1ZmZlclBvb2xBbGxvY2F0aW9uKCkge307Cit9OworCisvKioKKyAqIEFsbG9jYXRvciB3cmFwcGVyIGNsYXNzIGZvciBidWZmZXIgcG9vbC4KKyAqLworY2xhc3MgQnVmZmVyUG9vbEFsbG9jYXRvciB7CitwdWJsaWM6CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhbiBhbGxvY2F0aW9uKGJ1ZmZlcikgZm9yIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtcyAgICBhbGxvY2F0aW9uIHBhcmFtZXRlcnMKKyAgICAgKiBAcGFyYW0gYWxsb2MgICAgIGNyZWF0ZWQgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSBhbGxvY1NpemUgc2l6ZSBvZiBjcmVhdGVkIGFsbG9jYXRpb24KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhbiBhbGxvY2F0aW9uIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHZpcnR1YWwgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgICAgICAgICAgc2l6ZV90ICphbGxvY1NpemUpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgb2YgYW4gb2xkIGFsbG9jYXRpb24gYXJlCisgICAgICogY29tcGF0aWJsZSB3aXRoIG5ldyBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGNvbXBhdGlibGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm5ld1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmb2xkUGFyYW1zKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICBCdWZmZXJQb29sQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB+QnVmZmVyUG9vbEFsbG9jYXRvcigpID0gZGVmYXVsdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJQT09MVFlQRVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL2luY2x1ZGUvYnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU1Nzc5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL2luY2x1ZGUvYnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmgKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0NMSUVOVE1BTkFHRVJfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DTElFTlRNQU5BR0VSX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUFjY2Vzc29yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ2xpZW50TWFuYWdlciA6IHB1YmxpYyBJQ2xpZW50TWFuYWdlciB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQ2xpZW50TWFuYWdlciBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3I+JiBidWZmZXJQb29sLCByZWdpc3RlclNlbmRlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvKiogR2V0cyBhbiBpbnN0YW5jZS4gKi8KKyAgICBzdGF0aWMgc3A8Q2xpZW50TWFuYWdlcj4gZ2V0SW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBsb2NhbCBjb25uZWN0aW9uIHdpdGggYSBuZXdseSBjcmVhdGVkIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGFsbG9jYXRvciAgICAgZm9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0gcENvbm5lY3Rpb25JZCBJZCBvZiB0aGUgY3JlYXRlZCBjb25uZWN0aW9uLiBUaGlzIGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3lzdGVtLXdpZGUgdW5pcXVlLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHBvb2wgYW5kIGEgbG9jYWwgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkKKyAgICAgKiAgICAgICAgIGNyZWF0ZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNyZWF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCk7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGNyZWF0ZWQgY29ubmVjdGlvbiBhcyBzZW5kZXIgZm9yIHJlbW90ZSBwcm9jZXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlY2VpdmVyICAgICAgVGhlIHJlbW90ZSByZWNlaXZpbmcgcHJvY2Vzcy4KKyAgICAgKiBAcGFyYW0gc2VuZGVySWQgICAgICBBIGxvY2FsIGNvbm5lY3Rpb24gd2hpY2ggd2lsbCBzZW5kIGJ1ZmZlcnMgdG8uCisgICAgICogQHBhcmFtIHJlY2VpdmVySWQgICAgSWQgb2YgdGhlIGNyZWF0ZWQgcmVjZWl2aW5nIGNvbm5lY3Rpb24gb24gdGhlIHJlY2VpdmVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgb24gdGhlCisgICAgICogICAgICAgICByZWNlaXZlciBwcm9jZXNzLgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNlbmRlciBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBBTFJFQURZX0VYSVNUUyB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBtYWRlLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyByZWdpc3RlclNlbmRlcihjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgVGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIGJ1ZmZlciBmcm9tIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIFRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgICAgICBUaGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIFRoZSBuYXRpdmUgaGFuZGxlIHRvIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLiBoYW5kbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgY2xvbmVkIGJlZm9yZSB1c2UuCisgICAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgVGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgd2FzIGFsbG9jYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgLyoqCisgICAgICogUmVjZWl2ZXMgYSBidWZmZXIgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIFRoZSBpZCBvZiB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgVGhlIGlkIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgVGhlIGlkIGZvciB0aGUgYnVmZmVyLgorICAgICAqIEBwYXJhbSB0aW1lc3RhbXBVcyAgIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGJ1ZmZlciBpcyBiZWluZyBzZW50LgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIFRoZSBuYXRpdmUgaGFuZGxlIHRvIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLiBoYW5kbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgY2xvbmVkIGJlZm9yZSB1c2UuCisgICAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgVGhlIHJlY2VpdmVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciB3YXMgcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBQb3N0cyBhIGJ1ZmZlciB0cmFuc2ZlciB0cmFuc2FjdGlvbiB0byB0aGUgYnVmZmVyIHBvb2wuIFNlbmRzIGEgYnVmZmVyCisgICAgICogdG8gb3RoZXIgcmVtb3RlIGNsaWVudHMoY29ubmVjdGlvbikgYWZ0ZXIgdGhpcyBjYWxsIGhhcyBiZWVuIHN1Y2NlZWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWNlaXZlcklkICAgIFRoZSBpZCBvZiB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgdG8gdHJhbnNmZXIKKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBJZCBvZiB0aGUgdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIHRpbWVzdGFtcFVzICAgVGhlIHRpbWVzdGFtcCBvZiB0aGUgYnVmZmVyIHRyYW5zYWN0aW9uIGlzIGJlaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcG9zdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHRyYW5zYWN0aW9uIHdhcyBwb3N0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNlbmRpbmcgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBwb3N0U2VuZChDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICAvKioKKyAgICAgKiAgVGltZSBvdXQgaW5hY3RpdmUgbGluZ2VyaW5nIGNvbm5lY3Rpb25zIGFuZCBjbG9zZS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFuVXAoKTsKKworICAgIC8qKiBEZXN0cnVjdHMgdGhlIG1hbmFnZXIgb2YgYnVmZmVyIHBvb2wgY2xpZW50cy4gICovCisgICAgfkNsaWVudE1hbmFnZXIoKTsKK3ByaXZhdGU6CisgICAgc3RhdGljIHNwPENsaWVudE1hbmFnZXI+IHNJbnN0YW5jZTsKKyAgICBzdGF0aWMgc3RkOjptdXRleCBzSW5zdGFuY2VMb2NrOworCisgICAgY2xhc3MgSW1wbDsKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gbUltcGw7CisKKyAgICBDbGllbnRNYW5hZ2VyKCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQ0xJRU5UTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvQW5kcm9pZC5icCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNWE3NTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c1ZuZGtIaWRsQnVmZmVycG9vbFYxXzBUYXJnZXRTaW5nbGVUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhbGxvY2F0b3IuY3BwIiwKKyAgICAgICAgInNpbmdsZS5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAxLjAiLAorICAgICAgICAibGliaW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMS4wIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzVm5ka0hpZGxCdWZmZXJwb29sVjFfMFRhcmdldE11bHRpVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiYWxsb2NhdG9yLmNwcCIsCisgICAgICAgICJtdWx0aS5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAxLjAiLAorICAgICAgICAibGliaW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMS4wIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL09XTkVSUyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczM2UwYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9PV05FUlMKQEAgLTAsMCArMSw5IEBACisjIE1lZGlhIHRlYW0KK2xham9zQGdvb2dsZS5jb20KK3Bhd2luQGdvb2dsZS5jb20KK3Rha2xlZUBnb29nbGUuY29tCit3b25zaWtAZ29vZ2xlLmNvbQorCisjIFZUUyB0ZWFtCit5aW1AZ29vZ2xlLmNvbQoremh1b3lhb0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvYWxsb2NhdG9yLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0M2Y3ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvYWxsb2NhdG9yLmNwcApAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjdXRpbHMvYXNobWVtLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlICJhbGxvY2F0b3IuaCIKKwordW5pb24gUGFyYW1zIHsKKyAgc3RydWN0IHsKKyAgICB1aW50MzJfdCBjYXBhY2l0eTsKKyAgfSBkYXRhOworICB1aW50OF90IGFycmF5WzBdOworICBQYXJhbXMoKSA6IGRhdGF7MH0ge30KKyAgUGFyYW1zKHVpbnQzMl90IHNpemUpCisgICAgICA6IGRhdGF7c2l6ZX0ge30KK307CisKKworbmFtZXNwYWNlIHsKKworc3RydWN0IEhhbmRsZUFzaG1lbSA6IHB1YmxpYyBuYXRpdmVfaGFuZGxlX3QgeworICBIYW5kbGVBc2htZW0oaW50IGFzaG1lbUZkLCBzaXplX3Qgc2l6ZSkKKyAgICA6IG5hdGl2ZV9oYW5kbGVfdChjSGVhZGVyKSwKKyAgICBtRmRzeyBhc2htZW1GZCB9LAorICAgIG1JbnRzeyBpbnQgKHNpemUgJiAweEZGRkZGRkZGKSwgaW50KCh1aW50NjRfdChzaXplKSA+PiAzMikgJiAweEZGRkZGRkZGKSwga01hZ2ljIH0ge30KKworICBpbnQgYXNobWVtRmQoKSBjb25zdCB7IHJldHVybiBtRmRzLm1Bc2htZW07IH0KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIHNpemVfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUxvKSkKKyAgICAgICAgfCBzaXplX3QodWludDY0X3QodW5zaWduZWQobUludHMubVNpemVIaSkpIDw8IDMyKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgbmF0aXZlX2hhbmRsZV90ICogY29uc3Qgbyk7CisKK3Byb3RlY3RlZDoKKyAgc3RydWN0IHsKKyAgICBpbnQgbUFzaG1lbTsKKyAgfSBtRmRzOworICBzdHJ1Y3QgeworICAgIGludCBtU2l6ZUxvOworICAgIGludCBtU2l6ZUhpOworICAgIGludCBtTWFnaWM7CisgIH0gbUludHM7CisKK3ByaXZhdGU6CisgIGVudW0geworICAgIGtNYWdpYyA9ICdhaG1ceDAwJywKKyAgICBudW1GZHMgPSBzaXplb2YobUZkcykgLyBzaXplb2YoaW50KSwKKyAgICBudW1JbnRzID0gc2l6ZW9mKG1JbnRzKSAvIHNpemVvZihpbnQpLAorICAgIHZlcnNpb24gPSBzaXplb2YobmF0aXZlX2hhbmRsZV90KQorICB9OworICBjb25zdCBzdGF0aWMgbmF0aXZlX2hhbmRsZV90IGNIZWFkZXI7Cit9OworCitjb25zdCBuYXRpdmVfaGFuZGxlX3QgSGFuZGxlQXNobWVtOjpjSGVhZGVyID0geworICBIYW5kbGVBc2htZW06OnZlcnNpb24sCisgIEhhbmRsZUFzaG1lbTo6bnVtRmRzLAorICBIYW5kbGVBc2htZW06Om51bUludHMsCisgIHt9Cit9OworCitib29sIEhhbmRsZUFzaG1lbTo6aXNWYWxpZChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKiBjb25zdCBvKSB7CisgIGlmICghbyB8fCBtZW1jbXAobywgJmNIZWFkZXIsIHNpemVvZihjSGVhZGVyKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSGFuZGxlQXNobWVtICpvdGhlciA9IHN0YXRpY19jYXN0PGNvbnN0IEhhbmRsZUFzaG1lbSo+KG8pOworICByZXR1cm4gb3RoZXItPm1JbnRzLm1NYWdpYyA9PSBrTWFnaWM7Cit9CisKK2NsYXNzIEFsbG9jYXRpb25Bc2htZW0geworcHJpdmF0ZToKKyAgQWxsb2NhdGlvbkFzaG1lbShpbnQgYXNobWVtRmQsIHNpemVfdCBjYXBhY2l0eSwgYm9vbCByZXMpCisgICAgOiBtSGFuZGxlKGFzaG1lbUZkLCBjYXBhY2l0eSksCisgICAgICBtSW5pdChyZXMpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIEFsbG9jYXRpb25Bc2htZW0gKkFsbG9jKHNpemVfdCBzaXplKSB7CisgICAgY29uc3RleHByIHN0YXRpYyBjb25zdCBjaGFyICprQWxsb2NhdGlvblRhZyA9ICJidWZmZXJwb29sX3Rlc3QiOworICAgIGludCBhc2htZW1GZCA9IGFzaG1lbV9jcmVhdGVfcmVnaW9uKGtBbGxvY2F0aW9uVGFnLCBzaXplKTsKKyAgICByZXR1cm4gbmV3IEFsbG9jYXRpb25Bc2htZW0oYXNobWVtRmQsIHNpemUsIGFzaG1lbUZkID49IDApOworICB9CisKKyAgfkFsbG9jYXRpb25Bc2htZW0oKSB7CisgICAgaWYgKG1Jbml0KSB7CisgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKCZtSGFuZGxlKTsKKyAgICB9CisgIH0KKworICBjb25zdCBIYW5kbGVBc2htZW0gKmhhbmRsZSgpIHsKKyAgICByZXR1cm4gJm1IYW5kbGU7CisgIH0KKworcHJpdmF0ZToKKyAgSGFuZGxlQXNobWVtIG1IYW5kbGU7CisgIGJvb2wgbUluaXQ7CisgIC8vIFRPRE86IG1hcHBpbmcgYW5kIG1hcCBmZAorfTsKKworc3RydWN0IEFsbG9jYXRpb25EdG9yIHsKKyAgQWxsb2NhdGlvbkR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+ICZhbGxvYykKKyAgICAgIDogbUFsbG9jKGFsbG9jKSB7fQorCisgIHZvaWQgb3BlcmF0b3IoKShCdWZmZXJQb29sQWxsb2NhdGlvbiAqcG9vbEFsbG9jKSB7IGRlbGV0ZSBwb29sQWxsb2M7IH0KKworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4gbUFsbG9jOworfTsKKworfQorCisKK1Jlc3VsdFN0YXR1cyBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6YWxsb2NhdGUoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICBzaXplX3QgKmFsbG9jU2l6ZSkgeworICBQYXJhbXMgYXNobWVtUGFyYW1zOworICBtZW1jcHkoJmFzaG1lbVBhcmFtcywgcGFyYW1zLmRhdGEoKSwgc3RkOjptaW4oc2l6ZW9mKFBhcmFtcyksIHBhcmFtcy5zaXplKCkpKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4gYXNobWVtQWxsb2MgPQorICAgICAgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+KAorICAgICAgICAgIEFsbG9jYXRpb25Bc2htZW06OkFsbG9jKGFzaG1lbVBhcmFtcy5kYXRhLmNhcGFjaXR5KSk7CisgIGlmIChhc2htZW1BbGxvYykgeworICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwdHIgPSBuZXcgQnVmZmVyUG9vbEFsbG9jYXRpb24oYXNobWVtQWxsb2MtPmhhbmRsZSgpKTsKKyAgICBpZiAocHRyKSB7CisgICAgICAqYWxsb2MgPSBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+KHB0ciwgQWxsb2NhdGlvbkR0b3IoYXNobWVtQWxsb2MpKTsKKyAgICAgIGlmICgqYWxsb2MpIHsKKyAgICAgICAgICAqYWxsb2NTaXplID0gYXNobWVtUGFyYW1zLmRhdGEuY2FwYWNpdHk7CisgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICB9CisgICAgICBkZWxldGUgcHRyOworICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgIH0KKyAgfQorICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworYm9vbCBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6Y29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpIHsKKyAgc2l6ZV90IG5ld1NpemUgPSBuZXdQYXJhbXMuc2l6ZSgpOworICBzaXplX3Qgb2xkU2l6ZSA9IG9sZFBhcmFtcy5zaXplKCk7CisgIGlmIChuZXdTaXplID09IG9sZFNpemUpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5ld1NpemU7ICsraSkgeworICAgICAgaWYgKG5ld1BhcmFtc1tpXSAhPSBvbGRQYXJhbXNbaV0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKSB7CisgIGlmICghSGFuZGxlQXNobWVtOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSGFuZGxlQXNobWVtICpvID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlQXNobWVtKj4oaGFuZGxlKTsKKyAgdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKiltbWFwKAorICAgICAgTlVMTCwgby0+c2l6ZSgpLCBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX1NIQVJFRCwgby0+YXNobWVtRmQoKSwgMCk7CisKKyAgaWYgKHB0ciAhPSBNQVBfRkFJTEVEKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvLT5zaXplKCk7ICsraSkgeworICAgICAgcHRyW2ldID0gdmFsOworICAgIH0KKyAgICBtdW5tYXAocHRyLCBvLT5zaXplKCkpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VmVyaWZ5KGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCkgeworICBpZiAoIUhhbmRsZUFzaG1lbTo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqbyA9IHN0YXRpY19jYXN0PGNvbnN0IEhhbmRsZUFzaG1lbSo+KGhhbmRsZSk7CisgIHVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopbW1hcCgKKyAgICAgIE5VTEwsIG8tPnNpemUoKSwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBvLT5hc2htZW1GZCgpLCAwKTsKKworICBpZiAocHRyICE9IE1BUF9GQUlMRUQpIHsKKyAgICBib29sIHJlcyA9IHRydWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvLT5zaXplKCk7ICsraSkgeworICAgICAgaWYgKHB0cltpXSAhPSB2YWwpIHsKKyAgICAgICAgcmVzID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBtdW5tYXAocHRyLCBvLT5zaXplKCkpOworICAgIHJldHVybiByZXM7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcykgeworICBjb25zdGV4cHIgc3RhdGljIGludCBrQWxsb2NhdGlvblNpemUgPSAxMDI0ICogMTA7CisgIFBhcmFtcyBhc2htZW1QYXJhbXMoa0FsbG9jYXRpb25TaXplKTsKKworICBwYXJhbXMtPmFzc2lnbihhc2htZW1QYXJhbXMuYXJyYXksIGFzaG1lbVBhcmFtcy5hcnJheSArIHNpemVvZihhc2htZW1QYXJhbXMpKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODZlNWYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL2FsbG9jYXRvci5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFZOREtfSElETF9CVUZGRVJQT09MX1YxXzBfQUxMT0NBVE9SX0gKKyNkZWZpbmUgVk5ES19ISURMX0JVRkZFUlBPT0xfVjFfMF9BTExPQ0FUT1JfSAorCisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICBCdWZmZXJQb29sQWxsb2NhdGlvbjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OgorICAgIEJ1ZmZlclBvb2xBbGxvY2F0b3I7CisKKy8vIGJ1ZmZlciBhbGxvY2F0b3IgZm9yIHRoZSB0ZXN0cworY2xhc3MgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3IgOiBwdWJsaWMgQnVmZmVyUG9vbEFsbG9jYXRvciB7CisgcHVibGljOgorICBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcigpIHt9CisKKyAgflRlc3RCdWZmZXJQb29sQWxsb2NhdG9yKCkgb3ZlcnJpZGUge30KKworICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICphbGxvY1NpemUpIG92ZXJyaWRlOworCisgIGJvb2wgY29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgRmlsbChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpOworCisgIHN0YXRpYyBib29sIFZlcmlmeShjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpOworCit9OworCisvLyByZXRyaWV2ZSBidWZmZXIgYWxsb2NhdG9yIHBhcmFtdGVycwordm9pZCBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpOworCisjZW5kaWYgIC8vIFZOREtfSElETF9CVUZGRVJQT09MX1YxXzBfQUxMT0NBVE9SX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9tdWx0aS5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvbXVsdGkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OTY4MTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvbXVsdGkuY3BwCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJidWZmZmVycG9vbF91bml0X3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0xlZ2FjeVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJhbGxvY2F0b3IuaCIKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2w7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpCdWZmZXJJZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpDb25uZWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpUcmFuc2FjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YTsKKworbmFtZXNwYWNlIHsKKworLy8gY29tbXVuaWNhdGlvbiBtZXNzYWdlIHR5cGVzIGJldHdlZW4gcHJvY2Vzc2VzLgorZW51bSBQaXBlQ29tbWFuZCA6IGludDMyX3QgeworICAgIElOSVRfT0sgPSAwLAorICAgIElOSVRfRVJST1IsCisgICAgU0VORCwKKyAgICBSRUNFSVZFX09LLAorICAgIFJFQ0VJVkVfRVJST1IsCit9OworCisvLyBjb21tdW5pY2F0aW9uIG1lc3NhZ2UgYmV0d2VlbiBwcm9jZXNzZXMuCit1bmlvbiBQaXBlTWVzc2FnZSB7CisgICAgc3RydWN0ICB7CisgICAgICAgIGludDMyX3QgY29tbWFuZDsKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQ7CisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQ7CisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgICAgICAgaW50NjRfdCAgdGltZXN0YW1wVXM7CisgICAgfSBkYXRhOworICAgIGNoYXIgYXJyYXlbMF07Cit9OworCisvLyBtZWRpYS5idWZmZXJwb29sIHRlc3Qgc2V0dXAKK2NsYXNzIEJ1ZmZlcnBvb2xNdWx0aVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIG1SZWNlaXZlclBpZCA9IC0xOworICAgIG1Db25uZWN0aW9uVmFsaWQgPSBmYWxzZTsKKworICAgIEFTU0VSVF9UUlVFKHBpcGUobUNvbW1hbmRQaXBlRmRzKSA9PSAwKTsKKyAgICBBU1NFUlRfVFJVRShwaXBlKG1SZXN1bHRQaXBlRmRzKSA9PSAwKTsKKworICAgIG1SZWNlaXZlclBpZCA9IGZvcmsoKTsKKyAgICBBU1NFUlRfVFJVRShtUmVjZWl2ZXJQaWQgPj0gMCk7CisKKyAgICBpZiAobVJlY2VpdmVyUGlkID09IDApIHsKKyAgICAgIGRvUmVjZWl2ZXIoKTsKKyAgICAgIC8vIEluIG9yZGVyIHRvIGlnbm9yZSBndGVzdCBiZWhhdmlvdXIsIHdhaXQgZm9yIGJlaW5nIGtpbGxlZCBmcm9tCisgICAgICAvLyB0ZWFyRG93bgorICAgICAgcGF1c2UoKTsKKyAgICB9CisKKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKG1NYW5hZ2VyLCBudWxscHRyKTsKKworICAgIG1BbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yPigpOworICAgIEFTU0VSVF9UUlVFKChib29sKW1BbGxvY2F0b3IpOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPmNyZWF0ZShtQWxsb2NhdG9yLCAmbUNvbm5lY3Rpb25JZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICAgIG1Db25uZWN0aW9uVmFsaWQgPSB0cnVlOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIGlmIChtUmVjZWl2ZXJQaWQgPiAwKSB7CisgICAgICBraWxsKG1SZWNlaXZlclBpZCwgU0lHS0lMTCk7CisgICAgICBpbnQgd3N0YXR1czsKKyAgICAgIHdhaXQoJndzdGF0dXMpOworICAgIH0KKworICAgIGlmIChtQ29ubmVjdGlvblZhbGlkKSB7CisgICAgICBtTWFuYWdlci0+Y2xvc2UobUNvbm5lY3Rpb25JZCk7CisgICAgfQorICB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgfQorCisgIGFuZHJvaWQ6OnNwPENsaWVudE1hbmFnZXI+IG1NYW5hZ2VyOworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgYm9vbCBtQ29ubmVjdGlvblZhbGlkOworICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgcGlkX3QgbVJlY2VpdmVyUGlkOworICBpbnQgbUNvbW1hbmRQaXBlRmRzWzJdOworICBpbnQgbVJlc3VsdFBpcGVGZHNbMl07CisKKyAgYm9vbCBzZW5kTWVzc2FnZShpbnQgKnBpcGVzLCBjb25zdCBQaXBlTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGludCByZXQgPSB3cml0ZShwaXBlc1sxXSwgbWVzc2FnZS5hcnJheSwgc2l6ZW9mKFBpcGVNZXNzYWdlKSk7CisgICAgcmV0dXJuIHJldCA9PSBzaXplb2YoUGlwZU1lc3NhZ2UpOworICB9CisKKyAgYm9vbCByZWNlaXZlTWVzc2FnZShpbnQgKnBpcGVzLCBQaXBlTWVzc2FnZSAqbWVzc2FnZSkgeworICAgIGludCByZXQgPSByZWFkKHBpcGVzWzBdLCBtZXNzYWdlLT5hcnJheSwgc2l6ZW9mKFBpcGVNZXNzYWdlKSk7CisgICAgcmV0dXJuIHJldCA9PSBzaXplb2YoUGlwZU1lc3NhZ2UpOworICB9CisKKyAgdm9pZCBkb1JlY2VpdmVyKCkgeworICAgIGNvbmZpZ3VyZVJwY1RocmVhZHBvb2woMSwgZmFsc2UpOworICAgIFBpcGVNZXNzYWdlIG1lc3NhZ2U7CisgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIGlmICghbU1hbmFnZXIpIHsKKyAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfRVJST1I7CisgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGFuZHJvaWQ6OnN0YXR1c190IHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlckFzU2VydmljZSgpOworICAgIGlmIChzdGF0dXMgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfRVJST1I7CisgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfT0s7CisgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworCisgICAgcmVjZWl2ZU1lc3NhZ2UobUNvbW1hbmRQaXBlRmRzLCAmbWVzc2FnZSk7CisgICAgeworICAgICAgbmF0aXZlX2hhbmRsZV90ICpyaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gcmJ1ZmZlcjsKKyAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtTWFuYWdlci0+cmVjZWl2ZSgKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkLCBtZXNzYWdlLmRhdGEudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuYnVmZmVySWQsIG1lc3NhZ2UuZGF0YS50aW1lc3RhbXBVcywgJnJoYW5kbGUsICZyYnVmZmVyKTsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkKTsKKyAgICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBpZiAoIVRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkocmhhbmRsZSwgMHg3NykpIHsKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpSRUNFSVZFX0VSUk9SOworICAgICAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6UkVDRUlWRV9PSzsKKyAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgIH0KK307CisKKy8vIEJ1ZmZlciB0cmFuc2ZlciB0ZXN0IGJldHdlZW4gcHJvY2Vzc2VzLgorVEVTVF9GKEJ1ZmZlcnBvb2xNdWx0aVRlc3QsIFRyYW5zZmVyQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIFBpcGVNZXNzYWdlIG1lc3NhZ2U7CisKKyAgQVNTRVJUX1RSVUUocmVjZWl2ZU1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsICZtZXNzYWdlKSk7CisKKyAgYW5kcm9pZDo6c3A8SUNsaWVudE1hbmFnZXI+IHJlY2VpdmVyID0gSUNsaWVudE1hbmFnZXI6OmdldFNlcnZpY2UoKTsKKyAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQ7CisgIEFTU0VSVF9UUlVFKChib29sKXJlY2VpdmVyKTsKKworICBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIocmVjZWl2ZXIsIG1Db25uZWN0aW9uSWQsICZyZWNlaXZlcklkKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICB7CisgICAgbmF0aXZlX2hhbmRsZV90ICpzaGFuZGxlID0gbnVsbHB0cjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHNidWZmZXI7CisgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICAgIGludDY0X3QgcG9zdFVzOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKworICAgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJnNoYW5kbGUsICZzYnVmZmVyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisKKyAgICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChzaGFuZGxlLCAweDc3KSk7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgc2J1ZmZlciwgJnRyYW5zYWN0aW9uSWQsICZwb3N0VXMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKworICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlNFTkQ7CisgICAgbWVzc2FnZS5kYXRhLmJ1ZmZlcklkID0gc2J1ZmZlci0+bUlkOworICAgIG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQgPSByZWNlaXZlcklkOworICAgIG1lc3NhZ2UuZGF0YS50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKyAgICBtZXNzYWdlLmRhdGEudGltZXN0YW1wVXMgPSBwb3N0VXM7CisgICAgc2VuZE1lc3NhZ2UobUNvbW1hbmRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgfQorICBFWFBFQ1RfVFJVRShyZWNlaXZlTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgJm1lc3NhZ2UpKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgc2V0ZW52KCJUUkVCTEVfVEVTVElOR19PVkVSUklERSIsICJ0cnVlIiwgdHJ1ZSk7CisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICBMT0coSU5GTykgPDwgIlRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvc2luZ2xlLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9zaW5nbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3M2ViNjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvc2luZ2xlLmNwcApAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiYnVmZmZlcnBvb2xfdW5pdF90ZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9MZWdhY3lTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkJ1ZmZlcklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6Q2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkNvbm5lY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OlRyYW5zYWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOworCituYW1lc3BhY2UgeworCisvLyBOdW1iZXIgb2YgaXRlcmF0aW9uIGZvciBidWZmZXIgYWxsb2NhdGlvbiB0ZXN0LgorY29uc3RleHByIHN0YXRpYyBpbnQga051bUFsbG9jYXRpb25UZXN0ID0gMzsKKworLy8gTnVtYmVyIG9mIGl0ZXJhdGlvbiBmb3IgYnVmZmVyIHJlY3ljbGluZyB0ZXN0LgorY29uc3RleHByIHN0YXRpYyBpbnQga051bVJlY3ljbGVUZXN0ID0gMzsKKworLy8gbWVkaWEuYnVmZmVycG9vbCB0ZXN0IHNldHVwCitjbGFzcyBCdWZmZXJwb29sU2luZ2xlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IGZhbHNlOworCisgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIEFTU0VSVF9ORShtTWFuYWdlciwgbnVsbHB0cik7CisKKyAgICBtQWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcj4oKTsKKyAgICBBU1NFUlRfVFJVRSgoYm9vbCltQWxsb2NhdG9yKTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5jcmVhdGUobUFsbG9jYXRvciwgJm1Db25uZWN0aW9uSWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKworICAgIG1Db25uZWN0aW9uVmFsaWQgPSB0cnVlOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyU2VuZGVyKG1NYW5hZ2VyLCBtQ29ubmVjdGlvbklkLCAmbVJlY2VpdmVySWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTICYmCisgICAgICAgICAgICAgICAgbVJlY2VpdmVySWQgPT0gbUNvbm5lY3Rpb25JZCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgaWYgKG1Db25uZWN0aW9uVmFsaWQpIHsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICB9CisgIH0KKworIHByb3RlY3RlZDoKKyAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICB9CisKKyAgYW5kcm9pZDo6c3A8Q2xpZW50TWFuYWdlcj4gbU1hbmFnZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICBib29sIG1Db25uZWN0aW9uVmFsaWQ7CisgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICBDb25uZWN0aW9uSWQgbVJlY2VpdmVySWQ7CisKK307CisKKy8vIEJ1ZmZlciBhbGxvY2F0aW9uIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGVhY2ggYnVmZmVyIGFsbG9jYXRpb24gaXMgZG9uZSBzdWNjZXNzZnVsbHkgd2l0aAorLy8gdW5pcXVlIGJ1ZmZlciBpZC4KK1RFU1RfRihCdWZmZXJwb29sU2luZ2xlVGVzdCwgQWxsb2NhdGVCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVyW2tOdW1BbGxvY2F0aW9uVGVzdF07CisgIG5hdGl2ZV9oYW5kbGVfdCAqYWxsb2NIYW5kbGUgPSBudWxscHRyOworICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1BbGxvY2F0aW9uVGVzdDsgKytpKSB7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmYnVmZmVyW2ldKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtQWxsb2NhdGlvblRlc3Q7ICsraSkgeworICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IGtOdW1BbGxvY2F0aW9uVGVzdDsgKytqKSB7CisgICAgICBBU1NFUlRfVFJVRShidWZmZXJbaV0tPm1JZCAhPSBidWZmZXJbal0tPm1JZCk7CisgICAgfQorICB9CisgIEVYUEVDVF9UUlVFKGtOdW1BbGxvY2F0aW9uVGVzdCA+IDEpOworfQorCisvLyBCdWZmZXIgcmVjeWNsZSB0ZXN0LgorLy8gQ2hlY2sgd2hldGhlciBkZS1hbGxvY2F0ZWQgYnVmZmVycyBhcmUgcmVjeWNsZWQuCitURVNUX0YoQnVmZmVycG9vbFNpbmdsZVRlc3QsIFJlY3ljbGVCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworCisgIEJ1ZmZlcklkIGJpZFtrTnVtUmVjeWNsZVRlc3RdOworICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1SZWN5Y2xlVGVzdDsgKytpKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXI7CisgICAgbmF0aXZlX2hhbmRsZV90ICphbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmYnVmZmVyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgICAgYmlkW2ldID0gYnVmZmVyLT5tSWQ7CisgIH0KKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBrTnVtUmVjeWNsZVRlc3Q7ICsraSkgeworICAgIEFTU0VSVF9UUlVFKGJpZFtpIC0gMV0gPT0gYmlkW2ldKTsKKyAgfQorICBFWFBFQ1RfVFJVRShrTnVtUmVjeWNsZVRlc3QgPiAxKTsKK30KKworLy8gQnVmZmVyIHRyYW5zZmVyIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGJ1ZmZlciBpcyB0cmFuc2ZlcnJlZCB0byBhbm90aGVyIGNsaWVudCBzdWNjZXNzZnVsbHkuCitURVNUX0YoQnVmZmVycG9vbFNpbmdsZVRlc3QsIFRyYW5zZmVyQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBzYnVmZmVyLCByYnVmZmVyOworICBuYXRpdmVfaGFuZGxlX3QgKmFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgbmF0aXZlX2hhbmRsZV90ICpyZWN2SGFuZGxlID0gbnVsbHB0cjsKKworICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgIGludDY0X3QgcG9zdFVzOworCisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJnNidWZmZXIpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKGFsbG9jSGFuZGxlLCAweDc3KSk7CisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5wb3N0U2VuZChtUmVjZWl2ZXJJZCwgc2J1ZmZlciwgJnRyYW5zYWN0aW9uSWQsICZwb3N0VXMpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWNlaXZlKG1SZWNlaXZlcklkLCB0cmFuc2FjdGlvbklkLCBzYnVmZmVyLT5tSWQsIHBvc3RVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3ZIYW5kbGUsICZyYnVmZmVyKTsKKyAgRVhQRUNUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VmVyaWZ5KHJlY3ZIYW5kbGUsIDB4NzcpKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgIExPRyhJTkZPKSA8PCAiVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29yLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2I0NjA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuY3BwCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbENvbm5lY3Rpb24iCisKKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorI2luY2x1ZGUgIkFjY2Vzc29ySW1wbC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6YWRkKAorICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCwKKyAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvcikgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUFjY2Vzc29ycy5maW5kKGNvbm5lY3Rpb25JZCkgPT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICBtQWNjZXNzb3JzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25uZWN0aW9uSWQsIGFjY2Vzc29yKSk7CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6cmVtb3ZlKGludDY0X3QgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1BY2Nlc3NvcnMuZXJhc2UoY29ubmVjdGlvbklkKTsKKyAgICBhdXRvIGl0ID0gbUNvbm5lY3Rpb25Ub0Nvb2tpZS5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGl0ICE9IG1Db25uZWN0aW9uVG9Db29raWUuZW5kKCkpIHsKKyAgICAgICAgdWludDY0X3QgY29va2llID0gaXQtPnNlY29uZDsKKyAgICAgICAgbUNvbm5lY3Rpb25Ub0Nvb2tpZS5lcmFzZShpdCk7CisgICAgICAgIGF1dG8gY2l0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgICAgICBpZiAoY2l0ICE9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmVuZCgpKSB7CisgICAgICAgICAgICBjaXQtPnNlY29uZC5lcmFzZShjb25uZWN0aW9uSWQpOworICAgICAgICAgICAgaWYgKGNpdC0+c2Vjb25kLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbUNvb2tpZVRvQ29ubmVjdGlvbnMuZXJhc2UoY2l0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ6OmFkZENvb2tpZVRvQ29ubmVjdGlvbigKKyAgICAgICAgdWludDY0X3QgY29va2llLAorICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUFjY2Vzc29ycy5maW5kKGNvbm5lY3Rpb25JZCkgPT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1Db25uZWN0aW9uVG9Db29raWUuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbm5lY3Rpb25JZCwgY29va2llKSk7CisgICAgYXV0byBpdCA9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmZpbmQoY29va2llKTsKKyAgICBpZiAoaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgaXQtPnNlY29uZC5pbnNlcnQoY29ubmVjdGlvbklkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgY29va2llLCBzdGQ6OnNldDxpbnQ2NF90Pntjb25uZWN0aW9uSWR9KSk7CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6c2VydmljZURpZWQoCisgICAgICAgIHVpbnQ2NF90IGNvb2tpZSwKKyAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICApIHsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBjb25zdCB3cDxBY2Nlc3Nvcj4+IGNvbm5lY3Rpb25zVG9DbG9zZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKworICAgICAgICBhdXRvIGl0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgICAgICBpZiAoaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byBjb25JdCA9IGl0LT5zZWNvbmQuYmVnaW4oKTsgY29uSXQgIT0gaXQtPnNlY29uZC5lbmQoKTsgKytjb25JdCkgeworICAgICAgICAgICAgICAgIGF1dG8gYWNjZXNzb3JJdCA9IG1BY2Nlc3NvcnMuZmluZCgqY29uSXQpOworICAgICAgICAgICAgICAgIGlmIChhY2Nlc3Nvckl0ICE9IG1BY2Nlc3NvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnNUb0Nsb3NlLmluc2VydChzdGQ6Om1ha2VfcGFpcigqY29uSXQsIGFjY2Vzc29ySXQtPnNlY29uZCkpOworICAgICAgICAgICAgICAgICAgICBtQWNjZXNzb3JzLmVyYXNlKGFjY2Vzc29ySXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvblRvQ29va2llLmVyYXNlKCpjb25JdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5lcmFzZShpdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29ubmVjdGlvbnNUb0Nsb3NlLnNpemUoKSA+IDApIHsKKyAgICAgICAgc3A8QWNjZXNzb3I+IGFjY2Vzc29yOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBjb25uZWN0aW9uc1RvQ2xvc2UuYmVnaW4oKTsgaXQgIT0gY29ubmVjdGlvbnNUb0Nsb3NlLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBhY2Nlc3NvciA9IGl0LT5zZWNvbmQucHJvbW90ZSgpOworCisgICAgICAgICAgICBpZiAoYWNjZXNzb3IpIHsKKyAgICAgICAgICAgICAgICBhY2Nlc3Nvci0+Y2xvc2UoaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiY29ubmVjdGlvbiAlbGxkIGNsb3NlZCBvbiBkZWF0aCIsIChsb25nIGxvbmcpaXQtPmZpcnN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworbmFtZXNwYWNlIHsKK3N0YXRpYyBzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQgPQorICAgICAgICBuZXcgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCk7Cit9CisKK3NwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gQWNjZXNzb3I6OmdldENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpIHsKKyAgICByZXR1cm4gc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDsKK30KKwordm9pZCBBY2Nlc3Nvcjo6Y3JlYXRlSW52YWxpZGF0b3IoKSB7CisgICAgQWNjZXNzb3I6OkltcGw6OmNyZWF0ZUludmFsaWRhdG9yKCk7Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUFjY2Vzc29yIGZvbGxvdy4KK1JldHVybjx2b2lkPiBBY2Nlc3Nvcjo6Y29ubmVjdCgKKyAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklPYnNlcnZlcj4mIG9ic2VydmVyLAorICAgICAgICBjb25uZWN0X2NiIF9oaWRsX2NiKSB7CisgICAgc3A8Q29ubmVjdGlvbj4gY29ubmVjdGlvbjsKKyAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkOworICAgIHVpbnQzMl90IG1zZ0lkOworICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IqIGZtcURlc2M7CisgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciogaW52RGVzYzsKKworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBjb25uZWN0KAorICAgICAgICAgICAgb2JzZXJ2ZXIsIGZhbHNlLCAmY29ubmVjdGlvbiwgJmNvbm5lY3Rpb25JZCwgJm1zZ0lkLCAmZm1xRGVzYywgJmludkRlc2MpOworICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIGNvbm5lY3Rpb24sIGNvbm5lY3Rpb25JZCwgbXNnSWQsICpmbXFEZXNjLCAqaW52RGVzYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBudWxscHRyLCAtMUxMLCAwLAorICAgICAgICAgICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzxCdWZmZXJTdGF0dXNNZXNzYWdlPigKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpoYXJkd2FyZTo6R3JhbnRvckRlc2NyaXB0b3I+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBuaGFuZGxlICovLCAwIC8qIHNpemUgKi8pLAorICAgICAgICAgICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yVW5zeW5jPEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmhhcmR3YXJlOjpHcmFudG9yRGVzY3JpcHRvcj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIG5oYW5kbGUgKi8sIDAgLyogc2l6ZSAqLykpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitBY2Nlc3Nvcjo6QWNjZXNzb3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgOiBtSW1wbChuZXcgSW1wbChhbGxvY2F0b3IpKSB7fQorCitBY2Nlc3Nvcjo6fkFjY2Vzc29yKCkgeworfQorCitib29sIEFjY2Vzc29yOjppc1ZhbGlkKCkgeworICAgIHJldHVybiAoYm9vbCltSW1wbCAmJiBtSW1wbC0+aXNWYWxpZCgpOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmZsdXNoKCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBtSW1wbC0+Zmx1c2goKTsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmFsbG9jYXRlKGNvbm5lY3Rpb25JZCwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6ZmV0Y2goCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZldGNoKGNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyLCBib29sIGxvY2FsLAorICAgICAgICBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLAorICAgICAgICB1aW50MzJfdCAqcE1zZ0lkLAorICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiogc3RhdHVzRGVzY1B0ciwKKyAgICAgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvcioqIGludkRlc2NQdHIpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1JbXBsLT5jb25uZWN0KAorICAgICAgICAgICAgICAgIHRoaXMsIG9ic2VydmVyLCBjb25uZWN0aW9uLCBwQ29ubmVjdGlvbklkLCBwTXNnSWQsCisgICAgICAgICAgICAgICAgc3RhdHVzRGVzY1B0ciwgaW52RGVzY1B0cik7CisgICAgICAgIGlmICghbG9jYWwgJiYgc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHNwPEFjY2Vzc29yPiBhY2Nlc3Nvcih0aGlzKTsKKyAgICAgICAgICAgIHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQtPmFkZCgqcENvbm5lY3Rpb25JZCwgYWNjZXNzb3IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1JbXBsLT5jbG9zZShjb25uZWN0aW9uSWQpOworICAgICAgICBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50LT5yZW1vdmUoY29ubmVjdGlvbklkKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5jbGVhblVwKGNsZWFyQ2FjaGUpOworICAgIH0KK30KKworLy9JQWNjZXNzb3IqIEhJRExfRkVUQ0hfSUFjY2Vzc29yKGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8pIHsKKy8vICAgIHJldHVybiBuZXcgQWNjZXNzb3IoKTsKKy8vfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3Nvci5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDAyNTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuaApAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQUNDRVNTT1JfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9BQ0NFU1NPUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lBY2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSU9ic2VydmVyLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSAiQnVmZmVyU3RhdHVzLmgiCisKKyNpbmNsdWRlIDxzZXQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQWNjZXNzb3I7CitzdHJ1Y3QgQ29ubmVjdGlvbjsKKworLyoqCisgKiBSZWNlaXZlcyBkZWF0aCBub3RpZmljYXRpb25zIGZyb20gcmVtb3RlIGNvbm5lY3Rpb25zLgorICogT24gZGVhdGggbm90aWZpY2F0aW9ucywgdGhlIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWQgYW5kIHVzZWQgcmVzb3VyY2VzCisgKiBhcmUgcmVsZWFzZWQuCisgKi8KK3N0cnVjdCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQgOiBwdWJsaWMgaGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50IHsKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBuZXdseSBjb25uZWN0ZWQgY29ubmVjdGlvbiBmcm9tIHJlbW90ZSBwcm9jZXNzZXMuCisgICAgICovCisgICAgdm9pZCBhZGQoaW50NjRfdCBjb25uZWN0aW9uSWQsIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgdm9pZCByZW1vdmUoaW50NjRfdCBjb25uZWN0aW9uSWQpOworCisgICAgdm9pZCBhZGRDb29raWVUb0Nvbm5lY3Rpb24odWludDY0X3QgY29va2llLCBpbnQ2NF90IGNvbm5lY3Rpb25JZCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQoCisgICAgICAgICAgICB1aW50NjRfdCAvKiBjb29raWUgKi8sCisgICAgICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICAgICApIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PGludDY0X3Q+PiAgbUNvb2tpZVRvQ29ubmVjdGlvbnM7CisgICAgc3RkOjptYXA8aW50NjRfdCwgdWludDY0X3Q+IG1Db25uZWN0aW9uVG9Db29raWU7CisgICAgc3RkOjptYXA8aW50NjRfdCwgY29uc3Qgd3A8QWNjZXNzb3I+PiBtQWNjZXNzb3JzOworfTsKKworLyoqCisgKiBBIGJ1ZmZlciBwb29sIGFjY2Vzc29yIHdoaWNoIGVuYWJsZXMgYSBidWZmZXIgcG9vbCB0byBjb21tdW5pY2F0ZSB3aXRoIGJ1ZmZlcgorICogcG9vbCBjbGllbnRzLiAxOjEgY29ycmVzcG9uZGVuc2UgaG9sZHMgYmV0d2VlbiBhIGJ1ZmZlciBwb29sIGFuZCBhbiBhY2Nlc3Nvci4KKyAqLworc3RydWN0IEFjY2Vzc29yIDogcHVibGljIElBY2Nlc3NvciB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3IgZm9sbG93LgorICAgIFJldHVybjx2b2lkPiBjb25uZWN0KGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJT2JzZXJ2ZXI+JiBvYnNlcnZlciwgY29ubmVjdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVmZmVyIHBvb2wgYWNjZXNzb3Igd2hpY2ggdXNlcyB0aGUgc3BlY2lmaWVkIGFsbG9jYXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGxvY2F0b3IgYnVmZmVyIGFsbG9jYXRvci4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBBY2Nlc3Nvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcik7CisKKyAgICAvKiogRGVzdHJ1Y3RzIGEgYnVmZmVyIHBvb2wgYWNjZXNzb3IuICovCisgICAgfkFjY2Vzc29yKCk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBhY2Nlc3NvciBpcyB2YWxpZC4gKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIC8qKiBJbnZhbGlkYXRlcyBhbGwgYnVmZmVycyB3aGljaCBhcmUgb3duZWQgYnkgYnVmZmVycG9vbCAqLworICAgIFJlc3VsdFN0YXR1cyBmbHVzaCgpOworCisgICAgLyoqIEFsbG9jYXRlcyBhIGJ1ZmZlciBmcm9tIGEgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgY29ubmVjdGlvbiBpZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgLyoqCisgICAgICogRmV0Y2hlcyBhIGJ1ZmZlciBmb3IgdGhlIHNwZWNpZmllZCB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiByZWNlaXZpbmcgY29ubmVjdGlvbihjbGllbnQpLgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIHRoZSBpZCBvZiB0aGUgdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIgdG8gYmUgZmV0Y2hlZC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICB0aGUgbmF0aXZlIGhhbmRsZSBvZiB0aGUgZmV0Y2hlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGZldGNoZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGZldGNoKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIE1ha2VzIGEgY29ubmVjdGlvbiB0byB0aGUgYnVmZmVyIHBvb2wuIFRoZSBidWZmZXIgcG9vbCBjbGllbnQgdXNlcyB0aGUKKyAgICAgKiBjcmVhdGVkIGNvbm5lY3Rpb24gaW4gb3JkZXIgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgYnVmZmVyIHBvb2wuIEFuCisgICAgICogRk1RIGZvciBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgaXMgYWxzbyBjcmVhdGVkIGZvciB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIG9ic2VydmVyICAgICAgY2xpZW50IG9ic2VydmVyIGZvciBidWZmZXIgaW52YWxpZGF0aW9uCisgICAgICogQHBhcmFtIGxvY2FsICAgICAgICAgdHJ1ZSB3aGVuIGEgY29ubmVjdGlvbiByZXF1ZXN0IGNvbWVzIGZyb20gbG9jYWwgcHJvY2VzcywKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb24gICAgY3JlYXRlZCBjb25uZWN0aW9uCisgICAgICogQHBhcmFtIHBDb25uZWN0aW9uSWQgdGhlIGlkIG9mIHRoZSBjcmVhdGVkIGNvbm5lY3Rpb24KKyAgICAgKiBAcGFyYW0gcE1zZ0lkICAgICAgICB0aGUgaWQgb2YgdGhlIHJlY2VudCBidWZmZXIgcG9vbCBtZXNzYWdlCisgICAgICogQHBhcmFtIHN0YXR1c0Rlc2NQdHIgRk1RIGRlc2NyaXB0b3IgZm9yIHNoYXJlZCBidWZmZXIgc3RhdHVzIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSBiZXR3ZWVuIGEgYnVmZmVyIHBvb2wgYW5kIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIGludkRlc2NQdHIgICAgRk1RIGRlc2NyaXB0b3IgZm9yIGJ1ZmZlciBpbnZhbGlkYXRpb24gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlIGZyb20gYSBidWZmZXIgcG9vbCB0byB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkgbWFkZS4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4mIG9ic2VydmVyLAorICAgICAgICAgICAgYm9vbCBsb2NhbCwKKyAgICAgICAgICAgIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLCBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsCisgICAgICAgICAgICB1aW50MzJfdCAqcE1zZ0lkLAorICAgICAgICAgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvcioqIHN0YXR1c0Rlc2NQdHIsCisgICAgICAgICAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yKiogaW52RGVzY1B0cik7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIHBlcmZvbXMgcGVyaW9kaWMgY2FjaGUKKyAgICAgKiBjbGVhbmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGVhckNhY2hlICAgIGlmIGNsZWFyQ2FjaGUgaXMgdHJ1ZSwgaXQgZnJlZXMgYWxsIGJ1ZmZlcnMgd2FpdGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlY3ljbGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIGhpZGxfZGVhdGhfcmVjaXBpZW50IGZvciByZW1vdGUgY29ubmVjdGlvbiBkZWF0aC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiBnZXRDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKTsKKworICAgIHN0YXRpYyB2b2lkIGNyZWF0ZUludmFsaWRhdG9yKCk7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQUNDRVNTT1JfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2MDkwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5jcHAKQEAgLTAsMCArMSw4NTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xBY2Nlc3NvciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSAiQWNjZXNzb3JJbXBsLmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK25hbWVzcGFjZSB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtDbGVhblVwRHVyYXRpb25VcyA9IDUwMDAwMDsgLy8gVE9ETyB0dW5lIDAuNSBzZWMKKyAgICBzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0xvZ0R1cmF0aW9uVXMgPSA1MDAwMDAwOyAvLyA1IHNlY3MKKworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNaW5BbGxvY0J5dGVzRm9yRXZpY3Rpb24gPSAxMDI0KjEwMjQqMTU7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pbkJ1ZmZlckNvdW50Rm9yRXZpY3Rpb24gPSA0MDsKK30KKworLy8gQnVmZmVyIHN0cnVjdHVyZSBpbiBidWZmZXJwb29sIHByb2Nlc3MKK3N0cnVjdCBJbnRlcm5hbEJ1ZmZlciB7CisgICAgQnVmZmVySWQgbUlkOworICAgIHNpemVfdCBtT3duZXJDb3VudDsKKyAgICBzaXplX3QgbVRyYW5zYWN0aW9uQ291bnQ7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKKyAgICBjb25zdCBzaXplX3QgbUFsbG9jU2l6ZTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtQ29uZmlnOworICAgIGJvb2wgbUludmFsaWRhdGVkOworCisgICAgSW50ZXJuYWxCdWZmZXIoCisgICAgICAgICAgICBCdWZmZXJJZCBpZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZhbGxvY0NvbmZpZykKKyAgICAgICAgICAgIDogbUlkKGlkKSwgbU93bmVyQ291bnQoMCksIG1UcmFuc2FjdGlvbkNvdW50KDApLAorICAgICAgICAgICAgbUFsbG9jYXRpb24oYWxsb2MpLCBtQWxsb2NTaXplKGFsbG9jU2l6ZSksIG1Db25maWcoYWxsb2NDb25maWcpLAorICAgICAgICAgICAgbUludmFsaWRhdGVkKGZhbHNlKSB7fQorCisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUoKSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbi0+aGFuZGxlKCk7CisgICAgfQorCisgICAgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICBtSW52YWxpZGF0ZWQgPSB0cnVlOworICAgIH0KK307CisKK3N0cnVjdCBUcmFuc2FjdGlvblN0YXR1cyB7CisgICAgVHJhbnNhY3Rpb25JZCBtSWQ7CisgICAgQnVmZmVySWQgbUJ1ZmZlcklkOworICAgIENvbm5lY3Rpb25JZCBtU2VuZGVyOworICAgIENvbm5lY3Rpb25JZCBtUmVjZWl2ZXI7CisgICAgQnVmZmVyU3RhdHVzIG1TdGF0dXM7CisgICAgaW50NjRfdCBtVGltZXN0YW1wVXM7CisgICAgYm9vbCBtU2VuZGVyVmFsaWRhdGVkOworCisgICAgVHJhbnNhY3Rpb25TdGF0dXMoY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSwgaW50NjRfdCB0aW1lc3RhbXBVcykgeworICAgICAgICBtSWQgPSBtZXNzYWdlLnRyYW5zYWN0aW9uSWQ7CisgICAgICAgIG1CdWZmZXJJZCA9IG1lc3NhZ2UuYnVmZmVySWQ7CisgICAgICAgIG1TdGF0dXMgPSBtZXNzYWdlLm5ld1N0YXR1czsKKyAgICAgICAgbVRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CisgICAgICAgIGlmIChtU3RhdHVzID09IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVE8pIHsKKyAgICAgICAgICAgIG1TZW5kZXIgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1SZWNlaXZlciA9IG1lc3NhZ2UudGFyZ2V0Q29ubmVjdGlvbklkOworICAgICAgICAgICAgbVNlbmRlclZhbGlkYXRlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2VuZGVyID0gLTFMTDsKKyAgICAgICAgICAgIG1SZWNlaXZlciA9IG1lc3NhZ2UuY29ubmVjdGlvbklkOworICAgICAgICAgICAgbVNlbmRlclZhbGlkYXRlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorfTsKKworLy8gSGVscGVyIHRlbXBsYXRlIG1ldGhvZHMgZm9yIGhhbmRsaW5nIG1hcCBvZiBzZXQuCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorYm9vbCBpbnNlcnQoc3RkOjptYXA8VCwgc3RkOjpzZXQ8VT4+ICptYXBPZlNldCwgVCBrZXksIFUgdmFsdWUpIHsKKyAgICBhdXRvIGl0ZXIgPSBtYXBPZlNldC0+ZmluZChrZXkpOworICAgIGlmIChpdGVyID09IG1hcE9mU2V0LT5lbmQoKSkgeworICAgICAgICBzdGQ6OnNldDxVPiB2YWx1ZVNldHt2YWx1ZX07CisgICAgICAgIG1hcE9mU2V0LT5pbnNlcnQoc3RkOjptYWtlX3BhaXIoa2V5LCB2YWx1ZVNldCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGl0ZXItPnNlY29uZC5maW5kKHZhbHVlKSAgPT0gaXRlci0+c2Vjb25kLmVuZCgpKSB7CisgICAgICAgIGl0ZXItPnNlY29uZC5pbnNlcnQodmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorYm9vbCBlcmFzZShzdGQ6Om1hcDxULCBzdGQ6OnNldDxVPj4gKm1hcE9mU2V0LCBUIGtleSwgVSB2YWx1ZSkgeworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgYXV0byBpdGVyID0gbWFwT2ZTZXQtPmZpbmQoa2V5KTsKKyAgICBpZiAoaXRlciAhPSBtYXBPZlNldC0+ZW5kKCkpIHsKKyAgICAgICAgaWYgKGl0ZXItPnNlY29uZC5lcmFzZSh2YWx1ZSkgPiAwKSB7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpdGVyLT5zZWNvbmQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIG1hcE9mU2V0LT5lcmFzZShpdGVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorYm9vbCBjb250YWlucyhzdGQ6Om1hcDxULCBzdGQ6OnNldDxVPj4gKm1hcE9mU2V0LCBUIGtleSwgVSB2YWx1ZSkgeworICAgIGF1dG8gaXRlciA9IG1hcE9mU2V0LT5maW5kKGtleSk7CisgICAgaWYgKGl0ZXIgIT0gbWFwT2ZTZXQtPmVuZCgpKSB7CisgICAgICAgIGF1dG8gc2V0SXRlciA9IGl0ZXItPnNlY29uZC5maW5kKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHNldEl0ZXIgIT0gaXRlci0+c2Vjb25kLmVuZCgpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2ludDMyX3QgQWNjZXNzb3I6OkltcGw6OnNQaWQgPSBnZXRwaWQoKTsKK3VpbnQzMl90IEFjY2Vzc29yOjpJbXBsOjpzU2VxSWQgPSB0aW1lKG51bGxwdHIpOworCitBY2Nlc3Nvcjo6SW1wbDo6SW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgICAgIDogbUFsbG9jYXRvcihhbGxvY2F0b3IpIHt9CisKK0FjY2Vzc29yOjpJbXBsOjp+SW1wbCgpIHsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpjb25uZWN0KAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlciwKKyAgICAgICAgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sCisgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwKKyAgICAgICAgdWludDMyX3QgKnBNc2dJZCwKKyAgICAgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvcioqIHN0YXR1c0Rlc2NQdHIsCisgICAgICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IqKiBpbnZEZXNjUHRyKSB7CisgICAgc3A8Q29ubmVjdGlvbj4gbmV3Q29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgICAgICBpZiAobmV3Q29ubmVjdGlvbikgeworICAgICAgICAgICAgQ29ubmVjdGlvbklkIGlkID0gKGludDY0X3Qpc1BpZCA8PCAzMiB8IHNTZXFJZDsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CdWZmZXJQb29sLm1PYnNlcnZlci5vcGVuKGlkLCBzdGF0dXNEZXNjUHRyKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIG5ld0Nvbm5lY3Rpb24tPmluaXRpYWxpemUoYWNjZXNzb3IsIGlkKTsKKyAgICAgICAgICAgICAgICAqY29ubmVjdGlvbiA9IG5ld0Nvbm5lY3Rpb247CisgICAgICAgICAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBpZDsKKyAgICAgICAgICAgICAgICAqcE1zZ0lkID0gbUJ1ZmZlclBvb2wubUludmFsaWRhdGlvbi5tSW52YWxpZGF0aW9uSWQ7CisgICAgICAgICAgICAgICAgbUJ1ZmZlclBvb2wubUludmFsaWRhdGlvbkNoYW5uZWwuZ2V0RGVzYyhpbnZEZXNjUHRyKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyUG9vbC5tSW52YWxpZGF0aW9uLm9uQ29ubmVjdChpZCwgb2JzZXJ2ZXIpOworICAgICAgICAgICAgICAgICsrc1NlcUlkOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBBTE9HVigiY29ubmVjdGlvbiBjbG9zZSAlbGxkOiAldSIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkLCBtQnVmZmVyUG9vbC5tSW52YWxpZGF0aW9uLm1JZCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgbUJ1ZmZlclBvb2wuaGFuZGxlQ2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICBtQnVmZmVyUG9vbC5tT2JzZXJ2ZXIuY2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICBtQnVmZmVyUG9vbC5tSW52YWxpZGF0aW9uLm9uQ2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICAvLyBTaW5jZSBjbG9zZSMgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIHdvcmtzIGFyZSBmaW5pc2hlZCwgaXQgaXMgT0sgdG8KKyAgICAvLyBldmljdCB1bnVzZWQgYnVmZmVycy4KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKHRydWUpOworICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLAorICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6Ok9LOworICAgIGlmICghbUJ1ZmZlclBvb2wuZ2V0RnJlZUJ1ZmZlcihtQWxsb2NhdG9yLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpKSB7CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgIHNpemVfdCBhbGxvY1NpemU7CisgICAgICAgIHN0YXR1cyA9IG1BbGxvY2F0b3ItPmFsbG9jYXRlKHBhcmFtcywgJmFsbG9jLCAmYWxsb2NTaXplKTsKKyAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3RhdHVzID0gbUJ1ZmZlclBvb2wuYWRkTmV3QnVmZmVyKGFsbG9jLCBhbGxvY1NpemUsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImNyZWF0ZSBhIGJ1ZmZlciAlZCA6ICV1ICVwIiwKKyAgICAgICAgICAgICAgc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0ssICpidWZmZXJJZCwgKmhhbmRsZSk7CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgb3duQnVmZmVyIGZhaWx1cmUKKyAgICAgICAgbUJ1ZmZlclBvb2wuaGFuZGxlT3duQnVmZmVyKGNvbm5lY3Rpb25JZCwgKmJ1ZmZlcklkKTsKKyAgICB9CisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCgpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6ZmV0Y2goCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgYXV0byBmb3VuZCA9IG1CdWZmZXJQb29sLm1UcmFuc2FjdGlvbnMuZmluZCh0cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgIT0gbUJ1ZmZlclBvb2wubVRyYW5zYWN0aW9ucy5lbmQoKSAmJgorICAgICAgICAgICAgY29udGFpbnMoJm1CdWZmZXJQb29sLm1QZW5kaW5nVHJhbnNhY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkKSkgeworICAgICAgICBpZiAoZm91bmQtPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCAmJgorICAgICAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NICYmCisgICAgICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bUJ1ZmZlcklkID09IGJ1ZmZlcklkKSB7CisgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU3RhdHVzID0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GRVRDSDsKKyAgICAgICAgICAgIGF1dG8gYnVmZmVySXQgPSBtQnVmZmVyUG9vbC5tQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIGlmIChidWZmZXJJdCAhPSBtQnVmZmVyUG9vbC5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgIG1CdWZmZXJQb29sLm1TdGF0cy5vbkJ1ZmZlckZldGNoZWQoKTsKKyAgICAgICAgICAgICAgICAqaGFuZGxlID0gYnVmZmVySXQtPnNlY29uZC0+aGFuZGxlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCgpOworICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIC8vIHRyYW5zYWN0aW9uIHRpbWVvdXQsIGJ1ZmZlciBjYWNoZWluZyBUVEwgaGFuZGxpbmcKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoY2xlYXJDYWNoZSk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OmZsdXNoKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgbUJ1ZmZlclBvb2wuZmx1c2goc2hhcmVkX2Zyb21fdGhpcygpKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6aGFuZGxlSW52YWxpZGF0ZUFjaygpIHsKKyAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHNwPElPYnNlcnZlcj4+IG9ic2VydmVyczsKKyAgICB1aW50MzJfdCBpbnZhbGlkYXRpb25JZDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgICAgICBtQnVmZmVyUG9vbC5tSW52YWxpZGF0aW9uLm9uSGFuZGxlQWNrKCZvYnNlcnZlcnMsICZpbnZhbGlkYXRpb25JZCk7CisgICAgfQorICAgIC8vIERvIG5vdCBob2xkIGxvY2sgZm9yIHNlbmQgaW52YWxpZGF0aW9ucworICAgIGZvciAoYXV0byBpdCA9IG9ic2VydmVycy5iZWdpbigpOyBpdCAhPSBvYnNlcnZlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiBvYnNlcnZlciA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmIChvYnNlcnZlcikgeworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gb2JzZXJ2ZXItPm9uTWVzc2FnZShpdC0+Zmlyc3QsIGludmFsaWRhdGlvbklkKTsKKyAgICAgICAgICAgICh2b2lkKSB0cmFuc1Jlc3VsdDsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbUJ1ZmZlclBvb2wuaXNWYWxpZCgpOworfQorCitBY2Nlc3Nvcjo6SW1wbDo6SW1wbDo6QnVmZmVyUG9vbDo6QnVmZmVyUG9vbCgpCisgICAgOiBtVGltZXN0YW1wVXMoZ2V0VGltZXN0YW1wTm93KCkpLAorICAgICAgbUxhc3RDbGVhblVwVXMobVRpbWVzdGFtcFVzKSwKKyAgICAgIG1MYXN0TG9nVXMobVRpbWVzdGFtcFVzKSwKKyAgICAgIG1TZXEoMCksCisgICAgICBtU3RhcnRTZXEoMCkgeworICAgIG1WYWxpZCA9IG1JbnZhbGlkYXRpb25DaGFubmVsLmlzVmFsaWQoKTsKK30KKworCisvLyBTdGF0aXN0aWNzIGhlbHBlcgordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUz4KK2ludCBwZXJjZW50YWdlKFQgYmFzZSwgUyB0b3RhbCkgeworICAgIHJldHVybiBpbnQodG90YWwgPyAwLjUgKyAxMDAuICogc3RhdGljX2Nhc3Q8Uz4oYmFzZSkgLyB0b3RhbCA6IDApOworfQorCitzdGQ6OmF0b21pYzxzdGQ6OnVpbnQzMl90PiBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpzSW52U2VxSWQoMCk7CisKK0FjY2Vzc29yOjpJbXBsOjpJbXBsOjpCdWZmZXJQb29sOjp+QnVmZmVyUG9vbCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIEFMT0dEKCJEZXN0cnVjdGlvbiAtIGJ1ZmZlcnBvb2wyICVwICIKKyAgICAgICAgICAiY2FjaGVkOiAlenUvJXp1TSwgJXp1LyVkJSUgaW4gdXNlOyAiCisgICAgICAgICAgImFsbG9jczogJXp1LCAlZCUlIHJlY3ljbGVkOyAiCisgICAgICAgICAgInRyYW5zZmVyczogJXp1LCAlZCUlIHVuZmV0Y2VkIiwKKyAgICAgICAgICB0aGlzLCBtU3RhdHMubUJ1ZmZlcnNDYWNoZWQsIG1TdGF0cy5tU2l6ZUNhY2hlZCA+PiAyMCwKKyAgICAgICAgICBtU3RhdHMubUJ1ZmZlcnNJblVzZSwgcGVyY2VudGFnZShtU3RhdHMubUJ1ZmZlcnNJblVzZSwgbVN0YXRzLm1CdWZmZXJzQ2FjaGVkKSwKKyAgICAgICAgICBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMsIHBlcmNlbnRhZ2UobVN0YXRzLm1Ub3RhbFJlY3ljbGVzLCBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMpLAorICAgICAgICAgIG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMsCisgICAgICAgICAgcGVyY2VudGFnZShtU3RhdHMubVRvdGFsVHJhbnNmZXJzIC0gbVN0YXRzLm1Ub3RhbEZldGNoZXMsIG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMpKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpvbkNvbm5lY3QoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25JZCwgY29uc3Qgc3A8SU9ic2VydmVyPiYgb2JzZXJ2ZXIpIHsKKyAgICBtQWNrc1tjb25JZF0gPSBtSW52YWxpZGF0aW9uSWQ7IC8vIHN0YXJ0cyBmcm9tIGN1cnJlbnQgaW52YWxpZGF0aW9uSWQKKyAgICBtT2JzZXJ2ZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgb2JzZXJ2ZXIpKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpvbkNsb3NlKENvbm5lY3Rpb25JZCBjb25JZCkgeworICAgIG1BY2tzLmVyYXNlKGNvbklkKTsKKyAgICBtT2JzZXJ2ZXJzLmVyYXNlKGNvbklkKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpvbkFjaygKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbklkLAorICAgICAgICB1aW50MzJfdCBtc2dJZCkgeworICAgIGF1dG8gaXQgPSBtQWNrcy5maW5kKGNvbklkKTsKKyAgICBpZiAoaXQgPT0gbUFja3MuZW5kKCkpIHsKKyAgICAgICAgQUxPR1coIkFDSyBmcm9tIGluY29uc2lzdGVudCBjb25uZWN0aW9uISAlbGxkIiwgKGxvbmcgbG9uZyljb25JZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGlzTWVzc2FnZUxhdGVyKG1zZ0lkLCBpdC0+c2Vjb25kKSkgeworICAgICAgICBtQWNrc1tjb25JZF0gPSBtc2dJZDsKKyAgICB9Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25CdWZmZXJJbnZhbGlkYXRlZCgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwgJmNoYW5uZWwpIHsKKyAgICBmb3IgKGF1dG8gaXQgPSBtUGVuZGluZ3MuYmVnaW4oKTsgaXQgIT0gbVBlbmRpbmdzLmVuZCgpOykgeworICAgICAgICBpZiAoaXQtPmlzSW52YWxpZGF0ZWQoYnVmZmVySWQpKSB7CisgICAgICAgICAgICB1aW50MzJfdCBtc2dJZCA9IDA7CisgICAgICAgICAgICBpZiAoaXQtPm1OZWVkc0FjaykgeworICAgICAgICAgICAgICAgIG1zZ0lkID0gKyttSW52YWxpZGF0aW9uSWQ7CisgICAgICAgICAgICAgICAgaWYgKG1zZ0lkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd3JhcCBoYXBwZW5zCisgICAgICAgICAgICAgICAgICAgIG1zZ0lkID0gKyttSW52YWxpZGF0aW9uSWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhbm5lbC5wb3N0SW52YWxpZGF0aW9uKG1zZ0lkLCBpdC0+bUZyb20sIGl0LT5tVG8pOworICAgICAgICAgICAgaXQgPSBtUGVuZGluZ3MuZXJhc2UoaXQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgKytpdDsKKyAgICB9Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25JbnZhbGlkYXRpb25SZXF1ZXN0KAorICAgICAgICBib29sIG5lZWRzQWNrLAorICAgICAgICB1aW50MzJfdCBmcm9tLAorICAgICAgICB1aW50MzJfdCB0bywKKyAgICAgICAgc2l6ZV90IGxlZnQsCisgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwgJmNoYW5uZWwsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpIHsKKyAgICAgICAgdWludDMyX3QgbXNnSWQgPSAwOworICAgIGlmIChuZWVkc0FjaykgeworICAgICAgICBtc2dJZCA9ICsrbUludmFsaWRhdGlvbklkOworICAgICAgICBpZiAobXNnSWQgPT0gMCkgeworICAgICAgICAgICAgLy8gd3JhcCBoYXBwZW5zCisgICAgICAgICAgICBtc2dJZCA9ICsrbUludmFsaWRhdGlvbklkOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJidWZmZXJwb29sMiBpbnZhbGlkYXRpb24gcmVxdWVzdGVkIGFuZCBxdWV1ZWQiKTsKKyAgICBpZiAobGVmdCA9PSAwKSB7CisgICAgICAgIGNoYW5uZWwucG9zdEludmFsaWRhdGlvbihtc2dJZCwgZnJvbSwgdG8pOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRPRE86IHNlbmRpbmcgaGludCBtZXNzYWdlPworICAgICAgICBBTE9HVigiYnVmZmVycG9vMiBpbnZhbGlkYXRpb24gcmVxdWVzdGVkIGFuZCBwZW5kaW5nIik7CisgICAgICAgIFBlbmRpbmcgcGVuZGluZyhuZWVkc0FjaywgZnJvbSwgdG8sIGxlZnQsIGltcGwpOworICAgICAgICBtUGVuZGluZ3MucHVzaF9iYWNrKHBlbmRpbmcpOworICAgIH0KKyAgICBzSW52YWxpZGF0b3ItPmFkZEFjY2Vzc29yKG1JZCwgaW1wbCk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25IYW5kbGVBY2soCisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3A8SU9ic2VydmVyPj4gKm9ic2VydmVycywKKyAgICAgICAgdWludDMyX3QgKmludmFsaWRhdGlvbklkKSB7CisgICAgaWYgKG1JbnZhbGlkYXRpb25JZCAhPSAwKSB7CisgICAgICAgICppbnZhbGlkYXRpb25JZCA9IG1JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgc3RkOjpzZXQ8aW50PiBkZWFkczsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUFja3MuYmVnaW4oKTsgaXQgIT0gbUFja3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGlmIChpdC0+c2Vjb25kICE9IG1JbnZhbGlkYXRpb25JZCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBtT2JzZXJ2ZXJzW2l0LT5maXJzdF07CisgICAgICAgICAgICAgICAgaWYgKG9ic2VydmVyKSB7CisgICAgICAgICAgICAgICAgICAgIG9ic2VydmVycy0+ZW1wbGFjZShpdC0+Zmlyc3QsIG9ic2VydmVyKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNvbm5lY3Rpb24gJWxsZCB3aWxsIGNhbGwgb2JzZXJ2ZXIgKCV1OiAldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWl0LT5maXJzdCwgaXQtPnNlY29uZCwgbUludmFsaWRhdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gTi5COiBvbk1lc3NhZ2Ugd2lsbCBiZSBjYWxsZWQgbGF0ZXIuIGlnbm9yZSBwb3NzaWJpbGl0eSBvZgorICAgICAgICAgICAgICAgICAgICAvLyBvbk1lc3NhZ2UjIG9uZXdheSBjYWxsIGJlaW5nIGxvc3QuCisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQgPSBtSW52YWxpZGF0aW9uSWQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImJ1ZmZlcnBvb2wyIG9ic2VydmVyIGRpZWQgJWxsZCIsIChsb25nIGxvbmcpaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICAgICAgZGVhZHMuaW5zZXJ0KGl0LT5maXJzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkZWFkcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBkZWFkcy5iZWdpbigpOyBpdCAhPSBkZWFkcy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgIG9uQ2xvc2UoKml0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobVBlbmRpbmdzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIC8vIEFsbCBpbnZhbGlkYXRpb24gSWRzIGFyZSBzeW5jZWQgYW5kIG5vIG1vcmUgcGVuZGluZyBpbnZhbGlkYXRpb25zLgorICAgICAgICBzSW52YWxpZGF0b3ItPmRlbEFjY2Vzc29yKG1JZCk7CisgICAgfQorfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVPd25CdWZmZXIoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisKKyAgICBib29sIGFkZGVkID0gaW5zZXJ0KCZtVXNpbmdCdWZmZXJzLCBjb25uZWN0aW9uSWQsIGJ1ZmZlcklkKTsKKyAgICBpZiAoYWRkZWQpIHsKKyAgICAgICAgYXV0byBpdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgIGl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQrKzsKKyAgICB9CisgICAgaW5zZXJ0KCZtVXNpbmdDb25uZWN0aW9ucywgYnVmZmVySWQsIGNvbm5lY3Rpb25JZCk7CisgICAgcmV0dXJuIGFkZGVkOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVSZWxlYXNlQnVmZmVyKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCkgeworICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtVXNpbmdCdWZmZXJzLCBjb25uZWN0aW9uSWQsIGJ1ZmZlcklkKTsKKyAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICBhdXRvIGl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgaXRlci0+c2Vjb25kLT5tT3duZXJDb3VudC0tOworICAgICAgICBpZiAoaXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICBpZiAoIWl0ZXItPnNlY29uZC0+bUludmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChpdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoaXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShpdGVyKTsKKyAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uLm9uQnVmZmVySW52YWxpZGF0ZWQoYnVmZmVySWQsIG1JbnZhbGlkYXRpb25DaGFubmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlcmFzZSgmbVVzaW5nQ29ubmVjdGlvbnMsIGJ1ZmZlcklkLCBjb25uZWN0aW9uSWQpOworICAgIEFMT0dWKCJyZWxlYXNlIGJ1ZmZlciAldSA6ICVkIiwgYnVmZmVySWQsIGRlbGV0ZWQpOworICAgIHJldHVybiBkZWxldGVkOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVUcmFuc2ZlclRvKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBhdXRvIGNvbXBsZXRlZCA9IG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuZmluZCgKKyAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGNvbXBsZXRlZCAhPSBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIC8vIGFscmVhZHkgY29tcGxldGVkCisgICAgICAgIG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuZXJhc2UoY29tcGxldGVkKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vIHRoZSBidWZmZXIgc2hvdWxkIGV4aXN0IGFuZCBiZSBvd25lZC4KKyAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKG1lc3NhZ2UuYnVmZmVySWQpOworICAgIGlmIChidWZmZXJJdGVyID09IG1CdWZmZXJzLmVuZCgpIHx8CisgICAgICAgICAgICAhY29udGFpbnMoJm1Vc2luZ0J1ZmZlcnMsIG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gZm91bmQgPSBtVHJhbnNhY3Rpb25zLmZpbmQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgIT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAvLyB0cmFuc2Zlcl9mcm9tIHdhcyByZWNlaXZlZCBlYXJsaWVyLgorICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU2VuZGVyID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gVE9ETzogdmVyaWZ5IHRoZXJlIGlzIHRhcmdldCBjb25uZWN0aW9uIElkCisgICAgbVN0YXRzLm9uQnVmZmVyU2VudCgpOworICAgIG1UcmFuc2FjdGlvbnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2FjdGlvblN0YXR1cz4obWVzc2FnZSwgbVRpbWVzdGFtcFVzKSkpOworICAgIGluc2VydCgmbVBlbmRpbmdUcmFuc2FjdGlvbnMsIG1lc3NhZ2UudGFyZ2V0Q29ubmVjdGlvbklkLAorICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQrKzsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlVHJhbnNmZXJGcm9tKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBhdXRvIGZvdW5kID0gbVRyYW5zYWN0aW9ucy5maW5kKG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kID09IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgLy8gVE9ETzogaXMgaXQgZmVhc2libGUgdG8gY2hlY2sgb3duZXJzaGlwIGhlcmU/CisgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclNlbnQoKTsKKyAgICAgICAgbVRyYW5zYWN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8VHJhbnNhY3Rpb25TdGF0dXM+KG1lc3NhZ2UsIG1UaW1lc3RhbXBVcykpKTsKKyAgICAgICAgaW5zZXJ0KCZtUGVuZGluZ1RyYW5zYWN0aW9ucywgbWVzc2FnZS5jb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50Kys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1lc3NhZ2UuY29ubmVjdGlvbklkID09IGZvdW5kLT5zZWNvbmQtPm1SZWNlaXZlcikgeworICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bVN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlVHJhbnNmZXJSZXN1bHQoY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGF1dG8gZm91bmQgPSBtVHJhbnNhY3Rpb25zLmZpbmQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgIT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICBib29sIGRlbGV0ZWQgPSBlcmFzZSgmbVBlbmRpbmdUcmFuc2FjdGlvbnMsIG1lc3NhZ2UuY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgICAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICAgICAgaWYgKCFmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5pbnNlcnQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZS5uZXdTdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9PSykgeworICAgICAgICAgICAgICAgIGhhbmRsZU93bkJ1ZmZlcihtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50LS07CisgICAgICAgICAgICBpZiAoYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwCisgICAgICAgICAgICAgICAgJiYgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFidWZmZXJJdGVyLT5zZWNvbmQtPm1JbnZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShidWZmZXJJdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbi5vbkJ1ZmZlckludmFsaWRhdGVkKG1lc3NhZ2UuYnVmZmVySWQsIG1JbnZhbGlkYXRpb25DaGFubmVsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVHJhbnNhY3Rpb25zLmVyYXNlKGZvdW5kKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigidHJhbnNmZXIgZmluaXNoZWQgJWxsdSAldSAtICVkIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQsIGRlbGV0ZWQpOworICAgICAgICByZXR1cm4gZGVsZXRlZDsKKyAgICB9CisgICAgQUxPR1YoInRyYW5zZmVyIG5vdCBmb3VuZCAlbGx1ICV1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpwcm9jZXNzU3RhdHVzTWVzc2FnZXMoKSB7CisgICAgc3RkOjp2ZWN0b3I8QnVmZmVyU3RhdHVzTWVzc2FnZT4gbWVzc2FnZXM7CisgICAgbU9ic2VydmVyLmdldEJ1ZmZlclN0YXR1c0NoYW5nZXMobWVzc2FnZXMpOworICAgIG1UaW1lc3RhbXBVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgIGZvciAoQnVmZmVyU3RhdHVzTWVzc2FnZSYgbWVzc2FnZTogbWVzc2FnZXMpIHsKKyAgICAgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICAgICAgc3dpdGNoIChtZXNzYWdlLm5ld1N0YXR1cykgeworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VVNFRDoKKyAgICAgICAgICAgICAgICAvLyBub3QgaGFwcGVuaW5nCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVE86CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlVHJhbnNmZXJUbyhtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyRnJvbShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9USU1FT1VUOgorICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9MT1NUOgorICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GRVRDSDoKKyAgICAgICAgICAgICAgICAvLyBub3QgaGFwcGVuaW5nCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0s6CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRVJST1I6CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlVHJhbnNmZXJSZXN1bHQobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6SU5WQUxJREFUSU9OX0FDSzoKKyAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uLm9uQWNrKG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIEFMT0dXKCJidWZmZXIgc3RhdHVzIG1lc3NhZ2UgcHJvY2Vzc2luZyBmYWlsdXJlIC0gbWVzc2FnZSA6ICVkIGNvbm5lY3Rpb24gOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzLCAobG9uZyBsb25nKW1lc3NhZ2UuY29ubmVjdGlvbklkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtZXNzYWdlcy5jbGVhcigpOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVDbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgLy8gQ2xlYW5pbmcgYnVmZmVycworICAgIGF1dG8gYnVmZmVycyA9IG1Vc2luZ0J1ZmZlcnMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChidWZmZXJzICE9IG1Vc2luZ0J1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBCdWZmZXJJZCYgYnVmZmVySWQgOiBidWZmZXJzLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtVXNpbmdDb25uZWN0aW9ucywgYnVmZmVySWQsIGNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQtLTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGZyZWVidWZmZXIgaW5zZXJ0IGZhaWwKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFidWZmZXJJdGVyLT5zZWNvbmQtPm1JbnZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoYnVmZmVySXRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uLm9uQnVmZmVySW52YWxpZGF0ZWQoYnVmZmVySWQsIG1JbnZhbGlkYXRpb25DaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtVXNpbmdCdWZmZXJzLmVyYXNlKGJ1ZmZlcnMpOworICAgIH0KKworICAgIC8vIENsZWFuaW5nIHRyYW5zYWN0aW9ucworICAgIGF1dG8gcGVuZGluZyA9IG1QZW5kaW5nVHJhbnNhY3Rpb25zLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAocGVuZGluZyAhPSBtUGVuZGluZ1RyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICBmb3IgKGNvbnN0IFRyYW5zYWN0aW9uSWQmIHRyYW5zYWN0aW9uSWQgOiBwZW5kaW5nLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIGF1dG8gaXRlciA9IG1UcmFuc2FjdGlvbnMuZmluZCh0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgIGlmIChpdGVyICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWl0ZXItPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmluc2VydCh0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQgPSBpdGVyLT5zZWNvbmQtPm1CdWZmZXJJZDsKKyAgICAgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50LS07CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGZyZWVidWZmZXIgaW5zZXJ0IGZhaWwKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFidWZmZXJJdGVyLT5zZWNvbmQtPm1JbnZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoYnVmZmVySXRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uLm9uQnVmZmVySW52YWxpZGF0ZWQoYnVmZmVySWQsIG1JbnZhbGlkYXRpb25DaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVHJhbnNhY3Rpb25zLmVyYXNlKGl0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpnZXRGcmVlQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywgQnVmZmVySWQgKnBJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgYXV0byBidWZmZXJJdCA9IG1GcmVlQnVmZmVycy5iZWdpbigpOworICAgIGZvciAoO2J1ZmZlckl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKTsgKytidWZmZXJJdCkgeworICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCA9ICpidWZmZXJJdDsKKyAgICAgICAgaWYgKGFsbG9jYXRvci0+Y29tcGF0aWJsZShwYXJhbXMsIG1CdWZmZXJzW2J1ZmZlcklkXS0+bUNvbmZpZykpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChidWZmZXJJdCAhPSBtRnJlZUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgQnVmZmVySWQgaWQgPSAqYnVmZmVySXQ7CisgICAgICAgIG1GcmVlQnVmZmVycy5lcmFzZShidWZmZXJJdCk7CisgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclJlY3ljbGVkKG1CdWZmZXJzW2lkXS0+bUFsbG9jU2l6ZSk7CisgICAgICAgICpoYW5kbGUgPSBtQnVmZmVyc1tpZF0tPmhhbmRsZSgpOworICAgICAgICAqcElkID0gaWQ7CisgICAgICAgIEFMT0dWKCJyZWN5Y2xlIGEgYnVmZmVyICV1ICVwIiwgaWQsICpoYW5kbGUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmFkZE5ld0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY1NpemUsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpwSWQsCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworCisgICAgQnVmZmVySWQgYnVmZmVySWQgPSBtU2VxKys7CisgICAgaWYgKG1TZXEgPT0gQ29ubmVjdGlvbjo6U1lOQ19CVUZGRVJJRCkgeworICAgICAgICBtU2VxID0gMDsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPEludGVybmFsQnVmZmVyPiBidWZmZXIgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxJbnRlcm5hbEJ1ZmZlcj4oCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklkLCBhbGxvYywgYWxsb2NTaXplLCBwYXJhbXMpOworICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgYXV0byByZXMgPSBtQnVmZmVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgYnVmZmVySWQsIHN0ZDo6bW92ZShidWZmZXIpKSk7CisgICAgICAgIGlmIChyZXMuc2Vjb25kKSB7CisgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJBbGxvY2F0ZWQoYWxsb2NTaXplKTsKKyAgICAgICAgICAgICpoYW5kbGUgPSBhbGxvYy0+aGFuZGxlKCk7CisgICAgICAgICAgICAqcElkID0gYnVmZmVySWQ7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKGNsZWFyQ2FjaGUgfHwgbVRpbWVzdGFtcFVzID4gbUxhc3RDbGVhblVwVXMgKyBrQ2xlYW5VcER1cmF0aW9uVXMpIHsKKyAgICAgICAgbUxhc3RDbGVhblVwVXMgPSBtVGltZXN0YW1wVXM7CisgICAgICAgIGlmIChtVGltZXN0YW1wVXMgPiBtTGFzdExvZ1VzICsga0xvZ0R1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgIG1MYXN0TG9nVXMgPSBtVGltZXN0YW1wVXM7CisgICAgICAgICAgICBBTE9HRCgiYnVmZmVycG9vbDIgJXAgOiAlenUoJXp1IHNpemUpIHRvdGFsIGJ1ZmZlcnMgLSAiCisgICAgICAgICAgICAgICAgICAiJXp1KCV6dSBzaXplKSB1c2VkIGJ1ZmZlcnMgLSAlenUvJXp1IChyZWN5Y2xlL2FsbG9jKSAtICIKKyAgICAgICAgICAgICAgICAgICIlenUvJXp1IChmZXRjaC90cmFuc2ZlcikiLAorICAgICAgICAgICAgICAgICAgdGhpcywgbVN0YXRzLm1CdWZmZXJzQ2FjaGVkLCBtU3RhdHMubVNpemVDYWNoZWQsCisgICAgICAgICAgICAgICAgICBtU3RhdHMubUJ1ZmZlcnNJblVzZSwgbVN0YXRzLm1TaXplSW5Vc2UsCisgICAgICAgICAgICAgICAgICBtU3RhdHMubVRvdGFsUmVjeWNsZXMsIG1TdGF0cy5tVG90YWxBbGxvY2F0aW9ucywKKyAgICAgICAgICAgICAgICAgIG1TdGF0cy5tVG90YWxGZXRjaGVzLCBtU3RhdHMubVRvdGFsVHJhbnNmZXJzKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8gZnJlZUl0ID0gbUZyZWVCdWZmZXJzLmJlZ2luKCk7IGZyZWVJdCAhPSBtRnJlZUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgICAgICBpZiAoIWNsZWFyQ2FjaGUgJiYgbVN0YXRzLm1TaXplQ2FjaGVkIDwga01pbkFsbG9jQnl0ZXNGb3JFdmljdGlvbgorICAgICAgICAgICAgICAgICAgICAmJiBtQnVmZmVycy5zaXplKCkgPCBrTWluQnVmZmVyQ291bnRGb3JFdmljdGlvbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBpdCA9IG1CdWZmZXJzLmZpbmQoKmZyZWVJdCk7CisgICAgICAgICAgICBpZiAoaXQgIT0gbUJ1ZmZlcnMuZW5kKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJiBpdC0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChpdC0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgZnJlZUl0ID0gbUZyZWVCdWZmZXJzLmVyYXNlKGZyZWVJdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICsrZnJlZUl0OworICAgICAgICAgICAgICAgIEFMT0dXKCJidWZmZXJwb29sMiBpbmNvbnNpc3RlbnQhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmludmFsaWRhdGUoCisgICAgICAgIGJvb2wgbmVlZHNBY2ssIEJ1ZmZlcklkIGZyb20sIEJ1ZmZlcklkIHRvLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKSB7CisgICAgZm9yIChhdXRvIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5iZWdpbigpOyBmcmVlSXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOykgeworICAgICAgICBpZiAoaXNCdWZmZXJJblJhbmdlKGZyb20sIHRvLCAqZnJlZUl0KSkgeworICAgICAgICAgICAgYXV0byBpdCA9IG1CdWZmZXJzLmZpbmQoKmZyZWVJdCk7CisgICAgICAgICAgICBpZiAoaXQgIT0gbUJ1ZmZlcnMuZW5kKCkgJiYKKyAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmIGl0LT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJFdmljdGVkKGl0LT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBmcmVlSXQgPSBtRnJlZUJ1ZmZlcnMuZXJhc2UoZnJlZUl0KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImJ1ZmZlcnBvb2wyIGluY29uc2lzdGVudCEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICArK2ZyZWVJdDsKKyAgICB9CisKKyAgICBzaXplX3QgbGVmdCA9IDA7CisgICAgZm9yIChhdXRvIGl0ID0gbUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUJ1ZmZlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGlzQnVmZmVySW5SYW5nZShmcm9tLCB0bywgaXQtPmZpcnN0KSkgeworICAgICAgICAgICAgaXQtPnNlY29uZC0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgKytsZWZ0OworICAgICAgICB9CisgICAgfQorICAgIG1JbnZhbGlkYXRpb24ub25JbnZhbGlkYXRpb25SZXF1ZXN0KG5lZWRzQWNrLCBmcm9tLCB0bywgbGVmdCwgbUludmFsaWRhdGlvbkNoYW5uZWwsIGltcGwpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpmbHVzaChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKSB7CisgICAgQnVmZmVySWQgZnJvbSA9IG1TdGFydFNlcTsKKyAgICBCdWZmZXJJZCB0byA9IG1TZXE7CisgICAgbVN0YXJ0U2VxID0gbVNlcTsKKyAgICAvLyBUT0RPOiBuZWVkc0FjayBwYXJhbXMgCisgICAgQUxPR1YoImJ1ZmZlciBpbnZhbGlkYXRpb24gcmVxdWVzdCBicDoldSAldSAldSIsIG1JbnZhbGlkYXRpb24ubUlkLCBmcm9tLCB0byk7CisgICAgaWYgKGZyb20gIT0gdG8pIHsKKyAgICAgICAgaW52YWxpZGF0ZSh0cnVlLCBmcm9tLCB0bywgaW1wbCk7CisgICAgfQorfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjppbnZhbGlkYXRvclRocmVhZCgKKyAgICAgICAgICAgIHN0ZDo6bWFwPHVpbnQzMl90LCBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPj4gJmFjY2Vzc29ycywKKyAgICAgICAgICAgIHN0ZDo6bXV0ZXggJm11dGV4LAorICAgICAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgJmN2LAorICAgICAgICAgICAgYm9vbCAmcmVhZHkpIHsKKyAgICB3aGlsZSh0cnVlKSB7CisgICAgICAgIHN0ZDo6bWFwPHVpbnQzMl90LCBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPj4gY29waWVkOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOworICAgICAgICAgICAgaWYgKCFyZWFkeSkgeworICAgICAgICAgICAgICAgIGN2LndhaXQobG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3BpZWQuaW5zZXJ0KGFjY2Vzc29ycy5iZWdpbigpLCBhY2Nlc3NvcnMuZW5kKCkpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6bGlzdDxDb25uZWN0aW9uSWQ+IGVyYXNlZDsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gY29waWVkLmJlZ2luKCk7IGl0ICE9IGNvcGllZC5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiBpbXBsID0gaXQtPnNlY29uZC5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIWltcGwpIHsKKyAgICAgICAgICAgICAgICBlcmFzZWQucHVzaF9iYWNrKGl0LT5maXJzdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGltcGwtPmhhbmRsZUludmFsaWRhdGVBY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOworICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gZXJhc2VkLmJlZ2luKCk7IGl0ICE9IGVyYXNlZC5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgIGFjY2Vzc29ycy5lcmFzZSgqaXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFjY2Vzc29ycy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHJlYWR5ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgZHJhaW5pbmcgY3B1LgorICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6eWllbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworQWNjZXNzb3I6OkltcGw6OkFjY2Vzc29ySW52YWxpZGF0b3I6OkFjY2Vzc29ySW52YWxpZGF0b3IoKSA6IG1SZWFkeShmYWxzZSkgeworICAgIHN0ZDo6dGhyZWFkIGludmFsaWRhdG9yKAorICAgICAgICAgICAgaW52YWxpZGF0b3JUaHJlYWQsCisgICAgICAgICAgICBzdGQ6OnJlZihtQWNjZXNzb3JzKSwKKyAgICAgICAgICAgIHN0ZDo6cmVmKG1NdXRleCksCisgICAgICAgICAgICBzdGQ6OnJlZihtQ3YpLAorICAgICAgICAgICAgc3RkOjpyZWYobVJlYWR5KSk7CisgICAgaW52YWxpZGF0b3IuZGV0YWNoKCk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkFjY2Vzc29ySW52YWxpZGF0b3I6OmFkZEFjY2Vzc29yKAorICAgICAgICB1aW50MzJfdCBhY2Nlc3NvcklkLCBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCkgeworICAgIGJvb2wgbm90aWZ5ID0gZmFsc2U7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgaWYgKG1BY2Nlc3NvcnMuZmluZChhY2Nlc3NvcklkKSA9PSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgIGlmICghbVJlYWR5KSB7CisgICAgICAgICAgICBtUmVhZHkgPSB0cnVlOworICAgICAgICAgICAgbm90aWZ5ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtQWNjZXNzb3JzLmluc2VydChzdGQ6Om1ha2VfcGFpcihhY2Nlc3NvcklkLCBpbXBsKSk7CisgICAgICAgIEFMT0dWKCJidWZmZXIgaW52YWxpZGF0aW9uIGFkZGVkIGJwOiV1ICVkIiwgYWNjZXNzb3JJZCwgbm90aWZ5KTsKKyAgICB9CisgICAgbG9jay51bmxvY2soKTsKKyAgICBpZiAobm90aWZ5KSB7CisgICAgICAgIG1Ddi5ub3RpZnlfb25lKCk7CisgICAgfQorfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpBY2Nlc3NvckludmFsaWRhdG9yOjpkZWxBY2Nlc3Nvcih1aW50MzJfdCBhY2Nlc3NvcklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBtQWNjZXNzb3JzLmVyYXNlKGFjY2Vzc29ySWQpOworICAgIEFMT0dWKCJidWZmZXIgaW52YWxpZGF0aW9uIGRlbGV0ZWQgYnA6JXUiLCBhY2Nlc3NvcklkKTsKKyAgICBpZiAobUFjY2Vzc29ycy5zaXplKCkgPT0gMCkgeworICAgICAgICBtUmVhZHkgPSBmYWxzZTsKKyAgICB9Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxBY2Nlc3Nvcjo6SW1wbDo6QWNjZXNzb3JJbnZhbGlkYXRvcj4gQWNjZXNzb3I6OkltcGw6OnNJbnZhbGlkYXRvcjsKKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6Y3JlYXRlSW52YWxpZGF0b3IoKSB7CisgICAgaWYgKCFzSW52YWxpZGF0b3IpIHsKKyAgICAgICAgc0ludmFsaWRhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxBY2Nlc3Nvcjo6SW1wbDo6QWNjZXNzb3JJbnZhbGlkYXRvcj4oKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhNzJiOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5oCkBAIC0wLDAgKzEsNDAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9BQ0NFU1NPUklNUExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9BQ0NFU1NPUklNUExfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitzdHJ1Y3QgSW50ZXJuYWxCdWZmZXI7CitzdHJ1Y3QgVHJhbnNhY3Rpb25TdGF0dXM7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgYSBidWZmZXIgcG9vbCBhY2Nlc3NvcihvciBhIGJ1ZmZlciBwb29sIGltcGxlbWVudGF0aW9uLikgKi8KK2NsYXNzIEFjY2Vzc29yOjpJbXBsCisgICAgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxBY2Nlc3Nvcjo6SW1wbD4geworcHVibGljOgorICAgIEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgfkltcGwoKTsKKworICAgIFJlc3VsdFN0YXR1cyBjb25uZWN0KAorICAgICAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIsCisgICAgICAgICAgICBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpwTXNnSWQsCisgICAgICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiogc3RhdHVzRGVzY1B0ciwKKyAgICAgICAgICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IqKiBpbnZEZXNjUHRyKTsKKworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICBSZXN1bHRTdGF0dXMgZmV0Y2goQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIHZvaWQgZmx1c2goKTsKKworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUpOworCisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICB2b2lkIGhhbmRsZUludmFsaWRhdGVBY2soKTsKKworICAgIHN0YXRpYyB2b2lkIGNyZWF0ZUludmFsaWRhdG9yKCk7CisKK3ByaXZhdGU6CisgICAgLy8gQ29ubmVjdGlvbklkID0gcGlkIDogKHRpbWVzdGFtcF9jcmVhdGVkICsgc2VxSWQpCisgICAgLy8gaW4gb3JkZXIgdG8gZ3VhcmFudGVlIHVuaXF1ZW5lc3MgZm9yIGVhY2ggY29ubmVjdGlvbgorICAgIHN0YXRpYyB1aW50MzJfdCBzU2VxSWQ7CisgICAgc3RhdGljIGludDMyX3Qgc1BpZDsKKworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworCisgICAgLyoqCisgICAgICogQnVmZmVyIHBvb2wgaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBIYW5kbGVzIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMuIEhhbmRsZXMgYnVmZmVyIGFsbG9jYXRpb24vcmVjeWNsaW5nLgorICAgICAqIEhhbmRsZXMgYnVmZmVyIHRyYW5zZmVyIGJldHdlZW4gYnVmZmVyIHBvb2wgY2xpZW50cy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQnVmZmVyUG9vbCB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIGludDY0X3QgbVRpbWVzdGFtcFVzOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2xlYW5VcFVzOworICAgICAgICBpbnQ2NF90IG1MYXN0TG9nVXM7CisgICAgICAgIEJ1ZmZlcklkIG1TZXE7CisgICAgICAgIEJ1ZmZlcklkIG1TdGFydFNlcTsKKyAgICAgICAgYm9vbCBtVmFsaWQ7CisgICAgICAgIEJ1ZmZlclN0YXR1c09ic2VydmVyIG1PYnNlcnZlcjsKKyAgICAgICAgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCBtSW52YWxpZGF0aW9uQ2hhbm5lbDsKKworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6c2V0PEJ1ZmZlcklkPj4gbVVzaW5nQnVmZmVyczsKKyAgICAgICAgc3RkOjptYXA8QnVmZmVySWQsIHN0ZDo6c2V0PENvbm5lY3Rpb25JZD4+IG1Vc2luZ0Nvbm5lY3Rpb25zOworCisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgc3RkOjpzZXQ8VHJhbnNhY3Rpb25JZD4+IG1QZW5kaW5nVHJhbnNhY3Rpb25zOworICAgICAgICAvLyBUcmFuc2FjdGlvbnMgY29tcGxldGVkIGJlZm9yZSBUUkFOU0ZFUl9UTyBtZXNzYWdlIGFycml2YWwuCisgICAgICAgIC8vIEZldGNoIGRvZXMgbm90IG9jY3VyIGZvciB0aGUgdHJhbnNhY3Rpb25zLgorICAgICAgICAvLyBPbmx5IHRyYW5zYWN0aW9uIGlkIGlzIGtlcHQgZm9yIHRoZSB0cmFuc2FjdGlvbnMgaW4gc2hvcnQgZHVyYXRpb24uCisgICAgICAgIHN0ZDo6c2V0PFRyYW5zYWN0aW9uSWQ+IG1Db21wbGV0ZWRUcmFuc2FjdGlvbnM7CisgICAgICAgIC8vIEN1cnJlbnRseSBhY3RpdmUocGVuZGluZykgdHJhbnNhdGlvbnMnIHN0YXR1cyAmIGluZm9ybWF0aW9uLgorICAgICAgICBzdGQ6Om1hcDxUcmFuc2FjdGlvbklkLCBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNhY3Rpb25TdGF0dXM+PgorICAgICAgICAgICAgICAgIG1UcmFuc2FjdGlvbnM7CisKKyAgICAgICAgc3RkOjptYXA8QnVmZmVySWQsIHN0ZDo6dW5pcXVlX3B0cjxJbnRlcm5hbEJ1ZmZlcj4+IG1CdWZmZXJzOworICAgICAgICBzdGQ6OnNldDxCdWZmZXJJZD4gbUZyZWVCdWZmZXJzOworCisgICAgICAgIHN0cnVjdCBJbnZhbGlkYXRpb24geworICAgICAgICAgICAgc3RhdGljIHN0ZDo6YXRvbWljPHN0ZDo6dWludDMyX3Q+IHNJbnZTZXFJZDsKKworICAgICAgICAgICAgc3RydWN0IFBlbmRpbmcgeworICAgICAgICAgICAgICAgIGJvb2wgbU5lZWRzQWNrOworICAgICAgICAgICAgICAgIHVpbnQzMl90IG1Gcm9tOworICAgICAgICAgICAgICAgIHVpbnQzMl90IG1UbzsKKyAgICAgICAgICAgICAgICBzaXplX3QgbUxlZnQ7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gbUltcGw7CisgICAgICAgICAgICAgICAgUGVuZGluZyhib29sIG5lZWRzQWNrLCB1aW50MzJfdCBmcm9tLCB1aW50MzJfdCB0bywgc2l6ZV90IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBtTmVlZHNBY2sobmVlZHNBY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJvbShmcm9tKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvKHRvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUxlZnQobGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbXBsKGltcGwpCisgICAgICAgICAgICAgICAge30KKworICAgICAgICAgICAgICAgIGJvb2wgaXNJbnZhbGlkYXRlZCh1aW50MzJfdCBidWZmZXJJZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNCdWZmZXJJblJhbmdlKG1Gcm9tLCBtVG8sIGJ1ZmZlcklkKSAmJiAtLW1MZWZ0ID09IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc3RkOjpsaXN0PFBlbmRpbmc+IG1QZW5kaW5nczsKKyAgICAgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgdWludDMyX3Q+IG1BY2tzOworICAgICAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBjb25zdCBzcDxJT2JzZXJ2ZXI+PiBtT2JzZXJ2ZXJzOworICAgICAgICAgICAgdWludDMyX3QgbUludmFsaWRhdGlvbklkOworICAgICAgICAgICAgdWludDMyX3QgbUlkOworCisgICAgICAgICAgICBJbnZhbGlkYXRpb24oKSA6IG1JbnZhbGlkYXRpb25JZCgwKSwgbUlkKHNJbnZTZXFJZC5mZXRjaF9hZGQoMSkpIHt9CisKKyAgICAgICAgICAgIHZvaWQgb25Db25uZWN0KENvbm5lY3Rpb25JZCBjb25JZCwgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpOworCisgICAgICAgICAgICB2b2lkIG9uQ2xvc2UoQ29ubmVjdGlvbklkIGNvbklkKTsKKworICAgICAgICAgICAgdm9pZCBvbkFjayhDb25uZWN0aW9uSWQgY29uSWQsIHVpbnQzMl90IG1zZ0lkKTsKKworICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckludmFsaWRhdGVkKAorICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCAmY2hhbm5lbCk7CisKKyAgICAgICAgICAgIHZvaWQgb25JbnZhbGlkYXRpb25SZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzQWNrLCB1aW50MzJfdCBmcm9tLCB1aW50MzJfdCB0bywgc2l6ZV90IGxlZnQsCisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwgJmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpOworCisgICAgICAgICAgICB2b2lkIG9uSGFuZGxlQWNrKAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHNwPElPYnNlcnZlcj4+ICpvYnNlcnZlcnMsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICppbnZhbGlkYXRpb25JZCk7CisgICAgICAgIH0gbUludmFsaWRhdGlvbjsKKyAgICAgICAgLy8vIEJ1ZmZlciBwb29sIHN0YXRpc3RpY3Mgd2hpY2ggdHJhY2tzIGFsbG9jYXRpb24gYW5kIHRyYW5zZmVyIHN0YXRpc3RpY3MuCisgICAgICAgIHN0cnVjdCBTdGF0cyB7CisgICAgICAgICAgICAvLy8gVG90YWwgc2l6ZSBvZiBhbGxvY2F0aW9ucyB3aGljaCBhcmUgdXNlZCBvciBhdmFpbGFibGUgdG8gdXNlLgorICAgICAgICAgICAgLy8vIChieXRlcyBvciBwaXhlbHMpCisgICAgICAgICAgICBzaXplX3QgbVNpemVDYWNoZWQ7CisgICAgICAgICAgICAvLy8gIyBvZiBjYWNoZWQgYnVmZmVycyB3aGljaCBhcmUgdXNlZCBvciBhdmFpbGFibGUgdG8gdXNlLgorICAgICAgICAgICAgc2l6ZV90IG1CdWZmZXJzQ2FjaGVkOworICAgICAgICAgICAgLy8vIFRvdGFsIHNpemUgb2YgYWxsb2NhdGlvbnMgd2hpY2ggYXJlIGN1cnJlbnRseSB1c2VkLiAoYnl0ZXMgb3IgcGl4ZWxzKQorICAgICAgICAgICAgc2l6ZV90IG1TaXplSW5Vc2U7CisgICAgICAgICAgICAvLy8gIyBvZiBjdXJyZW50bHkgdXNlZCBidWZmZXJzCisgICAgICAgICAgICBzaXplX3QgbUJ1ZmZlcnNJblVzZTsKKworICAgICAgICAgICAgLy8vICMgb2YgYWxsb2NhdGlvbnMgY2FsbGVkIG9uIGJ1ZmZlcnBvb2wuICgjIG9mIGZldGNoZWQgZnJvbSBCbG9ja1Bvb2wpCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsQWxsb2NhdGlvbnM7CisgICAgICAgICAgICAvLy8gIyBvZiBhbGxvY2F0aW9ucyB0aGF0IHdlcmUgc2VydmVkIGZyb20gdGhlIGNhY2hlLgorICAgICAgICAgICAgLy8vICgjIG9mIGFsbG9jYXRvciBhbGxvYyBwcmV2ZW50ZWQpCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsUmVjeWNsZXM7CisgICAgICAgICAgICAvLy8gIyBvZiBidWZmZXIgdHJhbnNmZXJzIGluaXRpYXRlZC4KKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxUcmFuc2ZlcnM7CisgICAgICAgICAgICAvLy8gIyBvZiB0cmFuc2ZlcnMgdGhhdCBoYWQgdG8gYmUgZmV0Y2hlZC4KKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxGZXRjaGVzOworCisgICAgICAgICAgICBTdGF0cygpCisgICAgICAgICAgICAgICAgOiBtU2l6ZUNhY2hlZCgwKSwgbUJ1ZmZlcnNDYWNoZWQoMCksIG1TaXplSW5Vc2UoMCksIG1CdWZmZXJzSW5Vc2UoMCksCisgICAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucygwKSwgbVRvdGFsUmVjeWNsZXMoMCksIG1Ub3RhbFRyYW5zZmVycygwKSwgbVRvdGFsRmV0Y2hlcygwKSB7fQorCisgICAgICAgICAgICAvLy8gQSBuZXcgYnVmZmVyIGlzIGFsbG9jYXRlZCBvbiBhbiBhbGxvY2F0aW9uIHJlcXVlc3QuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyQWxsb2NhdGVkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUNhY2hlZCArPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNDYWNoZWQrKzsKKworICAgICAgICAgICAgICAgIG1TaXplSW5Vc2UgKz0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzSW5Vc2UrKzsKKworICAgICAgICAgICAgICAgIG1Ub3RhbEFsbG9jYXRpb25zKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBpcyBldmljdGVkIGFuZCBkZXN0cm95ZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyRXZpY3RlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVDYWNoZWQgLT0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzQ2FjaGVkLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBpcyByZWN5Y2xlZCBvbiBhbiBhbGxvY2F0aW9uIHJlcXVlc3QuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyUmVjeWNsZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplSW5Vc2UgKz0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzSW5Vc2UrKzsKKworICAgICAgICAgICAgICAgIG1Ub3RhbEFsbG9jYXRpb25zKys7CisgICAgICAgICAgICAgICAgbVRvdGFsUmVjeWNsZXMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGlzIGF2YWlsYWJsZSB0byBiZSByZWN5Y2xlZC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJVbnVzZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplSW5Vc2UgLT0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzSW5Vc2UtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIHRyYW5zZmVyIGlzIGluaXRpYXRlZC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJTZW50KCkgeworICAgICAgICAgICAgICAgIG1Ub3RhbFRyYW5zZmVycysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgZmV0Y2ggaXMgaW52b2tlZCBieSBhIGJ1ZmZlciB0cmFuc2Zlci4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJGZXRjaGVkKCkgeworICAgICAgICAgICAgICAgIG1Ub3RhbEZldGNoZXMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBtU3RhdHM7CisKKyAgICAgICAgYm9vbCBpc1ZhbGlkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1WYWxpZDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgaW52YWxpZGF0ZShib29sIG5lZWRzQWNrLCBCdWZmZXJJZCBmcm9tLCBCdWZmZXJJZCB0bywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpOworCisgICAgICAgIHN0YXRpYyB2b2lkIGNyZWF0ZUludmFsaWRhdG9yKCk7CisKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKiBDcmVhdGVzIGEgYnVmZmVyIHBvb2wuICovCisgICAgICAgIEJ1ZmZlclBvb2woKTsKKworICAgICAgICAvKiogRGVzdHJveXMgYSBidWZmZXIgcG9vbC4gKi8KKyAgICAgICAgfkJ1ZmZlclBvb2woKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvY2Vzc2VzIGFsbCBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMsIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisgICAgICAgICAqIEVhY2ggc3RhdHVzIG1lc3NhZ2UgaXMgaGFuZGxlZCBieSBtZXRob2RzIHdpdGggJ2hhbmRsZScgcHJlZml4LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBwcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIGJ1ZmZlciBiZWluZyBvd25lZCBieSBhIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgYnVmZmVyIG93bmluZyBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgYnVmZmVyIGlzIG93bmVkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVPd25CdWZmZXIoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgYnVmZmVyIGJlaW5nIHJlbGVhc2VkIGJ5IGEgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHRoZSBidWZmZXIgb3duaW5nIGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIHRoZSBpZCBvZiB0aGUgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBidWZmZXIgb3duZXJzaGlwIGlzIHJlbGVhc2VkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVSZWxlYXNlQnVmZmVyKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHN0YXJ0IG1lc3NhZ2UgZnJvbSB0aGUgc2VuZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdHJhbnNmZXJfdG8gbWVzc2FnZSBpcyBhY2tub3dsZWRnZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVRyYW5zZmVyVG8oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBiZWluZyBhY2tlZCBieSB0aGUgcmVjZWl2ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlICAgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0cmFuc2Zlcl9mcm9tIG1lc3NhZ2UgaXMgYWNrbm93bGVkZ2VkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVUcmFuc2ZlckZyb20oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiByZXN1bHQgbWVzc2FnZSBmcm9tIHRoZSByZWNlaXZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgICBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRoZSBleGlzaXRuZyB0cmFuc2FjdGlvbiBpcyBmaW5pc2hlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlVHJhbnNmZXJSZXN1bHQoY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSBjb25uZWN0aW9uIGJlaW5nIGNsb3NlZCwgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4gQWxsIHRoZQorICAgICAgICAgKiBidWZmZXJzIGFuZCB0cmFuc2FjdGlvbnMgb3duZWQgYnkgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbGVhbmVkIHVwLgorICAgICAgICAgKiBUaGUgcmVsYXRlZCBGTVEgd2lsbCBiZSBjbGVhbmVkIHVwIHRvby4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRoZSBjb25uZWN0aW9uIGV4aXN0ZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZUNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWN5Y2xlcyBhIGV4aXN0aW5nIGZyZWUgYnVmZmVyIGlmIGl0IGlzIHBvc3NpYmxlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYWxsb2NhdG9yIHRoZSBidWZmZXIgYWxsb2NhdG9yCisgICAgICAgICAqIEBwYXJhbSBwYXJhbXMgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgICAgICogQHBhcmFtIHBJZCAgICAgICB0aGUgaWQgb2YgdGhlIHJlY3ljbGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIGhhbmRsZSAgICB0aGUgbmF0aXZlIGhhbmRsZSBvZiB0aGUgcmVjeWNsZWQgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIGEgYnVmZmVyIGlzIHJlY3ljbGVkLCB7QGNvZGUgZmFsc2V9CisgICAgICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBnZXRGcmVlQnVmZmVyKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgQnVmZmVySWQgKnBJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgdG8gYnVmZmVycG9vbC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFsbG9jICAgICB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIGFsbG9jU2l6ZSB0aGUgc2l6ZSBvZiB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIHBhcmFtcyAgICB0aGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAgICAgKiBAcGFyYW0gcElkICAgICAgIHRoZSBidWZmZXIgaWQgZm9yIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlICAgIHRoZSBuYXRpdmUgaGFuZGxlIGZvciB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBPSyB3aGVuIGFuIGFsbG9jYXRpb24gaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KKyAgICAgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgUmVzdWx0U3RhdHVzIGFkZE5ld0J1ZmZlcigKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NTaXplLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgQnVmZmVySWQgKnBJZCwKKyAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcm9jZXNzZXMgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGFuZCBwZXJmb3JtcyBwZXJpb2RpYyBjYWNoZQorICAgICAgICAgKiBjbGVhbmluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNsZWFyQ2FjaGUgICAgaWYgY2xlYXJDYWNoZSBpcyB0cnVlLCBpdCBmcmVlcyBhbGwgYnVmZmVycworICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3YWl0aW5nIHRvIGJlIHJlY3ljbGVkLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSA9IGZhbHNlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgaW52YWxpZGF0ZSBhbGwgY3VycmVudAorICAgICAgICAgKiBmcmVlIGJ1ZmZlcnMuIEFjdGl2ZSBidWZmZXJzIGFyZSBpbnZhbGlkYXRlZCBhZnRlciBiZWluZyBpbmFjdGl2ZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgZmx1c2goY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCk7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIEFjY2Vzc29yOjpJbXBsOworICAgIH0gbUJ1ZmZlclBvb2w7CisKKyAgICBzdHJ1Y3QgIEFjY2Vzc29ySW52YWxpZGF0b3IgeworICAgICAgICBzdGQ6Om1hcDx1aW50MzJfdCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4+IG1BY2Nlc3NvcnM7CisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ3Y7CisgICAgICAgIGJvb2wgbVJlYWR5OworCisgICAgICAgIEFjY2Vzc29ySW52YWxpZGF0b3IoKTsKKyAgICAgICAgdm9pZCBhZGRBY2Nlc3Nvcih1aW50MzJfdCBhY2Nlc3NvcklkLCBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCk7CisgICAgICAgIHZvaWQgZGVsQWNjZXNzb3IodWludDMyX3QgYWNjZXNzb3JJZCk7CisgICAgfTsKKworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QWNjZXNzb3JJbnZhbGlkYXRvcj4gc0ludmFsaWRhdG9yOworCisgICAgc3RhdGljIHZvaWQgaW52YWxpZGF0b3JUaHJlYWQoCisgICAgICAgIHN0ZDo6bWFwPHVpbnQzMl90LCBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPj4gJmFjY2Vzc29ycywKKyAgICAgICAgc3RkOjptdXRleCAmbXV0ZXgsCisgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlICZjdiwKKyAgICAgICAgYm9vbCAmcmVhZHkpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIHVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQUNDRVNTT1JJTVBMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FuZHJvaWQuYnAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MWFjMTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzMgQEAKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKKyAgICBzcmNzOiBbCisgICAgICAgICJBY2Nlc3Nvci5jcHAiLAorICAgICAgICAiQWNjZXNzb3JJbXBsLmNwcCIsCisgICAgICAgICJCdWZmZXJQb29sQ2xpZW50LmNwcCIsCisgICAgICAgICJCdWZmZXJTdGF0dXMuY3BwIiwKKyAgICAgICAgIkNsaWVudE1hbmFnZXIuY3BwIiwKKyAgICAgICAgIkNvbm5lY3Rpb24uY3BwIiwKKyAgICAgICAgIk9ic2VydmVyLmNwcCIsCisgICAgXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgIF0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclBvb2xDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MDdkZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmNwcApAQCAtMCwwICsxLDg2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbENsaWVudCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJCdWZmZXJQb29sQ2xpZW50LmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrUmVjZWl2ZVRpbWVvdXRVcyA9IDEwMDAwMDA7IC8vIDEwMG1zCitzdGF0aWMgY29uc3RleHByIGludCBrUG9zdE1heFJldHJ5ID0gMzsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtDYWNoZVR0bFVzID0gMTAwMDAwMDsgLy8gVE9ETzogdHVuZQorCitjbGFzcyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsCisgICAgICAgIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4geworcHVibGljOgorICAgIGV4cGxpY2l0IEltcGwoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpOworCisgICAgZXhwbGljaXQgSW1wbChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpOworCisgICAgYm9vbCBpc1ZhbGlkKCkgeworICAgICAgICByZXR1cm4gbVZhbGlkOworICAgIH0KKworICAgIGJvb2wgaXNMb2NhbCgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWxpZCAmJiBtTG9jYWw7CisgICAgfQorCisgICAgQ29ubmVjdGlvbklkIGdldENvbm5lY3Rpb25JZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db25uZWN0aW9uSWQ7CisgICAgfQorCisgICAgc3A8SUFjY2Vzc29yPiAmZ2V0QWNjZXNzb3IoKSB7CisgICAgICAgIHJldHVybiBtQWNjZXNzb3I7CisgICAgfQorCisgICAgYm9vbCBpc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKTsKKworICAgIHZvaWQgcmVjZWl2ZUludmFsaWRhdGlvbih1aW50MzJfdCBtc2dJRCk7CisKKyAgICBSZXN1bHRTdGF0dXMgZmx1c2goKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZSgKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgdm9pZCBwb3N0QnVmZmVyUmVsZWFzZShCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICBib29sIHBvc3RTZW5kKAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIENvbm5lY3Rpb25JZCByZWNlaXZlciwKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKK3ByaXZhdGU6CisKKyAgICBib29sIHBvc3RSZWNlaXZlKAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMpOworCisgICAgYm9vbCBwb3N0UmVjZWl2ZVJlc3VsdCgKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIGJvb2wgcmVzdWx0LCBib29sICpuZWVkc1N5bmMpOworCisgICAgdm9pZCB0cnlTeW5jRnJvbVJlbW90ZSgpOworCisgICAgYm9vbCBzeW5jUmVsZWFzZWQodWludDMyX3QgbXNnSWQgPSAwKTsKKworICAgIHZvaWQgZXZpY3RDYWNoZXMoYm9vbCBjbGVhckNhY2hlID0gZmFsc2UpOworCisgICAgdm9pZCBpbnZhbGlkYXRlQnVmZmVyKEJ1ZmZlcklkIGlkKTsKKworICAgIHZvaWQgaW52YWxpZGF0ZVJhbmdlKEJ1ZmZlcklkIGZyb20sIEJ1ZmZlcklkIHRvKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZUJ1ZmZlckhhbmRsZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICBSZXN1bHRTdGF0dXMgZmV0Y2hCdWZmZXJIYW5kbGUoCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgIHN0cnVjdCBCbG9ja1Bvb2xEYXRhRHRvcjsKKyAgICBzdHJ1Y3QgQ2xpZW50QnVmZmVyOworCisgICAgYm9vbCBtTG9jYWw7CisgICAgYm9vbCBtVmFsaWQ7CisgICAgc3A8SUFjY2Vzc29yPiBtQWNjZXNzb3I7CisgICAgc3A8Q29ubmVjdGlvbj4gbUxvY2FsQ29ubmVjdGlvbjsKKyAgICBzcDxJQ29ubmVjdGlvbj4gbVJlbW90ZUNvbm5lY3Rpb247CisgICAgdWludDMyX3QgbVNlcUlkOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICAgIGludDY0X3QgbUxhc3RFdmljdENhY2hlVXM7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyPiBtSW52YWxpZGF0aW9uTGlzdGVuZXI7CisKKyAgICAvLyBDYWNoZWRCdWZmZXJzCisgICAgc3RydWN0IEJ1ZmZlckNhY2hlIHsKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgYm9vbCBtQ3JlYXRpbmc7CisgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1DcmVhdGVDdjsKKyAgICAgICAgc3RkOjptYXA8QnVmZmVySWQsIHN0ZDo6dW5pcXVlX3B0cjxDbGllbnRCdWZmZXI+PiBtQnVmZmVyczsKKyAgICAgICAgaW50IG1BY3RpdmU7CisgICAgICAgIGludDY0X3QgbUxhc3RDaGFuZ2VVczsKKworICAgICAgICBCdWZmZXJDYWNoZSgpIDogbUNyZWF0aW5nKGZhbHNlKSwgbUFjdGl2ZSgwKSwgbUxhc3RDaGFuZ2VVcyhnZXRUaW1lc3RhbXBOb3coKSkge30KKworICAgICAgICB2b2lkIGluY0FjdGl2ZV9sKCkgeworICAgICAgICAgICAgKyttQWN0aXZlOworICAgICAgICAgICAgbUxhc3RDaGFuZ2VVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBkZWNBY3RpdmVfbCgpIHsKKyAgICAgICAgICAgIC0tbUFjdGl2ZTsKKyAgICAgICAgICAgIG1MYXN0Q2hhbmdlVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgfQorICAgIH0gbUNhY2hlOworCisgICAgLy8gRk1RIC0gcmVsZWFzZSBub3RpZmllcgorICAgIHN0cnVjdCBSZWxlYXNlQ2FjaGUgeworICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICAvLyBUT0RPOiB1c2Ugb25seSBvbmUgbGlzdD8odXNpbmcgb25lIGxpc3QgbWF5IGRlYWx5IHNlbmRpbmcgbWVzc2FnZXM/KQorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+IG1SZWxlYXNpbmdJZHM7CisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gbVJlbGVhc2VkSWRzOworICAgICAgICB1aW50MzJfdCBtSW52YWxpZGF0ZUlkOyAvLyBUT0RPOiBpbnZhbGlkYXRpb24gQUNLIHRvIGJ1ZmZlcnBvb2wKKyAgICAgICAgYm9vbCBtSW52YWxpZGF0ZUFjazsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c0NoYW5uZWw+IG1TdGF0dXNDaGFubmVsOworCisgICAgICAgIFJlbGVhc2VDYWNoZSgpIDogbUludmFsaWRhdGVJZCgwKSwgbUludmFsaWRhdGVBY2sodHJ1ZSkge30KKyAgICB9IG1SZWxlYXNpbmc7CisKKyAgICAvLyBUaGlzIGxvY2sgaXMgaGVsZCBkdXJpbmcgc3luY2hyb25pemF0aW9uIGZyb20gcmVtb3RlIHNpZGUuCisgICAgLy8gSW4gb3JkZXIgdG8gbWluaW1pemUgcmVtb3RlIGNhbGxzIGFuZCBsb2NraW5nIGR1cnRhaW9uLCB0aGlzIGxvY2sgaXMgaGVsZAorICAgIC8vIGJ5IGJlc3QgZWZmb3J0IGFwcHJvYWNoIHVzaW5nIHRyeV9sb2NrKCkuCisgICAgc3RkOjptdXRleCBtUmVtb3RlU3luY0xvY2s7Cit9OworCitzdHJ1Y3QgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6QmxvY2tQb29sRGF0YUR0b3IgeworICAgIEJsb2NrUG9vbERhdGFEdG9yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiAmaW1wbCkKKyAgICAgICAgICAgIDogbUltcGwoaW1wbCkge30KKworICAgIHZvaWQgb3BlcmF0b3IoKShCdWZmZXJQb29sRGF0YSAqYnVmZmVyKSB7CisgICAgICAgIEJ1ZmZlcklkIGlkID0gYnVmZmVyLT5tSWQ7CisgICAgICAgIGRlbGV0ZSBidWZmZXI7CisKKyAgICAgICAgYXV0byBpbXBsID0gbUltcGwubG9jaygpOworICAgICAgICBpZiAoaW1wbCAmJiBpbXBsLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIGltcGwtPnBvc3RCdWZmZXJSZWxlYXNlKGlkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+IG1JbXBsOworfTsKKworc3RydWN0IEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkNsaWVudEJ1ZmZlciB7Citwcml2YXRlOgorICAgIGludDY0X3QgbUV4cGlyZVVzOworICAgIGJvb2wgbUhhc0NhY2hlOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICAgIEJ1ZmZlcklkIG1JZDsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKm1IYW5kbGU7CisgICAgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sRGF0YT4gbUNhY2hlOworCisgICAgdm9pZCB1cGRhdGVFeHBpcmUoKSB7CisgICAgICAgIG1FeHBpcmVVcyA9IGdldFRpbWVzdGFtcE5vdygpICsga0NhY2hlVHRsVXM7CisgICAgfQorCitwdWJsaWM6CisgICAgQ2xpZW50QnVmZmVyKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgaWQsIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKQorICAgICAgICAgICAgOiBtSGFzQ2FjaGUoZmFsc2UpLCBtQ29ubmVjdGlvbklkKGNvbm5lY3Rpb25JZCksCisgICAgICAgICAgICAgIG1JZChpZCksIG1IYW5kbGUoaGFuZGxlKSB7CisgICAgICAgIG1FeHBpcmVVcyA9IGdldFRpbWVzdGFtcE5vdygpICsga0NhY2hlVHRsVXM7CisgICAgfQorCisgICAgfkNsaWVudEJ1ZmZlcigpIHsKKyAgICAgICAgaWYgKG1IYW5kbGUpIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UobUhhbmRsZSk7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShtSGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEJ1ZmZlcklkIGlkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlkOworICAgIH0KKworICAgIGJvb2wgZXhwaXJlKCkgY29uc3QgeworICAgICAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICByZXR1cm4gbm93ID49IG1FeHBpcmVVczsKKyAgICB9CisKKyAgICBib29sIGhhc0NhY2hlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUhhc0NhY2hlOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gZmV0Y2hDYWNoZShuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlKSB7CisgICAgICAgIGlmIChtSGFzQ2FjaGUpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gY2FjaGUgPSBtQ2FjaGUubG9jaygpOworICAgICAgICAgICAgaWYgKGNhY2hlKSB7CisgICAgICAgICAgICAgICAgKnBIYW5kbGUgPSBtSGFuZGxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNhY2hlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gY3JlYXRlQ2FjaGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gJmltcGwsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlKSB7CisgICAgICAgIGlmICghbUhhc0NhY2hlKSB7CisgICAgICAgICAgICAvLyBBbGxvY2F0ZXMgYSByYXcgcHRyIGluIG9yZGVyIHRvIGF2b2lkIHNlbmRpbmcgI3Bvc3RCdWZmZXJSZWxlYXNlCisgICAgICAgICAgICAvLyBmcm9tIGRlbGV0ZXIsIGluIGNhc2Ugb2YgbmF0aXZlX2hhbmRsZV9jbG9uZSBmYWlsdXJlLgorICAgICAgICAgICAgQnVmZmVyUG9vbERhdGEgKnB0ciA9IG5ldyBCdWZmZXJQb29sRGF0YShtQ29ubmVjdGlvbklkLCBtSWQpOworICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gY2FjaGUocHRyLCBCbG9ja1Bvb2xEYXRhRHRvcihpbXBsKSk7CisgICAgICAgICAgICAgICAgaWYgKGNhY2hlKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYWNoZSA9IGNhY2hlOworICAgICAgICAgICAgICAgICAgICBtSGFzQ2FjaGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAqcEhhbmRsZSA9IG1IYW5kbGU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICAgICAgZGVsZXRlIHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBib29sIG9uQ2FjaGVSZWxlYXNlKCkgeworICAgICAgICBpZiAobUhhc0NhY2hlKSB7CisgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnkgbUNhY2hlIGlzIG5vdCB2YWxpZDsKKyAgICAgICAgICAgIHVwZGF0ZUV4cGlyZSgpOworICAgICAgICAgICAgbUhhc0NhY2hlID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfTsKKworQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6SW1wbChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcikKKyAgICA6IG1Mb2NhbCh0cnVlKSwgbVZhbGlkKGZhbHNlKSwgbUFjY2Vzc29yKGFjY2Vzc29yKSwgbVNlcUlkKDApLAorICAgICAgbUxhc3RFdmljdENhY2hlVXMoZ2V0VGltZXN0YW1wTm93KCkpIHsKKyAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yICpzdGF0dXNEZXNjOworICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IgKmludkRlc2M7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IGFjY2Vzc29yLT5jb25uZWN0KAorICAgICAgICAgICAgb2JzZXJ2ZXIsIHRydWUsCisgICAgICAgICAgICAmbUxvY2FsQ29ubmVjdGlvbiwgJm1Db25uZWN0aW9uSWQsICZtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQsCisgICAgICAgICAgICAmc3RhdHVzRGVzYywgJmludkRlc2MpOworICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c0NoYW5uZWw+KCpzdGF0dXNEZXNjKTsKKyAgICAgICAgbUludmFsaWRhdGlvbkxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyPigqaW52RGVzYyk7CisgICAgICAgIG1WYWxpZCA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwgJiYKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5pc1ZhbGlkKCkgJiYKKyAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uTGlzdGVuZXIgJiYKKyAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uTGlzdGVuZXItPmlzVmFsaWQoKTsKKyAgICB9Cit9CisKK0J1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkltcGwoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKQorICAgIDogbUxvY2FsKGZhbHNlKSwgbVZhbGlkKGZhbHNlKSwgbUFjY2Vzc29yKGFjY2Vzc29yKSwgbVNlcUlkKDApLAorICAgICAgbUxhc3RFdmljdENhY2hlVXMoZ2V0VGltZXN0YW1wTm93KCkpIHsKKyAgICBib29sIHZhbGlkID0gZmFsc2U7CisgICAgc3A8SUNvbm5lY3Rpb24+JiBvdXRDb25uZWN0aW9uID0gbVJlbW90ZUNvbm5lY3Rpb247CisgICAgQ29ubmVjdGlvbklkJiBpZCA9IG1Db25uZWN0aW9uSWQ7CisgICAgdWludDMyX3QmIG91dE1zZ0lkID0gbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNDaGFubmVsPiYgb3V0Q2hhbm5lbCA9CisgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcj4mIG91dE9ic2VydmVyID0KKyAgICAgICAgICAgIG1JbnZhbGlkYXRpb25MaXN0ZW5lcjsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBhY2Nlc3Nvci0+Y29ubmVjdCgKKyAgICAgICAgICAgIG9ic2VydmVyLAorICAgICAgICAgICAgWyZ2YWxpZCwgJm91dENvbm5lY3Rpb24sICZpZCwgJm91dE1zZ0lkLCAmb3V0Q2hhbm5lbCwgJm91dE9ic2VydmVyXQorICAgICAgICAgICAgKFJlc3VsdFN0YXR1cyBzdGF0dXMsIHNwPElDb25uZWN0aW9uPiBjb25uZWN0aW9uLAorICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIHVpbnQzMl90IG1zZ0lkLAorICAgICAgICAgICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3ImIHN0YXR1c0Rlc2MsCisgICAgICAgICAgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciYgaW52RGVzYykgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBvdXRDb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgaWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgICAgIG91dE1zZ0lkID0gbXNnSWQ7CisgICAgICAgICAgICAgICAgICAgIG91dENoYW5uZWwgPSBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c0NoYW5uZWw+KHN0YXR1c0Rlc2MpOworICAgICAgICAgICAgICAgICAgICBvdXRPYnNlcnZlciA9IHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXI+KGludkRlc2MpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0Q2hhbm5lbCAmJiBvdXRDaGFubmVsLT5pc1ZhbGlkKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dE9ic2VydmVyICYmIG91dE9ic2VydmVyLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIG1WYWxpZCA9IHRyYW5zUmVzdWx0LmlzT2soKSAmJiB2YWxpZDsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjppc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKSB7CisgICAgYm9vbCBhY3RpdmUgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICBldmljdENhY2hlcyhjbGVhckNhY2hlKTsKKyAgICAgICAgKmxhc3RUcmFuc2FjdGlvblVzID0gbUNhY2hlLm1MYXN0Q2hhbmdlVXM7CisgICAgICAgIGFjdGl2ZSA9IG1DYWNoZS5tQWN0aXZlID4gMDsKKyAgICB9CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGNsZWFyQ2FjaGUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGFjdGl2ZTsKK30KKwordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpyZWNlaXZlSW52YWxpZGF0aW9uKHVpbnQzMl90IG1lc3NhZ2VJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgc3luY1JlbGVhc2VkKG1lc3NhZ2VJZCk7CisgICAgLy8gVE9ETzogZXZpY3QgY2FjaGUgcmVxdWlyZWQ/Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpmbHVzaCgpIHsKKyAgICBpZiAoIW1Mb2NhbCB8fCAhbUxvY2FsQ29ubmVjdGlvbiB8fCAhbVZhbGlkKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICAgICAgZXZpY3RDYWNoZXMoKTsKKyAgICAgICAgcmV0dXJuIG1Mb2NhbENvbm5lY3Rpb24tPmZsdXNoKCk7CisgICAgfQorfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmICghbUxvY2FsIHx8ICFtTG9jYWxDb25uZWN0aW9uIHx8ICFtVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIEJ1ZmZlcklkIGJ1ZmZlcklkOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICBidWZmZXItPnJlc2V0KCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IGFsbG9jYXRlQnVmZmVySGFuZGxlKHBhcmFtcywgJmJ1ZmZlcklkLCAmaGFuZGxlKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICAgICAgICAgIGV2aWN0Q2FjaGVzKCk7CisgICAgICAgICAgICBhdXRvIGNhY2hlSXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICBpZiAoY2FjaGVJdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnkgaXQgaXMgcmVjeWNsZWQuIChub3QgaGF2aW5nIGFjdGl2ZSByZWYpCisgICAgICAgICAgICAgICAgbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGNhY2hlSXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBjbGllbnRCdWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENsaWVudEJ1ZmZlcj4oCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgICAgICAgICAgaWYgKGNsaWVudEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gbUNhY2hlLm1CdWZmZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklkLCBzdGQ6Om1vdmUoY2xpZW50QnVmZmVyKSkpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSByZXN1bHQuZmlyc3QtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5pbmNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghKmJ1ZmZlcikgeworICAgICAgICAgICAgQUxPR1YoImNsaWVudCBjYWNoZSBjcmVhdGlvbiBmYWlsdXJlICVkOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgIGhhbmRsZSAhPSBudWxscHRyLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICBwb3N0QnVmZmVyUmVsZWFzZShidWZmZXJJZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnJlY2VpdmUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmICghbVZhbGlkKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBpZiAodGltZXN0YW1wVXMgIT0gMCkgeworICAgICAgICB0aW1lc3RhbXBVcyArPSBrUmVjZWl2ZVRpbWVvdXRVczsKKyAgICB9CisgICAgaWYgKCFwb3N0UmVjZWl2ZShidWZmZXJJZCwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBidWZmZXItPnJlc2V0KCk7CisgICAgd2hpbGUoMSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgIGV2aWN0Q2FjaGVzKCk7CisgICAgICAgIGF1dG8gY2FjaGVJdCA9IG1DYWNoZS5tQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgaWYgKGNhY2hlSXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBpZiAoY2FjaGVJdC0+c2Vjb25kLT5oYXNDYWNoZSgpKSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGNhY2hlSXQtPnNlY29uZC0+ZmV0Y2hDYWNoZShwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoISpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdHJhbnNmZXIgdGltZV9vdXQKKyAgICAgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6eWllbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSBmcm9tIHJlZmVyZW5jZSAlbGxkIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGNhY2hlSXQtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuaW5jQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoImNsaWVudCByZWNlaXZlIGZyb20gY2FjaGUgJWxsZCIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIW1DYWNoZS5tQ3JlYXRpbmcpIHsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNyZWF0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBmZXRjaEJ1ZmZlckhhbmRsZSh0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgJmhhbmRsZSk7CisgICAgICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gY2xpZW50QnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTxDbGllbnRCdWZmZXI+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IG1DYWNoZS5tQnVmZmVycy5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihidWZmZXJJZCwgc3RkOjptb3ZlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRCdWZmZXIpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IHJlc3VsdC5maXJzdC0+c2Vjb25kLT5jcmVhdGVDYWNoZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfZnJvbV90aGlzKCksIHBIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmluY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNyZWF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNyZWF0ZUN2Lm5vdGlmeV9hbGwoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRlQ3Yud2FpdChsb2NrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIG5lZWRzU3luYyA9IGZhbHNlOworICAgIGJvb2wgcG9zdGVkID0gcG9zdFJlY2VpdmVSZXN1bHQoYnVmZmVySWQsIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPyB0cnVlIDogZmFsc2UsICZuZWVkc1N5bmMpOworICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSAlbGxkIC0gJXUgOiAlcyAoJWQpIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAqYnVmZmVyID8gIm9rIiA6ICJmYWlsIiwgcG9zdGVkKTsKKyAgICBpZiAobVZhbGlkICYmIG1Mb2NhbCAmJiBtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIG1Mb2NhbENvbm5lY3Rpb24tPmNsZWFuVXAoZmFsc2UpOworICAgIH0KKyAgICBpZiAobmVlZHNTeW5jICYmIG1SZW1vdGVDb25uZWN0aW9uKSB7CisgICAgICAgIHRyeVN5bmNGcm9tUmVtb3RlKCk7CisgICAgfQorICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgIGlmICghcG9zdGVkKSB7CisgICAgICAgICAgICBidWZmZXItPnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RCdWZmZXJSZWxlYXNlKEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLnB1c2hfYmFjayhidWZmZXJJZCk7CisgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclJlbGVhc2UoCisgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKK30KKworLy8gVE9ETzogcmV2aXNlIGFkLWhvYyBwb3N0aW5nIGRhdGEgc3RydWN0dXJlCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RTZW5kKAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgQ29ubmVjdGlvbklkIHJlY2VpdmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90ICp0aW1lc3RhbXBVcykgeworICAgIHsKKyAgICAgICAgLy8gVE9ETzogZG9uJ3QgbmVlZCB0byBjYWxsIHN5bmNSZWxlYXNlZCBldmVyeSB0aW1lCisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgIH0KKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIGJvb2wgbmVlZHNTeW5jID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgKnRpbWVzdGFtcFVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgICp0cmFuc2FjdGlvbklkID0gKG1Db25uZWN0aW9uSWQgPDwgMzIpIHwgbVNlcUlkKys7CisgICAgICAgIC8vIFRPRE86IHJldHJ5LCBhZGQgdGltZW91dCwgdGFyZ2V0PworICAgICAgICByZXQgPSAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RPLCBtQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgIHJlY2VpdmVyLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgbmVlZHNTeW5jID0gIW1Mb2NhbCAmJiBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5uZWVkc1N5bmMoKTsKKyAgICB9CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGZhbHNlKTsKKyAgICB9CisgICAgaWYgKG5lZWRzU3luYyAmJiBtUmVtb3RlQ29ubmVjdGlvbikgeworICAgICAgICB0cnlTeW5jRnJvbVJlbW90ZSgpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RSZWNlaXZlKAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrUG9zdE1heFJldHJ5OyArK2kpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICBpZiAodGltZXN0YW1wVXMgPT0gMCB8fCBub3cgPCB0aW1lc3RhbXBVcykgeworICAgICAgICAgICAgYm9vbCByZXN1bHQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTSwKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgLTEsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgLTEsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0UmVjZWl2ZVJlc3VsdCgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgYm9vbCByZXN1bHQsIGJvb2wgKm5lZWRzU3luYykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgIC8vIFRPRE86IHJldHJ5LCBhZGQgdGltZW91dAorICAgIGJvb2wgcmV0ID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgIHJlc3VsdCA/IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0sgOiBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0VSUk9SLAorICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgLTEsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAqbmVlZHNTeW5jID0gIW1Mb2NhbCAmJiBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5uZWVkc1N5bmMoKTsKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnRyeVN5bmNGcm9tUmVtb3RlKCkgeworICAgIGlmIChtUmVtb3RlU3luY0xvY2sudHJ5X2xvY2soKSkgeworICAgICAgICBib29sIG5lZWRzU3luYyA9IGZhbHNlOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgICAgIG5lZWRzU3luYyA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPm5lZWRzU3luYygpOworICAgICAgICB9CisgICAgICAgIGlmIChuZWVkc1N5bmMpIHsKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCA9IChtQ29ubmVjdGlvbklkIDw8IDMyKTsKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gQ29ubmVjdGlvbjo6U1lOQ19CVUZGRVJJRDsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IG1SZW1vdGVDb25uZWN0aW9uLT5mZXRjaCgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgIFtdCisgICAgICAgICAgICAgICAgICAgIChSZXN1bHRTdGF0dXMgb3V0U3RhdHVzLCBCdWZmZXIgb3V0QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgb3V0U3RhdHVzOworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIG91dEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgbVJlbW90ZVN5bmNMb2NrLnVubG9jaygpOworICAgIH0KK30KKworLy8gc2hvdWxkIGhhdmUgbUNhY2hlLm1Mb2NrCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnN5bmNSZWxlYXNlZCh1aW50MzJfdCBtZXNzYWdlSWQpIHsKKyAgICBib29sIGNsZWFyZWQgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICBpZiAobVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVJlbGVhc2luZy5tUmVsZWFzZWRJZHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChCdWZmZXJJZCYgaWQ6IG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNsaWVudCByZWxlYXNlIGJ1ZmZlciAlbGxkIC0gJXUiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIGlkKTsKKyAgICAgICAgICAgICAgICBhdXRvIGZvdW5kID0gbUNhY2hlLm1CdWZmZXJzLmZpbmQoaWQpOworICAgICAgICAgICAgICAgIGlmIChmb3VuZCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kLT5zZWNvbmQtPm9uQ2FjaGVSZWxlYXNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5kZWNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4hCisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2xpZW50ICVsbGQgY2FjaGUgcmVsZWFzZSBzdGF0dXMgaW5jb25zaXRlbnQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4hCisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjbGllbnQgJWxsZCBjYWNoZSBzdGF0dXMgaW5jb25zaXRlbnQhIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcy5jbGVhcigpOworICAgICAgICAgICAgY2xlYXJlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZT4gaW52YWxpZGF0aW9uczsKKyAgICBtSW52YWxpZGF0aW9uTGlzdGVuZXItPmdldEludmFsaWRhdGlvbnMoaW52YWxpZGF0aW9ucyk7CisgICAgdWludDMyX3QgbGFzdE1zZ0lkID0gMDsKKyAgICBpZiAoaW52YWxpZGF0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGludmFsaWRhdGlvbnMuYmVnaW4oKTsgaXQgIT0gaW52YWxpZGF0aW9ucy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgaWYgKGl0LT5tZXNzYWdlSWQgIT0gMCkgeworICAgICAgICAgICAgICAgIGxhc3RNc2dJZCA9IGl0LT5tZXNzYWdlSWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXQtPmZyb21CdWZmZXJJZCA9PSBpdC0+dG9CdWZmZXJJZCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBmcm9tQnVmZmVySWQgPSBVSU5UMzJfTUFYCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZUJ1ZmZlcihpdC0+ZnJvbUJ1ZmZlcklkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVJhbmdlKGl0LT5mcm9tQnVmZmVySWQsIGl0LT50b0J1ZmZlcklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICBpZiAobGFzdE1zZ0lkICE9IDApIHsKKyAgICAgICAgICAgIGlmIChpc01lc3NhZ2VMYXRlcihsYXN0TXNnSWQsIG1SZWxlYXNpbmcubUludmFsaWRhdGVJZCkpIHsKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQgPSBsYXN0TXNnSWQ7CisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUFjayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2VJZCAhPSAwKSB7CisgICAgICAgICAgICAvLyBtZXNzYWdlcyBhcmUgZHJhaW5lZC4KKyAgICAgICAgICAgIGlmIChpc01lc3NhZ2VMYXRlcihtZXNzYWdlSWQsIG1SZWxlYXNpbmcubUludmFsaWRhdGVJZCkpIHsKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQgPSBtZXNzYWdlSWQ7CisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUFjayA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtUmVsZWFzaW5nLm1JbnZhbGlkYXRlQWNrKSB7CisgICAgICAgICAgICAvLyBwb3N0IEFDSworICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlckludmFsaWRhdGVBY2soCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubUludmFsaWRhdGVJZCwgJm1SZWxlYXNpbmcubUludmFsaWRhdGVBY2spOworICAgICAgICAgICAgQUxPR1YoImNsaWVudCAlbGxkIGludmFsaWRhdGVpb24gYWNrICglZCkgJXUiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlQWNrLCBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjbGVhcmVkOworfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6ZXZpY3RDYWNoZXMoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBpZiAobm93ID49IG1MYXN0RXZpY3RDYWNoZVVzICsga0NhY2hlVHRsVXMgfHwgY2xlYXJDYWNoZSkgeworICAgICAgICBzaXplX3QgZXZpY3RlZCA9IDA7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmhhc0NhY2hlKCkgJiYgKGl0LT5zZWNvbmQtPmV4cGlyZSgpIHx8IGNsZWFyQ2FjaGUpKSB7CisgICAgICAgICAgICAgICAgaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICsrZXZpY3RlZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY2FjaGUgY291bnQgJWxsZCA6IHRvdGFsICV6dSwgYWN0aXZlICVkLCBldmljdGVkICV6dSIsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgbUNhY2hlLm1CdWZmZXJzLnNpemUoKSwgbUNhY2hlLm1BY3RpdmUsIGV2aWN0ZWQpOworICAgICAgICBtTGFzdEV2aWN0Q2FjaGVVcyA9IG5vdzsKKyAgICB9Cit9CisKKy8vIHNob3VsZCBoYXZlIG1DYWNoZS5tTG9jawordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjppbnZhbGlkYXRlQnVmZmVyKEJ1ZmZlcklkIGlkKSB7CisgICAgZm9yIChhdXRvIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoaWQgPT0gaXQtPnNlY29uZC0+aWQoKSkgeworICAgICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5oYXNDYWNoZSgpKSB7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2FjaGUgaW52YWxpZGF0ZWQgJWxsZCA6IGJ1ZmZlciAldSIsCisgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBpZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJJbmNvbnNpdGVudCBpbnZhbGlkYXRpb24gJWxsZCA6IGFjdGl2ZXIgYnVmZmVyISEgJXUiLAorICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgKHVuc2lnbmVkIGludClpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gc2hvdWxkIGhhdmUgbUNhY2hlLm1Mb2NrCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmludmFsaWRhdGVSYW5nZShCdWZmZXJJZCBmcm9tLCBCdWZmZXJJZCB0bykgeworICAgIHNpemVfdCBpbnZhbGlkYXRlZCA9IDA7CisgICAgZm9yIChhdXRvIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKTspIHsKKyAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5oYXNDYWNoZSgpKSB7CisgICAgICAgICAgICBCdWZmZXJJZCBiaWQgPSBpdC0+c2Vjb25kLT5pZCgpOworICAgICAgICAgICAgaWYgKGZyb20gPCB0bykgeworICAgICAgICAgICAgICAgIGlmIChmcm9tIDw9IGJpZCAmJiBiaWQgPCB0bykgeworICAgICAgICAgICAgICAgICAgICArK2ludmFsaWRhdGVkOworICAgICAgICAgICAgICAgICAgICBpdCA9IG1DYWNoZS5tQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGZyb20gPD0gYmlkIHx8IGJpZCA8IHRvKSB7CisgICAgICAgICAgICAgICAgICAgICsraW52YWxpZGF0ZWQ7CisgICAgICAgICAgICAgICAgICAgIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICsraXQ7CisgICAgfQorICAgIEFMT0dWKCJjYWNoZSBpbnZhbGlkYXRlZCAlbGxkIDogIyBvZiBpbnZhbGlkYXRlZCAlenUiLAorICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgaW52YWxpZGF0ZWQpOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6YWxsb2NhdGVCdWZmZXJIYW5kbGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgaWYgKG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiBhbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtTG9jYWxDb25uZWN0aW9uLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICBwYXJhbXMsIGJ1ZmZlcklkLCAmYWxsb2NIYW5kbGUpOworICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKGFsbG9jSGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY2xpZW50IGFsbG9jYXRlIHJlc3VsdCAlbGxkICVkIDogJXUgY2xvbmUgJXAiLAorICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LLAorICAgICAgICAgICAgICAqaGFuZGxlID8gKmJ1ZmZlcklkIDogMCAsICpoYW5kbGUpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmZldGNoQnVmZmVySGFuZGxlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpIHsKKyAgICBzcDxJQ29ubmVjdGlvbj4gY29ubmVjdGlvbjsKKyAgICBpZiAobUxvY2FsKSB7CisgICAgICAgIGNvbm5lY3Rpb24gPSBtTG9jYWxDb25uZWN0aW9uOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbm5lY3Rpb24gPSBtUmVtb3RlQ29ubmVjdGlvbjsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBjb25uZWN0aW9uLT5mZXRjaCgKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgWyZzdGF0dXMsICZoYW5kbGVdCisgICAgICAgICAgICAoUmVzdWx0U3RhdHVzIG91dFN0YXR1cywgQnVmZmVyIG91dEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IG91dFN0YXR1czsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLmJ1ZmZlci5nZXROYXRpdmVIYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHRyYW5zUmVzdWx0LmlzT2soKSA/IHN0YXR1cyA6IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKKworQnVmZmVyUG9vbENsaWVudDo6QnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcikgeworICAgIG1JbXBsID0gc3RkOjptYWtlX3NoYXJlZDxJbXBsPihhY2Nlc3Nvciwgb2JzZXJ2ZXIpOworfQorCitCdWZmZXJQb29sQ2xpZW50OjpCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcikgeworICAgIG1JbXBsID0gc3RkOjptYWtlX3NoYXJlZDxJbXBsPihhY2Nlc3Nvciwgb2JzZXJ2ZXIpOworfQorCitCdWZmZXJQb29sQ2xpZW50Ojp+QnVmZmVyUG9vbENsaWVudCgpIHsKKyAgICAvLyBUT0RPOiBob3cgdG8gaGFuZGxlIG9ycGhhbmVkIGJ1ZmZlcnM/Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbUltcGwgJiYgbUltcGwtPmlzVmFsaWQoKTsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50Ojppc0xvY2FsKCkgeworICAgIHJldHVybiBtSW1wbCAmJiBtSW1wbC0+aXNMb2NhbCgpOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OmlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAoIWlzVmFsaWQoKSkgeworICAgICAgICAqbGFzdFRyYW5zYWN0aW9uVXMgPSAwOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtSW1wbC0+aXNBY3RpdmUobGFzdFRyYW5zYWN0aW9uVXMsIGNsZWFyQ2FjaGUpOworfQorCitDb25uZWN0aW9uSWQgQnVmZmVyUG9vbENsaWVudDo6Z2V0Q29ubmVjdGlvbklkKCkgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6Z2V0QWNjZXNzb3Ioc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgICphY2Nlc3NvciA9IG1JbXBsLT5nZXRBY2Nlc3NvcigpOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6cmVjZWl2ZUludmFsaWRhdGlvbih1aW50MzJfdCBtc2dJZCkgeworICAgIEFMT0dWKCJidWZmZXJwb29sMiBjbGllbnQgcmVjdiBpbnYgJXUiLCBtc2dJZCk7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICBtSW1wbC0+cmVjZWl2ZUludmFsaWRhdGlvbihtc2dJZCk7CisgICAgfQorfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6Zmx1c2goKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZsdXNoKCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPmFsbG9jYXRlKHBhcmFtcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OnJlY2VpdmUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPnJlY2VpdmUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIHRpbWVzdGFtcFVzLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6cG9zdFNlbmQoCisgICAgICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICBib29sIHJlc3VsdCA9IG1JbXBsLT5wb3N0U2VuZCgKKyAgICAgICAgICAgICAgICBidWZmZXItPm1JZCwgcmVjZWl2ZXJJZCwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpOworICAgICAgICByZXR1cm4gcmVzdWx0ID8gUmVzdWx0U3RhdHVzOjpPSyA6IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkOWFlNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclBvb2xDbGllbnQuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSUE9PTENMSUVOVF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlBPT0xDTElFTlRfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUFjY2Vzc29yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSU9ic2VydmVyLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3NvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ29ubmVjdGlvbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJT2JzZXJ2ZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworLyoqCisgKiBBIGJ1ZmZlciBwb29sIGNsaWVudCBmb3IgYSBidWZmZXIgcG9vbC4gRm9yIGEgc3BlY2lmaWMgYnVmZmVyIHBvb2wsIGF0IG1vc3QKKyAqIG9uZSBidWZmZXIgcG9vbCBjbGllbnQgZXhpc3RzIHBlciBwcm9jZXNzLiBUaGlzIGNsYXNzIHdpbGwgbm90IGJlIGV4cG9zZWQKKyAqIG91dHNpZGUuIEEgYnVmZmVyIHBvb2wgY2xpZW50IHdpbGwgYmUgdXNlZCB2aWEgQ2xpZW50TWFuYWdlci4KKyAqLworY2xhc3MgQnVmZmVyUG9vbENsaWVudCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGNsaWVudCBmcm9tIGEgbG9jYWwgYnVmZmVyIHBvb2wKKyAgICAgKiAodmlhIENsaWVudE1hbmFnZXIjY3JlYXRlKS4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcik7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVmZmVyIHBvb2wgY2xpZW50IGZyb20gYSByZW1vdGUgYnVmZmVyIHBvb2wKKyAgICAgKiAodmlhIENsaWVudE1hbmFnZXIjcmVnaXN0ZXJTZW5kZXIpLgorICAgICAqIE5vdGU6IEEgYnVmZmVyIHBvb2wgY2xpZW50IGNyZWF0ZWQgd2l0aCByZW1vdGUgYnVmZmVyIHBvb2wgY2Fubm90CisgICAgICogYWxsb2NhdGUgYSBidWZmZXIuCisgICAgICovCisgICAgZXhwbGljaXQgQnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKTsKKworICAgIC8qKiBEZXN0cnVjdHMgYSBidWZmZXIgcG9vbCBjbGllbnQuICovCisgICAgfkJ1ZmZlclBvb2xDbGllbnQoKTsKKworcHJpdmF0ZToKKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIGJvb2wgaXNMb2NhbCgpOworCisgICAgYm9vbCBpc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKTsKKworICAgIENvbm5lY3Rpb25JZCBnZXRDb25uZWN0aW9uSWQoKTsKKworICAgIFJlc3VsdFN0YXR1cyBnZXRBY2Nlc3NvcihzcDxJQWNjZXNzb3I+ICphY2Nlc3Nvcik7CisKKyAgICB2b2lkIHJlY2VpdmVJbnZhbGlkYXRpb24odWludDMyX3QgbXNnSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGZsdXNoKCk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcG9zdFNlbmQoQ29ubmVjdGlvbklkIHJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKKworICAgIGNsYXNzIEltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworCisgICAgZnJpZW5kIHN0cnVjdCBDbGllbnRNYW5hZ2VyOworICAgIGZyaWVuZCBzdHJ1Y3QgT2JzZXJ2ZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSUE9PTENMSUVOVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJTdGF0dXMuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyU3RhdHVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTM3MjYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyU3RhdHVzLmNwcApAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbFN0YXR1cyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAiQnVmZmVyU3RhdHVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworaW50NjRfdCBnZXRUaW1lc3RhbXBOb3coKSB7CisgICAgaW50NjRfdCBzdGFtcDsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgICAgLy8gVE9ETzogQ0xPQ0tfTU9OT1RPTklDX0NPQVJTRT8KKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKTsKKyAgICBzdGFtcCA9IHRzLnR2X25zZWMgLyAxMDAwOworICAgIHN0YW1wICs9ICh0cy50dl9zZWMgKiAxMDAwMDAwTEwpOworICAgIHJldHVybiBzdGFtcDsKK30KKworYm9vbCBpc01lc3NhZ2VMYXRlcih1aW50MzJfdCBjdXJNc2dJZCwgdWludDMyX3QgcHJldk1zZ0lkKSB7CisgICAgcmV0dXJuIGN1ck1zZ0lkICE9IHByZXZNc2dJZCAmJiBjdXJNc2dJZCAtIHByZXZNc2dJZCA8IHByZXZNc2dJZCAtIGN1ck1zZ0lkOworfQorCitib29sIGlzQnVmZmVySW5SYW5nZShCdWZmZXJJZCBmcm9tLCBCdWZmZXJJZCB0bywgQnVmZmVySWQgYnVmZmVySWQpIHsKKyAgICBpZiAoZnJvbSA8IHRvKSB7CisgICAgICAgIHJldHVybiBmcm9tIDw9IGJ1ZmZlcklkICYmIGJ1ZmZlcklkIDwgdG87CisgICAgfSBlbHNlIHsgLy8gd3JhcCBoYXBwZW5zCisgICAgICAgIHJldHVybiBmcm9tIDw9IGJ1ZmZlcklkIHx8IGJ1ZmZlcklkIDwgdG87CisgICAgfQorfQorCitzdGF0aWMgY29uc3RleHByIGludCBrTnVtRWxlbWVudHNJblF1ZXVlID0gMTAyNCoxNjsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNaW5FbGVtZW50c1RvU3luY0luUXVldWUgPSAxMjg7CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJTdGF0dXNPYnNlcnZlcjo6b3BlbigKKyAgICAgICAgQ29ubmVjdGlvbklkIGlkLCBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiogZm1xRGVzY1B0cikgeworICAgIGlmIChtQnVmZmVyU3RhdHVzUXVldWVzLmZpbmQoaWQpICE9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuZW5kKCkpIHsKKyAgICAgICAgLy8gVE9ETzogaWQgY29sbGlzaW9uIGxvZz8KKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4gcXVldWUgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNRdWV1ZT4oa051bUVsZW1lbnRzSW5RdWV1ZSk7CisgICAgaWYgKCFxdWV1ZSB8fCBxdWV1ZS0+aXNWYWxpZCgpID09IGZhbHNlKSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgIH0gZWxzZSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gcXVldWUtPmdldERlc2MoKTsKKyAgICB9CisgICAgYXV0byByZXN1bHQgPSBtQnVmZmVyU3RhdHVzUXVldWVzLmluc2VydCgKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKGlkLCBzdGQ6Om1vdmUocXVldWUpKSk7CisgICAgaWYgKCFyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclN0YXR1c09ic2VydmVyOjpjbG9zZShDb25uZWN0aW9uSWQgaWQpIHsKKyAgICBpZiAobUJ1ZmZlclN0YXR1c1F1ZXVlcy5maW5kKGlkKSA9PSBtQnVmZmVyU3RhdHVzUXVldWVzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBtQnVmZmVyU3RhdHVzUXVldWVzLmVyYXNlKGlkKTsKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKK30KKwordm9pZCBCdWZmZXJTdGF0dXNPYnNlcnZlcjo6Z2V0QnVmZmVyU3RhdHVzQ2hhbmdlcyhzdGQ6OnZlY3RvcjxCdWZmZXJTdGF0dXNNZXNzYWdlPiAmbWVzc2FnZXMpIHsKKyAgICBmb3IgKGF1dG8gaXQgPSBtQnVmZmVyU3RhdHVzUXVldWVzLmJlZ2luKCk7IGl0ICE9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSBtZXNzYWdlOworICAgICAgICBzaXplX3QgYXZhaWwgPSBpdC0+c2Vjb25kLT5hdmFpbGFibGVUb1JlYWQoKTsKKyAgICAgICAgd2hpbGUgKGF2YWlsID4gMCkgeworICAgICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5yZWFkKCZtZXNzYWdlLCAxKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHJlYWRzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nIChzcHVyaW91cyBjbGllbnQ/KQorICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgcmVhZCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWl0LT5maXJzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBpdC0+Zmlyc3Q7CisgICAgICAgICAgICBtZXNzYWdlcy5wdXNoX2JhY2sobWVzc2FnZSk7CisgICAgICAgICAgICAtLWF2YWlsOworICAgICAgICB9CisgICAgfQorfQorCitCdWZmZXJTdGF0dXNDaGFubmVsOjpCdWZmZXJTdGF0dXNDaGFubmVsKAorICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yICZmbXFEZXNjKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPiBxdWV1ZSA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c1F1ZXVlPihmbXFEZXNjKTsKKyAgICBpZiAoIXF1ZXVlIHx8IHF1ZXVlLT5pc1ZhbGlkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgbVZhbGlkID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVZhbGlkICA9IHRydWU7CisgICAgbUJ1ZmZlclN0YXR1c1F1ZXVlID0gc3RkOjptb3ZlKHF1ZXVlKTsKK30KKworYm9vbCBCdWZmZXJTdGF0dXNDaGFubmVsOjppc1ZhbGlkKCkgeworICAgIHJldHVybiBtVmFsaWQ7Cit9CisKK2Jvb2wgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6bmVlZHNTeW5jKCkgeworICAgIGlmIChtVmFsaWQpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gbUJ1ZmZlclN0YXR1c1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIHJldHVybiBhdmFpbCArIGtNaW5FbGVtZW50c1RvU3luY0luUXVldWUgPCBrTnVtRWxlbWVudHNJblF1ZXVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6cG9zdEJ1ZmZlclJlbGVhc2UoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCkgeworICAgIGlmIChtVmFsaWQgJiYgcGVuZGluZy5zaXplKCkgPiAwKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICBhdmFpbCA9IHN0ZDo6bWluKGF2YWlsLCBwZW5kaW5nLnNpemUoKSk7CisgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgbWVzc2FnZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgYXZhaWw7ICsraSkgeworICAgICAgICAgICAgQnVmZmVySWQgaWQgPSBwZW5kaW5nLmZyb250KCk7CisgICAgICAgICAgICBtZXNzYWdlLm5ld1N0YXR1cyA9IEJ1ZmZlclN0YXR1czo6Tk9UX1VTRUQ7CisgICAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkID0gaWQ7CisgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIGlmICghbUJ1ZmZlclN0YXR1c1F1ZXVlLT53cml0ZSgmbWVzc2FnZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiB3cml0ZXMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGluZz8KKyAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHNlbnQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBlbmRpbmcucG9wX2Zyb250KCk7CisgICAgICAgICAgICBwb3N0ZWQucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBCdWZmZXJTdGF0dXNDaGFubmVsOjpwb3N0QnVmZmVySW52YWxpZGF0ZUFjaygKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgdWludDMyX3QgaW52YWxpZGF0ZUlkLAorICAgICAgICBib29sICppbnZhbGlkYXRlZCkgeworICAgIGlmIChtVmFsaWQgJiYgISppbnZhbGlkYXRlZCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgaWYgKGF2YWlsID4gMCkgeworICAgICAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSBtZXNzYWdlOworICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMgPSBCdWZmZXJTdGF0dXM6OklOVkFMSURBVElPTl9BQ0s7CisgICAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkID0gaW52YWxpZGF0ZUlkOworICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRpbmc/CisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqaW52YWxpZGF0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQorCitib29sIEJ1ZmZlclN0YXR1c0NoYW5uZWw6OnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICBCdWZmZXJTdGF0dXMgc3RhdHVzLCBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBDb25uZWN0aW9uSWQgdGFyZ2V0SWQsCisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCkgeworICAgIGlmIChtVmFsaWQpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gbUJ1ZmZlclN0YXR1c1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIHNpemVfdCBudW1QZW5kaW5nID0gcGVuZGluZy5zaXplKCk7CisgICAgICAgIGlmIChhdmFpbCA+PSBudW1QZW5kaW5nICsgMSkgeworICAgICAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSByZWxlYXNlLCBtZXNzYWdlOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1QZW5kaW5nOyArK2kpIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJJZCBpZCA9IHBlbmRpbmcuZnJvbnQoKTsKKyAgICAgICAgICAgICAgICByZWxlYXNlLm5ld1N0YXR1cyA9IEJ1ZmZlclN0YXR1czo6Tk9UX1VTRUQ7CisgICAgICAgICAgICAgICAgcmVsZWFzZS5idWZmZXJJZCA9IGlkOworICAgICAgICAgICAgICAgIHJlbGVhc2UuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgICAgIGlmICghbUJ1ZmZlclN0YXR1c1F1ZXVlLT53cml0ZSgmcmVsZWFzZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmc/CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgc2VudCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGVuZGluZy5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBwb3N0ZWQucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkID0gYnVmZmVySWQ7CisgICAgICAgICAgICBtZXNzYWdlLm5ld1N0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgbWVzc2FnZS50YXJnZXRDb25uZWN0aW9uSWQgPSB0YXJnZXRJZDsKKyAgICAgICAgICAgIC8vIFRPRE8gOiB0aW1lc2F0YW1wCisgICAgICAgICAgICBtZXNzYWdlLnRpbWVzdGFtcFVzID0gMDsKKyAgICAgICAgICAgIGlmICghbUJ1ZmZlclN0YXR1c1F1ZXVlLT53cml0ZSgmbWVzc2FnZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiB3cml0ZXMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK0J1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyOjpCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcigKKyAgICAgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciAmZm1xRGVzYykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZT4gcXVldWUgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZT4oZm1xRGVzYyk7CisgICAgaWYgKCFxdWV1ZSB8fCBxdWV1ZS0+aXNWYWxpZCgpID09IGZhbHNlKSB7CisgICAgICAgIG1WYWxpZCA9IGZhbHNlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1WYWxpZCAgPSB0cnVlOworICAgIG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZSA9IHN0ZDo6bW92ZShxdWV1ZSk7CisgICAgLy8gZHJhaW4gcHJldmlvdXMgbWVzc2FnZXMKKyAgICBzaXplX3QgYXZhaWwgPSBzdGQ6Om1pbigKKyAgICAgICAgICAgIG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+YXZhaWxhYmxlVG9SZWFkKCksIChzaXplX3QpIGtOdW1FbGVtZW50c0luUXVldWUpOworICAgIHN0ZDo6dmVjdG9yPEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2U+IHRlbXAoYXZhaWwpOworICAgIGlmIChhdmFpbCA+IDApIHsKKyAgICAgICAgbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlLT5yZWFkKHRlbXAuZGF0YSgpLCBhdmFpbCk7CisgICAgfQorfQorCit2b2lkIEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyOjpnZXRJbnZhbGlkYXRpb25zKAorICAgICAgICBzdGQ6OnZlY3RvcjxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlPiAmbWVzc2FnZXMpIHsKKyAgICAvLyBUcnkgdHdpY2UgaW4gY2FzZSBvZiBvdmVyZmxvdy4KKyAgICAvLyBUT0RPOiBoYW5kbGluZyBvdmVyZmxvdyB0aG91Z2ggaXQgbWF5IG5vdCBoYXBwZW4uCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gc3RkOjptaW4oCisgICAgICAgICAgICAgICAgbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlLT5hdmFpbGFibGVUb1JlYWQoKSwgKHNpemVfdCkga051bUVsZW1lbnRzSW5RdWV1ZSk7CisgICAgICAgIGlmIChhdmFpbCA+IDApIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2U+IHRlbXAoYXZhaWwpOworICAgICAgICAgICAgaWYgKG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+cmVhZCh0ZW1wLmRhdGEoKSwgYXZhaWwpKSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZXMucmVzZXJ2ZShtZXNzYWdlcy5zaXplKCkgKyBhdmFpbCk7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gdGVtcC5iZWdpbigpOyBpdCAhPSB0ZW1wLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2hfYmFjaygqaXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcjo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbVZhbGlkOworfQorCitCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsOjpCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsKCkKKyAgICA6IG1WYWxpZCh0cnVlKSwKKyAgICAgIG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZSgKKyAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZT4oa051bUVsZW1lbnRzSW5RdWV1ZSwgdHJ1ZSkpIHsKKyAgICBpZiAoIW1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZSB8fCBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUtPmlzVmFsaWQoKSA9PSBmYWxzZSkgeworICAgICAgICBtVmFsaWQgPSBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbDo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbVZhbGlkOworfQorCit2b2lkIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWw6OmdldERlc2MoY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciAqKmZtcURlc2NQdHIpIHsKKyAgICBpZiAobVZhbGlkKSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlLT5nZXREZXNjKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBudWxscHRyOworICAgIH0KK30KKwordm9pZCBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsOjpwb3N0SW52YWxpZGF0aW9uKAorICAgICAgICB1aW50MzJfdCBtc2dJZCwgQnVmZmVySWQgZnJvbUlkLCBCdWZmZXJJZCB0b0lkKSB7CisgICAgQnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZSBtZXNzYWdlOworCisgICAgbWVzc2FnZS5tZXNzYWdlSWQgPSBtc2dJZDsKKyAgICBtZXNzYWdlLmZyb21CdWZmZXJJZCA9IGZyb21JZDsKKyAgICBtZXNzYWdlLnRvQnVmZmVySWQgPSB0b0lkOworICAgIC8vIFRPRE86IGhhbmRsZSBmYWlsdXJlIChpdCBkb2VzIG5vdCBoYXBwZW4gbm9ybWFsbHkuKQorICAgIG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+d3JpdGUoJm1lc3NhZ2UpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclN0YXR1cy5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyU3RhdHVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2NTgzOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclN0YXR1cy5oCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJTVEFUVVNfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJTVEFUVVNfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGxpc3Q+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworLyoqIFJldHVybnMgbW9ub3RvbmljIHRpbWVzdGFtcCBpbiBVcyBzaW5jZSBmaXhlZCBwb2ludCBpbiB0aW1lLiAqLworaW50NjRfdCBnZXRUaW1lc3RhbXBOb3coKTsKKworYm9vbCBpc01lc3NhZ2VMYXRlcih1aW50MzJfdCBjdXJNc2dJZCwgdWludDMyX3QgcHJldk1zZ0lkKTsKKworYm9vbCBpc0J1ZmZlckluUmFuZ2UoQnVmZmVySWQgZnJvbSwgQnVmZmVySWQgdG8sIEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworLyoqCisgKiBBIGNvbGxlY3Rpb24gb2YgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIEZNUSBmb3IgYSBidWZmZXIgcG9vbC4gYnVmZmVyCisgKiBvd25lcnNoaXAvc3RhdHVzIGNoYW5nZSBtZXNzYWdlcyBhcmUgc2VudCB2aWEgdGhlIEZNUXMgZnJvbSB0aGUgY2xpZW50cy4KKyAqLworY2xhc3MgQnVmZmVyU3RhdHVzT2JzZXJ2ZXIgeworcHJpdmF0ZToKKyAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4+CisgICAgICAgICAgICBtQnVmZmVyU3RhdHVzUXVldWVzOworCitwdWJsaWM6CisgICAgLyoqIENyZWF0ZXMgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgRk1RIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICogY29ubmVjdGlvbihjbGllbnQpLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgc3BlY2lmaWVkIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gZm1xRGVzY1B0ciAgICBkb3VibGUgcHRyIG9mIGNyZWF0ZWQgRk1RJ3MgZGVzY3JpcHRvci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgaWYgRk1RIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBvcGVuKENvbm5lY3Rpb25JZCBpZCwgY29uc3QgU3RhdHVzRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpOworCisgICAgLyoqIENsb3NlcyBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBGTVEgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjb25uZWN0aW9uKGNsaWVudCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBzcGVjaWZpZWQgY2xpZW50LgorICAgICAqCisgICAgICogQHJldHVybiBPSyBpZiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gaXMgY2xvc2VkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGlkKTsKKworICAgIC8qKiBSZXRyaWV2ZXMgYWxsIHBlbmRpbmcgRk1RIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgZnJvbSBjbGllbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2VzICByZXRyaWV2ZWQgcGVuZGluZyBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICB2b2lkIGdldEJ1ZmZlclN0YXR1c0NoYW5nZXMoc3RkOjp2ZWN0b3I8QnVmZmVyU3RhdHVzTWVzc2FnZT4gJm1lc3NhZ2VzKTsKK307CisKKy8qKgorICogQSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgRk1RIGZvciBhIGJ1ZmZlciBwb29sIGNsaWVudC4gQnVmZmVyIG93bmVyc2hpcC9zdGF0dXMKKyAqIGNoYW5nZSBtZXNzYWdlcyBhcmUgc2VudCB2aWEgdGhlIGZtcSB0byB0aGUgYnVmZmVyIHBvb2wuCisgKi8KK2NsYXNzIEJ1ZmZlclN0YXR1c0NoYW5uZWwgeworcHJpdmF0ZToKKyAgICBib29sIG1WYWxpZDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzUXVldWU+IG1CdWZmZXJTdGF0dXNRdWV1ZTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRvIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIEZNUSBmcm9tIGEgZGVzY3JpcHRvciBvZgorICAgICAqIHRoZSBjcmVhdGVkIEZNUS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbXFEZXNjICAgRGVzY3JpcHRvciBvZiB0aGUgY3JlYXRlZCBGTVEuCisgICAgICovCisgICAgQnVmZmVyU3RhdHVzQ2hhbm5lbChjb25zdCBTdGF0dXNEZXNjcmlwdG9yICZmbXFEZXNjKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBpcyBjb25uZWN0ZWQgc3VjY2Vzc2Z1bGx5LiAqLworICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgRk1RIG5lZWRzIHRvIGJlIHN5bmNlZCBmcm9tIHRoZSBidWZmZXIgcG9vbCAqLworICAgIGJvb2wgbmVlZHNTeW5jKCk7CisKKyAgICAvKioKKyAgICAgKiBQb3N0cyBhIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2UgdG8gdGhlIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBwZW5kaW5nICAgICAgIGN1cnJlbnRseSBwZW5kaW5nIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2VzLgorICAgICAqIEBwYXJhbSBwb3N0ZWQgICAgICAgIHBvc3RlZCBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICB2b2lkIHBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCk7CisKKyAgICAvKioKKyAgICAgKiBQb3N0cyBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSByZWdhcmRpbmcgdGhlIHNwZWNpZmllZCBidWZmZXIKKyAgICAgKiB0cmFuc2ZlciB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIElkIG9mIHRoZSBzcGVjaWZpZWQgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgYnVmZmVyIElkIG9mIHRoZSBzcGVjaWZpZWQgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIHN0YXR1cyAgICAgICAgbmV3IHN0YXR1cyBvZiB0aGUgYnVmZmVyLgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0SWQgICAgICBjb25uZWN0aW9uIElkIG9mIHRoZSByZWNlaXZlcihvbmx5IHdoZW4gdGhlIHNlbmRlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBvc3RzIGEgc3RhdHVzIG1lc3NhZ2UpLgorICAgICAqIEBwYXJhbSBwZW5kaW5nICAgICAgIGN1cnJlbnRseSBwZW5kaW5nIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2VzLgorICAgICAqIEBwYXJhbSBwb3N0ZWQgICAgICAgIHBvc3RlZCBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhlIHNwZWNpZmllZCBtZXNzYWdlIGlzIHBvc3RlZCwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgcG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIHRhcmdldElkLAorICAgICAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcGVuZGluZywgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcG9zdGVkKTsKKworICAgIC8qKgorICAgICAqIFBvc3RzIGEgYnVmZmVyIGludmFsaWFkYXRpb24gbWVzc2dlIHRvIHRoZSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gaW52YWxpZGF0ZUlkICBpbnZhbGlkYXRpb24gYWNrIHRvIHRoZSBidWZmZXIgcG9vbC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpZiBpbnZhbGlkYXRpb24gaWQgaXMgemVybywgdGhlIGFjayB3aWxsIG5vdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBvc3RlZC4KKyAgICAgKiBAcGFyYW0gaW52YWxpZGF0ZWQgICBzZXRzIHtAY29kZSB0cnVlfSBvbmx5IHdoZW4gdGhlIGludmFsaWRhdGlvbiBhY2sgaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0ZWQuCisgICAgICovCisgICAgdm9pZCBwb3N0QnVmZmVySW52YWxpZGF0ZUFjaygKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICB1aW50MzJfdCBpbnZhbGlkYXRlSWQsCisgICAgICAgICAgICBib29sICppbnZhbGlkYXRlZCk7Cit9OworCisvKioKKyAqIEEgYnVmZmVyIGludmFsaWRhdGlvbiBGTVEgZm9yIGEgYnVmZmVyIHBvb2wgY2xpZW50LiBCdWZmZXIgaW52YWxpZGF0aW9uCisgKiBtZXNzYWdlcyBhcmUgcmVjZWl2ZWQgdmlhIHRoZSBmbXEgZnJvbSB0aGUgYnVmZmVyIHBvb2wuIEJ1ZmZlciBpbnZhbGlkYXRpb24KKyAqIG1lc3NhZ2VzIGFyZSBoYW5kbGVkIGFzIHNvb24gYXMgcG9zc2libGUuCisgKi8KK2NsYXNzIEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtVmFsaWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlckludmFsaWRhdGlvblF1ZXVlPiBtQnVmZmVySW52YWxpZGF0aW9uUXVldWU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0byBhIGJ1ZmZlciBpbnZhbGlkYXRpb24gRk1RIGZyb20gYSBkZXNjcmlwdG9yIG9mIHRoZSBjcmVhdGVkIEZNUS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbXFEZXNjICAgRGVzY3JpcHRvciBvZiB0aGUgY3JlYXRlZCBGTVEuCisgICAgICovCisgICAgQnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXIoY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciAmZm1xRGVzYyk7CisKKyAgICAvKiogUmV0cmlldmVzIGFsbCBwZW5kaW5nIGJ1ZmZlciBpbnZhbGlkYXRpb24gbWVzc2FnZXMgZnJvbSB0aGUgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZXMgIHJldHJpZXZlZCBwZW5kaW5nIG1lc3NhZ2VzLgorICAgICAqLworICAgIHZvaWQgZ2V0SW52YWxpZGF0aW9ucyhzdGQ6OnZlY3RvcjxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlPiAmbWVzc2FnZXMpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgRk1RIGlzIGNvbm5lY3RlZCBzdWNjZXNmdWxseS4gKi8KKyAgICBib29sIGlzVmFsaWQoKTsKK307CisKKy8qKgorICogQSBidWZmZXIgaW52YWxpZGF0aW9uIEZNUSBmb3IgYSBidWZmZXIgcG9vbC4gQSBidWZmZXIgcG9vbCB3aWxsIHNlbmQgYnVmZmVyCisgKiBpbnZhbGlkYXRpb24gbWVzc2FnZXMgdG8gdGhlIGNsaWVudHMgdmlhIHRoZSBGTVEuIFRoZSBGTVEgaXMgc2hhcmVkIGFtb25nCisgKiBidWZmZXIgcG9vbCBjbGllbnRzLgorICovCitjbGFzcyBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtVmFsaWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlckludmFsaWRhdGlvblF1ZXVlPiBtQnVmZmVySW52YWxpZGF0aW9uUXVldWU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVmZmVyIGludmFsaWRhdGlvbiBGTVEgZm9yIGEgYnVmZmVyIHBvb2wuCisgICAgICovCisgICAgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCgpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgRk1RIGlzIGNvbm5lY3RlZCBzdWNjZXNmdWxseS4gKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgZGVzY3JpcHRvciBvZiBhIGJ1ZmZlciBpbnZhbGlkYXRpb24gRk1RLiB0aGUgZGVzY3JpcHRvciBtYXkKKyAgICAgKiBiZSBwYXNzZWQgdG8gdGhlIGNsaWVudCBmb3IgYnVmZmVyIGludmFsaWRhdGlvbiBoYW5kbGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbXFEZXNjUHRyICAgIGRvdWJsZSBwdHIgb2YgY3JlYXRlZCBGTVEncyBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHZvaWQgZ2V0RGVzYyhjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yICoqZm1xRGVzY1B0cik7CisKKyAgICAvKiogUG9zdHMgYSBidWZmZXIgaW52YWxpZGF0aW9uIGZvciBpbnZhbGlkYXRlZCBidWZmZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIG1zZ0lkICAgICBJbnZhbGlkYXRpb24gbWVzc2FnZSBpZCB3aGljaCBpcyB1c2VkIHdoZW4gY2xpZW50cyBzZW5kCisgICAgICogICAgICAgICAgICAgICAgICBhY2tzIGJhY2sgdmlhIEJ1ZmZlclN0YXR1c01lc3NhZ2UKKyAgICAgKiBAcGFyYW0gZnJvbUlkICAgIFRoZSBzdGFydCBidWZmZXJpZCBvZiB0aGUgaW52YWxpZGF0ZWQgYnVmZmVycyhpbmNsdXNpdmUpCisgICAgICogQHBhcmFtIHRvSWQgICAgICBUaGUgZW5kIGJ1ZmZlcklkIG9mIHRoZSBpbnZhbGlkYXRlZCBidWZmZXJzKGluY2x1c2l2ZSkKKyAgICAgKi8KKyAgICB2b2lkIHBvc3RJbnZhbGlkYXRpb24odWludDMyX3QgbXNnSWQsIEJ1ZmZlcklkIGZyb21JZCwgQnVmZmVySWQgdG9JZCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSU1RBVFVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0NsaWVudE1hbmFnZXIuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ2xpZW50TWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMxZDMxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0NsaWVudE1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNTM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbE1hbmFnZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xDbGllbnQuaCIKKyNpbmNsdWRlICJPYnNlcnZlci5oIgorI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtSZWdpc3RlclRpbWVvdXRVcyA9IDUwMDAwMDsgLy8gMC41IHNlYworc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtDbGVhblVwRHVyYXRpb25VcyA9IDEwMDAwMDA7IC8vIFRPRE86IDEgc2VjIHR1bmUKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrQ2xpZW50VGltZW91dFVzID0gNTAwMDAwMDsgLy8gVE9ETzogNSBzZWNzIHR1bmUKKworLyoqCisgKiBUaGUgaG9sZGVyIG9mIHRoZSBjb29raWUgb2YgcmVtb3RlIElDbGllbnRNYW5hZ2VyLgorICogVGhlIGNvb2tpZSBpcyBwcm9jZXNzIGxvY2FsbHkgdW5pcXVlIGZvciBlYWNoIElDbGllbnRNYW5hZ2VyLgorICogKFRoZSBjb29raWUgaXMgdXNlZCB0byBub3RpZnkgZGVhdGggb2YgY2xpZW50cyB0byBidWZmZXJwb29sIHByb2Nlc3MuKQorICovCitjbGFzcyBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29va2llIGhvbGRlciBmb3IgcmVtb3RlIElDbGllbnRNYW5hZ2VyKHMpLgorICAgICAqLworICAgIENsaWVudE1hbmFnZXJDb29raWVIb2xkZXIoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgYSBjb29raWUgZm9yIGEgcmVtb3RlIElDbGllbnRNYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIG1hbmFnZXIgICB0aGUgc3BlY2lmaWVkIHJlbW90ZSBJQ2xpZW50TWFuYWdlci4KKyAgICAgKiBAcGFyYW0gYWRkZWQgICAgIHRydWUgd2hlbiB0aGUgc3BlY2lmaWVkIHJlbW90ZSBJQ2xpZW50TWFuYWdlciBpcyBhZGRlZAorICAgICAqICAgICAgICAgICAgICAgICAgbmV3bHksIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHByb2Nlc3MgbG9jYWxseSB1bmlxdWUgY29va2llIGZvciB0aGUgc3BlY2lmaWVkIElDbGllbnRNYW5hZ2VyLgorICAgICAqLworICAgIHVpbnQ2NF90IGdldENvb2tpZShjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJm1hbmFnZXIsIGJvb2wgKmFkZGVkKTsKKworcHJpdmF0ZToKKyAgICB1aW50NjRfdCBtU2VxSWQ7CisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6Omxpc3Q8c3RkOjpwYWlyPGNvbnN0IHdwPElDbGllbnRNYW5hZ2VyPiwgdWludDY0X3Q+PiBtTWFuYWdlcnM7Cit9OworCitDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyOjpDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyKCkgOiBtU2VxSWQoMCl7fQorCit1aW50NjRfdCBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyOjpnZXRDb29raWUoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmbWFuYWdlciwKKyAgICAgICAgYm9vbCAqYWRkZWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgZm9yIChhdXRvIGl0ID0gbU1hbmFnZXJzLmJlZ2luKCk7IGl0ICE9IG1NYW5hZ2Vycy5lbmQoKTspIHsKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+IGtleSA9IGl0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgIGlmIChrZXkpIHsKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2VzRXF1YWwoa2V5LCBtYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgICphZGRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0ID0gbU1hbmFnZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICB1aW50NjRfdCBpZCA9IG1TZXFJZCsrOworICAgICphZGRlZCA9IHRydWU7CisgICAgbU1hbmFnZXJzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihtYW5hZ2VyLCBpZCkpOworICAgIHJldHVybiBpZDsKK30KKworY2xhc3MgQ2xpZW50TWFuYWdlcjo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbCgpOworCisgICAgLy8gQm5SZWdpc3RlclNlbmRlcgorICAgIFJlc3VsdFN0YXR1cyByZWdpc3RlclNlbmRlcihjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKTsKKworICAgIC8vIEJwUmVnaXN0ZXJTZW5kZXIKKyAgICBSZXN1bHRTdGF0dXMgcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZyZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkIHNlbmRlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnJlY2VpdmVySWQpOworCisgICAgUmVzdWx0U3RhdHVzIGNyZWF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgZmx1c2goQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyBwb3N0U2VuZChDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICBSZXN1bHRTdGF0dXMgZ2V0QWNjZXNzb3IoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpOworCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSA9IGZhbHNlKTsKKworcHJpdmF0ZToKKyAgICAvLyBJbiBvcmRlciB0byBwcmV2ZW50IGRlYWRsb2NrIGJldHdlZW4gbXVsdGlwbGUgbG9ja3MsCisgICAgLy8gYWx3YXlzIGxvY2sgQ2xpZW50Q2FjaGUubG9jayBiZWZvcmUgbG9ja2luZyBBY3RpdmVDbGllbnRzLmxvY2suCisgICAgc3RydWN0IENsaWVudENhY2hlIHsKKyAgICAgICAgLy8gVGhpcyBsb2NrIGlzIGhlbGQgZm9yIGJyaWVmIGR1cmF0aW9uLgorICAgICAgICAvLyBCbG9ja2luZyBvcGVyYXRpb24gaXMgbm90IHBlcmZvcm1lZCB3aGlsZSBob2xkaW5nIHRoZSBsb2NrLgorICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6cGFpcjxjb25zdCB3cDxJQWNjZXNzb3I+LCBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+Pj4KKyAgICAgICAgICAgICAgICBtQ2xpZW50czsKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNvbm5lY3RDdjsKKyAgICAgICAgYm9vbCBtQ29ubmVjdGluZzsKKyAgICAgICAgaW50NjRfdCBtTGFzdENsZWFuVXBVczsKKworICAgICAgICBDbGllbnRDYWNoZSgpIDogbUNvbm5lY3RpbmcoZmFsc2UpLCBtTGFzdENsZWFuVXBVcyhnZXRUaW1lc3RhbXBOb3coKSkge30KKyAgICB9IG1DYWNoZTsKKworICAgIC8vIEFjdGl2ZSBjbGllbnRzIHdoaWNoIGNhbiBiZSByZXRyaWV2ZWQgdmlhIENvbm5lY3Rpb25JZAorICAgIHN0cnVjdCBBY3RpdmVDbGllbnRzIHsKKyAgICAgICAgLy8gVGhpcyBsb2NrIGlzIGhlbGQgZm9yIGJyaWVmIGR1cmF0aW9uLgorICAgICAgICAvLyBCbG9ja2luZyBvcGVyYXRpb24gaXMgbm90IHBlcmZvcm1lZCBob2xkaW5nIHRoZSBsb2NrLgorICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4+CisgICAgICAgICAgICAgICAgbUNsaWVudHM7CisgICAgfSBtQWN0aXZlOworCisgICAgc3A8T2JzZXJ2ZXI+IG1PYnNlcnZlcjsKKworICAgIENsaWVudE1hbmFnZXJDb29raWVIb2xkZXIgbVJlbW90ZUNsaWVudENvb2tpZXM7Cit9OworCitDbGllbnRNYW5hZ2VyOjpJbXBsOjpJbXBsKCkKKyAgICA6IG1PYnNlcnZlcihuZXcgT2JzZXJ2ZXIoKSkge30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICBjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKSB7CisgICAgY2xlYW5VcCgpOworICAgIGludDY0X3QgdGltZW91dFVzID0gZ2V0VGltZXN0YW1wTm93KCkgKyBrUmVnaXN0ZXJUaW1lb3V0VXM7CisgICAgZG8geworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1NdXRleCk7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQ2xpZW50cy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUNsaWVudHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gc0FjY2Vzc29yID0gaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChzQWNjZXNzb3IgJiYgaW50ZXJmYWNlc0VxdWFsKHNBY2Nlc3NvciwgYWNjZXNzb3IpKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9IGl0LT5zZWNvbmQubG9jaygpOworICAgICAgICAgICAgICAgIGlmIChjbGllbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICAgICAgICAgICAgICAqcENvbm5lY3Rpb25JZCA9IGNsaWVudC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlLm1DbGllbnRzLmZpbmQoKnBDb25uZWN0aW9uSWQpICE9IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlciBleGlzdGluZyBjb25uZWN0aW9uICVsbGQiLCAobG9uZyBsb25nKSpwQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYWNoZS5tQ2xpZW50cy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtQ2FjaGUubUNvbm5lY3RpbmcpIHsKKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdGluZyA9IHRydWU7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgUmVzdWx0U3RhdHVzIHJlc3VsdCA9IFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50ID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxCdWZmZXJQb29sQ2xpZW50PihhY2Nlc3NvciwgbU9ic2VydmVyKTsKKyAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgaWYgKCFjbGllbnQpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNsaWVudC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBpbnNlcnQgZmFpbC4gKG1hbGxvYyBmYWlsKQorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4gd2NsaWVudCA9IGNsaWVudDsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNsaWVudHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGFjY2Vzc29yLCB3Y2xpZW50KSk7CisgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbklkID0gY2xpZW50LT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICAgICAgICAgICAgICBtT2JzZXJ2ZXItPmFkZENsaWVudChjb25JZCwgd2NsaWVudCk7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmUubUNsaWVudHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbklkLCBjbGllbnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjb25JZDsKKyAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXIgbmV3IGNvbm5lY3Rpb24gJWxsZCIsIChsb25nIGxvbmcpKnBDb25uZWN0aW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNhY2hlLm1Db25uZWN0aW5nID0gZmFsc2U7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgbUNhY2hlLm1Db25uZWN0Q3Yubm90aWZ5X2FsbCgpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBtQ2FjaGUubUNvbm5lY3RDdi53YWl0X2ZvcigKKyAgICAgICAgICAgICAgICBsb2NrLCBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKGtSZWdpc3RlclRpbWVvdXRVcykpOworICAgIH0gd2hpbGUgKGdldFRpbWVzdGFtcE5vdygpIDwgdGltZW91dFVzKTsKKyAgICAvLyBUT0RPOiByZXR1cm4gdGltZW91dCBlcnJvcgorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKSB7CisgICAgc3A8SUFjY2Vzc29yPiBhY2Nlc3NvcjsKKyAgICBib29sIGxvY2FsID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoc2VuZGVySWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGl0LT5zZWNvbmQtPmdldEFjY2Vzc29yKCZhY2Nlc3Nvcik7CisgICAgICAgIGxvY2FsID0gaXQtPnNlY29uZC0+aXNMb2NhbCgpOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgcnMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIGlmIChhY2Nlc3NvcikgeworICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IHJlY2VpdmVyLT5yZWdpc3RlclNlbmRlcigKKyAgICAgICAgICAgICAgICBhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICBbJnJzLCByZWNlaXZlcklkXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCkgeworICAgICAgICAgICAgICAgICAgICBycyA9IHN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgKnJlY2VpdmVySWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICAgICAgfSBlbHNlIGlmIChsb2NhbCAmJiBycyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IHJlY2lwaWVudCA9IEFjY2Vzc29yOjpnZXRDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKTsKKyAgICAgICAgICAgIGlmIChyZWNpcGllbnQpICB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNsaWVudCBkZWF0aCByZWNpcGllbnQgcmVnaXN0ZXJlZCAlbGxkIiwgKGxvbmcgbG9uZykqcmVjZWl2ZXJJZCk7CisgICAgICAgICAgICAgICAgYm9vbCBhZGRlZDsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBjb29raWUgPSBtUmVtb3RlQ2xpZW50Q29va2llcy5nZXRDb29raWUocmVjZWl2ZXIsICZhZGRlZCk7CisgICAgICAgICAgICAgICAgcmVjaXBpZW50LT5hZGRDb29raWVUb0Nvbm5lY3Rpb24oY29va2llLCAqcmVjZWl2ZXJJZCk7CisgICAgICAgICAgICAgICAgaWYgKGFkZGVkKSB7CisgICAgICAgICAgICAgICAgICAgIFJldHVybjxib29sPiB0cmFuc1Jlc3VsdCA9IHJlY2VpdmVyLT5saW5rVG9EZWF0aChyZWNpcGllbnQsIGNvb2tpZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByczsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmNyZWF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCkgeworICAgIGNvbnN0IHNwPEFjY2Vzc29yPiBhY2Nlc3NvciA9IG5ldyBBY2Nlc3NvcihhbGxvY2F0b3IpOworICAgIGlmICghYWNjZXNzb3IgfHwgIWFjY2Vzc29yLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIC8vIFRPRE86IG9ic2VydmVyIGlzIGxvY2FsLiB1c2UgZGlyZWN0IGNhbGwgaW5zdGVhZCBvZiBoaWRsIGNhbGwuCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEJ1ZmZlclBvb2xDbGllbnQ+KGFjY2Vzc29yLCBtT2JzZXJ2ZXIpOworICAgIGlmICghY2xpZW50IHx8ICFjbGllbnQtPmlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgLy8gU2luY2UgYSBuZXcgYnVmZmVycG9vbCBpcyBjcmVhdGVkLCBldmljdCBtZW1vcmllcyB3aGljaCBhcmUgdXNlZCBieQorICAgIC8vIGV4aXN0aW5nIGJ1ZmZlcnBvb2xzIGFuZCBjbGllbnRzLgorICAgIGNsZWFuVXAodHJ1ZSk7CisgICAgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgaW5zZXJ0IGZhaWwuIChtYWxsb2MgZmFpbCkKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1NdXRleCk7CisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4gd2NsaWVudCA9IGNsaWVudDsKKyAgICAgICAgbUNhY2hlLm1DbGllbnRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhY2Nlc3Nvciwgd2NsaWVudCkpOworICAgICAgICBDb25uZWN0aW9uSWQgY29uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICBtT2JzZXJ2ZXItPmFkZENsaWVudChjb25JZCwgd2NsaWVudCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgICAgIG1BY3RpdmUubUNsaWVudHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbklkLCBjbGllbnQpKTsKKyAgICAgICAgfQorICAgICAgICAqcENvbm5lY3Rpb25JZCA9IGNvbklkOworICAgICAgICBBTE9HVigiY3JlYXRlIG5ldyBjb25uZWN0aW9uICVsbGQiLCAobG9uZyBsb25nKSpwQ29ubmVjdGlvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrMShtQ2FjaGUubU11dGV4KTsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2syKG1BY3RpdmUubU11dGV4KTsKKyAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGl0ICE9IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgc3A8SUFjY2Vzc29yPiBhY2Nlc3NvcjsKKyAgICAgICAgaXQtPnNlY29uZC0+Z2V0QWNjZXNzb3IoJmFjY2Vzc29yKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsb3NpbmcgPSBpdC0+c2Vjb25kOworICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGZvciAoYXV0byBjaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgY2l0ICE9IG1DYWNoZS5tQ2xpZW50cy5lbmQoKTspIHsKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRlYWQgY2xpZW50IGNhY2hlcworICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBjQWNjZXNzb3IgPSBjaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICghY0FjY2Vzc29yIHx8IChhY2Nlc3NvciAmJiBpbnRlcmZhY2VzRXF1YWwoY0FjY2Vzc29yLCBhY2Nlc3NvcikpKSB7CisgICAgICAgICAgICAgICAgY2l0ID0gbUNhY2hlLm1DbGllbnRzLmVyYXNlKGNpdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNpdCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvY2syLnVubG9jaygpOworICAgICAgICBsb2NrMS51bmxvY2soKTsKKyAgICAgICAgY2xvc2luZy0+Zmx1c2goKTsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmZsdXNoKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+Zmx1c2goKTsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5hbGxvY2F0ZShwYXJhbXMsIGhhbmRsZSwgYnVmZmVyKTsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnJlY2VpdmUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPnJlY2VpdmUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIHRpbWVzdGFtcFVzLCBoYW5kbGUsIGJ1ZmZlcik7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpwb3N0U2VuZCgKKyAgICAgICAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCAqdGltZXN0YW1wVXMpIHsKKyAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkID0gYnVmZmVyLT5tQ29ubmVjdGlvbklkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5wb3N0U2VuZChyZWNlaXZlcklkLCBidWZmZXIsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKTsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmdldEFjY2Vzc29yKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBzcDxJQWNjZXNzb3I+ICphY2Nlc3NvcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5nZXRBY2Nlc3NvcihhY2Nlc3Nvcik7Cit9CisKK3ZvaWQgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgIGludDY0X3QgbGFzdFRyYW5zYWN0aW9uVXM7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sxKG1DYWNoZS5tTXV0ZXgpOworICAgIGlmIChjbGVhckNhY2hlIHx8IG1DYWNoZS5tTGFzdENsZWFuVXBVcyArIGtDbGVhblVwRHVyYXRpb25VcyA8IG5vdykgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jazIobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBpbnQgY2xlYW5lZCA9IDA7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuYmVnaW4oKTsgaXQgIT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKTspIHsKKyAgICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+aXNBY3RpdmUoJmxhc3RUcmFuc2FjdGlvblVzLCBjbGVhckNhY2hlKSkgeworICAgICAgICAgICAgICAgIGlmIChsYXN0VHJhbnNhY3Rpb25VcyArIGtDbGllbnRUaW1lb3V0VXMgPCBub3cpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBhY2Nlc3NvcjsKKyAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC0+Z2V0QWNjZXNzb3IoJmFjY2Vzc29yKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBtQWN0aXZlLm1DbGllbnRzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgKytjbGVhbmVkOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byBjaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgY2l0ICE9IG1DYWNoZS5tQ2xpZW50cy5lbmQoKTspIHsKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRlYWQgY2xpZW50IGNhY2hlcworICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBjQWNjZXNzb3IgPSBjaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICghY0FjY2Vzc29yKSB7CisgICAgICAgICAgICAgICAgY2l0ID0gbUNhY2hlLm1DbGllbnRzLmVyYXNlKGNpdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICsrY2l0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCIjIG9mIGNsZWFuZWQgY29ubmVjdGlvbnM6ICVkIiwgY2xlYW5lZCk7CisgICAgICAgIG1DYWNoZS5tTGFzdENsZWFuVXBVcyA9IG5vdzsKKyAgICB9Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNsaWVudE1hbmFnZXIgZm9sbG93LgorUmV0dXJuPHZvaWQ+IENsaWVudE1hbmFnZXI6OnJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3I+JiBidWZmZXJQb29sLCByZWdpc3RlclNlbmRlcl9jYiBfaGlkbF9jYikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkID0gLTE7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtSW1wbC0+cmVnaXN0ZXJTZW5kZXIoYnVmZmVyUG9vbCwgJmNvbm5lY3Rpb25JZCk7CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgY29ubmVjdGlvbklkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfaGlkbF9jYihSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SLCAtMSk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKKy8vIE1ldGhvZHMgZm9yIGxvY2FsIHVzZS4KK3NwPENsaWVudE1hbmFnZXI+IENsaWVudE1hbmFnZXI6OnNJbnN0YW5jZTsKK3N0ZDo6bXV0ZXggQ2xpZW50TWFuYWdlcjo6c0luc3RhbmNlTG9jazsKKworc3A8Q2xpZW50TWFuYWdlcj4gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc0luc3RhbmNlTG9jayk7CisgICAgaWYgKCFzSW5zdGFuY2UpIHsKKyAgICAgICAgc0luc3RhbmNlID0gbmV3IENsaWVudE1hbmFnZXIoKTsKKyAgICB9CisgICAgQWNjZXNzb3I6OmNyZWF0ZUludmFsaWRhdG9yKCk7CisgICAgcmV0dXJuIHNJbnN0YW5jZTsKK30KKworQ2xpZW50TWFuYWdlcjo6Q2xpZW50TWFuYWdlcigpIDogbUltcGwobmV3IEltcGwoKSkge30KKworQ2xpZW50TWFuYWdlcjo6fkNsaWVudE1hbmFnZXIoKSB7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpjcmVhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5jcmVhdGUoYWxsb2NhdG9yLCBwQ29ubmVjdGlvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpyZWdpc3RlclNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZyZWNlaXZlciwKKyAgICAgICAgQ29ubmVjdGlvbklkIHNlbmRlcklkLAorICAgICAgICBDb25uZWN0aW9uSWQgKnJlY2VpdmVySWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5yZWdpc3RlclNlbmRlcihyZWNlaXZlciwgc2VuZGVySWQsIHJlY2VpdmVySWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5jbG9zZShjb25uZWN0aW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OmZsdXNoKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mbHVzaChjb25uZWN0aW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmFsbG9jYXRlKGNvbm5lY3Rpb25JZCwgcGFyYW1zLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6cmVjZWl2ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5yZWNlaXZlKGNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OnBvc3RTZW5kKAorICAgICAgICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90KiB0aW1lc3RhbXBVcykgeworICAgIGlmIChtSW1wbCAmJiBidWZmZXIpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5wb3N0U2VuZChyZWNlaXZlcklkLCBidWZmZXIsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQ2xpZW50TWFuYWdlcjo6Y2xlYW5VcCgpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPmNsZWFuVXAodHJ1ZSk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9Db25uZWN0aW9uLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0Nvbm5lY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZDBlNzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9Db25uZWN0aW9uLmNwcApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDb25uZWN0aW9uIGZvbGxvdy4KK1JldHVybjx2b2lkPiBDb25uZWN0aW9uOjpmZXRjaCh1aW50NjRfdCB0cmFuc2FjdGlvbklkLCB1aW50MzJfdCBidWZmZXJJZCwgZmV0Y2hfY2IgX2hpZGxfY2IpIHsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICBpZiAoYnVmZmVySWQgIT0gU1lOQ19CVUZGRVJJRCkgeworICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBudWxscHRyOworICAgICAgICAgICAgc3RhdHVzID0gbUFjY2Vzc29yLT5mZXRjaCgKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsICZoYW5kbGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBCdWZmZXJ7YnVmZmVySWQsIGhhbmRsZX0pOworICAgICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQWNjZXNzb3ItPmNsZWFuVXAoZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIF9oaWRsX2NiKHN0YXR1cywgQnVmZmVyezAsIG51bGxwdHJ9KTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitDb25uZWN0aW9uOjpDb25uZWN0aW9uKCkgOiBtSW5pdGlhbGl6ZWQoZmFsc2UpLCBtQ29ubmVjdGlvbklkKC0xTEwpIHt9CisKK0Nvbm5lY3Rpb246On5Db25uZWN0aW9uKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIG1BY2Nlc3Nvci0+Y2xvc2UobUNvbm5lY3Rpb25JZCk7CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb246OmluaXRpYWxpemUoCisgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiYgYWNjZXNzb3IsIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICBtQWNjZXNzb3IgPSBhY2Nlc3NvcjsKKyAgICAgICAgbUNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9Cit9CisKK1Jlc3VsdFN0YXR1cyBDb25uZWN0aW9uOjpmbHVzaCgpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICByZXR1cm4gbUFjY2Vzc29yLT5mbHVzaCgpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENvbm5lY3Rpb246OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLCBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIHJldHVybiBtQWNjZXNzb3ItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIENvbm5lY3Rpb246OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgbUFjY2Vzc29yLT5jbGVhblVwKGNsZWFyQ2FjaGUpOworICAgIH0KK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2UgZm9sbG93LgorCisvL0lDb25uZWN0aW9uKiBISURMX0ZFVENIX0lDb25uZWN0aW9uKGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8pIHsKKy8vICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbigpOworLy99CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0Nvbm5lY3Rpb24uaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0Nvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTA3NzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9DT05ORUNUSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQ09OTkVDVElPTl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpBY2Nlc3NvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ29ubmVjdGlvbiA6IHB1YmxpYyBJQ29ubmVjdGlvbiB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ29ubmVjdGlvbiBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IGZldGNoKHVpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIHVpbnQzMl90IGJ1ZmZlcklkLCBmZXRjaF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBJbnZhbGlkYXRlcyBhbGwgYnVmZmVycyB3aGljaCBhcmUgYWN0aXZlIGFuZC9vciBhcmUgcmVhZHkgdG8gYmUgcmVjeWNsZWQuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGZsdXNoKCk7CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZXMgYSBidWZmZXIgdXNpbmcgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLiBSZWN5Y2xlcyBhIGJ1ZmZlciBpZgorICAgICAqIGl0IGlzIHBvc3NpYmxlLiBUaGUgcmV0dXJuZWQgYnVmZmVyIGNhbiBiZSB0cmFuc2ZlcnJlZCB0byBvdGhlciByZW1vdGUKKyAgICAgKiBjbGllbnRzKENvbm5lY3Rpb24pLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtcyAgICBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICBJZCBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIGlmIGEgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIHBlcmZvcm1zIHBlcmlvZGljIGNhY2hlIGNsZWFuaW5nCisgICAgICogZnJvbSBidWZmZXJwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNsZWFyQ2FjaGUgICAgaWYgY2xlYXJDYWNoZSBpcyB0cnVlLCBidWZmZXJwb29sIGZyZWVzIGFsbCBidWZmZXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2FpdGluZyB0byBiZSByZWN5Y2xlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKTsKKworICAgIC8qKiBEZXN0cnVjdHMgYSBjb25uZWN0aW9uLiAqLworICAgIH5Db25uZWN0aW9uKCk7CisKKyAgICAvKiogQ3JlYXRlcyBhIGNvbm5lY3Rpb24uICovCisgICAgQ29ubmVjdGlvbigpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgd2l0aCB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBwb29sIGFuZCB0aGUgY29ubmVjdGlvbiBpZC4KKyAgICAgKiBUaGUgY29ubmVjdGlvbiBpZCBzaG91bGQgYmUgdW5pcXVlIGluIHRoZSB3aG9sZSBzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXNzb3IgICAgICB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBwb29sLgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIElkLgorICAgICAqLworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgIFNZTkNfQlVGRkVSSUQgPSBVSU5UMzJfTUFYLAorICAgIH07CisKK3ByaXZhdGU6CisgICAgYm9vbCBtSW5pdGlhbGl6ZWQ7CisgICAgc3A8QWNjZXNzb3I+IG1BY2Nlc3NvcjsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9DT05ORUNUSU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL09ic2VydmVyLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL09ic2VydmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjIzMTYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvT2JzZXJ2ZXIuY3BwCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiT2JzZXJ2ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitPYnNlcnZlcjo6T2JzZXJ2ZXIoKSB7Cit9CisKK09ic2VydmVyOjp+T2JzZXJ2ZXIoKSB7Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SU9ic2VydmVyIGZvbGxvdy4KK1JldHVybjx2b2lkPiBPYnNlcnZlcjo6b25NZXNzYWdlKGludDY0X3QgY29ubmVjdGlvbklkLCB1aW50MzJfdCBtc2dJZCkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgYXV0byBpdCA9IG1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoaXQgIT0gbUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9IGl0LT5zZWNvbmQubG9jaygpOworICAgICAgICBpZiAoIWNsaWVudCkgeworICAgICAgICAgICAgbUNsaWVudHMuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIGNsaWVudC0+cmVjZWl2ZUludmFsaWRhdGlvbihtc2dJZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKwordm9pZCBPYnNlcnZlcjo6YWRkQ2xpZW50KENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50PiAmd2NsaWVudCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBtQ2xpZW50cy5iZWdpbigpOyBpdCAhPSBtQ2xpZW50cy5lbmQoKTspIHsKKyAgICAgICAgaWYgKCFpdC0+c2Vjb25kLmxvY2soKSB8fCBpdC0+Zmlyc3QgPT0gY29ubmVjdGlvbklkKSB7CisgICAgICAgICAgICBpdCA9IG1DbGllbnRzLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbUNsaWVudHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbm5lY3Rpb25JZCwgd2NsaWVudCkpOworCit9CisKK3ZvaWQgT2JzZXJ2ZXI6OmRlbENsaWVudChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1DbGllbnRzLmVyYXNlKGNvbm5lY3Rpb25JZCk7Cit9CisKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvT2JzZXJ2ZXIuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL09ic2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiZDdjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL09ic2VydmVyLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfT0JTRVJWRVJfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9PQlNFUlZFUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lPYnNlcnZlci5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlICJCdWZmZXJQb29sQ2xpZW50LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgT2JzZXJ2ZXIgOiBwdWJsaWMgSU9ic2VydmVyIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklPYnNlcnZlciBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IG9uTWVzc2FnZShpbnQ2NF90IGNvbm5lY3Rpb25JZCwgdWludDMyX3QgbXNnSWQpIG92ZXJyaWRlOworCisgICAgfk9ic2VydmVyKCk7CisKKyAgICB2b2lkIGFkZENsaWVudChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4gJndjbGllbnQpOworCisgICAgdm9pZCBkZWxDbGllbnQoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKK3ByaXZhdGU6CisgICAgT2JzZXJ2ZXIoKTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ2xpZW50TWFuYWdlcjsKKworICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+PiBtQ2xpZW50czsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9PQlNFUlZFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5MDZjYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL2luY2x1ZGUvYnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSUE9PTFRZUEVTX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSUE9PTFRZUEVTX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworCitzdHJ1Y3QgQnVmZmVyUG9vbERhdGEgeworICAgIC8vIEZvciBsb2NhbCB1c2UsIHRvIHNwZWNpZnkgYSBidWZmZXJwb29sIChjbGllbnQgY29ubmVjdGlvbikgZm9yIGJ1ZmZlcnMuCisgICAgLy8gUmV0dXJuIHZhbHVlIGZyb20gY29ubmVjdCNJQWNjZXNzb3IoYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCkuCisgICAgaW50NjRfdCBtQ29ubmVjdGlvbklkOworICAgIC8vIEJ1ZmZlcklkCisgICAgdWludDMyX3QgbUlkOworCisgICAgQnVmZmVyUG9vbERhdGEoKSA6IG1Db25uZWN0aW9uSWQoMCksIG1JZCgwKSB7fQorCisgICAgQnVmZmVyUG9vbERhdGEoCisgICAgICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCwgdWludDMyX3QgaWQpCisgICAgICAgICAgICA6IG1Db25uZWN0aW9uSWQoY29ubmVjdGlvbklkKSwgbUlkKGlkKSB7fQorCisgICAgfkJ1ZmZlclBvb2xEYXRhKCkge30KK307CisKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjprVW5zeW5jaHJvbml6ZWRXcml0ZTsKKwordHlwZWRlZiB1aW50MzJfdCBCdWZmZXJJZDsKK3R5cGVkZWYgdWludDY0X3QgVHJhbnNhY3Rpb25JZDsKK3R5cGVkZWYgaW50NjRfdCBDb25uZWN0aW9uSWQ7CisKK2VudW0gOiBDb25uZWN0aW9uSWQgeworICAgIElOVkFMSURfQ09OTkVDVElPTklEID0gMCwKK307CisKK3R5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTxCdWZmZXJTdGF0dXNNZXNzYWdlLCBrU3luY2hyb25pemVkUmVhZFdyaXRlPiBCdWZmZXJTdGF0dXNRdWV1ZTsKK3R5cGVkZWYgQnVmZmVyU3RhdHVzUXVldWU6OkRlc2NyaXB0b3IgU3RhdHVzRGVzY3JpcHRvcjsKKwordHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2UsIGtVbnN5bmNocm9uaXplZFdyaXRlPgorICAgICAgICBCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZTsKK3R5cGVkZWYgQnVmZmVySW52YWxpZGF0aW9uUXVldWU6OkRlc2NyaXB0b3IgSW52YWxpZGF0aW9uRGVzY3JpcHRvcjsKKworLyoqCisgKiBBbGxvY2F0aW9uIHdyYXBwZXIgY2xhc3MgZm9yIGJ1ZmZlciBwb29sLgorICovCitzdHJ1Y3QgQnVmZmVyUG9vbEFsbG9jYXRpb24geworICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbUhhbmRsZTsKKworICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKCkgeworICAgICAgICByZXR1cm4gbUhhbmRsZTsKKyAgICB9CisKKyAgICBCdWZmZXJQb29sQWxsb2NhdGlvbihjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSkgOiBtSGFuZGxlKGhhbmRsZSkge30KKworICAgIH5CdWZmZXJQb29sQWxsb2NhdGlvbigpIHt9OworfTsKKworLyoqCisgKiBBbGxvY2F0b3Igd3JhcHBlciBjbGFzcyBmb3IgYnVmZmVyIHBvb2wuCisgKi8KK2NsYXNzIEJ1ZmZlclBvb2xBbGxvY2F0b3IgeworcHVibGljOgorCisgICAgLyoqCisgICAgICogQWxsb2NhdGUgYW4gYWxsb2NhdGlvbihidWZmZXIpIGZvciBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzCisgICAgICogQHBhcmFtIGFsbG9jICAgICBjcmVhdGVkIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gYWxsb2NTaXplIHNpemUgb2YgY3JlYXRlZCBhbGxvY2F0aW9uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYW4gYWxsb2NhdGlvbiBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICAgICAgICAgIHNpemVfdCAqYWxsb2NTaXplKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIG9mIGFuIG9sZCBhbGxvY2F0aW9uIGFyZQorICAgICAqIGNvbXBhdGlibGUgd2l0aCBuZXcgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgQnVmZmVyUG9vbEFsbG9jYXRvcigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgfkJ1ZmZlclBvb2xBbGxvY2F0b3IoKSA9IGRlZmF1bHQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSUE9PTFRZUEVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL2luY2x1ZGUvYnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1M2MzMDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9DTElFTlRNQU5BR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQ0xJRU5UTUFOQUdFUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lDbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlICJCdWZmZXJQb29sVHlwZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3NvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IENsaWVudE1hbmFnZXIgOiBwdWJsaWMgSUNsaWVudE1hbmFnZXIgeworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNsaWVudE1hbmFnZXIgZm9sbG93LgorICAgIFJldHVybjx2b2lkPiByZWdpc3RlclNlbmRlcihjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUFjY2Vzc29yPiYgYnVmZmVyUG9vbCwgcmVnaXN0ZXJTZW5kZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgLyoqIEdldHMgYW4gaW5zdGFuY2UuICovCisgICAgc3RhdGljIHNwPENsaWVudE1hbmFnZXI+IGdldEluc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbG9jYWwgY29ubmVjdGlvbiB3aXRoIGEgbmV3bHkgY3JlYXRlZCBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGxvY2F0b3IgICAgIGZvciBuZXcgYnVmZmVyIGFsbG9jYXRpb24uCisgICAgICogQHBhcmFtIHBDb25uZWN0aW9uSWQgSWQgb2YgdGhlIGNyZWF0ZWQgY29ubmVjdGlvbi4gVGhpcyBpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbS13aWRlIHVuaXF1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciBwb29sIGFuZCBhIGxvY2FsIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5CisgICAgICogICAgICAgICBjcmVhdGVkLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjcmVhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBjcmVhdGVkIGNvbm5lY3Rpb24gYXMgc2VuZGVyIGZvciByZW1vdGUgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWNlaXZlciAgICAgIFRoZSByZW1vdGUgcmVjZWl2aW5nIHByb2Nlc3MuCisgICAgICogQHBhcmFtIHNlbmRlcklkICAgICAgQSBsb2NhbCBjb25uZWN0aW9uIHdoaWNoIHdpbGwgc2VuZCBidWZmZXJzIHRvLgorICAgICAqIEBwYXJhbSByZWNlaXZlcklkICAgIElkIG9mIHRoZSBjcmVhdGVkIHJlY2VpdmluZyBjb25uZWN0aW9uIG9uIHRoZSByZWNlaXZlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIHJlY2VpdmluZyBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIG9uIHRoZQorICAgICAqICAgICAgICAgcmVjZWl2ZXIgcHJvY2Vzcy4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzZW5kZXIgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQUxSRUFEWV9FWElTVFMgdGhlIHJlY2VpdmluZyBjb25uZWN0aW9uIGlzIGFscmVhZHkgbWFkZS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZyZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkIHNlbmRlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnJlY2VpdmVySWQpOworCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIFRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICAvKioKKyAgICAgKiBFdmljdHMgY2FjaGVkIGFsbG9jYXRpb25zLiBJZiBpdCdzIGxvY2FsIGNvbm5lY3Rpb24sIHJlbGVhc2UgdGhlCisgICAgICogcHJldmlvdXMgYWxsb2NhdGlvbnMgYW5kIGRvIG5vdCByZWN5Y2xlIGN1cnJlbnQgYWN0aXZlIGFsbG9jYXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCBUaGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgcmVzZXR0ZWQuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgZmx1c2goQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZXMgYSBidWZmZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBUaGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIHBhcmFtcyAgICAgICAgVGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICBUaGUgbmF0aXZlIGhhbmRsZSB0byB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4gaGFuZGxlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGNsb25lZCBiZWZvcmUgdXNlLgorICAgICAqIEBwYXJhbSBidWZmZXIgICAgICAgIFRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHdhcyBhbGxvY2F0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIC8qKgorICAgICAqIFJlY2VpdmVzIGEgYnVmZmVyIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBUaGUgaWQgb2YgdGhlIHJlY2VpdmluZyBjb25uZWN0aW9uLgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIFRoZSBpZCBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIFRoZSBpZCBmb3IgdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gdGltZXN0YW1wVXMgICBUaGUgdGltZXN0YW1wIG9mIHRoZSBidWZmZXIgaXMgYmVpbmcgc2VudC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICBUaGUgbmF0aXZlIGhhbmRsZSB0byB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4gaGFuZGxlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGNsb25lZCBiZWZvcmUgdXNlLgorICAgICAqIEBwYXJhbSBidWZmZXIgICAgICAgIFRoZSByZWNlaXZlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgd2FzIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgdHJhbnNmZXIgdHJhbnNhY3Rpb24gdG8gdGhlIGJ1ZmZlciBwb29sLiBTZW5kcyBhIGJ1ZmZlcgorICAgICAqIHRvIG90aGVyIHJlbW90ZSBjbGllbnRzKGNvbm5lY3Rpb24pIGFmdGVyIHRoaXMgY2FsbCBoYXMgYmVlbiBzdWNjZWVkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXJJZCAgICBUaGUgaWQgb2YgdGhlIHJlY2VpdmluZyBjb25uZWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXIgICAgICAgIHRvIHRyYW5zZmVyCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgSWQgb2YgdGhlIHRyYW5zZmVyIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSB0aW1lc3RhbXBVcyAgIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGJ1ZmZlciB0cmFuc2FjdGlvbiBpcyBiZWluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBvc3RlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciB0cmFuc2FjdGlvbiB3YXMgcG9zdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzZW5kaW5nIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgcG9zdFNlbmQoQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpOworCisgICAgLyoqCisgICAgICogIFRpbWUgb3V0IGluYWN0aXZlIGxpbmdlcmluZyBjb25uZWN0aW9ucyBhbmQgY2xvc2UuCisgICAgICovCisgICAgdm9pZCBjbGVhblVwKCk7CisKKyAgICAvKiogRGVzdHJ1Y3RzIHRoZSBtYW5hZ2VyIG9mIGJ1ZmZlciBwb29sIGNsaWVudHMuICAqLworICAgIH5DbGllbnRNYW5hZ2VyKCk7Citwcml2YXRlOgorICAgIHN0YXRpYyBzcDxDbGllbnRNYW5hZ2VyPiBzSW5zdGFuY2U7CisgICAgc3RhdGljIHN0ZDo6bXV0ZXggc0luc3RhbmNlTG9jazsKKworICAgIGNsYXNzIEltcGw7CisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEltcGw+IG1JbXBsOworCisgICAgQ2xpZW50TWFuYWdlcigpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0NMSUVOVE1BTkFHRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI0NGY2MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNWbmRrSGlkbEJ1ZmZlcnBvb2xWMl8wVGFyZ2V0U2luZ2xlVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiYWxsb2NhdG9yLmNwcCIsCisgICAgICAgICJzaW5nbGUuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliZm1xIiwKKyAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJib3RoIiwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c1ZuZGtIaWRsQnVmZmVycG9vbFYyXzBUYXJnZXRNdWx0aVRlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFsbG9jYXRvci5jcHAiLAorICAgICAgICAibXVsdGkuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliZm1xIiwKKyAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJib3RoIiwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL09XTkVSUyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzMzZTBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvT1dORVJTCkBAIC0wLDAgKzEsOSBAQAorIyBNZWRpYSB0ZWFtCitsYWpvc0Bnb29nbGUuY29tCitwYXdpbkBnb29nbGUuY29tCit0YWtsZWVAZ29vZ2xlLmNvbQord29uc2lrQGdvb2dsZS5jb20KKworIyBWVFMgdGVhbQoreWltQGdvb2dsZS5jb20KK3podW95YW9AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2FsbG9jYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzZjdlYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2FsbG9jYXRvci5jcHAKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y3V0aWxzL2FzaG1lbS5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSAiYWxsb2NhdG9yLmgiCisKK3VuaW9uIFBhcmFtcyB7CisgIHN0cnVjdCB7CisgICAgdWludDMyX3QgY2FwYWNpdHk7CisgIH0gZGF0YTsKKyAgdWludDhfdCBhcnJheVswXTsKKyAgUGFyYW1zKCkgOiBkYXRhezB9IHt9CisgIFBhcmFtcyh1aW50MzJfdCBzaXplKQorICAgICAgOiBkYXRhe3NpemV9IHt9Cit9OworCisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBIYW5kbGVBc2htZW0gOiBwdWJsaWMgbmF0aXZlX2hhbmRsZV90IHsKKyAgSGFuZGxlQXNobWVtKGludCBhc2htZW1GZCwgc2l6ZV90IHNpemUpCisgICAgOiBuYXRpdmVfaGFuZGxlX3QoY0hlYWRlciksCisgICAgbUZkc3sgYXNobWVtRmQgfSwKKyAgICBtSW50c3sgaW50IChzaXplICYgMHhGRkZGRkZGRiksIGludCgodWludDY0X3Qoc2l6ZSkgPj4gMzIpICYgMHhGRkZGRkZGRiksIGtNYWdpYyB9IHt9CisKKyAgaW50IGFzaG1lbUZkKCkgY29uc3QgeyByZXR1cm4gbUZkcy5tQXNobWVtOyB9CisgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgIHJldHVybiBzaXplX3QodW5zaWduZWQobUludHMubVNpemVMbykpCisgICAgICAgIHwgc2l6ZV90KHVpbnQ2NF90KHVuc2lnbmVkKG1JbnRzLm1TaXplSGkpKSA8PCAzMik7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqIGNvbnN0IG8pOworCitwcm90ZWN0ZWQ6CisgIHN0cnVjdCB7CisgICAgaW50IG1Bc2htZW07CisgIH0gbUZkczsKKyAgc3RydWN0IHsKKyAgICBpbnQgbVNpemVMbzsKKyAgICBpbnQgbVNpemVIaTsKKyAgICBpbnQgbU1hZ2ljOworICB9IG1JbnRzOworCitwcml2YXRlOgorICBlbnVtIHsKKyAgICBrTWFnaWMgPSAnYWhtXHgwMCcsCisgICAgbnVtRmRzID0gc2l6ZW9mKG1GZHMpIC8gc2l6ZW9mKGludCksCisgICAgbnVtSW50cyA9IHNpemVvZihtSW50cykgLyBzaXplb2YoaW50KSwKKyAgICB2ZXJzaW9uID0gc2l6ZW9mKG5hdGl2ZV9oYW5kbGVfdCkKKyAgfTsKKyAgY29uc3Qgc3RhdGljIG5hdGl2ZV9oYW5kbGVfdCBjSGVhZGVyOworfTsKKworY29uc3QgbmF0aXZlX2hhbmRsZV90IEhhbmRsZUFzaG1lbTo6Y0hlYWRlciA9IHsKKyAgSGFuZGxlQXNobWVtOjp2ZXJzaW9uLAorICBIYW5kbGVBc2htZW06Om51bUZkcywKKyAgSGFuZGxlQXNobWVtOjpudW1JbnRzLAorICB7fQorfTsKKworYm9vbCBIYW5kbGVBc2htZW06OmlzVmFsaWQoY29uc3QgbmF0aXZlX2hhbmRsZV90ICogY29uc3QgbykgeworICBpZiAoIW8gfHwgbWVtY21wKG8sICZjSGVhZGVyLCBzaXplb2YoY0hlYWRlcikpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqb3RoZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBIYW5kbGVBc2htZW0qPihvKTsKKyAgcmV0dXJuIG90aGVyLT5tSW50cy5tTWFnaWMgPT0ga01hZ2ljOworfQorCitjbGFzcyBBbGxvY2F0aW9uQXNobWVtIHsKK3ByaXZhdGU6CisgIEFsbG9jYXRpb25Bc2htZW0oaW50IGFzaG1lbUZkLCBzaXplX3QgY2FwYWNpdHksIGJvb2wgcmVzKQorICAgIDogbUhhbmRsZShhc2htZW1GZCwgY2FwYWNpdHkpLAorICAgICAgbUluaXQocmVzKSB7fQorCitwdWJsaWM6CisgIHN0YXRpYyBBbGxvY2F0aW9uQXNobWVtICpBbGxvYyhzaXplX3Qgc2l6ZSkgeworICAgIGNvbnN0ZXhwciBzdGF0aWMgY29uc3QgY2hhciAqa0FsbG9jYXRpb25UYWcgPSAiYnVmZmVycG9vbF90ZXN0IjsKKyAgICBpbnQgYXNobWVtRmQgPSBhc2htZW1fY3JlYXRlX3JlZ2lvbihrQWxsb2NhdGlvblRhZywgc2l6ZSk7CisgICAgcmV0dXJuIG5ldyBBbGxvY2F0aW9uQXNobWVtKGFzaG1lbUZkLCBzaXplLCBhc2htZW1GZCA+PSAwKTsKKyAgfQorCisgIH5BbGxvY2F0aW9uQXNobWVtKCkgeworICAgIGlmIChtSW5pdCkgeworICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZSgmbUhhbmRsZSk7CisgICAgfQorICB9CisKKyAgY29uc3QgSGFuZGxlQXNobWVtICpoYW5kbGUoKSB7CisgICAgcmV0dXJuICZtSGFuZGxlOworICB9CisKK3ByaXZhdGU6CisgIEhhbmRsZUFzaG1lbSBtSGFuZGxlOworICBib29sIG1Jbml0OworICAvLyBUT0RPOiBtYXBwaW5nIGFuZCBtYXAgZmQKK307CisKK3N0cnVjdCBBbGxvY2F0aW9uRHRvciB7CisgIEFsbG9jYXRpb25EdG9yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPiAmYWxsb2MpCisgICAgICA6IG1BbGxvYyhhbGxvYykge30KKworICB2b2lkIG9wZXJhdG9yKCkoQnVmZmVyUG9vbEFsbG9jYXRpb24gKnBvb2xBbGxvYykgeyBkZWxldGUgcG9vbEFsbG9jOyB9CisKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+IG1BbGxvYzsKK307CisKK30KKworCitSZXN1bHRTdGF0dXMgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OmFsbG9jYXRlKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgc2l6ZV90ICphbGxvY1NpemUpIHsKKyAgUGFyYW1zIGFzaG1lbVBhcmFtczsKKyAgbWVtY3B5KCZhc2htZW1QYXJhbXMsIHBhcmFtcy5kYXRhKCksIHN0ZDo6bWluKHNpemVvZihQYXJhbXMpLCBwYXJhbXMuc2l6ZSgpKSk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+IGFzaG1lbUFsbG9jID0KKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPigKKyAgICAgICAgICBBbGxvY2F0aW9uQXNobWVtOjpBbGxvYyhhc2htZW1QYXJhbXMuZGF0YS5jYXBhY2l0eSkpOworICBpZiAoYXNobWVtQWxsb2MpIHsKKyAgICBCdWZmZXJQb29sQWxsb2NhdGlvbiAqcHRyID0gbmV3IEJ1ZmZlclBvb2xBbGxvY2F0aW9uKGFzaG1lbUFsbG9jLT5oYW5kbGUoKSk7CisgICAgaWYgKHB0cikgeworICAgICAgKmFsbG9jID0gc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPihwdHIsIEFsbG9jYXRpb25EdG9yKGFzaG1lbUFsbG9jKSk7CisgICAgICBpZiAoKmFsbG9jKSB7CisgICAgICAgICAgKmFsbG9jU2l6ZSA9IGFzaG1lbVBhcmFtcy5kYXRhLmNhcGFjaXR5OworICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgfQorICAgICAgZGVsZXRlIHB0cjsKKyAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK2Jvb2wgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OmNvbXBhdGlibGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm5ld1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmb2xkUGFyYW1zKSB7CisgIHNpemVfdCBuZXdTaXplID0gbmV3UGFyYW1zLnNpemUoKTsKKyAgc2l6ZV90IG9sZFNpemUgPSBvbGRQYXJhbXMuc2l6ZSgpOworICBpZiAobmV3U2l6ZSA9PSBvbGRTaXplKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdTaXplOyArK2kpIHsKKyAgICAgIGlmIChuZXdQYXJhbXNbaV0gIT0gb2xkUGFyYW1zW2ldKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCkgeworICBpZiAoIUhhbmRsZUFzaG1lbTo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqbyA9IHN0YXRpY19jYXN0PGNvbnN0IEhhbmRsZUFzaG1lbSo+KGhhbmRsZSk7CisgIHVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopbW1hcCgKKyAgICAgIE5VTEwsIG8tPnNpemUoKSwgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG8tPmFzaG1lbUZkKCksIDApOworCisgIGlmIChwdHIgIT0gTUFQX0ZBSUxFRCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgby0+c2l6ZSgpOyArK2kpIHsKKyAgICAgIHB0cltpXSA9IHZhbDsKKyAgICB9CisgICAgbXVubWFwKHB0ciwgby0+c2l6ZSgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OlZlcmlmeShjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpIHsKKyAgaWYgKCFIYW5kbGVBc2htZW06OmlzVmFsaWQoaGFuZGxlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBIYW5kbGVBc2htZW0gKm8gPSBzdGF0aWNfY2FzdDxjb25zdCBIYW5kbGVBc2htZW0qPihoYW5kbGUpOworICB1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoCisgICAgICBOVUxMLCBvLT5zaXplKCksIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgby0+YXNobWVtRmQoKSwgMCk7CisKKyAgaWYgKHB0ciAhPSBNQVBfRkFJTEVEKSB7CisgICAgYm9vbCByZXMgPSB0cnVlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgby0+c2l6ZSgpOyArK2kpIHsKKyAgICAgIGlmIChwdHJbaV0gIT0gdmFsKSB7CisgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgbXVubWFwKHB0ciwgby0+c2l6ZSgpKTsKKyAgICByZXR1cm4gcmVzOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpIHsKKyAgY29uc3RleHByIHN0YXRpYyBpbnQga0FsbG9jYXRpb25TaXplID0gMTAyNCAqIDEwOworICBQYXJhbXMgYXNobWVtUGFyYW1zKGtBbGxvY2F0aW9uU2l6ZSk7CisKKyAgcGFyYW1zLT5hc3NpZ24oYXNobWVtUGFyYW1zLmFycmF5LCBhc2htZW1QYXJhbXMuYXJyYXkgKyBzaXplb2YoYXNobWVtUGFyYW1zKSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9hbGxvY2F0b3IuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyODFkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9hbGxvY2F0b3IuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBWTkRLX0hJRExfQlVGRkVSUE9PTF9WMl8wX0FMTE9DQVRPUl9ICisjZGVmaW5lIFZOREtfSElETF9CVUZGRVJQT09MX1YyXzBfQUxMT0NBVE9SX0gKKworI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgQnVmZmVyUG9vbEFsbG9jYXRpb247Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICBCdWZmZXJQb29sQWxsb2NhdG9yOworCisvLyBidWZmZXIgYWxsb2NhdG9yIGZvciB0aGUgdGVzdHMKK2NsYXNzIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yIDogcHVibGljIEJ1ZmZlclBvb2xBbGxvY2F0b3IgeworIHB1YmxpYzoKKyAgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3IoKSB7fQorCisgIH5UZXN0QnVmZmVyUG9vbEFsbG9jYXRvcigpIG92ZXJyaWRlIHt9CisKKyAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqYWxsb2NTaXplKSBvdmVycmlkZTsKKworICBib29sIGNvbXBhdGlibGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm5ld1BhcmFtcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpIG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIEZpbGwoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKTsKKworICBzdGF0aWMgYm9vbCBWZXJpZnkoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKTsKKworfTsKKworLy8gcmV0cmlldmUgYnVmZmVyIGFsbG9jYXRvciBwYXJhbXRlcnMKK3ZvaWQgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcyhzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKTsKKworI2VuZGlmICAvLyBWTkRLX0hJRExfQlVGRkVSUE9PTF9WMl8wX0FMTE9DQVRPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9tdWx0aS5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9tdWx0aS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhiNjk5MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL211bHRpLmNwcApAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiYnVmZmZlcnBvb2xfdW5pdF90ZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9MZWdhY3lTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAiYWxsb2NhdG9yLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6QnVmZmVySWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6Q29ubmVjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6VHJhbnNhY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE7CisKK25hbWVzcGFjZSB7CisKKy8vIGNvbW11bmljYXRpb24gbWVzc2FnZSB0eXBlcyBiZXR3ZWVuIHByb2Nlc3Nlcy4KK2VudW0gUGlwZUNvbW1hbmQgOiBpbnQzMl90IHsKKyAgICBJTklUX09LID0gMCwKKyAgICBJTklUX0VSUk9SLAorICAgIFNFTkQsCisgICAgUkVDRUlWRV9PSywKKyAgICBSRUNFSVZFX0VSUk9SLAorfTsKKworLy8gY29tbXVuaWNhdGlvbiBtZXNzYWdlIGJldHdlZW4gcHJvY2Vzc2VzLgordW5pb24gUGlwZU1lc3NhZ2UgeworICAgIHN0cnVjdCAgeworICAgICAgICBpbnQzMl90IGNvbW1hbmQ7CisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkOworICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkOworICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgICAgICAgIGludDY0X3QgIHRpbWVzdGFtcFVzOworICAgIH0gZGF0YTsKKyAgICBjaGFyIGFycmF5WzBdOworfTsKKworLy8gbWVkaWEuYnVmZmVycG9vbCB0ZXN0IHNldHVwCitjbGFzcyBCdWZmZXJwb29sTXVsdGlUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgICBtUmVjZWl2ZXJQaWQgPSAtMTsKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gZmFsc2U7CisKKyAgICBBU1NFUlRfVFJVRShwaXBlKG1Db21tYW5kUGlwZUZkcykgPT0gMCk7CisgICAgQVNTRVJUX1RSVUUocGlwZShtUmVzdWx0UGlwZUZkcykgPT0gMCk7CisKKyAgICBtUmVjZWl2ZXJQaWQgPSBmb3JrKCk7CisgICAgQVNTRVJUX1RSVUUobVJlY2VpdmVyUGlkID49IDApOworCisgICAgaWYgKG1SZWNlaXZlclBpZCA9PSAwKSB7CisgICAgICBkb1JlY2VpdmVyKCk7CisgICAgICAvLyBJbiBvcmRlciB0byBpZ25vcmUgZ3Rlc3QgYmVoYXZpb3VyLCB3YWl0IGZvciBiZWluZyBraWxsZWQgZnJvbQorICAgICAgLy8gdGVhckRvd24KKyAgICAgIHBhdXNlKCk7CisgICAgfQorCisgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIEFTU0VSVF9ORShtTWFuYWdlciwgbnVsbHB0cik7CisKKyAgICBtQWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcj4oKTsKKyAgICBBU1NFUlRfVFJVRSgoYm9vbCltQWxsb2NhdG9yKTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5jcmVhdGUobUFsbG9jYXRvciwgJm1Db25uZWN0aW9uSWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gdHJ1ZTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICBpZiAobVJlY2VpdmVyUGlkID4gMCkgeworICAgICAga2lsbChtUmVjZWl2ZXJQaWQsIFNJR0tJTEwpOworICAgICAgaW50IHdzdGF0dXM7CisgICAgICB3YWl0KCZ3c3RhdHVzKTsKKyAgICB9CisKKyAgICBpZiAobUNvbm5lY3Rpb25WYWxpZCkgeworICAgICAgbU1hbmFnZXItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgIH0KKyAgfQorCisgcHJvdGVjdGVkOgorICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgIH0KKworICBhbmRyb2lkOjpzcDxDbGllbnRNYW5hZ2VyPiBtTWFuYWdlcjsKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgIGJvb2wgbUNvbm5lY3Rpb25WYWxpZDsKKyAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgIHBpZF90IG1SZWNlaXZlclBpZDsKKyAgaW50IG1Db21tYW5kUGlwZUZkc1syXTsKKyAgaW50IG1SZXN1bHRQaXBlRmRzWzJdOworCisgIGJvb2wgc2VuZE1lc3NhZ2UoaW50ICpwaXBlcywgY29uc3QgUGlwZU1lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBpbnQgcmV0ID0gd3JpdGUocGlwZXNbMV0sIG1lc3NhZ2UuYXJyYXksIHNpemVvZihQaXBlTWVzc2FnZSkpOworICAgIHJldHVybiByZXQgPT0gc2l6ZW9mKFBpcGVNZXNzYWdlKTsKKyAgfQorCisgIGJvb2wgcmVjZWl2ZU1lc3NhZ2UoaW50ICpwaXBlcywgUGlwZU1lc3NhZ2UgKm1lc3NhZ2UpIHsKKyAgICBpbnQgcmV0ID0gcmVhZChwaXBlc1swXSwgbWVzc2FnZS0+YXJyYXksIHNpemVvZihQaXBlTWVzc2FnZSkpOworICAgIHJldHVybiByZXQgPT0gc2l6ZW9mKFBpcGVNZXNzYWdlKTsKKyAgfQorCisgIHZvaWQgZG9SZWNlaXZlcigpIHsKKyAgICBjb25maWd1cmVScGNUaHJlYWRwb29sKDEsIGZhbHNlKTsKKyAgICBQaXBlTWVzc2FnZSBtZXNzYWdlOworICAgIG1NYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpZiAoIW1NYW5hZ2VyKSB7CisgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUX0VSUk9SOworICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJBc1NlcnZpY2UoKTsKKyAgICBpZiAoc3RhdHVzICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUX0VSUk9SOworICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUX09LOworICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKworICAgIHJlY2VpdmVNZXNzYWdlKG1Db21tYW5kUGlwZUZkcywgJm1lc3NhZ2UpOworICAgIHsKKyAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqcmhhbmRsZSA9IG51bGxwdHI7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHJidWZmZXI7CisgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbU1hbmFnZXItPnJlY2VpdmUoCisgICAgICAgICAgbWVzc2FnZS5kYXRhLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5kYXRhLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgbWVzc2FnZS5kYXRhLmJ1ZmZlcklkLCBtZXNzYWdlLmRhdGEudGltZXN0YW1wVXMsICZyaGFuZGxlLCAmcmJ1ZmZlcik7CisgICAgICBtTWFuYWdlci0+Y2xvc2UobWVzc2FnZS5kYXRhLmNvbm5lY3Rpb25JZCk7CisgICAgICBpZiAoc3RhdHVzICE9IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgaWYgKCFUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VmVyaWZ5KHJoYW5kbGUsIDB4NzcpKSB7CisgICAgICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6UkVDRUlWRV9FUlJPUjsKKyAgICAgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlJFQ0VJVkVfT0s7CisgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICB9Cit9OworCisvLyBCdWZmZXIgdHJhbnNmZXIgdGVzdCBiZXR3ZWVuIHByb2Nlc3Nlcy4KK1RFU1RfRihCdWZmZXJwb29sTXVsdGlUZXN0LCBUcmFuc2ZlckJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBQaXBlTWVzc2FnZSBtZXNzYWdlOworCisgIEFTU0VSVF9UUlVFKHJlY2VpdmVNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCAmbWVzc2FnZSkpOworCisgIGFuZHJvaWQ6OnNwPElDbGllbnRNYW5hZ2VyPiByZWNlaXZlciA9IElDbGllbnRNYW5hZ2VyOjpnZXRTZXJ2aWNlKCk7CisgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkOworICBBU1NFUlRfVFJVRSgoYm9vbClyZWNlaXZlcik7CisKKyAgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyU2VuZGVyKHJlY2VpdmVyLCBtQ29ubmVjdGlvbklkLCAmcmVjZWl2ZXJJZCk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgeworICAgIG5hdGl2ZV9oYW5kbGVfdCAqc2hhbmRsZSA9IG51bGxwdHI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBzYnVmZmVyOworICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgICBpbnQ2NF90IHBvc3RVczsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisKKyAgICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZzaGFuZGxlLCAmc2J1ZmZlcik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworCisgICAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoc2hhbmRsZSwgMHg3NykpOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPnBvc3RTZW5kKHJlY2VpdmVySWQsIHNidWZmZXIsICZ0cmFuc2FjdGlvbklkLCAmcG9zdFVzKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisKKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpTRU5EOworICAgIG1lc3NhZ2UuZGF0YS5idWZmZXJJZCA9IHNidWZmZXItPm1JZDsKKyAgICBtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkID0gcmVjZWl2ZXJJZDsKKyAgICBtZXNzYWdlLmRhdGEudHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgbWVzc2FnZS5kYXRhLnRpbWVzdGFtcFVzID0gcG9zdFVzOworICAgIHNlbmRNZXNzYWdlKG1Db21tYW5kUGlwZUZkcywgbWVzc2FnZSk7CisgIH0KKyAgRVhQRUNUX1RSVUUocmVjZWl2ZU1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsICZtZXNzYWdlKSk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIHNldGVudigiVFJFQkxFX1RFU1RJTkdfT1ZFUlJJREUiLCAidHJ1ZSIsIHRydWUpOworICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgTE9HKElORk8pIDw8ICJUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvc2luZ2xlLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL3NpbmdsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3ZWRjZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL3NpbmdsZS5jcHAKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgImJ1ZmZmZXJwb29sX3VuaXRfdGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvTGVnYWN5U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJhbGxvY2F0b3IuaCIKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpCdWZmZXJJZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpDb25uZWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpUcmFuc2FjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YTsKKworbmFtZXNwYWNlIHsKKworLy8gTnVtYmVyIG9mIGl0ZXJhdGlvbiBmb3IgYnVmZmVyIGFsbG9jYXRpb24gdGVzdC4KK2NvbnN0ZXhwciBzdGF0aWMgaW50IGtOdW1BbGxvY2F0aW9uVGVzdCA9IDM7CisKKy8vIE51bWJlciBvZiBpdGVyYXRpb24gZm9yIGJ1ZmZlciByZWN5Y2xpbmcgdGVzdC4KK2NvbnN0ZXhwciBzdGF0aWMgaW50IGtOdW1SZWN5Y2xlVGVzdCA9IDM7CisKKy8vIG1lZGlhLmJ1ZmZlcnBvb2wgdGVzdCBzZXR1cAorY2xhc3MgQnVmZmVycG9vbFNpbmdsZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIG1Db25uZWN0aW9uVmFsaWQgPSBmYWxzZTsKKworICAgIG1NYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBBU1NFUlRfTkUobU1hbmFnZXIsIG51bGxwdHIpOworCisgICAgbUFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I+KCk7CisgICAgQVNTRVJUX1RSVUUoKGJvb2wpbUFsbG9jYXRvcik7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+Y3JlYXRlKG1BbGxvY2F0b3IsICZtQ29ubmVjdGlvbklkKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gdHJ1ZTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlclNlbmRlcihtTWFuYWdlciwgbUNvbm5lY3Rpb25JZCwgJm1SZWNlaXZlcklkKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpBTFJFQURZX0VYSVNUUyAmJgorICAgICAgICAgICAgICAgIG1SZWNlaXZlcklkID09IG1Db25uZWN0aW9uSWQpOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIGlmIChtQ29ubmVjdGlvblZhbGlkKSB7CisgICAgICBtTWFuYWdlci0+Y2xvc2UobUNvbm5lY3Rpb25JZCk7CisgICAgfQorICB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgfQorCisgIGFuZHJvaWQ6OnNwPENsaWVudE1hbmFnZXI+IG1NYW5hZ2VyOworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgYm9vbCBtQ29ubmVjdGlvblZhbGlkOworICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgQ29ubmVjdGlvbklkIG1SZWNlaXZlcklkOworCit9OworCisvLyBCdWZmZXIgYWxsb2NhdGlvbiB0ZXN0LgorLy8gQ2hlY2sgd2hldGhlciBlYWNoIGJ1ZmZlciBhbGxvY2F0aW9uIGlzIGRvbmUgc3VjY2Vzc2Z1bGx5IHdpdGgKKy8vIHVuaXF1ZSBidWZmZXIgaWQuCitURVNUX0YoQnVmZmVycG9vbFNpbmdsZVRlc3QsIEFsbG9jYXRlQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlcltrTnVtQWxsb2NhdGlvblRlc3RdOworICBuYXRpdmVfaGFuZGxlX3QgKmFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtQWxsb2NhdGlvblRlc3Q7ICsraSkgeworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJmJ1ZmZlcltpXSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUFsbG9jYXRpb25UZXN0OyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBrTnVtQWxsb2NhdGlvblRlc3Q7ICsraikgeworICAgICAgQVNTRVJUX1RSVUUoYnVmZmVyW2ldLT5tSWQgIT0gYnVmZmVyW2pdLT5tSWQpOworICAgIH0KKyAgfQorICBFWFBFQ1RfVFJVRShrTnVtQWxsb2NhdGlvblRlc3QgPiAxKTsKK30KKworLy8gQnVmZmVyIHJlY3ljbGUgdGVzdC4KKy8vIENoZWNrIHdoZXRoZXIgZGUtYWxsb2NhdGVkIGJ1ZmZlcnMgYXJlIHJlY3ljbGVkLgorVEVTVF9GKEJ1ZmZlcnBvb2xTaW5nbGVUZXN0LCBSZWN5Y2xlQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKworICBCdWZmZXJJZCBiaWRba051bVJlY3ljbGVUZXN0XTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtUmVjeWNsZVRlc3Q7ICsraSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVyOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqYWxsb2NIYW5kbGUgPSBudWxscHRyOworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJmJ1ZmZlcik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICAgIGJpZFtpXSA9IGJ1ZmZlci0+bUlkOworICB9CisgIGZvciAoaW50IGkgPSAxOyBpIDwga051bVJlY3ljbGVUZXN0OyArK2kpIHsKKyAgICBBU1NFUlRfVFJVRShiaWRbaSAtIDFdID09IGJpZFtpXSk7CisgIH0KKyAgRVhQRUNUX1RSVUUoa051bVJlY3ljbGVUZXN0ID4gMSk7Cit9CisKKy8vIEJ1ZmZlciB0cmFuc2ZlciB0ZXN0LgorLy8gQ2hlY2sgd2hldGhlciBidWZmZXIgaXMgdHJhbnNmZXJyZWQgdG8gYW5vdGhlciBjbGllbnQgc3VjY2Vzc2Z1bGx5LgorVEVTVF9GKEJ1ZmZlcnBvb2xTaW5nbGVUZXN0LCBUcmFuc2ZlckJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gc2J1ZmZlciwgcmJ1ZmZlcjsKKyAgbmF0aXZlX2hhbmRsZV90ICphbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgIG5hdGl2ZV9oYW5kbGVfdCAqcmVjdkhhbmRsZSA9IG51bGxwdHI7CisKKyAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICBpbnQ2NF90IHBvc3RVczsKKworICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZzYnVmZmVyKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChhbGxvY0hhbmRsZSwgMHg3NykpOworICBzdGF0dXMgPSBtTWFuYWdlci0+cG9zdFNlbmQobVJlY2VpdmVySWQsIHNidWZmZXIsICZ0cmFuc2FjdGlvbklkLCAmcG9zdFVzKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICBzdGF0dXMgPSBtTWFuYWdlci0+cmVjZWl2ZShtUmVjZWl2ZXJJZCwgdHJhbnNhY3Rpb25JZCwgc2J1ZmZlci0+bUlkLCBwb3N0VXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN2SGFuZGxlLCAmcmJ1ZmZlcik7CisgIEVYUEVDVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OlZlcmlmeShyZWN2SGFuZGxlLCAweDc3KSk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICBMT0coSU5GTykgPDwgIlRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvQW5kcm9pZC5tayBiL21lZGlhL2NvZGVjMi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZDczOWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ4IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIERPQ1VNRU5UQVRJT04gR0VORVJBVElPTgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQzJfUk9PVCA6PSAkKGNhbGwgbXktZGlyKQorCitDMl9ET0NTX1JPT1QgOj0gJChPVVRfRElSKS90YXJnZXQvY29tbW9uL2RvY3MvY29kZWMyCisKK0MyX09VVF9URU1QIDo9ICQoUFJPRFVDVF9PVVQpL2dlbi9FVEMvQ29kZWMyLWRvY3NfaW50ZXJtZWRpYXRlcworCitDMl9ET1hZIDo9ICQob3IgJChzaGVsbCBjb21tYW5kIC12IGRveHlnZW4pLFwKKwkJJChzaGVsbCBjb21tYW5kIC12IC9BcHBsaWNhdGlvbnMvRG94eWdlbi5hcHAvQ29udGVudHMvUmVzb3VyY2VzL2RveHlnZW4pKQorCisuUEhPTlk6IGNoZWNrLWRveHlnZW4KK2NoZWNrLWRveHlnZW46CitpZm5kZWYgQzJfRE9YWQorCSQoZXJyb3IgJ2RveHlnZW4gaXMgbm90IGF2YWlsYWJsZScpCitlbmRpZgorCiskKEMyX09VVF9URU1QKS9kb3h5LWFwaS5jb25maWc6ICQoQzJfUk9PVCkvZG9jcy9kb3h5Z2VuLmNvbmZpZworCSMgb25seSBkb2N1bWVudCBpbmNsdWRlIGRpcmVjdG9yeSwgbm8gaW50ZXJuYWwgc2VjdGlvbnMKKwlzZWQgJ3MvXCheSU5QVVQgKj0uKlwpL1wxaW5jbHVkZVwvLzsgXAorCXMvXCheSU5URVJOQUxfRE9DUyAqPSAqXCkuKi9cMU5PLzsgXAorCXMvXCheRU5BQkxFRF9TRUNUSU9OUyAqPS4qXClJTlRFUk5BTFwoLipcKS4qL1wxXDIvOyBcCisJczpcKF5PVVRQVVRfRElSRUNUT1JZICo9IFwpb3V0OlwxJyQoT1VUX0RJUiknOjsnIFwKKwkJJChDMl9ST09UKS9kb2NzL2RveHlnZW4uY29uZmlnID4gJEAKKworJChDMl9PVVRfVEVNUCkvZG94eS1pbnRlcm5hbC5jb25maWc6ICQoQzJfUk9PVCkvZG9jcy9kb3h5Z2VuLmNvbmZpZworCXNlZCAnczpcKF5PVVRQVVRfRElSRUNUT1JZICo9IFwpb3V0XCguKlwpYXBpOlwxJyQoT1VUX0RJUiknXDJpbnRlcm5hbDo7JyBcCisJCSQoQzJfUk9PVCkvZG9jcy9kb3h5Z2VuLmNvbmZpZyA+ICRACisKKy5QSE9OWTogZG9jcy1hcGkKK2RvY3MtYXBpOiAkKEMyX09VVF9URU1QKS9kb3h5LWFwaS5jb25maWcgY2hlY2stZG94eWdlbgorCWVjaG8gQVBJIGRvY3MgYXJlIGJ1aWxkaW5nIGluICQoQzJfRE9DU19ST09UKS9hcGkKKwlybSAtcmYgJChDMl9ET0NTX1JPT1QpL2FwaQorCW1rZGlyIC1wICQoQzJfRE9DU19ST09UKS9hcGkKKwkkKEMyX0RPWFkpICQoQzJfT1VUX1RFTVApL2RveHktYXBpLmNvbmZpZworCisuUEhPTlk6IGRvY3MtaW50ZXJuYWwKK2RvY3MtaW50ZXJuYWw6ICQoQzJfT1VUX1RFTVApL2RveHktaW50ZXJuYWwuY29uZmlnIGNoZWNrLWRveHlnZW4KKwllY2hvIEludGVybmFsIGRvY3MgYXJlIGJ1aWxkaW5nIGluICQoQzJfRE9DU19ST09UKS9pbnRlcm5hbAorCXJtIC1yZiAkKEMyX0RPQ1NfUk9PVCkvaW50ZXJuYWwKKwlta2RpciAtcCAkKEMyX0RPQ1NfUk9PVCkvaW50ZXJuYWwKKwkkKEMyX0RPWFkpICQoQzJfT1VUX1RFTVApL2RveHktaW50ZXJuYWwuY29uZmlnCisKKy5QSE9OWTogZG9jcy1hbGwKK2RvY3MtYWxsOiBkb2NzLWFwaSBkb2NzLWludGVybmFsCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChjYWxsIG15LWRpcikpCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllY2E1ODUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQW5kcm9pZC5icApAQCAtMCwwICsxLDMwIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2FhY2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyU29mdEFhY0RlYy5jcHAiLAorICAgICAgICAiRHJjUHJlc01vZGVXcmFwLmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJGcmF1bmhvZmVyQUFDIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2FhY2VuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QWFjRW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYkZyYXVuaG9mZXJBQUMiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMDBkMzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmNwcApAQCAtMCwwICsxLDkzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QWFjRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG51bWVyaWM+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBYWNEZWMuaCIKKworI2RlZmluZSBGSUxFUkVBRF9NQVhfTEFZRVJTIDIKKworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMIC0xNi4wICAvKiA2NCotMC4yNWRCID0gLTE2IGRCIGJlbG93IGZ1bGwgc2NhbGUgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUICAgMS4wIC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCAxLjAgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fSEVBVlkgICAvKiBzd2l0Y2ggZm9yIGhlYXZ5IGNvbXByZXNzaW9uIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0VGRkVDVCAzICAvKiBNUEVHLUQgRFJDIGVmZmVjdCB0eXBlOyAzID0+IExpbWl0ZWQgcGxheWJhY2sgcmFuZ2UgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCAoMC4yNSkgLyogZW5jb2RlciB0YXJnZXQgbGV2ZWw7IC0xID0+IHRoZSB2YWx1ZSBpcyB1bmtub3duLCBvdGhlcndpc2UgZEIgc3RlcCB2YWx1ZSAoZS5nLiA2NCBmb3IgLTE2IGRCKSAqLworI2RlZmluZSBNQVhfQ0hBTk5FTF9DT1VOVCAgICAgICAgICAgIDggIC8qIG1heGltdW0gbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIHRoYXQgY2FuIGJlIGRlY29kZWQgKi8KKy8vIG5hbWVzIG9mIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBEUkMgc2V0dGluZ3MKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfUkVGX0xFVkVMICAiYWFjX2RyY19yZWZlcmVuY2VfbGV2ZWwiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0NVVCAgICAgICAgImFhY19kcmNfY3V0IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9CT09TVCAgICAgICJhYWNfZHJjX2Jvb3N0IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9IRUFWWSAgICAgICJhYWNfZHJjX2hlYXZ5IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FTkNfTEVWRUwgImFhY19kcmNfZW5jX3RhcmdldF9sZXZlbCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRUZGRUNUICAgICAicm8uYWFjX2RyY19lZmZlY3RfdHlwZSIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYWFjLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRBYWNEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7CisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxPdXRwdXREZWxheSwgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dCgydSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICA3MzUwLCA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAKKyAgICAgICAgICAgICAgICB9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgOTYwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWFjRm9ybWF0LCBDMl9QQVJBTUtFWV9BQUNfUEFDS0FHSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1BYWNGb3JtYXRJbmZvOjppbnB1dCgwdSwgQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfUkFXKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1BYWNGb3JtYXQsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX1JBVywgQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfQURUUworICAgICAgICAgICAgICAgIH0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1BYWNGb3JtYXQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRV9QUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VMRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRVJfU0NBTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX1hIRX0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVU5VU0VECisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjQ29tcHJlc3NNb2RlLCBDMl9QQVJBTUtFWV9EUkNfQ09NUFJFU1NJT05fTU9ERSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjQ29tcHJlc3Npb25Nb2RlVHVuaW5nOjppbnB1dCgwdSwgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURyY0NvbXByZXNzTW9kZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX09ETV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0xJR0hULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fSEVBVll9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjQ29tcHJlc3NNb2RlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNUYXJnZXRSZWZMZXZlbCwgQzJfUEFSQU1LRVlfRFJDX1RBUkdFVF9SRUZFUkVOQ0VfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY1RhcmdldFJlZmVyZW5jZUxldmVsVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjVGFyZ2V0UmVmTGV2ZWwsIHZhbHVlKS5pblJhbmdlKC0zMS43NSwgMC4yNSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY1RhcmdldFJlZkxldmVsKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNFbmNUYXJnZXRMZXZlbCwgQzJfUEFSQU1LRVlfRFJDX0VOQ09ERURfVEFSR0VUX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNFbmNvZGVkVGFyZ2V0TGV2ZWxUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNFbmNUYXJnZXRMZXZlbCwgdmFsdWUpLmluUmFuZ2UoLTMxLjc1LCAwLjI1KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjRW5jVGFyZ2V0TGV2ZWwpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0Jvb3N0RmFjdG9yLCBDMl9QQVJBTUtFWV9EUkNfQk9PU1RfRkFDVE9SKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNCb29zdEZhY3RvclR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY0Jvb3N0RmFjdG9yLCB2YWx1ZSkuaW5SYW5nZSgwLCAxLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0Jvb3N0RmFjdG9yKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNBdHRlbnVhdGlvbkZhY3RvciwgQzJfUEFSQU1LRVlfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUikKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjQXR0ZW51YXRpb25GYWN0b3JUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjQXR0ZW51YXRpb25GYWN0b3IsIHZhbHVlKS5pblJhbmdlKDAsIDEuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjQXR0ZW51YXRpb25GYWN0b3IpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0VmZmVjdFR5cGUsIEMyX1BBUkFNS0VZX0RSQ19FRkZFQ1RfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjRWZmZWN0VHlwZVR1bmluZzo6aW5wdXQoMHUsIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xJTUlURURfUExBWUJBQ0tfUkFOR0UpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EcmNFZmZlY3RUeXBlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX09ETV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX09GRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xBVEVfTklHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTk9JU1lfRU5WSVJPTk1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTElNSVRFRF9QTEFZQkFDS19SQU5HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MT1dfUExBWUJBQ0tfTEVWRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfRElBTE9HX0VOSEFOQ0VNRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0dFTkVSQUxfQ09NUFJFU1NJT059KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjRWZmZWN0VHlwZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIGJvb2wgaXNBZHRzKCkgY29uc3QgeyByZXR1cm4gbUFhY0Zvcm1hdC0+dmFsdWUgPT0gQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfQURUUzsgfQorICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisgICAgaW50MzJfdCBnZXREcmNDb21wcmVzc01vZGUoKSBjb25zdCB7IHJldHVybiBtRHJjQ29tcHJlc3NNb2RlLT52YWx1ZSA9PSBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZID8gMSA6IDA7IH0KKyAgICBpbnQzMl90IGdldERyY1RhcmdldFJlZkxldmVsKCkgY29uc3QgeyByZXR1cm4gKG1EcmNUYXJnZXRSZWZMZXZlbC0+dmFsdWUgPD0gMCA/IC1tRHJjVGFyZ2V0UmVmTGV2ZWwtPnZhbHVlICogNC4gKyAwLjUgOiAtMSk7IH0KKyAgICBpbnQzMl90IGdldERyY0VuY1RhcmdldExldmVsKCkgY29uc3QgeyByZXR1cm4gKG1EcmNFbmNUYXJnZXRMZXZlbC0+dmFsdWUgPD0gMCA/IC1tRHJjRW5jVGFyZ2V0TGV2ZWwtPnZhbHVlICogNC4gKyAwLjUgOiAtMSk7IH0KKyAgICBpbnQzMl90IGdldERyY0Jvb3N0RmFjdG9yKCkgY29uc3QgeyByZXR1cm4gbURyY0Jvb3N0RmFjdG9yLT52YWx1ZSAqIDEyNy4gKyAwLjU7IH0KKyAgICBpbnQzMl90IGdldERyY0F0dGVudWF0aW9uRmFjdG9yKCkgY29uc3QgeyByZXR1cm4gbURyY0F0dGVudWF0aW9uRmFjdG9yLT52YWx1ZSAqIDEyNy4gKyAwLjU7IH0KKyAgICBpbnQzMl90IGdldERyY0VmZmVjdFR5cGUoKSBjb25zdCB7IHJldHVybiBtRHJjRWZmZWN0VHlwZS0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUFhY0Zvcm1hdEluZm86OmlucHV0PiBtQWFjRm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0NvbXByZXNzaW9uTW9kZVR1bmluZzo6aW5wdXQ+IG1EcmNDb21wcmVzc01vZGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWxUdW5pbmc6OmlucHV0PiBtRHJjVGFyZ2V0UmVmTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjRW5jb2RlZFRhcmdldExldmVsVHVuaW5nOjppbnB1dD4gbURyY0VuY1RhcmdldExldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0Jvb3N0RmFjdG9yVHVuaW5nOjppbnB1dD4gbURyY0Jvb3N0RmFjdG9yOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0F0dGVudWF0aW9uRmFjdG9yVHVuaW5nOjppbnB1dD4gbURyY0F0dGVudWF0aW9uRmFjdG9yOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0VmZmVjdFR5cGVUdW5pbmc6OmlucHV0PiBtRHJjRWZmZWN0VHlwZTsKKyAgICAvLyBUT0RPIEFkZCA6IEMyU3RyZWFtQWFjU2JyTW9kZVR1bmluZworfTsKKworQzJTb2Z0QWFjRGVjOjpDMlNvZnRBYWNEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUFBQ0RlY29kZXIobnVsbHB0ciksCisgICAgICBtU3RyZWFtSW5mbyhudWxscHRyKSwKKyAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCisgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyKG51bGxwdHIpIHsKK30KKworQzJTb2Z0QWFjRGVjOjp+QzJTb2Z0QWFjRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNEZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRGVjOjpvblN0b3AoKSB7CisgICAgZHJhaW5EZWNvZGVyKCk7CisgICAgLy8gcmVzZXQgdGhlICJjb25maWd1cmVkIiBzdGF0ZQorICAgIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkID0gMDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID0gMDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkID0gMDsKKyAgICBtQnVmZmVyc0luZm8uY2xlYXIoKTsKKworICAgIC8vIFRvIG1ha2UgdGhlIGNvZGVjIGJlaGF2ZSB0aGUgc2FtZSBiZWZvcmUgYW5kIGFmdGVyIGEgcmVzZXQsIHdlIG5lZWQgdG8gaW52YWxpZGF0ZSB0aGUKKyAgICAvLyBzdHJlYW1pbmZvIHN0cnVjdC4gVGhpcyBkb2VzIHRoYXQ6CisgICAgbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUgPSAwOyAvLyBUT0RPOiBtU3RyZWFtSW5mbyBpcyByZWFkIG9ubHkKKworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFhY0RlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRBYWNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobUFBQ0RlY29kZXIpIHsKKyAgICAgICAgYWFjRGVjb2Rlcl9DbG9zZShtQUFDRGVjb2Rlcik7CisgICAgICAgIG1BQUNEZWNvZGVyID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXIpIHsKKyAgICAgICAgZGVsZXRlW10gbU91dHB1dERlbGF5UmluZ0J1ZmZlcjsKKyAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlciA9IG51bGxwdHI7CisgICAgfQorfQorCitzdGF0dXNfdCBDMlNvZnRBYWNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIEFMT0dWKCJpbml0RGVjb2RlcigpIik7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICBtQUFDRGVjb2RlciA9IGFhY0RlY29kZXJfT3BlbihUVF9NUDRfQURJRiwgLyogbnVtIGxheWVycyAqLyAxKTsKKyAgICBpZiAobUFBQ0RlY29kZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtU3RyZWFtSW5mbyA9IGFhY0RlY29kZXJfR2V0U3RyZWFtSW5mbyhtQUFDRGVjb2Rlcik7CisgICAgICAgIGlmIChtU3RyZWFtSW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBPSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkID0gMDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSA9IDIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVCAqIGtOdW1EZWxheUJsb2Nrc01heDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyID0gbmV3IHNob3J0W21PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplXTsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID0gMDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkID0gMDsKKworICAgIGlmIChtQUFDRGVjb2RlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJBQUMgZGVjb2RlciBpcyBudWxsLiBUT0RPOiBDYW4gbm90IGNhbGwgYWFjRGVjb2Rlcl9TZXRQYXJhbSBpbiB0aGUgZm9sbG93aW5nIGNvZGUiKTsKKyAgICB9CisKKyAgICAvL2FhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fTElNSVRFUl9FTkFCTEUsIDApOworCisgICAgLy9pbml0IERSQyB3cmFwcGVyCisgICAgbURyY1dyYXAuc2V0RGVjb2RlckhhbmRsZShtQUFDRGVjb2Rlcik7CisgICAgbURyY1dyYXAuc3VibWl0U3RyZWFtRGF0YShtU3RyZWFtSW5mbyk7CisKKyAgICAvLyBmb3Igc3RyZWFtcyB0aGF0IGNvbnRhaW4gbWV0YWRhdGEsIHVzZSB0aGUgbW9iaWxlIHByb2ZpbGUgRFJDIHNldHRpbmdzIHVubGVzcyBvdmVycmlkZGVuIGJ5IHBsYXRmb3JtIHByb3BlcnRpZXMKKyAgICAvLyBUT0RPOiBjaGFuZ2UgdGhlIERSQyBzZXR0aW5ncyBkZXBlbmRpbmcgb24gYXVkaW8gb3V0cHV0IGRldmljZSB0eXBlIChIRE1JLCBsb2Fkc3BlYWtlciwgaGVhZHBob25lKQorCisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVAorICAgIGludDMyX3QgdGFyZ2V0UmVmTGV2ZWwgPSBtSW50Zi0+Z2V0RHJjVGFyZ2V0UmVmTGV2ZWwoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBvZiAlZCIsIHRhcmdldFJlZkxldmVsKTsKKyAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9UQVJHRVQsICh1bnNpZ25lZCl0YXJnZXRSZWZMZXZlbCk7CisKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUgorCisgICAgaW50MzJfdCBhdHRlbnVhdGlvbkZhY3RvciA9IG1JbnRmLT5nZXREcmNBdHRlbnVhdGlvbkZhY3RvcigpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyBhdHRlbnVhdGlvbiBmYWN0b3Igb2YgJWQiLCBhdHRlbnVhdGlvbkZhY3Rvcik7CisgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUiwgKHVuc2lnbmVkKWF0dGVudWF0aW9uRmFjdG9yKTsKKworICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1IKKyAgICBpbnQzMl90IGJvb3N0RmFjdG9yID0gbUludGYtPmdldERyY0Jvb3N0RmFjdG9yKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc2lyZWQgRFJDIGJvb3N0IGZhY3RvciBvZiAlZCIsIGJvb3N0RmFjdG9yKTsKKyAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1IsICh1bnNpZ25lZClib29zdEZhY3Rvcik7CisKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlkKKyAgICBpbnQzMl90IGNvbXByZXNzTW9kZSA9IG1JbnRmLT5nZXREcmNDb21wcmVzc01vZGUoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzcmllZCBEUkMgaGVhdnkgY29tcHJlc3Npb24gc3dpdGNoIG9mICVkIiwgY29tcHJlc3NNb2RlKTsKKyAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWSwgKHVuc2lnbmVkKWNvbXByZXNzTW9kZSk7CisKKyAgICAvLyBEUkNfUFJFU19NT0RFX1dSQVBfRU5DT0RFUl9UQVJHRVQKKyAgICBpbnQzMl90IGVuY1RhcmdldExldmVsID0gbUludGYtPmdldERyY0VuY1RhcmdldExldmVsKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGVuY29kZXItc2lkZSBEUkMgcmVmZXJlbmNlIGxldmVsIG9mICVkIiwgZW5jVGFyZ2V0TGV2ZWwpOworICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVCwgKHVuc2lnbmVkKWVuY1RhcmdldExldmVsKTsKKworICAgIC8vIEFBQ19VTklEUkNfU0VUX0VGRkVDVAorICAgIGludDMyX3QgZWZmZWN0VHlwZSA9IG1JbnRmLT5nZXREcmNFZmZlY3RUeXBlKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIE1QRUctRCBEUkMgZWZmZWN0IHR5cGUgJWQiLCBlZmZlY3RUeXBlKTsKKyAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfVU5JRFJDX1NFVF9FRkZFQ1QsIGVmZmVjdFR5cGUpOworCisgICAgLy8gQnkgZGVmYXVsdCwgdGhlIGRlY29kZXIgY3JlYXRlcyBhIDUuMSBjaGFubmVsIGRvd25taXggc2lnbmFsLgorICAgIC8vIEZvciBzZXZlbiBhbmQgZWlnaHQgY2hhbm5lbCBpbnB1dCBzdHJlYW1zLCBlbmFibGUgNi4xIGFuZCA3LjEgY2hhbm5lbCBvdXRwdXQKKyAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfUENNX01BWF9PVVRQVVRfQ0hBTk5FTFMsIC0xKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2Jvb2wgQzJTb2Z0QWFjRGVjOjpvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludDMyX3QgbnVtU2FtcGxlcykgeworICAgIGlmIChudW1TYW1wbGVzID09IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChvdXRwdXREZWxheVJpbmdCdWZmZXJTcGFjZUxlZnQoKSA8IG51bVNhbXBsZXMpIHsKKyAgICAgICAgQUxPR0UoIlJJTkcgQlVGRkVSIFdPVUxEIE9WRVJGTE9XIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyArIG51bVNhbXBsZXMgPD0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUKKyAgICAgICAgICAgICYmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA8PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MKKyAgICAgICAgICAgICAgICAgICAgfHwgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgKyBudW1TYW1wbGVzKSkgeworICAgICAgICAvLyBmYXN0ZXIgbWVtY29weSBsb29wIHdpdGhvdXQgY2hlY2tzLCBpZiB0aGUgcHJlY29uZGl0aW9ucyBhbGxvdyB0aGlzCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclttT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MrK10gPSBzYW1wbGVzW2ldOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zIC09IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoInNsb3cgQzJTb2Z0QWFjRGVjOjpvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKCkiKTsKKworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJbbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zXSA9IHNhbXBsZXNbaV07CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MrKzsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgPj0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgLT0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCArPSBudW1TYW1wbGVzOworICAgIHJldHVybiB0cnVlOworfQorCitpbnQzMl90IEMyU29mdEFhY0RlYzo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcyhJTlRfUENNICpzYW1wbGVzLCBpbnQzMl90IG51bVNhbXBsZXMpIHsKKworICAgIGlmIChudW1TYW1wbGVzID4gbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCkgeworICAgICAgICBBTE9HRSgiUklORyBCVUZGRVIgV09VTEQgVU5ERVJSVU4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyArIG51bVNhbXBsZXMgPD0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUKKyAgICAgICAgICAgICYmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgPCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcworICAgICAgICAgICAgICAgICAgICB8fCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgPj0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgKyBudW1TYW1wbGVzKSkgeworICAgICAgICAvLyBmYXN0ZXIgbWVtY29weSBsb29wIHdpdGhvdXQgY2hlY2tzLCBpZiB0aGUgcHJlY29uZGl0aW9ucyBhbGxvdyB0aGlzCisgICAgICAgIGlmIChzYW1wbGVzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgICAgIHNhbXBsZXNbaV0gPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyW21PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zKytdOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgKz0gbnVtU2FtcGxlczsKKyAgICAgICAgfQorICAgICAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPj0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zIC09IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoInNsb3cgQzJTb2Z0QWFjRGVjOjpvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKCkiKTsKKworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzYW1wbGVzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBzYW1wbGVzW2ldID0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclttT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvc107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcysrOworICAgICAgICAgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID49IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgLT0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCAtPSBudW1TYW1wbGVzOworICAgIHJldHVybiBudW1TYW1wbGVzOworfQorCitpbnQzMl90IEMyU29mdEFhY0RlYzo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpIHsKKyAgICByZXR1cm4gbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZDsKK30KKworaW50MzJfdCBDMlNvZnRBYWNEZWM6Om91dHB1dERlbGF5UmluZ0J1ZmZlclNwYWNlTGVmdCgpIHsKKyAgICByZXR1cm4gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUgLSBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCk7Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRGVjOjpkcmFpblJpbmdCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBib29sIGVvcykgeworICAgIHdoaWxlICghbUJ1ZmZlcnNJbmZvLmVtcHR5KCkgJiYgb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpCisgICAgICAgICAgICA+PSBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7CisgICAgICAgIEluZm8gJm91dEluZm8gPSBtQnVmZmVyc0luZm8uZnJvbnQoKTsKKyAgICAgICAgQUxPR1YoIm91dEluZm8uZnJhbWVJbmRleCA9ICUiIFBSSXU2NCwgb3V0SW5mby5mcmFtZUluZGV4KTsKKyAgICAgICAgaW50IHNhbXBsZXNpemUgX191bnVzZWQgPSBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICAgICAgaW50IGF2YWlsYWJsZSA9IG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKKyAgICAgICAgaW50IG51bUZyYW1lcyA9IG91dEluZm8uZGVjb2RlZFNpemVzLnNpemUoKTsKKyAgICAgICAgaW50IG51bVNhbXBsZXMgPSBudW1GcmFtZXMgKiAobVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyk7CisgICAgICAgIGlmIChhdmFpbGFibGUgPCBudW1TYW1wbGVzKSB7CisgICAgICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyA9IGF2YWlsYWJsZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiVkIHNhbXBsZXMgYXZhaWxhYmxlICglZCksIG9yICVkIGZyYW1lcyIsCisgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywgYXZhaWxhYmxlLCBudW1GcmFtZXMpOworICAgICAgICBBTE9HVigiZ2V0dGluZyAlZCBmcm9tIHJpbmdidWZmZXIiLCBudW1TYW1wbGVzKTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYpPiBmaWxsV29yayA9CisgICAgICAgICAgICBbJmJsb2NrLCBudW1TYW1wbGVzLCBwb29sLCB0aGlzXSgpCisgICAgICAgICAgICAgICAgICAgIC0+IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYpPiB7CisgICAgICAgICAgICAgICAgYXV0byBmaWxsRW1wdHlXb3JrID0gW10oCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywgYzJfc3RhdHVzX3QgZXJyKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycjsKKyAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGEgJm91dHB1dCA9IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpwbGFjZWhvbGRlcnM7CisgICAgICAgICAgICAgICAgaWYgKG51bVNhbXBsZXMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpiaW5kKGZpbGxFbXB0eVdvcmssIF8xLCBDMl9PSyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcsIHByb3BlciB1c2FnZSwgZXRjLgorICAgICAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KSwgdXNhZ2UsICZibG9jayk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIGZldGNoIGEgbGluZWFyIGJsb2NrICglZCkiLCBlcnIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpiaW5kKGZpbGxFbXB0eVdvcmssIF8xLCBDMl9OT19NRU1PUlkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgSU5UX1BDTSAqb3V0QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxJTlRfUENNICo+KHdWaWV3LmRhdGEoKSk7CisgICAgICAgICAgICAgICAgaW50MzJfdCBucyA9IG91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMob3V0QnVmZmVyLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBpZiAobnMgIT0gbnVtU2FtcGxlcykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgibm90IGEgY29tcGxldGUgZnJhbWUgb2Ygc2FtcGxlcyBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YmluZChmaWxsRW1wdHlXb3JrLCBfMSwgQzJfQ09SUlVQVEVEKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIFtidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2spXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YSAmb3V0cHV0ID0gd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0OworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfSgpOworCisgICAgICAgIGlmICh3b3JrICYmIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9PSBjMl9jbnRyNjRfdChvdXRJbmZvLmZyYW1lSW5kZXgpKSB7CisgICAgICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmlzaChvdXRJbmZvLmZyYW1lSW5kZXgsIGZpbGxXb3JrKTsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJvdXQgdGltZXN0YW1wICUiIFBSSXU2NCAiIC8gJXUiLCBvdXRJbmZvLnRpbWVzdGFtcCwgYmxvY2sgPyBibG9jay0+Y2FwYWNpdHkoKSA6IDApOworICAgICAgICBtQnVmZmVyc0luZm8ucG9wX2Zyb250KCk7CisgICAgfQorfQorCit2b2lkIEMyU29mdEFhY0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBVQ0hBUiogaW5CdWZmZXJbRklMRVJFQURfTUFYX0xBWUVSU107CisgICAgVUlOVCBpbkJ1ZmZlckxlbmd0aFtGSUxFUkVBRF9NQVhfTEFZRVJTXSA9IHswfTsKKyAgICBVSU5UIGJ5dGVzVmFsaWRbRklMRVJFQURfTUFYX0xBWUVSU10gPSB7MH07CisKKyAgICBJTlRfUENNIHRtcE91dEJ1ZmZlclsyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlRdOworICAgIEMyUmVhZFZpZXcgdmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIHNpemVfdCBvZmZzZXQgPSAwdTsKKyAgICBzaXplX3Qgc2l6ZSA9IDB1OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgc2l6ZSA9IHZpZXcuY2FwYWNpdHkoKTsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMDsKKworICAgIC8vVE9ETworI2lmIDAKKyAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCAmJiAhY29kZWNDb25maWcpIHsKKyAgICAgICAgQUxPR1coImZpcnN0IGJ1ZmZlciBzaG91bGQgaGF2ZSBGTEFHX0NPREVDX0NPTkZJRyBzZXQiKTsKKyAgICAgICAgY29kZWNDb25maWcgPSB0cnVlOworICAgIH0KKyNlbmRpZgorICAgIGlmIChjb2RlY0NvbmZpZyAmJiBzaXplID4gMHUpIHsKKyAgICAgICAgLy8gY29uc3RfY2FzdCBiZWNhdXNlIG9mIGxpYkFBQ2RlYyBtZXRob2Qgc2lnbmF0dXJlLgorICAgICAgICBpbkJ1ZmZlclswXSA9IGNvbnN0X2Nhc3Q8VUNIQVIgKj4odmlldy5kYXRhKCkgKyBvZmZzZXQpOworICAgICAgICBpbkJ1ZmZlckxlbmd0aFswXSA9IHNpemU7CisKKyAgICAgICAgQUFDX0RFQ09ERVJfRVJST1IgZGVjb2RlckVyciA9CisgICAgICAgICAgICBhYWNEZWNvZGVyX0NvbmZpZ1JhdyhtQUFDRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGgpOworCisgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IEFBQ19ERUNfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJhYWNEZWNvZGVyX0NvbmZpZ1JhdyBkZWNvZGVyRXJyID0gMHglNC40eCIsIGRlY29kZXJFcnIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgSW5mbyBpbkluZm87CisgICAgaW5JbmZvLmZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICBpbkluZm8udGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKTsKKyAgICBpbkluZm8uYnVmZmVyU2l6ZSA9IHNpemU7CisgICAgaW5JbmZvLmRlY29kZWRTaXplcy5jbGVhcigpOworICAgIHdoaWxlIChzaXplID4gMHUpIHsKKyAgICAgICAgQUxPR1YoInNpemUgPSAlenUiLCBzaXplKTsKKyAgICAgICAgaWYgKG1JbnRmLT5pc0FkdHMoKSkgeworICAgICAgICAgICAgc2l6ZV90IGFkdHNIZWFkZXJTaXplID0gMDsKKyAgICAgICAgICAgIC8vIHNraXAgMzAgYml0cywgYWFjX2ZyYW1lX2xlbmd0aCBmb2xsb3dzLgorICAgICAgICAgICAgLy8gc3Nzc3Nzc3Mgc3Nzc2lpaXAgcHBmZmZmUGMgY2NvaENDbGwgbGxsbGxsbGwgbGxsPz8/Pz8KKworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYWR0c0hlYWRlciA9IHZpZXcuZGF0YSgpICsgb2Zmc2V0OworCisgICAgICAgICAgICBib29sIHNpZ25hbEVycm9yID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDcpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQXVkaW8gZGF0YSB0b28gc2hvcnQgdG8gY29udGFpbiBldmVuIHRoZSBBRFRTIGhlYWRlci4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIkdvdCAlenUgYnl0ZXMuIiwgc2l6ZSk7CisgICAgICAgICAgICAgICAgaGV4ZHVtcChhZHRzSGVhZGVyLCBzaXplKTsKKyAgICAgICAgICAgICAgICBzaWduYWxFcnJvciA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJvb2wgcHJvdGVjdGlvbkFic2VudCA9IChhZHRzSGVhZGVyWzFdICYgMSk7CisKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBhYWNfZnJhbWVfbGVuZ3RoID0KKyAgICAgICAgICAgICAgICAgICAgKChhZHRzSGVhZGVyWzNdICYgMykgPDwgMTEpCisgICAgICAgICAgICAgICAgICAgIHwgKGFkdHNIZWFkZXJbNF0gPDwgMykKKyAgICAgICAgICAgICAgICAgICAgfCAoYWR0c0hlYWRlcls1XSA+PiA1KTsKKworICAgICAgICAgICAgICAgIGlmIChzaXplIDwgYWFjX2ZyYW1lX2xlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBhdWRpbyBkYXRhIGZvciB0aGUgY29tcGxldGUgZnJhbWUuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR290ICV6dSBieXRlcywgZnJhbWUgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIEFEVFMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWFkZXIgaXMgJXUgYnl0ZXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBhYWNfZnJhbWVfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgaGV4ZHVtcChhZHRzSGVhZGVyLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgc2lnbmFsRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFkdHNIZWFkZXJTaXplID0gKHByb3RlY3Rpb25BYnNlbnQgPyA3IDogOSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhYWNfZnJhbWVfbGVuZ3RoIDwgYWR0c0hlYWRlclNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0X2Nhc3QgYmVjYXVzZSBvZiBsaWJBQUNkZWMgbWV0aG9kIHNpZ25hdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyWzBdID0gY29uc3RfY2FzdDxVQ0hBUiAqPihhZHRzSGVhZGVyICsgYWR0c0hlYWRlclNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGhbMF0gPSBhYWNfZnJhbWVfbGVuZ3RoIC0gYWR0c0hlYWRlclNpemU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBhZHRzSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgLT0gYWR0c0hlYWRlclNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzaWduYWxFcnJvcikgeworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGNvbnN0X2Nhc3QgYmVjYXVzZSBvZiBsaWJBQUNkZWMgbWV0aG9kIHNpZ25hdHVyZS4KKyAgICAgICAgICAgIGluQnVmZmVyWzBdID0gY29uc3RfY2FzdDxVQ0hBUiAqPih2aWV3LmRhdGEoKSArIG9mZnNldCk7CisgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aFswXSA9IHNpemU7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaWxsIGFuZCBkZWNvZGUKKyAgICAgICAgYnl0ZXNWYWxpZFswXSA9IGluQnVmZmVyTGVuZ3RoWzBdOworCisgICAgICAgIElOVCBwcmV2U2FtcGxlUmF0ZSA9IG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlOworICAgICAgICBJTlQgcHJldk51bUNoYW5uZWxzID0gbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworCisgICAgICAgIGFhY0RlY29kZXJfRmlsbChtQUFDRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1ZhbGlkKTsKKworICAgICAgICAvLyBydW4gRFJDIGNoZWNrCisgICAgICAgIG1EcmNXcmFwLnN1Ym1pdFN0cmVhbURhdGEobVN0cmVhbUluZm8pOworICAgICAgICBtRHJjV3JhcC51cGRhdGUoKTsKKworICAgICAgICBVSU5UIGluQnVmZmVyVXNlZExlbmd0aCA9IGluQnVmZmVyTGVuZ3RoWzBdIC0gYnl0ZXNWYWxpZFswXTsKKyAgICAgICAgc2l6ZSAtPSBpbkJ1ZmZlclVzZWRMZW5ndGg7CisgICAgICAgIG9mZnNldCArPSBpbkJ1ZmZlclVzZWRMZW5ndGg7CisKKyAgICAgICAgQUFDX0RFQ09ERVJfRVJST1IgZGVjb2RlckVycjsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKG91dHB1dERlbGF5UmluZ0J1ZmZlclNwYWNlTGVmdCgpIDwKKyAgICAgICAgICAgICAgICAgICAgKG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nIGRlY29kZTogbm90IGVub3VnaCBzcGFjZSBsZWZ0IGluIHJpbmdidWZmZXIiKTsKKyAgICAgICAgICAgICAgICAvLyBkaXNjYXJkIGJ1ZmZlcgorICAgICAgICAgICAgICAgIHNpemUgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgbnVtQ29uc3VtZWQgPSBtU3RyZWFtSW5mby0+bnVtVG90YWxCeXRlczsKKyAgICAgICAgICAgIGRlY29kZXJFcnIgPSBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKG1BQUNEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wT3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBmbGFncyAqLyk7CisKKyAgICAgICAgICAgIG51bUNvbnN1bWVkID0gbVN0cmVhbUluZm8tPm51bVRvdGFsQnl0ZXMgLSBudW1Db25zdW1lZDsKKworICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgPT0gQUFDX0RFQ19OT1RfRU5PVUdIX0JJVFMpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluSW5mby5kZWNvZGVkU2l6ZXMucHVzaF9iYWNrKG51bUNvbnN1bWVkKTsKKworICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgICAgIEFMT0dXKCJhYWNEZWNvZGVyX0RlY29kZUZyYW1lIGRlY29kZXJFcnIgPSAweCU0LjR4IiwgZGVjb2RlckVycik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChieXRlc1ZhbGlkWzBdICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYnl0ZXNWYWxpZFswXSAhPSAwIHNob3VsZCBuZXZlciBoYXBwZW4iKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNpemVfdCBudW1PdXRCeXRlcyA9CisgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKworICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgPT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgICAgIGlmICghb3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyh0bXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSkgeworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJBQUMgZGVjb2RlciByZXR1cm5lZCBlcnJvciAweCU0LjR4LCBzdWJzdGl0dXRpbmcgc2lsZW5jZSIsIGRlY29kZXJFcnIpOworCisgICAgICAgICAgICAgICAgbWVtc2V0KHRtcE91dEJ1ZmZlciwgMCwgbnVtT3V0Qnl0ZXMpOyAvLyBUT0RPOiBjaGVjayBmb3Igb3ZlcmZsb3cKKworICAgICAgICAgICAgICAgIGlmICghb3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyh0bXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSkgeworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBEaXNjYXJkIGlucHV0IGJ1ZmZlci4KKyAgICAgICAgICAgICAgICBzaXplID0gMDsKKworICAgICAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19UUERFQ19DTEVBUl9CVUZGRVIsIDEpOworCisgICAgICAgICAgICAgICAgLy8gQWZ0ZXIgYW4gZXJyb3IsIHJlcGxhY2UgYnVmZmVyU2l6ZSB3aXRoIHRoZSBzdW0gb2YgdGhlCisgICAgICAgICAgICAgICAgLy8gZGVjb2RlZFNpemVzIHRvIHJlc3luY2hyb25pemUgdGhlIGluL291dCBsaXN0cy4KKyAgICAgICAgICAgICAgICBpbkluZm8uZGVjb2RlZFNpemVzLnBvcF9iYWNrKCk7CisgICAgICAgICAgICAgICAgaW5JbmZvLmJ1ZmZlclNpemUgPSBzdGQ6OmFjY3VtdWxhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBpbkluZm8uZGVjb2RlZFNpemVzLmJlZ2luKCksIGluSW5mby5kZWNvZGVkU2l6ZXMuZW5kKCksIDApOworCisgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBQUMrL2VBQUMrIHN0cmVhbXMgY2FuIGJlIHNpZ25hbGxlZCBpbiB0d28gd2F5czogZWl0aGVyIGV4cGxpY2l0bHkKKyAgICAgICAgICAgICAqIG9yIGltcGxpY2l0bHksIGFjY29yZGluZyB0byBNUEVHNCBzcGVjLiBBQUMrL2VBQUMrIGlzIGEgZHVhbAorICAgICAgICAgICAgICogcmF0ZSBzeXN0ZW0gYW5kIHRoZSBzYW1wbGluZyByYXRlIGluIHRoZSBmaW5hbCBvdXRwdXQgaXMgYWN0dWFsbHkKKyAgICAgICAgICAgICAqIGRvdWJsZWQgY29tcGFyZWQgd2l0aCB0aGUgY29yZSBBQUMgZGVjb2RlciBzYW1wbGluZyByYXRlLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEV4cGxpY2l0IHNpZ25hbGxpbmcgaXMgZG9uZSBieSBleHBsaWNpdGx5IGRlZmluaW5nIFNCUiBhdWRpbyBvYmplY3QKKyAgICAgICAgICAgICAqIHR5cGUgaW4gdGhlIGJpdHN0cmVhbS4gSW1wbGljaXQgc2lnbmFsbGluZyBpcyBkb25lIGJ5IGVtYmVkZGluZworICAgICAgICAgICAgICogU0JSIGNvbnRlbnQgaW4gQUFDIGV4dGVuc2lvbiBwYXlsb2FkIHNwZWNpZmljIHRvIFNCUiwgYW5kIGhlbmNlCisgICAgICAgICAgICAgKiByZXF1aXJlcyBhbiBBQUMgZGVjb2RlciB0byBwZXJmb3JtIHByZS1jaGVja3Mgb24gYWN0dWFsIGF1ZGlvIGZyYW1lcy4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBUaHVzLCB3ZSBjb3VsZCBub3Qgc2F5IGZvciBzdXJlIHdoZXRoZXIgYSBzdHJlYW0gaXMKKyAgICAgICAgICAgICAqIEFBQysvZUFBQysgdW50aWwgdGhlIGZpcnN0IGRhdGEgZnJhbWUgaXMgZGVjb2RlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCFtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSB8fCAhbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgKChtSW5wdXRCdWZmZXJDb3VudCA+IDIpICYmIChtT3V0cHV0QnVmZmVyQ291bnQgPD0gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkludmFsaWQgQUFDIHN0cmVhbSIpOworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgZGVjb2RlckVyciwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIC8vIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgLy8gfQorICAgICAgICAgICAgfSBlbHNlIGlmICgobVN0cmVhbUluZm8tPnNhbXBsZVJhdGUgIT0gcHJldlNhbXBsZVJhdGUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMgIT0gcHJldk51bUNoYW5uZWxzKSkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJSZWNvbmZpZ3VyaW5nIGRlY29kZXI6ICVkLT4lZCBIeiwgJWQtPiVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgICAgICAgICAgICBwcmV2U2FtcGxlUmF0ZSwgbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgcHJldk51bUNoYW5uZWxzLCBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpOworCisgICAgICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygwdSwgbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgJnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mbyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgZG9lcyBub3QgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSB2YWx1ZXMgYXJlCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIGFsdGVyZWQgZHVyaW5nIGNvbmZpZy4KKyAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGEgJm91dHB1dCA9IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShzYW1wbGVSYXRlSW5mbykpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KGNoYW5uZWxDb3VudEluZm8pKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIFVwZGF0ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoInNpemUgPSAlenUiLCBzaXplKTsKKyAgICAgICAgfSB3aGlsZSAoZGVjb2RlckVyciA9PSBBQUNfREVDX09LKTsKKyAgICB9CisKKyAgICBpbnQzMl90IG91dHB1dERlbGF5ID0gbVN0cmVhbUluZm8tPm91dHB1dERlbGF5ICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworCisgICAgbUJ1ZmZlcnNJbmZvLnB1c2hfYmFjayhzdGQ6Om1vdmUoaW5JbmZvKSk7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICBpZiAoIWVvcyAmJiBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA8IG91dHB1dERlbGF5KSB7CisgICAgICAgIC8vIGRpc2NhcmQgb3V0cHV0RGVsYXkgYXQgdGhlIGJlZ2lubmluZworICAgICAgICBpbnQzMl90IHRvQ29tcGVuc2F0ZSA9IG91dHB1dERlbGF5IC0gbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQ7CisgICAgICAgIGludDMyX3QgZGlzY2FyZCA9IG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKKyAgICAgICAgaWYgKGRpc2NhcmQgPiB0b0NvbXBlbnNhdGUpIHsKKyAgICAgICAgICAgIGRpc2NhcmQgPSB0b0NvbXBlbnNhdGU7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBkaXNjYXJkZWQgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKG51bGxwdHIsIGRpc2NhcmQpOworICAgICAgICBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCArPSBkaXNjYXJkZWQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkcmFpblJpbmdCdWZmZXIod29yaywgcG9vbCwgZmFsc2UgLyogbm90IEVPUyAqLyk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNEZWM6OmRyYWluSW50ZXJuYWwoCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAoZHJhaW5Nb2RlID09IERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUyk7CisKKyAgICBkcmFpbkRlY29kZXIoKTsKKyAgICBkcmFpblJpbmdCdWZmZXIod29yaywgcG9vbCwgZW9zKTsKKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgYXV0byBmaWxsRW1wdHlXb3JrID0gW10oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgIH07CisgICAgICAgIHdoaWxlIChtQnVmZmVyc0luZm8uc2l6ZSgpID4gMXUpIHsKKyAgICAgICAgICAgIGZpbmlzaChtQnVmZmVyc0luZm8uZnJvbnQoKS5mcmFtZUluZGV4LCBmaWxsRW1wdHlXb3JrKTsKKyAgICAgICAgICAgIG1CdWZmZXJzSW5mby5wb3BfZnJvbnQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod29yayAmJiB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9PSAwdSkgeworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgfQorICAgICAgICBtQnVmZmVyc0luZm8uY2xlYXIoKTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBkcmFpbkRlY29kZXIoKTsKKyAgICBtQnVmZmVyc0luZm8uY2xlYXIoKTsKKworICAgIGludCBhdmFpbDsKKyAgICB3aGlsZSAoKGF2YWlsID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpKSA+IDApIHsKKyAgICAgICAgaWYgKGF2YWlsID4gbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICAgICAgYXZhaWwgPSBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworICAgICAgICB9CisgICAgICAgIGludDMyX3QgbnMgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKG51bGxwdHIsIGF2YWlsKTsKKyAgICAgICAgaWYgKG5zICE9IGF2YWlsKSB7CisgICAgICAgICAgICBBTE9HVygibm90IGEgY29tcGxldGUgZnJhbWUgb2Ygc2FtcGxlcyBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID0gbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFhY0RlYzo6ZHJhaW5EZWNvZGVyKCkgeworICAgIC8vIGZsdXNoIGRlY29kZXIgdW50aWwgb3V0cHV0RGVsYXkgaXMgY29tcGVuc2F0ZWQKKyAgICB3aGlsZSAobU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPiAwKSB7CisgICAgICAgIC8vIGEgYnVmZmVyIGJpZyBlbm91Z2ggZm9yIE1BWF9DSEFOTkVMX0NPVU5UIGNoYW5uZWxzIG9mIGRlY29kZWQgSEUtQUFDCisgICAgICAgIElOVF9QQ00gdG1wT3V0QnVmZmVyWzIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVF07CisKKyAgICAgICAgLy8gcnVuIERSQyBjaGVjaworICAgICAgICBtRHJjV3JhcC5zdWJtaXRTdHJlYW1EYXRhKG1TdHJlYW1JbmZvKTsKKyAgICAgICAgbURyY1dyYXAudXBkYXRlKCk7CisKKyAgICAgICAgQUFDX0RFQ09ERVJfRVJST1IgZGVjb2RlckVyciA9CisgICAgICAgICAgICBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKG1BQUNEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDREVDX0ZMVVNIKTsKKyAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgQUxPR1coImFhY0RlY29kZXJfRGVjb2RlRnJhbWUgZGVjb2RlckVyciA9IDB4JTQuNHgiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgdG1wT3V0QnVmZmVyU2FtcGxlcyA9IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisgICAgICAgIGlmICh0bXBPdXRCdWZmZXJTYW1wbGVzID4gbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQpIHsKKyAgICAgICAgICAgIHRtcE91dEJ1ZmZlclNhbXBsZXMgPSBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZDsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKHRtcE91dEJ1ZmZlciwgdG1wT3V0QnVmZmVyU2FtcGxlcyk7CisKKyAgICAgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgLT0gdG1wT3V0QnVmZmVyU2FtcGxlczsKKyAgICB9Cit9CisKK2NsYXNzIEMyU29mdEFhY0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRBYWNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0QWFjRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFhY0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEFhY0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFhY0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEFhY0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEFhY0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NWMyOWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BQUNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BQUNfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKKyNpbmNsdWRlICJhYWNkZWNvZGVyX2xpYi5oIgorI2luY2x1ZGUgIkRyY1ByZXNNb2RlV3JhcC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRBYWNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0QWFjRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEFhY0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga051bURlbGF5QmxvY2tzTWF4ICAgICAgPSA4LAorICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworCisgICAgSEFORExFX0FBQ0RFQ09ERVIgbUFBQ0RlY29kZXI7CisgICAgQ1N0cmVhbUluZm8gKm1TdHJlYW1JbmZvOworICAgIGJvb2wgbUlzRmlyc3Q7CisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworICAgIHNpemVfdCBtT3V0cHV0QnVmZmVyQ291bnQ7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgc3RydWN0IEluZm8geworICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4OworICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZTsKKyAgICAgICAgdWludDY0X3QgdGltZXN0YW1wOworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBkZWNvZGVkU2l6ZXM7CisgICAgfTsKKyAgICBzdGQ6Omxpc3Q8SW5mbz4gbUJ1ZmZlcnNJbmZvOworCisgICAgQ0RyY1ByZXNNb2RlV3JhcHBlciBtRHJjV3JhcDsKKworICAgIGVudW0geworICAgICAgICBOT05FLAorICAgICAgICBBV0FJVElOR19ESVNBQkxFRCwKKyAgICAgICAgQVdBSVRJTkdfRU5BQkxFRAorICAgIH0gbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZTsKKworICAgIHZvaWQgaW5pdFBvcnRzKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBib29sIGlzQ29uZmlndXJlZCgpIGNvbnN0OworICAgIHZvaWQgZHJhaW5EZWNvZGVyKCk7CisKKyAgICB2b2lkIGRyYWluUmluZ0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGJvb2wgZW9zKTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKworLy8gICAgICBkZWxheSBjb21wZW5zYXRpb24KKyAgICBib29sIG1FbmRPZklucHV0OworICAgIGJvb2wgbUVuZE9mT3V0cHV0OworICAgIGludDMyX3QgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQ7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICBzaG9ydCAqbU91dHB1dERlbGF5UmluZ0J1ZmZlcjsKKyAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvczsKKyAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zOworICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZDsKKyAgICBib29sIG91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXMoSU5UX1BDTSAqc2FtcGxlcywgaW50IG51bVNhbXBsZXMpOworICAgIGludDMyX3Qgb3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcyhJTlRfUENNICpzYW1wbGVzLCBpbnQgbnVtU2FtcGxlcyk7CisgICAgaW50MzJfdCBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCk7CisgICAgaW50MzJfdCBvdXRwdXREZWxheVJpbmdCdWZmZXJTcGFjZUxlZnQoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEFhY0RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BQUNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzN2U3NzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRW5jLmNwcApAQCAtMCwwICsxLDYxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QWFjRW5jIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QWFjRW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0QWFjRW5jOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworCisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAKKyAgICAgICAgICAgICAgICB9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDYpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCA5NjAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKE1heEJ1ZlNpemVDYWxjdWxhdG9yLCBtQ2hhbm5lbENvdW50KQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDLCBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEVfUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FTER9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1VOVVNFRAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsZVJhdGUtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Q2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudC0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRCaXRyYXRlKCkgY29uc3QgeyByZXR1cm4gbUJpdHJhdGUtPnZhbHVlOyB9CisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heEJ1ZlNpemVDYWxjdWxhdG9yKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+ICZjaGFubmVsQ291bnQpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIG1lLnNldCgpLnZhbHVlID0gMTAyNCAqIHNpemVvZihzaG9ydCkgKiBjaGFubmVsQ291bnQudi52YWx1ZTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbVByb2ZpbGVMZXZlbDsKK307CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hYWMuZW5jb2RlciI7CisKK0MyU29mdEFhY0VuYzo6QzJTb2Z0QWFjRW5jKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1BQUNFbmNvZGVyKG51bGxwdHIpLAorICAgICAgbVNCUk1vZGUoLTEpLAorICAgICAgbVNCUlJhdGlvKDApLAorICAgICAgbUFBQ1Byb2ZpbGUoQU9UX0FBQ19MQyksCisgICAgICBtTnVtQnl0ZXNQZXJJbnB1dEZyYW1lKDB1KSwKKyAgICAgIG1PdXRCdWZmZXJTaXplKDB1KSwKKyAgICAgIG1TZW50Q29kZWNTcGVjaWZpY0RhdGEoZmFsc2UpLAorICAgICAgbUlucHV0VGltZVNldChmYWxzZSksCisgICAgICBtSW5wdXRTaXplKDApLAorICAgICAgbUlucHV0VGltZVVzKC0xbGwpLAorICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSwKKyAgICAgIG1PdXRJbmRleCgwdSkgeworfQorCitDMlNvZnRBYWNFbmM6On5DMlNvZnRBYWNFbmMoKSB7CisgICAgb25SZXNldCgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNFbmM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RW5jb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKworc3RhdHVzX3QgQzJTb2Z0QWFjRW5jOjppbml0RW5jb2RlcigpIHsKKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY09wZW4oJm1BQUNFbmNvZGVyLCAwLCAwKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgQUFDIGVuY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIHJldHVybiBzZXRBdWRpb1BhcmFtcygpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNFbmM6Om9uU3RvcCgpIHsKKyAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhID0gZmFsc2U7CisgICAgbUlucHV0VGltZVNldCA9IGZhbHNlOworICAgIG1JbnB1dFNpemUgPSAwdTsKKyAgICBtSW5wdXRUaW1lVXMgPSAtMWxsOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBYWNFbmM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7CisgICAgYWFjRW5jQ2xvc2UoJm1BQUNFbmNvZGVyKTsKK30KKwordm9pZCBDMlNvZnRBYWNFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICAvLyBuby1vcAorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgbVNlbnRDb2RlY1NwZWNpZmljRGF0YSA9IGZhbHNlOworICAgIG1JbnB1dFRpbWVTZXQgPSBmYWxzZTsKKyAgICBtSW5wdXRTaXplID0gMHU7CisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0aWMgQ0hBTk5FTF9NT0RFIGdldENoYW5uZWxNb2RlKHVpbnQzMl90IG5DaGFubmVscykgeworICAgIENIQU5ORUxfTU9ERSBjaE1vZGUgPSBNT0RFX0lOVkFMSUQ7CisgICAgc3dpdGNoIChuQ2hhbm5lbHMpIHsKKyAgICAgICAgY2FzZSAxOiBjaE1vZGUgPSBNT0RFXzE7IGJyZWFrOworICAgICAgICBjYXNlIDI6IGNoTW9kZSA9IE1PREVfMjsgYnJlYWs7CisgICAgICAgIGNhc2UgMzogY2hNb2RlID0gTU9ERV8xXzI7IGJyZWFrOworICAgICAgICBjYXNlIDQ6IGNoTW9kZSA9IE1PREVfMV8yXzE7IGJyZWFrOworICAgICAgICBjYXNlIDU6IGNoTW9kZSA9IE1PREVfMV8yXzI7IGJyZWFrOworICAgICAgICBjYXNlIDY6IGNoTW9kZSA9IE1PREVfMV8yXzJfMTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGNoTW9kZSA9IE1PREVfSU5WQUxJRDsKKyAgICB9CisgICAgcmV0dXJuIGNoTW9kZTsKK30KKworLy9zdGF0aWMgQVVESU9fT0JKRUNUX1RZUEUgZ2V0QU9URnJvbVByb2ZpbGUoT01YX1UzMiBwcm9maWxlKSB7CisvLyAgICBpZiAocHJvZmlsZSA9PSBPTVhfQVVESU9fQUFDT2JqZWN0TEMpIHsKKy8vICAgICAgICByZXR1cm4gQU9UX0FBQ19MQzsKKy8vICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBPTVhfQVVESU9fQUFDT2JqZWN0SEUpIHsKKy8vICAgICAgICByZXR1cm4gQU9UX1NCUjsKKy8vICAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBPTVhfQVVESU9fQUFDT2JqZWN0SEVfUFMpIHsKKy8vICAgICAgICByZXR1cm4gQU9UX1BTOworLy8gICAgfSBlbHNlIGlmIChwcm9maWxlID09IE9NWF9BVURJT19BQUNPYmplY3RMRCkgeworLy8gICAgICAgIHJldHVybiBBT1RfRVJfQUFDX0xEOworLy8gICAgfSBlbHNlIGlmIChwcm9maWxlID09IE9NWF9BVURJT19BQUNPYmplY3RFTEQpIHsKKy8vICAgICAgICByZXR1cm4gQU9UX0VSX0FBQ19FTEQ7CisvLyAgICB9IGVsc2UgeworLy8gICAgICAgIEFMT0dXKCJVbnN1cHBvcnRlZCBBQUMgcHJvZmlsZSAtIGRlZmF1bHRpbmcgdG8gQUFDLUxDIik7CisvLyAgICAgICAgcmV0dXJuIEFPVF9BQUNfTEM7CisvLyAgICB9CisvL30KKworc3RhdHVzX3QgQzJTb2Z0QWFjRW5jOjpzZXRBdWRpb1BhcmFtcygpIHsKKyAgICAvLyBXZSBjYWxsIHRoaXMgd2hlbmV2ZXIgc2FtcGxlIHJhdGUsIG51bWJlciBvZiBjaGFubmVscywgYml0cmF0ZSBvciBTQlIgbW9kZSBjaGFuZ2UKKyAgICAvLyBpbiByZXBvbnNlIHRvIHNldFBhcmFtZXRlciBjYWxscy4KKworICAgIEFMT0dWKCJzZXRBdWRpb1BhcmFtczogJXUgSHosICV1IGNoYW5uZWxzLCAldSBicHMsICVpIHNiciBtb2RlLCAlaSBzYnIgcmF0aW8iLAorICAgICAgICAgbUludGYtPmdldFNhbXBsZVJhdGUoKSwgbUludGYtPmdldENoYW5uZWxDb3VudCgpLCBtSW50Zi0+Z2V0Qml0cmF0ZSgpLCBtU0JSTW9kZSwgbVNCUlJhdGlvKTsKKworICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX0FPVCwgbUFBQ1Byb2ZpbGUpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfU0FNUExFUkFURSwgbUludGYtPmdldFNhbXBsZVJhdGUoKSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfQklUUkFURSwgbUludGYtPmdldEJpdHJhdGUoKSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfQ0hBTk5FTE1PREUsCisgICAgICAgICAgICBnZXRDaGFubmVsTW9kZShtSW50Zi0+Z2V0Q2hhbm5lbENvdW50KCkpKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19UUkFOU01VWCwgVFRfTVA0X1JBVykpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAobVNCUk1vZGUgIT0gLTEgJiYgbUFBQ1Byb2ZpbGUgPT0gQU9UX0VSX0FBQ19FTEQpIHsKKyAgICAgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfU0JSX01PREUsIG1TQlJNb2RlKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTQlIgcmF0aW8gcGFyYW1ldGVyIGNvbmZpZ3VyYXRpb25zOgorICAgICAgIDA6IERlZmF1bHQgY29uZmlndXJhdGlvbiB3aGVyZWluIFNCUiByYXRpbyBpcyBjb25maWd1cmVkIGRlcGVuZGluZyBvbiBhdWRpbyBvYmplY3QgdHlwZSBieQorICAgICAgICAgIHRoZSBGREsuCisgICAgICAgMTogRG93bnNhbXBsZWQgU0JSIChkZWZhdWx0IGZvciBFTEQpCisgICAgICAgMjogRHVhbHJhdGUgU0JSIChkZWZhdWx0IGZvciBIRS1BQUMpCisgICAgICovCisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfU0JSX1JBVElPLCBtU0JSUmF0aW8pKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEMyU29mdEFhY0VuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisKKyAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKKyAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBtSW50Zi0+Z2V0Q2hhbm5lbENvdW50KCk7CisKKyAgICBpZiAoIW1TZW50Q29kZWNTcGVjaWZpY0RhdGEpIHsKKyAgICAgICAgLy8gVGhlIHZlcnkgZmlyc3QgdGhpbmcgd2Ugd2FudCB0byBvdXRwdXQgaXMgdGhlIGNvZGVjIHNwZWNpZmljCisgICAgICAgIC8vIGRhdGEuCisKKyAgICAgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNFbmNvZGUobUFBQ0VuY29kZXIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgZW5jb2RlciBmb3IgcHJvZmlsZSAvIHNhbXBsZS1yYXRlIC8gYml0LXJhdGUgLyBjaGFubmVscyIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IGJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZSgpOworICAgICAgICB1aW50MzJfdCBhY3R1YWxCaXRSYXRlID0gYWFjRW5jb2Rlcl9HZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX0JJVFJBVEUpOworICAgICAgICBpZiAoYml0cmF0ZSAhPSBhY3R1YWxCaXRSYXRlKSB7CisgICAgICAgICAgICBBTE9HVygiUmVxdWVzdGVkIGJpdHJhdGUgJXUgdW5zdXBwb3J0ZWQsIHVzaW5nICV1IiwgYml0cmF0ZSwgYWN0dWFsQml0UmF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBBQUNFTkNfSW5mb1N0cnVjdCBlbmNJbmZvOworICAgICAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY0luZm8obUFBQ0VuY29kZXIsICZlbmNJbmZvKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgQUFDIGVuY29kZXIgaW5mbyIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBjc2QgPQorICAgICAgICAgICAgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dDo6QWxsb2NVbmlxdWUoZW5jSW5mby5jb25mU2l6ZSwgMHUpOworICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBlbmNJbmZvLmNvbmZCdWYsIGVuY0luZm8uY29uZlNpemUpOworICAgICAgICBBTE9HVigicHV0IGNzZCIpOworI2lmIGRlZmluZWQoTE9HX05ERUJVRykgJiYgIUxPR19OREVCVUcKKyAgICAgICAgaGV4ZHVtcChjc2QtPm0udmFsdWUsIGNzZC0+ZmxleENvdW50KCkpOworI2VuZGlmCisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKHN0ZDo6bW92ZShjc2QpKTsKKworICAgICAgICBtT3V0QnVmZmVyU2l6ZSA9IGVuY0luZm8ubWF4T3V0QnVmQnl0ZXM7CisgICAgICAgIG1OdW1CeXRlc1BlcklucHV0RnJhbWUgPSBlbmNJbmZvLmZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpOworCisgICAgICAgIG1TZW50Q29kZWNTcGVjaWZpY0RhdGEgPSB0cnVlOworICAgIH0KKworICAgIHVpbnQ4X3QgdGVtcFsxXTsKKyAgICBDMlJlYWRWaWV3IHZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gdGVtcDsKKyAgICBzaXplX3QgY2FwYWNpdHkgPSAwdTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICB2aWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGRhdGEgPSB2aWV3LmRhdGEoKTsKKyAgICAgICAgY2FwYWNpdHkgPSB2aWV3LmNhcGFjaXR5KCk7CisgICAgfQorICAgIGlmICghbUlucHV0VGltZVNldCAmJiBjYXBhY2l0eSA+IDApIHsKKyAgICAgICAgbUlucHV0VGltZVVzID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXA7CisgICAgICAgIG1JbnB1dFRpbWVTZXQgPSB0cnVlOworICAgIH0KKworICAgIHNpemVfdCBudW1GcmFtZXMgPSAoY2FwYWNpdHkgKyBtSW5wdXRTaXplICsgKGVvcyA/IG1OdW1CeXRlc1BlcklucHV0RnJhbWUgLSAxIDogMCkpCisgICAgICAgICAgICAvIG1OdW1CeXRlc1BlcklucHV0RnJhbWU7CisgICAgQUxPR1YoImNhcGFjaXR5ID0gJXp1OyBtSW5wdXRTaXplID0gJXp1OyBudW1GcmFtZXMgPSAlenUgbU51bUJ5dGVzUGVySW5wdXRGcmFtZSA9ICV1IiwKKyAgICAgICAgICBjYXBhY2l0eSwgbUlucHV0U2l6ZSwgbnVtRnJhbWVzLCBtTnVtQnl0ZXNQZXJJbnB1dEZyYW1lKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXcml0ZVZpZXc+IHdWaWV3OworICAgIHVpbnQ4X3QgKm91dFB0ciA9IHRlbXA7CisgICAgc2l6ZV90IG91dEF2YWlsYWJsZSA9IDB1OworICAgIHVpbnQ2NF90IGlucHV0SW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKworICAgIEFBQ0VOQ19JbkFyZ3MgaW5hcmdzOworICAgIEFBQ0VOQ19PdXRBcmdzIG91dGFyZ3M7CisgICAgbWVtc2V0KCZpbmFyZ3MsIDAsIHNpemVvZihpbmFyZ3MpKTsKKyAgICBtZW1zZXQoJm91dGFyZ3MsIDAsIHNpemVvZihvdXRhcmdzKSk7CisgICAgaW5hcmdzLm51bUluU2FtcGxlcyA9IGNhcGFjaXR5IC8gc2l6ZW9mKGludDE2X3QpOworCisgICAgdm9pZCogaW5CdWZmZXJbXSAgICAgICAgPSB7ICh1bnNpZ25lZCBjaGFyICopZGF0YSB9OworICAgIElOVCAgIGluQnVmZmVySWRzW10gICAgID0geyBJTl9BVURJT19EQVRBIH07CisgICAgSU5UICAgaW5CdWZmZXJTaXplW10gICAgPSB7IChJTlQpY2FwYWNpdHkgfTsKKyAgICBJTlQgICBpbkJ1ZmZlckVsU2l6ZVtdICA9IHsgc2l6ZW9mKGludDE2X3QpIH07CisKKyAgICBBQUNFTkNfQnVmRGVzYyBpbkJ1ZkRlc2M7CisgICAgaW5CdWZEZXNjLm51bUJ1ZnMgICAgICAgICAgID0gc2l6ZW9mKGluQnVmZmVyKSAvIHNpemVvZih2b2lkKik7CisgICAgaW5CdWZEZXNjLmJ1ZnMgICAgICAgICAgICAgID0gKHZvaWQqKikmaW5CdWZmZXI7CisgICAgaW5CdWZEZXNjLmJ1ZmZlcklkZW50aWZpZXJzID0gaW5CdWZmZXJJZHM7CisgICAgaW5CdWZEZXNjLmJ1ZlNpemVzICAgICAgICAgID0gaW5CdWZmZXJTaXplOworICAgIGluQnVmRGVzYy5idWZFbFNpemVzICAgICAgICA9IGluQnVmZmVyRWxTaXplOworCisgICAgdm9pZCogb3V0QnVmZmVyW10gICAgICAgPSB7IG91dFB0ciB9OworICAgIElOVCAgIG91dEJ1ZmZlcklkc1tdICAgID0geyBPVVRfQklUU1RSRUFNX0RBVEEgfTsKKyAgICBJTlQgICBvdXRCdWZmZXJTaXplW10gICA9IHsgMCB9OworICAgIElOVCAgIG91dEJ1ZmZlckVsU2l6ZVtdID0geyBzaXplb2YoVUNIQVIpIH07CisKKyAgICBBQUNFTkNfQnVmRGVzYyBvdXRCdWZEZXNjOworICAgIG91dEJ1ZkRlc2MubnVtQnVmcyAgICAgICAgICAgPSBzaXplb2Yob3V0QnVmZmVyKSAvIHNpemVvZih2b2lkKik7CisgICAgb3V0QnVmRGVzYy5idWZzICAgICAgICAgICAgICA9ICh2b2lkKiopJm91dEJ1ZmZlcjsKKyAgICBvdXRCdWZEZXNjLmJ1ZmZlcklkZW50aWZpZXJzID0gb3V0QnVmZmVySWRzOworICAgIG91dEJ1ZkRlc2MuYnVmU2l6ZXMgICAgICAgICAgPSBvdXRCdWZmZXJTaXplOworICAgIG91dEJ1ZkRlc2MuYnVmRWxTaXplcyAgICAgICAgPSBvdXRCdWZmZXJFbFNpemU7CisKKyAgICBBQUNFTkNfRVJST1IgZW5jb2RlckVyciA9IEFBQ0VOQ19PSzsKKworICAgIGNsYXNzIEZpbGxXb3JrIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEZpbGxXb3JrKHVpbnQzMl90IGZsYWdzLCBDMldvcmtPcmRpbmFsU3RydWN0IG9yZGluYWwsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikKKyAgICAgICAgICAgIDogbUZsYWdzKGZsYWdzKSwgbU9yZGluYWwob3JkaW5hbCksIG1CdWZmZXIoYnVmZmVyKSB7CisgICAgICAgIH0KKyAgICAgICAgfkZpbGxXb3JrKCkgPSBkZWZhdWx0OworCisgICAgICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KW1GbGFnczsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IG1PcmRpbmFsOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgICAgICAgICAgaWYgKG1CdWZmZXIpIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2sobUJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigidGltZXN0YW1wID0gJWxsZCwgaW5kZXggPSAlbGxkLCB3LyVzIGJ1ZmZlciIsCisgICAgICAgICAgICAgICAgICBtT3JkaW5hbC50aW1lc3RhbXAucGVla2xsKCksCisgICAgICAgICAgICAgICAgICBtT3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpLAorICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA/ICIiIDogIm8iKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgdWludDMyX3QgbUZsYWdzOworICAgICAgICBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0IG1PcmRpbmFsOworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IG1CdWZmZXI7CisgICAgfTsKKworICAgIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3V0T3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisKKyAgICB3aGlsZSAoZW5jb2RlckVyciA9PSBBQUNFTkNfT0sgJiYgaW5hcmdzLm51bUluU2FtcGxlcyA+IDApIHsKKyAgICAgICAgaWYgKG51bUZyYW1lcyAmJiAhYmxvY2spIHsKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nLCBwcm9wZXIgdXNhZ2UsIGV0Yy4KKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sobU91dEJ1ZmZlclNpemUsIHVzYWdlLCAmYmxvY2spOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZhaWxlZCA6IGVyciA9ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3Vmlldy5yZXNldChuZXcgQzJXcml0ZVZpZXcoYmxvY2stPm1hcCgpLmdldCgpKSk7CisgICAgICAgICAgICBvdXRQdHIgPSB3Vmlldy0+ZGF0YSgpOworICAgICAgICAgICAgb3V0QXZhaWxhYmxlID0gd1ZpZXctPnNpemUoKTsKKyAgICAgICAgICAgIC0tbnVtRnJhbWVzOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KCZvdXRhcmdzLCAwLCBzaXplb2Yob3V0YXJncykpOworCisgICAgICAgIG91dEJ1ZmZlclswXSA9IG91dFB0cjsKKyAgICAgICAgb3V0QnVmZmVyU2l6ZVswXSA9IG91dEF2YWlsYWJsZTsKKworICAgICAgICBlbmNvZGVyRXJyID0gYWFjRW5jRW5jb2RlKG1BQUNFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJ1ZkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJ1ZkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0YXJncyk7CisKKyAgICAgICAgaWYgKGVuY29kZXJFcnIgPT0gQUFDRU5DX09LKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgb3V0T3JkaW5hbC5mcmFtZUluZGV4ID0gbU91dEluZGV4Kys7CisgICAgICAgICAgICAgICAgb3V0T3JkaW5hbC50aW1lc3RhbXAgPSBtSW5wdXRUaW1lVXM7CisgICAgICAgICAgICAgICAgY2xvbmVBbmRTZW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICBGaWxsV29yayhDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFLCBvdXRPcmRpbmFsLCBidWZmZXIpKTsKKyAgICAgICAgICAgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG91dGFyZ3MubnVtT3V0Qnl0ZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgbUlucHV0U2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgaW50IGNvbnN1bWVkID0gKGNhcGFjaXR5IC8gc2l6ZW9mKGludDE2X3QpKSAtIGluYXJncy5udW1JblNhbXBsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0YXJncy5udW1JblNhbXBsZXM7CisgICAgICAgICAgICAgICAgbUlucHV0VGltZVVzID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKGNvbnN1bWVkICogMTAwMDAwMGxsIC8gY2hhbm5lbENvdW50IC8gc2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgYnVmZmVyID0gY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCAwLCBvdXRhcmdzLm51bU91dEJ5dGVzKTsKKyNpZiBkZWZpbmVkKExPR19OREVCVUcpICYmICFMT0dfTkRFQlVHCisgICAgICAgICAgICAgICAgaGV4ZHVtcChvdXRQdHIsIHN0ZDo6bWluKG91dGFyZ3MubnVtT3V0Qnl0ZXMsIDI1NikpOworI2VuZGlmCisgICAgICAgICAgICAgICAgb3V0UHRyID0gdGVtcDsKKyAgICAgICAgICAgICAgICBvdXRBdmFpbGFibGUgPSAwOworICAgICAgICAgICAgICAgIGJsb2NrLnJlc2V0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1JbnB1dFNpemUgKz0gb3V0YXJncy5udW1JblNhbXBsZXMgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvdXRhcmdzLm51bUluU2FtcGxlcyA+IDApIHsKKyAgICAgICAgICAgICAgICBpbkJ1ZmZlclswXSA9IChpbnQxNl90ICopaW5CdWZmZXJbMF0gKyBvdXRhcmdzLm51bUluU2FtcGxlczsKKyAgICAgICAgICAgICAgICBpbkJ1ZmZlclNpemVbMF0gLT0gb3V0YXJncy5udW1JblNhbXBsZXMgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICAgICAgaW5hcmdzLm51bUluU2FtcGxlcyAtPSBvdXRhcmdzLm51bUluU2FtcGxlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiZW5jb2RlckVyciA9ICVkIG1JbnB1dFNpemUgPSAlenUgaW5hcmdzLm51bUluU2FtcGxlcyA9ICVkLCBtSW5wdXRUaW1lVXMgPSAlbGxkIiwKKyAgICAgICAgICAgICAgZW5jb2RlckVyciwgbUlucHV0U2l6ZSwgaW5hcmdzLm51bUluU2FtcGxlcywgbUlucHV0VGltZVVzLnBlZWtsbCgpKTsKKyAgICB9CisKKyAgICBpZiAoZW9zICYmIGluQnVmZmVyU2l6ZVswXSA+IDApIHsKKyAgICAgICAgaWYgKG51bUZyYW1lcyAmJiAhYmxvY2spIHsKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nLCBwcm9wZXIgdXNhZ2UsIGV0Yy4KKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sobU91dEJ1ZmZlclNpemUsIHVzYWdlLCAmYmxvY2spOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZhaWxlZCA6IGVyciA9ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3Vmlldy5yZXNldChuZXcgQzJXcml0ZVZpZXcoYmxvY2stPm1hcCgpLmdldCgpKSk7CisgICAgICAgICAgICBvdXRQdHIgPSB3Vmlldy0+ZGF0YSgpOworICAgICAgICAgICAgb3V0QXZhaWxhYmxlID0gd1ZpZXctPnNpemUoKTsKKyAgICAgICAgICAgIC0tbnVtRnJhbWVzOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KCZvdXRhcmdzLCAwLCBzaXplb2Yob3V0YXJncykpOworCisgICAgICAgIG91dEJ1ZmZlclswXSA9IG91dFB0cjsKKyAgICAgICAgb3V0QnVmZmVyU2l6ZVswXSA9IG91dEF2YWlsYWJsZTsKKworICAgICAgICAvLyBGbHVzaAorICAgICAgICBpbmFyZ3MubnVtSW5TYW1wbGVzID0gLTE7CisKKyAgICAgICAgKHZvaWQpYWFjRW5jRW5jb2RlKG1BQUNFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQnVmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRCdWZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRhcmdzKTsKKyAgICB9CisKKyAgICBvdXRPcmRpbmFsLmZyYW1lSW5kZXggPSBtT3V0SW5kZXgrKzsKKyAgICBvdXRPcmRpbmFsLnRpbWVzdGFtcCA9IG1JbnB1dFRpbWVVczsKKyAgICBGaWxsV29yaygoQzJGcmFtZURhdGE6OmZsYWdzX3QpKGVvcyA/IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0gOiAwKSwKKyAgICAgICAgICAgICBvdXRPcmRpbmFsLCBidWZmZXIpKHdvcmspOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNFbmM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICBzd2l0Y2ggKGRyYWluTW9kZSkgeworICAgICAgICBjYXNlIERSQUlOX0NPTVBPTkVOVF9OT19FT1M6CisgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGNhc2UgTk9fRFJBSU46CisgICAgICAgICAgICAvLyBuby1vcAorICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICBjYXNlIERSQUlOX0NIQUlOOgorICAgICAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgICAgIGNhc2UgRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgICh2b2lkKXBvb2w7CisgICAgbVNlbnRDb2RlY1NwZWNpZmljRGF0YSA9IGZhbHNlOworICAgIG1JbnB1dFRpbWVTZXQgPSBmYWxzZTsKKyAgICBtSW5wdXRTaXplID0gMHU7CisKKyAgICAvLyBUT0RPOiB3ZSBkb24ndCBoYXZlIGFueSBwZW5kaW5nIHdvcmsgYXQgdGhpcyB0aW1lIHRvIGRyYWluLgorICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0QWFjRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEFhY0VuY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRBYWNFbmMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QWFjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QWFjRW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QWFjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QWFjRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QWFjRW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc5MzY1YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNFbmMuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQUFDX0VOQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfQUFDX0VOQ19IXworCisjaW5jbHVkZSA8YXRvbWljPgorCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgImFhY2VuY19saWIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMlNvZnRBYWNFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworcHVibGljOgorICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0QWFjRW5jKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEFhY0VuYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworCisgICAgSEFORExFX0FBQ0VOQ09ERVIgbUFBQ0VuY29kZXI7CisKKyAgICBpbnQzMl90IG1TQlJNb2RlOworICAgIGludDMyX3QgbVNCUlJhdGlvOworICAgIEFVRElPX09CSkVDVF9UWVBFIG1BQUNQcm9maWxlOworICAgIFVJTlQgbU51bUJ5dGVzUGVySW5wdXRGcmFtZTsKKyAgICBVSU5UIG1PdXRCdWZmZXJTaXplOworCisgICAgYm9vbCBtU2VudENvZGVjU3BlY2lmaWNEYXRhOworICAgIGJvb2wgbUlucHV0VGltZVNldDsKKyAgICBzaXplX3QgbUlucHV0U2l6ZTsKKyAgICBjMl9jbnRyNjRfdCBtSW5wdXRUaW1lVXM7CisKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtT3V0SW5kZXg7CisKKyAgICBzdGF0dXNfdCBpbml0RW5jb2RlcigpOworCisgICAgc3RhdHVzX3Qgc2V0QXVkaW9QYXJhbXMoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEFhY0VuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BQUNfRU5DX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvRHJjUHJlc01vZGVXcmFwLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOWFlYmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvRHJjUHJlc01vZGVXcmFwLmNwcApAQCAtMCwwICsxLDM3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiRHJjUHJlc01vZGVXcmFwLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBYWNEcmNXcmFwcGVyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisvLyNkZWZpbmUgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisKKyNkZWZpbmUgR1BNX0VOQ09ERVJfVEFSR0VUX0xFVkVMIDY0CisjZGVmaW5lIE1BWF9UQVJHRVRfTEVWRUwgNDAKKworQ0RyY1ByZXNNb2RlV3JhcHBlcjo6Q0RyY1ByZXNNb2RlV3JhcHBlcigpCit7CisgICAgbURhdGFVcGRhdGUgPSB0cnVlOworCisgICAgLyogRGF0YSBmcm9tIHN0cmVhbUluZm8uICovCisgICAgLyogSW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWVzIGFzIGluIHRoZSBhYWMgZGVjb2RlciAqLworICAgIG1TdHJlYW1QUkwgPSAtMTsKKyAgICBtU3RyZWFtRFJDUHJlc01vZGUgPSAtMTsKKyAgICBtU3RyZWFtTnJBQUNDaGFuID0gMDsKKyAgICBtU3RyZWFtTnJPdXRDaGFuID0gMDsKKworICAgIC8qIERlc2lyZWQgdmFsdWVzIChzZXQgYnkgdXNlcikuICovCisgICAgLyogSW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWVzIGFzIGluIHRoZSBhYWMgZGVjb2RlciAqLworICAgIG1EZXNUYXJnZXQgPSAtMTsKKyAgICBtRGVzQXR0RmFjdG9yID0gMDsKKyAgICBtRGVzQm9vc3RGYWN0b3IgPSAwOworICAgIG1EZXNIZWF2eSA9IDA7CisKKyAgICBtRW5jb2RlclRhcmdldCA9IC0xOworCisgICAgLyogVmFsdWVzIGZyb20gbGFzdCB0aW1lLiAqLworICAgIC8qIEluaXRpYWxpemVkIHRvIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGUgZGVzaXJlZCB2YWx1ZXMgKi8KKyAgICBtTGFzdFRhcmdldCA9IC0xOworICAgIG1MYXN0QXR0RmFjdG9yID0gMDsKKyAgICBtTGFzdEJvb3N0RmFjdG9yID0gMDsKKyAgICBtTGFzdEhlYXZ5ID0gMDsKK30KKworQ0RyY1ByZXNNb2RlV3JhcHBlcjo6fkNEcmNQcmVzTW9kZVdyYXBwZXIoKQoreworfQorCit2b2lkCitDRHJjUHJlc01vZGVXcmFwcGVyOjpzZXREZWNvZGVySGFuZGxlKGNvbnN0IEhBTkRMRV9BQUNERUNPREVSIGhhbmRsZSkKK3sKKyAgICBtSGFuZGxlRGVjb2RlciA9IGhhbmRsZTsKK30KKwordm9pZAorQ0RyY1ByZXNNb2RlV3JhcHBlcjo6c3VibWl0U3RyZWFtRGF0YShDU3RyZWFtSW5mbyogcFN0cmVhbUluZm8pCit7CisgICAgYXNzZXJ0KHBTdHJlYW1JbmZvKTsKKworICAgIGlmIChtU3RyZWFtUFJMICE9IHBTdHJlYW1JbmZvLT5kcmNQcm9nUmVmTGV2KSB7CisgICAgICAgIG1TdHJlYW1QUkwgPSBwU3RyZWFtSW5mby0+ZHJjUHJvZ1JlZkxldjsKKyAgICAgICAgbURhdGFVcGRhdGUgPSB0cnVlOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGRyY1Byb2dSZWZMZXYgaXMgJWRcbiIsIG1TdHJlYW1QUkwpOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKG1TdHJlYW1EUkNQcmVzTW9kZSAhPSBwU3RyZWFtSW5mby0+ZHJjUHJlc01vZGUpIHsKKyAgICAgICAgbVN0cmVhbURSQ1ByZXNNb2RlID0gcFN0cmVhbUluZm8tPmRyY1ByZXNNb2RlOworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZHJjUHJlc01vZGUgaXMgJWRcbiIsIG1TdHJlYW1EUkNQcmVzTW9kZSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobVN0cmVhbU5yQUFDQ2hhbiAhPSBwU3RyZWFtSW5mby0+YWFjTnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgbVN0cmVhbU5yQUFDQ2hhbiA9IHBTdHJlYW1JbmZvLT5hYWNOdW1DaGFubmVsczsKKyAgICAgICAgbURhdGFVcGRhdGUgPSB0cnVlOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGFhY051bUNoYW5uZWxzIGlzICVkXG4iLCBtU3RyZWFtTnJBQUNDaGFuKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChtU3RyZWFtTnJPdXRDaGFuICE9IHBTdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICBtU3RyZWFtTnJPdXRDaGFuID0gcFN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogbnVtQ2hhbm5lbHMgaXMgJWRcbiIsIG1TdHJlYW1Ock91dENoYW4pOworI2VuZGlmCisgICAgfQorCisKKworICAgIGlmIChtU3RyZWFtTnJPdXRDaGFuPG1TdHJlYW1OckFBQ0NoYW4pIHsKKyAgICAgICAgbUlzRG93bm1peCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUlzRG93bm1peCA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChtSXNEb3dubWl4ICYmIChtU3RyZWFtTnJPdXRDaGFuID09IDEpKSB7CisgICAgICAgIG1Jc01vbm9Eb3dubWl4ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSXNNb25vRG93bm1peCA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChtSXNEb3dubWl4ICYmIG1TdHJlYW1Ock91dENoYW4gPT0gMil7CisgICAgICAgIG1Jc1N0ZXJlb0Rvd25taXggPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jc1N0ZXJlb0Rvd25taXggPSBmYWxzZTsKKyAgICB9CisKK30KKwordm9pZAorQ0RyY1ByZXNNb2RlV3JhcHBlcjo6c2V0UGFyYW0oY29uc3QgRFJDX1BSRVNfTU9ERV9XUkFQX1BBUkFNIHBhcmFtLCBjb25zdCBpbnQgdmFsdWUpCit7CisgICAgc3dpdGNoIChwYXJhbSkgeworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VUOgorICAgICAgICBtRGVzVGFyZ2V0ID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUjoKKyAgICAgICAgbURlc0F0dEZhY3RvciA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0JPT1NUX0ZBQ1RPUjoKKyAgICAgICAgbURlc0Jvb3N0RmFjdG9yID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlk6CisgICAgICAgIG1EZXNIZWF2eSA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVDoKKyAgICAgICAgbUVuY29kZXJUYXJnZXQgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKK30KKwordm9pZAorQ0RyY1ByZXNNb2RlV3JhcHBlcjo6dXBkYXRlKCkKK3sKKyAgICAvLyBHZXQgRGF0YSBmcm9tIERlY29kZXIKKyAgICBpbnQgcHJvZ1JlZkxldmVsID0gbVN0cmVhbVBSTDsKKyAgICBpbnQgZHJjUHJlc01vZGUgPSBtU3RyZWFtRFJDUHJlc01vZGU7CisKKyAgICAvLyBieSBkZWZhdWx0LCBkbyBhcyBkZXNpcmVkCisgICAgaW50IG5ld1RhcmdldCAgICAgICAgID0gbURlc1RhcmdldDsKKyAgICBpbnQgbmV3QXR0RmFjdG9yICAgICAgPSBtRGVzQXR0RmFjdG9yOworICAgIGludCBuZXdCb29zdEZhY3RvciAgICA9IG1EZXNCb29zdEZhY3RvcjsKKyAgICBpbnQgbmV3SGVhdnkgICAgICAgICAgPSBtRGVzSGVhdnk7CisKKyAgICBpZiAobURhdGFVcGRhdGUpIHsKKyAgICAgICAgLy8gc2FuaXR5IGNoZWNrCisgICAgICAgIGlmIChtRGVzVGFyZ2V0IDwgTUFYX1RBUkdFVF9MRVZFTCl7CisgICAgICAgICAgICBtRGVzVGFyZ2V0ID0gTUFYX1RBUkdFVF9MRVZFTDsgIC8vIGxpbWl0IHRhcmdldCBsZXZlbCB0byAtMTAgZEIgb3IgYmVsb3cKKyAgICAgICAgICAgIG5ld1RhcmdldCA9IE1BWF9UQVJHRVRfTEVWRUw7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUVuY29kZXJUYXJnZXQgIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0PDEyNCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMzEgZEIKKyAgICAgICAgICAgICAgICBpZiAoKG1Jc1N0ZXJlb0Rvd25taXggPT0gZmFsc2UpICYmIChtSXNNb25vRG93bm1peCA9PSBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gc3RlcmVvIG9yIG1vbm8gZG93bm1peGluZywgY2FsY3VsYXRlZCBzY2FsaW5nIG9mIGxpZ2h0IERSQworICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYXMgbGl0dGxlIGNvbXByZXNzaW9uIGFzIHBvc3NpYmxlICovCisgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDA7CisgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQ8cHJvZ1JlZkxldmVsKSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1FbmNvZGVyVGFyZ2V0IDwgbURlc1RhcmdldCkgeyAvLyBpZiBtRW5jb2RlclRhcmdldCA+IHRhcmdldCBsZXZlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1FbmNvZGVyVGFyZ2V0ID4gdGFyZ2V0IGxldmVsID4gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbGNGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY2FsY0ZhY3Rvcl9ub3JtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDAuMGYgPCBjYWxjRmFjdG9yX25vcm0gPCAxLjBmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY0ZhY3Rvcl9ub3JtID0gKGZsb2F0KShtRGVzVGFyZ2V0IC0gcHJvZ1JlZkxldmVsKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpKG1FbmNvZGVyVGFyZ2V0IC0gcHJvZ1JlZkxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjRmFjdG9yID0gKGludCkoY2FsY0ZhY3Rvcl9ub3JtKjEyNy4wZik7IC8vIDAgPD0gY2FsY0ZhY3RvciA8IDEyNworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGNGYWN0b3IgaXMgdGhlIGxvd2VyIGxpbWl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gKGNhbGNGYWN0b3I+bmV3QXR0RmFjdG9yKSA/IGNhbGNGYWN0b3IgOiBuZXdBdHRGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3IEF0dEZhY3RvciB3aWxsIGJlIGFsd2F5cyA9IGNhbGNGYWN0b3IsIGFzIGl0IGlzIHNldCB0byAwIGJlZm9yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCb29zdEZhY3RvciA9IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGFyZ2V0IGxldmVsID4gbUVuY29kZXJUYXJnZXQgPiBQUkwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdURExpbWl0ZXJFbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIGRvbWFpbiBsaW1pdGVyIG11c3QgYWx3YXlzIGJlIGFjdGl2ZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWV3b3JrIGFjdGl2YXRlcyBpdCBieSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyByZXN0cmljdGlvbnMgcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld0F0dEZhY3RvciA9IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGRvd25taXhpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTIzIGRCIG9yIG1vbm8gZG93bm1peAorICAgICAgICAgICAgICAgICAgICBpZiAoIChtRGVzVGFyZ2V0PDkyKSB8fCBtSXNNb25vRG93bm1peCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHBlcmZvcm0gYSBkb3dubWl4LCBzbywgd2UgbmVlZCBhdCBsZWFzdCBmdWxsIGxpZ2h0IERSQworICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrIC0zMSBkQjogbGlnaHQgRFJDIG9ubHkgbmVlZGVkIGlmIHdlIHBlcmZvcm0gZG93bm1peGluZworICAgICAgICAgICAgICAgIGlmIChtSXNEb3dubWl4KSB7ICAgLy8gd2UgZG8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvLyBoYW5kbGUgb3RoZXIgdXNlZCBlbmNvZGVyIHRhcmdldCBsZXZlbHMKKworICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrOiBEUkMgcHJlc2VudGF0aW9uIG1vZGUgaXMgb25seSBzcGVjaWZpZWQgZm9yIG1heC4gNS4xIGNoYW5uZWxzCisgICAgICAgICAgICBpZiAobVN0cmVhbU5yQUFDQ2hhbiA+IDYpIHsKKyAgICAgICAgICAgICAgICBkcmNQcmVzTW9kZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoZHJjUHJlc01vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8vIHByZXNlbnRhdGlvbiBtb2RlIG5vdCBpbmRpY2F0ZWQKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0PDEyNCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gc3RlcmVvIG9yIG1vbm8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICBpZiAoKG1Jc1N0ZXJlb0Rvd25taXggPT0gZmFsc2UpICYmIChtSXNNb25vRG93bm1peCA9PSBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0PHByb2dSZWZMZXZlbCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdURExpbWl0ZXJFbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIGRvbWFpbiBsaW1pdGVyIG11c3QgYWx3YXlzIGJlIGFjdGl2ZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7IC8vIGF0IGxlYXN0LCB1c2UgbGlnaHQgY29tcHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyByZXN0cmljdGlvbnMgcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdBdHRGYWN0b3IgPSBuZXdBdHRGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGRvd25taXhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld1RETGltaXRlckVuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGltZSBkb21haW4gbGltaXRlciBtdXN0IGFsd2F5cyBiZSBhY3RpdmUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTIzIGRCIG9yIG1vbm8gZG93bm1peAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAobURlc1RhcmdldCA8IDkyKSB8fCBtSXNNb25vRG93bm1peCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgcGVyZm9ybSBhIGRvd25taXgsIHNvLCB3ZSBuZWVkIGF0IGxlYXN0IGZ1bGwgbGlnaHQgRFJDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICBpZiAobUlzRG93bm1peCkgeyAgIC8vIHdlIGRvIGRvd25taXhpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdURExpbWl0ZXJFbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgZG9tYWluIGxpbWl0ZXIgbXVzdCBhbHdheXMgYmUgYWN0aXZlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgZnJhbWV3b3JrIGFjdGl2YXRlcyBpdCBieSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gUHJlc2VudGF0aW9uIG1vZGUgMSBhbmQgMiBhY2NvcmRpbmcgdG8gRVRTSSBUUyAxMDEgMTU0OgorICAgICAgICAgICAgLy8gRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgKERWQik7IFNwZWNpZmljYXRpb24gZm9yIHRoZSB1c2Ugb2YgVmlkZW8gYW5kIEF1ZGlvIENvZGluZworICAgICAgICAgICAgLy8gaW4gQnJvYWRjYXN0aW5nIEFwcGxpY2F0aW9ucyBiYXNlZCBvbiB0aGUgTVBFRy0yIFRyYW5zcG9ydCBTdHJlYW0sCisgICAgICAgICAgICAvLyBzZWN0aW9uIEMuNS40LiwgIkRlY29kaW5nIiwgYW5kIFRhYmxlIEMuMzMKKyAgICAgICAgICAgIC8vIElTTyBEUkMgICAgICAgICAgICAtPiBuZXdIZWF2eSA9IDAgIChVc2UgbGlnaHQgY29tcHJlc3Npb24sIE1QRUctc3R5bGUpCisgICAgICAgICAgICAvLyBDb21wcmVzc2lvbl92YWx1ZSAgLT4gbmV3SGVhdnkgPSAxICAoVXNlIGhlYXZ5IGNvbXByZXNzaW9uLCBEVkItc3R5bGUpCisgICAgICAgICAgICAvLyBzY2FsaW5nIHJlc3RyaWN0ZWQgLT4gbmV3QXR0RmFjdG9yID0gMTI3CisKKyAgICAgICAgICAgIGNhc2UgMTogLy8gcHJlc2VudGF0aW9uIG1vZGUgMSwgTGlnaHQ6LTMxL0hlYXZ5Oi0yMworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0IDwgMTI0KSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayB1cCB0byAtMjMgZEIKKyAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNEb3dubWl4KSB7ICAgLy8gd2UgZG8gZG93bm1peGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDI6IC8vIHByZXNlbnRhdGlvbiBtb2RlIDIsIExpZ2h0Oi0yMy9IZWF2eTotMjMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobURlc1RhcmdldCA8IDEyNCkgeyAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgdXAgdG8gLTIzIGRCCisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNNb25vRG93bm1peCkgeyAvLyBpZiBtb25vIGRvd25taXgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0Rvd25taXgpIHsgICAvLyB3ZSBkbyBkb3dubWl4aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0gLy8gc3dpdGNoKCkKKyAgICAgICAgfSAvLyBpZiAobUVuY29kZXJUYXJnZXQgID09IEdQTV9FTkNPREVSX1RBUkdFVF9MRVZFTCkKKworICAgICAgICAvLyBzYW5pdHkgYWdhaW4KKyAgICAgICAgaWYgKG5ld0hlYXZ5ID09IDEpIHsKKyAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yPTEyNzsgLy8gbm90IHJlYWxseSBuZWVkZWQgYXMgdGhlIHNhbWUgd291bGQgYmUgZG9uZSBieSB0aGUgZGVjb2RlciBhbnl3YXkKKyAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVwZGF0ZSB0aGUgZGVjb2RlcgorICAgICAgICBpZiAobmV3VGFyZ2V0ICE9IG1MYXN0VGFyZ2V0KSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX1JFRkVSRU5DRV9MRVZFTCwgbmV3VGFyZ2V0KTsKKyAgICAgICAgICAgIG1MYXN0VGFyZ2V0ID0gbmV3VGFyZ2V0OworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld1RhcmdldCAhPSBtRGVzVGFyZ2V0KQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZm9yY2VkIHRhcmdldCBsZXZlbCB0byAlZCAoZnJvbSAlZClcbiIsIG5ld1RhcmdldCwgbURlc1RhcmdldCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBzZXQgdGFyZ2V0IGxldmVsIHRvICVkXG4iLCBuZXdUYXJnZXQpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3QXR0RmFjdG9yICE9IG1MYXN0QXR0RmFjdG9yKSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiwgbmV3QXR0RmFjdG9yKTsKKyAgICAgICAgICAgIG1MYXN0QXR0RmFjdG9yID0gbmV3QXR0RmFjdG9yOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld0F0dEZhY3RvciAhPSBtRGVzQXR0RmFjdG9yKQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZm9yY2VkIGF0dGVudWF0aW9uIGZhY3RvciB0byAlZCAoZnJvbSAlZClcbiIsIG5ld0F0dEZhY3RvciwgbURlc0F0dEZhY3Rvcik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBzZXQgYXR0ZW51YXRpb24gZmFjdG9yIHRvICVkXG4iLCBuZXdBdHRGYWN0b3IpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3Qm9vc3RGYWN0b3IgIT0gbUxhc3RCb29zdEZhY3RvcikgeworICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtSGFuZGxlRGVjb2RlciwgQUFDX0RSQ19CT09TVF9GQUNUT1IsIG5ld0Jvb3N0RmFjdG9yKTsKKyAgICAgICAgICAgIG1MYXN0Qm9vc3RGYWN0b3IgPSBuZXdCb29zdEZhY3RvcjsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgICAgIGlmIChuZXdCb29zdEZhY3RvciAhPSBtRGVzQm9vc3RGYWN0b3IpCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBmb3JjZWQgYm9vc3QgZmFjdG9yIHRvICVkIChmcm9tICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yLCBtRGVzQm9vc3RGYWN0b3IpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogc2V0IGJvb3N0IGZhY3RvciB0byAlZFxuIiwgbmV3Qm9vc3RGYWN0b3IpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3SGVhdnkgIT0gbUxhc3RIZWF2eSkgeworICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtSGFuZGxlRGVjb2RlciwgQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTiwgbmV3SGVhdnkpOworICAgICAgICAgICAgbUxhc3RIZWF2eSA9IG5ld0hlYXZ5OworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld0hlYXZ5ICE9IG1EZXNIZWF2eSkKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGZvcmNlZCBoZWF2eSBjb21wcmVzc2lvbiB0byAlZCAoZnJvbSAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSwgbURlc0hlYXZ5KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IHNldCBoZWF2eSBjb21wcmVzc2lvbiB0byAlZFxuIiwgbmV3SGVhdnkpOworI2VuZGlmCisgICAgICAgIH0KKworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICBBTE9HVigiRFJDIGNvbmZpZzogdGd0X2xldjogJTNkLCBjdXQ6ICUzZCwgYm9vc3Q6ICUzZCwgaGVhdnk6ICVkXG4iLCBuZXdUYXJnZXQsCisgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yLCBuZXdCb29zdEZhY3RvciwgbmV3SGVhdnkpOworI2VuZGlmCisgICAgICAgIG1EYXRhVXBkYXRlID0gZmFsc2U7CisKKyAgICB9IC8vIGlmIChtRGF0YVVwZGF0ZSkKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGI2Y2YyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI3ByYWdtYSBvbmNlCisjaW5jbHVkZSAiYWFjZGVjb2Rlcl9saWIuaCIKKwordHlwZWRlZiBlbnVtCit7CisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VUICAgICAgICAgPSAweDAwMDAsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUiAgICAgPSAweDAwMDEsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SICAgPSAweDAwMDIsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlkgICAgICAgICAgPSAweDAwMDMsCisgICAgRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VUICAgICAgICAgPSAweDAwMDQKK30gRFJDX1BSRVNfTU9ERV9XUkFQX1BBUkFNOworCisKK2NsYXNzIENEcmNQcmVzTW9kZVdyYXBwZXIgeworcHVibGljOgorICAgIENEcmNQcmVzTW9kZVdyYXBwZXIoKTsKKyAgICB+Q0RyY1ByZXNNb2RlV3JhcHBlcigpOworICAgIHZvaWQgc2V0RGVjb2RlckhhbmRsZShjb25zdCBIQU5ETEVfQUFDREVDT0RFUiBoYW5kbGUpOworICAgIHZvaWQgc2V0UGFyYW0oY29uc3QgRFJDX1BSRVNfTU9ERV9XUkFQX1BBUkFNIHBhcmFtLCBjb25zdCBpbnQgdmFsdWUpOworICAgIHZvaWQgc3VibWl0U3RyZWFtRGF0YShDU3RyZWFtSW5mbyopOworICAgIHZvaWQgdXBkYXRlKCk7CisKK3Byb3RlY3RlZDoKKyAgICBIQU5ETEVfQUFDREVDT0RFUiBtSGFuZGxlRGVjb2RlcjsKKyAgICBpbnQgbURlc1RhcmdldDsKKyAgICBpbnQgbURlc0F0dEZhY3RvcjsKKyAgICBpbnQgbURlc0Jvb3N0RmFjdG9yOworICAgIGludCBtRGVzSGVhdnk7CisKKyAgICBpbnQgbUVuY29kZXJUYXJnZXQ7CisKKyAgICBpbnQgbUxhc3RUYXJnZXQ7CisgICAgaW50IG1MYXN0QXR0RmFjdG9yOworICAgIGludCBtTGFzdEJvb3N0RmFjdG9yOworICAgIGludCBtTGFzdEhlYXZ5OworCisgICAgU0NIQVIgbVN0cmVhbVBSTDsKKyAgICBTQ0hBUiBtU3RyZWFtRFJDUHJlc01vZGU7CisgICAgSU5UIG1TdHJlYW1OckFBQ0NoYW47CisgICAgSU5UIG1TdHJlYW1Ock91dENoYW47CisKKyAgICBib29sIG1Jc0Rvd25taXg7CisgICAgYm9vbCBtSXNNb25vRG93bm1peDsKKyAgICBib29sIG1Jc1N0ZXJlb0Rvd25taXg7CisKKyAgICBib29sIG1EYXRhVXBkYXRlOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CkBAIC0wLDAgKzEsOSBAQAorCitUSElTIElTIE5PVCBBIEdSQU5UIE9GIFBBVEVOVCBSSUdIVFMuCisKK0dvb2dsZSBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBvciB3YXJyYW50eSB0aGF0IHRoZSBjb2RlY3MgZm9yIHdoaWNoCitzb3VyY2UgY29kZSBpcyBtYWRlIGF2YWlsYWJsZSBoZXJldW5kZXIgYXJlIHVuZW5jdW1iZXJlZCBieQordGhpcmQtcGFydHkgcGF0ZW50cy4gIFRob3NlIGludGVuZGluZyB0byB1c2UgdGhpcyBzb3VyY2UgY29kZSBpbgoraGFyZHdhcmUgb3Igc29mdHdhcmUgcHJvZHVjdHMgYXJlIGFkdmlzZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YKK3RoZXNlIGNvZGVjcywgaW5jbHVkaW5nIGluIG9wZW4gc291cmNlIHNvZnR3YXJlIG9yIHNoYXJld2FyZSwgbWF5CityZXF1aXJlIHBhdGVudCBsaWNlbnNlcyBmcm9tIHRoZSByZWxldmFudCBwYXRlbnQgaG9sZGVycy4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UyNWJjOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzcgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYW1ybmJkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEFtckRlYy5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURBTVJOQiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYmRlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYW1yd2JkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEFtckRlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYmRlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYW1ybmJlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEFtck5iRW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hbXJ3YmVuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QW1yV2JFbmMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1yd2JlbmMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtckRlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhZDc1YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuY3BwCkBAIC0wLDAgKzEsNDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2lmZGVmIEFNUk5CCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFtck5iRGVjIgorI2Vsc2UKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QW1yV2JEZWMiCisjZW5kaWYKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QW1yRGVjLmgiCisjaW5jbHVkZSAiZ3NtYW1yX2RlYy5oIgorI2luY2x1ZGUgInB2YW1yd2JkZWNvZGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2lmZGVmIEFNUk5CCisgIGNvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hbXJuYi5kZWNvZGVyIjsKKyNlbHNlCisgIGNvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hbXJ3Yi5kZWNvZGVyIjsKKyNlbmRpZgorCitjbGFzcyBDMlNvZnRBbXJEZWM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyNpZmRlZiBBTVJOQgorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCCisjZW5kaWYKKyAgICAgICAgICAgICAgICApKS5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorI2lmZGVmIEFNUk5CCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5lcXVhbFRvKDgwMDApfSkKKyNlbHNlCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDE2MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuZXF1YWxUbygxNjAwMCl9KQorI2VuZGlmCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuZXF1YWxUbygxKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisjaWZkZWYgQU1STkIKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA0NzUwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg0NzUwLCAxMjIwMCl9KQorI2Vsc2UKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2NjAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg2NjAwLCAyMzg1MCl9KQorI2VuZGlmCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworfTsKKworQzJTb2Z0QW1yRGVjOjpDMlNvZnRBbXJEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUFtckhhbmRsZShudWxscHRyKSwKKyAgICAgIG1EZWNvZGVyQnVmKG51bGxwdHIpLAorICAgICAgbURlY29kZXJDb29raWUobnVsbHB0cikgeworI2lmZGVmIEFNUk5CCisgICAgbUlzV2lkZSA9IGZhbHNlOworI2Vsc2UKKyAgICBtSXNXaWRlID0gdHJ1ZTsKKyNlbmRpZgorfQorCitDMlNvZnRBbXJEZWM6On5DMlNvZnRBbXJEZWMoKSB7CisgICAgKHZvaWQpb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtckRlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfTk9fTUVNT1JZOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJEZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAoIW1Jc1dpZGUpIHsKKyAgICAgICAgU3BlZWNoX0RlY29kZV9GcmFtZV9yZXNldChtQW1ySGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdkRlY29kZXJfQW1yV2JfUmVzZXQobUFtckhhbmRsZSwgMCAvKiByZXNldF9hbGwgKi8pOworICAgIH0KKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEFtckRlYzo6b25SZWxlYXNlKCkgeworICAgIGlmICghbUlzV2lkZSkgeworICAgICAgICBpZiAobUFtckhhbmRsZSkgeworICAgICAgICAgICAgR1NNRGVjb2RlRnJhbWVFeGl0KCZtQW1ySGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBtQW1ySGFuZGxlID0gbnVsbHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobURlY29kZXJCdWYpIHsKKyAgICAgICAgICAgIGZyZWUobURlY29kZXJCdWYpOworICAgICAgICB9CisgICAgICAgIG1EZWNvZGVyQnVmID0gbnVsbHB0cjsKKyAgICAgICAgbUFtckhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIG1EZWNvZGVyQ29va2llID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtckRlYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3N0YXR1c190IEMyU29mdEFtckRlYzo6aW5pdERlY29kZXIoKSB7CisgICAgaWYgKCFtSXNXaWRlKSB7CisgICAgICAgIGlmIChHU01Jbml0RGVjb2RlKCZtQW1ySGFuZGxlLCAoaW50OF90ICopIkFNUk5CRGVjb2RlciIpKQorICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDMyX3QgbWVtUmVxID0gcHZEZWNvZGVyX0FtcldiTWVtUmVxdWlyZW1lbnRzKCk7CisgICAgICAgIG1EZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcSk7CisgICAgICAgIGlmIChtRGVjb2RlckJ1ZikgeworICAgICAgICAgICAgcHZEZWNvZGVyX0FtcldiX0luaXQoJm1BbXJIYW5kbGUsIG1EZWNvZGVyQnVmLCAmbURlY29kZXJDb29raWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyBzaXplX3QgZ2V0RnJhbWVTaXplKGJvb2wgaXNXaWRlLCB1bnNpZ25lZCBGTSkgeworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYW1lU2l6ZU5CWzE2XSA9IHsKKyAgICAgICAgMTIsIDEzLCAxNSwgMTcsIDE5LCAyMCwgMjYsIDMxLAorICAgICAgICA1LCA2LCA1LCA1LCAvLyBTSUQKKyAgICAgICAgMCwgMCwgMCwgLy8gZnV0dXJlIHVzZQorICAgICAgICAwIC8vIG5vIGRhdGEKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYW1lU2l6ZVdCWzE2XSA9IHsKKyAgICAgICAgMTcsIDIzLCAzMiwgMzYsIDQwLCA0NiwgNTAsIDU4LCA2MCwKKyAgICAgICAgNSwgLy8gU0lECisgICAgICAgIDAsIDAsIDAsIDAsIC8vIGZ1dHVyZSB1c2UKKyAgICAgICAgMCwgLy8gc3BlZWNoIGxvc3QKKyAgICAgICAgMCAvLyBubyBkYXRhCisgICAgfTsKKworICAgIGlmIChGTSA+IDE1IHx8IChpc1dpZGUgJiYgRk0gPiA5ICYmIEZNIDwgMTQpIHx8ICghaXNXaWRlICYmIEZNID4gMTEgJiYgRk0gPCAxNSkpIHsKKyAgICAgICAgQUxPR0UoImlsbGVnYWwgQU1SIGZyYW1lIG1vZGUgJWQiLCBGTSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyBhZGQgMSBmb3IgaGVhZGVyIGJ5dGUKKyAgICByZXR1cm4gKGlzV2lkZSA/IGtGcmFtZVNpemVXQltGTV0gOiBrRnJhbWVTaXplTkJbRk1dKSArIDE7Cit9CisKK3N0YXRpYyBzdGF0dXNfdCBjYWxjdWxhdGVOdW1GcmFtZXMoY29uc3QgdWludDggKmlucHV0LCBzaXplX3QgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+ICpmcmFtZVNpemVMaXN0LCBib29sIGlzV2lkZSkgeworICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgaW5TaXplOykgeworICAgICAgICBpbnQxNl90IEZNID0gKChpbnB1dFswXSA+PiAzKSAmIDB4MGYpOworICAgICAgICBzaXplX3QgZnJhbWVTaXplID0gZ2V0RnJhbWVTaXplKGlzV2lkZSwgRk0pOworICAgICAgICBpZiAoZnJhbWVTaXplID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmICgoaW5TaXplIC0gaykgPj0gZnJhbWVTaXplKSB7CisgICAgICAgICAgICBpbnB1dCArPSBmcmFtZVNpemU7CisgICAgICAgICAgICBrICs9IGZyYW1lU2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGJyZWFrOworICAgICAgICBmcmFtZVNpemVMaXN0LT5wdXNoX2JhY2soZnJhbWVTaXplKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEMyU29mdEFtckRlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gZnJhbWVTaXplTGlzdDsKKyAgICBpZiAoT0sgIT0gY2FsY3VsYXRlTnVtRnJhbWVzKHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0LCBpblNpemUsICZmcmFtZVNpemVMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzV2lkZSkpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChmcmFtZVNpemVMaXN0LmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoImlucHV0IHNpemUgc21hbGxlciB0aGFuIGV4cGVjdGVkIik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDE2X3Qgb3V0U2FtcGxlcyA9IG1Jc1dpZGUgPyBrTnVtU2FtcGxlc1BlckZyYW1lV0IgOiBrTnVtU2FtcGxlc1BlckZyYW1lTkI7CisgICAgc2l6ZV90IGNhbE91dFNpemUgPSBvdXRTYW1wbGVzICogZnJhbWVTaXplTGlzdC5zaXplKCkgKiBzaXplb2YoaW50MTZfdCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKGNhbE91dFNpemUsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MTZfdCAqb3V0cHV0ID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+KHdWaWV3LmRhdGEoKSk7CisgICAgYXV0byBpdCA9IGZyYW1lU2l6ZUxpc3QuYmVnaW4oKTsKKyAgICBjb25zdCB1aW50OF90ICppblB0ciA9IHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0OworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGlmIChpdCA9PSBmcmFtZVNpemVMaXN0LmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRCgidW5leHBlY3RlZCB0cmFpbGluZyBieXRlcywgaWdub3JpbmcgdGhlbSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCAqaW5wdXQgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5QdHIgKyBpblBvcyk7CisgICAgICAgIGludDE2X3QgRk0gPSAoKCppbnB1dCA+PiAzKSAmIDB4MGYpOworICAgICAgICBpZiAoIW1Jc1dpZGUpIHsKKyAgICAgICAgICAgIGludDMyX3QgbnVtQnl0ZXNSZWFkID0gQU1SRGVjb2RlKG1BbXJIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRnJhbWVfVHlwZV8zR1BQKSBGTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0ICsgMSwgb3V0cHV0LCBNSU1FX0lFVEYpOworICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4obnVtQnl0ZXNSZWFkICsgMSkgIT0gKml0KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoInBhbmljLCBwYXJzZWQgc2l6ZSBkb2VzIG5vdCBtYXRjaCBkZWNvZGVkIHNpemUiKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoRk0gPj0gOSkgeworICAgICAgICAgICAgICAgIC8vIFByb2R1Y2Ugc2lsZW5jZSBpbnN0ZWFkIG9mIGNvbWZvcnQgbm9pc2UgYW5kIGZvcgorICAgICAgICAgICAgICAgIC8vIHNwZWVjaCBsb3N0L25vIGRhdGEuCisgICAgICAgICAgICAgICAgbWVtc2V0KG91dHB1dCwgMCwgb3V0U2FtcGxlcyAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludDE2X3QgRlQ7CisgICAgICAgICAgICAgICAgUlhfU3RhdGVfd2Igcnhfc3RhdGU7CisgICAgICAgICAgICAgICAgaW50MTZfdCBudW1SZWNTYW1wbGVzOworCisgICAgICAgICAgICAgICAgbWltZV91bnNvcnRpbmcoY29uc3RfY2FzdDx1aW50OF90ICo+KCZpbnB1dFsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0U2FtcGxlQnVmZmVyLCAmRlQsICZGTSwgMSwgJnJ4X3N0YXRlKTsKKyAgICAgICAgICAgICAgICBwdkRlY29kZXJfQW1yV2IoRk0sIG1JbnB1dFNhbXBsZUJ1ZmZlciwgb3V0cHV0LCAmbnVtUmVjU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlY29kZXJCdWYsIEZULCBtRGVjb2RlckNvb2tpZSk7CisgICAgICAgICAgICAgICAgaWYgKG51bVJlY1NhbXBsZXMgIT0gb3V0U2FtcGxlcykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiU2FtcGxlIG91dHB1dCBwZXIgZnJhbWUgaW5jb3JyZWN0Iik7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGhlIDIgTFNCcyAoMTQtYml0IG91dHB1dCkgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVJlY1NhbXBsZXM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXRbaV0gJj0gMHhmZmZDOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpblBvcyArPSAqaXQ7CisgICAgICAgIG91dHB1dCArPSBvdXRTYW1wbGVzOworICAgICAgICArK2l0OworICAgIH0KKworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaykpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0QU1SRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEFNUkRlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRBbXJEZWMoQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QW1yRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QW1yRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QU1SRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QU1SRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM4NDQ1MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQU1SX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfQU1SX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRBbXJEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0QW1yRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEFtckRlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtOdW1TYW1wbGVzUGVyRnJhbWVOQiAgID0gMTYwLAorICAgICAgICBrTnVtU2FtcGxlc1BlckZyYW1lV0IgICA9IDMyMCwKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICB2b2lkICptQW1ySGFuZGxlOworICAgIHZvaWQgKm1EZWNvZGVyQnVmOworICAgIGludDE2X3QgKm1EZWNvZGVyQ29va2llOworCisgICAgaW50MTZfdCBtSW5wdXRTYW1wbGVCdWZmZXJbNDc3XTsKKworICAgIGJvb2wgbUlzV2lkZTsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QW1yRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FNUl9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkM2FhN2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuY3BwCkBAIC0wLDAgKzEsMzU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBbXJOYkVuYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QW1yTmJFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYW1ybmIuZW5jb2RlciI7CisKK2NsYXNzIEMyU29mdEFtck5iRW5jOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmVxdWFsVG8oMSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQoMHUsIDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5lcXVhbFRvKDgwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCA0NzUwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg0NzUwLCAxMjIwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsZVJhdGUtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Q2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudC0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRCaXRyYXRlKCkgY29uc3QgeyByZXR1cm4gbUJpdHJhdGUtPnZhbHVlOyB9CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworfTsKKworQzJTb2Z0QW1yTmJFbmM6OkMyU29mdEFtck5iRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtRW5jU3RhdGUobnVsbHB0ciksCisgICAgICBtU2lkU3RhdGUobnVsbHB0cikgeworfQorCitDMlNvZnRBbXJOYkVuYzo6fkMyU29mdEFtck5iRW5jKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJOYkVuYzo6b25Jbml0KCkgeworICAgIGJvb2wgZHR4X2VuYWJsZSA9IGZhbHNlOworCisgICAgaWYgKEFNUkVuY29kZUluaXQoJm1FbmNTdGF0ZSwgJm1TaWRTdGF0ZSwgZHR4X2VuYWJsZSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAvLyBUT0RPOiBnZXQgbW9kZSBkaXJlY3RseSBmcm9tIGNvbmZpZworICAgIHN3aXRjaChtSW50Zi0+Z2V0Qml0cmF0ZSgpKSB7CisgICAgICAgIGNhc2UgNDc1MDogbU1vZGUgPSBNUjQ3NTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDUxNTA6IG1Nb2RlID0gTVI1MTU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OTAwOiBtTW9kZSA9IE1SNTk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2NzAwOiBtTW9kZSA9IE1SNjc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3NDAwOiBtTW9kZSA9IE1SNzQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OTUwOiBtTW9kZSA9IE1SNzk1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTAyMDA6IG1Nb2RlID0gTVIxMDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMjIwMDogbU1vZGUgPSBNUjEyMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiBtTW9kZSA9IE1SNzk1OworICAgIH0KKyAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKyAgICBtRmlsbGVkTGVuID0gMDsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBbXJOYkVuYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtRW5jU3RhdGUpIHsKKyAgICAgICAgQU1SRW5jb2RlRXhpdCgmbUVuY1N0YXRlLCAmbVNpZFN0YXRlKTsKKyAgICAgICAgbUVuY1N0YXRlID0gbVNpZFN0YXRlID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtck5iRW5jOjpvblN0b3AoKSB7CisgICAgaWYgKEFNUkVuY29kZVJlc2V0KG1FbmNTdGF0ZSwgbVNpZFN0YXRlKSAhPSAwKQorICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDA7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwOworICAgIG1GaWxsZWRMZW4gPSAwOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFtck5iRW5jOjpvblJlc2V0KCkgeworICAgICh2b2lkKSBvblN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yTmJFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRBbXJOYkVuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworCisgICAgc2l6ZV90IG91dENhcGFjaXR5ID0ga051bUJ5dGVzUGVySW5wdXRGcmFtZTsKKyAgICBvdXRDYXBhY2l0eSArPSBtRmlsbGVkTGVuICsgaW5TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBvdXRwdXRCbG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhvdXRDYXBhY2l0eSwgdXNhZ2UsICZvdXRwdXRCbG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IG91dHB1dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPQorICAgICAgICBtUHJvY2Vzc2VkU2FtcGxlcyAqIDEwMDAwMDBsbCAvIG1JbnRmLT5nZXRTYW1wbGVSYXRlKCk7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICBzaXplX3Qgb3V0UG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqaW5QdHIgPSByVmlldy5kYXRhKCkgKyBpbk9mZnNldDsKKyAgICAgICAgaW50IHZhbGlkU2FtcGxlcyA9IG1GaWxsZWRMZW4gLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGlmICgoaW5Qb3MgKyAoa051bUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKSA8PSBpblNpemUpIHsKKyAgICAgICAgICAgIG1lbWNweShtSW5wdXRGcmFtZSArIHZhbGlkU2FtcGxlcywgaW5QdHIgKyBpblBvcywKKyAgICAgICAgICAgICAgICAgICAoa051bUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKTsKKyAgICAgICAgICAgIGluUG9zICs9IChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkobUlucHV0RnJhbWUgKyB2YWxpZFNhbXBsZXMsIGluUHRyICsgaW5Qb3MsIChpblNpemUgLSBpblBvcykpOworICAgICAgICAgICAgbUZpbGxlZExlbiArPSAoaW5TaXplIC0gaW5Qb3MpOworICAgICAgICAgICAgaW5Qb3MgKz0gKGluU2l6ZSAtIGluUG9zKTsKKyAgICAgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgICAgICB2YWxpZFNhbXBsZXMgPSBtRmlsbGVkTGVuIC8gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgICAgIG1lbXNldChtSW5wdXRGcmFtZSArIHZhbGlkU2FtcGxlcywgMCwgKGtOdW1CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKSk7CisgICAgICAgICAgICB9IGVsc2UgYnJlYWs7CisKKyAgICAgICAgfQorICAgICAgICBGcmFtZV9UeXBlXzNHUFAgZnJhbWVUeXBlOworICAgICAgICBpbnQgbnVtRW5jQnl0ZXMgPSBBTVJFbmNvZGUobUVuY1N0YXRlLCBtU2lkU3RhdGUsIG1Nb2RlLCBtSW5wdXRGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdWaWV3LmRhdGEoKSArIG91dFBvcywgJmZyYW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNUl9UWF9XTUYpOworICAgICAgICBpZiAobnVtRW5jQnl0ZXMgPCAwIHx8IG51bUVuY0J5dGVzID4gKChpbnQpb3V0Q2FwYWNpdHkgLSAoaW50KW91dFBvcykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJlbmNvZGVGcmFtZSBjYWxsIGZhaWxlZCwgc3RhdGUgWyVkICV6dSAlenVdIiwgbnVtRW5jQnl0ZXMsIG91dFBvcywgb3V0Q2FwYWNpdHkpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBDb252ZXJ0IGhlYWRlciBieXRlIGZyb20gV01GIHRvIElFVEYgZm9ybWF0LgorICAgICAgICBpZiAobnVtRW5jQnl0ZXMgPiAwKQorICAgICAgICAgICAgd1ZpZXcuZGF0YSgpW291dFBvc10gPSAoKHdWaWV3LmRhdGEoKVtvdXRQb3NdIDw8IDMpIHwgNCkgJiAweDdjOworICAgICAgICBvdXRQb3MgKz0gbnVtRW5jQnl0ZXM7CisgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICs9IGtOdW1TYW1wbGVzUGVyRnJhbWU7CisgICAgICAgIG1GaWxsZWRMZW4gPSAwOworICAgIH0KKyAgICBBTE9HVigiY2F1c2FsIHNhbXBsZSBzaXplICVkIiwgbUZpbGxlZExlbik7CisgICAgaWYgKG1Jc0ZpcnN0ICYmIG91dFBvcyAhPSAwKSB7CisgICAgICAgIG1Jc0ZpcnN0ID0gZmFsc2U7CisgICAgICAgIG1BbmNob3JUaW1lU3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdWxsKCk7CisgICAgfQorICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgaWYgKG91dFBvcyAhPSAwKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBjcmVhdGVMaW5lYXJCdWZmZXIoc3RkOjptb3ZlKG91dHB1dEJsb2NrKSwgMCwgb3V0UG9zKSk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXA7CisKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgaWYgKG1GaWxsZWRMZW4pIEFMT0dWKCJEaXNjYXJkaW5nIHRyYWlsaW5nICVkIGJ5dGVzIiwgbUZpbGxlZExlbik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJOYkVuYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBvbkZsdXNoX3NtKCk7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRBbXJOYkVuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRBbXJOYkVuY0ZhY3RvcnkoKQorICAgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkge30KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0QW1yTmJFbmMoCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QW1yTmJFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEFtck5iRW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QW1yTmJFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEFtck5iRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QW1yTmJFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFiMTRkYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BTVJfTkJfRU5DX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BTVJfTkJfRU5DX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiZ3NtYW1yX2VuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyU29mdEFtck5iRW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgIHB1YmxpYzoKKyAgICBjbGFzcyBJbnRmSW1wbDsKKyAgICBDMlNvZnRBbXJOYkVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEFtck5iRW5jKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga051bVNhbXBsZXNQZXJGcmFtZSA9IExfRlJBTUU7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga051bUJ5dGVzUGVySW5wdXRGcmFtZSA9IGtOdW1TYW1wbGVzUGVyRnJhbWUgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICB2b2lkICptRW5jU3RhdGU7CisgICAgdm9pZCAqbVNpZFN0YXRlOworICAgIE1vZGUgbU1vZGU7CisgICAgYm9vbCBtSXNGaXJzdDsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgdWludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKKyAgICB1aW50NjRfdCBtUHJvY2Vzc2VkU2FtcGxlczsKKyAgICBpbnQzMl90IG1GaWxsZWRMZW47CisgICAgaW50MTZfdCBtSW5wdXRGcmFtZVtrTnVtU2FtcGxlc1BlckZyYW1lXTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEFtck5iRW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FNUl9OQl9FTkNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OWNiMzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuY3BwCkBAIC0wLDAgKzEsNDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBbXJXYkVuYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEFtcldiRW5jLmgiCisjaW5jbHVkZSAiY21uTWVtb3J5LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmFtcndiLmVuY29kZXIiOworCitjbGFzcyBDMlNvZnRBbXJXYkVuYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4mIGhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5lcXVhbFRvKDEpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0KDB1LCAxNjAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmVxdWFsVG8oMTYwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCA2NjAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg2NjAwLCAyMzg1MCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsZVJhdGUtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Q2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudC0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRCaXRyYXRlKCkgY29uc3QgeyByZXR1cm4gbUJpdHJhdGUtPnZhbHVlOyB9CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworfTsKKworQzJTb2Z0QW1yV2JFbmM6OkMyU29mdEFtcldiRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtRW5jb2RlckhhbmRsZShudWxscHRyKSwKKyAgICAgIG1BcGlIYW5kbGUobnVsbHB0ciksCisgICAgICBtTWVtT3BlcmF0b3IobnVsbHB0cikgeworfQorCitDMlNvZnRBbXJXYkVuYzo6fkMyU29mdEFtcldiRW5jKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJXYkVuYzo6b25Jbml0KCkgeworICAgIC8vIFRPRE86IGdldCBtb2RlIGRpcmVjdGx5IGZyb20gY29uZmlnCisgICAgc3dpdGNoKG1JbnRmLT5nZXRCaXRyYXRlKCkpIHsKKyAgICAgICAgY2FzZSA2NjAwOiBtTW9kZSA9IFZPQU1SV0JfTUQ2NjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDg4NTA6IG1Nb2RlID0gVk9BTVJXQl9NRDg4NTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEyNjUwOiBtTW9kZSA9IFZPQU1SV0JfTUQxMjY1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTQyNTA6IG1Nb2RlID0gVk9BTVJXQl9NRDE0MjU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNTg1MDogbU1vZGUgPSBWT0FNUldCX01EMTU4NTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE4MjUwOiBtTW9kZSA9IFZPQU1SV0JfTUQxODI1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTk4NTA6IG1Nb2RlID0gVk9BTVJXQl9NRDE5ODU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyMzA1MDogbU1vZGUgPSBWT0FNUldCX01EMjMwNTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIzODUwOiBtTW9kZSA9IFZPQU1SV0JfTUQyMzg1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IG1Nb2RlID0gVk9BTVJXQl9NRDIzMDU7CisgICAgfQorICAgIHN0YXR1c190IGVyciA9IGluaXRFbmNvZGVyKCk7CisgICAgbUlzRmlyc3QgPSB0cnVlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDA7CisgICAgbUZpbGxlZExlbiA9IDA7CisKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yV2JFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobUVuY29kZXJIYW5kbGUpIHsKKyAgICAgICAgQ0hFQ0tfRVEoKFZPX1UzMilWT19FUlJfTk9ORSwgbUFwaUhhbmRsZS0+VW5pbml0KG1FbmNvZGVySGFuZGxlKSk7CisgICAgICAgIG1FbmNvZGVySGFuZGxlID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1BcGlIYW5kbGUpIHsKKyAgICAgICAgZGVsZXRlIG1BcGlIYW5kbGU7CisgICAgICAgIG1BcGlIYW5kbGUgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobU1lbU9wZXJhdG9yKSB7CisgICAgICAgIGRlbGV0ZSBtTWVtT3BlcmF0b3I7CisgICAgICAgIG1NZW1PcGVyYXRvciA9IG51bGxwdHI7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJXYkVuYzo6b25TdG9wKCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVNhbXBsZXNQZXJGcmFtZTsgaSsrKSB7CisgICAgICAgIG1JbnB1dEZyYW1lW2ldID0gMHgwMDA4OyAvKiBFSEZfTUFTSyAqLworICAgIH0KKyAgICB1aW50OF90IG91dEJ1ZmZlcltrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lXTsKKyAgICAodm9pZCkgZW5jb2RlSW5wdXQob3V0QnVmZmVyLCBrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lKTsKKyAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKyAgICBtRmlsbGVkTGVuID0gMDsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBbXJXYkVuYzo6b25SZXNldCgpIHsKKyAgICAodm9pZCkgb25TdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtcldiRW5jOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0QW1yV2JFbmM6OmluaXRFbmNvZGVyKCkgeworICAgIG1BcGlIYW5kbGUgPSBuZXcgVk9fQVVESU9fQ09ERUNBUEk7CisgICAgaWYgKCFtQXBpSGFuZGxlKSByZXR1cm4gTk9fTUVNT1JZOworCisgICAgaWYgKFZPX0VSUl9OT05FICE9IHZvR2V0QU1SV0JFbmNBUEkobUFwaUhhbmRsZSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgYXBpIGhhbmRsZSIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBtTWVtT3BlcmF0b3IgPSBuZXcgVk9fTUVNX09QRVJBVE9SOworICAgIGlmICghbU1lbU9wZXJhdG9yKSByZXR1cm4gTk9fTUVNT1JZOworCisgICAgbU1lbU9wZXJhdG9yLT5BbGxvYyA9IGNtbk1lbUFsbG9jOworICAgIG1NZW1PcGVyYXRvci0+Q29weSA9IGNtbk1lbUNvcHk7CisgICAgbU1lbU9wZXJhdG9yLT5GcmVlID0gY21uTWVtRnJlZTsKKyAgICBtTWVtT3BlcmF0b3ItPlNldCA9IGNtbk1lbVNldDsKKyAgICBtTWVtT3BlcmF0b3ItPkNoZWNrID0gY21uTWVtQ2hlY2s7CisKKyAgICBWT19DT0RFQ19JTklUX1VTRVJEQVRBIHVzZXJEYXRhOworICAgIG1lbXNldCgmdXNlckRhdGEsIDAsIHNpemVvZih1c2VyRGF0YSkpOworICAgIHVzZXJEYXRhLm1lbWZsYWcgPSBWT19JTUZfVVNFUk1FTU9QRVJBVE9SOworICAgIHVzZXJEYXRhLm1lbURhdGEgPSAoVk9fUFRSKSBtTWVtT3BlcmF0b3I7CisKKyAgICBpZiAoVk9fRVJSX05PTkUgIT0gbUFwaUhhbmRsZS0+SW5pdCgKKyAgICAgICAgICAgICAgICAmbUVuY29kZXJIYW5kbGUsIFZPX0FVRElPX0NvZGluZ0FNUldCLCAmdXNlckRhdGEpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdCBBTVJXQiBlbmNvZGVyIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIFZPQU1SV0JGUkFNRVRZUEUgdHlwZSA9IFZPQU1SV0JfUkZDMzI2NzsKKyAgICBpZiAoVk9fRVJSX05PTkUgIT0gbUFwaUhhbmRsZS0+U2V0UGFyYW0oCisgICAgICAgICAgICAgICAgbUVuY29kZXJIYW5kbGUsIFZPX1BJRF9BTVJXQl9GUkFNRVRZUEUsICZ0eXBlKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBTVJXQiBlbmNvZGVyIGZyYW1lIHR5cGUgdG8gJWQiLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKFZPX0VSUl9OT05FICE9CisgICAgICAgICAgICBtQXBpSGFuZGxlLT5TZXRQYXJhbSgKKyAgICAgICAgICAgICAgICAgICAgbUVuY29kZXJIYW5kbGUsIFZPX1BJRF9BTVJXQl9NT0RFLCAgJm1Nb2RlKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBTVJXQiBlbmNvZGVyIG1vZGUgdG8gJWQiLCBtTW9kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworaW50IEMyU29mdEFtcldiRW5jOjplbmNvZGVJbnB1dCh1aW50OF90ICpidWZmZXIsIHVpbnQzMl90IGxlbmd0aCkgeworICAgIFZPX0NPREVDQlVGRkVSIGlucHV0RGF0YTsKKyAgICBtZW1zZXQoJmlucHV0RGF0YSwgMCwgc2l6ZW9mKGlucHV0RGF0YSkpOworICAgIGlucHV0RGF0YS5CdWZmZXIgPSAodW5zaWduZWQgY2hhciAqKSBtSW5wdXRGcmFtZTsKKyAgICBpbnB1dERhdGEuTGVuZ3RoID0ga051bUJ5dGVzUGVySW5wdXRGcmFtZTsKKworICAgIENIRUNLX0VRKChWT19VMzIpVk9fRVJSX05PTkUsCisgICAgICAgICAgICAgbUFwaUhhbmRsZS0+U2V0SW5wdXREYXRhKG1FbmNvZGVySGFuZGxlLCAmaW5wdXREYXRhKSk7CisKKyAgICBWT19BVURJT19PVVRQVVRJTkZPIG91dHB1dEluZm87CisgICAgbWVtc2V0KCZvdXRwdXRJbmZvLCAwLCBzaXplb2Yob3V0cHV0SW5mbykpOworICAgIFZPX0NPREVDQlVGRkVSIG91dHB1dERhdGE7CisgICAgbWVtc2V0KCZvdXRwdXREYXRhLCAwLCBzaXplb2Yob3V0cHV0RGF0YSkpOworICAgIG91dHB1dERhdGEuQnVmZmVyID0gYnVmZmVyOworICAgIG91dHB1dERhdGEuTGVuZ3RoID0gbGVuZ3RoOworICAgIFZPX1UzMiByZXQgPSBtQXBpSGFuZGxlLT5HZXRPdXRwdXREYXRhKAorICAgICAgICAgICAgbUVuY29kZXJIYW5kbGUsICZvdXRwdXREYXRhLCAmb3V0cHV0SW5mbyk7CisgICAgaWYgKHJldCAhPSBWT19FUlJfTk9ORSAmJiByZXQgIT0gVk9fRVJSX0lOUFVUX0JVRkZFUl9TTUFMTCkgeworICAgICAgICBBTE9HRCgiZW5jb3VudGVyZWQgZXJyb3IgZHVyaW5nIGVuY29kZSBjYWxsIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIG91dHB1dERhdGEuTGVuZ3RoOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRBbXJXYkVuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisKKyAgICBzaXplX3Qgb3V0Q2FwYWNpdHkgPSBrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lOworICAgIG91dENhcGFjaXR5ICs9IG1GaWxsZWRMZW4gKyBpblNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IG91dHB1dEJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dENhcGFjaXR5LCB1c2FnZSwgJm91dHB1dEJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gb3V0cHV0QmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPQorICAgICAgICBtUHJvY2Vzc2VkU2FtcGxlcyAqIDEwMDAwMDBsbCAvIG1JbnRmLT5nZXRTYW1wbGVSYXRlKCk7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICBzaXplX3Qgb3V0UG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqaW5QdHIgPSByVmlldy5kYXRhKCkgKyBpbk9mZnNldDsKKyAgICAgICAgaW50IHZhbGlkU2FtcGxlcyA9IG1GaWxsZWRMZW4gLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGlmICgoaW5Qb3MgKyAoa051bUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKSA8PSBpblNpemUpIHsKKyAgICAgICAgICAgIG1lbWNweShtSW5wdXRGcmFtZSArIHZhbGlkU2FtcGxlcywgaW5QdHIgKyBpblBvcywKKyAgICAgICAgICAgICAgICAgICAoa051bUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKTsKKyAgICAgICAgICAgIGluUG9zICs9IChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkobUlucHV0RnJhbWUgKyB2YWxpZFNhbXBsZXMsIGluUHRyICsgaW5Qb3MsIChpblNpemUgLSBpblBvcykpOworICAgICAgICAgICAgbUZpbGxlZExlbiArPSAoaW5TaXplIC0gaW5Qb3MpOworICAgICAgICAgICAgaW5Qb3MgKz0gKGluU2l6ZSAtIGluUG9zKTsKKyAgICAgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgICAgICB2YWxpZFNhbXBsZXMgPSBtRmlsbGVkTGVuIC8gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgICAgIG1lbXNldChtSW5wdXRGcmFtZSArIHZhbGlkU2FtcGxlcywgMCwgKGtOdW1CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKSk7CisgICAgICAgICAgICB9IGVsc2UgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW50IG51bUVuY0J5dGVzID0gZW5jb2RlSW5wdXQoKHdWaWV3LmRhdGEoKSArIG91dFBvcyksIG91dENhcGFjaXR5IC0gb3V0UG9zKTsKKyAgICAgICAgaWYgKG51bUVuY0J5dGVzIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoImVuY29kZUZyYW1lIGNhbGwgZmFpbGVkLCBzdGF0ZSBbJWQgJXp1ICV6dV0iLCBudW1FbmNCeXRlcywgb3V0UG9zLCBvdXRDYXBhY2l0eSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG91dFBvcyArPSBudW1FbmNCeXRlczsKKyAgICAgICAgbVByb2Nlc3NlZFNhbXBsZXMgKz0ga051bVNhbXBsZXNQZXJGcmFtZTsKKyAgICAgICAgbUZpbGxlZExlbiA9IDA7CisgICAgfQorICAgIEFMT0dWKCJjYXVzYWwgc2FtcGxlIHNpemUgJWQiLCBtRmlsbGVkTGVuKTsKKyAgICBpZiAobUlzRmlyc3QgJiYgb3V0UG9zICE9IDApIHsKKyAgICAgICAgbUlzRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICB9CisgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICBpZiAob3V0UG9zICE9IDApIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIGNyZWF0ZUxpbmVhckJ1ZmZlcihzdGQ6Om1vdmUob3V0cHV0QmxvY2spLCAwLCBvdXRQb3MpKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgaWYgKG1GaWxsZWRMZW4pIEFMT0dWKCJEaXNjYXJkaW5nIHRyYWlsaW5nICVkIGJ5dGVzIiwgbUZpbGxlZExlbik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJXYkVuYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBvbkZsdXNoX3NtKCk7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRBbXJXYkVuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRBbXJXYkVuY0ZhY3RvcnkoKQorICAgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkge30KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0QW1yV2JFbmMoCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QW1yV2JFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEFtcldiRW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QW1yV2JFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEFtcldiRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QW1yV2JFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNjOWU5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BTVJfV0JfRU5DX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BTVJfV0JfRU5DX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAidm9BTVJXQi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyU29mdEFtcldiRW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKK3B1YmxpYzoKKyAgICBjbGFzcyBJbnRmSW1wbDsKKyAgICBDMlNvZnRBbXJXYkVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEFtcldiRW5jKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga051bVNhbXBsZXNQZXJGcmFtZSA9IDMyMDsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lID0ga051bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KTsKKworICAgIHZvaWQgKm1FbmNvZGVySGFuZGxlOworICAgIFZPX0FVRElPX0NPREVDQVBJICptQXBpSGFuZGxlOworICAgIFZPX01FTV9PUEVSQVRPUiAqbU1lbU9wZXJhdG9yOworICAgIFZPQU1SV0JNT0RFIG1Nb2RlOworICAgIGJvb2wgbUlzRmlyc3Q7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIHVpbnQ2NF90IG1BbmNob3JUaW1lU3RhbXA7CisgICAgdWludDY0X3QgbVByb2Nlc3NlZFNhbXBsZXM7CisgICAgaW50MzJfdCBtRmlsbGVkTGVuOworICAgIGludDE2X3QgbUlucHV0RnJhbWVba051bVNhbXBsZXNQZXJGcmFtZV07CisKKyAgICBzdGF0dXNfdCBpbml0RW5jb2RlcigpOworICAgIGludCBlbmNvZGVJbnB1dCh1aW50OF90ICpidWZmZXIsIHVpbnQzMl90IGxlbmd0aCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBbXJXYkVuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BTVJfV0JfRU5DX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMWVmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvcGF0ZW50X2Rpc2NsYWltZXIudHh0IGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL3BhdGVudF9kaXNjbGFpbWVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGJmMTFkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL3BhdGVudF9kaXNjbGFpbWVyLnR4dApAQCAtMCwwICsxLDkgQEAKKworVEhJUyBJUyBOT1QgQSBHUkFOVCBPRiBQQVRFTlQgUklHSFRTLgorCitHb29nbGUgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gb3Igd2FycmFudHkgdGhhdCB0aGUgY29kZWNzIGZvciB3aGljaAorc291cmNlIGNvZGUgaXMgbWFkZSBhdmFpbGFibGUgaGVyZXVuZGVyIGFyZSB1bmVuY3VtYmVyZWQgYnkKK3RoaXJkLXBhcnR5IHBhdGVudHMuICBUaG9zZSBpbnRlbmRpbmcgdG8gdXNlIHRoaXMgc291cmNlIGNvZGUgaW4KK2hhcmR3YXJlIG9yIHNvZnR3YXJlIHByb2R1Y3RzIGFyZSBhZHZpc2VkIHRoYXQgaW1wbGVtZW50YXRpb25zIG9mCit0aGVzZSBjb2RlY3MsIGluY2x1ZGluZyBpbiBvcGVuIHNvdXJjZSBzb2Z0d2FyZSBvciBzaGFyZXdhcmUsIG1heQorcmVxdWlyZSBwYXRlbnQgbGljZW5zZXMgZnJvbSB0aGUgcmVsZXZhbnQgcGF0ZW50IGhvbGRlcnMuCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYWJmNWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQW5kcm9pZC5icApAQCAtMCwwICsxLDE0IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2F2MWRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QW9tRGVjLmNwcCJdLAorICAgIHN0YXRpY19saWJzOiBbImxpYmFvbSJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9saWJhb20vIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmNjMmM2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5jcHAKQEAgLTAsMCArMSw3NTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFvbURlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QW9tRGVjLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmF2MS5kZWNvZGVyIjsKKworY2xhc3MgQzJTb2Z0QW9tRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgaGVscGVyLCBDT01QT05FTlRfTkFNRSwgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywgTUVESUFfTUlNRVRZUEVfVklERU9fQVYxKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsgIC8vIFRPRE86IGFjY291bnQgZm9yIG91ciBidWZmZXJzIGhlcmUKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVYxXzAsIEMyQ29uZmlnOjpMRVZFTF9BVjFfMl8xKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVYxXzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVYxXzF9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfMl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfMl8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVYxXzNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVYxXzNfMiwKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcihEZWZpbmVQYXJhbShtTWF4U2l6ZSwgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDMyMCAqIDI0MCAqIDMgLyA0KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtTWF4SW5wdXRTaXplLCB2YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKE1heElucHV0U2l6ZVNldHRlciwgbU1heFNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0IGxvY2F0aW9uc1sxXSA9IHsKKyAgICAgICAgICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCl9OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgxdSwgMHUsIDh1IC8qIGJpdERlcHRoICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIG1lbWNweShkZWZhdWx0Q29sb3JJbmZvLT5tLmxvY2F0aW9ucywgbG9jYXRpb25zLCBzaXplb2YobG9jYXRpb25zKSk7CisKKyAgICAgICAgZGVmYXVsdENvbG9ySW5mbyA9IEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAge0MyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCl9LCAwdSwgOHUgLyogYml0RGVwdGggKi8sCisgICAgICAgICAgICBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcihEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+JiBvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+JiBtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heFBpY3R1cmVTaXplU2V0dGVyKAorICAgICAgICBib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiYgbWUsCisgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiYgc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuCisgICAgICAgIC8vIGhhcmRjb2RpbmcKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDQwOTZ1KTsKKyAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDQwOTZ1KTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heElucHV0U2l6ZVNldHRlcigKKyAgICAgICAgYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiYgbWUsCisgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+JiBtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMgorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDYzKSAvIDY0KSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICgobWF4U2l6ZS52LmhlaWdodCArIDYzKSAvIDY0KSAqIDMwNzIpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKyAgICBzdGF0aWMgQzJSIERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXNpemU7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IGdldERlZmF1bHRDb2xvckFzcGVjdHNfbCgpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0Q29sb3JBc3BlY3RzOworICAgIH0KKworICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiBtTWF4U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1NYXhJbnB1dFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IG1Db2xvckluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gbURlZmF1bHRDb2xvckFzcGVjdHM7Cit9OworCitDMlNvZnRBb21EZWM6OkMyU29mdEFvbURlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQ29kZWNDdHgobnVsbHB0cil7CisKKyAgICBHRU5FUkFURV9GSUxFX05BTUVTKCk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtSW5GaWxlKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1PdXRGaWxlKTsKKworICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7Cit9CisKK0MyU29mdEFvbURlYzo6fkMyU29mdEFvbURlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW9tRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFvbURlYzo6b25TdG9wKCkgeworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QW9tRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworICAgIGMyX3N0YXR1c190IGVyciA9IG9uRmx1c2hfc20oKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gZmx1c2ggZGVjb2Rlci4gVHJ5IHRvIGhhcmQgcmVzZXQgZGVjb2Rlci4iKTsKKyAgICAgICAgZGVzdHJveURlY29kZXIoKTsKKyAgICAgICAgKHZvaWQpaW5pdERlY29kZXIoKTsKKyAgICB9Cit9CisKK3ZvaWQgQzJTb2Z0QW9tRGVjOjpvblJlbGVhc2UoKSB7CisgICAgZGVzdHJveURlY29kZXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW9tRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChhb21fY29kZWNfZGVjb2RlKG1Db2RlY0N0eCwgbnVsbHB0ciwgMCwgbnVsbHB0cikpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmbHVzaCBhdjEgZGVjb2Rlci4iKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBhb21fY29kZWNfaXRlcl90IGl0ZXIgPSBudWxscHRyOworICAgIHdoaWxlIChhb21fY29kZWNfZ2V0X2ZyYW1lKG1Db2RlY0N0eCwgJml0ZXIpKSB7CisgICAgfQorCisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0aWMgaW50IEdldENQVUNvcmVDb3VudCgpIHsKKyAgICBpbnQgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiBjcHVDb3JlQ291bnQ7Cit9CisKK3N0YXR1c190IEMyU29mdEFvbURlYzo6aW5pdERlY29kZXIoKSB7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIGlmICghbUNvZGVjQ3R4KSB7CisgICAgICAgIG1Db2RlY0N0eCA9IG5ldyBhb21fY29kZWNfY3R4X3Q7CisgICAgfQorCisgICAgaWYgKCFtQ29kZWNDdHgpIHsKKyAgICAgICAgQUxPR0UoIm1Db2RlY0N0eCBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgYW9tX2NvZGVjX2RlY19jZmdfdCBjZmc7CisgICAgbWVtc2V0KCZjZmcsIDAsIHNpemVvZihhb21fY29kZWNfZGVjX2NmZ190KSk7CisgICAgY2ZnLnRocmVhZHMgPSBHZXRDUFVDb3JlQ291bnQoKTsKKyAgICBjZmcuYWxsb3dfbG93Yml0ZGVwdGggPSAxOworCisgICAgYW9tX2NvZGVjX2ZsYWdzX3QgZmxhZ3M7CisgICAgbWVtc2V0KCZmbGFncywgMCwgc2l6ZW9mKGFvbV9jb2RlY19mbGFnc190KSk7CisKKyAgICBhb21fY29kZWNfZXJyX3QgZXJyOworICAgIGlmICgoZXJyID0gYW9tX2NvZGVjX2RlY19pbml0KG1Db2RlY0N0eCwgYW9tX2NvZGVjX2F2MV9keCgpLCAmY2ZnLCAwKSkpIHsKKyAgICAgICAgQUxPR0UoImF2MSBkZWNvZGVyIGZhaWxlZCB0byBpbml0aWFsaXplLiAoJWQpIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRBb21EZWM6OmRlc3Ryb3lEZWNvZGVyKCkgeworICAgIGlmIChtQ29kZWNDdHgpIHsKKyAgICAgICAgYW9tX2NvZGVjX2Rlc3Ryb3kobUNvZGVjQ3R4KTsKKyAgICAgICAgZGVsZXRlIG1Db2RlY0N0eDsKKyAgICAgICAgbUNvZGVjQ3R4ID0gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0QW9tRGVjOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+JiBibG9jaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgY3JlYXRlR3JhcGhpY0J1ZmZlcihibG9jaywgQzJSZWN0KG1XaWR0aCwgbUhlaWdodCkpOworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyLCBpbmRleF0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBpZiAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgJiYKKyAgICAgICAgICAgIChjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCit2b2lkIEMyU29mdEFvbURlYzo6cHJvY2Vzcyhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIHsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9CisgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgY29kZWNDb25maWcgPQorICAgICAgICAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwKTsKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisKKyAgICBpZiAoY29kZWNDb25maWcpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3QgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrbGwoKTsKKyAgICBpZiAoaW5TaXplKSB7CisgICAgICAgIHVpbnQ4X3QqIGJpdHN0cmVhbSA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICAgICAgaW50MzJfdCBkZWNvZGVUaW1lID0gMDsKKyAgICAgICAgaW50MzJfdCBkZWxheSA9IDA7CisKKyAgICAgICAgRFVNUF9UT19GSUxFKG1PdXRGaWxlLCBiaXRzdHJlYW0sIGluU2l6ZSk7CisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIGRlbGF5KTsKKworICAgICAgICBhb21fY29kZWNfZXJyX3QgZXJyID0KKyAgICAgICAgICAgIGFvbV9jb2RlY19kZWNvZGUobUNvZGVjQ3R4LCBiaXRzdHJlYW0sIGluU2l6ZSwgJmZyYW1lSW5kZXgpOworCisgICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICAgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCBkZWNvZGVUaW1lKTsKKyAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JTRkIGRlbGF5PSU0ZFxuIiwgZGVjb2RlVGltZSwgZGVsYXkpOworCisgICAgICAgIGlmIChlcnIgIT0gQU9NX0NPREVDX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiYXYxIGRlY29kZXIgZmFpbGVkIHRvIGRlY29kZSBmcmFtZSBlcnI6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYW9tX2NvZGVjX2RlY29kZShtQ29kZWNDdHgsIG51bGxwdHIsIDAsIG51bGxwdHIpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZsdXNoIGF2MSBkZWNvZGVyLiIpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAodm9pZClvdXRwdXRCdWZmZXIocG9vbCwgd29yayk7CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghaW5TaXplKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZVjEyRnJhbWUodWludDhfdCAqZHN0LAorICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgc2l6ZV90IGRzdFlTdHJpZGUgPSBhbGlnbih3aWR0aCwgMTYpOworICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGFsaWduKGRzdFlTdHJpZGUgLyAyLCAxNik7CisgICAgdWludDhfdCogZHN0U3RhcnQgPSBkc3Q7CisKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjWSwgd2lkdGgpOworICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3RZU3RyaWRlOworICAgIH0KKworICAgIGRzdCA9IGRzdFN0YXJ0ICsgZHN0WVN0cmlkZSAqIGhlaWdodDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjViwgd2lkdGggLyAyKTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorCisgICAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCkgKyAoZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjVSwgd2lkdGggLyAyKTsKKyAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAodWludDMyX3QgKmRzdCwKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKKyAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKKyAgICAgICAgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7CisKKyAgICAvLyBDb252ZXJ0aW5nIHR3byBsaW5lcyBhdCBhIHRpbWUsIHNsaWdodGx5IGZhc3RlcgorICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IDIpIHsKKyAgICAgICAgdWludDMyX3QgKmRzdFRvcCA9ICh1aW50MzJfdCAqKSBkc3Q7CisgICAgICAgIHVpbnQzMl90ICpkc3RCb3QgPSAodWludDMyX3QgKikgKGRzdCArIGRzdFN0cmlkZSk7CisgICAgICAgIHVpbnQxNl90ICp5U3JjVG9wID0gKHVpbnQxNl90Kikgc3JjWTsKKyAgICAgICAgdWludDE2X3QgKnlTcmNCb3QgPSAodWludDE2X3QqKSAoc3JjWSArIHNyY1lTdHJpZGUpOworICAgICAgICB1aW50MTZfdCAqdVNyYyA9ICh1aW50MTZfdCopIHNyY1U7CisgICAgICAgIHVpbnQxNl90ICp2U3JjID0gKHVpbnQxNl90Kikgc3JjVjsKKworICAgICAgICB1aW50MzJfdCB1MDEsIHYwMSwgeTAxLCB5MjMsIHk0NSwgeTY3LCB1djAsIHV2MTsKKyAgICAgICAgc2l6ZV90IHggPSAwOworICAgICAgICBmb3IgKDsgeCA8IHdpZHRoIC0gMzsgeCArPSA0KSB7CisKKyAgICAgICAgICAgIHUwMSA9ICooKHVpbnQzMl90Kil1U3JjKTsgdVNyYyArPSAyOworICAgICAgICAgICAgdjAxID0gKigodWludDMyX3QqKXZTcmMpOyB2U3JjICs9IDI7CisKKyAgICAgICAgICAgIHkwMSA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsgeVNyY1RvcCArPSAyOworICAgICAgICAgICAgeTIzID0gKigodWludDMyX3QqKXlTcmNUb3ApOyB5U3JjVG9wICs9IDI7CisgICAgICAgICAgICB5NDUgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7IHlTcmNCb3QgKz0gMjsKKyAgICAgICAgICAgIHk2NyA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsgeVNyY0JvdCArPSAyOworCisgICAgICAgICAgICB1djAgPSAodTAxICYgMHgzRkYpIHwgKCh2MDEgJiAweDNGRikgPDwgMjApOworICAgICAgICAgICAgdXYxID0gKHUwMSA+PiAxNikgfCAoKHYwMSA+PiAxNikgPDwgMjApOworCisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MDEgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTAxID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MjMgJiAweDNGRikgPDwgMTApIHwgdXYxOworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTIzID4+IDE2KSA8PCAxMCkgfCB1djE7CisKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk0NSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NDUgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk2NyAmIDB4M0ZGKSA8PCAxMCkgfCB1djE7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NjcgPj4gMTYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZXJlIHNob3VsZCBiZSBhdCBtb3N0IDIgbW9yZSBwaXhlbHMgdG8gcHJvY2Vzcy4gTm90ZSB0aGF0IHdlIGRvbid0CisgICAgICAgIC8vIG5lZWQgdG8gY29uc2lkZXIgb2RkIGNhc2UgYXMgdGhlIGJ1ZmZlciBpcyBhbHdheXMgYWxpZ25lZCB0byBldmVuLgorICAgICAgICBpZiAoeCA8IHdpZHRoKSB7CisgICAgICAgICAgICB1MDEgPSAqdVNyYzsKKyAgICAgICAgICAgIHYwMSA9ICp2U3JjOworICAgICAgICAgICAgeTAxID0gKigodWludDMyX3QqKXlTcmNUb3ApOworICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QqKXlTcmNCb3QpOworICAgICAgICAgICAgdXYwID0gKHUwMSAmIDB4M0ZGKSB8ICgodjAxICYgMHgzRkYpIDw8IDIwKTsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9ICgoeTAxID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAoKHk0NSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAoKHk0NSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICB9CisKKyAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlICogMjsKKyAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3RTdHJpZGUgKiAyOworICAgIH0KKworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIodWludDhfdCAqZHN0LAorICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLAorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgICAgICBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKKworICAgIHVpbnQ4X3QgKmRzdFkgPSAodWludDhfdCAqKWRzdDsKKyAgICBzaXplX3QgZHN0WVNpemUgPSBkc3RTdHJpZGUgKiBoZWlnaHQ7CisgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gYWxpZ24oZHN0U3RyaWRlIC8gMiwgMTYpOworICAgIHNpemVfdCBkc3RVVlNpemUgPSBkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDI7CisgICAgdWludDhfdCAqZHN0ViA9IGRzdFkgKyBkc3RZU2l6ZTsKKyAgICB1aW50OF90ICpkc3RVID0gZHN0ViArIGRzdFVWU2l6ZTsKKworICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgICAgICAgICBkc3RZW3hdID0gKHVpbnQ4X3QpKHNyY1lbeF0gPj4gMik7CisgICAgICAgIH0KKworICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7CisgICAgICAgIGRzdFkgKz0gZHN0U3RyaWRlOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgKGhlaWdodCArIDEpIC8gMjsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgKHdpZHRoICsgMSkgLyAyOyArK3gpIHsKKyAgICAgICAgICAgIGRzdFVbeF0gPSAodWludDhfdCkoc3JjVVt4XSA+PiAyKTsKKyAgICAgICAgICAgIGRzdFZbeF0gPSAodWludDhfdCkoc3JjVlt4XSA+PiAyKTsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOworICAgICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOworICAgIH0KKyAgICByZXR1cm47Cit9Citib29sIEMyU29mdEFvbURlYzo6b3V0cHV0QnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykKK3sKKyAgICBpZiAoISh3b3JrICYmIHBvb2wpKSByZXR1cm4gZmFsc2U7CisKKyAgICBhb21fY29kZWNfaXRlcl90IGl0ZXIgPSBudWxscHRyOworICAgIGFvbV9pbWFnZV90KiBpbWcgPSBhb21fY29kZWNfZ2V0X2ZyYW1lKG1Db2RlY0N0eCwgJml0ZXIpOworCisgICAgaWYgKCFpbWcpIHJldHVybiBmYWxzZTsKKworICAgIGlmIChpbWctPmRfdyAhPSBtV2lkdGggfHwgaW1nLT5kX2ggIT0gbUhlaWdodCkgeworICAgICAgICBtV2lkdGggPSBpbWctPmRfdzsKKyAgICAgICAgbUhlaWdodCA9IGltZy0+ZF9oOworCisgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIHVwZGF0ZSBzaXplIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBDSEVDSyhpbWctPmZtdCA9PSBBT01fSU1HX0ZNVF9JNDIwIHx8IGltZy0+Zm10ID09IEFPTV9JTUdfRk1UX0k0MjAxNik7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOworICAgIHVpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICBpZiAoaW1nLT5mbXQgPT0gQU9NX0lNR19GTVRfSTQyMDE2KSB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gZGVmYXVsdENvbG9yQXNwZWN0cyA9IG1JbnRmLT5nZXREZWZhdWx0Q29sb3JBc3BlY3RzX2woKTsKKworICAgICAgICBpZiAoZGVmYXVsdENvbG9yQXNwZWN0cy0+cHJpbWFyaWVzID09IEMyQ29sb3I6OlBSSU1BUklFU19CVDIwMjAgJiYKKyAgICAgICAgICAgIGRlZmF1bHRDb2xvckFzcGVjdHMtPm1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwICYmCisgICAgICAgICAgICBkZWZhdWx0Q29sb3JBc3BlY3RzLT50cmFuc2ZlciA9PSBDMkNvbG9yOjpUUkFOU0ZFUl9TVDIwODQpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyOworICAgICAgICB9CisgICAgfQorICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX07CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhhbGlnbihtV2lkdGgsIDE2KSwgbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIHVzYWdlLCAmYmxvY2spOworCisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBlcnI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworCisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCksIG91dCBmcmFtZWluZGV4ICVkIiwKKyAgICAgICAgICBibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpLCBtV2lkdGgsIG1IZWlnaHQsCisgICAgICAgICAgKGludCkqKGludDY0X3QqKWltZy0+dXNlcl9wcml2KTsKKworICAgIHVpbnQ4X3QqIGRzdCA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHNpemVfdCBzcmNZU3RyaWRlID0gaW1nLT5zdHJpZGVbQU9NX1BMQU5FX1ldOworICAgIHNpemVfdCBzcmNVU3RyaWRlID0gaW1nLT5zdHJpZGVbQU9NX1BMQU5FX1VdOworICAgIHNpemVfdCBzcmNWU3RyaWRlID0gaW1nLT5zdHJpZGVbQU9NX1BMQU5FX1ZdOworCisgICAgaWYgKGltZy0+Zm10ID09IEFPTV9JTUdfRk1UX0k0MjAxNikgeworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSA9IChjb25zdCB1aW50MTZfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9ZXTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1UgPSAoY29uc3QgdWludDE2X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfVV07CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNWID0gKGNvbnN0IHVpbnQxNl90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1ZdOworCisgICAgICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDIpIHsKKyAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCgodWludDMyX3QgKilkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24obVdpZHRoLCAxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduKG1XaWR0aCwgMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9ZXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1VdOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNWID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfVl07CisgICAgICAgIGNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZShkc3QsIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgfQorICAgIGZpbmlzaFdvcmsoKihpbnQ2NF90KilpbWctPnVzZXJfcHJpdiwgd29yaywgc3RkOjptb3ZlKGJsb2NrKSk7CisgICAgYmxvY2sgPSBudWxscHRyOworICAgIHJldHVybiB0cnVlOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBb21EZWM6OmRyYWluSW50ZXJuYWwoCisgICAgdWludDMyX3QgZHJhaW5Nb2RlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sLAorICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGlmIChhb21fY29kZWNfZGVjb2RlKG1Db2RlY0N0eCwgbnVsbHB0ciwgMCwgbnVsbHB0cikpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmbHVzaCBhdjEgZGVjb2Rlci4iKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICB3aGlsZSAoKG91dHB1dEJ1ZmZlcihwb29sLCB3b3JrKSkpIHsKKyAgICB9CisKKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUyAmJiB3b3JrICYmCisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID09IDB1KSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBb21EZWM6OmRyYWluKHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2NsYXNzIEMyU29mdEFvbUZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKKyAgIHB1YmxpYzoKKyAgICBDMlNvZnRBb21GYWN0b3J5KCkKKyAgICAgICAgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdEFvbURlYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QW9tRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRBb21EZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBb21EZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEFvbUZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEFvbUZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjODI2NDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmgKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BVjFfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BVjFfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgImFvbS9hb21fZGVjb2Rlci5oIgorI2luY2x1ZGUgImFvbS9hb21keC5oIgorCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgZ2V0dGltZW9mZGF5KGEsIGIpOworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0QW9tRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEFvbURlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRBb21EZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSBvdmVycmlkZTsKKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGFvbV9jb2RlY19jdHhfdCogbUNvZGVjQ3R4OworCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworCisgICAgI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICBjaGFyIG1JbkZpbGVbMjAwXTsKKyAgICBjaGFyIG1PdXRGaWxlWzIwMF07CisgICAgI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7ICAgLy8gVGltZSBhdCB0aGUgc3RhcnQgb2YgZGVjb2RlKCkKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsgICAgIC8vIFRpbWUgYXQgdGhlIGVuZCBvZiBkZWNvZGUoKQorCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBkZXN0cm95RGVjb2RlcigpOworICAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4mIGJsb2NrKTsKKyAgICBib29sIG91dHB1dEJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKTsKKworICAgIGMyX3N0YXR1c190IGRyYWluSW50ZXJuYWwodWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEFvbURlYyk7Cit9OworCisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorCisjZGVmaW5lIElOUFVUX0RVTVBfUEFUSCAiL2RhdGEvbG9jYWwvdG1wL3RlbXAvYXYxIgorI2RlZmluZSBJTlBVVF9EVU1QX0VYVCAid2VibSIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSCAiL2RhdGEvbG9jYWwvdG1wL3RlbXAvYXYxIgorI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQgImF2MSIKKyNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RyY3B5KG1JbkZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkdFTkVSQVRFX0ZJTEVfTkFNRVMiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJWxkLiVsZC4lcyIsIElOUFVUX0RVTVBfUEFUSCwgbVRpbWVTdGFydC50dl9zZWMsIFwKKyAgICAgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3VzZWMsIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RyY3B5KG1PdXRGaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3ByaW50ZihtT3V0RmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBPVVRQVVRfRFVNUF9QQVRILCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCBPVVRQVVRfRFVNUF9FWFQpOyAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRklMRSogZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAid2IiKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJPcGVuZWQgZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyAgICAgICAgIFwKKyAgICAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgb3BlbiBmaWxlICVzIiwgbV9maWxlbmFtZSk7IFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKSAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRklMRSogZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAiYWIiKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCAhPSBOVUxMICYmIG1fYnVmICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJEdW1wIHRvIGZpbGUhIik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpID0gZndyaXRlKG1fYnVmLCAxLCBtX3NpemUsIGZwKTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKGkgIT0gKGludCltX3NpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBTE9HRCgiRXJyb3IgaW4gZndyaXRlLCByZXR1cm5lZCAlZCIsIGkpOyAgICBcCisgICAgICAgICAgICAgICAgcGVycm9yKCJFcnJvciBpbiB3cml0ZSB0byBmaWxlIik7ICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICVzIiwgbV9maWxlbmFtZSk7IFwKKyAgICAgICAgICAgIGlmIChmcCAhPSBOVUxMKSBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKyNkZWZpbmUgSU5QVVRfRFVNUF9QQVRICisjZGVmaW5lIElOUFVUX0RVTVBfRVhUCisjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUCisjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKQorI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpCisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKQorI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQVYxX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDIxNDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzNyBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hdmNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYmF2Y2RlYyJdLAorCisgICAgc3JjczogWyJDMlNvZnRBdmNEZWMuY3BwIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImV4dGVybmFsL2xpYmF2Yy9kZWNvZGVyIiwKKyAgICAgICAgImV4dGVybmFsL2xpYmF2Yy9jb21tb24iLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYXZjZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJhdmNlbmMiXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QXZjRW5jLmNwcCJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9saWJhdmMvZW5jb2RlciIsCisgICAgICAgICJleHRlcm5hbC9saWJhdmMvY29tbW9uIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLXVudXNlZC12YXJpYWJsZSIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI5MGQ3NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwCkBAIC0wLDAgKzEsOTg2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEF2Y0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyTWFwcGVyLmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEF2Y0RlYy5oIgorI2luY2x1ZGUgImloMjY0ZC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hdmMuZGVjb2RlciI7CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBDMlNvZnRBdmNEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7IC8vIFRPRE86IGFjY291bnQgZm9yIG91ciBidWZmZXJzIGhlcmUKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICAvLyBUT0RPOiBQcm9wZXIgc3VwcG9ydCBmb3IgcmVvcmRlciBkZXB0aC4KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxPdXRwdXREZWxheSwgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dCg4dSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRPRE86IG91dHB1dCBsYXRlbmN5IGFuZCByZW9yZGVyaW5nCisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZyhDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gY29kZWQgYW5kIG91dHB1dCBwaWN0dXJlIHNpemUgaXMgdGhlIHNhbWUgZm9yIHRoaXMgY29kZWMKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDQwODAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCA0MDgwLCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4U2l6ZSwgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCA0MDgwLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgNDA4MCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihNYXhQaWN0dXJlU2l6ZVNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSwgQzJDb25maWc6OkxFVkVMX0FWQ181XzIpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX0JBU0VMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19NQUlOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9ISUdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVkNfMSwgQzJDb25maWc6OkxFVkVMX0FWQ18xQiwgQzJDb25maWc6OkxFVkVMX0FWQ18xXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ18xXzIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVkNfMiwgQzJDb25maWc6OkxFVkVMX0FWQ18yXzEsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMl8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVkNfMywgQzJDb25maWc6OkxFVkVMX0FWQ18zXzEsIEMyQ29uZmlnOjpMRVZFTF9BVkNfM18yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVkNfNCwgQzJDb25maWc6OkxFVkVMX0FWQ180XzEsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNF8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVkNfNSwgQzJDb25maWc6OkxFVkVMX0FWQ181XzEsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNV8yCisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDMyMCAqIDI0MCAqIDMgLyA0KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtTWF4SW5wdXRTaXplLCB2YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKE1heElucHV0U2l6ZVNldHRlciwgbU1heFNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0IGxvY2F0aW9uc1sxXSA9IHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgMXUsIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIG1lbWNweShkZWZhdWx0Q29sb3JJbmZvLT5tLmxvY2F0aW9ucywgbG9jYXRpb25zLCBzaXplb2YobG9jYXRpb25zKSk7CisKKyAgICAgICAgZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgeyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH0sCisgICAgICAgICAgICAgICAgICAgIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIGhlbHBlci0+YWRkU3RydWN0RGVzY3JpcHRvcnM8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+KCk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckluZm8sIEMyX1BBUkFNS0VZX0NPREVEX0NPTE9SX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKGRlZmF1bHRDb2xvckluZm8pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRGVmYXVsdENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29kZWRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9MSU1JVEVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2xvckFzcGVjdHNTZXR0ZXIsIG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtQ29kZWRDb2xvckFzcGVjdHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmb3JtYXRzPworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBpeGVsRm9ybWF0LCBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heFBpY3R1cmVTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuIGhhcmRjb2RpbmcKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDQwODB1KTsKKyAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDQwODB1KTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heElucHV0U2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWF4U2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gYXNzdW1lIGNvbXByZXNzaW9uIHJhdGlvIG9mIDIKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAoKChtYXhTaXplLnYud2lkdGggKyAxNSkgLyAxNikgKiAoKG1heFNpemUudi5oZWlnaHQgKyAxNSkgLyAxNikgKiAxOTIpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJmNvZGVkKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyB0YWtlIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgdW5zcGVjaWZpZWQgZmllbGRzLCBhbmQgY29kZWQgdmFsdWVzIGZvciBzcGVjaWZpZWQgb25lcworICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IGNvZGVkLnYucmFuZ2UgPT0gUkFOR0VfVU5TUEVDSUZJRUQgPyBkZWYudi5yYW5nZSA6IGNvZGVkLnYucmFuZ2U7CisgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IGNvZGVkLnYucHJpbWFyaWVzID09IFBSSU1BUklFU19VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYucHJpbWFyaWVzIDogY29kZWQudi5wcmltYXJpZXM7CisgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gY29kZWQudi50cmFuc2ZlciA9PSBUUkFOU0ZFUl9VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYudHJhbnNmZXIgOiBjb2RlZC52LnRyYW5zZmVyOworICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBjb2RlZC52Lm1hdHJpeCA9PSBNQVRSSVhfVU5TUEVDSUZJRUQgPyBkZWYudi5tYXRyaXggOiBjb2RlZC52Lm1hdHJpeDsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IGdldENvbG9yQXNwZWN0c19sKCkgeworICAgICAgICByZXR1cm4gbUNvbG9yQXNwZWN0czsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+IG1NYXhTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbU1heElucHV0U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gbUNvbG9ySW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gbUNvZGVkQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IG1Db2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKK307CisKK3N0YXRpYyBzaXplX3QgZ2V0Q3B1Q29yZUNvdW50KCkgeworICAgIGxvbmcgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWxkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gKHNpemVfdCljcHVDb3JlQ291bnQ7Cit9CisKK3N0YXRpYyB2b2lkICppdmRfYWxpZ25lZF9tYWxsb2Modm9pZCAqY3R4dCwgV09SRDMyIGFsaWdubWVudCwgV09SRDMyIHNpemUpIHsKKyAgICAodm9pZCkgY3R4dDsKKyAgICByZXR1cm4gbWVtYWxpZ24oYWxpZ25tZW50LCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgaXZkX2FsaWduZWRfZnJlZSh2b2lkICpjdHh0LCB2b2lkICptZW0pIHsKKyAgICAodm9pZCkgY3R4dDsKKyAgICBmcmVlKG1lbSk7Cit9CisKK0MyU29mdEF2Y0RlYzo6QzJTb2Z0QXZjRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1EZWNIYW5kbGUobnVsbHB0ciksCisgICAgICBtT3V0QnVmZmVyRmx1c2gobnVsbHB0ciksCisgICAgICBtSXZDb2xvckZvcm1hdChJVl9ZVVZfNDIwUCksCisgICAgICBtV2lkdGgoMzIwKSwKKyAgICAgIG1IZWlnaHQoMjQwKSwKKyAgICAgIG1IZWFkZXJEZWNvZGVkKGZhbHNlKSB7CisgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOworICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7Cit9CisKK0MyU29mdEF2Y0RlYzo6fkMyU29mdEF2Y0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlYzo6b25TdG9wKCkgeworICAgIGlmIChPSyAhPSByZXNldERlY29kZXIoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICByZXNldFBsdWdpbigpOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBdmNEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpIG9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEF2Y0RlYzo6b25SZWxlYXNlKCkgeworICAgICh2b2lkKSBkZWxldGVEZWNvZGVyKCk7CisgICAgaWYgKG1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG51bGxwdHIsIG1PdXRCdWZmZXJGbHVzaCk7CisgICAgICAgIG1PdXRCdWZmZXJGbHVzaCA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2spIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKE9LICE9IHNldEZsdXNoTW9kZSgpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IG1TdHJpZGUgKiBtSGVpZ2h0ICogMyAvIDI7CisgICAgbU91dEJ1ZmZlckZsdXNoID0gKHVpbnQ4X3QgKilpdmRfYWxpZ25lZF9tYWxsb2MobnVsbHB0ciwgMTI4LCBidWZmZXJTaXplKTsKKyAgICBpZiAoIW1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBBTE9HRSgiY291bGQgbm90IGFsbG9jYXRlIHRtcCBvdXRwdXQgYnVmZmVyIChmb3IgZmx1c2gpIG9mIHNpemUgJXUgIiwgYnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgfQorCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisKKyAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgMCwgMCk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoMCA9PSBzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG51bGxwdHIsIG1PdXRCdWZmZXJGbHVzaCk7CisgICAgICAgIG1PdXRCdWZmZXJGbHVzaCA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmNyZWF0ZURlY29kZXIoKSB7CisgICAgaXZkZXh0X2NyZWF0ZV9pcF90IHNfY3JlYXRlX2lwOworICAgIGl2ZGV4dF9jcmVhdGVfb3BfdCBzX2NyZWF0ZV9vcDsKKworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2NyZWF0ZV9pcF90KTsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5lX2NtZCA9IElWRF9DTURfQ1JFQVRFOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5lX291dHB1dF9mb3JtYXQgPSBtSXZDb2xvckZvcm1hdDsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5wZl9hbGlnbmVkX2FsbG9jID0gaXZkX2FsaWduZWRfbWFsbG9jOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnBmX2FsaWduZWRfZnJlZSA9IGl2ZF9hbGlnbmVkX2ZyZWU7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QucHZfbWVtX2N0eHQgPSBudWxscHRyOworICAgIHNfY3JlYXRlX29wLnNfaXZkX2NyZWF0ZV9vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2NyZWF0ZV9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfY3JlYXRlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19jcmVhdGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19jcmVhdGVfb3Auc19pdmRfY3JlYXRlX29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtRGVjSGFuZGxlID0gKGl2X29ial90KilzX2NyZWF0ZV9vcC5zX2l2ZF9jcmVhdGVfb3BfdC5wdl9oYW5kbGU7CisgICAgbURlY0hhbmRsZS0+cHZfZnhucyA9ICh2b2lkICopaXZkZWNfYXBpX2Z1bmN0aW9uOworICAgIG1EZWNIYW5kbGUtPnU0X3NpemUgPSBzaXplb2YoaXZfb2JqX3QpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OnNldE51bUNvcmVzKCkgeworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfc2V0X251bV9jb3Jlc19pcDsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCBzX3NldF9udW1fY29yZXNfb3A7CisKKyAgICBzX3NldF9udW1fY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X251bV9jb3JlcyA9IG1OdW1Db3JlczsKKyAgICBzX3NldF9udW1fY29yZXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfbnVtX2NvcmVzX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6c2V0UGFyYW1zKHNpemVfdCBzdHJpZGUsIElWRF9WSURFT19ERUNPREVfTU9ERV9UIGRlY19tb2RlKSB7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX2lwX3Qgc19zZXRfZHluX3BhcmFtc19pcDsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfb3BfdCBzX3NldF9keW5fcGFyYW1zX29wOworCisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9TRVRQQVJBTVM7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9kaXNwX3dkID0gKFVXT1JEMzIpIHN0cmlkZTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX3NraXBfbW9kZSA9IElWRF9TS0lQX05PTkU7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2ZybV9vdXRfbW9kZSA9IElWRF9ESVNQTEFZX0ZSQU1FX09VVDsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfdmlkX2RlY19tb2RlID0gZGVjX21vZGU7CisgICAgc19zZXRfZHluX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9keW5fcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2R5bl9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDMlNvZnRBdmNEZWM6OmdldFZlcnNpb24oKSB7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfZ2V0X3ZlcnNpb25pbmZvX2lwOworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCBzX2dldF92ZXJzaW9uaW5mb19vcDsKKyAgICBVV09SRDggYXUxX2J1Zls1MTJdOworCisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3QpOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfR0VUVkVSU0lPTjsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlciA9IGF1MV9idWY7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfdmVyc2lvbl9idWZmZXJfc2l6ZSA9IHNpemVvZihhdTFfYnVmKTsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92ZXJzaW9uaW5mb19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3ZlcnNpb25pbmZvX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHNfZ2V0X3ZlcnNpb25pbmZvX29wLnU0X2Vycm9yX2NvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJpdHRpYW0gZGVjb2RlciB2ZXJzaW9uIG51bWJlcjogJXMiLAorICAgICAgICAgICAgICAoY2hhciAqKSBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlcik7CisgICAgfQorfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIGlmIChPSyAhPSBjcmVhdGVEZWNvZGVyKCkpIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIG1OdW1Db3JlcyA9IE1JTihnZXRDcHVDb3JlQ291bnQoKSwgTUFYX05VTV9DT1JFUyk7CisgICAgbVN0cmlkZSA9IEFMSUdONjQobVdpZHRoKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXNldFBsdWdpbigpOworICAgICh2b2lkKSBzZXROdW1Db3JlcygpOworICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9GUkFNRSkpIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICh2b2lkKSBnZXRWZXJzaW9uKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQzJTb2Z0QXZjRGVjOjpzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNvZGVfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgKm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0c01hcmtlcikgeworICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBtU3RyaWRlOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBtSGVpZ2h0OworICAgIHNpemVfdCBsdW1hU2l6ZSA9IGRpc3BsYXlTdHJpZGUgKiBkaXNwbGF5SGVpZ2h0OworICAgIHNpemVfdCBjaHJvbWFTaXplID0gbHVtYVNpemUgPj4gMjsKKworICAgIHBzX2RlY29kZV9pcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX2lwX3QpOworICAgIHBzX2RlY29kZV9pcC0+ZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0RFQ09ERTsKKyAgICBpZiAoaW5CdWZmZXIpIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IHRzTWFya2VyOworICAgICAgICBwc19kZWNvZGVfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5CdWZmZXItPmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF9udW1fQnl0ZXMgPSBpblNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IDA7CisgICAgICAgIHBzX2RlY29kZV9pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfbnVtX0J5dGVzID0gMDsKKyAgICB9CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVswXSA9IGx1bWFTaXplOworICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMV0gPSBjaHJvbWFTaXplOworICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMl0gPSBjaHJvbWFTaXplOworICAgIGlmIChvdXRCdWZmZXIpIHsKKyAgICAgICAgaWYgKG91dEJ1ZmZlci0+d2lkdGgoKSA8IGRpc3BsYXlTdHJpZGUgfHwgb3V0QnVmZmVyLT5oZWlnaHQoKSA8IGRpc3BsYXlIZWlnaHQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJPdXRwdXQgYnVmZmVyIHRvbyBzbWFsbDogcHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJXV4JXUpIiwKKyAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+d2lkdGgoKSwgb3V0QnVmZmVyLT5oZWlnaHQoKSwgZGlzcGxheVN0cmlkZSwgZGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IG1PdXRCdWZmZXJGbHVzaDsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBtT3V0QnVmZmVyRmx1c2ggKyBsdW1hU2l6ZTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBtT3V0QnVmZmVyRmx1c2ggKyBsdW1hU2l6ZSArIGNocm9tYVNpemU7CisgICAgfQorICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X251bV9idWZzID0gMzsKKyAgICBwc19kZWNvZGVfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9vcF90KTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEMyU29mdEF2Y0RlYzo6Z2V0VnVpUGFyYW1zKCkgeworICAgIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCBzX2dldF92dWlfcGFyYW1zX2lwOworICAgIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCBzX2dldF92dWlfcGFyYW1zX29wOworCisgICAgc19nZXRfdnVpX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCk7CisgICAgc19nZXRfdnVpX3BhcmFtc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfaXAuZV9zdWJfY21kID0KKyAgICAgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpIElIMjY0RF9DTURfQ1RMX0dFVF9WVUlfUEFSQU1TOworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdnVpX3BhcmFtc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3Z1aV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19nZXRfdnVpX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFZ1aUNvbG9yQXNwZWN0cyB2dWlDb2xvckFzcGVjdHM7CisgICAgdnVpQ29sb3JBc3BlY3RzLnByaW1hcmllcyA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfY29sb3VyX3ByaW1hcmllczsKKyAgICB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX3Rmcl9jaGFyczsKKyAgICB2dWlDb2xvckFzcGVjdHMuY29lZmZzID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV9tYXRyaXhfY29lZmZzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5mdWxsUmFuZ2UgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX3ZpZGVvX2Z1bGxfcmFuZ2VfZmxhZzsKKworICAgIC8vIGNvbnZlcnQgdnVpIGFzcGVjdHMgdG8gQzIgdmFsdWVzIGlmIGNoYW5nZWQKKyAgICBpZiAoISh2dWlDb2xvckFzcGVjdHMgPT0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0cykpIHsKKyAgICAgICAgbUJpdHN0cmVhbUNvbG9yQXNwZWN0cyA9IHZ1aUNvbG9yQXNwZWN0czsKKyAgICAgICAgQ29sb3JBc3BlY3RzIHNmQXNwZWN0czsKKyAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCBjb2RlZEFzcGVjdHMgPSB7IDB1IH07CisgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzLCB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIsIHZ1aUNvbG9yQXNwZWN0cy5jb2VmZnMsCisgICAgICAgICAgICAgICAgdnVpQ29sb3JBc3BlY3RzLmZ1bGxSYW5nZSwgc2ZBc3BlY3RzKTsKKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tUHJpbWFyaWVzLCAmY29kZWRBc3BlY3RzLnByaW1hcmllcykpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tUmFuZ2UsICZjb2RlZEFzcGVjdHMucmFuZ2UpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1NYXRyaXhDb2VmZnMsICZjb2RlZEFzcGVjdHMubWF0cml4KSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1UcmFuc2ZlciwgJmNvZGVkQXNwZWN0cy50cmFuc2ZlcikpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgKHZvaWQpbUludGYtPmNvbmZpZyh7JmNvZGVkQXNwZWN0c30sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6c2V0Rmx1c2hNb2RlKCkgeworICAgIGl2ZF9jdGxfZmx1c2hfaXBfdCBzX3NldF9mbHVzaF9pcDsKKyAgICBpdmRfY3RsX2ZsdXNoX29wX3Qgc19zZXRfZmx1c2hfb3A7CisKKyAgICBzX3NldF9mbHVzaF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfaXBfdCk7CisgICAgc19zZXRfZmx1c2hfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9mbHVzaF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9GTFVTSDsKKyAgICBzX3NldF9mbHVzaF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9mbHVzaF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2ZsdXNoX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2ZsdXNoX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6cmVzZXREZWNvZGVyKCkgeworICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX3Jlc2V0X2lwOworICAgIGl2ZF9jdGxfcmVzZXRfb3BfdCBzX3Jlc2V0X29wOworCisgICAgc19yZXNldF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfaXBfdCk7CisgICAgc19yZXNldF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfcmVzZXRfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfUkVTRVQ7CisgICAgc19yZXNldF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Jlc2V0X2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19yZXNldF9vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3Jlc2V0X29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbVN0cmlkZSA9IDA7CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbUhlYWRlckRlY29kZWQgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDMlNvZnRBdmNEZWM6OnJlc2V0UGx1Z2luKCkgeworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmRlbGV0ZURlY29kZXIoKSB7CisgICAgaWYgKG1EZWNIYW5kbGUpIHsKKyAgICAgICAgaXZkZXh0X2RlbGV0ZV9pcF90IHNfZGVsZXRlX2lwOworICAgICAgICBpdmRleHRfZGVsZXRlX29wX3Qgc19kZWxldGVfb3A7CisKKyAgICAgICAgc19kZWxldGVfaXAuc19pdmRfZGVsZXRlX2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfZGVsZXRlX2lwX3QpOworICAgICAgICBzX2RlbGV0ZV9pcC5zX2l2ZF9kZWxldGVfaXBfdC5lX2NtZCA9IElWRF9DTURfREVMRVRFOworICAgICAgICBzX2RlbGV0ZV9vcC5zX2l2ZF9kZWxldGVfb3BfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9kZWxldGVfb3BfdCk7CisgICAgICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZGVsZXRlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZGVsZXRlX29wKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgIHNfZGVsZXRlX29wLnNfaXZkX2RlbGV0ZV9vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgbURlY0hhbmRsZSA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdEF2Y0RlYzo6ZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoc3RkOjptb3ZlKG1PdXRCbG9jayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChtV2lkdGgsIG1IZWlnaHQpKTsKKyAgICBtT3V0QmxvY2sgPSBudWxscHRyOworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIGJ1ZmZlci0+c2V0SW5mbyhtSW50Zi0+Z2V0Q29sb3JBc3BlY3RzX2woKSk7CisgICAgfQorCisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXJdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH07CisgICAgaWYgKHdvcmsgJiYgYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2goaW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlYzo6ZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICAgICAgQUxPR0UoIm5vdCBzdXBwb3NlZCB0byBiZSBoZXJlLCBpbnZhbGlkIGRlY29kZXIgY29udGV4dCIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBpZiAobVN0cmlkZSAhPSBBTElHTjY0KG1XaWR0aCkpIHsKKyAgICAgICAgbVN0cmlkZSA9IEFMSUdONjQobVdpZHRoKTsKKyAgICAgICAgaWYgKE9LICE9IHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0ZSQU1FKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgaWYgKG1PdXRCbG9jayAmJgorICAgICAgICAgICAgKG1PdXRCbG9jay0+d2lkdGgoKSAhPSBtU3RyaWRlIHx8IG1PdXRCbG9jay0+aGVpZ2h0KCkgIT0gbUhlaWdodCkpIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGlmICghbU91dEJsb2NrKSB7CisgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhtU3RyaWRlLCBtSGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmbU91dEJsb2NrKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImZldGNoR3JhcGhpY0Jsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCVkeCVkKSIsCisgICAgICAgICAgICAgIG1PdXRCbG9jay0+d2lkdGgoKSwgbU91dEJsb2NrLT5oZWlnaHQoKSwgbVN0cmlkZSwgbUhlaWdodCk7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCisvLyBUT0RPOiBjYW4gb3ZlcmFsbCBlcnJvciBjaGVja2luZyBiZSBpbXByb3ZlZD8KKy8vIFRPRE86IGFsbG93IGNvbmZpZ3VyYXRpb24gb2YgY29sb3IgZm9ybWF0IGFuZCB1c2FnZSBmb3IgZ3JhcGhpYyBidWZmZXJzIGluc3RlYWQKKy8vICAgICAgIG9mIGhhcmQgY29kaW5nIHRoZW0gdG8gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyCisvLyBUT0RPOiBwYXNzIGNvbG9yYXNwZWN0cyBpbmZvcm1hdGlvbiB0byBzdXJmYWNlCisvLyBUT0RPOiB0ZXN0IHN1cHBvcnQgZm9yIGR5bmFtaWMgY2hhbmdlIGluIHJlc29sdXRpb24KKy8vIFRPRE86IHZlcmlmeSBpZiB0aGUgZGVjb2RlciBzZW50IGJhY2sgYWxsIGZyYW1lcwordm9pZCBDMlNvZnRBdmNEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICB1aW50MzJfdCB3b3JrSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSAmIDB4RkZGRkZGRkY7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIGJvb2wgaGFzUGljdHVyZSA9IGZhbHNlOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBpZiAoQzJfT0sgIT0gZW5zdXJlRGVjb2RlclN0YXRlKHBvb2wpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICB7CisgICAgICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsICZyVmlldywgJndWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT2Zmc2V0ICsgaW5Qb3MsIGluU2l6ZSAtIGluUG9zLCB3b3JrSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmYWxzZSA9PSBtSGVhZGVyRGVjb2RlZCkgeworICAgICAgICAgICAgICAgIC8qIERlY29kZSBoZWFkZXIgYW5kIGdldCBkaW1lbnNpb25zICovCisgICAgICAgICAgICAgICAgc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfSEVBREVSKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgV09SRDMyIGRlbGF5OworICAgICAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIGRlbGF5KTsKKyAgICAgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICAgICAgV09SRDMyIGRlY29kZVRpbWU7CisgICAgICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgICAgICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIGRlY29kZVRpbWUpOworICAgICAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQiLCBkZWNvZGVUaW1lLCBkZWxheSwKKyAgICAgICAgICAgICAgICAgIHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKElWRF9NRU1fQUxMT0NfRkFJTEVEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpIHsKKyAgICAgICAgICAgIEFMT0dFKCJhbGxvY2F0aW9uIGZhaWx1cmUgaW4gZGVjb2RlciIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoSVZEX1NUUkVBTV9XSURUSF9IRUlHSFRfTk9UX1NVUFBPUlRFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKSB7CisgICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgcmVzb2x1dGlvbiA6ICVkeCVkIiwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKElWRF9SRVNfQ0hBTkdFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKSB7CisgICAgICAgICAgICBBTE9HVigicmVzb2x1dGlvbiBjaGFuZ2VkIik7CisgICAgICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9OT19FT1MsIHBvb2wsIHdvcmspOworICAgICAgICAgICAgcmVzZXREZWNvZGVyKCk7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKworICAgICAgICAgICAgLyogRGVjb2RlIGhlYWRlciBhbmQgZ2V0IG5ldyBkaW1lbnNpb25zICovCisgICAgICAgICAgICBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9IRUFERVIpOworICAgICAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKDAgPCBzX2RlY29kZV9vcC51NF9waWNfd2QgJiYgMCA8IHNfZGVjb2RlX29wLnU0X3BpY19odCkgeworICAgICAgICAgICAgaWYgKG1IZWFkZXJEZWNvZGVkID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgbUhlYWRlckRlY29kZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHNldFBhcmFtcyhBTElHTjY0KHNfZGVjb2RlX29wLnU0X3BpY193ZCksIElWRF9ERUNPREVfRlJBTUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X3BpY193ZCAhPSBtV2lkdGggfHwgc19kZWNvZGVfb3AudTRfcGljX2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtV2lkdGggPSBzX2RlY29kZV9vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgbUhlaWdodCA9IHNfZGVjb2RlX29wLnU0X3BpY19odDsKKyAgICAgICAgICAgICAgICBDSEVDS19FUSgwdSwgc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpOworCisgICAgICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgd2lkdGggYW5kIGhlaWdodCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpZ2V0VnVpUGFyYW1zKCk7CisgICAgICAgIGhhc1BpY3R1cmUgfD0gKDEgPT0gc19kZWNvZGVfb3AudTRfZnJhbWVfZGVjb2RlZF9mbGFnKTsKKyAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZGVjb2RlX29wLnU0X3RzLCB3b3JrKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoMCA9PSBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJCeXRlcyBjb25zdW1lZCBpcyB6ZXJvLiBJZ25vcmluZyByZW1haW5pbmcgYnl0ZXMiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGluUG9zICs9IHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZDsKKyAgICAgICAgaWYgKGhhc1BpY3R1cmUgJiYgKGluU2l6ZSAtIGluUG9zKSkgeworICAgICAgICAgICAgQUxPR0QoImRlY29kZWQgZnJhbWUgaW4gY3VycmVudCBhY2Nlc3MgbmFsLCBpZ25vcmluZyBmdXJ0aGVyIHRyYWlsaW5nIGJ5dGVzICVkIiwKKyAgICAgICAgICAgICAgICAgIChpbnQpaW5TaXplIC0gKGludClpblBvcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghaGFzUGljdHVyZSkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KKworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpkcmFpbkludGVybmFsKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGlmIChPSyAhPSBzZXRGbHVzaE1vZGUoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoQzJfT0sgIT0gZW5zdXJlRGVjb2RlclN0YXRlKHBvb2wpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgJndWaWV3LCAwLCAwLCAwKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsoc19kZWNvZGVfb3AudTRfdHMsIHdvcmspOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChkcmFpbk1vZGUsIHBvb2wsIG51bGxwdHIpOworfQorCitjbGFzcyBDMlNvZnRBdmNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0QXZjRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0QXZjRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEF2Y0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRBdmNEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBdmNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRBdmNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBdmNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTI3YTkzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5oCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BVkNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BVkNfREVDX0hfCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiaWgyNjRfdHlwZWRlZnMuaCIKKyNpbmNsdWRlICJpdi5oIgorI2luY2x1ZGUgIml2ZC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgaXZkZWNfYXBpX2Z1bmN0aW9uICAgICAgICAgICAgICBpaDI2NGRfYXBpX2Z1bmN0aW9uCisjZGVmaW5lIGl2ZGV4dF9jcmVhdGVfaXBfdCAgICAgICAgICAgICAgaWgyNjRkX2NyZWF0ZV9pcF90CisjZGVmaW5lIGl2ZGV4dF9jcmVhdGVfb3BfdCAgICAgICAgICAgICAgaWgyNjRkX2NyZWF0ZV9vcF90CisjZGVmaW5lIGl2ZGV4dF9kZWxldGVfaXBfdCAgICAgICAgICAgICAgaWgyNjRkX2RlbGV0ZV9pcF90CisjZGVmaW5lIGl2ZGV4dF9kZWxldGVfb3BfdCAgICAgICAgICAgICAgaWgyNjRkX2RlbGV0ZV9vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90ICAgaWgyNjRkX2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QgICBpaDI2NGRfY3RsX3NldF9udW1fY29yZXNfb3BfdAorI2RlZmluZSBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3QgIGloMjY0ZF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdAorI2RlZmluZSBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3QgIGloMjY0ZF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdAorI2RlZmluZSBBTElHTjY0KHgpICAgICAgICAgICAgICAgICAgICAgICgoKCh4KSArIDYzKSA+PiA2KSA8PCA2KQorI2RlZmluZSBNQVhfTlVNX0NPUkVTICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUyAgICBcCisgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpSUgyNjREX0NNRF9DVExfU0VUX05VTV9DT1JFUworI2RlZmluZSBNSU4oYSwgYikgICAgICAgICAgICAgICAgICAgICAgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgR0VUVElNRShhLCBiKSAgICAgICAgICAgICAgICAgICBnZXR0aW1lb2ZkYXkoYSwgYik7CisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSAgICAgXAorICAgIGRpZmYgPSAoKChlbmQpLnR2X3NlYyAtIChzdGFydCkudHZfc2VjKSAqIDEwMDAwMDApICsgXAorICAgICAgICAgICAgKChlbmQpLnR2X3VzZWMgLSAoc3RhcnQpLnR2X3VzZWMpOworCisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorICAgICNkZWZpbmUgSU5QVVRfRFVNUF9QQVRIICAgICAiL3NkY2FyZC9jbGlwcy9hdmNkX2lucHV0IgorICAgICNkZWZpbmUgSU5QVVRfRFVNUF9FWFQgICAgICAiaDI2NCIKKyAgICAjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RyY3B5KG1JbkZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJWxkLiVsZC4lcyIsIElOUFVUX0RVTVBfUEFUSCwgIFwKKyAgICAgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCAgICAgIFwKKyAgICAgICAgICAgICAgICBJTlBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisgICAgI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpIHsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgIndiIik7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IG9wZW4gZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorICAgICNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUsIG1fb2Zmc2V0KVwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRklMRSAqZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAiYWIiKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGZwICE9IE5VTEwgJiYgbV9idWYgIT0gTlVMTCAmJiBtX29mZnNldCA9PSAwKSB7IFwKKyAgICAgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGkgPSBmd3JpdGUobV9idWYsIDEsIG1fc2l6ZSwgZnApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJmd3JpdGUgcmV0ICVkIHRvIHdyaXRlICVkIiwgaSwgbV9zaXplKTsgIFwKKyAgICAgICAgICAgIGlmIChpICE9IChpbnQpIG1fc2l6ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBTE9HRCgiRXJyb3IgaW4gZndyaXRlLCByZXR1cm5lZCAlZCIsIGkpOyAgIFwKKyAgICAgICAgICAgICAgICBwZXJyb3IoIkVycm9yIGluIHdyaXRlIHRvIGZpbGUiKTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIGlmIChmcCA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSAlcyIsIG1fZmlsZW5hbWUpO1wKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGZwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZSAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisgICAgI2RlZmluZSBJTlBVVF9EVU1QX1BBVEgKKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfRVhUCisgICAgI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRICisgICAgI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQKKyAgICAjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKQorICAgICNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKQorICAgICNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUsIG1fb2Zmc2V0KQorI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworCitjbGFzcyBDMlNvZnRBdmNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworcHVibGljOgorICAgIGNsYXNzIEludGZJbXBsOworICAgIEMyU29mdEF2Y0RlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRBdmNEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RhdHVzX3QgY3JlYXRlRGVjb2RlcigpOworICAgIHN0YXR1c190IHNldE51bUNvcmVzKCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1zKHNpemVfdCBzdHJpZGUsIElWRF9WSURFT19ERUNPREVfTU9ERV9UIGRlY19tb2RlKTsKKyAgICB2b2lkIGdldFZlcnNpb24oKTsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIGJvb2wgc2V0RGVjb2RlQXJncyhpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY29kZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNvZGVfb3AsCisgICAgICAgICAgICAgICAgICAgICAgIEMyUmVhZFZpZXcgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBDMkdyYXBoaWNWaWV3ICpvdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHNNYXJrZXIpOworICAgIGJvb2wgZ2V0VnVpUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3QgZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpOworICAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworICAgIHN0YXR1c190IHNldEZsdXNoTW9kZSgpOworICAgIGMyX3N0YXR1c190IGRyYWluSW50ZXJuYWwoCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworICAgIHN0YXR1c190IHJlc2V0RGVjb2RlcigpOworICAgIHZvaWQgcmVzZXRQbHVnaW4oKTsKKyAgICBzdGF0dXNfdCBkZWxldGVEZWNvZGVyKCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworCisgICAgLy8gVE9ETzpUaGlzIGlzIG5vdCB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMgZW51bS4gVGhlc2Ugc2hvdWxkCisgICAgLy8gYmUgcGFydCBvZiBjMi12bmRrIHNvIHRoYXQgdGhleSBjYW4gYmUgYWNjZXNzZWQgYnkgYWxsIHZpZGVvIHBsdWdpbnMKKyAgICAvLyB1bnRpbCB0aGVuLCBtYWtlIHRoZW0gZmVlbCBhdCBob21lCisgICAgZW51bSB7CisgICAgICAgIGtOb3RTdXBwb3J0ZWQsCisgICAgICAgIGtQcmVmZXJCaXRzdHJlYW0sCisgICAgICAgIGtQcmVmZXJDb250YWluZXIsCisgICAgfTsKKworICAgIGl2X29ial90ICptRGVjSGFuZGxlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gbU91dEJsb2NrOworICAgIHVpbnQ4X3QgKm1PdXRCdWZmZXJGbHVzaDsKKworICAgIHNpemVfdCBtTnVtQ29yZXM7CisgICAgSVZfQ09MT1JfRk9STUFUX1QgbUl2Q29sb3JGb3JtYXQ7CisKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICB1aW50MzJfdCBtU3RyaWRlOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1IZWFkZXJEZWNvZGVkOworICAgIC8vIENvbG9yIGFzcGVjdHMuIFRoZXNlIGFyZSBJU08gdmFsdWVzIGFuZCBhcmUgbWVhbnQgdG8gZGV0ZWN0IGNoYW5nZXMgaW4gYXNwZWN0cyB0byBhdm9pZAorICAgIC8vIGNvbnZlcnRpbmcgdGhlbSB0byBDMiB2YWx1ZXMgZm9yIGVhY2ggZnJhbWUKKyAgICBzdHJ1Y3QgVnVpQ29sb3JBc3BlY3RzIHsKKyAgICAgICAgdWludDhfdCBwcmltYXJpZXM7CisgICAgICAgIHVpbnQ4X3QgdHJhbnNmZXI7CisgICAgICAgIHVpbnQ4X3QgY29lZmZzOworICAgICAgICB1aW50OF90IGZ1bGxSYW5nZTsKKworICAgICAgICAvLyBkZWZhdWx0IGNvbG9yIGFzcGVjdHMKKyAgICAgICAgVnVpQ29sb3JBc3BlY3RzKCkKKyAgICAgICAgICAgIDogcHJpbWFyaWVzKDIpLCB0cmFuc2ZlcigyKSwgY29lZmZzKDIpLCBmdWxsUmFuZ2UoMCkgeyB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZ1aUNvbG9yQXNwZWN0cyAmbykgeworICAgICAgICAgICAgcmV0dXJuIHByaW1hcmllcyA9PSBvLnByaW1hcmllcyAmJiB0cmFuc2ZlciA9PSBvLnRyYW5zZmVyICYmIGNvZWZmcyA9PSBvLmNvZWZmcworICAgICAgICAgICAgICAgICAgICAmJiBmdWxsUmFuZ2UgPT0gby5mdWxsUmFuZ2U7CisgICAgICAgIH0KKyAgICB9IG1CaXRzdHJlYW1Db2xvckFzcGVjdHM7CisKKyAgICAvLyBwcm9maWxlCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisgICAgY2hhciBtSW5GaWxlWzIwMF07CisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QXZjRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FWQ19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg1MTkwOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuY3BwCkBAIC0wLDAgKzEsMTU2MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBdmNFbmMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJCdWZmZXJVdGlscy5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QXZjRW5jLmgiCisjaW5jbHVkZSAiaWgyNjRlLmgiCisjaW5jbHVkZSAiaWgyNjRlX2Vycm9yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0QXZjRW5jOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworCisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpHUkFQSElDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Vc2FnZSwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX1VTQUdFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgKHVpbnQ2NF90KUMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMjU2MCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDI1NjAsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1GcmFtZVJhdGUsIEMyX1BBUkFNS0VZX0ZSQU1FX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dCgwdSwgMzAuKSkKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBNb3JlIHJlc3RyaWN0aW9uPworICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUZyYW1lUmF0ZSwgdmFsdWUpLmdyZWF0ZXJUaGFuKDAuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRnJhbWVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNDA5NiwgMTIwMDAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihCaXRyYXRlU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUludHJhUmVmcmVzaCwgQzJfUEFSQU1LRVlfSU5UUkFfUkVGUkVTSCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb25maWc6OklOVFJBX1JFRlJFU0hfRElTQUJMRUQsIDAuKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtSW50cmFSZWZyZXNoLCBtb2RlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6SU5UUkFfUkVGUkVTSF9ESVNBQkxFRCwgQzJDb25maWc6OklOVFJBX1JFRlJFU0hfQVJCSVRSQVJZIH0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobUludHJhUmVmcmVzaCwgcGVyaW9kKS5hbnkoKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoSW50cmFSZWZyZXNoU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLCBMRVZFTF9BVkNfNF8xKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICBQUk9GSUxFX0FWQ19CQVNFTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgUFJPRklMRV9BVkNfTUFJTiwKKyAgICAgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzEsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMUIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMV8xLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzFfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18xXzMsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18yXzEsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMl8yLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzMsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfM18xLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzNfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ180LAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzRfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ180XzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfNSwKKyAgICAgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplLCBtRnJhbWVSYXRlLCBtQml0cmF0ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1SZXF1ZXN0U3luYywgQzJfUEFSQU1LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQoMHUsIEMyX0ZBTFNFKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1SZXF1ZXN0U3luYywgdmFsdWUpLm9uZU9mKHsgQzJfRkFMU0UsIEMyX1RSVUUgfSkgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1SZXF1ZXN0U3luYyk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU3luY0ZyYW1lUGVyaW9kLCBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0KDB1LCAxMDAwMDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TeW5jRnJhbWVQZXJpb2QsIHZhbHVlKS5hbnkoKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptU3luY0ZyYW1lUGVyaW9kKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBCaXRyYXRlU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKG1lLnYudmFsdWUgPD0gNDA5NikgeworICAgICAgICAgICAgbWUuc2V0KCkudmFsdWUgPSA0MDk2OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJnNpemUsCisgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+ICZmcmFtZVJhdGUsCisgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiAmYml0cmF0ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYucHJvZmlsZSkuc3VwcG9ydHNBdEFsbChtZS52LnByb2ZpbGUpKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5wcm9maWxlID0gUFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkU7CisgICAgICAgIH0KKworICAgICAgICBzdHJ1Y3QgTGV2ZWxMaW1pdHMgeworICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgbGV2ZWw7CisgICAgICAgICAgICBmbG9hdCBtYnNQZXJTZWM7CisgICAgICAgICAgICB1aW50NjRfdCBtYnM7CisgICAgICAgICAgICB1aW50MzJfdCBiaXRyYXRlOworICAgICAgICB9OworICAgICAgICBjb25zdGV4cHIgTGV2ZWxMaW1pdHMga0xpbWl0c1tdID0geworICAgICAgICAgICAgeyBMRVZFTF9BVkNfMSwgICAgIDE0ODUsICAgIDk5LCAgICAgNjQwMDAgfSwKKyAgICAgICAgICAgIC8vIERlY29kZXIgZG9lcyBub3QgcHJvcGVybHkgaGFuZGxlIGxldmVsIDFiLgorICAgICAgICAgICAgLy8geyBMRVZFTF9BVkNfMUIsICAgIDE0ODUsICAgOTksICAgMTI4MDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzEsICAgMzAwMCwgICAzOTYsICAgIDE5MjAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMV8yLCAgIDYwMDAsICAgMzk2LCAgICAzODQwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzFfMywgIDExODgwLCAgIDM5NiwgICAgNzY4MDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yLCAgICAxMTg4MCwgICAzOTYsICAgMjAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMl8xLCAgMTk4MDAsICAgNzkyLCAgIDQwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzJfMiwgIDIwMjUwLCAgMTYyMCwgICA0MDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zLCAgICA0MDUwMCwgIDE2MjAsICAxMDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfM18xLCAxMDgwMDAsICAzNjAwLCAgMTQwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzNfMiwgMjE2MDAwLCAgNTEyMCwgIDIwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180LCAgIDI0NTc2MCwgIDgxOTIsICAyMDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNF8xLCAyNDU3NjAsICA4MTkyLCAgNTAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzRfMiwgNTIyMjQwLCAgODcwNCwgIDUwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ181LCAgIDU4OTgyNCwgMjIwODAsIDEzNTAwMDAwMCB9LAorICAgICAgICB9OworCisgICAgICAgIHVpbnQ2NF90IG1icyA9IHVpbnQ2NF90KChzaXplLnYud2lkdGggKyAxNSkgLyAxNikgKiAoKHNpemUudi5oZWlnaHQgKyAxNSkgLyAxNik7CisgICAgICAgIGZsb2F0IG1ic1BlclNlYyA9IGZsb2F0KG1icykgKiBmcmFtZVJhdGUudi52YWx1ZTsKKworICAgICAgICAvLyBDaGVjayBpZiB0aGUgc3VwcGxpZWQgbGV2ZWwgbWVldHMgdGhlIE1CIC8gYml0cmF0ZSByZXF1aXJlbWVudHMuIElmCisgICAgICAgIC8vIG5vdCwgdXBkYXRlIHRoZSBsZXZlbCB3aXRoIHRoZSBsb3dlc3QgbGV2ZWwgbWVldGluZyB0aGUgcmVxdWlyZW1lbnRzLgorCisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgLy8gQnkgZGVmYXVsdCBuZWVkc1VwZGF0ZSA9IGZhbHNlIGluIGNhc2UgdGhlIHN1cHBsaWVkIGxldmVsIGRvZXMgbWVldAorICAgICAgICAvLyB0aGUgcmVxdWlyZW1lbnRzLiBGb3IgTGV2ZWwgMWIsIHdlIHdhbnQgdG8gdXBkYXRlIHRoZSBsZXZlbCBhbnl3YXksCisgICAgICAgIC8vIHNvIHdlIHNldCBpdCB0byB0cnVlIGluIHRoYXQgY2FzZS4KKyAgICAgICAgYm9vbCBuZWVkc1VwZGF0ZSA9IChtZS52LmxldmVsID09IExFVkVMX0FWQ18xQik7CisgICAgICAgIGZvciAoY29uc3QgTGV2ZWxMaW1pdHMgJmxpbWl0IDoga0xpbWl0cykgeworICAgICAgICAgICAgaWYgKG1icyA8PSBsaW1pdC5tYnMgJiYgbWJzUGVyU2VjIDw9IGxpbWl0Lm1ic1BlclNlYyAmJgorICAgICAgICAgICAgICAgICAgICBiaXRyYXRlLnYudmFsdWUgPD0gbGltaXQuYml0cmF0ZSkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGxvd2VzdCBsZXZlbCB0aGF0IG1lZXRzIHRoZSByZXF1aXJlbWVudHMsIGFuZCBpZgorICAgICAgICAgICAgICAgIC8vIHdlIGhhdmVuJ3Qgc2VlbiB0aGUgc3VwcGxpZWQgbGV2ZWwgeWV0LCB0aGF0IG1lYW5zIHdlIGRvbid0CisgICAgICAgICAgICAgICAgLy8gbmVlZCB0aGUgdXBkYXRlLgorICAgICAgICAgICAgICAgIGlmIChuZWVkc1VwZGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiR2l2ZW4gbGV2ZWwgJXggZG9lcyBub3QgY292ZXIgY3VycmVudCBjb25maWd1cmF0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGp1c3RpbmcgdG8gJXgiLCBtZS52LmxldmVsLCBsaW1pdC5sZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gbGltaXQubGV2ZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtZS52LmxldmVsID09IGxpbWl0LmxldmVsKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYnJlYWsgb3V0IG9mIHRoZSBsb29wIHdoZW4gdGhlIGxvd2VzdCBmZWFzaWJsZSBsZXZlbCBpcworICAgICAgICAgICAgICAgIC8vIGZvdW5kLiBUaGUgZmFjdCB0aGF0IHdlJ3JlIGhlcmUgbWVhbnMgdGhhdCBvdXIgbGV2ZWwgZG9lc24ndAorICAgICAgICAgICAgICAgIC8vIG1lZXQgdGhlIHJlcXVpcmVtZW50IGFuZCBuZWVkcyB0byBiZSB1cGRhdGVkLgorICAgICAgICAgICAgICAgIG5lZWRzVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAvLyBXZSBzZXQgdG8gdGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIGxldmVsLgorICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBMRVZFTF9BVkNfNTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBJbnRyYVJlZnJlc2hTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKG1lLnYucGVyaW9kIDwgMSkgeworICAgICAgICAgICAgbWUuc2V0KCkubW9kZSA9IEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVEOworICAgICAgICAgICAgbWUuc2V0KCkucGVyaW9kID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG9ubHkgc3VwcG9ydCBhcmJpdHJhcnkgbW9kZSAoY3ljbGljIGluIG91ciBjYXNlKQorICAgICAgICAgICAgbWUuc2V0KCkubW9kZSA9IEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0FSQklUUkFSWTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIElWX1BST0ZJTEVfVCBnZXRQcm9maWxlX2woKSBjb25zdCB7CisgICAgICAgIHN3aXRjaCAobVByb2ZpbGVMZXZlbC0+cHJvZmlsZSkgeworICAgICAgICBjYXNlIFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FOiAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIFBST0ZJTEVfQVZDX0JBU0VMSU5FOiByZXR1cm4gSVZfUFJPRklMRV9CQVNFOworICAgICAgICBjYXNlIFBST0ZJTEVfQVZDX01BSU46ICAgICByZXR1cm4gSVZfUFJPRklMRV9NQUlOOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCBwcm9maWxlOiAleCIsIG1Qcm9maWxlTGV2ZWwtPnByb2ZpbGUpOworICAgICAgICAgICAgcmV0dXJuIElWX1BST0ZJTEVfREVGQVVMVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFVXT1JEMzIgZ2V0TGV2ZWxfbCgpIGNvbnN0IHsKKyAgICAgICAgc3RydWN0IExldmVsIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGMyTGV2ZWw7CisgICAgICAgICAgICBVV09SRDMyIGF2Y0xldmVsOworICAgICAgICB9OworICAgICAgICBjb25zdGV4cHIgTGV2ZWwgbGV2ZWxzW10gPSB7CisgICAgICAgICAgICB7IExFVkVMX0FWQ18xLCAgIDEwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xQiwgICA5IH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzEsIDExIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzIsIDEyIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzMsIDEzIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yLCAgIDIwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yXzEsIDIxIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yXzIsIDIyIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zLCAgIDMwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zXzEsIDMxIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zXzIsIDMyIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180LCAgIDQwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180XzEsIDQxIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180XzIsIDQyIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ181LCAgIDUwIH0sCisgICAgICAgIH07CisgICAgICAgIGZvciAoY29uc3QgTGV2ZWwgJmxldmVsIDogbGV2ZWxzKSB7CisgICAgICAgICAgICBpZiAobVByb2ZpbGVMZXZlbC0+bGV2ZWwgPT0gbGV2ZWwuYzJMZXZlbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBsZXZlbC5hdmNMZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HRCgiVW5yZWNvZ25pemVkIGxldmVsOiAleCIsIG1Qcm9maWxlTGV2ZWwtPmxldmVsKTsKKyAgICAgICAgcmV0dXJuIDQxOworICAgIH0KKyAgICB1aW50MzJfdCBnZXRTeW5jRnJhbWVQZXJpb2RfbCgpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIDwgMCB8fCBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA9PSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGRvdWJsZSBwZXJpb2QgPSBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSAvIDFlNiAqIG1GcmFtZVJhdGUtPnZhbHVlOworICAgICAgICByZXR1cm4gKHVpbnQzMl90KWMyX21heChjMl9taW4ocGVyaW9kICsgMC41LCBkb3VibGUoVUlOVDMyX01BWCkpLCAxLik7CisgICAgfQorCisgICAgLy8gdW5zYWZlIGdldHRlcnMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBnZXRTaXplX2woKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBnZXRJbnRyYVJlZnJlc2hfbCgpIGNvbnN0IHsgcmV0dXJuIG1JbnRyYVJlZnJlc2g7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IGdldEZyYW1lUmF0ZV9sKCkgY29uc3QgeyByZXR1cm4gbUZyYW1lUmF0ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGdldEJpdHJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBnZXRSZXF1ZXN0U3luY19sKCkgY29uc3QgeyByZXR1cm4gbVJlcXVlc3RTeW5jOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dD4gbVVzYWdlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IG1SZXF1ZXN0U3luYzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gbUludHJhUmVmcmVzaDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dD4gbVN5bmNGcmFtZVBlcmlvZDsKK307CisKKyNkZWZpbmUgaXZlX2FwaV9mdW5jdGlvbiAgaWgyNjRlX2FwaV9mdW5jdGlvbgorCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYXZjLmVuY29kZXIiOworCituYW1lc3BhY2UgeworCisvLyBGcm9tIGV4dGVybmFsL2xpYmF2Yy9lbmNvZGVyL2loMjY0ZV9iaXRzdHJlYW0uaAorY29uc3RleHByIHVpbnQzMl90IE1JTl9TVFJFQU1fU0laRSA9IDB4ODAwOworCitzdGF0aWMgc2l6ZV90IEdldENQVUNvcmVDb3VudCgpIHsKKyAgICBsb25nIGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVsZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQzJTb2Z0QXZjRW5jOjpDMlNvZnRBdmNFbmMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUl2VmlkZW9Db2xvckZvcm1hdChJVl9ZVVZfNDIwUCksCisgICAgICBtQVZDRW5jUHJvZmlsZShJVl9QUk9GSUxFX0JBU0UpLAorICAgICAgbUFWQ0VuY0xldmVsKDQxKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1TYXdJbnB1dEVPUyhmYWxzZSksCisgICAgICBtU2F3T3V0cHV0RU9TKGZhbHNlKSwKKyAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCisgICAgICBtQ29kZWNDdHgobnVsbHB0ciksCisgICAgICAvLyBUT0RPOiBvdXRwdXQgYnVmZmVyIHNpemUKKyAgICAgIG1PdXRCdWZmZXJTaXplKDUyNDI4OCkgeworCisgICAgLy8gSWYgZHVtcCBpcyBlbmFibGVkLCB0aGVuIG9wZW4gY3JlYXRlIGFuIGVtcHR5IGZpbGUKKyAgICBHRU5FUkFURV9GSUxFX05BTUVTKCk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtSW5GaWxlKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1PdXRGaWxlKTsKKworICAgIGluaXRFbmNQYXJhbXMoKTsKK30KKworQzJTb2Z0QXZjRW5jOjp+QzJTb2Z0QXZjRW5jKCkgeworICAgIHJlbGVhc2VFbmNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6b25Jbml0KCkgeworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpvblN0b3AoKSB7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEF2Y0VuYzo6b25SZXNldCgpIHsKKyAgICAvLyBUT0RPOiB1c2UgSVZFX0NNRF9DVExfUkVTRVQ/CisgICAgcmVsZWFzZUVuY29kZXIoKTsKKyAgICBpbml0RW5jUGFyYW1zKCk7Cit9CisKK3ZvaWQgQzJTb2Z0QXZjRW5jOjpvblJlbGVhc2UoKSB7CisgICAgcmVsZWFzZUVuY29kZXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpvbkZsdXNoX3NtKCkgeworICAgIC8vIFRPRE86IHVzZSBJVkVfQ01EX0NUTF9GTFVTSD8KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgIEMyU29mdEF2Y0VuYzo6aW5pdEVuY1BhcmFtcygpIHsKKyAgICBtQ29kZWNDdHggPSBudWxscHRyOworICAgIG1NZW1SZWNvcmRzID0gbnVsbHB0cjsKKyAgICBtTnVtTWVtUmVjb3JkcyA9IERFRkFVTFRfTUVNX1JFQ19DTlQ7CisgICAgbUhlYWRlckdlbmVyYXRlZCA9IDA7CisgICAgbU51bUNvcmVzID0gR2V0Q1BVQ29yZUNvdW50KCk7CisgICAgbUFyY2ggPSBERUZBVUxUX0FSQ0g7CisgICAgbVNsaWNlTW9kZSA9IERFRkFVTFRfU0xJQ0VfTU9ERTsKKyAgICBtU2xpY2VQYXJhbSA9IERFRkFVTFRfU0xJQ0VfUEFSQU07CisgICAgbUhhbGZQZWxFbmFibGUgPSBERUZBVUxUX0hQRUw7CisgICAgbUlJbnRlcnZhbCA9IERFRkFVTFRfSV9JTlRFUlZBTDsKKyAgICBtSURSSW50ZXJ2YWwgPSBERUZBVUxUX0lEUl9JTlRFUlZBTDsKKyAgICBtRGlzYWJsZURlYmxrTGV2ZWwgPSBERUZBVUxUX0RJU0FCTEVfREVCTEtfTEVWRUw7CisgICAgbUVuYWJsZUZhc3RTYWQgPSBERUZBVUxUX0VOQUJMRV9GQVNUX1NBRDsKKyAgICBtRW5hYmxlQWx0UmVmID0gREVGQVVMVF9FTkFCTEVfQUxUX1JFRjsKKyAgICBtRW5jU3BlZWQgPSBERUZBVUxUX0VOQ19TUEVFRDsKKyAgICBtSW50cmE0eDQgPSBERUZBVUxUX0lOVFJBNHg0OworICAgIG1Db25zdHJhaW5lZEludHJhRmxhZyA9IERFRkFVTFRfQ09OU1RSQUlORURfSU5UUkE7CisgICAgbVBTTlJFbmFibGUgPSBERUZBVUxUX1BTTlJfRU5BQkxFOworICAgIG1SZWNvbkVuYWJsZSA9IERFRkFVTFRfUkVDT05fRU5BQkxFOworICAgIG1FbnRyb3B5TW9kZSA9IERFRkFVTFRfRU5UUk9QWV9NT0RFOworICAgIG1CZnJhbWVzID0gREVGQVVMVF9CX0ZSQU1FUzsKKworICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0RGltZW5zaW9ucygpIHsKKyAgICBpdmVfY3RsX3NldF9kaW1lbnNpb25zX2lwX3Qgc19kaW1lbnNpb25zX2lwOworICAgIGl2ZV9jdGxfc2V0X2RpbWVuc2lvbnNfb3BfdCBzX2RpbWVuc2lvbnNfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19kaW1lbnNpb25zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19kaW1lbnNpb25zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9ESU1FTlNJT05TOworICAgIHNfZGltZW5zaW9uc19pcC51NF9odCA9IG1TaXplLT5oZWlnaHQ7CisgICAgc19kaW1lbnNpb25zX2lwLnU0X3dkID0gbVNpemUtPndpZHRoOworCisgICAgc19kaW1lbnNpb25zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19kaW1lbnNpb25zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZGltZW5zaW9uc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2RpbWVuc2lvbnNfaXBfdCk7CisgICAgc19kaW1lbnNpb25zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZGltZW5zaW9uc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19kaW1lbnNpb25zX2lwLCAmc19kaW1lbnNpb25zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgZnJhbWUgZGltZW5zaW9ucyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19kaW1lbnNpb25zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0TnVtQ29yZXMoKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIGl2ZV9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfbnVtX2NvcmVzX2lwOworICAgIGl2ZV9jdGxfc2V0X251bV9jb3Jlc19vcF90IHNfbnVtX2NvcmVzX29wOworICAgIHNfbnVtX2NvcmVzX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19udW1fY29yZXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX05VTV9DT1JFUzsKKyAgICBzX251bV9jb3Jlc19pcC51NF9udW1fY29yZXMgPSBNSU4obU51bUNvcmVzLCBDT0RFQ19NQVhfQ09SRVMpOworICAgIHNfbnVtX2NvcmVzX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19udW1fY29yZXNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworICAgIHNfbnVtX2NvcmVzX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QpOworCisgICAgc19udW1fY29yZXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9udW1fY29yZXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKAorICAgICAgICAgICAgbUNvZGVjQ3R4LCAodm9pZCAqKSAmc19udW1fY29yZXNfaXAsICh2b2lkICopICZzX251bV9jb3Jlc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IHByb2Nlc3NvciBwYXJhbXMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfbnVtX2NvcmVzX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0RnJhbWVSYXRlKCkgeworICAgIGl2ZV9jdGxfc2V0X2ZyYW1lX3JhdGVfaXBfdCBzX2ZyYW1lX3JhdGVfaXA7CisgICAgaXZlX2N0bF9zZXRfZnJhbWVfcmF0ZV9vcF90IHNfZnJhbWVfcmF0ZV9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2ZyYW1lX3JhdGVfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2ZyYW1lX3JhdGVfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0ZSQU1FUkFURTsKKworICAgIHNfZnJhbWVfcmF0ZV9pcC51NF9zcmNfZnJhbWVfcmF0ZSA9IG1GcmFtZVJhdGUtPnZhbHVlICsgMC41OworICAgIHNfZnJhbWVfcmF0ZV9pcC51NF90Z3RfZnJhbWVfcmF0ZSA9IG1GcmFtZVJhdGUtPnZhbHVlICsgMC41OworCisgICAgc19mcmFtZV9yYXRlX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19mcmFtZV9yYXRlX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZnJhbWVfcmF0ZV9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2ZyYW1lX3JhdGVfaXBfdCk7CisgICAgc19mcmFtZV9yYXRlX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZnJhbWVfcmF0ZV9vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19mcmFtZV9yYXRlX2lwLCAmc19mcmFtZV9yYXRlX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgZnJhbWUgcmF0ZSA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19mcmFtZV9yYXRlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0SXBlUGFyYW1zKCkgeworICAgIGl2ZV9jdGxfc2V0X2lwZV9wYXJhbXNfaXBfdCBzX2lwZV9wYXJhbXNfaXA7CisgICAgaXZlX2N0bF9zZXRfaXBlX3BhcmFtc19vcF90IHNfaXBlX3BhcmFtc19vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2lwZV9wYXJhbXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2lwZV9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0lQRV9QQVJBTVM7CisKKyAgICBzX2lwZV9wYXJhbXNfaXAudTRfZW5hYmxlX2ludHJhXzR4NCA9IG1JbnRyYTR4NDsKKyAgICBzX2lwZV9wYXJhbXNfaXAudTRfZW5jX3NwZWVkX3ByZXNldCA9IG1FbmNTcGVlZDsKKyAgICBzX2lwZV9wYXJhbXNfaXAudTRfY29uc3RyYWluZWRfaW50cmFfcHJlZCA9IG1Db25zdHJhaW5lZEludHJhRmxhZzsKKworICAgIHNfaXBlX3BhcmFtc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfaXBlX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2lwZV9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9pcGVfcGFyYW1zX2lwX3QpOworICAgIHNfaXBlX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2lwZV9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfaXBlX3BhcmFtc19pcCwgJnNfaXBlX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGlwZSBwYXJhbXMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfaXBlX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEJpdFJhdGUoKSB7CisgICAgaXZlX2N0bF9zZXRfYml0cmF0ZV9pcF90IHNfYml0cmF0ZV9pcDsKKyAgICBpdmVfY3RsX3NldF9iaXRyYXRlX29wX3Qgc19iaXRyYXRlX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfYml0cmF0ZV9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfYml0cmF0ZV9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfQklUUkFURTsKKworICAgIHNfYml0cmF0ZV9pcC51NF90YXJnZXRfYml0cmF0ZSA9IG1CaXRyYXRlLT52YWx1ZTsKKworICAgIHNfYml0cmF0ZV9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfYml0cmF0ZV9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2JpdHJhdGVfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9iaXRyYXRlX2lwX3QpOworICAgIHNfYml0cmF0ZV9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2JpdHJhdGVfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfYml0cmF0ZV9pcCwgJnNfYml0cmF0ZV9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGJpdCByYXRlID0gMHgleFxuIiwgc19iaXRyYXRlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0RnJhbWVUeXBlKElWX1BJQ1RVUkVfQ09ESU5HX1RZUEVfVCBlX2ZyYW1lX3R5cGUpIHsKKyAgICBpdmVfY3RsX3NldF9mcmFtZV90eXBlX2lwX3Qgc19mcmFtZV90eXBlX2lwOworICAgIGl2ZV9jdGxfc2V0X2ZyYW1lX3R5cGVfb3BfdCBzX2ZyYW1lX3R5cGVfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIHNfZnJhbWVfdHlwZV9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZnJhbWVfdHlwZV9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfRlJBTUVUWVBFOworCisgICAgc19mcmFtZV90eXBlX2lwLmVfZnJhbWVfdHlwZSA9IGVfZnJhbWVfdHlwZTsKKworICAgIHNfZnJhbWVfdHlwZV9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfZnJhbWVfdHlwZV9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2ZyYW1lX3R5cGVfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9mcmFtZV90eXBlX2lwX3QpOworICAgIHNfZnJhbWVfdHlwZV9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2ZyYW1lX3R5cGVfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZnJhbWVfdHlwZV9pcCwgJnNfZnJhbWVfdHlwZV9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGZyYW1lIHR5cGUgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZnJhbWVfdHlwZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldFFwKCkgeworICAgIGl2ZV9jdGxfc2V0X3FwX2lwX3Qgc19xcF9pcDsKKyAgICBpdmVfY3RsX3NldF9xcF9vcF90IHNfcXBfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19xcF9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfcXBfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX1FQOworCisgICAgc19xcF9pcC51NF9pX3FwID0gREVGQVVMVF9JX1FQOworICAgIHNfcXBfaXAudTRfaV9xcF9tYXggPSBERUZBVUxUX1FQX01BWDsKKyAgICBzX3FwX2lwLnU0X2lfcXBfbWluID0gREVGQVVMVF9RUF9NSU47CisKKyAgICBzX3FwX2lwLnU0X3BfcXAgPSBERUZBVUxUX1BfUVA7CisgICAgc19xcF9pcC51NF9wX3FwX21heCA9IERFRkFVTFRfUVBfTUFYOworICAgIHNfcXBfaXAudTRfcF9xcF9taW4gPSBERUZBVUxUX1FQX01JTjsKKworICAgIHNfcXBfaXAudTRfYl9xcCA9IERFRkFVTFRfUF9RUDsKKyAgICBzX3FwX2lwLnU0X2JfcXBfbWF4ID0gREVGQVVMVF9RUF9NQVg7CisgICAgc19xcF9pcC51NF9iX3FwX21pbiA9IERFRkFVTFRfUVBfTUlOOworCisgICAgc19xcF9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfcXBfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19xcF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3FwX2lwX3QpOworICAgIHNfcXBfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9xcF9vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19xcF9pcCwgJnNfcXBfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBxcCAweCV4XG4iLCBzX3FwX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0RW5jTW9kZShJVkVfRU5DX01PREVfVCBlX2VuY19tb2RlKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIGl2ZV9jdGxfc2V0X2VuY19tb2RlX2lwX3Qgc19lbmNfbW9kZV9pcDsKKyAgICBpdmVfY3RsX3NldF9lbmNfbW9kZV9vcF90IHNfZW5jX21vZGVfb3A7CisKKyAgICBzX2VuY19tb2RlX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19lbmNfbW9kZV9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfRU5DX01PREU7CisKKyAgICBzX2VuY19tb2RlX2lwLmVfZW5jX21vZGUgPSBlX2VuY19tb2RlOworCisgICAgc19lbmNfbW9kZV9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfZW5jX21vZGVfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19lbmNfbW9kZV9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2VuY19tb2RlX2lwX3QpOworICAgIHNfZW5jX21vZGVfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9lbmNfbW9kZV9vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19lbmNfbW9kZV9pcCwgJnNfZW5jX21vZGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBpbiBoZWFkZXIgZW5jb2RlIG1vZGUgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZW5jX21vZGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRWYnZQYXJhbXMoKSB7CisgICAgaXZlX2N0bF9zZXRfdmJ2X3BhcmFtc19pcF90IHNfdmJ2X2lwOworICAgIGl2ZV9jdGxfc2V0X3Zidl9wYXJhbXNfb3BfdCBzX3Zidl9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX3Zidl9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfdmJ2X2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9WQlZfUEFSQU1TOworCisgICAgc192YnZfaXAudTRfdmJ2X2J1Zl9zaXplID0gMDsKKyAgICBzX3Zidl9pcC51NF92YnZfYnVmZmVyX2RlbGF5ID0gMTAwMDsKKworICAgIHNfdmJ2X2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc192YnZfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc192YnZfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF92YnZfcGFyYW1zX2lwX3QpOworICAgIHNfdmJ2X29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfdmJ2X3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc192YnZfaXAsICZzX3Zidl9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IFZCViBwYXJhbXMgPSAweCV4XG4iLCBzX3Zidl9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEFpclBhcmFtcygpIHsKKyAgICBpdmVfY3RsX3NldF9haXJfcGFyYW1zX2lwX3Qgc19haXJfaXA7CisgICAgaXZlX2N0bF9zZXRfYWlyX3BhcmFtc19vcF90IHNfYWlyX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfYWlyX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19haXJfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0FJUl9QQVJBTVM7CisKKyAgICBzX2Fpcl9pcC5lX2Fpcl9tb2RlID0KKyAgICAgICAgKG1JbnRyYVJlZnJlc2gtPm1vZGUgPT0gQzJDb25maWc6OklOVFJBX1JFRlJFU0hfRElTQUJMRUQgfHwgbUludHJhUmVmcmVzaC0+cGVyaW9kIDwgMSkKKyAgICAgICAgICAgID8gSVZFX0FJUl9NT0RFX05PTkUgOiBJVkVfQUlSX01PREVfQ1lDTElDOworICAgIHNfYWlyX2lwLnU0X2Fpcl9yZWZyZXNoX3BlcmlvZCA9IG1JbnRyYVJlZnJlc2gtPnBlcmlvZDsKKworICAgIHNfYWlyX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19haXJfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19haXJfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9haXJfcGFyYW1zX2lwX3QpOworICAgIHNfYWlyX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfYWlyX3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19haXJfaXAsICZzX2Fpcl9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGFpciBwYXJhbXMgPSAweCV4XG4iLCBzX2Fpcl9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldE1lUGFyYW1zKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9tZV9wYXJhbXNfaXBfdCBzX21lX3BhcmFtc19pcDsKKyAgICBpdmVfY3RsX3NldF9tZV9wYXJhbXNfb3BfdCBzX21lX3BhcmFtc19vcDsKKworICAgIHNfbWVfcGFyYW1zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19tZV9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX01FX1BBUkFNUzsKKworICAgIHNfbWVfcGFyYW1zX2lwLnU0X2VuYWJsZV9mYXN0X3NhZCA9IG1FbmFibGVGYXN0U2FkOworICAgIHNfbWVfcGFyYW1zX2lwLnU0X2VuYWJsZV9hbHRfcmVmID0gbUVuYWJsZUFsdFJlZjsKKworICAgIHNfbWVfcGFyYW1zX2lwLnU0X2VuYWJsZV9ocGVsID0gbUhhbGZQZWxFbmFibGU7CisgICAgc19tZV9wYXJhbXNfaXAudTRfZW5hYmxlX3FwZWwgPSBERUZBVUxUX1FQRUw7CisgICAgc19tZV9wYXJhbXNfaXAudTRfbWVfc3BlZWRfcHJlc2V0ID0gREVGQVVMVF9NRV9TUEVFRDsKKyAgICBzX21lX3BhcmFtc19pcC51NF9zcmNoX3JuZ194ID0gREVGQVVMVF9TUkNIX1JOR19YOworICAgIHNfbWVfcGFyYW1zX2lwLnU0X3NyY2hfcm5nX3kgPSBERUZBVUxUX1NSQ0hfUk5HX1k7CisKKyAgICBzX21lX3BhcmFtc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfbWVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfbWVfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfbWVfcGFyYW1zX2lwX3QpOworICAgIHNfbWVfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfbWVfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX21lX3BhcmFtc19pcCwgJnNfbWVfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgbWUgcGFyYW1zID0gMHgleFxuIiwgc19tZV9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRHb3BQYXJhbXMoKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIGl2ZV9jdGxfc2V0X2dvcF9wYXJhbXNfaXBfdCBzX2dvcF9wYXJhbXNfaXA7CisgICAgaXZlX2N0bF9zZXRfZ29wX3BhcmFtc19vcF90IHNfZ29wX3BhcmFtc19vcDsKKworICAgIHNfZ29wX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZ29wX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfR09QX1BBUkFNUzsKKworICAgIHNfZ29wX3BhcmFtc19pcC51NF9pX2ZybV9pbnRlcnZhbCA9IG1JSW50ZXJ2YWw7CisgICAgc19nb3BfcGFyYW1zX2lwLnU0X2lkcl9mcm1faW50ZXJ2YWwgPSBtSURSSW50ZXJ2YWw7CisKKyAgICBzX2dvcF9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2dvcF9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19nb3BfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZ29wX3BhcmFtc19pcF90KTsKKyAgICBzX2dvcF9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9nb3BfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2dvcF9wYXJhbXNfaXAsICZzX2dvcF9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBHT1AgcGFyYW1zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2dvcF9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRQcm9maWxlUGFyYW1zKCkgeworICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworCisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIGl2ZV9jdGxfc2V0X3Byb2ZpbGVfcGFyYW1zX2lwX3Qgc19wcm9maWxlX3BhcmFtc19pcDsKKyAgICBpdmVfY3RsX3NldF9wcm9maWxlX3BhcmFtc19vcF90IHNfcHJvZmlsZV9wYXJhbXNfb3A7CisKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19wcm9maWxlX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfUFJPRklMRV9QQVJBTVM7CisKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLmVfcHJvZmlsZSA9IG1JbnRmLT5nZXRQcm9maWxlX2woKTsKKyAgICBpZiAoc19wcm9maWxlX3BhcmFtc19pcC5lX3Byb2ZpbGUgPT0gSVZfUFJPRklMRV9CQVNFKSB7CisgICAgICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAudTRfZW50cm9weV9jb2RpbmdfbW9kZSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc19wcm9maWxlX3BhcmFtc19pcC51NF9lbnRyb3B5X2NvZGluZ19tb2RlID0gMTsKKyAgICB9CisgICAgc19wcm9maWxlX3BhcmFtc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19wcm9maWxlX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3Byb2ZpbGVfcGFyYW1zX2lwX3QpOworICAgIHNfcHJvZmlsZV9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9wcm9maWxlX3BhcmFtc19vcF90KTsKKyAgICBsb2NrLnVubG9jaygpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX3Byb2ZpbGVfcGFyYW1zX2lwLCAmc19wcm9maWxlX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IHByb2ZpbGUgcGFyYW1zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX3Byb2ZpbGVfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0RGVibG9ja1BhcmFtcygpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfZGVibG9ja19wYXJhbXNfaXBfdCBzX2RlYmxvY2tfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X2RlYmxvY2tfcGFyYW1zX29wX3Qgc19kZWJsb2NrX3BhcmFtc19vcDsKKworICAgIHNfZGVibG9ja19wYXJhbXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9ERUJMT0NLX1BBUkFNUzsKKworICAgIHNfZGVibG9ja19wYXJhbXNfaXAudTRfZGlzYWJsZV9kZWJsb2NrX2xldmVsID0gbURpc2FibGVEZWJsa0xldmVsOworCisgICAgc19kZWJsb2NrX3BhcmFtc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfZGVibG9ja19wYXJhbXNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19kZWJsb2NrX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2RlYmxvY2tfcGFyYW1zX2lwX3QpOworICAgIHNfZGVibG9ja19wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9kZWJsb2NrX3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19kZWJsb2NrX3BhcmFtc19pcCwgJnNfZGVibG9ja19wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGVuYWJsZS9kaXNhYmxlIGRlYmxvY2sgcGFyYW1zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2RlYmxvY2tfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QXZjRW5jOjpsb2dWZXJzaW9uKCkgeworICAgIGl2ZV9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCBzX2N0bF9pcDsKKyAgICBpdmVfY3RsX2dldHZlcnNpb25pbmZvX29wX3Qgc19jdGxfb3A7CisgICAgVVdPUkQ4IGF1MV9idWZbNTEyXTsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2N0bF9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfY3RsX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX0dFVFZFUlNJT047CisgICAgc19jdGxfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX2dldHZlcnNpb25pbmZvX2lwX3QpOworICAgIHNfY3RsX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90KTsKKyAgICBzX2N0bF9pcC5wdTFfdmVyc2lvbiA9IGF1MV9idWY7CisgICAgc19jdGxfaXAudTRfdmVyc2lvbl9idWZzaXplID0gc2l6ZW9mKGF1MV9idWYpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopICZzX2N0bF9pcCwgKHZvaWQgKikgJnNfY3RsX29wKTsKKworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gZ2V0dGluZyB2ZXJzaW9uOiAweCV4Iiwgc19jdGxfb3AudTRfZXJyb3JfY29kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIkl0dGlhbSBlbmNvZGVyIHZlcnNpb246ICVzIiwgKGNoYXIgKilzX2N0bF9pcC5wdTFfdmVyc2lvbik7CisgICAgfQorICAgIHJldHVybjsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjppbml0RW5jb2RlcigpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgV09SRDMyIGxldmVsOworCisgICAgQ0hFQ0soIW1TdGFydGVkKTsKKworICAgIGMyX3N0YXR1c190IGVyclR5cGUgPSBDMl9PSzsKKworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIG1TaXplID0gbUludGYtPmdldFNpemVfbCgpOworICAgICAgICBtQml0cmF0ZSA9IG1JbnRmLT5nZXRCaXRyYXRlX2woKTsKKyAgICAgICAgbUZyYW1lUmF0ZSA9IG1JbnRmLT5nZXRGcmFtZVJhdGVfbCgpOworICAgICAgICBtSW50cmFSZWZyZXNoID0gbUludGYtPmdldEludHJhUmVmcmVzaF9sKCk7CisgICAgICAgIG1BVkNFbmNMZXZlbCA9IG1JbnRmLT5nZXRMZXZlbF9sKCk7CisgICAgICAgIG1JSW50ZXJ2YWwgPSBtSW50Zi0+Z2V0U3luY0ZyYW1lUGVyaW9kX2woKTsKKyAgICAgICAgbUlEUkludGVydmFsID0gbUludGYtPmdldFN5bmNGcmFtZVBlcmlvZF9sKCk7CisgICAgfQorICAgIHVpbnQzMl90IHdpZHRoID0gbVNpemUtPndpZHRoOworICAgIHVpbnQzMl90IGhlaWdodCA9IG1TaXplLT5oZWlnaHQ7CisKKyAgICBtU3RyaWRlID0gd2lkdGg7CisKKyAgICAvLyBUT0RPCisgICAgbUl2VmlkZW9Db2xvckZvcm1hdCA9IElWX1lVVl80MjBQOworCisgICAgQUxPR0QoIlBhcmFtcyB3aWR0aCAlZCBoZWlnaHQgJWQgbGV2ZWwgJWQgY29sb3JGb3JtYXQgJWQiLCB3aWR0aCwKKyAgICAgICAgICAgIGhlaWdodCwgbUFWQ0VuY0xldmVsLCBtSXZWaWRlb0NvbG9yRm9ybWF0KTsKKworICAgIC8qIEdldHRpbmcgTnVtYmVyIG9mIE1lbVJlY29yZHMgKi8KKyAgICB7CisgICAgICAgIGl2X251bV9tZW1fcmVjX2lwX3Qgc19udW1fbWVtX3JlY19pcDsKKyAgICAgICAgaXZfbnVtX21lbV9yZWNfb3BfdCBzX251bV9tZW1fcmVjX29wOworCisgICAgICAgIHNfbnVtX21lbV9yZWNfaXAudTRfc2l6ZSA9IHNpemVvZihpdl9udW1fbWVtX3JlY19pcF90KTsKKyAgICAgICAgc19udW1fbWVtX3JlY19vcC51NF9zaXplID0gc2l6ZW9mKGl2X251bV9tZW1fcmVjX29wX3QpOworCisgICAgICAgIHNfbnVtX21lbV9yZWNfaXAuZV9jbWQgPSBJVl9DTURfR0VUX05VTV9NRU1fUkVDOworCisgICAgICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obnVsbHB0ciwgJnNfbnVtX21lbV9yZWNfaXAsICZzX251bV9tZW1fcmVjX29wKTsKKworICAgICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJHZXQgbnVtYmVyIG9mIG1lbW9yeSByZWNvcmRzIGZhaWxlZCA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgIHNfbnVtX21lbV9yZWNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisKKyAgICAgICAgbU51bU1lbVJlY29yZHMgPSBzX251bV9tZW1fcmVjX29wLnU0X251bV9tZW1fcmVjOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIGFycmF5IHRvIGhvbGQgbWVtb3J5IHJlY29yZHMgKi8KKyAgICBpZiAobU51bU1lbVJlY29yZHMgPiBTSVpFX01BWCAvIHNpemVvZihpdl9tZW1fcmVjX3QpKSB7CisgICAgICAgIEFMT0dFKCJyZXF1ZXN0ZWQgbWVtb3J5IHNpemUgaXMgdG9vIGJpZy4iKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgbU1lbVJlY29yZHMgPSAoaXZfbWVtX3JlY190ICopbWFsbG9jKG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworICAgIGlmIChudWxscHRyID09IG1NZW1SZWNvcmRzKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBob2xkIG1lbW9yeSByZWNvcmRzOiBTaXplICV6dSIsCisgICAgICAgICAgICAgICAgbU51bU1lbVJlY29yZHMgKiBzaXplb2YoaXZfbWVtX3JlY190KSk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgeworICAgICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CisgICAgICAgIHBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKSB7CisgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9zaXplID0gc2l6ZW9mKGl2X21lbV9yZWNfdCk7CisgICAgICAgICAgICBwc19tZW1fcmVjLT5wdl9iYXNlID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9zaXplID0gMDsKKyAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9hbGlnbm1lbnQgPSAwOworICAgICAgICAgICAgcHNfbWVtX3JlYy0+ZV9tZW1fdHlwZSA9IElWX05BX01FTV9UWVBFOworCisgICAgICAgICAgICBwc19tZW1fcmVjKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBHZXR0aW5nIE1lbVJlY29yZHMgQXR0cmlidXRlcyAqLworICAgIHsKKyAgICAgICAgaXZfZmlsbF9tZW1fcmVjX2lwX3Qgc19maWxsX21lbV9yZWNfaXA7CisgICAgICAgIGl2X2ZpbGxfbWVtX3JlY19vcF90IHNfZmlsbF9tZW1fcmVjX29wOworCisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X3NpemUgPSBzaXplb2YoaXZfZmlsbF9tZW1fcmVjX2lwX3QpOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19vcC51NF9zaXplID0gc2l6ZW9mKGl2X2ZpbGxfbWVtX3JlY19vcF90KTsKKworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC5lX2NtZCA9IElWX0NNRF9GSUxMX05VTV9NRU1fUkVDOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC5wc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X251bV9tZW1fcmVjID0gbU51bU1lbVJlY29yZHM7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF93ZCA9IHdpZHRoOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfaHQgPSBoZWlnaHQ7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9sZXZlbCA9IG1BVkNFbmNMZXZlbDsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAuZV9jb2xvcl9mb3JtYXQgPSBERUZBVUxUX0lOUF9DT0xPUl9GT1JNQVQ7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9yZWZfY250ID0gREVGQVVMVF9NQVhfUkVGX0ZSTTsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X3Jlb3JkZXJfY250ID0gREVGQVVMVF9NQVhfUkVPUkRFUl9GUk07CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9zcmNoX3JuZ194ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9YOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfc3JjaF9ybmdfeSA9IERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWTsKKworICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG51bGxwdHIsICZzX2ZpbGxfbWVtX3JlY19pcCwgJnNfZmlsbF9tZW1fcmVjX29wKTsKKworICAgICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGaWxsIG1lbW9yeSByZWNvcmRzIGZhaWxlZCA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgIHNfZmlsbF9tZW1fcmVjX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFsbG9jYXRpbmcgTWVtb3J5IGZvciBNZW0gUmVjb3JkcyAqLworICAgIHsKKyAgICAgICAgV09SRDMyIHRvdGFsX3NpemU7CisgICAgICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYzsKKyAgICAgICAgdG90YWxfc2l6ZSA9IDA7CisgICAgICAgIHBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyspIHsKKyAgICAgICAgICAgIHBzX21lbV9yZWMtPnB2X2Jhc2UgPSBpdmVfYWxpZ25lZF9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9hbGlnbm1lbnQsIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgICAgIGlmIChwc19tZW1fcmVjLT5wdl9iYXNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIGZvciBtZW0gcmVjb3JkIGlkICV6dSBzaXplICV1XG4iLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRvdGFsX3NpemUgKz0gcHNfbWVtX3JlYy0+dTRfbWVtX3NpemU7CisKKyAgICAgICAgICAgIHBzX21lbV9yZWMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENvZGVjIEluc3RhbmNlIENyZWF0aW9uICovCisgICAgeworICAgICAgICBpdmVfaW5pdF9pcF90IHNfaW5pdF9pcDsKKyAgICAgICAgaXZlX2luaXRfb3BfdCBzX2luaXRfb3A7CisKKyAgICAgICAgbUNvZGVjQ3R4ID0gKGl2X29ial90ICopbU1lbVJlY29yZHNbMF0ucHZfYmFzZTsKKyAgICAgICAgbUNvZGVjQ3R4LT51NF9zaXplID0gc2l6ZW9mKGl2X29ial90KTsKKyAgICAgICAgbUNvZGVjQ3R4LT5wdl9meG5zID0gKHZvaWQgKilpdmVfYXBpX2Z1bmN0aW9uOworCisgICAgICAgIHNfaW5pdF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9pbml0X2lwX3QpOworICAgICAgICBzX2luaXRfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfaW5pdF9vcF90KTsKKworICAgICAgICBzX2luaXRfaXAuZV9jbWQgPSBJVl9DTURfSU5JVDsKKyAgICAgICAgc19pbml0X2lwLnU0X251bV9tZW1fcmVjID0gbU51bU1lbVJlY29yZHM7CisgICAgICAgIHNfaW5pdF9pcC5wc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfd2QgPSB3aWR0aDsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9odCA9IGhlaWdodDsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9yZWZfY250ID0gREVGQVVMVF9NQVhfUkVGX0ZSTTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9yZW9yZGVyX2NudCA9IERFRkFVTFRfTUFYX1JFT1JERVJfRlJNOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X2xldmVsID0gbUFWQ0VuY0xldmVsOworICAgICAgICBzX2luaXRfaXAuZV9pbnBfY29sb3JfZm10ID0gbUl2VmlkZW9Db2xvckZvcm1hdDsKKworICAgICAgICBpZiAobVJlY29uRW5hYmxlIHx8IG1QU05SRW5hYmxlKSB7CisgICAgICAgICAgICBzX2luaXRfaXAudTRfZW5hYmxlX3JlY29uID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNfaW5pdF9pcC51NF9lbmFibGVfcmVjb24gPSAwOworICAgICAgICB9CisgICAgICAgIHNfaW5pdF9pcC5lX3JlY29uX2NvbG9yX2ZtdCA9IERFRkFVTFRfUkVDT05fQ09MT1JfRk9STUFUOworICAgICAgICBzX2luaXRfaXAuZV9yY19tb2RlID0gREVGQVVMVF9SQ19NT0RFOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X2ZyYW1lcmF0ZSA9IERFRkFVTFRfTUFYX0ZSQU1FUkFURTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9iaXRyYXRlID0gREVGQVVMVF9NQVhfQklUUkFURTsKKyAgICAgICAgc19pbml0X2lwLnU0X251bV9iZnJhbWVzID0gbUJmcmFtZXM7CisgICAgICAgIHNfaW5pdF9pcC5lX2NvbnRlbnRfdHlwZSA9IElWX1BST0dSRVNTSVZFOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X3NyY2hfcm5nX3ggPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1g7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfc3JjaF9ybmdfeSA9IERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWTsKKyAgICAgICAgc19pbml0X2lwLmVfc2xpY2VfbW9kZSA9IG1TbGljZU1vZGU7CisgICAgICAgIHNfaW5pdF9pcC51NF9zbGljZV9wYXJhbSA9IG1TbGljZVBhcmFtOworICAgICAgICBzX2luaXRfaXAuZV9hcmNoID0gbUFyY2g7CisgICAgICAgIHNfaW5pdF9pcC5lX3NvYyA9IERFRkFVTFRfU09DOworCisgICAgICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19pbml0X2lwLCAmc19pbml0X29wKTsKKworICAgICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbml0IGVuY29kZXIgZmFpbGVkID0gMHgleFxuIiwgc19pbml0X29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEdldCBDb2RlYyBWZXJzaW9uICovCisgICAgbG9nVmVyc2lvbigpOworCisgICAgLyogc2V0IHByb2Nlc3NvciBkZXRhaWxzICovCisgICAgc2V0TnVtQ29yZXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IEZyYW1lIGRpbWVuc2lvbnMgKi8KKyAgICBzZXREaW1lbnNpb25zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBGcmFtZSByYXRlcyAqLworICAgIHNldEZyYW1lUmF0ZSgpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgSVBFIFBhcmFtcyAqLworICAgIHNldElwZVBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgQml0cmF0ZSAqLworICAgIHNldEJpdFJhdGUoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IFFQICovCisgICAgc2V0UXAoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IEFJUiBwYXJhbXMgKi8KKyAgICBzZXRBaXJQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IFZCViBwYXJhbXMgKi8KKyAgICBzZXRWYnZQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IE1vdGlvbiBlc3RpbWF0aW9uIHBhcmFtcyAqLworICAgIHNldE1lUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBHT1AgcGFyYW1zICovCisgICAgc2V0R29wUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBEZWJsb2NrIHBhcmFtcyAqLworICAgIHNldERlYmxvY2tQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IFByb2ZpbGUgcGFyYW1zICovCisgICAgc2V0UHJvZmlsZVBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgaW4gRW5jb2RlIGhlYWRlciBtb2RlICovCisgICAgc2V0RW5jTW9kZShJVkVfRU5DX01PREVfSEVBREVSKTsKKworICAgIEFMT0dWKCJpbml0X2NvZGVjIHN1Y2Nlc3NmdWxsIik7CisKKyAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQgPSBmYWxzZTsKKyAgICBtU3RhcnRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6cmVsZWFzZUVuY29kZXIoKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzID0gSVZfU1VDQ0VTUzsKKyAgICBpdl9yZXRyaWV2ZV9tZW1fcmVjX2lwX3Qgc19yZXRyaWV2ZV9tZW1faXA7CisgICAgaXZfcmV0cmlldmVfbWVtX3JlY19vcF90IHNfcmV0cmlldmVfbWVtX29wOworICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYzsKKworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHNfcmV0cmlldmVfbWVtX2lwLnU0X3NpemUgPSBzaXplb2YoaXZfcmV0cmlldmVfbWVtX3JlY19pcF90KTsKKyAgICBzX3JldHJpZXZlX21lbV9vcC51NF9zaXplID0gc2l6ZW9mKGl2X3JldHJpZXZlX21lbV9yZWNfb3BfdCk7CisgICAgc19yZXRyaWV2ZV9tZW1faXAuZV9jbWQgPSBJVl9DTURfUkVUUklFVkVfTUVNUkVDOworICAgIHNfcmV0cmlldmVfbWVtX2lwLnBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19yZXRyaWV2ZV9tZW1faXAsICZzX3JldHJpZXZlX21lbV9vcCk7CisKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byByZXRyaWV2ZSBtZW1vcnkgcmVjb3JkcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19yZXRyaWV2ZV9tZW1fb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgLyogRnJlZSBtZW1vcnkgcmVjb3JkcyAqLworICAgIHBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNfcmV0cmlldmVfbWVtX29wLnU0X251bV9tZW1fcmVjX2ZpbGxlZDsgaSsrKSB7CisgICAgICAgIGlmIChwc19tZW1fcmVjKSBpdmVfYWxpZ25lZF9mcmVlKHBzX21lbV9yZWMtPnB2X2Jhc2UpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJtZW1vcnkgcmVjb3JkIGlzIG51bGwuIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIHBzX21lbV9yZWMrKzsKKyAgICB9CisKKyAgICBpZiAobU1lbVJlY29yZHMpIGZyZWUobU1lbVJlY29yZHMpOworCisgICAgLy8gY2xlYXIgb3RoZXIgcG9pbnRlcnMgaW50byB0aGUgc3BhY2UgYmVpbmcgZnJlZSgpZAorICAgIG1Db2RlY0N0eCA9IG51bGxwdHI7CisKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEVuY29kZUFyZ3MoCisgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfaXBfdCAqcHNfZW5jb2RlX2lwLAorICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX29wX3QgKnBzX2VuY29kZV9vcCwKKyAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAqY29uc3QgaW5wdXQsCisgICAgICAgIHVpbnQ4X3QgKmJhc2UsCisgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXApIHsKKyAgICBpdl9yYXdfYnVmX3QgKnBzX2lucF9yYXdfYnVmOworCisgICAgcHNfaW5wX3Jhd19idWYgPSAmcHNfZW5jb2RlX2lwLT5zX2lucF9idWY7CisgICAgcHNfZW5jb2RlX2lwLT5zX291dF9idWYucHZfYnVmID0gYmFzZTsKKyAgICBwc19lbmNvZGVfaXAtPnNfb3V0X2J1Zi51NF9ieXRlcyA9IDA7CisgICAgcHNfZW5jb2RlX2lwLT5zX291dF9idWYudTRfYnVmc2l6ZSA9IGNhcGFjaXR5OworICAgIHBzX2VuY29kZV9pcC0+dTRfc2l6ZSA9IHNpemVvZihpdmVfdmlkZW9fZW5jb2RlX2lwX3QpOworICAgIHBzX2VuY29kZV9vcC0+dTRfc2l6ZSA9IHNpemVvZihpdmVfdmlkZW9fZW5jb2RlX29wX3QpOworCisgICAgcHNfZW5jb2RlX2lwLT5lX2NtZCA9IElWRV9DTURfVklERU9fRU5DT0RFOworICAgIHBzX2VuY29kZV9pcC0+cHZfYnVmcyA9IG51bGxwdHI7CisgICAgcHNfZW5jb2RlX2lwLT5wdl9tYl9pbmZvID0gbnVsbHB0cjsKKyAgICBwc19lbmNvZGVfaXAtPnB2X3BpY19pbmZvID0gbnVsbHB0cjsKKyAgICBwc19lbmNvZGVfaXAtPnU0X21iX2luZm9fdHlwZSA9IDA7CisgICAgcHNfZW5jb2RlX2lwLT51NF9waWNfaW5mb190eXBlID0gMDsKKyAgICBwc19lbmNvZGVfaXAtPnU0X2lzX2xhc3QgPSAwOworICAgIHBzX2VuY29kZV9pcC0+dTRfdGltZXN0YW1wX2hpZ2ggPSB0aW1lc3RhbXAgPj4gMzI7CisgICAgcHNfZW5jb2RlX2lwLT51NF90aW1lc3RhbXBfbG93ID0gdGltZXN0YW1wICYgMHhGRkZGRkZGRjsKKyAgICBwc19lbmNvZGVfb3AtPnNfb3V0X2J1Zi5wdl9idWYgPSBudWxscHRyOworCisgICAgLyogSW5pdGlhbGl6ZSBjb2xvciBmb3JtYXRzICovCisgICAgbWVtc2V0KHBzX2lucF9yYXdfYnVmLCAwLCBzaXplb2YoaXZfcmF3X2J1Zl90KSk7CisgICAgcHNfaW5wX3Jhd19idWYtPnU0X3NpemUgPSBzaXplb2YoaXZfcmF3X2J1Zl90KTsKKyAgICBwc19pbnBfcmF3X2J1Zi0+ZV9jb2xvcl9mbXQgPSBtSXZWaWRlb0NvbG9yRm9ybWF0OworICAgIGlmIChpbnB1dCA9PSBudWxscHRyKSB7CisgICAgICAgIGlmIChtU2F3SW5wdXRFT1MpeworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT51NF9pc19sYXN0ID0gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgaWYgKGlucHV0LT53aWR0aCgpIDwgbVNpemUtPndpZHRoIHx8CisgICAgICAgIGlucHV0LT5oZWlnaHQoKSA8IG1TaXplLT5oZWlnaHQpIHsKKyAgICAgICAgLyogRXhwZWN0IHdpZHRoIGhlaWdodCB0byBiZSBjb25maWd1cmVkICovCisgICAgICAgIEFMT0dXKCJ1bmV4cGVjdGVkIENhcGFjaXR5IEFzcGVjdCAlZCglZCkgeCAlZCglZCkiLCBpbnB1dC0+d2lkdGgoKSwKKyAgICAgICAgICAgICAgbVNpemUtPndpZHRoLCBpbnB1dC0+aGVpZ2h0KCksIG1TaXplLT5oZWlnaHQpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigid2lkdGggPSAlZCwgaGVpZ2h0ID0gJWQiLCBpbnB1dC0+d2lkdGgoKSwgaW5wdXQtPmhlaWdodCgpKTsKKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gaW5wdXQtPmxheW91dCgpOworICAgIHVpbnQ4X3QgKnlQbGFuZSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbnB1dC0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgdWludDhfdCAqdVBsYW5lID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGlucHV0LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgICB1aW50OF90ICp2UGxhbmUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5wdXQtPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOworICAgIGludDMyX3QgeVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldLnJvd0luYzsKKyAgICBpbnQzMl90IHVTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb3dJbmM7CisgICAgaW50MzJfdCB2U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ucm93SW5jOworCisgICAgdWludDMyX3Qgd2lkdGggPSBtU2l6ZS0+d2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0ID0gbVNpemUtPmhlaWdodDsKKyAgICAvLyB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBhbHdheXMgZXZlbiAoYXMgYmxvY2sgc2l6ZSBpcyAxNngxNikKKyAgICBDSEVDS19FUSgod2lkdGggJiAxdSksIDB1KTsKKyAgICBDSEVDS19FUSgoaGVpZ2h0ICYgMXUpLCAwdSk7CisgICAgc2l6ZV90IHlQbGFuZVNpemUgPSB3aWR0aCAqIGhlaWdodDsKKworICAgIHN3aXRjaCAobGF5b3V0LnR5cGUpIHsKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0I6CisgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCQTogeworICAgICAgICAgICAgQUxPR1YoInlQbGFuZVNpemUgPSAlenUiLCB5UGxhbmVTaXplKTsKKyAgICAgICAgICAgIE1lbW9yeUJsb2NrIGNvbnZlcnNpb25CdWZmZXIgPSBtQ29udmVyc2lvbkJ1ZmZlcnMuZmV0Y2goeVBsYW5lU2l6ZSAqIDMgLyAyKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVtcGxhY2UoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksIGNvbnZlcnNpb25CdWZmZXIpOworICAgICAgICAgICAgeVBsYW5lID0gY29udmVyc2lvbkJ1ZmZlci5kYXRhKCk7CisgICAgICAgICAgICB1UGxhbmUgPSB5UGxhbmUgKyB5UGxhbmVTaXplOworICAgICAgICAgICAgdlBsYW5lID0gdVBsYW5lICsgeVBsYW5lU2l6ZSAvIDQ7CisgICAgICAgICAgICB5U3RyaWRlID0gd2lkdGg7CisgICAgICAgICAgICB1U3RyaWRlID0gdlN0cmlkZSA9IHlTdHJpZGUgLyAyOworICAgICAgICAgICAgQ29udmVydFJHQlRvUGxhbmFyWVVWKHlQbGFuZSwgeVN0cmlkZSwgaGVpZ2h0LCBjb252ZXJzaW9uQnVmZmVyLnNpemUoKSwgKmlucHV0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOiB7CisgICAgICAgICAgICBpZiAoIUlzWVVWNDIwKCppbnB1dCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiaW5wdXQgaXMgbm90IFlVVjQyMCIpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgICAgICAgICAmJiB1U3RyaWRlID09IHZTdHJpZGUKKyAgICAgICAgICAgICAgICAgICAgJiYgeVN0cmlkZSA9PSAyICogdlN0cmlkZSkgeworICAgICAgICAgICAgICAgIC8vIEk0MjAgY29tcGF0aWJsZSAtIGFscmVhZHkgc2V0IHVwIGFib3ZlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvcHkgdG8gSTQyMAorICAgICAgICAgICAgeVN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgdVN0cmlkZSA9IHZTdHJpZGUgPSB5U3RyaWRlIC8gMjsKKyAgICAgICAgICAgIE1lbW9yeUJsb2NrIGNvbnZlcnNpb25CdWZmZXIgPSBtQ29udmVyc2lvbkJ1ZmZlcnMuZmV0Y2goeVBsYW5lU2l6ZSAqIDMgLyAyKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVtcGxhY2UoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksIGNvbnZlcnNpb25CdWZmZXIpOworICAgICAgICAgICAgTWVkaWFJbWFnZTIgaW1nID0gQ3JlYXRlWVVWNDIwUGxhbmFyTWVkaWFJbWFnZTIod2lkdGgsIGhlaWdodCwgeVN0cmlkZSwgaGVpZ2h0KTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IEltYWdlQ29weShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgJmltZywgKmlucHV0KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQnVmZmVyIGNvbnZlcnNpb24gZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHlQbGFuZSA9IGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgdVBsYW5lID0geVBsYW5lICsgeVBsYW5lU2l6ZTsKKyAgICAgICAgICAgIHZQbGFuZSA9IHVQbGFuZSArIHlQbGFuZVNpemUgLyA0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQToKKyAgICAgICAgICAgIEFMT0dFKCJZVVZBIHBsYW5lIHR5cGUgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVucmVjb2duaXplZCBwbGFuZSB0eXBlOiAlZCIsIGxheW91dC50eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgc3dpdGNoIChtSXZWaWRlb0NvbG9yRm9ybWF0KSB7CisgICAgICAgIGNhc2UgSVZfWVVWXzQyMFA6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlucHV0IGJ1ZmZlciBpcyBzdXBwb3NlZCB0byBiZSBjb25zdCBidXQgSXR0aWFtIEFQSSB3YW50cyBiYXJlIHBvaW50ZXIuCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMF0gPSB5UGxhbmU7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMV0gPSB1UGxhbmU7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMl0gPSB2UGxhbmU7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfd2RbMF0gPSBpbnB1dC0+d2lkdGgoKTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfd2RbMV0gPSBpbnB1dC0+d2lkdGgoKSAvIDI7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3dkWzJdID0gaW5wdXQtPndpZHRoKCkgLyAyOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzBdID0gaW5wdXQtPmhlaWdodCgpOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9odFsxXSA9IGlucHV0LT5oZWlnaHQoKSAvIDI7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzJdID0gaW5wdXQtPmhlaWdodCgpIC8gMjsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9zdHJkWzBdID0geVN0cmlkZTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFsxXSA9IHVTdHJpZGU7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMl0gPSB2U3RyaWRlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElWX1lVVl80MjJJTEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgIC8vIHBzX2lucF9yYXdfYnVmLT5hcHZfYnVmc1swXSA9IHB1MV9idWY7CisgICAgICAgICAgICAvLyBwc19pbnBfcmF3X2J1Zi0+YXU0X3dkWzBdID0gbVdpZHRoICogMjsKKyAgICAgICAgICAgIC8vIHBzX2lucF9yYXdfYnVmLT5hdTRfaHRbMF0gPSBtSGVpZ2h0OworICAgICAgICAgICAgLy8gcHNfaW5wX3Jhd19idWYtPmF1NF9zdHJkWzBdID0gbVN0cmlkZSAqIDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSVZfWVVWXzQyMFNQX1VWOgorICAgICAgICBjYXNlIElWX1lVVl80MjBTUF9WVToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzBdID0geVBsYW5lOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzFdID0gdVBsYW5lOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3dkWzBdID0gaW5wdXQtPndpZHRoKCk7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3dkWzFdID0gaW5wdXQtPndpZHRoKCk7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfaHRbMF0gPSBpbnB1dC0+aGVpZ2h0KCk7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzFdID0gaW5wdXQtPmhlaWdodCgpIC8gMjsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9zdHJkWzBdID0geVN0cmlkZTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFsxXSA9IHVTdHJpZGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QXZjRW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIFdPUkQzMiB0aW1lRGVsYXksIHRpbWVUYWtlbjsKKyAgICB1aW50NjRfdCB0aW1lc3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdWxsKCk7CisKKyAgICAvLyBJbml0aWFsaXplIGVuY29kZXIgaWYgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWQKKyAgICBpZiAobUNvZGVjQ3R4ID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKEMyX09LICE9IGluaXRFbmNvZGVyKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHdoaWxlICghbVNhd091dHB1dEVPUyAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworICAgIGMyX3N0YXR1c190IGVycm9yOworICAgIGl2ZV92aWRlb19lbmNvZGVfaXBfdCBzX2VuY29kZV9pcDsKKyAgICBpdmVfdmlkZW9fZW5jb2RlX29wX3Qgc19lbmNvZGVfb3A7CisKKyAgICBpZiAoIW1TcHNQcHNIZWFkZXJSZWNlaXZlZCkgeworICAgICAgICBjb25zdGV4cHIgdWludDMyX3Qga0hlYWRlckxlbmd0aCA9IE1JTl9TVFJFQU1fU0laRTsKKyAgICAgICAgdWludDhfdCBoZWFkZXJba0hlYWRlckxlbmd0aF07CisgICAgICAgIGVycm9yID0gc2V0RW5jb2RlQXJncygKKyAgICAgICAgICAgICAgICAmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCwgbnVsbHB0ciwgaGVhZGVyLCBrSGVhZGVyTGVuZ3RoLCB0aW1lc3RhbXApOworICAgICAgICBpZiAoZXJyb3IgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJzZXRFbmNvZGVBcmdzIGZhaWxlZDogJWQiLCBlcnJvcik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCk7CisKKyAgICAgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICBBTE9HRSgiRW5jb2RlIGhlYWRlciBmYWlsZWQgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICBzX2VuY29kZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJCeXRlcyBHZW5lcmF0ZWQgaW4gaGVhZGVyICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpOworICAgICAgICB9CisKKyAgICAgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkID0gdHJ1ZTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gY3NkID0KKyAgICAgICAgICAgIEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcywgMHUpOworICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBoZWFkZXIsIHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcyk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKHN0ZDo6bW92ZShjc2QpKTsKKworICAgICAgICBEVU1QX1RPX0ZJTEUoCisgICAgICAgICAgICAgICAgbU91dEZpbGUsIGNzZC0+bS52YWx1ZSwgY3NkLT5mbGV4Q291bnQoKSk7CisgICAgfQorCisgICAgLy8gaGFuZGxlIGR5bmFtaWMgY29uZmlnIHBhcmFtZXRlcnMKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gaW50cmFSZWZyZXNoID0gbUludGYtPmdldEludHJhUmVmcmVzaF9sKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gcmVxdWVzdFN5bmMgPSBtSW50Zi0+Z2V0UmVxdWVzdFN5bmNfbCgpOworICAgICAgICBsb2NrLnVubG9jaygpOworCisgICAgICAgIGlmIChiaXRyYXRlICE9IG1CaXRyYXRlKSB7CisgICAgICAgICAgICBtQml0cmF0ZSA9IGJpdHJhdGU7CisgICAgICAgICAgICBzZXRCaXRSYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW50cmFSZWZyZXNoICE9IG1JbnRyYVJlZnJlc2gpIHsKKyAgICAgICAgICAgIG1JbnRyYVJlZnJlc2ggPSBpbnRyYVJlZnJlc2g7CisgICAgICAgICAgICBzZXRBaXJQYXJhbXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXF1ZXN0U3luYyAhPSBtUmVxdWVzdFN5bmMpIHsKKyAgICAgICAgICAgIC8vIHdlIGNhbiBoYW5kbGUgSURSIGltbWVkaWF0ZWx5CisgICAgICAgICAgICBpZiAocmVxdWVzdFN5bmMtPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgLy8gdW5zZXQgcmVxdWVzdAorICAgICAgICAgICAgICAgIEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0IGNsZWFyU3luYygwdSwgQzJfRkFMU0UpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsgJmNsZWFyU3luYyB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkdvdCBzeW5jIHJlcXVlc3QiKTsKKyAgICAgICAgICAgICAgICBzZXRGcmFtZVR5cGUoSVZfSURSX0ZSQU1FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZXF1ZXN0U3luYyA9IHJlcXVlc3RTeW5jOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBtU2F3SW5wdXRFT1MgPSB0cnVlOworICAgIH0KKworICAgIC8qIEluIG5vcm1hbCBtb2RlLCBzdG9yZSBpbnB1dEJ1ZmZlckluZm8gYW5kIHRoaXMgd2lsbCBiZSByZXR1cm5lZAorICAgICAgIHdoZW4gZW5jb2RlciBjb25zdW1lcyB0aGlzIGlucHV0ICovCisgICAgLy8gaWYgKCFtSW5wdXREYXRhSXNNZXRhICYmIChpbnB1dEJ1ZmZlckluZm8gIT0gTlVMTCkpIHsKKyAgICAvLyAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSX0hFQURFUlM7IGkrKykgeworICAgIC8vICAgICAgICAgaWYgKE5VTEwgPT0gbUlucHV0QnVmZmVySW5mb1tpXSkgeworICAgIC8vICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlckluZm9baV0gPSBpbnB1dEJ1ZmZlckluZm87CisgICAgLy8gICAgICAgICAgICAgYnJlYWs7CisgICAgLy8gICAgICAgICB9CisgICAgLy8gICAgIH0KKyAgICAvLyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHZpZXc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBpbnB1dEJ1ZmZlcjsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBpbnB1dEJ1ZmZlciA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF07CisgICAgICAgIHZpZXcgPSBzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IEMyR3JhcGhpY1ZpZXc+KAorICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkpOworICAgICAgICBpZiAodmlldy0+ZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZXJyID0gJWQiLCB2aWV3LT5lcnJvcigpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKworICAgIGRvIHsKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZywgcHJvcGVyIHVzYWdlLCBldGMuCisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sobU91dEJ1ZmZlclNpemUsIHVzYWdlLCAmYmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmV0Y2ggbGluZWFyIGJsb2NrIGVyciA9ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBlcnIgPSAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGVycm9yID0gc2V0RW5jb2RlQXJncygKKyAgICAgICAgICAgICAgICAmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCwgdmlldy5nZXQoKSwgd1ZpZXcuYmFzZSgpLCB3Vmlldy5jYXBhY2l0eSgpLCB0aW1lc3RhbXApOworICAgICAgICBpZiAoZXJyb3IgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJzZXRFbmNvZGVBcmdzIGZhaWxlZCA6ICVkIiwgZXJyb3IpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycm9yOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gRFVNUF9UT19GSUxFKAorICAgICAgICAvLyAgICAgICAgIG1JbkZpbGUsIHNfZW5jb2RlX2lwLnNfaW5wX2J1Zi5hcHZfYnVmc1swXSwKKyAgICAgICAgLy8gICAgICAgICAobUhlaWdodCAqIG1TdHJpZGUgKiAzIC8gMikpOworCisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgICAgICAvKiBDb21wdXRlIHRpbWUgZWxhcHNlZCBiZXR3ZWVuIGVuZCBvZiBwcmV2aW91cyBkZWNvZGUoKQorICAgICAgICAgKiB0byBzdGFydCBvZiBjdXJyZW50IGRlY29kZSgpICovCisgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgdGltZURlbGF5KTsKKyAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wKTsKKworICAgICAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIGlmICgoc19lbmNvZGVfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpID09IElIMjY0RV9CSVRTVFJFQU1fQlVGRkVSX09WRVJGTE9XKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogdXNlIElWRV9DTURfQ1RMX0dFVEJVRklORk8gZm9yIHByb3BlciBtYXggaW5wdXQgc2l6ZT8KKyAgICAgICAgICAgICAgICBtT3V0QnVmZmVyU2l6ZSAqPSAyOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR0UoIkVuY29kZSBGcmFtZSBmYWlsZWQgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICBzX2VuY29kZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChJVl9TVUNDRVNTICE9IHN0YXR1cyk7CisKKyAgICAvLyBIb2xkIGlucHV0IGJ1ZmZlciByZWZlcmVuY2UKKyAgICBpZiAoaW5wdXRCdWZmZXIpIHsKKyAgICAgICAgbUJ1ZmZlcnNbc19lbmNvZGVfaXAuc19pbnBfYnVmLmFwdl9idWZzWzBdXSA9IGlucHV0QnVmZmVyOworICAgIH0KKworICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICAvKiBDb21wdXRlIHRpbWUgdGFrZW4gZm9yIGRlY29kZSgpICovCisgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCB0aW1lVGFrZW4pOworCisgICAgQUxPR1YoInRpbWVUYWtlbj0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCIsIHRpbWVUYWtlbiwgdGltZURlbGF5LAorICAgICAgICAgICAgc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzKTsKKworICAgIHZvaWQgKmZyZWVkID0gc19lbmNvZGVfb3Auc19pbnBfYnVmLmFwdl9idWZzWzBdOworICAgIC8qIElmIGVuY29kZXIgZnJlZXMgdXAgYW4gaW5wdXQgYnVmZmVyLCBtYXJrIGl0IGFzIGZyZWUgKi8KKyAgICBpZiAoZnJlZWQgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAobUJ1ZmZlcnMuY291bnQoZnJlZWQpID09IDB1KSB7CisgICAgICAgICAgICBBTE9HRCgiYnVmZmVyIG5vdCB0cmFja2VkIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBSZWxlYXNlIGlucHV0IGJ1ZmZlciByZWZlcmVuY2UKKyAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGZyZWVkKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVyYXNlKGZyZWVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPQorICAgICAgICAoKHVpbnQ2NF90KXNfZW5jb2RlX29wLnU0X3RpbWVzdGFtcF9oaWdoIDw8IDMyKSB8IHNfZW5jb2RlX29wLnU0X3RpbWVzdGFtcF9sb3c7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKworICAgIGlmIChzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPQorICAgICAgICAgICAgY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCAwLCBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpOworICAgICAgICBpZiAoSVZfSURSX0ZSQU1FID09IHNfZW5jb2RlX29wLnU0X2VuY29kZWRfZnJhbWVfdHlwZSkgeworICAgICAgICAgICAgQUxPR1YoIklEUiBmcmFtZSBwcm9kdWNlZCIpOworICAgICAgICAgICAgYnVmZmVyLT5zZXRJbmZvKHN0ZDo6bWFrZV9zaGFyZWQ8QzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAwdSAvKiBzdHJlYW0gaWQgKi8sIEMyQ29uZmlnOjpTWU5DX0ZSQU1FKSk7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgfQorCisgICAgaWYgKHNfZW5jb2RlX29wLnU0X2lzX2xhc3QpIHsKKyAgICAgICAgLy8gb3V0cHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICBtU2F3T3V0cHV0RU9TID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBvdXRwdXRCdWZmZXJIZWFkZXItPm5GbGFncyAmPSB+T01YX0JVRkZFUkZMQUdfRU9TOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gVE9ETzogdXNlIElWRV9DTURfQ1RMX0ZMVVNIPworICAgICh2b2lkKWRyYWluTW9kZTsKKyAgICAodm9pZClwb29sOworICAgIHJldHVybiBDMl9PSzsKK30KKworCitjbGFzcyBDMlNvZnRBdmNFbmNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0QXZjRW5jRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0QXZjRW5jKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEF2Y0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRBdmNFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBdmNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRBdmNFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBdmNFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTNjYTYxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5oCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BVkNfRU5DX0hfXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfQVZDX0VOQ19IX18KKworI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgImloMjY0X3R5cGVkZWZzLmgiCisjaW5jbHVkZSAiaXYyLmgiCisjaW5jbHVkZSAiaXZlMi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgQ09ERUNfTUFYX0NPUkVTICAgICAgICAgIDQKKyNkZWZpbmUgTEVOX1NUQVRVU19CVUZGRVIgICAgICAgICgxMCAgKiAxMDI0KQorI2RlZmluZSBNQVhfVkJWX0JVRkZfU0laRSAgICAgICAgKDEyMCAqIDE2Mzg0KQorI2RlZmluZSBNQVhfTlVNX0lPX0JVRlMgICAgICAgICAgIDMKKworI2RlZmluZSBERUZBVUxUX01BWF9SRUZfRlJNICAgICAgICAgMgorI2RlZmluZSBERUZBVUxUX01BWF9SRU9SREVSX0ZSTSAgICAgMAorI2RlZmluZSBERUZBVUxUX1FQX01JTiAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgREVGQVVMVF9RUF9NQVggICAgICAgICAgICAgIDQwCisjZGVmaW5lIERFRkFVTFRfTUFYX0JJVFJBVEUgICAgICAgICAyMDAwMDAwMAorI2RlZmluZSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1ggICAgMjU2CisjZGVmaW5lIERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWSAgICAyNTYKKyNkZWZpbmUgREVGQVVMVF9NQVhfRlJBTUVSQVRFICAgICAgIDEyMDAwMAorI2RlZmluZSBERUZBVUxUX05VTV9DT1JFUyAgICAgICAgICAgMQorI2RlZmluZSBERUZBVUxUX05VTV9DT1JFU19QUkVfRU5DICAgMAorI2RlZmluZSBERUZBVUxUX0ZQUyAgICAgICAgICAgICAgICAgMzAKKyNkZWZpbmUgREVGQVVMVF9FTkNfU1BFRUQgICAgICAgICAgIElWRV9OT1JNQUwKKworI2RlZmluZSBERUZBVUxUX01FTV9SRUNfQ05UICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1JFQ09OX0VOQUJMRSAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX0NIS1NVTV9FTkFCTEUgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1NUQVJUX0ZSTSAgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX05VTV9GUk1TICAgICAgICAgICAgMHhGRkZGRkZGRgorI2RlZmluZSBERUZBVUxUX0lOUF9DT0xPUl9GT1JNQVQgICAgICAgSVZfWVVWXzQyMFNQX1ZVCisjZGVmaW5lIERFRkFVTFRfUkVDT05fQ09MT1JfRk9STUFUICAgICBJVl9ZVVZfNDIwUAorI2RlZmluZSBERUZBVUxUX0xPT1BCQUNLICAgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1NSQ19GUkFNRV9SQVRFICAgICAgMzAKKyNkZWZpbmUgREVGQVVMVF9UR1RfRlJBTUVfUkFURSAgICAgIDMwCisjZGVmaW5lIERFRkFVTFRfTUFYX1dEICAgICAgICAgICAgICAxOTIwCisjZGVmaW5lIERFRkFVTFRfTUFYX0hUICAgICAgICAgICAgICAxOTIwCisjZGVmaW5lIERFRkFVTFRfTUFYX0xFVkVMICAgICAgICAgICA0MQorI2RlZmluZSBERUZBVUxUX1NUUklERSAgICAgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1dEICAgICAgICAgICAgICAgICAgMTI4MAorI2RlZmluZSBERUZBVUxUX0hUICAgICAgICAgICAgICAgICAgNzIwCisjZGVmaW5lIERFRkFVTFRfUFNOUl9FTkFCTEUgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfTUVfU1BFRUQgICAgICAgICAgICAxMDAKKyNkZWZpbmUgREVGQVVMVF9FTkFCTEVfRkFTVF9TQUQgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9FTkFCTEVfQUxUX1JFRiAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9SQ19NT0RFICAgICAgICAgICAgIElWRV9SQ19TVE9SQUdFCisjZGVmaW5lIERFRkFVTFRfQklUUkFURSAgICAgICAgICAgICA2MDAwMDAwCisjZGVmaW5lIERFRkFVTFRfSV9RUCAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBERUZBVUxUX0lfUVBfTUFYICAgICAgICAgICAgREVGQVVMVF9RUF9NQVgKKyNkZWZpbmUgREVGQVVMVF9JX1FQX01JTiAgICAgICAgICAgIERFRkFVTFRfUVBfTUlOCisjZGVmaW5lIERFRkFVTFRfUF9RUCAgICAgICAgICAgICAgICAyOAorI2RlZmluZSBERUZBVUxUX1BfUVBfTUFYICAgICAgICAgICAgREVGQVVMVF9RUF9NQVgKKyNkZWZpbmUgREVGQVVMVF9QX1FQX01JTiAgICAgICAgICAgIERFRkFVTFRfUVBfTUlOCisjZGVmaW5lIERFRkFVTFRfQl9RUCAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBERUZBVUxUX0JfUVBfTUFYICAgICAgICAgICAgREVGQVVMVF9RUF9NQVgKKyNkZWZpbmUgREVGQVVMVF9CX1FQX01JTiAgICAgICAgICAgIERFRkFVTFRfUVBfTUlOCisjZGVmaW5lIERFRkFVTFRfQUlSICAgICAgICAgICAgICAgICBJVkVfQUlSX01PREVfTk9ORQorI2RlZmluZSBERUZBVUxUX0FJUl9SRUZSRVNIX1BFUklPRCAgMzAKKyNkZWZpbmUgREVGQVVMVF9TUkNIX1JOR19YICAgICAgICAgIDY0CisjZGVmaW5lIERFRkFVTFRfU1JDSF9STkdfWSAgICAgICAgICA0OAorI2RlZmluZSBERUZBVUxUX0lfSU5URVJWQUwgICAgICAgICAgMzAKKyNkZWZpbmUgREVGQVVMVF9JRFJfSU5URVJWQUwgICAgICAgIDEwMDAKKyNkZWZpbmUgREVGQVVMVF9CX0ZSQU1FUyAgICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9ESVNBQkxFX0RFQkxLX0xFVkVMIDAKKyNkZWZpbmUgREVGQVVMVF9IUEVMICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVGQVVMVF9RUEVMICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVGQVVMVF9JNCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVGQVVMVF9FUFJPRklMRSAgICAgICAgICAgIElWX1BST0ZJTEVfQkFTRQorI2RlZmluZSBERUZBVUxUX0VOVFJPUFlfTU9ERSAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1NMSUNFX01PREUgICAgICAgICAgSVZFX1NMSUNFX01PREVfTk9ORQorI2RlZmluZSBERUZBVUxUX1NMSUNFX1BBUkFNICAgICAgICAgMjU2CisjZGVmaW5lIERFRkFVTFRfQVJDSCAgICAgICAgICAgICAgICBBUkNIX0FSTV9BOVEKKyNkZWZpbmUgREVGQVVMVF9TT0MgICAgICAgICAgICAgICAgIFNPQ19HRU5FUklDCisjZGVmaW5lIERFRkFVTFRfSU5UUkE0eDQgICAgICAgICAgICAwCisjZGVmaW5lIFNUUkxFTkdUSCAgICAgICAgICAgICAgICAgICA1MDAKKyNkZWZpbmUgREVGQVVMVF9DT05TVFJBSU5FRF9JTlRSQSAgIDAKKworI2RlZmluZSBNSU4oYSwgYikgKChhKSA8IChiKSk/IChhKSA6IChiKQorI2RlZmluZSBNQVgoYSwgYikgKChhKSA+IChiKSk/IChhKSA6IChiKQorI2RlZmluZSBBTElHTjE2KHgpICgoKCh4KSArIDE1KSA+PiA0KSA8PCA0KQorI2RlZmluZSBBTElHTjEyOCh4KSAoKCgoeCkgKyAxMjcpID4+IDcpIDw8IDcpCisjZGVmaW5lIEFMSUdONDA5Nih4KSAoKCgoeCkgKyA0MDk1KSA+PiAxMikgPDwgMTIpCisKKy8qKiBVc2VkIHRvIHJlbW92ZSB3YXJuaW5ncyBhYm91dCB1bnVzZWQgcGFyYW1ldGVycyAqLworI2RlZmluZSBVTlVTRUQoeCkgKCh2b2lkKSh4KSkKKworLyoqIEdldCB0aW1lICovCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgZ2V0dGltZW9mZGF5KGEsIGIpOworCisvKiogQ29tcHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gc3RhcnQgYW5kIGVuZCAqLworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgXAorICAgIGRpZmYgPSAoKChlbmQpLnR2X3NlYyAtIChzdGFydCkudHZfc2VjKSAqIDEwMDAwMDApICsgXAorICAgICAgICAgICAgKChlbmQpLnR2X3VzZWMgLSAoc3RhcnQpLnR2X3VzZWMpOworCisjZGVmaW5lIGl2ZV9hbGlnbmVkX21hbGxvYyhhbGlnbm1lbnQsIHNpemUpIG1lbWFsaWduKGFsaWdubWVudCwgc2l6ZSkKKyNkZWZpbmUgaXZlX2FsaWduZWRfZnJlZShidWYpIGZyZWUoYnVmKQorCitzdHJ1Y3QgQzJTb2Z0QXZjRW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEF2Y0VuYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5DMlNvZnRBdmNFbmMoKTsKKworcHJpdmF0ZToKKyAgICAvLyBPTVggaW5wdXQgYnVmZmVyJ3MgdGltZXN0YW1wIGFuZCBmbGFncworICAgIHR5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgaW50NjRfdCBtVGltZVVzOworICAgICAgICBpbnQzMl90IG1GbGFnczsKKyAgICB9IElucHV0QnVmZmVySW5mbzsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisKKyAgICBpbnQzMl90IG1TdHJpZGU7CisKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OyAgIC8vIFRpbWUgYXQgdGhlIHN0YXJ0IG9mIGRlY29kZSgpCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7ICAgICAvLyBUaW1lIGF0IHRoZSBlbmQgb2YgZGVjb2RlKCkKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICBjaGFyIG1JbkZpbGVbMjAwXTsKKyAgICBjaGFyIG1PdXRGaWxlWzIwMF07CisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCisgICAgSVZfQ09MT1JfRk9STUFUX1QgbUl2VmlkZW9Db2xvckZvcm1hdDsKKworICAgIElWX1BST0ZJTEVfVCBtQVZDRW5jUHJvZmlsZSBfX3VudXNlZDsKKyAgICBXT1JEMzIgICBtQVZDRW5jTGV2ZWw7CisgICAgYm9vbCAgICAgbVN0YXJ0ZWQ7CisgICAgYm9vbCAgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkOworCisgICAgYm9vbCAgICAgbVNhd0lucHV0RU9TOworICAgIGJvb2wgICAgIG1TYXdPdXRwdXRFT1M7CisgICAgYm9vbCAgICAgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgICAgIG1JbnRyYTR4NDsKKyAgICBib29sICAgICBtRW5hYmxlRmFzdFNhZDsKKyAgICBib29sICAgICBtRW5hYmxlQWx0UmVmOworICAgIGJvb2wgICAgIG1SZWNvbkVuYWJsZTsKKyAgICBib29sICAgICBtUFNOUkVuYWJsZTsKKyAgICBib29sICAgICBtRW50cm9weU1vZGU7CisgICAgYm9vbCAgICAgbUNvbnN0cmFpbmVkSW50cmFGbGFnOworICAgIElWRV9TUEVFRF9DT05GSUcgICAgIG1FbmNTcGVlZDsKKworICAgIGl2X29ial90ICptQ29kZWNDdHg7ICAgICAgICAgLy8gQ29kZWMgY29udGV4dAorICAgIGl2X21lbV9yZWNfdCAqbU1lbVJlY29yZHM7ICAgLy8gTWVtb3J5IHJlY29yZHMgcmVxdWVzdGVkIGJ5IHRoZSBjb2RlYworICAgIHNpemVfdCBtTnVtTWVtUmVjb3JkczsgICAgICAgLy8gTnVtYmVyIG9mIG1lbW9yeSByZWNvcmRzIHJlcXVlc3RlZCBieSBjb2RlYworICAgIHNpemVfdCBtTnVtQ29yZXM7ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGNvcmVzIHVzZWQgYnkgdGhlIGNvZGVjCisKKyAgICAvLyBjb25maWd1cmF0aW9ucyB1c2VkIGJ5IGNvbXBvbmVudCBpbiBwcm9jZXNzCisgICAgLy8gKFRPRE86IGtlZXAgdGhpcyBpbiBpbnRmIGJ1dCBtYWtlIHRoZW0gaW50ZXJuYWwgb25seSkKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gbUludHJhUmVmcmVzaDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IG1GcmFtZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBtUmVxdWVzdFN5bmM7CisKKyAgICB1aW50MzJfdCBtT3V0QnVmZmVyU2l6ZTsKKyAgICBVV09SRDMyIG1IZWFkZXJHZW5lcmF0ZWQ7CisgICAgVVdPUkQzMiBtQmZyYW1lczsKKyAgICBJVl9BUkNIX1QgbUFyY2g7CisgICAgSVZFX1NMSUNFX01PREVfVCBtU2xpY2VNb2RlOworICAgIFVXT1JEMzIgbVNsaWNlUGFyYW07CisgICAgYm9vbCBtSGFsZlBlbEVuYWJsZTsKKyAgICBVV09SRDMyIG1JSW50ZXJ2YWw7CisgICAgVVdPUkQzMiBtSURSSW50ZXJ2YWw7CisgICAgVVdPUkQzMiBtRGlzYWJsZURlYmxrTGV2ZWw7CisgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCAqLCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+PiBtQnVmZmVyczsKKyAgICBNZW1vcnlCbG9ja1Bvb2wgbUNvbnZlcnNpb25CdWZmZXJzOworICAgIHN0ZDo6bWFwPGNvbnN0IHZvaWQgKiwgTWVtb3J5QmxvY2s+IG1Db252ZXJzaW9uQnVmZmVyc0luVXNlOworCisgICAgdm9pZCBpbml0RW5jUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKyAgICBjMl9zdGF0dXNfdCByZWxlYXNlRW5jb2RlcigpOworCisgICAgYzJfc3RhdHVzX3Qgc2V0RnJhbWVUeXBlKElWX1BJQ1RVUkVfQ09ESU5HX1RZUEVfVCAgZV9mcmFtZV90eXBlKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRRcCgpOworICAgIGMyX3N0YXR1c190IHNldEVuY01vZGUoSVZFX0VOQ19NT0RFX1QgZV9lbmNfbW9kZSk7CisgICAgYzJfc3RhdHVzX3Qgc2V0RGltZW5zaW9ucygpOworICAgIGMyX3N0YXR1c190IHNldE51bUNvcmVzKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0RnJhbWVSYXRlKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0SXBlUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0Qml0UmF0ZSgpOworICAgIGMyX3N0YXR1c190IHNldEFpclBhcmFtcygpOworICAgIGMyX3N0YXR1c190IHNldE1lUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0R29wUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0UHJvZmlsZVBhcmFtcygpOworICAgIGMyX3N0YXR1c190IHNldERlYmxvY2tQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRWYnZQYXJhbXMoKTsKKyAgICB2b2lkIGxvZ1ZlcnNpb24oKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRFbmNvZGVBcmdzKAorICAgICAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9pcF90ICpwc19lbmNvZGVfaXAsCisgICAgICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX29wX3QgKnBzX2VuY29kZV9vcCwKKyAgICAgICAgICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgKmNvbnN0IGlucHV0LAorICAgICAgICAgICAgdWludDhfdCAqYmFzZSwKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICAgICAgdWludDY0X3QgdGltZXN0YW1wKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEF2Y0VuYyk7Cit9OworCisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorCisjZGVmaW5lIElOUFVUX0RVTVBfUEFUSCAgICAgIi9zZGNhcmQvbWVkaWEvYXZjZV9pbnB1dCIKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQgICAgICAieXV2IgorI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRIICAgICIvc2RjYXJkL21lZGlhL2F2Y2Vfb3V0cHV0IgorI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQgICAgICJoMjY0IgorCisjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJWxkLiVsZC4lcyIsIElOUFVUX0RVTVBfUEFUSCwgIFwKKyAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgICAgICAgICAgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RyY3B5KG1PdXRGaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcHJpbnRmKG1PdXRGaWxlLCAiJXNfJWxkLiVsZC4lcyIsIE9VVFBVVF9EVU1QX1BBVEgsXAorICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgICAgICBcCisgICAgICAgICAgICBPVVRQVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpIHsgICAgICAgICAgICAgICAgICBcCisgICAgRklMRSAqZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAid2IiKTsgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiT3BlbmVkIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgICAgICAgICBcCisgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiQ291bGQgbm90IG9wZW4gZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMRSAqZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAiYWIiKTsgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnAgIT0gTlVMTCAmJiBtX2J1ZiAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGkgPSBmd3JpdGUobV9idWYsIDEsIG1fc2l6ZSwgZnApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoImZ3cml0ZSByZXQgJWQgdG8gd3JpdGUgJWQiLCBpLCBtX3NpemUpOyAgXAorICAgICAgICBpZiAoaSAhPSAoaW50KW1fc2l6ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiRXJyb3IgaW4gZndyaXRlLCByZXR1cm5lZCAlZCIsIGkpOyAgIFwKKyAgICAgICAgICAgIHBlcnJvcigiRXJyb3IgaW4gd3JpdGUgdG8gZmlsZSIpOyAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRCgiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTtcCisgICAgICAgIGlmIChmcCAhPSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZWxzZSAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisjZGVmaW5lIElOUFVUX0RVTVBfUEFUSAorI2RlZmluZSBJTlBVVF9EVU1QX0VYVAorI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRICisjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVAorI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKQorI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FWQ19FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhNDQ0YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvQW5kcm9pZC5icApAQCAtMCwwICsxLDEyOSBAQAorLy8gRE8gTk9UIERFUEVORCBPTiBUSElTIERJUkVDVExZCisvLyB1c2UgbGliY29kZWMyX3NvZnQtZGVmYXVsdHMgaW5zdGVhZAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9jb21tb24iLAorICAgIGRlZmF1bHRzOiBbImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIl0sCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlNpbXBsZUMyQ29tcG9uZW50LmNwcCIsCisgICAgICAgICJTaW1wbGVDMkludGVyZmFjZS5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsIC8vIGZvciBwcm9wZXJ0aWVzCisgICAgICAgICJsaWJsb2ciLCAgICAvLyBmb3IgQUxPRworICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwgLy8gZm9yIEltYWdlQ29weQorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsIC8vIGZvciBNdXRleGVkCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKKworICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKK30KKworLy8gcHVibGljIGRlcGVuZGVuY3kgZm9yIHNvZnR3YXJlIGNvZGVjIGltcGxlbWVudGF0aW9uCisvLyB0byBiZSB1c2VkIGJ5IGNvZGUgdW5kZXIgbWVkaWEvY29kZWNzLyogb25seSBhcyBpdHMgc3RhYmlsaXR5IGlzIG5vdCBndWFyYW50ZWVkCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY29kZWMyX3NvZnRfY29tbW9uIiwKKyAgICAgICAgImxpYmN1dGlscyIsIC8vIGZvciBwcm9wZXJ0aWVzCisgICAgICAgICJsaWJsb2ciLCAvLyBmb3IgQUxPRworICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwgLy8gZm9yIEltYWdlQ29weQorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsIC8vIGZvciBDb2xvclV0aWxzIGFuZCBNSU1FCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKK30KKworLy8gcHVibGljIGRlcGVuZGVuY3kgZm9yIHNvZnR3YXJlIGNvZGVjIGltcGxlbWVudGF0aW9uCisvLyB0byBiZSB1c2VkIGJ5IGNvZGUgdW5kZXIgbWVkaWEvY29kZWNzLyogb25seQorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3Igc29mdHdhcmUgY29kZWMgaW1wbGVtZW50YXRpb24KKy8vIHRvIGJlIHVzZWQgYnkgY29kZSB1bmRlciBtZWRpYS9jb2RlY3MvKiBvbmx5CitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCit9CisKKy8vIFRFTVA6IHVzZWQgYnkgY2hlZXRzMiBwcm9qZWN0IC0gcmVtb3ZlIHdoZW4gbm8gbG9uZ2VyIHVzZWQKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NpbXBsZV9jb21wb25lbnQiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJTaW1wbGVDMkludGVyZmFjZS5jcHAiLAorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJDb21wb25lbnQuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkNvbXBvbmVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRmMWZlMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJDb21wb25lbnQuY3BwCkBAIC0wLDAgKzEsNjIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTaW1wbGVDMkNvbXBvbmVudCIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gU2ltcGxlQzJDb21wb25lbnQ6OldvcmtRdWV1ZTo6cG9wX2Zyb250KCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmsgPSBzdGQ6Om1vdmUobVF1ZXVlLmZyb250KCkud29yayk7CisgICAgbVF1ZXVlLnBvcF9mcm9udCgpOworICAgIHJldHVybiB3b3JrOworfQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrUXVldWU6OnB1c2hfYmFjayhzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKSB7CisgICAgbVF1ZXVlLnB1c2hfYmFjayh7IHN0ZDo6bW92ZSh3b3JrKSwgTk9fRFJBSU4gfSk7Cit9CisKK2Jvb2wgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtRdWV1ZTo6ZW1wdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIG1RdWV1ZS5lbXB0eSgpOworfQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrUXVldWU6OmNsZWFyKCkgeworICAgIG1RdWV1ZS5jbGVhcigpOworfQorCit1aW50MzJfdCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya1F1ZXVlOjpkcmFpbk1vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1RdWV1ZS5mcm9udCgpLmRyYWluTW9kZTsKK30KKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya1F1ZXVlOjptYXJrRHJhaW4odWludDMyX3QgZHJhaW5Nb2RlKSB7CisgICAgbVF1ZXVlLnB1c2hfYmFjayh7IG51bGxwdHIsIGRyYWluTW9kZSB9KTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2ltcGxlQzJDb21wb25lbnQ6OldvcmtIYW5kbGVyOjpXb3JrSGFuZGxlcigpIDogbVJ1bm5pbmcoZmFsc2UpIHt9CisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtIYW5kbGVyOjpzZXRDb21wb25lbnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxTaW1wbGVDMkNvbXBvbmVudD4gJnRoaXopIHsKKyAgICBtVGhpeiA9IHRoaXo7Cit9CisKK3N0YXRpYyB2b2lkIFJlcGx5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBpbnQzMl90ICplcnIgPSBudWxscHRyKSB7CisgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SWQ7CisgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJZCkpOworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZXJyIiwgKmVycik7CisgICAgfQorICAgIHJlcGx5LT5wb3N0UmVwbHkocmVwbHlJZCk7Cit9CisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtIYW5kbGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxTaW1wbGVDMkNvbXBvbmVudD4gdGhpeiA9IG1UaGl6LmxvY2soKTsKKyAgICBpZiAoIXRoaXopIHsKKyAgICAgICAgQUxPR0QoImNvbXBvbmVudCBub3QgeWV0IHNldDsgbXNnID0gJXMiLCBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlkOworICAgICAgICBpZiAobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJZCkpIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZXJyIiwgQzJfQ09SUlVQVEVEKTsKKyAgICAgICAgICAgIHJlcGx5LT5wb3N0UmVwbHkocmVwbHlJZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFByb2Nlc3M6IHsKKyAgICAgICAgICAgIGlmIChtUnVubmluZykgeworICAgICAgICAgICAgICAgIGlmICh0aGl6LT5wcm9jZXNzUXVldWUoKSkgeworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UHJvY2VzcywgdGhpcykpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiSWdub3JlIHByb2Nlc3MgbWVzc2FnZSBhcyB3ZSdyZSBub3QgcnVubmluZyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdEluaXQ6IHsKKyAgICAgICAgICAgIGludDMyX3QgZXJyID0gdGhpei0+b25Jbml0KCk7CisgICAgICAgICAgICBSZXBseShtc2csICZlcnIpOworICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTdGFydDogeworICAgICAgICAgICAgbVJ1bm5pbmcgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFN0b3A6IHsKKyAgICAgICAgICAgIGludDMyX3QgZXJyID0gdGhpei0+b25TdG9wKCk7CisgICAgICAgICAgICBSZXBseShtc2csICZlcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFJlc2V0OiB7CisgICAgICAgICAgICB0aGl6LT5vblJlc2V0KCk7CisgICAgICAgICAgICBtUnVubmluZyA9IGZhbHNlOworICAgICAgICAgICAgUmVwbHkobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRSZWxlYXNlOiB7CisgICAgICAgICAgICB0aGl6LT5vblJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7CisgICAgICAgICAgICBSZXBseShtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCBtc2c6ICVkIiwgbXNnLT53aGF0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2NsYXNzIFNpbXBsZUMyQ29tcG9uZW50OjpCbG9ja2luZ0Jsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgQmxvY2tpbmdCbG9ja1Bvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgYmFzZSk6IG1CYXNle2Jhc2V9IHt9CisKKyAgICB2aXJ0dWFsIGxvY2FsX2lkX3QgZ2V0TG9jYWxJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1CYXNlLT5nZXRMb2NhbElkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1CYXNlLT5nZXRBbGxvY2F0b3JJZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiogYmxvY2spIHsKKyAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBkbyB7CisgICAgICAgICAgICBzdGF0dXMgPSBtQmFzZS0+ZmV0Y2hMaW5lYXJCbG9jayhjYXBhY2l0eSwgdXNhZ2UsIGJsb2NrKTsKKyAgICAgICAgfSB3aGlsZSAoc3RhdHVzID09IEMyX0JMT0NLSU5HKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoQ2lyY3VsYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNpcmN1bGFyQmxvY2s+KiBibG9jaykgeworICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CYXNlLT5mZXRjaENpcmN1bGFyQmxvY2soY2FwYWNpdHksIHVzYWdlLCBibG9jayk7CisgICAgICAgIH0gd2hpbGUgKHN0YXR1cyA9PSBDMl9CTE9DS0lORyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+KiBibG9jaykgeworICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CYXNlLT5mZXRjaEdyYXBoaWNCbG9jayh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrKTsKKyAgICAgICAgfSB3aGlsZSAoc3RhdHVzID09IEMyX0JMT0NLSU5HKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtQmFzZTsKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBEdW1teVJlYWRWaWV3IDogcHVibGljIEMyUmVhZFZpZXcgeworICAgIER1bW15UmVhZFZpZXcoKSA6IEMyUmVhZFZpZXcoQzJfTk9fSU5JVCkge30KK307CisKK30gIC8vIG5hbWVzcGFjZQorCitTaW1wbGVDMkNvbXBvbmVudDo6U2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpCisgICAgOiBtRHVtbXlSZWFkVmlldyhEdW1teVJlYWRWaWV3KCkpLAorICAgICAgbUludGYoaW50ZiksCisgICAgICBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKKyAgICAgIG1IYW5kbGVyKG5ldyBXb3JrSGFuZGxlcikgeworICAgIG1Mb29wZXItPnNldE5hbWUoaW50Zi0+Z2V0TmFtZSgpLmNfc3RyKCkpOworICAgICh2b2lkKW1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CisgICAgbUxvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlLCBBTkRST0lEX1BSSU9SSVRZX1ZJREVPKTsKK30KKworU2ltcGxlQzJDb21wb25lbnQ6On5TaW1wbGVDMkNvbXBvbmVudCgpIHsKKyAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlci0+aWQoKSk7CisgICAgKHZvaWQpbUxvb3Blci0+c3RvcCgpOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6c2V0TGlzdGVuZXJfdmIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lciwgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgeworICAgIG1IYW5kbGVyLT5zZXRDb21wb25lbnQoc2hhcmVkX2Zyb21fdGhpcygpKTsKKworICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgIGlmIChzdGF0ZS0+bVN0YXRlID09IFJVTk5JTkcpIHsKKyAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICB9IGVsc2UgaWYgKCFtYXlCbG9jaykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JMT0NLSU5HOworICAgICAgICB9CisgICAgfQorICAgIHN0YXRlLT5tTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAvLyBUT0RPOiB3YWl0IGZvciBsaXN0ZW5lciBjaGFuZ2UgdG8gaGF2ZSB0YWtlbiBwbGFjZSBiZWZvcmUgcmV0dXJuaW5nCisgICAgLy8gKGUuZy4gaWYgdGhlcmUgaXMgYW4gb25nb2luZyBsaXN0ZW5lciBjYWxsYmFjaykKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpxdWV1ZV9uYihzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICogY29uc3QgaXRlbXMpIHsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPm1TdGF0ZSAhPSBSVU5OSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgcXVldWVXYXNFbXB0eSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIHF1ZXVlV2FzRW1wdHkgPSBxdWV1ZS0+ZW1wdHkoKTsKKyAgICAgICAgd2hpbGUgKCFpdGVtcy0+ZW1wdHkoKSkgeworICAgICAgICAgICAgcXVldWUtPnB1c2hfYmFjayhzdGQ6Om1vdmUoaXRlbXMtPmZyb250KCkpKTsKKyAgICAgICAgICAgIGl0ZW1zLT5wb3BfZnJvbnQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocXVldWVXYXNFbXB0eSkgeworICAgICAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFByb2Nlc3MsIG1IYW5kbGVyKSktPnBvc3QoKTsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6YW5ub3VuY2VfbmIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJXb3JrT3V0bGluZT4gJml0ZW1zKSB7CisgICAgKHZvaWQpaXRlbXM7CisgICAgcmV0dXJuIEMyX09NSVRURUQ7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpmbHVzaF9zbSgKKyAgICAgICAgZmx1c2hfbW9kZV90IGZsdXNoTW9kZSwgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspIHsKKyAgICAodm9pZClmbHVzaE1vZGU7CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5tU3RhdGUgIT0gUlVOTklORykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBxdWV1ZS0+aW5jR2VuZXJhdGlvbigpOworICAgICAgICAvLyBUT0RPOiBxdWV1ZS0+c3BsaWNlZEJ5KGZsdXNoZWRXb3JrLCBmbHVzaGVkV29yay0+ZW5kKCkpOworICAgICAgICB3aGlsZSAoIXF1ZXVlLT5lbXB0eSgpKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrID0gcXVldWUtPnBvcF9mcm9udCgpOworICAgICAgICAgICAgaWYgKHdvcmspIHsKKyAgICAgICAgICAgICAgICBmbHVzaGVkV29yay0+cHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPFBlbmRpbmdXb3JrPjo6TG9ja2VkIHBlbmRpbmcobVBlbmRpbmdXb3JrKTsKKyAgICAgICAgd2hpbGUgKCFwZW5kaW5nLT5lbXB0eSgpKSB7CisgICAgICAgICAgICBmbHVzaGVkV29yay0+cHVzaF9iYWNrKHN0ZDo6bW92ZShwZW5kaW5nLT5iZWdpbigpLT5zZWNvbmQpKTsKKyAgICAgICAgICAgIHBlbmRpbmctPmVyYXNlKHBlbmRpbmctPmJlZ2luKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6ZHJhaW5fbmIoZHJhaW5fbW9kZV90IGRyYWluTW9kZSkgeworICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+bVN0YXRlICE9IFJVTk5JTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBxdWV1ZVdhc0VtcHR5ID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgcXVldWVXYXNFbXB0eSA9IHF1ZXVlLT5lbXB0eSgpOworICAgICAgICBxdWV1ZS0+bWFya0RyYWluKGRyYWluTW9kZSk7CisgICAgfQorICAgIGlmIChxdWV1ZVdhc0VtcHR5KSB7CisgICAgICAgIChuZXcgQU1lc3NhZ2UoV29ya0hhbmRsZXI6OmtXaGF0UHJvY2VzcywgbUhhbmRsZXIpKS0+cG9zdCgpOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OnN0YXJ0KCkgeworICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgIGlmIChzdGF0ZS0+bVN0YXRlID09IFJVTk5JTkcpIHsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICB9CisgICAgYm9vbCBuZWVkc0luaXQgPSAoc3RhdGUtPm1TdGF0ZSA9PSBVTklOSVRJQUxJWkVEKTsKKyAgICBzdGF0ZS51bmxvY2soKTsKKyAgICBpZiAobmVlZHNJbml0KSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseTsKKyAgICAgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRJbml0LCBtSGFuZGxlcikpLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVwbHkpOworICAgICAgICBpbnQzMl90IGVycjsKKyAgICAgICAgQ0hFQ0socmVwbHktPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gKGMyX3N0YXR1c190KWVycjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIChuZXcgQU1lc3NhZ2UoV29ya0hhbmRsZXI6OmtXaGF0U3RhcnQsIG1IYW5kbGVyKSktPnBvc3QoKTsKKyAgICB9CisgICAgc3RhdGUubG9jaygpOworICAgIHN0YXRlLT5tU3RhdGUgPSBSVU5OSU5HOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OnN0b3AoKSB7CisgICAgQUxPR1YoInN0b3AiKTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPm1TdGF0ZSAhPSBSVU5OSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5tU3RhdGUgPSBTVE9QUEVEOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBxdWV1ZS0+Y2xlYXIoKTsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPFBlbmRpbmdXb3JrPjo6TG9ja2VkIHBlbmRpbmcobVBlbmRpbmdXb3JrKTsKKyAgICAgICAgcGVuZGluZy0+Y2xlYXIoKTsKKyAgICB9CisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgIChuZXcgQU1lc3NhZ2UoV29ya0hhbmRsZXI6OmtXaGF0U3RvcCwgbUhhbmRsZXIpKS0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlcGx5KTsKKyAgICBpbnQzMl90IGVycjsKKyAgICBDSEVDSyhyZXBseS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gKGMyX3N0YXR1c190KWVycjsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6cmVzZXQoKSB7CisgICAgQUxPR1YoInJlc2V0Iik7CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgc3RhdGUtPm1TdGF0ZSA9IFVOSU5JVElBTElaRUQ7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIHF1ZXVlLT5jbGVhcigpOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8UGVuZGluZ1dvcms+OjpMb2NrZWQgcGVuZGluZyhtUGVuZGluZ1dvcmspOworICAgICAgICBwZW5kaW5nLT5jbGVhcigpOworICAgIH0KKyAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CisgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRSZXNldCwgbUhhbmRsZXIpKS0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlcGx5KTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpyZWxlYXNlKCkgeworICAgIEFMT0dWKCJyZWxlYXNlIik7CisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgIChuZXcgQU1lc3NhZ2UoV29ya0hhbmRsZXI6OmtXaGF0UmVsZWFzZSwgbUhhbmRsZXIpKS0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlcGx5KTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gU2ltcGxlQzJDb21wb25lbnQ6OmludGYoKSB7CisgICAgcmV0dXJuIG1JbnRmOworfQorCituYW1lc3BhY2UgeworCitzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHZlYyhzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gcmV0OworICAgIHJldC5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICByZXR1cm4gcmV0OworfQorCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6ZmluaXNoKAorICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LCBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJik+IGZpbGxXb3JrKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8UGVuZGluZ1dvcms+OjpMb2NrZWQgcGVuZGluZyhtUGVuZGluZ1dvcmspOworICAgICAgICBpZiAocGVuZGluZy0+Y291bnQoZnJhbWVJbmRleCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coInVua25vd24gZnJhbWUgaW5kZXg6ICUiIFBSSXU2NCwgZnJhbWVJbmRleCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd29yayA9IHN0ZDo6bW92ZShwZW5kaW5nLT5hdChmcmFtZUluZGV4KSk7CisgICAgICAgIHBlbmRpbmctPmVyYXNlKGZyYW1lSW5kZXgpOworICAgIH0KKyAgICBpZiAod29yaykgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtRXhlY1N0YXRlLmxvY2soKS0+bUxpc3RlbmVyOworICAgICAgICBsaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihzaGFyZWRfZnJvbV90aGlzKCksIHZlYyh3b3JrKSk7CisgICAgICAgIEFMT0dWKCJyZXR1cm5pbmcgcGVuZGluZyB3b3JrIik7CisgICAgfQorfQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpjbG9uZUFuZFNlbmQoCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZjdXJyZW50V29yaywKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICYpPiBmaWxsV29yaykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmsobmV3IEMyV29yayk7CisgICAgaWYgKGN1cnJlbnRXb3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPT0gZnJhbWVJbmRleCkgeworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IGN1cnJlbnRXb3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbCA9IGN1cnJlbnRXb3JrLT5pbnB1dC5vcmRpbmFsOworICAgIH0gZWxzZSB7CisgICAgICAgIE11dGV4ZWQ8UGVuZGluZ1dvcms+OjpMb2NrZWQgcGVuZGluZyhtUGVuZGluZ1dvcmspOworICAgICAgICBpZiAocGVuZGluZy0+Y291bnQoZnJhbWVJbmRleCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coInVua25vd24gZnJhbWUgaW5kZXg6ICUiIFBSSXU2NCwgZnJhbWVJbmRleCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSBwZW5kaW5nLT5hdChmcmFtZUluZGV4KS0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwgPSBwZW5kaW5nLT5hdChmcmFtZUluZGV4KS0+aW5wdXQub3JkaW5hbDsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgIGlmICh3b3JrKSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IG1FeGVjU3RhdGUubG9jaygpLT5tTGlzdGVuZXI7CisgICAgICAgIGxpc3RlbmVyLT5vbldvcmtEb25lX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgdmVjKHdvcmspKTsKKyAgICAgICAgQUxPR1YoImNsb25lZCBhbmQgc2VuZGluZyB3b3JrIik7CisgICAgfQorfQorCitib29sIFNpbXBsZUMyQ29tcG9uZW50Ojpwcm9jZXNzUXVldWUoKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB1aW50NjRfdCBnZW5lcmF0aW9uOworICAgIGludDMyX3QgZHJhaW5Nb2RlOworICAgIGJvb2wgaXNGbHVzaFBlbmRpbmcgPSBmYWxzZTsKKyAgICBib29sIGhhc1F1ZXVlZFdvcmsgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBpZiAocXVldWUtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGdlbmVyYXRpb24gPSBxdWV1ZS0+Z2VuZXJhdGlvbigpOworICAgICAgICBkcmFpbk1vZGUgPSBxdWV1ZS0+ZHJhaW5Nb2RlKCk7CisgICAgICAgIGlzRmx1c2hQZW5kaW5nID0gcXVldWUtPnBvcFBlbmRpbmdGbHVzaCgpOworICAgICAgICB3b3JrID0gcXVldWUtPnBvcF9mcm9udCgpOworICAgICAgICBoYXNRdWV1ZWRXb3JrID0gIXF1ZXVlLT5lbXB0eSgpOworICAgIH0KKyAgICBpZiAoaXNGbHVzaFBlbmRpbmcpIHsKKyAgICAgICAgQUxPR1YoInByb2Nlc3NpbmcgcGVuZGluZyBmbHVzaCIpOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBvbkZsdXNoX3NtKCk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJmbHVzaCBlcnI6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIC8vIFRPRE86IGVycm9yCisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIW1PdXRwdXRCbG9ja1Bvb2wpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gW3RoaXNdIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGRvbid0IHVzZSBxdWVyeV92YgorICAgICAgICAgICAgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0IG91dHB1dEZvcm1hdCgwdSk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IGludGYoKS0+cXVlcnlfdmIoCisgICAgICAgICAgICAgICAgICAgIHsgJm91dHB1dEZvcm1hdCB9LAorICAgICAgICAgICAgICAgICAgICB7IEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSB9LAorICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0sgJiYgZXJyICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJxdWVyeSBlcnIgPSAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IHBvb2xJZCA9CisgICAgICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6R1JBUEhJQworICAgICAgICAgICAgICAgICAgICAgICAgPyBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQworICAgICAgICAgICAgICAgICAgICAgICAgOiBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOworICAgICAgICAgICAgaWYgKHBhcmFtcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQgKm91dHB1dFBvb2xzID0KKyAgICAgICAgICAgICAgICAgICAgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dFBvb2xzICYmIG91dHB1dFBvb2xzLT5mbGV4Q291bnQoKSA+PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHBvb2xJZCA9IG91dHB1dFBvb2xzLT5tLnZhbHVlc1swXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gYmxvY2tQb29sOworICAgICAgICAgICAgZXJyID0gR2V0Q29kZWMyQmxvY2tQb29sKHBvb2xJZCwgc2hhcmVkX2Zyb21fdGhpcygpLCAmYmxvY2tQb29sKTsKKyAgICAgICAgICAgIEFMT0dEKCJVc2luZyBvdXRwdXQgYmxvY2sgcG9vbCB3aXRoIHBvb2xJRCAlbGx1ID0+IGdvdCAlbGx1IC0gJWQiLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBvb2xJZCwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tQb29sID8gYmxvY2tQb29sLT5nZXRMb2NhbElkKCkgOiAxMTEwMDAxMTEpLAorICAgICAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgIG1PdXRwdXRCbG9ja1Bvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEJsb2NraW5nQmxvY2tQb29sPihibG9ja1Bvb2wpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfSgpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gc3RhdGUtPm1MaXN0ZW5lcjsKKyAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgbGlzdGVuZXItPm9uRXJyb3JfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGhhc1F1ZXVlZFdvcms7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXdvcmspIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gZHJhaW4oZHJhaW5Nb2RlLCBtT3V0cHV0QmxvY2tQb29sKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRlLT5tTGlzdGVuZXI7CisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbkVycm9yX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgZXJyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFzUXVldWVkV29yazsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gdXBkYXRlczsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtOiB3b3JrLT5pbnB1dC5jb25maWdVcGRhdGUpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZXMuZW1wbGFjZV9iYWNrKHBhcmFtLmdldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXVwZGF0ZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gaW50ZigpLT5jb25maWdfdmIodXBkYXRlcywgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgQUxPR0QoImFwcGxpZWQgJXp1IGNvbmZpZ1VwZGF0ZXMgPT4gJXMgKCVkKSIsIHVwZGF0ZXMuc2l6ZSgpLCBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoInN0YXJ0IHByb2Nlc3NpbmcgZnJhbWUgIyUiIFBSSXU2NCwgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIC8vIElmIGlucHV0IGJ1ZmZlciBsaXN0IGlzIG5vdCBlbXB0eSwgaXQgbWVhbnMgd2UgaGF2ZSBzb21lIGlucHV0IHRvIHByb2Nlc3Mgb24uCisgICAgLy8gSG93ZXZlciwgaW5wdXQgY291bGQgYmUgYSBudWxsIGJ1ZmZlci4gSW4gc3VjaCBjYXNlLCBjbGVhciB0aGUgYnVmZmVyIGxpc3QKKyAgICAvLyBiZWZvcmUgbWFraW5nIGNhbGwgdG8gcHJvY2VzcygpLgorICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpICYmICF3b3JrLT5pbnB1dC5idWZmZXJzWzBdKSB7CisgICAgICAgIEFMT0dEKCJFbmNvdW50ZXJlZCBudWxsIGlucHV0IGJ1ZmZlci4gQ2xlYXJpbmcgdGhlIGlucHV0IGJ1ZmZlciIpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgfQorICAgIHByb2Nlc3Mod29yaywgbU91dHB1dEJsb2NrUG9vbCk7CisgICAgQUxPR1YoInByb2Nlc3NlZCBmcmFtZSAjJSIgUFJJdTY0LCB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgeworICAgICAgICBNdXRleGVkPFdvcmtRdWV1ZT46OkxvY2tlZCBxdWV1ZShtV29ya1F1ZXVlKTsKKyAgICAgICAgaWYgKHF1ZXVlLT5nZW5lcmF0aW9uKCkgIT0gZ2VuZXJhdGlvbikgeworICAgICAgICAgICAgQUxPR0QoIndvcmsgZm9ybSBvbGQgZ2VuZXJhdGlvbjogd2FzICUiIFBSSXU2NCAiIG5vdyAlIiBQUkl1NjQsCisgICAgICAgICAgICAgICAgICAgIHF1ZXVlLT5nZW5lcmF0aW9uKCksIGdlbmVyYXRpb24pOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9UX0ZPVU5EOworICAgICAgICAgICAgcXVldWUudW5sb2NrKCk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0ZS0+bUxpc3RlbmVyOworICAgICAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5vbldvcmtEb25lX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgdmVjKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHF1ZXVlLmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybiBoYXNRdWV1ZWRXb3JrOworICAgICAgICB9CisgICAgfQorICAgIGlmICh3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCAhPSAwdSkgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgQUxPR1YoInJldHVybmluZyB0aGlzIHdvcmsiKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0ZS0+bUxpc3RlbmVyOworICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgbGlzdGVuZXItPm9uV29ya0RvbmVfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCB2ZWMod29yaykpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJxdWV1ZSBwZW5kaW5nIHdvcmsiKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB1bmV4cGVjdGVkOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPFBlbmRpbmdXb3JrPjo6TG9ja2VkIHBlbmRpbmcobVBlbmRpbmdXb3JrKTsKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIGlmIChwZW5kaW5nLT5jb3VudChmcmFtZUluZGV4KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgdW5leHBlY3RlZCA9IHN0ZDo6bW92ZShwZW5kaW5nLT5hdChmcmFtZUluZGV4KSk7CisgICAgICAgICAgICAgICAgcGVuZGluZy0+ZXJhc2UoZnJhbWVJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZClwZW5kaW5nLT5pbnNlcnQoeyBmcmFtZUluZGV4LCBzdGQ6Om1vdmUod29yaykgfSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVuZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJ1bmV4cGVjdGVkIHBlbmRpbmcgd29yayIpOworICAgICAgICAgICAgdW5leHBlY3RlZC0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRlLT5tTGlzdGVuZXI7CisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbldvcmtEb25lX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgdmVjKHVuZXhwZWN0ZWQpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaGFzUXVldWVkV29yazsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBTaW1wbGVDMkNvbXBvbmVudDo6Y3JlYXRlTGluZWFyQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrKSB7CisgICAgcmV0dXJuIGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgYmxvY2stPm9mZnNldCgpLCBibG9jay0+c2l6ZSgpKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBTaW1wbGVDMkNvbXBvbmVudDo6Y3JlYXRlTGluZWFyQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLT5zaGFyZShvZmZzZXQsIHNpemUsIDo6QzJGZW5jZSgpKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gU2ltcGxlQzJDb21wb25lbnQ6OmNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKSB7CisgICAgcmV0dXJuIGNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2ssIEMyUmVjdChibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gU2ltcGxlQzJDb21wb25lbnQ6OmNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrLCBjb25zdCBDMlJlY3QgJmNyb3ApIHsKKyAgICByZXR1cm4gQzJCdWZmZXI6OkNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2stPnNoYXJlKGNyb3AsIDo6QzJGZW5jZSgpKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJJbnRlcmZhY2UuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkludGVyZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0OWE0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJJbnRlcmZhY2UuY3BwCkBAIC0wLDAgKzEsMzE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTaW1wbGVDMkludGVyZmFjZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworLy8gdXNlIE1lZGlhRGVmcyBoZXJlIHZzLiBNZWRpYUNvZGVjQ29uc3RhbnRzIGFzIHRoaXMgaXMgbm90IE1lZGlhQ29kZWMgc3BlY2lmaWMvZGVwZW5kZW50CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogU2ltcGxlSW50ZXJmYWNlICovCisKK1NpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6QmFzZVBhcmFtcygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmcmVmbGVjdG9yLAorICAgICAgICBDMlN0cmluZyBuYW1lLAorICAgICAgICBDMkNvbXBvbmVudDo6a2luZF90IGtpbmQsCisgICAgICAgIEMyQ29tcG9uZW50Ojpkb21haW5fdCBkb21haW4sCisgICAgICAgIEMyU3RyaW5nIG1lZGlhVHlwZSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IGFsaWFzZXMpCisgICAgOiBDMkludGVyZmFjZUhlbHBlcihyZWZsZWN0b3IpIHsKKyAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTmFtZSwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX05BTUUpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJDb21wb25lbnROYW1lU2V0dGluZz4obmFtZS5jX3N0cigpKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGlmIChhbGlhc2VzLnNpemUoKSkgeworICAgICAgICBDMlN0cmluZyBqb2luZWQ7CisgICAgICAgIGZvciAoY29uc3QgQzJTdHJpbmcgJmFsaWFzIDogYWxpYXNlcykgeworICAgICAgICAgICAgaWYgKGpvaW5lZC5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgIGpvaW5lZCArPSAiLCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBqb2luZWQgKz0gYWxpYXM7CisgICAgICAgIH0KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BbGlhc2VzLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQUxJQVNFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJDb21wb25lbnRBbGlhc2VzU2V0dGluZz4oam9pbmVkLmNfc3RyKCkpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtS2luZCwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0tJTkQpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50S2luZFNldHRpbmcoa2luZCkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtRG9tYWluLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfRE9NQUlOKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudERvbWFpblNldHRpbmcoZG9tYWluKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIC8vIHNpbXBsZSBpbnRlcmZhY2VzIGhhdmUgc2luZ2xlIHN0cmVhbXMKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRTdHJlYW1Db3VudCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0NPVU5UKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRTdHJlYW1Db3VudFR1bmluZzo6aW5wdXQoMSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0U3RyZWFtQ291bnQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQ09VTlQpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydFN0cmVhbUNvdW50VHVuaW5nOjpvdXRwdXQoMSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAvLyBzZXQgdXAgYnVmZmVyIGZvcm1hdHMgYW5kIGFsbG9jYXRvcnMKKworICAgIC8vIGRlZmF1bHQgdG8gbGluZWFyIGJ1ZmZlcnMgYW5kIG5vIG1lZGlhIHR5cGUKKyAgICBDMkJ1ZmZlckRhdGE6OnR5cGVfdCByYXdCdWZmZXJUeXBlID0gQzJCdWZmZXJEYXRhOjpMSU5FQVI7CisgICAgQzJTdHJpbmcgcmF3TWVkaWFUeXBlOworICAgIEMyQWxsb2NhdG9yOjppZF90IHJhd0FsbG9jYXRvciA9IEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSOworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IHJhd1Bvb2xJZCA9IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgQzJCdWZmZXJEYXRhOjp0eXBlX3QgY29kZWRCdWZmZXJUeXBlID0gQzJCdWZmZXJEYXRhOjpMSU5FQVI7CisgICAgQzJBbGxvY2F0b3I6OmlkX3QgY29kZWRBbGxvY2F0b3IgPSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUjsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBjb2RlZFBvb2xJZCA9IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisKKyAgICBzd2l0Y2ggKGRvbWFpbikgeworICAgICAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0U6CisgICAgICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTzoKKyAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBkZWZpbmUgcmF3IGltYWdlPyBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHRpbWVzdGFtcCBoYW5kbGluZworICAgICAgICAgICAgcmF3QnVmZmVyVHlwZSA9IEMyQnVmZmVyRGF0YTo6R1JBUEhJQzsKKyAgICAgICAgICAgIHJhd01lZGlhVHlwZSA9IE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVzsKKyAgICAgICAgICAgIHJhd0FsbG9jYXRvciA9IEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQzsKKyAgICAgICAgICAgIHJhd1Bvb2xJZCA9IEMyQmxvY2tQb29sOjpCQVNJQ19HUkFQSElDOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTzoKKyAgICAgICAgICAgIHJhd0J1ZmZlclR5cGUgPSBDMkJ1ZmZlckRhdGE6OkxJTkVBUjsKKyAgICAgICAgICAgIHJhd01lZGlhVHlwZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX1JBVzsKKyAgICAgICAgICAgIHJhd0FsbG9jYXRvciA9IEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSOworICAgICAgICAgICAgcmF3UG9vbElkID0gQzJCbG9ja1Bvb2w6OkJBU0lDX0xJTkVBUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGJvb2wgaXNFbmNvZGVyID0ga2luZCA9PSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSOworCisgICAgLy8gaGFuZGxlIHJhdyBkZWNvZGVycworICAgIGlmIChtZWRpYVR5cGUgPT0gcmF3TWVkaWFUeXBlKSB7CisgICAgICAgIGNvZGVkQnVmZmVyVHlwZSA9IHJhd0J1ZmZlclR5cGU7CisgICAgICAgIGNvZGVkQWxsb2NhdG9yID0gcmF3QWxsb2NhdG9yOworICAgICAgICBjb2RlZFBvb2xJZCA9IHJhd1Bvb2xJZDsKKyAgICB9CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgIDB1LCBpc0VuY29kZXIgPyByYXdCdWZmZXJUeXBlIDogY29kZWRCdWZmZXJUeXBlKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgIGlzRW5jb2RlciA/IHJhd01lZGlhVHlwZSA6IG1lZGlhVHlwZSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgIDB1LCBpc0VuY29kZXIgPyBjb2RlZEJ1ZmZlclR5cGUgOiByYXdCdWZmZXJUeXBlKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgIGlzRW5jb2RlciA/IG1lZGlhVHlwZSA6IHJhd01lZGlhVHlwZSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBpbnB1dEFsbG9jYXRvcnNbMV0gPSB7IGlzRW5jb2RlciA/IHJhd0FsbG9jYXRvciA6IGNvZGVkQWxsb2NhdG9yIH07CisgICAgQzJBbGxvY2F0b3I6OmlkX3Qgb3V0cHV0QWxsb2NhdG9yc1sxXSA9IHsgaXNFbmNvZGVyID8gY29kZWRBbGxvY2F0b3IgOiByYXdBbGxvY2F0b3IgfTsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBvdXRwdXRQb29sSWRzWzFdID0geyBpc0VuY29kZXIgPyBjb2RlZFBvb2xJZCA6IHJhd1Bvb2xJZCB9OworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0QWxsb2NhdG9ycywgQzJfUEFSQU1LRVlfSU5QVVRfQUxMT0NBVE9SUykKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dDo6QWxsb2NTaGFyZWQoaW5wdXRBbGxvY2F0b3JzKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1JbnB1dEFsbG9jYXRvcnMsIG0udmFsdWVzWzBdKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1JbnB1dEFsbG9jYXRvcnMsIG0udmFsdWVzKS5pblJhbmdlKDAsIDEpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEFsbG9jYXRvcnMsIEMyX1BBUkFNS0VZX09VVFBVVF9BTExPQ0FUT1JTKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dDo6QWxsb2NTaGFyZWQob3V0cHV0QWxsb2NhdG9ycykpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtT3V0cHV0QWxsb2NhdG9ycywgbS52YWx1ZXNbMF0pLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobU91dHB1dEFsbG9jYXRvcnMsIG0udmFsdWVzKS5pblJhbmdlKDAsIDEpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0Pjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRQb29sSWRzLCBDMl9QQVJBTUtFWV9PVVRQVVRfQkxPQ0tfUE9PTFMpCisgICAgICAgICAgICAud2l0aERlZmF1bHQoQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpBbGxvY1NoYXJlZChvdXRwdXRQb29sSWRzKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1PdXRwdXRQb29sSWRzLCBtLnZhbHVlc1swXSkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtT3V0cHV0UG9vbElkcywgbS52YWx1ZXMpLmluUmFuZ2UoMCwgMSkgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgLy8gYWRkIHN0YXRlbGVzcyBwYXJhbXMKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU3Vic2NyaWJlZFBhcmFtSW5kaWNlcywgQzJfUEFSQU1LRVlfU1VCU0NSSUJFRF9QQVJBTV9JTkRJQ0VTKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyU3Vic2NyaWJlZFBhcmFtSW5kaWNlc1R1bmluZzo6QWxsb2NTaGFyZWQoMHUpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobVN1YnNjcmliZWRQYXJhbUluZGljZXMsIG0udmFsdWVzWzBdKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1TdWJzY3JpYmVkUGFyYW1JbmRpY2VzLCBtLnZhbHVlcykuYW55KCkgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgLyogVE9ETworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUN1cnJlbnRXb3JrT3JkaW5hbCwgQzJfUEFSQU1LRVlfQ1VSUkVOVF9XT1JLKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkN1cnJlbnRXb3JrVHVuaW5nKCkpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtQ3VycmVudFdvcmtPcmRpbmFsLCBtLnRpbWVTdGFtcCkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtQ3VycmVudFdvcmtPcmRpbmFsLCBtLmZyYW1lSW5kZXgpLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUN1cnJlbnRXb3JrT3JkaW5hbCwgbS5jdXN0b21PcmRpbmFsKS5hbnkoKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyQ3VycmVudFdvcmtUdW5pbmc+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUxhc3RJbnB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBDMl9QQVJBTUtFWV9MQVNUX0lOUFVUX1FVRVVFRCkKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJMYXN0V29ya1F1ZXVlZFR1bmluZzo6aW5wdXQoKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1MYXN0SW5wdXRRdWV1ZWRXb3JrT3JkaW5hbCwgbS50aW1lU3RhbXApLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUxhc3RJbnB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLmZyYW1lSW5kZXgpLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUxhc3RJbnB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLmN1c3RvbU9yZGluYWwpLmFueSgpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJMYXN0V29ya1F1ZXVlZFR1bmluZzo6aW5wdXQ+OjpOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUxhc3RPdXRwdXRRdWV1ZWRXb3JrT3JkaW5hbCwgQzJfUEFSQU1LRVlfTEFTVF9PVVRQVVRfUVVFVUVEKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMkxhc3RXb3JrUXVldWVkVHVuaW5nOjpvdXRwdXQoKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1MYXN0T3V0cHV0UXVldWVkV29ya09yZGluYWwsIG0udGltZVN0YW1wKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXN0T3V0cHV0UXVldWVkV29ya09yZGluYWwsIG0uZnJhbWVJbmRleCkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtTGFzdE91dHB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLmN1c3RvbU9yZGluYWwpLmFueSgpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJMYXN0V29ya1F1ZXVlZFR1bmluZzo6b3V0cHV0Pjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk91dE9mTWVtb3J5VHVuaW5nPiBtT3V0T2ZNZW1vcnk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0Q29uZmlnQ291bnRlclR1bmluZzo6aW5wdXQ+IG1JbnB1dENvbmZpZ0NvdW50ZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydENvbmZpZ0NvdW50ZXJUdW5pbmc6Om91dHB1dD4gbU91dHB1dENvbmZpZ0NvdW50ZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29uZmlnQ291bnRlclR1bmluZz4gbURpcmVjdENvbmZpZ0NvdW50ZXI7CisKKyAgICAqLworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9JbnB1dExhdGVuY3koKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVJlcXVlc3RlZElucHV0RGVsYXksIEMyX1BBUkFNS0VZX0lOUFVUX0RFTEFZX1JFUVVFU1QpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjppbnB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsSW5wdXREZWxheSwgQzJfUEFSQU1LRVlfSU5QVVRfREVMQVkpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub091dHB1dExhdGVuY3koKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVJlcXVlc3RlZE91dHB1dERlbGF5LCBDMl9QQVJBTUtFWV9PVVRQVVRfREVMQVlfUkVRVUVTVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc6Om91dHB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsT3V0cHV0RGVsYXksIEMyX1BBUkFNS0VZX09VVFBVVF9ERUxBWSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub1BpcGVsaW5lTGF0ZW5jeSgpIHsKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdGVkUGlwZWxpbmVEZWxheSwgQzJfUEFSQU1LRVlfUElQRUxJTkVfREVMQVlfUkVRVUVTVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJSZXF1ZXN0ZWRQaXBlbGluZURlbGF5VHVuaW5nKDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxQaXBlbGluZURlbGF5LCBDMl9QQVJBTUtFWV9QSVBFTElORV9ERUxBWSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nKDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKK30KKwordm9pZCBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6Om5vUHJpdmF0ZUJ1ZmZlcnMoKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByaXZhdGVBbGxvY2F0b3JzLCBDMl9QQVJBTUtFWV9QUklWQVRFX0FMTE9DQVRPUlMpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQzJQcml2YXRlQWxsb2NhdG9yc1R1bmluZzo6QWxsb2NTaGFyZWQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFByaXZhdGVCdWZmZXJDb3VudCwgQzJfUEFSQU1LRVlfTUFYX1BSSVZBVEVfQlVGRkVSX0NPVU5UKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEMyTWF4UHJpdmF0ZUJ1ZmZlckNvdW50VHVuaW5nOjpBbGxvY1NoYXJlZCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJpdmF0ZVBvb2xJZHMsIEMyX1BBUkFNS0VZX1BSSVZBVEVfQkxPQ0tfUE9PTFMpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQzJQcml2YXRlQmxvY2tQb29sc1R1bmluZzo6QWxsb2NTaGFyZWQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9JbnB1dFJlZmVyZW5jZXMoKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0UmVmZXJlbmNlQWdlLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfUkVGRVJFTkNFX0FHRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhSZWZlcmVuY2VBZ2VUdW5pbmc6OmlucHV0KDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFJlZmVyZW5jZUNvdW50LCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfUkVGRVJFTkNFX0NPVU5UKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjppbnB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub091dHB1dFJlZmVyZW5jZXMoKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heE91dHB1dFJlZmVyZW5jZUFnZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01BWF9SRUZFUkVOQ0VfQUdFKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzo6b3V0cHV0KDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhPdXRwdXRSZWZlcmVuY2VDb3VudCwgQzJfUEFSQU1LRVlfT1VUUFVUX01BWF9SRUZFUkVOQ0VfQ09VTlQpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4UmVmZXJlbmNlQ291bnRUdW5pbmc6Om91dHB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub1RpbWVTdHJldGNoKCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1UaW1lU3RyZXRjaCwgQzJfUEFSQU1LRVlfVElNRV9TVFJFVENIKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudFRpbWVTdHJldGNoVHVuaW5nKDEuZikpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKKy8qCisgICAgQ2xpZW50cyBuZWVkIHRvIGhhbmRsZSB0aGUgZm9sbG93aW5nIGJhc2UgcGFyYW1zIGR1ZSB0byBjdXN0b20gZGVwZW5kZW5jeS4KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFwaUxldmVsU2V0dGluZz4gbUFwaUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFwaUZlYXR1cmVzU2V0dGluZz4gbUFwaUZlYXR1cmVzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nPiBtQXR0cmliOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjppbnB1dD4gbVN1Z2dlc3RlZElucHV0QnVmZmVyQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjpvdXRwdXQ+IG1TdWdnZXN0ZWRPdXRwdXRCdWZmZXJDb3VudDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlRyaXBwZWRUdW5pbmc+IG1UcmlwcGVkOworCisqLworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJDb21wb25lbnQuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkNvbXBvbmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMDI5YTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJDb21wb25lbnQuaApAQCAtMCwwICsxLDI0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0lNUExFX0MyX0NPTVBPTkVOVF9IXworI2RlZmluZSBTSU1QTEVfQzJfQ09NUE9ORU5UX0hfCisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFNpbXBsZUMyQ29tcG9uZW50CisgICAgICAgIDogcHVibGljIEMyQ29tcG9uZW50LCBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxTaW1wbGVDMkNvbXBvbmVudD4geworcHVibGljOgorICAgIGV4cGxpY2l0IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50Zik7CisgICAgdmlydHVhbCB+U2ltcGxlQzJDb21wb25lbnQoKTsKKworICAgIC8vIEMyQ29tcG9uZW50CisgICAgLy8gRnJvbSBDMkNvbXBvbmVudAorICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc2V0TGlzdGVuZXJfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+ICZsaXN0ZW5lciwgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWV1ZV9uYihzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBpdGVtcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBhbm5vdW5jZV9uYihjb25zdCBzdGQ6OnZlY3RvcjxDMldvcmtPdXRsaW5lPiAmaXRlbXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmx1c2hfc20oCisgICAgICAgICAgICBmbHVzaF9tb2RlX3QgbW9kZSwgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZHJhaW5fbmIoZHJhaW5fbW9kZV90IG1vZGUpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc3RhcnQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0b3AoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCByZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYoKSBvdmVycmlkZTsKKworICAgIC8vIGZvciBoYW5kbGVyCisgICAgYm9vbCBwcm9jZXNzUXVldWUoKTsKKworcHJvdGVjdGVkOgorICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgaW50ZXJuYWwgc3RhdGVzIG9mIHRoZSBjb21wb25lbnQgYWNjb3JkaW5nIHRvIHRoZSBjb25maWcgc2V0CisgICAgICogaW4gdGhlIGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBkdXJpbmcgc3RhcnQoKSwgYnV0IG9ubHkgYXQgdGhlIGZpcnN0IGludm9jYXRpb24gb3IKKyAgICAgKiBhZnRlciByZXNldCgpLgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgb25Jbml0KCkgPSAwOworCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgY29tcG9uZW50LgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgb25TdG9wKCkgPSAwOworCisgICAgLyoqCisgICAgICogUmVzZXQgdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgb25SZWxlYXNlKCkgPSAwOworCisgICAgLyoqCisgICAgICogRmx1c2ggdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSBnaXZlbiB3b3JrIGFuZCBmaW5pc2ggcGVuZGluZyB3b3JrIHVzaW5nIGZpbmlzaCgpLgorICAgICAqCisgICAgICogXHBhcmFtW2luLG91dF0gICB3b3JrICAgIHRoZSB3b3JrIHRvIHByb2Nlc3MKKyAgICAgKiBccGFyYW1baW5dICAgICAgIHBvb2wgICAgdGhlIHBvb2wgdG8gdXNlIGZvciBhbGxvY2F0aW5nIG91dHB1dCBibG9ja3MuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpID0gMDsKKworICAgIC8qKgorICAgICAqIERyYWluIHRoZSBjb21wb25lbnQgYW5kIGZpbmlzaCBwZW5kaW5nIHdvcmsgdXNpbmcgZmluaXNoKCkuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dICAgZHJhaW5Nb2RlICAgbW9kZSBvZiBkcmFpbi4KKyAgICAgKiBccGFyYW1baW5dICAgcG9vbCAgICAgICAgdGhlIHBvb2wgdG8gdXNlIGZvciBhbGxvY2F0aW5nIG91dHB1dCBibG9ja3MuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgVGhlIGNvbXBvbmVudCBoYXMgZHJhaW5lZCBhbGwgcGVuZGluZyBvdXRwdXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd29yay4KKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICAgICAgVW5zdXBwb3J0ZWQgbW9kZSAoZS5nLiBEUkFJTl9DSEFJTikKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgPSAwOworCisgICAgLy8gZm9yIGRlcml2ZWQgY2xhc3NlcworICAgIC8qKgorICAgICAqIEZpbmlzaCBwZW5kaW5nIHdvcmsuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHJpZXZlIHRoZSBwZW5kaW5nIHdvcmsgYWNjb3JkaW5nIHRvIHxmcmFtZUluZGV4fCBhbmQKKyAgICAgKiBmZWVkIHRoZSB3b3JrIGludG8gfGZpbGxXb3JrfCBmdW5jdGlvbi4gfGZpbGxXb3JrfCBtdXN0IGJlCisgICAgICogIm5vbi1ibG9ja2luZyIuIE9uY2UgfGZpbGxXb3JrfCByZXR1cm5zIHRoZSBmaWxsZWQgd29yayB3aWxsIGJlIHJldHVybmVkCisgICAgICogdG8gdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gICBmcmFtZUluZGV4ICAgIHRoZSBpbmRleCBvZiB0aGUgcGVuZGluZyB3b3JrCisgICAgICogXHBhcmFtW2luXSAgIGZpbGxXb3JrICAgICAgdGhlIGZ1bmN0aW9uIHRvIGZpbGwgdGhlIHJldHJpZXZlZCB3b3JrLgorICAgICAqLworICAgIHZvaWQgZmluaXNoKHVpbnQ2NF90IGZyYW1lSW5kZXgsIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmKT4gZmlsbFdvcmspOworCisgICAgLyoqCisgICAgICogQ2xvbmUgcGVuZGluZyBvciBjdXJyZW50IHdvcmsgYW5kIHNlbmQgdGhlIHdvcmsgYmFjayB0byBjbGllbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHJpZXZlIGFuZCBjbG9uZSB0aGUgcGVuZGluZyBvciBjdXJyZW50IHdvcmsgYWNjb3JkaW5nCisgICAgICogdG8gfGZyYW1lSW5kZXh8IGFuZCBmZWVkIHRoZSB3b3JrIGludG8gfGZpbGxXb3JrfCBmdW5jdGlvbi4gfGZpbGxXb3JrfAorICAgICAqIG11c3QgYmUgIm5vbi1ibG9ja2luZyIuIE9uY2UgfGZpbGxXb3JrfCByZXR1cm5zIHRoZSBmaWxsZWQgd29yayB3aWxsIGJlCisgICAgICogcmV0dXJuZWQgdG8gdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gICBmcmFtZUluZGV4ICAgIHRoZSBpbmRleCBvZiB0aGUgd29yaworICAgICAqIFxwYXJhbVtpbl0gICBjdXJyZW50V29yayAgIHRoZSBjdXJyZW50IHdvcmsgdW5kZXIgcHJvY2Vzc2luZworICAgICAqIFxwYXJhbVtpbl0gICBmaWxsV29yayAgICAgIHRoZSBmdW5jdGlvbiB0byBmaWxsIHRoZSByZXRyaWV2ZWQgd29yay4KKyAgICAgKi8KKyAgICB2b2lkIGNsb25lQW5kU2VuZCgKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmY3VycmVudFdvcmssCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJik+IGZpbGxXb3JrKTsKKworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjcmVhdGVMaW5lYXJCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY3JlYXRlTGluZWFyQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaywgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2spOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssCisgICAgICAgICAgICBjb25zdCBDMlJlY3QgJmNyb3ApOworCisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBOT19EUkFJTiA9IH4wdTsKKworICAgIEMyUmVhZFZpZXcgbUR1bW15UmVhZFZpZXc7CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBtSW50ZjsKKworICAgIGNsYXNzIFdvcmtIYW5kbGVyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGVudW0geworICAgICAgICAgICAga1doYXRQcm9jZXNzLAorICAgICAgICAgICAga1doYXRJbml0LAorICAgICAgICAgICAga1doYXRTdGFydCwKKyAgICAgICAgICAgIGtXaGF0U3RvcCwKKyAgICAgICAgICAgIGtXaGF0UmVzZXQsCisgICAgICAgICAgICBrV2hhdFJlbGVhc2UsCisgICAgICAgIH07CisKKyAgICAgICAgV29ya0hhbmRsZXIoKTsKKyAgICAgICAgfldvcmtIYW5kbGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgICAgIHZvaWQgc2V0Q29tcG9uZW50KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxTaW1wbGVDMkNvbXBvbmVudD4gJnRoaXopOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6d2Vha19wdHI8U2ltcGxlQzJDb21wb25lbnQ+IG1UaGl6OworICAgICAgICBib29sIG1SdW5uaW5nOworICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgICAgVU5JTklUSUFMSVpFRCwKKyAgICAgICAgU1RPUFBFRCwKKyAgICAgICAgUlVOTklORywKKyAgICB9OworCisgICAgc3RydWN0IEV4ZWNTdGF0ZSB7CisgICAgICAgIEV4ZWNTdGF0ZSgpIDogbVN0YXRlKFVOSU5JVElBTElaRUQpIHt9CisKKyAgICAgICAgaW50IG1TdGF0ZTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIH07CisgICAgTXV0ZXhlZDxFeGVjU3RhdGU+IG1FeGVjU3RhdGU7CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworICAgIHNwPFdvcmtIYW5kbGVyPiBtSGFuZGxlcjsKKworICAgIGNsYXNzIFdvcmtRdWV1ZSB7CisgICAgcHVibGljOgorICAgICAgICBpbmxpbmUgV29ya1F1ZXVlKCkgOiBtRmx1c2goZmFsc2UpLCBtR2VuZXJhdGlvbigwdWwpIHt9CisKKyAgICAgICAgaW5saW5lIHVpbnQ2NF90IGdlbmVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtR2VuZXJhdGlvbjsgfQorICAgICAgICBpbmxpbmUgdm9pZCBpbmNHZW5lcmF0aW9uKCkgeyArK21HZW5lcmF0aW9uOyBtRmx1c2ggPSB0cnVlOyB9CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gcG9wX2Zyb250KCk7CisgICAgICAgIHZvaWQgcHVzaF9iYWNrKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmspOworICAgICAgICBib29sIGVtcHR5KCkgY29uc3Q7CisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSgpIGNvbnN0OworICAgICAgICB2b2lkIG1hcmtEcmFpbih1aW50MzJfdCBkcmFpbk1vZGUpOworICAgICAgICBpbmxpbmUgYm9vbCBwb3BQZW5kaW5nRmx1c2goKSB7CisgICAgICAgICAgICBib29sIGZsdXNoID0gbUZsdXNoOworICAgICAgICAgICAgbUZsdXNoID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gZmx1c2g7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBjbGVhcigpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGU7CisgICAgICAgIH07CisKKyAgICAgICAgYm9vbCBtRmx1c2g7CisgICAgICAgIHVpbnQ2NF90IG1HZW5lcmF0aW9uOworICAgICAgICBzdGQ6Omxpc3Q8RW50cnk+IG1RdWV1ZTsKKyAgICB9OworICAgIE11dGV4ZWQ8V29ya1F1ZXVlPiBtV29ya1F1ZXVlOworCisgICAgdHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBQZW5kaW5nV29yazsKKyAgICBNdXRleGVkPFBlbmRpbmdXb3JrPiBtUGVuZGluZ1dvcms7CisKKyAgICBjbGFzcyBCbG9ja2luZ0Jsb2NrUG9vbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QmxvY2tpbmdCbG9ja1Bvb2w+IG1PdXRwdXRCbG9ja1Bvb2w7CisKKyAgICBTaW1wbGVDMkNvbXBvbmVudCgpID0gZGVsZXRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTSU1QTEVfQzJfQ09NUE9ORU5UX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJJbnRlcmZhY2UuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNTFkM2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJJbnRlcmZhY2UuaApAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TSU1QTEVfQzJfSU5URVJGQUNFX0hfCisjZGVmaW5lIEFORFJPSURfU0lNUExFX0MyX0lOVEVSRkFDRV9IXworCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFdyYXAgYSBjb21tb24gaW50ZXJmYWNlIG9iamVjdCAoc3VjaCBhcyBDb2RlYzJDbGllbnQ6OkludGVyZmFjZSwgb3IgQzJJbnRlcmZhY2VIZWxwZXIgaW50bworICogYSBDMkNvbXBvbmVudEludGVyZmFjZS4KKyAqCisgKiBccGFyYW0gVCBjb21tb24gaW50ZXJmYWNlIHR5cGUKKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBTaW1wbGVDMkludGVyZmFjZSA6IHB1YmxpYyBDMkNvbXBvbmVudEludGVyZmFjZSB7CitwdWJsaWM6CisgICAgU2ltcGxlQzJJbnRlcmZhY2UoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VD4gJmltcGwpCisgICAgICAgIDogbU5hbWUobmFtZSksCisgICAgICAgICAgbUlkKGlkKSwKKyAgICAgICAgICBtSW1wbChpbXBsKSB7CisgICAgfQorCisgICAgflNpbXBsZUMySW50ZXJmYWNlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8gRnJvbSBDMkNvbXBvbmVudEludGVyZmFjZQorICAgIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtTmFtZTsgfQorICAgIGMyX25vZGVfaWRfdCBnZXRJZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1JZDsgfQorICAgIGMyX3N0YXR1c190IHF1ZXJ5X3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cXVlcnkoc3RhY2tQYXJhbXMsIGhlYXBQYXJhbUluZGljZXMsIG1heUJsb2NrLCBoZWFwUGFyYW1zKTsKKyAgICB9CisgICAgYzJfc3RhdHVzX3QgY29uZmlnX3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwtPmNvbmZpZyhwYXJhbXMsIG1heUJsb2NrLCBmYWlsdXJlcyk7CisgICAgfQorICAgIGMyX3N0YXR1c190IGNyZWF0ZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QpIG92ZXJyaWRlIHsgcmV0dXJuIEMyX09NSVRURUQ7IH0KKyAgICBjMl9zdGF0dXNfdCByZWxlYXNlVHVubmVsX3NtKGMyX25vZGVfaWRfdCkgb3ZlcnJpZGUgeyByZXR1cm4gQzJfT01JVFRFRDsgfQorICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKiBjb25zdCBwYXJhbXMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5xdWVyeVN1cHBvcnRlZFBhcmFtcyhwYXJhbXMpOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc192YigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhmaWVsZHMsIG1heUJsb2NrKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQzJTdHJpbmcgbU5hbWU7CisgICAgY29uc3QgYzJfbm9kZV9pZF90IG1JZDsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VD4gbUltcGw7Cit9OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3NlcyBmb3IgY29tbW9uIGludGVyZmFjZXMuCisgKi8KK3RlbXBsYXRlPD4KK2NsYXNzIFNpbXBsZUMySW50ZXJmYWNlPHZvaWQ+IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBCYXNlIENvZGVjIDIuMCBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBhbGwgY29tcG9uZW50cy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQmFzZVBhcmFtcyA6IEMySW50ZXJmYWNlSGVscGVyIHsKKyAgICAgICAgZXhwbGljaXQgQmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIsCisgICAgICAgICAgICAgICAgQzJTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6a2luZF90IGtpbmQsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OmRvbWFpbl90IGRvbWFpbiwKKyAgICAgICAgICAgICAgICBDMlN0cmluZyBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IGFsaWFzZXMgPSBzdGQ6OnZlY3RvcjxDMlN0cmluZz4oKSk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgaGFzIG5vIGlucHV0IGxhdGVuY3kuIE90aGVyd2lzZSwgY29tcG9uZW50IG11c3QKKyAgICAgICAgLy8vIGFkZCBzdXBwb3J0IGZvciBDMlBvcnRSZXF1ZXN0ZWREZWxheVR1bmluZzo6aW5wdXQgYW5kIEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dC4KKyAgICAgICAgdm9pZCBub0lucHV0TGF0ZW5jeSgpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGhhcyBubyBvdXRwdXQgbGF0ZW5jeS4gT3RoZXJ3aXNlLCBjb21wb25lbnQgbXVzdAorICAgICAgICAvLy8gYWRkIHN1cHBvcnQgZm9yIEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjpvdXRwdXQgYW5kIEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQuCisgICAgICAgIHZvaWQgbm9PdXRwdXRMYXRlbmN5KCk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgaGFzIG5vIHBpcGVsaW5lIGxhdGVuY3kuIE90aGVyd2lzZSwgY29tcG9uZW50IG11c3QKKyAgICAgICAgLy8vIGFkZCBzdXBwb3J0IGZvciBDMlJlcXVlc3RlZFBpcGVsaW5lRGVsYXlUdW5pbmcgYW5kIEMyQWN0dWFsUGlwZWxpbmVEZWxheVR1bmluZy4KKyAgICAgICAgdm9pZCBub1BpcGVsaW5lTGF0ZW5jeSgpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGhhcyBubyBuZWVkIGZvciBwcml2YXRlIGJ1ZmZlcnMuIE90aGVyd2lzZSwgY29tcG9uZW50IG11c3QKKyAgICAgICAgLy8vIGFkZCBzdXBwb3J0IGZvciBDMk1heFByaXZhdGVCdWZmZXJDb3VudFR1bmluZywgQzJQcml2YXRlQWxsb2NhdG9yc1R1bmluZyBhbmQKKyAgICAgICAgLy8vIEMyUHJpdmF0ZUJsb2NrUG9vbHNUdW5pbmcuCisgICAgICAgIHZvaWQgbm9Qcml2YXRlQnVmZmVycygpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGhvbGRzIG5vIHJlZmVyZW5jZXMgdG8gaW5wdXQgYnVmZmVycy4gT3RoZXJ3aXNlLCBjb21wb25lbnQKKyAgICAgICAgLy8vIG11c3QgYWRkIHN1cHBvcnQgZm9yIEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOjppbnB1dCBhbmQKKyAgICAgICAgLy8vIEMyU3RyZWFtTWF4UmVmZXJlbmNlQ291bnRUdW5pbmc6OmlucHV0LgorICAgICAgICB2b2lkIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgaG9sZHMgbm8gcmVmZXJlbmNlcyB0byBvdXRwdXQgYnVmZmVycy4gT3RoZXJ3aXNlLCBjb21wb25lbnQKKyAgICAgICAgLy8vIG11c3QgYWRkIHN1cHBvcnQgZm9yIEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOjpvdXRwdXQgYW5kCisgICAgICAgIC8vLyBDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjpvdXRwdXQuCisgICAgICAgIHZvaWQgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisKKyAgICAgICAgLy8vIE1hcmtzIHRoYXQgdGhpcyBjb21wb25lbnQgZG9lcyBub3Qgc3RyZXRjaCB0aW1lLiBPdGhlcndpc2UsIGNvbXBvbmVudAorICAgICAgICAvLy8gbXVzdCBhZGQgc3VwcG9ydCBmb3IgQzJDb21wb25lbnRUaW1lU3RyZXRjaFR1bmluZy4KKyAgICAgICAgdm9pZCBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQXBpTGV2ZWxTZXR0aW5nPiBtQXBpTGV2ZWw7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFwaUZlYXR1cmVzU2V0dGluZz4gbUFwaUZlYXR1cmVzOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBsYXRmb3JtTGV2ZWxTZXR0aW5nPiBtUGxhdGZvcm1MZXZlbDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGxhdGZvcm1GZWF0dXJlc1NldHRpbmc+IG1QbGF0Zm9ybUZlYXR1cmVzOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudE5hbWVTZXR0aW5nPiBtTmFtZTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmc+IG1BbGlhc2VzOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRLaW5kU2V0dGluZz4gbUtpbmQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudERvbWFpblNldHRpbmc+IG1Eb21haW47CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nPiBtQXR0cmliOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRUaW1lU3RyZXRjaFR1bmluZz4gbVRpbWVTdHJldGNoOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc6OmlucHV0PiBtUmVxdWVzdGVkSW5wdXREZWxheTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjpvdXRwdXQ+IG1SZXF1ZXN0ZWRPdXRwdXREZWxheTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVxdWVzdGVkUGlwZWxpbmVEZWxheVR1bmluZz4gbVJlcXVlc3RlZFBpcGVsaW5lRGVsYXk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dD4gbUFjdHVhbElucHV0RGVsYXk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0PiBtQWN0dWFsT3V0cHV0RGVsYXk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFjdHVhbFBpcGVsaW5lRGVsYXlUdW5pbmc+IG1BY3R1YWxQaXBlbGluZURlbGF5OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzo6aW5wdXQ+IG1NYXhJbnB1dFJlZmVyZW5jZUFnZTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UmVmZXJlbmNlQ291bnRUdW5pbmc6OmlucHV0PiBtTWF4SW5wdXRSZWZlcmVuY2VDb3VudDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOjpvdXRwdXQ+IG1NYXhPdXRwdXRSZWZlcmVuY2VBZ2U7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjpvdXRwdXQ+IG1NYXhPdXRwdXRSZWZlcmVuY2VDb3VudDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTWF4UHJpdmF0ZUJ1ZmZlckNvdW50VHVuaW5nPiBtTWF4UHJpdmF0ZUJ1ZmZlckNvdW50OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRTdHJlYW1Db3VudFR1bmluZzo6aW5wdXQ+IG1JbnB1dFN0cmVhbUNvdW50OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0U3RyZWFtQ291bnRUdW5pbmc6Om91dHB1dD4gbU91dHB1dFN0cmVhbUNvdW50OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc+IG1TdWJzY3JpYmVkUGFyYW1JbmRpY2VzOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0U3VnZ2VzdGVkQnVmZmVyQ291bnRUdW5pbmc6OmlucHV0PiBtU3VnZ2VzdGVkSW5wdXRCdWZmZXJDb3VudDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjpvdXRwdXQ+IG1TdWdnZXN0ZWRPdXRwdXRCdWZmZXJDb3VudDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDdXJyZW50V29ya1R1bmluZz4gbUN1cnJlbnRXb3JrT3JkaW5hbDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc6OmlucHV0PiBtTGFzdElucHV0UXVldWVkV29ya09yZGluYWw7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxhc3RXb3JrUXVldWVkVHVuaW5nOjpvdXRwdXQ+IG1MYXN0T3V0cHV0UXVldWVkV29ya09yZGluYWw7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0PiBtSW5wdXRBbGxvY2F0b3JzOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0PiBtT3V0cHV0QWxsb2NhdG9yczsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUHJpdmF0ZUFsbG9jYXRvcnNUdW5pbmc+IG1Qcml2YXRlQWxsb2NhdG9yczsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dD4gbU91dHB1dFBvb2xJZHM7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlByaXZhdGVCbG9ja1Bvb2xzVHVuaW5nPiBtUHJpdmF0ZVBvb2xJZHM7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyVHJpcHBlZFR1bmluZz4gbVRyaXBwZWQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk91dE9mTWVtb3J5VHVuaW5nPiBtT3V0T2ZNZW1vcnk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydENvbmZpZ0NvdW50ZXJUdW5pbmc6OmlucHV0PiBtSW5wdXRDb25maWdDb3VudGVyOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0Q29uZmlnQ291bnRlclR1bmluZzo6b3V0cHV0PiBtT3V0cHV0Q29uZmlnQ291bnRlcjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29uZmlnQ291bnRlclR1bmluZz4gbURpcmVjdENvbmZpZ0NvdW50ZXI7CisgICAgfTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit1c2luZyBTaW1wbGVJbnRlcmZhY2UgPSBTaW1wbGVDMkludGVyZmFjZTxUPjsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgLi4uQXJncz4KK3N0ZDo6c2hhcmVkX3B0cjxUPiBBbGxvY1NoYXJlZFN0cmluZyhjb25zdCBBcmdzKCYuLi4gYXJncyksIGNvbnN0IGNoYXIgKnN0cikgeworICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oc3RyKSArIDE7CisgICAgc3RkOjpzaGFyZWRfcHRyPFQ+IHJldCA9IFQ6OkFsbG9jU2hhcmVkKGxlbiwgYXJncy4uLik7CisgICAgc3RyY3B5KHJldC0+bS52YWx1ZSwgc3RyKTsKKyAgICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi5BcmdzPgorc3RkOjpzaGFyZWRfcHRyPFQ+IEFsbG9jU2hhcmVkU3RyaW5nKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSwgY29uc3Qgc3RkOjpzdHJpbmcgJnN0cikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiByZXQgPSBUOjpBbGxvY1NoYXJlZChzdHIubGVuZ3RoKCkgKyAxLCBhcmdzLi4uKTsKKyAgICBzdHJjcHkocmV0LT5tLnZhbHVlLCBzdHIuY19zdHIoKSk7CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU2V0dGVyIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxUPjo6dHlwZSB0eXBlOworCisgICAgc3RhdGljIEMyUiBOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLCBDMkludGVyZmFjZUhlbHBlcjo6QzJQPHR5cGU+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgcmV0dXJuIG1lLkYobWUudi52YWx1ZSkudmFsaWRhdGVQb3NzaWJsZShtZS52LnZhbHVlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLCBDMkludGVyZmFjZUhlbHBlcjo6QzJQPHR5cGU+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1lLnYuZmxleENvdW50KCk7ICsraXgpIHsKKyAgICAgICAgICAgIHJlcy5wbHVzKG1lLkYobWUudi5tLnZhbHVlc1tpeF0pLnZhbGlkYXRlUG9zc2libGUobWUudi5tLnZhbHVlc1tpeF0pKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU3RyaWN0VmFsdWVXaXRoTm9EZXBzKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIGNvbnN0IEMySW50ZXJmYWNlSGVscGVyOjpDMlA8dHlwZT4gJm9sZCwKKyAgICAgICAgICAgIEMySW50ZXJmYWNlSGVscGVyOjpDMlA8dHlwZT4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAoIW1lLkYobWUudi52YWx1ZSkuc3VwcG9ydHNOb3cobWUudi52YWx1ZSkpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnZhbHVlID0gb2xkLnYudmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1lLkYobWUudi52YWx1ZSkudmFsaWRhdGVQb3NzaWJsZShtZS52LnZhbHVlKTsKKyAgICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfU0lNUExFX0MyX0lOVEVSRkFDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZjY4OWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzNiBAQAorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiY29kZWMycGxheSIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImNvZGVjMi5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL2NvZGVjMi5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL2NvZGVjMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJjZjU0NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvY29kZWMyLmNwcApAQCAtMCwwICsxLDQ4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSA8dGhyZWFkPgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMiIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKKyNpbmNsdWRlIDxndWkvR0xDb25zdW1lci5oPgorI2luY2x1ZGUgPGd1aS9JUHJvZHVjZXJMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOworCituYW1lc3BhY2UgeworCitjbGFzcyBMaW5lYXJCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IExpbmVhckJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrKQorICAgICAgICA6IEMyQnVmZmVyKHsgYmxvY2stPnNoYXJlKGJsb2NrLT5vZmZzZXQoKSwgYmxvY2stPnNpemUoKSwgOjpDMkZlbmNlKCkpIH0pIHt9Cit9OworCitjbGFzcyBMaXN0ZW5lcjsKKworY2xhc3MgU2ltcGxlUGxheWVyIHsKK3B1YmxpYzoKKyAgICBTaW1wbGVQbGF5ZXIoKTsKKyAgICB+U2ltcGxlUGxheWVyKCk7CisKKyAgICB2b2lkIG9uV29ya0RvbmUoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcyk7CisgICAgdm9pZCBvblRyaXBwZWQoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBzZXR0aW5nUmVzdWx0KTsKKyAgICB2b2lkIG9uRXJyb3Ioc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LCB1aW50MzJfdCBlcnJvckNvZGUpOworCisgICAgdm9pZCBwbGF5KGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworCisgICAgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICAgc3A8SVByb2R1Y2VyTGlzdGVuZXI+IG1Qcm9kdWNlckxpc3RlbmVyOworCisgICAgc3RkOjphdG9taWNfaW50IG1MaW5lYXJQb29sSWQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY0lvbjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1MaW5lYXJQb29sOworCisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6Om11dGV4IG1Qcm9jZXNzZWRMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Qcm9jZXNzZWRDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtUHJvY2Vzc2VkV29yazsKKworICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOworICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gbUNvbXBvc2VyQ2xpZW50OworICAgIHNwPFN1cmZhY2VDb250cm9sPiBtQ29udHJvbDsKK307CisKK2NsYXNzIExpc3RlbmVyIDogcHVibGljIEMyQ29tcG9uZW50OjpMaXN0ZW5lciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgTGlzdGVuZXIoU2ltcGxlUGxheWVyICp0aGl6KSA6IG1UaGlzKHRoaXopIHt9CisgICAgdmlydHVhbCB+TGlzdGVuZXIoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrRG9uZV9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB3b3JrSXRlbXMpIG92ZXJyaWRlIHsKKyAgICAgICAgbVRoaXMtPm9uV29ya0RvbmUoY29tcG9uZW50LCBzdGQ6Om1vdmUod29ya0l0ZW1zKSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uVHJpcHBlZF9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gc2V0dGluZ1Jlc3VsdCkgb3ZlcnJpZGUgeworICAgICAgICBtVGhpcy0+b25UcmlwcGVkKGNvbXBvbmVudCwgc2V0dGluZ1Jlc3VsdCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3JfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGVycm9yQ29kZSkgb3ZlcnJpZGUgeworICAgICAgICBtVGhpcy0+b25FcnJvcihjb21wb25lbnQsIGVycm9yQ29kZSk7CisgICAgfQorCitwcml2YXRlOgorICAgIFNpbXBsZVBsYXllciAqIGNvbnN0IG1UaGlzOworfTsKKworCitTaW1wbGVQbGF5ZXI6OlNpbXBsZVBsYXllcigpCisgICAgOiBtTGlzdGVuZXIobmV3IExpc3RlbmVyKHRoaXMpKSwKKyAgICAgIG1Qcm9kdWNlckxpc3RlbmVyKG5ldyBEdW1teVByb2R1Y2VyTGlzdGVuZXIpLAorICAgICAgbUxpbmVhclBvb2xJZChDMkJsb2NrUG9vbDo6UExBVEZPUk1fU1RBUlQpLAorICAgICAgbUNvbXBvc2VyQ2xpZW50KG5ldyBTdXJmYWNlQ29tcG9zZXJDbGllbnQpIHsKKyAgICBDSEVDS19FUShtQ29tcG9zZXJDbGllbnQtPmluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0gR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgIENIRUNLX0VRKHN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUiwgJm1BbGxvY0lvbiksIEMyX09LKTsKKyAgICBtTGluZWFyUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KG1BbGxvY0lvbiwgbUxpbmVhclBvb2xJZCsrKTsKKworICAgIG1Db250cm9sID0gbUNvbXBvc2VyQ2xpZW50LT5jcmVhdGVTdXJmYWNlKAorICAgICAgICAgICAgU3RyaW5nOCgiQSBTdXJmYWNlIiksCisgICAgICAgICAgICAxMjgwLAorICAgICAgICAgICAgODAwLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyKTsKKyAgICAgICAgICAgIC8vUElYRUxfRk9STUFUX1JHQl81NjUpOworCisgICAgQ0hFQ0sobUNvbnRyb2wgIT0gbnVsbHB0cik7CisgICAgQ0hFQ0sobUNvbnRyb2wtPmlzVmFsaWQoKSk7CisKKyAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OlRyYW5zYWN0aW9ue30KKyAgICAgICAgICAgIC5zZXRMYXllcihtQ29udHJvbCwgSU5UX01BWCkKKyAgICAgICAgICAgIC5zaG93KG1Db250cm9sKQorICAgICAgICAgICAgLmFwcGx5KCk7CisKKyAgICBtU3VyZmFjZSA9IG1Db250cm9sLT5nZXRTdXJmYWNlKCk7CisgICAgQ0hFQ0sobVN1cmZhY2UgIT0gbnVsbHB0cik7CisgICAgbVN1cmZhY2UtPmNvbm5lY3QoTkFUSVZFX1dJTkRPV19BUElfQ1BVLCBtUHJvZHVjZXJMaXN0ZW5lcik7Cit9CisKK1NpbXBsZVBsYXllcjo6flNpbXBsZVBsYXllcigpIHsKKyAgICBtQ29tcG9zZXJDbGllbnQtPmRpc3Bvc2UoKTsKK30KKwordm9pZCBTaW1wbGVQbGF5ZXI6Om9uV29ya0RvbmUoCisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB3b3JrSXRlbXMpIHsKKyAgICBBTE9HVigiU2ltcGxlUGxheWVyOjpvbldvcmtEb25lIik7CisgICAgKHZvaWQpIGNvbXBvbmVudDsKKyAgICBVTG9jayBsKG1Qcm9jZXNzZWRMb2NrKTsKKyAgICBmb3IgKGF1dG8gJiBpdGVtIDogd29ya0l0ZW1zKSB7CisgICAgICAgIG1Qcm9jZXNzZWRXb3JrLnB1c2hfYmFjayhzdGQ6Om1vdmUoaXRlbSkpOworICAgIH0KKyAgICBtUHJvY2Vzc2VkQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKK30KKwordm9pZCBTaW1wbGVQbGF5ZXI6Om9uVHJpcHBlZCgKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gc2V0dGluZ1Jlc3VsdCkgeworICAgICh2b2lkKSBjb21wb25lbnQ7CisgICAgKHZvaWQpIHNldHRpbmdSZXN1bHQ7CisgICAgLy8gVE9ETworfQorCit2b2lkIFNpbXBsZVBsYXllcjo6b25FcnJvcihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsIHVpbnQzMl90IGVycm9yQ29kZSkgeworICAgICh2b2lkKSBjb21wb25lbnQ7CisgICAgKHZvaWQpIGVycm9yQ29kZTsKKyAgICAvLyBUT0RPCit9CisKK3ZvaWQgU2ltcGxlUGxheWVyOjpwbGF5KGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSkgeworICAgIEFMT0dWKCJTaW1wbGVQbGF5ZXI6OnBsYXkiKTsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICh2b2lkKSBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2Uoc291cmNlLT5nZXRGb3JtYXQoKSwgJmZvcm1hdCk7CisKKyAgICBzcDxBQnVmZmVyPiBjc2QwLCBjc2QxOworICAgIGZvcm1hdC0+ZmluZEJ1ZmZlcigiY3NkLTAiLCAmY3NkMCk7CisgICAgZm9ybWF0LT5maW5kQnVmZmVyKCJjc2QtMSIsICZjc2QxKTsKKworICAgIHN0YXR1c190IGVyciA9IHNvdXJjZS0+c3RhcnQoKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb3VyY2UgcmV0dXJuZWQgZXJyb3IgJWQgKDB4JTA4eClcbiIsIGVyciwgZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSA9IEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgICAodm9pZClzdG9yZS0+Y3JlYXRlQ29tcG9uZW50KCJjMi5hbmRyb2lkLmF2Yy5kZWNvZGVyIiwgJmNvbXBvbmVudCk7CisKKyAgICAodm9pZCljb21wb25lbnQtPnNldExpc3RlbmVyX3ZiKG1MaXN0ZW5lciwgQzJfRE9OVF9CTE9DSyk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dD4gcG9vbHMgPQorICAgICAgICBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKHsgKHVpbnQ2NF90KUMyQmxvY2tQb29sOjpCQVNJQ19HUkFQSElDIH0pOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiByZXN1bHQ7CisgICAgKHZvaWQpY29tcG9uZW50LT5pbnRmKCktPmNvbmZpZ192Yih7cG9vbHMuZ2V0KCl9LCBDMl9ET05UX0JMT0NLLCAmcmVzdWx0KTsKKyAgICBjb21wb25lbnQtPnN0YXJ0KCk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7ICsraSkgeworICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICB9CisKKyAgICBzdGQ6OmF0b21pY19ib29sIHJ1bm5pbmcodHJ1ZSk7CisgICAgc3RkOjp0aHJlYWQgc3VyZmFjZVRocmVhZChbdGhpcywgJnJ1bm5pbmddKCkgeworICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmaWdicCA9IG1TdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgICAgIHdoaWxlIChydW5uaW5nKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVMb2NrIGwobVByb2Nlc3NlZExvY2spOworICAgICAgICAgICAgICAgIGlmIChtUHJvY2Vzc2VkV29yay5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Qcm9jZXNzZWRDb25kaXRpb24ud2FpdF9mb3IobCwgMTAwbXMpOworICAgICAgICAgICAgICAgICAgICBpZiAobVByb2Nlc3NlZFdvcmsuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd29yay5zd2FwKG1Qcm9jZXNzZWRXb3JrLmZyb250KCkpOworICAgICAgICAgICAgICAgIG1Qcm9jZXNzZWRXb3JrLnBvcF9mcm9udCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHNsb3Q7CisgICAgICAgICAgICBzcDxGZW5jZT4gZmVuY2U7CisgICAgICAgICAgICBBTE9HVigiUmVuZGVyOiBGcmFtZSAjJWxsZCIsIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla2xsKCkpOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmb3V0cHV0ID0gd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnNbMF07CisgICAgICAgICAgICBpZiAob3V0cHV0KSB7CisgICAgICAgICAgICAgICAgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayBibG9jayA9IG91dHB1dC0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqZ3JhbGxvY0hhbmRsZSA9IFVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoYmxvY2suaGFuZGxlKCkpOworICAgICAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcihuZXcgR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYWxsb2NIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljQnVmZmVyOjpDTE9ORV9IQU5ETEUsCisgICAgICAgICAgICAgICAgICAgICAgICBibG9jay53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2suaGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lWMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KUdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sCisgICAgICAgICAgICAgICAgICAgICAgICBibG9jay53aWR0aCgpKSk7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoZ3JhbGxvY0hhbmRsZSk7CisKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBpZ2JwLT5hdHRhY2hCdWZmZXIoJnNsb3QsIGJ1ZmZlcik7CisKKyAgICAgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IHFiaSgKKyAgICAgICAgICAgICAgICAgICAgICAgICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgKiAxMDAwbGwpLnBlZWtsbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1VOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICBSZWN0KGJsb2NrLndpZHRoKCksIGJsb2NrLmhlaWdodCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVywKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBGZW5jZTo6Tk9fRkVOQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBxYm87CisgICAgICAgICAgICAgICAgZXJyID0gaWdicC0+cXVldWVCdWZmZXIoc2xvdCwgcWJpLCAmcWJvKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKworICAgICAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJyZW5kZXIgbG9vcCBmaW5pc2hlZCIpOworICAgIH0pOworCisgICAgbG9uZyBudW1GcmFtZXMgPSAwOworICAgIG1MaW5lYXJQb29sLnJlc2V0KG5ldyBDMlBvb2xlZEJsb2NrUG9vbChtQWxsb2NJb24sIG1MaW5lYXJQb29sSWQrKykpOworCisgICAgZm9yICg7OykgeworICAgICAgICBzaXplX3Qgc2l6ZSA9IDB1OworICAgICAgICB2b2lkICpkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAgPSAwdTsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgPSBudWxscHRyOworICAgICAgICBzcDxBQnVmZmVyPiBjc2Q7CisgICAgICAgIGlmIChjc2QwICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNzZCA9IGNzZDA7CisgICAgICAgICAgICBjc2QwID0gbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIGlmIChjc2QxICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNzZCA9IGNzZDE7CisgICAgICAgICAgICBjc2QxID0gbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNvdXJjZS0+cmVhZCgmYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBDSEVDSyhidWZmZXIgPT0gbnVsbHB0cik7CisKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgQ0hFQ0sobWV0YS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lc3RhbXApKTsKKworICAgICAgICAgICAgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworICAgICAgICAgICAgZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNzZCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzaXplID0gY3NkLT5zaXplKCk7CisgICAgICAgICAgICBkYXRhID0gY3NkLT5kYXRhKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQcmVwYXJlIEMyV29yaworCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgIHdoaWxlICghd29yaykgeworICAgICAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgICAgIGlmICghbVdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29yay5zd2FwKG1Xb3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIDEwMG1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbnVtRnJhbWVzOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgbUxpbmVhclBvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICAgICAmYmxvY2spOworICAgICAgICBDMldyaXRlVmlldyB2aWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkMyTGluZWFyQmxvY2s6Om1hcCgpIGZhaWxlZCA6ICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1lbWNweSh2aWV3LmJhc2UoKSwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmVtcGxhY2VfYmFjayhuZXcgTGluZWFyQnVmZmVyKGJsb2NrKSk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICBBTE9HVigiRnJhbWUgIyVsZCBzaXplID0gJXp1IiwgbnVtRnJhbWVzLCBzaXplKTsKKyAgICAgICAgLy8gRE8gVEhFIERFQ09ESU5HCisgICAgICAgIGNvbXBvbmVudC0+cXVldWVfbmIoJml0ZW1zKTsKKworICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICArK251bUZyYW1lczsKKyAgICB9CisgICAgQUxPR1YoIm1haW4gbG9vcCBmaW5pc2hlZCIpOworICAgIHNvdXJjZS0+c3RvcCgpOworICAgIHJ1bm5pbmcuc3RvcmUoZmFsc2UpOworICAgIHN1cmZhY2VUaHJlYWQuam9pbigpOworCisgICAgY29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgcHJpbnRmKCJcbiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciAqbWUpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBbb3B0aW9uc10gW2lucHV0X2ZpbGVuYW1lXVxuIiwgbWUpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1oKGVscClcbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisKKyAgICBpbnQgcmVzOworICAgIHdoaWxlICgocmVzID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJoIikpID49IDApIHsKKyAgICAgICAgc3dpdGNoIChyZXMpIHsKKyAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYXJnYyAtPSBvcHRpbmQ7CisgICAgYXJndiArPSBvcHRpbmQ7CisKKyAgICBpZiAoYXJnYyA8IDEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZFxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIFNpbXBsZVBsYXllciBwbGF5ZXI7CisKKyAgICBmb3IgKGludCBrID0gMDsgayA8IGFyZ2MgJiYgZXJyID09IE9LOyArK2spIHsKKyAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBhcmd2W2tdOworCisgICAgICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPQorICAgICAgICAgICAgRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21VUkkobnVsbHB0ciAvKiBodHRwU2VydmljZSAqLywgZmlsZW5hbWUpOworCisgICAgICAgIGlmIChzdHJuY2FzZWNtcChmaWxlbmFtZSwgInNpbmU6IiwgNSkgJiYgZGF0YVNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBjcmVhdGUgZGF0YSBzb3VyY2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgVmVjdG9yPHNwPElNZWRpYVNvdXJjZT4gPiBtZWRpYVNvdXJjZXM7CisgICAgICAgIHNwPElNZWRpYVNvdXJjZT4gbWVkaWFTb3VyY2U7CisKKyAgICAgICAgc3A8SU1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZShkYXRhU291cmNlKTsKKworICAgICAgICBpZiAoZXh0cmFjdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGNyZWF0ZSBleHRyYWN0b3IuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOworCisgICAgICAgIGlmIChtZXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgICAgICBpZiAoIW1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJleHRyYWN0b3IgZGlkIG5vdCBwcm92aWRlIE1JTUUgdHlwZS5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBudW1UcmFja3MgPSBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1UcmFja3M7ICsraSkgeworICAgICAgICAgICAgbWV0YSA9IGV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YShpLCAwKTsKKworICAgICAgICAgICAgaWYgKG1ldGEgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgICAgIG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOworCisgICAgICAgICAgICAvLyBUT0RPOiBhbGxvd2luZyBBVkMgb25seSBmb3IgdGhlIHRpbWUgYmVpbmcKKyAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAobWltZSwgInZpZGVvL2F2YyIsIDkpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1ldGEgPSBudWxscHRyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1ldGEgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJObyBBVkMgdHJhY2sgZm91bmQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIG1lZGlhU291cmNlID0gZXh0cmFjdG9yLT5nZXRUcmFjayhpKTsKKyAgICAgICAgaWYgKG1lZGlhU291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic2tpcCBOVUxMIHRyYWNrICV6dSwgdG90YWwgdHJhY2tzICV6dS5cbiIsIGksIG51bVRyYWNrcyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBwbGF5ZXIucGxheShtZWRpYVNvdXJjZSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlYjUxZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQW5kcm9pZC5icApAQCAtMCwwICsxLDMwIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2ZsYWNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWyJsaWJGTEFDLWhlYWRlcnMiXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0RmxhY0RlYy5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mbGFjZGVjIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2ZsYWNlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEZsYWNFbmMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJGTEFDIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiMTRjZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5jcHAKQEAgLTAsMCArMSwzODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEZsYWNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEZsYWNEZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuZmxhYy5kZWNvZGVyIjsKKworY2xhc3MgQzJTb2Z0RmxhY0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuaW5SYW5nZSgxLCA2NTUzNTApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dCgwdSwgNzY4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSgxLCAyMTAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDMyNzY4KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QY21FbmNvZGluZ0luZm8sIEMyX1BBUkFNS0VZX1BDTV9FTkNPRElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOjpvdXRwdXQoMHUsIEMyQ29uZmlnOjpQQ01fMTYpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVBjbUVuY29kaW5nSW5mbywgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQQ01fMTYsCisgICAgICAgICAgICAgICAgICAgICAvLyBDMkNvbmZpZzo6UENNXzgsCisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNX0ZMT0FUfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1QY21FbmNvZGluZ0luZm8pPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgaW50MzJfdCBnZXRQY21FbmNvZGluZ0luZm8oKSBjb25zdCB7IHJldHVybiBtUGNtRW5jb2RpbmdJbmZvLT52YWx1ZTsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOjpvdXRwdXQ+IG1QY21FbmNvZGluZ0luZm87Cit9OworCitDMlNvZnRGbGFjRGVjOjpDMlNvZnRGbGFjRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1GTEFDRGVjb2RlcihudWxscHRyKSB7Cit9CisKK0MyU29mdEZsYWNEZWM6On5DMlNvZnRGbGFjRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNEZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAobUZMQUNEZWNvZGVyKSBtRkxBQ0RlY29kZXItPmZsdXNoKCk7CisgICAgbWVtc2V0KCZtU3RyZWFtSW5mbywgMCwgc2l6ZW9mKG1TdHJlYW1JbmZvKSk7CisgICAgbUhhc1N0cmVhbUluZm8gPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEZsYWNEZWM6Om9uUmVzZXQoKSB7CisgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEZsYWNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CisgICAgaWYgKG1GTEFDRGVjb2RlcikgZGVsZXRlIG1GTEFDRGVjb2RlcjsKKyAgICBtRkxBQ0RlY29kZXIgPSBudWxscHRyOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0RmxhY0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgaWYgKG1GTEFDRGVjb2RlcikgeworICAgICAgICBkZWxldGUgbUZMQUNEZWNvZGVyOworICAgIH0KKyAgICBtRkxBQ0RlY29kZXIgPSBGTEFDRGVjb2Rlcjo6Q3JlYXRlKCk7CisgICAgaWYgKCFtRkxBQ0RlY29kZXIpIHsKKyAgICAgICAgQUxPR0UoImluaXREZWNvZGVyOiBmYWlsZWQgdG8gY3JlYXRlIEZMQUNEZWNvZGVyIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgbWVtc2V0KCZtU3RyZWFtSW5mbywgMCwgc2l6ZW9mKG1TdHJlYW1JbmZvKSk7CisgICAgbUhhc1N0cmVhbUluZm8gPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKworLy8gKFRPRE8pIGFkZCBtdWx0aWZyYW1lIHN1cHBvcnQsIGluIHBsdWdpbiBhbmQgRkxBQ0RlY29kZXIuY3BwCit2b2lkIEMyU29mdEZsYWNEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMDsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwICYmICFjb2RlY0NvbmZpZykgeworICAgICAgICBBTE9HVigiRmlyc3QgZnJhbWUgaGFzIHRvIGluY2x1ZGUgY29uZmlndXJhdGlvbiwgZm9yY2luZyBjb25maWciKTsKKyAgICAgICAgY29kZWNDb25maWcgPSB0cnVlOworICAgIH0KKworICAgIHVpbnQ4X3QgKmlucHV0ID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICBpZiAoY29kZWNDb25maWcpIHsKKyAgICAgICAgc3RhdHVzX3QgZGVjb2RlckVyciA9IG1GTEFDRGVjb2Rlci0+cGFyc2VNZXRhZGF0YShpbnB1dCwgaW5TaXplKTsKKyAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gT0sgJiYgZGVjb2RlckVyciAhPSBXT1VMRF9CTE9DSykgeworICAgICAgICAgICAgQUxPR0UoInByb2Nlc3M6IEZMQUNEZWNvZGVyIHBhcnNlTWV0YURhdGEgcmV0dXJucyBlcnJvciAlZCIsIGRlY29kZXJFcnIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50Kys7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZWNvZGVyRXJyID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICBBTE9HVigicHJvY2VzczogcGFyc2VNZXRhZGF0YSBpcyBCbG9ja2luZywgQ29udGludWUgJWQiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdHJlYW1JbmZvID0gbUZMQUNEZWNvZGVyLT5nZXRTdHJlYW1JbmZvKCk7CisgICAgICAgICAgICBpZiAobVN0cmVhbUluZm8uc2FtcGxlX3JhdGUgJiYgbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSAmJgorICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLmNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgbUhhc1N0cmVhbUluZm8gPSB0cnVlOworICAgICAgICAgICAgICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygKKyAgICAgICAgICAgICAgICAgICAgMHUsIG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKAorICAgICAgICAgICAgICAgICAgICAwdSwgbVN0cmVhbUluZm8uY2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KGNoYW5uZWxDb3VudEluZm8pKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIFVwZGF0ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR0QoInByb2Nlc3M6IGRlY29kZXIgY29uZmlndXJhdGlvbiA6ICVkIEh6LCAlZCBjaGFubmVscywgJWQgc2FtcGxlcywiCisgICAgICAgICAgICAgICAgICAiICVkIGJsb2NrIHNpemUiLCBtU3RyZWFtSW5mby5zYW1wbGVfcmF0ZSwgbVN0cmVhbUluZm8uY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAoaW50KW1TdHJlYW1JbmZvLnRvdGFsX3NhbXBsZXMsIG1TdHJlYW1JbmZvLm1heF9ibG9ja3NpemUpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBib29sIG91dHB1dEZsb2F0ID0gbUludGYtPmdldFBjbUVuY29kaW5nSW5mbygpID09IEMyQ29uZmlnOjpQQ01fRkxPQVQ7CisgICAgY29uc3Qgc2l6ZV90IHNhbXBsZVNpemUgPSBvdXRwdXRGbG9hdCA/IHNpemVvZihmbG9hdCkgOiBzaXplb2Yoc2hvcnQpOworICAgIHNpemVfdCBvdXRTaXplID0gbUhhc1N0cmVhbUluZm8gPworICAgICAgICAgICAgbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSAqIG1TdHJlYW1JbmZvLmNoYW5uZWxzICogc2FtcGxlU2l6ZQorICAgICAgICAgIDoga01heEJsb2NrU2l6ZSAqIEZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHMgKiBzYW1wbGVTaXplOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dFNpemUsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBkZWNvZGVyRXJyID0gbUZMQUNEZWNvZGVyLT5kZWNvZGVPbmVGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgaW5TaXplLCB3Vmlldy5kYXRhKCksICZvdXRTaXplLCBvdXRwdXRGbG9hdCk7CisgICAgaWYgKGRlY29kZXJFcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoInByb2Nlc3M6IEZMQUNEZWNvZGVyIGRlY29kZU9uZUZyYW1lIHJldHVybnMgZXJyb3IgJWQiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUlucHV0QnVmZmVyQ291bnQrKzsKKyAgICBBTE9HVigib3V0IGJ1ZmZlciBhdHRyLiBzaXplICV6dSIsIG91dFNpemUpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0U2l6ZSkpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBpZiAobUZMQUNEZWNvZGVyKSBtRkxBQ0RlY29kZXItPmZsdXNoKCk7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEZsYWNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0RmxhY0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRGbGFjRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRGbGFjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEZsYWNEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRGbGFjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0RmxhY0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEZsYWNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ5MWJmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9GTEFDX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfRkxBQ19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJGTEFDRGVjb2Rlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRGbGFjRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEZsYWNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRGbGFjRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTWF4QmxvY2tTaXplICAgPSA0MDk2CisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgRkxBQ0RlY29kZXIgKm1GTEFDRGVjb2RlcjsKKyAgICBGTEFDX19TdHJlYW1NZXRhZGF0YV9TdHJlYW1JbmZvIG1TdHJlYW1JbmZvOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1IYXNTdHJlYW1JbmZvOworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudDsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRGbGFjRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0ZMQUNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2UyNTQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmNwcApAQCAtMCwwICsxLDQ4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0RmxhY0VuYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEZsYWNFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMlNvZnRGbGFjRW5jOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmluUmFuZ2UoMSwgNjU1MzUwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCAyKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCgwdSwgNzY4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSgxLCAyMTAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA0NjA4KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QY21FbmNvZGluZ0luZm8sIEMyX1BBUkFNS0VZX1BDTV9FTkNPRElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOjppbnB1dCgwdSwgQzJDb25maWc6OlBDTV8xNikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUGNtRW5jb2RpbmdJbmZvLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV8xNiwKKyAgICAgICAgICAgICAgICAgICAgIC8vIEMyQ29uZmlnOjpQQ01fOCwKKyAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQQ01fRkxPQVR9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVBjbUVuY29kaW5nSW5mbyk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsZVJhdGUtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Q2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudC0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRCaXRyYXRlKCkgY29uc3QgeyByZXR1cm4gbUJpdHJhdGUtPnZhbHVlOyB9CisgICAgaW50MzJfdCBnZXRQY21FbmNvZGluZ0luZm8oKSBjb25zdCB7IHJldHVybiBtUGNtRW5jb2RpbmdJbmZvLT52YWx1ZTsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QY21FbmNvZGluZ0luZm86OmlucHV0PiBtUGNtRW5jb2RpbmdJbmZvOworfTsKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5mbGFjLmVuY29kZXIiOworCitDMlNvZnRGbGFjRW5jOjpDMlNvZnRGbGFjRW5jKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1GbGFjU3RyZWFtRW5jb2RlcihudWxscHRyKSwKKyAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyKG51bGxwdHIpIHsKK30KKworQzJTb2Z0RmxhY0VuYzo6fkMyU29mdEZsYWNFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNFbmM6Om9uSW5pdCgpIHsKKyAgICBtRmxhY1N0cmVhbUVuY29kZXIgPSBGTEFDX19zdHJlYW1fZW5jb2Rlcl9uZXcoKTsKKyAgICBpZiAoIW1GbGFjU3RyZWFtRW5jb2RlcikgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKworICAgIG1JbnB1dEJ1ZmZlclBjbTMyID0gKEZMQUNfX2ludDMyKikgbWFsbG9jKAorICAgICAgICAgICAga0luQmxvY2tTaXplICoga01heE51bUNoYW5uZWxzICogc2l6ZW9mKEZMQUNfX2ludDMyKSk7CisgICAgaWYgKCFtSW5wdXRCdWZmZXJQY20zMikgcmV0dXJuIEMyX05PX01FTU9SWTsKKworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtQ29tcHJlc3Npb25MZXZlbCA9IEZMQUNfQ09NUFJFU1NJT05fTEVWRUxfREVGQVVMVDsKKyAgICBtSXNGaXJzdEZyYW1lID0gdHJ1ZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMHVsbDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDB1OworICAgIG1FbmNvZGVyV3JpdGVEYXRhID0gZmFsc2U7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOworICAgIG1IZWFkZXJPZmZzZXQgPSAwOworICAgIG1Xcm90ZUhlYWRlciA9IGZhbHNlOworCisgICAgc3RhdHVzX3QgZXJyID0gY29uZmlndXJlRW5jb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKwordm9pZCBDMlNvZnRGbGFjRW5jOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1GbGFjU3RyZWFtRW5jb2RlcikgeworICAgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9kZWxldGUobUZsYWNTdHJlYW1FbmNvZGVyKTsKKyAgICAgICAgbUZsYWNTdHJlYW1FbmNvZGVyID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAobUlucHV0QnVmZmVyUGNtMzIpIHsKKyAgICAgICAgZnJlZShtSW5wdXRCdWZmZXJQY20zMik7CisgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3ZvaWQgQzJTb2Z0RmxhY0VuYzo6b25SZXNldCgpIHsKKyAgICBtQ29tcHJlc3Npb25MZXZlbCA9IEZMQUNfQ09NUFJFU1NJT05fTEVWRUxfREVGQVVMVDsKKyAgICAodm9pZCkgb25TdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNFbmM6Om9uU3RvcCgpIHsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUlzRmlyc3RGcmFtZSA9IHRydWU7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDB1bGw7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwdTsKKyAgICBtRW5jb2RlcldyaXRlRGF0YSA9IGZhbHNlOworICAgIG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzID0gMDsKKyAgICBtSGVhZGVyT2Zmc2V0ID0gMDsKKyAgICBtV3JvdGVIZWFkZXIgPSBmYWxzZTsKKworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGRyYWluKERSQUlOX0NPTVBPTkVOVF9OT19FT1MsIG51bGxwdHIpOworICAgIGlmIChDMl9PSyAhPSBzdGF0dXMpIHJldHVybiBzdGF0dXM7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBjb25maWd1cmVFbmNvZGVyKCk7CisgICAgaWYgKGVyciAhPSBPSykgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7Cit9CisKK3ZvaWQgQzJTb2Z0RmxhY0VuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisgICAgaWYgKG1Jc0ZpcnN0RnJhbWUgJiYgaW5TaXplKSB7CisgICAgICAgIG1BbmNob3JUaW1lU3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdWxsKCk7CisgICAgICAgIG1Jc0ZpcnN0RnJhbWUgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIW1Xcm90ZUhlYWRlcikgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gY3NkID0KKyAgICAgICAgICAgIEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKG1IZWFkZXJPZmZzZXQsIDB1KTsKKyAgICAgICAgaWYgKCFjc2QpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDU0QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGNzZC0+bS52YWx1ZSwgbUhlYWRlciwgbUhlYWRlck9mZnNldCk7CisgICAgICAgIEFMT0dWKCJwdXQgY3NkLCAlZCBieXRlcyIsIG1IZWFkZXJPZmZzZXQpOworCisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKHN0ZDo6bW92ZShjc2QpKTsKKyAgICAgICAgbVdyb3RlSGVhZGVyID0gdHJ1ZTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50MzJfdCBzYW1wbGVSYXRlID0gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKKyAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBtSW50Zi0+Z2V0Q2hhbm5lbENvdW50KCk7CisgICAgY29uc3QgYm9vbCBpbnB1dEZsb2F0ID0gbUludGYtPmdldFBjbUVuY29kaW5nSW5mbygpID09IEMyQ29uZmlnOjpQQ01fRkxPQVQ7CisgICAgY29uc3QgdW5zaWduZWQgc2FtcGxlU2l6ZSA9IGlucHV0RmxvYXQgPyBzaXplb2YoZmxvYXQpIDogc2l6ZW9mKGludDE2X3QpOworICAgIGNvbnN0IHVuc2lnbmVkIGZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIHNhbXBsZVNpemU7CisgICAgY29uc3QgdWludDY0X3Qgb3V0VGltZVN0YW1wID0gbVByb2Nlc3NlZFNhbXBsZXMgKiAxMDAwMDAwbGwgLyBzYW1wbGVSYXRlOworCisgICAgc2l6ZV90IG91dENhcGFjaXR5ID0gaW5TaXplOworICAgIG91dENhcGFjaXR5ICs9IG1CbG9ja1NpemUgKiBmcmFtZVNpemU7CisKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhvdXRDYXBhY2l0eSwgdXNhZ2UsICZtT3V0cHV0QmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBtT3V0cHV0QmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUVuY29kZXJXcml0ZURhdGEgPSB0cnVlOworICAgIG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzID0gMDsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBjb25zdCB1aW50OF90ICppblB0ciA9IHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0OworICAgICAgICBjb25zdCBzaXplX3QgcHJvY2Vzc1NpemUgPSBNSU4oa0luQmxvY2tTaXplICogZnJhbWVTaXplLCAoaW5TaXplIC0gaW5Qb3MpKTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgbmJJbnB1dEZyYW1lcyA9IHByb2Nlc3NTaXplIC8gZnJhbWVTaXplOworICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0U2FtcGxlcyA9IHByb2Nlc3NTaXplIC8gc2FtcGxlU2l6ZTsKKworICAgICAgICBBTE9HVigiYWJvdXQgdG8gZW5jb2RlICV6dSBieXRlcyIsIHByb2Nlc3NTaXplKTsKKyAgICAgICAgaWYgKGlucHV0RmxvYXQpIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0ICogY29uc3QgcGNtRmxvYXQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0ICo+KGluUHRyICsgaW5Qb3MpOworICAgICAgICAgICAgbWVtY3B5X3RvX3E4XzIzX2Zyb21fZmxvYXRfd2l0aF9jbGFtcChtSW5wdXRCdWZmZXJQY20zMiwgcGNtRmxvYXQsIG5iSW5wdXRTYW1wbGVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKiBjb25zdCBwY20xNiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MTZfdCAqPihpblB0ciArIGluUG9zKTsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuYklucHV0U2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyUGNtMzJbaV0gPSAoRkxBQ19faW50MzIpIHBjbTE2W2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRkxBQ19fYm9vbCBvayA9IEZMQUNfX3N0cmVhbV9lbmNvZGVyX3Byb2Nlc3NfaW50ZXJsZWF2ZWQoCisgICAgICAgICAgICAgICAgbUZsYWNTdHJlYW1FbmNvZGVyLCBtSW5wdXRCdWZmZXJQY20zMiwgbmJJbnB1dEZyYW1lcyk7CisgICAgICAgIGlmICghb2spIHsKKyAgICAgICAgICAgIEFMT0dFKCJlcnJvciBlbmNvdW50ZXJlZCBkdXJpbmcgZW5jb2RpbmciKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICBtT3V0cHV0QmxvY2sucmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpblBvcyArPSBwcm9jZXNzU2l6ZTsKKyAgICB9CisgICAgaWYgKGVvcyAmJiAoQzJfT0sgIT0gZHJhaW4oRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sKSkpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGVuY291bnRlcmVkIGR1cmluZyBlbmNvZGluZyIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIG1PdXRwdXRCbG9jay5yZXNldCgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgaWYgKG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzICE9IDApIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIoc3RkOjptb3ZlKG1PdXRwdXRCbG9jayksIDAsIG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoImVuY29kZXIgcHJvY2Vzc19pbnRlcmxlYXZlZCByZXR1cm5lZCB3aXRob3V0IGRhdGEgdG8gd3JpdGUiKTsKKyAgICB9CisgICAgbU91dHB1dEJsb2NrID0gbnVsbHB0cjsKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KKyAgICBtRW5jb2RlcldyaXRlRGF0YSA9IGZhbHNlOworICAgIG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzID0gMDsKK30KKworRkxBQ19fU3RyZWFtRW5jb2RlcldyaXRlU3RhdHVzIEMyU29mdEZsYWNFbmM6Om9uRW5jb2RlZEZsYWNBdmFpbGFibGUoCisgICAgICAgIGNvbnN0IEZMQUNfX2J5dGUgYnVmZmVyW10sIHNpemVfdCBieXRlcywgdW5zaWduZWQgc2FtcGxlcywKKyAgICAgICAgdW5zaWduZWQgY3VycmVudF9mcmFtZSkgeworICAgICh2b2lkKSBjdXJyZW50X2ZyYW1lOworICAgIEFMT0dWKCIlcyAoYnl0ZXM9JXp1LCBzYW1wbGVzPSV1LCBjdXJyX2ZyYW1lPSV1KSIsIF9fZnVuY19fLCBieXRlcywgc2FtcGxlcywKKyAgICAgICAgICBjdXJyZW50X2ZyYW1lKTsKKworICAgIGlmIChzYW1wbGVzID09IDApIHsKKyAgICAgICAgQUxPR0koInNhdmluZyAlenUgYnl0ZXMgb2YgaGVhZGVyIiwgYnl0ZXMpOworICAgICAgICBtZW1jcHkobUhlYWRlciArIG1IZWFkZXJPZmZzZXQsIGJ1ZmZlciwgYnl0ZXMpOworICAgICAgICBtSGVhZGVyT2Zmc2V0ICs9IGJ5dGVzOy8vIHdpbGwgY29udGFpbiBoZWFkZXIgc2l6ZSB3aGVuIGZpbmlzaGVkIHJlY2VpdmluZyBoZWFkZXIKKyAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKKyAgICB9CisKKyAgICBpZiAoKHNhbXBsZXMgPT0gMCkgfHwgIW1FbmNvZGVyV3JpdGVEYXRhKSB7CisgICAgICAgIC8vIGNhbGxlZCBieSB0aGUgZW5jb2RlciBiZWNhdXNlIHRoZXJlJ3MgaGVhZGVyIGRhdGEgdG8gc2F2ZSwgYnV0IGl0J3Mgbm90IHRoZSByb2xlCisgICAgICAgIC8vIG9mIHRoaXMgY29tcG9uZW50ICh1bmxlc3MgV1JJVEVfRkxBQ19IRUFERVJfSU5fRklSU1RfQlVGRkVSIGlzIGRlZmluZWQpCisgICAgICAgIEFMT0dWKCJpZ25vcmluZyAlenUgYnl0ZXMgb2YgaGVhZGVyIGRhdGEgKHNhbXBsZXM9JWQpIiwgYnl0ZXMsIHNhbXBsZXMpOworICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX09LOworICAgIH0KKworICAgIC8vIHdyaXRlIGVuY29kZWQgZGF0YQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gbU91dHB1dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICB1aW50OF90KiBvdXREYXRhID0gd1ZpZXcuZGF0YSgpOworICAgIEFMT0dWKCJ3cml0aW5nICV6dSBieXRlcyBvZiBlbmNvZGVkIGRhdGEgb24gb3V0cHV0IiwgYnl0ZXMpOworICAgIC8vIGluY3JlbWVudCBtUHJvY2Vzc2VkU2FtcGxlcyB0byBtYWludGFpbiBhdWRpbyBzeW5jaHJvbml6YXRpb24gZHVyaW5nCisgICAgLy8gcGxheSBiYWNrCisgICAgbVByb2Nlc3NlZFNhbXBsZXMgKz0gc2FtcGxlczsKKyAgICBpZiAoYnl0ZXMgKyBtRW5jb2RlclJldHVybmVkTmJCeXRlcyA+IG1PdXRwdXRCbG9jay0+Y2FwYWNpdHkoKSkgeworICAgICAgICBBTE9HRSgibm90IGVub3VnaCBzcGFjZSBsZWZ0IHRvIHdyaXRlIGVuY29kZWQgZGF0YSwgZHJvcHBpbmcgJXp1IGJ5dGVzIiwgYnl0ZXMpOworICAgICAgICAvLyBhIGZhdGFsIGVycm9yIHdvdWxkIHN0b3AgdGhlIGVuY29kaW5nCisgICAgICAgIHJldHVybiBGTEFDX19TVFJFQU1fRU5DT0RFUl9XUklURV9TVEFUVVNfT0s7CisgICAgfQorICAgIG1lbWNweShvdXREYXRhICsgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMsIGJ1ZmZlciwgYnl0ZXMpOworICAgIG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzICs9IGJ5dGVzOworICAgIHJldHVybiBGTEFDX19TVFJFQU1fRU5DT0RFUl9XUklURV9TVEFUVVNfT0s7Cit9CisKKworc3RhdHVzX3QgQzJTb2Z0RmxhY0VuYzo6Y29uZmlndXJlRW5jb2RlcigpIHsKKyAgICBBTE9HVigiJXMgbnVtQ2hhbm5lbD0lZCwgc2FtcGxlUmF0ZT0lZCIsIF9fZnVuY19fLCBtSW50Zi0+Z2V0Q2hhbm5lbENvdW50KCksIG1JbnRmLT5nZXRTYW1wbGVSYXRlKCkpOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCAhbUZsYWNTdHJlYW1FbmNvZGVyKSB7CisgICAgICAgIEFMT0dFKCJjYW4ndCBjb25maWd1cmUgZW5jb2Rlcjogbm8gZW5jb2RlciBvciBpbnZhbGlkIHN0YXRlIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGNvbnN0IGJvb2wgaW5wdXRGbG9hdCA9IG1JbnRmLT5nZXRQY21FbmNvZGluZ0luZm8oKSA9PSBDMkNvbmZpZzo6UENNX0ZMT0FUOworICAgIGNvbnN0IGludCBiaXRzUGVyU2FtcGxlID0gaW5wdXRGbG9hdCA/IDI0IDogMTY7CisgICAgRkxBQ19fYm9vbCBvayA9IHRydWU7CisgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfY2hhbm5lbHMobUZsYWNTdHJlYW1FbmNvZGVyLCBtSW50Zi0+Z2V0Q2hhbm5lbENvdW50KCkpOworICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X3NhbXBsZV9yYXRlKG1GbGFjU3RyZWFtRW5jb2RlciwgbUludGYtPmdldFNhbXBsZVJhdGUoKSk7CisgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfYml0c19wZXJfc2FtcGxlKG1GbGFjU3RyZWFtRW5jb2RlciwgYml0c1BlclNhbXBsZSk7CisgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfY29tcHJlc3Npb25fbGV2ZWwobUZsYWNTdHJlYW1FbmNvZGVyLCBtQ29tcHJlc3Npb25MZXZlbCk7CisgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfdmVyaWZ5KG1GbGFjU3RyZWFtRW5jb2RlciwgZmFsc2UpOworICAgIGlmICghb2spIHsKKyAgICAgICAgQUxPR0UoInVua25vd24gZXJyb3Igd2hlbiBjb25maWd1cmluZyBlbmNvZGVyIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG9rICY9IEZMQUNfX1NUUkVBTV9FTkNPREVSX0lOSVRfU1RBVFVTX09LID09CisgICAgICAgICAgICBGTEFDX19zdHJlYW1fZW5jb2Rlcl9pbml0X3N0cmVhbShtRmxhY1N0cmVhbUVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgIGZsYWNFbmNvZGVyV3JpdGVDYWxsYmFjayAgICAvKndyaXRlX2NhbGxiYWNrKi8sCisgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLypzZWVrX2NhbGxiYWNrKi8sCisgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyp0ZWxsX2NhbGxiYWNrKi8sCisgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyptZXRhZGF0YV9jYWxsYmFjayovLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSB0aGlzIC8qY2xpZW50X2RhdGEqLyk7CisKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIEFMT0dFKCJ1bmtub3duIGVycm9yIHdoZW4gY29uZmlndXJpbmcgZW5jb2RlciIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBtQmxvY2tTaXplID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfZ2V0X2Jsb2Nrc2l6ZShtRmxhY1N0cmVhbUVuY29kZXIpOworCisgICAgQUxPR1YoImVuY29kZXIgc3VjY2Vzc2Z1bGx5IGNvbmZpZ3VyZWQiKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK0ZMQUNfX1N0cmVhbUVuY29kZXJXcml0ZVN0YXR1cyBDMlNvZnRGbGFjRW5jOjpmbGFjRW5jb2RlcldyaXRlQ2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1FbmNvZGVyICosCisgICAgICAgICAgICBjb25zdCBGTEFDX19ieXRlIGJ1ZmZlcltdLAorICAgICAgICAgICAgc2l6ZV90IGJ5dGVzLAorICAgICAgICAgICAgdW5zaWduZWQgc2FtcGxlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUsCisgICAgICAgICAgICB2b2lkICpjbGllbnRfZGF0YSkgeworICAgIHJldHVybiAoKEMyU29mdEZsYWNFbmMqKSBjbGllbnRfZGF0YSktPm9uRW5jb2RlZEZsYWNBdmFpbGFibGUoCisgICAgICAgICAgICBidWZmZXIsIGJ5dGVzLCBzYW1wbGVzLCBjdXJyZW50X2ZyYW1lKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0VuYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIHN3aXRjaCAoZHJhaW5Nb2RlKSB7CisgICAgICAgIGNhc2UgTk9fRFJBSU46CisgICAgICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgY2FzZSBEUkFJTl9DSEFJTjoKKyAgICAgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICAgICAgY2FzZSBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1M6CisgICAgICAgICAgICAvLyBUT0RPOiBUaGlzIGZsYWcgaXMgbm90IGJlaW5nIHNlbnQgYmFjayB0byB0aGUgY2xpZW50CisgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpdGVtcyBpbiBQZW5kaW5nV29yayBxdWV1ZSBhcyBhbGwgdGhlCisgICAgICAgICAgICAvLyBpbnB1dHMgYXJlIGJlaW5nIHNlbnQgYmFjayB3aXRoIGVtcHR5d29yayBvciB2YWxpZCBlbmNvZGVkIGRhdGEKKyAgICAgICAgICAgIC8vIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBjYXNlIERSQUlOX0NPTVBPTkVOVF9OT19FT1M6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorICAgIEZMQUNfX2Jvb2wgb2sgPSBGTEFDX19zdHJlYW1fZW5jb2Rlcl9maW5pc2gobUZsYWNTdHJlYW1FbmNvZGVyKTsKKyAgICBpZiAoIW9rKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIG1Jc0ZpcnN0RnJhbWUgPSB0cnVlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwdWxsOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMHU7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEZsYWNFbmNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0RmxhY0VuY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRGbGFjRW5jKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0RmxhY0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRGbGFjRW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0RmxhY0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEZsYWNFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0RmxhY0VuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGYzMDVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0ZMQUNfRU5DX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9GTEFDX0VOQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgIkZMQUMvc3RyZWFtX2VuY29kZXIuaCIKKworI2RlZmluZSBGTEFDX0NPTVBSRVNTSU9OX0xFVkVMX01JTiAgICAgMAorI2RlZmluZSBGTEFDX0NPTVBSRVNTSU9OX0xFVkVMX0RFRkFVTFQgNQorI2RlZmluZSBGTEFDX0NPTVBSRVNTSU9OX0xFVkVMX01BWCAgICAgOAorCisjZGVmaW5lIEZMQUNfSEVBREVSX1NJWkUgICAgICAgICAgICAgICAxMjgKKworI2RlZmluZSBNSU4oYSwgYikgICAgICAgICAgICAgICAgICAgICAgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyU29mdEZsYWNFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworcHVibGljOgorICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0RmxhY0VuYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRGbGFjRW5jKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0YXR1c190IGNvbmZpZ3VyZUVuY29kZXIoKTsKKyAgICBzdGF0aWMgRkxBQ19fU3RyZWFtRW5jb2RlcldyaXRlU3RhdHVzIGZsYWNFbmNvZGVyV3JpdGVDYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbUVuY29kZXIgKmVuY29kZXIsIGNvbnN0IEZMQUNfX2J5dGUgYnVmZmVyW10sCisgICAgICAgICAgICBzaXplX3QgYnl0ZXMsIHVuc2lnbmVkIHNhbXBsZXMsIHVuc2lnbmVkIGN1cnJlbnRfZnJhbWUsCisgICAgICAgICAgICB2b2lkICpjbGllbnRfZGF0YSk7CisgICAgRkxBQ19fU3RyZWFtRW5jb2RlcldyaXRlU3RhdHVzIG9uRW5jb2RlZEZsYWNBdmFpbGFibGUoCisgICAgICAgICAgICBjb25zdCBGTEFDX19ieXRlIGJ1ZmZlcltdLCBzaXplX3QgYnl0ZXMsIHVuc2lnbmVkIHNhbXBsZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgY29uc3QgdW5zaWduZWQgaW50IGtJbkJsb2NrU2l6ZSA9IDExNTI7CisgICAgY29uc3QgdW5zaWduZWQgaW50IGtNYXhOdW1DaGFubmVscyA9IDI7CisgICAgRkxBQ19fU3RyZWFtRW5jb2RlciogbUZsYWNTdHJlYW1FbmNvZGVyOworICAgIEZMQUNfX2ludDMyKiBtSW5wdXRCdWZmZXJQY20zMjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbU91dHB1dEJsb2NrOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICB1aW50MzJfdCBtQ29tcHJlc3Npb25MZXZlbDsKKyAgICB1aW50MzJfdCBtQmxvY2tTaXplOworICAgIGJvb2wgbUlzRmlyc3RGcmFtZTsKKyAgICB1aW50NjRfdCBtQW5jaG9yVGltZVN0YW1wOworICAgIHVpbnQ2NF90IG1Qcm9jZXNzZWRTYW1wbGVzOworICAgIC8vIHNob3VsZCB0aGUgZGF0YSByZWNlaXZlZCBieSB0aGUgY2FsbGJhY2sgYmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHBvcnQKKyAgICBib29sIG1FbmNvZGVyV3JpdGVEYXRhOworICAgIHNpemVfdCBtRW5jb2RlclJldHVybmVkTmJCeXRlczsKKyAgICB1bnNpZ25lZCBtSGVhZGVyT2Zmc2V0OworICAgIGJvb2wgbVdyb3RlSGVhZGVyOworICAgIGNoYXIgbUhlYWRlcltGTEFDX0hFQURFUl9TSVpFXTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEZsYWNFbmMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfRkxBQ19FTkNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWRlNjhjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjMgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfZzcxMWFsYXdkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEc3MTFEZWMuY3BwIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQUxBVyIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9nNzExbWxhd2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0RzcxMURlYy5jcHAiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNGNhNzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuY3BwCkBAIC0wLDAgKzEsMzIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRHNzExRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRHNzExRGVjLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2lmZGVmIEFMQVcKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5nNzExLmFsYXcuZGVjb2RlciI7CisjZWxzZQorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmc3MTEubWxhdy5kZWNvZGVyIjsKKyNlbmRpZgorCitjbGFzcyBDMlNvZnRHNzExRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworCisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisjaWZkZWYgQUxBVworICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXCisjZW5kaWYKKyAgICAgICAgICAgICAgICApKS5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCA0ODAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmVxdWFsVG8oMSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmVxdWFsVG8oNjQwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRHNzExRGVjOjpDMlNvZnRHNzExRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSB7Cit9CisKK0MyU29mdEc3MTFEZWM6On5DMlNvZnRHNzExRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHNzExRGVjOjpvbkluaXQoKSB7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RzcxMURlYzo6b25TdG9wKCkgeworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0RzcxMURlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRHNzExRGVjOjpvblJlbGVhc2UoKSB7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEc3MTFEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEc3MTFEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBlb3MgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworICAgIGludCBvdXRTaXplID0gaW5TaXplICogc2l6ZW9mKGludDE2X3QpOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDhfdCAqaW5wdXRwdHIgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dFNpemUsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50MTZfdCAqb3V0cHV0cHRyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+KHdWaWV3LmRhdGEoKSk7CisKKyNpZmRlZiBBTEFXCisgICAgRGVjb2RlQUxhdyhvdXRwdXRwdHIsIGlucHV0cHRyLCBpblNpemUpOworI2Vsc2UKKyAgICBEZWNvZGVNTGF3KG91dHB1dHB0ciwgaW5wdXRwdHIsIGluU2l6ZSk7CisjZW5kaWYKKworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaykpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHNzExRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworI2lmZGVmIEFMQVcKK3ZvaWQgQzJTb2Z0RzcxMURlYzo6RGVjb2RlQUxhdygKKyAgICAgICAgaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgeworICAgIHdoaWxlIChpblNpemUgPiAwKSB7CisgICAgICAgIGluU2l6ZS0tOworICAgICAgICBpbnQzMl90IHggPSAqaW4rKzsKKworICAgICAgICBpbnQzMl90IGl4ID0geCBeIDB4NTU7CisgICAgICAgIGl4ICY9IDB4N2Y7CisKKyAgICAgICAgaW50MzJfdCBpZXhwID0gaXggPj4gNDsKKyAgICAgICAgaW50MzJfdCBtYW50ID0gaXggJiAweDBmOworCisgICAgICAgIGlmIChpZXhwID4gMCkgeworICAgICAgICAgICAgbWFudCArPSAxNjsKKyAgICAgICAgfQorCisgICAgICAgIG1hbnQgPSAobWFudCA8PCA0KSArIDg7CisKKyAgICAgICAgaWYgKGlleHAgPiAxKSB7CisgICAgICAgICAgICBtYW50ID0gbWFudCA8PCAoaWV4cCAtIDEpOworICAgICAgICB9CisKKyAgICAgICAgKm91dCsrID0gKHggPiAxMjcpID8gbWFudCA6IC1tYW50OworICAgIH0KK30KKyNlbHNlCit2b2lkIEMyU29mdEc3MTFEZWM6OkRlY29kZU1MYXcoCisgICAgICAgIGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpIHsKKyAgICB3aGlsZSAoaW5TaXplID4gMCkgeworICAgICAgICBpblNpemUtLTsKKyAgICAgICAgaW50MzJfdCB4ID0gKmluKys7CisKKyAgICAgICAgaW50MzJfdCBtYW50aXNzYSA9IH54OworICAgICAgICBpbnQzMl90IGV4cG9uZW50ID0gKG1hbnRpc3NhID4+IDQpICYgNzsKKyAgICAgICAgaW50MzJfdCBzZWdtZW50ID0gZXhwb25lbnQgKyAxOworICAgICAgICBtYW50aXNzYSAmPSAweDBmOworCisgICAgICAgIGludDMyX3Qgc3RlcCA9IDQgPDwgc2VnbWVudDsKKworICAgICAgICBpbnQzMl90IGFicyA9ICgweDgwbCA8PCBleHBvbmVudCkgKyBzdGVwICogbWFudGlzc2EgKyBzdGVwIC8gMiAtIDQgKiAzMzsKKworICAgICAgICAqb3V0KysgPSAoeCA8IDB4ODApID8gLWFicyA6IGFiczsKKyAgICB9Cit9CisjZW5kaWYKKworY2xhc3MgQzJTb2Z0RzcxMURlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRHNzExRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEc3MTFEZWMoQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0RzcxMURlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEc3MTFEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRHNzExRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0RzcxMURlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEc3MTFEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlOGZmYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9HNzExX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfRzcxMV9ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0RzcxMURlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRHNzExRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRHNzExRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKworI2lmZGVmIEFMQVcKKyAgICB2b2lkIERlY29kZUFMYXcoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSk7CisjZWxzZQorICAgIHZvaWQgRGVjb2RlTUxhdyhpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKTsKKyNlbmRpZgorCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0RzcxMURlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9HNzExX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMWVmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzMwYzAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9nc21kZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEdzbURlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYmdzbSJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWQ0ODg1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5jcHAKQEAgLTAsMCArMSwzMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEdzbURlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0R3NtRGVjLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmdzbS5kZWNvZGVyIjsKKworY2xhc3MgQzJTb2Z0R3NtRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuZXF1YWxUbyg4MDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuZXF1YWxUbygxKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDEzMjAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuZXF1YWxUbygxMzIwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDEwMjQgLyBNU0dTTV9JTl9GUk1fU1ogKiBNU0dTTV9JTl9GUk1fU1opKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdEdzbURlYzo6QzJTb2Z0R3NtRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtR3NtKG51bGxwdHIpIHsKK30KKworQzJTb2Z0R3NtRGVjOjp+QzJTb2Z0R3NtRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHc21EZWM6Om9uSW5pdCgpIHsKKyAgICBpZiAoIW1Hc20pIG1Hc20gPSBnc21fY3JlYXRlKCk7CisgICAgaWYgKCFtR3NtKSByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIGludCBtc29wdCA9IDE7CisgICAgKHZvaWQpZ3NtX29wdGlvbihtR3NtLCBHU01fT1BUX1dBVjQ5LCAmbXNvcHQpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEdzbURlYzo6b25TdG9wKCkgeworICAgIGlmIChtR3NtKSB7CisgICAgICAgIGdzbV9kZXN0cm95KG1Hc20pOworICAgICAgICBtR3NtID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKCFtR3NtKSBtR3NtID0gZ3NtX2NyZWF0ZSgpOworICAgIGlmICghbUdzbSkgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICBpbnQgbXNvcHQgPSAxOworICAgICh2b2lkKWdzbV9vcHRpb24obUdzbSwgR1NNX09QVF9XQVY0OSwgJm1zb3B0KTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEdzbURlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRHc21EZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobUdzbSkgeworICAgICAgICBnc21fZGVzdHJveShtR3NtKTsKKyAgICAgICAgbUdzbSA9IG51bGxwdHI7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHc21EZWM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0aWMgc2l6ZV90IGRlY29kZUdTTShnc20gaGFuZGxlLCBpbnQxNl90ICpvdXQsIHNpemVfdCBvdXRDYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7CisgICAgc2l6ZV90IG91dFNpemUgPSAwOworCisgICAgaWYgKGluU2l6ZSAlIE1TR1NNX0lOX0ZSTV9TWiA9PSAwCisgICAgICAgICAgICAmJiAoaW5TaXplIC8gTVNHU01fSU5fRlJNX1NaICogTVNHU01fT1VUX0ZSTV9TWiAqIHNpemVvZigqb3V0KQorICAgICAgICAgICAgICAgICAgICA8PSBvdXRDYXBhY2l0eSkpIHsKKyAgICAgICAgd2hpbGUgKGluU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIGdzbV9kZWNvZGUoaGFuZGxlLCBpbiwgb3V0KTsKKyAgICAgICAgICAgIGluICs9IEZSR1NNX0lOX0ZSTV9TWjsKKyAgICAgICAgICAgIGluU2l6ZSAtPSBGUkdTTV9JTl9GUk1fU1o7CisgICAgICAgICAgICBvdXQgKz0gRlJHU01fT1VUX0ZSTV9TWjsKKyAgICAgICAgICAgIG91dFNpemUgKz0gRlJHU01fT1VUX0ZSTV9TWjsKKworICAgICAgICAgICAgZ3NtX2RlY29kZShoYW5kbGUsIGluLCBvdXQpOworICAgICAgICAgICAgaW4gKz0gRlJHU01fSU5fRlJNX1NaX01JTlVTXzE7CisgICAgICAgICAgICBpblNpemUgLT0gRlJHU01fSU5fRlJNX1NaX01JTlVTXzE7CisgICAgICAgICAgICBvdXQgKz0gRlJHU01fT1VUX0ZSTV9TWjsKKyAgICAgICAgICAgIG91dFNpemUgKz0gRlJHU01fT1VUX0ZSTV9TWjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvdXRTaXplICogc2l6ZW9mKGludDE2X3QpOworfQorCit2b2lkIEMyU29mdEdzbURlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgIHNpemVfdCBvdXRDYXBhY2l0eSA9IChpblNpemUgLyBNU0dTTV9JTl9GUk1fU1ogKSAqIE1TR1NNX09VVF9GUk1fU1ogKiBzaXplb2YoaW50MTZfdCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dENhcGFjaXR5LCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDE2X3QgKm91dHB1dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPih3Vmlldy5kYXRhKCkpOworICAgIHVpbnQ4X3QgKmlucHV0ID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICBzaXplX3Qgb3V0U2l6ZSA9IGRlY29kZUdTTShtR3NtLCBvdXRwdXQsIG91dENhcGFjaXR5LCBpbnB1dCwgaW5TaXplKTsKKyAgICBpZiAoIW91dFNpemUpIHsKKyAgICAgICAgQUxPR0UoImVuY291bnRlcmVkIGltcHJvcGVyIGluc2l6ZSBvciBvdXRzaXplIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigib3V0IGJ1ZmZlciBhdHRyLiBzaXplICV6dSIsIG91dFNpemUpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0U2l6ZSkpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0R3NtRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0R1NNRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEdTTURlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRHc21EZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0R3NtRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEdzbURlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEdzbURlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEdTTURlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEdTTURlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMjA5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0dTTV9ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0dTTV9ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgImdzbS5oIgorfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgRlJHU01fSU5fRlJNX1NaICAgICAgICAgICAgIDMzCisjZGVmaW5lIEZSR1NNX0lOX0ZSTV9TWl9NSU5VU18xICAgICAzMgorI2RlZmluZSBGUkdTTV9PVVRfRlJNX1NaICAgICAgICAgICAgMTYwCisjZGVmaW5lIE1TR1NNX0lOX0ZSTV9TWiAgICAgICAgICAgICAoRlJHU01fSU5fRlJNX1NaICsgRlJHU01fSU5fRlJNX1NaX01JTlVTXzEpCisjZGVmaW5lIE1TR1NNX09VVF9GUk1fU1ogICAgICAgICAgICAoRlJHU01fT1VUX0ZSTV9TWiAqIDIpCisKK3N0cnVjdCBDMlNvZnRHc21EZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0R3NtRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEdzbURlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgZ3NtIG1Hc207CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkRW9zOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0R3NtRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0dTTV9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjliZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjUgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfaGV2Y2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0SGV2Y0RlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYmhldmNkZWMiXSwKKworfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2hldmNlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEhldmNFbmMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJoZXZjZW5jIl0sCisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOGRkYTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuY3BwCkBAIC0wLDAgKzEsOTgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRIZXZjRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJNYXBwZXIuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0SGV2Y0RlYy5oIgorI2luY2x1ZGUgImloZXZjZF9jeGEuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuaGV2Yy5kZWNvZGVyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEMyU29mdEhldmNEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgLy8gVE9ETzogUHJvcGVyIHN1cHBvcnQgZm9yIHJlb3JkZXIgZGVwdGguCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsT3V0cHV0RGVsYXksIEMyX1BBUkFNS0VZX09VVFBVVF9ERUxBWSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQoOHUpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgNDA5NiwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDQwOTYsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fU1RJTEx9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzQsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNSwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81XzIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzRfMSwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNV8xLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzVfMgorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhTaXplLCBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDQwOTYsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCA0MDk2LCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzMjAgKiAyNDAgKiAzIC8gNCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobU1heElucHV0U2l6ZSwgdmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhJbnB1dFNpemVTZXR0ZXIsIG1NYXhTaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbMV0gPSB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIDF1LCAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBtZW1jcHkoZGVmYXVsdENvbG9ySW5mby0+bS5sb2NhdGlvbnMsIGxvY2F0aW9ucywgc2l6ZW9mKGxvY2F0aW9ucykpOworCisgICAgICAgIGRlZmF1bHRDb2xvckluZm8gPSBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgIHtDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpfSwgMHUsIDh1IC8qIGJpdERlcHRoICovLAorICAgICAgICAgICAgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIGhlbHBlci0+YWRkU3RydWN0RGVzY3JpcHRvcnM8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+KCk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckluZm8sIEMyX1BBUkFNS0VZX0NPREVEX0NPTE9SX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKGRlZmF1bHRDb2xvckluZm8pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRGVmYXVsdENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29kZWRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9MSU1JVEVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2xvckFzcGVjdHNTZXR0ZXIsIG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtQ29kZWRDb2xvckFzcGVjdHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmb3JtYXRzPworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBpeGVsRm9ybWF0LCBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heFBpY3R1cmVTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuIGhhcmRjb2RpbmcKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDQwOTZ1KTsKKyAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDQwOTZ1KTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heElucHV0U2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWF4U2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gYXNzdW1lIGNvbXByZXNzaW9uIHJhdGlvIG9mIDIKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAoKChtYXhTaXplLnYud2lkdGggKyA2MykgLyA2NCkgKiAoKG1heFNpemUudi5oZWlnaHQgKyA2MykgLyA2NCkgKiAzMDcyKTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpc2l6ZTsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAobWUudi5yYW5nZSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYubWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBDb2RlZENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAobWUudi5yYW5nZSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYubWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZkZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZjb2RlZCkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gdGFrZSBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIHVuc3BlY2lmaWVkIGZpZWxkcywgYW5kIGNvZGVkIHZhbHVlcyBmb3Igc3BlY2lmaWVkIG9uZXMKKyAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBjb2RlZC52LnJhbmdlID09IFJBTkdFX1VOU1BFQ0lGSUVEID8gZGVmLnYucmFuZ2UgOiBjb2RlZC52LnJhbmdlOworICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBjb2RlZC52LnByaW1hcmllcyA9PSBQUklNQVJJRVNfVU5TUEVDSUZJRUQKKyAgICAgICAgICAgICAgICA/IGRlZi52LnByaW1hcmllcyA6IGNvZGVkLnYucHJpbWFyaWVzOworICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IGNvZGVkLnYudHJhbnNmZXIgPT0gVFJBTlNGRVJfVU5TUEVDSUZJRUQKKyAgICAgICAgICAgICAgICA/IGRlZi52LnRyYW5zZmVyIDogY29kZWQudi50cmFuc2ZlcjsKKyAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gY29kZWQudi5tYXRyaXggPT0gTUFUUklYX1VOU1BFQ0lGSUVEID8gZGVmLnYubWF0cml4IDogY29kZWQudi5tYXRyaXg7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBnZXRDb2xvckFzcGVjdHNfbCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db2xvckFzcGVjdHM7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiBtTWF4U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1NYXhJbnB1dFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IG1Db2xvckluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+IG1Db2RlZENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gbURlZmF1bHRDb2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBtQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0PiBtUGl4ZWxGb3JtYXQ7Cit9OworCitzdGF0aWMgc2l6ZV90IGdldENwdUNvcmVDb3VudCgpIHsKKyAgICBsb25nIGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVsZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OworfQorCitzdGF0aWMgdm9pZCAqaXZkX2FsaWduZWRfbWFsbG9jKHZvaWQgKmN0eHQsIFdPUkQzMiBhbGlnbm1lbnQsIFdPUkQzMiBzaXplKSB7CisgICAgKHZvaWQpIGN0eHQ7CisgICAgcmV0dXJuIG1lbWFsaWduKGFsaWdubWVudCwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGl2ZF9hbGlnbmVkX2ZyZWUodm9pZCAqY3R4dCwgdm9pZCAqbWVtKSB7CisgICAgKHZvaWQpIGN0eHQ7CisgICAgZnJlZShtZW0pOworfQorCitDMlNvZnRIZXZjRGVjOjpDMlNvZnRIZXZjRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgICBtRGVjSGFuZGxlKG51bGxwdHIpLAorICAgICAgICBtT3V0QnVmZmVyRmx1c2gobnVsbHB0ciksCisgICAgICAgIG1JdkNvbG9yZm9ybWF0KElWX1lVVl80MjBQKSwKKyAgICAgICAgbVdpZHRoKDMyMCksCisgICAgICAgIG1IZWlnaHQoMjQwKSwKKyAgICAgICAgbUhlYWRlckRlY29kZWQoZmFsc2UpIHsKK30KKworQzJTb2Z0SGV2Y0RlYzo6fkMyU29mdEhldmNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNEZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6b25TdG9wKCkgeworICAgIGlmIChPSyAhPSByZXNldERlY29kZXIoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICByZXNldFBsdWdpbigpOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRIZXZjRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKSBvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRIZXZjRGVjOjpvblJlbGVhc2UoKSB7CisgICAgKHZvaWQpIGRlbGV0ZURlY29kZXIoKTsKKyAgICBpZiAobU91dEJ1ZmZlckZsdXNoKSB7CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobnVsbHB0ciwgbU91dEJ1ZmZlckZsdXNoKTsKKyAgICAgICAgbU91dEJ1ZmZlckZsdXNoID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1PdXRCbG9jaykgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKE9LICE9IHNldEZsdXNoTW9kZSgpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgdWludDMyX3QgZGlzcGxheVN0cmlkZSA9IG1TdHJpZGU7CisgICAgdWludDMyX3QgZGlzcGxheUhlaWdodCA9IG1IZWlnaHQ7CisgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IGRpc3BsYXlTdHJpZGUgKiBkaXNwbGF5SGVpZ2h0ICogMyAvIDI7CisgICAgbU91dEJ1ZmZlckZsdXNoID0gKHVpbnQ4X3QgKilpdmRfYWxpZ25lZF9tYWxsb2MobnVsbHB0ciwgMTI4LCBidWZmZXJTaXplKTsKKyAgICBpZiAoIW1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBBTE9HRSgiY291bGQgbm90IGFsbG9jYXRlIHRtcCBvdXRwdXQgYnVmZmVyIChmb3IgZmx1c2gpIG9mIHNpemUgJXUgIiwgYnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgfQorCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisKKyAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgMCwgMCk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoMCA9PSBzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG51bGxwdHIsIG1PdXRCdWZmZXJGbHVzaCk7CisgICAgICAgIG1PdXRCdWZmZXJGbHVzaCA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpjcmVhdGVEZWNvZGVyKCkgeworICAgIGl2ZGV4dF9jcmVhdGVfaXBfdCBzX2NyZWF0ZV9pcDsKKyAgICBpdmRleHRfY3JlYXRlX29wX3Qgc19jcmVhdGVfb3A7CisKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jcmVhdGVfaXBfdCk7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QuZV9jbWQgPSBJVkRfQ01EX0NSRUFURTsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC51NF9zaGFyZV9kaXNwX2J1ZiA9IDA7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QuZV9vdXRwdXRfZm9ybWF0ID0gbUl2Q29sb3Jmb3JtYXQ7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QucGZfYWxpZ25lZF9hbGxvYyA9IGl2ZF9hbGlnbmVkX21hbGxvYzsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5wZl9hbGlnbmVkX2ZyZWUgPSBpdmRfYWxpZ25lZF9mcmVlOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnB2X21lbV9jdHh0ID0gbnVsbHB0cjsKKyAgICBzX2NyZWF0ZV9vcC5zX2l2ZF9jcmVhdGVfb3BfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jcmVhdGVfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2NyZWF0ZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfY3JlYXRlX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHNfY3JlYXRlX29wLnNfaXZkX2NyZWF0ZV9vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbURlY0hhbmRsZSA9IChpdl9vYmpfdCopc19jcmVhdGVfb3Auc19pdmRfY3JlYXRlX29wX3QucHZfaGFuZGxlOworICAgIG1EZWNIYW5kbGUtPnB2X2Z4bnMgPSAodm9pZCAqKWl2ZGVjX2FwaV9mdW5jdGlvbjsKKyAgICBtRGVjSGFuZGxlLT51NF9zaXplID0gc2l6ZW9mKGl2X29ial90KTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6c2V0TnVtQ29yZXMoKSB7CisgICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3Qgc19zZXRfbnVtX2NvcmVzX2lwOworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90IHNfc2V0X251bV9jb3Jlc19vcDsKKworICAgIHNfc2V0X251bV9jb3Jlc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90KTsKKyAgICBzX3NldF9udW1fY29yZXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9udW1fY29yZXNfaXAuZV9zdWJfY21kID0gSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUzsKKyAgICBzX3NldF9udW1fY29yZXNfaXAudTRfbnVtX2NvcmVzID0gbU51bUNvcmVzOworICAgIHNfc2V0X251bV9jb3Jlc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X251bV9jb3Jlc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X251bV9jb3Jlc19vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9udW1fY29yZXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6c2V0UGFyYW1zKHNpemVfdCBzdHJpZGUsIElWRF9WSURFT19ERUNPREVfTU9ERV9UIGRlY19tb2RlKSB7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX2lwX3Qgc19zZXRfZHluX3BhcmFtc19pcDsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfb3BfdCBzX3NldF9keW5fcGFyYW1zX29wOworCisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9TRVRQQVJBTVM7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9kaXNwX3dkID0gKFVXT1JEMzIpIHN0cmlkZTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX3NraXBfbW9kZSA9IElWRF9TS0lQX05PTkU7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2ZybV9vdXRfbW9kZSA9IElWRF9ESVNQTEFZX0ZSQU1FX09VVDsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfdmlkX2RlY19tb2RlID0gZGVjX21vZGU7CisgICAgc19zZXRfZHluX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9keW5fcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2R5bl9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6Z2V0VmVyc2lvbigpIHsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3Qgc19nZXRfdmVyc2lvbmluZm9faXA7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90IHNfZ2V0X3ZlcnNpb25pbmZvX29wOworICAgIFVXT1JEOCBhdTFfYnVmWzUxMl07CisKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCk7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9HRVRWRVJTSU9OOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnB2X3ZlcnNpb25fYnVmZmVyID0gYXUxX2J1ZjsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC51NF92ZXJzaW9uX2J1ZmZlcl9zaXplID0gc2l6ZW9mKGF1MV9idWYpOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3ZlcnNpb25pbmZvX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdmVyc2lvbmluZm9fb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19nZXRfdmVyc2lvbmluZm9fb3AudTRfZXJyb3JfY29kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIml0dGlhbSBkZWNvZGVyIHZlcnNpb24gbnVtYmVyOiAlcyIsCisgICAgICAgICAgICAgIChjaGFyICopIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnB2X3ZlcnNpb25fYnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIGlmIChPSyAhPSBjcmVhdGVEZWNvZGVyKCkpIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIG1OdW1Db3JlcyA9IE1JTihnZXRDcHVDb3JlQ291bnQoKSwgTUFYX05VTV9DT1JFUyk7CisgICAgbVN0cmlkZSA9IEFMSUdONjQobVdpZHRoKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXNldFBsdWdpbigpOworICAgICh2b2lkKSBzZXROdW1Db3JlcygpOworICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9GUkFNRSkpIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICh2b2lkKSBnZXRWZXJzaW9uKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQzJTb2Z0SGV2Y0RlYzo6c2V0RGVjb2RlQXJncyhpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY29kZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY29kZV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkdyYXBoaWNWaWV3ICpvdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHNNYXJrZXIpIHsKKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gbVN0cmlkZTsKKyAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gbUhlaWdodDsKKyAgICBzaXplX3QgbHVtYVNpemUgPSBkaXNwbGF5U3RyaWRlICogZGlzcGxheUhlaWdodDsKKyAgICBzaXplX3QgY2hyb21hU2l6ZSA9IGx1bWFTaXplID4+IDI7CisKKyAgICBwc19kZWNvZGVfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9pcF90KTsKKyAgICBwc19kZWNvZGVfaXAtPmVfY21kID0gSVZEX0NNRF9WSURFT19ERUNPREU7CisgICAgaWYgKGluQnVmZmVyKSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfdHMgPSB0c01hcmtlcjsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGluQnVmZmVyLT5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfbnVtX0J5dGVzID0gaW5TaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfdHMgPSAwOworICAgICAgICBwc19kZWNvZGVfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBudWxscHRyOworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X251bV9CeXRlcyA9IDA7CisgICAgfQorICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMF0gPSBsdW1hU2l6ZTsKKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzFdID0gY2hyb21hU2l6ZTsKKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzJdID0gY2hyb21hU2l6ZTsKKyAgICBpZiAob3V0QnVmZmVyKSB7CisgICAgICAgIGlmIChvdXRCdWZmZXItPndpZHRoKCkgPCBkaXNwbGF5U3RyaWRlIHx8IG91dEJ1ZmZlci0+aGVpZ2h0KCkgPCBkaXNwbGF5SGVpZ2h0KSB7CisgICAgICAgICAgICBBTE9HRSgiT3V0cHV0IGJ1ZmZlciB0b28gc21hbGw6IHByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCV1eCV1KSIsCisgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPndpZHRoKCksIG91dEJ1ZmZlci0+aGVpZ2h0KCksIGRpc3BsYXlTdHJpZGUsIGRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBtT3V0QnVmZmVyRmx1c2g7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gbU91dEJ1ZmZlckZsdXNoICsgbHVtYVNpemU7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gbU91dEJ1ZmZlckZsdXNoICsgbHVtYVNpemUgKyBjaHJvbWFTaXplOworICAgIH0KKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9udW1fYnVmcyA9IDM7CisgICAgcHNfZGVjb2RlX29wLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfb3BfdCk7CisgICAgcHNfZGVjb2RlX29wLT51NF9vdXRwdXRfcHJlc2VudCA9IDA7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDMlNvZnRIZXZjRGVjOjpnZXRWdWlQYXJhbXMoKSB7CisgICAgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90IHNfZ2V0X3Z1aV9wYXJhbXNfaXA7CisgICAgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19vcF90IHNfZ2V0X3Z1aV9wYXJhbXNfb3A7CisKKyAgICBzX2dldF92dWlfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90KTsKKyAgICBzX2dldF92dWlfcGFyYW1zX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19nZXRfdnVpX3BhcmFtc19pcC5lX3N1Yl9jbWQgPQorICAgICAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVCkgSUhFVkNEX0NYQV9DTURfQ1RMX0dFVF9WVUlfUEFSQU1TOworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdnVpX3BhcmFtc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3Z1aV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19nZXRfdnVpX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFZ1aUNvbG9yQXNwZWN0cyB2dWlDb2xvckFzcGVjdHM7CisgICAgdnVpQ29sb3JBc3BlY3RzLnByaW1hcmllcyA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfY29sb3VyX3ByaW1hcmllczsKKyAgICB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX3RyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKKyAgICB2dWlDb2xvckFzcGVjdHMuY29lZmZzID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV9tYXRyaXhfY29lZmZpY2llbnRzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5mdWxsUmFuZ2UgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX3ZpZGVvX2Z1bGxfcmFuZ2VfZmxhZzsKKworICAgIC8vIGNvbnZlcnQgdnVpIGFzcGVjdHMgdG8gQzIgdmFsdWVzIGlmIGNoYW5nZWQKKyAgICBpZiAoISh2dWlDb2xvckFzcGVjdHMgPT0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0cykpIHsKKyAgICAgICAgbUJpdHN0cmVhbUNvbG9yQXNwZWN0cyA9IHZ1aUNvbG9yQXNwZWN0czsKKyAgICAgICAgQ29sb3JBc3BlY3RzIHNmQXNwZWN0czsKKyAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCBjb2RlZEFzcGVjdHMgPSB7IDB1IH07CisgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzLCB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIsIHZ1aUNvbG9yQXNwZWN0cy5jb2VmZnMsCisgICAgICAgICAgICAgICAgdnVpQ29sb3JBc3BlY3RzLmZ1bGxSYW5nZSwgc2ZBc3BlY3RzKTsKKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tUHJpbWFyaWVzLCAmY29kZWRBc3BlY3RzLnByaW1hcmllcykpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tUmFuZ2UsICZjb2RlZEFzcGVjdHMucmFuZ2UpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1NYXRyaXhDb2VmZnMsICZjb2RlZEFzcGVjdHMubWF0cml4KSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1UcmFuc2ZlciwgJmNvZGVkQXNwZWN0cy50cmFuc2ZlcikpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgKHZvaWQpbUludGYtPmNvbmZpZyh7JmNvZGVkQXNwZWN0c30sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OnNldEZsdXNoTW9kZSgpIHsKKyAgICBpdmRfY3RsX2ZsdXNoX2lwX3Qgc19zZXRfZmx1c2hfaXA7CisgICAgaXZkX2N0bF9mbHVzaF9vcF90IHNfc2V0X2ZsdXNoX29wOworCisgICAgc19zZXRfZmx1c2hfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX2lwX3QpOworICAgIHNfc2V0X2ZsdXNoX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfZmx1c2hfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfRkxVU0g7CisgICAgc19zZXRfZmx1c2hfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZmx1c2hfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9mbHVzaF9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9mbHVzaF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpyZXNldERlY29kZXIoKSB7CisgICAgaXZkX2N0bF9yZXNldF9pcF90IHNfcmVzZXRfaXA7CisgICAgaXZkX2N0bF9yZXNldF9vcF90IHNfcmVzZXRfb3A7CisKKyAgICBzX3Jlc2V0X2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9pcF90KTsKKyAgICBzX3Jlc2V0X2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19yZXNldF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9SRVNFVDsKKyAgICBzX3Jlc2V0X29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfcmVzZXRfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Jlc2V0X29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfcmVzZXRfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtU3RyaWRlID0gMDsKKyAgICAodm9pZCkgc2V0TnVtQ29yZXMoKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtSGVhZGVyRGVjb2RlZCA9IGZhbHNlOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDMlNvZnRIZXZjRGVjOjpyZXNldFBsdWdpbigpIHsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6ZGVsZXRlRGVjb2RlcigpIHsKKyAgICBpZiAobURlY0hhbmRsZSkgeworICAgICAgICBpdmRleHRfZGVsZXRlX2lwX3Qgc19kZWxldGVfaXA7CisgICAgICAgIGl2ZGV4dF9kZWxldGVfb3BfdCBzX2RlbGV0ZV9vcDsKKworICAgICAgICBzX2RlbGV0ZV9pcC5zX2l2ZF9kZWxldGVfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9kZWxldGVfaXBfdCk7CisgICAgICAgIHNfZGVsZXRlX2lwLnNfaXZkX2RlbGV0ZV9pcF90LmVfY21kID0gSVZEX0NNRF9ERUxFVEU7CisgICAgICAgIHNfZGVsZXRlX29wLnNfaXZkX2RlbGV0ZV9vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2RlbGV0ZV9vcF90KTsKKyAgICAgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19kZWxldGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19kZWxldGVfb3ApOworICAgICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgc19kZWxldGVfb3Auc19pdmRfZGVsZXRlX29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtRGVjSGFuZGxlID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRIZXZjRGVjOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlR3JhcGhpY0J1ZmZlcihzdGQ6Om1vdmUobU91dEJsb2NrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KG1XaWR0aCwgbUhlaWdodCkpOworICAgIG1PdXRCbG9jayA9IG51bGxwdHI7CisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgYnVmZmVyLT5zZXRJbmZvKG1JbnRmLT5nZXRDb2xvckFzcGVjdHNfbCgpKTsKKyAgICB9CisKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlcl0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KTA7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfTsKKyAgICBpZiAod29yayAmJiBjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaChpbmRleCwgZmlsbFdvcmspOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6ZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICAgICAgQUxPR0UoIm5vdCBzdXBwb3NlZCB0byBiZSBoZXJlLCBpbnZhbGlkIGRlY29kZXIgY29udGV4dCIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBpZiAobVN0cmlkZSAhPSBBTElHTjY0KG1XaWR0aCkpIHsKKyAgICAgICAgbVN0cmlkZSA9IEFMSUdONjQobVdpZHRoKTsKKyAgICAgICAgaWYgKE9LICE9IHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0ZSQU1FKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgaWYgKG1PdXRCbG9jayAmJgorICAgICAgICAgICAgKG1PdXRCbG9jay0+d2lkdGgoKSAhPSBtU3RyaWRlIHx8IG1PdXRCbG9jay0+aGVpZ2h0KCkgIT0gbUhlaWdodCkpIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGlmICghbU91dEJsb2NrKSB7CisgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhtU3RyaWRlLCBtSGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmbU91dEJsb2NrKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImZldGNoR3JhcGhpY0Jsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCVkeCVkKSIsCisgICAgICAgICAgICAgIG1PdXRCbG9jay0+d2lkdGgoKSwgbU91dEJsb2NrLT5oZWlnaHQoKSwgbVN0cmlkZSwgbUhlaWdodCk7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCisvLyBUT0RPOiBjYW4gb3ZlcmFsbCBlcnJvciBjaGVja2luZyBiZSBpbXByb3ZlZD8KKy8vIFRPRE86IGFsbG93IGNvbmZpZ3VyYXRpb24gb2YgY29sb3IgZm9ybWF0IGFuZCB1c2FnZSBmb3IgZ3JhcGhpYyBidWZmZXJzIGluc3RlYWQKKy8vICAgICAgIG9mIGhhcmQgY29kaW5nIHRoZW0gdG8gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyCisvLyBUT0RPOiBwYXNzIGNvbG9yYXNwZWN0cyBpbmZvcm1hdGlvbiB0byBzdXJmYWNlCisvLyBUT0RPOiB0ZXN0IHN1cHBvcnQgZm9yIGR5bmFtaWMgY2hhbmdlIGluIHJlc29sdXRpb24KKy8vIFRPRE86IHZlcmlmeSBpZiB0aGUgZGVjb2RlciBzZW50IGJhY2sgYWxsIGZyYW1lcwordm9pZCBDMlNvZnRIZXZjRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgdWludDMyX3Qgd29ya0luZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkgJiAweEZGRkZGRkZGOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBib29sIGhhc1BpY3R1cmUgPSBmYWxzZTsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgaWYgKEMyX09LICE9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgJnJWaWV3LCAmd1ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9mZnNldCArIGluUG9zLCBpblNpemUgLSBpblBvcywgd29ya0luZGV4KSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmFsc2UgPT0gbUhlYWRlckRlY29kZWQpIHsKKyAgICAgICAgICAgIC8qIERlY29kZSBoZWFkZXIgYW5kIGdldCBkaW1lbnNpb25zICovCisgICAgICAgICAgICBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9IRUFERVIpOworICAgICAgICB9CisgICAgICAgIFdPUkQzMiBkZWxheTsKKyAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgZGVsYXkpOworICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgV09SRDMyIGRlY29kZVRpbWU7CisgICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICAgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCBkZWNvZGVUaW1lKTsKKyAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQiLCBkZWNvZGVUaW1lLCBkZWxheSwKKyAgICAgICAgICAgICAgc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKTsKKyAgICAgICAgaWYgKElWRF9NRU1fQUxMT0NfRkFJTEVEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpIHsKKyAgICAgICAgICAgIEFMT0dFKCJhbGxvY2F0aW9uIGZhaWx1cmUgaW4gZGVjb2RlciIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoSVZEX1NUUkVBTV9XSURUSF9IRUlHSFRfTk9UX1NVUFBPUlRFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKSB7CisgICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgcmVzb2x1dGlvbiA6ICVkeCVkIiwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKElWRF9SRVNfQ0hBTkdFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKSB7CisgICAgICAgICAgICBBTE9HVigicmVzb2x1dGlvbiBjaGFuZ2VkIik7CisgICAgICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9OT19FT1MsIHBvb2wsIHdvcmspOworICAgICAgICAgICAgcmVzZXREZWNvZGVyKCk7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKworICAgICAgICAgICAgLyogRGVjb2RlIGhlYWRlciBhbmQgZ2V0IG5ldyBkaW1lbnNpb25zICovCisgICAgICAgICAgICBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9IRUFERVIpOworICAgICAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKDAgPCBzX2RlY29kZV9vcC51NF9waWNfd2QgJiYgMCA8IHNfZGVjb2RlX29wLnU0X3BpY19odCkgeworICAgICAgICAgICAgaWYgKG1IZWFkZXJEZWNvZGVkID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgbUhlYWRlckRlY29kZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHNldFBhcmFtcyhBTElHTjY0KHNfZGVjb2RlX29wLnU0X3BpY193ZCksIElWRF9ERUNPREVfRlJBTUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X3BpY193ZCAhPSBtV2lkdGggfHwgIHNfZGVjb2RlX29wLnU0X3BpY19odCAhPSBtSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgbVdpZHRoID0gc19kZWNvZGVfb3AudTRfcGljX3dkOworICAgICAgICAgICAgICAgIG1IZWlnaHQgPSBzX2RlY29kZV9vcC51NF9waWNfaHQ7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoMHUsIHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KTsKKworICAgICAgICAgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICAgICAgbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3Qgc2V0IHdpZHRoIGFuZCBoZWlnaHQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICh2b2lkKSBnZXRWdWlQYXJhbXMoKTsKKyAgICAgICAgaGFzUGljdHVyZSB8PSAoMSA9PSBzX2RlY29kZV9vcC51NF9mcmFtZV9kZWNvZGVkX2ZsYWcpOworICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsoc19kZWNvZGVfb3AudTRfdHMsIHdvcmspOworICAgICAgICB9CisgICAgICAgIGlmICgwID09IHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZCkgeworICAgICAgICAgICAgQUxPR0QoIkJ5dGVzIGNvbnN1bWVkIGlzIHplcm8uIElnbm9yaW5nIHJlbWFpbmluZyBieXRlcyIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW5Qb3MgKz0gc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkOworICAgICAgICBpZiAoaGFzUGljdHVyZSAmJiAoaW5TaXplIC0gaW5Qb3MpKSB7CisgICAgICAgICAgICBBTE9HRCgiZGVjb2RlZCBmcmFtZSBpbiBjdXJyZW50IGFjY2VzcyBuYWwsIGlnbm9yaW5nIGZ1cnRoZXIgdHJhaWxpbmcgYnl0ZXMgJWQiLAorICAgICAgICAgICAgICAgICAgKGludClpblNpemUgLSAoaW50KWluUG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVvcykgeworICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoIWhhc1BpY3R1cmUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNEZWM6OmRyYWluSW50ZXJuYWwoCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgaWYgKE9LICE9IHNldEZsdXNoTW9kZSgpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKyAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCBudWxscHRyLCAmd1ZpZXcsIDAsIDAsIDApKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChkcmFpbk1vZGUsIHBvb2wsIG51bGxwdHIpOworfQorCitjbGFzcyBDMlNvZnRIZXZjRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEhldmNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRIZXZjRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEhldmNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0SGV2Y0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEhldmNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRIZXZjRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0SGV2Y0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTExMWZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmgKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9IRVZDX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfSEVWQ19ERUNfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgImloZXZjX3R5cGVkZWZzLmgiCisjaW5jbHVkZSAiaXYuaCIKKyNpbmNsdWRlICJpdmQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIGl2ZGVjX2FwaV9mdW5jdGlvbiAgICAgICAgICAgICAgaWhldmNkX2N4YV9hcGlfZnVuY3Rpb24KKyNkZWZpbmUgaXZkZXh0X2NyZWF0ZV9pcF90ICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2NyZWF0ZV9pcF90CisjZGVmaW5lIGl2ZGV4dF9jcmVhdGVfb3BfdCAgICAgICAgICAgICAgaWhldmNkX2N4YV9jcmVhdGVfb3BfdAorI2RlZmluZSBpdmRleHRfZGVsZXRlX2lwX3QgICAgICAgICAgICAgIGloZXZjZF9jeGFfZGVsZXRlX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2RlbGV0ZV9vcF90ICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2RlbGV0ZV9vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90ICAgaWhldmNkX2N4YV9jdGxfc2V0X251bV9jb3Jlc19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90ICAgaWhldmNkX2N4YV9jdGxfc2V0X251bV9jb3Jlc19vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCAgaWhldmNkX2N4YV9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdAorI2RlZmluZSBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3QgIGloZXZjZF9jeGFfY3RsX2dldF92dWlfcGFyYW1zX29wX3QKKyNkZWZpbmUgQUxJR042NCh4KSAgICAgICAgICAgICAgICAgICAgICAoKCgoeCkgKyA2MykgPj4gNikgPDwgNikKKyNkZWZpbmUgTUFYX05VTV9DT1JFUyAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMgICAgXAorICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlIRVZDRF9DWEFfQ01EX0NUTF9TRVRfTlVNX0NPUkVTCisjZGVmaW5lIE1JTihhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorI2RlZmluZSBHRVRUSU1FKGEsIGIpICAgICAgICAgICAgICAgICAgIGdldHRpbWVvZmRheShhLCBiKTsKKyNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICBcCisgICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCisgICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7CisKKworc3RydWN0IEMyU29mdEhldmNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0SGV2Y0RlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0SGV2Y0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyBwcml2YXRlOgorICAgIHN0YXR1c190IGNyZWF0ZURlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBzZXROdW1Db3JlcygpOworICAgIHN0YXR1c190IHNldFBhcmFtcyhzaXplX3Qgc3RyaWRlLCBJVkRfVklERU9fREVDT0RFX01PREVfVCBkZWNfbW9kZSk7CisgICAgc3RhdHVzX3QgZ2V0VmVyc2lvbigpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYm9vbCBzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY29kZV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJSZWFkVmlldyAqaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgKm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0c01hcmtlcik7CisgICAgYm9vbCBnZXRWdWlQYXJhbXMoKTsKKyAgICAvLyBUT0RPOlRoaXMgaXMgbm90IHRoZSByaWdodCBwbGFjZSBmb3IgY29sb3JBc3BlY3RzIGZ1bmN0aW9ucy4gVGhlc2Ugc2hvdWxkCisgICAgLy8gYmUgcGFydCBvZiBjMi12bmRrIHNvIHRoYXQgdGhleSBjYW4gYmUgYWNjZXNzZWQgYnkgYWxsIHZpZGVvIHBsdWdpbnMKKyAgICAvLyB1bnRpbCB0aGVuLCBtYWtlIHRoZW0gZmVlbCBhdCBob21lCisgICAgYm9vbCBjb2xvckFzcGVjdHNEaWZmZXIoY29uc3QgQ29sb3JBc3BlY3RzICZhLCBjb25zdCBDb2xvckFzcGVjdHMgJmIpOworICAgIHZvaWQgdXBkYXRlRmluYWxDb2xvckFzcGVjdHMoCisgICAgICAgICAgICBjb25zdCBDb2xvckFzcGVjdHMgJm90aGVyQXNwZWN0cywgY29uc3QgQ29sb3JBc3BlY3RzICZwcmVmZXJyZWRBc3BlY3RzKTsKKyAgICBzdGF0dXNfdCBoYW5kbGVDb2xvckFzcGVjdHNDaGFuZ2UoKTsKKyAgICBjMl9zdGF0dXNfdCBlbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgc3RhdHVzX3Qgc2V0Rmx1c2hNb2RlKCk7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgc3RhdHVzX3QgcmVzZXREZWNvZGVyKCk7CisgICAgdm9pZCByZXNldFBsdWdpbigpOworICAgIHN0YXR1c190IGRlbGV0ZURlY29kZXIoKTsKKworICAgIC8vIFRPRE86VGhpcyBpcyBub3QgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGlzIGVudW0uIFRoZXNlIHNob3VsZAorICAgIC8vIGJlIHBhcnQgb2YgYzItdm5kayBzbyB0aGF0IHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGJ5IGFsbCB2aWRlbyBwbHVnaW5zCisgICAgLy8gdW50aWwgdGhlbiwgbWFrZSB0aGVtIGZlZWwgYXQgaG9tZQorICAgIGVudW0geworICAgICAgICBrTm90U3VwcG9ydGVkLAorICAgICAgICBrUHJlZmVyQml0c3RyZWFtLAorICAgICAgICBrUHJlZmVyQ29udGFpbmVyLAorICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGl2X29ial90ICptRGVjSGFuZGxlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gbU91dEJsb2NrOworICAgIHVpbnQ4X3QgKm1PdXRCdWZmZXJGbHVzaDsKKworICAgIHNpemVfdCBtTnVtQ29yZXM7CisgICAgSVZfQ09MT1JfRk9STUFUX1QgbUl2Q29sb3Jmb3JtYXQ7CisKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICB1aW50MzJfdCBtU3RyaWRlOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1IZWFkZXJEZWNvZGVkOworCisgICAgLy8gQ29sb3IgYXNwZWN0cy4gVGhlc2UgYXJlIElTTyB2YWx1ZXMgYW5kIGFyZSBtZWFudCB0byBkZXRlY3QgY2hhbmdlcyBpbiBhc3BlY3RzIHRvIGF2b2lkCisgICAgLy8gY29udmVydGluZyB0aGVtIHRvIEMyIHZhbHVlcyBmb3IgZWFjaCBmcmFtZQorICAgIHN0cnVjdCBWdWlDb2xvckFzcGVjdHMgeworICAgICAgICB1aW50OF90IHByaW1hcmllczsKKyAgICAgICAgdWludDhfdCB0cmFuc2ZlcjsKKyAgICAgICAgdWludDhfdCBjb2VmZnM7CisgICAgICAgIHVpbnQ4X3QgZnVsbFJhbmdlOworCisgICAgICAgIC8vIGRlZmF1bHQgY29sb3IgYXNwZWN0cworICAgICAgICBWdWlDb2xvckFzcGVjdHMoKQorICAgICAgICAgICAgOiBwcmltYXJpZXMoMiksIHRyYW5zZmVyKDIpLCBjb2VmZnMoMiksIGZ1bGxSYW5nZSgwKSB7IH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgVnVpQ29sb3JBc3BlY3RzICZvKSB7CisgICAgICAgICAgICByZXR1cm4gcHJpbWFyaWVzID09IG8ucHJpbWFyaWVzICYmIHRyYW5zZmVyID09IG8udHJhbnNmZXIgJiYgY29lZmZzID09IG8uY29lZmZzCisgICAgICAgICAgICAgICAgICAgICYmIGZ1bGxSYW5nZSA9PSBvLmZ1bGxSYW5nZTsKKyAgICAgICAgfQorICAgIH0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0czsKKworICAgIC8vIHByb2ZpbGUKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OworICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0SGV2Y0RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9IRVZDX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0VuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0NWI2YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0VuYy5jcHAKQEAgLTAsMCArMSw4MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEhldmNFbmMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMkJ1ZmZlclV0aWxzLmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlICJpaGV2Y190eXBlZGVmcy5oIgorI2luY2x1ZGUgIml0dF92aWRlb19hcGkuaCIKKyNpbmNsdWRlICJpaGV2Y2VfYXBpLmgiCisjaW5jbHVkZSAiaWhldmNlX3BsdWdpbi5oIgorI2luY2x1ZGUgIkMyU29mdEhldmNFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMlNvZnRIZXZjRW5jOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpHUkFQSElDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKERlZmluZVBhcmFtKG1Vc2FnZSwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX1VTQUdFKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCAodWludDY0X3QpQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBtYXRjaGVzIHNpemUgbGltaXRzIGluIGNvZGVjIGxpYnJhcnkKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgzMjAsIDE5MjAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgxMjgsIDEwODgsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUZyYW1lUmF0ZSwgQzJfUEFSQU1LRVlfRlJBTUVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0KDB1LCAzMC4pKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUZyYW1lUmF0ZSwgdmFsdWUpLmdyZWF0ZXJUaGFuKDAuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoCisgICAgICAgICAgICAgICAgICAgIFNldHRlcjxkZWNsdHlwZSgqbUZyYW1lUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIG1hdGNoZXMgbGltaXRzIGluIGNvZGVjIGxpYnJhcnkKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg0MDk2LCAxMjAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEJpdHJhdGVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIG1hdGNoZXMgbGV2ZWxzIGFsbG93ZWQgd2l0aGluIGNvZGVjIGxpYnJhcnkKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAwdSwgUFJPRklMRV9IRVZDX01BSU4sIExFVkVMX0hFVkNfTUFJTl8xKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgLm9uZU9mKHtDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl9TVElMTH0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgICAgICAub25lT2Yoe0xFVkVMX0hFVkNfTUFJTl8xLCBMRVZFTF9IRVZDX01BSU5fMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfSEVWQ19NQUlOXzJfMSwgTEVWRUxfSEVWQ19NQUlOXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0hFVkNfTUFJTl8zXzEsIExFVkVMX0hFVkNfTUFJTl80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9IRVZDX01BSU5fNF8xLCBMRVZFTF9IRVZDX01BSU5fNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfSEVWQ19NQUlOXzVfMSwgTEVWRUxfSEVWQ19NQUlOXzVfMn0pLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSwgbUZyYW1lUmF0ZSwgbUJpdHJhdGUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdFN5bmMsIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0KDB1LCBDMl9GQUxTRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUmVxdWVzdFN5bmMsIHZhbHVlKS5vbmVPZih7IEMyX0ZBTFNFLCBDMl9UUlVFIH0pIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptUmVxdWVzdFN5bmMpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU3luY0ZyYW1lUGVyaW9kLCBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dCgwdSwgMTAwMDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU3luY0ZyYW1lUGVyaW9kLCB2YWx1ZSkuYW55KCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1TeW5jRnJhbWVQZXJpb2QpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEJpdHJhdGVTZXR0ZXIoYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4mIG1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi52YWx1ZSA8IDQwOTYpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnZhbHVlID0gNDA5NjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiYgb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+JiBtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcigKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZzaXplLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiAmZnJhbWVSYXRlLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gJmJpdHJhdGUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmICghbWUuRihtZS52LnByb2ZpbGUpLnN1cHBvcnRzQXRBbGwobWUudi5wcm9maWxlKSkgeworICAgICAgICAgICAgbWUuc2V0KCkucHJvZmlsZSA9IFBST0ZJTEVfSEVWQ19NQUlOOworICAgICAgICB9CisKKyAgICAgICAgc3RydWN0IExldmVsTGltaXRzIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGxldmVsOworICAgICAgICAgICAgdWludDY0X3Qgc2FtcGxlc1BlclNlYzsKKyAgICAgICAgICAgIHVpbnQ2NF90IHNhbXBsZXM7CisgICAgICAgICAgICB1aW50MzJfdCBiaXRyYXRlOworICAgICAgICB9OworCisgICAgICAgIGNvbnN0ZXhwciBMZXZlbExpbWl0cyBrTGltaXRzW10gPSB7CisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8xLCAgICAgICA1NTI5NjAsICAgIDM2ODY0LCAgICAxMjgwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzIsICAgICAgMzY4NjQwMCwgICAxMjI4ODAsICAgMTUwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fMl8xLCAgICA3MzcyODAwLCAgIDI0NTc2MCwgICAzMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8zLCAgICAgMTY1ODg4MDAsICAgNTUyOTYwLCAgIDYwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzNfMSwgICAzMzE3NzYwMCwgICA5ODMwNDAsICAxMDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNCwgICAgIDY2ODQ2NzIwLCAgMjIyODIyNCwgIDEyMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl80XzEsICAxMzM2OTM0NDAsICAyMjI4MjI0LCAgMjAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzUsICAgIDI2NzM4Njg4MCwgIDg5MTI4OTYsICAyNTAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNV8xLCAgNTM0NzczNzYwLCAgODkxMjg5NiwgIDQwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl81XzIsIDEwNjk1NDc1MjAsICA4OTEyODk2LCAgNjAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzYsICAgMTA2OTU0NzUyMCwgMzU2NTE1ODQsICA2MDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNl8xLCAyMTM5MDk1MDQwLCAzNTY1MTU4NCwgMTIwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl82XzIsIDQyNzgxOTAwODAsIDM1NjUxNTg0LCAyNDAwMDAwMDAgfSwKKyAgICAgICAgfTsKKworICAgICAgICB1aW50NjRfdCBzYW1wbGVzID0gc2l6ZS52LndpZHRoICogc2l6ZS52LmhlaWdodDsKKyAgICAgICAgdWludDY0X3Qgc2FtcGxlc1BlclNlYyA9IHNhbXBsZXMgKiBmcmFtZVJhdGUudi52YWx1ZTsKKworICAgICAgICAvLyBDaGVjayBpZiB0aGUgc3VwcGxpZWQgbGV2ZWwgbWVldHMgdGhlIE1CIC8gYml0cmF0ZSByZXF1aXJlbWVudHMuIElmCisgICAgICAgIC8vIG5vdCwgdXBkYXRlIHRoZSBsZXZlbCB3aXRoIHRoZSBsb3dlc3QgbGV2ZWwgbWVldGluZyB0aGUgcmVxdWlyZW1lbnRzLgorCisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgLy8gQnkgZGVmYXVsdCBuZWVkc1VwZGF0ZSA9IGZhbHNlIGluIGNhc2UgdGhlIHN1cHBsaWVkIGxldmVsIGRvZXMgbWVldAorICAgICAgICAvLyB0aGUgcmVxdWlyZW1lbnRzLgorICAgICAgICBib29sIG5lZWRzVXBkYXRlID0gZmFsc2U7CisgICAgICAgIGZvciAoY29uc3QgTGV2ZWxMaW1pdHMgJmxpbWl0IDoga0xpbWl0cykgeworICAgICAgICAgICAgaWYgKHNhbXBsZXMgPD0gbGltaXQuc2FtcGxlcyAmJiBzYW1wbGVzUGVyU2VjIDw9IGxpbWl0LnNhbXBsZXNQZXJTZWMgJiYKKyAgICAgICAgICAgICAgICAgICAgYml0cmF0ZS52LnZhbHVlIDw9IGxpbWl0LmJpdHJhdGUpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBsb3dlc3QgbGV2ZWwgdGhhdCBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzLCBhbmQgaWYKKyAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlbid0IHNlZW4gdGhlIHN1cHBsaWVkIGxldmVsIHlldCwgdGhhdCBtZWFucyB3ZSBkb24ndAorICAgICAgICAgICAgICAgIC8vIG5lZWQgdGhlIHVwZGF0ZS4KKyAgICAgICAgICAgICAgICBpZiAobmVlZHNVcGRhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkdpdmVuIGxldmVsICV4IGRvZXMgbm90IGNvdmVyIGN1cnJlbnQgY29uZmlndXJhdGlvbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRqdXN0aW5nIHRvICV4IiwgbWUudi5sZXZlbCwgbGltaXQubGV2ZWwpOworICAgICAgICAgICAgICAgICAgICBtZS5zZXQoKS5sZXZlbCA9IGxpbWl0LmxldmVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWUudi5sZXZlbCA9PSBsaW1pdC5sZXZlbCkgeworICAgICAgICAgICAgICAgIC8vIFdlIGJyZWFrIG91dCBvZiB0aGUgbG9vcCB3aGVuIHRoZSBsb3dlc3QgZmVhc2libGUgbGV2ZWwgaXMKKyAgICAgICAgICAgICAgICAvLyBmb3VuZC4gVGhlIGZhY3QgdGhhdCB3ZSdyZSBoZXJlIG1lYW5zIHRoYXQgb3VyIGxldmVsIGRvZXNuJ3QKKyAgICAgICAgICAgICAgICAvLyBtZWV0IHRoZSByZXF1aXJlbWVudCBhbmQgbmVlZHMgdG8gYmUgdXBkYXRlZC4KKyAgICAgICAgICAgICAgICBuZWVkc1VwZGF0ZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgLy8gV2Ugc2V0IHRvIHRoZSBoaWdoZXN0IHN1cHBvcnRlZCBsZXZlbC4KKyAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gTEVWRUxfSEVWQ19NQUlOXzVfMjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIFVXT1JEMzIgZ2V0UHJvZmlsZV9sKCkgY29uc3QgeworICAgICAgICBzd2l0Y2ggKG1Qcm9maWxlTGV2ZWwtPnByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSBQUk9GSUxFX0hFVkNfTUFJTjogIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBQUk9GSUxFX0hFVkNfTUFJTl9TVElMTDogcmV0dXJuIDE7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRCgiVW5yZWNvZ25pemVkIHByb2ZpbGU6ICV4IiwgbVByb2ZpbGVMZXZlbC0+cHJvZmlsZSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFVXT1JEMzIgZ2V0TGV2ZWxfbCgpIGNvbnN0IHsKKyAgICAgICAgc3RydWN0IExldmVsIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGMyTGV2ZWw7CisgICAgICAgICAgICBVV09SRDMyIGhldmNMZXZlbDsKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3RleHByIExldmVsIGxldmVsc1tdID0geworICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fMSwgICAgMzAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzIsICAgIDYwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8yXzEsICA2MyB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fMywgICAgOTAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzNfMSwgIDkzIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl80LCAgIDEyMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNF8xLCAxMjMgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzUsICAgMTUwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl81XzEsIDE1MyB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNV8yLCAxNTYgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzYsICAgMTgwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl82XzEsIDE4MyB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNl8yLCAxODYgfSwKKyAgICAgICAgfTsKKyAgICAgICAgZm9yIChjb25zdCBMZXZlbCAmbGV2ZWwgOiBsZXZlbHMpIHsKKyAgICAgICAgICAgIGlmIChtUHJvZmlsZUxldmVsLT5sZXZlbCA9PSBsZXZlbC5jMkxldmVsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxldmVsLmhldmNMZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HRCgiVW5yZWNvZ25pemVkIGxldmVsOiAleCIsIG1Qcm9maWxlTGV2ZWwtPmxldmVsKTsKKyAgICAgICAgcmV0dXJuIDE1NjsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0U3luY0ZyYW1lUGVyaW9kX2woKSBjb25zdCB7CisgICAgICAgIGlmIChtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA8IDAgfHwKKyAgICAgICAgICAgIG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlID09IElOVDY0X01BWCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZG91YmxlIHBlcmlvZCA9IG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIC8gMWU2ICogbUZyYW1lUmF0ZS0+dmFsdWU7CisgICAgICAgIHJldHVybiAodWludDMyX3QpYzJfbWF4KGMyX21pbihwZXJpb2QgKyAwLjUsIGRvdWJsZShVSU5UMzJfTUFYKSksIDEuKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBnZXRTaXplX2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU2l6ZTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBnZXRGcmFtZVJhdGVfbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1GcmFtZVJhdGU7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGdldEJpdHJhdGVfbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CaXRyYXRlOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IGdldFJlcXVlc3RTeW5jX2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUmVxdWVzdFN5bmM7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQ+IG1Vc2FnZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IG1GcmFtZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBtUmVxdWVzdFN5bmM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQ+IG1TeW5jRnJhbWVQZXJpb2Q7Cit9OworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuaGV2Yy5lbmNvZGVyIjsKKworc3RhdGljIHNpemVfdCBHZXRDUFVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAwOworCisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKworICAgIGlmIChjcHVDb3JlQ291bnQgPCAxKQorICAgICAgICBjcHVDb3JlQ291bnQgPSAxOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKworQzJTb2Z0SGV2Y0VuYzo6QzJTb2Z0SGV2Y0VuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1JdlZpZGVvQ29sb3JGb3JtYXQoSVZfWVVWXzQyMFApLAorICAgICAgbUhldmNFbmNQcm9maWxlKDEpLAorICAgICAgbUhldmNFbmNMZXZlbCgzMCksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQoZmFsc2UpLAorICAgICAgbVNpZ25hbGxlZEVvcyhmYWxzZSksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAorICAgICAgbUNvZGVjQ3R4KG51bGxwdHIpIHsKKyAgICAvLyBJZiBkdW1wIGlzIGVuYWJsZWQsIHRoZW4gY3JlYXRlIGFuIGVtcHR5IGZpbGUKKyAgICBHRU5FUkFURV9GSUxFX05BTUVTKCk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtSW5GaWxlKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1PdXRGaWxlKTsKKworICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7Cit9CisKK0MyU29mdEhldmNFbmM6On5DMlNvZnRIZXZjRW5jKCkgeworICAgIHJlbGVhc2VFbmNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNFbmM6Om9uSW5pdCgpIHsKKyAgICByZXR1cm4gaW5pdEVuY29kZXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0VuYzo6b25TdG9wKCkgeworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICByZXR1cm4gcmVsZWFzZUVuY29kZXIoKTsKK30KKwordm9pZCBDMlNvZnRIZXZjRW5jOjpvblJlc2V0KCkgeworICAgIG9uU3RvcCgpOworICAgIGluaXRFbmNvZGVyKCk7Cit9CisKK3ZvaWQgQzJTb2Z0SGV2Y0VuYzo6b25SZWxlYXNlKCkgeworICAgIG9uU3RvcCgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRW5jOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJTaWduYWxsaW5nIEVPUyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0VuYzo6aW5pdEVuY1BhcmFtcygpIHsKKyAgICBtQ29kZWNDdHggPSBudWxscHRyOworICAgIG1OdW1Db3JlcyA9IHN0ZDo6bWluKEdldENQVUNvcmVDb3VudCgpLCAoc2l6ZV90KSBDT0RFQ19NQVhfQ09SRVMpOworICAgIG1lbXNldCgmbUVuY1BhcmFtcywgMCwgc2l6ZW9mKGloZXZjZV9zdGF0aWNfY2ZnX3BhcmFtc190KSk7CisKKyAgICAvLyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICBJSEVWQ0VfUExVR0lOX1NUQVRVU19UIGVyciA9IGloZXZjZV9zZXRfZGVmX3BhcmFtcygmbUVuY1BhcmFtcyk7CisgICAgaWYgKElIRVZDRV9FT0sgIT0gZXJyKSB7CisgICAgICAgIEFMT0dFKCJIRVZDIGRlZmF1bHQgaW5pdCBmYWlsZWQgOiAweCV4IiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICAvLyB1cGRhdGUgY29uZmlndXJhdGlvbgorICAgIG1FbmNQYXJhbXMuc19zcmNfcHJtcy5pNF93aWR0aCA9IG1TaXplLT53aWR0aDsKKyAgICBtRW5jUGFyYW1zLnNfc3JjX3BybXMuaTRfaGVpZ2h0ID0gbVNpemUtPmhlaWdodDsKKyAgICBtRW5jUGFyYW1zLnNfc3JjX3BybXMuaTRfZnJtX3JhdGVfZGVub20gPSAxMDAwOworICAgIG1FbmNQYXJhbXMuc19zcmNfcHJtcy5pNF9mcm1fcmF0ZV9udW0gPQorICAgICAgICBtRnJhbWVSYXRlLT52YWx1ZSAqIG1FbmNQYXJhbXMuc19zcmNfcHJtcy5pNF9mcm1fcmF0ZV9kZW5vbTsKKyAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uaTRfcXVhbGl0eV9wcmVzZXQgPSBJSEVWQ0VfUVVBTElUWV9QNTsKKyAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uYWk0X3RndF9iaXRyYXRlWzBdID0KKyAgICAgICAgbUJpdHJhdGUtPnZhbHVlOworICAgIG1FbmNQYXJhbXMuc190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5haTRfcGVha19iaXRyYXRlWzBdID0KKyAgICAgICAgbUJpdHJhdGUtPnZhbHVlIDw8IDE7CisgICAgbUVuY1BhcmFtcy5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmk0X2NvZGVjX2xldmVsID0gbUhldmNFbmNMZXZlbDsKKyAgICBtRW5jUGFyYW1zLnNfY29kaW5nX3Rvb2xzX3BybXMuaTRfbWF4X2lfb3Blbl9nb3BfcGVyaW9kID0gbUlEUkludGVydmFsOworICAgIG1FbmNQYXJhbXMuc19jb2RpbmdfdG9vbHNfcHJtcy5pNF9tYXhfY3JhX29wZW5fZ29wX3BlcmlvZCA9IG1JRFJJbnRlcnZhbDsKKyAgICBtSXZWaWRlb0NvbG9yRm9ybWF0ID0gSVZfWVVWXzQyMFA7CisgICAgbUVuY1BhcmFtcy5zX211bHRpX3RocmRfcHJtcy5pNF9tYXhfbnVtX2NvcmVzID0gbU51bUNvcmVzOworICAgIG1FbmNQYXJhbXMuc19vdXRfc3RybV9wcm1zLmk0X2NvZGVjX3Byb2ZpbGUgPSBtSGV2Y0VuY1Byb2ZpbGU7CisgICAgbUVuY1BhcmFtcy5zX2NvbmZpZ19wcm1zLmk0X3JhdGVfY29udHJvbF9tb2RlID0gMjsKKyAgICBtRW5jUGFyYW1zLnNfbGFwX3BybXMuaTRfcmNfbG9va19haGVhZF9waWNzID0gMDsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0VuYzo6cmVsZWFzZUVuY29kZXIoKSB7CisgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICBpZiAobUNvZGVjQ3R4KSB7CisgICAgICAgIElIRVZDRV9QTFVHSU5fU1RBVFVTX1QgZXJyID0gaWhldmNlX2Nsb3NlKG1Db2RlY0N0eCk7CisgICAgICAgIGlmIChJSEVWQ0VfRU9LICE9IGVycikgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgbUNvZGVjQ3R4ID0gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRW5jOjpkcmFpbih1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgKHZvaWQpZHJhaW5Nb2RlOworICAgICh2b2lkKXBvb2w7CisgICAgcmV0dXJuIEMyX09LOworfQorYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0VuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgQ0hFQ0soIW1Db2RlY0N0eCk7CisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgbVNpemUgPSBtSW50Zi0+Z2V0U2l6ZV9sKCk7CisgICAgICAgIG1CaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGVfbCgpOworICAgICAgICBtRnJhbWVSYXRlID0gbUludGYtPmdldEZyYW1lUmF0ZV9sKCk7CisgICAgICAgIG1IZXZjRW5jUHJvZmlsZSA9IG1JbnRmLT5nZXRQcm9maWxlX2woKTsKKyAgICAgICAgbUhldmNFbmNMZXZlbCA9IG1JbnRmLT5nZXRMZXZlbF9sKCk7CisgICAgICAgIG1JRFJJbnRlcnZhbCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2RfbCgpOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGluaXRFbmNQYXJhbXMoKTsKKworICAgIGlmIChDMl9PSyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIgcGFyYW1zIDogMHgleCIsIHN0YXR1cyk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgSUhFVkNFX1BMVUdJTl9TVEFUVVNfVCBlcnIgPSBJSEVWQ0VfRU9LOworICAgIGVyciA9IGloZXZjZV9pbml0KCZtRW5jUGFyYW1zLCAmbUNvZGVjQ3R4KTsKKyAgICBpZiAoSUhFVkNFX0VPSyAhPSBlcnIpIHsKKyAgICAgICAgQUxPR0UoIkhFVkMgZW5jb2RlciBpbml0IGZhaWxlZCA6IDB4JXgiLCBlcnIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNFbmM6OnNldEVuY29kZUFyZ3MoaWhldmNlX2lucF9idWZfdCogcHNfZW5jb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3KiBjb25zdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZXN0YW1wKSB7CisgICAgaWhldmNlX3N0YXRpY19jZmdfcGFyYW1zX3QqIHBhcmFtcyA9ICZtRW5jUGFyYW1zOworICAgIG1lbXNldChwc19lbmNvZGVfaXAsIDAsIHNpemVvZigqcHNfZW5jb2RlX2lwKSk7CisKKyAgICBpZiAoIWlucHV0KSB7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBpZiAoaW5wdXQtPndpZHRoKCkgPCBtU2l6ZS0+d2lkdGggfHwKKyAgICAgICAgaW5wdXQtPmhlaWdodCgpIDwgbVNpemUtPmhlaWdodCkgeworICAgICAgICAvKiBFeHBlY3Qgd2lkdGggaGVpZ2h0IHRvIGJlIGNvbmZpZ3VyZWQgKi8KKyAgICAgICAgQUxPR1coInVuZXhwZWN0ZWQgQ2FwYWNpdHkgQXNwZWN0ICVkKCVkKSB4ICVkKCVkKSIsIGlucHV0LT53aWR0aCgpLAorICAgICAgICAgICAgICBtU2l6ZS0+d2lkdGgsIGlucHV0LT5oZWlnaHQoKSwgbVNpemUtPmhlaWdodCk7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQmIGxheW91dCA9IGlucHV0LT5sYXlvdXQoKTsKKyAgICB1aW50OF90KiB5UGxhbmUgPQorICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5wdXQtPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHVpbnQ4X3QqIHVQbGFuZSA9CisgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbnB1dC0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgICAgdWludDhfdCogdlBsYW5lID0KKyAgICAgICAgY29uc3RfY2FzdDx1aW50OF90ICo+KGlucHV0LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdKTsKKyAgICBpbnQzMl90IHlTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXS5yb3dJbmM7CisgICAgaW50MzJfdCB1U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm93SW5jOworICAgIGludDMyX3QgdlN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLnJvd0luYzsKKworICAgIGNvbnN0IHVpbnQzMl90IHdpZHRoID0gbVNpemUtPndpZHRoOworICAgIGNvbnN0IHVpbnQzMl90IGhlaWdodCA9IG1TaXplLT5oZWlnaHQ7CisKKyAgICAvLyB3aWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgZXZlbgorICAgIGlmICh3aWR0aCAmIDF1IHx8IGhlaWdodCAmIDF1KSB7CisgICAgICAgIEFMT0dXKCJoZWlnaHQoJXUpIGFuZCB3aWR0aCgldSkgbXVzdCBib3RoIGJlIGV2ZW4iLCBoZWlnaHQsIHdpZHRoKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzaXplX3QgeVBsYW5lU2l6ZSA9IHdpZHRoICogaGVpZ2h0OworCisgICAgc3dpdGNoIChsYXlvdXQudHlwZSkgeworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjoKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0JBOiB7CisgICAgICAgICAgICBNZW1vcnlCbG9jayBjb252ZXJzaW9uQnVmZmVyID0KKyAgICAgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnMuZmV0Y2goeVBsYW5lU2l6ZSAqIDMgLyAyKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVtcGxhY2UoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25CdWZmZXIpOworICAgICAgICAgICAgeVBsYW5lID0gY29udmVyc2lvbkJ1ZmZlci5kYXRhKCk7CisgICAgICAgICAgICB1UGxhbmUgPSB5UGxhbmUgKyB5UGxhbmVTaXplOworICAgICAgICAgICAgdlBsYW5lID0gdVBsYW5lICsgeVBsYW5lU2l6ZSAvIDQ7CisgICAgICAgICAgICB5U3RyaWRlID0gd2lkdGg7CisgICAgICAgICAgICB1U3RyaWRlID0gdlN0cmlkZSA9IHlTdHJpZGUgLyAyOworICAgICAgICAgICAgQ29udmVydFJHQlRvUGxhbmFyWVVWKHlQbGFuZSwgeVN0cmlkZSwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpLCAqaW5wdXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY6IHsKKyAgICAgICAgICAgIGlmICghSXNZVVY0MjAoKmlucHV0KSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBpcyBub3QgWVVWNDIwIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmNvbEluYyA9PSAxICYmCisgICAgICAgICAgICAgICAgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sSW5jID09IDEgJiYKKyAgICAgICAgICAgICAgICBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jb2xJbmMgPT0gMSAmJgorICAgICAgICAgICAgICAgIHVTdHJpZGUgPT0gdlN0cmlkZSAmJiB5U3RyaWRlID09IDIgKiB2U3RyaWRlKSB7CisgICAgICAgICAgICAgICAgLy8gSTQyMCBjb21wYXRpYmxlIC0gYWxyZWFkeSBzZXQgdXAgYWJvdmUKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29weSB0byBJNDIwCisgICAgICAgICAgICB5U3RyaWRlID0gd2lkdGg7CisgICAgICAgICAgICB1U3RyaWRlID0gdlN0cmlkZSA9IHlTdHJpZGUgLyAyOworICAgICAgICAgICAgTWVtb3J5QmxvY2sgY29udmVyc2lvbkJ1ZmZlciA9CisgICAgICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzLmZldGNoKHlQbGFuZVNpemUgKiAzIC8gMik7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lbXBsYWNlKGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgICAgIE1lZGlhSW1hZ2UyIGltZyA9CisgICAgICAgICAgICAgICAgQ3JlYXRlWVVWNDIwUGxhbmFyTWVkaWFJbWFnZTIod2lkdGgsIGhlaWdodCwgeVN0cmlkZSwgaGVpZ2h0KTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IEltYWdlQ29weShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgJmltZywgKmlucHV0KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQnVmZmVyIGNvbnZlcnNpb24gZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHlQbGFuZSA9IGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgdVBsYW5lID0geVBsYW5lICsgeVBsYW5lU2l6ZTsKKyAgICAgICAgICAgIHZQbGFuZSA9IHVQbGFuZSArIHlQbGFuZVNpemUgLyA0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVkE6CisgICAgICAgICAgICBBTE9HRSgiWVVWQSBwbGFuZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJVbnJlY29nbml6ZWQgcGxhbmUgdHlwZTogJWQiLCBsYXlvdXQudHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN3aXRjaCAobUl2VmlkZW9Db2xvckZvcm1hdCkgeworICAgICAgICBjYXNlIElWX1lVVl80MjBQOiB7CisgICAgICAgICAgICAvLyBpbnB1dCBidWZmZXIgaXMgc3VwcG9zZWQgdG8gYmUgY29uc3QgYnV0IEl0dGlhbSBBUEkgd2FudHMgYmFyZQorICAgICAgICAgICAgLy8gcG9pbnRlci4KKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YXB2X2lucF9wbGFuZXNbMF0gPSB5UGxhbmU7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFwdl9pbnBfcGxhbmVzWzFdID0gdVBsYW5lOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5hcHZfaW5wX3BsYW5lc1syXSA9IHZQbGFuZTsKKworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3N0cmRbMF0gPSB5U3RyaWRlOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3N0cmRbMV0gPSB1U3RyaWRlOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3N0cmRbMl0gPSB2U3RyaWRlOworCisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc2l6ZVswXSA9IHlTdHJpZGUgKiBoZWlnaHQ7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc2l6ZVsxXSA9IHVTdHJpZGUgKiBoZWlnaHQgPj4gMTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zaXplWzJdID0gdlN0cmlkZSAqIGhlaWdodCA+PiAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElWX1lVVl80MjJJTEU6IHsKKyAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIwU1BfVVY6CisgICAgICAgIGNhc2UgSVZfWVVWXzQyMFNQX1ZVOgorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFwdl9pbnBfcGxhbmVzWzBdID0geVBsYW5lOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5hcHZfaW5wX3BsYW5lc1sxXSA9IHVQbGFuZTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YXB2X2lucF9wbGFuZXNbMl0gPSBudWxscHRyOworCisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc3RyZFswXSA9IHlTdHJpZGU7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc3RyZFsxXSA9IHVTdHJpZGU7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc3RyZFsyXSA9IDA7CisKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zaXplWzBdID0geVN0cmlkZSAqIGhlaWdodDsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zaXplWzFdID0gdVN0cmlkZSAqIGhlaWdodCA+PiAxOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3NpemVbMl0gPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwc19lbmNvZGVfaXAtPmk0X2N1cnJfYml0cmF0ZSA9CisgICAgICAgIHBhcmFtcy0+c190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5haTRfdGd0X2JpdHJhdGVbMF07CisgICAgcHNfZW5jb2RlX2lwLT5pNF9jdXJyX3BlYWtfYml0cmF0ZSA9CisgICAgICAgIHBhcmFtcy0+c190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5haTRfcGVha19iaXRyYXRlWzBdOworICAgIHBzX2VuY29kZV9pcC0+aTRfY3Vycl9yYXRlX2ZhY3RvciA9IHBhcmFtcy0+c19jb25maWdfcHJtcy5pNF9yYXRlX2ZhY3RvcjsKKyAgICBwc19lbmNvZGVfaXAtPnU4X3B0cyA9IHRpbWVzdGFtcDsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0SGV2Y0VuYzo6cHJvY2Vzcyhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICBBTE9HRCgiU2lnbmFsbGVkIEVycm9yIC8gU2lnbmFsbGVkIEVvcyIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IEMyX09LOworCisgICAgLy8gSW5pdGlhbGl6ZSBlbmNvZGVyIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkCisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICBzdGF0dXMgPSBpbml0RW5jb2RlcigpOworICAgICAgICBpZiAoQzJfT0sgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZW5jb2RlciA6IDB4JXgiLCBzdGF0dXMpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHN0YXR1czsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiB2aWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gaW5wdXRCdWZmZXIgPSBudWxscHRyOworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIGlucHV0QnVmZmVyID0gd29yay0+aW5wdXQuYnVmZmVyc1swXTsKKyAgICAgICAgdmlldyA9IHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgQzJHcmFwaGljVmlldz4oCisgICAgICAgICAgICBpbnB1dEJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpKTsKKyAgICAgICAgaWYgKHZpZXctPmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGVyciA9ICVkIiwgdmlldy0+ZXJyb3IoKSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgSUhFVkNFX1BMVUdJTl9TVEFUVVNfVCBlcnIgPSBJSEVWQ0VfRU9LOworCisgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICBpZiAoIW1TcHNQcHNIZWFkZXJSZWNlaXZlZCkgeworICAgICAgICBpaGV2Y2Vfb3V0X2J1Zl90IHNfaGVhZGVyX29we307CisgICAgICAgIGVyciA9IGloZXZjZV9lbmNvZGVfaGVhZGVyKG1Db2RlY0N0eCwgJnNfaGVhZGVyX29wKTsKKyAgICAgICAgaWYgKGVyciA9PSBJSEVWQ0VfRU9LICYmIHNfaGVhZGVyX29wLmk0X2J5dGVzX2dlbmVyYXRlZCkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+IGNzZCA9CisgICAgICAgICAgICAgICAgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dDo6QWxsb2NVbmlxdWUoCisgICAgICAgICAgICAgICAgICAgIHNfaGVhZGVyX29wLmk0X2J5dGVzX2dlbmVyYXRlZCwgMHUpOworICAgICAgICAgICAgaWYgKCFjc2QpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ1NEIGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KGNzZC0+bS52YWx1ZSwgc19oZWFkZXJfb3AucHUxX291dHB1dF9idWYsCisgICAgICAgICAgICAgICAgICAgc19oZWFkZXJfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkKTsKKyAgICAgICAgICAgIERVTVBfVE9fRklMRShtT3V0RmlsZSwgY3NkLT5tLnZhbHVlLCBjc2QtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShjc2QpKTsKKyAgICAgICAgICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpbnB1dEJ1ZmZlcikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGloZXZjZV9pbnBfYnVmX3Qgc19lbmNvZGVfaXB7fTsKKyAgICBpaGV2Y2Vfb3V0X2J1Zl90IHNfZW5jb2RlX29we307CisgICAgdWludDY0X3QgdGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworCisgICAgc3RhdHVzID0gc2V0RW5jb2RlQXJncygmc19lbmNvZGVfaXAsIHZpZXcuZ2V0KCksIHRpbWVzdGFtcCk7CisgICAgaWYgKEMyX09LICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgic2V0RW5jb2RlQXJncyBmYWlsZWQgOiAweCV4Iiwgc3RhdHVzKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gc3RhdHVzOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDY0X3QgdGltZURlbGF5ID0gMDsKKyAgICB1aW50NjRfdCB0aW1lVGFrZW4gPSAwOworICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgdGltZURlbGF5KTsKKworICAgIGloZXZjZV9pbnBfYnVmX3QqIHBzX2VuY29kZV9pcCA9IChpbnB1dEJ1ZmZlcikgPyAmc19lbmNvZGVfaXAgOiBudWxscHRyOworCisgICAgZXJyID0gaWhldmNlX2VuY29kZShtQ29kZWNDdHgsIHBzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wKTsKKyAgICBpZiAoSUhFVkNFX0VPSyAhPSBlcnIpIHsKKyAgICAgICAgQUxPR0UoIkVuY29kZSBGcmFtZSBmYWlsZWQgOiAweCV4IiwgZXJyKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOworICAgIC8qIENvbXB1dGUgdGltZSB0YWtlbiBmb3IgZGVjb2RlKCkgKi8KKyAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIHRpbWVUYWtlbik7CisKKyAgICBBTE9HVigidGltZVRha2VuPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgKGludCl0aW1lVGFrZW4sCisgICAgICAgICAgKGludCl0aW1lRGVsYXksIHNfZW5jb2RlX29wLmk0X2J5dGVzX2dlbmVyYXRlZCk7CisKKyAgICBpZiAoc19lbmNvZGVfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfTsKKyAgICAgICAgc3RhdHVzID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhzX2VuY29kZV9vcC5pNF9ieXRlc19nZW5lcmF0ZWQsIHVzYWdlLCAmYmxvY2spOworICAgICAgICBpZiAoQzJfT0sgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAweCV4Iiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmIChDMl9PSyAhPSB3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkIHdpdGggc3RhdHVzIDB4JXgiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1lbWNweSh3Vmlldy5kYXRhKCksIHNfZW5jb2RlX29wLnB1MV9vdXRwdXRfYnVmLAorICAgICAgICAgICAgICAgc19lbmNvZGVfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkKTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9CisgICAgICAgICAgICBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIDAsIHNfZW5jb2RlX29wLmk0X2J5dGVzX2dlbmVyYXRlZCk7CisKKyAgICAgICAgRFVNUF9UT19GSUxFKG1PdXRGaWxlLCBzX2VuY29kZV9vcC5wdTFfb3V0cHV0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLmk0X2J5dGVzX2dlbmVyYXRlZCk7CisKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gc19lbmNvZGVfb3AudThfcHRzOworICAgICAgICBpZiAoc19lbmNvZGVfb3AuaTRfaXNfa2V5X2ZyYW1lKSB7CisgICAgICAgICAgICBBTE9HVigiSURSIGZyYW1lIHByb2R1Y2VkIik7CisgICAgICAgICAgICBidWZmZXItPnNldEluZm8oCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgIDB1IC8qIHN0cmVhbSBpZCAqLywgQzJDb25maWc6OlNZTkNfRlJBTUUpKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkRW9zID0gdHJ1ZTsKKyAgICB9Cit9CisKK2NsYXNzIEMyU29mdEhldmNFbmNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CisgICBwdWJsaWM6CisgICAgQzJTb2Z0SGV2Y0VuY0ZhY3RvcnkoKQorICAgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkge30KKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdEhldmNFbmMoCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0SGV2Y0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEhldmNFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRIZXZjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB+QzJTb2Z0SGV2Y0VuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEhldmNFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0VuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ5MGI5NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0VuYy5oCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9IRVZDX0VOQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfSEVWQ19FTkNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgImloZXZjX3R5cGVkZWZzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqIEdldCB0aW1lICovCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgZ2V0dGltZW9mZGF5KGEsIGIpCisKKy8qKiBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kICovCisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCisgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworI2RlZmluZSBDT0RFQ19NQVhfQ09SRVMgNAorCitzdHJ1Y3QgQzJTb2Z0SGV2Y0VuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRIZXZjRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSBvdmVycmlkZTsKKworICAgcHJvdGVjdGVkOgorICAgIH5DMlNvZnRIZXZjRW5jKCkgb3ZlcnJpZGU7CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBpaGV2Y2Vfc3RhdGljX2NmZ19wYXJhbXNfdCBtRW5jUGFyYW1zOworICAgIHNpemVfdCBtTnVtQ29yZXM7CisgICAgVVdPUkQzMiBtSURSSW50ZXJ2YWw7CisgICAgSVZfQ09MT1JfRk9STUFUX1QgbUl2VmlkZW9Db2xvckZvcm1hdDsKKyAgICBVV09SRDMyIG1IZXZjRW5jUHJvZmlsZTsKKyAgICBVV09SRDMyIG1IZXZjRW5jTGV2ZWw7CisgICAgYm9vbCBtU3RhcnRlZDsKKyAgICBib29sIG1TcHNQcHNIZWFkZXJSZWNlaXZlZDsKKyAgICBib29sIG1TaWduYWxsZWRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgdm9pZCogbUNvZGVjQ3R4OworICAgIE1lbW9yeUJsb2NrUG9vbCBtQ29udmVyc2lvbkJ1ZmZlcnM7CisgICAgc3RkOjptYXA8dm9pZCosIE1lbW9yeUJsb2NrPiBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZTsKKyAgICAvLyBjb25maWd1cmF0aW9ucyB1c2VkIGJ5IGNvbXBvbmVudCBpbiBwcm9jZXNzCisgICAgLy8gKFRPRE86IGtlZXAgdGhpcyBpbiBpbnRmIGJ1dCBtYWtlIHRoZW0gaW50ZXJuYWwgb25seSkKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IG1GcmFtZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisgICAgY2hhciBtSW5GaWxlWzIwMF07CisgICAgY2hhciBtT3V0RmlsZVsyMDBdOworI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworICAgIC8vIHByb2ZpbGUKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OworICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOworCisgICAgYzJfc3RhdHVzX3QgaW5pdEVuY1BhcmFtcygpOworICAgIGMyX3N0YXR1c190IGluaXRFbmNvZGVyKCk7CisgICAgYzJfc3RhdHVzX3QgcmVsZWFzZUVuY29kZXIoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRFbmNvZGVBcmdzKGloZXZjZV9pbnBfYnVmX3QqIHBzX2VuY29kZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcqIGNvbnN0IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZXN0YW1wKTsKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRIZXZjRW5jKTsKK307CisKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisKKyNkZWZpbmUgSU5QVVRfRFVNUF9QQVRIICIvZGF0YS9sb2NhbC90bXAvaGV2YyIKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQgInl1diIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSCAiL2RhdGEvbG9jYWwvdG1wL2hldmMiCisjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVCAiaDI2NSIKKyNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFMT0dEKCJHRU5FUkFURV9GSUxFX05BTUVTIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJWxkLiVsZC4lcyIsIElOUFVUX0RVTVBfUEFUSCwgbVRpbWVTdGFydC50dl9zZWMsIFwKKyAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfdXNlYywgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cmNweShtT3V0RmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3ByaW50ZihtT3V0RmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBPVVRQVVRfRFVNUF9QQVRILCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsIE9VVFBVVF9EVU1QX0VYVCk7ICAgICAgXAorfQorCisjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTEUqIGZwID0gZm9wZW4obV9maWxlbmFtZSwgIndiIik7ICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIk9wZW5lZCBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgICAgICAgXAorICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKSAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMRSogZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAiYWIiKTsgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwgJiYgbV9idWYgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJEdW1wIHRvIGZpbGUhIik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGkgPSBmd3JpdGUobV9idWYsIDEsIG1fc2l6ZSwgZnApOyAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChpICE9IChpbnQpbV9zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiRXJyb3IgaW4gZndyaXRlLCByZXR1cm5lZCAlZCIsIGkpOyAgICBcCisgICAgICAgICAgICBwZXJyb3IoIkVycm9yIGluIHdyaXRlIHRvIGZpbGUiKTsgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyBcCisgICAgICAgIGlmIChmcCAhPSBOVUxMKSBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZWxzZSAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisjZGVmaW5lIElOUFVUX0RVTVBfUEFUSAorI2RlZmluZSBJTlBVVF9EVU1QX0VYVAorI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRICisjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVAorI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKQorI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQzJfU09GVF9IRVZDX0VOQ19IX18KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2NjVlZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTEgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfbXAzZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRNcDNEZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tcDNkZWMiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiNmQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuY3BwCkBAIC0wLDAgKzEsNTU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRNcDNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bnVtZXJpYz4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRNcDNEZWMuaCIKKyNpbmNsdWRlICJwdm1wM2RlY29kZXJfYXBpLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm1wMy5kZWNvZGVyIjsKKworY2xhc3MgQzJTb2Z0TVAzOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworCisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5vbmVPZih7ODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwKKyAgICAgICAgICAgICAgICAgICAgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDIpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgMil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgMzIwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworfTsKKworQzJTb2Z0TVAzOjpDMlNvZnRNUDMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUNvbmZpZyhudWxscHRyKSwKKyAgICAgIG1EZWNvZGVyQnVmKG51bGxwdHIpIHsKK30KKworQzJTb2Z0TVAzOjp+QzJTb2Z0TVAzKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNUDM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX05PX01FTU9SWTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TVAzOjpvblN0b3AoKSB7CisgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG5leHQgYnVmZmVyIG91dHB1dCBkb2VzIG5vdCBzdGlsbAorICAgIC8vIGRlcGVuZCBvbiBmcmFnbWVudHMgZnJvbSB0aGUgbGFzdCBvbmUgZGVjb2RlZC4KKyAgICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbUlzRmlyc3QgPSB0cnVlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDA7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0TVAzOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdE1QMzo6b25SZWxlYXNlKCkgeworICAgIG1HYXBsZXNzQnl0ZXMgPSBmYWxzZTsKKyAgICBpZiAobURlY29kZXJCdWYpIHsKKyAgICAgICAgZnJlZShtRGVjb2RlckJ1Zik7CisgICAgICAgIG1EZWNvZGVyQnVmID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAobUNvbmZpZykgeworICAgICAgICBkZWxldGUgbUNvbmZpZzsKKyAgICAgICAgbUNvbmZpZyA9IG51bGxwdHI7CisgICAgfQorfQorCitzdGF0dXNfdCBDMlNvZnRNUDM6OmluaXREZWNvZGVyKCkgeworICAgIG1Db25maWcgPSBuZXcgdFBWTVAzRGVjb2RlckV4dGVybmFse307CisgICAgaWYgKCFtQ29uZmlnKSByZXR1cm4gTk9fTUVNT1JZOworICAgIG1Db25maWctPmVxdWFsaXplclR5cGUgPSBmbGF0OworICAgIG1Db25maWctPmNyY0VuYWJsZWQgPSBmYWxzZTsKKworICAgIHNpemVfdCBtZW1SZXF1aXJlbWVudHMgPSBwdm1wM19kZWNvZGVyTWVtUmVxdWlyZW1lbnRzKCk7CisgICAgbURlY29kZXJCdWYgPSBtYWxsb2MobWVtUmVxdWlyZW1lbnRzKTsKKyAgICBpZiAoIW1EZWNvZGVyQnVmKSByZXR1cm4gTk9fTUVNT1JZOworCisgICAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgbURlY29kZXJCdWYpOworCisgICAgbUlzRmlyc3QgPSB0cnVlOworICAgIG1HYXBsZXNzQnl0ZXMgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDA7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwOworCisgICAgcmV0dXJuIE9LOworfQorCisvKiBUaGUgYmVsb3cgY29kZSBpcyBib3Jyb3dlZCBmcm9tIC4vdGVzdC9tcDNyZWFkZXIuY3BwICovCitzdGF0aWMgYm9vbCBwYXJzZU1wM0hlYWRlcih1aW50MzJfdCBoZWFkZXIsIHNpemVfdCAqZnJhbWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfc2FtcGxpbmdfcmF0ZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X2NoYW5uZWxzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfYml0cmF0ZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X251bV9zYW1wbGVzID0gbnVsbHB0cikgeworICAgICpmcmFtZV9zaXplID0gMDsKKyAgICBpZiAob3V0X3NhbXBsaW5nX3JhdGUpICpvdXRfc2FtcGxpbmdfcmF0ZSA9IDA7CisgICAgaWYgKG91dF9jaGFubmVscykgKm91dF9jaGFubmVscyA9IDA7CisgICAgaWYgKG91dF9iaXRyYXRlKSAqb3V0X2JpdHJhdGUgPSAwOworICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpICpvdXRfbnVtX3NhbXBsZXMgPSAxMTUyOworCisgICAgaWYgKChoZWFkZXIgJiAweGZmZTAwMDAwKSAhPSAweGZmZTAwMDAwKSByZXR1cm4gZmFsc2U7CisKKyAgICB1bnNpZ25lZCB2ZXJzaW9uID0gKGhlYWRlciA+PiAxOSkgJiAzOworICAgIGlmICh2ZXJzaW9uID09IDB4MDEpIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIGxheWVyID0gKGhlYWRlciA+PiAxNykgJiAzOworICAgIGlmIChsYXllciA9PSAweDAwKSByZXR1cm4gZmFsc2U7CisKKyAgICB1bnNpZ25lZCBiaXRyYXRlX2luZGV4ID0gKGhlYWRlciA+PiAxMikgJiAweDBmOworICAgIGlmIChiaXRyYXRlX2luZGV4ID09IDAgfHwgYml0cmF0ZV9pbmRleCA9PSAweDBmKSByZXR1cm4gZmFsc2U7CisKKyAgICB1bnNpZ25lZCBzYW1wbGluZ19yYXRlX2luZGV4ID0gKGhlYWRlciA+PiAxMCkgJiAzOworICAgIGlmIChzYW1wbGluZ19yYXRlX2luZGV4ID09IDMpIHJldHVybiBmYWxzZTsKKworICAgIHN0YXRpYyBjb25zdCBpbnQga1NhbXBsaW5nUmF0ZVYxW10gPSB7IDQ0MTAwLCA0ODAwMCwgMzIwMDAgfTsKKyAgICBpbnQgc2FtcGxpbmdfcmF0ZSA9IGtTYW1wbGluZ1JhdGVWMVtzYW1wbGluZ19yYXRlX2luZGV4XTsKKyAgICBpZiAodmVyc2lvbiA9PSAyIC8qIFYyICovKSB7CisgICAgICAgIHNhbXBsaW5nX3JhdGUgLz0gMjsKKyAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMCAvKiBWMi41ICovKSB7CisgICAgICAgIHNhbXBsaW5nX3JhdGUgLz0gNDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBwYWRkaW5nID0gKGhlYWRlciA+PiA5KSAmIDE7CisKKyAgICBpZiAobGF5ZXIgPT0gMykgeyAvLyBsYXllciBJCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMVtdID0KKyAgICAgICAgeworICAgICAgICAgICAgMzIsIDY0LCA5NiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDI4OCwgMzIwLCAzNTIsIDM4NCwgNDE2LCA0NDgKKyAgICAgICAgfTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYyW10gPQorICAgICAgICB7CisgICAgICAgICAgICAzMiwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTQ0LCAxNjAsIDE3NiwgMTkyLCAyMjQsIDI1NgorICAgICAgICB9OworCisgICAgICAgIGludCBiaXRyYXRlID0gKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgPyBrQml0cmF0ZVYxW2JpdHJhdGVfaW5kZXggLSAxXSA6CisgICAgICAgICAgICAgICAga0JpdHJhdGVWMltiaXRyYXRlX2luZGV4IC0gMV07CisKKyAgICAgICAgaWYgKG91dF9iaXRyYXRlKSB7CisgICAgICAgICAgICAqb3V0X2JpdHJhdGUgPSBiaXRyYXRlOworICAgICAgICB9CisgICAgICAgICpmcmFtZV9zaXplID0gKDEyMDAwICogYml0cmF0ZSAvIHNhbXBsaW5nX3JhdGUgKyBwYWRkaW5nKSAqIDQ7CisgICAgICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAzODQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBsYXllciBJSSBvciBJSUkKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxTDJbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIDMyLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMCwgMzg0CisgICAgICAgIH07CisKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxTDNbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIDMyLCA0MCwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjAKKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjJbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIDgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MAorICAgICAgICB9OworCisgICAgICAgIGludCBiaXRyYXRlOworICAgICAgICBpZiAodmVyc2lvbiA9PSAzIC8qIFYxICovKSB7CisgICAgICAgICAgICBiaXRyYXRlID0gKGxheWVyID09IDIgLyogTDIgKi8pID8ga0JpdHJhdGVWMUwyW2JpdHJhdGVfaW5kZXggLSAxXSA6CisgICAgICAgICAgICAgICAgICAgIGtCaXRyYXRlVjFMM1tiaXRyYXRlX2luZGV4IC0gMV07CisKKyAgICAgICAgICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICAqb3V0X251bV9zYW1wbGVzID0gMTE1MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgLy8gVjIgKG9yIDIuNSkKKyAgICAgICAgICAgIGJpdHJhdGUgPSBrQml0cmF0ZVYyW2JpdHJhdGVfaW5kZXggLSAxXTsKKyAgICAgICAgICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICAqb3V0X251bV9zYW1wbGVzID0gKGxheWVyID09IDEgLyogTDMgKi8pID8gNTc2IDogMTE1MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdXRfYml0cmF0ZSkgeworICAgICAgICAgICAgKm91dF9iaXRyYXRlID0gYml0cmF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2ZXJzaW9uID09IDMgLyogVjEgKi8pIHsKKyAgICAgICAgICAgICpmcmFtZV9zaXplID0gMTQ0MDAwICogYml0cmF0ZSAvIHNhbXBsaW5nX3JhdGUgKyBwYWRkaW5nOworICAgICAgICB9IGVsc2UgeyAvLyBWMiBvciBWMi41CisgICAgICAgICAgICBzaXplX3QgdG1wID0gKGxheWVyID09IDEgLyogTDMgKi8pID8gNzIwMDAgOiAxNDQwMDA7CisgICAgICAgICAgICAqZnJhbWVfc2l6ZSA9IHRtcCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXRfc2FtcGxpbmdfcmF0ZSkgeworICAgICAgICAqb3V0X3NhbXBsaW5nX3JhdGUgPSBzYW1wbGluZ19yYXRlOworICAgIH0KKworICAgIGlmIChvdXRfY2hhbm5lbHMpIHsKKyAgICAgICAgaW50IGNoYW5uZWxfbW9kZSA9IChoZWFkZXIgPj4gNikgJiAzOworCisgICAgICAgICpvdXRfY2hhbm5lbHMgPSAoY2hhbm5lbF9tb2RlID09IDMpID8gMSA6IDI7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBVMzJfQVQoY29uc3QgdWludDhfdCAqcHRyKSB7CisgICAgcmV0dXJuIHB0clswXSA8PCAyNCB8IHB0clsxXSA8PCAxNiB8IHB0clsyXSA8PCA4IHwgcHRyWzNdOworfQorCitzdGF0aWMgc3RhdHVzX3QgY2FsY3VsYXRlT3V0U2l6ZSh1aW50OCAqaGVhZGVyLCBzaXplX3QgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiAqZGVjb2RlZFNpemVzKSB7CisgICAgdWludDMyX3QgY2hhbm5lbHM7CisgICAgdWludDMyX3QgbnVtU2FtcGxlczsKKyAgICBzaXplX3QgZnJhbWVTaXplOworICAgIHNpemVfdCB0b3RhbEluU2l6ZSA9IDA7CisKKyAgICB3aGlsZSAodG90YWxJblNpemUgKyA0IDwgaW5TaXplKSB7CisgICAgICAgIGlmICghcGFyc2VNcDNIZWFkZXIoVTMyX0FUKGhlYWRlciArIHRvdGFsSW5TaXplKSwgJmZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAmY2hhbm5lbHMsIG51bGxwdHIsICZudW1TYW1wbGVzKSkgeworICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIHBhcnNlIG1wMyBoZWFkZXIgZHVyaW5nIG91dFNpemUgZXN0aW1hdGlvbiIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgdG90YWxJblNpemUgKz0gZnJhbWVTaXplOworICAgICAgICBkZWNvZGVkU2l6ZXMtPnB1c2hfYmFjayhudW1TYW1wbGVzICogY2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpOworICAgIH0KKworICAgIGlmIChkZWNvZGVkU2l6ZXMtPmVtcHR5KCkpIHJldHVybiBVTktOT1dOX0VSUk9SOworCisgICAgcmV0dXJuIE9LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNUDM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNUDM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCisvLyBUT0RPOiBDYW4gb3ZlcmFsbCBlcnJvciBjaGVja2luZyBiZSBpbXByb3ZlZD8gQXMgaW4gdGhlIGNoZWNrIGZvciB2YWxpZGl0eSBvZgorLy8gICAgICAgd29yaywgcG9vbCBwdHIsIHdvcmstPmlucHV0LmJ1ZmZlcnMuc2l6ZSgpID09IDEsIC4uLgorLy8gVE9ETzogQmxpbmQgcmVtb3ZhbCBvZiA1Mjkgc2FtcGxlcyBmcm9tIHRoZSBvdXRwdXQgbWF5IG5vdCB3b3JrLiBCZWNhdXNlCisvLyAgICAgICBtcGVnIGxheWVyIDEgZnJhbWUgc2l6ZSBpcyAzODQgc2FtcGxlcyBwZXIgZnJhbWUuIFRoaXMgc2hvdWxkIGludHJvZHVjZQorLy8gICAgICAgbmVnYXRpdmUgdmFsdWVzIGFuZCBjYW4gY2F1c2UgU0VHIGZhdWx0cy4gU29mdCBvbXggbXAzIHBsdWdpbiBjYW4gaGF2ZQorLy8gICAgICAgdGhpcyBwcm9ibGVtIChDSEVDSyEpCit2b2lkIEMyU29mdE1QMzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpblNpemUgPT0gMCAmJiAoIW1HYXBsZXNzQnl0ZXMgfHwgIWVvcykpIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkIiwgaW5TaXplLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisKKyAgICBpbnQzMl90IG51bUNoYW5uZWxzID0gbUNvbmZpZy0+bnVtX2NoYW5uZWxzOworICAgIHNpemVfdCBjYWxPdXRTaXplOworICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gZGVjb2RlZFNpemVzOworICAgIGlmIChpblNpemUgJiYgT0sgIT0gY2FsY3VsYXRlT3V0U2l6ZShjb25zdF9jYXN0PHVpbnQ4ICo+KHJWaWV3LmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2l6ZSwgJmRlY29kZWRTaXplcykpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhbE91dFNpemUgPSBzdGQ6OmFjY3VtdWxhdGUoZGVjb2RlZFNpemVzLmJlZ2luKCksIGRlY29kZWRTaXplcy5lbmQoKSwgMCk7CisgICAgaWYgKGVvcykgeworICAgICAgICBjYWxPdXRTaXplICs9IGtQVk1QM0RlY29kZXJEZWxheSAqIG51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhjYWxPdXRTaXplLCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCBvdXRTaXplID0gMDsKKyAgICBpbnQgb3V0T2Zmc2V0ID0gMDsKKyAgICBhdXRvIGl0ID0gZGVjb2RlZFNpemVzLmJlZ2luKCk7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICBpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IG1Db25maWctPnNhbXBsaW5nUmF0ZTsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgaWYgKGl0ID09IGRlY29kZWRTaXplcy5lbmQoKSkgeworICAgICAgICAgICAgQUxPR0UoInVuZXhwZWN0ZWQgdHJhaWxpbmcgYnl0ZXMsIGlnbm9yaW5nIHRoZW0iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbUNvbmZpZy0+cElucHV0QnVmZmVyID0gY29uc3RfY2FzdDx1aW50OCAqPihyVmlldy5kYXRhKCkgKyBpblBvcyk7CisgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyQ3VycmVudExlbmd0aCA9IChpblNpemUgLSBpblBvcyk7CisgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyTWF4TGVuZ3RoID0gMDsKKyAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoID0gMDsKKyAgICAgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID0gKGNhbE91dFNpemUgLSBvdXRTaXplKTsKKyAgICAgICAgbUNvbmZpZy0+cE91dHB1dEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPiAod1ZpZXcuZGF0YSgpICsgb3V0U2l6ZSk7CisKKyAgICAgICAgRVJST1JfQ09ERSBkZWNvZGVyRXJyOworICAgICAgICBpZiAoKGRlY29kZXJFcnIgPSBwdm1wM19mcmFtZWRlY29kZXIobUNvbmZpZywgbURlY29kZXJCdWYpKQorICAgICAgICAgICAgICAgICE9IE5PX0RFQ09ESU5HX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgibXAzIGRlY29kZXIgcmV0dXJuZWQgZXJyb3IgJWQiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IE5PX0VOT1VHSF9NQUlOX0RBVEFfRVJST1IKKyAgICAgICAgICAgICAgICAgICAgJiYgZGVjb2RlckVyciAhPSBTSURFX0lORk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgcmVjb3ZlcmFibGUsIGp1c3QgaWdub3JlIHRoZSBjdXJyZW50IGZyYW1lIGFuZAorICAgICAgICAgICAgLy8gcGxheSBzaWxlbmNlIGluc3RlYWQuCisgICAgICAgICAgICBBTE9HVigiaWdub3JpbmcgZXJyb3IgYW5kIHNlbmRpbmcgc2lsZW5jZSIpOworICAgICAgICAgICAgaWYgKG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID0gKml0IC8gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtc2V0KG1Db25maWctPnBPdXRwdXRCdWZmZXIsIDAsIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgIH0gZWxzZSBpZiAobUNvbmZpZy0+c2FtcGxpbmdSYXRlICE9IHNhbXBsaW5nUmF0ZQorICAgICAgICAgICAgICAgIHx8IG1Db25maWctPm51bV9jaGFubmVscyAhPSBudW1DaGFubmVscykgeworICAgICAgICAgICAgQUxPR0koIlJlY29uZmlndXJpbmcgZGVjb2RlcjogJWQtPiVkIEh6LCAlZC0+JWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwgbUNvbmZpZy0+c2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLCBtQ29uZmlnLT5udW1fY2hhbm5lbHMpOworICAgICAgICAgICAgc2FtcGxpbmdSYXRlID0gbUNvbmZpZy0+c2FtcGxpbmdSYXRlOworICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSBtQ29uZmlnLT5udW1fY2hhbm5lbHM7CisKKyAgICAgICAgICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygwdSwgc2FtcGxpbmdSYXRlKTsKKyAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoCisgICAgICAgICAgICAgICAgICAgIHsgJnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mbyB9LAorICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICZmYWlsdXJlcyk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShzYW1wbGVSYXRlSW5mbykpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoY2hhbm5lbENvdW50SW5mbykpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIFVwZGF0ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCppdCAhPSBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgKiBzaXplb2YoaW50MTZfdCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJwYW5pYywgcGFyc2VkIHNpemUgZG9lcyBub3QgbWF0Y2ggZGVjb2RlZCBzaXplIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG91dFNpemUgKz0gbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICBpblBvcyArPSBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGg7CisgICAgICAgIGl0Kys7CisgICAgfQorICAgIGlmIChtSXNGaXJzdCkgeworICAgICAgICBtSXNGaXJzdCA9IGZhbHNlOworICAgICAgICBtR2FwbGVzc0J5dGVzID0gdHJ1ZTsKKyAgICAgICAgLy8gVGhlIGRlY29kZXIgZGVsYXkgaXMgNTI5IHNhbXBsZXMsIHNvIHRyaW0gdGhhdCBtYW55IHNhbXBsZXMgb2ZmCisgICAgICAgIC8vIHRoZSBzdGFydCBvZiB0aGUgZmlyc3Qgb3V0cHV0IGJ1ZmZlci4gVGhpcyBlc3NlbnRpYWxseSBtYWtlcyB0aGlzCisgICAgICAgIC8vIGRlY29kZXIgaGF2ZSB6ZXJvIGRlbGF5LCB3aGljaCB0aGUgcmVzdCBvZiB0aGUgcGlwZWxpbmUgYXNzdW1lcy4KKyAgICAgICAgb3V0T2Zmc2V0ID0ga1BWTVAzRGVjb2RlckRlbGF5ICogbnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIG1BbmNob3JUaW1lU3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdWxsKCk7CisgICAgfQorICAgIGlmIChlb3MpIHsKKyAgICAgICAgaWYgKGNhbE91dFNpemUgPj0KKyAgICAgICAgICAgIG91dFNpemUgKyBrUFZNUDNEZWNvZGVyRGVsYXkgKiBudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgaWYgKCFtZW1zZXQocmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4od1ZpZXcuZGF0YSgpICsgb3V0U2l6ZSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBrUFZNUDNEZWNvZGVyRGVsYXkgKiBudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KSkpIHsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIkFkZGluZyA1Mjkgc2FtcGxlcyBhdCBlbmQiKTsKKyAgICAgICAgICAgIG1HYXBsZXNzQnl0ZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIG91dFNpemUgKz0ga1BWTVAzRGVjb2RlckRlbGF5ICogbnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPSBtUHJvY2Vzc2VkU2FtcGxlcyAqIDEwMDAwMDBsbCAvIHNhbXBsaW5nUmF0ZTsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyArPSAoKG91dFNpemUgLSBvdXRPZmZzZXQpIC8gKG51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKSk7CisgICAgQUxPR1YoIm91dCBidWZmZXIgYXR0ci4gb2Zmc2V0ICVkIHNpemUgJWQgdGltZXN0YW1wICV1Iiwgb3V0T2Zmc2V0LCBvdXRTaXplIC0gb3V0T2Zmc2V0LAorICAgICAgICAgICh1aW50MzJfdCkobUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcCkpOworICAgIGRlY29kZWRTaXplcy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCBvdXRPZmZzZXQsIG91dFNpemUgLSBvdXRPZmZzZXQpKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworY2xhc3MgQzJTb2Z0TXAzRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdE1wM0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICBuZXcgQzJTb2Z0TVAzKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TVAzOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0TVAzOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1QMzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcDNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRNcDNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDJiZGM0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9NUDNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9NUDNfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK3N0cnVjdCB0UFZNUDNEZWNvZGVyRXh0ZXJuYWw7CisKK2Jvb2wgcGFyc2VNcDNIZWFkZXIodWludDMyX3QgaGVhZGVyLCBzaXplX3QgKmZyYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfc2FtcGxpbmdfcmF0ZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfY2hhbm5lbHMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X2JpdHJhdGUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X251bV9zYW1wbGVzID0gbnVsbHB0cik7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdE1QMyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRNUDMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0TVAzKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrUFZNUDNEZWNvZGVyRGVsYXkgPSA1MjkgLy8gc2FtcGxlcworICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHRQVk1QM0RlY29kZXJFeHRlcm5hbCAqbUNvbmZpZzsKKyAgICB2b2lkICptRGVjb2RlckJ1ZjsKKworICAgIGJvb2wgbUlzRmlyc3Q7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbUdhcGxlc3NCeXRlczsKKyAgICB1aW50NjRfdCBtQW5jaG9yVGltZVN0YW1wOworICAgIHVpbnQ2NF90IG1Qcm9jZXNzZWRTYW1wbGVzOworCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdE1QMyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9NUDNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMWVmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvcGF0ZW50X2Rpc2NsYWltZXIudHh0IGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL3BhdGVudF9kaXNjbGFpbWVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGJmMTFkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL3BhdGVudF9kaXNjbGFpbWVyLnR4dApAQCAtMCwwICsxLDkgQEAKKworVEhJUyBJUyBOT1QgQSBHUkFOVCBPRiBQQVRFTlQgUklHSFRTLgorCitHb29nbGUgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gb3Igd2FycmFudHkgdGhhdCB0aGUgY29kZWNzIGZvciB3aGljaAorc291cmNlIGNvZGUgaXMgbWFkZSBhdmFpbGFibGUgaGVyZXVuZGVyIGFyZSB1bmVuY3VtYmVyZWQgYnkKK3RoaXJkLXBhcnR5IHBhdGVudHMuICBUaG9zZSBpbnRlbmRpbmcgdG8gdXNlIHRoaXMgc291cmNlIGNvZGUgaW4KK2hhcmR3YXJlIG9yIHNvZnR3YXJlIHByb2R1Y3RzIGFyZSBhZHZpc2VkIHRoYXQgaW1wbGVtZW50YXRpb25zIG9mCit0aGVzZSBjb2RlY3MsIGluY2x1ZGluZyBpbiBvcGVuIHNvdXJjZSBzb2Z0d2FyZSBvciBzaGFyZXdhcmUsIG1heQorcmVxdWlyZSBwYXRlbnQgbGljZW5zZXMgZnJvbSB0aGUgcmVsZXZhbnQgcGF0ZW50IGhvbGRlcnMuCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDFmMGE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQW5kcm9pZC5icApAQCAtMCwwICsxLDE2IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X21wZWcyZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRNcGVnMkRlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYm1wZWcyZGVjIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImV4dGVybmFsL2xpYm1wZWcyL2RlY29kZXIiLAorICAgICAgICAiZXh0ZXJuYWwvbGlibXBlZzIvY29tbW9uIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MDY3N2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5jcHAKQEAgLTAsMCArMSwxMDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRNcGVnMkRlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyTWFwcGVyLmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdE1wZWcyRGVjLmgiCisjaW5jbHVkZSAiaW1wZWcyZC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5tcGVnMi5kZWNvZGVyIjsKKworY2xhc3MgQzJTb2Z0TXBlZzJEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQorICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIC8vIFRPRE86IG91dHB1dCBsYXRlbmN5IGFuZCByZW9yZGVyaW5nCisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZyhDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDE2LCAxOTIwLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMTYsIDEwODgsIDQpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9TSU1QTEUsIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0gpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NJTVBMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX01BSU59KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QMlZfTE9XLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDJWX01BSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSF8xNDQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0h9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhTaXplLCBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDE5MjAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAxMDg4LCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzMjAgKiAyNDAgKiAzIC8gMikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobU1heElucHV0U2l6ZSwgdmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhJbnB1dFNpemVTZXR0ZXIsIG1NYXhTaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbMV0gPSB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIDF1LCAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBtZW1jcHkoZGVmYXVsdENvbG9ySW5mby0+bS5sb2NhdGlvbnMsIGxvY2F0aW9ucywgc2l6ZW9mKGxvY2F0aW9ucykpOworCisgICAgICAgIGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9LAorICAgICAgICAgICAgICAgICAgICAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBoZWxwZXItPmFkZFN0cnVjdERlc2NyaXB0b3JzPEMyQ2hyb21hT2Zmc2V0U3RydWN0PigpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JJbmZvLCBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShkZWZhdWx0Q29sb3JJbmZvKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURlZmF1bHRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2RlZENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX0xJTUlURUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29sb3JBc3BlY3RzU2V0dGVyLCBtRGVmYXVsdENvbG9yQXNwZWN0cywgbUNvZGVkQ29sb3JBc3BlY3RzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgZm9ybWF0cz8KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QaXhlbEZvcm1hdCwgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhQaWN0dXJlU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIFRPRE86IGdldCBtYXggd2lkdGgvaGVpZ2h0IGZyb20gdGhlIHNpemUncyBmaWVsZCBoZWxwZXJzIHZzLiBoYXJkY29kaW5nCisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCAxOTIwdSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCAxMDg4dSk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhJbnB1dFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1heFNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIGFzc3VtZSBjb21wcmVzc2lvbiByYXRpbyBvZiAxCisgICAgICAgIG1lLnNldCgpLnZhbHVlID0gKCgobWF4U2l6ZS52LndpZHRoICsgMTUpIC8gMTYpICogKChtYXhTaXplLnYuaGVpZ2h0ICsgMTUpIC8gMTYpICogMzg0KTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpc2l6ZTsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAobWUudi5yYW5nZSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYubWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBDb2RlZENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAobWUudi5yYW5nZSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYubWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZkZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZjb2RlZCkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gdGFrZSBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIHVuc3BlY2lmaWVkIGZpZWxkcywgYW5kIGNvZGVkIHZhbHVlcyBmb3Igc3BlY2lmaWVkIG9uZXMKKyAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBjb2RlZC52LnJhbmdlID09IFJBTkdFX1VOU1BFQ0lGSUVEID8gZGVmLnYucmFuZ2UgOiBjb2RlZC52LnJhbmdlOworICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBjb2RlZC52LnByaW1hcmllcyA9PSBQUklNQVJJRVNfVU5TUEVDSUZJRUQKKyAgICAgICAgICAgICAgICA/IGRlZi52LnByaW1hcmllcyA6IGNvZGVkLnYucHJpbWFyaWVzOworICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IGNvZGVkLnYudHJhbnNmZXIgPT0gVFJBTlNGRVJfVU5TUEVDSUZJRUQKKyAgICAgICAgICAgICAgICA/IGRlZi52LnRyYW5zZmVyIDogY29kZWQudi50cmFuc2ZlcjsKKyAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gY29kZWQudi5tYXRyaXggPT0gTUFUUklYX1VOU1BFQ0lGSUVEID8gZGVmLnYubWF0cml4IDogY29kZWQudi5tYXRyaXg7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBnZXRDb2xvckFzcGVjdHNfbCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db2xvckFzcGVjdHM7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiBtTWF4U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1NYXhJbnB1dFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IG1Db2xvckluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+IG1Db2RlZENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gbURlZmF1bHRDb2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBtQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0PiBtUGl4ZWxGb3JtYXQ7Cit9OworCitzdGF0aWMgc2l6ZV90IGdldENwdUNvcmVDb3VudCgpIHsKKyAgICBsb25nIGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVsZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OworfQorCitzdGF0aWMgdm9pZCAqaXZkX2FsaWduZWRfbWFsbG9jKFdPUkQzMiBhbGlnbm1lbnQsIFdPUkQzMiBzaXplKSB7CisgICAgcmV0dXJuIG1lbWFsaWduKGFsaWdubWVudCwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGl2ZF9hbGlnbmVkX2ZyZWUodm9pZCAqbWVtKSB7CisgICAgZnJlZShtZW0pOworfQorCitDMlNvZnRNcGVnMkRlYzo6QzJTb2Z0TXBlZzJEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICAgIG1EZWNIYW5kbGUobnVsbHB0ciksCisgICAgICAgIG1NZW1SZWNvcmRzKG51bGxwdHIpLAorICAgICAgICBtT3V0QnVmZmVyRHJhaW4obnVsbHB0ciksCisgICAgICAgIG1JdkNvbG9yZm9ybWF0KElWX1lVVl80MjBQKSwKKyAgICAgICAgbVdpZHRoKDMyMCksCisgICAgICAgIG1IZWlnaHQoMjQwKSB7CisgICAgLy8gSWYgaW5wdXQgZHVtcCBpcyBlbmFibGVkLCB0aGVuIG9wZW4gY3JlYXRlIGFuIGVtcHR5IGZpbGUKKyAgICBHRU5FUkFURV9GSUxFX05BTUVTKCk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtSW5GaWxlKTsKK30KKworQzJTb2Z0TXBlZzJEZWM6On5DMlNvZnRNcGVnMkRlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAoT0sgIT0gcmVzZXREZWNvZGVyKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgcmVzZXRQbHVnaW4oKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzJEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpIG9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdE1wZWcyRGVjOjpvblJlbGVhc2UoKSB7CisgICAgKHZvaWQpIGRlbGV0ZURlY29kZXIoKTsKKyAgICBpZiAobU91dEJ1ZmZlckRyYWluKSB7CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobU91dEJ1ZmZlckRyYWluKTsKKyAgICAgICAgbU91dEJ1ZmZlckRyYWluID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1PdXRCbG9jaykgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKG1NZW1SZWNvcmRzKSB7CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobU1lbVJlY29yZHMpOworICAgICAgICBtTWVtUmVjb3JkcyA9IG51bGxwdHI7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAoT0sgIT0gc2V0Rmx1c2hNb2RlKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisKKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gbVN0cmlkZTsKKyAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gbUhlaWdodDsKKyAgICB1aW50MzJfdCBidWZmZXJTaXplID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQgKiAzIC8gMjsKKyAgICBtT3V0QnVmZmVyRHJhaW4gPSAodWludDhfdCAqKWl2ZF9hbGlnbmVkX21hbGxvYygxMjgsIGJ1ZmZlclNpemUpOworICAgIGlmICghbU91dEJ1ZmZlckRyYWluKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgYWxsb2NhdGUgdG1wIG91dHB1dCBidWZmZXIgKGZvciBmbHVzaCkgb2Ygc2l6ZSAldSAiLCBidWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICB9CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKworICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCBudWxscHRyLCBudWxscHRyLCAwLCAwLCAwKTsKKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIGlmICgwID09IHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobU91dEJ1ZmZlckRyYWluKSB7CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobU91dEJ1ZmZlckRyYWluKTsKKyAgICAgICAgbU91dEJ1ZmZlckRyYWluID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpnZXROdW1NZW1SZWNvcmRzKCkgeworICAgIGl2X251bV9tZW1fcmVjX2lwX3Qgc19udW1fbWVtX3JlY19pcDsKKyAgICBpdl9udW1fbWVtX3JlY19vcF90IHNfbnVtX21lbV9yZWNfb3A7CisKKyAgICBzX251bV9tZW1fcmVjX2lwLnU0X3NpemUgPSBzaXplb2Yoc19udW1fbWVtX3JlY19pcCk7CisgICAgc19udW1fbWVtX3JlY19pcC5lX2NtZCA9IElWX0NNRF9HRVRfTlVNX01FTV9SRUM7CisgICAgc19udW1fbWVtX3JlY19vcC51NF9zaXplID0gc2l6ZW9mKHNfbnVtX21lbV9yZWNfb3ApOworCisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX251bV9tZW1fcmVjX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19udW1fbWVtX3JlY19vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiBnZXR0aW5nIG1lbSByZWNvcmRzOiAweCV4Iiwgc19udW1fbWVtX3JlY19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1OdW1NZW1SZWNvcmRzID0gc19udW1fbWVtX3JlY19vcC51NF9udW1fbWVtX3JlYzsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmZpbGxNZW1SZWNvcmRzKCkgeworICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYyA9IChpdl9tZW1fcmVjX3QgKikgaXZkX2FsaWduZWRfbWFsbG9jKAorICAgICAgICAgICAgMTI4LCBtTnVtTWVtUmVjb3JkcyAqIHNpemVvZihpdl9tZW1fcmVjX3QpKTsKKyAgICBpZiAoIXBzX21lbV9yZWMpIHsKKyAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICBtZW1zZXQocHNfbWVtX3JlYywgMCwgbU51bU1lbVJlY29yZHMgKiBzaXplb2YoaXZfbWVtX3JlY190KSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKQorICAgICAgICBwc19tZW1fcmVjW2ldLnU0X3NpemUgPSBzaXplb2YoaXZfbWVtX3JlY190KTsKKyAgICBtTWVtUmVjb3JkcyA9IHBzX21lbV9yZWM7CisKKyAgICBpdmRleHRfZmlsbF9tZW1fcmVjX2lwX3Qgc19maWxsX21lbV9pcDsKKyAgICBpdmRleHRfZmlsbF9tZW1fcmVjX29wX3Qgc19maWxsX21lbV9vcDsKKworICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfZmlsbF9tZW1fcmVjX2lwX3QpOworICAgIHNfZmlsbF9tZW1faXAudTRfc2hhcmVfZGlzcF9idWYgPSAwOworICAgIHNfZmlsbF9tZW1faXAuZV9vdXRwdXRfZm9ybWF0ID0gbUl2Q29sb3Jmb3JtYXQ7CisgICAgc19maWxsX21lbV9pcC51NF9kZWludGVybGFjZSA9IDE7CisgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC5lX2NtZCA9IElWX0NNRF9GSUxMX05VTV9NRU1fUkVDOworICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QucHZfbWVtX3JlY19sb2NhdGlvbiA9IG1NZW1SZWNvcmRzOworICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QudTRfbWF4X2ZybV93ZCA9IG1XaWR0aDsKKyAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnU0X21heF9mcm1faHQgPSBtSGVpZ2h0OworICAgIHNfZmlsbF9tZW1fb3Auc19pdmRfZmlsbF9tZW1fcmVjX29wX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfZmlsbF9tZW1fcmVjX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19maWxsX21lbV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZmlsbF9tZW1fb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gZmlsbGluZyBtZW0gcmVjb3JkczogMHgleCIsCisgICAgICAgICAgICAgIHNfZmlsbF9tZW1fb3Auc19pdmRfZmlsbF9tZW1fcmVjX29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIENIRUNLX0VRKG1OdW1NZW1SZWNvcmRzLCBzX2ZpbGxfbWVtX29wLnNfaXZkX2ZpbGxfbWVtX3JlY19vcF90LnU0X251bV9tZW1fcmVjX2ZpbGxlZCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrLCBwc19tZW1fcmVjKyspIHsKKyAgICAgICAgcHNfbWVtX3JlYy0+cHZfYmFzZSA9IGl2ZF9hbGlnbmVkX21hbGxvYygKKyAgICAgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fYWxpZ25tZW50LCBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSk7CisgICAgICAgIGlmICghcHNfbWVtX3JlYy0+cHZfYmFzZSkgeworICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSBmb3IgbWVtb3J5IHJlY29yZCAjJXp1IG9mIHNpemUgJXUiLAorICAgICAgICAgICAgICAgICAgaSwgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmNyZWF0ZURlY29kZXIoKSB7CisgICAgaXZkZXh0X2luaXRfaXBfdCBzX2luaXRfaXA7CisgICAgaXZkZXh0X2luaXRfb3BfdCBzX2luaXRfb3A7CisKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2luaXRfaXBfdCk7CisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC5lX2NtZCA9IChJVkRfQVBJX0NPTU1BTkRfVFlQRV9UKUlWX0NNRF9JTklUOworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QucHZfbWVtX3JlY19sb2NhdGlvbiA9IG1NZW1SZWNvcmRzOworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfZnJtX21heF93ZCA9IG1XaWR0aDsKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnU0X2ZybV9tYXhfaHQgPSBtSGVpZ2h0OworICAgIHNfaW5pdF9pcC51NF9zaGFyZV9kaXNwX2J1ZiA9IDA7CisgICAgc19pbml0X2lwLnU0X2RlaW50ZXJsYWNlID0gMTsKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnU0X251bV9tZW1fcmVjID0gbU51bU1lbVJlY29yZHM7CisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC5lX291dHB1dF9mb3JtYXQgPSBtSXZDb2xvcmZvcm1hdDsKKyAgICBzX2luaXRfb3Auc19pdmRfaW5pdF9vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2luaXRfb3BfdCk7CisKKyAgICBtRGVjSGFuZGxlID0gKGl2X29ial90ICopbU1lbVJlY29yZHNbMF0ucHZfYmFzZTsKKyAgICBtRGVjSGFuZGxlLT5wdl9meG5zID0gKHZvaWQgKilpdmRlY19hcGlfZnVuY3Rpb247CisgICAgbURlY0hhbmRsZS0+dTRfc2l6ZSA9IHNpemVvZihpdl9vYmpfdCk7CisKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfaW5pdF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfaW5pdF9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBzX2luaXRfb3Auc19pdmRfaW5pdF9vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpzZXROdW1Db3JlcygpIHsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCBzX3NldF9udW1fY29yZXNfaXA7CisgICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3Qgc19zZXRfbnVtX2NvcmVzX29wOworCisgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QpOworICAgIHNfc2V0X251bV9jb3Jlc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X251bV9jb3Jlc19pcC5lX3N1Yl9jbWQgPSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTOworICAgIHNfc2V0X251bV9jb3Jlc19pcC51NF9udW1fY29yZXMgPSBtTnVtQ29yZXM7CisgICAgc19zZXRfbnVtX2NvcmVzX29wLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfbnVtX2NvcmVzX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfbnVtX2NvcmVzX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X251bV9jb3Jlc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6c2V0UGFyYW1zKHNpemVfdCBzdHJpZGUpIHsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfaXBfdCBzX3NldF9keW5fcGFyYW1zX2lwOworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90IHNfc2V0X2R5bl9wYXJhbXNfb3A7CisKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX2lwX3QpOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1NFVFBBUkFNUzsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X2Rpc3Bfd2QgPSAoVVdPUkQzMikgc3RyaWRlOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9mcm1fc2tpcF9tb2RlID0gSVZEX1NLSVBfTk9ORTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX291dF9tb2RlID0gSVZEX0RJU1BMQVlfRlJBTUVfT1VUOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV92aWRfZGVjX21vZGUgPSBJVkRfREVDT0RFX0ZSQU1FOworICAgIHNfc2V0X2R5bl9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9keW5fcGFyYW1zX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZHluX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9keW5fcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpnZXRWZXJzaW9uKCkgeworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCBzX2dldF92ZXJzaW9uaW5mb19pcDsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3Qgc19nZXRfdmVyc2lvbmluZm9fb3A7CisgICAgVVdPUkQ4IGF1MV9idWZbNTEyXTsKKworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90KTsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0dFVFZFUlNJT047CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAucHZfdmVyc2lvbl9idWZmZXIgPSBhdTFfYnVmOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnU0X3ZlcnNpb25fYnVmZmVyX3NpemUgPSBzaXplb2YoYXUxX2J1Zik7CisgICAgc19nZXRfdmVyc2lvbmluZm9fb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdmVyc2lvbmluZm9faXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92ZXJzaW9uaW5mb19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBzX2dldF92ZXJzaW9uaW5mb19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiaXR0aWFtIGRlY29kZXIgdmVyc2lvbiBudW1iZXI6ICVzIiwKKyAgICAgICAgICAgICAgKGNoYXIgKikgc19nZXRfdmVyc2lvbmluZm9faXAucHZfdmVyc2lvbl9idWZmZXIpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmluaXREZWNvZGVyKCkgeworICAgIHN0YXR1c190IHJldCA9IGdldE51bU1lbVJlY29yZHMoKTsKKyAgICBpZiAoT0sgIT0gcmV0KSByZXR1cm4gcmV0OworCisgICAgcmV0ID0gZmlsbE1lbVJlY29yZHMoKTsKKyAgICBpZiAoT0sgIT0gcmV0KSByZXR1cm4gcmV0OworCisgICAgaWYgKE9LICE9IGNyZWF0ZURlY29kZXIoKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisKKyAgICBtTnVtQ29yZXMgPSBNSU4oZ2V0Q3B1Q29yZUNvdW50KCksIE1BWF9OVU1fQ09SRVMpOworICAgIG1TdHJpZGUgPSBBTElHTjY0KG1XaWR0aCk7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAodm9pZCkgc2V0TnVtQ29yZXMoKTsKKyAgICBpZiAoT0sgIT0gc2V0UGFyYW1zKG1TdHJpZGUpKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAodm9pZCkgZ2V0VmVyc2lvbigpOworCisgICAgcmV0dXJuIE9LOworfQorCitib29sIEMyU29mdE1wZWcyRGVjOjpzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY29kZV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWFkVmlldyAqaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgKm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0c01hcmtlcikgeworICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBtU3RyaWRlOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBtSGVpZ2h0OworICAgIHNpemVfdCBsdW1hU2l6ZSA9IGRpc3BsYXlTdHJpZGUgKiBkaXNwbGF5SGVpZ2h0OworICAgIHNpemVfdCBjaHJvbWFTaXplID0gbHVtYVNpemUgPj4gMjsKKworICAgIHBzX2RlY29kZV9pcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX2lwX3QpOworICAgIHBzX2RlY29kZV9pcC0+ZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0RFQ09ERTsKKyAgICBpZiAoaW5CdWZmZXIpIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IHRzTWFya2VyOworICAgICAgICBwc19kZWNvZGVfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5CdWZmZXItPmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF9udW1fQnl0ZXMgPSBpblNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IDA7CisgICAgICAgIHBzX2RlY29kZV9pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfbnVtX0J5dGVzID0gMDsKKyAgICB9CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVswXSA9IGx1bWFTaXplOworICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMV0gPSBjaHJvbWFTaXplOworICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMl0gPSBjaHJvbWFTaXplOworICAgIGlmIChvdXRCdWZmZXIpIHsKKyAgICAgICAgaWYgKG91dEJ1ZmZlci0+d2lkdGgoKSA8IGRpc3BsYXlTdHJpZGUgfHwgb3V0QnVmZmVyLT5oZWlnaHQoKSA8IGRpc3BsYXlIZWlnaHQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJPdXRwdXQgYnVmZmVyIHRvbyBzbWFsbDogcHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJXV4JXUpIiwKKyAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+d2lkdGgoKSwgb3V0QnVmZmVyLT5oZWlnaHQoKSwgZGlzcGxheVN0cmlkZSwgZGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IG1PdXRCdWZmZXJEcmFpbjsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBtT3V0QnVmZmVyRHJhaW4gKyBsdW1hU2l6ZTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBtT3V0QnVmZmVyRHJhaW4gKyBsdW1hU2l6ZSArIGNocm9tYVNpemU7CisgICAgfQorICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X251bV9idWZzID0gMzsKKyAgICBwc19kZWNvZGVfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9vcF90KTsKKworICAgIHJldHVybiB0cnVlOworfQorCisKK2Jvb2wgQzJTb2Z0TXBlZzJEZWM6OmdldFNlcUluZm8oKSB7CisgICAgaXZkZXh0X2N0bF9nZXRfc2VxX2luZm9faXBfdCBzX2N0bF9nZXRfc2VxX2luZm9faXA7CisgICAgaXZkZXh0X2N0bF9nZXRfc2VxX2luZm9fb3BfdCBzX2N0bF9nZXRfc2VxX2luZm9fb3A7CisKKyAgICBzX2N0bF9nZXRfc2VxX2luZm9faXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX2dldF9zZXFfaW5mb19pcF90KTsKKyAgICBzX2N0bF9nZXRfc2VxX2luZm9faXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2N0bF9nZXRfc2VxX2luZm9faXAuZV9zdWJfY21kID0KKyAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVClJTVBFRzJEX0NNRF9DVExfR0VUX1NFUV9JTkZPOworICAgIHNfY3RsX2dldF9zZXFfaW5mb19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19jdGxfZ2V0X3NlcV9pbmZvX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19jdGxfZ2V0X3NlcV9pbmZvX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR1coIkVycm9yIGluIGdldHRpbmcgU2VxdWVuY2UgaW5mbzogMHgleCIsIHNfY3RsX2dldF9zZXFfaW5mb19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFZ1aUNvbG9yQXNwZWN0cyB2dWlDb2xvckFzcGVjdHM7CisgICAgdnVpQ29sb3JBc3BlY3RzLnByaW1hcmllcyA9IHNfY3RsX2dldF9zZXFfaW5mb19vcC51MV9jb2xvdXJfcHJpbWFyaWVzOworICAgIHZ1aUNvbG9yQXNwZWN0cy50cmFuc2ZlciA9IHNfY3RsX2dldF9zZXFfaW5mb19vcC51MV90cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M7CisgICAgdnVpQ29sb3JBc3BlY3RzLmNvZWZmcyA9IHNfY3RsX2dldF9zZXFfaW5mb19vcC51MV9tYXRyaXhfY29lZmZpY2llbnRzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5mdWxsUmFuZ2UgPSAgZmFsc2U7ICAvLyBtcGVnMiB2aWRlbyBoYXMgbGltaXRlZCByYW5nZS4KKworICAgIC8vIGNvbnZlcnQgdnVpIGFzcGVjdHMgdG8gQzIgdmFsdWVzIGlmIGNoYW5nZWQKKyAgICBpZiAoISh2dWlDb2xvckFzcGVjdHMgPT0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0cykpIHsKKyAgICAgICAgbUJpdHN0cmVhbUNvbG9yQXNwZWN0cyA9IHZ1aUNvbG9yQXNwZWN0czsKKyAgICAgICAgQ29sb3JBc3BlY3RzIHNmQXNwZWN0czsKKyAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCBjb2RlZEFzcGVjdHMgPSB7IDB1IH07CisgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzLCB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIsIHZ1aUNvbG9yQXNwZWN0cy5jb2VmZnMsCisgICAgICAgICAgICAgICAgdnVpQ29sb3JBc3BlY3RzLmZ1bGxSYW5nZSwgc2ZBc3BlY3RzKTsKKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tUHJpbWFyaWVzLCAmY29kZWRBc3BlY3RzLnByaW1hcmllcykpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tUmFuZ2UsICZjb2RlZEFzcGVjdHMucmFuZ2UpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1NYXRyaXhDb2VmZnMsICZjb2RlZEFzcGVjdHMubWF0cml4KSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1UcmFuc2ZlciwgJmNvZGVkQXNwZWN0cy50cmFuc2ZlcikpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgKHZvaWQpbUludGYtPmNvbmZpZyh7JmNvZGVkQXNwZWN0c30sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpzZXRGbHVzaE1vZGUoKSB7CisgICAgaXZkX2N0bF9mbHVzaF9pcF90IHNfc2V0X2ZsdXNoX2lwOworICAgIGl2ZF9jdGxfZmx1c2hfb3BfdCBzX3NldF9mbHVzaF9vcDsKKworICAgIHNfc2V0X2ZsdXNoX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9mbHVzaF9pcF90KTsKKyAgICBzX3NldF9mbHVzaF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X2ZsdXNoX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0ZMVVNIOworICAgIHNfc2V0X2ZsdXNoX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9mbHVzaF9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2ZsdXNoX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZmx1c2hfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfZmx1c2hfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OnJlc2V0RGVjb2RlcigpIHsKKyAgICBpdmRfY3RsX3Jlc2V0X2lwX3Qgc19yZXNldF9pcDsKKyAgICBpdmRfY3RsX3Jlc2V0X29wX3Qgc19yZXNldF9vcDsKKworICAgIHNfcmVzZXRfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X2lwX3QpOworICAgIHNfcmVzZXRfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3Jlc2V0X2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1JFU0VUOworICAgIHNfcmVzZXRfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19yZXNldF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfcmVzZXRfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19yZXNldF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgICh2b2lkKSBzZXROdW1Db3JlcygpOworICAgIG1TdHJpZGUgPSAwOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEMyU29mdE1wZWcyRGVjOjpyZXNldFBsdWdpbigpIHsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmRlbGV0ZURlY29kZXIoKSB7CisgICAgaWYgKG1NZW1SZWNvcmRzKSB7CisgICAgICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKywgcHNfbWVtX3JlYysrKSB7CisgICAgICAgICAgICBpZiAocHNfbWVtX3JlYy0+cHZfYmFzZSkgeworICAgICAgICAgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUocHNfbWVtX3JlYy0+cHZfYmFzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtTWVtUmVjb3Jkcyk7CisgICAgICAgIG1NZW1SZWNvcmRzID0gbnVsbHB0cjsKKyAgICB9CisgICAgbURlY0hhbmRsZSA9IG51bGxwdHI7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpyZUluaXREZWNvZGVyKCkgeworICAgIGRlbGV0ZURlY29kZXIoKTsKKworICAgIHN0YXR1c190IHJldCA9IGluaXREZWNvZGVyKCk7CisgICAgaWYgKE9LICE9IHJldCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZGVjb2RlciIpOworICAgICAgICBkZWxldGVEZWNvZGVyKCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdE1wZWcyRGVjOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlR3JhcGhpY0J1ZmZlcihzdGQ6Om1vdmUobU91dEJsb2NrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KG1XaWR0aCwgbUhlaWdodCkpOworICAgIG1PdXRCbG9jayA9IG51bGxwdHI7CisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgYnVmZmVyLT5zZXRJbmZvKG1JbnRmLT5nZXRDb2xvckFzcGVjdHNfbCgpKTsKKyAgICB9CisKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlcl0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KTA7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfTsKKyAgICBpZiAod29yayAmJiBjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaChpbmRleCwgZmlsbFdvcmspOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgaWYgKCFtRGVjSGFuZGxlKSB7CisgICAgICAgIEFMT0dFKCJub3Qgc3VwcG9zZWQgdG8gYmUgaGVyZSwgaW52YWxpZCBkZWNvZGVyIGNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgaWYgKG1TdHJpZGUgIT0gQUxJR042NChtV2lkdGgpKSB7CisgICAgICAgIG1TdHJpZGUgPSBBTElHTjY0KG1XaWR0aCk7CisgICAgICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2sgJiYKKyAgICAgICAgICAgIChtT3V0QmxvY2stPndpZHRoKCkgIT0gbVN0cmlkZSB8fCBtT3V0QmxvY2stPmhlaWdodCgpICE9IG1IZWlnaHQpKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAoIW1PdXRCbG9jaykgeworICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2sobVN0cmlkZSwgbUhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJm1PdXRCbG9jayk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCkiLAorICAgICAgICAgICAgICBtT3V0QmxvY2stPndpZHRoKCksIG1PdXRCbG9jay0+aGVpZ2h0KCksIG1TdHJpZGUsIG1IZWlnaHQpOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gVE9ETzogY2FuIG92ZXJhbGwgZXJyb3IgY2hlY2tpbmcgYmUgaW1wcm92ZWQ/CisvLyBUT0RPOiBhbGxvdyBjb25maWd1cmF0aW9uIG9mIGNvbG9yIGZvcm1hdCBhbmQgdXNhZ2UgZm9yIGdyYXBoaWMgYnVmZmVycyBpbnN0ZWFkCisvLyAgICAgICBvZiBoYXJkIGNvZGluZyB0aGVtIHRvIEhBTF9QSVhFTF9GT1JNQVRfWVYxMgorLy8gVE9ETzogcGFzcyBjb2xvcmFzcGVjdHMgaW5mb3JtYXRpb24gdG8gc3VyZmFjZQorLy8gVE9ETzogdGVzdCBzdXBwb3J0IGZvciBkeW5hbWljIGNoYW5nZSBpbiByZXNvbHV0aW9uCisvLyBUT0RPOiB2ZXJpZnkgaWYgdGhlIGRlY29kZXIgc2VudCBiYWNrIGFsbCBmcmFtZXMKK3ZvaWQgQzJTb2Z0TXBlZzJEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICB1aW50MzJfdCB3b3JrSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSAmIDB4RkZGRkZGRkY7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgYm9vbCBoYXNQaWN0dXJlID0gZmFsc2U7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKyAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCAmclZpZXcsICZ3VmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT2Zmc2V0ICsgaW5Qb3MsIGluU2l6ZSAtIGluUG9zLCB3b3JrSW5kZXgpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiBpbnB1dCBkdW1wIGlzIGVuYWJsZWQsIHRoZW4gd3JpdGUgdG8gZmlsZQorICAgICAgICBEVU1QX1RPX0ZJTEUobUluRmlsZSwgc19kZWNvZGVfaXAucHZfc3RyZWFtX2J1ZmZlciwgc19kZWNvZGVfaXAudTRfbnVtX0J5dGVzKTsKKyAgICAgICAgV09SRDMyIGRlbGF5OworICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCBkZWxheSk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBXT1JEMzIgZGVjb2RlVGltZTsKKyAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOworICAgICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIGRlY29kZVRpbWUpOworICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCAiLCBkZWNvZGVUaW1lLCBkZWxheSwKKyAgICAgICAgICAgICAgc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKTsKKyAgICAgICAgaWYgKElNUEVHMkRfVU5TVVBQT1JURURfRElNRU5TSU9OUyA9PSBzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlKSB7CisgICAgICAgICAgICBBTE9HVigidW5zdXBwb3J0ZWQgcmVzb2x1dGlvbiA6ICVkeCVkIiwgc19kZWNvZGVfb3AudTRfcGljX3dkLCBzX2RlY29kZV9vcC51NF9waWNfaHQpOworICAgICAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfTk9fRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgICAgICAgICAgbVdpZHRoID0gc19kZWNvZGVfb3AudTRfcGljX3dkOworICAgICAgICAgICAgbUhlaWdodCA9IHNfZGVjb2RlX29wLnU0X3BpY19odDsKKworICAgICAgICAgICAgQUxPR0koIkNvbmZpZ3VyaW5nIGRlY29kZXI6IG1XaWR0aCAlZCAsIG1IZWlnaHQgJWQgIiwKKyAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3Qgc2V0IHdpZHRoIGFuZCBoZWlnaHQiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKE9LICE9IHJlSW5pdERlY29kZXIoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVpbml0aWFsaXplIGRlY29kZXIiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKElWRF9SRVNfQ0hBTkdFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKSB7CisgICAgICAgICAgICBBTE9HVigicmVzb2x1dGlvbiBjaGFuZ2VkIik7CisgICAgICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9OT19FT1MsIHBvb2wsIHdvcmspOworICAgICAgICAgICAgcmVzZXREZWNvZGVyKCk7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgwIDwgc19kZWNvZGVfb3AudTRfcGljX3dkICYmIDAgPCBzX2RlY29kZV9vcC51NF9waWNfaHQpIHsKKyAgICAgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9waWNfd2QgIT0gbVdpZHRoIHx8ICBzX2RlY29kZV9vcC51NF9waWNfaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgICAgIG1XaWR0aCA9IHNfZGVjb2RlX29wLnU0X3BpY193ZDsKKyAgICAgICAgICAgICAgICBtSGVpZ2h0ID0gc19kZWNvZGVfb3AudTRfcGljX2h0OworICAgICAgICAgICAgICAgIENIRUNLX0VRKDB1LCBzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCk7CisKKyAgICAgICAgICAgICAgICBBTE9HSSgiQ29uZmlndXJpbmcgZGVjb2RlciBvdXQ6IG1XaWR0aCAlZCAsIG1IZWlnaHQgJWQgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgICAgICAgICAgICAgIG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHNldCB3aWR0aCBhbmQgaGVpZ2h0Iik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICh2b2lkKSBnZXRTZXFJbmZvKCk7CisgICAgICAgIGhhc1BpY3R1cmUgfD0gKDEgPT0gc19kZWNvZGVfb3AudTRfZnJhbWVfZGVjb2RlZF9mbGFnKTsKKyAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZGVjb2RlX29wLnU0X3RzLCB3b3JrKTsKKyAgICAgICAgfQorCisgICAgICAgIGluUG9zICs9IHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZDsKKyAgICAgICAgaWYgKGhhc1BpY3R1cmUgJiYgKGluU2l6ZSAtIGluUG9zKSAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRCgiZGVjb2RlZCBmcmFtZSBpbiBjdXJyZW50IGFjY2VzcyBuYWwsIGlnbm9yaW5nIGZ1cnRoZXIgdHJhaWxpbmcgYnl0ZXMgJWQiLAorICAgICAgICAgICAgICAgICAgKGludClpblNpemUgLSAoaW50KWluUG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVvcykgeworICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoIWhhc1BpY3R1cmUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpkcmFpbkludGVybmFsKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGlmIChPSyAhPSBzZXRGbHVzaE1vZGUoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoQzJfT0sgIT0gZW5zdXJlRGVjb2RlclN0YXRlKHBvb2wpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgJndWaWV3LCAwLCAwLCAwKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsoc19kZWNvZGVfb3AudTRfdHMsIHdvcmspOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2NsYXNzIEMyU29mdE1wZWcyRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdE1wZWcyRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdE1wZWcyRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNcGVnMkRlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRNcGVnMkRlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWcyRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0TXBlZzJEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRNcGVnMkRlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk5OTg3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9NUEVHMl9ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX01QRUcyX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorCisjaW5jbHVkZSAiaXZfZGF0YXR5cGVkZWYuaCIKKyNpbmNsdWRlICJpdi5oIgorI2luY2x1ZGUgIml2ZC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgaXZkZWNfYXBpX2Z1bmN0aW9uICAgICAgICAgICAgICBpbXBlZzJkX2FwaV9mdW5jdGlvbgorI2RlZmluZSBpdmRleHRfaW5pdF9pcF90ICAgICAgICAgICAgICAgIGltcGVnMmRfaW5pdF9pcF90CisjZGVmaW5lIGl2ZGV4dF9pbml0X29wX3QgICAgICAgICAgICAgICAgaW1wZWcyZF9pbml0X29wX3QKKyNkZWZpbmUgaXZkZXh0X2ZpbGxfbWVtX3JlY19pcF90ICAgICAgICBpbXBlZzJkX2ZpbGxfbWVtX3JlY19pcF90CisjZGVmaW5lIGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCAgICAgICAgaW1wZWcyZF9maWxsX21lbV9yZWNfb3BfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCAgIGltcGVnMmRfY3RsX3NldF9udW1fY29yZXNfaXBfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCAgIGltcGVnMmRfY3RsX3NldF9udW1fY29yZXNfb3BfdAorI2RlZmluZSBpdmRleHRfY3RsX2dldF9zZXFfaW5mb19pcF90ICAgIGltcGVnMmRfY3RsX2dldF9zZXFfaW5mb19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX29wX3QgICAgaW1wZWcyZF9jdGxfZ2V0X3NlcV9pbmZvX29wX3QKKyNkZWZpbmUgQUxJR042NCh4KSAgICAgICAgICAgICAgICAgICAgICAoKCgoeCkgKyA2MykgPj4gNikgPDwgNikKKyNkZWZpbmUgTUFYX05VTV9DT1JFUyAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMgICAgXAorICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlNUEVHMkRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTCisjZGVmaW5lIE1JTihhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorI2RlZmluZSBHRVRUSU1FKGEsIGIpICAgICAgICAgICAgICAgICAgIGdldHRpbWVvZmRheShhLCBiKTsKKyNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICBcCisgICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCisgICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7CisKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisgICAgI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggICAgICIvc2RjYXJkL2NsaXBzL21wZWcyZF9pbnB1dCIKKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfRVhUICAgICAgIm0ydiIKKyAgICAjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RyY3B5KG1JbkZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJWxkLiVsZC4lcyIsIElOUFVUX0RVTVBfUEFUSCwgIFwKKyAgICAgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCAgICAgIFwKKyAgICAgICAgICAgICAgICBJTlBVVF9EVU1QX0VYVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisgICAgI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpIHsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgIndiIik7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IG9wZW4gZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorICAgICNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJhYiIpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnAgIT0gTlVMTCAmJiBtX2J1ZiAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdWludDMyX3QgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaSA9IGZ3cml0ZShtX2J1ZiwgMSwgbV9zaXplLCBmcCk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoImZ3cml0ZSByZXQgJWQgdG8gd3JpdGUgJWQiLCBpLCBtX3NpemUpOyAgXAorICAgICAgICAgICAgaWYgKGkgIT0gKHVpbnQzMl90KW1fc2l6ZSkgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFMT0dEKCJFcnJvciBpbiBmd3JpdGUsIHJldHVybmVkICVkIiwgaSk7ICAgXAorICAgICAgICAgICAgICAgIHBlcnJvcigiRXJyb3IgaW4gd3JpdGUgdG8gZmlsZSIpOyAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICVzIiwgbV9maWxlbmFtZSk7XAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfUEFUSAorICAgICNkZWZpbmUgSU5QVVRfRFVNUF9FWFQKKyAgICAjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEgKKyAgICAjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVAorICAgICNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpCisgICAgI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpCisgICAgI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKK3N0cnVjdCBDMlNvZnRNcGVnMkRlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRNcGVnMkRlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdE1wZWcyRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworIHByaXZhdGU6CisgICAgc3RhdHVzX3QgZ2V0TnVtTWVtUmVjb3JkcygpOworICAgIHN0YXR1c190IGZpbGxNZW1SZWNvcmRzKCk7CisgICAgc3RhdHVzX3QgY3JlYXRlRGVjb2RlcigpOworICAgIHN0YXR1c190IHNldE51bUNvcmVzKCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1zKHNpemVfdCBzdHJpZGUpOworICAgIHN0YXR1c190IGdldFZlcnNpb24oKTsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIGJvb2wgc2V0RGVjb2RlQXJncyhpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY29kZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNvZGVfb3AsCisgICAgICAgICAgICAgICAgICAgICAgIEMyUmVhZFZpZXcgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBDMkdyYXBoaWNWaWV3ICpvdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHNNYXJrZXIpOworICAgIGJvb2wgZ2V0U2VxSW5mbygpOworICAgIGMyX3N0YXR1c190IGVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCBzZXRGbHVzaE1vZGUoKTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCByZXNldERlY29kZXIoKTsKKyAgICB2b2lkIHJlc2V0UGx1Z2luKCk7CisgICAgc3RhdHVzX3QgZGVsZXRlRGVjb2RlcigpOworICAgIHN0YXR1c190IHJlSW5pdERlY29kZXIoKTsKKworICAgIC8vIFRPRE86VGhpcyBpcyBub3QgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGlzIGVudW0uIFRoZXNlIHNob3VsZAorICAgIC8vIGJlIHBhcnQgb2YgYzItdm5kayBzbyB0aGF0IHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGJ5IGFsbCB2aWRlbyBwbHVnaW5zCisgICAgLy8gdW50aWwgdGhlbiwgbWFrZSB0aGVtIGZlZWwgYXQgaG9tZQorICAgIGVudW0geworICAgICAgICBrTm90U3VwcG9ydGVkLAorICAgICAgICBrUHJlZmVyQml0c3RyZWFtLAorICAgICAgICBrUHJlZmVyQ29udGFpbmVyLAorICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGl2X29ial90ICptRGVjSGFuZGxlOworICAgIGl2X21lbV9yZWNfdCAqbU1lbVJlY29yZHM7CisgICAgc2l6ZV90IG1OdW1NZW1SZWNvcmRzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gbU91dEJsb2NrOworICAgIHVpbnQ4X3QgKm1PdXRCdWZmZXJEcmFpbjsKKworICAgIHNpemVfdCBtTnVtQ29yZXM7CisgICAgSVZfQ09MT1JfRk9STUFUX1QgbUl2Q29sb3Jmb3JtYXQ7CisKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICB1aW50MzJfdCBtU3RyaWRlOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKworICAgIC8vIENvbG9yIGFzcGVjdHMuIFRoZXNlIGFyZSBJU08gdmFsdWVzIGFuZCBhcmUgbWVhbnQgdG8gZGV0ZWN0IGNoYW5nZXMgaW4gYXNwZWN0cyB0byBhdm9pZAorICAgIC8vIGNvbnZlcnRpbmcgdGhlbSB0byBDMiB2YWx1ZXMgZm9yIGVhY2ggZnJhbWUKKyAgICBzdHJ1Y3QgVnVpQ29sb3JBc3BlY3RzIHsKKyAgICAgICAgdWludDhfdCBwcmltYXJpZXM7CisgICAgICAgIHVpbnQ4X3QgdHJhbnNmZXI7CisgICAgICAgIHVpbnQ4X3QgY29lZmZzOworICAgICAgICB1aW50OF90IGZ1bGxSYW5nZTsKKworICAgICAgICAvLyBkZWZhdWx0IGNvbG9yIGFzcGVjdHMKKyAgICAgICAgVnVpQ29sb3JBc3BlY3RzKCkKKyAgICAgICAgICAgIDogcHJpbWFyaWVzKDIpLCB0cmFuc2ZlcigyKSwgY29lZmZzKDIpLCBmdWxsUmFuZ2UoMCkgeyB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZ1aUNvbG9yQXNwZWN0cyAmbykgeworICAgICAgICAgICAgcmV0dXJuIHByaW1hcmllcyA9PSBvLnByaW1hcmllcyAmJiB0cmFuc2ZlciA9PSBvLnRyYW5zZmVyICYmIGNvZWZmcyA9PSBvLmNvZWZmcworICAgICAgICAgICAgICAgICAgICAmJiBmdWxsUmFuZ2UgPT0gby5mdWxsUmFuZ2U7CisgICAgICAgIH0KKyAgICB9IG1CaXRzdHJlYW1Db2xvckFzcGVjdHM7CisKKyAgICAvLyBwcm9maWxlCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisgICAgY2hhciBtSW5GaWxlWzIwMF07CisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0TXBlZzJEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfTVBFRzJfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFlNGY0NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQW5kcm9pZC5icApAQCAtMCwwICsxLDY2IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X21wZWc0ZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRNcGVnNERlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKKyAgICAgICAgIi1ETVBFRzQiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfaDI2M2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0TXBlZzREZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9tcGVnNGVuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgXSwKKworCisgICAgc3JjczogWyJDMlNvZnRNcGVnNEVuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X200dmgyNjNlbmMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURNUEVHNCIsCisgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfaDI2M2VuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0TXBlZzRFbmMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyIgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDRhNzMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5jcHAKQEAgLTAsMCArMSw3NTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaWZkZWYgTVBFRzQKKyAgI2RlZmluZSBMT0dfVEFHICJDMlNvZnRNcGVnNERlYyIKKyNlbHNlCisgICNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0SDI2M0RlYyIKKyNlbmRpZgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRNcGVnNERlYy5oIgorI2luY2x1ZGUgIm1wNGRlY19hcGkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWZkZWYgTVBFRzQKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5tcGVnNC5kZWNvZGVyIjsKKyNlbHNlCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuaDI2My5kZWNvZGVyIjsKKyNlbmRpZgorCitjbGFzcyBDMlNvZnRNcGVnNERlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNAorI2Vsc2UKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzCisjZW5kaWYKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgLy8gVE9ETzogUHJvcGVyIHN1cHBvcnQgZm9yIHJlb3JkZXIgZGVwdGguCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsT3V0cHV0RGVsYXksIEMyX1BBUkFNS0VZX09VVFBVVF9ERUxBWSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQoMXUpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDE3NiwgMTQ0KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAxOTIwLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMTA4OCwgMiksCisjZWxzZQorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDM1MiwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDI4OCwgMiksCisjZW5kaWYKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisjaWZkZWYgTVBFRzQKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9TSU1QTEUsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzMpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLmVxdWFsVG8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9TSU1QTEUpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzNCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfNEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl82fSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworI2Vsc2UKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfSDI2M19CQVNFTElORSwgQzJDb25maWc6OkxFVkVMX0gyNjNfMzApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0JBU0VMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSVNXVjJ9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfNDV9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZW5kaWYKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFNpemUsIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUpCisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dCgwdSwgMTkyMCwgMTA4OCkpCisjZWxzZQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAzNTIsIDI4OCkpCisjZW5kaWYKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAxOTIwLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMTA4OCwgMiksCisjZWxzZQorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDM1MiwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDI4OCwgMiksCisjZW5kaWYKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDE5MjAgKiAxMDg4ICogMyAvIDIpKQorI2Vsc2UKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzNTIgKiAyODggKiAzIC8gMikpCisjZW5kaWYKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtTWF4SW5wdXRTaXplLCB2YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKE1heElucHV0U2l6ZVNldHRlciwgbU1heFNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0IGxvY2F0aW9uc1sxXSA9IHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgMXUsIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIG1lbWNweShkZWZhdWx0Q29sb3JJbmZvLT5tLmxvY2F0aW9ucywgbG9jYXRpb25zLCBzaXplb2YobG9jYXRpb25zKSk7CisKKyAgICAgICAgZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgeyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH0sCisgICAgICAgICAgICAgICAgICAgIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIGhlbHBlci0+YWRkU3RydWN0RGVzY3JpcHRvcnM8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+KCk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckluZm8sIEMyX1BBUkFNS0VZX0NPREVEX0NPTE9SX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKGRlZmF1bHRDb2xvckluZm8pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmb3JtYXRzPworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBpeGVsRm9ybWF0LCBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heFBpY3R1cmVTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuIGhhcmRjb2RpbmcKKyNpZmRlZiBNUEVHNAorICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgMTkyMHUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgMTA4OHUpOworI2Vsc2UKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDM1MnUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgMjg4dSk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heElucHV0U2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWF4U2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gYXNzdW1lIGNvbXByZXNzaW9uIHJhdGlvIG9mIDEKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAoKChtYXhTaXplLnYud2lkdGggKyAxNSkgLyAxNikgKiAoKG1heFNpemUudi5oZWlnaHQgKyAxNSkgLyAxNikgKiAzODQpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0TWF4V2lkdGgoKSBjb25zdCB7IHJldHVybiBtTWF4U2l6ZS0+d2lkdGg7IH0KKyAgICB1aW50MzJfdCBnZXRNYXhIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtTWF4U2l6ZS0+aGVpZ2h0OyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+IG1NYXhTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbU1heElucHV0U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gbUNvbG9ySW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0OworfTsKKworQzJTb2Z0TXBlZzREZWM6OkMyU29mdE1wZWc0RGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1EZWNIYW5kbGUobnVsbHB0ciksCisgICAgICBtT3V0cHV0QnVmZmVye30sCisgICAgICBtSW5pdGlhbGl6ZWQoZmFsc2UpIHsKK30KKworQzJTb2Z0TXBlZzREZWM6On5DMlNvZnRNcGVnNERlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzREZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzREZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAobUluaXRpYWxpemVkKSB7CisgICAgICAgIGlmIChtRGVjSGFuZGxlKSB7CisgICAgICAgICAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIobURlY0hhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtOdW1PdXRwdXRCdWZmZXJzOyArK2kpIHsKKyAgICAgICAgaWYgKG1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgICAgIGZyZWUobU91dHB1dEJ1ZmZlcltpXSk7CisgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW2ldID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7CisgICAgbUZyYW1lc0NvbmZpZ3VyZWQgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzREZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7CisgICAgKHZvaWQpb25Jbml0KCk7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzREZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobUluaXRpYWxpemVkKSB7CisgICAgICAgIGlmIChtRGVjSGFuZGxlKSB7CisgICAgICAgICAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIobURlY0hhbmRsZSk7CisgICAgICAgICAgICBkZWxldGUgbURlY0hhbmRsZTsKKyAgICAgICAgICAgIG1EZWNIYW5kbGUgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7CisgICAgICAgIGlmIChtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICAgICAgICBmcmVlKG1PdXRwdXRCdWZmZXJbaV0pOworICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcltpXSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaWYgKFBWX1RSVUUgIT0gUFZSZXNldFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKSkgeworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgIH0KKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6aW5pdERlY29kZXIoKSB7CisjaWZkZWYgTVBFRzQKKyAgICBtSXNNcGVnNCA9IHRydWU7CisjZWxzZQorICAgIG1Jc01wZWc0ID0gZmFsc2U7CisjZW5kaWYKKyAgICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICAgICAgbURlY0hhbmRsZSA9IG5ldyB0YWd2aWRlb0RlY0NvbnRyb2xzOworICAgIH0KKyAgICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICAgICAgQUxPR0UoIm1EZWNIYW5kbGUgaXMgbnVsbCIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICBtZW1zZXQobURlY0hhbmRsZSwgMCwgc2l6ZW9mKHRhZ3ZpZGVvRGVjQ29udHJvbHMpKTsKKworICAgIC8qIFRPRE86IGJyaW5nIHRoZXNlIHZhbHVlcyB0byAzNTIgYW5kIDI4OC4gSXQgY2Fubm90IGJlIGRvbmUgYXMgb2Ygbm93CisgICAgICogYmVjYXVzZSwgaDI2MyBkb2Vzbid0IHNlZW0gdG8gYWxsb3cgcG9ydCByZWNvbmZpZ3VyYXRpb24uIEluIE9NWCwgdGhlCisgICAgICogcHJvYmxlbSBvZiBsYXJnZXIgd2lkdGggYW5kIGhlaWdodCB0aGFuIGRlZmF1bHQgd2lkdGggYW5kIGhlaWdodCBpcworICAgICAqIG92ZXJjb21lIGJ5IGFkYXB0aXZlUGxheUJhY2soKSBhcGkgY2FsbC4gVGhpcyBjYWxsIGdldHMgd2lkdGggYW5kIGhlaWdodAorICAgICAqIGluZm9ybWF0aW9uIGZyb20gZXh0cmFjdG9yLiBTdWNoIGEgdGhpbmcgaXMgbm90IHBvc3NpYmxlIGhlcmUuCisgICAgICogU28gd2UgYXJlIGNvbmZpZ3VyaW5nIHRvIGxhcmdlciB2YWx1ZXMuKi8KKyAgICBtV2lkdGggPSAxNDA4OworICAgIG1IZWlnaHQgPSAxMTUyOworICAgIG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKKyAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdE1wZWc0RGVjOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlR3JhcGhpY0J1ZmZlcihzdGQ6Om1vdmUobU91dEJsb2NrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KG1XaWR0aCwgbUhlaWdodCkpOworICAgIG1PdXRCbG9jayA9IG51bGxwdHI7CisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXIsIGluZGV4XShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIGlmICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAmJgorICAgICAgICAgICAgICAgIChjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6ZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICAgICAgQUxPR0UoIm5vdCBzdXBwb3NlZCB0byBiZSBoZXJlLCBpbnZhbGlkIGRlY29kZXIgY29udGV4dCIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIG1PdXRwdXRCdWZmZXJTaXplID0gYWxpZ24obUludGYtPmdldE1heFdpZHRoKCksIDE2KSAqIGFsaWduKG1JbnRmLT5nZXRNYXhIZWlnaHQoKSwgMTYpICogMyAvIDI7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwga051bU91dHB1dEJ1ZmZlcnM7ICsraSkgeworICAgICAgICBpZiAoIW1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSAodWludDhfdCAqKW1hbGxvYyhtT3V0cHV0QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBpZiAoIW1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChtT3V0QmxvY2sgJiYKKyAgICAgICAgICAgIChtT3V0QmxvY2stPndpZHRoKCkgIT0gYWxpZ24obVdpZHRoLCAxNikgfHwgbU91dEJsb2NrLT5oZWlnaHQoKSAhPSBtSGVpZ2h0KSkgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKCFtT3V0QmxvY2spIHsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKGFsaWduKG1XaWR0aCwgMTYpLCBtSGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmbU91dEJsb2NrKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImZldGNoR3JhcGhpY0Jsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCVkeCVkKSIsCisgICAgICAgICAgICAgIG1PdXRCbG9jay0+d2lkdGgoKSwgbU91dEJsb2NrLT5oZWlnaHQoKSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitib29sIEMyU29mdE1wZWc0RGVjOjpoYW5kbGVSZXNDaGFuZ2UoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBkaXNwX3dpZHRoLCBkaXNwX2hlaWdodDsKKyAgICBQVkdldFZpZGVvRGltZW5zaW9ucyhtRGVjSGFuZGxlLCAoaW50MzIgKikmZGlzcF93aWR0aCwgKGludDMyICopJmRpc3BfaGVpZ2h0KTsKKworICAgIHVpbnQzMl90IGJ1Zl93aWR0aCwgYnVmX2hlaWdodDsKKyAgICBQVkdldEJ1ZmZlckRpbWVuc2lvbnMobURlY0hhbmRsZSwgKGludDMyICopJmJ1Zl93aWR0aCwgKGludDMyICopJmJ1Zl9oZWlnaHQpOworCisgICAgQ0hFQ0tfTEUoZGlzcF93aWR0aCwgYnVmX3dpZHRoKTsKKyAgICBDSEVDS19MRShkaXNwX2hlaWdodCwgYnVmX2hlaWdodCk7CisKKyAgICBBTE9HVigiZGlzcGxheSBzaXplICglZHglZCksIGJ1ZmZlciBzaXplICglZHglZCkiLAorICAgICAgICAgICBkaXNwX3dpZHRoLCBkaXNwX2hlaWdodCwgYnVmX3dpZHRoLCBidWZfaGVpZ2h0KTsKKworICAgIGJvb2wgcmVzQ2hhbmdlZCA9IGZhbHNlOworICAgIGlmIChkaXNwX3dpZHRoICE9IG1XaWR0aCB8fCBkaXNwX2hlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgICAgIG1XaWR0aCA9IGRpc3Bfd2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBkaXNwX2hlaWdodDsKKyAgICAgICAgcmVzQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtOdW1PdXRwdXRCdWZmZXJzOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICAgICAgICAgICAgZnJlZShtT3V0cHV0QnVmZmVyW2ldKTsKKyAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW2ldID0gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUlzTXBlZzQpIHsKKyAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKworICAgICAgICAgICAgdWludDhfdCAqdm9sX2RhdGFbMV17fTsKKyAgICAgICAgICAgIGludDMyX3Qgdm9sX3NpemUgPSAwOworCisgICAgICAgICAgICBpZiAoIVBWSW5pdFZpZGVvRGVjb2RlcigKKyAgICAgICAgICAgICAgICAgICAgbURlY0hhbmRsZSwgdm9sX2RhdGEsICZ2b2xfc2l6ZSwgMSwgbUludGYtPmdldE1heFdpZHRoKCksIG1JbnRmLT5nZXRNYXhIZWlnaHQoKSwgSDI2M19NT0RFKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBQVkluaXRWaWRlb0RlY29kZXIgSDI2M19NT0RFIHdoaWxlIHJlc0NoYW5nZWQgd2FzIHNldCB0byB0cnVlIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUZyYW1lc0NvbmZpZ3VyZWQgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHJlc0NoYW5nZWQ7Cit9CisKKy8qIFRPRE86IGNhbiByZW1vdmUgdGVtcG9yYXJ5IGNvcHkgYWZ0ZXIgbGlicmFyeSBzdXBwb3J0cyB3cml0aW5nIHRvIGRpc3BsYXkKKyAqIGJ1ZmZlciBZLCBVIGFuZCBWIHBsYW5lIHBvaW50ZXJzIHVzaW5nIHN0cmlkZSBpbmZvLiAqLworc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBzaXplX3QgZHN0WVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgeworICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGFsaWduKGRzdFlTdHJpZGUgLyAyLCAxNik7CisgICAgc2l6ZV90IHNyY1VWU3RyaWRlID0gc3JjWVN0cmlkZSAvIDI7CisgICAgdWludDhfdCAqc3JjU3RhcnQgPSBzcmM7CisgICAgdWludDhfdCAqZHN0U3RhcnQgPSBkc3Q7CisgICAgc2l6ZV90IHZTdHJpZGUgPSBhbGlnbihoZWlnaHQsIDE2KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoKTsKKyAgICAgICAgIHNyYyArPSBzcmNZU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFlTdHJpZGU7CisgICAgfQorICAgIC8qIFUgYnVmZmVyICovCisgICAgc3JjID0gc3JjU3RhcnQgKyB2U3RyaWRlICogc3JjWVN0cmlkZTsKKyAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KSArIChkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoIC8gMik7CisgICAgICAgICBzcmMgKz0gc3JjVVZTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorICAgIC8qIFYgYnVmZmVyICovCisgICAgc3JjID0gc3JjU3RhcnQgKyB2U3RyaWRlICogc3JjWVN0cmlkZSAqIDUgLyA0OworICAgIGRzdCA9IGRzdFN0YXJ0ICsgKGRzdFlTdHJpZGUgKiBoZWlnaHQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoIC8gMik7CisgICAgICAgICBzcmMgKz0gc3JjVVZTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorfQorCit2b2lkIEMyU29mdE1wZWc0RGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgdWludDMyX3Qgd29ya0luZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkgJiAweEZGRkZGRkZGOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBpZiAoaW5TaXplID09IDApIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ4X3QgKmJpdHN0cmVhbSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgdWludDMyX3QgKnN0YXJ0X2NvZGUgPSAodWludDMyX3QgKiliaXRzdHJlYW07CisgICAgYm9vbCB2b2xIZWFkZXIgPSAqc3RhcnRfY29kZSA9PSAweEIwMDEwMDAwOworICAgIGlmICh2b2xIZWFkZXIpIHsKKyAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpOworICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICB1aW50OF90ICp2b2xfZGF0YVsxXXt9OworICAgICAgICBpbnQzMl90IHZvbF9zaXplID0gMDsKKworICAgICAgICBib29sIGNvZGVjQ29uZmlnID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwOworICAgICAgICBpZiAoY29kZWNDb25maWcgfHwgdm9sSGVhZGVyKSB7CisgICAgICAgICAgICB2b2xfZGF0YVswXSA9IGJpdHN0cmVhbTsKKyAgICAgICAgICAgIHZvbF9zaXplID0gaW5TaXplOworICAgICAgICB9CisgICAgICAgIE1QNERlY29kaW5nTW9kZSBtb2RlID0gKG1Jc01wZWc0KSA/IE1QRUc0X01PREUgOiBIMjYzX01PREU7CisgICAgICAgIGlmICghUFZJbml0VmlkZW9EZWNvZGVyKAorICAgICAgICAgICAgICAgIG1EZWNIYW5kbGUsIHZvbF9kYXRhLCAmdm9sX3NpemUsIDEsCisgICAgICAgICAgICAgICAgbUludGYtPmdldE1heFdpZHRoKCksIG1JbnRmLT5nZXRNYXhIZWlnaHQoKSwgbW9kZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJQVkluaXRWaWRlb0RlY29kZXIgZmFpbGVkLiBVbnN1cHBvcnRlZCBjb250ZW50PyIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICBNUDREZWNvZGluZ01vZGUgYWN0dWFsTW9kZSA9IFBWR2V0RGVjQml0c3RyZWFtTW9kZShtRGVjSGFuZGxlKTsKKyAgICAgICAgaWYgKG1vZGUgIT0gYWN0dWFsTW9kZSkgeworICAgICAgICAgICAgQUxPR0UoIkRlY29kZWQgbW9kZSBub3Qgc2FtZSBhcyBhY3R1YWwgbW9kZSBvZiB0aGUgZGVjb2RlciIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFBWU2V0UG9zdFByb2NUeXBlKG1EZWNIYW5kbGUsIDApOworICAgICAgICBpZiAoaGFuZGxlUmVzQ2hhbmdlKHdvcmspKSB7CisgICAgICAgICAgICBBTE9HSSgiU2V0dGluZyB3aWR0aCBhbmQgaGVpZ2h0Iik7CisgICAgICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgdXBkYXRlIHNpemUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb2RlY0NvbmZpZykgeworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKTsKKyAgICAgICAgaWYgKEMyX09LICE9IGVycikgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgeUZyYW1lU2l6ZSA9IHNpemVvZih1aW50OCkgKiBtRGVjSGFuZGxlLT5zaXplOworICAgICAgICBpZiAobU91dHB1dEJ1ZmZlclNpemUgPCB5RnJhbWVTaXplICogMyAvIDIpeworICAgICAgICAgICAgQUxPR0UoIlRvbyBzbWFsbCBvdXRwdXQgYnVmZmVyOiAlenUgYnl0ZXMiLCBtT3V0cHV0QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtRnJhbWVzQ29uZmlndXJlZCkgeworICAgICAgICAgICAgUFZTZXRSZWZlcmVuY2VZVVYobURlY0hhbmRsZSxtT3V0cHV0QnVmZmVyWzFdKTsKKyAgICAgICAgICAgIG1GcmFtZXNDb25maWd1cmVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgaWYgaGVhZGVyIGNvbnRhaW5zIG5ldyBpbmZvLCBlLmcuLCB3aWR0aC9oZWlnaHQsIGV0Yy4KKyAgICAgICAgVm9wSGVhZGVySW5mbyBoZWFkZXJfaW5mbzsKKyAgICAgICAgdWludDMyX3QgdXNlRXh0VGltZXN0YW1wID0gKGluUG9zID09IDApOworICAgICAgICBpbnQzMl90IHRtcEluU2l6ZSA9IChpbnQzMl90KWluU2l6ZTsKKyAgICAgICAgdWludDhfdCAqYml0c3RyZWFtVG1wID0gYml0c3RyZWFtOworICAgICAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSB3b3JrSW5kZXg7CisgICAgICAgIGlmIChQVkRlY29kZVZvcEhlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgbURlY0hhbmRsZSwgJmJpdHN0cmVhbVRtcCwgJnRpbWVzdGFtcCwgJnRtcEluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgJmhlYWRlcl9pbmZvLCAmdXNlRXh0VGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW21OdW1TYW1wbGVzT3V0cHV0ICYgMV0pICE9IFBWX1RSVUUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZGVjb2RlIHZvcCBoZWFkZXIuIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gSDI2MyBkb2Vzbid0IGhhdmUgVk9MIGhlYWRlciwgdGhlIGZyYW1lIHNpemUgaW5mb3JtYXRpb24gaXMgaW4gc2hvcnQgaGVhZGVyLCBpLmUuIHRoZQorICAgICAgICAvLyBkZWNvZGVyIG1heSBkZXRlY3Qgc2l6ZSBjaGFuZ2UgYWZ0ZXIgUFZEZWNvZGVWb3BIZWFkZXIuCisgICAgICAgIGJvb2wgcmVzQ2hhbmdlID0gaGFuZGxlUmVzQ2hhbmdlKHdvcmspOworICAgICAgICBpZiAobUlzTXBlZzQgJiYgcmVzQ2hhbmdlKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHJlc0NoYW5nZSkgeworICAgICAgICAgICAgQUxPR0koIlNldHRpbmcgd2lkdGggYW5kIGhlaWdodCIpOworICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgdXBkYXRlIHNpemUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoUFZEZWNvZGVWb3BCb2R5KG1EZWNIYW5kbGUsICZ0bXBJblNpemUpICE9IFBWX1RSVUUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZGVjb2RlIHZpZGVvIGZyYW1lLiIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGFuZGxlUmVzQ2hhbmdlKHdvcmspKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCAqb3V0cHV0QnVmZmVyWSA9IHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgICh2b2lkKWNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZShvdXRwdXRCdWZmZXJZLCBtT3V0cHV0QnVmZmVyW21OdW1TYW1wbGVzT3V0cHV0ICYgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Vmlldy53aWR0aCgpLCBhbGlnbihtV2lkdGgsIDE2KSwgbVdpZHRoLCBtSGVpZ2h0KTsKKworICAgICAgICBpblBvcyArPSBpblNpemUgLSAoc2l6ZV90KXRtcEluU2l6ZTsKKyAgICAgICAgZmluaXNoV29yayh3b3JrSW5kZXgsIHdvcmspOworICAgICAgICArK21OdW1TYW1wbGVzT3V0cHV0OworICAgICAgICBpZiAoaW5TaXplIC0gaW5Qb3MgIT0gMCkgeworICAgICAgICAgICAgQUxPR0QoImRlY29kZWQgZnJhbWUsIGlnbm9yaW5nIGZ1cnRoZXIgdHJhaWxpbmcgYnl0ZXMgJWQiLAorICAgICAgICAgICAgICAgICAgKGludClpblNpemUgLSAoaW50KWluUG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKXBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdE1wZWc0RGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdE1wZWc0RGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0TXBlZzREZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWc0RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdE1wZWc0RGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TXBlZzREZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcGVnNERlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE1wZWc0RGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2YTA5NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMl9TT0ZUX01QRUc0X0RFQ19IXworI2RlZmluZSBDMl9TT0ZUX01QRUc0X0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCitzdHJ1Y3QgdGFndmlkZW9EZWNDb250cm9sczsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0TXBlZzREZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0TXBlZzREZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcGVnNERlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyBwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTnVtT3V0cHV0QnVmZmVycyA9IDIsCisgICAgfTsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYzJfc3RhdHVzX3QgZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpOworICAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworICAgIGJvb2wgaGFuZGxlUmVzQ2hhbmdlKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdGFndmlkZW9EZWNDb250cm9scyAqbURlY0hhbmRsZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IG1PdXRCbG9jazsKKyAgICB1aW50OF90ICptT3V0cHV0QnVmZmVyW2tOdW1PdXRwdXRCdWZmZXJzXTsKKyAgICBzaXplX3QgIG1PdXRwdXRCdWZmZXJTaXplOworCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgdWludDMyX3QgbU51bVNhbXBsZXNPdXRwdXQ7CisKKyAgICBib29sIG1Jc01wZWc0OworICAgIGJvb2wgbUluaXRpYWxpemVkOworICAgIGJvb2wgbUZyYW1lc0NvbmZpZ3VyZWQ7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0TXBlZzREZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDMl9TT0ZUX01QRUc0X0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWZhNTlkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5jcHAKQEAgLTAsMCArMSw2NzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpZmRlZiBNUEVHNAorICAjZGVmaW5lIExPR19UQUcgIkMyU29mdE1wZWc0RW5jIgorI2Vsc2UKKyAgI2RlZmluZSBMT0dfVEFHICJDMlNvZnRIMjYzRW5jIgorI2VuZGlmCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgIkMyU29mdE1wZWc0RW5jLmgiCisjaW5jbHVkZSAibXA0ZW5jX2FwaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZmRlZiBNUEVHNAorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm1wZWc0LmVuY29kZXIiOworI2Vsc2UKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5oMjYzLmVuY29kZXIiOworI2VuZGlmCisKK2NsYXNzIEMyU29mdE1wZWc0RW5jOjpJbnRmSW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgaGVscGVyKQorICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKGhlbHBlcikgeworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoMHUsIEMyQnVmZmVyRGF0YTo6R1JBUEhJQykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcihEZWZpbmVQYXJhbShtVXNhZ2UsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9VU0FHRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgKHVpbnQ2NF90KUMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCgwdSwgMTc2LCAxNDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDE2LCAxNzYsIDE2KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMTYsIDE0NCwgMTYpLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkub25lT2YoezE3NiwgMzUyfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5vbmVPZih7MTQ0LCAyODh9KSwKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUZyYW1lUmF0ZSwgQzJfUEFSQU1LRVlfRlJBTUVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0KDB1LCAxNy4pKQorICAgICAgICAgICAgICAgIC8vIFRPRE86IE1vcmUgcmVzdHJpY3Rpb24/CisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRnJhbWVSYXRlLCB2YWx1ZSkuZ3JlYXRlclRoYW4oMC4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptRnJhbWVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg0MDk2LCAxMjAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEJpdHJhdGVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU3luY0ZyYW1lUGVyaW9kLCBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0KDB1LCAxMDAwMDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TeW5jRnJhbWVQZXJpb2QsIHZhbHVlKS5hbnkoKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptU3luY0ZyYW1lUGVyaW9kKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyNpZmRlZiBNUEVHNAorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIFBST0ZJTEVfTVA0Vl9TSU1QTEUsIExFVkVMX01QNFZfMikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkuZXF1YWxUbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9GSUxFX01QNFZfU0lNUExFKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8wQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzJ9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyNlbHNlCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgUFJPRklMRV9IMjYzX0JBU0VMSU5FLCBMRVZFTF9IMjYzXzQ1KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5lcXVhbFRvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0ZJTEVfSDI2M19CQVNFTElORSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQ1fSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEJpdHJhdGVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi52YWx1ZSA8PSA0MDk2KSB7CisgICAgICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IDQwOTY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmICghbWUuRihtZS52LnByb2ZpbGUpLnN1cHBvcnRzQXRBbGwobWUudi5wcm9maWxlKSkgeworI2lmZGVmIE1QRUc0CisgICAgICAgICAgICBtZS5zZXQoKS5wcm9maWxlID0gUFJPRklMRV9NUDRWX1NJTVBMRTsKKyNlbHNlCisgICAgICAgICAgICBtZS5zZXQoKS5wcm9maWxlID0gUFJPRklMRV9IMjYzX0JBU0VMSU5FOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYubGV2ZWwpLnN1cHBvcnRzQXRBbGwobWUudi5sZXZlbCkpIHsKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBMRVZFTF9NUDRWXzI7CisjZWxzZQorICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBMRVZFTF9IMjYzXzQ1OworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICAvLyB1bnNhZmUgZ2V0dGVycworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IGdldFNpemVfbCgpIGNvbnN0IHsgcmV0dXJuIG1TaXplOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBnZXRGcmFtZVJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZVJhdGU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBnZXRCaXRyYXRlX2woKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZTsgfQorICAgIHVpbnQzMl90IGdldFN5bmNGcmFtZVBlcmlvZCgpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIDwgMCB8fCBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA9PSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGRvdWJsZSBwZXJpb2QgPSBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSAvIDFlNiAqIG1GcmFtZVJhdGUtPnZhbHVlOworICAgICAgICByZXR1cm4gKHVpbnQzMl90KWMyX21heChjMl9taW4ocGVyaW9kICsgMC41LCBkb3VibGUoVUlOVDMyX01BWCkpLCAxLik7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQ+IG1Vc2FnZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IG1GcmFtZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQ+IG1TeW5jRnJhbWVQZXJpb2Q7Cit9OworCitDMlNvZnRNcGVnNEVuYzo6QzJTb2Z0TXBlZzRFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1IYW5kbGUobnVsbHB0ciksCisgICAgICBtRW5jUGFyYW1zKG51bGxwdHIpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbU91dEJ1ZmZlclNpemUoNTI0Mjg4KSB7Cit9CisKK0MyU29mdE1wZWc0RW5jOjp+QzJTb2Z0TXBlZzRFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjpvbkluaXQoKSB7CisjaWZkZWYgTVBFRzQKKyAgICBtRW5jb2RlTW9kZSA9IENPTUJJTkVfTU9ERV9XSVRIX0VSUl9SRVM7CisjZWxzZQorICAgIG1FbmNvZGVNb2RlID0gSDI2M19NT0RFOworI2VuZGlmCisgICAgaWYgKCFtSGFuZGxlKSB7CisgICAgICAgIG1IYW5kbGUgPSBuZXcgdGFndmlkZW9FbmNDb250cm9sczsKKyAgICB9CisKKyAgICBpZiAoIW1FbmNQYXJhbXMpIHsKKyAgICAgICAgbUVuY1BhcmFtcyA9IG5ldyB0YWd2aWRlb0VuY09wdGlvbnM7CisgICAgfQorCisgICAgaWYgKCEobUVuY1BhcmFtcyAmJiBtSGFuZGxlKSkgcmV0dXJuIEMyX05PX01FTU9SWTsKKworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIHJldHVybiBpbml0RW5jb2RlcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNEVuYzo6b25TdG9wKCkgeworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAobUhhbmRsZSkgeworICAgICAgICAodm9pZClQVkNsZWFuVXBWaWRlb0VuY29kZXIobUhhbmRsZSk7CisgICAgfQorICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNcGVnNEVuYzo6b25SZXNldCgpIHsKKyAgICBvblN0b3AoKTsKKyAgICBpbml0RW5jb2RlcigpOworfQorCit2b2lkIEMyU29mdE1wZWc0RW5jOjpvblJlbGVhc2UoKSB7CisgICAgb25TdG9wKCk7CisgICAgaWYgKG1FbmNQYXJhbXMpIHsKKyAgICAgICAgZGVsZXRlIG1FbmNQYXJhbXM7CisgICAgICAgIG1FbmNQYXJhbXMgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobUhhbmRsZSkgeworICAgICAgICBkZWxldGUgbUhhbmRsZTsKKyAgICAgICAgbUhhbmRsZSA9IG51bGxwdHI7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNEVuYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjppbml0RW5jUGFyYW1zKCkgeworICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgIG1lbXNldChtSGFuZGxlLCAwLCBzaXplb2YodGFndmlkZW9FbmNDb250cm9scykpOworICAgIH0gZWxzZSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIGlmIChtRW5jUGFyYW1zKSB7CisgICAgICAgIG1lbXNldChtRW5jUGFyYW1zLCAwLCBzaXplb2YodGFndmlkZW9FbmNPcHRpb25zKSk7CisgICAgfSBlbHNlIHJldHVybiBDMl9DT1JSVVBURUQ7CisKKyAgICBpZiAoIVBWR2V0RGVmYXVsdEVuY09wdGlvbihtRW5jUGFyYW1zLCAwKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBkZWZhdWx0IGVuY29kaW5nIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBpZiAobUZyYW1lUmF0ZS0+dmFsdWUgPT0gMCkgeworICAgICAgICBBTE9HRSgiRnJhbWVyYXRlIHNob3VsZCBub3QgYmUgMCIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1FbmNQYXJhbXMtPmVuY01vZGUgPSBtRW5jb2RlTW9kZTsKKyAgICBtRW5jUGFyYW1zLT5lbmNXaWR0aFswXSA9IG1TaXplLT53aWR0aDsKKyAgICBtRW5jUGFyYW1zLT5lbmNIZWlnaHRbMF0gPSBtU2l6ZS0+aGVpZ2h0OworICAgIG1FbmNQYXJhbXMtPmVuY0ZyYW1lUmF0ZVswXSA9IG1GcmFtZVJhdGUtPnZhbHVlICsgMC41OworICAgIG1FbmNQYXJhbXMtPnJjVHlwZSA9IFZCUl8xOworICAgIG1FbmNQYXJhbXMtPnZidkRlbGF5ID0gNS4wZjsKKyAgICBtRW5jUGFyYW1zLT5wcm9maWxlX2xldmVsID0gQ09SRV9QUk9GSUxFX0xFVkVMMjsKKyAgICBtRW5jUGFyYW1zLT5wYWNrZXRTaXplID0gMzI7CisgICAgbUVuY1BhcmFtcy0+cnZsY0VuYWJsZSA9IFBWX09GRjsKKyAgICBtRW5jUGFyYW1zLT5udW1MYXllcnMgPSAxOworICAgIG1FbmNQYXJhbXMtPnRpbWVJbmNSZXMgPSAxMDAwOworICAgIG1FbmNQYXJhbXMtPnRpY2tQZXJTcmMgPSBtRW5jUGFyYW1zLT50aW1lSW5jUmVzIC8gKG1GcmFtZVJhdGUtPnZhbHVlICsgMC41KTsKKyAgICBtRW5jUGFyYW1zLT5iaXRSYXRlWzBdID0gbUJpdHJhdGUtPnZhbHVlOworICAgIG1FbmNQYXJhbXMtPmlRdWFudFswXSA9IDE1OworICAgIG1FbmNQYXJhbXMtPnBRdWFudFswXSA9IDEyOworICAgIG1FbmNQYXJhbXMtPnF1YW50VHlwZVswXSA9IDA7CisgICAgbUVuY1BhcmFtcy0+bm9GcmFtZVNraXBwZWQgPSBQVl9PRkY7CisKKyAgICAvLyBQVidzIE1QRUc0IGVuY29kZXIgcmVxdWlyZXMgdGhlIHZpZGVvIGRpbWVuc2lvbiBvZiBtdWx0aXBsZQorICAgIGlmIChtU2l6ZS0+d2lkdGggJSAxNiAhPSAwIHx8IG1TaXplLT5oZWlnaHQgJSAxNiAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJWaWRlbyBmcmFtZSBzaXplICVkeCVkIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiIsCisgICAgICAgICAgICAgIG1TaXplLT53aWR0aCwgbVNpemUtPmhlaWdodCk7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gU2V0IElEUiBmcmFtZSByZWZyZXNoIGludGVydmFsCisgICAgbUVuY1BhcmFtcy0+aW50cmFQZXJpb2QgPSBtSW50Zi0+Z2V0U3luY0ZyYW1lUGVyaW9kKCk7CisgICAgbUVuY1BhcmFtcy0+bnVtSW50cmFNQiA9IDA7CisgICAgbUVuY1BhcmFtcy0+c2NlbmVEZXRlY3QgPSBQVl9PTjsKKyAgICBtRW5jUGFyYW1zLT5zZWFyY2hSYW5nZSA9IDE2OworICAgIG1FbmNQYXJhbXMtPm12OHg4RW5hYmxlID0gUFZfT0ZGOworICAgIG1FbmNQYXJhbXMtPmdvYkhlYWRlckludGVydmFsID0gMDsKKyAgICBtRW5jUGFyYW1zLT51c2VBQ1ByZWQgPSBQVl9PTjsKKyAgICBtRW5jUGFyYW1zLT5pbnRyYURDVmxjVGggPSAwOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNEVuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgbVNpemUgPSBtSW50Zi0+Z2V0U2l6ZV9sKCk7CisgICAgICAgIG1CaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGVfbCgpOworICAgICAgICBtRnJhbWVSYXRlID0gbUludGYtPmdldEZyYW1lUmF0ZV9sKCk7CisgICAgfQorICAgIGMyX3N0YXR1c190IGVyciA9IGluaXRFbmNQYXJhbXMoKTsKKyAgICBpZiAoQzJfT0sgIT0gZXJyKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZWQgZW5jb2RlciBwYXJhbXMiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgaWYgKCFQVkluaXRWaWRlb0VuY29kZXIobUhhbmRsZSwgbUVuY1BhcmFtcykpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIHRoZSBlbmNvZGVyIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgLy8gMXN0IGJ1ZmZlciBmb3IgY29kZWMgc3BlY2lmaWMgZGF0YQorICAgIG1OdW1JbnB1dEZyYW1lcyA9IC0xOworICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzRFbmM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEluaXRpYWxpemUgZW5jb2RlciBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXplZAorICAgIGlmICghbVN0YXJ0ZWQgJiYgQzJfT0sgIT0gaW5pdEVuY29kZXIoKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZW5jb2RlciIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sobU91dEJ1ZmZlclNpemUsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50OF90ICpvdXRQdHIgPSAodWludDhfdCAqKXdWaWV3LmRhdGEoKTsKKyAgICBpZiAobU51bUlucHV0RnJhbWVzIDwgMCkgeworICAgICAgICAvLyBUaGUgdmVyeSBmaXJzdCB0aGluZyB3ZSB3YW50IHRvIG91dHB1dCBpcyB0aGUgY29kZWMgc3BlY2lmaWMgZGF0YS4KKyAgICAgICAgaW50MzJfdCBvdXRwdXRTaXplID0gbU91dEJ1ZmZlclNpemU7CisgICAgICAgIGlmICghUFZHZXRWb2xIZWFkZXIobUhhbmRsZSwgb3V0UHRyLCAmb3V0cHV0U2l6ZSwgMCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IFZPTCBoZWFkZXIiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiQnl0ZXMgR2VuZXJhdGVkIGluIGhlYWRlciAlZFxuIiwgb3V0cHV0U2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICArK21OdW1JbnB1dEZyYW1lczsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+IGNzZCA9CisgICAgICAgICAgICBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpBbGxvY1VuaXF1ZShvdXRwdXRTaXplLCAwdSk7CisgICAgICAgIGlmICghY3NkKSB7CisgICAgICAgICAgICBBTE9HRSgiQ1NEIGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1lbWNweShjc2QtPm0udmFsdWUsIG91dFB0ciwgb3V0cHV0U2l6ZSk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKHN0ZDo6bW92ZShjc2QpKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gclZpZXc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBpbnB1dEJ1ZmZlcjsKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBpbnB1dEJ1ZmZlciA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF07CisgICAgICAgIHJWaWV3ID0gc3RkOjptYWtlX3NoYXJlZDxjb25zdCBDMkdyYXBoaWNWaWV3PigKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpKTsKKyAgICAgICAgaWYgKHJWaWV3LT5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBlcnIgPSAlZCIsIHJWaWV3LT5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LT5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50NjRfdCBpbnB1dFRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrIGluQnVmZmVyID0gaW5wdXRCdWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKTsKKyAgICBpZiAoaW5CdWZmZXIud2lkdGgoKSA8IG1TaXplLT53aWR0aCB8fAorICAgICAgICBpbkJ1ZmZlci5oZWlnaHQoKSA8IG1TaXplLT5oZWlnaHQpIHsKKyAgICAgICAgLyogRXhwZWN0IHdpZHRoIGhlaWdodCB0byBiZSBjb25maWd1cmVkICovCisgICAgICAgIEFMT0dXKCJ1bmV4cGVjdGVkIENhcGFjaXR5IEFzcGVjdCAlZCglZCkgeCAlZCglZCkiLCBpbkJ1ZmZlci53aWR0aCgpLAorICAgICAgICAgICAgICBtU2l6ZS0+d2lkdGgsIGluQnVmZmVyLmhlaWdodCgpLCBtU2l6ZS0+aGVpZ2h0KTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IHJWaWV3LT5sYXlvdXQoKTsKKyAgICB1aW50OF90ICp5UGxhbmUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXctPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHVpbnQ4X3QgKnVQbGFuZSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgICAgdWludDhfdCAqdlBsYW5lID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdKTsKKyAgICBpbnQzMl90IHlTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXS5yb3dJbmM7CisgICAgaW50MzJfdCB1U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm93SW5jOworICAgIGludDMyX3QgdlN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLnJvd0luYzsKKyAgICB1aW50MzJfdCB3aWR0aCA9IG1TaXplLT53aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQgPSBtU2l6ZS0+aGVpZ2h0OworICAgIC8vIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGFsd2F5cyBldmVuIChhcyBibG9jayBzaXplIGlzIDE2eDE2KQorICAgIENIRUNLX0VRKCh3aWR0aCAmIDF1KSwgMHUpOworICAgIENIRUNLX0VRKChoZWlnaHQgJiAxdSksIDB1KTsKKyAgICBzaXplX3QgeVBsYW5lU2l6ZSA9IHdpZHRoICogaGVpZ2h0OworICAgIHN3aXRjaCAobGF5b3V0LnR5cGUpIHsKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0I6CisgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCQTogeworICAgICAgICAgICAgTWVtb3J5QmxvY2sgY29udmVyc2lvbkJ1ZmZlciA9IG1Db252ZXJzaW9uQnVmZmVycy5mZXRjaCh5UGxhbmVTaXplICogMyAvIDIpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZW1wbGFjZShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgY29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgICAgICB5UGxhbmUgPSBjb252ZXJzaW9uQnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIHVQbGFuZSA9IHlQbGFuZSArIHlQbGFuZVNpemU7CisgICAgICAgICAgICB2UGxhbmUgPSB1UGxhbmUgKyB5UGxhbmVTaXplIC8gNDsKKyAgICAgICAgICAgIHlTdHJpZGUgPSB3aWR0aDsKKyAgICAgICAgICAgIHVTdHJpZGUgPSB2U3RyaWRlID0gd2lkdGggLyAyOworICAgICAgICAgICAgQ29udmVydFJHQlRvUGxhbmFyWVVWKHlQbGFuZSwgeVN0cmlkZSwgaGVpZ2h0LCBjb252ZXJzaW9uQnVmZmVyLnNpemUoKSwgKnJWaWV3LmdldCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOiB7CisgICAgICAgICAgICBpZiAoIUlzWVVWNDIwKCpyVmlldykpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiaW5wdXQgaXMgbm90IFlVVjQyMCIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIHVTdHJpZGUgPT0gdlN0cmlkZQorICAgICAgICAgICAgICAgICAgICAmJiB5U3RyaWRlID09IDIgKiB2U3RyaWRlKSB7CisgICAgICAgICAgICAgICAgLy8gSTQyMCBjb21wYXRpYmxlIC0gcGxhbmVzIGFyZSBhbHJlYWR5IHNldCB1cCBhYm92ZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb3B5IHRvIEk0MjAKKyAgICAgICAgICAgIE1lbW9yeUJsb2NrIGNvbnZlcnNpb25CdWZmZXIgPSBtQ29udmVyc2lvbkJ1ZmZlcnMuZmV0Y2goeVBsYW5lU2l6ZSAqIDMgLyAyKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVtcGxhY2UoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksIGNvbnZlcnNpb25CdWZmZXIpOworICAgICAgICAgICAgTWVkaWFJbWFnZTIgaW1nID0gQ3JlYXRlWVVWNDIwUGxhbmFyTWVkaWFJbWFnZTIod2lkdGgsIGhlaWdodCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJbWFnZUNvcHkoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksICZpbWcsICpyVmlldyk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkJ1ZmZlciBjb252ZXJzaW9uIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB5UGxhbmUgPSBjb252ZXJzaW9uQnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIHVQbGFuZSA9IHlQbGFuZSArIHlQbGFuZVNpemU7CisgICAgICAgICAgICB2UGxhbmUgPSB1UGxhbmUgKyB5UGxhbmVTaXplIC8gNDsKKyAgICAgICAgICAgIHlTdHJpZGUgPSB3aWR0aDsKKyAgICAgICAgICAgIHVTdHJpZGUgPSB2U3RyaWRlID0gd2lkdGggLyAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVkE6CisgICAgICAgICAgICBBTE9HRSgiWVVWQSBwbGFuZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVucmVjb2duaXplZCBwbGFuZSB0eXBlOiAlZCIsIGxheW91dC50eXBlKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDSEVDSyhOVUxMICE9IHlQbGFuZSk7CisgICAgLyogRW5jb2RlIGZyYW1lcyAqLworICAgIFZpZGVvRW5jRnJhbWVJTyB2aW4sIHZvdXQ7CisgICAgbWVtc2V0KCZ2aW4sIDAsIHNpemVvZih2aW4pKTsKKyAgICBtZW1zZXQoJnZvdXQsIDAsIHNpemVvZih2b3V0KSk7CisgICAgdmluLnlDaGFuID0geVBsYW5lOworICAgIHZpbi51Q2hhbiA9IHVQbGFuZTsKKyAgICB2aW4udkNoYW4gPSB2UGxhbmU7CisgICAgdmluLnRpbWVzdGFtcCA9IChpbnB1dFRpbWVTdGFtcCArIDUwMCkgLyAxMDAwOyAgLy8gaW4gbXMKKyAgICB2aW4uaGVpZ2h0ID0gYWxpZ24oaGVpZ2h0LCAxNik7CisgICAgdmluLnBpdGNoID0gYWxpZ24od2lkdGgsIDE2KTsKKworICAgIHVpbnQzMl90IG1vZFRpbWVNcyA9IDA7CisgICAgaW50MzJfdCBuTGF5ZXIgPSAwOworICAgIE1QNEhpbnRUcmFjayBoaW50VHJhY2s7CisgICAgaW50MzJfdCBvdXRwdXRTaXplID0gbU91dEJ1ZmZlclNpemU7CisgICAgaWYgKCFQVkVuY29kZVZpZGVvRnJhbWUobUhhbmRsZSwgJnZpbiwgJnZvdXQsICZtb2RUaW1lTXMsIG91dFB0ciwgJm91dHB1dFNpemUsICZuTGF5ZXIpIHx8CisgICAgICAgICFQVkdldEhpbnRUcmFjayhtSGFuZGxlLCAmaGludFRyYWNrKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGVuY29kZSBmcmFtZSBvciBnZXQgaGludCB0cmFjayBhdCBmcmFtZSAlIiBQUklkNjQsIG1OdW1JbnB1dEZyYW1lcyk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigib3V0cHV0U2l6ZSBmaWxsZWQgOiAlZCIsIG91dHB1dFNpemUpOworICAgICsrbU51bUlucHV0RnJhbWVzOworICAgIENIRUNLKE5VTEwgPT0gUFZHZXRPdmVycnVuQnVmZmVyKG1IYW5kbGUpKTsKKworICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgaWYgKG91dHB1dFNpemUpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIDAsIG91dHB1dFNpemUpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBpbnB1dFRpbWVTdGFtcDsKKyAgICAgICAgaWYgKGhpbnRUcmFjay5Db2RlVHlwZSA9PSAwKSB7CisgICAgICAgICAgICBidWZmZXItPnNldEluZm8oc3RkOjptYWtlX3NoYXJlZDxDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgIDB1IC8qIHN0cmVhbSBpZCAqLywgQzJDb25maWc6OlNZTkNfRlJBTUUpKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICB9CisKKyAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lcmFzZSh5UGxhbmUpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNEVuYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKXBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0TXBlZzRFbmNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0TXBlZzRFbmNGYWN0b3J5KCkKKyAgICAgICAgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdE1wZWc0RW5jKAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWc0RW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRNcGVnNEVuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWc0RW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcGVnNEVuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE1wZWc0RW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0NjFmYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuaApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyX1NPRlRfTVBFRzRfRU5DX0hfXworI2RlZmluZSBDMl9TT0ZUX01QRUc0X0VOQ19IX18KKworI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPENvZGVjMkJ1ZmZlclV0aWxzLmg+CisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgIm1wNGVuY19hcGkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0TXBlZzRFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0TXBlZzRFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKworICAgIHZpcnR1YWwgfkMyU29mdE1wZWc0RW5jKCk7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKworICAgIHRhZ3ZpZGVvRW5jQ29udHJvbHMgKm1IYW5kbGU7CisgICAgdGFndmlkZW9FbmNPcHRpb25zICAqbUVuY1BhcmFtczsKKworICAgIGJvb2wgICAgIG1TdGFydGVkOworICAgIGJvb2wgICAgIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCAgICAgbVNpZ25hbGxlZEVycm9yOworCisgICAgdWludDMyX3QgbU91dEJ1ZmZlclNpemU7CisgICAgLy8gY29uZmlndXJhdGlvbnMgdXNlZCBieSBjb21wb25lbnQgaW4gcHJvY2VzcworICAgIC8vIChUT0RPOiBrZWVwIHRoaXMgaW4gaW50ZiBidXQgbWFrZSB0aGVtIGludGVybmFsIG9ubHkpCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworCisgICAgaW50NjRfdCAgbU51bUlucHV0RnJhbWVzOworICAgIE1QNEVuY29kaW5nTW9kZSBtRW5jb2RlTW9kZTsKKworICAgIE1lbW9yeUJsb2NrUG9vbCBtQ29udmVyc2lvbkJ1ZmZlcnM7CisgICAgc3RkOjptYXA8dm9pZCAqLCBNZW1vcnlCbG9jaz4gbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2U7CisKKyAgICBjMl9zdGF0dXNfdCBpbml0RW5jUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdE1wZWc0RW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQzJfU09GVF9NUEVHNF9FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWIxZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dApAQCAtMCwwICsxLDkgQEAKKworVEhJUyBJUyBOT1QgQSBHUkFOVCBPRiBQQVRFTlQgUklHSFRTLgorCitHb29nbGUgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gb3Igd2FycmFudHkgdGhhdCB0aGUgY29kZWNzIGZvciB3aGljaAorc291cmNlIGNvZGUgaXMgbWFkZSBhdmFpbGFibGUgaGVyZXVuZGVyIGFyZSB1bmVuY3VtYmVyZWQgYnkKK3RoaXJkLXBhcnR5IHBhdGVudHMuICBUaG9zZSBpbnRlbmRpbmcgdG8gdXNlIHRoaXMgc291cmNlIGNvZGUgaW4KK2hhcmR3YXJlIG9yIHNvZnR3YXJlIHByb2R1Y3RzIGFyZSBhZHZpc2VkIHRoYXQgaW1wbGVtZW50YXRpb25zIG9mCit0aGVzZSBjb2RlY3MsIGluY2x1ZGluZyBpbiBvcGVuIHNvdXJjZSBzb2Z0d2FyZSBvciBzaGFyZXdhcmUsIG1heQorcmVxdWlyZSBwYXRlbnQgbGljZW5zZXMgZnJvbSB0aGUgcmVsZXZhbnQgcGF0ZW50IGhvbGRlcnMuCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVkMTQxYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQW5kcm9pZC5icApAQCAtMCwwICsxLDIyIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X29wdXNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE9wdXNEZWMuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJvcHVzIl0sCit9CitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X29wdXNlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE9wdXNFbmMuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJvcHVzIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGNkNTNkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRGVjLmNwcApAQCAtMCwwICsxLDQ5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0T3B1c0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJDMlNvZnRPcHVzRGVjLmgiCisKK2V4dGVybiAiQyIgeworICAgICNpbmNsdWRlIDxvcHVzLmg+CisgICAgI2luY2x1ZGUgPG9wdXNfbXVsdGlzdHJlYW0uaD4KK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQub3B1cy5kZWNvZGVyIjsKKworY2xhc3MgQzJTb2Z0T3B1c0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4mIGhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0ODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmVxdWFsVG8oNDgwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dCgwdSwgNjAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNjAwMCwgNTEwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgOTYwICogNikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworfTsKKworQzJTb2Z0T3B1c0RlYzo6QzJTb2Z0T3B1c0RlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtRGVjb2RlcihudWxscHRyKSB7Cit9CisKK0MyU29mdE9wdXNEZWM6On5DMlNvZnRPcHVzRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNEZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAobURlY29kZXIpIHsKKyAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2Rlc3Ryb3kobURlY29kZXIpOworICAgICAgICBtRGVjb2RlciA9IG51bGxwdHI7CisgICAgfQorICAgIG1lbXNldCgmbUhlYWRlciwgMCwgc2l6ZW9mKG1IZWFkZXIpKTsKKyAgICBtQ29kZWNEZWxheSA9IDA7CisgICAgbVNlZWtQcmVSb2xsID0gMDsKKyAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IDA7CisgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRPcHVzRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdE9wdXNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobURlY29kZXIpIHsKKyAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2Rlc3Ryb3kobURlY29kZXIpOworICAgICAgICBtRGVjb2RlciA9IG51bGxwdHI7CisgICAgfQorfQorCitzdGF0dXNfdCBDMlNvZnRPcHVzRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBtZW1zZXQoJm1IZWFkZXIsIDAsIHNpemVvZihtSGVhZGVyKSk7CisgICAgbUNvZGVjRGVsYXkgPSAwOworICAgIG1TZWVrUHJlUm9sbCA9IDA7CisgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSAwOworICAgIG1JbnB1dEJ1ZmZlckNvdW50ID0gMDsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKG1EZWNvZGVyKSB7CisgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jdGwobURlY29kZXIsIE9QVVNfUkVTRVRfU1RBVEUpOworICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IG1TZWVrUHJlUm9sbDsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKworc3RhdGljIGNvbnN0IGludCBrUmF0ZSA9IDQ4MDAwOworCisvLyBPcHVzIHVzZXMgVm9yYmlzIGNoYW5uZWwgbWFwcGluZywgYW5kIFZvcmJpcyBjaGFubmVsIG1hcHBpbmcgc3BlY2lmaWVzCisvLyBtYXBwaW5ncyBmb3IgdXAgdG8gOCBjaGFubmVscy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBwYXJ0IG9mIHRoZSBWb3JiaXMgSQorLy8gU3BlY2lmaWNhdGlvbjoKKy8vIGh0dHA6Ly93d3cueGlwaC5vcmcvdm9yYmlzL2RvYy9Wb3JiaXNfSV9zcGVjLmh0bWwKK3N0YXRpYyBjb25zdCBpbnQga01heENoYW5uZWxzID0gODsKKworLy8gTWF4aW11bSBwYWNrZXQgc2l6ZSB1c2VkIGluIFhpcGgncyBvcHVzZGVjLgorc3RhdGljIGNvbnN0IGludCBrTWF4T3B1c091dHB1dFBhY2tldFNpemVTYW1wbGVzID0gOTYwICogNjsKKworLy8gRGVmYXVsdCBhdWRpbyBvdXRwdXQgY2hhbm5lbCBsYXlvdXQuIFVzZWQgdG8gaW5pdGlhbGl6ZSB8c3RyZWFtX21hcHwgaW4KKy8vIE9wdXNIZWFkZXIsIGFuZCBwYXNzZWQgdG8gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZSgpIHdoZW4gdGhlIGhlYWRlcgorLy8gZG9lcyBub3QgY29udGFpbiBtYXBwaW5nIGluZm9ybWF0aW9uLiBUaGUgdmFsdWVzIGFyZSB2YWxpZCBvbmx5IGZvciBtb25vIGFuZAorLy8gc3RlcmVvIG91dHB1dDogT3B1cyBzdHJlYW1zIHdpdGggbW9yZSB0aGFuIDIgY2hhbm5lbHMgcmVxdWlyZSBhIHN0cmVhbSBtYXAuCitzdGF0aWMgY29uc3QgaW50IGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0ID0gMjsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtEZWZhdWx0T3B1c0NoYW5uZWxMYXlvdXRba01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXRdID0geyAwLCAxIH07CisKKworLy8gQ29udmVydCBuYW5vc2Vjb25kcyB0byBudW1iZXIgb2Ygc2FtcGxlcy4KK3N0YXRpYyB1aW50NjRfdCBuc190b19zYW1wbGVzKHVpbnQ2NF90IG5zLCBpbnQgcmF0ZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KG5zKSAqIHJhdGUgLyAxMDAwMDAwMDAwOworfQorCit2b2lkIEMyU29mdE9wdXNEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5TaXplID09IDApIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkIiwgaW5TaXplLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0OworICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA8IDMpIHsKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDApIHsKKyAgICAgICAgICAgIHNpemVfdCBvcHVzSGVhZFNpemUgPSAwOworICAgICAgICAgICAgc2l6ZV90IGNvZGVjRGVsYXlCdWZTaXplID0gMDsKKyAgICAgICAgICAgIHNpemVfdCBzZWVrUHJlUm9sbEJ1ZlNpemUgPSAwOworICAgICAgICAgICAgdm9pZCAqb3B1c0hlYWRCdWYgPSBOVUxMOworICAgICAgICAgICAgdm9pZCAqY29kZWNEZWxheUJ1ZiA9IE5VTEw7CisgICAgICAgICAgICB2b2lkICpzZWVrUHJlUm9sbEJ1ZiA9IE5VTEw7CisKKyAgICAgICAgICAgIGlmICghR2V0T3B1c0hlYWRlckJ1ZmZlcnMoZGF0YSwgaW5TaXplLCAmb3B1c0hlYWRCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wdXNIZWFkU2l6ZSwgJmNvZGVjRGVsYXlCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjRGVsYXlCdWZTaXplLCAmc2Vla1ByZVJvbGxCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlZWtQcmVSb2xsQnVmU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgZW5jb3VudGVyZWQgZXJyb3IgaW4gR2V0T3B1c0hlYWRlckJ1ZmZlcnMiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIVBhcnNlT3B1c0hlYWRlcigodWludDhfdCAqKW9wdXNIZWFkQnVmLCBvcHVzSGVhZFNpemUsICZtSGVhZGVyKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBFbmNvdW50ZXJlZCBlcnJvciB3aGlsZSBQYXJzaW5nIE9wdXMgSGVhZGVyLiIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50OF90IGNoYW5uZWxfbWFwcGluZ1trTWF4Q2hhbm5lbHNdID0gezB9OworICAgICAgICAgICAgaWYgKG1IZWFkZXIuY2hhbm5lbHMgPD0ga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmNoYW5uZWxfbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRPcHVzQ2hhbm5lbExheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmNoYW5uZWxfbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci5zdHJlYW1fbWFwLAorICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLmNoYW5uZWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzdGF0dXMgPSBPUFVTX0lOVkFMSURfU1RBVEU7CisgICAgICAgICAgICBtRGVjb2RlciA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUoa1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLm51bV9zdHJlYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXIubnVtX2NvdXBsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOworICAgICAgICAgICAgaWYgKCFtRGVjb2RlciB8fCBzdGF0dXMgIT0gT1BVU19PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlIGZhaWxlZCBzdGF0dXMgPSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgb3B1c19zdHJlcnJvcihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3RsKG1EZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFVTX1NFVF9HQUlOKG1IZWFkZXIuZ2Fpbl9kYikpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBPUFVTX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgT1BVUyBoZWFkZXIgZ2Fpbjsgc3RhdHVzID0gJXMiLAorICAgICAgICAgICAgICAgICAgICAgIG9wdXNfc3RyZXJyb3Ioc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29kZWNEZWxheUJ1ZiAmJiBjb2RlY0RlbGF5QnVmU2l6ZSA9PSBzaXplb2YodWludDY0X3QpKSB7CisgICAgICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZ2YWx1ZSwgY29kZWNEZWxheUJ1Ziwgc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgICAgICAgICAgICAgbUNvZGVjRGVsYXkgPSBuc190b19zYW1wbGVzKHZhbHVlLCBrUmF0ZSk7CisgICAgICAgICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtQ29kZWNEZWxheTsKKyAgICAgICAgICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlZWtQcmVSb2xsQnVmICYmIHNlZWtQcmVSb2xsQnVmU2l6ZSA9PSBzaXplb2YodWludDY0X3QpKSB7CisgICAgICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZ2YWx1ZSwgc2Vla1ByZVJvbGxCdWYsIHNpemVvZih1aW50NjRfdCkpOworICAgICAgICAgICAgICAgIG1TZWVrUHJlUm9sbCA9IG5zX3RvX3NhbXBsZXModmFsdWUsIGtSYXRlKTsKKyAgICAgICAgICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGluU2l6ZSA8IDgpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW5wdXQgc2FtcGxlIHNpemUgaXMgdG9vIHNtYWxsLiIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDY0X3Qgc2FtcGxlcyA9IG5zX3RvX3NhbXBsZXMoICoocmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Kj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdF9jYXN0PHVpbnQ4X3QgKj4gKGRhdGEpKSksIGtSYXRlKTsKKyAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjRGVsYXkgPSBzYW1wbGVzOworICAgICAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gbUNvZGVjRGVsYXk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU2Vla1ByZVJvbGwgPSBzYW1wbGVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDMpIHsKKyAgICAgICAgICAgIEFMT0dJKCJDb25maWd1cmluZyBkZWNvZGVyOiAlZCBIeiwgJWQgY2hhbm5lbHMiLAorICAgICAgICAgICAgICAgICAgIGtSYXRlLCBtSGVhZGVyLmNoYW5uZWxzKTsKKyAgICAgICAgICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygwdSwga1JhdGUpOworICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygwdSwgbUhlYWRlci5jaGFubmVscyk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgICAgICAgICB7ICZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm8gfSwKKyAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAmZmFpbHVyZXMpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KGNoYW5uZWxDb3VudEluZm8pKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyBVcGRhdGUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSWdub3JlIENTRCByZS1zdWJtaXNzaW9ucy4KKyAgICBpZiAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gV2hlbiBzZWVraW5nIHRvIHplcm8sIHxtQ29kZWNEZWxheXwgc2FtcGxlcyBoYXMgdG8gYmUgZGlzY2FyZGVkCisgICAgLy8gaW5zdGVhZCBvZiB8bVNlZWtQcmVSb2xsfCBzYW1wbGVzIChhcyB3ZSB3b3VsZCB3aGVuIHNlZWtpbmcgdG8gYW55CisgICAgLy8gb3RoZXIgdGltZXN0YW1wKS4KKyAgICBpZiAod29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSA9PSAwKSBtU2FtcGxlc1RvRGlzY2FyZCA9IG1Db2RlY0RlbGF5OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgICBrTWF4TnVtU2FtcGxlc1BlckJ1ZmZlciAqIGtNYXhDaGFubmVscyAqIHNpemVvZihpbnQxNl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCBudW1TYW1wbGVzID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGUobURlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+ICh3Vmlldy5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga01heE9wdXNPdXRwdXRQYWNrZXRTaXplU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIGlmIChudW1TYW1wbGVzIDwgMCkgeworICAgICAgICBBTE9HRSgib3B1c19tdWx0aXN0cmVhbV9kZWNvZGUgcmV0dXJuZWQgbnVtU2FtcGxlcyAlZCIsIG51bVNhbXBsZXMpOworICAgICAgICBudW1TYW1wbGVzID0gMDsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IG91dE9mZnNldCA9IDA7CisgICAgaWYgKG1TYW1wbGVzVG9EaXNjYXJkID4gMCkgeworICAgICAgICBpZiAobVNhbXBsZXNUb0Rpc2NhcmQgPiBudW1TYW1wbGVzKSB7CisgICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCAtPSBudW1TYW1wbGVzOworICAgICAgICAgICAgbnVtU2FtcGxlcyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1TYW1wbGVzIC09IG1TYW1wbGVzVG9EaXNjYXJkOworICAgICAgICAgICAgb3V0T2Zmc2V0ID0gbVNhbXBsZXNUb0Rpc2NhcmQgKiBzaXplb2YoaW50MTZfdCkgKiBtSGVhZGVyLmNoYW5uZWxzOworICAgICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG51bVNhbXBsZXMpIHsKKyAgICAgICAgaW50IG91dFNpemUgPSBudW1TYW1wbGVzICogc2l6ZW9mKGludDE2X3QpICogbUhlYWRlci5jaGFubmVsczsKKyAgICAgICAgQUxPR1YoIm91dCBidWZmZXIgYXR0ci4gb2Zmc2V0ICVkIHNpemUgJWQgIiwgb3V0T2Zmc2V0LCBvdXRTaXplKTsKKworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgb3V0T2Zmc2V0LCBvdXRTaXplKSk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBibG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworY2xhc3MgQzJTb2Z0T3B1c0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRPcHVzRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdE9wdXNEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRPcHVzRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdE9wdXNEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRPcHVzRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0T3B1c0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE9wdXNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3MTVhYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0RlYy5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9PUFVTX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfT1BVU19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworc3RydWN0IE9wdXNNU0RlY29kZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdE9wdXNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0T3B1c0RlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0T3B1c0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtNYXhOdW1TYW1wbGVzUGVyQnVmZmVyID0gOTYwICogNgorICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIE9wdXNNU0RlY29kZXIgKm1EZWNvZGVyOworICAgIE9wdXNIZWFkZXIgbUhlYWRlcjsKKworICAgIGludDY0X3QgbUNvZGVjRGVsYXk7CisgICAgaW50NjRfdCBtU2Vla1ByZVJvbGw7CisgICAgaW50NjRfdCBtU2FtcGxlc1RvRGlzY2FyZDsKKyAgICBzaXplX3QgbUlucHV0QnVmZmVyQ291bnQ7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdE9wdXNEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfT1BVU19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYjI0NDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNFbmMuY3BwCkBAIC0wLDAgKzEsNjM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRPcHVzRW5jIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmg+CisjaW5jbHVkZSAiQzJTb2Z0T3B1c0VuYy5oIgorCitleHRlcm4gIkMiIHsKKyAgICAjaW5jbHVkZSA8b3B1cy5oPgorICAgICNpbmNsdWRlIDxvcHVzX211bHRpc3RyZWFtLmg+Cit9CisKKyNkZWZpbmUgREVGQVVMVF9GUkFNRV9EVVJBVElPTl9NUyAyMAorbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQub3B1cy5lbmNvZGVyIjsKKworY2xhc3MgQzJTb2Z0T3B1c0VuYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dCgwdSwgNDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgIDgwMDAsIDEyMDAwLCAxNjAwMCwgMjQwMDAsIDQ4MDAwfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA4KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDEyODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNTAwLCA1MTIwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db21wbGV4aXR5LCBDMl9QQVJBTUtFWV9DT01QTEVYSVRZKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db21wbGV4aXR5VHVuaW5nOjpvdXRwdXQoMHUsIDEwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1Db21wbGV4aXR5LCB2YWx1ZSkuaW5SYW5nZSgxLCAxMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNvbXBsZXhpdHkpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDM4NDApKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsZVJhdGUtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Q2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudC0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRCaXRyYXRlKCkgY29uc3QgeyByZXR1cm4gbUJpdHJhdGUtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Q29tcGxleGl0eSgpIGNvbnN0IHsgcmV0dXJuIG1Db21wbGV4aXR5LT52YWx1ZTsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbXBsZXhpdHlUdW5pbmc6Om91dHB1dD4gbUNvbXBsZXhpdHk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworfTsKKworQzJTb2Z0T3B1c0VuYzo6QzJTb2Z0T3B1c0VuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbU91dHB1dEJsb2NrKG51bGxwdHIpLAorICAgICAgbUVuY29kZXIobnVsbHB0ciksCisgICAgICBtSW5wdXRCdWZmZXJQY20xNihudWxscHRyKSwKKyAgICAgIG1PdXRJbmRleCgwdSkgeworfQorCitDMlNvZnRPcHVzRW5jOjp+QzJTb2Z0T3B1c0VuYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0VuYzo6b25Jbml0KCkgeworICAgIHJldHVybiBpbml0RW5jb2RlcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRW5jOjpjb25maWd1cmVFbmNvZGVyKCkgeworICAgIHVuc2lnbmVkIGNoYXIgbW9ub19tYXBwaW5nWzI1Nl0gPSB7MH07CisgICAgdW5zaWduZWQgY2hhciBzdGVyZW9fbWFwcGluZ1syNTZdID0gezAsIDF9OworICAgIHVuc2lnbmVkIGNoYXIgc3Vycm91bmRfbWFwcGluZ1syNTZdID0gezAsIDEsIDI1NX07CisgICAgbVNhbXBsZVJhdGUgPSBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpOworICAgIG1DaGFubmVsQ291bnQgPSBtSW50Zi0+Z2V0Q2hhbm5lbENvdW50KCk7CisgICAgdWludDMyX3QgYml0cmF0ZSA9IG1JbnRmLT5nZXRCaXRyYXRlKCk7CisgICAgaW50IGNvbXBsZXhpdHkgPSBtSW50Zi0+Z2V0Q29tcGxleGl0eSgpOworICAgIG1OdW1TYW1wbGVzUGVyRnJhbWUgPSBtU2FtcGxlUmF0ZSAvICgxMDAwIC8gbUZyYW1lRHVyYXRpb25Ncyk7CisgICAgbU51bVBjbUJ5dGVzUGVySW5wdXRGcmFtZSA9CisgICAgICAgIG1DaGFubmVsQ291bnQgKiBtTnVtU2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKGludDE2X3QpOworICAgIGludCBlcnIgPSBDMl9PSzsKKworICAgIHVuc2lnbmVkIGNoYXIqIG1hcHBpbmc7CisgICAgaWYgKG1DaGFubmVsQ291bnQgPCAyKSB7CisgICAgICAgIG1hcHBpbmcgPSBtb25vX21hcHBpbmc7CisgICAgfSBlbHNlIGlmIChtQ2hhbm5lbENvdW50ID09IDIpIHsKKyAgICAgICAgbWFwcGluZyA9IHN0ZXJlb19tYXBwaW5nOworICAgIH0gZWxzZSB7CisgICAgICAgIG1hcHBpbmcgPSBzdXJyb3VuZF9tYXBwaW5nOworICAgIH0KKworICAgIGlmIChtRW5jb2RlciAhPSBudWxscHRyKSB7CisgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9kZXN0cm95KG1FbmNvZGVyKTsKKyAgICB9CisKKyAgICBtRW5jb2RlciA9IG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jcmVhdGUobVNhbXBsZVJhdGUsIG1DaGFubmVsQ291bnQsCisgICAgICAgIDEsIDEsIG1hcHBpbmcsIE9QVVNfQVBQTElDQVRJT05fQVVESU8sICZlcnIpOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBjcmVhdGUgbGlib3B1cyBlbmNvZGVyLiBFcnJvciBjb2RlOiAlaSIsIGVycik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgLy8gQ29tcGxleGl0eQorICAgIGlmIChvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKAorICAgICAgICAgICAgbUVuY29kZXIsIE9QVVNfU0VUX0NPTVBMRVhJVFkoY29tcGxleGl0eSkpICE9IE9QVVNfT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBzZXQgY29tcGxleGl0eSIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIERUWAorICAgIGlmIChvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKG1FbmNvZGVyLCBPUFVTX1NFVF9EVFgoMCkgIT0gT1BVU19PSykpIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBzZXQgZHR4Iik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQXBwbGljYXRpb24KKyAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChtRW5jb2RlciwKKyAgICAgICAgICAgIE9QVVNfU0VUX0FQUExJQ0FUSU9OKE9QVVNfQVBQTElDQVRJT05fQVVESU8pKSAhPSBPUFVTX09LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IGFwcGxpY2F0aW9uIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gU2lnbmFsIHR5cGUKKyAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChtRW5jb2RlciwgT1BVU19TRVRfU0lHTkFMKE9QVVNfQVVUTykpICE9CisgICAgICAgIE9QVVNfT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBzZXQgc2lnbmFsIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gVW5jb25zdHJhaW5lZCBWQlIKKyAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChtRW5jb2RlciwgT1BVU19TRVRfVkJSKDApICE9IE9QVVNfT0spKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IHZiciB0eXBlIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorICAgIGlmIChvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKG1FbmNvZGVyLCBPUFVTX1NFVF9WQlJfQ09OU1RSQUlOVCgwKSAhPQorICAgICAgICAgICAgT1BVU19PSykpIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBzZXQgdmJyIGNvbnN0cmFpbnQiKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBCaXRyYXRlCisgICAgaWYgKG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwobUVuY29kZXIsIE9QVVNfU0VUX0JJVFJBVEUoYml0cmF0ZSkpICE9CisgICAgICAgICAgICBPUFVTX09LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IGJpdHJhdGUiKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBHZXQgY29kZWNEZWxheQorICAgIGludDMyX3QgbG9va2FoZWFkOworICAgIGlmIChvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKG1FbmNvZGVyLCBPUFVTX0dFVF9MT09LQUhFQUQoJmxvb2thaGVhZCkpICE9CisgICAgICAgICAgICBPUFVTX09LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZ2V0IGxvb2thaGVhZCIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICBtQ29kZWNEZWxheSA9IGxvb2thaGVhZCAqIDEwMDAwMDAwMDBsbCAvIG1TYW1wbGVSYXRlOworCisgICAgLy8gU2V0IHNlZWsgcHJlcm9sbCB0byA4MCBtcworICAgIG1TZWVrUHJlUm9sbCA9IDgwMDAwMDAwOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0VuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgbVNpZ25hbGxlZEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1IZWFkZXJHZW5lcmF0ZWQgPSBmYWxzZTsKKyAgICBtSXNGaXJzdEZyYW1lID0gdHJ1ZTsKKyAgICBtRW5jb2RlckZsdXNoZWQgPSBmYWxzZTsKKyAgICBtQnVmZmVyQXZhaWxhYmxlID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDB1bGw7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwOworICAgIG1GaWxsZWRMZW4gPSAwOworICAgIG1GcmFtZUR1cmF0aW9uTXMgPSBERUZBVUxUX0ZSQU1FX0RVUkFUSU9OX01TOworICAgIGlmICghbUlucHV0QnVmZmVyUGNtMTYpIHsKKyAgICAgICAgbUlucHV0QnVmZmVyUGNtMTYgPQorICAgICAgICAgICAgKGludDE2X3QqKW1hbGxvYyhrRnJhbWVTaXplICoga01heE51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICB9CisgICAgaWYgKCFtSW5wdXRCdWZmZXJQY20xNikgcmV0dXJuIEMyX05PX01FTU9SWTsKKworICAgIC8qIERlZmF1bHQgQ29uZmlndXJhdGlvbnMgKi8KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBjb25maWd1cmVFbmNvZGVyKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0VuYzo6b25TdG9wKCkgeworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtSXNGaXJzdEZyYW1lID0gdHJ1ZTsKKyAgICBtRW5jb2RlckZsdXNoZWQgPSBmYWxzZTsKKyAgICBtQnVmZmVyQXZhaWxhYmxlID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDB1bGw7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwdTsKKyAgICBtRmlsbGVkTGVuID0gMDsKKyAgICBpZiAobUVuY29kZXIpIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwobUVuY29kZXIsIE9QVVNfUkVTRVRfU1RBVEUpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9QVVNfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJPUFVTX1JFU0VUX1NUQVRFIGZhaWxlZCBzdGF0dXMgPSAlcyIsIG9wdXNfc3RyZXJyb3Ioc3RhdHVzKSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobU91dHB1dEJsb2NrKSBtT3V0cHV0QmxvY2sucmVzZXQoKTsKKyAgICBtT3V0cHV0QmxvY2sgPSBudWxscHRyOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE9wdXNFbmM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0T3B1c0VuYzo6b25SZWxlYXNlKCkgeworICAgICh2b2lkKW9uU3RvcCgpOworICAgIGlmIChtSW5wdXRCdWZmZXJQY20xNikgeworICAgICAgICBmcmVlKG1JbnB1dEJ1ZmZlclBjbTE2KTsKKyAgICAgICAgbUlucHV0QnVmZmVyUGNtMTYgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobUVuY29kZXIpIHsKKyAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2Rlc3Ryb3kobUVuY29kZXIpOworICAgICAgICBtRW5jb2RlciA9IG51bGxwdHI7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRW5jOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworLy8gRHJhaW4gdGhlIGVuY29kZXIgdG8gZ2V0IGxhc3QgZnJhbWVzIChpZiBhbnkpCitpbnQgQzJTb2Z0T3B1c0VuYzo6ZHJhaW5FbmNvZGVyKHVpbnQ4X3QqIG91dFB0cikgeworICAgIG1lbXNldCgodWludDhfdCAqKW1JbnB1dEJ1ZmZlclBjbTE2ICsgbUZpbGxlZExlbiwgMCwKKyAgICAgICAgKG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKSk7CisgICAgaW50IGVuY29kZWRCeXRlcyA9IG9wdXNfbXVsdGlzdHJlYW1fZW5jb2RlKAorICAgICAgICBtRW5jb2RlciwgbUlucHV0QnVmZmVyUGNtMTYsIG1OdW1TYW1wbGVzUGVyRnJhbWUsIG91dFB0ciwga01heFBheWxvYWQpOworICAgIGlmIChlbmNvZGVkQnl0ZXMgPiBtT3V0cHV0QmxvY2stPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggc3BhY2UgbGVmdCB0byB3cml0ZSBlbmNvZGVkIGRhdGEsIGRyb3BwaW5nICVkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgbUJ5dGVzRW5jb2RlZCk7CisgICAgICAgIC8vIGEgZmF0YWwgZXJyb3Igd291bGQgc3RvcCB0aGUgZW5jb2RpbmcKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBBTE9HVigiZW5jb2RlZCAlaSBPcHVzIGJ5dGVzIGZyb20gJXp1IFBDTSBieXRlcyIsIGVuY29kZWRCeXRlcywKKyAgICAgICAgICBtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lKTsKKyAgICBtRW5jb2RlckZsdXNoZWQgPSB0cnVlOworICAgIG1GaWxsZWRMZW4gPSAwOworICAgIHJldHVybiBlbmNvZGVkQnl0ZXM7Cit9CisKK3ZvaWQgQzJTb2Z0T3B1c0VuYzo6cHJvY2Vzcyhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPQorICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworCisgICAgaWYgKCFtRW5jb2RlcikgeworICAgICAgICBpZiAoaW5pdEVuY29kZXIoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImluaXRFbmNvZGVyIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBlcnI7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtSXNGaXJzdEZyYW1lICYmIGluU2l6ZSA+IDApIHsKKyAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICAgICAgbUlzRmlyc3RGcmFtZSA9IGZhbHNlOworICAgIH0KKworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX07CisgICAgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhrTWF4UGF5bG9hZCwgdXNhZ2UsICZtT3V0cHV0QmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDMldyaXRlVmlldyB3VmlldyA9IG1PdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIG1PdXRwdXRCbG9jay5yZXNldCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICBzaXplX3QgcHJvY2Vzc1NpemUgPSAwOworICAgIG1CeXRlc0VuY29kZWQgPSAwOworICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9IDB1OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgIHVpbnQ2NF90IGlucHV0SW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICBjb25zdCB1aW50OF90KiBpblB0ciA9IHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0OworCisgICAgY2xhc3MgRmlsbFdvcmsgeworICAgIHB1YmxpYzoKKyAgICAgICAgRmlsbFdvcmsodWludDMyX3QgZmxhZ3MsIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3JkaW5hbCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKQorICAgICAgICAgICAgOiBtRmxhZ3MoZmxhZ3MpLCBtT3JkaW5hbChvcmRpbmFsKSwgbUJ1ZmZlcihidWZmZXIpIHsKKyAgICAgICAgfQorICAgICAgICB+RmlsbFdvcmsoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpbUZsYWdzOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gbU9yZGluYWw7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgICAgICAgICBpZiAobUJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhtQnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJ0aW1lc3RhbXAgPSAlbGxkLCBpbmRleCA9ICVsbGQsIHcvJXMgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgIG1PcmRpbmFsLnRpbWVzdGFtcC5wZWVrbGwoKSwKKyAgICAgICAgICAgICAgICAgIG1PcmRpbmFsLmZyYW1lSW5kZXgucGVla2xsKCksCisgICAgICAgICAgICAgICAgICBtQnVmZmVyID8gIiIgOiAibyIpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCB1aW50MzJfdCBtRmxhZ3M7CisgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgbU9yZGluYWw7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gbUJ1ZmZlcjsKKyAgICB9OworCisgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvdXRPcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKworICAgIGlmICghbUhlYWRlckdlbmVyYXRlZCkgeworICAgICAgICB1aW50OF90IGhlYWRlcltBT1BVU19VTklGSUVEX0NTRF9NQVhTSVpFXTsKKyAgICAgICAgbWVtc2V0KGhlYWRlciwgMCwgc2l6ZW9mKGhlYWRlcikpOworICAgICAgICBPcHVzSGVhZGVyIG9wdXNIZWFkZXI7CisgICAgICAgIG9wdXNIZWFkZXIuY2hhbm5lbHMgPSBtQ2hhbm5lbENvdW50OworICAgICAgICBvcHVzSGVhZGVyLm51bV9zdHJlYW1zID0gbUNoYW5uZWxDb3VudDsKKyAgICAgICAgb3B1c0hlYWRlci5udW1fY291cGxlZCA9IDA7CisgICAgICAgIG9wdXNIZWFkZXIuY2hhbm5lbF9tYXBwaW5nID0gKChtQ2hhbm5lbENvdW50ID4gOCkgPyAyNTUgOiAobUNoYW5uZWxDb3VudCA+IDIpKTsKKyAgICAgICAgb3B1c0hlYWRlci5nYWluX2RiID0gMDsKKyAgICAgICAgb3B1c0hlYWRlci5za2lwX3NhbXBsZXMgPSAwOworICAgICAgICBpbnQgaGVhZGVyTGVuID0gV3JpdGVPcHVzSGVhZGVycyhvcHVzSGVhZGVyLCBtU2FtcGxlUmF0ZSwgaGVhZGVyLAorICAgICAgICAgICAgc2l6ZW9mKGhlYWRlciksIG1Db2RlY0RlbGF5LCBtU2Vla1ByZVJvbGwpOworCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBjc2QgPQorICAgICAgICAgICAgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dDo6QWxsb2NVbmlxdWUoaGVhZGVyTGVuLCAwdSk7CisgICAgICAgIGlmICghY3NkKSB7CisgICAgICAgICAgICBBTE9HRSgiQ1NEIGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJwdXQgY3NkLCAlZCBieXRlcyIsIGhlYWRlckxlbik7CisgICAgICAgIG1lbWNweShjc2QtPm0udmFsdWUsIGhlYWRlciwgaGVhZGVyTGVuKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNzZCkpOworICAgICAgICBtSGVhZGVyR2VuZXJhdGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZvciBidWZmZXIgc2l6ZSB3aGljaCBpcyBub3QgYSBtdWx0aXBsZSBvZiBtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lLCB3ZSB3aWxsCisgICAgICogYWNjdW11bGF0ZSB0aGUgaW5wdXQgYW5kIGtlZXAgaXQuIE9uY2UgdGhlIGlucHV0IGlzIGZpbGxlZCB3aXRoIGV4cGVjdGVkIG51bWJlcgorICAgICAqIG9mIGJ5dGVzLCB3ZSB3aWxsIHNlbmQgaXQgdG8gZW5jb2Rlci4gbUZpbGxlZExlbiBtYW5hZ2VzIHRoZSBieXRlcyBvZiBpbnB1dCB5ZXQKKyAgICAgKiB0byBiZSBwcm9jZXNzZWQuIFRoZSBuZXh0IGNhbGwgd2lsbCBmaWxsIG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuCisgICAgICogYnl0ZXMgdG8gaW5wdXQgYW5kIHNlbmQgaXQgdG8gdGhlIGVuY29kZXIuCisgICAgICovCisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBjbUJ5dGVzID0gaW5QdHIgKyBpblBvczsKKyAgICAgICAgaW50IGZpbGxlZFNhbXBsZXMgPSBtRmlsbGVkTGVuIC8gc2l6ZW9mKGludDE2X3QpOworICAgICAgICBpZiAoKGluUG9zICsgKG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKSkgPD0gaW5TaXplKSB7CisgICAgICAgICAgICBwcm9jZXNzU2l6ZSA9IG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuOworICAgICAgICAgICAgbUJ1ZmZlckF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcm9jZXNzU2l6ZSA9IGluU2l6ZSAtIGluUG9zOworICAgICAgICAgICAgbUJ1ZmZlckF2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgICAgIG1lbXNldChtSW5wdXRCdWZmZXJQY20xNiArIGZpbGxlZFNhbXBsZXMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgIChtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpOworICAgICAgICAgICAgICAgIG1CdWZmZXJBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIG5JbnB1dFNhbXBsZXMgPSBwcm9jZXNzU2l6ZSAvIHNpemVvZihpbnQxNl90KTsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbklucHV0U2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IGRhdGEgPSBwY21CeXRlc1syICogaSArIDFdIDw8IDggfCBwY21CeXRlc1syICogaV07CisgICAgICAgICAgICBkYXRhID0gKChkYXRhICYgMHhGRkZGKSBeIDB4ODAwMCkgLSAweDgwMDA7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXJQY20xNltpICsgZmlsbGVkU2FtcGxlc10gPSBkYXRhOworICAgICAgICB9CisgICAgICAgIGluUG9zICs9IHByb2Nlc3NTaXplOworICAgICAgICBtRmlsbGVkTGVuICs9IHByb2Nlc3NTaXplOworICAgICAgICBpZiAoIW1CdWZmZXJBdmFpbGFibGUpIGJyZWFrOworICAgICAgICB1aW50OF90KiBvdXRQdHIgPSB3Vmlldy5kYXRhKCkgKyBtQnl0ZXNFbmNvZGVkOworICAgICAgICBpbnQgZW5jb2RlZEJ5dGVzID0KKyAgICAgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZW5jb2RlKG1FbmNvZGVyLCBtSW5wdXRCdWZmZXJQY20xNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1TYW1wbGVzUGVyRnJhbWUsIG91dFB0ciwga01heFBheWxvYWQpOworICAgICAgICBBTE9HVigiZW5jb2RlZCAlaSBPcHVzIGJ5dGVzIGZyb20gJXp1IFBDTSBieXRlcyIsIGVuY29kZWRCeXRlcywKKyAgICAgICAgICAgICAgcHJvY2Vzc1NpemUpOworCisgICAgICAgIGlmIChlbmNvZGVkQnl0ZXMgPCAwIHx8IGVuY29kZWRCeXRlcyA+IGtNYXhQYXlsb2FkKSB7CisgICAgICAgICAgICBBTE9HRSgib3B1c19lbmNvZGUgZmFpbGVkLCBlbmNvZGVkQnl0ZXMgOiAlZCIsIGVuY29kZWRCeXRlcyk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIG91dE9yZGluYWwuZnJhbWVJbmRleCA9IG1PdXRJbmRleCsrOworICAgICAgICAgICAgb3V0T3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgICAgICAgICAgY2xvbmVBbmRTZW5kKAorICAgICAgICAgICAgICAgIGlucHV0SW5kZXgsIHdvcmssCisgICAgICAgICAgICAgICAgRmlsbFdvcmsoQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSwgb3V0T3JkaW5hbCwgYnVmZmVyKSk7CisgICAgICAgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW5jb2RlZEJ5dGVzID4gMCkgeworICAgICAgICAgICAgYnVmZmVyID0KKyAgICAgICAgICAgICAgICBjcmVhdGVMaW5lYXJCdWZmZXIobU91dHB1dEJsb2NrLCBtQnl0ZXNFbmNvZGVkLCBlbmNvZGVkQnl0ZXMpOworICAgICAgICB9CisgICAgICAgIG1CeXRlc0VuY29kZWQgKz0gZW5jb2RlZEJ5dGVzOworICAgICAgICBtUHJvY2Vzc2VkU2FtcGxlcyArPSAoZmlsbGVkU2FtcGxlcyArIG5JbnB1dFNhbXBsZXMpOworICAgICAgICBvdXRUaW1lU3RhbXAgPQorICAgICAgICAgICAgbVByb2Nlc3NlZFNhbXBsZXMgKiAxMDAwMDAwbGwgLyBtQ2hhbm5lbENvdW50IC8gbVNhbXBsZVJhdGU7CisgICAgICAgIGlmICgocHJvY2Vzc1NpemUgKyBtRmlsbGVkTGVuKSA8IG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUpCisgICAgICAgICAgICBtRW5jb2RlckZsdXNoZWQgPSB0cnVlOworICAgICAgICBtRmlsbGVkTGVuID0gMDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKGVvcykgeworICAgICAgICBBTE9HVigic2lnbmFsbGVkIGVvcyIpOworICAgICAgICBtU2lnbmFsbGVkRW9zID0gdHJ1ZTsKKyAgICAgICAgaWYgKCFtRW5jb2RlckZsdXNoZWQpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBvdXRPcmRpbmFsLmZyYW1lSW5kZXggPSBtT3V0SW5kZXgrKzsKKyAgICAgICAgICAgICAgICBvdXRPcmRpbmFsLnRpbWVzdGFtcCA9IG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXA7CisgICAgICAgICAgICAgICAgY2xvbmVBbmRTZW5kKAorICAgICAgICAgICAgICAgICAgICBpbnB1dEluZGV4LCB3b3JrLAorICAgICAgICAgICAgICAgICAgICBGaWxsV29yayhDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFLCBvdXRPcmRpbmFsLCBidWZmZXIpKTsKKyAgICAgICAgICAgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGRyYWluIHRoZSBlbmNvZGVyIGZvciBsYXN0IGJ1ZmZlcgorICAgICAgICAgICAgZHJhaW5JbnRlcm5hbChwb29sLCB3b3JrKTsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgfQorICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgb3V0T3JkaW5hbC5mcmFtZUluZGV4ID0gbU91dEluZGV4Kys7CisgICAgICAgIG91dE9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICAgICAgRmlsbFdvcmsoKEMyRnJhbWVEYXRhOjpmbGFnc190KShmbGFncyksIG91dE9yZGluYWwsIGJ1ZmZlcikod29yayk7CisgICAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgIH0KKyAgICBtT3V0cHV0QmxvY2sgPSBudWxscHRyOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRW5jOjpkcmFpbkludGVybmFsKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgIG1CeXRlc0VuY29kZWQgPSAwOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gbnVsbHB0cjsKKyAgICBDMldvcmtPcmRpbmFsU3RydWN0IG91dE9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhrTWF4UGF5bG9hZCwgdXNhZ2UsICZtT3V0cHV0QmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIH0KKworICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gbU91dHB1dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIG1PdXRwdXRCbG9jay5yZXNldCgpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIGludCBlbmNCeXRlcyA9IGRyYWluRW5jb2Rlcih3Vmlldy5kYXRhKCkpOworICAgIGlmIChlbmNCeXRlcyA+IDApIG1CeXRlc0VuY29kZWQgKz0gZW5jQnl0ZXM7CisgICAgaWYgKG1CeXRlc0VuY29kZWQgPiAwKSB7CisgICAgICAgIGJ1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihtT3V0cHV0QmxvY2ssIDAsIG1CeXRlc0VuY29kZWQpOworICAgICAgICBtT3V0cHV0QmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgKz0gKG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUgLyBzaXplb2YoaW50MTZfdCkpOworICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9CisgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gbUNoYW5uZWxDb3VudCAvIG1TYW1wbGVSYXRlOworICAgIG91dE9yZGluYWwuZnJhbWVJbmRleCA9IG1PdXRJbmRleCsrOworICAgIG91dE9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPQorICAgICAgICAoQzJGcmFtZURhdGE6OmZsYWdzX3QpKGVvcyA/IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0gOiAwKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gb3V0T3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgfQorICAgIG1PdXRwdXRCbG9jayA9IG51bGxwdHI7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRW5jOjpkcmFpbih1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKyAgICBtSXNGaXJzdEZyYW1lID0gdHJ1ZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMHVsbDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDB1OworICAgIHJldHVybiBkcmFpbkludGVybmFsKHBvb2wsIG51bGxwdHIpOworfQorCitjbGFzcyBDMlNvZnRPcHVzRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdE9wdXNFbmNGYWN0b3J5KCkKKyAgICAgICAgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdE9wdXNFbmMoCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0T3B1c0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0T3B1c0VuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE9wdXNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE9wdXNFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0T3B1c0VuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWU1MjQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX09QVVNfRU5DX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9PUFVTX0VOQ19IXworCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisjZGVmaW5lIE1JTihhLCBiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisKK3N0cnVjdCBPcHVzTVNFbmNvZGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRPcHVzRW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE9wdXNFbmMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdE9wdXNFbmMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICAgIC8qIE9QVVNfRlJBTUVTSVpFXzIwX01TICovCisgICAgY29uc3QgaW50IGtGcmFtZVNpemUgPSA5NjA7CisgICAgY29uc3QgaW50IGtNYXhQYXlsb2FkID0gNDAwMDsKKyAgICBjb25zdCBpbnQga01heE51bUNoYW5uZWxzID0gODsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IG1PdXRwdXRCbG9jazsKKworICAgIE9wdXNNU0VuY29kZXIqIG1FbmNvZGVyOworICAgIGludDE2X3QqIG1JbnB1dEJ1ZmZlclBjbTE2OworCisgICAgYm9vbCBtSGVhZGVyR2VuZXJhdGVkOworICAgIGJvb2wgbUlzRmlyc3RGcmFtZTsKKyAgICBib29sIG1FbmNvZGVyRmx1c2hlZDsKKyAgICBib29sIG1CdWZmZXJBdmFpbGFibGU7CisgICAgYm9vbCBtU2lnbmFsbGVkRW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIHVpbnQzMl90IG1TYW1wbGVSYXRlOworICAgIHVpbnQzMl90IG1DaGFubmVsQ291bnQ7CisgICAgdWludDMyX3QgbUZyYW1lRHVyYXRpb25NczsKKyAgICB1aW50NjRfdCBtQW5jaG9yVGltZVN0YW1wOworICAgIHVpbnQ2NF90IG1Qcm9jZXNzZWRTYW1wbGVzOworICAgIC8vIENvZGVjIGRlbGF5IGluIG5zCisgICAgdWludDY0X3QgbUNvZGVjRGVsYXk7CisgICAgLy8gU2VlayBwcmUtcm9sbCBpbiBucworICAgIHVpbnQ2NF90IG1TZWVrUHJlUm9sbDsKKyAgICBpbnQgbU51bVNhbXBsZXNQZXJGcmFtZTsKKyAgICBpbnQgbUJ5dGVzRW5jb2RlZDsKKyAgICBpbnQzMl90IG1GaWxsZWRMZW47CisgICAgc2l6ZV90IG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWU7CisgICAgc3RkOjphdG9taWNfdWludDY0X3QgbU91dEluZGV4OworICAgIGMyX3N0YXR1c190IGluaXRFbmNvZGVyKCk7CisgICAgYzJfc3RhdHVzX3QgY29uZmlndXJlRW5jb2RlcigpOworICAgIGludCBkcmFpbkVuY29kZXIodWludDhfdCogb3V0UHRyKTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRPcHVzRW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX09QVVNfRU5DX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOTQ0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQW5kcm9pZC5icApAQCAtMCwwICsxLDkgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfcmF3ZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRSYXdEZWMuY3BwIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9DMlNvZnRSYXdEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMmNhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmNwcApAQCAtMCwwICsxLDIzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0UmF3RGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRSYXdEZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQucmF3LmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRSYXdEZWM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCAxOTIwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAyKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDEsIDEwMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgNjQgKiAxMDI0KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QY21FbmNvZGluZ0luZm8sIEMyX1BBUkFNS0VZX1BDTV9FTkNPRElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOjpvdXRwdXQoMHUsIEMyQ29uZmlnOjpQQ01fMTYpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVBjbUVuY29kaW5nSW5mbywgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQQ01fMTYsCisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNXzgsCisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNX0ZMT0FUfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1QY21FbmNvZGluZ0luZm8pPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QY21FbmNvZGluZ0luZm86Om91dHB1dD4gbVBjbUVuY29kaW5nSW5mbzsKK307CisKK0MyU29mdFJhd0RlYzo6QzJTb2Z0UmF3RGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSB7Cit9CisKK0MyU29mdFJhd0RlYzo6fkMyU29mdFJhd0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0UmF3RGVjOjpvbkluaXQoKSB7CisgICAgbVNpZ25hbGxlZEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0UmF3RGVjOjpvblN0b3AoKSB7CisgICAgbVNpZ25hbGxlZEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRSYXdEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0UmF3RGVjOjpvblJlbGVhc2UoKSB7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFJhd0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0UmF3RGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKXBvb2w7CisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKworICAgIGlmIChtU2lnbmFsbGVkRW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2sod29yay0+aW5wdXQuYnVmZmVyc1swXSk7CisgICAgfQorICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgbVNpZ25hbGxlZEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRSYXdEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRSYXdEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0UmF3RGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdFJhd0RlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRSYXdEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0UmF3RGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0UmF3RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0UmF3RGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0UmF3RGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmZGVjNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9DMlNvZnRSYXdEZWMuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfUkFXX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfUkFXX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRSYXdEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0UmF3RGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdFJhd0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBib29sIG1TaWduYWxsZWRFb3M7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRSYXdEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfUkFXX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjFlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAwNS0yMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWY0ODVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92b3JiaXNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFZvcmJpc0RlYy5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYnZvcmJpc2lkZWMiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0MyU29mdFZvcmJpc0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTczOTNlZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuY3BwCkBAIC0wLDAgKzEsNDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRWb3JiaXNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdFZvcmJpc0RlYy5oIgorCitleHRlcm4gIkMiIHsKKyAgICAjaW5jbHVkZSA8VHJlbW9sby9jb2RlY19pbnRlcm5hbC5oPgorCisgICAgaW50IF92b3JiaXNfdW5wYWNrX2Jvb2tzKHZvcmJpc19pbmZvICp2aSxvZ2dwYWNrX2J1ZmZlciAqb3BiKTsKKyAgICBpbnQgX3ZvcmJpc191bnBhY2tfaW5mbyh2b3JiaXNfaW5mbyAqdmksb2dncGFja19idWZmZXIgKm9wYik7CisgICAgaW50IF92b3JiaXNfdW5wYWNrX2NvbW1lbnQodm9yYmlzX2NvbW1lbnQgKnZjLG9nZ3BhY2tfYnVmZmVyICpvcGIpOworfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC52b3JiaXMuZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdFZvcmJpc0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQoMHUsIEMyQnVmZmVyRGF0YTo6TElORUFSKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgNDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5pblJhbmdlKDgwMDAsIDk2MDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA4KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSgzMjAwMCwgNTAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MiAqIDIgKiBzaXplb2YoaW50MTZfdCkpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dEZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdFZvcmJpc0RlYzo6QzJTb2Z0Vm9yYmlzRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1TdGF0ZShudWxscHRyKSwKKyAgICAgIG1WaShudWxscHRyKSB7Cit9CisKK0MyU29mdFZvcmJpc0RlYzo6fkMyU29mdFZvcmJpc0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0Vm9yYmlzRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZvcmJpc0RlYzo6b25TdG9wKCkgeworICAgIGlmIChtU3RhdGUpIHsKKyAgICAgICAgdm9yYmlzX2RzcF9jbGVhcihtU3RhdGUpOworICAgICAgICBkZWxldGUgbVN0YXRlOworICAgICAgICBtU3RhdGUgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtVmkpIHsKKyAgICAgICAgdm9yYmlzX2luZm9fY2xlYXIobVZpKTsKKyAgICAgICAgZGVsZXRlIG1WaTsKKyAgICAgICAgbVZpID0gbnVsbHB0cjsKKyAgICB9CisgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgPSAtMTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gKGluaXREZWNvZGVyKCkgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRCk7Cit9CisKK3ZvaWQgQzJTb2Z0Vm9yYmlzRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdFZvcmJpc0RlYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtU3RhdGUpIHsKKyAgICAgICAgdm9yYmlzX2RzcF9jbGVhcihtU3RhdGUpOworICAgICAgICBkZWxldGUgbVN0YXRlOworICAgICAgICBtU3RhdGUgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtVmkpIHsKKyAgICAgICAgdm9yYmlzX2luZm9fY2xlYXIobVZpKTsKKyAgICAgICAgZGVsZXRlIG1WaTsKKyAgICAgICAgbVZpID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyU29mdFZvcmJpc0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgbVZpID0gbmV3IHZvcmJpc19pbmZve307CisgICAgaWYgKCFtVmkpIHJldHVybiBOT19NRU1PUlk7CisgICAgdm9yYmlzX2luZm9fY2xlYXIobVZpKTsKKworICAgIG1TdGF0ZSA9IG5ldyB2b3JiaXNfZHNwX3N0YXRle307CisgICAgaWYgKCFtU3RhdGUpIHJldHVybiBOT19NRU1PUlk7CisgICAgdm9yYmlzX2RzcF9jbGVhcihtU3RhdGUpOworCisgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgPSAtMTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUluZm9VbnBhY2tlZCA9IGZhbHNlOworICAgIG1Cb29rc1VucGFja2VkID0gZmFsc2U7CisgICAgcmV0dXJuIE9LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWb3JiaXNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgPSAtMTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgaWYgKG1TdGF0ZSkgdm9yYmlzX2RzcF9yZXN0YXJ0KG1TdGF0ZSk7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZvcmJpc0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCitzdGF0aWMgdm9pZCBtYWtlQml0UmVhZGVyKAorICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgb2dnX2J1ZmZlciAqYnVmLCBvZ2dfcmVmZXJlbmNlICpyZWYsIG9nZ3BhY2tfYnVmZmVyICpiaXRzKSB7CisgICAgYnVmLT5kYXRhID0gKHVpbnQ4X3QgKilkYXRhOworICAgIGJ1Zi0+c2l6ZSA9IHNpemU7CisgICAgYnVmLT5yZWZjb3VudCA9IDE7CisgICAgYnVmLT5wdHIub3duZXIgPSBudWxscHRyOworCisgICAgcmVmLT5idWZmZXIgPSBidWY7CisgICAgcmVmLT5iZWdpbiA9IDA7CisgICAgcmVmLT5sZW5ndGggPSBzaXplOworICAgIHJlZi0+bmV4dCA9IG51bGxwdHI7CisKKyAgICBvZ2dwYWNrX3JlYWRpbml0KGJpdHMsIHJlZik7Cit9CisKKy8vIChDSEVDSyEpIG11bHRpZnJhbWUgaXMgdHJpY2t5LiBkZWNvZGUgY2FsbCBkb2VzbnQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMKKy8vIGNvbnN1bWVkIGJ5IHRoZSBjb21wb25lbnQuIEFsc28gaXQgaXMgdW5jbGVhciB3aHkgbnVtUGFnZUZyYW1lcyBpcyBiZWluZworLy8gdGFnZ2VkIGF0IHRoZSBlbmQgb2YgaW5wdXQgYnVmZmVycyBmb3IgbmV3IHBhZ2VzLiBSZWZlciBsaW5lcyAyOTctMzAwIGluCisvLyBTaW1wbGVEZWNvZGluZ1NvdXJjZS5jcHAKK3ZvaWQgQzJTb2Z0Vm9yYmlzRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSByVmlldy5kYXRhKCkgKyBpbk9mZnNldDsKKyAgICBpbnQzMl90IG51bUNoYW5uZWxzICA9IG1WaS0+Y2hhbm5lbHM7CisgICAgaW50MzJfdCBzYW1wbGluZ1JhdGUgPSBtVmktPnJhdGU7CisgICAgaWYgKGluU2l6ZSA+IDcgJiYgIW1lbWNtcCgmZGF0YVsxXSwgInZvcmJpcyIsIDYpKSB7CisgICAgICAgIGlmICgoZGF0YVswXSAhPSAxKSAmJiAoZGF0YVswXSAhPSA1KSkgeworICAgICAgICAgICAgQUxPR0UoInVuZXhwZWN0ZWQgdHlwZSByZWNlaXZlZCAlZCIsIGRhdGFbMF0pOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG9nZ19idWZmZXIgYnVmOworICAgICAgICBvZ2dfcmVmZXJlbmNlIHJlZjsKKyAgICAgICAgb2dncGFja19idWZmZXIgYml0czsKKworICAgICAgICAvLyBza2lwIDcgPHR5cGUgKyAidm9yYmlzIj4gYnl0ZXMKKyAgICAgICAgbWFrZUJpdFJlYWRlcigoY29uc3QgdWludDhfdCAqKWRhdGEgKyA3LCBpblNpemUgLSA3LCAmYnVmLCAmcmVmLCAmYml0cyk7CisgICAgICAgIGlmIChkYXRhWzBdID09IDEpIHsKKyAgICAgICAgICAgIHZvcmJpc19pbmZvX2luaXQobVZpKTsKKyAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2luZm8obVZpLCAmYml0cykpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRW5jb3VudGVyZWQgZXJyb3Igd2hpbGUgdW5wYWNraW5nIGluZm8iKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVZpLT5yYXRlICE9IHNhbXBsaW5nUmF0ZSB8fAorICAgICAgICAgICAgICAgICAgICBtVmktPmNoYW5uZWxzICE9IG51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInZvcmJpczogcmF0ZS9jaGFubmVscyBjaGFuZ2VkOiAlbGQvJWQiLCBtVmktPnJhdGUsIG1WaS0+Y2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSA9IG1WaS0+cmF0ZTsKKyAgICAgICAgICAgICAgICBudW1DaGFubmVscyA9IG1WaS0+Y2hhbm5lbHM7CisKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIHNhbXBsaW5nUmF0ZSk7CisgICAgICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygwdSwgbnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShzYW1wbGVSYXRlSW5mbykpOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KGNoYW5uZWxDb3VudEluZm8pKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIFVwZGF0ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUluZm9VbnBhY2tlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIW1JbmZvVW5wYWNrZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRGF0YSB3aXRoIHR5cGU6NSBzZW50IGJlZm9yZSBzZW5kaW5nIHR5cGU6MSIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2Jvb2tzKG1WaSwgJmJpdHMpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVuY291bnRlcmVkIGVycm9yIHdoaWxlIHVucGFja2luZyBib29rcyIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgwICE9IHZvcmJpc19kc3BfaW5pdChtU3RhdGUsIG1WaSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRW5jb3VudGVyZWQgZXJyb3Igd2hpbGUgZHNwIGluaXQiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQm9va3NVbnBhY2tlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIW1JbmZvVW5wYWNrZWQgfHwgIW1Cb29rc1VucGFja2VkKSB7CisgICAgICAgIEFMT0dFKCJNaXNzaW5nIENPREVDX0NPTkZJRyBkYXRhIG1JbmZvVW5wYWNrZWQ6ICVkIG1Cb29rc1VucGFjayAlZCIsIG1JbmZvVW5wYWNrZWQsIG1Cb29rc1VucGFja2VkKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBudW1QYWdlRnJhbWVzID0gMDsKKyAgICBpZiAoaW5TaXplIDwgc2l6ZW9mKG51bVBhZ2VGcmFtZXMpKSB7CisgICAgICAgIEFMT0dFKCJpbnB1dCBoZWFkZXIgaGFzIHNpemUgJXp1LCBleHBlY3RlZCAlenUiLCBpblNpemUsIHNpemVvZihudW1QYWdlRnJhbWVzKSk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtZW1jcHkoJm51bVBhZ2VGcmFtZXMsIGRhdGEgKyBpblNpemUgLSBzaXplb2YobnVtUGFnZUZyYW1lcyksIHNpemVvZihudW1QYWdlRnJhbWVzKSk7CisgICAgaW5TaXplIC09IHNpemVvZihudW1QYWdlRnJhbWVzKTsKKyAgICBpZiAobnVtUGFnZUZyYW1lcyA+PSAwKSB7CisgICAgICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gbnVtUGFnZUZyYW1lczsKKyAgICB9CisKKyAgICBvZ2dfYnVmZmVyIGJ1ZjsKKyAgICBidWYuZGF0YSA9IGNvbnN0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KGRhdGEpOworICAgIGJ1Zi5zaXplID0gaW5TaXplOworICAgIGJ1Zi5yZWZjb3VudCA9IDE7CisgICAgYnVmLnB0ci5vd25lciA9IG51bGxwdHI7CisKKyAgICBvZ2dfcmVmZXJlbmNlIHJlZjsKKyAgICByZWYuYnVmZmVyID0gJmJ1ZjsKKyAgICByZWYuYmVnaW4gPSAwOworICAgIHJlZi5sZW5ndGggPSBidWYuc2l6ZTsKKyAgICByZWYubmV4dCA9IG51bGxwdHI7CisKKyAgICBvZ2dfcGFja2V0IHBhY2s7CisgICAgcGFjay5wYWNrZXQgPSAmcmVmOworICAgIHBhY2suYnl0ZXMgPSByZWYubGVuZ3RoOworICAgIHBhY2suYl9vX3MgPSAwOworICAgIHBhY2suZV9vX3MgPSAwOworICAgIHBhY2suZ3JhbnVsZXBvcyA9IDA7CisgICAgcGFjay5wYWNrZXRubyA9IDA7CisKKyAgICBzaXplX3QgbWF4U2FtcGxlc0luQnVmZmVyID0ga01heE51bVNhbXBsZXNQZXJDaGFubmVsICogbVZpLT5jaGFubmVsczsKKyAgICBzaXplX3Qgb3V0Q2FwYWNpdHkgPSAgbWF4U2FtcGxlc0luQnVmZmVyICogc2l6ZW9mKGludDE2X3QpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhvdXRDYXBhY2l0eSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgbnVtRnJhbWVzID0gMDsKKyAgICBpbnQgcmV0ID0gdm9yYmlzX2RzcF9zeW50aGVzaXMobVN0YXRlLCAmcGFjaywgMSk7CisgICAgaWYgKDAgIT0gcmV0KSB7CisgICAgICAgIEFMT0dEKCJ2b3JiaXNfZHNwX3N5bnRoZXNpcyByZXR1cm5lZCAlZDsgaWdub3JlZCIsIHJldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbnVtRnJhbWVzID0gdm9yYmlzX2RzcF9wY21vdXQoCisgICAgICAgICAgICAgICAgbVN0YXRlLCAgcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+ICh3Vmlldy5kYXRhKCkpLAorICAgICAgICAgICAgICAgIGtNYXhOdW1TYW1wbGVzUGVyQ2hhbm5lbCk7CisgICAgICAgIGlmIChudW1GcmFtZXMgPCAwKSB7CisgICAgICAgICAgICBBTE9HRCgidm9yYmlzX2RzcF9wY21vdXQgcmV0dXJuZWQgJWQiLCBudW1GcmFtZXMpOworICAgICAgICAgICAgbnVtRnJhbWVzID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtTnVtRnJhbWVzTGVmdE9uUGFnZSA+PSAwKSB7CisgICAgICAgIGlmIChudW1GcmFtZXMgPiBtTnVtRnJhbWVzTGVmdE9uUGFnZSkgeworICAgICAgICAgICAgQUxPR1YoImRpc2NhcmRpbmcgJWQgZnJhbWVzIGF0IGVuZCBvZiBwYWdlIiwgbnVtRnJhbWVzIC0gbU51bUZyYW1lc0xlZnRPblBhZ2UpOworICAgICAgICAgICAgbnVtRnJhbWVzID0gbU51bUZyYW1lc0xlZnRPblBhZ2U7CisgICAgICAgIH0KKyAgICAgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgLT0gbnVtRnJhbWVzOworICAgIH0KKworICAgIGlmIChudW1GcmFtZXMpIHsKKyAgICAgICAgaW50IG91dFNpemUgPSBudW1GcmFtZXMgKiBzaXplb2YoaW50MTZfdCkgKiBtVmktPmNoYW5uZWxzOworCisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCAwLCBvdXRTaXplKSk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBibG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworY2xhc3MgQzJTb2Z0Vm9yYmlzRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFZvcmJpc0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRWb3JiaXNEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0Vm9yYmlzRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdFZvcmJpc0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZvcmJpc0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFZvcmJpc0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFZvcmJpc0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0MyU29mdFZvcmJpc0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0MyU29mdFZvcmJpc0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZjczMjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQzJTb2Z0Vm9yYmlzRGVjLmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1ZPUkJJU19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1ZPUkJJU19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworc3RydWN0IHZvcmJpc19kc3Bfc3RhdGU7CitzdHJ1Y3Qgdm9yYmlzX2luZm87CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdFZvcmJpc0RlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRWb3JiaXNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0Vm9yYmlzRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga01heE51bVNhbXBsZXNQZXJDaGFubmVsID0gODE5MiwKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICB2b3JiaXNfZHNwX3N0YXRlICptU3RhdGU7CisgICAgdm9yYmlzX2luZm8gKm1WaTsKKworICAgIGludDMyX3QgbU51bUZyYW1lc0xlZnRPblBhZ2U7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbUluZm9VbnBhY2tlZDsKKyAgICBib29sIG1Cb29rc1VucGFja2VkOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRWb3JiaXNEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfVk9SQklTX0RFQ19IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViMWVmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZmQzNzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQW5kcm9pZC5icApAQCAtMCwwICsxLDYwIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3ZwOWRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0VnB4RGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlidnB4Il0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EVlA5IiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3ZwOGRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0VnB4RGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlidnB4Il0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfdnA5ZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAiQzJTb2Z0VnA5RW5jLmNwcCIsCisgICAgICAgICJDMlNvZnRWcHhFbmMuY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlidnB4Il0sCisKKyAgICBjZmxhZ3M6IFsiLURWUDkiXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92cDhlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMlNvZnRWcDhFbmMuY3BwIiwKKyAgICAgICAgIkMyU29mdFZweEVuYy5jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJ2cHgiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA4RW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWU3MTdhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5jcHAKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0VnA4RW5jIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgIkMyU29mdFZwOEVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC52cDguZW5jb2RlciI7CisKK0MyU29mdFZwOEVuYzo6QzJTb2Z0VnA4RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogQzJTb2Z0VnB4RW5jKG5hbWUsIGlkLCBpbnRmSW1wbCksIG1EQ1RQYXJ0aXRpb25zKDApLCBtUHJvZmlsZSgxKSB7fQorCit2b2lkIEMyU29mdFZwOEVuYzo6c2V0Q29kZWNTcGVjaWZpY0ludGVyZmFjZSgpIHsKKyAgICBtQ29kZWNJbnRlcmZhY2UgPSB2cHhfY29kZWNfdnA4X2N4KCk7Cit9CisKK3ZvaWQgQzJTb2Z0VnA4RW5jOjpzZXRDb2RlY1NwZWNpZmljQ29uZmlndXJhdGlvbigpIHsKKyAgICBzd2l0Y2ggKG1Qcm9maWxlKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMDsKKyAgICB9Cit9CisKK3ZweF9jb2RlY19lcnJfdCBDMlNvZnRWcDhFbmM6OnNldENvZGVjU3BlY2lmaWNDb250cm9scygpIHsKKyAgICB2cHhfY29kZWNfZXJyX3QgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4RV9TRVRfVE9LRU5fUEFSVElUSU9OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURDVFBhcnRpdGlvbnMpOworICAgIGlmIChjb2RlY19yZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBzZXR0aW5nIGRjdCBwYXJ0aXRpb25zIGZvciB2cHggZW5jb2Rlci4iKTsKKyAgICB9CisgICAgcmV0dXJuIGNvZGVjX3JldHVybjsKK30KKworY2xhc3MgQzJTb2Z0VnA4RW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFZwOEVuY0ZhY3RvcnkoKQorICAgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkge30KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0VnA4RW5jKENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0VnA4RW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0VnA4RW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA4RW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA4RW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2ZjM1NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9WUDhfRU5DX0hfXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfVlA4X0VOQ19IX18KKworI2luY2x1ZGUgIkMyU29mdFZweEVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEV4cG9zZXMgdnA4IGVuY29kZXIgYXMgYSBjMiBDb21wb25lbnQKKy8vCisvLyBJbiBhZGRpdGlvbiB0byB0aGUgYmFzZSBjbGFzcyBzZXR0aW5ncywgT25seSBmb2xsb3dpbmcgZW5jb2RlciBzZXR0aW5ncyBhcmUKKy8vIGF2YWlsYWJsZToKKy8vICAgIC0gdG9rZW4gcGFydGl0aW9uaW5nCitzdHJ1Y3QgQzJTb2Z0VnA4RW5jIDogcHVibGljIEMyU29mdFZweEVuYyB7CisgICAgQzJTb2Z0VnA4RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworCisgcHJvdGVjdGVkOgorICAgIC8vIFBvcHVsYXRlcyB8bUNvZGVjSW50ZXJmYWNlfCB3aXRoIGNvZGVjIHNwZWNpZmljIHNldHRpbmdzLgorICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljSW50ZXJmYWNlKCk7CisKKyAgICAvLyBTZXRzIGNvZGVjIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNDb25maWd1cmF0aW9uKCk7CisKKyAgICAvLyBJbml0aWFsaXplcyBjb2RlYyBzcGVjaWZpYyBlbmNvZGVyIHNldHRpbmdzLgorICAgIHZpcnR1YWwgdnB4X2NvZGVjX2Vycl90IHNldENvZGVjU3BlY2lmaWNDb250cm9scygpOworCisgcHJpdmF0ZToKKyAgICAvLyBNYXggdmFsdWUgc3VwcG9ydGVkIGZvciBEQ1QgcGFydGl0aW9ucworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4RENUUGFydGl0aW9ucyA9IDM7CisKKyAgICAvLyB2cDggc3BlY2lmaWMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIKKyAgICAvLyB0aGF0IGVuYWJsZXMgdG9rZW4gcGFydGl0aW9uaW5nIG9mCisgICAgLy8gdGhlIHN0cmVhbSBpbnRvIHN1YnN0cmVhbXMKKyAgICBpbnQzMl90IG1EQ1RQYXJ0aXRpb25zOworCisgICAgLy8gQzIgUHJvZmlsZSBwYXJhbWV0ZXIKKyAgICBpbnQzMl90IG1Qcm9maWxlOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0VnA4RW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZQOF9FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDlFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNjE3MGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmNwcApAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRWcDlFbmMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorCisjaW5jbHVkZSAiQzJTb2Z0VnA5RW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLnZwOS5lbmNvZGVyIjsKKworQzJTb2Z0VnA5RW5jOjpDMlNvZnRWcDlFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBDMlNvZnRWcHhFbmMobmFtZSwgaWQsIGludGZJbXBsKSwKKyAgICAgIG1Qcm9maWxlKDEpLAorICAgICAgbUxldmVsKDApLAorICAgICAgbVRpbGVDb2x1bW5zKDApLAorICAgICAgbUZyYW1lUGFyYWxsZWxEZWNvZGluZyhmYWxzZSkgeworfQorCit2b2lkIEMyU29mdFZwOUVuYzo6c2V0Q29kZWNTcGVjaWZpY0ludGVyZmFjZSgpIHsKKyAgICBtQ29kZWNJbnRlcmZhY2UgPSB2cHhfY29kZWNfdnA5X2N4KCk7Cit9CisKK3ZvaWQgQzJTb2Z0VnA5RW5jOjpzZXRDb2RlY1NwZWNpZmljQ29uZmlndXJhdGlvbigpIHsKKyAgICBzd2l0Y2ggKG1Qcm9maWxlKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMDsKKyAgICB9Cit9CisKK3ZweF9jb2RlY19lcnJfdCBDMlNvZnRWcDlFbmM6OnNldENvZGVjU3BlY2lmaWNDb250cm9scygpIHsKKyAgICB2cHhfY29kZWNfZXJyX3QgY29kZWNSZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbCgKKyAgICAgICAgICAgIG1Db2RlY0NvbnRleHQsIFZQOUVfU0VUX1RJTEVfQ09MVU1OUywgbVRpbGVDb2x1bW5zKTsKKyAgICBpZiAoY29kZWNSZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBzZXR0aW5nIFZQOUVfU0VUX1RJTEVfQ09MVU1OUyB0byAlZC4gdnB4X2NvZGVjX2NvbnRyb2woKSAiCisgICAgICAgICAgICAgICJyZXR1cm5lZCAlZCIsIG1UaWxlQ29sdW1ucywgY29kZWNSZXR1cm4pOworICAgICAgICByZXR1cm4gY29kZWNSZXR1cm47CisgICAgfQorICAgIGNvZGVjUmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2woCisgICAgICAgICAgICBtQ29kZWNDb250ZXh0LCBWUDlFX1NFVF9GUkFNRV9QQVJBTExFTF9ERUNPRElORywKKyAgICAgICAgICAgIG1GcmFtZVBhcmFsbGVsRGVjb2RpbmcpOworICAgIGlmIChjb2RlY1JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgVlA5RV9TRVRfRlJBTUVfUEFSQUxMRUxfREVDT0RJTkcgdG8gJWQuIgorICAgICAgICAgICAgICAidnB4X2NvZGVjX2NvbnRyb2woKSByZXR1cm5lZCAlZCIsIG1GcmFtZVBhcmFsbGVsRGVjb2RpbmcsCisgICAgICAgICAgICAgIGNvZGVjUmV0dXJuKTsKKyAgICAgICAgcmV0dXJuIGNvZGVjUmV0dXJuOworICAgIH0KKyAgICBjb2RlY1JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsIFZQOUVfU0VUX1JPV19NVCwgMSk7CisgICAgaWYgKGNvZGVjUmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBWUDlFX1NFVF9ST1dfTVQgdG8gMS4gdnB4X2NvZGVjX2NvbnRyb2woKSAiCisgICAgICAgICAgICAgICJyZXR1cm5lZCAlZCIsIGNvZGVjUmV0dXJuKTsKKyAgICAgICAgcmV0dXJuIGNvZGVjUmV0dXJuOworICAgIH0KKworICAgIC8vIEZvciBWUDksIHdlIGFsd2F5cyBzZXQgQ1BVX1VTRUQgdG8gOCAoYmVjYXVzZSB0aGUgcmVhbHRpbWUgZGVmYXVsdCBpcyAwCisgICAgLy8gd2hpY2ggaXMgdG9vIHNsb3cpLgorICAgIGNvZGVjUmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwgVlA4RV9TRVRfQ1BVVVNFRCwgOCk7CisgICAgaWYgKGNvZGVjUmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBWUDhFX1NFVF9DUFVVU0VEIHRvIDguIHZweF9jb2RlY19jb250cm9sKCkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgJWQiLCBjb2RlY1JldHVybik7CisgICAgICAgIHJldHVybiBjb2RlY1JldHVybjsKKyAgICB9CisgICAgcmV0dXJuIGNvZGVjUmV0dXJuOworfQorCitjbGFzcyBDMlNvZnRWcDlFbmNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0VnA5RW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRWcDlFbmMoQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0VnB4RW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0VnB4RW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRWcDlFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRWcDlFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDlFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDlFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2VmOGZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1ZQOV9FTkNfSF9fCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9WUDlfRU5DX0hfXworCisjaW5jbHVkZSAiQzJTb2Z0VnB4RW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gRXhwb3NlcyB2cDkgZW5jb2RlciBhcyBhIGMyIENvbXBvbmVudAorLy8KKy8vIEluIGFkZGl0aW9uIHRvIHRoZSBiYXNlIGNsYXNzIHNldHRpbmdzLCBPbmx5IGZvbGxvd2luZyBlbmNvZGVyIHNldHRpbmdzIGFyZQorLy8gYXZhaWxhYmxlOgorLy8gICAgLSB0aWxlIHJvd3MKKy8vICAgIC0gdGlsZSBjb2x1bW5zCisvLyAgICAtIGZyYW1lIHBhcmFsbGVsIG1vZGUKK3N0cnVjdCBDMlNvZnRWcDlFbmMgOiBwdWJsaWMgQzJTb2Z0VnB4RW5jIHsKKyAgICBDMlNvZnRWcDlFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisKKyBwcm90ZWN0ZWQ6CisgICAgLy8gUG9wdWxhdGVzIHxtQ29kZWNJbnRlcmZhY2V8IHdpdGggY29kZWMgc3BlY2lmaWMgc2V0dGluZ3MuCisgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKTsKKworICAgIC8vIFNldHMgY29kZWMgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKTsKKworICAgIC8vIEluaXRpYWxpemVzIGNvZGVjIHNwZWNpZmljIGVuY29kZXIgc2V0dGluZ3MuCisgICAgdmlydHVhbCB2cHhfY29kZWNfZXJyX3Qgc2V0Q29kZWNTcGVjaWZpY0NvbnRyb2xzKCk7CisKKyBwcml2YXRlOgorICAgIC8vIEMyIFByb2ZpbGUgJiBMZXZlbCBwYXJhbWV0ZXIKKyAgICBpbnQzMl90IG1Qcm9maWxlOworICAgIGludDMyX3QgbUxldmVsIF9fdW51c2VkOworCisgICAgaW50MzJfdCBtVGlsZUNvbHVtbnM7CisKKyAgICBib29sIG1GcmFtZVBhcmFsbGVsRGVjb2Rpbmc7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRWcDlFbmMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfVlA5X0VOQ19IX18KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEyMGY3YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwCkBAIC0wLDAgKzEsODU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRWcHhEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdFZweERlYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZmRlZiBWUDkKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC52cDkuZGVjb2RlciI7CisjZWxzZQorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLnZwOC5kZWNvZGVyIjsKKyNlbmRpZgorCitjbGFzcyBDMlNvZnRWcHhEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLAorI2lmZGVmIFZQOQorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOQorI2Vsc2UKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19WUDgKKyNlbmRpZgorICAgICAgICAgICAgICAgICkgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7IC8vIFRPRE86IGFjY291bnQgZm9yIG91ciBidWZmZXJzIGhlcmUKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICAvLyBUT0RPOiBvdXRwdXQgbGF0ZW5jeSBhbmQgcmVvcmRlcmluZworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworI2lmZGVmIFZQOQorICAgICAgICAvLyBUT0RPOiBBZGQgQzJDb25maWc6OlBST0ZJTEVfVlA5XzJIRFIgPz8KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfVlA5XzAsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8yfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzFfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV8yXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV8zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfM18xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzRfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzUsCisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBtSGRyMTBQbHVzSW5mb0lucHV0ID0gQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dDo6QWxsb2NTaGFyZWQoMCk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSGRyMTBQbHVzSW5mb0lucHV0LCBDMl9QQVJBTUtFWV9JTlBVVF9IRFIxMF9QTFVTX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG1IZHIxMFBsdXNJbmZvSW5wdXQpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUhkcjEwUGx1c0luZm9JbnB1dCwgbS52YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihIZHIxMFBsdXNJbmZvSW5wdXRTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIG1IZHIxMFBsdXNJbmZvT3V0cHV0ID0gQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKDApOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUhkcjEwUGx1c0luZm9PdXRwdXQsIEMyX1BBUkFNS0VZX09VVFBVVF9IRFIxMF9QTFVTX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG1IZHIxMFBsdXNJbmZvT3V0cHV0KQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1IZHIxMFBsdXNJbmZvT3V0cHV0LCBtLnZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEhkcjEwUGx1c0luZm9PdXRwdXRTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisjaWYgMAorICAgICAgICAvLyBzYW1wbGUgQlQuMjAyMCBzdGF0aWMgaW5mbworICAgICAgICBtSGRyU3RhdGljSW5mbyA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ+KCk7CisgICAgICAgIG1IZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcgPSB7CisgICAgICAgICAgICAucmVkICAgPSB7IC54ID0gMC43MDgsICAueSA9IDAuMjkyIH0sCisgICAgICAgICAgICAuZ3JlZW4gPSB7IC54ID0gMC4xNzAsICAueSA9IDAuNzk3IH0sCisgICAgICAgICAgICAuYmx1ZSAgPSB7IC54ID0gMC4xMzEsICAueSA9IDAuMDQ2IH0sCisgICAgICAgICAgICAud2hpdGUgPSB7IC54ID0gMC4zMTI3LCAueSA9IDAuMzI5MCB9LAorICAgICAgICAgICAgLm1heEx1bWluYW5jZSA9IDEwMDAsCisgICAgICAgICAgICAubWluTHVtaW5hbmNlID0gMC4xLAorICAgICAgICB9OworICAgICAgICBtSGRyU3RhdGljSW5mby0+bWF4Q2xsID0gMTAwMDsKKyAgICAgICAgbUhkclN0YXRpY0luZm8tPm1heEZhbGwgPSAxMjA7CisKKyAgICAgICAgbUhkclN0YXRpY0luZm8tPm1heEx1bWluYW5jZSA9IDA7IC8vIGRpc2FibGUgc3RhdGljIGluZm8KKworICAgICAgICBoZWxwZXItPmFkZFN0cnVjdERlc2NyaXB0b3JzPEMyTWFzdGVyaW5nRGlzcGxheUNvbG9yVm9sdW1lU3RydWN0LCBDMkNvbG9yWHlTdHJ1Y3Q+KCk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSGRyU3RhdGljSW5mbywgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChtSGRyU3RhdGljSW5mbykKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtSGRyU3RhdGljSW5mbywgbWFzdGVyaW5nLnJlZC54KS5pblJhbmdlKDAsIDEpLAorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihIZHJTdGF0aWNJbmZvU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyNlbmRpZgorI2Vsc2UKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfVU5VU0VELCBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZW5kaWYKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFNpemUsIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDMyMCAqIDI0MCAqIDMgLyA0KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtTWF4SW5wdXRTaXplLCB2YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKE1heElucHV0U2l6ZVNldHRlciwgbU1heFNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0IGxvY2F0aW9uc1sxXSA9IHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgMXUsIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIG1lbWNweShkZWZhdWx0Q29sb3JJbmZvLT5tLmxvY2F0aW9ucywgbG9jYXRpb25zLCBzaXplb2YobG9jYXRpb25zKSk7CisKKyAgICAgICAgZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgeyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH0sCisgICAgICAgICAgICAgICAgICAgIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIGhlbHBlci0+YWRkU3RydWN0RGVzY3JpcHRvcnM8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+KCk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckluZm8sIEMyX1BBUkFNS0VZX0NPREVEX0NPTE9SX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKGRlZmF1bHRDb2xvckluZm8pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRGVmYXVsdENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmb3JtYXRzPworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBpeGVsRm9ybWF0LCBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heFBpY3R1cmVTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuIGhhcmRjb2RpbmcKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDIwNDh1KTsKKyAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDIwNDh1KTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heElucHV0U2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWF4U2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gYXNzdW1lIGNvbXByZXNzaW9uIHJhdGlvIG9mIDIKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAoKChtYXhTaXplLnYud2lkdGggKyA2MykgLyA2NCkgKiAoKG1heFNpemUudi5oZWlnaHQgKyA2MykgLyA2NCkgKiAzMDcyKTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXNpemU7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IGdldERlZmF1bHRDb2xvckFzcGVjdHNfbCgpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0Q29sb3JBc3BlY3RzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgSGRyMTBQbHVzSW5mb0lucHV0U2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUhkcjEwUGx1c0luZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEhkcjEwUGx1c0luZm9PdXRwdXRTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+IG1NYXhTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbU1heElucHV0U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gbUNvbG9ySW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyNpZmRlZiBWUDkKKyNpZiAwCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PiBtSGRyU3RhdGljSW5mbzsKKyNlbmRpZgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUhkcjEwUGx1c0luZm86OmlucHV0PiBtSGRyMTBQbHVzSW5mb0lucHV0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dD4gbUhkcjEwUGx1c0luZm9PdXRwdXQ7CisjZW5kaWYKK307CisKK0MyU29mdFZweERlYzo6QzJTb2Z0VnB4RGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1Db2RlY0N0eChudWxscHRyKSB7Cit9CisKK0MyU29mdFZweERlYzo6fkMyU29mdFZweERlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6b25TdG9wKCkgeworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRWcHhEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gb25GbHVzaF9zbSgpOworICAgIGlmIChlcnIgIT0gQzJfT0spCisgICAgeworICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGZsdXNoIGRlY29kZXIuIFRyeSB0byBoYXJkIHJlc2V0IGRlY29kZXIiKTsKKyAgICAgICAgZGVzdHJveURlY29kZXIoKTsKKyAgICAgICAgKHZvaWQpaW5pdERlY29kZXIoKTsKKyAgICB9Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RGVjOjpvblJlbGVhc2UoKSB7CisgICAgZGVzdHJveURlY29kZXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChtRnJhbWVQYXJhbGxlbE1vZGUpIHsKKyAgICAgICAgLy8gRmx1c2ggZGVjb2RlciBieSBwYXNzaW5nIG51bGxwdHIgZGF0YSBwdHIgYW5kIDAgc2l6ZS4KKyAgICAgICAgLy8gSWRlYWxseSwgdGhpcyBzaG91bGQgbmV2ZXIgZmFpbC4KKyAgICAgICAgaWYgKHZweF9jb2RlY19kZWNvZGUobUNvZGVjQ3R4LCBudWxscHRyLCAwLCBudWxscHRyLCAwKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmbHVzaCBvbjIgZGVjb2Rlci4iKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEcm9wIGFsbCB0aGUgZGVjb2RlZCBmcmFtZXMgaW4gZGVjb2Rlci4KKyAgICB2cHhfY29kZWNfaXRlcl90IGl0ZXIgPSBudWxscHRyOworICAgIHdoaWxlICh2cHhfY29kZWNfZ2V0X2ZyYW1lKG1Db2RlY0N0eCwgJml0ZXIpKSB7CisgICAgfQorCisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdGljIGludCBHZXRDUFVDb3JlQ291bnQoKSB7CisgICAgaW50IGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gY3B1Q29yZUNvdW50OworfQorCitzdGF0dXNfdCBDMlNvZnRWcHhEZWM6OmluaXREZWNvZGVyKCkgeworI2lmZGVmIFZQOQorICAgIG1Nb2RlID0gTU9ERV9WUDk7CisjZWxzZQorICAgIG1Nb2RlID0gTU9ERV9WUDg7CisjZW5kaWYKKworICAgIG1XaWR0aCA9IDMyMDsKKyAgICBtSGVpZ2h0ID0gMjQwOworICAgIG1GcmFtZVBhcmFsbGVsTW9kZSA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIGlmICghbUNvZGVjQ3R4KSB7CisgICAgICAgIG1Db2RlY0N0eCA9IG5ldyB2cHhfY29kZWNfY3R4X3Q7CisgICAgfQorICAgIGlmICghbUNvZGVjQ3R4KSB7CisgICAgICAgIEFMT0dFKCJtQ29kZWNDdHggaXMgbnVsbCIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIHZweF9jb2RlY19kZWNfY2ZnX3QgY2ZnOworICAgIG1lbXNldCgmY2ZnLCAwLCBzaXplb2YodnB4X2NvZGVjX2RlY19jZmdfdCkpOworICAgIGNmZy50aHJlYWRzID0gR2V0Q1BVQ29yZUNvdW50KCk7CisKKyAgICB2cHhfY29kZWNfZmxhZ3NfdCBmbGFnczsKKyAgICBtZW1zZXQoJmZsYWdzLCAwLCBzaXplb2YodnB4X2NvZGVjX2ZsYWdzX3QpKTsKKyAgICBpZiAobUZyYW1lUGFyYWxsZWxNb2RlKSBmbGFncyB8PSBWUFhfQ09ERUNfVVNFX0ZSQU1FX1RIUkVBRElORzsKKworICAgIHZweF9jb2RlY19lcnJfdCB2cHhfZXJyOworICAgIGlmICgodnB4X2VyciA9IHZweF9jb2RlY19kZWNfaW5pdCgKKyAgICAgICAgICAgICAgICAgbUNvZGVjQ3R4LCBtTW9kZSA9PSBNT0RFX1ZQOCA/ICZ2cHhfY29kZWNfdnA4X2R4X2FsZ28gOiAmdnB4X2NvZGVjX3ZwOV9keF9hbGdvLAorICAgICAgICAgICAgICAgICAmY2ZnLCBmbGFncykpKSB7CisgICAgICAgIEFMT0dFKCJvbjIgZGVjb2RlciBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4gKCVkKSIsIHZweF9lcnIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdFZweERlYzo6ZGVzdHJveURlY29kZXIoKSB7CisgICAgaWYgIChtQ29kZWNDdHgpIHsKKyAgICAgICAgdnB4X2NvZGVjX2Rlc3Ryb3kobUNvZGVjQ3R4KTsKKyAgICAgICAgZGVsZXRlIG1Db2RlY0N0eDsKKyAgICAgICAgbUNvZGVjQ3R4ID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRWcHhEZWM6OmZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2spIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChtV2lkdGgsIG1IZWlnaHQpKTsKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlciwgaW5kZXgsIGludGYgPSB0aGlzLT5tSW50Zl0oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIGlmICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAmJgorICAgICAgICAgICAgICAgIChjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiAmcGFyYW06IHdvcmstPmlucHV0LmNvbmZpZ1VwZGF0ZSkgeworICAgICAgICAgICAgaWYgKHBhcmFtKSB7CisgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dCAqaGRyMTBQbHVzSW5mbyA9CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbUhkcjEwUGx1c0luZm86OmlucHV0OjpGcm9tKHBhcmFtLmdldCgpKTsKKworICAgICAgICAgICAgICAgIGlmIChoZHIxMFBsdXNJbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gb3V0UGFyYW0gPSBDMlBhcmFtOjpDb3B5QXNTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhcmFtLmdldCgpLCB0cnVlIC8qb3V0cHV0Ki8sIHBhcmFtLT5zdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IGludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG91dFBhcmFtLmdldCgpIH0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoKm91dFBhcmFtLmdldCgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZmluaXNoV29yazogQ29uZmlnIHVwZGF0ZSBzaXplIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisgICAgaWYgKHdvcmsgJiYgYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2goaW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGNvZGVjQ29uZmlnID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0wKTsKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisKKyAgICAvLyBTb2Z0d2FyZSBWUDkgRGVjb2RlciBkb2VzIG5vdCBuZWVkIHRoZSBDb2RlYyBTcGVjaWZpYyBEYXRhIChDU0QpCisgICAgLy8gKHNwZWNpZmllZCBpbiBodHRwOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy92cDkvcHJvZmlsZXMvKS4gSWdub3JlIGl0IGlmCisgICAgLy8gaXQgd2FzIHBhc3NlZC4KKyAgICBpZiAoY29kZWNDb25maWcpIHsKKyAgICAgICAgLy8gSWdub3JlIENTRCBidWZmZXIgZm9yIFZQOS4KKyAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfVlA5KSB7CisgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVG9sZXJhdGUgdGhlIENTRCBidWZmZXIgZm9yIFZQOC4gVGhpcyBpcyBhIHdvcmthcm91bmQKKyAgICAgICAgICAgIC8vIGZvciBiLzI4Njg5NTM2LiBjb250aW51ZQorICAgICAgICAgICAgQUxPR1coIldBUk5JTkc6IEdvdCBDU0QgYnVmZmVyIGZvciBWUDguIENvbnRpbnVlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQ2NF90IGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla2xsKCk7CisKKyAgICBpZiAoaW5TaXplKSB7CisgICAgICAgIHVpbnQ4X3QgKmJpdHN0cmVhbSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgICAgIHZweF9jb2RlY19lcnJfdCBlcnIgPSB2cHhfY29kZWNfZGVjb2RlKAorICAgICAgICAgICAgICAgIG1Db2RlY0N0eCwgYml0c3RyZWFtLCBpblNpemUsICZmcmFtZUluZGV4LCAwKTsKKyAgICAgICAgaWYgKGVyciAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJvbjIgZGVjb2RlciBmYWlsZWQgdG8gZGVjb2RlIGZyYW1lLiBlcnI6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgKHZvaWQpb3V0cHV0QnVmZmVyKHBvb2wsIHdvcmspOworCisgICAgaWYgKGVvcykgeworICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoIWluU2l6ZSkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSwgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwKKyAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgeworICAgIHNpemVfdCBkc3RZU3RyaWRlID0gYWxpZ24od2lkdGgsIDE2KTsKKyAgICBzaXplX3QgZHN0VVZTdHJpZGUgPSBhbGlnbihkc3RZU3RyaWRlIC8gMiwgMTYpOworICAgIHVpbnQ4X3QgKmRzdFN0YXJ0ID0gZHN0OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjWSwgd2lkdGgpOworICAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFlTdHJpZGU7CisgICAgfQorCisgICAgZHN0ID0gZHN0U3RhcnQgKyBkc3RZU3RyaWRlICogaGVpZ2h0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmNWLCB3aWR0aCAvIDIpOworICAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KKworICAgIGRzdCA9IGRzdFN0YXJ0ICsgKGRzdFlTdHJpZGUgKiBoZWlnaHQpICsgKGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1UsIHdpZHRoIC8gMik7CisgICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAodWludDMyX3QgKmRzdCwKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKKyAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKKyAgICAgICAgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7CisKKyAgICAvLyBDb252ZXJ0aW5nIHR3byBsaW5lcyBhdCBhIHRpbWUsIHNsaWdodGx5IGZhc3RlcgorICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IDIpIHsKKyAgICAgICAgdWludDMyX3QgKmRzdFRvcCA9ICh1aW50MzJfdCAqKSBkc3Q7CisgICAgICAgIHVpbnQzMl90ICpkc3RCb3QgPSAodWludDMyX3QgKikgKGRzdCArIGRzdFN0cmlkZSk7CisgICAgICAgIHVpbnQxNl90ICp5U3JjVG9wID0gKHVpbnQxNl90Kikgc3JjWTsKKyAgICAgICAgdWludDE2X3QgKnlTcmNCb3QgPSAodWludDE2X3QqKSAoc3JjWSArIHNyY1lTdHJpZGUpOworICAgICAgICB1aW50MTZfdCAqdVNyYyA9ICh1aW50MTZfdCopIHNyY1U7CisgICAgICAgIHVpbnQxNl90ICp2U3JjID0gKHVpbnQxNl90Kikgc3JjVjsKKworICAgICAgICB1aW50MzJfdCB1MDEsIHYwMSwgeTAxLCB5MjMsIHk0NSwgeTY3LCB1djAsIHV2MTsKKyAgICAgICAgc2l6ZV90IHggPSAwOworICAgICAgICBmb3IgKDsgeCA8IHdpZHRoIC0gMzsgeCArPSA0KSB7CisKKyAgICAgICAgICAgIHUwMSA9ICooKHVpbnQzMl90Kil1U3JjKTsgdVNyYyArPSAyOworICAgICAgICAgICAgdjAxID0gKigodWludDMyX3QqKXZTcmMpOyB2U3JjICs9IDI7CisKKyAgICAgICAgICAgIHkwMSA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsgeVNyY1RvcCArPSAyOworICAgICAgICAgICAgeTIzID0gKigodWludDMyX3QqKXlTcmNUb3ApOyB5U3JjVG9wICs9IDI7CisgICAgICAgICAgICB5NDUgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7IHlTcmNCb3QgKz0gMjsKKyAgICAgICAgICAgIHk2NyA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsgeVNyY0JvdCArPSAyOworCisgICAgICAgICAgICB1djAgPSAodTAxICYgMHgzRkYpIHwgKCh2MDEgJiAweDNGRikgPDwgMjApOworICAgICAgICAgICAgdXYxID0gKHUwMSA+PiAxNikgfCAoKHYwMSA+PiAxNikgPDwgMjApOworCisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MDEgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTAxID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MjMgJiAweDNGRikgPDwgMTApIHwgdXYxOworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTIzID4+IDE2KSA8PCAxMCkgfCB1djE7CisKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk0NSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NDUgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk2NyAmIDB4M0ZGKSA8PCAxMCkgfCB1djE7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NjcgPj4gMTYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZXJlIHNob3VsZCBiZSBhdCBtb3N0IDIgbW9yZSBwaXhlbHMgdG8gcHJvY2Vzcy4gTm90ZSB0aGF0IHdlIGRvbid0CisgICAgICAgIC8vIG5lZWQgdG8gY29uc2lkZXIgb2RkIGNhc2UgYXMgdGhlIGJ1ZmZlciBpcyBhbHdheXMgYWxpZ25lZCB0byBldmVuLgorICAgICAgICBpZiAoeCA8IHdpZHRoKSB7CisgICAgICAgICAgICB1MDEgPSAqdVNyYzsKKyAgICAgICAgICAgIHYwMSA9ICp2U3JjOworICAgICAgICAgICAgeTAxID0gKigodWludDMyX3QqKXlTcmNUb3ApOworICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QqKXlTcmNCb3QpOworICAgICAgICAgICAgdXYwID0gKHUwMSAmIDB4M0ZGKSB8ICgodjAxICYgMHgzRkYpIDw8IDIwKTsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9ICgoeTAxID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAoKHk0NSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAoKHk0NSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICB9CisKKyAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlICogMjsKKyAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3RTdHJpZGUgKiAyOworICAgIH0KKworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIodWludDhfdCAqZHN0LAorICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLAorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgICAgICBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKKworICAgIHVpbnQ4X3QgKmRzdFkgPSAodWludDhfdCAqKWRzdDsKKyAgICBzaXplX3QgZHN0WVNpemUgPSBkc3RTdHJpZGUgKiBoZWlnaHQ7CisgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gYWxpZ24oZHN0U3RyaWRlIC8gMiwgMTYpOworICAgIHNpemVfdCBkc3RVVlNpemUgPSBkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDI7CisgICAgdWludDhfdCAqZHN0ViA9IGRzdFkgKyBkc3RZU2l6ZTsKKyAgICB1aW50OF90ICpkc3RVID0gZHN0ViArIGRzdFVWU2l6ZTsKKworICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgICAgICAgICBkc3RZW3hdID0gKHVpbnQ4X3QpKHNyY1lbeF0gPj4gMik7CisgICAgICAgIH0KKworICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7CisgICAgICAgIGRzdFkgKz0gZHN0U3RyaWRlOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgKGhlaWdodCArIDEpIC8gMjsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgKHdpZHRoICsgMSkgLyAyOyArK3gpIHsKKyAgICAgICAgICAgIGRzdFVbeF0gPSAodWludDhfdCkoc3JjVVt4XSA+PiAyKTsKKyAgICAgICAgICAgIGRzdFZbeF0gPSAodWludDhfdCkoc3JjVlt4XSA+PiAyKTsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOworICAgICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOworICAgIH0KKyAgICByZXR1cm47Cit9Citib29sIEMyU29mdFZweERlYzo6b3V0cHV0QnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykKK3sKKyAgICBpZiAoISh3b3JrICYmIHBvb2wpKSByZXR1cm4gZmFsc2U7CisKKyAgICB2cHhfY29kZWNfaXRlcl90IGl0ZXIgPSBudWxscHRyOworICAgIHZweF9pbWFnZV90ICppbWcgPSB2cHhfY29kZWNfZ2V0X2ZyYW1lKG1Db2RlY0N0eCwgJml0ZXIpOworCisgICAgaWYgKCFpbWcpIHJldHVybiBmYWxzZTsKKworICAgIGlmIChpbWctPmRfdyAhPSBtV2lkdGggfHwgaW1nLT5kX2ggIT0gbUhlaWdodCkgeworICAgICAgICBtV2lkdGggPSBpbWctPmRfdzsKKyAgICAgICAgbUhlaWdodCA9IGltZy0+ZF9oOworCisgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIHVwZGF0ZSBzaXplIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgIH0KKyAgICBDSEVDSyhpbWctPmZtdCA9PSBWUFhfSU1HX0ZNVF9JNDIwIHx8IGltZy0+Zm10ID09IFZQWF9JTUdfRk1UX0k0MjAxNik7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOworICAgIHVpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICBpZiAoaW1nLT5mbXQgPT0gVlBYX0lNR19GTVRfSTQyMDE2KSB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gZGVmYXVsdENvbG9yQXNwZWN0cyA9IG1JbnRmLT5nZXREZWZhdWx0Q29sb3JBc3BlY3RzX2woKTsKKworICAgICAgICBpZiAoZGVmYXVsdENvbG9yQXNwZWN0cy0+cHJpbWFyaWVzID09IEMyQ29sb3I6OlBSSU1BUklFU19CVDIwMjAgJiYKKyAgICAgICAgICAgIGRlZmF1bHRDb2xvckFzcGVjdHMtPm1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwICYmCisgICAgICAgICAgICBkZWZhdWx0Q29sb3JBc3BlY3RzLT50cmFuc2ZlciA9PSBDMkNvbG9yOjpUUkFOU0ZFUl9TVDIwODQpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyOworICAgICAgICB9CisgICAgfQorICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhhbGlnbihtV2lkdGgsIDE2KSwgbUhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCksIG91dCBmcmFtZWluZGV4ICVkIiwKKyAgICAgICAgICAgYmxvY2stPndpZHRoKCksIGJsb2NrLT5oZWlnaHQoKSwgbVdpZHRoLCBtSGVpZ2h0LCAoaW50KSooaW50NjRfdCAqKWltZy0+dXNlcl9wcml2KTsKKworICAgIHVpbnQ4X3QgKmRzdCA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICBzaXplX3Qgc3JjWVN0cmlkZSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9ZXTsKKyAgICBzaXplX3Qgc3JjVVN0cmlkZSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9VXTsKKyAgICBzaXplX3Qgc3JjVlN0cmlkZSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9WXTsKKworICAgIGlmIChpbWctPmZtdCA9PSBWUFhfSU1HX0ZNVF9JNDIwMTYpIHsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1kgPSAoY29uc3QgdWludDE2X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfWV07CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNVID0gKGNvbnN0IHVpbnQxNl90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1VdOworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjViA9IChjb25zdCB1aW50MTZfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9WXTsKKworICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyKSB7CisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAoKHVpbnQzMl90ICopZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduKG1XaWR0aCwgMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbihtV2lkdGgsIDE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfWV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9VXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjViA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ZdOworICAgICAgICBjb3B5T3V0cHV0QnVmZmVyVG9ZVjEyRnJhbWUoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlLCBtV2lkdGgsIG1IZWlnaHQpOworICAgIH0KKyAgICBmaW5pc2hXb3JrKCooaW50NjRfdCAqKWltZy0+dXNlcl9wcml2LCB3b3JrLCBzdGQ6Om1vdmUoYmxvY2spKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RGVjOjpkcmFpbkludGVybmFsKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHdoaWxlICgob3V0cHV0QnVmZmVyKHBvb2wsIHdvcmspKSkgeworICAgIH0KKworICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TICYmCisgICAgICAgICAgICB3b3JrICYmIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID09IDB1KSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworY2xhc3MgQzJTb2Z0VnB4RmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFZweEZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0VnB4RGVjKENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdFZweERlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZweERlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0VnB4RmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0VnB4RmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBjODQ4NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfVlBYX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfVlBYX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCisjaW5jbHVkZSAidnB4L3ZweF9kZWNvZGVyLmgiCisjaW5jbHVkZSAidnB4L3ZwOGR4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdFZweERlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRWcHhEZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0VnB4RGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIE1PREVfVlA4LAorICAgICAgICBNT0RFX1ZQOSwKKyAgICB9IG1Nb2RlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICB2cHhfY29kZWNfY3R4X3QgKm1Db2RlY0N0eDsKKyAgICBib29sIG1GcmFtZVBhcmFsbGVsTW9kZTsgIC8vIEZyYW1lIHBhcmFsbGVsIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IFZQOSBkZWNvZGVyLgorCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBkZXN0cm95RGVjb2RlcigpOworICAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKTsKKyAgICBib29sIG91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRWcHhEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfVlBYX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTA5YTg4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5jcHAKQEAgLTAsMCArMSw2NzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0VnB4RW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorCisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSAiQzJTb2Z0VnB4RW5jLmgiCisKKyNpZm5kZWYgSU5UMzJfTUFYCisjZGVmaW5lIElOVDMyX01BWCAgIDIxNDc0ODM2NDcKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZiAwCitzdGF0aWMgc2l6ZV90IGdldENwdUNvcmVDb3VudCgpIHsKKyAgICBsb25nIGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVsZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OworfQorI2VuZGlmCisKK0MyU29mdFZweEVuYzo6QzJTb2Z0VnB4RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1Db2RlY0NvbnRleHQobnVsbHB0ciksCisgICAgICBtQ29kZWNDb25maWd1cmF0aW9uKG51bGxwdHIpLAorICAgICAgbUNvZGVjSW50ZXJmYWNlKG51bGxwdHIpLAorICAgICAgbVN0cmlkZUFsaWduKDIpLAorICAgICAgbUNvbG9yRm9ybWF0KFZQWF9JTUdfRk1UX0k0MjApLAorICAgICAgbUJpdHJhdGVDb250cm9sTW9kZShWUFhfVkJSKSwKKyAgICAgIG1FcnJvclJlc2lsaWVuY2UoZmFsc2UpLAorICAgICAgbU1pblF1YW50aXplcigwKSwKKyAgICAgIG1NYXhRdWFudGl6ZXIoMCksCisgICAgICBtVGVtcG9yYWxMYXllcnMoMCksCisgICAgICBtVGVtcG9yYWxQYXR0ZXJuVHlwZShWUFhUZW1wb3JhbExheWVyUGF0dGVybk5vbmUpLAorICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCgwKSwKKyAgICAgIG1UZW1wb3JhbFBhdHRlcm5JZHgoMCksCisgICAgICBtTGFzdFRpbWVzdGFtcCgweDdGRkZGRkZGRkZGRkZGRkZ1bGwpLAorICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyhmYWxzZSksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpIHsKKyAgICBtZW1zZXQobVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8sIDAsIHNpemVvZihtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbykpOworICAgIG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvWzBdID0gMTAwOworfQorCitDMlNvZnRWcHhFbmM6On5DMlNvZnRWcHhFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweEVuYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXRFbmNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCit2b2lkIEMyU29mdFZweEVuYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtQ29kZWNDb250ZXh0KSB7CisgICAgICAgIHZweF9jb2RlY19kZXN0cm95KG1Db2RlY0NvbnRleHQpOworICAgICAgICBkZWxldGUgbUNvZGVjQ29udGV4dDsKKyAgICAgICAgbUNvZGVjQ29udGV4dCA9IG51bGxwdHI7CisgICAgfQorCisgICAgaWYgKG1Db2RlY0NvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgZGVsZXRlIG1Db2RlY0NvbmZpZ3VyYXRpb247CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24gPSBudWxscHRyOworICAgIH0KKworICAgIC8vIHRoaXMgb25lIGlzIG5vdCBhbGxvY2F0ZWQgYnkgdXMKKyAgICBtQ29kZWNJbnRlcmZhY2UgPSBudWxscHRyOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhFbmM6Om9uU3RvcCgpIHsKKyAgICBvblJlbGVhc2UoKTsKKyAgICBtTGFzdFRpbWVzdGFtcCA9IDB4N0ZGRkZGRkZGRkZGRkZGRkxMOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RW5jOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0dXNfdCBDMlNvZnRWcHhFbmM6OmluaXRFbmNvZGVyKCkgeworICAgIHZweF9jb2RlY19lcnJfdCBjb2RlY19yZXR1cm47CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gVU5LTk9XTl9FUlJPUjsKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBtU2l6ZSA9IG1JbnRmLT5nZXRTaXplX2woKTsKKyAgICAgICAgbUJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIG1CaXRyYXRlTW9kZSA9IG1JbnRmLT5nZXRCaXRyYXRlTW9kZV9sKCk7CisgICAgICAgIG1GcmFtZVJhdGUgPSBtSW50Zi0+Z2V0RnJhbWVSYXRlX2woKTsKKyAgICAgICAgbUludHJhUmVmcmVzaCA9IG1JbnRmLT5nZXRJbnRyYVJlZnJlc2hfbCgpOworICAgICAgICBtUmVxdWVzdFN5bmMgPSBtSW50Zi0+Z2V0UmVxdWVzdFN5bmNfbCgpOworICAgICAgICBtVGVtcG9yYWxMYXllcnMgPSBtSW50Zi0+Z2V0VGVtcG9yYWxMYXllcnNfbCgpLT5tLmxheWVyQ291bnQ7CisgICAgfQorCisgICAgc3dpdGNoIChtQml0cmF0ZU1vZGUtPnZhbHVlKSB7CisgICAgICAgIGNhc2UgQzJDb25maWc6OkJJVFJBVEVfVkFSSUFCTEU6CisgICAgICAgICAgICBtQml0cmF0ZUNvbnRyb2xNb2RlID0gVlBYX1ZCUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29uZmlnOjpCSVRSQVRFX0NPTlNUOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbUJpdHJhdGVDb250cm9sTW9kZSA9IFZQWF9DQlI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc2V0Q29kZWNTcGVjaWZpY0ludGVyZmFjZSgpOworICAgIGlmICghbUNvZGVjSW50ZXJmYWNlKSBnb3RvIENsZWFuVXA7CisKKyAgICBBTE9HRCgiVlB4OiBpbml0RW5jb2Rlci4gQlJNb2RlOiAldS4gVFNMYXllcnM6ICV6dS4gS0Y6ICV1LiBRUDogJXUgLSAldSIsCisgICAgICAgICAgKHVpbnQzMl90KW1CaXRyYXRlQ29udHJvbE1vZGUsIG1UZW1wb3JhbExheWVycywgbUludGYtPmdldFN5bmNGcmFtZVBlcmlvZCgpLAorICAgICAgICAgIG1NaW5RdWFudGl6ZXIsIG1NYXhRdWFudGl6ZXIpOworCisgICAgbUNvZGVjQ29uZmlndXJhdGlvbiA9IG5ldyB2cHhfY29kZWNfZW5jX2NmZ190OworICAgIGlmICghbUNvZGVjQ29uZmlndXJhdGlvbikgZ290byBDbGVhblVwOworICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19lbmNfY29uZmlnX2RlZmF1bHQobUNvZGVjSW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIGlmIChjb2RlY19yZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBwb3B1bGF0aW5nIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgdnB4IGVuY29kZXIuIik7CisgICAgICAgIGdvdG8gQ2xlYW5VcDsKKyAgICB9CisKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3cgPSBtU2l6ZS0+d2lkdGg7CisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19oID0gbVNpemUtPmhlaWdodDsKKyAgICAvL21Db2RlY0NvbmZpZ3VyYXRpb24tPmdfdGhyZWFkcyA9IGdldENwdUNvcmVDb3VudCgpOworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfdGhyZWFkcyA9IDA7CisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19lcnJvcl9yZXNpbGllbnQgPSBtRXJyb3JSZXNpbGllbmNlOworCisgICAgLy8gdGltZWJhc2UgdW5pdCBpcyBtaWNyb3NlY29uZAorICAgIC8vIGdfdGltZWJhc2UgaXMgaW4gc2Vjb25kcyAoaS5lLiAxLzEwMDAwMDAgc2Vjb25kcykKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3RpbWViYXNlLm51bSA9IDE7CisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z190aW1lYmFzZS5kZW4gPSAxMDAwMDAwOworICAgIC8vIHJjX3RhcmdldF9iaXRyYXRlIGlzIGluIGticHMsIG1CaXRyYXRlIGluIGJwcworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3RhcmdldF9iaXRyYXRlID0gKG1CaXRyYXRlLT52YWx1ZSArIDUwMCkgLyAxMDAwOworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2VuZF91c2FnZSA9IG1CaXRyYXRlQ29udHJvbE1vZGU7CisgICAgLy8gRGlzYWJsZSBmcmFtZSBkcm9wIC0gbm90IGFsbG93ZWQgaW4gTWVkaWFDb2RlYyBub3cuCisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfZHJvcGZyYW1lX3RocmVzaCA9IDA7CisgICAgLy8gRGlzYWJsZSBsYWdnZWQgZW5jb2RpbmcuCisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19sYWdfaW5fZnJhbWVzID0gMDsKKyAgICBpZiAobUJpdHJhdGVDb250cm9sTW9kZSA9PSBWUFhfQ0JSKSB7CisgICAgICAgIC8vIERpc2FibGUgc3BhdGlhbCByZXNpemluZy4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfcmVzaXplX2FsbG93ZWQgPSAwOworICAgICAgICAvLyBTaW5nbGUtcGFzcyBtb2RlLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Bhc3MgPSBWUFhfUkNfT05FX1BBU1M7CisgICAgICAgIC8vIE1heGltdW0gYW1vdW50IG9mIGJpdHMgdGhhdCBjYW4gYmUgc3VidHJhY3RlZCBmcm9tIHRoZSB0YXJnZXQKKyAgICAgICAgLy8gYml0cmF0ZSAtIGV4cHJlc3NlZCBhcyBwZXJjZW50YWdlIG9mIHRoZSB0YXJnZXQgYml0cmF0ZS4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfdW5kZXJzaG9vdF9wY3QgPSAxMDA7CisgICAgICAgIC8vIE1heGltdW0gYW1vdW50IG9mIGJpdHMgdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIHRhcmdldAorICAgICAgICAvLyBiaXRyYXRlIC0gZXhwcmVzc2VkIGFzIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhcmdldCBiaXRyYXRlLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19vdmVyc2hvb3RfcGN0ID0gMTU7CisgICAgICAgIC8vIEluaXRpYWwgdmFsdWUgb2YgdGhlIGJ1ZmZlciBsZXZlbCBpbiBtcy4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfYnVmX2luaXRpYWxfc3ogPSA1MDA7CisgICAgICAgIC8vIEFtb3VudCBvZiBkYXRhIHRoYXQgdGhlIGVuY29kZXIgc2hvdWxkIHRyeSB0byBtYWludGFpbiBpbiBtcy4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfYnVmX29wdGltYWxfc3ogPSA2MDA7CisgICAgICAgIC8vIFRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IG1heSBiZSBidWZmZXJlZCBieSB0aGUgZGVjb2RpbmcKKyAgICAgICAgLy8gYXBwbGljYXRpb24gaW4gbXMuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2J1Zl9zeiA9IDEwMDA7CisgICAgICAgIC8vIEVuYWJsZSBlcnJvciByZXNpbGllbmNlIC0gbmVlZGVkIGZvciBwYWNrZXQgbG9zcy4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19lcnJvcl9yZXNpbGllbnQgPSAxOworICAgICAgICAvLyBNYXhpbXVtIGtleSBmcmFtZSBpbnRlcnZhbCAtIGZvciBDQlIgYm9vc3QgdG8gMzAwMAorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9tYXhfZGlzdCA9IDMwMDA7CisgICAgICAgIC8vIEVuY29kZXIgZGV0ZXJtaW5lcyBvcHRpbWFsIGtleSBmcmFtZSBwbGFjZW1lbnQgYXV0b21hdGljYWxseS4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbW9kZSA9IFZQWF9LRl9BVVRPOworICAgIH0KKworICAgIC8vIEZyYW1lcyB0ZW1wb3JhbCBwYXR0ZXJuIC0gZm9yIG5vdyBXZWJSVEMgbGlrZSBwYXR0ZXJuIGlzIG9ubHkgc3VwcG9ydGVkLgorICAgIHN3aXRjaCAobVRlbXBvcmFsTGF5ZXJzKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX251bWJlcl9sYXllcnMgPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMF0gPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcGVyaW9kaWNpdHkgPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMF0gPSAwOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblswXSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbGw7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzFdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3BlcmlvZGljaXR5ID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzBdID0gMDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzFdID0gMTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0QW5kR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsxXSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsyXSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzNdID0ga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls0XSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzVdID0ga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls2XSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzddID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX251bWJlcl9sYXllcnMgPSAzOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMF0gPSA0OworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMV0gPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcmF0ZV9kZWNpbWF0b3JbMl0gPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfcGVyaW9kaWNpdHkgPSA0OworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMF0gPSAwOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMV0gPSAyOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbMl0gPSAxOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbGF5ZXJfaWRbM10gPSAyOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblswXSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzFdID0ga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsyXSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblszXSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmU7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzRdID0ga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNV0gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls2XSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bN10gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJXcm9uZyBudW1iZXIgb2YgdGVtcG9yYWwgbGF5ZXJzICV6dSIsIG1UZW1wb3JhbExheWVycyk7CisgICAgICAgICAgICBnb3RvIENsZWFuVXA7CisgICAgfQorICAgIC8vIFNldCBiaXRyYXRlIHZhbHVlcyBmb3IgZWFjaCBsYXllcgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbnVtYmVyX2xheWVyczsgaSsrKSB7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3RhcmdldF9iaXRyYXRlW2ldID0KKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3RhcmdldF9iaXRyYXRlICoKKyAgICAgICAgICAgIG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvW2ldIC8gMTAwOworICAgIH0KKyAgICBpZiAobUludGYtPmdldFN5bmNGcmFtZVBlcmlvZCgpID49IDApIHsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbWF4X2Rpc3QgPSBtSW50Zi0+Z2V0U3luY0ZyYW1lUGVyaW9kKCk7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21pbl9kaXN0ID0gbUludGYtPmdldFN5bmNGcmFtZVBlcmlvZCgpOworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9tb2RlID0gVlBYX0tGX0FVVE87CisgICAgfQorICAgIGlmIChtTWluUXVhbnRpemVyID4gMCkgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19taW5fcXVhbnRpemVyID0gbU1pblF1YW50aXplcjsKKyAgICB9CisgICAgaWYgKG1NYXhRdWFudGl6ZXIgPiAwKSB7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX21heF9xdWFudGl6ZXIgPSBtTWF4UXVhbnRpemVyOworICAgIH0KKyAgICBzZXRDb2RlY1NwZWNpZmljQ29uZmlndXJhdGlvbigpOworICAgIG1Db2RlY0NvbnRleHQgPSBuZXcgdnB4X2NvZGVjX2N0eF90OworICAgIGlmICghbUNvZGVjQ29udGV4dCkgZ290byBDbGVhblVwOworICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19lbmNfaW5pdChtQ29kZWNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgLy8gZmxhZ3MKKyAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW5pdGlhbGl6aW5nIHZweCBlbmNvZGVyIik7CisgICAgICAgIGdvdG8gQ2xlYW5VcDsKKyAgICB9CisKKyAgICAvLyBFeHRyYSBDQlIgc2V0dGluZ3MKKyAgICBpZiAobUJpdHJhdGVDb250cm9sTW9kZSA9PSBWUFhfQ0JSKSB7CisgICAgICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVfU0VUX1NUQVRJQ19USFJFU0hPTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICBpZiAoY29kZWNfcmV0dXJuID09IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgdWludDMyX3QgcmNfbWF4X2ludHJhX3RhcmdldCA9CisgICAgICAgICAgICAgICAgKHVpbnQzMl90KShtQ29kZWNDb25maWd1cmF0aW9uLT5yY19idWZfb3B0aW1hbF9zeiAqIG1GcmFtZVJhdGUtPnZhbHVlIC8gMjAgKyAwLjUpOworICAgICAgICAgICAgLy8gRG9uJ3QgZ28gYmVsb3cgMyB0aW1lcyBwZXIgZnJhbWUgYmFuZHdpZHRoLgorICAgICAgICAgICAgaWYgKHJjX21heF9pbnRyYV90YXJnZXQgPCAzMDApIHsKKyAgICAgICAgICAgICAgICByY19tYXhfaW50cmFfdGFyZ2V0ID0gMzAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVfU0VUX01BWF9JTlRSQV9CSVRSQVRFX1BDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjX21heF9pbnRyYV90YXJnZXQpOworICAgICAgICB9CisgICAgICAgIGlmIChjb2RlY19yZXR1cm4gPT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4RV9TRVRfQ1BVVVNFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgY2JyIHBhcmFtZXRlcnMgZm9yIHZweCBlbmNvZGVyLiIpOworICAgICAgICAgICAgZ290byBDbGVhblVwOworICAgICAgICB9CisgICAgfQorCisgICAgY29kZWNfcmV0dXJuID0gc2V0Q29kZWNTcGVjaWZpY0NvbnRyb2xzKCk7CisgICAgaWYgKGNvZGVjX3JldHVybiAhPSBWUFhfQ09ERUNfT0spIGdvdG8gQ2xlYW5VcDsKKworICAgIHsKKyAgICAgICAgdWludDMyX3Qgd2lkdGggPSBtU2l6ZS0+d2lkdGg7CisgICAgICAgIHVpbnQzMl90IGhlaWdodCA9IG1TaXplLT5oZWlnaHQ7CisgICAgICAgIGlmICgoKHVpbnQ2NF90KXdpZHRoICogaGVpZ2h0KSA+CisgICAgICAgICAgICAoKHVpbnQ2NF90KUlOVDMyX01BWCAvIDMpKSB7CisgICAgICAgICAgICBBTE9HRSgiYi8yNTgxMjc5NCwgQnVmZmVyIHNpemUgaXMgdG9vIGJpZywgd2lkdGg9JXUsIGhlaWdodD0ldS4iLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmlkZSA9ICh3aWR0aCArIG1TdHJpZGVBbGlnbiAtIDEpICYgfihtU3RyaWRlQWxpZ24gLSAxKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHZzdHJpZGUgPSAoaGVpZ2h0ICsgbVN0cmlkZUFsaWduIC0gMSkgJiB+KG1TdHJpZGVBbGlnbiAtIDEpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXIgPSBNZW1vcnlCbG9jazo6QWxsb2NhdGUoc3RyaWRlICogdnN0cmlkZSAqIDMgLyAyKTsKKyAgICAgICAgICAgIGlmICghbUNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpbmcgY29udmVyc2lvbiBidWZmZXIgZmFpbGVkLiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtTnVtSW5wdXRGcmFtZXMgPSAtMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK0NsZWFuVXA6CisgICAgb25SZWxlYXNlKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordnB4X2VuY19mcmFtZV9mbGFnc190IEMyU29mdFZweEVuYzo6Z2V0RW5jb2RlRmxhZ3MoKSB7CisgICAgdnB4X2VuY19mcmFtZV9mbGFnc190IGZsYWdzID0gMDsKKyAgICBpZiAobVRlbXBvcmFsUGF0dGVybkxlbmd0aCA+IDApIHsKKyAgICAgIGludCBwYXR0ZXJuSWR4ID0gbVRlbXBvcmFsUGF0dGVybklkeCAlIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGg7CisgICAgICBtVGVtcG9yYWxQYXR0ZXJuSWR4Kys7CisgICAgICBzd2l0Y2ggKG1UZW1wb3JhbFBhdHRlcm5bcGF0dGVybklkeF0pIHsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUxhc3Q6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0FSRjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeToKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVBbHRyZWZXaXRob3V0RGVwZW5kZW5jeToKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZjoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkFsdHJlZjoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZU5vbmU6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfRU5UUk9QWTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVOb25lTm9SZWZHb2xkZW5SZWZBbHRSZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfRU5UUk9QWTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZjoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTGFzdEFuZEdvbGRlblJlZkFsdFJlZjoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsbDoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmxhZ3M7Cit9CisKKy8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBZVVYgaW5wdXQgY29sb3IgZm9ybWF0cworLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIFNWQywgQVJGLiBTVkMgYW5kIEFSRiByZXR1cm5zIG11bHRpcGxlIGZyYW1lcworLy8gKGhpZXJhcmNoaWNhbCAvIG5vc2hvdykgaW4gb25lIGNhbGwuIFRoZXNlIGZyYW1lcyBzaG91bGQgYmUgY29tYmluZWQgaW4gdG8KKy8vIGEgc2luZ2xlIGJ1ZmZlciBhbmQgc2VudCBiYWNrIHRvIHRoZSBjbGllbnQKK3ZvaWQgQzJTb2Z0VnB4RW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBJbml0aWFsaXplIGVuY29kZXIgaWYgbm90IGFscmVhZHkKKyAgICBpZiAoIW1Db2RlY0NvbnRleHQgJiYgT0sgIT0gaW5pdEVuY29kZXIoKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZW5jb2RlciIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gclZpZXc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBpbnB1dEJ1ZmZlcjsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBpbnB1dEJ1ZmZlciA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF07CisgICAgICAgIHJWaWV3ID0gc3RkOjptYWtlX3NoYXJlZDxjb25zdCBDMkdyYXBoaWNWaWV3PigKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKSk7CisgICAgICAgIGlmIChyVmlldy0+ZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZXJyID0gJWQiLCByVmlldy0+ZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiRW1wdHkgaW5wdXQgQnVmZmVyIik7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgaW5CdWZmZXIgPQorICAgICAgICBpbnB1dEJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpOworICAgIGlmIChpbkJ1ZmZlci53aWR0aCgpICE9IG1TaXplLT53aWR0aCB8fAorICAgICAgICBpbkJ1ZmZlci5oZWlnaHQoKSAhPSBtU2l6ZS0+aGVpZ2h0KSB7CisgICAgICAgIEFMT0dFKCJ1bmV4cGVjdGVkIElucHV0IGJ1ZmZlciBhdHRyaWJ1dGVzICVkKCVkKSB4ICVkKCVkKSIsCisgICAgICAgICAgICAgIGluQnVmZmVyLndpZHRoKCksIG1TaXplLT53aWR0aCwgaW5CdWZmZXIuaGVpZ2h0KCksCisgICAgICAgICAgICAgIG1TaXplLT5oZWlnaHQpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgdnB4X2ltYWdlX3QgcmF3X2ZyYW1lOworICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSByVmlldy0+bGF5b3V0KCk7CisgICAgdWludDMyX3Qgd2lkdGggPSByVmlldy0+d2lkdGgoKTsKKyAgICB1aW50MzJfdCBoZWlnaHQgPSByVmlldy0+aGVpZ2h0KCk7CisgICAgaWYgKHdpZHRoID4gMHg4MDAwIHx8IGhlaWdodCA+IDB4ODAwMCkgeworICAgICAgICBBTE9HRSgiSW1hZ2UgdG9vIGJpZzogJXUgeCAldSIsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdWludDMyX3Qgc3RyaWRlID0gKHdpZHRoICsgbVN0cmlkZUFsaWduIC0gMSkgJiB+KG1TdHJpZGVBbGlnbiAtIDEpOworICAgIHVpbnQzMl90IHZzdHJpZGUgPSAoaGVpZ2h0ICsgbVN0cmlkZUFsaWduIC0gMSkgJiB+KG1TdHJpZGVBbGlnbiAtIDEpOworICAgIHN3aXRjaCAobGF5b3V0LnR5cGUpIHsKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0I6CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCQTogeworICAgICAgICAgICAgQ29udmVydFJHQlRvUGxhbmFyWVVWKG1Db252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgc3RyaWRlLCB2c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyLnNpemUoKSwgKnJWaWV3LmdldCgpKTsKKyAgICAgICAgICAgIHZweF9pbWdfd3JhcCgmcmF3X2ZyYW1lLCBWUFhfSU1HX0ZNVF9JNDIwLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJpZGVBbGlnbiwgbUNvbnZlcnNpb25CdWZmZXIuZGF0YSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOiB7CisgICAgICAgICAgICBpZiAoIUlzWVVWNDIwKCpyVmlldykpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiaW5wdXQgaXMgbm90IFlVVjQyMCIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jb2xJbmMgPT0gMSkgeworICAgICAgICAgICAgICAgIC8vIEk0MjAgY29tcGF0aWJsZSAtIHRob3VnaCB3aXRoIGN1c3RvbSBvZmZzZXQgYW5kIHN0cmlkZQorICAgICAgICAgICAgICAgIHZweF9pbWdfd3JhcCgmcmF3X2ZyYW1lLCBWUFhfSU1HX0ZNVF9JNDIwLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyaWRlQWxpZ24sICh1aW50OF90KilyVmlldy0+ZGF0YSgpWzBdKTsKKyAgICAgICAgICAgICAgICByYXdfZnJhbWUucGxhbmVzWzFdID0gKHVpbnQ4X3QqKXJWaWV3LT5kYXRhKClbMV07CisgICAgICAgICAgICAgICAgcmF3X2ZyYW1lLnBsYW5lc1syXSA9ICh1aW50OF90KilyVmlldy0+ZGF0YSgpWzJdOworICAgICAgICAgICAgICAgIHJhd19mcmFtZS5zdHJpZGVbMF0gPSBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5yb3dJbmM7CisgICAgICAgICAgICAgICAgcmF3X2ZyYW1lLnN0cmlkZVsxXSA9IGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLnJvd0luYzsKKyAgICAgICAgICAgICAgICByYXdfZnJhbWUuc3RyaWRlWzJdID0gbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0ucm93SW5jOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBjb3B5IHRvIEk0MjAKKyAgICAgICAgICAgICAgICBNZWRpYUltYWdlMiBpbWcgPSBDcmVhdGVZVVY0MjBQbGFuYXJNZWRpYUltYWdlMih3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHZzdHJpZGUpOworICAgICAgICAgICAgICAgIGlmIChtQ29udmVyc2lvbkJ1ZmZlci5zaXplKCkgPj0gc3RyaWRlICogdnN0cmlkZSAqIDMgLyAyKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IEltYWdlQ29weShtQ29udmVyc2lvbkJ1ZmZlci5kYXRhKCksICZpbWcsICpyVmlldyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJCdWZmZXIgY29udmVyc2lvbiBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2cHhfaW1nX3dyYXAoJnJhd19mcmFtZSwgVlBYX0lNR19GTVRfSTQyMCwgc3RyaWRlLCB2c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmlkZUFsaWduLCAodWludDhfdCopclZpZXctPmRhdGEoKVswXSk7CisgICAgICAgICAgICAgICAgICAgIHZweF9pbWdfc2V0X3JlY3QoJnJhd19mcmFtZSwgMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvbnZlcnNpb24gYnVmZmVyIGlzIHRvbyBzbWFsbDogJXUgeCAldSBmb3IgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIHZzdHJpZGUsIG1Db252ZXJzaW9uQnVmZmVyLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5yZWNvZ25pemVkIHBsYW5lIHR5cGU6ICVkIiwgbGF5b3V0LnR5cGUpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZweF9lbmNfZnJhbWVfZmxhZ3NfdCBmbGFncyA9IGdldEVuY29kZUZsYWdzKCk7CisgICAgLy8gaGFuZGxlIGR5bmFtaWMgY29uZmlnIHBhcmFtZXRlcnMKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gaW50cmFSZWZyZXNoID0gbUludGYtPmdldEludHJhUmVmcmVzaF9sKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gcmVxdWVzdFN5bmMgPSBtSW50Zi0+Z2V0UmVxdWVzdFN5bmNfbCgpOworICAgICAgICBsb2NrLnVubG9jaygpOworCisgICAgICAgIGlmIChpbnRyYVJlZnJlc2ggIT0gbUludHJhUmVmcmVzaCkgeworICAgICAgICAgICAgbUludHJhUmVmcmVzaCA9IGludHJhUmVmcmVzaDsKKyAgICAgICAgICAgIEFMT0dWKCJHb3QgbUludHJhUmVmcmVzaCByZXF1ZXN0Iik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVxdWVzdFN5bmMgIT0gbVJlcXVlc3RTeW5jKSB7CisgICAgICAgICAgICAvLyB3ZSBjYW4gaGFuZGxlIElEUiBpbW1lZGlhdGVseQorICAgICAgICAgICAgaWYgKHJlcXVlc3RTeW5jLT52YWx1ZSkgeworICAgICAgICAgICAgICAgIC8vIHVuc2V0IHJlcXVlc3QKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dCBjbGVhclN5bmMoMHUsIEMyX0ZBTFNFKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgbUludGYtPmNvbmZpZyh7ICZjbGVhclN5bmMgfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIEFMT0dWKCJHb3Qgc3luYyByZXF1ZXN0Iik7CisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gVlBYX0VGTEFHX0ZPUkNFX0tGOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJlcXVlc3RTeW5jID0gcmVxdWVzdFN5bmM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYml0cmF0ZSAhPSBtQml0cmF0ZSkgeworICAgICAgICAgICAgbUJpdHJhdGUgPSBiaXRyYXRlOworICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfdGFyZ2V0X2JpdHJhdGUgPQorICAgICAgICAgICAgICAgIChtQml0cmF0ZS0+dmFsdWUgKyA1MDApIC8gMTAwMDsKKyAgICAgICAgICAgIHZweF9jb2RlY19lcnJfdCByZXMgPSB2cHhfY29kZWNfZW5jX2NvbmZpZ19zZXQobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBpZiAocmVzICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJ2cHggZW5jb2RlciBmYWlsZWQgdG8gdXBkYXRlIGJpdHJhdGU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICB2cHhfY29kZWNfZXJyX3RvX3N0cmluZyhyZXMpKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1aW50NjRfdCBpbnB1dFRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICB1aW50MzJfdCBmcmFtZUR1cmF0aW9uOworICAgIGlmIChpbnB1dFRpbWVTdGFtcCA+IG1MYXN0VGltZXN0YW1wKSB7CisgICAgICAgIGZyYW1lRHVyYXRpb24gPSAodWludDMyX3QpKGlucHV0VGltZVN0YW1wIC0gbUxhc3RUaW1lc3RhbXApOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVzZSBkZWZhdWx0IG9mIDMwIGZwcyBpbiBjYXNlIG9mIDAgZnJhbWUgcmF0ZS4KKyAgICAgICAgZmxvYXQgZnJhbWVSYXRlID0gbUZyYW1lUmF0ZS0+dmFsdWU7CisgICAgICAgIGlmIChmcmFtZVJhdGUgPCAwLjAwMSkgeworICAgICAgICAgICAgZnJhbWVSYXRlID0gMzA7CisgICAgICAgIH0KKyAgICAgICAgZnJhbWVEdXJhdGlvbiA9ICh1aW50MzJfdCkoMTAwMDAwMCAvIGZyYW1lUmF0ZSArIDAuNSk7CisgICAgfQorICAgIG1MYXN0VGltZXN0YW1wID0gaW5wdXRUaW1lU3RhbXA7CisKKyAgICB2cHhfY29kZWNfZXJyX3QgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2VuY29kZShtQ29kZWNDb250ZXh0LCAmcmF3X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VGltZVN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lRHVyYXRpb24sIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQWF9ETF9SRUFMVElNRSk7CisgICAgaWYgKGNvZGVjX3JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoInZweCBlbmNvZGVyIGZhaWxlZCB0byBlbmNvZGUgZnJhbWUiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBwb3B1bGF0ZWQgPSBmYWxzZTsKKyAgICB2cHhfY29kZWNfaXRlcl90IGVuY29kZWRfcGFja2V0X2l0ZXJhdG9yID0gbnVsbHB0cjsKKyAgICBjb25zdCB2cHhfY29kZWNfY3hfcGt0X3QqIGVuY29kZWRfcGFja2V0OworICAgIHdoaWxlICgoZW5jb2RlZF9wYWNrZXQgPSB2cHhfY29kZWNfZ2V0X2N4X2RhdGEoCisgICAgICAgICAgICAgICAgICAgIG1Db2RlY0NvbnRleHQsICZlbmNvZGVkX3BhY2tldF9pdGVyYXRvcikpKSB7CisgICAgICAgIGlmIChlbmNvZGVkX3BhY2tldC0+a2luZCA9PSBWUFhfQ09ERUNfQ1hfRlJBTUVfUEtUKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKGVuY29kZWRfcGFja2V0LT5kYXRhLmZyYW1lLnN6LCB1c2FnZSwgJmJsb2NrKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVtY3B5KHdWaWV3LmRhdGEoKSwgZW5jb2RlZF9wYWNrZXQtPmRhdGEuZnJhbWUuYnVmLCBlbmNvZGVkX3BhY2tldC0+ZGF0YS5mcmFtZS5zeik7CisgICAgICAgICAgICArK21OdW1JbnB1dEZyYW1lczsKKworICAgICAgICAgICAgQUxPR0QoImJ5dGVzIGdlbmVyYXRlZCAlenUiLCBlbmNvZGVkX3BhY2tldC0+ZGF0YS5mcmFtZS5zeik7CisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jayk7CisgICAgICAgICAgICBpZiAoZW5jb2RlZF9wYWNrZXQtPmRhdGEuZnJhbWUuZmxhZ3MgJiBWUFhfRlJBTUVfSVNfS0VZKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRJbmZvKHN0ZDo6bWFrZV9zaGFyZWQ8QzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUgLyogc3RyZWFtIGlkICovLCBDMkNvbmZpZzo6U1lOQ19GUkFNRSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBlbmNvZGVkX3BhY2tldC0+ZGF0YS5mcmFtZS5wdHM7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcG9wdWxhdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICghcG9wdWxhdGVkKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhFbmM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU5MWE0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuaApAQCAtMCwwICsxLDQzNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfVlBYX0VOQ19IX18KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1ZQWF9FTkNfSF9fCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJCdWZmZXJVdGlscy5oPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlICJ2cHgvdnB4X2VuY29kZXIuaCIKKyNpbmNsdWRlICJ2cHgvdnB4X2NvZGVjLmgiCisjaW5jbHVkZSAidnB4L3ZweF9pbWFnZS5oIgorI2luY2x1ZGUgInZweC92cDhjeC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFRPRE86IFRoZXNlIGRlZnMgdGFrZW4gZnJvbSBkZXByZWNhdGVkIE9NWF9WaWRlb0V4dC5oLiBNb3ZlIHRoZXNlIGRlZmluaXRpb25zCisvLyB0byBhIG5ldyBoZWFkZXIgZmlsZSBhbmQgaW5jbHVkZSBpdC4KKworLyoqIE1heGltdW0gbnVtYmVyIG9mIHRlbXBvcmFsIGxheWVycyAqLworI2RlZmluZSBNQVhURU1QT1JBTExBWUVSUyAzCisKKy8qKiB0ZW1wb3JhbCBsYXllciBwYXR0ZXJucyAqLwordHlwZWRlZiBlbnVtIFRlbXBvcmFsUGF0dGVyblR5cGUgeworICAgIFZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuTm9uZSA9IDAsCisgICAgVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEMgPSAxLAorICAgIFZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuTWF4ID0gMHg3RkZGRkZGRgorfSBUZW1wb3JhbFBhdHRlcm5UeXBlOworCisvLyBCYXNlIGNsYXNzIGZvciBhIFZQWCBFbmNvZGVyIENvbXBvbmVudAorLy8KKy8vIE9ubHkgZm9sbG93aW5nIGVuY29kZXIgc2V0dGluZ3MgYXJlIGF2YWlsYWJsZSAoY29kZWMgc3BlY2lmaWMgc2V0dGluZ3MgbWlnaHQKKy8vIGJlIGF2YWlsYWJsZSBpbiB0aGUgc3ViLWNsYXNzZXMpOgorLy8gICAgLSB2aWRlbyByZXNvbHV0aW9uCisvLyAgICAtIHRhcmdldCBiaXRyYXRlCisvLyAgICAtIHJhdGUgY29udHJvbCAoY29uc3RhbnQgLyB2YXJpYWJsZSkKKy8vICAgIC0gZnJhbWUgcmF0ZQorLy8gICAgLSBlcnJvciByZXNpbGllbmNlCisvLyAgICAtIHJlY29uc3RydWN0aW9uICYgbG9vcCBmaWx0ZXJzIChnX3Byb2ZpbGUpCisvLworLy8gT25seSBmb2xsb3dpbmcgY29sb3IgZm9ybWF0cyBhcmUgcmVjb2duaXplZAorLy8gICAgLSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0IKKy8vICAgIC0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCQQorLy8KKy8vIEZvbGxvd2luZyBzZXR0aW5ncyBhcmUgbm90IGNvbmZpZ3VyYWJsZSBieSB0aGUgY2xpZW50CisvLyAgICAtIGVuY29kaW5nIGRlYWRsaW5lIGlzIHJlYWx0aW1lCisvLyAgICAtIG11bHRpdGhyZWFkZWQgZW5jb2RpbmcgdXRpbGl6ZXMgYSBudW1iZXIgb2YgdGhyZWFkcyBlcXVhbAorLy8gdG8gb25saW5lIGNwdSdzIGF2YWlsYWJsZQorLy8gICAgLSB0aGUgYWxnb3JpdGhtIGludGVyZmFjZSBmb3IgZW5jb2RlciBpcyBkZWNpZGVkIGJ5IHRoZSBzdWItY2xhc3MgaW4gdXNlCisvLyAgICAtIGZyYWN0aW9uYWwgYml0cyBvZiBmcmFtZSByYXRlIGlzIGRpc2NhcmRlZAorLy8gICAgLSB0aW1lc3RhbXBzIGFyZSBpbiBtaWNyb3NlY29uZHMsIHRoZXJlZm9yZSBlbmNvZGVyIHRpbWViYXNlIGlzIGZpeGVkCisvLyB0byAxLzEwMDAwMDAKKworc3RydWN0IEMyU29mdFZweEVuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRWcHhFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGUgZmluYWw7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGUgZmluYWw7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGUgZmluYWw7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZSBmaW5hbDsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGUgZmluYWw7CisKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlIGZpbmFsOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGUgZmluYWw7CisKKyBwcm90ZWN0ZWQ6CisgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgIHZpcnR1YWwgfkMyU29mdFZweEVuYygpOworCisgICAgIC8vIEluaXRpYWxpemVzIHZweCBlbmNvZGVyIHdpdGggYXZhaWxhYmxlIHNldHRpbmdzLgorICAgICBzdGF0dXNfdCBpbml0RW5jb2RlcigpOworCisgICAgIC8vIFBvcHVsYXRlcyBtQ29kZWNJbnRlcmZhY2Ugd2l0aCBjb2RlYyBzcGVjaWZpYyBzZXR0aW5ncy4KKyAgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKSA9IDA7CisKKyAgICAgLy8gU2V0cyBjb2RlYyBzcGVjaWZpYyBjb25maWd1cmF0aW9uLgorICAgICB2aXJ0dWFsIHZvaWQgc2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKSA9IDA7CisKKyAgICAgLy8gU2V0cyBjb2RlYyBzcGVjaWZpYyBlbmNvZGVyIGNvbnRyb2xzLgorICAgICB2aXJ0dWFsIHZweF9jb2RlY19lcnJfdCBzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKSA9IDA7CisKKyAgICAgLy8gR2V0IGN1cnJlbnQgZW5jb2RlIGZsYWdzLgorICAgICB2aXJ0dWFsIHZweF9lbmNfZnJhbWVfZmxhZ3NfdCBnZXRFbmNvZGVGbGFncygpOworCisgICAgIGVudW0gVGVtcG9yYWxSZWZlcmVuY2VzIHsKKyAgICAgICAgIC8vIEZvciAxIGxheWVyIGNhc2U6IHJlZmVyZW5jZSBhbGwgKGxhc3QsIGdvbGRlbiwgYW5kIGFsdCByZWYpLCBidXQgb25seQorICAgICAgICAgLy8gdXBkYXRlIGxhc3QuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWxsID0gMTIsCisgICAgICAgICAvLyBGaXJzdCBiYXNlIGxheWVyIGZyYW1lIGZvciAzIHRlbXBvcmFsIGxheWVycywgd2hpY2ggdXBkYXRlcyBsYXN0IGFuZAorICAgICAgICAgLy8gZ29sZGVuIHdpdGggYWx0IHJlZiBkZXBlbmRlbmN5LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdEFuZEdvbGRlblJlZkFsdFJlZiA9IDExLAorICAgICAgICAgLy8gRmlyc3QgZW5oYW5jZW1lbnQgbGF5ZXIgd2l0aCBhbHQgcmVmIGRlcGVuZGVuY3kuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWYgPSAxMCwKKyAgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyIHdpdGggYWx0IHJlZiBkZXBlbmRlbmN5LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3lSZWZBbHRSZWYgPSA5LAorICAgICAgICAgLy8gQmFzZSBsYXllciB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWYgPSA4LAorICAgICAgICAgLy8gSGlnaGVzdCBlbmhhY2VtZW50IGxheWVyIHdpdGhvdXQgZGVwZW5kZW5jeSBvbiBnb2xkZW4gd2l0aCBhbHQgcmVmCisgICAgICAgICAvLyBkZXBlbmRlbmN5LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmR29sZGVuUmVmQWx0UmVmID0gNywKKyAgICAgICAgIC8vIFNlY29uZCBsYXllciBhbmQgbGFzdCBmcmFtZSBpbiBjeWNsZSwgZm9yIDIgbGF5ZXJzLgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmQWx0cmVmID0gNiwKKyAgICAgICAgIC8vIEhpZ2hlc3QgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVOb25lID0gNSwKKyAgICAgICAgIC8vIFNlY29uZCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZiA9IDQsCisgICAgICAgICAvLyBTZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIgd2l0aG91dCBkZXBlbmRlbmN5IG9uIHByZXZpb3VzIGZyYW1lcyBpbgorICAgICAgICAgLy8gdGhlIHNlY29uZCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZldpdGhvdXREZXBlbmRlbmN5ID0gMywKKyAgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuID0gMiwKKyAgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyIHdpdGhvdXQgZGVwZW5kZW5jeSBvbiBwcmV2aW91cyBmcmFtZXMgaW4KKyAgICAgICAgIC8vIHRoZSBmaXJzdCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5ID0gMSwKKyAgICAgICAgIC8vIEJhc2UgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0ID0gMCwKKyAgICAgfTsKKyAgICAgZW51bSB7CisgICAgICAgICBrTWF4VGVtcG9yYWxQYXR0ZXJuID0gOAorICAgICB9OworCisgICAgIC8vIHZweCBzcGVjaWZpYyBvcGFxdWUgZGF0YSBzdHJ1Y3R1cmUgdGhhdAorICAgICAvLyBzdG9yZXMgZW5jb2RlciBzdGF0ZQorICAgICB2cHhfY29kZWNfY3R4X3QqIG1Db2RlY0NvbnRleHQ7CisKKyAgICAgLy8gdnB4IHNwZWNpZmljIGRhdGEgc3RydWN0dXJlIHRoYXQKKyAgICAgLy8gc3RvcmVzIGVuY29kZXIgY29uZmlndXJhdGlvbgorICAgICB2cHhfY29kZWNfZW5jX2NmZ190KiBtQ29kZWNDb25maWd1cmF0aW9uOworCisgICAgIC8vIHZweCBzcGVjaWZpYyByZWFkLW9ubHkgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgLy8gdGhhdCBzcGVjaWZpZXMgYWxnb3JpdGhtIGludGVyZmFjZSAoZS5nLiB2cDgpCisgICAgIHZweF9jb2RlY19pZmFjZV90KiBtQ29kZWNJbnRlcmZhY2U7CisKKyAgICAgLy8gYWxpZ24gc3RyaWRlIHRvIHRoZSBwb3dlciBvZiAyCisgICAgIGludDMyX3QgbVN0cmlkZUFsaWduOworCisgICAgIC8vIENvbG9yIGZvcm1hdCBmb3IgdGhlIGlucHV0IHBvcnQKKyAgICAgdnB4X2ltZ19mbXRfdCBtQ29sb3JGb3JtYXQ7CisKKyAgICAgLy8gQml0cmF0ZSBjb250cm9sIG1vZGUsIGVpdGhlciBjb25zdGFudCBvciB2YXJpYWJsZQorICAgICB2cHhfcmNfbW9kZSBtQml0cmF0ZUNvbnRyb2xNb2RlOworCisgICAgIC8vIFBhcmFtZXRlciB0aGF0IGRlbm90ZXMgd2hldGhlciBlcnJvciByZXNpbGllbmNlCisgICAgIC8vIGlzIGVuYWJsZWQgaW4gZW5jb2RlcgorICAgICBib29sIG1FcnJvclJlc2lsaWVuY2U7CisKKyAgICAgLy8gTWluaW11bSAoYmVzdCBxdWFsaXR5KSBxdWFudGl6ZXIKKyAgICAgdWludDMyX3QgbU1pblF1YW50aXplcjsKKworICAgICAvLyBNYXhpbXVtICh3b3JzdCBxdWFsaXR5KSBxdWFudGl6ZXIKKyAgICAgdWludDMyX3QgbU1heFF1YW50aXplcjsKKworICAgICAvLyBOdW1iZXIgb2YgY29kaW5nIHRlbXBvcmFsIGxheWVycyB0byBiZSB1c2VkLgorICAgICBzaXplX3QgbVRlbXBvcmFsTGF5ZXJzOworCisgICAgIC8vIFRlbXBvcmFsIGxheWVyIGJpdHJhcmUgcmF0aW8gaW4gcGVyY2VudGFnZQorICAgICB1aW50MzJfdCBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tNQVhURU1QT1JBTExBWUVSU107CisKKyAgICAgLy8gVGVtcG9yYWwgcGF0dGVybiB0eXBlCisgICAgIFRlbXBvcmFsUGF0dGVyblR5cGUgbVRlbXBvcmFsUGF0dGVyblR5cGU7CisKKyAgICAgLy8gVGVtcG9yYWwgcGF0dGVybiBsZW5ndGgKKyAgICAgc2l6ZV90IG1UZW1wb3JhbFBhdHRlcm5MZW5ndGg7CisKKyAgICAgLy8gVGVtcG9yYWwgcGF0dGVybiBjdXJyZW50IGluZGV4CisgICAgIHNpemVfdCBtVGVtcG9yYWxQYXR0ZXJuSWR4OworCisgICAgIC8vIEZyYW1lIHR5cGUgdGVtcG9yYWwgcGF0dGVybgorICAgICBUZW1wb3JhbFJlZmVyZW5jZXMgbVRlbXBvcmFsUGF0dGVybltrTWF4VGVtcG9yYWxQYXR0ZXJuXTsKKworICAgICAvLyBMYXN0IGlucHV0IGJ1ZmZlciB0aW1lc3RhbXAKKyAgICAgdWludDY0X3QgbUxhc3RUaW1lc3RhbXA7CisKKyAgICAgLy8gTnVtYmVyIG9mIGlucHV0IGZyYW1lcworICAgICBpbnQ2NF90IG1OdW1JbnB1dEZyYW1lczsKKworICAgICAvLyBDb252ZXJzaW9uIGJ1ZmZlciBpcyBuZWVkZWQgdG8gaW5wdXQgdG8KKyAgICAgLy8geXV2NDIwIHBsYW5hciBmb3JtYXQuCisgICAgIE1lbW9yeUJsb2NrIG1Db252ZXJzaW9uQnVmZmVyOworCisgICAgIC8vIFNpZ25hbGxlZCBFT1MKKyAgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworCisgICAgIC8vIFNpZ25hbGxlZCBFcnJvcgorICAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKworICAgIC8vIGNvbmZpZ3VyYXRpb25zIHVzZWQgYnkgY29tcG9uZW50IGluIHByb2Nlc3MKKyAgICAvLyAoVE9ETzoga2VlcCB0aGlzIGluIGludGYgYnV0IG1ha2UgdGhlbSBpbnRlcm5hbCBvbmx5KQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBtSW50cmFSZWZyZXNoOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlTW9kZVR1bmluZzo6b3V0cHV0PiBtQml0cmF0ZU1vZGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBtUmVxdWVzdFN5bmM7CisKKyAgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0VnB4RW5jKTsKK307CisKK2NsYXNzIEMyU29mdFZweEVuYzo6SW50ZkltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4mIGhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkdSQVBISUMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgwdSwgQzJCdWZmZXJEYXRhOjpMSU5FQVIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fUkFXKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4oCisjaWZkZWYgVlA5CisgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKERlZmluZVBhcmFtKG1Vc2FnZSwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX1VTQUdFKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCAodWludDY0X3QpQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlTW9kZSwgQzJfUEFSQU1LRVlfQklUUkFURV9NT0RFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlTW9kZVR1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29uZmlnOjpCSVRSQVRFX0NPTlNUKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQml0cmF0ZU1vZGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6QklUUkFURV9DT05TVCwgQzJDb25maWc6OkJJVFJBVEVfVkFSSUFCTEUgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlTW9kZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1GcmFtZVJhdGUsIEMyX1BBUkFNS0VZX0ZSQU1FX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dCgwdSwgMzAuKSkKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBNb3JlIHJlc3RyaWN0aW9uPworICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUZyYW1lUmF0ZSwgdmFsdWUpLmdyZWF0ZXJUaGFuKDAuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoCisgICAgICAgICAgICAgICAgICAgIFNldHRlcjxkZWNsdHlwZSgqbUZyYW1lUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1MYXllcmluZywgQzJfUEFSQU1LRVlfVEVNUE9SQUxfTEFZRVJJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgwdSwgMCwgMCwgMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUxheWVyaW5nLCBtLmxheWVyQ291bnQpLmluUmFuZ2UoMCwgNCksCisgICAgICAgICAgICAgICAgICAgIEMyRihtTGF5ZXJpbmcsIG0uYkxheWVyQ291bnQpLmluUmFuZ2UoMCwgMCksCisgICAgICAgICAgICAgICAgICAgIEMyRihtTGF5ZXJpbmcsIG0uYml0cmF0ZVJhdGlvcykuaW5SYW5nZSgwLiwgMS4pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihMYXllcmluZ1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TeW5jRnJhbWVQZXJpb2QsIEMyX1BBUkFNS0VZX1NZTkNfRlJBTUVfSU5URVJWQUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQoMHUsIDEwMDAwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVN5bmNGcmFtZVBlcmlvZCwgdmFsdWUpLmFueSgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1TeW5jRnJhbWVQZXJpb2QpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQwOTYsIDQwMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQml0cmF0ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnRyYVJlZnJlc2gsIEMyX1BBUkFNS0VZX0lOVFJBX1JFRlJFU0gpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb25maWc6OklOVFJBX1JFRlJFU0hfRElTQUJMRUQsIDAuKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgIDB1LCBQUk9GSUxFX1ZQOV8wLCBMRVZFTF9WUDlfNF8xKSkKKyAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLmVxdWFsVG8oCisgICAgICAgICAgICAgICAgUFJPRklMRV9WUDlfMAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkuZXF1YWxUbygKKyAgICAgICAgICAgICAgICBMRVZFTF9WUDlfNF8xKSwKKyAgICAgICAgfSkKKyAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyKQorICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1SZXF1ZXN0U3luYywgQzJfUEFSQU1LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQoMHUsIEMyX0ZBTFNFKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1SZXF1ZXN0U3luYywgdmFsdWUpLm9uZU9mKHsgQzJfRkFMU0UsIEMyX1RSVUUgfSkgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1SZXF1ZXN0U3luYyk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQml0cmF0ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmIChtZS52LnZhbHVlIDw9IDQwOTYpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnZhbHVlID0gNDA5NjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcigKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYucHJvZmlsZSkuc3VwcG9ydHNBdEFsbChtZS52LnByb2ZpbGUpKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5wcm9maWxlID0gUFJPRklMRV9WUDlfMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5sZXZlbCkuc3VwcG9ydHNBdEFsbChtZS52LmxldmVsKSkgeworICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBMRVZFTF9WUDlfNF8xOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBMYXllcmluZ1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ+JiBtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKG1lLnYubS5sYXllckNvdW50ID4gNCkgeworICAgICAgICAgICAgbWUuc2V0KCkubS5sYXllckNvdW50ID0gNDsKKyAgICAgICAgfQorICAgICAgICBtZS5zZXQoKS5tLmJMYXllckNvdW50ID0gMDsKKyAgICAgICAgLy8gZW5zdXJlIHJhdGlvcyBhcmUgbW9ub3RvbmljIGFuZCBjbGFtcGVkIGJldHdlZW4gMCBhbmQgMQorICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgbWUudi5mbGV4Q291bnQoKTsgKytpeCkgeworICAgICAgICAgICAgbWUuc2V0KCkubS5iaXRyYXRlUmF0aW9zW2l4XSA9IGMyX2NsYW1wKAorICAgICAgICAgICAgICAgIGl4ID4gMCA/IG1lLnYubS5iaXRyYXRlUmF0aW9zW2l4IC0gMV0gOiAwLCBtZS52Lm0uYml0cmF0ZVJhdGlvc1tpeF0sIDEuKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HSSgic2V0dGluZyB0ZW1wb3JhbCBsYXllcmluZyAldSArICV1IiwgbWUudi5tLmxheWVyQ291bnQsIG1lLnYubS5iTGF5ZXJDb3VudCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gdW5zYWZlIGdldHRlcnMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBnZXRTaXplX2woKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBnZXRJbnRyYVJlZnJlc2hfbCgpIGNvbnN0IHsgcmV0dXJuIG1JbnRyYVJlZnJlc2g7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IGdldEZyYW1lUmF0ZV9sKCkgY29uc3QgeyByZXR1cm4gbUZyYW1lUmF0ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGdldEJpdHJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dD4gZ2V0Qml0cmF0ZU1vZGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlTW9kZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gZ2V0UmVxdWVzdFN5bmNfbCgpIGNvbnN0IHsgcmV0dXJuIG1SZXF1ZXN0U3luYzsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dD4gZ2V0VGVtcG9yYWxMYXllcnNfbCgpIGNvbnN0IHsgcmV0dXJuIG1MYXllcmluZzsgfQorICAgIHVpbnQzMl90IGdldFN5bmNGcmFtZVBlcmlvZCgpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIDwgMCB8fCBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA9PSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGRvdWJsZSBwZXJpb2QgPSBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSAvIDFlNiAqIG1GcmFtZVJhdGUtPnZhbHVlOworICAgICAgICByZXR1cm4gKHVpbnQzMl90KWMyX21heChjMl9taW4ocGVyaW9kICsgMC41LCBkb3VibGUoVUlOVDMyX01BWCkpLCAxLik7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQ+IG1Vc2FnZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IG1GcmFtZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0PiBtTGF5ZXJpbmc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+IG1JbnRyYVJlZnJlc2g7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBtUmVxdWVzdFN5bmM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dD4gbVN5bmNGcmFtZVBlcmlvZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlTW9kZVR1bmluZzo6b3V0cHV0PiBtQml0cmF0ZU1vZGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiBtUHJvZmlsZUxldmVsOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfVlBYX0VOQ19IX18KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWVkNThhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzk1Y2MxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTEgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfeGFhY2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0WGFhY0RlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnhhYWNkZWMiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQzJTb2Z0WGFhY0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNzMwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuY3BwCkBAIC0wLDAgKzEsMTYwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0WGFhY0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRYYWFjRGVjLmgiCisKKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCAtMTYuMCAgIC8qIDY0Ki0wLjI1ZEIgPSAtMTYgZEIgYmVsb3cgZnVsbCBzY2FsZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQgICAxLjAgIC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCAxLjAgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fSEVBVlkgICAvKiBzd2l0Y2ggZm9yIGhlYXZ5IGNvbXByZXNzaW9uIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0VGRkVDVCAzICAvKiBNUEVHLUQgRFJDIGVmZmVjdCB0eXBlOyAzID0+IExpbWl0ZWQgcGxheWJhY2sgcmFuZ2UgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCAoMC4yNSkgLyogZW5jb2RlciB0YXJnZXQgbGV2ZWw7IC0xID0+IHRoZSB2YWx1ZSBpcyB1bmtub3duLCBvdGhlcndpc2UgZEIgc3RlcCB2YWx1ZSAoZS5nLiA2NCBmb3IgLTE2IGRCKSAqLworI2RlZmluZSBNQVhfQ0hBTk5FTF9DT1VOVCAgICAgICAgICAgIDggIC8qIG1heGltdW0gbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIHRoYXQgY2FuIGJlIGRlY29kZWQgKi8KKy8vIG5hbWVzIG9mIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBEUkMgc2V0dGluZ3MKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfUkVGX0xFVkVMICAiYWFjX2RyY19yZWZlcmVuY2VfbGV2ZWwiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0NVVCAgICAgICAgImFhY19kcmNfY3V0IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9CT09TVCAgICAgICJhYWNfZHJjX2Jvb3N0IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9IRUFWWSAgICAgICJhYWNfZHJjX2hlYXZ5IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FTkNfTEVWRUwgICJhYWNfZHJjX2VuY190YXJnZXRfbGV2ZWwiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0VGRkVDVF9UWVBFICJyby5hYWNfZHJjX2VmZmVjdF90eXBlIgorCisjZGVmaW5lIFJFVFVSTl9JRl9GQVRBTChyZXR2YWwsIHN0cikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAocmV0dmFsICYgSUFfRkFUQUxfRVJST1IpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRSgiRXJyb3IgaW4gJXM6IFJldHVybmVkOiAlZCIsIHN0ciwgcmV0dmFsKTsgICBcCisgICAgICAgIHJldHVybiByZXR2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgaWYgKHJldHZhbCAhPSBJQV9OT19FUlJPUikgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HVygiV2FybmluZyBpbiAlczogUmV0dXJuZWQ6ICVkIiwgc3RyLCByZXR2YWwpOyBcCisgICAgfQorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLnhhYWMuZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdFhhYWNEZWM6OkludGZJbXBsIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KDB1LCBDMkJ1ZmZlckRhdGE6OkxJTkVBUikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICA3MzUwLCA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAKKyAgICAgICAgICAgICAgICB9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA4KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCA5NjAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BYWNGb3JtYXQsIEMyX1BBUkFNS0VZX0FBQ19QQUNLQUdJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUFhY0Zvcm1hdEluZm86OmlucHV0KDB1LCBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19SQVcpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUFhY0Zvcm1hdCwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfUkFXLCBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19BRFRTCisgICAgICAgICAgICAgICAgfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUFhY0Zvcm1hdCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQywgQzJDb25maWc6OkxFVkVMX1VOVVNFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFX1BTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRUxELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19YSEV9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1VOVVNFRAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0NvbXByZXNzTW9kZSwgQzJfUEFSQU1LRVlfRFJDX0NPTVBSRVNTSU9OX01PREUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0NvbXByZXNzaW9uTW9kZVR1bmluZzo6aW5wdXQoMHUsIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fSEVBVlkpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EcmNDb21wcmVzc01vZGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9PRE1fREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9MSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0NvbXByZXNzTW9kZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjVGFyZ2V0UmVmTGV2ZWwsIEMyX1BBUkFNS0VZX0RSQ19UQVJHRVRfUkVGRVJFTkNFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNUYXJnZXRSZWZlcmVuY2VMZXZlbFR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY1RhcmdldFJlZkxldmVsLCB2YWx1ZSkuaW5SYW5nZSgtMzEuNzUsIDAuMjUpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNUYXJnZXRSZWZMZXZlbCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjRW5jVGFyZ2V0TGV2ZWwsIEMyX1BBUkFNS0VZX0RSQ19FTkNPREVEX1RBUkdFVF9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjRW5jb2RlZFRhcmdldExldmVsVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjRW5jVGFyZ2V0TGV2ZWwsIHZhbHVlKS5pblJhbmdlKC0zMS43NSwgMC4yNSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0VuY1RhcmdldExldmVsKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNCb29zdEZhY3RvciwgQzJfUEFSQU1LRVlfRFJDX0JPT1NUX0ZBQ1RPUikKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjQm9vc3RGYWN0b3JUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNCb29zdEZhY3RvciwgdmFsdWUpLmluUmFuZ2UoMCwgMS4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNCb29zdEZhY3Rvcik+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjQXR0ZW51YXRpb25GYWN0b3IsIEMyX1BBUkFNS0VZX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0F0dGVudWF0aW9uRmFjdG9yVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY0F0dGVudWF0aW9uRmFjdG9yLCB2YWx1ZSkuaW5SYW5nZSgwLCAxLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0F0dGVudWF0aW9uRmFjdG9yKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNFZmZlY3RUeXBlLCBDMl9QQVJBTUtFWV9EUkNfRUZGRUNUX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0VmZmVjdFR5cGVUdW5pbmc6OmlucHV0KDB1LCBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MSU1JVEVEX1BMQVlCQUNLX1JBTkdFKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRHJjRWZmZWN0VHlwZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9PRE1fREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9PRkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MQVRFX05JR0hULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX05PSVNZX0VOVklST05NRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xJTUlURURfUExBWUJBQ0tfUkFOR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTE9XX1BMQVlCQUNLX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0RJQUxPR19FTkhBTkNFTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9HRU5FUkFMX0NPTVBSRVNTSU9OfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0VmZmVjdFR5cGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBib29sIGlzQWR0cygpIGNvbnN0IHsgcmV0dXJuIG1BYWNGb3JtYXQtPnZhbHVlID09IEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX0FEVFM7IH0KKyAgICB1aW50MzJfdCBnZXRCaXRyYXRlKCkgY29uc3QgeyByZXR1cm4gbUJpdHJhdGUtPnZhbHVlOyB9CisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKyAgICBpbnQzMl90IGdldERyY0NvbXByZXNzTW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1EcmNDb21wcmVzc01vZGUtPnZhbHVlID09IEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fSEVBVlkgPyAxIDogMDsgfQorICAgIGludDMyX3QgZ2V0RHJjVGFyZ2V0UmVmTGV2ZWwoKSBjb25zdCB7IHJldHVybiAobURyY1RhcmdldFJlZkxldmVsLT52YWx1ZSA8PSAwID8gLW1EcmNUYXJnZXRSZWZMZXZlbC0+dmFsdWUgKiA0LiArIDAuNSA6IC0xKTsgfQorICAgIGludDMyX3QgZ2V0RHJjRW5jVGFyZ2V0TGV2ZWwoKSBjb25zdCB7IHJldHVybiAobURyY0VuY1RhcmdldExldmVsLT52YWx1ZSA8PSAwID8gLW1EcmNFbmNUYXJnZXRMZXZlbC0+dmFsdWUgKiA0LiArIDAuNSA6IC0xKTsgfQorICAgIGludDMyX3QgZ2V0RHJjQm9vc3RGYWN0b3IoKSBjb25zdCB7IHJldHVybiBtRHJjQm9vc3RGYWN0b3ItPnZhbHVlICogMTI3LiArIDAuNTsgfQorICAgIGludDMyX3QgZ2V0RHJjQXR0ZW51YXRpb25GYWN0b3IoKSBjb25zdCB7IHJldHVybiBtRHJjQXR0ZW51YXRpb25GYWN0b3ItPnZhbHVlICogMTI3LiArIDAuNTsgfQorICAgIGludDMyX3QgZ2V0RHJjRWZmZWN0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1EcmNFZmZlY3RUeXBlLT52YWx1ZTsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dD4gbUlucHV0Rm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQWFjRm9ybWF0SW5mbzo6aW5wdXQ+IG1BYWNGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQ29tcHJlc3Npb25Nb2RlVHVuaW5nOjppbnB1dD4gbURyY0NvbXByZXNzTW9kZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNUYXJnZXRSZWZlcmVuY2VMZXZlbFR1bmluZzo6aW5wdXQ+IG1EcmNUYXJnZXRSZWZMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNFbmNvZGVkVGFyZ2V0TGV2ZWxUdW5pbmc6OmlucHV0PiBtRHJjRW5jVGFyZ2V0TGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQm9vc3RGYWN0b3JUdW5pbmc6OmlucHV0PiBtRHJjQm9vc3RGYWN0b3I7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQXR0ZW51YXRpb25GYWN0b3JUdW5pbmc6OmlucHV0PiBtRHJjQXR0ZW51YXRpb25GYWN0b3I7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjRWZmZWN0VHlwZVR1bmluZzo6aW5wdXQ+IG1EcmNFZmZlY3RUeXBlOworICAgIC8vIFRPRE8gQWRkIDogQzJTdHJlYW1BYWNTYnJNb2RlVHVuaW5nCit9OworCitDMlNvZnRYYWFjRGVjOjpDMlNvZnRYYWFjRGVjKAorICAgICAgICBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgICBtWGhlYWFjQ29kZWNIYW5kbGUobnVsbHB0ciksCisgICAgICAgIG1NcGVnRERyY0hhbmRsZShudWxscHRyKSwKKyAgICAgICAgbU91dHB1dERyYWluQnVmZmVyKG51bGxwdHIpIHsKK30KKworQzJTb2Z0WGFhY0RlYzo6fkMyU29mdFhhYWNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFhhYWNEZWM6Om9uSW5pdCgpIHsKKyAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSAxMDI0OworICAgIG1JbnB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgbU91dHB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgbVNhbXBGcmVxID0gMDsKKyAgICBtTnVtQ2hhbm5lbHMgPSAwOworICAgIG1QY21XZFN6ID0gMDsKKyAgICBtQ2hhbm5lbE1hc2sgPSAwOworICAgIG1OdW1PdXRCeXRlcyA9IDA7CisgICAgbUN1ckZyYW1lSW5kZXggPSAwOworICAgIG1DdXJUaW1lc3RhbXAgPSAwOworICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBtSXNDb2RlY0NvbmZpZ0ZsdXNoUmVxdWlyZWQgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MgPSAwOworICAgIG1EUkNGbGFnID0gMDsKKyAgICBtTXBlZ0REUkNQcmVzZW50ID0gMDsKKyAgICBtTWVtb3J5VmVjLmNsZWFyKCk7CisgICAgbURyY01lbW9yeVZlYy5jbGVhcigpOworCisgICAgSUFfRVJST1JDT0RFIGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBJQV9OT19FUlJPUiA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworCit9CisKK2MyX3N0YXR1c190IEMyU29mdFhhYWNEZWM6Om9uU3RvcCgpIHsKKyAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSAxMDI0OworICAgIGRyYWluRGVjb2RlcigpOworICAgIC8vIHJlc2V0IHRoZSAiY29uZmlndXJlZCIgc3RhdGUKKyAgICBtU2FtcEZyZXEgPSAwOworICAgIG1OdW1DaGFubmVscyA9IDA7CisgICAgbVBjbVdkU3ogPSAwOworICAgIG1DaGFubmVsTWFzayA9IDA7CisgICAgbU51bU91dEJ5dGVzID0gMDsKKyAgICBtQ3VyRnJhbWVJbmRleCA9IDA7CisgICAgbUN1clRpbWVzdGFtcCA9IDA7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zID0gMDsKKyAgICBtRFJDRmxhZyA9IDA7CisgICAgbU1wZWdERFJDUHJlc2VudCA9IDA7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0WGFhY0RlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRYYWFjRGVjOjpvblJlbGVhc2UoKSB7CisgICAgSUFfRVJST1JDT0RFIGVyckNvZGUgPSBkZUluaXRYQUFDRGVjb2RlcigpOworICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJDb2RlKSBBTE9HRSgiZGVJbml0WEFBQ0RlY29kZXIoKSBmYWlsZWQgJWQiLCBlcnJDb2RlKTsKKworICAgIGVyckNvZGUgPSBkZUluaXRNUEVHREREcmMoKTsKKyAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyQ29kZSkgQUxPR0UoImRlSW5pdE1QRUdERERyYygpIGZhaWxlZCAlZCIsIGVyckNvZGUpOworCisgICAgaWYgKG1PdXRwdXREcmFpbkJ1ZmZlcikgeworICAgICAgICBkZWxldGVbXSBtT3V0cHV0RHJhaW5CdWZmZXI7CisgICAgICAgIG1PdXRwdXREcmFpbkJ1ZmZlciA9IG51bGxwdHI7CisgICAgfQorfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgQUxPR1YoImluaXREZWNvZGVyKCkiKTsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKworICAgIGVycl9jb2RlID0gaW5pdFhBQUNEZWNvZGVyKCk7CisgICAgaWYgKGVycl9jb2RlICE9IElBX05PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJpbml0WEFBQ0RlY29kZXIgRmFpbGVkIik7CisgICAgICAgIC8qIENhbGwgZGVJbml0IHRvIGZyZWUgYW55IGFsbG9jYXRlZCBtZW1vcnkgKi8KKyAgICAgICAgZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKworICAgIGlmICghbU91dHB1dERyYWluQnVmZmVyKSB7CisgICAgICAgIG1PdXRwdXREcmFpbkJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBjaGFyW2tPdXRwdXREcmFpbkJ1ZmZlclNpemVdOworICAgICAgICBpZiAoIW1PdXRwdXREcmFpbkJ1ZmZlcikgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKworICAgIGVycl9jb2RlID0gaW5pdFhBQUNEcmMoKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiaW5pdFhBQUNEcmMiKTsKKworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdFhhYWNEZWM6OmZpbmlzaFdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgIEFMT0dWKCJtQ3VyRnJhbWVJbmRleCA9ICUiIFBSSXU2NCwgbUN1ckZyYW1lSW5kZXgpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX07CisgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcsIHByb3BlciB1c2FnZSwgZXRjLgorICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgIHBvb2wtPmZldGNoTGluZWFyQmxvY2sobU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZmFpbGVkIDogZXJyID0gJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaW50MTZfdCogb3V0QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4od1ZpZXcuZGF0YSgpKTsKKyAgICBtZW1jcHkob3V0QnVmZmVyLCBtT3V0cHV0RHJhaW5CdWZmZXIsIG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zKTsKKyAgICBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcyA9IDA7CisKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jayldKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfTsKKyAgICBpZiAod29yayAmJiB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPT0gYzJfY250cjY0X3QobUN1ckZyYW1lSW5kZXgpKSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaChtQ3VyRnJhbWVJbmRleCwgZmlsbFdvcmspOworICAgIH0KKworICAgIEFMT0dWKCJvdXQgdGltZXN0YW1wICUiIFBSSXU2NCAiIC8gJXUiLCBtQ3VyVGltZXN0YW1wLCBibG9jay0+Y2FwYWNpdHkoKSk7Cit9CisKK3ZvaWQgQzJTb2Z0WGFhY0RlYzo6cHJvY2Vzcyhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB1aW50OF90KiBpbkJ1ZmZlciA9IG51bGxwdHI7CisgICAgdWludDMyX3QgaW5CdWZmZXJMZW5ndGggPSAwOworICAgIEMyUmVhZFZpZXcgdmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIHNpemVfdCBvZmZzZXQgPSAwdTsKKyAgICBzaXplX3Qgc2l6ZSA9IDB1OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgc2l6ZSA9IHZpZXcuY2FwYWNpdHkoKTsKKyAgICB9CisgICAgaWYgKHNpemUgJiYgdmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHZpZXcuZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICBib29sIGNvZGVjQ29uZmlnID0KKyAgICAgICAgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwOworICAgIGlmIChjb2RlY0NvbmZpZykgeworICAgICAgICBpZiAoc2l6ZSA9PSAwdSkgeworICAgICAgICAgICAgQUxPR0UoImVtcHR5IGNvZGVjIGNvbmZpZyIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBjb25zdF9jYXN0IGJlY2F1c2Ugb2YgbGliQUFDZGVjIG1ldGhvZCBzaWduYXR1cmUuCisgICAgICAgIGluQnVmZmVyID0gY29uc3RfY2FzdDx1aW50OF90Kj4odmlldy5kYXRhKCkgKyBvZmZzZXQpOworICAgICAgICBpbkJ1ZmZlckxlbmd0aCA9IHNpemU7CisKKyAgICAgICAgLyogR0EgaGVhZGVyIGNvbmZpZ3VyYXRpb24gc2VudCB0byBEZWNvZGVyISAqLworICAgICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBjb25maWdYQUFDRGVjb2RlcihpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyX2NvZGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJjb25maWdYQUFDRGVjb2RlciBlcnJfY29kZSA9ICVkIiwgZXJyX2NvZGUpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUN1ckZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICBtQ3VyVGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKTsKKyAgICBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcyA9IDA7CisgICAgY2hhciogdGVtcE91dHB1dERyYWluQnVmZmVyID0gbU91dHB1dERyYWluQnVmZmVyOworICAgIHdoaWxlIChzaXplID4gMHUpIHsKKyAgICAgICAgaWYgKChrT3V0cHV0RHJhaW5CdWZmZXJTaXplICogc2l6ZW9mKGludDE2X3QpIC0KKyAgICAgICAgICAgICBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcykgPAorICAgICAgICAgICAgKG1PdXRwdXRGcmFtZUxlbmd0aCAqIHNpemVvZihpbnQxNl90KSAqIG1OdW1DaGFubmVscykpIHsKKyAgICAgICAgICAgIEFMT0dWKCJza2lwcGluZyBkZWNvZGU6IG5vdCBlbm91Z2ggc3BhY2UgbGVmdCBpbiBEcmFpbkJ1ZmZlciIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiaW5BdHRyaWJ1dGUgc2l6ZSA9ICV6dSIsIHNpemUpOworICAgICAgICBpZiAobUludGYtPmlzQWR0cygpKSB7CisgICAgICAgICAgICBBTE9HVigiQURUUyIpOworICAgICAgICAgICAgc2l6ZV90IGFkdHNIZWFkZXJTaXplID0gMDsKKyAgICAgICAgICAgIC8vIHNraXAgMzAgYml0cywgYWFjX2ZyYW1lX2xlbmd0aCBmb2xsb3dzLgorICAgICAgICAgICAgLy8gc3Nzc3Nzc3Mgc3Nzc2lpaXAgcHBmZmZmUGMgY2NvaENDbGwgbGxsbGxsbGwgbGxsPz8/Pz8KKworICAgICAgICAgICAgY29uc3QgdWludDhfdCogYWR0c0hlYWRlciA9IHZpZXcuZGF0YSgpICsgb2Zmc2V0OworICAgICAgICAgICAgYm9vbCBzaWduYWxFcnJvciA9IGZhbHNlOworICAgICAgICAgICAgaWYgKHNpemUgPCA3KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkF1ZGlvIGRhdGEgdG9vIHNob3J0IHRvIGNvbnRhaW4gZXZlbiB0aGUgQURUUyBoZWFkZXIuICIKKyAgICAgICAgICAgICAgICAgICAgICAiR290ICV6dSBieXRlcy4iLCBzaXplKTsKKyAgICAgICAgICAgICAgICBoZXhkdW1wKGFkdHNIZWFkZXIsIHNpemUpOworICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYm9vbCBwcm90ZWN0aW9uQWJzZW50ID0gKGFkdHNIZWFkZXJbMV0gJiAxKTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBhYWNfZnJhbWVfbGVuZ3RoID0gKChhZHRzSGVhZGVyWzNdICYgMykgPDwgMTEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkdHNIZWFkZXJbNF0gPDwgMykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWR0c0hlYWRlcls1XSA+PiA1KTsKKworICAgICAgICAgICAgICAgIGlmIChzaXplIDwgYWFjX2ZyYW1lX2xlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBhdWRpbyBkYXRhIGZvciB0aGUgY29tcGxldGUgZnJhbWUuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkdvdCAlenUgYnl0ZXMsIGZyYW1lIHNpemUgYWNjb3JkaW5nIHRvIHRoZSBBRFRTICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImhlYWRlciBpcyAldSBieXRlcy4iLCBzaXplLCBhYWNfZnJhbWVfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgaGV4ZHVtcChhZHRzSGVhZGVyLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgc2lnbmFsRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFkdHNIZWFkZXJTaXplID0gKHByb3RlY3Rpb25BYnNlbnQgPyA3IDogOSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhYWNfZnJhbWVfbGVuZ3RoIDwgYWR0c0hlYWRlclNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0X2Nhc3QgYmVjYXVzZSBvZiBsaWJBQUNkZWMgbWV0aG9kIHNpZ25hdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QqPihhZHRzSGVhZGVyICsgYWR0c0hlYWRlclNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGggPSBhYWNfZnJhbWVfbGVuZ3RoIC0gYWR0c0hlYWRlclNpemU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBhZHRzSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgLT0gYWR0c0hlYWRlclNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzaWduYWxFcnJvcikgeworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJOb24gQURUUyIpOworICAgICAgICAgICAgLy8gY29uc3RfY2FzdCBiZWNhdXNlIG9mIGxpYkFBQ2RlYyBtZXRob2Qgc2lnbmF0dXJlLgorICAgICAgICAgICAgaW5CdWZmZXIgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPih2aWV3LmRhdGEoKSArIG9mZnNldCk7CisgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCA9IHNpemU7CisgICAgICAgIH0KKworICAgICAgICBzaWduZWQgaW50IHByZXZTYW1wbGVSYXRlID0gbVNhbXBGcmVxOworICAgICAgICBzaWduZWQgaW50IHByZXZOdW1DaGFubmVscyA9IG1OdW1DaGFubmVsczsKKworICAgICAgICAvKiBYQUFDIGRlY29kZXIgZXhwZWN0cyBmaXJzdCBmcmFtZSB0byBiZSBmZWQgdmlhIGNvbmZpZ1hBQUNEZWNvZGVyIEFQSQorICAgICAgICAgKiB3aGljaCBzaG91bGQgaW5pdGlhbGl6ZSB0aGUgY29kZWMuIE9uY2UgdGhpcyBzdGF0ZSBpcyByZWFjaGVkLCBjYWxsIHRoZQorICAgICAgICAgKiBkZWNvZGVYQUFDU3RyZWFtIEFQSSB3aXRoIHNhbWUgZnJhbWUgdG8gZGVjb2RlISAqLworICAgICAgICBpZiAoIW1Jc0NvZGVjSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGNvbmZpZ1hBQUNEZWNvZGVyKGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgICAgICAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyX2NvZGUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiY29uZmlnWEFBQ0RlY29kZXIgRmFpbGVkIDIgZXJyX2NvZGUgPSAlZCIsIGVycl9jb2RlKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgobVNhbXBGcmVxICE9IHByZXZTYW1wbGVSYXRlKSB8fAorICAgICAgICAgICAgICAgIChtTnVtQ2hhbm5lbHMgIT0gcHJldk51bUNoYW5uZWxzKSkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJSZWNvbmZpZ3VyaW5nIGRlY29kZXI6ICVkLT4lZCBIeiwgJWQtPiVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgICAgICAgICAgICBwcmV2U2FtcGxlUmF0ZSwgbVNhbXBGcmVxLCBwcmV2TnVtQ2hhbm5lbHMsIG1OdW1DaGFubmVscyk7CisKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIG1TYW1wRnJlcSk7CisgICAgICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygwdSwgbU51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgJnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mbyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzYW1wbGVSYXRlSW5mbykpOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoY2hhbm5lbENvdW50SW5mbykpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzaWduZWQgaW50IGJ5dGVzQ29uc3VtZWQgPSAwOworICAgICAgICBJQV9FUlJPUkNPREUgZXJyb3JDb2RlID0gSUFfTk9fRVJST1I7CisgICAgICAgIGlmIChtSXNDb2RlY0luaXRpYWxpemVkKSB7CisgICAgICAgICAgICBtSXNDb2RlY0NvbmZpZ0ZsdXNoUmVxdWlyZWQgPSB0cnVlOworICAgICAgICAgICAgZXJyb3JDb2RlID0gZGVjb2RlWEFBQ1N0cmVhbShpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc0NvbnN1bWVkLCAmbU51bU91dEJ5dGVzKTsKKyAgICAgICAgfSBlbHNlIGlmICghbUlzQ29kZWNDb25maWdGbHVzaFJlcXVpcmVkKSB7CisgICAgICAgICAgICBBTE9HVygiQXNzdW1wdGlvbiB0aGF0IGZpcnN0IGZyYW1lIGFmdGVyIGhlYWRlciBpbml0aWFsaXplcyBkZWNvZGVyIEZhaWxlZCEiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSAtPSBieXRlc0NvbnN1bWVkOworICAgICAgICBvZmZzZXQgKz0gYnl0ZXNDb25zdW1lZDsKKworICAgICAgICBpZiAoaW5CdWZmZXJMZW5ndGggIT0gKHVpbnQzMl90KWJ5dGVzQ29uc3VtZWQpCisgICAgICAgICAgICBBTE9HVygiQWxsIGRhdGEgbm90IGNvbnN1bWVkIik7CisKKyAgICAgICAgLyogSW4gY2FzZSBvZiBlcnJvciwgZGVjb2RlciB3b3VsZCBoYXZlIGdpdmVuIG91dCBlbXB0eSBidWZmZXIgKi8KKyAgICAgICAgaWYgKChJQV9OT19FUlJPUiAhPSBlcnJvckNvZGUpICYmICgwID09IG1OdW1PdXRCeXRlcykgJiYgbUlzQ29kZWNJbml0aWFsaXplZCkKKyAgICAgICAgICAgIG1OdW1PdXRCeXRlcyA9IG1PdXRwdXRGcmFtZUxlbmd0aCAqIChtUGNtV2RTeiAvIDgpICogbU51bUNoYW5uZWxzOworCisgICAgICAgIGlmICghYnl0ZXNDb25zdW1lZCkgeworICAgICAgICAgICAgQUxPR1coImJ5dGVzQ29uc3VtZWQgPSAwIHNob3VsZCBuZXZlciBoYXBwZW4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgodWludDMyX3QpbU51bU91dEJ5dGVzID4KKyAgICAgICAgICAgIG1PdXRwdXRGcmFtZUxlbmd0aCAqIHNpemVvZihpbnQxNl90KSAqIG1OdW1DaGFubmVscykgeworICAgICAgICAgICAgQUxPR0UoIm1OdW1PdXRCeXRlcyA+IG1PdXRwdXRGcmFtZUxlbmd0aCAqIHNpemVvZihpbnQxNl90KSAqIG1OdW1DaGFubmVscywgc2hvdWxkIG5ldmVyIGhhcHBlbiIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJvckNvZGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIGZvciBvdmVyZmxvdywgQVNBTgorICAgICAgICAgICAgbWVtc2V0KG1PdXRwdXRCdWZmZXIsIDAsIG1OdW1PdXRCeXRlcyk7CisKKyAgICAgICAgICAgIC8vIERpc2NhcmQgaW5wdXQgYnVmZmVyLgorICAgICAgICAgICAgc2l6ZSA9IDA7CisKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICB9CisgICAgICAgIG1lbWNweSh0ZW1wT3V0cHV0RHJhaW5CdWZmZXIsIG1PdXRwdXRCdWZmZXIsIG1OdW1PdXRCeXRlcyk7CisgICAgICAgIHRlbXBPdXRwdXREcmFpbkJ1ZmZlciArPSBtTnVtT3V0Qnl0ZXM7CisgICAgICAgIG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zICs9IG1OdW1PdXRCeXRlczsKKyAgICB9CisKKyAgICBpZiAobU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MpIHsKKyAgICAgICAgZmluaXNoV29yayh3b3JrLCBwb29sKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KKyAgICBpZiAoZW9zKSBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0WGFhY0RlYzo6ZHJhaW4odWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgICh2b2lkKXBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmNvbmZpZ2ZsdXNoRGVjb2RlKCkgeworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZTsKKyAgICB1aW50MzJfdCB1aV9pbml0X2RvbmU7CisgICAgdWludDMyX3QgaW5CdWZmZXJMZW5ndGggPSA4MjAzOworCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9GTFVTSF9NRU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9GTFVTSF9NRU0iKTsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CdWZmZXJMZW5ndGgpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUyIpOworCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9GTFVTSF9NRU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9GTFVTSF9NRU0iKTsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9ET05FX1FVRVJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfaW5pdF9kb25lKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfSU5JVF9ET05FX1FVRVJZIik7CisKKyAgICBpZiAodWlfaW5pdF9kb25lKSB7CisgICAgICAgIGVycl9jb2RlID0gZ2V0WEFBQ1N0cmVhbUluZm8oKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiZ2V0WEFBQ1N0cmVhbUluZm8iKTsKKyAgICAgICAgQUxPR1YoIkZvdW5kIENvZGVjIHdpdGggYmVsb3cgY29uZmlnLS0tXG5zYW1wRnJlcSAlZFxubnVtQ2hhbm5lbHMgJWRcbnBjbVdkU3ogJWRcbmNoYW5uZWxNYXNrICVkXG5vdXRwdXRGcmFtZUxlbmd0aCAlZCIsCisgICAgICAgICAgICAgICBtU2FtcEZyZXEsIG1OdW1DaGFubmVscywgbVBjbVdkU3osIG1DaGFubmVsTWFzaywgbU91dHB1dEZyYW1lTGVuZ3RoKTsKKyAgICAgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0WGFhY0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAobUlzQ29kZWNJbml0aWFsaXplZCkgeworICAgICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBjb25maWdmbHVzaERlY29kZSgpOworICAgICAgICBpZiAoZXJyX2NvZGUgIT0gSUFfTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBjb25maWdmbHVzaERlY29kZTogRXJyb3IgJWQiLCBlcnJfY29kZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZHJhaW5EZWNvZGVyKCk7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6ZHJhaW5EZWNvZGVyKCkgeworICAgIC8qIE91dHB1dCBkZWxheSBjb21wZW5zYXRpb24gbG9naWMgc2hvdWxkIHNpdCBoZXJlLiAqLworICAgIC8qIE5vdGhpbmcgdG8gYmUgZG9uZSBhcyBYQUFDIGRlY29kZXIgZG9lcyBub3QgaW50cm9kdWNlIG91dHB1dCBidWZmZXIgZGVsYXkgKi8KKworICAgIHJldHVybiAwOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6aW5pdFhBQUNEZWNvZGVyKCkgeworICAgIC8qIEZpcnN0IHBhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBFcnJvciBIYW5kbGVyIEluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogR2V0IExpYnJhcnkgTmFtZSwgTGlicmFyeSBWZXJzaW9uIGFuZCBBUEkgVmVyc2lvbiAqLworICAgIC8qIEluaXRpYWxpemUgQVBJIHN0cnVjdHVyZSArIERlZmF1bHQgY29uZmlnIHNldCAgICAgKi8KKyAgICAvKiBTZXQgY29uZmlnIHBhcmFtcyBmcm9tIHVzZXIgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogSW5pdGlhbGl6ZSBtZW1vcnkgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIEdldCBtZW1vcnkgaW5mb3JtYXRpb24gYW5kIGFsbG9jYXRlIG1lbW9yeSAgICAgICAgKi8KKworICAgIG1JbnB1dEJ1ZmZlclNpemUgPSAwOworICAgIG1JbnB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgbU91dHB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgLyogUHJvY2VzcyBzdHJ1Y3QgaW5pdGluZyBlbmQgKi8KKworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBJbml0aWFsaXplIEFQSSBzdHJ1Y3R1cmUgYW5kIHNldCBjb25maWcgcGFyYW1zIHRvIGRlZmF1bHQgICAgICAgICovCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIEFQSSBzaXplICovCisgICAgdWludDMyX3QgcHVpX2FwaV9zaXplOworICAgIC8qIEdldCB0aGUgQVBJIHNpemUgKi8KKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9BUElfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHVpX2FwaV9zaXplKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUiKTsKKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgQVBJICovCisgICAgbVhoZWFhY0NvZGVjSGFuZGxlID0gbWVtYWxpZ24oNCwgcHVpX2FwaV9zaXplKTsKKyAgICBpZiAoIW1YaGVhYWNDb2RlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibWFsbG9jIGZvciBwdWlfYXBpX3NpemUgKyA0ID4+ICVkIEZhaWxlZCIsIHB1aV9hcGlfc2l6ZSArIDQpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorICAgIG1NZW1vcnlWZWMucHVzaChtWGhlYWFjQ29kZWNIYW5kbGUpOworCisgICAgLyogU2V0IHRoZSBjb25maWcgcGFyYW1zIHRvIGRlZmF1bHQgdmFsdWVzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0FQSV9QUkVfQ09ORklHX1BBUkFNUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0lOSVRfQVBJX1BSRV9DT05GSUdfUEFSQU1TIik7CisKKyAgICAvKiBHZXQgdGhlIEFQSSBzaXplICovCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShudWxscHRyLCBJQV9BUElfQ01EX0dFVF9BUElfU0laRSwgMCwgJnB1aV9hcGlfc2l6ZSk7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9BUElfU0laRSIpOworCisgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBBUEkgKi8KKyAgICBtTXBlZ0REcmNIYW5kbGUgPSBtZW1hbGlnbig0LCBwdWlfYXBpX3NpemUpOworICAgIGlmICghbU1wZWdERHJjSGFuZGxlKSB7CisgICAgICAgIEFMT0dFKCJtYWxsb2MgZm9yIHB1aV9hcGlfc2l6ZSArIDQgPj4gJWQgRmFpbGVkIiwgcHVpX2FwaV9zaXplICsgNCk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbU1lbW9yeVZlYy5wdXNoKG1NcGVnRERyY0hhbmRsZSk7CisKKyAgICAvKiBTZXQgdGhlIGNvbmZpZyBwYXJhbXMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9BUElfUFJFX0NPTkZJR19QQVJBTVMsIG51bGxwdHIpOworCisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9BUElfUFJFX0NPTkZJR19QQVJBTVMiKTsKKworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBTZXQgY29uZmlnIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIHVpbnQzMl90IHVpX21wNF9mbGFnID0gMTsKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9JU01QNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX21wNF9mbGFnKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0lTTVA0Iik7CisKKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogSW5pdGlhbGl6ZSBNZW1vcnkgaW5mbyB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICB1aW50MzJfdCB1aV9wcm9jX21lbV90YWJzX3NpemU7CisgICAgcFZPSUQgcHZfYWxsb2NfcHRyOworICAgIC8qIEdldCBtZW1vcnkgaW5mbyB0YWJsZXMgc2l6ZSAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX01FTVRBQlNfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX01FTVRBQlNfU0laRSIpOworCisgICAgcHZfYWxsb2NfcHRyID0gbWVtYWxpZ24oNCwgdWlfcHJvY19tZW1fdGFic19zaXplKTsKKyAgICBpZiAoIXB2X2FsbG9jX3B0cikgeworICAgICAgICBBTE9HRSgiTWFsbG9jIGZvciBzaXplICh1aV9wcm9jX21lbV90YWJzX3NpemUgKyA0KSA9ICVkIGZhaWxlZCEiLCB1aV9wcm9jX21lbV90YWJzX3NpemUgKyA0KTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKyAgICBtTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKKworICAgIC8qIFNldCBwb2ludGVyIGZvciBwcm9jZXNzIG1lbW9yeSB0YWJsZXMgICAgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZfYWxsb2NfcHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9TRVRfTUVNVEFCU19QVFIiKTsKKworICAgIC8qIGluaXRpYWxpemUgdGhlIEFQSSwgcG9zdCBjb25maWcsIGZpbGwgbWVtb3J5IHRhYmxlcyAgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUyIpOworCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIEFsbG9jYXRlIE1lbW9yeSB3aXRoIGluZm8gZnJvbSBsaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogVGhlcmUgYXJlIGZvdXIgZGlmZmVyZW50IHR5cGVzIG9mIG1lbW9yaWVzLCB0aGF0IG5lZWRzIHRvIGJlIGFsbG9jYXRlZCAqLworICAgIC8qIHBlcnNpc3RlbnQsc2NyYXRjaCxpbnB1dCBhbmQgb3V0cHV0ICovCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgaW50IHVpX3NpemUgPSAwLCB1aV9hbGlnbm1lbnQgPSAwLCB1aV90eXBlID0gMDsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IHNpemUgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX3NpemUpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSIpOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgYWxpZ25tZW50ICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2FsaWdubWVudCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQiKTsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IHR5cGUgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX3R5cGUpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSIpOworCisgICAgICAgIHB2X2FsbG9jX3B0ciA9IG1lbWFsaWduKHVpX2FsaWdubWVudCwgdWlfc2l6ZSk7CisgICAgICAgIGlmICghcHZfYWxsb2NfcHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiTWFsbG9jIGZvciBzaXplICh1aV9zaXplICsgdWlfYWxpZ25tZW50KSA9ICVkIGZhaWxlZCEiLAorICAgICAgICAgICAgICAgICAgIHVpX3NpemUgKyB1aV9hbGlnbm1lbnQpOworICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1NZW1vcnlWZWMucHVzaChwdl9hbGxvY19wdHIpOworCisgICAgICAgIC8qIFNldCB0aGUgYnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX01FTV9QVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZfYWxsb2NfcHRyKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKyAgICAgICAgaWYgKHVpX3R5cGUgPT0gSUFfTUVNVFlQRV9JTlBVVCkgeworICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gKHBXT1JEOClwdl9hbGxvY19wdHI7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXJTaXplID0gdWlfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodWlfdHlwZSA9PSBJQV9NRU1UWVBFX09VVFBVVCkKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXIgPSAocFdPUkQ4KXB2X2FsbG9jX3B0cjsKKyAgICB9CisgICAgLyogRW5kIGZpcnN0IHBhcnQgKi8KKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KKworc3RhdHVzX3QgQzJTb2Z0WGFhY0RlYzo6aW5pdFhBQUNEcmMoKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisgICAgdW5zaWduZWQgaW50IHVpX2RyY192YWw7CisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVAorICAgIGludDMyX3QgdGFyZ2V0UmVmTGV2ZWwgPSBtSW50Zi0+Z2V0RHJjVGFyZ2V0UmVmTGV2ZWwoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBvZiAlZCIsIHRhcmdldFJlZkxldmVsKTsKKyAgICB1aV9kcmNfdmFsID0gKHVuc2lnbmVkIGludCl0YXJnZXRSZWZMZXZlbDsKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfZHJjX3ZhbCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xFVkVMIik7CisKKyAgICAvKiBVc2UgdWlfZHJjX3ZhbCBmcm9tIFBST1BfRFJDX09WRVJSSURFX1JFRl9MRVZFTCBvciBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMCisgICAgICogZm9yIElBX0VOSEFBQ1BMVVNfREVDX0RSQ19UQVJHRVRfTE9VRE5FU1MgdG9vICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19EUkNfVEFSR0VUX0xPVURORVNTLCAmdWlfZHJjX3ZhbCk7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19EUkNfVEFSR0VUX0xPVURORVNTIik7CisKKyAgICBpbnQzMl90IGF0dGVudWF0aW9uRmFjdG9yID0gbUludGYtPmdldERyY0F0dGVudWF0aW9uRmFjdG9yKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc2lyZWQgRFJDIGF0dGVudWF0aW9uIGZhY3RvciBvZiAlZCIsIGF0dGVudWF0aW9uRmFjdG9yKTsKKyAgICB1aV9kcmNfdmFsID0gKHVuc2lnbmVkIGludClhdHRlbnVhdGlvbkZhY3RvcjsKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQ1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfZHJjX3ZhbCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQ1VUIik7CisKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SCisgICAgaW50MzJfdCBib29zdEZhY3RvciA9IG1JbnRmLT5nZXREcmNCb29zdEZhY3RvcigpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyBib29zdCBmYWN0b3Igb2YgJWQiLCBib29zdEZhY3Rvcik7CisgICAgdWlfZHJjX3ZhbCA9ICh1bnNpZ25lZCBpbnQpYm9vc3RGYWN0b3I7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0JPT1NULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfZHJjX3ZhbCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQk9PU1QiKTsKKworICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWQorICAgIGludDMyX3QgY29tcHJlc3NNb2RlID0gbUludGYtPmdldERyY0NvbXByZXNzTW9kZSgpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNyaWVkIERSQyBoZWF2eSBjb21wcmVzc2lvbiBzd2l0Y2ggb2YgJWQiLCBjb21wcmVzc01vZGUpOworICAgIHVpX2RyY192YWwgPSAodW5zaWduZWQgaW50KWNvbXByZXNzTW9kZTsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19IRUFWWV9DT01QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfZHJjX3ZhbCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfSEVBVllfQ09NUCIpOworCisgICAgLy8gQUFDX1VOSURSQ19TRVRfRUZGRUNUCisgICAgaW50MzJfdCBlZmZlY3RUeXBlID0gbUludGYtPmdldERyY0VmZmVjdFR5cGUoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgTVBFRy1EIERSQyBlZmZlY3QgdHlwZSAlZCIsIGVmZmVjdFR5cGUpOworICAgIHVpX2RyY192YWwgPSAodW5zaWduZWQgaW50KWVmZmVjdFR5cGU7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19EUkNfRUZGRUNUX1RZUEUsICZ1aV9kcmNfdmFsKTsKKworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6ZGVJbml0WEFBQ0RlY29kZXIoKSB7CisgICAgQUxPR1YoImRlSW5pdFhBQUNEZWNvZGVyIik7CisKKyAgICAvKiBFcnJvciBjb2RlICovCisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisKKyAgICBpZiAobVhoZWFhY0NvZGVjSGFuZGxlKSB7CisgICAgICAgIC8qIFRlbGwgdGhhdCB0aGUgaW5wdXQgaXMgb3ZlciBpbiB0aGlzIGJ1ZmZlciAqLworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTlBVVF9PVkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIH0KKworICAgIC8qIElycmVzcGVjdGl2ZSBvZiBlcnJvciByZXR1cm5lZCBpbiBJQV9BUElfQ01EX0lOUFVUX09WRVIsIGZyZWUgYWxsb2NhdGVkIG1lbW9yeSAqLworICAgIGZvciAodm9pZCogYnVmIDogbU1lbW9yeVZlYykgeworICAgICAgICBpZiAoYnVmKSBmcmVlKGJ1Zik7CisgICAgfQorICAgIG1NZW1vcnlWZWMuY2xlYXIoKTsKKyAgICBtWGhlYWFjQ29kZWNIYW5kbGUgPSBudWxscHRyOworCisgICAgcmV0dXJuIGVycl9jb2RlOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6ZGVJbml0TVBFR0RERHJjKCkgeworICAgIEFMT0dWKCJkZUluaXRNUEVHREREcmMiKTsKKworICAgIGZvciAodm9pZCogYnVmIDogbURyY01lbW9yeVZlYykgeworICAgICAgICBpZiAoYnVmKSBmcmVlKGJ1Zik7CisgICAgfQorICAgIG1EcmNNZW1vcnlWZWMuY2xlYXIoKTsKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjpjb25maWdYQUFDRGVjb2Rlcih1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgpIHsKKyAgICBpZiAobUlucHV0QnVmZmVyU2l6ZSA8IGluQnVmZmVyTGVuZ3RoKSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3QgY29uZmlnIEFBQywgaW5wdXQgYnVmZmVyIHNpemUgJWQgPCBpbkJ1ZmZlckxlbmd0aCAlZCIsIG1JbnB1dEJ1ZmZlclNpemUsIGluQnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvKiBDb3B5IHRoZSBidWZmZXIgcGFzc2VkIGJ5IEFuZHJvaWQgcGx1Z2luIHRvIGNvZGVjIGlucHV0IGJ1ZmZlciAqLworICAgIG1lbWNweShtSW5wdXRCdWZmZXIsIGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCk7CisKKyAgICAvKiBTZXQgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHByb2Nlc3NlZCAqLworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQnVmZmVyTGVuZ3RoKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVMiKTsKKworICAgIGlmIChtSXNDb2RlY0NvbmZpZ0ZsdXNoUmVxdWlyZWQpIHsKKyAgICAgICAgLyogSWYgY29kZWMgaXMgYWxyZWFkeSBpbml0aWFsaXplZCwgdGhlbiBHQSBoZWFkZXIgaXMgcGFzc2VkIGFnYWluICovCisgICAgICAgIC8qIE5lZWQgdG8gY2FsbCB0aGUgRmx1c2ggQVBJIGluc3RlYWQgb2YgSU5JVF9QUk9DRVNTICovCisgICAgICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSBmYWxzZTsgLyogQ29kZWMgbmVlZHMgdG8gYmUgUmVpbml0aWFsaXplZCBhZnRlciBmbHVzaCAqLworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfR0FfSERSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9HQV9IRFIiKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBwcm9jZXNzICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX1BST0NFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0lOSVRfUFJPQ0VTUyIpOworICAgIH0KKworICAgIHVpbnQzMl90IHVpX2luaXRfZG9uZTsKKyAgICAvKiBDaGVja2luZyBmb3IgZW5kIG9mIGluaXRpYWxpemF0aW9uICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0RPTkVfUVVFUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9pbml0X2RvbmUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9JTklUX0RPTkVfUVVFUlkiKTsKKworICAgIC8qIEhvdyBtdWNoIGJ1ZmZlciBpcyB1c2VkIGluIGlucHV0IGJ1ZmZlcnMgKi8KKyAgICBpbnQzMl90IGlfYnl0ZXNfY29uc3VtZWQ7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ1VSSURYX0lOUFVUX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlfYnl0ZXNfY29uc3VtZWQpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX0dFVF9DVVJJRFhfSU5QVVRfQlVGIik7CisKKyAgICBpZiAodWlfaW5pdF9kb25lKSB7CisgICAgICAgIGVycl9jb2RlID0gZ2V0WEFBQ1N0cmVhbUluZm8oKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiZ2V0WEFBQ1N0cmVhbUluZm8iKTsKKyAgICAgICAgQUxPR0koIkZvdW5kIENvZGVjIHdpdGggYmVsb3cgY29uZmlnLS0tXG5zYW1wRnJlcSAlZFxubnVtQ2hhbm5lbHMgJWRcbnBjbVdkU3ogJWRcbmNoYW5uZWxNYXNrICVkXG5vdXRwdXRGcmFtZUxlbmd0aCAlZCIsCisgICAgICAgICAgICAgICBtU2FtcEZyZXEsIG1OdW1DaGFubmVscywgbVBjbVdkU3osIG1DaGFubmVsTWFzaywgbU91dHB1dEZyYW1lTGVuZ3RoKTsKKyAgICAgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IHRydWU7CisKKyAgICAgICAgZXJyX2NvZGUgPSBjb25maWdNUEVHRERyYygpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJjb25maWdNUEVHRERyYyIpOworICAgIH0KKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjppbml0TVBFR0RERHJjKCkgeworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoV09SRDMyKTI7IGkrKykgeworICAgICAgICBXT1JEMzIgdWlfc2l6ZSwgdWlfYWxpZ25tZW50LCB1aV90eXBlOworICAgICAgICBwVk9JRCBwdl9hbGxvY19wdHI7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSBzaXplICovCisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19TSVpFLCBpLCAmdWlfc2l6ZSk7CisKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSIpOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgYWxpZ25tZW50ICovCisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5ULCBpLCAmdWlfYWxpZ25tZW50KTsKKworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQiKTsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IHR5cGUgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUsIGksICZ1aV90eXBlKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSIpOworCisgICAgICAgIHB2X2FsbG9jX3B0ciA9IG1lbWFsaWduKDQsIHVpX3NpemUpOworICAgICAgICBpZiAocHZfYWxsb2NfcHRyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1EcmNNZW1vcnlWZWMucHVzaChwdl9hbGxvY19wdHIpOworCisgICAgICAgIC8qIFNldCB0aGUgYnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIGksIHB2X2FsbG9jX3B0cik7CisKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOworICAgIH0KKworICAgIFdPUkQzMiB1aV9zaXplOworICAgIHVpX3NpemUgPSA4MTkyICogMjsKKworICAgIG1EcmNJbkJ1ZiA9IChpbnQ4X3QqKW1lbWFsaWduKDQsIHVpX3NpemUpOworICAgIGlmIChtRHJjSW5CdWYgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKyAgICBtRHJjTWVtb3J5VmVjLnB1c2gobURyY0luQnVmKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCAyLCBtRHJjSW5CdWYpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKworICAgIG1EcmNPdXRCdWYgPSAoaW50OF90KiltZW1hbGlnbig0LCB1aV9zaXplKTsKKyAgICBpZiAobURyY091dEJ1ZiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorICAgIG1EcmNNZW1vcnlWZWMucHVzaChtRHJjT3V0QnVmKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCAzLCBtRHJjT3V0QnVmKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CitpbnQgQzJTb2Z0WGFhY0RlYzo6Y29uZmlnTVBFR0REcmMoKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisgICAgaW50IGlfZWZmZWN0X3R5cGU7CisgICAgaW50IGlfbG91ZF9ub3JtOworICAgIGludCBpX3RhcmdldF9sb3VkbmVzczsKKyAgICB1bnNpZ25lZCBpbnQgaV9zYnJfbW9kZTsKKyAgICB1aW50MzJfdCB1aV9wcm9jX21lbV90YWJzX3NpemUgPSAwOworICAgIHBWT0lEIHB2X2FsbG9jX3B0ciA9IE5VTEw7CisKKyAgICAvKiBTYW1wbGluZyBGcmVxdWVuY3kgKi8KKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fU0FNUF9GUkVRLCAmbVNhbXBGcmVxKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9TQU1QX0ZSRVEiKTsKKyAgICAvKiBUb3RhbCBOdW1iZXIgb2YgQ2hhbm5lbHMgKi8KKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fTlVNX0NIQU5ORUxTLCAmbU51bUNoYW5uZWxzKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMiKTsKKworICAgIC8qIFBDTSB3b3JkIHNpemUgICovCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX1BDTV9XRFNaLCAmbVBjbVdkU3opOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX1BDTV9XRFNaIik7CisKKyAgICAvKlNldCBFZmZlY3QgVHlwZSovCisKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfRUZGRUNUX1RZUEUsICZpX2VmZmVjdF90eXBlKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VGRkVDVF9UWVBFIik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfRFJDX0VGRkVDVF9UWVBFLCAmaV9lZmZlY3RfdHlwZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfRFJDX0VGRkVDVF9UWVBFIik7CisKKyAgICAvKlNldCB0YXJnZXQgbG91ZG5lc3MgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xPVURORVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaV90YXJnZXRfbG91ZG5lc3MpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xPVURORVNTIik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfRFJDX1RBUkdFVF9MT1VETkVTUywgJmlfdGFyZ2V0X2xvdWRuZXNzKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19EUkNfVEFSR0VUX0xPVURORVNTIik7CisKKyAgICAvKlNldCBsb3VkX25vcm1fZmxhZyovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0xPVURfTk9STSwgJmlfbG91ZF9ub3JtKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0xPVURfTk9STSIpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0RSQ19MT1VEX05PUk0sICZpX2xvdWRfbm9ybSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfRFJDX0xPVURfTk9STSIpOworCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fU0JSX01PREUsICZpX3Nicl9tb2RlKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fU0JSX01PREUiKTsKKworICAgIC8qIEdldCBtZW1vcnkgaW5mbyB0YWJsZXMgc2l6ZSAqLworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1UQUJTX1NJWkUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfcHJvY19tZW1fdGFic19zaXplKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1UQUJTX1NJWkUiKTsKKworICAgIHB2X2FsbG9jX3B0ciA9IG1lbWFsaWduKDQsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisgICAgaWYgKHB2X2FsbG9jX3B0ciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbWVtc2V0KHB2X2FsbG9jX3B0ciwgMCwgdWlfcHJvY19tZW1fdGFic19zaXplKTsKKyAgICBtTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKKworICAgIC8qIFNldCBwb2ludGVyIGZvciBwcm9jZXNzIG1lbW9yeSB0YWJsZXMgKi8KKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNVEFCU19QVFIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdl9hbGxvY19wdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSIik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9BUElfUE9TVF9DT05GSUdfUEFSQU1TLCBudWxscHRyKTsKKworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUyIpOworCisgICAgLyogRnJlZSBhbnkgbWVtb3J5IHRoYXQgaXMgYWxsb2NhdGVkIGZvciBNUEVHIEQgRHJjIHNvIGZhciAqLworICAgIGRlSW5pdE1QRUdERERyYygpOworCisgICAgZXJyX2NvZGUgPSBpbml0TVBFR0RERHJjKCk7CisgICAgaWYgKGVycl9jb2RlICE9IElBX05PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJpbml0TVBFR0RERHJjIGZhaWxlZCB3aXRoIGVycm9yICVkIiwgZXJyX2NvZGUpOworICAgICAgICBkZUluaXRNUEVHREREcmMoKTsKKyAgICAgICAgcmV0dXJuIGVycl9jb2RlOworICAgIH0KKworICAgIC8qIERSQyBidWZmZXJzCisgICAgICAgIGJ1ZlswXSAtIGNvbnRhaW5zIGV4dGVuc2lvbiBlbGVtZW50IHBheSBsb2FkIGxvdWRuZXNzIHJlbGF0ZWQKKyAgICAgICAgYnVmWzFdIC0gY29udGFpbnMgZXh0ZW5zaW9uIGVsZW1lbnQgcGF5IGxvYWQqLworICAgIHsKKyAgICAgICAgVk9JRCogcF9hcnJheVsyXVsxNl07CisgICAgICAgIFdPUkQzMiBpaTsKKyAgICAgICAgV09SRDMyIGJ1Zl9zaXplc1syXVsxNl07CisgICAgICAgIFdPUkQzMiBudW1fZWxlbWVudHM7CisgICAgICAgIFdPUkQzMiBudW1fY29uZmlnX2V4dDsKKyAgICAgICAgV09SRDMyIGJpdF9zdHJfZm10ID0gMTsKKworICAgICAgICBXT1JEMzIgdW9fbnVtX2NoYW47CisKKyAgICAgICAgbWVtc2V0KGJ1Zl9zaXplcywgMCwgMzIgKiBzaXplb2YoV09SRDMyKSk7CisKKyAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0VYVF9FTEVfQlVGX1NJWkVTLCAmYnVmX3NpemVzWzBdWzBdKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0VYVF9FTEVfQlVGX1NJWkVTIik7CisKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0VYVF9FTEVfUFRSLCAmcF9hcnJheSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19FWFRfRUxFX1BUUiIpOworCisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULCBJQV9DTURfVFlQRV9JTklUX1NFVF9CVUZGX1BUUiwgbnVsbHB0cik7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfU0VUX0JVRkZfUFRSIik7CisKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX05VTV9FTEUsICZudW1fZWxlbWVudHMpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfTlVNX0VMRSIpOworCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19OVU1fQ09ORklHX0VYVCwgJm51bV9jb25maWdfZXh0KTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX05VTV9DT05GSUdfRVhUIik7CisKKyAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgbnVtX2NvbmZpZ19leHQ7IGlpKyspIHsKKyAgICAgICAgICAgIC8qY29weSBsb3VkbmVzcyBiaXRzdHJlYW0qLworICAgICAgICAgICAgaWYgKGJ1Zl9zaXplc1swXVtpaV0gPiAwKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KG1EcmNJbkJ1ZiwgcF9hcnJheVswXVtpaV0sIGJ1Zl9zaXplc1swXVtpaV0pOworCisgICAgICAgICAgICAgICAgLypTZXQgYml0c3RyZWFtX3NwbGl0X2Zvcm1hdCAqLworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCwgJmJpdF9zdHJfZm10KTsKKyAgICAgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCIpOworCisgICAgICAgICAgICAgICAgLyogU2V0IG51bWJlciBvZiBieXRlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVNfSUxfQlMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmX3NpemVzWzBdW2lpXSk7CisgICAgICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVNfSUxfQlMiKTsKKworICAgICAgICAgICAgICAgIC8qIEV4ZWN1dGUgcHJvY2VzcyAqLworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0NQWV9JTF9CU0ZfQlVGRiwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9DUFlfSUxfQlNGX0JVRkYiKTsKKworICAgICAgICAgICAgICAgIG1EUkNGbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IG51bV9lbGVtZW50czsgaWkrKykgeworICAgICAgICAgICAgLypjb3B5IGNvbmZpZyBiaXRzdHJlYW0qLworICAgICAgICAgICAgaWYgKGJ1Zl9zaXplc1sxXVtpaV0gPiAwKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KG1EcmNJbkJ1ZiwgcF9hcnJheVsxXVtpaV0sIGJ1Zl9zaXplc1sxXVtpaV0pOworICAgICAgICAgICAgICAgIC8qIFNldCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCisKKyAgICAgICAgICAgICAgICAvKlNldCBiaXRzdHJlYW1fc3BsaXRfZm9ybWF0ICovCisgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFULCAmYml0X3N0cl9mbXQpOworICAgICAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFUIik7CisKKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVNfSUNfQlMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmX3NpemVzWzFdW2lpXSk7CisgICAgICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVNfSUNfQlMiKTsKKworICAgICAgICAgICAgICAgIC8qIEV4ZWN1dGUgcHJvY2VzcyAqLworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0NQWV9JQ19CU0ZfQlVGRiwgbnVsbHB0cik7CisKKyAgICAgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9DTURfVFlQRV9JTklUX0NQWV9JQ19CU0ZfQlVGRiIpOworCisgICAgICAgICAgICAgICAgbURSQ0ZsYWcgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1EUkNGbGFnID09IDEpIHsKKyAgICAgICAgICAgIG1NcGVnRERSQ1ByZXNlbnQgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU1wZWdERFJDUHJlc2VudCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKlJlYWQgaW50ZXJmYWNlIGJ1ZmZlciBjb25maWcgZmlsZSBiaXRzdHJlYW0qLworICAgICAgICBpZiAobU1wZWdERFJDUHJlc2VudCA9PSAxKSB7CisgICAgICAgICAgICBXT1JEMzIgaW50ZXJmYWNlX2lzX3ByZXNlbnQgPSAxOworCisgICAgICAgICAgICBpZiAoaV9zYnJfbW9kZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGlfc2JyX21vZGUgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSAyMDQ4OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaV9zYnJfbW9kZSA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRGcmFtZUxlbmd0aCA9IDQwOTY7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dEZyYW1lTGVuZ3RoID0gMTAyNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1PdXRwdXRGcmFtZUxlbmd0aCA9IDQwOTY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0ZSQU1FX1NJWkUsIChXT1JEMzIgKikmbU91dHB1dEZyYW1lTGVuZ3RoKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0ZSQU1FX1NJWkUiKTsKKworICAgICAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0lOVF9QUkVTRU5ULCAmaW50ZXJmYWNlX2lzX3ByZXNlbnQpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fSU5UX1BSRVNFTlQiKTsKKworICAgICAgICAgICAgLyogRXhlY3V0ZSBwcm9jZXNzICovCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0NQWV9JTl9CU0ZfQlVGRiwgbnVsbHB0cik7CisgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9DTURfVFlQRV9JTklUX0NQWV9JTl9CU0ZfQlVGRiIpOworCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX1BST0NFU1MsIG51bGxwdHIpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9QUk9DRVNTIik7CisKKyAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUywgJnVvX251bV9jaGFuKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUyIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVycl9jb2RlOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6ZGVjb2RlWEFBQ1N0cmVhbSh1aW50OF90KiBpbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnl0ZXNDb25zdW1lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIG91dEJ5dGVzKSB7CisgICAgaWYgKG1JbnB1dEJ1ZmZlclNpemUgPCBpbkJ1ZmZlckxlbmd0aCkgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGNvbmZpZyBBQUMsIGlucHV0IGJ1ZmZlciBzaXplICVkIDwgaW5CdWZmZXJMZW5ndGggJWQiLCBtSW5wdXRCdWZmZXJTaXplLCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLyogQ29weSB0aGUgYnVmZmVyIHBhc3NlZCBieSBBbmRyb2lkIHBsdWdpbiB0byBjb2RlYyBpbnB1dCBidWZmZXIgKi8KKyAgICBtZW1jcHkobUlucHV0QnVmZmVyLCBpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworCisgICAgLyogU2V0IG51bWJlciBvZiBieXRlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJ1ZmZlckxlbmd0aCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTIik7CisKKyAgICAvKiBFeGVjdXRlIHByb2Nlc3MgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0VYRUNVVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0RPX0VYRUNVVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9ET19FWEVDVVRFIik7CisKKyAgICAvKiBDaGVja2luZyBmb3IgZW5kIG9mIHByb2Nlc3NpbmcgKi8KKyAgICB1aW50MzJfdCB1aV9leGVjX2RvbmU7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9FWEVDVVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9ET05FX1FVRVJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfZXhlY19kb25lKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfRE9ORV9RVUVSWSIpOworCisgICAgaWYgKHVpX2V4ZWNfZG9uZSAhPSAxKSB7CisgICAgICAgIFZPSUQqIHBfYXJyYXk7ICAgICAgICAvLyBJVFRJQU06YnVmZmVyIHRvIGhhbmRsZSBnYWluIHBheWxvYWQKKyAgICAgICAgV09SRDMyIGJ1Zl9zaXplID0gMDsgIC8vIElUVElBTTpnYWluIHBheWxvYWQgbGVuZ3RoCisgICAgICAgIFdPUkQzMiBiaXRfc3RyX2ZtdCA9IDE7CisgICAgICAgIFdPUkQzMiBnYWluX3N0cmVhbV9mbGFnID0gMTsKKworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfR0FJTl9QQVlMT0FEX0xFTiwgJmJ1Zl9zaXplKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0dBSU5fUEFZTE9BRF9MRU4iKTsKKworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfR0FJTl9QQVlMT0FEX0JVRiwgJnBfYXJyYXkpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfR0FJTl9QQVlMT0FEX0JVRiIpOworCisgICAgICAgIGlmIChidWZfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIC8qU2V0IGJpdHN0cmVhbV9zcGxpdF9mb3JtYXQgKi8KKyAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFULCAmYml0X3N0cl9mbXQpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQiKTsKKworICAgICAgICAgICAgbWVtY3B5KG1EcmNJbkJ1ZiwgcF9hcnJheSwgYnVmX3NpemUpOworICAgICAgICAgICAgLyogU2V0IG51bWJlciBvZiBieXRlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTX0JTLCAwLCAmYnVmX3NpemUpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQiKTsKKworICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfR0FJTl9TVFJFQU1fRkxBRywgJmdhaW5fc3RyZWFtX2ZsYWcpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQiKTsKKworICAgICAgICAgICAgLyogRXhlY3V0ZSBwcm9jZXNzICovCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0NQWV9CU0ZfQlVGRiwgbnVsbHB0cik7CisgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCIpOworCisgICAgICAgICAgICBtTXBlZ0REUkNQcmVzZW50ID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEhvdyBtdWNoIGJ1ZmZlciBpcyB1c2VkIGluIGlucHV0IGJ1ZmZlcnMgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DVVJJRFhfSU5QVVRfQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc0NvbnN1bWVkKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfQ1VSSURYX0lOUFVUX0JVRiIpOworCisgICAgLyogR2V0IHRoZSBvdXRwdXQgYnl0ZXMgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9PVVRQVVRfQllURVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ5dGVzKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfT1VUUFVUX0JZVEVTIik7CisKKyAgICBpZiAobU1wZWdERFJDUHJlc2VudCA9PSAxKSB7CisgICAgICAgIG1lbWNweShtRHJjSW5CdWYsIG1PdXRwdXRCdWZmZXIsICpvdXRCeXRlcyk7CisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUywgMCwgb3V0Qnl0ZXMpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUyIpOworCisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9FWEVDVVRFLCBJQV9DTURfVFlQRV9ET19FWEVDVVRFLCBudWxscHRyKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfRE9fRVhFQ1VURSIpOworCisgICAgICAgIG1lbWNweShtT3V0cHV0QnVmZmVyLCBtRHJjT3V0QnVmLCAqb3V0Qnl0ZXMpOworICAgIH0KKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjpnZXRYQUFDU3RyZWFtSW5mbygpIHsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKworICAgIC8qIFNhbXBsaW5nIGZyZXF1ZW5jeSAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NBTVBfRlJFUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1TYW1wRnJlcSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9TQU1QX0ZSRVEiKTsKKworICAgIC8qIFRvdGFsIE51bWJlciBvZiBDaGFubmVscyAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1OdW1DaGFubmVscyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMiKTsKKyAgICBpZiAobU51bUNoYW5uZWxzID4gTUFYX0NIQU5ORUxfQ09VTlQpIHsKKyAgICAgICAgQUxPR0UoIiBObyBvZiBjaGFubmVscyBhcmUgbW9yZSB0aGFuIG1heCBjaGFubmVsc1xuIik7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQQ00gd29yZCBzaXplICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fUENNX1dEU1osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtUGNtV2RTeik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9QQ01fV0RTWiIpOworICAgIGlmICgobVBjbVdkU3ogLyA4KSAhPSAyKSB7CisgICAgICAgIEFMT0dFKCIgTm8gb2YgY2hhbm5lbHMgYXJlIG1vcmUgdGhhbiBtYXggY2hhbm5lbHNcbiIpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorCisgICAgLyogY2hhbm5lbCBtYXNrIHRvIHRlbGwgdGhlIGFycmFuZ2VtZW50IG9mIGNoYW5uZWxzIGluIGJpdCBzdHJlYW0gKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ2hhbm5lbE1hc2spOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fQ0hBTk5FTF9NQVNLIik7CisKKyAgICAvKiBDaGFubmVsIG1vZGUgdG8gdGVsbCBNT05PL1NURVJFTy9EVUFMLU1PTk8vTk9ORV9PRl9USEVTRSAqLworICAgIHVpbnQzMl90IHVpX2NoYW5uZWxfbW9kZTsKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9DSEFOTkVMX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9jaGFubmVsX21vZGUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fQ0hBTk5FTF9NT0RFIik7CisgICAgaWYgKHVpX2NoYW5uZWxfbW9kZSA9PSAwKQorICAgICAgICBBTE9HVigiQ2hhbm5lbCBNb2RlOiBNT05PX09SX1BTXG4iKTsKKyAgICBlbHNlIGlmICh1aV9jaGFubmVsX21vZGUgPT0gMSkKKyAgICAgICAgQUxPR1YoIkNoYW5uZWwgTW9kZTogU1RFUkVPXG4iKTsKKyAgICBlbHNlIGlmICh1aV9jaGFubmVsX21vZGUgPT0gMikKKyAgICAgICAgQUxPR1YoIkNoYW5uZWwgTW9kZTogRFVBTC1NT05PXG4iKTsKKyAgICBlbHNlCisgICAgICAgIEFMT0dWKCJDaGFubmVsIE1vZGU6IE5PTkVfT0ZfVEhFU0Ugb3IgTVVMVElDSEFOTkVMXG4iKTsKKworICAgIC8qIENoYW5uZWwgbW9kZSB0byB0ZWxsIFNCUiBQUkVTRU5UL05PVF9QUkVTRU5UICovCisgICAgdWludDMyX3QgdWlfc2JyX21vZGU7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fU0JSX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9zYnJfbW9kZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9TQlJfTU9ERSIpOworICAgIGlmICh1aV9zYnJfbW9kZSA9PSAwKQorICAgICAgICBBTE9HVigiU0JSIE1vZGU6IE5PVF9QUkVTRU5UXG4iKTsKKyAgICBlbHNlIGlmICh1aV9zYnJfbW9kZSA9PSAxKQorICAgICAgICBBTE9HVigiU0JSIE1vZGU6IFBSRVNFTlRcbiIpOworICAgIGVsc2UKKyAgICAgICAgQUxPR1YoIlNCUiBNb2RlOiBJTExFR0FMXG4iKTsKKworICAgIC8qIG1PdXRwdXRGcmFtZUxlbmd0aCA9IDEwMjQgKiAoMSArIFNCUl9NT0RFKSBmb3IgQUFDICovCisgICAgLyogRm9yIFVTQUMgaXQgY291bGQgYmUgMTAyNCAqIDMgLCBzdXBwb3J0IHRvIHF1ZXJ5ICAqLworICAgIC8qIG5vdCB5ZXQgYWRkZWQgaW4gY29kZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSAxMDI0ICogKDEgKyB1aV9zYnJfbW9kZSk7CisgICAgQUxPR0koIm1PdXRwdXRGcmFtZUxlbmd0aCAlZCB1aV9zYnJfbW9kZSAlZCIsIG1PdXRwdXRGcmFtZUxlbmd0aCwgdWlfc2JyX21vZGUpOworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6c2V0WEFBQ0RSQ0luZm8oaW50MzJfdCBkcmNDdXQsIGludDMyX3QgZHJjQm9vc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkcmNSZWZMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRyY0hlYXZ5Q29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkckVmZmVjdFR5cGUpIHsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKworICAgIGludDMyX3QgdWlfZHJjX2VuYWJsZSA9IDE7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VOQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2RyY19lbmFibGUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfRU5BQkxFIik7CisgICAgaWYgKGRyY0N1dCAhPSAtMSkgeworICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0NVVCwgJmRyY0N1dCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQ1VUIik7CisgICAgfQorCisgICAgaWYgKGRyY0Jvb3N0ICE9IC0xKSB7CisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaSgKKyAgICAgICAgICAgIG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19CT09TVCwgJmRyY0Jvb3N0KTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19CT09TVCIpOworICAgIH0KKworICAgIGlmIChkcmNSZWZMZXZlbCAhPSAtMSkgeworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkoCisgICAgICAgICAgICBtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xFVkVMLCAmZHJjUmVmTGV2ZWwpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19UQVJHRVRfTEVWRUwiKTsKKyAgICB9CisKKyAgICBpZiAoZHJjUmVmTGV2ZWwgIT0gLTEpIHsKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKAorICAgICAgICAgICAgbVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19EUkNfVEFSR0VUX0xPVURORVNTLCAmZHJjUmVmTGV2ZWwpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19EUkNfVEFSR0VUX0xPVURORVNTIik7CisgICAgfQorCisgICAgaWYgKGRyY0hlYXZ5Q29tcHJlc3Npb24gIT0gLTEpIHsKKyAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19IRUFWWV9DT01QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHJjSGVhdnlDb21wcmVzc2lvbik7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0hFQVZZX0NPTVAiKTsKKyAgICB9CisKKyAgICBlcnJfY29kZSA9CisgICAgICAgIGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfRFJDX0VGRkVDVF9UWVBFLCAmZHJFZmZlY3RUeXBlKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19EUkNfRUZGRUNUX1RZUEUiKTsKKworICAgIGludDMyX3QgaV9lZmZlY3RfdHlwZSwgaV90YXJnZXRfbG91ZG5lc3MsIGlfbG91ZF9ub3JtOworICAgIC8qU2V0IEVmZmVjdCBUeXBlKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfRUZGRUNUX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpX2VmZmVjdF90eXBlKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VGRkVDVF9UWVBFIik7CisKKyAgICBlcnJfY29kZSA9CisgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfRUZGRUNUX1RZUEUsICZpX2VmZmVjdF90eXBlKTsKKworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgLypTZXQgdGFyZ2V0IGxvdWRuZXNzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKAorICAgICAgICBtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19UQVJHRVRfTE9VRE5FU1MsICZpX3RhcmdldF9sb3VkbmVzcyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19UQVJHRVRfTE9VRE5FU1MiKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfVEFSR0VUX0xPVURORVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlfdGFyZ2V0X2xvdWRuZXNzKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19EUkNfVEFSR0VUX0xPVURORVNTIik7CisKKyAgICAvKlNldCBsb3VkX25vcm1fZmxhZyovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0xPVURfTk9STSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlfbG91ZF9ub3JtKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0xPVURfTk9STSIpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0RSQ19MT1VEX05PUk0sICZpX2xvdWRfbm9ybSk7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19EUkNfTE9VRF9OT1JNIik7CisKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKK2NsYXNzIEMyU29mdFhhYWNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0WGFhY0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRYYWFjRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0WGFhY0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRYYWFjRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0WGFhY0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFhhYWNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRYYWFjRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQzJTb2Z0WGFhY0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjODU2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1hBQUNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9YQUFDX0RFQ19IXworI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJpeGhlYWFjZF90eXBlX2RlZi5oIgorI2luY2x1ZGUgIml4aGVhYWNkX2Vycm9yX3N0YW5kYXJkcy5oIgorI2luY2x1ZGUgIml4aGVhYWNkX2Vycm9yX2hhbmRsZXIuaCIKKyNpbmNsdWRlICJpeGhlYWFjZF9hcGljbWRfc3RhbmRhcmRzLmgiCisjaW5jbHVkZSAiaXhoZWFhY2RfbWVtb3J5X3N0YW5kYXJkcy5oIgorI2luY2x1ZGUgIml4aGVhYWNkX2FhY19jb25maWcuaCIKKworI2luY2x1ZGUgImltcGRfYXBpY21kX3N0YW5kYXJkcy5oIgorI2luY2x1ZGUgImltcGRfZHJjX2NvbmZpZ19wYXJhbXMuaCIKKworI2RlZmluZSBNQVhfQ0hBTk5FTF9DT1VOVCAgICAgICAgICAgOCAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgdGhhdCBjYW4gYmUgZGVjb2RlZCAqLworI2RlZmluZSBNQVhfTlVNX0JMT0NLUyAgICAgICAgICAgICAgOCAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gYmxvY2tzIHRoYXQgY2FuIGJlIGRlY29kZWQgKi8KKworZXh0ZXJuICJDIiBJQV9FUlJPUkNPREUgaXhoZWFhY2RfZGVjX2FwaShwVk9JRCBwX2lhX21vZHVsZV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICBXT1JEMzIgaV9jbWQsIFdPUkQzMiBpX2lkeCwgcFZPSUQgcHZfdmFsdWUpOworZXh0ZXJuICJDIiBJQV9FUlJPUkNPREUgaWFfZHJjX2RlY19hcGkocFZPSUQgcF9pYV9tb2R1bGVfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgV09SRDMyIGlfY21kLCBXT1JEMzIgaV9pZHgsIHBWT0lEIHB2X3ZhbHVlKTsKK2V4dGVybiAiQyIgIElBX0VSUk9SQ09ERSBpeGhlYWFjZF9nZXRfY29uZmlnX3BhcmFtKHBWT0lEIHBfaWFfcHJvY2Vzc19hcGlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdPUkQzMiBwaV9zYW1wX2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV09SRDMyIHBpX251bV9jaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdPUkQzMiBwaV9wY21fd2Rfc3osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV09SRDMyIHBpX2NoYW5uZWxfbWFzayk7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdFhhYWNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0WGFhY0RlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0WGFhY0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga091dHB1dERyYWluQnVmZmVyU2l6ZSAgICAgID0gMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5UICogTUFYX05VTV9CTE9DS1MsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdm9pZCogbVhoZWFhY0NvZGVjSGFuZGxlOworICAgIHZvaWQqIG1NcGVnRERyY0hhbmRsZTsKKyAgICB1aW50MzJfdCBtSW5wdXRCdWZmZXJTaXplOworICAgIHVpbnQzMl90IG1PdXRwdXRGcmFtZUxlbmd0aDsKKyAgICBpbnQ4X3QqIG1JbnB1dEJ1ZmZlcjsKKyAgICBpbnQ4X3QqIG1PdXRwdXRCdWZmZXI7CisgICAgaW50MzJfdCBtU2FtcEZyZXE7CisgICAgaW50MzJfdCBtTnVtQ2hhbm5lbHM7CisgICAgaW50MzJfdCBtUGNtV2RTejsKKyAgICBpbnQzMl90IG1DaGFubmVsTWFzazsKKyAgICBpbnQzMl90IG1OdW1PdXRCeXRlczsKKyAgICB1aW50NjRfdCBtQ3VyRnJhbWVJbmRleDsKKyAgICB1aW50NjRfdCBtQ3VyVGltZXN0YW1wOworICAgIGJvb2wgbUlzQ29kZWNJbml0aWFsaXplZDsKKyAgICBib29sIG1Jc0NvZGVjQ29uZmlnRmx1c2hSZXF1aXJlZDsKKyAgICBpbnQ4X3QqIG1EcmNJbkJ1ZjsKKyAgICBpbnQ4X3QqIG1EcmNPdXRCdWY7CisgICAgaW50MzJfdCBtTXBlZ0REUkNQcmVzZW50OworICAgIGludDMyX3QgbURSQ0ZsYWc7CisKKyAgICBWZWN0b3I8dm9pZCo+IG1NZW1vcnlWZWM7CisgICAgVmVjdG9yPHZvaWQqPiBtRHJjTWVtb3J5VmVjOworCisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50IF9fdW51c2VkOworICAgIHNpemVfdCBtT3V0cHV0QnVmZmVyQ291bnQgX191bnVzZWQ7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGNoYXIqIG1PdXRwdXREcmFpbkJ1ZmZlcjsKKyAgICB1aW50MzJfdCBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvczsKKworICAgIElBX0VSUk9SQ09ERSBpbml0RGVjb2RlcigpOworICAgIElBX0VSUk9SQ09ERSBzZXREcmNQYXJhbWV0ZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgY29uZmlnZmx1c2hEZWNvZGUoKTsKKyAgICBJQV9FUlJPUkNPREUgZHJhaW5EZWNvZGVyKCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKTsKKworICAgIElBX0VSUk9SQ09ERSBpbml0WEFBQ0RyYygpOworICAgIElBX0VSUk9SQ09ERSBpbml0WEFBQ0RlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgaW5pdE1QRUdERERyYygpOworICAgIElBX0VSUk9SQ09ERSBkZUluaXRNUEVHREREcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgY29uZmlnWEFBQ0RlY29kZXIodWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoKTsKKyAgICBpbnQgY29uZmlnTVBFR0REcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgZGVjb2RlWEFBQ1N0cmVhbSh1aW50OF90KiBpbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBieXRlc0NvbnN1bWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIG91dEJ5dGVzKTsKKyAgICBJQV9FUlJPUkNPREUgZ2V0WEFBQ1N0cmVhbUluZm8oKTsKKyAgICBJQV9FUlJPUkNPREUgc2V0WEFBQ0RSQ0luZm8oaW50MzJfdCBkcmNDdXQsIGludDMyX3QgZHJjQm9vc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHJjUmVmTGV2ZWwsIGludDMyX3QgZHJjSGVhdnlDb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkckVmZmVjdFR5cGUpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0WGFhY0RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEMyX1NPRlRfWEFBQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb3JlL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlODk5NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0OCBAQAorY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGliY29kZWMyX2hlYWRlcnMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAorCisgICAgc3JjczogWyJDMi5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfaGVhZGVycyIsCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnV0aWxzX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfaGVhZGVycyIsCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnV0aWxzX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiBmYWxzZSwgLy8gdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiBmYWxzZSwgLy8gdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9DMi5jcHAgYi9tZWRpYS9jb2RlYzIvY29yZS9DMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5ZDRlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL0MyLmNwcApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPEMyLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKworLyoqCisgKiBUaGVyZSBpcyBub3RoaW5nIGhlcmUgeWV0LiBUaGlzIGxpYnJhcnkgaXMgYnVpbHQgdG8gc2VlIHdoYXQgc3ltYm9scyBhbmQgbWV0aG9kcyBnZXQKKyAqIGRlZmluZWQgYXMgcGFydCBvZiB0aGUgQVBJIGluY2x1ZGUgZmlsZXMuCisgKgorICogR29pbmcgZm9yd2FyZCwgdGhlIENvZGVjMiBsaWJyYXJ5IHdpbGwgY29udGFpbiB1dGlsaXR5IG1ldGhvZHMgdGhhdCBhcmUgdXNlZnVsIGZvcgorICogQ29kZWMyIGNsaWVudHMuCisgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYzNDY2ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzIuaApAQCAtMCwwICsxLDU1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJfSF8KKyNkZWZpbmUgQzJfSF8KKworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKy8qKiBuYW5vc2Vjb25kcyB3aXRoIGFyYml0cmFyeSBvcmlnaW4uICovCit0eXBlZGVmIGludDY0X3QgYzJfbnNlY3NfdDsKKworLyoqIFxtYWlucGFnZSBDb2RlYzIKKyAqCisgKiBDb2RlYzIgaXMgYSBnZW5lcmljIGZyYW1lLWJhc2VkIGRhdGEgcHJvY2Vzc2luZyBBUEkuCisgKgorICogVGhlIG1lZGlhIHN1YnN5c3RlbSBhY2Nlc3NlcyBjb21wb25lbnRzIHZpYSB0aGUgXHJlZiBBUEkuCisgKi8KKworLyoqIFxpbmdyb3VwIEFQSQorICoKKyAqIFRoZSBDb2RlYzIgQVBJIGRlZmluZXMgdGhlIG9wZXJhdGlvbiBvZiBkYXRhIHByb2Nlc3NpbmcgY29tcG9uZW50cyBhbmQgdGhlaXIgaW50ZXJhY3Rpb24gd2l0aAorICogdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbS4KKyAqCisgKiBDb2RpbmcgQ29udmVudGlvbnMKKyAqCisgKiBNaXRpZ2F0aW5nIEJpbmFyeSBDb21wYXRpYmlsaXR5LgorICoKKyAqIFdoaWxlIGZ1bGwgYmluYXJ5IGNvbXBhdGliaWxpdHkgaXMgbm90IGEgZ29hbCBvZiB0aGUgQVBJIChkdWUgdG8gb3VyIHVzZSBvZiBTVEwpLCB3ZSB0cnkgdG8KKyAqIG1pdGlnYXRlIGJpbmFyeSBicmVha3MgYnkgYWRoZXJpbmcgdG8gdGhlIGZvbGxvd2luZyBjb252ZW50aW9uczoKKyAqCisgKiAtIGF0IG1vc3Qgb25lIHZ0YWJsZSB3aXRoIHBsYWNlaG9sZGVyIHZpcnR1YWwgbWV0aG9kcworICogLSBhbGwgb3B0aW9uYWwvcGxhY2Vob2xkZXIgdmlydHVhbCBtZXRob2RzIHJldHVybmluZyBhIGMyX3N0YXR1c190LCB3aXRoIEMyX09NSVRURUQgbm90IHJlcXVpcmluZworICogICBhbnkgdXBkYXRlIHRvIGlucHV0L291dHB1dCBhcmd1bWVudHMuCisgKiAtIGxpbWl0aW5nIHN5bWJvbCBleHBvcnQgb2YgaW5saW5lIG1ldGhvZHMKKyAqIC0gdXNlIG9mIHBpbXBsIChvciBzaGFyZWQtcGltcGwpCisgKgorICogTmFtaW5nCisgKgorICogLSBhbGwgY2xhc3NlcyBhbmQgdHlwZXMgcHJlZml4IHdpdGggQzIKKyAqIC0gY2xhc3NlcyBmb3IgaW50ZXJuYWwgdXNlIHByZWZpeCB3aXRoIF9DMgorICogLSBlbnVtIHZhbHVlcyBpbiBnbG9iYWwgbmFtZXNwYWNlIHByZWZpeCB3aXRoIEMyXyBhbGwgY2FwcworICogLSBlbnVtIHZhbHVlcyBpbnNpZGUgY2xhc3NlcyBoYXZlIG5vIEMyXyBwcmVmaXggYXMgY2xhc3MgYWxyZWFkeSBoYXMgaXQKKyAqIC0gc3VwcG9ydGluZyB0d28ga2luZHMgb2YgZW51bSBuYW1pbmc6IGFsbC1jYXBzIGFuZCBrQ2FtZWxDYXNlCisgKiBcdG9kbyByZXZpc2l0IGtDYW1lbENhc2UgZm9yIHBhcmFtLXR5cGUKKyAqCisgKiBBc3BlY3RzCisgKgorICogQXNwZWN0cyBkZWZpbmUgY2VydGFpbiBjb21tb24gYmVoYXZpb3IgYWNyb3NzIGEgZ3JvdXAgb2Ygb2JqZWN0cy4KKyAqIC0gY2xhc3NlcyB3aG9zZSBuYW1lIG1hdGNoZXMgX0MyLipBc3BlY3QKKyAqIC0gb25seSBwcm90ZWN0ZWQgY29uc3RydWN0b3JzCisgKiAtIG5vIGRlc2N0cnVjdG9yIGFuZCBjb3BpYWJsZQorICogLSBhbGwgbWV0aG9kcyBhcmUgaW5saW5lIG9yIHN0YXRpYyAodGhpcyBpcyBvcHBvc2l0ZSBvZiB0aGUgaW50ZXJmYWNlIHBhcmFkaWdtIHdoZXJlIGFsbCBtZXRob2RzCisgKiAgIGFyZSB2aXJ0dWFsLCB3aGljaCB3b3VsZCBub3Qgd29yayBkdWUgdG8gdGhlIGF0IG1vc3Qgb25lIHZ0YWJsZSBydWxlLikKKyAqIC0gb25seSBwcml2YXRlIHZhcmlhYmxlcyAodGhpcyBwcmV2ZW50cyBzdWJjbGFzc2VzIGludGVyZmVyaW5nIHdpdGggdGhlIGFzcGVjdHMuKQorICovCisKKy8vLyBcZGVmZ3JvdXAgdHlwZXMgQ29tbW9uIFR5cGVzCisvLy8gQHsKKworLyoqCisgKiBDMlN0cmluZzogYmFzaWMgc3RyaW5nIGltcGxlbWVudGF0aW9uCisgKi8KK3R5cGVkZWYgc3RkOjpzdHJpbmcgQzJTdHJpbmc7CisKKy8qKgorICogQzJTdHJpbmdMaXRlcmFsOiBiYXNpYyBzdHJpbmcgbGl0ZXJhbCBpbXBsZW1lbnRhdGlvbi4KKyAqIFxub3RlIHRoZXNlIGFyZSBuZXZlciBvd25lZCBieSBhbnkgb2JqZWN0LCBhbmQgY2FuIG9ubHkgcmVmZXIgdG8gQyBzdHJpbmcgbGl0ZXJhbHMuCisgKi8KK3R5cGVkZWYgY29uc3QgY2hhciAqQzJTdHJpbmdMaXRlcmFsOworCisvKioKKyAqIGMyX3N0YXR1c190OiBzdGF0dXMgY29kZXMgdXNlZC4KKyAqLworZW51bSBjMl9zdGF0dXNfdCA6IGludDMyX3QgeworLyoKKyAqIFVzZSBQT1NJWCBlcnJubyBjb25zdGFudHMuCisgKi8KKyAgICBDMl9PSyAgICAgICAgPSAwLCAgICAgICAgICAgIC8vLzwgb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKKworICAgIC8vIGJhZCBpbnB1dAorICAgIEMyX0JBRF9WQUxVRSA9IEVJTlZBTCwgICAgICAgLy8vPCBhcmd1bWVudCBoYXMgaW52YWxpZCB2YWx1ZSAodXNlciBlcnJvcikKKyAgICBDMl9CQURfSU5ERVggPSBFTlhJTywgICAgICAgIC8vLzwgYXJndW1lbnQgdXNlcyBpbnZhbGlkIGluZGV4ICh1c2VyIGVycm9yKQorICAgIEMyX0NBTk5PVF9ETyA9IEVOT1RTVVAsICAgICAgLy8vPCBhcmd1bWVudC9pbmRleCBpcyB2YWxpZCBidXQgbm90IHBvc3NpYmxlCisKKyAgICAvLyBiYWQgc2VxdWVuY2luZyBvZiBldmVudHMKKyAgICBDMl9EVVBMSUNBVEUgPSBFRVhJU1QsICAgICAgIC8vLzwgb2JqZWN0IGFscmVhZHkgZXhpc3RzCisgICAgQzJfTk9UX0ZPVU5EID0gRU5PRU5ULCAgICAgICAvLy88IG9iamVjdCBub3QgZm91bmQKKyAgICBDMl9CQURfU1RBVEUgPSBFUEVSTSwgICAgICAgIC8vLzwgb3BlcmF0aW9uIGlzIG5vdCBwZXJtaXR0ZWQgaW4gdGhlIGN1cnJlbnQgc3RhdGUKKyAgICBDMl9CTE9DS0lORyAgPSBFV09VTERCTE9DSywgIC8vLzwgb3BlcmF0aW9uIHdvdWxkIGJsb2NrIGJ1dCBibG9ja2luZyBpcyBub3QgcGVybWl0dGVkCisgICAgQzJfQ0FOQ0VMRUQgID0gRUlOVFIsICAgICAgICAvLy88IG9wZXJhdGlvbiBpbnRlcnJ1cHRlZC9jYW5jZWxlZAorCisgICAgLy8gYmFkIGVudmlyb25tZW50CisgICAgQzJfTk9fTUVNT1JZID0gRU5PTUVNLCAgICAgICAvLy88IG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIG9wZXJhdGlvbgorICAgIEMyX1JFRlVTRUQgICA9IEVBQ0NFUywgICAgICAgLy8vPCBtaXNzaW5nIHBlcm1pc3Npb24gdG8gY29tcGxldGUgb3BlcmF0aW9uCisKKyAgICBDMl9USU1FRF9PVVQgPSBFVElNRURPVVQsICAgIC8vLzwgb3BlcmF0aW9uIGRpZCBub3QgY29tcGxldGUgd2l0aGluIHRpbWVvdXQKKworICAgIC8vIGJhZCB2ZXJzaW9uaW5nCisgICAgQzJfT01JVFRFRCAgID0gRU5PU1lTLCAgICAgICAvLy88IG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQvc3VwcG9ydGVkIChvcHRpb25hbCBvbmx5KQorCisgICAgLy8gdW5rbm93biBmYXRhbAorICAgIEMyX0NPUlJVUFRFRCA9IEVGQVVMVCwgICAgICAgLy8vPCBzb21lIHVuZXhwZWN0ZWQgZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24KKyAgICBDMl9OT19JTklUICAgPSBFTk9ERVYsICAgICAgIC8vLzwgc3RhdHVzIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZAorfTsKKworLyoqCisgKiBUeXBlIHRoYXQgZGVzY3JpYmVzIHRoZSBkZXNpcmVkIGJsb2NraW5nIGJlaGF2aW9yIGZvciB2YXJpYWJsZSBibG9ja2luZyBjYWxscy4gQmxvY2tpbmcgaW4gdGhpcworICogQVBJIGlzIHVzZWQgaW4gYSBzb21ld2hhdCBtb2RpZmllZCBtZWFuaW5nIHN1Y2ggdGhhdCBvcGVyYXRpb25zIHRoYXQgbWVyZWx5IHVwZGF0ZSB2YXJpYWJsZXMKKyAqIHByb3RlY3RlZCBieSBtdXRleGVzIGFyZSBzdGlsbCBjb25zaWRlcmVkICJub24tYmxvY2tpbmciIChhbHdheXMgdXNlZCBpbiBxdW90ZXMpLgorICovCitlbnVtIGMyX2Jsb2NraW5nX3QgOiBpbnQzMl90IHsKKyAgICAvKioKKyAgICAgKiBUaGUgb3BlcmF0aW9uIFNIQUxMIGJlICJub24tYmxvY2tpbmciLiBUaGlzIG1lYW5zIHRoYXQgaXQgc2hhbGwgbm90IHBlcmZvcm0gYW55IGZpbGUKKyAgICAgKiBvcGVyYXRpb25zLCBvciBjYWxsL3dhaXQgb24gb3RoZXIgcHJvY2Vzc2VzLiBJdCBtYXkgdXNlIGEgcHJvdGVjdGVkIHJlZ2lvbiBhcyBsb25nIGFzIHRoZQorICAgICAqIG11dGV4IGlzIG5ldmVyIHVzZWQgdG8gcHJvdGVjdCBjb2RlIHRoYXQgaXMgb3RoZXJ3aXNlICJtYXkgYmxvY2siLgorICAgICAqLworICAgIEMyX0RPTlRfQkxPQ0sgPSBmYWxzZSwKKyAgICAvKioKKyAgICAgKiBUaGUgb3BlcmF0aW9uIE1BWSBiZSB0ZW1wb3JhcmlseSBibG9ja2luZy4KKyAgICAgKi8KKyAgICBDMl9NQVlfQkxPQ0sgPSB0cnVlLAorfTsKKworLy8vIEB9CisKKy8vLyBcZGVmZ3JvdXAgdXRpbHMgVXRpbGl0aWVzCisvLy8gQHsKKworI2RlZmluZSBDMl9ET19OT1RfQ09QWSh0eXBlKSBcCisgICAgdHlwZSYgb3BlcmF0b3I9KGNvbnN0IHR5cGUgJikgPSBkZWxldGU7IFwKKyAgICB0eXBlKGNvbnN0IHR5cGUgJikgPSBkZWxldGU7IFwKKworI2RlZmluZSBDMl9ERUZBVUxUX01PVkUodHlwZSkgXAorICAgIHR5cGUmIG9wZXJhdG9yPSh0eXBlICYmKSA9IGRlZmF1bHQ7IFwKKyAgICB0eXBlKHR5cGUgJiYpID0gZGVmYXVsdDsgXAorCisjZGVmaW5lIEMyX0FMTE9XX09WRVJGTE9XIF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQorI2RlZmluZSBDMl9DT05TVCAgICBfX2F0dHJpYnV0ZV9fKChjb25zdCkpCisjZGVmaW5lIEMyX0hJREUgICAgIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNkZWZpbmUgQzJfSU5MSU5FICAgaW5saW5lIEMyX0hJREUKKyNkZWZpbmUgQzJfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygoaW50ZXJuYWxfbGlua2FnZSkpCisjZGVmaW5lIEMyX1BBQ0sgICAgIF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKQorI2RlZmluZSBDMl9QVVJFICAgICBfX2F0dHJpYnV0ZV9fKChwdXJlKSkKKworI2RlZmluZSBERUZJTkVfT1RIRVJfQ09NUEFSSVNPTl9PUEVSQVRPUlModHlwZSkgXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgdHlwZSAmb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9IFwKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IHJldHVybiAoKnRoaXMgPT0gb3RoZXIpIHx8ICgqdGhpcyA8IG90aGVyKTsgfSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA8IG90aGVyKTsgfSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzIDwgb3RoZXIpICYmICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyNkZWZpbmUgREVGSU5FX0ZJRUxEX0JBU0VEX0NPTVBBUklTT05fT1BFUkFUT1JTKHR5cGUsIGZpZWxkKSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IHJldHVybiBmaWVsZCA8IG90aGVyLmZpZWxkOyB9IFwKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IHJldHVybiBmaWVsZCA9PSBvdGhlci5maWVsZDsgfSBcCisgICAgREVGSU5FX09USEVSX0NPTVBBUklTT05fT1BFUkFUT1JTKHR5cGUpCisKKyNkZWZpbmUgREVGSU5FX0ZJRUxEX0FORF9NQVNLX0JBU0VEX0NPTVBBUklTT05fT1BFUkFUT1JTKHR5cGUsIGZpZWxkLCBtYXNrKSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IFwKKyAgICAgICAgcmV0dXJuIChmaWVsZCAmIG1hc2spIDwgKG90aGVyLmZpZWxkICYgKG1hc2spKTsgXAorICAgIH0gXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgdHlwZSAmb3RoZXIpIGNvbnN0IHsgXAorICAgICAgICByZXR1cm4gKGZpZWxkICYgbWFzaykgPT0gKG90aGVyLmZpZWxkICYgKG1hc2spKTsgXAorICAgIH0gXAorICAgIERFRklORV9PVEhFUl9DT01QQVJJU09OX09QRVJBVE9SUyh0eXBlKQorCisjZGVmaW5lIERFRklORV9FTlVNX09QRVJBVE9SUyhldHlwZSkgXAorICAgIGlubGluZSBjb25zdGV4cHIgZXR5cGUgb3BlcmF0b3J8KGV0eXBlIGEsIGV0eXBlIGIpIHsgcmV0dXJuIChldHlwZSkoc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGEpIHwgc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGIpKTsgfSBcCisgICAgaW5saW5lIGNvbnN0ZXhwciBldHlwZSAmb3BlcmF0b3J8PShldHlwZSAmYSwgZXR5cGUgYikgeyBhID0gKGV0eXBlKShzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYSkgfCBzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYikpOyByZXR1cm4gYTsgfSBcCisgICAgaW5saW5lIGNvbnN0ZXhwciBldHlwZSBvcGVyYXRvciYoZXR5cGUgYSwgZXR5cGUgYikgeyByZXR1cm4gKGV0eXBlKShzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYSkgJiBzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYikpOyB9IFwKKyAgICBpbmxpbmUgY29uc3RleHByIGV0eXBlICZvcGVyYXRvciY9KGV0eXBlICZhLCBldHlwZSBiKSB7IGEgPSAoZXR5cGUpKHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShhKSAmIHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShiKSk7IHJldHVybiBhOyB9IFwKKyAgICBpbmxpbmUgY29uc3RleHByIGV0eXBlIG9wZXJhdG9yXihldHlwZSBhLCBldHlwZSBiKSB7IHJldHVybiAoZXR5cGUpKHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShhKSBeIHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShiKSk7IH0gXAorICAgIGlubGluZSBjb25zdGV4cHIgZXR5cGUgJm9wZXJhdG9yXj0oZXR5cGUgJmEsIGV0eXBlIGIpIHsgYSA9IChldHlwZSkoc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGEpIF4gc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGIpKTsgcmV0dXJuIGE7IH0gXAorICAgIGlubGluZSBjb25zdGV4cHIgZXR5cGUgb3BlcmF0b3J+KGV0eXBlIGEpIHsgcmV0dXJuIChldHlwZSkofnN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShhKSk7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQj4KK2NsYXNzIEMyX0hJREUgYzJfY250cl90OworCisvLy8gXGNvbmQgSU5URVJOQUwKKworLy8vIFxkZWZncm91cCB1dGlsc19pbnRlcm5hbAorLy8vIEB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJfSElERSBfYzJfY250cl9jb21wYXRfaGVscGVyIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8VT46OnZhbHVlPjo6dHlwZT4KKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIFQgZ2V0KGNvbnN0IFUgJnZhbHVlKSB7CisgICAgICAgIHJldHVybiBUKHZhbHVlKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPChzaXplb2YoVSkgPj0gc2l6ZW9mKFQpKT46OnR5cGU+CisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBUIGdldChjb25zdCBjMl9jbnRyX3Q8VSwgdm9pZD4gJnZhbHVlKSB7CisgICAgICAgIHJldHVybiBUKHZhbHVlLm1WYWx1ZSk7CisgICAgfQorfTsKKworLy8vIEB9CisKKy8vLyBcZW5kY29uZAorCisvKioKKyAqIEludGVncmFsIGNvdW50ZXIgdHlwZS4KKyAqCisgKiBUaGlzIGlzIGJhc2ljYWxseSBhbiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlIHRoYXQgaXMgTkVWRVIgY2hlY2tlZCBmb3Igb3ZlcmZsb3cvdW5kZXJmbG93IC0gYW5kCisgKiBjb21wYXJpc29uIG9wZXJhdG9ycyBhcmUgcmVkZWZpbmVkLgorICoKKyAqIFxub3RlIENvbXBhcmlzb24gb2YgY291bnRlciB0eXBlcyBpcyBub3QgZnVsbHkgdHJhbnNpdGl2ZSwgZS5nLgorICogaXQgY291bGQgYmUgdGhhdCBhID4gYiA+IGMgYnV0IGEgIT4gYy4KKyAqIHN0ZDo6bGVzczw+LCBncmVhdGVyPD4sIGxlc3NfZXF1YWw8PiBhbmQgZ3JlYXRlcl9lcXVhbDw+IHNwZWNpYWxpemF0aW9ucyB5aWVsZCB0b3RhbCBvcmRlcmluZywKKyAqIGJ1dCBtYXkgbm90IG1hdGNoIHNlbWFudGljIG9yZGVyaW5nIG9mIHRoZSB2YWx1ZXMuCisgKgorICogVGVjaG5pY2FsbHk6IGNvdW50ZXIgdHlwZXMgcmVwcmVzZW50IGludGVnZXIgdmFsdWVzOiBBICogMl5OICsgdmFsdWUsIHdoZXJlIEEgY2FuIGJlIGFyYml0cmFyeS4KKyAqIFRoaXMgbWFrZXMgYWRkaXRpb24sIHN1YnRyYWN0aW9uLCBtdWx0aXBsaWNhdGlvbiAoYXMgd2VsbCBhcyBiaXR3aXNlIG9wZXJhdGlvbnMpIHdlbGwgZGVmaW5lZC4KKyAqIEhvd2V2ZXIsIGRpdmlzaW9uIGlzIGluIGdlbmVyYWwgbm90IHdlbGwgZGVmaW5lZCwgYXMgdGhlIHJlc3VsdCBtYXkgZGVwZW5kIG9uIEEuIFRoaXMgaXMgYWxzbworICogdHJ1ZSBmb3IgbG9naWNhbCBvcGVyYXRvcnMgYW5kIGJvb2xlYW4gY29udmVyc2lvbi4KKyAqCisgKiBFdmVuIHRob3VnaCB3ZWxsIGRlZmluZWQsIGJpdHdpc2Ugb3BlcmF0b3JzIGFyZSBub3QgaW1wbGVtZW50ZWQgZm9yIGNvdW50ZXIgdHlwZXMgYXMgdGhleSBhcmUgbm90CisgKiBtZWFuaW5nZnVsLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBCPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlICYmIHN0ZDo6aXNfdW5zaWduZWQ8VD46OnZhbHVlPjo6dHlwZT4KK2NsYXNzIEMyX0hJREUgYzJfY250cl90IHsKKyAgICB1c2luZyBjb21wYXQgPSBfYzJfY250cl9jb21wYXRfaGVscGVyPFQ+OworCisgICAgVCBtVmFsdWU7CisgICAgY29uc3RleHByIHN0YXRpYyBUIEhBTEZfUkFOR0UgPSBUKH4wKSBeIChUKH4wKSA+PiAxKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+CisgICAgZnJpZW5kIHN0cnVjdCBfYzJfY250cl9jb21wYXRfaGVscGVyOworcHVibGljOgorCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZWQgY291bnRlciB0byAwLgorICAgICAqLworICAgIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90KCkgOiBtVmFsdWUoVCgwKSkge30KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBmcm9tIGEgY29tcGF0aWJsZSB0eXBlLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+CisgICAgaW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3QoY29uc3QgVSAmdmFsdWUpIDogbVZhbHVlKGNvbXBhdDo6Z2V0KHZhbHVlKSkge30KKworICAgIC8qKgorICAgICAqIFBlZWsgYXMgdW5kZXJseWluZyBzaWduZWQgdHlwZS4KKyAgICAgKi8KKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgdHlwZW5hbWUgc3RkOjptYWtlX3NpZ25lZDxUPjo6dHlwZSBwZWVrKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dHlwZW5hbWUgc3RkOjptYWtlX3NpZ25lZDxUPjo6dHlwZT4obVZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZWVrIGFzIHVuZGVybHlpbmcgdW5zaWduZWQgdHlwZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIFQgcGVla3UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVlayBhcyBsb25nIGxvbmcgLSBlLmcuIGZvciBwcmludGluZy4KKyAgICAgKi8KKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgbG9uZyBsb25nIHBlZWtsbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChsb25nIGxvbmcpbVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlZWsgYXMgdW5zaWduZWQgbG9uZyBsb25nIC0gZS5nLiBmb3IgcHJpbnRpbmcuCisgICAgICovCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIHVuc2lnbmVkIGxvbmcgbG9uZyBwZWVrdWxsKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcgbG9uZyltVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0byBhIHNtYWxsZXIgY291bnRlciB0eXBlLiBUaGlzIGlzIGFsd2F5cyBzYWZlLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8KHNpemVvZihVKSA8IHNpemVvZihUKSk+Ojp0eXBlPgorICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgYzJfY250cl90PFU+KCkgeworICAgICAgICByZXR1cm4gYzJfY250cl90PFU+KG1WYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXJpdGhtZXRpYyBvcGVyYXRvcnMKKyAgICAgKi8KKworI2RlZmluZSBERUZJTkVfQzJfQ05UUl9CSU5BUllfT1AoYXR0cmliLCBvcCwgb3BfYXNzaWduKSBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gXAorICAgIGF0dHJpYiBpbmxpbmUgYzJfY250cl90PFQ+JiBvcGVyYXRvciBvcF9hc3NpZ24oY29uc3QgVSAmdmFsdWUpIHsgXAorICAgICAgICBtVmFsdWUgb3BfYXNzaWduIGNvbXBhdDo6Z2V0KHZhbHVlKTsgXAorICAgICAgICByZXR1cm4gKnRoaXM7IFwKKyAgICB9IFwKKyAgICBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgRT1kZWNsdHlwZShjb21wYXQ6OmdldChVKDApKSk+IFwKKyAgICBhdHRyaWIgaW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3Q8VD4gb3BlcmF0b3Igb3AoY29uc3QgVSAmdmFsdWUpIGNvbnN0IHsgXAorICAgICAgICByZXR1cm4gYzJfY250cl90PFQ+KG1WYWx1ZSBvcCBjb21wYXQ6OmdldCh2YWx1ZSkpOyBcCisgICAgfSBcCisgICAgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8KHNpemVvZihVKSA8IHNpemVvZihUKSk+Ojp0eXBlPiBcCisgICAgYXR0cmliIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90PFU+IG9wZXJhdG9yIG9wKGNvbnN0IGMyX2NudHJfdDxVPiAmdmFsdWUpIGNvbnN0IHsgXAorICAgICAgICByZXR1cm4gYzJfY250cl90PFU+KFUobVZhbHVlKSBvcCB2YWx1ZS5wZWVrdSgpKTsgXAorICAgIH0KKworI2RlZmluZSBERUZJTkVfQzJfQ05UUl9VTkFSWV9PUChhdHRyaWIsIG9wKSBcCisgICAgYXR0cmliIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90PFQ+IG9wZXJhdG9yIG9wKCkgY29uc3QgeyBcCisgICAgICAgIHJldHVybiBjMl9jbnRyX3Q8VD4ob3AgbVZhbHVlKTsgXAorICAgIH0KKworI2RlZmluZSBERUZJTkVfQzJfQ05UUl9DUkVNRU5UX09QKGF0dHJpYiwgb3ApIFwKKyAgICBhdHRyaWIgaW5saW5lIGMyX2NudHJfdDxUPiAmb3BlcmF0b3Igb3AoKSB7IFwKKyAgICAgICAgb3AgbVZhbHVlOyBcCisgICAgICAgIHJldHVybiAqdGhpczsgXAorICAgIH0gXAorICAgIGF0dHJpYiBpbmxpbmUgYzJfY250cl90PFQ+IG9wZXJhdG9yIG9wKGludCkgeyBcCisgICAgICAgIHJldHVybiBjMl9jbnRyX3Q8VCwgdm9pZD4obVZhbHVlIG9wKTsgXAorICAgIH0KKworICAgIERFRklORV9DMl9DTlRSX0JJTkFSWV9PUChDMl9BTExPV19PVkVSRkxPVywgKywgKz0pCisgICAgREVGSU5FX0MyX0NOVFJfQklOQVJZX09QKEMyX0FMTE9XX09WRVJGTE9XLCAtLCAtPSkKKyAgICBERUZJTkVfQzJfQ05UUl9CSU5BUllfT1AoQzJfQUxMT1dfT1ZFUkZMT1csICosICo9KQorCisgICAgREVGSU5FX0MyX0NOVFJfVU5BUllfT1AoQzJfQUxMT1dfT1ZFUkZMT1csIC0pCisgICAgREVGSU5FX0MyX0NOVFJfVU5BUllfT1AoQzJfQUxMT1dfT1ZFUkZMT1csICspCisKKyAgICBERUZJTkVfQzJfQ05UUl9DUkVNRU5UX09QKEMyX0FMTE9XX09WRVJGTE9XLCArKykKKyAgICBERUZJTkVfQzJfQ05UUl9DUkVNRU5UX09QKEMyX0FMTE9XX09WRVJGTE9XLCAtLSkKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc191bnNpZ25lZDxVPjo6dmFsdWU+Ojp0eXBlPgorICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3Q8VD4gb3BlcmF0b3I8PChjb25zdCBVICZ2YWx1ZSkgY29uc3QgeworICAgICAgICByZXR1cm4gYzJfY250cl90PFQ+KG1WYWx1ZSA8PCB2YWx1ZSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgRT10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3Vuc2lnbmVkPFU+Ojp2YWx1ZT46OnR5cGU+CisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgYzJfY250cl90PFQ+ICZvcGVyYXRvcjw8PShjb25zdCBVICZ2YWx1ZSkgeworICAgICAgICBtVmFsdWUgPDw9IHZhbHVlOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyaXNvbiBvcGVyYXRvcnMKKyAgICAgKi8KKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IGMyX2NudHJfdDxUPiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFQob3RoZXIubVZhbHVlIC0gbVZhbHVlKSA8IEhBTEZfUkFOR0U7CisgICAgfQorCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+PShjb25zdCBjMl9jbnRyX3Q8VD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBUKG1WYWx1ZSAtIG90aGVyLm1WYWx1ZSkgPCBIQUxGX1JBTkdFOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGMyX2NudHJfdDxUPiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZSA9PSBvdGhlci5tVmFsdWU7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgYzJfY250cl90PFQ+ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPChjb25zdCBjMl9jbnRyX3Q8VD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAqdGhpcyA8PSBvdGhlciAmJiAqdGhpcyAhPSBvdGhlcjsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGMyX2NudHJfdDxUPiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICp0aGlzID49IG90aGVyICYmICp0aGlzICE9IG90aGVyOworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxVPjo6dmFsdWU+Ojp0eXBlPgoraW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3Q8VD4gb3BlcmF0b3IrKGNvbnN0IFUgJmEsIGNvbnN0IGMyX2NudHJfdDxUPiAmYikgeworICAgIHJldHVybiBiICsgYTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgRT10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFU+Ojp2YWx1ZT46OnR5cGU+CitpbmxpbmUgY29uc3RleHByIGMyX2NudHJfdDxUPiBvcGVyYXRvci0oY29uc3QgVSAmYSwgY29uc3QgYzJfY250cl90PFQ+ICZiKSB7CisgICAgcmV0dXJuIGMyX2NudHJfdDxUPihhKSAtIGI7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxVPjo6dmFsdWU+Ojp0eXBlPgoraW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3Q8VD4gb3BlcmF0b3IqKGNvbnN0IFUgJmEsIGNvbnN0IGMyX2NudHJfdDxUPiAmYikgeworICAgIHJldHVybiBiICogYTsKK30KKwordHlwZWRlZiBjMl9jbnRyX3Q8dWludDMyX3Q+IGMyX2NudHIzMl90OyAvKiogMzItYml0IGNvdW50ZXIgdHlwZSAqLwordHlwZWRlZiBjMl9jbnRyX3Q8dWludDY0X3Q+IGMyX2NudHI2NF90OyAvKiogNjQtYml0IGNvdW50ZXIgdHlwZSAqLworCisvLy8gXGNvbmQgSU5URVJOQUwKKworLy8vIFxkZWZncm91cCB1dGlsc19pbnRlcm5hbAorLy8vIEB7CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIFQ+IHN0cnVjdCBjMl90eXBlczsKKworLyoqIHNwZWNpYWxpemF0aW9uIGZvciBhIHNpbmdsZSB0eXBlICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGMyX3R5cGVzPFQ+IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6ZGVjYXk8VD46OnR5cGUgd2lkZV90eXBlOworICAgIHR5cGVkZWYgd2lkZV90eXBlIG5hcnJvd190eXBlOworICAgIHR5cGVkZWYgd2lkZV90eXBlIG1pbl90eXBlOyAvLyB0eXBlIGZvciBtaW4oVC4uLikKK307CisKKy8qKiBzcGVjaWFsaXphdGlvbiBmb3IgdHdvIHR5cGVzICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorc3RydWN0IGMyX3R5cGVzPFQsIFU+IHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID09IHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIm1peGluZyBmbG9hdGluZyBwb2ludCBhbmQgbm9uLWZsb2F0aW5nIHBvaW50IHR5cGVzIGlzIGRpc2FsbG93ZWQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2lnbmVkPFQ+Ojp2YWx1ZSA9PSBzdGQ6OmlzX3NpZ25lZDxVPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAibWl4aW5nIHNpZ25lZCBhbmQgdW5zaWduZWQgdHlwZXMgaXMgZGlzYWxsb3dlZCIpOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmRlY2F5PAorICAgICAgICAgICAgZGVjbHR5cGUodHJ1ZSA/IHN0ZDo6ZGVjbHZhbDxUPigpIDogc3RkOjpkZWNsdmFsPFU+KCkpPjo6dHlwZSB3aWRlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmRlY2F5PAorICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxzaXplb2YoVCkgPCBzaXplb2YoVSksIFQsIFU+Ojp0eXBlPjo6dHlwZSBuYXJyb3dfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8CisgICAgICAgICAgICBzdGQ6OmlzX3NpZ25lZDxUPjo6dmFsdWUsIHdpZGVfdHlwZSwgbmFycm93X3R5cGU+Ojp0eXBlIG1pbl90eXBlOworfTsKKworLy8vIEB9CisKKy8vLyBcZW5kY29uZAorCisvKioKKyAqIFR5cGUgc3VwcG9ydCB1dGlsaXR5IGNsYXNzLiBPbmx5IHN1cHBvcnRzIHNpbWlsYXIgY2xhc3Nlcywgc3VjaCBhczoKKyAqIC0gYWxsIGZsb2F0aW5nIHBvaW50CisgKiAtIGFsbCB1bnNpZ25lZC9hbGwgc2lnbmVkCisgKiAtIGFsbCBwb2ludGVyCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lLi4uIFY+CitzdHJ1Y3QgYzJfdHlwZXM8VCwgVSwgVi4uLj4geworICAgIC8qKiBDb21tb24gdHlwZSB0aGF0IGFjY29tbW9kYXRlcyBhbGwgdGVtcGxhdGUgcGFyYW1ldGVyIHR5cGVzLiAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46OndpZGVfdHlwZSwgVi4uLj46OndpZGVfdHlwZSB3aWRlX3R5cGU7CisgICAgLyoqIE5hcnJvd2VzdCB0eXBlIG9mIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgdHlwZXMuICovCisgICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczx0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6bmFycm93X3R5cGUsIFYuLi4+OjpuYXJyb3dfdHlwZSBuYXJyb3dfdHlwZTsKKyAgICAvKiogVHlwZSB0aGF0IGFjY29tbW9kYXRlcyB0aGUgbWluaW11bSB2YWx1ZSBmb3IgYW55IGlucHV0IGZvciB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIHR5cGVzLiAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46Om1pbl90eXBlLCBWLi4uPjo6bWluX3R5cGUgbWluX3R5cGU7Cit9OworCisvKioKKyAqICBcaW5ncm91cCB1dGlsc19pbnRlcm5hbAorICogc3BlY2lhbGl6YXRpb24gZm9yIHR3byB2YWx1ZXMgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitpbmxpbmUgY29uc3RleHByIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+Ojp3aWRlX3R5cGUgYzJfbWF4KGNvbnN0IFQgYSwgY29uc3QgVSBiKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6d2lkZV90eXBlIHdpZGVfdHlwZTsKKyAgICByZXR1cm4gKHsgd2lkZV90eXBlIGFfKGEpLCBiXyhiKTsgYV8gPiBiXyA/IGFfIDogYl87IH0pOworfQorCisvKioKKyAqIEZpbmRzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGEgbGlzdCBvZiAic2ltaWxhcmx5IHR5cGVkIiB2YWx1ZXMuCisgKgorICogVGhpcyBpcyBhbiBleHRlbnNpb24gdG8gc3RkOjptYXggd2hlcmUgdGhlIHR5cGVzIGRvIG5vdCBoYXZlIHRvIGJlIGlkZW50aWNhbCwgYW5kIHRoZSBzbWFsbGVzdAorICogcmVzdWx0aW5nIHR5cGUgaXMgdXNlZCB0aGF0IGFjY29tbW9kYXRlcyB0aGUgYXJndW1lbnQgdHlwZXMuCisgKgorICogXG5vdGUgVmFsdWUgdHlwZXMgbXVzdCBiZSBzaW1pbGFyLCBlLmcuIGFsbCBmbG9hdGluZyBwb2ludCwgYWxsIHBvaW50ZXJzLCBhbGwgc2lnbmVkLCBvciBhbGwKKyAqIHVuc2lnbmVkLgorICoKKyAqIEByZXR1cm4gdGhlIGxhcmdlc3Qgb2YgdGhlIGlucHV0IGFyZ3VtZW50cy4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUuLi4gVj4KK2NvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBVLCBWLi4uPjo6d2lkZV90eXBlIGMyX21heChjb25zdCBUIGEsIGNvbnN0IFUgYiwgY29uc3QgViAuLi4gYykgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8VCwgVSwgVi4uLj46OndpZGVfdHlwZSB3aWRlX3R5cGU7CisgICAgcmV0dXJuICh7IHdpZGVfdHlwZSBhXyhhKSwgYl8oYzJfbWF4KGIsIGMuLi4pKTsgYV8gPiBiXyA/IGFfIDogYl87IH0pOworfQorCisvKioKKyAqICBcaW5ncm91cCB1dGlsc19pbnRlcm5hbAorICogc3BlY2lhbGl6YXRpb24gZm9yIHR3byB2YWx1ZXMgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitpbmxpbmUgY29uc3RleHByIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+OjptaW5fdHlwZSBjMl9taW4oY29uc3QgVCBhLCBjb25zdCBVIGIpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOworICAgIHJldHVybiAoeworICAgICAgICB3aWRlX3R5cGUgYV8oYSksIGJfKGIpOworICAgICAgICBzdGF0aWNfY2FzdDx0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6bWluX3R5cGU+KGFfIDwgYl8gPyBhXyA6IGJfKTsKKyAgICB9KTsKK30KKworLyoqCisgKiBGaW5kcyB0aGUgbWluaW11bSB2YWx1ZSBvZiBhIGxpc3Qgb2YgInNpbWlsYXJseSB0eXBlZCIgdmFsdWVzLgorICoKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHN0ZDo6bWluIHdoZXJlIHRoZSB0eXBlcyBkbyBub3QgaGF2ZSB0byBiZSBpZGVudGljYWwsIGFuZCB0aGUgc21hbGxlc3QKKyAqIHJlc3VsdGluZyB0eXBlIGlzIHVzZWQgdGhhdCBhY2NvbW1vZGF0ZXMgdGhlIGFyZ3VtZW50IHR5cGVzLgorICoKKyAqIFxub3RlIFZhbHVlIHR5cGVzIG11c3QgYmUgc2ltaWxhciwgZS5nLiBhbGwgZmxvYXRpbmcgcG9pbnQsIGFsbCBwb2ludGVycywgYWxsIHNpZ25lZCwgb3IgYWxsCisgKiB1bnNpZ25lZC4KKyAqCisgKiBAcmV0dXJuIHRoZSBzbWFsbGVzdCBvZiB0aGUgaW5wdXQgYXJndW1lbnRzLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZS4uLiBWPgorY29uc3RleHByIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFUsIFYuLi4+OjptaW5fdHlwZSBjMl9taW4oY29uc3QgVCBhLCBjb25zdCBVIGIsIGNvbnN0IFYgLi4uIGMpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPFUsIFYuLi4+OjptaW5fdHlwZSByZXN0X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczxULCByZXN0X3R5cGU+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOworICAgIHJldHVybiAoeworICAgICAgICB3aWRlX3R5cGUgYV8oYSksIGJfKGMyX21pbihiLCBjLi4uKSk7CisgICAgICAgIHN0YXRpY19jYXN0PHR5cGVuYW1lIGMyX3R5cGVzPFQsIHJlc3RfdHlwZT46Om1pbl90eXBlPihhXyA8IGJfID8gYV8gOiBiXyk7CisgICAgfSk7Cit9CisKKy8qKgorICogIFxpbmdyb3VwIHV0aWxzX2ludGVybmFsCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIFY+CitpbmxpbmUgY29uc3RleHByIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFY+Ojp3aWRlX3R5cGUgYzJfY2xhbXAoY29uc3QgVCBhLCBjb25zdCBVIGIsIGNvbnN0IFYgYykgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8VCwgVSwgVj46OndpZGVfdHlwZSB3aWRlX3R5cGU7CisgICAgcmV0dXJuICh7CisgICAgICAgIHdpZGVfdHlwZSBhXyhhKSwgYl8oYiksIGNfKGMpOworICAgICAgICBzdGF0aWNfY2FzdDx0eXBlbmFtZSBjMl90eXBlczxULCBWPjo6d2lkZV90eXBlPihiXyA8IGFfID8gYV8gOiBiXyA+IGNfID8gY18gOiBiXyk7CisgICAgfSk7Cit9CisKKy8vLyBAfQorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3Qgc3RkOjpsZXNzPDo6YzJfY250cl90PFQ+PiB7CisgICAgY29uc3RleHByIGJvb2wgb3BlcmF0b3IoKShjb25zdCA6OmMyX2NudHJfdDxUPiAmbGgsIGNvbnN0IDo6YzJfY250cl90PFQ+ICZyaCkgY29uc3QgeworICAgICAgICByZXR1cm4gbGgucGVla3UoKSA8IHJoLnBlZWt1KCk7CisgICAgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3Qgc3RkOjpsZXNzX2VxdWFsPDo6YzJfY250cl90PFQ+PiB7CisgICAgY29uc3RleHByIGJvb2wgb3BlcmF0b3IoKShjb25zdCA6OmMyX2NudHJfdDxUPiAmbGgsIGNvbnN0IDo6YzJfY250cl90PFQ+ICZyaCkgY29uc3QgeworICAgICAgICByZXR1cm4gbGgucGVla3UoKSA8PSByaC5wZWVrdSgpOworICAgIH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IHN0ZDo6Z3JlYXRlcjw6OmMyX2NudHJfdDxUPj4geworICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yKCkoY29uc3QgOjpjMl9jbnRyX3Q8VD4gJmxoLCBjb25zdCA6OmMyX2NudHJfdDxUPiAmcmgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxoLnBlZWt1KCkgPiByaC5wZWVrdSgpOworICAgIH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IHN0ZDo6Z3JlYXRlcl9lcXVhbDw6OmMyX2NudHJfdDxUPj4geworICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yKCkoY29uc3QgOjpjMl9jbnRyX3Q8VD4gJmxoLCBjb25zdCA6OmMyX2NudHJfdDxUPiAmcmgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxoLnBlZWt1KCkgPj0gcmgucGVla3UoKTsKKyAgICB9Cit9OworCisjZW5kaWYgIC8vIEMyX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzNTg3YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJCdWZmZXIuaApAQCAtMCwwICsxLDIxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyQlVGRkVSX0hfCisjZGVmaW5lIEMyQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxDMi5oPgorI2luY2x1ZGUgPEMyQnVmZmVyQmFzZS5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4gLy8gZm9yIEMySW5mbworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YW5kcm9pZC1DMkJ1ZmZlci5oPgorI2Vsc2UKKwordHlwZWRlZiB2b2lkKiBDMkhhbmRsZTsKKworI2VuZGlmCisKKy8vLyBcZGVmZ3JvdXAgYnVmZmVyIEJ1ZmZlcnMKKy8vLyBAeworCisvLy8gXGRlZmdyb3VwIGJ1ZmZlcl9zeW5jIFN5bmNocm9uaXphdGlvbgorLy8vIEB7CisKKy8qKgorICogU3luY2hyb25pemF0aW9uIGlzIGFjY29tcGxpc2hlZCB1c2luZyBldmVudCBhbmQgZmVuY2Ugb2JqZWN0cy4KKyAqCisgKiBUaGVzZSBhcmUgY3Jvc3MtcHJvY2VzcyBleHRlbnNpb25zIG9mIHByb21pc2UvZnV0dXJlIGluZnJhc3RydWN0dXJlLgorICogRXZlbnRzIGFyZSBhbmFsb2dvdXMgdG8gc3RkOjpwcm9taXNlPHZvaWQ+LCB3aGVyZWFzIGZlbmNlcyBhcmUgdG8gc3RkOjpzaGFyZWRfZnV0dXJlPHZvaWQ+LgorICoKKyAqIEZlbmNlcyBhbmQgZXZlbnRzIGFyZSBzaGFyZWFibGUvY29weWFibGUuCisgKgorICogRmVuY2VzIGFyZSB1c2VkIGluIHR3byBzY2VuYXJpb3MsIGFuZCBhbGwgY29waWVkIGluc3RhbmNlcyByZWZlciB0byB0aGUgc2FtZSBldmVudC4KKyAqIFx0b2RvIGRvIGV2ZW50cyBuZWVkIHRvIGJlIGNvcHlhYmxlIG9yIHNob3VsZCB0aGV5IGJlIHVuaXF1ZT8KKyAqCisgKiBhY3F1aXJlIHN5bmMgZmVuY2Ugb2JqZWN0OiBzaWduYWxlZCB3aGVuIGl0IGlzIHNhZmUgZm9yIHRoZSBjb21wb25lbnQgb3IgY2xpZW50IHRvIGFjY2VzcworICogKHRoZSBjb250ZW50cyBvZikgYW4gb2JqZWN0LgorICoKKyAqIHJlbGVhc2Ugc3luYyBmZW5jZSBvYmplY3Q6IFx0b2RvCisgKgorICogRmVuY2VzIGNhbiBiZSBiYWNrZWQgYnkgaGFyZHdhcmUuIEhhcmR3YXJlIGZlbmNlcyBhcmUgZ3VhcmFudGVlZCB0byBzaWduYWwgTk8gTUFUVEVSIFdIQVQgd2l0aGluCisgKiBhIHNob3J0IChwbGF0Zm9ybSBzcGVjaWZpYykgYW1vdW50IG9mIHRpbWU7IHRoaXMgZ3VhcmFudGVlIGlzIHVzdWFsbHkgbGVzcyB0aGFuIDE1IG1zZWNzLgorICovCisKKy8qKgorICogRmVuY2Ugb2JqZWN0IHVzZWQgYnkgY29tcG9uZW50cyBhbmQgdGhlIGZyYW1ld29yay4KKyAqCisgKiBJbXBsZW1lbnRzIHRoZSB3YWl0aW5nIGZvciBhbiBldmVudCwgYW5hbG9nb3VzIHRvIGEgJ2Z1dHVyZScuCisgKgorICogVG8gYmUgaW1wbGVtZW50ZWQgYnkgdmVuZG9ycyBpZiB1c2luZyBIVyBmZW5jZXMuCisgKi8KK2NsYXNzIEMyRmVuY2UgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFdhaXRzIGZvciBhIGZlbmNlIHRvIGJlIHNpZ25hbGVkIHdpdGggYSB0aW1lb3V0LgorICAgICAqCisgICAgICogXHRvZG8gYSBtZWNoYW5pc20gdG8gY2FuY2VsIGEgd2FpdCAtIGZvciBub3cgdGhlIG9ubHkgd2F5IHRvIGRvIHRoaXMgaXMgdG8gYWJhbmRvbiB0aGUKKyAgICAgKiBldmVudCwgYnV0IGZlbmNlcyBhcmUgc2hhcmVkIHNvIGNhbmNlbGluZyBhIHdhaXQgd2lsbCBjYW5jZWwgYWxsIHdhaXRzLgorICAgICAqCisgICAgICogXHBhcmFtIHRpbWVvdXROcyAgICAgICAgICAgdGhlIG1heGltdW0gdGltZSB0byB3YWl0IGluIG5zZWNzCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIGZlbmNlIGhhcyBiZWVuIHNpZ25hbGVkCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgICAgIHRoZSBmZW5jZSBoYXMgbm90IGJlZW4gc2lnbmFsZWQgd2l0aGluIHRoZSB0aW1lb3V0CisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgICAgIHRoZSBmZW5jZSBoYXMgYmVlbiBhYmFuZG9uZWQgd2l0aG91dCBiZWluZyBzaWduYWxlZCAoaXQgd2lsbCBuZXZlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzaWduYWxlZCkKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICAgICAgbm8gcGVybWlzc2lvbiB0byB3YWl0IGZvciB0aGUgZmVuY2UgKHVuZXhwZWN0ZWQgLSBzeXN0ZW0pCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgd2FpdGluZyBmb3IgdGhlIGZlbmNlICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IHdhaXQoYzJfbnNlY3NfdCB0aW1lb3V0TnMpOworCisgICAgLyoqCisgICAgICogVXNlZCB0byBjaGVjayBpZiB0aGlzIGZlbmNlIGlzIHZhbGlkIChpZiB0aGVyZSBpcyBhIGNoYW5jZSBmb3IgaXQgdG8gYmUgc2lnbmFsZWQuKQorICAgICAqIEEgZmVuY2UgYmVjb21lcyBpbnZhbGlkIGlmIHRoZSBjb250cm9saW5nIGV2ZW50IGlzIGRlc3Ryb3llZCB3aXRob3V0IGl0IHNpZ25hbGluZyB0aGUgZmVuY2UuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHdoZXRoZXIgdGhpcyBmZW5jZSBpcyB2YWxpZAorICAgICAqLworICAgIGJvb2wgdmFsaWQoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gY2hlY2sgaWYgdGhpcyBmZW5jZSBoYXMgYmVlbiBzaWduYWxlZCAoaXMgcmVhZHkpLgorICAgICAqCisgICAgICogXHJldHVybiB3aGV0aGVyIHRoaXMgZmVuY2UgaGFzIGJlZW4gc2lnbmFsZWQKKyAgICAgKi8KKyAgICBib29sIHJlYWR5KCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gd2FpdCBmb3IgdGhpcyBmZW5jZSBpbiBhIHNlbGVjdCBzeXN0ZW0gY2FsbC4KKyAgICAgKiBcbm90ZSBUaGUgcmV0dXJuZWQgZmlsZSBkZXNjcmlwdG9yLCBpZiB2YWxpZCwgbXVzdCBiZSBjbG9zZWQgYnkgdGhlIGNhbGxlci4KKyAgICAgKgorICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgaW4gZS5nLiBwb2xsKCkgc3lzdGVtIGNhbGxzLiBUaGlzIGZpbGUgYmVjb21lcyByZWFkYWJsZSAoUE9MTElOKSB3aGVuIHRoZQorICAgICAqIGZlbmNlIGlzIHNpZ25hbGVkLCBhbmQgYmFkIChQT0xMRVJSKSBpZiB0aGUgZmVuY2UgaXMgYWJhbmRvbmVkLgorICAgICAqCisgICAgICogXHJldHVybiBhIGZpbGUgZGVzY3JpcHRvciByZXByZXNlbnRpbmcgdGhpcyBmZW5jZSAod2l0aCBvd25lcnNoaXApLCBvciAtMSBpZiB0aGUgZmVuY2UKKyAgICAgKiBoYXMgYWxyZWFkeSBiZWVuIHNpZ25hbGVkIChcdG9kbyBvciBhYmFuZG9uZWQpLgorICAgICAqCisgICAgICogXHRvZG8gdGhpcyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCBmZW5jZXMgdXNlZCBieSBncmFsbG9jCisgICAgICovCisgICAgaW50IGZkKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmZW5jZSBpcyBhIGhhcmR3YXJlLWJhY2tlZCBmZW5jZS4KKyAgICAgKiBccmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIGhhcmR3YXJlIGZlbmNlCisgICAgICovCisgICAgYm9vbCBpc0hXKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBOdWxsLWZlbmNlLiBBIGZlbmNlIHRoYXQgaGFzIGZpcmVkLgorICAgICAqLworICAgIGNvbnN0ZXhwciBDMkZlbmNlKCkgOiBtSW1wbChudWxscHRyKSB7IH0KKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKyAgICBDMkZlbmNlKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKTsKKyAgICBmcmllbmQgc3RydWN0IF9DMkZlbmNlRmFjdG9yeTsKK307CisKKy8qKgorICogRXZlbnQgb2JqZWN0IHVzZWQgYnkgY29tcG9uZW50cyBhbmQgdGhlIGZyYW1ld29yay4KKyAqCisgKiBJbXBsZW1lbnRzIHRoZSBzaWduYWxpbmcgb2YgYW4gZXZlbnQsIGFuYWxvZ291cyB0byBhICdwcm9taXNlJy4KKyAqCisgKiBIYXJkd2FyZSBiYWNrZWQgZXZlbnRzIGRvIG5vdCBnbyB0aHJvdWdoIHRoaXMgb2JqZWN0LCBhbmQgbXVzdCBiZSBleHBvc2VkIGRpcmVjdGx5IGFzIGZlbmNlcworICogYnkgdmVuZG9ycy4KKyAqLworY2xhc3MgQzJFdmVudCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGZlbmNlIGZvciB0aGlzIGV2ZW50LgorICAgICAqLworICAgIEMyRmVuY2UgZmVuY2UoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFNpZ25hbHMgKGFsbCkgYXNzb2NpYXRlZCBmZW5jZShzKS4KKyAgICAgKiBUaGlzIGhhcyBubyBlZmZlY3Qgbm8gZWZmZWN0IGlmIHRoZSBldmVudCB3YXMgYWxyZWFkeSBzaWduYWxlZCBvciBhYmFuZG9uZWQuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIGZlbmNlKHMpIHdlcmUgc3VjY2Vzc2Z1bGx5IHNpZ25hbGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgICAgIHRoZSBmZW5jZShzKSBoYXZlIGFscmVhZHkgYmVlbiBhYmFuZG9uZWQgb3IgbWVyZ2VkIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgICAgIHRoZSBmZW5jZShzKSBoYXZlIGFscmVhZHkgYmVlbiBzaWduYWxlZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgICAgICBubyBwZXJtaXNzaW9uIHRvIHNpZ25hbCB0aGUgZmVuY2UgKHVuZXhwZWN0ZWQgLSBzeXN0ZW0pCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc2lnbmFsaW5nIHRoZSBmZW5jZShzKSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBmaXJlKCk7CisKKyAgICAvKioKKyAgICAgKiBUcmlnZ2VyIHRoaXMgZXZlbnQgZnJvbSB0aGUgbWVyZ2luZyBvZiB0aGUgc3VwcGxpZWQgZmVuY2VzLiBUaGlzIG1lYW5zIHRoYXQgaXQgd2lsbCBiZQorICAgICAqIGFiYW5kb25lZCBpZiBhbnkgb2YgdGhlc2UgZmVuY2VzIGhhdmUgYmVlbiBhYmFuZG9uZWQsIGFuZCBpdCB3aWxsIGJlIGZpcmVkIGlmIGFsbCBvZiB0aGVzZQorICAgICAqIGZlbmNlcyBoYXZlIGJlZW4gc2lnbmFsZWQuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIG1lcmdpbmcgd2FzIHN1Y2Nlc3NmdWxseSBkb25lCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgICAgIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHBlcmZvcm0gdGhlIG1lcmdpbmcKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSAgICAgdGhlIGZlbmNlIGhhdmUgYWxyZWFkeSBiZWVuIG1lcmdlZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFICAgICB0aGUgZmVuY2UgaGF2ZSBhbHJlYWR5IGJlZW4gc2lnbmFsZWQgb3IgYWJhbmRvbmVkIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgICAgIG5vIHBlcm1pc3Npb24gdG8gbWVyZ2UgdGhlIGZlbmNlICh1bmV4cGVjdGVkIC0gc3lzdGVtKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEICAgICBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIG1lcmdpbmcgdGhlIGZlbmNlKHMpICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IG1lcmdlKHN0ZDo6dmVjdG9yPEMyRmVuY2U+IGZlbmNlcyk7CisKKyAgICAvKioKKyAgICAgKiBBYmFuZG9ucyB0aGUgZXZlbnQgYW5kIGFueSBhc3NvY2lhdGVkIGZlbmNlKHMpLgorICAgICAqIFxub3RlIENhbGwgdGhpcyB0byBleHBsaWNpdGx5IGFiYW5kb24gYW4gZXZlbnQgYmVmb3JlIGl0IGlzIGRlc3RydWN0ZWQgdG8gYXZvaWQgYSB3YXJuaW5nLgorICAgICAqCisgICAgICogVGhpcyBoYXMgbm8gZWZmZWN0IG5vIGVmZmVjdCBpZiB0aGUgZXZlbnQgd2FzIGFscmVhZHkgc2lnbmFsZWQgb3IgYWJhbmRvbmVkLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBmZW5jZShzKSB3ZXJlIHN1Y2Nlc3NmdWxseSBzaWduYWxlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFICAgICB0aGUgZmVuY2UocykgaGF2ZSBhbHJlYWR5IGJlZW4gc2lnbmFsZWQgb3IgbWVyZ2VkIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgICAgIHRoZSBmZW5jZShzKSBoYXZlIGFscmVhZHkgYmVlbiBhYmFuZG9uZWQgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICAgICAgbm8gcGVybWlzc2lvbiB0byBhYmFuZG9uIHRoZSBmZW5jZSAodW5leHBlY3RlZCAtIHN5c3RlbSkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCAgICAgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBzaWduYWxpbmcgdGhlIGZlbmNlKHMpICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IGFiYW5kb24oKTsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8vLyBcYWRkdG9ncm91cCBidWZfaW50ZXJuYWwgSW50ZXJuYWwKKy8vLyBAeworCisvKioKKyAqIEludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IGVuY2Fwc3VsYXRlIGFuIHVwZGF0YWJsZSBzdGF0dXMgdmFsdWUuCisgKi8KK3N0cnVjdCBfQzJJbm5hdGVTdGF0dXMgeworICAgIGlubGluZSBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBtU3RhdHVzOyB9CisKK3Byb3RlY3RlZDoKKyAgICBfQzJJbm5hdGVTdGF0dXMoYzJfc3RhdHVzX3Qgc3RhdHVzKSA6IG1TdGF0dXMoc3RhdHVzKSB7IH0KKworICAgIGMyX3N0YXR1c190IG1TdGF0dXM7IC8vIHRoaXMgc3RhdHVzIGlzIHVwZGF0YWJsZSBieSB0aGUgb2JqZWN0Cit9OworCisvLy8gQH0KKworLyoqCisgKiBUaGlzIGlzIGEgdXRpbGl0eSB0ZW1wbGF0ZSBmb3Igb2JqZWN0cyBwcm90ZWN0ZWQgYnkgYW4gYWNxdWlyZSBmZW5jZSwgc28gdGhhdCBlcnJvcnMgZHVyaW5nCisgKiBhY3F1aXJpbmcgdGhlIG9iamVjdCBhcmUgcHJvcGFnYXRlZCB0byB0aGUgb2JqZWN0IGl0c2VsZi4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyQWNxdWlyYWJsZSA6IHB1YmxpYyBDMkZlbmNlIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBY3F1aXJlcyB0aGUgb2JqZWN0IHByb3RlY3RlZCBieSBhbiBhY3F1aXJlIGZlbmNlLiBBbnkgZXJyb3JzIGR1cmluZyB0aGUgbWFwcGluZyB3aWxsIGJlCisgICAgICogcGFzc2VkIHRvIHRoZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGFjcXVpcmVkIG9iamVjdCBwb3RlbnRpYWxseSBpbnZhbGlkYXRlZCBpZiB3YWl0aW5nIGZvciB0aGUgZmVuY2UgZmFpbGVkLgorICAgICAqLworICAgIFQgZ2V0KCkgeworICAgICAgICAvLyBUT0RPOgorICAgICAgICAvLyB3YWl0KCk7CisgICAgICAgIHJldHVybiBtVDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBDMkFjcXVpcmFibGUoYzJfc3RhdHVzX3QgZXJyb3IsIEMyRmVuY2UgZmVuY2UsIFQgdCkgOiBDMkZlbmNlKGZlbmNlKSwgbUluaXRpYWxFcnJvcihlcnJvciksIG1UKHQpIHsgfQorCitwcml2YXRlOgorICAgIGMyX3N0YXR1c190IG1Jbml0aWFsRXJyb3I7CisgICAgVCBtVDsgLy8gVE9ETzogbW92ZSBpbnN0ZWFkIG9mIGNvcHkKK307CisKKy8vLyBAfQorCisvLy8gXGRlZmdyb3VwIGxpbmVhciBMaW5lYXIgRGF0YSBCbG9ja3MKKy8vLyBAeworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgTElORUFSIEFTUEVDVFMsIEJMT0NLUyBBTkQgVklFV1MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEJhc2ljIHNlZ21lbnQgbWF0aCBzdXBwb3J0LgorICovCitzdHJ1Y3QgQzJTZWdtZW50IHsKKyAgICB1aW50MzJfdCBvZmZzZXQ7CisgICAgdWludDMyX3Qgc2l6ZTsKKworICAgIGlubGluZSBjb25zdGV4cHIgQzJTZWdtZW50KHVpbnQzMl90IG9mZnNldF8sIHVpbnQzMl90IHNpemVfKQorICAgICAgICA6IG9mZnNldChvZmZzZXRfKSwKKyAgICAgICAgICBzaXplKHNpemVfKSB7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzaXplID09IDA7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBvZmZzZXQgPD0gfnNpemU7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gaXNWYWxpZCgpICYmICFpc0VtcHR5KCk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFib29sKCp0aGlzKTsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBjb250YWlucyhjb25zdCBDMlNlZ21lbnQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICghaXNWYWxpZCgpIHx8ICFvdGhlci5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBvZmZzZXQgPD0gb3RoZXIub2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICYmIG9mZnNldCArIHNpemUgPj0gb3RoZXIub2Zmc2V0ICsgb3RoZXIuc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAhb3RoZXIuaXNWYWxpZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG9mZnNldCA9PSBvdGhlci5vZmZzZXQgJiYgc2l6ZSA9PSBvdGhlci5zaXplOworICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgQzJTZWdtZW50ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0ob3RoZXIpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKG90aGVyKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKG90aGVyKSAmJiAhb3BlcmF0b3I9PShvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPD0oY29uc3QgQzJTZWdtZW50ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gb3RoZXIuY29udGFpbnMoKnRoaXMpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwoY29uc3QgQzJTZWdtZW50ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gb3RoZXIuY29udGFpbnMoKnRoaXMpICYmICFvcGVyYXRvcj09KG90aGVyKTsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgZW5kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gb2Zmc2V0ICsgc2l6ZTsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgQzJTZWdtZW50IGludGVyc2VjdChjb25zdCBDMlNlZ21lbnQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlNlZ21lbnQoYzJfbWF4KG9mZnNldCwgb3RoZXIub2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjMl9taW4oZW5kKCksIG90aGVyLmVuZCgpKSAtIGMyX21heChvZmZzZXQsIG90aGVyLm9mZnNldCkpOworICAgIH0KKworICAgIC8qKiBjbGFtcHMgZW5kIHRvIG9mZnNldCBpZiBpdCBvdmVyZmxvd3MgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIEMyU2VnbWVudCBub3JtYWxpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlNlZ21lbnQob2Zmc2V0LCBjMl9tYXgob2Zmc2V0LCBlbmQoKSkgLSBvZmZzZXQpOworICAgIH0KKworICAgIC8qKiBjbGFtcHMgZW5kIHRvIG1heCBpZiBpdCBvdmVyZmxvd3MgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIEMyU2VnbWVudCBzYXR1cmF0ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyU2VnbWVudChvZmZzZXQsIGMyX21pbihzaXplLCB+b2Zmc2V0KSk7CisgICAgfQorCit9OworCisvKioKKyAqIENvbW1vbiBhc3BlY3QgZm9yIGFsbCBvYmplY3RzIHRoYXQgaGF2ZSBhIGxpbmVhciBjYXBhY2l0eS4KKyAqLworY2xhc3MgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworLy8vIFxuYW1lIExpbmVhciBjYXBhY2l0eSBpbnRlcmZhY2UKKy8vLyBAeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgY2FwYWNpdHkoKSBjb25zdCB7IHJldHVybiBtQ2FwYWNpdHk7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgQzJTZWdtZW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJTZWdtZW50KDAsIG1DYXBhY2l0eSk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisKKyNpZiBVSU5UUFRSX01BWCA9PSAweGZmZmZmZmZmCisgICAgc3RhdGljX2Fzc2VydChzaXplb2Yoc2l6ZV90KSA9PSBzaXplb2YodWludDMyX3QpLCAic2l6ZV90IGlzIHRvbyBiaWciKTsKKyNlbHNlCisgICAgc3RhdGljX2Fzc2VydChzaXplb2Yoc2l6ZV90KSA+IHNpemVvZih1aW50MzJfdCksICJzaXplX3QgaXMgdG9vIHNtYWxsIik7CisgICAgLy8gZXhwbGljaXRseSBkaXNhYmxlIGNvbnN0cnVjdGlvbiBmcm9tIHNpemVfdAorICAgIGlubGluZSBleHBsaWNpdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChzaXplX3QgY2FwYWNpdHkpID0gZGVsZXRlOworI2VuZGlmCisKKyAgICBpbmxpbmUgZXhwbGljaXQgY29uc3RleHByIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KHVpbnQzMl90IGNhcGFjaXR5KQorICAgICAgOiBtQ2FwYWNpdHkoY2FwYWNpdHkpIHsgfQorCisgICAgaW5saW5lIGV4cGxpY2l0IGNvbnN0ZXhwciBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChjb25zdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50KQorICAgICAgICA6IG1DYXBhY2l0eShwYXJlbnQgPT0gbnVsbHB0ciA/IDAgOiBwYXJlbnQtPmNhcGFjaXR5KCkpIHsgfQorCitwcml2YXRlOgorICAgIHVpbnQzMl90IG1DYXBhY2l0eTsKKy8vLyBAfQorfTsKKworLyoqCisgKiBBc3BlY3QgZm9yIG9iamVjdHMgdGhhdCBoYXZlIGEgbGluZWFyIHJhbmdlIGluc2lkZSBhIGxpbmVhciBjYXBhY2l0eS4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlLgorICovCitjbGFzcyBfQzJMaW5lYXJSYW5nZUFzcGVjdCA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7CisvLy8gXG5hbWUgTGluZWFyIHJhbmdlIGludGVyZmFjZQorLy8vIEB7CitwdWJsaWM6CisgICAgaW5saW5lIGNvbnN0ZXhwciB1aW50MzJfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBtT2Zmc2V0OyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciB1aW50MzJfdCBlbmRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtT2Zmc2V0ICsgbVNpemU7IH0KKyAgICBpbmxpbmUgY29uc3RleHByIHVpbnQzMl90IHNpemUoKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBvcGVyYXRvciBDMlNlZ21lbnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlNlZ21lbnQobU9mZnNldCwgbVNpemUpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBzdWJyYW5nZSBvZiBjYXBhY2l0eSBbMCwgY2FwYWNpdHldICYgW3NpemUsIHNpemUgKyBvZmZzZXRdCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJMaW5lYXJSYW5nZUFzcGVjdCh1aW50MzJfdCBjYXBhY2l0eV8sIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KGNhcGFjaXR5XyksCisgICAgICAgICAgbU9mZnNldChjMl9taW4ob2Zmc2V0LCBjYXBhY2l0eSgpKSksCisgICAgICAgICAgbVNpemUoYzJfbWluKHNpemUsIGNhcGFjaXR5KCkgLSBtT2Zmc2V0KSkgeworICAgIH0KKworcHJvdGVjdGVkOgorICAgIC8vIGNvcHkgY29uc3RydWN0b3IgKG5vIGVycm9yIGNoZWNrKQorICAgIGlubGluZSBjb25zdGV4cHIgX0MyTGluZWFyUmFuZ2VBc3BlY3QoY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJm90aGVyKQorICAgICAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KG90aGVyLmNhcGFjaXR5KCkpLAorICAgICAgICAgIG1PZmZzZXQob3RoZXIub2Zmc2V0KCkpLAorICAgICAgICAgIG1TaXplKG90aGVyLnNpemUoKSkgeworICAgIH0KKworICAgIC8vIHBhcmVudCBjYXBhY2l0eSByYW5nZSBbMCwgY2FwYWNpdHldCisgICAgaW5saW5lIGNvbnN0ZXhwciBleHBsaWNpdCBfQzJMaW5lYXJSYW5nZUFzcGVjdChjb25zdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50KQorICAgICAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KHBhcmVudCksCisgICAgICAgICAgbU9mZnNldCgwKSwKKyAgICAgICAgICBtU2l6ZShjYXBhY2l0eSgpKSB7CisgICAgfQorCisgICAgLy8gc3VicmFuZ2Ugb2YgcGFyZW50IGNhcGFjaXR5IFswLCBjYXBhY2l0eV0gJiBbc2l6ZSwgc2l6ZSArIG9mZnNldF0KKyAgICBpbmxpbmUgY29uc3RleHByIF9DMkxpbmVhclJhbmdlQXNwZWN0KGNvbnN0IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0ICpwYXJlbnQsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KHBhcmVudCksCisgICAgICAgICAgbU9mZnNldChjMl9taW4ob2Zmc2V0LCBjYXBhY2l0eSgpKSksCisgICAgICAgICAgbVNpemUoYzJfbWluKHNpemUsIGNhcGFjaXR5KCkgLSBtT2Zmc2V0KSkgeworICAgIH0KKworICAgIC8vIHN1YnNlY3Rpb24gb2YgdGhlIHBhcmVudCdzIGFuZCBbb2Zmc2V0LCBvZmZzZXQgKyBzaXplXSByYW5nZXMKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMkxpbmVhclJhbmdlQXNwZWN0KGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICpwYXJlbnQsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KHBhcmVudCksCisgICAgICAgICAgbU9mZnNldChjMl9taW4oYzJfbWF4KG9mZnNldCwgcGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT5vZmZzZXQoKSksIGNhcGFjaXR5KCkpKSwKKyAgICAgICAgICBtU2l6ZShzdGQ6Om1pbihjMl9taW4oc2l6ZSwgcGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT5zaXplKCkpLCBjYXBhY2l0eSgpIC0gbU9mZnNldCkpIHsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMkxpbmVhclJhbmdlQXNwZWN0IGNoaWxkUmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9DMkxpbmVhclJhbmdlQXNwZWN0KAorICAgICAgICAgICAgbVNpemUsCisgICAgICAgICAgICBjMl9taW4oYzJfbWF4KG9mZnNldCwgbU9mZnNldCksIGNhcGFjaXR5KCkpIC0gbU9mZnNldCwKKyAgICAgICAgICAgIGMyX21pbihjMl9taW4oc2l6ZSwgbVNpemUpLCBjYXBhY2l0eSgpIC0gYzJfbWluKGMyX21heChvZmZzZXQsIG1PZmZzZXQpLCBjYXBhY2l0eSgpKSkpOworICAgIH0KKworICAgIGZyaWVuZCBjbGFzcyBfQzJFZGl0YWJsZUxpbmVhclJhbmdlQXNwZWN0OworICAgIC8vIGludmFyaWFudHMgMCA8PSBtT2Zmc2V0IDw9IG1PZmZzZXQgKyBtU2l6ZSA8PSBjYXBhY2l0eSgpCisgICAgdWludDMyX3QgbU9mZnNldDsKKyAgICB1aW50MzJfdCBtU2l6ZTsKKy8vLyBAfQorfTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBzYWZlIHJhbmdlIGNhbGN1bGF0aW9ucyB1c2luZyBzaXplX3Qtcy4KKyAqLworY2xhc3MgQzJMaW5lYXJSYW5nZSA6IHB1YmxpYyBfQzJMaW5lYXJSYW5nZUFzcGVjdCB7CitwdWJsaWM6CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkxpbmVhclJhbmdlKGNvbnN0IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0ICZwYXJlbnQsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9DMkxpbmVhclJhbmdlQXNwZWN0KCZwYXJlbnQsIG9mZnNldCwgc2l6ZSkgeyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIEMyTGluZWFyUmFuZ2UoY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnBhcmVudCwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCisgICAgICAgIDogX0MyTGluZWFyUmFuZ2VBc3BlY3QoJnBhcmVudCwgb2Zmc2V0LCBzaXplKSB7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgQzJMaW5lYXJSYW5nZSBpbnRlcnNlY3Qoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyTGluZWFyUmFuZ2UoKnRoaXMsIG9mZnNldCwgc2l6ZSk7CisgICAgfQorfTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBzaW1wbGUgYW5kIHNhZmUgY2FwYWNpdHkgYW5kIHJhbmdlIGNvbnN0cnVjdGlvbi4KKyAqLworY2xhc3MgQzJMaW5lYXJDYXBhY2l0eSA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7CitwdWJsaWM6CisgICAgaW5saW5lIGNvbnN0ZXhwciBleHBsaWNpdCBDMkxpbmVhckNhcGFjaXR5KHNpemVfdCBjYXBhY2l0eSkKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChjMl9taW4oY2FwYWNpdHksIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSkpIHsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkxpbmVhclJhbmdlIHJhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMkxpbmVhclJhbmdlKCp0aGlzLCBvZmZzZXQsIHNpemUpOworICAgIH0KK307CisKKy8qKgorICogQXNwZWN0IGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhbiBlZGl0YWJsZSBsaW5lYXIgcmFuZ2UuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4KKyAqLworY2xhc3MgX0MyRWRpdGFibGVMaW5lYXJSYW5nZUFzcGVjdCA6IHB1YmxpYyBfQzJMaW5lYXJSYW5nZUFzcGVjdCB7CisgICAgdXNpbmcgX0MyTGluZWFyUmFuZ2VBc3BlY3Q6Ol9DMkxpbmVhclJhbmdlQXNwZWN0OworCitwdWJsaWM6CisvLy8gXG5hbWUgRWRpdGFibGUgbGluZWFyIHJhbmdlIGludGVyZmFjZQorLy8vIEB7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvZmZzZXQgdG8gfG9mZnNldHwsIHdoaWxlIHRyeWluZyB0byBrZWVwIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB1bmNoYW5nZWQgKGUuZy4KKyAgICAgKiBzaXplIHdpbGwgZ3JvdyBpZiBvZmZzZXQgaXMgZGVjcmVhc2VkLCBhbmQgbWF5IHNocmluayBpZiBvZmZzZXQgaXMgaW5jcmVhc2VkLikgUmV0dXJucworICAgICAqIHRydWUgaWYgc3VjY2Vzc2Z1bCwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byBpZiAwIDw9IHxvZmZzZXR8IDw9IGNhcGFjaXR5KCkuCisgICAgICoKKyAgICAgKiBOb3RlOiBzZXR0aW5nIG9mZnNldCBhbmQgc2l6ZSB3aWxsIHlpZWxkIGRpZmZlcmVudCByZXN1bHQgZGVwZW5kaW5nIG9uIHRoZSBvcmRlciBvZiB0aGUKKyAgICAgKiBvcGVyYXRpb25zLiBBbHdheXMgc2V0IG9mZnNldCBmaXJzdCB0byBlbnN1cmUgcHJvcGVyIHNpemUuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgc2V0T2Zmc2V0KHVpbnQzMl90IG9mZnNldCkgeworICAgICAgICBpZiAob2Zmc2V0ID4gY2FwYWNpdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9mZnNldCA+IG1PZmZzZXQgKyBtU2l6ZSkgeworICAgICAgICAgICAgbVNpemUgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNpemUgPSBtT2Zmc2V0ICsgbVNpemUgLSBvZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgbU9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2l6ZSB0byB8c2l6ZXwuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLCB3aGljaCBpcyBlcXVpdmFsZW50IHRvCisgICAgICogaWYgMCA8PSB8c2l6ZXwgPD0gY2FwYWNpdHkoKSAtIG9mZnNldCgpLgorICAgICAqCisgICAgICogTm90ZTogc2V0dGluZyBvZmZzZXQgYW5kIHNpemUgd2lsbCB5aWVsZCBkaWZmZXJlbnQgcmVzdWx0IGRlcGVuZGluZyBvbiB0aGUgb3JkZXIgb2YgdGhlCisgICAgICogb3BlcmF0aW9ucy4gQWx3YXlzIHNldCBvZmZzZXQgZmlyc3QgdG8gZW5zdXJlIHByb3BlciBzaXplLgorICAgICAqLworICAgIGlubGluZSBib29sIHNldFNpemUodWludDMyX3Qgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA+IGNhcGFjaXR5KCkgLSBtT2Zmc2V0KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2l6ZSA9IHNpemU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG9mZnNldCB0byB8b2Zmc2V0fCB3aXRoIGJlc3QgZWZmb3J0LiBTYW1lIGFzIHNldE9mZnNldCgpIGV4Y2VwdCB0aGF0IG9mZnNldCB3aWxsCisgICAgICogYmUgY2xhbXBlZCB0byB0aGUgYnVmZmVyIGNhcGFjaXR5LgorICAgICAqCisgICAgICogTm90ZTogc2V0dGluZyBvZmZzZXQgYW5kIHNpemUgKGV2ZW4gdXNpbmcgYmVzdCBlZmZvcnQpIHdpbGwgeWllbGQgZGlmZmVyZW50IHJlc3VsdCBkZXBlbmRpbmcKKyAgICAgKiBvbiB0aGUgb3JkZXIgb2YgdGhlIG9wZXJhdGlvbnMuIEFsd2F5cyBzZXQgb2Zmc2V0IGZpcnN0IHRvIGVuc3VyZSBwcm9wZXIgc2l6ZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBzZXRPZmZzZXRfYmUodWludDMyX3Qgb2Zmc2V0KSB7CisgICAgICAgICh2b2lkKXNldE9mZnNldChjMl9taW4ob2Zmc2V0LCBjYXBhY2l0eSgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2l6ZSB0byB8c2l6ZXwgd2l0aCBiZXN0IGVmZm9ydC4gU2FtZSBhcyBzZXRTaXplKCkgZXhjZXB0IHRoYXQgdGhlIHNlbGVjdGVkIHJlZ2lvbgorICAgICAqIHdpbGwgYmUgY2xhbXBlZCB0byB0aGUgYnVmZmVyIGNhcGFjaXR5IChlLmcuIHNpemUgaXMgY2xhbXBlZCB0byBbMCwgY2FwYWNpdHkoKSAtIG9mZnNldCgpXSkuCisgICAgICoKKyAgICAgKiBOb3RlOiBzZXR0aW5nIG9mZnNldCBhbmQgc2l6ZSAoZXZlbiB1c2luZyBiZXN0IGVmZm9ydCkgd2lsbCB5aWVsZCBkaWZmZXJlbnQgcmVzdWx0IGRlcGVuZGluZworICAgICAqIG9uIHRoZSBvcmRlciBvZiB0aGUgb3BlcmF0aW9ucy4gQWx3YXlzIHNldCBvZmZzZXQgZmlyc3QgdG8gZW5zdXJlIHByb3BlciBzaXplLgorICAgICAqLworICAgIGlubGluZSB2b2lkIHNldFNpemVfYmUodWludDMyX3Qgc2l6ZSkgeworICAgICAgICBtU2l6ZSA9IGMyX21pbihzaXplLCBjYXBhY2l0eSgpIC0gbU9mZnNldCk7CisgICAgfQorLy8vIEB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgQUxMT0NBVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy8gXGluZ3JvdXAgYWxsb2NhdG9yIEFsbG9jYXRpb24gYW5kIG1lbW9yeSBwbGFjZW1lbnQKKy8vLyBAeworCitjbGFzcyBDMkxpbmVhckFsbG9jYXRpb247CitjbGFzcyBDMkdyYXBoaWNBbGxvY2F0aW9uOworCisvKioKKyAqICBBbGxvY2F0b3JzIGFyZSB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gYWxsb2NhdGUgbWVtb3J5IChhbGxvY2F0aW9ucykgZm9yIGJ1ZmZlcnMuIFRoZXkgY2FuCisgKiAgc3VwcG9ydCBlaXRoZXIgMUQgb3IgMkQgYWxsb2NhdGlvbnMuCisgKgorICogIFxub3RlIEluIHRoZW9yeSB0aGV5IGNvdWxkIHN1cHBvcnQgYm90aCwgYnV0IGluIHByYWN0aWNlLCB3ZSB3aWxsIHVzZSBvbmx5IG9uZSBvciB0aGUgb3RoZXIuCisgKgorICogIE5ldmVyIGNvbnN0cnVjdGVkIG9uIHN0YWNrLgorICoKKyAqICBBbGxvY2F0b3JzIGFyZSBwcm92aWRlZCBieSB2ZW5kb3JzLgorICovCitjbGFzcyBDMkFsbG9jYXRvciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQWxsb2NhdG9yIElEIHR5cGUuCisgICAgICovCisgICAgdHlwZWRlZiB1aW50MzJfdCBpZF90OworICAgIGVudW0gOiBpZF90IHsKKyAgICAgICAgQkFEX0lEID0gMHhCQURELCAvLyBpbnZhbGlkIGFsbG9jYXRvciBJRAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0aW9uIHR5cGVzLiBUaGlzIGlzIGEgYml0bWFzayBhbmQgaXMgdXNlZCBpbiBDMkFsbG9jYXRvcjo6SW5mbworICAgICAqIHRvIGxpc3QgdGhlIHN1cHBvcnRlZCBhbGxvY2F0aW9uIHR5cGVzIG9mIGFuIGFsbG9jYXRvci4KKyAgICAgKi8KKyAgICBlbnVtIHR5cGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgTElORUFSICA9IDEgPDwgMCwgLy8KKyAgICAgICAgR1JBUEhJQyA9IDEgPDwgMSwKKyAgICB9OworCisgICAgLyoqCisgICAgICogSW5mb3JtYXRpb24gYWJvdXQgYW4gYWxsb2NhdG9yLgorICAgICAqCisgICAgICogQWxsb2NhdG9ycyBkb24ndCBoYXZlIGEgcXVlcnkgQVBJIHNvIGFsbCBxdWVyaWFibGUgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGhlcmUuCisgICAgICovCisgICAgc3RydWN0IFRyYWl0cyB7CisgICAgICAgIEMyU3RyaW5nIG5hbWU7ICAgICAgICAgICAgICAvLy88IGFsbG9jYXRvciBuYW1lCisgICAgICAgIGlkX3QgaWQ7ICAgICAgICAgICAgICAgICAgICAvLy88IGFsbG9jYXRvciBJRAorICAgICAgICB0eXBlX3Qgc3VwcG9ydGVkVHlwZXM7ICAgICAgLy8vPCBzdXBwb3J0ZWQgYWxsb2NhdGlvbiB0eXBlcworICAgICAgICBDMk1lbW9yeVVzYWdlIG1pbmltdW1Vc2FnZTsgLy8vPCB1c2FnZSB0aGF0IGlzIG1pbmltYWxseSByZXF1aXJlZCBmb3IgYWxsb2NhdGlvbnMKKyAgICAgICAgQzJNZW1vcnlVc2FnZSBtYXhpbXVtVXNhZ2U7IC8vLzwgdXNhZ2UgdGhhdCBpcyBtYXhpbWFsbHkgYWxsb3dlZCBmb3IgYWxsb2NhdGlvbnMKKyAgICB9OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdW5pcXVlIG5hbWUgb2YgdGhpcyBhbGxvY2F0b3IuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBhbGxvY2F0b3IuCisgICAgICogXHJldHZhbCBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBhY3R1YWwgbmFtZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIElEIGZvciB0aGlzIGFsbG9jYXRvci4gVGhpcyBJRCBpcyB1c2VkIHRvIGdldCB0aGlzIGFsbG9jYXRvciBmcm9tIHRoZQorICAgICAqIGFsbG9jYXRvciBzdG9yZSwgYW5kIHRvIGlkZW50aWZ5IHRoaXMgYWxsb2NhdG9yIGFjcm9zcyBhbGwgcHJvY2Vzc2VzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgdW5pcXVlIElEIGZvciB0aGlzIGFsbG9jYXRvci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGlkX3QgZ2V0SWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGxvY2F0b3IgdHJhaXRzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBBbGxvY2F0b3JzIGRvbid0IGhhdmUgYSBmdWxsLWZsZWRnZWQgcXVlcnkgQVBJLCBvbmx5IHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogXHJldHVybiBhbGxvY2F0b3IgaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUcmFpdHM+IGdldFRyYWl0cygpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIDFEIGFsbG9jYXRpb24gb2YgZ2l2ZW4gfGNhcGFjaXR5fCBhbmQgfHVzYWdlfC4gSWYgc3VjY2Vzc2Z1bCwgdGhlIGFsbG9jYXRpb24gaXMKKyAgICAgKiBzdG9yZWQgaW4gfGFsbG9jYXRpb258LiBPdGhlcndpc2UsIHxhbGxvY2F0aW9ufCBpcyBzZXQgdG8gJ251bGxwdHInLgorICAgICAqCisgICAgICogXHBhcmFtIGNhcGFjaXR5ICAgICAgdGhlIHNpemUgb2YgcmVxdWVzdGVkIGFsbG9jYXRpb24gKHRoZSBhbGxvY2F0aW9uIGNvdWxkIGJlIHNsaWdodGx5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgbGFyZ2VyLCBlLmcuIHRvIGFjY291bnQgZm9yIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSB1c2FnZSAgICAgICAgIHRoZSBtZW1vcnkgdXNhZ2UgaW5mbyBmb3IgdGhlIHJlcXVlc3RlZCBhbGxvY2F0aW9uLiBcbm90ZSB0aGF0IHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkIGFsbG9jYXRpb24gbWF5IGJlIGxhdGVyIHVzZWQvbWFwcGVkIHdpdGggZGlmZmVyZW50IHVzYWdlLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBhbGxvY2F0b3Igc2hvdWxkIGxheW91dCB0aGUgYnVmZmVyIHRvIGJlIG9wdGltaXplZCBmb3IgdGhpcyB1c2FnZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBidXQgbXVzdCBzdXBwb3J0IGFueSB1c2FnZS4gT25lIGV4Y2VwdGlvbjogcHJvdGVjdGVkIGJ1ZmZlcnMgY2FuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb25seSBiZSB1c2VkIGluIGEgcHJvdGVjdGVkIHNjZW5hcmlvLgorICAgICAqIFxwYXJhbSBhbGxvY2F0aW9uICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGFsbG9jYXRpb24gc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBhbGxvY2F0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgYWxsb2NhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgY2FwYWNpdHkgb3IgdXNhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQpIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBhbGxvY2F0b3IgZG9lcyBub3Qgc3VwcG9ydCAxRCBhbGxvY2F0aW9ucworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBhbGxvY2F0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbmV3TGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5IF9fdW51c2VkLCBDMk1lbW9yeVVzYWdlIHVzYWdlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24gLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIChSZSljcmVhdGVzIGEgMUQgYWxsb2NhdGlvbiBmcm9tIGEgbmF0aXZlIHxoYW5kbGV8LiBJZiBzdWNjZXNzZnVsLCB0aGUgYWxsb2NhdGlvbiBpcyBzdG9yZWQKKyAgICAgKiBpbiB8YWxsb2NhdGlvbnwuIE90aGVyd2lzZSwgfGFsbG9jYXRpb258IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gaGFuZGxlICAgICAgdGhlIGhhbmRsZSBmb3IgdGhlIGV4aXN0aW5nIGFsbG9jYXRpb24uIE9uIHN1Y2Nlc3MsIHRoZSBhbGxvY2F0aW9uIHdpbGwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGFrZSBvd25lcnNoaXAgb2YgfGhhbmRsZXwuCisgICAgICogXHBhcmFtIGFsbG9jYXRpb24gIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGFsbG9jYXRpb24gc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgcmVjcmVhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlY3JlYXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIHJlY3JlYXRpb24gdGltZWQgb3V0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gcmVjcmVhdGUgdGhlIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBpbnZhbGlkIGhhbmRsZSAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMUQgYWxsb2NhdGlvbnMKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgYWxsb2NhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbiAvKiBub25udWxsICovKSB7CisgICAgICAgICphbGxvY2F0aW9uID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb2NhdGVzIGEgMkQgYWxsb2NhdGlvbiBvZiBnaXZlbiB8d2lkdGh8LCB8aGVpZ2h0fCwgfGZvcm1hdHwgYW5kIHx1c2FnZXwuIElmIHN1Y2Nlc3NmdWwsCisgICAgICogdGhlIGFsbG9jYXRpb24gaXMgc3RvcmVkIGluIHxhbGxvY2F0aW9ufC4gT3RoZXJ3aXNlLCB8YWxsb2NhdGlvbnwgaXMgc2V0IHRvICdudWxscHRyJy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB3aWR0aCAgICAgICAgIHRoZSB3aWR0aCBvZiByZXF1ZXN0ZWQgYWxsb2NhdGlvbiAodGhlIGFsbG9jYXRpb24gY291bGQgYmUgc2xpZ2h0bHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBsYXJnZXIsIGUuZy4gdG8gYWNjb3VudCBmb3IgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCisgICAgICogXHBhcmFtIGhlaWdodCAgICAgICAgdGhlIGhlaWdodCBvZiByZXF1ZXN0ZWQgYWxsb2NhdGlvbiAodGhlIGFsbG9jYXRpb24gY291bGQgYmUgc2xpZ2h0bHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBsYXJnZXIsIGUuZy4gdG8gYWNjb3VudCBmb3IgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCisgICAgICogXHBhcmFtIGZvcm1hdCAgICAgICAgdGhlIHBpeGVsIGZvcm1hdCBvZiByZXF1ZXN0ZWQgYWxsb2NhdGlvbi4gVGhpcyBjb3VsZCBiZSBhIHZlbmRvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljIGZvcm1hdC4KKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgICAgICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvbi4gXG5vdGUgdGhhdCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBhbGxvY2F0aW9uIG1heSBiZSBsYXRlciB1c2VkL21hcHBlZCB3aXRoIGRpZmZlcmVudCB1c2FnZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgYWxsb2NhdG9yIHNob3VsZCBsYXlvdXQgdGhlIGJ1ZmZlciB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYnV0IG11c3Qgc3VwcG9ydCBhbnkgdXNhZ2UuIE9uZSBleGNlcHRpb246IHByb3RlY3RlZCBidWZmZXJzIGNhbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYWxsb2NhdGlvbiAgICBwb2ludGVyIHRvIHdoZXJlIHRoZSBhbGxvY2F0aW9uIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGFsbG9jYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSB0aGUgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0aGlzIGFsbG9jYXRvciBkb2VzIG5vdCBzdXBwb3J0IDJEIGFsbG9jYXRpb25zCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIGFsbG9jYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBuZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoIF9fdW51c2VkLCB1aW50MzJfdCBoZWlnaHQgX191bnVzZWQsIHVpbnQzMl90IGZvcm1hdCBfX3VudXNlZCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24gLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIChSZSljcmVhdGVzIGEgMkQgYWxsb2NhdGlvbiBmcm9tIGEgbmF0aXZlIGhhbmRsZS4gIElmIHN1Y2Nlc3NmdWwsIHRoZSBhbGxvY2F0aW9uIGlzIHN0b3JlZAorICAgICAqIGluIHxhbGxvY2F0aW9ufC4gT3RoZXJ3aXNlLCB8YWxsb2NhdGlvbnwgaXMgc2V0IHRvICdudWxscHRyJy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBoYW5kbGUgICAgICB0aGUgaGFuZGxlIGZvciB0aGUgZXhpc3RpbmcgYWxsb2NhdGlvbi4gT24gc3VjY2VzcywgdGhlIGFsbG9jYXRpb24gd2lsbAorICAgICAqICAgICAgICAgICAgICAgICAgICB0YWtlIG93bmVyc2hpcCBvZiB8aGFuZGxlfC4KKyAgICAgKiBccGFyYW0gYWxsb2NhdGlvbiAgcG9pbnRlciB0byB3aGVyZSB0aGUgYWxsb2NhdGlvbiBzaGFsbCBiZSBzdG9yZWQgb24gc3VjY2Vzcy4gbnVsbHB0cgorICAgICAqICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBhbGxvY2F0aW9uIHdhcyByZWNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcmVjcmVhdGUgdGhlIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgcmVjcmVhdGlvbiB0aW1lZCBvdXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byByZWNyZWF0ZSB0aGUgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIGludmFsaWQgaGFuZGxlIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBhbGxvY2F0b3IgZG9lcyBub3Qgc3VwcG9ydCAyRCBhbGxvY2F0aW9ucworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyByZWNyZWF0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24gLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworcHJvdGVjdGVkOgorICAgIEMyQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworfTsKKworLyoqCisgKiBcaW5ncm91cCBsaW5lYXIgYWxsb2NhdG9yCisgKiAxRCBhbGxvY2F0aW9uIGludGVyZmFjZS4KKyAqLworY2xhc3MgQzJMaW5lYXJBbGxvY2F0aW9uIDogcHVibGljIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBNYXBzIGEgcG9ydGlvbiBvZiBhbiBhbGxvY2F0aW9uIHN0YXJ0aW5nIGZyb20gfG9mZnNldHwgd2l0aCB8c2l6ZXwgaW50byBsb2NhbCBwcm9jZXNzIG1lbW9yeS4KKyAgICAgKiBTdG9yZXMgdGhlIHN0YXJ0aW5nIGFkZHJlc3MgaW50byB8YWRkcnwsIG9yIE5VTEwgaWYgdGhlIG9wZXJhdGlvbiB3YXMgdW5zdWNjZXNzZnVsLgorICAgICAqIHxmZW5jZXwgd2lsbCBjb250YWluIGFuIGFjcXVpcmUgc3luYyBmZW5jZSBvYmplY3QuIElmIGl0IGlzIGFscmVhZHkKKyAgICAgKiBzYWZlIHRvIGFjY2VzcyB0aGUgYnVmZmVyIGNvbnRlbnRzLCB0aGVuIGl0IHdpbGwgY29udGFpbiBhbiBlbXB0eSAoYWxyZWFkeSBmaXJlZCkgZmVuY2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gb2Zmc2V0ICAgICAgICBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgcG9ydGlvbiB0byBiZSBtYXBwZWQgKHRoaXMgZG9lcyBub3QgaGF2ZSB0bworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGJlIHBhZ2UgYWxpZ25lZCkKKyAgICAgKiBccGFyYW0gc2l6ZSAgICAgICAgICBzaXplIG9mIHRoZSBwb3J0aW9uIHRvIGJlIG1hcHBlZCAodGhpcyBkb2VzIG5vdCBoYXZlIHRvIGJlIHBhZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbGlnbmVkKQorICAgICAqIFxwYXJhbSB1c2FnZSAgICAgICAgIHRoZSBkZXNpcmVkIHVzYWdlLiBcdG9kbyB0aGlzIG11c3QgYmUga1NvZnR3YXJlUmVhZCBhbmQvb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBrU29mdHdhcmVXcml0ZS4KKyAgICAgKiBccGFyYW0gZmVuY2UgICAgICAgICBhIHBvaW50ZXIgdG8gYSBmZW5jZSBvYmplY3QgaWYgYW4gYXN5bmMgbWFwcGluZyBpcyByZXF1ZXN0ZWQuIElmCisgICAgICogICAgICAgICAgICAgICAgICAgICAgbm90LW51bGwsIGFuZCBhY3F1aXJlIGZlbmNlIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gc3VjY2Vzcywgb3IgZW1wdHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBmZW5jZSBvbiBmYWlsdXJlLiBJZiBudWxsLCB0aGUgbWFwcGluZyB3aWxsIGJlIHN5bmNocm9ub3VzLgorICAgICAqIFxwYXJhbSBhZGRyICAgICAgICAgIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgbWFwcGVkIHBvcnRpb24gd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZC4gT24gZmFpbHVyZSwgbnVsbHB0ciB3aWxsIGJlIHN0b3JlZCBoZXJlLgorICAgICAqCisgICAgICogXHRvZG8gT25seSBvbmUgcG9ydGlvbiBjYW4gYmUgbWFwcGVkIGF0IHRoZSBzYW1lIHRpbWUgLSB0aGlzIGlzIHRydWUgZm9yIGdyYWxsb2MsIGJ1dCB0aGVyZQorICAgICAqICAgICAgIGlzIG5vIG5lZWQgZm9yIHRoaXMgZm9yIDFEIGJ1ZmZlcnMuCisgICAgICogXHRvZG8gRG8gd2UgbmVlZCB0byBzdXBwb3J0IHN5bmMgb3BlcmF0aW9uIGFzIHdlIGNvdWxkIGp1c3Qgd2FpdCBmb3IgdGhlIGZlbmNlPworICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gbWFwIHRoZSBwb3J0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSBpZiB0aGUgYWxsb2NhdGlvbiBpcyBhbHJlYWR5IG1hcHBlZC4KKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGUgb3BlcmF0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgdGhlIHBhcmFtZXRlcnMgKG9mZnNldC9zaXplKSBhcmUgaW52YWxpZCBvciBvdXRzaWRlIHRoZSBhbGxvY2F0aW9uLCBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSB1c2FnZSBmbGFncyBhcmUgaW52YWxpZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbiBmcm9tIGNvbXBsZXRpbmcgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBtYXAoCisgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UgLyogbnVsbGFibGUgKi8sCisgICAgICAgICAgICB2b2lkICoqYWRkciAvKiBub25udWxsICovKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBVbm1hcHMgYSBwb3J0aW9uIG9mIGFuIGFsbG9jYXRpb24gYXQgfGFkZHJ8IHdpdGggfHNpemV8LiBUaGVzZSBtdXN0IGJlIHBhcmFtZXRlcnMgcHJldmlvdXNseQorICAgICAqIHBhc3NlZCB0byBhbmQgcmV0dXJuZWQgYnkgfG1hcHw7IG90aGVyd2lzZSwgdGhpcyBvcGVyYXRpb24gaXMgYSBuby1vcC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhZGRyICAgICAgICAgIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIG1hcHBlZCByZWdpb24KKyAgICAgKiBccGFyYW0gc2l6ZSAgICAgICAgICBzaXplIG9mIHRoZSBtYXBwZWQgcmVnaW9uCisgICAgICogXHBhcmFtIGZlbmNlICAgICAgICAgYSBwb2ludGVyIHRvIGEgZmVuY2Ugb2JqZWN0IGlmIGFuIGFzeW5jIHVubWFwcGluZyBpcyByZXF1ZXN0ZWQuIElmCisgICAgICogICAgICAgICAgICAgICAgICAgICAgbm90LW51bGwsIGEgcmVsZWFzZSBmZW5jZSB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MsIG9yIGVtcHR5IGZlbmNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb24gZmFpbHVyZS4gVGhpcyBmZW5jZSBzaWduYWxzIHdoZW4gdGhlIG9yaWdpbmFsIGFsbG9jYXRpb24gY29udGFpbnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbGwgY2hhbmdlcyB0aGF0IGhhcHBlbmVkIHRvIHRoZSBtYXBwZWQgcmVnaW9uLiBJZiBudWxsLCB0aGUgdW5tYXBwaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzeW5jaHJvbm91cy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGlmIHRoZSBhbGxvY2F0aW9uIHdhcyBub3QgbWFwcGVkIHByZXZpb3VzbHkuCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgdGhlIHBhcmFtZXRlcnMgKGFkZHIvc2l6ZSkgZG8gbm90IGNvcnJlc3BvbmQgdG8gcHJldmlvdXNseSBtYXBwZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICByZWdpb25zIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgb3BlcmF0aW9uIGZyb20gY29tcGxldGluZyAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIHVubWFwIHRoZSBwb3J0aW9uICh1bmV4cGVjdGVkIC0gc3lzdGVtKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgdW5tYXAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGxvY2F0b3IgSUQgZm9yIHRoaXMgYWxsb2NhdGlvbi4gVGhpcyBpcyB1c2VmdWwgdG8gcHV0IHRoZSBoYW5kbGUgaW50byBjb250ZXh0LgorICAgICAqLworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGlvbiBoYW5kbGUuCisgICAgICovCisgICAgdmlydHVhbCBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIHNhbWUgYWxsb2NhdGlvbiBhcyB8b3RoZXJ8LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJm90aGVyKSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBcdG9kbyBzaG91bGQgd2UgbGltaXQgYWxsb2NhdGlvbiBkaXJlY3RseT8KKyAgICBDMkxpbmVhckFsbG9jYXRpb24oc2l6ZV90IGNhcGFjaXR5KSA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KGMyX21pbihjYXBhY2l0eSwgVUlOVDMyX01BWCkpIHt9CisgICAgdmlydHVhbCB+QzJMaW5lYXJBbGxvY2F0aW9uKCkgPSBkZWZhdWx0OworfTsKKworY2xhc3MgQzJDaXJjdWxhckJsb2NrOworY2xhc3MgQzJMaW5lYXJCbG9jazsKK2NsYXNzIEMyR3JhcGhpY0Jsb2NrOworCisvKioKKyAqICBCbG9jayBwb29scyBhcmUgdXNlZCBieSBjb21wb25lbnRzIHRvIG9idGFpbiBvdXRwdXQgYnVmZmVycyBpbiBhbiBlZmZpY2llbnQgd2F5LiBUaGV5IGNhbgorICogIHN1cHBvcnQgZWl0aGVyIGxpbmVhciAoMUQpLCBjaXJjdWxhciAoMUQpIG9yIGdyYXBoaWMgKDJEKSBibG9ja3MuCisgKgorICogIEJsb2NrIHBvb2xzIGRlY291cGxlIHRoZSByZWN5Y2xpbmcgb2YgbWVtb3J5L2FsbG9jYXRpb25zIGZyb20gdGhlIGNvbXBvbmVudHMuIFRoZXkgYXJlIG1lYW50IHRvCisgKiAgYmUgYW4gb3BhcXVlIHNlcnZpY2UgKHRoZXJlIGFyZSBubyBwdWJsaWMgQVBJcyBvdGhlciB0aGFuIG9idGFpbmluZyBibG9ja3MpIHByb3ZpZGVkIGJ5IHRoZQorICogIHBsYXRmb3JtLiBCbG9jayBwb29scyBhcmUgYWxzbyBtZWFudCB0byBkZWNvdXBsZSBhbGxvY2F0aW9ucyBmcm9tIG1lbW9yeSB1c2VkIGJ5IGJ1ZmZlcnMuIFRoaXMKKyAqICBpcyBhY2NvbXBsaXNoZWQgYnkgYWxsb3dpbmcgcG9vbHMgdG8gYWxsb3QgbXVsdGlwbGUgbWVtb3J5ICdibG9ja3MnIG9uIGEgc2luZ2xlIGFsbG9jYXRpb24uIEFzCisgKiAgdGhlaXIgbmFtZSBzdWdnZXN0LCBibG9jayBwb29scyBtYWludGFpbiBhIHBvb2wgb2YgbWVtb3J5IGJsb2Nrcy4gV2hlbiBhIGNvbXBvbmVudCBhc2tzIGZvcgorICogIGEgbWVtb3J5IGJsb2NrLCBwb29scyB3aWxsIHRyeSB0byByZXR1cm4gYSBmcmVlIG1lbW9yeSBibG9jayBhbHJlYWR5IGluIHRoZSBwb29sLiBJZiBubyBzdWNoCisgKiAgYmxvY2sgZXhpc3RzLCB0aGV5IHdpbGwgYWxsb2NhdGUgbWVtb3J5IHVzaW5nIHRoZSBiYWNraW5nIGFsbG9jYXRvciBhbmQgYWxsb3QgYSBibG9jayBvbiB0aGF0CisgKiAgYWxsb2NhdGlvbi4gV2hlbiBibG9ja3MgYXJlIG5vIGxvbmdlciB1c2VkIGluIHRoZSBzeXN0ZW0sIHRoZXkgYXJlIHJlY3ljbGVkIGJhY2sgdG8gdGhlIGJsb2NrCisgKiAgcG9vbCBhbmQgYXJlIGF2YWlsYWJsZSBhcyBmcmVlIGJsb2Nrcy4KKyAqCisgKiAgTmV2ZXIgY29uc3RydWN0ZWQgb24gc3RhY2suCisgKi8KK2NsYXNzIEMyQmxvY2tQb29sIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBCbG9jayBwb29sIElEIHR5cGUuCisgICAgICovCisgICAgdHlwZWRlZiB1aW50NjRfdCBsb2NhbF9pZF90OworCisgICAgZW51bSA6IGxvY2FsX2lkX3QgeworICAgICAgICBCQVNJQ19MSU5FQVIgPSAwLCAgLy8vPCBJRCBvZiBiYXNpYyAodW5vcHRpbWl6ZWQpIGJsb2NrIHBvb2wgZm9yIGZldGNoaW5nIDFEIGJsb2NrcworICAgICAgICBCQVNJQ19HUkFQSElDID0gMSwgLy8vPCBJRCBvZiBiYXNpYyAodW5vcHRpbWl6ZWQpIGJsb2NrIHBvb2wgZm9yIGZldGNoaW5nIDJEIGJsb2NrcworICAgICAgICBQTEFURk9STV9TVEFSVCA9IDB4MTAsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIElEIGZvciB0aGlzIGJsb2NrIHBvb2wuIFRoaXMgSUQgaXMgdXNlZCB0byBnZXQgdGhpcyBibG9jayBwb29sIGZyb20gdGhlIHBsYXRmb3JtLgorICAgICAqIEl0IGlzIG9ubHkgdmFsaWQgaW4gdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiBhIGxvY2FsIElEIGZvciB0aGlzIGJsb2NrIHBvb2wuCisgICAgICovCisgICAgdmlydHVhbCBsb2NhbF9pZF90IGdldExvY2FsSWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgYmFja2luZyBhbGxvY2F0b3Igb2YgdGhpcyBibG9jayBwb29sLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBJRCBvZiB0aGUgYmFja2luZyBhbGxvY2F0b3Igb2YgdGhpcyBibG9jayBwb29sLgorICAgICAqLworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW5zIGEgbGluZWFyIHdyaXRlYWJsZSBibG9jayBvZiBnaXZlbiB8Y2FwYWNpdHl8IGFuZCB8dXNhZ2V8LiBJZiBzdWNjZXNzZnVsLCB0aGUKKyAgICAgKiBibG9jayBpcyBzdG9yZWQgaW4gfGJsb2NrfC4gT3RoZXJ3aXNlLCB8YmxvY2t8IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gY2FwYWNpdHkgdGhlIHNpemUgb2YgcmVxdWVzdGVkIGJsb2NrLgorICAgICAqIFxwYXJhbSB1c2FnZSAgICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYmxvY2suIFJldHVybmVkIGJsb2NrcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgIG9wdGltaXplZCBmb3IgdGhpcyB1c2FnZSwgYnV0IG1heSBiZSB1c2VkIHdpdGggYW55IHVzYWdlLiBPbmUgZXhjZXB0aW9uOgorICAgICAqICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYmxvY2tzL2J1ZmZlcnMgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYmxvY2sgICAgcG9pbnRlciB0byB3aGVyZSB0aGUgb2J0YWluZWQgYmxvY2sgc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIgd2lsbAorICAgICAqICAgICAgICAgICAgICAgICBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgYW55IHJlcXVpcmVkIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfQkxPQ0tJTkcgIHRoZSBvcGVyYXRpb24gaXMgYmxvY2tlZAorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gY29tcGxldGUgYW55IHJlcXVpcmVkIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBjYXBhY2l0eSBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0aGlzIHBvb2wgZG9lcyBub3Qgc3VwcG9ydCBsaW5lYXIgYmxvY2tzCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIG9wZXJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSBfX3VudXNlZCwgQzJNZW1vcnlVc2FnZSB1c2FnZSBfX3VudXNlZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYmxvY2sgPSBudWxscHRyOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW5zIGEgY2lyY3VsYXIgd3JpdGVhYmxlIGJsb2NrIG9mIGdpdmVuIHxjYXBhY2l0eXwgYW5kIHx1c2FnZXwuIElmIHN1Y2Nlc3NmdWwsIHRoZQorICAgICAqIGJsb2NrIGlzIHN0b3JlZCBpbiB8YmxvY2t8LiBPdGhlcndpc2UsIHxibG9ja3wgaXMgc2V0IHRvICdudWxscHRyJy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBjYXBhY2l0eSB0aGUgc2l6ZSBvZiByZXF1ZXN0ZWQgY2lyY3VsYXIgYmxvY2suIChub3RlOiB0aGUgc2l6ZSBvZiB0aGUgb2J0YWluZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgYmxvY2sgY291bGQgYmUgc2xpZ2h0bHkgbGFyZ2VyLCBlLmcuIHRvIGFjY29tbW9kYXRlIGFueSBzeXN0ZW0tcmVxdWlyZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSB1c2FnZSAgICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYmxvY2suIFJldHVybmVkIGJsb2NrcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgIG9wdGltaXplZCBmb3IgdGhpcyB1c2FnZSwgYnV0IG1heSBiZSB1c2VkIHdpdGggYW55IHVzYWdlLiBPbmUgZXhjZXB0aW9uOgorICAgICAqICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYmxvY2tzL2J1ZmZlcnMgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYmxvY2sgICAgcG9pbnRlciB0byB3aGVyZSB0aGUgb2J0YWluZWQgYmxvY2sgc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAgICAgKiAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgYW55IHJlcXVpcmVkIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfQkxPQ0tJTkcgIHRoZSBvcGVyYXRpb24gaXMgYmxvY2tlZAorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gY29tcGxldGUgYW55IHJlcXVpcmVkIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBjYXBhY2l0eSBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0aGlzIHBvb2wgZG9lcyBub3Qgc3VwcG9ydCBjaXJjdWxhciBibG9ja3MKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgb3BlcmF0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hDaXJjdWxhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHkgX191bnVzZWQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDaXJjdWxhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYmxvY2sgPSBudWxscHRyOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW5zIGEgMkQgZ3JhcGhpYyBibG9jayBvZiBnaXZlbiB8d2lkdGh8LCB8aGVpZ2h0fCwgfGZvcm1hdHwgYW5kIHx1c2FnZXwuIElmIHN1Y2Nlc3NmdWwsCisgICAgICogdGhlIGJsb2NrIGlzIHN0b3JlZCBpbiB8YmxvY2t8LiBPdGhlcndpc2UsIHxibG9ja3wgaXMgc2V0IHRvICdudWxscHRyJy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB3aWR0aCAgdGhlIHdpZHRoIG9mIHJlcXVlc3RlZCBibG9jayAodGhlIG9idGFpbmVkIGJsb2NrIGNvdWxkIGJlIHNsaWdodGx5IGxhcmdlciwgZS5nLgorICAgICAqICAgICAgICAgICAgICAgdG8gYWNjb21tb2RhdGUgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCisgICAgICogXHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHJlcXVlc3RlZCBibG9jayAodGhlIG9idGFpbmVkIGJsb2NrIGNvdWxkIGJlIHNsaWdodGx5IGxhcmdlciwKKyAgICAgKiAgICAgICAgICAgICAgIGUuZy4gdG8gYWNjb21tb2RhdGUgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCisgICAgICogXHBhcmFtIGZvcm1hdCB0aGUgcGl4ZWwgZm9ybWF0IG9mIHJlcXVlc3RlZCBibG9jay4gVGhpcyBjb3VsZCBiZSBhIHZlbmRvciBzcGVjaWZpYyBmb3JtYXQuCisgICAgICogXHBhcmFtIHVzYWdlICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYmxvY2suIFJldHVybmVkIGJsb2NrcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsIGJ1dCBtYXkgYmUgdXNlZCB3aXRoIGFueSB1c2FnZS4gT25lIGV4Y2VwdGlvbjoKKyAgICAgKiAgICAgICAgICAgICAgIHByb3RlY3RlZCBibG9ja3MvYnVmZmVycyBjYW4gb25seSBiZSB1c2VkIGluIGEgcHJvdGVjdGVkIHNjZW5hcmlvLgorICAgICAqIFxwYXJhbSBibG9jayAgcG9pbnRlciB0byB3aGVyZSB0aGUgb2J0YWluZWQgYmxvY2sgc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAgICAgKiAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICB0aGUgb3BlcmF0aW9uIGlzIGJsb2NrZWQKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgd2lkdGgsIGhlaWdodCwgZm9ybWF0IG9yIHVzYWdlIGFyZSBub3Qgc3VwcG9ydGVkIChpbnZhbGlkKSAoY2FsbGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBwb29sIGRvZXMgbm90IHN1cHBvcnQgMkQgYmxvY2tzCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIG9wZXJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggX191bnVzZWQsIHVpbnQzMl90IGhlaWdodCBfX3VudXNlZCwgdWludDMyX3QgZm9ybWF0IF9fdW51c2VkLAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSBfX3VudXNlZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmJsb2NrID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJCbG9ja1Bvb2woKSA9IGRlZmF1bHQ7Citwcm90ZWN0ZWQ6CisgICAgQzJCbG9ja1Bvb2woKSA9IGRlZmF1bHQ7Cit9OworCisvLy8gQH0KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQkxPQ0tTCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoqCisgKiBCbG9ja3MgYXJlIHNlY3Rpb25zIG9mIGFsbG9jYXRpb25zLiBUaGV5IGNhbiBiZSBlaXRoZXIgMUQgb3IgMkQuCisgKi8KKworY2xhc3MgQzJMaW5lYXJBbGxvY2F0aW9uOworCisvKioKKyAqIEEgMUQgYmxvY2suCisgKgorICogXG5vdGUgY2FwYWNpdHkoKSBpcyBub3QgbWVhbmluZ2Z1bCBmb3IgdXNlcnMgb2YgYmxvY2tzOyBpbnN0ZWFkIHNpemUoKSBpcyB0aGUgY2FwYWNpdHkgb2YgdGhlCisgKiB1c2FibGUgcG9ydGlvbi4gVXNlIGFuZCBvZmZzZXQoKSBhbmQgc2l6ZSgpIGlmIGFjY2Vzc2luZyB0aGUgYmxvY2sgZGlyZWN0bHkgdGhyb3VnaCBpdHMgaGFuZGxlCisgKiB0byByZXByZXNlbnQgdGhlIGFsbG90dGVkIHJhbmdlIG9mIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRpb24gdG8gdGhpcyBibG9jay4KKyAqLworY2xhc3MgQzJCbG9jazFEIDogcHVibGljIF9DMkxpbmVhclJhbmdlQXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGhhbmRsZSBmb3IgdGhpcyBhbGxvY2F0aW9uLgorICAgICAqCisgICAgICogXG5vdGUgdGhhdCB0aGUgYmxvY2sgYW5kIGl0cyBibG9jayBwb29sIGhhcyBzaGFyZWQgb3duZXJzaGlwIG9mIHRoZSBoYW5kbGUKKyAgICAgKiAgICAgICBhbmQgaWYgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGJsb2NrIGFyZSByZWxlYXNlZCwgdGhlIHVuZGVybHlpbmcgYmxvY2sKKyAgICAgKiAgICAgICBhbGxvY2F0aW9uIG1heSBnZXQgcmV1c2VkIGV2ZW4gaWYgYSBjbGllbnQga2VlcHMgYSBjbG9uZSBvZiB0aGlzIGhhbmRsZS4KKyAgICAgKi8KKyAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGxvY2F0b3IncyBJRCB0aGF0IGNyZWF0ZWQgdGhlIHVuZGVybHlpbmcgYWxsb2NhdGlvbiBmb3IgdGhpcyBibG9jay4gVGhpcworICAgICAqIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB1bmRlcnN0YW5kaW5nIHRoZSBoYW5kbGUuCisgICAgICovCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIGNsYXNzIEltcGw7CisgICAgLyoqIGNvbnN0cnVjdCBhIGJsb2NrLiAqLworICAgIEMyQmxvY2sxRChzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnJhbmdlKTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogUmVhZCB2aWV3IHByb3ZpZGVzIHJlYWQtb25seSBhY2Nlc3MgZm9yIGEgbGluZWFyIG1lbW9yeSBzZWdtZW50LgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCisgKi8KK2NsYXNzIEMyUmVhZFZpZXcgOiBwdWJsaWMgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9yIG51bGxwdHIgb24gZXJyb3IuCisgICAgICogICAgICAgICBUaGlzIHBvaW50ZXIgaXMgb25seSB2YWxpZCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoaXMgdmlldyBvciB1bnRpbCBpdCBpcyByZWxlYXNlZC4KKyAgICAgKi8KKyAgICBjb25zdCB1aW50OF90ICpkYXRhKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcG9ydGlvbiBvZiB0aGlzIHZpZXcuCisgICAgICoKKyAgICAgKiBccGFyYW0gb2Zmc2V0ICB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBwb3J0aW9uLiBcbm90ZSBUaGlzIGlzIGNsYW1wZWQgdG8gdGhlIGNhcGFjaXR5IG9mIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgdmlldy4KKyAgICAgKiBccGFyYW0gc2l6ZSAgICB0aGUgc2l6ZSBvZiB0aGUgcG9ydGlvbi4gXG5vdGUgVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSByZW1haW5pbmcgZGF0YSBmcm9tIG9mZnNldC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSByZWFkIHZpZXcgY29udGFpbmluZyBhIHBvcnRpb24gb2YgdGhpcyB2aWV3CisgICAgICovCisgICAgQzJSZWFkVmlldyBzdWJWaWV3KHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gZXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbi9tYXBwaW5nIG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmVsZWFzZXMgdGhpcyB2aWV3LiBUaGlzIHNldHMgZXJyb3IgdG8gQzJfTk9fSU5JVC4KKyAgICAgKi8KKyAgICAvL3ZvaWQgcmVsZWFzZSgpOworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgSW1wbDsKKyAgICBDMlJlYWRWaWV3KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHNpemUpOworICAgIGV4cGxpY2l0IEMyUmVhZFZpZXcoYzJfc3RhdHVzX3QgZXJyb3IpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKyAgICB1aW50MzJfdCBtT2Zmc2V0OyAvKio8IG9mZnNldCBpbnRvIHRoZSBsaW5lYXIgYmxvY2sgYmFja2luZyB0aGlzIHJlYWQgdmlldyAqLworfTsKKworLyoqCisgKiBXcml0ZSB2aWV3IHByb3ZpZGVzIHJlYWQvd3JpdGUgYWNjZXNzIGZvciBhIGxpbmVhciBtZW1vcnkgc2VnbWVudC4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlLiBcdG9kbyBtb3ZhYmxlIG9ubHk/CisgKi8KK2NsYXNzIEMyV3JpdGVWaWV3IDogcHVibGljIF9DMkVkaXRhYmxlTGluZWFyUmFuZ2VBc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFN0YXJ0IG9mIHRoZSBibG9jay4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9yIG51bGxwdHIgb24gZXJyb3IuCisgICAgICogICAgICAgICBUaGlzIHBvaW50ZXIgaXMgb25seSB2YWxpZCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoaXMgdmlldyBvciB1bnRpbCBpdCBpcyByZWxlYXNlZC4KKyAgICAgKi8KKyAgICB1aW50OF90ICpiYXNlKCk7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGF0IHRoZSBjdXJyZW50IG9mZnNldCBvciBudWxscHRyIG9uIGVycm9yLgorICAgICAqICAgICAgICAgVGhpcyBwb2ludGVyIGlzIG9ubHkgdmFsaWQgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGlzIHZpZXcgb3IgdW50aWwgaXQgaXMgcmVsZWFzZWQuCisgICAgICovCisgICAgdWludDhfdCAqZGF0YSgpOworCisgICAgLyoqCisgICAgICogXHJldHVybiBlcnJvciBkdXJpbmcgdGhlIGNyZWF0aW9uL21hcHBpbmcgb2YgdGhpcyB2aWV3LgorICAgICAqLworICAgIGMyX3N0YXR1c190IGVycm9yKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlcyB0aGlzIHZpZXcuIFRoaXMgc2V0cyBlcnJvciB0byBDMl9OT19JTklULgorICAgICAqLworICAgIC8vdm9pZCByZWxlYXNlKCk7CisKK3Byb3RlY3RlZDoKKyAgICBjbGFzcyBJbXBsOworICAgIEMyV3JpdGVWaWV3KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKTsKKyAgICBleHBsaWNpdCBDMldyaXRlVmlldyhjMl9zdGF0dXNfdCBlcnJvcik7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworfTsKKworLyoqCisgKiBBIGNvbnN0YW50IChyZWFkLW9ubHkpIGxpbmVhciBibG9jayAocG9ydGlvbiBvZiBhbiBhbGxvY2F0aW9uKSB3aXRoIGFuIGFjcXVpcmUgZmVuY2UuCisgKiBCbG9ja3MgYXJlIHVubWFwcGVkIHdoZW4gY3JlYXRlZCwgYW5kIGNhbiBiZSBtYXBwZWQgaW50byBhIHJlYWQgdmlldyBvbiBkZW1hbmQuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZSBhbmQgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGFsbG9jYXRpb24gdGhhdCBpdCBpcyBiYXNlZCBvbi4KKyAqLworY2xhc3MgQzJDb25zdExpbmVhckJsb2NrIDogcHVibGljIEMyQmxvY2sxRCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyB0aGlzIGJsb2NrIGludG8gbWVtb3J5IGFuZCByZXR1cm5zIGEgcmVhZCB2aWV3IGZvciBpdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSByZWFkIHZpZXcgZm9yIHRoaXMgYmxvY2suCisgICAgICovCisgICAgQzJBY3F1aXJhYmxlPEMyUmVhZFZpZXc+IG1hcCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHBvcnRpb24gb2YgdGhpcyBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSBvZmZzZXQgIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIHBvcnRpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgY2FwYWNpdHkgb2YgdGhpcworICAgICAqICAgICAgICAgICAgICBibG9jay4KKyAgICAgKiBccGFyYW0gc2l6ZSAgICB0aGUgc2l6ZSBvZiB0aGUgcG9ydGlvbi4gXG5vdGUgVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSByZW1haW5pbmcgZGF0YSBmcm9tIG9mZnNldC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBjb25zdGFudCBsaW5lYXIgYmxvY2sgY29udGFpbmluZyBhIHBvcnRpb24gb2YgdGhpcyBibG9jaworICAgICAqLworICAgIEMyQ29uc3RMaW5lYXJCbG9jayBzdWJCbG9jayhzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhY3F1aXJlIGZlbmNlIGZvciB0aGlzIGJsb2NrLgorICAgICAqCisgICAgICogXHJldHVybiBhIGZlbmNlIHRoYXQgbXVzdCBiZSB3YWl0ZWQgb24gYmVmb3JlIHJlYWRpbmcgdGhlIGJsb2NrLgorICAgICAqLworICAgIEMyRmVuY2UgZmVuY2UoKSBjb25zdCB7IHJldHVybiBtRmVuY2U7IH0KKworcHJvdGVjdGVkOgorICAgIEMyQ29uc3RMaW5lYXJCbG9jayhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnJhbmdlLCBDMkZlbmNlIG1GZW5jZSk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7CisgICAgQzJGZW5jZSBtRmVuY2U7Cit9OworCisvKioKKyAqIExpbmVhciBibG9jayBpcyBhIHdyaXRlYWJsZSAxRCBibG9jay4gT25jZSB3cml0dGVuLCBpdCBjYW4gYmUgc2hhcmVkIGluIHdob2xlIG9yIGluIHBhcnRzIHdpdGgKKyAqIGNvbnN1bWVycy9yZWFkZXJzIGFzIHJlYWQtb25seSBjb25zdCBsaW5lYXIgYmxvY2socykuCisgKi8KK2NsYXNzIEMyTGluZWFyQmxvY2sgOiBwdWJsaWMgQzJCbG9jazFEIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBNYXBzIHRoaXMgYmxvY2sgaW50byBtZW1vcnkgYW5kIHJldHVybnMgYSB3cml0ZSB2aWV3IGZvciBpdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSB3cml0ZSB2aWV3IGZvciB0aGlzIGJsb2NrLgorICAgICAqLworICAgIEMyQWNxdWlyYWJsZTxDMldyaXRlVmlldz4gbWFwKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgcmVhZC1vbmx5IGNvbnN0IGxpbmVhciBibG9jayBmb3IgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2s7IG9wdGlvbmFsbHkgcHJvdGVjdGVkCisgICAgICogYnkgYW4gYWNxdWlyZSBmZW5jZS4gVGhlcmUgYXJlIHR3byB3YXlzIHRvIHVzZSB0aGlzOgorICAgICAqCisgICAgICogMSkgc2hhcmUgcmVhZHkgYmxvY2sgYWZ0ZXIgd3JpdGluZyBkYXRhIGludG8gdGhlIGJsb2NrLiBJbiB0aGlzIGNhc2Ugbm8gZmVuY2Ugc2hhbGwgYmUKKyAgICAgKiAgICBzdXBwbGllZCwgYW5kIHRoZSBibG9jayBzaGFsbCBub3QgYmUgbW9kaWZpZWQgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZC4KKyAgICAgKiAyKSBzaGFyZSBibG9jayBtZXRhZGF0YSBiZWZvcmUgYWN0dWFsbHkgKGZpbmlzaGluZykgd3JpdGluZyB0aGUgZGF0YSBpbnRvIHRoZSBibG9jay4gSW4KKyAgICAgKiAgICB0aGlzIGNhc2UgYSBmZW5jZSBtdXN0IGJlIHN1cHBsaWVkIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgZGF0YSBpcyB3cml0dGVuLgorICAgICAqICAgIFRoZSBibG9jayBzaGFsbCBiZSBtb2RpZmllZCBvbmx5IHVudGlsIGZpcmluZyB0aGUgZXZlbnQgZm9yIHRoZSBmZW5jZS4KKyAgICAgKi8KKyAgICBDMkNvbnN0TGluZWFyQmxvY2sgc2hhcmUoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIEMyRmVuY2UgZmVuY2UpOworCitwcm90ZWN0ZWQ6CisgICAgQzJMaW5lYXJCbG9jayhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnJhbmdlKTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworfTsKKworLy8vIEB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBDSVJDVUxBUiBCTE9DS1MgQU5EIFZJRVdTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8vIFxkZWZncm91cCBjaXJjdWxhciBDaXJjdWxhciBidWZmZXIgc3VwcG9ydAorLy8vIEB7CisKKy8qKgorICogQ2lyY3VsYXIgYmxvY2tzIGNhbiBiZSB1c2VkIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiBhIHdyaXRlciBhbmQgYSByZWFkZXIgKGFuZC9vciBvdGhlciBjb25zdW1lcnMpLQorICogaW4gYSBtZW1vcnktZWZmaWNpZW50IHdheSBieSByZXVzaW5nIGEgc2VjdGlvbiBvZiBtZW1vcnkuIENpcmN1bGFyIGJsb2NrcyBhcmUgYSBiaXQgbW9yZSBjb21wbGV4CisgKiB0aGFuIHNpbmdsZSByZWFkZXIvc2luZ2xlIHdyaXRlciBzY2hlbWVzIHRvIGZhY2lsaXRhdGUgYmxvY2stYmFzZWQgY29uc3VtaW5nIG9mIGRhdGEuCisgKgorICogVGhleSBjYW4gb3BlcmF0ZSBpbiB0d28gbW9kZXM6CisgKgorICogMSkgb25lIHdyaXRlciB0aGF0IGNyZWF0ZXMgYmxvY2tzIHRvIGJlIGNvbnN1bWVkICh0aGlzIG1vZGVsIGNhbiBiZSB1c2VkIGJ5IGNvbXBvbmVudHMpCisgKgorICogMikgb25lIHdyaXRlciB0aGF0IHdyaXRlcyBjb250aW51b3VzbHksIGFuZCBvbmUgcmVhZGVyIHRoYXQgY2FuIGNyZWF0ZXMgYmxvY2tzIHRvIGJlIGNvbnN1bWVkCisgKiAgICBieSBmdXJ0aGVyIHJlY2lwaWVudHMgKHRoaXMgbW9kZWwgaXMgdXNlZCBieSB0aGUgZnJhbWV3b3JrLCBhbmQgY2Fubm90IGJlIHVzZWQgYnkgY29tcG9uZW50cy4pCisgKgorICogQ2lyY3VsYXIgYmxvY2tzIGhhdmUgZm91ciBzZWdtZW50cyB3aXRoIHJ1bm5pbmcgcG9pbnRlcnM6CisgKiAgLSByZXNlcnZlZDogZGF0YSByZXNlcnZlZCBhbmQgYXZhaWxhYmxlIGZvciB0aGUgd3JpdGVyCisgKiAgLSBjb21taXR0ZWQ6IGRhdGEgY29tbWl0dGVkIGJ5IHRoZSB3cml0ZXIgYW5kIGF2YWlsYWJsZSB0byB0aGUgcmVhZGVyIChpZiBwcmVzZW50KQorICogIC0gdXNlZDogZGF0YSB1c2VkIGJ5IGNvbnN1bWVycyAoaWYgcHJlc2VudCkKKyAqICAtIGF2YWlsYWJsZTogdW51c2VkIGRhdGEgYXZhaWxhYmxlIHRvIGJlIHJlc2VydmVkCisgKi8KK2NsYXNzIEMyQ2lyY3VsYXJCbG9jayA6IHB1YmxpYyBDMkJsb2NrMUQgeworICAgIC8vIFRPRE86IGFkZCBtZXRob2RzCisKK3ByaXZhdGU6CisgICAgc2l6ZV90IG1SZXNlcnZlZCBfX3VudXNlZDsgICAvLyBlbmQgb2YgcmVzZXJ2ZWQgc2VjdGlvbgorICAgIHNpemVfdCBtQ29tbWl0dGVkIF9fdW51c2VkOyAgLy8gZW5kIG9mIGNvbW1pdHRlZCBzZWN0aW9uCisgICAgc2l6ZV90IG1Vc2VkIF9fdW51c2VkOyAgICAgICAvLyBlbmQgb2YgdXNlZCBzZWN0aW9uCisgICAgc2l6ZV90IG1GcmVlIF9fdW51c2VkOyAgICAgICAvLyBlbmQgb2YgZnJlZSBzZWN0aW9uCit9OworCitjbGFzcyBfQzJDaXJjdWxhckJsb2NrU2VnbWVudCA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYXZhaWxhYmxlIHNpemUgZm9yIHRoaXMgc2VnbWVudC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gY3VycmVudGx5IGF2YWlsYWJsZSBzaXplIGZvciB0aGlzIHNlZ21lbnQKKyAgICAgKi8KKyAgICBzaXplX3QgYXZhaWxhYmxlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXNlcnZlIHNvbWUgc3BhY2UgZm9yIHRoaXMgc2VnbWVudCBmcm9tIGl0cyBjdXJyZW50IHN0YXJ0LgorICAgICAqCisgICAgICogXHBhcmFtIHNpemUgICAgZGVzaXJlZCBzcGFjZSBpbiBieXRlcworICAgICAqIFxwYXJhbSBmZW5jZSAgIGEgcG9pbnRlciB0byBhbiBhY3F1aXJlIGZlbmNlLiBJZiBub24tbnVsbCwgdGhlIHJlc2VydmF0aW9uIGlzIGFzeW5jaHJvbm91cyBhbmQKKyAgICAgKiAgICAgICAgICAgICAgYSBmZW5jZSB3aWxsIGJlIHN0b3JlZCBoZXJlIHRoYXQgd2lsbCBiZSBzaWduYWxlZCB3aGVuIHRoZSByZXNlcnZhdGlvbiBpcworICAgICAqICAgICAgICAgICAgICBjb21wbGV0ZS4gSWYgbnVsbCwgdGhlIHJlc2VydmF0aW9uIGlzIHN5bmNocm9ub3VzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBzcGFjZSB3YXMgc3VjY2Vzc2Z1bGx5IHJlc2VydmVkCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgICAgIHRoZSBzcGFjZSByZXF1ZXN0ZWQgY2Fubm90IGJlIHJlc2VydmVkCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgICAgIHRoZSByZXNlcnZhdGlvbiB0aW1lZCBvdXQgXHRvZG8gd2hlbj8KKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCAgICAgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCByZXNlcnZpbmcgc3BhY2UuICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IHJlc2VydmUoc2l6ZV90IHNpemUsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovKTsKKworICAgIC8qKgorICAgICAqIEFiYW5kb25zIGEgcG9ydGlvbiBvZiB0aGlzIHNlZ21lbnQuIFRoaXMgd2lsbCBtb3ZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzZWdtZW50LgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyBtZXRob2RzIGlzIG9ubHkgYWxsb3dlZCBpZiB0aGlzIHNlZ21lbnQgaXMgcHJvZHVjaW5nIGJsb2Nrcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaXplICAgIG51bWJlciBvZiBieXRlcyB0byBhYmFuZG9uCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSBhYmFuZG9uZWQKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCAgICAgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgYWJhbmRvbmluZyB0aGUgZGF0YSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBhYmFuZG9uKHNpemVfdCBzaXplKTsKKworICAgIC8qKgorICAgICAqIFNoYXJlIGEgcG9ydGlvbiBhcyBibG9jayhzKSB3aXRoIGNvbnN1bWVycyAodGhlc2UgYXJlIG1vdmVkIHRvIHRoZSB1c2VkIHNlY3Rpb24pLgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyBtZXRob2RzIGlzIG9ubHkgYWxsb3dlZCBpZiB0aGlzIHNlZ21lbnQgaXMgcHJvZHVjaW5nIGJsb2Nrcy4KKyAgICAgKiBcbm90ZSBTaGFyZSBkb2VzIG5vdCBtb3ZlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlZ21lbnQuIChcdG9kbyBhZGQgYWJhbmRvbi9vZmZzZXQ/KQorICAgICAqCisgICAgICogXHBhcmFtIHNpemUgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIHNoYXJlCisgICAgICogXHBhcmFtIGZlbmNlICAgZmVuY2UgdG8gYmUgdXNlZCBmb3IgdGhlIHNlY3Rpb24KKyAgICAgKiBccGFyYW0gYmxvY2tzICB2ZWN0b3Igd2hlcmUgdGhlIGJsb2NrcyBvZiB0aGUgc2VjdGlvbiBhcmUgYXBwZW5kZWQgdG8KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICB0aGUgcG9ydGlvbiB3YXMgc3VjY2Vzc2Z1bGx5IHNoYXJlZAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZICAgICBub3QgZW5vdWdoIG1lbW9yeSB0byBzaGFyZSB0aGUgcG9ydGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUICAgICB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCAgICAgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBzaGFyaW5nIHRoZSBkYXRhICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IHNoYXJlKHNpemVfdCBzaXplLCBDMkZlbmNlIGZlbmNlLCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYmVnaW5uaW5nIG9mZnNldCBvZiB0aGlzIHNlZ21lbnQgZnJvbSB0aGUgc3RhcnQgb2YgdGhpcyBjaXJjdWxhciBibG9jay4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYmVnaW5uaW5nIG9mZnNldAorICAgICAqLworICAgIHNpemVfdCBiZWdpbigpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZW5kIG9mZnNldCBvZiB0aGlzIHNlZ21lbnQgZnJvbSB0aGUgc3RhcnQgb2YgdGhpcyBjaXJjdWxhciBibG9jay4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZW5kIG9mZnNldAorICAgICAqLworICAgIHNpemVfdCBlbmQoKTsKK307CisKKy8qKgorICogQSBjaXJjdWxhciB3cml0ZS12aWV3IGlzIGEgZHluYW1pYyBtYXBwZWQgdmlldyBmb3IgYSBzZWdtZW50IG9mIGEgY2lyY3VsYXIgYmxvY2suIENhcmUgbXVzdCBiZQorICogdGFrZW4gd2hlbiB1c2luZyB0aGlzIHZpZXcgc28gdGhhdCBvbmx5IHRoZSBzZWN0aW9uIG93bmVkIGJ5IHRoZSBzZWdtZW50IGlzIG1vZGlmaWVkLgorICovCitjbGFzcyBDMkNpcmN1bGFyV3JpdGVWaWV3IDogcHVibGljIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBTdGFydCBvZiB0aGUgY2lyY3VsYXIgYmxvY2suCisgICAgICogXG5vdGUgdGhlIHNlZ21lbnQgZG9lcyBub3Qgb3duIHRoaXMgcG9pbnRlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGNpcmN1bGFyIGJsb2NrIG9yIG51bGxwdHIgb24gZXJyb3IuCisgICAgICovCisgICAgdWludDhfdCAqYmFzZSgpOworCisgICAgLyoqCisgICAgICogXHJldHVybiBlcnJvciBkdXJpbmcgdGhlIGNyZWF0aW9uL21hcHBpbmcgb2YgdGhpcyB2aWV3LgorICAgICAqLworICAgIGMyX3N0YXR1c190IGVycm9yKCkgY29uc3Q7Cit9OworCisvKioKKyAqIFRoZSB3cml0ZXIgb2YgYSBjaXJjdWxhciBidWZmZXIuCisgKgorICogQ2FuIGNvbW1pdCBkYXRhIHRvIGEgcmVhZGVyIChub3Qgc3VwcG9ydGVkIGZvciBjb21wb25lbnRzKSBPUiBzaGFyZSBkYXRhIGJsb2NrcyBkaXJlY3RseSB3aXRoIGEKKyAqIGNvbnN1bWVyLgorICoKKyAqIElmIGEgY29tcG9uZW50IHN1cHBvcnRzIG91dHB1dHRpbmcgZGF0YSBpbnRvIGNpcmN1bGFyIGJ1ZmZlcnMsIGl0IG11c3QgYWxsb2NhdGUgYSBjaXJjdWxhcgorICogYmxvY2sgYW5kIHVzZSBhIGNpcmN1bGFyIHdyaXRlci4KKyAqLworY2xhc3MgQzJDaXJjdWxhcldyaXRlciA6IHB1YmxpYyBfQzJDaXJjdWxhckJsb2NrU2VnbWVudCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29tbWl0cyBhIHBvcnRpb24gb2YgdGhpcyBzZWdtZW50IHRvIHRoZSBuZXh0IHNlZ21lbnQuIFRoaXMgbW92ZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgICAgKiBzZWdtZW50LgorICAgICAqCisgICAgICogXHBhcmFtIHNpemUgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbW1pdCB0byB0aGUgbmV4dCBzZWdtZW50CisgICAgICogXHBhcmFtIGZlbmNlICAgZmVuY2UgdXNlZCBmb3IgdGhlIGNvbW1pdCAodGhlIGZlbmNlIG11c3Qgc2lnbmFsIGJlZm9yZSB0aGUgZGF0YSBpcyBjb21taXR0ZWQpCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgY29tbWl0KHNpemVfdCBzaXplLCBDMkZlbmNlIGZlbmNlKTsKKworICAgIC8qKgorICAgICAqIE1hcHMgdGhpcyBibG9jayBpbnRvIG1lbW9yeSBhbmQgcmV0dXJucyBhIHdyaXRlIHZpZXcgZm9yIGl0LgorICAgICAqCisgICAgICogXHJldHVybiBhIHdyaXRlIHZpZXcgZm9yIHRoaXMgYmxvY2suCisgICAgICovCisgICAgQzJBY3F1aXJhYmxlPEMyQ2lyY3VsYXJXcml0ZVZpZXc+IG1hcCgpOworfTsKKworLy8vIEB9CisKKy8vLyBcZGVmZ3JvdXAgZ3JhcGhpYyBHcmFwaGljIERhdGEgQmxvY2tzCisvLy8gQHsKKworLyoqCisgKiBDMlJlY3Q6IHJlY3RhbmdsZSB0eXBlIHdpdGggbm9uLW5lZ2F0aXZlIGNvb3JkaW5hdGVzLgorICoKKyAqIFxub3RlIFRoaXMgc3RydWN0IGhhcyBwdWJsaWMgZmllbGRzIHdpdGhvdXQgZ2V0dGVycy9zZXR0ZXJzLiBBbGwgbWV0aG9kcyBhcmUgaW5saW5lLgorICovCitzdHJ1Y3QgQzJSZWN0IHsKKy8vIHB1YmxpYzoKKyAgICB1aW50MzJfdCB3aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgdWludDMyX3QgbGVmdDsKKyAgICB1aW50MzJfdCB0b3A7CisKKyAgICBjb25zdGV4cHIgaW5saW5lIEMyUmVjdCgpCisgICAgICAgIDogQzJSZWN0KDAsIDAsIDAsIDApIHsgfQorCisgICAgY29uc3RleHByIGlubGluZSBDMlJlY3QodWludDMyX3Qgd2lkdGhfLCB1aW50MzJfdCBoZWlnaHRfKQorICAgICAgICA6IEMyUmVjdCh3aWR0aF8sIGhlaWdodF8sIDAsIDApIHsgfQorCisgICAgY29uc3RleHByIEMyUmVjdCBpbmxpbmUgYXQodWludDMyX3QgbGVmdF8sIHVpbnQzMl90IHRvcF8pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyUmVjdCh3aWR0aCwgaGVpZ2h0LCBsZWZ0XywgdG9wXyk7CisgICAgfQorCisgICAgLy8gdXRpbGl0eSBtZXRob2RzCisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDA7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsZWZ0IDw9IH53aWR0aCAmJiB0b3AgPD0gfmhlaWdodDsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpc1ZhbGlkKCkgJiYgIWlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gIWJvb2woKnRoaXMpOworICAgIH0KKworICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGNvbnRhaW5zKGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkgfHwgIW90aGVyLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGxlZnQgPD0gb3RoZXIubGVmdCAmJiB0b3AgPD0gb3RoZXIudG9wCisgICAgICAgICAgICAgICAgICAgICYmIGxlZnQgKyB3aWR0aCA+PSBvdGhlci5sZWZ0ICsgb3RoZXIud2lkdGgKKyAgICAgICAgICAgICAgICAgICAgJiYgdG9wICsgaGVpZ2h0ID49IG90aGVyLnRvcCArIG90aGVyLmhlaWdodDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAhb3RoZXIuaXNWYWxpZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGxlZnQgPT0gb3RoZXIubGVmdCAmJiB0b3AgPT0gb3RoZXIudG9wCisgICAgICAgICAgICAgICAgICAgICYmIHdpZHRoID09IG90aGVyLndpZHRoICYmIGhlaWdodCA9PSBvdGhlci5oZWlnaHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PShvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPj0oY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gY29udGFpbnMob3RoZXIpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj4oY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gY29udGFpbnMob3RoZXIpICYmICFvcGVyYXRvcj09KG90aGVyKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I8PShjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBvdGhlci5jb250YWlucygqdGhpcyk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPChjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBvdGhlci5jb250YWlucygqdGhpcykgJiYgIW9wZXJhdG9yPT0ob3RoZXIpOworICAgIH0KKworICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciB1aW50MzJfdCByaWdodCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxlZnQgKyB3aWR0aDsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgYm90dG9tKCkgY29uc3QgeworICAgICAgICByZXR1cm4gdG9wICsgaGVpZ2h0OworICAgIH0KKworICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlJlY3QgaW50ZXJzZWN0KGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyUmVjdChjMl9taW4ocmlnaHQoKSwgb3RoZXIucmlnaHQoKSkgLSBjMl9tYXgobGVmdCwgb3RoZXIubGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgYzJfbWluKGJvdHRvbSgpLCBvdGhlci5ib3R0b20oKSkgLSBjMl9tYXgodG9wLCBvdGhlci50b3ApLAorICAgICAgICAgICAgICAgICAgICAgIGMyX21heChsZWZ0LCBvdGhlci5sZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICBjMl9tYXgodG9wLCBvdGhlci50b3ApKTsKKyAgICB9CisKKyAgICAvKiogY2xhbXBzIHJpZ2h0IGFuZCBib3R0b20gdG8gdG9wLCBsZWZ0IGlmIHRoZXkgb3ZlcmZsb3cgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIEMyUmVjdCBub3JtYWxpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlJlY3QoYzJfbWF4KGxlZnQsIHJpZ2h0KCkpIC0gbGVmdCwgYzJfbWF4KHRvcCwgYm90dG9tKCkpIC0gdG9wLCBsZWZ0LCB0b3ApOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLy8gbm90ZTogcG90ZW50aWFsbHkgdW51c3VhbCBhcmd1bWVudCBvcmRlcgorICAgIGNvbnN0ZXhwciBpbmxpbmUgQzJSZWN0KHVpbnQzMl90IHdpZHRoXywgdWludDMyX3QgaGVpZ2h0XywgdWludDMyX3QgbGVmdF8sIHVpbnQzMl90IHRvcF8pCisgICAgICAgIDogd2lkdGgod2lkdGhfKSwKKyAgICAgICAgICBoZWlnaHQoaGVpZ2h0XyksCisgICAgICAgICAgbGVmdChsZWZ0XyksCisgICAgICAgICAgdG9wKHRvcF8pIHsgfQorfTsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCBoYXZlIGEgd2lkdGggYW5kIGhlaWdodCAocGxhbmFyIGNhcGFjaXR5KS4KKyAqLworY2xhc3MgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgeworLy8vIFxuYW1lIFBsYW5hciBjYXBhY2l0eSBpbnRlcmZhY2UKKy8vLyBAeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3Qgd2lkdGgoKSBjb25zdCB7IHJldHVybiBfbVdpZHRoOyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciB1aW50MzJfdCBoZWlnaHQoKSBjb25zdCB7IHJldHVybiBfbUhlaWdodDsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBvcGVyYXRvciBDMlJlY3QoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlJlY3QoX21XaWR0aCwgX21IZWlnaHQpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGlubGluZSBjb25zdGV4cHIgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkKKyAgICAgIDogX21XaWR0aCh3aWR0aCksIF9tSGVpZ2h0KGhlaWdodCkgeyB9CisKKyAgICBpbmxpbmUgZXhwbGljaXQgY29uc3RleHByIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KGNvbnN0IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0ICpwYXJlbnQpCisgICAgICAgIDogX21XaWR0aChwYXJlbnQgPT0gbnVsbHB0ciA/IDAgOiBwYXJlbnQtPndpZHRoKCkpLAorICAgICAgICAgIF9tSGVpZ2h0KHBhcmVudCA9PSBudWxscHRyID8gMCA6IHBhcmVudC0+aGVpZ2h0KCkpIHsgfQorCitwcml2YXRlOgorICAgIHVpbnQzMl90IF9tV2lkdGg7CisgICAgdWludDMyX3QgX21IZWlnaHQ7CisvLy8gQH0KK307CisKKy8qKgorICogQzJQbGFuZUluZm86IGluZm9ybWF0aW9uIG9uIHRoZSBsYXlvdXQgb2YgYSBzaW5nZSBmbGV4aWJsZSBwbGFuZS4KKyAqCisgKiBQdWJsaWMgZmllbGRzIHdpdGhvdXQgZ2V0dGVycy9zZXR0ZXJzLgorICovCitzdHJ1Y3QgQzJQbGFuZUluZm8geworLy9wdWJsaWM6CisgICAgZW51bSBjaGFubmVsX3QgOiB1aW50MzJfdCB7CisgICAgICAgIENIQU5ORUxfWSwgIC8vLzwgbHVtYQorICAgICAgICBDSEFOTkVMX1IsICAvLy88IHJlZAorICAgICAgICBDSEFOTkVMX0csICAvLy88IGdyZWVuCisgICAgICAgIENIQU5ORUxfQiwgIC8vLzwgYmx1ZQorICAgICAgICBDSEFOTkVMX0EsICAvLy88IGFscGhhCisgICAgICAgIENIQU5ORUxfQ1IsIC8vLzwgQ3IKKyAgICAgICAgQ0hBTk5FTF9DQiwgLy8vPCBDYgorICAgIH0gY2hhbm5lbDsKKworICAgIGludDMyX3QgY29sSW5jOyAgICAgICAvLy88IGNvbHVtbiBpbmNyZW1lbnQgaW4gYnl0ZXMuIG1heSBiZSBuZWdhdGl2ZQorICAgIGludDMyX3Qgcm93SW5jOyAgICAgICAvLy88IHJvdyBpbmNyZW1lbnQgaW4gYnl0ZXMuIG1heSBiZSBuZWdhdGl2ZQorCisgICAgdWludDMyX3QgY29sU2FtcGxpbmc7IC8vLzwgc3Vic2FtcGxpbmcgY29tcGFyZWQgdG8gd2lkdGggKG11c3QgYmUgYSBwb3dlciBvZiAyKQorICAgIHVpbnQzMl90IHJvd1NhbXBsaW5nOyAvLy88IHN1YnNhbXBsaW5nIGNvbXBhcmVkIHRvIGhlaWdodCAobXVzdCBiZSBhIHBvd2VyIG9mIDIpCisKKyAgICB1aW50MzJfdCBhbGxvY2F0ZWREZXB0aDsgLy8vPCBzaXplIG9mIGVhY2ggc2FtcGxlIChtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCkKKyAgICB1aW50MzJfdCBiaXREZXB0aDsgICAgICAgLy8vPCBzaWduaWZpY2FudCBiaXRzIHBlciBzYW1wbGUKKyAgICAvKioKKyAgICAgKiB0aGUgcmlnaHQgc2hpZnQgb2YgdGhlIHNpZ25pZmljYW50IGJpdHMgaW4gdGhlIHNhbXBsZS4gRS5nLiBpZiBhIDEwLWJpdCBzaWduaWZpY2FudAorICAgICAqIHZhbHVlIGlzIGxhaWQgb3V0IGluIGEgMTYtYml0IGFsbG9jYXRpb24gYWxpZ25lZCB0byBMU0IgKHZhbHVlcyAwLTEwMjMpLCByaWdodFNoaWZ0CisgICAgICogd291bGQgYmUgMCBhcyB0aGUgMTYtYml0IHZhbHVlIHJlYWQgZnJvbSB0aGUgc2FtcGxlIGRvZXMgbm90IG5lZWQgdG8gYmUgcmlnaHQgc2hpZnRlZAorICAgICAqIGFuZCBjYW4gYmUgdXNlZCBhcyBpcyAoYWZ0ZXIgYXBwbHlpbmcgYSAxMC1iaXQgbWFzayBvZiAweDNGRikuCisgICAgICoKKyAgICAgKiArLS0tLS0tLS0rLS0tLS0tLS0rCisgICAgICogfCAgICAgIFZWfFZWVlZWVlZWfAorICAgICAqICstLS0tLS0tLSstLS0tLS0tLSsKKyAgICAgKiAgMTUgICAgIDggNyAgICAgIDAKKyAgICAgKgorICAgICAqIElmIHRoZSB2YWx1ZSBpcyBsYWlkIG91dCBhbGlnbmVkIHRvIE1TQiwgcmlnaHRTaGlmdCB3b3VsZCBiZSA2LCBhcyB0aGUgdmFsdWUgcmVhZAorICAgICAqIGZyb20gdGhlIGFsbG9jYXRlZCBzYW1wbGUgbXVzdCBiZSByaWdodC1zaGlmdGVkIGJ5IDYgdG8gZ2V0IHRoZSBhY3R1YWwgc2FtcGxlIHZhbHVlLgorICAgICAqCisgICAgICogKy0tLS0tLS0tKy0tLS0tLS0tKworICAgICAqIHxWVlZWVlZWVnxWViAgICAgIHwKKyAgICAgKiArLS0tLS0tLS0rLS0tLS0tLS0rCisgICAgICogIDE1ICAgICA4IDcgICAgICAwCisgICAgICovCisgICAgdWludDMyX3QgcmlnaHRTaGlmdDsKKworICAgIGVudW0gZW5kaWFubmVzc190IDogdWludDMyX3QgeworICAgICAgICBOQVRJVkUsCisgICAgICAgIExJVFRMRV9FTkQsIC8vIExJVFRMRV9FTkRJQU4gaXMgcmVzZXJ2ZWQgbWFjcm8KKyAgICAgICAgQklHX0VORCwgICAgLy8gQklHX0VORElBTiBpcyBhIHJlc2VydmVkIG1hY3JvCisgICAgfSBlbmRpYW5uZXNzOyAvLy88IGVuZGlhbm5lc3Mgb2YgdGhlIHNhbXBsZXMKKworICAgIC8qKgorICAgICAqIFRoZSBmb2xsb3dpbmcgdHdvIGZpZWxkcyBkZWZpbmUgdGhlIHJlbGF0aW9uIGJldHdlZW4gbXVsdGlwbGUgcGxhbmVzLiBJZiBtdWx0aXBsZSBwbGFuZXMgYXJlCisgICAgICogaW50ZXJsZWF2ZWQsIHRoZXkgc2hhcmUgYSByb290IHBsYW5lICh3aGljaGV2ZXIgcGxhbmUncyBzdGFydCBhZGRyZXNzIGlzIHRoZSBsb3dlc3QpLCBhbmQKKyAgICAgKiB8b2Zmc2V0fCBpcyB0aGUgb2Zmc2V0IG9mIHRoaXMgcGxhbmUgaW5zaWRlIHRoZSByb290IHBsYW5lIChpbiBieXRlcykuIHxyb290SXh8IGlzIHRoZSBpbmRleAorICAgICAqIG9mIHRoZSByb290IHBsYW5lLiBJZiBhIHBsYW5lIGlzIGluZGVwZW5kZW50LCByb290SXggaXMgaXRzIGluZGV4IGFuZCBvZmZzZXQgaXMgMC4KKyAgICAgKi8KKyAgICB1aW50MzJfdCByb290SXg7IC8vLzwgaW5kZXggb2YgdGhlIHJvb3QgcGxhbmUKKyAgICB1aW50MzJfdCBvZmZzZXQ7IC8vLzwgb2Zmc2V0IG9mIHRoaXMgcGxhbmUgaW5zaWRlIG9mIHRoZSByb290IHBsYW5lCisKKyAgICBpbmxpbmUgY29uc3RleHByIHNzaXplX3QgbWluT2Zmc2V0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0IHsKKyAgICAgICAgc3NpemVfdCBvZmZzID0gMDsKKyAgICAgICAgaWYgKHdpZHRoID4gMCAmJiBjb2xJbmMgPCAwKSB7CisgICAgICAgICAgICBvZmZzICs9IGNvbEluYyAqIChzc2l6ZV90KSh3aWR0aCAtIDEpOworICAgICAgICB9CisgICAgICAgIGlmIChoZWlnaHQgPiAwICYmIHJvd0luYyA8IDApIHsKKyAgICAgICAgICAgIG9mZnMgKz0gcm93SW5jICogKHNzaXplX3QpKGhlaWdodCAtIDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvZmZzOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgc3NpemVfdCBtYXhPZmZzZXQodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgY29uc3QgeworICAgICAgICBzc2l6ZV90IG9mZnMgPSAoYWxsb2NhdGVkRGVwdGggKyA3KSA+PiAzOworICAgICAgICBpZiAod2lkdGggPiAwICYmIGNvbEluYyA+IDApIHsKKyAgICAgICAgICAgIG9mZnMgKz0gY29sSW5jICogKHNzaXplX3QpKHdpZHRoIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhlaWdodCA+IDAgJiYgcm93SW5jID4gMCkgeworICAgICAgICAgICAgb2ZmcyArPSByb3dJbmMgKiAoc3NpemVfdCkoaGVpZ2h0IC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9mZnM7CisgICAgfQorfSBDMl9QQUNLOworCitzdHJ1Y3QgQzJQbGFuYXJMYXlvdXQgeworLy9wdWJsaWM6CisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIFRZUEVfVU5LTk9XTiA9IDAsCisgICAgICAgIFRZUEVfWVVWID0gMHgxMDAsICAgLy8vPCBZVVYgaW1hZ2Ugd2l0aCAzIHBsYW5lcworICAgICAgICBUWVBFX1lVVkEsICAgICAgICAgIC8vLzwgWVVWQSBpbWFnZSB3aXRoIDQgcGxhbmVzCisgICAgICAgIFRZUEVfUkdCLCAgICAgICAgICAgLy8vPCBSR0IgaW1hZ2Ugd2l0aCAzIHBsYW5lcworICAgICAgICBUWVBFX1JHQkEsICAgICAgICAgIC8vLzwgUkJHQSBpbWFnZSB3aXRoIDQgcGxhbmVzCisgICAgfTsKKworICAgIHR5cGVfdCB0eXBlOyAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2UgdHlwZQorICAgIHVpbnQzMl90IG51bVBsYW5lczsgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGNvbXBvbmVudCBwbGFuZXMKKyAgICB1aW50MzJfdCByb290UGxhbmVzOyAgICAgICAgICAgIC8vIG51bWJlciBvZiBsYXlvdXQgcGxhbmVzIChyb290IHBsYW5lcykKKworICAgIGVudW0gcGxhbmVfaW5kZXhfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgUExBTkVfWSA9IDAsCisgICAgICAgIFBMQU5FX1UgPSAxLAorICAgICAgICBQTEFORV9WID0gMiwKKyAgICAgICAgUExBTkVfUiA9IDAsCisgICAgICAgIFBMQU5FX0cgPSAxLAorICAgICAgICBQTEFORV9CID0gMiwKKyAgICAgICAgUExBTkVfQSA9IDMsCisgICAgICAgIE1BWF9OVU1fUExBTkVTID0gNCwKKyAgICB9OworCisgICAgQzJQbGFuZUluZm8gcGxhbmVzW01BWF9OVU1fUExBTkVTXTsKK307CisKKy8qKgorICogQXNwZWN0IGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhIHBsYW5hciBzZWN0aW9uIChjcm9wIHJlY3RhbmdsZSkuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4KKyAqLworY2xhc3MgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCA6IHB1YmxpYyBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCB7CisvLy8gXG5hbWUgUGxhbmFyIHNlY3Rpb24gaW50ZXJmYWNlCisvLy8gQHsKK3ByaXZhdGU6CisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGNvbnN0IEMyUmVjdCAmY3JvcCkKKyAgICAgICAgOiBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCh3aWR0aCwgaGVpZ2h0KSwKKyAgICAgICAgICBtQ3JvcChDMlJlY3Qoc3RkOjptaW4od2lkdGggLSBzdGQ6Om1pbihjcm9wLmxlZnQsIHdpZHRoKSwgY3JvcC53aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKGhlaWdodCAtIHN0ZDo6bWluKGNyb3AudG9wLCBoZWlnaHQpLCBjcm9wLmhlaWdodCkpLmF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKGNyb3AubGVmdCwgd2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKGNyb3AuaGVpZ2h0LCBoZWlnaHQpKSkgeworICAgIH0KKworcHVibGljOgorICAgIC8vIGNyb3AgY2FuIGJlIGFuIGVtcHR5IHJlY3QsIGRvZXMgbm90IGhhdmUgdG8gbGluZSB1cCB3aXRoIHN1YnNhbXBsaW5nCisgICAgLy8gTk9URTogd2UgZG8gbm90IHN1cHBvcnQgZmxvYXRpbmctcG9pbnQgY3JvcAorICAgIGlubGluZSBjb25zdGV4cHIgQzJSZWN0IGNyb3AoKSBjb25zdCB7IHJldHVybiBtQ3JvcDsgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGNoaWxkIHBsYW5hciBzZWN0aW9uIGZvciB8Y3JvcHwsIHdoZXJlIHRoZSBjYXBhY2l0eSByZXByZXNlbnRzIHRoaXMgc2VjdGlvbi4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgY2hpbGRTZWN0aW9uKGNvbnN0IEMyUmVjdCAmY3JvcCkgY29uc3QgeworICAgICAgICByZXR1cm4gX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCgKKyAgICAgICAgICAgICAgICBtQ3JvcC53aWR0aCwgbUNyb3AuaGVpZ2h0LAorICAgICAgICAgICAgICAgIC8vIGNyb3AgYW5kIHRyYW5zbGF0ZSB8Y3JvcHwgcmVjdAorICAgICAgICAgICAgICAgIEMyUmVjdChjMl9taW4obUNyb3AucmlnaHQoKSAtIGMyX2NsYW1wKG1Dcm9wLmxlZnQsIGNyb3AubGVmdCwgbUNyb3AucmlnaHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wLndpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgYzJfbWluKG1Dcm9wLmJvdHRvbSgpIC0gYzJfY2xhbXAobUNyb3AudG9wLCBjcm9wLnRvcCwgbUNyb3AuYm90dG9tKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcC5oZWlnaHQpKQorICAgICAgICAgICAgICAgIC5hdChjMl9jbGFtcChtQ3JvcC5sZWZ0LCBjcm9wLmxlZnQsIG1Dcm9wLnJpZ2h0KCkpIC0gbUNyb3AubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgYzJfY2xhbXAobUNyb3AudG9wLCBjcm9wLnRvcCwgbUNyb3AuYm90dG9tKCkpIC0gbUNyb3AudG9wKSk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KGNvbnN0IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0ICpwYXJlbnQpCisgICAgICAgIDogX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QocGFyZW50KSwgbUNyb3Aod2lkdGgoKSwgaGVpZ2h0KCkpIHt9CisKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoY29uc3QgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgKnBhcmVudCwgY29uc3QgQzJSZWN0ICZjcm9wKQorICAgICAgICA6IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KHBhcmVudCksCisgICAgICAgICAgbUNyb3AocGFyZW50ID09IG51bGxwdHIgPyBDMlJlY3QoKSA6ICgoQzJSZWN0KSpwYXJlbnQpLmludGVyc2VjdChjcm9wKS5ub3JtYWxpemUoKSkgeyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAqcGFyZW50LCBjb25zdCBDMlJlY3QgJmNyb3ApCisgICAgICAgIDogX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QocGFyZW50KSwKKyAgICAgICAgICBtQ3JvcChwYXJlbnQgPT0gbnVsbHB0ciA/IEMyUmVjdCgpIDogcGFyZW50LT5jcm9wKCkuaW50ZXJzZWN0KGNyb3ApLm5vcm1hbGl6ZSgpKSB7IH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgX0MyRWRpdGFibGVQbGFuYXJTZWN0aW9uQXNwZWN0OworICAgIEMyUmVjdCBtQ3JvcDsKKy8vLyBAfQorfTsKKworLyoqCisgKiBBc3BlY3QgZm9yIG9iamVjdHMgdGhhdCBoYXZlIGFuIGVkaXRhYmxlIHBsYW5hciBzZWN0aW9uIChjcm9wIHJlY3RhbmdsZSkuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4KKyAqLworY2xhc3MgX0MyRWRpdGFibGVQbGFuYXJTZWN0aW9uQXNwZWN0IDogcHVibGljIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgeworLy8vIFxuYW1lIFBsYW5hciBzZWN0aW9uIGludGVyZmFjZQorLy8vIEB7CisgICAgdXNpbmcgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdDo6X0MyUGxhbmFyU2VjdGlvbkFzcGVjdDsKKworcHVibGljOgorICAgIC8vIGNyb3AgY2FuIGJlIGFuIGVtcHR5IHJlY3QsIGRvZXMgbm90IGhhdmUgdG8gbGluZSB1cCB3aXRoIHN1YnNhbXBsaW5nCisgICAgLy8gTk9URTogd2UgZG8gbm90IHN1cHBvcnQgZmxvYXRpbmctcG9pbnQgY3JvcAorICAgIGlubGluZSBjb25zdGV4cHIgQzJSZWN0IGNyb3AoKSBjb25zdCB7IHJldHVybiBtQ3JvcDsgfQorCisgICAgLyoqCisgICAgICogIFNldHMgY3JvcCB0byBjcm9wIGludGVyc2VjdGVkIHdpdGggWygwLDApIC4uICh3aWR0aCwgaGVpZ2h0KV0KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBzZXRDcm9wX2JlKGNvbnN0IEMyUmVjdCAmY3JvcCkgeworICAgICAgICBtQ3JvcC5sZWZ0ID0gc3RkOjptaW4od2lkdGgoKSwgY3JvcC5sZWZ0KTsKKyAgICAgICAgbUNyb3AudG9wID0gc3RkOjptaW4oaGVpZ2h0KCksIGNyb3AudG9wKTsKKyAgICAgICAgLy8gSXQncyBndWFyYW50ZWVkIHRoYXQgbUNyb3AubGVmdCA8PSB3aWR0aCgpICYmIG1Dcm9wLnRvcCA8PSBoZWlnaHQoKQorICAgICAgICBtQ3JvcC53aWR0aCA9IHN0ZDo6bWluKHdpZHRoKCkgLSBtQ3JvcC5sZWZ0LCBjcm9wLndpZHRoKTsKKyAgICAgICAgbUNyb3AuaGVpZ2h0ID0gc3RkOjptaW4oaGVpZ2h0KCkgLSBtQ3JvcC50b3AsIGNyb3AuaGVpZ2h0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiBjcm9wIGlzIHdpdGhpbiB0aGUgZGltZW5zaW9ucyBvZiB0aGlzIG9iamVjdCwgaXQgc2V0cyBjcm9wIHRvIGl0LgorICAgICAqCisgICAgICogXHJldHVybiB0cnVlIGlmZiBjcm9wIGlzIHdpdGhpbiB0aGUgZGltZW5zaW9ucyBvZiB0aGlzIG9iamVjdAorICAgICAqLworICAgIGlubGluZSBib29sIHNldENyb3AoY29uc3QgQzJSZWN0ICZjcm9wKSB7CisgICAgICAgIGlmICh3aWR0aCgpIDwgY3JvcC53aWR0aCB8fCBoZWlnaHQoKSA8IGNyb3AuaGVpZ2h0CisgICAgICAgICAgICAgICAgfHwgd2lkdGgoKSAtIGNyb3Aud2lkdGggPCBjcm9wLmxlZnQgfHwgaGVpZ2h0KCkgLSBjcm9wLmhlaWdodCA8IGNyb3AudG9wKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbUNyb3AgPSBjcm9wOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisvLy8gQH0KK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3Igc2FmZSByYW5nZSBjYWxjdWxhdGlvbnMgdXNpbmcgc2l6ZV90LXMuCisgKi8KK2NsYXNzIEMyUGxhbmFyU2VjdGlvbiA6IHB1YmxpYyBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0IHsKK3B1YmxpYzoKKyAgICBpbmxpbmUgY29uc3RleHByIEMyUGxhbmFyU2VjdGlvbihjb25zdCBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCAmcGFyZW50LCBjb25zdCBDMlJlY3QgJmNyb3ApCisgICAgICAgIDogX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCgmcGFyZW50LCBjcm9wKSB7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgQzJQbGFuYXJTZWN0aW9uKGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnBhcmVudCwgY29uc3QgQzJSZWN0ICZjcm9wKQorICAgICAgICA6IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoJnBhcmVudCwgY3JvcCkgeyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIEMyUGxhbmFyU2VjdGlvbiBpbnRlcnNlY3QoY29uc3QgQzJSZWN0ICZjcm9wKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlBsYW5hclNlY3Rpb24oKnRoaXMsIGNyb3ApOworICAgIH0KK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3Igc2ltcGxlIGFuZCBzYWZlIHBsYW5hciBjYXBhY2l0eSBhbmQgc2VjdGlvbiBjb25zdHJ1Y3Rpb24uCisgKi8KK2NsYXNzIEMyUGxhbmFyQ2FwYWNpdHkgOiBwdWJsaWMgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgZXhwbGljaXQgQzJQbGFuYXJDYXBhY2l0eShzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpCisgICAgICAgIDogX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QoYzJfbWluKHdpZHRoLCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMyX21pbihoZWlnaHQsIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSkpIHsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlBsYW5hclNlY3Rpb24gc2VjdGlvbihjb25zdCBDMlJlY3QgJmNyb3ApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyUGxhbmFyU2VjdGlvbigqdGhpcywgY3JvcCk7CisgICAgfQorfTsKKworCisvKioKKyAqIFxpbmdyb3VwIGdyYXBoaWMgYWxsb2NhdG9yCisgKiAyRCBhbGxvY2F0aW9uIGludGVyZmFjZS4KKyAqLworY2xhc3MgQzJHcmFwaGljQWxsb2NhdGlvbiA6IHB1YmxpYyBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyBhIHJlY3Rhbmd1bGFyIHNlY3Rpb24gKGFzIGRlZmluZWQgYnkgfHJlY3R8KSBvZiBhIDJEIGFsbG9jYXRpb24gaW50byBsb2NhbCBwcm9jZXNzCisgICAgICogbWVtb3J5IGZvciBmbGV4aWJsZSBhY2Nlc3MuIE9uIHN1Y2Nlc3MsIGl0IGZpbGxzIG91dCB8bGF5b3V0fCB3aXRoIHRoZSBwbGFuZSBzcGVjaWZpY2F0aW9ucworICAgICAqIGFuZCBmaWxscyB0aGUgfGFkZHJ8IGFycmF5IHdpdGggcG9pbnRlcnMgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHRvcC1sZWZ0IHBpeGVsIG9mIGVhY2gKKyAgICAgKiBwbGFuZSB1c2VkLiBPdGhlcndpc2UsIGl0IGxlYXZlcyB8bGF5b3V0fCBhbmQgfGFkZHJ8IHVudG91Y2hlZC4gfGZlbmNlfCB3aWxsIGNvbnRhaW4KKyAgICAgKiBhbiBhY3F1aXJlIHN5bmMgZmVuY2Ugb2JqZWN0LiBJZiBpdCBpcyBhbHJlYWR5IHNhZmUgdG8gYWNjZXNzIHRoZQorICAgICAqIGJ1ZmZlciBjb250ZW50cywgdGhlbiBpdCB3aWxsIGJlIGFuIGVtcHR5IChhbHJlYWR5IGZpcmVkKSBmZW5jZS4KKyAgICAgKgorICAgICAqIFNhZmUgcmVnaW9ucyBmb3IgdGhlIHBvaW50ZXIgYWRkcmVzc2VzIHJldHVybmVkIGNhbiBiZSBnb3R0ZW4gdmlhIEMyTGF5b3V0SW5mby5taW5PZmZzZXQoKS8KKyAgICAgKiBtYXhPZmZzZXQoKS4KKyAgICAgKgorICAgICAqIFxwYXJhbSByZWN0ICAgICAgICAgIHNlY3Rpb24gdG8gYmUgbWFwcGVkICh0aGlzIGRvZXMgbm90IGhhdmUgdG8gYmUgYWxpZ25lZCkKKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgICAgICB0aGUgZGVzaXJlZCB1c2FnZS4gXHRvZG8gdGhpcyBtdXN0IGJlIGtTb2Z0d2FyZVJlYWQgYW5kL29yCisgICAgICogICAgICAgICAgICAgICAgICAgICAga1NvZnR3YXJlV3JpdGUuCisgICAgICogXHBhcmFtIGZlbmNlICAgICAgICAgYSBwb2ludGVyIHRvIGEgZmVuY2Ugb2JqZWN0IGlmIGFuIGFzeW5jIG1hcHBpbmcgaXMgcmVxdWVzdGVkLiBJZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG5vdC1udWxsLCBhbmQgYWNxdWlyZSBmZW5jZSB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MsIG9yIGVtcHR5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgZmVuY2Ugb24gZmFpbHVyZS4gSWYgbnVsbCwgdGhlIG1hcHBpbmcgd2lsbCBiZSBzeW5jaHJvbm91cy4KKyAgICAgKiBccGFyYW0gbGF5b3V0ICAgICAgICBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG1hcHBlZCBwbGFuZXMnIGRlc2NyaXB0b3JzIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzdG9yZWQuIE9uIGZhaWx1cmUsIG51bGxwdHIgd2lsbCBiZSBzdG9yZWQgaGVyZS4KKyAgICAgKiBccGFyYW0gYWRkciAgICAgICAgICBwb2ludGVyIHRvIGFuIGFycmF5IHdpdGggYXQgbGVhc3QgQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuIE9ubHkgbGF5b3V0Lm51bVBsYW5lcyBlbGVtZW50cyB3aWxsIGJlIG1vZGlmaWVkIG9uIHN1Y2Nlc3MuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBtYXAgdGhlIHNlY3Rpb24KKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSB0aGVyZSBpcyBhbHJlYWR5IGEgbWFwcGVkIHJlZ2lvbiBhbmQgdGhpcyBhbGxvY2F0aW9uIGNhbm5vdCBzdXBwb3J0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgbXVsdGktbWFwcGluZyAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHRoZSBwYXJhbWV0ZXJzIChyZWN0KSBhcmUgaW52YWxpZCBvciBvdXRzaWRlIHRoZSBhbGxvY2F0aW9uLCBvciB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB1c2FnZSBmbGFncyBhcmUgaW52YWxpZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbiBmcm9tIGNvbXBsZXRpbmcgKHVuZXhwZWN0ZWQpCisKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG1hcCgKKyAgICAgICAgICAgIEMyUmVjdCByZWN0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlICpmZW5jZSwKKyAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0ICpsYXlvdXQgLyogbm9ubnVsbCAqLywgdWludDhfdCAqKmFkZHIgLyogbm9ubnVsbCAqLykgPSAwOworCisgICAgLyoqCisgICAgICogVW5tYXBzIGEgc2VjdGlvbiBvZiBhbiBhbGxvY2F0aW9uIGF0IHxhZGRyfCB3aXRoIHxyZWN0fC4gVGhlc2UgbXVzdCBiZSBwYXJhbWV0ZXJzIHByZXZpb3VzbHkKKyAgICAgKiBwYXNzZWQgdG8gYW5kIHJldHVybmVkIGJ5IHxtYXB8OyBvdGhlcndpc2UsIHRoaXMgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCisgICAgICoKKyAgICAgKiBccGFyYW0gYWRkciAgICAgICAgICBwb2ludGVyIHRvIGFuIGFycmF5IHdpdGggYXQgbGVhc3QgQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgY29udGFpbmluZyB0aGUgc3RhcnRpbmcgYWRkcmVzc2VzIG9mIHRoZSBtYXBwZWQgbGF5ZXJzCisgICAgICogXHBhcmFtIHJlY3QgICAgICAgICAgYm91bmRhcmllcyBvZiB0aGUgbWFwcGVkIHNlY3Rpb24KKyAgICAgKiBccGFyYW0gZmVuY2UgICAgICAgICBhIHBvaW50ZXIgdG8gYSBmZW5jZSBvYmplY3QgaWYgYW4gYXN5bmMgdW5tYXBwaW5nIGlzIHJlcXVlc3RlZC4gSWYKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBub3QtbnVsbCwgYSByZWxlYXNlIGZlbmNlIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gc3VjY2Vzcywgb3IgZW1wdHkgZmVuY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvbiBmYWlsdXJlLiBUaGlzIGZlbmNlIHNpZ25hbHMgd2hlbiB0aGUgb3JpZ2luYWwgYWxsb2NhdGlvbiBjb250YWlucworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFsbCBjaGFuZ2VzIHRoYXQgaGFwcGVuZWQgdG8gdGhlIG1hcHBlZCBzZWN0aW9uLiBJZiBudWxsLCB0aGUgdW5tYXBwaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzeW5jaHJvbm91cy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIHRoZXJlIGlzIG5vIHN1Y2ggbWFwcGVkIHJlZ2lvbiAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbiBmcm9tIGNvbXBsZXRpbmcgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byB1bm1hcCB0aGUgc2VjdGlvbiAodW5leHBlY3RlZCAtIHN5c3RlbSkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHVubWFwKAorICAgICAgICAgICAgdWludDhfdCAqKmFkZHIgLyogbm9ubnVsbCAqLywgQzJSZWN0IHJlY3QsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGxvY2F0b3IgSUQgZm9yIHRoaXMgYWxsb2NhdGlvbi4gVGhpcyBpcyB1c2VmdWwgdG8gcHV0IHRoZSBoYW5kbGUgaW50byBjb250ZXh0LgorICAgICAqLworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGlvbiBoYW5kbGUuCisgICAgICovCisgICAgdmlydHVhbCBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIHNhbWUgYWxsb2NhdGlvbiBhcyB8b3RoZXJ8LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY0FsbG9jYXRpb24+ICZvdGhlcikgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgdXNpbmcgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3Q6Ol9DMlBsYW5hckNhcGFjaXR5QXNwZWN0OworICAgIHZpcnR1YWwgfkMyR3JhcGhpY0FsbG9jYXRpb24oKSA9IGRlZmF1bHQ7Cit9OworCitjbGFzcyBDMkdyYXBoaWNBbGxvY2F0aW9uOworCisvKioKKyAqIEEgMkQgYmxvY2suCisgKgorICogXG5vdGUgd2lkdGgoKS9oZWlnaHQoKSBpcyBub3QgbWVhbmluZ2Z1bCBmb3IgdXNlcnMgb2YgYmxvY2tzOyBpbnN0ZWFkLCBjcm9wKCkud2lkdGgoKSBhbmQKKyAqIGNyb3AoKS5oZWlnaHQoKSBpcyB0aGUgY2FwYWNpdHkgb2YgdGhlIHVzYWJsZSBwb3J0aW9uLiBVc2UgYW5kIGNyb3AoKSBpZiBhY2Nlc3NpbmcgdGhlIGJsb2NrCisgKiBkaXJlY3RseSB0aHJvdWdoIGl0cyBoYW5kbGUgdG8gcmVwcmVzZW50IHRoZSBhbGxvdHRlZCByZWdpb24gb2YgdGhlIHVuZGVybHlpbmcgYWxsb2NhdGlvbiB0byB0aGlzCisgKiBibG9jay4KKyAqLworY2xhc3MgQzJCbG9jazJEIDogcHVibGljIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgaGFuZGxlIGZvciB0aGlzIGFsbG9jYXRpb24uCisgICAgICoKKyAgICAgKiBcbm90ZSB0aGF0IHRoZSBibG9jayBhbmQgaXRzIGJsb2NrIHBvb2wgaGFzIHNoYXJlZCBvd25lcnNoaXAgb2YgdGhlIGhhbmRsZQorICAgICAqICAgICAgIGFuZCBpZiBhbGwgcmVmZXJlbmNlcyB0byB0aGUgYmxvY2sgYXJlIHJlbGVhc2VkLCB0aGUgdW5kZXJseWluZyBibG9jaworICAgICAqICAgICAgIGFsbG9jYXRpb24gbWF5IGdldCByZXVzZWQgZXZlbiBpZiBhIGNsaWVudCBrZWVwcyBhIGNsb25lIG9mIHRoaXMgaGFuZGxlLgorICAgICAqLworICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFsbG9jYXRvcidzIElEIHRoYXQgY3JlYXRlZCB0aGUgdW5kZXJseWluZyBhbGxvY2F0aW9uIGZvciB0aGlzIGJsb2NrLiBUaGlzCisgICAgICogcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGhhbmRsZS4KKyAgICAgKi8KKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgSW1wbDsKKyAgICBDMkJsb2NrMkQoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24pOworCisgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworfTsKKworLyoqCisgKiBHcmFwaGljIHZpZXcgcHJvdmlkZXMgcmVhZCBvciByZWFkLXdyaXRlIGFjY2VzcyBmb3IgYSBncmFwaGljIGJsb2NrLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCisgKgorICogXG5vdGUgRHVlIHRvIHRoZSBzdWJzYW1wbGluZyBvZiBncmFwaGljIGJ1ZmZlcnMsIGEgcmVhZCB2aWV3IG11c3Qgc3RpbGwgY29udGFpbiBhIGNyb3AgcmVjdGFuZ2xlCisgKiB0byBlbnN1cmUgc3Vic2FtcGxpbmcgaXMgZm9sbG93ZWQuIFRoaXMgcmVzdWx0cyBpbiBuZWFybHkgaWRlbnRpY2FsIGludGVyZmFjZSBiZXR3ZWVuIHJlYWQgYW5kCisgKiB3cml0ZSB2aWV3cywgc28gQzJHcmFwaGljVmlldyBjYW4gZW5jb21wYXNzIGJvdGggb2YgdGhlbS4KKyAqLworY2xhc3MgQzJHcmFwaGljVmlldyA6IHB1YmxpYyBfQzJFZGl0YWJsZVBsYW5hclNlY3Rpb25Bc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFxyZXR1cm4gYXJyYXkgb2YgcG9pbnRlcnMgKG9mIGxheW91dCgpLm51bVBsYW5lcyBlbGVtZW50cykgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwbGFuZXMgb3IKKyAgICAgKiBudWxscHRyIG9uIGVycm9yLiBSZWdhcmRsZXNzIG9mIGNyb3AgcmVjdCwgdGhleSBhbHdheXMgcG9pbnQgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiBlYWNoCisgICAgICogcGxhbmUuIEFjY2VzcyBvdXRzaWRlIG9mIHRoZSBjcm9wIHJlY3QgcmVzdWx0cyBpbiBhbiB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgICovCisgICAgY29uc3QgdWludDhfdCAqY29uc3QgKmRhdGEoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gYXJyYXkgb2YgcG9pbnRlcnMgKG9mIGxheW91dCgpLm51bVBsYW5lcyBlbGVtZW50cykgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwbGFuZXMgb3IKKyAgICAgKiBudWxscHRyIG9uIGVycm9yLiBSZWdhcmRsZXNzIG9mIGNyb3AgcmVjdCwgdGhleSBhbHdheXMgcG9pbnQgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiBlYWNoCisgICAgICogcGxhbmUuIEFjY2VzcyBvdXRzaWRlIG9mIHRoZSBjcm9wIHJlY3QgcmVzdWx0cyBpbiBhbiB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgICovCisgICAgdWludDhfdCAqY29uc3QgKmRhdGEoKTsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gbGF5b3V0IG9mIHRoZSBncmFwaGljIGJsb2NrIHRvIGludGVycHJldCB0aGUgcmV0dXJuZWQgZGF0YS4KKyAgICAgKi8KKyAgICBjb25zdCBDMlBsYW5hckxheW91dCBsYXlvdXQoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzZWN0aW9uIG9mIHRoaXMgdmlldy4KKyAgICAgKgorICAgICAqIFxwYXJhbSByZWN0ICAgIHRoZSBkaW1lbnNpb24gb2YgdGhlIHNlY3Rpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgY3JvcCBvZiB0aGlzIHZpZXcuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgcmVhZCB2aWV3IGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZCBzZWN0aW9uIG9mIHRoaXMgdmlldworICAgICAqLworICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgc3ViVmlldyhjb25zdCBDMlJlY3QgJnJlY3QpIGNvbnN0OworICAgIEMyR3JhcGhpY1ZpZXcgc3ViVmlldyhjb25zdCBDMlJlY3QgJnJlY3QpOworCisgICAgLyoqCisgICAgICogXHJldHVybiBlcnJvciBkdXJpbmcgdGhlIGNyZWF0aW9uL21hcHBpbmcgb2YgdGhpcyB2aWV3LgorICAgICAqLworICAgIGMyX3N0YXR1c190IGVycm9yKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICBjbGFzcyBJbXBsOworICAgIEMyR3JhcGhpY1ZpZXcoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24pOworICAgIGV4cGxpY2l0IEMyR3JhcGhpY1ZpZXcoYzJfc3RhdHVzX3QgZXJyb3IpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogQSBjb25zdGFudCAocmVhZC1vbmx5KSBncmFwaGljIGJsb2NrIChwb3J0aW9uIG9mIGFuIGFsbG9jYXRpb24pIHdpdGggYW4gYWNxdWlyZSBmZW5jZS4KKyAqIEJsb2NrcyBhcmUgdW5tYXBwZWQgd2hlbiBjcmVhdGVkLCBhbmQgY2FuIGJlIG1hcHBlZCBpbnRvIGEgcmVhZCB2aWV3IG9uIGRlbWFuZC4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlIGFuZCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgYWxsb2NhdGlvbiB0aGF0IGl0IGlzIGJhc2VkIG9uLgorICovCitjbGFzcyBDMkNvbnN0R3JhcGhpY0Jsb2NrIDogcHVibGljIEMyQmxvY2syRCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyB0aGlzIGJsb2NrIGludG8gbWVtb3J5IGFuZCByZXR1cm5zIGEgcmVhZCB2aWV3IGZvciBpdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSByZWFkIHZpZXcgZm9yIHRoaXMgYmxvY2suCisgICAgICovCisgICAgQzJBY3F1aXJhYmxlPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IG1hcCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNlY3Rpb24gb2YgdGhpcyBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSByZWN0ICAgIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgc2VjdGlvbi4gXG5vdGUgVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSBjcm9wIHJlY3RhbmdsZSBvZgorICAgICAqICAgICAgICAgICAgICB0aGlzIGJsb2NrLgorICAgICAqCisgICAgICogXHJldHVybiBhIGNvbnN0YW50IGdyYXBoaWMgYmxvY2sgY29udGFpbmluZyBhIHBvcnRpb24gb2YgdGhpcyBibG9jaworICAgICAqLworICAgIEMyQ29uc3RHcmFwaGljQmxvY2sgc3ViQmxvY2soY29uc3QgQzJSZWN0ICZyZWN0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFjcXVpcmUgZmVuY2UgZm9yIHRoaXMgYmxvY2suCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgZmVuY2UgdGhhdCBtdXN0IGJlIHdhaXRlZCBvbiBiZWZvcmUgcmVhZGluZyB0aGUgYmxvY2suCisgICAgICovCisgICAgQzJGZW5jZSBmZW5jZSgpIGNvbnN0IHsgcmV0dXJuIG1GZW5jZTsgfQorCitwcm90ZWN0ZWQ6CisgICAgQzJDb25zdEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uLCBDMkZlbmNlIGZlbmNlKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKKyAgICBDMkZlbmNlIG1GZW5jZTsKK307CisKKy8qKgorICogR3JhcGhpYyBibG9jayBpcyBhIHdyaXRlYWJsZSAyRCBibG9jay4gT25jZSB3cml0dGVuLCBpdCBjYW4gYmUgc2hhcmVkIGluIHdob2xlIG9yIGluIHBhcnQgd2l0aAorICogY29uc3VtZXJzL3JlYWRlcnMgYXMgcmVhZC1vbmx5IGNvbnN0IGdyYXBoaWMgYmxvY2suCisgKi8KK2NsYXNzIEMyR3JhcGhpY0Jsb2NrIDogcHVibGljIEMyQmxvY2syRCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyB0aGlzIGJsb2NrIGludG8gbWVtb3J5IGFuZCByZXR1cm5zIGEgd3JpdGUgdmlldyBmb3IgaXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgd3JpdGUgdmlldyBmb3IgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBDMkFjcXVpcmFibGU8QzJHcmFwaGljVmlldz4gbWFwKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgcmVhZC1vbmx5IGNvbnN0IGxpbmVhciBibG9jayBmb3IgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2s7IG9wdGlvbmFsbHkgcHJvdGVjdGVkCisgICAgICogYnkgYW4gYWNxdWlyZSBmZW5jZS4gVGhlcmUgYXJlIHR3byB3YXlzIHRvIHVzZSB0aGlzOgorICAgICAqCisgICAgICogMSkgc2hhcmUgcmVhZHkgYmxvY2sgYWZ0ZXIgd3JpdGluZyBkYXRhIGludG8gdGhlIGJsb2NrLiBJbiB0aGlzIGNhc2Ugbm8gZmVuY2Ugc2hhbGwgYmUKKyAgICAgKiAgICBzdXBwbGllZCwgYW5kIHRoZSBibG9jayBzaGFsbCBub3QgYmUgbW9kaWZpZWQgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZC4KKyAgICAgKiAyKSBzaGFyZSBibG9jayBtZXRhZGF0YSBiZWZvcmUgYWN0dWFsbHkgKGZpbmlzaGluZykgd3JpdGluZyB0aGUgZGF0YSBpbnRvIHRoZSBibG9jay4gSW4KKyAgICAgKiAgICB0aGlzIGNhc2UgYSBmZW5jZSBtdXN0IGJlIHN1cHBsaWVkIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgZGF0YSBpcyB3cml0dGVuLgorICAgICAqICAgIFRoZSBibG9jayBzaGFsbCBiZSBtb2RpZmllZCBvbmx5IHVudGlsIGZpcmluZyB0aGUgZXZlbnQgZm9yIHRoZSBmZW5jZS4KKyAgICAgKi8KKyAgICBDMkNvbnN0R3JhcGhpY0Jsb2NrIHNoYXJlKGNvbnN0IEMyUmVjdCAmY3JvcCwgQzJGZW5jZSBmZW5jZSk7CisKK3Byb3RlY3RlZDoKKyAgICBDMkdyYXBoaWNCbG9jayhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAmc2VjdGlvbik7CisKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKK307CisKKy8vLyBAfQorCisvLy8gXGRlZmdyb3VwIGJ1ZmZlcl9vbmogQnVmZmVyIG9iamVjdHMKKy8vLyBAeworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBCVUZGRVJTCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8vIFx0b2RvOiBEbyB3ZSBzdGlsbCBuZWVkIHRoaXM/CisvLy8KKy8vIFRoZXJlIGFyZSAyIGtpbmRzIG9mIGJ1ZmZlcnM6IGxpbmVhciBvciBncmFwaGljLiBMaW5lYXIgYnVmZmVycyBjYW4gY29udGFpbiBhIHNpbmdsZSBibG9jaywgb3IKKy8vIGEgbGlzdCBvZiBibG9ja3MgKExJTkVBUl9DSFVOS1MpLiBTdXBwb3J0IGZvciBsaXN0IG9mIGJsb2NrcyBpcyBvcHRpb25hbCwgYW5kIGNhbiBhbGxvdyBjb25zdW1pbmcKKy8vIGRhdGEgZnJvbSBjaXJjdWxhciBidWZmZXJzIG9yIHNjYXR0ZXJlZCBkYXRhIHNvdXJjZXMgd2l0aG91dCBleHRyYSBtZW1jcHkuIEN1cnJlbnRseSwgbGlzdCBvZgorLy8gZ3JhcGhpYyBibG9ja3MgaXMgbm90IHN1cHBvcnRlZC4KKworY2xhc3MgQzJMaW5lYXJCdWZmZXI7ICAgLy8gcmVhZC13cml0ZSBidWZmZXIKK2NsYXNzIEMyR3JhcGhpY0J1ZmZlcjsgIC8vIHJlYWQtd3JpdGUgYnVmZmVyCitjbGFzcyBDMkxpbmVhckNodW5rc0J1ZmZlcjsKKworLyoqCisgKiBDMkJ1ZmZlckRhdGE6IHRoZSBtYWluLCBub24tbWV0YSBkYXRhIG9mIGEgYnVmZmVyLiBBIGJ1ZmZlciBjYW4gY29udGFpbiBlaXRoZXIgbGluZWFyIGJsb2NrcworICogb3IgZ3JhcGhpYyBibG9ja3MsIGFuZCBjYW4gY29udGFpbiBlaXRoZXIgYSBzaW5nbGUgYmxvY2sgb3IgbXVsdGlwbGUgYmxvY2tzLiBUaGlzIGlzIGRldGVybWluZWQKKyAqIGJ5IGl0cyB0eXBlLgorICovCitjbGFzcyBDMkJ1ZmZlckRhdGEgeworcHVibGljOgorICAgIC8qKgorICAgICAqICBUaGUgdHlwZSBvZiBidWZmZXIgZGF0YS4KKyAgICAgKi8KKyAgICBlbnVtIHR5cGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgSU5WQUxJRCwgICAgICAgICAgICAvLy88IGludmFsaWQgYnVmZmVyIHR5cGUuIERvIG5vdCB1c2UuCisgICAgICAgIExJTkVBUiwgICAgICAgICAgICAgLy8vPCB0aGUgYnVmZmVyIGNvbnRhaW5zIGEgc2luZ2xlIGxpbmVhciBibG9jaworICAgICAgICBMSU5FQVJfQ0hVTktTLCAgICAgIC8vLzwgdGhlIGJ1ZmZlciBjb250YWlucyBvbmUgb3IgbW9yZSBsaW5lYXIgYmxvY2tzCisgICAgICAgIEdSQVBISUMsICAgICAgICAgICAgLy8vPCB0aGUgYnVmZmVyIGNvbnRhaW5zIGEgc2luZ2xlIGdyYXBoaWMgYmxvY2sKKyAgICAgICAgR1JBUEhJQ19DSFVOS1MsICAgICAvLy88IHRoZSBidWZmZXIgY29udGFpbnMgb25lIG9mIG1vcmUgZ3JhcGhpYyBibG9ja3MKKyAgICB9OworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdHlwZSBvZiB0aGlzIGJ1ZmZlciAoZGF0YSkuCisgICAgICogXHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIGJ1ZmZlciBkYXRhLgorICAgICAqLworICAgIHR5cGVfdCB0eXBlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsaW5lYXIgYmxvY2tzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIFxyZXR1cm4gYSBjb25zdGFudCBsaXN0IG9mIGNvbnN0IGxpbmVhciBibG9ja3Mgb2YgdGhpcyBidWZmZXIuCisgICAgICogXHJldHZhbCBlbXB0eSBsaXN0IGlmIHRoaXMgYnVmZmVyIGRvZXMgbm90IGNvbnRhaW4gbGluZWFyIGJsb2NrKHMpLgorICAgICAqLworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gbGluZWFyQmxvY2tzKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBncmFwaGljIGJsb2NrcyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBccmV0dXJuIGEgY29uc3RhbnQgbGlzdCBvZiBjb25zdCBncmFwaGljIGJsb2NrcyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBccmV0dmFsIGVtcHR5IGxpc3QgaWYgdGhpcyBidWZmZXIgZG9lcyBub3QgY29udGFpbiBncmFwaGljIGJsb2NrKHMpLgorICAgICAqLworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+IGdyYXBoaWNCbG9ja3MoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKworcHJvdGVjdGVkOgorICAgIC8vIG5vIHB1YmxpYyBjb25zdHJ1Y3RvcgorICAgIGV4cGxpY2l0IEMyQnVmZmVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpOworICAgIGV4cGxpY2l0IEMyQnVmZmVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKTsKK307CisKKy8qKgorICogQzJCdWZmZXI6IGJ1ZmZlciBiYXNlIGNsYXNzLiBUaGVzZSBhcmUgYWx3YXlzIHVzZWQgYXMgc2hhcmVkX3B0cnMuIFRob3VnaCB0aGUgdW5kZXJseWluZyBidWZmZXIKKyAqIG9iamVjdHMgKG5hdGl2ZSBidWZmZXJzLCBpb24gYnVmZmVycywgb3IgZG1hYnVmcykgYXJlIHJlZmVyZW5jZS1jb3VudGVkIGJ5IHRoZSBzeXN0ZW0sCisgKiBDMkJ1ZmZlcnMgaG9sZCBvbmx5IGEgc2luZ2xlIHJlZmVyZW5jZS4KKyAqCisgKiBUaGVzZSBvYmplY3RzIGNhbm5vdCBiZSB1c2VkIG9uIHRoZSBzdGFjay4KKyAqLworY2xhc3MgQzJCdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEdldHMgdGhlIGJ1ZmZlcidzIGRhdGEuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBidWZmZXIncyBkYXRhLgorICAgICAqLworICAgIGNvbnN0IEMyQnVmZmVyRGF0YSBkYXRhKCkgY29uc3Q7CisKKyAgICAvLy9AbmFtZSBQcmUtZGVzdHJveSBub3RpZmljYXRpb24gaGFuZGxpbmcKKyAgICAvLy9AeworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbiBqdXN0IHByaW9yIHRvIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICB0eXBlZGVmIHZvaWQgKCpPbkRlc3Ryb3lOb3RpZnkpIChjb25zdCBDMkJ1ZmZlciAqYnVmLCB2b2lkICphcmcpOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGZvciBhIHByZS1kZXN0cm95IG5vdGlmaWNhdGlvbi4gVGhpcyBpcyBjYWxsZWQganVzdCBwcmlvciB0byB0aGUgZGVzdHJ1Y3Rpb24gb2YKKyAgICAgKiB0aGlzIGJ1ZmZlciAod2hlbiB0aGlzIGJ1ZmZlciBpcyBubyBsb25nZXIgdmFsaWQuKQorICAgICAqCisgICAgICogXHBhcmFtIG9uRGVzdHJveU5vdGlmeSAgIHRoZSBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAgICAgKiBccGFyYW0gYXJnICAgICAgICAgICAgICAgYW4gYXJiaXRyYXJ5IHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgcmVnaXN0cmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFIGEgbm90aWZpY2F0aW9uIHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHRoaXMgY2FsbGJhY2sgYW5kIGFyZ3VtZW50CisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcmVnaXN0ZXIgZm9yIHRoaXMgY2FsbGJhY2sKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBhbiB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgcmVnaXN0cmF0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IHJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KE9uRGVzdHJveU5vdGlmeSBvbkRlc3Ryb3lOb3RpZnksIHZvaWQgKmFyZyA9IG51bGxwdHIpOworCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlcnMgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgcHJlLWRlc3Ryb3kgbm90aWZpY2F0aW9uLgorICAgICAqCisgICAgICogXHBhcmFtIG9uRGVzdHJveU5vdGlmeSAgIHRoZSBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAgICAgKiBccGFyYW0gYXJnICAgICAgICAgICAgICAgYW4gYXJiaXRyYXJ5IHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgdW5yZWdpc3RyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgdGhlIG5vdGlmaWNhdGlvbiB3YXMgbm90IGZvdW5kCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgYW4gdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHJlZ2lzdHJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCB1bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KE9uRGVzdHJveU5vdGlmeSBvbkRlc3Ryb3lOb3RpZnksIHZvaWQgKmFyZyA9IG51bGxwdHIpOworCisgICAgLy8vQH0KKworICAgIHZpcnR1YWwgfkMyQnVmZmVyKCkgPSBkZWZhdWx0OworCisgICAgLy8vQG5hbWUgQnVmZmVyLXNwZWNpZmljIGFyYml0cmFyeSBtZXRhZGF0YSBoYW5kbGluZworICAgIC8vL0B7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBjb25zdGFudCBsaXN0IG9mIGluZm8gb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWZmZXIuCisgICAgICovCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IGluZm8oKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEF0dGFjaGVzIChvciB1cGRhdGVzKSBhbiAoZXhpc3RpbmcpIG1ldGFkYXRhIGZvciB0aGlzIGJ1ZmZlci4KKyAgICAgKiBJZiB0aGUgbWV0YWRhdGEgaXMgc3RyZWFtIHNwZWNpZmljLCB0aGUgc3RyZWFtIGluZm9ybWF0aW9uIHdpbGwgYmUgcmVzZXQuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5mbyBNZXRhZGF0YSB0byB1cGRhdGUKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBtZXRhZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IGF0dGFjaGVkL3VwZGF0ZWQuCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gYXR0YWNoIHRoZSBtZXRhZGF0YSAodGhpcyByZXR1cm4gdmFsdWUgaXMgbm90CisgICAgICogICAgICAgICAgICAgICAgICAgICAgdXNlZCBpZiB0aGUgc2FtZSBraW5kIG9mIG1ldGFkYXRhIGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gdGhlIGJ1ZmZlcikuCisgICAgICovCisgICAgYzJfc3RhdHVzX3Qgc2V0SW5mbyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiAmaW5mbyk7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlcmUgaXMgYSBjZXJ0YWluIHR5cGUgb2YgbWV0YWRhdGEgYXR0YWNoZWQgdG8gdGhpcyBidWZmZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5kZXggdGhlIHBhcmFtZXRlciB0eXBlIG9mIHRoZSBtZXRhZGF0YQorICAgICAqCisgICAgICogXHJldHVybiB0cnVlIGlmZiB0aGVyZSBpcyBhIG1ldGFkYXRhIHdpdGggdGhlIHBhcmFtZXRlciB0eXBlIGF0dGFjaGVkIHRvIHRoaXMgYnVmZmVyLgorICAgICAqLworICAgIGJvb2wgaGFzSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGVyZSBpcyBhIGNlcnRhaW4gdHlwZSBvZiBtZXRhZGF0YSBhdHRhY2hlZCB0byB0aGlzIGJ1ZmZlciwgYW5kIHJldHVybnMgYQorICAgICAqIHNoYXJlZCBwb2ludGVyIHRvIGl0IGlmIHRoZXJlIGlzLiBSZXR1cm5zIGFuIGVtcHR5IHNoYXJlZCBwb2ludGVyIG9iamVjdCAobnVsbHB0cikgaWYgdGhlcmUKKyAgICAgKiBpcyBub3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5kZXggdGhlIHBhcmFtZXRlciB0eXBlIG9mIHRoZSBtZXRhZGF0YQorICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgbWV0YWRhdGEuCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gZ2V0SW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBtZXRhZGF0YSBmcm9tIHRoZSBidWZmZXIuCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gcmVtb3ZlSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KTsKKyAgICAvLy9AfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBjb250YWluaW5nIGEgc2luZ2xlIGxpbmVhciBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSBibG9jayB0aGUgY29udGVudCBvZiB0aGUgYnVmZmVyLgorICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBidWZmZXIuCisgICAgICovCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gQ3JlYXRlTGluZWFyQnVmZmVyKGNvbnN0IEMyQ29uc3RMaW5lYXJCbG9jayAmYmxvY2spOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBjb250YWluaW5nIGEgc2luZ2xlIGdyYXBoaWMgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gYmxvY2sgdGhlIGNvbnRlbnQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgYnVmZmVyLgorICAgICAqLworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IENyZWF0ZUdyYXBoaWNCdWZmZXIoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2spOworCitwcm90ZWN0ZWQ6CisgICAgLy8gbm8gcHVibGljIGNvbnN0cnVjdG9yCisgICAgZXhwbGljaXQgQzJCdWZmZXIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKTsKKyAgICBleHBsaWNpdCBDMkJ1ZmZlcihjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKTsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogQW4gZXh0ZW5zaW9uIG9mIEMySW5mbyBvYmplY3RzIHRoYXQgY2FuIGNvbnRhaW4gYXJiaXRyYXJ5IGJ1ZmZlciBkYXRhLgorICoKKyAqIFxub3RlIFRoaXMgb2JqZWN0IGlzIG5vdCBkZXNjcmliYWJsZSBhbmQgY29udGFpbnMgb3BhcXVlIGRhdGEuCisgKi8KK2NsYXNzIEMySW5mb0J1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogR2V0cyB0aGUgaW5kZXggb2YgdGhpcyBpbmZvIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIHBhcmFtZXRlciBpbmRleC4KKyAgICAgKi8KKyAgICBjb25zdCBDMlBhcmFtOjpJbmRleCBpbmRleCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYnVmZmVyJ3MgZGF0YS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIGJ1ZmZlcidzIGRhdGEuCisgICAgICovCisgICAgY29uc3QgQzJCdWZmZXJEYXRhIGRhdGEoKSBjb25zdDsKK307CisKKy8vLyBAfQorCisvLy8gQH0KKworI2VuZGlmICAvLyBDMkJVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkJ1ZmZlckJhc2UuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJCdWZmZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJkNDhmMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJCdWZmZXJCYXNlLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJCVUZGRVJfQkFTRV9IXworI2RlZmluZSBDMkJVRkZFUl9CQVNFX0hfCisKKy8vLyBcZGVmZ3JvdXAgYWxsb2NhdG9yIEFsbG9jYXRpb24gYW5kIG1lbW9yeSBwbGFjZW1lbnQKKy8vLyBAeworCisvKioKKyAqIEJ1ZmZlci9tZW1vcnkgdXNhZ2UgYml0cy4gVGhlc2Ugc2hhbGwgYmUgdXNlZCBieSB0aGUgYWxsb2NhdG9ycyB0byBzZWxlY3Qgb3B0aW1hbCBtZW1vcnkgdHlwZS8KKyAqIHBvb2wgYW5kIGJ1ZmZlciBsYXlvdXQuIFVzYWdlIGJpdHMgYXJlIGNvbmNlcHR1YWxseSBzZXBhcmF0ZWQgaW50byByZWFkIGFuZCB3cml0ZSB1c2FnZSwgd2hpbGUKKyAqIHRoZSBidWZmZXIgdXNlIGxpZmUtY3ljbGUgaXMgc2VwYXJhdGVkIGludG8gcHJvZHVjZXJzICh3cml0ZXJzKSBhbmQgY29uc3VtZXJzIChyZWFkZXJzKS4KKyAqIFRoZXNlIHR3byBjb25jZXB0cyBhcmUgcmVsYXRlZCBidXQgbm90IGVxdWl2YWxlbnQ6IGNvbnN1bWVycyBtYXkgb25seSByZWFkIGJ1ZmZlcnMgYW5kIG9ubHkKKyAqIHByb2R1Y2VycyBtYXkgd3JpdGUgdG8gYnVmZmVyczsgbm90ZSwgaG93ZXZlciwgdGhhdCBidWZmZXIgcHJvZHVjZXJzIG1heSBhbHNvIHdhbnQgb3IgbmVlZCB0bworICogcmVhZCB0aGUgYnVmZmVycy4KKyAqCisgKiBSZWFkIGFuZCB3cml0ZSBidWZmZXIgdXNhZ2UgYml0cyBzaGFsbCBiZSBvci1lZCB0byBhcnJpdmUgYXQgdGhlIGZ1bGwgYnVmZmVyIHVzYWdlLiBBZG1pdHRlZGx5LAorICogdGhpcyBkb2VzIG5vdCBhY2NvdW50IGZvciB0aGUgYW1vdW50IG9mIHJlYWRpbmcgYW5kIHdyaXRpbmcgKGUuZy4gYSBidWZmZXIgbWF5IGhhdmUgb25lIG9yIG1vcmUKKyAqIHJlYWRlcnMpOyBob3dldmVyLCB0aGUgcHJvcGVyIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBwcm9wZXJseSB3ZWlnaCB0aGUgdmFyaW91cyB1c2FnZXMgd291bGQgYmUKKyAqIHRoZSBhbW91bnQgb2YgZGF0YSByZWFkL3dyaXR0ZW4gZm9yIGVhY2ggdXNhZ2UgdHlwZS4gVGhpcyB3b3VsZCByZXN1bHQgaW4gYW4gaW50ZWdlciBhcnJheSBvZgorICogc2l6ZSA2NCAob3IgdGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2FnZXMpIGZvciBtZW1vcnkgdXNhZ2UsIGFuZCBsaWtlbHkgc3VjaCBkZXRhaWxlZCBpbmZvcm1hdGlvbgorICogd291bGQgbm90IGFsd2F5cyBiZSBhdmFpbGFibGUuCisgKgorICogVGhhdCBwbGF0Zm9ybS1hZ25vc3RpYyBDb2RlYyAyLjAgQVBJIG9ubHkgZGVmaW5lcyB0aGUgYmFyZSBtaW5pbXVtIHVzYWdlcy4gUGxhdGZvcm1zIHNoYWxsIGRlZmluZQorICogdXNhZ2UgYml0cyB0aGF0IGFyZSBhcHByb3ByaWF0ZSBmb3IgdGhlIHBsYXRmb3JtLgorICovCitzdHJ1Y3QgQzJNZW1vcnlVc2FnZSB7CisvLyBwdWJsaWM6CisgICAgLyoqCisgICAgICogQnVmZmVyIHJlYWQgdXNhZ2UuCisgICAgICovCisgICAgZW51bSByZWFkX3QgOiB1aW50NjRfdCB7CisgICAgICAgIC8qKiBCdWZmZXIgaXMgcmVhZCBieSB0aGUgQ1BVLiAqLworICAgICAgICBDUFVfUkVBRCAgICAgICAgPSAxIDw8IDAsCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWZmZXIgc2hhbGwgb25seSBiZSByZWFkIGJ5IHRydXN0ZWQgaGFyZHdhcmUuIFRoZSBkZWZpbml0aW9uIG9mIHRydXN0ZWQgaGFyZHdhcmUgaXMKKyAgICAgICAgICogcGxhdGZvcm0gc3BlY2lmaWMsIGJ1dCB0aGlzIGZsYWcgaXMgcmVzZXJ2ZWQgdG8gcHJldmVudCBtYXBwaW5nIHRoaXMgYmxvY2sgaW50byBDUFUKKyAgICAgICAgICogcmVhZGFibGUgbWVtb3J5IHJlc3VsdGluZyBpbiBidXMgZmF1bHQuIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCB3aGVuIGJ1ZmZlciBhY2Nlc3MgbXVzdCBiZQorICAgICAgICAgKiBwcm90ZWN0ZWQuCisgICAgICAgICAqLworICAgICAgICBSRUFEX1BST1RFQ1RFRCAgPSAxIDw8IDEsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciB3cml0ZSB1c2FnZS4KKyAgICAgKi8KKyAgICBlbnVtIHdyaXRlX3QgOiB1aW50NjRfdCB7CisgICAgICAgIC8qKiBCdWZmZXIgaXMgd3JpdHRlZCB0byBieSB0aGUgQ1BVLiAqLworICAgICAgICBDUFVfV1JJVEUgICAgICAgID0gMSA8PCAyLAorICAgICAgICAvKioKKyAgICAgICAgICogQnVmZmVyIHNoYWxsIG9ubHkgYmUgd3JpdHRlbiB0byBieSB0cnVzdGVkIGhhcmR3YXJlLiBUaGUgZGVmaW5pdGlvbiBvZiB0cnVzdGVkIGhhcmR3YXJlCisgICAgICAgICAqIGlzIHBsYXRmb3JtIHNwZWNpZmljLCBidXQgdGhpcyBmbGFnIGlzIHJlc2VydmVkIHRvIHByZXZlbnQgbWFwcGluZyB0aGlzIGJsb2NrIGludG8gQ1BVCisgICAgICAgICAqIHdyaXRhYmxlIG1lbW9yeSByZXN1bHRpbmcgaW4gYnVzIGZhdWx0LiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgd2hlbiBidWZmZXIgaW50ZWdyaXR5IG11c3QKKyAgICAgICAgICogYmUgcHJvdGVjdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgV1JJVEVfUFJPVEVDVEVEICA9IDEgPDwgMywKKyAgICB9OworCisgICAgZW51bSA6IHVpbnQ2NF90IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1ZmZlciB1c2FnZSBiaXRzIHJlc2VydmVkIGZvciB0aGUgcGxhdGZvcm0uIFdlIGRvbid0IHNlcGFyYXRlbHkgcmVzZXJ2ZSByZWFkIGFuZAorICAgICAgICAgKiB3cml0ZSB1c2FnZXMgYXMgcGxhdGZvcm1zIG1heSBoYXZlIGFzeW1tZXRyaWMgZGlzdHJpYnV0aW9uIGJldHdlZW4gdGhlbS4KKyAgICAgICAgICovCisgICAgICAgIFBMQVRGT1JNX01BU0sgICAgID0gfihDUFVfUkVBRCB8IENQVV9XUklURSB8IFJFQURfUFJPVEVDVEVEIHwgV1JJVEVfUFJPVEVDVEVEKSwKKyAgICB9OworCisgICAgLyoqIENyZWF0ZSBhIHVzYWdlIGZyb20gc2VwYXJhdGUgY29uc3VtZXIgYW5kIHByb2R1Y2VyIHVzYWdlIG1hc2suIFxkZXByZWNhdGVkICovCisgICAgaW5saW5lIEMyTWVtb3J5VXNhZ2UodWludDY0X3QgY29uc3VtZXIsIHVpbnQ2NF90IHByb2R1Y2VyKQorICAgICAgICA6IGV4cGVjdGVkKGNvbnN1bWVyIHwgcHJvZHVjZXIpIHsgfQorCisgICAgaW5saW5lIGV4cGxpY2l0IEMyTWVtb3J5VXNhZ2UodWludDY0X3QgZXhwZWN0ZWRfKQorICAgICAgICA6IGV4cGVjdGVkKGV4cGVjdGVkXykgeyB9CisKKyAgICB1aW50NjRfdCBleHBlY3RlZDsgLy8gZXhwZWN0ZWQgYnVmZmVyIHVzYWdlCit9OworCisvLy8gQH0KKworI2VuZGlmICAvLyBDMkJVRkZFUl9CQVNFX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb21wb25lbnQuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb21wb25lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2Y4ZDJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbXBvbmVudC5oCkBAIC0wLDAgKzEsOTc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMkNPTVBPTkVOVF9IXworCisjZGVmaW5lIEMyQ09NUE9ORU5UX0hfCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgPEMyRW51bS5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKworLy8vIFxkZWZncm91cCBjb21wb25lbnRzIENvbXBvbmVudHMKKy8vLyBAeworCitzdHJ1Y3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IHsKKyAgICBlbnVtIHR5cGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgUE9TU0lCTEUsIC8vLzwgcXVlcnkgYWxsIHBvc3NpYmxlIHZhbHVlcyByZWdhcmRsZXNzIG9mIG90aGVyIHNldHRpbmdzCisgICAgICAgIENVUlJFTlQsICAvLy88IHF1ZXJ5IGN1cnJlbnRseSBwb3NzaWJsZSB2YWx1ZXMgZ2l2ZW4gZGVwZW5kZW50IHNldHRpbmdzCisgICAgfTsKKworcHJpdmF0ZToKKyAgICBDMlBhcmFtRmllbGQgX21GaWVsZDsKKyAgICB0eXBlX3QgX21UeXBlOworcHVibGljOgorICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIHZhbHVlczsKKworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeShjb25zdCBDMlBhcmFtRmllbGQgJmZpZWxkXywgdHlwZV90IHR5cGVfKQorICAgICAgICA6IF9tRmllbGQoZmllbGRfKSwgX21UeXBlKHR5cGVfKSwgc3RhdHVzKEMyX05PX0lOSVQpIHsgfQorCisgICAgc3RhdGljIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeQorICAgIEN1cnJlbnQoY29uc3QgQzJQYXJhbUZpZWxkICZmaWVsZF8pIHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeShmaWVsZF8sIENVUlJFTlQpOworICAgIH0KKworICAgIHN0YXRpYyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKKyAgICBQb3NzaWJsZShjb25zdCBDMlBhcmFtRmllbGQgJmZpZWxkXykgeworICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KGZpZWxkXywgUE9TU0lCTEUpOworICAgIH0KKworICAgIGlubGluZSBDMlBhcmFtRmllbGQgZmllbGQoKSBjb25zdCB7IHJldHVybiBfbUZpZWxkOyB9OworCisgICAgaW5saW5lIHR5cGVfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gX21UeXBlOyB9Cit9OworCisvKioKKyAqIENvbXBvbmVudCBpbnRlcmZhY2Ugb2JqZWN0LiBUaGlzIG9iamVjdCBjb250YWlucyBhbGwgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBwb3RlbnRpYWwgb3IKKyAqIGFjdHVhbCBjb21wb25lbnQuIEl0IGNhbiBiZSBjcmVhdGVkIGFuZCB1c2VkIGluZGVwZW5kZW50bHkgb2YgYW4gYWN0dWFsIEMyQ29tcG9uZW50IGluc3RhbmNlIHRvCisgKiBxdWVyeSBzdXBwb3J0IGFuZCBwYXJhbWV0ZXJzIGZvciB2YXJpb3VzIGNvbXBvbmVudCBzZXR0aW5ncyBhbmQgY29uZmlndXJhdGlvbnMgZm9yIGEgcG90ZW50aWFsCisgKiBjb21wb25lbnQuIEFjdHVhbCBjb21wb25lbnRzIGFsc28gZXhwb3NlIHRoaXMgaW50ZXJmYWNlLgorICovCisKK2NsYXNzIEMyQ29tcG9uZW50SW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICAvLyBBTFdBWVMgQVZBSUxBQkxFIE1FVEhPRFMKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSBvYmplY3QuCisgICAgICogVGhpcyBpcyBhIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGNvbXBvbmVudCBvciBjb21wb25lbnQgaW50ZXJmYWNlICdjbGFzcyc7IGhvd2V2ZXIsIG11bHRpcGxlCisgICAgICogaW5zdGFuY2VzIG9mIHRoaXMgY29tcG9uZW50IFNIQUxMIGhhdmUgdGhlIHNhbWUgbmFtZS4KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUuCisgICAgICogVGhpcyBjYWxsIGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUgbm9yIHRoZSBpbnRlcm5hbCBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSBvYmplY3QuCisgICAgICogXHJldHZhbCBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBhY3R1YWwgbmFtZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIElEIGZvciB0aGlzIGNvbXBvbmVudCBvciBpbnRlcmZhY2Ugb2JqZWN0LgorICAgICAqIFRoaXMgSUQgaXMgdXNlZCBhcyB3b3JrIHRhcmdldHMsIHVuaXF1ZSB3b3JrIElEcywgYW5kIHdoZW4gY29uZmlndXJpbmcgdHVubmVsaW5nLgorICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZS4KKyAgICAgKiBUaGlzIGNhbGwgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGF0ZSBub3IgdGhlIGludGVybmFsIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiBhIHVuaXF1ZSBub2RlIElEIGZvciB0aGlzIGNvbXBvbmVudCBvciBjb21wb25lbnQgaW50ZXJmYWNlIGluc3RhbmNlLgorICAgICAqLworICAgIHZpcnR1YWwgYzJfbm9kZV9pZF90IGdldElkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUXVlcmllcyBhIHNldCBvZiBwYXJhbWV0ZXJzIGZyb20gdGhlIGNvbXBvbmVudCBvciBpbnRlcmZhY2Ugb2JqZWN0LgorICAgICAqIFF1ZXJ5aW5nIGlzIHBlcmZvcm1lZCBhdCBiZXN0IGVmZm9ydDogdGhlIGNvbXBvbmVudCBTSEFMTCBxdWVyeSBhbGwgc3VwcG9ydGVkIHBhcmFtZXRlcnMgYW5kCisgICAgICogc2tpcCB1bnN1cHBvcnRlZCBvbmVzLCBoZWFwIGFsbG9jYXRlZCBwYXJhbWV0ZXJzIHRoYXQgY291bGQgbm90IGJlIGFsbG9jYXRlZCBvciBwYXJhbWV0ZXJzCisgICAgICogdGhhdCBjb3VsZCBub3QgYmUgcXVlcmllZCB3aXRob3V0IGJsb2NraW5nLiBBbnkgZXJyb3JzIGFyZSBjb21tdW5pY2F0ZWQgaW4gdGhlIHJldHVybiB2YWx1ZS4KKyAgICAgKiBBZGRpdGlvbmFsbHksIHByZWFsbG9jYXRlZCAoZS5nLiBzdGFjaykgcGFyYW1ldGVycyB0aGF0IGNvdWxkIG5vdCBiZSBxdWVyaWVkIGFyZSBpbnZhbGlkYXRlZC4KKyAgICAgKiBJbnZhbGlkIG9yIGJsb2NraW5nIHBhcmFtZXRlcnMgdG8gYmUgYWxsb2NhdGVkIG9uIHRoZSBoZWFwIGFyZSBvbWl0dGVkIGZyb20gdGhlIHJlc3VsdC4KKyAgICAgKgorICAgICAqIFxub3RlIFBhcmFtZXRlciB2YWx1ZXMgZG8gbm90IGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgcXVlcnkuCisgICAgICoKKyAgICAgKiBcdG9kbyBUaGlzIG1ldGhvZCBjYW5ub3QgYmUgdXNlZCB0byBxdWVyeSBpbmZvLWJ1ZmZlcnMuIElzIHRoYXQgYSBwcm9ibGVtPworICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZSBleGNlcHQKKyAgICAgKiByZWxlYXNlZC4KKyAgICAgKiBUaGlzIGNhbGwgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGF0ZSBub3IgdGhlIGludGVybmFsIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyBhIHZhcmlhYmxlIGJsb2NraW5nIGJlaGF2aW9yIGJhc2VkIG9uIHN0YXRlLgorICAgICAqIEluIHRoZSBzdG9wcGVkIHN0YXRlIHRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqIEluIHRoZSBydW5uaW5nIHN0YXRlcyB0aGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHBhcmFtW2luLG91dF0gc3RhY2tQYXJhbXMgIGEgbGlzdCBvZiBwYXJhbXMgcXVlcmllZC4gVGhlc2UgYXJlIGluaXRpYWxpemVkIHNwZWNpZmljIHRvIGVhY2gKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZzsgZS5nLiBzaXplIGFuZCBpbmRleCBhcmUgc2V0IGFuZCByZXN0IG9mIHRoZSBtZW1iZXJzIGFyZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcmVkLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbm90ZSBGbGV4aWJsZSBzZXR0aW5ncyB0aGF0IGFyZSBvZiBpbmNvcnJlY3Qgc2l6ZSB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVkLgorICAgICAqIFxwYXJhbVtpbl0gaGVhcFBhcmFtSW5kaWNlcyBhIHZlY3RvciBvZiBwYXJhbSBpbmRpY2VzIGZvciBwYXJhbXMgdG8gYmUgcXVlcmllZCBhbmQgcmV0dXJuZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIGhlYXAuIFRoZXNlIHBhcmFtZXRlcnMgd2lsbCBiZSByZXR1cm5lZCBpbiBoZWFwUGFyYW1zLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnN1cHBvcnRlZCBwYXJhbSBpbmRpY2VzIHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKiBccGFyYW1baW5dIG1heUJsb2NrICAgICAgICAgaWYgdHJ1ZSAoQzJfTUFZX0JMT0NLKSwgaW1wbGVtZW50YXRpb24gbWF5IG1vbWVudGFyaWx5IGJsb2NrLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgKEMyX0RPTlRfQkxPQ0spLCBpdCBtdXN0IGJlICJub24tYmxvY2tpbmciLgorICAgICAqIFxwYXJhbVtvdXRdIGhlYXBQYXJhbXMgICAgICBhIGxpc3Qgb2YgcGFyYW1zIHdoZXJlIHRvIHdoaWNoIHRoZSBzdXBwb3J0ZWQgaGVhcCBwYXJhbWV0ZXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgYXBwZW5kZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIGhlYXBQYXJhbUluZGljZXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICBhbGwgcGFyYW1ldGVycyBjb3VsZCBiZSBxdWVyaWVkCisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHF1ZXJpZWQsIGJ1dCBzb21lIHBhcmFtZXRlcnMgd2VyZSBub3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgcmVsZWFzZWQgY29tcG9uZW50IHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGEgc3VwcG9ydGVkIHBhcmFtZXRlcgorICAgICAqIFxyZXR2YWwgQzJfQkxPQ0tJTkcgIHRoZSBvcGVyYXRpb24gbXVzdCBibG9jayB0byBjb21wbGV0ZSBidXQgbWF5QmxvY2sgaXMgZmFsc2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgcXVlcnkgdGhlIHBhcmFtZXRlcnMgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJ1bm5pbmcgc3RhdGUpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgcXVlcnlpbmcgb2YgdGhlIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3ZiKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFNldHMgYSBzZXQgb2YgcGFyYW1ldGVycyBmb3IgdGhlIGNvbXBvbmVudCBvciBpbnRlcmZhY2Ugb2JqZWN0LgorICAgICAqCisgICAgICogVHVuaW5nIGlzIHBlcmZvcm1lZCBhdCBiZXN0IGVmZm9ydDogdGhlIGNvbXBvbmVudCBTSEFMTCBwcm9jZXNzIHRoZSBjb25maWd1cmF0aW9uIHVwZGF0ZXMgaW4KKyAgICAgKiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gfHBhcmFtc3wuIElmIGFueSBwYXJhbWV0ZXIgdXBkYXRlIGZhaWxzLCB0aGUgY29tcG9uZW50IHNoYWxsCisgICAgICogY29tbXVuaWNhdGUgdGhlIGZhaWx1cmUgaW4gdGhlIHJldHVybiB2YWx1ZSBhbmQgaW4gfGZhaWx1cmVzfCwgYW5kIHN0aWxsIHByb2Nlc3MgdGhlCisgICAgICogcmVtYWluaW5nIHBhcmFtZXRlcnMuIFVuc3VwcG9ydGVkIHBhcmFtZXRlcnMgYXJlIHNraXBwZWQsIHRob3VnaCB0aGV5IGFyZSBjb21tdW5pY2F0ZWQgaW4KKyAgICAgKiB0aGVyIHJldHVybiB2YWx1ZS4gTW9zdCBwYXJhbWV0ZXJzIGFyZSB1cGRhdGVkIGF0IGJlc3QgZWZmb3J0IC0gc3VjaCB0aGF0IGV2ZW4gaWYgY2xpZW50CisgICAgICogc3BlY2lmaWVzIGFuIHVuc3VwcG9ydGVkIHZhbHVlIGZvciBhIGZpZWxkLCB0aGUgY2xvc2VzdCBzdXBwb3J0ZWQgdmFsdWUgaXMgdXNlZC4gT24gdGhlCisgICAgICogb3RoZXIgaGFuZCwgc3RyaWN0IHBhcmFtZXRlcnMgb25seSBhY2NlcHQgc3BlY2lmaWMgdmFsdWVzIGZvciB0aGVpciBmaWVsZHMsIGFuZCBpZiB0aGUgY2xpZW50CisgICAgICogc3BlY2lmaWVzIGFuIHVuc3VwcG9ydGVkIHZhbHVlLCB0aGUgcGFyYW1ldGVyIHNldHRpbmcgc2hhbGwgZmFpbCBmb3IgdGhhdCBmaWVsZC4KKyAgICAgKiBJZiB0aGUgY2xpZW50IHRyaWVzIHRvIGNoYW5nZSB0aGUgdmFsdWUgb2YgYSBmaWVsZCB0aGF0IHJlcXVpcmVzIG1vbWVudGFyeSBibG9ja2luZyB3aXRob3V0CisgICAgICogc2V0dGluZyB8bWF5QmxvY2t8IHRvIEMyX01BWV9CTE9DSywgdGhhdCBwYXJhbWV0ZXIgc2hhbGwgYWxzbyBiZSBza2lwcGVkIGFuZCBhIHNwZWNpZmljCisgICAgICogcmV0dXJuIHZhbHVlIHNoYWxsIGJlIHVzZWQuIEZpbmFsIHZhbHVlcyBmb3IgYWxsIHBhcmFtZXRlcnMgc2V0IGFyZSBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlCisgICAgICogY2FsbGVyIGluIHxwYXJhbXN8LgorICAgICAqCisgICAgICogXG5vdGUgUGFyYW1ldGVyIHR1bmluZyBET0VTIGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgdGhlIHR1bmluZyBwYXJhbWV0ZXJzLiBFLmcuIHNvbWUgcGFyYW1ldGVyCisgICAgICogdXBkYXRlIG1heSBhbGxvdyBzb21lIHN1YnNlcXVlbnQgdmFsdWVzIGZvciBmdXJ0aGVyIHBhcmFtZXRlciB1cGRhdGVzLgorICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZSBleGNlcHQKKyAgICAgKiByZWxlYXNlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyBhIHZhcmlhYmxlIGJsb2NraW5nIGJlaGF2aW9yIGJhc2VkIG9uIHN0YXRlLgorICAgICAqIEluIHRoZSBzdG9wcGVkIHN0YXRlIHRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqIEluIHRoZSBydW5uaW5nIHN0YXRlcyB0aGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHBhcmFtW2luLG91dF0gcGFyYW1zIGEgbGlzdCBvZiBwYXJhbWV0ZXIgdXBkYXRlcy4gVGhlc2Ugd2lsbCBiZSB1cGRhdGVkIHRvIHRoZSBhY3R1YWwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlcyAodGhpcyBpcyBiZWNhdXNlIHR1bmluZyBpcyBwZXJmb3JtZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgYXQgYmVzdCBlZmZvcnQpLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBcdG9kbyBwYXJhbXMgdGhhdCBjb3VsZCBub3QgYmUgdXBkYXRlZCBhcmUgbm90IG1hcmtlZCBoZXJlLCBzbyBhcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgY29uZnVzaW5nIC0gYXJlIHRoZXkgImV4aXN0aW5nIiB2YWx1ZXMgb3IgaW50ZW5kZWQgdG8gYmUgY29uZmlndXJlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM/CisgICAgICogXHBhcmFtW2luXSBtYXlCbG9jayAgIGlmIHRydWUgKEMyX01BWV9CTE9DSyksIGltcGxlbWVudGF0aW9uIG1heSBtb21lbnRhcmlseSBibG9jay4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIChDMl9ET05UX0JMT0NLKSwgaXQgbXVzdCBiZSAibm9uLWJsb2NraW5nIi4KKyAgICAgKiBccGFyYW1bb3V0XSBmYWlsdXJlcyAgYSBsaXN0IG9mIHBhcmFtZXRlciBmYWlsdXJlcyBhbmQgb3B0aW9uYWwgZ3VpZGFuY2UKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGFsbCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LCBidXQgc29tZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgd2VyZSBub3Qgc3VwcG9ydGVkCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgc29tZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgYmVjYXVzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZXkgY29udGFpbmVkIHVuc3VwcG9ydGVkIHZhbHVlcy4gVGhlc2UgYXJlIHJldHVybmVkIGluIHxmYWlsdXJlc3wuCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIGNvbXBvbmVudCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBzb21lIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIG5vdCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSBiZWNhdXNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdGhleSBjb250YWluZWQgdW5zdXBwb3J0ZWQgdmFsdWVzLCBidXQgY291bGQgbm90IGFsbG9jYXRlIGEgZmFpbHVyZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBmb3IgdGhlbS4KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3Qgc2V0IHRoZSBwYXJhbWV0ZXJzIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBydW5uaW5nIHN0YXRlKQorICAgICAqIFxyZXR2YWwgQzJfQkxPQ0tJTkcgIHRoZSBvcGVyYXRpb24gbXVzdCBibG9jayB0byBjb21wbGV0ZSBidXQgbWF5QmxvY2sgaXMgZmFsc2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSB1cGRhdGUgb2YgdGhlIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZ192YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpID0gMDsKKworICAgIC8vIFRVTk5FTElORworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHR1bm5lbCBmcm9tIHRoaXMgY29tcG9uZW50IHRvIHRoZSB0YXJnZXQgY29tcG9uZW50LgorICAgICAqCisgICAgICogSWYgdGhlIGNvbXBvbmVudCBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCwgc3Vic2VxdWVudCB3b3JrIGl0ZW1zIHF1ZXVlZCBtYXkgaW5jbHVkZSBhCisgICAgICogdHVubmVsZWQgcGF0aCBiZXR3ZWVuIHRoZXNlIGNvbXBvbmVudHMuCisgICAgICoKKyAgICAgKiBXaGVuIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LCB0aGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgY29tcG9uZW50IHN0YXRlIGV4Y2VwdAorICAgICAqIHJlbGVhc2VkLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSB0dW5uZWwgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkCisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggdGhlIHRhcmdldCBjb21wb25lbnQgZG9lcyBub3QgZXhpc3QKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSB0aGUgdHVubmVsIGFscmVhZHkgZXhpc3RzCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdHVubmVsaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjb21wb25lbnQKKyAgICAgKiBccmV0dmFsIEMyX0NBTk5PVF9ETyB0aGUgc3BlY2lmaWMgdHVubmVsIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgcmVsZWFzZWQgY29tcG9uZW50IHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgdHVubmVsIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgdHVubmVsICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlVHVubmVsX3NtKGMyX25vZGVfaWRfdCB0YXJnZXRDb21wb25lbnQpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2VzIGEgdHVubmVsIGZyb20gdGhpcyBjb21wb25lbnQgdG8gdGhlIHRhcmdldCBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGUgcmVsZWFzZSBvZiBhIHR1bm5lbCBpcyBkZWxheWVkIHdoaWxlIHRoZXJlIGFyZSBwZW5kaW5nIHdvcmsgaXRlbXMgZm9yIHRoZSB0dW5uZWwuCisgICAgICogQWZ0ZXIgcmVsZWFzaW5nIGEgdHVubmVsLCBzdWJzZXF1ZW50IHdvcmsgaXRlbXMgcXVldWVkIE1VU1QgTk9UIGluY2x1ZGUgYSB0dW5uZWxlZAorICAgICAqIHBhdGggYmV0d2VlbiB0aGVzZSBjb21wb25lbnRzLgorICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZSBleGNlcHQKKyAgICAgKiByZWxlYXNlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgdHVubmVsIHdhcyBtYXJrZWQgZm9yIHJlbGVhc2Ugc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggdGhlIHRhcmdldCBjb21wb25lbnQgZG9lcyBub3QgZXhpc3QKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCB0aGUgdHVubmVsIGRvZXMgbm90IGV4aXN0CisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdHVubmVsaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjb21wb25lbnQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgcmVsZWFzZWQgY29tcG9uZW50IHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IG1hcmsgdGhlIHR1bm5lbCBmb3IgcmVsZWFzZSB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgcmVsZWFzZSBvZiB0aGUgdHVubmVsICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVsZWFzZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QgdGFyZ2V0Q29tcG9uZW50KSA9IDA7CisKKyAgICAvLyBSRUZMRUNUSU9OIE1FQ0hBTklTTSAoVVNFRCBGT1IgRVhURU5TSU9OKQorICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0IG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZSBleGNlcHQKKyAgICAgKiByZWxlYXNlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHBhcmFtW291dF0gcGFyYW1zIGEgdmVjdG9yIG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhpcyB2ZWN0b3IuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIGNvbXBvbmVudCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKiBjb25zdCBwYXJhbXMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhlIHF1ZXJpZWQgZmllbGRzLgorICAgICAqCisgICAgICogQ2xpZW50IFNIQUxMIHNldCB0aGUgcGFyYW1ldGVyLWZpZWxkIHNwZWNpZmllciBhbmQgdGhlIHR5cGUgb2Ygc3VwcG9ydGVkIHZhbHVlcyBxdWVyeSAoZS5nLgorICAgICAqIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzLCBvciBwb3RlbnRpYWwgc3VwcG9ydGVkIHZhbHVlcykgaW4gZmllbGRzLgorICAgICAqIFVwb24gcmV0dXJuIHRoZSBjb21wb25lbnQgU0hBTEwgZmlsbCBpbiB0aGUgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhlIGZpZWxkcyBsaXN0ZWQgYXMgd2VsbAorICAgICAqIGFzIGEgc3RhdHVzIGZvciBlYWNoIGZpZWxkLiBDb21wb25lbnQgc2hhbGwgcHJvY2VzcyBhbGwgZmllbGRzIHF1ZXJpZWQgZXZlbiBpZiBzb21lIHF1ZXJpZXMKKyAgICAgKiBmYWlsLgorICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZSBleGNlcHQKKyAgICAgKiByZWxlYXNlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyBhIHZhcmlhYmxlIGJsb2NraW5nIGJlaGF2aW9yIGJhc2VkIG9uIHN0YXRlLgorICAgICAqIEluIHRoZSBzdG9wcGVkIHN0YXRlIHRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqIEluIHRoZSBydW5uaW5nIHN0YXRlcyB0aGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHBhcmFtW2luIG91dF0gZmllbGRzIGEgdmVjdG9yIG9mIGZpZWxkcyBkZXNjcmlwdG9yIHN0cnVjdHVyZXMuCisgICAgICogXHBhcmFtW2luXSBtYXlCbG9jayAgIGlmIHRydWUgKEMyX01BWV9CTE9DSyksIGltcGxlbWVudGF0aW9uIG1heSBtb21lbnRhcmlseSBibG9jay4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIChDMl9ET05UX0JMT0NLKSwgaXQgbXVzdCBiZSAibm9uLWJsb2NraW5nIi4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgcmVsZWFzZWQgY29tcG9uZW50IHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGF0IGxlYXN0IG9uZSBmaWVsZCB3YXMgbm90IHJlY29nbml6ZWQgYXMgYSBjb21wb25lbnQgZmllbGQKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgcXVlcnkgc3VwcG9ydGVkIHZhbHVlcyB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcnVubmluZyBzdGF0ZSkKKyAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICB0aGUgb3BlcmF0aW9uIG11c3QgYmxvY2sgdG8gY29tcGxldGUgYnV0IG1heUJsb2NrIGlzIGZhbHNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgb3BlcmF0aW9uIGZyb20gY29tcGxldGluZyAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIH5DMkNvbXBvbmVudEludGVyZmFjZSgpID0gZGVmYXVsdDsKK307CisKK2NsYXNzIEMyQ29tcG9uZW50IHsKK3B1YmxpYzoKKyAgICBjbGFzcyBMaXN0ZW5lciB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrRG9uZV9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uVHJpcHBlZF9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHNldHRpbmdSZXN1bHQpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcl9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGVycm9yQ29kZSkgPSAwOworCisgICAgICAgIC8vIHZpcnR1YWwgdm9pZCBvblR1bm5lbFJlbGVhc2VkKDxmcm9tPiwgPHRvPikgPSAwOworCisgICAgICAgIC8vIHZpcnR1YWwgdm9pZCBvbkNvbXBvbmVudFJlbGVhc2VkKDxpZD4pID0gMDsKKworICAgICAgICB2aXJ0dWFsIH5MaXN0ZW5lcigpID0gZGVmYXVsdDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGlzdGVuZXIgZm9yIHRoaXMgY29tcG9uZW50CisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbGwgc3RhdGVzIGV4Y2VwdCByZWxlYXNlZC4KKyAgICAgKiBUaGUgbGlzdGVuZXIgY2FuIG9ubHkgYmUgc2V0IHRvIG5vbi1udWxsIHZhbHVlIGluIHN0b3BwZWQgc3RhdGUgKHRoYXQgZG9lcyBub3QgaW5jbHVkZQorICAgICAqIHRyaXBwZWQgb3IgZXJyb3IpLiBJdCBjYW4gYmUgc2V0IHRvIG51bGxwdHIgaW4gYm90aCBzdG9wcGVkIGFuZCBydW5uaW5nIHN0YXRlcy4KKyAgICAgKiBDb21wb25lbnRzIG9ubHkgdXNlIHRoZSBsaXN0ZW5lciBpbiBydW5uaW5nIHN0YXRlLgorICAgICAqCisgICAgICogSWYgbGlzdGVuZXIgaXMgbnVsbHB0ciwgdGhlIGNvbXBvbmVudCBTSEFMTCBndWFyYW50ZWUgdGhhdCBubyBtb3JlIGxpc3RlbmVyIGNhbGxiYWNrcyBhcmUKKyAgICAgKiBkb25lIHRvIHRoZSBvcmlnaW5hbCBsaXN0ZW5lciBvbmNlIHRoaXMgbWV0aG9kIHJldHVybnMuIChBbnkgcGVuZGluZyBsaXN0ZW5lciBjYWxsYmFja3Mgd2lsbAorICAgICAqIG5lZWQgdG8gYmUgY29tcGxldGVkIGR1cmluZyB0aGlzIGNhbGwgLSBoZW5jZSB0aGlzIGNhbGwgbWF5IGJlIHRlbXBvcmFyaWx5IGJsb2NraW5nLikKKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyBhIHZhcmlhYmxlIGJsb2NraW5nIGJlaGF2aW9yIGJhc2VkIG9uIHN0YXRlLgorICAgICAqIEluIHRoZSBzdG9wcGVkIHN0YXRlIHRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqIEluIHRoZSBydW5uaW5nIHN0YXRlcyB0aGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogQ29tcG9uZW50IFNIQUxMIGhhbmRsZSBsaXN0ZW5lciBub3RpZmljYXRpb25zIGZyb20gdGhlIHNhbWUgdGhyZWFkICh0aGUgdGhyZWFkIHVzZWQgaXMKKyAgICAgKiBhdCB0aGUgY29tcG9uZW50J3MgZGlzY3JldGlvbi4pCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGlzIGNvdWxkIGFsc28gYmUgYWNjb21wbGlzaGVkIGJ5IHBhc3NpbmcgYSB3ZWFrX3B0ciB0byBhIGNvbXBvbmVudC1zcGVjaWZpYyBsaXN0ZW5lcgorICAgICAqIGhlcmUgYW5kIHJlcXVpcmluZyB0aGUgY2xpZW50IHRvIGFsd2F5cyBwcm9tb3RlIHRoZSB3ZWFrX3B0ciBiZWZvcmUgYW55IGNhbGxiYWNrLiBUaGlzIHdvdWxkCisgICAgICogcHV0IHRoZSBidXJkZW4gb24gdGhlIGNsaWVudCB0byBjbGVhciB0aGUgbGlzdGVuZXIgLSB3YWl0IGZvciBpdHMgZGVsZXRpb24gLSBhdCB3aGljaCBwb2ludAorICAgICAqIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBubyBtb3JlIGxpc3RlbmVyIGNhbGxiYWNrcyB3aWxsIG9jY3VyLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBsaXN0ZW5lciB0aGUgY29tcG9uZW50IGxpc3RlbmVyIG9iamVjdAorICAgICAqIFxwYXJhbVtpbl0gbWF5QmxvY2sgaWYgdHJ1ZSAoQzJfTUFZX0JMT0NLKSwgaW1wbGVtZW50YXRpb24gbWF5IG1vbWVudGFyaWx5IGJsb2NrLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIChDMl9ET05UX0JMT0NLKSwgaXQgbXVzdCBiZSAibm9uLWJsb2NraW5nIi4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIGF0dGVtcHRpbmcgdG8gY2hhbmdlIHRoZSBsaXN0ZW5lciBpbiB0aGUgcnVubmluZyBzdGF0ZSB0byBhIG5vbi1udWxsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKHVzZXIgZXJyb3IpLCBvciBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIHN0YXRlCisgICAgICogXHJldHZhbCBDMl9CTE9DS0lORyAgdGhlIG9wZXJhdGlvbiBtdXN0IGJsb2NrIHRvIGNvbXBsZXRlIGJ1dCBtYXlCbG9jayBpcyBmYWxzZQorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGxpc3RlbmVyIHdhcyB1cGRhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHNldExpc3RlbmVyX3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiAmbGlzdGVuZXIsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spID0gMDsKKworICAgIC8vLyBjb21wb25lbnQgZG9tYWluIChlLmcuIGF1ZGlvIG9yIHZpZGVvKQorICAgIGVudW0gZG9tYWluX3QgOiB1aW50MzJfdDsKKworICAgIC8vLyBjb21wb25lbnQga2luZCAoZS5nLiBlbmNvZGVyLCBkZWNvZGVyIG9yIGZpbHRlcikKKyAgICBlbnVtIGtpbmRfdCA6IHVpbnQzMl90OworCisgICAgLy8vIGNvbXBvbmVudCByYW5rLiBUaGlzIG51bWJlciBpcyB1c2VkIHRvIGRldGVybWluZSBjb21wb25lbnQgb3JkZXJpbmcgKHRoZSBsb3dlciB0aGUgc29vbmVyKQorICAgIC8vLyBpbiB0aGUgY29tcG9uZW50IGxpc3QuCisgICAgdHlwZWRlZiB1aW50MzJfdCByYW5rX3Q7CisKKyAgICAvLy8gY29tcG9uZW50IGF0dHJpYnV0ZXMKKyAgICBlbnVtIGF0dHJpYl90IDogdWludDY0X3Q7CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCBhIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgVHJhaXRzIHsKKyAgICAvLyBwdWJsaWM6CisgICAgICAgIEMyU3RyaW5nIG5hbWU7IC8vLzwgbmFtZSBvZiB0aGUgY29tcG9uZW50CisgICAgICAgIGRvbWFpbl90IGRvbWFpbjsgLy8vPCBjb21wb25lbnQgZG9tYWluCisgICAgICAgIGtpbmRfdCBraW5kOyAvLy88IGNvbXBvbmVudCBraW5kCisgICAgICAgIHJhbmtfdCByYW5rOyAvLy88IGNvbXBvbmVudCByYW5rCisgICAgICAgIEMyU3RyaW5nIG1lZGlhVHlwZTsgLy8vPCBtZWRpYSB0eXBlIHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50CisgICAgICAgIEMyU3RyaW5nIG93bmVyOyAvLy88IG5hbWUgb2YgdGhlIGNvbXBvbmVudCBzdG9yZSBvd25pbmcgdGhpcyBjb21wb25lbnQKKworICAgICAgICAvKioKKyAgICAgICAgICogbmFtZSBhbGlhcyhlcykgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgICAgICAgICAqIFxub3RlIE11bHRpcGxlIGNvbXBvbmVudHMgY2FuIGhhdmUgdGhlIHNhbWUgYWxpYXMgYXMgbG9uZyBhcyB0aGVpciBtZWRpYS10eXBlIGRpZmZlcnMuCisgICAgICAgICAqLworICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gYWxpYXNlczsgLy8vPCBuYW1lIGFsaWFzZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyAgICB9OworCisgICAgLy8gTUVUSE9EUyBBVkFJTEFCTEUgV0hFTiBSVU5OSU5HCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAvKioKKyAgICAgKiBRdWV1ZXMgdXAgd29yayBmb3IgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIHJ1bm5pbmcgKGluY2x1ZGluZyB0cmlwcGVkIGFuZCBlcnJvcikgc3RhdGVzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxIG1zCisgICAgICoKKyAgICAgKiBJdCBpcyBhY2NlcHRhYmxlIGZvciB0aGlzIG1ldGhvZCB0byByZXR1cm4gT0sgYW5kIHJldHVybiBhbiBlcnJvciB2YWx1ZSB1c2luZyB0aGUKKyAgICAgKiBvbldvcmtEb25lKCkgY2FsbGJhY2suCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgd29yayB3YXMgc3VjY2Vzc2Z1bGx5IHF1ZXVlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIHNvbWUgY29tcG9uZW50KHMpIGluIHRoZSB3b3JrIGRvKGVzKSBub3QgZXhpc3QKKyAgICAgKiBccmV0dmFsIEMyX0NBTk5PVF9ETyB0aGUgY29tcG9uZW50cyBhcmUgbm90IHR1bm5lbGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHN0b3BwZWQgb3IgcmVsZWFzZWQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBxdWV1ZSB0aGUgd29yaworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgcXVldWluZyB0aGUgd29yayAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXVlX25iKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBBbm5vdW5jZXMgYSB3b3JrIHRvIGJlIHF1ZXVlZCBsYXRlciBmb3IgdGhlIGNvbXBvbmVudC4gVGhpcyByZXNlcnZlcyBhIHNsb3QgZm9yIHRoZSBxdWV1ZQorICAgICAqIHRvIGVuc3VyZSBjb3JyZWN0IHdvcmsgb3JkZXJpbmcgZXZlbiBpZiB0aGUgd29yayBpcyBxdWV1ZWQgbGF0ZXIuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCBhbmQgZXJyb3IpIHN0YXRlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMSBtcworICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHdvcmsgYW5ub3VuY2VtZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSByZWNvcmRlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIHNvbWUgY29tcG9uZW50KHMpIGluIHRoZSB3b3JrIG91dGxpbmUgZG8oZXMpIG5vdCBleGlzdAorICAgICAqIFxyZXR2YWwgQzJfQ0FOTk9UX0RPIHRoZSBjb21wb25lbnRlcyBhcmUgbm90IHR1bm5lbGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHN0b3BwZWQgb3IgcmVsZWFzZWQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byByZWNvcmQgdGhlIHdvcmsgYW5ub3VuY2VtZW50CisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCByZWNvcmRpbmcgdGhlIGFubm91bmNlbWVudCAodW5leHBlY3RlZCkKKyAgICAgKgorICAgICAqIFx0b2RvIENhbiB0aGlzIGJlIHJvbGxlZCBpbnRvIHF1ZXVlX25iPworICAgICAqIFx0b2RvIEV4cG9zZSBuZXh0IHdvcmsgaXRlbSBmb3IgZWFjaCBjb21wb25lbnQgdG8gZGV0ZWN0IHN0YWxscworICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgYW5ub3VuY2VfbmIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJXb3JrT3V0bGluZT4gJml0ZW1zKSA9IDA7CisKKyAgICBlbnVtIGZsdXNoX21vZGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8vIGZsdXNoIHdvcmsgZnJvbSB0aGlzIGNvbXBvbmVudCBvbmx5CisgICAgICAgIEZMVVNIX0NPTVBPTkVOVCwKKworICAgICAgICAvLy8gZmx1c2ggd29yayBmcm9tIHRoaXMgY29tcG9uZW50IGFuZCBhbGwgY29tcG9uZW50cyBjb25uZWN0ZWQgZG93bnN0cmVhbSBmcm9tIGl0IHZpYQorICAgICAgICAvLy8gdHVubmVsaW5nCisgICAgICAgIEZMVVNIX0NIQUlOID0gKDEgPDwgMTYpLAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBEaXNjYXJkcyBhbmQgYWJhbmRvbnMgYW55IHBlbmRpbmcgd29yayBmb3IgdGhlIGNvbXBvbmVudCwgYW5kIG9wdGlvbmFsbHkgYW55IGNvbXBvbmVudAorICAgICAqIGRvd25zdHJlYW0uCisgICAgICoKKyAgICAgKiBcdG9kbyBkZWZpbmUgdGhpczogd2UgY291bGQgZmx1c2ggYWxsIHdvcmsgYmVmb3JlIGxhc3QgaXRlbSBxdWV1ZWQgZm9yIGNvbXBvbmVudCBhY3Jvc3MgYWxsCisgICAgICogICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMgbGlua2VkIHRvIHRoaXM7IGZsdXNoIG9ubHkgd29yayBpdGVtcyB0aGF0IGFyZSBxdWV1ZWQgdG8gdGhpcworICAgICAqICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQKKyAgICAgKiBcdG9kbyByZXR1cm4gd29yayAjIG9mIGxhc3QgZmx1c2hlZCBpdGVtOyBvciBhbGwgZmx1c2hlZCAoYnV0IG5vdCByZXR1cm5lZCBpdGVtcykKKyAgICAgKiBcdG9kbyB3ZSBjb3VsZCBtYWtlIGZsdXNoIHRha2UgYSB3b3JrIGl0ZW0gYW5kIGZsdXNoIGFsbCB3b3JrIGJlZm9yZS9hZnRlciB0aGF0IGl0ZW0gdG8gYWxsb3cKKyAgICAgKiAgICAgICBUQkQgKHNsaWNpbmcvc2Vlaz8pCisgICAgICogXHRvZG8gd2UgY291bGQgc2ltcGx5IHRha2UgYSBsaXN0IG9mIG51bWJlcnMgYW5kIGZsdXNoIHRob3NlLi4uIHRoaXMgaXMgYmFkIGZvciBkZWNvZGVycworICAgICAqICAgICAgIGFsc28sIHdoYXQgd291bGQgaGFwcGVuIHRvIGZpbmUgZ3JhZGUgcmVmZXJlbmNlcz8KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIHJ1bm5pbmcgKGluY2x1ZGluZyB0cmlwcGVkIGFuZCBlcnJvcikgc3RhdGVzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgbXVzdCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFdvcmsgdGhhdCBjb3VsZCBiZSBpbW1lZGlhdGVseSBhYmFuZG9uZWQvZGlzY2FyZGVkIFNIQUxMIGJlIHJldHVybmVkIGluIHxmbHVzaGVkV29ya3w7IHRoaXMKKyAgICAgKiBjYW4gYmUgZG9uZSBpbiBhbiBhcmJpdHJhcnkgb3JkZXIuCisgICAgICoKKyAgICAgKiBXb3JrIHRoYXQgY291bGQgbm90IGJlIGFiYW5kb25lZCBvciBkaXNjYXJkZWQgaW1tZWRpYXRlbHkgU0hBTEwgYmUgbWFya2VkIHRvIGJlCisgICAgICogZGlzY2FyZGVkIGF0IHRoZSBlYXJsaWVzdCBvcHBvcnR1bml0eSwgYW5kIFNIQUxMIGJlIHJldHVybmVkIHZpYSB0aGUgb25Xb3JrRG9uZSgpIGNhbGxiYWNrLgorICAgICAqIFRoaXMgc2hhbGwgYmUgY29tcGxldGVkIHdpdGhpbiA1MDBtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtb2RlIGZsdXNoIG1vZGUKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGZsdXNoZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgc3RvcHBlZCBvciByZWxlYXNlZCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgZmx1c2ggY291bGQgbm90IGJlIGNvbXBsZXRlZCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBmbHVzaGluZyBmcm9tIGNvbXBsZXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmbHVzaF9zbShmbHVzaF9tb2RlX3QgbW9kZSwgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspID0gMDsKKworICAgIGVudW0gZHJhaW5fbW9kZV90IDogdWludDMyX3QgeworICAgICAgICAvLy8gZHJhaW4gY29tcG9uZW50IG9ubHkgYW5kIGFkZCBhbiAiZW5kLW9mLXN0cmVhbSIgbWFya2VyLiBDb21wb25lbnQgc2hhbGwgcHJvY2VzcyBhbGwKKyAgICAgICAgLy8vIHF1ZXVlZCB3b3JrIGFuZCBjb21wbGV0ZSB0aGUgY3VycmVudCBzdHJlYW0uIElmIG5ldyBpbnB1dCBpcyByZWNlaXZlZCwgaXQgc2hhbGwgc3RhcnQKKyAgICAgICAgLy8vIGEgbmV3IHN0cmVhbS4gXHRvZG8gZGVmaW5lIHdoYXQgYSBzdHJlYW0gaXMuCisgICAgICAgIERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywKKyAgICAgICAgLy8vIGRyYWluIGNvbXBvbmVudCB3aXRob3V0IHNldHRpbmcgImVuZC1vZi1zdHJlYW0iIG1hcmtlci4gQ29tcG9uZW50IHNoYWxsIHByb2Nlc3MgYWxsCisgICAgICAgIC8vLyBxdWV1ZWQgd29yayBidXQgc2hhbGwgZXhwZWN0IG1vcmUgd29yayBpdGVtcyBmb3IgdGhlIHNhbWUgc3RyZWFtLgorICAgICAgICBEUkFJTl9DT01QT05FTlRfTk9fRU9TID0gKDEgPDwgMCksCisKKyAgICAgICAgLy8vIG1hcmtzIHRoZSBsYXN0IHdvcmsgaXRlbSB3aXRoIGEgcGVyc2lzdGVudCAiZW5kLW9mLXN0cmVhbSIgbWFya2VyIHRoYXQgd2lsbCBkcmFpbgorICAgICAgICAvLy8gZG93bnN0cmVhbSBjb21wb25lbnRzCisgICAgICAgIC8vLyBcdG9kbyB0aGlzIG1heSBjb25mdXNlIHdvcmstb3JkZXJpbmcgZG93bnN0cmVhbQorICAgICAgICBEUkFJTl9DSEFJTiA9ICgxIDw8IDE2KSwKKworICAgICAgICAvKioKKyAgICAgICAgICogXHRvZG8gZGVmaW5lIHRoaXM7IHdlIGNvdWxkIHBsYWNlIEVPUyB0byBhbGwgdXBzdHJlYW0gY29tcG9uZW50cywganVzdCB0aGlzIGNvbXBvbmVudCwgb3IKKyAgICAgICAgICogICAgICAgYWxsIHVwc3RyZWFtIGFuZCBkb3duc3RyZWFtIGNvbXBvbmVudC4KKyAgICAgICAgICogXHRvZG8gc2hvdWxkIEVPUyBjYXJyeSBvdmVyIHRvIGRvd25zdHJlYW0gY29tcG9uZW50cz8KKyAgICAgICAgICovCisgICAgfTsKKworICAgIC8qKgorICAgICAqIERyYWlucyB0aGUgY29tcG9uZW50LCBhbmQgb3B0aW9uYWxseSBkb3duc3RyZWFtIGNvbXBvbmVudHMuIFRoaXMgaXMgYSBzaWduYWxsaW5nIG1ldGhvZDsKKyAgICAgKiBhcyBzdWNoIGl0IGRvZXMgbm90IHdhaXQgZm9yIGFueSB3b3JrIGNvbXBsZXRpb24uCisgICAgICoKKyAgICAgKiBNYXJrcyBsYXN0IHdvcmsgaXRlbSBhcyAiZHJhaW4tdGlsbC1oZXJlIiwgc28gY29tcG9uZW50IGlzIG5vdGlmaWVkIG5vdCB0byB3YWl0IGZvciBmdXJ0aGVyCisgICAgICogd29yayBiZWZvcmUgaXQgcHJvY2Vzc2VzIHdvcmsgYWxyZWFkeSBxdWV1ZWQuIFRoaXMgbWV0aG9kIGNhbiBhbHNvIHVzZWQgdG8gc2V0IHRoZQorICAgICAqIGVuZC1vZi1zdHJlYW0gZmxhZyBhZnRlciB3b3JrIGhhcyBiZWVuIHF1ZXVlZC4gQ2xpZW50IGNhbiBjb250aW51ZSB0byBxdWV1ZSBmdXJ0aGVyIHdvcmsKKyAgICAgKiBpbW1lZGlhdGVseSBhZnRlciB0aGlzIG1ldGhvZCByZXR1cm5zLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gcnVubmluZyAoaW5jbHVkaW5nIHRyaXBwZWQpIHN0YXRlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogV29yayB0aGF0IGlzIGNvbXBsZXRlZCBTSEFMTCBiZSByZXR1cm5lZCB2aWEgdGhlIG9uV29ya0RvbmUoKSBjYWxsYmFjay4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtb2RlIGRyYWluIG1vZGUKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBkcmFpbiByZXF1ZXN0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSByZWNvcmRlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSBzdG9wcGVkIG9yIHJlbGVhc2VkIHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHRoZSBkcmFpbiBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFx0b2RvIGRlZmluZSBzdXBwb3J0ZWQgbW9kZXMgZGlzY292ZXJ5CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGZsdXNoIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgZmx1c2hpbmcgZnJvbSBjb21wbGV0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZHJhaW5fbmIoZHJhaW5fbW9kZV90IG1vZGUpID0gMDsKKworICAgIC8vIFNUQVRFIENIQU5HRSBNRVRIT0RTCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAvKioKKyAgICAgKiBTdGFydHMgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIHN0b3BwZWQgc3RhdGUsIGFzIHdlbGwgYXMgZHVyaW5nIHRoZSB0cmlwcGVkIHN0YXRlLgorICAgICAqCisgICAgICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBDMl9PSywgdGhlIGNvbXBvbmVudCBzaGFsbCBiZSBpbiB0aGUgcnVubmluZyBzdGF0ZS4KKyAgICAgKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIEMyX0JBRF9TVEFURSBvciBDMl9EVVBMSUNBVEUsIG5vIHN0YXRlIGNoYW5nZSBpcyBleHBlY3RlZCBhcyBhCisgICAgICogcmVzcG9uc2UgdG8gdGhpcyBjYWxsLgorICAgICAqIE90aGVyd2lzZSwgdGhlIGNvbXBvbmVudCBzaGFsbCBiZSBpbiB0aGUgc3RvcHBlZCBzdGF0ZS4KKyAgICAgKgorICAgICAqIFxub3RlIElmIGEgY29tcG9uZW50IGlzIGluIHRoZSB0cmlwcGVkIHN0YXRlIGFuZCBzdGFydCgpIGlzIGNhbGxlZCB3aGlsZSB0aGUgY29tcG9uZW50CisgICAgICogY29uZmlndXJhdGlvbiBzdGlsbCByZXN1bHRzIGluIGEgdHJpcCwgc3RhcnQgc2hhbGwgc3VjY2VlZCBhbmQgYSBuZXcgb25UcmlwcGVkIGNhbGxiYWNrCisgICAgICogc2hvdWxkIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgdGhlIGNvbmZpZ3VyYXRpb24gY29uZmxpY3QgdGhhdCByZXN1bHRzIGluIHRoZSBuZXcgdHJpcC4KKyAgICAgKgorICAgICAqIFx0b2RvIFRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIHdpdGhpbiA1MDBtcy4gU2VlbXMgdGhpcyBzaG91bGQgYmUgYWJsZSB0byByZXR1cm4gcXVpY2tseSwgYXMKKyAgICAgKiB0aGVyZSBhcmUgbm8gaW1tZWRpYXRlIGd1YXJhbnRlZXMuIFRob3VnaCB0aGVyZSBhcmUgZ3VhcmFudGVlcyBmb3IgcmVzcG9uc2l2ZW5lc3MgaW1tZWRpYXRlbHkKKyAgICAgKiBhZnRlciBzdGFydCByZXR1cm5zLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBoYXMgc3RhcnRlZCAob3IgcmVzdW1lZCkgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgd2hlbiBjYWxsZWQgZHVyaW5nIGFub3RoZXIgc3RhcnQgY2FsbCBmcm9tIGFub3RoZXIgdGhyZWFkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gYW55IHN0YXRlIG90aGVyIHRoYW4gdGhlIHN0b3BwZWQgc3RhdGUgb3IgdHJpcHBlZCBzdGF0ZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgd2hlbiBjYWxsZWQgZHVyaW5nIGFub3RoZXIgc3RhdGUgY2hhbmdlIGNhbGwgZnJvbSBhbm90aGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdGhyZWFkICh1c2VyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHN0YXJ0IHRoZSBjb21wb25lbnQKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgY29tcG9uZW50IGNvdWxkIG5vdCBiZSBzdGFydGVkIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHN0YXJ0aW5nIHRoZSBjb21wb25lbnQgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdGFydCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFN0b3BzIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCkgc3RhdGUuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldHVybiB3aXRoaW5nIDUwMG1zLgorICAgICAqCisgICAgICogVXBvbiB0aGlzIGNhbGwsIGFsbCBwZW5kaW5nIHdvcmsgU0hBTEwgYmUgYWJhbmRvbmVkIGFuZCBhbGwgYnVmZmVyIHJlZmVyZW5jZXMgU0hBTEwgYmUKKyAgICAgKiByZWxlYXNlZC4KKyAgICAgKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIEMyX0JBRF9TVEFURSBvciBDMl9EVVBMSUNBVEUsIG5vIHN0YXRlIGNoYW5nZSBpcyBleHBlY3RlZCBhcyBhCisgICAgICogcmVzcG9uc2UgdG8gdGhpcyBjYWxsLgorICAgICAqIEZvciBhbGwgb3RoZXIgcmV0dXJuIHZhbHVlcywgdGhlIGNvbXBvbmVudCBzaGFsbCBiZSBpbiB0aGUgc3RvcHBlZCBzdGF0ZS4KKyAgICAgKgorICAgICAqIFx0b2RvIHNob3VsZCB0aGlzIHJldHVybiBjb21wbGV0ZWQgd29yaywgc2luY2UgY2xpZW50IHdpbGwganVzdCBmcmVlIGl0PyBQZXJoYXBzIGp1c3QgdG8KKyAgICAgKiB2ZXJpZnkgYWNjb3VudGluZy4KKyAgICAgKgorICAgICAqIFRoaXMgZG9lcyBub3QgYWx0ZXIgYW55IHNldHRpbmdzIGFuZCB0dW5pbmdzIHRoYXQgbWF5IGhhdmUgcmVzdWx0ZWQgaW4gYSB0cmlwcGVkIHN0YXRlLgorICAgICAqIChJcyB0aGlzIG1hdGVyaWFsIGdpdmVuIHRoZSBkZWZpbml0aW9uPyBQZXJoYXBzIGluIGNhc2Ugd2Ugd2FudCB0byBzdGFydCBhZ2Fpbi4pCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IGhhcyBzdGFydGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFIHdoZW4gY2FsbGVkIGR1cmluZyBhbm90aGVyIHN0b3AgY2FsbCBmcm9tIGFub3RoZXIgdGhyZWFkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gYW55IHN0YXRlIG90aGVyIHRoYW4gdGhlIHJ1bm5pbmcgc3RhdGUsIGluY2x1ZGluZyB3aGVuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIGR1cmluZyBhbm90aGVyIHN0YXRlIGNoYW5nZSBjYWxsIGZyb20gYW5vdGhlciB0aHJlYWQgKHVzZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGNvbXBvbmVudCBjb3VsZCBub3QgYmUgc3RvcHBlZCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBzdG9wcGluZyB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc3RvcCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlc2V0cyB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYWxsIChpbmNsdWRpbmcgdHJpcHBlZCkgc3RhdGVzIG90aGVyIHRoYW4gcmVsZWFzZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBkdXJpbmcgYW55IG90aGVyIGJsb2NraW5nIGNhbGwuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldHVybiB3aXRoaW5nIDUwMG1zLgorICAgICAqCisgICAgICogQWZ0ZXIgdGhpcyBjYWxsIHJldHVybnMgYWxsIHdvcmsgU0hBTEwgYmUgYWJhbmRvbmVkLCBhbGwgYnVmZmVyIHJlZmVyZW5jZXMgU0hBTEwgYmUgcmVsZWFzZWQuCisgICAgICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBDMl9CQURfU1RBVEUgb3IgQzJfRFVQTElDQVRFLCBubyBzdGF0ZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgYXMgYQorICAgICAqIHJlc3BvbnNlIHRvIHRoaXMgY2FsbC4KKyAgICAgKiBGb3IgYWxsIG90aGVyIHJldHVybiB2YWx1ZXMsIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgaW4gdGhlIHN0b3BwZWQgc3RhdGUuCisgICAgICoKKyAgICAgKiBcdG9kbyBzaG91bGQgdGhpcyByZXR1cm4gY29tcGxldGVkIHdvcmssIHNpbmNlIGNsaWVudCB3aWxsIGp1c3QgZnJlZSBpdD8gQWxzbywgaWYgaXQgdW5ibG9ja3MKKyAgICAgKiBhIHN0b3AsIHdoZXJlIHNob3VsZCBjb21wbGV0ZWQgd29yayBiZSByZXR1cm5lZD8KKyAgICAgKgorICAgICAqIFRoaXMgYnJpbmdzIHNldHRpbmdzIGJhY2sgdG8gdGhlaXIgZGVmYXVsdCAtICJndWFyYW50ZWVpbmciIG5vIHRyaXBwZWQgc3BhY2UuCisgICAgICoKKyAgICAgKiBcdG9kbyByZWNsYWltIHN1cHBvcnQgLSBpdCBzZWVtcyB0aGF0IHNpbmNlIG93bmVyc2hpcCBpcyBwYXNzZWQsIHRoaXMgd2lsbCBhbGxvdyByZWNsYWltaW5nCisgICAgICogc3R1ZmYuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IGhhcyBiZWVuIHJlc2V0CisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgd2hlbiBjYWxsZWQgZHVyaW5nIGFub3RoZXIgcmVzZXQgY2FsbCBmcm9tIGFub3RoZXIgdGhyZWFkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIHN0YXRlCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGNvbXBvbmVudCBjb3VsZCBub3QgYmUgcmVzZXQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgcmVzZXR0aW5nIHRoZSBjb21wb25lbnQgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCByZXNldCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2VzIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBzdG9wcGVkIHN0YXRlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCByZXR1cm4gd2l0aGluZyA1MDBtcy4gVXBvbiByZXR1cm4gYWxsIHJlZmVyZW5jZXMgc2hhbGwgYmUgYWJhbmRvbmVkLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiByZWxlYXNlZAorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFIHRoZSBjb21wb25lbnQgaXMgYWxyZWFkeSByZWxlYXNlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHRoZSBjb21wb25lbnQgaXMgcnVubmluZworICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBjb21wb25lbnQgY291bGQgbm90IGJlIHJlbGVhc2VkIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHJlbGVhc2luZyB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVsZWFzZSgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGludGVyZmFjZSBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYoKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5DMkNvbXBvbmVudCgpID0gZGVmYXVsdDsKK307CisKK0MyRU5VTShDMkNvbXBvbmVudDo6a2luZF90LCB1aW50MzJfdCwKKyAgICBLSU5EX09USEVSLAorICAgIEtJTkRfREVDT0RFUiwKKyAgICBLSU5EX0VOQ09ERVIKKyk7CisKK0MyRU5VTShDMkNvbXBvbmVudDo6ZG9tYWluX3QsIHVpbnQzMl90LAorICAgIERPTUFJTl9PVEhFUiwKKyAgICBET01BSU5fVklERU8sCisgICAgRE9NQUlOX0FVRElPLAorICAgIERPTUFJTl9JTUFHRQorKTsKKworY2xhc3MgQzJGcmFtZUluZm9QYXJzZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFxyZXR1cm4gdGhlIGNvbnRlbnQgdHlwZSBzdXBwb3J0ZWQgYnkgdGhpcyBpbmZvIHBhcnNlci4KKyAgICAgKgorICAgICAqIFx0b2RvIHRoaXMgbWF5IGJlIHJlZHVuZGFudAorICAgICAqLworICAgIHZpcnR1YWwgQzJTdHJpbmdMaXRlcmFsIGdldFR5cGUoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIGEgdmVjdG9yIG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXIgaW5kaWNlcyBwYXJzZWQgYnkgdGhpcyBpbmZvIHBhcnNlci4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHRvZG8gc3RpY2t5IHZzLiBub24tc3RpY2t5IHBhcmFtcz8gdGhpcyBtYXkgYmUgY29tbXVuaWNhdGVkIGJ5IHBhcmFtLXJlZmxlY3Rvci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBnZXRQYXJzZWRQYXJhbXMoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhpcyBpbmZvIHBhcnNlci4gVGhpcyBicmluZ3MgdGhpcyBwYXJzZXIgdG8gaXRzIGluaXRpYWwgc3RhdGUgYWZ0ZXIgY3JlYXRpb24uCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBpbmZvIHBhcnNlciB3YXMgcmVzZXQKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgcmVzZXQgdGhlIHBhcnNlciB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgcmVzZXR0aW5nIG9mIHRoZSBwYXJzZXIgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCByZXNldCgpIHsgcmV0dXJuIEMyX09LOyB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHBhcnNlRnJhbWUoQzJGcmFtZURhdGEgJmZyYW1lKTsKKworICAgIHZpcnR1YWwgfkMyRnJhbWVJbmZvUGFyc2VyKCkgPSBkZWZhdWx0OworfTsKKworY2xhc3MgQzJBbGxvY2F0b3JTdG9yZSB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBDMkFsbG9jYXRvcjo6aWRfdCBpZF90OworCisgICAgZW51bSA6IEMyQWxsb2NhdG9yOjppZF90IHsKKyAgICAgICAgREVGQVVMVF9MSU5FQVIsICAgICAvLy88IGJhc2ljIGxpbmVhciBhbGxvY2F0b3IgdHlwZQorICAgICAgICBERUZBVUxUX0dSQVBISUMsICAgIC8vLzwgYmFzaWMgZ3JhcGhpYyBhbGxvY2F0b3IgdHlwZQorICAgICAgICBQTEFURk9STV9TVEFSVCA9IDB4MTAsCisgICAgICAgIFZFTkRPUl9TVEFSVCAgID0gMHgxMDAsCisgICAgICAgIEJBRF9JRCAgICAgICAgID0gQzJBbGxvY2F0b3I6OkJBRF9JRCwgLy8vPCBETyBOT1QgVVNFCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHVuaXF1ZSBuYW1lIG9mIHRoaXMgYWxsb2NhdG9yIHN0b3JlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgYWxsb2NhdG9yIHN0b3JlLgorICAgICAqIFxyZXR2YWwgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgYWN0dWFsIG5hbWUuCisgICAgICovCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGFsbG9jYXRvcnMgc3VwcG9ydGVkIGJ5IHRoaXMgYWxsb2NhdG9yIHN0b3JlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIHZlY3RvciBvZiBhbGxvY2F0b3IgaW5mb3JtYXRpb24gKGFzIHNoYXJlZCBwb2ludGVycykKKyAgICAgKiBccmV0dmFsIGFuIGVtcHR5IHZlY3RvciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIHdob2xlIHZlY3Rvci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkFsbG9jYXRvcjo6VHJhaXRzPj4gbGlzdEFsbG9jYXRvcnNfbmIoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMvY3JlYXRlcyBhIHNoYXJlZCBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFRoZSBhbGxvY2F0b3IgaXMgY3JlYXRlZCBvbiBmaXJzdCB1c2UsIGFuZCB0aGUgc2FtZSBhbGxvY2F0b3IgaXMgcmV0dXJuZWQgb24gc3Vic2VxdWVudAorICAgICAqIGNvbmN1cnJlbnQgdXNlcyBpbiB0aGUgc2FtZSBwcm9jZXNzLiBUaGUgYWxsb2NhdG9yIGlzIGZyZWVkIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHJlZmVyZW5jZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gaWQgICAgICB0aGUgSUQgb2YgdGhlIGFsbG9jYXRvciB0byBjcmVhdGUuIFRoaXMgaXMgZGVmaW5lZCBieSB0aGUgc3RvcmUsIGJ1dAorICAgICAqICAgICAgICAgICAgICAgIHRoZSBJRCBvZiB0aGUgZGVmYXVsdCBsaW5lYXIgYW5kIGdyYXBoaWMgYWxsb2NhdG9ycyBpcyBmb3JtYWxpemVkLgorICAgICAqIFxwYXJhbSBhbGxvY2F0b3Igc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGNyZWF0ZWQgYWxsb2NhdG9yIGlzIHN0b3JlZC4gQ2xlYXJlZCBvbiBmYWlsdXJlCisgICAgICogICAgICAgICAgICAgICAgICBhbmQgdXBkYXRlZCBvbiBzdWNjZXNzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGFsbG9jYXRvciB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgY3JlYXRlIHRoZSBhbGxvY2F0b3Igd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSBhbGxvY2F0b3IgKHVuZXhwZWN0ZWQpCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBubyBzdWNoIGFsbG9jYXRvcgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSB0aGUgYWxsb2NhdG9yCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEFsbG9jYXRvcihpZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+KiBjb25zdCBhbGxvY2F0b3IpID0gMDsKKworICAgIHZpcnR1YWwgfkMyQWxsb2NhdG9yU3RvcmUoKSA9IGRlZmF1bHQ7Cit9OworCitjbGFzcyBDMkNvbXBvbmVudFN0b3JlIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2Ugb2JqZWN0LgorICAgICAqIFRoaXMgaXMgYSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSAnY2xhc3MnOyBob3dldmVyLCBtdWx0aXBsZQorICAgICAqIGluc3RhbmNlcyBvZiB0aGlzIGNvbXBvbmVudCBTSEFMTCBoYXZlIHRoZSBzYW1lIG5hbWUuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgc3RhdGUuIFRoaXMgY2FsbCBkb2VzIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIG5vciB0aGUKKyAgICAgKiBpbnRlcm5hbCBzdGF0ZXMgb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGNvbXBvbmVudCBvciBjb21wb25lbnQgaW50ZXJmYWNlIG9iamVjdC4KKyAgICAgKiBccmV0dmFsIGFuIGVtcHR5IHN0cmluZyBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGFjdHVhbCBuYW1lLgorICAgICAqLworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDEwMG1zLgorICAgICAqCisgICAgICogXHBhcmFtIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGNyZWF0ZQorICAgICAqIFxwYXJhbSBjb21wb25lbnQgICAgIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGNvbXBvbmVudCBpcyBzdG9yZWQuIENsZWFyZWQgb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlIGFuZCB1cGRhdGVkIG9uIHN1Y2Nlc3MuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBjcmVhdGUgdGhlIGNvbXBvbmVudCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgY3JlYXRpb24gb2YgdGhlIGNvbXBvbmVudCAodW5leHBlY3RlZCkKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIG5vIHN1Y2ggY29tcG9uZW50CisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIEMyU3RyaW5nIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCkgPSAwOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvbXBvbmVudCBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDEwMG1zLgorICAgICAqCisgICAgICogXHBhcmFtIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgY29tcG9uZW50IGludGVyZmFjZSB0byBjcmVhdGUKKyAgICAgKiBccGFyYW0gaW50ZXJmYWNlICAgICBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgY3JlYXRlZCBpbnRlcmZhY2UgaXMgc3RvcmVkCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IGludGVyZmFjZSB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgY3JlYXRlIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlIHdpdGhpbiB0aGUgdGltZSBsaW1pdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBubyBzdWNoIGNvbXBvbmVudCBpbnRlcmZhY2UKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UKKyAgICAgKgorICAgICAqIFx0b2RvIERvIHdlIG5lZWQgYW4gaW50ZXJmYWNlLCBvciBjb3VsZCB0aGlzIGp1c3QgYmUgYSBjb21wb25lbnQgdGhhdCBpcyBuZXZlciBzdGFydGVkPworICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNvbXBvbmVudHMgc3VwcG9ydGVkIGJ5IHRoaXMgY29tcG9uZW50IHN0b3JlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCByZXR1cm4gd2l0aGluIDUwMG1zLgorICAgICAqCisgICAgICogXHJldHZhbCB2ZWN0b3Igb2YgY29tcG9uZW50IGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PiBsaXN0Q29tcG9uZW50cygpID0gMDsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVUSUxJVFkgTUVUSE9EUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gb24tZGVtYW5kIGJ1ZmZlciBsYXlvdXQgY29udmVyc2lvbiAoc3dpenpsaW5nKQorICAgIC8vCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb3B5QnVmZmVyKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gc3JjLCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiBkc3QpID0gMDsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENPTkZJR1VSQVRJT04gQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gZS5nLiBmb3IgZ2xvYmFsIHNldHRpbmdzIChzeXN0ZW0td2lkZSBzdHJpZGUsIGV0Yy4pCisKKyAgICAvKioKKyAgICAgKiBRdWVyaWVzIGEgc2V0IG9mIHN5c3RlbS13aWRlIHBhcmFtZXRlcnMuCisgICAgICogUXVlcnlpbmcgaXMgcGVyZm9ybWVkIGF0IGJlc3QgZWZmb3J0OiB0aGUgc3RvcmUgU0hBTEwgcXVlcnkgYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFuZAorICAgICAqIHNraXAgdW5zdXBwb3J0ZWQgb25lcywgb3IgaGVhcCBhbGxvY2F0ZWQgcGFyYW1ldGVycyB0aGF0IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuIEFueSBlcnJvcnMKKyAgICAgKiBhcmUgY29tbXVuaWNhdGVkIGluIHRoZSByZXR1cm4gdmFsdWUuIEFkZGl0aW9uYWxseSwgcHJlYWxsb2NhdGVkIChlLmcuIHN0YWNrKSBwYXJhbWV0ZXJzIHRoYXQKKyAgICAgKiBjb3VsZCBub3QgYmUgcXVlcmllZCBhcmUgaW52YWxpZGF0ZWQuIFBhcmFtZXRlcnMgdG8gYmUgYWxsb2NhdGVkIG9uIHRoZSBoZWFwIGFyZSBvbWl0dGVkIGZyb20KKyAgICAgKiB0aGUgcmVzdWx0LgorICAgICAqCisgICAgICogXG5vdGUgUGFyYW1ldGVyIHZhbHVlcyBkbyBub3QgZGVwZW5kIG9uIHRoZSBvcmRlciBvZiBxdWVyeS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gc3RhY2tQYXJhbXMgICBhIGxpc3Qgb2YgcGFyYW1zIHF1ZXJpZWQuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBzcGVjaWZpYyB0byBlYWNoCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc2V0dGluZzsgZS5nLiBzaXplIGFuZCBpbmRleCBhcmUgc2V0IGFuZCByZXN0IG9mIHRoZSBtZW1iZXJzIGFyZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNsZWFyZWQuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgTk9URTogRmxleGlibGUgc2V0dGluZ3MgdGhhdCBhcmUgb2YgaW5jb3JyZWN0IHNpemUgd2lsbCBiZSBpbnZhbGlkYXRlZC4KKyAgICAgKiBccGFyYW0gaGVhcFBhcmFtSW5kaWNlcyBhIHZlY3RvciBvZiBwYXJhbSBpbmRpY2VzIGZvciBwYXJhbXMgdG8gYmUgcXVlcmllZCBhbmQgcmV0dXJuZWQgb24gdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaGVhcC4gVGhlc2UgcGFyYW1ldGVycyB3aWxsIGJlIHJldHVybmVkIGluIGhlYXBQYXJhbXMuIFVuc3VwcG9ydGVkIHBhcmFtCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaW5kaWNlcyB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogXHBhcmFtIGhlYXBQYXJhbXMgICAgYSBsaXN0IG9mIHBhcmFtcyB3aGVyZSB0byB3aGljaCB0aGUgc3VwcG9ydGVkIGhlYXAgcGFyYW1ldGVycyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYXBwZW5kZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIGhlYXBQYXJhbUluZGljZXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICBhbGwgcGFyYW1ldGVycyBjb3VsZCBiZSBxdWVyaWVkCisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHF1ZXJpZWQsIGJ1dCBzb21lIHBhcmFtZXRlcnMgd2VyZSBub3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhIHN1cHBvcnRlZCBwYXJhbWV0ZXIKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBxdWVyeWluZyBvZiB0aGUgcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlfc20oCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogU2V0cyBhIHNldCBvZiBzeXN0ZW0td2lkZSBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogXG5vdGUgVGhlcmUgYXJlIG5vIHNldHRhYmxlIHN5c3RlbS13aWRlIHBhcmFtZXRlcnMgZGVmaW5lZCB0aHVzIGZhciwgYnV0IG1heSBiZSBhZGRlZCBpbiB0aGUKKyAgICAgKiBmdXR1cmUuCisgICAgICoKKyAgICAgKiBUdW5pbmcgaXMgcGVyZm9ybWVkIGF0IGJlc3QgZWZmb3J0OiB0aGUgc3RvcmUgU0hBTEwgdXBkYXRlIGFsbCBzdXBwb3J0ZWQgY29uZmlndXJhdGlvbiBhdAorICAgICAqIGJlc3QgZWZmb3J0ICh1bmxlc3MgY29uZmlndXJlZCBvdGhlcndpc2UpIGFuZCBza2lwIHVuc3VwcG9ydGVkIG9uZXMuIEFueSBlcnJvcnMgYXJlCisgICAgICogY29tbXVuaWNhdGVkIGluIHRoZSByZXR1cm4gdmFsdWUgYW5kIGluIHxmYWlsdXJlc3wuCisgICAgICoKKyAgICAgKiBcbm90ZSBQYXJhbWV0ZXIgdHVuaW5nIERPRVMgZGVwZW5kIG9uIHRoZSBvcmRlciBvZiB0aGUgdHVuaW5nIHBhcmFtZXRlcnMuIEUuZy4gc29tZSBwYXJhbWV0ZXIKKyAgICAgKiB1cGRhdGUgbWF5IGFsbG93IHNvbWUgc3Vic2VxdWVudCBwYXJhbWV0ZXIgdXBkYXRlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbXMgICAgICAgIGEgbGlzdCBvZiBwYXJhbWV0ZXIgdXBkYXRlcy4gVGhlc2Ugd2lsbCBiZSB1cGRhdGVkIHRvIHRoZSBhY3R1YWwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgdmFsdWVzIGFmdGVyIHRoZSB1cGRhdGVzICh0aGlzIGlzIGJlY2F1c2UgdHVuaW5nIGlzIHBlcmZvcm1lZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGF0IGJlc3QgZWZmb3J0KS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBcdG9kbyBwYXJhbXMgdGhhdCBjb3VsZCBub3QgYmUgdXBkYXRlZCBhcmUgbm90IG1hcmtlZCBoZXJlLCBzbyBhcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjb25mdXNpbmcgLSBhcmUgdGhleSAiZXhpc3RpbmciIHZhbHVlcyBvciBpbnRlbmRlZCB0byBiZSBjb25maWd1cmVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPworICAgICAqIFxwYXJhbSBmYWlsdXJlcyAgICAgIGEgbGlzdCBvZiBwYXJhbWV0ZXIgZmFpbHVyZXMKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGFsbCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LCBidXQgc29tZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgd2VyZSBub3Qgc3VwcG9ydGVkCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgc29tZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgYmVjYXVzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZXkgY29udGFpbmVkIHVuc3VwcG9ydGVkIHZhbHVlcy4gVGhlc2UgYXJlIHJldHVybmVkIGluIHxmYWlsdXJlc3wuCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgc29tZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgYmVjYXVzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZXkgY29udGFpbmVkIHVuc3VwcG9ydGVkIHZhbHVlcywgYnV0IGNvdWxkIG5vdCBhbGxvY2F0ZSBhIGZhaWx1cmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgZm9yIHRoZW0uCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgdXBkYXRlIG9mIHRoZSBwYXJhbWV0ZXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWdfc20oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpID0gMDsKKworICAgIC8vIFJFRkxFQ1RJT04gTUVDSEFOSVNNIChVU0VEIEZPUiBFWFRFTlNJT04pCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgcmVmbGVjdG9yLgorICAgICAqCisgICAgICogVGhpcyBpcyB1c2VkIHRvIGRlc2NyaWJlIHBhcmFtZXRlciBmaWVsZHMuIFRoaXMgaXMgc2hhcmVkIGZvciBhbGwgY29tcG9uZW50cyBjcmVhdGVkIGJ5CisgICAgICogdGhpcyBjb21wb25lbnQgc3RvcmUuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBzaGFyZWQgcGFyYW1ldGVyIHJlZmxlY3RvciBvYmplY3QuCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UGFyYW1SZWZsZWN0b3IoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2Ygc3VwcG9ydGVkIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbVtvdXRdIHBhcmFtcyBhIHZlY3RvciBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVycyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMgdmVjdG9yLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqIGNvbnN0IHBhcmFtcykgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGUgcXVlcmllZCBmaWVsZHMuCisgICAgICoKKyAgICAgKiBDbGllbnQgU0hBTEwgc2V0IHRoZSBwYXJhbWV0ZXItZmllbGQgc3BlY2lmaWVyIGFuZCB0aGUgdHlwZSBvZiBzdXBwb3J0ZWQgdmFsdWVzIHF1ZXJ5IChlLmcuCisgICAgICogY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMsIG9yIHBvdGVudGlhbCBzdXBwb3J0ZWQgdmFsdWVzKSBpbiBmaWVsZHMuCisgICAgICogVXBvbiByZXR1cm4gdGhlIHN0b3JlIFNIQUxMIGZpbGwgaW4gdGhlIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoZSBmaWVsZHMgbGlzdGVkIGFzIHdlbGwKKyAgICAgKiBhcyBhIHN0YXR1cyBmb3IgZWFjaCBmaWVsZC4gU3RvcmUgc2hhbGwgcHJvY2VzcyBhbGwgZmllbGRzIHF1ZXJpZWQgZXZlbiBpZiBzb21lIHF1ZXJpZXMKKyAgICAgKiBmYWlsLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbiBvdXRdIGZpZWxkcyBhIHZlY3RvciBvZiBmaWVsZHMgZGVzY3JpcHRvciBzdHJ1Y3R1cmVzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGF0IGxlYXN0IG9uZSBmaWVsZCB3YXMgbm90IHJlY29nbml6ZWQgYXMgYSBjb21wb25lbnQgc3RvcmUgZmllbGQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIH5DMkNvbXBvbmVudFN0b3JlKCkgPSBkZWZhdWx0OworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vLyBAfQorCisjZW5kaWYgIC8vIEMyQ09NUE9ORU5UX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29uZmlnLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU0NWM0NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb25maWcuaApAQCAtMCwwICsxLDIxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyQ09ORklHX0hfCisjZGVmaW5lIEMyQ09ORklHX0hfCisKKyNpbmNsdWRlIDxDMi5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJFbnVtLmg+CisjaW5jbHVkZSA8QzJQYXJhbURlZi5oPgorCisvLy8gXGRlZmdyb3VwIGNvbmZpZyBDb21wb25lbnQgY29uZmlndXJhdGlvbgorLy8vIEB7CisKKy8qKgorICogRW51bWVyYXRlZCBib29sZWFuLgorICovCitDMkVOVU0oYzJfYm9vbF90LCB1aW50MzJfdCwKKyAgICBDMl9GQUxTRSwgLy8vPCB0cnVlCisgICAgQzJfVFJVRSwgIC8vLzwgZmFsc2UKKykKKwordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PGMyX2Jvb2xfdD4gQzJCb29sVmFsdWU7CisKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkVhc3lFbnVtPGMyX2Jvb2xfdD4+IEMyRWFzeUJvb2xWYWx1ZTsKKworLyoqCisgKiBFbnVtZXJhdGVkIHNldCB0cmktc3RhdGUuCisgKgorICogVXNlZCBmb3Igb3B0aW9uYWwgY29uZmlndXJhdGlvbnMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB2YWx1ZXMgc2V0IGJ5IHRoZSBjbGllbnQsCisgKiBkZWZhdWx0IHZhbHVlcyBzZXQgYnkgdGhlIGNvbXBvbmVudCwgb3IgdW5zZXQgdmFsdWVzLgorICovCitDMkVOVU0oYzJfc2V0X3QsIHVpbnQzMl90LAorICAgIEMyX1VOU0VULCAgIC8vIHBhcmFtZXRlciBpcyB1bnNldCBhbmQgaGFzIG5vIHZhbHVlCisgICAgQzJfU0VULCAgICAgLy8gcGFyYW1ldGVyIGlzL2hhcyBiZWVuIHNldCBieSB0aGUgY2xpZW50CisgICAgQzJfREVGQVVMVCwgLy8gcGFyYW1ldGVyIGhhcyBub3QgYmVlbiBzZXQgYnkgdGhlIGNsaWVudCwgYnV0IGlzIHNldCBieSB0aGUgY29tcG9uZW50CispCisKKy8qKiBFbnVtZXJhdGlvbnMgdXNlZCBieSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi8KK3N0cnVjdCBDMkNvbmZpZyB7CisgICAgZW51bSBhYWNfcGFja2FnaW5nX3QgOiB1aW50MzJfdDsgICAgICAgIC8vLzwgQUFDIHBhY2thZ2luZyAoUkFXIHZzIEFEVFMpCisgICAgZW51bSBhYWNfc2JyX21vZGVfdCA6IHVpbnQzMl90OyAgICAgICAgIC8vLzwgQUFDIFNCUiBtb2RlCisgICAgZW51bSBhcGlfZmVhdHVyZV90IDogdWludDY0X3Q7ICAgICAgICAgIC8vLzwgQVBJIGZlYXR1cmVzCisgICAgZW51bSBhcGlfbGV2ZWxfdCA6IHVpbnQzMl90OyAgICAgICAgICAgIC8vLzwgQVBJIGxldmVsCisgICAgZW51bSBiaXRyYXRlX21vZGVfdCA6IHVpbnQzMl90OyAgICAgICAgIC8vLzwgYml0cmF0ZSBjb250cm9sIG1vZGUKKyAgICBlbnVtIGRyY19jb21wcmVzc2lvbl9tb2RlX3QgOiBpbnQzMl90OyAgLy8vPCBEUkMgY29tcHJlc3Npb24gbW9kZQorICAgIGVudW0gZHJjX2VmZmVjdF90eXBlX3QgOiBpbnQzMl90OyAgICAgICAvLy88IERSQyBlZmZlY3QgdHlwZQorICAgIGVudW0gaW50cmFfcmVmcmVzaF9tb2RlX3QgOiB1aW50MzJfdDsgICAvLy88IGludHJhIHJlZnJlc2ggbW9kZXMKKyAgICBlbnVtIGxldmVsX3QgOiB1aW50MzJfdDsgICAgICAgICAgICAgICAgLy8vPCBjb2RpbmcgbGV2ZWwKKyAgICBlbnVtIG9yZGluYWxfa2V5X3QgOiB1aW50MzJfdDsgICAgICAgICAgLy8vPCB3b3JrIG9yZGVyaW5nIGtleXMKKyAgICBlbnVtIHBjbV9lbmNvZGluZ190IDogdWludDMyX3Q7ICAgICAgICAgLy8vPCBQQ00gZW5jb2RpbmcKKyAgICBlbnVtIHBpY3R1cmVfdHlwZV90IDogdWludDMyX3Q7ICAgICAgICAgLy8vPCBwaWN0dXJlIHR5cGVzCisgICAgZW51bSBwbGF0Zm9ybV9mZWF0dXJlX3QgOiB1aW50NjRfdDsgICAgIC8vLzwgcGxhdGZvcm0gZmVhdHVyZXMKKyAgICBlbnVtIHBsYXRmb3JtX2xldmVsX3QgOiB1aW50MzJfdDsgICAgICAgLy8vPCBwbGF0Zm9ybSBsZXZlbAorICAgIGVudW0gcHJlcGVuZF9oZWFkZXJfbW9kZV90IDogdWludDMyX3Q7ICAvLy88IHByZXBlbmQgaGVhZGVyIG9wZXJhdGlvbmFsIG1vZGVzCisgICAgZW51bSBwcm9maWxlX3QgOiB1aW50MzJfdDsgICAgICAgICAgICAgIC8vLzwgY29kaW5nIHByb2ZpbGUKKyAgICBlbnVtIHNjYWxpbmdfbWV0aG9kX3QgOiB1aW50MzJfdDsgICAgICAgLy8vPCBzY2FsaW5nIG1ldGhvZHMKKyAgICBlbnVtIHNjYW5fb3JkZXJfdCA6IHVpbnQzMl90OyAgICAgICAgICAgLy8vPCBzY2FuIG9yZGVycworICAgIGVudW0gc2VjdXJlX21vZGVfdCA6IHVpbnQzMl90OyAgICAgICAgICAvLy88IHNlY3VyZS9wcm90ZWN0ZWQgbW9kZXMKKyAgICBlbnVtIHN1cHBsZW1lbnRhbF9pbmZvX3QgOiB1aW50MzJfdDsgICAgLy8vPCBzdXBwbGVtZW50YWwgaW5mb3JtYXRpb24gdHlwZXMKKyAgICBlbnVtIHRpbGluZ19tb2RlX3QgOiB1aW50MzJfdDsgICAgICAgICAgLy8vPCB0aWxpbmcgbW9kZXMKK307CisKK25hbWVzcGFjZSB7CisKK2VudW0gQzJQYXJhbUluZGV4S2luZCA6IEMyUGFyYW06OnR5cGVfaW5kZXhfdCB7CisgICAgQzJfUEFSQU1fSU5ERVhfSU5WQUxJRCAgICAgICAgICAgICA9IDB4MCwgICAgLy8vPCBkbyBub3QgdXNlCisgICAgQzJfUEFSQU1fSU5ERVhfU1RSVUNUX1NUQVJUICAgICAgICA9IDB4MSwgICAgLy8vPCBzdHJ1Y3Qgb25seSBpbmRpY2VzCisgICAgQzJfUEFSQU1fSU5ERVhfUEFSQU1fU1RBUlQgICAgICAgICA9IDB4ODAwLCAgLy8vPCByZWd1bGFyIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9DT0RFUl9QQVJBTV9TVEFSVCAgID0gMHgxMDAwLCAvLy88IGVuL3RyYW5zY29kZXIgcGFyYW1ldGVycworICAgIEMyX1BBUkFNX0lOREVYX1BJQ1RVUkVfUEFSQU1fU1RBUlQgPSAweDE4MDAsIC8vLzwgaW1hZ2UvdmlkZW8gcGFyYW1ldGVycworICAgIEMyX1BBUkFNX0lOREVYX1ZJREVPX1BBUkFNX1NUQVJUICAgPSAweDIwMDAsIC8vLzwgdmlkZW8gcGFyYW1ldGVycworICAgIEMyX1BBUkFNX0lOREVYX0lNQUdFX1BBUkFNX1NUQVJUICAgPSAweDI4MDAsIC8vLzwgaW1hZ2UgcGFyYW1ldGVycworICAgIEMyX1BBUkFNX0lOREVYX0FVRElPX1BBUkFNX1NUQVJUICAgPSAweDMwMDAsIC8vLzwgaW1hZ2UgcGFyYW1ldGVycworICAgIEMyX1BBUkFNX0lOREVYX1BMQVRGT1JNX1NUQVJUICAgICAgPSAweDQwMDAsIC8vLzwgcGxhdGZvcm0tZGVmaW5lZCBwYXJhbWV0ZXJzCisKKyAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBzdHJ1Y3R1cmUgaW5kaWNlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgICAga1BhcmFtSW5kZXhDb2xvclh5ID0gQzJfUEFSQU1fSU5ERVhfU1RSVUNUX1NUQVJULAorICAgIGtQYXJhbUluZGV4TWFzdGVyaW5nRGlzcGxheUNvbG9yVm9sdW1lLAorICAgIGtQYXJhbUluZGV4Q2hyb21hT2Zmc2V0LAorICAgIGtQYXJhbUluZGV4R29wTGF5ZXIsCisKKyAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBwYXJhbWV0ZXIgaW5kaWNlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgICAga1BhcmFtSW5kZXhBcGlMZXZlbCA9IEMyX1BBUkFNX0lOREVYX1BBUkFNX1NUQVJULAorICAgIGtQYXJhbUluZGV4QXBpRmVhdHVyZXMsCisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYWxsIGNvbXBvbmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICAvKiBnZW5lcmljIGNvbXBvbmVudCBjaGFyYWN0ZXJpc3RpY3MgKi8KKyAgICBrUGFyYW1JbmRleE5hbWUsCisgICAga1BhcmFtSW5kZXhBbGlhc2VzLAorICAgIGtQYXJhbUluZGV4S2luZCwKKyAgICBrUGFyYW1JbmRleERvbWFpbiwKKyAgICBrUGFyYW1JbmRleEF0dHJpYnV0ZXMsCisgICAga1BhcmFtSW5kZXhUaW1lU3RyZXRjaCwKKworICAgIC8qIGNvZGluZyBjaGFyYWN0ZXJpc3RpY3MgKi8KKyAgICBrUGFyYW1JbmRleFByb2ZpbGVMZXZlbCwKKyAgICBrUGFyYW1JbmRleEluaXREYXRhLAorICAgIGtQYXJhbUluZGV4U3VwcGxlbWVudGFsRGF0YSwKKyAgICBrUGFyYW1JbmRleFN1YnNjcmliZWRTdXBwbGVtZW50YWxEYXRhLAorCisgICAgLyogcGlwZWxpbmUgY2hhcmFjdGVyaXN0aWNzICovCisgICAga1BhcmFtSW5kZXhNZWRpYVR5cGUsCisgICAga1BhcmFtSW5kZXhEZWxheVJlcXVlc3QsCisgICAga1BhcmFtSW5kZXhEZWxheSwKKyAgICBrUGFyYW1JbmRleE1heFJlZmVyZW5jZUFnZSwKKyAgICBrUGFyYW1JbmRleE1heFJlZmVyZW5jZUNvdW50LAorICAgIGtQYXJhbUluZGV4UmVvcmRlckJ1ZmZlckRlcHRoLAorICAgIGtQYXJhbUluZGV4UmVvcmRlcktleSwKKyAgICBrUGFyYW1JbmRleFN0cmVhbUNvdW50LAorICAgIGtQYXJhbUluZGV4U3Vic2NyaWJlZFBhcmFtSW5kaWNlcywKKyAgICBrUGFyYW1JbmRleFN1Z2dlc3RlZEJ1ZmZlckNvdW50LAorICAgIGtQYXJhbUluZGV4QmF0Y2hTaXplLAorICAgIGtQYXJhbUluZGV4Q3VycmVudFdvcmssCisgICAga1BhcmFtSW5kZXhMYXN0V29ya1F1ZXVlZCwKKworICAgIC8qIG1lbW9yeSBhbGxvY2F0aW9uICovCisgICAga1BhcmFtSW5kZXhBbGxvY2F0b3JzLAorICAgIGtQYXJhbUluZGV4QmxvY2tQb29scywKKyAgICBrUGFyYW1JbmRleEJ1ZmZlclR5cGUsCisgICAga1BhcmFtSW5kZXhVc2FnZSwKKyAgICBrUGFyYW1JbmRleE91dE9mTWVtb3J5LAorICAgIGtQYXJhbUluZGV4TWF4QnVmZmVyU2l6ZSwKKworICAgIC8qIG1pc2MuIHN0YXRlICovCisgICAga1BhcmFtSW5kZXhUcmlwcGVkLAorICAgIGtQYXJhbUluZGV4Q29uZmlnQ291bnRlciwKKworICAgIC8qIHJlc291cmNlcyAqLworICAgIGtQYXJhbUluZGV4UmVzb3VyY2VzTmVlZGVkLAorICAgIGtQYXJhbUluZGV4UmVzb3VyY2VzUmVzZXJ2ZWQsCisgICAga1BhcmFtSW5kZXhPcGVyYXRpbmdSYXRlLAorICAgIGtQYXJhbUluZGV4UmVhbFRpbWVQcmlvcml0eSwKKworICAgIC8qIHByb3RlY3RlZCBjb250ZW50ICovCisgICAga1BhcmFtSW5kZXhTZWN1cmVNb2RlLAorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICh0cmFucy9lbiljb2RlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICBrUGFyYW1JbmRleEJpdHJhdGUgPSBDMl9QQVJBTV9JTkRFWF9DT0RFUl9QQVJBTV9TVEFSVCwKKyAgICBrUGFyYW1JbmRleEJpdHJhdGVNb2RlLAorICAgIGtQYXJhbUluZGV4UXVhbGl0eSwKKyAgICBrUGFyYW1JbmRleENvbXBsZXhpdHksCisgICAga1BhcmFtSW5kZXhQcmVwZW5kSGVhZGVyTW9kZSwKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBpbWFnZS92aWRlbyBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAga1BhcmFtSW5kZXhQaWN0dXJlU2l6ZSA9IEMyX1BBUkFNX0lOREVYX1BJQ1RVUkVfUEFSQU1fU1RBUlQsCisgICAga1BhcmFtSW5kZXhDcm9wUmVjdCwKKyAgICBrUGFyYW1JbmRleFBpeGVsRm9ybWF0LAorICAgIGtQYXJhbUluZGV4Um90YXRpb24sCisgICAga1BhcmFtSW5kZXhQaXhlbEFzcGVjdFJhdGlvLAorICAgIGtQYXJhbUluZGV4U2NhbGVkUGljdHVyZVNpemUsCisgICAga1BhcmFtSW5kZXhTY2FsZWRDcm9wUmVjdCwKKyAgICBrUGFyYW1JbmRleFNjYWxpbmdNZXRob2QsCisgICAga1BhcmFtSW5kZXhDb2xvckluZm8sCisgICAga1BhcmFtSW5kZXhDb2xvckFzcGVjdHMsCisgICAga1BhcmFtSW5kZXhIZHJTdGF0aWNNZXRhZGF0YSwKKyAgICBrUGFyYW1JbmRleERlZmF1bHRDb2xvckFzcGVjdHMsCisKKyAgICBrUGFyYW1JbmRleEJsb2NrU2l6ZSwKKyAgICBrUGFyYW1JbmRleEJsb2NrQ291bnQsCisgICAga1BhcmFtSW5kZXhCbG9ja1JhdGUsCisKKyAgICBrUGFyYW1JbmRleFBpY3R1cmVUeXBlTWFzaywKKyAgICBrUGFyYW1JbmRleFBpY3R1cmVUeXBlLAorICAgIGtQYXJhbUluZGV4SGRyMTBQbHVzTWV0YWRhdGEsCisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdmlkZW8gY29tcG9uZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIGtQYXJhbUluZGV4RnJhbWVSYXRlID0gQzJfUEFSQU1fSU5ERVhfVklERU9fUEFSQU1fU1RBUlQsCisgICAga1BhcmFtSW5kZXhNYXhCaXRyYXRlLAorICAgIGtQYXJhbUluZGV4TWF4RnJhbWVSYXRlLAorICAgIGtQYXJhbUluZGV4TWF4UGljdHVyZVNpemUsCisgICAga1BhcmFtSW5kZXhHb3AsCisgICAga1BhcmFtSW5kZXhTeW5jRnJhbWVJbnRlcnZhbCwKKyAgICBrUGFyYW1JbmRleFJlcXVlc3RTeW5jRnJhbWUsCisgICAga1BhcmFtSW5kZXhUZW1wb3JhbExheWVyaW5nLAorICAgIGtQYXJhbUluZGV4TGF5ZXJJbmRleCwKKyAgICBrUGFyYW1JbmRleExheWVyQ291bnQsCisgICAga1BhcmFtSW5kZXhJbnRyYVJlZnJlc2gsCisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaW1hZ2UgY29tcG9uZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIGtQYXJhbUluZGV4VGlsZUxheW91dCA9IEMyX1BBUkFNX0lOREVYX0lNQUdFX1BBUkFNX1NUQVJULAorICAgIGtQYXJhbUluZGV4VGlsZUhhbmRsaW5nLAorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGF1ZGlvIGNvbXBvbmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICBrUGFyYW1JbmRleFNhbXBsZVJhdGUgPSBDMl9QQVJBTV9JTkRFWF9BVURJT19QQVJBTV9TVEFSVCwKKyAgICBrUGFyYW1JbmRleENoYW5uZWxDb3VudCwKKyAgICBrUGFyYW1JbmRleFBjbUVuY29kaW5nLAorICAgIGtQYXJhbUluZGV4QWFjUGFja2FnaW5nLAorICAgIGtQYXJhbUluZGV4TWF4Q2hhbm5lbENvdW50LAorICAgIGtQYXJhbUluZGV4QWFjU2JyTW9kZSwgLy8gYWFjIGVuY29kZSwgZW51bQorICAgIGtQYXJhbUluZGV4RHJjRW5jb2RlZFRhcmdldExldmVsLCAgLy8gZHJjLCBmbG9hdCAoZEJGUykKKyAgICBrUGFyYW1JbmRleERyY1RhcmdldFJlZmVyZW5jZUxldmVsLCAvLyBkcmMsIGZsb2F0IChkQkZTKQorICAgIGtQYXJhbUluZGV4RHJjQ29tcHJlc3Npb24sIC8vIGRyYywgZW51bQorICAgIGtQYXJhbUluZGV4RHJjQm9vc3RGYWN0b3IsIC8vIGRyYywgZmxvYXQgKDAtMSkKKyAgICBrUGFyYW1JbmRleERyY0F0dGVudWF0aW9uRmFjdG9yLCAvLyBkcmMsIGZsb2F0ICgwLTEpCisgICAga1BhcmFtSW5kZXhEcmNFZmZlY3RUeXBlLCAvLyBkcmMsIGVudW0KKworICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBwbGF0Zm9ybS1kZWZpbmVkIHBhcmFtZXRlcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgICBrUGFyYW1JbmRleFBsYXRmb3JtTGV2ZWwgPSBDMl9QQVJBTV9JTkRFWF9QTEFURk9STV9TVEFSVCwgLy8gYWxsLCB1MzIKKyAgICBrUGFyYW1JbmRleFBsYXRmb3JtRmVhdHVyZXMsIC8vIGFsbCwgdTY0IG1hc2sKKyAgICBrUGFyYW1JbmRleFN0b3JlSW9uVXNhZ2UsIC8vIHN0b3JlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleEFzcGVjdHNUb0RhdGFTcGFjZSwgLy8gc3RvcmUsIHN0cnVjdAorICAgIGtQYXJhbUluZGV4RmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3IsIC8vIHN0b3JlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleEZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9ycywgLy8gc3RvcmUsIHN0cnVjdFtdCisgICAga1BhcmFtSW5kZXhEYXRhU3BhY2VUb0FzcGVjdHMsIC8vIHN0b3JlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleERhdGFTcGFjZSwgLy8gdTMyCisgICAga1BhcmFtSW5kZXhTdXJmYWNlU2NhbGluZywgLy8gdTMyCisKKyAgICAvLyBpbnB1dCBzdXJmYWNlCisgICAga1BhcmFtSW5kZXhJbnB1dFN1cmZhY2VFb3MsIC8vIGlucHV0LXN1cmZhY2UsIGVvcworICAgIGtQYXJhbUluZGV4VGltZWRDb250cm9sLCAvLyBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleFN0YXJ0QXQsIC8vIGlucHV0LXN1cmZhY2UsIHN0cnVjdAorICAgIGtQYXJhbUluZGV4U3VzcGVuZEF0LCAvLyBpbnB1dC1zdXJmYWNlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleFJlc3VtZUF0LCAvLyBpbnB1dC1zdXJmYWNlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleFN0b3BBdCwgLy8gaW5wdXQtc3VyZmFjZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhUaW1lT2Zmc2V0LCAvLyBpbnB1dC1zdXJmYWNlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleE1pbkZyYW1lUmF0ZSwgLy8gaW5wdXQtc3VyZmFjZSwgZmxvYXQKKyAgICBrUGFyYW1JbmRleFRpbWVzdGFtcEdhcEFkanVzdG1lbnQsIC8vIGlucHV0LXN1cmZhY2UsIHN0cnVjdAorCisgICAga1BhcmFtSW5kZXhTdXJmYWNlQWxsb2NhdG9yLCAvLyB1MzIKK307CisKK30KKworLyoqCisgKiBDb2RlYyAyLjAgcGFyYW1ldGVyIHR5cGVzIGZvbGxvdyB0aGUgZm9sbG93aW5nIG5hbWluZyBjb252ZW50aW9uOgorICoKKyAqIEMyPGdyb3VwPjxkb21haW4+PGluZGV4Pjx0eXBlPgorICoKKyAqIEUuZy4gQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86IGdyb3VwPSIiIGRvbWFpbj0iU3RyZWFtIiBpbmRleD0iUGljdHVyZVNpemUiIHR5cGU9IkluZm8iLgorICogR3JvdXAgaXMgc29tZXdoYXQgYXJiaXRyYXJ5LCBidXQgZGVub3RlcyBraW5kIG9mIG9iamVjdHMgdGhlIHBhcmFtZXRlciBpcyBkZWZpbmVkLgorICogQXQgdGhpcyBwb2ludCB3ZSB1c2UgQ29tcG9uZW50IGFuZCBTdG9yZSB0byBkaXN0aW5ndWlzaCBiYXNpYyBjb21wb25lbnQvc3RvcmUgcGFyYW1ldGVycy4KKyAqCisgKiBQYXJhbWV0ZXIga2V5cyBhcmUgbmFtZWQgQzJfUEFSQU1LRVlfWzxncm91cD5fXTxkb21haW4+XzxpbmRleD4gYXMgdHlwZSBpcyBub3QgZXhwZWN0ZWQKKyAqIHRvIGRpc3Rpbmd1aXNoIHBhcmFtZXRlcnMuIEUuZy4gYSBjb21wb25lbnQgY291bGQgY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgYW5kIGl0CisgKiBpcyBub3QgZXhwZWN0ZWQgdXNlcnMgd291bGQgbmVlZCB0byBjaGFuZ2UgdGhlIGtleS4KKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBUEkgbGV2ZWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZW51bSBDMkNvbmZpZzo6YXBpX2xldmVsX3QgOiB1aW50MzJfdCB7CisgICAgQVBJX0wwXzEgPSAwLCAgIC8vLzwgc3VwcG9ydCBmb3IgQVBJIGxldmVsIDAuMQorfTsKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjphcGlfbGV2ZWxfdD4sIGtQYXJhbUluZGV4QXBpTGV2ZWw+CisgICAgICAgIEMyQXBpTGV2ZWxTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQVBJX0xFVkVMW10gPSAiYXBpLmxldmVsIjsKKworZW51bSBDMkNvbmZpZzo6YXBpX2ZlYXR1cmVfdCA6IHVpbnQ2NF90IHsKKyAgICBBUElfUkVGTEVDVElPTiAgICAgICA9ICgxVSA8PCAwKSwgIC8vLzwgYWJpbGl0eSB0byBsaXN0IHN1cHBvcnRlZCBwYXJhbWV0ZXJzCisgICAgQVBJX1ZBTFVFUyAgICAgICAgICAgPSAoMVUgPDwgMSksICAvLy88IGFiaWxpdHkgdG8gbGlzdCBzdXBwb3J0ZWQgdmFsdWVzIGZvciBlYWNoIHBhcmFtZXRlcgorICAgIEFQSV9DVVJSRU5UX1ZBTFVFUyAgID0gKDFVIDw8IDIpLCAgLy8vPCBhYmlsaXR5IHRvIGxpc3QgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGVhY2ggcGFyYW1ldGVyCisgICAgQVBJX0RFUEVOREVOQ1kgICAgICAgPSAoMVUgPDwgMyksICAvLy88IGhhdmUgYSBkZWZpbmVkIHBhcmFtZXRlciBkZXBlbmRlbmN5CisKKyAgICBBUElfU1RSRUFNUyAgICAgICAgICA9ICgxVUxMIDw8IDMyKSwgIC8vLzwgc3VwcG9ydGluZyB2YXJpYWJsZSBudW1iZXIgb2Ygc3RyZWFtcworCisgICAgQVBJX1RVTk5FTElORyAgICAgICAgPSAoMVVMTCA8PCA0OCksICAvLy88IHR1bm5lbGluZyBBUEkKK307CisKKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6YXBpX2ZlYXR1cmVfdD4sIGtQYXJhbUluZGV4QXBpRmVhdHVyZXM+CisgICAgICAgIEMyQXBpRmVhdHVyZXNTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQVBJX0ZFQVRVUkVTW10gPSAiYXBpLmZlYXR1cmVzIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2VuZXJpYyBjb21wb25lbnQgY2hhcmFjdGVyaXN0aWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudC4KKyAqCisgKiBUaGlzIG11c3QgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9yIGRvdCAnLicsIGh5cGhlbiAnLScsIHBsdXMgJysnLCBvcgorICogdW5kZXJsaW5lICdfJy4gVGhlIG5hbWUgb2YgZWFjaCBjb21wb25lbnQgbXVzdCBiZSB1bmlxdWUuCisgKgorICogRm9yIEFuZHJvaWQ6IENvbXBvbmVudCBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggJ2MyLicgZm9sbG93ZWQgYnkgdGhlIGNvbXBhbnkgbmFtZSBvciBhYmJyZXZpYXRpb24KKyAqIGFuZCBhbm90aGVyIGRvdCwgZS5nLiAnYzIuYW5kcm9pZC4nLiBVc2Ugb2YgbG93ZXJjYXNlIGlzIHByZWZlcnJlZCBidXQgbm90IHJlcXVpcmVkLgorICovCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4TmFtZT4gQzJDb21wb25lbnROYW1lU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9OQU1FW10gID0gImNvbXBvbmVudC5uYW1lIjsKKworLyoqCisgKiBBbHRlcm5hdGUgbmFtZXMgKGFsaWFzZXMpIG9mIHRoZSBjb21wb25lbnQuCisgKgorICogVGhpcyBpcyBhIGNvbW1hICcsJyBzZXBhcmF0ZWQgbGlzdCBvZiBhbHRlcm5hdGUgY29tcG9uZW50IG5hbWVzLiBVbmxpa2UgY29tcG9uZW50IG5hbWVzIHRoYXQKKyAqIG11c3QgYmUgdW5pcXVlLCBtdWx0aXBsZSBjb21wb25lbnRzIGNhbiBoYXZlIHRoZSBzYW1lIGFsaWFzLgorICovCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4QWxpYXNlcz4gQzJDb21wb25lbnRBbGlhc2VzU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BTElBU0VTW10gID0gImNvbXBvbmVudC5hbGlhc2VzIjsKKworLyoqCisgKiBDb21wb25lbnQga2luZC4KKyAqLworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29tcG9uZW50OjpraW5kX3Q+LCBrUGFyYW1JbmRleEtpbmQ+CisgICAgICAgIEMyQ29tcG9uZW50S2luZFNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT01QT05FTlRfS0lORFtdICA9ICJjb21wb25lbnQua2luZCI7CisKKy8qKgorICogQ29tcG9uZW50IGRvbWFpbi4KKyAqLworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29tcG9uZW50Ojpkb21haW5fdD4sIGtQYXJhbUluZGV4RG9tYWluPgorICAgICAgICBDMkNvbXBvbmVudERvbWFpblNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT01QT05FTlRfRE9NQUlOW10gID0gImNvbXBvbmVudC5kb21haW4iOworCisvKioKKyAqIENvbXBvbmVudCBhdHRyaWJ1dGVzLgorICoKKyAqIFRoZXNlIGFyZSBhIHNldCBvZiBmbGFncyBwcm92aWRlZCBieSB0aGUgY29tcG9uZW50IGNoYXJhY3Rlcml6aW5nIGl0cyBwcm9jZXNzaW5nIGFsZ29yaXRobS4KKyAqLworQzJFTlVNKEMyQ29tcG9uZW50OjphdHRyaWJfdCwgdWludDY0X3QsCisgICAgQVRUUklCX0lTX1RFTVBPUkFMID0gMXUgPDwgMCwgLy8vPCBjb21wb25lbnQgaW5wdXQgb3JkZXJpbmcgbWF0dGVycyBmb3IgcHJvY2Vzc2luZworKQorCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb21wb25lbnQ6OmF0dHJpYl90Piwga1BhcmFtSW5kZXhBdHRyaWJ1dGVzPgorICAgICAgICBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVNbXSA9ICJjb21wb25lbnQuYXR0cmlidXRlcyI7CisKKy8qKgorICogVGltZSBzdHJldGNoaW5nLgorICoKKyAqIFRoaXMgaXMgdGhlIHJhdGlvIGJldHdlZW4gdGhlIHJhdGUgb2YgdGhlIGlucHV0IHRpbWVzdGFtcCwgYW5kIHRoZSByYXRlIG9mIHRoZSBvdXRwdXQgdGltZXN0YW1wLgorICogRS5nLiBpZiB0aGlzIGlzIDQuMCwgZm9yIGV2ZXJ5IDEgc2Vjb25kcyBvZiBpbnB1dCB0aW1lc3RhbXAgZGlmZmVyZW5jZSwgdGhlIG91dHB1dCBzaGFsbCBkaWZmZXIKKyAqIGJ5IDQgc2Vjb25kcy4KKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4VGltZVN0cmV0Y2g+IEMyQ29tcG9uZW50VGltZVN0cmV0Y2hUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9USU1FX1NUUkVUQ0hbXSAgPSAiYWxnby50aW1lLXN0cmV0Y2giOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb2RpbmcgY2hhcmFjdGVyaXN0aWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogUHJvZmlsZSBhbmQgbGV2ZWwuCisgKgorICogUHJvZmlsZSBkZXRlcm1pbmVzIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBjb21wb25lbnQuCisgKiBMZXZlbCBkZXRlcm1pbmVzIHRoZSBsZXZlbCBvZiByZXNvdXJjZXMgdXNlZCBieSB0aGUgY29tcG9uZW50LgorICovCisKK25hbWVzcGFjZSB7CisKK2VudW0gOiB1aW50MzJfdCB7CisgICAgX0MyX1BMX01QMlZfQkFTRSA9IDB4MTAwMCwKKyAgICBfQzJfUExfQUFDX0JBU0UgID0gMHgyMDAwLAorICAgIF9DMl9QTF9IMjYzX0JBU0UgPSAweDMwMDAsCisgICAgX0MyX1BMX01QNFZfQkFTRSA9IDB4NDAwMCwKKyAgICBfQzJfUExfQVZDX0JBU0UgID0gMHg1MDAwLAorICAgIF9DMl9QTF9IRVZDX0JBU0UgPSAweDYwMDAsCisgICAgX0MyX1BMX1ZQOV9CQVNFICA9IDB4NzAwMCwKKyAgICBfQzJfUExfRFZfQkFTRSAgID0gMHg4MDAwLAorICAgIF9DMl9QTF9BVjFfQkFTRSAgPSAweDkwMDAsCisKKyAgICBDMl9QUk9GSUxFX0xFVkVMX1ZFTkRPUl9TVEFSVCA9IDB4NzAwMDAwMDAsCit9OworCit9CisKK2VudW0gQzJDb25maWc6OnByb2ZpbGVfdCA6IHVpbnQzMl90IHsKKyAgICBQUk9GSUxFX1VOVVNFRCA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcHJvZmlsZSBpcyBub3QgdXNlZCBieSB0aGlzIG1lZGlhIHR5cGUKKworICAgIC8vIEFBQyAoTVBFRy0yIFBhcnQgNyBhbmQgTVBFRy00IFBhcnQgMykgcHJvZmlsZXMKKyAgICBQUk9GSUxFX0FBQ19MQyA9IF9DMl9QTF9BQUNfQkFTRSwgICAgICAgICAgIC8vLzwgQUFDIExvdy1Db21wbGV4aXR5CisgICAgUFJPRklMRV9BQUNfTUFJTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBNYWluCisgICAgUFJPRklMRV9BQUNfU1NSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBTY2FsYWJsZSBTYW1wbGluZyBSYXRlCisgICAgUFJPRklMRV9BQUNfTFRQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBMb25nIFRlcm0gUHJlZGljdGlvbgorICAgIFBST0ZJTEVfQUFDX0hFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgSGlnaC1FZmZpY2llbmN5CisgICAgUFJPRklMRV9BQUNfU0NBTEFCTEUsICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBTY2FsYWJsZQorICAgIFBST0ZJTEVfQUFDX0VSX0xDLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgRXJyb3IgUmVzaWxpZW50IExvdy1Db21wbGV4aXR5CisgICAgUFJPRklMRV9BQUNfRVJfU0NBTEFCTEUsICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBFcnJvciBSZXNpbGllbnQgU2NhbGFibGUKKyAgICBQUk9GSUxFX0FBQ19MRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIExvdyBEZWxheQorICAgIFBST0ZJTEVfQUFDX0hFX1BTLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgSGlnaC1FZmZpY2llbmN5IFBhcmFtZXRyaWMgU3RlcmVvCisgICAgUFJPRklMRV9BQUNfRUxELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBFbmhhbmNlZCBMb3cgRGVsYXkKKyAgICBQUk9GSUxFX0FBQ19YSEUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIEV4dGVuZGVkIEhpZ2gtRWZmaWNpZW5jeQorCisgICAgLy8gTVBFRy0yIFZpZGVvIHByb2ZpbGVzCisgICAgUFJPRklMRV9NUDJWX1NJTVBMRSA9IF9DMl9QTF9NUDJWX0JBU0UsICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIFNpbXBsZQorICAgIFBST0ZJTEVfTVAyVl9NQUlOLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBNYWluCisgICAgUFJPRklMRV9NUDJWX1NOUl9TQ0FMQUJMRSwgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIFNOUiBTY2FsYWJsZQorICAgIFBST0ZJTEVfTVAyVl9TUEFUSUFMTFlfU0NBTEFCTEUsICAgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBTcGF0aWFsbHkgU2NhbGFibGUKKyAgICBQUk9GSUxFX01QMlZfSElHSCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgSGlnaAorICAgIFBST0ZJTEVfTVAyVl80MjIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSA0OjI6MgorICAgIFBST0ZJTEVfTVAyVl9NVUxUSVZJRVcsICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBNdWx0aS12aWV3CisKKyAgICAvLyBILjI2MyBwcm9maWxlcworICAgIFBST0ZJTEVfSDI2M19CQVNFTElORSA9IF9DMl9QTF9IMjYzX0JBU0UsICAgLy8vPCBILjI2MyBCYXNlbGluZSAoUHJvZmlsZSAwKQorICAgIFBST0ZJTEVfSDI2M19IMzIwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBILjMyMCBDb2RpbmcgRWZmaWNpZW5jeSBWZXJzaW9uIDIgQmFja3dhcmQtQ29tcGF0aWJpbGl0eSAoUHJvZmlsZSAxKQorICAgIFBST0ZJTEVfSDI2M19WMUJDLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBWZXJzaW9uIDEgQmFja3dhcmQtQ29tcGF0aWJpbGl0eSAoUHJvZmlsZSAyKQorICAgIFBST0ZJTEVfSDI2M19JU1dWMiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBWZXJzaW9uIDIgSW50ZXJhY3RpdmUgYW5kIFN0cmVhbWluZyBXaXJlbGVzcyAoUHJvZmlsZSAzKQorICAgIFBST0ZJTEVfSDI2M19JU1dWMywgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBWZXJzaW9uIDMgSW50ZXJhY3RpdmUgYW5kIFN0cmVhbWluZyBXaXJlbGVzcyAoUHJvZmlsZSA0KQorICAgIFBST0ZJTEVfSDI2M19ISUdIX0NPTVBSRVNTSU9OLCAgICAgICAgICAgICAgLy8vPCBILjI2MyBDb252ZXJzYXRpb25hbCBIaWdoIENvbXByZXNzaW9uIChQcm9maWxlIDUpCisgICAgUFJPRklMRV9IMjYzX0lOVEVSTkVULCAgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIENvbnZlcnNhdGlvbmFsIEludGVybmV0IChQcm9maWxlIDYpCisgICAgUFJPRklMRV9IMjYzX0lOVEVSTEFDRSwgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIENvbnZlcnNhdGlvbmFsIEludGVybGFjZSAoUHJvZmlsZSA3KQorICAgIFBST0ZJTEVfSDI2M19ISUdIX0xBVEVOQ1ksICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBIaWdoIExhdGVuY3kgKFByb2ZpbGUgOCkKKworICAgIC8vIE1QRUctNCBQYXJ0IDIgKFZpZGVvKSBOYXR1cmFsIFZpc3VhbCBQcm9maWxlcworICAgIFBST0ZJTEVfTVA0Vl9TSU1QTEUsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gU2ltcGxlCisgICAgUFJPRklMRV9NUDRWX1NJTVBMRV9TQ0FMQUJMRSwgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBTaW1wbGUgU2NhbGFibGUKKyAgICBQUk9GSUxFX01QNFZfQ09SRSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIENvcmUKKyAgICBQUk9GSUxFX01QNFZfTUFJTiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIE1haW4KKyAgICBQUk9GSUxFX01QNFZfTkJJVCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIE4tQml0CisgICAgUFJPRklMRV9NUDRWX0FSVFMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBBZHZhbmNlZCBSZWFsdGltZSBTaW1wbGUKKyAgICBQUk9GSUxFX01QNFZfQ09SRV9TQ0FMQUJMRSwgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIENvcmUgU2NhbGFibGUKKyAgICBQUk9GSUxFX01QNFZfQUNFLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIEFkdmFuY2VkIENvZGluZyBFZmZpY2llbmN5CisgICAgUFJPRklMRV9NUDRWX0FEVkFOQ0VEX0NPUkUsICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBBZHZhbmNlZCBDb3JlCisgICAgUFJPRklMRV9NUDRWX1NJTVBMRV9TVFVESU8sICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBTaW1wbGUgU3R1ZGlvCisgICAgUFJPRklMRV9NUDRWX0NPUkVfU1RVRElPLCAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBDb3JlIFN0dWRpbworICAgIFBST0ZJTEVfTVA0Vl9BRFZBTkNFRF9TSU1QTEUsICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gQWR2YW5jZWQgU2ltcGxlCisgICAgUFJPRklMRV9NUDRWX0ZHUywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBGaW5lIEdyYW51bGFyaXR5IFNjYWxhYmxlCisKKyAgICAvLyBBVkMgLyBNUEVHLTQgUGFydCAxMCAoSC4yNjQpIHByb2ZpbGVzCisgICAgUFJPRklMRV9BVkNfQkFTRUxJTkUgPSBfQzJfUExfQVZDX0JBU0UsICAgICAvLy88IEFWQyAoSC4yNjQpIEJhc2VsaW5lCisgICAgUFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkUsICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIENvbnN0cmFpbmVkIEJhc2VsaW5lCisgICAgUFJPRklMRV9BVkNfTUFJTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIE1haW4KKyAgICBQUk9GSUxFX0FWQ19FWFRFTkRFRCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgRXh0ZW5kZWQKKyAgICBQUk9GSUxFX0FWQ19ISUdILCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgSGlnaAorICAgIFBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0gsICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBQcm9ncmVzc2l2ZSBIaWdoCisgICAgUFJPRklMRV9BVkNfQ09OU1RSQUlORURfSElHSCwgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIENvbnN0cmFpbmVkIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19ISUdIXzEwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgSGlnaCAxMAorICAgIFBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0hfMTAsICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBQcm9ncmVzc2l2ZSBIaWdoIDEwCisgICAgUFJPRklMRV9BVkNfSElHSF80MjIsICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2ggNDoyOjIKKyAgICBQUk9GSUxFX0FWQ19ISUdIXzQ0NF9QUkVESUNUSVZFLCAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgSGlnaCA0OjQ6NCBQcmVkaWN0aXZlCisgICAgUFJPRklMRV9BVkNfSElHSF8xMF9JTlRSQSwgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2ggMTAgSW50cmEKKyAgICBQUk9GSUxFX0FWQ19ISUdIXzQyMl9JTlRSQSwgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgSGlnaCA0OjI6MiBJbnRyYQorICAgIFBST0ZJTEVfQVZDX0hJR0hfNDQ0X0lOVFJBLCAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBIaWdoIDQ6NDo0IEludHJhCisgICAgUFJPRklMRV9BVkNfQ0FWTENfNDQ0X0lOVFJBLCAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIENBVkxDIDQ6NDo0IEludHJhCisgICAgUFJPRklMRV9BVkNfU0NBTEFCTEVfQkFTRUxJTkUgPSBfQzJfUExfQVZDX0JBU0UgKyAweDEwMCwgIC8vLzwgQVZDIChILjI2NCkgU2NhbGFibGUgQmFzZWxpbmUKKyAgICBQUk9GSUxFX0FWQ19TQ0FMQUJMRV9DT05TVFJBSU5FRF9CQVNFTElORSwgIC8vLzwgQVZDIChILjI2NCkgU2NhbGFibGUgQ29uc3RyYWluZWQgQmFzZWxpbmUKKyAgICBQUk9GSUxFX0FWQ19TQ0FMQUJMRV9ISUdILCAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgU2NhbGFibGUgSGlnaAorICAgIFBST0ZJTEVfQVZDX1NDQUxBQkxFX0NPTlNUUkFJTkVEX0hJR0gsICAgICAgLy8vPCBBVkMgKEguMjY0KSBTY2FsYWJsZSBDb25zdHJhaW5lZCBIaWdoCisgICAgUFJPRklMRV9BVkNfU0NBTEFCTEVfSElHSF9JTlRSQSwgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIFNjYWxhYmxlIEhpZ2ggSW50cmEKKyAgICBQUk9GSUxFX0FWQ19NVUxUSVZJRVdfSElHSCA9IF9DMl9QTF9BVkNfQkFTRSArIDB4MjAwLCAgLy8vPCBBVkMgKEguMjY0KSBNdWx0aXZpZXcgSGlnaAorICAgIFBST0ZJTEVfQVZDX1NURVJFT19ISUdILCAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBTdGVyZW8gSGlnaAorICAgIFBST0ZJTEVfQVZDX01GQ19ISUdILCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBNRkMgSGlnaAorICAgIFBST0ZJTEVfQVZDX01VTFRJVklFV19ERVBUSF9ISUdIID0gX0MyX1BMX0FWQ19CQVNFICsgMHgzMDAsICAvLy88IEFWQyAoSC4yNjQpIE11bHRpdmlldyBEZXB0aCBIaWdoCisgICAgUFJPRklMRV9BVkNfTUZDX0RFUFRIX0hJR0gsICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIE1GQyBEZXB0aCBIaWdoCisgICAgUFJPRklMRV9BVkNfRU5IQU5DRURfTVVMVElWSUVXX0RFUFRIX0hJR0ggPSBfQzJfUExfQVZDX0JBU0UgKyAweDQwMCwgIC8vLzwgQVZDIChILjI2NCkgRW5oYW5jZWQgTXVsdGl2aWV3IERlcHRoIEhpZ2gKKworICAgIC8vIEhFVkMgcHJvZmlsZXMKKyAgICBQUk9GSUxFX0hFVkNfTUFJTiA9IF9DMl9QTF9IRVZDX0JBU0UsICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4KKyAgICBQUk9GSUxFX0hFVkNfTUFJTl8xMCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gMTAKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl9TVElMTCwgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gU3RpbGwgUGljdHVyZQorICAgIFBST0ZJTEVfSEVWQ19NT05PID0gX0MyX1BMX0hFVkNfQkFTRSArIDB4MTAwLCAgLy8vPCBIRVZDIChILjI2NSkgTW9ub2Nocm9tZQorICAgIFBST0ZJTEVfSEVWQ19NT05PXzEyLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTW9ub2Nocm9tZSAxMgorICAgIFBST0ZJTEVfSEVWQ19NT05PXzE2LCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTW9ub2Nocm9tZSAxNgorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzEyLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiAxMgorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQyMl8xMCwgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjI6MiAxMAorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQyMl8xMiwgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjI6MiAxMgorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQ0NCwgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjQ6NAorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xMCwgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjQ6NCAxMAorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xMiwgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjQ6NCAxMgorICAgIFBST0ZJTEVfSEVWQ19NQUlOX0lOVFJBLCAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBJbnRyYQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzEwX0lOVFJBLCAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiAxMCBJbnRyYQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzEyX0lOVFJBLCAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiAxMiBJbnRyYQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQyMl8xMF9JTlRSQSwgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjI6MiAxMCBJbnRyYQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQyMl8xMl9JTlRSQSwgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjI6MiAxMiBJbnRyYQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQ0NF9JTlRSQSwgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjQ6NCBJbnRyYQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xMF9JTlRSQSwgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjQ6NCAxMCBJbnRyYQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xMl9JTlRSQSwgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjQ6NCAxMiBJbnRyYQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xNl9JTlRSQSwgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjQ6NCAxNiBJbnRyYQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQ0NF9TVElMTCwgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjQ6NCBTdGlsbCBQaWN0dXJlCisgICAgUFJPRklMRV9IRVZDX01BSU5fNDQ0XzE2X1NUSUxMLCAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDQ6NDo0IDE2IFN0aWxsIFBpY3R1cmUKKyAgICBQUk9GSUxFX0hFVkNfSElHSF80NDQgPSBfQzJfUExfSEVWQ19CQVNFICsgMHgyMDAsICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRocm91Z2hwdXQgNDo0OjQKKyAgICBQUk9GSUxFX0hFVkNfSElHSF80NDRfMTAsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NCAxMAorICAgIFBST0ZJTEVfSEVWQ19ISUdIXzQ0NF8xNCwgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaHJvdWdocHV0IDQ6NDo0IDE0CisgICAgUFJPRklMRV9IRVZDX0hJR0hfNDQ0XzE2X0lOVFJBLCAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRocm91Z2hwdXQgNDo0OjQgMTYgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfU1hfTUFJTiA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDMwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIFNjcmVlbi1FeHRlbmRlZCBNYWluCisgICAgUFJPRklMRV9IRVZDX1NYX01BSU5fMTAsICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY3JlZW4tRXh0ZW5kZWQgTWFpbiAxMAorICAgIFBST0ZJTEVfSEVWQ19TWF9NQUlOXzQ0NCwgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIE1haW4gNDo0OjQKKyAgICBQUk9GSUxFX0hFVkNfU1hfTUFJTl80NDRfMTAsICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIFNjcmVlbi1FeHRlbmRlZCBNYWluIDQ6NDo0IDEwCisgICAgUFJPRklMRV9IRVZDX1NYX0hJR0hfNDQ0LCAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY3JlZW4tRXh0ZW5kZWQgSGlnaCBUaHJvdWdocHV0IDQ6NDo0CisgICAgUFJPRklMRV9IRVZDX1NYX0hJR0hfNDQ0XzEwLCAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY3JlZW4tRXh0ZW5kZWQgSGlnaCBUaHJvdWdocHV0IDQ6NDo0IDEwCisgICAgUFJPRklMRV9IRVZDX1NYX0hJR0hfNDQ0XzE0LCAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY3JlZW4tRXh0ZW5kZWQgSGlnaCBUaHJvdWdocHV0IDQ6NDo0IDE0CisgICAgUFJPRklMRV9IRVZDX01VTFRJVklFV19NQUlOID0gX0MyX1BMX0hFVkNfQkFTRSArIDB4NDAwLCAgLy8vPCBIRVZDIChILjI2NSkgTXVsdGl2aWV3IE1haW4KKyAgICBQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTUFJTiA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDUwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIFNjYWxhYmxlIE1haW4KKyAgICBQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTUFJTl8xMCwgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIFNjYWxhYmxlIE1haW4gMTAKKyAgICBQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTU9OTyA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDYwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIFNjYWxhYmxlIE1vbm9jaHJvbWUKKyAgICBQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTU9OT18xMiwgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIFNjYWxhYmxlIE1vbm9jaHJvbWUgMTIKKyAgICBQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTU9OT18xNiwgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIFNjYWxhYmxlIE1vbm9jaHJvbWUgMTYKKyAgICBQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTUFJTl80NDQsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIFNjYWxhYmxlIE1haW4gNDo0OjQKKyAgICBQUk9GSUxFX0hFVkNfM0RfTUFJTiA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDcwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIDNEIE1haW4KKworICAgIC8vIFZQOSBwcm9maWxlcworICAgIFBST0ZJTEVfVlA5XzAgPSBfQzJfUExfVlA5X0JBU0UsICAgICAgICAgICAgLy8vPCBWUDkgUHJvZmlsZSAwICg0OjI6MCkKKyAgICBQUk9GSUxFX1ZQOV8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IFByb2ZpbGUgMSAoNDoyOjIgb3IgNDo0OjQpCisgICAgUFJPRklMRV9WUDlfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBQcm9maWxlIDIgKDQ6MjowLCAxMCBvciAxMiBiaXQpCisgICAgUFJPRklMRV9WUDlfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBQcm9maWxlIDMgKDQ6MjoyIG9yIDQ6NDo0LCAxMCBvciAxMiBiaXQpCisKKyAgICAvLyBEb2xieSBWaXNpb24gcHJvZmlsZXMKKyAgICBQUk9GSUxFX0RWX0FWX1BFUiA9IF9DMl9QTF9EVl9CQVNFICsgMCwgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2YXYucGVyIHByb2ZpbGUgKGRlcHJlY2F0ZWQpCisgICAgUFJPRklMRV9EVl9BVl9QRU4sICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmF2LnBlbiBwcm9maWxlIChkZXByZWNhdGVkKQorICAgIFBST0ZJTEVfRFZfSEVfREVSLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZoZS5kZXIgcHJvZmlsZSAoZGVwcmVjYXRlZCkKKyAgICBQUk9GSUxFX0RWX0hFX0RFTiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuZGVuIHByb2ZpbGUgKGRlcHJlY2F0ZWQpCisgICAgUFJPRklMRV9EVl9IRV8wNCA9IF9DMl9QTF9EVl9CQVNFICsgNCwgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmhlLjA0IHByb2ZpbGUKKyAgICBQUk9GSUxFX0RWX0hFXzA1ID0gX0MyX1BMX0RWX0JBU0UgKyA1LCAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuMDUgcHJvZmlsZQorICAgIFBST0ZJTEVfRFZfSEVfRFRILCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZoZS5kdGggcHJvZmlsZSAoZGVwcmVjYXRlZCkKKyAgICBQUk9GSUxFX0RWX0hFXzA3ID0gX0MyX1BMX0RWX0JBU0UgKyA3LCAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuMDcgcHJvZmlsZQorICAgIFBST0ZJTEVfRFZfSEVfMDggPSBfQzJfUExfRFZfQkFTRSArIDgsICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZoZS4wOCBwcm9maWxlCisgICAgUFJPRklMRV9EVl9BVl8wOSA9IF9DMl9QTF9EVl9CQVNFICsgOSwgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmF2LjA5IHByb2ZpbGUKKworICAgIC8vIEFWMSBwcm9maWxlcworICAgIFBST0ZJTEVfQVYxXzAgPSBfQzJfUExfQVYxX0JBU0UsICAgICAgICAgICAgLy8vPCBBVjEgUHJvZmlsZSAwICg0OjI6MCwgOCB0byAxMCBiaXQpCisgICAgUFJPRklMRV9BVjFfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBQcm9maWxlIDEgKDggdG8gMTAgYml0KQorICAgIFBST0ZJTEVfQVYxXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgUHJvZmlsZSAyICg4IHRvIDEyIGJpdCkKK307CisKK2VudW0gQzJDb25maWc6OmxldmVsX3QgOiB1aW50MzJfdCB7CisgICAgTEVWRUxfVU5VU0VEID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGxldmVsIGlzIG5vdCB1c2VkIGJ5IHRoaXMgbWVkaWEgdHlwZQorCisgICAgLy8gTVBFRy0yIFZpZGVvIGxldmVscworICAgIExFVkVMX01QMlZfTE9XID0gX0MyX1BMX01QMlZfQkFTRSwgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBMb3cgTGV2ZWwKKyAgICBMRVZFTF9NUDJWX01BSU4sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgTWFpbiBMZXZlbAorICAgIExFVkVMX01QMlZfSElHSF8xNDQwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBIaWdoIDE0NDAgTGV2ZWwKKyAgICBMRVZFTF9NUDJWX0hJR0gsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgSGlnaCBMZXZlbAorICAgIExFVkVMX01QMlZfSElHSFAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBIaWdoUCBMZXZlbAorCisgICAgLy8gSC4yNjMgbGV2ZWxzCisgICAgTEVWRUxfSDI2M18xMCA9IF9DMl9QTF9IMjYzX0JBU0UsICAgICAgICAgICAvLy88IEguMjYzIExldmVsIDEwCisgICAgTEVWRUxfSDI2M18yMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIExldmVsIDIwCisgICAgTEVWRUxfSDI2M18zMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIExldmVsIDMwCisgICAgTEVWRUxfSDI2M180MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIExldmVsIDQwCisgICAgTEVWRUxfSDI2M180NSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIExldmVsIDQ1CisgICAgTEVWRUxfSDI2M181MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIExldmVsIDUwCisgICAgTEVWRUxfSDI2M182MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIExldmVsIDYwCisgICAgTEVWRUxfSDI2M183MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIExldmVsIDcwCisKKyAgICAvLyBNUEVHLTQgUGFydCAyIChWaWRlbykgbGV2ZWxzCisgICAgTEVWRUxfTVA0Vl8wID0gX0MyX1BMX01QNFZfQkFTRSwgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCAwCisgICAgTEVWRUxfTVA0Vl8wQiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCAwYgorICAgIExFVkVMX01QNFZfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgMQorICAgIExFVkVMX01QNFZfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgMgorICAgIExFVkVMX01QNFZfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgMworICAgIExFVkVMX01QNFZfM0IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgM2IKKyAgICBMRVZFTF9NUDRWXzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDQKKyAgICBMRVZFTF9NUDRWXzRBLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDRhCisgICAgTEVWRUxfTVA0Vl81LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCA1CisgICAgTEVWRUxfTVA0Vl82LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCA2CisKKyAgICAvLyBBVkMgLyBNUEVHLTQgUGFydCAxMCAoSC4yNjQpIGxldmVscworICAgIExFVkVMX0FWQ18xID0gX0MyX1BMX0FWQ19CQVNFLCAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAxCisgICAgTEVWRUxfQVZDXzFCLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDFiCisgICAgTEVWRUxfQVZDXzFfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDEuMQorICAgIExFVkVMX0FWQ18xXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAxLjIKKyAgICBMRVZFTF9BVkNfMV8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMS4zCisgICAgTEVWRUxfQVZDXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDIKKyAgICBMRVZFTF9BVkNfMl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMi4xCisgICAgTEVWRUxfQVZDXzJfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDIuMgorICAgIExFVkVMX0FWQ18zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAzCisgICAgTEVWRUxfQVZDXzNfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDMuMQorICAgIExFVkVMX0FWQ18zXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAzLjIKKyAgICBMRVZFTF9BVkNfNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgNAorICAgIExFVkVMX0FWQ180XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA0LjEKKyAgICBMRVZFTF9BVkNfNF8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgNC4yCisgICAgTEVWRUxfQVZDXzUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDUKKyAgICBMRVZFTF9BVkNfNV8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgNS4xCisgICAgTEVWRUxfQVZDXzVfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDUuMgorICAgIExFVkVMX0FWQ182LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA2CisgICAgTEVWRUxfQVZDXzZfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDYuMQorICAgIExFVkVMX0FWQ182XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA2LjIKKworICAgIC8vIEhFVkMgKEguMjY1KSB0aWVycyBhbmQgbGV2ZWxzCisgICAgTEVWRUxfSEVWQ19NQUlOXzEgPSBfQzJfUExfSEVWQ19CQVNFLCAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgMQorICAgIExFVkVMX0hFVkNfTUFJTl8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDIKKyAgICBMRVZFTF9IRVZDX01BSU5fMl8xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCAyLjEKKyAgICBMRVZFTF9IRVZDX01BSU5fMywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCAzCisgICAgTEVWRUxfSEVWQ19NQUlOXzNfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgMy4xCisgICAgTEVWRUxfSEVWQ19NQUlOXzQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNAorICAgIExFVkVMX0hFVkNfTUFJTl80XzEsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDQuMQorICAgIExFVkVMX0hFVkNfTUFJTl81LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDUKKyAgICBMRVZFTF9IRVZDX01BSU5fNV8xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCA1LjEKKyAgICBMRVZFTF9IRVZDX01BSU5fNV8yLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCA1LjIKKyAgICBMRVZFTF9IRVZDX01BSU5fNiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCA2CisgICAgTEVWRUxfSEVWQ19NQUlOXzZfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNi4xCisgICAgTEVWRUxfSEVWQ19NQUlOXzZfMiwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNi4yCisKKyAgICBMRVZFTF9IRVZDX0hJR0hfNCA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDEwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA0CisgICAgTEVWRUxfSEVWQ19ISUdIXzRfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRpZXIgTGV2ZWwgNC4xCisgICAgTEVWRUxfSEVWQ19ISUdIXzUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRpZXIgTGV2ZWwgNQorICAgIExFVkVMX0hFVkNfSElHSF81XzEsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaWVyIExldmVsIDUuMQorICAgIExFVkVMX0hFVkNfSElHSF81XzIsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaWVyIExldmVsIDUuMgorICAgIExFVkVMX0hFVkNfSElHSF82LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaWVyIExldmVsIDYKKyAgICBMRVZFTF9IRVZDX0hJR0hfNl8xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA2LjEKKyAgICBMRVZFTF9IRVZDX0hJR0hfNl8yLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA2LjIKKworICAgIC8vIFZQOSBsZXZlbHMKKyAgICBMRVZFTF9WUDlfMSA9IF9DMl9QTF9WUDlfQkFTRSwgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDEKKyAgICBMRVZFTF9WUDlfMV8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDEuMQorICAgIExFVkVMX1ZQOV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgMgorICAgIExFVkVMX1ZQOV8yXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgMi4xCisgICAgTEVWRUxfVlA5XzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCAzCisgICAgTEVWRUxfVlA5XzNfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCAzLjEKKyAgICBMRVZFTF9WUDlfNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDQKKyAgICBMRVZFTF9WUDlfNF8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDQuMQorICAgIExFVkVMX1ZQOV81LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgNQorICAgIExFVkVMX1ZQOV81XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgNS4xCisgICAgTEVWRUxfVlA5XzVfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA1LjIKKyAgICBMRVZFTF9WUDlfNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDYKKyAgICBMRVZFTF9WUDlfNl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDYuMQorICAgIExFVkVMX1ZQOV82XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgNi4yCisKKyAgICAvLyBEb2xieSBWaXNpb24gbGV2ZWxzCisgICAgTEVWRUxfRFZfTUFJTl9IRF8yNCA9IF9DMl9QTF9EVl9CQVNFLCAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgaGQyNAorICAgIExFVkVMX0RWX01BSU5fSERfMzAsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIGhkMzAKKyAgICBMRVZFTF9EVl9NQUlOX0ZIRF8yNCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciBmaGQyNAorICAgIExFVkVMX0RWX01BSU5fRkhEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIGZoZDMwCisgICAgTEVWRUxfRFZfTUFJTl9GSERfNjAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgZmhkNjAKKyAgICBMRVZFTF9EVl9NQUlOX1VIRF8yNCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciB1aGQyNAorICAgIExFVkVMX0RWX01BSU5fVUhEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIHVoZDMwCisgICAgTEVWRUxfRFZfTUFJTl9VSERfNDgsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgdWhkNDgKKyAgICBMRVZFTF9EVl9NQUlOX1VIRF82MCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciB1aGQ2MAorCisgICAgTEVWRUxfRFZfSElHSF9IRF8yNCA9IF9DMl9QTF9EVl9CQVNFICsgMHgxMDAsICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgaGQyNAorICAgIExFVkVMX0RWX0hJR0hfSERfMzAsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIGhkMzAKKyAgICBMRVZFTF9EVl9ISUdIX0ZIRF8yNCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciBmaGQyNAorICAgIExFVkVMX0RWX0hJR0hfRkhEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIGZoZDMwCisgICAgTEVWRUxfRFZfSElHSF9GSERfNjAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgZmhkNjAKKyAgICBMRVZFTF9EVl9ISUdIX1VIRF8yNCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciB1aGQyNAorICAgIExFVkVMX0RWX0hJR0hfVUhEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIHVoZDMwCisgICAgTEVWRUxfRFZfSElHSF9VSERfNDgsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgdWhkNDgKKyAgICBMRVZFTF9EVl9ISUdIX1VIRF82MCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciB1aGQ2MAorCisgICAgLy8gQVYxIGxldmVscworICAgIExFVkVMX0FWMV8yICAgID0gX0MyX1BMX0FWMV9CQVNFICwgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgMgorICAgIExFVkVMX0FWMV8yXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgMi4xCisgICAgTEVWRUxfQVYxXzJfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCAyLjIKKyAgICBMRVZFTF9BVjFfMl8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDIuMworICAgIExFVkVMX0FWMV8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgMworICAgIExFVkVMX0FWMV8zXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgMy4xCisgICAgTEVWRUxfQVYxXzNfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCAzLjIKKyAgICBMRVZFTF9BVjFfM18zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDMuMworICAgIExFVkVMX0FWMV80LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNAorICAgIExFVkVMX0FWMV80XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNC4xCisgICAgTEVWRUxfQVYxXzRfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA0LjIKKyAgICBMRVZFTF9BVjFfNF8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDQuMworICAgIExFVkVMX0FWMV81LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNQorICAgIExFVkVMX0FWMV81XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNS4xCisgICAgTEVWRUxfQVYxXzVfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA1LjIKKyAgICBMRVZFTF9BVjFfNV8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDUuMworICAgIExFVkVMX0FWMV82LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNgorICAgIExFVkVMX0FWMV82XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNi4xCisgICAgTEVWRUxfQVYxXzZfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA2LjIKKyAgICBMRVZFTF9BVjFfNl8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDYuMworICAgIExFVkVMX0FWMV83LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNworICAgIExFVkVMX0FWMV83XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNy4xCisgICAgTEVWRUxfQVYxXzdfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA3LjIKKyAgICBMRVZFTF9BVjFfN18zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDcuMworfTsKKworc3RydWN0IEMyUHJvZmlsZUxldmVsU3RydWN0IHsKKyAgICBDMkNvbmZpZzo6cHJvZmlsZV90IHByb2ZpbGU7ICAvLy88IGNvZGluZyBwcm9maWxlCisgICAgQzJDb25maWc6OmxldmVsX3QgICBsZXZlbDsgICAgLy8vPCBjb2RpbmcgbGV2ZWwKKworICAgIEMyUHJvZmlsZUxldmVsU3RydWN0KAorICAgICAgICAgICAgQzJDb25maWc6OnByb2ZpbGVfdCBwcm9maWxlXyA9IEMyQ29uZmlnOjpQUk9GSUxFX1VOVVNFRCwKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGxldmVsXyA9IEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQpCisgICAgICAgIDogcHJvZmlsZShwcm9maWxlXyksIGxldmVsKGxldmVsXykgeyB9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFByb2ZpbGVMZXZlbCkKKyAgICBDMkZJRUxEKHByb2ZpbGUsICJwcm9maWxlIikKKyAgICBDMkZJRUxEKGxldmVsLCAgICJsZXZlbCIpCit9OworCisvLyBUT0RPOiBtYXkgbmVlZCB0byBtYWtlIHRoaXMgZXhwbGljaXQgKGhhdmUgLnNldCBtZW1iZXIpCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlByb2ZpbGVMZXZlbFN0cnVjdCwga1BhcmFtSW5kZXhQcm9maWxlTGV2ZWw+CisgICAgICAgIEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUxbXSA9ICJjb2RlZC5wbCI7CisKKy8qKgorICogQ29kZWMtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gZGF0YS4KKyAqCisgKiBUaGlzIGlzIGluaXRpYWxpemF0aW9uIGRhdGEgZm9yIHRoZSBjb2RlYy4KKyAqCisgKiBGb3IgQVZDL0hFVkMsIHRoZXNlIGFyZSB0aGUgY29uY2F0ZW5hdGVkIFNQUy9QUFMvVlBTIE5BTHMuCisgKgorICogVE9ETzogZGVmaW5lIGZvciBvdGhlciBjb2RlY3MuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyQmxvYlZhbHVlLCBrUGFyYW1JbmRleEluaXREYXRhPiBDMlN0cmVhbUluaXREYXRhSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOSVRfREFUQVtdID0gImNvZGVkLmluaXQtZGF0YSI7CisKKy8qKgorICogU3VwcGxlbWVudGFsIERhdGEuCisgKgorICogVGhpcyBpcyBjb2Rpbmctc3BlY2lmaWMgc3VwcGxlbWVudGFsIGluZm9ybWF0aW9uYWwgZGF0YSwgZS5nLiBTRUkgZm9yIEFWQy9IRVZDLgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgbm90IGEgY29uZmlndXJhdGlvbiBzbyBpdCBkb2VzIG5vdCBoYXZlIGEgcGFyYW1ldGVyIGtleS4KKyAqIFRoaXMgc3RydWN0dXJlIHNoYWxsIGJlIHJldHVybmVkIGluIHRoZSBjb25maWd1cmF0aW9uIHVwZGF0ZSwgYW5kIGNhbiBiZSByZXBlYXRlZCBhcyBuZWVkZWQKKyAqIGluIHRoZSBzYW1lIHVwZGF0ZS4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjpzdXBwbGVtZW50YWxfaW5mb190LCB1aW50MzJfdCwKKyAgICBJTkZPX05PTkUgPSAwLAorCisgICAgSU5GT19QUkVGSVhfU0VJX1VOSVQgPSAweDEwMDAwLCAvLy88IHByZWZpeCBTRUkgcGF5bG9hZCB0eXBlcyBhZGQgdGhpcyBmbGFnCisgICAgSU5GT19TVUZGSVhfU0VJX1VOSVQgPSAweDIwMDAwLCAvLy88IHN1ZmZpeCBTRUkgcGF5bG9hZCB0eXBlcyBhZGQgdGhpcyBmbGFnCisKKyAgICBJTkZPX1NFSV9VU0VSX0RBVEEgPSBJTkZPX1BSRUZJWF9TRUlfVU5JVCB8IDQsICAgIC8vLzwgY2xvc2VkLWNhcHRpb25pbmcgZGF0YSAoSVRVLVQgVDM1KQorICAgIElORk9fU0VJX01EQ1YgICAgICA9IElORk9fUFJFRklYX1NFSV9VTklUIHwgMTM3LCAgLy8vPCBtYXN0ZXJpbmcgZGlzcGxheSBjb2xvciB2b2x1bWUKKyAgICBJTkZPX1NFVF9VU0VSX0RBVEFfU0ZYID0gSU5GT19TVUZGSVhfU0VJX1VOSVQgfCA0LCAvLy88IGNsb3NlZC1jYXB0aW9uaW5nIGRhdGEgKElUVS1UIFQzNSkKKworICAgIElORk9fVkVORE9SX1NUQVJUID0gMHg3MDAwMDAwMAorKQorCitzdHJ1Y3QgQzJTdXBwbGVtZW50YWxEYXRhU3RydWN0IHsKKyAgICBDMlN1cHBsZW1lbnRhbERhdGFTdHJ1Y3QoKQorICAgICAgICA6IHR5cGVfKElORk9fTk9ORSkgeyB9CisKKyAgICBDMlN1cHBsZW1lbnRhbERhdGFTdHJ1Y3QoCisgICAgICAgICAgICBzaXplX3QgZmxleENvdW50LCBDMkNvbmZpZzo6c3VwcGxlbWVudGFsX2luZm9fdCB0eXBlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhXykKKyAgICAgICAgOiB0eXBlXyh0eXBlKSB7CisgICAgICAgICAgICBtZW1jcHkoZGF0YSwgJmRhdGFfWzBdLCBjMl9taW4oZGF0YV8uc2l6ZSgpLCBmbGV4Q291bnQpKTsKKyAgICB9CisKKyAgICBDMkNvbmZpZzo6c3VwcGxlbWVudGFsX2luZm9fdCB0eXBlXzsKKyAgICB1aW50OF90IGRhdGFbXTsKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChTdXBwbGVtZW50YWxEYXRhLCBkYXRhKQorICAgIEMyRklFTEQodHlwZV8sICJ0eXBlIikKKyAgICBDMkZJRUxEKGRhdGEsICJkYXRhIikKK307Cit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlN1cHBsZW1lbnRhbERhdGFTdHJ1Y3QsIGtQYXJhbUluZGV4U3VwcGxlbWVudGFsRGF0YT4KKyAgICAgICAgQzJTdHJlYW1TdXBwbGVtZW50YWxEYXRhSW5mbzsKKworLyoqCisgKiBTdXBwbGVtZW50YWwgRGF0YSBTdWJzY3JpcHRpb24KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyQ29uZmlnOjpzdXBwbGVtZW50YWxfaW5mb190PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleFN1YnNjcmliZWRTdXBwbGVtZW50YWxEYXRhPgorICAgICAgICBDMlN0cmVhbVN1YnNjcmliZWRTdXBwbGVtZW50YWxEYXRhVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU1VCU0NSSUJFRF9TVVBQTEVNRU5UQUxfREFUQVtdID0gIm91dHB1dC5zdWJzY3JpYmVkLXN1cHBsZW1lbnRhbCI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGlwZWxpbmUgY2hhcmFjdGVyaXN0aWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBNZWRpYS10eXBlLgorICoKKyAqIFRoaXMgaXMgZGVmaW5lZCBmb3IgYm90aCBwb3J0IGFuZCBzdHJlYW0sIGJ1dCBzdHJlYW0gbWVkaWEgdHlwZSBtYXkgYmUgYSBzdWJ0eXBlIG9mIHRoZQorICogcG9ydCBtZWRpYSB0eXBlLgorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyU2V0dGluZywgQzJTdHJpbmdWYWx1ZSwga1BhcmFtSW5kZXhNZWRpYVR5cGU+IEMyUG9ydE1lZGlhVHlwZVNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFW10gPSAiaW5wdXQubWVkaWEtdHlwZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRVtdID0gIm91dHB1dC5tZWRpYS10eXBlIjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyU2V0dGluZywgQzJTdHJpbmdWYWx1ZSwga1BhcmFtSW5kZXhNZWRpYVR5cGU+IEMyU3RyZWFtTWVkaWFUeXBlU2V0dGluZzsKKworLyoqCisgKiBQaXBlbGluZSBkZWxheXMuCisgKgorICogSW5wdXQgZGVsYXkgaXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGlucHV0IGZyYW1lcyByZXF1ZXN0ZWQgYnkgdGhlIGNvbXBvbmVudCB0byBwcm9jZXNzCisgKiBhbiBpbnB1dCBmcmFtZS4KKyAqCisgKiBPdXRwdXQgZGVsYXkgaXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIG91dHB1dCBmcmFtZXMgdGhhdCBuZWVkIHRvIGJlIGdlbmVyYXRlZCBiZWZvcmUgYW4KKyAqIG91dHB1dCBjYW4gYmUgcmVsZWFzZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAqCisgKiBQaXBlbGluZSBkZWxheSBpcyB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgZnJhbWVzIHRoYXQgYXJlIHByb2Nlc3NlZCBhdCBvbmUgdGltZSBieSB0aGUKKyAqIGNvbXBvbmVudC4KKyAqCisgKiBBcyB0aGVzZSBtYXkgdmFyeSBmcm9tIGZyYW1lIHRvIGZyYW1lLCB0aGUgbnVtYmVyIGlzIHRoZSBtYXhpbXVtIHJlcXVpcmVkIHZhbHVlLiBFLmcuIGlmCisgKiBpbnB1dCBkZWxheSBpcyAwLCB0aGUgY29tcG9uZW50IGlzIGV4cGVjdGVkIHRvIGNvbnN1bWUgZWFjaCBmcmFtZSBxdWV1ZWQgZXZlbiBpZiBubyBmdXJ0aGVyCisgKiBmcmFtZXMgYXJlIHF1ZXVlZC4gU2ltaWxhcmx5LCBpZiBpbnB1dCBkZWxheSBpcyAxLCBhcyBsb25nIGFzIHRoZXJlIGFyZSBhbHdheXMgZXhhY3RseSAyCisgKiBvdXRzdGFuZGluZyBpbnB1dCBmcmFtZXMgcXVldWVkIHRvIHRoZSBjb21wb25lbnQsIGl0IHNoYWxsIHByb2R1Y2Ugb3V0cHV0LgorICovCisKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4RGVsYXlSZXF1ZXN0PiBDMlBvcnRSZXF1ZXN0ZWREZWxheVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX0RFTEFZX1JFUVVFU1RbXSA9ICJpbnB1dC5kZWxheS5yZXF1ZXN0ZWQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZX1JFUVVFU1RbXSA9ICJvdXRwdXQuZGVsYXkucmVxdWVzdGVkIjsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleERlbGF5UmVxdWVzdD4KKyAgICAgICAgQzJSZXF1ZXN0ZWRQaXBlbGluZURlbGF5VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUElQRUxJTkVfREVMQVlfUkVRVUVTVFtdID0gInBpcGVsaW5lLWRlbGF5LnJlcXVlc3RlZCI7CisKKy8vIHJlYWQtb25seQordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhEZWxheT4gQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9ERUxBWVtdID0gImlucHV0LmRlbGF5LmFjdHVhbCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfREVMQVlbXSA9ICJvdXRwdXQuZGVsYXkuYWN0dWFsIjsKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4RGVsYXk+IEMyQWN0dWFsUGlwZWxpbmVEZWxheVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BJUEVMSU5FX0RFTEFZW10gPSAiYWxnby5kZWxheS5hY3R1YWwiOworCisvKioKKyAqIFJlZmVyZW5jZSBjaGFyYWN0ZXJpc3RpY3MuCisgKgorICogVGhlIGNvbXBvbmVudCBtYXkgaG9sZCBvbnRvIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBldmVuIGFmdGVyIGNvbXBsZXRpbmcgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIHdvcmsgaXRlbS4KKyAqCisgKiBNYXggcmVmZXJlbmNlIGFnZSBpcyB0aGUgbG9uZ2VzdCBudW1iZXIgb2YgYWRkaXRpb25hbCBmcmFtZSBwcm9jZXNzaW5nIHRoYXQgYSBjb21wb25lbnQgbWF5CisgKiBob2xkIG9udG8gYSBidWZmZXIgZm9yLiBNYXggcmVmZXJlbmNlIGNvdW50IGlzIHRoZSBudW1iZXIgb2YgYnVmZmVycyB0aGF0IGEgY29tcG9uZW50IG1heQorICogaG9sZCBvbnRvIGF0IHRoZSBzYW1lIHRpbWUgYXQgdGhlIHdvcnN0IGNhc2UuIFRoZXNlIG51bWJlcnMgYXNzdW1lIHNpbmdsZSBmcmFtZSBwZXIgYnVmZmVycy4KKyAqCisgKiBVc2UgbWF4LXVpbnQzMiBpZiB0aGVyZSBpcyBubyBsaW1pdCBmb3IgdGhlIG1heCBhZ2Ugb3IgY291bnQuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhNYXhSZWZlcmVuY2VBZ2U+CisgICAgICAgIEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX1JFRkVSRU5DRV9BR0VbXSA9ICJpbnB1dC5yZWZlcmVuY2UubWF4LWFnZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfTUFYX1JFRkVSRU5DRV9BR0VbXSA9ICJvdXRwdXQucmVmZXJlbmNlLm1heC1hZ2UiOworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4TWF4UmVmZXJlbmNlQ291bnQ+CisgICAgICAgIEMyU3RyZWFtTWF4UmVmZXJlbmNlQ291bnRUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfUkVGRVJFTkNFX0NPVU5UW10gPSAiaW5wdXQucmVmZXJlbmNlLm1heC1jb3VudCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfTUFYX1JFRkVSRU5DRV9DT1VOVFtdID0gIm91dHB1dC5yZWZlcmVuY2UubWF4LWNvdW50IjsKKworLyoqCisgKiBPdXRwdXQgcmVvcmRlcmluZy4KKyAqCisgKiBUaGUgc2l6ZSBvZiB0aGUgd2luZG93IHRvIHVzZSBmb3Igb3V0cHV0IGJ1ZmZlciByZW9yZGVyaW5nLiAwIGlzIGludGVycHJldGVkIGFzIDEuCisgKi8KKy8vIG91dHB1dCBvbmx5Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleFJlb3JkZXJCdWZmZXJEZXB0aD4KKyAgICAgICAgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX1JFT1JERVJfREVQVEhbXSA9ICJvdXRwdXQucmVvcmRlci5kZXB0aCI7CisKK0MyRU5VTShDMkNvbmZpZzo6b3JkaW5hbF9rZXlfdCwgdWludDMyX3QsCisgICAgICAgIE9SRElOQUwsCisgICAgICAgIFRJTUVTVEFNUCwKKyAgICAgICAgQ1VTVE9NKQorCisvLyByZWFkLW9ubHksIG91dHB1dCBvbmx5Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6b3JkaW5hbF9rZXlfdD4sIGtQYXJhbUluZGV4UmVvcmRlcktleT4KKyAgICAgICAgQzJQb3J0UmVvcmRlcktleVNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfUkVPUkRFUl9LRVlbXSA9ICJvdXRwdXQucmVvcmRlci5rZXkiOworCisvKioKKyAqIFN0cmVhbSBjb3VudC4KKyAqLworLy8gcHJpdmF0ZQordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhTdHJlYW1Db3VudD4gQzJQb3J0U3RyZWFtQ291bnRUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQ09VTlRbXSA9ICJpbnB1dC5zdHJlYW0tY291bnQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9DT1VOVFtdID0gIm91dHB1dC5zdHJlYW0tY291bnQiOworCisvKioKKyAqIENvbmZpZyB1cGRhdGUgc3Vic2NyaXB0aW9uLgorICovCisvLyBwcml2YXRlCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyVWludDMyQXJyYXksIGtQYXJhbUluZGV4U3Vic2NyaWJlZFBhcmFtSW5kaWNlcz4KKyAgICAgICAgQzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU1VCU0NSSUJFRF9QQVJBTV9JTkRJQ0VTW10gPSAib3V0cHV0LnN1YnNjcmliZWQtaW5kaWNlcyI7CisKKy8qKgorICogU3VnZ2VzdGVkIGJ1ZmZlciAoQzJGcmFtZSkgY291bnQuIFRoaXMgaXMgYSBzdWdnZXN0aW9uIGJ5IHRoZSBjb21wb25lbnQgZm9yIHRoZSBudW1iZXIgb2YKKyAqIGlucHV0IGFuZCBvdXRwdXQgZnJhbWVzIGFsbG9jYXRlZCBmb3IgdGhlIGNvbXBvbmVudCdzIHVzZSBpbiB0aGUgYnVmZmVyIHBvb2xzLgorICoKKyAqIENvbXBvbmVudCBzaGFsbCBzZXQgdGhlIGFjY2VwdGFibGUgcmFuZ2Ugb2YgYnVmZmVycyBhbGxvY2F0ZWQgZm9yIGl0LiBFLmcuIGNsaWVudCBzaGFsbAorICogYWxsb2NhdGUgYXQgbGVhc3QgdGhlIG1pbmltdW0gcmVxdWlyZWQgdmFsdWUuCisgKi8KKy8vIHJlYWQtb25seQordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50NjRBcnJheSwga1BhcmFtSW5kZXhTdWdnZXN0ZWRCdWZmZXJDb3VudD4KKyAgICAgICAgQzJQb3J0U3VnZ2VzdGVkQnVmZmVyQ291bnRUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVUdHRVNURURfQlVGRkVSX0NPVU5UW10gPSAiaW5wdXQuYnVmZmVycy5wb29sLXNpemUiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX1NVR0dFU1RFRF9CVUZGRVJfQ09VTlRbXSA9ICJvdXRwdXQuYnVmZmVycy5wb29sLXNpemUiOworCisvKioKKyAqIElucHV0L291dHB1dCBiYXRjaGluZy4KKyAqCisgKiBGb3IgaW5wdXQsIGNvbXBvbmVudCByZXF1ZXN0cyB0aGF0IGNsaWVudCBiYXRjaGVzIHdvcmsgaW4gYmF0Y2hlcyBvZiBzcGVjaWZpZWQgc2l6ZS4gRm9yIG91dHB1dCwKKyAqIGNsaWVudCByZXF1ZXN0cyB0aGF0IHRoZSBjb21wb25lbnQgYmF0Y2hlcyB3b3JrIGNvbXBsZXRpb24gaW4gZ2l2ZW4gYmF0Y2ggc2l6ZS4KKyAqIFZhbHVlIDAgbWVhbnMgZG9uJ3QgY2FyZS4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50NjRBcnJheSwga1BhcmFtSW5kZXhCYXRjaFNpemU+IEMyUG9ydEJhdGNoU2l6ZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX0JBVENIX1NJWkVbXSA9ICJpbnB1dC5idWZmZXJzLmJhdGNoLXNpemUiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0JBVENIX1NJWkVbXSA9ICJvdXRwdXQuYnVmZmVycy5iYXRjaC1zaXplIjsKKworLyoqCisgKiBDdXJyZW50ICYgbGFzdCB3b3JrIG9yZGluYWxzLgorICoKKyAqIGlucHV0IHBvcnQ6IGxhc3Qgd29yayBxdWV1ZWQgdG8gY29tcG9uZW50LgorICogb3V0cHV0IHBvcnQ6IGxhc3Qgd29yayBjb21wbGV0ZWQgYnkgY29tcG9uZW50LgorICogZ2xvYmFsOiBjdXJyZW50IHdvcmsuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyV29ya09yZGluYWxTdHJ1Y3QsIGtQYXJhbUluZGV4TGFzdFdvcmtRdWV1ZWQ+IEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc7Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyV29ya09yZGluYWxTdHJ1Y3QsIGtQYXJhbUluZGV4Q3VycmVudFdvcms+IEMyQ3VycmVudFdvcmtUdW5pbmc7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtZW1vcnkgYWxsb2NhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogQWxsb2NhdG9ycyB0byB1c2UuCisgKgorICogVGhlc2UgYXJlIHJlcXVlc3RlZCBieSB0aGUgY29tcG9uZW50LgorICoKKyAqIElmIG5vbmUgc3BlY2lmaWVkLCBjbGllbnQgd2lsbCB1c2UgdGhlIGRlZmF1bHQgYWxsb2NhdG9yIElEIGJhc2VkIG9uIHRoZSBjb21wb25lbnQgZG9tYWluIGFuZAorICoga2luZC4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMkFsbG9jYXRvcjo6aWRfdD4sIGtQYXJhbUluZGV4QWxsb2NhdG9ycz4KKyAgICAgICAgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX0FMTE9DQVRPUlNbXSA9ICJpbnB1dC5idWZmZXJzLmFsbG9jYXRvci1pZHMiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0FMTE9DQVRPUlNbXSA9ICJvdXRwdXQuYnVmZmVycy5hbGxvY2F0b3ItaWRzIjsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyQWxsb2NhdG9yOjppZF90Piwga1BhcmFtSW5kZXhBbGxvY2F0b3JzPgorICAgICAgICBDMlByaXZhdGVBbGxvY2F0b3JzVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUFJJVkFURV9BTExPQ0FUT1JTW10gPSAiYWxnby5idWZmZXJzLmFsbG9jYXRvci1pZHMiOworCisvKioKKyAqIEFsbG9jYXRvciB0byB1c2UgZm9yIG91dHB1dHRpbmcgdG8gc3VyZmFjZS4KKyAqCisgKiBDb21wb25lbnRzIGNhbiBvcHRpb25hbGx5IHJlcXVlc3QgYWxsb2NhdG9yIHR5cGUgZm9yIG91dHB1dHRpbmcgdG8gc3VyZmFjZS4KKyAqCisgKiBJZiBub25lIHNwZWNpZmllZCwgY2xpZW50IHdpbGwgdXNlIHRoZSBkZWZhdWx0IEJ1ZmZlclF1ZXVlLWJhY2tlZCBhbGxvY2F0b3IgSUQgZm9yIG91dHB1dHRpbmcgdG8KKyAqIHN1cmZhY2UuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4U3VyZmFjZUFsbG9jYXRvcj4KKyAgICAgICAgQzJQb3J0U3VyZmFjZUFsbG9jYXRvclR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9TVVJGQUNFX0FMTE9DQVRPUltdID0gIm91dHB1dC5idWZmZXJzLnN1cmZhY2UtYWxsb2NhdG9yLWlkIjsKKworLyoqCisgKiBCbG9jayBwb29scyB0byB1c2UuCisgKgorICogVGhlc2UgYXJlIGFsbG9jYXRlZCBieSB0aGUgY2xpZW50IGZvciB0aGUgY29tcG9uZW50IHVzaW5nIHRoZSBhbGxvY2F0b3IgSURzIHNwZWNpZmllZCBieSB0aGUKKyAqIGNvbXBvbmVudC4gVGhpcyBpcyBub3QgdXNlZCBmb3IgdGhlIGlucHV0IHBvcnQuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Q+LCBrUGFyYW1JbmRleEJsb2NrUG9vbHM+CisgICAgICAgIEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfQkxPQ0tfUE9PTFNbXSA9ICJvdXRwdXQuYnVmZmVycy5wb29sLWlkcyI7CisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdD4sIGtQYXJhbUluZGV4QmxvY2tQb29scz4KKyAgICAgICAgQzJQcml2YXRlQmxvY2tQb29sc1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BSSVZBVEVfQkxPQ0tfUE9PTFNbXSA9ICJhbGdvLmJ1ZmZlcnMucG9vbC1pZHMiOworCisvKioKKyAqIFRoZSBtYXggbnVtYmVyIG9mIHByaXZhdGUgYWxsb2NhdGlvbnMgYXQgYW55IG9uZSB0aW1lIGJ5IHRoZSBjb21wb25lbnQuCisgKiAoVGhpcyBpcyBhbiBhcnJheSB3aXRoIGEgY29ycmVzcG9uZGluZyB2YWx1ZSBmb3IgZWFjaCBwcml2YXRlIGFsbG9jYXRvcikKKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMkFycmF5LCBrUGFyYW1JbmRleE1heFJlZmVyZW5jZUNvdW50PgorICAgICAgICBDMk1heFByaXZhdGVCdWZmZXJDb3VudFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX01BWF9QUklWQVRFX0JVRkZFUl9DT1VOVFtdID0gImFsZ28uYnVmZmVycy5tYXgtY291bnQiOworCisvKioKKyAqIEJ1ZmZlciB0eXBlCisgKgorICogVGhpcyBpcyBwcm92aWRlZCBieSB0aGUgY29tcG9uZW50IGZvciB0aGUgY2xpZW50IHRvIGFsbG9jYXRlIHRoZSBwcm9wZXIgYnVmZmVyIHR5cGUgZm9yIHRoZQorICogaW5wdXQgcG9ydCwgYW5kIGNhbiBiZSBwcm92aWRlZCBieSB0aGUgY2xpZW50IHRvIGNvbnRyb2wgdGhlIGJ1ZmZlciB0eXBlIGZvciB0aGUgb3V0cHV0LgorICovCisvLyBwcml2YXRlCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyRWFzeUVudW08QzJCdWZmZXJEYXRhOjp0eXBlX3Q+PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleEJ1ZmZlclR5cGU+CisgICAgICAgIEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEVbXSA9ICJpbnB1dC5idWZmZXJzLnR5cGUiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRVtdID0gIm91dHB1dC5idWZmZXJzLnR5cGUiOworCisvKioKKyAqIE1lbW9yeSB1c2FnZS4KKyAqCisgKiBTdWdnZXN0ZWQgYnkgY29tcG9uZW50IGZvciBpbnB1dCBhbmQgbmVnb3RpYXRlZCBiZXR3ZWVuIGNsaWVudCBhbmQgY29tcG9uZW50IGZvciBvdXRwdXQuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJVaW50NjRWYWx1ZSwga1BhcmFtSW5kZXhVc2FnZT4gQzJTdHJlYW1Vc2FnZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9VU0FHRVtdID0gImlucHV0LmJ1ZmZlcnMudXNhZ2UiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9VU0FHRVtdID0gIm91dHB1dC5idWZmZXJzLnVzYWdlIjsKKworLyoqCisgKiBQaWN0dXJlICh2aWRlbyBvciBpbWFnZSBmcmFtZSkgc2l6ZS4KKyAqLworc3RydWN0IEMyUGljdHVyZVNpemVTdHJ1Y3QgeworICAgIGlubGluZSBDMlBpY3R1cmVTaXplU3RydWN0KCkKKyAgICAgICAgOiB3aWR0aCgwKSwgaGVpZ2h0KDApIHsgfQorCisgICAgaW5saW5lIEMyUGljdHVyZVNpemVTdHJ1Y3QodWludDMyX3Qgd2lkdGhfLCB1aW50MzJfdCBoZWlnaHRfKQorICAgICAgICA6IHdpZHRoKHdpZHRoXyksIGhlaWdodChoZWlnaHRfKSB7IH0KKworICAgIHVpbnQzMl90IHdpZHRoOyAgICAgLy8vPCB2aWRlbyB3aWR0aAorICAgIHVpbnQzMl90IGhlaWdodDsgICAgLy8vPCB2aWRlbyBoZWlnaHQKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoUGljdHVyZVNpemUpCisgICAgQzJGSUVMRCh3aWR0aCwgIndpZHRoIikKKyAgICBDMkZJRUxEKGhlaWdodCwgImhlaWdodCIpCit9OworCisvKioKKyAqIE91dCBvZiBtZW1vcnkgc2lnbmFsaW5nCisgKgorICogVGhpcyBpcyBhIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjbGllbnQgdG8gbWFyayB0aGF0IGl0IGNhbm5vdCBhbGxvY2F0ZSBuZWNlc3NhcnkgcHJpdmF0ZSBhbmQvCisgKiBvciBvdXRwdXQgYnVmZmVycyB0byBjb250aW51ZSBvcGVyYXRpb24sIGFuZCB0byBzaWduYWwgdGhlIGZhaWxpbmcgY29uZmlndXJhdGlvbi4KKyAqLworc3RydWN0IEMyT3V0T2ZNZW1vcnlTdHJ1Y3QgeworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IHBvb2w7ICAgLy8vPCBwb29sIElEIHRoYXQgZmFpbGVkIHRoZSBhbGxvY2F0aW9uCisgICAgdWludDY0X3QgdXNhZ2U7ICAgICAgICAgICAgICAgICAvLy88IG1lbW9yeSB1c2FnZSB1c2VkCisgICAgQzJQaWN0dXJlU2l6ZVN0cnVjdCBwbGFuYXI7ICAgICAvLy88IGJ1ZmZlciBkaW1lbnNpb25zIHRvIGJlIGFsbG9jYXRlZCBpZiAyRAorICAgIHVpbnQzMl90IGZvcm1hdDsgICAgICAgICAgICAgICAgLy8vPCBwaXhlbCBmb3JtYXQgdG8gYmUgdXNlZCBpZiAyRAorICAgIHVpbnQzMl90IGNhcGFjaXR5OyAgICAgICAgICAgICAgLy8vPCBidWZmZXIgY2FwYWNpdHkgdG8gYmUgYWxsb2NhdGVkIGlmIDFECisgICAgYzJfYm9vbF90IG91dE9mTWVtb3J5OyAgICAgICAgICAgLy8vPCB0cnVlIGlmIGNvbXBvbmVudCBpcyBvdXQgb2YgbWVtb3J5CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKE91dE9mTWVtb3J5KQorICAgIEMyRklFTEQocG9vbCwgInBvb2wiKQorICAgIEMyRklFTEQodXNhZ2UsICJ1c2FnZSIpCisgICAgQzJGSUVMRChwbGFuYXIsICJwbGFuYXIiKQorICAgIEMyRklFTEQoZm9ybWF0LCAiZm9ybWF0IikKKyAgICBDMkZJRUxEKGNhcGFjaXR5LCAiY2FwYWNpdHkiKQorICAgIEMyRklFTEQob3V0T2ZNZW1vcnksICJvdXQtb2YtbWVtb3J5IikKK307CisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJPdXRPZk1lbW9yeVN0cnVjdCwga1BhcmFtSW5kZXhPdXRPZk1lbW9yeT4gQzJPdXRPZk1lbW9yeVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVF9PRl9NRU1PUllbXSA9ICJhbGdvLm9vbSI7CisKKy8qKgorICogTWF4IGJ1ZmZlciBzaXplCisgKgorICogVGhpcyBpcyBhIGhpbnQgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudCBmb3IgdGhlIG1heGltdW0gYnVmZmVyIHNpemUgZXhwZWN0ZWQgb24gYSBzdHJlYW0gZm9yIHRoZQorICogY3VycmVudCBjb25maWd1cmF0aW9uIG9uIGl0cyBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMuIFRoaXMgaXMgY29tbXVuaWNhdGVkIHRvIGNsaWVudHMgc28gdGhleQorICogY2FuIHByZWFsbG9jYXRlIGlucHV0IGJ1ZmZlcnMsIG9yIGNvbmZpZ3VyZSBkb3duc3RyZWFtIGNvbXBvbmVudHMgdGhhdCByZXF1aXJlIGEgbWF4aW11bSBzaXplIG9uCisgKiB0aGVpciBidWZmZXJzLgorICoKKyAqIFJlYWQtb25seS4gUmVxdWlyZWQgdG8gYmUgcHJvdmlkZWQgYnkgY29tcG9uZW50cyBvbiBhbGwgY29tcHJlc3NlZCBzdHJlYW1zLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleE1heEJ1ZmZlclNpemU+IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkVbXSA9ICJpbnB1dC5idWZmZXJzLm1heC1zaXplIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9NQVhfQlVGRkVSX1NJWkVbXSA9ICJvdXRwdXQuYnVmZmVycy5tYXgtc2l6ZSI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWlzYy4gc3RhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFRyaXBwZWQgc3RhdGUsCisgKgorICogVGhpcyBzdGF0ZSBleGlzdHMgdG8gYmUgYWJsZSB0byBwcm92aWRlIHJlYXNvbmluZyBmb3IgYSB0cmlwcGVkIHN0YXRlIGR1cmluZyBub3JtYWwKKyAqIGludGVyZmFjZSBvcGVyYXRpb25zLCBhcyB3ZWxsIGFzIHRvIGFsbG93IGNsaWVudCB0byB0cmlwIHRoZSBjb21wb25lbnQgb24gZGVtYW5kLgorICovCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyQm9vbFZhbHVlLCBrUGFyYW1JbmRleFRyaXBwZWQ+CisgICAgICAgIEMyVHJpcHBlZFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1RSSVBQRURbXSA9ICJhbGdvLnRyaXBwZWQiOworCisvKioKKyAqIENvbmZpZ3VyYXRpb24gY291bnRlcnMuCisgKgorICogQ29uZmlndXJhdGlvbnMgYXJlIHRyYWNrZWQgdXNpbmcgdGhyZWUgY291bnRlcnMuIFRoZSBpbnB1dCBjb3VudGVyIGlzIGluY3JlbWVudGVkIGV4YWN0bHkKKyAqIG9uY2Ugd2l0aCBlYWNoIHdvcmsgYWNjZXB0ZWQgYnkgdGhlIGNvbXBvbmVudC4gVGhlIG91dHB1dCBjb3VudGVyIGlzIGluY3JlbWVudGVkIGV4YWN0bHkKKyAqIG9uY2Ugd2l0aCBlYWNoIHdvcmsgY29tcGxldGVkIGJ5IHRoZSBjb21wb25lbnQgKGluIHRoZSBvcmRlciBvZiB3b3JrIGNvbXBsZXRpb24pLiBUaGUKKyAqIGdsb2JhbCBjb3VudGVyIGlzIGluY3JlbWVudGVkIGV4YWN0bHkgb25jZSBkdXJpbmcgdG8gZWFjaCBjb25maWcoKSBjYWxsLiBUaGVzZSBjb3VudGVycworICogc2hhbGwgYmUgcmVhZC1vbmx5LgorICoKKyAqIFRPRE86IHRoZXNlIHNob3VsZCBiZSBjb3VudGVycy4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50NjRWYWx1ZSwga1BhcmFtSW5kZXhDb25maWdDb3VudGVyPiBDMlBvcnRDb25maWdDb3VudGVyVHVuaW5nOwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQ2NFZhbHVlLCBrUGFyYW1JbmRleENvbmZpZ0NvdW50ZXI+IEMyQ29uZmlnQ291bnRlclR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX0NPVU5URVJbXSA9ICJpbnB1dC5idWZmZXJzLmNvdW50ZXIiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0NPVU5URVJbXSA9ICJvdXRwdXQuYnVmZmVycy5jb3VudGVyIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPTkZJR19DT1VOVEVSW10gPSAiYWxnby5jb25maWcuY291bnRlciI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJlc291cmNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFJlc291cmNlcyBuZWVkZWQgYW5kIHJlc291cmNlcyByZXNlcnZlZCBmb3IgY3VycmVudCBjb25maWd1cmF0aW9uLgorICoKKyAqIFJlc291cmNlcyBhcmUgdHJhY2tlZCBhcyBhIHZlY3RvciBvZiBwb3NpdGl2ZSBudW1iZXJzLiBBdmFpbGFibGUgcmVzb3VyY2VzIGFyZSBkZWZpbmVkIGJ5CisgKiB0aGUgdmVuZG9yLgorICoKKyAqIEJ5IGRlZmF1bHQsIG5vIHJlc291cmNlcyBhcmUgcmVzZXJ2ZWQgZm9yIGEgY29tcG9uZW50LiBJZiByZXNvdXJjZSByZXNlcnZhdGlvbiBpcyBzdWNjZXNzZnVsLAorICogdGhlIGNvbXBvbmVudCBzaGFsbCBiZSBhYmxlIHRvIHVzZSB0aG9zZSByZXNvdXJjZXMgZXhjbHVzaXZlbHkuIElmIGhvd2V2ZXIsIHRoZSBjb21wb25lbnQgaXMKKyAqIG5vdCB1c2luZyBhbGwgb2YgdGhlIHJlc2VydmVkIHJlc291cmNlcywgdGhvc2UgbWF5IGJlIHNoYXJlZCB3aXRoIG90aGVyIGNvbXBvbmVudHMuCisgKgorICogVE9ETzogZGVmaW5lIHNvbWUgb2YgdGhlIHJlc291cmNlcy4KKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQ2NEFycmF5LCBrUGFyYW1JbmRleFJlc291cmNlc05lZWRlZD4gQzJSZXNvdXJjZXNOZWVkZWRUdW5pbmc7Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyVWludDY0QXJyYXksIGtQYXJhbUluZGV4UmVzb3VyY2VzUmVzZXJ2ZWQ+CisgICAgICAgIEMyUmVzb3VyY2VzUmVzZXJ2ZWRUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9SRVNPVVJDRVNfTkVFREVEW10gPSAicmVzb3VyY2VzLm5lZWRlZCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9SRVNPVVJDRVNfUkVTRVJWRURbXSA9ICJyZXNvdXJjZXMucmVzZXJ2ZWQiOworCisvKioKKyAqIE9wZXJhdGluZyByYXRlLgorICoKKyAqIE9wZXJhdGluZyByYXRlIGlzIHRoZSBleHBlY3RlZCByYXRlIG9mIHdvcmsgdGhyb3VnaCB0aGUgY29tcG9uZW50LiBOZWdhdGl2ZSB2YWx1ZXMgaXMKKyAqIGludmFsaWQuCisgKgorICogVE9ETzogdGhpcyBjb3VsZCBkaXN0aW5ndWlzaCBzZXQgdmFsdWUKKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4T3BlcmF0aW5nUmF0ZT4gQzJPcGVyYXRpbmdSYXRlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1BFUkFUSU5HX1JBVEVbXSA9ICJhbGdvLnJhdGUiOworCisvKioKKyAqIFJlYWx0aW1lIC8gb3BlcmF0aW5nIHBvaW50LgorICoKKyAqIFByaW9yaXR5IHZhbHVlIGRlZmluZXMgdGhlIG9wZXJhdGluZyBwb2ludCBmb3IgdGhlIGNvbXBvbmVudC4gT3BlcmF0aW5nIHBvaW50cyBhcmUgZGVmaW5lZCBieQorICogdGhlIHZlbmRvci4gUHJpb3JpdHkgdmFsdWUgb2YgMCBtZWFucyB0aGF0IHRoZSBjbGllbnQgcmVxdWlyZXMgb3BlcmF0aW9uIGF0IHRoZSBnaXZlbiBvcGVyYXRpbmcKKyAqIHJhdGUuIFByaW9yaXR5IHZhbHVlcyAtMSBhbmQgYmVsb3cgZGVmaW5lIG9wZXJhdGluZyBwb2ludHMgaW4gZGVjcmVhc2luZyBwZXJmb3JtYW5jZS4gSW4gdGhpcworICogY2FzZSBjbGllbnQgZXhwZWN0cyBiZXN0IGVmZm9ydCB3aXRob3V0IGV4Y2VlZGluZyB0aGUgc3BlY2lmaWMgb3BlcmF0aW5nIHBvaW50LiBUaGlzIGFsbG93cworICogY2xpZW50IHRvIHJ1biBjb21wb25lbnRzIGRlZXBlciBpbiB0aGUgYmFja2dyb3VuZCBieSB1c2luZyBsYXJnZXIgcHJpb3JpdHkgdmFsdWVzLiBJbiB0aGVzZQorICogY2FzZXMgb3BlcmF0aW5nIHJhdGUgaXMgYSBoaW50IGZvciB0aGUgbWF4aW11bSByYXRlIHRoYXQgdGhlIGNsaWVudCBhbnRpY2lwYXRlcy4KKyAqCisgKiBPcGVyYXRpbmcgcmF0ZSBhbmQgcHJpb3JpdHkgYXJlIHVzZWQgaW4gdGFuZGVtLiBFLmcuIGlmIHRoZXJlIGFyZSBjb21wb25lbnRzIHRoYXQgcnVuIGF0IGEKKyAqIGhpZ2hlciBvcGVyYXRpbmcgcG9pbnQgKHByaW9yaXR5KSBpdCB3aWxsIG1ha2UgbW9yZSByZXNvdXJjZXMgYXZhaWxhYmxlIGZvciBjb21wb25lbnRzIGF0CisgKiBhIGxvd2VyIG9wZXJhdGluZyBwb2ludCwgc28gb3BlcmF0aW5nIHJhdGUgY2FuIGJlIHVzZWQgdG8gZ2F0ZSB0aG9zZSBjb21wb25lbnRzLgorICoKKyAqIFBvc2l0aXZlIHByaW9yaXR5IHZhbHVlcyBhcmUgbm90IGRlZmluZWQgYXQgdGhlIG1vbWVudCBhbmQgc2hhbGwgYmUgdHJlYXRlZCBlcXVpdmFsZW50IHRvIDAuCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJJbnQzMlZhbHVlLCBrUGFyYW1JbmRleFJlYWxUaW1lUHJpb3JpdHk+CisgICAgICAgIEMyUmVhbFRpbWVQcmlvcml0eVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BSSU9SSVRZW10gPSAiYWxnby5wcmlvcml0eSI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJvdGVjdGVkIGNvbnRlbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFNlY3VyZSBtb2RlLgorICovCitDMkVOVU0oQzJDb25maWc6OnNlY3VyZV9tb2RlX3QsIHVpbnQzMl90LAorICAgIFNNX1VOUFJPVEVDVEVELCAgICAvLy88IG5vIGNvbnRlbnQgcHJvdGVjdGlvbgorICAgIFNNX1JFQURfUFJPVEVDVEVELCAvLy88IGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBzaGFsbCBiZSBwcm90ZWN0ZWQgZnJvbSByZWFkaW5nCispCisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6c2VjdXJlX21vZGVfdD4sIGtQYXJhbUluZGV4U2VjdXJlTW9kZT4KKyAgICAgICAgQzJTZWN1cmVNb2RlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU0VDVVJFX01PREVbXSA9ICJhbGdvLnNlY3VyZS1tb2RlIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFTkNPREVSIENPTVBPTkVOVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIEJpdHJhdGUKKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhCaXRyYXRlPiBDMlN0cmVhbUJpdHJhdGVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQklUUkFURVtdID0gImNvZGVkLmJpdHJhdGUiOworCisvKioKKyAqIEJpdHJhdGUgbW9kZS4KKyAqCisgKiBUT0RPOiByZWZpbmUgdGhpcyB3aXRoIGJpdHJhdGUgcmFuZ2VzIGFuZCBzdWdnZXN0ZWQgd2luZG93CisgKi8KK0MyRU5VTShDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QsIHVpbnQzMl90LAorICAgIEJJVFJBVEVfQ09OU1RfU0tJUF9BTExPV0VEID0gMCwgICAgICAvLy88IGNvbnN0YW50IGJpdHJhdGUsIGZyYW1lIHNraXBwaW5nIGFsbG93ZWQKKyAgICBCSVRSQVRFX0NPTlNUID0gMSwgICAgICAgICAgICAgICAgICAgLy8vPCBjb25zdGFudCBiaXRyYXRlLCBrZWVwIGFsbCBmcmFtZXMKKyAgICBCSVRSQVRFX1ZBUklBQkxFX1NLSVBfQUxMT1dFRCA9IDIsICAgLy8vPCBiaXRyYXRlIGNhbiB2YXJ5LCBmcmFtZSBza2lwcGluZyBhbGxvd2VkCisgICAgQklUUkFURV9WQVJJQUJMRSA9IDMsICAgICAgICAgICAgICAgIC8vLzwgYml0cmF0ZSBjYW4gdmFyeSwga2VlcCBhbGwgZnJhbWVzCisgICAgQklUUkFURV9JR05PUkUgPSA3LCAgICAgICAgICAgICAgICAgIC8vLzwgYml0cmF0ZSBjYW4gYmUgZXhjZWVkZWQgYXQgd2lsbCB0byBhY2hpZXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcXVhbGl0eSBvciBvdGhlciBzZXR0aW5ncworCisgICAgLy8gYml0cmF0ZSBtb2RlcyBhcmUgY29tcG9zZWQgb2YgdGhlIGZvbGxvd2luZyBmbGFncworICAgIEJJVFJBVEVfRkxBR19LRUVQX0FMTF9GUkFNRVMgPSAxLAorICAgIEJJVFJBVEVfRkxBR19DQU5fVkFSWSA9IDIsCisgICAgQklUUkFURV9GTEFHX0NBTl9FWENFRUQgPSA0LAorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OmJpdHJhdGVfbW9kZV90PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleEJpdHJhdGVNb2RlPgorICAgICAgICBDMlN0cmVhbUJpdHJhdGVNb2RlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQklUUkFURV9NT0RFW10gPSAiYWxnby5iaXRyYXRlLW1vZGUiOworCisvKioKKyAqIFF1YWxpdHkuCisgKgorICogVGhpcyBpcyBkZWZpbmVkIGJ5IGVhY2ggY29tcG9uZW50LCB0aGUgaGlnaGVyIHRoZSBiZXR0ZXIgdGhlIG91dHB1dCBxdWFsaXR5IGF0IHRoZSBleHBlbnNlIG9mCisgKiBsZXNzIGNvbXByZXNzaW9uIGVmZmljaWVuY3kuIFRoaXMgc2V0dGluZyBpcyBkZWZpbmVkIGZvciB0aGUgb3V0cHV0IHN0cmVhbXMgaW4gY2FzZSB0aGUKKyAqIGNvbXBvbmVudCBjYW4gc3VwcG9ydCB2YXJ5aW5nIHF1YWxpdHkgb24gZWFjaCBzdHJlYW0sIG9yIGFzIGFuIG91dHB1dCBwb3J0IHR1bmluZyBpbiBjYXNlIHRoZQorICogcXVhbGl0eSBpcyBnbG9iYWwgdG8gYWxsIHN0cmVhbXMuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhRdWFsaXR5PiBDMlN0cmVhbVF1YWxpdHlUdW5pbmc7Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleFF1YWxpdHk+IEMyUXVhbGl0eVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1FVQUxJVFlbXSA9ICJhbGdvLnF1YWxpdHkiOworCisvKioKKyAqIENvbXBsZXhpdHkuCisgKgorICogVGhpcyBpcyBkZWZpbmVkIGJ5IGVhY2ggY29tcG9uZW50LCB0aGlzIGhpZ2hlciB0aGUgdmFsdWUsIHRoZSBtb3JlIHJlc291cmNlcyB0aGUgY29tcG9uZW50CisgKiB3aWxsIHVzZSB0byBwcm9kdWNlIGJldHRlciBxdWFsaXR5IGF0IHRoZSBzYW1lIGNvbXByZXNzaW9uIGVmZmljaWVuY3kgb3IgYmV0dGVyIGNvbXByZXNzaW9uCisgKiBlZmZpY2llbmN5IGF0IHRoZSBzYW1lIHF1YWxpdHkuIFRoaXMgc2V0dGluZyBpcyBkZWZpbmVkIGZvciB0aGUgb3V0cHV0IHN0cmVhbXMgaW4gY2FzZSB0aGUKKyAqIGNvbXBvbmVudCBjYW4gc3VwcG9ydCB2YXJ5aW5nIGNvbXBsZXhpdHkgb24gZWFjaCBzdHJlYW0sIG9yIGFzIGFuIG91dHB1dCBwb3J0IHR1bmluZyBpbiBjYXNlIHRoZQorICogcXVhbGl0eSBpcyBnbG9iYWwgdG8gYWxsIHN0cmVhbXMKKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleENvbXBsZXhpdHk+IEMyU3RyZWFtQ29tcGxleGl0eVR1bmluZzsKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4Q29tcGxleGl0eT4gQzJDb21wbGV4aXR5VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09NUExFWElUWVtdID0gImFsZ28uY29tcGxleGl0eSI7CisKKy8qKgorICogSGVhZGVyIChpbml0LWRhdGEpIGhhbmRsaW5nIGFyb3VuZCBzeW5jIGZyYW1lcy4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjpwcmVwZW5kX2hlYWRlcl9tb2RlX3QsIHVpbnQzMl90LAorICAgIC8qKgorICAgICAqIGRvbid0IHByZXBlbmQgaGVhZGVyLiBTaWduYWwgaGVhZGVyIG9ubHkgdGhyb3VnaCBDMlN0cmVhbUluaXREYXRhSW5mby4KKyAgICAgKi8KKyAgICBQUkVQRU5EX0hFQURFUl9UT19OT05FLAorCisgICAgLyoqCisgICAgICogcHJlcGVuZCBoZWFkZXIgYmVmb3JlIHRoZSBmaXJzdCBvdXRwdXQgZnJhbWUgYW5kIHRoZXJlYWZ0ZXIgYmVmb3JlIHRoZSBuZXh0IHN5bmMgZnJhbWUKKyAgICAgKiBpZiBpdCBjaGFuZ2VzLgorICAgICAqLworICAgIFBSRVBFTkRfSEVBREVSX09OX0NIQU5HRSwKKworICAgIC8qKgorICAgICAqIHByZXBlbmQgaGVhZGVyIGJlZm9yZSBldmVyeSBzeW5jIGZyYW1lLgorICAgICAqLworICAgIFBSRVBFTkRfSEVBREVSX1RPX0FMTF9TWU5DLAorKQorCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMkJvb2xWYWx1ZSwga1BhcmFtSW5kZXhQcmVwZW5kSGVhZGVyTW9kZT4KKyAgICAgICAgQzJQcmVwZW5kSGVhZGVyTW9kZVNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QUkVQRU5EX0hFQURFUl9NT0RFW10gPSAib3V0cHV0LmJ1ZmZlcnMucHJlcGVuZC1oZWFkZXIiOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJTUFHRS9WSURFTyBDT01QT05FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qCisgKiBPcmRlciBvZiB0cmFuc2Zvcm1hdGlvbiBpczoKKyAqCisgKiBjcm9wID0+IChzY2FsaW5nID0+IHNjYWxlZC1jcm9wKSA9PiBzYW1wbGUtYXNwZWN0LXJhdGlvID0+IGZsaXAgPT4gcm90YXRpb24KKyAqLworCisvKioKKyAqIFBpY3R1cmUgKGltYWdlLSBhbmQgdmlkZW8gZnJhbWUpIHNpemUuCisgKgorICogVGhpcyBpcyB1c2VkIGZvciB0aGUgb3V0cHV0IG9mIHRoZSB2aWRlbyBkZWNvZGVyLCBhbmQgdGhlIGlucHV0IG9mIHRoZSB2aWRlbyBlbmNvZGVyLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlBpY3R1cmVTaXplU3RydWN0LCBrUGFyYW1JbmRleFBpY3R1cmVTaXplPiBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRVtdID0gInJhdy5zaXplIjsKKworLyoqCisgKiBDcm9wIHJlY3RhbmdsZS4KKyAqLworc3RydWN0IEMyUmVjdFN0cnVjdCA6IEMyUmVjdCB7CisgICAgQzJSZWN0U3RydWN0KCkgPSBkZWZhdWx0OworICAgIEMyUmVjdFN0cnVjdChjb25zdCBDMlJlY3QgJnJlY3QpIDogQzJSZWN0KHJlY3QpIHsgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyUmVjdFN0cnVjdCAmKSA9IGRlbGV0ZTsKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgQzJSZWN0U3RydWN0ICYpID0gZGVsZXRlOworCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9CQVNFX0MyU1RSVUNUKFJlY3QpCisgICAgQzJGSUVMRCh3aWR0aCwgIndpZHRoIikKKyAgICBDMkZJRUxEKGhlaWdodCwgImhlaWdodCIpCisgICAgQzJGSUVMRChsZWZ0LCAibGVmdCIpCisgICAgQzJGSUVMRCh0b3AsICJ0b3AiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJSZWN0U3RydWN0LCBrUGFyYW1JbmRleENyb3BSZWN0PiBDMlN0cmVhbUNyb3BSZWN0SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NST1BfUkVDVFtdID0gInJhdy5jcm9wIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPREVEX0NST1BfUkVDVFtdID0gImNvZGVkLmNyb3AiOworCisvKioKKyAqIFBpeGVsIGZvcm1hdC4KKyAqLworLy8gVE9ETzogZGVmaW5lIHNvbWUKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhQaXhlbEZvcm1hdD4gQzJTdHJlYW1QaXhlbEZvcm1hdEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVRbXSA9ICJyYXcucGl4ZWwtZm9ybWF0IjsKKworLyoqCisgKiBFeHRlbmRlZCByb3RhdGlvbiBpbmZvcm1hdGlvbiBhbHNvIGluY29ycG9yYXRpbmcgYSBmbGlwLgorICoKKyAqIFJvdGF0aW9uIGlzIGNvdW50ZXIgY2xvY2std2lzZS4KKyAqLworc3RydWN0IEMyUm90YXRpb25TdHJ1Y3QgeworICAgIEMyUm90YXRpb25TdHJ1Y3QoaW50MzJfdCByb3RhdGlvbiA9IDApCisgICAgICAgIDogZmxpcCgwKSwgdmFsdWUocm90YXRpb24pIHsgfQorCisgICAgaW50MzJfdCBmbGlwOyAgIC8vLzwgaG9yaXpvbnRhbCBmbGlwIChsZWZ0LXJpZ2h0IGZsaXAgYXBwbGllZCBwcmlvciB0byByb3RhdGlvbikKKyAgICBpbnQzMl90IHZhbHVlOyAgLy8vPCByb3RhdGlvbiBpbiBkZWdyZWVzIGNvdW50ZXIgY2xvY2t3aXNlCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfQzJTVFJVQ1QoUm90YXRpb24pCisgICAgQzJGSUVMRChmbGlwLCAiZmxpcCIpCisgICAgQzJGSUVMRCh2YWx1ZSwgInZhbHVlIikKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyUm90YXRpb25TdHJ1Y3QsIGtQYXJhbUluZGV4Um90YXRpb24+IEMyU3RyZWFtUm90YXRpb25JbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUk9UQVRJT05bXSA9ICJyYXcucm90YXRpb24iOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVlVJX1JPVEFUSU9OW10gPSAiY29kZWQudnVpLnJvdGF0aW9uIjsKKworLyoqCisgKiBQaXhlbCAoc2FtcGxlKSBhc3BlY3QgcmF0aW8uCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyUGljdHVyZVNpemVTdHJ1Y3QsIGtQYXJhbUluZGV4UGl4ZWxBc3BlY3RSYXRpbz4KKyAgICAgICAgQzJTdHJlYW1QaXhlbEFzcGVjdFJhdGlvSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BJWEVMX0FTUEVDVF9SQVRJT1tdID0gInJhdy5zYXIiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVlVJX1BJWEVMX0FTUEVDVF9SQVRJT1tdID0gImNvZGVkLnZ1aS5zYXIiOworCisvKioKKyAqIEluLWxpbmUgc2NhbGluZy4KKyAqCisgKiBDb21wb25lbnRzIGNhbiBvcHRpb25hbGx5IHN1cHBvcnQgc2NhbGluZyBvZiByYXcgaW1hZ2UvdmlkZW8gZnJhbWVzLiAgT3Igc2NhbGluZyBvbmx5IGEKKyAqIHBvcnRpb24gb2YgcmF3IGltYWdlL3ZpZGVvIGZyYW1lcyAoc2NhbGVkLWNyb3ApLgorICovCisKK0MyRU5VTShDMkNvbmZpZzo6c2NhbGluZ19tZXRob2RfdCwgdWludDMyX3QsCisgICAgU0NBTElOR19BUkJJVFJBUlksICAgLy8vPCBhcmJpdHJhcnksIHVuc3BlY2lmaWVkCispCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6c2NhbGluZ19tZXRob2RfdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhTY2FsaW5nTWV0aG9kPgorICAgICAgICBDMlN0cmVhbVNjYWxpbmdNZXRob2RUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TQ0FMSU5HX01PREVbXSA9ICJyYXcuc2NhbGluZy1tZXRob2QiOworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyUGljdHVyZVNpemVTdHJ1Y3QsIGtQYXJhbUluZGV4U2NhbGVkUGljdHVyZVNpemU+CisgICAgICAgIEMyU3RyZWFtU2NhbGVkUGljdHVyZVNpemVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TQ0FMRURfUElDVFVSRV9TSVpFW10gPSAicmF3LnNjYWxlZC1zaXplIjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlJlY3RTdHJ1Y3QsIGtQYXJhbUluZGV4U2NhbGVkQ3JvcFJlY3Q+CisgICAgICAgIEMyU3RyZWFtU2NhbGVkQ3JvcFJlY3RUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TQ0FMRURfQ1JPUF9SRUNUW10gPSAicmF3LnNjYWxlZC1jcm9wIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb2xvciBpbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogQ29sb3IgSW5mbworICoKKyAqIENocm9tYSBsb2NhdGlvbiBjYW4gdmFyeSBmb3IgdG9wIGFuZCBib3R0b20gZmllbGRzLCBzbyB1c2UgYW4gYXJyYXksIHRoYXQgY2FuIGhhdmUgMCB0byAyCisgKiB2YWx1ZXMuIEVtcHR5IGFycmF5IGlzIHVzZWQgZm9yIG5vbiBZVVYgZm9ybWF0cy4KKyAqLworCitzdHJ1Y3QgQzJDb2xvciB7CisgICAgZW51bSBtYXRyaXhfdCA6IHVpbnQzMl90OyAgLy8vPCBtYXRyaXggY29lZmZpY2llbnQgKFlVViA8PT4gUkdCKQorICAgIGVudW0gcGxhbmVfbGF5b3V0X3QgOiB1aW50MzJfdDsgIC8vLzwgcGxhbmUgbGF5b3V0IGZvciBmbGV4aWJsZSBmb3JtYXRzCisgICAgZW51bSBwcmltYXJpZXNfdCA6IHVpbnQzMl90OyAgLy8vPCBjb2xvciBwcmltYXJpZXMgYW5kIHdoaXRlIHBvaW50CisgICAgZW51bSByYW5nZV90IDogdWludDMyX3Q7ICAvLy88IHJhbmdlIG9mIGNvbG9yIGNvbXBvbmVudCB2YWx1ZXMKKyAgICBlbnVtIHN1YnNhbXBsaW5nX3QgOiB1aW50MzJfdDsgIC8vLzwgY2hyb21hIHN1YnNhbXBsaW5nCisgICAgZW51bSB0cmFuc2Zlcl90IDogdWludDMyX3Q7ICAvLy88IHRyYW5zZmVyIGZ1bmN0aW9uCit9OworCisvLy8gQ2hyb21hIHN1YnNhbXBsaW5nCitDMkVOVU0oQzJDb2xvcjo6c3Vic2FtcGxpbmdfdCwgdWludDMyX3QsCisgICAgTU9OT0NIUk9NRSwgICAgIC8vLzwgdGhlcmUgYXJlIG5vIENyIG5vciBDYiBwbGFuZXMKKyAgICBNT05PQ0hST01FX0FMUEhBLCAvLy88IHRoZXJlIGFyZSBubyBDciBub3IgQ2IgcGxhbmVzLCBidXQgdGhlcmUgaXMgYW4gYWxwaGEgcGxhbmUKKyAgICBSR0IsICAgICAgICAgICAgLy8vPCBSR0IKKyAgICBSR0JBLCAgICAgICAgICAgLy8vPCBSR0JBCisgICAgWVVWXzQyMCwgICAgICAgIC8vLzwgQ3IgYW5kIENiIHBsYW5lcyBhcmUgc3Vic2FtcGxlZCBieSAyIGJvdGggaG9yaXpvbnRhbGx5IGFuZCB2ZXJ0aWNhbGx5CisgICAgWVVWXzQyMiwgICAgICAgIC8vLzwgQ3IgYW5kIENiIHBsYW5lcyBhcmUgc3Vic2FtcGxlZCBob3Jpem9udGFsbHkKKyAgICBZVVZfNDQ0LCAgICAgICAgLy8vPCBDciBhbmQgQ2IgcGxhbmVzIGFyZSBub3Qgc3Vic2FtcGxlZAorICAgIFlVVkFfNDQ0LCAgICAgICAvLy88IENyIGFuZCBDYiBwbGFuZXMgYXJlIG5vdCBzdWJzYW1wbGVkLCB0aGVyZSBpcyBhbiBhbHBoYSBwbGFuZQorKQorCitzdHJ1Y3QgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgeworICAgIC8vIGNocm9tYSBvZmZzZXRzIGRlZmluZWQgYnkgSVRVCisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQ0NCgpIHsgcmV0dXJuIHsgMC4wZiwgMC4wZiB9OyB9CisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQyMigpIHsgcmV0dXJuIHsgMC4wZiwgMC4wZiB9OyB9CisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQyMF8wKCkgeyByZXR1cm4geyAwLjBmLCAwLjVmIH07IH0KKyAgICBjb25zdGV4cHIgc3RhdGljIEMyQ2hyb21hT2Zmc2V0U3RydWN0IElUVV9ZVVZfNDIwXzEoKSB7IHJldHVybiB7IDAuNWYsIDAuNWYgfTsgfQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80MjBfMigpIHsgcmV0dXJuIHsgMC4wZiwgMC4wZiB9OyB9CisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQyMF8zKCkgeyByZXR1cm4geyAwLjVmLCAwLjBmIH07IH0KKyAgICBjb25zdGV4cHIgc3RhdGljIEMyQ2hyb21hT2Zmc2V0U3RydWN0IElUVV9ZVVZfNDIwXzQoKSB7IHJldHVybiB7IDAuMGYsIDEuMGYgfTsgfQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80MjBfNSgpIHsgcmV0dXJuIHsgMC41ZiwgMS4wZiB9OyB9CisKKyAgICBmbG9hdCB4OyAgICAvLy88IHggb2Zmc2V0IGluIHBpeGVscyAodG93YXJkcyByaWdodCkKKyAgICBmbG9hdCB5OyAgICAvLy88IHkgb2Zmc2V0IGluIHBpeGVscyAodG93YXJkcyBkb3duKQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChDaHJvbWFPZmZzZXQpCisgICAgQzJGSUVMRCh4LCAieCIpCisgICAgQzJGSUVMRCh5LCAieSIpCit9OworCitzdHJ1Y3QgQzJDb2xvckluZm9TdHJ1Y3QgeworICAgIEMyQ29sb3JJbmZvU3RydWN0KCkKKyAgICAgICAgOiBiaXREZXB0aCg4KSwgc3Vic2FtcGxpbmcoQzJDb2xvcjo6WVVWXzQyMCkgeyB9CisKKyAgICB1aW50MzJfdCBiaXREZXB0aDsKKyAgICBDMkNvbG9yOjpzdWJzYW1wbGluZ190IHN1YnNhbXBsaW5nOworICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0IGxvY2F0aW9uc1tdOyAvLyBtYXggMiBlbGVtZW50cworCisgICAgQzJDb2xvckluZm9TdHJ1Y3QoCisgICAgICAgICAgICBzaXplX3QgLyogZmxleENvdW50ICovLCB1aW50MzJfdCBiaXREZXB0aF8sIEMyQ29sb3I6OnN1YnNhbXBsaW5nX3Qgc3Vic2FtcGxpbmdfKQorICAgICAgICA6IGJpdERlcHRoKGJpdERlcHRoXyksIHN1YnNhbXBsaW5nKHN1YnNhbXBsaW5nXykgeyB9CisKKyAgICBDMkNvbG9ySW5mb1N0cnVjdCgKKyAgICAgICAgICAgIHNpemVfdCBmbGV4Q291bnQsIHVpbnQzMl90IGJpdERlcHRoXywgQzJDb2xvcjo6c3Vic2FtcGxpbmdfdCBzdWJzYW1wbGluZ18sCisgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+IGxvY2F0aW9uc18pCisgICAgICAgIDogYml0RGVwdGgoYml0RGVwdGhfKSwgc3Vic2FtcGxpbmcoc3Vic2FtcGxpbmdfKSB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIGZvciAoY29uc3QgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgJmxvY2F0aW9uIDogbG9jYXRpb25zXykgeworICAgICAgICAgICAgaWYgKGl4ID09IGZsZXhDb3VudCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9jYXRpb25zW2l4XSA9IGxvY2F0aW9uOworICAgICAgICAgICAgKytpeDsKKyAgICAgICAgfQorICAgIH0KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChDb2xvckluZm8sIGxvY2F0aW9ucykKKyAgICBDMkZJRUxEKGJpdERlcHRoLCAiYml0LWRlcHRoIikKKyAgICBDMkZJRUxEKHN1YnNhbXBsaW5nLCAic3Vic2FtcGxpbmciKQorICAgIEMyRklFTEQobG9jYXRpb25zLCAibG9jYXRpb25zIikKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyQ29sb3JJbmZvU3RydWN0LCBrUGFyYW1JbmRleENvbG9ySW5mbz4gQzJTdHJlYW1Db2xvckluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0xPUl9JTkZPW10gPSAicmF3LmNvbG9yLWZvcm1hdCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPW10gPSAiY29kZWQuY29sb3ItZm9ybWF0IjsKKworLyoqCisgKiBDb2xvciBBc3BlY3RzCisgKi8KKworLyogVGhlIG1lYW5pbmcgb2YgdGhlIGZvbGxvd2luZyBlbnVtZXJhdG9ycyBpcyBhcyBkZXNjcmliZWQgaW4gSVRVLVQgSC4yNzMuICovCisKKy8vLyBSYW5nZQorQzJFTlVNKEMyQ29sb3I6OnJhbmdlX3QsIHVpbnQzMl90LAorICAgIFJBTkdFX1VOU1BFQ0lGSUVELCAgICAgICAgICAvLy88IHJhbmdlIGlzIHVuc3BlY2lmaWVkCisgICAgUkFOR0VfRlVMTCwgICAgICAgICAgICAgICAgIC8vLzwgZnVsbCByYW5nZQorICAgIFJBTkdFX0xJTUlURUQsICAgICAgICAgICAgICAvLy88IGxpbWl0ZWQgcmFuZ2UKKworICAgIFJBTkdFX1ZFTkRPUl9TVEFSVCA9IDB4ODAsICAvLy88IHZlbmRvci1zcGVjaWZpYyByYW5nZSB2YWx1ZXMgc3RhcnQgaGVyZQorICAgIFJBTkdFX09USEVSID0gMFhGRiAgICAgICAgICAvLy88IG1heCB2YWx1ZSwgcmVzZXJ2ZWQgZm9yIHVuZGVmaW5lZCB2YWx1ZXMKKykKKworLy8vIENvbG9yIHByaW1hcmllcworQzJFTlVNKEMyQ29sb3I6OnByaW1hcmllc190LCB1aW50MzJfdCwKKyAgICBQUklNQVJJRVNfVU5TUEVDSUZJRUQsICAgICAgICAgIC8vLzwgcHJpbWFyaWVzIGFyZSB1bnNwZWNpZmllZAorICAgIFBSSU1BUklFU19CVDcwOSwgICAgICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuNzA5LTYgb3IgZXF1aXZhbGVudAorICAgIFBSSU1BUklFU19CVDQ3MF9NLCAgICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuNDcwLTYgU3lzdGVtIE0gb3IgZXF1aXZhbGVudAorICAgIFBSSU1BUklFU19CVDYwMV82MjUsICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuNjAxLTYgNjI1IG9yIGVxdWl2YWxlbnQKKyAgICBQUklNQVJJRVNfQlQ2MDFfNTI1LCAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjYwMS02IDUyNSBvciBlcXVpdmFsZW50CisgICAgUFJJTUFSSUVTX0dFTkVSSUNfRklMTSwgICAgICAgICAvLy88IEdlbmVyaWMgRmlsbQorICAgIFBSSU1BUklFU19CVDIwMjAsICAgICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuMjAyMCBvciBlcXVpdmFsZW50CisgICAgUFJJTUFSSUVTX1JQNDMxLCAgICAgICAgICAgICAgICAvLy88IFNNUFRFIFJQIDQzMS0yIG9yIGVxdWl2YWxlbnQKKyAgICBQUklNQVJJRVNfRUc0MzIsICAgICAgICAgICAgICAgIC8vLzwgU01QVEUgRUcgNDMyLTEgb3IgZXF1aXZhbGVudAorICAgIFBSSU1BUklFU19FQlUzMjEzLCAgICAgICAgICAgICAgLy8vPCBFQlUgVGVjaC4zMjEzLUUgb3IgZXF1aXZhbGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vCisgICAgUFJJTUFSSUVTX1ZFTkRPUl9TVEFSVCA9IDB4ODAsICAvLy88IHZlbmRvci1zcGVjaWZpYyBwcmltYXJpZXMgdmFsdWVzIHN0YXJ0IGhlcmUKKyAgICBQUklNQVJJRVNfT1RIRVIgPSAweGZmICAgICAgICAgIC8vLzwgbWF4IHZhbHVlLCByZXNlcnZlZCBmb3IgdW5kZWZpbmVkIHZhbHVlcworKQorCisvLy8gVHJhbnNmZXIgZnVuY3Rpb24KK0MyRU5VTShDMkNvbG9yOjp0cmFuc2Zlcl90LCB1aW50MzJfdCwKKyAgICBUUkFOU0ZFUl9VTlNQRUNJRklFRCwgICAgICAgICAgIC8vLzwgdHJhbnNmZXIgaXMgdW5zcGVjaWZpZWQKKyAgICBUUkFOU0ZFUl9MSU5FQVIsICAgICAgICAgICAgICAgIC8vLzwgTGluZWFyIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljcworICAgIFRSQU5TRkVSX1NSR0IsICAgICAgICAgICAgICAgICAgLy8vPCBzUkdCIG9yIGVxdWl2YWxlbnQKKyAgICBUUkFOU0ZFUl8xNzBNLCAgICAgICAgICAgICAgICAgIC8vLzwgU01QVEUgMTcwTSBvciBlcXVpdmFsZW50IChlLmcuIEJULjYwMS83MDkvMjAyMCkKKyAgICBUUkFOU0ZFUl9HQU1NQTIyLCAgICAgICAgICAgICAgIC8vLzwgQXNzdW1lZCBkaXNwbGF5IGdhbW1hIDIuMgorICAgIFRSQU5TRkVSX0dBTU1BMjgsICAgICAgICAgICAgICAgLy8vPCBBc3N1bWVkIGRpc3BsYXkgZ2FtbWEgMi44CisgICAgVFJBTlNGRVJfU1QyMDg0LCAgICAgICAgICAgICAgICAvLy88IFNNUFRFIFNUIDIwODQgZm9yIDEwLzEyLzE0LzE2IGJpdCBzeXN0ZW1zCisgICAgVFJBTlNGRVJfSExHLCAgICAgICAgICAgICAgICAgICAvLy88IEFSSUIgU1RELUI2NyBoeWJyaWQtbG9nLWdhbW1hCisKKyAgICBUUkFOU0ZFUl8yNDBNID0gMHg0MCwgICAgICAgICAgIC8vLzwgU01QVEUgMjQwTSBvciBlcXVpdmFsZW50CisgICAgVFJBTlNGRVJfWFZZQ0MsICAgICAgICAgICAgICAgICAvLy88IElFQyA2MTk2Ni0yLTQgb3IgZXF1aXZhbGVudAorICAgIFRSQU5TRkVSX0JUMTM2MSwgICAgICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuMTM2MSBleHRlbmRlZCBnYW11dAorICAgIFRSQU5TRkVSX1NUNDI4LCAgICAgICAgICAgICAgICAgLy8vPCBTTVBURSBTVCA0MjgtMSBvciBlcXVpdmFsZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8KKyAgICBUUkFOU0ZFUl9WRU5ET1JfU1RBUlQgPSAweDgwLCAgIC8vLzwgdmVuZG9yLXNwZWNpZmljIHRyYW5zZmVyIHZhbHVlcyBzdGFydCBoZXJlCisgICAgVFJBTlNGRVJfT1RIRVIgPSAweGZmICAgICAgICAgICAvLy88IG1heCB2YWx1ZSwgcmVzZXJ2ZWQgZm9yIHVuZGVmaW5lZCB2YWx1ZXMKKykKKworLy8vIE1hdHJpeCBjb2VmZmljaWVudAorQzJFTlVNKEMyQ29sb3I6Om1hdHJpeF90LCB1aW50MzJfdCwKKyAgICBNQVRSSVhfVU5TUEVDSUZJRUQsICAgICAgICAgICAgIC8vLzwgbWF0cml4IGNvZWZmaWNpZW50cyBhcmUgdW5zcGVjaWZpZWQKKyAgICBNQVRSSVhfQlQ3MDksICAgICAgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjcwOS01IG9yIGVxdWl2YWxlbnQKKyAgICBNQVRSSVhfRkNDNDdfNzNfNjgyLCAgICAgICAgICAgIC8vLzwgRkNDIFRpdGxlIDQ3IENGUiA3My42ODIgb3IgZXF1aXZhbGVudCAoS1I9MC4zMCwgS0I9MC4xMSkKKyAgICBNQVRSSVhfQlQ2MDEsICAgICAgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjQ3MCwgQlQuNjAxLTYgNjI1IG9yIGVxdWl2YWxlbnQKKyAgICBNQVRSSVhfMjQwTSwgICAgICAgICAgICAgICAgICAgIC8vLzwgU01QVEUgMjQwTSBvciBlcXVpdmFsZW50CisgICAgTUFUUklYX0JUMjAyMCwgICAgICAgICAgICAgICAgICAvLy88IFJlYy5JVFUtUiBCVC4yMDIwIG5vbi1jb25zdGFudCBsdW1pbmFuY2UKKyAgICBNQVRSSVhfQlQyMDIwX0NPTlNUQU5ULCAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjIwMjAgY29uc3RhbnQgbHVtaW5hbmNlCisgICAgTUFUUklYX1ZFTkRPUl9TVEFSVCA9IDB4ODAsICAgICAvLy88IHZlbmRvci1zcGVjaWZpYyBtYXRyaXggY29lZmZpY2llbnQgdmFsdWVzIHN0YXJ0IGhlcmUKKyAgICBNQVRSSVhfT1RIRVIgPSAweGZmLCAgICAgICAgICAgIC8vLzwgbWF4IHZhbHVlLCByZXNlcnZlZCBmb3IgdW5kZWZpbmVkIHZhbHVlcworKQorCitzdHJ1Y3QgQzJDb2xvckFzcGVjdHNTdHJ1Y3QgeworICAgIEMyQ29sb3I6OnJhbmdlX3QgcmFuZ2U7CisgICAgQzJDb2xvcjo6cHJpbWFyaWVzX3QgcHJpbWFyaWVzOworICAgIEMyQ29sb3I6OnRyYW5zZmVyX3QgdHJhbnNmZXI7CisgICAgQzJDb2xvcjo6bWF0cml4X3QgbWF0cml4OworCisgICAgQzJDb2xvckFzcGVjdHNTdHJ1Y3QoKQorICAgICAgICA6IHJhbmdlKEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVEKSwKKyAgICAgICAgICBwcmltYXJpZXMoQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVEKSwKKyAgICAgICAgICB0cmFuc2ZlcihDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCksCisgICAgICAgICAgbWF0cml4KEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkgeyB9CisKKyAgICBDMkNvbG9yQXNwZWN0c1N0cnVjdChDMkNvbG9yOjpyYW5nZV90IHJhbmdlXywgQzJDb2xvcjo6cHJpbWFyaWVzX3QgcHJpbWFyaWVzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjp0cmFuc2Zlcl90IHRyYW5zZmVyXywgQzJDb2xvcjo6bWF0cml4X3QgbWF0cml4XykKKyAgICAgICAgOiByYW5nZShyYW5nZV8pLCBwcmltYXJpZXMocHJpbWFyaWVzXyksIHRyYW5zZmVyKHRyYW5zZmVyXyksIG1hdHJpeChtYXRyaXhfKSB7fQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChDb2xvckFzcGVjdHMpCisgICAgQzJGSUVMRChyYW5nZSwgInJhbmdlIikKKyAgICBDMkZJRUxEKHByaW1hcmllcywgInByaW1hcmllcyIpCisgICAgQzJGSUVMRCh0cmFuc2ZlciwgInRyYW5zZmVyIikKKyAgICBDMkZJRUxEKG1hdHJpeCwgIm1hdHJpeCIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkNvbG9yQXNwZWN0c1N0cnVjdCwga1BhcmFtSW5kZXhDb2xvckFzcGVjdHM+CisgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFNbXSA9ICJyYXcuY29sb3IiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFNbXSA9ICJjb2RlZC52dWkuY29sb3IiOworCisvKioKKyAqIERlZmF1bHQgY29sb3IgYXNwZWN0cyB0byB1c2UuIFRoZXNlIGNvbWUgZnJvbSB0aGUgY29udGFpbmVyIG9yIGNsaWVudCBhbmQgc2hhbGwgYmUgaGFuZGxlZAorICogYWNjb3JkaW5nIHRvIHRoZSBjb2Rpbmcgc3RhbmRhcmQuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJDb2xvckFzcGVjdHNTdHJ1Y3QsIGtQYXJhbUluZGV4RGVmYXVsdENvbG9yQXNwZWN0cz4KKyAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFNbXSA9ICJkZWZhdWx0LmNvbG9yIjsKKworLyoqCisgKiBIRFIgU3RhdGljIE1ldGFkYXRhIEluZm8uCisgKi8KK3N0cnVjdCBDMkNvbG9yWHlTdHJ1Y3QgeworICAgIGZsb2F0IHg7IC8vLzwgeCBjb2xvciBjb29yZGluYXRlIGluIHh5WSBzcGFjZSBbMC0xXQorICAgIGZsb2F0IHk7IC8vLzwgeSBjb2xvciBjb29yZGluYXRlIGluIHh5WSBzcGFjZSBbMC0xXQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChDb2xvclh5KQorICAgIEMyRklFTEQoeCwgIngiKQorICAgIEMyRklFTEQoeSwgInkiKQorfTsKKworc3RydWN0IEMyTWFzdGVyaW5nRGlzcGxheUNvbG9yVm9sdW1lU3RydWN0IHsKKyAgICBDMkNvbG9yWHlTdHJ1Y3QgcmVkOyAgICAvLy88IGNvb3JkaW5hdGVzIG9mIHJlZCBkaXNwbGF5IHByaW1hcnkKKyAgICBDMkNvbG9yWHlTdHJ1Y3QgZ3JlZW47ICAvLy88IGNvb3JkaW5hdGVzIG9mIGdyZWVuIGRpc3BsYXkgcHJpbWFyeQorICAgIEMyQ29sb3JYeVN0cnVjdCBibHVlOyAgIC8vLzwgY29vcmRpbmF0ZXMgb2YgYmx1ZSBkaXNwbGF5IHByaW1hcnkKKyAgICBDMkNvbG9yWHlTdHJ1Y3Qgd2hpdGU7ICAvLy88IGNvb3JkaW5hdGVzIG9mIHdoaXRlIHBvaW50CisKKyAgICBmbG9hdCBtYXhMdW1pbmFuY2U7ICAvLy88IG1heCBkaXNwbGF5IG1hc3RlcmluZyBsdW1pbmFuY2UgaW4gY2QvbV4yCisgICAgZmxvYXQgbWluTHVtaW5hbmNlOyAgLy8vPCBtaW4gZGlzcGxheSBtYXN0ZXJpbmcgbHVtaW5hbmNlIGluIGNkL21eMgorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChNYXN0ZXJpbmdEaXNwbGF5Q29sb3JWb2x1bWUpCisgICAgQzJGSUVMRChyZWQsICJyZWQiKQorICAgIEMyRklFTEQoZ3JlZW4sICJncmVlbiIpCisgICAgQzJGSUVMRChibHVlLCAiYmx1ZSIpCisgICAgQzJGSUVMRCh3aGl0ZSwgIndoaXRlIikKKworICAgIEMyRklFTEQobWF4THVtaW5hbmNlLCAibWF4LWx1bWluYW5jZSIpCisgICAgQzJGSUVMRChtaW5MdW1pbmFuY2UsICJtaW4tbHVtaW5hbmNlIikKK307CisKK3N0cnVjdCBDMkhkclN0YXRpY01ldGFkYXRhU3RydWN0IHsKKyAgICBDMk1hc3RlcmluZ0Rpc3BsYXlDb2xvclZvbHVtZVN0cnVjdCBtYXN0ZXJpbmc7CisKKyAgICAvLyBjb250ZW50IGRlc2NyaXB0b3JzCisgICAgZmxvYXQgbWF4Q2xsOyAgLy8vPCBtYXggY29udGVudCBsaWdodCBsZXZlbCAocGl4ZWwgbHVtaW5hbmNlKSBpbiBjZC9tXjIKKyAgICBmbG9hdCBtYXhGYWxsOyAvLy88IG1heCBmcmFtZSBhdmVyYWdlIGxpZ2h0IGxldmVsIChmcmFtZSBsdW1pbmFuY2UpIGluIGNkL21eMgorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9CQVNFX0MyU1RSVUNUKEhkclN0YXRpY01ldGFkYXRhKQorICAgIEMyRklFTEQobWFzdGVyaW5nLCAibWFzdGVyaW5nIikKKyAgICBDMkZJRUxEKG1heENsbCwgIm1heC1jbGwiKQorICAgIEMyRklFTEQobWF4RmFsbCwgIm1heC1mYWxsIikKK307Cit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkhkclN0YXRpY01ldGFkYXRhU3RydWN0LCBrUGFyYW1JbmRleEhkclN0YXRpY01ldGFkYXRhPgorICAgICAgICBDMlN0cmVhbUhkclN0YXRpY0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk9bXSA9ICJyYXcuaGRyLXN0YXRpYy1pbmZvIjsKKworLyoqCisgKiBIRFIxMCsgTWV0YWRhdGEgSW5mby4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJCbG9iVmFsdWUsIGtQYXJhbUluZGV4SGRyMTBQbHVzTWV0YWRhdGE+CisgICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX0hEUjEwX1BMVVNfSU5GT1tdID0gImlucHV0LmhkcjEwLXBsdXMtaW5mbyI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfSERSMTBfUExVU19JTkZPW10gPSAib3V0cHV0LmhkcjEwLXBsdXMtaW5mbyI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBibG9jay1iYXNlZCBjb2RpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBCbG9jay1zaXplLCBibG9jayBjb3VudCBhbmQgYmxvY2sgcmF0ZS4gVXNlZCB0byBkZXRlcm1pbmUgb3IgY29tbXVuaWNhdGUgcHJvZmlsZS1sZXZlbAorICogcmVxdWlyZW1lbnRzLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlBpY3R1cmVTaXplU3RydWN0LCBrUGFyYW1JbmRleEJsb2NrU2l6ZT4gQzJTdHJlYW1CbG9ja1NpemVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQkxPQ0tfU0laRVtdID0gImNvZGVkLmJsb2NrLXNpemUiOworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleEJsb2NrQ291bnQ+IEMyU3RyZWFtQmxvY2tDb3VudEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9CTE9DS19DT1VOVFtdID0gImNvZGVkLmJsb2NrLWNvdW50IjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleEJsb2NrUmF0ZT4gQzJTdHJlYW1CbG9ja1JhdGVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQkxPQ0tfUkFURVtdID0gImNvZGVkLmJsb2NrLXJhdGUiOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBWSURFTyBDT01QT05FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogRnJhbWUgcmF0ZSAoY29kZWQgYW5kIHBvcnQgZm9yIHJhdyBkYXRhKQorICoKKyAqIENvZGVkIGZyYW1lIHJhdGVzIGFyZSB3aGF0IGlzIHJlcHJlc2VudGVkIGluIHRoZSBjb21wcmVzc2VkIGJpdHN0cmVhbSBhbmQgc2hvdWxkIGNvcnJlc3BvbmQgdG8KKyAqIHRoZSB0aW1lc3RhbXAuCisgKgorICogRnJhbWUgcmF0ZXMgb24gcmF3IHBvcnRzIHNob3VsZCBzdGlsbCBjb3JyZXNwb25kIHRvIHRoZSB0aW1lc3RhbXBzLgorICoKKyAqIEZvciBzbG93IG1vdGlvbiBvciB0aW1lbGFwc2UgcmVjb3JkaW5nLCB0aGUgdGltZXN0YW1wIHNoYWxsIGJlIGFkanVzdGVkIHByaW9yIHRvIGZlZWRpbmcgYW4KKyAqIGVuY29kZXIsIGFuZCB0aGUgdGltZSBzdHJldGNoIHBhcmFtZXRlciBzaG91bGQgYmUgdXNlZCB0byBzaWduYWwgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuCisgKiB0aW1lc3RhbXAgYW5kIHJlYWwtd29ybGQgdGltZS4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleEZyYW1lUmF0ZT4gQzJTdHJlYW1GcmFtZVJhdGVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRlJBTUVfUkFURVtdID0gImNvZGVkLmZyYW1lLXJhdGUiOworCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleEZyYW1lUmF0ZT4gQzJQb3J0RnJhbWVSYXRlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX0ZSQU1FX1JBVEVbXSA9ICJpbnB1dC5mcmFtZS1yYXRlIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9GUkFNRV9SQVRFW10gPSAib3V0cHV0LmZyYW1lLXJhdGUiOworCisvKioKKyAqIFRpbWUgc3RyZXRjaC4gUmF0aW8gYmV0d2VlbiByZWFsLXdvcmxkIHRpbWUgYW5kIHRpbWVzdGFtcC4gRS5nLiB0aW1lIHN0cmV0Y2ggb2YgNC4wIG1lYW5zIHRoYXQKKyAqIHRpbWVzdGFtcCBncm93cyAxLzQgdGhlIHNwZWVkIG9mIHJlYWwtd29ybGQgdGltZSAoZS5nLiA0eCBzbG8tbW8gaW5wdXQpLiBUaGlzIGNhbiBiZSB1c2VkIHRvCisgKiBvcHRpbWl6ZSBlbmNvZGluZy4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhUaW1lU3RyZXRjaD4gQzJQb3J0VGltZVN0cmV0Y2hJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfVElNRV9TVFJFVENIW10gPSAiaW5wdXQudGltZS1zdHJldGNoIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9USU1FX1NUUkVUQ0hbXSA9ICJvdXRwdXQudGltZS1zdHJldGNoIjsKKworLyoqCisgKiBNYXggdmlkZW8gZnJhbWUgc2l6ZS4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlBpY3R1cmVTaXplU3RydWN0LCBrUGFyYW1JbmRleE1heFBpY3R1cmVTaXplPgorICAgICAgICBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOwordHlwZWRlZiBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nIEMyTWF4VmlkZW9TaXplSGludFBvcnRTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRVtdID0gInJhdy5tYXgtc2l6ZSI7CisKKy8qKgorICogUGljdHVyZSB0eXBlIG1hc2suCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QsIHVpbnQzMl90LAorICAgIFNZTkNfRlJBTUUgPSAoMSA8PCAwKSwgIC8vLzwgc3luYyBmcmFtZSwgZS5nLiBJRFIKKyAgICBJX0ZSQU1FICAgID0gKDEgPDwgMSksICAvLy88IGludHJhIGZyYW1lIHRoYXQgaXMgY29tcGxldGVseSBlbmNvZGVkCisgICAgUF9GUkFNRSAgICA9ICgxIDw8IDIpLCAgLy8vPCBpbnRlciBwcmVkaWN0ZWQgZnJhbWUgZnJvbSBwcmV2aW91cyBmcmFtZXMKKyAgICBCX0ZSQU1FICAgID0gKDEgPDwgMyksICAvLy88IGJhY2t3YXJkIHByZWRpY3RlZCAob3V0LW9mLW9yZGVyKSBmcmFtZQorKQorCisvKioKKyAqIEFsbG93ZWQgcGljdHVyZSB0eXBlcy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyRWFzeUVudW08QzJDb25maWc6OnBpY3R1cmVfdHlwZV90Pj4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhQaWN0dXJlVHlwZU1hc2s+CisgICAgICAgIEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUElDVFVSRV9UWVBFX01BU0tbXSA9ICJjb2RpbmcucGljdHVyZS10eXBlLW1hc2siOworCisvKioKKyAqIFJlc3VsdGluZyBwaWN0dXJlIHR5cGUKKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkVhc3lFbnVtPEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdD4+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4UGljdHVyZVR5cGU+CisgICAgICAgIEMyU3RyZWFtUGljdHVyZVR5cGVJbmZvOwordHlwZWRlZiBDMlN0cmVhbVBpY3R1cmVUeXBlSW5mbyBDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSUNUVVJFX1RZUEVbXSA9ICJjb2RlZC5waWN0dXJlLXR5cGUiOworCisvKioKKyAqIEdPUCBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEdPUCBpcyBzcGVjaWZpZWQgaW4gbGF5ZXJzIGJldHdlZW4gc3luYyBmcmFtZXMsIGJ5IHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBzcGVjaWZpYyB0eXBlIG9mCisgKiBmcmFtZXMgYmV0d2VlbiB0aGUgcHJldmlvdXMgdHlwZSAoc3RhcnRpbmcgd2l0aCBzeW5jIGZyYW1lcyBmb3IgdGhlIGZpcnN0IGxheWVyKToKKyAqCisgKiBFLmcuCisgKiAgICAgIC0gNCBJIGZyYW1lcyBiZXR3ZWVuIGVhY2ggc3luYyBmcmFtZQorICogICAgICAtIDIgUCBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKKyAqICAgICAgLSAxIEIgZnJhbWUgYmV0d2VlbiBlYWNoIFAgZnJhbWUKKyAqCisgKiAgICAgIFsgeyBJLCA0IH0sIHsgUCwgMiB9LCB7IEIsIDEgfSBdID09PiAoU3luYylCUEJQQiBJQlBCUEIgSUJQQlBCIElCUEJQQiBJQlBCUEIgKFN5bmMpQlBCUEIKKyAqCisgKiBGb3IgaW5maW5pdGUgR09QLCBJIGxheWVyIGNhbiBiZSBvbWl0dGVkIChhcyB0aGUgZmlyc3QgZnJhbWUgaXMgYWx3YXlzIGEgc3luYyBmcmFtZS4pOgorICoKKyAqICAgICAgWyB7IFAsIE1BWF9VSU5UIH0gXSAgID09PiAoU3luYylQUFBQUFBQUFBQUFBQUFBQUFAuLi4KKyAqCisgKiBTeW5jIGZyYW1lcyBjYW4gYWxzbyBiZSByZXF1ZXN0ZWQgb24gZGVtYW5kLCBhbmQgYXMgYSB0aW1lLWJhc2VkIGludGVydmFsLiBGb3IgdGltZS1iYXNlZAorICogaW50ZXJ2YWwsIGlmIHRoZXJlIGhhc24ndCBiZWVuIGEgc3luYyBmcmFtZSBpbiBhdCBsZWFzdCB0aGUgZ2l2ZW4gdGltZSwgdGhlIG5leHQgSSBmcmFtZSBzaGFsbAorICogYmUgZW5jb2RlZCBhcyBhIHN5bmMgZnJhbWUuICBGb3Igc3luYyByZXF1ZXN0LCB0aGUgbmV4dCBJIGZyYW1lIHNoYWxsIGJlIGVuY29kZWQgYXMgYSBzeW5jIGZyYW1lLgorICoKKyAqIFRlbXBvcmFsIGxheWVyaW5nIHdpbGwgZGV0ZXJtaW5lIEdPUCBzdHJ1Y3R1cmUgb3RoZXIgdGhhbiB0aGUgSSBmcmFtZSBjb3VudCBiZXR3ZWVuIHN5bmMKKyAqIGZyYW1lcy4KKyAqLworc3RydWN0IEMyR29wTGF5ZXJTdHJ1Y3QgeworICAgIEMyR29wTGF5ZXJTdHJ1Y3QoQzJDb25maWc6OnBpY3R1cmVfdHlwZV90IHR5cGUsIHVpbnQzMl90IGNvdW50XykKKyAgICAgICAgOiB0eXBlXyh0eXBlKSwgY291bnQoY291bnRfKSB7IH0KKworICAgIEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCB0eXBlXzsKKyAgICB1aW50MzJfdCBjb3VudDsKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoR29wTGF5ZXIpCisgICAgQzJGSUVMRCh0eXBlXywgInR5cGUiKQorICAgIEMyRklFTEQoY291bnQsICJjb3VudCIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJHb3BMYXllclN0cnVjdD4sIGtQYXJhbUluZGV4R29wPgorICAgICAgICBDMlN0cmVhbUdvcFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0dPUFtdID0gImNvZGluZy5nb3AiOworCisvKioKKyAqIFN5bmMgZnJhbWUgY2FuIGJlIHJlcXVlc3RlZCBvbiBkZW1hbmQgYnkgdGhlIGNsaWVudC4KKyAqCisgKiBJZiB0cnVlLCB0aGUgbmV4dCBJIGZyYW1lIHNoYWxsIGJlIGVuY29kZWQgYXMgYSBzeW5jIGZyYW1lLiBUaGlzIGNvbmZpZyBjYW4gYmUgcGFzc2VkCisgKiBzeW5jaHJvbm91c2x5IHdpdGggdGhlIHdvcmssIG9yIGRpcmVjdGx5IHRvIHRoZSBjb21wb25lbnQgLSBsZWFkaW5nIHRvIGRpZmZlcmVudCByZXN1bHQuCisgKiBJZiBpdCBpcyBwYXNzZWQgd2l0aCB3b3JrLCBpdCBzaGFsbCB0YWtlIGVmZmVjdCB3aGVuIHRoYXQgd29yayBpdGVtIGlzIGJlaW5nIHByb2Nlc3NlZCAoc28KKyAqIHRoZSBmaXJzdCBJIGZyYW1lIGF0IG9yIGFmdGVyIHRoYXQgd29yayBpdGVtIHNoYWxsIGJlIGEgc3luYyBmcmFtZSkuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJFYXN5Qm9vbFZhbHVlLCBrUGFyYW1JbmRleFJlcXVlc3RTeW5jRnJhbWU+CisgICAgICAgIEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRVtdID0gImNvZGluZy5yZXF1ZXN0LXN5bmMtZnJhbWUiOworCisvKioKKyAqIFN5bmMgZnJhbWUgaW50ZXJ2YWwgaW4gdGltZSBkb21haW4gKHRpbWVzdGFtcCkuCisgKgorICogSWYgdGhlcmUgaGFzbid0IGJlZW4gYSBzeW5jIGZyYW1lIGluIGF0IGxlYXN0IHRoaXMgdmFsdWUsIHRoZSBuZXh0IGludHJhIGZyYW1lIHNoYWxsIGJlIGVuY29kZWQKKyAqIGFzIGEgc3luYyBmcmFtZS4gVGhlIHZhbHVlIG9mIE1BWF9JNjQgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBtZWFucyBubyBzeW5jIGZyYW1lcyBhZnRlciB0aGUgZmlyc3QKKyAqIGZyYW1lLiBBIHZhbHVlIG9mIDAgbWVhbnMgYWxsIHN5bmMgZnJhbWVzLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMySW50NjRWYWx1ZSwga1BhcmFtSW5kZXhTeW5jRnJhbWVJbnRlcnZhbD4KKyAgICAgICAgQzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1NZTkNfRlJBTUVfSU5URVJWQUxbXSA9ICJjb2Rpbmcuc3luYy1mcmFtZS1pbnRlcnZhbCI7CisKKy8qKgorICogVGVtcG9yYWwgbGF5ZXJpbmcKKyAqCisgKiBMYXllciBpbmRleCBpcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgbGF5ZXIgY291bnQgLSAxLiBMYXllcnMgd2l0aCBoaWdoZXIgaW5kZXggaGF2ZSBoaWdoZXIKKyAqIGZyZXF1ZW5jeToKKyAqICAgICAwCisgKiAgIDEgICAxCisgKiAgMiAyIDIgMgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleExheWVySW5kZXg+IEMyU3RyZWFtTGF5ZXJJbmRleEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9MQVlFUl9JTkRFWFtdID0gImNvZGVkLmxheWVyLWluZGV4IjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhMYXllckNvdW50PiBDMlN0cmVhbUxheWVyQ291bnRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTEFZRVJfQ09VTlRbXSA9ICJjb2RlZC5sYXllci1jb3VudCI7CisKK3N0cnVjdCBDMlRlbXBvcmFsTGF5ZXJpbmdTdHJ1Y3QgeworICAgIEMyVGVtcG9yYWxMYXllcmluZ1N0cnVjdCgpCisgICAgICAgIDogbGF5ZXJDb3VudCgwKSwgYkxheWVyQ291bnQoMCkgeyB9CisKKyAgICBDMlRlbXBvcmFsTGF5ZXJpbmdTdHJ1Y3Qoc2l6ZV90IC8qIGZsZXhDb3VudCAqLywgdWludDMyX3QgbGF5ZXJDb3VudF8sIHVpbnQzMl90IGJMYXllckNvdW50XykKKyAgICAgICAgOiBsYXllckNvdW50KGxheWVyQ291bnRfKSwgYkxheWVyQ291bnQoYzJfbWluKGxheWVyQ291bnRfLCBiTGF5ZXJDb3VudF8pKSB7IH0KKworICAgIEMyVGVtcG9yYWxMYXllcmluZ1N0cnVjdChzaXplX3QgZmxleENvdW50LCB1aW50MzJfdCBsYXllckNvdW50XywgdWludDMyX3QgYkxheWVyQ291bnRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8ZmxvYXQ+IHJhdGlvcykKKyAgICAgICAgOiBsYXllckNvdW50KGxheWVyQ291bnRfKSwgYkxheWVyQ291bnQoYzJfbWluKGxheWVyQ291bnRfLCBiTGF5ZXJDb3VudF8pKSB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIGZvciAoZmxvYXQgcmF0aW8gOiByYXRpb3MpIHsKKyAgICAgICAgICAgIGlmIChpeCA9PSBmbGV4Q291bnQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJpdHJhdGVSYXRpb3NbaXgrK10gPSByYXRpbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVpbnQzMl90IGxheWVyQ291bnQ7ICAgICAvLy88IHRvdGFsIG51bWJlciBvZiBsYXllcnMgKDAgbWVhbnMgbm8gdGVtcG9yYWwgbGF5ZXJpbmcpCisgICAgdWludDMyX3QgYkxheWVyQ291bnQ7ICAgIC8vLzwgdG90YWwgbnVtYmVyIG9mIGJpZGlyZWN0aW9uYWwgbGF5ZXJzICg8PSBudW0gbGF5ZXJzKQorICAgIC8qKgorICAgICAqIEJpdHJhdGUgYnVkZ2V0cyBmb3IgZWFjaCBsYXllciBhbmQgdGhlIGxheWVycyBiZWxvdywgZ2l2ZW4gYXMgYSByYXRpbyBvZiB0aGUgdG90YWwKKyAgICAgKiBzdHJlYW0gYml0cmF0ZS4gVGhpcyBjYW4gYmUgb21pdHRlZCBvciBwYXJ0aWFsbHkgc3BlY2lmaWZlZCBieSB0aGUgY2xpZW50IHdoaWxlIGNvbmZpZ3VyaW5nLAorICAgICAqIGluIHdoaWNoIGNhc2UgdGhlIGNvbXBvbmVudCBzaGFsbCBmaWxsIGluIGFwcHJvcHJpYXRlIHZhbHVlcyBmb3IgdGhlIG1pc3NpbmcgbGF5ZXJzLgorICAgICAqIFRoaXMgbXVzdCBiZSBwcm92aWRlZCBieSB0aGUgY29tcG9uZW50IHdoZW4gcXVlcmllZCBmb3IgYXQgbGVhc3QgbGF5ZXIgY291bnQgLSAxIChhcyB0aGUKKyAgICAgKiBsYXN0IGxheWVyJ3MgYnVkZ2V0IGlzIGFsd2F5cyAxLjApLgorICAgICAqLworICAgIGZsb2F0IGJpdHJhdGVSYXRpb3NbXTsgICAvLy88IDEuMC1iYXNlZAorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFRlbXBvcmFsTGF5ZXJpbmcsIGJpdHJhdGVSYXRpb3MpCisgICAgQzJGSUVMRChsYXllckNvdW50LCAibGF5ZXItY291bnQiKQorICAgIEMyRklFTEQoYkxheWVyQ291bnQsICJiLWxheWVyLWNvdW50IikKKyAgICBDMkZJRUxEKGJpdHJhdGVSYXRpb3MsICJiaXRyYXRlLXJhdGlvcyIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVGVtcG9yYWxMYXllcmluZ1N0cnVjdCwga1BhcmFtSW5kZXhUZW1wb3JhbExheWVyaW5nPgorICAgICAgICBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklOR1tdID0gImNvZGluZy50ZW1wb3JhbC1sYXllcmluZyI7CisKKy8qKgorICogSW50cmEtcmVmcmVzaC4KKyAqLworCitDMkVOVU0oQzJDb25maWc6OmludHJhX3JlZnJlc2hfbW9kZV90LCB1aW50MzJfdCwKKyAgICBJTlRSQV9SRUZSRVNIX0RJU0FCTEVELCAgICAgLy8vPCBubyBpbnRyYSByZWZyZXNoCisgICAgSU5UUkFfUkVGUkVTSF9BUkJJVFJBUlksICAgIC8vLzwgYXJiaXRyYXJ5LCB1bnNwZWNpZmllZAorKQorCitzdHJ1Y3QgQzJJbnRyYVJlZnJlc2hTdHJ1Y3QgeworICAgIEMySW50cmFSZWZyZXNoU3RydWN0KCkKKyAgICAgICAgOiBtb2RlKEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVEKSwgcGVyaW9kKDAuKSB7IH0KKworICAgIEMySW50cmFSZWZyZXNoU3RydWN0KEMyQ29uZmlnOjppbnRyYV9yZWZyZXNoX21vZGVfdCBtb2RlXywgZmxvYXQgcGVyaW9kXykKKyAgICAgICAgOiBtb2RlKG1vZGVfKSwgcGVyaW9kKHBlcmlvZF8pIHsgfQorCisgICAgQzJDb25maWc6OmludHJhX3JlZnJlc2hfbW9kZV90IG1vZGU7IC8vLzwgcmVmcmVzaCBtb2RlCisgICAgZmxvYXQgcGVyaW9kOyAgICAgICAgIC8vLzwgaW50cmEgcmVmcmVzaCBwZXJpb2QgaW4gZnJhbWVzIChtdXN0IGJlID49IDEpLCAwIG1lYW5zIGRpc2FibGVkCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKEludHJhUmVmcmVzaCkKKyAgICBDMkZJRUxEKG1vZGUsICJtb2RlIikKKyAgICBDMkZJRUxEKHBlcmlvZCwgInBlcmlvZCIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMySW50cmFSZWZyZXNoU3RydWN0LCBrUGFyYW1JbmRleEludHJhUmVmcmVzaD4KKyAgICAgICAgQzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlRSQV9SRUZSRVNIW10gPSAiY29kaW5nLmludHJhLXJlZnJlc2giOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJTUFHRSBDT01QT05FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogVGlsZSBsYXlvdXQuCisgKgorICogVGhpcyBkZXNjcmliZWQgaG93IHRoZSBpbWFnZSBpcyBkZWNvbXBvc2VkIGludG8gdGlsZXMuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6c2Nhbl9vcmRlcl90LCB1aW50MzJfdCwKKyAgICBTQ0FOX0xFRlRfVE9fUklHSFRfVEhFTl9ET1dOCispCisKK3N0cnVjdCBDMlRpbGVMYXlvdXRTdHJ1Y3QgeworICAgIEMyUGljdHVyZVNpemVTdHJ1Y3QgdGlsZTsgICAgICAgLy8vPCB0aWxlIHNpemUKKyAgICB1aW50MzJfdCBjb2x1bW5Db3VudDsgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHRpbGVzIGhvcml6b250YWxseQorICAgIHVpbnQzMl90IHJvd0NvdW50OyAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgdGlsZXMgdmVydGljYWxseQorICAgIEMyQ29uZmlnOjpzY2FuX29yZGVyX3Qgb3JkZXI7ICAgLy8vPCB0aWxlIG9yZGVyCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFRpbGVMYXlvdXQpCisgICAgQzJGSUVMRCh0aWxlLCAidGlsZSIpCisgICAgQzJGSUVMRChjb2x1bW5Db3VudCwgImNvbHVtbnMiKQorICAgIEMyRklFTEQocm93Q291bnQsICJyb3dzIikKKyAgICBDMkZJRUxEKG9yZGVyLCAib3JkZXIiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJUaWxlTGF5b3V0U3RydWN0LCBrUGFyYW1JbmRleFRpbGVMYXlvdXQ+IEMyU3RyZWFtVGlsZUxheW91dEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9USUxFX0xBWU9VVFtdID0gImNvZGVkLnRpbGUtbGF5b3V0IjsKKworLyoqCisgKiBUaWxlIGhhbmRsaW5nLgorICoKKyAqIFdoZXRoZXIgdG8gY29uY2F0ZW5hdGUgdGlsZXMgb3Igb3V0cHV0IHRoZW0gZWFjaC4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjp0aWxpbmdfbW9kZV90LCB1aW50MzJfdCwKKyAgICBUSUxJTkdfU0VQQVJBVEUsICAgIC8vLzwgb3V0cHV0IGVhY2ggdGlsZSBpbiBhIHNlcGFyYXRlIG9uV29ya0RvbmUKKyAgICBUSUxJTkdfQ09OQ0FURU5BVEUgIC8vLzwgb3V0cHV0IG9uZSB3b3JrIGNvbXBsZXRpb24gcGVyIGZyYW1lIChjb25jYXRlbmF0ZSB0aWxlcykKKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlRpbGVMYXlvdXRTdHJ1Y3QsIGtQYXJhbUluZGV4VGlsZUhhbmRsaW5nPgorICAgICAgICBDMlN0cmVhbVRpbGVIYW5kbGluZ1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1RJTEVfSEFORExJTkdbXSA9ICJjb2RpbmcudGlsZS1oYW5kbGluZyI7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEFVRElPIENPTVBPTkVOVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBTYW1wbGUgcmF0ZQorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleFNhbXBsZVJhdGU+IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURVtdID0gInJhdy5zYW1wbGUtcmF0ZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0RFRF9TQU1QTEVfUkFURVtdID0gImNvZGVkLnNhbXBsZS1yYXRlIjsKKworLyoqCisgKiBDaGFubmVsIGNvdW50LgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleENoYW5uZWxDb3VudD4gQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVFtdID0gInJhdy5jaGFubmVsLWNvdW50IjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPREVEX0NIQU5ORUxfQ09VTlRbXSA9ICJjb2RlZC5jaGFubmVsLWNvdW50IjsKKworLyoqCisgKiBNYXggY2hhbm5lbCBjb3VudC4gVXNlZCB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIGNvZGVkIG9yIGRlY29kZWQgY2hhbm5lbHMuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4TWF4Q2hhbm5lbENvdW50PiBDMlN0cmVhbU1heENoYW5uZWxDb3VudEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9NQVhfQ0hBTk5FTF9DT1VOVFtdID0gInJhdy5tYXgtY2hhbm5lbC1jb3VudCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9NQVhfQ09ERURfQ0hBTk5FTF9DT1VOVFtdID0gImNvZGVkLm1heC1jaGFubmVsLWNvdW50IjsKKworLyoqCisgKiBBdWRpbyBzYW1wbGUgZm9ybWF0IChQQ00gZW5jb2RpbmcpCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QsIHVpbnQzMl90LAorICAgIFBDTV8xNiwKKyAgICBQQ01fOCwKKyAgICBQQ01fRkxPQVQKKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3Q+LCBrUGFyYW1JbmRleFBjbUVuY29kaW5nPgorICAgICAgICBDMlN0cmVhbVBjbUVuY29kaW5nSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BDTV9FTkNPRElOR1tdID0gInJhdy5wY20tZW5jb2RpbmciOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09ERURfUENNX0VOQ09ESU5HW10gPSAiY29kZWQucGNtLWVuY29kaW5nIjsKKworLyoqCisgKiBBQUMgU0JSIE1vZGUuIFVzZWQgZHVyaW5nIGVuY29kaW5nLgorICovCitDMkVOVU0oQzJDb25maWc6OmFhY19zYnJfbW9kZV90LCB1aW50MzJfdCwKKyAgICBBQUNfU0JSX09GRiwKKyAgICBBQUNfU0JSX1NJTkdMRV9SQVRFLAorICAgIEFBQ19TQlJfRFVBTF9SQVRFLAorICAgIEFBQ19TQlJfQVVUTyAvLy88IGxldCB0aGUgY29kZWMgZGVjaWRlCispCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OmFhY19zYnJfbW9kZV90Piwga1BhcmFtSW5kZXhBYWNTYnJNb2RlPgorICAgICAgICBDMlN0cmVhbUFhY1Nick1vZGVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9BQUNfU0JSX01PREVbXSA9ICJjb2RpbmcuYWFjLXNici1tb2RlIjsKKworLyoqCisgKiBEUkMgQ29tcHJlc3Npb24uIFVzZWQgZHVyaW5nIGRlY29kaW5nLgorICovCitDMkVOVU0oQzJDb25maWc6OmRyY19jb21wcmVzc2lvbl9tb2RlX3QsIGludDMyX3QsCisgICAgRFJDX0NPTVBSRVNTSU9OX09ETV9ERUZBVUxULCAvLy88IG9kbSdzIGRlZmF1bHQKKyAgICBEUkNfQ09NUFJFU1NJT05fTk9ORSwKKyAgICBEUkNfQ09NUFJFU1NJT05fTElHSFQsCisgICAgRFJDX0NPTVBSRVNTSU9OX0hFQVZZIC8vLzwKKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6ZHJjX2NvbXByZXNzaW9uX21vZGVfdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhEcmNDb21wcmVzc2lvbj4KKyAgICAgICAgQzJTdHJlYW1EcmNDb21wcmVzc2lvbk1vZGVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfQ09NUFJFU1NJT05fTU9ERVtdID0gImNvZGluZy5kcmMuY29tcHJlc3Npb24tbW9kZSI7CisKKy8qKgorICogRFJDIHRhcmdldCByZWZlcmVuY2UgbGV2ZWwgaW4gZEJGUy4gVXNlZCBkdXJpbmcgZGVjb2RpbmcuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhEcmNUYXJnZXRSZWZlcmVuY2VMZXZlbD4KKyAgICAgICAgQzJTdHJlYW1EcmNUYXJnZXRSZWZlcmVuY2VMZXZlbFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0RSQ19UQVJHRVRfUkVGRVJFTkNFX0xFVkVMW10gPSAiY29kaW5nLmRyYy5yZWZlcmVuY2UtbGV2ZWwiOworCisvKioKKyAqIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIGluIGRCRlMuIFVzZWQgZHVyaW5nIGRlY29kaW5nLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4RHJjRW5jb2RlZFRhcmdldExldmVsPgorICAgICAgICBDMlN0cmVhbURyY0VuY29kZWRUYXJnZXRMZXZlbFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0RSQ19FTkNPREVEX1RBUkdFVF9MRVZFTFtdID0gImNvZGluZy5kcmMuZW5jb2RlZC1sZXZlbCI7CisKKy8qKgorICogRFJDIHRhcmdldCByZWZlcmVuY2UgbGV2ZWwgaW4gZEJGUy4gVXNlZCBkdXJpbmcgZGVjb2RpbmcuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhEcmNCb29zdEZhY3Rvcj4KKyAgICAgICAgQzJTdHJlYW1EcmNCb29zdEZhY3RvclR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0RSQ19CT09TVF9GQUNUT1JbXSA9ICJjb2RpbmcuZHJjLmJvb3N0LWZhY3RvciI7CisKKy8qKgorICogRFJDIHRhcmdldCByZWZlcmVuY2UgbGV2ZWwgaW4gZEJGUy4gVXNlZCBkdXJpbmcgZGVjb2RpbmcuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhEcmNBdHRlbnVhdGlvbkZhY3Rvcj4KKyAgICAgICAgQzJTdHJlYW1EcmNBdHRlbnVhdGlvbkZhY3RvclR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0RSQ19BVFRFTlVBVElPTl9GQUNUT1JbXSA9ICJjb2RpbmcuZHJjLmF0dGVudWF0aW9uLWZhY3RvciI7CisKKy8qKgorICogRFJDIEVmZmVjdCBUeXBlIChzZWUgSVNPIDIzMDAzLTQpIFVuaWZvcm0gRHluYW1pYyBSYW5nZSBDb250cm9sLiBVc2VkIGR1cmluZyBkZWNvZGluZy4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjpkcmNfZWZmZWN0X3R5cGVfdCwgaW50MzJfdCwKKyAgICBEUkNfRUZGRUNUX09ETV9ERUZBVUxUID0gLTIsIC8vLzwgb2RtJ3MgZGVmYXVsdAorICAgIERSQ19FRkZFQ1RfT0ZGID0gLTEsICAgIC8vLzwgbm8gRFJDCisgICAgRFJDX0VGRkVDVF9OT05FID0gMCwgICAgLy8vPCBubyBEUkMgZXhjZXB0IHRvIHByZXZlbnQgY2xpcHBpbmcKKyAgICBEUkNfRUZGRUNUX0xBVEVfTklHSFQsCisgICAgRFJDX0VGRkVDVF9OT0lTWV9FTlZJUk9OTUVOVCwKKyAgICBEUkNfRUZGRUNUX0xJTUlURURfUExBWUJBQ0tfUkFOR0UsCisgICAgRFJDX0VGRkVDVF9MT1dfUExBWUJBQ0tfTEVWRUwsCisgICAgRFJDX0VGRkVDVF9ESUFMT0dfRU5IQU5DRU1FTlQsCisgICAgRFJDX0VGRkVDVF9HRU5FUkFMX0NPTVBSRVNTSU9OCispCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OmRyY19lZmZlY3RfdHlwZV90PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleERyY0VmZmVjdFR5cGU+CisgICAgICAgIEMyU3RyZWFtRHJjRWZmZWN0VHlwZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0RSQ19FRkZFQ1RfVFlQRVtdID0gImNvZGluZy5kcmMuZWZmZWN0LXR5cGUiOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQUFDIGNvbXBvbmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogQUFDIHN0cmVhbSBmb3JtYXQKKyAqLworQzJFTlVNKEMyQ29uZmlnOjphYWNfcGFja2FnaW5nX3QsIHVpbnQzMl90LAorICAgIEFBQ19QQUNLQUdJTkdfUkFXLAorICAgIEFBQ19QQUNLQUdJTkdfQURUUworKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyRWFzeUVudW08QzJDb25maWc6OmFhY19wYWNrYWdpbmdfdD4+LAorICAgICAgICBrUGFyYW1JbmRleEFhY1BhY2thZ2luZz4gQzJTdHJlYW1BYWNQYWNrYWdpbmdJbmZvOwordHlwZWRlZiBDMlN0cmVhbUFhY1BhY2thZ2luZ0luZm8gQzJTdHJlYW1BYWNGb3JtYXRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQUFDX1BBQ0tBR0lOR1tdID0gImNvZGVkLmFhYy1wYWNrYWdpbmciOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQTEFURk9STS1ERUZJTkVEIFBBUkFNRVRFUlMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBQbGF0Zm9ybSBsZXZlbCBhbmQgZmVhdHVyZXMuCisgKi8KK2VudW0gQzJDb25maWc6OnBsYXRmb3JtX2xldmVsX3QgOiB1aW50MzJfdCB7CisgICAgUExBVEZPUk1fUCwgICAvLy88IHN1cHBvcnQgZm9yIEFuZHJvaWQgOS4wIGZlYXR1cmUgc2V0Cit9OworCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnBsYXRmb3JtX2xldmVsX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4UGxhdGZvcm1MZXZlbD4KKyAgICAgICAgQzJQbGF0Zm9ybUxldmVsU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BMQVRGT1JNX0xFVkVMW10gPSAiYXBpLnBsYXRmb3JtLWxldmVsIjsKKworZW51bSBDMkNvbmZpZzo6cGxhdGZvcm1fZmVhdHVyZV90IDogdWludDY0X3QgeworICAgIC8vIG5vIHBsYXRmb3JtLXNwZWNpZmljIGZlYXR1cmVzIGhhdmUgYmVlbiBkZWZpbmVkCit9OworCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnBsYXRmb3JtX2ZlYXR1cmVfdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhQbGF0Zm9ybUZlYXR1cmVzPgorICAgICAgICBDMlBsYXRmb3JtRmVhdHVyZXNTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUExBVEZPUk1fRkVBVFVSRVNbXSA9ICJhcGkucGxhdGZvcm0tZmVhdHVyZXMiOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgcHJlZmVycmVkIGlvbiBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgZm9yIGEgZ2l2ZW4gbWVtb3J5IHVzYWdlLgorICovCitzdHJ1Y3QgQzJTdG9yZUlvblVzYWdlU3RydWN0IHsKKyAgICBpbmxpbmUgQzJTdG9yZUlvblVzYWdlU3RydWN0KCkgeworICAgICAgICBtZW1zZXQodGhpcywgMCwgc2l6ZW9mKCp0aGlzKSk7CisgICAgfQorCisgICAgaW5saW5lIEMyU3RvcmVJb25Vc2FnZVN0cnVjdCh1aW50NjRfdCB1c2FnZV8sIHVpbnQzMl90IGNhcGFjaXR5XykKKyAgICAgICAgOiB1c2FnZSh1c2FnZV8pLCBjYXBhY2l0eShjYXBhY2l0eV8pLCBoZWFwTWFzaygwKSwgYWxsb2NGbGFncygwKSwgbWluQWxpZ25tZW50KDApIHsgfQorCisgICAgdWludDY0X3QgdXNhZ2U7ICAgICAgICAvLy88IEMyTWVtb3J5VXNhZ2UKKyAgICB1aW50MzJfdCBjYXBhY2l0eTsgICAgIC8vLzwgY2FwYWNpdHkKKyAgICBpbnQzMl90IGhlYXBNYXNrOyAgICAgIC8vLzwgaW9uIGhlYXBNYXNrCisgICAgaW50MzJfdCBhbGxvY0ZsYWdzOyAgICAvLy88IGlvbiBhbGxvY2F0aW9uIGZsYWdzCisgICAgdWludDMyX3QgbWluQWxpZ25tZW50OyAvLy88IG1pbmltdW0gYWxpZ25tZW50CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFN0b3JlSW9uVXNhZ2UpCisgICAgQzJGSUVMRCh1c2FnZSwgInVzYWdlIikKKyAgICBDMkZJRUxEKGNhcGFjaXR5LCAiY2FwYWNpdHkiKQorICAgIEMyRklFTEQoaGVhcE1hc2ssICJoZWFwLW1hc2siKQorICAgIEMyRklFTEQoYWxsb2NGbGFncywgImFsbG9jLWZsYWdzIikKKyAgICBDMkZJRUxEKG1pbkFsaWdubWVudCwgIm1pbi1hbGlnbm1lbnQiKQorfTsKKworLy8gc3RvcmUsIHByaXZhdGUKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyU3RvcmVJb25Vc2FnZVN0cnVjdCwga1BhcmFtSW5kZXhTdG9yZUlvblVzYWdlPgorICAgICAgICBDMlN0b3JlSW9uVXNhZ2VJbmZvOworCisvKioKKyAqIEZsZXhpYmxlIHBpeGVsIGZvcm1hdCBkZXNjcmlwdG9ycworICovCitzdHJ1Y3QgQzJGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvclN0cnVjdCB7CisgICAgdWludDMyX3QgcGl4ZWxGb3JtYXQ7CisgICAgdWludDMyX3QgYml0RGVwdGg7CisgICAgQzJDb2xvcjo6c3Vic2FtcGxpbmdfdCBzdWJzYW1wbGluZzsKKyAgICBDMkNvbG9yOjpwbGFuZV9sYXlvdXRfdCBsYXlvdXQ7CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKEZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yKQorICAgIEMyRklFTEQocGl4ZWxGb3JtYXQsICJwaXhlbC1mb3JtYXQiKQorICAgIEMyRklFTEQoYml0RGVwdGgsICJiaXQtZGVwdGgiKQorICAgIEMyRklFTEQoc3Vic2FtcGxpbmcsICJzdWJzYW1wbGluZyIpCisgICAgQzJGSUVMRChsYXlvdXQsICJsYXlvdXQiKQorfTsKKworLyoqCisgKiBQbGFuZSBsYXlvdXQgb2YgZmxleGlibGUgcGl4ZWwgZm9ybWF0cy4KKyAqCisgKiBicHA6IGJ5dGVzIHBlciBjb2xvciBjb21wb25lbnQsIGUuZy4gMSBmb3IgOC1iaXQgZm9ybWF0cywgYW5kIDIgZm9yIDEwLTE2LWJpdCBmb3JtYXRzLgorICovCitDMkVOVU0oQzJDb2xvcjo6cGxhbmVfbGF5b3V0X3QsIHVpbnQzMl90LAorICAgICAgIC8qKiBVbmtub3duIGxheW91dCAqLworICAgICAgIFVOS05PV05fTEFZT1VULAorCisgICAgICAgLyoqIFBsYW5hciBsYXlvdXQgd2l0aCByb3dzIG9mIGVhY2ggcGxhbmUgcGFja2VkIChjb2xJbmMgPSBicHApICovCisgICAgICAgUExBTkFSX1BBQ0tFRCwKKworICAgICAgIC8qKiBTZW1pcGxhbmFyIGxheW91dCB3aXRoIHJvd3Mgb2YgZWFjaCBwbGFuZSBwYWNrZWQgKGNvbEluY19ZL0EgPSBicHAgKHBsYW5hciksCisgICAgICAgICogIGNvbEluY19DYi9DciA9IDIqYnBwIChpbnRlcmxlYXZlZCkuIFVzZWQgb25seSBmb3IgWVVWKEEpIGZvcm1hdHMuICovCisgICAgICAgU0VNSVBMQU5BUl9QQUNLRUQsCisKKyAgICAgICAvKiogSW50ZXJsZWF2ZWQgcGFja2VkLiBjb2xJbmMgPSBOKmJwcCAoTiBhcmUgdGhlIG51bWJlciBvZiBjb2xvciBjb21wb25lbnRzKSAqLworICAgICAgIElOVEVSTEVBVkVEX1BBQ0tFRCwKKworICAgICAgIC8qKiBJbnRlcmxlYXZlZCBhbGlnbmVkLiBjb2xJbmMgPSBzbWFsbGVzdCBwb3dlciBvZiAyID49IE4qYnBwIChOIGFyZSB0aGUgbnVtYmVyIG9mIGNvbG9yCisgICAgICAgICogIGNvbXBvbmVudHMpICovCisgICAgICAgSU5URVJMRUFWRURfQUxJR05FRAorKQorCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JTdHJ1Y3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4RmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JzPgorICAgICAgICBDMlN0b3JlRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JzSW5mbzsKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIGFuZHJvaWQgZGF0YXNwYWNlIGZvciBhIHJhdyB2aWRlby9pbWFnZSBmcmFtZS4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhEYXRhU3BhY2U+IEMyU3RyZWFtRGF0YVNwYWNlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0RBVEFfU1BBQ0VbXSA9ICJyYXcuZGF0YS1zcGFjZSI7CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBhbmRyb2lkIHN1cmZhY2Ugc2NhbGluZyBtb2RlIGZvciBhIHJhdyB2aWRlby9pbWFnZSBmcmFtZS4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhTdXJmYWNlU2NhbGluZz4gQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TVVJGQUNFX1NDQUxJTkdfTU9ERVtdID0gInJhdy5zdXJmYWNlLXNjYWxpbmciOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU5QVVQgU1VSRkFDRSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBJbnB1dCBzdXJmYWNlIEVPUworICovCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyRWFzeUJvb2xWYWx1ZSwga1BhcmFtSW5kZXhJbnB1dFN1cmZhY2VFb3M+CisgICAgICAgIEMySW5wdXRTdXJmYWNlRW9zVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9FT1NbXSA9ICJpbnB1dC1zdXJmYWNlLmVvcyI7CisKKy8qKgorICogU3RhcnQvc3VzcGVuZC9yZXN1bWUvc3RvcCBjb250cm9scyBhbmQgdGltZXN0YW1wcyBmb3IgaW5wdXQgc3VyZmFjZS4KKyAqCisgKiBUT0RPOiBtYWtlIHRoZXNlIGNvdW50ZXJzCisgKi8KKworc3RydWN0IEMyVGltZWRDb250cm9sU3RydWN0IHsKKyAgICBjMl9ib29sX3QgZW5hYmxlZDsgLy8vPCBjb250cm9sIGlzIGVuYWJsZWQKKyAgICBpbnQ2NF90IHRpbWVzdGFtcDsgLy8vPCBpZiBlbmFibGVkLCB0aW1lIHRoZSBjb250cm9sIHNob3VsZCB0YWtlIGVmZmVjdAorCisgICAgQzJUaW1lZENvbnRyb2xTdHJ1Y3QoKQorICAgICAgICA6IGVuYWJsZWQoQzJfRkFMU0UpLCB0aW1lc3RhbXAoMCkgeyB9CisKKyAgICAvKiBpbXBsaWNpdCAqLyBDMlRpbWVkQ29udHJvbFN0cnVjdCh1aW50NjRfdCB0aW1lc3RhbXBfKQorICAgICAgICA6IGVuYWJsZWQoQzJfVFJVRSksIHRpbWVzdGFtcCh0aW1lc3RhbXBfKSB7IH0KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoVGltZWRDb250cm9sKQorICAgIEMyRklFTEQoZW5hYmxlZCwgICAiZW5hYmxlZCIpCisgICAgQzJGSUVMRCh0aW1lc3RhbXAsICJ0aW1lc3RhbXAiKQorfTsKKwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJUaW1lZENvbnRyb2xTdHJ1Y3QsIGtQYXJhbUluZGV4U3RhcnRBdD4KKyAgICAgICAgQzJQb3J0U3RhcnRUaW1lc3RhbXBUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX1NUQVJUX0FUW10gPSAiaW5wdXQtc3VyZmFjZS5zdGFydCI7Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlRpbWVkQ29udHJvbFN0cnVjdCwga1BhcmFtSW5kZXhTdXNwZW5kQXQ+CisgICAgICAgIEMyUG9ydFN1c3BlbmRUaW1lc3RhbXBUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX1NVU1BFTkRfQVRbXSA9ICJpbnB1dC1zdXJmYWNlLnN1c3BlbmQiOwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJUaW1lZENvbnRyb2xTdHJ1Y3QsIGtQYXJhbUluZGV4UmVzdW1lQXQ+CisgICAgICAgIEMyUG9ydFJlc3VtZVRpbWVzdGFtcFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfUkVTVU1FX0FUW10gPSAiaW5wdXQtc3VyZmFjZS5yZXN1bWUiOwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJUaW1lZENvbnRyb2xTdHJ1Y3QsIGtQYXJhbUluZGV4U3RvcEF0PgorICAgICAgICBDMlBvcnRTdG9wVGltZXN0YW1wVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9TVE9QX0FUW10gPSAiaW5wdXQtc3VyZmFjZS5zdG9wIjsKKworLyoqCisgKiBUaW1lIG9mZnNldCBmb3IgaW5wdXQgc3VyZmFjZS4gSW5wdXQgdGltZXN0YW1wIHRvIGNvZGVjIGlzIHN1cmZhY2UgYnVmZmVyIHRpbWVzdGFtcCBwbHVzIHRoaXMKKyAqIHRpbWUgb2Zmc2V0LgorICovCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMySW50NjRWYWx1ZSwga1BhcmFtSW5kZXhUaW1lT2Zmc2V0PiBDMkNvbXBvbmVudFRpbWVPZmZzZXRUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX1RJTUVfT0ZGU0VUW10gPSAiaW5wdXQtc3VyZmFjZS50aW1lLW9mZnNldCI7CisKKy8qKgorICogTWluaW11bSBmcHMgZm9yIGlucHV0IHN1cmZhY2UuCisgKgorICogUmVwZWF0IGZyYW1lIHRvIG1lZXQgdGhpcy4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleE1pbkZyYW1lUmF0ZT4gQzJQb3J0TWluRnJhbWVSYXRlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9NSU5fRlJBTUVfUkFURVtdID0gImlucHV0LXN1cmZhY2UubWluLWZyYW1lLXJhdGUiOworCisvKioKKyAqIFRpbWVzdGFtcCBhZGp1c3RtZW50IChvdmVycmlkZSkgZm9yIGlucHV0IHN1cmZhY2UgYnVmZmVycy4gVGhlc2UgY29udHJvbCB0aGUgaW5wdXQgdGltZXN0YW1wCisgKiBmZWQgdG8gdGhlIGNvZGVjLCBidXQgZG8gbm90IGltcGFjdCB0aGUgb3V0cHV0IHRpbWVzdGFtcC4KKyAqLworc3RydWN0IEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdCB7CisgICAgLy8vIGNvbnRyb2wgbW9kZXMKKyAgICBlbnVtIG1vZGVfdCA6IHVpbnQzMl90OworCisgICAgaW5saW5lIEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdCgpOworCisgICAgaW5saW5lIEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdChtb2RlX3QgbW9kZV8sIHVpbnQ2NF90IHZhbHVlXykKKyAgICAgICAgOiBtb2RlKG1vZGVfKSwgdmFsdWUodmFsdWVfKSB7IH0KKworICAgIG1vZGVfdCBtb2RlOyAgICAvLy88IGNvbnRyb2wgbW9kZQorICAgIHVpbnQ2NF90IHZhbHVlOyAvLy88IGNvbnRyb2wgdmFsdWUgZm9yIGdhcCBiZXR3ZWVuIHR3byB0aW1lc3RhbXAKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoVGltZXN0YW1wR2FwQWRqdXN0bWVudCkKKyAgICBDMkZJRUxEKG1vZGUsICJtb2RlIikKKyAgICBDMkZJRUxEKHZhbHVlLCAidmFsdWUiKQorfTsKKworQzJFTlVNKEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdDo6bW9kZV90LCB1aW50MzJfdCwKKyAgICBOT05FLAorICAgIE1JTl9HQVAsCisgICAgRklYRURfR0FQLAorKTsKKworaW5saW5lIEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdDo6QzJUaW1lc3RhbXBHYXBBZGp1c3RtZW50U3RydWN0KCkKKyAgICA6IG1vZGUoQzJUaW1lc3RhbXBHYXBBZGp1c3RtZW50U3RydWN0OjpOT05FKSwgdmFsdWUoMCkgeyB9CisKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdD4gQzJQb3J0VGltZXN0YW1wR2FwVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9USU1FU1RBTVBfQURKVVNUTUVOVFtdID0gImlucHV0LXN1cmZhY2UudGltZXN0YW1wLWFkanVzdG1lbnQiOworCisvLy8gQH0KKworI2VuZGlmICAvLyBDMkNPTkZJR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkVudW0uaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJFbnVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBmYWQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJFbnVtLmgKQEAgLTAsMCArMSwyMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyRU5VTV9IXworI2RlZmluZSBDMkVOVU1fSF8KKworI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxfQzJNYWNyb1V0aWxzLmg+CisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLyoqIFxmaWxlCisgKiBUb29scyBmb3IgZWFzaWVyIGVudW0gc3VwcG9ydC4KKyAqLworCisvLy8gXGNvbmQgSU5URVJOQUwKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVVElMSVRJRVMgRk9SIEVOVU1FUkFUSU9OIFJFRkxFQ1RJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdGhhdCBhbGxvd3MgaWdub3JpbmcgZW51bSB2YWx1ZSBhc3NpZ25tZW50IChlLmcuIGJvdGggJyhfQzJFbnVtQ29uc3Qpa1ZhbHVlID0geCcKKyAqIGFuZCAnKF9DMkVudW1Db25zdClrVmFsdWUnIHdpbGwgZXZhbCB0byBrVmFsdWUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBfQzJFbnVtQ29uc3QgeworcHVibGljOgorICAgIC8vIGltcGxpY2l0IGNvbnZlcnNpb24gZnJvbSBUCisgICAgaW5saW5lIF9DMkVudW1Db25zdChUIHZhbHVlKSA6IF9tVmFsdWUodmFsdWUpIHt9CisgICAgLy8gaW1wbGljaXQgY29udmVyc2lvbiB0byBUCisgICAgaW5saW5lIG9wZXJhdG9yIFQoKSB7IHJldHVybiBfbVZhbHVlOyB9CisgICAgLy8gaW1wbGljaXQgY29udmVyc2lvbiB0byBDMlZhbHVlOjpQcmltaXRpdmUKKyAgICBpbmxpbmUgb3BlcmF0b3IgQzJWYWx1ZTo6UHJpbWl0aXZlKCkgeyByZXR1cm4gKFQpX21WYWx1ZTsgfQorICAgIC8vIGlnbm9yZSBhc3NpZ25tZW50IGFuZCByZXR1cm4gVCBoZXJlIHRvIGF2b2lkIGltcGxpY2l0IGNvbnZlcnNpb24gdG8gVCBsYXRlcgorICAgIGlubGluZSBUICZvcGVyYXRvciA9KFQgdmFsdWUgX191bnVzZWQpIHsgcmV0dXJuIF9tVmFsdWU7IH0KK3ByaXZhdGU6CisgICAgVCBfbVZhbHVlOworfTsKKworLy8vIG1hcHBlciB0byBnZXQgbmFtZSBvZiBlbnVtCisvLy8gXG5vdGUgdGhpcyB3aWxsIGNvbnRhaW4gYW55IGluaXRpYWxpemF0aW9uLCB3aGljaCB3ZSB3aWxsIHJlbW92ZSB3aGVuIGNvbnZlcnRpbmcgdG8gbG93ZXItY2FzZQorI2RlZmluZSBfQzJfR0VUX0VOVU1fTkFNRSh4LCB5KSAjeAorLy8vIG1hcHBlciB0byBnZXQgdmFsdWUgb2YgZW51bQorI2RlZmluZSBfQzJfR0VUX0VOVU1fVkFMVUUoeCwgdHlwZSkgKF9DMkVudW1Db25zdDx0eXBlPil4CisKKy8vLyBcZW5kY29uZAorCitjbGFzcyBfQzJFbnVtVXRpbHMgeworICAgIHN0YXRpYyBDMlN0cmluZyBjYW1lbENhc2VUb0Rhc2hlZChDMlN0cmluZyBuYW1lKTsKKworICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gc2FuaXRpemVFbnVtVmFsdWVOYW1lcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyU3RyaW5nTGl0ZXJhbD4gbmFtZXMsCisgICAgICAgICAgICBDMlN0cmluZ0xpdGVyYWwgX3ByZWZpeCA9IG51bGxwdHIpOworCisgICAgZnJpZW5kIGNsYXNzIEMyVXRpbFRlc3RfRW51bVV0aWxzVGVzdF9UZXN0OworCitwdWJsaWM6CisgICAgLy8gdGhpcyBtYXkgbm90IGJlIHVzZWQuLi4KKyAgICBzdGF0aWMgQzJfSElERSBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gcGFyc2VFbnVtVmFsdWVzRnJvbVN0cmluZyhDMlN0cmluZ0xpdGVyYWwgdmFsdWUpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgQzJfSElERSBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIHNhbml0aXplRW51bVZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFQ+IHZhbHVlcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RyaW5nTGl0ZXJhbD4gbmFtZXMsCisgICAgICAgICAgICBDMlN0cmluZ0xpdGVyYWwgcHJlZml4ID0gbnVsbHB0cikgeworICAgICAgICBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIG5hbWVkVmFsdWVzOworICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gc2FuaXRpemVkTmFtZXMgPSBzYW5pdGl6ZUVudW1WYWx1ZU5hbWVzKG5hbWVzLCBwcmVmaXgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCkgJiYgaSA8IHNhbml0aXplZE5hbWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBuYW1lZFZhbHVlcy5lbXBsYWNlX2JhY2soc2FuaXRpemVkTmFtZXNbaV0sIHZhbHVlc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5hbWVkVmFsdWVzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEU+CisgICAgc3RhdGljIEMyX0hJREUgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBjdXN0b21FbnVtVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEMyU3RyaW5nTGl0ZXJhbCwgRT4+IGl0ZW1zKSB7CisgICAgICAgIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgbmFtZWRWYWx1ZXM7CisgICAgICAgIGZvciAoYXV0byAmaXRlbSA6IGl0ZW1zKSB7CisgICAgICAgICAgICBuYW1lZFZhbHVlcy5lbXBsYWNlX2JhY2soaXRlbS5maXJzdCwgaXRlbS5zZWNvbmQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1lZFZhbHVlczsKKyAgICB9Cit9OworCisjZGVmaW5lIERFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKSBcCisgICAgX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXywgbmFtZSwgdHlwZSwgcHJlZml4LCBcCisgICAgICAgICAgICAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIoZW5hYmxlZCwgbmFtZSwgdHlwZSwgcHJlZml4LCAuLi4pIFwKKyAgICBfX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKGVuYWJsZWQsIG5hbWUsIHR5cGUsIHByZWZpeCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihlbmFibGVkLCBuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikgXAorICAgIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSIyNlbmFibGVkKG5hbWUsIHR5cGUsIHByZWZpeCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX19fREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIobmFtZSwgdHlwZSwgcHJlZml4LCAuLi4pIFwKK3RlbXBsYXRlPD4gXAorQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoY29uc3QgbmFtZSAmciBfX3VudXNlZCkgeyBcCisgICAgcmV0dXJuIF9DMkVudW1VdGlsczo6c2FuaXRpemVFbnVtVmFsdWVzKCBcCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHsgX0MyX01BUChfQzJfR0VUX0VOVU1fVkFMVUUsIHR5cGUsIF9fVkFfQVJHU19fKSB9LCBcCisgICAgICAgICAgICB7IF9DMl9NQVAoX0MyX0dFVF9FTlVNX05BTUUsIHR5cGUsIF9fVkFfQVJHU19fKSB9LCBcCisgICAgICAgICAgICBwcmVmaXgpOyBcCit9CisjZGVmaW5lIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKQorCisjZGVmaW5lIERFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIobmFtZSwgbmFtZXMpIFwKKyAgICBfREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18sIG5hbWUsIG5hbWVzKQorI2RlZmluZSBfREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihlbmFibGVkLCBuYW1lLCBuYW1lcykgXAorICAgIF9fREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihlbmFibGVkLCBuYW1lLCBuYW1lcykKKyNkZWZpbmUgX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKGVuYWJsZWQsIG5hbWUsIG5hbWVzKSBcCisgICAgX19fREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUiMjZW5hYmxlZChuYW1lLCBuYW1lcykKKyNkZWZpbmUgX19fREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihuYW1lLCBuYW1lcykgXAordGVtcGxhdGU8PiBcCitDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0Zvcihjb25zdCBuYW1lICZyIF9fdW51c2VkKSB7IFwKKyAgICByZXR1cm4gX0MyRW51bVV0aWxzOjpjdXN0b21FbnVtVmFsdWVzKCBcCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8QzJTdHJpbmdMaXRlcmFsLCBuYW1lPj4gbmFtZXMpOyBcCit9CisjZGVmaW5lIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVJfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18obmFtZSwgbmFtZXMpCisKKy8qKgorICogRGVmaW5lcyBhbiBlbnVtIHR5cGUgd2l0aCB0aGUgZGVmYXVsdCBuYW1lZCB2YWx1ZSBtYXBwZXIuIFRoZSBkZWZhdWx0IG1hcHBlcgorICogZmluZHMgYW5kIHJlbW92ZXMgdGhlIGxvbmdlc3QgY29tbW9uIHByZWZpeCBhY3Jvc3MgYWxsIG9mIHRoZSBlbnVtIHZhbHVlIG5hbWVzLCBhbmQKKyAqIHJlcGxhY2VzIGNhbWVsLWNhc2Ugc2VwYXJhdG9ycyB3aXRoIGRhc2hlcyAoJy0nKS4KKyAqCisgKiBUaGlzIG1hY3JvIG11c3QgYmUgdXNlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIGFuZCBuYW1lc3BhY2UuCisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgQzJFTlVNKGMyX2VudW1fdCwgdWludDMyX3QsCisgKiAgICBDMl9WQUxVRTEsCisgKiAgICBDMl9WQUxVRTIgPSA1LAorICogICAgQzJfVkFMVUUzID0gQzJfVkFMVUUxICsgMSkKKyAqICAvLyBuYW1lZCB2YWx1ZXMgYXJlOiBDMl9WQUxVRTEgPT4gIjEiLCBDMl9WQUxVRTIgPT4gIjIiLCAuLi4KKyAqICAvLyBsb25nZXN0IGNvbW1vbiBwcmVmaXggaXMgIkMyX1ZBTFVFIgorICogIH5+fn5+fn5+fn5+fn4KKyAqCisgKiBccGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBlbnVtIHR5cGUgKFRoaXMgY2FuIGJlIGFuIGlubmVyIGNsYXNzIGVudW0uKQorICogXHBhcmFtIHR5cGUgdW5kZXJseWluZyB0eXBlCisgKi8KKyNkZWZpbmUgQzJFTlVNKG5hbWUsIHR5cGUsIC4uLikgXAorZW51bSBuYW1lIDogdHlwZSB7IF9fVkFfQVJHU19fIH07IFwKK0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKG5hbWUsIHR5cGUsIG51bGxwdHIsIF9fVkFfQVJHU19fKQorCisvKioKKyAqIERlZmluZXMgYW4gZW51bSB0eXBlIHdpdGggdGhlIGRlZmF1bHQgbmFtZWQgdmFsdWUgbWFwcGVyIGJ1dCBjdXN0b20gcHJlZml4LiBUaGUgZGVmYXVsdAorICogbWFwcGVyIHJlbW92ZXMgdGhlIHByZWZpeCBmcm9tIGFsbCBvZiB0aGUgZW51bSB2YWx1ZSBuYW1lcyAoaWYgcHJlc2VudCksIGFuZAorICogaW5zZXJ0cyBkYXNoZXMgYXQgY2FtZWwtY2FzZSBzZXBhcmF0b3JzIChsb3dIaWdoIGJlY29tZXMgbG93LWhpZ2gpIGFuZCBhbHNvIHJlcGxhY2VzCisgKiBub24tbGVhZGluZyB1bmRlcnNjb3JlcyB3aXRoIGRhc2hlcyAoJy0nKS4KKyAqCisgKiBUaGlzIG1hY3JvIG11c3QgYmUgdXNlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIGFuZCBuYW1lc3BhY2UuCisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgQzJFTlVNX0NVU1RPTV9QUkVGSVgoYzJfZW51bV90LCB1aW50MzJfdCwgIkMyXyIsCisgKiAgICBDMl9WQUxVRTEsCisgKiAgICBDMl9WQUxVRTIgPSA1LAorICogICAgQzJfVkFMVUUzID0gQzJfVkFMVUUxICsgMSkKKyAqICAvLyBuYW1lZCB2YWx1ZXMgYXJlOiBDMl9WQUxVRTEgPT4gIlZBTFVFMSIsIEMyX1ZBTFVFMiA9PiAiVkFMVUUyIiwgLi4uCisgKiAgfn5+fn5+fn5+fn5+fgorICoKKyAqIFxwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIGVudW0gdHlwZSAoVGhpcyBjYW4gYmUgYW4gaW5uZXIgY2xhc3MgZW51bS4pCisgKiBccGFyYW0gdHlwZSB1bmRlcmx5aW5nIHR5cGUKKyAqIFxwYXJhbSBwcmVmaXggcHJlZml4IHRvIHJlbW92ZQorICovCisjZGVmaW5lIEMyRU5VTV9DVVNUT01fUFJFRklYKG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKSBcCitlbnVtIG5hbWUgOiB0eXBlIHsgX19WQV9BUkdTX18gfTsgXAorREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIobmFtZSwgdHlwZSwgcHJlZml4LCBfX1ZBX0FSR1NfXykKKworLyoqCisgKiBEZWZpbmVzIGFuIGVudW0gdHlwZSB3aXRoIGN1c3RvbSBuYW1lcy4KKyAqCisgKiBUaGlzIG1hY3JvIG11c3QgYmUgdXNlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIGFuZCBuYW1lc3BhY2UuCisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgQzJFTlVNX0NVU1RPTV9OQU1FUyhTb21lU3RydWN0OjpjMl9lbnVtX3QsIHVpbnQzMl90LCAoeworICogICAgICB7ICJPbmUiLCBTb21lU3RydWN0OjpDMl9WQUxVRTEgfSwKKyAqICAgICAgeyAiVHdvIiwgU29tZVN0cnVjdDo6QzJfVkFMVUUyIH0sCisgKiAgICAgIHsgIlRocmVlIiwgU29tZVN0cnVjdDo6QzJfVkFMVUUzIH0gfSksCisgKiAgICBDMl9WQUxVRTEsCisgKiAgICBDMl9WQUxVRTIgPSA1LAorICogICAgQzJfVkFMVUUzID0gQzJfVkFMVUUxICsgMSkKKyAqCisgKiAgLy8gbmFtZWQgdmFsdWVzIGFyZTogQzJfVkFMVUUxID0+ICJPbmUiLCBDMl9WQUxVRTIgPT4gIlR3byIsIC4uLgorICogIH5+fn5+fn5+fn5+fn4KKyAqLworI2RlZmluZSBDMkVOVU1fQ1VTVE9NX05BTUVTKG5hbWUsIHR5cGUsIG5hbWVzLCAuLi4pIFwKK2VudW0gbmFtZSA6IHR5cGUgeyBfX1ZBX0FSR1NfXyB9OyBcCitERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKG5hbWUsIG5hbWVzKQorCisvKioKKyAqIE1ha2UgZW51bXMgdXNhYmxlIGFzIHRoZWlyIGludGVncmFsIHR5cGVzLgorICoKKyAqIE5vdGU6IHRoaXMgbWFrZXMgdGhlbSBub3QgdXNhYmxlIGluIHByaW50ZigpCisgKi8KK3RlbXBsYXRlPGNsYXNzIEU+CitzdHJ1Y3QgQzJFYXN5RW51bSB7CisgICAgdXNpbmcgVSA9IHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEU+Ojp0eXBlOworICAgIEUgdmFsdWU7CisgICAgLy8gZGVmaW5lIGNvbnZlcnNpb24gZnVuY3Rpb25zCisgICAgaW5saW5lIGNvbnN0ZXhwciBvcGVyYXRvciBFKCkgY29uc3QgeyByZXR1cm4gdmFsdWU7IH0KKyAgICBpbmxpbmUgY29uc3RleHByIEMyRWFzeUVudW0oRSB2YWx1ZV8pIDogdmFsdWUodmFsdWVfKSB7IH0KKyAgICBpbmxpbmUgY29uc3RleHByIEMyRWFzeUVudW0oVSB2YWx1ZV8pIDogdmFsdWUoRSh2YWx1ZV8pKSB7IH0KKyAgICBpbmxpbmUgY29uc3RleHByIEMyRWFzeUVudW0oKSA9IGRlZmF1bHQ7Cit9OworCisvLyBtYWtlIEMyRWFzeUVudW0gYmVoYXZlIGxpa2UgYSByZWd1bGFyIGVudW0KKworbmFtZXNwYWNlIHN0ZCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRT4KKyAgICBzdHJ1Y3QgdW5kZXJseWluZ190eXBlPEMyRWFzeUVudW08RT4+IHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSB1bmRlcmx5aW5nX3R5cGU8RT46OnR5cGUgdHlwZTsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRT4KKyAgICBzdHJ1Y3QgaXNfZW51bTxDMkVhc3lFbnVtPEU+PiB7CisgICAgICAgIGNvbnN0ZXhwciBzdGF0aWMgYm9vbCB2YWx1ZSA9IHRydWU7CisgICAgfTsKK30KKworI2VuZGlmICAvLyBDMkVOVU1fSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjY0YmYzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtLmgKQEAgLTAsMCArMSwxNjczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlBBUkFNX0hfCisjZGVmaW5lIEMyUEFSQU1fSF8KKworI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLy8gXGFkZHRvZ3JvdXAgUGFyYW1ldGVycworLy8vIEB7CisKKy8vLyBcZGVmZ3JvdXAgaW50ZXJuYWwgSW50ZXJuYWwgaGVscGVycy4KKworLyohCisgKiBcZmlsZQorICogUEFSQU1FVEVSUzogU0VUVElOR3MsIFRVTklOR3MsIGFuZCBJTkZPcworICogPT09CisgKgorICogVGhlc2UgcmVwcmVzZW50IG1pc2NlbGxhbmVvdXMgY29udHJvbCBhbmQgbWV0YWRhdGEgaW5mb3JtYXRpb24gYW5kIGFyZSBsaWtlbHkgY29waWVkIGludG8KKyAqIGtlcm5lbCBzcGFjZS4gVGhlcmVmb3JlLCB0aGVzZSBhcmUgQy1saWtlIHN0cnVjdHVyZXMgZGVzaWduZWQgdG8gY2FycnkganVzdCBhIHNtYWxsIGFtb3VudCBvZgorICogaW5mb3JtYXRpb24uIFdlIGFyZSB1c2luZyBDKysgdG8gYmUgYWJsZSB0byBhZGQgY29uc3RydWN0b3JzLCBhcyB3ZWxsIGFzIG5vbi12aXJ0dWFsIGFuZCBjbGFzcworICogbWV0aG9kcy4KKyAqCisgKiA9PVNwZWNpZmljYXRpb24gZGV0YWlsczoKKyAqCisgKiBSZXN0cmljdGlvbnM6CisgKiAgIC0gbXVzdCBiZSBQT0Qgc3RydWN0LCBlLmcuIG5vIHZ0YWJsZSAobm8gdmlydHVhbCBkZXN0cnVjdG9yKQorICogICAtIG11c3QgaGF2ZSB0aGUgc2FtZSBzaXplIGluIDY0LWJpdCBhbmQgMzItYml0IG1vZGUgKG5vIHNpemVfdCkKKyAqICAgLSBhcyBzdWNoLCBubyBwb2ludGVyIG1lbWJlcnMKKyAqICAgLSBzb21lIGNvbW1vbiBtZW1iZXIgZmllbGQgbmFtZXMgYXJlIHJlc2VydmVkIGFzIHRoZXkgYXJlIGRlZmluZWQgYXMgbWV0aG9kcyBmb3IgYWxsCisgKiAgICAgcGFyYW1ldGVyczoKKyAqICAgICB0aGV5IGFyZTogc2l6ZSwgdHlwZSwga2luZCwgaW5kZXggYW5kIHN0cmVhbQorICoKKyAqIEJlaGF2aW9yOgorICogLSBQYXJhbXMgY2FuIGJlIGdsb2JhbCAobm90IHJlbGF0ZWQgdG8gaW5wdXQgb3Igb3V0cHV0KSwgcmVsYXRlZCB0byBpbnB1dCBvciBvdXRwdXQsCisgKiAgIG9yIHJlbGF0ZWQgdG8gYW4gaW5wdXQvb3V0cHV0IHN0cmVhbS4KKyAqIC0gQWxsIHBhcmFtcyBhcmUgcXVlcmllZC9zZXQgdXNpbmcgYSB1bmlxdWUgcGFyYW0gaW5kZXgsIHdoaWNoIGluY29ycG9yYXRlcyBhIHBvdGVudGlhbCBzdHJlYW0KKyAqICAgaW5kZXggYW5kL29yIHBvcnQuCisgKiAtIFF1ZXJ5aW5nIChzdXBwb3J0ZWQpIHBhcmFtcyBNVVNUIG5ldmVyIGZhaWwuCisgKiAtIEFsbCBwYXJhbXMgTVVTVCBoYXZlIGRlZmF1bHQgdmFsdWVzLgorICogLSBJZiBzb21lIGZpZWxkcyBoYXZlICJ1bnN1cHBvcnRlZCIgb3IgImludmFsaWQiIHZhbHVlcyBkdXJpbmcgc2V0dGluZywgdGhpcyBTSE9VTEQgYmUKKyAqICAgY29tbXVuaWNhdGVkIHRvIHRoZSBhcHAuCisgKiAgIGEpIElkZWFsbHksIHRoaXMgc2hvdWxkIGJlIGF2b2lkZWQuICBXaGVuIHNldHRpbmcgcGFyYW1ldGVycywgaW4gZ2VuZXJhbCwgY29tcG9uZW50IHNob3VsZCBkbworICogICAgICJiZXN0IGVmZm9ydCIgdG8gYXBwbHkgYWxsIHNldHRpbmdzLiBJdCBzaG91bGQgY2hhbmdlICJpbnZhbGlkL3Vuc3VwcG9ydGVkIiB2YWx1ZXMgdG8gdGhlCisgKiAgICAgbmVhcmVzdCBzdXBwb3J0ZWQgdmFsdWVzLgorICogICAtIFRoaXMgaXMgY29tbXVuaWNhdGVkIHRvIHRoZSBjbGllbnQgYnkgY2hhbmdpbmcgdGhlIHNvdXJjZSB2YWx1ZXMgaW4gdHVuZSgpLworICogICAgIGNvbmZpZ3VyZSgpLgorICogICBiKSBJZiBmYWxsaW5nIGJhY2sgdG8gYSBzdXBwb3J0ZWQgdmFsdWUgaXMgYWJzb2x1dGVseSBpbXBvc3NpYmxlLCB0aGUgY29tcG9uZW50IFNIQUxMIHJldHVybgorICogICAgIGFuIGVycm9yIGZvciB0aGUgc3BlY2lmaWMgc2V0dGluZywgYnV0IHNob3VsZCBjb250aW51ZSB0byBhcHBseSBvdGhlciBzZXR0aW5ncy4KKyAqICAgICBUT0RPOiB0aGlzIGN1cnJlbnRseSBtYXkgcmVzdWx0IGluIHVuaW50ZW5kZWQgcmVzdWx0cy4KKyAqCisgKiAqKk5PVEU6KiogdW5saWtlIE9NWCwgcGFyYW1zIGFyZSBub3QgdmVyc2lvbmVkLiBJbnN0ZWFkLCBhIG5ldyBzdHJ1Y3Qgd2l0aCBuZXcgcGFyYW0gaW5kZXgKKyAqIFNIQUxMIGJlIGFkZGVkIGFzIG5ldyB2ZXJzaW9ucyBhcmUgcmVxdWlyZWQuCisgKgorICogVGhlIHByb3BlciBzdWJ0eXBlIChTZXR0aW5nLCBJbmZvIG9yIFBhcmFtKSBpcyBpbmNvcnBvcmF0ZWQgaW50byB0aGUgY2xhc3MgdHlwZS4gRGVmaW5lIHN0cnVjdHMKKyAqIHRvIGRlZmluZSBtdWx0aXBsZSBzdWJ0eXBlZCB2ZXJzaW9ucyBvZiByZWxhdGVkIHBhcmFtZXRlcnMuCisgKgorICogPT1JbXBsZW1lbnRhdGlvbiBkZXRhaWxzOgorICoKKyAqIC0gVXNlIG1hY3JvcyB0byBkZWZpbmUgcGFyYW1ldGVycworICogLSBBbGwgcGFyYW1ldGVycyBtdXN0IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yCisgKiAgIC0gVGhpcyBpcyBvbmx5IHVzZWQgZm9yIGluc3RhbnRpYXRpbmcgdGhlIGNsYXNzIGluIHNvdXJjZSAoZS5nLiB3aWxsIG5vdCBiZSB1c2VkCisgKiAgICAgd2hlbiBidWlsZGluZyBhIHBhcmFtZXRlciBieSB0aGUgZnJhbWV3b3JrIGZyb20ga2V5L3ZhbHVlIHBhaXJzLikKKyAqLworCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKworLyoqCisgKiBQYXJhbWV0ZXIgYmFzZSBjbGFzcy4KKyAqLworc3RydWN0IEMyUGFyYW0geworICAgIC8vIHBhcmFtIGluZGV4IGVuY29tcGFzc2VzIHRoZSBmb2xsb3dpbmc6CisgICAgLy8KKyAgICAvLyAtIGtpbmQgKHNldHRpbmcsIHR1bmluZywgaW5mbywgc3RydWN0KQorICAgIC8vIC0gc2NvcGUKKyAgICAvLyAgIC0gZGlyZWN0aW9uIChnbG9iYWwsIGlucHV0LCBvdXRwdXQpCisgICAgLy8gICAtIHN0cmVhbSBmbGFnCisgICAgLy8gICAtIHN0cmVhbSBJRCAodXN1YWxseSAwKQorICAgIC8vIC0gYW5kIHRoZSBwYXJhbWV0ZXIncyB0eXBlIChjb3JlIGluZGV4KQorICAgIC8vICAgLSBmbGV4aWJsZSBwYXJhbWV0ZXIgZmxhZworICAgIC8vICAgLSB2ZW5kb3IgZXh0ZW5zaW9uIGZsYWcKKyAgICAvLyAgIC0gdHlwZSBpbmRleCAodGhpcyBpbmNsdWRlcyB0aGUgdmVuZG9yIGV4dGVuc2lvbiBmbGFnKQorICAgIC8vCisgICAgLy8gbGF5b3V0OgorICAgIC8vCisgICAgLy8gICAgICAgIGtpbmQgOiA8LS0tLS0tLSBzY29wZSAtLS0tLS0tPiA6IDwtLS0tLSBjb3JlIGluZGV4IC0tLS0tPgorICAgIC8vICAgICAgKy0tLS0tLSstLS0tLSstLS0rLS0tLS0tKy0tLS0tLS0tKy0tLS18LS0tLS0tKy0tLS0tLS0tLS0tLS0tKworICAgIC8vICAgICAgfCBraW5kIHwgZGlyIHwgLSB8c3RyZWFtfHN0cmVhbUlEfGZsZXh8dmVuZG9yfCAgdHlwZSBpbmRleCAgfAorICAgIC8vICAgICAgKy0tLS0tLSstLS0tLSstLS0rLS0tLS0tKy0tLS0tLS0tKy0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tKworICAgIC8vICBiaXQ6IDMxLi4zMCAyOS4yOCAgICAgICAyNSAgIDI0IC4uIDE3ICAxNiAgICAxNSAgIDE0ICAgIC4uICAgICAwCisgICAgLy8KK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDMlBhcmFtIGtpbmRzLCB1c2FibGUgYXMgYml0bWFwcy4KKyAgICAgKi8KKyAgICBlbnVtIGtpbmRfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgTk9ORSAgICA9IDAsCisgICAgICAgIFNUUlVDVCAgPSAoMSA8PCAwKSwKKyAgICAgICAgSU5GTyAgICA9ICgxIDw8IDEpLAorICAgICAgICBTRVRUSU5HID0gKDEgPDwgMiksCisgICAgICAgIFRVTklORyAgPSAoMSA8PCAzKSB8IFNFVFRJTkcsIC8vIHR1bmluZ3MgYXJlIHNldHRpbmdzCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFRoZSBwYXJhbWV0ZXIgdHlwZSBpbmRleCBzcGVjaWZpZXMgdGhlIHVuZGVybHlpbmcgcGFyYW1ldGVyIHR5cGUgb2YgYSBwYXJhbWV0ZXIgYXMKKyAgICAgKiBhbiBpbnRlZ2VyIHZhbHVlLgorICAgICAqCisgICAgICogUGFyYW1ldGVyIHR5cGVzIGFyZSBkaXZpZGVkIGludG8gdHdvIGdyb3VwczogcGxhdGZvcm0gdHlwZXMgYW5kIHZlbmRvciB0eXBlcy4KKyAgICAgKgorICAgICAqIFBsYXRmb3JtIHR5cGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBwbGF0Zm9ybSBhbmQgYXJlIGNvbW1vbiBmb3IgYWxsIGltcGxlbWVudGF0aW9ucy4KKyAgICAgKgorICAgICAqIFZlbmRvciB0eXBlcyBhcmUgZGVmaW5lZCBieSBlYWNoIHZlbmRvcnMsIHNvIHRoZXkgbWF5IGRpZmZlciBiZXR3ZWVuIGltcGxlbWVudGF0aW9ucy4KKyAgICAgKiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHZlbmRvciB0eXBlcyBiZSB0aGUgc2FtZSBmb3IgYWxsIGltcGxlbWVudGF0aW9ucyBieSBhIHNwZWNpZmljCisgICAgICogdmVuZG9yLgorICAgICAqLworICAgIHR5cGVkZWYgdWludDMyX3QgdHlwZV9pbmRleF90OworICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgICAgICBUWVBFX0lOREVYX1ZFTkRPUl9TVEFSVCA9IDB4MDAwMDgwMDAsIC8vLzwgdmVuZG9yIGluZGljZXMgU0hBTEwgc3RhcnQgYWZ0ZXIgdGhpcworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDb3JlIGluZGV4IGlzIHRoZSB1bmRlcmx5aW5nIHBhcmFtZXRlciB0eXBlIGZvciBhIHBhcmFtZXRlci4gSXQgaXMgdXNlZCB0byBkZXNjcmliZSB0aGUKKyAgICAgKiBsYXlvdXQgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgcmVnYXJkbGVzcyBvZiB0aGUgY29tcG9uZW50IG9yIHBhcmFtZXRlciBraW5kL3Njb3BlLgorICAgICAqCisgICAgICogSXQgaXMgdXNlZCB0byBpZGVudGlmeSBhbmQgZGlzdGluZ3Vpc2ggZ2xvYmFsIHBhcmFtZXRlcnMsIGFuZCBhbHNvIHBhcmFtZXRlcnMgb24gYSBnaXZlbgorICAgICAqIHBvcnQgb3Igc3RyZWFtLiBUaGV5IG11c3QgYmUgdW5pcXVlIGZvciB0aGUgc2V0IG9mIGdsb2JhbCBwYXJhbWV0ZXJzLCBhcyB3ZWxsIGFzIGZvciB0aGUKKyAgICAgKiBzZXQgb2YgcGFyYW1ldGVycyBvbiBlYWNoIHBvcnQgb3IgZWFjaCBzdHJlYW0sIGJ1dCB0aGUgc2FtZSBjb3JlIGluZGV4IGNhbiBiZSB1c2VkIGZvcgorICAgICAqIHBhcmFtZXRlcnMgb24gZGlmZmVyZW50IHN0cmVhbXMgb3IgcG9ydHMsIGFzIHdlbGwgYXMgZm9yIGdsb2JhbCBwYXJhbWV0ZXJzIGFuZCBwb3J0L3N0cmVhbQorICAgICAqIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBNdWx0aXBsZSBwYXJhbWV0ZXIgdHlwZXMgY2FuIHNoYXJlIHRoZSBzYW1lIGxheW91dC4KKyAgICAgKgorICAgICAqIFxub3RlIFRoZSBsYXlvdXQgZm9yIGFsbCBwYXJhbWV0ZXJzIHdpdGggdGhlIHNhbWUgY29yZSBpbmRleCBhY3Jvc3MgYWxsIGNvbXBvbmVudHMgbXVzdAorICAgICAqIGJlIGlkZW50aWNhbC4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQ29yZUluZGV4IHsKKyAgICAvL3B1YmxpYzoKKyAgICAgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgICAgIElTX0ZMRVhfRkxBRyA9IDB4MDAwMTAwMDAsCisgICAgICAgIH07CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgICAgICBLSU5EX01BU0sgICAgICA9IDB4QzAwMDAwMDAsCisgICAgICAgICAgICBLSU5EX1NUUlVDVCAgICA9IDB4MDAwMDAwMDAsCisgICAgICAgICAgICBLSU5EX1RVTklORyAgICA9IDB4NDAwMDAwMDAsCisgICAgICAgICAgICBLSU5EX1NFVFRJTkcgICA9IDB4ODAwMDAwMDAsCisgICAgICAgICAgICBLSU5EX0lORk8gICAgICA9IDB4QzAwMDAwMDAsCisKKyAgICAgICAgICAgIERJUl9NQVNLICAgICAgID0gMHgzMDAwMDAwMCwKKyAgICAgICAgICAgIERJUl9HTE9CQUwgICAgID0gMHgyMDAwMDAwMCwKKyAgICAgICAgICAgIERJUl9VTkRFRklORUQgID0gRElSX01BU0ssIC8vIE1VU1QgaGF2ZSBhbGwgYml0cyBzZXQKKyAgICAgICAgICAgIERJUl9JTlBVVCAgICAgID0gMHgwMDAwMDAwMCwKKyAgICAgICAgICAgIERJUl9PVVRQVVQgICAgID0gMHgxMDAwMDAwMCwKKworICAgICAgICAgICAgSVNfU1RSRUFNX0ZMQUcgID0gMHgwMjAwMDAwMCwKKyAgICAgICAgICAgIFNUUkVBTV9JRF9NQVNLICA9IDB4MDFGRTAwMDAsCisgICAgICAgICAgICBTVFJFQU1fSURfU0hJRlQgPSAxNywKKyAgICAgICAgICAgIE1BWF9TVFJFQU1fSUQgICA9IFNUUkVBTV9JRF9NQVNLID4+IFNUUkVBTV9JRF9TSElGVCwKKyAgICAgICAgICAgIFNUUkVBTV9NQVNLICAgICA9IElTX1NUUkVBTV9GTEFHIHwgU1RSRUFNX0lEX01BU0ssCisKKyAgICAgICAgICAgIElTX1ZFTkRPUl9GTEFHICA9IDB4MDAwMDgwMDAsCisgICAgICAgICAgICBUWVBFX0lOREVYX01BU0sgPSAweDAwMDBGRkZGLAorICAgICAgICAgICAgQ09SRV9NQVNLICAgICAgID0gVFlQRV9JTkRFWF9NQVNLIHwgSVNfRkxFWF9GTEFHLAorICAgICAgICB9OworCisgICAgcHVibGljOgorICAgICAgICAvLy8gY29uc3RydWN0b3IvY29udmVyc2lvbiBmcm9tIHVpbnQzMl90CisgICAgICAgIGlubGluZSBDb3JlSW5kZXgodWludDMyX3QgaW5kZXgpIDogbUluZGV4KGluZGV4KSB7IH0KKworICAgICAgICAvLyBubyBjb252ZXJzaW9uIGZyb20gdWludDY0X3QKKyAgICAgICAgaW5saW5lIENvcmVJbmRleCh1aW50NjRfdCBpbmRleCkgPSBkZWxldGU7CisKKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIHZlbmRvciBleHRlbnNpb24gcGFyYW1ldGVyCisgICAgICAgIGlubGluZSBib29sIGlzVmVuZG9yKCkgY29uc3QgeyByZXR1cm4gbUluZGV4ICYgSVNfVkVORE9SX0ZMQUc7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgZmxleGlibGUgcGFyYW1ldGVyICh3aXRoIHZhcmlhYmxlIHNpemUpCisgICAgICAgIGlubGluZSBib29sIGlzRmxleGlibGUoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiBJU19GTEVYX0ZMQUc7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgY29yZSBpbmRleAorICAgICAgICAvLy8gVGhpcyBpcyB0aGUgY29tYmluYXRpb24gb2YgdGhlIHBhcmFtZXRlciB0eXBlIGluZGV4IGFuZCB0aGUgZmxleGlibGUgZmxhZy4KKyAgICAgICAgaW5saW5lIHVpbnQzMl90IGNvcmVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIENPUkVfTUFTSzsgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBwYXJhbWV0ZXIgdHlwZSBpbmRleAorICAgICAgICBpbmxpbmUgdHlwZV9pbmRleF90IHR5cGVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIFRZUEVfSU5ERVhfTUFTSzsgfQorCisgICAgICAgIERFRklORV9GSUVMRF9BTkRfTUFTS19CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyhDb3JlSW5kZXgsIG1JbmRleCwgQ09SRV9NQVNLKQorCisgICAgcHJvdGVjdGVkOgorICAgICAgICB1aW50MzJfdCBtSW5kZXg7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFR5cGUgZW5jb21wYXNzZXMgdGhlIHBhcmFtZXRlcidzIGtpbmQgKHR1bmluZywgc2V0dGluZywgaW5mbyksIGl0cyBzY29wZSAod2hldGhlciB0aGUKKyAgICAgKiBwYXJhbWV0ZXIgaXMgZ2xvYmFsLCBpbnB1dCBvciBvdXRwdXQsIGFuZCB3aGV0aGVyIGl0IGlzIGZvciBhIHN0cmVhbSkgYW5kIHRoZSBpdHMgYmFzZQorICAgICAqIGluZGV4ICh3aGljaCBhbHNvIGRldGVybWluZXMgaXRzIGxheW91dCkuCisgICAgICovCisgICAgc3RydWN0IFR5cGUgOiBwdWJsaWMgQ29yZUluZGV4IHsKKyAgICAvL3B1YmxpYzoKKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIGdsb2JhbCBwYXJhbWV0ZXIgKG5vdCBmb3IgaW5wdXQgbm9yIG91dHB1dCkKKyAgICAgICAgaW5saW5lIGJvb2wgaXNHbG9iYWwoKSBjb25zdCB7IHJldHVybiAobUluZGV4ICYgRElSX01BU0spID09IERJUl9HTE9CQUw7IH0KKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhbiBpbnB1dCBvciBpbnB1dCBzdHJlYW0gcGFyYW1ldGVyCisgICAgICAgIGlubGluZSBib29sIGZvcklucHV0KCkgY29uc3QgeyByZXR1cm4gKG1JbmRleCAmIERJUl9NQVNLKSA9PSBESVJfSU5QVVQ7IH0KKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhbiBvdXRwdXQgb3Igb3V0cHV0IHN0cmVhbSBwYXJhbWV0ZXIKKyAgICAgICAgaW5saW5lIGJvb2wgZm9yT3V0cHV0KCkgY29uc3QgeyByZXR1cm4gKG1JbmRleCAmIERJUl9NQVNLKSA9PSBESVJfT1VUUFVUOyB9CisKKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIHN0cmVhbSBwYXJhbWV0ZXIKKyAgICAgICAgaW5saW5lIGJvb2wgZm9yU3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbUluZGV4ICYgSVNfU1RSRUFNX0ZMQUc7IH0KKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCkgcGFyYW1ldGVyCisgICAgICAgIGlubGluZSBib29sIGZvclBvcnQoKSBjb25zdCAgIHsgcmV0dXJuICFmb3JTdHJlYW0oKSAmJiAhaXNHbG9iYWwoKTsgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBwYXJhbWV0ZXIgdHlwZTogdGhlIHBhcmFtZXRlciBpbmRleCB3aXRob3V0IHRoZSBzdHJlYW0gSUQKKyAgICAgICAgaW5saW5lIHVpbnQzMl90IHR5cGUoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiAoflNUUkVBTV9JRF9NQVNLKTsgfQorCisgICAgICAgIC8vLyByZXR1cm4gdGhlIGtpbmQgKHN0cnVjdCwgaW5mbywgc2V0dGluZyBvciB0dW5pbmcpIG9mIHRoaXMgcGFyYW0KKyAgICAgICAgaW5saW5lIGtpbmRfdCBraW5kKCkgY29uc3QgeworICAgICAgICAgICAgc3dpdGNoIChtSW5kZXggJiBLSU5EX01BU0spIHsKKyAgICAgICAgICAgICAgICBjYXNlIEtJTkRfU1RSVUNUOiByZXR1cm4gU1RSVUNUOworICAgICAgICAgICAgICAgIGNhc2UgS0lORF9JTkZPOiByZXR1cm4gSU5GTzsKKyAgICAgICAgICAgICAgICBjYXNlIEtJTkRfU0VUVElORzogcmV0dXJuIFNFVFRJTkc7CisgICAgICAgICAgICAgICAgY2FzZSBLSU5EX1RVTklORzogcmV0dXJuIFRVTklORzsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9ORTsgLy8gc2hvdWxkIG5vdCBoYXBwZW4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyBjb25zdHJ1Y3Rvci9jb252ZXJzaW9uIGZyb20gdWludDMyX3QKKyAgICAgICAgaW5saW5lIFR5cGUodWludDMyX3QgaW5kZXgpIDogQ29yZUluZGV4KGluZGV4KSB7IH0KKworICAgICAgICAvLyBubyBjb252ZXJzaW9uIGZyb20gdWludDY0X3QKKyAgICAgICAgaW5saW5lIFR5cGUodWludDY0X3QgaW5kZXgpID0gZGVsZXRlOworCisgICAgICAgIERFRklORV9GSUVMRF9BTkRfTUFTS19CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyhUeXBlLCBtSW5kZXgsIH5TVFJFQU1fSURfTUFTSykKKworICAgIHByaXZhdGU6CisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJQYXJhbTsgICAvLyBmb3Igc2V0UG9ydCgpCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJUdW5pbmc7ICAvLyBmb3IgS0lORF9UVU5JTkcKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBDMlNldHRpbmc7IC8vIGZvciBLSU5EX1NFVFRJTkcKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBDMkluZm87ICAgIC8vIGZvciBLSU5EX0lORk8KKyAgICAgICAgLy8gZm9yIERJUl9HTE9CQUwKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJHbG9iYWxQYXJhbTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJQb3J0UGFyYW07ICAgLy8gZm9yIGtEaXIqCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyU3RyZWFtUGFyYW07IC8vIGZvciBrRGlyKgorICAgICAgICBmcmllbmQgc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yOyAvLyBmb3IgdGVzdGluZworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBwb3J0L3N0cmVhbSBkaXJlY3Rpb24uCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBjb3VsZCBub3Qgc2V0IGRpcmVjdGlvbiAoZS5nLiBpdCBpcyBnbG9iYWwgcGFyYW0pLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0UG9ydChib29sIG91dHB1dCkgeworICAgICAgICAgICAgaWYgKGlzR2xvYmFsKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1JbmRleCA9IChtSW5kZXggJiB+RElSX01BU0spIHwgKG91dHB1dCA/IERJUl9PVVRQVVQgOiBESVJfSU5QVVQpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIGluZGV4IGVuY29tcGFzc2VzIGFsbCByZW1haW5pbmcgaW5mb3JtYXRpb246IGJhc2ljYWxseSB0aGUgc3RyZWFtIElELgorICAgICAqLworICAgIHN0cnVjdCBJbmRleCA6IHB1YmxpYyBUeXBlIHsKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGluZGV4IGFzIHVpbnQzMl90CisgICAgICAgIGlubGluZSBvcGVyYXRvciB1aW50MzJfdCgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleDsgfQorCisgICAgICAgIC8vLyBjb25zdHJ1Y3Rvci9jb252ZXJzaW9uIGZyb20gdWludDMyX3QKKyAgICAgICAgaW5saW5lIEluZGV4KHVpbnQzMl90IGluZGV4KSA6IFR5cGUoaW5kZXgpIHsgfQorCisgICAgICAgIC8vLyBjb3B5IGNvbnN0cnVjdG9yCisgICAgICAgIGlubGluZSBJbmRleChjb25zdCBJbmRleCAmaW5kZXgpID0gZGVmYXVsdDsKKworICAgICAgICAvLyBubyBjb252ZXJzaW9uIGZyb20gdWludDY0X3QKKyAgICAgICAgaW5saW5lIEluZGV4KHVpbnQ2NF90IGluZGV4KSA9IGRlbGV0ZTsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgc3RyZWFtIElEIG9yIH4wIGlmIG5vdCBhIHN0cmVhbQorICAgICAgICBpbmxpbmUgdW5zaWduZWQgc3RyZWFtKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGZvclN0cmVhbSgpID8gcmF3U3RyZWFtKCkgOiB+MFU7CisgICAgICAgIH0KKworICAgICAgICAvLy8gUmV0dXJucyBhbiBpbmRleCB3aXRoIHN0cmVhbSBmaWVsZCBzZXQgdG8gZ2l2ZW4gc3RyZWFtLgorICAgICAgICBpbmxpbmUgSW5kZXggd2l0aFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIGNvbnN0IHsKKyAgICAgICAgICAgIEluZGV4IGl4ID0gbUluZGV4OworICAgICAgICAgICAgKHZvaWQpaXguc2V0U3RyZWFtKHN0cmVhbSk7CisgICAgICAgICAgICByZXR1cm4gaXg7CisgICAgICAgIH0KKworICAgICAgICAvLy8gc2V0cyB0aGUgcG9ydCAoZGlyZWN0aW9uKS4gUmV0dXJucyB0cnVlIGlmZiBzdWNjZXNzZnVsLgorICAgICAgICBpbmxpbmUgSW5kZXggd2l0aFBvcnQoYm9vbCBvdXRwdXQpIGNvbnN0IHsKKyAgICAgICAgICAgIEluZGV4IGl4ID0gbUluZGV4OworICAgICAgICAgICAgKHZvaWQpaXguc2V0UG9ydChvdXRwdXQpOworICAgICAgICAgICAgcmV0dXJuIGl4OworICAgICAgICB9CisKKyAgICAgICAgREVGSU5FX0ZJRUxEX0JBU0VEX0NPTVBBUklTT05fT1BFUkFUT1JTKEluZGV4LCBtSW5kZXgpCisKKyAgICBwcml2YXRlOgorICAgICAgICBmcmllbmQgc3RydWN0IEMyUGFyYW07ICAgICAgICAgICAvLyBmb3Igc2V0U3RyZWFtLCBNYWtlU3RyZWFtSWQsIGlzVmFsaWQKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsgLy8gZm9yIHRlc3RpbmcKKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0eXBlIGlzIHZhbGlkLCBlLmcuIGRpcmVjdGlvbiBpcyBub3QgdW5kZWZpbmVkIEFORAorICAgICAgICAgKiBzdHJlYW0gaXMgMCBpZiBub3QgYSBzdHJlYW0gcGFyYW0uCisgICAgICAgICAqLworICAgICAgICBpbmxpbmUgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gVHlwZTo6aXNWYWxpZCAoZXZlbiB0aG91Z2ggc29tZSBvZiB0aGlzIGNoZWNrIGNvdWxkIGJlCisgICAgICAgICAgICAvLyBwZXJmb3JtZWQgb24gdHlwZXMpIGFzIHRoaXMgaXMgb25seSB1c2VkIG9uIGluZGV4Li4uCisgICAgICAgICAgICByZXR1cm4gKGZvclN0cmVhbSgpID8gcmF3U3RyZWFtKCkgPCBNQVhfU1RSRUFNX0lEIDogcmF3U3RyZWFtKCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKG1JbmRleCAmIERJUl9NQVNLKSAhPSBESVJfVU5ERUZJTkVEOworICAgICAgICB9CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIHJhdyBzdHJlYW0gSUQgZmllbGQKKyAgICAgICAgaW5saW5lIHVuc2lnbmVkIHJhd1N0cmVhbSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAobUluZGV4ICYgU1RSRUFNX0lEX01BU0spID4+IFNUUkVBTV9JRF9TSElGVDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBzdHJlYW1JZCBiaXRmaWVsZCBmb3IgYSBnaXZlbiB8c3RyZWFtfC4gSWYgc3RyZWFtIGlzIGludmFsaWQsCisgICAgICAgIC8vLyByZXR1cm5zIGFuIGludmFsaWQgYml0ZmllbGQuCisgICAgICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgTWFrZVN0cmVhbUlkKHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICAgICAgLy8gc2F0dXJhdGUgc3RyZWFtIElEIChtYXggdmFsdWUgaXMgaW52YWxpZCkKKyAgICAgICAgICAgIGlmIChzdHJlYW0gPiBNQVhfU1RSRUFNX0lEKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtID0gTUFYX1NUUkVBTV9JRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoc3RyZWFtIDw8IFNUUkVBTV9JRF9TSElGVCkgJiBTVFJFQU1fSURfTUFTSzsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSBib29sIGNvbnZlcnRUb1N0cmVhbShib29sIG91dHB1dCwgdW5zaWduZWQgc3RyZWFtKSB7CisgICAgICAgICAgICBtSW5kZXggPSAobUluZGV4ICYgfkRJUl9NQVNLKSB8IElTX1NUUkVBTV9GTEFHOworICAgICAgICAgICAgKHZvaWQpc2V0UG9ydChvdXRwdXQpOworICAgICAgICAgICAgcmV0dXJuIHNldFN0cmVhbShzdHJlYW0pOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIHZvaWQgY29udmVydFRvUG9ydChib29sIG91dHB1dCkgeworICAgICAgICAgICAgbUluZGV4ID0gKG1JbmRleCAmIH4oRElSX01BU0sgfCBJU19TVFJFQU1fRkxBRykpOworICAgICAgICAgICAgKHZvaWQpc2V0UG9ydChvdXRwdXQpOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIHZvaWQgY29udmVydFRvR2xvYmFsKCkgeworICAgICAgICAgICAgbUluZGV4ID0gKG1JbmRleCAmIH4oRElSX01BU0sgfCBJU19TVFJFQU1fRkxBRykpIHwgRElSX0dMT0JBTDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBzdHJlYW0gaW5kZXguCisgICAgICAgICAqIFxyZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBjb3VsZCBub3Qgc2V0IGluZGV4IChlLmcuIG5vdCBhIHN0cmVhbSBwYXJhbSkuCisgICAgICAgICAqLworICAgICAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7CisgICAgICAgICAgICBpZiAoZm9yU3RyZWFtKCkpIHsKKyAgICAgICAgICAgICAgICBtSW5kZXggPSAobUluZGV4ICYgflNUUkVBTV9JRF9NQVNLKSB8IE1ha2VTdHJlYW1JZChzdHJlYW0pOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLT5zdHJlYW0oKSA8IE1BWF9TVFJFQU1fSUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCitwdWJsaWM6CisgICAgLy8gcHVibGljIGdldHRlcnMgZm9yIEluZGV4IG1ldGhvZHMKKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSB2ZW5kb3IgZXh0ZW5zaW9uIHBhcmFtZXRlcgorICAgIGlubGluZSBib29sIGlzVmVuZG9yKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5pc1ZlbmRvcigpOyB9CisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIGZsZXhpYmxlIHBhcmFtZXRlcgorICAgIGlubGluZSBib29sIGlzRmxleGlibGUoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmlzRmxleGlibGUoKTsgfQorICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBnbG9iYWwgcGFyYW1ldGVyIChub3QgZm9yIGlucHV0IG5vciBvdXRwdXQpCisgICAgaW5saW5lIGJvb2wgaXNHbG9iYWwoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmlzR2xvYmFsKCk7IH0KKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGFuIGlucHV0IG9yIGlucHV0IHN0cmVhbSBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgYm9vbCBmb3JJbnB1dCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguZm9ySW5wdXQoKTsgfQorICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYW4gb3V0cHV0IG9yIG91dHB1dCBzdHJlYW0gcGFyYW1ldGVyCisgICAgaW5saW5lIGJvb2wgZm9yT3V0cHV0KCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5mb3JPdXRwdXQoKTsgfQorCisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIHN0cmVhbSBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgYm9vbCBmb3JTdHJlYW0oKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmZvclN0cmVhbSgpOyB9CisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCkgcGFyYW1ldGVyCisgICAgaW5saW5lIGJvb2wgZm9yUG9ydCgpIGNvbnN0ICAgeyByZXR1cm4gX21JbmRleC5mb3JQb3J0KCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBzdHJlYW0gSUQgb3IgfjAgaWYgbm90IGEgc3RyZWFtCisgICAgaW5saW5lIHVuc2lnbmVkIHN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguc3RyZWFtKCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBwYXJhbWV0ZXIgdHlwZTogdGhlIHBhcmFtZXRlciBpbmRleCB3aXRob3V0IHRoZSBzdHJlYW0gSUQKKyAgICBpbmxpbmUgVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC50eXBlKCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGlzIHBhcmFtZXRlcgorICAgIC8vLyBcdG9kbzogc2hvdWxkIHdlIHJlc3RyaWN0IHRoaXMgdG8gQzJQYXJhbUZpZWxkPworICAgIGlubGluZSB1aW50MzJfdCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuICh1aW50MzJfdClfbUluZGV4OyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgY29yZSBpbmRleCBvZiB0aGlzIHBhcmFtZXRlcgorICAgIGlubGluZSBDb3JlSW5kZXggY29yZUluZGV4KCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5jb3JlSW5kZXgoKTsgfQorCisgICAgLy8vIHJldHVybnMgdGhlIGtpbmQgb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICBpbmxpbmUga2luZF90IGtpbmQoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmtpbmQoKTsgfQorCisgICAgLy8vIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIHBhcmFtZXRlciBvciAwIGlmIHRoZSBwYXJhbWV0ZXIgaXMgaW52YWxpZAorICAgIGlubGluZSBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9tU2l6ZTsgfQorCisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhlIHBhcmFtZXRlciBpcyB2YWxpZAorICAgIGlubGluZSBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5pc1ZhbGlkKCkgJiYgX21TaXplID4gMDsgfQorCisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhlIHBhcmFtZXRlciBpcyBpbnZhbGlkCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yIGJvb2woKTsgfQorCisgICAgLy8gZXF1YWxpdHkgaXMgZG9uZSBieSBtZW1jbXAgKHVzZSBlcXVhbHMoKSB0byBwcmV2ZW50IGFueSBvdmVycmVhZCkKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyUGFyYW0gJm8pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGVxdWFscyhvKSAmJiBtZW1jbXAodGhpcywgJm8sIF9tU2l6ZSkgPT0gMDsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDMlBhcmFtICZvKSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3I9PShvKTsgfQorCisgICAgLy8vIHNhZmUocikgdHlwZSBjYXN0IGZyb20gcG9pbnRlciBhbmQgc2l6ZQorICAgIGlubGluZSBzdGF0aWMgQzJQYXJhbSogRnJvbSh2b2lkICphZGRyLCBzaXplX3QgbGVuKSB7CisgICAgICAgIC8vIF9tU2l6ZSBtdXN0IGZpdCBpbnRvIHNpemUsIGJ1dCByZWFsbHkgQzJQYXJhbSBtdXN0IGFsc28gdG8gYmUgYSB2YWxpZCBwYXJhbQorICAgICAgICBpZiAobGVuIDwgc2l6ZW9mKEMyUGFyYW0pKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICAvLyBfbVNpemUgbXVzdCBtYXRjaCBsZW5ndGgKKyAgICAgICAgQzJQYXJhbSAqcGFyYW0gPSAoQzJQYXJhbSopYWRkcjsKKyAgICAgICAgaWYgKHBhcmFtLT5fbVNpemUgIT0gbGVuKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyYW07CisgICAgfQorCisgICAgLy8vIFJldHVybnMgbWFuYWdlZCBjbG9uZSBvZiB8b3JpZ3wgYXQgaGVhcC4KKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBDb3B5KGNvbnN0IEMyUGFyYW0gJm9yaWcpIHsKKyAgICAgICAgaWYgKG9yaWcuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHZvaWQgKm1lbSA9IDo6b3BlcmF0b3IgbmV3IChvcmlnLnNpemUoKSk7CisgICAgICAgIEMyUGFyYW0gKnBhcmFtID0gbmV3IChtZW0pIEMyUGFyYW0ob3JpZy5zaXplKCksIG9yaWcuX21JbmRleCk7CisgICAgICAgIHBhcmFtLT51cGRhdGVGcm9tKG9yaWcpOworICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+KHBhcmFtKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyBtYW5hZ2VkIGNsb25lIG9mIHxvcmlnfCBhcyBhIHN0cmVhbSBwYXJhbWV0ZXIgYXQgaGVhcC4KKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBDb3B5QXNTdHJlYW0oCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICZvcmlnLCBib29sIG91dHB1dCwgdW5zaWduZWQgc3RyZWFtKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBjb3B5ID0gQ29weShvcmlnKTsKKyAgICAgICAgaWYgKGNvcHkpIHsKKyAgICAgICAgICAgIGNvcHktPl9tSW5kZXguY29udmVydFRvU3RyZWFtKG91dHB1dCwgc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29weTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyBtYW5hZ2VkIGNsb25lIG9mIHxvcmlnfCBhcyBhIHBvcnQgcGFyYW1ldGVyIGF0IGhlYXAuCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gQ29weUFzUG9ydChjb25zdCBDMlBhcmFtICZvcmlnLCBib29sIG91dHB1dCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gY29weSA9IENvcHkob3JpZyk7CisgICAgICAgIGlmIChjb3B5KSB7CisgICAgICAgICAgICBjb3B5LT5fbUluZGV4LmNvbnZlcnRUb1BvcnQob3V0cHV0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29weTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyBtYW5hZ2VkIGNsb25lIG9mIHxvcmlnfCBhcyBhIGdsb2JhbCBwYXJhbWV0ZXIgYXQgaGVhcC4KKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBDb3B5QXNHbG9iYWwoY29uc3QgQzJQYXJhbSAmb3JpZykgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gY29weSA9IENvcHkob3JpZyk7CisgICAgICAgIGlmIChjb3B5KSB7CisgICAgICAgICAgICBjb3B5LT5fbUluZGV4LmNvbnZlcnRUb0dsb2JhbCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3B5OworICAgIH0KKworI2lmIDAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQLCBjbGFzcz1kZWNsdHlwZShDMlBhcmFtKFAoKSkpPgorICAgIFAgKkFzKCkgeyByZXR1cm4gUDo6RnJvbSh0aGlzKTsgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFA+CisgICAgY29uc3QgUCAqQXMoKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PGNvbnN0IFAqPihQOjpGcm9tKGNvbnN0X2Nhc3Q8QzJQYXJhbSo+KHRoaXMpKSk7IH0KKyNlbmRpZgorCitwcm90ZWN0ZWQ6CisgICAgLy8vIHNldHMgdGhlIHN0cmVhbSBmaWVsZC4gUmV0dXJucyB0cnVlIGlmZiBzdWNjZXNzZnVsLgorICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsKKyAgICAgICAgcmV0dXJuIF9tSW5kZXguc2V0U3RyZWFtKHN0cmVhbSk7CisgICAgfQorCisgICAgLy8vIHNldHMgdGhlIHBvcnQgKGRpcmVjdGlvbikuIFJldHVybnMgdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KKyAgICBpbmxpbmUgYm9vbCBzZXRQb3J0KGJvb2wgb3V0cHV0KSB7CisgICAgICAgIHJldHVybiBfbUluZGV4LnNldFBvcnQob3V0cHV0KTsKKyAgICB9CisKK3B1YmxpYzoKKyAgICAvLy8gaW52YWxpZGF0ZSB0aGlzIHBhcmFtZXRlci4gVGhlcmUgaXMgbm8gcmVjb3ZlcnkgZnJvbSB0aGlzIGNhbGw7IGUuZy4gcGFyYW1ldGVyCisgICAgLy8vIGNhbm5vdCBiZSAnY29ycmVjdGVkJyB0byBiZSB2YWxpZC4KKyAgICBpbmxpbmUgdm9pZCBpbnZhbGlkYXRlKCkgeyBfbVNpemUgPSAwOyB9CisKKyAgICAvLyBpZiBvdGhlciBpcyB0aGUgc2FtZSBraW5kIG9mICh2YWxpZCkgcGFyYW0gYXMgdGhpcywgY29weSBpdCBpbnRvIHRoaXMgYW5kIHJldHVybiB0cnVlLgorICAgIC8vIG90aGVyd2lzZSwgZG8gbm90IGNvcHkgYW55dGhpbmcsIGFuZCByZXR1cm4gZmFsc2UuCisgICAgaW5saW5lIGJvb2wgdXBkYXRlRnJvbShjb25zdCBDMlBhcmFtICZvdGhlcikgeworICAgICAgICBpZiAob3RoZXIuX21TaXplIDw9IF9tU2l6ZSAmJiBvdGhlci5fbUluZGV4ID09IF9tSW5kZXggJiYgX21TaXplID4gMCkgeworICAgICAgICAgICAgbWVtY3B5KHRoaXMsICZvdGhlciwgb3RoZXIuX21TaXplKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICAvLyByZXR1cm5zIHxvfCBpZiBpdCBpcyBhIG51bGwgcHRyLCBvciBpZiBjYW4gc3VpdGFibHkgYmUgYSBwYXJhbSBvZiBnaXZlbiB8dHlwZXwgKGUuZy4gaGFzCisgICAgLy8gc2FtZSB0eXBlIChpZ25vcmluZyBzdHJlYW0gSUQpLCBhbmQgc2l6ZSkuIE90aGVyd2lzZSwgcmV0dXJucyBudWxsLiBJZiB8Y2hlY2tEaXJ8IGlzIGZhbHNlLAorICAgIC8vIGFsbG93IHVuZGVmaW5lZCBvciBkaWZmZXJlbnQgZGlyZWN0aW9uIChlLmcuIGFzIGNvbnN0cnVjdGVkIGZyb20gQzJQb3J0UGFyYW0oKSB2cy4KKyAgICAvLyBDMlBvcnRQYXJhbTo6aW5wdXQpLCBidXQgc3RpbGwgcmVxdWlyZSBlcXVpdmFsZW50IHR5cGUgKHN0cmVhbSwgcG9ydCBvciBnbG9iYWwpOyBvdGhlcndpc2UsCisgICAgLy8gcmV0dXJuIG51bGwuCisgICAgaW5saW5lIHN0YXRpYyBjb25zdCBDMlBhcmFtKiBJZlN1aXRhYmxlKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbSogbywgc2l6ZV90IHNpemUsIFR5cGUgdHlwZSwgc2l6ZV90IGZsZXhTaXplID0gMCwgYm9vbCBjaGVja0RpciA9IHRydWUpIHsKKyAgICAgICAgaWYgKG8gPT0gbnVsbHB0ciB8fCBvLT5fbVNpemUgPCBzaXplIHx8IChmbGV4U2l6ZSAmJiAoKG8tPl9tU2l6ZSAtIHNpemUpICUgZmxleFNpemUpKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tEaXIpIHsKKyAgICAgICAgICAgIHJldHVybiBvLT5fbUluZGV4LnR5cGUoKSA9PSB0eXBlLm1JbmRleCA/IG8gOiBudWxscHRyOworICAgICAgICB9IGVsc2UgaWYgKG8tPl9tSW5kZXguaXNHbG9iYWwoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKChvLT5fbUluZGV4LnR5cGUoKSBeIHR5cGUubUluZGV4KSAmIH5UeXBlOjpESVJfTUFTSykgPyBudWxscHRyIDogbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBiYXNlIGNvbnN0cnVjdG9yCisgICAgaW5saW5lIEMyUGFyYW0odWludDMyX3QgcGFyYW1TaXplLCBJbmRleCBwYXJhbUluZGV4KQorICAgICAgICA6IF9tU2l6ZShwYXJhbVNpemUpLAorICAgICAgICAgIF9tSW5kZXgocGFyYW1JbmRleCkgeworICAgICAgICBpZiAocGFyYW1TaXplID4gc2l6ZW9mKEMyUGFyYW0pKSB7CisgICAgICAgICAgICBtZW1zZXQodGhpcyArIDEsIDAsIHBhcmFtU2l6ZSAtIHNpemVvZihDMlBhcmFtKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gYmFzZSBjb25zdHJ1Y3RvciB3aXRoIHN0cmVhbSBzZXQKKyAgICBpbmxpbmUgQzJQYXJhbSh1aW50MzJfdCBwYXJhbVNpemUsIEluZGV4IHBhcmFtSW5kZXgsIHVuc2lnbmVkIHN0cmVhbSkKKyAgICAgICAgOiBfbVNpemUocGFyYW1TaXplKSwKKyAgICAgICAgICBfbUluZGV4KHBhcmFtSW5kZXggfCBJbmRleDo6TWFrZVN0cmVhbUlkKHN0cmVhbSkpIHsKKyAgICAgICAgaWYgKHBhcmFtU2l6ZSA+IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgbWVtc2V0KHRoaXMgKyAxLCAwLCBwYXJhbVNpemUgLSBzaXplb2YoQzJQYXJhbSkpOworICAgICAgICB9CisgICAgICAgIGlmICghZm9yU3RyZWFtKCkpIHsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yOyAvLyBmb3IgdGVzdGluZworCisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgfG98IGhhcyB0aGUgc2FtZSBzaXplIGFuZCBpbmRleCBhcyB0aGlzLiBUaGlzIHBlcmZvcm1zIHRoZQorICAgIC8vLyBiYXNpYyBjaGVjayBmb3IgZXF1YWxpdHkuCisgICAgaW5saW5lIGJvb2wgZXF1YWxzKGNvbnN0IEMyUGFyYW0gJm8pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tU2l6ZSA9PSBvLl9tU2l6ZSAmJiBfbUluZGV4ID09IG8uX21JbmRleDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBfbVNpemU7CisgICAgSW5kZXggX21JbmRleDsKK307CisKKy8vLyBcaW5ncm91cCBpbnRlcm5hbAorLy8vIGFsbG93IEMyUGFyYW1zIGFjY2VzcyB0byBwcml2YXRlIG1ldGhvZHMsIGUuZy4gY29uc3RydWN0b3JzCisjZGVmaW5lIEMyUEFSQU1fTUFLRV9GUklFTkRTIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBTLCBpbnQgSSwgY2xhc3MgRj4gZnJpZW5kIHN0cnVjdCBDMkdsb2JhbFBhcmFtOyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJQb3J0UGFyYW07IFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBTLCBpbnQgSSwgY2xhc3MgRj4gZnJpZW5kIHN0cnVjdCBDMlN0cmVhbVBhcmFtOyBcCisKKy8qKgorICogU2V0dGluZyBiYXNlIHN0cnVjdHVyZSBmb3IgY29tcG9uZW50IG1ldGhvZCBzaWduYXR1cmVzLiBXcmFwIGNvbnN0cnVjdG9ycy4KKyAqLworc3RydWN0IEMyU2V0dGluZyA6IHB1YmxpYyBDMlBhcmFtIHsKK3Byb3RlY3RlZDoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGlubGluZSBDMlNldHRpbmcoY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IEMyUGFyYW0oYXJncy4uLikgeyB9CitwdWJsaWM6IC8vIFRPRE8KKyAgICBlbnVtIDogdWludDMyX3QgeyBQQVJBTV9LSU5EID0gVHlwZTo6S0lORF9TRVRUSU5HIH07Cit9OworCisvKioKKyAqIFR1bmluZyBiYXNlIHN0cnVjdHVyZSBmb3IgY29tcG9uZW50IG1ldGhvZCBzaWduYXR1cmVzLiBXcmFwIGNvbnN0cnVjdG9ycy4KKyAqLworc3RydWN0IEMyVHVuaW5nIDogcHVibGljIEMyU2V0dGluZyB7Citwcm90ZWN0ZWQ6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbmxpbmUgQzJUdW5pbmcoY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IEMyU2V0dGluZyhhcmdzLi4uKSB7IH0KK3B1YmxpYzogLy8gVE9ETworICAgIGVudW0gOiB1aW50MzJfdCB7IFBBUkFNX0tJTkQgPSBUeXBlOjpLSU5EX1RVTklORyB9OworfTsKKworLyoqCisgKiBJbmZvIGJhc2Ugc3RydWN0dXJlIGZvciBjb21wb25lbnQgbWV0aG9kIHNpZ25hdHVyZXMuIFdyYXAgY29uc3RydWN0b3JzLgorICovCitzdHJ1Y3QgQzJJbmZvIDogcHVibGljIEMyUGFyYW0geworcHJvdGVjdGVkOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMySW5mbyhjb25zdCBBcmdzKCYuLi4gYXJncykpIDogQzJQYXJhbShhcmdzLi4uKSB7IH0KK3B1YmxpYzogLy8gVE9ETworICAgIGVudW0gOiB1aW50MzJfdCB7IFBBUkFNX0tJTkQgPSBUeXBlOjpLSU5EX0lORk8gfTsKK307CisKKy8qKgorICogU3RydWN0dXJlIHVuaXF1ZWx5IHNwZWNpZnlpbmcgYSBmaWVsZCBpbiBhbiBhcmJpdHJhcnkgc3RydWN0dXJlLgorICoKKyAqIFxub3RlIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZGlmZmVyZW50bHkgaW4gQzJGaWVsZERlc2NyaXB0b3IgdG8KKyAqIGlkZW50aWZ5IGFycmF5IGZpZWxkcywgc3VjaCB0aGF0IF9tU2l6ZSBpcyB0aGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQuIFRoaXMgaXMKKyAqIGJlY2F1c2UgdGhlIGZpZWxkIGRlc2NyaXB0b3IgY29udGFpbnMgdGhlIGFycmF5LWxlbmd0aCwgYW5kIHdlIHdhbnQgdG8ga2VlcAorICogYSByZWxldmFudCBlbGVtZW50IHNpemUgZm9yIHZhcmlhYmxlIGxlbmd0aCBhcnJheXMuCisgKi8KK3N0cnVjdCBfQzJGaWVsZElkIHsKKy8vcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHVzZWQgZm9yIEMyRmllbGREZXNjcmlwdG9yIHRoYXQgcmVtb3ZlcyB0aGUgYXJyYXkgZXh0ZW50LgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBvZmZzZXQgcG9pbnRlciB0byB0aGUgZmllbGQgaW4gYW4gb2JqZWN0IGF0IGFkZHJlc3MgMC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBjbGFzcyBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxUPjo6dHlwZT4KKyAgICBpbmxpbmUgX0MyRmllbGRJZChUKiBvZmZzZXQpCisgICAgICAgIDogLy8gb2Zmc2V0IGlzIGZyb20gIjAiIHNvIHdpbGwgZml0IG9uIDMyLWJpdHMKKyAgICAgICAgICBfbU9mZnNldCgodWludDMyX3QpKHVpbnRwdHJfdCkob2Zmc2V0KSksCisgICAgICAgICAgX21TaXplKHNpemVvZihCKSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBEaXJlY3QgY29uc3RydWN0b3IgZnJvbSBvZmZzZXQgYW5kIHNpemUuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dIG9mZnNldCBvZmZzZXQgb2YgdGhlIGZpZWxkLgorICAgICAqIFxwYXJhbVtpbl0gc2l6ZSBzaXplIG9mIHRoZSBmaWVsZC4KKyAgICAgKi8KKyAgICBpbmxpbmUgX0MyRmllbGRJZChzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBfbU9mZnNldChvZmZzZXQpLCBfbVNpemUoc2l6ZSkge30KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHVzZWQgdG8gaWRlbnRpZnkgYSBmaWVsZCBpbiBhbiBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gVVt0eXBlXSBwb2ludGVyIHRvIHRoZSBvYmplY3QgdGhhdCBjb250YWlucyB0aGlzIGZpZWxkLiBUaGlzIGlzIG5lZWRlZCBpbiBjYXNlIHRoZQorICAgICAqICAgICAgICBmaWVsZCBpcyBpbiBhbiAoaW5oZXJpdGVkKSBiYXNlIGNsYXNzLCBpbiB3aGljaCBjYXNlIFQgd2lsbCBiZSB0aGF0IGJhc2UgY2xhc3MuCisgICAgICogXHBhcmFtIHBtW2ltXSBtZW1iZXIgcG9pbnRlciB0byB0aGUgZmllbGQKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZSBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxSPjo6dHlwZT4KKyAgICBpbmxpbmUgX0MyRmllbGRJZChVICosIFIgVDo6KiBwbSkKKyAgICAgICAgOiBfbU9mZnNldCgodWludDMyX3QpKHVpbnRwdHJfdCkoJigoKFUqKTI1NiktPipwbSkpIC0gMjU2dSksCisgICAgICAgICAgX21TaXplKHNpemVvZihCKSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIHRvIGlkZW50aWZ5IGEgZmllbGQgaW4gYW4gb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHBtW2ltXSBtZW1iZXIgcG9pbnRlciB0byB0aGUgZmllbGQKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxSPjo6dHlwZT4KKyAgICBpbmxpbmUgX0MyRmllbGRJZChSIFQ6OiogcG0pCisgICAgICAgIDogX21PZmZzZXQoKHVpbnQzMl90KSh1aW50cHRyX3QpKCYoKChUKikwKS0+KnBtKSkpLAorICAgICAgICAgIF9tU2l6ZShzaXplb2YoQikpIHsgfQorCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfQzJGaWVsZElkICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gX21PZmZzZXQgPT0gb3RoZXIuX21PZmZzZXQgJiYgX21TaXplID09IG90aGVyLl9tU2l6ZTsKKyAgICB9CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgX0MyRmllbGRJZCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tT2Zmc2V0IDwgb3RoZXIuX21PZmZzZXQgfHwKKyAgICAgICAgICAgIC8vIE5PVEU6IG9yZGVyIHBhcmVudCBzdHJ1Y3R1cmUgYmVmb3JlIHN1YiBmaWVsZAorICAgICAgICAgICAgKF9tT2Zmc2V0ID09IG90aGVyLl9tT2Zmc2V0ICYmIF9tU2l6ZSA+IG90aGVyLl9tU2l6ZSk7CisgICAgfQorCisgICAgREVGSU5FX09USEVSX0NPTVBBUklTT05fT1BFUkFUT1JTKF9DMkZpZWxkSWQpCisKKyNpZiAwCisgICAgaW5saW5lIHVpbnQzMl90IG9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIF9tT2Zmc2V0OyB9CisgICAgaW5saW5lIHVpbnQzMl90IHNpemUoKSBjb25zdCB7IHJldHVybiBfbVNpemU7IH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGUklFTkRfVEVTVCkKKyAgICBmcmllbmQgdm9pZCBQcmludFRvKGNvbnN0IF9DMkZpZWxkSWQgJmQsIDo6c3RkOjpvc3RyZWFtKik7CisjZW5kaWYKKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yOworICAgIGZyaWVuZCBzdHJ1Y3QgQzJGaWVsZERlc2NyaXB0b3I7CisKKyAgICB1aW50MzJfdCBfbU9mZnNldDsgLy8gb2Zmc2V0IG9mIGZpZWxkCisgICAgdWludDMyX3QgX21TaXplOyAgIC8vIHNpemUgb2YgZmllbGQKK307CisKKy8qKgorICogU3RydWN0dXJlIHVuaXF1ZWx5IHNwZWNpZnlpbmcgYSAnZmllbGQnIGluIGEgY29uZmlndXJhdGlvbi4gVGhlIGZpZWxkCisgKiBjYW4gYmUgYSBmaWVsZCBvZiBhIGNvbmZpZ3VyYXRpb24sIGEgc3ViZmllbGQgb2YgYSBmaWVsZCBvZiBhIGNvbmZpZ3VyYXRpb24sCisgKiBhbmQgZXZlbiB0aGUgd2hvbGUgY29uZmlndXJhdGlvbi4gTW9yZW92ZXIsIGlmIHRoZSBmaWVsZCBjYW4gcG9pbnQgdG8gYW4KKyAqIGVsZW1lbnQgaW4gYSBhcnJheSBmaWVsZCwgb3IgdG8gdGhlIGVudGlyZSBhcnJheSBmaWVsZC4KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBxdWVyeWluZyBzdXBwb3J0ZWQgdmFsdWVzIGZvciBhIGZpZWxkLCBhcyB3ZWxsCisgKiBhcyBjb21tdW5pY2F0aW5nIGNvbmZpZ3VyYXRpb24gZmFpbHVyZXMgYW5kIGNvbmZsaWN0cyB3aGVuIHRyeWluZyB0byBjaGFuZ2UKKyAqIGEgY29uZmlndXJhdGlvbiBmb3IgYSBjb21wb25lbnQvaW50ZXJmYWNlIG9yIGEgc3RvcmUuCisgKi8KK3N0cnVjdCBDMlBhcmFtRmllbGQgeworLy9wdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZmllbGQgaWRlbnRpZmllciB1c2luZyBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICh2YXJpYWJsZSksCisgICAgICogYW5kIGEgcG9pbnRlciB0byBtZW1iZXIuCisgICAgICoKKyAgICAgKiB+fn5+fn5+fn5+fn5+ICguY3BwKQorICAgICAqCisgICAgICogc3RydWN0IEMyU29tZVBhcmFtIHsKKyAgICAgKiAgIHVpbnQzMl90IG1GaWVsZDsKKyAgICAgKiAgIHVpbnQzMl90IG1BcnJheVsyXTsKKyAgICAgKiAgIEMyT3RoZXJTdHJ1Y3QgbVN0cnVjdDsKKyAgICAgKiAgIHVpbnQzMl90IG1GbGV4QXJyYXlbXTsKKyAgICAgKiB9ICptUGFyYW07CisgICAgICoKKyAgICAgKiBDMlBhcmFtRmllbGQobVBhcmFtLCAmbVBhcmFtLT5tRmllbGQpOworICAgICAqIEMyUGFyYW1GaWVsZChtUGFyYW0sICZtUGFyYW0tPm1BcnJheSk7CisgICAgICogQzJQYXJhbUZpZWxkKG1QYXJhbSwgJm1QYXJhbS0+bUFycmF5WzBdKTsKKyAgICAgKiBDMlBhcmFtRmllbGQobVBhcmFtLCAmbVBhcmFtLT5tU3RydWN0Lm1TdWJGaWVsZCk7CisgICAgICogQzJQYXJhbUZpZWxkKG1QYXJhbSwgJm1QYXJhbS0+bUZsZXhBcnJheSk7CisgICAgICogQzJQYXJhbUZpZWxkKG1QYXJhbSwgJm1QYXJhbS0+bUZsZXhBcnJheVsyXSk7CisgICAgICoKKyAgICAgKiB+fn5+fn5+fn5+fn5+CisgICAgICoKKyAgICAgKiBcdG9kbyBmaXggd2hhdCB0aGlzIGlzIGZvciBUW10gKGZvciBub3cgc2l6ZSBiZWNvbWVzIFRbMV0pCisgICAgICoKKyAgICAgKiBcbm90ZSB0aGlzIGRvZXMgbm90IHdvcmsgZm9yIDY0LWJpdCBtZW1iZXJzIGFzIGl0IHRyaWdnZXJzIGEKKyAgICAgKiAndGFraW5nIGFkZHJlc3Mgb2YgcGFja2VkIG1lbWJlcicgd2FybmluZy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbSBwb2ludGVyIHRvIHBhcmFtZXRlcgorICAgICAqIFxwYXJhbSBvZmZzZXQgbWVtYmVyIHBvaW50ZXIKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB0eXBlbmFtZSBUPgorICAgIGlubGluZSBDMlBhcmFtRmllbGQoUyogcGFyYW0sIFQqIG9mZnNldCkKKyAgICAgICAgOiBfbUluZGV4KHBhcmFtLT5pbmRleCgpKSwKKyAgICAgICAgICBfbUZpZWxkSWQoKFQqKSgodWludHB0cl90KW9mZnNldCAtICh1aW50cHRyX3QpcGFyYW0pKSB7fQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgc3RhdGljIEMyUGFyYW1GaWVsZCBNYWtlKFMmIHBhcmFtLCBUJiBvZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZChwYXJhbS5pbmRleCgpLCAodWludHB0cl90KSZvZmZzZXQgLSAodWludHB0cl90KSZwYXJhbSwgc2l6ZW9mKFQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBmaWVsZCBpZGVudGlmaWVyIHVzaW5nIGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgKHZhcmlhYmxlKSwKKyAgICAgKiBhbmQgYSBtZW1iZXIgcG9pbnRlci4gVGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gcmVmZXIgdG8gYW4KKyAgICAgKiBhcnJheSBlbGVtZW50IG9yIGEgc3ViZmllbGQuCisgICAgICoKKyAgICAgKiB+fn5+fn5+fn5+fn5+ICguY3BwKQorICAgICAqCisgICAgICogQzJTb21lUGFyYW0gbVBhcmFtOworICAgICAqIEMyUGFyYW1GaWVsZCgmbVBhcmFtLCAmQzJTb21lUGFyYW06Om1NZW1iZXJGaWVsZCk7CisgICAgICoKKyAgICAgKiB+fn5+fn5+fn5+fn5+CisgICAgICoKKyAgICAgKiBccGFyYW0gcCBwb2ludGVyIHRvIHBhcmFtZXRlcgorICAgICAqIFxwYXJhbSBUIG1lbWJlciBwb2ludGVyIHRvIHRoZSBmaWVsZCBtZW1iZXIKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorICAgIGlubGluZSBDMlBhcmFtRmllbGQoVSAqcCwgUiBUOjoqIHBtKSA6IF9tSW5kZXgocC0+aW5kZXgoKSksIF9tRmllbGRJZChwLCBwbSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBmaWVsZCBpZGVudGlmaWVyIHRvIGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgKHZhcmlhYmxlKS4KKyAgICAgKgorICAgICAqIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgICAgICoKKyAgICAgKiBDMlNvbWVQYXJhbSBtUGFyYW07CisgICAgICogQzJQYXJhbUZpZWxkKCZtUGFyYW0pOworICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtIHBvaW50ZXIgdG8gcGFyYW1ldGVyCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUz4KKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkKFMqIHBhcmFtKQorICAgICAgICA6IF9tSW5kZXgocGFyYW0tPmluZGV4KCkpLCBfbUZpZWxkSWQoMHUsIHBhcmFtLT5zaXplKCkpIHsgfQorCisgICAgLyoqIENvcHkgY29uc3RydWN0b3IuICovCisgICAgaW5saW5lIEMyUGFyYW1GaWVsZChjb25zdCBDMlBhcmFtRmllbGQgJm90aGVyKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBFcXVhbGl0eSBvcGVyYXRvci4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyUGFyYW1GaWVsZCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tSW5kZXggPT0gb3RoZXIuX21JbmRleCAmJiBfbUZpZWxkSWQgPT0gb3RoZXIuX21GaWVsZElkOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9yZGVyaW5nIG9wZXJhdG9yLgorICAgICAqLworICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBDMlBhcmFtRmllbGQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbUluZGV4IDwgb3RoZXIuX21JbmRleCB8fAorICAgICAgICAgICAgKF9tSW5kZXggPT0gb3RoZXIuX21JbmRleCAmJiBfbUZpZWxkSWQgPCBvdGhlci5fbUZpZWxkSWQpOworICAgIH0KKworICAgIERFRklORV9PVEhFUl9DT01QQVJJU09OX09QRVJBVE9SUyhDMlBhcmFtRmllbGQpCisKK3Byb3RlY3RlZDoKKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkKEMyUGFyYW06OkluZGV4IGluZGV4LCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHNpemUpCisgICAgICAgIDogX21JbmRleChpbmRleCksIF9tRmllbGRJZChvZmZzZXQsIHNpemUpIHt9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsKKworICAgIEMyUGFyYW06OkluZGV4IF9tSW5kZXg7IC8vLzwgcGFyYW1ldGVyIGluZGV4CisgICAgX0MyRmllbGRJZCBfbUZpZWxkSWQ7ICAgLy8vPCBmaWVsZCBpZGVudGlmaWVyCit9OworCisvKioKKyAqIEEgc2hhcmVkICh1bmlvbikgcmVwcmVzZW50YXRpb24gb2YgbnVtZXJpYyB2YWx1ZXMKKyAqLworY2xhc3MgQzJWYWx1ZSB7CitwdWJsaWM6CisgICAgLy8vIEEgdW5pb24gb2Ygc3VwcG9ydGVkIHByaW1pdGl2ZSB0eXBlcy4KKyAgICB1bmlvbiBQcmltaXRpdmUgeworICAgICAgICAvLyBmaXJzdCBtZW1iZXIgaXMgYWx3YXlzIHplcm8gaW5pdGlhbGl6ZWQgc28gaXQgbXVzdCBiZSB0aGUgbGFyZ2VzdAorICAgICAgICB1aW50NjRfdCAgICB1NjQ7ICAgLy8vPCB1aW50NjRfdCB2YWx1ZQorICAgICAgICBpbnQ2NF90ICAgICBpNjQ7ICAgLy8vPCBpbnQ2NF90IHZhbHVlCisgICAgICAgIGMyX2NudHI2NF90IGM2NDsgICAvLy88IGMyX2NudHI2NF90IHZhbHVlCisgICAgICAgIHVpbnQzMl90ICAgIHUzMjsgICAvLy88IHVpbnQzMl90IHZhbHVlCisgICAgICAgIGludDMyX3QgICAgIGkzMjsgICAvLy88IGludDMyX3QgdmFsdWUKKyAgICAgICAgYzJfY250cjMyX3QgYzMyOyAgIC8vLzwgYzJfY250cjMyX3QgdmFsdWUKKyAgICAgICAgZmxvYXQgICAgICAgZnA7ICAgIC8vLzwgZmxvYXQgdmFsdWUKKworICAgICAgICAvLyBjb25zdHJ1Y3RvcnMgLSBpbXBsaWNpdAorICAgICAgICBQcmltaXRpdmUodWludDY0X3QgdmFsdWUpICAgIDogdTY0KHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKGludDY0X3QgdmFsdWUpICAgICA6IGk2NCh2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShjMl9jbnRyNjRfdCB2YWx1ZSkgOiBjNjQodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUodWludDMyX3QgdmFsdWUpICAgIDogdTMyKHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKGludDMyX3QgdmFsdWUpICAgICA6IGkzMih2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShjMl9jbnRyMzJfdCB2YWx1ZSkgOiBjMzIodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUodWludDhfdCB2YWx1ZSkgICAgIDogdTMyKHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKGNoYXIgdmFsdWUpICAgICAgICA6IGkzMih2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShmbG9hdCB2YWx1ZSkgICAgICAgOiBmcCh2YWx1ZSkgIHsgfQorCisgICAgICAgIC8vIGFsbG93IGNvbnN0cnVjdGlvbiBmcm9tIGVudW0gdHlwZQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBFLCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfZW51bTxFPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBQcmltaXRpdmUoRSB2YWx1ZSkKKyAgICAgICAgICAgIDogUHJpbWl0aXZlKHN0YXRpY19jYXN0PHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEU+Ojp0eXBlPih2YWx1ZSkpIHsgfQorCisgICAgICAgIFByaW1pdGl2ZSgpIDogdTY0KDApIHsgfQorCisgICAgICAgIC8qKiBnZXRzIHZhbHVlIG91dCBvZiB0aGUgdW5pb24gKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3QgVCAmcmVmKCkgY29uc3Q7CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgd2UgY2FuIGFzc3VtZSBzdGFuZGFyZCBhbGlhc2luZworICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1NjQpID09IHNpemVvZihpNjQpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHU2NCkgPT0gc2l6ZW9mKGM2NCksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YodTMyKSA9PSBzaXplb2YoaTMyKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1MzIpID09IHNpemVvZihjMzIpLCAiIik7CisgICAgfTsKKyAgICAvLyB2ZXJpZnkgdGhhdCB3ZSBjYW4gYXNzdW1lIHN0YW5kYXJkIGFsaWFzaW5nCisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihQcmltaXRpdmUsIHU2NCkgPT0gb2Zmc2V0b2YoUHJpbWl0aXZlLCBpNjQpLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihQcmltaXRpdmUsIHU2NCkgPT0gb2Zmc2V0b2YoUHJpbWl0aXZlLCBjNjQpLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihQcmltaXRpdmUsIHUzMikgPT0gb2Zmc2V0b2YoUHJpbWl0aXZlLCBpMzIpLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihQcmltaXRpdmUsIHUzMikgPT0gb2Zmc2V0b2YoUHJpbWl0aXZlLCBjMzIpLCAiIik7CisKKyAgICBlbnVtIHR5cGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgTk9fSU5JVCwKKyAgICAgICAgSU5UMzIsCisgICAgICAgIFVJTlQzMiwKKyAgICAgICAgQ05UUjMyLAorICAgICAgICBJTlQ2NCwKKyAgICAgICAgVUlOVDY0LAorICAgICAgICBDTlRSNjQsCisgICAgICAgIEZMT0FULAorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sID0gc3RkOjppc19lbnVtPFQ+Ojp2YWx1ZT4KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciB0eXBlX3QgVHlwZUZvcigpIHsKKyAgICAgICAgdXNpbmcgVSA9IHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlOworICAgICAgICByZXR1cm4gVHlwZUZvcjxVPigpOworICAgIH0KKworICAgIC8vIGRlcHJlY3RhdGVkCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgYm9vbCBCID0gc3RkOjppc19lbnVtPFQ+Ojp2YWx1ZT4KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciB0eXBlX3QgdHlwZUZvcigpIHsKKyAgICAgICAgcmV0dXJuIFR5cGVGb3I8VCwgQj4oKTsKKyAgICB9CisKKyAgICAvLyBjb25zdHJ1Y3RvcnMgLSBpbXBsaWNpdAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQzJWYWx1ZShUIHZhbHVlKSAgOiBfbVR5cGUodHlwZUZvcjxUPigpKSwgX21WYWx1ZSh2YWx1ZSkgeyB9CisKKyAgICBDMlZhbHVlKCkgOiBfbVR5cGUoTk9fSU5JVCkgeyB9CisKKyAgICBpbmxpbmUgdHlwZV90IHR5cGUoKSBjb25zdCB7IHJldHVybiBfbVR5cGU7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIGJvb2wgZ2V0KFQgKnZhbHVlKSBjb25zdCB7CisgICAgICAgIGlmIChfbVR5cGUgPT0gdHlwZUZvcjxUPigpKSB7CisgICAgICAgICAgICAqdmFsdWUgPSBfbVZhbHVlLnJlZjxUPigpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSB2YWx1ZQorICAgIHZvaWQgKmdldCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tVHlwZSA9PSBOT19JTklUID8gbnVsbHB0ciA6ICh2b2lkKikmX21WYWx1ZTsKKyAgICB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgY29udGFpbmVkIHZhbHVlCisgICAgc2l6ZV90IGlubGluZSBzaXplT2YoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBTaXplRm9yKF9tVHlwZSk7CisgICAgfQorCisgICAgc3RhdGljIHNpemVfdCBTaXplRm9yKHR5cGVfdCB0eXBlKSB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBJTlQzMjoKKyAgICAgICAgICAgIGNhc2UgVUlOVDMyOgorICAgICAgICAgICAgY2FzZSBDTlRSMzI6IHJldHVybiBzaXplb2YoX21WYWx1ZS5pMzIpOworICAgICAgICAgICAgY2FzZSBJTlQ2NDoKKyAgICAgICAgICAgIGNhc2UgVUlOVDY0OgorICAgICAgICAgICAgY2FzZSBDTlRSNjQ6IHJldHVybiBzaXplb2YoX21WYWx1ZS5pNjQpOworICAgICAgICAgICAgY2FzZSBGTE9BVDogcmV0dXJuIHNpemVvZihfbVZhbHVlLmZwKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIHR5cGVfdCBfbVR5cGU7CisgICAgUHJpbWl0aXZlIF9tVmFsdWU7Cit9OworCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBpbnQzMl90ICZDMlZhbHVlOjpQcmltaXRpdmU6OnJlZjxpbnQzMl90PigpIGNvbnN0IHsgcmV0dXJuIGkzMjsgfQordGVtcGxhdGU8PiBpbmxpbmUgY29uc3QgaW50NjRfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8aW50NjRfdD4oKSBjb25zdCB7IHJldHVybiBpNjQ7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IHVpbnQzMl90ICZDMlZhbHVlOjpQcmltaXRpdmU6OnJlZjx1aW50MzJfdD4oKSBjb25zdCB7IHJldHVybiB1MzI7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IHVpbnQ2NF90ICZDMlZhbHVlOjpQcmltaXRpdmU6OnJlZjx1aW50NjRfdD4oKSBjb25zdCB7IHJldHVybiB1NjQ7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IGMyX2NudHIzMl90ICZDMlZhbHVlOjpQcmltaXRpdmU6OnJlZjxjMl9jbnRyMzJfdD4oKSBjb25zdCB7IHJldHVybiBjMzI7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IGMyX2NudHI2NF90ICZDMlZhbHVlOjpQcmltaXRpdmU6OnJlZjxjMl9jbnRyNjRfdD4oKSBjb25zdCB7IHJldHVybiBjNjQ7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IGZsb2F0ICZDMlZhbHVlOjpQcmltaXRpdmU6OnJlZjxmbG9hdD4oKSBjb25zdCB7IHJldHVybiBmcDsgfQorCisvLyBwcm92aWRlIHR5cGVzIGZvciBlbnVtcyBhbmQgdWludDhfdCwgY2hhciBldmVuIHRob3VnaCB3ZSBkb24ndCBwcm92aWRlIHJlYWRpbmcgYXMgdGhlbQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8Y2hhciwgZmFsc2U+KCkgeyByZXR1cm4gSU5UMzI7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OnR5cGVfdCBDMlZhbHVlOjpUeXBlRm9yPGludDMyX3QsIGZhbHNlPigpIHsgcmV0dXJuIElOVDMyOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjxpbnQ2NF90LCBmYWxzZT4oKSB7IHJldHVybiBJTlQ2NDsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8dWludDhfdCwgZmFsc2U+KCkgeyByZXR1cm4gVUlOVDMyOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjx1aW50MzJfdCwgZmFsc2U+KCkgeyByZXR1cm4gVUlOVDMyOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjx1aW50NjRfdCwgZmFsc2U+KCkgeyByZXR1cm4gVUlOVDY0OyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjxjMl9jbnRyMzJfdCwgZmFsc2U+KCkgeyByZXR1cm4gQ05UUjMyOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjxjMl9jbnRyNjRfdCwgZmFsc2U+KCkgeyByZXR1cm4gQ05UUjY0OyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjxmbG9hdCwgZmFsc2U+KCkgeyByZXR1cm4gRkxPQVQ7IH0KKworLy8gZm9yd2FyZCBkZWNsYXJlIGVhc3kgZW51bSB0ZW1wbGF0ZQordGVtcGxhdGU8dHlwZW5hbWUgRT4gc3RydWN0IEMyRWFzeUVudW07CisKKy8qKgorICogZmllbGQgZGVzY3JpcHRvci4gQSBmaWVsZCBpcyB1bmlxdWVseSBkZWZpbmVkIGJ5IGFuIGluZGV4IGludG8gYSBwYXJhbWV0ZXIuCisgKiAoTm90ZTogU3RyZWFtLWlkIGlzIG5vdCBjYXB0dXJlZCBhcyBhIGZpZWxkLikKKyAqCisgKiBPcmRlcmluZyBvZiBmaWVsZHMgaXMgYnkgb2Zmc2V0LiBJbiBjYXNlIG9mIHN0cnVjdHVyZXMsIGl0IGlzIGRlcHRoIGZpcnN0LAorICogd2l0aCBhIHN0cnVjdHVyZSB0YWtpbmcgYW4gaW5kZXgganVzdCBiZWZvcmUgYW5kIGluIGFkZGl0aW9uIHRvIGl0cyBtZW1iZXJzLgorICovCitzdHJ1Y3QgQzJGaWVsZERlc2NyaXB0b3IgeworLy9wdWJsaWM6CisgICAgLyoqIGZpZWxkIHR5cGVzIGFuZCBmbGFncworICAgICAqIFxub3RlOiBvbmx5IDMyLWJpdCBhbmQgNjQtYml0IGZpZWxkcyBhcmUgc3VwcG9ydGVkIChlLmcuIG5vIGJvb2xlYW4sIGFzIHRoYXQKKyAgICAgKiBpcyByZXByZXNlbnRlZCB1c2luZyBJTlQzMikuCisgICAgICovCisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIC8vIHByaW1pdGl2ZSB0eXBlcworICAgICAgICBJTlQzMiAgID0gQzJWYWx1ZTo6SU5UMzIsICAvLy88IDMyLWJpdCBzaWduZWQgaW50ZWdlcgorICAgICAgICBVSU5UMzIgID0gQzJWYWx1ZTo6VUlOVDMyLCAvLy88IDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyCisgICAgICAgIENOVFIzMiAgPSBDMlZhbHVlOjpDTlRSMzIsIC8vLzwgMzItYml0IGNvdW50ZXIKKyAgICAgICAgSU5UNjQgICA9IEMyVmFsdWU6OklOVDY0LCAgLy8vPCA2NC1iaXQgc2lnbmVkIGludGVnZXIKKyAgICAgICAgVUlOVDY0ICA9IEMyVmFsdWU6OlVJTlQ2NCwgLy8vPCA2NC1iaXQgc2lnbmVkIGludGVnZXIKKyAgICAgICAgQ05UUjY0ICA9IEMyVmFsdWU6OkNOVFI2NCwgLy8vPCA2NC1iaXQgY291bnRlcgorICAgICAgICBGTE9BVCAgID0gQzJWYWx1ZTo6RkxPQVQsICAvLy88IDMyLWJpdCBmbG9hdGluZyBwb2ludAorCisgICAgICAgIC8vIGFycmF5IHR5cGVzCisgICAgICAgIFNUUklORyA9IDB4MTAwLCAvLy88IGZpeGVkLXNpemUgc3RyaW5nIChQT0QpCisgICAgICAgIEJMT0IsICAgICAgICAgICAvLy88IGJsb2IuIEJsb2JzIGhhdmUgbm8gc3ViLWVsZW1lbnRzIGFuZCBjYW4gYmUgdGhvdWdodCBvZiBhcyBieXRlIGFycmF5czsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaG93ZXZlciwgYnl0ZXMgY2Fubm90IGJlIGluZGl2aWR1YWxseSBhZGRyZXNzZWQgYnkgY2xpZW50cy4KKworICAgICAgICAvLyBjb21wbGV4IHR5cGVzCisgICAgICAgIFNUUlVDVF9GTEFHID0gMHgyMDAwMCwgLy8vPCBzdHJ1Y3RzLiBNYXJrZWQgd2l0aCB0aGlzIGZsYWcgaW4gYWRkaXRpb24gdG8gdGhlaXIgY29yZUluZGV4LgorICAgIH07CisKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjxDMlN0cmluZywgQzJWYWx1ZTo6UHJpbWl0aXZlPiBOYW1lZFZhbHVlVHlwZTsKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPE5hbWVkVmFsdWVUeXBlPiBOYW1lZFZhbHVlc1R5cGU7CisgICAgLy90eXBlZGVmIHN0ZDo6cGFpcjxzdGQ6OnZlY3RvcjxDMlN0cmluZz4sIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4+IE5hbWVkVmFsdWVzVHlwZTsKKworICAgIC8qKgorICAgICAqIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHRoYXQgcmV0dXJucyB0aGUgbmFtZWQgdmFsdWVzIGZvciBhIHR5cGUuCisgICAgICoKKyAgICAgKiBcdG9kbyBoaWRlIGZyb20gY2xpZW50LgorICAgICAqCisgICAgICogXHJldHVybiBhIHZlY3RvciBvZiBuYW1lLXZhbHVlIHBhaXJzLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEI+CisgICAgc3RhdGljIE5hbWVkVmFsdWVzVHlwZSBuYW1lZFZhbHVlc0Zvcihjb25zdCBCICYpOworCisgICAgLyoqIHNwZWNpYWxpemF0aW9uIGZvciBlYXN5IGVudW1zICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRT4KKyAgICBpbmxpbmUgc3RhdGljIE5hbWVkVmFsdWVzVHlwZSBuYW1lZFZhbHVlc0Zvcihjb25zdCBDMkVhc3lFbnVtPEU+ICYpIHsKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV251bGwtZGVyZWZlcmVuY2UiCisgICAgICAgIHJldHVybiBuYW1lZFZhbHVlc0ZvcigqKEUqKW51bGxwdHIpOworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQiwgYm9vbCBlbmFibGVkPXN0ZDo6aXNfYXJpdGhtZXRpYzxCPjo6dmFsdWUgfHwgc3RkOjppc19lbnVtPEI+Ojp2YWx1ZT4KKyAgICBzdHJ1Y3QgQzJfSElERSBfTmFtZWRWYWx1ZXNHZXR0ZXI7CisKK3B1YmxpYzoKKyAgICBpbmxpbmUgQzJGaWVsZERlc2NyaXB0b3IodWludDMyX3QgdHlwZSwgdWludDMyX3QgZXh0ZW50LCBDMlN0cmluZyBuYW1lLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBfbVR5cGUoKHR5cGVfdCl0eXBlKSwgX21FeHRlbnQoZXh0ZW50KSwgX21OYW1lKG5hbWUpLCBfbUZpZWxkSWQob2Zmc2V0LCBzaXplKSB7IH0KKworICAgIGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcihjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmKSA9IGRlZmF1bHQ7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBjbGFzcyBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxUPjo6dHlwZT4KKyAgICBpbmxpbmUgQzJGaWVsZERlc2NyaXB0b3IoY29uc3QgVCogb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lKQorICAgICAgICA6IF9tVHlwZSh0aGlzLT5HZXRUeXBlKChCKiludWxscHRyKSksCisgICAgICAgICAgX21FeHRlbnQoc3RkOjppc19hcnJheTxUPjo6dmFsdWUgPyBzdGQ6OmV4dGVudDxUPjo6dmFsdWUgOiAxKSwKKyAgICAgICAgICBfbU5hbWUobmFtZSksCisgICAgICAgICAgX21OYW1lZFZhbHVlcyhfTmFtZWRWYWx1ZXNHZXR0ZXI8Qj46OmdldE5hbWVkVmFsdWVzKCkpLAorICAgICAgICAgIF9tRmllbGRJZChvZmZzZXQpIHt9CisKKyAgICAvLy8gXGRlcHJlY2F0ZWQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBjbGFzcyBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxUPjo6dHlwZT4KKyAgICBpbmxpbmUgQzJGaWVsZERlc2NyaXB0b3IoUyosIFQgUzo6KiBmaWVsZCwgY29uc3QgY2hhciAqbmFtZSkKKyAgICAgICAgOiBfbVR5cGUodGhpcy0+R2V0VHlwZSgoQiopbnVsbHB0cikpLAorICAgICAgICAgIF9tRXh0ZW50KHN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlID8gc3RkOjpleHRlbnQ8VD46OnZhbHVlIDogMSksCisgICAgICAgICAgX21OYW1lKG5hbWUpLAorICAgICAgICAgIF9tRmllbGRJZCgmKCgoUyopMCktPipmaWVsZCkpIHt9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkCisgICAgaW5saW5lIHR5cGVfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gX21UeXBlOyB9CisgICAgLy8vIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgZmllbGQgaW4gY2FzZSBpdCBpcyBhbiBhcnJheS4gUmV0dXJucyAwIGZvcgorICAgIC8vLyBUW10gYXJyYXlzLCByZXR1cm5zIDEgZm9yIFRbMV0gYXJyYXlzIGFzIHdlbGwgYXMgaWYgdGhlIGZpZWxkIGlzIG5vdCBhbiBhcnJheS4KKyAgICBpbmxpbmUgc2l6ZV90IGV4dGVudCgpIGNvbnN0IHsgcmV0dXJuIF9tRXh0ZW50OyB9CisgICAgLy8vIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCisgICAgaW5saW5lIEMyU3RyaW5nIG5hbWUoKSBjb25zdCB7IHJldHVybiBfbU5hbWU7IH0KKworICAgIGNvbnN0IE5hbWVkVmFsdWVzVHlwZSAmbmFtZWRWYWx1ZXMoKSBjb25zdCB7IHJldHVybiBfbU5hbWVkVmFsdWVzOyB9CisKKyNpZiBkZWZpbmVkKEZSSUVORF9URVNUKQorICAgIGZyaWVuZCB2b2lkIFByaW50VG8oY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJiwgOjpzdGQ6Om9zdHJlYW0qKTsKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICYsIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICYpOworICAgIEZSSUVORF9URVNUKEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCBWZXJpZnlTdHJ1Y3QpOworI2VuZGlmCisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuIG9mZnNldGVkIGZpZWxkIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZkZXNjLCBzaXplX3Qgb2Zmc2V0KQorICAgICAgICA6IF9tVHlwZShkZXNjLl9tVHlwZSksIF9tRXh0ZW50KGRlc2MuX21FeHRlbnQpLAorICAgICAgICAgIF9tTmFtZShkZXNjLl9tTmFtZSksIF9tTmFtZWRWYWx1ZXMoZGVzYy5fbU5hbWVkVmFsdWVzKSwKKyAgICAgICAgICBfbUZpZWxkSWQoZGVzYy5fbUZpZWxkSWQuX21PZmZzZXQgKyBvZmZzZXQsIGRlc2MuX21GaWVsZElkLl9tU2l6ZSkgeyB9CisKKyAgICB0eXBlX3QgX21UeXBlOworICAgIHVpbnQzMl90IF9tRXh0ZW50OyAvLyB0aGUgbGFzdCBtZW1iZXIgY2FuIGJlIGFyYml0cmFyeSBsZW5ndGggaWYgaXQgaXMgVFtdIGFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAvLyBleHRlbmRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgcGFyYW1ldGVyICh0aGlzIGlzIG1hcmtlZCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgIC8vIDApLiBUWzBdLXMgYXJlIG5vdCBmaWVsZHMuCisgICAgQzJTdHJpbmcgX21OYW1lOworICAgIE5hbWVkVmFsdWVzVHlwZSBfbU5hbWVkVmFsdWVzOworCisgICAgX0MyRmllbGRJZCBfbUZpZWxkSWQ7ICAgLy8gZmllbGQgaWRlbnRpZmllciAob2Zmc2V0IGFuZCBzaXplKQorCisgICAgLy8gTk9URTogV2UgZG8gbm90IGNhcHR1cmUgZGVmYXVsdCB2YWx1ZShzKSBoZXJlIGFzIHRoYXQgbWF5IGRlcGVuZCBvbiB0aGUgY29tcG9uZW50LgorICAgIC8vIE5PVEU6IFdlIGFsc28gZG8gbm90IGNhcHR1cmUgYmVzdEVmZm9ydCwgYXMgMSkgdGhpcyBzaG91bGQgYmUgdHJ1ZSBmb3IgbW9zdCBmaWVsZHMsCisgICAgLy8gMikgdGhpcyBpcyBhdCBwYXJhbWV0ZXIgZ3JhbnVsYXJpdHkuCisKKyAgICAvLyB0eXBlIHJlc29sdXRpb24KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKGludDMyX3QqKSAgICAgeyByZXR1cm4gSU5UMzI7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKHVpbnQzMl90KikgICAgeyByZXR1cm4gVUlOVDMyOyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShjMl9jbnRyMzJfdCopIHsgcmV0dXJuIENOVFIzMjsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoaW50NjRfdCopICAgICB7IHJldHVybiBJTlQ2NDsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUodWludDY0X3QqKSAgICB7IHJldHVybiBVSU5UNjQ7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKGMyX2NudHI2NF90KikgeyByZXR1cm4gQ05UUjY0OyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShmbG9hdCopICAgICAgIHsgcmV0dXJuIEZMT0FUOyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShjaGFyKikgICAgICAgIHsgcmV0dXJuIFNUUklORzsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUodWludDhfdCopICAgICB7IHJldHVybiBCTE9COyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULAorICAgICAgICAgICAgIGNsYXNzPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfZW51bTxUPjo6dmFsdWU+Ojp0eXBlPgorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoVCopIHsKKyAgICAgICAgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8VD46OnR5cGUgdW5kZXJseWluZygwKTsKKyAgICAgICAgcmV0dXJuIEdldFR5cGUoJnVuZGVybHlpbmcpOworICAgIH0KKworICAgIC8vIHZlcmlmeSBDMlN0cnVjdCBieSBoYXZpbmcgYSBGaWVsZExpc3QoKSBhbmQgYSBDT1JFX0lOREVYLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsCisgICAgICAgICAgICAgY2xhc3M9ZGVjbHR5cGUoVDo6Q09SRV9JTkRFWCArIDEpLCBjbGFzcz1kZWNsdHlwZShUOjpGaWVsZExpc3QoKSk+CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShUKikgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX2Jhc2Vfb2Y8QzJQYXJhbSwgVD46OnZhbHVlLCAiY2Fubm90IHVzZSBDMlBhcmFtcyBhcyBmaWVsZHMiKTsKKyAgICAgICAgcmV0dXJuICh0eXBlX3QpKFQ6OkNPUkVfSU5ERVggfCBTVFJVQ1RfRkxBRyk7CisgICAgfQorCisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsKK307CisKKy8vIG5vIG5hbWVkIHZhbHVlcyBmb3IgY29tcG91bmQgdHlwZXMKK3RlbXBsYXRlPHR5cGVuYW1lIEI+CitzdHJ1Y3QgQzJGaWVsZERlc2NyaXB0b3I6Ol9OYW1lZFZhbHVlc0dldHRlcjxCLCBmYWxzZT4geworICAgIGlubGluZSBzdGF0aWMgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBnZXROYW1lZFZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIE5hbWVkVmFsdWVzVHlwZSgpOworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEI+CitzdHJ1Y3QgQzJGaWVsZERlc2NyaXB0b3I6Ol9OYW1lZFZhbHVlc0dldHRlcjxCLCB0cnVlPiB7CisgICAgaW5saW5lIHN0YXRpYyBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIGdldE5hbWVkVmFsdWVzKCkgeworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XbnVsbC1kZXJlZmVyZW5jZSIKKyAgICAgICAgcmV0dXJuIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0ZvcigqKEIqKW51bGxwdHIpOworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyAgICB9Cit9OworCisjZGVmaW5lIERFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKHR5cGUpIFwKK3RlbXBsYXRlPD4gaW5saW5lIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKGNvbnN0IHR5cGUgJikgeyBcCisgICAgcmV0dXJuIE5hbWVkVmFsdWVzVHlwZSgpOyBcCit9CisKKy8vIFdlIGNhbm5vdCBzdWJ0eXBlIGNvbnN0cnVjdG9yIGZvciBlbnVtZXJhdGVkIHR5cGVzIHNvIGluc3RlZCBkZWZpbmUgbm8gbmFtZWQgdmFsdWVzIGZvcgorLy8gbm9uLWVudW1lcmF0ZWQgaW50ZWdyYWwgdHlwZXMuCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihpbnQzMl90KQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IodWludDMyX3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihjMl9jbnRyMzJfdCkKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKGludDY0X3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUih1aW50NjRfdCkKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKGMyX2NudHI2NF90KQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IodWludDhfdCkKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKGNoYXIpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihmbG9hdCkKKworLyoqCisgKiBEZXNjcmliZXMgdGhlIGZpZWxkcyBvZiBhIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IEMyU3RydWN0RGVzY3JpcHRvciB7CitwdWJsaWM6CisgICAgLy8vIFJldHVybnMgdGhlIGNvcmUgaW5kZXggb2YgdGhlIHN0cnVjdAorICAgIGlubGluZSBDMlBhcmFtOjpDb3JlSW5kZXggY29yZUluZGV4KCkgY29uc3QgeyByZXR1cm4gX21UeXBlLmNvcmVJbmRleCgpOyB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmllbGRzIGluIHRoaXMgc3RydWN0IChub3QgY291bnRpbmcgYW55IHJlY3Vyc2l2ZSBmaWVsZHMpLgorICAgIC8vIE11c3QgYmUgYXQgbGVhc3QgMSBmb3IgdmFsaWQgc3RydWN0cy4KKyAgICBpbmxpbmUgc2l6ZV90IG51bUZpZWxkcygpIGNvbnN0IHsgcmV0dXJuIF9tRmllbGRzLnNpemUoKTsgfQorCisgICAgLy8gUmV0dXJucyB0aGUgbGlzdCBvZiBkaXJlY3QgZmllbGRzIChub3QgY291bnRpbmcgYW55IHJlY3Vyc2l2ZSBmaWVsZHMpLgorICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+Ojpjb25zdF9pdGVyYXRvciBmaWVsZF9pdGVyYXRvcjsKKyAgICBpbmxpbmUgZmllbGRfaXRlcmF0b3IgY2JlZ2luKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZHMuY2JlZ2luKCk7IH0KKyAgICBpbmxpbmUgZmllbGRfaXRlcmF0b3IgY2VuZCgpIGNvbnN0IHsgcmV0dXJuIF9tRmllbGRzLmNlbmQoKTsgfQorCisgICAgLy8gb25seSBzdXBwbHlpbmcgY29uc3QgaXRlcmF0b3IgLSBidXQgdGhlc2UgbmFtZXMgYXJlIG5lZWRlZCBmb3IgcmFuZ2UgYmFzZWQgbG9vcHMKKyAgICBpbmxpbmUgZmllbGRfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfbUZpZWxkcy5jYmVnaW4oKTsgfQorICAgIGlubGluZSBmaWVsZF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBfbUZpZWxkcy5jZW5kKCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEMyU3RydWN0RGVzY3JpcHRvcihUKikKKyAgICAgICAgOiBDMlN0cnVjdERlc2NyaXB0b3IoVDo6Q09SRV9JTkRFWCwgVDo6RmllbGRMaXN0KCkpIHsgfQorCisgICAgaW5saW5lIEMyU3RydWN0RGVzY3JpcHRvcigKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCB0eXBlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+ICZmaWVsZHMpCisgICAgICAgIDogX21UeXBlKHR5cGUpLCBfbUZpZWxkcyhmaWVsZHMpIHsgfQorCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7CisKKyAgICBpbmxpbmUgQzJTdHJ1Y3REZXNjcmlwdG9yKAorICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IHR5cGUsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gJiZmaWVsZHMpCisgICAgICAgIDogX21UeXBlKHR5cGUpLCBfbUZpZWxkcyhzdGQ6Om1vdmUoZmllbGRzKSkgeyB9CisKKyAgICBjb25zdCBDMlBhcmFtOjpDb3JlSW5kZXggX21UeXBlOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfbUZpZWxkczsKK307CisKKy8qKgorICogRGVzY3JpYmVzIHBhcmFtZXRlcnMgZm9yIGEgY29tcG9uZW50LgorICovCitzdHJ1Y3QgQzJQYXJhbURlc2NyaXB0b3IgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBzZXR0aW5nIHRoaXMgcGFyYW0gaXMgcmVxdWlyZWQgdG8gY29uZmlndXJlIHRoaXMgY29tcG9uZW50LgorICAgICAqIFRoaXMgY2FuIG9ubHkgYmUgdHJ1ZSBmb3IgYnVpbHRpbiBwYXJhbXMgZm9yIHBsYXRmb3JtLWRlZmluZWQgY29tcG9uZW50cyAoZS5nLiB2aWRlbyBhbmQKKyAgICAgKiBhdWRpbyBlbmNvZGVycy9kZWNvZGVycywgdmlkZW8vYXVkaW8gZmlsdGVycykuCisgICAgICogRm9yIHZlbmRvci1kZWZpbmVkIGNvbXBvbmVudHMsIGl0IGNhbiBiZSB0cnVlIGV2ZW4gZm9yIHZlbmRvci1kZWZpbmVkIHBhcmFtcywKKyAgICAgKiBidXQgaXQgaXMgbm90IHJlY29tbWVuZGVkLCBpbiBjYXNlIHRoZSBjb21wb25lbnQgYmVjb21lcyBwbGF0Zm9ybS1kZWZpbmVkLgorICAgICAqLworICAgIGlubGluZSBib29sIGlzUmVxdWlyZWQoKSBjb25zdCB7IHJldHVybiBfbUF0dHJpYiAmIElTX1JFUVVJUkVEOyB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBwYXJhbWV0ZXIgaXMgcGVyc2lzdGVudC4gVGhpcyBpcyBhbHdheXMgdHJ1ZSBmb3IgQzJUdW5pbmcgYW5kIEMyU2V0dGluZywKKyAgICAgKiBidXQgbWF5IGJlIGZhbHNlIGZvciBDMkluZm8uIElmIHRydWUsIHRoaXMgcGFyYW1ldGVyIHBlcnNpc3RzIGFjcm9zcyBmcmFtZXMgYW5kIGFwcGxpZXMgdG8KKyAgICAgKiB0aGUgY3VycmVudCBhbmQgc3Vic2VxdWVudCBmcmFtZXMuIElmIGZhbHNlLCB0aGlzIEMySW5mbyBwYXJhbWV0ZXIgb25seSBhcHBsaWVzIHRvIHRoZQorICAgICAqIGN1cnJlbnQgZnJhbWUgYW5kIGlzIG5vdCBhc3N1bWVkIHRvIGhhdmUgdGhlIHNhbWUgdmFsdWUgKG9yIGV2ZW4gYmUgcHJlc2VudCkgb24gc3Vic2VxdWVudAorICAgICAqIGZyYW1lcywgdW5sZXNzIGl0IGlzIHNwZWNpZmllZCBmb3IgdGhvc2UgZnJhbWVzLgorICAgICAqLworICAgIGlubGluZSBib29sIGlzUGVyc2lzdGVudCgpIGNvbnN0IHsgcmV0dXJuIF9tQXR0cmliICYgSVNfUEVSU0lTVEVOVDsgfQorCisgICAgaW5saW5lIGJvb2wgaXNTdHJpY3QoKSBjb25zdCB7IHJldHVybiBfbUF0dHJpYiAmIElTX1NUUklDVDsgfQorCisgICAgaW5saW5lIGJvb2wgaXNSZWFkT25seSgpIGNvbnN0IHsgcmV0dXJuIF9tQXR0cmliICYgSVNfUkVBRF9PTkxZOyB9CisKKyAgICBpbmxpbmUgYm9vbCBpc1Zpc2libGUoKSBjb25zdCB7IHJldHVybiAhKF9tQXR0cmliICYgSVNfSElEREVOKTsgfQorCisgICAgaW5saW5lIGJvb2wgaXNQdWJsaWMoKSBjb25zdCB7IHJldHVybiAhKF9tQXR0cmliICYgSVNfSU5URVJOQUwpOyB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHBhcmFtLgorICAgIC8vLyBUaGlzIGRlZmF1bHRzIHRvIHRoZSB1bmRlcmx5aW5nIEMyU3RydWN0J3MgbmFtZSwgYnV0IGNvdWxkIGJlIGFsdGVyZWQgZm9yIGEgY29tcG9uZW50LgorICAgIGlubGluZSBDMlN0cmluZyBuYW1lKCkgY29uc3QgeyByZXR1cm4gX21OYW1lOyB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgcGFyYW1ldGVyIGluZGV4CisgICAgaW5saW5lIEMyUGFyYW06OkluZGV4IGluZGV4KCkgY29uc3QgeyByZXR1cm4gX21JbmRleDsgfQorCisgICAgLy8vIFJldHVybnMgdGhlIGluZGljZXMgb2YgcGFyYW1ldGVycyB0aGF0IHRoaXMgcGFyYW1ldGVyIGhhcyBhIGRlcGVuZGVuY3kgb24KKyAgICBpbmxpbmUgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZkZXBlbmRlbmNpZXMoKSBjb25zdCB7IHJldHVybiBfbURlcGVuZGVuY2llczsgfQorCisgICAgLy8vIFxkZXByZWNhdGVkCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgQzJQYXJhbURlc2NyaXB0b3IoYm9vbCBpc1JlcXVpcmVkLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSwgY29uc3QgVCopCisgICAgICAgIDogX21JbmRleChUOjpQQVJBTV9UWVBFKSwKKyAgICAgICAgICBfbUF0dHJpYihJU19QRVJTSVNURU5UIHwgKGlzUmVxdWlyZWQgPyBJU19SRVFVSVJFRCA6IDApKSwKKyAgICAgICAgICBfbU5hbWUobmFtZSkgeyB9CisKKyAgICAvLy8gXGRlcHJlY2F0ZWQKKyAgICBpbmxpbmUgQzJQYXJhbURlc2NyaXB0b3IoCisgICAgICAgICAgICBib29sIGlzUmVxdWlyZWQsIEMyU3RyaW5nTGl0ZXJhbCBuYW1lLCBDMlBhcmFtOjpJbmRleCBpbmRleCkKKyAgICAgICAgOiBfbUluZGV4KGluZGV4KSwKKyAgICAgICAgICBfbUF0dHJpYihJU19QRVJTSVNURU5UIHwgKGlzUmVxdWlyZWQgPyBJU19SRVFVSVJFRCA6IDApKSwKKyAgICAgICAgICBfbU5hbWUobmFtZSkgeyB9CisKKyAgICBlbnVtIGF0dHJpYl90IDogdWludDMyX3QgeworICAgICAgICAvLyBmbGFncyB0aGF0IGRlZmF1bHQgb24KKyAgICAgICAgSVNfUkVRVUlSRUQgICA9IDF1IDw8IDAsIC8vLzwgcGFyYW1ldGVyIGlzIHJlcXVpcmVkIHRvIGJlIHNwZWNpZmllZAorICAgICAgICBJU19QRVJTSVNURU5UID0gMXUgPDwgMSwgLy8vPCBwYXJhbWV0ZXIgcmV0YWlucyBpdHMgdmFsdWUKKyAgICAgICAgLy8gZmxhZ3MgdGhhdCBkZWZhdWx0IG9mZgorICAgICAgICBJU19TVFJJQ1QgICAgID0gMXUgPDwgMiwgLy8vPCBwYXJhbWV0ZXIgaXMgc3RyaWN0CisgICAgICAgIElTX1JFQURfT05MWSAgPSAxdSA8PCAzLCAvLy88IHBhcmFtZXRlciBpcyBwdWJsaWNseSByZWFkLW9ubHkKKyAgICAgICAgSVNfSElEREVOICAgICA9IDF1IDw8IDQsIC8vLzwgcGFyYW1ldGVyIHNoYWxsIG5vdCBiZSB2aXNpYmxlIHRvIGNsaWVudHMKKyAgICAgICAgSVNfSU5URVJOQUwgICA9IDF1IDw8IDUsIC8vLzwgcGFyYW1ldGVyIHNoYWxsIG5vdCBiZSB1c2VkIGJ5IGZyYW1ld29yayAob3RoZXIgdGhhbiB0ZXN0aW5nKQorICAgICAgICBJU19DT05TVCAgICAgID0gMXUgPDwgNiB8IElTX1JFQURfT05MWSwgLy8vPCBwYXJhbWV0ZXIgaXMgcHVibGljbHkgY29uc3QgKGhlbmNlIHJlYWQtb25seSkKKyAgICB9OworCisgICAgaW5saW5lIEMyUGFyYW1EZXNjcmlwdG9yKAorICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleCwgYXR0cmliX3QgYXR0cmliLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSkKKyAgICAgICAgOiBfbUluZGV4KGluZGV4KSwKKyAgICAgICAgICBfbUF0dHJpYihhdHRyaWIpLAorICAgICAgICAgIF9tTmFtZShuYW1lKSB7IH0KKworICAgIGlubGluZSBDMlBhcmFtRGVzY3JpcHRvcigKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggaW5kZXgsIGF0dHJpYl90IGF0dHJpYiwgQzJTdHJpbmcgJiZuYW1lLAorICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJiZkZXBlbmRlbmNpZXMpCisgICAgICAgIDogX21JbmRleChpbmRleCksCisgICAgICAgICAgX21BdHRyaWIoYXR0cmliKSwKKyAgICAgICAgICBfbU5hbWUobmFtZSksCisgICAgICAgICAgX21EZXBlbmRlbmNpZXMoc3RkOjptb3ZlKGRlcGVuZGVuY2llcykpIHsgfQorCitwcml2YXRlOgorICAgIGNvbnN0IEMyUGFyYW06OkluZGV4IF9tSW5kZXg7CisgICAgY29uc3QgdWludDMyX3QgX21BdHRyaWI7CisgICAgY29uc3QgQzJTdHJpbmcgX21OYW1lOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBfbURlcGVuZGVuY2llczsKKworICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7Cit9OworCitERUZJTkVfRU5VTV9PUEVSQVRPUlMoOjpDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QpCisKKworLy8vIFxpbmdyb3VwIGludGVybmFsCisvLy8gRGVmaW5lIGEgc3RydWN0dXJlIHdpdGhvdXQgQ09SRV9JTkRFWC4KKy8vLyBcbm90ZSBfRklFTERfTElTVCBpcyB1c2VkIG9ubHkgZHVyaW5nIGRlY2xhcmF0aW9uIHNvIHRoYXQgQzJTdHJ1Y3QgZGVjbGFyYXRpb25zIGNhbiBlbmQgd2l0aAorLy8vIGEgc2ltcGxlIGxpc3Qgb2YgQzJGSUVMRC1zIGFuZCBjbG9zaW5nIGJyYWNrZXQuIE1hcmsgaXQgdW51c2VkIGFzIGl0IGlzIG5vdCB1c2VkIGluIHRlbXBsYXRlZAorLy8vIHN0cnVjdHMuCisjZGVmaW5lIERFRklORV9CQVNFX0MyU1RSVUNUKG5hbWUpIFwKK3ByaXZhdGU6IFwKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUIF9fdW51c2VkOyAvKio8IHN0cnVjdHVyZSBmaWVsZHMgKi8gXAorcHVibGljOiBcCisgICAgdHlwZWRlZiBDMiMjbmFtZSMjU3RydWN0IF90eXBlOyAvKio8IHR5cGUgbmFtZSBzaG9ydGhhbmQgKi8gXAorICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7IC8qKjwgc3RydWN0dXJlIGZpZWxkcyBmYWN0b3J5ICovCisKKy8vLyBEZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aCBtYXRjaGluZyBDT1JFX0lOREVYLgorI2RlZmluZSBERUZJTkVfQzJTVFJVQ1QobmFtZSkgXAorcHVibGljOiBcCisgICAgZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4IyNuYW1lIH07IFwKKyAgICBERUZJTkVfQkFTRV9DMlNUUlVDVChuYW1lKQorCisvLy8gRGVmaW5lIGEgZmxleGlibGUgc3RydWN0dXJlIHdpdGhvdXQgQ09SRV9JTkRFWC4KKyNkZWZpbmUgREVGSU5FX0JBU0VfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyKSBcCitwdWJsaWM6IFwKKyAgICBGTEVYKEMyIyNuYW1lIyNTdHJ1Y3QsIGZsZXhNZW1iZXIpIFwKKyAgICBERUZJTkVfQkFTRV9DMlNUUlVDVChuYW1lKQorCisvLy8gRGVmaW5lIGEgZmxleGlibGUgc3RydWN0dXJlIHdpdGggbWF0Y2hpbmcgQ09SRV9JTkRFWC4KKyNkZWZpbmUgREVGSU5FX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlcikgXAorcHVibGljOiBcCisgICAgRkxFWChDMiMjbmFtZSMjU3RydWN0LCBmbGV4TWVtYmVyKSBcCisgICAgZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4IyNuYW1lIHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19GTEVYX0ZMQUcgfTsgXAorICAgIERFRklORV9CQVNFX0MyU1RSVUNUKG5hbWUpCisKKy8vLyBcaW5ncm91cCBpbnRlcm5hbAorLy8vIERlc2NyaWJlIGEgc3RydWN0dXJlIG9mIGEgdGVtcGxhdGVkIHN0cnVjdHVyZS4KKy8vIFVzZSBsaXN0Li4uIGFzIHRoZSBhcmd1bWVudCBnZXRzIHJlc3Vic2l0aXR1dGVkIGFuZCBpdCBjb250YWlucyBjb21tYXMuIEFsdGVybmF0aXZlIHdvdWxkIGJlCisvLyB0byB3cmFwIGxpc3QgaW4gYW4gZXhwcmVzc2lvbiwgZS5nLiAoeyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gbGlzdDsgfSkpIHdoaWNoIGNvbnZlcnRzCisvLyBpdCBmcm9tIGFuIGluaXRpYWxpemVyIGxpc3QgdG8gYSB2ZWN0b3IuCisjZGVmaW5lIERFU0NSSUJFX1RFTVBMQVRFRF9DMlNUUlVDVChzdHJ1a3QsIGxpc3QuLi4pIFwKKyAgICBfREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1QodGVtcGxhdGU8Piwgc3RydWt0LCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18sIGxpc3QpCisKKy8vLyBcZGVwcmVjYXRlZAorLy8vIERlc2NyaWJlIHRoZSBmaWVsZHMgb2YgYSBzdHJ1Y3R1cmUgdXNpbmcgYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyNkZWZpbmUgREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgbGlzdC4uLikgXAorICAgIF9ERVNDUklCRV9URU1QTEFUQUJMRV9DMlNUUlVDVCgsIEMyIyNuYW1lIyNTdHJ1Y3QsIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXywgbGlzdCkKKworLy8vIFxpbmdyb3VwIGludGVybmFsCisvLy8gTWFjcm8gbGF5ZXIgdG8gZ2V0IHZhbHVlIG9mIGVuYWJsZWQgdGhhdCBpcyBwYXNzZWQgaW4gYXMgYSBtYWNybyB2YXJpYWJsZQorI2RlZmluZSBfREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1QodGVtcGxhdGUsIHN0cnVrdCwgZW5hYmxlZCwgbGlzdC4uLikgXAorICAgIF9fREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1QodGVtcGxhdGUsIHN0cnVrdCwgZW5hYmxlZCwgbGlzdCkKKworLy8vIFxpbmdyb3VwIGludGVybmFsCisvLy8gTWFjcm8gbGF5ZXIgdG8gcmVzb2x2ZSB0byB0aGUgc3BlY2lmaWMgbWFjcm8gYmFzZWQgb24gbWFjcm8gdmFyaWFibGUKKyNkZWZpbmUgX19ERVNDUklCRV9URU1QTEFUQUJMRV9DMlNUUlVDVCh0ZW1wbGF0ZSwgc3RydWt0LCBlbmFibGVkLCBsaXN0Li4uKSBcCisgICAgX19fREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1QjI2VuYWJsZWQodGVtcGxhdGUsIHN0cnVrdCwgbGlzdCkKKworI2RlZmluZSBfX19ERVNDUklCRV9URU1QTEFUQUJMRV9DMlNUUlVDVCh0ZW1wbGF0ZSwgc3RydWt0LCBsaXN0Li4uKSBcCisgICAgdGVtcGxhdGUgXAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBzdHJ1a3Q6OkZpZWxkTGlzdCgpIHsgcmV0dXJuIGxpc3Q7IH0KKworI2RlZmluZSBfX19ERVNDUklCRV9URU1QTEFUQUJMRV9DMlNUUlVDVF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyh0ZW1wbGF0ZSwgc3RydWt0LCBsaXN0Li4uKQorCisvKioKKyAqIERlc2NyaWJlIGEgZmllbGQgb2YgYSBzdHJ1Y3R1cmUuCisgKiBUaGVzZSBtdXN0IGJlIGluIG9yZGVyLgorICoKKyAqIFRoZXJlIGFyZSB0d28gd2F5cyB0byB1c2UgdGhpcyBtYWNybzoKKyAqCisgKiAgfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAqICBzdHJ1Y3QgQzJWaWRlb1dpZHRoU3RydWN0IHsKKyAqICAgICAgaW50MzJfdCB3aWR0aDsKKyAqICAgICAgQzJWaWRlb1dpZHRoU3RydWN0KCkge30gLy8gb3B0aW9uYWwgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICogICAgICBDMlZpZGVvV2lkdGhTdHJ1Y3QoaW50MzJfdCBfd2lkdGgpIDogd2lkdGgoX3dpZHRoKSB7fQorICoKKyAqICAgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChWaWRlb1dpZHRoKQorICogICAgICBDMkZJRUxEKHdpZHRoLCAid2lkdGgiKQorICogIH07CisgKiAgfn5+fn5+fn5+fn5+fgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIHN0cnVjdCBDMlZpZGVvV2lkdGhTdHJ1Y3QgeworICogICAgICBpbnQzMl90IHdpZHRoOworICogICAgICBDMlZpZGVvV2lkdGhTdHJ1Y3QoKSA9IGRlZmF1bHQ7IC8vIG9wdGlvbmFsIGRlZmF1bHQgY29uc3RydWN0b3IKKyAqICAgICAgQzJWaWRlb1dpZHRoU3RydWN0KGludDMyX3QgX3dpZHRoKSA6IHdpZHRoKF93aWR0aCkge30KKyAqCisgKiAgICAgIERFRklORV9DMlNUUlVDVChWaWRlb1dpZHRoKQorICogIH0gQzJfUEFDSzsKKyAqCisgKiAgREVTQ1JJQkVfQzJTVFJVQ1QoVmlkZW9XaWR0aCwgeworICogICAgICBDMkZJRUxEKHdpZHRoLCAid2lkdGgiKQorICogIH0pCisgKiAgfn5+fn5+fn5+fn5+fgorICoKKyAqICBGb3IgZmxleGlibGUgc3RydWN0dXJlcyAodGhvc2UgZW5kaW5nIGluIFRbXSksIHVzZSB0aGUgZmxleGlibGUgbWFjcm9zOgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIHN0cnVjdCBDMlZpZGVvRmxleFdpZHRoc1N0cnVjdCB7CisgKiAgICAgIGludDMyX3Qgd2lkdGhzW107CisgKiAgICAgIEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0KCk7IC8vIG11c3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IKKyAqCisgKiAgcHJpdmF0ZToKKyAqICAgICAgLy8gbWF5IGhhdmUgcHJpdmF0ZSBjb25zdHJ1Y3RvcnMgdGFraW5nIG51bWJlciBvZiB3aWR0aHMgYXMgdGhlIGZpcnN0IGFyZ3VtZW50CisgKiAgICAgIC8vIFRoaXMgaXMgdXNlZCBieSB0aGUgQzJQYXJhbSBmYWN0b3J5IG1ldGhvZHMsIGUuZy4KKyAqICAgICAgLy8gICBDMlZpZGVvRmxleFdpZHRoc0dsb2JhbFBhcmFtOjpBbGxvY1VuaXF1ZShzaXplX3QsIGludDMyX3QpOworICogICAgICBDMlZpZGVvRmxleFdpZHRoc1N0cnVjdChzaXplX3QgZmxleENvdW50LCBpbnQzMl90IHZhbHVlKSB7CisgKiAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZsZXhDb3VudDsgKytpKSB7CisgKiAgICAgICAgICAgICAgd2lkdGhzW2ldID0gdmFsdWU7CisgKiAgICAgICAgICB9CisgKiAgICAgIH0KKyAqCisgKiAgICAgIC8vIElmIHRoZSBsYXN0IGFyZ3VtZW50IGlzIFRbTl0gb3Igc3RkOjppbml0aWFsaXplcl9saXN0PFQ+LCB0aGUgZmxleENvdW50IHdpbGwKKyAqICAgICAgLy8gYmUgYXV0b21hdGljYWxseSBjYWxjdWxhdGVkIGFuZCBwYXNzZWQgYnkgdGhlIEMyUGFyYW0gZmFjdG9yeSBtZXRob2RzLCBlLmcuCisgKiAgICAgIC8vICAgaW50IHdpZHRoc1tdID0geyAxLCAyLCAzIH07CisgKiAgICAgIC8vICAgQzJWaWRlb0ZsZXhXaWR0aHNHbG9iYWxQYXJhbTo6QWxsb2NVbmlxdWUod2lkdGhzKTsKKyAqICAgICAgdGVtcGxhdGU8dW5zaWduZWQgTj4KKyAqICAgICAgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgaW50MzJfdCgmaW5pdClbTl0pIHsKKyAqICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmxleENvdW50OyArK2kpIHsKKyAqICAgICAgICAgICAgICB3aWR0aHNbaV0gPSBpbml0W2ldOworICogICAgICAgICAgfQorICogICAgICB9CisgKgorICogICAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoVmlkZW9GbGV4V2lkdGhzLCB3aWR0aHMpCisgKiAgICAgIEMyRklFTEQod2lkdGhzLCAid2lkdGhzIikKKyAqICB9OworICogIH5+fn5+fn5+fn5+fn4KKyAqCisgKiAgfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAqICBzdHJ1Y3QgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3QgeworICogICAgICBpbnQzMl90IG1XaWR0aHNbXTsKKyAqICAgICAgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3QoKTsgLy8gbXVzdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICoKKyAqICAgICAgREVGSU5FX0ZMRVhfQzJTVFJVQ1QoVmlkZW9GbGV4V2lkdGhzLCBtV2lkdGhzKQorICogIH0gQzJfUEFDSzsKKyAqCisgKiAgREVTQ1JJQkVfQzJTVFJVQ1QoVmlkZW9GbGV4V2lkdGhzLCB7CisgKiAgICAgIEMyRklFTEQobVdpZHRocywgIndpZHRocyIpCisgKiAgfSkKKyAqICB+fn5+fn5+fn5+fn5+CisgKgorICovCisjZGVmaW5lIERFU0NSSUJFX0MyRklFTEQobWVtYmVyLCBuYW1lKSBcCisgIEMyRmllbGREZXNjcmlwdG9yKCYoKF90eXBlKikobnVsbHB0cikpLT5tZW1iZXIsIG5hbWUpLAorCisjZGVmaW5lIEMyRklFTEQobWVtYmVyLCBuYW1lKSBfQzJGSUVMRChtZW1iZXIsIG5hbWUsIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXykKKy8vLyBcaWYgMAorI2RlZmluZSBfQzJGSUVMRChtZW1iZXIsIG5hbWUsIGVuYWJsZWQpIF9fQzJGSUVMRChtZW1iZXIsIG5hbWUsIGVuYWJsZWQpCisjZGVmaW5lIF9fQzJGSUVMRChtZW1iZXIsIG5hbWUsIGVuYWJsZWQpIERFU0NSSUJFX0MyRklFTEQjI2VuYWJsZWQobWVtYmVyLCBuYW1lKQorI2RlZmluZSBERVNDUklCRV9DMkZJRUxEX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKG1lbWJlciwgbmFtZSkKKy8vLyBcZW5kaWYKKworLy8vIERlZmluZSBhIHN0cnVjdHVyZSB3aXRoIG1hdGNoaW5nIENPUkVfSU5ERVggYW5kIHN0YXJ0IGRlc2NyaWJpbmcgaXRzIGZpZWxkcy4KKy8vLyBUaGlzIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0dXJlIGRlZmluaXRpb24uCisjZGVmaW5lIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSkgXAorICAgIF9ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIERFRklORV9DMlNUUlVDVCwgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKQorCisvLy8gRGVmaW5lIGEgYmFzZSBzdHJ1Y3R1cmUgKHdpdGggbm8gQ09SRV9JTkRFWCkgYW5kIHN0YXJ0IGRlc2NyaWJpbmcgaXRzIGZpZWxkcy4KKy8vLyBUaGlzIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0dXJlIGRlZmluaXRpb24uCisjZGVmaW5lIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9DMlNUUlVDVChuYW1lKSBcCisgICAgX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgREVGSU5FX0JBU0VfQzJTVFJVQ1QsIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXykKKworLy8vIERlZmluZSBhIGZsZXhpYmxlIHN0cnVjdHVyZSB3aXRoIG1hdGNoaW5nIENPUkVfSU5ERVggYW5kIHN0YXJ0IGRlc2NyaWJpbmcgaXRzIGZpZWxkcy4KKy8vLyBUaGlzIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0dXJlIGRlZmluaXRpb24uCisjZGVmaW5lIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyKSBcCisgICAgX0RFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVCggXAorICAgICAgICAgICAgbmFtZSwgZmxleE1lbWJlciwgREVGSU5FX0ZMRVhfQzJTVFJVQ1QsIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXykKKworLy8vIERlZmluZSBhIGZsZXhpYmxlIGJhc2Ugc3RydWN0dXJlICh3aXRoIG5vIENPUkVfSU5ERVgpIGFuZCBzdGFydCBkZXNjcmliaW5nIGl0cyBmaWVsZHMuCisvLy8gVGhpcyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorI2RlZmluZSBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyKSBcCisgICAgX0RFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVCggXAorICAgICAgICAgICAgbmFtZSwgZmxleE1lbWJlciwgREVGSU5FX0JBU0VfRkxFWF9DMlNUUlVDVCwgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKQorCisvLy8gXGlmIDAKKy8qCisgICBBbHRlcm5hdGUgZGVjbGFyYXRpb24gb2YgZmllbGQgZGVmaW5pdGlvbnMgaW4gY2FzZSBubyBmaWVsZCBsaXN0IGlzIHRvIGJlIGdlbmVyYXRlZC4KKyAgIFRoZSBzcGVjaWZpYyBtYWNybyBpcyBjaG9zZWQgYmFzZWQgb24gdGhlIHZhbHVlIG9mIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyAod2hldGhlciBpdCBpcworICAgZGVmaW5lZCAodG8gYmUgZW1wdHkpIG9yIG5vdC4gVGhpcyByZXF1aXJlcyB0d28gbGV2ZWwgb2YgbWFjcm8gc3Vic3RpdHV0aW9uLgorICAgVFJJQ0tZOiB1c2UgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIHRvIGhhbmRsZSBjbG9zaW5nIGJyYWNrZXQgdGhhdCBpcyBub3JtYWxseSBhZnRlcgorICAgdGhlc2UgbWFjcm9zLgorKi8KKworI2RlZmluZSBfREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChuYW1lLCBkZWZpbmVNYWNybywgZW5hYmxlZCkgXAorICAgIF9fREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChuYW1lLCBkZWZpbmVNYWNybywgZW5hYmxlZCkKKyNkZWZpbmUgX19ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIGRlZmluZU1hY3JvLCBlbmFibGVkKSBcCisgICAgX19fREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVCMjZW5hYmxlZChuYW1lLCBkZWZpbmVNYWNybykKKyNkZWZpbmUgX19fREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyhuYW1lLCBkZWZpbmVNYWNybykgXAorICAgIGRlZmluZU1hY3JvKG5hbWUpIH0gQzJfUEFDSzsgbmFtZXNwYWNlIHsKKyNkZWZpbmUgX19fREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChuYW1lLCBkZWZpbmVNYWNybykgXAorICAgIGRlZmluZU1hY3JvKG5hbWUpIH0gQzJfUEFDSzsgXAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMiMjbmFtZSMjU3RydWN0OjpGaWVsZExpc3QoKSB7IHJldHVybiBfRklFTERfTElTVDsgfSBcCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyIyNuYW1lIyNTdHJ1Y3Q6Ol9GSUVMRF9MSVNUID0geworCisjZGVmaW5lIF9ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlciwgZGVmaW5lTWFjcm8sIGVuYWJsZWQpIFwKKyAgICBfX0RFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyLCBkZWZpbmVNYWNybywgZW5hYmxlZCkKKyNkZWZpbmUgX19ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlciwgZGVmaW5lTWFjcm8sIGVuYWJsZWQpIFwKKyAgICBfX19ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QjI2VuYWJsZWQobmFtZSwgZmxleE1lbWJlciwgZGVmaW5lTWFjcm8pCisjZGVmaW5lIF9fX0RFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyhuYW1lLCBmbGV4TWVtYmVyLCBkZWZpbmVNYWNybykgXAorICAgIGRlZmluZU1hY3JvKG5hbWUsIGZsZXhNZW1iZXIpIH0gQzJfUEFDSzsgbmFtZXNwYWNlIHsKKyNkZWZpbmUgX19fREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIsIGRlZmluZU1hY3JvKSBcCisgICAgZGVmaW5lTWFjcm8obmFtZSwgZmxleE1lbWJlcikgfSBDMl9QQUNLOyBcCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyIyNuYW1lIyNTdHJ1Y3Q6OkZpZWxkTGlzdCgpIHsgcmV0dXJuIF9GSUVMRF9MSVNUOyB9IFwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzIjI25hbWUjI1N0cnVjdDo6X0ZJRUxEX0xJU1QgPSB7CisvLy8gXGVuZGlmCisKKworLyoqCisgKiBQYXJhbWV0ZXIgcmVmbGVjdG9yIGNsYXNzLgorICoKKyAqIFRoaXMgY2xhc3MgY2VudHJhbGl6ZXMgdGhlIGRlc2NyaXB0aW9uIG9mIHBhcmFtZXRlciBzdHJ1Y3R1cmVzLiBUaGlzIGNhbiBiZSBzaGFyZWQKKyAqIGJ5IG11bHRpcGxlIGNvbXBvbmVudHMgYXMgZGVzY3JpYmluZyBhIHBhcmFtZXRlciBkb2VzIG5vdCBpbXBseSBzdXBwb3J0IG9mIHRoYXQKKyAqIHBhcmFtZXRlci4gSG93ZXZlciwgZWFjaCBzdXBwb3J0ZWQgcGFyYW1ldGVyIGFuZCBhbnkgZGVwZW5kZW50IHN0cnVjdHVyZXMgd2l0aGluCisgKiBtdXN0IGJlIGRlc2NyaWJlZCBieSB0aGUgcGFyYW1ldGVyIHJlZmxlY3RvciBwcm92aWRlZCBieSBhIGNvbXBvbmVudC4KKyAqLworY2xhc3MgQzJQYXJhbVJlZmxlY3RvciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogIERlc2NyaWJlcyBhIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgICAgICoKKyAgICAgKiAgXHBhcmFtW2luXSBjb3JlSW5kZXggdGhlIGNvcmUgaW5kZXggb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgY29udGFpbmluZyBhdCBsZWFzdCB0aGUKKyAgICAgKiAgY29yZSBpbmRleAorICAgICAqCisgICAgICogIFxyZXR1cm4gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlCisgICAgICogIFxyZXR2YWwgbnVsbHB0ciBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyByZWZsZWN0b3IKKyAgICAgKgorICAgICAqICBUaGlzIG1ldGhvZHMgc2hhbGwgbm90IGJsb2NrIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuCisgICAgICoKKyAgICAgKiAgXG5vdGUgdGhpcyBjbGFzcyBkb2VzIG5vdCB0YWtlIGEgc2V0IG9mIGluZGljZXMgYmVjYXVzZSB3ZSB3b3VsZCB0aGVuIHByZWZlcgorICAgICAqICB0byBhbHNvIHJldHVybiBhbnkgZGVwZW5kZW50IHN0cnVjdHVyZXMsIGFuZCB3ZSBkb24ndCB3YW50IHRoaXMgbG9naWMgdG8gYmUKKyAgICAgKiAgcmVwZWF0ZWQgaW4gZWFjaCByZWZsZWN0b3IuIEFsdGVybmF0ZWx5LCB0aGlzIGNvdWxkIGp1c3QgcmV0dXJuIGEgbWFwIG9mIGFsbAorICAgICAqICBkZXNjcmlwdGlvbnMsIGJ1dCB3ZSB3YW50IHRvIGNvbnNlcnZlIG1lbW9yeSBpZiBjbGllbnQgb25seSB3YW50cyB0aGUgZGVzY3JpcHRpb24KKyAgICAgKiAgb2YgYSBmZXcgaW5kaWNlcy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKEMyUGFyYW06OkNvcmVJbmRleCBjb3JlSW5kZXgpIGNvbnN0ID0gMDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkMyUGFyYW1SZWZsZWN0b3IoKSA9IGRlZmF1bHQ7Cit9OworCisvKioKKyAqIEdlbmVyaWMgc3VwcG9ydGVkIHZhbHVlcyBmb3IgYSBmaWVsZC4KKyAqCisgKiBUaGlzIGNhbiBiZSBlaXRoZXIgYSByYW5nZSBvciBhIHNldCBvZiB2YWx1ZXMuIFRoZSByYW5nZSBjYW4gYmUgYSBzaW1wbGUgcmFuZ2UsIGFuIGFyaXRobWV0aWMsCisgKiBnZW9tZXRyaWMgb3IgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMgd2l0aCBhIGNsZWFyIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUuIFZhbHVlcyBjYW4KKyAqIGJlIGRpc2NyZXRlIHZhbHVlcywgb3IgY2FuIG9wdGlvbmFsbHkgcmVwcmVzZW50IGZsYWdzIHRvIGJlIG9yLWVkLgorICoKKyAqIFxub3RlIERvIG5vdCB1c2UgZmxhZ3MgdG8gcmVwcmVzZW50IGJpdGZpZWxkcy4gVXNlIGluZGl2aWR1YWwgdmFsdWVzIG9yIHNlcGFyYXRlIGZpZWxkcyBpbnN0ZWFkLgorICovCitzdHJ1Y3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyB7CisvL3B1YmxpYzoKKyAgICBlbnVtIHR5cGVfdCB7CisgICAgICAgIEVNUFRZLCAgICAgIC8vLzwgbm8gc3VwcG9ydGVkIHZhbHVlcworICAgICAgICBSQU5HRSwgICAgICAvLy88IGEgbnVtZXJpYyByYW5nZSB0aGF0IGNhbiBiZSBjb250aW51b3VzIG9yIGRpc2NyZXRlCisgICAgICAgIFZBTFVFUywgICAgIC8vLzwgYSBsaXN0IG9mIHZhbHVlcworICAgICAgICBGTEFHUyAgICAgICAvLy88IGEgbGlzdCBvZiBmbGFncyB0aGF0IGNhbiBiZSBPUi1lZAorICAgIH07CisKKyAgICB0eXBlX3QgdHlwZTsgLyoqIFR5cGUgb2YgdmFsdWVzIGZvciB0aGlzIGZpZWxkLiAqLworCisgICAgdHlwZWRlZiBDMlZhbHVlOjpQcmltaXRpdmUgUHJpbWl0aXZlOworCisgICAgLyoqCisgICAgICogUmFuZ2Ugc3BlY2lmaWVyIGZvciBzdXBwb3J0ZWQgdmFsdWUuIFVzZWQgaWYgdHlwZSBpcyBSQU5HRS4KKyAgICAgKgorICAgICAqIElmIHN0ZXAgaXMgMCBhbmQgbnVtIGFuZCBkZW5vbSBhcmUgYm90aCAxLCB0aGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUgYW55IHZhbHVlLCBmb3Igd2hpY2gKKyAgICAgKiBtaW4gPD0gdmFsdWUgPD0gbWF4LgorICAgICAqCisgICAgICogT3RoZXJ3aXNlLCB0aGUgcmFuZ2UgcmVwcmVzZW50cyBhIGdlb21ldHJpYy9hcml0aG1ldGljL211bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzLCB3aGVyZQorICAgICAqIHN1Y2Nlc3NpdmUgc3VwcG9ydGVkIHZhbHVlcyBjYW4gYmUgZGVyaXZlZCBmcm9tIHByZXZpb3VzIHZhbHVlcyAoc3RhcnRpbmcgYXQgbWluKSwgdXNpbmcgdGhlCisgICAgICogZm9sbG93aW5nIGZvcm11bGE6CisgICAgICogIHZbMF0gPSBtaW4KKyAgICAgKiAgdltpXSA9IHZbaS0xXSAqIG51bSAvIGRlbm9tICsgc3RlcCBmb3IgaSA+PSAxLCB3aGlsZSBtaW4gPCB2W2ldIDw9IG1heC4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgICAvKiogTG93ZXIgZW5kIG9mIHRoZSByYW5nZSAoaW5jbHVzaXZlKS4gKi8KKyAgICAgICAgUHJpbWl0aXZlIG1pbjsKKyAgICAgICAgLyoqIFVwcGVyIGVuZCBvZiB0aGUgcmFuZ2UgKGluY2x1c2l2ZSBpZiBwZXJtaXR0ZWQgYnkgc2VyaWVzKS4gKi8KKyAgICAgICAgUHJpbWl0aXZlIG1heDsKKyAgICAgICAgLyoqIFN0ZXAgYmV0d2VlbiBzdXBwb3J0ZWQgdmFsdWVzLiAqLworICAgICAgICBQcmltaXRpdmUgc3RlcDsKKyAgICAgICAgLyoqIE51bWVyYXRvciBvZiBhIGdlb21ldHJpYyBzZXJpZXMuICovCisgICAgICAgIFByaW1pdGl2ZSBudW07CisgICAgICAgIC8qKiBEZW5vbWluYXRvciBvZiBhIGdlb21ldHJpYyBzZXJpZXMuICovCisgICAgICAgIFByaW1pdGl2ZSBkZW5vbTsKKyAgICB9IHJhbmdlOworCisgICAgLyoqCisgICAgICogTGlzdCBvZiB2YWx1ZXMuIFVzZWQgaWYgdHlwZSBpcyBWQUxVRVMgb3IgRkxBR1MuCisgICAgICoKKyAgICAgKiBJZiB0eXBlIGlzIFZBTFVFUywgdGhpcyBpcyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgdmFsdWVzIGluIGRlY3JlYXNpbmcgcHJlZmVyZW5jZS4KKyAgICAgKgorICAgICAqIElmIHR5cGUgaXMgRkxBR1MsIHRoaXMgdmVjdG9yIGNvbnRhaW5zIHsgbWluLW1hc2ssIGZsYWcxLCBmbGFnMi4uLiB9LiBCYXNpY2FsbHksIHRoZSBmaXJzdAorICAgICAqIHZhbHVlIGlzIHRoZSByZXF1aXJlZCBzZXQgb2YgZmxhZ3MgdG8gYmUgc2V0LCBhbmQgdGhlIHJlc3Qgb2YgdGhlIHZhbHVlcyBhcmUgZmxhZ3MgdGhhdCBjYW4KKyAgICAgKiBiZSBzZXQgaW5kZXBlbmRlbnRseS4gRkxBR1MgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGludGVncmFsIHR5cGVzLiBTdXBwb3J0ZWQgZmxhZ3Mgc2hvdWxkCisgICAgICogbm90IG92ZXJsYXAsIGFzIGl0IGNhbiBtYWtlIHZhbGlkYXRpb24gbm9uLWRldGVybWluaXN0aWMuIFRoZSBzdGFuZGFyZCB2YWxpZGF0aW9uIG1ldGhvZAorICAgICAqIGlzIHRoYXQgc3RhcnRpbmcgZnJvbSB0aGUgb3JpZ2luYWwgdmFsdWUsIGlmIGVhY2ggZmxhZyBpcyByZW1vdmVkIHdoZW4gZnVsbHkgcHJlc2VudCAodGhlCisgICAgICogbWluLW1hc2sgbXVzdCBiZSBmdWxseSBwcmVzZW50KSwgd2Ugc2hhbGwgYXJyaXZlIGF0IDAuCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8UHJpbWl0aXZlPiB2YWx1ZXM7CisKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKCkKKyAgICAgICAgOiB0eXBlKEVNUFRZKSB7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKFQgbWluLCBUIG1heCwgVCBzdGVwID0gVChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA/IDAgOiAxKSkKKyAgICAgICAgOiB0eXBlKFJBTkdFKSwKKyAgICAgICAgICByYW5nZXttaW4sIG1heCwgc3RlcCwgKFQpMSwgKFQpMX0geyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoVCBtaW4sIFQgbWF4LCBUIG51bSwgVCBkZW4pIDoKKyAgICAgICAgdHlwZShSQU5HRSksCisgICAgICAgIHJhbmdle21pbiwgbWF4LCAoVCkwLCBudW0sIGRlbn0geyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoVCBtaW4sIFQgbWF4LCBUIHN0ZXAsIFQgbnVtLCBUIGRlbikKKyAgICAgICAgOiB0eXBlKFJBTkdFKSwKKyAgICAgICAgICByYW5nZXttaW4sIG1heCwgc3RlcCwgbnVtLCBkZW59IHsgfQorCisgICAgLy8vIFxkZXByZWNhdGVkCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKGJvb2wgZmxhZ3MsIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBsaXN0KQorICAgICAgICA6IHR5cGUoZmxhZ3MgPyBGTEFHUyA6IFZBTFVFUyksCisgICAgICAgICAgcmFuZ2V7KFQpMCwgKFQpMCwgKFQpMCwgKFQpMCwgKFQpMH0geworICAgICAgICBmb3IgKFQgdmFsdWUgOiBsaXN0KSB7CisgICAgICAgICAgICB2YWx1ZXMuZW1wbGFjZV9iYWNrKHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBcZGVwcmVjYXRlZAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhib29sIGZsYWdzLCBjb25zdCBzdGQ6OnZlY3RvcjxUPiYgbGlzdCkKKyAgICAgICAgOiB0eXBlKGZsYWdzID8gRkxBR1MgOiBWQUxVRVMpLAorICAgICAgICAgIHJhbmdleyhUKTAsIChUKTAsIChUKTAsIChUKTAsIChUKTB9IHsKKyAgICAgICAgZm9yKFQgdmFsdWUgOiBsaXN0KSB7CisgICAgICAgICAgICB2YWx1ZXMuZW1wbGFjZV9iYWNrKHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBcaW50ZXJuYWwKKyAgICAvLy8gXHRvZG86IGNyZWF0ZSBzZXBhcmF0ZSB2YWx1ZXMgdnMuIGZsYWdzIGluaXRpYWxpemVyIGFzIGZvciBmbGFncyB3ZSB3YW50CisgICAgLy8vIHRvIGxpc3QgYm90aCBhbGxvd2VkIGFuZCByZXF1aXJlZCBmbGFncworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XbnVsbC1kZXJlZmVyZW5jZSIKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBFPWRlY2x0eXBlKEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0ZvcigqKFQqKW51bGxwdHIpKT4KKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKGJvb2wgZmxhZ3MsIGNvbnN0IFQqKQorICAgICAgICA6IHR5cGUoZmxhZ3MgPyBGTEFHUyA6IFZBTFVFUyksCisgICAgICAgICAgcmFuZ2V7KFQpMCwgKFQpMCwgKFQpMCwgKFQpMCwgKFQpMH0geworICAgICAgICAgICAgICBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIG5hbWVkID0gQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKCooVCopbnVsbHB0cik7CisgICAgICAgIGlmIChmbGFncykgeworICAgICAgICAgICAgdmFsdWVzLmVtcGxhY2VfYmFjaygwKTsgLy8gbWluLW1hc2sgZGVmYXVsdHMgdG8gMAorICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVUeXBlICZpdGVtIDogbmFtZWQpeworICAgICAgICAgICAgdmFsdWVzLmVtcGxhY2VfYmFjayhpdGVtLnNlY29uZCk7CisgICAgICAgIH0KKyAgICB9Cit9OworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKworLyoqCisgKiBTdXBwb3J0ZWQgdmFsdWVzIGZvciBhIHNwZWNpZmljIGZpZWxkLgorICoKKyAqIFRoaXMgaXMgYSBwYWlyIG9mIHRoZSBmaWVsZCBzcGVjaWZpZXIgdG9nZXRoZXIgd2l0aCBhbiBvcHRpb25hbCBzdXBwb3J0ZWQgdmFsdWVzIG9iamVjdC4KKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgd2hlbiByZXBvcnRpbmcgcGFyYW1ldGVyIGNvbmZpZ3VyYXRpb24gZmFpbHVyZXMgYW5kIGNvbmZsaWN0cy4KKyAqLworc3RydWN0IEMyUGFyYW1GaWVsZFZhbHVlcyB7CisgICAgQzJQYXJhbUZpZWxkIHBhcmFtT3JGaWVsZDsgLy8vPCB0aGUgZmllbGQgb3IgcGFyYW1ldGVyCisgICAgLy8vIG9wdGlvbmFsIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoZSBmaWVsZCBpZiBwYXJhbU9yRmllbGQgc3BlY2lmaWVzIGFuIGFjdHVhbCBmaWVsZCB0aGF0IGlzCisgICAgLy8vIG51bWVyaWMgKG5vbiBzdHJ1Y3QsIGJsb2Igb3Igc3RyaW5nKS4gU3VwcG9ydGVkIHZhbHVlcyBmb3IgYXJyYXlzIChpbmNsdWRpbmcgc3RyaW5nIGFuZAorICAgIC8vLyBibG9icykgZGVzY3JpYmUgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGVhY2ggZWxlbWVudCAoY2hhcmFjdGVyIGZvciBzdHJpbmcsIGFuZCBieXRlcyBmb3IKKyAgICAvLy8gYmxvYnMpLiBJdCBpcyBvcHRpb25hbCBmb3IgcmVhZC1vbmx5IHN0cmluZ3MgYW5kIGJsb2JzLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiB2YWx1ZXM7CisKKyAgICAvLyBUaGlzIHN0cnVjdCBpcyBtZWFudCB0byBiZSBtb3ZlIGNvbnN0cnVjdGVkLgorICAgIEMyX0RFRkFVTFRfTU9WRShDMlBhcmFtRmllbGRWYWx1ZXMpOworCisgICAgLy8gQ29weSBjb25zdHJ1Y3Rvci9hc3NpZ25tZW50IGlzIGFsc28gcHJvdmlkZWQgYXMgdGhpcyBvYmplY3QgbWF5IGdldCBjb3BpZWQuCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzKGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlcyAmb3RoZXIpCisgICAgICAgIDogcGFyYW1PckZpZWxkKG90aGVyLnBhcmFtT3JGaWVsZCksCisgICAgICAgICAgdmFsdWVzKG90aGVyLnZhbHVlcyA/IHN0ZDo6bWFrZV91bmlxdWU8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4oKm90aGVyLnZhbHVlcykgOiBudWxscHRyKSB7IH0KKworICAgIEMyUGFyYW1GaWVsZFZhbHVlcyYgb3BlcmF0b3I9KGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlcyAmb3RoZXIpIHsKKyAgICAgICAgcGFyYW1PckZpZWxkID0gb3RoZXIucGFyYW1PckZpZWxkOworICAgICAgICB2YWx1ZXMgPSBvdGhlci52YWx1ZXMgPyBzdGQ6Om1ha2VfdW5pcXVlPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+KCpvdGhlci52YWx1ZXMpIDogbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHdpdGggbm8gdmFsdWVzLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlcyhjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtT3JGaWVsZF8pCisgICAgICAgIDogcGFyYW1PckZpZWxkKHBhcmFtT3JGaWVsZF8pIHsgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHdpdGggdmFsdWVzLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlcyhjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtT3JGaWVsZF8sIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlc18pCisgICAgICAgIDogcGFyYW1PckZpZWxkKHBhcmFtT3JGaWVsZF8pLAorICAgICAgICAgIHZhbHVlcyhzdGQ6Om1ha2VfdW5pcXVlPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+KHZhbHVlc18pKSB7IH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBmcm9tIGZpZWxkcy4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXMoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbU9yRmllbGRfLCBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gJiZ2YWx1ZXNfKQorICAgICAgICA6IHBhcmFtT3JGaWVsZChwYXJhbU9yRmllbGRfKSwKKyAgICAgICAgICB2YWx1ZXMoc3RkOjptb3ZlKHZhbHVlc18pKSB7IH0KK307CisKKy8vLyBAfQorCisvLyBpbmNsdWRlIGRlYnVnIGhlYWRlciBmb3IgQzJQYXJhbXMuaCBpZiBDMkRlYnVnLmggd2FzIGFscmVhZHkgaW5jbHVkZWQKKyNpZmRlZiBDMlVUSUxTX0RFQlVHX0hfCisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLXBhcmFtLmg+CisjZW5kaWYKKworI2VuZGlmICAvLyBDMlBBUkFNX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW1EZWYuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbURlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMzMyODMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW1EZWYuaApAQCAtMCwwICsxLDkzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKiBcZmlsZQorICogVGVtcGxhdGVzIHVzZWQgdG8gZGVjbGFyZSBwYXJhbWV0ZXJzLgorICovCisjaWZuZGVmIEMyUEFSQU1fREVGX0hfCisjZGVmaW5lIEMyUEFSQU1fREVGX0hfCisKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2luY2x1ZGUgPEMyUGFyYW0uaD4KKworLy8vIFxhZGR0b2dyb3VwIFBhcmFtZXRlcnMKKy8vLyBAeworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT0gVVRJTElUWSBURU1QTEFURVMgRk9SIFBBUkFNRVRFUiBERUZJTklUSU9OUyA9PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLy8vIFxhZGR0b2dyb3VwIGludGVybmFsCisvLy8gQHsKKworLy8vIEhlbHBlciBjbGFzcyB0aGF0IGNoZWNrcyBpZiBhIHR5cGUgaGFzIGVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IG9wZXJhdG9ycy4KK3N0cnVjdCBDMl9ISURFIF9DMkNvbXBhcmFibGVfaW1wbAoreworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lPWRlY2x0eXBlKFMoKSA9PSBTKCkpPgorICAgIHN0YXRpYyBzdGQ6OnRydWVfdHlwZSBUZXN0RXF1YWwoaW50KTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdGF0aWMgc3RkOjpmYWxzZV90eXBlIFRlc3RFcXVhbCguLi4pOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWU9ZGVjbHR5cGUoUygpICE9IFMoKSk+CisgICAgc3RhdGljIHN0ZDo6dHJ1ZV90eXBlIFRlc3ROb3RFcXVhbChpbnQpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgVGVzdE5vdEVxdWFsKC4uLik7Cit9OworCisvKioKKyAqIEhlbHBlciB0ZW1wbGF0ZSB0aGF0IHJldHVybnMgaWYgYSB0eXBlIGhhcyBlcXVhbGl0eSBhbmQgaW5lcXVhbGl0eSBvcGVyYXRvcnMuCisgKgorICogVXNlIGFzIF9DMkNvbXBhcmFibGU8dHlwZW5hbWUgUz46OnZhbHVlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorc3RydWN0IEMyX0hJREUgX0MyQ29tcGFyYWJsZQorICAgIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgZGVjbHR5cGUoX0MyQ29tcGFyYWJsZV9pbXBsOjpUZXN0RXF1YWw8Uz4oMCkpOjp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGVjbHR5cGUoX0MyQ29tcGFyYWJsZV9pbXBsOjpUZXN0Tm90RXF1YWw8Uz4oMCkpOjp2YWx1ZT4geworfTsKKworLy8vICBIZWxwZXIgY2xhc3MgdGhhdCBjaGVja3MgaWYgYSB0eXBlIGhhcyBhIENPUkVfSU5ERVggY29uc3RhbnQuCitzdHJ1Y3QgQzJfSElERSBfQzJDb3JlSW5kZXhIZWxwZXJfaW1wbAoreworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIGludD1TOjpDT1JFX0lOREVYPgorICAgIHN0YXRpYyBzdGQ6OnRydWVfdHlwZSBUZXN0Q29yZUluZGV4KGludCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RhdGljIHN0ZDo6ZmFsc2VfdHlwZSBUZXN0Q29yZUluZGV4KC4uLik7Cit9OworCisvLy8gTWFjcm8gdGhhdCBkZWZpbmVzIGFuZCB0aHVzIG92ZXJyaWRlcyBhIHR5cGUncyBDT1JFX0lOREVYIGZvciBhIHNldHRpbmcKKyNkZWZpbmUgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoY29yZUluZGV4KSBcCitwdWJsaWM6IFwKKyAgICBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0gY29yZUluZGV4IH07CisKKworLy8vIEhlbHBlciB0ZW1wbGF0ZSB0aGF0IGFkZHMgYSBDT1JFX0lOREVYIHRvIGEgdHlwZSBpZiBpdCBkb2VzIG5vdCBoYXZlIG9uZSAoZm9yIHRlc3RpbmcpCit0ZW1wbGF0ZTx0eXBlbmFtZSBTLCBpbnQgQ29yZUluZGV4Pgorc3RydWN0IEMyX0hJREUgX0MyQWRkQ29yZUluZGV4IDogcHVibGljIFMgeworICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKENvcmVJbmRleCkKK307CisKKy8qKgorICogXGJyaWVmIEhlbHBlciBjbGFzcyB0byBjaGVjayBzdHJ1Y3QgcmVxdWlyZW1lbnRzIGZvciBwYXJhbWV0ZXJzLgorICoKKyAqIEZlYXR1cmVzOgorICogIC0gdmVyaWZ5IGRlZmF1bHQgY29uc3RydWN0b3IsIG5vIHZpcnR1YWwgbWV0aG9kcywgYW5kIG5vIGVxdWFsaXR5IG9wZXJhdG9ycy4KKyAqICAtIGV4cG9zZSBQQVJBTV9UWVBFLCBhbmQgbm9uLWZsZXggRkxFWF9TSVpFLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTLCBpbnQgQ29yZUluZGV4LCB1bnNpZ25lZCBUeXBlRmxhZ3M+CitzdHJ1Y3QgQzJfSElERSBfQzJTdHJ1Y3RDaGVjayB7CisgICAgc3RhdGljX2Fzc2VydCgKKyAgICAgICAgICAgIHN0ZDo6aXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPFM+Ojp2YWx1ZSwgIkMyIHN0cnVjdHVyZSBtdXN0IGhhdmUgZGVmYXVsdCBjb25zdHJ1Y3RvciIpOworICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfcG9seW1vcnBoaWM8Uz46OnZhbHVlLCAiQzIgc3RydWN0dXJlIG11c3Qgbm90IGhhdmUgdmlydHVhbCBtZXRob2RzIik7CisgICAgc3RhdGljX2Fzc2VydCghX0MyQ29tcGFyYWJsZTxTPjo6dmFsdWUsICJDMiBzdHJ1Y3R1cmUgbXVzdCBub3QgaGF2ZSBvcGVyYXRvcj09IG9yICE9Iik7CisKK3B1YmxpYzoKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICBQQVJBTV9UWVBFID0gQ29yZUluZGV4IHwgVHlwZUZsYWdzCisgICAgfTsKKworcHJvdGVjdGVkOgorICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgIEZMRVhfU0laRSA9IDAsCisgICAgfTsKK307CisKKy8vLyBIZWxwZXIgY2xhc3MgdGhhdCBjaGVja3MgaWYgYSB0eXBlIGhhcyBhbiBpbnRlZ2VyIEZMRVhfU0laRSBtZW1iZXIuCitzdHJ1Y3QgQzJfSElERSBfQzJGbGV4aWJsZV9pbXBsIHsKKyAgICAvLy8gc3BlY2lhbGl6YXRpb24gZm9yIHR5cGVzIHRoYXQgaGF2ZSBhIEZMRVhfU0laRSBtZW1iZXIKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB1bnNpZ25lZD1TOjpGTEVYX1NJWkU+CisgICAgc3RhdGljIHN0ZDo6dHJ1ZV90eXBlIFRlc3RGbGV4U2l6ZShpbnQpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgVGVzdEZsZXhTaXplKC4uLik7Cit9OworCisvLy8gSGVscGVyIHRlbXBsYXRlIHRoYXQgcmV0dXJucyBpZiBhIHR5cGUgaGFzIGFuIGludGVnZXIgRkxFWF9TSVpFIG1lbWJlci4KK3RlbXBsYXRlPHR5cGVuYW1lIFM+CitzdHJ1Y3QgQzJfSElERSBfQzJGbGV4aWJsZQorICAgIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgZGVjbHR5cGUoX0MyRmxleGlibGVfaW1wbDo6VGVzdEZsZXhTaXplPFM+KDApKTo6dmFsdWU+IHsKK307CisKKy8vLyBNYWNybyB0byB0ZXN0IGlmIGEgdHlwZSBpcyBmbGV4aWJsZSAoaGFzIGEgRkxFWF9TSVpFIG1lbWJlcikuCisjZGVmaW5lIElGX0ZMRVhJQkxFKFMpIEVOQUJMRV9JRihfQzJGbGV4aWJsZTxTPjo6dmFsdWUpCisvLy8gU2hvcnRoYW5kIGZvciBzdGQ6OmVuYWJsZV9pZgorI2RlZmluZSBFTkFCTEVfSUYoY29uZCkgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8Y29uZD46OnR5cGUKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVj12b2lkPgorc3RydWN0IEMyX0hJREUgX2MyX2VuYWJsZV9pZl90eXBlIHsKKyAgICB0eXBlZGVmIFYgdHlwZTsKK307CisKKy8vLyBIZWxwZXIgdGVtcGxhdGUgdGhhdCBleHBvc2VzIHRoZSBmbGV4aWJsZSBzdWJ0eXBlIG9mIGEgc3RydWN0LgordGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWUgRT12b2lkPgorc3RydWN0IEMyX0hJREUgX0MyRmxleEhlbHBlciB7CisgICAgdHlwZWRlZiB2b2lkIEZsZXhUeXBlOworICAgIGVudW0gOiB1aW50MzJfdCB7IEZMRVhfU0laRSA9IDAgfTsKK307CisKKy8vLyBTcGVjaWFsaXphdGlvbiBmb3IgZmxleGlibGUgdHlwZXMuIFRoaXMgb25seSB3b3JrcyBpZiBfRmxleE1lbWJlclR5cGUgaXMgcHVibGljLgordGVtcGxhdGU8dHlwZW5hbWUgUz4KK3N0cnVjdCBDMl9ISURFIF9DMkZsZXhIZWxwZXI8UywKKyAgICAgICAgdHlwZW5hbWUgX2MyX2VuYWJsZV9pZl90eXBlPHR5cGVuYW1lIFM6Ol9GbGV4TWVtYmVyVHlwZT46OnR5cGU+IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZsZXhIZWxwZXI8dHlwZW5hbWUgUzo6X0ZsZXhNZW1iZXJUeXBlPjo6RmxleFR5cGUgRmxleFR5cGU7CisgICAgZW51bSA6IHVpbnQzMl90IHsgRkxFWF9TSVpFID0gX0MyRmxleEhlbHBlcjx0eXBlbmFtZSBTOjpfRmxleE1lbWJlclR5cGU+OjpGTEVYX1NJWkUgfTsKK307CisKKy8vLyBTcGVjaWFsaXphdGlvbiBmb3IgZmxleCBhcnJheXMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorc3RydWN0IEMyX0hJREUgX0MyRmxleEhlbHBlcjxTW10sCisgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfdm9pZDx0eXBlbmFtZSBfQzJGbGV4SGVscGVyPFM+OjpGbGV4VHlwZT46OnZhbHVlPjo6dHlwZT4geworICAgIHR5cGVkZWYgUyBGbGV4VHlwZTsKKyAgICBlbnVtIDogdWludDMyX3QgeyBGTEVYX1NJWkUgPSBzaXplb2YoUykgfTsKK307CisKKy8qKgorICogXGJyaWVmIEhlbHBlciBjbGFzcyB0byBjaGVjayBmbGV4aWJsZSBzdHJ1Y3QgcmVxdWlyZW1lbnRzIGFuZCBhZGQgY29tbW9uIG9wZXJhdGlvbnMuCisgKgorICogRmVhdHVyZXM6CisgKiAgLSBleHBvc2UgQ09SRV9JTkRFWCBhbmQgRmllbGRMaXN0ICh0aGlzIGlzIG5vcm1hbGx5IGluaGVyaXRlZCBmcm9tIHRoZSBzdHJ1Y3QsIGJ1dCBmbGV4aWJsZQorICogICAgc3RydWN0cyBjYW5ub3QgYmUgYmFzZSBjbGFzc2VzIGFuZCB0aHVzIGluaGVyaXRlZCBmcm9tKQorICogIC0gZGlzYWJsZSBjb3B5IGFzc2lnbm1lbnQgYW5kIGNvbnN0cnVjdGlvbiAoVE9ETzogdGhpcyBpcyBhbHJlYWR5IGRvbmUgaW4gdGhlIEZMRVggbWFjcm8gZm9yIHRoZQorICogICAgZmxleGlibGUgc3RydWN0LCBzbyBtYXkgbm90IGJlIG5lZWRlZCBoZXJlKQorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleCwgdW5zaWduZWQgVHlwZUZsYWdzPgorc3RydWN0IEMyX0hJREUgX0MyRmxleFN0cnVjdENoZWNrIDoKKy8vIGFkZCBmbGV4aWJsZSBmbGFnIGFzIF9DMlN0cnVjdENoZWNrIGRlZmluZXMgUEFSQU1fVFlQRQorICAgICAgICBwdWJsaWMgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHLCBUeXBlRmxhZ3M+IHsKK3B1YmxpYzoKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICAvLy8gXGhpZGVpbml0aWFsaXplcgorICAgICAgICBDT1JFX0lOREVYID0gUGFyYW1JbmRleCB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHLCAvLy88IGZsZXhpYmxlIHN0cnVjdCBjb3JlLWluZGV4CisgICAgfTsKKworICAgIGlubGluZSBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpIHsgcmV0dXJuIFM6OkZpZWxkTGlzdCgpOyB9CisKKyAgICAvLyBkZWZhdWx0IGNvbnN0cnVjdG9yIG5lZWRlZCBiZWNhdXNlIG9mIHRoZSBkaXNhYmxlZCBjb3B5IGNvbnN0cnVjdG9yCisgICAgaW5saW5lIF9DMkZsZXhTdHJ1Y3RDaGVjaygpID0gZGVmYXVsdDsKKworcHJvdGVjdGVkOgorICAgIC8vIGNhbm5vdCBjb3B5IGZsZXhpYmxlIHBhcmFtcworICAgIF9DMkZsZXhTdHJ1Y3RDaGVjayhjb25zdCBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVHlwZUZsYWdzPiAmKSA9IGRlbGV0ZTsKKyAgICBfQzJGbGV4U3RydWN0Q2hlY2smIG9wZXJhdG9yPSAoY29uc3QgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFR5cGVGbGFncz4gJikgPSBkZWxldGU7CisKKyAgICAvLyBjb25zdGFudHMgdXNlZCBmb3IgaGVscGVyIG1ldGhvZHMKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICAvLy8gXGhpZGVpbml0aWFsaXplcgorICAgICAgICBGTEVYX1NJWkUgPSBfQzJGbGV4SGVscGVyPFM+OjpGTEVYX1NJWkUsIC8vLzwgc2l6ZSBvZiBmbGV4aWJsZSB0eXBlCisgICAgICAgIC8vLyBcaGlkZWluaXRpYWxpemVyCisgICAgICAgIE1BWF9TSVpFID0gKHVpbnQzMl90KXN0ZDo6bWluKChzaXplX3QpVUlOVDMyX01BWCwgU0laRV9NQVgpLCAvLyBUT0RPOiBpcyB0aGlzIGFsd2F5cyB1MzIgbWF4PworICAgICAgICAvLy8gXGhpZGVpbml0aWFsaXplcgorICAgICAgICBCQVNFX1NJWkUgPSBzaXplb2YoUykgKyBzaXplb2YoQzJQYXJhbSksIC8vLzwgc2l6ZSBvZiB0aGUgYmFzZSBwYXJhbQorICAgIH07CisKKyAgICAvLy8gcmV0dXJucyB0aGUgYWxsb2NhdGVkIHNpemUgb2YgdGhpcyBwYXJhbSB3aXRoIGZsZXhDb3VudCwgb3IgMCBpZiBpdCB3b3VsZCBvdmVyZmxvdy4KKyAgICBpbmxpbmUgc3RhdGljIHNpemVfdCBDYWxjU2l6ZShzaXplX3QgZmxleENvdW50LCBzaXplX3Qgc2l6ZSA9IEJBU0VfU0laRSkgeworICAgICAgICBpZiAoZmxleENvdW50IDw9IChNQVhfU0laRSAtIHNpemUpIC8gUzo6RkxFWF9TSVpFKSB7CisgICAgICAgICAgICByZXR1cm4gc2l6ZSArIFM6OkZMRVhfU0laRSAqIGZsZXhDb3VudDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLy8gZHluYW1pYyBuZXcgb3BlcmF0b3IgdXNhYmxlIGZvciBwYXJhbXMgb2YgdHlwZSBTCisgICAgaW5saW5lIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSwgc2l6ZV90IGZsZXhDb3VudCkgbm9leGNlcHQgeworICAgICAgICAvLyBUT0RPOiBhc3NlcnQoc2l6ZSA9PSBCQVNFX1NJWkUpOworICAgICAgICBzaXplID0gQ2FsY1NpemUoZmxleENvdW50LCBzaXplKTsKKyAgICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gOjpvcGVyYXRvciBuZXcoc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfTsKKworLy8vIERlZmluZSBGcm9tKCkgY2FzdCBvcGVyYXRvcnMgZm9yIHBhcmFtcy4KKyNkZWZpbmUgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKSBcCisgICAgaW5saW5lIHN0YXRpYyBfVHlwZSogRnJvbShDMlBhcmFtICpvdGhlcikgeyBcCisgICAgICAgIHJldHVybiAoX1R5cGUqKUMyUGFyYW06OklmU3VpdGFibGUoIFwKKyAgICAgICAgICAgICAgICBvdGhlciwgc2l6ZW9mKF9UeXBlKSwgX1R5cGU6OlBBUkFNX1RZUEUsIF9UeXBlOjpGTEVYX1NJWkUsIFwKKyAgICAgICAgICAgICAgICAoX1R5cGU6OlBBUkFNX1RZUEUgJiBUOjpJbmRleDo6RElSX1VOREVGSU5FRCkgIT0gVDo6SW5kZXg6OkRJUl9VTkRFRklORUQpOyBcCisgICAgfSBcCisgICAgaW5saW5lIHN0YXRpYyBjb25zdCBfVHlwZSogRnJvbShjb25zdCBDMlBhcmFtICpvdGhlcikgeyBcCisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PGNvbnN0IF9UeXBlKj4oRnJvbShjb25zdF9jYXN0PEMyUGFyYW0gKj4ob3RoZXIpKSk7IFwKKyAgICB9IFwKKyAgICBpbmxpbmUgc3RhdGljIF9UeXBlKiBGcm9tKHN0ZDo6bnVsbHB0cl90KSB7IHJldHVybiBudWxscHRyOyB9IFwKKworLyoqCisgKiBEZWZpbmUgZmxleGlibGUgYWxsb2NhdG9ycyAoQWxsb2NTaGFyZWQgb3IgQWxsb2NVbmlxdWUpIGZvciBmbGV4aWJsZSBwYXJhbXMuCisgKiAgLSBQOjpBbGxvY1h5eihmbGV4Q291bnQsIGFyZ3MuLi4pOiBhbGxvY2F0ZSBmb3IgZ2l2ZW4gZmxleC1jb3VudC4gVGhpcyBtYXBzIHRvCisgKiAgICAgICAgICBUKGZsZXhDb3VudCwgYXJncy4uLilcCisgKgorICogQ2xhbmcgZG9lcyBub3Qgc3VwcG9ydCBhcmdzLi4uIGZvbGxvd2VkIGJ5IHRlbXBsYXRlZCBwYXJhbSBhcyBhcmdzLi4uIGVhdHMgaXQuIEhlbmNlLAorICogcHJvdmlkZSBzcGVjaWFsaXphdGlvbnMgd2hlcmUgdGhlIGluaXRpYWxpemVyIHJlcGxhY2VzIHRoZSBmbGV4Q291bnQuCisgKgorICogU3BlY2lhbGl6YXRpb25zIHRoYXQgZGVkdWNlIGZsZXhDb3VudDoKKyAqICAtIFA6OkFsbG9jWHl6KFRbXSwgYXJncy4uLik6IGFsbG9jYXRlIGZvciBzaXplIG9mIChhbmQgd2l0aCkgaW5pdCBhcnJheS4KKyAqICAtIFA6OkFsbG9jWHl6KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiwgYXJncy4uLik6IGFsbG9jYXRlIGZvciBzaXplIG9mIChhbmQgd2l0aCkgaW5pdGlhbGl6ZXIKKyAqICAgICAgICAgICAgbGlzdC4KKyAqICAtIFA6OkFsbG9jWHl6KHN0ZDo6dmVjdG9yPFQ+LCBhcmdzLi4uKTogYWxsb2NhdGUgZm9yIHNpemUgb2YgKGFuZCB3aXRoKSBpbml0IHZlY3Rvci4KKyAqICBUaGVzZSBzcGVjaWFsaXphdGlvbnMgbWFwIHRvIFQoZmxleENvdW50ID0gc2l6ZS1vZi1pbml0LCBhcmdzLi4uLCBpbml0KQorICovCisjZGVmaW5lIERFRklORV9GTEVYSUJMRV9BTExPQyhfVHlwZSwgUywgcHRyLCBQdHIpIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPiBcCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4gQWxsb2MjI1B0cihzaXplX3QgZmxleENvdW50LCBjb25zdCBBcmdzKCYuLi4gYXJncykpIHsgXAorICAgICAgICByZXR1cm4gc3RkOjpwdHIjI19wdHI8X1R5cGU+KG5ldyhmbGV4Q291bnQpIF9UeXBlKGZsZXhDb3VudCwgYXJncy4uLikpOyBcCisgICAgfSBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncywgdHlwZW5hbWUgVT10eXBlbmFtZSBTOjpGbGV4VHlwZT4gXAorICAgIGlubGluZSBzdGF0aWMgc3RkOjpwdHIjI19wdHI8X1R5cGU+IEFsbG9jIyNQdHIoIFwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxVPiAmaW5pdCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKSB7IFwKKyAgICAgICAgcmV0dXJuIHN0ZDo6cHRyIyNfcHRyPF9UeXBlPihuZXcoaW5pdC5zaXplKCkpIF9UeXBlKGluaXQuc2l6ZSgpLCBhcmdzLi4uLCBpbml0KSk7IFwKKyAgICB9IFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzLCB0eXBlbmFtZSBVPXR5cGVuYW1lIFM6OkZsZXhUeXBlPiBcCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4gQWxsb2MjI1B0ciggXAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VT4gJmluaXQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgeyBcCisgICAgICAgIHJldHVybiBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4obmV3KGluaXQuc2l6ZSgpKSBfVHlwZShpbml0LnNpemUoKSwgYXJncy4uLiwgaW5pdCkpOyBcCisgICAgfSBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncywgdHlwZW5hbWUgVT10eXBlbmFtZSBTOjpGbGV4VHlwZSwgdW5zaWduZWQgTj4gXAorICAgIGlubGluZSBzdGF0aWMgc3RkOjpwdHIjI19wdHI8X1R5cGU+IEFsbG9jIyNQdHIoY29uc3QgVSgmaW5pdClbTl0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgeyBcCisgICAgICAgIHJldHVybiBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4obmV3KE4pIF9UeXBlKE4sIGFyZ3MuLi4sIGluaXQpKTsgXAorICAgIH0gXAorCisvKioKKyAqIERlZmluZSBmbGV4aWJsZSBtZXRob2RzIEFsbG9jU2hhcmVkLCBBbGxvY1VuaXF1ZSBhbmQgZmxleENvdW50LgorICovCisjZGVmaW5lIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKF9UeXBlLCBTKSBcCisgICAgREVGSU5FX0ZMRVhJQkxFX0FMTE9DKF9UeXBlLCBTLCBzaGFyZWQsIFNoYXJlZCkgXAorICAgIERFRklORV9GTEVYSUJMRV9BTExPQyhfVHlwZSwgUywgdW5pcXVlLCBVbmlxdWUpIFwKKyAgICBpbmxpbmUgc2l6ZV90IGZsZXhDb3VudCgpIGNvbnN0IHsgXAorICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihfVHlwZSkgPT0gX1R5cGU6OkJBU0VfU0laRSwgImluY29ycmVjdCBCQVNFX1NJWkUiKTsgXAorICAgICAgICBzaXplX3Qgc3ogPSB0aGlzLT5zaXplKCk7IFwKKyAgICAgICAgaWYgKHN6ID49IHNpemVvZihfVHlwZSkpIHsgXAorICAgICAgICAgICAgcmV0dXJuIChzeiAtIHNpemVvZihfVHlwZSkpIC8gX1R5cGU6OkZMRVhfU0laRTsgXAorICAgICAgICB9IFwKKyAgICAgICAgcmV0dXJuIDA7IFwKKyAgICB9IFwKKworLy8vIE1hcmsgZmxleGlibGUgbWVtYmVyIHZhcmlhYmxlIGFuZCBtYWtlIHN0cnVjdHVyZSBmbGV4aWJsZS4KKyNkZWZpbmUgRkxFWChjbHMsIG0pIFwKKyAgICBDMl9ET19OT1RfQ09QWShjbHMpIFwKK3ByaXZhdGU6IFwKKyAgICBDMlBBUkFNX01BS0VfRlJJRU5EUyBcCisgICAgLyoqIFxpZiAwICovIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGZyaWVuZCBzdHJ1Y3QgX0MyRmxleEhlbHBlcjsgXAorcHVibGljOiBcCisgICAgdHlwZWRlZiBkZWNsdHlwZShtKSBfRmxleE1lbWJlclR5cGU7IFwKKyAgICAvKiBkZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGggZmxleENvdW50ICovIFwKKyAgICBpbmxpbmUgY2xzKHNpemVfdCkgOiBjbHMoKSB7fSBcCisgICAgLyogY29uc3RleHByIHN0YXRpYyBfRmxleE1lbWJlclR5cGUgY2xzOjoqIGZsZXhNZW1iZXIgPSAmY2xzOjptOyAqLyBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGbGV4SGVscGVyPF9GbGV4TWVtYmVyVHlwZT46OkZsZXhUeXBlIEZsZXhUeXBlOyBcCisgICAgc3RhdGljX2Fzc2VydChcCisgICAgICAgICAgICAhc3RkOjppc192b2lkPEZsZXhUeXBlPjo6dmFsdWUsIFwKKyAgICAgICAgICAgICJtZW1iZXIgaXMgbm90IGZsZXhpYmxlLCBvciBhIGZsZXhpYmxlIGFycmF5IG9mIGEgZmxleGlibGUgdHlwZSIpOyBcCisgICAgZW51bSA6IHVpbnQzMl90IHsgRkxFWF9TSVpFID0gX0MyRmxleEhlbHBlcjxfRmxleE1lbWJlclR5cGU+OjpGTEVYX1NJWkUgfTsgXAorICAgIC8qKiBcZW5kaWYgKi8gXAorCisvLy8gQH0KKworLyoqCisgKiBHbG9iYWwtcGFyYW1ldGVyIHRlbXBsYXRlLgorICoKKyAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgZ2xvYmFsIHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBzdHJ1Y3R1cmUgYW5kCisgKiBhbiBvcHRpb25hbCBQYXJhbUluZGV4LiBHbG9iYWwgcGFyYW1ldGVycyBhcmUgbm90IHRpZWQgdG8gYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgb2YgdGhlIHdyYXBwZWQKKyAqIHN0cnVjdHVyZSBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHksIGFuZCBjb25zdHJ1Y3RvcnMgYW5kIHBvdGVudGlhbCBwdWJsaWMgbWV0aG9kcyBhcmUgYWxzbworICogd3JhcHBlZC4KKyAqCisgKiBcdHBhcmFtIFQgcGFyYW0gdHlwZSBDMlNldHRpbmcsIEMyVHVuaW5nIG9yIEMySW5mbworICogXHRwYXJhbSBTIHdyYXBwZWQgc3RydWN0dXJlCisgKiBcdHBhcmFtIFBhcmFtSW5kZXggb3B0aW9uYWwgcGFyYW1ldGVyIGluZGV4IG92ZXJyaWRlLiBNdXN0IGJlIHNwZWNpZmllZCBmb3IgYmFzZS9yZXVzZWQKKyAqIHN0cnVjdHVyZXMuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBQYXJhbUluZGV4PVM6OkNPUkVfSU5ERVgsIGNsYXNzIEZsZXg9dm9pZD4KK3N0cnVjdCBDMl9ISURFIEMyR2xvYmFsUGFyYW0gOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgIHB1YmxpYyBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6VHlwZTo6RElSX0dMT0JBTD4geworICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCitwcml2YXRlOgorICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKworcHVibGljOgorICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMyR2xvYmFsUGFyYW0oY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IFQoc2l6ZW9mKF9UeXBlKSwgX1R5cGU6OlBBUkFNX1RZUEUpLCBTKGFyZ3MuLi4pIHsgfQorCisgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKQorfTsKKworLyoqCisgKiBHbG9iYWwtcGFyYW1ldGVyIHRlbXBsYXRlIGZvciBmbGV4aWJsZSBzdHJ1Y3R1cmVzLgorICoKKyAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgZ2xvYmFsIHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgYW5kCisgKiBhbiBvcHRpb25hbCBQYXJhbUluZGV4LiBHbG9iYWwgcGFyYW1ldGVycyBhcmUgbm90IHRpZWQgdG8gYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpLgorICoKKyAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCisgKiBcdHBhcmFtIFMgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKyAqIFx0cGFyYW0gUGFyYW1JbmRleCBvcHRpb25hbCBwYXJhbWV0ZXIgaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBiYXNlL3JldXNlZAorICogICAgICAgICBzdHJ1Y3R1cmVzLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgb2YgZmxleGlibGUKKyAqIHN0cnVjdHVyZXMgY2FuIGJlIGFjY2Vzc2VkIHZpYSB0aGUgbSBtZW1iZXIgdmFyaWFibGU7IGhvd2V2ZXIsIHRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhlIHN0cnVjdHVyZQorICogYXJlIHdyYXBwZWQgZGlyZWN0bHkuIChUaGlzIGlzIGJlY2F1c2UgZmxleGlibGUgdHlwZXMgY2Fubm90IGJlIHN1YmNsYXNzZWQuKQorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleD4KK3N0cnVjdCBDMl9ISURFIEMyR2xvYmFsUGFyYW08VCwgUywgUGFyYW1JbmRleCwgSUZfRkxFWElCTEUoUyk+CisgICAgOiBwdWJsaWMgVCwgcHVibGljIF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6VHlwZTo6RElSX0dMT0JBTD4geworcHJpdmF0ZToKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08VCwgUywgUGFyYW1JbmRleD4gX1R5cGU7CisKKyAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3Rvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGlubGluZSBDMkdsb2JhbFBhcmFtKHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBfVHlwZTo6UEFSQU1fVFlQRSksIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KKworcHVibGljOgorICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMoX1R5cGUsIFMpCisgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKQorfTsKKworLyoqCisgKiBQb3J0LXBhcmFtZXRlciB0ZW1wbGF0ZS4KKyAqCisgKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIHBvcnQgc2V0dGluZy90dW5pbmcgb3IgaW5mbyBiYXNlZCBvbiBhIHN0cnVjdHVyZSBhbmQKKyAqIGFuIG9wdGlvbmFsIFBhcmFtSW5kZXguIFBvcnQgcGFyYW1ldGVycyBhcmUgdGllZCB0byBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCksIGJ1dCBub3QgdG8gYQorICogc3BlY2lmaWMgc3RyZWFtLgorICoKKyAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCisgKiBcdHBhcmFtIFMgd3JhcHBlZCBzdHJ1Y3R1cmUKKyAqIFx0cGFyYW0gUGFyYW1JbmRleCBvcHRpb25hbCBwYXJhbWV0ZXIgaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBiYXNlL3JldXNlZAorICogICAgICAgICBzdHJ1Y3R1cmVzLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgb2YgdGhlIHdyYXBwZWQKKyAqIHN0cnVjdHVyZSBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHksIGFuZCBjb25zdHJ1Y3RvcnMgYW5kIHBvdGVudGlhbCBwdWJsaWMgbWV0aG9kcyBhcmUgYWxzbworICogd3JhcHBlZC4KKyAqCisgKiBUaGVyZSBhcmUgMyBmbGF2b3JzIG9mIHBvcnQgcGFyYW1ldGVyczogdW5zcGVjaWZpZWQsIGlucHV0IGFuZCBvdXRwdXQuIFBhcmFtZXRlcnMgd2l0aAorICogdW5zcGVjaWZpZWQgcG9ydCBleHBvc2UgYSBzZXRQb3J0IG1ldGhvZCwgYW5kIGFkZCBhbiBpbml0aWFsIHBvcnQgcGFyYW1ldGVyIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXg9Uzo6Q09SRV9JTkRFWCwgY2xhc3MgRmxleD12b2lkPgorc3RydWN0IEMyX0hJREUgQzJQb3J0UGFyYW0gOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgIHByaXZhdGUgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpESVJfVU5ERUZJTkVEPiB7CisgICAgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoUGFyYW1JbmRleCkKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBDMlBvcnRQYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKworcHVibGljOgorICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIGlubGluZSBDMlBvcnRQYXJhbSgpIDogVChzaXplb2YoX1R5cGUpLCBfVHlwZTo6UEFSQU1fVFlQRSkgeyB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uLgorICAgIGlubGluZSBDMlBvcnRQYXJhbShib29sIF9vdXRwdXQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgOiBUKHNpemVvZihfVHlwZSksIF9vdXRwdXQgPyBvdXRwdXQ6OlBBUkFNX1RZUEUgOiBpbnB1dDo6UEFSQU1fVFlQRSksIFMoYXJncy4uLikgeyB9CisgICAgLy8vIFNldCBwb3J0L2RpcmVjdGlvbi4KKyAgICBpbmxpbmUgdm9pZCBzZXRQb3J0KGJvb2wgb3V0cHV0KSB7IEMyUGFyYW06OnNldFBvcnQob3V0cHV0KTsgfQorCisgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKQorCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBpbnB1dCBwb3J0IHBhcmFtZXRlci4KKyAgICBzdHJ1Y3QgaW5wdXQgOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgICAgICBwdWJsaWMgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpESVJfSU5QVVQ+IHsKKyAgICAgICAgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoUGFyYW1JbmRleCkKKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3IuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBpbnB1dChjb25zdCBBcmdzKCYuLi4gYXJncykpIDogVChzaXplb2YoX1R5cGUpLCBpbnB1dDo6UEFSQU1fVFlQRSksIFMoYXJncy4uLikgeyB9CisKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKGlucHV0KQorCisgICAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gb3V0cHV0IHBvcnQgcGFyYW1ldGVyLgorICAgIHN0cnVjdCBvdXRwdXQgOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgICAgICBwdWJsaWMgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpESVJfT1VUUFVUPiB7CisgICAgICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yLgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgb3V0cHV0KGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBUKHNpemVvZihfVHlwZSksIG91dHB1dDo6UEFSQU1fVFlQRSksIFMoYXJncy4uLikgeyB9CisKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKG91dHB1dCkKKyAgICB9OworfTsKKworLyoqCisgKiBQb3J0LXBhcmFtZXRlciB0ZW1wbGF0ZSBmb3IgZmxleGlibGUgc3RydWN0dXJlcy4KKyAqCisgKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIHBvcnQgc2V0dGluZy90dW5pbmcgb3IgaW5mbyBiYXNlZCBvbiBhIGZsZXhpYmxlIHN0cnVjdHVyZSBhbmQKKyAqIGFuIG9wdGlvbmFsIFBhcmFtSW5kZXguIFBvcnQgcGFyYW1ldGVycyBhcmUgdGllZCB0byBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCksIGJ1dCBub3QgdG8gYQorICogc3BlY2lmaWMgc3RyZWFtLgorICoKKyAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCisgKiBcdHBhcmFtIFMgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKyAqIFx0cGFyYW0gUGFyYW1JbmRleCBvcHRpb25hbCBwYXJhbWV0ZXIgaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBiYXNlL3JldXNlZAorICogICAgICAgICBzdHJ1Y3R1cmVzLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgb2YgZmxleGlibGUKKyAqIHN0cnVjdHVyZXMgY2FuIGJlIGFjY2Vzc2VkIHZpYSB0aGUgbSBtZW1iZXIgdmFyaWFibGU7IGhvd2V2ZXIsIHRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhlIHN0cnVjdHVyZQorICogYXJlIHdyYXBwZWQgZGlyZWN0bHkuIChUaGlzIGlzIGJlY2F1c2UgZmxleGlibGUgdHlwZXMgY2Fubm90IGJlIHN1YmNsYXNzZWQuKQorICoKKyAqIFRoZXJlIGFyZSAzIGZsYXZvcnMgb2YgcG9ydCBwYXJhbWV0ZXJzOiB1bnNwZWNpZmllZCwgaW5wdXQgYW5kIG91dHB1dC4gUGFyYW1ldGVycyB3aXRoCisgKiB1bnNwZWNpZmllZCBwb3J0IGV4cG9zZSBhIHNldFBvcnQgbWV0aG9kLCBhbmQgYWRkIGFuIGluaXRpYWwgcG9ydCBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleD4KK3N0cnVjdCBDMl9ISURFIEMyUG9ydFBhcmFtPFQsIFMsIFBhcmFtSW5kZXgsIElGX0ZMRVhJQkxFKFMpPgorICAgIDogcHVibGljIFQsIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OlR5cGU6OkRJUl9VTkRFRklORUQ+IHsKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBDMlBvcnRQYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKworICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yIGZvciBiYXNpYyBhbGxvY2F0aW9uOiBuZXcoZmxleENvdW50KSBQLgorICAgIGlubGluZSBDMlBvcnRQYXJhbShzaXplX3QgZmxleENvdW50KSA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIF9UeXBlOjpQQVJBTV9UWVBFKSB7IH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbi4KKyAgICBpbmxpbmUgQzJQb3J0UGFyYW0oc2l6ZV90IGZsZXhDb3VudCwgYm9vbCBfb3V0cHV0LCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgX291dHB1dCA/IG91dHB1dDo6UEFSQU1fVFlQRSA6IGlucHV0OjpQQVJBTV9UWVBFKSwKKyAgICAgICAgICBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKK3B1YmxpYzoKKyAgICAvLy8gU2V0IHBvcnQvZGlyZWN0aW9uLgorICAgIGlubGluZSB2b2lkIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsgQzJQYXJhbTo6c2V0UG9ydChvdXRwdXQpOyB9CisKKyAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKworICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKF9UeXBlLCBTKQorICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfVHlwZSkKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gaW5wdXQgcG9ydCBwYXJhbWV0ZXIuCisgICAgc3RydWN0IGlucHV0IDogcHVibGljIFQsCisgICAgICAgICAgICBwdWJsaWMgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6RElSX0lOUFVUPiB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uLgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgaW5wdXQoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBpbnB1dDo6UEFSQU1fVFlQRSksIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KKworICAgIHB1YmxpYzoKKyAgICAgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisKKyAgICAgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMoaW5wdXQsIFMpCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhpbnB1dCkKKyAgICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBvdXRwdXQgcG9ydCBwYXJhbWV0ZXIuCisgICAgc3RydWN0IG91dHB1dCA6IHB1YmxpYyBULAorICAgICAgICAgICAgcHVibGljIF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OkRJUl9PVVRQVVQ+IHsKKyAgICBwcml2YXRlOgorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgcG9ydC9kaXJlY3Rpb24uCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBvdXRwdXQoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBvdXRwdXQ6OlBBUkFNX1RZUEUpLCBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKG91dHB1dCwgUykKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKG91dHB1dCkKKyAgICB9OworfTsKKworLyoqCisgKiBTdHJlYW0tcGFyYW1ldGVyIHRlbXBsYXRlLgorICoKKyAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgc3RyZWFtIHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBzdHJ1Y3R1cmUgYW5kCisgKiBhbiBvcHRpb25hbCBQYXJhbUluZGV4LiBTdHJlYW0gcGFyYW1ldGVycyBhcmUgdGllZCB0byBhIHNwZWNpZmljIHN0cmVhbSBvbiBhIHBvcnQgKGlucHV0IG9yCisgKiBvdXRwdXQpLgorICoKKyAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCisgKiBcdHBhcmFtIFMgd3JhcHBlZCBzdHJ1Y3R1cmUKKyAqIFx0cGFyYW0gUGFyYW1JbmRleCBvcHRpb25hbCBwYXJhbXRlciBpbmRleCBvdmVycmlkZS4gTXVzdCBiZSBzcGVjaWZpZWQgZm9yIGJhc2UvcmV1c2VkCisgKiAgICAgICAgIHN0cnVjdHVyZXMuCisgKgorICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBvZiB0aGUgd3JhcHBlZAorICogc3RydWN0dXJlIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSwgYW5kIGNvbnN0cnVjdG9ycyBhbmQgcG90ZW50aWFsIHB1YmxpYyBtZXRob2RzIGFyZSBhbHNvCisgKiB3cmFwcGVkLgorICoKKyAqIFRoZXJlIGFyZSAzIGZsYXZvcnMgb2Ygc3RyZWFtIHBhcmFtZXRlcnM6IHVuc3BlY2lmaWVkIHBvcnQsIGlucHV0IGFuZCBvdXRwdXQuIEFsbCBvZiB0aGVzZSBleHBvc2UKKyAqIGEgc2V0U3RyZWFtIG1ldGhvZCBhbmQgYW4gZXh0cmEgaW5pdGlhbCBzdHJlYW1JRCBwYXJhbWV0ZXIgZm9yIHRoZSBjb25zdHJ1Y3Rvci4gTW9yZW92ZXIsCisgKiBwYXJhbWV0ZXJzIHdpdGggdW5zcGVjaWZpZWQgcG9ydCBleHBvc2UgYSBzZXRQb3J0IG1ldGhvZCwgYW5kIGFkZCBhbiBhZGRpdGlvbmFsIGluaXRpYWwgcG9ydAorICogcGFyYW1ldGVyIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXg9Uzo6Q09SRV9JTkRFWCwgY2xhc3MgRmxleD12b2lkPgorc3RydWN0IEMyX0hJREUgQzJTdHJlYW1QYXJhbSA6IHB1YmxpYyBULCBwdWJsaWMgUywKKyAgICAgICAgcHJpdmF0ZSBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LAorICAgICAgICAgICAgICAgIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6SVNfU1RSRUFNX0ZMQUcgfCBUOjpJbmRleDo6RElSX1VOREVGSU5FRD4geworICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCitwcml2YXRlOgorICAgIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKworcHVibGljOgorICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLiBQb3J0L2RpcmVjdGlvbiBhbmQgc3RyZWFtLUlEIGlzIHVuZGVmaW5lZC4KKyAgICBpbmxpbmUgQzJTdHJlYW1QYXJhbSgpIDogVChzaXplb2YoX1R5cGUpLCBfVHlwZTo6UEFSQU1fVFlQRSkgeyB9CisgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uIGFuZAorICAgIC8vLyBzdHJlYW0tSUQuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbmxpbmUgQzJTdHJlYW1QYXJhbShib29sIF9vdXRwdXQsIHVuc2lnbmVkIHN0cmVhbSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICA6IFQoc2l6ZW9mKF9UeXBlKSwgX291dHB1dCA/IG91dHB1dDo6UEFSQU1fVFlQRSA6IGlucHV0OjpQQVJBTV9UWVBFLCBzdHJlYW0pLAorICAgICAgICAgIFMoYXJncy4uLikgeyB9CisgICAgLy8vIFNldCBwb3J0L2RpcmVjdGlvbi4KKyAgICBpbmxpbmUgdm9pZCBzZXRQb3J0KGJvb2wgb3V0cHV0KSB7IEMyUGFyYW06OnNldFBvcnQob3V0cHV0KTsgfQorICAgIC8vLyBTZXQgc3RyZWFtLWlkLiBccmV0dmFsIHRydWUgaWYgdGhlIHN0cmVhbS1pZCB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7IHJldHVybiBDMlBhcmFtOjpzZXRTdHJlYW0oc3RyZWFtKTsgfQorCisgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKQorCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBpbnB1dCBzdHJlYW0gcGFyYW1ldGVyLgorICAgIHN0cnVjdCBpbnB1dCA6IHB1YmxpYyBULCBwdWJsaWMgUywKKyAgICAgICAgICAgIHB1YmxpYyBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LAorICAgICAgICAgICAgICAgICAgICBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OklTX1NUUkVBTV9GTEFHIHwgVDo6VHlwZTo6RElSX0lOUFVUPiB7CisgICAgICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCisKKyAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCisgICAgICAgIGlubGluZSBpbnB1dCgpIDogVChzaXplb2YoX1R5cGUpLCBpbnB1dDo6UEFSQU1fVFlQRSkgeyB9CisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBzdHJlYW0tSUQuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBpbnB1dCh1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgICAgIDogVChzaXplb2YoX1R5cGUpLCBpbnB1dDo6UEFSQU1fVFlQRSwgc3RyZWFtKSwgUyhhcmdzLi4uKSB7IH0KKyAgICAgICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgorICAgICAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7IHJldHVybiBDMlBhcmFtOjpzZXRTdHJlYW0oc3RyZWFtKTsgfQorCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhpbnB1dCkKKyAgICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBvdXRwdXQgc3RyZWFtIHBhcmFtZXRlci4KKyAgICBzdHJ1Y3Qgb3V0cHV0IDogcHVibGljIFQsIHB1YmxpYyBTLAorICAgICAgICAgICAgcHVibGljIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6SVNfU1RSRUFNX0ZMQUcgfCBUOjpUeXBlOjpESVJfT1VUUFVUPiB7CisgICAgICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCisKKyAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCisgICAgICAgIGlubGluZSBvdXRwdXQoKSA6IFQoc2l6ZW9mKF9UeXBlKSwgb3V0cHV0OjpQQVJBTV9UWVBFKSB7IH0KKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHN0cmVhbS1JRC4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAgICAgaW5saW5lIG91dHB1dCh1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgICAgIDogVChzaXplb2YoX1R5cGUpLCBvdXRwdXQ6OlBBUkFNX1RZUEUsIHN0cmVhbSksIFMoYXJncy4uLikgeyB9CisgICAgICAgIC8vLyBTZXQgc3RyZWFtLWlkLiBccmV0dmFsIHRydWUgaWYgdGhlIHN0cmVhbS1pZCB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeyByZXR1cm4gQzJQYXJhbTo6c2V0U3RyZWFtKHN0cmVhbSk7IH0KKworICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMob3V0cHV0KQorICAgIH07Cit9OworCisvKioKKyAqIFN0cmVhbS1wYXJhbWV0ZXIgdGVtcGxhdGUgZm9yIGZsZXhpYmxlIHN0cnVjdHVyZXMuCisgKgorICogQmFzZSB0ZW1wbGF0ZSB0byBkZWZpbmUgYSBzdHJlYW0gc2V0dGluZy90dW5pbmcgb3IgaW5mbyBiYXNlZCBvbiBhIGZsZXhpYmxlIHN0cnVjdHVyZSBhbmQKKyAqIGFuIG9wdGlvbmFsIFBhcmFtSW5kZXguIFN0cmVhbSBwYXJhbWV0ZXJzIGFyZSB0aWVkIHRvIGEgc3BlY2lmaWMgc3RyZWFtIG9uIGEgcG9ydCAoaW5wdXQgb3IKKyAqIG91dHB1dCkuCisgKgorICogXHRwYXJhbSBUIHBhcmFtIHR5cGUgQzJTZXR0aW5nLCBDMlR1bmluZyBvciBDMkluZm8KKyAqIFx0cGFyYW0gUyB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorICogXHRwYXJhbSBQYXJhbUluZGV4IG9wdGlvbmFsIHBhcmFtZXRlciBpbmRleCBvdmVycmlkZS4gTXVzdCBiZSBzcGVjaWZpZWQgZm9yIGJhc2UvcmV1c2VkCisgKiAgICAgICAgIHN0cnVjdHVyZXMuCisgKgorICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBvZiBmbGV4aWJsZQorICogc3RydWN0dXJlcyBjYW4gYmUgYWNjZXNzZWQgdmlhIHRoZSBtIG1lbWJlciB2YXJpYWJsZTsgaG93ZXZlciwgdGhlIGNvbnN0cnVjdG9ycyBvZiB0aGUgc3RydWN0dXJlCisgKiBhcmUgd3JhcHBlZCBkaXJlY3RseS4gKFRoaXMgaXMgYmVjYXVzZSBmbGV4aWJsZSB0eXBlcyBjYW5ub3QgYmUgc3ViY2xhc3NlZC4pCisgKgorICogVGhlcmUgYXJlIDMgZmxhdm9ycyBvZiBzdHJlYW0gcGFyYW1ldGVyczogdW5zcGVjaWZpZWQgcG9ydCwgaW5wdXQgYW5kIG91dHB1dC4gQWxsIG9mIHRoZXNlIGV4cG9zZQorICogYSBzZXRTdHJlYW0gbWV0aG9kIGFuZCBhbiBleHRyYSBpbml0aWFsIHN0cmVhbUlEIHBhcmFtZXRlciBmb3IgdGhlIGNvbnN0cnVjdG9yLiBNb3Jlb3ZlciwKKyAqIHBhcmFtZXRlcnMgd2l0aCB1bnNwZWNpZmllZCBwb3J0IGV4cG9zZSBhIHNldFBvcnQgbWV0aG9kLCBhbmQgYWRkIGFuIGFkZGl0aW9uYWwgaW5pdGlhbCBwb3J0CisgKiBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleD4KK3N0cnVjdCBDMl9ISURFIEMyU3RyZWFtUGFyYW08VCwgUywgUGFyYW1JbmRleCwgSUZfRkxFWElCTEUoUyk+CisgICAgOiBwdWJsaWMgVCwKKyAgICAgIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwKKyAgICAgICAgICAgICAgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpJU19TVFJFQU1fRkxBRyB8IFQ6OkluZGV4OjpESVJfVU5ERUZJTkVEPiB7Citwcml2YXRlOgorICAgIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gUG9ydC9kaXJlY3Rpb24gYW5kIHN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCisgICAgaW5saW5lIEMyU3RyZWFtUGFyYW0oc2l6ZV90IGZsZXhDb3VudCkgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBfVHlwZTo6UEFSQU1fVFlQRSwgMHUpIHsgfQorICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbiBhbmQKKyAgICAvLy8gc3RyZWFtLUlELgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMyU3RyZWFtUGFyYW0oc2l6ZV90IGZsZXhDb3VudCwgYm9vbCBfb3V0cHV0LCB1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBfb3V0cHV0ID8gb3V0cHV0OjpQQVJBTV9UWVBFIDogaW5wdXQ6OlBBUkFNX1RZUEUsIHN0cmVhbSksCisgICAgICAgICAgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQorCitwdWJsaWM6CisgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisKKyAgICAvLy8gU2V0IHBvcnQvZGlyZWN0aW9uLgorICAgIGlubGluZSB2b2lkIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsgQzJQYXJhbTo6c2V0UG9ydChvdXRwdXQpOyB9CisgICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgorICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9CisKKyAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhfVHlwZSwgUykKKyAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX1R5cGUpCisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIGlucHV0IHN0cmVhbSBwYXJhbWV0ZXIuCisgICAgc3RydWN0IGlucHV0IDogcHVibGljIFQsCisgICAgICAgICAgICBwdWJsaWMgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6SVNfU1RSRUFNX0ZMQUcgfCBUOjpUeXBlOjpESVJfSU5QVVQ+IHsKKyAgICBwcml2YXRlOgorICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gU3RyZWFtLUlEIGlzIHVuZGVmaW5lZC4KKyAgICAgICAgaW5saW5lIGlucHV0KHNpemVfdCBmbGV4Q291bnQpIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgaW5wdXQ6OlBBUkFNX1RZUEUpIHsgfQorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgc3RyZWFtLUlELgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgaW5wdXQoc2l6ZV90IGZsZXhDb3VudCwgdW5zaWduZWQgc3RyZWFtLCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgICAgICA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIGlucHV0OjpQQVJBTV9UWVBFLCBzdHJlYW0pLCBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgICAgIC8vLyBTZXQgc3RyZWFtLWlkLiBccmV0dmFsIHRydWUgaWYgdGhlIHN0cmVhbS1pZCB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeyByZXR1cm4gQzJQYXJhbTo6c2V0U3RyZWFtKHN0cmVhbSk7IH0KKworICAgICAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhpbnB1dCwgUykKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKGlucHV0KQorICAgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIG91dHB1dCBzdHJlYW0gcGFyYW1ldGVyLgorICAgIHN0cnVjdCBvdXRwdXQgOiBwdWJsaWMgVCwKKyAgICAgICAgICAgIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpJU19TVFJFQU1fRkxBRyB8IFQ6OlR5cGU6OkRJUl9PVVRQVVQ+IHsKKyAgICBwcml2YXRlOgorICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gU3RyZWFtLUlEIGlzIHVuZGVmaW5lZC4KKyAgICAgICAgaW5saW5lIG91dHB1dChzaXplX3QgZmxleENvdW50KSA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIG91dHB1dDo6UEFSQU1fVFlQRSkgeyB9CisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBzdHJlYW0tSUQuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBvdXRwdXQoc2l6ZV90IGZsZXhDb3VudCwgdW5zaWduZWQgc3RyZWFtLCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgICAgICA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIG91dHB1dDo6UEFSQU1fVFlQRSwgc3RyZWFtKSwgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQorCisgICAgcHVibGljOgorICAgICAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKworICAgICAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCisgICAgICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9CisKKyAgICAgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMob3V0cHV0LCBTKQorICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMob3V0cHV0KQorICAgIH07Cit9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT0gU0lNUExFIFZBTFVFIFBBUkFNRVRFUlMgPT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogXGluZ3JvdXAgaW50ZXJuYWwKKyAqIEEgc3RydWN0dXJlIHRlbXBsYXRlIGVuY2Fwc3VsYXRpbmcgYSBzaW5nbGUgZWxlbWVudCB3aXRoIGRlZmF1bHQgY29uc3RydWN0b3JzIGFuZCBubyBjb3JlLWluZGV4LgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyU2ltcGxlVmFsdWVTdHJ1Y3QgeworICAgIFQgdmFsdWU7IC8vLzwgc2ltcGxlIHZhbHVlIG9mIHRoZSBzdHJ1Y3R1cmUKKyAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KCkgPSBkZWZhdWx0OworICAgIC8vIENvbnN0cnVjdG9yIHdpdGggYW4gaW5pdGlhbCB2YWx1ZS4KKyAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdChUIHZhbHVlKSA6IHZhbHVlKHZhbHVlKSB7fQorICAgIERFRklORV9CQVNFX0MyU1RSVUNUKFNpbXBsZVZhbHVlKQorfTsKKworLy8gVE9ETzogbW92ZSB0aGlzIGFuZCBuZXh0IHRvIHNvbWUgZ2VuZXJpYyBwbGFjZQorLyoqCisgKiBJbnRlcmZhY2UgdG8gYSBibG9jayBvZiAobWFwcGVkKSBtZW1vcnkgY29udGFpbmluZyBhbiBhcnJheSBvZiBzb21lIHR5cGUgKFQpLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyTWVtb3J5QmxvY2sgeworICAgIC8vLyBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgYmxvY2suCisgICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0ID0gMDsKKyAgICAvLy8gXHJldHVybnMgYSBjb25zdCBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGlzIGJsb2NrLiBDYXJlIG11c3QgYmUgdGFrZW4gdG8gbm90IHJlYWQgb3V0c2lkZQorICAgIC8vLyB0aGUgYmxvY2suCisgICAgdmlydHVhbCBjb25zdCBUICpkYXRhKCkgY29uc3QgPSAwOyAvLyBUT0RPOiBzaG91bGQgdGhpcyBiZSBmcmllbmQgYWNjZXNzIG9ubHkgaW4gc29tZSBDMk1lbW9yeSBtb2R1bGU/CisgICAgLy8vIFxyZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhpcyBibG9jay4gQ2FyZSBtdXN0IGJlIHRha2VuIHRvIG5vdCByZWFkIG9yIHdyaXRlCisgICAgLy8vIG91dHNpZGUgdGhlIGJsb2NrLgorICAgIGlubGluZSBUICpkYXRhKCkgeyByZXR1cm4gY29uc3RfY2FzdDxUKj4oY29uc3RfY2FzdDxjb25zdCBDMk1lbW9yeUJsb2NrKj4odGhpcyktPmRhdGEoKSk7IH0KKworcHJvdGVjdGVkOgorICAgIC8vIFRPRE86IGZvciBub3cgaXQgc2hvdWxkIG5ldmVyIGJlIGRlbGV0ZWQgYXMgQzJNZW1vcnlCbG9jaworICAgIHZpcnR1YWwgfkMyTWVtb3J5QmxvY2soKSA9IGRlZmF1bHQ7Cit9OworCisvKioKKyAqIEludGVyZmFjZSB0byBhIGJsb2NrIG9mIG1lbW9yeSBjb250YWluaW5nIGEgY29uc3RhbnQgKGNvbnN0ZXhwcikgYXJyYXkgb2Ygc29tZSB0eXBlIChUKS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMkNvbnN0TWVtb3J5QmxvY2sgOiBwdWJsaWMgQzJNZW1vcnlCbG9jazxUPiB7CisgICAgdmlydHVhbCBjb25zdCBUICogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIF9tRGF0YTsgfQorICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBfbVNpemU7IH0KKworICAgIC8vLyBDb25zdHJ1Y3Rvci4KKyAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBOPgorICAgIGlubGluZSBjb25zdGV4cHIgQzJDb25zdE1lbW9yeUJsb2NrKGNvbnN0IFQoJmluaXQpW05dKSA6IF9tRGF0YShpbml0KSwgX21TaXplKE4pIHt9CisKK3ByaXZhdGU6CisgICAgY29uc3QgVCAqX21EYXRhOworICAgIGNvbnN0IHNpemVfdCBfbVNpemU7Cit9OworCisvLy8gXGFkZHRvZ3JvdXAgaW50ZXJuYWwKKy8vLyBAeworCisvLy8gSGVscGVyIGNsYXNzIHRvIGluaXRpYWxpemUgZmxleGlibGUgYXJyYXlzIHdpdGggdmFyaW91cyBpbml0YWxpemVycy4KK3N0cnVjdCBfQzJWYWx1ZUFycmF5SGVscGVyIHsKKyAgICAvLyBjaGFyW10tcyBhcmUgdXNlZCBhcyBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncywgc28gdGhlIGxhc3QgZWxlbWVudCBpcyBuZXZlciBpbml0ZWQuCisKKyAgICAvLy8gSW5pdGlhbGl6ZSBhIGZsZXhpYmxlIGFycmF5IHVzaW5nIGEgY29uc3RleHByIG1lbW9yeSBibG9jay4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyB2b2lkIGluaXQoVCgmYXJyYXkpW10sIHNpemVfdCBhcnJheUxlbiwgY29uc3QgQzJNZW1vcnlCbG9jazxUPiAmYmxvY2spIHsKKyAgICAgICAgLy8gcmVzZXJ2ZSBsYXN0IGVsZW1lbnQgZm9yIHRlcm1pbmFsIDAgZm9yIHN0cmluZ3MKKyAgICAgICAgaWYgKGFycmF5TGVuICYmIHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUpIHsKKyAgICAgICAgICAgIC0tYXJyYXlMZW47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJsb2NrLmRhdGEoKSkgeworICAgICAgICAgICAgbWVtY3B5KGFycmF5LCBibG9jay5kYXRhKCksIHN0ZDo6bWluKGFycmF5TGVuLCBibG9jay5zaXplKCkpICogc2l6ZW9mKFQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBJbml0aWFsaXplIGEgZmxleGlibGUgYXJyYXkgdXNpbmcgYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyB2b2lkIGluaXQoVCgmYXJyYXkpW10sIHNpemVfdCBhcnJheUxlbiwgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+ICZpbml0KSB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIC8vIHJlc2VydmUgbGFzdCBlbGVtZW50IGZvciB0ZXJtaW5hbCAwIGZvciBzdHJpbmdzCisgICAgICAgIGlmIChhcnJheUxlbiAmJiBzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlKSB7CisgICAgICAgICAgICAtLWFycmF5TGVuOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgVCAmaXRlbSA6IGluaXQpIHsKKyAgICAgICAgICAgIGlmIChpeCA9PSBhcnJheUxlbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJyYXlbaXgrK10gPSBpdGVtOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIEluaXRpYWxpemUgYSBmbGV4aWJsZSBhcnJheSB1c2luZyBhIHZlY3Rvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyB2b2lkIGluaXQoVCgmYXJyYXkpW10sIHNpemVfdCBhcnJheUxlbiwgY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmluaXQpIHsKKyAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgLy8gcmVzZXJ2ZSBsYXN0IGVsZW1lbnQgZm9yIHRlcm1pbmFsIDAgZm9yIHN0cmluZ3MKKyAgICAgICAgaWYgKGFycmF5TGVuICYmIHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUpIHsKKyAgICAgICAgICAgIC0tYXJyYXlMZW47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBUICZpdGVtIDogaW5pdCkgeworICAgICAgICAgICAgaWYgKGl4ID09IGFycmF5TGVuKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcnJheVtpeCsrXSA9IGl0ZW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gSW5pdGlhbGl6ZSBhIGZsZXhpYmxlIGFycmF5IHVzaW5nIGFub3RoZXIgZmxleGlibGUgYXJyYXkuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdW5zaWduZWQgTj4KKyAgICBzdGF0aWMgdm9pZCBpbml0KFQoJmFycmF5KVtdLCBzaXplX3QgYXJyYXlMZW4sIGNvbnN0IFQoJnN0cilbTl0pIHsKKyAgICAgICAgLy8gcmVzZXJ2ZSBsYXN0IGVsZW1lbnQgZm9yIHRlcm1pbmFsIDAgZm9yIHN0cmluZ3MKKyAgICAgICAgaWYgKGFycmF5TGVuICYmIHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUpIHsKKyAgICAgICAgICAgIC0tYXJyYXlMZW47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFycmF5TGVuKSB7CisgICAgICAgICAgICBtZW1jcHkoYXJyYXksIHN0ciwgc3RkOjptaW4oYXJyYXlMZW4sIChzaXplX3QpTikgKiBzaXplb2YoVCkpOworICAgICAgICB9CisgICAgfQorfTsKKworLyoqCisgKiBTcGVjaWFsaXphdGlvbiBmb3IgYSBmbGV4aWJsZSBibG9iIGFuZCBzdHJpbmcgYXJyYXlzLiBBIHN0cnVjdHVyZSB0ZW1wbGF0ZSBlbmNhcHN1bGF0aW5nIGEgc2luZ2xlCisgKiBmbGV4aWJsZSBhcnJheSBtZW1iZXIgd2l0aCBkZWZhdWx0IGZsZXhpYmxlIGNvbnN0cnVjdG9ycyBhbmQgbm8gY29yZS1pbmRleC4gVGhpcyB0eXBlIGNhbm5vdCBiZQorICogY29uc3RydWN0ZWQgb24gaXRzIG93biBhcyBpdCdzIHNpemUgaXMgMC4KKyAqCisgKiBcaW50ZXJuYWwgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBDMlNpbXBsZUFycmF5U3RydWN0PFRbXT4gc2ltcGx5IGJlY2F1c2UgaXRzIG1lbWJlciBoYXMgdGhlIG5hbWUKKyAqIGFzIHZhbHVlIHRvIHJlZmxlY3QgdGhpcyBpcyBhIHNpbmdsZSB2YWx1ZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMlNpbXBsZVZhbHVlU3RydWN0PFRbXT4geworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSB8fCBzdGQ6OmlzX3NhbWU8VCwgdWludDhfdD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIkMyU2ltcGxlVmFsdWVTdHJ1Y3Q8VFtdPiBpcyBvbmx5IGZvciBCTE9CIG9yIFNUUklORyIpOworICAgIFQgdmFsdWVbXTsKKworICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KCkgPSBkZWZhdWx0OworICAgIERFRklORV9CQVNFX0MyU1RSVUNUKFNpbXBsZVZhbHVlKQorICAgIEZMRVgoQzJTaW1wbGVWYWx1ZVN0cnVjdCwgdmFsdWUpCisKK3ByaXZhdGU6CisgICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgQzJNZW1vcnlCbG9jazxUPiAmYmxvY2spIHsKKyAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdCh2YWx1ZSwgZmxleENvdW50LCBibG9jayk7CisgICAgfQorCisgICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+ICZpbml0KSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWUsIGZsZXhDb3VudCwgaW5pdCk7CisgICAgfQorCisgICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmluaXQpIHsKKyAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdCh2YWx1ZSwgZmxleENvdW50LCBpbml0KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBOPgorICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IFQoJmluaXQpW05dKSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWUsIGZsZXhDb3VudCwgaW5pdCk7CisgICAgfQorfTsKKworLy8vIEB9CisKKy8qKgorICogQSBzdHJ1Y3R1cmUgdGVtcGxhdGUgZW5jYXBzdWxhdGluZyBhIHNpbmdsZSBmbGV4aWJsZSBhcnJheSBlbGVtZW50IG9mIGEgc3BlY2lmaWMgdHlwZSAoVCkgd2l0aAorICogZGVmYXVsdCBjb25zdHJ1Y3RvcnMgYW5kIG5vIGNvcmUtaW5kZXguIFRoaXMgdHlwZSBjYW5ub3QgYmUgY29uc3RydWN0ZWQgb24gaXRzIG93biBhcyBpdCdzIHNpemUKKyAqIGlzIDAuIEluc3RlYWQsIGl0IGlzIG1lYW50IHRvIGJlIHVzZWQgYXMgYSBwYXJhbWV0ZXIsIGUuZy4KKyAqCisgKiAgIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJNeUZhbmN5U3RydWN0PiwKKyAqICAgICAgICAgICBrUGFyYW1JbmRleE15RmFuY3lBcnJheVN0cmVhbVBhcmFtPiBDMk15RmFuY3lBcnJheVN0cmVhbUluZm87CisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJTaW1wbGVBcnJheVN0cnVjdCB7CisgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSAmJiAhc3RkOjppc19zYW1lPFQsIHVpbnQ4X3Q+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJ1c2UgQzJTaW1wbGVWYWx1ZVN0cnVjdDxUW10+IGlzIGZvciBCTE9CIG9yIFNUUklORyIpOworCisgICAgVCB2YWx1ZXNbXTsgLy8vPCBhcnJheSBtZW1iZXIKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KCkgPSBkZWZhdWx0OworICAgIERFRklORV9CQVNFX0ZMRVhfQzJTVFJVQ1QoU2ltcGxlQXJyYXksIHZhbHVlcykKKyAgICAvL0ZMRVgoQzJTaW1wbGVBcnJheVN0cnVjdCwgdmFsdWVzKQorCitwcml2YXRlOgorICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhIEMyTWVtb3J5QmxvY2suCisgICAgLy8vIFVzZWQgb25seSBieSB0aGUgZmxleGlibGUgcGFyYW1ldGVyIGFsbG9jYXRvcnMgKEFsbG9jVW5pcXVlICYgQWxsb2NTaGFyZWQpLgorICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEMyTWVtb3J5QmxvY2s8VD4gJmJsb2NrKSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWVzLCBmbGV4Q291bnQsIGJsb2NrKTsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICAvLy8gVXNlZCBvbmx5IGJ5IHRoZSBmbGV4aWJsZSBwYXJhbWV0ZXIgYWxsb2NhdG9ycyAoQWxsb2NVbmlxdWUgJiBBbGxvY1NoYXJlZCkuCisgICAgaW5saW5lIEMyU2ltcGxlQXJyYXlTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+ICZpbml0KSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWVzLCBmbGV4Q291bnQsIGluaXQpOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhbiB2ZWN0b3IuCisgICAgLy8vIFVzZWQgb25seSBieSB0aGUgZmxleGlibGUgcGFyYW1ldGVyIGFsbG9jYXRvcnMgKEFsbG9jVW5pcXVlICYgQWxsb2NTaGFyZWQpLgorICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZpbml0KSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWVzLCBmbGV4Q291bnQsIGluaXQpOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhbm90aGVyIGZsZXhpYmxlIGFycmF5LgorICAgIC8vLyBVc2VkIG9ubHkgYnkgdGhlIGZsZXhpYmxlIHBhcmFtZXRlciBhbGxvY2F0b3JzIChBbGxvY1VuaXF1ZSAmIEFsbG9jU2hhcmVkKS4KKyAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBOPgorICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IFQoJmluaXQpW05dKSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWVzLCBmbGV4Q291bnQsIGluaXQpOworICAgIH0KK307CisKKy8qKgorICogXGFkZHRvZ3JvdXAgc2ltcGxldmFsdWUgU2ltcGxlIHZhbHVlIGFuZCBhcnJheSBzdHJ1Y3R1cmVzLgorICogQHsKKyAqCisgKiBTaW1wbGUgdmFsdWUgc3RydWN0dXJlcy4KKyAqCisgKiBTdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgYSBzaW5nbGUgc2ltcGxlIHZhbHVlLiBUaGVzZSBjYW4gYmUgcmV1c2VkIHRvIGVhc2lseSBkZWZpbmUgc2ltcGxlCisgKiBwYXJhbWV0ZXJzIG9mIHZhcmlvdXMgdHlwZXM6CisgKgorICogICB0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMkludDMyVmFsdWUsIGtQYXJhbUluZGV4TXlJbnRlZ2VyUG9ydFBhcmFtPgorICogICAgICAgICAgIEMyTXlJbnRlZ2VyUG9ydFBhcmFtVHVuaW5nOworICoKKyAqIFRoZXkgY29udGFpbiBhIHNpbmdsZSBtZW1iZXIgKHZhbHVlIG9yIHZhbHVlcykgdGhhdCBpcyBkZXNjcmliZWQgYXMgInZhbHVlIiBvciAidmFsdWVzIi4KKyAqCisgKiBUaGVzZSBzdHJ1Y3R1cmVzIGRvbid0IGRlZmluZSBhIGNvcmUgaW5kZXgsIGFuZCBhcyBzdWNoLCB0aGV5IGNhbm5vdCBiZSB1c2VkIGluIHN0cnVjdHVyZQorICogZGVjbGFyYXRpb25zLiBVc2UgdHlwZVtdIGluc3RlYWQsIHN1Y2ggYXMgaW50MzJfdCBmaWVsZFtdLgorICovCisvLy8gQSAzMi1iaXQgc2lnbmVkIGludGVnZXIgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PGludDMyX3Q+IEMySW50MzJWYWx1ZTsKKy8vLyBBIDMyLWJpdCBzaWduZWQgaW50ZWdlciBhcnJheSBwYXJhbWV0ZXIgaW4gdmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKK3R5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDxpbnQzMl90PiBDMkludDMyQXJyYXk7CisvLy8gQSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8dWludDMyX3Q+IEMyVWludDMyVmFsdWU7CisvLy8gQSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciBhcnJheSBwYXJhbWV0ZXIgaW4gdmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKK3R5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDx1aW50MzJfdD4gQzJVaW50MzJBcnJheTsKKy8vLyBBIDY0LWJpdCBzaWduZWQgaW50ZWdlciBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8aW50NjRfdD4gQzJJbnQ2NFZhbHVlOworLy8vIEEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIGFycmF5IHBhcmFtZXRlciBpbiB2YWx1ZXMsIGRlc2NyaWJlZCBhcyAidmFsdWVzIgordHlwZWRlZiBDMlNpbXBsZUFycmF5U3RydWN0PGludDY0X3Q+IEMySW50NjRBcnJheTsKKy8vLyBBIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHBhcmFtZXRlciBpbiB2YWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDx1aW50NjRfdD4gQzJVaW50NjRWYWx1ZTsKKy8vLyBBIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGFycmF5IHBhcmFtZXRlciBpbiB2YWx1ZXMsIGRlc2NyaWJlZCBhcyAidmFsdWVzIgordHlwZWRlZiBDMlNpbXBsZUFycmF5U3RydWN0PHVpbnQ2NF90PiBDMlVpbnQ2NEFycmF5OworLy8vIEEgZmxvYXQgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PGZsb2F0PiBDMkZsb2F0VmFsdWU7CisvLy8gQSBmbG9hdCBhcnJheSBwYXJhbWV0ZXIgaW4gdmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKK3R5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDxmbG9hdD4gQzJGbG9hdEFycmF5OworLy8vIEEgYmxvYiBmbGV4aWJsZSBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8dWludDhfdFtdPiBDMkJsb2JWYWx1ZTsKKy8vLyBBIHN0cmluZyBmbGV4aWJsZSBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8Y2hhcltdPiBDMlN0cmluZ1ZhbHVlOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8VD46OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4geyBERVNDUklCRV9DMkZJRUxEKHZhbHVlLCAidmFsdWUiKSB9OworfQordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlNpbXBsZVZhbHVlU3RydWN0PFRbXT46OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4geyBERVNDUklCRV9DMkZJRUxEKHZhbHVlLCAidmFsdWUiKSB9OworfQordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlNpbXBsZUFycmF5U3RydWN0PFQ+OjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIHsgREVTQ1JJQkVfQzJGSUVMRCh2YWx1ZXMsICJ2YWx1ZXMiKSB9OworfQorCisvLy8gQH0KKworLy8vIEB9CisKKyNlbmRpZiAgLy8gQzJQQVJBTV9ERUZfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJXb3JrLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyV29yay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MjNmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyV29yay5oCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMldPUktfSF8KKworI2RlZmluZSBDMldPUktfSF8KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisvLy8gXGRlZmdyb3VwIHdvcmsgV29yayBhbmQgZGF0YSBwcm9jZXNzaW5nCisvLy8gQHsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSByZWFzb24gYSBwYXJhbWV0ZXIgc2V0dGluZ3MgbWF5IGZhaWwsIG9yCisgKiBtYXkgYmUgb3ZlcnJpZGVuLgorICovCitzdHJ1Y3QgQzJTZXR0aW5nUmVzdWx0IHsKKyAgICBlbnVtIEZhaWx1cmUgOiB1aW50MzJfdCB7CisgICAgICAgIC8qIHBhcmFtZXRlciBmYWlsdXJlcyBiZWxvdyAqLworICAgICAgICBCQURfVFlQRSwgICAvLy88IHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgIEJBRF9QT1JULCAgIC8vLzwgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHNwZWNpZmljIHBvcnQKKyAgICAgICAgQkFEX0lOREVYLCAgLy8vPCBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgc3BlY2lmaWMgc3RyZWFtCisgICAgICAgIFJFQURfT05MWSwgIC8vLzwgcGFyYW1ldGVyIGlzIHJlYWQtb25seSBhbmQgY2Fubm90IGJlIHNldAorICAgICAgICBNSVNNQVRDSCwgICAvLy88IHBhcmFtZXRlciBtaXNtYXRjaGVzIGlucHV0IGRhdGEKKworICAgICAgICAvKiBmaWVsZCBmYWlsdXJlcyBiZWxvdyAqLworICAgICAgICBCQURfVkFMVUUsICAvLy88IHN0cmljdCBwYXJhbWV0ZXIgZG9lcyBub3QgYWNjZXB0IHZhbHVlIGZvciB0aGUgZmllbGQgYXQgYWxsCisgICAgICAgIENPTkZMSUNULCAgIC8vLzwgc3RyaWN0IHBhcmFtZXRlciBmaWVsZCB2YWx1ZSBpcyBpbiBjb25mbGljdCB3aXRoIGFuL290aGVyIHNldHRpbmcocykKKworICAgICAgICAvLy8gcGFyYW1ldGVyIGZpZWxkIGlzIG91dCBvZiByYW5nZSBkdWUgdG8gb3RoZXIgc2V0dGluZ3MgKHRoaXMgZmFpbHVyZSBtb2RlCisgICAgICAgIC8vLyBjYW4gb25seSBiZSB1c2VkIGZvciBzdHJpY3QgY2FsY3VsYXRlZCBwYXJhbWV0ZXJzKQorICAgICAgICBVTlNVUFBPUlRFRCwKKworICAgICAgICAvLy8gZmllbGQgZG9lcyBub3QgYWNjZXNzIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVyIHZhbHVlIGF0IGFsbC4gSXQgaGFzIGJlZW4gY29ycmVjdGVkIHRvCisgICAgICAgIC8vLyB0aGUgY2xvc2VzdCBzdXBwb3J0ZWQgdmFsdWUuIFRoaXMgZmFpbHVyZSBtb2RlIGlzIHByb3ZpZGVkIHRvIGdpdmUgZ3VpZGFuY2UgYXMgdG8gd2hhdAorICAgICAgICAvLy8gYXJlIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhpcyBmaWVsZCAod2hpY2ggbWF5IGJlIGEgc3Vic2V0IG9mIHRoZSBhdC1hbGwtCisgICAgICAgIC8vLyBwb3RlbnRpYWwgdmFsdWVzKQorICAgICAgICBJTkZPX0JBRF9WQUxVRSwKKworICAgICAgICAvLy8gcmVxdWVzdGVkIHBhcmFtZXRlciB2YWx1ZSBpcyBpbiBjb25mbGljdCB3aXRoIGFuL290aGVyIHNldHRpbmcocykKKyAgICAgICAgLy8vIGFuZCBoYXMgYmVlbiBjb3JyZWN0ZWQgdG8gdGhlIGNsb3Nlc3Qgc3VwcG9ydGVkIHZhbHVlLiBUaGlzIGZhaWx1cmUKKyAgICAgICAgLy8vIG1vZGUgaXMgZ2l2ZW4gdG8gcHJvdmlkZSBndWlkYW5jZSBhcyB0byB3aGF0IGFyZSB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgYXMgd2VsbAorICAgICAgICAvLy8gYXMgdG8gb3B0aW9uYWxseSBwcm92aWRlIHN1Z2dlc3Rpb24gdG8gdGhlIGNsaWVudCBhcyB0byBob3cgdG8gZW5hYmxlIHRoZSByZXF1ZXN0ZWQKKyAgICAgICAgLy8vIHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgICAgSU5GT19DT05GTElDVCwKKyAgICB9OworCisgICAgRmFpbHVyZSBmYWlsdXJlOyAgICAvLy88IGZhaWx1cmUgY29kZQorCisgICAgLy8vIEZhaWxpbmcgKG9yIGNvcnJlY3RlZCkgZmllbGQgb3IgcGFyYW1ldGVyYW5kIG9wdGlvbmFsbHksIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGUKKyAgICAvLy8gZmllbGQuIFZhbHVlcyBtdXN0IG9ubHkgYmUgc2V0IGZvciBmaWVsZCBmYWlsdXJlcyBvdGhlciB0aGFuIEJBRF9WQUxVRSwgYW5kIG9ubHkgaWYgdGhleSBhcmUKKyAgICAvLy8gZGlmZmVyZW50IGZyb20gdGhlIGdsb2JhbGx5IHN1cHBvcnRlZCB2YWx1ZXMgKGUuZy4gZHVlIHRvIHJlc3RyaWN0aW9ucyBieSBhbm90aGVyIHBhcmFtIG9yCisgICAgLy8vIGlucHV0IGRhdGEpLgorICAgIEMyUGFyYW1GaWVsZFZhbHVlcyBmaWVsZDsKKworICAgIC8vLyBDb25mbGljdGluZyBwYXJhbWV0ZXJzIG9yIGZpZWxkcyB3aXRoIG9wdGlvbmFsIHN1Z2dlc3Rpb25zIHdpdGggKG9wdGlvbmFsKSBzdWdnZXN0ZWQgdmFsdWVzCisgICAgLy8vIGZvciBhbnkgY29uZmxpY3RpbmcgZmllbGRzIHRvIGF2b2lkIHRoZSBjb25mbGljdC4gTXVzdCBvbmx5IGJlIHNldCBmb3IgQ09ORkxJQ1QsIFVOU1VQUE9SVEVECisgICAgLy8vIGFuZCBJTkZPX0NPTkZMSUNUIGZhaWx1cmUgY29kZXMuCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiBjb25mbGljdHM7Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBXT1JLCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoqIFVuaXF1ZSBJRCBmb3IgYSBwcm9jZXNzaW5nIG5vZGUuICovCit0eXBlZGVmIHVpbnQzMl90IGMyX25vZGVfaWRfdDsKKworZW51bSB7CisgICAga1BhcmFtSW5kZXhXb3JrT3JkaW5hbCwKK307CisKKy8qKgorICogSW5mb3JtYXRpb24gZm9yIG9yZGVyaW5nIHdvcmsgaXRlbXMgb24gYSBjb21wb25lbnQgcG9ydC4KKyAqLworc3RydWN0IEMyV29ya09yZGluYWxTdHJ1Y3QgeworLy9wdWJsaWM6CisgICAgYzJfY250cjY0X3QgdGltZXN0YW1wOyAgICAgLyoqIGZyYW1lIHRpbWVzdGFtcCBpbiBtaWNyb3NlY29uZHMgKi8KKyAgICBjMl9jbnRyNjRfdCBmcmFtZUluZGV4OyAgICAvKiogc3VibWlzc2lvbiBvcmRpbmFsIG9uIHRoZSBpbml0aWFsIGNvbXBvbmVudCAqLworICAgIGMyX2NudHI2NF90IGN1c3RvbU9yZGluYWw7IC8qKiBjYW4gYmUgZ2l2ZW4gYnkgdGhlIGNvbXBvbmVudCwgZS5nLiBkZWNvZGUgb3JkZXIgKi8KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoV29ya09yZGluYWwpCisgICAgQzJGSUVMRCh0aW1lc3RhbXAsICJ0aW1lc3RhbXAiKQorICAgIEMyRklFTEQoZnJhbWVJbmRleCwgImZyYW1lLWluZGV4IikKKyAgICBDMkZJRUxEKGN1c3RvbU9yZGluYWwsICJjdXN0b20tb3JkaW5hbCIpCit9OworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgYSBDb2RlYyAyLjAgZnJhbWUgd2l0aCBpdHMgbWV0YWRhdGEuCisgKgorICogQSBmcmFtZSBiYXNpY2FsbHkgY29uc2lzdHMgb2YgYW4gb3JkZXJlZCBzZXRzIG9mIGJ1ZmZlcnMsIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBhbmQgaW5mbyBidWZmZXJzCisgKiBhbG9uZyB3aXRoIHNvbWUgbm9uLWNvbmZpZ3VyYXRpb24gbWV0YWRhdGEuCisgKi8KK3N0cnVjdCBDMkZyYW1lRGF0YSB7CisvL3B1YmxpYzoKKyAgICBlbnVtIGZsYWdzX3QgOiB1aW50MzJfdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBGb3IgaW5wdXQgZnJhbWVzOiBubyBvdXRwdXQgZnJhbWUgc2hhbGwgYmUgZ2VuZXJhdGVkIHdoZW4gcHJvY2Vzc2luZyB0aGlzIGZyYW1lLCBidXQKKyAgICAgICAgICogbWV0YWRhdGEgc2hhbGwgc3RpbGwgYmUgcHJvY2Vzc2VkLgorICAgICAgICAgKiBGb3Igb3V0cHV0IGZyYW1lczogdGhpcyBmcmFtZSBzaGFsbCBiZSBkaXNjYXJkZWQgYW5kIGJ1dCBtZXRhZGF0YSBpcyBzdGlsbCB2YWxpZC4KKyAgICAgICAgICovCisgICAgICAgIEZMQUdfRFJPUF9GUkFNRSAgICA9ICgxIDw8IDApLAorICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBmcmFtZSBpcyB0aGUgbGFzdCBmcmFtZSBvZiB0aGUgY3VycmVudCBzdHJlYW0uIEZ1cnRoZXIgZnJhbWVzIGFyZSBwYXJ0IG9mIGEgbmV3CisgICAgICAgICAqIHN0cmVhbS4KKyAgICAgICAgICovCisgICAgICAgIEZMQUdfRU5EX09GX1NUUkVBTSA9ICgxIDw8IDEpLAorICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBmcmFtZSBzaGFsbCBiZSBkaXNjYXJkZWQgd2l0aCBpdHMgbWV0YWRhdGEuCisgICAgICAgICAqIFRoaXMgZmxhZyBpcyBvbmx5IHNldCBieSBjb21wb25lbnRzIC0gZS5nLiBhcyBhIHJlc3BvbnNlIHRvIHRoZSBmbHVzaCBjb21tYW5kLgorICAgICAgICAgKi8KKyAgICAgICAgRkxBR19ESVNDQVJEX0ZSQU1FID0gKDEgPDwgMiksCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGZyYW1lIGlzIG5vdCB0aGUgbGFzdCBmcmFtZSBwcm9kdWNlZCBmb3IgdGhlIGlucHV0LgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGZsYWcgaXMgbm9ybWFsbHkgc2V0IGJ5IHRoZSBjb21wb25lbnQgLSBlLmcuIHdoZW4gYW4gaW5wdXQgZnJhbWUgcmVzdWx0cyBpbiBtdWx0aXBsZQorICAgICAgICAgKiBvdXRwdXQgZnJhbWVzLCB0aGlzIGZsYWcgaXMgc2V0IG9uIGFsbCBidXQgdGhlIGxhc3Qgb3V0cHV0IGZyYW1lLgorICAgICAgICAgKgorICAgICAgICAgKiBBbHNvLCB3aGVuIGNvbXBvbmVudHMgYXJlIGNoYWluZWQsIHRoaXMgZmxhZyBzaG91bGQgYmUgcHJvcGFnYXRlZCBkb3duIHRoZQorICAgICAgICAgKiB3b3JrIGNoYWluLiBUaGF0IGlzLCBpZiBzZXQgb24gYW4gZWFybGllciBmcmFtZSBvZiBhIHdvcmstY2hhaW4sIGl0IHNob3VsZCBiZSBwcm9wYWdhdGVkCisgICAgICAgICAqIHRvIGFsbCBsYXRlciBmcmFtZXMgaW4gdGhhdCBjaGFpbi4gQWRkaXRpb25hbGx5LCBjb21wb25lbnRzIGRvd24gdGhlIGNoYWluIGNvdWxkIHNldAorICAgICAgICAgKiB0aGlzIGZsYWcgZXZlbiBpZiBub3Qgc2V0IGVhcmxpZXIsIGUuZy4gaWYgbXVsdGlwbGUgb3V0cHV0IGZyYW1lIGlzIGdlbmVyYXRlZCBhdCB0aGF0CisgICAgICAgICAqIGNvbXBvbmVudCBmb3IgdGhlIGlucHV0IGZyYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgRkxBR19JTkNPTVBMRVRFID0gKDEgPDwgMyksCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGZyYW1lIGNvbnRhaW5zIG9ubHkgY29kZWMtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkYXRhLCBhbmQgbm8gYWN0dWFsIGFjY2VzcyB1bml0LgorICAgICAgICAgKgorICAgICAgICAgKiBcZGVwcmVjYXRlZCBwYXNzIGNvZGVjIGNvbmZpZ3VyYXRpb24gd2l0aCB1c2luZyB0aGUgXHRvZG8gY29kZWMtc3BlY2lmaWMgY29uZmlndXJhdGlvbgorICAgICAgICAgKiBpbmZvIHRvZ2V0aGVyIHdpdGggdGhlIGFjY2VzcyB1bml0LgorICAgICAgICAgKi8KKyAgICAgICAgRkxBR19DT0RFQ19DT05GSUcgID0gKDF1IDw8IDMxKSwKKyAgICB9OworCisgICAgLyoqCisgICAgICogRnJhbWUgZmxhZ3MgKi8KKyAgICBmbGFnc190ICBmbGFnczsKKyAgICBDMldvcmtPcmRpbmFsU3RydWN0IG9yZGluYWw7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gYnVmZmVyczsKKyAgICAvLzwgZm9yIGluaXRpYWwgd29yayBpdGVtLCB0aGVzZSBtYXkgYWxzbyBjb21lIGZyb20gdGhlIHBhcnNlciAtIGlmIHByb3ZpZGVkCisgICAgLy88IGZvciBvdXRwdXQgYnVmZmVycywgdGhlc2UgYXJlIHRoZSByZXNwb25zZXMgdG8gcmVxdWVzdGVkSW5mb3MKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICAgICAgY29uZmlnVXBkYXRlOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMkluZm9CdWZmZXI+PiBpbmZvQnVmZmVyczsKK307CisKK3N0cnVjdCBDMldvcmtsZXQgeworLy9wdWJsaWM6CisgICAgLy8gSU4KKyAgICBjMl9ub2RlX2lkX3QgY29tcG9uZW50OworCisgICAgLyoqIENvbmZpZ3VyYXRpb24gY2hhbmdlcyB0byBiZSBhcHBsaWVkIGJlZm9yZSBwcm9jZXNzaW5nIHRoaXMgd29ya2xldC4gKi8KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJUdW5pbmc+PiB0dW5pbmdzOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKworICAgIC8vIE9VVAorICAgIEMyRnJhbWVEYXRhIG91dHB1dDsKK307CisKKy8qKgorICogSW5mb3JtYXRpb24gYWJvdXQgcGFydGlhbCB3b3JrLWNoYWlucyBub3QgcGFydCBvZiB0aGUgY3VycmVudCB3b3JrIGl0ZW1zLgorICoKKyAqIFRvIGJlIGRlZmluZWQgbGF0ZXIuCisgKi8KK3N0cnVjdCBDMldvcmtDaGFpbkluZm87CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGEgc2luZ2xlIHdvcmsgaXRlbS4KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBzaGFsbCBiZSBwYXNzZWQgYnkgdGhlIGNsaWVudCB0byB0aGUgY29tcG9uZW50IGZvciB0aGUgZmlyc3Qgd29ya2xldC4gQXMgc3VjaCwKKyAqIHdvcmtsZXRzIG11c3Qgbm90IGJlIGVtcHR5LiBUaGUgb3duZXJzaGlwIG9mIHRoaXMgb2JqZWN0IGlzIHBhc3NlZC4KKyAqLworc3RydWN0IEMyV29yayB7CisvL3B1YmxpYzoKKyAgICAvLy8gYWRkaXRpb25hbCB3b3JrIGNoYWluIGluZm8gbm90IHBhcnQgb2YgdGhpcyB3b3JrCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyV29ya0NoYWluSW5mbz4gY2hhaW5JbmZvOworCisgICAgLy8vIFRoZSBpbnB1dCBkYXRhIHRvIGJlIHByb2Nlc3NlZCBhcyBwYXJ0IG9mIHRoaXMgd29yay93b3JrLWNoYWluLiBUaGlzIGlzIHByb3ZpZGVkIGJ5IHRoZQorICAgIC8vLyBjbGllbnQgd2l0aCBvd25lcnNoaXAuIFdoZW4gdGhlIHdvcmsgaXMgcmV0dXJuZWQgKHZpYSBvbldvcmtEb25lKSwgdGhlIGlucHV0IGJ1ZmZlci1wYWNrJ3MKKyAgICAvLy8gYnVmZmVyIHZlY3RvciBzaGFsbCBjb250YWluIG51bGxwdHJzLgorICAgIEMyRnJhbWVEYXRhIGlucHV0OworCisgICAgLy8vIFRoZSBjaGFpbiBvZiBjb21wb25lbnRzLCB0dW5pbmdzIChpbmNsdWRpbmcgb3V0cHV0IGJ1ZmZlciBwb29sIElEcykgYW5kIGluZm8gcmVxdWVzdHMgdGhhdCB0aGUKKyAgICAvLy8gZGF0YSBtdXN0IHBhc3MgdGhyb3VnaC4gSWYgdGhpcyBoYXMgbW9yZSB0aGFuIGEgc2luZ2xlIGVsZW1lbnQsIHRoZSB0dW5uZWxzIGJldHdlZW4gc3VjY2Vzc2l2ZQorICAgIC8vLyBjb21wb25lbnRzIG9mIHRoZSB3b3JrbGV0IGNoYWluIG11c3QgaGF2ZSBiZWVuIChzdWNjZXNzZnVsbHkpIHByZS1yZWdpc3RlcmVkIGF0IHRoZSB0aW1lIHRoYXQKKyAgICAvLy8gdGhlIHdvcmsgaXMgc3VibWl0dGVkLiBBbGxvY2F0aW5nIHRoZSBvdXRwdXQgYnVmZmVycyBpbiB0aGUgd29ya2xldHMgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mCisgICAgLy8vIGVhY2ggY29tcG9uZW50LiBVcG9uIHdvcmsgc3VibWlzc2lvbiwgZWFjaCBvdXRwdXQgYnVmZmVyLXBhY2sgc2hhbGwgYmUgYW4gYXBwcm9wcmlhdGVseSBzaXplZAorICAgIC8vLyB2ZWN0b3IgY29udGFpbmluZyBudWxscHRycy4gV2hlbiB0aGUgd29yayBpcyBjb21wbGV0ZWQvcmV0dXJuZWQgdG8gdGhlIGNsaWVudCwgb3V0cHV0IGJ1ZmZlcnMKKyAgICAvLy8gcG9pbnRlcnMgZnJvbSBhbGwgYnV0IHRoZSBmaW5hbCB3b3JrbGV0IHNoYWxsIGJlIG51bGxwdHJzLgorICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrbGV0Pj4gd29ya2xldHM7CisKKyAgICAvLy8gTnVtYmVyIG9mIHdvcmtsZXRzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgaW4gdGhpcyBjaGFpbi4gVGhpcyBzaGFsbCBiZSBpbml0aWFsaXplZCB0byAwIGJ5IHRoZQorICAgIC8vLyBjbGllbnQgd2hlbiB0aGUgd29yayBpcyBzdWJtaXR0ZWQuIEl0IHNoYWxsIGNvbnRhaW4gdGhlIG51bWJlciBvZiB3b3JrbGV0cyB0aGF0IHdlcmUKKyAgICAvLy8gc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCB3aGVuIHRoZSB3b3JrIGlzIHJldHVybmVkIHRvIHRoZSBjbGllbnQuIElmIHRoaXMgaXMgbGVzcyB0aGVuIHRoZSBudW1iZXIKKyAgICAvLy8gb2Ygd29ya2xldHMsIHJlc3VsdCBtdXN0IG5vdCBiZSBzdWNjZXNzLiBJdCBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiBbMCwgd29ya2xldHMuc2l6ZSgpXS4KKyAgICB1aW50MzJfdCB3b3JrbGV0c1Byb2Nlc3NlZDsKKworICAgIC8vLyBUaGUgZmluYWwgb3V0Y29tZSBvZiB0aGUgd29yayAoY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCB3b3JrbGV0c1Byb2Nlc3NlZCkuIElmIDAgd2hlbgorICAgIC8vLyB3b3JrIGlzIHJldHVybmVkLCBpdCBpcyBhc3N1bWVkIHRoYXQgYWxsIHdvcmtsZXRzIGhhdmUgYmVlbiBwcm9jZXNzZWQuCisgICAgYzJfc3RhdHVzX3QgcmVzdWx0OworfTsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBhYm91dCBhIGZ1dHVyZSB3b3JrIHRvIGJlIHN1Ym1pdHRlZCB0byB0aGUgY29tcG9uZW50LiBUaGUgaW5mb3JtYXRpb24gaXMgdXNlZCB0bworICogcmVzZXJ2ZSB0aGUgd29yayBmb3Igd29yayBvcmRlcmluZyBwdXJwb3Nlcy4KKyAqLworc3RydWN0IEMyV29ya091dGxpbmUgeworLy9wdWJsaWM6CisgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvcmRpbmFsOworICAgIHN0ZDo6dmVjdG9yPGMyX25vZGVfaWRfdD4gY2hhaW47Cit9OworCisvLy8gQH0KKworI2VuZGlmICAvLyBDMldPUktfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvX0MyTWFjcm9VdGlscy5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9fQzJNYWNyb1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRlOWJhNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvX0MyTWFjcm9VdGlscy5oCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX01BQ1JPX1VUSUxTX0hfCisjZGVmaW5lIEMyVVRJTFNfTUFDUk9fVVRJTFNfSF8KKworLyoqIFxmaWxlCisgKiBNYWNybyB1dGlsaXRpZXMgZm9yIHRoZSB1dGlscyBsaWJyYXJ5IHVzZWQgYnkgQ29kZWMyIGltcGxlbWVudGF0aW9ucy4KKyAqLworCisvLy8gXGlmIDAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZBUklBQkxFIEFSR1VNRU5UIENPVU5USU5HIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLyByZW1vdmUgZW1wdHkgYXJndW1lbnRzIC0gX0MyX0FSRygpIGV4cGFuZHMgdG8gJycsIHdoaWxlIF9DMl9BUkcoeCkgZXhwYW5kcyB0byAnLCB4JworLy8gX0MyX0FSR24oLi4uKSBkb2VzIHRoZSBzYW1lIGZvciBuIGFyZ3VtZW50cworI2RlZmluZSBfQzJfQVJHKC4uLikgLCAjI19fVkFfQVJHU19fCisjZGVmaW5lIF9DMl9BUkcyKF8xLCBfMikgX0MyX0FSRyhfMSkgX0MyX0FSRyhfMikKKyNkZWZpbmUgX0MyX0FSRzQoXzEsIF8yLCBfMywgXzQpIF9DMl9BUkcyKF8xLCBfMikgX0MyX0FSRzIoXzMsIF80KQorI2RlZmluZSBfQzJfQVJHOChfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgpIF9DMl9BUkc0KF8xLCBfMiwgXzMsIF80KSBfQzJfQVJHNChfNSwgXzYsIF83LCBfOCkKKyNkZWZpbmUgX0MyX0FSRzE2KF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCwgXzksIF8xMCwgXzExLCBfMTIsIF8xMywgXzE0LCBfMTUsIF8xNikgXAorICAgICAgICBfQzJfQVJHOChfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgpIF9DMl9BUkc4KF85LCBfMTAsIF8xMSwgXzEyLCBfMTMsIF8xNCwgXzE1LCBfMTYpCisKKy8vIHJldHVybiB0aGUgNjV0aCBhcmd1bWVudAorI2RlZmluZSBfQzJfQVJHQ18zKF8sIF8wLCBfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgsIF85LCBfMTAsIF8xMSwgXzEyLCBfMTMsIF8xNCwgXzE1LCBfMTYsIFwKKyAgICAgICAgXzE3LCBfMTgsIF8xOSwgXzIwLCBfMjEsIF8yMiwgXzIzLCBfMjQsIF8yNSwgXzI2LCBfMjcsIF8yOCwgXzI5LCBfMzAsIF8zMSwgXzMyLCBcCisgICAgICAgIF8zMywgXzM0LCBfMzUsIF8zNiwgXzM3LCBfMzgsIF8zOSwgXzQwLCBfNDEsIF80MiwgXzQzLCBfNDQsIF80NSwgXzQ2LCBfNDcsIF80OCwgXAorICAgICAgICBfNDksIF81MCwgXzUxLCBfNTIsIF81MywgXzU0LCBfNTUsIF81NiwgXzU3LCBfNTgsIF81OSwgXzYwLCBfNjEsIF82MiwgXzYzLCBfNjQsIC4uLikgXzY0CisKKy8vLyBcZW5kaWYKKworLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorICovCisvLyBXZSBkbyB0aGlzIGJ5IHByZXBlbmRpbmcgMSBhbmQgYXBwZW5kaW5nIDY1IGRlc2lnbmVkIHZhbHVlcyBzdWNoIHRoYXQgdGhlIDY1dGggZWxlbWVudAorLy8gd2lsbCBiZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyNkZWZpbmUgX0MyX0FSR0MoLi4uKSBfQzJfQVJHQ18xKDAsICMjX19WQV9BUkdTX18sIFwKKyAgICAgICAgNjQsIDYzLCA2MiwgNjEsIDYwLCA1OSwgNTgsIDU3LCA1NiwgNTUsIDU0LCA1MywgNTIsIDUxLCA1MCwgNDksIDQ4LCA0NywgNDYsIDQ1LCA0NCwgNDMsIFwKKyAgICAgICAgNDIsIDQxLCA0MCwgMzksIDM4LCAzNywgMzYsIDM1LCAzNCwgMzMsIDMyLCAzMSwgMzAsIDI5LCAyOCwgMjcsIDI2LCAyNSwgMjQsIDIzLCAyMiwgMjEsIFwKKyAgICAgICAgMjAsIDE5LCAxOCwgMTcsIDE2LCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxLCAwKQorCisvLy8gXGlmIDAKKworLy8gc3RlcCAxLiByZW1vdmUgZW1wdHkgYXJndW1lbnRzIC0gdGhpcyBpcyBuZWVkZWQgdG8gYWxsb3cgdHJhaWxpbmcgY29tbWEgaW4gZW51bSBkZWZpbml0aW9ucworLy8gKE5PVEU6IHdlIGRvbid0IGtub3cgd2hpY2ggYXJndW1lbnQgd2lsbCBoYXZlIHRoaXMgdHJhaWxpbmcgY29tbWEgc28gd2UgaGF2ZSB0byB0cnkgYWxsKQorI2RlZmluZSBfQzJfQVJHQ18xKF8sIF8wLCBfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgsIF85LCBfMTAsIF8xMSwgXzEyLCBfMTMsIF8xNCwgXzE1LCBfMTYsIFwKKyAgICAgICAgXzE3LCBfMTgsIF8xOSwgXzIwLCBfMjEsIF8yMiwgXzIzLCBfMjQsIF8yNSwgXzI2LCBfMjcsIF8yOCwgXzI5LCBfMzAsIF8zMSwgXzMyLCBcCisgICAgICAgIF8zMywgXzM0LCBfMzUsIF8zNiwgXzM3LCBfMzgsIF8zOSwgXzQwLCBfNDEsIF80MiwgXzQzLCBfNDQsIF80NSwgXzQ2LCBfNDcsIF80OCwgXAorICAgICAgICBfNDksIF81MCwgXzUxLCBfNTIsIF81MywgXzU0LCBfNTUsIF81NiwgXzU3LCBfNTgsIF81OSwgXzYwLCBfNjEsIF82MiwgXzYzLCBfNjQsIC4uLikgXAorICAgIF9DMl9BUkdDXzIoXyBfQzJfQVJHKF8wKSBcCisgICAgX0MyX0FSRzE2KF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCwgXzksIF8xMCwgXzExLCBfMTIsIF8xMywgXzE0LCBfMTUsIF8xNikgXAorICAgIF9DMl9BUkcxNihfMTcsIF8xOCwgXzE5LCBfMjAsIF8yMSwgXzIyLCBfMjMsIF8yNCwgXzI1LCBfMjYsIF8yNywgXzI4LCBfMjksIF8zMCwgXzMxLCBfMzIpIFwKKyAgICBfQzJfQVJHMTYoXzMzLCBfMzQsIF8zNSwgXzM2LCBfMzcsIF8zOCwgXzM5LCBfNDAsIF80MSwgXzQyLCBfNDMsIF80NCwgXzQ1LCBfNDYsIF80NywgXzQ4KSBcCisgICAgX0MyX0FSRzE2KF80OSwgXzUwLCBfNTEsIF81MiwgXzUzLCBfNTQsIF81NSwgXzU2LCBfNTcsIF81OCwgXzU5LCBfNjAsIF82MSwgXzYyLCBfNjMsIF82NCksIFwKKyAgICAjI19fVkFfQVJHU19fKQorCisvLyBzdGVwIDIuIHRoaXMgaXMgbmVlZGVkIGFzIHJlbW92ZWQgYXJndW1lbnRzIGNhbm5vdCBiZSBwYXNzZWQgZGlyZWN0bHkgYXMgZW1wdHkgaW50byBhIG1hY3JvCisjZGVmaW5lIF9DMl9BUkdDXzIoLi4uKSBfQzJfQVJHQ18zKF9fVkFfQVJHU19fKQorCisvLy8gXGVuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZBUklBQkxFIEFSR1VNRU5UIENPTlZFUlNJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8vIFxpZiAwCisKKy8vIG1hY3JvcyB0aGF0IGNvbnZlcnQgXzEsIF8yLCBfMywgLi4uIHRvIGZuKF8xLCBhcmcpLCBmbihfMiwgYXJnKSwgZm4oXzMsIGFyZyksIC4uLgorI2RlZmluZSBfQzJfTUFQXzY0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82MyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzYzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82MihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzYyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82MShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzYxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82MChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzYwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81OShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81OChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81NyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81NihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81NShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81NChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81MyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzUzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81MihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzUyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81MShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzUxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81MChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzUwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80OShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80OChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80NyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80NihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80NShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80NChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80MyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80MihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80MShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80MChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zOShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zOChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zNyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zNihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zNShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zNChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zMyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzMzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zMihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzMyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zMShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzMxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zMChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzMwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yOShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yOChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yNyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yNihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yNShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yNChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yMyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzIzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yMihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzIyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yMShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzIxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yMChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzIwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xOShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xOChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xNyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xNihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xNShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xNChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xMyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzEzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xMihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzEyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xMShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzExKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xMChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzEwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF85KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfOShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfOChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzgoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzcoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF83KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzUoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKQorCisvLy8gXGVuZGlmCisKKy8qKgorICogTWFwcyBlYWNoIGFyZ3VtZW50IHVzaW5nIGFub3RoZXIgbWFjcm8geCAtPiBmbih4LCBhcmcpCisgKi8KKy8vIHVzZSB3cmFwcGVyIHRvIGNhbGwgdGhlIHByb3BlciBtYXBwZXIgYmFzZWQgb24gdGhlIG51bWJlciBvZiBhcmd1bWVudHMKKyNkZWZpbmUgX0MyX01BUChmbiwgYXJnLCAuLi4pIF9DMl9NQVBfXyhfQzJfQVJHQyhfX1ZBX0FSR1NfXyksIGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisKKy8vLyBcaWYgMAorCisvLyBldmFsdWF0ZSBfbiBzbyBpdCBiZWNvbWVzIGEgbnVtYmVyCisjZGVmaW5lIF9DMl9NQVBfXyhfbiwgZm4sIGFyZywgLi4uKSBfQzJfTUFQXyhfbiwgZm4sIGFyZywgX19WQV9BUkdTX18pCisvLyBjYWxsIHRoZSBwcm9wZXIgbWFwcGVyCisjZGVmaW5lIF9DMl9NQVBfKF9uLCBmbiwgYXJnLCAuLi4pIF9DMl9NQVBfIyNfbiAoZm4sIGFyZywgX19WQV9BUkdTX18pCisKKy8vLyBcZW5kaWYKKworI2VuZGlmICAvLyBDMlVUSUxTX01BQ1JPX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL2FuZHJvaWQtQzJCdWZmZXIuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvYW5kcm9pZC1DMkJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YmVhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL2FuZHJvaWQtQzJCdWZmZXIuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyQlVGRkVSX0hfCisjZGVmaW5lIEFORFJPSURfQzJCVUZGRVJfSF8KKworI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgorCisvKiBVc2UgYW5kcm9pZCBuYXRpdmUgaGFuZGxlIGZvciBDMkhhbmRsZSAqLwordHlwZWRlZiA6Om5hdGl2ZV9oYW5kbGVfdCBDMkhhbmRsZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIEFuZHJvaWQgcGxhdGZvcm0gYnVmZmVyL21lbW9yeSB1c2FnZSBiaXRzLgorICovCitzdHJ1Y3QgQzJBbmRyb2lkTWVtb3J5VXNhZ2UgOiBwdWJsaWMgQzJNZW1vcnlVc2FnZSB7CisgICAgaW5saW5lIEMyQW5kcm9pZE1lbW9yeVVzYWdlKGNvbnN0IEMyTWVtb3J5VXNhZ2UgJnVzYWdlKSA6IEMyTWVtb3J5VXNhZ2UodXNhZ2UpIHsgfQorCisvLyBwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV1c2UgZ3JhbGxvYyBmbGFncyB3aGVyZSBwb3NzaWJsZSwgYXMgQ29kZWMgMi4wIEFQSSBvbmx5IHVzZXMgYml0cyAwIGFuZCAxLgorICAgICAqLworICAgIGVudW0gY29uc3VtZXJfdCA6IHVpbnQ2NF90IHsKKyAgICAgICAgUkVOREVSU0NSSVBUX1JFQUQgPSBHUkFMTE9DX1VTQUdFX1JFTkRFUlNDUklQVCwKKyAgICAgICAgSFdfVEVYVFVSRV9SRUFEICAgPSBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUsCisgICAgICAgIEhXX0NPTVBPU0VSX1JFQUQgID0gR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUiwKKyAgICAgICAgLy8gZ3JhbGxvYyBkb2VzIG5vdCBkZWZpbmUgYSB2aWRlbyBkZWNvZGVyIHJlYWQgdXNhZ2UgZmxhZywgc28gdXNlIGVuY29kZXIgZm9yCisgICAgICAgIC8vIG5vdworICAgICAgICBIV19DT0RFQ19SRUFEICAgICA9IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiwKKyAgICAgICAgUkVBRF9QUk9URUNURUQgICAgPSBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCwKKyAgICB9OworCisgICAgZW51bSBwcm9kdWNlcl90IDogdWludDY0X3QgeworICAgICAgICBSRU5ERVJTQ1JJUFRfV1JJVEUgPSBHUkFMTE9DX1VTQUdFX1JFTkRFUlNDUklQVCwKKyAgICAgICAgSFdfVEVYVFVSRV9XUklURSAgID0gR1JBTExPQ19VU0FHRV9IV19SRU5ERVIsCisgICAgICAgIEhXX0NPTVBPU0VSX1dSSVRFICA9IEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIgfCBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUiwKKyAgICAgICAgSFdfQ09ERUNfV1JJVEUgICAgID0gR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSLAorICAgICAgICAvLyBncmFsbG9jIGRvZXMgbm90IGRlZmluZSBhIHdyaXRlIHByb3RlY3RlZCB1c2FnZSBmbGFnLCBzbyB1c2UgcmVhZCBwcm90ZWN0ZWQKKyAgICAgICAgLy8gbm93CisgICAgICAgIFdSSVRFX1BST1RFQ1RFRCAgICA9IEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVELAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGZyb20gZ3JhbGxvYyB1c2FnZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgQzJNZW1vcnlVc2FnZSBGcm9tR3JhbGxvY1VzYWdlKHVpbnQ2NF90IHVzYWdlKTsKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdG8gZ3JhbGxvYyB1c2FnZS4KKyAgICAgKi8KKyAgICB1aW50NjRfdCBhc0dyYWxsb2NVc2FnZSgpIGNvbnN0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxMWEwNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2UuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0MyX1YxXzBfSU5QVVRfU1VSRkFDRV9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQzJfVjFfMF9JTlBVVF9TVVJGQUNFX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEdyYXBoaWNCdWZmZXJTb3VyY2U7CisKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3R5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyCisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit0eXBlZGVmIDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlciBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCisvLyBUT0RPOiA6OmFuZHJvaWQ6OlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyPElJbnB1dFN1cmZhY2U+Cit0eXBlZGVmIDo6YW5kcm9pZDo6VFdHcmFwaGljQnVmZmVyUHJvZHVjZXI8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gSW5wdXRTdXJmYWNlQmFzZTsKKworY2xhc3MgSW5wdXRTdXJmYWNlIDogcHVibGljIElucHV0U3VyZmFjZUJhc2UgeworcHVibGljOgorICAgIHZpcnR1YWwgfklucHV0U3VyZmFjZSgpID0gZGVmYXVsdDsKKworICAgIC8vIE1ldGhvZHMgZnJvbSBJSW5wdXRTdXJmYWNlCisgICAgc3A8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4gY29ubmVjdFRvQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPDo6QzJDb21wb25lbnQ+ICZjb21wKTsKKyAgICAvLyBUT0RPOiBpbnRmKCkKKworICAgIHN0YXRpYyBzcDxJbnB1dFN1cmZhY2U+IENyZWF0ZSgpOworCitwcml2YXRlOgorICAgIElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEJHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZiYXNlLAorICAgICAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpHcmFwaGljQnVmZmVyU291cmNlPiAmc291cmNlKTsKKworICAgIHNwPDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9DMl9WMV8wX0lOUFVUX1NVUkZBQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI0YTQxNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9DMl9WMV8wX0lOUFVUX1NVUkZBQ0VfQ09OTkVDVElPTl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQzJfVjFfMF9JTlBVVF9TVVJGQUNFX0NPTk5FQ1RJT05fSAorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCisvLyBUT0RPOiBpbmhlcml0IGZyb20gSUlucHV0U3VyZmFjZUNvbm5lY3Rpb24KK2NsYXNzIElucHV0U3VyZmFjZUNvbm5lY3Rpb24gOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+SW5wdXRTdXJmYWNlQ29ubmVjdGlvbigpOworCisgICAgLy8gRnJvbSBJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbgorICAgIHZvaWQgZGlzY29ubmVjdCgpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBJbnB1dFN1cmZhY2U7CisKKyAgICAvLyBGb3IgSW5wdXRTdXJmYWNlCisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbigKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gJmNvbXApOworICAgIGJvb2wgaW5pdCgpOworCisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbigpID0gZGVsZXRlOworCisgICAgY2xhc3MgSW1wbDsKKworICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8SW1wbD4gbUltcGw7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbnB1dFN1cmZhY2VDb25uZWN0aW9uKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9DMl9WMV8wX0lOUFVUX1NVUkZBQ0VfQ09OTkVDVElPTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZG9jcy9kb3h5ZmlsdGVyLnNoIGIvbWVkaWEvY29kZWMyL2RvY3MvZG94eWZpbHRlci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kODEzMTUzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2RvY3MvZG94eWZpbHRlci5zaApAQCAtMCwwICsxLDEwMCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMworaW1wb3J0IHJlLCBzeXMKKworZ2xvYmFsIGluX2NvbW1lbnQsIGN1cnJlbnQsIGluZGVudCwgaG9sZAoraW5fY29tbWVudCwgY3VycmVudCwgaW5kZW50LCBob2xkID0gRmFsc2UsIE5vbmUsICcnLCBbXQorCitjbGFzcyBDaGFuZ2VDU3R5bGVDb21tZW50c1RvRG94eToKKyAgICBkZWYgZHVtcF9ob2xkKCk6CisgICAgICAgIGdsb2JhbCBob2xkCisgICAgICAgIGZvciBoIGluIGhvbGQ6CisgICAgICAgICAgICBwcmludChoLCBlbmQ9JycpCisgICAgICAgIGhvbGRbOl0gPSBbXQorCisgICAgZGVmIGRveHlfaG9sZCgpOgorICAgICAgICBnbG9iYWwgY3VycmVudCwgaG9sZAorICAgICAgICBpZiBjdXJyZW50ID09ICcvLyc6CisgICAgICAgICAgICBmb3IgaCBpbiBob2xkOgorICAgICAgICAgICAgICAgIHByaW50KHJlLnN1YihyJ14oICovLyg/IS8pKScsIHInXDEvJywgaCksIGVuZD0nJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpcnN0ID0gVHJ1ZQorICAgICAgICAgICAgZm9yIGggaW4gaG9sZDoKKyAgICAgICAgICAgICAgICBpZiBmaXJzdDoKKyAgICAgICAgICAgICAgICAgICAgaCA9IHJlLnN1YihyJ14oICovWypdKD8hWypdKSknLCByJ1wxKicsIGgpCisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gRmFsc2UKKyAgICAgICAgICAgICAgICBwcmludChoLCBlbmQ9JycpCisgICAgICAgIGhvbGRbOl0gPSBbXQorCisgICAgZGVmIHByb2Nlc3NfY29tbWVudCh0LCBpbmQsIGxpbmUpOgorICAgICAgICBnbG9iYWwgY3VycmVudCwgaW5kZW50LCBob2xkCisgICAgICAgIGlmIHQgIT0gY3VycmVudCBvciBpbmQgbm90IGluIChpbmRlbnQsIGluZGVudCArICcgJyk6CisgICAgICAgICAgICBkdW1wX2hvbGQoKQorICAgICAgICAgICAgY3VycmVudCwgaW5kZW50ID0gdCwgaW5kCisgICAgICAgIGhvbGQuYXBwZW5kKGxpbmUpCisKKyAgICBkZWYgcHJvY2Vzc19saW5lKGluZCwgbGluZSk6CisgICAgICAgIGdsb2JhbCBjdXJyZW50LCBpbmRlbnQKKyAgICAgICAgaWYgaW5kIGluIChpbmRlbnQsICcnKToKKyAgICAgICAgICAgIGRveHlfaG9sZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkdW1wX2hvbGQoKQorICAgICAgICBjdXJyZW50LCBpbmRlbnQgPSBOb25lLCBOb25lCisgICAgICAgIHByaW50KGxpbmUsIGVuZD0nJykKKworICAgIGRlZiBwcm9jZXNzKHNlbGYsIGlucHV0LCBwYXRoKToKKyAgICAgICAgZm9yIGxpbmUgaW4gaW5wdXQ6CisgICAgICAgICAgICBpbmQgPSByZS5tYXRjaChyJ14oICopJywgbGluZSkuZ3JvdXAoMSkKKyAgICAgICAgICAgIGlmIGluX2NvbW1lbnQ6CisgICAgICAgICAgICAgICAgIyBUT0RPOiB0aGlzIGlzIG5vdCBxdWl0ZSByaWdodCwgYnV0IGdvb2QgZW5vdWdoCisgICAgICAgICAgICAgICAgbSA9IHJlLm1hdGNoKHInXiAqWypdLycsIGxpbmUpCisgICAgICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc19jb21tZW50KCcvKicsIGluZCwgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgaW5fY29tbWVudCA9IEZhbHNlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc19jb21tZW50KCcvKicsIGluZCwgbGluZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbSA9IHJlLm1hdGNoKHInXiAqLy8nLCBsaW5lKQorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICAjIG9uZS1saW5lIGNvbW1lbnQKKyAgICAgICAgICAgICAgICBwcm9jZXNzX2NvbW1lbnQoJy8vJywgaW5kLCBsaW5lKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBtID0gcmUubWF0Y2gocideICovWypdJywgbGluZSkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgIyBtdWx0aS1saW5lIGNvbW1lbnQKKyAgICAgICAgICAgICAgICBwcm9jZXNzX2NvbW1lbnQoJy8qJywgaW5kLCBsaW5lKQorICAgICAgICAgICAgICAgICMgVE9ETzogdGhpcyBpcyBub3QgcXVpdGUgcmlnaHQsIGJ1dCBnb29kIGVub3VnaAorICAgICAgICAgICAgICAgIGluX2NvbW1lbnQgPSBub3QgcmUubWF0Y2gocideICpbKl0vJywgbGluZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgcHJvY2Vzc19saW5lKGluZCwgbGluZSkKKworY2xhc3MgQXV0b0dyb3VwOgorICAgIGRlZiBwcm9jZXNzKHNlbGYsIGlucHV0LCBwYXRoKToKKyAgICAgICAgaWYgJy9jb2RlYzIvaW5jbHVkZS8nIGluIHBhdGg6CisgICAgICAgICAgICBncm91cCA9ICdBUEkgQ29kZWMyIEFQSScKKyAgICAgICAgZWxpZiBGYWxzZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmICcvY29kZWMyL3ZuZGsvJyBpbiBwYXRoOgorICAgICAgICAgICAgZ3JvdXAgPSAnVk5ESyBQbGF0Zm9ybSBwcm92aWRlZCBnbHVlJworICAgICAgICBlbGlmICcvY29kZWMyL3Rlc3RzLycgaW4gcGF0aDoKKyAgICAgICAgICAgIGdyb3VwID0gJ1Rlc3RzIFVuaXQgdGVzdHMnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBncm91cCA9ICdSYW5kb20gTWlzYy4gc2FuZGJveCcKKworICAgICAgICBwcmludCgnI3VuZGVmIF9fQVBQTEVfXycpCisKKyAgICAgICAgZm9yIGxpbmUgaW4gaW5wdXQ6CisgICAgICAgICAgICBpZiByZS5tYXRjaChyJ15uYW1lc3BhY2UgYW5kcm9pZCB7JywgbGluZSk6CisgICAgICAgICAgICAgICAgcHJpbnQobGluZSwgZW5kPScnKQorICAgICAgICAgICAgICAgIHByaW50KCkKKyAgICAgICAgICAgICAgICBwcmludChyJy8vLyBcYWRkdG9ncm91cCB7fScuZm9ybWF0KGdyb3VwKSkKKyAgICAgICAgICAgICAgICBwcmludChyJy8vLyBAeycpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgcmUubWF0Y2gocidefSArLy8gK25hbWVzcGFjZScsIGxpbmUpOgorICAgICAgICAgICAgICAgIHByaW50KHInLy8vIEB9JykKKyAgICAgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICBwcmludChsaW5lLCBlbmQ9JycpCisKK1AgPSBBdXRvR3JvdXAoKQorZm9yIHBhdGggaW4gc3lzLmFyZ3ZbMTpdOgorICAgIHdpdGggb3BlbihwYXRoLCAncnQnKSBhcyBpbnB1dDoKKyAgICAgICAgUC5wcm9jZXNzKGlucHV0LCBwYXRoKQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2RvY3MvZG94eWdlbi5jb25maWcgYi9tZWRpYS9jb2RlYzIvZG9jcy9kb3h5Z2VuLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzNiZWEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2RvY3MvZG94eWdlbi5jb25maWcKQEAgLTAsMCArMSwyNDQ2IEBACisjIERveHlmaWxlIDEuOC4xMQorCisjIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHNldHRpbmdzIHRvIGJlIHVzZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtCisjIGRveHlnZW4gKHd3dy5kb3h5Z2VuLm9yZykgZm9yIGEgcHJvamVjdC4KKyMKKyMgQWxsIHRleHQgYWZ0ZXIgYSBkb3VibGUgaGFzaCAoIyMpIGlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCBpcyBwbGFjZWQgaW4KKyMgZnJvbnQgb2YgdGhlIFRBRyBpdCBpcyBwcmVjZWRpbmcuCisjCisjIEFsbCB0ZXh0IGFmdGVyIGEgc2luZ2xlIGhhc2ggKCMpIGlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCB3aWxsIGJlIGlnbm9yZWQuCisjIFRoZSBmb3JtYXQgaXM6CisjIFRBRyA9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBGb3IgbGlzdHMsIGl0ZW1zIGNhbiBhbHNvIGJlIGFwcGVuZGVkIHVzaW5nOgorIyBUQUcgKz0gdmFsdWUgW3ZhbHVlLCAuLi5dCisjIFZhbHVlcyB0aGF0IGNvbnRhaW4gc3BhY2VzIHNob3VsZCBiZSBwbGFjZWQgYmV0d2VlbiBxdW90ZXMgKFwiIFwiKS4KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9qZWN0IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhpcyB0YWcgc3BlY2lmaWVzIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgY2hhcmFjdGVycyBpbiB0aGUgY29uZmlnIGZpbGUKKyMgdGhhdCBmb2xsb3cuIFRoZSBkZWZhdWx0IGlzIFVURi04IHdoaWNoIGlzIGFsc28gdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbCB0ZXh0CisjIGJlZm9yZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGlzIHRhZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUgaWNvbnYKKyMgYnVpbHQgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252CisjIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBVVEYtOC4KKworRE9YWUZJTEVfRU5DT0RJTkcgICAgICA9IFVURi04CisKKyMgVGhlIFBST0pFQ1RfTkFNRSB0YWcgaXMgYSBzaW5nbGUgd29yZCAob3IgYSBzZXF1ZW5jZSBvZiB3b3JkcyBzdXJyb3VuZGVkIGJ5CisjIGRvdWJsZS1xdW90ZXMsIHVubGVzcyB5b3UgYXJlIHVzaW5nIERveHl3aXphcmQpIHRoYXQgc2hvdWxkIGlkZW50aWZ5IHRoZQorIyBwcm9qZWN0IGZvciB3aGljaCB0aGUgZG9jdW1lbnRhdGlvbiBpcyBnZW5lcmF0ZWQuIFRoaXMgbmFtZSBpcyB1c2VkIGluIHRoZQorIyB0aXRsZSBvZiBtb3N0IGdlbmVyYXRlZCBwYWdlcyBhbmQgaW4gYSBmZXcgb3RoZXIgcGxhY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTXkgUHJvamVjdC4KKworUFJPSkVDVF9OQU1FICAgICAgICAgICA9IENvZGVjMgorCisjIFRoZSBQUk9KRUNUX05VTUJFUiB0YWcgY2FuIGJlIHVzZWQgdG8gZW50ZXIgYSBwcm9qZWN0IG9yIHJldmlzaW9uIG51bWJlci4gVGhpcworIyBjb3VsZCBiZSBoYW5keSBmb3IgYXJjaGl2aW5nIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiBvciBpZiBzb21lIHZlcnNpb24KKyMgY29udHJvbCBzeXN0ZW0gaXMgdXNlZC4KKworUFJPSkVDVF9OVU1CRVIgICAgICAgICA9IAorCisjIFVzaW5nIHRoZSBQUk9KRUNUX0JSSUVGIHRhZyBvbmUgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWwgb25lIGxpbmUgZGVzY3JpcHRpb24KKyMgZm9yIGEgcHJvamVjdCB0aGF0IGFwcGVhcnMgYXQgdGhlIHRvcCBvZiBlYWNoIHBhZ2UgYW5kIHNob3VsZCBnaXZlIHZpZXdlciBhCisjIHF1aWNrIGlkZWEgYWJvdXQgdGhlIHB1cnBvc2Ugb2YgdGhlIHByb2plY3QuIEtlZXAgdGhlIGRlc2NyaXB0aW9uIHNob3J0LgorCitQUk9KRUNUX0JSSUVGICAgICAgICAgID0gCisKKyMgV2l0aCB0aGUgUFJPSkVDVF9MT0dPIHRhZyBvbmUgY2FuIHNwZWNpZnkgYSBsb2dvIG9yIGFuIGljb24gdGhhdCBpcyBpbmNsdWRlZAorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSBsb2dvIHNob3VsZCBub3QgZXhjZWVkIDU1CisjIHBpeGVscyBhbmQgdGhlIG1heGltdW0gd2lkdGggc2hvdWxkIG5vdCBleGNlZWQgMjAwIHBpeGVscy4gRG94eWdlbiB3aWxsIGNvcHkKKyMgdGhlIGxvZ28gdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuCisKK1BST0pFQ1RfTE9HTyAgICAgICAgICAgPSAKKworIyBUaGUgT1VUUFVUX0RJUkVDVE9SWSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAocmVsYXRpdmUgb3IgYWJzb2x1dGUpIHBhdGgKKyMgaW50byB3aGljaCB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBiZSB3cml0dGVuLiBJZiBhIHJlbGF0aXZlIHBhdGggaXMKKyMgZW50ZXJlZCwgaXQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gd2hlcmUgZG94eWdlbiB3YXMgc3RhcnRlZC4gSWYKKyMgbGVmdCBibGFuayB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2lsbCBiZSB1c2VkLgorCitPVVRQVVRfRElSRUNUT1JZICAgICAgID0gb3V0L3RhcmdldC9jb21tb24vZG9jcy9jb2RlYzIvYXBpCisKKyMgSWYgdGhlIENSRUFURV9TVUJESVJTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGNyZWF0ZSA0MDk2IHN1Yi0KKyMgZGlyZWN0b3JpZXMgKGluIDIgbGV2ZWxzKSB1bmRlciB0aGUgb3V0cHV0IGRpcmVjdG9yeSBvZiBlYWNoIG91dHB1dCBmb3JtYXQgYW5kCisjIHdpbGwgZGlzdHJpYnV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIG92ZXIgdGhlc2UgZGlyZWN0b3JpZXMuIEVuYWJsaW5nIHRoaXMKKyMgb3B0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiBmZWVkaW5nIGRveHlnZW4gYSBodWdlIGFtb3VudCBvZiBzb3VyY2UgZmlsZXMsIHdoZXJlCisjIHB1dHRpbmcgYWxsIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd291bGQgb3RoZXJ3aXNlIGNhdXNlcworIyBwZXJmb3JtYW5jZSBwcm9ibGVtcyBmb3IgdGhlIGZpbGUgc3lzdGVtLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0NSRUFURV9TVUJESVJTICAgICAgICAgPSBOTworCisjIElmIHRoZSBBTExPV19VTklDT0RFX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgYWxsb3cgbm9uLUFTQ0lJCisjIGNoYXJhY3RlcnMgdG8gYXBwZWFyIGluIHRoZSBuYW1lcyBvZiBnZW5lcmF0ZWQgZmlsZXMuIElmIHNldCB0byBOTywgbm9uLUFTQ0lJCisjIGNoYXJhY3RlcnMgd2lsbCBiZSBlc2NhcGVkLCBmb3IgZXhhbXBsZSBfeEUzX3g4MV94ODQgd2lsbCBiZSB1c2VkIGZvciBVbmljb2RlCisjIFUrMzA0NC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitBTExPV19VTklDT0RFX05BTUVTICAgID0gTk8KKworIyBUaGUgT1VUUFVUX0xBTkdVQUdFIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGxhbmd1YWdlIGluIHdoaWNoIGFsbAorIyBkb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBieSBkb3h5Z2VuIGlzIHdyaXR0ZW4uIERveHlnZW4gd2lsbCB1c2UgdGhpcworIyBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSBhbGwgY29uc3RhbnQgb3V0cHV0IGluIHRoZSBwcm9wZXIgbGFuZ3VhZ2UuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IEFmcmlrYWFucywgQXJhYmljLCBBcm1lbmlhbiwgQnJhemlsaWFuLCBDYXRhbGFuLCBDaGluZXNlLAorIyBDaGluZXNlLVRyYWRpdGlvbmFsLCBDcm9hdGlhbiwgQ3plY2gsIERhbmlzaCwgRHV0Y2gsIEVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpLAorIyBFc3BlcmFudG8sIEZhcnNpIChQZXJzaWFuKSwgRmlubmlzaCwgRnJlbmNoLCBHZXJtYW4sIEdyZWVrLCBIdW5nYXJpYW4sCisjIEluZG9uZXNpYW4sIEl0YWxpYW4sIEphcGFuZXNlLCBKYXBhbmVzZS1lbiAoSmFwYW5lc2Ugd2l0aCBFbmdsaXNoIG1lc3NhZ2VzKSwKKyMgS29yZWFuLCBLb3JlYW4tZW4gKEtvcmVhbiB3aXRoIEVuZ2xpc2ggbWVzc2FnZXMpLCBMYXR2aWFuLCBMaXRodWFuaWFuLAorIyBNYWNlZG9uaWFuLCBOb3J3ZWdpYW4sIFBlcnNpYW4gKEZhcnNpKSwgUG9saXNoLCBQb3J0dWd1ZXNlLCBSb21hbmlhbiwgUnVzc2lhbiwKKyMgU2VyYmlhbiwgU2VyYmlhbi1DeXJpbGxpYywgU2xvdmFrLCBTbG92ZW5lLCBTcGFuaXNoLCBTd2VkaXNoLCBUdXJraXNoLAorIyBVa3JhaW5pYW4gYW5kIFZpZXRuYW1lc2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBFbmdsaXNoLgorCitPVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaAorCisjIElmIHRoZSBCUklFRl9NRU1CRVJfREVTQyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGluY2x1ZGUgYnJpZWYgbWVtYmVyCisjIGRlc2NyaXB0aW9ucyBhZnRlciB0aGUgbWVtYmVycyB0aGF0IGFyZSBsaXN0ZWQgaW4gdGhlIGZpbGUgYW5kIGNsYXNzCisjIGRvY3VtZW50YXRpb24gKHNpbWlsYXIgdG8gSmF2YWRvYykuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0JSSUVGX01FTUJFUl9ERVNDICAgICAgPSBZRVMKKworIyBJZiB0aGUgUkVQRUFUX0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgcHJlcGVuZCB0aGUgYnJpZWYKKyMgZGVzY3JpcHRpb24gb2YgYSBtZW1iZXIgb3IgZnVuY3Rpb24gYmVmb3JlIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbgorIworIyBOb3RlOiBJZiBib3RoIEhJREVfVU5ET0NfTUVNQkVSUyBhbmQgQlJJRUZfTUVNQkVSX0RFU0MgYXJlIHNldCB0byBOTywgdGhlCisjIGJyaWVmIGRlc2NyaXB0aW9ucyB3aWxsIGJlIGNvbXBsZXRlbHkgc3VwcHJlc3NlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworUkVQRUFUX0JSSUVGICAgICAgICAgICA9IFlFUworCisjIFRoaXMgdGFnIGltcGxlbWVudHMgYSBxdWFzaS1pbnRlbGxpZ2VudCBicmllZiBkZXNjcmlwdGlvbiBhYmJyZXZpYXRvciB0aGF0IGlzCisjIHVzZWQgdG8gZm9ybSB0aGUgdGV4dCBpbiB2YXJpb3VzIGxpc3RpbmdzLiBFYWNoIHN0cmluZyBpbiB0aGlzIGxpc3QsIGlmIGZvdW5kCisjIGFzIHRoZSBsZWFkaW5nIHRleHQgb2YgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLCB3aWxsIGJlIHN0cmlwcGVkIGZyb20gdGhlIHRleHQKKyMgYW5kIHRoZSByZXN1bHQsIGFmdGVyIHByb2Nlc3NpbmcgdGhlIHdob2xlIGxpc3QsIGlzIHVzZWQgYXMgdGhlIGFubm90YXRlZAorIyB0ZXh0LiBPdGhlcndpc2UsIHRoZSBicmllZiBkZXNjcmlwdGlvbiBpcyB1c2VkIGFzLWlzLiBJZiBsZWZ0IGJsYW5rLCB0aGUKKyMgZm9sbG93aW5nIHZhbHVlcyBhcmUgdXNlZCAoJG5hbWUgaXMgYXV0b21hdGljYWxseSByZXBsYWNlZCB3aXRoIHRoZSBuYW1lIG9mCisjIHRoZSBlbnRpdHkpOlRoZSAkbmFtZSBjbGFzcywgVGhlICRuYW1lIHdpZGdldCwgVGhlICRuYW1lIGZpbGUsIGlzLCBwcm92aWRlcywKKyMgc3BlY2lmaWVzLCBjb250YWlucywgcmVwcmVzZW50cywgYSwgYW4gYW5kIHRoZS4KKworQUJCUkVWSUFURV9CUklFRiAgICAgICA9ICJUaGUgJG5hbWUgY2xhc3MiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICRuYW1lIHdpZGdldCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgJG5hbWUgZmlsZSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50cyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYW4gXAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZQorCisjIElmIHRoZSBBTFdBWVNfREVUQUlMRURfU0VDIGFuZCBSRVBFQVRfQlJJRUYgdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTIHRoZW4KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGV0YWlsZWQgc2VjdGlvbiBldmVuIGlmIHRoZXJlIGlzIG9ubHkgYSBicmllZgorIyBkZXNjcmlwdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitBTFdBWVNfREVUQUlMRURfU0VDICAgID0gTk8KKworIyBJZiB0aGUgSU5MSU5FX0lOSEVSSVRFRF9NRU1CIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgc2hvdyBhbGwKKyMgaW5oZXJpdGVkIG1lbWJlcnMgb2YgYSBjbGFzcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGNsYXNzIGFzIGlmIHRob3NlCisjIG1lbWJlcnMgd2VyZSBvcmRpbmFyeSBjbGFzcyBtZW1iZXJzLiBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzIGFuZCBhc3NpZ25tZW50CisjIG9wZXJhdG9ycyBvZiB0aGUgYmFzZSBjbGFzc2VzIHdpbGwgbm90IGJlIHNob3duLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOTElORV9JTkhFUklURURfTUVNQiAgPSBZRVMKKworIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgcHJlcGVuZCB0aGUgZnVsbCBwYXRoCisjIGJlZm9yZSBmaWxlcyBuYW1lIGluIHRoZSBmaWxlIGxpc3QgYW5kIGluIHRoZSBoZWFkZXIgZmlsZXMuIElmIHNldCB0byBOTyB0aGUKKyMgc2hvcnRlc3QgcGF0aCB0aGF0IG1ha2VzIHRoZSBmaWxlIG5hbWUgdW5pcXVlIHdpbGwgYmUgdXNlZAorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitGVUxMX1BBVEhfTkFNRVMgICAgICAgID0gWUVTCisKKyMgVGhlIFNUUklQX0ZST01fUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUgcGF0aC4KKyMgU3RyaXBwaW5nIGlzIG9ubHkgZG9uZSBpZiBvbmUgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIG1hdGNoZXMgdGhlIGxlZnQtaGFuZAorIyBwYXJ0IG9mIHRoZSBwYXRoLiBUaGUgdGFnIGNhbiBiZSB1c2VkIHRvIHNob3cgcmVsYXRpdmUgcGF0aHMgaW4gdGhlIGZpbGUgbGlzdC4KKyMgSWYgbGVmdCBibGFuayB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcyBydW4gaXMgdXNlZCBhcyB0aGUgcGF0aCB0bworIyBzdHJpcC4KKyMKKyMgTm90ZSB0aGF0IHlvdSBjYW4gc3BlY2lmeSBhYnNvbHV0ZSBwYXRocyBoZXJlLCBidXQgYWxzbyByZWxhdGl2ZSBwYXRocywgd2hpY2gKKyMgd2lsbCBiZSByZWxhdGl2ZSBmcm9tIHRoZSBkaXJlY3Rvcnkgd2hlcmUgZG94eWdlbiBpcyBzdGFydGVkLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRlVMTF9QQVRIX05BTUVTIGlzIHNldCB0byBZRVMuCisKK1NUUklQX0ZST01fUEFUSCAgICAgICAgPSBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMgorCisjIFRoZSBTVFJJUF9GUk9NX0lOQ19QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mIHRoZQorIyBwYXRoIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIGNsYXNzLCB3aGljaCB0ZWxscyB0aGUgcmVhZGVyIHdoaWNoCisjIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIGEgY2xhc3MuIElmIGxlZnQgYmxhbmsgb25seSB0aGUgbmFtZSBvZgorIyB0aGUgaGVhZGVyIGZpbGUgY29udGFpbmluZyB0aGUgY2xhc3MgZGVmaW5pdGlvbiBpcyB1c2VkLiBPdGhlcndpc2Ugb25lIHNob3VsZAorIyBzcGVjaWZ5IHRoZSBsaXN0IG9mIGluY2x1ZGUgcGF0aHMgdGhhdCBhcmUgbm9ybWFsbHkgcGFzc2VkIHRvIHRoZSBjb21waWxlcgorIyB1c2luZyB0aGUgLUkgZmxhZy4KKworU1RSSVBfRlJPTV9JTkNfUEFUSCAgICA9IAorCisjIElmIHRoZSBTSE9SVF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIG11Y2ggc2hvcnRlciAoYnV0CisjIGxlc3MgcmVhZGFibGUpIGZpbGUgbmFtZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpcyB5b3VyIGZpbGUgc3lzdGVtcyBkb2Vzbid0CisjIHN1cHBvcnQgbG9uZyBuYW1lcyBsaWtlIG9uIERPUywgTWFjLCBvciBDRC1ST00uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0hPUlRfTkFNRVMgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEpBVkFET0NfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGludGVycHJldCB0aGUKKyMgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBKYXZhZG9jLXN0eWxlIGNvbW1lbnQgYXMgdGhlIGJyaWVmCisjIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBKYXZhZG9jLXN0eWxlIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LQorIyBzdHlsZSBjb21tZW50cyAodGh1cyByZXF1aXJpbmcgYW4gZXhwbGljaXQgQGJyaWVmIGNvbW1hbmQgZm9yIGEgYnJpZWYKKyMgZGVzY3JpcHRpb24uKQorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0pBVkFET0NfQVVUT0JSSUVGICAgICAgPSBZRVMKKworIyBJZiB0aGUgUVRfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGludGVycHJldCB0aGUgZmlyc3QKKyMgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBRdC1zdHlsZSBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYKKyMgc2V0IHRvIE5PLCB0aGUgUXQtc3R5bGUgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMgKHRodXMKKyMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IFxicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitRVF9BVVRPQlJJRUYgICAgICAgICAgID0gWUVTCisKKyMgVGhlIE1VTFRJTElORV9DUFBfSVNfQlJJRUYgdGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIG1ha2UgZG94eWdlbiB0cmVhdCBhCisjIG11bHRpLWxpbmUgQysrIHNwZWNpYWwgY29tbWVudCBibG9jayAoaS5lLiBhIGJsb2NrIG9mIC8vISBvciAvLy8gY29tbWVudHMpIGFzCisjIGEgYnJpZWYgZGVzY3JpcHRpb24uIFRoaXMgdXNlZCB0byBiZSB0aGUgZGVmYXVsdCBiZWhhdmlvci4gVGhlIG5ldyBkZWZhdWx0IGlzCisjIHRvIHRyZWF0IGEgbXVsdGktbGluZSBDKysgY29tbWVudCBibG9jayBhcyBhIGRldGFpbGVkIGRlc2NyaXB0aW9uLiBTZXQgdGhpcworIyB0YWcgdG8gWUVTIGlmIHlvdSBwcmVmZXIgdGhlIG9sZCBiZWhhdmlvciBpbnN0ZWFkLgorIworIyBOb3RlIHRoYXQgc2V0dGluZyB0aGlzIHRhZyB0byBZRVMgYWxzbyBtZWFucyB0aGF0IHJhdGlvbmFsIHJvc2UgY29tbWVudHMgYXJlCisjIG5vdCByZWNvZ25pemVkIGFueSBtb3JlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK01VTFRJTElORV9DUFBfSVNfQlJJRUYgPSBOTworCisjIElmIHRoZSBJTkhFUklUX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhbiB1bmRvY3VtZW50ZWQgbWVtYmVyIGluaGVyaXRzIHRoZQorIyBkb2N1bWVudGF0aW9uIGZyb20gYW55IGRvY3VtZW50ZWQgbWVtYmVyIHRoYXQgaXQgcmUtaW1wbGVtZW50cy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworSU5IRVJJVF9ET0NTICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBTRVBBUkFURV9NRU1CRVJfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgcHJvZHVjZSBhIG5ldworIyBwYWdlIGZvciBlYWNoIG1lbWJlci4gSWYgc2V0IHRvIE5PLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIG1lbWJlciB3aWxsIGJlIHBhcnQKKyMgb2YgdGhlIGZpbGUvY2xhc3MvbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgaXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0VQQVJBVEVfTUVNQkVSX1BBR0VTICA9IE5PCisKKyMgVGhlIFRBQl9TSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBzcGFjZXMgaW4gYSB0YWIuIERveHlnZW4KKyMgdXNlcyB0aGlzIHZhbHVlIHRvIHJlcGxhY2UgdGFicyBieSBzcGFjZXMgaW4gY29kZSBmcmFnbWVudHMuCisjIE1pbmltdW0gdmFsdWU6IDEsIG1heGltdW0gdmFsdWU6IDE2LCBkZWZhdWx0IHZhbHVlOiA0LgorCitUQUJfU0laRSAgICAgICAgICAgICAgID0gNAorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2YgYWxpYXNlcyB0aGF0IGFjdCBhcyBjb21tYW5kcyBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbi4gQW4gYWxpYXMgaGFzIHRoZSBmb3JtOgorIyBuYW1lPXZhbHVlCisjIEZvciBleGFtcGxlIGFkZGluZworIyAic2lkZWVmZmVjdD1AcGFyIFNpZGUgRWZmZWN0czpcbiIKKyMgd2lsbCBhbGxvdyB5b3UgdG8gcHV0IHRoZSBjb21tYW5kIFxzaWRlZWZmZWN0IChvciBAc2lkZWVmZmVjdCkgaW4gdGhlCisjIGRvY3VtZW50YXRpb24sIHdoaWNoIHdpbGwgcmVzdWx0IGluIGEgdXNlci1kZWZpbmVkIHBhcmFncmFwaCB3aXRoIGhlYWRpbmcKKyMgIlNpZGUgRWZmZWN0czoiLiBZb3UgY2FuIHB1dCBcbidzIGluIHRoZSB2YWx1ZSBwYXJ0IG9mIGFuIGFsaWFzIHRvIGluc2VydAorIyBuZXdsaW5lcy4KKworQUxJQVNFUyAgICAgICAgICAgICAgICA9IAorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2Ygd29yZC1rZXl3b3JkIG1hcHBpbmdzIChUQ0wgb25seSkuCisjIEEgbWFwcGluZyBoYXMgdGhlIGZvcm0gIm5hbWU9dmFsdWUiLiBGb3IgZXhhbXBsZSBhZGRpbmcgImNsYXNzPWl0Y2w6OmNsYXNzIgorIyB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhlIGNvbW1hbmQgY2xhc3MgaW4gdGhlIGl0Y2w6OmNsYXNzIG1lYW5pbmcuCisKK1RDTF9TVUJTVCAgICAgICAgICAgICAgPSAKKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9GT1JfQyB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBDIHNvdXJjZXMKKyMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IgQy4gRm9yCisjIGluc3RhbmNlLCBzb21lIG9mIHRoZSBuYW1lcyB0aGF0IGFyZSB1c2VkIHdpbGwgYmUgZGlmZmVyZW50LiBUaGUgbGlzdCBvZiBhbGwKKyMgbWVtYmVycyB3aWxsIGJlIG9taXR0ZWQsIGV0Yy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfRk9SX0MgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9KQVZBIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEphdmEgb3IKKyMgUHl0aG9uIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZAorIyBmb3IgdGhhdCBsYW5ndWFnZS4gRm9yIGluc3RhbmNlLCBuYW1lc3BhY2VzIHdpbGwgYmUgcHJlc2VudGVkIGFzIHBhY2thZ2VzLAorIyBxdWFsaWZpZWQgc2NvcGVzIHdpbGwgbG9vayBkaWZmZXJlbnQsIGV0Yy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfSkFWQSAgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX0ZPUl9GT1JUUkFOIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEZvcnRyYW4KKyMgc291cmNlcy4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgdGFpbG9yZWQgZm9yIEZvcnRyYW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfRk9SX0ZPUlRSQU4gICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfVkhETCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBWSERMCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvciBWSERMLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK09QVElNSVpFX09VVFBVVF9WSERMICAgPSBOTworCisjIERveHlnZW4gc2VsZWN0cyB0aGUgcGFyc2VyIHRvIHVzZSBkZXBlbmRpbmcgb24gdGhlIGV4dGVuc2lvbiBvZiB0aGUgZmlsZXMgaXQKKyMgcGFyc2VzLiBXaXRoIHRoaXMgdGFnIHlvdSBjYW4gYXNzaWduIHdoaWNoIHBhcnNlciB0byB1c2UgZm9yIGEgZ2l2ZW4KKyMgZXh0ZW5zaW9uLiBEb3h5Z2VuIGhhcyBhIGJ1aWx0LWluIG1hcHBpbmcsIGJ1dCB5b3UgY2FuIG92ZXJyaWRlIG9yIGV4dGVuZCBpdAorIyB1c2luZyB0aGlzIHRhZy4gVGhlIGZvcm1hdCBpcyBleHQ9bGFuZ3VhZ2UsIHdoZXJlIGV4dCBpcyBhIGZpbGUgZXh0ZW5zaW9uLCBhbmQKKyMgbGFuZ3VhZ2UgaXMgb25lIG9mIHRoZSBwYXJzZXJzIHN1cHBvcnRlZCBieSBkb3h5Z2VuOiBJREwsIEphdmEsIEphdmFzY3JpcHQsCisjIEMjLCBDLCBDKyssIEQsIFBIUCwgT2JqZWN0aXZlLUMsIFB5dGhvbiwgRm9ydHJhbiAoZml4ZWQgZm9ybWF0IEZvcnRyYW46CisjIEZvcnRyYW5GaXhlZCwgZnJlZSBmb3JtYXR0ZWQgRm9ydHJhbjogRm9ydHJhbkZyZWUsIHVua25vd24gZm9ybWF0dGVkIEZvcnRyYW46CisjIEZvcnRyYW4uIEluIHRoZSBsYXRlciBjYXNlIHRoZSBwYXJzZXIgdHJpZXMgdG8gZ3Vlc3Mgd2hldGhlciB0aGUgY29kZSBpcyBmaXhlZAorIyBvciBmcmVlIGZvcm1hdHRlZCBjb2RlLCB0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBGb3J0cmFuIHR5cGUgZmlsZXMpLCBWSERMLiBGb3IKKyMgaW5zdGFuY2UgdG8gbWFrZSBkb3h5Z2VuIHRyZWF0IC5pbmMgZmlsZXMgYXMgRm9ydHJhbiBmaWxlcyAoZGVmYXVsdCBpcyBQSFApLAorIyBhbmQgLmYgZmlsZXMgYXMgQyAoZGVmYXVsdCBpcyBGb3J0cmFuKSwgdXNlOiBpbmM9Rm9ydHJhbiBmPUMuCisjCisjIE5vdGU6IEZvciBmaWxlcyB3aXRob3V0IGV4dGVuc2lvbiB5b3UgY2FuIHVzZSBub19leHRlbnNpb24gYXMgYSBwbGFjZWhvbGRlci4KKyMKKyMgTm90ZSB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyB5b3UgYWxzbyBuZWVkIHRvIHNldCBGSUxFX1BBVFRFUk5TIG90aGVyd2lzZQorIyB0aGUgZmlsZXMgYXJlIG5vdCByZWFkIGJ5IGRveHlnZW4uCisKK0VYVEVOU0lPTl9NQVBQSU5HICAgICAgPSAKKworIyBJZiB0aGUgTUFSS0RPV05fU1VQUE9SVCB0YWcgaXMgZW5hYmxlZCB0aGVuIGRveHlnZW4gcHJlLXByb2Nlc3NlcyBhbGwgY29tbWVudHMKKyMgYWNjb3JkaW5nIHRvIHRoZSBNYXJrZG93biBmb3JtYXQsIHdoaWNoIGFsbG93cyBmb3IgbW9yZSByZWFkYWJsZQorIyBkb2N1bWVudGF0aW9uLiBTZWUgaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi8gZm9yIGRldGFpbHMuCisjIFRoZSBvdXRwdXQgb2YgbWFya2Rvd24gcHJvY2Vzc2luZyBpcyBmdXJ0aGVyIHByb2Nlc3NlZCBieSBkb3h5Z2VuLCBzbyB5b3UgY2FuCisjIG1peCBkb3h5Z2VuLCBIVE1MLCBhbmQgWE1MIGNvbW1hbmRzIHdpdGggTWFya2Rvd24gZm9ybWF0dGluZy4gRGlzYWJsZSBvbmx5IGluCisjIGNhc2Ugb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0aWVzIGlzc3Vlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworTUFSS0RPV05fU1VQUE9SVCAgICAgICA9IFlFUworCisjIFdoZW4gZW5hYmxlZCBkb3h5Z2VuIHRyaWVzIHRvIGxpbmsgd29yZHMgdGhhdCBjb3JyZXNwb25kIHRvIGRvY3VtZW50ZWQKKyMgY2xhc3Nlcywgb3IgbmFtZXNwYWNlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIGRvY3VtZW50YXRpb24uIFN1Y2ggYSBsaW5rIGNhbgorIyBiZSBwcmV2ZW50ZWQgaW4gaW5kaXZpZHVhbCBjYXNlcyBieSBwdXR0aW5nIGEgJSBzaWduIGluIGZyb250IG9mIHRoZSB3b3JkIG9yCisjIGdsb2JhbGx5IGJ5IHNldHRpbmcgQVVUT0xJTktfU1VQUE9SVCB0byBOTy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQVVUT0xJTktfU1VQUE9SVCAgICAgICA9IFlFUworCisjIElmIHlvdSB1c2UgU1RMIGNsYXNzZXMgKGkuZS4gc3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yLCBldGMuKSBidXQgZG8gbm90IHdhbnQKKyMgdG8gaW5jbHVkZSAoYSB0YWcgZmlsZSBmb3IpIHRoZSBTVEwgc291cmNlcyBhcyBpbnB1dCwgdGhlbiB5b3Ugc2hvdWxkIHNldCB0aGlzCisjIHRhZyB0byBZRVMgaW4gb3JkZXIgdG8gbGV0IGRveHlnZW4gbWF0Y2ggZnVuY3Rpb25zIGRlY2xhcmF0aW9ucyBhbmQKKyMgZGVmaW5pdGlvbnMgd2hvc2UgYXJndW1lbnRzIGNvbnRhaW4gU1RMIGNsYXNzZXMgKGUuZy4gZnVuYyhzdGQ6OnN0cmluZyk7CisjIHZlcnN1cyBmdW5jKHN0ZDo6c3RyaW5nKSB7fSkuIFRoaXMgYWxzbyBtYWtlIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbgorIyBkaWFncmFtcyB0aGF0IGludm9sdmUgU1RMIGNsYXNzZXMgbW9yZSBjb21wbGV0ZSBhbmQgYWNjdXJhdGUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQlVJTFRJTl9TVExfU1VQUE9SVCAgICA9IFlFUworCisjIElmIHlvdSB1c2UgTWljcm9zb2Z0J3MgQysrL0NMSSBsYW5ndWFnZSwgeW91IHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvCisjIGVuYWJsZSBwYXJzaW5nIHN1cHBvcnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQ1BQX0NMSV9TVVBQT1JUICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBTSVBfU1VQUE9SVCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBzaXAgKHNlZToKKyMgaHR0cDovL3d3dy5yaXZlcmJhbmtjb21wdXRpbmcuY28udWsvc29mdHdhcmUvc2lwL2ludHJvKSBzb3VyY2VzIG9ubHkuIERveHlnZW4KKyMgd2lsbCBwYXJzZSB0aGVtIGxpa2Ugbm9ybWFsIEMrKyBidXQgd2lsbCBhc3N1bWUgYWxsIGNsYXNzZXMgdXNlIHB1YmxpYyBpbnN0ZWFkCisjIG9mIHByaXZhdGUgaW5oZXJpdGFuY2Ugd2hlbiBubyBleHBsaWNpdCBwcm90ZWN0aW9uIGtleXdvcmQgaXMgcHJlc2VudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTSVBfU1VQUE9SVCAgICAgICAgICAgID0gTk8KKworIyBGb3IgTWljcm9zb2Z0J3MgSURMIHRoZXJlIGFyZSBwcm9wZ2V0IGFuZCBwcm9wcHV0IGF0dHJpYnV0ZXMgdG8gaW5kaWNhdGUKKyMgZ2V0dGVyIGFuZCBzZXR0ZXIgbWV0aG9kcyBmb3IgYSBwcm9wZXJ0eS4gU2V0dGluZyB0aGlzIG9wdGlvbiB0byBZRVMgd2lsbCBtYWtlCisjIGRveHlnZW4gdG8gcmVwbGFjZSB0aGUgZ2V0IGFuZCBzZXQgbWV0aG9kcyBieSBhIHByb3BlcnR5IGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBtZXRob2RzIGFyZSBpbmRlZWQgZ2V0dGluZyBvciBzZXR0aW5nIGEgc2ltcGxlCisjIHR5cGUuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBvciB5b3Ugd2FudCB0byBzaG93IHRoZSBtZXRob2RzIGFueXdheSwgeW91CisjIHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0lETF9QUk9QRVJUWV9TVVBQT1JUICAgPSBZRVMKKworIyBJZiBtZW1iZXIgZ3JvdXBpbmcgaXMgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIERJU1RSSUJVVEVfR1JPVVBfRE9DCisjIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHJldXNlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBmaXJzdAorIyBtZW1iZXIgaW4gdGhlIGdyb3VwIChpZiBhbnkpIGZvciB0aGUgb3RoZXIgbWVtYmVycyBvZiB0aGUgZ3JvdXAuIEJ5IGRlZmF1bHQKKyMgYWxsIG1lbWJlcnMgb2YgYSBncm91cCBtdXN0IGJlIGRvY3VtZW50ZWQgZXhwbGljaXRseS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitESVNUUklCVVRFX0dST1VQX0RPQyAgID0gTk8KKworIyBJZiBvbmUgYWRkcyBhIHN0cnVjdCBvciBjbGFzcyB0byBhIGdyb3VwIGFuZCB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGVuIGFsc28KKyMgYW55IG5lc3RlZCBjbGFzcyBvciBzdHJ1Y3QgaXMgYWRkZWQgdG8gdGhlIHNhbWUgZ3JvdXAuIEJ5IGRlZmF1bHQgdGhpcyBvcHRpb24KKyMgaXMgZGlzYWJsZWQgYW5kIG9uZSBoYXMgdG8gYWRkIG5lc3RlZCBjb21wb3VuZHMgZXhwbGljaXRseSB2aWEgXGluZ3JvdXAuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR1JPVVBfTkVTVEVEX0NPTVBPVU5EUyA9IE5PCisKKyMgU2V0IHRoZSBTVUJHUk9VUElORyB0YWcgdG8gWUVTIHRvIGFsbG93IGNsYXNzIG1lbWJlciBncm91cHMgb2YgdGhlIHNhbWUgdHlwZQorIyAoZm9yIGluc3RhbmNlIGEgZ3JvdXAgb2YgcHVibGljIGZ1bmN0aW9ucykgdG8gYmUgcHV0IGFzIGEgc3ViZ3JvdXAgb2YgdGhhdAorIyB0eXBlIChlLmcuIHVuZGVyIHRoZSBQdWJsaWMgRnVuY3Rpb25zIHNlY3Rpb24pLiBTZXQgaXQgdG8gTk8gdG8gcHJldmVudAorIyBzdWJncm91cGluZy4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgZG9uZSBwZXIgY2xhc3MgdXNpbmcgdGhlCisjIFxub3N1Ymdyb3VwaW5nIGNvbW1hbmQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NVQkdST1VQSU5HICAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIHRoZSBJTkxJTkVfR1JPVVBFRF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzLCBzdHJ1Y3RzIGFuZCB1bmlvbnMKKyMgYXJlIHNob3duIGluc2lkZSB0aGUgZ3JvdXAgaW4gd2hpY2ggdGhleSBhcmUgaW5jbHVkZWQgKGUuZy4gdXNpbmcgXGluZ3JvdXApCisjIGluc3RlYWQgb2Ygb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQgTWFuIHBhZ2VzKSBvciBzZWN0aW9uIChmb3IgTGFUZVgKKyMgYW5kIFJURikuCisjCisjIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgZG9lcyBub3Qgd29yayBpbiBjb21iaW5hdGlvbiB3aXRoCisjIFNFUEFSQVRFX01FTUJFUl9QQUdFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfR1JPVVBFRF9DTEFTU0VTID0gTk8KKworIyBXaGVuIHRoZSBJTkxJTkVfU0lNUExFX1NUUlVDVFMgdGFnIGlzIHNldCB0byBZRVMsIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMKKyMgd2l0aCBvbmx5IHB1YmxpYyBkYXRhIGZpZWxkcyBvciBzaW1wbGUgdHlwZWRlZiBmaWVsZHMgd2lsbCBiZSBzaG93biBpbmxpbmUgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIHNjb3BlIGluIHdoaWNoIHRoZXkgYXJlIGRlZmluZWQgKGkuZS4gZmlsZSwKKyMgbmFtZXNwYWNlLCBvciBncm91cCBkb2N1bWVudGF0aW9uKSwgcHJvdmlkZWQgdGhpcyBzY29wZSBpcyBkb2N1bWVudGVkLiBJZiBzZXQKKyMgdG8gTk8sIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMgYXJlIHNob3duIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kCisjIE1hbiBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYIGFuZCBSVEYpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOTElORV9TSU1QTEVfU1RSVUNUUyAgPSBOTworCisjIFdoZW4gVFlQRURFRl9ISURFU19TVFJVQ1QgdGFnIGlzIGVuYWJsZWQsIGEgdHlwZWRlZiBvZiBhIHN0cnVjdCwgdW5pb24sIG9yCisjIGVudW0gaXMgZG9jdW1lbnRlZCBhcyBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHdpdGggdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYuIFNvCisjIHR5cGVkZWYgc3RydWN0IFR5cGVTIHt9IFR5cGVULCB3aWxsIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIHN0cnVjdAorIyB3aXRoIG5hbWUgVHlwZVQuIFdoZW4gZGlzYWJsZWQgdGhlIHR5cGVkZWYgd2lsbCBhcHBlYXIgYXMgYSBtZW1iZXIgb2YgYSBmaWxlLAorIyBuYW1lc3BhY2UsIG9yIGNsYXNzLiBBbmQgdGhlIHN0cnVjdCB3aWxsIGJlIG5hbWVkIFR5cGVTLiBUaGlzIGNhbiB0eXBpY2FsbHkgYmUKKyMgdXNlZnVsIGZvciBDIGNvZGUgaW4gY2FzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gZGljdGF0ZXMgdGhhdCBhbGwgY29tcG91bmQKKyMgdHlwZXMgYXJlIHR5cGVkZWYnZWQgYW5kIG9ubHkgdGhlIHR5cGVkZWYgaXMgcmVmZXJlbmNlZCwgbmV2ZXIgdGhlIHRhZyBuYW1lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1RZUEVERUZfSElERVNfU1RSVUNUICAgPSBZRVMKKworIyBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9sIGxvb2t1cCBjYWNoZSBjYW4gYmUgc2V0IHVzaW5nIExPT0tVUF9DQUNIRV9TSVpFLiBUaGlzCisjIGNhY2hlIGlzIHVzZWQgdG8gcmVzb2x2ZSBzeW1ib2xzIGdpdmVuIHRoZWlyIG5hbWUgYW5kIHNjb3BlLiBTaW5jZSB0aGlzIGNhbiBiZQorIyBhbiBleHBlbnNpdmUgcHJvY2VzcyBhbmQgb2Z0ZW4gdGhlIHNhbWUgc3ltYm9sIGFwcGVhcnMgbXVsdGlwbGUgdGltZXMgaW4gdGhlCisjIGNvZGUsIGRveHlnZW4ga2VlcHMgYSBjYWNoZSBvZiBwcmUtcmVzb2x2ZWQgc3ltYm9scy4gSWYgdGhlIGNhY2hlIGlzIHRvbyBzbWFsbAorIyBkb3h5Z2VuIHdpbGwgYmVjb21lIHNsb3dlci4gSWYgdGhlIGNhY2hlIGlzIHRvbyBsYXJnZSwgbWVtb3J5IGlzIHdhc3RlZC4gVGhlCisjIGNhY2hlIHNpemUgaXMgZ2l2ZW4gYnkgdGhpcyBmb3JtdWxhOiAyXigxNitMT09LVVBfQ0FDSEVfU0laRSkuIFRoZSB2YWxpZCByYW5nZQorIyBpcyAwLi45LCB0aGUgZGVmYXVsdCBpcyAwLCBjb3JyZXNwb25kaW5nIHRvIGEgY2FjaGUgc2l6ZSBvZiAyXjE2PTY1NTM2CisjIHN5bWJvbHMuIEF0IHRoZSBlbmQgb2YgYSBydW4gZG94eWdlbiB3aWxsIHJlcG9ydCB0aGUgY2FjaGUgdXNhZ2UgYW5kIHN1Z2dlc3QKKyMgdGhlIG9wdGltYWwgY2FjaGUgc2l6ZSBmcm9tIGEgc3BlZWQgcG9pbnQgb2Ygdmlldy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogOSwgZGVmYXVsdCB2YWx1ZTogMC4KKworTE9PS1VQX0NBQ0hFX1NJWkUgICAgICA9IDAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCdWlsZCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFWFRSQUNUX0FMTCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGFzc3VtZSBhbGwgZW50aXRpZXMgaW4KKyMgZG9jdW1lbnRhdGlvbiBhcmUgZG9jdW1lbnRlZCwgZXZlbiBpZiBubyBkb2N1bWVudGF0aW9uIHdhcyBhdmFpbGFibGUuIFByaXZhdGUKKyMgY2xhc3MgbWVtYmVycyBhbmQgc3RhdGljIGZpbGUgbWVtYmVycyB3aWxsIGJlIGhpZGRlbiB1bmxlc3MgdGhlCisjIEVYVFJBQ1RfUFJJVkFURSByZXNwZWN0aXZlbHkgRVhUUkFDVF9TVEFUSUMgdGFncyBhcmUgc2V0IHRvIFlFUy4KKyMgTm90ZTogVGhpcyB3aWxsIGFsc28gZGlzYWJsZSB0aGUgd2FybmluZ3MgYWJvdXQgdW5kb2N1bWVudGVkIG1lbWJlcnMgdGhhdCBhcmUKKyMgbm9ybWFsbHkgcHJvZHVjZWQgd2hlbiBXQVJOSU5HUyBpcyBzZXQgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhUUkFDVF9QUklWQVRFIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgcHJpdmF0ZSBtZW1iZXJzIG9mIGEgY2xhc3Mgd2lsbAorIyBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1BSSVZBVEUgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhUUkFDVF9QQUNLQUdFIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgbWVtYmVycyB3aXRoIHBhY2thZ2Ugb3IgaW50ZXJuYWwKKyMgc2NvcGUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1BBQ0tBR0UgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhUUkFDVF9TVEFUSUMgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBzdGF0aWMgbWVtYmVycyBvZiBhIGZpbGUgd2lsbCBiZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1NUQVRJQyAgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhUUkFDVF9MT0NBTF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzIChhbmQgc3RydWN0cykgZGVmaW5lZAorIyBsb2NhbGx5IGluIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gTk8sCisjIG9ubHkgY2xhc3NlcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlcyBhcmUgaW5jbHVkZWQuIERvZXMgbm90IGhhdmUgYW55IGVmZmVjdAorIyBmb3IgSmF2YSBzb3VyY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgID0gWUVTCisKKyMgVGhpcyBmbGFnIGlzIG9ubHkgdXNlZnVsIGZvciBPYmplY3RpdmUtQyBjb2RlLiBJZiBzZXQgdG8gWUVTLCBsb2NhbCBtZXRob2RzLAorIyB3aGljaCBhcmUgZGVmaW5lZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gc2VjdGlvbiBidXQgbm90IGluIHRoZSBpbnRlcmZhY2UgYXJlCisjIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gTk8sIG9ubHkgbWV0aG9kcyBpbiB0aGUgaW50ZXJmYWNlIGFyZQorIyBpbmNsdWRlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX0xPQ0FMX01FVEhPRFMgID0gTk8KKworIyBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIFlFUywgdGhlIG1lbWJlcnMgb2YgYW5vbnltb3VzIG5hbWVzcGFjZXMgd2lsbCBiZQorIyBleHRyYWN0ZWQgYW5kIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIG5hbWVzcGFjZSBjYWxsZWQKKyMgJ2Fub255bW91c19uYW1lc3BhY2V7ZmlsZX0nLCB3aGVyZSBmaWxlIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgYmFzZSBuYW1lIG9mCisjIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGFub255bW91cyBuYW1lc3BhY2UuIEJ5IGRlZmF1bHQgYW5vbnltb3VzIG5hbWVzcGFjZQorIyBhcmUgaGlkZGVuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfQU5PTl9OU1BBQ0VTICAgPSBOTworCisjIElmIHRoZSBISURFX1VORE9DX01FTUJFUlMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFsbAorIyB1bmRvY3VtZW50ZWQgbWVtYmVycyBpbnNpZGUgZG9jdW1lbnRlZCBjbGFzc2VzIG9yIGZpbGVzLiBJZiBzZXQgdG8gTk8gdGhlc2UKKyMgbWVtYmVycyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzIG92ZXJ2aWV3cywgYnV0IG5vIGRvY3VtZW50YXRpb24KKyMgc2VjdGlvbiBpcyBnZW5lcmF0ZWQuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX1VORE9DX01FTUJFUlMgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9VTkRPQ19DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIGNsYXNzZXMgdGhhdCBhcmUgbm9ybWFsbHkgdmlzaWJsZSBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LiBJZiBzZXQKKyMgdG8gTk8sIHRoZXNlIGNsYXNzZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgdmFyaW91cyBvdmVydmlld3MuIFRoaXMgb3B0aW9uCisjIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX1VORE9DX0NMQVNTRVMgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9GUklFTkRfQ09NUE9VTkRTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwgZnJpZW5kCisjIChjbGFzc3xzdHJ1Y3R8dW5pb24pIGRlY2xhcmF0aW9ucy4gSWYgc2V0IHRvIE5PLCB0aGVzZSBkZWNsYXJhdGlvbnMgd2lsbCBiZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8KKworIyBJZiB0aGUgSElERV9JTl9CT0RZX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFueQorIyBkb2N1bWVudGF0aW9uIGJsb2NrcyBmb3VuZCBpbnNpZGUgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGVzZQorIyBibG9ja3Mgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZnVuY3Rpb24ncyBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGJsb2NrLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hJREVfSU5fQk9EWV9ET0NTICAgICAgPSBOTworCisjIFRoZSBJTlRFUk5BTF9ET0NTIHRhZyBkZXRlcm1pbmVzIGlmIGRvY3VtZW50YXRpb24gdGhhdCBpcyB0eXBlZCBhZnRlciBhCisjIFxpbnRlcm5hbCBjb21tYW5kIGlzIGluY2x1ZGVkLiBJZiB0aGUgdGFnIGlzIHNldCB0byBOTyB0aGVuIHRoZSBkb2N1bWVudGF0aW9uCisjIHdpbGwgYmUgZXhjbHVkZWQuIFNldCBpdCB0byBZRVMgdG8gaW5jbHVkZSB0aGUgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTlRFUk5BTF9ET0NTICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENBU0VfU0VOU0VfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIGRveHlnZW4gd2lsbCBvbmx5IGdlbmVyYXRlIGZpbGUKKyMgbmFtZXMgaW4gbG93ZXItY2FzZSBsZXR0ZXJzLiBJZiBzZXQgdG8gWUVTLCB1cHBlci1jYXNlIGxldHRlcnMgYXJlIGFsc28KKyMgYWxsb3dlZC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgY2xhc3NlcyBvciBmaWxlcyB3aG9zZSBuYW1lcyBvbmx5IGRpZmZlcgorIyBpbiBjYXNlIGFuZCBpZiB5b3VyIGZpbGUgc3lzdGVtIHN1cHBvcnRzIGNhc2Ugc2Vuc2l0aXZlIGZpbGUgbmFtZXMuIFdpbmRvd3MKKyMgYW5kIE1hYyB1c2VycyBhcmUgYWR2aXNlZCB0byBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBzeXN0ZW0gZGVwZW5kZW50LgorCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9TQ09QRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgbWVtYmVycyB3aXRoCisjIHRoZWlyIGZ1bGwgY2xhc3MgYW5kIG5hbWVzcGFjZSBzY29wZXMgaW4gdGhlIGRvY3VtZW50YXRpb24uIElmIHNldCB0byBZRVMsIHRoZQorIyBzY29wZSB3aWxsIGJlIGhpZGRlbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX1NDT1BFX05BTUVTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEhJREVfQ09NUE9VTkRfUkVGRVJFTkNFIHRhZyBpcyBzZXQgdG8gTk8gKGRlZmF1bHQpIHRoZW4gZG94eWdlbiB3aWxsCisjIGFwcGVuZCBhZGRpdGlvbmFsIHRleHQgdG8gYSBwYWdlJ3MgdGl0bGUsIHN1Y2ggYXMgQ2xhc3MgUmVmZXJlbmNlLiBJZiBzZXQgdG8KKyMgWUVTIHRoZSBjb21wb3VuZCByZWZlcmVuY2Ugd2lsbCBiZSBoaWRkZW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9DT01QT1VORF9SRUZFUkVOQ0U9IE5PCisKKyMgSWYgdGhlIFNIT1dfSU5DTFVERV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBwdXQgYSBsaXN0IG9mCisjIHRoZSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBieSBhIGZpbGUgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBmaWxlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX0lOQ0xVREVfRklMRVMgICAgID0gWUVTCisKKyMgSWYgdGhlIFNIT1dfR1JPVVBFRF9NRU1CX0lOQyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gd2lsbCBhZGQgZm9yIGVhY2gKKyMgZ3JvdXBlZCBtZW1iZXIgYW4gaW5jbHVkZSBzdGF0ZW1lbnQgdG8gdGhlIGRvY3VtZW50YXRpb24sIHRlbGxpbmcgdGhlIHJlYWRlcgorIyB3aGljaCBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIHRoZSBtZW1iZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0hPV19HUk9VUEVEX01FTUJfSU5DICA9IE5PCisKKyMgSWYgdGhlIEZPUkNFX0xPQ0FMX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGxpc3QgaW5jbHVkZQorIyBmaWxlcyB3aXRoIGRvdWJsZSBxdW90ZXMgaW4gdGhlIGRvY3VtZW50YXRpb24gcmF0aGVyIHRoYW4gd2l0aCBzaGFycCBicmFja2V0cy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitGT1JDRV9MT0NBTF9JTkNMVURFUyAgID0gTk8KKworIyBJZiB0aGUgSU5MSU5FX0lORk8gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIHRhZyBbaW5saW5lXSBpcyBpbnNlcnRlZCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbiBmb3IgaW5saW5lIG1lbWJlcnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0lOTElORV9JTkZPICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU09SVF9NRU1CRVJfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQorIyAoZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgZmlsZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIKKyMgbmFtZS4gSWYgc2V0IHRvIE5PLCB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbiBkZWNsYXJhdGlvbiBvcmRlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU09SVF9NRU1CRVJfRE9DUyAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1JUX0JSSUVGX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUgYnJpZWYKKyMgZGVzY3JpcHRpb25zIG9mIGZpbGUsIG5hbWVzcGFjZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIKKyMgbmFtZS4gSWYgc2V0IHRvIE5PLCB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbiBkZWNsYXJhdGlvbiBvcmRlci4gTm90ZSB0aGF0CisjIHRoaXMgd2lsbCBhbHNvIGluZmx1ZW5jZSB0aGUgb3JkZXIgb2YgdGhlIGNsYXNzZXMgaW4gdGhlIGNsYXNzIGxpc3QuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9CUklFRl9ET0NTICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNPUlRfTUVNQkVSU19DVE9SU18xU1QgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUKKyMgKGJyaWVmIGFuZCBkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBjbGFzcyBtZW1iZXJzIHNvIHRoYXQgY29uc3RydWN0b3JzIGFuZAorIyBkZXN0cnVjdG9ycyBhcmUgbGlzdGVkIGZpcnN0LiBJZiBzZXQgdG8gTk8gdGhlIGNvbnN0cnVjdG9ycyB3aWxsIGFwcGVhciBpbiB0aGUKKyMgcmVzcGVjdGl2ZSBvcmRlcnMgZGVmaW5lZCBieSBTT1JUX0JSSUVGX0RPQ1MgYW5kIFNPUlRfTUVNQkVSX0RPQ1MuCisjIE5vdGU6IElmIFNPUlRfQlJJRUZfRE9DUyBpcyBzZXQgdG8gTk8gdGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3Igc29ydGluZyBicmllZgorIyBtZW1iZXIgZG9jdW1lbnRhdGlvbi4KKyMgTm90ZTogSWYgU09SVF9NRU1CRVJfRE9DUyBpcyBzZXQgdG8gTk8gdGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3Igc29ydGluZworIyBkZXRhaWxlZCBtZW1iZXIgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX01FTUJFUlNfQ1RPUlNfMVNUID0gTk8KKworIyBJZiB0aGUgU09SVF9HUk9VUF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZSBoaWVyYXJjaHkKKyMgb2YgZ3JvdXAgbmFtZXMgaW50byBhbHBoYWJldGljYWwgb3JkZXIuIElmIHNldCB0byBOTyB0aGUgZ3JvdXAgbmFtZXMgd2lsbAorIyBhcHBlYXIgaW4gdGhlaXIgZGVmaW5lZCBvcmRlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX0dST1VQX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgU09SVF9CWV9TQ09QRV9OQU1FIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlIHNvcnRlZCBieQorIyBmdWxseS1xdWFsaWZpZWQgbmFtZXMsIGluY2x1ZGluZyBuYW1lc3BhY2VzLiBJZiBzZXQgdG8gTk8sIHRoZSBjbGFzcyBsaXN0IHdpbGwKKyMgYmUgc29ydGVkIG9ubHkgYnkgY2xhc3MgbmFtZSwgbm90IGluY2x1ZGluZyB0aGUgbmFtZXNwYWNlIHBhcnQuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGlzIG5vdCB2ZXJ5IHVzZWZ1bCBpZiBISURFX1NDT1BFX05BTUVTIGlzIHNldCB0byBZRVMuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGFwcGxpZXMgb25seSB0byB0aGUgY2xhc3MgbGlzdCwgbm90IHRvIHRoZSBhbHBoYWJldGljYWwKKyMgbGlzdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX0JZX1NDT1BFX05BTUUgICAgID0gTk8KKworIyBJZiB0aGUgU1RSSUNUX1BST1RPX01BVENISU5HIG9wdGlvbiBpcyBlbmFibGVkIGFuZCBkb3h5Z2VuIGZhaWxzIHRvIGRvIHByb3BlcgorIyB0eXBlIHJlc29sdXRpb24gb2YgYWxsIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiBpdCB3aWxsIHJlamVjdCBhIG1hdGNoIGJldHdlZW4KKyMgdGhlIHByb3RvdHlwZSBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgbWVtYmVyIGZ1bmN0aW9uIGV2ZW4gaWYgdGhlcmUgaXMKKyMgb25seSBvbmUgY2FuZGlkYXRlIG9yIGl0IGlzIG9idmlvdXMgd2hpY2ggY2FuZGlkYXRlIHRvIGNob29zZSBieSBkb2luZyBhCisjIHNpbXBsZSBzdHJpbmcgbWF0Y2guIEJ5IGRpc2FibGluZyBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgZG94eWdlbiB3aWxsIHN0aWxsCisjIGFjY2VwdCBhIG1hdGNoIGJldHdlZW4gcHJvdG90eXBlIGFuZCBpbXBsZW1lbnRhdGlvbiBpbiBzdWNoIGNhc2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NUUklDVF9QUk9UT19NQVRDSElORyAgPSBOTworCisjIFRoZSBHRU5FUkFURV9UT0RPTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIGRpc2FibGUgKE5PKSB0aGUgdG9kbworIyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0b2RvIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9UT0RPTElTVCAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX1RFU1RMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IgZGlzYWJsZSAoTk8pIHRoZSB0ZXN0CisjIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRlc3QgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX1RFU1RMSVNUICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfQlVHTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIGRpc2FibGUgKE5PKSB0aGUgYnVnCisjIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGJ1ZyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfQlVHTElTVCAgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9ERVBSRUNBVEVETElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIGRpc2FibGUgKE5PKQorIyB0aGUgZGVwcmVjYXRlZCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxkZXByZWNhdGVkIGNvbW1hbmRzIGluCisjIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9ERVBSRUNBVEVETElTVD0gWUVTCisKKyMgVGhlIEVOQUJMRURfU0VDVElPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBjb25kaXRpb25hbCBkb2N1bWVudGF0aW9uCisjIHNlY3Rpb25zLCBtYXJrZWQgYnkgXGlmIDxzZWN0aW9uX2xhYmVsPiAuLi4gXGVuZGlmIGFuZCBcY29uZCA8c2VjdGlvbl9sYWJlbD4KKyMgLi4uIFxlbmRjb25kIGJsb2Nrcy4KKworRU5BQkxFRF9TRUNUSU9OUyAgICAgICA9IElOVEVSTkFMCisKKyMgVGhlIE1BWF9JTklUSUFMSVpFUl9MSU5FUyB0YWcgZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGluZXMgdGhhdCB0aGUKKyMgaW5pdGlhbCB2YWx1ZSBvZiBhIHZhcmlhYmxlIG9yIG1hY3JvIC8gZGVmaW5lIGNhbiBoYXZlIGZvciBpdCB0byBhcHBlYXIgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uIElmIHRoZSBpbml0aWFsaXplciBjb25zaXN0cyBvZiBtb3JlIGxpbmVzIHRoYW4gc3BlY2lmaWVkIGhlcmUKKyMgaXQgd2lsbCBiZSBoaWRkZW4uIFVzZSBhIHZhbHVlIG9mIDAgdG8gaGlkZSBpbml0aWFsaXplcnMgY29tcGxldGVseS4gVGhlCisjIGFwcGVhcmFuY2Ugb2YgdGhlIHZhbHVlIG9mIGluZGl2aWR1YWwgdmFyaWFibGVzIGFuZCBtYWNyb3MgLyBkZWZpbmVzIGNhbiBiZQorIyBjb250cm9sbGVkIHVzaW5nIFxzaG93aW5pdGlhbGl6ZXIgb3IgXGhpZGVpbml0aWFsaXplciBjb21tYW5kIGluIHRoZQorIyBkb2N1bWVudGF0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAwMCwgZGVmYXVsdCB2YWx1ZTogMzAuCisKK01BWF9JTklUSUFMSVpFUl9MSU5FUyAgPSAzMAorCisjIFNldCB0aGUgU0hPV19VU0VEX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBsaXN0IG9mIGZpbGVzIGdlbmVyYXRlZCBhdAorIyB0aGUgYm90dG9tIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzZXMgYW5kIHN0cnVjdHMuIElmIHNldCB0byBZRVMsIHRoZQorIyBsaXN0IHdpbGwgbWVudGlvbiB0aGUgZmlsZXMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NIT1dfVVNFRF9GSUxFUyAgICAgICAgPSBZRVMKKworIyBTZXQgdGhlIFNIT1dfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIEZpbGVzIHBhZ2UuIFRoaXMKKyMgd2lsbCByZW1vdmUgdGhlIEZpbGVzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4IGFuZCBmcm9tIHRoZSBGb2xkZXIgVHJlZSBWaWV3CisjIChpZiBzcGVjaWZpZWQpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX0ZJTEVTICAgICAgICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBTSE9XX05BTUVTUEFDRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIE5hbWVzcGFjZXMKKyMgcGFnZS4gVGhpcyB3aWxsIHJlbW92ZSB0aGUgTmFtZXNwYWNlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUKKyMgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19OQU1FU1BBQ0VTICAgICAgICA9IFlFUworCisjIFRoZSBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSBvciBzY3JpcHQgdGhhdAorIyBkb3h5Z2VuIHNob3VsZCBpbnZva2UgdG8gZ2V0IHRoZSBjdXJyZW50IHZlcnNpb24gZm9yIGVhY2ggZmlsZSAodHlwaWNhbGx5IGZyb20KKyMgdGhlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0pLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBwcm9ncmFtIGJ5IGV4ZWN1dGluZyAodmlhCisjIHBvcGVuKCkpIHRoZSBjb21tYW5kIGNvbW1hbmQgaW5wdXQtZmlsZSwgd2hlcmUgY29tbWFuZCBpcyB0aGUgdmFsdWUgb2YgdGhlCisjIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnLCBhbmQgaW5wdXQtZmlsZSBpcyB0aGUgbmFtZSBvZiBhbiBpbnB1dCBmaWxlIHByb3ZpZGVkCisjIGJ5IGRveHlnZW4uIFdoYXRldmVyIHRoZSBwcm9ncmFtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQgaXMgdXNlZCBhcyB0aGUgZmlsZQorIyB2ZXJzaW9uLiBGb3IgYW4gZXhhbXBsZSBzZWUgdGhlIGRvY3VtZW50YXRpb24uCisKK0ZJTEVfVkVSU0lPTl9GSUxURVIgICAgPSAKKworIyBUaGUgTEFZT1VUX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsYXlvdXQgZmlsZSB3aGljaCB3aWxsIGJlIHBhcnNlZAorIyBieSBkb3h5Z2VuLiBUaGUgbGF5b3V0IGZpbGUgY29udHJvbHMgdGhlIGdsb2JhbCBzdHJ1Y3R1cmUgb2YgdGhlIGdlbmVyYXRlZAorIyBvdXRwdXQgZmlsZXMgaW4gYW4gb3V0cHV0IGZvcm1hdCBpbmRlcGVuZGVudCB3YXkuIFRvIGNyZWF0ZSB0aGUgbGF5b3V0IGZpbGUKKyMgdGhhdCByZXByZXNlbnRzIGRveHlnZW4ncyBkZWZhdWx0cywgcnVuIGRveHlnZW4gd2l0aCB0aGUgLWwgb3B0aW9uLiBZb3UgY2FuCisjIG9wdGlvbmFsbHkgc3BlY2lmeSBhIGZpbGUgbmFtZSBhZnRlciB0aGUgb3B0aW9uLCBpZiBvbWl0dGVkIERveHlnZW5MYXlvdXQueG1sCisjIHdpbGwgYmUgdXNlZCBhcyB0aGUgbmFtZSBvZiB0aGUgbGF5b3V0IGZpbGUuCisjCisjIE5vdGUgdGhhdCBpZiB5b3UgcnVuIGRveHlnZW4gZnJvbSBhIGRpcmVjdG9yeSBjb250YWluaW5nIGEgZmlsZSBjYWxsZWQKKyMgRG94eWdlbkxheW91dC54bWwsIGRveHlnZW4gd2lsbCBwYXJzZSBpdCBhdXRvbWF0aWNhbGx5IGV2ZW4gaWYgdGhlIExBWU9VVF9GSUxFCisjIHRhZyBpcyBsZWZ0IGVtcHR5LgorCitMQVlPVVRfRklMRSAgICAgICAgICAgID0gCisKKyMgVGhlIENJVEVfQklCX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGJpYiBmaWxlcyBjb250YWluaW5nCisjIHRoZSByZWZlcmVuY2UgZGVmaW5pdGlvbnMuIFRoaXMgbXVzdCBiZSBhIGxpc3Qgb2YgLmJpYiBmaWxlcy4gVGhlIC5iaWIKKyMgZXh0ZW5zaW9uIGlzIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgaWYgb21pdHRlZC4gVGhpcyByZXF1aXJlcyB0aGUgYmlidGV4IHRvb2wKKyMgdG8gYmUgaW5zdGFsbGVkLiBTZWUgYWxzbyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLgorIyBGb3IgTGFUZVggdGhlIHN0eWxlIG9mIHRoZSBiaWJsaW9ncmFwaHkgY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcKKyMgTEFURVhfQklCX1NUWUxFLiBUbyB1c2UgdGhpcyBmZWF0dXJlIHlvdSBuZWVkIGJpYnRleCBhbmQgcGVybCBhdmFpbGFibGUgaW4gdGhlCisjIHNlYXJjaCBwYXRoLiBTZWUgYWxzbyBcY2l0ZSBmb3IgaW5mbyBob3cgdG8gY3JlYXRlIHJlZmVyZW5jZXMuCisKK0NJVEVfQklCX0ZJTEVTICAgICAgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB3YXJuaW5nIGFuZCBwcm9ncmVzcyBtZXNzYWdlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBRVUlFVCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIG1lc3NhZ2VzIHRoYXQgYXJlIGdlbmVyYXRlZCB0bworIyBzdGFuZGFyZCBvdXRwdXQgYnkgZG94eWdlbi4gSWYgUVVJRVQgaXMgc2V0IHRvIFlFUyB0aGlzIGltcGxpZXMgdGhhdCB0aGUKKyMgbWVzc2FnZXMgYXJlIG9mZi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitRVUlFVCAgICAgICAgICAgICAgICAgID0gTk8KKworIyBUaGUgV0FSTklOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgYXJlCisjIGdlbmVyYXRlZCB0byBzdGFuZGFyZCBlcnJvciAoc3RkZXJyKSBieSBkb3h5Z2VuLiBJZiBXQVJOSU5HUyBpcyBzZXQgdG8gWUVTCisjIHRoaXMgaW1wbGllcyB0aGF0IHRoZSB3YXJuaW5ncyBhcmUgb24uCisjCisjIFRpcDogVHVybiB3YXJuaW5ncyBvbiB3aGlsZSB3cml0aW5nIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitXQVJOSU5HUyAgICAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFdBUk5fSUZfVU5ET0NVTUVOVEVEIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlCisjIHdhcm5pbmdzIGZvciB1bmRvY3VtZW50ZWQgbWVtYmVycy4gSWYgRVhUUkFDVF9BTEwgaXMgc2V0IHRvIFlFUyB0aGVuIHRoaXMgZmxhZworIyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGlzYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1dBUk5fSUZfVU5ET0NVTUVOVEVEICAgPSBZRVMKKworIyBJZiB0aGUgV0FSTl9JRl9ET0NfRVJST1IgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB3YXJuaW5ncyBmb3IKKyMgcG90ZW50aWFsIGVycm9ycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiwgc3VjaCBhcyBub3QgZG9jdW1lbnRpbmcgc29tZSBwYXJhbWV0ZXJzCisjIGluIGEgZG9jdW1lbnRlZCBmdW5jdGlvbiwgb3IgZG9jdW1lbnRpbmcgcGFyYW1ldGVycyB0aGF0IGRvbid0IGV4aXN0IG9yIHVzaW5nCisjIG1hcmt1cCBjb21tYW5kcyB3cm9uZ2x5LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitXQVJOX0lGX0RPQ19FUlJPUiAgICAgID0gWUVTCisKKyMgVGhpcyBXQVJOX05PX1BBUkFNRE9DIG9wdGlvbiBjYW4gYmUgZW5hYmxlZCB0byBnZXQgd2FybmluZ3MgZm9yIGZ1bmN0aW9ucyB0aGF0CisjIGFyZSBkb2N1bWVudGVkLCBidXQgaGF2ZSBubyBkb2N1bWVudGF0aW9uIGZvciB0aGVpciBwYXJhbWV0ZXJzIG9yIHJldHVybgorIyB2YWx1ZS4gSWYgc2V0IHRvIE5PLCBkb3h5Z2VuIHdpbGwgb25seSB3YXJuIGFib3V0IHdyb25nIG9yIGluY29tcGxldGUKKyMgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24sIGJ1dCBub3QgYWJvdXQgdGhlIGFic2VuY2Ugb2YgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitXQVJOX05PX1BBUkFNRE9DICAgICAgID0gTk8KKworIyBJZiB0aGUgV0FSTl9BU19FUlJPUiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbW1lZGlhdGVseSBzdG9wIHdoZW4KKyMgYSB3YXJuaW5nIGlzIGVuY291bnRlcmVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1dBUk5fQVNfRVJST1IgICAgICAgICAgPSBOTworCisjIFRoZSBXQVJOX0ZPUk1BVCB0YWcgZGV0ZXJtaW5lcyB0aGUgZm9ybWF0IG9mIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgZG94eWdlbgorIyBjYW4gcHJvZHVjZS4gVGhlIHN0cmluZyBzaG91bGQgY29udGFpbiB0aGUgJGZpbGUsICRsaW5lLCBhbmQgJHRleHQgdGFncywgd2hpY2gKKyMgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSB3aGljaCB0aGUgd2FybmluZyBvcmlnaW5hdGVkCisjIGFuZCB0aGUgd2FybmluZyB0ZXh0LiBPcHRpb25hbGx5IHRoZSBmb3JtYXQgbWF5IGNvbnRhaW4gJHZlcnNpb24sIHdoaWNoIHdpbGwKKyMgYmUgcmVwbGFjZWQgYnkgdGhlIHZlcnNpb24gb2YgdGhlIGZpbGUgKGlmIGl0IGNvdWxkIGJlIG9idGFpbmVkIHZpYQorIyBGSUxFX1ZFUlNJT05fRklMVEVSKQorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogJGZpbGU6JGxpbmU6ICR0ZXh0LgorCitXQVJOX0ZPUk1BVCAgICAgICAgICAgID0gIiRmaWxlOiRsaW5lOiAkdGV4dCIKKworIyBUaGUgV0FSTl9MT0dGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB0byB3aGljaCB3YXJuaW5nIGFuZCBlcnJvcgorIyBtZXNzYWdlcyBzaG91bGQgYmUgd3JpdHRlbi4gSWYgbGVmdCBibGFuayB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gc3RhbmRhcmQKKyMgZXJyb3IgKHN0ZGVycikuCisKK1dBUk5fTE9HRklMRSAgICAgICAgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgaW5wdXQgZmlsZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgSU5QVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbgorIyBkb2N1bWVudGVkIHNvdXJjZSBmaWxlcy4gWW91IG1heSBlbnRlciBmaWxlIG5hbWVzIGxpa2UgbXlmaWxlLmNwcCBvcgorIyBkaXJlY3RvcmllcyBsaWtlIC91c3Ivc3JjL215cHJvamVjdC4gU2VwYXJhdGUgdGhlIGZpbGVzIG9yIGRpcmVjdG9yaWVzIHdpdGgKKyMgc3BhY2VzLiBTZWUgYWxzbyBGSUxFX1BBVFRFUk5TIGFuZCBFWFRFTlNJT05fTUFQUElORworIyBOb3RlOiBJZiB0aGlzIHRhZyBpcyBlbXB0eSB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgc2VhcmNoZWQuCisKK0lOUFVUICAgICAgICAgICAgICAgICAgPSBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi8KKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBmaWxlcworIyB0aGF0IGRveHlnZW4gcGFyc2VzLiBJbnRlcm5hbGx5IGRveHlnZW4gdXNlcyB0aGUgVVRGLTggZW5jb2RpbmcuIERveHlnZW4gdXNlcworIyBsaWJpY29udiAob3IgdGhlIGljb252IGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIHRoZSBsaWJpY29udgorIyBkb2N1bWVudGF0aW9uIChzZWU6IGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udikgZm9yIHRoZSBsaXN0IG9mCisjIHBvc3NpYmxlIGVuY29kaW5ncy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFVURi04LgorCitJTlBVVF9FTkNPRElORyAgICAgICAgID0gVVRGLTgKKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgKGxpa2UgKi5jcHAgYW5kCisjICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4KKyMKKyMgTm90ZSB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyBvciBub3QgZGlyZWN0bHkgc3VwcG9ydGVkIGV4dGVuc2lvbnMgeW91IGFsc28KKyMgbmVlZCB0byBzZXQgRVhURU5TSU9OX01BUFBJTkcgZm9yIHRoZSBleHRlbnNpb24gb3RoZXJ3aXNlIHRoZSBmaWxlcyBhcmUgbm90CisjIHJlYWQgYnkgZG94eWdlbi4KKyMKKyMgSWYgbGVmdCBibGFuayB0aGUgZm9sbG93aW5nIHBhdHRlcm5zIGFyZSB0ZXN0ZWQ6Ki5jLCAqLmNjLCAqLmN4eCwgKi5jcHAsCisjICouYysrLCAqLmphdmEsICouaWksICouaXh4LCAqLmlwcCwgKi5pKyssICouaW5sLCAqLmlkbCwgKi5kZGwsICoub2RsLCAqLmgsCisjICouaGgsICouaHh4LCAqLmhwcCwgKi5oKyssICouY3MsICouZCwgKi5waHAsICoucGhwNCwgKi5waHA1LCAqLnBodG1sLCAqLmluYywKKyMgKi5tLCAqLm1hcmtkb3duLCAqLm1kLCAqLm1tLCAqLmRveCwgKi5weSwgKi5weXcsICouZjkwLCAqLmYsICouZm9yLCAqLnRjbCwKKyMgKi52aGQsICoudmhkbCwgKi51Y2YsICoucXNmLCAqLmFzIGFuZCAqLmpzLgorCitGSUxFX1BBVFRFUk5TICAgICAgICAgID0gQzIqLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEMyKi5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEMyKi5oCisKKyMgVGhlIFJFQ1VSU0lWRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCBzdWJkaXJlY3RvcmllcyBzaG91bGQKKyMgYmUgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIGFzIHdlbGwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVDVVJTSVZFICAgICAgICAgICAgICA9IFlFUworCisjIFRoZSBFWENMVURFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZQorIyBleGNsdWRlZCBmcm9tIHRoZSBJTlBVVCBzb3VyY2UgZmlsZXMuIFRoaXMgd2F5IHlvdSBjYW4gZWFzaWx5IGV4Y2x1ZGUgYQorIyBzdWJkaXJlY3RvcnkgZnJvbSBhIGRpcmVjdG9yeSB0cmVlIHdob3NlIHJvb3QgaXMgc3BlY2lmaWVkIHdpdGggdGhlIElOUFVUIHRhZy4KKyMKKyMgTm90ZSB0aGF0IHJlbGF0aXZlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcworIyBydW4uCisKK0VYQ0xVREUgICAgICAgICAgICAgICAgPSAKKworIyBUaGUgRVhDTFVERV9TWU1MSU5LUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHdoZXRoZXIgb3Igbm90IGZpbGVzIG9yCisjIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHN5bWJvbGljIGxpbmtzIChhIFVuaXggZmlsZSBzeXN0ZW0gZmVhdHVyZSkgYXJlIGV4Y2x1ZGVkCisjIGZyb20gdGhlIGlucHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYQ0xVREVfU1lNTElOS1MgICAgICAgPSBOTworCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRVhDTFVERV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyB0byBleGNsdWRlCisjIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4KKyMKKyMgTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvCisjIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMgZm9yIGV4YW1wbGUgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCisKK0VYQ0xVREVfUEFUVEVSTlMgICAgICAgPSAuXyoKKworIyBUaGUgRVhDTFVERV9TWU1CT0xTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHN5bWJvbCBuYW1lcworIyAobmFtZXNwYWNlcywgY2xhc3NlcywgZnVuY3Rpb25zLCBldGMuKSB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZQorIyBvdXRwdXQuIFRoZSBzeW1ib2wgbmFtZSBjYW4gYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSwgYSB3b3JkLCBvciBpZiB0aGUKKyMgd2lsZGNhcmQgKiBpcyB1c2VkLCBhIHN1YnN0cmluZy4gRXhhbXBsZXM6IEFOYW1lc3BhY2UsIEFDbGFzcywKKyMgQUNsYXNzOjpBTmFtZXNwYWNlLCBBTmFtZXNwYWNlOjoqVGVzdAorIworIyBOb3RlIHRoYXQgdGhlIHdpbGRjYXJkcyBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBmaWxlIHdpdGggYWJzb2x1dGUgcGF0aCwgc28gdG8KKyMgZXhjbHVkZSBhbGwgdGVzdCBkaXJlY3RvcmllcyB1c2UgdGhlIHBhdHRlcm4gKi90ZXN0LyoKKworRVhDTFVERV9TWU1CT0xTICAgICAgICA9IAorCisjIFRoZSBFWEFNUExFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKKyMgdGhhdCBjb250YWluIGV4YW1wbGUgY29kZSBmcmFnbWVudHMgdGhhdCBhcmUgaW5jbHVkZWQgKHNlZSB0aGUgXGluY2x1ZGUKKyMgY29tbWFuZCkuCisKK0VYQU1QTEVfUEFUSCAgICAgICAgICAgPSAKKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIEVYQU1QTEVfUEFUSCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBFWEFNUExFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHAgYW5kCisjICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuayBhbGwKKyMgZmlsZXMgYXJlIGluY2x1ZGVkLgorCitFWEFNUExFX1BBVFRFUk5TICAgICAgID0gKgorCisjIElmIHRoZSBFWEFNUExFX1JFQ1VSU0lWRSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHN1YmRpcmVjdG9yaWVzIHdpbGwgYmUKKyMgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIHRvIGJlIHVzZWQgd2l0aCB0aGUgXGluY2x1ZGUgb3IgXGRvbnRpbmNsdWRlIGNvbW1hbmRzCisjIGlycmVzcGVjdGl2ZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFJFQ1VSU0lWRSB0YWcuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhBTVBMRV9SRUNVUlNJVkUgICAgICA9IE5PCisKKyMgVGhlIElNQUdFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKKyMgdGhhdCBjb250YWluIGltYWdlcyB0aGF0IGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZQorIyBcaW1hZ2UgY29tbWFuZCkuCisKK0lNQUdFX1BBVEggICAgICAgICAgICAgPSAKKworIyBUaGUgSU5QVVRfRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSB0aGF0IGRveHlnZW4gc2hvdWxkCisjIGludm9rZSB0byBmaWx0ZXIgZm9yIGVhY2ggaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgZmlsdGVyIHByb2dyYW0KKyMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQ6CisjCisjIDxmaWx0ZXI+IDxpbnB1dC1maWxlPgorIworIyB3aGVyZSA8ZmlsdGVyPiBpcyB0aGUgdmFsdWUgb2YgdGhlIElOUFVUX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlCisjIG5hbWUgb2YgYW4gaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIHRoZW4gdXNlIHRoZSBvdXRwdXQgdGhhdCB0aGUgZmlsdGVyCisjIHByb2dyYW0gd3JpdGVzIHRvIHN0YW5kYXJkIG91dHB1dC4gSWYgRklMVEVSX1BBVFRFUk5TIGlzIHNwZWNpZmllZCwgdGhpcyB0YWcKKyMgd2lsbCBiZSBpZ25vcmVkLgorIworIyBOb3RlIHRoYXQgdGhlIGZpbHRlciBtdXN0IG5vdCBhZGQgb3IgcmVtb3ZlIGxpbmVzOyBpdCBpcyBhcHBsaWVkIGJlZm9yZSB0aGUKKyMgY29kZSBpcyBzY2FubmVkLCBidXQgbm90IHdoZW4gdGhlIG91dHB1dCBjb2RlIGlzIGdlbmVyYXRlZC4gSWYgbGluZXMgYXJlIGFkZGVkCisjIG9yIHJlbW92ZWQsIHRoZSBhbmNob3JzIHdpbGwgbm90IGJlIHBsYWNlZCBjb3JyZWN0bHkuCisjCisjIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgb3Igbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBleHRlbnNpb25zIHlvdSBhbHNvCisjIG5lZWQgdG8gc2V0IEVYVEVOU0lPTl9NQVBQSU5HIGZvciB0aGUgZXh0ZW5zaW9uIG90aGVyd2lzZSB0aGUgZmlsZXMgYXJlIG5vdAorIyBwcm9wZXJseSBwcm9jZXNzZWQgYnkgZG94eWdlbi4KKworSU5QVVRfRklMVEVSICAgICAgICAgICA9IGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2RvY3MvZG94eWZpbHRlci5zaAorCisjIFRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsdGVycyBvbiBhIHBlciBmaWxlIHBhdHRlcm4KKyMgYmFzaXMuIERveHlnZW4gd2lsbCBjb21wYXJlIHRoZSBmaWxlIG5hbWUgd2l0aCBlYWNoIHBhdHRlcm4gYW5kIGFwcGx5IHRoZQorIyBmaWx0ZXIgaWYgdGhlcmUgaXMgYSBtYXRjaC4gVGhlIGZpbHRlcnMgYXJlIGEgbGlzdCBvZiB0aGUgZm9ybTogcGF0dGVybj1maWx0ZXIKKyMgKGxpa2UgKi5jcHA9bXlfY3BwX2ZpbHRlcikuIFNlZSBJTlBVVF9GSUxURVIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gaG93CisjIGZpbHRlcnMgYXJlIHVzZWQuIElmIHRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGlzIGVtcHR5IG9yIGlmIG5vbmUgb2YgdGhlCisjIHBhdHRlcm5zIG1hdGNoIHRoZSBmaWxlIG5hbWUsIElOUFVUX0ZJTFRFUiBpcyBhcHBsaWVkLgorIworIyBOb3RlIHRoYXQgZm9yIGN1c3RvbSBleHRlbnNpb25zIG9yIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQgZXh0ZW5zaW9ucyB5b3UgYWxzbworIyBuZWVkIHRvIHNldCBFWFRFTlNJT05fTUFQUElORyBmb3IgdGhlIGV4dGVuc2lvbiBvdGhlcndpc2UgdGhlIGZpbGVzIGFyZSBub3QKKyMgcHJvcGVybHkgcHJvY2Vzc2VkIGJ5IGRveHlnZW4uCisKK0ZJTFRFUl9QQVRURVJOUyAgICAgICAgPSAKKworIyBJZiB0aGUgRklMVEVSX1NPVVJDRV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGlucHV0IGZpbHRlciAoaWYgc2V0IHVzaW5nCisjIElOUFVUX0ZJTFRFUikgd2lsbCBhbHNvIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBpbnB1dCBmaWxlcyB0aGF0IGFyZSB1c2VkIGZvcgorIyBwcm9kdWNpbmcgdGhlIHNvdXJjZSBmaWxlcyB0byBicm93c2UgKGkuZS4gd2hlbiBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitGSUxURVJfU09VUkNFX0ZJTEVTICAgID0gWUVTCisKKyMgVGhlIEZJTFRFUl9TT1VSQ0VfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgc291cmNlIGZpbHRlcnMgcGVyIGZpbGUKKyMgcGF0dGVybi4gQSBwYXR0ZXJuIHdpbGwgb3ZlcnJpZGUgdGhlIHNldHRpbmcgZm9yIEZJTFRFUl9QQVRURVJOIChpZiBhbnkpIGFuZAorIyBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRpc2FibGUgc291cmNlIGZpbHRlcmluZyBmb3IgYSBzcGVjaWZpYyBwYXR0ZXJuIHVzaW5nCisjICouZXh0PSAoc28gd2l0aG91dCBuYW1pbmcgYSBmaWx0ZXIpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRklMVEVSX1NPVVJDRV9GSUxFUyBpcyBzZXQgdG8gWUVTLgorCitGSUxURVJfU09VUkNFX1BBVFRFUk5TID0gCisKKyMgSWYgdGhlIFVTRV9NREZJTEVfQVNfTUFJTlBBR0UgdGFnIHJlZmVycyB0byB0aGUgbmFtZSBvZiBhIG1hcmtkb3duIGZpbGUgdGhhdAorIyBpcyBwYXJ0IG9mIHRoZSBpbnB1dCwgaXRzIGNvbnRlbnRzIHdpbGwgYmUgcGxhY2VkIG9uIHRoZSBtYWluIHBhZ2UKKyMgKGluZGV4Lmh0bWwpLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGhhdmUgYSBwcm9qZWN0IG9uIGZvciBpbnN0YW5jZSBHaXRIdWIKKyMgYW5kIHdhbnQgdG8gcmV1c2UgdGhlIGludHJvZHVjdGlvbiBwYWdlIGFsc28gZm9yIHRoZSBkb3h5Z2VuIG91dHB1dC4KKworVVNFX01ERklMRV9BU19NQUlOUEFHRSA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHNvdXJjZSBicm93c2luZworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGEgbGlzdCBvZiBzb3VyY2UgZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQuIERvY3VtZW50ZWQgZW50aXRpZXMgd2lsbCBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggdGhlc2Ugc291cmNlcy4KKyMKKyMgTm90ZTogVG8gZ2V0IHJpZCBvZiBhbGwgc291cmNlIGNvZGUgaW4gdGhlIGdlbmVyYXRlZCBvdXRwdXQsIG1ha2Ugc3VyZSB0aGF0CisjIGFsc28gVkVSQkFUSU1fSEVBREVSUyBpcyBzZXQgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09VUkNFX0JST1dTRVIgICAgICAgICA9IFlFUworCisjIFNldHRpbmcgdGhlIElOTElORV9TT1VSQ0VTIHRhZyB0byBZRVMgd2lsbCBpbmNsdWRlIHRoZSBib2R5IG9mIGZ1bmN0aW9ucywKKyMgY2xhc3NlcyBhbmQgZW51bXMgZGlyZWN0bHkgaW50byB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfU09VUkNFUyAgICAgICAgID0gTk8KKworIyBTZXR0aW5nIHRoZSBTVFJJUF9DT0RFX0NPTU1FTlRTIHRhZyB0byBZRVMgd2lsbCBpbnN0cnVjdCBkb3h5Z2VuIHRvIGhpZGUgYW55CisjIHNwZWNpYWwgY29tbWVudCBibG9ja3MgZnJvbSBnZW5lcmF0ZWQgc291cmNlIGNvZGUgZnJhZ21lbnRzLiBOb3JtYWwgQywgQysrIGFuZAorIyBGb3J0cmFuIGNvbW1lbnRzIHdpbGwgYWx3YXlzIHJlbWFpbiB2aXNpYmxlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTVFJJUF9DT0RFX0NPTU1FTlRTICAgID0gWUVTCisKKyMgSWYgdGhlIFJFRkVSRU5DRURfQllfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkCisjIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkIGZ1bmN0aW9ucyByZWZlcmVuY2luZyBpdCB3aWxsIGJlIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OID0gWUVTCisKKyMgSWYgdGhlIFJFRkVSRU5DRVNfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uCisjIGFsbCBkb2N1bWVudGVkIGVudGl0aWVzIGNhbGxlZC91c2VkIGJ5IHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVGRVJFTkNFU19SRUxBVElPTiAgICA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VTX0xJTktfU09VUkNFIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0CisjIHRvIFlFUyB0aGVuIHRoZSBoeXBlcmxpbmtzIGZyb20gZnVuY3Rpb25zIGluIFJFRkVSRU5DRVNfUkVMQVRJT04gYW5kCisjIFJFRkVSRU5DRURfQllfUkVMQVRJT04gbGlzdHMgd2lsbCBsaW5rIHRvIHRoZSBzb3VyY2UgY29kZS4gT3RoZXJ3aXNlIHRoZXkgd2lsbAorIyBsaW5rIHRvIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitSRUZFUkVOQ0VTX0xJTktfU09VUkNFID0gWUVTCisKKyMgSWYgU09VUkNFX1RPT0xUSVBTIGlzIGVuYWJsZWQgKHRoZSBkZWZhdWx0KSB0aGVuIGhvdmVyaW5nIGEgaHlwZXJsaW5rIGluIHRoZQorIyBzb3VyY2UgY29kZSB3aWxsIHNob3cgYSB0b29sdGlwIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBzdWNoIGFzIHByb3RvdHlwZSwKKyMgYnJpZWYgZGVzY3JpcHRpb24gYW5kIGxpbmtzIHRvIHRoZSBkZWZpbml0aW9uIGFuZCBkb2N1bWVudGF0aW9uLiBTaW5jZSB0aGlzCisjIHdpbGwgbWFrZSB0aGUgSFRNTCBmaWxlIGxhcmdlciBhbmQgbG9hZGluZyBvZiBsYXJnZSBmaWxlcyBhIGJpdCBzbG93ZXIsIHlvdQorIyBjYW4gb3B0IHRvIGRpc2FibGUgdGhpcyBmZWF0dXJlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUy4KKworU09VUkNFX1RPT0xUSVBTICAgICAgICA9IFlFUworCisjIElmIHRoZSBVU0VfSFRBR1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgcmVmZXJlbmNlcyB0byBzb3VyY2UgY29kZSB3aWxsCisjIHBvaW50IHRvIHRoZSBIVE1MIGdlbmVyYXRlZCBieSB0aGUgaHRhZ3MoMSkgdG9vbCBpbnN0ZWFkIG9mIGRveHlnZW4gYnVpbHQtaW4KKyMgc291cmNlIGJyb3dzZXIuIFRoZSBodGFncyB0b29sIGlzIHBhcnQgb2YgR05VJ3MgZ2xvYmFsIHNvdXJjZSB0YWdnaW5nIHN5c3RlbQorIyAoc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nbG9iYWwvZ2xvYmFsLmh0bWwpLiBZb3Ugd2lsbCBuZWVkIHZlcnNpb24KKyMgNC44LjYgb3IgaGlnaGVyLgorIworIyBUbyB1c2UgaXQgZG8gdGhlIGZvbGxvd2luZzoKKyMgLSBJbnN0YWxsIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBnbG9iYWwKKyMgLSBFbmFibGUgU09VUkNFX0JST1dTRVIgYW5kIFVTRV9IVEFHUyBpbiB0aGUgY29uZmlnIGZpbGUKKyMgLSBNYWtlIHN1cmUgdGhlIElOUFVUIHBvaW50cyB0byB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUKKyMgLSBSdW4gZG94eWdlbiBhcyBub3JtYWwKKyMKKyMgRG94eWdlbiB3aWxsIGludm9rZSBodGFncyAoYW5kIHRoYXQgd2lsbCBpbiB0dXJuIGludm9rZSBndGFncyksIHNvIHRoZXNlCisjIHRvb2xzIG11c3QgYmUgYXZhaWxhYmxlIGZyb20gdGhlIGNvbW1hbmQgbGluZSAoaS5lLiBpbiB0aGUgc2VhcmNoIHBhdGgpLgorIworIyBUaGUgcmVzdWx0OiBpbnN0ZWFkIG9mIHRoZSBzb3VyY2UgYnJvd3NlciBnZW5lcmF0ZWQgYnkgZG94eWdlbiwgdGhlIGxpbmtzIHRvCisjIHNvdXJjZSBjb2RlIHdpbGwgbm93IHBvaW50IHRvIHRoZSBvdXRwdXQgb2YgaHRhZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMuCisKK1VTRV9IVEFHUyAgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBWRVJCQVRJTV9IRUFERVJTIHRhZyBpcyBzZXQgdGhlIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHZlcmJhdGltIGNvcHkgb2YgdGhlIGhlYWRlciBmaWxlIGZvciBlYWNoIGNsYXNzIGZvciB3aGljaCBhbiBpbmNsdWRlIGlzCisjIHNwZWNpZmllZC4gU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKyMgU2VlIGFsc286IFNlY3Rpb24gXGNsYXNzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitWRVJCQVRJTV9IRUFERVJTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENMQU5HX0FTU0lTVEVEX1BBUlNJTkcgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgdXNlIHRoZQorIyBjbGFuZyBwYXJzZXIgKHNlZTogaHR0cDovL2NsYW5nLmxsdm0ub3JnLykgZm9yIG1vcmUgYWNjdXJhdGUgcGFyc2luZyBhdCB0aGUKKyMgY29zdCBvZiByZWR1Y2VkIHBlcmZvcm1hbmNlLiBUaGlzIGNhbiBiZSBwYXJ0aWN1bGFybHkgaGVscGZ1bCB3aXRoIHRlbXBsYXRlCisjIHJpY2ggQysrIGNvZGUgZm9yIHdoaWNoIGRveHlnZW4ncyBidWlsdC1pbiBwYXJzZXIgbGFja3MgdGhlIG5lY2Vzc2FyeSB0eXBlCisjIGluZm9ybWF0aW9uLgorIyBOb3RlOiBUaGUgYXZhaWxhYmlsaXR5IG9mIHRoaXMgb3B0aW9uIGRlcGVuZHMgb24gd2hldGhlciBvciBub3QgZG94eWdlbiB3YXMKKyMgZ2VuZXJhdGVkIHdpdGggdGhlIC1EdXNlLWxpYmNsYW5nPU9OIG9wdGlvbiBmb3IgQ01ha2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQ0xBTkdfQVNTSVNURURfUEFSU0lORyA9IFlFUworCisjIElmIGNsYW5nIGFzc2lzdGVkIHBhcnNpbmcgaXMgZW5hYmxlZCB5b3UgY2FuIHByb3ZpZGUgdGhlIGNvbXBpbGVyIHdpdGggY29tbWFuZAorIyBsaW5lIG9wdGlvbnMgdGhhdCB5b3Ugd291bGQgbm9ybWFsbHkgdXNlIHdoZW4gaW52b2tpbmcgdGhlIGNvbXBpbGVyLiBOb3RlIHRoYXQKKyMgdGhlIGluY2x1ZGUgcGF0aHMgd2lsbCBhbHJlYWR5IGJlIHNldCBieSBkb3h5Z2VuIGZvciB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCisjIHNwZWNpZmllZCB3aXRoIElOUFVUIGFuZCBJTkNMVURFX1BBVEguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBDTEFOR19BU1NJU1RFRF9QQVJTSU5HIGlzIHNldCB0byBZRVMuCisKK0NMQU5HX09QVElPTlMgICAgICAgICAgPSAtc3RkPWMrKzE0CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGFscGhhYmV0aWNhbCBjbGFzcyBpbmRleAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBBTFBIQUJFVElDQUxfSU5ERVggdGFnIGlzIHNldCB0byBZRVMsIGFuIGFscGhhYmV0aWNhbCBpbmRleCBvZiBhbGwKKyMgY29tcG91bmRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBFbmFibGUgdGhpcyBpZiB0aGUgcHJvamVjdCBjb250YWlucyBhIGxvdCBvZgorIyBjbGFzc2VzLCBzdHJ1Y3RzLCB1bmlvbnMgb3IgaW50ZXJmYWNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQUxQSEFCRVRJQ0FMX0lOREVYICAgICA9IFlFUworCisjIFRoZSBDT0xTX0lOX0FMUEhBX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbgorIyB3aGljaCB0aGUgYWxwaGFiZXRpY2FsIGluZGV4IGxpc3Qgd2lsbCBiZSBzcGxpdC4KKyMgTWluaW11bSB2YWx1ZTogMSwgbWF4aW11bSB2YWx1ZTogMjAsIGRlZmF1bHQgdmFsdWU6IDUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBBTFBIQUJFVElDQUxfSU5ERVggaXMgc2V0IHRvIFlFUy4KKworQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKKworIyBJbiBjYXNlIGFsbCBjbGFzc2VzIGluIGEgcHJvamVjdCBzdGFydCB3aXRoIGEgY29tbW9uIHByZWZpeCwgYWxsIGNsYXNzZXMgd2lsbAorIyBiZSBwdXQgdW5kZXIgdGhlIHNhbWUgaGVhZGVyIGluIHRoZSBhbHBoYWJldGljYWwgaW5kZXguIFRoZSBJR05PUkVfUFJFRklYIHRhZworIyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJlZml4IChvciBhIGxpc3Qgb2YgcHJlZml4ZXMpIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQKKyMgd2hpbGUgZ2VuZXJhdGluZyB0aGUgaW5kZXggaGVhZGVycy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEFMUEhBQkVUSUNBTF9JTkRFWCBpcyBzZXQgdG8gWUVTLgorCitJR05PUkVfUFJFRklYICAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIEhUTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUwgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBIVE1MIG91dHB1dAorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9IVE1MICAgICAgICAgID0gWUVTCisKKyMgVGhlIEhUTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIEhUTUwgZG9jcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogaHRtbC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9PVVRQVVQgICAgICAgICAgICA9IGh0bWwKKworIyBUaGUgSFRNTF9GSUxFX0VYVEVOU0lPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBleHRlbnNpb24gZm9yIGVhY2gKKyMgZ2VuZXJhdGVkIEhUTUwgcGFnZSAoZm9yIGV4YW1wbGU6IC5odG0sIC5waHAsIC5hc3ApLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogLmh0bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRklMRV9FWFRFTlNJT04gICAgPSAuaHRtbAorCisjIFRoZSBIVE1MX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBIVE1MIGhlYWRlciBmaWxlIGZvcgorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIHRoZSB0YWcgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBzdGFuZGFyZCBoZWFkZXIuCisjCisjIFRvIGdldCB2YWxpZCBIVE1MIHRoZSBoZWFkZXIgZmlsZSB0aGF0IGluY2x1ZGVzIGFueSBzY3JpcHRzIGFuZCBzdHlsZSBzaGVldHMKKyMgdGhhdCBkb3h5Z2VuIG5lZWRzLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB1c2VkIChlLmcuCisjIHRoZSBzZXR0aW5nIEdFTkVSQVRFX1RSRUVWSUVXKS4gSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHN0YXJ0IHdpdGggYQorIyBkZWZhdWx0IGhlYWRlciB1c2luZworIyBkb3h5Z2VuIC13IGh0bWwgbmV3X2hlYWRlci5odG1sIG5ld19mb290ZXIuaHRtbCBuZXdfc3R5bGVzaGVldC5jc3MKKyMgWW91ckNvbmZpZ0ZpbGUKKyMgYW5kIHRoZW4gbW9kaWZ5IHRoZSBmaWxlIG5ld19oZWFkZXIuaHRtbC4gU2VlIGFsc28gc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIKKyMgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCBoZWFkZXIgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5CisjIHVzZXMuCisjIE5vdGU6IFRoZSBoZWFkZXIgaXMgc3ViamVjdCB0byBjaGFuZ2Ugc28geW91IHR5cGljYWxseSBoYXZlIHRvIHJlZ2VuZXJhdGUgdGhlCisjIGRlZmF1bHQgaGVhZGVyIHdoZW4gdXBncmFkaW5nIHRvIGEgbmV3ZXIgdmVyc2lvbiBvZiBkb3h5Z2VuLiBGb3IgYSBkZXNjcmlwdGlvbgorIyBvZiB0aGUgcG9zc2libGUgbWFya2VycyBhbmQgYmxvY2sgbmFtZXMgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0hFQURFUiAgICAgICAgICAgID0gCisKKyMgVGhlIEhUTUxfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIEhUTUwgZm9vdGVyIGZvciBlYWNoCisjIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIHRoZSB0YWcgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZAorIyBmb290ZXIuIFNlZSBIVE1MX0hFQURFUiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgYSBkZWZhdWx0CisjIGZvb3RlciBhbmQgd2hhdCBzcGVjaWFsIGNvbW1hbmRzIGNhbiBiZSB1c2VkIGluc2lkZSB0aGUgZm9vdGVyLiBTZWUgYWxzbworIyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZSBkZWZhdWx0IGZvb3RlcgorIyB0aGF0IGRveHlnZW4gbm9ybWFsbHkgdXNlcy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9GT09URVIgICAgICAgICAgICA9IAorCisjIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nIHN0eWxlCisjIHNoZWV0IHRoYXQgaXMgdXNlZCBieSBlYWNoIEhUTUwgcGFnZS4gSXQgY2FuIGJlIHVzZWQgdG8gZmluZS10dW5lIHRoZSBsb29rIG9mCisjIHRoZSBIVE1MIG91dHB1dC4gSWYgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBkZWZhdWx0IHN0eWxlIHNoZWV0LgorIyBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZSBzdHlsZQorIyBzaGVldCB0aGF0IGRveHlnZW4gbm9ybWFsbHkgdXNlcy4KKyMgTm90ZTogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCBpbnN0ZWFkIG9mIHRoaXMgdGFnLCBhcworIyBpdCBpcyBtb3JlIHJvYnVzdCBhbmQgdGhpcyB0YWcgKEhUTUxfU1RZTEVTSEVFVCkgd2lsbCBpbiB0aGUgZnV0dXJlIGJlY29tZQorIyBvYnNvbGV0ZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9TVFlMRVNIRUVUICAgICAgICA9IAorCisjIFRoZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYWRkaXRpb25hbCB1c2VyLWRlZmluZWQKKyMgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cyB0aGF0IGFyZSBpbmNsdWRlZCBhZnRlciB0aGUgc3RhbmRhcmQgc3R5bGUgc2hlZXRzCisjIGNyZWF0ZWQgYnkgZG94eWdlbi4gVXNpbmcgdGhpcyBvcHRpb24gb25lIGNhbiBvdmVycnVsZSBjZXJ0YWluIHN0eWxlIGFzcGVjdHMuCisjIFRoaXMgaXMgcHJlZmVycmVkIG92ZXIgdXNpbmcgSFRNTF9TVFlMRVNIRUVUIHNpbmNlIGl0IGRvZXMgbm90IHJlcGxhY2UgdGhlCisjIHN0YW5kYXJkIHN0eWxlIHNoZWV0IGFuZCBpcyB0aGVyZWZvcmUgbW9yZSByb2J1c3QgYWdhaW5zdCBmdXR1cmUgdXBkYXRlcy4KKyMgRG94eWdlbiB3aWxsIGNvcHkgdGhlIHN0eWxlIHNoZWV0IGZpbGVzIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorIyBOb3RlOiBUaGUgb3JkZXIgb2YgdGhlIGV4dHJhIHN0eWxlIHNoZWV0IGZpbGVzIGlzIG9mIGltcG9ydGFuY2UgKGUuZy4gdGhlIGxhc3QKKyMgc3R5bGUgc2hlZXQgaW4gdGhlIGxpc3Qgb3ZlcnJ1bGVzIHRoZSBzZXR0aW5nIG9mIHRoZSBwcmV2aW91cyBvbmVzIGluIHRoZQorIyBsaXN0KS4gRm9yIGFuIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0VYVFJBX1NUWUxFU0hFRVQgID0gCisKKyMgVGhlIEhUTUxfRVhUUkFfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZXh0cmEgaW1hZ2VzIG9yCisjIG90aGVyIHNvdXJjZSBmaWxlcyB3aGljaCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIE5vdGUKKyMgdGhhdCB0aGVzZSBmaWxlcyB3aWxsIGJlIGNvcGllZCB0byB0aGUgYmFzZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFVzZSB0aGUKKyMgJHJlbHBhdGheIG1hcmtlciBpbiB0aGUgSFRNTF9IRUFERVIgYW5kL29yIEhUTUxfRk9PVEVSIGZpbGVzIHRvIGxvYWQgdGhlc2UKKyMgZmlsZXMuIEluIHRoZSBIVE1MX1NUWUxFU0hFRVQgZmlsZSwgdXNlIHRoZSBmaWxlIG5hbWUgb25seS4gQWxzbyBub3RlIHRoYXQgdGhlCisjIGZpbGVzIHdpbGwgYmUgY29waWVkIGFzLWlzOyB0aGVyZSBhcmUgbm8gY29tbWFuZHMgb3IgbWFya2VycyBhdmFpbGFibGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRVhUUkFfRklMRVMgICAgICAgPSAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0hVRSB0YWcgY29udHJvbHMgdGhlIGNvbG9yIG9mIHRoZSBIVE1MIG91dHB1dC4gRG94eWdlbgorIyB3aWxsIGFkanVzdCB0aGUgY29sb3JzIGluIHRoZSBzdHlsZSBzaGVldCBhbmQgYmFja2dyb3VuZCBpbWFnZXMgYWNjb3JkaW5nIHRvCisjIHRoaXMgY29sb3IuIEh1ZSBpcyBzcGVjaWZpZWQgYXMgYW4gYW5nbGUgb24gYSBjb2xvcndoZWVsLCBzZWUKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IdWUgZm9yIG1vcmUgaW5mb3JtYXRpb24uIEZvciBpbnN0YW5jZSB0aGUgdmFsdWUKKyMgMCByZXByZXNlbnRzIHJlZCwgNjAgaXMgeWVsbG93LCAxMjAgaXMgZ3JlZW4sIDE4MCBpcyBjeWFuLCAyNDAgaXMgYmx1ZSwgMzAwCisjIHB1cnBsZSwgYW5kIDM2MCBpcyByZWQgYWdhaW4uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDM1OSwgZGVmYXVsdCB2YWx1ZTogMjIwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0NPTE9SU1RZTEVfSFVFICAgID0gMjIwCisKKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9TQVQgdGFnIGNvbnRyb2xzIHRoZSBwdXJpdHkgKG9yIHNhdHVyYXRpb24pIG9mIHRoZSBjb2xvcnMKKyMgaW4gdGhlIEhUTUwgb3V0cHV0LiBGb3IgYSB2YWx1ZSBvZiAwIHRoZSBvdXRwdXQgd2lsbCB1c2UgZ3JheXNjYWxlcyBvbmx5LiBBCisjIHZhbHVlIG9mIDI1NSB3aWxsIHByb2R1Y2UgdGhlIG1vc3Qgdml2aWQgY29sb3JzLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAyNTUsIGRlZmF1bHQgdmFsdWU6IDEwMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX1NBVCAgICA9IDEwMAorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfR0FNTUEgdGFnIGNvbnRyb2xzIHRoZSBnYW1tYSBjb3JyZWN0aW9uIGFwcGxpZWQgdG8gdGhlCisjIGx1bWluYW5jZSBjb21wb25lbnQgb2YgdGhlIGNvbG9ycyBpbiB0aGUgSFRNTCBvdXRwdXQuIFZhbHVlcyBiZWxvdyAxMDAKKyMgZ3JhZHVhbGx5IG1ha2UgdGhlIG91dHB1dCBsaWdodGVyLCB3aGVyZWFzIHZhbHVlcyBhYm92ZSAxMDAgbWFrZSB0aGUgb3V0cHV0CisjIGRhcmtlci4gVGhlIHZhbHVlIGRpdmlkZWQgYnkgMTAwIGlzIHRoZSBhY3R1YWwgZ2FtbWEgYXBwbGllZCwgc28gODAgcmVwcmVzZW50cworIyBhIGdhbW1hIG9mIDAuOCwgVGhlIHZhbHVlIDIyMCByZXByZXNlbnRzIGEgZ2FtbWEgb2YgMi4yLCBhbmQgMTAwIGRvZXMgbm90CisjIGNoYW5nZSB0aGUgZ2FtbWEuCisjIE1pbmltdW0gdmFsdWU6IDQwLCBtYXhpbXVtIHZhbHVlOiAyNDAsIGRlZmF1bHQgdmFsdWU6IDgwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0NPTE9SU1RZTEVfR0FNTUEgID0gODAKKworIyBJZiB0aGUgSFRNTF9USU1FU1RBTVAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZm9vdGVyIG9mIGVhY2ggZ2VuZXJhdGVkIEhUTUwKKyMgcGFnZSB3aWxsIGNvbnRhaW4gdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcGFnZSB3YXMgZ2VuZXJhdGVkLiBTZXR0aW5nIHRoaXMKKyMgdG8gWUVTIGNhbiBoZWxwIHRvIHNob3cgd2hlbiBkb3h5Z2VuIHdhcyBsYXN0IHJ1biBhbmQgdGh1cyBpZiB0aGUKKyMgZG9jdW1lbnRhdGlvbiBpcyB1cCB0byBkYXRlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfVElNRVNUQU1QICAgICAgICAgPSBOTworCisjIElmIHRoZSBIVE1MX0RZTkFNSUNfU0VDVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZ2VuZXJhdGVkIEhUTUwKKyMgZG9jdW1lbnRhdGlvbiB3aWxsIGNvbnRhaW4gc2VjdGlvbnMgdGhhdCBjYW4gYmUgaGlkZGVuIGFuZCBzaG93biBhZnRlciB0aGUKKyMgcGFnZSBoYXMgbG9hZGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRFlOQU1JQ19TRUNUSU9OUyAgPSBZRVMKKworIyBXaXRoIEhUTUxfSU5ERVhfTlVNX0VOVFJJRVMgb25lIGNhbiBjb250cm9sIHRoZSBwcmVmZXJyZWQgbnVtYmVyIG9mIGVudHJpZXMKKyMgc2hvd24gaW4gdGhlIHZhcmlvdXMgdHJlZSBzdHJ1Y3R1cmVkIGluZGljZXMgaW5pdGlhbGx5OyB0aGUgdXNlciBjYW4gZXhwYW5kCisjIGFuZCBjb2xsYXBzZSBlbnRyaWVzIGR5bmFtaWNhbGx5IGxhdGVyIG9uLiBEb3h5Z2VuIHdpbGwgZXhwYW5kIHRoZSB0cmVlIHRvCisjIHN1Y2ggYSBsZXZlbCB0aGF0IGF0IG1vc3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZW50cmllcyBhcmUgdmlzaWJsZSAodW5sZXNzCisjIGEgZnVsbHkgY29sbGFwc2VkIHRyZWUgYWxyZWFkeSBleGNlZWRzIHRoaXMgYW1vdW50KS4gU28gc2V0dGluZyB0aGUgbnVtYmVyIG9mCisjIGVudHJpZXMgMSB3aWxsIHByb2R1Y2UgYSBmdWxsIGNvbGxhcHNlZCB0cmVlIGJ5IGRlZmF1bHQuIDAgaXMgYSBzcGVjaWFsIHZhbHVlCisjIHJlcHJlc2VudGluZyBhbiBpbmZpbml0ZSBudW1iZXIgb2YgZW50cmllcyBhbmQgd2lsbCByZXN1bHQgaW4gYSBmdWxsIGV4cGFuZGVkCisjIHRyZWUgYnkgZGVmYXVsdC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogOTk5OSwgZGVmYXVsdCB2YWx1ZTogMTAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0lOREVYX05VTV9FTlRSSUVTID0gMTAwCisKKyMgSWYgdGhlIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcyB3aWxsIGJlCisjIGdlbmVyYXRlZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBBcHBsZSdzIFhjb2RlIDMgaW50ZWdyYXRlZCBkZXZlbG9wbWVudAorIyBlbnZpcm9ubWVudCAoc2VlOiBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS90b29scy94Y29kZS8pLCBpbnRyb2R1Y2VkIHdpdGgKKyMgT1NYIDEwLjUgKExlb3BhcmQpLiBUbyBjcmVhdGUgYSBkb2N1bWVudGF0aW9uIHNldCwgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgTWFrZWZpbGUgaW4gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gUnVubmluZyBtYWtlIHdpbGwgcHJvZHVjZSB0aGUgZG9jc2V0IGluCisjIHRoYXQgZGlyZWN0b3J5IGFuZCBydW5uaW5nIG1ha2UgaW5zdGFsbCB3aWxsIGluc3RhbGwgdGhlIGRvY3NldCBpbgorIyB+L0xpYnJhcnkvRGV2ZWxvcGVyL1NoYXJlZC9Eb2N1bWVudGF0aW9uL0RvY1NldHMgc28gdGhhdCBYY29kZSB3aWxsIGZpbmQgaXQgYXQKKyMgc3RhcnR1cC4gU2VlIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL2NyZWF0aW5nZG9jc2V0c3dpdGhkb3h5Z2VuLmh0bWwKKyMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfRE9DU0VUICAgICAgICA9IE5PCisKKyMgVGhpcyB0YWcgZGV0ZXJtaW5lcyB0aGUgbmFtZSBvZiB0aGUgZG9jc2V0IGZlZWQuIEEgZG9jdW1lbnRhdGlvbiBmZWVkIHByb3ZpZGVzCisjIGFuIHVtYnJlbGxhIHVuZGVyIHdoaWNoIG11bHRpcGxlIGRvY3VtZW50YXRpb24gc2V0cyBmcm9tIGEgc2luZ2xlIHByb3ZpZGVyCisjIChzdWNoIGFzIGEgY29tcGFueSBvciBwcm9kdWN0IHN1aXRlKSBjYW4gYmUgZ3JvdXBlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IERveHlnZW4gZ2VuZXJhdGVkIGRvY3MuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KKworRE9DU0VUX0ZFRUROQU1FICAgICAgICA9ICJEb3h5Z2VuIGdlbmVyYXRlZCBkb2NzIgorCisjIFRoaXMgdGFnIHNwZWNpZmllcyBhIHN0cmluZyB0aGF0IHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSB0aGUgZG9jdW1lbnRhdGlvbgorIyBzZXQgYnVuZGxlLiBUaGlzIHNob3VsZCBiZSBhIHJldmVyc2UgZG9tYWluLW5hbWUgc3R5bGUgc3RyaW5nLCBlLmcuCisjIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuIERveHlnZW4gd2lsbCBhcHBlbmQgLmRvY3NldCB0byB0aGUgbmFtZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KKworRE9DU0VUX0JVTkRMRV9JRCAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBUaGUgRE9DU0VUX1BVQkxJU0hFUl9JRCB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5CisjIHRoZSBkb2N1bWVudGF0aW9uIHB1Ymxpc2hlci4gVGhpcyBzaG91bGQgYmUgYSByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlCisjIHN0cmluZywgZS5nLiBjb20ubXljb21wYW55Lk15RG9jU2V0LmRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5QdWJsaXNoZXIuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KKworRE9DU0VUX1BVQkxJU0hFUl9JRCAgICA9IG9yZy5kb3h5Z2VuLlB1Ymxpc2hlcgorCisjIFRoZSBET0NTRVRfUFVCTElTSEVSX05BTUUgdGFnIGlkZW50aWZpZXMgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogUHVibGlzaGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9QVUJMSVNIRVJfTkFNRSAgPSBQdWJsaXNoZXIKKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIGdlbmVyYXRlcyB0aHJlZQorIyBhZGRpdGlvbmFsIEhUTUwgaW5kZXggZmlsZXM6IGluZGV4LmhocCwgaW5kZXguaGhjLCBhbmQgaW5kZXguaGhrLiBUaGUKKyMgaW5kZXguaGhwIGlzIGEgcHJvamVjdCBmaWxlIHRoYXQgY2FuIGJlIHJlYWQgYnkgTWljcm9zb2Z0J3MgSFRNTCBIZWxwIFdvcmtzaG9wCisjIChzZWU6IGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9lbi11cy9kb3dubG9hZC9kZXRhaWxzLmFzcHg/aWQ9MjExMzgpIG9uCisjIFdpbmRvd3MuCisjCisjIFRoZSBIVE1MIEhlbHAgV29ya3Nob3AgY29udGFpbnMgYSBjb21waWxlciB0aGF0IGNhbiBjb252ZXJ0IGFsbCBIVE1MIG91dHB1dAorIyBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpbnRvIGEgc2luZ2xlIGNvbXBpbGVkIEhUTUwgZmlsZSAoLmNobSkuIENvbXBpbGVkIEhUTUwKKyMgZmlsZXMgYXJlIG5vdyB1c2VkIGFzIHRoZSBXaW5kb3dzIDk4IGhlbHAgZm9ybWF0LCBhbmQgd2lsbCByZXBsYWNlIHRoZSBvbGQKKyMgV2luZG93cyBoZWxwIGZvcm1hdCAoLmhscCkgb24gYWxsIFdpbmRvd3MgcGxhdGZvcm1zIGluIHRoZSBmdXR1cmUuIENvbXByZXNzZWQKKyMgSFRNTCBmaWxlcyBhbHNvIGNvbnRhaW4gYW4gaW5kZXgsIGEgdGFibGUgb2YgY29udGVudHMsIGFuZCB5b3UgY2FuIHNlYXJjaCBmb3IKKyMgd29yZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZSBIVE1MIHdvcmtzaG9wIGFsc28gY29udGFpbnMgYSB2aWV3ZXIgZm9yCisjIGNvbXByZXNzZWQgSFRNTCBmaWxlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9IVE1MSEVMUCAgICAgID0gTk8KKworIyBUaGUgQ0hNX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5jaG0KKyMgZmlsZS4gWW91IGNhbiBhZGQgYSBwYXRoIGluIGZyb250IG9mIHRoZSBmaWxlIGlmIHRoZSByZXN1bHQgc2hvdWxkIG5vdCBiZQorIyB3cml0dGVuIHRvIHRoZSBodG1sIG91dHB1dCBkaXJlY3RvcnkuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitDSE1fRklMRSAgICAgICAgICAgICAgID0gCisKKyMgVGhlIEhIQ19MT0NBVElPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gKGFic29sdXRlIHBhdGgKKyMgaW5jbHVkaW5nIGZpbGUgbmFtZSkgb2YgdGhlIEhUTUwgaGVscCBjb21waWxlciAoaGhjLmV4ZSkuIElmIG5vbi1lbXB0eSwKKyMgZG94eWdlbiB3aWxsIHRyeSB0byBydW4gdGhlIEhUTUwgaGVscCBjb21waWxlciBvbiB0aGUgZ2VuZXJhdGVkIGluZGV4LmhocC4KKyMgVGhlIGZpbGUgaGFzIHRvIGJlIHNwZWNpZmllZCB3aXRoIGZ1bGwgcGF0aC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0hIQ19MT0NBVElPTiAgICAgICAgICAgPSAKKworIyBUaGUgR0VORVJBVEVfQ0hJIGZsYWcgY29udHJvbHMgaWYgYSBzZXBhcmF0ZSAuY2hpIGluZGV4IGZpbGUgaXMgZ2VuZXJhdGVkCisjIChZRVMpIG9yIHRoYXQgaXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBtYXN0ZXIgLmNobSBmaWxlIChOTykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0NISSAgICAgICAgICAgPSBOTworCisjIFRoZSBDSE1fSU5ERVhfRU5DT0RJTkcgaXMgdXNlZCB0byBlbmNvZGUgSHRtbEhlbHAgaW5kZXggKGhoayksIGNvbnRlbnQgKGhoYykKKyMgYW5kIHByb2plY3QgZmlsZSBjb250ZW50LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQ0hNX0lOREVYX0VOQ09ESU5HICAgICA9IAorCisjIFRoZSBCSU5BUllfVE9DIGZsYWcgY29udHJvbHMgd2hldGhlciBhIGJpbmFyeSB0YWJsZSBvZiBjb250ZW50cyBpcyBnZW5lcmF0ZWQKKyMgKFlFUykgb3IgYSBub3JtYWwgdGFibGUgb2YgY29udGVudHMgKE5PKSBpbiB0aGUgLmNobSBmaWxlLiBGdXJ0aGVybW9yZSBpdAorIyBlbmFibGVzIHRoZSBQcmV2aW91cyBhbmQgTmV4dCBidXR0b25zLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitCSU5BUllfVE9DICAgICAgICAgICAgID0gTk8KKworIyBUaGUgVE9DX0VYUEFORCBmbGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIGFkZCBleHRyYSBpdGVtcyBmb3IgZ3JvdXAgbWVtYmVycyB0bworIyB0aGUgdGFibGUgb2YgY29udGVudHMgb2YgdGhlIEhUTUwgaGVscCBkb2N1bWVudGF0aW9uIGFuZCB0byB0aGUgdHJlZSB2aWV3LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitUT0NfRVhQQU5EICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfUUhQIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBib3RoIFFIUF9OQU1FU1BBQ0UgYW5kCisjIFFIUF9WSVJUVUFMX0ZPTERFUiBhcmUgc2V0LCBhbiBhZGRpdGlvbmFsIGluZGV4IGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQgdGhhdAorIyBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgUXQncyBxaGVscGdlbmVyYXRvciB0byBnZW5lcmF0ZSBhIFF0IENvbXByZXNzZWQgSGVscAorIyAoLnFjaCkgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfUUhQICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFFIR19MT0NBVElPTiB0YWcgaXMgc3BlY2lmaWVkLCB0aGUgUUNIX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkKKyMgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5xY2ggZmlsZS4gVGhlIHBhdGggc3BlY2lmaWVkIGlzIHJlbGF0aXZlIHRvCisjIHRoZSBIVE1MIG91dHB1dCBmb2xkZXIuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUNIX0ZJTEUgICAgICAgICAgICAgICA9IAorCisjIFRoZSBRSFBfTkFNRVNQQUNFIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIFF0IEhlbHAKKyMgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gTmFtZXNwYWNlCisjIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNuYW1lc3BhY2UpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfTkFNRVNQQUNFICAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIFRoZSBRSFBfVklSVFVBTF9GT0xERVIgdGFnIHNwZWNpZmllcyB0aGUgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgUXQKKyMgSGVscCBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBWaXJ0dWFsCisjIEZvbGRlcnMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI3ZpcnR1YWwtCisjIGZvbGRlcnMpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogZG9jLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9WSVJUVUFMX0ZPTERFUiAgICAgPSBkb2MKKworIyBJZiB0aGUgUUhQX0NVU1RfRklMVEVSX05BTUUgdGFnIGlzIHNldCwgaXQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgY3VzdG9tCisjIGZpbHRlciB0byBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gQ3VzdG9tCisjIEZpbHRlcnMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS0KKyMgZmlsdGVycykuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX0NVU1RfRklMVEVSX05BTUUgICA9IAorCisjIFRoZSBRSFBfQ1VTVF9GSUxURVJfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUKKyMgY3VzdG9tIGZpbHRlciB0byBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gQ3VzdG9tCisjIEZpbHRlcnMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS0KKyMgZmlsdGVycykuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX0NVU1RfRklMVEVSX0FUVFJTICA9IAorCisjIFRoZSBRSFBfU0VDVF9GSUxURVJfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyB0aGlzCisjIHByb2plY3QncyBmaWx0ZXIgc2VjdGlvbiBtYXRjaGVzLiBRdCBIZWxwIFByb2plY3QgLyBGaWx0ZXIgQXR0cmlidXRlcyAoc2VlOgorIyBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjZmlsdGVyLWF0dHJpYnV0ZXMpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9TRUNUX0ZJTFRFUl9BVFRSUyAgPSAKKworIyBUaGUgUUhHX0xPQ0FUSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBRdCdzCisjIHFoZWxwZ2VuZXJhdG9yLiBJZiBub24tZW1wdHkgZG94eWdlbiB3aWxsIHRyeSB0byBydW4gcWhlbHBnZW5lcmF0b3Igb24gdGhlCisjIGdlbmVyYXRlZCAucWhwIGZpbGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhHX0xPQ0FUSU9OICAgICAgICAgICA9IAorCisjIElmIHRoZSBHRU5FUkFURV9FQ0xJUFNFSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcyB3aWxsIGJlCisjIGdlbmVyYXRlZCwgdG9nZXRoZXIgd2l0aCB0aGUgSFRNTCBmaWxlcywgdGhleSBmb3JtIGFuIEVjbGlwc2UgaGVscCBwbHVnaW4uIFRvCisjIGluc3RhbGwgdGhpcyBwbHVnaW4gYW5kIG1ha2UgaXQgYXZhaWxhYmxlIHVuZGVyIHRoZSBoZWxwIGNvbnRlbnRzIG1lbnUgaW4KKyMgRWNsaXBzZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MIGZpbGVzIG5lZWRzCisjIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBvZiBlY2xpcHNlLiBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5CisjIHdpdGhpbiB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBFQ0xJUFNFX0RPQ19JRCB2YWx1ZS4KKyMgQWZ0ZXIgY29weWluZyBFY2xpcHNlIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCBiZWZvcmUgdGhlIGhlbHAgYXBwZWFycy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9FQ0xJUFNFSEVMUCAgID0gTk8KKworIyBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRWNsaXBzZSBoZWxwIHBsdWdpbi4gV2hlbiBpbnN0YWxsaW5nIHRoZSBwbHVnaW4KKyMgdGhlIGRpcmVjdG9yeSBuYW1lIGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTCBmaWxlcyBzaG91bGQgYWxzbyBoYXZlIHRoaXMKKyMgbmFtZS4gRWFjaCBkb2N1bWVudGF0aW9uIHNldCBzaG91bGQgaGF2ZSBpdHMgb3duIGlkZW50aWZpZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5Qcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRUNMSVBTRUhFTFAgaXMgc2V0IHRvIFlFUy4KKworRUNMSVBTRV9ET0NfSUQgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBJZiB5b3Ugd2FudCBmdWxsIGNvbnRyb2wgb3ZlciB0aGUgbGF5b3V0IG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBwYWdlcyBpdCBtaWdodAorIyBiZSBuZWNlc3NhcnkgdG8gZGlzYWJsZSB0aGUgaW5kZXggYW5kIHJlcGxhY2UgaXQgd2l0aCB5b3VyIG93bi4gVGhlCisjIERJU0FCTEVfSU5ERVggdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBjb25kZW5zZWQgaW5kZXggKHRhYnMpIGF0IHRvcAorIyBvZiBlYWNoIEhUTUwgcGFnZS4gQSB2YWx1ZSBvZiBOTyBlbmFibGVzIHRoZSBpbmRleCBhbmQgdGhlIHZhbHVlIFlFUyBkaXNhYmxlcworIyBpdC4gU2luY2UgdGhlIHRhYnMgaW4gdGhlIGluZGV4IGNvbnRhaW4gdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIG5hdmlnYXRpb24KKyMgdHJlZSwgeW91IGNhbiBzZXQgdGhpcyBvcHRpb24gdG8gWUVTIGlmIHlvdSBhbHNvIHNldCBHRU5FUkFURV9UUkVFVklFVyB0byBZRVMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRElTQUJMRV9JTkRFWCAgICAgICAgICA9IE5PCisKKyMgVGhlIEdFTkVSQVRFX1RSRUVWSUVXIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBhIHRyZWUtbGlrZSBpbmRleAorIyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGdlbmVyYXRlZCB0byBkaXNwbGF5IGhpZXJhcmNoaWNhbCBpbmZvcm1hdGlvbi4gSWYgdGhlIHRhZworIyB2YWx1ZSBpcyBzZXQgdG8gWUVTLCBhIHNpZGUgcGFuZWwgd2lsbCBiZSBnZW5lcmF0ZWQgY29udGFpbmluZyBhIHRyZWUtbGlrZQorIyBpbmRleCBzdHJ1Y3R1cmUgKGp1c3QgbGlrZSB0aGUgb25lIHRoYXQgaXMgZ2VuZXJhdGVkIGZvciBIVE1MIEhlbHApLiBGb3IgdGhpcworIyB0byB3b3JrIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzIEphdmFTY3JpcHQsIERIVE1MLCBDU1MgYW5kIGZyYW1lcyBpcyByZXF1aXJlZAorIyAoaS5lLiBhbnkgbW9kZXJuIGJyb3dzZXIpLiBXaW5kb3dzIHVzZXJzIGFyZSBwcm9iYWJseSBiZXR0ZXIgb2ZmIHVzaW5nIHRoZQorIyBIVE1MIGhlbHAgZmVhdHVyZS4gVmlhIGN1c3RvbSBzdHlsZSBzaGVldHMgKHNlZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQpIG9uZSBjYW4KKyMgZnVydGhlciBmaW5lLXR1bmUgdGhlIGxvb2sgb2YgdGhlIGluZGV4LiBBcyBhbiBleGFtcGxlLCB0aGUgZGVmYXVsdCBzdHlsZQorIyBzaGVldCBnZW5lcmF0ZWQgYnkgZG94eWdlbiBoYXMgYW4gZXhhbXBsZSB0aGF0IHNob3dzIGhvdyB0byBwdXQgYW4gaW1hZ2UgYXQKKyMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgaW5zdGVhZCBvZiB0aGUgUFJPSkVDVF9OQU1FLiBTaW5jZSB0aGUgdHJlZSBiYXNpY2FsbHkgaGFzCisjIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZSB0YWIgaW5kZXgsIHlvdSBjb3VsZCBjb25zaWRlciBzZXR0aW5nCisjIERJU0FCTEVfSU5ERVggdG8gWUVTIHdoZW4gZW5hYmxpbmcgdGhpcyBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfVFJFRVZJRVcgICAgICA9IFlFUworCisjIFRoZSBFTlVNX1ZBTFVFU19QRVJfTElORSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgZW51bSB2YWx1ZXMgdGhhdAorIyBkb3h5Z2VuIHdpbGwgZ3JvdXAgb24gb25lIGxpbmUgaW4gdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisjCisjIE5vdGUgdGhhdCBhIHZhbHVlIG9mIDAgd2lsbCBjb21wbGV0ZWx5IHN1cHByZXNzIHRoZSBlbnVtIHZhbHVlcyBmcm9tIGFwcGVhcmluZworIyBpbiB0aGUgb3ZlcnZpZXcgc2VjdGlvbi4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMjAsIGRlZmF1bHQgdmFsdWU6IDQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0VOVU1fVkFMVUVTX1BFUl9MSU5FICAgPSA0CisKKyMgSWYgdGhlIHRyZWV2aWV3IGlzIGVuYWJsZWQgKHNlZSBHRU5FUkFURV9UUkVFVklFVykgdGhlbiB0aGlzIHRhZyBjYW4gYmUgdXNlZAorIyB0byBzZXQgdGhlIGluaXRpYWwgd2lkdGggKGluIHBpeGVscykgb2YgdGhlIGZyYW1lIGluIHdoaWNoIHRoZSB0cmVlIGlzIHNob3duLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxNTAwLCBkZWZhdWx0IHZhbHVlOiAyNTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK1RSRUVWSUVXX1dJRFRIICAgICAgICAgPSAyNTAKKworIyBJZiB0aGUgRVhUX0xJTktTX0lOX1dJTkRPVyBvcHRpb24gaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIG9wZW4gbGlua3MgdG8KKyMgZXh0ZXJuYWwgc3ltYm9scyBpbXBvcnRlZCB2aWEgdGFnIGZpbGVzIGluIGEgc2VwYXJhdGUgd2luZG93LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0VYVF9MSU5LU19JTl9XSU5ET1cgICAgPSBOTworCisjIFVzZSB0aGlzIHRhZyB0byBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBvZiBMYVRlWCBmb3JtdWxhcyBpbmNsdWRlZCBhcyBpbWFnZXMgaW4KKyMgdGhlIEhUTUwgZG9jdW1lbnRhdGlvbi4gV2hlbiB5b3UgY2hhbmdlIHRoZSBmb250IHNpemUgYWZ0ZXIgYSBzdWNjZXNzZnVsCisjIGRveHlnZW4gcnVuIHlvdSBuZWVkIHRvIG1hbnVhbGx5IHJlbW92ZSBhbnkgZm9ybV8qLnBuZyBpbWFnZXMgZnJvbSB0aGUgSFRNTAorIyBvdXRwdXQgZGlyZWN0b3J5IHRvIGZvcmNlIHRoZW0gdG8gYmUgcmVnZW5lcmF0ZWQuCisjIE1pbmltdW0gdmFsdWU6IDgsIG1heGltdW0gdmFsdWU6IDUwLCBkZWZhdWx0IHZhbHVlOiAxMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRk9STVVMQV9GT05UU0laRSAgICAgICA9IDEwCisKKyMgVXNlIHRoZSBGT1JNVUxBX1RSQU5QQVJFTlQgdGFnIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgaW1hZ2VzCisjIGdlbmVyYXRlZCBmb3IgZm9ybXVsYXMgYXJlIHRyYW5zcGFyZW50IFBOR3MuIFRyYW5zcGFyZW50IFBOR3MgYXJlIG5vdAorIyBzdXBwb3J0ZWQgcHJvcGVybHkgZm9yIElFIDYuMCwgYnV0IGFyZSBzdXBwb3J0ZWQgb24gYWxsIG1vZGVybiBicm93c2Vycy4KKyMKKyMgTm90ZSB0aGF0IHdoZW4gY2hhbmdpbmcgdGhpcyBvcHRpb24geW91IG5lZWQgdG8gZGVsZXRlIGFueSBmb3JtXyoucG5nIGZpbGVzIGluCisjIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkgYmVmb3JlIHRoZSBjaGFuZ2VzIGhhdmUgZWZmZWN0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitGT1JNVUxBX1RSQU5TUEFSRU5UICAgID0gWUVTCisKKyMgRW5hYmxlIHRoZSBVU0VfTUFUSEpBWCBvcHRpb24gdG8gcmVuZGVyIExhVGVYIGZvcm11bGFzIHVzaW5nIE1hdGhKYXggKHNlZQorIyBodHRwOi8vd3d3Lm1hdGhqYXgub3JnKSB3aGljaCB1c2VzIGNsaWVudCBzaWRlIEphdmFzY3JpcHQgZm9yIHRoZSByZW5kZXJpbmcKKyMgaW5zdGVhZCBvZiB1c2luZyBwcmUtcmVuZGVyZWQgYml0bWFwcy4gVXNlIHRoaXMgaWYgeW91IGRvIG5vdCBoYXZlIExhVGVYCisjIGluc3RhbGxlZCBvciBpZiB5b3Ugd2FudCB0byBmb3JtdWxhcyBsb29rIHByZXR0aWVyIGluIHRoZSBIVE1MIG91dHB1dC4gV2hlbgorIyBlbmFibGVkIHlvdSBtYXkgYWxzbyBuZWVkIHRvIGluc3RhbGwgTWF0aEpheCBzZXBhcmF0ZWx5IGFuZCBjb25maWd1cmUgdGhlIHBhdGgKKyMgdG8gaXQgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworVVNFX01BVEhKQVggICAgICAgICAgICA9IE5PCisKKyMgV2hlbiBNYXRoSmF4IGlzIGVuYWJsZWQgeW91IGNhbiBzZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCB0byBiZSB1c2VkIGZvcgorIyB0aGUgTWF0aEpheCBvdXRwdXQuIFNlZSB0aGUgTWF0aEpheCBzaXRlIChzZWU6CisjIGh0dHA6Ly9kb2NzLm1hdGhqYXgub3JnL2VuL2xhdGVzdC9vdXRwdXQuaHRtbCkgZm9yIG1vcmUgZGV0YWlscy4KKyMgUG9zc2libGUgdmFsdWVzIGFyZTogSFRNTC1DU1MgKHdoaWNoIGlzIHNsb3dlciwgYnV0IGhhcyB0aGUgYmVzdAorIyBjb21wYXRpYmlsaXR5KSwgTmF0aXZlTU1MIChpLmUuIE1hdGhNTCkgYW5kIFNWRy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IEhUTUwtQ1NTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9GT1JNQVQgICAgICAgICA9IEhUTUwtQ1NTCisKKyMgV2hlbiBNYXRoSmF4IGlzIGVuYWJsZWQgeW91IG5lZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIEhUTUwKKyMgb3V0cHV0IGRpcmVjdG9yeSB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4gVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQorIyBzaG91bGQgY29udGFpbiB0aGUgTWF0aEpheC5qcyBzY3JpcHQuIEZvciBpbnN0YW5jZSwgaWYgdGhlIG1hdGhqYXggZGlyZWN0b3J5CisjIGlzIGxvY2F0ZWQgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSwgdGhlbgorIyBNQVRISkFYX1JFTFBBVEggc2hvdWxkIGJlIC4uL21hdGhqYXguIFRoZSBkZWZhdWx0IHZhbHVlIHBvaW50cyB0byB0aGUgTWF0aEpheAorIyBDb250ZW50IERlbGl2ZXJ5IE5ldHdvcmsgc28geW91IGNhbiBxdWlja2x5IHNlZSB0aGUgcmVzdWx0IHdpdGhvdXQgaW5zdGFsbGluZworIyBNYXRoSmF4LiBIb3dldmVyLCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBpbnN0YWxsIGEgbG9jYWwgY29weSBvZgorIyBNYXRoSmF4IGZyb20gaHR0cDovL3d3dy5tYXRoamF4Lm9yZyBiZWZvcmUgZGVwbG95bWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGh0dHA6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX1JFTFBBVEggICAgICAgID0gaHR0cDovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdAorCisjIFRoZSBNQVRISkFYX0VYVEVOU0lPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgTWF0aEpheAorIyBleHRlbnNpb24gbmFtZXMgdGhhdCBzaG91bGQgYmUgZW5hYmxlZCBkdXJpbmcgTWF0aEpheCByZW5kZXJpbmcuIEZvciBleGFtcGxlCisjIE1BVEhKQVhfRVhURU5TSU9OUyA9IFRlWC9BTVNtYXRoIFRlWC9BTVNzeW1ib2xzCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX0VYVEVOU0lPTlMgICAgID0gCisKKyMgVGhlIE1BVEhKQVhfQ09ERUZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBmaWxlIHdpdGggamF2YXNjcmlwdCBwaWVjZXMKKyMgb2YgY29kZSB0aGF0IHdpbGwgYmUgdXNlZCBvbiBzdGFydHVwIG9mIHRoZSBNYXRoSmF4IGNvZGUuIFNlZSB0aGUgTWF0aEpheCBzaXRlCisjIChzZWU6IGh0dHA6Ly9kb2NzLm1hdGhqYXgub3JnL2VuL2xhdGVzdC9vdXRwdXQuaHRtbCkgZm9yIG1vcmUgZGV0YWlscy4gRm9yIGFuCisjIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9DT0RFRklMRSAgICAgICA9IAorCisjIFdoZW4gdGhlIFNFQVJDSEVOR0lORSB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzZWFyY2ggYm94IGZvcgorIyB0aGUgSFRNTCBvdXRwdXQuIFRoZSB1bmRlcmx5aW5nIHNlYXJjaCBlbmdpbmUgdXNlcyBqYXZhc2NyaXB0IGFuZCBESFRNTCBhbmQKKyMgc2hvdWxkIHdvcmsgb24gYW55IG1vZGVybiBicm93c2VyLiBOb3RlIHRoYXQgd2hlbiB1c2luZyBIVE1MIGhlbHAKKyMgKEdFTkVSQVRFX0hUTUxIRUxQKSwgUXQgaGVscCAoR0VORVJBVEVfUUhQKSwgb3IgZG9jc2V0cyAoR0VORVJBVEVfRE9DU0VUKQorIyB0aGVyZSBpcyBhbHJlYWR5IGEgc2VhcmNoIGZ1bmN0aW9uIHNvIHRoaXMgb25lIHNob3VsZCB0eXBpY2FsbHkgYmUgZGlzYWJsZWQuCisjIEZvciBsYXJnZSBwcm9qZWN0cyB0aGUgamF2YXNjcmlwdCBiYXNlZCBzZWFyY2ggZW5naW5lIGNhbiBiZSBzbG93LCB0aGVuCisjIGVuYWJsaW5nIFNFUlZFUl9CQVNFRF9TRUFSQ0ggbWF5IHByb3ZpZGUgYSBiZXR0ZXIgc29sdXRpb24uIEl0IGlzIHBvc3NpYmxlIHRvCisjIHNlYXJjaCB1c2luZyB0aGUga2V5Ym9hcmQ7IHRvIGp1bXAgdG8gdGhlIHNlYXJjaCBib3ggdXNlIDxhY2Nlc3Mga2V5PiArIFMKKyMgKHdoYXQgdGhlIDxhY2Nlc3Mga2V5PiBpcyBkZXBlbmRzIG9uIHRoZSBPUyBhbmQgYnJvd3NlciwgYnV0IGl0IGlzIHR5cGljYWxseQorIyA8Q1RSTD4sIDxBTFQ+LzxvcHRpb24+LCBvciBib3RoKS4gSW5zaWRlIHRoZSBzZWFyY2ggYm94IHVzZSB0aGUgPGN1cnNvciBkb3duCisjIGtleT4gdG8ganVtcCBpbnRvIHRoZSBzZWFyY2ggcmVzdWx0cyB3aW5kb3csIHRoZSByZXN1bHRzIGNhbiBiZSBuYXZpZ2F0ZWQKKyMgdXNpbmcgdGhlIDxjdXJzb3Iga2V5cz4uIFByZXNzIDxFbnRlcj4gdG8gc2VsZWN0IGFuIGl0ZW0gb3IgPGVzY2FwZT4gdG8gY2FuY2VsCisjIHRoZSBzZWFyY2guIFRoZSBmaWx0ZXIgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgd2hlbiB0aGUgY3Vyc29yIGlzIGluc2lkZSB0aGUKKyMgc2VhcmNoIGJveCBieSBwcmVzc2luZyA8U2hpZnQ+KzxjdXJzb3IgZG93bj4uIEFsc28gaGVyZSB1c2UgdGhlIDxjdXJzb3Iga2V5cz4KKyMgdG8gc2VsZWN0IGEgZmlsdGVyIGFuZCA8RW50ZXI+IG9yIDxlc2NhcGU+IHRvIGFjdGl2YXRlIG9yIGNhbmNlbCB0aGUgZmlsdGVyCisjIG9wdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworU0VBUkNIRU5HSU5FICAgICAgICAgICA9IFlFUworCisjIFdoZW4gdGhlIFNFUlZFUl9CQVNFRF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgdGhlIHNlYXJjaCBlbmdpbmUgd2lsbCBiZQorIyBpbXBsZW1lbnRlZCB1c2luZyBhIHdlYiBzZXJ2ZXIgaW5zdGVhZCBvZiBhIHdlYiBjbGllbnQgdXNpbmcgSmF2YXNjcmlwdC4gVGhlcmUKKyMgYXJlIHR3byBmbGF2b3JzIG9mIHdlYiBzZXJ2ZXIgYmFzZWQgc2VhcmNoaW5nIGRlcGVuZGluZyBvbiB0aGUgRVhURVJOQUxfU0VBUkNICisjIHNldHRpbmcuIFdoZW4gZGlzYWJsZWQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIFBIUCBzY3JpcHQgZm9yIHNlYXJjaGluZyBhbmQKKyMgYW4gaW5kZXggZmlsZSB1c2VkIGJ5IHRoZSBzY3JpcHQuIFdoZW4gRVhURVJOQUxfU0VBUkNIIGlzIGVuYWJsZWQgdGhlIGluZGV4aW5nCisjIGFuZCBzZWFyY2hpbmcgbmVlZHMgdG8gYmUgcHJvdmlkZWQgYnkgZXh0ZXJuYWwgdG9vbHMuIFNlZSB0aGUgc2VjdGlvbgorIyAiRXh0ZXJuYWwgSW5kZXhpbmcgYW5kIFNlYXJjaGluZyIgZm9yIGRldGFpbHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitTRVJWRVJfQkFTRURfU0VBUkNIICAgID0gTk8KKworIyBXaGVuIEVYVEVSTkFMX1NFQVJDSCB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgbm8gbG9uZ2VyIGdlbmVyYXRlIHRoZSBQSFAKKyMgc2NyaXB0IGZvciBzZWFyY2hpbmcuIEluc3RlYWQgdGhlIHNlYXJjaCByZXN1bHRzIGFyZSB3cml0dGVuIHRvIGFuIFhNTCBmaWxlCisjIHdoaWNoIG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBieSBhbiBleHRlcm5hbCBpbmRleGVyLiBEb3h5Z2VuIHdpbGwgaW52b2tlIGFuCisjIGV4dGVybmFsIHNlYXJjaCBlbmdpbmUgcG9pbnRlZCB0byBieSB0aGUgU0VBUkNIRU5HSU5FX1VSTCBvcHRpb24gdG8gb2J0YWluIHRoZQorIyBzZWFyY2ggcmVzdWx0cy4KKyMKKyMgRG94eWdlbiBzaGlwcyB3aXRoIGFuIGV4YW1wbGUgaW5kZXhlciAoZG94eWluZGV4ZXIpIGFuZCBzZWFyY2ggZW5naW5lCisjIChkb3h5c2VhcmNoLmNnaSkgd2hpY2ggYXJlIGJhc2VkIG9uIHRoZSBvcGVuIHNvdXJjZSBzZWFyY2ggZW5naW5lIGxpYnJhcnkKKyMgWGFwaWFuIChzZWU6IGh0dHA6Ly94YXBpYW4ub3JnLykuCisjCisjIFNlZSB0aGUgc2VjdGlvbiAiRXh0ZXJuYWwgSW5kZXhpbmcgYW5kIFNlYXJjaGluZyIgZm9yIGRldGFpbHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitFWFRFUk5BTF9TRUFSQ0ggICAgICAgID0gTk8KKworIyBUaGUgU0VBUkNIRU5HSU5FX1VSTCBzaG91bGQgcG9pbnQgdG8gYSBzZWFyY2ggZW5naW5lIGhvc3RlZCBieSBhIHdlYiBzZXJ2ZXIKKyMgd2hpY2ggd2lsbCByZXR1cm4gdGhlIHNlYXJjaCByZXN1bHRzIHdoZW4gRVhURVJOQUxfU0VBUkNIIGlzIGVuYWJsZWQuCisjCisjIERveHlnZW4gc2hpcHMgd2l0aCBhbiBleGFtcGxlIGluZGV4ZXIgKGRveHlpbmRleGVyKSBhbmQgc2VhcmNoIGVuZ2luZQorIyAoZG94eXNlYXJjaC5jZ2kpIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgb3BlbiBzb3VyY2Ugc2VhcmNoIGVuZ2luZSBsaWJyYXJ5CisjIFhhcGlhbiAoc2VlOiBodHRwOi8veGFwaWFuLm9yZy8pLiBTZWUgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZAorIyBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSEVOR0lORV9VUkwgICAgICAgPSAKKworIyBXaGVuIFNFUlZFUl9CQVNFRF9TRUFSQ0ggYW5kIEVYVEVSTkFMX1NFQVJDSCBhcmUgYm90aCBlbmFibGVkIHRoZSB1bmluZGV4ZWQKKyMgc2VhcmNoIGRhdGEgaXMgd3JpdHRlbiB0byBhIGZpbGUgZm9yIGluZGV4aW5nIGJ5IGFuIGV4dGVybmFsIHRvb2wuIFdpdGggdGhlCisjIFNFQVJDSERBVEFfRklMRSB0YWcgdGhlIG5hbWUgb2YgdGhpcyBmaWxlIGNhbiBiZSBzcGVjaWZpZWQuCisjIFRoZSBkZWZhdWx0IGZpbGUgaXM6IHNlYXJjaGRhdGEueG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSERBVEFfRklMRSAgICAgICAgPSBzZWFyY2hkYXRhLnhtbAorCisjIFdoZW4gU0VSVkVSX0JBU0VEX1NFQVJDSCBhbmQgRVhURVJOQUxfU0VBUkNIIGFyZSBib3RoIGVuYWJsZWQgdGhlCisjIEVYVEVSTkFMX1NFQVJDSF9JRCB0YWcgY2FuIGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBmb3IgdGhlIHByb2plY3QuIFRoaXMgaXMKKyMgdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGggRVhUUkFfU0VBUkNIX01BUFBJTkdTIHRvIHNlYXJjaCB0aHJvdWdoIG11bHRpcGxlCisjIHByb2plY3RzIGFuZCByZWRpcmVjdCB0aGUgcmVzdWx0cyBiYWNrIHRvIHRoZSByaWdodCBwcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK0VYVEVSTkFMX1NFQVJDSF9JRCAgICAgPSAKKworIyBUaGUgRVhUUkFfU0VBUkNIX01BUFBJTkdTIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgc2VhcmNoaW5nIHRocm91Z2ggZG94eWdlbgorIyBwcm9qZWN0cyBvdGhlciB0aGFuIHRoZSBvbmUgZGVmaW5lZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwgYnV0IHRoYXQgYXJlCisjIGFsbCBhZGRlZCB0byB0aGUgc2FtZSBleHRlcm5hbCBzZWFyY2ggaW5kZXguIEVhY2ggcHJvamVjdCBuZWVkcyB0byBoYXZlIGEKKyMgdW5pcXVlIGlkIHNldCB2aWEgRVhURVJOQUxfU0VBUkNIX0lELiBUaGUgc2VhcmNoIG1hcHBpbmcgdGhlbiBtYXBzIHRoZSBpZCBvZgorIyB0byBhIHJlbGF0aXZlIGxvY2F0aW9uIHdoZXJlIHRoZSBkb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZC4gVGhlIGZvcm1hdCBpczoKKyMgRVhUUkFfU0VBUkNIX01BUFBJTkdTID0gdGFnbmFtZTE9bG9jMSB0YWduYW1lMj1sb2MyIC4uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK0VYVFJBX1NFQVJDSF9NQVBQSU5HUyAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgTGFUZVggb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgTGFUZVggb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9MQVRFWCAgICAgICAgID0gTk8KKworIyBUaGUgTEFURVhfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIExhVGVYIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGxhdGV4LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfT1VUUFVUICAgICAgICAgICA9IGxhdGV4CisKKyMgVGhlIExBVEVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBMYVRlWCBjb21tYW5kIG5hbWUgdG8gYmUKKyMgaW52b2tlZC4KKyMKKyMgTm90ZSB0aGF0IHdoZW4gZW5hYmxpbmcgVVNFX1BERkxBVEVYIHRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZCBmb3IgZ2VuZXJhdGluZworIyBiaXRtYXBzIGZvciBmb3JtdWxhcyBpbiB0aGUgSFRNTCBvdXRwdXQsIGJ1dCBub3QgaW4gdGhlIE1ha2VmaWxlIHRoYXQgaXMKKyMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKyMgVGhlIGRlZmF1bHQgZmlsZSBpczogbGF0ZXguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9DTURfTkFNRSAgICAgICAgID0gbGF0ZXgKKworIyBUaGUgTUFLRUlOREVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb21tYW5kIG5hbWUgdG8gZ2VuZXJhdGUKKyMgaW5kZXggZm9yIExhVGVYLgorIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBtYWtlaW5kZXguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitNQUtFSU5ERVhfQ01EX05BTUUgICAgID0gbWFrZWluZGV4CisKKyMgSWYgdGhlIENPTVBBQ1RfTEFURVggdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdCBMYVRlWAorIyBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvIHNhdmUgc29tZQorIyB0cmVlcyBpbiBnZW5lcmFsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitDT01QQUNUX0xBVEVYICAgICAgICAgID0gTk8KKworIyBUaGUgUEFQRVJfVFlQRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBwYXBlciB0eXBlIHRoYXQgaXMgdXNlZCBieSB0aGUKKyMgcHJpbnRlci4KKyMgUG9zc2libGUgdmFsdWVzIGFyZTogYTQgKDIxMCB4IDI5NyBtbSksIGxldHRlciAoOC41IHggMTEgaW5jaGVzKSwgbGVnYWwgKDguNSB4CisjIDE0IGluY2hlcykgYW5kIGV4ZWN1dGl2ZSAoNy4yNSB4IDEwLjUgaW5jaGVzKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGE0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworUEFQRVJfVFlQRSAgICAgICAgICAgICA9IGE0CisKKyMgVGhlIEVYVFJBX1BBQ0tBR0VTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIExhVGVYIHBhY2thZ2UgbmFtZXMKKyMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIExhVGVYIG91dHB1dC4gVGhlIHBhY2thZ2UgY2FuIGJlIHNwZWNpZmllZCBqdXN0CisjIGJ5IGl0cyBuYW1lIG9yIHdpdGggdGhlIGNvcnJlY3Qgc3ludGF4IGFzIHRvIGJlIHVzZWQgd2l0aCB0aGUgTGFUZVgKKyMgXHVzZXBhY2thZ2UgY29tbWFuZC4gVG8gZ2V0IHRoZSB0aW1lcyBmb250IGZvciBpbnN0YW5jZSB5b3UgY2FuIHNwZWNpZnkgOgorIyBFWFRSQV9QQUNLQUdFUz10aW1lcyBvciBFWFRSQV9QQUNLQUdFUz17dGltZXN9CisjIFRvIHVzZSB0aGUgb3B0aW9uIGludGxpbWl0cyB3aXRoIHRoZSBhbXNtYXRoIHBhY2thZ2UgeW91IGNhbiBzcGVjaWZ5OgorIyBFWFRSQV9QQUNLQUdFUz1baW50bGltaXRzXXthbXNtYXRofQorIyBJZiBsZWZ0IGJsYW5rIG5vIGV4dHJhIHBhY2thZ2VzIHdpbGwgYmUgaW5jbHVkZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0gCisKKyMgVGhlIExBVEVYX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGhlYWRlciBmb3IgdGhlCisjIGdlbmVyYXRlZCBMYVRlWCBkb2N1bWVudC4gVGhlIGhlYWRlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIHVudGlsIHRoZSBmaXJzdAorIyBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkIGhlYWRlci4gU2VlCisjIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gbGV0IGRveHlnZW4gd3JpdGUgdGhlCisjIGRlZmF1bHQgaGVhZGVyIHRvIGEgc2VwYXJhdGUgZmlsZS4KKyMKKyMgTm90ZTogT25seSB1c2UgYSB1c2VyLWRlZmluZWQgaGVhZGVyIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEgVGhlCisjIGZvbGxvd2luZyBjb21tYW5kcyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nIGluc2lkZSB0aGUgaGVhZGVyOiAkdGl0bGUsCisjICRkYXRldGltZSwgJGRhdGUsICRkb3h5Z2VudmVyc2lvbiwgJHByb2plY3RuYW1lLCAkcHJvamVjdG51bWJlciwKKyMgJHByb2plY3RicmllZiwgJHByb2plY3Rsb2dvLiBEb3h5Z2VuIHdpbGwgcmVwbGFjZSAkdGl0bGUgd2l0aCB0aGUgZW1wdHkKKyMgc3RyaW5nLCBmb3IgdGhlIHJlcGxhY2VtZW50IHZhbHVlcyBvZiB0aGUgb3RoZXIgY29tbWFuZHMgdGhlIHVzZXIgaXMgcmVmZXJyZWQKKyMgdG8gSFRNTF9IRUFERVIuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9IRUFERVIgICAgICAgICAgID0gCisKKyMgVGhlIExBVEVYX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGZvb3RlciBmb3IgdGhlCisjIGdlbmVyYXRlZCBMYVRlWCBkb2N1bWVudC4gVGhlIGZvb3RlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIGFmdGVyIHRoZSBsYXN0CisjIGNoYXB0ZXIuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc3RhbmRhcmQgZm9vdGVyLiBTZWUKKyMgTEFURVhfSEVBREVSIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSBhIGRlZmF1bHQgZm9vdGVyIGFuZCB3aGF0CisjIHNwZWNpYWwgY29tbWFuZHMgY2FuIGJlIHVzZWQgaW5zaWRlIHRoZSBmb290ZXIuCisjCisjIE5vdGU6IE9ubHkgdXNlIGEgdXNlci1kZWZpbmVkIGZvb3RlciBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9GT09URVIgICAgICAgICAgID0gCisKKyMgVGhlIExBVEVYX0VYVFJBX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYWRkaXRpb25hbCB1c2VyLWRlZmluZWQKKyMgTGFUZVggc3R5bGUgc2hlZXRzIHRoYXQgYXJlIGluY2x1ZGVkIGFmdGVyIHRoZSBzdGFuZGFyZCBzdHlsZSBzaGVldHMgY3JlYXRlZAorIyBieSBkb3h5Z2VuLiBVc2luZyB0aGlzIG9wdGlvbiBvbmUgY2FuIG92ZXJydWxlIGNlcnRhaW4gc3R5bGUgYXNwZWN0cy4gRG94eWdlbgorIyB3aWxsIGNvcHkgdGhlIHN0eWxlIHNoZWV0IGZpbGVzIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorIyBOb3RlOiBUaGUgb3JkZXIgb2YgdGhlIGV4dHJhIHN0eWxlIHNoZWV0IGZpbGVzIGlzIG9mIGltcG9ydGFuY2UgKGUuZy4gdGhlIGxhc3QKKyMgc3R5bGUgc2hlZXQgaW4gdGhlIGxpc3Qgb3ZlcnJ1bGVzIHRoZSBzZXR0aW5nIG9mIHRoZSBwcmV2aW91cyBvbmVzIGluIHRoZQorIyBsaXN0KS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0VYVFJBX1NUWUxFU0hFRVQgPSAKKworIyBUaGUgTEFURVhfRVhUUkFfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZXh0cmEgaW1hZ2VzIG9yCisjIG90aGVyIHNvdXJjZSBmaWxlcyB3aGljaCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBMQVRFWF9PVVRQVVQgb3V0cHV0CisjIGRpcmVjdG9yeS4gTm90ZSB0aGF0IHRoZSBmaWxlcyB3aWxsIGJlIGNvcGllZCBhcy1pczsgdGhlcmUgYXJlIG5vIGNvbW1hbmRzIG9yCisjIG1hcmtlcnMgYXZhaWxhYmxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfRVhUUkFfRklMRVMgICAgICA9IAorCisjIElmIHRoZSBQREZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIExhVGVYIHRoYXQgaXMgZ2VuZXJhdGVkIGlzCisjIHByZXBhcmVkIGZvciBjb252ZXJzaW9uIHRvIFBERiAodXNpbmcgcHMycGRmIG9yIHBkZmxhdGV4KS4gVGhlIFBERiBmaWxlIHdpbGwKKyMgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMuIFRoaXMKKyMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lIGJyb3dzaW5nIHVzaW5nIGEgUERGIHZpZXdlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK1BERl9IWVBFUkxJTktTICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVVNFX1BERkxBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgdXNlIHBkZmxhdGV4IHRvIGdlbmVyYXRlCisjIHRoZSBQREYgZmlsZSBkaXJlY3RseSBmcm9tIHRoZSBMYVRlWCBmaWxlcy4gU2V0IHRoaXMgb3B0aW9uIHRvIFlFUywgdG8gZ2V0IGEKKyMgaGlnaGVyIHF1YWxpdHkgUERGIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitVU0VfUERGTEFURVggICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIExBVEVYX0JBVENITU9ERSB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGFkZCB0aGUgXGJhdGNobW9kZQorIyBjb21tYW5kIHRvIHRoZSBnZW5lcmF0ZWQgTGFUZVggZmlsZXMuIFRoaXMgd2lsbCBpbnN0cnVjdCBMYVRlWCB0byBrZWVwIHJ1bm5pbmcKKyMgaWYgZXJyb3JzIG9jY3VyLCBpbnN0ZWFkIG9mIGFza2luZyB0aGUgdXNlciBmb3IgaGVscC4gVGhpcyBvcHRpb24gaXMgYWxzbyB1c2VkCisjIHdoZW4gZ2VuZXJhdGluZyBmb3JtdWxhcyBpbiBIVE1MLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9CQVRDSE1PREUgICAgICAgID0gTk8KKworIyBJZiB0aGUgTEFURVhfSElERV9JTkRJQ0VTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIG5vdCBpbmNsdWRlIHRoZQorIyBpbmRleCBjaGFwdGVycyAoc3VjaCBhcyBGaWxlIEluZGV4LCBDb21wb3VuZCBJbmRleCwgZXRjLikgaW4gdGhlIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfSElERV9JTkRJQ0VTICAgICA9IE5PCisKKyMgSWYgdGhlIExBVEVYX1NPVVJDRV9DT0RFIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGluY2x1ZGUgc291cmNlCisjIGNvZGUgd2l0aCBzeW50YXggaGlnaGxpZ2h0aW5nIGluIHRoZSBMYVRlWCBvdXRwdXQuCisjCisjIE5vdGUgdGhhdCB3aGljaCBzb3VyY2VzIGFyZSBzaG93biBhbHNvIGRlcGVuZHMgb24gb3RoZXIgc2V0dGluZ3Mgc3VjaCBhcworIyBTT1VSQ0VfQlJPV1NFUi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfU09VUkNFX0NPREUgICAgICA9IE5PCisKKyMgVGhlIExBVEVYX0JJQl9TVFlMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgc3R5bGUgdG8gdXNlIGZvciB0aGUKKyMgYmlibGlvZ3JhcGh5LCBlLmcuIHBsYWlubmF0LCBvciBpZWVldHIuIFNlZQorIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBhbmQgXGNpdGUgZm9yIG1vcmUgaW5mby4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IHBsYWluLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfQklCX1NUWUxFICAgICAgICA9IHBsYWluCisKKyMgSWYgdGhlIExBVEVYX1RJTUVTVEFNUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBmb290ZXIgb2YgZWFjaCBnZW5lcmF0ZWQKKyMgcGFnZSB3aWxsIGNvbnRhaW4gdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcGFnZSB3YXMgZ2VuZXJhdGVkLiBTZXR0aW5nIHRoaXMKKyMgdG8gTk8gY2FuIGhlbHAgd2hlbiBjb21wYXJpbmcgdGhlIG91dHB1dCBvZiBtdWx0aXBsZSBydW5zLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9USU1FU1RBTVAgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9SVEYgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBSVEYgb3V0cHV0LiBUaGUKKyMgUlRGIG91dHB1dCBpcyBvcHRpbWl6ZWQgZm9yIFdvcmQgOTcgYW5kIG1heSBub3QgbG9vayB0b28gcHJldHR5IHdpdGggb3RoZXIgUlRGCisjIHJlYWRlcnMvZWRpdG9ycy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8KKworIyBUaGUgUlRGX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBSVEYgZG9jcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogcnRmLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9PVVRQVVQgICAgICAgICAgICAgPSBydGYKKworIyBJZiB0aGUgQ09NUEFDVF9SVEYgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdCBSVEYKKyMgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byBzYXZlIHNvbWUKKyMgdHJlZXMgaW4gZ2VuZXJhbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK0NPTVBBQ1RfUlRGICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBSVEZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIFJURiB0aGF0IGlzIGdlbmVyYXRlZCB3aWxsCisjIGNvbnRhaW4gaHlwZXJsaW5rIGZpZWxkcy4gVGhlIFJURiBmaWxlIHdpbGwgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MCisjIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMuIFRoaXMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lCisjIGJyb3dzaW5nIHVzaW5nIFdvcmQgb3Igc29tZSBvdGhlciBXb3JkIGNvbXBhdGlibGUgcmVhZGVycyB0aGF0IHN1cHBvcnQgdGhvc2UKKyMgZmllbGRzLgorIworIyBOb3RlOiBXb3JkUGFkICh3cml0ZSkgYW5kIG90aGVycyBkbyBub3Qgc3VwcG9ydCBsaW5rcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9IWVBFUkxJTktTICAgICAgICAgPSBOTworCisjIExvYWQgc3R5bGVzaGVldCBkZWZpbml0aW9ucyBmcm9tIGZpbGUuIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcKKyMgZmlsZSwgaS5lLiBhIHNlcmllcyBvZiBhc3NpZ25tZW50cy4gWW91IG9ubHkgaGF2ZSB0byBwcm92aWRlIHJlcGxhY2VtZW50cywKKyMgbWlzc2luZyBkZWZpbml0aW9ucyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWUuCisjCisjIFNlZSBhbHNvIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgdGhlCisjIGRlZmF1bHQgc3R5bGUgc2hlZXQgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KKworUlRGX1NUWUxFU0hFRVRfRklMRSAgICA9IAorCisjIFNldCBvcHRpb25hbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBSVEYgZG9jdW1lbnQuIFN5bnRheCBpcworIyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcgZmlsZS4gQSB0ZW1wbGF0ZSBleHRlbnNpb25zIGZpbGUgY2FuIGJlIGdlbmVyYXRlZAorIyB1c2luZyBkb3h5Z2VuIC1lIHJ0ZiBleHRlbnNpb25GaWxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9FWFRFTlNJT05TX0ZJTEUgICAgPSAKKworIyBJZiB0aGUgUlRGX1NPVVJDRV9DT0RFIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGluY2x1ZGUgc291cmNlIGNvZGUKKyMgd2l0aCBzeW50YXggaGlnaGxpZ2h0aW5nIGluIHRoZSBSVEYgb3V0cHV0LgorIworIyBOb3RlIHRoYXQgd2hpY2ggc291cmNlcyBhcmUgc2hvd24gYWxzbyBkZXBlbmRzIG9uIG90aGVyIHNldHRpbmdzIHN1Y2ggYXMKKyMgU09VUkNFX0JST1dTRVIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfU09VUkNFX0NPREUgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgbWFuIHBhZ2Ugb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX01BTiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIG1hbiBwYWdlcyBmb3IKKyMgY2xhc3NlcyBhbmQgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfTUFOICAgICAgICAgICA9IE5PCisKKyMgVGhlIE1BTl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgbWFuIHBhZ2VzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4gQSBkaXJlY3RvcnkgbWFuMyB3aWxsIGJlIGNyZWF0ZWQgaW5zaWRlIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5CisjIE1BTl9PVVRQVVQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogbWFuLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9PVVRQVVQgICAgICAgICAgICAgPSBtYW4KKworIyBUaGUgTUFOX0VYVEVOU0lPTiB0YWcgZGV0ZXJtaW5lcyB0aGUgZXh0ZW5zaW9uIHRoYXQgaXMgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZAorIyBtYW4gcGFnZXMuIEluIGNhc2UgdGhlIG1hbnVhbCBzZWN0aW9uIGRvZXMgbm90IHN0YXJ0IHdpdGggYSBudW1iZXIsIHRoZSBudW1iZXIKKyMgMyBpcyBwcmVwZW5kZWQuIFRoZSBkb3QgKC4pIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1BTl9FWFRFTlNJT04gdGFnIGlzCisjIG9wdGlvbmFsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogLjMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9NQU4gaXMgc2V0IHRvIFlFUy4KKworTUFOX0VYVEVOU0lPTiAgICAgICAgICA9IC4zCisKKyMgVGhlIE1BTl9TVUJESVIgdGFnIGRldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBjcmVhdGVkIHdpdGhpbgorIyBNQU5fT1VUUFVUIGluIHdoaWNoIHRoZSBtYW4gcGFnZXMgYXJlIHBsYWNlZC4gSWYgZGVmYXVsdHMgdG8gbWFuIGZvbGxvd2VkIGJ5CisjIE1BTl9FWFRFTlNJT04gd2l0aCB0aGUgaW5pdGlhbCAuIHJlbW92ZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9NQU4gaXMgc2V0IHRvIFlFUy4KKworTUFOX1NVQkRJUiAgICAgICAgICAgICA9IAorCisjIElmIHRoZSBNQU5fTElOS1MgdGFnIGlzIHNldCB0byBZRVMgYW5kIGRveHlnZW4gZ2VuZXJhdGVzIG1hbiBvdXRwdXQsIHRoZW4gaXQKKyMgd2lsbCBnZW5lcmF0ZSBvbmUgYWRkaXRpb25hbCBtYW4gZmlsZSBmb3IgZWFjaCBlbnRpdHkgZG9jdW1lbnRlZCBpbiB0aGUgcmVhbAorIyBtYW4gcGFnZShzKS4gVGhlc2UgYWRkaXRpb25hbCBmaWxlcyBvbmx5IHNvdXJjZSB0aGUgcmVhbCBtYW4gcGFnZSwgYnV0IHdpdGhvdXQKKyMgdGhlbSB0aGUgbWFuIGNvbW1hbmQgd291bGQgYmUgdW5hYmxlIHRvIGZpbmQgdGhlIGNvcnJlY3QgcGFnZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9MSU5LUyAgICAgICAgICAgICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBYTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1hNTCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGFuIFhNTCBmaWxlIHRoYXQKKyMgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PCisKKyMgVGhlIFhNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgWE1MIHBhZ2VzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiB4bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIFlFUy4KKworWE1MX09VVFBVVCAgICAgICAgICAgICA9IHhtbAorCisjIElmIHRoZSBYTUxfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBkdW1wIHRoZSBwcm9ncmFtCisjIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZyBhbmQgY3Jvc3MtcmVmZXJlbmNpbmcgaW5mb3JtYXRpb24pIHRvCisjIHRoZSBYTUwgb3V0cHV0LiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHNpemUKKyMgb2YgdGhlIFhNTCBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIFlFUy4KKworWE1MX1BST0dSQU1MSVNUSU5HICAgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBET0NCT09LIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9ET0NCT09LIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgRG9jYm9vayBmaWxlcworIyB0aGF0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIFBERi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9ET0NCT09LICAgICAgID0gTk8KKworIyBUaGUgRE9DQk9PS19PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgRG9jYm9vayBwYWdlcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4KKyMgZnJvbnQgb2YgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogZG9jYm9vay4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ0JPT0sgaXMgc2V0IHRvIFlFUy4KKworRE9DQk9PS19PVVRQVVQgICAgICAgICA9IGRvY2Jvb2sKKworIyBJZiB0aGUgRE9DQk9PS19QUk9HUkFNTElTVElORyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGluY2x1ZGUgdGhlCisjIHByb2dyYW0gbGlzdGluZ3MgKGluY2x1ZGluZyBzeW50YXggaGlnaGxpZ2h0aW5nIGFuZCBjcm9zcy1yZWZlcmVuY2luZworIyBpbmZvcm1hdGlvbikgdG8gdGhlIERPQ0JPT0sgb3V0cHV0LiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyB3aWxsIHNpZ25pZmljYW50bHkKKyMgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIERPQ0JPT0sgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NCT09LIGlzIHNldCB0byBZRVMuCisKK0RPQ0JPT0tfUFJPR1JBTUxJU1RJTkcgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEF1dG9HZW4gRGVmaW5pdGlvbnMgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0FVVE9HRU5fREVGIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYW4KKyMgQXV0b0dlbiBEZWZpbml0aW9ucyAoc2VlIGh0dHA6Ly9hdXRvZ2VuLnNmLm5ldCkgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZQorIyBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzCisjIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgbW9tZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX0FVVE9HRU5fREVGICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUEVSTE1PRCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgUGVybCBtb2R1bGUKKyMgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLgorIworIyBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgbW9tZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX1BFUkxNT0QgICAgICAgPSBOTworCisjIElmIHRoZSBQRVJMTU9EX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgdGhlIG5lY2Vzc2FyeQorIyBNYWtlZmlsZSBydWxlcywgUGVybCBzY3JpcHRzIGFuZCBMYVRlWCBjb2RlIHRvIGJlIGFibGUgdG8gZ2VuZXJhdGUgUERGIGFuZCBEVkkKKyMgb3V0cHV0IGZyb20gdGhlIFBlcmwgbW9kdWxlIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUEVSTE1PRCBpcyBzZXQgdG8gWUVTLgorCitQRVJMTU9EX0xBVEVYICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9QUkVUVFkgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBuaWNlbHkKKyMgZm9ybWF0dGVkIHNvIGl0IGNhbiBiZSBwYXJzZWQgYnkgYSBodW1hbiByZWFkZXIuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvCisjIHVuZGVyc3RhbmQgd2hhdCBpcyBnb2luZyBvbi4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoaXMgdGFnIGlzIHNldCB0byBOTywgdGhlCisjIHNpemUgb2YgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIG11Y2ggc21hbGxlciBhbmQgUGVybCB3aWxsIHBhcnNlIGl0CisjIGp1c3QgdGhlIHNhbWUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCisKK1BFUkxNT0RfUFJFVFRZICAgICAgICAgPSBZRVMKKworIyBUaGUgbmFtZXMgb2YgdGhlIG1ha2UgdmFyaWFibGVzIGluIHRoZSBnZW5lcmF0ZWQgZG94eXJ1bGVzLm1ha2UgZmlsZSBhcmUKKyMgcHJlZml4ZWQgd2l0aCB0aGUgc3RyaW5nIGNvbnRhaW5lZCBpbiBQRVJMTU9EX01BS0VWQVJfUFJFRklYLiBUaGlzIGlzIHVzZWZ1bAorIyBzbyBkaWZmZXJlbnQgZG94eXJ1bGVzLm1ha2UgZmlsZXMgaW5jbHVkZWQgYnkgdGhlIHNhbWUgTWFrZWZpbGUgZG9uJ3QKKyMgb3ZlcndyaXRlIGVhY2ggb3RoZXIncyB2YXJpYWJsZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCisKK1BFUkxNT0RfTUFLRVZBUl9QUkVGSVggPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgcHJlcHJvY2Vzc29yCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZXZhbHVhdGUgYWxsCisjIEMtcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgYW5kIGluY2x1ZGUgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VOQUJMRV9QUkVQUk9DRVNTSU5HICAgPSBZRVMKKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZXhwYW5kIGFsbCBtYWNybyBuYW1lcworIyBpbiB0aGUgc291cmNlIGNvZGUuIElmIHNldCB0byBOTywgb25seSBjb25kaXRpb25hbCBjb21waWxhdGlvbiB3aWxsIGJlCisjIHBlcmZvcm1lZC4gTWFjcm8gZXhwYW5zaW9uIGNhbiBiZSBkb25lIGluIGEgY29udHJvbGxlZCB3YXkgYnkgc2V0dGluZworIyBFWFBBTkRfT05MWV9QUkVERUYgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitNQUNST19FWFBBTlNJT04gICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYUEFORF9PTkxZX1BSRURFRiBhbmQgTUFDUk9fRVhQQU5TSU9OIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCisjIHRoZSBtYWNybyBleHBhbnNpb24gaXMgbGltaXRlZCB0byB0aGUgbWFjcm9zIHNwZWNpZmllZCB3aXRoIHRoZSBQUkVERUZJTkVEIGFuZAorIyBFWFBBTkRfQVNfREVGSU5FRCB0YWdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gWUVTCisKKyMgSWYgdGhlIFNFQVJDSF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGluY2x1ZGUgZmlsZXMgaW4gdGhlCisjIElOQ0xVREVfUEFUSCB3aWxsIGJlIHNlYXJjaGVkIGlmIGEgI2luY2x1ZGUgaXMgZm91bmQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hfSU5DTFVERVMgICAgICAgID0gWUVTCisKKyMgVGhlIElOQ0xVREVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBub3QgaW5wdXQgZmlsZXMgYnV0IHNob3VsZCBiZSBwcm9jZXNzZWQgYnkgdGhlCisjIHByZXByb2Nlc3Nvci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSF9JTkNMVURFUyBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX1BBVEggICAgICAgICAgID0gL1ZvbHVtZXMvQS9hb3NwL3ByZWJ1aWx0cy9jbGFuZy9kYXJ3aW4teDg2L2hvc3QvMy42L2xpYi9jbGFuZy8zLjYvaW5jbHVkZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2V4dGVybmFsL2xpYmN4eC9pbmNsdWRlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAvVm9sdW1lcy9BL2Fvc3AvYmlvbmljL2xpYmMvaW5jbHVkZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2Jpb25pYy9saWJjL2tlcm5lbC91YXBpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAvVm9sdW1lcy9BL2Fvc3AvYmlvbmljL2xpYmMva2VybmVsL3VhcGkvYXNtLWFybTY0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAvVm9sdW1lcy9BL2Fvc3AvZXh0ZXJuYWwvZ3Rlc3QKKworIyBZb3UgY2FuIHVzZSB0aGUgSU5DTFVERV9GSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkCisjIHBhdHRlcm5zIChsaWtlICouaCBhbmQgKi5ocHApIHRvIGZpbHRlciBvdXQgdGhlIGhlYWRlci1maWxlcyBpbiB0aGUKKyMgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmssIHRoZSBwYXR0ZXJucyBzcGVjaWZpZWQgd2l0aCBGSUxFX1BBVFRFUk5TIHdpbGwgYmUKKyMgdXNlZC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK0lOQ0xVREVfRklMRV9QQVRURVJOUyAgPSAKKworIyBUaGUgUFJFREVGSU5FRCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBtYWNybyBuYW1lcyB0aGF0IGFyZQorIyBkZWZpbmVkIGJlZm9yZSB0aGUgcHJlcHJvY2Vzc29yIGlzIHN0YXJ0ZWQgKHNpbWlsYXIgdG8gdGhlIC1EIG9wdGlvbiBvZiBlLmcuCisjIGdjYykuIFRoZSBhcmd1bWVudCBvZiB0aGUgdGFnIGlzIGEgbGlzdCBvZiBtYWNyb3Mgb2YgdGhlIGZvcm06IG5hbWUgb3IKKyMgbmFtZT1kZWZpbml0aW9uIChubyBzcGFjZXMpLiBJZiB0aGUgZGVmaW5pdGlvbiBhbmQgdGhlICI9IiBhcmUgb21pdHRlZCwgIj0xIgorIyBpcyBhc3N1bWVkLiBUbyBwcmV2ZW50IGEgbWFjcm8gZGVmaW5pdGlvbiBmcm9tIGJlaW5nIHVuZGVmaW5lZCB2aWEgI3VuZGVmIG9yCisjIHJlY3Vyc2l2ZWx5IGV4cGFuZGVkIHVzZSB0aGUgOj0gb3BlcmF0b3IgaW5zdGVhZCBvZiB0aGUgPSBvcGVyYXRvci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK1BSRURFRklORUQgICAgICAgICAgICAgPSBfX0FQUExFX189IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0FORFJPSURfXz0xIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEOj0xIFwKKwkJCSBfX3VudXNlZD0KKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIGFuZCBFWFBBTkRfT05MWV9QUkVERUYgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIHRoaXMKKyMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsaXN0IG9mIG1hY3JvIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkLiBUaGUKKyMgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IGlzIGZvdW5kIGluIHRoZSBzb3VyY2VzIHdpbGwgYmUgdXNlZC4gVXNlIHRoZSBQUkVERUZJTkVECisjIHRhZyBpZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IG92ZXJydWxlcyB0aGUKKyMgZGVmaW5pdGlvbiBmb3VuZCBpbiB0aGUgc291cmNlIGNvZGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitFWFBBTkRfQVNfREVGSU5FRCAgICAgID0gREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUworCisjIElmIHRoZSBTS0lQX0ZVTkNUSU9OX01BQ1JPUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4ncyBwcmVwcm9jZXNzb3Igd2lsbAorIyByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb24tbGlrZSBtYWNyb3MgdGhhdCBhcmUgYWxvbmUgb24gYSBsaW5lLCBoYXZlCisjIGFuIGFsbCB1cHBlcmNhc2UgbmFtZSwgYW5kIGRvIG5vdCBlbmQgd2l0aCBhIHNlbWljb2xvbi4gU3VjaCBmdW5jdGlvbiBtYWNyb3MKKyMgYXJlIHR5cGljYWxseSB1c2VkIGZvciBib2lsZXItcGxhdGUgY29kZSwgYW5kIHdpbGwgY29uZnVzZSB0aGUgcGFyc2VyIGlmIG5vdAorIyByZW1vdmVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworU0tJUF9GVU5DVElPTl9NQUNST1MgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIGV4dGVybmFsIHJlZmVyZW5jZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgVEFHRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgdGFnIGZpbGVzLiBGb3IgZWFjaCB0YWcKKyMgZmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIGFkZGVkLiBUaGUgZm9ybWF0IG9mCisjIGEgdGFnIGZpbGUgd2l0aG91dCB0aGlzIGxvY2F0aW9uIGlzIGFzIGZvbGxvd3M6CisjIFRBR0ZJTEVTID0gZmlsZTEgZmlsZTIgLi4uCisjIEFkZGluZyBsb2NhdGlvbiBmb3IgdGhlIHRhZyBmaWxlcyBpcyBkb25lIGFzIGZvbGxvd3M6CisjIFRBR0ZJTEVTID0gZmlsZTE9bG9jMSAiZmlsZTIgPSBsb2MyIiAuLi4KKyMgd2hlcmUgbG9jMSBhbmQgbG9jMiBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aHMgb3IgVVJMcy4gU2VlIHRoZQorIyBzZWN0aW9uICJMaW5raW5nIHRvIGV4dGVybmFsIGRvY3VtZW50YXRpb24iIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2UKKyMgb2YgdGFnIGZpbGVzLgorIyBOb3RlOiBFYWNoIHRhZyBmaWxlIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lICh3aGVyZSB0aGUgbmFtZSBkb2VzIE5PVCBpbmNsdWRlCisjIHRoZSBwYXRoKS4gSWYgYSB0YWcgZmlsZSBpcyBub3QgbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGRveHlnZW4gaXMKKyMgcnVuLCB5b3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIHRhZ2ZpbGUgaGVyZS4KKworVEFHRklMRVMgICAgICAgICAgICAgICA9IAorCisjIFdoZW4gYSBmaWxlIG5hbWUgaXMgc3BlY2lmaWVkIGFmdGVyIEdFTkVSQVRFX1RBR0ZJTEUsIGRveHlnZW4gd2lsbCBjcmVhdGUgYQorIyB0YWcgZmlsZSB0aGF0IGlzIGJhc2VkIG9uIHRoZSBpbnB1dCBmaWxlcyBpdCByZWFkcy4gU2VlIHNlY3Rpb24gIkxpbmtpbmcgdG8KKyMgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiIgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzYWdlIG9mIHRhZyBmaWxlcy4KKworR0VORVJBVEVfVEFHRklMRSAgICAgICA9IAorCisjIElmIHRoZSBBTExFWFRFUk5BTFMgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBleHRlcm5hbCBjbGFzcyB3aWxsIGJlIGxpc3RlZCBpbgorIyB0aGUgY2xhc3MgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgaW5oZXJpdGVkIGV4dGVybmFsIGNsYXNzZXMgd2lsbCBiZQorIyBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVEVSTkFMX0dST1VQUyB0YWcgaXMgc2V0IHRvIFlFUywgYWxsIGV4dGVybmFsIGdyb3VwcyB3aWxsIGJlIGxpc3RlZAorIyBpbiB0aGUgbW9kdWxlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBncm91cHMgd2lsbCBiZQorIyBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VYVEVSTkFMX0dST1VQUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhURVJOQUxfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBleHRlcm5hbCBwYWdlcyB3aWxsIGJlIGxpc3RlZCBpbgorIyB0aGUgcmVsYXRlZCBwYWdlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBwYWdlcyB3aWxsCisjIGJlIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRVhURVJOQUxfUEFHRVMgICAgICAgICA9IFlFUworCisjIFRoZSBQRVJMX1BBVEggc2hvdWxkIGJlIHRoZSBhYnNvbHV0ZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBwZXJsIHNjcmlwdAorIyBpbnRlcnByZXRlciAoaS5lLiB0aGUgcmVzdWx0IG9mICd3aGljaCBwZXJsJykuCisjIFRoZSBkZWZhdWx0IGZpbGUgKHdpdGggYWJzb2x1dGUgcGF0aCkgaXM6IC91c3IvYmluL3BlcmwuCisKK1BFUkxfUEFUSCAgICAgICAgICAgICAgPSAvdXNyL2Jpbi9wZXJsCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjbGFzcyBkaWFncmFtCisjIChpbiBIVE1MIGFuZCBMYVRlWCkgZm9yIGNsYXNzZXMgd2l0aCBiYXNlIG9yIHN1cGVyIGNsYXNzZXMuIFNldHRpbmcgdGhlIHRhZyB0bworIyBOTyB0dXJucyB0aGUgZGlhZ3JhbXMgb2ZmLiBOb3RlIHRoYXQgdGhpcyBvcHRpb24gYWxzbyB3b3JrcyB3aXRoIEhBVkVfRE9UCisjIGRpc2FibGVkLCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhbmQgdXNlIGRvdCwgc2luY2UgaXQgeWllbGRzIG1vcmUKKyMgcG93ZXJmdWwgZ3JhcGhzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitDTEFTU19ESUFHUkFNUyAgICAgICAgID0gWUVTCisKKyMgWW91IGNhbiBkZWZpbmUgbWVzc2FnZSBzZXF1ZW5jZSBjaGFydHMgd2l0aGluIGRveHlnZW4gY29tbWVudHMgdXNpbmcgdGhlIFxtc2MKKyMgY29tbWFuZC4gRG94eWdlbiB3aWxsIHRoZW4gcnVuIHRoZSBtc2NnZW4gdG9vbCAoc2VlOgorIyBodHRwOi8vd3d3Lm1jdGVybmFuLm1lLnVrL21zY2dlbi8pKSB0byBwcm9kdWNlIHRoZSBjaGFydCBhbmQgaW5zZXJ0IGl0IGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBUaGUgTVNDR0VOX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlCisjIHRoZSBtc2NnZW4gdG9vbCByZXNpZGVzLiBJZiBsZWZ0IGVtcHR5IHRoZSB0b29sIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlCisjIGRlZmF1bHQgc2VhcmNoIHBhdGguCisKK01TQ0dFTl9QQVRIICAgICAgICAgICAgPSAKKworIyBZb3UgY2FuIGluY2x1ZGUgZGlhZ3JhbXMgbWFkZSB3aXRoIGRpYSBpbiBkb3h5Z2VuIGRvY3VtZW50YXRpb24uIERveHlnZW4gd2lsbAorIyB0aGVuIHJ1biBkaWEgdG8gcHJvZHVjZSB0aGUgZGlhZ3JhbSBhbmQgaW5zZXJ0IGl0IGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUKKyMgRElBX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBkaWEgYmluYXJ5IHJlc2lkZXMuCisjIElmIGxlZnQgZW1wdHkgZGlhIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlIGRlZmF1bHQgc2VhcmNoIHBhdGguCisKK0RJQV9QQVRIICAgICAgICAgICAgICAgPSAKKworIyBJZiBzZXQgdG8gWUVTIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBoaWRlIGluaGVyaXRhbmNlCisjIGFuZCB1c2FnZSByZWxhdGlvbnMgaWYgdGhlIHRhcmdldCBpcyB1bmRvY3VtZW50ZWQgb3IgaXMgbm90IGEgY2xhc3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0hJREVfVU5ET0NfUkVMQVRJT05TICAgPSBZRVMKKworIyBJZiB5b3Ugc2V0IHRoZSBIQVZFX0RPVCB0YWcgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGFzc3VtZSB0aGUgZG90IHRvb2wgaXMKKyMgYXZhaWxhYmxlIGZyb20gdGhlIHBhdGguIFRoaXMgdG9vbCBpcyBwYXJ0IG9mIEdyYXBodml6IChzZWU6CisjIGh0dHA6Ly93d3cuZ3JhcGh2aXoub3JnLyksIGEgZ3JhcGggdmlzdWFsaXphdGlvbiB0b29sa2l0IGZyb20gQVQmVCBhbmQgTHVjZW50CisjIEJlbGwgTGFicy4gVGhlIG90aGVyIG9wdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGhhdmUgbm8gZWZmZWN0IGlmIHRoaXMgb3B0aW9uIGlzCisjIHNldCB0byBOTworIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hBVkVfRE9UICAgICAgICAgICAgICAgPSBOTworCisjIFRoZSBET1RfTlVNX1RIUkVBRFMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZG90IGludm9jYXRpb25zIGRveHlnZW4gaXMgYWxsb3dlZAorIyB0byBydW4gaW4gcGFyYWxsZWwuIFdoZW4gc2V0IHRvIDAgZG94eWdlbiB3aWxsIGJhc2UgdGhpcyBvbiB0aGUgbnVtYmVyIG9mCisjIHByb2Nlc3NvcnMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0uIFlvdSBjYW4gc2V0IGl0IGV4cGxpY2l0bHkgdG8gYSB2YWx1ZQorIyBsYXJnZXIgdGhhbiAwIHRvIGdldCBjb250cm9sIG92ZXIgdGhlIGJhbGFuY2UgYmV0d2VlbiBDUFUgbG9hZCBhbmQgcHJvY2Vzc2luZworIyBzcGVlZC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMzIsIGRlZmF1bHQgdmFsdWU6IDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfTlVNX1RIUkVBRFMgICAgICAgID0gMAorCisjIFdoZW4geW91IHdhbnQgYSBkaWZmZXJlbnRseSBsb29raW5nIGZvbnQgaW4gdGhlIGRvdCBmaWxlcyB0aGF0IGRveHlnZW4KKyMgZ2VuZXJhdGVzIHlvdSBjYW4gc3BlY2lmeSB0aGUgZm9udCBuYW1lIHVzaW5nIERPVF9GT05UTkFNRS4gWW91IG5lZWQgdG8gbWFrZQorIyBzdXJlIGRvdCBpcyBhYmxlIHRvIGZpbmQgdGhlIGZvbnQsIHdoaWNoIGNhbiBiZSBkb25lIGJ5IHB1dHRpbmcgaXQgaW4gYQorIyBzdGFuZGFyZCBsb2NhdGlvbiBvciBieSBzZXR0aW5nIHRoZSBET1RGT05UUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBieQorIyBzZXR0aW5nIERPVF9GT05UUEFUSCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZvbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBIZWx2ZXRpY2EuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfRk9OVE5BTUUgICAgICAgICAgID0gSGVsdmV0aWNhCisKKyMgVGhlIERPVF9GT05UU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBzaXplIChpbiBwb2ludHMpIG9mIHRoZSBmb250IG9mCisjIGRvdCBncmFwaHMuCisjIE1pbmltdW0gdmFsdWU6IDQsIG1heGltdW0gdmFsdWU6IDI0LCBkZWZhdWx0IHZhbHVlOiAxMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9GT05UU0laRSAgICAgICAgICAgPSAxMAorCisjIEJ5IGRlZmF1bHQgZG94eWdlbiB3aWxsIHRlbGwgZG90IHRvIHVzZSB0aGUgZGVmYXVsdCBmb250IGFzIHNwZWNpZmllZCB3aXRoCisjIERPVF9GT05UTkFNRS4gSWYgeW91IHNwZWNpZnkgYSBkaWZmZXJlbnQgZm9udCB1c2luZyBET1RfRk9OVE5BTUUgeW91IGNhbiBzZXQKKyMgdGhlIHBhdGggd2hlcmUgZG90IGNhbiBmaW5kIGl0IHVzaW5nIHRoaXMgdGFnLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0ZPTlRQQVRIICAgICAgICAgICA9IAorCisjIElmIHRoZSBDTEFTU19HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvcgorIyBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmhlcml0YW5jZSByZWxhdGlvbnMuCisjIFNldHRpbmcgdGhpcyB0YWcgdG8gWUVTIHdpbGwgZm9yY2UgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyB0byBOTy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0NMQVNTX0dSQVBIICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgQ09MTEFCT1JBVElPTl9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbXBsZW1lbnRhdGlvbgorIyBkZXBlbmRlbmNpZXMgKGluaGVyaXRhbmNlLCBjb250YWlubWVudCwgYW5kIGNsYXNzIHJlZmVyZW5jZXMgdmFyaWFibGVzKSBvZiB0aGUKKyMgY2xhc3Mgd2l0aCBvdGhlciBkb2N1bWVudGVkIGNsYXNzZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDT0xMQUJPUkFUSU9OX0dSQVBIICAgID0gWUVTCisKKyMgSWYgdGhlIEdST1VQX0dSQVBIUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvcgorIyBncm91cHMsIHNob3dpbmcgdGhlIGRpcmVjdCBncm91cHMgZGVwZW5kZW5jaWVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworR1JPVVBfR1JBUEhTICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGluaGVyaXRhbmNlIGFuZAorIyBjb2xsYWJvcmF0aW9uIGRpYWdyYW1zIGluIGEgc3R5bGUgc2ltaWxhciB0byB0aGUgT01HJ3MgVW5pZmllZCBNb2RlbGluZworIyBMYW5ndWFnZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworVU1MX0xPT0sgICAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBlbmFibGVkLCB0aGUgZmllbGRzIGFuZCBtZXRob2RzIGFyZSBzaG93biBpbnNpZGUgdGhlCisjIGNsYXNzIG5vZGUuIElmIHRoZXJlIGFyZSBtYW55IGZpZWxkcyBvciBtZXRob2RzIGFuZCBtYW55IG5vZGVzIHRoZSBncmFwaCBtYXkKKyMgYmVjb21lIHRvbyBiaWcgdG8gYmUgdXNlZnVsLiBUaGUgVU1MX0xJTUlUX05VTV9GSUVMRFMgdGhyZXNob2xkIGxpbWl0cyB0aGUKKyMgbnVtYmVyIG9mIGl0ZW1zIGZvciBlYWNoIHR5cGUgdG8gbWFrZSB0aGUgc2l6ZSBtb3JlIG1hbmFnZWFibGUuIFNldCB0aGlzIHRvIDAKKyMgZm9yIG5vIGxpbWl0LiBOb3RlIHRoYXQgdGhlIHRocmVzaG9sZCBtYXkgYmUgZXhjZWVkZWQgYnkgNTAlIGJlZm9yZSB0aGUgbGltaXQKKyMgaXMgZW5mb3JjZWQuIFNvIHdoZW4geW91IHNldCB0aGUgdGhyZXNob2xkIHRvIDEwLCB1cCB0byAxNSBmaWVsZHMgbWF5IGFwcGVhciwKKyMgYnV0IGlmIHRoZSBudW1iZXIgZXhjZWVkcyAxNSwgdGhlIHRvdGFsIGFtb3VudCBvZiBmaWVsZHMgc2hvd24gaXMgbGltaXRlZCB0bworIyAxMC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwLCBkZWZhdWx0IHZhbHVlOiAxMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1VNTF9MSU1JVF9OVU1fRklFTERTICAgPSAxMAorCisjIElmIHRoZSBURU1QTEFURV9SRUxBVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgaW5oZXJpdGFuY2UgYW5kCisjIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgc2hvdyB0aGUgcmVsYXRpb25zIGJldHdlZW4gdGVtcGxhdGVzIGFuZCB0aGVpcgorIyBpbnN0YW5jZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1RFTVBMQVRFX1JFTEFUSU9OUyAgICAgPSBOTworCisjIElmIHRoZSBJTkNMVURFX0dSQVBILCBFTkFCTEVfUFJFUFJPQ0VTU0lORyBhbmQgU0VBUkNIX0lOQ0xVREVTIHRhZ3MgYXJlIHNldCB0bworIyBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGZpbGUgc2hvd2luZyB0aGUKKyMgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIG90aGVyIGRvY3VtZW50ZWQKKyMgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX0dSQVBIICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIElOQ0xVREVEX0JZX0dSQVBILCBFTkFCTEVfUFJFUFJPQ0VTU0lORyBhbmQgU0VBUkNIX0lOQ0xVREVTIHRhZ3MgYXJlCisjIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGZpbGUgc2hvd2luZworIyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIG90aGVyIGRvY3VtZW50ZWQKKyMgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFRF9CWV9HUkFQSCAgICAgID0gWUVTCisKKyMgSWYgdGhlIENBTExfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsCisjIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiBvciBjbGFzcyBtZXRob2QuCisjCisjIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHRpbWUgb2YgYSBydW4uCisjIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGwgZ3JhcGhzIGZvciBzZWxlY3RlZAorIyBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxncmFwaCBjb21tYW5kLiBEaXNhYmxpbmcgYSBjYWxsIGdyYXBoIGNhbiBiZQorIyBhY2NvbXBsaXNoZWQgYnkgbWVhbnMgb2YgdGhlIGNvbW1hbmQgXGhpZGVjYWxsZ3JhcGguCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0NBTExfR1JBUEggICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBDQUxMRVJfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsZXIKKyMgZGVwZW5kZW5jeSBncmFwaCBmb3IgZXZlcnkgZ2xvYmFsIGZ1bmN0aW9uIG9yIGNsYXNzIG1ldGhvZC4KKyMKKyMgTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgdGltZSBvZiBhIHJ1bi4KKyMgU28gaW4gbW9zdCBjYXNlcyBpdCB3aWxsIGJlIGJldHRlciB0byBlbmFibGUgY2FsbGVyIGdyYXBocyBmb3Igc2VsZWN0ZWQKKyMgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZXJncmFwaCBjb21tYW5kLiBEaXNhYmxpbmcgYSBjYWxsZXIgZ3JhcGggY2FuIGJlCisjIGFjY29tcGxpc2hlZCBieSBtZWFucyBvZiB0aGUgY29tbWFuZCBcaGlkZWNhbGxlcmdyYXBoLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDQUxMRVJfR1JBUEggICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgR1JBUEhJQ0FMX0hJRVJBUkNIWSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBncmFwaGljYWwKKyMgaGllcmFyY2h5IG9mIGFsbCBjbGFzc2VzIGluc3RlYWQgb2YgYSB0ZXh0dWFsIG9uZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0dSQVBISUNBTF9ISUVSQVJDSFkgICAgPSBZRVMKKworIyBJZiB0aGUgRElSRUNUT1JZX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgdGhlCisjIGRlcGVuZGVuY2llcyBhIGRpcmVjdG9yeSBoYXMgb24gb3RoZXIgZGlyZWN0b3JpZXMgaW4gYSBncmFwaGljYWwgd2F5LiBUaGUKKyMgZGVwZW5kZW5jeSByZWxhdGlvbnMgYXJlIGRldGVybWluZWQgYnkgdGhlICNpbmNsdWRlIHJlbGF0aW9ucyBiZXR3ZWVuIHRoZQorIyBmaWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitESVJFQ1RPUllfR1JBUEggICAgICAgID0gWUVTCisKKyMgVGhlIERPVF9JTUFHRV9GT1JNQVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgaW1hZ2UgZm9ybWF0IG9mIHRoZSBpbWFnZXMKKyMgZ2VuZXJhdGVkIGJ5IGRvdC4gRm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBpbWFnZSBmb3JtYXRzIHNlZSB0aGUgc2VjdGlvbgorIyBvdXRwdXQgZm9ybWF0cyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZG90IHRvb2wgKEdyYXBodml6IChzZWU6CisjIGh0dHA6Ly93d3cuZ3JhcGh2aXoub3JnLykpLgorIyBOb3RlOiBJZiB5b3UgY2hvb3NlIHN2ZyB5b3UgbmVlZCB0byBzZXQgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlcgorIyB0byBtYWtlIHRoZSBTVkcgZmlsZXMgdmlzaWJsZSBpbiBJRSA5KyAob3RoZXIgYnJvd3NlcnMgZG8gbm90IGhhdmUgdGhpcworIyByZXF1aXJlbWVudCkuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IHBuZywganBnLCBnaWYsIHN2ZywgcG5nOmdkLCBwbmc6Z2Q6Z2QsIHBuZzpjYWlybywKKyMgcG5nOmNhaXJvOmdkLCBwbmc6Y2Fpcm86Y2Fpcm8sIHBuZzpjYWlybzpnZGlwbHVzLCBwbmc6Z2RpcGx1cyBhbmQKKyMgcG5nOmdkaXBsdXM6Z2RpcGx1cy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IHBuZy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9JTUFHRV9GT1JNQVQgICAgICAgPSBwbmcKKworIyBJZiBET1RfSU1BR0VfRk9STUFUIGlzIHNldCB0byBzdmcsIHRoZW4gdGhpcyBvcHRpb24gY2FuIGJlIHNldCB0byBZRVMgdG8KKyMgZW5hYmxlIGdlbmVyYXRpb24gb2YgaW50ZXJhY3RpdmUgU1ZHIGltYWdlcyB0aGF0IGFsbG93IHpvb21pbmcgYW5kIHBhbm5pbmcuCisjCisjIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIGEgbW9kZXJuIGJyb3dzZXIgb3RoZXIgdGhhbiBJbnRlcm5ldCBFeHBsb3Jlci4gVGVzdGVkCisjIGFuZCB3b3JraW5nIGFyZSBGaXJlZm94LCBDaHJvbWUsIFNhZmFyaSwgYW5kIE9wZXJhLgorIyBOb3RlOiBGb3IgSUUgOSsgeW91IG5lZWQgdG8gc2V0IEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIgdG8gbWFrZQorIyB0aGUgU1ZHIGZpbGVzIHZpc2libGUuIE9sZGVyIHZlcnNpb25zIG9mIElFIGRvIG5vdCBoYXZlIFNWRyBzdXBwb3J0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTlRFUkFDVElWRV9TVkcgICAgICAgID0gTk8KKworIyBUaGUgRE9UX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggd2hlcmUgdGhlIGRvdCB0b29sIGNhbiBiZQorIyBmb3VuZC4gSWYgbGVmdCBibGFuaywgaXQgaXMgYXNzdW1lZCB0aGUgZG90IHRvb2wgY2FuIGJlIGZvdW5kIGluIHRoZSBwYXRoLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX1BBVEggICAgICAgICAgICAgICA9IAorCisjIFRoZSBET1RGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGRvdCBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZSBcZG90ZmlsZQorIyBjb21tYW5kKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVEZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBUaGUgTVNDRklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBtc2MgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXG1zY2ZpbGUKKyMgY29tbWFuZCkuCisKK01TQ0ZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBUaGUgRElBRklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBkaWEgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXGRpYWZpbGUKKyMgY29tbWFuZCkuCisKK0RJQUZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBXaGVuIHVzaW5nIHBsYW50dW1sLCB0aGUgUExBTlRVTUxfSkFSX1BBVEggdGFnIHNob3VsZCBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlCisjIHBhdGggd2hlcmUgamF2YSBjYW4gZmluZCB0aGUgcGxhbnR1bWwuamFyIGZpbGUuIElmIGxlZnQgYmxhbmssIGl0IGlzIGFzc3VtZWQKKyMgUGxhbnRVTUwgaXMgbm90IHVzZWQgb3IgY2FsbGVkIGR1cmluZyBhIHByZXByb2Nlc3Npbmcgc3RlcC4gRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIGEgd2FybmluZyB3aGVuIGl0IGVuY291bnRlcnMgYSBcc3RhcnR1bWwgY29tbWFuZCBpbiB0aGlzIGNhc2UgYW5kCisjIHdpbGwgbm90IGdlbmVyYXRlIG91dHB1dCBmb3IgdGhlIGRpYWdyYW0uCisKK1BMQU5UVU1MX0pBUl9QQVRIICAgICAgPSAKKworIyBXaGVuIHVzaW5nIHBsYW50dW1sLCB0aGUgc3BlY2lmaWVkIHBhdGhzIGFyZSBzZWFyY2hlZCBmb3IgZmlsZXMgc3BlY2lmaWVkIGJ5CisjIHRoZSAhaW5jbHVkZSBzdGF0ZW1lbnQgaW4gYSBwbGFudHVtbCBibG9jay4KKworUExBTlRVTUxfSU5DTFVERV9QQVRIICA9IAorCisjIFRoZSBET1RfR1JBUEhfTUFYX05PREVTIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5vZGVzCisjIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgZ3JhcGguIElmIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gYSBncmFwaCBiZWNvbWVzCisjIGxhcmdlciB0aGFuIHRoaXMgdmFsdWUsIGRveHlnZW4gd2lsbCB0cnVuY2F0ZSB0aGUgZ3JhcGgsIHdoaWNoIGlzIHZpc3VhbGl6ZWQKKyMgYnkgcmVwcmVzZW50aW5nIGEgbm9kZSBhcyBhIHJlZCBib3guIE5vdGUgdGhhdCBkb3h5Z2VuIGlmIHRoZSBudW1iZXIgb2YgZGlyZWN0CisjIGNoaWxkcmVuIG9mIHRoZSByb290IG5vZGUgaW4gYSBncmFwaCBpcyBhbHJlYWR5IGxhcmdlciB0aGFuCisjIERPVF9HUkFQSF9NQVhfTk9ERVMgdGhlbiB0aGUgZ3JhcGggd2lsbCBub3QgYmUgc2hvd24gYXQgYWxsLiBBbHNvIG5vdGUgdGhhdAorIyB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkgTUFYX0RPVF9HUkFQSF9ERVBUSC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwMDAsIGRlZmF1bHQgdmFsdWU6IDUwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0dSQVBIX01BWF9OT0RFUyAgICA9IDUwCisKKyMgVGhlIE1BWF9ET1RfR1JBUEhfREVQVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBkZXB0aCBvZiB0aGUgZ3JhcGhzCisjIGdlbmVyYXRlZCBieSBkb3QuIEEgZGVwdGggdmFsdWUgb2YgMyBtZWFucyB0aGF0IG9ubHkgbm9kZXMgcmVhY2hhYmxlIGZyb20gdGhlCisjIHJvb3QgYnkgZm9sbG93aW5nIGEgcGF0aCB2aWEgYXQgbW9zdCAzIGVkZ2VzIHdpbGwgYmUgc2hvd24uIE5vZGVzIHRoYXQgbGF5CisjIGZ1cnRoZXIgZnJvbSB0aGUgcm9vdCBub2RlIHdpbGwgYmUgb21pdHRlZC4gTm90ZSB0aGF0IHNldHRpbmcgdGhpcyBvcHRpb24gdG8gMQorIyBvciAyIG1heSBncmVhdGx5IHJlZHVjZSB0aGUgY29tcHV0YXRpb24gdGltZSBuZWVkZWQgZm9yIGxhcmdlIGNvZGUgYmFzZXMuIEFsc28KKyMgbm90ZSB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieQorIyBET1RfR1JBUEhfTUFYX05PREVTLiBVc2luZyBhIGRlcHRoIG9mIDAgbWVhbnMgbm8gZGVwdGggcmVzdHJpY3Rpb24uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAsIGRlZmF1bHQgdmFsdWU6IDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitNQVhfRE9UX0dSQVBIX0RFUFRIICAgID0gMAorCisjIFNldCB0aGUgRE9UX1RSQU5TUEFSRU5UIHRhZyB0byBZRVMgdG8gZ2VuZXJhdGUgaW1hZ2VzIHdpdGggYSB0cmFuc3BhcmVudAorIyBiYWNrZ3JvdW5kLiBUaGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJlY2F1c2UgZG90IG9uIFdpbmRvd3MgZG9lcyBub3Qgc2VlbQorIyB0byBzdXBwb3J0IHRoaXMgb3V0IG9mIHRoZSBib3guCisjCisjIFdhcm5pbmc6IERlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0gdXNlZCwgZW5hYmxpbmcgdGhpcyBvcHRpb24gbWF5IGxlYWQgdG8KKyMgYmFkbHkgYW50aS1hbGlhc2VkIGxhYmVscyBvbiB0aGUgZWRnZXMgb2YgYSBncmFwaCAoaS5lLiB0aGV5IGJlY29tZSBoYXJkIHRvCisjIHJlYWQpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfVFJBTlNQQVJFTlQgICAgICAgID0gTk8KKworIyBTZXQgdGhlIERPVF9NVUxUSV9UQVJHRVRTIHRhZyB0byBZRVMgdG8gYWxsb3cgZG90IHRvIGdlbmVyYXRlIG11bHRpcGxlIG91dHB1dAorIyBmaWxlcyBpbiBvbmUgcnVuIChpLmUuIG11bHRpcGxlIC1vIGFuZCAtVCBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUpLiBUaGlzCisjIG1ha2VzIGRvdCBydW4gZmFzdGVyLCBidXQgc2luY2Ugb25seSBuZXdlciB2ZXJzaW9ucyBvZiBkb3QgKD4xLjguMTApIHN1cHBvcnQKKyMgdGhpcywgdGhpcyBmZWF0dXJlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9NVUxUSV9UQVJHRVRTICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9MRUdFTkQgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgbGVnZW5kIHBhZ2UKKyMgZXhwbGFpbmluZyB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBib3hlcyBhbmQgYXJyb3dzIGluIHRoZSBkb3QgZ2VuZXJhdGVkCisjIGdyYXBocy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0xFR0VORCAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRE9UX0NMRUFOVVAgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCByZW1vdmUgdGhlIGludGVybWVkaWF0ZSBkb3QKKyMgZmlsZXMgdGhhdCBhcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdmFyaW91cyBncmFwaHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYWQzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQW5kcm9pZC5icApAQCAtMCwwICsxLDI5IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9jb21wb25lbnRfd3JhcHBlciIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyQ29tcG9uZW50V3JhcHBlci5jcHAiLAorICAgICAgICAiU2ltcGxlTWV0aG9kU3RhdGUuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9DMkNvbXBvbmVudFdyYXBwZXIuY3BwIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL0MyQ29tcG9uZW50V3JhcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1ZjhiZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9DMkNvbXBvbmVudFdyYXBwZXIuY3BwCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJDb21wb25lbnRXcmFwcGVyIgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnRXcmFwcGVyLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKworYzJfc3RhdHVzX3QgV3JhcFNpbXBsZU1ldGhvZCgKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdCh2b2lkKT4gb3AsIGNvbnN0IFNpbXBsZU1ldGhvZFN0YXRlICZzdGF0ZSkgeworICAgIGMyX3N0YXR1c190IHJlc3VsdCA9IEMyX09LOworICAgIHN3aXRjaCAoc3RhdGUuZ2V0TW9kZSgpKSB7CisgICAgICAgIGNhc2UgU2ltcGxlTWV0aG9kU3RhdGU6OkVYRUNVVEU6CisgICAgICAgICAgICByZXN1bHQgPSBvcCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2ltcGxlTWV0aG9kU3RhdGU6Ok5PX09QOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2ltcGxlTWV0aG9kU3RhdGU6OkhBTkc6CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2Zvcigxcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpc3RhdGUub3ZlcnJpZGVSZXN1bHQoJnJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0MyQ29tcG9uZW50V3JhcHBlcjo6SW5qZWN0ZXI6OkluamVjdGVyKEMyQ29tcG9uZW50V3JhcHBlciAqdGhpeikgOiBtVGhpeih0aGl6KSB7fQorCitTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXIgQzJDb21wb25lbnRXcmFwcGVyOjpJbmplY3Rlcjo6c3RhcnQoKSB7CisgICAgcmV0dXJuIFNpbXBsZU1ldGhvZFN0YXRlOjpJbmplY3RlcigmbVRoaXotPm1TdGFydFN0YXRlKTsKK30KKworQzJDb21wb25lbnRXcmFwcGVyOjpMaXN0ZW5lcjo6TGlzdGVuZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lcikgOiBtTGlzdGVuZXIobGlzdGVuZXIpIHt9CisKK3ZvaWQgQzJDb21wb25lbnRXcmFwcGVyOjpMaXN0ZW5lcjo6b25Xb3JrRG9uZV9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKSB7CisgICAgbUxpc3RlbmVyLT5vbldvcmtEb25lX25iKGNvbXBvbmVudCwgc3RkOjptb3ZlKHdvcmtJdGVtcykpOworfQorCit2b2lkIEMyQ29tcG9uZW50V3JhcHBlcjo6TGlzdGVuZXI6Om9uVHJpcHBlZF9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBzZXR0aW5nUmVzdWx0KSB7CisgICAgbUxpc3RlbmVyLT5vblRyaXBwZWRfbmIoY29tcG9uZW50LHNldHRpbmdSZXN1bHQpOworfQorCit2b2lkIEMyQ29tcG9uZW50V3JhcHBlcjo6TGlzdGVuZXI6Om9uRXJyb3JfbmIoCisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwgdWludDMyX3QgZXJyb3JDb2RlKSB7CisgICAgbUxpc3RlbmVyLT5vbkVycm9yX25iKGNvbXBvbmVudCwgZXJyb3JDb2RlKTsKK30KKworQzJDb21wb25lbnRXcmFwcGVyOjpDMkNvbXBvbmVudFdyYXBwZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gJmNvbXApIDogbUNvbXAoY29tcCkge30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjpzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gJmxpc3RlbmVyLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSB7CisgICAgbUxpc3RlbmVyID0gc3RkOjptYWtlX3NoYXJlZDxMaXN0ZW5lcj4obGlzdGVuZXIpOworICAgIHJldHVybiBtQ29tcC0+c2V0TGlzdGVuZXJfdmIobUxpc3RlbmVyLCBtYXlCbG9jayk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6cXVldWVfbmIoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIHsKKyAgICByZXR1cm4gbUNvbXAtPnF1ZXVlX25iKGl0ZW1zKTsKK30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjphbm5vdW5jZV9uYihjb25zdCBzdGQ6OnZlY3RvcjxDMldvcmtPdXRsaW5lPiAmaXRlbXMpIHsKKyAgICByZXR1cm4gbUNvbXAtPmFubm91bmNlX25iKGl0ZW1zKTsKK30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjpmbHVzaF9zbSgKKyAgICAgICAgQzJDb21wb25lbnQ6OmZsdXNoX21vZGVfdCBtb2RlLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgeworICAgIHJldHVybiBtQ29tcC0+Zmx1c2hfc20obW9kZSwgZmx1c2hlZFdvcmspOworfQorCitjMl9zdGF0dXNfdCBDMkNvbXBvbmVudFdyYXBwZXI6OmRyYWluX25iKEMyQ29tcG9uZW50OjpkcmFpbl9tb2RlX3QgbW9kZSkgeworICAgIHJldHVybiBtQ29tcC0+ZHJhaW5fbmIobW9kZSk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6c3RhcnQoKSB7CisgICAgcmV0dXJuIFdyYXBTaW1wbGVNZXRob2QoW3RoaXNdIHsgcmV0dXJuIG1Db21wLT5zdGFydCgpOyB9LCBtU3RhcnRTdGF0ZSk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6c3RvcCgpIHsKKyAgICByZXR1cm4gbUNvbXAtPnN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjpyZXNldCgpIHsKKyAgICByZXR1cm4gbUNvbXAtPnJlc2V0KCk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6cmVsZWFzZSgpIHsKKyAgICByZXR1cm4gbUNvbXAtPnJlbGVhc2UoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBDMkNvbXBvbmVudFdyYXBwZXI6OmludGYoKXsKKyAgICByZXR1cm4gbUNvbXAtPmludGYoKTsKK30KKworQzJDb21wb25lbnRXcmFwcGVyOjpJbmplY3RlciBDMkNvbXBvbmVudFdyYXBwZXI6OmluamVjdCgpIHsKKyAgICByZXR1cm4gSW5qZWN0ZXIodGhpcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQzJDb21wb25lbnRXcmFwcGVyLmggYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQzJDb21wb25lbnRXcmFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM3MzUwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9DMkNvbXBvbmVudFdyYXBwZXIuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMl9DT01QT05FTlRfV1JBUFBFUl9IXworI2RlZmluZSBDMl9DT01QT05FTlRfV1JBUFBFUl9IXworCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgIlNpbXBsZU1ldGhvZFN0YXRlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBDcmVhdGVzIGEgV3JhcHBlciBhcm91bmQgdGhlIGNsYXNzIEMyQ29tcG9uZW50IGFuZCBpdHMgbWV0aG9kcy4gVGhlIHdyYXBwZXIgaXMgdXNlZCB0bworICogc2ltdWxhdGUgZXJyb3JzIGluIHRoZSBhbmRyb2lkIG1lZGlhIGNvbXBvbmVudHMgYnkgZmF1bHQgaW5qZWN0aW9uIHRlY2huaXF1ZS4KKyAqIFRoaXMgaXMgZG9uZSB0byBjaGVjayBob3cgdGhlIGZyYW1ld29yayBoYW5kbGVzIHRoZSBlcnJvciBzaXR1YXRpb24uCisgKi8KK2NsYXNzIEMyQ29tcG9uZW50V3JhcHBlcgorICAgICAgICA6IHB1YmxpYyBDMkNvbXBvbmVudCwgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QzJDb21wb25lbnRXcmFwcGVyPiB7CitwdWJsaWM6CisgICAgY2xhc3MgSW5qZWN0ZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgSW5qZWN0ZXIoQzJDb21wb25lbnRXcmFwcGVyICp0aGl6KTsKKworICAgICAgICBTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXIgc3RhcnQoKTsKKyAgICBwcml2YXRlOgorICAgICAgICBDMkNvbXBvbmVudFdyYXBwZXIgKmNvbnN0IG1UaGl6OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBIHdyYXBwZXIgYXJvdW5kIHRoZSBsaXN0ZW5lciBjbGFzcyBpbnNpZGUgQzJDb21wb25lbnQgY2xhc3MuCisgICAgICovCisgICAgY2xhc3MgTGlzdGVuZXIgOiBwdWJsaWMgQzJDb21wb25lbnQ6Okxpc3RlbmVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IExpc3RlbmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lcik7CisgICAgICAgIHZpcnR1YWwgfkxpc3RlbmVyKCkgPSBkZWZhdWx0OworCisgICAgICAgIHZvaWQgb25Xb3JrRG9uZV9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcykgb3ZlcnJpZGU7CisgICAgICAgIHZvaWQgb25UcmlwcGVkX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHNldHRpbmdSZXN1bHQpIG92ZXJyaWRlOworICAgICAgICB2b2lkIG9uRXJyb3JfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LCB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIH07CisKKyAgICBleHBsaWNpdCBDMkNvbXBvbmVudFdyYXBwZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAmY29tcCk7CisgICAgdmlydHVhbCB+QzJDb21wb25lbnRXcmFwcGVyKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lciwKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVldWVfbmIoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgYW5ub3VuY2VfbmIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJXb3JrT3V0bGluZT4gJml0ZW1zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZsdXNoX3NtKAorICAgICAgICAgICAgZmx1c2hfbW9kZV90IG1vZGUsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGRyYWluX25iKGRyYWluX21vZGVfdCBtb2RlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdG9wKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCByZXNldCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVsZWFzZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmKCkgb3ZlcnJpZGU7CisKKyAgICBJbmplY3RlciBpbmplY3QoKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1Db21wOworCisgICAgU2ltcGxlTWV0aG9kU3RhdGUgbVN0YXJ0U3RhdGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQzJfQ09NUE9ORU5UX1dSQVBQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9TaW1wbGVNZXRob2RTdGF0ZS5jcHAgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OWQ2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTaW1wbGVNZXRob2RTdGF0ZSIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlICJTaW1wbGVNZXRob2RTdGF0ZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1NpbXBsZU1ldGhvZFN0YXRlOjpJbmplY3Rlcjo6SW5qZWN0ZXIoU2ltcGxlTWV0aG9kU3RhdGUgKnRoaXopIDogbVRoaXoodGhpeikge30KKwordm9pZCBTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXI6OmhhbmcoKSB7CisgICAgbVRoaXotPm1Nb2RlID0gSEFORzsKK30KKwordm9pZCBTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXI6OmZhaWwoYzJfc3RhdHVzX3QgZXJyLCBib29sIGV4ZWN1dGUpIHsKKyAgICBtVGhpei0+bU1vZGUgPSBleGVjdXRlID8gRVhFQ1VURSA6IE5PX09QOworICAgIG1UaGl6LT5tT3ZlcnJpZGUgPSB0cnVlOworICAgIG1UaGl6LT5tUmVzdWx0T3ZlcnJpZGUgPSBlcnI7Cit9CisKK1NpbXBsZU1ldGhvZFN0YXRlOjpTaW1wbGVNZXRob2RTdGF0ZSgpCisgICAgOiBtTW9kZShFWEVDVVRFKSwgbU92ZXJyaWRlKGZhbHNlKSwgbVJlc3VsdE92ZXJyaWRlKEMyX09LKSB7fQorCitTaW1wbGVNZXRob2RTdGF0ZTo6TW9kZSBTaW1wbGVNZXRob2RTdGF0ZTo6Z2V0TW9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU1vZGU7Cit9CisKK2Jvb2wgU2ltcGxlTWV0aG9kU3RhdGU6Om92ZXJyaWRlUmVzdWx0KGMyX3N0YXR1c190ICpyZXN1bHQpIGNvbnN0IHsKKyAgICBpZiAoIW1PdmVycmlkZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgICpyZXN1bHQgPSBtUmVzdWx0T3ZlcnJpZGU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuaCBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9TaW1wbGVNZXRob2RTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDQ1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuaApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTSU1QTEVfTUVUSE9EX1NUQVRFX0hfCisjZGVmaW5lIFNJTVBMRV9NRVRIT0RfU1RBVEVfSF8KKworI2luY2x1ZGUgPEMyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBTdGF0ZSBmb3IgYSBzaW1wbGUgbWV0aG9kIHdoaWNoIHJldHVybnMgYzJfc3RhdHVzX3QgYW5kIHRha2VzIG5vIHBhcmFtZXRlcnMuCisgKi8KK2NsYXNzIFNpbXBsZU1ldGhvZFN0YXRlIHsKK3B1YmxpYzoKKyAgICBlbnVtIE1vZGUgeworICAgICAgICAvLyBFeGVjdXRlIHRoZSBub3JtYWwgb3BlcmF0aW9uCisgICAgICAgIEVYRUNVVEUsCisgICAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nCisgICAgICAgIE5PX09QLAorICAgICAgICAvLyBIYW5nOyBuZXZlciByZXR1cm4KKyAgICAgICAgSEFORywKKyAgICB9OworCisgICAgLyoqCisgICAgICogSW5qZWN0ZXIgY2xhc3MgdGhhdCBtb2RpZmllcyB0aGUgaW50ZXJuYWwgc3RhdGVzIG9mIHRoaXMgY2xhc3MuCisgICAgICovCisgICAgY2xhc3MgSW5qZWN0ZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgSW5qZWN0ZXIoU2ltcGxlTWV0aG9kU3RhdGUgKnRoaXopOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5nIHRoZSBvcGVyYXRpb24uCisgICAgICAgICAqLworICAgICAgICB2b2lkIGhhbmcoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogRmFpbCB0aGUgb3BlcmF0aW9uIHdpdGggZ2l2ZW4gcGFyYW1zLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gZXJyICAgICAgIGVycm9yIGNvZGUgdG8gcmVwbGFjZSB0aGUgYWN0dWFsIHJldHVybiB2YWx1ZQorICAgICAgICAgKiBccGFyYW0gZXhlY3V0ZSAgIHdoZXRoZXIgdGhlIHdyYXBwZXIgc2hvdWxkIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBmYWlsKGMyX3N0YXR1c190IGVyciwgYm9vbCBleGVjdXRlID0gZmFsc2UpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgU2ltcGxlTWV0aG9kU3RhdGUgKmNvbnN0IG1UaGl6OworICAgIH07CisKKyAgICBTaW1wbGVNZXRob2RTdGF0ZSgpOworCisgICAgLyoqCisgICAgICogR2V0IGV4ZWN1dGlvbiBtb2RlLgorICAgICAqLworICAgIE1vZGUgZ2V0TW9kZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgcmVzdWx0IGZyb20gcnVubmluZyB0aGUgb3BlcmF0aW9uIGlmIGNvbmZpZ3VyZWQgc28uCisgICAgICovCisgICAgYm9vbCBvdmVycmlkZVJlc3VsdChjMl9zdGF0dXNfdCAqcmVzdWx0KSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBNb2RlIG1Nb2RlOworICAgIGJvb2wgbU92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG1SZXN1bHRPdmVycmlkZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBTSU1QTEVfTUVUSE9EX1NUQVRFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YWE2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDcyIEBACisvLyBETyBOT1QgREVQRU5EIE9OIFRISVMgRElSRUNUTFkKKy8vIHVzZSBsaWJjb2RlYzItaGlkbC1kZWZhdWx0cyBpbnN0ZWFkCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliY29kZWMyX2hpZGxAMS4wIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAorCisgICAgZGVmYXVsdHM6IFsiaGlkbF9kZWZhdWx0cyJdLAorCisgICAgc3JjczogWworICAgICAgICAiQ29tcG9uZW50LmNwcCIsCisgICAgICAgICJDb21wb25lbnRJbnRlcmZhY2UuY3BwIiwKKyAgICAgICAgIkNvbXBvbmVudFN0b3JlLmNwcCIsCisgICAgICAgICJDb25maWd1cmFibGUuY3BwIiwKKyAgICAgICAgIklucHV0QnVmZmVyTWFuYWdlci5jcHAiLAorICAgICAgICAiSW5wdXRTdXJmYWNlLmNwcCIsCisgICAgICAgICJJbnB1dFN1cmZhY2VDb25uZWN0aW9uLmNwcCIsCisgICAgICAgICJ0eXBlcy5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3lzdGVtX2hlYWRlcnMiLAorICAgICAgICAibGliY29kZWMyX2ludGVybmFsIiwgLy8gcHJpdmF0ZQorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5jb21tb25AMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWFAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlciIsCisgICAgICAgICJsaWJ1aSIsCisgICAgXSwKK30KKworLy8gcHVibGljIGRlcGVuZGVuY3kgZm9yIENvZGVjIDIuMCBIQUwgc2VydmljZSBpbXBsZW1lbnRhdGlvbnMKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliY29kZWMyLWhpZGwtZGVmYXVsdHMiLAorICAgIGRlZmF1bHRzOiBbImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAibGliY29kZWMyX2hpZGxAMS4wIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2JmNmY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudC5jcHAKQEAgLTAsMCArMSw0ODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUNvbXBvbmVudCIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9JbnB1dEJ1ZmZlck1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbEJpbmRlclN1cHBvcnQuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworI2luY2x1ZGUgPEMyQnFCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8dGhyZWFkPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOworCisvLyBDb21wb25lbnRMaXN0ZW5lciB3cmFwcGVyCitzdHJ1Y3QgQ29tcG9uZW50OjpMaXN0ZW5lciA6IHB1YmxpYyBDMkNvbXBvbmVudDo6TGlzdGVuZXIgeworCisgICAgTGlzdGVuZXIoY29uc3Qgc3A8Q29tcG9uZW50PiYgY29tcG9uZW50KSA6CisgICAgICAgIG1Db21wb25lbnQoY29tcG9uZW50KSwKKyAgICAgICAgbUxpc3RlbmVyKGNvbXBvbmVudC0+bUxpc3RlbmVyKSB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3JfbmIoCisgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiAvKiBjMmNvbXBvbmVudCAqLywKKyAgICAgICAgICAgIHVpbnQzMl90IGVycm9yQ29kZSkgb3ZlcnJpZGUgeworICAgICAgICBzcDxJQ29tcG9uZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBsaXN0ZW5lci0+b25FcnJvcihTdGF0dXM6Ok9LLCBlcnJvckNvZGUpOworICAgICAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb21wb25lbnQ6Okxpc3RlbmVyOjpvbkVycm9yX25iIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJ0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWRfbmIoCisgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiAvKiBjMmNvbXBvbmVudCAqLywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBjMnNldHRpbmdSZXN1bHQKKyAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICBzcDxJQ29tcG9uZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICBoaWRsX3ZlYzxTZXR0aW5nUmVzdWx0PiBzZXR0aW5nUmVzdWx0cyhjMnNldHRpbmdSZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+ICZjMnJlc3VsdCA6CisgICAgICAgICAgICAgICAgICAgIGMyc2V0dGluZ1Jlc3VsdCkgeworICAgICAgICAgICAgICAgIGlmIChjMnJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmc2V0dGluZ1Jlc3VsdHNbaXgrK10sICpjMnJlc3VsdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0dGluZ1Jlc3VsdHMucmVzaXplKGl4KTsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGxpc3RlbmVyLT5vblRyaXBwZWQoc2V0dGluZ1Jlc3VsdHMpOworICAgICAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb21wb25lbnQ6Okxpc3RlbmVyOjpvblRyaXBwZWRfbmIgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmVfbmIoCisgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiAvKiBjMmNvbXBvbmVudCAqLywKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gYzJ3b3JrSXRlbXMpIG92ZXJyaWRlIHsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGMyd29ya0l0ZW1zKSB7CisgICAgICAgICAgICBpZiAod29yaykgeworICAgICAgICAgICAgICAgIGlmICh3b3JrLT53b3JrbGV0cy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhd29yay0+d29ya2xldHMuYmFjaygpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAod29yay0+d29ya2xldHMuYmFjaygpLT5vdXRwdXQuZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRCdWZmZXJNYW5hZ2VyOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyRnJhbWVEYXRhKG1MaXN0ZW5lciwgd29yay0+aW5wdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIFdvcmtCdW5kbGUgd29ya0J1bmRsZTsKKworICAgICAgICAgICAgc3A8Q29tcG9uZW50PiBzdHJvbmdDb21wb25lbnQgPSBtQ29tcG9uZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICghb2JqY3B5KCZ3b3JrQnVuZGxlLCBjMndvcmtJdGVtcywgc3Ryb25nQ29tcG9uZW50ID8KKyAgICAgICAgICAgICAgICAgICAgJnN0cm9uZ0NvbXBvbmVudC0+bUJ1ZmZlclBvb2xTZW5kZXIgOiBudWxscHRyKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvbXBvbmVudDo6TGlzdGVuZXI6Om9uV29ya0RvbmVfbmIgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInJlY2VpdmVkIGNvcnJ1cHRlZCB3b3JrIGl0ZW1zLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbGlzdGVuZXItPm9uV29ya0RvbmUod29ya0J1bmRsZSk7CisgICAgICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvbXBvbmVudDo6TGlzdGVuZXI6Om9uV29ya0RvbmVfbmIgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHlpZWxkQnVmZmVyUXVldWVCbG9ja3MoYzJ3b3JrSXRlbXMsIHRydWUpOworICAgICAgICB9CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgd3A8Q29tcG9uZW50PiBtQ29tcG9uZW50OworICAgIHdwPElDb21wb25lbnRMaXN0ZW5lcj4gbUxpc3RlbmVyOworfTsKKworLy8gQ29tcG9uZW50OjpTaW5rCitzdHJ1Y3QgQ29tcG9uZW50OjpTaW5rIDogcHVibGljIElJbnB1dFNpbmsgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+IG1Db21wb25lbnQ7CisgICAgc3A8SUNvbmZpZ3VyYWJsZT4gbUNvbmZpZ3VyYWJsZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gcXVldWUoY29uc3QgV29ya0J1bmRsZSYgd29ya0J1bmRsZSkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUNvbXBvbmVudC0+cXVldWUod29ya0J1bmRsZSk7CisgICAgfQorCisgICAgdmlydHVhbCBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IGdldENvbmZpZ3VyYWJsZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1Db25maWd1cmFibGU7CisgICAgfQorCisgICAgU2luayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiYgY29tcG9uZW50KTsKKyAgICB2aXJ0dWFsIH5TaW5rKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBQcm9jZXNzLXdpZGUgbWFwOiBDb21wb25lbnQ6OlNpbmsgLT4gQzJDb21wb25lbnQuCisgICAgc3RhdGljIHN0ZDo6bXV0ZXggc1NpbmsyQ29tcG9uZW50TXV0ZXg7CisgICAgc3RhdGljIHN0ZDo6bWFwPElJbnB1dFNpbmsqLCBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50Pj4gc1NpbmsyQ29tcG9uZW50OworCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gZmluZExvY2FsQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3A8SUlucHV0U2luaz4mIHNpbmspOworfTsKKworc3RkOjptdXRleAorICAgICAgICBDb21wb25lbnQ6OlNpbms6OnNTaW5rMkNvbXBvbmVudE11dGV4e307CitzdGQ6Om1hcDxJSW5wdXRTaW5rKiwgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4+CisgICAgICAgIENvbXBvbmVudDo6U2luazo6c1NpbmsyQ29tcG9uZW50e307CisKK0NvbXBvbmVudDo6U2luazo6U2luayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiYgY29tcG9uZW50KQorICAgICAgICA6IG1Db21wb25lbnR7Y29tcG9uZW50fSwKKyAgICAgICAgICBtQ29uZmlndXJhYmxle1smY29tcG9uZW50XSgpIC0+IHNwPElDb25maWd1cmFibGU+IHsKKyAgICAgICAgICAgICAgUmV0dXJuPHNwPElDb21wb25lbnRJbnRlcmZhY2U+PiByZXQxID0gY29tcG9uZW50LT5nZXRJbnRlcmZhY2UoKTsKKyAgICAgICAgICAgICAgaWYgKCFyZXQxLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiU2luazo6U2luayAtLSBjb21wb25lbnQncyB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gcmV0MiA9CisgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbXBvbmVudEludGVyZmFjZT4+KHJldDEpLT4KKyAgICAgICAgICAgICAgICAgICAgICBnZXRDb25maWd1cmFibGUoKTsKKyAgICAgICAgICAgICAgaWYgKCFyZXQyLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiU2luazo6U2luayAtLSBpbnRlcmZhY2UncyB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzcDxJQ29uZmlndXJhYmxlPj4ocmV0Mik7CisgICAgICAgICAgfSgpfSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc1NpbmsyQ29tcG9uZW50TXV0ZXgpOworICAgIHNTaW5rMkNvbXBvbmVudC5lbXBsYWNlKHRoaXMsIGNvbXBvbmVudC0+bUNvbXBvbmVudCk7Cit9CisKK0NvbXBvbmVudDo6U2luazo6flNpbmsoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc1NpbmsyQ29tcG9uZW50TXV0ZXgpOworICAgIHNTaW5rMkNvbXBvbmVudC5lcmFzZSh0aGlzKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBDb21wb25lbnQ6OlNpbms6OmZpbmRMb2NhbENvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3A8SUlucHV0U2luaz4mIHNpbmspIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzU2luazJDb21wb25lbnRNdXRleCk7CisgICAgYXV0byBpID0gc1NpbmsyQ29tcG9uZW50LmZpbmQoc2luay5nZXQoKSk7CisgICAgaWYgKGkgPT0gc1NpbmsyQ29tcG9uZW50LmVuZCgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gaS0+c2Vjb25kLmxvY2soKTsKK30KKworLy8gQ29tcG9uZW50CitDb21wb25lbnQ6OkNvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgY29uc3Qgc3A8Q29tcG9uZW50U3RvcmU+JiBzdG9yZSwKKyAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OgorICAgICAgICBJQ2xpZW50TWFuYWdlcj4mIGNsaWVudFBvb2xNYW5hZ2VyKQorICAgICAgOiBtQ29tcG9uZW50e2NvbXBvbmVudH0sCisgICAgICAgIG1JbnRlcmZhY2V7bmV3IENvbXBvbmVudEludGVyZmFjZShjb21wb25lbnQtPmludGYoKSwgc3RvcmUuZ2V0KCkpfSwKKyAgICAgICAgbUxpc3RlbmVye2xpc3RlbmVyfSwKKyAgICAgICAgbVN0b3Jle3N0b3JlfSwKKyAgICAgICAgbUJ1ZmZlclBvb2xTZW5kZXJ7Y2xpZW50UG9vbE1hbmFnZXJ9IHsKKyAgICAvLyBSZXRyaWV2ZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBmcm9tIHN0b3JlCisgICAgLy8gVE9ETzogV2UgY291bGQgY2FjaGUgdGhpcyBwZXIgY29tcG9uZW50L2ludGVyZmFjZSB0eXBlCisgICAgbUluaXQgPSBtSW50ZXJmYWNlLT5zdGF0dXMoKTsKK30KKworYzJfc3RhdHVzX3QgQ29tcG9uZW50OjpzdGF0dXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0OworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50CitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OnF1ZXVlKGNvbnN0IFdvcmtCdW5kbGUmIHdvcmtCdW5kbGUpIHsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGMyd29ya3M7CisKKyAgICBpZiAoIW9iamNweSgmYzJ3b3Jrcywgd29ya0J1bmRsZSkpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6Q09SUlVQVEVEOworICAgIH0KKworICAgIC8vIFJlZ2lzdGVyIGlucHV0IGJ1ZmZlcnMuCisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGMyd29ya3MpIHsKKyAgICAgICAgaWYgKHdvcmspIHsKKyAgICAgICAgICAgIElucHV0QnVmZmVyTWFuYWdlcjo6CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyRnJhbWVEYXRhKG1MaXN0ZW5lciwgd29yay0+aW5wdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1cz4obUNvbXBvbmVudC0+cXVldWVfbmIoJmMyd29ya3MpKTsKK30KKworUmV0dXJuPHZvaWQ+IENvbXBvbmVudDo6Zmx1c2goZmx1c2hfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGMyZmx1c2hlZFdvcmtzOworICAgIGMyX3N0YXR1c190IGMycmVzID0gbUNvbXBvbmVudC0+Zmx1c2hfc20oCisgICAgICAgICAgICBDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULAorICAgICAgICAgICAgJmMyZmx1c2hlZFdvcmtzKTsKKworICAgIC8vIFVucmVnaXN0ZXIgaW5wdXQgYnVmZmVycy4KKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogYzJmbHVzaGVkV29ya3MpIHsKKyAgICAgICAgaWYgKHdvcmspIHsKKyAgICAgICAgICAgIGlmICh3b3JrLT53b3JrbGV0cy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgIHx8ICF3b3JrLT53b3JrbGV0cy5iYWNrKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHdvcmstPndvcmtsZXRzLmJhY2soKS0+b3V0cHV0LmZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpID09IDApIHsKKyAgICAgICAgICAgICAgICBJbnB1dEJ1ZmZlck1hbmFnZXI6OgorICAgICAgICAgICAgICAgICAgICAgICAgdW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIsIHdvcmstPmlucHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFdvcmtCdW5kbGUgZmx1c2hlZFdvcmtCdW5kbGU7CisgICAgU3RhdHVzIHJlcyA9IHN0YXRpY19jYXN0PFN0YXR1cz4oYzJyZXMpOworICAgIGlmIChjMnJlcyA9PSBDMl9PSykgeworICAgICAgICBpZiAoIW9iamNweSgmZmx1c2hlZFdvcmtCdW5kbGUsIGMyZmx1c2hlZFdvcmtzLCAmbUJ1ZmZlclBvb2xTZW5kZXIpKSB7CisgICAgICAgICAgICByZXMgPSBTdGF0dXM6OkNPUlJVUFRFRDsKKyAgICAgICAgfQorICAgIH0KKyAgICBfaGlkbF9jYihyZXMsIGZsdXNoZWRXb3JrQnVuZGxlKTsKKyAgICB5aWVsZEJ1ZmZlclF1ZXVlQmxvY2tzKGMyZmx1c2hlZFdvcmtzLCB0cnVlKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OmRyYWluKGJvb2wgd2l0aEVvcykgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KG1Db21wb25lbnQtPmRyYWluX25iKHdpdGhFb3MgPworICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUyA6CisgICAgICAgICAgICBDMkNvbXBvbmVudDo6RFJBSU5fQ09NUE9ORU5UX05PX0VPUykpOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OnNldE91dHB1dFN1cmZhY2UoCisgICAgICAgIHVpbnQ2NF90IGJsb2NrUG9vbElkLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcG9vbDsKKyAgICBHZXRDb2RlYzJCbG9ja1Bvb2woYmxvY2tQb29sSWQsIG1Db21wb25lbnQsICZwb29sKTsKKyAgICBpZiAocG9vbCAmJiBwb29sLT5nZXRBbGxvY2F0b3JJZCgpID09IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w+IGJxUG9vbCA9CisgICAgICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w+KHBvb2wpOworICAgICAgICBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpPblJlbmRlckNhbGxiYWNrIGNiID0KKyAgICAgICAgICAgIFt0aGlzXSh1aW50NjRfdCBwcm9kdWNlciwgaW50MzJfdCBzbG90LCBpbnQ2NF90IG5zZWNzKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogYmF0Y2ggdGhpcworICAgICAgICAgICAgICAgIGhpZGxfdmVjPElDb21wb25lbnRMaXN0ZW5lcjo6UmVuZGVyZWRGcmFtZT4gcmVuZGVyZWQ7CisgICAgICAgICAgICAgICAgcmVuZGVyZWQucmVzaXplKDEpOworICAgICAgICAgICAgICAgIHJlbmRlcmVkWzBdID0geyBwcm9kdWNlciwgc2xvdCwgbnNlY3MgfTsKKyAgICAgICAgICAgICAgICAodm9pZCltTGlzdGVuZXItPm9uRnJhbWVzUmVuZGVyZWQocmVuZGVyZWQpLmlzT2soKTsKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKGJxUG9vbCkgeworICAgICAgICAgICAgYnFQb29sLT5zZXRSZW5kZXJDYWxsYmFjayhjYik7CisgICAgICAgICAgICBicVBvb2wtPmNvbmZpZ3VyZVByb2R1Y2VyKHN1cmZhY2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50Ojpjb25uZWN0VG9JbnB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IHNwPElJbnB1dFN1cmZhY2U+JiBpbnB1dFN1cmZhY2UsCisgICAgICAgIGNvbm5lY3RUb0lucHV0U3VyZmFjZV9jYiBfaGlkbF9jYikgeworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgc3A8SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24+IGNvbm5lY3Rpb247CisgICAgYXV0byB0cmFuc1N0YXR1cyA9IGlucHV0U3VyZmFjZS0+Y29ubmVjdCgKKyAgICAgICAgICAgIGFzSW5wdXRTaW5rKCksCisgICAgICAgICAgICBbJnN0YXR1cywgJmNvbm5lY3Rpb25dKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywgY29uc3Qgc3A8SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24+JiBjKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uID0gYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICBfaGlkbF9jYihzdGF0dXMsIGNvbm5lY3Rpb24pOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnQ6OmNvbm5lY3RUb09teElucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyLAorICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjoKKyAgICAgICAgSUdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgIGNvbm5lY3RUb09teElucHV0U3VyZmFjZV9jYiBfaGlkbF9jYikgeworICAgICh2b2lkKXByb2R1Y2VyOworICAgICh2b2lkKXNvdXJjZTsKKyAgICAodm9pZClfaGlkbF9jYjsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OmRpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlKCkgeworICAgIC8vIFRPRE8gaW1wbGVtZW50CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworc3RydWN0IEJsb2NrUG9vbEludGYgOiBwdWJsaWMgQ29uZmlndXJhYmxlQzJJbnRmIHsKKyAgICBCbG9ja1Bvb2xJbnRmKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpCisgICAgICAgICAgOiBDb25maWd1cmFibGVDMkludGZ7CisgICAgICAgICAgICAgICAgIkMyQmxvY2tQb29sOiIgKworICAgICAgICAgICAgICAgICAgICAocG9vbCA/IHN0ZDo6dG9fc3RyaW5nKHBvb2wtPmdldExvY2FsSWQoKSkgOiAibnVsbCIpLAorICAgICAgICAgICAgICAgIDB9LAorICAgICAgICAgICAgbVBvb2x7cG9vbH0geworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiBwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcworICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKXBhcmFtczsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKWZhaWx1cmVzOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiYgaW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAodm9pZClpbmRpY2VzOworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpcGFyYW1zOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAodm9pZClwYXJhbXM7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgZmllbGRzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAodm9pZClmaWVsZHM7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtUG9vbDsKK307CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworUmV0dXJuPHZvaWQ+IENvbXBvbmVudDo6Y3JlYXRlQmxvY2tQb29sKAorICAgICAgICB1aW50MzJfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgY3JlYXRlQmxvY2tQb29sX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBibG9ja1Bvb2w7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQ3JlYXRlQ29kZWMyQmxvY2tQb29sKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90PihhbGxvY2F0b3JJZCksCisgICAgICAgICAgICBtQ29tcG9uZW50LAorICAgICAgICAgICAgJmJsb2NrUG9vbCk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBibG9ja1Bvb2wgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAoYmxvY2tQb29sKSB7CisgICAgICAgIG1CbG9ja1Bvb2xzTXV0ZXgubG9jaygpOworICAgICAgICBtQmxvY2tQb29scy5lbXBsYWNlKGJsb2NrUG9vbC0+Z2V0TG9jYWxJZCgpLCBibG9ja1Bvb2wpOworICAgICAgICBtQmxvY2tQb29sc011dGV4LnVubG9jaygpOworICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IEMyX09LKSB7CisgICAgICAgIHN0YXR1cyA9IEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxTdGF0dXM+KHN0YXR1cyksCisgICAgICAgICAgICBibG9ja1Bvb2wgPyBibG9ja1Bvb2wtPmdldExvY2FsSWQoKSA6IDAsCisgICAgICAgICAgICBuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCbG9ja1Bvb2xJbnRmPihibG9ja1Bvb2wpKSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpkZXN0cm95QmxvY2tQb29sKHVpbnQ2NF90IGJsb2NrUG9vbElkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJsb2NrUG9vbHNNdXRleCk7CisgICAgcmV0dXJuIG1CbG9ja1Bvb2xzLmVyYXNlKGJsb2NrUG9vbElkKSA9PSAxID8KKyAgICAgICAgICAgIFN0YXR1czo6T0sgOiBTdGF0dXM6OkNPUlJVUFRFRDsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpzdGFydCgpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5zdGFydCgpKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpzdG9wKCkgeworICAgIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KG1Db21wb25lbnQtPnN0b3AoKSk7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6cmVzZXQoKSB7CisgICAgU3RhdHVzIHN0YXR1cyA9IHN0YXRpY19jYXN0PFN0YXR1cz4obUNvbXBvbmVudC0+cmVzZXQoKSk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQmxvY2tQb29sc011dGV4KTsKKyAgICAgICAgbUJsb2NrUG9vbHMuY2xlYXIoKTsKKyAgICB9CisgICAgSW5wdXRCdWZmZXJNYW5hZ2VyOjp1bnJlZ2lzdGVyRnJhbWVEYXRhKG1MaXN0ZW5lcik7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpyZWxlYXNlKCkgeworICAgIFN0YXR1cyBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KG1Db21wb25lbnQtPnJlbGVhc2UoKSk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQmxvY2tQb29sc011dGV4KTsKKyAgICAgICAgbUJsb2NrUG9vbHMuY2xlYXIoKTsKKyAgICB9CisgICAgSW5wdXRCdWZmZXJNYW5hZ2VyOjp1bnJlZ2lzdGVyRnJhbWVEYXRhKG1MaXN0ZW5lcik7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmV0dXJuPHNwPElDb21wb25lbnRJbnRlcmZhY2U+PiBDb21wb25lbnQ6OmdldEludGVyZmFjZSgpIHsKKyAgICByZXR1cm4gc3A8SUNvbXBvbmVudEludGVyZmFjZT4obUludGVyZmFjZSk7Cit9CisKK1JldHVybjxzcDxJSW5wdXRTaW5rPj4gQ29tcG9uZW50Ojphc0lucHV0U2luaygpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU2lua011dGV4KTsKKyAgICBpZiAoIW1TaW5rKSB7CisgICAgICAgIG1TaW5rID0gbmV3IFNpbmsoc2hhcmVkX2Zyb21fdGhpcygpKTsKKyAgICB9CisgICAgcmV0dXJuIHttU2lua307Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gQ29tcG9uZW50OjpmaW5kTG9jYWxDb21wb25lbnQoCisgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rKSB7CisgICAgcmV0dXJuIENvbXBvbmVudDo6U2luazo6ZmluZExvY2FsQ29tcG9uZW50KHNpbmspOworfQorCit2b2lkIENvbXBvbmVudDo6aW5pdExpc3RlbmVyKGNvbnN0IHNwPENvbXBvbmVudD4mIHNlbGYpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBjMmxpc3RlbmVyID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8TGlzdGVuZXI+KHNlbGYpOworICAgIGMyX3N0YXR1c190IHJlcyA9IG1Db21wb25lbnQtPnNldExpc3RlbmVyX3ZiKGMybGlzdGVuZXIsIEMyX0RPTlRfQkxPQ0spOworICAgIGlmIChyZXMgIT0gQzJfT0spIHsKKyAgICAgICAgbUluaXQgPSByZXM7CisgICAgfQorfQorCitDb21wb25lbnQ6On5Db21wb25lbnQoKSB7CisgICAgSW5wdXRCdWZmZXJNYW5hZ2VyOjp1bnJlZ2lzdGVyRnJhbWVEYXRhKG1MaXN0ZW5lcik7CisgICAgbVN0b3JlLT5yZXBvcnRDb21wb25lbnREZWF0aCh0aGlzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudEludGVyZmFjZS5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50SW50ZXJmYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWU1MzU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudEludGVyZmFjZS5jcHAKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUNvbXBvbmVudEludGVyZmFjZSIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbEJpbmRlclN1cHBvcnQuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworI2luY2x1ZGUgPEMyQnFCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8dGhyZWFkPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKKy8vIEltcGxlbWVudGF0aW9uIG9mIENvbmZpZ3VyYWJsZUMySW50ZiBiYXNlZCBvbiBDMkNvbXBvbmVudEludGVyZmFjZQorc3RydWN0IENvbXBJbnRmIDogcHVibGljIENvbmZpZ3VyYWJsZUMySW50ZiB7CisgICAgQ29tcEludGYoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiYgaW50ZikgOgorICAgICAgICBDb25maWd1cmFibGVDMkludGZ7aW50Zi0+Z2V0TmFtZSgpLCBpbnRmLT5nZXRJZCgpfSwKKyAgICAgICAgbUludGZ7aW50Zn0geworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiBwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcworICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50Zi0+Y29uZmlnX3ZiKHBhcmFtcywgbWF5QmxvY2ssIGZhaWx1cmVzKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+JiBpbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IHBhcmFtcworICAgICAgICAgICAgKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50Zi0+cXVlcnlfdmIoe30sIGluZGljZXMsIG1heUJsb2NrLCBwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiogY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtc19uYihwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfdmIoZmllbGRzLCBtYXlCbG9jayk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBtSW50ZjsKK307CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gQ29tcG9uZW50SW50ZXJmYWNlCitDb21wb25lbnRJbnRlcmZhY2U6OkNvbXBvbmVudEludGVyZmFjZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiYgaW50ZiwKKyAgICAgICAgQ29tcG9uZW50U3RvcmUqIHN0b3JlKQorICAgICAgOiBtSW50ZXJmYWNle2ludGZ9LAorICAgICAgICBtQ29uZmlndXJhYmxle25ldyBDYWNoZWRDb25maWd1cmFibGUoc3RkOjptYWtlX3VuaXF1ZTxDb21wSW50Zj4oaW50ZikpfSB7CisgICAgbUluaXQgPSBtQ29uZmlndXJhYmxlLT5pbml0KHN0b3JlKTsKK30KKworYzJfc3RhdHVzX3QgQ29tcG9uZW50SW50ZXJmYWNlOjpzdGF0dXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0OworfQorCitSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IENvbXBvbmVudEludGVyZmFjZTo6Z2V0Q29uZmlndXJhYmxlKCkgeworICAgIHJldHVybiBtQ29uZmlndXJhYmxlOworfQorCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50U3RvcmUuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudFN0b3JlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjVmYWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudFN0b3JlLmNwcApAQCAtMCwwICsxLDQ0MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzItQ29tcG9uZW50U3RvcmUiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2UuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGN0aW1lPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOwordXNpbmcgOjphbmRyb2lkOjpHcmFwaGljQnVmZmVyU291cmNlOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitzdHJ1Y3QgU3RvcmVJbnRmIDogcHVibGljIENvbmZpZ3VyYWJsZUMySW50ZiB7CisgICAgU3RvcmVJbnRmKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiYgc3RvcmUpCisgICAgICAgICAgOiBDb25maWd1cmFibGVDMkludGZ7c3RvcmUgPyBzdG9yZS0+Z2V0TmFtZSgpIDogIiIsIDB9LAorICAgICAgICAgICAgbVN0b3Jle3N0b3JlfSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzCisgICAgICAgICAgICApIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gQXNzdW1lIGFsbCBwYXJhbXMgYXJlIGJsb2NraW5nCisgICAgICAgIC8vIFRPRE86IEZpbHRlciBmb3Igc3VwcG9ydGVkIHBhcmFtcworICAgICAgICBpZiAobWF5QmxvY2sgPT0gQzJfRE9OVF9CTE9DSyAmJiBwYXJhbXMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVN0b3JlLT5jb25maWdfc20ocGFyYW1zLCBmYWlsdXJlcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgLy8gQXNzdW1lIGFsbCBwYXJhbXMgYXJlIGJsb2NraW5nCisgICAgICAgIC8vIFRPRE86IEZpbHRlciBmb3Igc3VwcG9ydGVkIHBhcmFtcworICAgICAgICBpZiAobWF5QmxvY2sgPT0gQzJfRE9OVF9CTE9DSyAmJiBpbmRpY2VzLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1TdG9yZS0+cXVlcnlfc20oe30sIGluZGljZXMsIHBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbVN0b3JlLT5xdWVyeVN1cHBvcnRlZFBhcmFtc19uYihwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIC8vIEFzc3VtZSBhbGwgcGFyYW1zIGFyZSBibG9ja2luZworICAgICAgICAvLyBUT0RPOiBGaWx0ZXIgZm9yIHN1cHBvcnRlZCBwYXJhbXMKKyAgICAgICAgaWYgKG1heUJsb2NrID09IEMyX0RPTlRfQkxPQ0sgJiYgZmllbGRzLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1TdG9yZS0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20oZmllbGRzKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gbVN0b3JlOworfTsKKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50U3RvcmUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+JiBzdG9yZSkKKyAgICAgIDogbUNvbmZpZ3VyYWJsZXtuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKHN0ZDo6bWFrZV91bmlxdWU8U3RvcmVJbnRmPihzdG9yZSkpfSwKKyAgICAgICAgbVN0b3Jle3N0b3JlfSB7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gcGxhdGZvcm1TdG9yZSA9IGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKTsKKyAgICBTZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZShzdG9yZSk7CisKKyAgICAvLyBSZXRyaWV2ZSBzdHJ1Y3QgZGVzY3JpcHRvcnMKKyAgICBtUGFyYW1SZWZsZWN0b3IgPSBtU3RvcmUtPmdldFBhcmFtUmVmbGVjdG9yKCk7CisKKyAgICAvLyBSZXRyaWV2ZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBmcm9tIHN0b3JlCisgICAgbUluaXQgPSBtQ29uZmlndXJhYmxlLT5pbml0KHRoaXMpOworfQorCitjMl9zdGF0dXNfdCBDb21wb25lbnRTdG9yZTo6c3RhdHVzKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdDsKK30KKworYzJfc3RhdHVzX3QgQ29tcG9uZW50U3RvcmU6OnZhbGlkYXRlU3VwcG9ydGVkUGFyYW1zKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiYgcGFyYW1zKSB7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfT0s7CisKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gJmRlc2MgOiBwYXJhbXMpIHsKKyAgICAgICAgaWYgKCFkZXNjKSB7CisgICAgICAgICAgICAvLyBBbGwgZGVzY3JpcHRvcnMgc2hvdWxkIGJlIHZhbGlkCisgICAgICAgICAgICByZXMgPSByZXMgPyByZXMgOiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggY29yZUluZGV4ID0gZGVzYy0+aW5kZXgoKS5jb3JlSW5kZXgoKTsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cnVjdERlc2NyaXB0b3JzTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbVN0cnVjdERlc2NyaXB0b3JzLmZpbmQoY29yZUluZGV4KTsKKyAgICAgICAgaWYgKGl0ID09IG1TdHJ1Y3REZXNjcmlwdG9ycy5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gc3RydWN0RGVzYyA9CisgICAgICAgICAgICAgICAgICAgIG1QYXJhbVJlZmxlY3Rvci0+ZGVzY3JpYmUoY29yZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghc3RydWN0RGVzYykgeworICAgICAgICAgICAgICAgIC8vIEFsbCBzdXBwb3J0ZWQgcGFyYW1zIG11c3QgYmUgZGVzY3JpYmVkCisgICAgICAgICAgICAgICAgcmVzID0gQzJfQkFEX0lOREVYOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN0cnVjdERlc2NyaXB0b3JzLmluc2VydCh7IGNvcmVJbmRleCwgc3RydWN0RGVzYyB9KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50U3RvcmUKK1JldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6Y3JlYXRlQ29tcG9uZW50KAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKKyAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcG9vbCwKKyAgICAgICAgY3JlYXRlQ29tcG9uZW50X2NiIF9oaWRsX2NiKSB7CisKKyAgICBzcDxDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGMyY29tcG9uZW50OworICAgIFN0YXR1cyBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KAorICAgICAgICAgICAgbVN0b3JlLT5jcmVhdGVDb21wb25lbnQobmFtZSwgJmMyY29tcG9uZW50KSk7CisKKyAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgb25JbnRlcmZhY2VMb2FkZWQoYzJjb21wb25lbnQtPmludGYoKSk7CisgICAgICAgIGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnQoYzJjb21wb25lbnQsIGxpc3RlbmVyLCB0aGlzLCBwb29sKTsKKyAgICAgICAgaWYgKCFjb21wb25lbnQpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6Q09SUlVQVEVEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVwb3J0Q29tcG9uZW50QmlydGgoY29tcG9uZW50LmdldCgpKTsKKyAgICAgICAgICAgIGlmIChjb21wb25lbnQtPnN0YXR1cygpICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihjb21wb25lbnQtPnN0YXR1cygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29tcG9uZW50LT5pbml0TGlzdGVuZXIoY29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LT5zdGF0dXMoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KGNvbXBvbmVudC0+c3RhdHVzKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBfaGlkbF9jYihzdGF0dXMsIGNvbXBvbmVudCk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IENvbXBvbmVudFN0b3JlOjpjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lLAorICAgICAgICBjcmVhdGVJbnRlcmZhY2VfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGMyaW50ZXJmYWNlOworICAgIGMyX3N0YXR1c190IHJlcyA9IG1TdG9yZS0+Y3JlYXRlSW50ZXJmYWNlKG5hbWUsICZjMmludGVyZmFjZSk7CisgICAgc3A8SUNvbXBvbmVudEludGVyZmFjZT4gaW50ZXJmYWNlOworICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgb25JbnRlcmZhY2VMb2FkZWQoYzJpbnRlcmZhY2UpOworICAgICAgICBpbnRlcmZhY2UgPSBuZXcgQ29tcG9uZW50SW50ZXJmYWNlKGMyaW50ZXJmYWNlLCB0aGlzKTsKKyAgICB9CisgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8U3RhdHVzPihyZXMpLCBpbnRlcmZhY2UpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6bGlzdENvbXBvbmVudHMobGlzdENvbXBvbmVudHNfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IGMydHJhaXRzID0KKyAgICAgICAgICAgIG1TdG9yZS0+bGlzdENvbXBvbmVudHMoKTsKKyAgICBoaWRsX3ZlYzxJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0cz4gdHJhaXRzKGMydHJhaXRzLnNpemUoKSk7CisgICAgc2l6ZV90IGl4ID0gMDsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiAmYzJ0cmFpdCA6IGMydHJhaXRzKSB7CisgICAgICAgIGlmIChjMnRyYWl0KSB7CisgICAgICAgICAgICBpZiAob2JqY3B5KCZ0cmFpdHNbaXhdLCAqYzJ0cmFpdCkpIHsKKyAgICAgICAgICAgICAgICArK2l4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB0cmFpdHMucmVzaXplKGl4KTsKKyAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCB0cmFpdHMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6Y3JlYXRlSW5wdXRTdXJmYWNlKGNyZWF0ZUlucHV0U3VyZmFjZV9jYiBfaGlkbF9jYikgeworICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IHNvdXJjZSA9IG5ldyBHcmFwaGljQnVmZmVyU291cmNlKCk7CisgICAgaWYgKHNvdXJjZS0+aW5pdENoZWNrKCkgIT0gT0spIHsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpDT1JSVVBURUQsIG51bGxwdHIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHYnA7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyPEhHYnA+IEIySEdicDsKKyAgICBzcDxJbnB1dFN1cmZhY2U+IGlucHV0U3VyZmFjZSA9IG5ldyBJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlJlZmxlY3RvckhlbHBlcj4oKSwKKyAgICAgICAgICAgIG5ldyBCMkhHYnAoc291cmNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkpLAorICAgICAgICAgICAgc291cmNlKTsKKyAgICBfaGlkbF9jYihpbnB1dFN1cmZhY2UgPyBTdGF0dXM6Ok9LIDogU3RhdHVzOjpOT19NRU1PUlksCisgICAgICAgICAgICAgaW5wdXRTdXJmYWNlKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCit2b2lkIENvbXBvbmVudFN0b3JlOjpvbkludGVyZmFjZUxvYWRlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKSB7CisgICAgLy8gaW52YWxpZGF0ZSB1bnN1cHBvcnRlZCBzdHJ1Y3QgZGVzY3JpcHRvcnMgaWYgYSBuZXcgaW50ZXJmYWNlIGlzIGxvYWRlZCBhcyBpdCBtYXkgaGF2ZQorICAgIC8vIGV4cG9zZWQgbmV3IGRlc2NyaXB0b3JzCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cnVjdERlc2NyaXB0b3JzTXV0ZXgpOworICAgIGlmICghbUxvYWRlZEludGVyZmFjZXMuY291bnQoaW50Zi0+Z2V0TmFtZSgpKSkgeworICAgICAgICBtVW5zdXBwb3J0ZWRTdHJ1Y3REZXNjcmlwdG9ycy5jbGVhcigpOworICAgICAgICBtTG9hZGVkSW50ZXJmYWNlcy5lbXBsYWNlKGludGYtPmdldE5hbWUoKSk7CisgICAgfQorfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6OmdldFN0cnVjdERlc2NyaXB0b3JzKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgIGdldFN0cnVjdERlc2NyaXB0b3JzX2NiIF9oaWRsX2NiKSB7CisgICAgaGlkbF92ZWM8U3RydWN0RGVzY3JpcHRvcj4gZGVzY3JpcHRvcnMoaW5kaWNlcy5zaXplKCkpOworICAgIHNpemVfdCBkc3RJeCA9IDA7CisgICAgU3RhdHVzIHJlcyA9IFN0YXR1czo6T0s7CisgICAgZm9yIChzaXplX3Qgc3JjSXggPSAwOyBzcmNJeCA8IGluZGljZXMuc2l6ZSgpOyArK3NyY0l4KSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJ1Y3REZXNjcmlwdG9yc011dGV4KTsKKyAgICAgICAgY29uc3QgQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCA9IEMyUGFyYW06OkNvcmVJbmRleChpbmRpY2VzW3NyY0l4XSkuY29yZUluZGV4KCk7CisgICAgICAgIGNvbnN0IGF1dG8gaXRlbSA9IG1TdHJ1Y3REZXNjcmlwdG9ycy5maW5kKGNvcmVJbmRleCk7CisgICAgICAgIGlmIChpdGVtID09IG1TdHJ1Y3REZXNjcmlwdG9ycy5lbmQoKSkgeworICAgICAgICAgICAgLy8gbm90IGluIHRoZSBjYWNoZSwgYW5kIG5vdCBrbm93biB0byBiZSB1bnN1cHBvcnRlZCwgcXVlcnkgbG9jYWwgcmVmbGVjdG9yCisgICAgICAgICAgICBpZiAoIW1VbnN1cHBvcnRlZFN0cnVjdERlc2NyaXB0b3JzLmNvdW50KGNvcmVJbmRleCkpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBzdHJ1Y3REZXNjID0KKyAgICAgICAgICAgICAgICAgICAgbVBhcmFtUmVmbGVjdG9yLT5kZXNjcmliZShjb3JlSW5kZXgpOworICAgICAgICAgICAgICAgIGlmICghc3RydWN0RGVzYykgeworICAgICAgICAgICAgICAgICAgICBtVW5zdXBwb3J0ZWRTdHJ1Y3REZXNjcmlwdG9ycy5lbXBsYWNlKGNvcmVJbmRleCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0cnVjdERlc2NyaXB0b3JzLmluc2VydCh7IGNvcmVJbmRleCwgc3RydWN0RGVzYyB9KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9iamNweSgmZGVzY3JpcHRvcnNbZHN0SXhdLCAqc3RydWN0RGVzYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrZHN0SXg7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXMgPSBTdGF0dXM6OkNPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzID0gU3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbS0+c2Vjb25kKSB7CisgICAgICAgICAgICBpZiAob2JqY3B5KCZkZXNjcmlwdG9yc1tkc3RJeF0sICppdGVtLT5zZWNvbmQpKSB7CisgICAgICAgICAgICAgICAgKytkc3RJeDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IFN0YXR1czo6Q09SUlVQVEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMgPSBTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGRlc2NyaXB0b3JzLnJlc2l6ZShkc3RJeCk7CisgICAgX2hpZGxfY2IocmVzLCBkZXNjcmlwdG9ycyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHNwPElDbGllbnRNYW5hZ2VyPj4gQ29tcG9uZW50U3RvcmU6OmdldFBvb2xDbGllbnRNYW5hZ2VyKCkgeworICAgIHJldHVybiBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnRTdG9yZTo6Y29weUJ1ZmZlcihjb25zdCBCdWZmZXImIHNyYywgY29uc3QgQnVmZmVyJiBkc3QpIHsKKyAgICAvLyBUT0RPIGltcGxlbWVudAorICAgICh2b2lkKXNyYzsKKyAgICAodm9pZClkc3Q7CisgICAgcmV0dXJuIFN0YXR1czo6T01JVFRFRDsKK30KKworUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBDb21wb25lbnRTdG9yZTo6Z2V0Q29uZmlndXJhYmxlKCkgeworICAgIHJldHVybiBtQ29uZmlndXJhYmxlOworfQorCisvLyBDYWxsZWQgZnJvbSBjcmVhdGVDb21wb25lbnQoKSBhZnRlciBhIHN1Y2Nlc3NmdWwgY3JlYXRpb24gb2YgYGNvbXBvbmVudGAuCit2b2lkIENvbXBvbmVudFN0b3JlOjpyZXBvcnRDb21wb25lbnRCaXJ0aChDb21wb25lbnQqIGNvbXBvbmVudCkgeworICAgIENvbXBvbmVudFN0YXR1cyBjb21wb25lbnRTdGF0dXM7CisgICAgY29tcG9uZW50U3RhdHVzLmMyQ29tcG9uZW50ID0gY29tcG9uZW50LT5tQ29tcG9uZW50OworICAgIGNvbXBvbmVudFN0YXR1cy5iaXJ0aFRpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Db21wb25lbnRSb3N0ZXJNdXRleCk7CisgICAgbUNvbXBvbmVudFJvc3Rlci5lbXBsYWNlKGNvbXBvbmVudCwgY29tcG9uZW50U3RhdHVzKTsKK30KKworLy8gQ2FsbGVkIGZyb20gd2l0aGluIHRoZSBkZXN0cnVjdG9yIG9mIGBjb21wb25lbnRgLiBObyB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGxzCisvLyBhcmUgbWFkZSBvbiBgY29tcG9uZW50YCBoZXJlLgordm9pZCBDb21wb25lbnRTdG9yZTo6cmVwb3J0Q29tcG9uZW50RGVhdGgoQ29tcG9uZW50KiBjb21wb25lbnQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ29tcG9uZW50Um9zdGVyTXV0ZXgpOworICAgIG1Db21wb25lbnRSb3N0ZXIuZXJhc2UoY29tcG9uZW50KTsKK30KKworLy8gRHVtcHMgY29tcG9uZW50IHRyYWl0cy4KK3N0ZDo6b3N0cmVhbSYgQ29tcG9uZW50U3RvcmU6OmR1bXAoCisgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4mIGNvbXApIHsKKworICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyIGluZGVudFtdID0gIiAgICAiOworCisgICAgb3V0IDw8IGluZGVudCA8PCAibmFtZTogIiA8PCBjb21wLT5uYW1lIDw8IHN0ZDo6ZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJkb21haW46ICIgPDwgY29tcC0+ZG9tYWluIDw8IHN0ZDo6ZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJraW5kOiAiIDw8IGNvbXAtPmtpbmQgPDwgc3RkOjplbmRsOworICAgIG91dCA8PCBpbmRlbnQgPDwgInJhbms6ICIgPDwgY29tcC0+cmFuayA8PCBzdGQ6OmVuZGw7CisgICAgb3V0IDw8IGluZGVudCA8PCAibWVkaWFUeXBlOiAiIDw8IGNvbXAtPm1lZGlhVHlwZSA8PCBzdGQ6OmVuZGw7CisgICAgb3V0IDw8IGluZGVudCA8PCAiYWxpYXNlczoiOworICAgIGZvciAoY29uc3QgYXV0byYgYWxpYXMgOiBjb21wLT5hbGlhc2VzKSB7CisgICAgICAgIG91dCA8PCAnICcgPDwgYWxpYXM7CisgICAgfQorICAgIG91dCA8PCBzdGQ6OmVuZGw7CisKKyAgICByZXR1cm4gb3V0OworfQorCisvLyBEdW1wcyBjb21wb25lbnQgc3RhdHVzLgorc3RkOjpvc3RyZWFtJiBDb21wb25lbnRTdG9yZTo6ZHVtcCgKKyAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgIENvbXBvbmVudFN0YXR1cyYgY29tcFN0YXR1cykgeworCisgICAgY29uc3RleHByIGNvbnN0IGNoYXIgaW5kZW50W10gPSAiICAgICI7CisKKyAgICAvLyBQcmludCBiaXJ0aCB0aW1lLgorICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgbXMgPQorICAgICAgICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oCisgICAgICAgICAgICAgICAgY29tcFN0YXR1cy5iaXJ0aFRpbWUudGltZV9zaW5jZV9lcG9jaCgpKTsKKyAgICBzdGQ6OnRpbWVfdCBiaXJ0aFRpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0b190aW1lX3QoCisgICAgICAgICAgICBjb21wU3RhdHVzLmJpcnRoVGltZSk7CisgICAgc3RkOjp0bSB0bSA9ICpzdGQ6OmxvY2FsdGltZSgmYmlydGhUaW1lKTsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJDcmVhdGlvbiB0aW1lOiAiCisgICAgICAgIDw8IHN0ZDo6cHV0X3RpbWUoJnRtLCAiJVktJW0tJWQgJUg6JU06JVMiKQorICAgICAgICA8PCAnLicgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDMpIDw8IG1zLmNvdW50KCkgJSAxMDAwCisgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKworICAgIC8vIFByaW50IG5hbWUgYW5kIGlkLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZiA9IGNvbXBTdGF0dXMuYzJDb21wb25lbnQtPmludGYoKTsKKyAgICBpZiAoIWludGYpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCA8PCAiVW5rbm93biBjb21wb25lbnQgLS0gbnVsbCBpbnRlcmZhY2UiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIG91dDsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCA8PCAiTmFtZTogIiA8PCBpbnRmLT5nZXROYW1lKCkgPDwgc3RkOjplbmRsOworICAgIG91dCA8PCBpbmRlbnQgPDwgIklkOiAiIDw8IGludGYtPmdldElkKCkgPDwgc3RkOjplbmRsOworCisgICAgcmV0dXJuIG91dDsKK30KKworLy8gRHVtcHMgaW5mb3JtYXRpb24gd2hlbiBsc2hhbCBpcyBjYWxsZWQuCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6OmRlYnVnKAorICAgICAgICBjb25zdCBoaWRsX2hhbmRsZSYgaGFuZGxlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4mIC8qIGFyZ3MgKi8pIHsKKyAgICBMT0coSU5GTykgPDwgImRlYnVnIC0tIGR1bXBpbmcuLi4iOworICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaCA9IGhhbmRsZS5nZXROYXRpdmVIYW5kbGUoKTsKKyAgICBpZiAoIWggfHwgaC0+bnVtRmRzICE9IDEpIHsKKyAgICAgICBMT0coRVJST1IpIDw8ICJkZWJ1ZyAtLSBkdW1waW5nIGZhaWxlZCAtLSAiCisgICAgICAgICAgICAgICAiaW52YWxpZCBmaWxlIGRlc2NyaXB0b3IgdG8gZHVtcCB0byI7CisgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKworICAgIHsgLy8gUG9wdWxhdGUgIm91dCIuCisKKyAgICAgICAgY29uc3RleHByIGNvbnN0IGNoYXIgaW5kZW50W10gPSAiICAiOworCisgICAgICAgIC8vIFNob3cgbmFtZS4KKyAgICAgICAgb3V0IDw8ICJCZWdpbm5pbmcgb2YgZHVtcCAtLSBDMkNvbXBvbmVudFN0b3JlOiAiCisgICAgICAgICAgICAgICAgPDwgbVN0b3JlLT5nZXROYW1lKCkgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgY29tcG9uZW50cy4KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PiB0cmFpdHNMaXN0ID0KKyAgICAgICAgICAgICAgICBtU3RvcmUtPmxpc3RDb21wb25lbnRzKCk7CisKKyAgICAgICAgLy8gRHVtcCB0aGUgdHJhaXRzIG9mIHN1cHBvcnRlZCBjb21wb25lbnRzLgorICAgICAgICBvdXQgPDwgaW5kZW50IDw8ICJTdXBwb3J0ZWQgY29tcG9uZW50czoiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGlmICh0cmFpdHNMaXN0LnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50IDw8IGluZGVudCA8PCAiTk9ORSIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgdHJhaXRzIDogdHJhaXRzTGlzdCkgeworICAgICAgICAgICAgICAgIGR1bXAob3V0LCB0cmFpdHMpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIER1bXAgYWN0aXZlIGNvbXBvbmVudHMuCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQgPDwgIkFjdGl2ZSBjb21wb25lbnRzOiIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Db21wb25lbnRSb3N0ZXJNdXRleCk7CisgICAgICAgICAgICBpZiAobUNvbXBvbmVudFJvc3Rlci5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQgPDwgaW5kZW50IDw8ICJOT05FIiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIHBhaXIgOiBtQ29tcG9uZW50Um9zdGVyKSB7CisgICAgICAgICAgICAgICAgICAgIGR1bXAob3V0LCBwYWlyLnNlY29uZCkgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCAiRW5kIG9mIGR1bXAgLS0gQzJDb21wb25lbnRTdG9yZTogIgorICAgICAgICAgICAgICAgIDw8IG1TdG9yZS0+Z2V0TmFtZSgpIDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GZChvdXQuc3RyKCksIGgtPmRhdGFbMF0pKSB7CisgICAgICAgIFBMT0coV0FSTklORykgPDwgImRlYnVnIC0tIGR1bXBpbmcgZmFpbGVkIC0tIHdyaXRlKCkiOworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAiZGVidWcgLS0gZHVtcGluZyBzdWNjZWVkZWQiOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db25maWd1cmFibGUuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbmZpZ3VyYWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM5YzE3MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db25maWd1cmFibGUuY3BwCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1Db25maWd1cmFibGUiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOworCitDYWNoZWRDb25maWd1cmFibGU6OkNhY2hlZENvbmZpZ3VyYWJsZSgKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENvbmZpZ3VyYWJsZUMySW50Zj4mJiBpbnRmKQorICAgICAgOiBtSW50ZntzdGQ6Om1vdmUoaW50Zil9IHsKK30KKworYzJfc3RhdHVzX3QgQ2FjaGVkQ29uZmlndXJhYmxlOjppbml0KENvbXBvbmVudFN0b3JlKiBzdG9yZSkgeworICAgIC8vIFJldHJpZXZlIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGZyb20gc3RvcmUKKyAgICBjMl9zdGF0dXNfdCBpbml0ID0gbUludGYtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKCZtU3VwcG9ydGVkUGFyYW1zKTsKKyAgICBjMl9zdGF0dXNfdCB2YWxpZGF0ZSA9IHN0b3JlLT52YWxpZGF0ZVN1cHBvcnRlZFBhcmFtcyhtU3VwcG9ydGVkUGFyYW1zKTsKKyAgICByZXR1cm4gaW5pdCA9PSBDMl9PSyA/IEMyX09LIDogdmFsaWRhdGU7Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb25maWd1cmFibGUgZm9sbG93LgorUmV0dXJuPHVpbnQzMl90PiBDYWNoZWRDb25maWd1cmFibGU6OmdldElkKCkgeworICAgIHJldHVybiBtSW50Zi0+Z2V0SWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IENhY2hlZENvbmZpZ3VyYWJsZTo6Z2V0TmFtZShnZXROYW1lX2NiIF9oaWRsX2NiKSB7CisgICAgX2hpZGxfY2IobUludGYtPmdldE5hbWUoKSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IENhY2hlZENvbmZpZ3VyYWJsZTo6cXVlcnkoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQzMl90PiYgaW5kaWNlcywKKyAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgcXVlcnlfY2IgX2hpZGxfY2IpIHsKKyAgICB0eXBlZGVmIEMyUGFyYW06OkluZGV4IEluZGV4OworICAgIHN0ZDo6dmVjdG9yPEluZGV4PiBjMmhlYXBQYXJhbUluZGljZXMoCisgICAgICAgICAgICAoSW5kZXgqKWluZGljZXMuZGF0YSgpLAorICAgICAgICAgICAgKEluZGV4KilpbmRpY2VzLmRhdGEoKSArIGluZGljZXMuc2l6ZSgpKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGMyaGVhcFBhcmFtczsKKyAgICBjMl9zdGF0dXNfdCBjMnJlcyA9IG1JbnRmLT5xdWVyeSgKKyAgICAgICAgICAgIGMyaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIG1heUJsb2NrID8gQzJfTUFZX0JMT0NLIDogQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgICZjMmhlYXBQYXJhbXMpOworCisgICAgaGlkbF92ZWM8dWludDhfdD4gcGFyYW1zOworICAgIGlmICghY3JlYXRlUGFyYW1zQmxvYigmcGFyYW1zLCBjMmhlYXBQYXJhbXMpKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnkgLS0gaW52YWxpZCBvdXRwdXQgcGFyYW1zLiI7CisgICAgfQorICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PFN0YXR1cz4oYzJyZXMpLCBwYXJhbXMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDYWNoZWRDb25maWd1cmFibGU6OmNvbmZpZygKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGluUGFyYW1zLAorICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICBjb25maWdfY2IgX2hpZGxfY2IpIHsKKyAgICAvLyBpblBhcmFtcyBpcyBub3Qgd3JpdGFibGUsIHNvIGNyZWF0ZSBhIGNvcHkgYXMgY29uZmlnIG1vZGlmaWVzIHRoZSBwYXJhbWV0ZXJzCisgICAgaGlkbF92ZWM8dWludDhfdD4gaW5QYXJhbXNDb3B5ID0gaW5QYXJhbXM7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGMycGFyYW1zOworICAgIGlmICghcGFyc2VQYXJhbXNCbG9iKCZjMnBhcmFtcywgaW5QYXJhbXNDb3B5KSkgeworICAgICAgICBMT0coV0FSTklORykgPDwgImNvbmZpZyAtLSBpbnZhbGlkIGlucHV0IHBhcmFtcy4iOworICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkNPUlJVUFRFRCwKKyAgICAgICAgICAgICAgICBoaWRsX3ZlYzxTZXR0aW5nUmVzdWx0PigpLAorICAgICAgICAgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICAvLyBUT0RPOiBjaGVjayBpZiBibG9iIHdhcyBpbnZhbGlkCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGMyZmFpbHVyZXM7CisgICAgYzJfc3RhdHVzX3QgYzJyZXMgPSBtSW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgYzJwYXJhbXMsCisgICAgICAgICAgICBtYXlCbG9jayA/IEMyX01BWV9CTE9DSyA6IEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAmYzJmYWlsdXJlcyk7CisgICAgaGlkbF92ZWM8U2V0dGluZ1Jlc3VsdD4gZmFpbHVyZXMoYzJmYWlsdXJlcy5zaXplKCkpOworICAgIHsKKyAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiYgYzJyZXN1bHQgOiBjMmZhaWx1cmVzKSB7CisgICAgICAgICAgICBpZiAoYzJyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBpZiAob2JqY3B5KCZmYWlsdXJlc1tpeF0sICpjMnJlc3VsdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKytpeDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJjb25maWcgLS0gaW52YWxpZCBzZXR0aW5nIHJlc3VsdHMuIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZhaWx1cmVzLnJlc2l6ZShpeCk7CisgICAgfQorICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IG91dFBhcmFtczsKKyAgICBpZiAoIWNyZWF0ZVBhcmFtc0Jsb2IoJm91dFBhcmFtcywgYzJwYXJhbXMpKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgImNvbmZpZyAtLSBpbnZhbGlkIG91dHB1dCBwYXJhbXMuIjsKKyAgICB9CisgICAgX2hpZGxfY2IoKFN0YXR1cyljMnJlcywgZmFpbHVyZXMsIG91dFBhcmFtcyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IENhY2hlZENvbmZpZ3VyYWJsZTo6cXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgIHVpbnQzMl90IHN0YXJ0LAorICAgICAgICB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfY2IgX2hpZGxfY2IpIHsKKyAgICBDMkxpbmVhclJhbmdlIHJlcXVlc3QgPSBDMkxpbmVhckNhcGFjaXR5KG1TdXBwb3J0ZWRQYXJhbXMuc2l6ZSgpKS5yYW5nZSgKKyAgICAgICAgICAgIHN0YXJ0LCBjb3VudCk7CisgICAgaGlkbF92ZWM8UGFyYW1EZXNjcmlwdG9yPiBwYXJhbXMocmVxdWVzdC5zaXplKCkpOworICAgIFN0YXR1cyByZXMgPSBTdGF0dXM6Ok9LOworICAgIHNpemVfdCBkc3RJeCA9IDA7CisgICAgZm9yIChzaXplX3Qgc3JjSXggPSByZXF1ZXN0Lm9mZnNldCgpOyBzcmNJeCA8IHJlcXVlc3QuZW5kT2Zmc2V0KCk7ICsrc3JjSXgpIHsKKyAgICAgICAgaWYgKG1TdXBwb3J0ZWRQYXJhbXNbc3JjSXhdKSB7CisgICAgICAgICAgICBpZiAob2JqY3B5KCZwYXJhbXNbZHN0SXhdLCAqbVN1cHBvcnRlZFBhcmFtc1tzcmNJeF0pKSB7CisgICAgICAgICAgICAgICAgKytkc3RJeDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzID0gU3RhdHVzOjpDT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJxdWVyeVN1cHBvcnRlZFBhcmFtcyAtLSBpbnZhbGlkIG91dHB1dCBwYXJhbXMuIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IFN0YXR1czo6QkFEX0lOREVYOworICAgICAgICB9CisgICAgfQorICAgIHBhcmFtcy5yZXNpemUoZHN0SXgpOworICAgIF9oaWRsX2NiKHJlcywgcGFyYW1zKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ2FjaGVkQ29uZmlndXJhYmxlOjpxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8RmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGluRmllbGRzLAorICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICBxdWVyeVN1cHBvcnRlZFZhbHVlc19jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gYzJmaWVsZHM7CisgICAgeworICAgICAgICAvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgb2JqZWN0cyBhcmUgcmVzdHJpY3RlZCBpbiB0aGF0IHNvbWUKKyAgICAgICAgLy8gbWVtYmVycyBhcmUgY29uc3QuCisgICAgICAgIC8vIEMyUGFyYW1GaWVsZCAtIHJlcXVpcmVkIGZvciBpdHMgY29uc3RydWN0b3IgLSBoYXMgbm8gY29uc3RydWN0b3JzCisgICAgICAgIC8vIGZyb20gZmllbGRzLiBVc2UgQzJQYXJhbUluc3BlY3Rvci4KKyAgICAgICAgZm9yIChjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5ICZxdWVyeSA6IGluRmllbGRzKSB7CisgICAgICAgICAgICBjMmZpZWxkcy5lbXBsYWNlX2JhY2soX0MyUGFyYW1JbnNwZWN0b3I6OkNyZWF0ZVBhcmFtRmllbGQoCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LmZpZWxkLmluZGV4LAorICAgICAgICAgICAgICAgICAgICBxdWVyeS5maWVsZC5maWVsZElkLm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgcXVlcnkuZmllbGQuZmllbGRJZC5zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgcXVlcnkudHlwZSA9PSBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpUeXBlOjpQT1NTSUJMRSA/CisgICAgICAgICAgICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UE9TU0lCTEUgOgorICAgICAgICAgICAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkNVUlJFTlQpOworICAgICAgICB9CisgICAgfQorICAgIGMyX3N0YXR1c190IGMycmVzID0gbUludGYtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgYzJmaWVsZHMsCisgICAgICAgICAgICBtYXlCbG9jayA/IEMyX01BWV9CTE9DSyA6IEMyX0RPTlRfQkxPQ0spOworICAgIGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQ+IG91dEZpZWxkcyhpbkZpZWxkcy5zaXplKCkpOworICAgIHNpemVfdCBkc3RJeCA9IDA7CisgICAgZm9yIChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgJnJlc3VsdCA6IGMyZmllbGRzKSB7CisgICAgICAgIGlmIChvYmpjcHkoJm91dEZpZWxkc1tkc3RJeF0sIHJlc3VsdCkpIHsKKyAgICAgICAgICAgICsrZHN0SXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXRGaWVsZHMucmVzaXplKGRzdEl4KTsKKyAgICAgICAgICAgIGMycmVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJxdWVyeVN1cHBvcnRlZFZhbHVlcyAtLSBpbnZhbGlkIG91dHB1dCBwYXJhbXMuIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIF9oaWRsX2NiKChTdGF0dXMpYzJyZXMsIG91dEZpZWxkcyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0QnVmZmVyTWFuYWdlci5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRCdWZmZXJNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDIzYTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0QnVmZmVyTWFuYWdlci5jcHAKQEAgLTAsMCArMSw0NjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUlucHV0QnVmZmVyTWFuYWdlciIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0lucHV0QnVmZmVyTWFuYWdlci5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudExpc3RlbmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKKyNpbmNsdWRlIDxjaHJvbm8+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjpyZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCkgeworICAgIGdldEluc3RhbmNlKCkuX3JlZ2lzdGVyRnJhbWVEYXRhKGxpc3RlbmVyLCBpbnB1dCk7Cit9CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjp1bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KSB7CisgICAgZ2V0SW5zdGFuY2UoKS5fdW5yZWdpc3RlckZyYW1lRGF0YShsaXN0ZW5lciwgaW5wdXQpOworfQorCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKyAgICBnZXRJbnN0YW5jZSgpLl91bnJlZ2lzdGVyRnJhbWVEYXRhKGxpc3RlbmVyKTsKK30KKwordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6OnNldE5vdGlmaWNhdGlvbkludGVydmFsKAorICAgICAgICBuc2Vjc190IG5vdGlmaWNhdGlvbkludGVydmFsTnMpIHsKKyAgICBnZXRJbnN0YW5jZSgpLl9zZXROb3RpZmljYXRpb25JbnRlcnZhbChub3RpZmljYXRpb25JbnRlcnZhbE5zKTsKK30KKwordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCkgeworICAgIHVpbnQ2NF90IGZyYW1lSW5kZXggPSBpbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICBMT0coVkVSQk9TRSkgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X3JlZ2lzdGVyRnJhbWVEYXRhIC0tIGNhbGxlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgPDwgImxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGxpc3RlbmVyLmdldCgpCisgICAgICAgICAgICAgICAgIDw8ICIsIGZyYW1lSW5kZXggPSAiIDw8IHN0ZDo6ZGVjIDw8IGZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisKKyAgICBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPiAmYnVmZmVySWRzID0KKyAgICAgICAgICAgIG1UcmFja2VkQnVmZmVyc01hcFtsaXN0ZW5lcl1bZnJhbWVJbmRleF07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0LmJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKCFpbnB1dC5idWZmZXJzW2ldKSB7CisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X3JlZ2lzdGVyRnJhbWVEYXRhIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiSW5wdXQgYnVmZmVyIGF0IGluZGV4ICIgPDwgaSA8PCAiIGlzIG51bGwuIjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IFRyYWNrZWRCdWZmZXIgJmJ1ZmZlcklkID0KKyAgICAgICAgICAgICAgICAqYnVmZmVySWRzLmVtcGxhY2UobGlzdGVuZXIsIGZyYW1lSW5kZXgsIGksIGlucHV0LmJ1ZmZlcnNbaV0pLgorICAgICAgICAgICAgICAgIGZpcnN0OworCisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGlucHV0LmJ1ZmZlcnNbaV0tPnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KAorICAgICAgICAgICAgICAgIG9uQnVmZmVyRGVzdHJveWVkLAorICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZidWZmZXJJZCkpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfcmVnaXN0ZXJGcmFtZURhdGEgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAicmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoKSBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiKGxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGxpc3RlbmVyLmdldCgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGZyYW1lSW5kZXggPSAiIDw8IHN0ZDo6ZGVjIDw8IGZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgYnVmZmVySW5kZXggPSAiIDw8IGkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIikgPT4gc3RhdHVzID0gIiA8PCBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICB9CisgICAgfQorCisgICAgbURlYXRoTm90aWZpY2F0aW9ucy5lbXBsYWNlKAorICAgICAgICAgICAgbGlzdGVuZXIsCisgICAgICAgICAgICBEZWF0aE5vdGlmaWNhdGlvbnMoCisgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkludGVydmFsTnMubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSkpOworfQorCisvLyBSZW1vdmUgYSBwYWlyIChsaXN0ZW5lciwgZnJhbWVJbmRleCkgZnJvbSBtVHJhY2tlZEJ1ZmZlcnNNYXAgYW5kCisvLyBtRGVhdGhOb3RpZmljYXRpb25zLiBUaGlzIGltcGxpZXMgYWxsIGJ1ZmZlckluZGljZXMgYXJlIHJlbW92ZWQuCisvLworLy8gVGhpcyBpcyBjYWxsZWQgZnJvbSBvbldvcmtEb25lKCkgYW5kIGZsdXNoKCkuCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6X3VucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpIHsKKyAgICB1aW50NjRfdCBmcmFtZUluZGV4ID0gaW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol91bnJlZ2lzdGVyRnJhbWVEYXRhIC0tIGNhbGxlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgPDwgImxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGxpc3RlbmVyLnVuc2FmZV9nZXQoKQorICAgICAgICAgICAgICAgICA8PCAiLCBmcmFtZUluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBmcmFtZUluZGV4CisgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgYXV0byBmaW5kTGlzdGVuZXIgPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZmluZChsaXN0ZW5lcik7CisgICAgaWYgKGZpbmRMaXN0ZW5lciAhPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZW5kKCkpIHsKKyAgICAgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PFRyYWNrZWRCdWZmZXI+PiAmZnJhbWVJbmRleDJCdWZmZXJJZHMKKyAgICAgICAgICAgICAgICA9IGZpbmRMaXN0ZW5lci0+c2Vjb25kOworICAgICAgICBhdXRvIGZpbmRGcmFtZUluZGV4ID0gZnJhbWVJbmRleDJCdWZmZXJJZHMuZmluZChmcmFtZUluZGV4KTsKKyAgICAgICAgaWYgKGZpbmRGcmFtZUluZGV4ICE9IGZyYW1lSW5kZXgyQnVmZmVySWRzLmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPiAmYnVmZmVySWRzID0gZmluZEZyYW1lSW5kZXgtPnNlY29uZDsKKyAgICAgICAgICAgIGZvciAoY29uc3QgVHJhY2tlZEJ1ZmZlciYgYnVmZmVySWQgOiBidWZmZXJJZHMpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGJ1ZmZlcklkLmJ1ZmZlci5sb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBidWZmZXItPnVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25CdWZmZXJEZXN0cm95ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDx2b2lkKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oJmJ1ZmZlcklkKSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol91bnJlZ2lzdGVyRnJhbWVEYXRhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi0tIHVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoKSBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKGxpc3RlbmVyIEAgMHgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpoZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBidWZmZXJJZC5saXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgZnJhbWVJbmRleCA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCBidWZmZXJJZC5mcmFtZUluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGJ1ZmZlckluZGV4ID0gIiA8PCBidWZmZXJJZC5idWZmZXJJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSA9PiBzdGF0dXMgPSAiIDw8IHN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZyYW1lSW5kZXgyQnVmZmVySWRzLmVyYXNlKGZpbmRGcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmIChmcmFtZUluZGV4MkJ1ZmZlcklkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbVRyYWNrZWRCdWZmZXJzTWFwLmVyYXNlKGZpbmRMaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdXRvIGZpbmRMaXN0ZW5lckQgPSBtRGVhdGhOb3RpZmljYXRpb25zLmZpbmQobGlzdGVuZXIpOworICAgIGlmIChmaW5kTGlzdGVuZXJEICE9IG1EZWF0aE5vdGlmaWNhdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgRGVhdGhOb3RpZmljYXRpb25zICZkZWF0aE5vdGlmaWNhdGlvbnMgPSBmaW5kTGlzdGVuZXJELT5zZWNvbmQ7CisgICAgICAgIGF1dG8gZmluZEZyYW1lSW5kZXggPSBkZWF0aE5vdGlmaWNhdGlvbnMuaW5kaWNlcy5maW5kKGZyYW1lSW5kZXgpOworICAgICAgICBpZiAoZmluZEZyYW1lSW5kZXggIT0gZGVhdGhOb3RpZmljYXRpb25zLmluZGljZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gJmJ1ZmZlckluZGljZXMgPSBmaW5kRnJhbWVJbmRleC0+c2Vjb25kOworICAgICAgICAgICAgZGVhdGhOb3RpZmljYXRpb25zLmNvdW50IC09IGJ1ZmZlckluZGljZXMuc2l6ZSgpOworICAgICAgICAgICAgZGVhdGhOb3RpZmljYXRpb25zLmluZGljZXMuZXJhc2UoZmluZEZyYW1lSW5kZXgpOworICAgICAgICB9CisgICAgfQorfQorCisvLyBSZW1vdmUgbGlzdGVuZXIgZnJvbSBtVHJhY2tlZEJ1ZmZlcnNNYXAgYW5kIG1EZWF0aE5vdGlmaWNhdGlvbnMuIFRoaXMgaW1wbGllcworLy8gYWxsIGZyYW1lSW5kaWNlcyBhbmQgYnVmZmVySW5kaWNlcyBhcmUgcmVtb3ZlZC4KKy8vCisvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgY2xlYW5zIHVwIGFsbCBpbnB1dCBidWZmZXJzLCBpLmUuLCB3aGVuCisvLyByZXNldCgpLCByZWxlYXNlKCksIHN0b3AoKSBvciB+Q29tcG9uZW50KCkgaXMgY2FsbGVkLgordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6Ol91bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lcikgeworICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfdW5yZWdpc3RlckZyYW1lRGF0YSAtLSBjYWxsZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBsaXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgIi4iOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisKKyAgICBhdXRvIGZpbmRMaXN0ZW5lciA9IG1UcmFja2VkQnVmZmVyc01hcC5maW5kKGxpc3RlbmVyKTsKKyAgICBpZiAoZmluZExpc3RlbmVyICE9IG1UcmFja2VkQnVmZmVyc01hcC5lbmQoKSkgeworICAgICAgICBzdGQ6Om1hcDx1aW50NjRfdCwgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4+ICZmcmFtZUluZGV4MkJ1ZmZlcklkcyA9CisgICAgICAgICAgICAgICAgZmluZExpc3RlbmVyLT5zZWNvbmQ7CisgICAgICAgIGZvciAoYXV0byBmaW5kRnJhbWVJbmRleCA9IGZyYW1lSW5kZXgyQnVmZmVySWRzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgZmluZEZyYW1lSW5kZXggIT0gZnJhbWVJbmRleDJCdWZmZXJJZHMuZW5kKCk7CisgICAgICAgICAgICAgICAgKytmaW5kRnJhbWVJbmRleCkgeworICAgICAgICAgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4gJmJ1ZmZlcklkcyA9IGZpbmRGcmFtZUluZGV4LT5zZWNvbmQ7CisgICAgICAgICAgICBmb3IgKGNvbnN0IFRyYWNrZWRCdWZmZXImIGJ1ZmZlcklkIDogYnVmZmVySWRzKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBidWZmZXJJZC5idWZmZXIubG9jaygpOworICAgICAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gYnVmZmVyLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQnVmZmVyRGVzdHJveWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZidWZmZXJJZCkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfdW5yZWdpc3RlckZyYW1lRGF0YSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICItLSB1bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIihsaXN0ZW5lciBAIDB4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6aGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYnVmZmVySWQubGlzdGVuZXIudW5zYWZlX2dldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGZyYW1lSW5kZXggPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgYnVmZmVySWQuZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBidWZmZXJJbmRleCA9ICIgPDwgYnVmZmVySWQuYnVmZmVySW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikgPT4gc3RhdHVzID0gIiA8PCBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1UcmFja2VkQnVmZmVyc01hcC5lcmFzZShmaW5kTGlzdGVuZXIpOworICAgIH0KKworICAgIG1EZWF0aE5vdGlmaWNhdGlvbnMuZXJhc2UobGlzdGVuZXIpOworfQorCisvLyBTZXQgbU5vdGlmaWNhdGlvbkludGVydmFsTnMuCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6X3NldE5vdGlmaWNhdGlvbkludGVydmFsKAorICAgICAgICBuc2Vjc190IG5vdGlmaWNhdGlvbkludGVydmFsTnMpIHsKKyAgICBtTm90aWZpY2F0aW9uSW50ZXJ2YWxOcy5zdG9yZSgKKyAgICAgICAgICAgIG5vdGlmaWNhdGlvbkludGVydmFsTnMsCisgICAgICAgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKK30KKworLy8gTW92ZSBhIGJ1ZmZlciBmcm9tIG1UcmFja2VkQnVmZmVyc01hcCB0byBtRGVhdGhOb3RpZmljYXRpb25zLgorLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBhIHJlZ2lzdGVyZWQgQzJCdWZmZXIgb2JqZWN0IGlzIGRlc3Ryb3llZC4KK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjpvbkJ1ZmZlckRlc3Ryb3llZChjb25zdCBDMkJ1ZmZlciogYnVmLCB2b2lkKiBhcmcpIHsKKyAgICBnZXRJbnN0YW5jZSgpLl9vbkJ1ZmZlckRlc3Ryb3llZChidWYsIGFyZyk7Cit9CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjpfb25CdWZmZXJEZXN0cm95ZWQoY29uc3QgQzJCdWZmZXIqIGJ1Ziwgdm9pZCogYXJnKSB7CisgICAgaWYgKCFidWYgfHwgIWFyZykgeworICAgICAgICBMT0coV0FSTklORykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIC0tIGNhbGxlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJudWxsIGFyZ3VtZW50IChzKTogIgorICAgICAgICAgICAgICAgICAgICAgPDwgImJ1ZiBAIDB4IiA8PCBzdGQ6OmhleCA8PCBidWYKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGFyZyBAIDB4IiA8PCBzdGQ6OmhleCA8PCBhcmcKKyAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8ICIuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBUcmFja2VkQnVmZmVyIGlkKCpyZWludGVycHJldF9jYXN0PFRyYWNrZWRCdWZmZXIqPihhcmcpKTsKKyAgICBMT0coVkVSQk9TRSkgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIC0tIGNhbGxlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgPDwgImJ1ZiBAIDB4IiA8PCBzdGQ6OmhleCA8PCBidWYKKyAgICAgICAgICAgICAgICAgPDwgIiwgYXJnIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGFyZworICAgICAgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCAiIC0tICIKKyAgICAgICAgICAgICAgICAgPDwgImxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGlkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKQorICAgICAgICAgICAgICAgICA8PCAiLCBmcmFtZUluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBpZC5mcmFtZUluZGV4CisgICAgICAgICAgICAgICAgIDw8ICIsIGJ1ZmZlckluZGV4ID0gIiA8PCBpZC5idWZmZXJJbmRleAorICAgICAgICAgICAgICAgICA8PCAiLiI7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgYXV0byBmaW5kTGlzdGVuZXIgPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZmluZChpZC5saXN0ZW5lcik7CisgICAgaWYgKGZpbmRMaXN0ZW5lciA9PSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZW5kKCkpIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfb25CdWZmZXJEZXN0cm95ZWQgLS0gIgorICAgICAgICAgICAgICAgICAgIDw8ICJyZWNlaXZlZCBpbnZhbGlkIGxpc3RlbmVyOiAiCisgICAgICAgICAgICAgICAgICAgPDwgImxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGlkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgKGZyYW1lSW5kZXggPSAiIDw8IHN0ZDo6ZGVjIDw8IGlkLmZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBidWZmZXJJbmRleCA9ICIgPDwgaWQuYnVmZmVySW5kZXgKKyAgICAgICAgICAgICAgICAgICA8PCAiKS4iOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PFRyYWNrZWRCdWZmZXI+PiAmZnJhbWVJbmRleDJCdWZmZXJJZHMKKyAgICAgICAgICAgID0gZmluZExpc3RlbmVyLT5zZWNvbmQ7CisgICAgYXV0byBmaW5kRnJhbWVJbmRleCA9IGZyYW1lSW5kZXgyQnVmZmVySWRzLmZpbmQoaWQuZnJhbWVJbmRleCk7CisgICAgaWYgKGZpbmRGcmFtZUluZGV4ID09IGZyYW1lSW5kZXgyQnVmZmVySWRzLmVuZCgpKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIC0tICIKKyAgICAgICAgICAgICAgICAgICA8PCAicmVjZWl2ZWQgaW52YWxpZCBmcmFtZSBpbmRleDogIgorICAgICAgICAgICAgICAgICAgIDw8ICJmcmFtZUluZGV4ID0gIiA8PCBpZC5mcmFtZUluZGV4CisgICAgICAgICAgICAgICAgICAgPDwgIiAobGlzdGVuZXIgQCAweCIgPDwgc3RkOjpoZXggPDwgaWQubGlzdGVuZXIudW5zYWZlX2dldCgpCisgICAgICAgICAgICAgICAgICAgPDwgIiwgYnVmZmVySW5kZXggPSAiIDw8IHN0ZDo6ZGVjIDw8IGlkLmJ1ZmZlckluZGV4CisgICAgICAgICAgICAgICAgICAgPDwgIikuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c2V0PFRyYWNrZWRCdWZmZXI+ICZidWZmZXJJZHMgPSBmaW5kRnJhbWVJbmRleC0+c2Vjb25kOworICAgIGF1dG8gZmluZEJ1ZmZlcklkID0gYnVmZmVySWRzLmZpbmQoaWQpOworICAgIGlmIChmaW5kQnVmZmVySWQgPT0gYnVmZmVySWRzLmVuZCgpKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIC0tICIKKyAgICAgICAgICAgICAgICAgICA8PCAicmVjZWl2ZWQgaW52YWxpZCBidWZmZXIgaW5kZXg6ICIKKyAgICAgICAgICAgICAgICAgICA8PCAiYnVmZmVySW5kZXggPSAiIDw8IGlkLmJ1ZmZlckluZGV4CisgICAgICAgICAgICAgICAgICAgPDwgIiAoZnJhbWVJbmRleCA9ICIgPDwgaWQuZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICAgIDw8ICIsIGxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGlkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKQorICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8ICIpLiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBidWZmZXJJZHMuZXJhc2UoZmluZEJ1ZmZlcklkKTsKKyAgICBpZiAoYnVmZmVySWRzLmVtcHR5KCkpIHsKKyAgICAgICAgZnJhbWVJbmRleDJCdWZmZXJJZHMuZXJhc2UoZmluZEZyYW1lSW5kZXgpOworICAgICAgICBpZiAoZnJhbWVJbmRleDJCdWZmZXJJZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgbVRyYWNrZWRCdWZmZXJzTWFwLmVyYXNlKGZpbmRMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBEZWF0aE5vdGlmaWNhdGlvbnMgJmRlYXRoTm90aWZpY2F0aW9ucyA9IG1EZWF0aE5vdGlmaWNhdGlvbnNbaWQubGlzdGVuZXJdOworICAgIGRlYXRoTm90aWZpY2F0aW9ucy5pbmRpY2VzW2lkLmZyYW1lSW5kZXhdLmVtcGxhY2VfYmFjayhpZC5idWZmZXJJbmRleCk7CisgICAgKytkZWF0aE5vdGlmaWNhdGlvbnMuY291bnQ7CisgICAgbU9uQnVmZmVyRGVzdHJveWVkLm5vdGlmeV9vbmUoKTsKK30KKworLy8gTm90aWZ5IHRoZSBjbGllbnRzIGFib3V0IGJ1ZmZlciBkZXN0cnVjdGlvbnMuCisvLyBSZXR1cm4gZmFsc2UgaWYgYWxsIGRlc3RydWN0aW9ucyBoYXZlIGJlZW4gbm90aWZpZWQuCisvLyBSZXR1cm4gdHJ1ZSBhbmQgc2V0IHRpbWVUb1JldHJ5IHRvIHRoZSB0aW1lIHBvaW50IHRvIHdhaXQgZm9yIGJlZm9yZQorLy8gcmV0cnlpbmcgaWYgc29tZSBkZXN0cnVjdGlvbnMgaGF2ZSBub3QgYmVlbiBub3RpZmllZC4KK2Jvb2wgSW5wdXRCdWZmZXJNYW5hZ2VyOjpwcm9jZXNzTm90aWZpY2F0aW9ucyhuc2Vjc190KiB0aW1lVG9SZXRyeU5zKSB7CisKKyAgICBzdHJ1Y3QgTm90aWZpY2F0aW9uIHsKKyAgICAgICAgc3A8SUNvbXBvbmVudExpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICAgICAgaGlkbF92ZWM8SUNvbXBvbmVudExpc3RlbmVyOjpJbnB1dEJ1ZmZlcj4gaW5wdXRCdWZmZXJzOworICAgICAgICBOb3RpZmljYXRpb24oY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbCwgc2l6ZV90IHMpCisgICAgICAgICAgICAgIDogbGlzdGVuZXIobCksIGlucHV0QnVmZmVycyhzKSB7fQorICAgIH07CisgICAgc3RkOjpsaXN0PE5vdGlmaWNhdGlvbj4gbm90aWZpY2F0aW9uczsKKyAgICBuc2Vjc190IG5vdGlmaWNhdGlvbkludGVydmFsTnMgPQorICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkludGVydmFsTnMubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKworICAgIGJvb2wgcmV0cnkgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgICp0aW1lVG9SZXRyeU5zID0gbm90aWZpY2F0aW9uSW50ZXJ2YWxOczsKKyAgICAgICAgbnNlY3NfdCB0aW1lTm93TnMgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1EZWF0aE5vdGlmaWNhdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBtRGVhdGhOb3RpZmljYXRpb25zLmVuZCgpOyApIHsKKyAgICAgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKCFsaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEZWF0aE5vdGlmaWNhdGlvbnMgJmRlYXRoTm90aWZpY2F0aW9ucyA9IGl0LT5zZWNvbmQ7CisKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZVNpbmNlTGFzdE5vdGlmaWVkTnMgPQorICAgICAgICAgICAgICAgICAgICB0aW1lTm93TnMgLSBkZWF0aE5vdGlmaWNhdGlvbnMubGFzdFNlbnROczsKKyAgICAgICAgICAgIC8vIElmIG5vdCBlbm91Z2ggdGltZSBoYXMgcGFzc2VkIHNpbmNlIHRoZSBsYXN0IGNhbGxiYWNrLCBsZWF2ZSB0aGUKKyAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbnMgZm9yIHRoaXMgbGlzdGVuZXIgdW50b3VjaGVkIGZvciBub3cgYW5kIHJldHJ5CisgICAgICAgICAgICAvLyBsYXRlci4KKyAgICAgICAgICAgIGlmICh0aW1lU2luY2VMYXN0Tm90aWZpZWROcyA8IG5vdGlmaWNhdGlvbkludGVydmFsTnMpIHsKKyAgICAgICAgICAgICAgICByZXRyeSA9IHRydWU7CisgICAgICAgICAgICAgICAgKnRpbWVUb1JldHJ5TnMgPSBzdGQ6Om1pbigqdGltZVRvUmV0cnlOcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkludGVydmFsTnMgLSB0aW1lU2luY2VMYXN0Tm90aWZpZWROcyk7CisgICAgICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6OnByb2Nlc3NOb3RpZmljYXRpb25zIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIk5vdGlmaWNhdGlvbnMgZm9yIGxpc3RlbmVyIEAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpoZXggPDwgbGlzdGVuZXIuZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB3aWxsIGJlIHBvc3Rwb25lZC4iOworICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIGVub3VnaCB0aW1lIGhhcyBwYXNzZWQgc2luY2UgdGhlIGxhc3Qgbm90aWZpY2F0aW9uIHRvIHRoaXMKKyAgICAgICAgICAgIC8vIGxpc3RlbmVyIGJ1dCB0aGVyZSBhcmUgY3VycmVudGx5IG5vIHBlbmRpbmcgbm90aWZpY2F0aW9ucywgdGhlCisgICAgICAgICAgICAvLyBsaXN0ZW5lciBjYW4gYmUgcmVtb3ZlZCBmcm9tIG1EZWF0aE5vdGlmaWNhdGlvbnMtLS10aGVyZSBpcyBubworICAgICAgICAgICAgLy8gbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IG5vdGlmaWNhdGlvbiB0aW1lIGFueW1vcmUuCisgICAgICAgICAgICBpZiAoZGVhdGhOb3RpZmljYXRpb25zLmNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBpdCA9IG1EZWF0aE5vdGlmaWNhdGlvbnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGFyZ3VtZW50IGZvciB0aGUgY2FsbGJhY2suCisgICAgICAgICAgICBub3RpZmljYXRpb25zLmVtcGxhY2VfYmFjayhsaXN0ZW5lciwgZGVhdGhOb3RpZmljYXRpb25zLmNvdW50KTsKKyAgICAgICAgICAgIGhpZGxfdmVjPElDb21wb25lbnRMaXN0ZW5lcjo6SW5wdXRCdWZmZXI+ICZpbnB1dEJ1ZmZlcnMgPQorICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25zLmJhY2soKS5pbnB1dEJ1ZmZlcnM7CisgICAgICAgICAgICBzaXplX3QgaSA9IDA7CisgICAgICAgICAgICBmb3IgKHN0ZDo6cGFpcjxjb25zdCB1aW50NjRfdCwgc3RkOjp2ZWN0b3I8c2l6ZV90Pj4mIHAgOgorICAgICAgICAgICAgICAgICAgICBkZWF0aE5vdGlmaWNhdGlvbnMuaW5kaWNlcykgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXggPSBwLmZpcnN0OworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gJmJ1ZmZlckluZGljZXMgPSBwLnNlY29uZDsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNpemVfdCYgYnVmZmVySW5kZXggOiBidWZmZXJJbmRpY2VzKSB7CisgICAgICAgICAgICAgICAgICAgIElDb21wb25lbnRMaXN0ZW5lcjo6SW5wdXRCdWZmZXIgJmlucHV0QnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBpbnB1dEJ1ZmZlcnNbaSsrXTsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuYXJyYXlJbmRleCA9IGJ1ZmZlckluZGV4OworICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5mcmFtZUluZGV4ID0gZnJhbWVJbmRleDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENsZWFyIGRlYXRoTm90aWZpY2F0aW9ucyBmb3IgdGhpcyBsaXN0ZW5lciBhbmQgc2V0IHJldHJ5IHRvIHRydWUKKyAgICAgICAgICAgIC8vIHNvIHByb2Nlc3NOb3RpZmljYXRpb25zIHdpbGwgYmUgY2FsbGVkIGFnYWluLiBUaGlzIHdpbGwKKyAgICAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGF0IGEgbGlzdGVuZXIgd2l0aCBubyBwZW5kaW5nIG5vdGlmaWNhdGlvbnMgd2lsbAorICAgICAgICAgICAgLy8gZXZlbnR1YWxseSBiZSByZW1vdmVkIGZyb20gbURlYXRoTm90aWZpY2F0aW9ucyBhZnRlcgorICAgICAgICAgICAgLy8gbU5vdGlmaWNhdGlvbkludGVydmFsTnMgbmFub3NlY29uZHMgaGFzIHBhc3NlZC4KKyAgICAgICAgICAgIHJldHJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIGRlYXRoTm90aWZpY2F0aW9ucy5pbmRpY2VzLmNsZWFyKCk7CisgICAgICAgICAgICBkZWF0aE5vdGlmaWNhdGlvbnMuY291bnQgPSAwOworICAgICAgICAgICAgZGVhdGhOb3RpZmljYXRpb25zLmxhc3RTZW50TnMgPSB0aW1lTm93TnM7CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2FsbCBvbklucHV0QnVmZmVyc1JlbGVhc2VkKCkgb3V0c2lkZSB0aGUgbG9jayB0byBhdm9pZCBkZWFkbG9jay4KKyAgICBmb3IgKGNvbnN0IE5vdGlmaWNhdGlvbiYgbm90aWZpY2F0aW9uIDogbm90aWZpY2F0aW9ucykgeworICAgICAgICBpZiAoIW5vdGlmaWNhdGlvbi5saXN0ZW5lci0+b25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCgKKyAgICAgICAgICAgICAgICBub3RpZmljYXRpb24uaW5wdXRCdWZmZXJzKS5pc09rKCkpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgbWF5IHRyaWdnZXIgaWYgdGhlIGNsaWVudCBoYXMgZGllZC4KKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6cHJvY2Vzc05vdGlmaWNhdGlvbnMgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiZmFpbGVkIHRvIHNlbmQgZGVhdGggbm90aWZpY2F0aW9ucyB0byAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbm90aWZpY2F0aW9uLmxpc3RlbmVyLmdldCgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8ICIuIjsKKyAgICAgICAgfSBlbHNlIHsKKyNpZiBMT0dfTkRFQlVHID09IDAKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGlucHV0QnVmZmVyTG9nOworICAgICAgICAgICAgZm9yIChjb25zdCBJQ29tcG9uZW50TGlzdGVuZXI6OklucHV0QnVmZmVyJiBpbnB1dEJ1ZmZlciA6CisgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5pbnB1dEJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlckxvZyA8PCAiICgiIDw8IGlucHV0QnVmZmVyLmZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IGlucHV0QnVmZmVyLmFycmF5SW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6cHJvY2Vzc05vdGlmaWNhdGlvbnMgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJkZWF0aCBub3RpZmljYXRpb25zIHNlbnQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBub3RpZmljYXRpb24ubGlzdGVuZXIuZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpkZWMKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHdpdGggdGhlc2UgKGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSBwYWlyczoiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5wdXRCdWZmZXJMb2cuc3RyKCk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKyNpZiBMT0dfTkRFQlVHID09IDAKKyAgICBpZiAocmV0cnkpIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6OnByb2Nlc3NOb3RpZmljYXRpb25zIC0tICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJ3aWxsIHJldHJ5IGFnYWluIGluICIgPDwgKnRpbWVUb1JldHJ5TnMgPDwgIm5zLiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6OnByb2Nlc3NOb3RpZmljYXRpb25zIC0tICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJubyBwZW5kaW5nIGRlYXRoIG5vdGlmaWNhdGlvbnMuIjsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gcmV0cnk7Cit9CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjptYWluKCkgeworICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyIG1haW4gLS0gc3RhcnRlZC4iOworICAgIG5zZWNzX3QgdGltZVRvUmV0cnlOczsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgd2hpbGUgKG1EZWF0aE5vdGlmaWNhdGlvbnMuZW1wdHkoKSkgeworICAgICAgICAgICAgbU9uQnVmZmVyRGVzdHJveWVkLndhaXQobG9jayk7CisgICAgICAgIH0KKyAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgd2hpbGUgKHByb2Nlc3NOb3RpZmljYXRpb25zKCZ0aW1lVG9SZXRyeU5zKSkgeworICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHModGltZVRvUmV0cnlOcykpOworICAgICAgICB9CisgICAgfQorfQorCitJbnB1dEJ1ZmZlck1hbmFnZXI6OklucHV0QnVmZmVyTWFuYWdlcigpCisgICAgICA6IG1NYWluVGhyZWFkeyZJbnB1dEJ1ZmZlck1hbmFnZXI6Om1haW4sIHRoaXN9IHsKK30KKworSW5wdXRCdWZmZXJNYW5hZ2VyJiBJbnB1dEJ1ZmZlck1hbmFnZXI6OmdldEluc3RhbmNlKCkgeworICAgIHN0YXRpYyBJbnB1dEJ1ZmZlck1hbmFnZXIgaW5zdGFuY2V7fTsKKyAgICByZXR1cm4gaW5zdGFuY2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRTdXJmYWNlLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9JbnB1dFN1cmZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YzQ0YzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRTdXJmYWNlLmNwcApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzItSW5wdXRTdXJmYWNlIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKKworLy8gRGVyaXZlZCBjbGFzcyBvZiBDMkludGVyZmFjZUhlbHBlcgorY2xhc3MgSW5wdXRTdXJmYWNlOjpJbnRlcmZhY2UgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGVyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Fb3MsIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfRU9TKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJJbnB1dFN1cmZhY2VFb3NUdW5pbmcoZmFsc2UpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUVvcywgdmFsdWUpLm9uZU9mKHt0cnVlLCBmYWxzZX0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihFb3NTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgRW9zU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMklucHV0U3VyZmFjZUVvc1R1bmluZz4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICByZXR1cm4gbWUuRihtZS52LnZhbHVlKS52YWxpZGF0ZVBvc3NpYmxlKG1lLnYudmFsdWUpOworICAgIH0KKworICAgIGJvb2wgZW9zKCkgY29uc3QgeyByZXR1cm4gbUVvcy0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJJbnB1dFN1cmZhY2VFb3NUdW5pbmc+IG1Fb3M7Cit9OworCisvLyBEZXJpdmVkIGNsYXNzIG9mIENvbmZpZ3VyYWJsZUMySW50ZgorY2xhc3MgSW5wdXRTdXJmYWNlOjpDb25maWd1cmFibGVJbnRmIDogcHVibGljIENvbmZpZ3VyYWJsZUMySW50ZiB7CitwdWJsaWM6CisgICAgQ29uZmlndXJhYmxlSW50ZigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U6OkludGVyZmFjZT4gJmludGYsCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiAmc291cmNlKQorICAgICAgICA6IENvbmZpZ3VyYWJsZUMySW50ZigiaW5wdXQtc3VyZmFjZSIsIDApLAorICAgICAgICAgIG1JbnRmKGludGYpLAorICAgICAgICAgIG1Tb3VyY2Uoc291cmNlKSB7CisgICAgfQorCisgICAgdmlydHVhbCB+Q29uZmlndXJhYmxlSW50ZigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5xdWVyeSh7fSwgaW5kaWNlcywgbWF5QmxvY2ssIHBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzCisgICAgICAgICAgICApIG92ZXJyaWRlIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyhwYXJhbXMsIG1heUJsb2NrLCBmYWlsdXJlcyk7CisgICAgICAgIGlmIChtSW50Zi0+ZW9zKCkpIHsKKyAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IHNvdXJjZSA9IG1Tb3VyY2UucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxscHRyIHx8IHNvdXJjZS0+c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogcHV0IHNvbWV0aGluZyBpbiB8ZmFpbHVyZXN8CisgICAgICAgICAgICAgICAgZXJyID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVE9ETzogcmVzZXQgZW9zPworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUludGYtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKHBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGZpZWxkcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhmaWVsZHMsIG1heUJsb2NrKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZTo6SW50ZXJmYWNlPiBtSW50ZjsKKyAgICB3cDxHcmFwaGljQnVmZmVyU291cmNlPiBtU291cmNlOworfTsKKworUmV0dXJuPHNwPElucHV0U3VyZmFjZTo6SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+IElucHV0U3VyZmFjZTo6Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgeworICAgIHJldHVybiBtUHJvZHVjZXI7Cit9CisKK1JldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gSW5wdXRTdXJmYWNlOjpnZXRDb25maWd1cmFibGUoKSB7CisgICAgcmV0dXJuIG1Db25maWd1cmFibGU7Cit9CisKK1JldHVybjx2b2lkPiBJbnB1dFN1cmZhY2U6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rLAorICAgICAgICBjb25uZWN0X2NiIF9oaWRsX2NiKSB7CisgICAgU3RhdHVzIHN0YXR1czsKKyAgICBzcDxJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIGlmICghc2luaykgeworICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkJBRF9WQUxVRSwgbnVsbHB0cik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gY29tcCA9IENvbXBvbmVudDo6ZmluZExvY2FsQ29tcG9uZW50KHNpbmspOworICAgIGlmIChjb21wKSB7CisgICAgICAgIGNvbm5lY3Rpb24gPSBuZXcgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbihtU291cmNlLCBjb21wLCBtU3RvcmUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbm5lY3Rpb24gPSBuZXcgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbihtU291cmNlLCBzaW5rLCBtU3RvcmUpOworICAgIH0KKyAgICBpZiAoIWNvbm5lY3Rpb24tPmluaXQoKSkgeworICAgICAgICBjb25uZWN0aW9uID0gbnVsbHB0cjsKKyAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICB9CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb25uZWN0aW9uKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCisvLyBEZXJpdmVkIG1ldGhvZHMgZnJvbSBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyCisKKy8vIENvbnN0cnVjdG9yIGlzIGV4Y2x1c2l2ZSB0byBDb21wb25lbnRTdG9yZS4KK0lucHV0U3VyZmFjZTo6SW5wdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiByZWZsZWN0b3IsCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciwKKyAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSkKKyAgICAgIDogbVN0b3Jle3N0b3JlfSwKKyAgICAgICAgbVByb2R1Y2Vye3Byb2R1Y2VyfSwKKyAgICAgICAgbVNvdXJjZXtzb3VyY2V9LAorICAgICAgICBtSW50ZntzdGQ6Om1ha2Vfc2hhcmVkPEludGVyZmFjZT4ocmVmbGVjdG9yKX0sCisgICAgICAgIG1Db25maWd1cmFibGV7bmV3IENhY2hlZENvbmZpZ3VyYWJsZSgKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPENvbmZpZ3VyYWJsZUludGY+KAorICAgICAgICAgICAgICAgICAgICBtSW50Ziwgc291cmNlKSl9IHsKKworICAgIG1Db25maWd1cmFibGUtPmluaXQoc3RvcmUuZ2V0KCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk5MzJlZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmNwcApAQCAtMCwwICsxLDUyOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzItSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8YXRvbWljPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbXBvbmVudFdyYXBwZXIuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxDMi5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPEMyV29yay5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCitjb25zdGV4cHIgaW50MzJfdCBrQnVmZmVyQ291bnQgPSAxNjsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworY2xhc3MgQnVmZmVyMkQgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEJ1ZmZlcjJEKEMyQ29uc3RHcmFwaGljQmxvY2sgYmxvY2spIDogQzJCdWZmZXIoeyBibG9jayB9KSB7CisgICAgfQorfTsKKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCisvLyBEZXJpdmVkIGNsYXNzIG9mIENvbXBvbmVudFdyYXBwZXIgZm9yIHVzZSB3aXRoCisvLyBHcmFwaGljQnVmZmVyU291cmNlOjpjb25maWd1cmUoKS4KKy8vCitzdHJ1Y3QgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6SW1wbCA6IHB1YmxpYyBDb21wb25lbnRXcmFwcGVyIHsKKworICAgIEltcGwoY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4mIGxvY2FsQ29tcCkKKyAgICAgICAgICA6IG1Tb3VyY2V7c291cmNlfSwgbUxvY2FsQ29tcHtsb2NhbENvbXB9LCBtU2lua3t9LCBtRnJhbWVJbmRleHswfSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZiA9IGxvY2FsQ29tcC0+aW50ZigpOworICAgICAgICBtU2lua05hbWUgPSBpbnRmID8gaW50Zi0+Z2V0TmFtZSgpIDogIiI7CisgICAgfQorCisgICAgSW1wbChjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICAgY29uc3Qgc3A8SUlucHV0U2luaz4mIHNpbmspCisgICAgICAgICAgOiBtU291cmNle3NvdXJjZX0sIG1Mb2NhbENvbXB7fSwgbVNpbmt7c2lua30sIG1GcmFtZUluZGV4ezB9IHsKKyAgICAgICAgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiB0cmFuc1Jlc3VsdCA9IHNpbmstPmdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiUmVtb3RlIHNpbmsgaXMgZGVhZC4iOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1TaW5rQ29uZmlndXJhYmxlID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxJQ29uZmlndXJhYmxlPj4odHJhbnNSZXN1bHQpOworICAgICAgICBpZiAoIW1TaW5rQ29uZmlndXJhYmxlKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJSZW1vdGUgc2luayBpcyBub3QgY29uZmlndXJhYmxlLiI7CisgICAgICAgICAgICBtU2lua05hbWUgPSAiIjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGhpZGxfc3RyaW5nIG5hbWU7CisgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1TaW5rQ29uZmlndXJhYmxlLT5nZXROYW1lKAorICAgICAgICAgICAgICAgIFsmbmFtZV0oY29uc3QgaGlkbF9zdHJpbmcmIG4pIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG47CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJSZW1vdGUgc2luaydzIGNvbmZpZ3VyYWJsZSBpcyBkZWFkLiI7CisgICAgICAgICAgICBtU2lua05hbWUgPSAiIjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtU2lua05hbWUgPSBuYW1lLmNfc3RyKCk7CisgICAgfQorCisgICAgdmlydHVhbCB+SW1wbCgpIHsKKyAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICBtU291cmNlLT5yZWxlYXNlKCk7CisgICAgfQorCisgICAgYm9vbCBpbml0KCkgeworICAgICAgICBpZiAobVNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+aW5pdENoZWNrKCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiSW1wbDo6aW5pdCAtLSBHcmFwaGljQnVmZmVyU291cmNlIGluaXQgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInN0YXR1cyA9ICIgPDwgZXJyIDw8ICIuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IHJlYWQgc2V0dGluZ3MgcHJvcGVybHkgZnJvbSB0aGUgaW50ZXJmYWNlCisgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCBpbnB1dFNpemU7CisgICAgICAgIEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0IHVzYWdlOworICAgICAgICBjMl9zdGF0dXNfdCBjMlN0YXR1cyA9IHF1ZXJ5RnJvbVNpbmsoeyAmaW5wdXRTaXplLCAmdXNhZ2UgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgICAgIGlmIChjMlN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJJbXBsOjppbml0IC0tIGNhbm5vdCBxdWVyeSBpbmZvcm1hdGlvbiBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGNvbXBvbmVudCBpbnRlcmZhY2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAic3RhdHVzID0gIiA8PCBhc1N0cmluZyhjMlN0YXR1cykgPDwgIi4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogcHJvcGVyIGNvbG9yIGFzcGVjdCAmIGRhdGFzcGFjZQorICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UgPSBIQUxfREFUQVNQQUNFX0JUNzA5OworCisgICAgICAgIC8vIFRPRE86IHVzZSB0aGUgdXNhZ2UgcmVhZCBmcm9tIGludGYKKyAgICAgICAgLy8gdWludDMyX3QgZ3JhbGxvY1VzYWdlID0KKyAgICAgICAgLy8gICAgICAgICBDMkFuZHJvaWRNZW1vcnlVc2FnZShDMk1lbW9yeVVzYWdlKHVzYWdlLnZhbHVlKSkuCisgICAgICAgIC8vICAgICAgICAgYXNHcmFsbG9jVXNhZ2UoKTsKKworICAgICAgICB1aW50MzJfdCBncmFsbG9jVXNhZ2UgPQorICAgICAgICAgICAgICAgIG1TaW5rTmFtZS5jb21wYXJlKDAsIDExLCAiYzIuYW5kcm9pZC4iKSA9PSAwID8KKyAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gOgorICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUjsKKworICAgICAgICBlcnIgPSBtU291cmNlLT5jb25maWd1cmUoCisgICAgICAgICAgICAgICAgdGhpcywgZGF0YVNwYWNlLCBrQnVmZmVyQ291bnQsCisgICAgICAgICAgICAgICAgaW5wdXRTaXplLndpZHRoLCBpbnB1dFNpemUuaGVpZ2h0LAorICAgICAgICAgICAgICAgIGdyYWxsb2NVc2FnZSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiSW1wbDo6aW5pdCAtLSBHQlMgY29uZmlndXJlIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJzdGF0dXMgPSAiIDw8IGVyciA8PCAiLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwga0J1ZmZlckNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGlmICghbVNvdXJjZS0+b25JbnB1dEJ1ZmZlckFkZGVkKGkpLmlzT2soKSkgeworICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiSW1wbDo6aW5pdDogZmFpbGVkIHRvIHBvcHVsYXRlIEdCUyBzbG90cy4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW1Tb3VyY2UtPnN0YXJ0KCkuaXNPaygpKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkltcGw6OmluaXQgLS0gR0JTIGZhaWxlZCB0byBzdGFydC4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG1BbGxvY2F0b3JNdXRleC5sb2NrKCk7CisgICAgICAgIGMyX3N0YXR1c190IGMyZXJyID0gR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpLT5mZXRjaEFsbG9jYXRvcigKKyAgICAgICAgICAgICAgICBDMkFsbG9jYXRvclN0b3JlOjpQTEFURk9STV9TVEFSVCArIDEsICAvLyBHUkFMTE9DCisgICAgICAgICAgICAgICAgJm1BbGxvY2F0b3IpOworICAgICAgICBtQWxsb2NhdG9yTXV0ZXgudW5sb2NrKCk7CisgICAgICAgIGlmIChjMmVyciAhPSBPSykgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJJbXBsOjppbml0IC0tIGZhaWxlZCB0byBmZXRjaCBncmFsbG9jIGFsbG9jYXRvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJzdGF0dXMgPSAiIDw8IGFzU3RyaW5nKGMyZXJyKSA8PCAiLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gRnJvbSBDb21wb25lbnRXcmFwcGVyCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdWJtaXRCdWZmZXIoCisgICAgICAgICAgICBpbnQzMl90IGJ1ZmZlcklkLAorICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZmZlciwKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLAorICAgICAgICAgICAgaW50IGZlbmNlRmQpIG92ZXJyaWRlIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJJbXBsOjpzdWJtaXRCdWZmZXIgLS0gYnVmZmVySWQgPSAiIDw8IGJ1ZmZlcklkIDw8ICIuIjsKKyAgICAgICAgLy8gVE9ETzogVXNlIGZkIHRvIGNvbnN0cnVjdCBmZW5jZQorICAgICAgICAodm9pZClmZW5jZUZkOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgQzJIYW5kbGUqIGhhbmRsZSA9IFdyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKAorICAgICAgICAgICAgICAgIGJ1ZmZlci0+aGFuZGxlLAorICAgICAgICAgICAgICAgIGJ1ZmZlci0+d2lkdGgsIGJ1ZmZlci0+aGVpZ2h0LAorICAgICAgICAgICAgICAgIGJ1ZmZlci0+Zm9ybWF0LCBidWZmZXItPnVzYWdlLCBidWZmZXItPnN0cmlkZSk7CisgICAgICAgIG1BbGxvY2F0b3JNdXRleC5sb2NrKCk7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oaGFuZGxlLCAmYWxsb2MpOworICAgICAgICBtQWxsb2NhdG9yTXV0ZXgudW5sb2NrKCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2sgPQorICAgICAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jKTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKG5ldyBDMldvcmspOworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXguZmV0Y2hfYWRkKAorICAgICAgICAgICAgICAgIDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJCdWZmZXIoCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICBuZXcgQnVmZmVyMkQoYmxvY2stPnNoYXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCkpLCA6OkMyRmVuY2UoKSkpLAorICAgICAgICAgICAgICAgIFtidWZmZXJJZCwgc291cmNlID0gbVNvdXJjZV0oQzJCdWZmZXIqIHB0cikgeworICAgICAgICAgICAgICAgICAgICBkZWxldGUgcHRyOworICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClzb3VyY2UtPm9uSW5wdXRCdWZmZXJFbXB0aWVkKGJ1ZmZlcklkLCAtMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5wdXNoX2JhY2soYzJCdWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIGVyciA9IHF1ZXVlVG9TaW5rKCZpdGVtcyk7CisgICAgICAgIHJldHVybiAoZXJyID09IEMyX09LKSA/IE9LIDogVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1Ym1pdEVvcyhpbnQzMl90IGJ1ZmZlcklkKSBvdmVycmlkZSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiSW1wbDo6c3VibWl0RW9zIC0tIGJ1ZmZlcklkID0gIiA8PCBidWZmZXJJZCA8PCAiLiI7CisgICAgICAgICh2b2lkKWJ1ZmZlcklkOworCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmsobmV3IEMyV29yayk7CisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KTA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IG1GcmFtZUluZGV4LmZldGNoX2FkZCgKKyAgICAgICAgICAgICAgICAxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHF1ZXVlVG9TaW5rKCZpdGVtcyk7CisgICAgICAgIHJldHVybiAoZXJyID09IEMyX09LKSA/IE9LIDogVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hEYXRhU3BhY2VDaGFuZ2VkKAorICAgICAgICAgICAgaW50MzJfdCBkYXRhU3BhY2UsIGludDMyX3QgYXNwZWN0cywgaW50MzJfdCBwaXhlbEZvcm1hdCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUT0RPCisgICAgICAgICh2b2lkKWRhdGFTcGFjZTsKKyAgICAgICAgKHZvaWQpYXNwZWN0czsKKyAgICAgICAgKHZvaWQpcGl4ZWxGb3JtYXQ7CisgICAgfQorCisgICAgLy8gQ29uZmlndXJhYmxlIGludGVyZmFjZSBmb3IgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6SW1wbC4KKyAgICAvLworICAgIC8vIFRoaXMgY2xhc3MgaXMgZGVjbGFyZWQgYXMgYW4gaW5uZXIgY2xhc3Mgc28gdGhhdCBpdCB3aWxsIGhhdmUgYWNjZXNzIHRvCisgICAgLy8gYWxsIEltcGwncyBtZW1iZXJzLgorICAgIHN0cnVjdCBDb25maWd1cmFibGVJbnRmIDogcHVibGljIENvbmZpZ3VyYWJsZUMySW50ZiB7CisgICAgICAgIHNwPEltcGw+IG1Db25uZWN0aW9uOworICAgICAgICBDb25maWd1cmFibGVJbnRmKGNvbnN0IHNwPEltcGw+JiBjb25uZWN0aW9uKQorICAgICAgICAgICAgICA6IENvbmZpZ3VyYWJsZUMySW50ZnsiaW5wdXQtc3VyZmFjZS1jb25uZWN0aW9uIiwgMH0sCisgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb257Y29ubmVjdGlvbn0ge30KKyAgICAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzCisgICAgICAgICAgICAgICAgKSBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywKKyAgICAgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZTsKKyAgICB9OworCitwcml2YXRlOgorICAgIGMyX3N0YXR1c190IHF1ZXJ5RnJvbVNpbmsoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIHsKKyAgICAgICAgaWYgKG1Mb2NhbENvbXApIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZiA9IG1Mb2NhbENvbXAtPmludGYoKTsKKyAgICAgICAgICAgIGlmIChpbnRmKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGludGYtPnF1ZXJ5X3ZiKHN0YWNrUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcFBhcmFtcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5RnJvbVNpbmsgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImNvbXBvbmVudCBkb2VzIG5vdCBoYXZlIGFuIGludGVyZmFjZS4iOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBDSEVDSyhtU2luaykgPDwgIi0tIHF1ZXJ5RnJvbVNpbmsgIgorICAgICAgICAgICAgICAgICAgICAgPDwgIi0tIGNvbm5lY3Rpb24gaGFzIG5vIHNpbmsuIjsKKyAgICAgICAgQ0hFQ0sobVNpbmtDb25maWd1cmFibGUpIDw8ICItLSBxdWVyeUZyb21TaW5rICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICItLSBzaW5rIGhhcyBubyBjb25maWd1cmFibGUuIjsKKworICAgICAgICBoaWRsX3ZlYzxQYXJhbUluZGV4PiBpbmRpY2VzKAorICAgICAgICAgICAgICAgIHN0YWNrUGFyYW1zLnNpemUoKSArIGhlYXBQYXJhbUluZGljZXMuc2l6ZSgpKTsKKyAgICAgICAgc2l6ZV90IG51bUluZGljZXMgPSAwOworICAgICAgICBmb3IgKEMyUGFyYW0qIGNvbnN0JiBzdGFja1BhcmFtIDogc3RhY2tQYXJhbXMpIHsKKyAgICAgICAgICAgIGlmICghc3RhY2tQYXJhbSkgeworICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXJ5RnJvbVNpbmsgLS0gbnVsbCBzdGFjayBwYXJhbSBlbmNvdW50ZXJlZC4iOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kaWNlc1tudW1JbmRpY2VzKytdID0gc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4oc3RhY2tQYXJhbS0+aW5kZXgoKSk7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IG51bVN0YWNrSW5kaWNlcyA9IG51bUluZGljZXM7CisgICAgICAgIGZvciAoY29uc3QgQzJQYXJhbTo6SW5kZXgmIGluZGV4IDogaGVhcFBhcmFtSW5kaWNlcykgeworICAgICAgICAgICAgaW5kaWNlc1tudW1JbmRpY2VzKytdID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGluZGV4KSk7CisgICAgICAgIH0KKyAgICAgICAgaW5kaWNlcy5yZXNpemUobnVtSW5kaWNlcyk7CisgICAgICAgIGlmIChoZWFwUGFyYW1zKSB7CisgICAgICAgICAgICBoZWFwUGFyYW1zLT5yZXNlcnZlKGhlYXBQYXJhbXMtPnNpemUoKSArIG51bUluZGljZXMpOworICAgICAgICB9CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbVNpbmtDb25maWd1cmFibGUtPnF1ZXJ5KAorICAgICAgICAgICAgICAgIGluZGljZXMsCisgICAgICAgICAgICAgICAgbWF5QmxvY2sgPT0gQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmbnVtU3RhY2tJbmRpY2VzLCAmc3RhY2tQYXJhbXMsIGhlYXBQYXJhbXNdKAorICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsIGNvbnN0IFBhcmFtcyYgcCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0sgJiYgc3RhdHVzICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnlGcm9tU2luayAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAic3RhdHVzID0gIiA8PCBhc1N0cmluZyhzdGF0dXMpIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1Qb2ludGVyczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtUG9pbnRlcnMsIHApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeUZyb21TaW5rIC0tIGVycm9yIHdoaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInBhcnNpbmcgcGFyYW1zLiI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBwYXJhbVBvaW50ZXJzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gcGFyYW1Qb2ludGVycy5lbmQoKTsgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtKiBwYXJhbVBvaW50ZXIgPSAqaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtU3RhY2tJbmRpY2VzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tbnVtU3RhY2tJbmRpY2VzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1Qb2ludGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXJ5RnJvbVNpbmsgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJudWxsIHN0YWNrIHBhcmFtLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IHN0YWNrUGFyYW1zLnNpemUoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0YWNrUGFyYW1zW2ldOyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhpIDwgc3RhY2tQYXJhbXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tQYXJhbXNbaV0tPmluZGV4KCkgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtUG9pbnRlci0+aW5kZXgoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeUZyb21TaW5rIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW0gc2tpcHBlZCAoaW5kZXggPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhY2tQYXJhbXNbaV0tPmluZGV4KCkgPDwgIikuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tQYXJhbXNbaSsrXS0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFja1BhcmFtc1tpKytdLT51cGRhdGVGcm9tKCpwYXJhbVBvaW50ZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXJ5RnJvbVNpbmsgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbSB1cGRhdGUgZmFpbGVkIChpbmRleCA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBwYXJhbVBvaW50ZXItPmluZGV4KCkgPDwgIikuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1Qb2ludGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXJ5RnJvbVNpbmsgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJudWxsIGhlYXAgcGFyYW0uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGVhcFBhcmFtcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXJ5RnJvbVNpbmsgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvbyBtYW55IHN0YWNrIHBhcmFtcy4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcFBhcmFtcy0+ZW1wbGFjZV9iYWNrKEMyUGFyYW06OkNvcHkoKnBhcmFtUG9pbnRlcikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnlGcm9tU2luayAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBxdWV1ZVRvU2luayhzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBpdGVtcykgeworICAgICAgICBpZiAobUxvY2FsQ29tcCkgeworICAgICAgICAgICAgcmV0dXJuIG1Mb2NhbENvbXAtPnF1ZXVlX25iKGl0ZW1zKTsKKyAgICAgICAgfQorCisgICAgICAgIENIRUNLKG1TaW5rKSA8PCAiLS0gcXVldWVUb1NpbmsgIgorICAgICAgICAgICAgICAgICAgICAgPDwgIi0tIGNvbm5lY3Rpb24gaGFzIG5vIHNpbmsuIjsKKworICAgICAgICBXb3JrQnVuZGxlIHdvcmtCdW5kbGU7CisgICAgICAgIGlmICghb2JqY3B5KCZ3b3JrQnVuZGxlLCAqaXRlbXMsIG51bGxwdHIpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJxdWV1ZVRvU2luayAtLSBiYWQgaW5wdXQuIjsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBtU2luay0+cXVldWUod29ya0J1bmRsZSk7CisgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJxdWV1ZVRvU2luayAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWV1ZVRvU2luayAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGFzU3RyaW5nKHN0YXR1cyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBtU291cmNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gbUxvY2FsQ29tcDsKKyAgICBzcDxJSW5wdXRTaW5rPiBtU2luazsKKyAgICBzcDxJQ29uZmlndXJhYmxlPiBtU2lua0NvbmZpZ3VyYWJsZTsKKyAgICBzdGQ6OnN0cmluZyBtU2lua05hbWU7CisKKyAgICAvLyBOZWVkZWQgZm9yIENvbXBvbmVudFdyYXBwZXIgaW1wbGVtZW50YXRpb24KKyAgICBzdGQ6Om11dGV4IG1BbGxvY2F0b3JNdXRleDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgICAgc3RkOjphdG9taWNfdWludDY0X3QgbUZyYW1lSW5kZXg7CisKK307CisKK0lucHV0U3VyZmFjZUNvbm5lY3Rpb246OklucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4mIGNvbXAsCisgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUpCisgICAgICA6IG1JbXBse25ldyBJbXBsKHNvdXJjZSwgY29tcCl9LAorICAgICAgICBtQ29uZmlndXJhYmxle25ldyBDYWNoZWRDb25maWd1cmFibGUoCisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEltcGw6OkNvbmZpZ3VyYWJsZUludGY+KG1JbXBsKSl9IHsKKyAgICBtQ29uZmlndXJhYmxlLT5pbml0KHN0b3JlLmdldCgpKTsKK30KKworSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbigKKyAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgY29uc3Qgc3A8SUlucHV0U2luaz4mIHNpbmssCisgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUpCisgICAgICA6IG1JbXBse25ldyBJbXBsKHNvdXJjZSwgc2luayl9LAorICAgICAgICBtQ29uZmlndXJhYmxle25ldyBDYWNoZWRDb25maWd1cmFibGUoCisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEltcGw6OkNvbmZpZ3VyYWJsZUludGY+KG1JbXBsKSl9IHsKKyAgICBtQ29uZmlndXJhYmxlLT5pbml0KHN0b3JlLmdldCgpKTsKK30KKworUmV0dXJuPFN0YXR1cz4gSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6ZGlzY29ubmVjdCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW1wbE11dGV4KTsKKyAgICBtSW1wbCA9IG51bGxwdHI7CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKK0lucHV0U3VyZmFjZUNvbm5lY3Rpb246On5JbnB1dFN1cmZhY2VDb25uZWN0aW9uKCkgeworICAgIG1JbXBsID0gbnVsbHB0cjsKK30KKworYm9vbCBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjppbml0KCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbXBsTXV0ZXgpOworICAgIHJldHVybiBtSW1wbC0+aW5pdCgpOworfQorCitSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IElucHV0U3VyZmFjZUNvbm5lY3Rpb246OmdldENvbmZpZ3VyYWJsZSgpIHsKKyAgICByZXR1cm4gbUNvbmZpZ3VyYWJsZTsKK30KKworLy8gQ29uZmlndXJhYmxlIGludGVyZmFjZSBmb3IgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6SW1wbAorYzJfc3RhdHVzX3QgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6SW1wbDo6Q29uZmlndXJhYmxlSW50Zjo6Y29uZmlnKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcykgeworICAgIC8vIFRPRE86IGltcGxlbWVudAorICAgICh2b2lkKXBhcmFtczsKKyAgICAodm9pZCltYXlCbG9jazsKKyAgICAodm9pZClmYWlsdXJlczsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGw6OkNvbmZpZ3VyYWJsZUludGY6OnF1ZXJ5KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKmNvbnN0IHBhcmFtcykgY29uc3QgeworICAgIC8vIFRPRE86IGltcGxlbWVudAorICAgICh2b2lkKWluZGljZXM7CisgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgKHZvaWQpcGFyYW1zOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6SW1wbDo6Q29uZmlndXJhYmxlSW50Zjo6cXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IHsKKyAgICAvLyBUT0RPOiBpbXBsZW1lbnQKKyAgICAodm9pZClwYXJhbXM7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbXBsOjpDb25maWd1cmFibGVJbnRmOjpxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCB7CisgICAgLy8gVE9ETzogaW1wbGVtZW50CisgICAgKHZvaWQpZmllbGRzOworICAgICh2b2lkKW1heUJsb2NrOworICAgIHJldHVybiBDMl9PSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NDQwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50LmgKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVF9ICisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudExpc3RlbmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUlucHV0U2luay5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSUJpbmRlci5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OklCaW5kZXI7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjp3cDsKKworc3RydWN0IENvbXBvbmVudFN0b3JlOworCitzdHJ1Y3QgQ29tcG9uZW50IDogcHVibGljIElDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8Q29tcG9uZW50PiB7CisgICAgQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiYsCisgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUsCisgICAgICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgICAgICAgICAgSUNsaWVudE1hbmFnZXI+JiBjbGllbnRQb29sTWFuYWdlcik7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKyAgICAvLyBNZXRob2RzIGZyb20gSUNvbXBvbmVudCBmb2xsb3cuCisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBxdWV1ZShjb25zdCBXb3JrQnVuZGxlJiB3b3JrQnVuZGxlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBmbHVzaChmbHVzaF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkcmFpbihib29sIHdpdGhFb3MpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gc2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgIHVpbnQ2NF90IGJsb2NrUG9vbElkLAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNvbm5lY3RUb0lucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFN1cmZhY2U+JiBpbnB1dFN1cmZhY2UsCisgICAgICAgICAgICBjb25uZWN0VG9JbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNvbm5lY3RUb09teElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICAgICBjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gZGlzY29ubmVjdEZyb21JbnB1dFN1cmZhY2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICB1aW50MzJfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgICAgIGNyZWF0ZUJsb2NrUG9vbF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkZXN0cm95QmxvY2tQb29sKHVpbnQ2NF90IGJsb2NrUG9vbElkKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IHN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBzdG9wKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiByZXNldCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gcmVsZWFzZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHNwPElDb21wb25lbnRJbnRlcmZhY2U+PiBnZXRJbnRlcmZhY2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxzcDxJSW5wdXRTaW5rPj4gYXNJbnB1dFNpbmsoKSBvdmVycmlkZTsKKworICAgIC8vIFJldHVybnMgYSBDMkNvbXBvbmVudCBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBzaW5rIGlmIHRoZSBzaW5rIGlzIGluZGVlZAorICAgIC8vIGEgbG9jYWwgY29tcG9uZW50LiBSZXR1cm5zIG51bGxwdHIgb3RoZXJ3aXNlLgorICAgIC8vCisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IElucHV0U3VyZmFjZTo6Y29ubmVjdCgpLgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGZpbmRMb2NhbENvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rKTsKKworcHJvdGVjdGVkOgorICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKyAgICBzcDxDb21wb25lbnRJbnRlcmZhY2U+IG1JbnRlcmZhY2U7CisgICAgc3A8SUNvbXBvbmVudExpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3A8Q29tcG9uZW50U3RvcmU+IG1TdG9yZTsKKyAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOjpEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcgorICAgICAgICAgICAgbUJ1ZmZlclBvb2xTZW5kZXI7CisKKyAgICBzdHJ1Y3QgU2luazsKKyAgICBzdGQ6Om11dGV4IG1TaW5rTXV0ZXg7CisgICAgc3A8U2luaz4gbVNpbms7CisKKyAgICBzdGQ6Om11dGV4IG1CbG9ja1Bvb2xzTXV0ZXg7CisgICAgLy8gVGhpcyBtYXAga2VlcHMgQzJCbG9ja1Bvb2wgb2JqZWN0cyB0aGF0IGFyZSBjcmVhdGVkIGJ5IGNyZWF0ZUJsb2NrUG9vbCgpCisgICAgLy8gYWxpdmUuIFRoZXNlIEMyQmxvY2tQb29sIG9iamVjdHMgY2FuIGJlIGRlbGV0ZWQgYnkgY2FsbGluZworICAgIC8vIGRlc3Ryb3lCbG9ja1Bvb2woKSwgcmVzZXQoKSBvciByZWxlYXNlKCksIG9yIGJ5IGRlc3Ryb3lpbmcgdGhlIGNvbXBvbmVudC4KKyAgICBzdGQ6Om1hcDx1aW50NjRfdCwgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPj4gbUJsb2NrUG9vbHM7CisKKyAgICB2b2lkIGluaXRMaXN0ZW5lcihjb25zdCBzcDxDb21wb25lbnQ+JiBzZWxmKTsKKworICAgIHZpcnR1YWwgfkNvbXBvbmVudCgpIG92ZXJyaWRlOworCisgICAgZnJpZW5kIHN0cnVjdCBDb21wb25lbnRTdG9yZTsKKworICAgIHN0cnVjdCBMaXN0ZW5lcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudEludGVyZmFjZS5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudEludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZDIzNWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50SW50ZXJmYWNlLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzIuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDb21wb25lbnRTdG9yZTsKKworc3RydWN0IENvbXBvbmVudEludGVyZmFjZSA6IHB1YmxpYyBJQ29tcG9uZW50SW50ZXJmYWNlIHsKKyAgICBDb21wb25lbnRJbnRlcmZhY2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+JiBpbnRlcmZhY2UsCisgICAgICAgICAgICBDb21wb25lbnRTdG9yZSogc3RvcmUpOworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0OworICAgIHZpcnR1YWwgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBnZXRDb25maWd1cmFibGUoKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gbUludGVyZmFjZTsKKyAgICBzcDxDYWNoZWRDb25maWd1cmFibGU+IG1Db25maWd1cmFibGU7CisgICAgYzJfc3RhdHVzX3QgbUluaXQ7Cit9OworCisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRfSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4MGM2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UU1RPUkVfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVFNUT1JFX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMi5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDbGllbnRNYW5hZ2VyOworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IENvbXBvbmVudFN0b3JlIDogcHVibGljIElDb21wb25lbnRTdG9yZSB7CisgICAgQ29tcG9uZW50U3RvcmUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+JiBzdG9yZSk7CisgICAgdmlydHVhbCB+Q29tcG9uZW50U3RvcmUoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdGF0dXMgb2YgdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IENhY2hlZENvbmZpZ3VyYWJsZTo6aW5pdCgpIHRvIHZhbGlkYXRlCisgICAgICogc3VwcG9ydGVkIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgdmFsaWRhdGVTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiYgcGFyYW1zKTsKKworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnRTdG9yZS4KKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiBwb29sLAorICAgICAgICAgICAgY3JlYXRlQ29tcG9uZW50X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKKyAgICAgICAgICAgIGNyZWF0ZUludGVyZmFjZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gbGlzdENvbXBvbmVudHMobGlzdENvbXBvbmVudHNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNyZWF0ZUlucHV0U3VyZmFjZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZ2V0U3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgICAgICBnZXRTdHJ1Y3REZXNjcmlwdG9yc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48c3A8SUNsaWVudE1hbmFnZXI+PiBnZXRQb29sQ2xpZW50TWFuYWdlcigpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gY29weUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IEJ1ZmZlciYgc3JjLAorICAgICAgICAgICAgY29uc3QgQnVmZmVyJiBkc3QpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBnZXRDb25maWd1cmFibGUoKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIER1bXBzIGluZm9ybWF0aW9uIHdoZW4gbHNoYWwgaXMgY2FsbGVkLgorICAgICAqLworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGRlYnVnKAorICAgICAgICAgICAgY29uc3QgaGlkbF9oYW5kbGUmIGhhbmRsZSwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPGhpZGxfc3RyaW5nPiYgYXJncykgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxDYWNoZWRDb25maWd1cmFibGU+IG1Db25maWd1cmFibGU7CisKKyAgICAvLyBEb2VzIGJvb2trZWVwaW5nIGZvciBhbiBpbnRlcmZhY2UgdGhhdCBoYXMgYmVlbiBsb2FkZWQuCisgICAgdm9pZCBvbkludGVyZmFjZUxvYWRlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKTsKKworICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBtU3RvcmU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IG1QYXJhbVJlZmxlY3RvcjsKKworICAgIHN0ZDo6bWFwPEMyUGFyYW06OkNvcmVJbmRleCwgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4+IG1TdHJ1Y3REZXNjcmlwdG9yczsKKyAgICBzdGQ6OnNldDxDMlBhcmFtOjpDb3JlSW5kZXg+IG1VbnN1cHBvcnRlZFN0cnVjdERlc2NyaXB0b3JzOworICAgIHN0ZDo6c2V0PEMyU3RyaW5nPiBtTG9hZGVkSW50ZXJmYWNlczsKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbVN0cnVjdERlc2NyaXB0b3JzTXV0ZXg7CisKKyAgICAvLyBDb21wb25lbnRTdG9yZSBrZWVwcyB0cmFjayBvZiBsaXZlIENvbXBvbmVudHMuCisKKyAgICBzdHJ1Y3QgQ29tcG9uZW50U3RhdHVzIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjMkNvbXBvbmVudDsKKyAgICAgICAgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCBiaXJ0aFRpbWU7CisgICAgfTsKKworICAgIG11dGFibGUgc3RkOjptdXRleCBtQ29tcG9uZW50Um9zdGVyTXV0ZXg7CisgICAgc3RkOjptYXA8Q29tcG9uZW50KiwgQ29tcG9uZW50U3RhdHVzPiBtQ29tcG9uZW50Um9zdGVyOworCisgICAgLy8gQ2FsbGVkIHdoZW5ldmVyIENvbXBvbmVudCBpcyBjcmVhdGVkLgorICAgIHZvaWQgcmVwb3J0Q29tcG9uZW50QmlydGgoQ29tcG9uZW50KiBjb21wb25lbnQpOworICAgIC8vIENhbGxlZCBvbmx5IGZyb20gdGhlIGRlc3RydWN0b3Igb2YgQ29tcG9uZW50LgorICAgIHZvaWQgcmVwb3J0Q29tcG9uZW50RGVhdGgoQ29tcG9uZW50KiBjb21wb25lbnQpOworCisgICAgZnJpZW5kIENvbXBvbmVudDsKKworICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGR1bXBpbmcuCisKKyAgICBzdGQ6Om9zdHJlYW0mIGR1bXAoCisgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiYgY29tcCk7CisKKyAgICBzdGQ6Om9zdHJlYW0mIGR1bXAoCisgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgIENvbXBvbmVudFN0YXR1cyYgY29tcFN0YXR1cyk7CisKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRTVE9SRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5NTE4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTkZJR1VSQUJMRV9ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09ORklHVVJBQkxFX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzIuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IENvbXBvbmVudFN0b3JlOworCisvKioKKyAqIENvZGVjMiBvYmplY3RzIG9mIGRpZmZlcmVudCB0eXBlcyBtYXkgaGF2ZSBkaWZmZXJlbnQgcXVlcnlpbmcgYW5kIGNvbmZpZ3VyaW5nCisgKiBmdW5jdGlvbnMsIGJ1dCBhY3Jvc3MgdGhlIFRyZWJsZSBib3VuZGFyeSwgdGhleSBzaGFyZSB0aGUgc2FtZSBISURMCisgKiBpbnRlcmZhY2UsIElDb25maWd1cmFibGUuCisgKgorICogQ29uZmlndXJhYmxlQzJJbnRmIGlzIGFuIGFic3RyYWN0IGNsYXNzIHRoYXQgYSBDb2RlYzIgb2JqZWN0IGNhbiBpbXBsZW1lbnQgdG8KKyAqIGVhc2lseSBleHBvc2UgYW4gSUNvbmZpZ3VyYWJsZSBpbnN0YW5jZS4gU2VlIENhY2hlZENvbmZpZ3VyYWJsZSBiZWxvdy4KKyAqLworc3RydWN0IENvbmZpZ3VyYWJsZUMySW50ZiB7CisgICAgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisgICAgdWludDMyX3QgZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtSWQ7IH0KKyAgICAvKiogQzJDb21wb25lbnRJbnRlcmZhY2U6OnF1ZXJ5X3ZiIHNhbnMgc3RhY2sgcGFyYW1zICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBwYXJhbXMpIGNvbnN0ID0gMDsKKyAgICAvKiogQzJDb21wb25lbnRJbnRlcmZhY2U6OmNvbmZpZ192YiAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgPSAwOworICAgIC8qKiBDMkNvbXBvbmVudEludGVyZmFjZTo6cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcykgY29uc3QgPSAwOworICAgIC8qKiBDMkNvbXBvbmVudEludGVyZmFjZTo6cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgZmllbGRzLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIH5Db25maWd1cmFibGVDMkludGYoKSA9IGRlZmF1bHQ7CisKKyAgICBDb25maWd1cmFibGVDMkludGYoY29uc3QgQzJTdHJpbmcmIG5hbWUsIHVpbnQzMl90IGlkKQorICAgICAgICAgIDogbU5hbWV7bmFtZX0sIG1JZHtpZH0ge30KKworcHJvdGVjdGVkOgorICAgIEMyU3RyaW5nIG1OYW1lOyAvKiBjYWNoZWQgY29tcG9uZW50IG5hbWUgKi8KKyAgICB1aW50MzJfdCBtSWQ7Cit9OworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBJQ29uZmlndXJhYmxlIGludGVyZmFjZSB0aGF0IHN1cHBvcnRzIGNhY2hpbmcgb2YKKyAqIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGZyb20gYSBzdXBwbGllZCBDb21wb25lbnRTdG9yZS4KKyAqCisgKiBDYWNoZWRDb25maWd1cmFibGUgZXNzZW50aWFsbHkgY29udmVydHMgYSBDb25maWd1cmFibGVDMkludGYgaW50byBISURMJ3MKKyAqIElDb25maWd1cmFibGUuIEEgQ29kZWMyIG9iamVjdCBnZW5lcmFsbHkgaW1wbGVtZW50cyBDb25maWd1cmFibGVDMkludGYgYW5kCisgKiBwYXNzZXMgdGhlIGltcGxlbWVudGF0aW9uIHRvIHRoZSBjb25zdHJ1Y3RvciBvZiBDYWNoZWRDb25maWd1cmFibGUuCisgKgorICogTm90ZSB0aGF0IGNhY2hpbmcgaGFwcGVucworICovCitzdHJ1Y3QgQ2FjaGVkQ29uZmlndXJhYmxlIDogcHVibGljIElDb25maWd1cmFibGUgeworICAgIENhY2hlZENvbmZpZ3VyYWJsZShzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlndXJhYmxlQzJJbnRmPiYmIGludGYpOworCisgICAgYzJfc3RhdHVzX3QgaW5pdChDb21wb25lbnRTdG9yZSogc3RvcmUpOworCisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbmZpZ3VyYWJsZQorCisgICAgdmlydHVhbCBSZXR1cm48dWludDMyX3Q+IGdldElkKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBnZXROYW1lKGdldE5hbWVfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gcXVlcnkoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgcXVlcnlfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY29uZmlnKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGluUGFyYW1zLAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIGNvbmZpZ19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0LAorICAgICAgICAgICAgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICBxdWVyeVN1cHBvcnRlZFBhcmFtc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBpbkZpZWxkcywKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBxdWVyeVN1cHBvcnRlZFZhbHVlc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBDb21tb24gQ29kZWMyLjAgaW50ZXJmYWNlIHdyYXBwZXIKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlndXJhYmxlQzJJbnRmPiBtSW50ZjsKKworICAgIC8vIENhY2hlZCBzdXBwb3J0ZWQgcGFyYW1zCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gbVN1cHBvcnRlZFBhcmFtczsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT05GSUdVUkFCTEVfSAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRCdWZmZXJNYW5hZ2VyLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRCdWZmZXJNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY4NTdkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dEJ1ZmZlck1hbmFnZXIuaApAQCAtMCwwICsxLDI5NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0lOUFVUX0JVRkZFUl9NQU5BR0VSX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVF9CVUZGRVJfTUFOQUdFUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50TGlzdGVuZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHRocmVhZD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKKworLyoqCisgKiBJbnB1dEJ1ZmZlck1hbmFnZXIKKyAqID09PT09PT09PT09PT09PT09PQorICoKKyAqIElucHV0QnVmZmVyTWFuYWdlciBwcmVzZW50cyBhIHdheSB0byB0cmFjayBhbmQgdW50cmFjayBpbnB1dCBidWZmZXJzIGluIHRoaXMKKyAqIChjb2RlYykgcHJvY2VzcyBhbmQgc2VuZCBhIG5vdGlmaWNhdGlvbiB0byBhIGxpc3RlbmVyLCBwb3NzaWJseSBpbiBhCisgKiBkaWZmZXJlbnQgcHJvY2Vzcywgd2hlbiBhIHRyYWNrZWQgYnVmZmVyIG5vIGxvbmdlciBoYXMgYW55IHJlZmVyZW5jZXMgaW4gdGhpcworICogcHJvY2Vzcy4KKyAqCisgKiBJbnB1dEJ1ZmZlck1hbmFnZXIgaG9sZHMgYSBjb2xsZWN0aW9uIG9mIHJlY29yZHMgcmVwcmVzZW50aW5nIHRyYWNrZWQgYnVmZmVycworICogYW5kIHRoZWlyIGNhbGxiYWNrIGxpc3RlbmVycy4gQ29uY2VwdHVhbGx5LCBvbmUgcmVjb3JkIGlzIGEgdHJpcGxlIChsaXN0ZW5lciwKKyAqIGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSB3aGVyZQorICoKKyAqIC0gKGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSBpcyBhIHBhaXIgb2YgaW5kaWNlcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBidWZmZXIuCisgKiAtIGxpc3RlbmVyIGlzIG9mIHR5cGUgSUNvbXBvbmVudExpc3RlbmVyLiBJdHMgb25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCgpCisgKiAgIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBhc3NvY2lhdGVkIGJ1ZmZlciBkaWVzLiBUaGUgYXJndW1lbnQgb2YKKyAqICAgb25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCgpIGlzIGEgbGlzdCBvZiBJbnB1dEJ1ZmZlciBvYmplY3RzLCBlYWNoIG9mIHdoaWNoCisgKiAgIGhhcyB0aGUgZm9sbG93aW5nIG1lbWJlcnM6CisgKgorICogICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgKKyAqICAgICB1aW50MzJfdCBhcnJheUluZGV4CisgKgorICogV2hlbiBhIHRyYWNrZWQgYnVmZmVyIGFzc29jaWF0ZWQgdG8gdGhlIHRyaXBsZSAobGlzdGVuZXIsIGZyYW1lSW5kZXgsCisgKiBidWZmZXJJbmRleCkgZ29lcyBvdXQgb2Ygc2NvcGUsIGxpc3RlbmVyLT5vbklucHV0QnVmZmVyc1JlbGVhc2VkKCkgd2lsbCBiZQorICogY2FsbGVkIHdpdGggYW4gSW5wdXRCdWZmZXIgb2JqZWN0IHdob3NlIG1lbWJlcnMgYXJlIHNldCBhcyBmb2xsb3dzOgorICoKKyAqICAgICBpbnB1dEJ1ZmZlci5mcmFtZUluZGV4ID0gZnJhbWVJbmRleAorICogICAgIGlucHV0QnVmZmVyLmFycmF5SW5kZXggPSBidWZmZXJJbmRleAorICoKKyAqIElQQyBPcHRpbWl6YXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTaW5jZSBvbklucHV0QnVmZmVyc1JlbGVhc2VkKCkgaXMgYW4gSVBDIGNhbGwsIElucHV0QnVmZmVyTWFuYWdlciB0cmllcyBub3QKKyAqIHRvIGNhbGwgaXQgdG9vIG9mdGVuLiBBbnkgdHdvIGNhbGxzIHRvIHRoZSBzYW1lIGxpc3RlbmVyIGFyZSBhdCBsZWFzdAorICogbU5vdGlmaWNhdGlvbkludGVydmFsTnMgbmFub3NlY29uZHMgYXBhcnQsIHdoZXJlIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zIGlzCisgKiBjb25maWd1cmFibGUgdmlhIGNhbGxpbmcgc2V0Tm90aWZpY2F0aW9uSW50ZXJ2YWwoKS4gVGhlIGRlZmF1bHQgdmFsdWUgb2YKKyAqIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zIGlzIGtEZWZhdWx0Tm90aWZpY2F0aW9uSW50ZXJuYWxOcy4KKyAqCisgKiBQdWJsaWMgTWVtYmVyIEZ1bmN0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBJbnB1dEJ1ZmZlck1hbmFnZXIgaXMgYSBzaW5nbGV0b24gY2xhc3MuIEl0cyBvbmx5IGluc3RhbmNlIGlzIGFjY2Vzc2libGUgdmlhCisgKiB0aGUgZm9sbG93aW5nIHB1YmxpYyBmdW5jdGlvbnM6CisgKgorICogLSByZWdpc3RlckZyYW1lRGF0YShjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAqICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KQorICoKKyAqIC0gdW5yZWdpc3RlckZyYW1lRGF0YShjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAqICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpCisgKgorICogLSB1bnJlZ2lzdGVyRnJhbWVEYXRhKGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyKQorICoKKyAqIC0gc2V0Tm90aWZpY2F0aW9uSW50ZXJ2YWwobnNlY3NfdCBub3RpZmljYXRpb25JbnRlcnZhbE5zKQorICoKKyAqLworCitzdHJ1Y3QgSW5wdXRCdWZmZXJNYW5hZ2VyIHsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgdGltZSBpbnRlcnZhbCBiZXR3ZWVuIDIgc3Vic2VxdWVudCBJUENzLgorICAgICAqLworICAgIHN0YXRpYyBjb25zdGV4cHIgbnNlY3NfdCBrRGVmYXVsdE5vdGlmaWNhdGlvbkludGVydmFsTnMgPSAxMDAwMDAwOyAvKiAxbXMgKi8KKworICAgIC8qKgorICAgICAqIFRyYWNrIGFsbCBidWZmZXJzIGluIGEgQzJGcmFtZURhdGEgb2JqZWN0LgorICAgICAqCisgICAgICogaW5wdXQgKEMyRnJhbWVEYXRhKSBoYXMgdGhlIGZvbGxvd2luZyB0d28gbWVtYmVycyB0aGF0IGFyZSBvZiBpbnRlcmVzdDoKKyAgICAgKgorICAgICAqICAgQzJXb3JrT3JkaW5hbCAgICAgICAgICAgICAgICBvcmRpbmFsCisgICAgICogICB2ZWN0b3I8c2hhcmVkX3B0cjxDMkJ1ZmZlcj4+IGJ1ZmZlcnMKKyAgICAgKgorICAgICAqIENhbGxpbmcgcmVnaXN0ZXJGcmFtZURhdGEobGlzdGVuZXIsIGlucHV0KSB3aWxsIHJlZ2lzdGVyIG11bHRpcGxlCisgICAgICogdHJpcGxlcyAobGlzdGVuZXIsIGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSB3aGVyZSBmcmFtZUluZGV4IGlzIGVxdWFsIHRvCisgICAgICogaW5wdXQub3JkaW5hbC5mcmFtZUluZGV4IGFuZCBidWZmZXJJbmRleCBydW5zIHRocm91Z2ggdGhlIGluZGljZXMgb2YKKyAgICAgKiBpbnB1dC5idWZmZXJzIHN1Y2ggdGhhdCBpbnB1dC5idWZmZXJzW2J1ZmZlckluZGV4XSBpcyBub3QgbnVsbC4KKyAgICAgKgorICAgICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHF1ZXVlKCkuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGlzdGVuZXIgTGlzdGVuZXIgb2YgZGVhdGggbm90aWZpY2F0aW9ucy4KKyAgICAgKiBccGFyYW0gaW5wdXQgSW5wdXQgZnJhbWUgZGF0YSB3aG9zZSBpbnB1dCBidWZmZXJzIGFyZSB0byBiZSB0cmFja2VkLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpOworCisgICAgLyoqCisgICAgICogVW50cmFjayBhbGwgYnVmZmVycyBpbiBhIEMyRnJhbWVEYXRhIG9iamVjdC4KKyAgICAgKgorICAgICAqIENhbGxpbmcgdW5yZWdpc3RlckZyYW1lRGF0YShsaXN0ZW5lciwgaW5wdXQpIHdpbGwgdW5yZWdpc3RlciBhbmQgcmVtb3ZlCisgICAgICogcGVuZGluZyBub3RpZmljYXRpb25zIGZvciBhbGwgdHJpcGxlcyAobCwgZmksIGJ1ZmZlckluZGV4KSBzdWNoIHRoYXQKKyAgICAgKiBsID0gbGlzdGVuZXIgYW5kIGZpID0gaW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LgorICAgICAqCisgICAgICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGZyb20gb25Xb3JrRG9uZSgpIGFuZCBmbHVzaCgpLgorICAgICAqCisgICAgICogXHBhcmFtIGxpc3RlbmVyIFByZXZpb3VzbHkgcmVnaXN0ZXJlZCBsaXN0ZW5lci4KKyAgICAgKiBccGFyYW0gaW5wdXQgUHJldmlvdXNseSByZWdpc3RlcmVkIGZyYW1lIGRhdGEuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgdW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KTsKKworICAgIC8qKgorICAgICAqIFVudHJhY2sgYWxsIGJ1ZmZlcnMgYXNzb2NpYXRlZCB0byBhIGdpdmVuIGxpc3RlbmVyLgorICAgICAqCisgICAgICogQ2FsbGluZyB1bnJlZ2lzdGVyRnJhbWVEYXRhKGxpc3RlbmVyKSB3aWxsIHVucmVnaXN0ZXIgYW5kIHJlbW92ZQorICAgICAqIHBlbmRpbmcgbm90aWZpY2F0aW9ucyBmb3IgYWxsIHRyaXBsZXMgKGwsIGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSBzdWNoCisgICAgICogdGhhdCBsID0gbGlzdGVuZXIuCisgICAgICoKKyAgICAgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGNsZWFucyB1cCBhbGwgaW5wdXQgYnVmZmVycywKKyAgICAgKiBpLmUuLCB3aGVuIHJlc2V0KCksIHJlbGVhc2UoKSwgc3RvcCgpIG9yIH5Db21wb25lbnQoKSBpcyBjYWxsZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGlzdGVuZXIgUHJldmlvdXNseSByZWdpc3RlcmVkIGxpc3RlbmVyLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5vdGlmaWNhdGlvbiBpbnRlcnZhbC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBub3RpZmljYXRpb25JbnRlcnZhbE5zIE5ldyBub3RpZmljYXRpb24gaW50ZXJ2YWwsIGluIG5hbm9zZWNvbmRzLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHNldE5vdGlmaWNhdGlvbkludGVydmFsKG5zZWNzX3Qgbm90aWZpY2F0aW9uSW50ZXJ2YWxOcyk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBfcmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCk7CisgICAgdm9pZCBfdW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KTsKKyAgICB2b2lkIF91bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIpOworICAgIHZvaWQgX3NldE5vdGlmaWNhdGlvbkludGVydmFsKG5zZWNzX3Qgbm90aWZpY2F0aW9uSW50ZXJ2YWxOcyk7CisKKyAgICAvLyBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdGllZCB0byBDMkJ1ZmZlciBvYmplY3RzLgorICAgIC8vCisgICAgLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgc0luc3RhbmNlIGlzIHRoZSBvbmx5IGluc3RhbmNlIG9mIHRoaXMKKyAgICAvLyAgICAgICBjbGFzcy4KKyAgICBzdGF0aWMgdm9pZCBvbkJ1ZmZlckRlc3Ryb3llZChjb25zdCBDMkJ1ZmZlciogYnVmLCB2b2lkKiBhcmcpOworICAgIHZvaWQgX29uQnVmZmVyRGVzdHJveWVkKGNvbnN0IEMyQnVmZmVyKiBidWYsIHZvaWQqIGFyZyk7CisKKyAgICAvLyBQZXJzaXN0ZW50IGRhdGEgdG8gYmUgcGFzc2VkIGFzICJhcmciIGluIG9uQnVmZmVyRGVzdHJveWVkKCkuCisgICAgLy8gVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgdHJpcGxlIChsaXN0ZW5lciwgZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIHBsdXMgYQorICAgIC8vIHdlYWsgcG9pbnRlciB0byB0aGUgQzJCdWZmZXIgb2JqZWN0LgorICAgIC8vCisgICAgLy8gTm90ZSB0aGF0IHRoZSAia2V5IiBpcyBidWZmZXJJbmRleCBhY2NvcmRpbmcgdG8gb3BlcmF0b3I8KCkuIFRoaXMgaXMKKyAgICAvLyBkZXNpZ25lZCB0byB3b3JrIHdpdGggVHJhY2tlZEJ1ZmZlcnNNYXAgZGVmaW5lZCBiZWxvdy4KKyAgICBzdHJ1Y3QgVHJhY2tlZEJ1ZmZlciB7CisgICAgICAgIHdwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXg7CisgICAgICAgIHNpemVfdCBidWZmZXJJbmRleDsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgICAgICBUcmFja2VkQnVmZmVyKGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlcikKKyAgICAgICAgICAgICAgOiBsaXN0ZW5lcihsaXN0ZW5lciksCisgICAgICAgICAgICAgICAgZnJhbWVJbmRleChmcmFtZUluZGV4KSwKKyAgICAgICAgICAgICAgICBidWZmZXJJbmRleChidWZmZXJJbmRleCksCisgICAgICAgICAgICAgICAgYnVmZmVyKGJ1ZmZlcikge30KKyAgICAgICAgVHJhY2tlZEJ1ZmZlcihjb25zdCBUcmFja2VkQnVmZmVyJikgPSBkZWZhdWx0OworICAgICAgICBib29sIG9wZXJhdG9yPChjb25zdCBUcmFja2VkQnVmZmVyJiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlckluZGV4IDwgb3RoZXIuYnVmZmVySW5kZXg7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gTWFwOiBsaXN0ZW5lciAtPiBmcmFtZUluZGV4IC0+IHNldDxUcmFja2VkQnVmZmVyPi4KKyAgICAvLyBFc3NlbnRpYWxseSwgdGhpcyBpcyB1c2VkIHRvIHN0b3JlIHRyaXBsZXMgKGxpc3RlbmVyLCBmcmFtZUluZGV4LAorICAgIC8vIGJ1ZmZlckluZGV4KSB0aGF0J3Mgc2VhcmNoYWJsZSBieSBsaXN0ZW5lciBhbmQgKGxpc3RlbmVyLCBmcmFtZUluZGV4KS4KKyAgICAvLyBIb3dldmVyLCB0aGUgdmFsdWUgb2YgdGhlIGlubmVybW9zdCBtYXAgaXMgVHJhY2tlZEJ1ZmZlciwgd2hpY2ggYWxzbworICAgIC8vIGNvbnRhaW5zIGFuIGV4dHJhIGNvcHkgb2YgbGlzdGVuZXIgYW5kIGZyYW1lSW5kZXguIFRoaXMgaXMgbmVlZGVkCisgICAgLy8gYmVjYXVzZSBvbkJ1ZmZlckRlc3Ryb3llZCgpIG5lZWRzIHRvIGtub3cgbGlzdGVuZXIgYW5kIGZyYW1lSW5kZXggdG9vLgorICAgIHR5cGVkZWYgc3RkOjptYXA8d3A8SUNvbXBvbmVudExpc3RlbmVyPiwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4+PiBUcmFja2VkQnVmZmVyc01hcDsKKworICAgIC8vIFN0b3JhZ2UgZm9yIHBlbmRpbmcgKHVuc2VudCkgZGVhdGggbm90aWZpY2F0aW9ucyBmb3Igb25lIGxpc3RlbmVyLgorICAgIC8vIEVhY2ggcGFpciBpbiBtZW1iZXIgbmFtZWQgImluZGljZXMiIGFyZSAoZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIGZyb20KKyAgICAvLyB0aGUgKGxpc3RlbmVyLCBmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgdHJpcGxlLgorICAgIHN0cnVjdCBEZWF0aE5vdGlmaWNhdGlvbnMgeworCisgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgcGVuZGluZyBub3RpZmljYXRpb25zIGZvciB0aGlzIGxpc3RlbmVyLgorICAgICAgICAvLyBjb3VudCBtYXkgYmUgMCwgaW4gd2hpY2ggY2FzZSB0aGUgRGVhdGhOb3RpZmljYXRpb25zIG9iamVjdCB3aWxsCisgICAgICAgIC8vIHJlbWFpbiB2YWxpZCBmb3Igb25seSBhIHNtYWxsIHBlcmlvZCAoc3BlY2lmaWVkCisgICAgICAgIC8vIG5hbm9zZWNvbmRzKS4KKyAgICAgICAgc2l6ZV90IGNvdW50OworCisgICAgICAgIC8vIFRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IGNhbGxiYWNrIG9uIHRoaXMgbGlzdGVuZXIuIFRoaXMgaXMKKyAgICAgICAgLy8gdXNlZCB0byBndWFyYW50ZWUgdGhhdCBjYWxsYmFja3MgZG8gbm90IG9jY3VyIHRvbyBmcmVxdWVudGx5LCBhbmQKKyAgICAgICAgLy8gYWxzbyB0byB0cmlnZ2VyIGV4cGlyYXRpb24gb2YgYSBEZWF0aE5vdGlmaWNhdGlvbnMgb2JqZWN0IHRoYXQgaGFzCisgICAgICAgIC8vIGNvdW50ID0gMC4KKyAgICAgICAgbnNlY3NfdCBsYXN0U2VudE5zOworCisgICAgICAgIC8vIE1hcDogZnJhbWVJbmRleCAtPiB2ZWN0b3Igb2YgYnVmZmVySW5kaWNlcworICAgICAgICAvLyBUaGlzIGlzIGVzc2VudGlhbGx5IGEgY29sbGVjdGlvbiBvZiAoZnJhbWRlSW5kZXgsIGJ1ZmZlckluZGV4KS4KKyAgICAgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6dmVjdG9yPHNpemVfdD4+IGluZGljZXM7CisKKyAgICAgICAgRGVhdGhOb3RpZmljYXRpb25zKAorICAgICAgICAgICAgICAgIG5zZWNzX3Qgbm90aWZpY2F0aW9uSW50ZXJ2YWxOcyA9IGtEZWZhdWx0Tm90aWZpY2F0aW9uSW50ZXJ2YWxOcykKKyAgICAgICAgICAgICAgOiBjb3VudCgwKSwKKyAgICAgICAgICAgICAgICBsYXN0U2VudE5zKHN5c3RlbVRpbWUoKSAtIG5vdGlmaWNhdGlvbkludGVydmFsTnMpLAorICAgICAgICAgICAgICAgIGluZGljZXMoKSB7fQorICAgIH07CisKKyAgICAvLyBUaGUgbWluaW11bSB0aW1lIHBlcmlvZCBiZXR3ZWVuIElQQyBjYWxscyB0byBub3RpZnkgdGhlIGNsaWVudCBhYm91dCB0aGUKKyAgICAvLyBkZXN0cnVjdGlvbiBvZiBpbnB1dCBidWZmZXJzLgorICAgIHN0ZDo6YXRvbWljPG5zZWNzX3Q+IG1Ob3RpZmljYXRpb25JbnRlcnZhbE5ze2tEZWZhdWx0Tm90aWZpY2F0aW9uSW50ZXJ2YWxOc307CisKKyAgICAvLyBNdXRleCBmb3IgdGhlIG1hbmFnZW1lbnQgb2YgYWxsIGlucHV0IGJ1ZmZlcnMuCisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisKKyAgICAvLyBUcmFja2VkIGlucHV0IGJ1ZmZlcnMuCisgICAgVHJhY2tlZEJ1ZmZlcnNNYXAgbVRyYWNrZWRCdWZmZXJzTWFwOworCisgICAgLy8gRGVhdGggbm90aWZpY2F0aW9ucyB0byBiZSBzZW50LgorICAgIC8vCisgICAgLy8gQSBEZWF0aE5vdGlmaWNhdGlvbnMgb2JqZWN0IGlzIGFzc29jaWF0ZWQgdG8gZWFjaCBsaXN0ZW5lci4gQW4gZW50cnkgaW4KKyAgICAvLyB0aGlzIG1hcCB3aWxsIGJlIHJlbW92ZWQgaWYgaXRzIGFzc29jaWF0ZWQgRGVhdGhOb3RpZmljYXRpb25zIGhhcyBjb3VudCA9CisgICAgLy8gMCBhbmQgbGFzdFNlbnROcyA8IHN5c3RlbVRpbWUoKSAtIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zLgorICAgIHN0ZDo6bWFwPHdwPElDb21wb25lbnRMaXN0ZW5lcj4sIERlYXRoTm90aWZpY2F0aW9ucz4gbURlYXRoTm90aWZpY2F0aW9uczsKKworICAgIC8vIENvbmRpdGlvbiB2YXJpYWJsZSBzaWduYWxlZCB3aGVuIGFuIGVudHJ5IGlzIGFkZGVkIHRvIG1EZWF0aE5vdGlmaWNhdGlvbnMuCisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbU9uQnVmZmVyRGVzdHJveWVkOworCisgICAgLy8gTm90aWZ5IHRoZSBjbGllbnRzIGFib3V0IGJ1ZmZlciBkZXN0cnVjdGlvbnMuCisgICAgLy8gUmV0dXJuIGZhbHNlIGlmIGFsbCBkZXN0cnVjdGlvbnMgaGF2ZSBiZWVuIG5vdGlmaWVkLgorICAgIC8vIFJldHVybiB0cnVlIGFuZCBzZXQgdGltZVRvUmV0cnkgdG8gdGhlIGR1cmF0aW9uIHRvIHdhaXQgZm9yIGJlZm9yZQorICAgIC8vIHJldHJ5aW5nIGlmIHNvbWUgZGVzdHJ1Y3Rpb25zIGhhdmUgbm90IGJlZW4gbm90aWZpZWQuCisgICAgYm9vbCBwcm9jZXNzTm90aWZpY2F0aW9ucyhuc2Vjc190KiB0aW1lVG9SZXRyeU5zKTsKKworICAgIC8vIE1haW4gZnVuY3Rpb24gZm9yIHRoZSBpbnB1dCBidWZmZXIgbWFuYWdlciB0aHJlYWQuCisgICAgdm9pZCBtYWluKCk7CisKKyAgICAvLyBUaGUgdGhyZWFkIHRoYXQgbWFuYWdlcyBub3RpZmljYXRpb25zLgorICAgIC8vCisgICAgLy8gTm90ZTogVGhpcyB2YXJpYWJsZSBpcyBkZWNsYXJlZCBsYXN0IHNvIGl0cyBpbml0aWFsaXphdGlvbiB3aWxsIGhhcHBlbgorICAgIC8vIGFmdGVyIGFsbCBvdGhlciBtZW1iZXIgdmFyaWFibGVzIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KKyAgICBzdGQ6OnRocmVhZCBtTWFpblRocmVhZDsKKworICAgIC8vIFByaXZhdGUgY29uc3RydWN0b3IuCisgICAgSW5wdXRCdWZmZXJNYW5hZ2VyKCk7CisKKyAgICAvLyBUaGUgb25seSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgorICAgIHN0YXRpYyBJbnB1dEJ1ZmZlck1hbmFnZXImIGdldEluc3RhbmNlKCk7CisKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVF9CVUZGRVJfTUFOQUdFUl9ICisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2UuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjgyYzEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZS5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0lOUFVUU1VSRkFDRV9ICisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JSW5wdXRTaW5rLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUlucHV0U3VyZmFjZS5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisKKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgSW5wdXRTdXJmYWNlIDogcHVibGljIElJbnB1dFN1cmZhY2UgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OgorICAgICAgICAgICAgR3JhcGhpY0J1ZmZlclNvdXJjZSBHcmFwaGljQnVmZmVyU291cmNlOworCisgICAgdmlydHVhbCBSZXR1cm48c3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+IGdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IGdldENvbmZpZ3VyYWJsZSgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rLAorICAgICAgICAgICAgY29ubmVjdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKworICAgIGNsYXNzIEludGVyZmFjZTsKKyAgICBjbGFzcyBDb25maWd1cmFibGVJbnRmOworCisgICAgc3A8Q29tcG9uZW50U3RvcmU+IG1TdG9yZTsKKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CisgICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZXJmYWNlPiBtSW50ZjsKKyAgICBzcDxDYWNoZWRDb25maWd1cmFibGU+IG1Db25maWd1cmFibGU7CisKKyAgICBJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgcmVmbGVjdG9yLAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJhc2UsCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlKTsKKworICAgIHZpcnR1YWwgfklucHV0U3VyZmFjZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29tcG9uZW50U3RvcmU7CisKK307CisKKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0lOUFVUU1VSRkFDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NThiNmIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRTVVJGQUNFQ09OTkVDVElPTl9ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRTVVJGQUNFQ09OTkVDVElPTl9ICisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlclNvdXJjZTsKKworLy8gQW4gSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiBjb25uZWN0cyBhbiBJbnB1dFN1cmZhY2UgdG8gYSBzaW5rLCB3aGljaCBtYXkgYmUgYW4KKy8vIElJbnB1dFNpbmsgb3IgYSBsb2NhbCBDMkNvbXBvbmVudC4gVGhpcyBjYW4gYmUgc3BlY2lmaWVkIGJ5IGNob29zaW5nIHRoZQorLy8gY29ycmVzcG9uZGluZyBjb25zdHJ1Y3Rvci4gVGhlIHJlYXNvbiBmb3IgZGlzdGluZ3Vpc2hpbmcgdGhlc2UgdHdvIGNhc2VzIGlzCisvLyB0aGF0IHdoZW4gYW4gSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiBsaXZlcyBpbiB0aGUgc2FtZSBwcm9jZXNzIGFzIHRoZQorLy8gY29tcG9uZW50IHRoYXQgcHJvY2Vzc2VzIHRoZSBidWZmZXJzLCBkYXRhIHBhcmNlbGluZyBpcyBub3QgbmVlZGVkLgorc3RydWN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb24gOiBwdWJsaWMgSUlucHV0U3VyZmFjZUNvbm5lY3Rpb24geworCisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkaXNjb25uZWN0KCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gZ2V0Q29uZmlndXJhYmxlKCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiYgY29tcCwKKyAgICAgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUpOworCisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbigKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luaywKKyAgICAgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUpOworCisgICAgYm9vbCBpbml0KCk7CisKKyAgICBmcmllbmQgc3RydWN0IElucHV0U3VyZmFjZTsKKworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oKSA9IGRlbGV0ZTsKKyAgICBJbnB1dFN1cmZhY2VDb25uZWN0aW9uKGNvbnN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb24mKSA9IGRlbGV0ZTsKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBJbnB1dFN1cmZhY2VDb25uZWN0aW9uJikgPSBkZWxldGU7CisKKyAgICBzdHJ1Y3QgSW1wbDsKKworICAgIHN0ZDo6bXV0ZXggbUltcGxNdXRleDsKKyAgICBzcDxJbXBsPiBtSW1wbDsKKyAgICBzcDxDYWNoZWRDb25maWd1cmFibGU+IG1Db25maWd1cmFibGU7CisKKyAgICB2aXJ0dWFsIH5JbnB1dFN1cmZhY2VDb25uZWN0aW9uKCkgb3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRTVVJGQUNFQ09OTkVDVElPTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvdHlwZXMuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZjNhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvdHlwZXMuaApAQCAtMCwwICsxLDM4NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX1RZUEVTX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19UWVBFU19ICisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lDbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctYmFzZS5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OnN0YXR1c190OwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgICAgIENvbm5lY3Rpb25JZDsKK3VzaW5nIDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworLy8gVHlwZXMgb2YgbWV0YWRhdGEgZm9yIEJsb2Nrcy4KK3N0cnVjdCBDMkhpZGxfUmFuZ2UgeworICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICB1aW50MzJfdCBsZW5ndGg7IC8vIERvIG5vdCB1c2UgInNpemUiIGJlY2F1c2UgdGhlIG5hbWUgY29sbGlkZXMgd2l0aCBDMkluZm86OnNpemUoKS4KK307Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkhpZGxfUmFuZ2UsIDA+IEMySGlkbF9SYW5nZUluZm87CisKK3N0cnVjdCBDMkhpZGxfUmVjdCB7CisgICAgdWludDMyX3QgbGVmdDsKKyAgICB1aW50MzJfdCB0b3A7CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworfTsKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMySGlkbF9SZWN0LCAxPiBDMkhpZGxfUmVjdEluZm87CisKKy8vIE1ha2UgYXNTdHJpbmcoKSBhbmQgb3BlcmF0b3I8PCB3b3JrIHdpdGggU3RhdHVzIGFzIHdlbGwgYXMgYzJfc3RhdHVzX3QuCitDMl9ERUNMQVJFX0FTX1NUUklOR19BTkRfREVGSU5FX1NUUkVBTV9PVVQoU3RhdHVzKTsKKworLyoqCisgKiBBbGwgb2JqY3B5KCkgZnVuY3Rpb25zIHdpbGwgcmV0dXJuIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlCisgKiBjb252ZXJzaW9uIHN1Y2NlZWRzIG9yIG5vdC4KKyAqLworCisvLyBDMlNldHRpbmdSZXN1bHQgLT4gU2V0dGluZ1Jlc3VsdAorYm9vbCBvYmpjcHkoCisgICAgICAgIFNldHRpbmdSZXN1bHQqIGQsCisgICAgICAgIGNvbnN0IEMyU2V0dGluZ1Jlc3VsdCYgcyk7CisKKy8vIFNldHRpbmdSZXN1bHQgLT4gc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4KK2Jvb2wgb2JqY3B5KAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiogZCwKKyAgICAgICAgY29uc3QgU2V0dGluZ1Jlc3VsdCYgcyk7CisKKy8vIEMyUGFyYW1EZXNjcmlwdG9yIC0+IFBhcmFtRGVzY3JpcHRvcgorYm9vbCBvYmpjcHkoCisgICAgICAgIFBhcmFtRGVzY3JpcHRvciogZCwKKyAgICAgICAgY29uc3QgQzJQYXJhbURlc2NyaXB0b3ImIHMpOworCisvLyBQYXJhbURlc2NyaXB0b3IgLT4gc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPgorYm9vbCBvYmpjcHkoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4qIGQsCisgICAgICAgIGNvbnN0IFBhcmFtRGVzY3JpcHRvciYgcyk7CisKKy8vIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAtPiBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Citib29sIG9iamNweSgKKyAgICAgICAgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSogZCwKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzKTsKKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAtPiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKK2Jvb2wgb2JqY3B5KAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkqIGQsCisgICAgICAgIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpOworCisvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgLT4gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdAorYm9vbCBvYmpjcHkoCisgICAgICAgIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQqIGQsCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSYgcyk7CisKKy8vIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnksIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQgLT4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Citib29sIG9iamNweSgKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzcSwKKyAgICAgICAgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCYgc3IpOworCisvLyBDMkNvbXBvbmVudDo6VHJhaXRzIC0+IENvbXBvbmVudFRyYWl0cworYm9vbCBvYmpjcHkoCisgICAgICAgIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzKiBkLAorICAgICAgICBjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzJiBzKTsKKworLy8gQ29tcG9uZW50VHJhaXRzIC0+IEMyQ29tcG9uZW50OjpUcmFpdHMKK2Jvb2wgb2JqY3B5KAorICAgICAgICBDMkNvbXBvbmVudDo6VHJhaXRzKiBkLAorICAgICAgICBjb25zdCBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0cyYgcyk7CisKKy8vIEMyU3RydWN0RGVzY3JpcHRvciAtPiBTdHJ1Y3REZXNjcmlwdG9yCitib29sIG9iamNweSgKKyAgICAgICAgU3RydWN0RGVzY3JpcHRvciogZCwKKyAgICAgICAgY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yJiBzKTsKKworLy8gU3RydWN0RGVzY3JpcHRvciAtPiBDMlN0cnVjdERlc2NyaXB0b3IKK2Jvb2wgb2JqY3B5KAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiogZCwKKyAgICAgICAgY29uc3QgU3RydWN0RGVzY3JpcHRvciYgcyk7CisKKy8vIEFic3RyYWN0IGNsYXNzIHRvIGJlIHVzZWQgaW4KKy8vIG9iamNweShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IC0+IFdvcmtCdW5kbGUpLgorc3RydWN0IEJ1ZmZlclBvb2xTZW5kZXIgeworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OgorICAgICAgICAgICAgUmVzdWx0U3RhdHVzIFJlc3VsdFN0YXR1czsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjoKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgQnVmZmVyU3RhdHVzTWVzc2FnZTsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjoKKyAgICAgICAgICAgIEJ1ZmZlclBvb2xEYXRhIEJ1ZmZlclBvb2xEYXRhOworCisgICAgLyoqCisgICAgICogU2VuZCBicERhdGEgYW5kIHJldHVybiBCdWZmZXJTdGF0dXNNZXNzYWdlIHRoYXQgY2FuIGJlIHN1cHBsaWVkIHRvCisgICAgICogSUNsaWVudE1hbmFnZXI6OnJlY2VpdmUoKSBpbiB0aGUgcmVjZWl2aW5nIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGZyb20gd2l0aGluIHRoZSBmdW5jdGlvbgorICAgICAqIG9iamNweShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IC0+IFdvcmtCdW5kbGUpLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBicERhdGEgQnVmZmVyUG9vbERhdGEgaWRlbnRpZnlpbmcgdGhlIGJ1ZmZlciB0byBzZW5kLgorICAgICAqIFxwYXJhbVtvdXRdIGJwTWVzc2FnZSBCdWZmZXJTdGF0dXNNZXNzYWdlIG9mIHRoZSB0cmFuc2FjdGlvbi4gSW5mb3JtYXRpb24KKyAgICAgKiAgICBpbnNpZGUgXHAgYnBNZXNzYWdlIHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIHJlY2VpdmluZyBwcm9jZXNzIGJ5IHNvbWUKKyAgICAgKiAgICBvdGhlciBtZWFucyBzbyBpdCBjYW4gY2FsbCByZWNlaXZlKCkgcHJvcGVybHkuCisgICAgICogXHJldHVybiBSZXN1bHRTdGF0dXMgdmFsdWUgdGhhdCBkZXRlcm1pbmVzIHRoZSBzdWNjZXNzIG9mIHRoZSBvcGVyYXRpb24uCisgICAgICogICAgKFNlZSB0aGUgcG9zc2libGUgdmFsdWVzIG9mIFJlc3VsdFN0YXR1cyBpbgorICAgICAqICAgIGhhcmR3YXJlL2ludGVyZmFjZXMvbWVkaWEvYnVmZmVycG9vbC8yLjAvdHlwZXMuaGFsLikKKyAgICAgKi8KKyAgICB2aXJ0dWFsIFJlc3VsdFN0YXR1cyBzZW5kKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiYgYnBEYXRhLAorICAgICAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSogYnBNZXNzYWdlKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5CdWZmZXJQb29sU2VuZGVyKCkgPSBkZWZhdWx0OworfTsKKworLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBCdWZmZXJQb29sU2VuZGVyLgorLy8KKy8vIFRvIHVzZSBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlciwgdGhlIElDbGllbnRNYW5hZ2VyIGluc3RhbmNlIG9mIHRoZSByZWNlaXZpbmcKKy8vIHByb2Nlc3MgbXVzdCBiZSBzZXQgYmVmb3JlIHNlbmQoKSBjYW4gb3BlcmF0ZS4gRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIgd2lsbAorLy8gaG9sZCBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhlIElDbGllbnRNYW5hZ2VyIGluc3RhbmNlIGFuZCB1c2UgaXQgdG8gY2FsbAorLy8gSUNsaWVudE1hbmFnZXI6OnJlZ2lzdGVyU2VuZGVyKCkgdG8gZXN0YWJsaXNoIHRoZSBidWZmZXJwb29sIGNvbm5lY3Rpb24gd2hlbgorLy8gc2VuZCgpIGlzIGNhbGxlZC4KK3N0cnVjdCBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlciA6IEJ1ZmZlclBvb2xTZW5kZXIgeworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICAgICAgICAgIENsaWVudE1hbmFnZXIgQ2xpZW50TWFuYWdlcjsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjoKKyAgICAgICAgICAgIElDbGllbnRNYW5hZ2VyIElDbGllbnRNYW5hZ2VyOworCisgICAgLy8gU2V0IHRoZSBJQ2xpZW50TWFuYWdlciBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2aW5nIHByb2Nlc3MgYW5kIHRoZSByZWZyZXNoCisgICAgLy8gaW50ZXJ2YWwgZm9yIHRoZSBjb25uZWN0aW9uLiBUaGUgZGVmYXVsdCBpbnRlcnZhbCBpcyA0LjUgc2Vjb25kcywgd2hpY2gKKyAgICAvLyBpcyBzbGlnaHRseSBzaG9ydGVyIHRoYW4gdGhlIGFtb3VudCBvZiB0aW1lIHRoZSBidWZmZXJwb29sIHdpbGwga2VlcCBhbgorICAgIC8vIGluYWN0aXZlIGNvbm5lY3Rpb24gZm9yLgorICAgIERlZmF1bHRCdWZmZXJQb29sU2VuZGVyKAorICAgICAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiByZWNlaXZlck1hbmFnZXIgPSBudWxscHRyLAorICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gcmVmcmVzaEludGVydmFsID0gNDUwMG1zKTsKKworICAgIC8vIFNldCB0aGUgSUNsaWVudE1hbmFnZXIgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmluZyBwcm9jZXNzIGFuZCB0aGUgcmVmcmVzaAorICAgIC8vIGludGVydmFsIGZvciB0aGUgY29ubmVjdGlvbi4gVGhlIGRlZmF1bHQgaW50ZXJ2YWwgaXMgNC41IHNlY29uZHMsIHdoaWNoCisgICAgLy8gaXMgc2xpZ2h0bHkgc2hvcnRlciB0aGFuIHRoZSBhbW91bnQgb2YgdGltZSB0aGUgYnVmZmVycG9vbCB3aWxsIGtlZXAgYW4KKyAgICAvLyBpbmFjdGl2ZSBjb25uZWN0aW9uIGZvci4KKyAgICB2b2lkIHNldFJlY2VpdmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiByZWNlaXZlck1hbmFnZXIsCisgICAgICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiByZWZyZXNoSW50ZXJ2YWwgPSA0NTAwbXMpOworCisgICAgLy8gSW1wbGVtZW50YXRpb24gb2YgQnVmZmVyUG9vbFNlbmRlcjo6c2VuZCgpLiBzZW5kKCkgd2lsbCBlc3RhYmxpc2ggYQorICAgIC8vIGJ1ZmZlcnBvb2wgY29ubmVjdGlvbiBpZiBuZWVkZWQsIHRoZW4gc2VuZCB0aGUgYnVmZmVycG9vbCBkYXRhIG92ZXIgdG8KKyAgICAvLyB0aGUgcmVjZWl2aW5nIHByb2Nlc3MuCisgICAgdmlydHVhbCBSZXN1bHRTdGF0dXMgc2VuZCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4mIGJwRGF0YSwKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UqIGJwTWVzc2FnZSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3A8Q2xpZW50TWFuYWdlcj4gbVNlbmRlck1hbmFnZXI7CisgICAgc3A8SUNsaWVudE1hbmFnZXI+IG1SZWNlaXZlck1hbmFnZXI7CisgICAgaW50NjRfdCBtUmVjZWl2ZXJDb25uZWN0aW9uSWQ7CisgICAgaW50NjRfdCBtU291cmNlQ29ubmVjdGlvbklkOworICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgbUxhc3RTZW50OworICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIG1SZWZyZXNoSW50ZXJ2YWw7Cit9OworCisvLyBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IC0+IFdvcmtCdW5kbGUKKy8vIE5vdGU6IElmIGJ1ZmZlcnBvb2wgd2lsbCBiZSB1c2VkLCBicFNlbmRlciBtdXN0IG5vdCBiZSBudWxsLgorYm9vbCBvYmpjcHkoCisgICAgICAgIFdvcmtCdW5kbGUqIGQsCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJwU2VuZGVyID0gbnVsbHB0cik7CisKKy8vIFdvcmtCdW5kbGUgLT4gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PgorYm9vbCBvYmpjcHkoCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGQsCisgICAgICAgIGNvbnN0IFdvcmtCdW5kbGUmIHMpOworCisvKioKKyAqIFBhcnNlcyBhIHBhcmFtcyBibG9iIGFuZCByZXR1cm5zIEMyUGFyYW0gcG9pbnRlcnMgdG8gaXRzIHBhcmFtcy4gVGhlIHBvaW50ZXJzCisgKiBwb2ludCB0byBsb2NhdGlvbnMgaW5zaWRlIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBvZiBccCBibG9iLiBJZiBccCBibG9iIGlzCisgKiBkZXN0cm95ZWQsIHRoZSBwb2ludGVycyBiZWNvbWUgaW52YWxpZC4KKyAqCisgKiBccGFyYW1bb3V0XSBwYXJhbXMgdGFyZ2V0IHZlY3RvciBvZiBDMlBhcmFtIHBvaW50ZXJzCisgKiBccGFyYW1baW5dIGJsb2IgcGFyYW1ldGVyIGJsb2IgdG8gcGFyc2UKKyAqIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgZnVsbCBibG9iIHdhcyBwYXJzZWQKKyAqIFxyZXR2YWwgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK2Jvb2wgcGFyc2VQYXJhbXNCbG9iKAorICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gKnBhcmFtcywKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJmJsb2IpOworCisvKioKKyAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgQzJQYXJhbXMgaW50byBhIHBhcmFtcyBibG9iLgorICoKKyAqIFxwYXJhbVtvdXRdIGJsb2IgdGFyZ2V0IGJsb2IKKyAqIFxwYXJhbVtpbl0gcGFyYW1zIHBhcmFtZXRlcnMgdG8gY29uY2F0ZW5hdGUKKyAqIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgYmxvYiB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQKKyAqIFxyZXR2YWwgZmFsc2UgaWYgdGhlIGJsb2Igd2FzIG5vdCBzdWNjZXNzZnVsICh0aGlzIG9ubHkgaGFwcGVucyBpZiB0aGUKKyAqICAgICAgICAgcGFyYW1ldGVycyB3ZXJlIG5vdCBjb25zdCkKKyAqLworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMpOworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmcGFyYW1zKTsKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiAmcGFyYW1zKTsKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+ICZwYXJhbXMpOworCisvKioKKyAqIFBhcnNlcyBhIHBhcmFtcyBibG9iIGFuZCBjcmVhdGUgYSB2ZWN0b3Igb2YgQzJQYXJhbXMgd2hvc2UgbWVtYmVycyBhcmUgY29waWVzCisgKiBvZiB0aGUgcGFyYW1zIGluIHRoZSBibG9iLgorICoKKyAqIFxwYXJhbVtvdXRdIHBhcmFtcyB0aGUgcmVzdWx0aW5nIHZlY3RvcgorICogXHBhcmFtW2luXSBibG9iIHBhcmFtZXRlciBibG9iIHRvIHBhcnNlCisgKiBccmV0dmFsIHRydWUgaWYgdGhlIGZ1bGwgYmxvYiB3YXMgcGFyc2VkIGFuZCBwYXJhbXMgd2FzIGNvbnN0cnVjdGVkCisgKiBccmV0dmFsIGZhbHNlIG90aGVyd2lzZQorICovCitib29sIGNvcHlQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogcGFyYW1zLAorICAgICAgICBQYXJhbXMgYmxvYik7Citib29sIGNvcHlQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyVHVuaW5nPj4qIHBhcmFtcywKKyAgICAgICAgUGFyYW1zIGJsb2IpOworCisvKioKKyAqIFBhcnNlcyBhIHBhcmFtcyBibG9iIGFuZCBhcHBsaWVzIHVwZGF0ZXMgdG8gcGFyYW1zLgorICoKKyAqIFxwYXJhbVtpbixvdXRdIHBhcmFtcyBwYXJhbXMgdG8gYmUgdXBkYXRlZAorICogXHBhcmFtW2luXSBibG9iIHBhcmFtZXRlciBibG9iIGNvbnRhaW5pbmcgdXBkYXRlcworICogXHJldHZhbCB0cnVlIGlmIHRoZSBmdWxsIGJsb2Igd2FzIHBhcnNlZCBhbmQgcGFyYW1zIHdhcyB1cGRhdGVkCisgKiBccmV0dmFsIGZhbHNlIG90aGVyd2lzZQorICovCitib29sIHVwZGF0ZVBhcmFtc0Zyb21CbG9iKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIHBhcmFtcywKKyAgICAgICAgY29uc3QgUGFyYW1zJiBibG9iKTsKKworLyoqCisgKiBDb252ZXJ0cyBhIEJ1ZmZlclBvb2wgc3RhdHVzIHZhbHVlIHRvIGMyX3N0YXR1c190LgorICogXHBhcmFtIEJ1ZmZlclBvb2wgc3RhdHVzCisgKiBccmV0dXJuIENvcnJlc3BvbmRpbmcgYzJfc3RhdHVzX3QKKyAqLworYzJfc3RhdHVzX3QgdG9DMlN0YXR1cyg6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgIFJlc3VsdFN0YXR1cyBycyk7CisKKy8vIEJ1ZmZlclF1ZXVlLUJhc2VkIEJsb2NrIE9wZXJhdGlvbnMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gQ3JlYXRlIGEgR3JhcGhpY0J1ZmZlciBvYmplY3QgZnJvbSBhIGdyYXBoaWMgYmxvY2sgYW5kIGF0dGFjaCBpdCB0byBhbgorLy8gSUdyYXBoaWNCdWZmZXJQcm9kdWNlci4KK3N0YXR1c190IGF0dGFjaFRvQnVmZmVyUXVldWUoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBicVNsb3QpOworCisvLyBSZXR1cm4gZmFsc2UgaWYgYmxvY2sgZG9lcyBub3QgY29tZSBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQgYmxvY2twb29sLgorLy8gT3RoZXJ3aXNlLCBleHRyYWN0IGdlbmVyYXRpb24sIGJxSWQgYW5kIGJxU2xvdCBhbmQgcmV0dXJuIHRydWUuCitib29sIGdldEJ1ZmZlclF1ZXVlQXNzaWdubWVudChjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBicVNsb3QpOworCisvLyBEaXNhc3NvY2lhdGUgdGhlIGdpdmVuIGJsb2NrIHdpdGggaXRzIGRlc2lnbmF0ZWQgYnVmZmVycXVldWUgc28gdGhhdAorLy8gY2FuY2VsQnVmZmVyKCkgd2lsbCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIGJsb2NrIGlzIGRlc3Ryb3llZC4gSWYgdGhlIGJsb2NrCisvLyBkb2VzIG5vdCBoYXZlIGEgZGVzaWduYXRlZCBidWZmZXJxdWV1ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UuCisvLyBPdGhlcndpc2UsIGl0IHJldHVybnMgdHJ1ZS4KKy8vCisvLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYXR0YWNoQnVmZmVyKCkgb3IgcXVldWVCdWZmZXIoKSBpcworLy8gY2FsbGVkIG1hbnVhbGx5LgorYm9vbCB5aWVsZEJ1ZmZlclF1ZXVlQmxvY2soY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2spOworCisvLyBDYWxsIHlpZWxkQnVmZmVyUXVldWVCbG9jaygpIG9uIGJsb2NrcyBpbiB0aGUgZ2l2ZW4gd29ya0xpc3QuIHByb2Nlc3NJbnB1dAorLy8gZGV0ZXJtaW5lcyB3aGV0aGVyIGlucHV0IGJsb2NrcyBhcmUgeWllbGRlZC4gcHJvY2Vzc091dHB1dCB3b3JrcyBzaW1pbGFybHkgb24KKy8vIG91dHB1dCBibG9ja3MuIChUaGUgZGVmYXVsdCB2YWx1ZSBvZiBwcm9jZXNzSW5wdXQgaXMgZmFsc2Ugd2hpbGUgdGhlIGRlZmF1bHQKKy8vIHZhbHVlIG9mIHByb2Nlc3NPdXRwdXQgaXMgdHJ1ZS4gVGhpcyBpbXBsaWVzIHRoYXQgaW4gbW9zdCBjYXNlcywgb25seSBvdXRwdXQKKy8vIGJ1ZmZlcnMgY29udGFpbiBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3MuKQorLy8KKy8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBXb3JrQnVuZGxlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQorLy8gc2VudCBvdmVyIHRoZSBUcmVibGUgYm91bmRhcnkgdG8gYW5vdGhlciBwcm9jZXNzLgordm9pZCB5aWVsZEJ1ZmZlclF1ZXVlQmxvY2tzKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJvY2Vzc0lucHV0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm9jZXNzT3V0cHV0ID0gdHJ1ZSk7CisKKy8vIEFzc2lnbiB0aGUgZ2l2ZW4gYmxvY2sgdG8gYSBidWZmZXJxdWV1ZSBzbyB0aGF0IHdoZW4gdGhlIGJsb2NrIGlzIGRlc3Ryb3llZCwKKy8vIGNhbmNlbEJ1ZmZlcigpIHdpbGwgYmUgY2FsbGVkLgorLy8KKy8vIElmIHRoZSBibG9jayBkb2VzIG5vdCBjb21lIGZyb20gYSBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3Bvb2wsIHRoaXMgZnVuY3Rpb24KKy8vIHJldHVybnMgZmFsc2UuCisvLworLy8gSWYgdGhlIGJsb2NrIGFscmVhZHkgaGFzIGEgYnVmZmVycXVldWUgYXNzaWdubWVudCB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIG9uZSwKKy8vIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUuCisvLworLy8gSWYgdGhlIGJsb2NrIGFscmVhZHkgaGFzIGEgYnVmZmVycXVldWUgYXNzaWdubWVudCB0aGF0IGRvZXMgbm90IG1hdGNoIHRoZQorLy8gZ2l2ZW4gb25lLCB0aGUgYmxvY2sgd2lsbCBiZSByZWFzc2lnbmVkIHRvIHRoZSBnaXZlbiBidWZmZXJxdWV1ZS4gVGhpcworLy8gd2lsbCBjYWxsIGF0dGFjaEJ1ZmZlcigpIG9uIHRoZSBnaXZlbiBpZ2JwLiBUaGUgZnVuY3Rpb24gdGhlbiByZXR1cm5zIHRydWUgb24KKy8vIHN1Y2Nlc3Mgb3IgZmFsc2Ugb24gYW55IGZhaWx1cmUgZHVyaW5nIHRoZSBvcGVyYXRpb24uCisvLworLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGRldGFjaEJ1ZmZlcigpIG9yIGRlcXVldWVCdWZmZXIoKQorLy8gaXMgY2FsbGVkIG1hbnVhbGx5LgorYm9vbCBob2xkQnVmZmVyUXVldWVCbG9jayhjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24pOworCisvLyBDYWxsIGhvbGRCdWZmZXJRdWV1ZUJsb2NrKCkgb24gaW5wdXQgb3Igb3V0cHV0IGJsb2NrcyBpbiB0aGUgZ2l2ZW4gd29ya0xpc3QuCisvLyBTaW5jZSB0aGUgYnVmZmVycXVldWUgYXNzaWdubWVudCBmb3IgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGNhbiBiZQorLy8gZGlmZmVyZW50LCB0aGlzIGZ1bmN0aW9uIHRha2VzIGZvcklucHV0IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbgorLy8gYnVmZmVycXVldWUgaXMgZm9yIGlucHV0IGJ1ZmZlcnMgb3Igb3V0cHV0IGJ1ZmZlcnMuIChUaGUgZGVmYXVsdCB2YWx1ZSBvZgorLy8gZm9ySW5wdXQgaXMgZmFsc2UuKQorLy8KKy8vIEluIHRoZSAocmFyZSkgY2FzZSB0aGF0IGJvdGggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBidWZmZXJxdWV1ZS1iYXNlZCwKKy8vIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgdHdpY2UsIG9uY2UgZm9yIHRoZSBpbnB1dCBidWZmZXJzIGFuZCBvbmNlIGZvcgorLy8gdGhlIG91dHB1dCBidWZmZXJzLgorLy8KKy8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBXb3JrQnVuZGxlIGhhcyBiZWVuIHJlY2VpdmVkIGZyb20KKy8vIGFub3RoZXIgcHJvY2Vzcy4KK3ZvaWQgaG9sZEJ1ZmZlclF1ZXVlQmxvY2tzKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBicUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9ySW5wdXQgPSBmYWxzZSk7CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19UWVBFU19ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvdHlwZXMuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL3R5cGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDNiY2I1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL3R5cGVzLmNwcApAQCAtMCwwICsxLDE5NDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLXR5cGVzIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisjaW5jbHVkZSA8dXRpbC9DMlBhcmFtVXRpbHMuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpCdWZmZXJTdGF0dXNNZXNzYWdlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgICAgIENsaWVudE1hbmFnZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OgorICAgICAgICBUcmFuc2FjdGlvbklkOwordXNpbmcgOjphbmRyb2lkOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworY29uc3QgY2hhciogYXNTdHJpbmcoU3RhdHVzIHN0YXR1cywgY29uc3QgY2hhciogZGVmKSB7CisgICAgcmV0dXJuIGFzU3RyaW5nKHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0dXMpLCBkZWYpOworfQorCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbnVtQ2xhc3M+Cit0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFbnVtQ2xhc3M+Ojp0eXBlIHVuZGVybHlpbmdfdmFsdWUoCisgICAgICAgIEVudW1DbGFzcyB4KSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEVudW1DbGFzcz46OnR5cGU+KHgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29tbW9uLCB0eXBlbmFtZSBEc3RWZWN0b3IsIHR5cGVuYW1lIFNyY1ZlY3Rvcj4KK3ZvaWQgY29weVZlY3RvcihEc3RWZWN0b3IqIGQsIGNvbnN0IFNyY1ZlY3RvciYgcykgeworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKENvbW1vbikgPT0gc2l6ZW9mKGRlY2x0eXBlKCgqZClbMF0pKSwKKyAgICAgICAgICAgICJEc3RWZWN0b3IncyBjb21wb25lbnQgc2l6ZSBkb2VzIG5vdCBtYXRjaCBDb21tb24iKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDb21tb24pID09IHNpemVvZihkZWNsdHlwZShzWzBdKSksCisgICAgICAgICAgICAiU3JjVmVjdG9yJ3MgY29tcG9uZW50IHNpemUgZG9lcyBub3QgbWF0Y2ggQ29tbW9uIik7CisgICAgZC0+cmVzaXplKHMuc2l6ZSgpKTsKKyAgICBzdGQ6OmNvcHkoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IENvbW1vbio+KCZzWzBdKSwKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ29tbW9uKj4oJnNbMF0gKyBzLnNpemUoKSksCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PENvbW1vbio+KCYoKmQpWzBdKSk7Cit9CisKKy8vIEMyUGFyYW1GaWVsZCAtPiBQYXJhbUZpZWxkCitib29sIG9iamNweShQYXJhbUZpZWxkICpkLCBjb25zdCBDMlBhcmFtRmllbGQgJnMpIHsKKyAgICBkLT5pbmRleCA9IHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRJbmRleChzKSk7CisgICAgZC0+ZmllbGRJZC5vZmZzZXQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChzKSk7CisgICAgZC0+ZmllbGRJZC5zaXplID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKHMpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RydWN0IEMyUGFyYW1GaWVsZEJ1aWxkZXIgOiBwdWJsaWMgQzJQYXJhbUZpZWxkIHsKKyAgICBDMlBhcmFtRmllbGRCdWlsZGVyKCkgOiBDMlBhcmFtRmllbGQoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxDMlBhcmFtOjpJbmRleD4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDApKSwgMCwgMCkgeworICAgIH0KKyAgICAvLyBQYXJhbUZpZWxkIC0+IEMyUGFyYW1GaWVsZAorICAgIEMyUGFyYW1GaWVsZEJ1aWxkZXIoY29uc3QgUGFyYW1GaWVsZCYgcykgOiBDMlBhcmFtRmllbGQoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxDMlBhcmFtOjpJbmRleD4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHMuaW5kZXgpKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzLmZpZWxkSWQub2Zmc2V0KSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzLmZpZWxkSWQuc2l6ZSkpIHsKKyAgICB9Cit9OworCisvLyBDMldvcmtPcmRpbmFsU3RydWN0IC0+IFdvcmtPcmRpbmFsCitib29sIG9iamNweShXb3JrT3JkaW5hbCAqZCwgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmcykgeworICAgIGQtPmZyYW1lSW5kZXggPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIGQtPnRpbWVzdGFtcFVzID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHMudGltZXN0YW1wLnBlZWt1KCkpOworICAgIGQtPmN1c3RvbU9yZGluYWwgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy5jdXN0b21PcmRpbmFsLnBlZWt1KCkpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBXb3JrT3JkaW5hbCAtPiBDMldvcmtPcmRpbmFsU3RydWN0Citib29sIG9iamNweShDMldvcmtPcmRpbmFsU3RydWN0ICpkLCBjb25zdCBXb3JrT3JkaW5hbCAmcykgeworICAgIGQtPmZyYW1lSW5kZXggPSBjMl9jbnRyNjRfdChzLmZyYW1lSW5kZXgpOworICAgIGQtPnRpbWVzdGFtcCA9IGMyX2NudHI2NF90KHMudGltZXN0YW1wVXMpOworICAgIGQtPmN1c3RvbU9yZGluYWwgPSBjMl9jbnRyNjRfdChzLmN1c3RvbU9yZGluYWwpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpyYW5nZSdzIHR5cGUgLT4gRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJhbmdlCitib29sIG9iamNweSgKKyAgICAgICAgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJhbmdlKiBkLAorICAgICAgICBjb25zdCBkZWNsdHlwZShDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpyYW5nZSkmIHMpIHsKKyAgICBkLT5taW4gPSBzdGF0aWNfY2FzdDxQcmltaXRpdmVWYWx1ZT4ocy5taW4udTY0KTsKKyAgICBkLT5tYXggPSBzdGF0aWNfY2FzdDxQcmltaXRpdmVWYWx1ZT4ocy5tYXgudTY0KTsKKyAgICBkLT5zdGVwID0gc3RhdGljX2Nhc3Q8UHJpbWl0aXZlVmFsdWU+KHMuc3RlcC51NjQpOworICAgIGQtPm51bSA9IHN0YXRpY19jYXN0PFByaW1pdGl2ZVZhbHVlPihzLm51bS51NjQpOworICAgIGQtPmRlbm9tID0gc3RhdGljX2Nhc3Q8UHJpbWl0aXZlVmFsdWU+KHMuZGVub20udTY0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAtPiBGaWVsZFN1cHBvcnRlZFZhbHVlcworYm9vbCBvYmpjcHkoRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKmQsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnMpIHsKKyAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RU1QVFk6CisgICAgICAgIGQtPnR5cGUgPSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6RU1QVFk7CisgICAgICAgIGQtPnZhbHVlcy5yZXNpemUoMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UkFOR0U6CisgICAgICAgIGQtPnR5cGUgPSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6UkFOR0U7CisgICAgICAgIGlmICghb2JqY3B5KCZkLT5yYW5nZSwgcy5yYW5nZSkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6cmFuZ2UuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBkLT52YWx1ZXMucmVzaXplKDApOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUzoKKyAgICAgICAgICAgIGQtPnR5cGUgPSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6VkFMVUVTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RkxBR1M6CisgICAgICAgICAgICBkLT50eXBlID0gRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU6OkZMQUdTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy50eXBlKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgICAgICBkLT50eXBlID0gc3RhdGljX2Nhc3Q8RmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU+KHMudHlwZSk7CisgICAgICAgICAgICBpZiAoIW9iamNweSgmZC0+cmFuZ2UsIHMucmFuZ2UpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpyYW5nZS4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb3B5VmVjdG9yPHVpbnQ2NF90PigmZC0+dmFsdWVzLCBzLnZhbHVlcyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBGaWVsZFN1cHBvcnRlZFZhbHVlczo6UmFuZ2UgLT4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6cmFuZ2UncyB0eXBlCitib29sIG9iamNweSgKKyAgICAgICAgZGVjbHR5cGUoQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6cmFuZ2UpKiBkLAorICAgICAgICBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlczo6UmFuZ2UmIHMpIHsKKyAgICBkLT5taW4udTY0ID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHMubWluKTsKKyAgICBkLT5tYXgudTY0ID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHMubWF4KTsKKyAgICBkLT5zdGVwLnU2NCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzLnN0ZXApOworICAgIGQtPm51bS51NjQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy5udW0pOworICAgIGQtPmRlbm9tLnU2NCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzLmRlbm9tKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXMgLT4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcworYm9vbCBvYmpjcHkoQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAqZCwgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnMpIHsKKyAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgIGNhc2UgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU6OkVNUFRZOgorICAgICAgICBkLT50eXBlID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RU1QVFk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlR5cGU6OlJBTkdFOgorICAgICAgICBkLT50eXBlID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UkFOR0U7CisgICAgICAgIGlmICghb2JqY3B5KCZkLT5yYW5nZSwgcy5yYW5nZSkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZC0+dmFsdWVzLnJlc2l6ZSgwKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3dpdGNoIChzLnR5cGUpIHsKKyAgICAgICAgY2FzZSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6VHlwZTo6VkFMVUVTOgorICAgICAgICAgICAgZC0+dHlwZSA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpUeXBlOjpGTEFHUzoKKyAgICAgICAgICAgIGQtPnR5cGUgPSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiVW5yZWNvZ25pemVkIEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpUeXBlICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy50eXBlKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgICAgICBkLT50eXBlID0gc3RhdGljX2Nhc3Q8QzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90PihzLnR5cGUpOworICAgICAgICAgICAgaWYgKCFvYmpjcHkoJmQtPnJhbmdlLCBzLnJhbmdlKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvcHlWZWN0b3I8dWludDY0X3Q+KCZkLT52YWx1ZXMsIHMudmFsdWVzKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IC0+IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKK2Jvb2wgb2JqY3B5KAorICAgICAgICBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpIHsKKyAgICBpZiAoIW9iamNweSgmZC0+ZmllbGQsIHMuZmllbGQoKSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OmZpZWxkLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3dpdGNoIChzLnR5cGUoKSkgeworICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQT1NTSUJMRToKKyAgICAgICAgZC0+dHlwZSA9IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlR5cGU6OlBPU1NJQkxFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q1VSUkVOVDoKKyAgICAgICAgZC0+dHlwZSA9IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlR5cGU6OkNVUlJFTlQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OnR5cGVfdCAiCisgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy50eXBlKCkpCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICBkLT50eXBlID0gc3RhdGljX2Nhc3Q8RmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6VHlwZT4ocy50eXBlKCkpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAtPiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKK2Jvb2wgb2JqY3B5KAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkqIGQsCisgICAgICAgIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpIHsKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OnR5cGVfdCBkVHlwZTsKKyAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgIGNhc2UgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6VHlwZTo6UE9TU0lCTEU6CisgICAgICAgIGRUeXBlID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQT1NTSUJMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpUeXBlOjpDVVJSRU5UOgorICAgICAgICBkVHlwZSA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q1VSUkVOVDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiVW5yZWNvZ25pemVkIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlR5cGUgIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMudHlwZSkKKyAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgIGRUeXBlID0gc3RhdGljX2Nhc3Q8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Ojp0eXBlX3Q+KHMudHlwZSk7CisgICAgfQorICAgICpkID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KEMyUGFyYW1GaWVsZEJ1aWxkZXIocy5maWVsZCksIGRUeXBlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IC0+IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQKK2Jvb2wgb2JqY3B5KAorICAgICAgICBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0KiBkLAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpIHsKKyAgICBkLT5zdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KHMuc3RhdHVzKTsKKyAgICByZXR1cm4gb2JqY3B5KCZkLT52YWx1ZXMsIHMudmFsdWVzKTsKK30KKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSwgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCAtPgorLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Citib29sIG9iamNweSgKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzcSwKKyAgICAgICAgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCYgc3IpIHsKKyAgICBpZiAoIW9iamNweShkLCBzcSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5LiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZC0+c3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHNyLnN0YXR1cyk7CisgICAgaWYgKCFvYmpjcHkoJmQtPnZhbHVlcywgc3IudmFsdWVzKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQ6OnZhbHVlcy4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkNvbXBvbmVudDo6VHJhaXRzIC0+IElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzCitib29sIG9iamNweSgKKyAgICAgICAgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHMgKmQsCisgICAgICAgIGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHMgJnMpIHsKKyAgICBkLT5uYW1lID0gcy5uYW1lOworCisgICAgc3dpdGNoIChzLmRvbWFpbikgeworICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTzoKKyAgICAgICAgZC0+ZG9tYWluID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbjo6VklERU87CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTzoKKyAgICAgICAgZC0+ZG9tYWluID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbjo6QVVESU87CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRToKKyAgICAgICAgZC0+ZG9tYWluID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbjo6SU1BR0U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUjoKKyAgICAgICAgZC0+ZG9tYWluID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbjo6T1RIRVI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBDMkNvbXBvbmVudDo6ZG9tYWluX3QgIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMuZG9tYWluKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgZC0+ZG9tYWluID0gc3RhdGljX2Nhc3Q8SUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbj4oCisgICAgICAgICAgICAgICAgcy5kb21haW4pOworICAgIH0KKworICAgIHN3aXRjaCAocy5raW5kKSB7CisgICAgY2FzZSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSOgorICAgICAgICBkLT5raW5kID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OktpbmQ6OkRFQ09ERVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjoKKyAgICAgICAgZC0+a2luZCA9IElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpLaW5kOjpFTkNPREVSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpLSU5EX09USEVSOgorICAgICAgICBkLT5raW5kID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OktpbmQ6Ok9USEVSOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgQzJDb21wb25lbnQ6OmtpbmRfdCAiCisgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy5raW5kKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgZC0+a2luZCA9IHN0YXRpY19jYXN0PElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpLaW5kPigKKyAgICAgICAgICAgICAgICBzLmtpbmQpOworICAgIH0KKworICAgIGQtPnJhbmsgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5yYW5rKTsKKworICAgIGQtPm1lZGlhVHlwZSA9IHMubWVkaWFUeXBlOworCisgICAgZC0+YWxpYXNlcy5yZXNpemUocy5hbGlhc2VzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaXggPSBzLmFsaWFzZXMuc2l6ZSgpOyBpeCA+IDA7ICkgeworICAgICAgICAtLWl4OworICAgICAgICBkLT5hbGlhc2VzW2l4XSA9IHMuYWxpYXNlc1tpeF07CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDb21wb25lbnRUcmFpdHMgLT4gQzJDb21wb25lbnQ6OlRyYWl0cywgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4KK2Jvb2wgb2JqY3B5KAorICAgICAgICBDMkNvbXBvbmVudDo6VHJhaXRzKiBkLAorICAgICAgICBjb25zdCBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0cyYgcykgeworICAgIGQtPm5hbWUgPSBzLm5hbWUuY19zdHIoKTsKKworICAgIHN3aXRjaCAocy5kb21haW4pIHsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46OlZJREVPOgorICAgICAgICBkLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46OkFVRElPOgorICAgICAgICBkLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46OklNQUdFOgorICAgICAgICBkLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46Ok9USEVSOgorICAgICAgICBkLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgQ29tcG9uZW50VHJhaXRzOjpEb21haW4gIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMuZG9tYWluKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgZC0+ZG9tYWluID0gc3RhdGljX2Nhc3Q8QzJDb21wb25lbnQ6OmRvbWFpbl90PihzLmRvbWFpbik7CisgICAgfQorCisgICAgc3dpdGNoIChzLmtpbmQpIHsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpLaW5kOjpERUNPREVSOgorICAgICAgICBkLT5raW5kID0gQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6S2luZDo6RU5DT0RFUjoKKyAgICAgICAgZC0+a2luZCA9IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OktpbmQ6Ok9USEVSOgorICAgICAgICBkLT5raW5kID0gQzJDb21wb25lbnQ6OktJTkRfT1RIRVI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBDb21wb25lbnRUcmFpdHM6OktpbmQgIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMua2luZCkKKyAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgIGQtPmtpbmQgPSBzdGF0aWNfY2FzdDxDMkNvbXBvbmVudDo6a2luZF90PihzLmtpbmQpOworICAgIH0KKworICAgIGQtPnJhbmsgPSBzdGF0aWNfY2FzdDxDMkNvbXBvbmVudDo6cmFua190PihzLnJhbmspOworICAgIGQtPm1lZGlhVHlwZSA9IHMubWVkaWFUeXBlLmNfc3RyKCk7CisgICAgZC0+YWxpYXNlcy5yZXNpemUocy5hbGlhc2VzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzLmFsaWFzZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgZC0+YWxpYXNlc1tpXSA9IHMuYWxpYXNlc1tpXTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworLy8gQzJQYXJhbUZpZWxkVmFsdWVzIC0+IFBhcmFtRmllbGRWYWx1ZXMKK2Jvb2wgb2JqY3B5KFBhcmFtRmllbGRWYWx1ZXMgKmQsIGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlcyAmcykgeworICAgIGlmICghb2JqY3B5KCZkLT5wYXJhbU9yRmllbGQsIHMucGFyYW1PckZpZWxkKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyUGFyYW1GaWVsZFZhbHVlczo6cGFyYW1PckZpZWxkLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHMudmFsdWVzKSB7CisgICAgICAgIGQtPnZhbHVlcy5yZXNpemUoMSk7CisgICAgICAgIGlmICghb2JqY3B5KCZkLT52YWx1ZXNbMF0sICpzLnZhbHVlcykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJQYXJhbUZpZWxkVmFsdWVzOjp2YWx1ZXMuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZC0+dmFsdWVzLnJlc2l6ZSgwKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUGFyYW1GaWVsZFZhbHVlcyAtPiBDMlBhcmFtRmllbGRWYWx1ZXMKK2Jvb2wgb2JqY3B5KEMyUGFyYW1GaWVsZFZhbHVlcyAqZCwgY29uc3QgUGFyYW1GaWVsZFZhbHVlcyAmcykgeworICAgIGQtPnBhcmFtT3JGaWVsZCA9IEMyUGFyYW1GaWVsZEJ1aWxkZXIocy5wYXJhbU9yRmllbGQpOworICAgIGlmIChzLnZhbHVlcy5zaXplKCkgPT0gMSkgeworICAgICAgICBkLT52YWx1ZXMgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+KCk7CisgICAgICAgIGlmICghb2JqY3B5KGQtPnZhbHVlcy5nZXQoKSwgcy52YWx1ZXNbMF0pKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFBhcmFtRmllbGRWYWx1ZXM6OnZhbHVlcy4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocy52YWx1ZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgZC0+dmFsdWVzLnJlc2V0KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFBhcmFtRmllbGRWYWx1ZXM6ICIKKyAgICAgICAgICAgICAgICAgICJUd28gb3IgbW9yZSBGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3RzIGV4aXN0IGluICIKKyAgICAgICAgICAgICAgICAgICJQYXJhbUZpZWxkVmFsdWVzLiAiCisgICAgICAgICAgICAgICAgICAiT25seSB6ZXJvIG9yIG9uZSBpcyBhbGxvd2VkLiI7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIEMyU2V0dGluZ1Jlc3VsdCAtPiBTZXR0aW5nUmVzdWx0Citib29sIG9iamNweShTZXR0aW5nUmVzdWx0ICpkLCBjb25zdCBDMlNldHRpbmdSZXN1bHQgJnMpIHsKKyAgICBzd2l0Y2ggKHMuZmFpbHVyZSkgeworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpCQURfVFlQRToKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9UWVBFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1BPUlQ6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfUE9SVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OkJBRF9JTkRFWDoKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9JTkRFWDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OlJFQURfT05MWToKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OlJFQURfT05MWTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6Ok1JU01BVENIOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6TUlTTUFUQ0g7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpCQURfVkFMVUU6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfVkFMVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpDT05GTElDVDoKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkNPTkZMSUNUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6VU5TVVBQT1JURUQ6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpVTlNVUFBPUlRFRDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OklORk9fQkFEX1ZBTFVFOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6SU5GT19CQURfVkFMVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpJTkZPX0NPTkZMSUNUOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6SU5GT19DT05GTElDVDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiVW5yZWNvZ25pemVkIEMyU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZSAiCisgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy5mYWlsdXJlKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgZC0+ZmFpbHVyZSA9IHN0YXRpY19jYXN0PFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU+KHMuZmFpbHVyZSk7CisgICAgfQorICAgIGlmICghb2JqY3B5KCZkLT5maWVsZCwgcy5maWVsZCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMlNldHRpbmdSZXN1bHQ6OmZpZWxkLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZC0+Y29uZmxpY3RzLnJlc2l6ZShzLmNvbmZsaWN0cy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlcyYgc0NvbmZsaWN0IDogcy5jb25mbGljdHMpIHsKKyAgICAgICAgUGFyYW1GaWVsZFZhbHVlcyAmZENvbmZsaWN0ID0gZC0+Y29uZmxpY3RzW2krK107CisgICAgICAgIGlmICghb2JqY3B5KCZkQ29uZmxpY3QsIHNDb25mbGljdCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJTZXR0aW5nUmVzdWx0Ojpjb25mbGljdHNbIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBpIC0gMSA8PCAiXS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBTZXR0aW5nUmVzdWx0IC0+IHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+Citib29sIG9iamNweShzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiAqZCwgY29uc3QgU2V0dGluZ1Jlc3VsdCAmcykgeworICAgICpkID0gc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4obmV3IEMyU2V0dGluZ1Jlc3VsdCB7CisgICAgICAgICAgICAuZmllbGQgPSBDMlBhcmFtRmllbGRWYWx1ZXMoQzJQYXJhbUZpZWxkQnVpbGRlcigpKSB9KTsKKyAgICBpZiAoISpkKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIG1lbW9yeSBmb3IgQzJTZXR0aW5nUmVzdWx0LiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBmYWlsdXJlCisgICAgc3dpdGNoIChzLmZhaWx1cmUpIHsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9UWVBFOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpCQURfVFlQRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfUE9SVDoKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1BPUlQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6QkFEX0lOREVYOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpCQURfSU5ERVg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6UkVBRF9PTkxZOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpSRUFEX09OTFk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6TUlTTUFUQ0g6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6Ok1JU01BVENIOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9WQUxVRToKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1ZBTFVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkNPTkZMSUNUOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpDT05GTElDVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpVTlNVUFBPUlRFRDoKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6VU5TVVBQT1JURUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6SU5GT19CQURfVkFMVUU6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OklORk9fQkFEX1ZBTFVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OklORk9fQ09ORkxJQ1Q6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OklORk9fQ09ORkxJQ1Q7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlICIKKyAgICAgICAgICAgICAgICAgICA8PCAid2l0aCB1bmRlcmx5aW5nIHZhbHVlICIgPDwgdW5kZXJseWluZ192YWx1ZShzLmZhaWx1cmUpCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAoKmQpLT5mYWlsdXJlID0gc3RhdGljX2Nhc3Q8QzJTZXR0aW5nUmVzdWx0OjpGYWlsdXJlPihzLmZhaWx1cmUpOworICAgIH0KKworICAgIC8vIGZpZWxkCisgICAgaWYgKCFvYmpjcHkoJigqZCktPmZpZWxkLCBzLmZpZWxkKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFNldHRpbmdSZXN1bHQ6OmZpZWxkLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBjb25mbGljdHMKKyAgICAoKmQpLT5jb25mbGljdHMuY2xlYXIoKTsKKyAgICAoKmQpLT5jb25mbGljdHMucmVzZXJ2ZShzLmNvbmZsaWN0cy5zaXplKCkpOworICAgIGZvciAoY29uc3QgUGFyYW1GaWVsZFZhbHVlcyYgc0NvbmZsaWN0IDogcy5jb25mbGljdHMpIHsKKyAgICAgICAgKCpkKS0+Y29uZmxpY3RzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICBDMlBhcmFtRmllbGRWYWx1ZXN7IEMyUGFyYW1GaWVsZEJ1aWxkZXIoKSwgbnVsbHB0ciB9KTsKKyAgICAgICAgaWYgKCFvYmpjcHkoJigqZCktPmNvbmZsaWN0cy5iYWNrKCksIHNDb25mbGljdCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgU2V0dGluZ1Jlc3VsdDo6Y29uZmxpY3RzLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEMyUGFyYW1EZXNjcmlwdG9yIC0+IFBhcmFtRGVzY3JpcHRvcgorYm9vbCBvYmpjcHkoUGFyYW1EZXNjcmlwdG9yICpkLCBjb25zdCBDMlBhcmFtRGVzY3JpcHRvciAmcykgeworICAgIGQtPmluZGV4ID0gc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4ocy5pbmRleCgpKTsKKyAgICBkLT5hdHRyaWIgPSBzdGF0aWNfY2FzdDxoaWRsX2JpdGZpZWxkPFBhcmFtRGVzY3JpcHRvcjo6QXR0cmliPj4oCisgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0QXR0cmliKHMpKTsKKyAgICBkLT5uYW1lID0gcy5uYW1lKCk7CisgICAgY29weVZlY3Rvcjx1aW50MzJfdD4oJmQtPmRlcGVuZGVuY2llcywgcy5kZXBlbmRlbmNpZXMoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFBhcmFtRGVzY3JpcHRvciAtPiBDMlBhcmFtRGVzY3JpcHRvcgorYm9vbCBvYmpjcHkoc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiAqZCwgY29uc3QgUGFyYW1EZXNjcmlwdG9yICZzKSB7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGREZXBlbmRlbmNpZXM7CisgICAgZERlcGVuZGVuY2llcy5yZXNlcnZlKHMuZGVwZW5kZW5jaWVzLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBQYXJhbUluZGV4JiBzRGVwZW5kZW5jeSA6IHMuZGVwZW5kZW5jaWVzKSB7CisgICAgICAgIGREZXBlbmRlbmNpZXMuZW1wbGFjZV9iYWNrKHN0YXRpY19jYXN0PHVpbnQzMl90PihzRGVwZW5kZW5jeSkpOworICAgIH0KKyAgICAqZCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQYXJhbURlc2NyaXB0b3I+KAorICAgICAgICAgICAgQzJQYXJhbTo6SW5kZXgoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHMuaW5kZXgpKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdD4ocy5hdHRyaWIpLAorICAgICAgICAgICAgQzJTdHJpbmcocy5uYW1lLmNfc3RyKCkpLAorICAgICAgICAgICAgc3RkOjptb3ZlKGREZXBlbmRlbmNpZXMpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJTdHJ1Y3REZXNjcmlwdG9yIC0+IFN0cnVjdERlc2NyaXB0b3IKK2Jvb2wgb2JqY3B5KFN0cnVjdERlc2NyaXB0b3IgKmQsIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvciAmcykgeworICAgIGQtPnR5cGUgPSBzdGF0aWNfY2FzdDxQYXJhbUluZGV4PihzLmNvcmVJbmRleCgpLmNvcmVJbmRleCgpKTsKKyAgICBkLT5maWVsZHMucmVzaXplKHMubnVtRmllbGRzKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHNGaWVsZCA6IHMpIHsKKyAgICAgICAgRmllbGREZXNjcmlwdG9yJiBkRmllbGQgPSBkLT5maWVsZHNbaSsrXTsKKyAgICAgICAgZEZpZWxkLmZpZWxkSWQub2Zmc2V0ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAorICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoc0ZpZWxkKSk7CisgICAgICAgIGRGaWVsZC5maWVsZElkLnNpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUoc0ZpZWxkKSk7CisgICAgICAgIGRGaWVsZC50eXBlID0gc3RhdGljX2Nhc3Q8aGlkbF9iaXRmaWVsZDxGaWVsZERlc2NyaXB0b3I6OlR5cGU+PigKKyAgICAgICAgICAgICAgICBzRmllbGQudHlwZSgpKTsKKyAgICAgICAgZEZpZWxkLmV4dGVudCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzRmllbGQuZXh0ZW50KCkpOworICAgICAgICBkRmllbGQubmFtZSA9IHN0YXRpY19jYXN0PGhpZGxfc3RyaW5nPihzRmllbGQubmFtZSgpKTsKKyAgICAgICAgY29uc3QgYXV0byYgc05hbWVkVmFsdWVzID0gc0ZpZWxkLm5hbWVkVmFsdWVzKCk7CisgICAgICAgIGRGaWVsZC5uYW1lZFZhbHVlcy5yZXNpemUoc05hbWVkVmFsdWVzLnNpemUoKSk7CisgICAgICAgIHNpemVfdCBqID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzTmFtZWRWYWx1ZSA6IHNOYW1lZFZhbHVlcykgeworICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlJiBkTmFtZWRWYWx1ZSA9IGRGaWVsZC5uYW1lZFZhbHVlc1tqKytdOworICAgICAgICAgICAgZE5hbWVkVmFsdWUubmFtZSA9IHN0YXRpY19jYXN0PGhpZGxfc3RyaW5nPihzTmFtZWRWYWx1ZS5maXJzdCk7CisgICAgICAgICAgICBkTmFtZWRWYWx1ZS52YWx1ZSA9IHN0YXRpY19jYXN0PFByaW1pdGl2ZVZhbHVlPigKKyAgICAgICAgICAgICAgICAgICAgc05hbWVkVmFsdWUuc2Vjb25kLnU2NCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFN0cnVjdERlc2NyaXB0b3IgLT4gQzJTdHJ1Y3REZXNjcmlwdG9yCitib29sIG9iamNweShzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiAqZCwgY29uc3QgU3RydWN0RGVzY3JpcHRvciAmcykgeworICAgIEMyUGFyYW06OkNvcmVJbmRleCBkSW5kZXggPSBDMlBhcmFtOjpDb3JlSW5kZXgoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHMudHlwZSkpOworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBkRmllbGRzOworICAgIGRGaWVsZHMucmVzZXJ2ZShzLmZpZWxkcy5zaXplKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmc0ZpZWxkIDogcy5maWVsZHMpIHsKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3IgZEZpZWxkID0geworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNGaWVsZC50eXBlKSwKKyAgICAgICAgICAgIHNGaWVsZC5leHRlbnQsCisgICAgICAgICAgICBzRmllbGQubmFtZSwKKyAgICAgICAgICAgIHNGaWVsZC5maWVsZElkLm9mZnNldCwKKyAgICAgICAgICAgIHNGaWVsZC5maWVsZElkLnNpemUgfTsKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBuYW1lZFZhbHVlczsKKyAgICAgICAgbmFtZWRWYWx1ZXMucmVzZXJ2ZShzRmllbGQubmFtZWRWYWx1ZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzTmFtZWRWYWx1ZSA6IHNGaWVsZC5uYW1lZFZhbHVlcykgeworICAgICAgICAgICAgbmFtZWRWYWx1ZXMuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgIHNOYW1lZFZhbHVlLm5hbWUsCisgICAgICAgICAgICAgICAgQzJWYWx1ZTo6UHJpbWl0aXZlKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzTmFtZWRWYWx1ZS52YWx1ZSkpKTsKKyAgICAgICAgfQorICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6QWRkTmFtZWRWYWx1ZXMoZEZpZWxkLCBzdGQ6Om1vdmUobmFtZWRWYWx1ZXMpKTsKKyAgICAgICAgZEZpZWxkcy5lbXBsYWNlX2JhY2soZEZpZWxkKTsKKyAgICB9CisgICAgKmQgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyU3RydWN0RGVzY3JpcHRvcj4oCisgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6Q3JlYXRlU3RydWN0RGVzY3JpcHRvcihkSW5kZXgsIHN0ZDo6bW92ZShkRmllbGRzKSkpOworICAgIHJldHVybiB0cnVlOworfQorCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKKy8vIEZpbmQgb3IgYWRkIGEgaGlkbCBCYXNlQmxvY2sgb2JqZWN0IGZyb20gYSBnaXZlbiBDMkhhbmRsZSogdG8gYSBsaXN0IGFuZCBhbgorLy8gYXNzb2NpYXRlZCBtYXAuCisvLyBOb3RlOiBUaGUgaGFuZGxlIGlzIG5vdCBjbG9uZWQuCitib29sIF9hZGRCYXNlQmxvY2soCisgICAgICAgIHVpbnQzMl90KiBpbmRleCwKKyAgICAgICAgY29uc3QgQzJIYW5kbGUqIGhhbmRsZSwKKyAgICAgICAgc3RkOjpsaXN0PEJhc2VCbG9jaz4qIGJhc2VCbG9ja3MsCisgICAgICAgIHN0ZDo6bWFwPGNvbnN0IHZvaWQqLCB1aW50MzJfdD4qIGJhc2VCbG9ja0luZGljZXMpIHsKKyAgICBpZiAoIWhhbmRsZSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJhZGRCYXNlQmxvY2sgY2FsbGVkIG9uIGEgbnVsbCBDMkhhbmRsZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gaXQgPSBiYXNlQmxvY2tJbmRpY2VzLT5maW5kKGhhbmRsZSk7CisgICAgaWYgKGl0ICE9IGJhc2VCbG9ja0luZGljZXMtPmVuZCgpKSB7CisgICAgICAgICppbmRleCA9IGl0LT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmluZGV4ID0gYmFzZUJsb2Nrcy0+c2l6ZSgpOworICAgICAgICBiYXNlQmxvY2tJbmRpY2VzLT5lbXBsYWNlKGhhbmRsZSwgKmluZGV4KTsKKyAgICAgICAgYmFzZUJsb2Nrcy0+ZW1wbGFjZV9iYWNrKCk7CisKKyAgICAgICAgQmFzZUJsb2NrICZkQmFzZUJsb2NrID0gYmFzZUJsb2Nrcy0+YmFjaygpOworICAgICAgICAvLyBUaGlzIGRvZXMgbm90IGNsb25lIHRoZSBoYW5kbGUuCisgICAgICAgIGRCYXNlQmxvY2submF0aXZlQmxvY2soCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBuYXRpdmVfaGFuZGxlX3QqPihoYW5kbGUpKTsKKworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRmluZCBvciBhZGQgYSBoaWRsIEJhc2VCbG9jayBvYmplY3QgZnJvbSBhIGdpdmVuIEJ1ZmZlclBvb2xEYXRhIHRvIGEgbGlzdCBhbmQKKy8vIGFuIGFzc29jaWF0ZWQgbWFwLgorYm9vbCBfYWRkQmFzZUJsb2NrKAorICAgICAgICB1aW50MzJfdCogaW5kZXgsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnBEYXRhLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIGlmICghYnBEYXRhKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImFkZEJhc2VCbG9jayBjYWxsZWQgb24gYSBudWxsIEJ1ZmZlclBvb2xEYXRhLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYXV0byBpdCA9IGJhc2VCbG9ja0luZGljZXMtPmZpbmQoYnBEYXRhLmdldCgpKTsKKyAgICBpZiAoaXQgIT0gYmFzZUJsb2NrSW5kaWNlcy0+ZW5kKCkpIHsKKyAgICAgICAgKmluZGV4ID0gaXQtPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgICAqaW5kZXggPSBiYXNlQmxvY2tzLT5zaXplKCk7CisgICAgICAgIGJhc2VCbG9ja0luZGljZXMtPmVtcGxhY2UoYnBEYXRhLmdldCgpLCAqaW5kZXgpOworICAgICAgICBiYXNlQmxvY2tzLT5lbXBsYWNlX2JhY2soKTsKKworICAgICAgICBCYXNlQmxvY2sgJmRCYXNlQmxvY2sgPSBiYXNlQmxvY2tzLT5iYWNrKCk7CisKKyAgICAgICAgaWYgKGJ1ZmZlclBvb2xTZW5kZXIpIHsKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgcG9vbGVkQmxvY2s7CisgICAgICAgICAgICBSZXN1bHRTdGF0dXMgYnBTdGF0dXMgPSBidWZmZXJQb29sU2VuZGVyLT5zZW5kKAorICAgICAgICAgICAgICAgICAgICBicERhdGEsCisgICAgICAgICAgICAgICAgICAgICZwb29sZWRCbG9jayk7CisKKyAgICAgICAgICAgIGlmIChicFN0YXR1cyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNlbmQgYnVmZmVyIHdpdGggQnVmZmVyUG9vbC4gRXJyb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludDMyX3Q+KGJwU3RhdHVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRCYXNlQmxvY2sucG9vbGVkQmxvY2socG9vbGVkQmxvY2spOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGFkZEJhc2VCbG9jaygKKyAgICAgICAgdWludDMyX3QqIGluZGV4LAorICAgICAgICBjb25zdCBDMkhhbmRsZSogaGFuZGxlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgX0MyQmxvY2tQb29sRGF0YT4mIGJsb2NrUG9vbERhdGEsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgaWYgKCFibG9ja1Bvb2xEYXRhKSB7CisgICAgICAgIC8vIE5vIEJ1ZmZlclBvb2xEYXRhID09PiBOQVRJVkUgYmxvY2suCisgICAgICAgIHJldHVybiBfYWRkQmFzZUJsb2NrKAorICAgICAgICAgICAgICAgIGluZGV4LCBoYW5kbGUsCisgICAgICAgICAgICAgICAgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcyk7CisgICAgfQorICAgIHN3aXRjaCAoYmxvY2tQb29sRGF0YS0+Z2V0VHlwZSgpKSB7CisgICAgY2FzZSBfQzJCbG9ja1Bvb2xEYXRhOjpUWVBFX0JVRkZFUlBPT0w6IHsKKyAgICAgICAgICAgIC8vIEJ1ZmZlclBvb2xEYXRhCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJwRGF0YTsKKyAgICAgICAgICAgIGlmICghX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJQb29sRGF0YShibG9ja1Bvb2xEYXRhLCAmYnBEYXRhKQorICAgICAgICAgICAgICAgICAgICB8fCAhYnBEYXRhKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQnVmZmVyUG9vbERhdGEgdW5hdmFpbGFibGUgaW4gYSBibG9jay4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfYWRkQmFzZUJsb2NrKAorICAgICAgICAgICAgICAgICAgICBpbmRleCwgYnBEYXRhLAorICAgICAgICAgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKTsKKyAgICAgICAgfQorICAgIGNhc2UgX0MyQmxvY2tQb29sRGF0YTo6VFlQRV9CVUZGRVJRVUVVRToKKyAgICAgICAgLy8gRG8gdGhlIHNhbWUgdGhpbmcgYXMgYSBOQVRJVkUgYmxvY2suCisgICAgICAgIHJldHVybiBfYWRkQmFzZUJsb2NrKAorICAgICAgICAgICAgICAgIGluZGV4LCBoYW5kbGUsCisgICAgICAgICAgICAgICAgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcyk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biBDMkJsb2NrUG9vbERhdGEgdHlwZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisvLyBDMkZlbmNlIC0+IGhpZGxfaGFuZGxlCisvLyBOb3RlOiBGaWxlIGRlc2NyaXB0b3JzIGFyZSBub3QgZHVwbGljYXRlZC4gVGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvciBtdXN0CisvLyBub3QgYmUgY2xvc2VkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCitib29sIG9iamNweShoaWRsX2hhbmRsZSogZCwgY29uc3QgQzJGZW5jZSYgcykgeworICAgICh2b2lkKXM7IC8vIFRPRE86IGltcGxlbWVudCBzLmZkKCkKKyAgICBpbnQgZmVuY2VGZCA9IC0xOworICAgIGQtPnNldFRvKG51bGxwdHIpOworICAgIGlmIChmZW5jZUZkID49IDApIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICAgICAgaWYgKCFoYW5kbGUpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgYSBuYXRpdmUgaGFuZGxlLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaGFuZGxlLT5kYXRhWzBdID0gZmVuY2VGZDsKKyAgICAgICAgZC0+c2V0VG8oaGFuZGxlLCB0cnVlIC8qIG93bnMgKi8pOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJDb25zdExpbmVhckJsb2NrIC0+IEJsb2NrCisvLyBOb3RlOiBOYXRpdmUgaGFuZGxlcyBhcmUgbm90IGR1cGxpY2F0ZWQuIFRoZSBvcmlnaW5hbCBoYW5kbGVzIG11c3Qgbm90IGJlCisvLyBjbG9zZWQgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KK2Jvb2wgb2JqY3B5KEJsb2NrKiBkLCBjb25zdCBDMkNvbnN0TGluZWFyQmxvY2smIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IF9DMkJsb2NrUG9vbERhdGE+IGJwRGF0YSA9CisgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkdldExpbmVhckJsb2NrUG9vbERhdGEocyk7CisgICAgaWYgKCFhZGRCYXNlQmxvY2soJmQtPmluZGV4LCBzLmhhbmRsZSgpLCBicERhdGEsCisgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIGJsb2NrIGRhdGEgaW4gQzJDb25zdExpbmVhckJsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgdGhlIG1ldGFkYXRhLgorICAgIEMySGlkbF9SYW5nZUluZm8gZFJhbmdlSW5mbzsKKyAgICBkUmFuZ2VJbmZvLm9mZnNldCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzLm9mZnNldCgpKTsKKyAgICBkUmFuZ2VJbmZvLmxlbmd0aCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzLnNpemUoKSk7CisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZkLT5tZXRhLCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj57ICZkUmFuZ2VJbmZvIH0pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgcmFuZ2UgaW5mbyBpbiBDMkNvbnN0TGluZWFyQmxvY2suIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIENvcHkgdGhlIGZlbmNlCisgICAgaWYgKCFvYmpjcHkoJmQtPmZlbmNlLCBzLmZlbmNlKCkpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJDb25zdExpbmVhckJsb2NrOjpmZW5jZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkNvbnN0R3JhcGhpY0Jsb2NrIC0+IEJsb2NrCisvLyBOb3RlOiBOYXRpdmUgaGFuZGxlcyBhcmUgbm90IGR1cGxpY2F0ZWQuIFRoZSBvcmlnaW5hbCBoYW5kbGVzIG11c3Qgbm90IGJlCisvLyBjbG9zZWQgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KK2Jvb2wgb2JqY3B5KEJsb2NrKiBkLCBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBfQzJCbG9ja1Bvb2xEYXRhPiBicERhdGEgPQorICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YShzKTsKKyAgICBpZiAoIWFkZEJhc2VCbG9jaygmZC0+aW5kZXgsIHMuaGFuZGxlKCksIGJwRGF0YSwKKyAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgYmxvY2sgZGF0YSBpbiBDMkNvbnN0R3JhcGhpY0Jsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgdGhlIG1ldGFkYXRhLgorICAgIEMySGlkbF9SZWN0SW5mbyBkUmVjdEluZm87CisgICAgQzJSZWN0IHNSZWN0ID0gcy5jcm9wKCk7CisgICAgZFJlY3RJbmZvLmxlZnQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc1JlY3QubGVmdCk7CisgICAgZFJlY3RJbmZvLnRvcCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzUmVjdC50b3ApOworICAgIGRSZWN0SW5mby53aWR0aCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzUmVjdC53aWR0aCk7CisgICAgZFJlY3RJbmZvLmhlaWdodCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzUmVjdC5oZWlnaHQpOworICAgIGlmICghY3JlYXRlUGFyYW1zQmxvYigmZC0+bWV0YSwgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+eyAmZFJlY3RJbmZvIH0pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgcmVjdCBpbmZvIGluIEMyQ29uc3RHcmFwaGljQmxvY2suIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIENvcHkgdGhlIGZlbmNlCisgICAgaWYgKCFvYmpjcHkoJmQtPmZlbmNlLCBzLmZlbmNlKCkpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJDb25zdEdyYXBoaWNCbG9jazo6ZmVuY2UuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJCdWZmZXJEYXRhIC0+IEJ1ZmZlcgorLy8gVGhpcyBmdW5jdGlvbiBvbmx5IGZpbGxzIGluIGQtPmJsb2Nrcy4KK2Jvb2wgb2JqY3B5KEJ1ZmZlciogZCwgY29uc3QgQzJCdWZmZXJEYXRhJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIGQtPmJsb2Nrcy5yZXNpemUoCisgICAgICAgICAgICBzLmxpbmVhckJsb2NrcygpLnNpemUoKSArCisgICAgICAgICAgICBzLmdyYXBoaWNCbG9ja3MoKS5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IEMyQ29uc3RMaW5lYXJCbG9jayYgbGluZWFyQmxvY2sgOiBzLmxpbmVhckJsb2NrcygpKSB7CisgICAgICAgIEJsb2NrJiBkQmxvY2sgPSBkLT5ibG9ja3NbaSsrXTsKKyAgICAgICAgaWYgKCFvYmpjcHkoCisgICAgICAgICAgICAgICAgJmRCbG9jaywgbGluZWFyQmxvY2ssCisgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJCdWZmZXJEYXRhOjpsaW5lYXJCbG9ja3MuICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIihEZXN0aW5hdGlvbiBpbmRleCA9ICIgPDwgaSAtIDEgPDwgIi4pIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGdyYXBoaWNCbG9jayA6IHMuZ3JhcGhpY0Jsb2NrcygpKSB7CisgICAgICAgIEJsb2NrJiBkQmxvY2sgPSBkLT5ibG9ja3NbaSsrXTsKKyAgICAgICAgaWYgKCFvYmpjcHkoCisgICAgICAgICAgICAgICAgJmRCbG9jaywgZ3JhcGhpY0Jsb2NrLAorICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQnVmZmVyRGF0YTo6Z3JhcGhpY0Jsb2Nrcy4gIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiKERlc3RpbmF0aW9uIGluZGV4ID0gIiA8PCBpIC0gMSA8PCAiLikiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkJ1ZmZlciAtPiBCdWZmZXIKK2Jvb2wgb2JqY3B5KEJ1ZmZlciogZCwgY29uc3QgQzJCdWZmZXImIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZkLT5pbmZvLCBzLmluZm8oKSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkJ1ZmZlcjo6aW5mby4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghb2JqY3B5KGQsIHMuZGF0YSgpLCBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQnVmZmVyOjpkYXRhLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEMySW5mb0J1ZmZlciAtPiBJbmZvQnVmZmVyCitib29sIG9iamNweShJbmZvQnVmZmVyKiBkLCBjb25zdCBDMkluZm9CdWZmZXImIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgLy8gVE9ETzogQzJJbmZvQnVmZmVyIGlzIG5vdCBpbXBsZW1lbnRlZC4KKyAgICAodm9pZClkOworICAgICh2b2lkKXM7CisgICAgKHZvaWQpYnVmZmVyUG9vbFNlbmRlcjsKKyAgICAodm9pZCliYXNlQmxvY2tzOworICAgICh2b2lkKWJhc2VCbG9ja0luZGljZXM7CisgICAgTE9HKElORk8pIDw8ICJJbmZvQnVmZmVyIG5vdCBpbXBsZW1lbnRlZC4iOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkZyYW1lRGF0YSAtPiBGcmFtZURhdGEKK2Jvb2wgb2JqY3B5KEZyYW1lRGF0YSogZCwgY29uc3QgQzJGcmFtZURhdGEmIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgZC0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDxoaWRsX2JpdGZpZWxkPEZyYW1lRGF0YTo6RmxhZ3M+PihzLmZsYWdzKTsKKyAgICBpZiAoIW9iamNweSgmZC0+b3JkaW5hbCwgcy5vcmRpbmFsKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyRnJhbWVEYXRhOjpvcmRpbmFsLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkLT5idWZmZXJzLnJlc2l6ZShzLmJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBzQnVmZmVyIDogcy5idWZmZXJzKSB7CisgICAgICAgIEJ1ZmZlciYgZEJ1ZmZlciA9IGQtPmJ1ZmZlcnNbaSsrXTsKKyAgICAgICAgaWYgKCFzQnVmZmVyKSB7CisgICAgICAgICAgICAvLyBBIG51bGwgKHBvaW50ZXIgdG8pIEMyQnVmZmVyIGNvcnJlc3BvbmRzIHRvIGEgQnVmZmVyIHdpdGggZW1wdHkKKyAgICAgICAgICAgIC8vIGluZm8gYW5kIGJsb2Nrcy4KKyAgICAgICAgICAgIGRCdWZmZXIuaW5mby5yZXNpemUoMCk7CisgICAgICAgICAgICBkQnVmZmVyLmJsb2Nrcy5yZXNpemUoMCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW9iamNweSgKKyAgICAgICAgICAgICAgICAmZEJ1ZmZlciwgKnNCdWZmZXIsCisgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJGcmFtZURhdGE6OmJ1ZmZlcnNbIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBpIC0gMSA8PCAiXS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZkLT5jb25maWdVcGRhdGUsIHMuY29uZmlnVXBkYXRlKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyRnJhbWVEYXRhOjpjb25maWdVcGRhdGUuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGQtPmluZm9CdWZmZXJzLnJlc2l6ZShzLmluZm9CdWZmZXJzLnNpemUoKSk7CisgICAgaSA9IDA7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvQnVmZmVyPiYgc0luZm9CdWZmZXIgOiBzLmluZm9CdWZmZXJzKSB7CisgICAgICAgIEluZm9CdWZmZXImIGRJbmZvQnVmZmVyID0gZC0+aW5mb0J1ZmZlcnNbaSsrXTsKKyAgICAgICAgaWYgKCFzSW5mb0J1ZmZlcikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTnVsbCBDMkZyYW1lRGF0YTo6aW5mb0J1ZmZlcnNbIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBpIC0gMSA8PCAiXS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghb2JqY3B5KCZkSW5mb0J1ZmZlciwgKnNJbmZvQnVmZmVyLAorICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyRnJhbWVEYXRhOjppbmZvQnVmZmVyc1siCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGkgLSAxIDw8ICJdLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCisvLyBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcidzIGltcGxlbWVudGF0aW9uCisKK0RlZmF1bHRCdWZmZXJQb29sU2VuZGVyOjpEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiByZWNlaXZlck1hbmFnZXIsCisgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIHJlZnJlc2hJbnRlcnZhbCkKKyAgICA6IG1SZWNlaXZlck1hbmFnZXIocmVjZWl2ZXJNYW5hZ2VyKSwKKyAgICAgIG1Tb3VyY2VDb25uZWN0aW9uSWQoMCksCisgICAgICBtTGFzdFNlbnQoc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkpLAorICAgICAgbVJlZnJlc2hJbnRlcnZhbChyZWZyZXNoSW50ZXJ2YWwpIHsKK30KKwordm9pZCBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcjo6c2V0UmVjZWl2ZXIoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcmVjZWl2ZXJNYW5hZ2VyLAorICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiByZWZyZXNoSW50ZXJ2YWwpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIGlmIChtUmVjZWl2ZXJNYW5hZ2VyICE9IHJlY2VpdmVyTWFuYWdlcikgeworICAgICAgICBtUmVjZWl2ZXJNYW5hZ2VyID0gcmVjZWl2ZXJNYW5hZ2VyOworICAgIH0KKyAgICBtUmVmcmVzaEludGVydmFsID0gcmVmcmVzaEludGVydmFsOworfQorCitSZXN1bHRTdGF0dXMgRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXI6OnNlbmQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4mIGJwRGF0YSwKKyAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSogYnBNZXNzYWdlKSB7CisgICAgaWYgKCFtUmVjZWl2ZXJNYW5hZ2VyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIGFjY2VzcyB0byByZWNlaXZlcidzIEJ1ZmZlclBvb2wuIjsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgcnM7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBpZiAoIW1TZW5kZXJNYW5hZ2VyKSB7CisgICAgICAgIG1TZW5kZXJNYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICAgICAgaWYgKCFtU2VuZGVyTWFuYWdlcikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJldHJpZXZlIGxvY2FsIEJ1ZmZlclBvb2wgQ2xpZW50TWFuYWdlci4iOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgaW50NjRfdCBjb25uZWN0aW9uSWQgPSBicERhdGEtPm1Db25uZWN0aW9uSWQ7CisgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBub3cgPQorICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gaW50ZXJ2YWwgPSBub3cgLSBtTGFzdFNlbnQ7CisgICAgaWYgKG1Tb3VyY2VDb25uZWN0aW9uSWQgPT0gMCB8fAorICAgICAgICAgICAgbVNvdXJjZUNvbm5lY3Rpb25JZCAhPSBjb25uZWN0aW9uSWQgfHwKKyAgICAgICAgICAgIGludGVydmFsID4gbVJlZnJlc2hJbnRlcnZhbCkgeworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBidWZmZXJwb29sIGNvbm5lY3Rpb24uCisgICAgICAgIG1Tb3VyY2VDb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgIGlmIChtU291cmNlQ29ubmVjdGlvbklkID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCByZWNlaXZlckNvbm5lY3Rpb25JZDsKKyAgICAgICAgcnMgPSBtU2VuZGVyTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIobVJlY2VpdmVyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjZWl2ZXJDb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoKHJzICE9IFJlc3VsdFN0YXR1czo6T0spICYmIChycyAhPSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTKSkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJyZWdpc3RlclNlbmRlciAtLSByZXR1cm5lZCBlcnJvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludDMyX3Q+KHJzKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgICAgIHJldHVybiByczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1SZWNlaXZlckNvbm5lY3Rpb25JZCA9IHJlY2VpdmVyQ29ubmVjdGlvbklkOworICAgICAgICB9CisgICAgfQorCisgICAgdWludDY0X3QgdHJhbnNhY3Rpb25JZDsKKyAgICBpbnQ2NF90IHRpbWVzdGFtcFVzOworICAgIHJzID0gbVNlbmRlck1hbmFnZXItPnBvc3RTZW5kKAorICAgICAgICAgICAgbVJlY2VpdmVyQ29ubmVjdGlvbklkLCBicERhdGEsICZ0cmFuc2FjdGlvbklkLCAmdGltZXN0YW1wVXMpOworICAgIGlmIChycyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNsaWVudE1hbmFnZXI6OnBvc3RTZW5kIC0tIHJldHVybmVkIGVycm9yOiAiCisgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50MzJfdD4ocnMpCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICByZXR1cm4gcnM7CisgICAgfQorICAgIGlmICghYnBNZXNzYWdlKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk51bGwgb3V0cHV0IHBhcmFtZXRlciBmb3IgQnVmZmVyU3RhdHVzTWVzc2FnZS4iOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgYnBNZXNzYWdlLT5jb25uZWN0aW9uSWQgPSBtUmVjZWl2ZXJDb25uZWN0aW9uSWQ7CisgICAgYnBNZXNzYWdlLT5idWZmZXJJZCA9IGJwRGF0YS0+bUlkOworICAgIGJwTWVzc2FnZS0+dHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgYnBNZXNzYWdlLT50aW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgIG1MYXN0U2VudCA9IG5vdzsKKyAgICByZXR1cm4gcnM7Cit9CisKKy8vIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gLT4gV29ya0J1bmRsZQorYm9vbCBvYmpjcHkoCisgICAgICAgIFdvcmtCdW5kbGUqIGQsCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIpIHsKKyAgICAvLyBiYXNlQmxvY2tzIGhvbGRzIGEgbGlzdCBvZiBCYXNlQmxvY2sgb2JqZWN0cyB0aGF0IEJsb2NrcyBjYW4gcmVmZXIgdG8uCisgICAgc3RkOjpsaXN0PEJhc2VCbG9jaz4gYmFzZUJsb2NrczsKKworICAgIC8vIGJhc2VCbG9ja0luZGljZXMgbWFwcyBhIHJhdyBwb2ludGVyIHRvIG5hdGl2ZV9oYW5kbGVfdCBvciBCdWZmZXJQb29sRGF0YQorICAgIC8vIGluc2lkZSBiYXNlQmxvY2tzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGluZGV4IGludG8gYmFzZUJsb2Nrcy4gVGhlIGtleXMKKyAgICAvLyAocG9pbnRlcnMpIGFyZSB1c2VkIHRvIGlkZW50aWZ5IGJsb2NrcyB0aGF0IGhhdmUgdGhlIHNhbWUgImJhc2UgYmxvY2siIGluCisgICAgLy8gcywgYSBsaXN0IG9mIEMyV29yayBvYmplY3RzLiBCZWNhdXNlIGJhc2VCbG9ja3Mgd2lsbCBiZSBjb3BpZWQgaW50byBhCisgICAgLy8gaGlkbF92ZWMgZXZlbnR1YWxseSwgdGhlIHZhbHVlcyBvZiBiYXNlQmxvY2tJbmRpY2VzIGFyZSB6ZXJvLWJhc2VkCisgICAgLy8gaW50ZWdlciBpbmRpY2VzIGluc3RlYWQgb2YgbGlzdCBpdGVyYXRvcnMuCisgICAgLy8KKyAgICAvLyBOb3RlIHRoYXQgdGhlIHBvaW50ZXJzIGNhbiBiZSByYXcgYmVjYXVzZSBiYXNlQmxvY2tJbmRpY2VzIGhhcyBhIHNob3J0ZXIKKyAgICAvLyBsaWZlc3BhbiB0aGFuIGFsbCBvZiBiYXNlIGJsb2Nrcy4KKyAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+IGJhc2VCbG9ja0luZGljZXM7CisKKyAgICBkLT53b3Jrcy5yZXNpemUocy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiBzV29yayA6IHMpIHsKKyAgICAgICAgV29yayAmZFdvcmsgPSBkLT53b3Jrc1tpKytdOworICAgICAgICBpZiAoIXNXb3JrKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIk51bGwgQzJXb3JrIGVuY291bnRlcmVkLiI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoYWluIGluZm8gaXMgbm90IGluIHVzZSBjdXJyZW50bHkuCisKKyAgICAgICAgLy8gaW5wdXQKKyAgICAgICAgaWYgKCFvYmpjcHkoJmRXb3JrLmlucHV0LCBzV29yay0+aW5wdXQsCisgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgJmJhc2VCbG9ja3MsICZiYXNlQmxvY2tJbmRpY2VzKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMldvcms6OmlucHV0LiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyB3b3JrbGV0cworICAgICAgICBpZiAoc1dvcmstPndvcmtsZXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJXb3JrIHdpdGggbm8gd29ya2xldHMuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFBhcmNlbCB0aGUgd29ya2xldHMuCisgICAgICAgICAgICBoaWRsX3ZlYzxXb3JrbGV0PiAmZFdvcmtsZXRzID0gZFdvcmsud29ya2xldHM7CisgICAgICAgICAgICBkV29ya2xldHMucmVzaXplKHNXb3JrLT53b3JrbGV0cy5zaXplKCkpOworICAgICAgICAgICAgc2l6ZV90IGogPSAwOworICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrbGV0PiYgc1dvcmtsZXQgOiBzV29yay0+d29ya2xldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFzV29ya2xldCkgeworICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIk51bGwgQzJXb3JrOjp3b3JrbGV0c1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIDw8ICJdLiI7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBXb3JrbGV0ICZkV29ya2xldCA9IGRXb3JrbGV0c1tqKytdOworCisgICAgICAgICAgICAgICAgLy8gY29tcG9uZW50IGlkCisgICAgICAgICAgICAgICAgZFdvcmtsZXQuY29tcG9uZW50SWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzV29ya2xldC0+Y29tcG9uZW50KTsKKworICAgICAgICAgICAgICAgIC8vIHR1bmluZ3MKKyAgICAgICAgICAgICAgICBpZiAoIWNyZWF0ZVBhcmFtc0Jsb2IoJmRXb3JrbGV0LnR1bmluZ3MsIHNXb3JrbGV0LT50dW5pbmdzKSkgeworICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyV29yazo6d29ya2xldHNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGogLSAxIDw8ICJdLT50dW5pbmdzLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBmYWlsdXJlcworICAgICAgICAgICAgICAgIGRXb3JrbGV0LmZhaWx1cmVzLnJlc2l6ZShzV29ya2xldC0+ZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBzaXplX3QgayA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiYgc0ZhaWx1cmUgOgorICAgICAgICAgICAgICAgICAgICAgICAgc1dvcmtsZXQtPmZhaWx1cmVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc0ZhaWx1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiTnVsbCBDMldvcms6OndvcmtsZXRzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIC0gMSA8PCAiXS0+ZmFpbHVyZXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGsgPDwgIl0uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KCZkV29ya2xldC5mYWlsdXJlc1trKytdLCAqc0ZhaWx1cmUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyV29yazo6d29ya2xldHNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIC0gMSA8PCAiXS0+ZmFpbHVyZXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBrIC0gMSA8PCAiXS4iOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gb3V0cHV0CisgICAgICAgICAgICAgICAgaWYgKCFvYmpjcHkoJmRXb3JrbGV0Lm91dHB1dCwgc1dvcmtsZXQtPm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsICZiYXNlQmxvY2tzLCAmYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMldvcms6OndvcmtsZXRzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIC0gMSA8PCAiXS0+b3V0cHV0LiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB3b3JrbGV0cyBwcm9jZXNzZWQKKyAgICAgICAgZFdvcmsud29ya2xldHNQcm9jZXNzZWQgPSBzV29yay0+d29ya2xldHNQcm9jZXNzZWQ7CisKKyAgICAgICAgLy8gcmVzdWx0CisgICAgICAgIGRXb3JrLnJlc3VsdCA9IHN0YXRpY19jYXN0PFN0YXR1cz4oc1dvcmstPnJlc3VsdCk7CisgICAgfQorCisgICAgLy8gQ29weSBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiB0byBoaWRsX3ZlYzxCYXNlQmxvY2s+LgorICAgIHsKKyAgICAgICAgZC0+YmFzZUJsb2Nrcy5yZXNpemUoYmFzZUJsb2Nrcy5zaXplKCkpOworICAgICAgICBzaXplX3QgaSA9IDA7CisgICAgICAgIGZvciAoY29uc3QgQmFzZUJsb2NrJiBiYXNlQmxvY2sgOiBiYXNlQmxvY2tzKSB7CisgICAgICAgICAgICBkLT5iYXNlQmxvY2tzW2krK10gPSBiYXNlQmxvY2s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitzdHJ1Y3QgQzJCYXNlQmxvY2sgeworICAgIGVudW0gdHlwZV90IHsKKyAgICAgICAgTElORUFSLAorICAgICAgICBHUkFQSElDLAorICAgIH07CisgICAgdHlwZV90IHR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGxpbmVhcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGdyYXBoaWM7Cit9OworCisvLyBoaWRsX2hhbmRsZSAtPiBDMkZlbmNlCisvLyBOb3RlOiBGaWxlIGRlc2NyaXB0b3JzIGFyZSBub3QgZHVwbGljYXRlZC4gVGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvciBtdXN0CisvLyBub3QgYmUgY2xvc2VkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCitib29sIG9iamNweShDMkZlbmNlKiBkLCBjb25zdCBoaWRsX2hhbmRsZSYgcykgeworICAgIC8vIFRPRE86IEltcGxlbWVudC4KKyAgICAodm9pZClzOworICAgICpkID0gQzJGZW5jZSgpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkxpbmVhckJsb2NrLCB2ZWN0b3I8QzJQYXJhbSo+LCBDMkZlbmNlIC0+IEMyQnVmZmVyCitib29sIGNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiogYnVmZmVyLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4mIGJsb2NrLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIG1ldGEsCisgICAgICAgIGNvbnN0IEMyRmVuY2UmIGZlbmNlKSB7CisgICAgLy8gQ2hlY2sgdGhlIGJsb2NrIG1ldGEuIEl0IHNob3VsZCBoYXZlIGV4YWN0bHkgMSBDMkluZm86CisgICAgLy8gQzJIaWRsX1JhbmdlSW5mby4KKyAgICBpZiAoKG1ldGEuc2l6ZSgpICE9IDEpIHx8ICFtZXRhWzBdKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJMaW5lYXJCbG9jazo6bWV0YS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtZXRhWzBdLT5zaXplKCkgIT0gc2l6ZW9mKEMySGlkbF9SYW5nZUluZm8pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgcmFuZ2UgaW5mbyBpbiBDMkxpbmVhckJsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQzJIaWRsX1JhbmdlSW5mbyAqcmFuZ2VJbmZvID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QzJIaWRsX1JhbmdlSW5mbyo+KG1ldGFbMF0pOworCisgICAgLy8gQ3JlYXRlIEMyQnVmZmVyIGZyb20gQzJMaW5lYXJCbG9jay4KKyAgICAqYnVmZmVyID0gQzJCdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jay0+c2hhcmUoCisgICAgICAgICAgICByYW5nZUluZm8tPm9mZnNldCwgcmFuZ2VJbmZvLT5sZW5ndGgsCisgICAgICAgICAgICBmZW5jZSkpOworICAgIGlmICghKCpidWZmZXIpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNyZWF0ZUxpbmVhckJ1ZmZlciBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJHcmFwaGljQmxvY2ssIHZlY3RvcjxDMlBhcmFtKj4sIEMyRmVuY2UgLT4gQzJCdWZmZXIKK2Jvb2wgY3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiogYnVmZmVyLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+JiBibG9jaywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiBtZXRhLAorICAgICAgICBjb25zdCBDMkZlbmNlJiBmZW5jZSkgeworICAgIC8vIENoZWNrIHRoZSBibG9jayBtZXRhLiBJdCBzaG91bGQgaGF2ZSBleGFjdGx5IDEgQzJJbmZvOgorICAgIC8vIEMySGlkbF9SZWN0SW5mby4KKyAgICBpZiAoKG1ldGEuc2l6ZSgpICE9IDEpIHx8ICFtZXRhWzBdKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJHcmFwaGljQmxvY2s6Om1ldGEuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobWV0YVswXS0+c2l6ZSgpICE9IHNpemVvZihDMkhpZGxfUmVjdEluZm8pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgcmVjdCBpbmZvIGluIEMyR3JhcGhpY0Jsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQzJIaWRsX1JlY3RJbmZvICpyZWN0SW5mbyA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEMySGlkbF9SZWN0SW5mbyo+KG1ldGFbMF0pOworCisgICAgLy8gQ3JlYXRlIEMyQnVmZmVyIGZyb20gQzJHcmFwaGljQmxvY2suCisgICAgKmJ1ZmZlciA9IEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLT5zaGFyZSgKKyAgICAgICAgICAgIEMyUmVjdChyZWN0SW5mby0+d2lkdGgsIHJlY3RJbmZvLT5oZWlnaHQpLgorICAgICAgICAgICAgYXQocmVjdEluZm8tPmxlZnQsIHJlY3RJbmZvLT50b3ApLAorICAgICAgICAgICAgZmVuY2UpKTsKKyAgICBpZiAoISgqYnVmZmVyKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDcmVhdGVHcmFwaGljQnVmZmVyIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBCdWZmZXIgLT4gQzJCdWZmZXIKKy8vIE5vdGU6IFRoZSBuYXRpdmUgaGFuZGxlcyB3aWxsIGJlIGNsb25lZC4KK2Jvb2wgb2JqY3B5KHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4qIGQsIGNvbnN0IEJ1ZmZlciYgcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJCYXNlQmxvY2s+JiBiYXNlQmxvY2tzKSB7CisgICAgKmQgPSBudWxscHRyOworCisgICAgLy8gQ3VycmVudGx5LCBhIG5vbi1udWxsIEMyQnVmZmVyIG11c3QgY29udGFpbiBleGFjdGx5IDEgYmxvY2suCisgICAgaWYgKHMuYmxvY2tzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocy5ibG9ja3Muc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBCdWZmZXI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAiQ3VycmVudGx5LCBhIEMyQnVmZmVyIG11c3QgY29udGFpbiBleGFjdGx5IDEgYmxvY2suIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IEJsb2NrICZzQmxvY2sgPSBzLmJsb2Nrc1swXTsKKyAgICBpZiAoc0Jsb2NrLmluZGV4ID49IGJhc2VCbG9ja3Muc2l6ZSgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQnVmZmVyOjpibG9ja3NbMF0uaW5kZXg6ICIKKyAgICAgICAgICAgICAgICAgICAgICAiQXJyYXkgaW5kZXggb3V0IG9mIHJhbmdlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3QgQzJCYXNlQmxvY2sgJmJhc2VCbG9jayA9IGJhc2VCbG9ja3Nbc0Jsb2NrLmluZGV4XTsKKworICAgIC8vIFBhcnNlIG1ldGEuCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHNCbG9ja01ldGE7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnNCbG9ja01ldGEsIHNCbG9jay5tZXRhKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEJ1ZmZlcjo6YmxvY2tzWzBdLm1ldGEuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIENvcHkgZmVuY2UuCisgICAgQzJGZW5jZSBkRmVuY2U7CisgICAgaWYgKCFvYmpjcHkoJmRGZW5jZSwgc0Jsb2NrLmZlbmNlKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEJ1ZmZlcjo6YmxvY2tzWzBdLmZlbmNlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDb25zdHJ1Y3QgYSBibG9jay4KKyAgICBzd2l0Y2ggKGJhc2VCbG9jay50eXBlKSB7CisgICAgY2FzZSBDMkJhc2VCbG9jazo6TElORUFSOgorICAgICAgICBpZiAoIWNyZWF0ZUxpbmVhckJ1ZmZlcihkLCBiYXNlQmxvY2subGluZWFyLCBzQmxvY2tNZXRhLCBkRmVuY2UpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQmFzZUJsb2NrOjpsaW5lYXIuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQmFzZUJsb2NrOjpHUkFQSElDOgorICAgICAgICBpZiAoIWNyZWF0ZUdyYXBoaWNCdWZmZXIoZCwgYmFzZUJsb2NrLmdyYXBoaWMsIHNCbG9ja01ldGEsIGRGZW5jZSkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJCYXNlQmxvY2s6OmdyYXBoaWMuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQmFzZUJsb2NrOjp0eXBlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBQYXJzZSBpbmZvCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtczsKKyAgICBpZiAoIXBhcnNlUGFyYW1zQmxvYigmcGFyYW1zLCBzLmluZm8pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQnVmZmVyOjppbmZvLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChDMlBhcmFtKiBwYXJhbSA6IHBhcmFtcykgeworICAgICAgICBpZiAocGFyYW0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTnVsbCBwYXJhbSBpbiBCdWZmZXI6OmluZm8uIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gYzJwYXJhbXsKKyAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KCpwYXJhbSkucmVsZWFzZSgpfTsKKyAgICAgICAgaWYgKCFjMnBhcmFtKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHBhcmFtIGluIEJ1ZmZlcjo6aW5mby4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgKCpkKS0+c2V0SW5mbyhzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJJbmZvPihjMnBhcmFtKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkMyQnVmZmVyOjpzZXRJbmZvIGZhaWxlZC4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEZyYW1lRGF0YSAtPiBDMkZyYW1lRGF0YQorYm9vbCBvYmpjcHkoQzJGcmFtZURhdGEqIGQsIGNvbnN0IEZyYW1lRGF0YSYgcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJCYXNlQmxvY2s+JiBiYXNlQmxvY2tzKSB7CisgICAgZC0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDxDMkZyYW1lRGF0YTo6ZmxhZ3NfdD4ocy5mbGFncyk7CisgICAgaWYgKCFvYmpjcHkoJmQtPm9yZGluYWwsIHMub3JkaW5hbCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBGcmFtZURhdGE6Om9yZGluYWwuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkLT5idWZmZXJzLmNsZWFyKCk7CisgICAgZC0+YnVmZmVycy5yZXNlcnZlKHMuYnVmZmVycy5zaXplKCkpOworICAgIGZvciAoY29uc3QgQnVmZmVyJiBzQnVmZmVyIDogcy5idWZmZXJzKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gZEJ1ZmZlcjsKKyAgICAgICAgaWYgKCFvYmpjcHkoJmRCdWZmZXIsIHNCdWZmZXIsIGJhc2VCbG9ja3MpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEZyYW1lRGF0YTo6YnVmZmVycy4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGQtPmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKGRCdWZmZXIpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbXM7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtcywgcy5jb25maWdVcGRhdGUpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgRnJhbWVEYXRhOjpjb25maWdVcGRhdGUuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkLT5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICBmb3IgKEMyUGFyYW0qIHBhcmFtIDogcGFyYW1zKSB7CisgICAgICAgIGQtPmNvbmZpZ1VwZGF0ZS5lbXBsYWNlX2JhY2soQzJQYXJhbTo6Q29weSgqcGFyYW0pKTsKKyAgICAgICAgaWYgKCFkLT5jb25maWdVcGRhdGUuYmFjaygpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmV4cGVjdGVkIGVycm9yIHdoaWxlIHBhcnNpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiRnJhbWVEYXRhOjpjb25maWdVcGRhdGUuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIG9uY2UgQzJJbmZvQnVmZmVyIGhhcyBjb25zdHJ1Y3RvcnMuCisgICAgZC0+aW5mb0J1ZmZlcnMuY2xlYXIoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQmFzZUJsb2NrIC0+IEMyQmFzZUJsb2NrCitib29sIG9iamNweShDMkJhc2VCbG9jayogZCwgY29uc3QgQmFzZUJsb2NrJiBzKSB7CisgICAgc3dpdGNoIChzLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgIGNhc2UgQmFzZUJsb2NrOjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om5hdGl2ZUJsb2NrOiB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIHNIYW5kbGUgPQorICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb25lKHMubmF0aXZlQmxvY2soKSk7CisgICAgICAgICAgICBpZiAoc0hhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTnVsbCBCYXNlQmxvY2s6Om5hdGl2ZUJsb2NrLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKnNDMkhhbmRsZSA9CisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQzJIYW5kbGUqPihzSGFuZGxlKTsKKworICAgICAgICAgICAgZC0+bGluZWFyID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhzQzJIYW5kbGUpOworICAgICAgICAgICAgaWYgKGQtPmxpbmVhcikgeworICAgICAgICAgICAgICAgIGQtPnR5cGUgPSBDMkJhc2VCbG9jazo6TElORUFSOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkLT5ncmFwaGljID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soc0MySGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChkLT5ncmFwaGljKSB7CisgICAgICAgICAgICAgICAgZC0+dHlwZSA9IEMyQmFzZUJsb2NrOjpHUkFQSElDOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIGhhbmRsZSB0eXBlIGluIEJhc2VCbG9jazo6bmF0aXZlQmxvY2suIjsKKyAgICAgICAgICAgIGlmIChzSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShzSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShzSGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIGNhc2UgQmFzZUJsb2NrOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnBvb2xlZEJsb2NrOiB7CisgICAgICAgICAgICBjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZicE1lc3NhZ2UgPQorICAgICAgICAgICAgICAgICAgICBzLnBvb2xlZEJsb2NrKCk7CisgICAgICAgICAgICBzcDxDbGllbnRNYW5hZ2VyPiBicCA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJwRGF0YTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqY0hhbmRsZTsKKyAgICAgICAgICAgIFJlc3VsdFN0YXR1cyBicFN0YXR1cyA9IGJwLT5yZWNlaXZlKAorICAgICAgICAgICAgICAgICAgICBicE1lc3NhZ2UuY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICBicE1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgYnBNZXNzYWdlLmJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICBicE1lc3NhZ2UudGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICZjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAmYnBEYXRhKTsKKyAgICAgICAgICAgIGlmIChicFN0YXR1cyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlY2VpdmUgYnVmZmVyIGZyb20gYnVmZmVycG9vbCAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAicmVzdWx0U3RhdHVzID0gIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKGJwU3RhdHVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJwRGF0YSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIGRhdGEgaW4gYnVmZmVycG9vbCB0cmFuc2FjdGlvbi4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZC0+bGluZWFyID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhjSGFuZGxlLCBicERhdGEpOworICAgICAgICAgICAgaWYgKGQtPmxpbmVhcikgeworICAgICAgICAgICAgICAgIGQtPnR5cGUgPSBDMkJhc2VCbG9jazo6TElORUFSOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkLT5ncmFwaGljID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soY0hhbmRsZSwgYnBEYXRhKTsKKyAgICAgICAgICAgIGlmIChkLT5ncmFwaGljKSB7CisgICAgICAgICAgICAgICAgZC0+dHlwZSA9IEMyQmFzZUJsb2NrOjpHUkFQSElDOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIGhhbmRsZSB0eXBlIGluIEJhc2VCbG9jazo6cG9vbGVkQmxvY2suIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVucmVjb2duaXplZCBCYXNlQmxvY2sncyBkaXNjcmltaW5hdG9yIHdpdGggIgorICAgICAgICAgICAgICAgICAgIDw8ICJ1bmRlcmx5aW5nIHZhbHVlICIKKyAgICAgICAgICAgICAgICAgICA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMuZ2V0RGlzY3JpbWluYXRvcigpKSA8PCAiLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gV29ya0J1bmRsZSAtPiBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+Citib29sIG9iamNweShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBkLCBjb25zdCBXb3JrQnVuZGxlJiBzKSB7CisgICAgLy8gQ29udmVydCBCYXNlQmxvY2tzIHRvIEMyQmFzZUJsb2Nrcy4KKyAgICBzdGQ6OnZlY3RvcjxDMkJhc2VCbG9jaz4gZEJhc2VCbG9ja3Mocy5iYXNlQmxvY2tzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzLmJhc2VCbG9ja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKCFvYmpjcHkoJmRCYXNlQmxvY2tzW2ldLCBzLmJhc2VCbG9ja3NbaV0pKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFdvcmtCdW5kbGU6OmJhc2VCbG9ja3NbIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBpIDw8ICJdLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkLT5jbGVhcigpOworICAgIGZvciAoY29uc3QgV29yayYgc1dvcmsgOiBzLndvcmtzKSB7CisgICAgICAgIGQtPmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPEMyV29yaz4oKSk7CisgICAgICAgIEMyV29yayYgZFdvcmsgPSAqZC0+YmFjaygpOworCisgICAgICAgIC8vIGNoYWluIGluZm8gaXMgbm90IGluIHVzZSBjdXJyZW50bHkuCisKKyAgICAgICAgLy8gaW5wdXQKKyAgICAgICAgaWYgKCFvYmpjcHkoJmRXb3JrLmlucHV0LCBzV29yay5pbnB1dCwgZEJhc2VCbG9ja3MpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFdvcms6OmlucHV0LiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyB3b3JrbGV0KHMpCisgICAgICAgIGRXb3JrLndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIGZvciAoY29uc3QgV29ya2xldCYgc1dvcmtsZXQgOiBzV29yay53b3JrbGV0cykgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29ya2xldD4gZFdvcmtsZXQgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyV29ya2xldD4oKTsKKworICAgICAgICAgICAgLy8gY29tcG9uZW50IGlkCisgICAgICAgICAgICBkV29ya2xldC0+Y29tcG9uZW50ID0gc3RhdGljX2Nhc3Q8YzJfbm9kZV9pZF90PigKKyAgICAgICAgICAgICAgICAgICAgc1dvcmtsZXQuY29tcG9uZW50SWQpOworCisgICAgICAgICAgICAvLyB0dW5pbmdzCisgICAgICAgICAgICBpZiAoIWNvcHlQYXJhbXNGcm9tQmxvYigmZFdvcmtsZXQtPnR1bmluZ3MsIHNXb3JrbGV0LnR1bmluZ3MpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBXb3JrbGV0Ojp0dW5pbmdzIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGZhaWx1cmVzCisgICAgICAgICAgICBkV29ya2xldC0+ZmFpbHVyZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIGRXb3JrbGV0LT5mYWlsdXJlcy5yZXNlcnZlKHNXb3JrbGV0LmZhaWx1cmVzLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IFNldHRpbmdSZXN1bHQmIHNGYWlsdXJlIDogc1dvcmtsZXQuZmFpbHVyZXMpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiBkRmFpbHVyZTsKKyAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmZEZhaWx1cmUsIHNGYWlsdXJlKSkgeworICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFdvcmtsZXQ6OmZhaWx1cmVzLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZFdvcmtsZXQtPmZhaWx1cmVzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoZEZhaWx1cmUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gb3V0cHV0CisgICAgICAgICAgICBpZiAoIW9iamNweSgmZFdvcmtsZXQtPm91dHB1dCwgc1dvcmtsZXQub3V0cHV0LCBkQmFzZUJsb2NrcykpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFdvcmtsZXQ6Om91dHB1dC4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZFdvcmsud29ya2xldHMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShkV29ya2xldCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gd29ya2xldHNQcm9jZXNzZWQKKyAgICAgICAgZFdvcmsud29ya2xldHNQcm9jZXNzZWQgPSBzV29yay53b3JrbGV0c1Byb2Nlc3NlZDsKKworICAgICAgICAvLyByZXN1bHQKKyAgICAgICAgZFdvcmsucmVzdWx0ID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHNXb3JrLnJlc3VsdCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0ZXhwciBzaXplX3QgUEFSQU1TX0FMSUdOTUVOVCA9IDg7ICAvLyA2NC1iaXQgYWxpZ25tZW50CitzdGF0aWNfYXNzZXJ0KFBBUkFNU19BTElHTk1FTlQgJSBhbGlnbm9mKEMyUGFyYW0pID09IDAsICJDMlBhcmFtIGFsaWdubWVudCBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChQQVJBTVNfQUxJR05NRU5UICUgYWxpZ25vZihDMkluZm8pID09IDAsICJDMlBhcmFtIGFsaWdubWVudCBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChQQVJBTVNfQUxJR05NRU5UICUgYWxpZ25vZihDMlR1bmluZykgPT0gMCwgIkMyUGFyYW0gYWxpZ25tZW50IG1pc21hdGNoIik7CisKKy8vIFBhcmFtcyAtPiBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4KK2Jvb2wgcGFyc2VQYXJhbXNCbG9iKHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAqcGFyYW1zLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmYmxvYikgeworICAgIC8vIGFzc3VtaW5nIGJsb2IgaXMgY29uc3QgaGVyZQorICAgIHNpemVfdCBzaXplID0gYmxvYi5zaXplKCk7CisgICAgc2l6ZV90IGl4ID0gMDsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYmxvYi5kYXRhKCk7CisgICAgQzJQYXJhbSAqcCA9IG51bGxwdHI7CisKKyAgICBkbyB7CisgICAgICAgIHAgPSBDMlBhcmFtVXRpbHM6OlBhcnNlRmlyc3QoZGF0YSArIGl4LCBzaXplIC0gaXgpOworICAgICAgICBpZiAocCkgeworICAgICAgICAgICAgcGFyYW1zLT5lbXBsYWNlX2JhY2socCk7CisgICAgICAgICAgICBpeCArPSBwLT5zaXplKCk7CisgICAgICAgICAgICBpeCA9IGFsaWduKGl4LCBQQVJBTVNfQUxJR05NRU5UKTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHApOworCisgICAgaWYgKGl4ICE9IHNpemUpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAicGFyc2VQYXJhbXNCbG9iIC0tIGluY29uc2lzdGVudCBzaXplcy4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKKy8qKgorICogQ29uY2F0ZW5hdGVzIGEgbGlzdCBvZiBDMlBhcmFtcyBpbnRvIGEgcGFyYW1zIGJsb2IuIFQgaXMgYSBjb250YWluZXIgdHlwZQorICogd2hvc2UgbWVtYmVyIHR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIEMyUGFyYW0qLgorICoKKyAqIFxwYXJhbVtvdXRdIGJsb2IgdGFyZ2V0IGJsb2IKKyAqIFxwYXJhbVtpbl0gcGFyYW1zIHBhcmFtZXRlcnMgdG8gY29uY2F0ZW5hdGUKKyAqIFxyZXR2YWwgQzJfT0sgaWYgdGhlIGJsb2Igd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBpZiB0aGUgYmxvYiB3YXMgbm90IHN1Y2Nlc3NmdWwgY3JlYXRlZCAodGhpcyBvbmx5CisgKiAgICAgICAgIGhhcHBlbnMgaWYgdGhlIHBhcmFtZXRlcnMgd2VyZSBub3QgY29uc3QpCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBfY3JlYXRlUGFyYW1zQmxvYihoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwgY29uc3QgVCAmcGFyYW1zKSB7CisgICAgLy8gYXNzdW1pbmcgdGhlIHBhcmFtZXRlciB2YWx1ZXMgYXJlIGNvbnN0CisgICAgc2l6ZV90IHNpemUgPSAwOworICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHBhcmFtcykgeworICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHNpemUgKz0gcC0+c2l6ZSgpOworICAgICAgICBzaXplID0gYWxpZ24oc2l6ZSwgUEFSQU1TX0FMSUdOTUVOVCk7CisgICAgfQorICAgIGJsb2ItPnJlc2l6ZShzaXplKTsKKyAgICBzaXplX3QgaXggPSAwOworICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHBhcmFtcykgeworICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIE5FVkVSIG92ZXJ3cml0ZSBldmVuIGlmIHBhcmFtIHZhbHVlcyAoZS5nLiBzaXplKSBjaGFuZ2VkCisgICAgICAgIHNpemVfdCBwYXJhbVNpemUgPSBzdGQ6Om1pbihwLT5zaXplKCksIHNpemUgLSBpeCk7CisgICAgICAgIHN0ZDo6Y29weSgKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigmKnApLAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCYqcCkgKyBwYXJhbVNpemUsCisgICAgICAgICAgICAgICAgJigqYmxvYilbaXhdKTsKKyAgICAgICAgaXggKz0gcGFyYW1TaXplOworICAgICAgICBpeCA9IGFsaWduKGl4LCBQQVJBTVNfQUxJR05NRU5UKTsKKyAgICB9CisgICAgYmxvYi0+cmVzaXplKGl4KTsKKyAgICBpZiAoaXggIT0gc2l6ZSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVQYXJhbXNCbG9iIC0tIGluY29uc2lzdGVudCBzaXplcy4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFBhcnNlcyBhIHBhcmFtcyBibG9iIGFuZCBjcmVhdGUgYSB2ZWN0b3Igb2YgbmV3IFQgb2JqZWN0cyB0aGF0IGNvbnRhaW4gY29waWVzCisgKiBvZiB0aGUgcGFyYW1zIGluIHRoZSBibG9iLiBUIGlzIEMyUGFyYW0gb3IgaXRzIGNvbXBhdGlibGUgZGVyaXZlZCBjbGFzcy4KKyAqCisgKiBccGFyYW1bb3V0XSBwYXJhbXMgdGhlIHJlc3VsdGluZyB2ZWN0b3IKKyAqIFxwYXJhbVtpbl0gYmxvYiBwYXJhbWV0ZXIgYmxvYiB0byBwYXJzZQorICogXHJldHZhbCBDMl9PSyBpZiB0aGUgZnVsbCBibG9iIHdhcyBwYXJzZWQgYW5kIHBhcmFtcyB3YXMgY29uc3RydWN0ZWQKKyAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIG90aGVyd2lzZQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgX2NvcHlQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFQ+PiogcGFyYW1zLAorICAgICAgICBQYXJhbXMgYmxvYikgeworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtUG9pbnRlcnMsIGJsb2IpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNvcHlQYXJhbXNGcm9tQmxvYiAtLSBmYWlsZWQgdG8gcGFyc2UuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHBhcmFtcy0+cmVzaXplKHBhcmFtUG9pbnRlcnMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgcGFyYW1Qb2ludGVyIDogcGFyYW1Qb2ludGVycykgeworICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiY29weVBhcmFtc0Zyb21CbG9iIC0tIG51bGwgcGFyYW1Qb2ludGVyLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgKCpwYXJhbXMpW2krK10ucmVzZXQocmVpbnRlcnByZXRfY2FzdDxUKj4oCisgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weSgqcGFyYW1Qb2ludGVyKS5yZWxlYXNlKCkpKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gc3RkOjp2ZWN0b3I8Y29uc3QgQzJQYXJhbSo+IC0+IFBhcmFtcworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgQzJQYXJhbSo+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IC0+IFBhcmFtcworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAtPiBQYXJhbXMKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJnBhcmFtcykgeworICAgIHJldHVybiBfY3JlYXRlUGFyYW1zQmxvYihibG9iLCBwYXJhbXMpOworfQorCisvLyBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJUdW5pbmc+PiAtPiBQYXJhbXMKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IC0+IFBhcmFtcworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gUGFyYW1zIC0+IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4KK2Jvb2wgY29weVBhcmFtc0Zyb21CbG9iKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBwYXJhbXMsCisgICAgICAgIFBhcmFtcyBibG9iKSB7CisgICAgcmV0dXJuIF9jb3B5UGFyYW1zRnJvbUJsb2IocGFyYW1zLCBibG9iKTsKK30KKworLy8gUGFyYW1zIC0+IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+Citib29sIGNvcHlQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyVHVuaW5nPj4qIHBhcmFtcywKKyAgICAgICAgUGFyYW1zIGJsb2IpIHsKKyAgICByZXR1cm4gX2NvcHlQYXJhbXNGcm9tQmxvYihwYXJhbXMsIGJsb2IpOworfQorCisvLyBQYXJhbXMgLT4gdXBkYXRlIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4KK2Jvb2wgdXBkYXRlUGFyYW1zRnJvbUJsb2IoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgcGFyYW1zLAorICAgICAgICBjb25zdCBQYXJhbXMmIGJsb2IpIHsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDMyX3QsIEMyUGFyYW0qPiBpbmRleDJwYXJhbTsKKyAgICBmb3IgKEMyUGFyYW0qIGNvbnN0JiBwYXJhbSA6IHBhcmFtcykgeworICAgICAgICBpZiAoIXBhcmFtKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJ1cGRhdGVQYXJhbXNGcm9tQmxvYiAtLSBudWxsIG91dHB1dCBwYXJhbS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChpbmRleDJwYXJhbS5maW5kKHBhcmFtLT5pbmRleCgpKSA9PSBpbmRleDJwYXJhbS5lbmQoKSkgeworICAgICAgICAgICAgaW5kZXgycGFyYW0uZW1wbGFjZShwYXJhbS0+aW5kZXgoKSwgcGFyYW0pOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtUG9pbnRlcnMsIGJsb2IpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInVwZGF0ZVBhcmFtc0Zyb21CbG9iIC0tIGZhaWxlZCB0byBwYXJzZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgcGFyYW1Qb2ludGVyIDogcGFyYW1Qb2ludGVycykgeworICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidXBkYXRlUGFyYW1zRnJvbUJsb2IgLS0gbnVsbCBpbnB1dCBwYXJhbS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGRlY2x0eXBlKGluZGV4MnBhcmFtKTo6aXRlcmF0b3IgaSA9IGluZGV4MnBhcmFtLmZpbmQoCisgICAgICAgICAgICAgICAgcGFyYW1Qb2ludGVyLT5pbmRleCgpKTsKKyAgICAgICAgaWYgKGkgPT0gaW5kZXgycGFyYW0uZW5kKCkpIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgInVwZGF0ZVBhcmFtc0Zyb21CbG9iIC0tIGluZGV4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgcGFyYW1Qb2ludGVyLT5pbmRleCgpIDw8ICIgbm90IGZvdW5kLiBTa2lwcGluZy4uLiI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWktPnNlY29uZC0+dXBkYXRlRnJvbSgqcGFyYW1Qb2ludGVyKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidXBkYXRlUGFyYW1zRnJvbUJsb2IgLS0gc2l6ZSBtaXNtYXRjaDogIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBwYXJhbXMuc2l6ZSgpIDw8ICIgdnMgIiA8PCBwYXJhbVBvaW50ZXItPnNpemUoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIChpbmRleCA9ICIgPDwgaS0+Zmlyc3QgPDwgIikuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQ29udmVydCBCdWZmZXJQb29sIFJlc3VsdFN0YXR1cyB0byBjMl9zdGF0dXNfdC4KK2MyX3N0YXR1c190IHRvQzJTdGF0dXMoUmVzdWx0U3RhdHVzIHJzKSB7CisgICAgc3dpdGNoIChycykgeworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpPSzoKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk6CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgY2FzZSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTOgorICAgICAgICByZXR1cm4gQzJfRFVQTElDQVRFOworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ6CisgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgY2FzZSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOgorICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiVW5yZWNvZ25pemVkIEJ1ZmZlclBvb2wgUmVzdWx0U3RhdHVzOiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQzMl90PihycykgPDwgIi4iOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvLyBDcmVhdGUgYSBHcmFwaGljQnVmZmVyIG9iamVjdCBmcm9tIGEgZ3JhcGhpYyBibG9jay4KK3NwPEdyYXBoaWNCdWZmZXI+IGNyZWF0ZUdyYXBoaWNCdWZmZXIoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2spIHsKKyAgICB1aW50MzJfdCB3aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgdWludDMyX3QgZm9ybWF0OworICAgIHVpbnQ2NF90IHVzYWdlOworICAgIHVpbnQzMl90IHN0cmlkZTsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgIHVpbnQ2NF90IGJxSWQ7CisgICAgaW50MzJfdCBicVNsb3Q7CisgICAgX1Vud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NNZXRhZGF0YSgKKyAgICAgICAgICAgIGJsb2NrLmhhbmRsZSgpLCAmd2lkdGgsICZoZWlnaHQsICZmb3JtYXQsICZ1c2FnZSwKKyAgICAgICAgICAgICZzdHJpZGUsICZnZW5lcmF0aW9uLCAmYnFJZCwgcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZicVNsb3QpKTsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKmdyYWxsb2NIYW5kbGUgPQorICAgICAgICAgICAgVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZShibG9jay5oYW5kbGUoKSk7CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlciA9CisgICAgICAgICAgICBuZXcgR3JhcGhpY0J1ZmZlcihncmFsbG9jSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY0J1ZmZlcjo6Q0xPTkVfSEFORExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgdXNhZ2UsIHN0cmlkZSk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoZ3JhbGxvY0hhbmRsZSk7CisgICAgcmV0dXJuIGdyYXBoaWNCdWZmZXI7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBCbG9ja1Byb2Nlc3Nvcj4KK3ZvaWQgZm9yRWFjaEJsb2NrKEMyRnJhbWVEYXRhJiBmcmFtZURhdGEsCisgICAgICAgICAgICAgICAgICBCbG9ja1Byb2Nlc3NvciBwcm9jZXNzKSB7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBidWZmZXIgOiBmcmFtZURhdGEuYnVmZmVycykgeworICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrIDoKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpKSB7CisgICAgICAgICAgICAgICAgcHJvY2VzcyhibG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBCbG9ja1Byb2Nlc3Nvcj4KK3ZvaWQgZm9yRWFjaEJsb2NrKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtMaXN0LAorICAgICAgICAgICAgICAgICAgQmxvY2tQcm9jZXNzb3IgcHJvY2VzcywKKyAgICAgICAgICAgICAgICAgIGJvb2wgcHJvY2Vzc0lucHV0LCBib29sIHByb2Nlc3NPdXRwdXQpIHsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0xpc3QpIHsKKyAgICAgICAgaWYgKCF3b3JrKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvY2Vzc0lucHV0KSB7CisgICAgICAgICAgICBmb3JFYWNoQmxvY2sod29yay0+aW5wdXQsIHByb2Nlc3MpOworICAgICAgICB9CisgICAgICAgIGlmIChwcm9jZXNzT3V0cHV0KSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcmtsZXQ+JiB3b3JrbGV0IDogd29yay0+d29ya2xldHMpIHsKKyAgICAgICAgICAgICAgICBpZiAod29ya2xldCkgeworICAgICAgICAgICAgICAgICAgICBmb3JFYWNoQmxvY2sod29ya2xldC0+b3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRIZ2JwKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwKSB7CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaGdicCA9CisgICAgICAgICAgICBpZ2JwLT5nZXRIYWxJbnRlcmZhY2U8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4oKTsKKyAgICByZXR1cm4gaGdicCA/IGhnYnAgOgorICAgICAgICAgICAgbmV3IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+KGlnYnApOworfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKK3N0YXR1c190IGF0dGFjaFRvQnVmZmVyUXVldWUoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBicVNsb3QpIHsKKyAgICBpZiAoIWlnYnApIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJhdHRhY2hUb0J1ZmZlclF1ZXVlIC0tIG51bGwgcHJvZHVjZXIuIjsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlciA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2spOworICAgIGdyYXBoaWNCdWZmZXItPnNldEdlbmVyYXRpb25OdW1iZXIoZ2VuZXJhdGlvbik7CisKKyAgICBMT0coVkVSQk9TRSkgPDwgImF0dGFjaFRvQnVmZmVyUXVldWUgLS0gYXR0YWNoaW5nIGJ1ZmZlcjoiCisgICAgICAgICAgICA8PCAiIGJsb2NrIGRpbWVuc2lvbiAiIDw8IGJsb2NrLndpZHRoKCkgPDwgIngiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGJsb2NrLmhlaWdodCgpCisgICAgICAgICAgICA8PCAiLCBncmFwaGljQnVmZmVyIGRpbWVuc2lvbiAiIDw8IGdyYXBoaWNCdWZmZXItPmdldFdpZHRoKCkgPDwgIngiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZ3JhcGhpY0J1ZmZlci0+Z2V0SGVpZ2h0KCkKKyAgICAgICAgICAgIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6c2V0ZmlsbCgnMCcpCisgICAgICAgICAgICA8PCAiLCBmb3JtYXQgMHgiIDw8IHN0ZDo6c2V0dyg4KSA8PCBncmFwaGljQnVmZmVyLT5nZXRQaXhlbEZvcm1hdCgpCisgICAgICAgICAgICA8PCAiLCB1c2FnZSAweCIgPDwgc3RkOjpzZXR3KDE2KSA8PCBncmFwaGljQnVmZmVyLT5nZXRVc2FnZSgpCisgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCBzdGQ6OnNldGZpbGwoJyAnKQorICAgICAgICAgICAgPDwgIiwgc3RyaWRlICIgPDwgZ3JhcGhpY0J1ZmZlci0+Z2V0U3RyaWRlKCkKKyAgICAgICAgICAgIDw8ICIsIGdlbmVyYXRpb24gIiA8PCBncmFwaGljQnVmZmVyLT5nZXRHZW5lcmF0aW9uTnVtYmVyKCk7CisKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBpZ2JwLT5hdHRhY2hCdWZmZXIoYnFTbG90LCBncmFwaGljQnVmZmVyKTsKKyAgICBpZiAocmVzdWx0ICE9IE9LKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiYXR0YWNoVG9CdWZmZXJRdWV1ZSAtLSBhdHRhY2hCdWZmZXIgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAic3RhdHVzID0gIiA8PCByZXN1bHQgPDwgIi4iOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBMT0coVkVSQk9TRSkgPDwgImF0dGFjaFRvQnVmZmVyUXVldWUgLS0gYXR0YWNoQnVmZmVyIHJldHVybmVkIHNsb3QgIyIKKyAgICAgICAgICAgICAgICAgPDwgKmJxU2xvdCA8PCAiLiI7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIGdldEJ1ZmZlclF1ZXVlQXNzaWdubWVudChjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBicVNsb3QpIHsKKyAgICByZXR1cm4gX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJRdWV1ZURhdGEoCisgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKGJsb2NrKSwKKyAgICAgICAgICAgIGdlbmVyYXRpb24sIGJxSWQsIGJxU2xvdCk7Cit9CisKK2Jvb2wgeWllbGRCdWZmZXJRdWV1ZUJsb2NrKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IGRhdGEgPQorICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YShibG9jayk7CisgICAgaWYgKGRhdGEgJiYgX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJRdWV1ZURhdGEoZGF0YSkpIHsKKyAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpZaWVsZEJsb2NrVG9CdWZmZXJRdWV1ZShkYXRhKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCB5aWVsZEJ1ZmZlclF1ZXVlQmxvY2tzKAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrTGlzdCwKKyAgICAgICAgYm9vbCBwcm9jZXNzSW5wdXQsIGJvb2wgcHJvY2Vzc091dHB1dCkgeworICAgIGZvckVhY2hCbG9jayh3b3JrTGlzdCwgeWllbGRCdWZmZXJRdWV1ZUJsb2NrLCBwcm9jZXNzSW5wdXQsIHByb2Nlc3NPdXRwdXQpOworfQorCitib29sIGhvbGRCdWZmZXJRdWV1ZUJsb2NrKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBkYXRhID0KKyAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6R2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEoYmxvY2spOworICAgIGlmICghZGF0YSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDMyX3Qgb2xkR2VuZXJhdGlvbjsKKyAgICB1aW50NjRfdCBvbGRJZDsKKyAgICBpbnQzMl90IG9sZFNsb3Q7CisgICAgLy8gSWYgdGhlIGJsb2NrIGlzIG5vdCBidWZmZXJxdWV1ZS1iYXNlZCwgZG8gbm90aGluZy4KKyAgICBpZiAoIV9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUXVldWVEYXRhKAorICAgICAgICAgICAgZGF0YSwgJm9sZEdlbmVyYXRpb24sICZvbGRJZCwgJm9sZFNsb3QpIHx8CisgICAgICAgICAgICAob2xkSWQgPT0gMCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIElmIHRoZSBibG9jaydzIGJxSWQgaXMgdGhlIHNhbWUgYXMgdGhlIGRlc2lyZWQgYnFJZCwganVzdCBob2xkLgorICAgIGlmICgob2xkSWQgPT0gYnFJZCkgJiYgKG9sZEdlbmVyYXRpb24gPT0gZ2VuZXJhdGlvbikpIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJob2xkQnVmZmVyUXVldWVCbG9jayAtLSBpbXBvcnQgd2l0aG91dCBhdHRhY2hpbmc6IgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBicUlkICIgPDwgb2xkSWQKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGJxU2xvdCAiIDw8IG9sZFNsb3QKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGdlbmVyYXRpb24gIiA8PCBnZW5lcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6SG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKGRhdGEsIGdldEhnYnAoaWdicCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIGF0dGFjaCB0byB0aGUgZ2l2ZW4gaWdicCwgd2hpY2ggbXVzdCBub3QgYmUgbnVsbC4KKyAgICBpZiAoIWlnYnApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDMyX3QgYnFTbG90OworICAgIHN0YXR1c190IHJlc3VsdCA9IGF0dGFjaFRvQnVmZmVyUXVldWUoYmxvY2ssIGlnYnAsIGdlbmVyYXRpb24sICZicVNsb3QpOworCisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJob2xkQnVmZmVyUXVldWVCbG9jayAtLSBmYWlsIHRvIGF0dGFjaDoiCisgICAgICAgICAgICAgICAgICAgPDwgIiB0YXJnZXQgYnFJZCAiIDw8IGJxSWQKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBnZW5lcmF0aW9uICIgPDwgZ2VuZXJhdGlvbgorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIExPRyhWRVJCT1NFKSA8PCAiaG9sZEJ1ZmZlclF1ZXVlQmxvY2sgLS0gYXR0YWNoZWQ6IgorICAgICAgICAgICAgICAgICA8PCAiIGJxSWQgIiA8PCBicUlkCisgICAgICAgICAgICAgICAgIDw8ICIsIGJxU2xvdCAiIDw8IGJxU2xvdAorICAgICAgICAgICAgICAgICA8PCAiLCBnZW5lcmF0aW9uICIgPDwgZ2VuZXJhdGlvbgorICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgX0MyQmxvY2tGYWN0b3J5OjpBc3NpZ25CbG9ja1RvQnVmZmVyUXVldWUoCisgICAgICAgICAgICBkYXRhLCBnZXRIZ2JwKGlnYnApLCBnZW5lcmF0aW9uLCBicUlkLCBicVNsb3QsIHRydWUpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIGhvbGRCdWZmZXJRdWV1ZUJsb2Nrcyhjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYnFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcklucHV0KSB7CisgICAgZm9yRWFjaEJsb2NrKHdvcmtMaXN0LAorICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoaG9sZEJ1ZmZlclF1ZXVlQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEsIGlnYnAsIGJxSWQsIGdlbmVyYXRpb24pLAorICAgICAgICAgICAgICAgICBmb3JJbnB1dCwgIWZvcklucHV0KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9PV05FUlMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzMzZTBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9PV05FUlMKQEAgLTAsMCArMSw5IEBACisjIE1lZGlhIHRlYW0KK2xham9zQGdvb2dsZS5jb20KK3Bhd2luQGdvb2dsZS5jb20KK3Rha2xlZUBnb29nbGUuY29tCit3b25zaWtAZ29vZ2xlLmNvbQorCisjIFZUUyB0ZWFtCit5aW1AZ29vZ2xlLmNvbQoremh1b3lhb0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4Nzc1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vQW5kcm9pZC5icApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c01lZGlhQzJWMV8wRGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJWdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcCIsCisgICAgICAgIC8vIm1lZGlhX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uY3BwIgorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9FbmNUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNNZWRpYUMyVjFfMERlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdC5jcHAiLAorICAgICAgICAvLyJtZWRpYV9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmNwcCIKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OTQ3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdC5jcHAKQEAgLTAsMCArMSw5NDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfYXVkaW9fZGVjX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKwordXNpbmcgYW5kcm9pZDo6QzJBbGxvY2F0b3JJb247CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmgiCisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCitzdHJ1Y3QgRnJhbWVJbmZvIHsKKyAgICBpbnQgYnl0ZXNDb3VudDsKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICBpbnQ2NF90IHRpbWVzdGFtcDsKK307CisKK2NsYXNzIExpbmVhckJ1ZmZlciA6IHB1YmxpYyBDMkJ1ZmZlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgTGluZWFyQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiYgYmxvY2spCisgICAgICAgIDogQzJCdWZmZXIoCisgICAgICAgICAgICAgIHtibG9jay0+c2hhcmUoYmxvY2stPm9mZnNldCgpLCBibG9jay0+c2l6ZSgpLCA6OkMyRmVuY2UoKSl9KSB7fQorfTsKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgOjpzdGQ6OnN0cmluZyBnZXRUZXN0Q2FzZUluZm8oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiA6OnN0ZDo6c3RyaW5nKCkgKworICAgICAgICAgICAgICAgICJDb21wb25lbnQ6ICIgKyBnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJJbnN0YW5jZTogIiArIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiUmVzOiAiICsgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKTsKKyAgICB9CisKKyAgICAvLyBnb29nbGUuY29kZWMyIEF1ZGlvIHRlc3Qgc2V0dXAKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKKyAgICAgICAgQUxPR1YoIkNvZGVjMkF1ZGlvRGVjSGlkbFRlc3QgU2V0VXAiKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgICAgIFt0aGlzXShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfTkUobUxpc3RlbmVyLCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xpZW50LT5jcmVhdGVDb21wb25lbnQoZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSwgbUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db21wb25lbnQpOworICAgICAgICBBU1NFUlRfTkUobUNvbXBvbmVudCwgbnVsbHB0cik7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgQ0hFQ0tfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1MaW5lYXJBbGxvY2F0b3IpLAorICAgICAgICAgICAgICAgICBDMl9PSyk7CisgICAgICAgIG1MaW5lYXJQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUxpbmVhckFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sSWQrKyk7CisgICAgICAgIEFTU0VSVF9ORShtTGluZWFyUG9vbCwgbnVsbHB0cik7CisKKyAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOworICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7CisgICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7CisgICAgICAgIH07CisgICAgICAgIGNvbnN0IFN0cmluZ1RvTmFtZSBrU3RyaW5nVG9OYW1lW10gPSB7CisgICAgICAgICAgICB7InhhYWMiLCB4YWFjfSwKKyAgICAgICAgICAgIHsibXAzIiwgbXAzfSwKKyAgICAgICAgICAgIHsiYW1ybmIiLCBhbXJuYn0sCisgICAgICAgICAgICB7ImFtcndiIiwgYW1yd2J9LAorICAgICAgICAgICAgeyJhYWMiLCBhYWN9LAorICAgICAgICAgICAgeyJ2b3JiaXMiLCB2b3JiaXN9LAorICAgICAgICAgICAgeyJvcHVzIiwgb3B1c30sCisgICAgICAgICAgICB7InBjbSIsIHBjbX0sCisgICAgICAgICAgICB7Imc3MTEuYWxhdyIsIGc3MTFhbGF3fSwKKyAgICAgICAgICAgIHsiZzcxMS5tbGF3IiwgZzcxMW1sYXd9LAorICAgICAgICAgICAgeyJnc20iLCBnc219LAorICAgICAgICAgICAgeyJyYXciLCByYXd9LAorICAgICAgICAgICAgeyJmbGFjIiwgZmxhY30sCisgICAgICAgIH07CisgICAgICAgIGNvbnN0IHNpemVfdCBrTnVtU3RyaW5nVG9OYW1lID0KKyAgICAgICAgICAgIHNpemVvZihrU3RyaW5nVG9OYW1lKSAvIHNpemVvZihrU3RyaW5nVG9OYW1lWzBdKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBzdWJzdHJpbmc7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbXA7CisgICAgICAgIHN1YnN0cmluZyA9IHN0ZDo6c3RyaW5nKGdFbnYtPmdldENvbXBvbmVudCgpKTsKKyAgICAgICAgLyogVE9ETzogYmV0dGVyIGFwcHJvYWNoIHRvIGZpbmQgdGhlIGNvbXBvbmVudCAqLworICAgICAgICAvKiAiYzIuYW5kcm9pZC4iID0+IDExdGggcG9zaXRpb24gKi8KKyAgICAgICAgc2l6ZV90IHBvcyA9IDExOworICAgICAgICBzaXplX3QgbGVuID0gc3Vic3RyaW5nLmZpbmQoIi5kZWNvZGVyIiwgcG9zKTsKKyAgICAgICAgY29tcCA9IHN1YnN0cmluZy5zdWJzdHIocG9zLCBsZW4gLSBwb3MpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVN0cmluZ1RvTmFtZTsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoY29tcC5jX3N0cigpLCBrU3RyaW5nVG9OYW1lW2ldLk5hbWUpKSB7CisgICAgICAgICAgICAgICAgbUNvbXBOYW1lID0ga1N0cmluZ1RvTmFtZVtpXS5Db21wTmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRW9zID0gZmFsc2U7CisgICAgICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIG1UaW1lc3RhbXBVcyA9IDB1OworICAgICAgICBtVGltZXN0YW1wRGV2VGVzdCA9IGZhbHNlOworICAgICAgICBpZiAobUNvbXBOYW1lID09IHVua25vd25fY29tcCkgbURpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1EaXNhYmxlVGVzdCkgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBEaXNhYmxlZCBcbiI7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUNvbXBvbmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAoOjp0ZXN0aW5nOjpUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworICAgICAgICAgICAgbUNvbXBvbmVudC0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUNvbXBvbmVudCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgU3VwZXI6OlRlYXJEb3duKCk7CisgICAgfQorCisgICAgc3RydWN0IG91dHB1dE1ldGFEYXRhIHsKKyAgICAgICAgdWludDY0X3QgdGltZXN0YW1wVXM7CisgICAgICAgIHVpbnQzMl90IHJhbmdlTGVuZ3RoOworICAgIH07CisgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCisgICAgdm9pZCBoYW5kbGVXb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtJdGVtcykgeworICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gRm9yIGRlY29kZXIgY29tcG9uZW50cyBjdXJyZW50IHRpbWVzdGFtcCBhbHdheXMgZXhjZWVkcworICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgIGJvb2wgY29kZWNDb25maWcgPSAoKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNvZGVjQ29uZmlnICYmCisgICAgICAgICAgICAgICAgICAgICF3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9HRSh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVcyk7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVcyA9CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmFuZ2VMZW5ndGggPQorICAgICAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkuY2FwYWNpdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgLy9MaXN0IG9mIHRpbWVzdGFtcCB2YWx1ZXMgYW5kIG91dHB1dCBzaXplIHRvIGNhbGN1bGF0ZSB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRNZXRhRGF0YSBtZXRhID0ge21UaW1lc3RhbXBVcywgcmFuZ2VMZW5ndGh9OworICAgICAgICAgICAgICAgICAgICAgICAgb0J1ZmZlck1ldGFEYXRhLnB1c2hfYmFjayhtZXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib29sIG1Dc2QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB3b3JrRG9uZShtQ29tcG9uZW50LCB3b3JrLCBtRmx1c2hlZEluZGljZXMsIG1RdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRW9zLCBtQ3NkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgICAgICAgICAgICAgKHZvaWQpbUNzZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGVudW0gc3RhbmRhcmRDb21wIHsKKyAgICAgICAgeGFhYywKKyAgICAgICAgbXAzLAorICAgICAgICBhbXJuYiwKKyAgICAgICAgYW1yd2IsCisgICAgICAgIGFhYywKKyAgICAgICAgdm9yYmlzLAorICAgICAgICBvcHVzLAorICAgICAgICBwY20sCisgICAgICAgIGc3MTFhbGF3LAorICAgICAgICBnNzExbWxhdywKKyAgICAgICAgZ3NtLAorICAgICAgICByYXcsCisgICAgICAgIGZsYWMsCisgICAgICAgIHVua25vd25fY29tcCwKKyAgICB9OworCisgICAgYm9vbCBtRW9zOworICAgIGJvb2wgbURpc2FibGVUZXN0OworICAgIGJvb2wgbVRpbWVzdGFtcERldlRlc3Q7CisgICAgc3RhbmRhcmRDb21wIG1Db21wTmFtZTsKKyAgICB1aW50NjRfdCBtVGltZXN0YW1wVXM7CisgICAgdWludDMyX3QgbUZyYW1lc1JlY2VpdmVkOworICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbUZsdXNoZWRJbmRpY2VzOworICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbVRpbWVzdGFtcFVzbGlzdDsKKyAgICA6OmFuZHJvaWQ6Okxpc3Q8b3V0cHV0TWV0YURhdGE+IG9CdWZmZXJNZXRhRGF0YTsKKworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xJZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1MaW5lYXJQb29sOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUxpbmVhckFsbG9jYXRvcjsKKworICAgIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudD4gbUNsaWVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKworICAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgICAgfQorfTsKKwordm9pZCB2YWxpZGF0ZUNvbXBvbmVudCgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXBOYW1lLCBib29sJiBkaXNhYmxlVGVzdCkgeworICAgIC8vIFZhbGlkYXRlIGl0cyBhIEMyIENvbXBvbmVudAorICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJjMiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJOb3QgYSBjMiBjb21wb25lbnQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgaXRzIG5vdCBhbiBlbmNvZGVyIGFuZCB0aGUgY29tcG9uZW50IHRvIGJlIHRlc3RlZCBpcyBhdWRpbworICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJlbmNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIkV4cGVjdGVkIERlY29kZXIsIGdpdmVuIEVuY29kZXIiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9CisgICAgICAgIGNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBxdWVyaWVkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlZCIsIGMyZXJyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnN0cmluZyBpbnB1dERvbWFpbiA9CisgICAgICAgICAgICAoKEMyU3RyZWFtTWVkaWFUeXBlU2V0dGluZzo6aW5wdXQqKXF1ZXJpZWRbMF0uZ2V0KCkpLT5tLnZhbHVlOworICAgICAgICBpZiAoaW5wdXREb21haW4uZmluZCgiYXVkaW8vIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBBdWRpbyBDb21wb25lbnQiKTsKKyAgICAgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZhbGlkYXRlcyBjb21wb25lbnQgbmFtZQorICAgIGlmIChjb21wTmFtZSA9PSBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0Ojp1bmtub3duX2NvbXApIHsKKyAgICAgICAgQUxPR0UoIkNvbXBvbmVudCBJblZhbGlkIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiQ29tcG9uZW50IFZhbGlkIik7Cit9CisKKy8vIFNldCBEZWZhdWx0IGNvbmZpZyBwYXJhbS4KK2Jvb2wgc2V0dXBDb25maWdQYXJhbSgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgaW50MzJfdCogYml0U3RyZWFtSW5mbykgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIGJpdFN0cmVhbUluZm9bMF0pOworICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIGJpdFN0cmVhbUluZm9bMV0pOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGNvbmZpZ1BhcmFteyZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm99OworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgIGNvbXBvbmVudC0+Y29uZmlnKGNvbmZpZ1BhcmFtLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIGlmIChzdGF0dXMgPT0gQzJfT0sgJiYgZmFpbHVyZXMuc2l6ZSgpID09IDB1KSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIEluIGRlY29kZXIgY29tcG9uZW50cywgb2Z0ZW4gdGhlIGlucHV0IHBhcmFtZXRlcnMgZ2V0IHVwZGF0ZWQgdXBvbgorLy8gcGFyc2luZyB0aGUgaGVhZGVyIG9mIGVsZW1lbnRhcnkgc3RyZWFtLiBDbGllbnQgbmVlZHMgdG8gY29sbGVjdCB0aGlzCisvLyBpbmZvcm1hdGlvbiBhbmQgcmVjb25maWd1cmUKK3ZvaWQgZ2V0SW5wdXRDaGFubmVsSW5mbygKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXBOYW1lLCBpbnQzMl90KiBiaXRTdHJlYW1JbmZvKSB7CisgICAgLy8gcXVlcnkgblNhbXBsZVJhdGUgYW5kIG5DaGFubmVscworICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxDMlBhcmFtOjpJbmRleD4gaW5kaWNlc3sKKyAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICB9OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gaW5QYXJhbXM7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgY29tcG9uZW50LT5xdWVyeSh7fSwgaW5kaWNlcywgQzJfRE9OVF9CTE9DSywgJmluUGFyYW1zKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LICYmIGluUGFyYW1zLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlZCIsIHN0YXR1cyk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gc2l6ZW9mKEMyUGFyYW0pOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluUGFyYW1zLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBDMlBhcmFtKiBwYXJhbSA9IGluUGFyYW1zW2ldLmdldCgpOworICAgICAgICAgICAgYml0U3RyZWFtSW5mb1tpXSA9ICooaW50MzJfdCopKCh1aW50OF90KilwYXJhbSArIG9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjb21wTmFtZSkgeworICAgICAgICAgICAgY2FzZSBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjphbXJuYjogeworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzBdLCA4MDAwKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1sxXSwgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OmFtcndiOiB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGJpdFN0cmVhbUluZm9bMF0sIDE2MDAwKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1sxXSwgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OmdzbTogeworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzBdLCA4MDAwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIG51bWJlciBvZiBlbGVtZW50YXJ5IHN0cmVhbXMgcGVyIGNvbXBvbmVudAorI2RlZmluZSBTVFJFQU1fQ09VTlQgMgorCisvLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBhbmQgbWV0YWRhdGEgZm9yIGNvbXBvbmVudCB0ZXN0aW5nCit2b2lkIEdldFVSTEZvckNvbXBvbmVudChDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcCwgY2hhciogbVVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGluZm8sIHNpemVfdCBzdHJlYW1JbmRleCA9IDApIHsKKyAgICBzdHJ1Y3QgQ29tcFRvVVJMIHsKKyAgICAgICAgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXA7CisgICAgICAgIGNvbnN0IGNoYXIgbVVSTFtTVFJFQU1fQ09VTlRdWzUxMl07CisgICAgICAgIGNvbnN0IGNoYXIgaW5mb1tTVFJFQU1fQ09VTlRdWzUxMl07CisgICAgfTsKKyAgICBBU1NFUlRfVFJVRShzdHJlYW1JbmRleCA8IFNUUkVBTV9DT1VOVCk7CisKKyAgICBzdGF0aWMgY29uc3QgQ29tcFRvVVJMIGtDb21wVG9VUkxbXSA9IHsKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6eGFhYywKKyAgICAgICAgIHsiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYyIsCisgICAgICAgICAgImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMifSwKKyAgICAgICAgIHsiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLAorICAgICAgICAgICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6bXAzLAorICAgICAgICAgeyJiYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzIiwKKyAgICAgICAgICAiYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMyJ9LAorICAgICAgICAgeyJiYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHouaW5mbyIsCisgICAgICAgICAgImJiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphYWMsCisgICAgICAgICB7ImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMiLAorICAgICAgICAgICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjIn0sCisgICAgICAgICB7ImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIiwKKyAgICAgICAgICAiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFtcm5iLAorICAgICAgICAgeyJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iIiwKKyAgICAgICAgICAic2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5hbXJuYiJ9LAorICAgICAgICAgeyJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmluZm8iLAorICAgICAgICAgICJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6X211bHRpX2ZyYW1lLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFtcndiLAorICAgICAgICAgeyJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiIiwKKyAgICAgICAgICAiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YiJ9LAorICAgICAgICAgeyJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmluZm8iLAorICAgICAgICAgICJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6X211bHRpX2ZyYW1lLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnZvcmJpcywKKyAgICAgICAgIHsiYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LnZvcmJpcyIsICIifSwKKyAgICAgICAgIHsiYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLCAiIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpvcHVzLAorICAgICAgICAgeyJiYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm9wdXMiLCAiIn0sCisgICAgICAgICB7ImJiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyIsICIifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Omc3MTFhbGF3LAorICAgICAgICAgeyJiYmJfZzcxMWFsYXdfMWNoXzhraHoucmF3IiwgIiJ9LAorICAgICAgICAgeyJiYmJfZzcxMWFsYXdfMWNoXzhraHouaW5mbyIsICIifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Omc3MTFtbGF3LAorICAgICAgICAgeyJiYmJfZzcxMW11bGF3XzFjaF84a2h6LnJhdyIsICIifSwKKyAgICAgICAgIHsiYmJiX2c3MTFtdWxhd18xY2hfOGtoei5pbmZvIiwgIiJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6Z3NtLAorICAgICAgICAgeyJiYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5yYXciLCAiIn0sCisgICAgICAgICB7ImJiYl9nc21fMWNoXzhraHpfMTNrYnBzLmluZm8iLCAiIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpyYXcsCisgICAgICAgICB7ImJiYl9yYXdfMWNoXzhraHpfczMybGUucmF3IiwgIiJ9LAorICAgICAgICAgeyJiYmJfcmF3XzFjaF84a2h6X3MzMmxlLmluZm8iLCAiIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpmbGFjLAorICAgICAgICAgeyJiYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmZsYWMiLCAiIn0sCisgICAgICAgICB7ImJiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouaW5mbyIsICIifX0sCisgICAgfTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGtDb21wVG9VUkwpIC8gc2l6ZW9mKGtDb21wVG9VUkxbMF0pOyArK2kpIHsKKyAgICAgICAgaWYgKGtDb21wVG9VUkxbaV0uY29tcCA9PSBjb21wKSB7CisgICAgICAgICAgICBzdHJjYXQobVVSTCwga0NvbXBUb1VSTFtpXS5tVVJMW3N0cmVhbUluZGV4XSk7CisgICAgICAgICAgICBzdHJjYXQoaW5mbywga0NvbXBUb1VSTFtpXS5pbmZvW3N0cmVhbUluZGV4XSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgZGVjb2RlTkZyYW1lcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjptdXRleCAmcXVldWVMb2NrLCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4mIGZsdXNoZWRJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIGxpbmVhclBvb2wsCisgICAgICAgICAgICAgICAgICAgc3RkOjppZnN0cmVhbSYgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+KiBJbmZvLAorICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCByYW5nZSwgYm9vbCBzaWduYWxFT1MgPSB0cnVlKSB7CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIGludCBmcmFtZUlEID0gb2Zmc2V0OworICAgIGludCBtYXhSZXRyeSA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKGZyYW1lSUQgPT0gKGludClJbmZvLT5zaXplKCkgfHwgZnJhbWVJRCA9PSAob2Zmc2V0ICsgcmFuZ2UpKSBicmVhazsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAvLyBQcmVwYXJlIEMyV29yaworICAgICAgICB3aGlsZSAoIXdvcmsgJiYgKG1heFJldHJ5IDwgTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgaWYgKCF3b3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHdvcmsuc3dhcCh3b3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgd29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXdvcmsgJiYgKG1heFJldHJ5ID49IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiV2FpdCBmb3IgZ2VuZXJhdGluZyBDMldvcmsgZXhjZWVkZWQgdGltZW91dCI7CisgICAgICAgIH0KKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAgPSAoKkluZm8pW2ZyYW1lSURdLnRpbWVzdGFtcDsKKyAgICAgICAgaWYgKCgqSW5mbylbZnJhbWVJRF0uZmxhZ3MpIGZsYWdzID0gMXUgPDwgKCgqSW5mbylbZnJhbWVJRF0uZmxhZ3MgLSAxKTsKKyAgICAgICAgaWYgKHNpZ25hbEVPUyAmJiAoKGZyYW1lSUQgPT0gKGludClJbmZvLT5zaXplKCkgLSAxKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVJRCA9PSAob2Zmc2V0ICsgcmFuZ2UgLSAxKSkpKQorICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IGZyYW1lSUQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjayhmcmFtZUlEKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2l6ZSA9ICgqSW5mbylbZnJhbWVJRF0uYnl0ZXNDb3VudDsKKyAgICAgICAgY2hhciogZGF0YSA9IChjaGFyKiltYWxsb2Moc2l6ZSk7CisgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKTsKKworICAgICAgICBlbGVTdHJlYW0ucmVhZChkYXRhLCBzaXplKTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5nY291bnQoKSwgc2l6ZSk7CisKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICBpZiAoc2l6ZSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICAgICAgQVNTRVJUX0VRKEMyX09LLAorICAgICAgICAgICAgICAgICAgICBsaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgJmJsb2NrKSk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShibG9jayk7CisKKyAgICAgICAgICAgIC8vIFdyaXRlIFZpZXcKKyAgICAgICAgICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDMkxpbmVhckJsb2NrOjptYXAoKSBmYWlsZWQgOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBU1NFUlRfRVEoKHNpemVfdClzaXplLCB2aWV3LmNhcGFjaXR5KCkpOworICAgICAgICAgICAgQVNTRVJUX0VRKDB1LCB2aWV3Lm9mZnNldCgpKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgoc2l6ZV90KXNpemUsIHZpZXcuc2l6ZSgpKTsKKworICAgICAgICAgICAgbWVtY3B5KHZpZXcuYmFzZSgpLCBkYXRhLCBzaXplKTsKKworICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IExpbmVhckJ1ZmZlcihibG9jaykpOworICAgICAgICAgICAgZnJlZShkYXRhKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgLy8gRE8gVEhFIERFQ09ESU5HCisgICAgICAgIEFTU0VSVF9FUShjb21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKyAgICAgICAgQUxPR1YoIkZyYW1lICMlZCBzaXplID0gJWQgcXVldWVkIiwgZnJhbWVJRCwgc2l6ZSk7CisgICAgICAgIGZyYW1lSUQrKzsKKyAgICAgICAgbWF4UmV0cnkgPSAwOworICAgIH0KK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIHZhbGlkYXRlQ29tcE5hbWUpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQUxPR1YoIkNoZWNrcyBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGlzIGEgdmFsaWQgYXVkaW8gY29tcG9uZW50Iik7CisgICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbUNvbXBOYW1lLCBtRGlzYWJsZVRlc3QpOworICAgIEFTU0VSVF9FUShtRGlzYWJsZVRlc3QsIGZhbHNlKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIGNvbmZpZ0NvbXApIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgY29tcG9uZW50IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24iKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK2NsYXNzIENvZGVjMkF1ZGlvRGVjRGVjb2RlVGVzdAorICAgIDogcHVibGljIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjpwYWlyPGludDMyX3QsIGJvb2w+PiB7Cit9OworCitURVNUX1AoQ29kZWMyQXVkaW9EZWNEZWNvZGVUZXN0LCBEZWNvZGVUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIkRlY29kZXMgaW5wdXQgZmlsZSIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIHVpbnQzMl90IHN0cmVhbUluZGV4ID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICBib29sIHNpZ25hbEVPUyA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIG1UaW1lc3RhbXBEZXZUZXN0ID0gdHJ1ZTsKKyAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvLCBzdHJlYW1JbmRleCk7CisgICAgaWYgKCFzdHJjbXAobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSkpIHsKKyAgICAgICAgQUxPR1YoIkVNUFRZIElOUFVUIGdFbnYtPmdldFJlcygpLmNfc3RyKCkgJXMgbVVSTCAgJXMgIiwKKyAgICAgICAgICAgICAgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSwgbVVSTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgIGJvb2wgY29kZWNDb25maWcgPQorICAgICAgICAgICAgKCgxIDw8IChmbGFncyAtIDEpKSAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMDsKKyAgICAgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0ICYmICFjb2RlY0NvbmZpZykKKyAgICAgICAgICAgIG1UaW1lc3RhbXBVc2xpc3QucHVzaF9iYWNrKHRpbWVzdGFtcCk7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKyAgICAvLyBSZXNldCB0b3RhbCBubyBvZiBmcmFtZXMgcmVjZWl2ZWQKKyAgICBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgIG1UaW1lc3RhbXBVcyA9IDA7CisgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzJdID0gezB9OworICAgIGlmIChtQ29tcE5hbWUgPT0gcmF3KSB7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOworICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgfQorICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgKGludClJbmZvLnNpemUoKSwgc2lnbmFsRU9TKSk7CisKKyAgICAvLyBJZiBFT1MgaXMgbm90IHNlbnQsIHNlbmRpbmcgZW1wdHkgaW5wdXQgd2l0aCBFT1MgZmxhZworICAgIHNpemVfdCBpbmZvU2l6ZSA9IEluZm8uc2l6ZSgpOworICAgIGlmICghc2lnbmFsRU9TKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIDEpKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB0ZXN0SW5wdXRCdWZmZXIobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNLCBmYWxzZSkpOworICAgICAgICBpbmZvU2l6ZSArPSAxOworICAgIH0KKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBpbmZvU2l6ZSkgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dFKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXp1IiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBpbmZvU2l6ZSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCkgeworICAgICAgICB1aW50NjRfdCBleHBUczsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlc1JlY2VpdmVkID0gMDsKKyAgICAgICAgLy8gVXBkYXRlIFNhbXBsZVJhdGUgYW5kIENoYW5uZWxDb3VudAorICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgICAgIGludCBuU2FtcGxlUmF0ZSA9IGJpdFN0cmVhbUluZm9bMF07CisgICAgICAgIGludCBuQ2hhbm5lbHMgPSBiaXRTdHJlYW1JbmZvWzFdOworICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBpdEluID0gbVRpbWVzdGFtcFVzbGlzdC5iZWdpbigpOworICAgICAgICBhbmRyb2lkOjpMaXN0PG91dHB1dE1ldGFEYXRhPjo6aXRlcmF0b3IgaXRPdXQgPSBvQnVmZmVyTWV0YURhdGEuYmVnaW4oKTsKKyAgICAgICAgRVhQRUNUX0VRKCppdEluLCBpdE91dC0+dGltZXN0YW1wVXMpOworICAgICAgICBleHBUcyA9ICppdEluOworICAgICAgICB3aGlsZSAoaXRPdXQgIT0gb0J1ZmZlck1ldGFEYXRhLmVuZCgpKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZXhwVHMsIGl0T3V0LT50aW1lc3RhbXBVcyk7CisgICAgICAgICAgICBpZiAoZXhwVHMgIT0gaXRPdXQtPnRpbWVzdGFtcFVzKSBicmVhazsKKyAgICAgICAgICAgIC8vIGJ1ZmZlciBzYW1wbGVzID0gKCh0b3RhbCBieXRlcykgLyAoYWMgKiAoYml0cyBwZXIgc2FtcGxlIC8gOCkpCisgICAgICAgICAgICBzYW1wbGVzUmVjZWl2ZWQgKz0gKChpdE91dC0+cmFuZ2VMZW5ndGgpIC8gKG5DaGFubmVscyAqIDIpKTsKKyAgICAgICAgICAgIGV4cFRzID0gc2FtcGxlc1JlY2VpdmVkICogMTAwMDAwMGxsIC8gblNhbXBsZVJhdGU7CisgICAgICAgICAgICBpdE91dCsrOworICAgICAgICB9CisgICAgICAgIGl0SW4gPSBtVGltZXN0YW1wVXNsaXN0LmVuZCgpOworICAgICAgICAtLWl0SW47CisgICAgICAgIEVYUEVDVF9HVChleHBUcywgKml0SW4pOworICAgICAgICBvQnVmZmVyTWV0YURhdGEuY2xlYXIoKTsKKyAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5jbGVhcigpOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisvLyBEZWNvZGVUZXN0IHdpdGggU3RyZWFtSW5kZXggYW5kIEVPUyAvIE5vIEVPUworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU3RyZWFtSW5kZXhBbmRFT1MsIENvZGVjMkF1ZGlvRGVjRGVjb2RlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKHN0ZDo6bWFrZV9wYWlyKDAsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKDAsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoMSwgdHJ1ZSkpKTsKKworLy8gdGh1bWJuYWlsIHRlc3QKK1RFU1RfRihDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LCBUaHVtYm5haWxUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgUmVxdWVzdCBmb3IgdGh1bWJuYWlsIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07CisgICAgaWYgKG1Db21wTmFtZSA9PSByYXcpIHsKKyAgICAgICAgYml0U3RyZWFtSW5mb1swXSA9IDgwMDA7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMV0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICB9CisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIGJpdFN0cmVhbUluZm8pKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisKKyAgICAvLyByZXF1ZXN0IEVPUyBmb3IgdGh1bWJuYWlsCisgICAgLy8gc2lnbmFsIEVPUyBmbGFnIHdpdGggbGFzdCBmcmFtZQorICAgIHNpemVfdCBpID0gLTE7CisgICAgZG8geworICAgICAgICBpKys7CisgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgaWYgKEluZm9baV0uZmxhZ3MpIGZsYWdzID0gMXUgPDwgKEluZm9baV0uZmxhZ3MgLSAxKTsKKworICAgIH0gd2hpbGUgKCEoZmxhZ3MgJiBTWU5DX0ZSQU1FKSk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsCisgICAgICAgIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCBpICsgMSkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIEVYUEVDVF9HRShtRnJhbWVzUmVjZWl2ZWQsIDFVKTsKKyAgICBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgRU9TVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IGVtcHR5IGlucHV0IGJ1ZmZlciB3aXRoIEVPUyBmbGFnIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgLy8gUHJlcGFyZSBDMldvcmsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGlmICghbVdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLnN3YXAobVdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIm1Xb3JrUXVldWUgRW1wdHkgYXQgdGhlIHN0YXJ0IG9mIHRlc3QiOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KUMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSAwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IDA7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworCisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAobVdvcmtRdWV1ZS5zaXplKCkgIT0gTUFYX0lOUFVUX0JVRkZFUlMpIHsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtV29ya1F1ZXVlLnNpemUoKSwgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgRmx1c2hUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3RzIEZsdXNoIGNhbGxzIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworICAgIGludDMyX3QgYml0U3RyZWFtSW5mb1syXSA9IHswfTsKKyAgICBpZiAobUNvbXBOYW1lID09IHJhdykgeworICAgICAgICBiaXRTdHJlYW1JbmZvWzBdID0gODAwMDsKKyAgICAgICAgYml0U3RyZWFtSW5mb1sxXSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1Db21wTmFtZSwgYml0U3RyZWFtSW5mbykpOworICAgIH0KKyAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obUNvbXBvbmVudCwgYml0U3RyZWFtSW5mbykpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICAvLyBEZWNvZGUgMTI4IGZyYW1lcyBhbmQgZmx1c2guIGhlcmUgMTI4IGlzIGNob3NlbiB0byBlbnN1cmUgdGhlcmUgaXMgYSBrZXkKKyAgICAvLyBmcmFtZSBhZnRlciB0aGlzIHNvIHRoYXQgdGhlIGJlbG93IHNlY3Rpb24gY2FuIGJlIGNvdmVyZWQgZm9yIGFsbAorICAgIC8vIGNvbXBvbmVudHMKKyAgICB1aW50MzJfdCBudW1GcmFtZXNGbHVzaGVkID0gMTI4OworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgbnVtRnJhbWVzRmx1c2hlZCwgZmFsc2UpKTsKKyAgICAvLyBmbHVzaAorICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gZmx1c2hlZFdvcms7CisgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworICAgIHVpbnQ2NF90IGZyYW1lSW5kZXg7CisgICAgeworICAgICAgICAvL1VwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9CisgICAgICAgICAgICAgICAgc3RkOjpmaW5kKG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gU2VlayB0byBuZXh0IGtleSBmcmFtZSBhbmQgc3RhcnQgZGVjb2RpbmcgdGlsbCB0aGUgZW5kCisgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CisgICAgaW50IGluZGV4ID0gbnVtRnJhbWVzRmx1c2hlZDsKKyAgICBib29sIGtleUZyYW1lID0gZmFsc2U7CisgICAgZmxhZ3MgPSAwOworICAgIHdoaWxlIChpbmRleCA8IChpbnQpSW5mby5zaXplKCkpIHsKKyAgICAgICAgaWYgKEluZm9baW5kZXhdLmZsYWdzKSBmbGFncyA9IDF1IDw8IChJbmZvW2luZGV4XS5mbGFncyAtIDEpOworICAgICAgICBpZiAoKGZsYWdzICYgU1lOQ19GUkFNRSkgPT0gU1lOQ19GUkFNRSkgeworICAgICAgICAgICAga2V5RnJhbWUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ3MgPSAwOworICAgICAgICBlbGVTdHJlYW0uaWdub3JlKEluZm9baW5kZXhdLmJ5dGVzQ291bnQpOworICAgICAgICBpbmRleCsrOworICAgIH0KKyAgICBpZiAoa2V5RnJhbWUpIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBkZWNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpSW5mby5zaXplKCkgLSBpbmRleCkpOworICAgIH0KKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBlcnIgPQorICAgICAgICBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgeworICAgICAgICAvL1VwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9CisgICAgICAgICAgICAgICAgc3RkOjpmaW5kKG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LCBEZWNvZGVUZXN0RW1wdHlCdWZmZXJzSW5zZXJ0ZWQpIHsKKyAgICBkZXNjcmlwdGlvbigiRGVjb2RlIHdpdGggbXVsdGlwbGUgZW1wdHkgaW5wdXQgZnJhbWVzIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKSA8PCBtVVJMIDw8ICIgLSBmaWxlIG5vdCBmb3VuZCI7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgdWludDMyX3QgZnJhbWVJZCA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgYm9vbCBjb2RlY0NvbmZpZyA9IGZhbHNlOworICAgIC8vIFRoaXMgdGVzdCBpbnRyb2R1Y2VzIGVtcHR5IENTRCBhZnRlciBldmVyeSAyMHRoIGZyYW1lCisgICAgLy8gYW5kIGVtcHR5IGlucHV0IGZyYW1lcyBhdCBhbiBpbnRlcnZhbCBvZiA1IGZyYW1lcy4KKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShmcmFtZUlkICUgNSkpIHsKKyAgICAgICAgICAgIGlmICghKGZyYW1lSWQgJSAyMCkpIGZsYWdzID0gMzI7CisgICAgICAgICAgICBlbHNlIGZsYWdzID0gMDsKKyAgICAgICAgICAgIGJ5dGVzQ291bnQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgICAgICBjb2RlY0NvbmZpZyA9IGZsYWdzID8KKyAgICAgICAgICAgICAgICAoKDEgPDwgKGZsYWdzIC0gMSkpICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwIDogMDsKKyAgICAgICAgfQorICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgICAgICBmcmFtZUlkKys7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07CisgICAgaWYgKG1Db21wTmFtZSA9PSByYXcpIHsKKyAgICAgICAgYml0U3RyZWFtSW5mb1swXSA9IDgwMDA7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMV0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICB9CisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIGJpdFN0cmVhbUluZm8pKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsCisgICAgICAgIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCAoaW50KUluZm8uc2l6ZSgpKSk7CisKKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgaWYgKCFtRW9zKSB7CisgICAgICAgIEFMT0dWKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgfQorCisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBJbmZvLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dWKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXp1IiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBJbmZvLnNpemUoKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBMT0coSU5GTykgPDwgIkMyIFRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk0NmZhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9WdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9FbmNUZXN0LmNwcApAQCAtMCwwICsxLDY1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMl9oaWRsX2hhbF9hdWRpb19lbmNfdGVzdCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorCit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uaCIKKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK2NsYXNzIExpbmVhckJ1ZmZlciA6IHB1YmxpYyBDMkJ1ZmZlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgTGluZWFyQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiYgYmxvY2spCisgICAgICAgIDogQzJCdWZmZXIoCisgICAgICAgICAgICAgIHtibG9jay0+c2hhcmUoYmxvY2stPm9mZnNldCgpLCBibG9jay0+c2l6ZSgpLCA6OkMyRmVuY2UoKSl9KSB7fQorfTsKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgOjpzdGQ6OnN0cmluZyBnZXRUZXN0Q2FzZUluZm8oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiA6OnN0ZDo6c3RyaW5nKCkgKworICAgICAgICAgICAgICAgICJDb21wb25lbnQ6ICIgKyBnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJJbnN0YW5jZTogIiArIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiUmVzOiAiICsgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKTsKKyAgICB9CisKKyAgICAvLyBnb29nbGUuY29kZWMyIEF1ZGlvIHRlc3Qgc2V0dXAKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKKyAgICAgICAgQUxPR1YoIkNvZGVjMkF1ZGlvRW5jSGlkbFRlc3QgU2V0VXAiKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgICAgIFt0aGlzXShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfTkUobUxpc3RlbmVyLCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xpZW50LT5jcmVhdGVDb21wb25lbnQoZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSwgbUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db21wb25lbnQpOworICAgICAgICBBU1NFUlRfTkUobUNvbXBvbmVudCwgbnVsbHB0cik7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgQ0hFQ0tfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1MaW5lYXJBbGxvY2F0b3IpLAorICAgICAgICAgICAgICAgICBDMl9PSyk7CisgICAgICAgIG1MaW5lYXJQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUxpbmVhckFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sSWQrKyk7CisgICAgICAgIEFTU0VSVF9ORShtTGluZWFyUG9vbCwgbnVsbHB0cik7CisKKyAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOworICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7CisgICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7CisgICAgICAgIH07CisgICAgICAgIGNvbnN0IFN0cmluZ1RvTmFtZSBrU3RyaW5nVG9OYW1lW10gPSB7CisgICAgICAgICAgICB7ImFhYyIsIGFhY30sCisgICAgICAgICAgICB7ImZsYWMiLCBmbGFjfSwKKyAgICAgICAgICAgIHsib3B1cyIsIG9wdXN9LAorICAgICAgICAgICAgeyJhbXJuYiIsIGFtcm5ifSwKKyAgICAgICAgICAgIHsiYW1yd2IiLCBhbXJ3Yn0sCisgICAgICAgIH07CisgICAgICAgIGNvbnN0IHNpemVfdCBrTnVtU3RyaW5nVG9OYW1lID0KKyAgICAgICAgICAgIHNpemVvZihrU3RyaW5nVG9OYW1lKSAvIHNpemVvZihrU3RyaW5nVG9OYW1lWzBdKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBzdWJzdHJpbmc7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbXA7CisgICAgICAgIHN1YnN0cmluZyA9IHN0ZDo6c3RyaW5nKGdFbnYtPmdldENvbXBvbmVudCgpKTsKKyAgICAgICAgLyogVE9ETzogYmV0dGVyIGFwcHJvYWNoIHRvIGZpbmQgdGhlIGNvbXBvbmVudCAqLworICAgICAgICAvKiAiYzIuYW5kcm9pZC4iID0+IDExdGggcG9zaXRpb24gKi8KKyAgICAgICAgc2l6ZV90IHBvcyA9IDExOworICAgICAgICBzaXplX3QgbGVuID0gc3Vic3RyaW5nLmZpbmQoIi5lbmNvZGVyIiwgcG9zKTsKKyAgICAgICAgY29tcCA9IHN1YnN0cmluZy5zdWJzdHIocG9zLCBsZW4gLSBwb3MpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVN0cmluZ1RvTmFtZTsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoY29tcC5jX3N0cigpLCBrU3RyaW5nVG9OYW1lW2ldLk5hbWUpKSB7CisgICAgICAgICAgICAgICAgbUNvbXBOYW1lID0ga1N0cmluZ1RvTmFtZVtpXS5Db21wTmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRW9zID0gZmFsc2U7CisgICAgICAgIG1Dc2QgPSBmYWxzZTsKKyAgICAgICAgbUZyYW1lc1JlY2VpdmVkID0gMDsKKyAgICAgICAgaWYgKG1Db21wTmFtZSA9PSB1bmtub3duX2NvbXApIG1EaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIGlmIChtRGlzYWJsZVRlc3QpIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgRGlzYWJsZWQgXG4iOworICAgICAgICBnZXRJbnB1dE1heEJ1ZlNpemUoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgICAgICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29tcG9uZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBTdXBlcjo6VGVhckRvd24oKTsKKyAgICB9CisgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCisgICAgdm9pZCBoYW5kbGVXb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtJdGVtcykgeworICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29ya0RvbmUobUNvbXBvbmVudCwgd29yaywgbUZsdXNoZWRJbmRpY2VzLCBtUXVldWVMb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUVvcywgbUNzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUmVjZWl2ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVudW0gc3RhbmRhcmRDb21wIHsKKyAgICAgICAgYWFjLAorICAgICAgICBmbGFjLAorICAgICAgICBvcHVzLAorICAgICAgICBhbXJuYiwKKyAgICAgICAgYW1yd2IsCisgICAgICAgIHVua25vd25fY29tcCwKKyAgICB9OworCisgICAgYm9vbCBtRW9zOworICAgIGJvb2wgbUNzZDsKKyAgICBib29sIG1EaXNhYmxlVGVzdDsKKyAgICBzdGFuZGFyZENvbXAgbUNvbXBOYW1lOworICAgIHVpbnQzMl90IG1GcmFtZXNSZWNlaXZlZDsKKyAgICBpbnQzMl90IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtRmx1c2hlZEluZGljZXM7CisKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBtQmxvY2tQb29sSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtTGluZWFyUG9vbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1MaW5lYXJBbGxvY2F0b3I7CisKKyAgICBzdGQ6Om11dGV4IG1RdWV1ZUxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVF1ZXVlQ29uZGl0aW9uOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVdvcmtRdWV1ZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wb25lbnQ7CisKKyAgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICAgIH0KKworICAgIC8vIEluIGVuY29kZXIgY29tcG9uZW50cywgZmV0Y2ggdGhlIHNpemUgb2YgaW5wdXQgYnVmZmVyIGFsbG9jYXRlZAorICAgIHZvaWQgZ2V0SW5wdXRNYXhCdWZTaXplKCkgeworICAgICAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMV0gPSB7MH07CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gaW5QYXJhbXM7CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IG1Db21wb25lbnQtPnF1ZXJ5KAorICAgICAgICAgICAge30sIHtDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dDo6UEFSQU1fVFlQRX0sIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAmaW5QYXJhbXMpOworICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LICYmIGluUGFyYW1zLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiUXVlcnkgTWF4QnVmZmVyU2l6ZUluZm8gZmFpbGVkID0+ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSBzaXplb2YoQzJQYXJhbSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluUGFyYW1zLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgQzJQYXJhbSogcGFyYW0gPSBpblBhcmFtc1tpXS5nZXQoKTsKKyAgICAgICAgICAgICAgICBiaXRTdHJlYW1JbmZvW2ldID0gKihpbnQzMl90KikoKHVpbnQ4X3QqKXBhcmFtICsgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtSW5wdXRNYXhCdWZTaXplID0gYml0U3RyZWFtSW5mb1swXTsKKyAgICB9CisKK307CisKK3ZvaWQgdmFsaWRhdGVDb21wb25lbnQoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wTmFtZSwgYm9vbCYgZGlzYWJsZVRlc3QpIHsKKyAgICAvLyBWYWxpZGF0ZSBpdHMgYSBDMiBDb21wb25lbnQKKyAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiYzIiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiTm90IGEgYzIgY29tcG9uZW50Iik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFZhbGlkYXRlIGl0cyBub3QgYW4gZW5jb2RlciBhbmQgdGhlIGNvbXBvbmVudCB0byBiZSB0ZXN0ZWQgaXMgYXVkaW8KKyAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiZGVjb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBFbmNvZGVyLCBnaXZlbiBEZWNvZGVyIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgYzJfc3RhdHVzX3QgYzJlcnIgPQorICAgICAgICBjb21wb25lbnQtPnF1ZXJ5KHt9LCB7QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICBpZiAoYzJlcnIgIT0gQzJfT0sgJiYgcXVlcmllZC5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRSgiUXVlcnkgbWVkaWEgdHlwZSBmYWlsZWQgPT4gJWQiLCBjMmVycik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgaW5wdXREb21haW4gPQorICAgICAgICAgICAgKChDMlN0cmVhbU1lZGlhVHlwZVNldHRpbmc6OmlucHV0KilxdWVyaWVkWzBdLmdldCgpKS0+bS52YWx1ZTsKKyAgICAgICAgaWYgKGlucHV0RG9tYWluLmZpbmQoImF1ZGlvLyIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgQXVkaW8gQ29tcG9uZW50Iik7CisgICAgICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZXMgY29tcG9uZW50IG5hbWUKKyAgICBpZiAoY29tcE5hbWUgPT0gQ29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6dW5rbm93bl9jb21wKSB7CisgICAgICAgIEFMT0dFKCJDb21wb25lbnQgSW5WYWxpZCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoIkNvbXBvbmVudCBWYWxpZCIpOworfQorCisvLyBTZXQgRGVmYXVsdCBjb25maWcgcGFyYW0uCitib29sIHNldHVwQ29uZmlnUGFyYW0oCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIGludDMyX3QgbkNoYW5uZWxzLCBpbnQzMl90IG5TYW1wbGVSYXRlKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBuU2FtcGxlUmF0ZSk7CisgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBuQ2hhbm5lbHMpOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGNvbmZpZ1BhcmFteyZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm99OworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgIGNvbXBvbmVudC0+Y29uZmlnKGNvbmZpZ1BhcmFtLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIGlmIChzdGF0dXMgPT0gQzJfT0sgJiYgZmFpbHVyZXMuc2l6ZSgpID09IDB1KSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIExvb2tVcFRhYmxlIG9mIGNsaXBzIGFuZCBtZXRhZGF0YSBmb3IgY29tcG9uZW50IHRlc3RpbmcKK3ZvaWQgR2V0VVJMRm9yQ29tcG9uZW50KENvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wLCBjaGFyKiBtVVJMKSB7CisgICAgc3RydWN0IENvbXBUb1VSTCB7CisgICAgICAgIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wOworICAgICAgICBjb25zdCBjaGFyKiBtVVJMOworICAgIH07CisgICAgc3RhdGljIGNvbnN0IENvbXBUb1VSTCBrQ29tcFRvVVJMW10gPSB7CisgICAgICAgIHtDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFhYywKKyAgICAgICAgICJiYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXcifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YW1ybmIsCisgICAgICAgICAiYmJiX3Jhd18xY2hfOGtoel9zMTZsZS5yYXcifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YW1yd2IsCisgICAgICAgICAiYmJiX3Jhd18xY2hfMTZraHpfczE2bGUucmF3In0sCisgICAgICAgIHtDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmZsYWMsCisgICAgICAgICAiYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3In0sCisgICAgICAgIHtDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Om9wdXMsCisgICAgICAgICAiYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3In0sCisgICAgfTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGtDb21wVG9VUkwpIC8gc2l6ZW9mKGtDb21wVG9VUkxbMF0pOyArK2kpIHsKKyAgICAgICAgaWYgKGtDb21wVG9VUkxbaV0uY29tcCA9PSBjb21wKSB7CisgICAgICAgICAgICBzdHJjYXQobVVSTCwga0NvbXBUb1VSTFtpXS5tVVJMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBlbmNvZGVORnJhbWVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Om11dGV4ICZxdWV1ZUxvY2ssIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlJiBxdWV1ZUNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiYgZmx1c2hlZEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgbGluZWFyUG9vbCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtJiBlbGVTdHJlYW0sIHVpbnQzMl90IG5GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsIGludDMyX3QgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgIGludDMyX3QgblNhbXBsZVJhdGUsIGJvb2wgZmx1c2hlZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgIGJvb2wgc2lnbmFsRU9TID0gdHJ1ZSkgeworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKworICAgIHVpbnQzMl90IGZyYW1lSUQgPSAwOworICAgIHVpbnQzMl90IG1heFJldHJ5ID0gMDsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IHNhbXBsZXNQZXJGcmFtZSAqIG5DaGFubmVscyAqIDI7CisgICAgaW50MzJfdCB0aW1lc3RhbXBJbmNyID0KKyAgICAgICAgKGludCkoKChmbG9hdClzYW1wbGVzUGVyRnJhbWUgLyBuU2FtcGxlUmF0ZSkgKiAxMDAwMDAwKTsKKyAgICB1aW50NjRfdCB0aW1lc3RhbXAgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChuRnJhbWVzID09IDApIGJyZWFrOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgICAgIHdoaWxlICghd29yayAmJiAobWF4UmV0cnkgPCBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBpZiAoIXdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29yay5zd2FwKHdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICB3b3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghd29yayAmJiAobWF4UmV0cnkgPj0gTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJXYWl0IGZvciBnZW5lcmF0aW5nIEMyV29yayBleGNlZWRlZCB0aW1lb3V0IjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2lnbmFsRU9TICYmIChuRnJhbWVzID09IDEpKQorICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgaWYgKGZsdXNoZWQpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IFNZTkNfRlJBTUU7CisgICAgICAgICAgICBmbHVzaGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBmcmFtZUlEOworICAgICAgICB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBmbHVzaGVkSW5kaWNlcy5lbXBsYWNlX2JhY2soZnJhbWVJRCk7CisgICAgICAgIH0KKyAgICAgICAgY2hhciogZGF0YSA9IChjaGFyKiltYWxsb2MoYnl0ZXNDb3VudCk7CisgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKTsKKyAgICAgICAgZWxlU3RyZWFtLnJlYWQoZGF0YSwgYnl0ZXNDb3VudCk7CisgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uZ2NvdW50KCksIGJ5dGVzQ291bnQpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgIEFTU0VSVF9FUShDMl9PSywgbGluZWFyUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNDb3VudCwge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsb2NrKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGJsb2NrKTsKKyAgICAgICAgLy8gV3JpdGUgVmlldworICAgICAgICBDMldyaXRlVmlldyB2aWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkMyTGluZWFyQmxvY2s6Om1hcCgpIGZhaWxlZCA6ICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEFTU0VSVF9FUSgoc2l6ZV90KWJ5dGVzQ291bnQsIHZpZXcuY2FwYWNpdHkoKSk7CisgICAgICAgIEFTU0VSVF9FUSgwdSwgdmlldy5vZmZzZXQoKSk7CisgICAgICAgIEFTU0VSVF9FUSgoc2l6ZV90KWJ5dGVzQ291bnQsIHZpZXcuc2l6ZSgpKTsKKworICAgICAgICBtZW1jcHkodmlldy5iYXNlKCksIGRhdGEsIGJ5dGVzQ291bnQpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG5ldyBMaW5lYXJCdWZmZXIoYmxvY2spKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBmcmVlKGRhdGEpOworCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIC8vIERPIFRIRSBERUNPRElORworICAgICAgICBBU1NFUlRfRVEoY29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisgICAgICAgIEFMT0dWKCJGcmFtZSAjJWQgc2l6ZSA9ICVkIHF1ZXVlZCIsIGZyYW1lSUQsIGJ5dGVzQ291bnQpOworICAgICAgICBuRnJhbWVzLS07CisgICAgICAgIHRpbWVzdGFtcCArPSB0aW1lc3RhbXBJbmNyOworICAgICAgICBmcmFtZUlEKys7CisgICAgICAgIG1heFJldHJ5ID0gMDsKKyAgICB9Cit9CisKK1RFU1RfRihDb2RlYzJBdWRpb0VuY0hpZGxUZXN0LCB2YWxpZGF0ZUNvbXBOYW1lKSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFMT0dWKCJDaGVja3MgaWYgdGhlIGdpdmVuIGNvbXBvbmVudCBpcyBhIHZhbGlkIGF1ZGlvIGNvbXBvbmVudCIpOworICAgIHZhbGlkYXRlQ29tcG9uZW50KG1Db21wb25lbnQsIG1Db21wTmFtZSwgbURpc2FibGVUZXN0KTsKKyAgICBBU1NFUlRfRVEobURpc2FibGVUZXN0LCBmYWxzZSk7Cit9CisKK2NsYXNzIENvZGVjMkF1ZGlvRW5jRW5jb2RlVGVzdAorICAgIDogcHVibGljIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjpwYWlyPGJvb2wsIGludDMyX3Q+PiB7Cit9OworCitURVNUX1AoQ29kZWMyQXVkaW9FbmNFbmNvZGVUZXN0LCBFbmNvZGVUZXN0KSB7CisgICAgQUxPR1YoIkVuY29kZVRlc3QiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgY2hhciBtVVJMWzUxMl07CisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwpOworICAgIGJvb2wgc2lnbmFsRU9TID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICAvLyBSYXRpbyB3LnIudCB0byBtSW5wdXRNYXhCdWZTaXplCisgICAgaW50MzJfdCBpbnB1dE1heEJ1ZlJhdGlvID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisKKyAgICAvLyBTZXR0aW5nIGRlZmF1bHQgc2FtcGxlUmF0ZQorICAgIGludDMyX3QgbkNoYW5uZWxzID0gMjsKKyAgICBpbnQzMl90IG5TYW1wbGVSYXRlID0gNDQxMDA7CisgICAgc3dpdGNoIChtQ29tcE5hbWUpIHsKKyAgICAgICAgY2FzZSBhYWM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGZsYWM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIG9wdXM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFtcm5iOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gODAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFtcndiOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gMTYwMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPQorICAgICAgICAoKG1JbnB1dE1heEJ1ZlNpemUgLyBpbnB1dE1heEJ1ZlJhdGlvKSAvIChuQ2hhbm5lbHMgKiAyKSk7CisgICAgQUxPR1YoInNpZ25hbEVPUyAlZCBtSW5wdXRNYXhCdWZTaXplICVkIHNhbXBsZXNQZXJGcmFtZSAlZCIsIHNpZ25hbEVPUywKKyAgICAgICAgICBtSW5wdXRNYXhCdWZTaXplLCBzYW1wbGVzUGVyRnJhbWUpOworCisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIG5DaGFubmVscywgblNhbXBsZVJhdGUpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICB1aW50MzJfdCBudW1GcmFtZXMgPSAxNjsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwgbkNoYW5uZWxzLCBuU2FtcGxlUmF0ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsRU9TKSk7CisKKyAgICAvLyBJZiBFT1MgaXMgbm90IHNlbnQsIHNlbmRpbmcgZW1wdHkgaW5wdXQgd2l0aCBFT1MgZmxhZworICAgIGlmICghc2lnbmFsRU9TKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIDEpKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB0ZXN0SW5wdXRCdWZmZXIobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNLCBmYWxzZSkpOworICAgICAgICBudW1GcmFtZXMgKz0gMTsKKyAgICB9CisKKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBudW1GcmFtZXMpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HRSgiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICV1IiwgbUZyYW1lc1JlY2VpdmVkLCBudW1GcmFtZXMpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorICAgIGlmICgobUNvbXBOYW1lID09IGZsYWMgfHwgbUNvbXBOYW1lID09IG9wdXMgfHwgbUNvbXBOYW1lID09IGFhYykpIHsKKyAgICAgICAgaWYgKCFtQ3NkKSB7CisgICAgICAgICAgICBBTE9HRSgiQ1NEIGJ1ZmZlciBtaXNzaW5nIik7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworLy8gRW5jb2RlVGVzdCB3aXRoIEVPUyAvIE5vIEVPUyBhbmQgaW5wdXRNYXhCdWZSYXRpbworLy8gaW5wdXRNYXhCdWZSYXRpbyBpcyByYXRpbyB3LnIudC4gdG8gbUlucHV0TWF4QnVmU2l6ZQorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoRW5jb2RlVGVzdCwgQ29kZWMyQXVkaW9FbmNFbmNvZGVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoc3RkOjptYWtlX3BhaXIoZmFsc2UsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoZmFsc2UsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIodHJ1ZSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcih0cnVlLCAyKSkpOworCisKK1RFU1RfRihDb2RlYzJBdWRpb0VuY0hpZGxUZXN0LCBFT1NUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgZW1wdHkgaW5wdXQgYnVmZmVyIHdpdGggRU9TIGZsYWciKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgbVdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJtV29ya1F1ZXVlIEVtcHR5IGlzIG5vdCBleHBlY3RlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHRlc3QiKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IDA7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gMDsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisgICAgdWludDMyX3QgcXVldWVTaXplOworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgcXVldWVTaXplID0gbVdvcmtRdWV1ZS5zaXplKCk7CisgICAgICAgIGlmIChxdWV1ZVNpemUgPCBNQVhfSU5QVVRfQlVGRkVSUykgeworICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9FbmNIaWRsVGVzdCwgRmx1c2hUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgUmVxdWVzdCBmb3IgZmx1c2giKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgY2hhciBtVVJMWzUxMl07CisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwpOworCisgICAgLy8gU2V0dGluZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICBpbnQzMl90IG5DaGFubmVscyA9IDI7CisgICAgaW50MzJfdCBuU2FtcGxlUmF0ZSA9IDQ0MTAwOworICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gMTAyNDsKKyAgICBzd2l0Y2ggKG1Db21wTmFtZSkgeworICAgICAgICBjYXNlIGFhYzoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDI7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTAyNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGZsYWM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDExNTI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBvcHVzOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gNDgwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSA5NjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbXJuYjoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDE7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDgwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxNjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbXJ3YjoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDE7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDE2MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTYwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIG5DaGFubmVscywgblNhbXBsZVJhdGUpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIHVpbnQzMl90IG51bUZyYW1lc0ZsdXNoZWQgPSAzMDsKKyAgICB1aW50MzJfdCBudW1GcmFtZXMgPSAxMjg7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sIG51bUZyYW1lc0ZsdXNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLCBuQ2hhbm5lbHMsIG5TYW1wbGVSYXRlKSk7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgdWludDY0X3QgZnJhbWVJbmRleDsKKyAgICB7CisgICAgICAgIC8vVXBkYXRlIG1GbHVzaGVkSW5kaWNlcyBiYXNlZCBvbiB0aGUgaW5kZXggcmVjZWl2ZWQgZnJvbSBmbHVzaCgpCisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgICAgICAgICAgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgZnJhbWVJbmRleEl0ID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZpbmQobUZsdXNoZWRJbmRpY2VzLmJlZ2luKCksIG1GbHVzaGVkSW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVJbmRleCk7CisgICAgICAgICAgICBpZiAoIW1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgKGZyYW1lSW5kZXhJdCAhPSBtRmx1c2hlZEluZGljZXMuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcyAtIG51bUZyYW1lc0ZsdXNoZWQsIHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsIG5TYW1wbGVSYXRlLCB0cnVlKSk7CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgZXJyID0KKyAgICAgICAgbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRmx1c2hlZEluZGljZXMuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGdFbnYgPSBuZXcgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgZ0Vudi0+aW5pdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJDMiBUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL21lZGlhX2MyX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9tZWRpYV9jMl9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3NzNjZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9tZWRpYV9jMl9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfQzJfQVVESU9fSElETF9URVNUX0NPTU1PTl9ICisjZGVmaW5lIE1FRElBX0MyX0FVRElPX0hJRExfVEVTVF9DT01NT05fSAorCisKKyNlbmRpZiAgLy8gTUVESUFfQzJfQVVESU9fSElETF9URVNUX0NPTU1PTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRmNDZlZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vQW5kcm9pZC5icApAQCAtMCwwICsxLDMzIEBACitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogIlZ0c01lZGlhQzJWMV8wQ29tbW9uVXRpbCIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzItaGlkbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvaW5jbHVkZSIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uY3BwIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiVnRzTWVkaWFDMlYxXzBEZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzItaGlkbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJWdHNNZWRpYUMyVjFfMENvbW1vblV0aWwiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY29kZWMyX2NsaWVudCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vUkVBRE1FLm1kIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE1NjlhOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjIgQEAKKyMjIENvZGVjMiBIYWwgQCAxLjAgdGVzdHMgIyMKKy0tLQorIyMjIyBtYXN0ZXIgOgorRnVuY3Rpb25hbGl0eSBvZiBtYXN0ZXIgaXMgdG8gZW51bWVyYXRlIGFsbCB0aGUgQ29kZWMyIGNvbXBvbmVudHMgYXZhaWxhYmxlIGluIEMyIG1lZGlhIHNlcnZpY2UuCisKK3VzYWdlOiBNdHNIaWRsQzJWMVxfMFRhcmdldE1hc3RlclRlc3QgLUkgc29mdHdhcmUKKworIyMjIyBjb21wb25lbnQgOgorRnVuY3Rpb25hbGl0eSBvZiBjb21wb25lbnQgaXMgdG8gdGVzdCBjb21tb24gZnVuY3Rpb25hbGl0eSBhY3Jvc3MgYWxsIHRoZSBDb2RlYzIgY29tcG9uZW50cyBhdmFpbGFibGUgaW4gQzIgbWVkaWEgc2VydmljZS4gRm9yIGEgc3RhbmRhcmQgQzIgY29tcG9uZW50LCB0aGVzZSB0ZXN0cyBhcmUgZXhwZWN0ZWQgdG8gcGFzcy4KKwordXNhZ2U6IE10c0hpZGxDMlYxXF8wVGFyZ2V0Q29tcG9uZW50VGVzdCAtSSBzb2Z0d2FyZSAtQyA8Y29tcCBuYW1lPgorCisjIyMjIGF1ZGlvIDoKK0Z1bmN0aW9uYWxpdHkgb2YgYXVkaW8gdGVzdCBpcyB0byB2YWxpZGF0ZSBhdWRpbyBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5IENvZGVjMiBjb21wb25lbnRzLiBUaGUgcmVzb3VyY2UgZmlsZXMgZm9yIHRoaXMgdGVzdCBhcmUgdGFrZW4gZnJvbSBoYXJkd2FyZS9pbnRlcmZhY2VzL21lZGlhL3Jlcy4gVGhlIHBhdGggdG8gdGhlc2UgZmlsZXMgb24gdGhlIGRldmljZSBpcyByZXF1aXJlZCB0byBiZSBnaXZlbiBmb3IgYml0c3RyZWFtIHRlc3RzLgorCit1c2FnZTogTXRzSGlkbEMyVjFcXzBUYXJnZXRBdWRpb0RlY1Rlc3QgLUkgc29mdHdhcmUgLUMgPGNvbXAgbmFtZT4gLVAgL3NkY2FyZC9tZWRpYQorCisjIyMjIHZpZGVvIDoKK0Z1bmN0aW9uYWxpdHkgb2YgdmlkZW8gdGVzdCBpcyB0byB2YWxpZGF0ZSB2aWRlbyBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5IENvZGVjMiBjb21wb25lbnRzLiBUaGUgcmVzb3VyY2UgZmlsZXMgZm9yIHRoaXMgdGVzdCBhcmUgdGFrZW4gZnJvbSBoYXJkd2FyZS9pbnRlcmZhY2VzL21lZGlhL3Jlcy4gVGhlIHBhdGggdG8gdGhlc2UgZmlsZXMgb24gdGhlIGRldmljZSBpcyByZXF1aXJlZCB0byBiZSBnaXZlbiBmb3IgYml0c3RyZWFtIHRlc3RzLgorCit1c2FnZTogTXRzSGlkbEMyVjFcXzBUYXJnZXRWaWRlb0RlY1Rlc3QgLUkgc29mdHdhcmUgLUMgPGNvbXAgbmFtZT4gLVAgL3NkY2FyZC9tZWRpYQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjM2MjcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmNwcApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24iCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCIKKworLy8gVGVzdCB0aGUgY29kZWNzIGZvciBOdWxsQnVmZmVyLCBFbXB0eSBJbnB1dCBCdWZmZXIgd2l0aChvdXQpIGZsYWdzIHNldAordm9pZCB0ZXN0SW5wdXRCdWZmZXIoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIHN0ZDo6bXV0ZXgmIHF1ZXVlTG9jaywgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgIHVpbnQzMl90IGZsYWdzLCBib29sIGlzTnVsbEJ1ZmZlcikgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgeworICAgICAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgaWYgKCF3b3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgd29yay5zd2FwKHdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgIHdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAid29ya1F1ZXVlIEVtcHR5IGF0IHRoZSBzdGFydCBvZiB0ZXN0IjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IDA7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gMDsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgaWYgKGlzTnVsbEJ1ZmZlcikgeworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmVtcGxhY2VfYmFjayhudWxscHRyKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIEFTU0VSVF9FUShjb21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKK30KKworLy8gV2FpdCBmb3IgYWxsIHRoZSBpbnB1dHMgdG8gYmUgY29uc3VtZWQgYnkgdGhlIHBsdWdpbi4KK3ZvaWQgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihzdGQ6Om11dGV4JiBxdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyQ291bnQpIHsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgdWludDMyX3QgcXVldWVTaXplOworICAgIHVpbnQzMl90IG1heFJldHJ5ID0gMDsKKyAgICB7CisgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgcXVldWVTaXplID0gd29ya1F1ZXVlLnNpemUoKTsKKyAgICB9CisgICAgd2hpbGUgKChtYXhSZXRyeSA8IE1BWF9SRVRSWSkgJiYgKHF1ZXVlU2l6ZSA8IGJ1ZmZlckNvdW50KSkgeworICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgIGlmIChxdWV1ZVNpemUgIT0gd29ya1F1ZXVlLnNpemUoKSkgeworICAgICAgICAgICAgcXVldWVTaXplID0gd29ya1F1ZXVlLnNpemUoKTsKKyAgICAgICAgICAgIG1heFJldHJ5ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgICAgIG1heFJldHJ5Kys7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHByb2Nlc3Mgb25Xb3JrRG9uZSByZWNlaXZlZCBieSBMaXN0ZW5lcgordm9pZCB3b3JrRG9uZSgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssIHN0ZDo6bGlzdDx1aW50NjRfdD4mIGZsdXNoZWRJbmRpY2VzLAorICAgIHN0ZDo6bXV0ZXgmIHF1ZXVlTG9jaywgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwgYm9vbCYgZW9zLCBib29sJiBjc2QsCisgICAgdWludDMyX3QmIGZyYW1lc1JlY2VpdmVkKSB7CisgICAgLy8gaGFuZGxlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBpbiB3b3JrIGRvbmUKKyAgICBpZiAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5zaXplKCkgIT0gMCkgeworICAgICAgICBBTE9HVigiQ29uZmlnIFVwZGF0ZSIpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHVwZGF0ZXMgPQorICAgICAgICAgICAgc3RkOjptb3ZlKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gY29uZmlnUGFyYW07CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB1cGRhdGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBDMlBhcmFtKiBwYXJhbSA9IHVwZGF0ZXNbaV0uZ2V0KCk7CisgICAgICAgICAgICBpZiAocGFyYW0tPmluZGV4KCkgPT0gQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSkgeworICAgICAgICAgICAgICAgIGNzZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChwYXJhbS0+aW5kZXgoKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAocGFyYW0tPmluZGV4KCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAocGFyYW0tPmluZGV4KCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnUGFyYW0ucHVzaF9iYWNrKHBhcmFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb21wb25lbnQtPmNvbmZpZyhjb25maWdQYXJhbSwgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgQVNTRVJUX0VRKGZhaWx1cmVzLnNpemUoKSwgMHUpOworICAgIH0KKyAgICBpZiAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICE9IEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpIHsKKyAgICAgICAgZnJhbWVzUmVjZWl2ZWQrKzsKKyAgICAgICAgZW9zID0gKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworICAgICAgICBhdXRvIGZyYW1lSW5kZXhJdCA9IHN0ZDo6ZmluZChmbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBmbHVzaGVkSW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgICAgICBBTE9HVigiV29ya0RvbmU6IGZyYW1lSUQgcmVjZWl2ZWQgJWQiLAorICAgICAgICAgICAgICAoaW50KXdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgeworICAgICAgICAgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgd29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgaWYgKCFmbHVzaGVkSW5kaWNlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgZmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHF1ZXVlQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYTI5MDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaApAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfQzJfSElETF9URVNUX0NPTU1PTl9ICisjZGVmaW5lIE1FRElBX0MyX0hJRExfVEVTVF9DT01NT05fSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL011dGV4ZWQuaD4KKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOworCit1c2luZyA6OmFuZHJvaWQ6Ok11dGV4ZWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0RW52QmFzZS5oPgorCisjZGVmaW5lIE1BWF9SRVRSWSAyMAorI2RlZmluZSBUSU1FX09VVCA0MDBtcworI2RlZmluZSBNQVhfSU5QVVRfQlVGRkVSUyA4CisKKy8qCisgKiBIYW5kbGUgQ2FsbGJhY2sgZnVuY3Rpb25zIG9uV29ya0RvbmUoKSwgb25UcmlwcGVkKCksCisgKiBvbkVycm9yKCksIG9uRGVhdGgoKSwgb25GcmFtZXNSZW5kZXJlZCgpCisgKi8KK3N0cnVjdCBDb2RlY0xpc3RlbmVyIDogcHVibGljIGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXIgeworICAgcHVibGljOgorICAgIENvZGVjTGlzdGVuZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpPiBmbiA9CisgICAgICAgICAgICBudWxscHRyKQorICAgICAgICA6IGNhbGxCYWNrKGZuKSB7fQorICAgIHZpcnR1YWwgdm9pZCBvbldvcmtEb25lKAorICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcCwKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgQUxPR0QoIm9uV29ya0RvbmUgY2FsbGVkIik7CisgICAgICAgICh2b2lkKWNvbXA7CisgICAgICAgIGlmIChjYWxsQmFjaykgY2FsbEJhY2sod29ya0l0ZW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25UcmlwcGVkKAorICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+JiBzZXR0aW5nUmVzdWx0cykKKyAgICAgICAgb3ZlcnJpZGUgeworICAgICAgICAvKiBUT0RPICovCisgICAgICAgICh2b2lkKWNvbXA7CisgICAgICAgICh2b2lkKXNldHRpbmdSZXN1bHRzOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yKAorICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcCwKKyAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpY29tcDsKKyAgICAgICAgQUxPR0QoIm9uRXJyb3IgY2FsbGVkIik7CisgICAgICAgIGlmIChlcnJvckNvZGUgIT0gMCkgQUxPR0UoIkVycm9yIDogJXUiLCBlcnJvckNvZGUpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkRlYXRoKAorICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcCkgb3ZlcnJpZGUgeworICAgICAgICAvKiBUT0RPICovCisgICAgICAgICh2b2lkKWNvbXA7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKAorICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYXJyYXlJbmRleCkgb3ZlcnJpZGUgeworICAgICAgICAvKiBUT0RPICovCisgICAgICAgICh2b2lkKWZyYW1lSW5kZXg7CisgICAgICAgICh2b2lkKWFycmF5SW5kZXg7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVSZW5kZXJlZCgKKyAgICAgICAgdWludDY0X3QgYnVmZmVyUXVldWVJZCwKKyAgICAgICAgaW50MzJfdCBzbG90SWQsCisgICAgICAgIGludDY0X3QgdGltZXN0YW1wTnMpIG92ZXJyaWRlIHsKKyAgICAgICAgLyogVE9ETyAqLworICAgICAgICAodm9pZClidWZmZXJRdWV1ZUlkOworICAgICAgICAodm9pZClzbG90SWQ7CisgICAgICAgICh2b2lkKXRpbWVzdGFtcE5zOworICAgIH0KKyAgICAvLyBzdGQ6Om11dGV4IG1RdWV1ZUxvY2s7CisgICAgLy8gc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVF1ZXVlQ29uZGl0aW9uOworICAgIC8vIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVdvcmtRdWV1ZTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKT4gY2FsbEJhY2s7Cit9OworCisvLyBBIGNsYXNzIGZvciB0ZXN0IGVudmlyb25tZW50IHNldHVwCitjbGFzcyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEVudkJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RFbnZCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVGVzdFNlcnZpY2VzKCkgb3ZlcnJpZGUgeworICAgICAgICByZWdpc3RlclRlc3RTZXJ2aWNlPElDb21wb25lbnRTdG9yZT4oKTsKKyAgICB9CisKKyAgICBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL3NkY2FyZC9tZWRpYS8iKSB7fQorCisgICAgdm9pZCBzZXRDb21wb25lbnQoY29uc3QgY2hhciogX2NvbXBvbmVudCkgeyBjb21wb25lbnQgPSBfY29tcG9uZW50OyB9CisKKyAgICB2b2lkIHNldEluc3RhbmNlKGNvbnN0IGNoYXIqIF9pbnN0YW5jZSkgeyBpbnN0YW5jZSA9IF9pbnN0YW5jZTsgfQorCisgICAgdm9pZCBzZXRSZXMoY29uc3QgY2hhciogX3JlcykgeyByZXMgPSBfcmVzOyB9CisKKyAgICBjb25zdCBoaWRsX3N0cmluZyBnZXRJbnN0YW5jZSgpIGNvbnN0IHsgcmV0dXJuIGluc3RhbmNlOyB9CisKKyAgICBjb25zdCBoaWRsX3N0cmluZyBnZXRDb21wb25lbnQoKSBjb25zdCB7IHJldHVybiBjb21wb25lbnQ7IH0KKworICAgIGNvbnN0IGhpZGxfc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQorCisgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICAgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0geworICAgICAgICAgICAgeyJpbnN0YW5jZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSSd9LAorICAgICAgICAgICAgeyJjb21wb25lbnQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0MnfSwKKyAgICAgICAgICAgIHsicmVzIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdQJ30sCisgICAgICAgICAgICB7MCwgMCwgMCwgMH19OworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICAgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiSTpDOlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgICAgIGlmIChjID09IC0xKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgICAgIGNhc2UgJ0knOgorICAgICAgICAgICAgICAgICAgICBzZXRJbnN0YW5jZShvcHRhcmcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgICAgICAgICAgc2V0Q29tcG9uZW50KG9wdGFyZyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ1AnOgorICAgICAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnPyc6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wdGluZCA8IGFyZ2MpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgorICAgICAgICAgICAgICAgICAgICAidXNhZ2U6ICVzIDxndGVzdCBvcHRpb25zPiA8dGVzdCBvcHRpb25zPlxuXG4iCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCisgICAgICAgICAgICAgICAgICAgICItSSwgLS1pbnN0YW5jZTogc29mdHdhcmUgZm9yIEMyIGNvbXBvbmVudHMsIGVsc2UgZGVmYXVsdFxuIgorICAgICAgICAgICAgICAgICAgICAiLUMsIC0tY29tcG9uZW50OiBDMiBjb21wb25lbnQgdG8gdGVzdFxuIgorICAgICAgICAgICAgICAgICAgICAiLVAsIC0tcmVzOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgICAgIGFyZ3Zbb3B0aW5kID86IDFdLCBhcmd2WzBdKTsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBoaWRsX3N0cmluZyBpbnN0YW5jZTsKKyAgICBoaWRsX3N0cmluZyBjb21wb25lbnQ7CisgICAgaGlkbF9zdHJpbmcgcmVzOworfTsKKworLyoKKyAqIGNvbW1vbiBmdW5jdGlvbnMgZGVjbGFyYXRpb25zCisgKi8KK3ZvaWQgdGVzdElucHV0QnVmZmVyKAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBzdGQ6Om11dGV4JiBxdWV1ZUxvY2ssIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICB1aW50MzJfdCBmbGFncywgYm9vbCBpc051bGxCdWZmZXIpOworCit2b2lkIHdhaXRPbklucHV0Q29uc3VtcHRpb24oc3RkOjptdXRleCYgcXVldWVMb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlJiBxdWV1ZUNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckNvdW50ID0gTUFYX0lOUFVUX0JVRkZFUlMpOworCit2b2lkIHdvcmtEb25lKAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywgc3RkOjpsaXN0PHVpbnQ2NF90PiYgZmx1c2hlZEluZGljZXMsCisgICAgc3RkOjptdXRleCYgcXVldWVMb2NrLCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLCBib29sJiBlb3MsIGJvb2wmIGNzZCwKKyAgICB1aW50MzJfdCYgZnJhbWVzUmVjZWl2ZWQpOworCisjZW5kaWYgIC8vIE1FRElBX0MyX0hJRExfVEVTVF9DT01NT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOTEzYjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tcG9uZW50L0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIaWRsQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzTWVkaWFDMlYxXzBEZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiVnRzSGlkbEMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwIl0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvVnRzSGlkbEMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9WdHNIaWRsQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4MDNkNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvVnRzSGlkbEMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfY29tcG9uZW50X3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorCisjaW5jbHVkZSA8VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlLmg+CisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCitzdGF0aWMgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KiBnRW52ID0gbnVsbHB0cjsKKworbmFtZXNwYWNlIHsKKworLy8gZ29vZ2xlLmNvZGVjMiBDb21wb25lbnQgdGVzdCBzZXR1cAorY2xhc3MgQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTdXBlcjo6U2V0VXAoKTsKKyAgICAgICAgbUVvcyA9IGZhbHNlOworICAgICAgICBtQ2xpZW50ID0gYW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgICAgIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSk7CisgICAgICAgIEFTU0VSVF9ORShtQ2xpZW50LCBudWxscHRyKTsKKyAgICAgICAgbUxpc3RlbmVyLnJlc2V0KG5ldyBDb2RlY0xpc3RlbmVyKAorICAgICAgICAgICAgW3RoaXNdKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICAgICAgICAgIGhhbmRsZVdvcmtEb25lKHdvcmtJdGVtcyk7CisgICAgICAgICAgICB9KSk7CisgICAgICAgIEFTU0VSVF9ORShtTGlzdGVuZXIsIG51bGxwdHIpOworICAgICAgICBtQ2xpZW50LT5jcmVhdGVDb21wb25lbnQoZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSwgbUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db21wb25lbnQpOworICAgICAgICBBU1NFUlRfTkUobUNvbXBvbmVudCwgbnVsbHB0cik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lOUFVUX0JVRkZFUlM7ICsraSkgeworICAgICAgICAgICAgbVdvcmtRdWV1ZS5lbXBsYWNlX2JhY2sobmV3IEMyV29yayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIElmIHlvdSBoYXZlIGVuY291bnRlcmVkIGEgZmF0YWwgZmFpbHVyZSwgaXQgaXMgcG9zc2libGUgdGhhdAorICAgICAgICAgICAgLy8gZnJlZU5vZGUoKSB3aWxsIG5vdCBnbyB0aHJvdWdoLiBJbnN0ZWFkIG9mIGhhbmdpbmcgdGhlIGFwcC4KKyAgICAgICAgICAgIC8vIGxldCBpdCBwYXNzIHRocm91Z2ggYW5kIHJlcG9ydCBlcnJvcnMKKyAgICAgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgICAgICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29tcG9uZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBTdXBlcjo6VGVhckRvd24oKTsKKyAgICB9CisgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCisgICAgdm9pZCBoYW5kbGVXb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtJdGVtcykgeworICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYm9vbCBtQ3NkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbUZyYW1lc1JlY2VpdmVkID0gMDsKKyAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1GbHVzaGVkSW5kaWNlczsKKyAgICAgICAgICAgICAgICB3b3JrRG9uZShtQ29tcG9uZW50LCB3b3JrLCBtRmx1c2hlZEluZGljZXMsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLCBtRW9zLCBtQ3NkLCBtRnJhbWVzUmVjZWl2ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBtRW9zOworICAgIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudD4gbUNsaWVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKworICAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgICAgfQorfTsKKworLy8gVGVzdCBFbXB0eSBGbHVzaAorVEVTVF9GKENvZGVjMkNvbXBvbmVudEhpZGxUZXN0LCBFbXB0eUZsdXNoKSB7CisgICAgQUxPR1YoIkVtcHR5IEZsdXNoIFRlc3QiKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gZmx1c2hlZFdvcms7CisgICAgZXJyID0gbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIC8vIEVtcHR5IEZsdXNoIHNob3VsZCBub3QgcmV0dXJuIGFueSB3b3JrCisgICAgQVNTRVJUX0VRKGZsdXNoZWRXb3JrLnNpemUoKSwgMHUpOworfQorCisvLyBUZXN0IFF1ZXVlIEVtcHR5IFdvcmsKK1RFU1RfRihDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgUXVldWVFbXB0eVdvcmspIHsKKyAgICBBTE9HVigiUXVldWUgRW1wdHkgV29yayBUZXN0Iik7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+c3RhcnQoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICAvLyBRdWV1ZWluZyBhbiBlbXB0eSBXb3JrQnVuZGxlCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB3b3JrTGlzdDsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWV1ZSgmd29ya0xpc3QpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIGVyciA9IG1Db21wb25lbnQtPnJlc2V0KCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworfQorCisvLyBUZXN0IENvbXBvbmVudCBDb25maWd1cmF0aW9uCitURVNUX0YoQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QsIENvbmZpZykgeworICAgIEFMT0dWKCJDb25maWd1cmF0aW9uIFRlc3QiKTsKKworICAgIEMyU3RyaW5nIG5hbWUgPSBtQ29tcG9uZW50LT5nZXROYW1lKCk7CisgICAgRVhQRUNUX05FKG5hbWUuZW1wdHkoKSwgdHJ1ZSkgPDwgIkludmFsaWQgQ29tcG9uZW50IE5hbWUiOworCisgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKworICAgIC8vIFF1ZXJ5IHN1cHBvcnRlZCBwYXJhbXMgYnkgdGhlIGNvbXBvbmVudAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IHBhcmFtczsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeVN1cHBvcnRlZFBhcmFtcygmcGFyYW1zKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQUxPR1YoIk51bWJlciBvZiB0b3RhbCBwYXJhbXMgLSAlenUiLCBwYXJhbXMuc2l6ZSgpKTsKKworICAgIC8vIFF1ZXJ5IGFuZCBjb25maWcgYWxsIHRoZSBzdXBwb3J0ZWQgcGFyYW1zCisgICAgZm9yIChzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IHAgOiBwYXJhbXMpIHsKKyAgICAgICAgQUxPR0QoIlF1ZXJ5aW5nIGluZGV4ICVkIiwgKGludClwLT5pbmRleCgpKTsKKyAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoe30sIHtwLT5pbmRleCgpfSwgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgICAgICBFWFBFQ1RfTkUocXVlcmllZC5zaXplKCksIDB1KTsKKyAgICAgICAgRVhQRUNUX0VRKGVyciwgQzJfT0spOworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5jb25maWcoe3F1ZXJpZWRbMF0uZ2V0KCl9LCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgICAgIEFTU0VSVF9FUShmYWlsdXJlcy5zaXplKCksIDB1KTsKKyAgICB9Cit9CisKKy8vIFRlc3QgTXVsdGlwbGUgU3RhcnQgU3RvcCBSZXNldCBUZXN0CitURVNUX0YoQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QsIE11bHRpcGxlU3RhcnRTdG9wUmVzZXQpIHsKKyAgICBBTE9HVigiTXVsdGlwbGUgU3RhcnQgU3RvcCBhbmQgUmVzZXQgVGVzdCIpOworICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfUkVUUlk7IGkrKykgeworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgICAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+c3RvcCgpOworICAgICAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgfQorCisgICAgZXJyID0gbUNvbXBvbmVudC0+c3RhcnQoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9SRVRSWTsgaSsrKSB7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnJlc2V0KCk7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICB9CisKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIGVyciA9IG1Db21wb25lbnQtPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICAvLyBTZWNvbmQgc3RvcCBzaG91bGQgcmV0dXJuIGVycm9yCisgICAgZXJyID0gbUNvbXBvbmVudC0+c3RvcCgpOworICAgIEFTU0VSVF9ORShlcnIsIEMyX09LKTsKK30KKworLy8gVGVzdCBDb21wb25lbnQgUmVsZWFzZSBBUEkKK1RFU1RfRihDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgTXVsdGlwbGVSZWxlYXNlKSB7CisgICAgQUxPR1YoIk11bHRpcGxlIFJlbGVhc2UgVGVzdCIpOworICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgLy8gUXVlcnkgQ29tcG9uZW50IERvbWFpbiBUeXBlCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHt9LCB7QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICBFWFBFQ1RfTkUocXVlcmllZC5zaXplKCksIDB1KTsKKworICAgIC8vIENvbmZpZ3VyZSBDb21wb25lbnQgRG9tYWluCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0KiBwb3J0TWVkaWFUeXBlID0KKyAgICAgICAgQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ6OkZyb20ocXVlcmllZFswXS5nZXQoKSk7CisgICAgZXJyID0gbUNvbXBvbmVudC0+Y29uZmlnKHtwb3J0TWVkaWFUeXBlfSwgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX0VRKGZhaWx1cmVzLnNpemUoKSwgMHUpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfUkVUUlk7IGkrKykgeworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICB9Cit9CisKK2NsYXNzIENvZGVjMkNvbXBvbmVudElucHV0VGVzdHMgOiBwdWJsaWMgQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QsCisgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxzdGQ6OnBhaXI8dWludDMyX3QsIGJvb2w+ID4geworfTsKKworVEVTVF9QKENvZGVjMkNvbXBvbmVudElucHV0VGVzdHMsIElucHV0QnVmZmVyVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0cyBmb3IgZGlmZmVyZW50IGlucHV0cyIpOworCisgICAgdWludDMyX3QgZmxhZ3MgPSBHZXRQYXJhbSgpLmZpcnN0OworICAgIGJvb2wgaXNOdWxsQnVmZmVyID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgaWYgKGlzTnVsbEJ1ZmZlcikgQUxPR0QoIlRlc3RpbmcgZm9yIG51bGwgaW5wdXQgYnVmZmVyIHdpdGggZmxhZyA6ICV1IiwgZmxhZ3MpOworICAgIGVsc2UgQUxPR0QoIlRlc3RpbmcgZm9yIGVtcHR5IGlucHV0IGJ1ZmZlciB3aXRoIGZsYWcgOiAldSIsIGZsYWdzKTsKKyAgICBtRW9zID0gZmFsc2U7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh0ZXN0SW5wdXRCdWZmZXIoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1Xb3JrUXVldWUsIGZsYWdzLCBpc051bGxCdWZmZXIpKTsKKworICAgIEFMT0dEKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworCisgICAgaWYgKGZsYWdzID09IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnJlc2V0KCksIEMyX09LKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTm9uU3RkSW5wdXRzLCBDb2RlYzJDb21wb25lbnRJbnB1dFRlc3RzLCA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICBzdGQ6Om1ha2VfcGFpcigwLCB0cnVlKSwKKyAgICBzdGQ6Om1ha2VfcGFpcihDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNLCB0cnVlKSwKKyAgICBzdGQ6Om1ha2VfcGFpcigwLCBmYWxzZSksCisgICAgc3RkOjptYWtlX3BhaXIoQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHLCBmYWxzZSksCisgICAgc3RkOjptYWtlX3BhaXIoQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSwgZmFsc2UpKSk7CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworLy8gVE9ETzogQWRkIHRlc3QgZm9yIEludmFsaWQgd29yaywKKy8vIFRPRE86IEFkZCB0ZXN0IGZvciBJbnZhbGlkIHN0YXRlcworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQzIgVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9tYXN0ZXIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9tYXN0ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTY0ZDY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL21hc3Rlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzSGlkbEMyVjFfMFRhcmdldE1hc3RlclRlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c01lZGlhQzJWMV8wRGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIlZ0c0hpZGxDMlYxXzBUYXJnZXRNYXN0ZXJUZXN0LmNwcCJdLAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvbWFzdGVyL1Z0c0hpZGxDMlYxXzBUYXJnZXRNYXN0ZXJUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9tYXN0ZXIvVnRzSGlkbEMyVjFfMFRhcmdldE1hc3RlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OGZiYzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvbWFzdGVyL1Z0c0hpZGxDMlYxXzBUYXJnZXRNYXN0ZXJUZXN0LmNwcApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiY29kZWMyX2hpZGxfaGFsX21hc3Rlcl90ZXN0IgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK3N0YXRpYyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQqIGdFbnYgPSBudWxscHRyOworCituYW1lc3BhY2UgeworCisvLyBnb29nbGUuY29kZWMyIE1hc3RlciB0ZXN0IHNldHVwCitjbGFzcyBDb2RlYzJNYXN0ZXJIYWxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIHsKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSBTdXBlcjsKKworICAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgU3VwZXI6OlNldFVwKCk7CisgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICAgICAgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpKTsKKyAgICAgICAgQVNTRVJUX05FKG1DbGllbnQsIG51bGxwdHIpOworICAgIH0KKworICAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudD4gbUNsaWVudDsKK307CisKK3ZvaWQgZGlzcGxheUNvbXBvbmVudEluZm8oY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4mIGNvbXBMaXN0KSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb21wTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICBzdGQ6OmNvdXQgPDwgY29tcExpc3RbaV0ubmFtZSA8PCAiIHwgIiA8PCBjb21wTGlzdFtpXS5kb21haW47CisgICAgICAgIHN0ZDo6Y291dCA8PCAiIHwgIiA8PCBjb21wTGlzdFtpXS5raW5kIDw8ICJcbiI7CisgICAgfQorfQorCisvLyBMaXN0IENvbXBvbmVudHMKK1RFU1RfRihDb2RlYzJNYXN0ZXJIYWxUZXN0LCBMaXN0Q29tcG9uZW50cykgeworICAgIEFMT0dWKCJMaXN0Q29tcG9uZW50cyBUZXN0Iik7CisKKyAgICBDMlN0cmluZyBuYW1lID0gbUNsaWVudC0+Z2V0TmFtZSgpOworICAgIEVYUEVDVF9ORShuYW1lLmVtcHR5KCksIHRydWUpIDw8ICJJbnZhbGlkIENvZGVjMkNsaWVudCBOYW1lIjsKKworICAgIC8vIEdldCBMaXN0IG9mIGNvbXBvbmVudHMgZnJvbSBhbGwga25vd24gc2VydmljZXMKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiBsaXN0VHJhaXRzID0KKyAgICAgICAgbUNsaWVudC0+TGlzdENvbXBvbmVudHMoKTsKKworICAgIGlmIChsaXN0VHJhaXRzLnNpemUoKSA9PSAwKQorICAgICAgICBBTE9HRSgiV2FybmluZywgQ29tcG9uZW50SW5mbyBsaXN0IGVtcHR5Iik7CisgICAgZWxzZSB7CisgICAgICAgICh2b2lkKWRpc3BsYXlDb21wb25lbnRJbmZvOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3RUcmFpdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcG9uZW50OworICAgICAgICAgICAgbGlzdGVuZXIucmVzZXQobmV3IENvZGVjTGlzdGVuZXIoKSk7CisgICAgICAgICAgICBBU1NFUlRfTkUobGlzdGVuZXIsIG51bGxwdHIpOworCisgICAgICAgICAgICAvLyBDcmVhdGUgY29tcG9uZW50IGZyb20gYWxsIGtub3duIHNlcnZpY2VzCisgICAgICAgICAgICBjb21wb25lbnQgPSBtQ2xpZW50LT5DcmVhdGVDb21wb25lbnRCeU5hbWUoCisgICAgICAgICAgICAgICAgbGlzdFRyYWl0c1tpXS5uYW1lLmNfc3RyKCksIGxpc3RlbmVyLCAmbUNsaWVudCk7CisgICAgICAgICAgICBBU1NFUlRfTkUoY29tcG9uZW50LCBudWxscHRyKSA8PCAiQ3JlYXRlIGNvbXBvbmVudCBmYWlsZWQgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGxpc3RUcmFpdHNbaV0ubmFtZS5jX3N0cigpOworICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGdFbnYgPSBuZXcgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgZ0Vudi0+aW5pdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBMT0coSU5GTykgPDwgIkMyIFRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl8zNTJ4Mjg4XzQyMHBfMzBmcHNfMzJmcmFtZXMueXV2IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfMzUyeDI4OF80MjBwXzMwZnBzXzMyZnJhbWVzLnl1dgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWEzZTRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfMzUyeDI4OF80MjBwXzMwZnBzXzMyZnJhbWVzLnl1dgpAQCAtMCwwICsxIEBACivKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tLT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Ozw/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9EREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzMzMvLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs+QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTU09TU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PDs+Oj06Ojo4ODo7Ozg4Ojo7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj47RDw9Ojw8OTg6OTo6OTs8Ojo7OT48Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPTM2Njo7PDhDPEFBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbLy8vMy8vLy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDs5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5HqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWy8vMzMvLy8vLy8vLy8vLy8rKy8vLy8zMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2trb29vZ2dnZ2dnZ2dra2tra2tjW19fX19fX19jX2NfX19rb2tra2tra2tvc29vb3Nzc3Nzc3Nzd3Nvb29va1NPT09PT09PT09PU1NbV1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhkSUlMTkA5OTozO0A8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1NRqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NjZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSNi4uLi4uLi4uLioqKi4eBgoKCgoKCgoGBgYF/kdPT09PT09PS0tLS09PT2+Lh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXJsaU5SYkxMVk08Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLUEae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uvr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWFJTU1NTU1NTU1NTU1RNQ0RERERERENDQ0RDP13R09PT09PT0tLS0tLS0t/q6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h3bGlKTl9NUlVNPjw8NztAQz42Ojc+Pzs9QkA5PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmnlxWV1dXV1dXV1dXV1dYUUlJSUlJSUlJSEhISERg0NPS0tLS0tLS0tLS0tHf6urq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs+QEA4Ojs4PDw8Oz46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183Nz9HR0tLS0tLS0dLR0dDc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYWJiYmJiYl6MrKmpqampqampqampqqNnYWJiYmJiYmJiYmJiYlxUVFRUVFRUVFRUVFVRa9DS0tLS0tLS0tLS0tLR3+np6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTo6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc3Ozs7Ozs7Ozs7NzMzMzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs7Ozs7Ny8zMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxcbGxsvMy8zLzMzMzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMvLy8vKysrKysrKysvLysrLy83V1dXW1tbW1tbW1tbW1dfY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojs4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7O0tPPz8/S1M/P0tTV1M/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDQ0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1dbW1tbW1tfX19fX19fX1tbW1tbW1tfX19fX19fX19fX2NjX1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrMz87Ozs7O0qucz9DTuZ/R0JyChIrIz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tbV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQkA9PTw9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0racpaPVspeYtbaTuLmvotLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz86dnJGdw52ipqvSkX1+r7DRzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj48PDk2P0I/Qjk2NDg6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipiq1M/Pz9G/mKCbsq3Ihpmt1dLNnp7D0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+Pz46OEVAP0I7NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2YqtTPz8/TtJmWqrik26OYrdXTwKCg0M/Pz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD08OTY0Ojk4Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyqCjv8qcpYynrdiqmarUz8/P1KuafqOPoNihmK3V1bCiqdTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjk8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NSsm6eLlqHZoZit1dSjobrU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tfX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENHREFBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OT06Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DTtrKypZmp2qGYrtbNnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GSbF1cb2doYl1PRj9ISEZFQDw8Pj48PT08NzU2Ojk2Ojs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cSimZabtNqjmK/Ywp+h0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLT09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LiroMfVoqukmszYoZmt2rKkptbS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0tAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT08iRjbTV1LGEw9a5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVpaltMX01KTEpVTEZCPDw/RkVHS0g9NjY3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj47PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHUyMHV0dLRw9XS0cLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FETExAPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0dPU0tLS0tXT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPT03ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEQ0k7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRklEPEFBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDg4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT48SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDREVDQUxINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFFBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/f4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERD4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb2tra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4ODk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERT48PDg6ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE8Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk5Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb2tra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUQ/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvN3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcXR5gIJ3dHyBhIJ9c3CAin94gn95g8je29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHV8dn2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODY1NDM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tra2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vb6/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODQ3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs7Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5uLi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NDY4ODY4Njs6OTw9PTs6ODY2ODg6NzY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2ur7O0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEY+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY2OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubq5ubi3t7a1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5ydoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY2NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7W1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS1tLa2t7e2tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3t7e3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLe3t7i5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmZmpmXl5eXl5aZm5iZmZmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CQD9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6yvsLGvr7CytbW2t7W1trW1tbW1trW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqamop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6trqunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e4t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmZqbnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEFBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKuqp6WlpaWlpqioqKiopaeoqKeoqKeoqKmqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3tre3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NjU3Mzg6Ojo6Ojw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87O0BDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKWmpqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSlp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpqWkoqOlpqalpaWmqaqppqWjpKWmpqSko6Kio6KhoJ+fnp6cnJycnZ2dnJ2en6CioaKjo6OhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpaioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mYl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0A/QkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2epKShn56foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzU3ODs9ODo6OTk7PTs7ODk+Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6emoJycm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaSlpKWlpqiop6inpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGjo6OjoqOlpqamp6enpp+bmpuioJqWl5Wam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampqSjoaCgn5+hoZ+goJ2amJiZm5yhpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4OTo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8+QUE+QUE/Ojk9PjpQnaCfnJucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36amn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenp6WkoqGjp6alpaOipaampaanpqagm5mboaCXkpOSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqCioqKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpKampaWmp6amop2cn6Gfl5GRkJSXmp2YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn5+fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgoJ+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc5OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpKanpqWlpqalpaOgoKGhoJmSkI+Wm5menJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZ2dnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKTkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTk5ODk8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubmpydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqOio6SkpqalpKSjoqGhnpyblZKUmJyam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnJydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn5+goKGio6OkpKSkoqGhnpuamZehtZ6ZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg2Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamZeYmZycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKCgoqShoqKhoaCenJubm5mfq5ucmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njo3NTY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnaChoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoKWzrKCgn5+enJmZmpqbrmp2nZ2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcm5qbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnZ2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6ChoJ+mkpurn6CgnpuamZqZqIREf5+enpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuam5qbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uZmJmZmJeXlpWUlJORkZCQkZKTk5OSk5OUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2eoJ5inKaenpyampucoaNRR4OgnZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJqbm5ubmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ojs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udm5qmZl2joJuamZudnK51SUyGoJycnZybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFE8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw+OTo6Oz47PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmYpIBSeKKZmZqdm6CkX1ZOh6GcnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJubm5ydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaChn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkXFxRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD89Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycm5iYmaCIW1+UmpmbnJyjj2RaTIGinp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtbTEY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJmfl11ddpeanJ2dooFkWU1+op6enp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5uanJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmZpgYWCAlp2cnph0Y1VOgKKfn5+enZ6hoJ6dnp2enZ2fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZmfaV5bZX+cnJ6Mal9QUoaem52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7QkBBQj4+O0NEREBDQz4+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqXk3NoYVR2k5ech1xWUFeKko6SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGRjpKanpJ9oKOWpJxuTE9jhoaCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6Oz88Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/P0BEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDgISgnY5/bJallZ+AiX9fcn+AgpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTk5OTc0ODY5Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT4/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn+Aoot8blJ1nIyMWnF9fH59fIaOjYuGjZSRi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44OTg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqFgIJ9mJp3WE9McJSGgkxgb3F3iIWKjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gH56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRi3+IjYyLi4eRjaONVS8wPXeHd3ZBRF5rbYSQiYmQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZCeoZ2Tl5uhmp2boqacZ0FaSDt3eWtnRS84W2xzkI+LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqamvj0tvoXhBe3djYlBQWkdgboqhoaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLS0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKmqaeoo3hgv9amQ3uMgHVPbY51UmR/o6inoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSnp5mdpKWjop1if73Ar3eeo5qUZUxheG1RdJWioqChn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV1BeZWRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QDw+PDk5PEFCRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKhoqehpq6mpp2eaoScuo+m0KGZsahYTKyTU2WPoJ6goJ6doKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaiqrbGyr6uiooZ3fn1yzsmxm6eva1WqsGJah6afpaKhnZ+imJWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVVxoZG9jbWlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk+PEI/P0FEQjk6gJ6kp6Gem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqp6+3t7S1trOtrq2PhoNuj825lZCil3RUb3pzbnuVpqqno5+eo5udoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqaeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqejoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjYB3cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQj5DPTs5PjlAQEA/QkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrsre7u7u5ucG4tLWgiHlkWZ+3wKaonYh3a3FveHh6fYaOkpicoqWmq6WkmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloKGop6alo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaBdnh5eGNbUllUX19hbWh2a3FoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7PkNDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tbfBxszPzszJvrOkkHNmUkSLl4mJiH54cW5nZmxpa3FycXFydHyMqcTEu6Knqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaGkp6ehn52elpOcoJeZko+MjJeWn5uWnJqdnJqTlpSUmJOQmp2YiouHgIB8gnhhXllTYWlhZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8XH2+Pj2su8r6SXiHRZWlFDaXpsb3Vua2VlWVdeWFxjaWloZWBoibTAwLmpr7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GenaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdvbVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozo8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV6MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGvs3R1cq5p52UhnJeUVRLRFtmXmRrZWFgaFlUWFJWWFlcWFp0mba7q7SyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4R/amZoYWtsZ252cnJ2cmdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTNbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/CwcfLyLeUdWVVUE9USD5ea15fZWJgXWRhU1ZWVVNUV3Kbq7CqqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dWtsbmRvbWlxeG95amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMzY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjw4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7m4w5thSURHS0Q9W2ViYWhjYFtjX1dRTk9PVX+0uqyupaSip6SgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+dlJOJiX6GiIyWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyXl5ybn56jnJ6WmJeTlpyZmZyUlp2UlpOJdnl6e3dua2lodlpnc3hzemdnXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo7Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMTEwsTBrYNPRk1FO01bX2VrZV9bYFlYUk1Uf6KqubWzq6mjoa2qrKetn6y0tL/Dvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTjJWWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXZ2ZWZpamhea3BueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIzMrCwsTJzM3Oz8zDx8bIycjIycfFycfIx8LGlmpYRz8/R15jYmpgWlhXU1V2mba+u7y6vKytpqm7urm3v7O1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq6yxnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhaHZpamp1bnlsXmRbVmBZTEhENjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwcPExsnFzNDNx8zJwsLHwsvLyMfMyc7Fxsa9qXJQSzBYU1VmYVNOT3CpyMjCxMbAvL60sbCwwb6+wcbAvre2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2vtaWlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46LlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem52elpyjoKGipKOkop6amZubm52enIN9cn14cGdga2p3bWlmdm90Y11jVVdVVE1HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oj05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXCw8LBvJE/TnZ+iVZMb6TL1MW2v7/Av7q6vbWzs8C/ub/CucG3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJyfnqOgppl5enmAc3BmZWdka2Via25vb19ZXVdWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDw8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK9vMWnd2qDkJhvqcjIx9HBr729uLm7u764tbG6v7S8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2wp6alp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdo6CanqCkoqOcoqGjoJ6cnp6ppaiVfXqDeG5mYWViYWNkZGpjZ2RbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7O0A9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI9OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8C6v8C8u8W9usDEv72+r3NlfZGLidHFv7/Jv7DBv7q3u765tri0uLy1vbi1tK+zvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFjY2hrZ2dqZmpeVlZUWU9UTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1o23v7vDtbrHtrW4ury4ubaqo5iOf4PJv7+7wb65xr3Cv7zFuLe3tbi2try7uba0uLq1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWdvamVsaFlZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+8z8R3p8y9x7e5t622tLe5s7WxvMnDlUt6yr6/vr28v8jDxcW+x7i1s7O+uLm4vru6uby7urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25xZ3FrdGZjbmBcVUhLSkRKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiTvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNavdH+6yM/CwLiutLS7vbe5sb3Dyo9DdM3Dwr++vbzHzMfHxMe8trW3wb27vMDDu7/Cv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWZsam91b3hkaGNcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCxsnSmnFyq9LRzMrEtbq/xMi+vrS/wMB5Um3LxsK+wby/w8zKx8XGwbm+vcS/wL/CyL3HxsXFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRwbW10bG1vYGNfYmJOSU0/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xNDDur68xL63vMC/yc/HyMrKwodyc6PLzMvNysbCw8vOwby4vbqxcGNiu8jEwMC/xMDKycPDw8O5w76+ucC9w8bCys7Hxr26xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdpqGfm4J7eoh7bW14fGBxZFxfYGBUST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7ur2sO+tr7Avr66ppypsrbDv6V6dniaxMfLyMHDwMDJysG/u7mxoX1zaq3IxcS/wMG/y8fDwMjAu8K7ubS7u8PDwc3QysS9tby7ub+5urW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenbC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem5zeXRocF5cX11aUkZFRE1JQUQ9SDs7NTk7Ojw8Ojs7Ozw/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8S5bazOvba5wLyrfm5obmxygZWYc3d8l72/xsC5wLy+xcS9vbixsJmQfoCbysLDvL2/v8PDvr/Ivb7AuMi+q6Ghoaa5wcnFuLK4uLe9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdtdXtxb2pcYGFaVFFBRklHS0BFQ0k8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fm52bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNtHaAs722tcKlh2laXWBNUltabnN3gJ+4uMK6s7u3u72/uru7rqSbmYiRfsDEw768v7u7uLbBwrbAu8isvK26uJ+TkZujt7SwtLS1vLm+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytry0saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnd4bnJhX2ddW1VKPT8/R0c9R0NDOTo1Ozk5Pjw8OTo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaiEeImgr7Wea2VmVlhfSUlNUFNsd4WlsLe+ubK1sru5vLa5vrSVnKeWoXCuycTAvb+5s66yvbuuu7uUj87c5uLRuJqShn+dra+us7q3ur67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JtYGRiXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8WriHx2jKCZYFRDV1ZIYWtWT0ZJYI2gq6+2urW0sqy8ubi1uMG9i5myo6ZypcvCv7m6ta6lrLOwprO5mujj29XX1c+6iXVqbJisp6+2s7K6tbu7u7W4trC1xLK+vL68ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnNvZF5oWV1eU09OQj9KQ0FLSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmpGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/tZGCeIiPb05KP2NaQU53gJRrTUFcgbC1s7WytK+su7q4trm/xnaEqp+bZae/uLWysa2tn6Snp52ror3Lq6i1ys/Py5l0a2xyoKSqra6nsKyvsbGtsa6ur7mwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZ0bXZqbF1ca1VeXFBOSERHTUJHTkc4NjY1OjU6PTg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiEe1hGQU6GWkpKWHaNgGNAUqK5s7SysLGtsLm4tru3ur2QorKspHOrsKmrraujqKCdnp2Ymq6zWjhLearFysaigIWSiIieo6mooKanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xrKqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J5aXV0b2VVYmRYXVJPTUlASVNETkM9ODg3NTo3PD06Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7G7qpmZlWlOQFJ4cVBJSUtnm4FZRVGtu7Gss6+urK22trK0ta6ppp+am52fpqieoKipn6GnlpuWl4ysfTJSaFZ0r7WxnoyaoqKblp2jop+epKCkrKWmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqppKmrpqmsq6ahiHmDfHZ/emN4bW5cUWlVUE9HUE1NQ1BSQD87PjQ6OjU7Oj07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaqlpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovMKrpL5pRVKcglFXSUlfS1OOYWRigK61qrK0rqqrr7Cys62lnZGXk4+YoJ+ioJyjpJ+dqJOZlJWLoGNehod0WoyjmZuYnaGkp6adnp+gnKGfo6innKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclpOPj5KRmZCWlZiXn5ibmpukmZeUlZqdoJ2nqKWgo6Kho5+coKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn59gHV2fW5se2RoVlNkTkpIR09TTktOSDxFQD0yQDg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62trq5ure3u66ooKGpoarGv8qhUEFynnhPbktLYmV1c2BbXnCPsa+us7Wqpqyso5uZlI2RlZeYmJyfoqKcnaSemqSWlpaUj4huh7q/o2Nnk4eUkY6eo6Kmop2fpp6dn6OmqJ6jpp+qnaqtqq6nqLClo6Smp6ymoaWim5mer6iusqumq6qgm5iYmJWTlpqTlZaalpuXmJihnpycl5uhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoZ+gpaKmoIl8gH53eX1leXlhYlNWYUlJS0xTVUpTUU05PkE2Nz02NTs6PDw5Ozs4Ojw9Ozs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg1NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZ2jx8ePV1NJZKNdZX5vcl1Qa2NbZF9da4+0sLC4rKahnJ2alJiamZCOkZWRjI6Nk5minJeimJmWlpmIeqTH1tWfT2x/iYCDlJqYm6ujobCjmqOmpqqioaqiqaSosquxsqu5qKarp6urqKysp6Ggo7GusrG0qrKvo5mcnZ6hmJubmpiZm5WWm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaiip6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaIJtZVxTW1pNUktPT1ZNVE1CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT83NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6KanqukjXpVaXJ1dXFidnZYV2NgY2dZWFdlrK6sr6efnqKhl5GUnKCcmZiSk5+coaOanpqWnpmdlpqXj3efytqysmdGZnp4f4OBe4q1r6azrKGtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztbizuK2ytKSgnaWgrKGhoqGgmpmWlqCcm5iloaCeo6Ggn5ucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYN/fHh2and1Xm1bUmFJUlZIRlZXS0NNSD1LSThFPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamorqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6KhoKSAboJwYGNYTFtTWk1MUFhSSE1NR5esqqmloJ+akZKUmJiWlpWMiIuOlZ2cnZyelp2YpZ2gmpNwhr2yU4p1eXFlaWplXlBrrLqstLSwt7CutKmmpKWsqbmztbvDvMPBt7u2q66xuLe8r7OwtcG8t76zs7WirKKpqbKpq6inqJqZnpqqp6CZqKCfn6iopaWfnaqiop6bn6igpKetmaCjnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYaFfnZybWl3bWhuXVhbQ1dOSkdOR0NHTj0+TD41PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqZSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco5+dimJXXmVgV01RRz4+P0NDPz5CUXioramqpqCen6Gjnp+em52clJOVlZ6emJSFnZmfmamirKCSgnuIg3qBkKWHc1pLX1pJQKfBtbm7wMO5vbusrqexrbHCtrjCxsDIysDKv7C5ub24wr64tLvGxL3DvLi0qrOtqrO0r7Ouqq+jnqyot7Kto7CmoaOwsa6wpKWuo6GgmqGmoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXx0cmtrdXJxaFdcUUZVSERKUEk/RkI0Rkg5Njw+Nzs8Pjw8Ojo4OTw4OTs4Ozo5Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PDw7Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+flX1gXmVgUUdEPUM/RTw/OTZOf6qzp6SkoqCepaymn5idlZKanpmVjIqGiIZ4bIafoqGpqbSReYyHh5ajpKaIYm5rka6ATES3xL/EyM3QyMvDsre1vrK+xbu+zM3GzMzM0se+v8DCvcfHwrjEysnEwce/urS6u7S7t7C2squ7sq67t8C7uqu4rauquLu1vK6uuKOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlZSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtkaW94a2ZaXEZMTUVEVE1FQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojo/Pz1CPj83OkFAPTw9ODY2PDo8QD9BQUE+kqugp66noqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1zamFXTkU+SVl8cGJCPVyOrqyhmZucnp6Zl5eYk42Pl5eUj42QjIKDgnZycGxvjaSrrbKnc3Z5bmxsgoR7hVlWeYzAp2FuzMTEy9DS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysHGxsbKyM+/ydHNx8bJxsK9xMG+vr+1vrOtv8DDxMjFyMSvv7myuL3EwsG7vLy1rqenrqigoqmkmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dXNlYmdyb2dfWlpET01DRlFJRENBNTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+OTtBQTs7Pjc4Njo7PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56bnZZrZl1USURAP0uFnqWahKCyraOenJ+amJeUk5SXkZCQjYiEhImHg4CBgYB5cXFuanaht7WZl29lZlxNVoOAcJB6aG9ftKdsn9PPxM3U1djR183Gx8nMw8XKz8rS19LX0tXW09TIzMfMzcrTzc7TzcbJysvCx8zHycnGv8Ozs8jFy8vMz8fKv76/vcHHxczMycnAw8CusLOonqGqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5aQjIaRi4B7cnV2Z2Nnd2plV1hSRE5HQElRQz5CPToyMkE8RTw3ODxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGdY1NMSkRDP0JSrdG9sq+mnJycoKShnZuUlJWUin15cWxlYmhycHJ7hYqAdXBtcHJtg6yYi5ppV2NYX2RwgG1+j3JPc5uZgMbQ0cLP09bY1dXSy8nO0MvGzdLJ0tXX2dbY09bYzdLKztHMz9HN09DAycjLxMzNzM/QxsfItsDLwNLNzNDHysnAxMPIz83Q0c/NysjNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNhZXNjXVJcSktHQUZJSj87QTg+NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGlpaCio1tJQEFEQUZQdbGvppqUl5+cmqCgnpudmpWJd2lkYV9gYF9eX19dYWx1c3BvbmtwbnKGjYuOYk9cVFxgUWZeWGVaTWp3eYfV0dDL0M3T19bT1dDP0tPRydPRx9DX19jS2NLX2dTWzM/Pyc3SzM/RwMfEycfPztLR0cjMzcDLzcbUz83PyMXLx8fJzMvU1NHVz9LM08K5xbGlqLWuqJuoq6Wdsqiws6ysk4+TjoiKjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZRYEpKQ0ZDU04/PD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjw6PDc0Oj48P0A9RkFEPYKknKClnqWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fX1NXZ2dHO0L+8zMm2vq6nqqiho6xnQzg9PkRYgqqon5eVl5manJ+dmJudk31xZWNiX19hX15hYF5hYF9gZW1wcG1qbW9zdH97cWtlVEdJUVBHRT1KUFxfdVtz1dTQyc7M0tbS0dbNz9XV0cXR08rQ1NXWztPR2NfX18zIzsTKz83KzcDKwcnKzs/QzNDOzszP0MjM0dHLzsvDysjKzcvM0tPO1NLR0NDKvci5sK67ubWrtrCtqLits7+7sZqOoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcG9rYWRucGFYXFtJRkZFTVlFO0A9MzM8PDg3ODY1Oz5APTk8PDg8Pjk8QDtAOj04Pzk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cgo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSyfEhGQjtWjaGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGBgXl9fXVxibXJubXFxcnF3aU9+jWpRWEtXT0tgQEtbUm1idtHSzsbNzM3Uy87SzMrW1tDM0NPLzNDS08rO0dXS1dbKwMrCxs3DycrDzcTGycvLz8vOzdHO1MzHydDNycfLxsfCxsrMztHRx9DPzc7M0MXHwbi5vcTCvcO5srK+sLvDw7WqmKWhmJaRlZWSi5SNmpGUlI+PlYKJhnlxcmttaGBgcWhZWGhWTUdNSVFRQjtEPzs2ODo4Ojs1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4ytXW2drb2MzMz8jW1cTCta+0qKCtl3hsb292j5qNjJeVkJORkZWWlZCLe2ViYmJgXV5hY2JgX19gYWFgX11bXWdxcW9wcW1pbnBmfYt6ZmdbSlZdYzxBVkthaXfOzcbExs3K0cfKzc3F0NLPzczUysfKzs/Hxs7Sy9DPxbrEv8bKvcPHyc7Fw8jAx87IxM3LzdDJxcXQycbCxsnFv8HIzczMz8PKzMnHzNDFxci7x8PJycLPwL28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Vka2BeZnFhW1dgR0lIR0lNVUc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62ktn5ngoahqZONjZaPhYODg4F9hIR/c19bXl1eYF5gY2RjX11cXl9gYF9bWlxha3JwbW1oZ2lqdoORkn1oaFRXZlBCRVxWV115ysS/wr/Cx8nIyMnHv8TLxcfKzMnEwcrJwcHLz8TLyL+5wbzGyL7Axs/LxMDDu8rHyLvJxsXKwb7Cy8bFxL7Gvr3BxMbMxsW8v8rDxcfSxcHJwMrKx8jG0MPDxsOuxMvHw8q3v7y6s6mspKWYn5iso6Gmm6Ogm5V8d3N1ZmpbYW5tWlxYUkRMR0NHRExERlNANTQzMzVAPTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ovri8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76ysLZtXnp7nZGKkpaGeoCEhX91eHVycF9aW1xgYGJjZGRlZGBbXF5dXl1fW1laXGFucW1pZmdraGx/kp2Oc2VaW1NBQkVPUlNWkcK3uLu5t8DBwcO9vbi8vrjDycTGwbzGv7e6w8i/wcm7tru7xcO/vMLOw8a+vrXBvsS7vce8w7q1vcbEwsO3wLa2v7+8zcS9trrIu7++zMTCxsPGycfJxtDGwszHssfJw87MwMXCv7yyt7Cyp6ioubClrbCqrayUend4a2VoYGhvZFZeWUpGSkZIS0FGQkZKQTk6NjU4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWrt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1tTV183Kz8XJxcfBusW9rK6nYGN3gJKLiIuEeH+Ghn99g3t0dGNcXF1eX2BiY2JiZGViXVxbXF5cXl1aW1xdZ3Jva2RjaWlrcomikn9mWVFRU05AO0dMcKCzrrKysrKyurS7sLavs66xusG7wMS7v7q0sbq+wLjHuLS8tsHCvbi9xsHDu7Wvs7W7v7TFuLu1rLm9vsC9sbq2sLe6s8a9t6+8v7W3tcW9vsPGwMTGxsfMxb/FxrvHy7/PycfDxcHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkdCREFFRj89OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MvNyMnIysnKxNDN0s/NxcfBxcG/urjJt6uwmltnb4iOhYiJenh+hYZ2d4F8c2hdXV1dXmBfYGRhXmNlY19eXFteXF1eWltbXV9rb2xmY2ZoZ2p1kY+DbV9TWGRdT0REXZWYo6atqqiqp7KstK+xp62mq7K6ubXCubm5r6q0ubqzwbmvwLG9vLu1u8e5w7atqqiwssC2uL2wsaiys7W7vKuutqeutq68srCquLCuu667uLvAwL66w7/Gw8XAvMbBx8q4xcfFv8fDwrnExsK7xsnMy7O5wr27s4l0dndraWBibGlZV1dbQUxMTUpFQUM/RkE7Ojo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFzdLLw8XBxM/GzcHDxr/ExMPDysLJyr/AvMK6s7W1w6+qsZNbaX6SiI6Pe3h9iYV5e4SAd25eXVxcXV9gX19kY2JkY2JgX11aW1paXVpaWlpcY21tZmRkZGZnaniHfm9oXGNsaXFzhJSXj5KdpKqhpqGpqKupr6KlnqmstLWwvLivtq6nrbezs7u3s7yvuLm1srvBssGvpamjq7Gzs6i9qquoq6yutbSmqK6hpLCps6anqK6mqLessbO3urq7sry+vr7Ev7XBwMfIt76/xbfEw7+7v8TCvsTIzMq/v8TAwKmHc3RzamlcYW9kV1ZYUEhaU1NLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPHubnLwcu+u8m2vcO+usq4wcPCtba8trGvtbyuqKuTY22Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX11dXFpYWVtbWFdZXF9lamRiY2FkZGhtendxcWh0f39oa5OakI2GmJukoKCeo6Olpayem5qjpauwr7a2pq+rpqmzq7O5sLW1rba5srC6urG2paCkoKaxqKypuaqlp6eop7OtoKemn5ykpayfn6ekoaGxra2ssrWzs7C1vLa7wcCyur7DwbG5ucKzwL3Atbi7vb68wsfEw8S/v8SghHhxbGJmYGtvYFVZX0hOaE9USEZLRjw9QD06Ozs4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTs6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBur22oJ6VnaCmurars7O7s8TPycvCxbi3x8DMv7jKt7vFuLPFuLO/wKy2vLKspq+0raGjkmlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBhYF5cW1xcWFlYWFhWWFpdXmNiYGNjY2JlZml2eHRvfIN8UmeNlYqKgJSZnKKZnJ2ho6GlnJmhmp2prqywtKKoqKmrq6S0uKy2r6yytK6zta+wqp+en6SisqSmqritoqamoKitqpmfn56ZnZ+lmpmjnJyesKmsqKqrrK2wsrivuLm6sLa8u7qrs7K5s720t7KxtbS/tb3AvcPCu7u9l4R7c2xfZV5kZFhUV15JV11LUEdKSkdBPD8/QTs/PDA1NjM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru4wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765yLi4v7eywrSxu7usurqxop+pq6eYnpBtfoWGf3hybW9ta2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYV1dXV1dYV1pdYWJjY2JiY2RkbXpybnd+Zz1ljJKGioKRmZqim5eaoaSgopqdn5mXrKysrbCgpKGsqqahtK+wsayor7KnurOmtaCin5yjoq2joqq2qqKjpp6mpqOWmJ2XmZqdoJqXnZydnK2hrKijpKatq7KzqrWwsquyubWvqq+ysrO3s6+pra6xt7G6trq9v7ezsZSGenZmX2ZfW1lWU1pVS1tRTEpFSEtJQz0/QkJAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7KdpaOYpbHDtba9rbS4wszIxr/FtsHAx863wMO9s7m5ssC2sbm7rbK1r5+apKqglJuQeH+DhH94b3F0cWhlZGhkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdVV2BiY2FhYmBgZGZycGtye1A5W32NhoyFjJiWmpmSnJ2moZydpZuamKmkra6pmqGhtqign62otammp62wpLewo7ego5yZmaqmoZqtua+joaScoqCfk5WhlJaWnJmYlpeclZ+pnqqkop2jqqqwrai0rKqmrbKwpauts7GvsK+vp6insq2xtLC7tLq3rqOUgnp3ZV9hV1lYU1JUS01eTFBMR0hNTEU9QD49Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS6wrG+t72tnaenoqq7wL3Aua60uMHMyMXCw73FuMjMssHCwa68u7W7vLW5ubCwsaqcmqGqlZGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1tZW1taWFZXV1ZXWFdXVlVaYmJgYGFfX2BiZ3Bpbm45LjBMgImNh4qTmJaakZuao6KgpKSdm52knamtpJ6gobWmoKCip7Khpaelr6Wxrau1nqCdlZWpoaKUrbGxn6Kjnp6Zm5OLoJORk5iYkpeYmJeep5unoaKapKWlq6SlsKeloqusraaprq+vq6iqqrOmpquvtLGuvLaxsK+fknt4c2ViXFtdWE5MUUhSYU1WUE9KTk9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ozc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtr2wvLG3rJ6lpqy4u7zBxbqyubXEycnAwsbFx7bGxLPBv8Wrt7e9tr26u7WyrK2omZmgpIyKdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZWUlRSVF9fXV5fXF1dYGFoa2thLh8rTHWEioWIjpqTmpGXm6GeqaKhoaGioJqnqKKYnKKwqaCgnKSpnaeinqysqqmtraKhoZWYopqcj6uosJyfop+el5mTip2RjZKTlZCYmJOcoaOcpKGilaCipKWbo6uloqSqpKutpa2yqaalpqa1pqmorbO1tLm6r6usnoxzcXBhW1dWVlJHUU9IWlxPUkpUS1NMRUdKQzg7Oz08OTY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsa2dqKevubmzwMi6tcCvxcjMusHJzMi1yb2xvsPJrbG4wbW8wLy0taqsppaanJyJgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJSTlBYXFpbXFxcXVxfYmlqYj0rPUxugIeDh4iSk5uVlZqkpKakqKSnpKCWo6uik5ejraefm5ian56umZyqs5+lpp+jo6GUlJuWlpKpqa2anJ+hoJuUkIyZjYuRjZKNlpWQnaGgo52co5WboaOhmKKoo6Koq6Crr6OtuKWjpKKsraqoq6+0t7K9tbOrrpiFdXRpXFlZU1VSRlhMUVtYTVVPUExRUklPSUI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs6Oj02ODo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraeztq6oqK+um6morLe2rLzKu7a/rMzGxbjAzs/Hs8S7t7vCyLGtuL+3vL67s7amqaCWmJmXiHp0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUFhZWVlcW1pbXV5jbnNTRFBbYHyCfYmGjpCZmJSZpqSiqqilraGllpypnZOToqelnJePjpmdrZaYp6qYn52UpaCekpGSkZOVqKqlmpiZnp6XjoyLk4WIjYOPi5GVkaCeoaSZlp+VmqGinpSbpaWoqKigsLCmsb2nn6OstKqup6+0sLm1wLGusKuRf3N0YldUVU5SSkdWUFJSTExYTktMT1NHTktBQ0ZEQz5CNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/tKymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrG2uLy9wMOxsLG3rrS0u7O0o6OdnZiXlYSAdmtnbG5xbnFqb2tkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVFFNTk1SV1hZWFhXWltbYGppZm5fblxqf3iIf4qKkJORl6OWmqWjoqibpJWdopmQjJ2hmZaWhYSRmqOPlaOclZaVh6Kam5OMjoqQmqWnm5WVl5yRk4iUjouBi42AkIuSkpKhmqCilpSZmJWippqNmaWnqKehoLSyqLO4oZ2jtqyqraSysqa1vLSrrLGiinp0bl5OUVFNT0ROTk5QS0ZOTkpKTk5RSE1KQUhMSUhEPzk1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg1ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLawpKekqqWgqaaks6qissS1tbKzxsW3usPKzMazrLq9tLjAr62psJ6mrruvraCam56VlYh8hG5fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSUlNQUVRRU1VRTk1LS1NXV1ZXV1dXWlxhZVlfXGxfXnhvg3qEgIuJi5abipWXn56glqOTnpmTioSXmYtzjIJ9jZaVhZKZkJOOjXuZj5yMgomAipigo56Qk5iWhY6ClH5+c4qOepCHk5CQnZuampKWkJ6OoqOOiZqgoaOkm6K0r6yvrZ+YprimpbChsa6csbuqqa+pmYR4dGRWTVJQUE1DU05MUE1CUFFISU5TTklKSkVLTUdLSz44NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI0ODUvMDEwMikoLC0wMjc2NDc4OTo6NjU6ODdBN3i3oaO0qKalqKOmpaamprKnprTBuK+0sMnEuLnAzsa+s627waytxK2noaaSnaa3raOgkZaXkpB+eH9mV1ZfZ2ZpZ2huY2lpZmJcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5PTk9PUFNUUU1NSkdOU1NTVFRTVVhaXGhYWldpbWVkRU9piHmNfoWVkIaOjJuVmpSVlJGMlIh+koheO1Zue4qTiYCMkYyPhoZyi4SWgXmBe4aUnZWDlo6Qj4OGfZN4cW+GjX6JgZCOkJiamZOLkIqdiJ+YiIiWnpqhoJenrqmtqamelq2zoqWtma2rmKi0o6mtopN/dG5gW05TUldMRFRKUExMRk5PSUVMUU1LUEpJTlBHSko9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CiraGmpqqgp6mno6qwqKe0wrmwtbDHwrizvc+/ua+utcKnqsSqop2Yg5ScsaOamYeUkIuHfnN2XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNTlFNS0hGSE5RUUxPUlRVV1lgYFRSYm5jRTg3eY2Jh3WAjYaAhYiWiZSViZGFg5KEd4d+X0lQbXeKkYN9hIyKhH9/bX5/k3d1dniEjZpwUY2IioZ8fnmUdmd3hoh+ioiVi46Rk5eMhIqJlYSbjYKEkpuWnp2UpKOoqaWlnpuwqqGkpJGmqpaiqpyhpqeKd25mXlxIUVFTTUlVTVNJTEtPSUhGSk5MTVVLUVJQR0pEPTc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aboqedn6Guoaeopaenr6yqtby2uLezwbu2p7nIuLaoqLW2qrK8p56Vjn+KlKmWlYt/joSDfnhxb1hNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERENJTk9oWU5RU1NVWmZcVGBnV1hQSoh8jIBsd397d3+Hjn6PmYuOeIONfnN+d3FtdHB0jY2Aen6JqoR6e2h2e45wcm14gYuNknh7gHuAd3NyknhodYWEhIV8lYuIio2LgH+Ei42AlIR8gI+YlJyWkZ+dqZ6goZ2gqaWfnZiNp6SSoKCWnp6kgnNpYl1dSldQUkhLWFJPSk1MUkpKSkxQSExRTFJVTkZJQj03ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJyftKmvqqWtq7Cxqr20sru4trq0sZ+3urKqnZ2sqaiyr6KakY2UgY6cjpF/d4Z4fHZwb2pZS0hJSEdFSEhQVFRUV1dTVVVVVVZXWFdYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MTlFRU1ZeYl5cYVVlfo2SiYpzYHJ5cHN5g4t4gJiSfm6EjXp0eW5qfa18dJCKfnqGkoB8f3RmdXyGbG9oc3yKjYiAbXpxfXFtdo9xaHGBfo5wRIuFgoOFf3d4eoyGfYx7dX2Oko+Yi5Kbm6OWmZ2bnZ6hnJaNi6Wbjp2XjpaYkHlvbmdjW1hYVVFKU1VUT1BOUFZLTktPT0pRT0lPUExGRD07Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS0uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagprCsrqunqbCvsau7uKu6vrizrKebsKesm4+WnKWppKGYmo6EknqJj4uLdnF8bXVxam1qWEtGR0VBQENESExMTVFRT1FTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WUpOT1FUWFxcW1dWd5ebu3prb1tzcGh2c4KLdXiIg2xpiY92cndoaH6BcZaRioB9lX9JkpluZ3d+gm1qZGx5hZCShmtzbHxucnyGaW1wf3ONiYWGe31+e3dwdXSGgnmBeXB8jouKk4OWlpiakJOWlpmWnZaMg4mfkouSjYaQloBvam9vb1lWWFRSUllPUlVUU1hVTU9ITUtNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5ian6Ssr6Ktqqi1r66ss7+rvMK/pqKalaSYno2Ei5ShopiZkZOLc456gIaMhnVvdGxxbWVra1lOREZDQDw+PkJGRkdLS0tMT1JSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9KTU5PUlZaUVZSUJh6V5BfaG9ddmlneXSFhHF9g4FxapaPcnF6aGicjkx5hJGIhI1mMXaHcmt9fYN0ZmV1foSEhYBmaWx1a3CAfGhxcXxuk42Pe3R9fXFxb3Ztg393eXVqeYiCiImDlpKSkIuNkZSUjpeNgHmIl4iHioaAkIh4bGtwaGVYUltYWVlbTlBVVllYTklIRUpKSEdCQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW2SiJqQmZakqK2esZ6nuq+rsrDCsbvDx5qWjpWZi46FeoSQmJWNkYyQh3GHgnSHjIZ6cHNxb3BkcGdfVEZJQz88Ozk6P0BBRENFR0lLT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FVS0FIUEZdpamXZnFuZHVma3x7f3x2f4KCdm+ckXF3fnFzkoY1cZynnI2goYSihXZwhnuGfHOMrY2JgWhnYmpucm1wg3Vpb1h1cI6bkXZtf3t9bnJucIB7c3ZuYnWDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY58dHJxbWBcXV5cWllhX1JOW1pYV0xISUZJSD9DQUJIP0NEPTs6Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MDEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikYGSh5WRnaSnnq+VpbSprbGuwbK7wcWWj4yUj4CIfG6BkJKJg4qHj4V1g4NslYiIfHV4eG14bndkal5JUEc+Pzc0NDg7Ojs9PkBCRUhLTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU1QTDdDTVBRQkZ7aXRycm12ZnCBgXZ4f357iHpznpZ3fIR/g5iDmpxghamenIuDkI56dod+iYiOc4qXj4R7XWRxdHp8d4ptaGpieW+FkIJ6b4F4dYV6cHR6eGtuaV12hn2HfIeGjn+KkpeDjYWMhn1xhH+EfXZ3e3yJeHF0dWdoYFtcXlNcZ15XUFRYW1VHSkpFTEc/RkBERD9BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1NDI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4in+TjJGcnZ6mkaCroLGor8Cyu8W6lo6Rk4d6hnZrf4uRg32Kg46MeIOAc6CEin19gX9wgX56aHdrUlhMQEUyMTEyNzY2ODg6PD5BRUZGR0lLTU9RUlNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUtNTlFLSlNaVk5GX3d9cX9xdGp1iIV1d4SCepGDdJ2WhoSMkJOkjKypSIasr66KgYCUioGKgYSRqYeBmJiKnHRtfIGGh36OaGdoeX9uhYeChXGEhkdtgHdyeXZobWtfdn2CiH+HhIt5lJybiYqIkX96dYp2fHhtb3d+gXV1c21cXl5cY2RYZ2ZcVVBQV1lQRExLRk9JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Nzg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYSHkY6Vl5KWoJ2soKa4r7O9s5eNkouYi310cH6Jkn59jIOSlH2Gfoakh4h/goiFeIeJfnOEeF9jV0tCNjAuLzIzMTI0NjY4Oj0+P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz8/ODQuXZZwc6NVRklLTE1PV19WaVdYWmF/h3uKeHx5fYqMeYCEjHyVkn+dnpWSmZmkrJKZu7GmusfDp4uMoaWOk4mBkXxxg56fkZ1/d4WFio+HkGlocISBdIyGhIpyhoJ3h4B7doR8bXZ1Zn+UjoaIiIaHh6CqopaIjpd/eoGIenlvZ2t4fnyAdWxmXlpbXmpeYWdgWlBMTldSUUlQSkROR0NKRENARERCPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudW9md4J6f4x/gZCOipqapJyhrKaqrrCXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46EgIGMioKJjYN/in9scGpdQkE0Li0vLy4uMDIyMzQ3Nzg7PT9CREhJTlFSVFJTU1RSUE9IRUI8ODcvOUM+PDw2My5sk5dNUEhKTEtKTVVfXndjYmdsj4+Cj4iLg4aIk4ONi5mHnJyPn6aioamSp7Shp8HCrceveLmUmnyNoZ6YhJOFgo6hn5SZkYWKhY+akZZscHWKjIKVjI2Od4+EcW2FgYqWkYKFiHKIoJWGkYmNj5aktKibjJSigoeSg31/a2pqfIKDg3VjXmVgW2hsXW1sX1dLSE5SUE5MTEZJUENETkZCQ0VGQz46OTY9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcHaRhn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReYCSiJGSfYqEmJKQg4CAi4yJhpCHhImGeHh/Z01SPi8vLiwvLi0vMDAwMjEyNTY3Oj9DRU5PUlRQUFFTUU5QSUVEPjs8OkRGPz48NzUyPD9SNUhISExLTU5RXWmBd216dZKQjpybmZKZkJyQl5qkmqOmnKWop6izlqq9qrTGyLbI0M++m6Bwaaqpn4STkoWcoJqbmaaRkYiVo5uad3p+lJiToZOXl4GUnnt3lZKqsoiMlp58k52bjZGVmKOhpbWvnJGYp4aWj42AiGxzc32BfnNqYl5iYGJoZWBnZ1xSRUpLUE9JSkxGR01DSExGRkNCR0VCOzg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfGF3jX17k46Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYuOjXyKho+QjoGCgImLioWShYOGiYGAh3ZeYlA1NjAtMS8sLjAvLi8uLjAwMTU+QUFNUFJTUVJTVFJOU0xFRUA8Pj1GR0BBQDg2NjI8OTtGSEdJSU1OUFlpfolyjIKVm52qtLCdp6Wno6Swp62yrq6quK+xvJuxw6q4ycu3w7+3paKws6ysqqOLlpiEpaago5eBppmNoqqopYiFlKShoaqgpKmPm7CLlaOmt7qboKKvkqKcoZ2PoqGrrquytKGUpKmHmYiSiZV5en6GgWliaV1mY19kZF9nZ19bT0NJSFNORkhLRkpHRkZIQUtGQ0ZGQjs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGJXaW5YeYR2gZOFh4Kcg5GQjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkY6DhIGLhYaIkoaChYmHiIeHcW5hQEU2NDwyLzExMC0sKy0wLi40PkNBTVVQUlNVVVZVTltQR0hEPD4+RkhDREE3Ozw1Qzs9RktJRkhRTlBXfYuYf6WbpqCnt8C8pa7As6ivvK+0urK8sr+0ubmit8SntcjHtb24tKijs62wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqK+2urK6rK+1orGrsbW7trSttJ+mp6KmmaivrLG4t7enmrWoi6SNkJKehniChXhbY2ZXZ2NiZGFhZ2FbVEpERExUUEhJSURJR0VBQEBLREJNRz04Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtZUWJiV3l1cYGTfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomJeYaAjJOMh4SBjn+BiY+Gf4aIhoqHkXt4bl1XQEROPDY6NDZBQjc2NDAvNkNIQ1FbT1FVV1VcV1BfVUlLS0E/PkdLRkVEOz5AN0Q3P0JKSkVGVlNPXoqdp56rrLirr7jFxLG3wbqwsL60tb6xvK61c6+ypLnEo6/GuLCzsbOnpLW2qrCgopabopKlsK6mraunpJihrbS7oqiyurW8v8y/xcW9vbPBt7q3vra6t7irq7Ckr6isva+8usHBq5i5p5StjpeXqYh9g35tWGVjWWxma2ZXXGRZVlNJR0ZMUEdDSElBSEQ+P0JCTEA/TUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxRVlNZVVp2anB+jYSAjoVuenN4h2K5oZmjiZSUlpKUk42Pl5KHh3uGgY2VioCEgYp6fIqHhn2Kg4KLhJZ9eHp1ZlBcZEdFTDtRY2FbXlNHPztIUERaY1FRWVhaZ1lUYF9MUk9EQT9JSkhFRUFAQzxFNkI+SEdKTFNaVF2PqLGvtbLBt7O3xcm3ub+6tbO5uLW8sriwxF9zsKSxmp2qvKikqKuqo6KytaGqqJ+Vlp6YoK6lp6aln6SUo6ixtKiys722wr7TycnTxsLFzMLKw8C9vL67u7a0r7i2tsK5xb3Cx6+euKmhq42kp7WIgYF0YWRjX1ljYGpnU1hhVlJVSUVFTUpAPkdEPUtBPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0rL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhZBza3Jyc4fVwLWZoI2VmJmRjpeRlpaOhod9hoOMlop+g4CCeHuLg4d7i3qBioKXfnR9emxlcHVZXlxQZWRiYGVkXVxYV1xNZG1VUm1tX25fWGdkVFlVSkRCS0tJRkhISEdCSTpEP0hLU1RVXFpbkLS7tLmxwbq1tcfIt7S4tLe4sbWzsq20tZhjdKecrXBeoqybl6Cim6SeqqWUn5+Qk46VmJionqafnpqZg6SdraWqsK24sL251NHP19DKzNLMz83Kxr++wcm8wLzAwMTExMm+x82yo7qwtK6aq7e7mIB8bl9iXltgY1pkY1FcYFNRSkNBRUZFPEBGP0FIQj9DPDpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRW1lpX2+WkpCUbmtvdHWHtKyhoZ+LmZyZjI2VkZuShYqKfoiGjJCLiHyBg3N8ioOFe4l0gYqGlX9ze3lsbXV7aHJlaWxpZmpqaWBmaWlsWm1zlq2kvIiGZ1xvZ11ZWVRIS05QSktQS1NRSUxBSkZKT19eYWZpYJazwq21r7e5sq/CxLOut6+vuaqxsKWqtquLtaecmqaaTZmdjI6flpGmmKWVipOTiZCJj5GRnZuhl5qVloefmqebrK+psKi0tNTU1NbTzNDT1c3Sz8zEwcnQvcnJysnRxszNws/Rt6/DvMO5pLW5waKEcWVeX19aYllaZ1pRXVhOUEFCSEVCSDtAQz5BRz8/QTc7Qz5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlSZVZyj5CYgmdxb3h5g6GqnqaXjJqbl4uNlZGajn2Ji4WNioqKkId8hIJwf4eBhnuHcoOSi459cXh2bHB4fnF6bXhzbWmBcW1jam1weGl3fH7LvsHfp21jeG5jW2FgSlBSVU5ZXk9dXE5QTlRQVFRcbm12gnGVrLWpsaSts6irur6vqbOlo7elqq2gq7OijbCtmZeYjI6RkYSOm4GNppGciYOLhIuJhIuElJaYl5SbkZyXmZqfn6uspaiirK3P0tXSzszT1NTP1NHOx8PU0cbN0tPT1szR0cTR1sXAzsfHwqi9ts6efHFoYGRfWGFUX1tQUVRRT0g+QEZBQkU8QEE+REM+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFVRTU5adIaFindsd3B9fn+hnp6hjIyYk5OLjJOPlYV5hY+QjYuJiJCGfoJ7cX6AgYd6hHWFk5CIf292c2xzfXt3e3OCeHJrgXNyaXBxenlyer7Lmn2LsYR2coR2Z2FqXUNaWVtWZWNYY2pTWFxdYGNdY3d6fYuBl6ijo5+dn6akqa63qaWyoaGsoKKtoaaxnoimmpOSkYmOjYiBk4hqlaKMmYSBhn6Rg4OTl62LlY2UmY6GkpGel6iwoqGhpaSpyc3PyMPM0dXS1NLO083G1tLM1NjW1tjU19XJ1NrNyNfX0cqrwsLLjXVxZWJhWlZbVF1RS0dKSkpAOzo7REFEPEJDPkdCPkJCOjw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtPTEZKWHCAdX1ocnhygoqAnZWdlIWLlYmOiYiNho5/eIOTmIqMiIiLiH6CeHN7fYKId396hpGVgINud3Btdn92eHx0hnx6bYd2dG99doR1eHudtYw7QYrFpX6MfGllV0lDZmNlY2dqY213W15maGtuaG2AgoeRipydn5yQlpedoqOksKOjsZ6hpJyfqJ+isZuFnZGRkpCKioqGg4+Dfpybi42ChIV5lH+CqZWjjZKKl5KMfpiLmpKrs5ibnKicp77Dxrm3x87S0dLQzNLLyNTO0NXa19fY1NnYzdjbzsnZ2tHVvsrLtXp5cGdfW1RXU1xYRkdLSUVFPTo3OkBAQjlHRD9EQ0FDQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfZeRnYt+h5KDiYaEiYGHfHiFlpaJjoKHhYd6hHlxenuDhXV5hY6NnHmLcHxwcHqAcXuAcYOHgW6OenV3fHyCdX58hoevc1ipwraNkYJwbWI9XmhycHFwbnh2gWVob3J1eHF5i4aNk5GalZ+UhouSmp+anKieoKuaoZmYnaSdn6uZipmLj5GNhHuHh4OEi42fmZOIg4d+bJl6hJmGiJOMjZSMhnyciZSQrqqUlpifmaevtr2prr7HzMnKzMvQycPSytTX2dfY19Xb19PZ29XQ2trR1sjUypZ8fmtrXVxRVVRhSkNGSkg+QT49Nzo9Pzs9Rzw/QUFBREE+Pzo4N0RCNzU1NDc5LjU1NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw5OUQ+Q0dSal5tZGJma3aAiHGRkJqAeoCNfoKBgYR+g3t8hJiNh4t9hYeAd4J5b3t7hoF0eZKejqB2j3WCdHWBfnSAg2+BkIJvkoR1fIGFenaGe4m3xaTBybmBlpuPd3BlT2ZjgXqBd4aikIp4eXZ7g397hHZtk5aTlI6XkIKJjpWZlpWkm5aelZ2SkZainZiqlZCQiYyRgouDiIiBhY+RnZqZiIWLgYWXeoiJn5eQiI2Ji4J9oYmRjLyhmJOYmZ2ppqaun6i2v8DBucjKzs7EzcrR1tXV2dXX29TX2drb19va2djO28aIfXxqbGhiVllXWE5MRU5DOz09PDg6Oz05PUA2PT8/PD49PTk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM5NTU1NjQ1NTdISD1ESkU3OTI1O0g+Ozk6N0lQXVtSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9YZWFdW2h0enlsio2Sd3Z6int+f36AfIR6fYGRiYSFeoSHe3V9dG18fYZ/c36SnpGegpB7hn54j355iopugpqAdJmGfYGJhXx+kHqPqY6Pw6G9jJyjnX2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJGEiIqQkpSNnJmSk4+VjIuUnpuTn5SQjY2Pin6OjY2Kg4iSlpmenoiLlJGdkYGKf6WYiISNgYWEgaWGioy3mJ2RlZaip6Genp2kr7e6tazAxsrQyMfMz9PT0tjT1dfA19jZ29ja2tnZ19u4e3x7bmxoWmJdVFFPSURMQjw8Pjk5Ozo5OTs8Nj89Pjw9OTk7OzM3RD83Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDpEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODY4OT89Q1FTUlheVVhmbW1taYGOinFyeYp7en98f3uHenx7i4aCfXSDhXlyeXNtgH6EfneFnKGbnZSRf4yIgJiIgJySb4iohXqhi3yRjYOIhJx9mpCJjKOjoJCkr6CKkIuFi4GShldyrYufq5uPg5ibj4+OXIKikYKMn5OUi4aHi5KSi5OTk46LjomHlZmbjpSVkIqRk4V/ioeRjIqJnJaYoaGGkp2Vn4qJiI2bkIOHjn+Ch4akhYyRspidkpWXoaKfmZKcnaiyuK2mvcLHzcjGz83QzM/X0dHVrtbV2NrY2trX1tnZoHKAd2ppX2BaVVhZQ0BJQz8+Pjo0ODo7Nzo7OjM7Oz89Pjc7OjoxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2N6bWF+koNubXeLeHl+eoF8hnt7d4aEf3NwhYJ6dXZ2dISChH5/kqajn6WiloqdkJWXi4qnl3OKso2EqJKEmZOFmYyilZ+YkoianqOTqbCgkJSQjY6IloxujbeFmsTIspuhpZucmJaQsZFkpM3IlY6Gh4iPkoyMkZOIhImIhZWYmY6Pk5KGk5aDfo+LmYeNkKqWlqKhiJielpqIjoeXl4mEjoyBf4ePpYmOk6ial5OXmaGZn5mTnZujs7Wmo7zCvsjFxcnIycLL1M3N1KnS0dbV1tja1NLZzoV1g2tmYWBgUUtWXEJCR0M7QT04Mzc7PDo5PTY0OTo8OjgyPzk5MjpJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRKUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJlg0d1go58fG19iHh6fnqBgYN+dnaAgntsbop+eXx3eHyEhot+i6O0qKSrs6GWp6CmpJaVr6KDkLiVkbOajKGgjKSbr6OknZiQqJepma6wpJeUlZSQi5ialqDAjqPJuKuao6WtmZGbnLKdhoWoopyXhYiIjZSLipKOhoCFhoiRl5OLipOShpOXhYOQj5tzkJiylZajoIebmpOPipCKlpqIipaNhn2MmJ6KkJCcmpmTmZiflKCdlJ6bobGuo6S4v7TEx8S9w8O/x87LydKnz8zT0tDW2NLP2Lx1fXpgY1hjWVJJS09GQkNENT47NzY6Pzs8Nz00MjY2OTc3ND01OzU8Szw+OzxCQTc1PDs1Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER01cXVlKaGE7SISLentthYZ5fIR4gISBfXB4fH18b3KMeX2Be3iGi4mGhJOovK2ps72wpa6ztKmjorCtipq1nqO5pZWso5eprbimpKOfmamYqqSwsaqZmJyUlZGXoJeau7utyqFptriqsJWYnqOrkpe9o16psoKJiYyUhpB8jo18g4WNj5OTiIaSlYuOlYyKjJaYkZuZs5aUqp2Km5SRjJCRi5iaiZGdj4qJlZ+hjpWNl5mdkpyYnpShoJScnaauqKKks7irwsjEtbq9u8bIyMLQocbJzc3E19bQytSjc31sX11WYlNRSEQ+PENBQTc/ODc0PkY8PDY8MzUzNTU0NTRCMzk6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZ0hhYGJwSkCLiX6Ac4eHfIGJdYGKg35tfXx8fnB3h3eNgYd7jY+Mhoyaq8PAsL3GvLO0wb20rayzt4yosq6uvaubuqOorbm4q6emoqGjo6qvsrGrnZyjmZuYl56ipaWSo7muqL+7rK2yuaWjp32Ihp2tvLCCi4uKkIOPg5GOeoGGkIyNm4eHjZaMipSWk5CZlpunmbCZkKqcjpqPkY6VkI+Vlo6QoJCIlZujrJWWj5ScnpSgnZuYn6CUmp+op6Sio7CzpsDGw7Cwu7bFxcO/zafHw8fDvNbQzMTKind2ZV9dYl5PTENMQEVHP0E+Qjw6ND5BPT01PTY+MzMzMjQyQTE3QEJNPkdAQ05DQT1DPDs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGlGX2lnW11ck4yMiHuHi4aDjHWFkIqBbn57gX5xfoF6lHqSlJWYkJOWqLTGycDCzMLDuci9urCrubuYsra5ssCupcCjq7C8vaquq6Ojnqesr7WxqpugqpyinJafr7OnjKO6urXBvKuonLKko6iUhI6qxMOkgouOhoeEhpWUjHqDjJCOkaCLi5OQjoeXn5eSmJSWpZ+unIupm42Wj5GRlJWNkJSRjqGThpefn7OflJuUn6GapJ+aoJuglJiep6Smp6SvraW/w8KuqLe1ycO+ts6yxL7Du7PRycjBtXh8cF9bX21UTklETExMSkBBPUJEPDVBRDs6Mz04QjMzMjI2MkExNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmhdTWVcZlRjapqNloqLiJKPhol5hZOPgXKAe41/d4eCgY95jaGWqJqbmLq+ycjKwtLJy8LNvcGzrby/p7q/vbzEuKzBqayzvL6qsKqkpaOsrrWut7agn66fpqOYo7O8qZyovMGjtrevq5OwrKqsl4aaqqelkIKMkqSViYB1iZF5hI2Rj52fkY6Sio6Lk6KXlpqUk6GdqZ6QpJmLjo+PlZaIfI6VkpGimpSgopy2ppCfl6Wko6WfnqaYnpWXm6WjqKiisqyou7/Dr6Wzt8zAuq7Ds7u9wbmswsLBv5pxfGRcWV5dTE1OS0dFQ0hBQUFESzo0REg6OzQ8N0YuMTIzNTJBMjZTSE48SkJKUUVLQ0VFOkVMQjw3RVY9PD04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5sSl9YYVpkZViekJ2Nlo6ekomKf4iekoR3hX+Ufn+QiImQgJagmq6npJjEvsjEyMbSzc7Ny7zCuLC6vLS9y7vDwre2vK20v7q8rq+ooamotq6vqrK4mp6soqiinau3t6qlr77Esb25s6eqtLOtrpaVpa2poJGOkrHFp5SOfJGVfYeRmI+pmJeSko6SlJKknJKcmJOgoaGbmJ6XiouPjp6IWo+Wl5KWpJlmmaSfs6WWo5WrrKuonJ+ml5mWmJWipKimnrWrqbq8wrSmtLXLwbiqtqyzu7iuqLi6vLeEb3FdW1dYUEdLVE5LP0FHRERIRkY4NUZNOz43PkFLLjMyMDI1QjU1UFdOPExGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhWPD5AQkZCc0ZpSVJmZE1GppSclaGXqJWMkIOGpZKIgYeCmoSDlZCQk46aoZ+vvq6hyL7FxcjHzs7P0sq+vLaxu7u8v8+2xL64ubezs7azuLSsp5yrrLmrqaivsJijrqWopKW1wLCrrLS+w7nAuLOnuLS3sq+VpK2wsKWLk5SgjXPBmXyWmYSOlpqLsJWZmZSRkZmYpKKUnpqVmaecmqCfmIqMj5WdX0qWnJqUmaWXVJawn6+dn6WVr6+tppuhppSTmZiOnaCmoZm0qaqzvLu7q7Cyx8C4paurrbGxo6GysrSlc3JoX11RU01GUVFQUTtISkhGR0FDPTlLVD9BOj1GTS83NTM0OkI0NE5XTjxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NUZBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pVzw6QkNAPVJFV1N0YlZGSKqXmZ+hqK6YkZeHiqeWjoiShJ+HhJ2Xjp2gmqOltcm1qce8w8TJy8nIzM7Hv7uzr7q5wMLNtci7wbm2urKvr7S1p6Scq7S1q6qmrqyapK2mpamsur+oq7e3vsHAvriyssKwt7yso661rbqmiJqWpZt1vp+EmJyOkpiai66WoJualpSZnp+onaafmJmpmaCmnZePjJCdgm11kqKalZyin5CusqKrlqqrmKuvpaWhpaqSkpmciZWcop6WsKapqrq2vrOyrr65tqCjpqilppycrampjWZpZGJUTU5ISU9KVkw9TERNSUpAQ0Q8UVU8QUFCRU8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNDOjlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ7Zlc8Oj0uLlNhTFZIfmVeSEaslJuhn7uumJSei5Kqm5GSk4iqjYeinoyjrZSjpLbHvbTBu8LCyMnGws7Iwr66sq+5tcHDyrbGssG8tbusqa2tsaSjmaq1u6eqp6yqnaivqKSrq767qK29tLe+x7y2tbjAsL3As6q1tqy/po+ilpCgn7ueiZqfmZadnY+2nqibpKKam6CZp6SxoJqdpZynqZyXk46Um4qWiIykoZScop6hta+lpZOyrJqrrZ+fpaSrkpaVoISQnp+claikoaGztLq2rai1srKdnaOlmpeVmaqhnnhkYGJgTElHSE5RSU1FRkZCUUpIQERHQVZTREg8QUdRMTpCNzpCRjc5XVlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdEqJeknp7DrJuXpJeYqJuVmZqOqpaVqKaVrK2Zoau3xcG7v7jBwsDIxL/Nx7y+urKwuLS/w8i2wLC8trq3p6SrrK2hoZurq8Sipaispp6rr62iqqi+uKatv7C3t8e3tLm4v7G+wba0srWwvqSWo5WSmpOtn5ChoqSiop6QvqSonairnJygmqWfvKKXo56hqKqgnJSMlJ2TnYaOhI2TnqSgnbaspZyXs6easKmgm6ufoo6alqCFjqGanJKlpJqXq7G2squlqq2snJigoJKOkJapn5RpZlxjX1FKSEtPTUhFRElAPU9IQDtGSUhbUk9LPUhOVTRCRjg+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLTBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1NGPEt4ZmNYTqKbo5uexaygnqudnK2fkaKelqSgpqqrl7exo6qztsXCvcC2v8G8ycK/ysi2uLa0sbS0t8LGt7+xuLW6tqCnrautn56fpaTBpaGqrqCkqa2woqaovbWlsby3trbEsrO3ur6yw8C3uK20tbWjnKSUkZOgrJ6YoZyoqKqimsKsqJ2rrZqanZiln72hnKSXqqurpaCYjZqfkp2Ijld/lp6loaC5q6eTmbejn7OioZyxmKGQm5aego+gl5eOoqOVkKWusqypoqKlpJWVnZiLj5KTpJ+JY2dcZWJOSktLT0ZFQUdLPj1JQTo4SkpOXVFRST1MVlw5Rkk9RU1JOEhjXEtDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YVM2U1prV3NIRTY9dWVcTFCen6GYnsOnpaKzoJuxppKpo5+jn62pq528samstbLIw8HDs8LDvcfEvcXKvbCxtq6xtbC/xbW6sbC6tq2bqbCqq5yepqGowa2crbGcqaKusaqkqL23pra7va+3xK2ztMK/ssazurertbatqqKllZSToqugn5+ap6qur6+7saWfqamYmJeSoaO4oKCjka6vq6SlnZGgnZSdjpCMlJ2aop+otaenjZm1nKOwm6CdsJGhlZmVm4GSopaQjqCgk4ulrLClpqKdoJ6SkpqThouSjZyfgGRoXWlnS0pNSlNBQ0BJRzs7Rj45OU5NVV9SU0o+T15ePUhQQk1NSThOZFxMRUxSVFlbU1VPXGJIQT9aUUFIQUtBN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA7dl1eP1tVX2dyQDg8SJZ3ZUE0n6Sem5/Cp6OpsaCjtKmUsaqmoqSyrK2pu7OtsLS0x7/Ew7W/xL7KxbbBycK2rLWpsbiswMS0uK+ttrqlmauyrKuZoaeYrbu0nKiwm6yfrrSyqKu6sqe5tLeyucGqt7PDvbTFp76urbe1qaisoZaVkaWjoqKXl6Sut62xtLafnqikmZSUk6OgtqKkpZWtsbGlqKSgnZqZmZWXqKCfmaKer7Oipo2Yr5qlrZiboKeTnpCWmpuGl6CUjZCdnpOLqKmroaegmp6WjY+ZkIKGlomVn3pla15ta05RTk5UPUNBTkM7Okk/NzdRTl1fUlZRQVdhXUJJU0hXS0g6VGRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbY1ozMzkwNnBbYkgwNUpxaldEV0aMeWZDO6SknKClv6Worq6gqbWpnLevq6OqtLaxsLi3sLe3uMW8w8e9vMPCyMG6wsbCu6q2pa27rsHDuLirrrK8o5Wusa6zl6aokaq6qaGnsJ2qoK+0s6uqtrWsu6yzsrq3rLmwwrq+v6bDqrC3r6mrq6admJiqoKGgkZegsK6zqrC4mZuqn5mWkpemn7aopKKir7Czq7Gmqp+bn5+bnaWdoZido7SwnJ+RlKaboaqclqSimJuMl5qUlpeelImRm5mUjqmop5+jm5mbk4ePmYt9jJeGj5psaW5ibm9YUVJaVEFDRFVAOzpJQTc6WFBkXlBXV0VZX15NTFNOXkxKP1pkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPURGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtlQDE3NDdnWWFGKEA4bX1pXFY7iXtjQz2on5yhqbyhqq+qorC3qKSzsquhrLW9rrO5vbu9t7bBwr/Jw7nEw8HBucW+wbmwtqist7K8v7+1qq+yuJ+XrK2pr5ipqY6nu56lrbOfq6KxsLOsqrWztbytr7G1rLC1ssC6xberva+xt6ytqaKxpZ6lqJ6jlo+Yn7Kpsqmpspmdp5ualIygpqS0rqeirKytsKeyqrCpopueqKOelKGZnKi3qZiak5Kfmp+ioJKtoZubiJeajJ6anZSLj5eXmpempaOgnZaWlpOAkJWEe4+ThIyXZ21yaHFzX0dZZlZEQ05YRFo5SEI1Pl1RaFxOWl1IW19eTk1TWGRKS0NdY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtHREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVUxNTE9YFZfOClDM1lVXGhLNYx6ZkxApZqgpKy1o6yopa6ttaiusrimp7C3xbext7/Bwra1usW+y8S5w8G7wLrFuMG6s7Ssqrq3u7u+tauvsbeZmaisrKydrauPq72eq6+xo6mfsa2zr662sbm2qq2vsqi2sLS6vMqyqrW0sbSwr6ehs5+aqKyfpJWVmpmxoq2gpa+WoqSZmZKMoqWnsqmhprGrqbSlrq+zrqOYna2nm5eempqsuaOYlJGPmZ2hmZiVrqKgl4OWm4+enZmXkYqUk56apaKjoZmWk5KVe4yQhXqNi4OLk2xueW92fWFGYGpaSUhaXD17SkdFNkFjVGlbTVxhS1xdW1JSU2JhTEtFYGFgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4rQS9KR1BbRzNjWFRMRZqWn7CosKmspKOurbWotrK3o6yzt8m7tbu8wL61tLfDwMzHvMO9uL/AwLjAvbK9rqi6uri3w7esrrK6lpenr62opLKqlK+7pKyysqeno7K0sbKxtbC3s6murLKnuK+2tMPFtqm1tauwraqno7aen6exn6OUm5iUsZ6nm5+pjamjnZyVl6WlpLenorGzq6ewp62vtKykmKCsqJycnZyVqrmclY+PjJmdopiRmamlopmGlJiRnpyYl5eJl5CXmqidpKCSlpKQlXaEkIZ7hoOEjIxucXh2fIBcTGVsXEtOY10+YntHSThHaFdlW0xeYk1ZWldUWFVqXVBQSGFeX1BLR1FWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5JZzI3J0ZhTFYlLUIuPUVMUTwzcWpMRUSRmKStpKytqqWjsLGzqbavtZ+rtLnIuq7CvcO4s7K1wsPOxMDCvrW+wcC7v720xKmrurG3uMC8sK20tJ6hp7GupqaxpZ2xtaypsrCrqKm1uqy1srWrs6yqq6msqbmusrDHv7ikua+pra2mp62xpaSjrqOonJ2bmq6Zo6Kio5Csn6Ogn6GppqW4pKu0tKSqq6msrrauop2jqKqcoJqbk6S0mY+KjoiRo6GWj5Wfo5eWh5CVlZ6bmZaViJiTlZmnnaGfjZORjpB3fo+EfH1+h4qKcnRzf359XFNjbl9OWWdcRkSWW0c6TW5YYltOYWJPVldWV1RZaF5RU01jW1tVS0ZPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozRGU7NipIZEhKKzpJPzNDSVMsPo9sQEhJkJqoqaGor6SmorOzsLO0r7Cgq629zLuuwb3HsbSutMLD0cTFv8Kzv8LDvL+4vcWorbestLm9wLGss66ipKeuqqilsKOpsKqtqrGurqyrs7untrCyqbOpq6alpK66rKqxw7m0q7mpqaitqaexpamko62pqKKem6KslaSdl56ZrJ2ip6ihrKajray3sbCgqaKgqq6wrJ2ep6ipmqOYmZChqJiHhI+Li5+hkI2PmJ+TkoiJk5ehnZaZloeXk5OXpZydnYySkI2Jf3+IhHt3gIeFh3R0col3bF9ZYG5jUXNyXEs7hHxGPld1WGFZT2RcTlZWVVdRXGJfU1BPaFlXV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mzk4OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMj1eSzAuSWdERjg8QjA1RUtYMUCUXUFORpWWrKegqbGcp6iwtay3tK2qpKuqvcm8sb+5w6+xrbPEw83Ow7/AtMDDxLrBtMnErK+3rrO6wL60r6+sp6iqsamnqLGls6yqr62tsa6yrbO7pbizrKuup6ugo56xuKuqrbq2pLW1pKqnrKyqraCop6ewsaOmpaGhrJaqoZOboKaepKKqo6yinqaxtqysoaWimqmqrqqcoaWkpJmgmZaQmJ6UgoOQiYWdoY2MkI6ckpSOhY+apZuTkpuMk5KSlKOanJqLj4uLfIaBgoF6dYGDgX91eIqihnhqXmBuZldlh2ROQGeSTERieldiWFJmVU1WVlZUT1xdYVVLT2lXVlZISkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LjIsJjA3WFouMEpnQUE8PEMrOkpPXjREh0NKSUSWkK+koaqvl6inrbWqtbCqpKuqqLzBwLm6tLy1prKvxMnL0b/Bu7i/wMO6wrrCxK6ytbK0vMG9s7Kvraytp7aqpq2vqretp7CwrrGrtaq2tqe1t6uspKmpnKSetLOpqKSztJ+1raGqqKqorKefq6ypuLWpqaqpoamgrZuRqqGdoKSjpqOqnZymtK6npKmio5ekpqeqnKKko6CamKCRj4+Zjn+IjYeEnp6JhoyMkZGTj4WJl6Oajo2bkZKQj5KgmJqXjYuEf3SGgn9+eHWDf3t4fn+HnI9wcWZncXhcYXSIak9dmFZIbXlVZVZTZFBNVlVVUU9YW2JWSVBqVVdUR09YVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTIzOzo3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMi8yMiUvM1JjMDI/Zj1OWD9DLD9MVF8vSWw4UkY7lYyvoKSqq5mpo62usrSvqaWvqai7v7zBsrC5raK2r8jHx9DAv727vMO+u8TCv7+vsrOytr68wrGytKu0qaW1qaWtsrK3rqKstLGvsbmruK6prresqp6qq6CjobatqaGfr7KhtKqfqKeqoqqhoaytqL2uq66toaenn6yZj7CimKKhqKeep5uZqbCpop6roaGSoaKjp5iZqaWYmJmdj4uHlYh9joaEhaSXhoOEjYiRkJKGh5ahl4iSnpKTkI2RnZWXj4uGh3h0gYB8dHd5gHt1dHtrgoekdmleZWyBdWeIjHxSVm9eS3hzVGRTUl9NTVNaZ05NV1llWUdTaVJSP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaDozOF89YWQ/RjFDUFtbK0hPO1lEM4+NsaCkpamjpKKsprOysKiksKequL7BvLGpuaqnrrDJxsfQw77Avrm/wL3JvMG4sbC1srq8ucCztLysuayjtKamq7C1t7Glprm0rLO7r7ylra22q62cqa+kn6SsqqicnqqypLOomqunqqSonaKpp6q9qrSwrp2ppKCunJqzo5alnKWkn6WamqirpZ6aqKGbkZugpJ2Zl6mqkpmakpCLg4+Ffo+Cf4ifj4eBf42Ik5GRhoOVm5SFk6OOlJGLkZuTloeKf4Bxenl9fGh2fHp1cXJ+aoZ5hYhkX2djcoV7bWh5XV5VQVd7bVRhUFJZTExOcHRdSVpbaFpGVmZQQz5KT0RDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9O0ZdQCqNkbCYnp+opKKhq6S2sbGkqbCmrbnBvbaxpLmsqKiwwsjIzMK3vb+1uMG5yLbCtbWztbK9ubq9tq+5tr+sorOmqqqutLazqJu5u6iwvrK6oK60tqmrn62xo5ylqKmjnZulsKavoJ+rqaehqZujqKCtvKeusK6hqqKkrp6eraaYn5qhopyfm5mjqqKamqKklZaUn6GWm5alrIyfkZCRjIKKgICPgHualY2KfYCNiJKRjYuGk5iRhpSji5KRiJCZkJSBiX15a312eHhienpxb3F0eGuCdWuCZ2NnYm5zjm1iam9gb0BceWxVXk5RUktKTVRZVk1cXm1XRVlgUF5PSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNSXj4jkZasmJ6Xp6Kgn6ejt6+toa+vqKy4w7u0rqC5r6uotLrHyse/uMG9r7S/t8S3w7OwurGywLa7vrequbi+qqS1p6ipr6y4r6eYubujrb60tKCtt7Wnpqews6CepaanoKSZnqynqJ6gqq+noKaWoqifsbifpLGvoKuhrKScpqeompucn6OVnJuanammlpueqJGYk5mdk5mWoaqRm4qOkId9h3+Cjn18oY2NiXqEjoaMjo2GipOajoiVn4mRlYKMl42SfYV8c3B8cXN0X3h3aW5xcXBrgHRlemxnZWRiZoaAYFtyanJNTYBpWFpNUUxLSFBTUEdMW2BvVEZZWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZVxGTz1SWmdIKj8wXVw1KJWbppiblayenaGjoLaqr6O0s6mpucW3s66gt62trLC1xcfAt7/BubC1vbe/u76wrL6ws7+yvMK4qru6uKeotaenqq+qsa6kl7u1o6q6ta+esbivqaWnr7GboaSgpKOglpuvpaGeoqivoaChkqOkorewoaaxq5+ro66YnaqlqJ+Ym52kk5mbmp2lqZmbm6WVlJeVnI6TmKKpopGKi5CGeoR+hIt6jpeKjod7g4mEio6PhpCTmIyOlZmLj5d+hpeMkHqBe3Byd25vc153d2RsbGxraoVvZ3JpamVpXWRzgWBba3ZpWkp/XltZTk9LSEhTVkczOF5fbFBFWVZaZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVF1oRC48MmRXLDGUoaGWlJuqm6OhoqG2qa2gu7elrL3FtLCvo7awrKyutMPDvLO+uraws7m4ure6r67As7O5r7/At6y9urWlorKppqixqauwn5m/tKSntLWonrK8qailqa+rmaKnnKOllJegsaSZnqSpqJyhn5KkoKS4qaSnrqedpKGok6CpoqGhmZucn5KZm5afoqqbmpiglJGVl5qNk5OkqaSQiYqPhnqEe4SFfJ2NiouHe4KFiImKkYaXkpKLkJSUjY6UeoOXkIt3fnxsdHJsa3Ngd3RoaGpnZ3CHaGhoZGZpamBqY2poW2Z7YmBTdFRcW1JMSkdJUFRAISpoX2lNRVhVX2BMSkhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RoW0pXR1VgaEIzNzlnUCcynqKkkY6jp5mcnp2js6ynqrq2pqzDwbixrKO2rqetrra/v7yywbawrbK2tri2tq2qvbOusrG8vrevvLuxpZ+1qaSks6aorZ2cwKqnpK+zqay1u56pqaywpZidqZ2mpJGYpayhmJ2kqaGboZuWn52ntaawqq6goJ2doZWgpqCioJqbmZuSmJ2TpZ2soZeWnZSTjZWYi46Ym6mgkomKi4l5hXaBgoGdh4uDiX6AhomHh5GEl5SPjo+RkZGMk3qDlY+Gc35+ZnlvamprZXRza2JnZGR2gWNlZmZlampja3JbX1ldbGNhTmlYWmBWSkdIS01TVz45XmxoSERWVF1bSUpHRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVtMWkpWYmZAOjNCaEglNZqjoI+Mq6GWlqCWpLKxorK9tqGxxby6srGjt6yqram4vLq6rcCxrq6utq+yuLOpq7mxr66ztbq1sLi9rKaetKmfoLCiqK2bor+fsKOusa+3rrWera+traKZnaaopZ+Vmqeln5ikoqidmp+ak5yerK+muqiuoqGam56ZnqSapJ2XnpiblJifkqiVqqeak5qakoyVmY2UlJuqp46OioqPfIJzgYGKmIWHfYmKhoaLjYuThZWbk5KOj5GWjpB/gI2Og2+Bf2Z5bWdraWZwcmtcZ2NjdIJiZmdqbmxnamppbl1sbHJwYFRjaWNmWklGTU1PWFFQVWFlgFVBV1NZVEdJRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUExLSsuMzw7SzYwLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJjSRoZuNjq+dmZOhmqmxr564v7WgtMG7vrqxprewp62kt7i3tqy7rqyqq7eqs7euprK1sq6psLW1sLK1uaaon7SnnJ2ooKermqe9l6yjrrC1ta2toLGtsKihm5yjq6eblJumo52aqaKklZqfm5CbpKqrqrugp6SgmJqZnaGPa6KWmZxwgpWZo4B1kqmnnpSUnpCJmJqAloqikHmHlI2DbWp/d4NxbIaLhn6FjIdxX2RhZ4SYhWuKjZSSdHeLhH6DkIBnh4BndWhlV1xoc25NUGljZ3KFaF9lZm5tal1gYYqPg4RlTktEOUdUaF5KSFFRVVVMSFNhcHRlRltRVVBGSEVDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QUBAPTI4QEU9MSwsMDg9RzcwMS4qLiovNTY4LCMxJzIxNDoyNzZYgWwxNk9rW05cS1tmYj5HMVFkPSoui6SZhpWwm5qToJuqrKqjvcWuqbfCt728rae3sKSqorezsbKwuayppqy0pa+0o6m3tbWop6u2sq20rbOhqJ+yqZ2ho5mkpZiruZOlpa+zt62vpaquqqykoZ6coKamm5agpaSbm6emnZOenpePnaippLawpKOinJaYl5ejiKGOkpqGoIeSnKB/pX+mqp6SkpqRiIRzeI2OhYihdomNaZeJZn5zeKBviIeEfo99f6GgoJmAfYeec4aOdZuKbIeBg21pZWN6bHJhU4VtYmxpmHFYaXFviFleaVtsbFuIcm56coVmhoRaX0dOP0dfTkZSVlZRUVJXVWddTVZJUlJPRkhHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STkvMDEuKi4oLTQ1NzMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcvKIqnloOdq52YmJ2fqqmnqr/DrrG6vLfAv6qlt7CorKWytK6us7aqqKSwraW0spyutba0pqensrCssqitnamgsKefo6KYn6GarbKTo6Wltb2mraerqqyopaCfmJ+mo5mYpaKjmJykqJaTopuTk6OlpqG4pKSgo5iVk5eTnIivkJeUiamLlqGchbGAo6ydk5mdlHmC1KiAh5XBnMZ5eLGlt5dlgMCcv3mEhXqShH2QkJHKcpe7nMV6crWmu5B7gG2XsauweWhsWLGubmVpvJK8bmd6bnKP2H5Ta2O2sn6Bc5RzmqGqkFdPV2JPVk5GVVtYUVBTjV1XW1FBXURQTkVISTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjpCPD9BODpKPjUyKjIyQkUvLjMyLisvKC0vMTg2LSAvNDE2QTE9OVeDdzIxVGtcT1tNXmdcPkwxW100MSGLp5OBp6mfl5ydpayxqLDCvbK1wLW2vsGrprOsrKimrrOprrazpqeltKWnt62cs7G1q6akp7CtrLCmqZymo6+ioJ+dlZmenK2rk52in7O6o6upoq2upaGbmpmhp5+XmqefnpeepqeRnKaZk52hpqKhsaOfn6OXlpKXkpmFr2tqio2qfmaDlYatZHCdnZSZppRwrqGkfni7fWyhkHaxX2q0W6WAZZyQYWeDe2eAa3lrqWW+cWemi3WxanuxeHSSlGNubaduW4ShRWhmh5ZFdZxgfmd8pKeCWmCMq2iAlXh5aqc3Sq9cWFNsZFtLT1hgXFdWO06LT1dXL0lUU0pERkY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0wMy4zM0U0Li41My8rLyguMC46Ni8nJDIwM0IvPjtVgnYyLVZqXE9ZTF9nWTpNNV9YMzAbkKKVg62npZ6jpKqxt6y1vb6wtsSxt7rBpqiwqq6oqK+uo7C6r6OkrbKjqbennrKysKOloamsrquvpqadoqGvmqGblpSWmpuspJWaoZ6zs6KsnKOtraCdmZafoaicmJ6jn5uZoaakj5yimZagn6qep6ahmqChlZWRlpCahbWbtXiFqZm1mXaGs5u3fpOWlqmUf2uBpnuChoiTlJN3q2drsVyreo2GlHSJco+HgYGJkJd4goGLl4uDoI6DsHZ3n3FsbGx8i06kWEhiYpl+Y2imX3lydVOTh15RqW1jcX2GgGKcLlGhb1tTa2hgTEpcZVlcWkI+sntYWEEjTWhGQ0VBQEExOT44ODo4NDs5OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpARkJAQUQ8RkQ7MDIwMTtGLTAuOTQwLC4oLzMsPjgzMR8vMi1EMT08U31uMytYalxPWE1fZ1g3SjhhVTUwG5SglYezpqahr6mosqypu7bCsLvBrbi3v6msra2tpayxqaCuu6qgp7Oto6q0o6aysqejop6mqrGnr6eknZ+frpWemZSUlJidrKCZmaSota+iqo+qqKqbnZSXoKWnmp6cop6bn6KkopWbnpeZnaKpm6aanJuioZeTkZKTnIPVk5m5cLDBfsWGfNaUm7t8mpWlj42djaR7joikg6WDeqx5j51Wr3qIfp9ruVu6d4eEfqaClHuXeqp4jZ2PerFujoR0kbyFb5RQr6fFilGgemNgqmJzcohtl4hgU7W0yIWAiXxjpDNCnXZdUGppY1BAWGhaZGFKSE1xUVxRT1lmWkNFP0U/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDk7REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0g6YVA3MSWbopSYsqioprSqpbSppLy3wbC5v7C1tLqytKewr6KvsqWfrbWomqe4raKvsJ+ztLCgpJ6fpqmwqLOoo5ucnaqVmJeVlpOWoKmcmZanrbCpo5+PraKolp2Vm6CloJihoKGgmqGhp5qeoZ6UmJqmoJynlZubn6GYkJKUkJ2Ism5otXGrh26OpnK0c3K2e5qXpIuPnY2ifpGhpn+xd4OR0tJ2XK57hX+kb5uqpmuHhX2tfZiZjnuxcZKejnezZZd0hJ5vnmeUUciLWsJcoHliX6xgdXOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2VYQVBrYGxoUFZHSjk9VVJaV1hJRD9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT8vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWBMNjIwop2SpLGto6u8raa0pqe1uryyur62tbO5uLKktLKgsLGinquvo5emuK2ksbCctLepoKWeoamksaesqaOZm5mnnZWTl5eQkqGnn5WTpaqwpqKXk62gppKTn5ujpZ6VmqWmoJqin62ZoZ6dkJWboZ2cpZWdlZminpWYlZGbhax7d6h2o42IhqlvrYqCp4OYmKGKkpuLon+TmomuhICCs1xys1KufYKCo39y2H54hn6PnYaamXavhoeRnId2tGGaZZqCgpVtklqwWEuadZh5ZmCsXnV3iGiYiGtdr3eVno94bDV5yK6yX0JUb15nYEVQbWBwbVZWTS5mZWlTWVA7QkVATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Njw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0JfSDo5OaCelaC5sZe0wq6osqipsrq3s7e+uLextLq0pLeynrOsn5+oq56Up7WrqLCxqq2zo5upoJ+nobWmpamimJyUpKCTkpuXkZSipJqSkKatr6ahlpmpoKKOkKGZp6SflZmkqJ2cpJ6snKGcn4yTn5qdoZmZm5aXoqCTl4+mnYapfX2leKGOjYKqcK2LgaeGlp+hiZiYiKODkoiUq32Ai515b7FaqIKCiJ96dNmAd4h0qIGOm4ySpHuUj5+EerJenWSgfoOVbZJdq1tak4CRf2hnqmNxe4FrmIdzXataiaCOa29lT0pDoVxbTHRdYmdNW2FfcXNfS1c3SpyYWEdFPUhHQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANS47PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZIXkIyPzijnpmawauXtMKuq6ypprSwt7C1vrm4sbC1uqi6s5+vpJ2kpqaek6mvqK6otauprqGYoKCmpKO5oaKroJaakKGflJOemZOYnp+QjIypsLCnnpebqKagjJGjl6eqppSXqKeenqCiraShnqGMk6GYn6CSnpeclZ2hlZaNqpyPrm1ytHOpi3WKp3O0eHOzgJGko5Gdjomkh5B3uHCNe4uiamu2WqGFZZeXaaCip26UcrR0k5l+smqFkYetanWzYZ1mom+Hk2uXXa1gTaF8hpJSc6NreX9+b5iHcVyvVjycd2ZUb24uXKdPY1NrZWJtWWNdYXB7Y1RbUz49bnEzQ0JAP0w6ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4ppybnryhnLLAr62rq6e3qbeutb+0uq+ut7aqwLWoqaCbpaOhnJGpqae0orKnramgl5ynn6SruJ2irJqVmI6jopWMnaCbmJyfkZOUq7axqJmVnKypl4yTpZikrKKRlaqxo5+epquxmaGjkJiilqCblpyWoZOcqZyUkKqZh9SSmrtzsMOAw4Z+1ZabuHiIkJiMmIuMp4h6pLZ1fnd2woKasmCDunnAfXa4Y7WBjIepfZWBq6lxe390vIinoGmdYaaOr6F+jHWHq32+b3O8dLKDdHiBim6aiHFujaR0vV53fVphebxrWlZcanleamBmZ2NteG9ZXFpDQEB0QENHKzRHIic7PzEwPD83OkI5OT1DNDxATlpeYGBgX19aUFBSS0VGSjRITFJASk5FRk9CPUU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaibnqO9oZeyw7Ctqaqssaa3r7bDsLiwrbiurcCwq6OinaOhnJuQqKOqsqS0payknpWaqpimrLicoq2XlJ+QpJ+SjJyinpedmpGVk6+5sqyWmKSop5SQlqSco6ydkJ+oq56an6iis5+jpY6noZSim52YlaOYj6+fkZSpnoWQmLZ/j5GMt5V4gpOatXdta25zb3mQhY+KdJ/Bu72ae4GxqHCAc5G5g32Hho2HjXyKh42YfKS7ub2cdHm0o3R3l3Z0sHWZnmaHao22dHJxeLaMXn96fYlog3luemOLrHB1hX9YW6dqRWRaVGZgY15jUWdncGx1Q05RTEM6Wk0/SzI7LyA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JXOCpPXl09KzpWVSc+OzyonqGiwKWWtcS0rKqorKqpua6wxa2zsq21prS4rKmhoaWeoJ2Zk6qjrKqltaemn5uVoKOdrKS8paCplpObkKGbko+hp6GSnZeUmJWytbetmZ6kpKKLkpGlm6Sqm5WopKWbmaGopqekqqGSrZ6XpJ6Yl5edno+vqJObpaGNan1pmqV3hnJ9mo50eWSHe72+wLpvk4Nylohhc2taX5uKYWOIj5VrYICWZG6ed2OWbIGalZRlXmBicJmIaXKLfYaVZ2t/cnR4fX9iXHh0gWhQXW6DfXuLa1hreoJzSkpvhnBOdExFWF1nYUxbWGZjX09bbXVpcVJRREVNO0dJPU0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NfVjQpUF9MKDI9W08nPzI+qaCoosKjm7W7tqKspa6np7SxrMerr7Kqs6K9sLCln6KnnaObmZmrpq6jpLSppJuYlaCapq2ovaeopJSTmpWfmZKWpKmokJ6RkJidsLO/rJunnqeiiJORqZqno5uaqqCjmZqjp6yjoKyjm7GblKegl5Wdn52WsKSXoKeYmpCbm6Ghl6ShmZyZmZmPlYFnbX1xd5KYlJKGjLarjYeYlo6KjJiWh5SVi4STlJKJjpOUmZSYlpmfoZmak6CcjYJ6pYVta32QfYB1i4qBcYJ4eXZ1iX98iWpzgXSDdWV2fXdrb3ptX2RdcGhNWVpmal9XWm95bW1mVU9GUjlOWU1STygrOktCNjM1PUBBOjpDPjxFTlNTVFZXWFpaXFxgYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MTApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxKLDwtQLOhs6PAoaSysregqaWyp6WvtKrHqqyvpLOkwKezoJ2kpJyjlZWfqqasoqO2q5+YlpWfl62ppcCeqqOVkZqXnpiSk6GenqKnk5KaqaizxLCaq52rn4+Wlqidqpycn6uYoJqboqSvp6KmqKCvmJennZmZoJ6dnK+gnKCllJaRl5Oen5ShnZegjpaTioqNjpeukHyWnIOSgourqYWBmZeJhI+eiHqEkIiGmpKIh4qWj5uXjZCXnaOVmJKQnI1/jmehs6+FioV2e5KKfXd5em9meY+BgYlrdYF5iHNpc397doOGgmp1ZHpmYGplY2Rma1lre29pal1TTFBEXlRFQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpbX2JjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVFxRMDVOWzE3RTNbRzU8LEC0obmwv6yrr7KxoKqnsq2irLKvxK+pqqKxrbyis5ufpqKhnJiXp6WppaSlsrSelJOdmZmwpa2+oKuikJCdmZmUkZWhnJeonYSerKyjtMi0oKqkq5eVl5qmnaianqOqk56fnaCqr6qmpKyjr5ufoKCYpJ6cnpyuo5iep5KWlpuQopeWp5yalmWCknxlfo2akGN5jm1oa3uSpatqZZuYfWeGimVlaWh7jqKPbGiNmJGjd2tqipiinpdza216hI6IelhmXoaDXm2MioF2XGhzd3aRf4iCbXeBeH9zbnmEdHaJh46DfGqHWV5sdWVdc4lpa3twa2NfUk5XSWRYQUo0PkY3P0ZENzE8PT9BRDs7REdISElMTlBSUlVXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8yWUM7Py49paC6vLqvrLSxqqWora6wpq2ssLuwqKajrK2wnqyWn6OdopmZpqqcraOlp6iyrp6Uoo+ir6W1uKWtoo6NmaCZk5KboJmZpZZ8pa+jqLXFuKWip6+enJSeop6jm6KoqJGeoJ2hqrCrrKSroaqbp5+nn6uWoJulr6OWm6iVn5yakaKVnKmXnX29g4hytHKEnYataHi5xLhxlKOjeqaZmXKrgnzLwMC7cYyjiIOefJaYiZ3AvYGWnZ2MnMHBfIJ8k42aw8B+bKWyb4yBb8p6f5t2kIOOgXV5gIB5cXp/h3B3hYyTeW14lGJnYHhkX2WCYl5zZ2xkZFlMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5RU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAuI0ZbM1BZL1VBQjsvOJajucO1sLDBqqiUo6+osK6tpbKzrqmkpaWvq56qmJqin5yaqqahnauipKikpLSknKKSpa2rt7OnraKRkJicpZKQoKGYnJ+diKetpayuwcCxoamuqZaSnp2hmaGiqaOSoKCdnqyvq66npKSooaalnayokaOaqKypmpynmqqflZajlJ+hlZt+zpR4eqSBeZWWm1+uj16OqIKjoXynlptzq4OAr15jjap7qIeFoHSXk4izY4KrhqCNjbNqhK91fZeIt2KDrVqjzW6Qdnvae3+ZcH2IknZ9ZXqHdnZrfIdufYWQkX5tg5BgcWxwaGBfeWVccWdqZGdgUlRSV11LT0Q1QUhERDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaOqqK2zq6WyqquqoqumrqmfppuZpZicoq+foJ+op6OloJ6wq5qdlaatq7CqqKuflJGan6SSj5+ll56no5+vpq2xqcDHs6ipsa6Wkp2boZefqKmelKCfnZ2tsKmsq5yoqKWiq5KrspakoaqpnaKlpJ+un5GYpZeemZKTkJegcYWMl3WFqIZxsX2ecqx/op+BpZCfdquCfa1/nHOtf6yHhp92mZJ7fJd+qoihi5GLnX2re4mVkKCBe61XncV7j3CTwX2BlWx1cIxtZXZlhW9hd25yb4mKko6DbpOSZnB1dXFhZ21mX29oaW5nZFdUXWFaUlNDOUpJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwoPTEpM1dARiEcRzpDMS4rsNPGxrKzn5yijqOioqyutq6osaWoqaatqqqnoaOdmaKVn6Wrn6Gln6ioop6dsKyXmpapp66rqKannpeUmaOhkpShrZudp6OvraWutqu6zrGtpq6rlpWcnaKYnq2rnJagmZ2fqbOrq6ucraulo6yarrGhp6utpZekqaenr6CQlKKimJOQhKRqpHWJeql0erJwgqaKmYxxiaCahqRgYVKshX+ug5t2rYKohoWfe5mXhXpmgKOJpJiGgqN9qX6BloiuX3ypVp6jkoF6o5+Ae8OuxItyr7OzuXFiqa/CdGiMjJiOgW6clXFvenh5cGxmZmVycGZ9amNdV2BqWFlVTU1RTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU1KjJQS0wjIEE5RDQsJ8PJ1tS/oZmrp6Cuop6vtLCuqayip6WpqqqopKagm6Senaanp6Ocq5mirKGjn6+hnZqSq6S0rq6gp5qdlZOmopGboqigoKadsaamqbKtt8mytaqrqZaRnJyimJ+ls5yZoJSdn6esraWwm62ro6OqobKtoamysKGZqKesrbOhkZShpZaZkHupbJ6Eh3WreXywb4KljImflpaglYHSuLS3yYGBsl9glKmDpYiHoHqZlZp4qsl0maSUqamQkpuNgJ2KmsbGeWehgqV0gZ+Ogn2vXW+0YrB1S6OHbadHgpNkjpCeknxxmZWBcXt1fnxuXGZqc3FmgWtfYVlkblxfWUlNTUtFREFCPkE8Qj9JOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2osq2spKKbsrisqqClmqikqauqp5+mppiqo6Cvq56loKyanqmlnae1nqKXk6mqtbGsm6ScoJSPpayRmpyno6Gqp66ipqiqsbXDsrOqrKiTiZecpJqho66ll6GVmZylpq2csZ6uqaefq6K2rKCwuK6dmq2msLGwopKWpqGYno2CnU54moF/n3qEo32DpIWHpp+dn5SEuHt8ebmCf8zGwrZ4m6GRi55+mpaXinafl4qll6Spf7CFnYaghKx9mpVjpm2kcI+FkIF8loJyrGCjcnCAmmC8fVJVdI6So5Z7fpSTjHZ7c4eAcV1tbnhyaoJvW2Rfam9jZV1LTVFUQUlIRkk6OUs/QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVllZWltcX19eXV9fXFpaWllVU09IQDg4Mi4sKi4rKicnP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eYqaukqriqrqCboKyys6WeoJWlra2tqqecpqebo6ihs6+jqaeyoJiopJSitaKilZeiqbS4o5uhnKOSj6GxmZ6cp6ahorCunaapo7azxbCtqaypkYeQnKecoqScpZaemJmapqWrnLGir6WmmK+ku62htbWsnJyzsLavsKSVnK6eopyFj9G1w7d5h46FkZOQgKZ5lKF3jKCShKWCinGqhoW1bnJpmqSclYqffZiZhoePc6+CppujjqaLk52LlZCbbnGyXaV0k3qcbJh/e5l8balhonFxfp9ic7K4aHePlKaYfY2OlY56fXmQg25qeWl6c2+BdV5lZW9uZmhgSltYWDxISEBVNEBGPjwqKTYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYF9dW1pbWFVSUlFGOjIyMy8vKysoQFFSVFVUU1RWV1dYWFdVVVVVUU9RW1UlITJBSCQpJZJzjIqtvb68ubSelqekrbWhoZiVo6emrausmaajn6ahobaoo6mnsKOUq6OOpa2jnZCZmqqzs6Sco5yokZSXrp+gnqeknaidtpqjq6S2rcSwqaupooyEjpyioKailZmZnJmbmaemqJmtqK+jpZuspr2slLyvrJ2hrrC3qbCkmKevoaaWeaiQfXywd4qApKWInG2ycKGHrXyhj4OolZiArImFroWglaqgopeGn4GalYB7kn6rgJ2al4uqd52gkoqUkoF6r16kgX2mp2Sdf3yXcmqvXaRqcIaZXWBbjKBtlZGmmYKVj5qOfHyEmoBrboBjf3RugHpgZ2Zxb2loZ0NaYVs9S1UzVThCQkM4JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pXU1BPTkk3MDQyLiosQVRWVlZUVFVUVVVUVFVUU1RWV1dYVlVVUUhGSUojKCi9kpqDqMXBtsCznpqsoK23paOOm6SioLCwq5+loJ6tmZ+5oaOroK+pmq2hkKuopJaJm5CtsKymnqWbrZeYj6yhoZ2loZqlna+Zoqmnt6rBr6WopJ6LgI2bmp+mnpKUmJqUm5qmpaabqqytpKSeqai+pZbBqqmhoKqwt6mrpJ6yraaol3WvfpCLnIWHfrqtipllsI1lla19oY+Dp5WagayKhLCFppqkoaKRhaFdbGuBs2B/rXt7g4GxbWdumZmNibFbfrVcpIRryKJkn4B7u1d2tVmyfVKugHqsV4ChbZePqJuMmJKamXx6kaB/ZHV/Y4Z4dYF9Ymtocm5nZmVQVWRcQVZgPkkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUVJUV1peYGBgYWJeX1xbWFVQTkpHQzU1My4vQFVZWFdYV1hYV1dXV1ZXV1ZXWFdXWFlaWltcWFdXR0I70p+ysba9urPBsqKcrKaktaigipqgnZyzs6qfpKGetpmhtKiqrJ6wrZ6rnJWvp6GOiJuPr6uopqGlma6SmI+omaKdpZ+apKOmmqGjqrOqva+kqJ6djn2Lm5WgoJmPkZmbkpqYqaCjmqmuqKWloqSoup6fxKWjp5+psrOqrKSduauqq5SAqZKjr46bgIekl5mQgoC4w7qDjpyThKeXnIKsioKviaecm6arkX7WvcKqYqS/vX1+o4KD17u4tYaWlISevb6EbaOCb6uEbJyAerKwx4Npq7C8rHd2ob68c4CWjqadkZySmqB7g5OefGN+e2WPZ3qDfGFsZm1rY1FhW1NqXEBVYkNOKT06NC8fHyQfJTIgHSQoMDQ5NjY3ODs+QUNFR0lLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz89QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVs7Owv7ixvLKinK2mpbKmnYuYpcCquLKoosCnqLOdn7Kduqifrq+lppWUsKuXjIKbka6loqygo5yqn5eKo5Onnqecm6GppJmgoqyuqrqtqKObl5J8iJmRpZuSjpCXmY+Yk6maoZmqqaGqp6CjqrqdqMOin6yhqbCyqK2nnrilrKyZc3aqpLiGZImgcGiukYuQbm53pJCZn4F1rpmUcI+LcZaopJuYr6RzbW1tZot4b26CmXCBempxaWeKmJaZcmlqhYhncYZkXYhiam9ZXGZ9dqZfYXCNkG5lZX+Mk4+hmZmak5mhfYmRmHdmiHhpj2x7gHplbWRobWNLZFhKa1o7UWZGUSdLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRGSEtMTU9RU1ZcV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXV1dZXV5eXVxcXF1eXV5dW1tVV16playzqLm4sbOqqaGtnqOyqpiSv7PFy763q5/Bra6koqmtoLqjpK6sraWNlq6pj4uFlpasnqaqoJ2ko6CRi6STp5mpmpekq6KXn6emqLC7q6yam5KSfISXjaWYjZGQmJSOmJWolaCZqaObsKadoqu5n6+/p6OxpKqur6irqaW1oqy2lYqhqaa3nYmWo5mIqpuRlZ2SqbOZmqKqoLKWoqGdn6KdoaWilaynjZOTjYeTnJyVkZmTmZGPloaBpZuZlo+MlJSMkIeEfmeJfnSCdXOHinCnbHqTj5ORgIGNjpCPnZWil5qZpYSJl5F0a5F3cox4eH16am1mZXBlVWBZQGpbSGRiUFkrRj0rJyE3NTAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFVXWV5gYWNdXlRRS0VDPjk9QEFTWFtcWldYWFhYWFlYWFpaW1xeX19gXl5eX19gYGBfWVlgppapqaS0ta6uorCjrZ+gtbGQjazIvsa7uqujpp+dp5+yqqS3p52ptaenkZitoouHiY+bp5WspJ+ZqJ+ekpSjl6iaqJqVp6KkkZyomqG2u6eqmZqQjXyBlYuglIqVkZaQj5SXppGgm6mgnLWjnaaqtqeuwK2itaStra6qp6awtp+supiRpaOntqKSnqegjqqgjpOfo6uwmqCjsKiwl6OgnKOqn56enZesnpOaopyUkJarmo6ZmZeRl6CSiKGel5WHk42RjpWLgX5li4V1hnR3h4JznGqGjpKTj4l9i5WSkpiUo5SfmaSFiZuKfXSXdHyMgHN8gGpvZl9xamBbYFpuZFBhZlFaOkdHRT4yPT45LyomKykmHSYzMTY2NTg5PT0/QUFDSUpHSktMTVNTVFVaYGBpYWVWUEtBQ0I6OUVNVlteXltaXFtbW1xdXV5fXV5fYGFiYmFhYWBiYmJkYlxbY5eVo6air7GrrqOppqyfp7WqkJCdpLW9sK2to6SbfJ+ks6WmsamXm7imo5SZqpyOhoqJnKKPrp6ilaifoJKWmZuui6qWj6qaqY2aqZCfubakpZmcjYh5gZOLmpOKlJGTkI2Sl6ONn5+onp+4on+DrrWirq50oruhsJ52eJ6nr7iTdKujnol/q39kXGJ2oI6ln4SYfW2Ss52ipq2qo2Wdn5JzeZqXcYGZqZhtf6OoimWcpp2Sl5iWjJOdkYaem5GWhJOIkJCSiYV3ao6GdoVweoV/f2Boh4qTkYpadZSQZ2iPj3N8qJycZnubioV6mWqGjIRweoBrcWZgd3Bsa2lcZmZiY3FUWz5OTk5TRz5AVUQ6MS8eHyY0OjMwNjY3ODw7PkBBQUZIQkdGSUtNU1RVWVxgaGZnV1FKPERHPDhVUltgYWJgXl9fYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaWioK6vq6uppaitoqatpZKVq7exs6ebrKitmHSNn7GgqKunlJe5oKCPnKSekX+JiJuejKuZopWnoZ2Ol5KdhXatj4mnnKqSmaSKnLuzp6CZmIuIdXeSjZaTiZORkJSMkJShj5yhp5mcsZWBjJu0nLOMko25pZ99p6J5oKy0f42NpZ6Di4aQsaqvjYuXpJt6gYushZyeoaaop4eVhZh3pZt6h5yBl6eDgnuds3qKhqGYmpWYloKRl5eEm5pjeoeRhY+QkouDbXCOh3l/cH+AhH2Fc4WDlJF3lmiSdKCadH2ZhKOgiZh/lY6HhpprkI6HbHl8cnFoZnlwamxrXGVsamd1XV5JVExSQEU2LltVVTcpITA5Pj43NDM0Njg7Oj0+PkBEST9JRUpMR1NYW1lcYmFoZllRSDlFTDs+YVZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJeinqWsrKunrKCnsKamqaaZk6/JwLKil6iqt5+RhZ+tnKeioI6Qvp6ajZ+aoJB9ho6Zl4ernKKWoKGRjZOKhYCSp42Ho56llZmeh6C6saeem5KOhXB2kImVkIqUj4+bi4+SoJKYoaSWnquHn7SJtJmtisqGqKyItoWMr4Guq4KojKaYjZ19qI9ze3ecj6eXaJWkebSLoJ2lp5KYwoB/q4iYoXKegJqlfpeFlbOBoX2hlKGQmJeBj5Sci5mSjH2Fk4eOlpKKg21zj4V+eXGGgIN7g3SEgJWAj8Vmf6mHj6NrnoWknYWagY+RiYyacZCVhmp5dnx4aGl2cWhobF5kcG1nbllnR11RTTNFNTdOYmQ3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TkpKTENQWl1cV2Jeam1cUUU9S01ASWNYXWNmaGdiYmJiZGNgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSWoZ6vpqeopaufpLewqaunmpWgo6WspZimrLmksIGiqZ2mnp2KlLyak42hkp6PeoSWlpGHq5mbm5qihY6Md5qcj5+QiJ+lnJiamYijua2kmZyNjH5ibY+Kk5CNkIyNl4yQkqCPlKCgmaGnfqGnh62dn5Wtj5ybnJCEf6CMqKyFo42pmYyaf6J1gZmUa4Ktdk2reIeNnJGap6aAqat9g6F7eqdqnn+SbGeYhpi3iZ5+bmBkWYOXgI18ZGiLcpl9eZZsXX2Xbl9ScINcX2t4gl9YZIB8g3+WcKeqa4OjbnKlcJ+FoGpnoG1ccI5+Z1pghIFjWFFwd2ZudnRsanBfa3FubGpZaU9dWEY5QTVIRV9sNSxJRFJNTj04NDg1OTs2QDs7PkJQPlFSTE1CSlxdX1ddXmN2YE1EOk1PTlRhXFxmZmlpYmJkYmRkYmFiYGNkY2FjamtkYmRkZ2RiZ2VhY2iXlZyfuJ+po6askaG1u6quo5mYoaKlra6hnrC2pKmToqGgp5yajpm0mpCLnoyVi3WBlJKNiqeVlZmen36ThYWspYebkIuaqpmbm5KJprGnoZWaiImAaW6Ih4uOjomLjZKLkJOjjJSfn5uhpH+TgY+ioJOgdpyUjqeBn6V+haeqgqV4iXyEmn6icHOUiJZ8n415bYabjJmPmqiZjoede4Kic3amZp5+d6RfmHp9lHSibpi3tLp0k4iDgLWoZIHGuHtwlbaMcoCao2NzrKtgfGmds35tfIaBjYKLmHF/o2xyo3SfhYGkYJ2atJdzfZifs3V0XJ6yg2tjcHV4cmlwWWttdHNnXWpeYkxFPUQ2UkJaczM9U0dgSlI9PDM5NTo6NkQ7O0BKUD9VTU9RQEVfX1taWGBgfGRIQzhNV1VXYmFaZWZra2JiZWFkZGBhYmBkY19gY2tuY2NkZGhkYmdmY2hok5aUoreYqpuTn42kt7StrKCaop2kpKavnZyzr62UmaKboaWam5Weq5uLiJJ5i4VxgZaOipCgj5KUnph9kYqOqKGHl46KkqSVnZuNjKmopZ6Pl4eEfmp7hn59j42Ci5CQiY+UoYOXnp+cn56LiXecmKGMn3Ghioaph5qjjZSlqHytjH56oJl6o5N4gXSWiI2cfZafhpuOmJqlhaJkoXyIlpCbjW2eaJuOb5qZe4CLp35zaXSrg5+DdKpolZpdm4V2hZ5nqmuAuGZcqG+BnGCVjF6ndnWHiH6dZ5p1hpOSl46An2+akW+oml6pf3m8bH+qXI6EXbRoXW9ye3hsalxxa3p6ZGBnWGJCUUZPN1dEUm81S1tbX05aREAxNTE8OzdIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TlxeWWRmWGZnbm1iYmVfYWFfX2BgZWJeYmRvcWBkZWVrZWNpaGdraZWbiKmzmqaIY5Sbq7qxsKyeppycqaCfr5yesqmun5ilnKGgmZeWoKOZhomNaomAcnuXiIuWloORlJmQeouElaScipWPho2fk56diZCpo6CajJKKgIBpgYZ4f5aMeoiOjoiPlpt/k6Ken6CTmHJon4mejotwkoyAqYaXnaCknqV7sK2joriXd6Ozo6SAiZR5nXurmX6ijpyaloiXcaF8hY2vtX1rmpGheX6ZtaOkq6iEmXybfZ6bf3SqWl1ve5aLeJ5iTH97eoVjeZdCTJ9Yomlxe45sgIiDmXWbeIaJsbN/gJuTp3eDnm50fpVwmnRrpF6VdkhlZGF0cn9/b2ZhbGl3fGVlYlFfV15VV0BaRlFoRVRXXWJYXklEPUI4QEE6SUY4TEVYQVdSW1dERmJcWmBLYG19ckVCPFVfYlplaVZnaG1vYmZnXmFhXF1eYGhiX2VkdmxdZWdma2RlbGlpa2mTnICvrJiDU16gprO5srKpmqOMnKycnaqVoq2lo6mQoJ+dm5qWmKGdloiHiXeGgm95lYWRm4t8kZOXiHKBiZGhm3ORkIGJmpahnIaPqpyblYuLinyDbISFcYGhi3iFjYiHk5mWfJOjn52iiK2GfbWEjZ2ce6WVeamAlJqOiJ6ae6dod21+mXShc3J8noaZcJODrn2jg6WdmICjb16oZ3WiY2+lYZzTkH17mXhzdGKihpF/o3SkkHZrj7OMYIKYiXOqsqi8f3eDbX6/pqm0XZxte3CWbX9yonFdpGdzpmBopm2b1Jp9hptwe3uYbJx9eJhzbqmkZ2FmenKBhWxoZmVvd3hpYWNTXGdSUmJIWEpVYVhUXGZrXGVRRUNLTUpLQktFOE9AUU5YU1lPU1FgZmVqUmR3eXdJRkVjXmZaaGpUaWhqb2NqZ2BjX11dXV9oYmFpZXxkXmRnZGtkamxmaGxol5p/r6tUW0p+qa+xs6+yo5uZhZmqoKKlj6apoZqri5uZmZSZk5OhmI6IhntwfYRofY+DlZuBd5GOj4lvf4aPk5Jsl5R8ipOUpZeDj6ublJKLhol5g3aIgG6Bn4Z3gJKGiJmjl3qUoqKZn4mzoaK2i3msp6SupW+of5mNhYCZj3qkf6GZhphynoSkrq+Kl4yAjaSNlYKtoJN2tba1yaFzlIuBn2Cel6ltepWHoZx1ooh3oH6TmIuBcE1mo5JwmodzpXt5dGGDgWt9oGtxZF+ccX1zlmh6abO1s8amcph9ep1rnJurdoWbbnh5mGqafHaZc1FFfbNfandseohna2hjdXZxb1dfVFlpUVNpSldNWVRWXmlsb1ZnV01LQUpNS0hLT0JRS1BlY2ptZXRyc395fG51iXt7VFFPbF5pXGtpUmpoaWxnbGZjZV9dXV1eaWJkaWt7X11kaGNqZm9tZWlsZaCbh66lg2Q/k6Gyqq6vtaKikICYqqKjpo2mqJ+ep4SbmJeOl5CQnJOOiIN6anmHZYONf5igeXWPiYyCaYSFkYOMhZ2Neo2Ml6eUhJiqmIyRi4KJeoB9i3hwkKGGeYKVh4mWoJV/lKSmm5WVg2ZueJxsomR7cKV3m5dwZaaAlIl6pHmfloOXc553gYqVl4+5bpGKomJ9mKCUiG1yaaprdaBtb6Zgm2mLkGmWh5uWdaKBfppgjIaNdW+IYmigZZ5+aZt1b2NmiIFtcaJZXlpioWxdiItten1zcWSlbXiiZGenaJlzjJlwonBViZBwoGBmqFWLXlSYbm50bHODbnFpa3l0a3BSWVdXZlpUbUpaUF1JWGlpc2pZa1ZRUkZWXUxYU2JVaWtfeHR7fXB8fHKDe4Bzdo2AhHZeUnJiZ2JwZ1BqaGhsbG5oZGdfXV5dYGpiaml2dF1cY2hjampzbGZrbWOco5eleWRzbIqmraOpsLGmn4yAmKyen6eNo6KcpKOBlpmUjpqQjJiQjop7h3GAiGiLi3yZm3N1iX6Qe2WDhpSKiZWagnyJiJiokoGjrZGGkIuCin6AgI5yaY+mhH2Hk42JmKCPh5OppZyIpniVm36liJaKsZedj4Kulp6kdpOFeKlzpY+Emm6kooyShI2Du259pa+DhoWGk5Wbn3ylenKolaCWZ55+b6xkloqWk3eobaqigYl2iYN4q5GmiGuRsGt2s4ypa4qFbW2fnpGUX32ri6p2fX6KpJ12n3yDpJWdoGqbiHisaJ+ujLZ1eL6NpJNag6eOq2F2c3VyfHVxY2t/b2htVFdbVmFiXWxNXVJeSl5tb3dgW3FZXGBbZ3Vlbm9yYnJ0YHh6fnlyeYNzhH6Be3uMgYOAdmJ4ZGRuc2RSa2dob2xyamZpYV9eXGFrYmxsem9cXGJpYmxqd21nbG5ilaSpm4B/naOWqamdqKatpJmKg5ism5+mipymnquehY2bkIeckYaSjYyNdId7iIRwjYV+mZN0dIZykYNuf4uRh4WUj318g4eZp4+Ap6ePgY6JhZV2goeSbmyLqYCDi5SOiZyfiYyTqaKfjn90k5eIfoF4k66ifoGacI+Fdo6Jgn17cqeMcX59epiWm4SQeXt/foeUlZOKdpCYnaCDe32Ja4yFW3l5cnpxaW5+kopygHWBj5SUcYeEg2WMf2CBgIt3dXOUdW95bm2HbIOGXnVnd45lf4CFjKeZfXR7lWqJiHCBdn2Hd25uaY10enyYeIVcbFh5j2lveHNzcHh4cF1sh29qaFdbYFddZmtkV2NVX1JgcHl5bWt3Z2pra3d9cnN1c2FvdmJ0e4J4dXmCdn+AgIF5i4WDfntuf2xkeW5eVm5naXVreGppaWVcYFpjaWVscXRuWltibGRsbHluaGxvYY6TtqemiqChmqajmKWcq6KhhISYrZKeooqbqJuqmIOCnIx/l5SHjoqJjXKDfI99fo+Ee5iPdHKEcZWFe3yRi4aGkIV5foCJm6WOfKihi4WPkIWVgoaOmHZyhKmGjpKdkImfnoiMmqaen6qDiI2Vmn5+iJasp46RpY93bpuOgXiQbn2ohXF+lXFrcH2CoI2Ak46LaGxcgouLm5qejnOVi4hxdGuCd3SBWXJuh5GCfn+MaV1qZXuGhIqAYGl5e5t7gouCdYGFgWd3ioZqYG9xgHVecYmAiI6lk4Rli42DbneLhHGGj3pxaGlmfYR7lltda2hudlx8enh2b3Rzg2hdbotsbGNaWl9aWW1yXGBiWl9eZnR/fHZwdWRra2t8fnN8eXVkbnVobXx+dnp8e3l6gIF+b4WJhHt9dH55c39pVFxxaWx2cHVna2dkXWFYamhra3FybldbZW5sZ3N5b2hqbWCLiqivoI+ioJmenZeemKijon6Dma6OoJWInaORppWAfJmGfZKZiomHh4tzfoGMdoWLgoSXinJvgHKYhoR+kYOEhoqBe4GFjZyhkYOoooh4jpeJlYqLnJeEg3mtgpGYmpWKnp2IiKCpnqGho4qHk5ucopmVqaCmpJ6RmoWTi3l2jI2Dp35/kpCTlJ2yppuVn5CNsZKXg6SLjJSan4mQm4KIkYprfI53eGWDh5GLfImehIeMkYmJgYWFkHd8enSaoImGip2JhJN+fYqAf3Ruc4SBfXaFhomOo4+ChIyGgoyQjH2HjIuRhHpuhYZ+eplrc2lhdItxfnt3d3B3dYJdXm+HaG5hX1pdXVNpcVZlXV1ibWh2fH10b3Bla2ppgH1ueYByanBxbWeBe3OCgXh/fX+Fem2CjIZ8enh7fXqEeU5kdmpzbnB6ZWtlY2JgW3RlcGdycW1WXmx0bWh5enFnaWtkjIecuJ6WoaCXlJiZlJikoJ58gJqsj5+OhqGdjJ6WfnmVhHyOmoqHhISHbnmBgXOBiH6JlIRta356l4eEg49+gIaEhn2IhY+cn5SIrKCEc4qQhpKRi5yRfY16qoSOk5iXj5yWh4abpJ6hmZyFgpKamZiPmaafpJybj5V+jod0eoWNg6V7fY+QkYaYq6GelJ2QjqmNkICdi4iTmZ6Cj5d+ho6DcHiGcnVgf4SQhnWNmYGDkIOHhX+GhZVueXZ0kqKKjIWahIOMc3+JfHtxcHqGgnp2iI2DkaSOhIKOgIOKiYp3homLjX5yboCCfW9pbG5oXnqAaH59d3Z3dXx4XWBxfm51YWRbXV9SZ25UZlxeYmtpd3t/cmxtZGtqaIF/bHSCbG11cHpwhnluh4B2goB9hXZxgo2Ifnt8fH98gotgaHtqdWlpgmRqY2BpXGR1aG9idW1sVWNxeWVwentzZWptbYuInrWZoKKekpGVmIqan5+fe3mfp5Gci4emlYyYmXp7jYZ9iZKDjYOCg258gHlzgIV+i5J9a2h9gpeJgYiNfH2GhYd9kIORnZ2TiqmdgXGLi4yShqChiYWMfKeRiZCTmJSWk3iMop6fnZWYfoCQmpiSi5qioKKYlZCZfIuCd3+Cjoagf36MjY98mKSiopOakZCmjI6BmpGJkpabfpOSfoeOgXV0gnF3YX6BjoZyi5d9iYxyjX+DhoePaXhyeIyYkY9/ln6HiXKBhnt7b3d6iYN5eI6LgZSjkoqEj3qGhoeEdoOEiYl8aHR+gXp8cm1saF9+c2l9dnZ1fnOBa19hdHdxeGVkWV9fUmtpVmZaYGFoand6gnJnbGRsaGaAgWtufmhvcmx/eYd7bIyBc4GBfoJ0doKNhn98e3+Bfn+PaXKDbnRpYYdobGJfcVZ0b2xuYHhobVdqdHZjdXp7cmJqb3qJjJ6wkaSknI6Pl4+GnKCbnnx3paGOmIGNo4uJmpZ5fIaIf4OKf4mDgX9ygHt0doKFfouReGdjfYaXioKKi3h9gI6EeZeDlpmYjpehnH9wi4GRk4Wlm4iNiYOmlYWTjJeYkpJ3kZ2foJeTlnl+jpeXjZaanKOcl5GTmXeNg4F2g5WNnX6CiY2Mc5ejn6KUmY+PoYyKgpaXg5KVmX6YjXyIjYF2cX5ue2SBfYuFcYiUgJKCbImEgoGKhWZ2b3uFkZiMfJJ4i4d7f4Z7enB9d4iEeIKOh4mWn5SBgop2iIODgnd8g4qHeGJ6en91f3hobWZif2preHR1d35yfWRkYXNudXNuYVphX1ttZVNkWWFhaWt2eodyY2tjbWZofYJsaXVpbnBpgH2Cem6QhnJ/g4N/dHyDjIF/fnqCg358kG12iXN1bWWKbGpiYnVWhGlwbmB4Z2xianZwZnl8enFgcmyGhY+brJamp56NjJeHhp+Tl5l+eKqdi5l7mJ6MjJmQeXyBjH59hHyBg4F4dHp6dH2AhICJi4BkX32LlId/hIZ0fX6LgH6ZhpeWmY6lo5mAc4d7k5KJpo+MjoqSoJGEkpCVl5GLgY6XnpqRj5Byf42Rk4icnJ6ll5aLk5Vxi4uJa4SXj5l6iIiPiW+XnpuklJWLjJ6LhYGRnH+SkpWGmYh7ioqBenF6bHVsfH+Mfm6Gk4SVeHCDhH5/i4Blcmp7f5aXg36NdI+HgniGfHR2fnyEf3uBioKKkqGPeIOBdImHfYB0dYKJhXFjfHZ7cn5wYnBkZXxjb3B3c3l4dHVid2BwbHZucF1cYF5ea15RXlljYWludHyKbGBqZWpjaHeHbmdtaWttaIF9e3hvkIhzgIOFfXSBhol7g316goR9fY5yeYp4eG1sh2toX2lyY4dncW9ld2dubGF6aWp9e3hwYXhti4CYmKmfo6idiYqShoqdi5WZfnivmY2Xfp+UkZeUiHd+fIp9fIB3eICAcHV0fHCGfIGBin98YVx+j5GGgIOCcnqAiHuQk4qTk56Up52Vgn2BfY2KkaOJjoqNmJqNhpKZlJWOiYeLkZuSjoyMbYSQj5GInpmhoJaUiJWPbIaXgmWEmI6TeomEkIpwlpuUo5OSiYuZjIF/kJ59ko6SjJmOe4qFh3RzdmxxbnZ9i3RvhpKPk3F1gXyCg4l9ZnFteXyZk3yDiHSQiYBzh3htfnx/hHuDioaBi5Omi3qGe32KhHd+cXCBh4RmaXp1dnF8Y19xYWt0X3Fre3p6bXNxZnpeb21zbXNYW19gYmxbUVhZZWNncXKAiGddamlnYmdxjW9kamhlaWmBend2b46FdIGCg3x1goiGeIV8eISFen+Jd36Le3tzeIJqa19waHSAa3JvbXJnb2xlfGNugHp2cWx3d4p+opehp6Gmm4aLi4GPnIeTnXaCrJaTjoehjZaUkIB0fHeFeHl/c3N7hmxzcHtuinaAgYdvcFtZfpGNh4B/f3Z1gYGBoYeSi5WemaKWmHmKf4CMiJydio+GkpiWhYmVmpCWi4uLjYubiY2Pgm2Ji5CQiZyWoZuWk4SWhmiCoYFlhJuJkH6Lg4uBd5OZk5+SkYmIlIx+fY6Xe5CMj46aknyKgIJvdnBsbW9xfIZqdISPmYtxd4B1gomDemdzbnWAmY56h4R5k5B5dYdzb4d6hIp4iYSAhoyZoYZ7g3WBin94eG5rgYSDX3R1dHJyeVtfcWFxa19wa358cW5ua253YXBwa3JtWVliYWJvWFFUW2ZnY3VwhYNjXWttZGJma5JuYGdnX2hrgXVyc3CLgHV/g4B5doCLgHiFf3iIhneDhXyGjH97d4p/anFjfGOGfG5xbXRqaG9sdnhgcX95fHR1dICDfqSVmayep5aEjYR/l5SDkKB2jKCVk4aLm42Wjot6cnh1gnByhXRyd4lscG52bYh2g36AbW1VUYGqlIaDd353coR7g6KElIOWlJmdk5t5knuDjJKjmZOOiZWZkoSHl5qMk4qIjY6GnIOPiXtyi4WKjoecmp+alJN+knxmg5qFZoWfh5GEkYKJcYOQl5Ccj4+Mi4+Md3qRkHqOioySlox8iHyAa3Zrb2tsbXt/YXp+kJiCd3uCeIONfXpodGxzhpWKfYeFe5KOcXmDb3aLeYeLeId8f4mOnJuDe3p2gYp8dnBqbIKEe2F5cW9tc3RWX3BjcmJgbW96cmlwZmd1dWlybGJ3ZV1XZmFhc1RRT11nZV55cIl9YF1pcmJiZmaRal9oZVtncH5wbHF0in12fYaAdXZ+jHl7hYF4iINzhoV/jIyDe3qUeGZxa4NgiH1vb2t6YGpudX91X3R9eYd4dHOFfXigj5mwnKWOgot/g5qIgI2fgIyalI+FiJiOj4+Ed3R3dIBxcIV0cHKEcGxqd26Dbn19bXRzUk2C38iS1pJ7cHWFd4WihJV4lpKanZGafJRzhZCeoZKTkImTnJSGf5eWiIyNh5CMh5t+jYB3eox+iYyJnJucmpSSeIx0ZYaQhWuHoYSRiJeDhmOMkZmPlouXjI2KinF6k4h7joiKk5GJeYV7f218ZXJva217elyBepGQgXt+gICHj3t7aXNqc4qOiICFhHyUimx+fm1/iX2KhnuDeH+MkpiYiXx1d4OPeHJtZ3GAhW5rdXBqa3ZuVF9wZXBaYG1zeWhsa2NneXNxcWRgeGFgVmxgX3dRTkxiZ2NdenGKdl1cZXZhYmZljmRhZ2JZaXNzbmtyd4x9dHqGgnV2fotzf4Z/e4l/comIgpCKh3x+mHZlc258ZYh+b3BsgFlsbnl5c2B2enuNd3N3ind5nouarpqfkIKFd4iVfn2LnoiGoJKPhYyYhJOPh4F1eHB5cW+FcG1vf3NlZXlxfW15fWpoa2OkmsHcrvCgcmx2hXeGpYeTb5iSl6KWnIKScoaLopeIjZWKkJ2Wg4GWkIWJj4CQiYiVfYZ6dH+Jd4eEjZuamJiNjnWJdWyEh4l8iaKEkYmchIVei5OYi4+JjouKhIlte5WBfYiFiZGPhnaFfX5rfWR4dmtveXNYiXuSiIZ6f4GBhox/emZyaX+JjYmBgn+KlYRrgHVtho+AjoJ8gXh9jZOQl490cneHjHVzcWd1eoRjdW5xY2t3aFNhcmhsVmBvdXphc2RgaX9xc29bZHNhYlduW155Tk1NZWdiXnd0im5cXWV5X2BlZYVgY2NfWWpza25rc3iMfnR3hIF4d3uJcYOEfX6Je3SLiYiWhot/fpdzaHVxeWyMe250cYFXcXp2eXJkd3mHjGl3gIpyf5yGmKeco5KEfXGMlHh5jJ6FhqGNj3yWjYCaiIR7c3hwdGpwgmxqbX11X2F5d3txdXtnYGR869q1ycPch3JsdIN3i52Lj2uakZGelpSCiXGEiJ+NhIuVioyYlHyNk4iDiJB7j4uFjoB/dXiDhHKIgZOblpSXhYt1hn1ug4CHhpehgpOMnoOJYYOUj4eKhoqNh4GHaXyTf32Dg4mOjYJxhn5/cXdodnNqdXhsWo19koSGfoKFgoWLg3dhcmuHgY6JgH5+kI98bYFrd4SNhJCBeoB7fY6QjpSHbXB5jIV0a3FrcnmCYXVqcF5sd2FSZXNpZlNgcXd1YXBhXWiEcnRrWGhpY2lZbldcdk1LTWZnXmJzdIZrXFxleV9eZGd7YWRfXVlrb2VuanR4in5zdIF+e3Z6iHOFgn1/iHd2ioaPmIGMgnuTdWx3dnl4k3RueHt9WHqGcX9vZ3h3koJkdoaGcImWhZmhmqKKh3Rvkoxxd4+dfouaiYp9oH+EmoCBeHJ0bm9kcn9pZ214eFxgeXt7cXGAaWFnYX/Vto+RpnducXh9cpSSjolsm5CKnZOMh3tph4uYhoGSkYaHmI58jY2BgYmNe46MfYiEenN6g3pwh4CVmY6TkoCHdIKEdIF+iJGbnoaVj59+iGJ/k4eFiYWLjX9/gmd8kIB+f4KMj5B+bYN8g3VsbXd1dHd2bGOOgpCBhn99hoCFiYBwX3FvhHuNioB7fpCHenCDZXmBiIWKgXqEfH2RjI+Rgm1ueYt+dW1uamx8f2RpbGtabndZU2pzaWJRY3N4bWNmXlprhW91Y1xoX2VtYG9VXHBPSU9nZlxob3KAbVpcY3NgW2Nsd2VlXV1abG1jbWp0d4d/cXB/fH10eIZ4hYJ9gIh1eYmBkpV8iIZ2iIBveHl7g5NvbnuBd16Df3SCbWl6dJRzZ3OIfHGRkIOan5ughoh2dpR/bXeUmH+IkYSLjpp9jJp3fXZxb2xqYXV9Z2JqdXpaYHh8emxwfmVjZ2dXnY9fcnSXvsWFeHKWi5GAdJmNh56UjYlzaoiPlYB7lIuBhJuMfIqGfXyIjH6Sh3SHhXZ2fYFxdYaBnpSGlI6CgnF+hnOCeoiWm5aFko2dgIhmfZOCgYaEiolygX1nfYt7eX9/h4uPfWmAfYR2ZnB5eHN4dGxrj4aLgoyAeoOChISAa15wdnp9i4eEe4COf35ygGh3gYaJhIF3gnp+lIqOi3xta3qIfHZ0b2hofnhlXXJjWXF0VFRvc2liTmh1eWdhXl1YcIFwdVplY15rbmFxUFpsU0RUaGJabG9ufHBaW15tY1pjb3dkZ1xdYGtqY2xpc3eCg3Fvfnt/dHWDeoOCfIKGdn6JgZaQeIOKdIGHcnl5fo2Qb297gXFqgnl6fm5tfHaVa2p4hHRrk4yFnpigmYWIb32Mdmp5mY+Ag4uDlpiKeY+Wb3lzcWxqZGB0e2lfZnJ7W2FzfXpmcHphZWSOsbJ3S2NapdvSmHN8k42SeoCXjYaako2Hb2yFkpF5eZOGgISZinyHgHl4iIqDlH9uiYZxc317anmGg6WQhJKMgn5ufYF0gXeEmZeTiZKPlIWIcHqShH6Eg4mDboF4aICFeHJ/f4OKh3xlfH6EdmNxc4BpenFvdpqNh4SMfXh5gYV7g2tcb3xyf4aDiHyEh3qIcYBtb4KFjYKCcYN3f5aKjIJ2bGx9hH52emVoan9yYVp4XFpybk9YcnRnYEtud3ViXlxbWXZ/dHBYZ15na3Jgb09YaVM/WmdfW3FrZ3pyXFtZbGVZZHF5X2hdXmVsaGZraXF3f4hvbH9+gXVwgnqAgX+DgHaBhYiXinGCjXF7hXx6eYSUjHVren9scH51f35vcnx7k3BvgX94Z5GKgqGYnZKDhmeHhHBnepeKf4CFgpqKgnyNjWl4cmxsZl9hb3puX2NweV1kbIN6YHB2X2Rl1eu+izM6PoyPgHN6h4uRj3iFmY6AlI+Nf25thYyLdXyPf4WClYl8g3hudoaFgpV2bYeEa3R7dWV5g4SnjIOOi4J8bX5ydIJ4hJqPio+Rko2Mh397koh5gIWOg2yAcmmAf3htfHyBioN3YXmEgnJkcWl/bnZydYOdjYKBh4B0dn6Ac4FwW2t8c3eIgYl6hn98iHh5cGqGgo6CiHCAd32TiIl9c21qdYCAdXVcaWl5cVlXflRbcmZNW3NyZlxKcnlxXlxbWl12gHZqWmJbaGZvZGpOWGdSPl9mXF52ZmB1cVtZVW9kWmVxeVtoXmBmbWhqa2hweH6ObWqBhH95boB7fYF/gnt2goKMk4VwgItueH2Ae3uIk4mAaXt+anR8coZ7c3d+f4x6eIR+fGuLjIObnZaMgoBtjX5saX+Pjnx+f4OUgn99iohrdXFnaWNbY2dzb2BibHVhaHCJemFzc15iZJugkG5dNluwtnVrgYt/lIh3iJmIdZCMindwbYWChnR5iXiJfZOIen9zZ3WHfXyWbm+FfWh2eW5leomFpIeAhoyJfW19dH1/e4qXhoCTkJiJi4WKfI+KcXx+hnxpfm1rgHt5anp3goeBcl93gn5yZHJodoNudXyGlpOCfoOBcHh6fHV/bVdtfXVziYCFdoZ1gYl6d3Jsh3+Of4NxfXt8kIaHeW1taGyCgXRuXGhmdXJSXHxPXXJdT1xzcGRWS3R5a1haWVphcoF2Yl5dYWdkaWpmT1ppTkFiZVxhd2FcdW5YWFN1Ylplb3NYal9iaGtnbWxpcHd8k2xphIp9fXB/fnyBf4J7d4CAioyEcXuHb3J3g397iY2PhGp+e254eXaLd314gIKHgIN+fnpthIyImKONhYR7dot5a22FipJ5fnyCkoCAfouDcHJwY2ZeWGdfcHBgYWhxZmpviXRhc29bYWNqdnt/v52opcq5coeGdJV+eomVhHWSjodyc3CDeoJzdYZ0iHeUiXl5cWN2hXh/kmhxg3ZmdnVjanyEiJ6Cf36OjXxxfXKCd32PjoJ2lY2UkIiCiHuJimx5eoB1aHtpbH95c2l6doCDfWdgd4d9a2p0aHyBanaBjZKWf3x/f3J9d3x1f2JVdXtxcoeBgXuCcIaJd3dvboGAi318d3x6c4yEgHRncGdriIFxb11oY3RvTGZ3TV9vVlVadG5iUVB1eWNTWFhdYnKDdF1iXGllZWRsZVFccUlEZWJcZHJfXXhoVVdWeF5bZm5pV2xeYWpnZW9uaXB3epNuaYiMeX5ze355goGCfHZ9g4iGg3B3g3Nud4KCfomLlH9xgHx4enqBi3WDeH+BgYKEeoB1bn2Ji5ueiH6Ge3eHfGh1h42Ren+AfIqGhHePgGdwbmBlXFhlWm5zYWFhcW1saIluYHNpWF5jbYB3qdqpyIeIs3OLenGPd32JkYJ7lIuAdXR1fXZ/b3B/boV0lIZ4dWxgeYB4h41kcYJuZ3VtW219gZCTgIB4kpF8d3pshXN9j4qDcpWKkY+IhoZ7f4ZudXd/bWh3ZW18dm1rd3d/f3xgYniGemh1dmN+fGh1h4+Ol312gXdygHt9boBaVnF8b3OBhX1/d2uIhnN4anN+goJ8eXt3enGJf3pyZnJkbIuDbHNaamB2Zklvb01dY1hXVnluYlBTdXdaUVZYXmFzhXBdYWNuZWReb2NVXnNHQ2dgXmdpXVp8Y1JWXXZbW2dsYldrYGFuZmZscGhwdniPdGuOjXZ/d3h9d4GEgXx1fYOIiINvcX91cXV+hYGJjYt7d394hHx9hYd4iHx9gX2EgHt+cnV4i46fjIl7ind1g3pefoeajXmHhHSGh4V3iXtibm1cYltbYVZqdGRhXGhvcGeHcWFxZldcY2t/fMrOh7qia25vjG5zhnN+hoyAe5KFenl0eXR0empsdmOEdpKCdnBnXnyAeIqHZHGAampxY1hte4aciIKBcpeTdn16bYZvf4iKhnCWjpCIhoyEe3l/cnJwfmdocmNueHFqbHJ4fXx5XWR5gHhpdXlngndodYiMj5Z+c4hrcH+AeW59XVdvfGxyfYh6gG1uiYBwdmZ2fn9+gHR6b3lyhXp3cGRxYG2MgWtyV2tfeV1JcGxOWFZfVFV8a2JPVHZzUlJUV15jdoZqXmFra2ZjWm9iWWRxSEFpXWFnX1xWfF5PVmZxWltqaF1YaGFfcmZqaHFncXN2h3lulIp1f3t4fnmDiIB1dH+GhY6DcG97eHd1eoaFhoyGenx/dYt/fYaEhId/fn59hn98eHZ5dpGUn36NfYtudYB6ZISImIZzkotwhYWCeoN1Y25qWWBaXV5UaHNlYVlkcnJngXJha2VXWl9pf3i+rnugt25jdYhpdn1ze4WIe36NgHd4c3duenZlam9gh3WOgXNqYl59dniKgmVwfWdra1pWb3iLo4GFf3CZknB/dnOAbH6Aj4ZylIiNiIWJhX15dXNwaXpham1hbXZqZ2treXd6d1pmfX14ZXJ+boV0ZnaGjYeXgHGMaGx7g3VtdWJbbXpqcnmJeoBldIZ9bXBndH12fX5wemp5eX93dm9ka2Bsin1sbVVqYHhWTGxtUFNQaE5ZfWhiT1V2bE1RVFVfaHeEZ15hcWlnYFdqXV1sakpFa1tjZVdZVnpaTldva1ldbGVcWmVjXnVmbGVxZ3NwdIF4cJmFdn9/eH98hod9dnSCiICVg25zeXt7c3OFhoiIhHmBfXaPf32FiY6EgYN6fouDe3d8dnaZnZh6ioOHanZ+fW2FhZWBco+CcYaCfoKAcGZsZ1hdWlxbVGVxZV9YY3N1aXZwZWVjV1tbaH9wb3KAc4plZnqAa3Z3dHWFhniChXp3dHZuanpwYWhrZ4Z0jYRuZl5ee215iHxnbHdmamRVV3NwjqZ8hHt2lo9ze3F6eGx5eY+DdZd8iIaEh4R9dXFzbWh1XW1pYGx1ZGdnaXpve3JZZ4F2dWhwgHiCdmJ3hYt9loJvjGxufIFxZnNlYGp4ZnB1iHl8YXSDdmlrcHN5b3l4cntlfX19dnVtYmRgbIZ8bGpVaWJyVExrbFBNT3BIXnxmYU5WdWVLT1NYYmx4f2ZeZ3NrZWBXZFhjcl5MTGxYZGJVVFZ0V01Zd2VaX2xhXFtkZV92Z21icGp0b3F+dXSZgXh/gHiAfoaEen12goN+mIVucnR8e3RxhYWPgoB6i3Z0kYB8gZWOgYWEfH6Mhnp+gHZ6o6aKeYmGhWx1fXx2hIONe2+Gc3qFfYKDdW9qaWVWXVtbWlNjb2VbWWF0e2pobWhgYVheWmmAaWxvgGhtYml7emt1dXVwh4J6gX53dm56aGp5al9lbmiBd5CEZ2VYYXZofYZ4bmlvZmZdVVhvaI+odoF6fJCNeHRufW1xdHiNfneUdIaDgIaJdmp0d2hpb1xtZV5uc19nYmp4aHttW22DcnRqb4F+enhid4WFeZGGdIlzcHp/cmNxaFttdWRvcYZ6d2Fyf3BnaXdzcWt3dnN1YoJ5fHV0b2NiYWx8fGtrVWliZ1RMbmlQSFNrRmJ5ZmJNVHJeSk5VWmZteHtmX25yamRdVmFWb29YS1RpWGdeWE5WbFRLXXpgXF9sXV1bYmZgemhsYW9vdm5vd3V6l313gIF5gICHhnp5eoN9gZOEcXN0fnp2dIWIkH6BfZFsc5WBfIOfhX+HfYF/hoKAint2hKuff3qIiIVscYJ7doGAgnVviG59gHSKgGpwbmVkWF9aWlpVYmtnXFpfdYJpXm1sXGFXW1xrgWVydH1qa15teHdpdnhzb4d8fn56dnJsemhpd2ddZHNoeneSgGNiVGNuZYGEdXZmaGlhV1ZZaGSQp25+d4CLjXlwbntld215inp2jnGEfn+Ah25kd3RlaGldbGJecG9baF9sdWV6aF10gG5ya3F7f3Z2Y3WGjHyJiIGAeXN2fnRhcGxYcHFhbm+CenNjcYBsYWx5bmloeXhzcGSEc3h4c29jYGNsc31pa1RoXl9VTHVkUUhWYkhjd2ZiTFRxWUtNWFlpbHd7ZWVucmdjWlheWXhnVUpdZFhpWVlJV2ZQSWN5W15fbVteXWJkXn9pamBvdHltb252g5d5coGAfX+JjIZ+dnaGeIaMfXN1dYJ5enqCjI59f4WJanSXgXuLnX5+hnqAe358holzcY+tjHt8h49+ZnGJe3R+fXdzcIZsfH5tkHpjcHBiZV5lVlpZV2RmbGBdXXSFaFhwbVteWFpcbHtjcXd2bmNcb3V1aXZ3cm+GeX+Bendub3RlaHRlW2d1ZnZ2kXlfXVJlZWmBgXN8YWJpXFRYXmNkkKRoeHSChZB3bG14ZnZse4N5dIdygXl9eYBpZndtYWdhX2pgXnVrWWZdb29iemVbd3xrbm9weHl0dWVzhJOAiYSJe3dwc31yYXhjWW5uYG5vf3pyZXGAZF5tdWhjZnd6cmxtgXNxe3FwYV1kbG58ZWlTZ1laVU56YFJLWllIY3VkYUpVblVLTVpXam1ze2RsbXRjYVlaXGJ4XVRMZF5ZalRXSFlhTkhrd1lfYW5cXF9iY1yFaWhibnh6bW9qdoGQeW2CfoCBkoiEgXd1iXSLhnRydnaBeH19foyPgX+TfnB4loN9mZN5gIF3eX5/c4iEc3CZoXt7f4mVeWV1iXpzeXdsdXB/bHl8cJJzXnBvYWhibFRbWldpZG5mXFxyiWVTcm5bWllXYGx2Y2p1a2tfW291cm51dXVrh31/gXx3b25sZGlwY1trcmR0do5zXFZTY19wfn1wgFxhY15TWmFcZJKeZXJxhYOQc2tpeGtubnl5enGAdn9ze3p7ZGZ2aF5iW2FoXF93aFdiX3BoYXdhW3x2ampybnh0dHVpcYKWhIiAhnZ0a3B8bGZ3V1tpbGFvcH53c2VvfVtgb3BiXmlwfWtqcn1wb3Zpbl9aZGtsemFmU2ZVWFNReF1TUFlSSGR0YmFHVmxRSVBaVmxsbHxlbW9yYVxaWFptcVhTUWdXV2pUVUZaXU9Jc3ZZYGNuY1lhYWFejGpjZW16eWxvaXZ5hntrg32AhJp8goR5fYhuj4ZxbnZ6fXSCgn2Lj4ODl3R4gpSFgZ+JdYGAgXN/gXCHg3Zvopdze4aMh3tmd4tvbnxwZ3lye2xzdnONa150b2JnZmtTXlxWaGJtbVtccYxkTm9tXVZYVWZpc2hjdWVlXltwd29xdnZ6bIh9f32Id49zY2Rrb2Fcbm1jc3iHa1pUVmFidnt7b4RcY15jU1pgWmOWlGNucIKFiXJpZnhtZHJ1cXpreXR1b3t/dl9nc2RbXldiZFlidWVVYGFtZGFxXVx+b2hpc3F0cXV3bG2FlYOKfYZyc2dvfG9xb1JaZWlkb3F+dHJibHVVYnFqWl5uZHtka3R7cHFxaGxeWGNpanheZVNkVVdRVm9YUldUUEhlc2BiRlhrT0lYVFduaWV8aWx5a2JXXVZcdWVUU1hpUlpnVVRJW1pQTnl3W19lbWlaYmFfXo9uYmdreXZub2l2dn9+bIOAfYaYe3+HgYp/a5OIcmdzgHt1gIN+iY5/jJNzfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4KNjHd4bnqNYGV9cWd6dHltbXF3g2dkfG1jZ2dpVGBfVWdgbXBcXm6OaE1pbGBVVlNvZ3NrZnhlZl5acnZuc3x5dG6Je393nHp5a2FlbG1eYG9qZXF5fmdaVVdfa3Z6eW6CXmFdaFZZYFhknIhia3CBhnx2a2l1a1t1cGp5aXVybm98gXNZa25gWV5WYmRYZXFjVF9iaWFibFpgfmtmbHR1b214d2xoho2AinyIbnFmcHtscWxhWF9nZm1xf3JyXmlsU2VwZFVibWF4YW90enRpbmppXldgZmh1XGRVYVZUT1lnU09cT1BJZXBdY0daak5KYExZbWVgeGlvgGVgVV9VXnZcVVNhaE9eY1VUS11aUVp2dl1fZm1oWGNhW16OcWNoanhxc21ndnR5gnOCg3qIj398ioiOem6QinRsc4F0f3+IhYeShJWPen2Mj4iRm4SAe4yEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fH5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6OjY2NjY2NjY2NjY2Njo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fH19fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIyTk5OTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2NjY2NjY2Oj42MjY2Njo+Pjo6Ojo6MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8fH1+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA+LjExMTAvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOFd2VnZmZmaFxDRERERENHZGhnZ2dnZ2tvbm1ubnFKKy4uLi4rSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMji4aHR0dHBpohYKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKCgoNyXV9fX19hUjQ1NTU1NDlcYF9fX19fZWdnZ2dnajwYHBwcHBg7g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYiIiIiIh42QkJCQkJCMh4eHh4eHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFhoiJiImJiYmKioqKioqJhYODg4ODg4WKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7enx8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46RkpGJh46KkJKTkYuQjY6OhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjY2Njo6Ojo6NjY2NjY2Ojo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCLhYmJiY6IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3d3h7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkIiFh42JkImMkI+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt9e3d2d3t8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQiIWIjImPh46Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fX19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhIqMiI6Hj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf313eHp7enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+Kjo2LjYyPj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICAgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aAe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomHgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKi4eHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9+f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSUk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OTkpKSkpOTk5OTlJWVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZGSk5KTk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZKRkZKSk4iFk5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+Pj4+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJKCgpKQkZGOdYaRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+QkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCPkIhwhJCPkHx0iJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6PjHNvio+KcniHj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX5+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNd217j4JzeIaNjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fn5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYWFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4dzbm+Ee3V2gIWDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFlYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3dGJeZF9ha3FmaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZFRUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhiXWpsXWVmZ2VjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZGSElKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWlpqd2xibnJqYllZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NW2tya2FtdHJmUVFTUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU5dY29rWGlzdXBTTU9QUFBPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRkJGSFViZ2xvcG9tbFpMTE5NTk9NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUNGR0hNWmdoZ3JubmhmZGBeXlhMSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+SVpdWlxlbG5qb21tbGtpaGtkU0dFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7PUtbaW1ub2pvbWtqbG1mUUdFREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwc3R0c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oj1IY29zbW5sa2xoVUM+Q0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3RycXR4eHl9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTk9SmBzc3BoVD86Oz1AQUA9Ozs+PD08QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl6e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09Pjw6Qmx9akA6Oz49Pj9AQEA/P0E/QEBBQEBAPT8/PTw6Oz09PD9AQEJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A7W25APkRFP0BBRF9kOz09Ozo9PkFBPz9AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSktIVnBwcXNzdHR1eXp7fHx+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojptd0g4Ozo9PkE7SGQ9PD08ODo7QD89PD08PEA9PTw8Pjs9PD0+QUBCQUBAQEJEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlgcHBycnJ0dXZ5e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPTw9SUxGRXV2Tjc4ODo7Pj9XakE7PDw6Ojs+Pj49PTc5Pz09Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDcnpKO1x/g396fHdXPD0/PT0+RWh0TDo9Pj89PT5OU1VSTENAQD8+QT07P0JAQkNCQEJDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VFP0FHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUdyemtig4SDgoOAfV4+QENAQD1Kc3tZOj1BRUJBR2ZobGhhX09DQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARW50fYKCgYN+fYR2TUFDRUA/Pll7gF0/Q0VJSUlXampoaWhmZ09ER0VFRURFQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHt9f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXJDREVEQ1d1hoeHflhHSEpNTVNtd3BpbW9xZUtKSUhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnV2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEiWxBQVZ0h4mHh4eIg1dITE5NVHJ4eHJub29sTUdJR0ZIRkhFQ0RERkVEREhIQ0NDRklLS0xMTExMTElKS0pKSElJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIhFZshYeGhoaHiIiHfFBMTUpbd3qCcW5tbWxLQ0NCQ0ZGRUJAPj5AQUJAQkQ/Pj9ERkhERkdJS0lKSEhIR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BycnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xLSlSBg4SEgoKFhoaEgoWFhISGhoaHh4aKdUpKR1tnaGpmaXN6cUM9Ozo8QUFAPjw5OTg8PDw7Pjs4Oz9BQkBBQ0NCQEFBRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGAgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISklJZYWEhIR/gYKDgoODhIWFhoeIiIiIiYyPZ0VWZGpsYWVseIBlNzk2NDc5Ozw6ODU2Nzc4OTc4NzU4ODs7Oz1AOzk5OT08Pjs8PUFDRUhKTUxMR0lHT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlohoSEgX6Bg4ODgoOEhomKjIyLi4mKi42KZWJvcGxoa3FteFEzODczNTY4Ojg3NjU2NTY3Njc2Nzo2Nzg4OTo3NTc4OTc5ODY2OjxAR0ZJR0lGRUZPU1JTU1JPUFBSVGVwcXN0dHZ5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANjc4OD06PUVDQmWFg4GAgoODg4ODhomLiomJioqKiouKi4uIcXV2cHB1cGpuSzQ4ODU1NzY5OTc3Njc2NTo5Ojo6Ozc5ODk4NzY2OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1dnl7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgICAgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhYaJioqIh4eIiIqKjIuKi46Idnh3dnhybW1KODs8OTo7OTo7Ojo5Ozo5PT09Pjs7PDw6Pjs5Ozs8Ozw7OTo8ODo6Ojo5OTk8Pzw8QUJESUpNS0lLTFdvcnN1c3Z4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4qMjY2CdXh7eHJxakhBQUI+QENBQD49Pj5APz8/QD9APT0/Qj5AQT9BPz1AQEA+P0E8Pjw7Ojs6OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PDo6Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uLi4yNjIx/eHt6emtXTEhISEVGSEdFQ0FAQkVDQ0FCQ0I/QERIRUNFQ0VEQUZERkRFRkRAQj49QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOjc6Pjo8Oz4/Pz89QUBDREZXhIKDhIWGhoaIiYmIh4aGhoeJiYqLjI2MjIyMjIx+eXp3WU5TTUtLSUpKSklFRERHSEZEREVGREJISUtHSEdGSEdFS0lLSUpLSkNFQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0FCQkE5ODw+Ozw7PkA/QT5CQkdHSVmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjY2NjYyMjol6enVdUVRPTE5LSktIS0dER0lJSUVGSUZGRUxMTUlKR0dISUpOTU9MTE5LR0ZHR0VFQ0ZFRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg3PDs7PTo+QD4/QENGSUlQX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjYyMjIyNjYR5enReUVBOTkxKSUZKSUVLSUdLSklKR0dHS0xOTExISElKTVFOT05MT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1RucHV3d3l6eHl6e3x8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AOTo8OD0+Oz1BPj9BREhKTFVxg4SFhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMjIyMjXZ2eG1UU1BNTElHREhLSE1MR0tPTEtKSkxNTE9QTkhJS0xPUVFQUU9PSkhKSkxKS0ZHSEdGRklGRUVCQUJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4qMjIyMjIyOf2RnbVlYVVFPTUxFRkdNUE9QV1VRUE9RU1JNU1RPTVNMUFNVVlJTUVBMSk1NTUtOSEdKRkVISkVERUVCRUNjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1RGRkdHR0dIRj5AQj0/PT1CQEJCR1ZORk5QUFRYe4aDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjI2PjIyMb2Fjb2RIVVNTUks7O1NUUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9NUlFQUFFMTEtISEpIRUZJSUlISWlydnl4eXl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4GAgIB/f3+AgH9/f35+U0hKSUhHR0ZFPz9BQUVBQ0dFREVMWFJNVFVWWFp8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfmGKi4uIc2JqWT5bW1pVUj9AV1ZZXGRgVllicl1dV11aVkVRWVpbWV9UWWdSVlZYVVRWVE9PTUtMSklJTE1LT01Tb3R2eHl4eHp6ent6enx9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYuMfXRzW15eXVRVU1dXVltbdYNZVX2QYVxYXV9XSVZdXVtbX1lIWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFFPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeJioFuhomIh4SKgGpdXV5bVldVWFRTWFZjloBSZXJYWldfaFBgZltbWFxnYUdPWmhnXVtcXV1XUk9TUFBSVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQTk1LSkVDP0A7UFBaWltTU1FQUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfoF9YFVZW1ZUV1RSUk1QTUxmeltdVFlVVl1aTFRaVVNUXlpYV1dXempYW1xcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fH1+fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrf35rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlVjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4h6cHNaTk9RUU1PTEpLRUZJRkM/VGRVf1JRUU5LUVRRTU9ZUk1OUVNWVU1RU1JQT01MSENJSFJUVVpcbHF1dXVzc3d6ent7fH17fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZRTElMSWFsknRQUVNOUVJRUltSU1JRUlVUYXN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnZhYFBIQkVFREREQUVRQ0VBQz5DSUdWQEhOTEddaVBIRk5GREVGSUdIQkRIR0lLR0RCQURAT1FNU2RydHZ1c3R1enx7e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1BVWVNVUVFUUk9WX2tscnZ7e3h5dXJuc3RzeXh9f4OAg4OCgIKAg4GCbE9JQkM9PD5AQUBAP2tRS2BFRkhJRUI/R0xOR01SVUlCRT8+PD08PT0/PT9BQ0NAPz09Qj5KTkdVbnR0dXN0dnh6fHt8fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSkpQUE5LTFFSUVRVVVdRUVdVUFhbYV1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlRUJCQz47Q0NCQkRCXF1Pe05PT05LTE1PT1FMS01XTUhHQEI8Ojc3NTk5PTs7Ozg6ODo/PEJIP1xzdHV2dXZ3eXx8fH18fH19fn18fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF9dWklIUFJRT01QUU5RUlRWWFNTWVRPWVpcV1ldXl5fZV9dXnF2a15gZ2t3b29sam9ubmxlYllIR0hIQ0JHSUZGRkRNUk9hV1NXUVBTU1JVW09PUVZQTUlDRj86OTY1ODc5Nzk6MzY1Nzk1PEM+ZXNzdnd3eXl7fX18fHt8fX5+fXt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFZXXlpYTUtUVFNQUVVPTFJTVFdYVFRZUk1YWVpWWFhWWFldV1dYaHNrXVZhdGthYV9eZGFfXllVUU5PT01JSEpMSklGQ1FQU1pXVFROUVNZU1xlVU9TVFJOS0lIQz9BOTk5ODk3ODg1NzU3ODU5OkducXR3eHp7e3x+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RWVVVVV1BTVFdUVVJdbl9STlpgW1dZO0RWWFRbZkpMUFNST05NTk5OTEpGUVBVWVNUT0pPT1VTVFxWUlVTUk9NTElISEY/Pzw6Nzg3NjU5OTY3Njc1V3Bwc3d5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXVJUWldYVVRXVFJYWFlZWVNVT0pHT1BPT01SSk9QT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFNNSU1LT1JQUlJTVFFST0xNS0xMSENCQT06Ojg3NjtCNTU2Njpkb3F0d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaGlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpJR0VITEhKSEZMTVBNRy9FX1I+Mz8+am9hU1JRQEdUUVBRUFFOUU9RUExKTExPUE5OUFFRTlBPSkxNTUtHRUVDQTs9PDw6PUc2Njc3RG1wdHZ5e3t9fH18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hFRkhKTUxFR0NPUkM4RU5TXWdUUVNBR1VQT1FRUE1NT01LTEtMTk9PUUxPT01ITEtJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ0eHt7e317fHt5fHp7fn58e3V0dXJ2dnp7eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTkxRU0xUVVRXV1VMTEtJPDk4Nzs+QD48PUFAQj0+RUhGQ0VGSUdKSkBGQUFARkhFSk9IUVJiXFJQUk9TT09QTE1PTUxNTU5PTltXS01RT0dJSENJSkxMS0ZGRkU/QkM+PEJHP0I/QWRwc3Z6ent7fHt6end7d3l+fnx7cXN0cHJzd3N4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0Q9OTc3OT9CPjs/QkBAPkBESkVDR0dJR0lFQkI/Pj1DQkFHSURNT2JlUU1PTldLTE5LTE5NTUxMT05TZE5KTFJJSUlFQUhKTE1OSkdJR0JBQkA/RUZFSERLbm92eXl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTU1KTVBNUE9ISkQ/QT05ODk6P0I/PEFCQUFERUdKRkRISEdHSENEP0I/P0BBPkNFQ0tOUlRMSklNVEZJSUpMSktMSUpNTU9QUlBKR0NMR0NCSklMTU9OSUpJR0NDQ0RISk1MSVlybXd5eHp7enl8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb21wb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUhLREdISUdKS0lKS0RGQj0+PTo5OjtAQj89QUJDQ0dGSUtKRUlJRkdHQ0M7QUBCPkBAQ0VDSU1QSEhLR0hLREhKTE1ISkxISUpMS01dUkhIRE5GQUNKSk1MUE1LTEpLRkdHSk5OUU5MYm1pdnZ3enl7en1ybWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktDRkZHRUZGR0VHQkNAPjw9OTo6O0BDQD5BQ0VFSUVJSkxGSUlHRkZDQjtBQkM+QENEQ0RHTE5IS05IREhFSUxOTUdJTEdGR0lJTE5LSUdFTkhCRk1LTUxPTU1OTUtJSElPUlJTTlJmZmZyb3N4dnt6fGxoam5la3Fsc3BmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSURGRkVDQ0JFQERCPj8+Ojs7PTo8PkNBPkFDREZKRklITEhHR0dGRUNAPUREQj5BQ0NDRUdJSUdNUUpGRkdLTk9LRkhJRkVERUlKSEtJRkhPS0NJTEtPTU9OT09OSkpJTFJVVVNPV2RgYG1ncHJvcnl6Z2VoaGRpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxIRUVIQ0JBQkQ9QkE+QT06Oj0/Oj49QEI+QEFER0pGSUZJSEZGR0RDQkFBRkZDQkJDREVFR0dIRkxRTElPSkpNTElHSEVHRURDSUlIS0pHS1JNQk5OTE9OT09NTk9LS0tPVVdWVVNYX15caWFuam5ocnNiZGZlZGhoZm5qZm1taGtrbXJpcXZ0c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3d2dHd1anN1bnV0c3Fya2tyTUdHRkhCQkFERTxBQEBDPDg6PD45Pzw/QkBAQERGSEVIRkZIR0ZGRENFQ0RJRUNGRUJFR0VGR0dFSU1LSVFNSktISElFRkhIRUNJSklLTEtQU05EUVJPUFFOT01OUE1MTVNXVlhYVVhdWl1kYGljamlna19kZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpbnlNSEdISEJCQkZFPD9CQkQ8Nzs9Pjo+OkBCPj8/QkVGREdERUhFREZDREZFRkpFRUlHQ0dIRkhHRUNGS0pITktMS0hKTEZJSUtIRUtLTE1OT1JUT0hTVFJQUk9RTU5RTk1QV1pWWllWWl1ZWGFgYWBeaGVjYGRlaGdqaGhpZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1d3V7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5ISEhJREJDSEU8QEVCRT04OT4+PTw8QUI8Pz5BQUZDRkNESURERUVGR0dHSUZHS0hESEhHSUdGREhLSUdLSU1LSktMSExLTEtKTktPTk9SVVZPS1VWU1BTUVJMT1FQT1RZWllcWllbXV5dYGNeXGFja2JgZGdocoVoZ2lmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB0TElLSUtGQkVHRTxAR0NEQDo8PkA/Pj9CQjxAPkJBRkNFRUVJRkZFR0ZHSEZISElLSkZKSEhLSEZGTElIR0pHTExNTExJTUtNTU1QTFBQUVVWV09LVlVUUlNRUkxPUlJRVlpaXV5bXF5eXmBgYWRdY2BlZmBlaGpkc3Nmamdma29ycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKS0xKTEdDRURFPEBGRERDOz8/QUBAQENBP0I/QUNIQ0ZGR0lGSkZHRElIR0lISkxISEpKSUxKRkpLSElLSkdLS01NSkpNTE5OTlBLT1BSVVhWTU1UVVRSUVFQTU5UU1JXW11eX11dYF9gYWFgYWNlYmRoYmRpamd2i2xqaWdsb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnVud0tMTExNR0RDQUU8P0VFRUM9QUFDQkJDREFDRUFBRUdDSEhJSEdKR0NHSUdISkZJTUhJSk1LTkxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOUlBXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nY2hoaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BEQkVEREZCQ0VHQ0NJRkNJSkpJSUtHREtKR0lKSUlMSEpKTkxPS0lMSEtMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGF2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUX3d2aWpnaGZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZCP0BCPz1ERUZEQ0RDRUVERkJGRkdERUtGRkpNTEtMTEdHTUlHSktIS0tJS0tOTE1MTExJTE1MW3NiZHBebG1VTU5mc11mZnFsbnRncGlfYVlubmJwcGJrampmb3F0ZXRub1xvdWdwTUpxeXZrYWBrZWVteGxrdmxtcHNycHJxcHFycXJycnRybW1zbm5vcHN1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUhHRUQ/QUJAPkNGR0NGQ0ZFRkVEQ0hISERFS0hHTE5OTE1NRkpOSEpLSklMS0pKS0xNTk5NTUpNTU5bcm9vbnBwbGtNUFFsV01pYnRycGFtbnVcWWxQXG5tWnFta29teHh0c2lwXV9ya3FqVXV5eG9jXmtmYmdwb2pqbm9wcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHR0VFRUJCQj5AQEZIQ0dESUZFRUJGSUhIRUhMS0dNTU9MTU5HTE1JTEtJSk1JS0pKSk5QT05MTE5OTFxoZHVdbHFXbE5QUW1UWWtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl0eGtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITEZJREVFQ0FCPUJBQ0ZESEdMSEVDQ0hLSUhGSkxMRk5MTFNSTEdMTEhOSkhITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllya2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altedGN3eHJqbnpoYWFjZmJiaW10dXBzdXZzcXBwcW9xdHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9uc3N2c0hLSElCRURFQUE+RERCR0RISU1JRkNGSkxKR0ZLTkxGT0pLV1FLR0tKSk5KSEpMSUtKSEhLTU1NTUlLS0tTa2NbaV5faWNyclpfWWpuX2VlVWtfY1thYVFgbGhdalxuaWlkW29lZHBdWlxrW21xY3BzbGRnY2NnYGBqbXFwbnR5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW52cXF1dHdyR0dGSURFREZBQEJGRURHQkhKTEhGREdLTElFRkpPTElQSUxaUEpFSEhLTUlISkpLS0lISUZLS0tMR0hLS0xNTUxKS01OVFtcVFBUTFBPTk9PVlFPTlFOT1FKSk9QUWRxaVRZVlxbXFZZW11YXVxcY2ZhYWViY2ZfX2ZrbmltdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0RHRUVBRUNAREhERkdDSUtMSEZDR0tMSUVHSVBLTE9LTFdMSUVFSElKSElLSU1KSEZHR0lHSElFRkxJSkxPTUpQXFdeUFxbYF5NWFlTXFxiXk1YWk1YYVJLWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYWFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cnhyeHNxcnVydE9CQ0RMTUJEREJFSUVHR0ZLSktIRUVJSktGRUhIUEtNTUpNUklHRUBIRktJS0xKTEpIRkRJRkRGR0VGSkhDSk1MTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5eXF5TWl5jXlpdYGNgWV9jW2BeW1RYV1leXWNiY2FjZWhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhoaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVJKSk1JRUNCQ0dIRkhHSUtKSklERktLS0VGSUpOS05LSExOR0dFPkdHS0lLTEpLS0lHRElEQ0RFQUZKRUFLTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVlVVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHh5eXl5f359eXV5dnZybnp3dnhZUUtGREdFQkVHSEZHSEhGR0lHSEdIS0lMRERLS05NTEtISkpISUY/R0dOS0tLTUtLS0lGR0NEQERBSElDQEpLSFBdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5QT1xfYWNjY2NiXWRjYmRjZlhRVlRRWldaYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZERktKRkZGSEdHSUdGRklMSk5GREtLTU5KTElLSkhIRkJISFFNTEtPTUpLSUdHRUQ/RUNJSUNDSEdFVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVVZYVJRX19iYmBgYmJgY2JhZGRiWE9RUFFaUltdXV1dXl9fY2hnbGpubnB7e3x+e4CCg4SFhIWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FIRkRHTVJIQ1FKRUdISEVGS0pNUEVGSUpLTkxMSUtLSUlHREhLUU9NTVBMTEtLSElDREFFRElHQ0NIRkRXVUVcVF1TVl9YT1RVTlpaTUlKVGBhW19YXl5hXU5YYVxgYF9iY2JdYWJXX19UUE9PT1dRXFtbXFxeX2FmZmVsZW9vd3x7gHt9f4CEhISEhISFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35KTkZERkZIRElSYlBDVl5JR0dIREZNSlBQRUlJSktOTEtKTEtJSkdFSk5RUU5PT01OTE1IS0FEQkNER0RDQ0ZHQk1IQktLT09OTEZNRkdJSkhHTEtNT1BJTE9QT1NQS09TUlVaWVdZWFhkV09TVFBQTk1OVFJaWFhaXVxgYGRlY2dja2xwc3J5eX97en+EhISFhISEhIKEgH57gYOBfXuFhIaGhoeHhYWFhISEgoGAfUtJRUVIRkdES01dTEdHWExHSEpIR01MUVBIS0tLS05NVU5PSkpLR0dLUFNTTlBPTk9OTkdLRmBFRF9MRWdkRk5cSV5bcm1PTVVtWUxEUGBVa1dnSl1XVV5ETFFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqUlZVVFtcW2BfYWJhYl9maGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFR0ZIRUVLT1NJSkZgU0dKT0pJT01SUExNTExPUlVST09JS05HSE1RW1lPUFBOT09PSUpRf1FJfFlZcnRZUW1IcW5vYVZQcXFzUENrc21xc3BTb19ablhdVlxYVWtoVV1WY1pgWVtfVlZYf2p0dXVeX3ZeV2FbW2ZbXmBhYWFdX2FnbXBsX3B3dHiBgYKDg4J+fX+Adnh6bHZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSkVITU5CRExMRklLRVFVTEtOSUtSWFdRTk5PTVFUTk9RT0tLTkdNT1NbWlRRUk9QUFBKSFp4XVR4ZWhaU1VSdmd0bHBibmZqUXJPTXdtanJwc3Jxcm9vb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Jye3xvfnhugHJfYGBiYVpgX2drbmtibGZnbHd+gYCCfXt4d4B0dnppcn5uc3x+d3h7foCDeHyAdXx/fHxzc05MR2BdR0FFTE1HSkpHSU9OTU1KTlZeWVVMUVNOWFpNU1NSTUtPSFFSVFlXV1BUUFBQUUtIZ3hsY3hybVtMTlZ5cHVtdWJvdlBlZUpmdnFtd2+AamZ4d2lXclFoem1panp6fWx4en9vaG9ZdnZqdnVwgF9yZn1pbHh8b15fX2JhWl1iZGdpaWRnYmNkbGxwcHN0c3NzenFyeGJsdWdyeXtycnZ5foFzdXpufH15eHJuTktTdU5DQkZQUEhKS0lLUE5OT01QWmBaV0tUV1BhXlJWUVlSTFBJU1RVWFdXUFVQT05SSktyb3V1cXVxZGlhV25McXBeRmh5V3ZUS2h5fXhgeXtzbmFdbW9jUmdxdW5teXB3bHZ0dHJsbl10fnprbXl8a3RsfGtwdnV4Xl9fYl5cX2RkaWdnZWVeYWJpaWlqa25va3FvbWpwYWNmY293eG9tcHN5f25xcGt7enRyb21MTFtWSEdFR1JQSUxNSktQUVBQUFBXXFlVTVVZVWVYUlJZXVNMTklUVFdXWVdPU05OTlFJUm1IaXdLYGR2d1ZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1pwenteYHpzY3JveHFoZH1pcnxeVExsX3Z1a2l1e3ptfnhrfHBcXl5iW15hZGRmZWVlYlpjY2lra3JzcnZnbGloZGdhYWthZ3NybGdtbXJ9a21oa3t0bW1rbU9IS0tISkhIUVBMTk9MS1JSUk9TUldSVlRQV1pWVlRUVGFfUE5NSlRTVFFWVk5OTE1PUEtIUU5QVUxLTFNUU1NUUFZVUVFOUVFYWVJOUFVUWFhYW1tVUlNXW1dYV1pPU1VXWFhSXllXXldVUFlSV1dXV1heWmdyXltbWVxdX2NaX2NjZGZkY2NiWmNiZ2ZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2dqdWpoZ2lsUElLTExNS0pTUU1RUU9MVlVUUFRVWFVaVVFaXVVVVFdVWVdPT0tNVlRRTlVTTk9NTFFQTEpSUUtRTUtMUFJVU1FSU1NJSExOT1FSUVBRVFZSWFdcV1NSUFJUVVVTWlFOU1JYVlRZV1VaVlRSVlRUVVdYVlxZXWBdW1paXFxfY1tdYmNkZmRkZGFZYGFjYWJoaGltYmFkXl9jXFpkXGFtYV5mZWZtc2RpZ2prZWRjZmhQSktMT09MTVNQTlNRUE1YV1VUVVdXV1lVU1xgVldWWVVYUlBQSk5XU1BOVVBOUU5MU1BNT1VTTlJOTU9RVVFVUVJUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdWVllbVFBUVVhVVVpWWFpVU1JYVlVXW1hZXlxVWF5cXlxbXWBgXVtiYmNnZmVkYlhfYWJeYGdkZmVhXl9dXV5aWl9aX2dgXl1dYmhrYWdmZ2ZkYGJjYk9MTUxRUUxPVE9PU1FPUVtZV1dYWllYWVZdamRWWFlaV1ZTU09KTlZUUE9UUFBQTU1SUlBSWFRRUU9NUFRWT1hSVFVVT05NUVRVVVRUUlRXVltdXFpWVlFRVlhWW1tXUVRWVlZWWVRYWFZTU1lXVlpeWVxeXlVeXF5gXFtfX19eWmJiZGhnZGRiWGFgYl5eZmNjYGJdXFxcXFlaW1hbYVxfXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUU9VXFpaV1tbXFlaW2RxbWhkX1tYVVVXUUxNVlNNTlJPUVJPTFBTUlVaVVNQUE1RWFdSV1NTU1hNT09RVFhWVVVTVVlYW15dW1tWUU5VVlVbW1dSU1dWV1hWVFlbVVRTWlhXXF5aXl9fVGFcYGFdYGJfXGBdY2BjZ2hkZmBZY2BhX19lZF9gYltaXFtcWlpZWFdcWlxbYF5fW15eYWBfYlxZYFtRTk9OVlFQVFFPVFRTUFdcXFxYXlxeVlteanF3eYBjXFtVVVdQTU9WU05RUU9SVFJMUlRUWVtXVU9ST1NYV1RTVVJSWk9QUlJWW1ZXV1NWWlhcXVtbXVZSTVRVVVtcVlJVVlZYWVNVWlxVU1NdWFpdXlxgYF9WYVtjYl1hZF5cYmFiXmNmaWRmXVtkYGFgYGNlX2JeWVpeW1xaWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVUUlFXUlRQW15eXVtgXGBVXF1oanJ9c2xnW1RXV1FOUlpTUlFUUlRVVEtSV1ZbWVpTT1NRVlZWVE9XUlJaUlRUVFhdV1hZU1hdWF5dWVpdVFROVVZXXltYUlVVWVlZVVdaXFZUV15aXV1gXWJiXVlfW2VhX2RkXl5jY2FdZWZpZGZdXWRhYGFhYmRgYl5YWl9aXFtYWFhXV1tZW2BcW1tcW1hZW15WXlldUU9PUlpQWlRVVlZTVFReXmBeXmJcYFVdXmJreXRsfWtaVFlUUFBTXFRVVFVUVllXTFJbV11bXVJPVVNYV1dUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSVlFZWFlfW1pUVVZaWVpXWFpcV1VbXl1eYGFfY2NcXl1dZWFhZmReXmRjYFxnZGhlZGFfZGFgYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1BWWVFdVVZZV1dVWF9fYWFgY11fVV1eYmVldYF6aFdYWVNVU1ZbWFdXVlZXXVhPVV1aXl1cVFJYU1dXVVNUWFJTVlRYV1hdXlhdW1ZdX1hfX1hcVlFYVFlaWmFaXFZXWFtaW1lZWltZV15fYF9jYmFkZFxiXGBmYWRmZF5fZGJhW2ZjaGVjZmBmX19hYWFhYF9eVlVdWVtcW1lbWVhdWltbWFhZW1laWl1fXVRZXVVOU1lWU1xUVldZVlZcYGFiY2BjXl9WW2BkYV96dW9oWVpZVFdUV1taWltZWFlgV1BVXlxgYFxUVFhQVVdWVFZXUlNVV1paW19eWl9cVl9fWV1eWV1VUlhXWVldYlpeV1hbXFtcW1taXFpaX19gYGRiY2RkYmRaYWViZmZlXmFiYGNdYmNpZGNnX2deYWFjYWFgXl9YVFtaWltbWFtYWFxbWltYVllYV1xbW2BdVl1dU09WWVZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5cXFpWV1hZXFxdX1tZW2JWVVheXWFjXFJWWVBXV1dXV1ZTVVRYXFxeYGBdYFxXYV5bXltaXldVWFhbWl9gXF9ZWVxcXV5fXFtdWVtgYV5gZGNkZWVlYlhjZWRoZ2ReY2BgZWNcZWlkZWlfZl1jYmNhYWBfX1tYWVpZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldZWFtcWFdZXmBiYWRhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1laWF1gY2RfUlhZUFdXWFlZV1ZXVlxdXmBhYF9iXllhXV1eWVxeWVhVVltcYF5dX1taXl1eXmFdW1taXGBiX2JlY2VmZWZiWmRmZmlnYl9jXmFmZFloaGJmaWNlXmJiY2FgYF9dXFpYXFlZWFhaWFdaW1pZV1hVVVtdXV1gYGJieEtYV1tZVlxbXF1aV1xdX2BiZGFiYV1gWGJjYmFjYWJdW1xbWFdcXF9dYF9dW2BkXVxYW2JlY2FSXFpPWVhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl1ZWFRXXV5fYF9gXFteXmBiY1xcWFxeYGJiY2VkZmRlZmRcZWZnaWZjYWJbY2dfXGloYmhpZWRgYmFjYV9gX1xdXFlcWVhXWFlYV1xaWldWWE9YWl1hY2Vmcmt/SllXXFpaX1xbXltYXVteX2FjYmFhXWJbYmRiYGJiYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF5eXllYVVtfXl1hYmBeW2BhYmZjX11UXWBgY2RkZmVnZWZmZV5lZmhoZ2RkYFplZ11hZ2hjaGhmY2BiYWNiX19fXV1bWltZWFhYVlpWXFtaVlZVTVhXXGhpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhIKCgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoKCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5ent7e3t7e3t6enp6enp6ent7e3t6ent7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7enp6enp6enp7e3t7e3p6e3x7e3x8fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1ryGiYmJiYiQzNPS0tLT08S9vr++vsCiioyMjY2OiX9/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMipTd5uTk5eTl08zMzMzMz6qNj4+QkJCLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh4eHh4eHd3d3d3d3d4eXl5eXl6d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYOEhISEg4OCgoKCgoKCfnx9fX19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnV1dXl2dnZ6e3h7eHd2d3p3eXl6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7eXl5eXl5eXl5eXl5eXp7e3t8fHx8fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3Z5fXx8e3l8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomNjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3dnp9fHp7eHx6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4SCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd2e317eXt4fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enl6fXp5e3l8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh7eHl6eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaEg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KBgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgX58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqIhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKCgYCBgYGBgYCAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKBgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGBgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3Nzc3JycXBvb29vcHFzc3NycnJyc3R0dHNxcXFyc3RzdHR0dHRzc3Rzc3N0dHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3NycXFxcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Nzc3FwcXBwb25ubm5ub25vcHBxcXFxcXBwcXJvb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnNzc3JycHBwcHBwb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFxc3FycnFwbnyCb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFxcXCHhnBycW9ymIJucHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcX2hgnByb4uefG5wcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxdZ2hd3F3n5x9b3FxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcXBwcHFwcHFxcXFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJxmKiQb4KjnX5wcXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh3d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgYN5cnNzcnJyc3Jyc3Nzc3JzdHKTqaR5iKCdfHJzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/gH5+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fXx2dnd3dnV4enh4eHh4d3h5eZ+0qaSoqJd9e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGBgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt8e3uJr6ahtauso357enp4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX19fZillqGyoJmnk32Af319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgIGBnJyOoK+gn6KfgICBgH5+f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYeHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/gICBgYCXmo6YsaGYlpyFfH5+foB+fn5/f35/gICBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6MiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5+gIF+fp+rpZakm5uWoJ+Gf359f4B/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIqKiouPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGBgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgoODho2fsqiioJidnaaoraigmZCHgYCAgYCAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMj5GPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4ODho2grbGmm5qgm56cnJ2hpKOdlIeDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBg4uXmZeWmKCbnZ2dmZqXkImGhoeGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhISFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4ODhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYGGjpSTl5qcnJuUj4mHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6Tk5KOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICBgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhIODiJCTj5WYkoeDgoWFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKBgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeHhYaGhoeIkZORkI6QjpGRjImIhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgYKCgoGAh5uIi4eCgoKBgICAf4GAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOj4+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iIh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgIB/g4iOgIGCg4OBf39/gYCAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiYaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJloiEgoSCgn9/jJWCgoGChIOBgYGCgoODg4KDg4ODg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6Zi4OFhISEgoCRmYaCgoKEg4ODgoSEhYSDg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KTkI2MioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBj4yDgX9+fXx9jJyOgIKBgYKChJSUjIGCgYKDg4GLnJqhmoqCgoKDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSk5KPjYyIg4SEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGhoaGhoWGg4ODg4GAgoKCgYKAf35/f4GVl4mAfX19fXuBmIyAg4GBgYCOlIyQgYKBgoKBiZKQjJajo4+BgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYWFhYWEhIWCg4KDgoKDg4OBgICAgICAgJWfin5+gH2Hi36EhIOEgoODgo2JhYyCgoOCg4KTlJaYkpeenImBgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fX19f4KEg4OEhIuZlJqZl5aVkoSEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoaGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyKiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOJkYOEi4WCgYF+fYGHhoOAfn5/f35/gIOEg4SEkZWDiZaYlpWUiISFhYWEhYSGhYWFhYaGhoWGhYWGhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYWEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f36AgISFhIWdk4GBmJmYmJaLhYaFhoWFhoeHh4iGh4eGhoaHh4eGhoeHhoaGhYODhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiYiFhoWDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn1+gH9/f39/gIB/f4B/f4WFiKGgm5ufnpKNkIqHiIiIhoaHiImJiYmIh4aHh4eJiIaHh4eHhoaFg4OEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWFhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDg4GAgIGMiYGAgYGCgYGBgYB/gH9/fnt6gIiaoJqao6KbjIGMioiKi4qIiIiJiYuLioqIh4eIiIiHh4iIh4eGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJKQj5GOioaFhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKDg4KCgH9+fX19fX5+fHt7lKGXlpmfn5uYi4uJiImLiomJiImIioqJi4mGhoaGh4WGiIiIiIaGh4SDgoSHiIiIh4WCgoKDg4KDg4SCgYKDgoGEg4SDgY6TkpCPj4uIhYWGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoODgX59fX5+fn5+fn1+fX2BlZOQl5iTmJqXjYeHh4iHh4mHh4aIh4aJiYSDhIOFhISFhYaIiIaFg4KCg4WHhoeGhoSCg4OEgoODhIKBgoGBgYODhIOEkZKQjo+Oi4eFhoaEgoGBgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCg4F9fH1/gH9+fn59fH1+fHqAkY6PkI6TmJmKg4aFhYODhYSEhISEhIWEgoKCgYSEgYKDg4WGhYSCgoGCgoODhYSEhIWEhIaDg4OFg4KDgYKDg4SFhIeSkY+Nj4yJhYSFhIWCgYGBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgICAgX9/gYSEg4ODgoKAfX1/gICBf31+fn18fX17enqFkI2Mj5SXlISAgoKBf36BgYGCgYOBgoGCgoKBg4SAf4CAgYKCgICAgYCBgoGDgYGChIODhISCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGAgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fX+ChISCg4KDgn59fn+AgIGAfn19fX1+fXx6e3uIj42Nj4+Gf35/gIB+fYB/foCAgX+AgIF/f4CBgX59fX+AgX9/fn+AgH+AgICAf4CCgICCgYCCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYGDhIGCgoOCg4SFgIB/fHx9fn19foCAfn1/fn1+gIODg4KCgYF/fX1+f4CAgH99fX19fHt7e3p6enuLj42Qhn5+fn5/f35/gH9+f3+Af4CAf359fn9/fn18fn+Af35+f3+Af39/f4B/f39+f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEg4KBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH99fn9+fX5/f4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enp6eX+OjpSKf39/fn9/f4CAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/foB/f35/f4CAfn5/f39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6enp6eYOQjZWMgYKAgIGAf4F/gICAgYGCgoB+gH5/fn5+foGAgYB/f39/gICAf4B/gYB+f3+Afn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSEgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYKBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19fHp6eXl5e4eIlJWEg4GCg4GAgoCCgYGDgoODgYGBgIGAf4CBg4GEgoCAgYCBgYGAgYCCgX+BgIF/gIB/gICAfn9/fnx8iZSQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICAgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX18fX18e3l5eXl5fIKHkYSDgoSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgYKCgIGBgIF/gIGAf36Ok4yHiIeIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYGBgYB/gH9/gICBgH+AgYB/fn19fX5+f36Ag4SHh4SGhoaFhoaHh4aHh4iHh4eGf32AgICCgX59fX19fX19fX19fX18fH5+fnx7eXh4eXl6fYGHf4KKhIOEhISXl4ODhIF9foGBgoGBgYKBg4aIjIWDgoKBhIKDg4KDhYSEhYODg4OCg4OCgoKCg4OCgpGQi4iIh4mHhoaEhoWEhISDgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgICAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eHh4eIhoeHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eXp7fX98hZGDg4OEhJSTgIGBf39/fn6EjIB/gICEhpCJhYSCgoGFhYuCgYKFhYaGhISFhYOEhIODhIOEhISIko+MiYiIiYeHh4WGhYSEhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx5enp6ent/goCBgYOCgH59f397iJF8fI6WgH1+f4KGioWDg4SDgoOMiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenl6e3x5eHx9foB/gH99e3t/fn2ClZF/hIh9fH5/goR8fIGChIN/f4eDfYKBgIKCgIODg4SEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX19fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn5+f35+fn19fICBgH2Gj4F+fYJ+f36Agnx8gH+CgIGAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uUkIyLjo6NiIiHhYWFhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhYaHhYSAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx9fHl6e3t4eHl7e3p8goCBf4CBfX9/gH99gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJKNjY6Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gIGAf4B/foB+f39/fn+Bfnx7fHx8fHx8fHx8fH19fHt9fHx8e3x8fHp6eXt8en2Fg4OBgYF+gH9/gH6FgoF+gH9+foCFhoKAfn6Dhn99fH5/gIGAf39+fX19fX57fH1/f3+AfX9+f4yRjo2Njo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KEhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f318fHx9fn18fX19fX19fH58fXx7fXx8ent6fH19f4aFg4GAgH1+fX5/fouEgYd+fXx8f36Cgn99fH19gXx7fXx+gYSDgYB+fn5+fXx+f4B9foB+f36Eko2NjI+NjIqGhIWEhISDg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4F6fn58fn6AgH5/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fXt8fHx7e3p9foCAg4OCf35/fHx8fXx8gYN+jH58e3t9fn1+fX18e3t9fHt7e3uAhoSChIOBf4B+f4KCgn9/goJ/gIuQjY2MjYuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/f4B/f39/f3+Af4GBgH99gH9/fn9+fn5+f3yCfX59fX17e319fHp8fH2BgoGAgIB9fX18fHx8fH18fnt/fnt7e3x8fH18e3x7e3x8enp9en6CfoKEhIKBgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e317f4GAf35/foB/f35/f35/gH9/f39/f39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn5/fn5/fnx8fXx8fXx9fnt8e3x8fHx9fH18fXx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiYqJhYiSj42JioeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9+f39/gIB/fn5+fX+Af39/f4CAf4CDgoB/gIGAgIB/f4CAgH58eXx+fX59fX5+jIZ9fX57e4ODfX19fH18fX19fX19fH17fXx9fX59fn19fn18e3t7fHt8fHt6e3t6enp7fn2ChoiHiIqKi4uJjJGQjoqJhoWEgoKCgoODg4OBgYGBgYGBgYGBgYKCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoODgYCAgYGAgX+AgYKBf39+f35+gH57foGRjHx9f4qAjYx+fn19fX59fX59fXx8fX19fXx9fX1+fX1+fnx7e3t8e318e3p7e3l6enl6e35/g4OEiImKiImOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGBf4GAgX9/gH+AgX+AgIGCgYGEg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx+f4iCf36DkYSEg4F/fn18jYd9fX59fX1+fnx9fXx9fX5+fX5/fH18e3x9fnx8e3x9enp6eXl5ent+foCBg4eEiI+Oi4qHhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoWFhIKBgYKBgoGAgIKEgX9+gX99foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB+fX18fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp6e3x9fn1/goCJjouMiIWFhYSDgoKCgoKCgYGBgoKBgoKCgoKCgoGAgYKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgIGDgX+AgYSBfn6Af35+gH59fn6AgH6Bfn+Af39/gH99f39/fn+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e31+fXx8e3x8e3t7fHt8fH19fIqKiYmGhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKAf4CAg4F+foB/fX+AfX1+foCAf4J/gYCAgICBgH1/f3+AgICAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x+ioeHhYaIhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhIOEg4KDhISEg4WEgYGAgH6Agn9+f36Bf35+f4B9foB9fX19gIB/gYCBgYCAgIGBfn6Af4GAgIGBgH9+fX19fn1+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCIg4SEhYSEhIWDgYKBgYKBgICCgoOBgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgYODg4OFhIWDg4OEg4OEhYOBf3+Af4CBfn19fn9+fn5+gH19f3x9fX6Bf4CAgIKAgIGAg4KAf4B+gIF/gIF/gH9+fn1+fn5/fX6FhYGBgX+Ag4F/foGAf35/f4B/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgoB+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gICDgoGAf36AgH+AgYCBgH9/f39/f4B/gIGCgoKBf4CDgn9/g4J/f4B/gX+Afnx6e3p8e3yCgX+Cf3+BgIKCgYF/f3+CgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhIOChIOBg4GAgIF/f39/gHx9fX6AfX5/f39/fX98fn5+gX+Bf39+f4B/gYOCg4B/f4GBgYKBgYGAgIGAgIB/gIGBgYKDgYF/gISAfYGDhICAgX+BgYKAfXp7e3x8fH99f4B8f399fYGAgH59fX9+foKAgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WEgYSEhYSEhIGDgoGDgX+AgX5+gH6AfX19foB+f4B+fn99f31/f3+BgIF/f3x+gH6AgYKDgYCAgYOFgoGAgYB/gYCAgYGAgYGBg4OBgX+Ag4B+goOEgICCgYKChIJ+e3t8fHx9fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFhIODgoOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f319fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIGCgYCAfoCCf3+BgoOBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357fHt+fX1/f4F/gH6BgICBgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SFhISFg4KDhISDgoKCg4GCgoF/gYF9gIB+gH1+fX5/gIB/f39/fnx+gH+BgIGAf399f39+fn+BgH2AgIGDg4N/f359fn5/f4CAgIB/gYKBgH99f4F/f4CCgoCBg4KEhYaEgH59fH18fHt5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0dYaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX6AgIB/f39/fH9/f4GAgYCAf3yAf35+foB+fX5+gYGCgn5/fn1+fn5+f3+Af32AgYB+fn1/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKCgYKBgIF/fn5+foB+fX58foCAgH+AgIB8gH6AgH+BgYB/fYB+fn5/f319fX6AgYGAfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx7e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgoCAgIB9fn5/gH18fnx/gIGAgICAgHyAf4B/f4GAf399gX9+f39+fX18f4CAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/f3+Af36ChIKCg4WFgoJ+fXx7e3t8eXd7eXd4d3d4e3t7e3yFiX17end6fH19fHx9fX1/fnx9fn59fX18fX1+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgYGBgoCCgICAgH5/fn9/fXx+foCBgoGAgIGBfX6Af35/gX+Af3+Bf39/f319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l8fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f39+fX9+gICBgYJ/goF9foF/f4CBf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYR+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYGBgoGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBko16fH18e315e3p6eHqBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCBgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKBgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7j393d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgYCCgYKCgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoGAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHenh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fHx8fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgYCBgoF/gIKCgoKDgYGDgoCCgYB/f4CCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCf4CAgIB/gH+AgIB/fn2Af35/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgoKDgICCgYSDg4SBgYOBgoKCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgYKAf4CBgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx7fXx7fX54d3Z5eXp7fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KChISAgIOBhoODhIGChICEg4KCgICCgoSBgYKBg4J/gIB/gYOCgYCBgYCAf4GBgYGBg4B/gIOCf35/goGAgH9+gYCBf4CAgYCBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH9/hH19fXx/fXp9f3t6dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B8f35+fn15eXt6enp5c3J0b3dxd3lzd3uFgoKCgoOEgoOEg4CBg4OGg4ODgoKEgYSDgYOAgIKBg4GCgoGCgX+AgICCgYKBgYKCgIGAgICCgoGEgH6Bg4J/f4CDgoCBf4CCg4KAgYKBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/fHt3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhxeXR2eHR2e4SCg4KDg4SChIODgYKChIaEgoOCg4SBhIOBg4CBg4KCgoKCgYKAf4GAgIKBgoGCgoKBgIGBgYKCgoOAfoGDgn9/gYSEgYN/goKBg4KCgoGEg4OEgIKDgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgYOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBf4CAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISBgoOFhYWDg4KDhIKEhYKCgYKDg4GCgYKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCgoB/gYOCf4CChIODgoGCgoGDgoKDg4ODg4SAgoOCg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoCBgHt9gH58eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGBgICAgIKBgIB/fX18fX18dnJ3eHh2dH92dX2Hh4OChIWDg4SFhIGChIaEhIOCg4SEgYOFg4KCgoODgYOBgoCCgH2AgIGCg4KCgoKEgoCCgoODgoKBgX+Cg4KAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCf4OCgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18fHh2f3Z3f4SHg4KDhYODhIaEgYKGhoWEhIODhISChIWEgoKDg4SCg4KDgoKBfoCAgoKDgoKDg4SDgYKCg4ODg4KCgYGDgn+Cg4SDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH9+fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiGhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGCg4SCg4OEhIOCg4KEg4OCgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYODgoODg4GEg4GDg4SEg4SEhYSEhIWFhYWEg4ODf36BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH99fH6Cf39+fn5+fX1/f39/gICAf4CEhISDhIWDhIOFf36CiouFhYSDgoSFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhIODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoSFi4iEhYSEhYWDh4aGhISEhIWEhISEg4SEgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF5g39/f36EhIKDgoOBg4SDhISFg4SFhoSEhn2Den1+f4N7hYOBhIOAf31+f35+gYOBfXt/fX6Afn18fHx9fX19fH19foB/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYOKiIWFhYOGhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICEanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYSCaHpyc3N8gHKChH6Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fXx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSCgoSGhoOFhIaIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4WEhoaGhIaEg4SEhn1we4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd216c26Ah3ptfXJzdnN2bW53bHB5bHV9f398foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgYCBgICAgYCAgIKDgoKDhYeFhoCChYODhYeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb2x3fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gX9/e39+fYB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhYWFhoaIhISGh4iIhoeEhoaLiYWEhoeHhYOFhIWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhXluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYF/fn5/f396fn18fn1/f359gIGDg4CCg4GChIKBf4GBgH1/f4F+f35+f4GAfn6BgoCAgoSHhoODh4SEhIWHhoWFhYWHhoiFhYaFh4eGhoSGhomIhYSJioiFhIWFhoWDhYWEhoaGhoaGg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGEgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomJh4WFhoWGhoWGhoSGhoaGhoWGh4eHhoaDhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhIOFhIWEhYSGg4WGhYWEhIWHhoSEhYaFhX13hYOEhIOBgX5/fnt8e357fH1+f399fH9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYeGhYWDhIWGhYSGhoeGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoWHhYaGiIaFiIeHhYeGhoiFhYaHhYaGhYOChYWGhYWDhYOEhIaEhoaEhYWDhoaFhoWEhoeGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1+fnx8fn2Af31/gH5+gH99fXyAfX5/fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIaFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFhoaFgoOFhoaEhIOEhIOEhoSGhoSFhYOGhoWGhYSGh4WEhIWFg4SHhoSCg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fn19fH98fn58fYF/fHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhYSGhoeGiIaEhISHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWGiIWGh4WHhoeGh4WIiIeHhYaGh4WGhoWChISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDhIeDhIGChIWDgYCAgHt7fX18fHx+fXx8fH1+fH18fn18fH18fHx8fXx+fXt8gH99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoaGhYOEhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhIaGhYeHh4WHhoiIh4eGh4aHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDhIKCgn+Ae3x+fXx8fH59fHx9fH17fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGh4aGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIeHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHhoiGhoiEg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCfn98f35+fHx9f318fX18fnt7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoaFhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoSEhoaHhoWEg4WFhoaGhoaFhoeGhoeHhYOFhYOBgoKBg4WCg36BgoF/hIJ+fn6Afn98fH1/fXt9fXx+enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x8iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaEhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeJhoaIh4eHhoeIhoSGhoaHhYWIg4SFhIaGhYeFhYSDhYWGhoeGhoWGhoaFhoeEg4SFgoGCgYCEg4KCfYGBgH+DgX5/f4B9f3x9fX59e359fH15enp5e3x9enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYaEhoWFhYWFhYODgYOBgIGBhYJ/gH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4aGiImGhYiHiYeGh4eFhIaFhYaFhIeEhIWEiIaGiIWFhIKFhYaFhoaHhIaGhoWFhoKDg4WAgIGAgISAg4B8gYB+foOAfX9/gX2AfH1+fX57fn18fHl6enl6fX15ent7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoGAgoGAgICDgX5+f4B5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhYWDhoSFh4OEhoWEhYSHhoaGhYaEgoWFhoaGhoaEhYaGhIWFgoKDhH9+gICAgYCEgHyBf31+gn5+gH6Afn99fX59fnt/fXt6eXp6eXp8fXl6e3t7enx7e3t7fH19fXx/fn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhYaGh4eHhYWIhomHhoSEhIKFg4OGgoOFhYSGhIeGhYaFhYODhYSFhoWGhISEhIWDhYSAgIKDf35/f39/gIR/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5eXp5ent8eXp6ent7fHp7e3t8fX19fYB9fXx7fYB/fXyGg4aGhYaGg4SChYKFgYGAf3+AgH5/gYF8fn9/fn+AgoKChISDgoGChIGAg4KBgISFhIKBf4CCg4KEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4SEhYaEhoaGh4aFg4SEg4SFhYWDhIODhIKEhIB/goJ/fX5+fn5/hH57f3x8gIF+gYB9foN8fn59fX57fnt7enl6enl6ent5enp6e3t8enx8e3x+fn1/gHx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+Afn9/gnx9f35+f3+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYKGhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eFhYWEg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgX6Cf31/gnx/fn19fHx8e3t6enp6eXt5enp5enp6e3x5e317e35/f4GAfX59fn1/gICAhoOEhYSFgoSCgoSCgYCCgH59fn9+f36AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWDhYOCg4WFgoSBg4CBgIGAgYKBgIGEg4OGhYWHhoWFhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx8fn18foN9e358fYB/gIN9fYCBf35/fXx8fX17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH9/gH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzMzMvLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs+QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTU09TU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT48Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPTM2Njo7PDhDPEFBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbLy8vLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTU1NTT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDs5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5HqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWy8vR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX2NfX19rb2tra2tra2tvc29vc2dfX19fX19fX1tbW1tbX2tva2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhkSUlMTkA5OTo0O0A8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1NRqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1svMg21wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSNi4uLi4uLi4uLioqKiKG/vb29vb29vLy8vLy9tIuKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXJsaU5SYkxMVk08Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLUEae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fLzU4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWFJTU1NTU1NTU1NTU056rqqqqqqqqqqpqamprJtUU1NTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h3bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9QkA5PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXy81SLDExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmnlxWV1dXV1dXV1dXV1dTfbCrq6urq6urq6qqqq2dWVhYV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8Oz46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX18zOXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqqJmYWJiYmJiYmJiYmJiXoWzr6+vr6+vr6+vr6+xoWNiYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTo6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjMzcTCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs7Ozs7Ny8zMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMvLy8vO0tLS0tLS0tLS0tLT09HMzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojs4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzc3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7O0tPPz9DU0s/Pz9PSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfX19fX19fX1tbW1tbW1dXW1tbW1dbW1tbW19bW19jY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O0qucz9HIlKfS0ceSq9HOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQkA9PTw9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0racpaTRmqycsNGZrJqy0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz86dnJGevJWInJ7EkoadnM3Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj48PDk2P0I/Qjo2NDg6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz9G/mKCbsq7ByZiYxbzJl5nF0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0I6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/TtJmWqrik1pSWn87Rkpmhz9DQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD08OTY0Ojk4Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyqCjv8qcpYynrdiqmarUz8/P1KuafqOPpLOfw5varaO/ntXR0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjk8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NSsm6eLlaHQipKex8uIlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tfX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENHREFBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DTtrKypZmq0dulmbPQ26OZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GSbF1cb2doYl1PRj9ISEZFQDw8Pj48PT08NzU2Ojk2Ojs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cSimZadq5KnmqCtkKeYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LiroMfVoquknbGkpaigr6eiqZ3Q09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0tAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT08iRjbTWnZKNutWako6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVpaltMX01KTEpVTEZCPDw/RkVHS0g9NjY3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj47PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHUyMHV09O5x9XT07nI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FETExAPjc3NTo4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0dPU0tLS1dTT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPT03ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEQ0k7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRklEPEFBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDg4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT48SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDREVDQUxINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFFBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb2tra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4ODk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg6ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk5Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvN3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcXR5gIJ3dHyBhIJ9c3CAin94gn95g8je29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHV8dn2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODY1NDM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vb6/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODQ3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs7Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6NzY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEY+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY2OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubq5ubi3t7a1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY2NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7W1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e2tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3t7e3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLe3t7i5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CQD9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6yvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqamop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e4t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEFBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WlpaWlpqioqKiopaeoqKeoqKeoqKmqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3tre3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NjU3Mzg6Ojo6Ojw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87O0BDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WkpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSlp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSko6Kio6KhoJ+fnp6cnJycnZ2dnJ2en6CioaKjo6OhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXmJeWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0A/QkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2epKShn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzU3ODs9ODo6OTk7PTs7ODk+Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6emoJ2cm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTkpSUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqamp6enpp+bmpuioJqWl5Wam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampqSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4OTo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8+QUE+QUE/Ojk9PjpQnaCfnJucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36amn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenp6WkoqGjp6alpaOipaampaanpqagm5mboaCXkpOSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpKampaWmp6amop2cn6Gfl5GRkJSXmp2YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgoJ+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc5OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpKanpqWlpqalpaOgoKGhoJmSkI+Wm5menJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKCfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKTkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTk5ODk8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqOio6SkpqalpKSjoqGhnpyblZKUmJyam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn5+goKGio6OkpKSkoqGhnpuamZehtZ6ZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg2Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamZeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoJ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKCgoqShoqKhoaCenJubm5mfq5ucmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njo3NTY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoKWzrKCgn5+enJmZmpqbrmp2nZ2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcm5qbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6ChoJ+mkpurn6CgnpuamZqZqIREf5+enpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uamJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2eoJ5inKaenpyampucoaNRR4OgnZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ojs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udm5qmZl2joJuamZudnK51SUyGoJycnZybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFE8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw+OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmYpIBSeKKZmZqdm6CkX1ZOh6GcnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaChn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkXFxRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycm5iYmaCIW1+UmpmbnJyjj2RaTIGinp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtbTEY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJmfl11ddpeanJ2dooFkWU1+op6enp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5uanJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzk4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmZpgYWCAlp2cnph0Y1VOgKKfn5+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZmfaV5bZX+cnJ6Mal9QUoaem52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7QkBBQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqXk3NoYVR2k5ech1xWUFeKko6SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGRjpKanpJ9oKOWpJxuTE9jhoaCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDgISgnY5/bJallZ+AiX9fcn+AgpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY5Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn+Aoot8blJ1nIyMWnF9fH59fIaOjYuGjZSRi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqFgIJ9mJp3WE9McJSGgkxgcHF3iIWKjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gH56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRi3+IjYyLi4eRjaONVS8wPXeHd3ZBRV5rbYSQiYmQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVUYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZCeoZ2Tl5uhmp2boqacZ0FaSDt3eWtnRTA4WWxzkI+LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVF9NSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqamvj0pvoXhBe3dkYVBRW0dgboqhoaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKmqaeoo3hgwNamQ3uMgHVPbY52U2R/o6inoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSnp5mdpKWjop1if73Ar3eeo5qUZUxheG1RdJWioqChn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZWRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKhoqehpq6mpp2eaoScuo+m0KGZsahYTKyTU2WPoJ6goJ6doKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaiqrbGyr6uiooZ3fn1yz8mxm6eva1WqsGJah6afpaKhnZ+imJWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVVxoZG9jbWlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Gem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqp6+3t7S1trOtrq2PhoNuj825lZGjl3RUb3pzbnuVpqqno5+eo5udoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEA/QkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrsre7u7u5ucG4tLWgiHlkWZ+3wKapnYh3a3FveHh6fYaOkpicoqWmq6WkmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh2a3FoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tbfBxszPzszJvrOkkHNmUkSLl4mJiH54cW5nZmxpa3FycXFydHyMqcTEu6Knqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWlhZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8XH2+Pj2su8r6SXiHRZWlFDaXpsb3Vua2VlWVdeWFxjaWloZWBoibTAwLmpr7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdvbVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGvs3R1cq5p52UhnJeUVRLRFtmXmRrZWFgaFlUWFJWWFlcWFp0mba7q7SyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4R/amZoYWtsZ252cnJ2cmdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/CwcfLyLeUdWVVUE9USD5ea15fZWJgXWRhU1ZWVVNUV3Kbq7CqqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dWtsbmRvbWlxeG95amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7m4w5thSURHS0Q9W2ViYWhjYFtjX1dRTk9PVX+0uqyupaSjp6SgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+dlJOJiX6GiIyWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3dua2lodlpnc3hzemdnXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMTEwsTBrYNPRk1FO01bX2VrZV9bYFlYUk1Uf6KqubWyrKmjoa2qrKetn6y0tL/Dvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXZ2ZWZqamhea3BueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx8LGlmpYRz8/R15jYmpgWlhXU1V2mba+u7y6vKytpqm7urm3v7O1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq6yxnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhaHZoamp1bnlsXmRbVmBZTEhENjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc7Fxsa9qXJQSzBYU1VmYVNOT3CpyMjCxMbAvL60sbCwwb6+wcbAvre2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2vtaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46LlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cn14cGdga2p3bWlmdm90Y11jVVdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXCw8LBvJE/T3Z+iVZMb6TL1MW2v7/Av7q7vbWzs8C/ub/CucG3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enmAc3BmZWdkbGVia25vb19ZXVdWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK9vMWnd2uDkJhvqcjIx9HBr729uLm7u763tLG6v7S8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXqDeG5mYWViYWNkZGpjZ2RbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8C6v8C8u8W9usDEv72+r3NlfZGLidHFv7/Jv7DBv7q3u765tbi0uLy1vbi1tK+zvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFjY2hrZ2dqZmpeVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1o23v7vDtbrHtrW4ury4ubaqo5iOf4PJv7+7wb65xr3Cv7zFuLe3tLi2try7uba0t7q1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWdvamVsaFlZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+8z8R3p8y9x7e5t622tLe5s7WxvMnDlUt6yr6/vr28v8jDxcW+x7i2s7W9uLi4vru6uby7urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25xZ3FrdGZjbmBcVUhLSkRKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNavdH+6yM/CwLiutLS7vbe5sb3Dyo9DdM3Dwr++vbzHzMfHxMe8tMDBwL27vMDDusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWZsam91b3hkaGNcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCxsnSmnFyq9LRzMrEtbq/xMi+vrS/wMB5Um3LxsK+wby/w8zKx8XGwbnCusW/wL/CyL3Hx8bFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRwbW10bG1vYGNfYmJOSU0/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xNDDur68xL63vMC/yc/HyMrKwodyc6PLzMvNysbCw8vOwby4vbqxcGNiu8jEwMC/xMDKycPDw8O7t7TBucC9wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdpqGfm4J7eoh7bW14fGBxZFxfYF9UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7ur2sO+tr7Avr66ppypsrbDv6V6dniaxMfLyMHDwMDJysG/u7mxoX1zaq3IxcS/wMG/y8fDwMjAvayrwLO7u8G+wMrOysS9tby7ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem5zeXRocF5cX11aUkZFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8S5bazOvba5wLyrfm5obmxygZWYc3d8l72/xsC5wLy+xcS9vbixsJmQfoCbysLDvL2/v8PDvr/Ivb+llcO0trW9vr7OzMzCuLK4uLe9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdtdXtxb2pcYGFaVFFBRklHS0BFQ0k8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fm52bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNtHaAs722tcKlh2laXWBNUltabnN3gJ+4uMK6s7u3u72/uru7rqSbmYiRfsDEw768v7u7uLbBwrbCoIGntqqwvsK60snIw7GwtLS1vLm+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytry0saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnd4bnJhX2ddW1VKPT8/R0c9R0NDOTo1Ozk5Pjw8OTo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaiEeImgr7Wea2VmVlhfSUlNUFNsd4WlsLe+ubK1sru5vLa5vrSVnKeWoXCuycTAvb+5s66yvbuuv59yeqONk5yfpcPCv72sqq+tsrq3ur67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JtYGRiXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8WriHx2jKCZYFRDV1ZIYWtWT0ZJYI2gq6+2urW0sqy8ubi1uMG9i5myo6ZypcvCv7m6ta6lrLOwprSheYSnl5GPkI6OmbC0paiprsG1s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnNvZF5oWV1eU09OQj9KQ0FLSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmpGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/tZGCeIiPb05KP2NaQU53gJRrTUFcgbC1s7WytK+su7q4trm/xnaEqp+bZae/uLWysa2tn6Snp52nqrrFy9PApJCUl4KDoKCkpbzErK6nsKuvsbGtsa6ur7mwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZ0bXZqbF1ca1VeXFBOSERHTUJHTkc4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiEe1hGQU6GWkpKWHaNgGNAUqK5s7SysLGtsLm4tru3ur2QorKspHOrsKmrraujqKCdnp2YmM7m4eHf1cankYl5bXGXoanBpqiooaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xrKqprq+wraWmqqSos66tq6impqmrpqqnq7Ksr7Oxq6mWgX+Bd3J5aXV0b2VVYmRYXVJPTUlASVJETkM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7G7qpmZlWlOQFJ4cVBJSUtnm4FZRVGtu7Gss6+urK22trK0ta6ppp+am52fpqieoKipn6GnlpuWlZvbz8bGzM/Mv5t9bGple6XGqpeiop+fpaCkrKWmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqppKmrpqmsq6ahiHmDfHZ/emN4bW5cUWlVUE9HUE1NQ1BSQD47PjQ6OjU7Oj07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaqlpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovMKrpL5pRVKcglFXSUlfS1OOYGNigK61qrK0rqqrr7Cys62lnZGXk4+YoJ+ioJyjpJ+dqJOZlJOunGNykLTGx8erfGlpbmaUtYubnp+hnKGfo6innKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclpOPj5KRmZCWlZiXn5ibmpukmZeUlZqdoJ2nqKWgo6Kho5+coKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn59gHV2fW5se2RoVlNkTkpIR09TTktOSDxFQD0yQDg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62trq5ure3u66ooKGpoarGv8qhUEFynnhPbktLYmV1c19aXnCPsa+us7Wqpqyso5uZlI2RlZeYmJyfoqKcnaSemqSWlpaXoUstSFqIs8LBq4Bxg4mDeH2Uop6fpp6dn6OmqJ6jpp+qnaqtqq6nqLClo6Smp6ymoaWim5mer6iusqumq6qgm5iYmJWTlpqTlZaalpuXmJihnpycl5uhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoZ+gpaKmoIl8gH53eXxleXlhYlNWYUlJS0xTVUpTUU05PkE2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZ2jx8ePV1NJZKNcZX5vcl1Qa2NbZF9da4+0sLC4rKahnJ2alJiamZCOkZWRjI6Nk5minJeimJmVnIRSa39pYJSvrp6DgZ2eo5p/qqqlobCjmqOmpqqioaqiqaSosquxsqu5qKarp6urqKysp6Ggo7GusrG0qrKvo5mcnZ6hmJubmpiZm5WWm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaiip6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaYJtZVxTW1pNUktPT1ZNVE1CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6KanqukjXpVaHJ1dXFidnZYV2NgY2dZWFdlrK6sr6efnqKhl5GUnKCcmZiSk5+coaOanpqWnpmdlph8a5Cii15wmZiPi42eo6Wnp7e1sKazrKGtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztbizuK2ytKSgnaWgrKGhoqGgmpmWlqCcm5iloaCeo6Ggn5ucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYN/fHh2and2Xm1bUmFJUlZIRlZXS0NNSD1LSThGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamorqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6KhoKSAboJwYGNYTFtTWk1MUFhSSE1NR5esqqmloJ+akZKUmJiWlpWMiIuOlZ2cnZyelp2YpZ+RgYCzysqTYoOFho+IlaCjoa68vristLSwt7CutKmmpKWsqbmztbvDvMPBt7u2q66xuLe8r7OwtcG8t76zs7WirKKpqbKpq6inqJqZnpqqp6CZqKCfn6iopaWfnaqiop6bn6igpKetmaCjnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYaFfnZybWl3bWhuXVhbQ1dOSkdNSENGTj0+TD40PDo2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqZSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco5+dimJXXmVgV01RRz4+P0NDPz5CUXioramqpqCen6Gjnp+em52clJOVlZ6emJSFnZmfmaqljX6BsNTSsXRhc3uDeI2WmZWlwMC+tbm7wMO5vbusrqexrbHCtrjCxsDIysDKv7C5ub24wr64tLvGxL3DvLi0qrOtqrO0r7Ouqq+jnqyot7Kto7CmoaOwsa6wpKWuo6GgmqGmoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXx0cmtsdXJxaFdcUUZVSERKUEk/RUI0Rkg5Njw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PDw7Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+flX1gXmVgUUdEPUM/RTw/OTZOf6qzp6SjoqCepaymn5idlZKanpmVjIqGiIZ4bIafoqGprZB9cKTVlHuHS1pwdHGCg3p4k73Iwr/EyM3QyMvDsre1vrK+xbu+zM3GzMzM0se+v8DCvcfHwrjEysnEwce/urS6u7W7t7C2squ7sq67t8C7uqu4rauquLu1vK6uuKOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlZSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtkaW94a2ZaXEZMTUVEVE1FQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QD9BQUE+kqugp66noqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1zamFXTkU+SVl8cGJCPVyOrqyhmZucnp6Zl5eYk42Pl5eUj42QjIKDgnZycGxvjaSrrq6OhWaDqH98dl9iYGRpaGNbUnbAysTEy9DS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysHGxsbKyM+/ydHNx8bJxsK9xMG/v7+1vrOtv8DDxMjFyMSvv7myuL3EwsG7vLy1rqenrqigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dXNlYmdyb2dfWlpET01DRlFJRENBNTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+OTtBQTs7Pjc4Njo7PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56bnZZrZl1USURAP0uFnqWahKCyraOenJ+amJeUk5SXkZCQjYiEhImHg4CBgYB5cXFuanaitrKXdH18enp+eXuShGVcUGxpWjxuzs/QxM3U1djR183Gx8nMw8XKz8rS19LX0tXW09TIzMfMzcrTzc7TzcbJysvCx8zHycnGv8Ozs8jFy8vMz8fKv76/vcHHxczMycnAw8CusLOonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5aQjIaRi4B7cnV2Z2Nnd2plV1hSRE5HQElRQz5CPToyMkE8RTw3ODxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njk6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGdY1NMSkRDP0JSrdG9sq+mnJycoKShnZqUlJWUin15cWxlYmhycHJ7hYqAdXBtcHJthKSZhmV8eHd/j5eckGloZmSopXU/pNjP0cLP09bY1dXSy8nO0MvGzdLK0tXX2dbY09bYzdLKztHMz9HN09DAycjLxMzNzM/PxsfItsDLwNLNzNDHysnAxMPIz83Q0c/NysjNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNhZXNjXVJcSktHQUZJSj87QTg+NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGlpaCio1tJQEFEQUZQdbGvppqUl5+cmqCgnpudmpWJd2lkYV9gYF9eX19dYWx1c3BvbmtwbnKEkIZeX15ZV3GDfXxcU3FVireJY8/V0tDM0M3T19bT1dDP0tPRydPRyNDX19jS2NLX2dTWzM/Pyc3SzM/RwMfEycfPztLR0sjMzcDLzcbUz83PyMXLx8fJzMvU1NHVz9LM08K5xbGlqLWuqJuoq6Wdsqiws6ysk4+TjoiKjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZRYEpKQ0ZDU04/PD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjw6PDc0Oj48P0A9RkFEPYKknKClnqWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fX1NXZ2dHO0L+8zMm2vq6nqqiho6xnQzg9PkRYgqqon5eVl5manJ+dmJudk31xZWNiX19hX15hYF5hYF9gZW1wcG1qbW9zdIZ+T09SSlFve2x+bFNyWpKsgpHQ1dTQyc/M0tbS0dbNz9XV0cXR08rQ1NXWztPR2NfX18zIzsTKz83KzcDKwcnKzs/QzNDOzszP0MjM0dHLzsvDysjKzcvM0tPO1NLR0NDKvci5sK67ubWrtrCtqLits7+7sZqOoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcG9rYWRucGFYXFtJRkZFTVlFO0A9MzM8PDg3ODY1Oz5APTk8PDg8Pjk8QDtAOj04Pzk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cgo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSyfEhGQjtWjaGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGBgXl9fXlxibXJubXFxcnJ2cVRPTk1cYXVmeoV2WWeDjHSezNLRzcbOzM3Uy87SzMrW1tDM0NPLzNDS08rO0dXS1dbKwMrCxs3DycrDzcTGycvLz8vOzdHO1MzHydDNycfLxsfCxsrMztHRx9DPzc3M0MXHwbi5vcPCvcO5srK+sLvDw7WqmKWhmJaRlZWSi5SNmpGUlI+PlYKJhnlxcmttaGBgcWhZWGhWTUdNSVFRQjtEPzs2ODo4Ojs1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4ytXW2drb2MzMz8jW1cTCta+0qKCtl3hsb292j5qNjJeVkJORkZWWlZCLe2ViYmJgXV5hY2JgX19gYWFgX11bXWdxcW9wcW1pbXJxXUpDTU5dW2BxYkhdb2dWkcbNzcbExs3K0cfKzc3F0NLPzczUysfKzs/Hxs7Sy9DPxbrEv8bKvcPHyc7Fw8jAx87IxM3LzdDJxcXQycbCxsnFv8HIzczMz8PKzMnHzNDExci7x8PJycLPwL28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Vka2BeZnFhW1dgR0lIR0lNVUc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62ktn5ngoahqZONjZaPhYODg4F9hIR/c19bXl1eYF5gY2RjX11cXl9gYF9bWlxha3JwbW1oZ2lpd4NgRkRIR0I/TUxRVGdeTpe9x8TAwr/Cx8nIyMnHv8TLxcfKzMnEwcrJwcHLz8TLyL+5wbzGyL7Axs/LxMDDu8rHyLvJxsXKwb7Cy8bFxL7Gvr3BxMbMxsW8v8rDxcfSxcHJwMrKx8jG0MPDxsOuxMvHw8q3v7y6s6mspKWYn5iso6Gmm6Ogm5V8d3N1ZmpbYW5tWlxYUkRMR0NHRExERlM/NTQzMzVAPTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ovri8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76ysLZtXnp7nZGKkpaGeoCEhX91eHVycF9aW1xgYGJjZGRlZGBbXF5dXl1fW1laXGFucW1pZmdraGx+cVtNSUc4Rj9DU0pUZFiUr7+4uLu5t8DBwcO9vbi8vrjDycTGwbzGv7e6w8i/wcm7tru7xcO/vMLOw8a+vrXBvsS7vce8w7q1vcbEwsO3wLa2v7+8zcS9trrIu7++zMTCxsPGycfJxtDGwszHssfJw87MwMXCv7yyt7Cyp6ioubClrbCqrayUend4a2VoYGhvZFZeWUpGSkZIS0FFQkZKQDk6NjU4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWrt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTV183Kz8XJxcfBusW9rK6nYGN3gJKLiIuEeH+Ghn99g3t0dGNcXF1eX2BiY2JiZGViXVxbXF5cXl1aW1xdZ3Jva2RjaWlrdIFtWEtDTlc5Ok1GSFtUlaKzsLOysrKyurS7sLavs66xusG7wMS7v7q0sbq+wLjHuLS8tsHCvbi9xsHDu7Wvs7W7v7TFuLu1rLm9vsC9sbu2sLe6s8a9t6+8v7W3tcW9vsPFwMTGxsfMxb/FxrvHy7/PycfDxcHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkdCREFERj89OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MvNyMnIysnKxNDN0s/NxcfBxcG/urjJt6uwmltnb4iOhYiJenh+hYZ2d4F8c2hdXV1dXmBfYGRhXmNlY19eXFteXF1eWltbXV9rb2xmY2ZoaGp3e19PUVlFOThGSURKYZ+XpKeuqqiqp7KstK+xp62mq7K7ubXCubm5r6q0ubuzwbqvwLG9vLu1u8e5w7etqqiwssC2uL2wsaiys7W7vKuutqeutq68srCquLCuu667uLvAwb66w7/Gw8XAvMbBx8q4xcfFv8fDwrnExsK7xsnMy7O5wr27s4l0dndraWBibGlZV1dbQUxMTUpFQUM/RkE6Ojo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFzdLLw8XBxM/GzcHCxr/ExMPDysLJyr/AvMK6s7W1w6+qsZNbaX6SiI6Pe3h9iYV5e4SAd25eXVxcXV9gX19kY2JkY2JgX11aW1paXVpaWlpcY21tZmRkZGZnanpsT1pbREA7Njo9TYqakZSfpKqhpqGpqKupr6KlnqmstLWwvLivtq6nrbe0s7u3s7yvuLm1srvBssCvpamjq7Gzs6i9qquoq6yutbSmqK6hpbCps6enqK6mqLessbO3urq7sry+vr7Ev7XBwMfIt76/xbfFw7+7v8TCvsTIzMq/v8TAwKmHc3RzamlcYW9kV1ZYUEhaU1NLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPHubnLwcu+u8m2vcO+usq4wcPCtba8trGvtbyuqKuTY22Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX11dXFpYWVtbWFdZXF9lamRiY2FkZGhtd11MSlZWUVE+QnqdkY6HmZyloKCeo6Olpayem5qjpKuxrra2pq+rpqmzq7O5sLW1rba5srC6urG2paCloKaxqKypuaqlp6eop7OtoKemn5ykpayfn6ekoaGxra2ssrWzs7C1vLa7wcCyur7DwbG5ucKzwL3Atbi7vb68wsfEw8S/v8SghHhxbGJmYGtvYFVZX0hOaE9USEZLRjw9QD06Ozs4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBur22oJ6VnaCmurars7O7s8TPycvCxbi3x8DMv7jKt7vFuLPFuLO/wKy2vLKspq+0raGjkmlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYF5cW1xcWFlYWFhWWFpdXmNiYGNjY2JlZmtyV1BgZ29qWnyPloyLgpaanKKanJ2ho6GlnJmhmp2prqywtKKoqKmrq6S0uKy2r6yytK6zta+wqp+en6SisqSmqritoqamn6itqpmfn56ZnZ+lmpmjnJyesKmsqKqrrK2wsrivuLm7sLa8u7qrs7K5s720t7KxtbW/tb3AvcPCu7u9l4R7c2xfZV5kZFhUV15JV11LUEdKSkdBPD8/QTs/PDA1NjM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru4wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765yLi4v7eywrSxu7usurqxop+pq6eYnpBtfoWGf3hybW9ta2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYV1dXV1dYV1pdYWJjY2JiY2Rkb2xldHxvSk+CkJSKjIWTmpujm5eZoqSgopqdn5mXrKusrbCgpKGsqqahtK+wsayor7KnurOmtaCin5yjoq2joqq2qqKjpp6mpqOWmJ2XmZqdoJqXnZydnK2hrKijpKatq7KzqrWwsquyubWvqq+ysrO3s66pra6xt7G6trq9v7ezsZSGenZmX2ZfW1lWU1pVS1tRTEpFSEtJQz0/QkJAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7KdpaOYpbHDtba9rbS4wszIxr/FtsHAx863wMO9s7m5ssC2sbm7rbK1r5+apKqglJuQeH+DhH94b3F0cWhlZGhkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdVV2BiY2FhYmBgZGZxcXZ5YD5MYHKNiY6IjpiXm5mSnZ2moZydppuamKmkra6pmqGitqign62otammp62wpLewo7ego5yZmaqmoZqtua+joaScoqCfk5WhlJaWm5mYlpeclZ+pnqqkop2jqqqwrai0rKqmrbKwpauts7GwsK+vp6insq2xtLC8tLq3rqOUgnp3ZV9hV1lYU1JUS01eTFBMR0hNTEU9QD49Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+t72tnaenoqq7wL3Aua60uMHMyMXCw73FuMjMssHCwa68u7W7vLW5ubCwsaqcmqGqlZGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXVlVaYmJgYGFfX2BiZ3BvdFIxLCk/eI6OiYyUmJaakZubpKKgpKSdm52knamtpJ6gobWmoKCip7Khpaelr6Wxrqu1nqCdlZWpoaKUrbGxn6Kjnp6Ym5OLoJORk5iYkpaYmJeep5unoqKapKWlq6SlsKeloqusraaprq+vq6iqqrOmpquvtLGuvLaxsK+fknt4c2ViXFtdWE5MUUhSYU1WUE9KTk9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wvLG3rJ6lpqy4u7zBxbqyubXEycnAwsbFx7bGxLPBv8Wrt7e9tr26u7WyrK2omZmgpIyKdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZWUlRSVF9fXV5fXF1dYGFob25JKx8pRW+TjYeKjpuTm5KXm6GeqaKhoqGhoJqnqaKYnKKwqaCgnKSpnaeinqysqqmtraKhoZWYopqcj6uosJyfop+fl5mTip2RjZKTlpCYmJOcoaOcpaGilaCipKWbo6uloqSqpKqtpa2yqaalpqa1pqmorbO1tLm6r6usnoxzcXBhW1dWVlJHUU9IWlxPUkpUS1NMRUdKQzg7Oz08OTY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsa2dqKevubmzwMi6tcCvxcjMusHJzMi1yb2xvsPJrbG4wbW8wLy0taqsppaanJyJgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJSTlBYXFpbXFxcXVxfYmtqSjsvPUlch46FiYmTlJyWlpukpKakqaSnpKGWo6uik5ejraefm5ian56umZyqs5+lpp+jo6GUlJuWlpKpqa2anJ+hoJuUkIyZjYuRjZKNlpWQnaGgo52co5WboaOhmKKoo6Koq6Crr6SuuKWjpKKsraqoq6+0t7K9tbOrrpiFdXRpXFlZU1VSRlhMUVtYTVVPUExRUklPSUI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02ODo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraeztq6oqK+um6morLe2rLzKu7a/rMzGxbjAzs/Hs8S7t7vCyLGtuL+3vL67s7amqaCWmJmXiHp0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUFhZWVlcW1pbXV5jcGxNQk90bGuEgIuHj5GamZWapqSiqqilraKllpypnZOToqelnJePjpmdrZaYp6qYn52UpaCekpGSkZOVqKqlmpiZnp6WjoyLk4WIjYOPi5GVkaCeoaSZlp+VmqGinpSbpaWoqKigsLCnsb2nn6OstKqup6+0sLm1wLGusKuRf3N0YldUVU5SSkdWUFJSTExYTktMT1NHTktBQ0ZEQz5CNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/tKymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrG2uLy9wMOxsLG3rrS0u7O0o6OdnZiXlYSAdmtnbG5xbnFqb2tkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVFFNTk1SV1hZWFhXWltbYGlqZmxkdXZhe3yLgYyLkJSSl6OWm6ajoqibpJWdopiQjJ2hmZaWhYSRmqOPlaOclZaVh6Kam5OMjoqQmqWnm5WVl5yRk4iUjouBi42AkIuSkpKhmqCilpSZmJWippqNmaWnqKehoLSyqLO4oZ2jtqyqraSysqa1u7SrrLGiinp0bl5OUVFNT0ROTk5QS0ZOTkpKTk5RSE1KQUhMSUhDPjk1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg1ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLawpKekqqWgqaaks6qissS1tbKzxsW3usPKzMazrLq9tLjAr62psJ6mrruvraCam56VlYh8hG5fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSUlJQUVRRU1VRTk1LS1NXV1ZXV1dXWlxhZVpgW254ZXZyhXqFgYyJjJebipWXoJ6gl6OTnpmTi4WXmYtzjIJ9jZeVhZKZkJOOjXuZj5yMgomAipigo56Qk5iWhY6ClH5+c4qOepCHk5CQnZuampKWkJ6Oo6OOiZqgoaOkm6K0r6yvraCYprimpbChsa6csbyqqa+pmYR4dGRWTVJQUE1DU05MUE1CUFFISU5TTklKSkVLTUdLSz44NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI0ODUvMDEwMikoLC0wMjc2NDc4OTo6NjU6ODdBN3i3oaO0qKalqKOmpaamprKnprTBuK+0sMnEuLnAzsa+s627waytxK2ooaaSnaa3raOgkZaXkpB+eH9mV1ZfZ2ZpZ2huY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkdOU1NTVFRTVVhaXGhYWlhpcWtmRlBpiXqOf4WWkYaOjJuVmpWVlJGMlIh+koheO1Zue4uTiYCMkYyPhoZyi4SWgXmBe4aUnZWDlo6Qj4OGfZN4cW+GjX6JgZCOkJeamZOLkIqdiJ+YiIiWnpqhoJenrqmtqaielq2zoqWtma2rmKi0o6mtopN/dG5gW05TUldMRFRKUExMRk5PSUVMUU1LUEpJTlBHSko9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CiraGmpqqgp6mno6qwqKe0wrmwtbDHwrizvc+/ua+utcKnqsSqop2Yg5ScsaOamYeUkIuHfnN2XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNTlFNS0hGSE5RUUxPUlRVV1lgYFVTZGxjRjk4eo6KiHaBjYd/hYiXipSViZGFg5KEd4d+X0lQbXeKkYN9hIyKhH9/bX5/k3d1dniEjZpwUY2IioZ8fnmUdmd3hoh+ioiVi46Rk5eMhIqIlYSbjYKEkpuWnp2UpKOoqaWknpuwqqGkpJGmqpaiqpyhpqeKd25mXlxIUVFTTUlVTVNJTEtPSUhGSk5NTVVLUVJQR0pEPTc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjExNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aboqedn6Guoaeopaenr6yqtby2uLezwbu2p7nIuLaoqLW2qrK8p56Vjn+JlKmWlYt/joSDfnhxb1hNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERENJTk9oWU5RU1NVWmZdVmFpWlpRS4h9jYBsd397d4CHj36QmYuOeYONfXN+d3FtdHB0jY2Aen6JqoR6e2h2e45wcm14gYuNknh7gHuAd3NyknhodYWEhIV8lYuIio2LgH+Ei42AlIR8gI+YlJyWkZ+dqZ6goZ2gqaWfnZiNp6SSoKCWnp6kgnNpYl1dSldQUkhLWFJPSk1MUkpKSkxQSUxRTVJVTkZJQj03ODs5OT49Ojs8OThAPzo6Pjw3PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwuLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJyftKmvqqWtq7Cxqr20sru4trq0sZ+3urKqnZ2sqaiyr6KakY2UgY6cjpF/d4Z4fHZwb2pZS0hJSEdFSEhQVFRUV1dTVVVVVVZXWFdYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MTlFRU1ZeYmFgY1ZogY6SiYt0YHJ6cHN6hIx5gZiSfm+EjXp1eW5qfa18dJCKfnqGkoB8f3RmdXyGbG9oc3yKjYeAbXpxfXFtdo9xaHGBfo5wRIuFgoOFf3d4eoyGfYx7dX2Oko+Yi5Kbm6OWmZ2bnZ6hnJaNi6Wbjp2XjpaYkHlvbmdjW1hYVVFKU1VUT1BOUFZLTktPT0pRT0lPUExGRD07Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagprCsrqunqbCvsau7uKu6vrizrKebsKesm4+WnKWppKGYmo6EknmJj4uLdnF8bXVxam1qWEtGR0VBQENESExMTVFRT1FTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WUpOT1FUWFxeYFxZeZmcvHttcFx0cWl2c4OMdnmJg21qiZB3cndoaX+BcZaRioB9lX9JkpluZ3d+gm1qZGx5hZCShmtzbHxucnyGaW1wf3ONiYWGe31+e3dwdXSGgnmBeXB8joyKk4OWlpiakJOWlpmWnZaMg4mfkouSjYaQloBvam9vb1lWWFRSUllPUlVUUlhVTU9ITUtNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5ian6Ssr6Ktqqi1r66ss7+rvMK/pqKalaSYno2Ei5ShopiZkZOLc456gIaMhnVvdGxxbWVra1lOREZDQDw+PkJGRkdLS0tMT1JSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9KTU5PUlZaUVdVU5t7WJBganBed2poeXWGhXJ+hIFxapaPcnF6aWmcjkx5hJGIhI1mMXaHcmt9fYN0ZmV1foSEhYBmaWx1a3CAfGhxcXxuk42Pe3R9fXFxb3Ztg393eXVqeYiCiImDlpKSkIuNkZSUjpeNgHmIl4iHioaAkIh4bGtwaGVYUltYWVlbTlBVVllYTklIRUpKSEdCQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW2SiJqQmZakqK2esZ6nuq+rsrDCsbvDx5qWjpWZi46FeoSQmJWNkIyQh3GHgnSHjIZ6cHNxb3BkcGdfVEZJQz88Ozk6P0BBRENFR0lLT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FVS0FIT0depqqYZ3JvZXZnbH18gH12gIKCdm+dknJ3fnFzkoY1cZynnI2goYSihXZwhnuGfHOMrY2JgWhmYmpucm1wg3Vpb1h1cI6bkXZtf3t9bnJucIB7c3ZuYnWDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY58dHJxbWBcXV5cWllhX1JOW1pYV0xISUZJSD9DQUJIP0NEPTs6Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MDEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikYGTh5WRnaSnnq+VpbSprrCuwbK7wcWWj4yUj4CIfG6BkJKJg4qHj4V1g4NslYiIfHV4eG14bndkal5JUEc+Pzc0NDg7Ojs9PkBCRUhLTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU1QTDdDTVBRQkZ8anVycm53Z3CBgnd5gH97iHtznpd4fIR+g5iDmpxghamenIuDkI56dod+iYiOc4qXj4R7XGRxdHp8d4ptaGpieW+FkIJ6b4F4dYV6cHR6eGtuaV12hn2HfIeGjn+KkpeDjYWMhn1xhH+EfXZ3e3yJeHF0dWdoYFtcXlNcZ15XUFRYW1VHSkpFTEc/RkBEQz9BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1NDI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4in+TjJGcnZ6mkaCroLGor8Cyu8W6lo6Rk4d6hnZrf4uRg32Kg46MeIOAc6CEin19gX9wgX56aHdrUlhMQEUyMTEyNzY2ODg6PD5BRUZGR0lLTU9RUlNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUtNTlFLSlNaVk9HYHh/coBydGt2iYZ1eISDepKDdZ2WhoSMkJOkjKypSIasr66KgYCUioGKgYWSqYeBmJiKnHRtfIGGh36OaGdoeX9uhYeChXGEhkdtgHdyeXZobWtfdn2CiH+HhIt5lJybiYqIkX96dYp2fHhtb3d+gXV1c21cXl5cY2RYZ2ZcVVBQV1lQRExLRk9JQ0ZDQ0E/Q0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Nzg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkI6Vl5KWoJ2soKa4r7O8s5eNkouYi310cH6Jkn59jIOSlH2Gfoakh4h/goiFeIeJfnOEeF9jV0tCNjAuLzIzMTI0NjY4Oj0+P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz8/ODQuXZZwc6NVRklLTE1PV19Wa1dZWmKBiXyLeXx6f4uMeoGEjH2WkX+dnpWSmZmkrJKZu7GmusfDp4uMoaWOk4mBkXxxg56fkZ1/d4WFio+HkGlocISBdIyGhIpyhoJ3h4B7doR8bXZ1Zn+UjoaIiIaHh6CqopaIjpd/eoGIenlvZ2t4fnyAdWxmXlpbXmpeYWdgWk9MTldSUUhQSkROR0NKRENBRENCPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudW9md4J6f4x/gZCOipqapJyhrKaqrrCXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46EgIGMioKJjYN/in9scGpdQkE0Li0vLy4uMDIyMzQ3Nzg7PT9CREhJTlFSVFJTU1RSUE9IRUI8ODcvOUM+PDw2My5sk5dNUEhKTEtKTlZfX3pkY2htkI+DkIqLhIeIlIOOi5mHnJyPoKeioamSp7Shp8HCrceveLmUmnyNoZ6YhJOFgo6hn5SZkYWKhY+akZZscHWKjIKVjI2Od4+EcW2FgYqWkYKFiHKIoJWGkYmNj5aktKibjJSigoeSg31/a2pqfIKDg3VjXmVgW2hsXW1sX1dLSE5SUE5MTEZJUENETkZCQ0VGQz46OTY9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcHaRhn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReYCSiJGSfYqEmJKQg4CAi4yJhpCHhImGeHh/Z01SPi8vLiwvLi0vMDAwMjEyNTY3Oz9DRU5PUlRQUFFTUU5QSUVEPjs8OkRGPz48NzUyPD9SNUhISExLTU5RXmqEeG97dpOSj56cmpObkJ2RmJqkmqSnnKapp6izlqq9qrXHyLbI0M++m6Bwaaqpn4STkoWcoJqbmaaRkYiVo5ubeHp+lJiToZOXl4GUnnt3lZKqsoiMlp58k52bjZGVmKOhpbWvnJGYp4aWj42AiGxzc32BfnNqYl5iYGJoZWBnZ1xSRUpLT05JSUxGR01DSE1GRkNCR0VCOzg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfGF3jn17k46Oip+Sl52Wm6qYnqpCRH2HiYeYjXiCjYuOjXyKho+QjoGCgImLioWShYOGiYGAh3ZeYlA1NjAtMS8sLjAvLi8uLjAwMTU+QUFNUFJTUVJTVFJOU0xFRUA8Pj1GR0BBQDg2NjI8OTtGSEdJSU1OUFlqgYpzjYOXnJ+rtbGeqKaoo6SwqK2zrq6quK+xvJuxw6q5ycu3w7+3paKws6ysqqOLlpiEpaago5eBppmNoqqopYiFlKShoaqgpKmPm7CLlaOmt7qboKKvkqKcoZ2PoqGrrquytKGUpKmHmYiSiZV5en6GgWliaV1mY19kZF9nZ19bT0NJSFNORkhLRkpHRkZIQUtGREZGQjs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGJXaG9YeYR2gZOFh4Kcg5GQjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkY6DhIGLhYaIkoaChYmHiIeHcW5hQEU2NDwyLzExMC0sKy0wLi00P0NBTVVQUlNVVVZVTVtQR0hEPD4+RkhDREE3Ozw1Qzs9RktJRkhRTlBXfo6agKacqKCouMG9pa/Bs6mwvbC1urO8sr+0ubmit8SntcjHtb24tKijs62wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqK+2urK6rK+1orGrsbW7trSttJ+mp6KmmaivrLG4t7enmrWoi6SNkJKehniChXhbY2ZXZ2NiZGFhZ2FbVEpERExUUEhJSURJR0VBQEBLREJNRz04Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtZUWFiV3l0cYGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomJeYaAjJOMh4SBjn+BiY+Gf4aIhoqHkXt4bl1XQEROPDY6NDVBQjc2NDAvNkNIQ1FbT1FVV1VcV09fVUlLS0E/PkdLRkVEOz5AN0Q3P0JKSkVGVlNPXoueqJ+srbmssLnGxLK4wbuxsb60tb+yvK61c6+ypLnEo6/GuLCzsbOnpLW2qrCgopebopKlsK6mraunpJihrbS7oqiyurW8v8y/xcW9vbPBt7q3vra6t7irq7Ckr6isva+8usHBq5i5p5StjpeXqYh9g35tWGVjWWxma2ZXXGRZVlNJR0ZMUEdDSElBSEQ+P0JCTEA/TUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxRVlNZVVp2anB+joSAjoVuenN4h2K5oZmjiZSUlpKUk42Pl5KHh3uGgY2VioCEgYp6fIqHhnyKgoKLhJZ9eHp1ZVBcZEdFTDtRY2FbXlNHPztIUERaY1FRWVhaZ1lTYF9MU1BFQT9JSkhFRUFAQzxFNkI+SEdKTFNaVF2QqrKwtrLCt7S3xcq4ub+6trO5ubW8sriwxF9zsKSxmp6qvKikqKuqo6KytaGqqJ+Vlp6YoK6lp6aln6SUo6extKiys722wr7TycnTxsLFzMLKw8C9vL67u7a0r7i2tsK5xb3Cx6+euKmhq42kp7WIgYF0YWRkX1ljYGpnU1hhVlJVSUVFTUpBPkdEPUtBPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0rL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhZBza3Jyc4fVwLWZoI2VmJmRjpeRlpaOhod9hoOMlop+g4CCeHuLg4d7i3mBioKXfnR9emtlcHVZXlxQZWRiYGVkXVxYV1xNZG1VUm1tX25fWGdkVFlVSkRCS0tJRkhISEdCSTpEP0hLU1RVXFpbkLS7tLqxwbq2tcfIt7S4tLe4sbWzsq20tZdjdKecrW9eoqybl6Cim6SeqqWUn5+Qk46VmJionqagnpqZg6SeraWqsK24sL251NHP19DKzNLMz87Kxr++wcm8wLzAwMTExMm+x82yo7qwtK6aq7e7mIB8bl9iXlpgY1pkZFFcYFNRSkNBRUZFPEBGPkFIQj9DPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRW1loX2+WkpCUbmtvdHWHtKyhoZ+LmZyZjI2VkZqShoqKfoiGi5CLiHyBg3N7ioOFe4l0goqGlX9ze3lsbXV7aHJlaWxpZmpqaGBmaWlsWm1zlq2kvIiGZ1xvZ11aWlRIS05QSktQS1NRSUxBSkZKT19eYWZpYJa0w661rri5sq/CxLOut6+vuqqxsKWqtquLtaecmqaaTZmdjI6flpGmmKWVipOTiZCJj5GRnZuhl5uVloefmqebrK+psKi0tNTU1NbTzNDT1c3Sz8zEwcnQvcnJysnRxszNws/Rt6/DvMO5pLW5waKEcWVeX19aYllaZlpRXVhOUEFCSEVCSDtBQz5BRz8/QTc7Qz5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlSZVZzkJCYgmdxb3h5g6GqnqaXjJqbl4uNlZGajn2Ji4WNiomKkId8hIJwf4eBhnuHcoOSi459cXh1bHB4fnF6bXhzbWmAcG1jam1weGh3fH7LvsHfp21jeG5jW2FgSlBSVU5ZXk9dXE5QTlRQVFRcbm12gnGVrLWqsaSts6irur6vqbOlo7elqq2gq7OijbCtmZeYjI6RkYSOm4GNppGciYOLhIuJhIuElJaYl5ObkZyXmZqfn6uspaiirK3P0tXSzszT1NTP1NHOx8PU0cbN0tPT18zR0cTR1sXAzsfHwqi9ts6efHFoYGRfWGJTX1tQUVRRT0g+QEZBQkU8QEE+REM+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFVRTU5adYaFindsd3B9fn+hnp6hjIyYk5OLjJKPlYV5hZCQjYuJiJCGfoJ7cX6AgId6hHWFk5CIf292c2xzfXt3e3OCeHJrgHNyaXBxenlyer7Lmn2LsYR2coR2aGFqXUNaWVtWZWNYY2pTWFxdYGNdY3d6fYuBl6ijo5+en6akqa63qaWyoaGtoKKtoaaxnoimmpOSkYmOjYiBk4lqlKKMmYSBhn6Rg4OTl62LlY2UmY6Gk5Gel6iwoqGhpaSpyc3PyMPM0dTS1NLO083G1tLM1NjW1tjU19XJ1NrNyNfX0cqrwsLLjXVxZWJhWlZaVF1RS0dKSkpAOzo7REFEPEJDPkdCPkJCOjw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtPTEZKWHCAdX1ocnhygomAnZWdlIWLlYmOiYiNho5/eIOTmIqMiIiLiH6CeHN7fYKHd396hpGVgINud3Btdn92eH10hXx6bYd2dW99doR1eHudtYw7QYrFpX6MfGllV0lDZmNlY2dqY213W15maGtuaG2AgoeRipydn5yQlpedoqOksKKjsZ6hpJyfqJ+isZuFnZGRkY+KioqGg4+Dfpybi42ChIV5lH+CqZWjjZKKl5KMfpiLm5Krs5ibnKicp77Dxrm3x87S0dLQzNLLyNTO0NXa19fY1NnYzdjbzsnZ2tHVvsrLtXp5cGdfW1RXUlxYRkdLSUVFPTo3OkBAQjpHRD9EQ0FDQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfJeRnYt+h5KDiYaEiYGHfHiFlpaIjoKHhYd6hHlxenuDhXV5hY6NnHmLb3xwcHqAcXuAcYOHgW6OenV3fHyCdX58hoevc1ipwraNkYJwbWI9XmhycHFwbnh2gWVob3J1eHF5i4aNk5GalZ+UhouSmp+anaieoKuboZmYnaSdnquZipmLj5GNhHuHh4OEi42fmZOIg4d+bJl6hJiGiJOMjZSMhnyciZSQrqqUlpifmaevtr2prr7HzMnJzMvQycPSytTX2dfY19Xb19PZ29XQ2trR1sjUypZ8fmtrXVxRVVRhSkNGSkg+QT49Nzo9Pzs9Rzw/QUFBREE+Pzo4N0RCNzU1NDc5LjU1NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw5OUQ+Q0dSal5tZGJma3aAiHGRkJqAeoCNfoKBgYR+g3t8hJiNh4t9hYeAd4J5b3t7hoF0eZKejqB2jnWCdHWBfnSAhG+BkIJvkoR1fIGFenaGe4m3xaTBybmBlpqPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aTlI6XkIKJjpaZlpWkm5eelZ2SkZainZmqlZCQiYyRgouDiIiBhY+RnZuZiYWLgYWYeoiJn5eQiI2Ki4J9oYmRjLyhmJOYmZ2ppqaun6i2v8DBucjKzs7FzcnR1tXV2dXX29TX2drb19va2djO28aIfXxqbGhiVllXWE5MRU5DOz09PDg6Oz05PUA2PT8/PD49PTk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozk6N0lQXVtSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9YZWFdW2h0enlsio2Sd3Z6int+f36AfIR6fYGRiYSFeoSHe3V9dG18fYZ+c36SnpGeg5F7hn54j355iopugpqAdJmGfYGJhXx+kHqPqY6Pw6G9jJyjnH2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJGEiIqQkpONnJmSk4+VjIuUnpyTn5SQjY2Pin6OjY2Kg4iSlpqenoiLlJGdkYGLf6WYiISNgoWEgaWGioy3mJ2RlZaip6Genp2kr7e6tazAxsrQyMfMz9PT0tjT1dfA19jZ29ja2tnZ19u4e3x7bmxoWmJdVFFPSURMQjw8Pjk5Ojo5OTs8Nj89Pjw9OTk7OzM3RD83Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDpEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODY4OT89Q1FTUlheVVhmbW1taYGOinFyeYp7en98f3uHenx7i4aCfXSDhXlyeXNtgH6EfneFm6GbnZSSf4yIgJiIgJySboiohXqhi3yRjYOIhJx9mpCJjKOjoJCkr5+KkIuFi4GShldyrYufq5uPg5ibj4+OXIKikYKMn5OUi4aHi5KSi5OTk46LjomHlZqcjpSWkIqRk4V/ioeRjIqJnJaYoqKGkp2VoIqJiI2bkIOHjn+Dh4akhYyRspidkpSXoaKfmZKcnaizua2mvcLHzcjGz83QzM/X0dHVrtbV2NrY2trX1dnZoHKAd2ppX2BaVVhZQ0BJQz8+Pjo0ODo7Nzo7OjM7Oz89Pjc7OjoxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J6bWF+koNvbXeLeHl+eoF9hnt7d4aEf3NwhYJ6dXZ2dISChH5/kqajn6WiloqdkJWXi4qnl3KKso2EqJKEmZOFmYyilZ+XkombnqOTqrCfkJSQjY6IloxujbeFmsTIspuhpZucmJaQsZFkpM3IlY6Gh4iPkoyMkZOIhImIhZWZmo6Pk5KGk5aDfo+LmYeNkKqXlqKiiJielpqIjoaXl4mEjoyBf4ePpIiOk6ial5OXmaGZn5mTnZujs7Wmo7zCvsfFxcnIycLL1M3N1KnS0dbV1tja1NLazoV1g2tnYWBgUUtWXEJCR0M7QT04Mzc7PDo5PTY0OTo8OjgyPzk5MjpJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRKUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJlg0d1go58fG1+iHh6fnqBgYN+dnaAgntsbop+eXx3eHyEhot+i6O0qKSrs6GWp6CmpJaVr6KDkLiVkbOajKGgjKSbr6OlnZiQp5epma6wpJeUlZSQi5ialqDAjqPJuKuao6WtmZGbnLKdhoWoopyXhYiIjZSLipKPhoCFhoiSl5OLipOShpOXhYOQj5tzkJiylZajoYicmZOPipCKlpqIipaNhn2MmJ+KkJCcmpmTmZiglKCdlJ6bobGuo6S4v7TEx8S9w8O/x87LydKnz8zT0tDW2NLP2Lx1fXpgY1djWFJJS09GQkNENT47NzY6Pzs8Nz00MjY2OTc3ND01OzU8Szw+OzxCQTc1PDs1Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER01cXVlKaGE7SISLenpthYZ5fIR4gIWBfXB4fH18b3KMeX2Be3iGi4mGhJKovK2ps72wpa6ztKmjorCtipq1nqO5pZWspJeprbimpaOfmamYqqSwsaqZmJyUlZGXoJeau7utyqFptriqsJWYnqKrkpe9o16psoKJiYyUhpB8jo18g4WNj5OTiIaSlYuOlIyKjJaYkZuZtJaUqp2Lm5SRjZCSi5iaiZGdj4uKlp+ijZWNmJmdkpyYnpShoJScnaaup6Kks7irwsjEtbq9vMbIyMLQocbJzc3E19bQytOjc31sYF1WYlRRR0Q+PENBQTc/ODc0PkY8PDY8MzUzNTU0NTRCMzk6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZ0hhYGJwSkCLiX6AcoeHfIGJdYKKg39tfXx8fnB3h3eNgYd7jY+Mhoyaq8PAsL3GvLO0wb20rayztoyosq2uvaubu6Oorbm4q6emoqGjo6qvsrGqnZyjmJuYl56ipqWSo7mvqL+8rK2yuaWjp32Ihp2tvLCCi4uKkIOPg5GOeYGGkIyNm4eHjZaMipSWk5CZlpunmrGZkKqcjpqPkY6VkI+Vlo6QoJCIlJujrJWWj5ScnpSgnpuYn6CUmp+op6Sio7CzpsDGw7Cwu7bFxMO+zKfHw8fDvNbQzMTKind2ZV9dYl5PTENMQEVHP0E+Qjw6ND5BPT01PTY+MzMzMjQyQTE3QEJNPkdAQ05DQT1DPDs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGlGX2lnW11ck4yMiHuHi4aDjHWGkIqBb357gX5xfoF6lHqSlJWYkJOVqLTGycDCzMLDuci9urCrubuXsra5ssCupcCkq7C8vaquq6Ojnqesr7WxqZugqpyinJafsLSnjKO6urXBu6uonLKkpKiUhI6qxMOkgouOhoeEhpWUjHmDjJCOkaCLi5OQjoeXn5eSmJSWpaCunIypnI2Wj5GRlJWNkJSRjqGThpefn7OflJuUn6GZpJ+aoJuglJifpqSlp6SvraW/w8KuqLe1ycO+ts6yxL7Du7PRycjBtXh8cF9bX21UTklETExMSkBBPUJEPDVBRDs6Mz04QjMzMjI2MkExNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmhdTWVcZlRjapqNloqLiJKPhol5hpOQgXKAe4x/d4eCgY95jaGWqJqbmLq+ycjKwtLJy8LNvcGzrby/p7rAvbzEuKzBqa2zvL6qsaqkpaOsrrSut7Wgn66fpqKYo7S8qZyovMGjtravq5OwrKqsl4aaqqelkIKMkqSViYB1iZF5hIyRkJ2fkY6Sio6Lk6KXlpqUk6GeqZ6QpJmLj4+PlZaIfI6VkpGimpSgopy2ppCfl6Sko6WfnqaYnpWXm6WjqKiisqyou8DEr6Wzt8zAuq7Ds7u9wbmswsLBv5pxfGRbWl5dTE1OS0dFQ0hBQUFESzo0REg6OzQ8N0YuMTIzNTJBMjZTSE48SkJKUUVLQ0VFOkVMQjw3RVY9PD04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5sSl9YYVpkZViej52Olo6ekomKf4mfkoR4hX+Ufn+QiImQgJagmq6npJjDvsjEyMbSzc7Ny7zCuLC6vbS9y7vEwra2vK20v7q8rq+ooaiotq6uqbK3mp6soqiinau3t6qlr77Esb25s6eqtLOtrZeVpa2poJGOkrHFp5SOfJGVfIaQmI+pmJeSko6SlJKknJKcmJOgoaGbmJ6XioyPj56IWo+Wl5KWpJlmmaOes6WWo5arraunnJ+ml5mWmJWhpKimnrWrqbq8wrSmtLXLwbiqtayzu7iuqLi6vLeEcHFdW1dYUEdLVE5LP0FHRERIRkY4NUZNOz43PkFLLjMyMDI1QjU1UFdOPExGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhWPD5AQkZCc0ZpSVJmZE1GppSclaGXqJaMkIOGpZKIgYeCmoODlZCQk46aoZ+vvq6hx77FxcjHzs7O0sq+u7axu7u8v8+2xL63ubezsrWzuLSsp5yrrLmrqaiwsJijrqWopKW0wLCrrLS+wrnAubOnuLS3sq+VpK2wsKWLk5SgjXPBmX2WmYSOlpmLsJWZmZSRkZmYpKKUnpqVmaicmqGfmIqMj5WdX0qWnJqUmaSXVJawn6+dn6WVr7CtpZuhpZSTmZiOnZ+moZm0qaqzvLu7q7Cyx8C4pqurrbGxo6GysrSlc3JoX11RU01GUVFQUTtISkhGR0FDPTlLVD9BOj1FTS83NTM0OkI0NE5XTjxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NUZBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oWDw6QkNAPVJFV1N0YlZGSKuXmZ+hqK6YkZeHiqeWjYiShJ+HhJ2Xjp2gmqOltcm1qce8w8TJy8nIzc3Hv7uzr7q4wMLNtci7wbm2urKvr7S1p6Scq7S1q6qmrqyapK2mpamsur+oq7e3vsHAvreyssOwt72so661rbqmiJqWpZt1vp+EmZ2Okpiai66WoJualpSanp+onaafmZmpmaCmnZaPjJCdgm11kqKalZyin5CusqKrlqqqmKuvpaWhpaqSkpmciZWcop6WsKapqrq2vrOyrr65tqCjp6ilppycrampjWZpY2JUTU5ISU9KVUw9TERNSUpAQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNDOjlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc8Oj0uLlNhTFZIfmVeSEaslZyhn7uumJSei5Oqm5GRk4iqjYeinoyjrZSjpLbHvbTBu8LCyMnFws7Iwr66sq+5tcDCyrbGssG8tbusqa2tsaOjmaq1u6aqp6yqnaivqKSrqr27qKy9tLe+x7y2tbjAsL3As6q1t6y/po+ilpCgn7ueiZqgmJadnY62nqibpKKam6CZp6SxoJqdpZynqZyXk46Um4qWiIykoZScop6gtbCkpZOyq5qrrZ+fpaSqkpaVoISQnp+clamloaGztLq2rai1srKenKOlmpeVmaqhnnhkYGFgTElHSE5RSU1FRkZCUUpIQERHQVZTREg8QUdRMTpCNzpCRjc5XVlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdEqJeknp/DrJuXpJeZqJuVmZqOqpaVqKaVrK2Zoqu3xcK8v7jBwsDIxL/Nxry+ubKwubS/wsi2wLC8t7q3p6SrrK2hoZurq8Sipaispp6rr62iqqi+uKatvrC3t8e3tLm4v7C+wbe1srWwvqSWo5WSmpOtn5ChoqSiop6QvaSonairnJygmqWfvKKXo56hqKqgnJSMlJ2TnYaOhI2TnqSgnbasppyXs6easKignKufoo2alqCFjqGanJKlpZqXq7G2sqqlqq2snJigoJKOkJapn5RpZlxjX1FKSEtPTEdFRElAPU9IQDtGSUhbUlBLPUhOVTRCRjg+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLTBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1NGPEt4ZmNYTqKbo5uexaugnqudnK2fkaKelqSfpqqrl7axo6qztsXDvcC2v8G8ycK/ysi2ubW0sbS0t8LGt7+xuLW6taCnrKusnp6fpaTBpaCqrqCkqa2woqaovbWlsby3trbDsrO3ur6yw8C3uK60tbWjnKSUkZOgrJ6YoZyoqKqimsGsqJ2rrZqanZiln72hnKSXqqqrpaCYjZqfkp2IjVd/lp6loaC5qqeTmbejn7OioZywmKGPm5Wego+gl5eOoqOVkKWusqypoqKlpJWVnJiLj5KTpJ+JY2dcZWJOSktLTkZFQUdLPj1JQTo4SkpOXVFRST1MVlw5Rkk9RE1JOEhjXEtDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YVM2U1prV3NIRTY9dWVcTFCeoKCYnsOnpKKzoJuxppKpo5+jnq2pq527samstbHIxMHDs8LDvcfEvcXKvbCxtq6xta+/xbW6sbG6tqybqbCqqpufpqGnwa2brLGcqaKusaqkqL23pra7va+3xK2ztMK/ssazurertbauq6KllZWToqugnp+ap6qurq+7saWfqKmZmJeSoqO3oKGjka2uq6SlnZGgnZSdjpCMlJ2aop+otaenjZm1nKOvm5+csJGhlZmVm4CSopaQjqChk4umrLClp6KdoJ6SkpqThYuSjZyfgGRoXWhmS0pMS1NBQ0BJRzs7Rj45OU5NVV9SU0o+T15ePUhQQk1MSThOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtBN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8d11eP1tVX2dyQDg8SJZ3ZUE0n6SemqDCp6OpsaCjtKmVsaumoqSyrK2pu7OtsLW0x7/Ew7W/xL7KxbbBycK1rLWpsLmsv8S0uK+ttrqmmauyrKuYoaeYrbu0nKiwm6yfrrSyp6q6sqe5tLiyucGqt7PDvbTFp76urbe1qaisoZaWkaWjoaGXl6Sut62xtLafnqikmZOUk6OgtqKkpZWtsbGlqKSgnZqZmpWXqKCfmaKer7Oipo2Yr5qlrJibn6eTnpCVmZuGl6CUjZCdnpOLqamroaegmp6WjY+ZkIKGlomVn3pla15sa05RTk5UPUNBTkM7Okk/NzdRTl1fUlZRQldgXUJKU0hXS0g6VGRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzkwNnBbYkgwNUpxaldEV0aMeWZDO6SknKClvqWorq6gqbWqnbevq6OqtLaxsLi3sLe4uMW9w8e9vMPCyMG6wsbCuqq2pa27rcHDuLiqrbK8o5WusK6zl6aokaq6qqCmsJ2qoK+0s6qqtrWsu6yzsrq3rLmwwrq9v6bDqrC3r6mrq6admJiqoKGgkZegsK6zqrC4mZupn5mWkZemoLaopaKir7Czq7Gmqp+bn5+anaWdoZido7SwnJ+RlKaboamclqOimJqMl5qUlpeelImRm5mUjqmpp5+jnJmbk4ePmYt+jJeFj5tsaW5ibm9YUVFaVEFDRFVAOzpJQTc6WFBkXlFXV0VZX15NTFNPXkxKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPURGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE3NDdnWWFGKEA4bX1pXFY7iXtjQz2on5yhqbygqq+qorC3qKSzsquhrbW9r7O5vbu9t7fBwr/Jw7nEw8HAucW+wbiwtqirt7K8v7+0qq+yuJ+Xq62prpipqY6nu5+lrbOfq6KxsLOsqrWztbytsLG1rLC1ssC6xbarva+xt6ytqqOxpZ6lqJ6jlo+Yn7Kpsqmpspmdp5ualIyfpqS0rqeirKytsKeyqrCpopuep6OelaGZnKi2qZiakpKfmZ6hoJKtoZuaiJeajJ6anZSLj5eXmpempqOgnpaWlpOAkJWEe4+Tg4yXZ21yaHFzX0dZZlZEQ01YRFo5SEI1Pl1RaFxPWl1HW19eTk1TWGNKS0NcY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtHREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVYxNTE9YFZfOClDM1lVXGhLNYx6ZkxApZmfpKy1o6yopK6ttaius7imp7C3xrext7/Bwra1usW+zMW5w8G6wLrFuMG6s7Ssqrq3u7q+tauvsbeYmKisq6ycrquPq72dq66xo6mfsa2zrq61sbm2qq2vsqi2sLS6vMmyqrW0sbSwr6ehs5+aqKufpJWVmpmxoq2gpa+WoqSZmZKMoqWnsqmhprGrqbSlrq+zrqOYna2nm5eempqsuKKYk5GPmJyhmZiVrqGfl4OVmo6enZqXkYqUk56apaOjoZmWk5KVe4yQhXuNi4OLk2xueW92fWFGYGpaSUhaWz17SkdFNkFjVGlbTV1hS1xdW1JSU2JhTEtFYGFgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4rQS9KR1BbRzNjWFRMRZqWn7CosKmspKOurbWotrO3o6yzt8m7tbu7v761tLfDwMzHvMO9t7+/wbjAvbK9rqi6uri3wresrrG6lpenrq2ppLKplK+7pKyysqanorK0sbKxtbC3s6murLKnuK+2tMPFtqm1tauwraqno7afn6ewn6OUm5iUsZ6nm5+pjaminZuVl6WlpLenorGzq6ewp62vtKykmKCsqJycnZyVqrmclY6PjJidopiRmaikoZmGlJiRnpyYl5eJl5CXm6idpaGSlpKQlXaEkIZ7hoKEjY1ucXh2fIBcTGVsXEtPZF0/YntHSThHaFdlXExeYk1ZWldUWFVqXU9QSGFeX1BLR1FWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5JZzI3J0ZhTFYlLUIuPUVMUTwzcmpMRUSRmaStpKytqqWisLGyqbevtZ+rtLnIua7BvMO4s7K1wsPOxMDCvrW+wMC7v720xKmqubG2t8C8sKy0tJ6hp7GvpqexpZ2xtayqsrCrqKi1uqy1srWrs6yqq6msqbmusrHIv7ikubCpra2mqK2xpaSjrqOonJ2bmq6Zo6Kio5Csn6Ogn6GppqW4pKu0tKSqq6msrrWuop2jqKqcoJqbk6S1mo+JjoiRo6GWj5afo5eWh5GVlZ6bmZeViJiTlZmnnaGgjZORjpB3fo+EfXx9h4qKcnRzf359XFNjbl5OWmddRkSWW0c6TW5YYVtNYWJOVldWV1VZaF5RU01jW1tUS0ZPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozRGU7NipIZEhKKzpJPzNDSVMsPo9rQEhJkJqoqaGor6Smo7OzsLO0sLCgq629zLuuwr3HsrSutMLD0cTFv8KzvsLDvL+4vcWorbess7m9wLGssq2ipKeuq6ilsKOqsKquqrGurqyrs7unt7CxqLKqq6Wlo6+6rKqxwrm0rLmpqaitqaexpamkoq2pqKKem6KslaWdl56ZrJ2hp6ihrKajray2sLGgqaKgqq2wrJ2ep6epmqSYmZChqJiGhI+Lip+hkI2PmJ6SkoiJkpahnZaZloeXk5OXpZ2dnYySkI2Jf3+IhHx3f4eFhnV0col3bF9ZX25iUXNxXEs7hHxGPld1V2FZT2RcTlZWVVdRXGJfU1BOaFlYV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mzk4OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMj1eSzAuSWdERjg8QjA1RUtYMUCUXUBORpWWrKegqbGcp6iwtay4ta2ppKuqvcm8sb+5w6+wrbPEw83Ow7/As8DDxLrBtMnErK+3rrO6wL60rq6sp6mqsamnqLGls62qr62tsK6yrbO7pbezrKyuqKufo56xt6uqrbq2pLW1pKqnq6yqraCopqawsaOnpaGhq5aqoZOboKaeo6Kqo6yinqaxtqysoqWimqmqrqmcoaWkpJmgmZaQmJ2TgYKQiYWdoI2LkI6ckZONhY+apZuTkpuMk5KRlKOanJqLj4uLfIaCgoF6dYGDgX51eIqihnhqXV9uZldlh2ROQGeSTERieldiWFJmVU1WVlZUT1xdYVZLT2lYVlZISkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LjIsJjA3WFouMEpnQUE8PEMrOkpPXjREh0JJSUSWkK6koaqvl6morbWqtbGqpKuqqbzBwLi6tLy1prOvxMnL0r/Bu7i/v8O6wrrBxK6xtbK0vMG+s7Kvraytp7eqpq2vqreup7CvrrGqtaq2tqe0t6uspKmqnKSetLOoqKSztJ+1raGqqKuoq6efq6youLWpqqmpoqifrZuRqqGdoKSipqKqnZymtK6npamio5ekpqeqnKKko6CamJ+Rj4+ZjX+HjIeEnp6JhoyMkZGTj4WIl6Oajo6bkpKQj5KgmJmXjYuEf3SGgn9+eHWDf3t4fn+HnY9wcWZmcHdcYXSIak9dmFZIbXlVZFZSY1BNVlRVUU9YW2JVSVFqVVdUR09YVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTIzOzo3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMi8yMiUvM1JjMDI/Zj1OWD9DLD9MVF8vSWs3UkY7lYyvoKSqrJmpo62usrSvqaSvqai7v7zBsrC5raK2r8jHyNDAv726vMO+u8TCv7+vsrOytb28wbKytKu0qaW1qaWts7K4rqGstLGvsbmrua6qrrerqp6qq6CjobatqaGfrrKgtKqfqKeqoqqhoaytqL2uq66toaenn6yZj7CimKKgqKeep5uZqbCoop+roqGSoaKip5mZqaWYmJmdj4uHlYh9joaEhaSXhoOEjYiRkJKGh5ahl4iRnpKTkI2RnZWYj4uGhnh0gX98dHd5gHt1dHtrg4ekdmleZWuAdWeIjHxSVm9eS3hzVGRTUV9NTVNaZ05NV1llWUdTalJSP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaDozOF89YWQ/RjFDUFtbK0hQO1lDM4+NsaCjpaqjo6KsprOysaiksKequL7BvbGpuqqnrrDJxsjQw76/vbm/wL3JvMG4sbC1srq8ub+ztLysuayjtKamq7G1t7Glprm0rLO8r7ylra21q62cqa+kn6Ssqqicnaqyo7OomqunqaSonaKpp6m9qrSwrp2ppKCunJqzopaknKWkn6WamqiqpZ6aqaGbkZugpJ2ZlqipkZmakpCLgo+Ffo+Cf4ifj4eBf42Ik5GRhoOVm5SFk6KOlJGLkZuTloeKf4Bxenl9e2d2fHp1cXJ+aoZ5hYhkX2djcoV7bWh5XV5VQVd7bVRiUFJZS0xOcHRdSVpbaFpGVmZQQz5KT0RDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOkbCYnp+opKGhq6S2sbGkqbCmrbnBvbexpLmsqKivw8nIzMK3vb+1uMG6yLbCtbSytbK9ubq9tq65tr+sorOmqqqutLazqJu5u6iwvrK6oK60tqmrn62wo5ylqamjnZuksKavoJ+qqaehqZujqKCtvKeusK6hqqKkrp6eraaYn5uhopyfm5mjqqKamaOjlZaUoKGWm5alrIyfkpCRjIKKgICPgHualY2KfYCNiJKRjYuGk5iRhpSkipOSiJCakJSBiX15a312eHhienpxb3F0eGqCdWuCZ2NnYW5zjm1iam9gb0BceWtWXk5RUktJTVRZVk1cXm1XRVlgUF5PSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNSXj4jkZasmJ6Xp6Kgn6ejt6+toq+vqKy4w7u0rqC5r6uos7rHyse/uMG9r7S/t8S2w7KvurGywLa7vbequbi+qqS0pqipr624r6eXuLyjrb60tKCtuLWnpqews5+epaaooKWYnqynqJ6gqq+noKaXoqifsLifpLGvoKuhrKScpqeompubnqOVnJuanammlpueqJGYkpmdk5mWoaqRmoqNkId9h36Cjnx8oY2NiXqEjYaMj42GipOajoiUoIqRlYKMl42SfYV8c3B9cXNzX3h3aW5xcXBrgHNkemxnZWNhZoaAYFtyanJNTYBpWFpNUUxLSFBTUEdMW2BvVEZZWlJoT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXVw1KJWbpZiblayfnaGjoLarsKO0s6mpucW3s66huK2trK+1xcfAt7/BubC1vbe/u76wrL6ws7+yvMK4qru6uKentKenqq+rsq+kl7u1pKu6ta+esbmvqaWnr7GboaSgpKOglpuvpqGeoqivoaChkqSkobewoaaxq5+ro66YnaqlqJ+Ymp2kk5mbmp2lqZmbm6SVlJeVnI6Tl6KpopGKipCGeoR+hIt5j5eKjYd7g4mFio6PhpCTmIyOlZmLkJd+hpeMkHqBe3Byd25vc153dmRsbGxraoVuZnJpamVoXWRzgWBba3ZpWkp/XltYT09LSEhTVkczOV5fbFBFWVZZZk1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVF1oRC48MmRXLDGUoaGWlJuqm6OhoqG2qq2gu7elrL3FtLCvo7WvrKyvtMPDvLO+uraws7m4ure6r63As7O4r7/At6y9urWlorKpp6mxqauwn5m/tKSntLWonrK8qailqa+rmaKnnKOllJegsqSZnqSpqZyin5KkoKS4qaWnrqedpaGok6CpoqGhmZucn5GZm5afoaqbmpiglJGUl5qOk5OkqKSQiYqPhnqEe4SGfZ2NiouHe4KFiImKkoaXkpKLkJWUjo6Ue4OXkIt3fnxsdHJsa3Nhd3RoaGpoZ3CGaGhpZGZpaWBqY2poW2Z7YmBTdFRcW1JMSkdJUFRAISpoX2lNRFdVXmBMSkhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnUCcynqKkkY6jp5mcnp2js6ynqrq2p6zDwbixrKO2rqetr7e/v7yywbawrrK2tri2tq2qvbOusrC8vrevu7uxpZ+1qaWks6aorZycwKqnpa+zqqy1u56pqaywpZidqZ2mpJGYpayimJ2kqaGboZuWn52ntaawqq6goJ2eoZWgpqCioJqbmZuSmJ2TpZ2soZeWnZSTjZWXi4+Ym6mgkomKi4l5hXaBgoGdh4uDiX6AhomHhpGEl5SPjo+RkZGMk3uDlY+Gc35+ZnlvamprZnRza2JnZGR2gWNlZmZlamlja3JbX1ldbGNhTmlYWmBWSkdJS01TWD45X2xoSENWVFxbSUpHRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNCaEglNZqjoI+MrKGWlqCVpLKxorK9tqGxxby6srGjt6yqram4vLq6rcCxrq6utq+zuLOpq7mxr66ztbq1sLi8q6aetKmfn6+iqK2bob+fsKOusa+3rrWera+traKZnaaopZ+Vmqeln5ikoqidmp+ak5yerK+muqiuoqGam56ZnqSapJ2XnpiblJifkqiVqqeak5qakoyVmY2UlJuqp46OioqPe4JzgYGKmIWHfYmKhoaLjIqThZWbk5KOj5GXjpB/gI2Og2+Bf2Z5bWdraWZwcmtcZ2NjdIFiZmdqbmxnampobl1sbHJwYFRjaWNmWklGTE1PWFFRVWFlgFVBV1NZVEZJRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUExLSsuMzw7SzYwLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJjSRoZuNjq+dmJOhmqmxr564v7WgtMK7vrqxprevp62ktre3tqy7rqyqq7aqs7euprK1sa6psLW1sLO1uaaon7WnnJ2ooKermqe9l6yjrrC1ta2toLGtsKihm5yjq6eblJumo52aqaKklpqfm5CbpKqrqbugp6SgmJqZnaGPa6KWmZxwgpWZo391kamnnpSUnpCJmJqAloqikHmHlI2DbWl/d4NxbIaLhn6FjIdxX2RhZ4SYhWuKjZSSdHeLhH6DkIBnh4BndWhlV1xoc25NUGljZ3KFaF9lZm5tal1gYYqPg4RlTktEOUdUaF5KSFFQVVVMSFNhcHRlRltRVVBGSEVDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QUBAPTI4QEU9MSwsMDg9RzcwMS4qLiovNTY4LCMxJzIxNDoxNzZYgWwxNk9rW05cS1tmYj5HMVFkPSoui6SZhpWwm5uToJuqrKqjvcWvqbfCt728raa3sKWqorazsrKwuayppqy0pa+0o6m3tbWop6u2sq20rbKhqJ6yqZ2ho5mkpZiruZOlpa+zt62vpaquqqykoZ6coKamm5agpaSbm6emnZOenpePnaeppLawpKKinZaYl5ejiKGOkpqGoIeSnKB/pX+lqp6SkpqRiIRzeI2OhYihdomNaZeIZn5zeKBviIeEfo99f6GgoJmAfYeec4aOdZuKbIeBg21pZWN6bHJhU4VtYmxpmHFYaXFwiFleaVtsbFuIcm56coVmhoRaX0dOP0dfTkZSVlZRUVJXVWddTVZJUlJPRkhHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STkvMDEuKi4oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcvKIqnl4Ocq52YmJ2eqqmnqr/Dr7G6vLbAvqqlt7CorKWytK6us7aqqKSwraW0spyutba0pqensrCssqetnamgsKefo6KYn6GarLOTo6Wltb2mraerqqyopKGgmJ+mo5mYpaKjmJykqJaTopuTkqOlpqG3pKSgo5iVk5eTnIivkJeUiamLlqGchbGAo6ydk5mdlHmC1KiAh5XBnMZ5eLGlt5dlgMCcv3mEhXqShH2QkJHKcpe7nMV6crWnupB7gG2XsauweWhsWLGubmVpvJK8bmd6bnKP2H5Ta2O2sn6BcpRzmqGqkFdPV2JPVk5GVVtYUVFTjV1XW1FBXURRTkVISTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjpCPD9BODpKPjUyKjIyQkUvLjMyLisvKC0vMTg2LSAvNDE2QTE9OVeDdzIxVGtcT1tNXmdcPkwxW100MSGMp5OBp6qfl5ydpayxqLDCvbK1wLW2vsGqprOsrKimrrOprrWzpqeltKWnuK2cs7G1q6akp7GtrbCmqpymo6+ioJ+dlZmenK2rk52in7O6o6upoq2upaGcmpmhp5+XmqefnpeepqeRnKaZk52hpqKhsaOfn6OWlpKXkpmFr2tqio2qfmaDlYatZHCdnZSZppRwrqGkfni7fWyhkHaxX2q0W6WAZZyQYWeDe2eAa3lrqWW+cWemi3WxanuxeHSSlGNubaduW4ShRWhmh5ZFdZxgfmd8pKeCWmCMq2iAlHh5aqc3Sq9cWFNsZFtLT1hfXFdWO06KT1dXL0lUU0pERkY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0wMy4zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9YMzAbkKKVg62npZ6jpKqxt6y1vb6wtsSyt7rBpqiwqq6oqK+uo7C6r6OkrbKjqbinnrKysKOloamsrquvpqaeoqGvmqGblpSWmpqrpZWaoZ6zs6KsnKOtrKCdmZafoaicmJ6jn5uZoaakj5yimZagn6qep6ahmqChlpWRlpCahbWbtXiFqZm1mXaGs5u3fpOWlqmUf2uBpnuChoiTlJN3q2drsVyreo2GlHSJco+HgYGJkJd4goGLl4uDoI+EsHZ3n3FsbGx8i06kWEhiYpl+Y2imYHlydVOTh15RqW1jcX2GgGKcLlGhb1tTa2hgTEpbZFhcWkI+sntYWEEjTWhGQ0VBQEExOT44ODo4NDs5OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpARkJAQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjhhVTUwG5SglYizpqahr6mos6ypu7bCsLvBrbi3v6msra2tpayxqaCuu6qgp7Oso6u0o6aysqejop6mqrGnr6eknZ+frpWemZSUlJedrKCZmaSota+iqo+qqKqbnZSXoKWnmp6cop6bn6KkopWbnpeZnKKpmqaanJuioZeTkZKTnYPVk5m5cLDBfsWGfNaUm7t8mpWlj42djaR7joikg6WDeqx5j51Wr3qIfp9ruVu6d4eEfqaClHuXeqp4jZ2PerFujoR0kbyFb5RQr6fFilGgemNgqmJzcohtl4hgU7W0yIWAiXxjpDNCnXZdUGppY1BAWGhaZGFKSE1xUFxRT1lmWkNFP0U/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDk7REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0g6YVA3MSWbopSYsqioprSqpbSppLy3wbC5v7C1tLqytKewr6KvsqWfrbWnmqe4raKvsZ+ztLCgpJ6fpqmwqLOoo5ucnaqVmJeVlZOVoKmcmZanrbCpo5+PraKolp2Vm6CloJehoKGgmqGhp5ueoZ6UmJqmoJunlZubn6GYkJKUkJ2Ism5otXGrh26OpnK0c3K2e5qXpIuPnY2ifpGhpn+xd4OR0tJ2XK57hX+kb5uqpmuHhX2tfZiZjnuxcZKejnezZZd0hJ5vnmeUUciLWsJcoHliX6xgdXOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2VYQVBrYGxoUFZHSjk9VVJaV1hJRD9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWBMNjIwop2SpbGto6u8raa0pqe1uryxur62tbO5uLKktLKgsLGinquvo5emuK2ksbCctLepoKWeoamksaesqaOZm5mnnZWTl5eQkaGmn5WTpaqwpqKWk62gppKTn5ujpZ6VmqWmoJqin62ZoZ6dkJSboZ2cpZWdlZminpWYlZGahax7d6h2o42IhqlvrYqCp4OYmKGKkpuLon+TmomuhICCs1xys1KufYKCo39y2H54hn6PnYaamXavhoeRnId2tGGaZZqCgpVtklqwWEuadZh5ZmCsXnV3iGiYiGtdr3eVno94bDV5yK6yX0JUb15nYEVQbGBwbVZWTS5mZWlTWVA7QkVATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Njw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0JfSDo5OaCelaC5sJe0wq6os6ipsrq3s7e+uLextLq0pLeynrOsn5+oq56Up7WrqLCxqq2zo5upoJ+nobWmpamimJyUpKCTkpuXkZShpJqSkKatr6ahlZmqoKKOkKGZp6SflJmlqJycpJ6snKGcn4yTn5qdoZiZm5aXoqCTl4+mnYapfX2leKGOjYKqcK2LgaeGlp+hiZiYiKODkoiUq32Ai515b7FaqIKCiJ96dNmAd4h0qIGOm4ySpHuUj5+EerJenWSgfoOVbZJdq1tak4CRf2hnqmNxfIJrmIdzXataiaCOa29lT0pDoVxbTHRdYmdOW2FfcXNfS1c3SpyYWEdFPUhHQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANS46PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZIX0MyPziinpqawauXtMKuq62ppbSwt7C1vrm4sbC1uqi6s5+vpJ2kpqaek6mvqK6otKuprqGYoKCmpKO5oaKroJaakKGflJOemZOXnp+QjIyosLCnnpebqKagjJGjl6eqppSXqKednqCiraShnqGMlKGYn6CSnpeclZ2hlZaNqpyPrm1ytHOpi3WKp3O0eHOzgJGko5Gdjomkh5B3uHCNe4uiamu2WqGFZZeXaaCip26UcrR0k5l+smqFkYetanWzYZ1mom+Hk2uXXa1gTaF8hpJSc6NreH9+b5iHcVyvVjycd2ZUb24uXKdPY1NrZWJtWWNdYXB7Y1RbUj49bnEzQ0JAP0w6ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTF44MUM4ppybnryhm7LAr62rq6e3qbeutb+0uq+ut7aqwLWoqaGbpaOhnJGpqae0orKnramgl5ynn6SruJ2jrJqVmI6jopWMnaCbmJyfkZOUqrawqJmVnKypl4yTpZikrKKRlaqxo5+epquxmaGjj5iilp+blpyWoZOcqZyUj6qZh9SSmrtzsMOAw4Z+1ZabuHiIkJiMmIuMp4h6pLZ1fnd2woKasmCDunnAfXa4Y7WBjIepfZWBq6lxe390vIinoGmdYaaOr6F+jHWHqn2+b3O8dLKDdHiBim6aiHFujaR0vV53fVphebxrWlZcanleamFmZ2Ntd29ZXFpDQEB0QENHKzRHIic7PzEwPD83OkI5OT1DNDxATlpeYGBgX19aUFBSS0VGSjRITFJASk5FRk9CPUU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaebnqK9oZeyw7Ctqqqrsaa3r7bDr7iwrbiurcCwq6OinaOhnJuQqKOpsqS0payknpWaqpimrLicoa2YlJ+PpJ6SjJyinZedmZGVkq+5sqyWmKSop5SQlqSbo6ydkJ+oq5+an6ijtJ+jpY6noZSimpyYlaOYj6+fkpSpnoWQmLZ/j5GMt5V4gpOatXdta25zb3mQhY+KdJ/Bu72ae4GxqHCAc5G5g32Hho2HjXyKh42YfKS7ub2cdHm0o3R3l3Z0sHWZnmaHao21dHJxeLaMXn96fYlog3luemOLrHB1hX9YW6dqRWVaVGZgY15jUWdncGx1Q05RTUQ6W00/SjM7LyA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JXOCpPXl09KzpWVSc+OzynnqGiwKWWtcO0q6qorKqpua6wxa2zsq21prO3q6mhoaSeoJ2Zk6qjrKqltaemn5uVoKOdq6S9pqCplpObkKGakY6hp6GSnJeUmJSxtbeumZ6kpKKLkpGmmqWqm5WnpKWbmaGopaekqqGSrZ6XpJ6Xl5edno+vqJObpaGNan1pmqV3hnJ9mo50eWSHe72+wLpvk4Nylohhc2taX5uKYWOIj5VrYICWZG6ed2OWbICalZRlXmBicJmIaXKLfYaVZ2t/cnR4fX9iW3d0gWhQXW2DfXuLa1hreoJzSkpvhnBOdExFWF1nYUxbV2djX09bbXRpcVJRREVNO0dJPE0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NfVjQpUF9MKDI9W08nPzI+qaCoosKjm7W7tqOspa6np7SxrMirrrKqs6K9sLGln6KnnaObmZmrpq6jpLSopJuYlKCapa2nvqeopJSTmpWfmZKXpKmokJ6RkJicsLO/rZynnqeiiZORqZqoo5qaqqCjmZqjp6yjoKyjmrGblKeglpWdn52WsKSXoKeYmpCbm6Ghl6ShmZyZmZmPlYFnbX1xd5KYlJKGjLarjYaYlo6KjJiWh5SVi4STlJKJjpOUmJSYlpmfoZmak6CcjYJ6pYVta32QfYB1ioqBcYJ4eXZ1iX98impzgXSDdWV3fXdrb3ptX2RdcGhNWVpmamBXWm94bW1mVU9GUjlPWU1STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXFxgYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxKLDwtQLOgs6LAoaSysregqaWyp6WvtKrHqquvpbOkwKezoJ2jpJyjlZWfqqasoqK2q5+YlpWfl62ppMCeq6OUkZqWnZiSlKGenqKnk5GZqKezxLCaq52rn4+Wlqidqpucn6uYoZqcoqSvp6KmqJ+umJennZmZoJ6dm6+gnKGllJaRl5Oen5ShnZegjpaTioqNjpeukHyWnIOSgourqYWAmZeJhI+eiHqEkIiGmpKIh4qWj5uXjZCXnaOVmJKQnI1/jmehs6+FioV2e5KKfXd5em9meY+BgIlqdYF5iHNpc397doOGgmp1ZHpmYGplY2Rma1lse29pal1TTFBEXlRFQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpbX2JjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVFxRMDVOWzE3RTNbRzU8LEC0oLmwv6ysr7KxoKqnsqyirLKvxK+pqqKxrbyis5ufpqKhnJiXp6WppaSlsrSelJOdmZmvpa2+oKuikJCdmZmUkJWhnJeonISeq6yjtMi0oKqkqpaVl5qmnaianaOqlJ6fnaCqr6qmpKyjr5ufoKGXpJ6cnpyuo5iep5KWlpuQopeWp5yalmWCknxlfo2akGN5jm1oa3uSpatqZZuYfWeGimVlaWh7jqKPbGiNmJGjd2tqipiinpdza216hI6IelhmXoaDXm2MioF2XGhzd3aRgIiCbniCeH9zbnmEdHaJh46DfGqHWV5sdGRdc4lpa3xwa2NfUk5XSWRYQUo0PkY3P0ZENzE8PT9BRDs7REdISElMTlBSUlVXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8yWUM7Py49pqC6vLqvrLSxqqWora6wpq2ssLuwqKajra2wnquWn6OdoZmZpqqcraOlp6myrp6Uo4+ir6W1uaWtoo6NmaCYk5KaoJmZpZV8pq6jqLTFuKWip6+enJWeop6jm6KoqJGeoZ2hqrCsrKWroaqbp5+ooKyWoJulr6OWm6iUn5yakaKVnKmXnX29g4hytHKEnYataHi5xLhxlKOjeqaZmXKrgnzLwMC7cYyjiIOefJeZiZ3AvYGWnZ2MnMHBfIJ8k42aw8B9bKWyb4yBb8p6f5t3kIOOgXV5gH95cXp/h3B3hYyTeW14lGNnYHhkYGWCYl5zZ2xkZFlMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5RU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAuI0ZbM1BZL1VBQjsvOJajucO1sLDBqqiUo6+psK6tpbKzrqmkpaWvqp+rmJqin5yaqqahnKuipKijpLSknKKSpa2qtrOnraGRkJmcpJKQn6GYm6CdiKetpayuwMCxoamvqZaSn52hmaKjqaOSoKGdnq2vq66opKSooaalnayokaOaqKypmpynmqqflZajlJ+hlZt+zpR4eqSBeZWWm1+uj16OqIKjoXynlptzq4OAr15jjap7qIeFoHSXk4izY4KrhqCNjbNqhK91fZeIt2KDrVqjzW6Qdnvae3+ZcH2IknZ9ZXuHdnZrfIdufYWQkX5tg5Bgcm1waGBfeWVccWdpZGdgUlRTV11LT0Q1QUhERDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaOqqK20q6Wyq6uqoqumrqqfppuZpZecoq+foJ6op6KloJ+wq5qdlaauq7CqqKuflJGan6SSj56lmJ6no5+upqyxqL/Hs6ipsa6Wkp2coZefqaqelKCfnZ2usKmsq5ypqKWiq5KsspakoaqpnaKlpJ+un5GYpZeemZKTkJegcYWMl3WFqIZxsX2ecqx/op+BpZCfdquCfa1/nHOtf6yHhp92mZJ7fJd+qoihi5GMnX2re4mVkKCBe61XncV7j3CTwX2BlWx1cIxtZXZkhm5hd25yb4mKko+DbpKRZnB1dXFhZ21mX29oaW5nZFdUXWFaUlNDOUlJQEQ8Pj1ARkVDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwoPTEpM1dARiEcRzpDMS4rsNPGxrKzoJyijqKioqyutq6osaWoqaatq6umoaOdmKKVn6Wrn6Gln6ioop6dsKyXmpaop66rqKannpeUmaKhkpSgrZudp6OwraWttau6zbGtpq6rlpWcnaKYnq6snJagmZ6fqbOrq6ucraulo6yarrGhp6utpZekqaenr6CRlaKimJOQhKRqpHWJeql0erJwgqaKmYxxiaCahqRgYVKshX+ug5t2rYKohoWfe5mXhXpmgKOJpJiGgqN9qX6CloiuX3ypVp6jkoF6o5+Ae8OuxItyr7OzuXFiqa/CdGiMjJiOgW6clXFvenh5cGxmZmVycGZ9amNdV2BqWFlVTU1RTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU1KjJQS0wjIEE5RDQsJ8PJ1tS/oZmrp6Cuop6vtLCuqKyip6WoqquppKagm6SenaWnp6Ocq5mirKCjn6+hnJqSq6S0rq6gp5qdlZOmopGboqigoKadsaamqbKtt8iytaqrqZaRnZyimJ+ls52ZoZSdn6esraWwm62ro6OqobKtoamysKGZqKesrbOhkZShpZaZkHupbJ6Eh3WreXywb4KljImflpaglYHSuLS3yYGBsl9glKmDpYiHoHqZlZp4qsl0maSUqKmQkpuNgZ2KmsbGeWehgqV0gZ+Ogn2vXW+0YrB1S6OHbadHgpNkjpCdknxxmZWBcXt1fnxuXGZqc3FmgWtfYVlkblxfWUlNTUtFREFCPkE8Qj9JOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2psqyspaKbsrirqqGlmqekqauqpp+mppiqo5+uq52loKyanqmlnKe1nqKXk6mqtbGsm6WcoJSPpayRmpyno6Gqp66ipaeqsLXDsbOqrKiUipecpZqho66ll6GVmZympq2csZ6uqaefrKO2rKCxuK6dma2msLGwopKWpqGYno2CnU54moF/n3qEo32DpIWHpp+dn5SEuHt8ebmCf8zGwrZ4m6GRi55+mpaXinafl4qll6Spf7CFnYaghKx9mpVjpm2kcI+FkIF8loJyrGCjcnGAmmC8fVJVdI6So5d7fpSTjHZ7c4eAcV1tbnhyaoJvW2RgaW9jZF1LTFFUQUlIRkk6OUs/QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVllZWltcX19eXV9fXFpaWllVU09IQDg4Mi4sKi4rKicnP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eYqaukq7iqrqCboKyzsqWeoJWlra2uqqecpqebo6ihs66iqaayoJippJSjtaKilZeiqbS4o5uhnKKSj6GxmZ6cp6ahorCunaapo7azxbGtqaypkYeQnKecoqScpZeemZqapqWrnLGir6WmmK+ku62htrWsnZyzsLavsKSWnK6eopyFj9G1w7d5h46FkZOQgKZ5lKF3jKCShKWCinGqhoW1bnJpmqSclYqffZiZhoePc6+CppujjqaLk52LlZCbbnGyXaV0k3qcbJh/e5l8balhonFxf59ic7K4aHePlKaYfY2OlY56fXmQg25qeWl6c2+BdV5lZW9uZmhgSltYWDxIR0BVNEBGPjwqKTYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYF9dW1pbWFVSUlFGOjIyMy8vKysoQFFSVFVUU1RWV1dYWFdVVVVVUU9RW1UlITJBSCQpJZJzjIqtvr68ubSelqekrbShoZmUoqemrqqrmKajn6WhoLano6insKOUq6OOpK2jnZCamqqzs6ScpJyokZSWrp+fnqeknaidtpujq6S2rMSwqauooYyEjpyioKailZmZnJmcmaemqJmtqK+jppuspr2slLyvrJ6hrrG3qbCkmaevoaaWeaiQfXywd4qApKWInG2ycKGHrXyhj4OolZiArImFroWglaqgopeGn4GalYB7kn6rgJ2al4uqd52gkoqUkoF6r16kgX2mp2Sdf3yXcmqvXaRrcIaZXWBbjKBtlZGmmYKVj5qOfHyEmYBrboBjf3RugHpgaGZxb2loZ0NZYVs9S1QzVThCQkM4JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVJTU1ZaXV9hYGFhYV1dW1pXU1BPTkk3MDQyLiosQVRWVlZUVFVUVVVUVFVUU1RWV1dYVlVVUUhGSUojKCi9kpqDqMXCtsCznpqsoK23paOOm6SioLCvqp+loJ6tmZ65oaOroK+pmq6hkKuopJaJmpCtr6ymnqWbrJeYj6yhoZ2loZqlna+Zoqmnt6rBr6Spo56LgI2bmp+mnpKUmZqUm5qmpaabqqytpKWfqai+pJbBqqmhoKqwt6mrpJ2yraaol3WvfpCLnIWHfrqtipllsI1lla19oY+Dp5WagayKhLCGp5qkoaKRhaFdbGuBs2B/rXt7g4GxbWdumZmNibFbfrVcpIRryKJkn4B7u1d2tVmyfFKugHqsV4ChbZePqJuMmJKamXx6kaB/ZHV/Y4Z4dYF9YmpncW5nZmVQVWRbQVZgPkkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5PUVJUV1peYGBgYWJeX1xbWFVQTkpGQzU1My4vQFVZWFdYV1hYV1dXV1ZXV1ZXWFdXWFlaWltcWFdXR0I70p+ysba9urPBsqKcrKaktaigipqgnZyzs6mfpKGetpmhtKiqrJ6vrZ6rm5Wvp6GOiJuOr6uopqGlma6SmI+omaGdpZ+apKOmmqGjqrOqva+kp56cjn2Lm5WgoJmPkZqbkpqYqaCjmqmuqKWmoqSou56fxaWjp5+psrOqrKSduauqq5SAqZKjr46bgIekl5mQgoC4w7qDjpyThKeXnIKsioKviaecm6arkX/WvcKqYqS/vX1+o4KD17u4tYaWlISevb6EbaOCb6uEbJyAerKwx4Npq7C8rHd2ob68c4CWjqadkZySmqB7g5OefGN+e2WPZ3qDfGFsZmtrY1FhW1NqXEBVYkNOKT06NC8fHyQfJTIgHSQoMDQ5NjY3Nzs+QUNGR0lLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz89QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVs7Owv7ixvLKinK2lpbKmnYuYpcCquLKoosCnqLOdn7Kduqifra+lppWUsKuXjIObka6loqygo5yqn5eKo5Kmnqebm6GppJmgoqyuqrqtqKOblpJ8iJmRpZuSj5GYmY+Yk6mboZmqqaGqp6CjqrqeqMOin6yhqbGyp62nnrilrKyZc3aqpLiGZImgcGiukYuQbm53pJCZn4F1rpmUcI+LcZaopJyYr6RzbW1tZot4b26CmXCBempxaWeKmJaZcmlqhYhncYZkXYhiam9ZXGZ9dqZfYXCNkG5lZX+Mk4+hmZmak5mhfYmRmHdmiHhpj2x6gHplbWRnbWNLZFhKa1o6UWZFUidLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXV1dZXV5eXVxcXF1eXV5dW1tVV16playzqLm4sbOqqaGtnqOyqpiSv7PFyr63qp/Bra6koqisn7qjpK6sraWNlq6pj4uFlpasnaaqoJ2ko6CRi6STp5mpmpekq6KXnqemqLC7q6yam5KSfISXjaWXjZGQmJWOmJWplqCZqaObsaadoqu5n6/ApqOxpKuur6irqaW1oqy2lYqhqaa3nYmWo5mIqpuRlZ2SqbOZmqKqoLKWoqGdn6KdoaWilaynjZOTjYeTnJyVkZmTmZGPlYWBpZuZlo+MlJSMkIeEfmeJfnSCdXOHinCnbHqTj5ORgIGNjpCPnZWil5qZpYSJl5B0apF3cox4eH16am1lZHBlVWBZQGpcSGRiUFkrRj0rJyE3NTAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFVXWV5gYWNdXlRRS0VDPjk9QEFTWFtcWVdYWFhYWFlYWFpaW1xeX19gXl5eX19gYGBfWVlgppapqaS0ta6uorCjrZ+ftbGQjazIvsa7uqujpp+dp5+xqaO2p52ptaenkZitoouHiY+bp5WspJ+ZqJ+ekpSjl6iaqJqVp6KkkZyomaK2uqiqmJqQjXyBlYuglIqVkZaRkJSXppGgm6mgnLajnaart6euwK2itaSura6qp6extp+supiRpaOntqKSnqegjqqgjpOfo6uwmqCjsKiwl6OgnKOqn56enZesnpOaopyUkJarmo6ZmZeQl6CSiKGel5WHk42RjpWLgX5li4V1hnR3h4JznGqFj5KTj4l9i5WSkpiUo5SfmaSFiZuKfXOXc3uMgHN8f2pvZV9xamBbYFpuZFFhZVFaOkdHRT4yPT45LyomKykmHSYzMTY2Njg6PT0/QUFDSUpHSktMTVNTVFVaYGBpYWVWUEtBQ0I6OUVNVlteXltaXFtbW1xdXV5fXV5fYGFiYmFhYWBiYmJkYlxbY5eVo6air7GrrqOppqyfp7WqkI+dpLW9sK2to6SbfJ+ksqSlsamXm7imo5SZqpyOhoqJnKKPrp6ilaifoJKWmZuui6mWj6maqo2aqZCfubekpZmcjYh5gZOMmpOKlJGUkI6Sl6OOn5+onp+4o3+Dr7Wirq50oruhsJ52eJ6nr7iTdKujnol/q39kXGJ2oI6ln4SYfW2Ss52ip62qo2Wen5JzeZqYcYGZqZhtf6KpimWcpp2Sl5iWjJOckYaem5GWhJOIj5CSiYV3ao6GdoVweoV/f2Boh4mTkYpadZSQZ2iPj3N8qJycZnubioV5mWqFjIRveoBrcWVgd3Bsa2lcZmViYnFUWz5OTk5TRz5AVUQ6MS8eHyY0OjMwNjY3ODw7PkBBQUZIQkdGSUtNU1RVWVxgaGZnV1FKPERHPDhVUltgYWJgXl9fYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaWioK6vq6uppaitoqetpJKWq7axs6ebq6itmHSNn7GgqKunlJe5oKCPnKSekX+JiJuejKyZopWnoZ2Ol5KdhXatj4mnm6mSmKWKnLu0p6CZmIuJdXeTjZaTiZORkJSNkJShj5yhp5mcsZWAjJu0nLKMko25pZ99p6J5oKy1f42NpZ6Di4aQsKqvjYuXpJt6gYushZyeoaaop4eVhZh3pZt6iJyBl6eDgnucs3qKhqGYmpWYloKRl5eEm5ljeoiQhY+QkouDbXCOh3l/cH+AhH2Fc4WDlJF3lmiSdKCadH2ZhKOgiZh/lY2GhZprj46HbHl8cnFoZXlwamxrXGVsa2Z1XV5JVExSQEU2LltVVTcpITA5Pj43NDM1Njg7Oj0+PkBEST9JRUpMR1NYW1lbYmFoZllRSDlFTDs+YVZeYmRmZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJeinqWsrKunrKCnsKamqaWZlK/Iv7Gil6iqt5+RhZ6tnKeioI6Qvp6ajJ+aoJB9ho+Yl4esnKGWn6GRjZOJhYCSp42Ho56klZmfh5+6sqedm5KOhXF2kImVkIqUj4+bjI+SoJKYoaSWnquHn7SJtJmtisqGqKyItoWMr4Guq4KojKaYjZ19qI9ze3ecj6eXaJWkebSMoJ2lp5KYwoF/q4iYoXKegJqlfpeFlbOBoX2hk6GQmJeBj5Sci5mSjH2Fk4eNlpKJg21zj4V+eXGGgIN7g3SEgJWAj8Vmf6mHj6NrnoWknYSagY6QiYyacY+Uhml5dnx4aGl2cmhobF5kcG1nbllnR11STTNFNTdOYmQ3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TkpKTENQWl1cV2FeaWxcUUU9S01ASWNYXWNmaGdiYmJiZGNgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSWoZ6vpqeopaufpLewqaummpSgo6SspZimrLmksIGiqZ2mnp2JlLyZk42hkZ6PeoSXlpGHq5mbnJqihI+Md5qcj5+QiJ+lnJeamYejua2kmpyMjH5ibY+Kk5CNkIyNmIyQkqCPlaGhmaCnfqGnh62dn5atj5ybnJCEf6CMqKyFo42pmYyaf6J1gZmUa4Ktdk2reIeNnJGap6aAqat9g6F7eqdqnn+SbGeYhpi3iZ5+bmBkWYOXgI18ZGiLcpl9eZZsXX2XbV9ScINcX2t4gl9YZIB8g3+WcKeqa4OjbnKlcJ+FoGpnoG1ccI5+Z1pghIFjWFFwd2ZudXNranBea3FubGpZaU9dWUY5QTVIRV9sNSxJRFJNTj04NDg1OTs2QDs7PkJQPlFSTE1CSlxdX1ddXmJ1YE1EOk1PTlRhXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlZyfuJ+po6askaG1u6quopmYoaKlra+hnrC2pKmToqGgp5yajpm0mZCLn4yVi3WClJKMiqaVlZien36ThYWspIebkIuaq5mbm5KIprGnoZWaiImAaW6Ih4uOjomLjZKMkJOjjZSfn5yhpH+TgY+ioJOfdpyUjqeBn6V+haeqgqV4iXyEmn6icHOUiJZ8n415bYabjJmPmqiZjoede4Kic3amZp5+d6RfmHp9lHSibpi3tLp0k4iDgLWoZIHGuHtwlbaMcoCao2NzrKtgfGmds35tfIaBjYKLmHF/o2xyo3SfhYGkYZ2ZtJdzfZifs3V0XJ6yg2tjcHV3cmlwWWxtc3NnXWpeYkxFPUQ2UkJaczM9U0dgSlI9PDM5NTo6NkQ7O0BKUD9VTU9RQEVfX1taWGBgfGRIQzhNV1VXYmFaZWZra2JiZWFkZGBhYmBkZF9gY2tuY2NkZGhkYmdmY2hok5aUoreYqpuTn42kt7SsraCaop2ko6avnZyzr62UmaKaoaWZmpWfq5uLiJJ4i4VxgJaNiZChj5OUnZh9kYqNqKGHl46Jk6SVnJuNjKmopZ6Pl4eEfmp7h359kI2Ci5CQiZCUoYOXnqCdn56LiXecmKGMn3Ghioaph5qkjZSlqHytjH56oJl6o5N4gXSWiI2cfZafhpuOmJqlhaJkoXyIlpCbjW2eaJuOb5qZe4CLp31yaXSrg5+DdKpolZpdm4V2hZ5nqmuAuGZcqHCBnGCVjF6ndnWHiH6dZ5p1hpOSl46An2+akW6nml6pf3m7a36qXI6EXbRoXW5yenhsalxxa3l6ZGFnWGJCUkZPN1dEUm81S1tbX05aREEyNTE8OzdIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TlxeWWRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcWBkZWVrZWNpaGdraZWbiKmzmqaIY5Sbq7qxr6yeppycqaCfr5yesqmun5ikm6GgmZeWoKOZhomNaYiAcnuXiIuWloSRlZiQeouElaScipSPho2fk56diZGpo6CajJKKgIBpgYZ4f5aMeomOjoiQl5t/lKKen6CTmHJon4mejotwkoyAqYaYnaCknqV7sK2joriXd6Ozo6SAiZR5nXurmX6ijpyaloiXcaF8hY2vtX1rmpGheX6ZtaOkq6iEmXybfZ6bf3SqWl1ve5aLeJ5iTH97eoVjeZdCTJ9Yomlxe45sgIiDmXWbeIaJsbN/gJuTp3eDnm50fpVwmnRrpF6VdkhlZGF0cn5/b2ZhbGl3fGVlYlFfV11VV0BaRlFoRVRXXWJYXklEPUI4QEE6SUY4TEVYQVdSW1dERmJcWmBLYG19ckVCPFVfYlplaVZnaG1vYmZnXmFhXF1eYGhiX2VjdmxdZWdma2RlbGlpa2mTnICvrJiDU16gprO5sbKomqKMnKycnKqVoq2lo6mQn56em5qWmKGdloiHiXeGgW95lYWRm4t8kZOXiHKBiZGhm3ORkIGJmpahm4WPqpyblYuLinyDbISFcYGhi3iGjYiHk5mWfJOkoJ6iiK2GfbWEjZ2ce6WVeamAlJqOiJ6ae6dod21+mXShc3J8noaZcJODrn2jg6WdmICjb16oZ3WiY2+lYZzTkH17mXhzdGKihpB+o3SkkHZrj7OMYIKYiXOqsqi8f3eDbX6/pqm0XZxte3CWbX9yonFdpGdzpmBopm2b1Jp+hptwe3uYbJx8eJhzbqmkZ2FlenKAhWxoZmRvdnhoYWNTXGZRUmJIWEpVYVhUXGZrXGVRRkNLTUpLQktFOE9AUU5YU1lPU1FgZmZqUmR3eXdJRkVjXmZaaGpUaWhqb2NqZ2BjX11dXV9oYmFpZXxkXmRnZGtkamxmaGxol5p/r6tUW0p+qa+xs6+yo5uZhZmqoKKlj6apoZqri5uZmZSZk5OhmI6IhXtwfYRofY+DlZuBd5GOj4pvf4aPk5Jsl5R8ipOUpZeDj6ublJKLhol5g3aIgG2Bn4Z3gJOGiJmjmHuUoqOZn4mzoaK2i3msp6SupW+of5mNhYCZj3qkf6GZhphynoSkrq+Kl4yAjaSNlYKtoJN2tba1yaFzlIuBn2Cel6ltepWHoZx1ooh3oH6Sl4uBcE1mo5JwmodzpXt5dGGDgWt9oGtxZF+ccX1zlmh6abO1s8amcph9ep1rnJurdoWbbnd5mGqafHaYc1FFfbNfandseohna2hjdXZxb1dfVFlpUFNpSldNWVRWXmlsb1ZoV01LQUpNS0hKT0JRS1BlY2ptZXRyc395fG51iXt7VFFPbF5pXGtpUmpoaWxnbGZjZV9dXV1eaWJkaWt7X11kaGNqZm9tZWlsZaCbh66lg2Q/k6Gyqq6utKKikICYqqKjpo2mqJ+ep4SbmJeOl5CQnJOOiIN6anmHZYONf5igeXWOiYyBaYSFkYOMhZ2Neo2Ml6aUhJiqmIyRi4GJeoB9i3hwkKGGeYKVh4mWoJZ/lKWnm5WVg2ZueJxsomR7cKV3m5dwZaaAlIl6pHmfloOXc553gYqVl4+5bpGKomJ9mKCUiG1yaaprdaBtb6Zgm2mLkGmWh5uWdaKBfppgjIaNdXCIYmigZZ5+aZt1b2NmiIFtcaJZXlpioWxdiItten1zcWSlbXiiZGenaJlzjJlwonBViZBwoGBmqFWLXlSYbm50bHODbnFpa3l0a3BSWVdXZlpUbUpaUF1JWGlpc2pZbFdRUkZWXExYU2JVaWtfeHR7fXB8fHKDe4Bzdo2AhHZeUnJiZ2NwZ1BqaGhsbG5oZGdfXV5dYGpiaml2dF1cY2hjampzbGZrbWOco5eleWRzbIqmraOpsLGmn4uAmKyen6eNo6KcpKOBlpmUjpqQjJiQjop7h3GAiGiLi3yYm3N0iX6Qe2WDhpSKipaagnyJiJiokoGjrZGGkIuCiX6AgI5yaY+mhH2Hk42JmKCPiJOppZyIpniVm36liJaKsZedj4Kulp6kdZOFeKlzpY+Emm6kooyShI2Du259pa+DhoWGkpWcn3ylenKolaCWZ55+b6xkloqWk3eobaqigYl2iYN3q5GmiGuRsGt2s4ypa4qFbW2fnpGUX32ri6p2fX6KpJ12n3yDpJWdoGqbiHisaJ+ujbZ1eL6NpJNag6eOq2F1c3VyfHVxY2t/b2htVFdbVmFiXWxNXVJeSl5tb3dgW3FZW2BbZ3Rlbm9yYnJ0YHh6fnlyeYNzhH6Be3uMgYOAdmJ4ZGNucmRSa2dob2xyamZpYV9eXGFrYm1se29cXGJpYmxqd21nbG5ilaSpm4B/naOWqamdqKatpJmKgpism5+mipymnquehY2bkIeckYaSjYyNdId7iIRwjYV+mJN0dIZykYNuf4uRh4aUj318g4eZp4+Ap6ePgY6JhZR2goeSbmyLqYCDjJSOiZ2fiY2TqaKfjn90k5eIfoF4k66ifoGacI+Fdo6Jgn17cqeMcX59epiWm4SQeXt/foeUlZOKdpCYnqCDe36Ja4yFW3l5cnpxaW5+kopygHWBj5STcYeEg2WMf1+BgIt3dXOUdW95bm2HbIOGXnVnd45lf4CFjaiafXR7lWqJiHCBdn2Hd25uaI10enyYeIVcbFh5j2lveHNycHh4cF1sh29qaFdbYFddZ2tkV2NVX1JgcHl5bWt3Zmtra3d9cnJ1c2FvdmJ0e4J4dXqCdYCAgIF5i4WDfXtuf2xkeW5eVm5naHVreGppaWVcYFpjaWVscXVuWltibGRsbHluaGtvYY6TtqemiqChmqajmKWcq6KhhISYrZKeooqbqJuqmIOCnIx/l5SHjoqJjXKDfI99fo+Ee5iPdHOEcZWFe3yRi4aGkIV5foCJm6WPfKihi4WPkIWVgoaOmHZyhKmGjpKdkImfnoiMm6aen6qDiI2Vmn5+iJasp46RpY93bpuOgXiQbn2ohXF+lXFrcH2CoI2Ak46LaGxcgouLm5qejnOVi4hxdGuCd3SBWXJuh5GCfn+Mal1qZXuGhIqAYGl5e5t7gouCdYGFgWd3ioZqYG9xgHVecYmAiY6lk4Rli42DbneLhHGGj3pxaGlmfYV7lltda2hudlx8enh2b3Rzg2hdbotsbGNaWl9aWW1yXGBiWl9eZnR/fHZwdWRra2t8fXN8eXVkbnVobXx+dnp9e3l6gIF+b4WJhHt9dH55c39pVFxxaWx2cHVna2dkXWFYamhra3FybldbZW5sZ3N5b2hqbGCLiqivoI+ioJmenZeemKijon6Dma6OoJWInaORppWAfJmGfZKZiomHh4tzfoGMdoWLgoSXinJvgHKYhoR+kYODhoqBe4GFjZyhkYOoooh4jpeIlIqLnJeEg3msgpGYmpWKnp2IiKGpnqGho4qHk5ucopmVqaCmpJ6RmoWTi3p2jY2Dp35/kpCTlJ2yppuVn5CNsZKXg6WMjJWan4mRm4KIkYprfI53eGWDh5GLfImehIeMkImJgYWFkHd8enSaoImGip2JhJN+fYqAf3Ruc4SBfXaFhomOpI+ChIyGgoyQjH2Hi4qRhHpuhIZ+eplrc2lhdItxfnt4d3B4dYJdXm+HaW9gX1pdXVNpclZlXV1ibWh2fH10b3Bla2ppgH1ueYByanBxbWeBe3OCgXd/fn+Fem2CjIZ8enh7fXqEeU5kdmpzbnB6ZWtlY2JgW3RlcGZycW1WXmx0bWh5enFnaWtljIecuJ6WoaCXlJiZlJikoJ58f5qsj5+OhqGdjJ6WfnmVhHyOmoqHhISHbnmBgXOBiH6JlIRta356l4eEg49+gIaEhn2IhY+cn5SIrKCEcoqQhpKRi52RfY16qYSOk5iXj5yWh4abpJ6hmZyFgpKamZiPmKafpJybj5V+jod0eoaNg6V7fY+QkYaYq6GelJ2QjqmNkICdjIiTmZ6Cj5d+ho6DcHiGcnVgf4SQhnWNmYGDj4OHhX+GhZVueXZ0kqKKjIWahIOMc3+JfHxxcXqGgnp2iI2DkaSOhIKOgIOKiYp3homLjX5ybYCCfW9pbG5oXnqAaH59d3Z3dnt4XWBxfm51YWRbXV9SZ25VZlxeYmtpd3t/cmxtZGtqaIF/bHSCbGx1cHpwhnluh4F2goB9hXZxgo2Ifnt8fH97gopgaHtqdWhpgmRqY2BpXGR1aG9idW1sVWNxeWVwentzZWptbYuInrWZoKKfkpGVmIqan5+fe3ifp5Gci4emlYyYmXp7jYZ9iZKDjYOCg258gHlzgIV+i5J9a2h9gpeJgYiNfH2GhId9j4ORnZ2TiqmdgXCLi4yShp+hioWMfKeRiJCTmJSWk3iMop6fnZWYfoCQmpiSi5mioKOYlZCZfIuCd3+Cjoagf36MjY98mKSiopOakZCmjI6BmpCJkpabfpOSfoeOgXV0gnF3YX6BjoZyi5d9iYxyjICDhYaPaXhyeIyYkY9/ln6HiXKBhnt7b3d6iYN5eI6LgpSjkoqEj3qGhoeEdoKEiYl9aHN+gXp8cm1saF9+c2l9dnZ0fXSAa19gdHdxeGVkWV9fUmtpVmZaYGFpand6gnJnbGRsaGaAgWtufmhvcWx/eYd7bIyBc4CBfoJ0doKNhn98e3+BfX+PaXKDbnRpYYdobGJfcVZ0b2xuYHhobVdqdHZjdXp7cmJqb3qJjJ6wkaSknI6Pl4+GnKCbnnx3paGOmICNo4qJmpZ5fIaIf4OKf4mDgX9ygHt0doKFfouReGdjfYaXioKKi3h9gI6EeZeDlpmYjpehm39wi4KRk4Wlm4eMiYOmlYWTjJeYkpJ3kZyfoJeTlnl+jpeXjZaanKOcl5GTmXeNg4F2g5WNnX6CiY2Mc5ejn6KUmY+PoYyKgpaXg5KVmX6YjXyIjYF2cX5ue2SBfYuFcYeTgJGCbIiDgoCJhWZ2b3uFkZiLfJJ4i4d7f4Z7enB9d4iEeIKOh4qXn5SBgot2iIODgnd8g4qHeGF6en91f3hobWZif2preHR0d35yfWNkYXNudXNuYVphXlttZVNkWWFhaWx2eodyY2tjbWZofYJsaXVobnBqgH2Cem6QhnKAg4N/dHyDjIF/fnqCg358kG12iXN1bWWKbGpiYnVWhGlwbmB4Z2xianZwZnl8enFgcmyGhY+brJamp56NjJeHhp+Tl5l+eKqdi5l6mJ2MjJmQeXyBjH59hHyBg4F4dHp6dH2AhICJi4BkX32LlId/hIZ0fX6LgH6ZhpeVmI6lopiAc4d7k5GJpo+MjoqSoJGEkpCVl5GLgY+XnpqRj5Byf42Rk4icnJ6ll5aLk5Vxi4uJa4SXj5l6iIiPiW+XnpuklJWLjJ6LhYGRnH+SkpWGmYh7ioqBenF6bHVsfH+Mfm6Gk4OVd3CDhH5/i4Blcmp7f5aXg36NdI+HgniGfHR2fnyEf3uBioKLkqGPeIOBdImHfYB0dYKJhXFifHZ7cn5wYnBkZXxjb3B3c3l4dHVid2BwbHZucF1cYF5ea15RXlljYWludHyKbGBqZWtjaHeHbmdtaWttaYJ9e3hvkIh0gYSEfXSBhol7g316gYR9fY5yeYt4eG1sh2poX2lyY4dncW9ld2dubGF6aWp9e3hwYXhti4CYmKmfo6idiYqShoqdi5WZfnivmY2Xfp+UkZeUiHd+fIp9fIB3eICAcHV0fHCGfYGBin98YVx+j5GGgIOCcnqAiHuQk4qTk52Upp2Vgn2BfY2KkaOJjoqNmJqNhpKZlJWOiYiMkZuSjoyMbYSQj5GInpmioJaUiJWPbIaXgmWEmI6TeomEkIpwlpuVo5OSiYuZjIF/kJ59ko6SjJmOe4qFh3RzdmxxbnZ9i3Rvh5GPk3F1gXyCg4h8ZnFteXyZk3yDiHSQiYBzh3htfnx/hHuDioaBi5Smi3qGe36KhHd+cXCBhoRmaXp1dnF8Y19xYWt0X3Fre3p6bXNxZnpeb21zbXNYW19gYmxbUFhZZWNocnKAiGddamlnYmdxjW9kamhlaWmBend2cI6FdIGCg3x1goiFeIV8eISFen+Jd36Le3tzeINqa19waHSAa3JvbXJnb2xlfGNugHp2cWx3d4p+opehp6Cmm4aLi4GPnIeTnXaCq5WTjoehjZaUkIB0fHeFeHl/c3N7hmxzcHtui3aAgYdvcFtZfpGNh4B/f3Z1gYGBoYeSi5SemaKVmHmKf4GMiJydio+GkpiWhYmVmpCXjIuMjYubiY2Pgm2Ji5CQiZyWoZuXlISWhmiCoYFlhJuJkH6Lg4uBd5OZk5+TkYmIlIx+fY6Xe5GMj46aknyKgIJvdnBsbW9xfIZqdISPmYtxd4B1gomCeWdzbnWAmY57h4R5k5B5dYdybod6hIp4iYSAho2aoYZ7g3WBin94eG5rgYSDX3R1dHJyeVtfcWFwa19wa358cW5ua253YXBwa3JtWVliYWJvWFFUW2ZnY3VwhYNjXWttZGJma5JuYGdnX2hrgXVyc3GLgHV/g4F5doCLgHiFf3iIhneDhXyGi397d4p/anFjfGOGfG5xbXRqaG9sdnhgcX95fHR1dICDfqSVmayep5aEjYR/l5SDkKB2jKCUk4aLm42Wjot6cnh1gnByhXRyd4lscG52bYh2g36AbW1VUYGqlIaDd353coN6g6KDlIKWlJmdk5t5kXuDjJKjmZOOiZSZkoSHl5qMlIuJjo6GnIOPiXtyi4WKjoecmp+alZN+knxmg5qFZoWfh5GEkYKJcYOQl5Ccj5CNi4+Md3qRkHqOi4ySlox8iHyAa3Zrb2tsbXt/YXp+kJeCd3qCeIOMfHpodGxzhpWLfYeFe5KPcXmDb3WLeYiLeId8f4mOnZuDe3p2gop8d3BqbIKEfGF5cW9tc3RWX3BicmJgbW96cmlwZmd1dWlybGJ3ZV1XZmFgc1RRT11nZV55cIl9YFxpcmJiZmaRal9oZVtncH5wbHF0in12fYWAdXV+jHl7hYF4iINzhoV/jIyEfHqUeGZxa4NgiH1vb2t6YGpudH91X3R9eYd4dHOFfXigj5mwnKWOgot/g5qIgI2fgIyalI+FiJiOj4+Ed3R3dIBxcIV0cHKEcGxqd26Dbn19bXRyUk2C38iS1pJ7cHWEdoWhhJR4l5KZnZGafJRzhY+eoZOTkIqTnJSGf5eWiI2Nh5GMh5t+jYB3eox+iYyJnJucmpSSeIx0ZYaQhWuHooSRiJeDhmOMkZmPlouXjI2KinF6k4h7joiKk5GJeYV8f218ZXJva2x7elyBepCQgXt9gICGjnp6aXNqc4qPiYGFhHyUimx+fm1/in2KhXuDeH+Nk5mYinx1d4OPeHNtZ3CAhW5rdXBpa3VuVF9wZXBaYG1zeWhsa2NneXNwcWRgeGFgVmxfX3dRTkxiZ2NdenGKdl1cZXZhYmZljmRhZ2JZaXNzbmtyd4x9dHqGgnV2fYtzf4Z/e4l+comIgpCKiHx+mHZlc258ZYh+b3BsgFlsbnl5c2B2enuNdnJ3ind5nouarpqfkIKFd4iVfn2LnoiGoJKPhYyYhJOPh4F1eHB5cW+EcG1vf3NlZXlxfW15fWpna2OkmsHcrvCgcmx2hXeGpIaTb5iSlqGVnIKScYaKopeJjZWKkJ2Wg4GWkIWJj4CQiYiVfYZ6dH+Jd4eEjZyamJiNjnWJdWyEh4l8iaKEkYmchIVei5OYi5CJjouKhIhse5WBfYiFiZGPhnaFfX5rfWR4dmpueXNYiXuSiIZ6f4GBhox/emZyaX+JjYmCgX+KlYRrgXVth4+BjoJ9gXh9jpSRl490cneHjHVzcWd1eoRjdW5xY2t3aFJhcmhsVmBvdXphcmRgaX9xc29bZHJhYlduW115Tk1NZWdiXndzim5cXWR5XmBlZYVgY2NfWWpza25rc3iMfnR3hIF4d3uJcYOEfX6JenSLiYiVhox/fpdzaHVxeWyMe250cYFXcXp2eXJkd3mGjGl2gIlyf5yGmKebo5KEfXGMlHh5jJ6FhqGNj3yVjYCaiIR7c3hwc2pwgmxqbX11X2F4d3txdXtnYGR869q1ycPch3JsdIJ3i5yKj2uakZCelpSBiXGEiJ+NhIuVioyYlHyNk4iDiJB7j4uFjoB/dXiDhHKIgZOblpSXhYt1hn1ug4CHhpehgpOMnoOJYYOUj4eKhoqNh4GHaXyTf32DhImOjYJxhn5/cXdodnNqdXdsWo18koOGfoGEgYWKgnZhcmuHgY6JgX5+kZB9boFrd4SOhJCBeoB7fY+RjpSIbXB5jIV0a3BrcnmCYXVqcF1sd2FSZXNpZlNgcXd1YXBgXWiEcnRrWGhpY2lZbldcdk1LTWZnXmJzdIZrXFxleV5eZGd7YWRfXVlrb2VuanR4in5zdIF+e3Z6iHOFg3x/iHZ2ioaPmIGMgnuTdWx3dnl4k3RueHt9WHmGcX9vZ3h3koJkdoaFcImWhZmhmqKKh3Rvkoxxd4+dfouaiYp9oH+EmoCBeHJ0bm9kcn9pZm14eFxgeXt7cXGAamFnYX/Vto+RpnducXh9cZSSjohrm5CKnZOMh3toh4qZhoGSkYaHmI58jY2BgYmNe4+MfYiEenN6g3pwh4CVmY6Tk4CHdIKEdIF+iJGbnYaVj59+iGKAk4eFiIWLjX9/gmd8kIB+f4KMj5B+bYN8g3VsbXd1dHd2bGOOgo+Ahn99hoCFiX9wX3FvhHuOi4F8fpCIenCDZXmBiIWKgHqEfH2RjY+Rgm1ueYt+dW1ua2t7f2RpbGtabndaU2pzaWJRY3N4bWNmXlprhG50YlxoX2VtYG9VXHBPSU9nZlxob3KAbVpcY3NgXGNsd2VlXV1abG1jbWp0d4aAcnB/fH10eIZ4hYJ9gIh1eImBk5V8iIZ2iIBveHl7g5NvbnuBd16Df3SBbWl6dJRzZ3OIfHGRkIOan5ughoh2dpR/bXeUmH+IkYSKjpp9jJp3fXZxb2xqYXV9Z2JqdXpaYHh8emxwf2VjZ2dXnY9fcnOWvcWFd3KVi5GAdJmNh56UjYlzaoiOlYB7lIyBhJuMfIqGfXyIjH6Th3SHhXZ2fYFxdYaBnpSGlI6CgnF+hnOCeoiWm5aGk42dgIhmfpODgYaEiolygn5nfYt7eX9/h4uPfWmAfYR2ZnB5eHN4dGxrj4aLgouAeYOBhISAa15wdnp9i4eEe4COf35ygGh3gYWJhIF3gnp+lYqOi3xta3qJfHZ0b2hofndlXXJkWXF0VFRvc2liTmh1eWdhXl1ZcIFwdFplY15rbmFxUFpsU0RUaGJabG9ufHBaW15tY1pjb3dkZ1xdYGtqY2xqc3eCg3Fvfnt/dHWDeoOCfIKGdn6JgZaReIOKdIGHcnl5fo2Qb297gXFqgnl6fm5tfHaVa2p4hHRrk4yFnpigmYWIb36Mdmp5mY+AgouClpiKeY+Wb3lzcWxqZGB0e2lgZnJ7W2FyfXpmcHphZWSOsbJ3S2JapdvSmHN8ko2ReX+XjIWako2Hb2yFkpF6eZOGgISZinyHgHl4iYqDlX9uiYZxc317anmGg6WQhJKMgn5ufYF0gXeEmZeSipOPlIWIcHuThH6Eg4mDboF4aICFeHJ/f4OKh3xlfH6EdmNxc4BpenFvdpqNhoSLfXd5gYV7g2tcb3xyf4eDiHyEh3qIcYBtb4KFjIKCcYN3fpaKjIN3bWx9hH52emVoan5yYVp4W1pzbk9YcnRnYEtud3ViXlxbWXV+dG9YZ15ma3Ffb09YaVM/WmdfW3FrZ3pyXFtZbGVZZHF5X2hdXmVsaGZraXF3f4dvbH9+gXVwgnqAgX+DgHaBhYiXinGCjXF7hXx6eYSUjHVren9scH51f31vcnx7k3BvgX94ZpGKgqGZnZKDhmeHhHBnepeKf4CFgpqKgXyNjWl4cmxsZl9hb3puX2NweVxkbIN6YHB2X2Rl1eu+izM6PoyPgHN6hoqQjneFmY5/lI6Nf25thYyLdXyPf4WClYl8g3hudoaEgpV2bYeEa3V7dWV5g4SnjIOOi4J8bX5ydIJ4g5qPio+Rko2Mh397koh5gIWOg2yAcmmAf3htfHyBioN4YnmEgnJkcWl/bnZydYKdjIGAhn9zdn6Bc4FwW2t8c3iIgYp7hn98iHh5cGqGgo6CiHCAd32TiYp9c21qdoCAdXVcaWl5cVlXflRbcmZNW3NyZlxKcnlwXVxbWl12gHZqWmJbaGZvY2pOWGdSPl9mXV52ZmB1cVtZVW9kWmVxeVtoXmBmbWhqa2hweH6ObWqBhH95boF7fYF/gnp1gYGMk4VwgItueH2Ae3uIk4mAaXt+anR8coZ7c3Z+f4x6eIR+fGuLjIObnpeMgoFtjX5saX+Pjnx+gIOUgn99iohrdXFnaWNbY2dzb2BibHRhaHCJemFzc15iY5ugkG5dNluwtnVrgYp+lId3iJmHdZCMindwbYWChnR5iXiJfZOIen9zZ3WIfXyWbm+FfWh2eW5leomFpIeAhoyJfW19dH1/e4qXhoCTkJiJi4WKfJCKcXx+hnxpfm1rgHt5anp3goeBcmB3gn5yZHJndoNudXyGlZKCfoOAcHd6fHV/bVdtfXVziYCFdoZ0gol6d3Jsh3+Of4NxfXt8kIeHeW1taGyCgXRuXGhmdXJSXH1PXXJdT1xzcGRWS3R5a1haWlphcoF2Yl5dYWdkaWpmT1ppTkFiZVxhd2FcdW5YWFN1Yltlb3NYal9iaGtnbWxpcHd8k2xphIp9fHB/fnuBf4J7d4CAiYyEcnuHb3J3g397iY2PhGp+e254eXaKd314gIKHgIN+fnpthIyImKONhYR7dot5a22FiZJ5fnyCkoCAfoqEcHJwY2ZeWWdfcHBgYGhxZmpviXRhc29bYGRqdnt/v52opcq5coaFdJV+eomVhHSSjodyc3CDeoJzdYZ0iHeUiXl5cWN2hXl/kmhxg3VmdnVjanyEiJ6Cf36OjXxxfXKCd36QjoJ2lY2UkIiCiHuJimx5eoB1aHtpbH95c2l6doCDfWhgd4d9a2p0aHuBanaBjZKVf3x/f3J8d3x0f2JVdXtxcoeCgXuBcIaKd3hvboKBi318d3x6c4yEgHVncGdsiIFxb11oY3RvTGZ3TV9vVlRadG5jUVB1eWJSWFhdYnKDdF1iXGllZWNrZFJccUlEZWJcZHFeXXhoVldWeF5cZm5pV2xeYWpnZW9uaHB3epNuaYiMeX1ze355goGCfXZ9g4iGg3B2g3Nud4KCfoiLlH9xgHx4enqBi3WDeH+BgYKEeoB1bn2Ji5ueiH6Ge3eHfGh1ho2Ren+AfImGhHaQgGdvbmBlXFhmWW5zYWFhcWxsaIluYHNpWV5jbYB3qdqpyIeIs3OLenGPdn2JkYF7lIuAdXR1fXZ/b3B/bYV0lIZ4dWxgeYB4h41lcYJuZ3VtW219gZCTgIB4kpF8d3pshXN+j4qDcpWKkY+IhoZ7f4ZtdXd/bWh3ZW18dm1rd3d/f3xhYniGemh1dmN+fGh1h4+Oln12gXZygHp9bYBaVXF8b3OBhX1/d2uIhnN4anN/goJ8eXt3enGJf3tyZnNkbYuDbHNaamB2Zklvb01cY1hXVnluYlBTdXdZUVZYXmFzhXBdYWNtZWNeb2NVXnNHQ2dgXmdpXVp8Y1JWXXZbW2dsYldrYGFuZmZscGhwdniPdGuOjXZ/dnh9d4GEgXt0fYOIiINvcX91cXV+hYGIjYt7d394hHx9hYd4iHx9gX2EgHt+cnV4i46fjIl7ind1g3pefoeajXmHhHSGh4V3iXtibm1cYltbYVZqdGRhXGhvcGeHcWFwZldcY2t/fMrOh7qia25vjG5yhXN+hox/e5OFenl0eXR0empsdmOEdpKCdnBnXnyAeIqHZHGAampxY1hte4aciIKBcpeTdn16bYZvf4iKhnCWjpCIhoyEe3l/cnJwfmdocmNueHFqbHJ4fXx5XWV5gHhpdXlngndodYiMj5Z+c4hqcH6AeG59XVdvfGxzfoh6gG5uiX9wdmZ2fn9+gHV6b3lyhXp4cWVxYG2MgWtyV2tfeV1JcGxOWFZfVVZ8a2JPVHZzUlJUV15jdoZqXmFra2ZjWm9iWWNxSEFpXWFnX1xWfF5PVmZxWltqaF1YaGFfcmZqaHFncXN2h3lulYp1f3t4fnmDiIB1c3+FhY6DcG97eHd1eoaFhoyGenx/dYt/fYaDhId/fn59hn98eHZ5dpGUn36NfYtudYB6ZISImIZzkopvhYWCeoN1ZG5qWV9bXV1UaHNmYVlkcnJngXJha2RXWl9pf3i+rnugt25jdYhpdX1ze4WIe36NgHd4c3duenZlam9gh3WOgXNqYl59dniKgmVwfWdra1pWb3iLo4GFfnCZknF/dnOAbH6Aj4ZxlIiNiIWJhX15dXNwaXpham1hbXZqZ2treXd6d1pmfX14ZXJ+boV0ZnaGjYaXgHGMaGx7gnRtdWJbbXpqc3qJeoBldId9bXBndH12fX5wemp5eX94dm9ka2BtiX1sbVVqYHhWTGxtUFNQaU5ZfGhiT1V2bE1RVFVfZ3eEZ15hcWlnYVdpXV1sakpFa1tjZVdZVnpaTldva1ldbGVcWmVjXnVmbGVxZ3NwdIF4cJmFdn9/eH98hod9dnOCh3+Vg25zeXt7c3OFhoiJhHmBfXaPf32FiY6EgYN6fouDe3d8dnaZnZh6ioOHaXZ+fW2FhZWBco+CcYaCfoKAcGZsZ1hdW1xbU2VxZV9YY3N1aXZwZGViV1tbaH9wb3KAc4plZnqAa3Z3dHWFhniChXp3dHZuanpwYWhrZ4Z0jYRuZl5ee255iHxnbHdmamRWV3NwjqZ8hHt2lpBze3F6eGx5eo+DdZd8iIaEh4R9dXFzbWh1XW1pYG11ZGdnaXpve3JZZ4F3dWhwgHiCdmJ3hYt9lYJvjGtue4FxZXNlYGp4ZnB1iHl8YXWDdmprcHR5b3l4cntlfX19dnVtY2RgbIZ8bGpVamJyVExrbFBNT3FIXnxmYU5WdWVLTlRYYWt4f2ZeZ3NqZWBXZFhjcl5MTGxZZGJVVFV0V01Zd2VaX2xhXFtkZV93Z21ib2p0b3F+dXSZgXh/gHiAfoaEen12goN+l4VucnR8e3RxhYWPgoF6i3Z0kYB8gZWOgIWEfH6Mhnp+gHZ7o6aKeYmGhWx1fXx2hIONe2+Gc3qFfYKDdW5qaWVWXVtbWlNjb2VbWGF0e2pobWhgYVheWmmAaWtwgGhtYml7emt1dXVwh4J6gX53dm56aGp5al9lbmiBd5CEZ2VYYXZofYZ5bmlvZmZdVVhvaI+od4B6fJCNeHRufW1xdHiNfneUdIaDgIaJdmpzd2hpb1xtZV5uc19nYmp4aHttW22Dc3Rqb4F+enhid4WFeZGGc4hycHp/cmNxaFttdWRucYZ6d2FzgHBnaXdzcWt3dnN1YoJ5fXV0b2NiYmx9fGtrVWliZ1RMbmlQSFNsRmJ5ZmJNVHJeSk1VWmZteHtmX21xamRdVmBWb29YS1RpWGdeWE5WbFRLXXpgXF9sXV1bYmVgemhsYW9wdm5vd3V6mH13gIF5gICHhnp5eoN9gZOEcXR0fnp2dIWIkH6BfZFsc5WBe4KfhX+HfYB+hoKAint2hKyff3qIiIRscoN7doGAgnVviG59gHSKgGpvbmVkWF9aWlpVYmtnXFpfdoJpXm1sXGFXW1xrgWVydH1qal5teHdpdXhzb4d8fn56dnJsemhpd2ddZHNoeneSgGNiVGNuZYGEdXZmaGlhV1ZZaGSQqG9+d4CLjXlwbntmd215inp2jnGEfn+Ah25kd3RlaGldbGJecG9baF9tdWV6aF10gG5ya3F7f3Z2Y3WGjHyJiIGAeHJ2fnRhcGxYcHFhbm+CenNjcYBsYW16bmpoeXhzcGSEdHh4dG9jYGNtc31pa1RoXl9VTHVkUUhXYkhjd2ZiTFRxWUtMWFlpbHd7ZWVucmZjWlheWXdnVUpdZFhpWVlJV2VRSWN5W15fbVteXWJkXn9pamBudHhtb252g5d5coGAfX+JjIZ+dnaGeIaMfXR1dYJ5enqCi419f4WJanSXgXuKnX1+hXmAe358holzcY+ujHt7h5B+ZnGJe3R+fXdzcIZtfH5tkHpjcHBiZV1lVlpZV2RmbGBdXXSGaFlwbVteWFpcbHticXd2bWNcb3V1aXZ3cm+GeX+Bendub3RlaHRlW2d0ZnZ2kXlfXVJlZWmBgXN8YWJpXFRYXmNkkKVoeHSChZB3bG14Zndse4N5dIdygXl9eYBpZXdtYGdhX2pgXnVrWWZdb29iemVbd3xrbm9weHl0dWVzhJSAiYOJe3dwcn1yYXhjWm1uYG5vf3pzZXGAZF5udWhjZnd6cmttgXNxe3FwYV1kbW99ZGlTaFlaVU56YFJLWllIY3VkYUpVblVKTFpXam1ze2RsbHRjYVlaXGJ3XFRMZF5ZalRXSFlhTkhrd1lfYW5bW19iY12FaWhibnh5bW9qdoGQeW2CfoCBkoiEgXd1iXSMh3RydnaBd319foyPgX+TfnB4loN9mZJ5gIB4eX5/c4eEc3CZoXt7f4mWeWV1iXpzeXdsdHB/bHl8cJJzXnBvYWdibFRbWldpZG5mXFxyiWVTcm1bWVhXYGx2Y2p1ampfW291cm51dHVrh31/gXx3b25sZGlwY1trcmR0do5zXFZTY19wfn5wgFxhY15TWmFcZJKfZXJxhYOQc2tpeGtubnl5enGAdn9ze3p7ZGZ2aF5jW2FoXF93aFdiX3BoYXdhW3x2ampybnh0dHVpcYKWhIh/hXZza3B7bGZ3V1tpbGFvcX54c2VvfltgcHBhXmlwfWtqcn1wb3Zpb2BaZGtte2FmU2ZVWFNReF1TUFpSSGR0YmFHVmxRSVBaVmxsbHxlbW9yYVtaWFptcVhTUGdYV2pUVUZaXU9Jc3ZZYGNuY1hhYWFejGpjZW16eWxvaXZ5hntrg32AhJp8goR5fYhtj4Zxb3Z6fXSCgn2Lj4ODl3R4gpSGgZ+JdYGAgXR/gnCHg3Zvopdze4aMh3tmd4tvbnxwZ3hxe2xzdnONa150b2JnZmtTXlxWaGJtbVtccYxkTm9tXFZXVWZpc2hjdGVlXltwd29xdnZ6bIh9f32Id5BzY2Rrb2Fcbm1jc3iHa1pUVmFid3t8b4RcY15jU1pgWmOWlGNucIKFiXJpZnhtZHJ1cXpreXR1b3t/dl9nc2RcX1diZFlidWVVYGFtZGFxXV1+b2hpc3F0cXV3bG2FlIOKfIZycmdue29xb1JaZGlkb3F+dHNibXVVYnFqW15uZXxka3V8cHFxaGxeWGNpanheZlRkVVdRVm9YUldUUEhlc2BiRlhrT0lZVVduaWV8aWx5a2JXXFZcdWVUU1dpUlpnVVRJW1pQTnl3W19lbWpaYmFeXo9uYmdsenZub2l2dn9+bYOAfYaYe3+HgYp/a5OIcmd0gHt1gIN+iY5/jJNzfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4KNjHd4bnqNYGV9cWd6dHltbXF3g2dkfG1jZ2doU2BfVWdgbXBcXm6OaE5qbGBVVlNvZ3NrZnhlZl5acnZuc3x5dG6Je4B3nHt6a2FlbG1eYG9qZXF5fmdaVVdfa3d6em6CXmFdaFZZYFhknIhia3CBhnx2a2l1a1t1cGp5aXVybm98gXNZa25gWV5WYmRYZXFjVF9iaWFibFpgfmtmbHR1b214d2xoho2AinuIbnFmcHtscWxhWF9nZ21xf3JyXmlsU2VxZFVibWF4YW90enRpbmppXldgZmh1XGRVYVZUT1lnU09dT1BJZXBdY0daak5KYExZbWVgeGlvgGVgVV5UXnZcVVNhZ09eY1VUS11aUVp2dl1fZm1oWGNhW16OcWNoanhyc21ndnR5gnOCg3qIj398ioiOem6QinRsc4F0f3+IhYeShJWPen2Mj4eRm4SAfI2Ecn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6OjY2NjY2NjY2NjY2NjY6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2NjY2NjY6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDRERERENHZGhnZ2dnZZCioKCgoKOAZGdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1NDlcYF9fX19dkaakpKSkp3xdX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmJiZmZKPkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFhoiJiImJiYmNj4+Pj4+Pi4iIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7enx8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQkJCQkIuOkZGJh46KkJKTkYuQjI6Ph4+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjY2Njo6Ojo2MjIyMjIyMjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCLhYmKho2GiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkIiFhoqFjoaLj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt9e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQiIWIjIaMiIiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fX19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhIiHhoiFiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf313eHp7enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+KjoqLjYqOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aAe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomHgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9+f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSUk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OTkpKSkpOTk5OTlJWVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZGSk5KTk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZKRkZKSk4iFk5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJKCgpKQkZGOdYaRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCPkIhwhJCPkHx0iJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6PjHNvio+KcniHj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX5+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNd217j4JzeIaNjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fn5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4dzbm+Ee3V2gIWDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFlYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3dGJeZF9ha3FmaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhiXWpsXWVmZ2VjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZGSElKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWlpqd2xibnJqYllZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NW2tya2FtdHJmUVFTUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU5dY29rWGlzdXBTTU9QUFBPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRkJGSFViZ2xvcG9tbFpMTE5NTk9NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUNGR0hNWmdoZ3JubmhmZGBeXlhMSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+SVpdWlxlbG5qb21tbGtpaGtkU0dFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7PUtbaW1ub2pvbWtqbG1mUUdFREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwc3R0c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oj1IY29zbW5sa2xoVUM+Q0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3RycXR4eHl9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTk9SmBzc3BoVD86Oz1AQUA9Ozs+PD08QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl6e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09Pjw6Qmx9akA6Oz49Pj8/QUA/P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A7W25APkRFP0BBRF9kOz09Ozo9P0FBPz9AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSktIVnBwcXNzdHR1eXp7fHx+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojptd0g4Ozo9PkE7SGQ9PD08ODo7REQ8PD08PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlgcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPTw9SUxGRXV2Tjc4ODo7Pj9XakE7PDw6OjtMUj09PTk6Pzw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDcnpKO1x/g396fHdXPD0/PT0+RWh0TDo9Pj89PE9oS0A8ODxBPz4+QT07P0JAQkNCQEJDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VFP0FHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUdyemtig4SDgoOAfV4+QENAQD1Kc3tZOj1BRUJBUG5eVFBIQUNDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARW50fYKCgYN+fYR2TUFDRUA/Pll7gF0/Q0VJSklUaGdlX2BYRk1NRkVFRURFQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHt9f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXJDREVEQ1d1hoeHflhHSEpNTVxpaGplYmdaYU5JSUhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnV2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEiWxBQVZ0h4mHh4eIg1dITE5NZnZvaGtpbG5hR0hIR0ZIRkhFQ0RERkVEREhIQ0NDRklLS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIhFZshYeGhoaHiIiHfFBMTU5seHZubW9xcFE/RENCQ0ZGRUJAPj5AQUJAQkQ/Pj9ERkhERkdJS0lKSEhIR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xLSlSBg4SEgoKFhoaEgoWFhISGhoaHh4aKdUpJUnR6g3dwbWxuVjs/Ozo8QUFAPjw5OTg8PD07Pjs4Oz9BQkBBQ0NCQEFBRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGAgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISklJZYWEhIR/gYKDgoODhIWFhoeIiIiIiYyPZ0VZa296bmxvcXNPNjk2NDc5Ozw6ODU2Nzc4OTc4NzU4ODs7Oz1AOzk5OT08Pjs8PUFDRUhKTUxMR0lHT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlohoSEgX6Bg4ODgoOEhomKjIyLi4mKi42KZ2RqbGNlaXWBczw0ODczNTY4Ojg3NjU2NTY3Njc2Nzo2Nzg4OTo3NTc4OTc5Nzc2OjxAR0ZJR0lGRUZPU1JTU1JPUFBSVGVwcXN0dHZ5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANjc4OD06PUVDQmWFg4GAgoODg4ODhomLiomJioqKiouKi4uHc3FvZmdwcn1lNDY4ODU1NzY5OTc3Njc2NTo5Ojo6Ozc5ODk4NzY2OTo5ODg2ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1dnl7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhYaJioqIh4eIiIqKjIuKi42HeHNub3NtcWE5Ojs8OTo7OTo7Ojo5Ozo5PT09Pjs7PDw6Pjs5Ozs8Ozw7OTo8ODo6Ojo5OTk8Pzw8QUJESUpNS0lLTFdvcnN1c3Z4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4qMjY6Ed3V5cm9vXUJCQUI+QENBQD49Pj5APz8/QD9APT0/Qj5AQT9APz1AQEA+P0E8Pjw7Ojs6OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PDo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uLi4yNjY2Be3t2c3FWS0hISEVGSEdFQ0FAQkVDQ0FCQ0I/QERIRUNFQ0VEQUZFRkRFRkRAQj48QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDREZXhIKDhIWGhoaIiYmIh4aGhoeJiYqLjI2MjIyMjIx/ent0Xk9STEtLSUpKSklGRERHSEZEREVGREJISUtHSEdGSEdFS0lLSUpLSkNFQ0NEQkFCQ0JEQ0NERENBPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT5CQkdHSVmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjY2NjY2Mjol7enBcUVJOTE5LSktJS0dER0lJSUVGSUZGRUxMTUlKR0dISUpOTU9MTE5LR0ZHR0VFQ0ZFRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg3PDs7PTo+QD4/QENGSUlQX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjYyMjYyNjYR6enhkUE9NTkxKSUZKSUVLSUdLSklKR0dHS0xOTExISElKTVFOT05MT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1RucHV3d3l6eHl6e3x8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AOTo8OD0+Oz1BPj9BREhKTFVxg4SFhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMjIyMjHZ3dHFVUlBNTElHREhKSE1MR0tPTEtKSkxNTE9QTkhJS0xPUVFQUU9PSkhKSkxKS0ZHSEdGRklGRUVCQUJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4qMjIyMjIyOfmRgaF1XVVFPTUxFRkdNUE9QV1VRUE9RU1JNU1RPTVNMUFNVVlJTUVBMSk1NTUtOSEdKRkVISkVERUVCRUNjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CQEJCR1ZORk5QUFRYe4aDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjI2PjIyMb19eb2RIVVNTUks7O1NUUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9NUlFQUFFMTEtISEpIRUZJSUlISWlydnl4eXl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHR0ZFPz9BQUVBQ0dFREVMWFJNVFVWWFp8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfmGKi4uIc2JpWT1bWllUUj9AV1ZZXGRgVllicl1dV11aVkVRWVpbWV9UWWdSVlZYVVRWVE9PTUtMSklJTE1LT01Tb3R2eHl4eHp6ent6enx9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYuMfXNzW15dXFNVU1dXVVtadYNZVX2QYVxYXV9XSVZdXVtbX1lIWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeJioFuhomIh4SLgGlcXF1bVldVWFRSWFZjloBSZXJYWldfaFBgZltbWFxnYUdPWmhnXVtcXV1XUk9TUFBSVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FQUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfoB9YFRYW1ZUVlNSUk1QTUxmeltdVFlVVl1aTFRaVVNUXlpYV1dXemtYW1xcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fH1+fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlVjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4h6b3NaTk5RUU1PTEpLRUZJRkM/VGRVf1JRUU5LUVRRTU9ZUk1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dXVzc3d6ent7fH17fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5cWVVRTElMSWFsknRQUVNOUVJRUltSU1JRUlVUYXN7fH+AgYKBgX99enuAf4OChYaHgoaGhoGEgYaFhnZhXk9HQUVFRERDQUVRQ0VBQz5DSUdWQEhOTEddaVBIRk5GREVGSUdIQkRIR0lLR0RCQURAT1FNU2RydHZ1c3R1enx7e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1BVWVNVUVFUUk9WX2tscnZ7e3h5dHJuc3RzeXh9f4OAg4OCgIKAg4GCbE9JQkI8PD5AQUBAP2tRS2BFRkhJRUI/R0xOR01SVUlCRT8+PD08PT0/PT9BQ0NAPz09Qj5KTkdVbnR0dXN0dnh6fHt8fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSkpQUU5LTFFSUVRVVVdRUVdVUFhbYV1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlREJCQj47Q0NCQkRCXF1Pe05PT05LTE1PT1FMS01XTUhHQEI8Ojc3NTk5PTs7Ozg6ODo/PEJIP1xzdHV1dXZ3eXx8fH18fH19fn58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF9dWklIUFJRT01QUU5RUlRWWFNTWVRPWVpcV1ldXl5fZV9dXnF2a15gZ2t3b29sam9ubmxlYllIR0hIQ0JHSUZGRkRNUk9hV1NXUVBTU1JVW09PUVZQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEM+ZXNzdnd3enl7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFZXXlpYTUtUVFNQUVVPTFJTVFdYVFRZUk1YWVpWWFhWWFldV1dYaHNrXVZhdGthYV9eZGFfXllVUU5PT01JSEpMSklGQ1FQU1pXVFROUVNZU1xlVU9TVFJOS0lIQz9BOTk5ODk3ODg1NzU3ODU5OkducXR3eHp7e3x+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RWVVVVV1BTVFdUVVJdbl9STlpgW1dZO0RWWFRbZkpMUFNST05NTk5OTEpGUVBVWVNUT0pOT1VTVFxWUlVTUk9NTElISEY/Pz06Nzg3NjU5OTY3Njc1V3Bwc3d5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXVJUWldYVVRXVFJYWFlZWVNVT0pHT1BPT01SSk9QT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFNNSUxKT1JQUlJTVFFST0xNS0xMSENCQT06Ojg3NjtCNTU2Njpkb3F0d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaGlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpJR0VITEhKSEZMTVBNRy9FX1I+Mz8+am9hU1JRQEdUUVBRUFFOUU9RUExKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHZ5e3t9fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hFRkhKTUxFR0NPUkM4RU5TXWdUUVNBR1VQT1FRUE1NT01LTEtMTk9PUUxPT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ0eHt6e318fHt5fHp6fn58e3V0dXJ2dnp7eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTkxRU0xUVVRYV1VMTEtJPDk4Nzs+QD48PUFAQj0+RUhHQ0VGSUdKSkBGQUFARkhFSk9IUVJiXFFQUk9TT09QTE1PTkxNTU5PTltXS01RT0dJSENISkxMS0ZGRkU/QkM+PEJHP0I/QWRwdHZ6enp7fHt6end7d3l+fnx7cXN0cHJzd3N4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0Q9OTc3OT9CPjs/QkBAPkFESkVDR0dJR0lFQkI/Pj1DQkFHSURNT2JlUU1PTldLTE5LTE5NTUxMT05TZE5KTFJJSUlFQUhKTE1OSkdJR0JBQkA/RUZFSERLbm92eXl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTU1KTVBNUE9ISkQ/QT05ODk6P0I/PEFCQUFERUdLRkNISEdHSENEP0I/P0BBPkNFQ0tOUlRMSklNVEdJSUpMSktMSUpNTU9QUlBKR0NMR0NCSklMTU9OSUpJR0NDQ0RISk1MSVlybXd5eHp7enl8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb21wb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUdLREdISEdKS0lKS0RGQj0+PTo5OjtAQj89QUJDQ0dGSUtKRElJRkdHQ0M7QUBCPkBAQ0VDSU1QSEhLR0hLREhKTE1ISkxISUpMS01dUkhIRE5GQUNKSk1MUE1LTUpLRkdHSk5OUU5MYm1pdnZ3enl7en1ybWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktERkVHRUZGR0VHQkNAPjw9OTo6O0BDQD5BQ0RFSUVJSkxGSUlHRkZDQjtBQkM+QENEQ0RHTE5IS05IREhFSUxOTUdJTEdGR0lJTE5LSUdFTkhCRk1LTUxPTU1OTUtISElPUlJTTlJmZmZxb3N4dXt6fGxoam5la3Fsc3BmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSURGRkVDQ0JFQERCPj8+Ojs7PTo8PkNBPkFDREZKRklITEhHR0dGRUNAPUREQj5BQ0NDREdISUdNUUlGRkdLTk9LRkhJRkVERUlKSEtJRkhPS0NJTEtPTE5NT09OSkpJTFJVVVJPV2RgYW1ncXJvcnl6Z2VoaGRpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxIRUVIQ0JBQkQ8QkE+QT06Oj0/Oz4+QEI+QEFER0pFSUZJSEdGR0RDQkFBRkZDQkJCREVER0dIRkxRTElPSkpNTElHSEVHRURDSUlIS0pHS1JNQk5OTFBOT09NTk9LS0tPVVdWVVNYX15caWFtaW5ocnNiZGZlZGhoZm5qZm1taGtrbXJpcXZ0c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3d2dHd1anN1bnV0c3FyamtzTUdIRkhCQkFERTxBQEBDPDg6PD45Pzw/QkBAQERGSEVIRkZIR0ZGRENFQ0RJRUNGRUJFR0VGR0dFSU1LSFFNSktISElFRkhIRUNJSUlLTUtPU05EUVJPUFFOT01OUE1MTVNXVlhYVVhdWl1kYGliamlna19kZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpbnlNSEdISEJCQkZFPD9CQkQ8Nzs9Pjo+OkBCPj8/QkVGREdERUhFREVDREVGR0pFRUlHQ0dIRkhHRUNGSkpHTktMS0hKTEZJSUtIRUtLTE1OT1JUT0hTVFJQUk9RTU5RTk1QV1pWWllWWl1aWGFgYWBeaGVjYGRlaGdqaGhpZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1d3V7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5ISEdJREJDSEU8QEVDRT04OT4+PTw8QUI8Pz5BQUZDRkNESURERUVGR0dHSUZHS0hESUhHSUdGREhLSUdLSE1LSktMSExLTEtJTUtPTk9SVVZPS1VWU1BTUVJMT1FQT1RZWllcWllbXl5dYGNeXGFja2JgZGdocoVoZ2lmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB0TElLSUtGQkVHRTxAR0NEQDo8PkA/Pj9CQTxAPkJBRkNFRUVJRUZFR0ZISEZISElLSkZKSEhLSEZGTEhISEpHTExNTExJTUtNTU1PTFBQUVVWV09LVlVUUlJRUkxPUlJRVltbXV5bXF5eXmBgYWRdY2BlZmBlaGpkc3Nmamdna29ycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKS0xKTEdDRURFPEBGRERDOz8/QkBAQERBP0I/QUNIQ0ZGR0lGSkZHRElIR0lISkxISEpKSUxKRkpMSElLSkdLS01NSkpNTE5OTVBLT1BSVFhWTU1UVVRSUlFQTU5UU1JXW11eX11dYF9gYWFgYWNlYmRoYmRpamd2i2xqaWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnVud0tMTExNR0RDQUQ8P0VFRUM9QUFDQkJDREFDRUFBRUdDSEhJSEdKR0NHSkdISkZJTUhJSk1LTkxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOUlBXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BEQkVEREZCQ0VHQ0NJRkNJSkpJSUtHREtKR0lKSUlMSEpKTkxPS0lMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGF2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUX3d2aWpnaGZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RDRUVERkJGRkdERUtGRkpNTEtMTEdHTUlHSktIS0tJS0tOTE1MTExJTE1MW3NiZHBebG1VTU5mc11mZnFsbnRncGlfYVlubmJwcGJrampmb3F0ZXRub1xvdWdwTUpxeXZrYWBrZWVteGxrdmxtcHNycHJxcHFycXJycnRybW1zbm5vcHN1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUhHRUQ/QUJAPkNGR0NGQ0ZFRkVEQ0hISERFS0hHTE5OTE1NRkpOSEpLSklMS0pKS0xNTk5NTUpNTU5bcm9vbnBwbGtNUFFsV01pYnRycGFtbnVcWWxQXG5tWnFta29teHh0c2lwXV9ya3FqVXV5eG9jXmtmYmdwb2pqbm9wcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHR0VFRUJCQj5AQEZIQ0dESUZFRUJGSUhIRUhMS0dNTU9MTU5HTE1JTEtJSk1JS0pKS09QT05MTE5OTFxoZHVdbHFXbE5QUW1UWWtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl0eGtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITEZJREVFQ0FCPUJBQ0ZESEdMSEVDQ0hLSUhGSkxMRk5MTFNSTEdMTEhOSklITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllya2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altedGN3eHJqbnpoYWFjZmJiaW10dXBzdXZzcXBwcW9xdHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9uc3N2c0hLSElCRUVFQUE+RERCR0RISU1JRkNGSkxKR0ZLTkxGT0pLV1JLR0tKSk5JSEpMSUtKSEhLTU1NTUlLS0tTa2NbaV5faWNyclpfWWpuX2VlVWtfY1thYVFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBqbXFwbnR5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW52cXF2dHdyR0dGSURFQ0ZBQEJGRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpFSEhLTUlISkpLS0lISUZLS0tMR0hLS0xNTUxKS01OVFtcVFBUTFBPTk9PVlFPTlFOT1FKSk9QUWRxaVRZV1xbXFZZW11YXVxcY2ZhYWViY2ZfX2ZrbmltdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRUVBRUNAREhERkdDSUtMSEZER0tMSUVHSVBLTE9LTFdMSUVFSElKSElLSU1KSEZHR0lHSElFRkxJSkxPTUpQXFdeUFxbYF5NWFlTXFxiXk1YWk1YYVJLWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cnhyeHNxcnVydE9CQ0RMTUJEREJFSUVHR0ZLSktIRUVJSktGRUhIUEtNTUpNUkhHRUFIRkpJS0xKTEpIRkRJRkRGR0VGS0hDSk1MTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5eXF5TWl5jXlpdYGNgWV9jW2BeW1RYV1leXWNiY2FjZWhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhoaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVJKSk1JRUNCQ0dIRkhHSEtKSklERktLS0VGSUpOS05LSExOR0hFPkdHTElLTEtLS0lHREhEQ0RFQUZKRUFLTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVlVVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHh5eXl5f359eXV5dnZybnp3dnhZUUtGREdFQkVHSUZHSEhGRklHSEdIS0lMRERLS05NTEtIS0pISUY/R0dOS0tLTUtLS0lGR0NEQERBSElDQEpLSFBdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXWRjYmRjZlhRVlRRWldaYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZERktKRkZGSEdHSUdGRklMSk5GREtLTU5KTElLSkhJRkJISFFNTEtPTUpLSUdHRUQ/RUNJSUNDSEdFVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVVZYVJRX19iYmBgYmJgY2JhZGRiWE9RUFFaUltdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhIWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FIRkRHTVJIQ1FKRUdISEVGS0pNUEVGSUpLTkxMSUtMSUlIREhLUU9NTVBMTEtLSElDREFFRElHQ0NIRkRXVUVcVF1TVl9YT1RVTlpaTUlKVGBhW19YXl5hXU5YYVxgYF9iY2JdYWJXX19UUE9PT1dRXFtbXFxeX2JmZmVsZW9vd3x7gHt9f4CEhISEhISFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35KTkZERkZIRElSYlBDVl5JR0dIREZNSlBQRUlJSktOTEtLTEtJSkdFSk5RUU5PT01NTE1IS0FEQUNER0RDQ0ZHQk1IQktLT09OTEZNRkdJSkhHTEtNT1BJTE9QT1NQS09TUlVaWVdZWFhkV09TVFBQTk1OVFJaWFhaXVxgYWRlY2dja2xwc3J5eX97en+EhISFhISEhIKEgH57gYOBfXuFhIaGhoeHhYWFhISEgoGAfUtJRUVIRkdES01dTEZHWExHSEpIR01MUVBIS0tLS01NVU5PSkpLR0dLUFNTTlBPTU5OTkdLRmBFRF9MRWdkRk5cSV5bcm1PTVVtWUxEUGBVa1dnSl1XVV5ETFFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqUlZVVFtcW2BgYWJhYl9maGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFR0ZIRUVLT1NJSkZgU0hKT0pJT01SUUxNTExPUlVST09JTE5HSE1RW1lPUFBOT09PSUpRf1FJfFlZcnRZUW1IcW5vYVZQcXFzUENrc21xc3BTb19ablhdVlxYVWtoVV1WY1pgWVtfVlZYf2p0dXVeX3ZeV2FbW2ZbX2BhYWFdX2FnbXBsX3B3dHiBgYKDg4J+fX+Adnh6bHZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSkVITU5CRExMRklLRVFVTEtOSUtSWFdRTk5PTVFUTk9RT0tLTkdNUFNbWlRRUk9QUFBKSFp4XVR4ZWhaU1VSdmd0bHBibmZqUXJPTXdtanJwc3Jxcm9vb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Jye3xvfnhugHJfYGBiYVpgX2drbmtibGZnbXd+gYCCfXt4d4B0dnppcn5uc3x+d3h7foCDeHyAdXx/fHxzc05MR2BdR0FFTU1ISkpHSU9OTU1KTlZeWVVMUVNOWFpNU1NSTUtPSFFSVFlXV1FUUFBQUUtIZ3hsY3hybVtLTlZ5cHVtdWJvdlBlZUlmdnFtd2+AamZ4d2lXclFoem1panp6fWx4en9vaG9ZdnZqdnVwgF9yZn1pbHh8b15fX2JhWl1iZGdpaWRnYmNkbGxwcHN0c3NzenFyeGJsdWdyeXtzcnZ5foFzdXpufH15eHJuTktTdU5DQkZQUEhKS0lLUE5OT01QWmBaV0tUV1BhXlJWUVlSTFBJU1RVWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmdxdW5teXB3bHZ0dHJsbl10fnprbXl8a3RsfGtwdnV4Xl9fYl5cX2RkaWdnZWVeYWJpaWlqa25va3FvbWpwYWNmY293eG9tcHN5f25xcGt7enRyb21MTFtWSEdFR1JQSUxNSktQUVBQUFBXXFlVTVVZVWVYUlJZXVNMTklUVFdXWVdPU05OTlFJUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1pwenteYHpzY3JveHFoZH1pcnxeVExsX3Z1a2l1e3ptfnhrfHBcXl5iW15hZGRmZWVlYlpjY2lra3JzcnZnbGloZGdhYWthZ3NybGdtbXJ9a21oa3t0bW1rbU9IS0tISkhIUVBMTk9MS1JSUk9TUldSVlRQV1pWVlVUVGFfUE5NSlRTVFFWVk5OTE1PUEtIUU5QVUxLTFNUVFNUUFZVUVFOUVFYWVJOUFVUWFhYW1tVUlNXW1dYV1pPU1VXWFhSXllXXldVUFlSV1dXV1heWmdyXltbWVxdX2NaX2NjZGZkY2NiWmNiZ2ZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2dqdWpoZ2lsUElLTExNS0pTUU1RUU9MVlVUUFRVWFVaVVFaXVVVVFdVWVdPT0tNVlRRTlVTTk9NTFFQTEpSUUtRTUtMUFJVU1FSU1NJSExOT1FSUVBRVFZSWFdcV1NSUFJUVVVTWlFOU1JYVlRZV1VaVlRSVlRUVVdYVlxZXWBdW1paXFxfY1tdYmNkZmRkZGFZYGFjYWJoaGltYmFkXl9jXVpkXGJtYV5mZWZtc2RpZ2prZWRjZmhQSktMT09MTVNQTlNRUE1YV1VUVVdXV1lVU1xgVldWWVVYUlBQSk5XU1BOVVBOUU5MU1BNT1VTTlJOTU9RVVFVUVJUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdWVllbVFBUVVhVVVpWWFpVU1JYVlVXW1hZXlxVWF5cXlxbXWBgXVtiYmNnZmVkYlhfYWJeYGdkZmVhXl9dXV5aWl9aX2dgXl1dYmhrYWdmZ2ZkYGJjYk9MTUxRUUxPVE9PU1FPUVtZV1dYWllYWVZdamRWWFlaV1ZTU09KTlZUUE9UUFBQTU1SUlBSWFRRUU9NUFRWT1hSVFVVT05NUVRVVVRUUlRXVlpdXFpWVlFRVlhWW1tXUVRWVlZWWVRYWFZTUllXVlpeWVxeXlVeXF5gXFtfX19eWmJiZGhnZGRiWGFgYl5eZmNjYGJdXFxcXFlaW1hbYVxfXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUU9VXFpaV1tbXFhaW2RxbWhkX1tYVVVXUUxNVlNNTlJPUVJPTFFTUlVaVVNQUE1RWFdSV1NTU1hNT09RVFhWVVVTVVlYW15dW1tWUU5VVlVbW1dSU1dWV1hWVFlbVVRSWlhXXF5aXl9fVGFcYGFdYGJfXGBdY2BjZ2hkZmBZY2BhX19lZF9gYltaXFtcWVpZWFdcWlxbYF5fW15eYWBfY1xZYFtRTk9OVlFQVFFPVFRTUFdcXFxYXlxeVlxeanF3eYBjXFtVVVdQTU9WU05RUU9SVFJMUlRUWVpXVU9ST1NYV1RTVVJSWk9QUlJWW1ZXV1NWWlhcXVtbXVZSTVRVVVtcVlJVVlZYWVNVWlxVU1NdWFpdXlxgYF9WYVtjYl1hZF5cYmFiXmNmaWRmXVtkYGFgYGNlX2JeWVpeW1xbWFhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVUUlFXUlRQW15eXVtgXGBVXF1oanJ9c2xnW1RXV1FOUlpTUlFUUlRVVEtSV1ZbWlpTT1NRVlZWVE9XUlNaUlRUVFhdV1hZU1hdWF5dWVpdVFROVVZXXltYUlVVWVlZVVdaXFZTV15aXV1gXWJiXVlfW2VhX2RkXl5jY2FdZWZpZGZdXWRhYGFhYmRgYl5YWl9aXFtYWFhXV1tZW2BcW1tcW1haW15WXlldUU9PUlpQWlRVVlZTVFReXmBeXmJcYFVdXmJreXRsfWtaVFlUUFBTXFRVVFVUVllXTFJbV11bXVJPVVNYV1dUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSVlFZWFlfW1pUVVZaWVpXWFpcV1VbXl1eYGFfY2NcXl1dZWFhZmReXmRjYFxnZGhlZGFfZGFgYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1BWWVFdVVZZV1dVWF9fYWFgY11fVV1eYmVldYF6aFdYWVNVU1ZcWFdXVlZXXVhPVV1aXl1cVFJYU1dXVVNUWFJTVlRYV1hdXlhdW1ZdX1hfX1hcVlFYVFlaWmFaXFZXWFtaW1lZWltZV15fYF9jYmFkZFxiXGBmYWRmZF5fZGJhW2ZjaGVjZmBmX19hYWFhYF9eVlVdWVtcW1lbWVhdWltbWFhZW1laWl1fXVRZXVVOU1lWU1xUVldZVlZcYGFiY2BjXl9WW2BkYV96dW9oWVpZVVdUV1taWlxZWFlgV1BVXlxgYFxUVFhQVVdWVFZXUlNVV1paW19eWl9cVl9fWl1eWV1VUlhXWVldYlpeV1hbXFtcXFtaXFpaX19gYGRiY2RlYmRaYWVjZmZlXWFiYGNdYmNpZGNnX2deYWFjYWFgXl9YVFtaWltbWFtYWFxbWltYVllYV1xbW2BdVl1dU09WWVZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5cXFpWV1hZXFxdX1tZW2JWVFheXWFjXFJWWVBXV1dXV1ZTVVRYXFxeYGBdYFxXYV5bXltaXldVV1dbW19gXF9YWVxcXV5eXFtdWVtgYV5gZGNkZWVmYlhjZWRoZ2ReY2BgZWNcZWlkZWlfZl1jYmNhYWBfX1tYWVpZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldZWFtcWFdZXmBiYWRhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1laWF1gY2RfUlhZUFdXWFlZV1ZXVlxdXmBhYF9iXllhXV1eWVxeWVhVVltcYF5dX1paXl1eXmFdXFtaXGBiX2JlY2VmZWZiWmRmZmlnYl9jXmFmZFloaGJmaWNlXmJiY2FgYF9dXVpYXFlZWFhaWFdaW1pZV1hVVVtdXV1gYGJieEtYV1tZVlxbW11aV1xdX2BiZGFiYV1gWGJjYmFjYWJdW1xbWFdcXF9dYF9dW2BkXVxYW2JlY2FSXFpPWVhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl1ZWFRYXV1fYF9gXFteXmBiY1xcWFxeYGJiY2VkZmRlZmRcZWZnaWZjYWJbY2dfXGloYmhpZWRgYmFjYV9gX1xdXFlcWVhXWFlYV1xaWldWWE9YWl1hY2Zmcmt/SllXXFpaX1xbXltYXVteX2FjYmFhXWJbYmRiYGJiYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF5eXllYVVtfXl1hYmBeW2BhYmZjX11UXWBhY2RkZmVnZWZmZV5lZmhoZ2RkYFplZ11hZ2hjaGhmY2BiYWNiX19fXF1bWltZWFhYVlpWXFtaVlZWTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhIKCgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoKCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t6enp6enp6e3x8fHx7fHt6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2d3d2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5ent7e3t7enp6enp6enp8fX18fHx9fHt6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb3Bwen59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1ryGiYmJiYiQzNPS0tLT2FolKioqKiKM29LS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb296gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMipTd5uTk5eXrVBMaGhobEI/v5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dXZ3d3d3d3d4eXl5eXl6eG9wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYOEhISEg4R4c3Nzc3NzfYSEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl3dnZ6e3h7eHd2d3p4enl5fXp5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7eXl5eXl5eXx9fX19fX17enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3Z5fXt7fXp8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomNjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3dnp9fHt+eXx6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4SCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd2e318eXx6fHt3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enl6fXt7fHt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh7eHp6eXt5eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaEg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KBgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgYCAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKBgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGBgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3Nzc3JycXBvb29vcHFzc3NycnJyc3R0dHNxcXFyc3R0dHR0dHRzc3Rzc3N0dHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3NycXFxcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Nzc3JxcXBwb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnNzc3JycXFwcHBwb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFxc3FycnFxb3yCb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFxcXCHhnBycXBzmIJucHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcX2hgnByb4uefG5wcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxdZ2hd3F3n5x9b3FxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcXBwcHFwcHFxcXFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJxmKiQb4KjnX5wcXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh3d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgYN5cnNzcnJyc3Jyc3Nzc3JzdHKTqaR5iKCdfHJzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/gH5+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fXx2dnd3dnV4enh4eHh4d3h5eZ+0qaSoqJd9e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt8e3uJr6ahtauso357enp4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX19fZillqGyoJmnk32Af319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgIGBnJyOoK+gn6KfgICBgH5+f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/gICBgYCXmo6YsaGYlpyFfH5+foB+fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6MiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5+gIF+fp+rpZakm5uWoJ+Gf359f4B/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGBgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgoODho2fsqiioJidnaaoraigmZCHgYCAgYCAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMj5GPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4ODho2grbGmm5qgm56cnJ2hpKOdlIeDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBg4uXmZeWmKCanZ2dmZqXkImGhoeGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhISFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYGGjpSTl5qcnJuUj4mHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6Tk5KOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhIODiJCTjpSYkoeDgoWFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKBgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZORkI6QjpGRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgYKCgoGAh5uHi4eCgoKBgIGAf4GAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOj4+OkI6JiYeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgIB/g4iOgIGCg4OBgIGAgYCAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiYaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJloiEgoSCgn9/jJWCgoGChIOCh4iCgoSDg4KDg4ODg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6Zi4OFhISEgoCRmYaCgoKEg4KMkYGBhIWEg4SDgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KTkI2MioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBj4yDgX9+fXx9jJyOgIKBgYKChJSUjIGCgYKDgY6biYODg4ODg4ODg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSk5KPjYyIg4SEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GVl4mAfX19fXuBmIyAg4GBgYCOlIyQgYKBgoKBjp2hpaCRhIKDhIKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgJWfin5+gH2Hi36EhIOEgoODgo2JhYyCgoOCg4OLko+ZpqWXhIqIgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fX19f4KEg4OEho+UlZKYoKCYlIaDhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoaGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyKiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOJkYOEi4WCgYF+fYGHhoOAfn5/f35/gIOEg4SHmJebmJaZmJqThoSFhYWEhYSGhYWFhYaGhoWGhYWGhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYWEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f36AgISFg4ybiY2ZmZaUk42HhoaFhoWFhoeHh4iGh4eGhoaHh4eGhoeHhoaGhYODhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiYiFhoWDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn1+gH9/f39/gIB/f4B/f4aElpmAfZGYmJeVj4iHiIiIhoaHiImJiYmIh4aHh4eJiIaHh4eHhoaFg4OEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWFhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDg4GAgIGMiYGAgYGCgYGBgYB/gH9/fnt6gIufoZONmpuXlZKNiYiKi4qIiIiJiYuLioqIh4eIiIiHh4iIh4eGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJKQj5GOioaFhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKDg4KCgH9+fX19fX5+fHt7laOcm6Ghn5CCiouJiImLiomJiImIioqJi4mGhoaGh4WGiIiIiIaGh4SDgoSHiIiIh4WCgoGDg4KDg4SCgYKDgoGEg4SDgY6TkpCPj4uJhYWGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoODgX59fX5+fn5+fn1+fX2Bk5WWoKGblIeJiIeHh4iHh4mHh4aIh4aJiYODhIOFhISFhYaIiIaFg4KCg4WHhoeGhoSCgoOEgoODhIKBgoGBgYODhIOEkZKQjo+Oi4eEhoaEgoGBgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCg4F9fH1/gH9+fn59fH1+fHp/j5SZm5qalY6DhIaFhYODhYSEhISEhIWEgoKCgYSEgYKDg4WGhYSCgoGCgoODhYSEhIWEhIaDg4OFg4KDgYKDg4SFhIeSkY+Nj4yJhYSFhIWCgYGBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgICAgX9/gYSEg4ODgoKAfX1/gICBf31+fn18fX17enqDj5GOlZeYj4GBgoKBf36BgYGCgYOBgoGCgoKBg4SAf4CAgYKCgICAgYCBgoGDgYGChIODhISCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGAgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fX+ChISCg4ODgn59fn+AgIGAfn19fX1+fXx6e3uGjI2RlJaFf39/gIB+fYB/foCAgX+AgIF/f4CBgX59fX+AgX9/fn+AgH+AgICAf4CCgICCgYCCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYGDhIGCgoOCg4SFgIB/fH19fn19foCAfn1/fn1+gIODg4KCgYF/fX1+f4CAgH99fX19fHt7e3p6enuJjY2SiX5/f35+f35/gH9+f3+Af4CAf359fn9/fn18fn+Af35+f3+Af39/f4B/f39+f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEg4KBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9+fX5/f4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enp6eX+OjpSKgn9/fn9/f4CAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/foB/fn5/f4CAfn5/f39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6enp6eYOPi5SUgoKAgIGAf4F/gICAgYGCgoB+gH5/fn5+foGAgYB/f39/gICAf39/gYB+f3+Afn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSEgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYKBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19fHp6eXl5eoeIj5aHg4GCg4GAgoCCgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYGAgYCCgX+BgIF/gIB/gICAfn9/fnx8iZSQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICAgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX18fX18e3l5eXl5fIKEjYeCgoSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgYKCgIGBgIF/gIGAf36Ok4yHiIeIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYGBgYB/gH9/gICBgH+AgYB/fn19fX5+f36Ag4SHh4SGhoaFhoaHh4aHh4iHh4eGf32AgICCgX59fX19fX19fX19fX18fH5+fnx7eXh4eXl6foGDf4KKhIOEhISXl4ODhIF9foGBgoGBgYKBg4aIjIWDgoKBhIKDg4KDhYSEhYODg4OCg4OCgoKCg4OCgpGQi4iIh4mHhoaEhoWEhISDgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgICAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eHh4eIhoeHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eXp7fX98hZGDg4OEhJSTgIGBf39/fn6Ei4B/gICEhpCJhYSCgoGFhYuCgYKFhYaGhISFhYOEhIODhIOEhISIko+MiYiIiYeHh4WGhYSEhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx5enp6e3t/goCBgYOCgH59f397iJF8fI6Wf31/f4KGioWDg4SDgoONiX9+f4OEhYWDhIaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenl6e3x5eHx9foB/gH99e3x/fn2ClZF/hIh9fH5/goR8fIGChIN/f4eDfYKBgIKCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX19fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn5+f35+fn19fICBgH2Gj4F+fYJ+f36Agnx8gH+CgIGAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uUkIyLjo6NiIiHhYWFhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhYaHhYSAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx9fHl6e3t4eHl7e3p8goCBf4CBfX9/gH99gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJKNjY6Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gIGAgIB/foB+f39/fn+Bfnx7fHx8fHx8fHx8fH19fHt9fHx8e3x8fHp6eXt8en2Fg4OAgYF+gH9/gH6FgoF+gH9+foCFhoKAfn6Dhn99fH5/gIGAf39+fX19fX57fH1/f3+AfX9+f4yRjo2Njo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KEhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f318fHx9fn18fHx9fX19fH58fXx7fXx8ent6fH19f4aFg4CAgH1+fX5/fouEgYd+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fXx+f4B9foB+f36Eko2NjI+NjIqGhIWEhISDg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4F6fn58fn6AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fXt8fHx7e3p9foCAg4OCf35/fHx8fXx8gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOBf4B+f4KCgn9/goJ/gIuQjY2MjYuKiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/f4B/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfX59fX17e319fHp8fH2BgoGAgIB9fX18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIKAgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e317f4GAf35/foB/f35/f35/gH9/f39/f39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn5/fn5/fnx8fXx8fXx9fnt8e3x8fHx9fH18fXx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiYqJhYiSj42JioeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9+f39/gIB/fn5+fX+Af39/f4CAf4CDgoB/gIGAgIB/f4CAgH58eXx+fX59fX5+jIZ9fX57e4ODfX19fH18fX19fX19fH17fXx9fX59fn19fX18e3t7fHt8fHt6e3t6enp7fn6ChoiHiIuKi4uJjJGQjoqJhoWEgoKCgoODg4OBgYGBgYGBgYGBgYKCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSDgYCAgYGAgX+AgYKBf39+f35+gH57foGSjHx9f4qAjYx+fn19fX59fX59fXx8fX19fXx9fX1+fX1+fnx7e3t8fH18e3p7e3l6eXl5e35/g4OEh4mKiImOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGBf4GBgX9/gH+AgX+AgIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36DkYSEg4F/fn18jYd9fX59fX1+fnx9fXx9fX5+fX5/fH18e3x9fnx8e3x9enp5eXl5ent+foCBg4eEiI+Oi4uHhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoaFhIKBgYKBgoGAgIKEgX9+gYB9foF+fX5/gIB9foCEgH5+f31+fX2KhX1+f31+foB+fX18fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp6e3x9fn1/goCJjouMiIWFhYSDgoKCgoKCgYGBgoKBgoKCgoKCgoGAgYKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgIGDgX+AgYSBfn6Af31+gH59fn6AgH+Bfn+Af39/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e31+fXx8e3x8e3t7fHt8fH19fIqKiYmGhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKAf4CAg4F+foB/fX+AfX1+foCAf4J/gYCAgICBgH1/f3+AgICAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x+ioeHhYaIhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEg4WEgYGAgH6Agn9+f36Bf35+f4B9foB9fX1+gH9/gYCBgICAgIGBfn6Af4GAf4CAgH9+fX19fn1+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCIg4SEhYSEhIWDgYKBgYKBgICCgoOBgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgYODg4OFhIWDg4OEg4OEhYOBf3+Af4CBfn19fn9+fn5+gH19f3x9fX6Bf4CAgIKAgIGAg4KAf4B+gIF/gIGAgH9+fn1+fn5/fX6FhYGBgX+Ag4F/foGAf35/f4B/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgoB+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gICDgoGAf36AgH+AgYCBgH9/f39/f4B/gIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x6fHp8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF/f4B/gHx9fX6AfX5/f39+fX98fn5+gH+BgH9+f4B/gYOCg4B/f4GBgIKBgYGAgIGAgIB/gIGAgIKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fYB9f4B8f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIGDgoGDgX+AgX5+gH6AfX19foB+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgYOEgoGAgYB/gYCAgYGAgYGBg4OBgX+Ag4B+goOEgICCgYKChIJ+e3t8fHx9fn1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYWChISFhIODgoOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f319fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4aFgX9/fn6Af4CBgICAgIKCgYCAfoCCf3+BgoOBgYOCg4OFg399fX18e3x8eXp7en55e3l4f357fHt+fX1/f4F/gH6BgICBgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SFhISGg4KEhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gIB/f39/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4CAgH9/gYKBgH99f4F+f4CCgoCBg4KEhIaEgH5+fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH59fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX6AgIB/f39/fH9/f4GAgYCAf3yAf35+foB+fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn1/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7f4V9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB8gH6AgH+BgYB/fYB+fn5/f359fX6AgYGAfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgoCAgIB9fn5/gH18fnx/gIGAgICAgHx/f4B/f4GAf399gX9+f39+fX18f4CAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3t8eXd7eXd4d3d4e3t6e3yFiX17end6fH19fHx9fX1/fnx9fn59fX18fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgYGBgoCCgICAgH5/fn9/fXx+foCBgoGAgIGBfX6Af35/gX+Af3+BgH9/f319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l8fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f39+fX9+gICBgYJ/goF9foF/f4CBf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYR+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBko16fH18e315e3p6eHqBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCBgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKBgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7j393d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgYCCgYKCgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoGAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHenh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fHx8fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgYCBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCf4CAgIB/gH+AgIB/fn2Af35/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgoKDgICCgYSDg4SBgYOBgoKCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GAgYKAf4CBgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx7fXx7fX54d3Z5eXp7fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KChISAgIOBhoODhIGChICEg4KCgICCgoSBgYKBhIJ/gIB/gYOCgYCBgYCAf4GBgYGBg4B/gIOCf35/goGAgH9+gYCBf4CAgYCBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH9/hH19fXx/fXp9f3t6dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B8f35+fn15eXt6enp5c3J0b3dxd3lzd3uFgoKCgoOEgoOEg4CAg4OGg4ODgoKEgYSDgYOAgIKBg4GCgoGCgX6AgICCgYKBgYKCgICAgICCgoGEgH6Bg4J/f4CDgoCBf4CCg4KAgYKBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/fHt3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhxeXR2eHR2e4SCg4KDg4SChIODgYKChIaEgoOCg4SBhIOBg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgn9/gYSEgYN/goKBg4KCgoGEg4OEgIKDgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgYOBgYGAgH58fIB9fHh8eXp5ent9f3x7fHx9fX18fICAgICAgYGBgYKBf4CAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISBgoOFhYWDg4KDhIKEhYKCgYKDg4GCgYKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOCgICChIODgoGCgoGDgoKDg4ODg4SAgoOCg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoCBgHt9gH58eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGBgICAgIKBgIB/fX18fH18dnJ3eHh2dH92dX2Hh4OChIWDg4SFhIGChIaEhIOCg4SEgYOFg4KCgoODgYOBgoCCgH2AgIGCg4KCgoKEgoCCgoODgoKBgICBg4KAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCf4OBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fn5/fn18fHh2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWEgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4KCgYGDgn+Cg4SDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH9+fX6BgYB+fn1+fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiGhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGCg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYODgoODg4GEg4GDg4SEg4SEhYSEhIWFhYWEg4ODf36BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH99fH6Cf39+fn5+fX1/f39/gICAf4CEhISDhIWDhIOFf36CiouFhYSDgoSFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhIODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoSFi4mEhISEhYWDh4aGhISEhIWEhISEg4SEgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF5g39/f36EhIKDgoOCg4SDhISFg4SFhoSFhn2Den1+f4N7hYOBhIOAf31+f35+gYOBfXt/fX6Afn18fHx9fX19fH19foB/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYOKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYSCaHpyc3N8gHKChH6Dg32BfX5/fn+Cg4J8f4F9f4B9fXx8fHx9fXx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSCgoSGhoOFhIaIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SEhn1we4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd216c26Ah3ptfXJzdnN2bW53bHB5bHV9f358foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgYCBgICAgYCAgIKDgoKDhYeFhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb2x3fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fYB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhYWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhIWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f396fn19fn1/f359gIGDg4CCg4GChIKBf4GCgH1/f4F+f35+f4GAfn6BgoCAgoSHhoODh4SEhIWHhoWFhYWHhoiFhYaFh4eGhoSGhomIhYSJioiFhIWFhoWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGEgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomJh4WFhoWGhoWGhoSGhoaGhoWGh4eHhoaDhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhIOFhIWEhYSGg4WGhYWEhIWHhoSEhYaFhX13hYOEhIOCgX5/fnt8e357fH1+f399fH9+gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYeFhYWDhIWGhYSGhoeGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoWHhYaGiIaFiIeHhYeGhoiFhYaHhYaGhYOChYWGhYWDhYOEhIaEhoaEhYWDhoaFhoWEhoeGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1+fnx8fn2Afn1/gH5+gH99fXyAfX5/fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIaFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFhoaFgoOFhoaEhIOEhIOEhoSGhoSFhYOGhoWGhYSGh4WEhIWFg4SHhoSCg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYF/fHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhYSGhoeGiIaEhISHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWGiIWGh4WHhoeGh4WIh4eHhYaGh4WGhoWChISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDhIeDhIGChIWDgYCAgXt7fn18fHx+fXx8fH1+fH18fn18fH18fHx8fXx+fXt8gH99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhIaGhYeHh4WHhoiIh4eGh4aHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDhIKCgn+Ae31/fXx8fH59fHx9fH17fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGh4aGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHhoiGhoiEg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f39+fHx9f318fX18fnt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoaFhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWDhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBgoKBg4WCg36BgoF/hIJ/fn5/fn98fH1/fXt9fXx+enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x8iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaEhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWIg4SFhIaGhoiFhYSDhYWGhoeGh4WGhoaFhoaEg4SFgoGCgYCEg4OCfYGBgH+DgX5/f4B8f3x9fX59e359fH15enp5e319enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYaEhoSFhYWFhYODgYOBgIGBhYJ/gH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4aGiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGiIWFhIKFhYaFhoaHhIWGhoWFhoKDg4WAgIGAgISAg4B8gYB+foOAfX9/gX2AfH1+fX57fn18fHl6enl6fX15ent7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoWFhYSFhYSDgoGAgoGAgICDgX5+foB5en2Ag4SFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhYWDhoSFh4ODhoSEhYSHhoaGhYaEgoWFhoaGhoaEhYaGhIWFgoKDhH9+gICAgYCDgHyBf31+gn5+gH6Af399fX59f3t/fXt6eXp6eXp8fXl6e3t7enx7e3t7fH19fXx/fn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhYaGh4eHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYaFhYODhYSFhoWGhISEhIWDhYSAgIKDf35/f39/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5eXp5ent8eXp6ent7fHp7e3t8fX19fYB9fXx8fYB/fXyGg4aGhYaGg4SChYKFgYGAf3+AgH5/gYF8fn9/fn+AgoKChISDgoGChIGAg4KBgISFhIKBf4CCg4KEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4SEhYaEhoaGhoaFg4SEg4SFhYWDhIODhIKEhIB/goJ/fX5+fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl6enl6ent5enp6e3t8ent8e3x+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gnx9f35+f3+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYKGhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWEg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgX6Cf35/gnx/fn19fHx8e3t6enp6eXt5e3p5enp6e3x5e317e35/f4GAfX99fX1/gICAhoSEhYSFgoSCgoSCgYCBgH59fn9+fn6AfX2Afn5+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWDhYOCg4WFgoSBg4CBgIGAgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx8fn18foN9e358fYB/gIN9fYCAf35/fXx8fX17e3p5enl5e3l6enl6ent7e3p7fX18f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzMzMvLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs+QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaWBkU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT48Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPTM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbLy8vLy8rKysvLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTT0tPT09PT1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDs5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5HqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWy8vQ0dDQ0NDQ0dHR0dHR0c3Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX2NfX19rb2tra2tra2tvc29vc2dfX19fX19fX1tbW1tbW09LS09PT09PT1NXU1NbV1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0A8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1NRqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1svMlYWGhoaGhoeHh4eHh4Ky4t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSNi4uLi4uLi4uLioqKiKG/vb29vb29vby8vLy7v9LS0tPT09PS0tPU09PT2+Lh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXJsaU5TYkxMVk08Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLUEae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fLzG5QU1NTU1NUVFRUVFRMoPPr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWFJTU1NTU1NTU1NTU056rqqqqqqqqqqpqampqLDS0tLT09PT0tLS0tLS0t/r6uvr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h3bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9QkA5PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXy8xxVVhXV1dYWFhYWFhYUaHx6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmnlxWV1dXV1dXV1dXV1dTfbCrq6urq6urq6qqqqmy0tLS0tLS0tLS0tLS0tHf6urq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8Oz46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX18zNeF5hYGBgYGFhYWFhYVqk7ufn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqqJmYWJiYmJiYmJiYmJiXoWzr6+vr6+vr6+vr6+uttLS0tLS0tLS0tLS0tLR3+np6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTo6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjMzMfFxcXFxcXFxcXFxcXFytDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs/Ozs7NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMvLy8vO0tLS0tLS0tLS0tLT09LV09TW1tbW1tbW1tbW1dfY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojs4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzc3Pz8/Pz8/Pz8/Pz9PPz87MzczP09LSzs3P0s7Ozs7Ozs7O0tPPztHU1NPOztPTz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfX19fX19fX1tbW1tbW1dXW1tbW1tbW1tbW19bW1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9WSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O0qucz9Ktg4OVz9GlotDOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTw9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0racpaTKm7y4mbWzoKKq0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz86dnJGes6aNgY3GnpiWnMfPzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj48PDk2P0I/Qjo2NDg6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz9G/mKCbtZijiqvWupiinq+x0s/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0I6NzQ6Ojo5Ozs4Oz0/PT49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/TtJmWqruKraubpbGZlrCzqdTQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD08OTY0Ojk4Ojo5Nzs/QDw8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyqCjv8qcpYynrdiqmarUz8/P1KuafqORjaWclqeQmYSdk6PV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjk8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NSsm6eLlqKotKqef6CphZml1dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENHREFBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DTtrKypZmrz9jBnIC8raaYr9bR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GSbF1cb2doYl1PRj9ISEZFQDw8Pj48PT08NzU2Ojk2Ojs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cSimZadp5Ghnp6ZqJaYmrrV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09Ojo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LiroMfVoquknLikq6Oew6CrpJvQ0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0tAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT08iSjbTZqY+QrNfCj4271NHS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVpaltMX01KTEpVTEZCPDw/RkVHS0k9NjY3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj47PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHUyMHV0tXAv9bS1cXE1dHS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz8+PkFETExBPjc3NTo4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0dPU0tLS1NXT09PU1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPT03ODY5Nzc4OTk7Oz0/QDw8ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEQ0k7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRklEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDg4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT48SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDREVDQUxINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFFBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb2tra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg6ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvN3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5NzY4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODY1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vb6/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs7Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTk3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTU4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEY+ODs3Mjc5Njc0NTM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEJEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7W1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3t7e3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLe3t7i5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurq6+wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojo7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqamop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e4t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WlpaWlpqioqKiopaeoqKeoqKeoqKmqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3tre3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojk6OTw+OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87O0BDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WkpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSlp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QT88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSko6Kio6Khn5+fnp6cnJycnZ2dnJ2en6CioaKjo6OhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXmJeWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0A/QkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2epKShn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzU3ODs9ODo6OTk7PTs7ODk+Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6emoJ2cm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpqWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTkpSUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqampqenpp+bmpuioJqWl5Wam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampqSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4OTo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8+QUE+QUE/Ojk9PjpQnaCfnJucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36amn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaOipaampaanpqagm5mboaCXkpOSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk4OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpKampaWmp6amop2cn6Gfl5GRkJSXm52YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgoJ+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs9Ojo7Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpKanpqWlpaalpaOgoKGhoJmSkI+Wm5menJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKCfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTk4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqOio6SkpqalpKSjoqGhnpyblZKUmJyam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Njg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn5+goKGio6OkpKSkoqGhnpuamZehtZ6ZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamZeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foKGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKCgoqShoqKioaCenJubm5mfq5ucmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoKWzrKCgn5+enJmZmpqbrmp2nZ2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qbm5qbmpiZmJiYmJiYlZSTkZCRkJCQkpKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6ChoJ+mkpurn6CgnpuampqZqIREgJ+fnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uamJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozk6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2eoJ5inKaenpyampucoaNRSISgnZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udm5qmZl2joJuamZudnK51SUyGoZydnZybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFE8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmYpIBSeKKZmZqdm6CkX1ZOh6GcnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaChn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkXFxRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycm5iYmaCIW1+UmpmbnJyjj2RaTYGinp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtbTEY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJmfl11ddpeanJ2dooFkWU1/op6fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enp6dm5uanJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmZpgYWCAlp2cnph0Y1VPgaKfn5+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5Ojs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZmfaV5bZX+cnJ6Mal9QU4aem56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM5Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7QkBBQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqXk3NoYVR2k5ech1xWUFeKko6SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mlo6KZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGRjpKanpJ9oKOWpJxuTE9jhoaCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDgISgnY5/a5allZ9/iX9fcn+AgpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY5Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn+Aoot8blJ1nIyMWXF9fH59fIaOjYuGjZSRi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTs/Ojg8OTk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqFgIJ9mJp3WE9McZSGgktfcHF3iIWKjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gH56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRi3+IjYyLi4eRjaONVC8wPXiHd3dARF1rbYSQiYmQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZCeoZ2Tl5uhmp2boqacZ0JbSDt4eWtnRTE4WmxzkI+LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqamvj0pyonlBfHhkYlFTXUlgboqhoaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKmqaeoo3hgwdalQ3yNgnVPbY52U2R/o6inoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQERCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSnp5mdpKWjop1if73Arnigo5qVZUxheG1RdJWioqChn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZWRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKhoqehpq6mpp2eaoScuo+o0aKas6hYTKyTU2WPoJ6goJ6doKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaiqrbGyr6uiooZ3fn1yz8iwmqeva1WqsGNbh6WfpaKhnqCimJWem5+fpKGclZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVVxoZG9jbWlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Gem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqp6+3t7S1trOtrq2PhoNukcy7lJOklnRUb3pzcH2WpqqnpKCfo5udoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQ0M7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrsre7u7u5ucG4tLWgiHlkWJ+2vaanmoh3a3FveHl7foaOkpido6Wmq6WkmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh2a3FoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tbfBxszPzszJvrOkkHNmUkSLlYaGhn14cW5nZmxpbHJycXJydX2NqcTEu6Knqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWlhZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8XH2+Pj2su8r6SXiHRZWlFEaXhrbnRua2VlWVddWFxjamppZmFpirXBwLmpr7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdvbVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGvs3S1cq5p52UhnJeUVRLRFtlXmNqZWFgaFlUWFNWWVpdWVt1mre8rLSyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4R/amZoYWtsZ252cnJ2cmdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/CwcfLyLeUdWVVUE9USD5ebF5fZWJgXWRhU1VXVlVVWHOcrbGqqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dWtsbmRvbWlxeG95amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7m4w5thSURHS0Q9W2ViYmljYFtjX1dST1BQVoC0uqyupaSjqKSgoKWZqbSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+dlJOJiX6GiIyWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3dua2lodlpnc3hzemdnXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMTEwsTBrYNPRk1FO01bX2VrZV9bYFlZU05VgKOrubWyrKmjoa2prKetn6y0tL/Dvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXZ2ZWZqamhea3BueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx8LGlmpYRz8/R15jYmpgWlhXVFZ3mrfAu7y6vKytpqm7urm3v7O1uLLBxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq6yxnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhaHZoamp1bnlsXmRbVmBZTEhENjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc7Fxsa9qXJQSzBYU1VmYVNOUHGpyMjCxMfAvL60sLCwwr6+wcbAvre2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2vtaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46LlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cn14cGdga2p3bWlmdm90Y11jVVdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXCw8LBvJE/T3Z+iVZMb6XL1MW2v7/Av7q7vbWzs8C/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enmAc3BmZWdkbGVia25vb19ZXVdWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK9vMWnd2uDkJdvqsnIx9HBr729uLm7u763tLC5vrO8vrG5tbi8tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWViYWNkZGpjZ2RbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8C6v8C8u8W9usDEv72+r3NlfZGKitHFv7/Jv7DBv7q3u765tbi0uLy0vbi1tLCzvLG3t7i/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFjY2hrZ2dqZmpeVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTk2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1Y24v7vDtbrHtrW4ury4ubaqpJiOfoTJv7+7wb65xr3Cv7zFuLa3tLi2tru7uLa0t7q1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWdwamVsaFlZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+8z8R3qMy9x7e5t622tLe5s7WxvcnElUp7yr6/vr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d9a25xZ3FrdGZjbmBcVUhLS0RKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNaudIC7yM/CwLiutLS7vbe5sb3Dyo5Ddc3Dwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcmZsam91b3hkaGNcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCxsnSmXFyq9HRzMrEtbq/xMi+vrS/wMB5Um7LxsK+wby/w8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRwbW10bG1vYGNfYmJOSU0/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDDur68xL63vMC/yc/HyMrKwoZyc6PMzMvNysbCw8vOwby4vbqycGNiu8jEwMC/xMDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh7bW14fGBxZFxfYF9UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7ur2sO+tr7Avr66ppypsrbDv6V5dXiZxMfLyMHDwMDJysG/u7mxoX1za63IxcS/wMG/y8fDwMjAusG/w7O6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem5zeHRocF5cX11aUkZFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8S5bazOvba5wLysfW5obm1ygZWYc3d8l72/xsC5wLy+xcS9vbixsJiQfYCbysLDvL2/v8PDv7/HvLzCtayutLS8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdtdXtxb2pcYGFaVFFBRklHS0BFQ0k8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fm52bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDOtHaAs722tcKlh2laXmBNUltabnN3gJ+4uMK6s7u3u72/uru7rqSbmIeRfsDEw768v7u7uLbBwrXBuoCgsKyvvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytry0saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnZ4bnJhX2ddW1VKPT8/R0c9R0NDOTo1Ozk5Pjw8OTo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaiEeImgr7WdamVnVllgSUlNUFNsd4alsLe+ubK1sru5vLa5vrSVnKWWoXCuycTAvb+5s66yvLquwX5woqumrLq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JtYGRiXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8WriHx2i6CZYFRDWFVHYWpWT0VKYI2grK+2urW0sqy8ubi1uMG9i5iwoqVypcvCv7m6ta6lrLOwqaRUgJahnqWttrTBtrWzpaeqqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxwdnNvZF5oWV1eU09OQj9KQ0FLSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmpGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/tZGCeIePb05KP2RZQk53gJRqTkFdgbC1s7WytK+su7q4trm/xnaDqp6aZKe/uLWysa2tn6Smp6WISYOPmZiZn6mtuKuqqp6kqaSrrq+nsKuvsbGtsa6ur7mwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZ0bXZqbF1ca1VeXFBOSERHTUJHTkc4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7eVjIiEe1hGQU6HWUpKWHeNgWNBU6O5s7SysLGtsLm4tru3ur2QorKro3KrsKmrraujqKCdnp2kb0p7homIhY+bqK2joqOeq6+ho6mooaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J5aXV0b2VVYmRYXVJPTUlASVJETkM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K8qpmZlWlOQFJ4cVBJSUtmm4FZRVKuu7Gss6+urK22trK0ta+ppp+am52epqieoKipn6GnlpuVp3pibmx7g36AiJuon56fobqkpZ2jo6CepaCkrKWmqKWio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJaVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqppKmrpqmsq6ahiHiDfHZ/emN4bW5dUWlVUE9HUE1NQ1BSQT87PjQ6OjU7Oj07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaqlpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcKrpb5pRVKdglFXSUpfSVOOYGNigK61qrK0rqqrr7Cys62lnZGXk4+YoJ+ioJyjpJ+dqJSalaC1noN+jZGLg3p7jJmdnKeqkqqcn6ChnKGfo6innKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclpOPj5KRmZCWlZiXn5icmZukmZeUlZqdoJ2nqKWgo6Kho5+doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn58gHV2fW5sfGRpVlNkTkpIR09TTktOSDxFQD0yQDg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62trq5ure3u66ooKGpoKrGv8uhUEFznnhPbktLYmV0c2BaXnCQsa+us7Wqpqyso5uZlI2RlZeYmJyfoqKcnaSemqSWlpXD2sO6tqGRjIyEc2t6mZ+xgZuroZ+gp5+dn6OmqJ6jpp+qnaqtqq6nqLClo6Smp6ymoqWim5mer6iusqumq6qgm5iYmJWTlpqTlZaalpuXmJihnpyclpuhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl8gH53eXxleXlhYlNWYUlJS0xTVUpTUU05P0E2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZykx8ePV1NJZKRcZX5vcl1Qa2NbZF9da4+0sLC4rKahnJ2alJiamZCOkZWRjI6Nk5minJeimJaq4d3V1dG5oYqKi3VmYI68oXKqrqumorGjmqOmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Ggo7GusrG0qrKuo5mcnZ6hmJubmpiZm5WWm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaYJtZVxTW1pNUktPT1ZNVE1CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6KanqukjXpVaXJ2dXBjdnZYV2NgY2dZWFdmra6sr6efnqKglpCTm6CcmZeSk5+coaOanpuWnpmdvbWyvsPEwbGUgHhsaWGNtHGGt7i2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztbizuK2ytKSgnaWgrKGhoqGgmpmWlp+bm5iloaCeo6Ggn5ucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh2and1Xm1bUmFJUlZIRlZXS0NNSD1LSThGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamorqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6KhoKSAboJwYGNYTFtTWk1MUFhSSE1NSJisqqmloJ+akpGUmJiWlpaMiIuOlJ2cnZ2elp2XrJdPWoOjt7y2on9uZWhpcoFfqrq9v7qttbSwt7CutKmmpKWsqbmztbvDvMPBt7u2q66xube8r7OwtcG8t76zs7WirKKpqbKpq6inqJqZnpqqp6CZp6Cfn6iopaWfnaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWFfnZybWl3bWhuXFhcQ1dOSkdNSENGTj0+TD40PDo2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqZSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco5+dimJXXmVgV01RRz4+P0NDPz5CUXipramqpqCen6KjnZ+em52blJOVlJ6emJSFnZmfmaxmQVJaeqOyt6iCaGFocXBggce+v8K/trq7wMO5vbusrqexrbHCtrjCxsDIysDKv7C5ub24wr64tLvGxL3DvLi0qrOtqrO0r7Ouqq+jnqyot7Kto7CmoaOwsa6wpKWvo6GgmqGmoaSqqpmdoJmaoqCmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXx0cmtsdXJxaFdcUUZVSERKUEk/RUI0Rkg5Njw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PDw7Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+flX1gXmVgUUdEPEM+RTw/OTZOfqqzp6SjoqCepaymn5idlZKanpmVjIqGiIZ4bIafoqSbbG97amGDpq6mf2ZoeYiMfrPHxMLHwcDFyM3QyMvDsre1vrK+xbu+zM3GzMzM0se+v8DDvsfHwrjEysnEwce/urS6u7W7t7C2squ7sq+8t8C7uqu4rauquLu1vK6uuKOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlZSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtkaW94a2VaXEZMTUVEVE1FQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QD9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn5zamFXTkU+SVl8b2JCPVyOrqygmZucnp6Zl5eYk42Pl5eUj42QjIKDgnZycGxvjaStjXR8opVlZpSemXlofJCdoqnBzcvGyMTFzNDS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysHGx8bKyM/AydHNx8bIxsK9xMG/v7+1vrOtv8DDw8fFyMSvv7myuL3EwsG7vLy1rqenrqigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dXNlYmdyb2deWlpET01DRlFJRENBNTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+OTtBQTs7Pjc4Njo7PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56bnZZrZl1USURAP0uGnqWahKCyraOenJ+amJeUk5SXkZCQjYiEhImHg4CBgYB5cXFuanaisYhyj7jFm2J7ioV0cYiUoaWluNHMzM3PxM3U1djR183Gx8nMw8XKz8rS19LX0tXW09TIzMfMzcrTzc7TzcbJysrCx8zHycnGv8Ozs8jFy8vLz8fKv76/vcHHxczMycnAw8CusLOonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5aQjIaRi4B7cnV2Z2NndmplVlhSRE5HQElRQz5CPToyMkE8RTw3ODxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT45Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGcY1NMSkRDP0NSrtG9sq+mnJycoKShnZqUlJWUin15cWxlYmhycHJ7hYqAdXBtcHJthZ+FaYS115dqbHZyeHeDkJubm7bU09LP0sPQ09bY1dXSy8nO0MvGzdLK0tXX2dbY09bYzdLKz9HMz9HN09DAycjLxMzNzM/PxsfItsDLwNLNzNDHysnAxMPIz83Q0c/NysjNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNhZXJjXVJcSktHQUZJSj87QTg+NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGlpaCioltJQEFEQUZRdrKvppqUl5+cmqCgnpudmpWJd2lkYV9fX19eX19dYWx1c3BvbmtwbnOCiWZsp7VofGNfZXRweIiKiYqn1dPT0dHM0M3T19bT1dDP0tPRydPRyNDX19jS2NLX2dXWzM/Pyc3SzM7RwMfEycfPztHR0sjMzcDLzcbUz83PycXLx8fJzMvU1NHVz9LM08K5xbGlqLWuqJuoq6Wdsqiws6ysk4+TjoiKjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZRYEpKQ0VDU04/PD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48P0A9RkFEPYKknKClnqWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fX1NXZ2dHO0L+8zMm2vq6nqqiho6xnQzg9PkRYgqqon5eVl5manJ+dmJudk31xZWNiX19hX19hYF5gYF9gZW1wcG1qbW9zdYBoXoOYioNZTFpnYnF4cmpol9TM1dTRys/M09bS0dXNz9XV0cXR08rQ1NXWztPR2NjY18vIzsTKz83KzMDJwcnKzs/QzNDOzszP0MjM0NHLzsvDysjKzcvM0tPO1NLR0NDKvci5sK67ubWrtrCtqLits7+7sZqOoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcG9rYWRucGFYXFtJRkZETVlFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pzk4Oj88PTg7PkI6Oj08OkE9PTw6Nj09P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cgo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSyfEhGQjtWjaGblZOWm56enpyTlpeUiGteXl5hZGJgYGBgYGBgXmBfXlxibXJubXBwcnJ2c2dpcHFkWFBRV1hhYlxXS6fQydLSzsbOzM3Uy87SzMrW1tDM0NPLzNDR08rO0dXS1dbKv8rCxs3DyMrDzcTGycvLz8vOzdHO1MzHydDNycfLxsfCxsrMztHRx9DPzs7M0MXHwbi5vcPCvcO5srK+sLvDw7WqmKWhmJaRlZWSi5SNmpGUlI+PlYKJhnlxcmttaGBgcWhZWGhWTUdMSVFRQjtEPzs2ODo4Ojs1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzY/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4ytXW2drb2MzMz8jW1cTCta+0qKCtl3hsb3B3j5qNjJeVkJORkZWWlZCLfGViYmJgXV5hY2JgX19gYWFgX11bXWdxcW9wcW1pbXVuZXFzcnhwVk9OVHl3VW7BwMPOzsfFx83K0cfKzc3F0NLPzczUysfKzs/Hx8/Sy9DPxbrEv8bKvcPHyc7Fw8jAx87IxM3LzdDJxcXQycbCxsnFv8HIzczMz8PKzMnHzNDFxci7x8PJycLPwb28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Vka2BeZnFhW1dgR0lIR0lNVUc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62ktn5ngoaiqpONjZaPhYODg4F9hIR+c19bXl1eYF5gY2RjX11cXl9gYF9bWlxha3JwbW1oZ2lqc19lfIaFaFdaTlaglmWbura7x8XBw8DDyMnIyMnHv8TLxcfKzMnEwcrJwcHLz8TLyL+5wbzGyL7Axs/LxMDDu8rHyLvJxsXKwb7Cy8bFxL7Gvr3BxMbMxsW8v8rDxcfSxcHJwMrKx8jG0MPDxsOuxMvHw8q3v7y6s6mspKWYn5iso6Gmm6Ogm5V8d3N1ZmpbYW5tWlxYUkRMR0NHRExERlM/NTQzMzVAPTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ovri8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76ysLZtXnp8npGKkpaGeoCEhX91eHVycF9aW11gYGJjZGRlZGBbXF5dXl1fW1laXGFucW1pZmdraG5yW21wb1lLXV55oYltoLGurcC5ubu5uMDBwcO9vbi8vrjDycTGwr3GwLe7w8i/wcm7tru7xcO/vMLOw8a+vrXBvsS7vce8w7q1vcbEwsO3wLa2v7+8zcS9trrIu7++zMTCxsPGycfJxtDGwszIssfJw87MwMXDv7yyt7Cyp6ioubClrbCqrayUend4a2VoYGhvZFZeWUpGSkZIS0FFQkZKQTk6NjU4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWrt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTV183Kz8XJxcfBusW9rK6nYGN2gZKLiIuEeH+Ghn99g3t0dGNcXF1eYGBiY2JiZGViXVxbXF5cXl1aW1xdZ3Jva2RjaWlrdndmYGhgRmZid4FvXpeqqKK0sbSzsrKzu7S7sLavs66xusG7wMS8v7q0srq+wLjHuLS8tsDCvbi9x8HDu7Wvs7W7v7TFuLu1rLm9vsC9sbu2sLe6s8a9t6+8v7W3tcW9vsPGwMTGxsfMxb/GxrvHy7/PycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkdCREFFRj89OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMXLzcjFyM3M0MvNyMnIysnKxNDN0s/NxcfBxcG/urjJt6uwmltnb4iOhoiJenh+hYZ2d4F8c2hdXV1dX2BfYGRhXmNlY19eXFteXF1eWltbXF9rb2xmY2ZoaGp4cFNlbmRdV2JdTFqZpqKYpqivq6mrqLKstK+xp62mq7K7ubXCubq5sKq0ubuzwbmvwLG9vLu1u8e5w7etqqiwssC2uL2wsaiys7W7vKuutqeutq68srCquLCuu667uLvAwb66w7/Gw8XAvMbBx8q4xcfFv8fDw7nExsK7xsnMy7O5wr27s4l0dndraWBibGlZV1dbQUxMTUpFQUM/RkE6Ojo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxM/HzcHCxr/ExMPDysLJyr/AvMK6s7W1w66qsZNbaX6SiI6Pe3h9iYV5e4SAd25eXVxcXV9gX19kY2JkY2JgX11aW1paXVpaWlpcY21tZmRkZGZnbHlZUmhjRUtaUz5dmJ+ak5agpquipqGqqKuqr6KlnqmstLWwvLivt6+orbi0s7u3s7yvuLm1srzBssCupamjq7Gzs6i9qquoq6yutbSmqa6hpbCps6anqK6mqLessbO3uru7sry+vr7Ev7XBwMfIt76/xbfFw8C7v8TCvsTIzMq/v8TAwKmHc3RzamlcYW9kV1ZYUEhaU1NLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPHubnLwsu+u8m2vcO+usq3wcPCtba8trGvtbytqauTY22Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX11dXFpYWVtbWFdZXF9lamRiY2FkZGhuckJGRURERlNJXpack5CKm56loaGepKSmpayfnJqjpayysLa2p7Crp6q0q7O5sLW1rba5srC6urG2pKCkoKaxqKypuaqlp6eop7OtoKenn5ylpqyfn6ekoaGxra2ssrWztLC1vLa7wcCyu77DwbG5ucKzwL3Atbi8vb68wsfEw8S/wMSghHlxbGJmYGtvYFVZX0hOaE9USEZLRjw9QD06Ozw4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBur22oJ6VnaCmurars7O7s8TPycvCxbi3x8DMv7jKt7vFuLPFuLO/wKy2vLKspq+0raGjkmlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYF5cW1xcWFlYWFhWWFpdXmNiYGNjY2JlZW1mMzVCPTVHQ26Vmo+NhJecnaObnZ2ipKKmnZqhmp6qrqyxtKOoqamrrKS0uKy2r6yytK6zta+wqp+en6SisqWmqritoqamn6itq5mfoJ+ZnZ+lmpmjnJyesKmsqKqrrK2ws7mvuLm6sLa8u7qrs7K5s720t7KxtrW/tb3AvcPCu7u9l4R7c2xfZV5kZFhUV15JV11LUEdKSkdBPD8/QTs/PDA1NjM2Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru4wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765yLi4v7eywrSxu7usurqxop+pq6eYnpBtfoWGf3hybW9ta2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYV1dXV1dYV1pdYWJjY2JiY2RlcVIxOjQvOEJeY4yWjYeVnJ2lnJibo6Who5uen5iYraytrrGgpKKtq6ehtbCxsayor7KnurOntqGin5yjoa2joqq2qqKjpp6mpqOWmZ2XmZqdoJqXnZydnK2hrKijpKatq7OzqrWwsquyubSvqq+ysrO3s66pra6yuLC6trq9v7ezsZSGenZmX2ZfW1lWU1pVS1tRTEpFSEtJQz0/QkJAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7KdpaOYpbHDtba9rbS4wszIxsDFtsHAx863wMO9s7m5sr+2sbm7rbK1r5+ao6qhlJqPeH+DhH94b3F0cWhmZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdVV2BiY2FhYmBgZGdwUFE/LDErJDprpZWJkJqZnJqTnp6nopydppuamaqmrrCpm6Kit6mhoK6otaqmp62wpLewpLego5yZmaqmoZqtubCjoaScoqCgk5WhlJaWnJmYlpeclZ+pnqqkop6jqqqxrai0rKqnrbOwpauus7GvsK+vp6iosq6ytLC8tLq4rqOUgnp3ZV9hV1lYU1JUS01eTFBMR0hNTEU9QD49Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+t72tnaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa68u7W7vLW5ubCwsaqcmqGplZGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXVlVaYmJhYGFfX2BiaHBoSjEiHCZKSX+Wi46VmpeckpycpKOhpKWdm56lnqqupZ+goranoaGiqLOipaelr6Wxrqu1n6GdlpWpoaKUrbGxn6Ojnp6YnJOMoJSRk5iYkpaYmJeep5unoqKapKWlq6SlsKelo6usraaprq+vq6iqqrOmpquvtLGuvLaxr6+fknt4c2ViXFtdWE5MUUhSYU1WUE9KTk9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6lpqy4u7zBxbqyubXEycnAwsbFx7bGxLPBv8Wrt7e9tr26u7WyrK2omZmfo4uKdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZWUlRSVF9fXV5fXF1eX2FqaUc6NC86aXxwhIuMkJ2VnJOYnKKfqaOioqGioZuoqqOZnaOwqaGgnaSqnqiinqysqqmuraKiopWYopqckKupsJyfop+fl5mTip2RjZKUlpCYmJOcoaOcpaGilqCipKWbo6uloqSqpKutpa6yqaalp6a1pqqorbO1tLm6r6qsnoxzcXBgW1dWVlJHUU9IWlxPUkpUS1NMRUdKQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw3Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsa2dqKevubmzwMi6tcCvxcjMusHJzMi1ybyxvsPJrbG4wbW8wLy0taqsppaanJyJgXKIg3t0aWlpbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFVWVVRVVVJTTlBZXFtbXFxcXVxfYmtLNUJCUn2Gd3uKi4uVlZ2Xl52kpaelqaWopaGXpKyilJikraifm5ian56umZyqs5+lpp+jo6GUlJuWlpKpqa2bnJ+hoJuUkIyZjYyRjZKNlpWQnaGgo52co5WboaOhmKKoo6Koq6CrsKSuuKWjpKOsraqoq6+0t7K9tbOrrpiFdXRpW1lZU1VSRlhMUVtYTVVPUExRUklPSkI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02ODo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraezt66oqK+um6morLe2rLzKu7a/rMzGxbjAzs/Hs8S7t7vCyLGtuL+3vL67s7amqaCWmJmXiHp0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05PUVhZWVlcW1pbXV5mY1VYbG18gXqAgo2JkZOcm5abp6Wjq6mmrqOml52qnpSUo6elnJePjpmdrZaYp6qYn52UpaCekpGSkZOVqKqlmpiZnp6WjoyLk4aJjYOPi5KVkaCeoaSZlp+VmqGinpSbpaWnqaigsLCmsb2nn6OstKqup6+0sLm1wLGusKuRfnJ0Y1ZUVU5RSkdWUFJSTExYTktMT1NHTktBQ0ZFQz5CNzU4ODk7OTo3Ojo3PD06Oz8+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/tKymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrG3uLy9wMOxsLG3rrS0u7O0o6OdnZiXlYSAdmtnbG5xbnFqb2tkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVFFNTk1SV1hZWFhXWltbYGpwanBld314g32Ngo6NkZaTmaSXnKekpKmcpZeeo5qRjZ6hmZaWhYSRmqOPlaKclZaVh6Kam5OMjoqQmqWnm5WVl5yRk4iUjouBjI2AkIuSkpKhmqCilpSZmJWippqNmaSnqaehoLSyqLO4oZ2jtqyqrqSysqa1u7SrrLGiinpzbl5OUVFNT0ROTk5QS0ZOTkpKTk5RSE1KQUhMSUhDPjk1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLawpKekqqWgqaaks6qissS1tbKzxsW3usPKzMazrbq9tLjAr66psJ6mrruvraCam56VlYh8hG5fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTk1LS1NXV1ZXV1dXWl1hZ19jXnJ4c3x0h32Hg46Ljpmdi5aZoZ+hl6SUn5qUjIaYmYtzjYJ9jZaWhpKakJOOjXuZj5yMgomAipigo56Qk5iWhY6ClH5+dIqOepCIk5CQnZuampKWkJ6Oo6OOiZqgoaSkm6K0r6ywrZ+YprimpbChsa6csbyqqa+pmYR4dGRWTVJQUE1DU05MUE1CUFFISU5TTklKSkVLTUdLSz44NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI0ODUvMDEwMikoLC0wMjc2NDc4OTo6NjY6ODdBN3i3oaO0qKalqKOlpaamprKnprTBuK+0sMnEuLnAzsa+s6y6waytxK2ooqaSnaa3raOgkZaXkpB+eH9mV1ZfZ2ZpZ2huY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkdOU1NTVFRTVVlaXWhcXltsdW1pR1JrinyQgYeXkoeQjZ2Wm5WVlZKNlYh/k4lfO1dve4uTiYCMkoyPhoZyi4SWgXmBe4aUnZWDlo6Qj4OGfZN4cXCGjX2JgZCOkJeamZOLkIqdiJ+Yh4iWnpqhoJenrqmtqamelq2zoqWtma2rmKi0o6mto5N/dG5gW05TUldMRFRKUE1MRk5PSUVMUU1LUEpJTlBHSko9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CiraGmpqqgpqmno6qwqKe0wrmwtbDHwrizvc+/ua+utcKnqsSqop2Yg5ScsaOamYeUkIuHfnN2XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNTlFNS0hGSE5RUUxPUlRVWFlhY1pWaHBlSDs6e5CMiniCj4iAhomYi5WViZGGhJOFeIh/YEpRbneKkYN+hIyLhH9/bX5/k3d1dniEjZpwUY2IioZ8fnmUdmd3hoh+ioiVi46Rk5eMhIqIlYSbjYKFkpuWnp2UpKKoqaWknpuwqqGkpJGmqpaiqpyhpqeKd25mXlxIUVFTTUlVTVJJTEtPSUhGSk5NTVVLUVJQR0pEPTc2ODo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs3Nzc1MzQ0Njk2LzMvLjExNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aboqedn6Guoaeopaeor6yqtby2uLezwbu2p7nIuLaoqLW2qrK8p56Vjn+JlKmWlYt/joSDfnhxb1hNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERENJTk9oWU9RU1NVWmhmXGRtXF1TTYqAj4JveYF8eIGJkH+QmYuPeoSNfnR/eHJudXB0jo6Ben6Kq4V6e2h2e45wcm14gYuNknh7gHuAd3NyknhodYWEhIV8lYqIio2LgH+Ei42AlIR8gY+YlJyWkZ+dqZ6goZ2gqaWfnZiNp6SSoKCWnp+kgXNpYl1dSldQUkhLWFJPSk1MUkpKSkxQSUxRTVJVTUZJQj03ODs5OT49Ojs8OThAPzo6Pjw3PT03OTk0Nzc4NTY3NTI1MTQ3Mi8yLiwuLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqqWtq7Cxqr20sru4trq0sZ+3urKqnZ2sqaiyr6KakY2UgY6cjpF/d4Z4fHZwb2pZS0hJSEdFSEhQVFRUV1ZTVVVVVVZXWFdYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MTlFRU1ZeaG1paFlrg4+Ui4x2YnR7cnV7hY16gpiSf3CFjXp2em5rfq18dJCLf3qGkoB8f3RmdXyGbG9oc3yKjYeAbXpxfXFtdo9xaHGBfo5wRIuFgoOFf3d3eoyGfYx7dX2Oko+Yi5Kbm6OWmZ2bnZ6hnJaNi6Wbjp2XjpaYkHhvbmdjW1hYVVFKU1VUT1BOUFZLTktPT0pRT0lPUExGRD07Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagprCsrqunqbCvsau7uKu7vrizrKebsKesm4+WnKWppaGYmo6EknmJj4uLdnF8bXVxam1qWEtGR0VBQENESExMTVFST1FTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WUpOT1FUWF1hZ2NefJygvXxucl52c2p3dIWNd3qJhG5ripB3c3hpan+CcZaRjIF9lX9JkpluZ3d+gm1qZGx5hZCShmtzbHxucnyGaW1wf3ONiYWGe35/e3dwdHSGgnmBeXB8joyKk4OWlpiakJOWlpmWnZaMg4mfkouSjYaQl4Bwam9vb1lWWFRSUllPUlVUUlhVTU9ITUtNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5ibn6Ssr6Ktqqi1r66ss7+rvMO/pqKalaSYno2Ei5ShoZiZkZOLc456gIaMhnVvdGxxbWVra1lOREZDQDw+PkFGRkdLS0tMT1JSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUlZaUVdYV51+W5NibHJgeWtpe3aHhXN/hYNya5ePcnJ7aWqdjkx5hZOJhI1mMXaHcmt9fYN0ZmV1f4SEhYBmaWx1a3CAfGhxcXxuk42Pe3R+fXFxb3Vtg393eXVqeYiCiImDlpKSkIuNkZSUjpeNgHmIl4iHioaAkIh4bGtwaGVYUltYWVlbTlBVVllYTklIRUpKSEdCQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW2SiJqQmZakqK2esZ6nuq+rsrDCsbvDx5qWjpWZi46FeoSQmJWNkIyQh3GHgnSHjIZ6cHNxb3BkcGdfVEZJQz88Ozk6P0BBRENFR0lLT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FVS0FJUEhfqa2aanRxZ3hobX59gX53gYODd3CeknJ3gHJ0k4c1cJ2onY2goYSihXZwhnuGfHSMro2JgWhnYmpucm1wg3Vpb1h1cI6bkXZtf3t9bnJucIB7c3ZuYnWDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY58c3JxbWBcXV5cWllhX1JOW1pYV0xISUZJSD9DQUJIP0NEPTs6Nz07Ojs7OTo5OTs5Pzw4OD06ODs2NjY1MDEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikYGSiJWRnaSnnq+VpbSprrCuwbK7wcWWj4yUj4CIfG6BkJKJg4qHj4Z1goRslYiIfHV4eG14bndkal5JUEc+Pzc0NDg7Ojs9PkBCRUhMTExMTlBRU1RVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJSQ0h+bXh1dHB5aHKDhHh6gYB8iXt0n5d4fYWAhJmEmpxhhqqenIuDkI56d4h+iYiOdIuXj4R7XWRxdHp8d4ptaGpieW+FkIJ6b4F4dYV6cHR6eGtuaV12hn2HfIeGjn+KkpeDjYWMhn1xhH+EfXZ3e3yJeHF0dWdoYFtcXlNcZ15XUVRYW1VHSkpFTEc/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1NDI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4in+TjJGcnZ6lkaCroLGor8Cyu8S6lo6Rk4d6hnZrf4uRg32Kg46MeIOBc6CEin19gX9wgX56aHdrUlhMQEUyMTEzNzY2ODg6PD5BRUZGR0lLTU9RUlNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUtNT1FLSlRbV1BIYnuBdIJ0dm14i4d2eYWEe5OEdZ6XhoaNkZSljKypSIatr66KgYCUi4KLgoSSqYiBmJiKnHRtfIGGh36OaGdoeX9uhYeChXGEhkhsgHdyeXZobWtfdn2CiH+HhIt5lJybiYuIkX96dYp2fHhtb3d+gXV1c21cXl5cY2RYZ2VcVVBQV1lQRExLRk9JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY2NTY3Nzg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkI6Vl5KWoJ2soKa4r7O9s5eNkouYi310cH6Jkn59jIOSlH2Gfoakh4h/goiFeIeJfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0+P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz8/OTQuXZZwc6NVRklLTE1PV2BXbFhaW2SEi36Ne358gIyOe4KFjX6XkoCen5aTmpmlrZKZu7GmusfDp4uMoaWOk4mBkXxxg56fkZ1/d4WFi5CHkGlocISBdIyHhIpyhoJ3iIB7doR8bXZ1Zn+UjoaIiIaHh6CqopaJjpd/eoGIeXlvZ2t4fnyAdWxlXltbXmpeYmdgWk9MTldSUUhQSkROR0NKRENARENBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmd4J6f4x/gZGOipqbpJ2hrKaqrrCXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46EgIGMioKJjYN/in9scGpdQkA0LS0vLy4vMDIyMzQ3Nzk7PT9CREhJTlFSVFJTU1RSUE9IRUI8ODcvOUM+PDw2My5sk5dNUEhKTEtKTVZfYXtlZGlvk5KGk4yNhomKlYSPjJqInZ2QoKijoqqTqLWhp8HCrceveLmUmnyNoZ6ZhJOFgo6hn5SZkYWKhY+akZZscHWKjIKVjI2Od4+EcW2FgYqWkYKFiHKIoJWGkYmNj5aktKibjJSig4eSg31/a2pqfIKDg3VjX2VgW2hsXmxsXldLSE5SUE5MTEZJUENETkZCQ0VGQz46OTY9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcXaShn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReYCSiJGSfYqEmJKQg4CAi4yJhpCHhImFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5PUlRQUFFTUU5QSUVEPjs8OkRGPz48ODUyPD9SNUhISExLTU5SXmuGeXB9eJaUkqCfnJWckp6RmZulm6WonaaqqKm0lqu+q7XHyLbI0M++m6Bwaaupn4STkoWcoJqbmaaSkYiVo5ubeHp+lJiToZOXl4GUnnt3lZKqsoiMlp58k52bjZGVmKOhpbWvnJCYp4eWj42AiGxzc32BfnNqYV5iYGJoZGBoZ1xSRUpLT05JSUxGR01DSExGRkNCR0VCOzg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYuOjXyKho+QjoGCgImLioWShYOGiYGAh3deYlA0NjAtMi8sLjAvLi8uLjAwMTU+QUFNUVJTUVJTVVJOU0xFRUA8Pj1GR0BBQDg2NjI8OTtGSEdJSk1OUVlrgox0j4WZn6Gtt7OgqaippKaxqa60r6+rubCyvZuyw6u5ycu3w7+3paKws6ytqqOLlpiEpaago5eBppmNoqqopYiFlKShoaqgpKiPnLGLlaOmt7qboKKvkqKcoZ2PoqGrrquytKGUpKmImYiSiZV5en6GgWliaV1mY19lZF5nZ19bT0NJSFNORkhLRkpHRkZIQUtGREZGQjs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGJXaW5YeoR2gZOFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkY6DhIGLhYaIkoaChYmHiIeHcW5hQEU2NDwzLzExMC0sKy0wLi00P0NBTVVQUlNVVVZVTltQR0hEPD4+RkhDREE4Ozw1Qzs9RktJRkhRTlBXf4+bgaieqqOqusK/p7DCtKqxvrG2u7O9s8C1u7qiuMWotcjHtb24tKijtK2wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqK+2urK6rLC1orGssbW7trSttJ+mp6KmmaivrLG4t7immrWojKSOkJKfhniChXhbY2VXZ2NiZGFhZ2BbVEpERExUUEhJSURJR0VBQEBLREJNRz04Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtZUWJiV3l1cYGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomJeYaAjJOMh4SBjn+BiY+Gf4aIhoqHkHp4bl1XQEVOPDY6NDVBQjc2NC8vNkNIQlFbT1FVV1VcV1BfVUlLS0E/PkdLRkVEOz5AN0Q3P0JKSkVGVlNQXoygqqCurruvsrvIxbO5w7uysr+1tsCzva+2dLCzpbrEo6/GuLCzsbOnpLW2qrGgopebopKlsK6mraunpJihrbS7oqiyurW8v8y/xcW9vbPBt7q3vra6t7irq7Ckr6isva+8usHBq5i5p5StjpeXqYh+g35tWGRiWWxma2ZYXGNZVlNJR0ZMUEdDSElBSEQ+P0JCTEA/TUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxRVlNYVVp2anB+joOAjoRuenN4h2K5oZmjiZSUlpKUk42Pl5KHh3uGgY2VioCEgYp6fIqHhnyKgoGLg5V9d3p1ZVBcZEdFTDtRY2FbXlNGPztIUEVaY1FRWVhaZ1lUYF9MU1BFQT9JSkhFRUFARDxFNkI+SEdKTFNaVF2Rq7Oxt7PEuba5x8q5usC7trS6ubW8s7mxxWB0saSxmp6qvamlqKuqo6KytaGrqJ+Vlp+ZoK6lp6aln6SUo6extKiys722wr7TycnTxsPFzMLKw8C9vL67u7a0r7i2tsK5xb3Cx6+euKmhq42kp7WIgYF0YWNjX1hjYGpnU1hgVlJVSUVFTUpBPkdEPUtBPUJAPUc+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0rL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhY9zbHJyc4fVwLWZoI2VmJmRjpeRlpaOhod9hoOMlop+g4CCeHuLg4d7i3mBioKXfnN9emtmcHVZXlxQZWRiYGVkXVtYV1xNZG1VUm1tX25fWGdkVFlVSkRCS0tJRkhISEhCSTpEP0hLU1RVXFpbkra9tbuzwry3tsjJuLW6tbe4srazsq21tphkdaecrXBeoqycmKCim6SeqqWUn5+Qk46WmZion6agnpqZg6SeraWqsK24sL251NHP19DKzNLMz83Kxr++wcm8wLzAwMTExMm+x82yo7qwtK6aq7e7mIB8bV9iXlpgY1pkY1FbYFNQS0NBRUZFPEBGP0FIQj9DPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRW1loX2+WkpCUbmxvdHWHtKyhoZ+LmZyZjI2VkZqShoqKfoiGi5CLiHyBg3N7ioOFe4l0goqGlX9ze3lsbXV7aHJlaWxpZmpqaWBmaWlsWm1zlq2kvIiGZ1xvZ11aWlRIS05QSktQS1NRSUxBSkZKT19eYWZpYZe1xK62sLm6s6/CxbSuuLCwu6uysKWqt6uMtaedmqeaTZmdjI6flpGmmKWVipOTiZCJj5GRnZuhl5qVl4efmqebrK+osKi0tNTU1NbTzNDT1c3Sz8zEwcnQvcnJysnRxszNws/Rt6/DvMO5pLW5waKEcWVeX19aYllaZ1pRXVhPUEJCSEVCSDtAQz5BRz8/QTc7Qz5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlSZVZzkJCYgmdxb3l5g6GqnqaXjJqbl4uNlZGajn2Ji4WNiomKkId8hIJwf4eBhnuHcoOSi459cXh1bHF4fnF6bXhzbWmAcG1jaW1weGl3fH7LvsHfp21jeG5jW2JgSlBSVU5ZXk9dXE5QTlRQVFRcbm12gnGWrLarsqWvtKmru7+wqrSmpLimq62fq7SjjrCtmpeYjI+SkYSOm4GNppGciYOLhIqJhIuElJWYl5SbkZyXmZqfn6uspaiirK3P0tXSzszT1NTQ1NHOx8PU0cbN0tPT18zR0cTS1sXBzsfHwqi9t86efHFoYGVfWGJTX1tQUVRRT0g+QEZBQkU8QEE+REM+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFVRTU5adYaFindsd3B9fn+hnp6hjIyYk5OLjJKPlYV5hZCQjYuJiJCGfoJ7cX6AgId6hHWFk5CIf292cmtzfXt3e3OCeHJrgHNyaW9xenlxer7Lmn2LsYR2coR2aGFrXUNaWltWZWNYZGpTWFxdYGNdY3d6fYuBmKmjpKCeoKelqq+4qqWzoqGtoaOtoaaxnoimmpOSkYmPjoiBk4lqlKKMmYSBhn6Rg4OTl62LlY2VmY6GkpGel6iwoqGhpaSpyc3PyMLM0dTS1NLO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsw8LLjXVxZWJhWlZaVFxRS0dKSkpAOzo7REFEPEJDPkdCPkJCOjw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtPTEZKWHCAdX1oc3hygomAnZWdlIWLlYmOiYiNho5/eIOTmIqMiIiLiH6CeHN7fYKHd396hpGVf4Nud3BtdX91eH10hXx5bYd2dG59doR0eHudtYw7QYrFpX6MfGllV0lDZmNlY2dqY213W15maGtuaG6AgoeRi5ydoJyQl5ieo6OlsaOksp+hpZ2gqJ+isZuFnpKRkY+KjIqGg4+Ef5ybjI2ChIV5lH+CqZWjjJGJl5KLfpiLm5Krs5ibnKicp77Dxrm2xs7S0dLQzNLLyNTO0NXa19fY1NnYzdjbzsnZ2tHVvsrLtXp5cGdfW1RXUlxXRkdKSUVFPTo3OkBAQjlHRD9EQ0FDQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfJeRnYt+h5KDiYaEiYGHfHiFl5aIjoKHhYd6hHlxenuDhXV5hY6NnHmLcHxvb3p/cXuAcYOHgW6OenV3fXyCdH58hoevc1ipwraNkYJwbWI9XmhycHFwbnh2gWVob3J1eHF6i4aNk5GalZ+Vh4uTm6CanameoKuboZqYnqSen6uZipqLkJGNhHyHh4OFi46fmZOIg4d+bJl6hJiGiJOMjZSMhnyciZSQrqqUlpifmaevtr2prb7HzMnJzMvQycPSytTX2NfY19Xb19Pa29XQ2trR1sjUy5Z8fmtrXVxRVVRhSUNGSUg+QT49Nzo9Pzs9Rzw/QUFBREE+Pzo4N0RCNzU1NDc5LzU1NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw5OUQ+Q0dSal5tZGJma3aAiHGRkJqAeoCNfoKCgYN+g3t8hJiNh4t+hYeAd4J5bnt7hoF0eZKejqB2jnWCc3WBfXOAhG+BkIJvkoR1fIGFenaGe4m3xaTBybiBlpuPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aUlI6XkIKJjpaZlpWkm5eelZ2SkZainZmrlZCQiYyRgoyEiIiBhY+RnZuZiYWLgYWYeoiJn5eQiI2Ki4J9oYmRjLyhmJOYmZyppqaun6i2v8DBucjKzs7FzcnR1tXV2dXX29TW2drb19ra2djO28aIfXxqbGhiVllXV05MRU5DOz09PDg6Oz05PUA2PT8/PD49PTk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozk6N0lQXVtTVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9YZWFdW2h0enlsio2Sd3Z6int+gH5/fIR6foKRiYSFeYSHe3V9dG18fYZ+c36SnpGeg5F7hn54j354iopugpqAdJmGfoGJhHt+kHqPqY6Pw6G9i5yknX2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJGEiIqQkpONnJmSk4+VjIuUnpyUoJSQjY2Pi36PjY2Kg4iSlpqenoiLlJGdkYGLf6WYiISNgoWEgaWGioy4mJ2RlZaip6Genp2kr7e6tazAxsrQyMfMz9PT0tjT1dfA19jZ29ja2tnZ19u4e3x7bmxoWmJdVFBPSURMQjw8Pjk5Ozo5OTs8Nj89Pjw9OTk7OzM3REA4Mzc4PjYwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDpEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODY4OT89Q1FTUlheVVhmbW1taYGOinFyeYp7en98f3uHenx7i4aCfXSDhXlzenNtgH6EfneFm6KbnZSSf4yIf5iHgJuSboiohXqhi3yRjYOIhJx9mpCKjKOioJCkr5+LkIuFi4GThldyrYufq5uPg5ibj4+OXIKikYKMn5OUi4aHi5KSi5OTk46LjomHlZqcj5SWkIqRk4aAi4iRjIqJnJaYoqKGkp2VoIqJiI2bkIOHjn+Dh4akhYyRs5idkpSXoaKfmpKcnqiyuK2mvcLHzcjGz83QzM/X0dHVrtbV2NrY2trX1dnZoHKAd2ppX2BaVVlZQ0FJQz8+Pjo0ODo7Nzo7OjM7Oz89Pjc7OjoxOkc9OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI6ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J6bWF+koNvbXeLeHl/eoF8hnx7d4aEf3NwhYJ6dXd2dISChH5/kqakn6Wil4qdkJSXi4qol3OKso2EqJKEmZOFmYyilZ+YkoibnqOSqbCfkJSQjY6IloxujbeFmsTIspuhpZucmJaQspFkpM3IlY6Gh4iPkoyMkZOIhImIhZWZmo+PlJKGk5aDf4+LmYeNkKqXlqKiiJielpqIjoaXl4mEjoyBf4ePpIiOk6ial5OXmaGZn5mUnZujs7Smo7zCvsfGxcnIycLL083N1KnS0dbW1tja1NLazoV1g2tnYWBgUUtWXEJCR0M7QT04Mzc7PDo5PTY0OTo8OjgyPzk5MjpJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRKUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJlg0d1go58fG1+iHh6fnqBgYJ+dnaAgntsbot+eXx3eHyEhot+i6O0qKSrs6GWp6ClpJaVr6KDkLiVkrOajaGgjKSbr6KknZiQp5epma2wpJeUlZSQi5ialqDAjqPJuKuaoqWtmZGbnLKdhoWoopyXhYiIjZSLipKPhoCFhoiSmJSMipOShpOXhoSRkJxzkJiylZajoYicmZOPipCKlpqIipaNhn2MmJ+KkJCcmpmTmZiglKCdlZ+bobGto6S4v7TEx8S9w8O/xs7KydKnz8zT0dDW2NLP2Lx1fXlgY1djWFJJS09FQkNENT47NzY6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs1Mjc3P0A2Pz83ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SUVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER01cXFlKaGE7SISLenpthYZ5fIR4gIWBfXB4fH18b3KMen2Be3iGi4mGhJKovK2ps72wpa6zs6mjorCtipq1naO5pZWtpJeprbempKOfmamYqqSvsaqamZyUlZGYoJeau7utyqFptreqsJWYnqKrkpe9pF6psoKJiYyUhpB8jo18g4WNj5SUiIeSlouOlY2LjJeYkZuZtJaUqp2LnJSRjJCSi5iaiZGdj4uKlp+ijZWNl5mdk5yYnpShoJScnaauqKKks7irwsjEtrq9vMXIyMLQocbJzc3E19bQytOjc31sYF1WYlRRR0Q+PENBQTg/ODc0PkY8PDY8MzUzNTU0NTRCMzk6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZkhhYGJwSkCLiX+AcoaHfIGJdYKKg35tfXx8fnB3h3eNgYd7jZCMhoyaq8PAsL3GvLO0wby0rKuztoyosq2uvaubu6Oorbm4q6amoqKko6qvsrGqnZyjmJuYmJ6ipqWTo7mvqL+8rK2yuaWjp32IhpytvbCCi4uKkIOPg5GOeYGGkIyNm4eHjZaMipSWk5CZlpunmrGZkKqcjpqPkY6VkI+Vlo6QoJCIlJujrJWWj5ScnpSgnZuYn6CVm5+np6SipLCzpsDGw7Cwu7bFxcO/zafHw8fDvNXQzMTKind2ZV9dYl5PTENMQEVHP0E/Qjw6ND5BPT01PTY+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVKSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGhGX2lnW11ck4yMiHuHi4aDjHWGkIqBb357gX5xfoF6lHqSlJSYkZOVqLTHycDCzMLDuce8uq+rubuXsra5ssGupcCkq7C8vKquq6Ojnqesr7WxqZugqpyinJafsLSnjKO6urXBu6uonLKkpKiUhI6pxMSkgouOh4iEhpWUjHmDjJCOkaCLi5OQjoeXn5eSmJSWpaCunIypnI6Wj5GQlJWNkJSRjqGThpefoLKflJuUoKGZpJ+aoJuglJmfp6Smp6SvraW/w8KuqLe1ycO+ts6yxL7Du7PRycjBtXh8cF9bX21UTklETExMSkBBPUJEPDVBRDs6Mz04QjMzMjI2M0ExNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmdcTWVcZlRjapqNloqLiJKPhol5hpOQgXKAe4x/d4eCgY95jaGWqJqbmLq+ycjKwtLJy8LNvcGzrby/p7q/vbzEuKzBqa2zvL2qsKqkpaOsrrSut7Wgn66fpqKZo7S9qZyovMGjtravq5OwrKqsloaaqqelkYKMkqSViYB1iZF5hIyRkJ2fkY6Sio6Lk6KXlpqUk6GeqZ6QpJmMj46PlZaIfI6VkpGimpSgopy1ppCgl6Wko6WfnqaYnpWXnKWjqKiisq2ou8DEr6Wzt8zAuq7Ds7u9wbmtwsLBv5pxfGRbWl9eTE1OS0dFQ0hBQUFESzo0REg6OzQ8N0YuMTIzNTJBMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5sSV9YYVpkZViej52Ol46ekomKf4ifkoR4hX+Ufn+QiImQgJahmq2npJjDvsnEyMbTzc7Ny7zCt7C6vbS9y7vEwra2vK20v7m8rq+ooamotq6uqbK3mp6soqiinau3t6qlr77Esb25s6eqtLOtrZaVpa2ooJGOkrHFp5WOfJGVfIaQmI+pmJeSko6SlJKknJKcmJOgoaGbmJ6XiouOjp2IWo+Wl5KWpJlmmaOes6WWopasraynnJ+ml5iWmJWho6imn7Wrqbq7w7SmtLXLwbiqtqyzu7iuqLi6vLeEcHFdW1ZXUEdLVE5LP0FHRERIRkY4NUZNOz43PkFLLjMyMDI1QjU1UFdOPExGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhWPD5AQkZCc0ZpSVJmZE1GppSclqGXqJaMkIOHpZKIgYeCm4ODlZCQk46aop+vvq6hx77GxcjHzs7P0sq+u7axu7u8v8+2xL63ubezsrWzuLOsp5yrrLmrqaiwsJijrqWopKW1wbCrrbS+w7nAubOnuLS3sq+VpK2wr6WLk5SgjXPBmX2WmYSOlpmLsJWZmZSRkZmYpKKUnpqVmaicmqGfmImLjpScX0qWnJqUmaSXVJawn6+cn6WVr6+tppuhppSTmZiOnZ+moZm0qaqzvLy7q7Cyx8C4pqyrrbGxo6GysrSlc3JoX11RUkxGUVFQUTtISkhGR0FDPTlLVD9BOj1FTS83NTM0OkI0NE5XTjxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NUVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oWDw6QkNAPVJFV1N0YlZGSKuXmZ+hqK6YkJeHiqeWjYiShZ+HhJ2Xjp2gmqOktcm1qce8xMTJy8nIzM7Hvrqzr7q4wMHNtci7wbm2urKvr7O0p6Scq7S1q6qmrqyapK2mpamsur+oq7e3vsHAvreyssOwt72so661rbqmiJuXpZt1vp+EmZ2Okpiai66WoJualpSanp+onaafmZmpmaCmnZaPjJCcgm11kqKalZyin5CusqKrlamqmKqvpqWhpaqSkpmciZWcop6WsKepqrq3vrOyrr65tqCjp6ilppycrampjWZpY2JUTU1HSU9KVUw9TERNSUpAQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNDOjlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc8Oj0uLlNhTVZIfmVeSEaslJyhn7uumJSei5Oqm5GRk4iqjYeinoyjrZSjpLbHvbTBu8LCyMnFws7Iwr25sq+5tcDDyrbGssG8tbusqa2tsaOjmaq1u6aqp6yqnaivqKSrqr67qK29tLe+x7y2tbjAsL2/s6m1t6y/pY+il5Chn7yeiZqgmJadnY62nqibpaKam6CZp6SxoJqdpZynqZyXk46Tm4qWiYykoZScop+gtbClppSxq5qrrZ+fpaSqkpaVoISQnp+clqmloaGztLu2rai1srKenKOlmpeVmaqhnnhkX2FgTElGSE5RSU5FRkZCUUpIQERHQVZTREg8QUdRMTtCNzpCRjc5XVlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdEqJeknp/DrJuXpJeZqJuVmpqOqpaVqKaVrayZoqu3xcK8v7jBwsDIxL/Nxru+ubKwubS+w8i2wLC8trq3p6SrrK2hoZurq8Sipaispp6rr62iqqi+uKatvrC3t8e3tLi4vrG+wLa0srWvvqOWo5WSmpOtn5ChoaSiop6QvqSonairnJygmqWfvKKXo56hqKqgnJWNlZ6TnoeOhI2TnqSgnbaspp2Xs6easKignKufoo2alZ+EjqGanJKlpZqXq7G2sqqlqq2snJigoJKPkJapn5RpZlxiXlBKSEtPTEhFRElAPU9IQDtGSUhbUlBLPUhOVTRCRjg+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLTBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZmNYTqKbo5uexaugnqudnK2fkaKelqSfpqqrl7axo6qztsXDvcC2v8G8ycK/ysi2uLW0sbS0t8LGt7+xubW6tqCnrKusnp+gpaTBpaGqrqCkqa2woqaovbWlsby3trbDsrK3ur6yw8C4uK20tLWjnaSUkZOgrJ+YoZ2oqKqimsKsqJ2rrZqanZiln72hnKSXq6urpaCZjZqgkp6Ijlh/lp+moaC5qqeUmbejn7OioZywmKGPmpWego+gl5aOoqOVkKWusqypoqKlpJWVnJiLj5KTpJ+JY2dcZWFNSktLT0ZFQUdLPj1JQTk5SkpOXVFRST1MVl05Rkk9RE1JOEhjXEtDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YVM2U1prV3NIRTY9dWVcTFCeoKCYnsOnpKKzoJuxp5Kqo5+jnq2prJ27samstbHIxMHDs8LDvcfEvcTKvbCxtq6xtbDAxbW6sbG6tq2aqbCqqpufpqGnwq2crbGcqaKusaqkqL23prW7va+3xK2zs8K/ssazurertLatqqKmlZWToquhn5+Zp6qurq+7saWfqamZmJeSoqO3oKGjka6uq6SlnpGhnpSdjpCNlJ2ao5+otaenjZm1nKOvm6CcsJGhlZiVm4CSopaPjqChk4umrLClp6KdoJ6SkpqThYuSjZyfgGRoXWhmS0pMS1NBQ0BJRzs7Rj44OU5NVV9SU0o+T15ePUhQQk1MSThOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8d11eP1tVX2dyQDg8SJZ3ZUE0n6SemqDCp6OpsaCjtKmVsaumoqSyrK2pu7KtsLW0x7/Ew7W/xL7KxbbAycK1rLWpsLmswMS0uK+ttrqlmauyrKuYoaeYrbu0nKiwm6yfrrSyp6q6sqa4s7iyucGqt7LDvbTFp76urbe1qaesoZaWkaWjoaGXl6Sut62xtLafnqikmZOUk6OgtqKkpZWtsbGlqKShnZmZmpWYqKCfmaKer7Oipo2Yr5qlrJibn6eTnpCVmZqGlqCVjJCdnpOLqamroaehmp6WjY+ZkIKGlYmVn3pla15sa05RTk5UPUNBTkM7Okk/NzdRTl1fUlZRQldgXUJKU0hWS0g6VGRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzkwNnBbYkgwNUpxalZDV0aMeWZDO6SknKClv6aorq6gqbWqnbevq6OqtLawsLi3sLe4uMW9w8e9vMPCyMG6wcbBuqq2pa27rcHDuLiqrbK8o5WtsK6zl6aokaq5qqGnsJ2qoK+0s6qqtrWsuquzsrq3rLiwwbq9v6bDqrC2rqmrq6admJiqoKGgkZegsK6zqrC4mZupn5mWkZemoLaopaKir7Czq7Gnq5+an5+bnqWdoZido7SwnJ+RlKaaoamclqSimJqMlpmUlpedlImRm5mUjqmpp5+jnJmbk4ePmYt+jZeGj5psaW5ibm5YUVFaVEFDRFVAOztIQDc6WFBkXlFXV0VZX15OTFNPX0xKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE3NDdnWWFGKEA4bX1oXFY6iXtjQz2on5yhqbygqq+qorC3qaW0squhrbW9r7O4vLu9t7fBwr/Jw7nEw8HAucW9wbivtqirt7K8v7+0qq+yuJ+Xq62prpipqY6nu5+lrbOfq6KxsLOsqrWztbusr7G1rLC1ssC6xbarvK+xt6ytqqOxpZ6lqJ6jlo+Yn7Kpsqmpspmdp5ualIyfpqS0rqeirKytsKeyq7GpopueqKSelaGZnKi2qZiakpKfmZ+hoJKuoZuaiJeZjJ2anZSLj5eXmpempqOgnpeWlpSAkJWEe4+Tg4yXZ21yaHFzYEdZZlZEQ01YRFo5SEI2Pl1RaFxPWl1HW15eT01TWGRKS0NcY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVYxNTE9YFZfOClDM1lVXGdLNYx6ZkxApZmfpKu2o6yopK6ttamvs7mmp7C3xrext7/Bwra1usW+zMW5w8G6wLrFuMG6s7Ssqrq4u7q+tauvsbeYmKirq6ycrquPq72dq66xo6qfsa2zrq61sbm3qq2vsqi2r7O6vMmzqrW1sbSwr6ehs5+aqKygpZWWmpmxoq2gpa+WoqSZmZKMoqWnsqmhprGrqbSlrq+zrqOZnq2nm5eempmsuKKYk5GPmJyhmZiVrqGfloKVmY6enZqXkYqUk56apaOjoJmXk5KWe4yRhXuNi4OLk2xueW92fWJGYGpaSUhaWz17SkdFNkFjVGlbTVxhS1xcWlJSUmJhTEtFYGFhUU1JUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4rQS9KR1BbRzNjWFRMRZqWn7CosamspKOurbWot7O3o6y0t8m7tbu7wL61tLfDwMzHvMO9t7+/wbjAvbK9rqi6ubi3wresrrG6lpenrqyopLKplK+7pKyysqano7K0sbKxtbC3s6murLKnuK+1s8TFtqm1tauwrqqno7afn6awoKOUm5mUsJ6nm5+pjaminZuVl6WlpLenorCzq6ewp62vtKykmKGsqJycnZyUqrmclY+PjJidopiRmaikoZiFlJeRnZyYl5eJl5CXm6idpaGSlpKQlneEkYZ8hoKEjY1ucXh2fIBdTGVsXEtPZF0/YntHSThHaFdlW01eYk1ZWVdVWFVqXU9QSGFeX1BLR1FWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZzI3J0ZhTFYlLUIuPUVMUTwzcmpMRUSRmaStpKytqqaisLGyqrewtZ+rtbnJua7BvMO4s7K1wsPOxMDCvrW+wMC7v720xKmqubG2t8C8r6y0tJ6hp7GupaaxpZ6ytayqsrCrqKi1uqy1srWrtK2qq6msqbmtsrDHv7ilubCpra2mqK2xpaSjrqOonJ2bmq+ZoqKio5Csn6Ogn6GppqW4pKu0tKSqq6msrrWuopyjqKucoJmbkqS1mo+JjoiRo6GWj5afo5eVhpCVlJ6bmZeViJiTlZmnnKCgjZOSjpF4fo+FfXx9h4qKcnRzf35+XVNjbl5OWmddRkSWW0c6TW5YYVtOYWJOVlZWV1VZaF5RU01jWltUS0ZPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozRGQ7NipIZEhKKzpJPzNDSVMsPo9rQEhJkJqoqaGpsKSno7OzsLS1sLCgq629zLuuwr3HsrSutMLD0cTFv8KzvsLDvL+4vcWorbestLi8wLGssq2ipKeuqqilsaOqsaquqrGurqyrs7unt7CyqbKqq6alpK66rKqwwrm0rLmpqaitqaexpamkoq6pqKKenKKslaWdmJ6ZrJ2hp6ihrKajray2sLGgqaKgqq2wrJ2ep6epmqOYmZCgqJiGhI+Li5+hkI2PmJ6SkoiIkpahnZaZloeXk5OXpZ2enYySkI6Kf3+IhXx3f4eFh3V0col3bF9ZX25iUXNxXEs7hHxGPld1V2FZT2NcTlVWVVdRXGJfU09PaFhYV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mzk4OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSzAuSmdERjg8QjA1RUtYMUCUXUBORpWWrKegqbGcp6iwtay4ta2qpKqqvcm8sb+5w6+wrbPEw83Ow7/As8DDxLrBtMnErK+3rrO6wL60rq6sp6mqsammqbGmtK2qr62tsa6yrbS7pbezrKyuqKugo56xt6uqrbm2pLW1pKqnrKyqraCopqexsaSnpaGhrJaqoZOboKaeo6Kqo6yinqaxtqysoqWimqmqrqmcoaWkpJmgmZaPmJ2TgYKQiYWdoI2LkI6ckZONhY6ZpZuTkpuMk5KRlKOanJqLj4uMfIaCgoF6dYGDgX51d4uih3hqXl9uZldlh2ROQGeSTEVieldiWFJmVU1WVlVUT1xdYVZMT2pYVlZISkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREh0JJSUSWkK6koaqvmKiorbWqtbGqpauqqb3AwLi6tLy1prOvxMnL0r/Bu7i/v8O6wrrBxK6xtbK0vMG+s7Gvraytp7eqpa2wq7iup7CvrrGrtaq2tae0t6uspKqqnKSetLOoqKSztJ+1raGqqKuoq6efq6uoubapqqqqoqmfrZuRqqGdoKSipqKqnpymtK6npamio5ikpqeqnKKko6CZmJ+Rjo+ZjX+HjIeEnp6JhoyMkZGTj4WIlqOajo6bkpKQj5KfmJmXjYuEgHSHgn9+eHWDf3t4fn+InY9wcWZmcHdcYXSIak9dmFZIbXlVZFZTZFBNVVVVUU9YW2JWSVFqVVdUR09YVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTIzOzo3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDJAZj1OWD9DLD9MVF8vSWs3UkY7lYyvoKSqrJmpo62usrSvqqSvqai7v7zBsrC5raK2r8jHx9DAv726vMO+u8TCwL+usrOztr28wbGytKu0qaW1qaWts7K4rqGstLGvsbmrua6qrrerqp6qq6CjobWtqKGfr7KhtKqfqKeqoqqhoaytqL2uq66toaeon6yZj7CimKKgqKeep5uZqbCpop+soqGSoaKip5mZqaaYmJmdj4uHlYh9joaEhaSXhoOEjYeQkJKFhpahl4iRnZGTkI2RnZWYj4uGhnh0gX99dHh6gHt1dHtrgoekdmleZWuAdWeIi3xSVnBfS3hzVGRTUV9NTVNaZk5NV1llWUdTalJSPkJOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaDozOF89YWQ/RjFDUFtbK0hQO1lDM4+NsaCkpaqjpKKsprOysaiksKequL/BvbGpuqqnrbDJxsfQw77Avbm/wL3JvMK4sbC1srq8ucCztbysuayjtKamq7G1t7Glprm0rbS8r7ylra22q62cqa+kn6SsqqicnaqypLOomqunqaSonaKpp6m9q7Swrp2ppKCvnJqzopakm6Wkn6WamqiqpZ6aqaGbkZugpJ2ZlqmqkZmak5CLgo+FfpCDgIifj4eBf42IkpCQhYKVm5SGk6GNlJGLkZuTloeKf4Byenl9e2d2fHt1cXJ+aoZ5hYhkX2djcoV7bWd5XV5WQld7bVRiUFJZS0xOcHRdSVpbaFlGVmdPQz5LT0RDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOkbCYn5+ppKKhq6S2srGkqbCmrbnCvbexpLmsqaiwwsjIzMK3vb+1uMG6yLbDtbSztbK9ubq9tq65tr+sorOmqqqutLazqJu5u6ixvrK6oK60tqmrn62xo5ylqKmjnZulsKavoJ+qqaehqZujqKCtvKeusa6hqqKkrp6eraaYn5qhopufm5mjqqKamaOjlZaUoKGWm5amrIyfko+RjIKKgICPgXualY2KfYCMh5GQjYqFk5iRhpOjipKRh5CZkJSBiH16bH12eHhienpycHF0eGqCdWuCZ2NnYW5zjm1iam9fcEFdeWtWXk5RUUtJTVNZVk1cXmxXRVhhT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNSXT4jkZasmJ+Xp6Ohn6ejt6+toq+vqKy4w7u0rqC5r6uns7rHyse/uMK9r7S/t8S2w7KwurGywLa7vbequbi+qqS0pqipr624r6eXuLyjrb60tKGtuLWnpqiws6CepaWnoKWZnqynqJ6gqq+noKaXoqifsLifo7GvoauhrKScp6eompubn6KVnJyanammlpueqJGYkpmdk5mWoaqRm4qOkId9h36Cjnx8oY2NiXqEjYWLjo2FiZOajoiUn4mQlYKMl42RfIV8dHB8cXNzX3h4am9xcXBrgHNkemxnZWNhZoeAYFtyanJNToBpWFpNUUxLSFBSUEdNW19vVEVZWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXVs1KJWbpZiclayfnqGjoLarsKO0s6mpusW3s66huK2tq6+1xcfAt7/CubC1vbe/u76wrL6ws7+yvMK4qru6uKentKenqq+rsq+kl7u1pKu6ta+esbmvqaWnr7KcoaSgpKOglpuvpaGeoqivoaChkqOkorawoaaxq5+so66YnaqlqJ+Ymp2jk5qbmp2lqpqbm6WVlJeVnI6Tl6KpopGKi5CGeoR+hIt6j5eKjYd7g4iEiY2PhY+TmIyOlZmLj5Z+hpeMj3qBe3Bydm5vc154d2VsbGxraoVuZnJpamVoXWRzgWBba3ZpWkp/XltYT09LSEhSVUczOV1ebFBFWVVZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVF1oRC48MmRXLDKUoaGWlJuqnKOhoqG2qa2gu7elrL7FtLCvo7WvrKyutMPDvLO/urexs7m4uri6r67As7O4r7/At629urWlorKpp6mxqauwn5m/tKSntLWonrK8qailqa+smaKnnKSllJegsaSZnqSpqZyin5KkoKS4qaSnrqaepaGok6CpoqGhmZudn5GZm5afoaqbmpiglJGUl5qOk5OkqKSQiYqPhnqEe4SGfZ2NiouHe4KFh4iKkoWWkpKLkJWUjo2Ue4OYj4t3fnxsdHJsa3Nhd3VoaGpoZ3CGaGhpZGZpaWBqY2poW2Z7Y2BTdFRcW1JMSkZJT1NAISpoXmlMRFdVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnUCcynqKkkY6kp5mcnp2jtKynqrq2p6zDwbixrKO2rqetrrfAv7yywrawrrK2trm2tq2qvbOusrG8v7evu7uxpZ+1qaWks6aorZycwKqnpa+zqqy1u56pqquxpZieqp2mpJGYpayhmJ2kqaGboZuWn52ntaawqq6hoZ2eoZWgpqCioJqbmZuSmJ2TpZ2soZeWnZSTjZWXi4+Ym6mgkomKi4l5hXeBgoGdh4uDiX6AhYiHhpGEl5SPjo+RkZGMk3uDlY+Gc35+ZnlvamprZnRza2NnZGR2gWNlZmZlamlja3JbX1ldbGRhTmlYWmBWSkdIS01SWD45X2xoSENVVF1bSUlHRkEuPD85QTg5UkdANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKywwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNCaEglNZqjoI+MrKGWlqCWpLOxorK9tqGxxby7srGjt6yqram4vLu6rcCxrq6utq+zuLOpq7mxr66ztrq2r7i9rKaetKmfn6+iqK2bob+fsKOusa+3rrWera+traKZnaeppZ+Vmqeln5ikoqidmp+ak5yerK+muqiuoqGam56ZnqSapJ2XnpiblJifkqiVqqeak5qakoyVmY2UlJuqp46OioqPe4JzgYGKmIWHfImKhoaKjImShZWbk5KOj5GXjpB/gI2Og2+Bf2Z5bWdraWZwcmtcZ2NjdIFiZmdqbmxnampobl1sbHJwYFRjaWNmWUlGTE1PWFJRVWFlgFVBV1NZVEdJRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUExLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJjSRoZuNjq+dmJOhmqmxr5+5v7WgtMK7vrqxprevp62kt7i3t6y7rqyqq7eqs7euprK1sq6psLa2sLO1uqapn7WnnJ2ooKermqe9l6ykrrC2taytn7GtsKmim5yjq6iblJumo52aqaKklpqfm5CbpKqrqryfp6SgmJqZnaGPa6KWmZxwgpWao391kamnnpSUnpCImJqAloqikHmHlI2DbWl/d4NxbIaLhn2FjIdxXmNhZ4SYhWuKjZSSdHeLhH6DkIBnh4BndWhlV1xoc25NUGljZ3OFaF9lZm5tal1gYYqPg4RlTktEOUdUaF5KR1BQVVVMSFNhcHRlRltRVVBGSEVDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QUBAPTI4QEU9MSwsMDg9RzcwMS4qLiovNTY4LCMxJzIxNDoxNzVYgWwxNk9rW05cS1tmYj5HMVFkPSoui6SZhpWwm5qToJuqraqjvcWvqbfCt729raa3sKWqorezsrKwuayppqy0pq+0oqm3traop6y2sq60rbOhqZ+yqZ2ho5mkpZiruZOlpa+zt62upamuq6yloZ6coaemm5agpaSbm6emnZOenpePnaeppLawpKOinZaYl5ejiKGOkpqGoYeTnKB/pX+lqp6SkpqRiIRzeI2OhYihdoqNaZeIZn5zeKBviIeEfo99f6GgoJmAfYeec4aOdZuKbIeBg21pZWN6bHJhU4VtYmxpmHFYaXFwiFleaVtsbFuIcm56coVmhoRaX0dOP0dfTUVSVlZRUVJXVWddTVZIUlJPRkhHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcvKIqnl4Ocq52YmJ2fqqmnqr/Dr7G6vLbAv6qlt7CorKWytK6usrWpqKWwraW0sputtba1pqeosrCssqetnamgsKefo6KYn6GarLOTo6Wltr2mraerqqyopaGgmKCmo5mYpaKjmJykqJaTopuTkqOlpqG3pKSgo5iVk5eTnIivkJeUiamLlqGchbGAo6ydk5mdlHmC1KiAh5XBnMZ5eLGlt5dlgMCcv3mEhXqShHyQkJHKcpe7nMV6crWnupB7gG2WsauweWhsWLGubmVpvJK8bmd6b3KP2H5Ta2O2sn6BcpRzmqGqkFdPV2JPVk5GVVtYUVFTjV1XW1FBXERRTkVISTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjpCPD9BODpKPjUyKjIyQkUvLjMyLisvKC0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGMp5OBp6qfl5yepayyqbDCvbK1wLW2vsGrp7SsrKimrrOpr7WypqeltKWnuK2cs7K2q6Wkp7GtrLCmqp2mo6+ioJ+dlZmenK2rk52in7O6o6qpoq2upaGcmpqip5+XmqefnpeepqeRnKaZk52hpqKhsaOfn6OWlpKXkpmFr2tqio2qfmaDlYatZHCdnZSZppRxrqGkfni7fWyhkHaxX2q0W6WAZZyRYGeDe2d/anhrqWW+cWemi3WxanuxeHSSlGNubaduW4ShRWhmh5ZFdZxgfmd8pKeCWmCMq2iAlXh5aqc3Sq9cWFNsZFtLTlhfXFdWO06KT1dXL0lUU0pERkY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0wMy4zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzAbkKKVg62npZ6jpKqxt6y1vb+wtsSyt7rBpqmwqq6oqLCuo7C5rqOkrbKjqbinnrOzsKOloKmsr6uvpqeeo6GvmqGblpSWmpqrpJWaoZ+0s6KrnKOtraCemZagoqicmJ2jn5uZoaakj5yimZegn6qepqagmqChlpWRlpCahbWbtXiFqZm1mXaGs5u3fpOWlqmUfmuCpnuChoiTlJN3q2drsVyreo2GlHSJco+HgH+IkJd4goGLl4uDoI+EsHZ3n3FsbGx8i06kWEhiYpl+Y2imYHlydVOTh15RqW1jcX6HgGKcLlGhb1tTa2hgTEtbZFhcWkI+sntYWEEjTWhGQ0VBQEExOT44ODo4NDs5OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzMsPjgzMR8vMi1EMT08U31uMytYalxPWE1fZ1c3SjhhVTUwG5SglYizpqahr6mnsqypu7bCsLvBrbi3v6msra2tpayxqaCuu6qgp7Oso6u0o6aysqejop6nqrGnsKelnZ6erpWemZSUlJedrKGZmaSota+iqo+qqKqbnZWXoKWnmZ6do5+bn6Olo5WbnpeZnKKpm6aanJuioJeTkZKTnYPVk5m5cLDBfsWGfNaUm7t8mpWlj42djaR7joikg6WCeqx5j51Wr3qIfp9quVq5doaEfqaClHuXeqp4jZ2PerFujoR0kbyFb5RQr6fFilGgemNgqmJzcohtl4hgU7W0yIWAiXxjpDNCnXZdUGppY1BAWGdaZGFKSE1xUFxRT1lmWUNEP0U/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo7REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVA3MSWbopSYsqioprSqpbSppLy3wbC5v7G1tLqytKewr6KvsqWfrbWomqe4raKvsJ+ztLCgpJ6fpqmwqLSoo5qcnaqVmJeVlZOVoKmcmZanrbCpo5+PraOolp2Wm6Gln5ehoaKhmqGip5ueoJ6UmJqmoJunlZubn6GYkJKUkJ2Ism5otXGrh26OpnK0c3K2e5qXpIuPnY2if5Ghpn+xdoOR0tJ2XK57hX+kb5uqpmuHhX2tfZiZjnuxcZKejnizZZd0hJ5vnmeUUciLWsJcn3liX61gdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2VYQU9rYGxoUFZHSjk9VVJaV1hJQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFMNjIwop2SpbGto6u8raa0pqe2u7yyur62trS5uLKktLKgsLGinquvo5emuK2ksbCctLepoKWeoamksaesqaOZmpmnnZWTl5eQkaGmn5WTpaqwpqKWk62gppKUoJukpZ6UmqWnoZqjn62ZoJ6ekJWboZ2cpZWdlZqin5WYlZGahax7d6h2o42IhqlvrYqCp4OYmKGJkpqLon+TmomuhX+Cs1xys1KufYKCpH9x1314hX6PnYaamXavhoeRnId3tGGaZZqCgpVtklqwWEuadZh5ZmCtXnZ3iGiYiGxdr3eVno94bDV5yK6yX0JUb15nYEVQbGBwbVZWTS5mZWlTWVA7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Njw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSDo5OaCelaC5sJe0wq2os6ipsrq3s7e+ubextLq0pLeynrOsn5+oq56Up7WrqK+xqq2zo5upoJ+nobWmpqmimJ2UpKCTkpuXkZShpJqSkKatr6ahlZmqoKOPkaGYp6SglJqlqJ2cpJ6tnaGcn4yTnpqdoJeZm5aXoqCUl4+mnYapfX2leKGOjYKqcK2LgaeGlp+hiZeXiKOCkYiUqnyAi514b7FaqIKCiKB5dNh/doh0qIGOm4ySpHuUj5+Ee7JenWSgfoOVbZJdq1tak4CRf2hnqmRye4FrmIdzXqtaiaCOa29lT0pDoVxbTHRdYmdOW2FfcnNfS1c3SpuWWEhFPUdGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANS46PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MyPziinpqawauXtMKuq62ppbSwt7C1vrm5sbC0uai6s5+vpJ2kpqaek6mwqa+ptKuprqGYoKCmpKO5oqKroJabkaGflJOemZOXnp+QjIyosLCnnpebqKagjJKklqaqp5SYqaednqCiraShnqCMlKGYn5+RnZeclZ6hlZaNqpyPrm1ytHOpi3WKp3O0eHOzgJGko5Kcjomkh5B3uHCNe4uiamu2WqGFZZeXaaGip22UcrR0k5l+smqFkYetanWzYZ1mom+Hk2uXXa1gTaF8h5FSc6NseX9+b5iHcl2vVjycd2ZUb24uXKdPY1NrZWJtWmNdYXB7Y1RbUj49bnAzQ0JAP006ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4ppybnryhm7LArq2rrKe3qbevtb+0u6+utrWqwLWoqaGbpaOhnJGpqae1orKnramgl5ynn6SruJ2irJqVmY6jopWMnaCbmJyfkZOUqrawqJmVnKypl4yUpZejrKKRlquxo5+epquxmaGij5iilp+blZyWoZOdqZyUj6qZh9SSmrtzsMOAw4Z91ZabuHiIkJiMl4uMp4h6pLZ1fnd2woKasmCDunnAfHW4Y7WBjIepfZWBq6lxe390vIinoGmdYaaOr6F+jHWHqn2+b3O8dLKDdXiBim6aiHJujaR0vV53fVphebxrWlZcanleamFlZ2NteG9ZXFpDQEBzQENGKzVHIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPUU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaebnqK9oZeyw7Ctqqussae3r7bDsLiwrbmurcCwq6OinqOhnJuQqKOqsqS0payknpWaqpimrLicoq2XlJ+PpJ+SjJyinZedmpGWkq+5sqyWmKSop5SQlqSbo62ekaCoq5+an6ijtJ+ipI6nopSimpyXlaOYkK+fkpSpnoSQmLZ/j5GMt5V4gpOatXdta25zb3mQhY+KdJ/Bu72ae4GxqHGAc5G5g32HhoyHjXyKh42YfKS7ub2cdHm0o3R3l3Z0sHWZnmaHao21dHJxd7aMXn96fYlog3luemOLrHB1hX9YW6dqRWVaVGZgY15jUWdncGx1Q05RTUQ6Wk0/SjM7MCA4PjsuMz1BOTk/PTs8QzZCU1laWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JXOSpPXl09KzpWVSc+OzynnqGiwKWWtcO0rKuorKupuq6wxa2zsq22prO3q6mhoaWeoJ2Zk6qjrKmltaenn5uVoKOdq6S9pqGplpObkKGbkY+hp6GSnJeUmJSxtbetmZ6kpKKLkpKmm6Wqm5WppaWbmaGopaekqqCRrZ6XpJ6Xl5edno+vqJObpaGNan1pm6V3hnJ9mo50eWSHe72+wLpvk4Nylohhc2taXpuJYGOIj5VrYICWZG6ed2OWbICalZRlXmBicJmIaXKLfYaVZ2t/cnR4fX9iW3d0gWhQXG2DfXuLa1hreoJzSkpvhnBOdExFWF1nYUxbV2djX09bbXRpcVJRREVNO0dJPU0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NfVjQpUF9MKDM+W08nPzI+qaCoosKjm7W6tqOspa6np7WxrMirr7Kqs6K9sLGln6KnnaObmZmrpq6jpLSopZuXlKCapa2ovaeopJSTm5WfmZKXpKmokJ6RkJicsLK/rJynnqeiiZORqZqoo5qaq6CjmZqjp6yjoKuimrGblKeglpSdn52WsKSXoKeYm5CcnKGhl6ShmZyZmZmPlYFnbX1xd5KYlJKGjLarjYaYlY6KjJiWh5SVi4STlJKJjpOUmJSYlpmfoZmak6CcjYJ6pYVta32QfYB1ioqBcYJ4eXZ1iX98impzgXSDdWV3fXdrb3ptX2RdcGhNWVpmamBXWm94bW1mVVBGUzlPWk1STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxKLDwtQLOhs6LAoaSysragqaWyp6WwtKrIqqyvpbSlwKezoJ2kpJyjlZWfqqasoqO2q5+YlpWfl62ppcCeq6OUkZuXnZeSlKGenqKnk5KZqKeyxLCbq52rn5CWlqidqpycn6yYoZucoqSvp6Klp5+umJennZmZoJ6dnK+gnKGllJaRl5Oen5ShnZegjpaTioqNjpeukHyWnIOSgourqYWAmZeJhJCeiHqEkIiGmpKIh4qWj5uXjZCXnaOVmJKQnI1/jmehs6+FioV2e5KKfXd5em9meY+BgIlqdYF5iHNpc397doOHgmp1ZHpmYGplY2Rma1lse29pa11TTFBEXlRGQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2JjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVFxRMDVOWzE3RTRbRzU8LEC0oLmwv6ysr7KxoKqmsq2irLOvxK+pqqKxrbuis5ufpqKhnJiXp6WppaSlsrWelJOdmZmvpa2+oKuikJGdmZmUkZWhnJeonISfq6yjtMi0oKqkq5eWl5qmnambn6SrlJ6fnaCqr6mlo6uir5ufoKCYpJ6cnpyuo5iep5KWlZuRo5eWp5yalmWCknxlfo2akGN5jm1oa3uSpatqZZuYfWeGimVlaWh7jqKPbGiNmJGjd2tqipiinpdza216hI6IelhmXoaDXm2MioF2XGhzd3aRgIiCbXeBeH9zbXmEdHaJiI+DfGqHWV5sdGRec4lpa3xwa2RfUk5YSWRYQUo0PkY3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8yWUM7Py49pqC6vbqvrLSxqqWora6wpq2tsLywqKajra6wnquWn6OdoZmZpqqcraOlp6myrZ6Uo4+ir6W2uaWuoo6OmqGZk5KaoJmZpZV8pq6jqLTEuKWip6+fnZWeop6jnKOpqJKfoZ2hqrCrq6SqoKqbp5+noKyWoJulr6OWm6mUn5uZkaOVnKmXnX29g4hytHKEnYataHi5xLhxlKOjeqaZmXKrgnzLwMC7cYyjiIOefJeZiZ3AvYGWnZ2MnMHBfIJ8k42aw8B9bKWyb4yBb8p6f5t2kIOOgXV5gIB5cXp/h3B3hYyTeW14lGNnYHhkYGWCYl5zZ2xkZFlMVklRWkhPRDJJRT9EQj4vPD8+QEE6OENDQkNFSElLTU5QU1ZZXl9fYV9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAuI0ZbM1BZL1ZBQjsvOJajucO1sLDAqaiUo6+osK6tprKzrqmkpaavqp6rmJqin5yaqqahnKuipKijpLSknKKSpa2rt7OnrqKRkJmcpZKRn6GYm6CdiKetpauuwMCxoamvqZaSn52imaKkqqOToKKdnq2vqq2no6OooaWlnayokaOaqKypmpynm6qflJajlJ+hlZt/zpR4eqSBeZWWm1+uj16OqIKjoXynlptzq4OAr15jjap7qIeFoHSXk4izY4KrhqCNjbNqhK91fZeIt2GDrVqjzW6Qdnvae3+ZcH2HknZ9ZXqHdnZrfIdufYaRkX5tg5Bgcm1waGBgemRccWdpZGdgUlRTV11LT0Q1QUhERDg+NjtAP0E7PTdAPj4/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1LMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaOqp62zq6ayq6uqoqumrqqfppuZpZecoq+foJ6op6KloJ+wq5qdlaaurLCqqKuflJGan6SSj56kl56no5+upqyxqL/Hs6ipsa6Wkp2coZefqaqflaGfnZ2usKmsqpyoqKWiq5KsspakoaqpnaKlpJ+un5GYpZeemZOTkZegcYWMl3WFqIZxsX2ecqx/op+BpY+edquCfa1/nHOtf6yHhp92mZJ7fJd+qoeijJKMnX6re4mUkJ+Ae61XncV7j3CTwX2BlW11b4xtZXZkhW5hd25yb4mKko+DbpKRZnB1dXFhZ21lX29paW9nZFhUXWFaUlNDOUlJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXFtaUkM+OzkyNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwoPjEpM1dARiEcRzpDMS4rsNPGxrK0oJ2jjqOioqyvtq6osaWoqaatq6umoaOdmaKVn6Wrn6Gln6ioop6dsKyXmpaop66rp6annpeUmaKhkpSgrZudp6SwraWttau6zbGtpq6rlpWcnaKZnq6snJegmp6fqbOrq6ubrKulo6yarrGhp6utpZekqaenr6CRlaKimJOQhKRqpHWJeql0erJwgqaKmYxxiaCbh6RgYFKrhX+ug5t2rYKohoWfe5mXhXpmgKOJpJmGgqN9qX6CloeuX3ypVp6jkoF6o5+Ae8OvxYtyr7OzuXFiqa/CdGiMjJiOgm6clXFvenh5cG1nZWVycGZ9amNdV2BqWFlVTU1RTENDQUI7Q0FAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYWFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjJQS0wjIEE5RDQsJ8PJ1tS/oZmrp6Cvop6wtLCuqayip6WoqquppKagm6SenaWnp6Ocq5mirKCjn6+hnJqSq6S1r66gp5qdlZOmopGboqigoKadsaamqbKtt8iytaqrqZaRnZyimaCls52aoZSdn6esraSwm62ro6OqobKtoamysKGZqKesrbOhkZShpZaZkHuqbJ6Eh3WreXywb4KljImflpaglYHSuLS4yYGBsl9glKmDpYiHoHqZlZp4qsl0maSVqKmRk5qNgZyKmsbGeWehgqV0gZ+Ogn2vXXC0YrB1S6OHbadHgpNkj5CekXxxmZWBcXx1fnxuXGZqc3FmgWtfYVlkblxfWUlNTUtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2osq2spaKcsrisqqGlmqekqauqpp+mppiqo5+uq52loKyanqmlnKe2nqKXk6mqtbKsm6WcoJSPpayRmpyno6Gqp66ipaeqsLXDsbOqrKiUipecpZuho66ll6GVmZympq2csZ6uqaefrKO2rKCxuK6dmq2msLGwopKWpqGYno2CnU54moF/n3qEo32DpIWHpp+dn5SEuHt7ebmCf8zGwrZ4m6GRi59+mpaXinafl4qlmKSpf7CFnYaghKx9mpVjpm2kcI+FkIF9loJyrGCjc3GAmmC8fVJVdI6So5Z7fpSTjXd7c4Z/cVxubnhyaoJvW2RgaW9jZF1LTFFUQUlIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVllZWltcX19eXV9fXVpaWlhVU09IQDg4Mi4sKi4rKicnP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eYqaukq7mqrp+boayys6WeoJWlra2uqqecpqebo6ihs66iqaayoJippJSjtqKilZeiqbS4o5uhnKKSj6GxmZ6cp6ahorCunaapo7azxbGtqaypkYeQnKidoqScpZeemZqapqWrm7Cir6WmmK+ku62htrWsnJyzsLavsKSWnK6eopyFj9G1w7d5h46FkZOQgKZ5lKF3jKCShKWBinGqhoW0bnJqmqSclYqffZiZhoePc6+CppyjjqaLk52LlpCbbnGyXaV0k3qcbJl/e5l8balho3Fxf59ic7K4aHePlKaYfY2OlY56fnmQg25qeWl6c2+BdV5lZW9uZmhgSltYWDxISEBVNEBGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dW1taWFVSUlFGOjIyMy8vKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZJyjIqtvr+8urSelqekrbWhopmUoqemrqqrmKajn6Whobano6insKOUq6OOpK2inZCamqqzs6ScpJyokZSWrp+fnqeknaidtpujq6S2rMSwqauooYyEjpyioKajlpmanZmcmaemp5mtqK+jpZuspr2slLyvrJ6hrrG3qbCkmaevoaaWeaiRfXywd4qApKWInG2ycKGHrXyhj4OolZiArImFrYWglaqgopeGn4GalYB7kn6rgJ2bloureJ2hkoqUkoF6r16kgX2mp2SdgHyXc2qvXaVrcIWZXWBbjKBtlZGmmYOWjpqOfHyEmYBrbn9jf3RugHpgaGZxb2loZ0NZYVs+S1UzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVJTU1ZaXV9hYGBhYV5dW1pYU1BPTkk3MDQyLiosQVRWVlZVVFVVVVVUVFVUVFRWV1dYVlVVUUhGSUojKCi9k5qDqMXCtsCznpqsoK23paOOm6SioLCvqp+loJ6tmZ65oaOroK+pma6hkKuoo5aJmpCusKymnqWbrJeXj6yhoZ2loJqlna6Yoqmnt6rBr6Spo56LgY6bmp+mnpKUmZuVm5qmpaabqqytpKWfqai+pJbCq6mhoKqwt6mrpJ6yraaol3WvfpCLnIWHfrqtipllsI1lla19oY+Ep5WagayKhLCFppqkoaKRhaFcbGqBs2B/rXt7g4GxbWdvmZmMiLFbfrVcpIRryKJkn4B7vFh2tFmyfVKugHqsWIChbpiPqJyMmJKamnx6kaB/ZHV/Y4Z4dYF9YmpncW5nZmVQVWRcQVVgPkkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5QUVJUV1peYGBgYGJeX1xbWFVQTkpGQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1ZXWFdXWFlaWltcWFdXR0I70p+ysbe9urPBsqKcrKaktamgipqgnpyzs6mfpKGetpmgtKiqrJ6vrZ2sm5Wvp6GOiJuOr6uopqGlma6SmI+pmaKdpJ6Zo6OlmaGjqrOqva+kp56dj36Lm5ahoJiPkZqckpqYqaCjmqmuqKamoqWou56fxaajp5+ps7OqrKOduquqq5SAqZKjr46bgIekl5mQgoC4w7qDjpyThKeXnIKsioKviKecm6arkX/WvcKqYqO/vX1+o4KD17q4tYWVk4Oevb6EbaOCb6uEbJx/erKwx4Npq7C9rHh3or68c4CWjqedkZySmqB7g5OefGN+e2WPZ3qDfGFsZmtrY1FhW1NqXEBVYkNOKT06NC8fHyQfJTIgHSQoMDQ5NjY3Nzs+QUNGR0lLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz89QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Owv7ixvLKinK6mpbKmnYuYpcCquLKoosCnqLOdn7Kduqifra+lp5SUsKuXjIObka6loqygo5yqoJeLo5KmnqabmqGpo5mgoqyuqrqtqKObl5N9iJmRppuSj5GYmY+YlKmboZmqqaGrp6CjqrqeqMOin62iqbKyqK2nnrilrKyZc3aqpbiGZImgcGiukYuRbm53pJCZn4F1rpmUcI+LcZWopJyYr6RzbW1sZot4b26CmXGBempxaWeKl5aYcWlphohncYZkXYhiam9ZXGZ9dqZfYXGOkW5lZH+Nk4+imZmak5mhfYmRmHdmiHhpj2x7gHplbWRnbWNLZFhKa1o6UWZFUidLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXV1dZXV5eXVxcXF1eXV5dW1tVV16plKyzqbm4srOqqaGunqOzqpiSv7PFyr+3qp/Bra6koqisn7qjpK6rraaOl66pj4uFlZatnqWpoJ2ko6CRi6WSp5momZejq6GXnaamqLC7q6yam5KSfISWjaWYjZGRmZWOmJaplqCZqqOcsaadoqu5n6/ApqOxpKuur6irqaW1oqy2lYqhqKa3nYmWo5mIqpuRlZ2SqbOZmqOqoLKWoqGdn6KcoaWilaynjZOTjIeTnJ2VkZmTmZGPlYWBpZuYlo6LlJSMkIeEfmeJfnSCdXOHinCnbHqTkJOSgIGNj5CPnZWil5qZpYSJl5B0apF3cox4eH16am1lZHBlVWBZQGpcSGRiUFkrRj0rJyE3NTAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFVXWV5gYWNdXlRRS0VDPjk9QEFTWFtcWVdYWFhYWFlYWFpaW1xeX19gXl5eX19gYGBfWVlgppaoqqS0tq6uobCjrZ+gtrGQjqzIvsa8uqujpp+dp5+xqaO2p52ptKaokZisoouHiY+cp5Wro5+Yp56ekpSjl6iap5mUpqKlkZunmaK2uqiqmJqPjHyBlIuhlIqVkZaRkJSYppCgm6qgnbajnaart6euwK2itaWura6qp6extp+supiRpaSmtqKSnqegjqqgjpOfo6uwmqCjsKiwl6OgnKOqnp6enJasnpOaopuUkJarmo6ZmZeRlp+RiKGelpWGko2RjpWLgX5li4V1hnV4h4JznGqFj5KTkIl9i5WSkpiUo5SfmaSFiZuKfXOXdHyMgHN8f2pvZV9xamBbYFpuZFFhZVFaOkdHRT4yPT45LyomKykmHSY0MTY2Njg6PT0/QUFDSUpHSktMTVNTVFVaYGBpYWVWUEtBQ0I6OUVNVlteXltaXFtbW1xdXV5fXV5fYGFiY2FhYWBiYmJkYlxbY5eVo6eir7GrrqOppqyfp7WqkI+dpbW9sK6to6SbfJ+ksqSlsamXm7mmo5OZqpyOhoqJnKOPrZ2ilaifoJKWmZuui6iVj6iaqo2ZqZCfubekpZmcjIh5gpSMm5OKlZKUkY2Sl6ONn5+pnp+4o3+Dr7Wirq50oruhsZ52d56or7iTdKujnomAq39kXGJ2oI+ln4SYfW2Ss5yjp62qo2Wen5JzeZqYcICYqZhtf6KoimWcpp2SmJiWjZKckIaem5GXhJKHj5CSiYV3ao6GdoZwe4V/f2Boh4mTkYtadZSQZ2iQj3N8qJycZnubioV5mWqGjIRveoBrcmVgd3Bsa2lcZmViYnFUWz5OTk5TRz5AVUQ6MS8eHyY0OjMwNjY3ODw7PkBBQUZIQkdGSUtNU1VVWV1gaGZnWFFKPERHPDhVUltgYWJgXl9fYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaajoK6vrKuppaitoqetpJKWq7axs6ebq6itmHSNn7GgqKunlJe5oKCPnKSdkX+JiJuejKuZopWnoZ2OlpKehXWtj4inm6qSmKWKnLu0p6CZmIuJdXeTjZaTipORkZSNkJShj5yhp5mcspWAjJu0nLKMko66pZ99p6F5oKy1f42NpZ6Di4aQsKqvjYuXpJt6gYushZydoaeop4eVhZh3pZt6iJyAl6eCgXucs3qKhqGYmpWYloKRl5eEm5lje4eQhY+QkouDbXCOh3mAcH+AhH6Fc4WDlJF4lmiSdKCadX2ZhKOgiZh/lY2GhZprj46HbHl8cnFoZXlwamxrXGVsa2Z1XV5JVExSQEU2LlpVVTcpITA5Pj43NDM1Njg7Oj0+PkBEST9JRUpMR1NYW1lcYmFoZlpRSDlFTDs+YVZeYmRmZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJein6asrauorKCnsKamqaWZlK/Iv7Gil6iqt5+RhZ6tnKeioI6Qvp6ajJ+aoJB8ho+Yl4esnKKWn6CRjJOJhYCSp42Ho56klZmfh5+6sqedm5KOhXF2kImVkIqUkI+bjJCSoJKYoaSWnquHn7SJtJmtisqHqayItoWMr4Guq4KojKaYjZ19qI9ze3ecj6eXaJWkebSMn56mp5KYwoF/q4iYoXKegJqlfZeFlbOBoX2hlKGQmJeBj5Sci5mSi32Fk4eNlpKJg21zj4V+eXGGgIN7g3SEgJaAj8Vmf6mHj6NrnoWknYSagY6QiYyacY+Uhml5dnx4aGl2cmhobF5kcG1nbllnR11STTNFNTdOYmQ3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TklKTENQWl1cV2FeaWxcUUU9S01ASmNYXWNmaGdiYmJiZGNgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSWop+vp6iopaufpLewqaummpSgo6SspZimrLmksIGiqZ2mnp2JlL2Zk42hkp6PeYSXlpGHq5mbm5mhhI6Md5qcj5+QiJ6lnJeamYejua2kmpyMjH5ibY+Lk5CNkI2NmIyRk6CPlaGhmaGnfqGnh62dn5atj52cnJCEf6CMqKyFo42pmYyaf6J1gZmUa4Ktdk2reIeNnJGaqKaAqat9g6F7eqdqnn+Sa2eXhpi3iZ5+bmBkWYOXgI18ZGiLcpl9eZZsXX2XbV9ScINcX2t4gl9YZIF8g3+XcKeqa4OjbnKlcJ+FoGpnoG1ccI5+Z1pghIFjWFFwd2ZudXNranBea3FubGpZaU9dWUY5QTVIRF9sNSxJRFJNTj04NDg1OTs2QDs7PkJQPlFSTE1CSlxdX1ddXmJ1YE1EOk1PTlRiXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlZ2guKCpo6askaG1u6quopmYoaKlra+hnrC2pKmToqGgp5yajpm0mZCLn4yVi3WBlJKMiqaVlZmenn6ShYWspIebkIqZqpmbm5KIprGnoZWaiImAaW6Ih4uOjoqLjZKMkZOjjZSfn5yipH+TgY+ioJOfdpyVj6eBn6V+haeqgqV4iXyEmn6icHOUiJZ8n415bYabjJmPm6iZjoede4Kic3amZp5+d6RfmHp9lHSibpi3tLp0k4iDgLWoZIHGuHtwlbaMcoCao2NzrKtgfGmds35tfIaBjYKLmHF/o2xyo3SfhYGkYZ2ZtJdzfZifs3V0XJ6yg2tjcHV3cmlwWWxtc3NnXWpeYkxFPUQ2UUJaczM9U0dgSlI9PDM5NTo5NkQ7O0BKUD9VTU9RQEVfX1taWGBgfGRIQzhNV1VXYmFaZWZra2JiZWFkZGBhYmBkZF9gY2tuY2NkZGhkYmdmY2hok5WUo7eYqpuTn42kt7StraCaop2ko6avnZyzr62UmaKaoaWZm5Wfq5uLiJJ4i4VxgJaNiZChj5KUnZh9kImNqKGHl46JkqSVnJuNjKmopZ6Pl4eEfmp7h359kI2Di5GRiZCUoYOXnqCdn56LiXecmKGMn3Ghioeph5qkjpWlqHytjH56oJl6o5N4gXSWiI2cfZafhpuOmJulhaJkoXyIlpCbjW2eaJuOb5qZeoCLp31yaXSrg5+DdKpolZpdm4V2hZ5nqmuAuGZcqHCBnGCVjF6ndnWHiH6eaJp1hpOSl46An2+akW6nml6pf3m7a36qXI6EXbRoXW5yenhsalxxa3l6ZGFnWGJCUkZPN1dDUm81TFtbX05aREEyNTE8OjdIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TlteWWRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcWBkZWVrZWNpaGdraZWbiam0mqeIY5Sbq7qxr6yeppycqaCfr5yesqmun5ilm6GgmZeXoKOZhomNaoiAcnuXiIuWloSRlZiQeoqElaScipSPhoyfk56diZGpo6CajJKKgIBpgYZ5f5eMe4mOjoiQl5t/lKKen6GTmHJon4mejotwkoyBqYaYnaGlnqV7sK2joriXd6Ozo6SAiZR5nXurmX6ijpyaloiXcaF8hY2vtX1rmpGheX6YtaKkq6iEmXybfZ6bf3SqWl1ve5aLeJ5iTH97eoVjeZdCTJ9Yompxe45sgIiEmXWbeIaJsbN/gJuTp3eDnm50fpVwmnRrpF6VdkhlZGF0cn9/b2ZhbGl3fGVlYlFfV11VV0BaRlFoRVRXXWJYXklEPUI4P0I6SUY4TEVYQVdSW1ZERmJcWmBLYG1+ckVCPFVfYlplaVZnaG1vYmZnXmFhXF1eYGhiX2VjdmxdZWdma2RlbGlpa2mTnICwrZmEU16gprO5srKpmqKMnKycnKqVoq2lo6mQoJ+em5qWmaGdloiHiXeGgW95lYWRm4t8kZOWiHKAiJGhm3OQkIGJmpahm4WPqpyblYuLinyDbISFcYKhjHiGjYiIk5mWfJOkoJ6iiK2GfbWEjZ2ce6WWeqmAlJqPiZ6ae6dod21+mXShc3J8noaZcJODrn2kg6WdmYCjb16pZ3WiY2+lYZzTkH17mXhzc2KihpB+o3SkkHZrj7OMYIKYiXOqsqi8f3eDbX6/pqm0XZttfHCWbX9yonJdpGdzpmBopm2b1Jp+hptwe3uYbJx8eJhzbqmkZ2FlenKAhWxoZmRvdnhoYWNTXGZRUmJIWUpVYVdUXGZrXGVRRkNLTUpLQktFOE9AUU5YU1lPU1FgZmZqUmN3eXdJRkVjXWVaaGpUaWhqb2NqZ2BjX11dXV9oYmFpZXxkXmRnZGtkamxmaGxol5p/r6pUXEt+qa+xs6+yo5uZhZmpoKKlj6apoZqri5uZmZSZk5KhmI6HhXtwfYRofY+DlZuAd5GOj4lvf4WOkpJsl5N8iZKUpZeDj6ublJKLhol5g3aIgG6Cn4Z3gJOGiJmjmHuUoqOZn4mzoaK2i3qsp6SupXCpgJmOhYCZj3qkgKGZhphynoSkrq+Kl4yAjaSNlYOtoJN2tba1yaFzlIuBn2Cel6lteZaHoJt0ooh3oH6Tl4uBcE1mo5Jwm4dzpXt5dGGDgWt+oGtxZF+ccX1zlmh5abO1tMamc5h9ep1rnJurdoWbbnd5mGqae3aYc1FFfbNfandseohna2hjdXZxb1dfVFlpUFNoSVdNWVRWXmlsb1ZoV05LQUpNS0hKT0FRS1BlY2ptZXRyc395fG51iXt7VFFPbF5pXGtpUmpoaWxnbGZjZV9cXV1eaWJkaWt7X11kZ2NqZm9tZWlsZaGbiK6lg2Q/k6Gyqq6vtaKikICXqqKjpo2mqJ+ep4SbmJeOl5CPnJOOiIN6anmHZYONf5igeXWPiYyBaYSFkYKMhZ2NeY2Ml6aUhJmqmI2Ri4GJeoB9i3hwkKGGeoGVh4mWoJZ/lKSmm5WVg2ZueJxsomR7caV3m5hwZqaAlIl6pHqfloOXc553gYqVl4+5bpGKomJ9mKCViG5yaaprdaBtb6Zgm2mLkGmWh5uWdaKBfppgjIaNdXCIYmigZZ5+aZt1b2NmiIFtcaJZXlpioWxdiItuen1zcmSlbXiiZGenaJlzjJlwonBViZBvoF9mqFWLXlSYbm50a3ODbnFpbHl0a3BSWVdXZlpUbUlaUF1JWGlpc2pZbFdRUkZWXExYU2FVaWtfd3R7fXB8fHKDe4Bzdo2AhHZeUnJiZ2NwZ1BqaGhrbG5oZGdfXV5dYGpiaml2dV1cY2hjampzbGZrbWOco5eleWRzbYumraOpsLGmn4uAmKudn6eNo6KcpKOBlpmUjpqQi5iQjop7h3GAiGmLi3yYm3N1iX6Qe2SDh5SJipWZgnyIh5iokoGjrZGGkIuCiX6AgI5yaZCmhH2Hk42ImaCPiJOppZyIpniVm36kiJaLsZidkIKvl5+kdZOFeKlzpY+Emm6kooyShI2Du259pa+Dh4WGk5Wcn3ylenKolaCWZ55+b6xkloqWk3eobaqigYl2iYN3q5GmiGuRsGt2s4ypa4qFbW2fnpGUX32ri6p2fn6LpZ52n3yDpJWdoGqbiHisaJ+ujLZ0d76NpJNag6eOq2F2c3VyfHVxY2t/b2htVFdbVmFiXWtNXVJeSl5tb3dgW3FZXGBbZ3Rlbm9yY3J0YHd6fnlyeYNzhH+Be3uMgYOAdmJ4ZGNucmRSa2dob2xyamZpYWBeXGFrYm1sem9cXGJpYmxqd21nbG5ilaSpnIF/naOWqamdqKaupJmKgpismp+mipymnquehY2bkIeckYWSjYyNdId7iIRvjYV+mJN0dIZzkoJtf4uRh4aTjn17goeZp4+Ap6ePgY6JhZR2goeSbmyLqYGDjJSOiZ2fiYyUqaKfjn90k5eIfoF5lK6if4GacY+Gd46Jgn17cqeMcn59epiWm4SQeXt/foeUlZOKdpCYnqCDe32Ja4yFW3l5cnpxaW5+kolxgHWBj5STcYeEgmWMf1+AgIt3dXOUdW95bm2HbIOGXnVnd45lf4CEjKiafXR7lWqJiHCBdn2Hd25uaI10enyYeIVcbFh5j2lveHNycHh4cF1sh29qaFdbYFddZmtkVmNVX1JgcHl5bWt3Zmtra3d9cnJ1dGFvdmJ0e4J4dXqCdYCAgIF5i4WDfXtuf2xkeW5eV25naHVreGppamVcYFpjamVtcXRuW1tibGRsbHluaGtvYY2Tt6imiaCimqajmKWcq6KhhISYrZKeooqbqJuqmIOCnIx/lpSHjoqJjXKDfI99fo+Ee5iPdHKEcZWFe32Si4aGj4R5foCIm6WPfKiijIaQkIWVgoaOmHZyhKmGjpKdkImfnoiMm6aen6qDiI2Vmn5+iZatp4+SpY93b5uOgXiQbn6ohXF+lXFrcH2CoI2Ak46LaGxcgouLm5qejnOVi4hxdGuCd3SBWXJuh5GBfn+Mal1qZXuGhImAYGl4ept7gouCdYGFgWd3ioZqYG9xgHVecYmAiI6mlIVli42DbneLhHGGj3pxaGlmfIR7lltda2hudlx8enh2b3Rzg2hdbotsbGNaWl9bWWxxXF9hWl9eZnR/fHZwdWRra2t8fXN8eXVlbnVobXx+d3p8e3l6gIB+b4WJhHt9dH55c39oVFxxaWx2cHVna2hkXWFYa2hra3FybldbZW5sZ3N5b2hqbGCLiqmwoY+ioZqenZeemKijon6Dma6OoJWJnaORppWAfJiGfZKZiYmGh4pzfoGMdoWLgoSXinJvgHKYhoN+koOEhomAeoGEjZyhkYOoooh5jpeIlIqLnJeEg3qtgpGYmpWKnp2HiKGpnqGho4qHk5uco5mVqqGnpp+SmoaUi3p2jY2Dp35/k5CSlJ2yppuVn5CNsZKXg6WMjJWan4mQm4KIkYprfI53eGWDhpGLfImehIeMkImJgYWEkHd8enSaoImGip2JhJN+fYqAf3RucoSBfXaFhYmOpZCChYyGgoyQjH2IjIqRhHpuhIV+eplrc2lhdItxfnt4d3B4dYJdXm+IaW9gX1pdXVNoclZkXV1ibWh2fH10b3Bla2ppf31ueYByanBxbGeBe3KCgHh/fX+Eem2CjIZ8enh7fXqDeE5jdmpzbnB6ZWtlY2JgW3RmcGdycW1VXWx0bWh5enFnaWtljIecuZ6WoaCYlJiZlJikoZ98f5qsj5+OhqCdjJ6WfXmVhHyOmYqGg4SHbnmBgXOBiH6JlIRta356l4eDg49+gIeEhXyHhY+cn5OIrKCEc4qQhpKRi52RfY17qoSOk5iWj5yXh4ebpJ6hmZyFgpKamZiPmaafpJybj5V/jod0eoaNhKV7fI6QkYaZq6KelJ2QjqmNkICdjIiTmZ6Cj5d+h46Db3iGcnVgf4SQhnSMmYGDj4OHhX+FhJVueXZ0kqKKjIWahISMc3+JfHtxcXqGgnp3iI2DkaaPhYOOgIOKiYp3homLjX5ybYCCfW9pbG5oXnqAaX59d3Z3dnt4XWBxfm51YGNbXV9SZ25VZlteYmtpdnp/cmxtZGtqaIF/bHSCbGx1cHpwhnluh4B2goB+hXZxgo2Ifnt8fH97gopgaHtqdWlpgmRqY2BpXGN1aG9idW1sVWNxeWVwentzZWptbYuJnraZoKOfkpGVmIuan5+fe3ifp5Gci4ellYyZmXp7jYZ9iZGEjIKCg258gHlzgYV+i5J9a2h9gpeJgYiNe32GhIZ8j4KQnZ2TiamdgXGLi4yShqChioWMfKiRiZCSl5OWk3iMop6fnZWYfoCQmpiSi5mioKOYlZCZfIuCd3+Cjoagf36MjI98mKWiopOakZCmjI+BmpCJkpabfpOSfoeOgXV0gnF3YX6BjoZxi5d9iYxyjH+ChYaPaHhyeIyYkY9/ln6IiXKBhnt7b3d6ioN5eI+LgpWkk4qFj3uGhoeEdoOEiYl9aHN+gXp8cm1saF9+dGl9dnZ0fXOBa19gdHZwd2RjWV9fUmtpVmZaYGFpanZ5gnJnbGRsaGaAgWtufmhvcWx/eYd6bIyBc4GBfoF0doKNhn98e3+BfX+PaXKDbnRpYYdobGJfcVZ0b2xtYHhobVdqdHZjdXp7cmJqb3qJjJ6xkaWknI6Pl4+GnKCbnnx3paGOmICNo4uJmpZ5fIaIf4OJf4mCgX9yf3t0doOFfouReGdjfYaXioKKi3h8gI2DeZaClpmYjpehm39wjIKRk4alm4eMiYOmloWTi5aXk5J2kZ2foJeTlnl+jpeXjZaanKOcl5GTmXeNg4F2g5aNnX6BiY2Mc5ejn6KUmY+PooyKgpaXg5KVmX6YjXyIjYF2cX5ue2SAfIuFcIeTgJGCbIiDgYCJhWZ1b3uFkZiLfJN4i4h7f4Z7enB9d4iFeIOPh4qXoZWBg4t2iISDgnd8g4qGeGF6en91gHlobWZif2preHR0d35yfWNkYXNudXJtYVphXlttZVNkWWFhaWt1eYZyY2tjbWZofYJsaXVobnBqgH2DeW2QhnKAg4N+dHyDjIF/fnqCg358kG12iXN1bWWKbGpiYnVWhGlwbmB4Z2xianZwZnl8enFgcmyGhY+brZemp56NjJeHhp+Tl5l+eKqdi5l6l52MjJmQeXyBjH58hHyBg4F4dHl6dH2AhICJi4BkX32LlId/hIZ0fH6Lf32YhpeVmI2kopiAc4d7k5GJpo+MjoqToJKEkpCUl5GLgY+XnpqRj5Byf42Rk4icnJ6ll5aLk5Vxi4uJa4SXj5l6h4iPiW+XnpuklJaLjJ6LhoGRnH+SkpWGmYh7ioqBeXJ6bHVsfH+Lfm2Fk4OVd3CDhH5+i4Blcml7f5aXg36NdJCHgniGfXR2fnyEgHuBi4KLk6OPeIOBdImHfYB0doKJhXFifHZ7cn5wY3BkZXxjb3B3c3l4dHVidmBwbHZub1xcYF5ea15RXlljYWludHuKbGBqZWtjaHeHbmdtaWttaYJ9e3dvkIhzgISEfXSBhol7g316gYR9fY5yeot4eG1sh2poX2lyY4dncW9ld2dubGF5aWt9e3hwYXhti4CYmKmfpKidioqShoqdi5WZfnivmY2XfZ+UkZeUiHd+fIp9fIB3eICAcHV0fG+GfYGBin98YVx+j5GGgIOCcnqAh3qPkomTkp2Tpp2Vgn2BfY6KkaOJjoqNmJqNhpKZlJaOioiMkZuSjoyMbYSQj5GInpmioJaUiJWPbIaXgmWEmI6TeomEkIpwlpuVo5STiYuZjIF/kJ59ko6SjJmOe4qFh3NzdmxxbnV8inRvh5GPk3F1gXyBgYh8ZXBseXyZk3yDiHSQiYBzh3huf3yAhXuEioaBi5SnjHqGe36LhXh+cXCBh4VmaXp1dnF8Y19xYWt0X3Fre3p5bHNxZXleb2xzbXJYW19gYmxbUFhZZWNocnJ/iGddamlnYmdxjW9kamhlaWmBend1b46FdIGCg3t1goiFeIV8eISFen+Jd3+Le3tyeINqa19waHSAa3JvbXJnb2xlfGNugHp2cWx3d4p+opehp6Cmm4eLi4GPnIeTnXaCq5WTjoehjZaUkIB0fHeFeHl/cnN7hmtzcHpui3aAgYdvcFtZfpGNh4B/f3V0gYCAoIeSi5SemKKVmHmKf4GNiJydio+GkpiWhYmVmpCXjIyNjYubiY2Pgm2Ji5CQiZyWoZuXlISWhmiCoYFlhJyJkH6Lg4uBd5OZk6CTkomJlI1+fY6Xe5GMj46aknyKgIJvdnBsbW9we4ZpdISPmYtxd4F1goiDeWZybnWAmY57h4R5k5B5dYdzb4h6hIp5ioSAho2bood7g3WCi394eW5sgYWDX3R1dHJyeVtfcWFwa19wa358cW5ua212YXBva3FtWVliYWJvWFFUW2ZnY3VwhYNjXWttZGJma5JuYGdnX2hrgXVyc3CLgHV/g4B5doCLgHiFf3iIhneDhXyGi397dop/anFjfGOGfG5xbXRqaG9sdnhfcX95fHR1dICDfqSVmq2ep5aFjYR/l5SDkKB2jKCUk4aLm42Wjot6cnl1gnByhXRxdohscG52bYh2g36AbW1VUYGqlIaCd392cYN6g6GDk4KVlJmdk5t4kXuDjJKjmZOOiZWZkoSHl5mMlIuJjo+GnIOPiXtyi4WKjoecmp+alJN+knxmg5qFZoWfh5GEkYKJcYORmJCcj5CNjI+Md3uRkHqOi4ySlox8iHyAa3dqbmtsbHt/YXp+j5eCd3uCeIOMfXlnc2xzhpWLfYeFepOPcXmDb3WLeYiKeYh7gIqOnZyEe3p2got8d3FqbIKEe2F5cW9uc3RWX3BicmJgbW96cWlwZmdzdWlybGJ3ZV1XZmFhc1RRT11nZV55cIl9YF1pcmJiZmaRal9oZVtncH5wbHF0in12fIaAdXZ+jHl7hYF4iINzhoV+jIyEfHmVeGZyaoNgiH5vb2t6YGpudH91X3R9eYd4dHOFfXigj5mxnKWOgot/g5qIgIyfgIualI+FiJiOj4+Ed3R3dIBxb4V0cHKEcGtpd26Dbn19bXRyUk2C38iS1pN7cHWEdoWhhJR4l5KZnZGZe5RzhZCeoZOUkYqTnJSGf5eWiI2Nh5GMh5t+jYB3eox+iYyKnJucmpOReIx0ZYaPhWuHooSRiJaDhmOMkZmPlouXjIyKinF6lIh7joiKk5GJeYV8f218ZXNva2x6eluBeZCQgXp+f4CGjnt7aXNqc4qPiYGFhHyUimt9fm1/in2KhXyEeICNk5mYiXx1d4OPeHJtZ3GAhW5sdXBpa3ZvU19wZXBaYG1zeWhsa2NneHJwcWRgeGFgVmxfX3dRTkxiZ2NdenKKdl5dZXZhYmVljmRhZ2JZaXNzbmtxdox8dHqGgnV2fYtzf4Z/e4l/comIgZGLiHx+mHZlc258ZYh+b3BsgFlsbnl5c2B2enuNdnJ3ind5noubrpqgkIKFd4iVfnyKnoiGoJKPhYyYhJOPh4F0eHB5cW+EcG1vf3NlZXlxfW15fWpna2OkmsHcrvChc2x2hXeGpIaTb5iSlqKWnIGScoaLopeIjpaLkJ2Wg4GWkIWJj4CQiYiVfYZ6dH+Jd4eEjpyamJiNjnWJdWyEh4l8iaKDkYmchIVei5OYi5CJj4uLhIlte5aBfYiFiZGPhnaFfX5rfWR4dmpueXNYiXuSiIV6foGBhox/eWZyaX+JjYmCgX6LlYRrgXVtho+BjoJ9gXh+jpSRl490cneHjHVzcWd2eoRjdW5xY2t4aFJhcmhsVmBvdXphcmRgaX1wc29bZHJhYlduW115T01MZWdiXnd0im5dXWR5Xl9lZYVgY2NfWWpza25rc3eMfXR3hIF4d3uJcYOEfX6Ie3SLiYiWhox/fpdzZ3VyeWyMe250cYFXcXp2eXJkd3mGjGl2gIlyf5yGmKebo5KEfXGMlHd5jJ6FhaGNj3yWjYCaiIR7c3dwdGpwgmxqbXx1X2F4d3txdXtnYGR869q1ycPch3NsdIJ3i5yKj2uakZCelpSBiXGFiJ+NhIuWi4yYlHyNk4iDiZB7j4uFjoB/dXiDhHKIgpOclpSXhIt1hn1ugoCHhpihgpOMnoOJYYOUj4eKhoqOh4GHaXyTf32DhImOjYJxhn5/cXdodnNqdHdsWo19k4OFfYCEgYSKgnZhcmuHgY6JgX5+kZB9bYFrd4WOhJCBe4B7fY+RjpSIbXB5jIV0a3Fsc3mCYXVqcF5teGFSZXNpZlNgcXd1YXBgXWiDcXRrWGhpY2lZbldcdk1LTGZnXmJzdIZrXFxleV5eZGd7YWRfXVlrb2ZvanR4in5zc4F+e3Z6iHSFg3x/h3Z3ioaPmYGMgnuTdWx3dnl4k3RueHt9WHmGcX9vZ3h3koJkdoaFcIqWhZmhmqKKiHRvkoxxd4+cfouaiYl9oH+EmoCBeHJ0bm9kcn9pZm14eFxgeXt7cXGAamFnYX/Vto6RpnhvcXh9cZSSjohrm5CKnZOMhntph4uZhoGSkYaHmI58jY2BgYmNe4+MfYiEenN6g3pwhoCWmo6Tk4CHdIKEdIF9iJCbnoaVj59+iGKAk4eFiYWLjYCAg2d8kIB+f4KMj5B+bYN8gnRsbXd1dHd2bGOOgY+AhX59hn+EiX9wX3FvhHuOi4F7fpCIeXCDZXmBiIWKgHqEfH6SjY+Rgm1ueYt+dW1ua2x7f2RpbGtab3haU2pzaWJRY3N4bWNmXlprhG50YlxoX2VtYG9VXHBPSE9nZlxob3GAbltcY3NgXGNsd2VlXV1abG1jbWpzd4Z/cnGAfH10eIZ4hYJ9gIh1eYmBk5V8iYZ2iIFweHl7hJNvbnuBd16DgHSBbWl6dJRzZ3OIfHGSkYOZn5ughoh2dpR/bXeUmH+IkISLjpp9jJp3fnZycGxqYXV9Z2JqdXpbYHh8emxwf2VjZ2dXnY9fcXOWvcWFd3KVi5GAdJmNh52UjYhza4iPlYB7lIuBhJuMfIqGfXyJjH6Th3SHhXZ2fYFxdYaBnpWGlI6BgXF+hnOCeYeVm5aGk42dgIhmfpODgYaEiolygX1nfYt7eX9/h4uPfWmAfIN2ZnB5eHN3dGxrj4aLgot/eYOBhISAa15wdnp9i4eEe4COf35ygGh4gYWJhIF3gnt/lYqOi3xta3qJfHZ0b2lofndlXXJkWXF1VFRvc2liTmh1eWdhXl1Zb4FwdFplY15rbmFxUFpsUkRUaGJabG9te3BaW15tY1pjb3dkZ1xdYGtqY2xpc3eBg3Jvfnt/dHWDeoOCfIKGdn6JgZaReIOKdIGIc3l5fo2Qb297gXFqgnl6fm5tfHaVa2p4hHRrk4yFnpigmYWIb36Mdmp5mY+AgoqClpiKeY+Wb3pzcWxqZGB0e2lgZnJ7W2FyfXpmcHphZWSOsbJ3S2JapdrSmHN8ko2Ren+XjIWako2Gb2yFkpF5eZOGgISZinyHgHl4iYqDlX9uiYZxc317anmGg6WRhJKMgn5ufYF0gXaDmZeSipOPlIWIcHuThH6Eg4mDb4F4aICFeHJ/f4OKh3xlfH6DdWNxc4BpeXFvdZmNhoSLfHd5gIR6gmtcb3xyf4eDiH2Fh3qIcYBtcIKFjIKCcYN3f5aKjIN3bWx+hH92emVoan5yYVp4W1pzb09YcnRnYEtud3ZiXlxbWXV+c3BYZ15ma3Jfb09YaVM/WWdfW3FrZ3lyXFtZbGVaY3B5X2hdXmVsaGZsaXJ4f4dwboB9gXZwgnuAgX+Df3aBhYmXinGCjXF7hnx6eYSUjHVren9scH51f31vcnx7k3BvgX95ZpKKgqGYnZGDhmeHhHBnepeKf4CFgpqKgXyNjWl4cmxsZl9hb3ltYGNveVxkbIN6YXF2X2Rl1eu+izM6PouPgHJ5hoqQjniGmY5/lI6Nf25thYyLdX2Pf4WClYl8g3hudoeEgpV2bYeEa3V7dWV5g4SnjIOOi4J8bH5ydIF4g5qPio+Rko2Mh397koh5gIWOg2yAcmmAf3htfHyBioN4YnmEgnJkcWl/bnVydYKcjIGAhn90dn6Ac4FwW2t8c3iIgYp7hn98iHd5cGuHg4+CiHCAd32TiYp9c21qdoCAdXVdaWl5cVpXflRbcmZNW3NyZlxKcnlxXVtbWl52gHZpWmJbaGZvY2pOWGdSPl5mXV52Zl91cVtZVW9kWmVxeVtoXmBnbWhqa2lweH6ObWqChIB5boF7fYF/gnp1goGMk4VwgItud32Ae3uIk4mAaXt9a3R8coZ7c3Z9fox6eIR+fGuMjISbnZaMgoFtjX5saX+Pjnx+f4OUgn99iohrdXFnaWNbY2dzb2BhbHRhaHCJemFzdF5iY5ugkG5dNluwtnVqgIl+lId4iJmHdZCMindwbYWChnR5iXiJfZOIen9zZ3aIfXyWbm+FfWh2eW5leomFpYeAhoyJfW19dH1/e4qXhoCTkJiJi4WKfJCKcXx+hnxpfm1rgHt5anp3goeBcmB3gn5yZHJndoNudXuGlZKCfYKAcHd6fHV/bVdtfXVziYCFdoZ0gol6d3JtiICOf4NxfXt8kIeHeW5taG2CgXVuXWhndXJSXH1PXXJdT1xzcGRWS3R5a1hZWVpicoF2YV5dYWdkaWpmT1ppTkFiZFxgd2FddW5YWFN1Yltlb3NYal9iaGtnbWxpcHd8k2xohIp9fHB/fnuBf4J6d4CAiYuEcnuHb3F3hH97iY2PhGp+e254eXaKd314f4GHf4R+fnpthIyImKONhYR8dot6a22FiZN6fXuCkoCAfoqEcHJwY2ZeWWdfcHBgYWhwZmpviXRhdG9bYGRqdnt/v52opcm4coWEdJV+eomVhHSSjodyc3CEeoJzdYZ0iHeUiXl5cWR3hnl/kmhxg3Vmd3ZkanyEiJ6Cf36OjXxxfXKCd36QjoJ2lY2UkIiCiHuJimx5eoB1aHtpbH95c2l6doCDfWhgd4h9a2p0aHuAanaBjZGVf3x+fnF8d3x0f2JVdXtxcoeCgXuBcIaJd3hvb4KCi318d3x6c4yEgHVocGdsiIFycF1oY3RvTGZ3TV9vVlRadG5iUU91eWJSWFhdYnGDdFxiXWllZWNrZFJccUlEZWJcZHFeXXhoVldWeF5cZm5pVmxeYWpnZW9uaHB3epNuaYiMeX1ze355goGCfHZ9g4iGg3B2g3Nud4KCfoiLlH9xgHx4enqBi3WDeH6AgYKEeoB1b32Ki5ueiH6Ge3eGfGh1h42Sen+AfImGhHaPgGdwbmBlXFhmWW1zYWFhcWxsaIluYHNpWF5jbYB3qdqpyIeIs3KKeXGPdn2JkYF7lIuAdXR1fnZ/b3B/bYV0lIZ4dWxgeYB4h41lcYJuZ3VuW219gZCTgIB4kpF8d3pshXN+j4qDcpWKkY+IhoZ7f4ZtdXd/bWh3ZW18dm1rd3d/f3xgYniGemh1dmN+e2h1ho+Oln11gHZygHt9bYBaVXF8b3OBhX1/d2uIhnN4anR/g4J8eXt3enGJf3tyZ3NkbYuEbHNbamB2Zklvb01cY1hXVnltYlBTdXdZUVZYXmFyhXBdYWNtZWNeb2NVXnNHQ2dgXmdpXVp7Y1JWXXZbW2dsYlZrYGBuZmZscGhwdniPdGuOjXZ/dnh9d4GDgXt0fYOIiINvcX91cXV9hYGJjYt7d394hHx9hYd4iHx9gX2EgHt+cnZ4i46fjIl7ind1g3pefoeajXqHhHSGh4V3iXtibm1cYltbYVVqdGRgW2hvcGeHcWFxZldcY2t/fMrOh7qia25vi25yhXN+hox/e5OFenl0enV0empsdmOEdpKCdm9nX3yAeIqHZHGAampxY1hte4aciYOBcpeTdn16bYZvf4iKhnCWjpCIhoyEe3l/cnJwfmdocmNueHFqbHJ4fXx5XWV6gHhpdXlngndodYeMjpV9c4dqb36AeG59XVdvfGxzfoh6gG5uin9wdmZ2f4B+gHV6b3lyhXp4cWVyYG2MgWtyWGtfeV1JcGxPWFZfVVZ8a2JPVHZzUlJUV15jdYZqXWFra2ZjWm9iWWNxSEFpXWFnX1xVe15PVmZxWltqaF1YaGFfcmZqaHFncXN2h3lulYp1f3t4fnmDh4B1c3+FhY6DcHB7eHd1eYaFh4yGenx/dYt/fYaDhId/fn59hn98eHZ5dpKUn36NfYtudYB6ZISImIZ0kopvhYaCeoN1Y25qWV9bXV1VaHNlYFlkcnJngXJha2RXWl9pf3i+rnugt25idIdpdX1ze4WIe36NgHd4c3dvenZlam9hh3WOgXNqYl59d3iKgmVwfWdra1tWb3iLpIGFf3CZknF/dnOAbH6Aj4ZylIiNiIWJhX15dXNwaXpham1hbXZqZ2treXd6d1tnfXx5ZnJ+boV0ZnWGjYaWgHCLZ2t7gnRtdWJbbXpqc3qJeoBldIZ8bXBndH53fX5wemp5eX94dm9kbGFsiX1sblZqYXhWTGxtUFNQaU5ZfWhiT1V2bE1RVFVfaHeEZ15hcWlnYVdpXV1sakpFbFtiZVdZVHlaTldva1ldbGVcWmVjXnRmbGVxZ3NwdIF4cJmFdn9/eH98hYd9dXOCh3+Vg25zeXt7c3KFhoiJhHmBfXaPf32FiY6EgYN6fouDe3d8d3aanZh6ioOHanZ+fW2FhZWBc4+CcYaCf4KAcGZsZ1ddW1xbU2VwZV9YY3J1aXZwZGViV1tbaH9wb3KAc4plZnp/anZ3dXWFhniChXp3dHZua3pwYWhrZ4Z0jYRuZ15ffG55iHxnbHdmamRWV3Nwjqd9hHt2lpB0e3F6eGx5eo+DdZd8iIaEh4R9dXFzbWh1XW1pYG11ZGdnaXpve3NZZ4F2dWhwgXiCdmJ3hYt9lYJvjGtte4FxZXNlYGp3ZnB1iHl8YXWDdmprcXR6cHl3cntlfX19dnVtY2VgbIZ8bWtWamNyVExrbFBNT3BHXnxmYU5WdWVLTlRYYWx4f2ZeZ3NqZWBXZFhjcl5MTGxYZGJVVFVzV01Zd2VaX2xhXFtkZV93Z21ib2p0b3F+dXSZgXh/gHiAfoaEen12goN+mIVucnR8e3VxhYWPgoF6i3V0kYB8gZWOgYWEfH6Mhnp+gXZ7o6aKeYmGhWx1fHx1hIONe2+GdHqFfYKDdW5qaWVWXVtbWlNjbmVcWWJ0e2pobWhgYVddWmmAaWtwgGhtYml7emt1dXVwh4J6gX53dm57aGp5al9lbmiBd5CEZ2VYYXZpfYZ5bmlvZmZdVVhvaI+od4F7fJCOeHRufW1xdHiNfneUdIaDgIaJdmp0d2hpb1xtZV5uc19nYmp4aHttW22Dc3Rqb4F+endhd4WFepGGc4hycHp/cmNxaFttdWRucYZ6d2FzgHBoanh0cWt3dnN1YoJ5fXV0b2NiYmx9fGtrVWliZ1RMbmlQSFJsRWF5ZmJOVHJeSk1VWmZteHtmX21xamRdVmBWcG9XSlRpWGdeWE5WbFRLXXpgXF9sXV1bYmVgemhsYW5wdm5vd3V6mH13gIF5gICHhnp5eoN9gZOEcXR0f3p2dIWIkH6BfZFsc5WBe4KfhX+HfYB+hoKAint1hKyff3qIiIRscoJ6doGAgnVviG99gHSKgGpvbmVkWF9aWlpVYmpnXFpfdYJpXm1sXGFWWltrgWVydH1qal5teHdodXhzb4d8fn56dnNsemhpd2ddZHNneneSgGNjVGRvZoGEdXZmaGlhV1ZZaGSQqG9/d3+Kjnpwbntmd215inp2jnGEfn+Ah25kd3RlaGldbGJecG9baF9tdWV6aF10gG5ya3F7f3Z1YnWGjHyJiIB/eHJ1fnRhcGxYcHFhbm+CenNjcYBsYW17cGpneXdzcGSEdHh4dG9jYGNtc31qbFRpXl9VTHVkUUhXYkdjd2ZiTFRxWUtMWFlpbHd7ZWVucmZjWlheWXdmVEldZFhpWVlJV2VRSWN5W15fbVteXWJkXn9pamBudHhtb252g5d5coGAfX+JjIZ+dXaGeIaMfXR1dYJ5enqCi419f4WJanSWgXuKnX1+hXmAe358holzcY+ujHx8h5B+ZnGIenR+fXdzcIZtfH5tkHpjcHBiZV1lVlpZV2Nma2BdXXSGaFlwbVteV1lbbHticXd2bWNcbnR1aHZ3cm+GeX+Bendvb3RlaHRlW2d1ZnZ2kXlfXVNlZWqBgXN8YWJpXFRYXmNkkKVpeXSChZB3bG14Zndse4N5dIdygXl9eYBpZndtYWdhX2tgXnVrWWZdb29iemVbd3xrbm9weHl0dWVzg5OAiYOJenZvcn1yYXhjWW5uYG9wf3pzZXGAZF9udmpjZnh6cmxtgXNxe3FwYV1kbW99ZWlUaFlaVU56YFJLWllIY3VkYUpVblVKTFpXam1ze2RsbHRjYVlaXGJ3XFRLZF5ZalRXSFlhTkhrd1lfYW5bW19iY12FaWhibnh5bW9qdoGQeW6DfoCCkoiEgXZ1iXSLhnRxdnaBd319foyPgX+TfnB4loN9mZJ5gIB4eX5/c4eEc3CZont7f4mWeWV1iHpzeXdsdHB/bHl8cJJzXnBvYWdibFRbWldpZG1mXFxyiWVTcm1bWVhXYGx2Y2p1ampfW250cm11dHVrh31/gXx3b25sZGlwY1trcmR0do5zXFdUZGBxfn5wgFxhY15TWmFcZJOfZXJxhYOQc2tpeGtubnl5enGAdn9ze3p7ZGZ2aF5jW2FoXF93aFdiX3BoYXdhW3x2ampybnh0dHRpcYKWhId/hXZzanB8bWZ3V1tpbGFvcX94c2VvflthcXFiX2lvfGtqcn1wb3ZqcGBaZGtte2FnVGdVWFNReF1TUFlSSGR0YmFHVmxRSVBaVmxsbHxlbW9yYVtaWFptcVhTUGdYV2pUVUZaXU9Jc3ZZYGNuY1hhYWFejGpjZW16eWxvaXZ5hntrhH2AhZl8goR5fYhtj4Zxb3Z6fXSCgn2Lj4ODl3R4gpSFgZ+JdYGAgXR/gnCHg3Zvopd0e4aMh3tmd4tvbnxwZ3hxe2xzdnONa150b2JnZmtTXlxWaGJsbFtccYxkTm9tXFZXVWZpc2hjdGVlXlpwdm9xdnZ6bIh9f32Id5BzY2Rrb2Fcbm1jc3iHa1pUVmJjd3t8b4RcY15jVFtgWmOXlWNucIKFiXJpZnhtZHJ1cXpreXR1b3t/dl9nc2RcX1diZFlidWVVYGFtZGFxXV1+b2hpc3F0cXV2bG2FlIOKfIVxcmdufG9xb1JaZWlkcHJ/dHNibXVVY3JrXF5uZHtka3V8cHFxaW1fWGNpanheZlVkVVdRVm9YUldUUEhlc2BiRlhrT0lZVVduaWV8aWx5a2JXXFZcdWVUU1dpUlpnVVRJW1pQTnl3W19lbWpaYmFeXo9uYmdsenZub2l2dn9+bYSAfoaXe3+HgYp/a5OIcmd0gHt2gIN+iY5/jJNzfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4KNjHd4bnqNYGV9cWd6dHltbXF3g2dkfG1jZ2doU2BfVWdgbG9cXm6OaE5qbGBVVlNvZ3NrZnhlZl5acnZuc3x5dG6Je4B3nHt6a2FlbG1eYG5qZXF5fmdaVlhfbHh6em6CXmFdaFZYYFhknIhia3CBhnx2a2l1a1t1cGp5aXVybm98gXNZa25gWV5WY2RZZXFjVF9iaWFibFpgfmtmbHR1b214dmxoho2AinuIbXFmcHtscWxhWF9nZm5yf3JyXmlsU2ZxZVZibWF4YW90enRpbmtqX1dgZmh1XGRWYlZUT1lnU09dT1BIZXBdY0daak5KYExZbWVgeGlvgGVgVV5UXnZcVVNhZ09eY1VUS11aUVp2dl1fZm1oWGNhW16OcWNoanhyc21ndnN5g3OCg3uIjn58ioiOem6QinRsc4J0f3+IhYeShJWPen2Mj4iRm4SAfI2Ecn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6OjY2NjY2NjY2NjY2NjY6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5KTk5KSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2NjY2NjY2NjY2NjY2NjY6Pjo6Ojo6MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJFtZmdnZ2dnfYWEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDRERERENHZGhnZ2dnZZCioKCgoKVeKi4uLi4rSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMkWdfYGBgX155g4KCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1NDlcYF9fX19dkaakpKSkqlYVHBwcHBg7g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn1+fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRjo2NjY2NjY+QkJCQkJCMh4eHh4eGiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFhoiJiImJiYmNj4+Pj4+PiIKDg4KDgoWKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7enx8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GSkpKSko2QkpGJh46KkJKTkYuPioqQiY+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjY2Njo6Ojo2MjIyMjIyNjo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCLhYeGi4qFiJCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkIiFhYWIh4WHj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQiIWIjYmEhomPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin58dnZ4fHx7fH19fX19fn5+fn5/fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhImIh4iDio+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp8enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+KjoqLjomOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enl6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx+f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomHgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYWEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f4B/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f3+AgIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f4CAf39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX1+fn5/f35+fX5+fn5+f39/fn9/gH9/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSUk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OTkpKSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZGSk5KTk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZKRkZKSk4iFk5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJKCgpKQkZGOdYaRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf35/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCPkIhwhZCPkHx1iJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+Pj5CQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6PjHNvio+KcniHj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fH5+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNd217j4JzeIaNjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4dzbm+Ee3V2gIWDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFlYWFdUUFFSU1JTTU1KSUZFSEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f35+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3dGJeZF9ha3FmaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/fn5+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhiXWpsXWZmZ2VjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSElKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWlpqd21ibnNqYVlZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NW2tybGFudXJmUVFTUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU5dY29rWWlzdXBTTU9QUFBPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRkJGSFViaGxvcG9tbFpMTE5NTk9NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0dHR3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIJvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUNGR0hNWmdoZ3JubmhmZGBeXlhMSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+SVpdW1xlbG5rb21tbGtpaGtkU0dFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4en19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4CAgICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7PUtcaW1ub2pvbWtqbG1mUUdFREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwc3R0c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgYJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oj1IY29zbW5sa2xpVUM+Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3RycXR4eHl9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTk9SmBzc3BoVD86Oz1AQUA9Ozs+PD08QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl6e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09Pjw6Qmx9akA6Oz49Pj9AQUA/P0FAQEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A7W25APkRFP0BBRF9kOz09Ozo9PkFBQD5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpHVnBwcXNzdHR1eXp7fHx+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojptd0k4Ozo9PkE7SGQ9PD08ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPTw9SUxGRXV2Tjc4ODo7Pj9XakE7PDw6Ojs+Pz89PTk6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3pKO1x/g396fHdXPD0/PT0+RWh0TDo9Pj89PEFTRD88OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wb3F0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUdyemtig4SDgoOAfV4+QENAQD1Kc3tZOj1BRUFAWWFHQz09QEREQUA/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkJDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV0d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARW90fYKCgYN+fYR2TUFDRUA/Pll7gF0/Q0VJSklqZlFNRUNHRkdFR0VFRURFQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXJDREVEQ1d1hoeHflhHSEpMTmlnW1tWTEhOTUhJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEZIRlFubnBxcnV2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEiWxBQVZ0h4mHh4eIg1dITE1WZWRiYGVgTl9JR0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklLS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIhFZshYeGhoaHiIiHfFBMTWNqaWhjZmhnX0BAQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERkdJSklKSEhIR0lJSUpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xLSlSBg4SEgoKFhoaEgoaFhISGhoaHh4aKdUlNbXVtamlpaWtJOjw+Ozo8QUFAPjw5OTg8PD07Pjs4Oz9BQkBBQ0NCQEFBRERCQ0ZISUhISExNS0dJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGAgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISklJZYWEhIR/gYKDgoODhIWFhoeIiIiIiYyPZlF1eHRtbW5vbEQ3ODk2NDc5Ozw6ODU2Nzc4OTc4NzU4ODs7Oz1AOzk5OT08Pjs8PUFDRUhKTUxMR0lHT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlohoSEgX6Bg4ODgoOEhomKjIyLi4mKi42KbXZ8hHFvcG9uSzI2ODczNTY4Ojg3NjU2NTY3Njc2Nzo2Nzg4OTo3NTc4OTc5Nzc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHZ5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANjc4OD06PUVDQmWFg4GAgoODg4ODhomLiomJioqKiouKi4uIcnN8cnFub25EMzY4ODU1NzY5OTc3Njc2NTo5Ojo6Ozc5ODk4NzY2OTo5ODg2ODY4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1dnp7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYODhISEhYaJioqIh4eIiIqKjIuKi42FbGhsb3l9Zj47Ozs8OTo7OTo7Ojo5Ozo5PT09Pjs7PDw6Pjs5Ozs8Ozw7OTo8ODo6Ojo5OTk8Pzw8QUJESUpNS0lLTFdvcnN1c3V4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4qMjY9/ZmxveX5eRUNCQUI+QENBQD49Pj5APz8/QD9APT0/Qj5AQT9APz1AQEA+P0E8Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnp7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQkFHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uLi4yNjY15cHJvdl1LTEhISEVGSEdFQ0FAQ0VEQ0FCQ0I/QERIRUNFQ0VEQUZFRkRFRkRAQj48QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDREZXhIKDhIWFhoaHiYmIh4aGhoeJiYqLjI2MjIyMjI18c3JwWExSTEtLSUpKSklGRERHSEdEREVGREJISUtHSEdGSEdFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENAPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT5CQkdHSVmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjY2NjY2MjYp5d3VvY1FOTE5LSktIS0dER0lJSUVGSUZGRUxMTUlKR0dISUpOTU9MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9/fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg4PDs7PTo+QD4/QENGSUlQX4GDhYWFhoaHiIiIiIiIh4eIiIiJioyNjYyMjYyMjoV5fHhyWU5NTkxKSUZKSUZLSUdLSklKR0dHS0xOTE1ISElKTVFOT05NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1RucHV3d3l6eHl6e3x8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AOTo8OD0+Oz1BPj9BREhKTFVxg4SEhIWFhoeIiIiIiIeGiIiIiIiJjIyLjIyMjIyMjHlyYl1bUFBNTElHREhKSE1MR0tPTEtKSkxNTE9QTkhJS0xPUVBQUU9PSkhKSkxKTEZHSEdGRkhGRUVCQUJCXG9yd3h5enl5eXp6e3x+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4qMjIyMjIyNf2BcV1dXVVFPTUxFRkdNUE9QV1VRUE9RU1JNU1RPTVNMUFNVVlJTUVBMSk1NTUxOR0dKRkZISkVERUVCRUNjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CQEJCR1ZORk5QUFRYe4aDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjI2PjIyLbl9bbWRIVVNTUks7O1NUU2B1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9NUlFQUFFLTEtISEpIRUZJSUlISWlydnl4eXh6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHR0ZFPz9BQUVBQ0dFREVMWFJNVFVWWFp8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfmGKi4uIcmFoWD1bWllUUj9AV1ZZXGRgVllicl1dV11aVkVRWVpbWV9UWWdSVlZYVVRWVE9PTUpMSklJTE1LT01Tb3N2eHl4eHp5ent6e3x9e35/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIaFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYuMfHJzW15dXFNVU1dXVVtadYNZVX2QYVxYXV9XSVZdXVtbX1lIWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeJioFuhomIh4SLgGlcXF1bVldVWFRSWFZjloBSZXJYWldfaFBgZltbWFxnYUdPWmhnXVtcXV1XUk9TUFBSVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn19fX9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FQUlJSVlNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIiIeIh4ORjomJiIaFiIiGfoB9YFRYW1ZUVlNSUk1QTUxmeltdVFlVVl1aTFRaVVNUXlpYV1dXemtYW1xcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fX19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrf35rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlVjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYmHhoOHh4d6b3NaTU5RUU1PTEpLRUZJRkM/VGRVf1JRUU5LUVRRTU9ZUk1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dXVzc3d6ent7fH17fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5cWVVQTElMSWFsknRQUVNOUVJRUltSU1JRUlVUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnZhXk9GQUVFRERDQUVRQ0VBQz5DSUdWQEhOTEddaVBIRk5GREVGSUdIQkRIR0lLR0RCQURAT1FNU2RydHZ1c3R1enx7e3t7fH19fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUU09WYGtscnZ7e3h5dHJuc3RzeXh+f4OAg4OCgIKAgoGCbE9JQkI8PD5AQUBAP2tRS2BFRkhJRUI/R0xOR01RVUlBRT8/PD08PT0/PT9BQ0NAPz09Qj5KTkdVbnV0dXN0dnh7fHt8fHx8fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGpqZmBbUVJaXFleSkpQUU5LTFFSUVRWVVdRUVdVUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlREJCQj47Q0NCQkRCXF1Pe05PT05LTE1PT1FMS01XTUhHQEE8OTc3NTk5PTs7Ozg6ODo/PEJIP1xzdHV1dXZ3eXx8fH18fH19fX58fn19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF9dWklIUFJRT01QUU5RUlRWWFNTWVRPWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIR0hIQ0JHSUZGRkRNUlBhV1NYUVBTU1JVW09PUVZQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEM+ZXNzdnd3eXl7fX18fHt8fX5+fnt+fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFZXXlpYTUtUVFNQUVVPTFJTVFdYVFRZUk1XWVpWWFhWWFldV1dYaHNrXVZhc2tiYV9eZGFfXllVUU5PT01JSEpMSklGQ1FQU1tXVFROUVNZU1xlVU9TVFJOS0lIQz9BOTk5ODk3ODg1NzU3ODU5OUdtcnR3eHl7e3x+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RWVVVVV1BTVVdUVVJdbl5STlpfW1ZZO0RWWFRbZkpMUFNST05NTk5OTEpGUVBVWVNUT0pOT1VTVFxWUlVTUk9NTElISEY/Pzw6Nzg3NjU5OTY3NjY1V3Bwc3d5ent8fX19fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwb2ZlZGNcXVJUWlZXVVRXVFJYWFlZWVNVT0pHT1BPT01SSlBQT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFNNSUxKT1JQUlJTVFFST0xNS0xMSENCQT06Ojg3NjtCNTU2Njpkb3F0d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaGlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpJR0VITEhLSEZMTVBNRy9FX1I+Mz8+am9hU1JRQEdUUVBRUFFOUU9RUExKTExPUE9OUFFRTlBPSkxNTUtHRUVEQjs9PTw5PUc2Njc3RG1wdHZ5e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hFRkhKTUxFR0NPUkM4RU5TXWdUUVNBR1VQT1FRUE1NT01LTEtMTk9PUUxPT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ0eHt6e318fHt5fHp6fn58e3V0dXJ2dnp7eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa25xbWltY0xPT01RU0xUVVRYV1VMTEtJPDk4Nzs+QD48PUFAQj0+RUhHQ0VGSUdKSkBGQUFARkhFSk9IUVJiXFFQUk9TT09QTE1PTkxNTU5PTltXS01RT0dJSENISkxMS0ZGRkU/QkM+PEJHP0I/QWRwdHZ6enp7fHt6end7d3l+fnx7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0Q9OTc3OT9CPjs/QkBAPkBESUVDR0dKR0lFQkI/Pj1DQkFHSURNT2JlUU1PTldLTE5LTE5NTUxMT05TZE5KTFJJSUlFQUhKTE1OSkdJR0JBQkA/RUZFSERLbm92eXl5e3t6e3p3dHh0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTU1KTVBNUE9ISkQ/QT05ODo6P0I/PEFCQUFERUdLRkNISEdHSENDP0I/P0BBPkRFQ0tOUlRMSklNVEZJSUpMSktMSUpNTU9QUlBKR0NLR0NCSUlMTU9OSUpJR0NDQ0RISk1MSVlybXd5eHp7enl8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUdLREdISEdKS0lKS0RGQj0+PTo5OjtAQj89QUJDQ0dGSUtKRElJRkdHQ0M7QUBCPkBAQkVDSU1QSEhLR0hLREhKTE1ISkxISUpMS01dUkhIRE5GQUNKSk1MUE1LTUpLRkdHSk5OUU5MYm1pdnZ3enl7en1ybWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktERkVHRUZGR0RHQkNAPjw9OTo6OkBDQD5BQ0RFSUVJSkxGSEhHRkZDQjtBQkM+QENEQ0RHTE5IS05IREhFSU1OTUdJTEdGR0lJTE5LSUdFTkhCRk1LTUxPTU1OTUtISElPUlJTTlJmZmZxb3N4dXt5fGxoam5la3Fsc3BmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSURGRkVDQ0NFQERCPj8+Ojs7PTo8PkNBPkFDRUZKRklITEhHR0dGRUNAPUREQj5BQ0NDREdISUdNUEpGRkdLTk9LRkhJRkVERUlKSEpJRkhPS0RJTEtPTU9OT09OSkpJTFJVVVJPV2RgYW1ncXJvcnl6Z2VoaGRpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxIRUVIQ0JBQkQ8QkE+QT06Oj0/Oz0+QEI+QEJER0pFSUZJSEdGR0VDQkFBRkZDQkJCREVER0dJRkxRTElPSkpNTElHSEVHRURDSUlIS0pHS1JNQk5OTFBOT09NTk9LS0tPVVdWVVNYX15caWFtaW5ocnNiZWZmZGhoZm5qZm1taGtrbXJpcXZ0c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3d2dHd1anN1bnV0c3FyamtzTUdIRkhCQkFERTxBQEBDPDg6PD45Pzw/QkBAQERGSEVIRkZIR0ZGRENFQ0RJRUNHRUJFR0VGR0dFSk1LSFFNSktISElFRkhIRUNJSUlLTUtPU05EUVJPUFFOT01OUE1MTVNXVlhYVVhdWl1kYGliamlna19lZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpbnlNSEdISEJCQkZFPD9CQkQ8Nzs9PTo+OkBCPj8/Q0VGREZERUhFREVDREVGR0pFRUpHQ0dIRkhHRUNGSkpHTktMS0hKTEZJSUtIRUtLTE1OT1JUT0hTVFNQUk9RTU5RTk1QV1pWWllWWl1aWGFgYWBeaGVjYGRmaGdqaGhpZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1d3V7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5ISEdJREJDSEU8QEVCRT04OT4+PTw8QUI8Pz5BQUZDRkNESURERUVGR0dHSUZHS0hESUhHSUdGREhLSUdLSE1LSktMSExLTUtJTUtPTk9SVVZPS1VWU1BTUVJMT1FQT1RZWllcWllbXl5dYGJeXGFja2JgZGZncoVoZ2lmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB0TElLSUtGQkVHRTxAR0NEQDo8P0A/Pj9CQTxAPkJBRkNFRUVJRUZFR0ZISEZISElLSkZKSEhLSEZGTElISEpHTExNTExJTUtNTU1PTFBQUVVWV09LVlZVU1JRUkxPUlJQVltbXV5bXF5eXmBgYWRdY2BlZmBlaGpkc3Nmamdna29ycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKS0xKTEdCRURFPEBGRERDOz8/QUBAQENBP0I/QUNIQ0ZGR0lGSkZHRElIR0lISkxISEpKSUxKRkpLSElLSkdLS01NSkpNTE5OTVBLT1BSVFhWTU5UVVRSUlFQTU5UU1JXW11eX11dYF9gYWFgYWNlYmRoYmRpamd2i2xqaWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZud0tNTExNR0NDQUQ8P0VFRUM9QUFDQkNDREFDREFBRUdDSEhJSEdKR0NISUdISkZJTUhJSk1LTkxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1BXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BEQkVEREZCQ0VHQ0NJRkNJSkpJSUtHREtKR0hKSUlMSEpKTkxPS0lMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGF2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RDRUVERkJGRkdERUtGRkpNTEtMTEdHTUlHSktIS0tJS0tOTE1MTExJTE1MW3NiZHBebG1VTU5mc11mZnFsbnRncGlfYVlubmJwcGJrampmb3F0ZXRub1xvdWdwTUpxeXZrYWBrZWVteGxrdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHN1dHFzc3R1dXV0d3h2dHRibXVrcHBscnJxektMSUhHRUQ/QUJAPkNGR0NGQ0ZFRkVEQ0hISERFS0hHTE5OTE1NRkpOSEpLSklMS0pKS0xNTk5NTUpNTU5bcm9vbnBwbGtNUFFsV01pYnRycGFtbnVcWWxQXG5tWnFta29teHh0c2lwXV9ya3FqVXV5eG9jXmtmYmdwb2pqb3BwcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHR0VFRUJCQj5AQEZIQ0dESUZFRUJGSUhIRUhMSkdNTU9MTU5HTE1JTEtJSk1JS0pKS09QT05MTE5OTFxoZHVdbHFXbE5QUW1UWWtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITEZJREVFQ0FCPUJBQ0ZESEdMSEVDQ0hLSUhGSkxMRk5MTFNSTEdMTEhOSklITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllya2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altedGN3eHJqbnpoYWFjZmJiaW10dXBzdXZzcXBwcW9xdHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9udHN2c0hLSElCRUVFQUE+RERCR0RISU1JRkNGSkxKR0ZLTkxGT0pLV1JLR0tKSk5JSEpMSUtKSEhLTU1NTUlLS0tTa2NbaV5faWNyclpfWWpuX2VlVWtfY1thYVFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXFwbnR5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW52cXF2dHdyR0dGSURFQ0ZBQEJGRURHQkhKTEhGQ0dLTElFRkpPTElQSUxbUUpFSEhLTUlISkpLS0lISUZLS0tMR0hLS0xNTUxKS01OVFtcVFBUTFBPTk9PVlFPTlFOT1FKSk9QUWRxaVRZV1xbXFZZW11YXVxcY2ZhYWViY2ZfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0RHRUVBRUNAREhERkdDSUtMSEZER0tMSUVHSVBLTE9LTFdMSUVFSElKSElLSU1KSEZHR0lISElFRkxJSkxPTUpQXFdeUFxbYF5NWFlTXFxiXk1YWk1YYVJLWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYWFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cnhyeHNxcnVydE9CQ0RMTUJEREJFSUVIR0ZLSktIRUZJSktGRUhIUEtNTUpNUklHRUFIRkpJS0xKTUpIRkRJRkRGR0VGS0hDSk5MTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5eXF5TWl5jXlpdYGNgWV9jW2BeW1RYV1leXWNiY2FjZWhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhoaFf3VxcHJyc3Z5eXp5eXh4eHZyeXZ4cnF4dnV2YVNKSk1JRUNCQ0dIRkhHSEtKSklERktLS0VGSUpOS05LSExOR0hFPkdHTElLTEtLS0lHREhEQ0RFQUZKRUFLTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVhVVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHh5eXl5f359eXV5dnZybnp3dnhZUUtGQ0dFQkVISUZHSEhGRklHSEdJS0lMRERLS05NTEtIS0pISUY/R0dOS0tLTUtLS0lGR0NEQERBSElDQEpLSFBdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXGRjYmRjZlhRVVRRW1daYF9dXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktKRkZGSEdHSUdGRklMSk5GREtKTU5KTElLSkhJRkJISFFNTEtPTUpLSUdHRUQ/RUNJSUNDSEdFVF1ZXlhfWV9bXVVYWE9dXVFLSlZeWF5bXVVZYFJRX19iYmBgYmJgY2JhZGRiWE9RUVFaUlpdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhIWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eIh4WDgHx4XFNLQ0FIRkRHTVJIQ1FKRUdISEVGS0lNUEVGSUpLTkxMSUtMSUlIREhLUU9NTVBMTEpLSElDREFFRElHQ0NIRkRXVUVcVF1TVl9YT1RVTlpaTUlKVGBhW19YXl5hXU9ZYVxgYF9iY2JdYWJXYF9UUE9PT1dRXFtbXFxeX2JmZmVsZW9vd3x7gHt9f4CEhISEhISFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZIRElSYlBDVl5JR0dIREZNS1BQRUlJSktOTEtLTEtJSkdFSk5RUU5PT01OTE1IS0FEQUNER0VDQ0ZHQk1IQktLT09OTEZNRkdJSkhHTExNT1BJTE9QT1NPTFBTUlVaWVdZWFhkV09TVFBQTk1OVFJaWFhaXVxgYWRlY2dja2xwc3J5eX97en+EhISFhISEhIKEgH57gYOBfXuFhIaGhoeHhYWFhISEgoGAfUtJRUVIRkdES01dTEdHWExHSEpIR01MUVFITEtLS05NVU5PSkpLR0dLUFNTTlBPTk5OTkhLRmBFRF9MRWdkRk5cSV5bcm1PTVVtWUxEUGBVa1dnSl1XVV5ETFFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqUlZVVFtcW2BgYWJhYmBmaGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElGR0ZIRUVLT1NJSkZgVEhJT0pJT01SUUtNTExPUlVST09JTE1HSE1RW1lPUFBOT09PSUpRf1FJfFlZcnRZUW1IcW5vYVZQcXFzUENrc21xc3BTb19ablhdVlxYVWtoVV1WY1pgWVtfVlZYf2p0dXVeX3ZeV2FbW2ZbX2BhYGFdYGFnbXBsYHB3dHiBgYKDhIJ/fX+Adnh6bHZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSkVITU5CRExMR0lLRVJWTEtOSUtSWFdRTU9PTFFUTk9RT0tLTkdNUFNbWlNRUk9QUFBKSFp4XVR4ZWhaU1VSdmd0bHBibmZqUXJPTXdtanJwc3Jxcm9vb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Jye3xvfnhugHJfYGBiYVpgX2drbmtibGZnbXd+gYCCfnt4d4B0dnppcn5uc3x+d3h7foCDeHyAdXx/fHxzc05LR2BdR0FFTU1ISkpHSlBPTU1KTlZeWVVMUVNOWFpNU1NSTkxPSFFSVFlXVlBUUFBQUUtIZ3hsY3hybVtLTlZ5cHVtdWJvdlBlZUpmdnFtd2+AamZ4d2lXclFoem1panp6fmx4en9vaG9ZdnZqdnVwgF9yZn1pbHh8b15fX2JhW11iZGdpamRnYmNkbGxwcHN0c3NzeXFyeGJsdWdxeXtzcnV5foFzdXpufH15eHJuTktTdU5DQkZQT0hKS0lLUE9PT01QWmBaWEtUV1BhXlJWUVlSTE9JU1RVWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmhxdW5teXB3bHZ0dHJsbl10fnprbXl8a3RsfGtwdnV4Xl9fYl5cX2RkaWdoZWVeYWJpaWlqa25va3FvbWpwYWNmY293eG9tcHN5fm5xcGt7enRyb21MTFtWSEdFR1JQSUxNSktQUVBQUFBXXFhVTVVZVWVYUlJZXlNMTklUVFdXWVdPU05OTlFJUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1pwenteYHpzY3JveHFoZH1pcnxeVUxsYHZ1a2l1e3ptfnhrfHBcXl5iW15hZGRnZWVlYlpjY2lra3JzcnZnbGloZGdhYWthZ3NybGdsbXJ8a21oa3t0bW1rbU9IS0tISkhIUVBMTk9MS1JSUk9TUldSVlRQV1pWVlRUVGFfUE5NS1RTVFFWVk5OTE1PUEtIUU5QVUxLTFNUVFNUUFZVUVFOUVFYWVJOUFVUWFhYW1tVUlNXW1dYWFpPU1VXWFhSXllXXlZUUFlSV1dXV1heWmdyXltbWVxdX2NaX2NjZGZkY2NiWmNiZ2ZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2dqdWpoZ2lsUUlLTExNS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVdPT0xNVlRRTlVTTk9NTFFQTEpSUUtRTUtMUFNVU1FSU1NJSExOT1FSUVBRVFZSWFdcV1NSUFJUVVZTWlFOU1JYVlRZVlVaVlRSVVNUVVdYVlxZXmBdXFpaXFxfY1tdYmNkZmRkZGFZYGFjYWJoaGltYmFkXl9jXVpkXGJtYV5mZWZtc2RpZ2prZWRjZmhQSktMT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYU1BQSk5XU1BOVVBOUU5MU1BNT1VTTlJOTU9RVVFVUVJUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdWVllbVFBUVVhVVVpVV1pWU1JXVlVXW1haX1xVWF5cXl1bXWBgXVtiYmNnZmVkYlhfYWJeYGdkZmVhXl9dXV5aWl9aX2dgXl1dY2hrYWdmaGZkYGJjYk9MTUxRUUxPVE9PU1FPUVtZV1dYW1lYWFZdamRWWFlaV1ZTU09KTlZUUE9VUFBQTk1SUlBSWFRRUU9NUFRWT1hSVFVVT05NUVNWVVRUUlRXVlpdXFpWVlFRVlhWW1tXUVRWVlZWWVRYWFZTUllXVlpeWV1fXlVeXF5gXFtfX19eWmJiZGhnZGRiWGFgYl5eZmNkYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUU9VXFpaV1tbXFlaW2RxbWhkX1tYVlVXUUxNVlNNTlJPUVJPTFFTUlVaVVNQUE1RWFdSV1NTU1hNT09RVFhWVVVTVVhYW15dW1tWUU5VVlVbXFdSU1dWV1hWVFlbVVRSWlhXXF5aXl9gVWFcYWFdYGJfXGBdY2FjZ2hkZmBZY2BhX19lZF9gYltaXFtcWVpZWFdcWlxbYF5fW15eYWBeYlxZYFtRTk9OVlFQVFFPVFRTUFdcXFxYXlxeV1xeanF3eYBjXFtVVVdQTU9WU05RUU9SVFFMUlRUWVtXVU9ST1NYV1RTVVJSWk9QUlJWW1ZXV1RWWlhcXVtbXVZTTVRVVVtcVlJVVlZYWVNVWlxVU1NdWFpdXlxgYGBWYVtjYl1hZF5cYmFjX2NmaWRmXltkYGFgYGNlX2JeWVpeW1xbWVhZVldaWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVUUlFXUlRQW15eXVtgXGBVXF1oanJ9c2xnXFRXV1FPUlpTUlFUUlRVVEtSV1ZbWVpTT1NRVlZXVE9XUlNaUlRUVFhdV1hZU1hcWF5dWVpdVFVOVVZXXltYUlVVWVlZVVdaXFZTV15aXV1gXWJiXVlfW2VhX2RkXl5jY2FeZWZpZGZeXWRhYGFhYmRgYl5YWl9bXFtYWFhXV1tZW2BcW1tcW1haW15WXlldUU9PUlpQWlRVVlZUVFReXmBeXmJcYFVdXmJreXRsfWtaVVlUUFBTXFRVVFVUVllXTFJbV11bXVJPVVNYV1dUUFhSU1dTVlVVW11YW1pVWl5YX15ZXFlRV1JZWVlfW1pUVVZaWVpXWFpdV1VbXl1eYGFfZGNcXl1dZWFhZmReXmRjYFxnZGhlZGJfZGFgYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TTlBWWVFdVVZZV1dVWF9fYWFgY11fVF1fYmVldYF6aFdZWVNVU1ZcWFdXVlZXXVhPVV1aXl1cVFJYU1dXVVNUWFJTVlRYV1hdXlhdW1ZdX1hfX1hcVlFYVFlaWmFaXFZXWFtaW1lZWltZV15fYF9jYmFkZFxiXGBmYWRmZF5fZGJiW2ZjaGVjZmBmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOU1lWU1xUVldZVlZcYGFiY2BjXl9WW2BkYV96dW9oWVtZVVdUV1taWlxZWFlgV1BVXlxgYFxUVFhQVVdWVFZXUlNVV1paW19eWl9cVl9fWl1eWV1VUllXWVldYlpeV1hbXFtcW1taXFpaX19gYGRiY2RkYmRZYWZjZmZlXmFiYGNeYmNpZGNnX2deYWFjYWFgXl9YVFtaWltbWFtYWFxbWltYV1lYV1xbW2BdVl1dU09WWVZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5bXFpWV1hZXFxdX1tZW2JWVFheXWFjXFJWWVBXV1dXV1ZTVVRYXFxeYGBdYFxXYV5bXltaXlhVWFdbW19gXF9YWVxcXV5fXFtdWVtgYV5gZWNkZWVmYlhjZWRoZ2ReY2BgZWNcZWlkZWlfZl1jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldZWFtcWFdZXmBiYWRhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1laWF1gY2RfUlhZUFdXWFlZV1ZXVlxdXmBhYF9iXllhXV1eWVxeWVhVV1tcYF5dX1paXl1eXmFdXFtaXGBiX2JlY2VmZWZiWmRmZmlnYl9jXmFmZFpoaGJmaWNlXmJiY2FgYF9dXVpYW1lZWFhaWFdaW1pZV1hVVVtdXV1gYGJieEtYV1tZVlxbXF1aV1xdX2BiZGFiYV1gWGJjYmFjYWJdW1xbWFdbXF9dYF9dW2BkXVxYW2JlY2FSXFpPWVhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl1ZWVRYXV1fYF9gXFteXmBiY11cWFxeYGJiY2VkZmRlZmRcZWZnaWZjYWJbY2dgXGloYmhpZWRgYmFjYV9gX1xdXFlcWVhXWFlYV1xaWldXWE9YWl1hY2Zmcmt/SllXXFpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGJiYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF5eXllYVVtfXl1hYmBeW2BhYmZjX11UXWBhY2RkZmVnZWZmZV5lZmhoZ2RkYFplZ15hZ2hjaGhmY2BiYWNiX19fXF1bWltZWFhYVlpWXFtaVlZWTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhIKCgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoKCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnV1dXV1dXV2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t6enp6enp6e3x8fHx8fHt7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dXR1dXV1dHV2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7enp6enp6enp8fX19fXx8fHt8fHt7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHjF1NLS0tLUk3t9fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYiQzNPS0tLT2FolKysrKiVjko2NjIyNiX9/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19eNXn5OTk5OeZe39/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMipTd5uTk5eXrVBMbGxsbFF2WkZCQj5GMf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12fn9/f39/f3l3d3d3d3d4eXl5eXl7eHBvb29wcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYSFhISEg4R4c3Nzc3NzeX18fH19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ0dHR0dHd0dnd6e3h7eHd2d3p4enp5fnl4eHl4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7eXl5eXl5eXx9fX19fX18e3t7fHx8fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3Z5fXx9ent+e3d3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomNjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3dnp9fXx9fH58d3h4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDhISCgoKCgYGCgoKCgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd2e318eXt9fnx4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enl6fXt8fXx+e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh7eHp7eXx4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoKBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYWEg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eXl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KBgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm94eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDg4GBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t7fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx9fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgYCAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGBgYGCgoKCgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3Nzc3JycXBvb29vcHFzc3NycnJyc3R0dHNxcXFyc3R0dHR0dHRzc3Rzc3N0dHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3NycXFxcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Nzc3JxcXBwb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubm5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgoGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnNzc3JycXFwcHBwb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJxcnFxcXFxcXFxcHBwcHBxb29ubm5tbW5ubm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgIGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFxc3FycnFxb3yCb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoGBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFxcXCHhnBycXBzmIJucHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcX2hgnByb4uefG9wcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXJxdJ2hdnF3n5x9b3FxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcXBwcHFwcHFxcXFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJxmKiQb4KjnX5wcXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJzc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgYN5cnNzcnJyc3Jyc3Nzc3JzdHKTqaR5iKCdfHJzc3Nyc3N0dHV1dXV1dHV3eHd3d3d3eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/gH5+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fXx2dnd3dnV4enh4eHh4d3h5eZ+0qaSoqJd9e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt8e3uJr6ahtauso357enp4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX19fZillqKyoJmnk32Af319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af36AgH9/fn9/gICBgICBgIGBnJyOoLCgn6KfgICBgH5+f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/gICBgYCXmo6YsqGYlpyFfH5+foB+fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6MiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5/gIF+fp+rpJakm5uWoJ+Gf35+f4B/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgoODho2fsqiioJidnaaoraigmZGHgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpGPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4ODho2grbGmm5qgm56cnJ2hpKOdlIeDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OCg4uXmpeWmKCanZ2dmpqYkImGh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhISFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+PkJKRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYGGjpSTl5qcnJuUj4mHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6Tk5KOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhIODiJCTjpSYkoeDgoWFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKBgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZOSkI6QjpGRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGBgYKDgYKCgoGAh5uHi4eCg4KBgICAgIGAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiYeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgIB/g4iOgIGCg4OAf3+AgICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiYaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJloiEgoSCgn9/jJWCgoGChIOBgYCCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKRkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6Zi4OFhISEgoCRmYaCgoKEg4OChYKBhIWEg4ODgoODhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5OTkI2MioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBkIyDgX9+fXx9jJyOgIKBgYKChZSUjIGCgYKDgoWTg4GDhYODhIODg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSTk5KPjYyIg4SEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GWl4mAfX19fXuBmIyAg4GBgYCOlIyQgYKBgoKCkZSBgYODgoODg4KCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgZWfin5+gH2Hi36EhIOEgoODgo2JhYyCgoOCg4aWlZCMgoKDhISDg4ODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDhISEhIODgoKDkJSTkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yEfYaJgH6FhYWEhYJ/fX19gIOEg4SEi5mgqqibioSOiYOEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoaGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5ORko2KiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOJkYOEi4WCgYF+fYGHhoOAfn5/f39/f4OEhIWKk5igpaSbjZaHhYSFhYWEhYSGhYWFhYaGhoWGhYWGhYWGhoaHhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaFhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWCf39/f39/f36AgISEhpWXlZefn56dkoeIhoaFhoWFhoeHh4iGh4eGhoaHhoeGhoeHhoaGhYODhIWFhoSFhYaGh4eHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiIiFhoWDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/f4WMnJual5qcm5mOh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHh4eHhoeFg4OEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWFhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt6f5mXipSZmZiVlIyJiYmKi4qIiIiJiYuLioqIh4eIiIiHh4iIh4eGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJKQj5GOioaFhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKCgoKCgH9+fX19fX5+fHt8mpV/gZaYl5WTjYmJiImLiomJiImIioqJi4mGhoaGh4WGiIiIiIaGh4SDg4SHiIiIh4WCgoGDg4KDg4SCgYKDgoGEg4SDgY6TkpCPj4uJhYWGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fX5+fn5+fn1+fX2Bl4+MmJaYl5OJh4eHh4iHh4mGh4aIh4eJiYODhIOFhISFhYaIiIaFg4KCg4WHhoeGhoSCgoOEgoODhIKBgoGBgYODhIOEkZKQjo+Oi4eEhoaEgoGBgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCg4F9fH1/gH9+fn59fH1+fHqCmp+cmI2Ki4OEhIaFhYODhYSEhISEhIWEgoKCgYSEgYKDg4WGhYSCgoGCgoODhYSEhIWEhIaEg4SFg4KDgYKDg4SFhIeSkY+NkIyJhoSFhIWCgYGBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgICAgX9/gYSEg4ODgoKAfX1/gICBf31+fn18fX17enmHoJ6ajIeIgIKBgoKBf36BgYGCgYOBgoGCgoKBg4SAf4CAgYKCgICAgYCBgoGDgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGAgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn5+fX+ChIOCg4ODgX59fn+AgIGAfn19fX1+fXx6e3qPm5eWkol+gH9/gIB+fYB/f4CAgX+AgIF/f4CBgX59fX+AgX9/fn+AgH+AgICAf4CCgICCgYCDgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYGDhIGCgoOCg4SFgIB/fH19fn19fn+Af31/fn1+gIODgoKCgYF/fX1+f4CAgH9+fX19fHt7e3p6enuOl5WXhn5+f35+f35/gH9+f3+Af4CAf35+fn9/fn18fn+Af35+f3+Af39/f39/f4B/f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEhIKBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9+fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enp6eX+QkI+RkX9/fn9/f4CAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/f4B/fn5/f4CAfn6Af39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6enp6eYKNiY+Wh4GAgIGAf4F/gICAgYGCgoB+gH5/fn5/foGAgYB/f39/gICAf39/gYB+f3+Afn9/fn+Af31+fX17fIaTkYyLioeHioiGhoWEgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYKBg4ODhYSEhISEg4ODhIKBgoKCgH9+fX19fn6AfX19fX19fX19fHp6eXl5e4iJh4eIg4GCg4GAgoCCgYGDg4ODgYGBgIGAf4CBg4GEgoCAgYCBgYGAgYCCgX+BgIF/gIB/gICAfn9/fnx8iZSQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICAgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFhISFhIWGhoaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl5fIKChIWDgoSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgYKCgICBgIF/gIGAf36Ok4yHiIeIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYGBgYB/gH9/gICBgH+AgYB/fn19fX5+f36Ag4SHh4SGhoaFhoaHh4aHh4iHh4eGf32AgICCgX59fX19fX19fX19fX18fH5+fnx7eXh4eXl6foGCf4KLhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYODhIOCg4OCgoKCg4OCgpGQi4iJh4mHhoaEhoWEhISDgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgICAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eHh4eIhoeHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eXp8f4B9hpODg4OEhJSTgICBf39/fn6Ei4B/gYCEhpCJhYSCgoGFhYuDgYKFhYaGhISFhYOEhIODhIOEhYSIko+MiYiIiYeHh4WGhYSEhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx5enp6e32AgoGCgYOCgH59f397iJF8fI6Wf31/f4KGioWDg4SDgoONiX99f4OEhYWDhIaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4SDgYKCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenl6e3x5eX1+f4B/gX99e3x/fn2ClZF/hIh9fH5/goR8fIGChIN/f4eDfYKBgIKCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhIWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8f36Kgnt6e3p4ent7fH17fn5/f35+fn59fICBgH6Gj4F+fYJ+f36Agnx8gH+CgIGAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uUkIyMjo6NiIiHhYWFhIOCgoKCg4OCgoODgoGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhYaGhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx9fHl6e3t4eHl7e3p8goCBf4CBfX9/gH99gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJKNjI2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gIGAgIB/foB+f39/fn+Bfnx7fHx8fHx8fHx8fH19fHt9fHx8e3x8fHp6eXt8e32Fg4OAgYF+gH9/gH6FgoF+gH9+foCFhoKAfn6Dhn99fH5/gIGAf39+fX19fX57fH1/f3+AfX9+f4yRjo2Njo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KEhoaFf3+FgX5/gIB/gH5+f35/gIB/f4B/f319fHx9fn18fX19fX19fH18fXx7fXx8ent6fH19f4aFg4CAgH1+fX5/fouEgYd+fXx8fn6Cgn99fX19gXx7fXx+gYSDgYB+fn5+fXx+f4B9foB+f36Eko2NjI+Ni4qGhIWEhISDg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH19fX5+gYGCg4B6fn58fn6AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fXt8fHx7e3p9foCAg4OCf35/fHx8fXx9gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOBf4B+f4KCgn9/goJ/gIuQjY2MjYuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/f4B/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfX59fX17e319fHp8fH2BgoGAgIB9fX18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIKBgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e317f4GAf35/foB/f35/f35/gH9/f39/f39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5/fnx8fXx8fXx+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiYqJhYiRj42JioeFhYOCgoODhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fX+Af39/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4ODfX19fH18fX19fX1+fH18fXx9fX59fn19fX18e3t7fHt8fHt6e3t6enp7fn6DhYiHiIqLi4qJjJGQjoqJhoWEgoKCgoODg4OBgYGBgYGBgYGBgYKCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX59fX19fXx8fX19fXx9fX1+fX1+fnx7e3t8fH18e3p7e3l6eXh5e35/g4OEh4mKiImOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKBgICBg4KAf4F/fX6Afnx/f4mCf36CkYSEg4F/fn18jYd9fX59fXx/fnx9fXx9fX5+fX5/fH18e3x9fnx8e3x9enp5eXl5ent+foCBg4eEiI+Oi4uHhYSEg4KBgoKCgoGBgYGCgoKBgoKBgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoaFhIKBgYKBg4GAgIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB+fX18fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjouMiIWFhYSDgoKCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgIGDgX+AgYSBfn6Af31+gH59fn6AgH+Bfn+Af39/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8fHx9e3t7fHt8fH19fIqKiYmGhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoODhIOFhoOCgX9/gIKAf4CAg4B+foB/fX+AfX1+foCAf4J/gYCAgICBgH1/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fX58fXx8fHt8e3x+ioeHhYaIhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KCgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCgoKDhYOEg4KDhISEg4WEgYGAgH6Agn9+f36Bf35+f4B9foB9fX1+gH9/gYCBgICAgIGBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCIg4SEhYSEhISDgYKBgYKBgICCgoOBgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgYODg4OFhIWDg4OEg4OEhYOBgICAf4CBfn19fn9+fn5+gH19f3x9fX6Bf4CAgIKAgIGAg4KAf4B+gIF/gIGAgH9+fn1+fn1/fn6FhYGBgX+Ag4F/foGAf35/foB/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgoB+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf4B/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gICDgoGAf36AgH+AgYCBgH9/f39/f39/gIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x7e3p8e3yCgH+Cf3+BgIKCgYF/f3+CgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn1+e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWFhISChIOBg4GAgIF/f4B/gHx9fX6AfX5/f39+fX98fn5+gX+BgH9+f4B/gIODg4F/f4GBgIKBgYGAgIGAgICAgIGAgIKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fYB+f4B9f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WFgoSEhYSEg4GDgoGDgX+AgX5+gH6AfX19foB+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGBg4KBgX+Ag4B+goOEgICCgYKChIJ+e3t8fHx9fn1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z3dnN0hoSEhYWChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f319fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CAgICAgIKCgYCAfoCCf3+BgoOBgYOCg4OFg399fX18e3x8eXp7en55e3l4f357fHx+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GBgoGAgYF9gIB+gH1+fX5/gICAf39/f3x/gH+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4B/gH9/gYKBgH9+gIF+f4CCgoCBg4KEhYaEgH5+fHx8fHp5dnl5enl2eXZ+fHt7e359fH99gH59fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgYGDgn+Bf35/fn+AfX19fX6AgIB/f39/fIB/f4GAgYCAf3yAf35+foB/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn1/gX5+gIKBf4KDgoOEh4SAgH58fXx8e3x1eHl4eHh5d3t8e3t7f4V9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB8gH6AgH+BgIB/fYB+fn5/f359fX6AgYGAfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYCAgIB9fn5/gH18fnx/gIGAgICAgHx/f4B+f4GAf39+gX9+f39+fX18f4CAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3t8eXd7eXd4d3d4e3t6e3yFiX17end6fH19fHx9fX1/fnx9fn59fX18fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgoGBgoCCgICAgH5/fn9/fXx+foCBgoGAgIGBfX6Af35/gX+Af3+BgH9/f319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKBgYGCgYKBgYGAf4B/f399fX9+gICBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYR+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBko16fH18e315e3p6eHqBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt9fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCBgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKBgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7j393d3l8fHt9fHt8fHx9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eHN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgYCCgYKCgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoGAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHenh4eXx8fH17fHx9fH18fH19fn19fX5+f3+Af317fHx8fHx7enl7e3l5c3J1bnZycHhxdnaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoB/gICAgH+Cf36AgYCCf4CAgIB/gH+AgIB/fn2Af39/f4B/gH+AgH+AgYGAgICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9fHx9eHh1eHh5e3x8fXt7fHx8fX5/f39/fn19foB/f4GAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgoKDgICCgYSDg4SBgYOBgoKCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GAgYKAf4CBgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/gIB/gId+fnx7fXx7fX94d3Z5eXp7fHx8fHt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cnZ5hYWCg4KDg4KChISAgIOAhoODhIGChICEg4KCgICCgoSBgYKBhIJ/gIB/gYOCgYCBgYCBgIGBgYGBg4B/gYOCf35/goGAgH9+gYCBf4CAgYCBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH9/hH19fXx/fXp9f3t5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B8f35+fn15eXt6enp5c3J0b3dxd3lzd3uFg4KDgoOEgoOEg4CBg4OGg4ODgoKEgYSDgYOAgIKBg4GCgoGCgX6AgICCgYKBgYKCgIGAgICCgoGEgH6Bg4J/foCDgoCBf4CCg4KAgYKBg4KDgYGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/fHt3fHl5eXt6fX59fH18fH1+fn+BgYCAgIGBgYOEgH2Af39/f357e3t6e3p0cXhxeXR2eHR2e4SCg4KDg4SChIODgYKChIWEgoOCg4SBhIOBg4CBg4KCgoKCgYKAf4GAgIKBgoGCgoKBgIGBgYKCgoOAfoGDgX9/gYSEgYN/goKBg4GCgoGDg4OEgIKDgoOCgoGCgoOBg4SDhIOEhYSFg4SCgYOCgYOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBf4CAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISBgoOFhYWDg4KDhIKEhYKCgYKDg4GCgYKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCgoB/gYKCgICChIODgoGCgoGDgoKDg4SDg4SAgoOCg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoCBgHt9gX58eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGBgICAgIGBgIB/fX18fH17dnJ2eHh2dH92dX2Hh4OChIWDg4SFhIGChIaEhIOCg4SEgYOFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoCCgoODgoKBgICBg4KAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCf4OBgoSEgoSDhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6fH2AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fn5/fn18fHh2f3Z3f4SHg4KDhoODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4KCgYGDgn+Cg4SDg4KEf4KEg4ODg4SDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH9+fX6BgYB+fn1+fX5+fn5+f3+AfH2AgYKCg4OFg4SDhoSBgoiGhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGCg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYODgoODgoGEg4GDg4SEg4SEhYSEhIWFhYWEg4ODf36Bg4B9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH99fH6Cf39+fn5+fX1/f39/gYCAf4CEhIODg4WDhIOFf36CiouFhYSDgoSFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhIODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoSFiomEhISEhYWCh4aGhISEhIWEhYSEg4SEgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4J9hH5+cnWDgoF2foOFgH2BdYF6hH9/f3+EhIKDgoKBg4SDhISFg4SFhoSFhn2Een1+f4N7hYOBhIOBf31+f35+goOBfXt/fX6Afn18fHx9fX19fH19foB/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIaEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhIWFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOAgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKChH6Dg32BfX5/fn+Cg4J8f4F9f4B9fXx8fHx9fXx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSCgoSGhoOFhIaIhoaFgoaGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SEhn1we4FweXZ+g3+CbnlwdXN8dnl5hnOEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd216c26Ah3ltfXJzdnN2bW53bHB5bHV9f358foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgYCBgICAgYCAgIKDgoKDhYeGhoCChYODhYeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHWCcoN+b3p5eW1vbnpvb2x3fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fYB+gIB+foCAgYB+fn9+foF/gIB+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEhIOFh4aEhYWFhoaIhISGh4iIhoeEhoaLiYWEhoeHhYSFhIWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f396fn19f31/f359gIGDg4CCg4GBhIKAf4GCgH1/f4F+f359foGAfn6BgoCAgoSHhoODhoSFhIWHhoWFhYWHhoiFhYaFh4eFhoSGhomIhYSJioiFhIaFhoWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cHl9fW1+dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXt9e3x9fX9/fX1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWGhoaFhIWFhYWFhomKh4WFhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SGhoWGhIaEg4SEhoSDgYSDhIOFg4WEhYSGg4WGhYWEhIWHhoSEhYaFhX13hYSEhIOCgX5/fnt8e358fH1+f399fX9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYeFhYWDhIWGhYSGhoaGhYWGhIWGhoaGhIeGh4eGhYeIiIiIhoWHhYaGiIaFiIeIhYeGhoiFhYaGhYaGhYOChYWGhYWDhISEhIaEhoaEhYWDhoaFhYWEhoaGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1+fnx8fn2Afn1/gH5+gH99fXyAfX5/fn5+fnx9fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFhoaFg4OFhoaEhIOEhIOEhoSGhoWFhYOGhoWGhYSGh4WEhIWFg4SIhoSDg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fn19fH98fn58fYF/fHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWGiIWGh4WHhoeGh4WIiIeHhYaGh4WGhoWChISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaHhYSDhISDhIeDhIGChIWDgYCAgHt7fn58fHx+fXx8fH1+fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoWGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhIaGhYeHh4WHhoiIh4eFh4eHhoaHhIKEg4SGhYeFhISEhISFhoaGhoWFh4WFh4WGhYaFhIOEg4OEh4GDgIKDhIKCgn+Ae31+fnx8fH59fHx9fH17fHx8fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGh4aGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIaFh4eGhoeHhYeGiIiHhoWHh4iGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fnt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWFhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWDhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBgoKBg4WCg36BgoF/hIJ/f35/fn58fH1/fXt9fXx+enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x8iYeEhoSGhIaGhYSFhYWEhIOEgoCDgYaCgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeJhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhYSDhYWGhoeGh4WGhoaFhoaEg4SFgoGCgYCEg4OCfYGBf36DgX5/f4B8f3x9fX59e359fH16enp5e319enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhIODgYOBgIKBhYKAgH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4aGiIiGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhYWGhoWFhoKDg4WBgIGAgISAg4B8gYB+foKAfYB/gX2AfH1+fX57fn18fHl6enl6fX15ent7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoWFhYSFhYSEgoKAgoGAgICDgX5+foB5en2Ag4SFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhYWDhoSFh4ODhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhIWFgoKDhH9+gICAgYCDgHyBf31+gn5+gH6Af399fX59f3t/fXt6eXp6eXp8fXl6e3t7enx7e3t7fH19fXx/fn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhYaGh4eHhYWIhomHhYSEhIKFg4SGgoOGhISGhIeGhoWFhYODhYSFhoWGhISEhIWDhYSAgIKDf35/f39/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6ent7fHp7e3t8fX59fYB9fXx8fYB/fXyGg4aGhYaGg4SDhoKFgYGAf3+AgH5/gYF8fn9/fn+AgoKChISDgoGChIGAg4KBgISFhIKBf4CCg4KEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhYaEhoaGhoaFg4SEg4SFhYWDhIODhIKEhIB/goJ/fX5+fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl6enl6ent5enp6e3t8enx8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gnx9f35+f3+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYKGhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWEg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgX6Cf35/gnx/fn19fHx8e3t6enp6eXt5e3p5enp6e3x5e317e35/f4GAfX99fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Afn5+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGAgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx8fn18foN9e358fYB/gIN9fYCBf35/fXx8fX17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzMzMvLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs+QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT48Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPTM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbLy8vMy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTU1NPT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDs5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5HqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWy8vMzMvLy8vLy8vLy8vLy8rKy8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX2NfX19rb2tra2tra2tvc29vb2dfX19fX19fX19fX19bX2tva2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0A8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1NRqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSNi4uLi4uLi4uLioqKiJ+7ubm5ubm5uLi4uLi5sIuLi4qKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXJsaU5TYkxMVk08Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLUEae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uzr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWFJTU1NTU1NTU1NTU093qKSko6Ojo6Ojo6OjpZVTU1NTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h3bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9QkA5PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmnlxWV1dXV1dXV1dXV1dTeqmlpaWkpKSkpKSkpKaXV1dXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8Oz46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183Nz9HR0tLS0tLS0dLR0dHc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqqJmYWJiYmJiYmJiYmJiXoKtqampqampqampqamrnmNhYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTo6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc3Ozs7Ozs7Ozs7Ozc3Nzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Oz87Ozs7NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMvLy8vN0tLS0tLS0tLS0tLS0tHNzM3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojs4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7O0tPPz87Q09DO0tTV1NDPz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfX19fX19fX1tbW1tbW1dbW1tbW1tbW1tbW19fW2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9WSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys7Nzc3QuYOEi8fTwJrLz87Ozs7O0qucz8/SuY++1JyChIrGz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTw9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0racpaPUwJSwnLGWuLmvodLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz86dnJGdxaSgi5HDk31+r7DRzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj48PDk2P0I/Qjo2NDg6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz9G/mKCbs6edh5261NLNnp7D0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0I6NzQ6Ojo5Ozs4Oz0/PT49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/TtJmWqrmXnJCfoNLTwKCg0M/Pz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD08OTY0Ojk4Ojo5Nzs/QDw8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/P1KuafqOSiqyvkaG516+iqdTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjk8OTc2NTk6Njo8Ozc8P0A8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NSsm6eLmIqhmq2bqdijobrU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENHREFBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DTtrKypZubmqbFmKLRnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GSbF1cb2doYl1PRj9ISEZFQDw8Pj48PT08NzU2Ojk2Ojs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cSimZacr56cm5utx5+h0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09Ojo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LiroMfVoqukms+mq6SexbSkptbS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0tAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT08iSjbTWzJOQp9e5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVpaltMX01KTEpVTEZCPDw/RkVHS0k9NjY3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj47PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHUyMHV0dTKvdXS0cLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FETExBPjc3NTo4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0dPU0tLS09XT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPT03ODY5Nzc4OTk7Oz0/QDw8ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEFBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDg4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT48SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDREVDQUxINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFFBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb2tra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg6ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvN3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5NzY4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODY1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vb6/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs7Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj08PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEY+ODs3Mjc5Njc0NTM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7W1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3t7e3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLe3t7i5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurq6+wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojo7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqamop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e4t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmampqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WlpaWlpqioqKiopaeoqKeoqKeoqKmqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3tre3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojk6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87O0BDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WkpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSlp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QT88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSko6Kio6KhoJ+fnp6cnJycnZ2dnJ2en6CioaKjo6OhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXmJeWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0A/QkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2epKShn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzU3ODs9ODo6OTk7PTs7ODk+Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6emoJ2cm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTkpSUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqampqenpp+bmpuioJqWl5Wam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampqSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4OTo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8+QUE+QUE/Ojk9PjpQnaCfnJucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36amn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaOipaampaanpqagm5mboaCXkpOSl5qcmpaXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpKampaWmp6amop2cn6Gfl5GRkJSXm52YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgoJ+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpKanpqWlpaalpaOgoKGhoJmSkI+Wm5menJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKCfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTk4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqOio6SkpqalpKSjoqGhnpyblZKUmJyam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Njg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn5+goKGio6OkpKSkoqGhnpuamZehtZ6ZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamZeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foKGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKCgoqShoqKioaCenJubm5mfq5ucmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njo3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoKWzrKCgn5+enJmZmpqbrmp2nZ2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qbm5qbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6ChoJ+mkpurn6CgnpuamZqZqIREgJ+fnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uamJmZmJeXl5WUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2eoJ5inKaenpyampucoaNRSISgnZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udm5qmZl2joJuamZudnK51SUyGoZydnZybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFE8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmYpIBSeKKZmZqdm6CkX1ZOh6GcnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaChn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkXFxRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycm5iYmaCIW1+UmpmbnJyjj2RaTYGinp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtbTEY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJmfl11ddpeanJ2dooFkWU1/op6fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5uanJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmZpgYWCAlp2cnph0Y1VPgaKfn5+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7ODc5Ojs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZmfaV5bZX+cnJ6Mal9RU4aem56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7QkBBQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqXk3NoYVR2k5ech1xXUFeKko6SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mlo6KZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGRjpKanpJ9oKOWpJxuTVBjhoaCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDgISgnY5+apSllZ19iIBfcn+AgpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY5Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn+Aoot7bVF1nIyMWnF9fH59fIaOjYuGjZSRi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqFgIJ9mJp3V05LcpOGg01fb3F3iIWKjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gH56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRi3+IjYyLi4eRjaONVC8vPXiHd3ZBRF1rbYSQiYmQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZCeoZ2Tl5uhmp2boqacZ0JbSDt4eWtnRTE4WmxzkI+LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqamvj0pyonlBfHhkYlFUXklgboqhoaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKmqaeoo3hgwdalQ3yOg3VPbo52U2R/o6inoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSnp5mdpKWjop1if73ArnmhpJqVZUxfeG1RdJWioqChn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZWRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKhoqehpq6mpp2eaoScuo6p0aKas6hYTK2TU2WPoJ6goJ6doKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaiqrbGyr6uiooV3fn1yzsavmaava1WqsGNbh6WfpaKhnqCimJWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVVxoZG9jbWlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Gem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqp6+3t7S1trOtrqyOhoNukcy8lJSllnRUb3pzcH2WpqqnpKCfo5udoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrsre7u7u5ucG4tLWfh3lkWJ+1u6anmYh3a3FveHl7foWOkpido6Wmq6WkmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh2a3FoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tbfBxszPzszJvrOkj3JmUkSLlYWFhX14cW5nZmxpbHJycXJydX2NqcTEu6Knqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWlhZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8XH2+Pj2su8rqOViHRZWlFEaXdqbnRua2VlWVddWFxjamppZmFpi7bBwLmpr7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdvbVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGvs3S1cq5ppyThXJeUVRLRFtlXmNqZWFgaFlUWFNXWVpdWVt1mre8rLSyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4R/amZoYWtsZ252cnJ2cmdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/CwcfLyLaTdGNVUE9USD5ebF9fZWJgXWRhU1VXVlVVWHOcrbGqqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dWtsbmRvbWlxeG95amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7m4w5thSURHS0Q9W2VhYmljYFtjX1dST1BQV4G0uqyupaSjqKSgoKWZqbSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+dlJOJiX6GiIyWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3dua2lodlpnc3hzemdnXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMTEwsTBrYNPRk1FO01aXWVsZV9bYFlZU05VgKOrubWyrKmjoa2prKetn6y0tL/Dvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXZ2ZWZqamhea3BueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx8LGlmpYRz8/Rl1iYWpgWlhXVFZ3mre/u7y6vKytpqm7urm3v7O1uLLBxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq6yxnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhaHZoamp1bnlsXmRbVmBZTEhENjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc7Fxsa9qXJQSzBYU1ZlYVNOUHGpyMjCxMfAvL60sLCwwr6+wcbAvre2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2vtaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46LlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cn14cGdga2p3bWlmdm90Y11jVVdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXCw8LBvJE/T3eAilZMb6XL1MW2v7/Av7q7vbWzs8C/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enmAc3BmZWdkbGVia25vb19ZXVdWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK9vMWnd2uCkJdvq8jIx9HBr729uLm7u763tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWViYWNkZGpjZ2RbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8C6v8C8u8W9usDEv72+r3NkfZGKitHFv7/Jv7DBv7q3u765tbi0uLy0vbi1tLCzvLG3t7i/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFjY2hrZ2dqZmpeVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1Y24v7vDtbrHtrW4ury4ubaqpJiNfoTJv7+7wb65xr3Cv7zFuLa3tLi2tru7uLa0t7q1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWdwamVsaFlZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+8z8R3qMy9x7e5t622tLe5s7WxvcnElEl7yr6/vr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d9a25xZ3FrdGZjbmBcVUhLS0RKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNaudIC7yM/CwLiutLS7vbe5sb3Dyo1Ddc3Dwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcmZsam91b3lkaGNcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCxsnSmXFyq9HRzMrEtbq/xMi+vrS/wMF4Um7LxsK+wby/w8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRwbW10bG1vYGNfYmJOSU0/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDDur68xL63vMC/yc/HyMrKwoZyc6PMzMvNysbCw8vOwby4vbqxb2Niu8jEwMC/xMDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh7bW14fGBxZFxfYF9UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7ur28O+tr7Avr66ppypsrbDv6V5dXiZxMfLyMHDwMDJysG/u7mxoHxybK3IxcS/wMG/y8fDwMjAusK7ubO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem5zeHRocF5cX11aUkZFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8S4ba3Ovba5wLysfW5obm1ygZWYc3d8l72/xsC5wLy+xcS9vbixsJiQfYCbysLDvL2/v8PDv7/HvLzAtLOutLS8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdtdXtxb2pcYGFaVFFBRklHS0BFQ0k8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fm52bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNs3aBs722tcKlh2laXmBNUltabnN3gJ+4uMK6s7u3u72/uru7rqSbmIeQfsDEw768v7u7uLbBwrW/urStrqyvvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytry0saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnZ4bnJhX2ddW1VKPT8/R0c9R0NDOTo1Ozk5Pjw8OTo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaiEeIqgr7WdamVnVllgSUlNUFNsd4alsLe+ubK1sru5vLa5vrSWnKWVoXGuycTAvb+5s66yvLquu7SzpaqmrLq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JtYGRiXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8WqiHx1jKCZYFRDWFVHYWpWT0VKYI2grK+2urW0sqy8ubi1uMG9i5iwoaVypcvCv7m6ta6lrLOxprKwqJ2gnqSttrTBtrWzpaeqqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxwdnNvZF5oWV1eU09OQj9KQ0FLSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmpGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/tZGCeIiPb05KP2RZQk53gJRqTkFdgbC1s7WytK+su7q4trm/xXWDqp6ZY6m/uLWysa2tn6SnpqKuppyVmJeZnqituKuqqp6kqKSrrq+nsKuvsbGtsa6ur7mwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZ0bXZqbF1ca1VeXFBOSERHTUJHTkc4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiEe1hGQU6HWUpKWHeNgWNBU6O5s7SysLGtsLm4tru3uryPobKro3KssKmrraujqKCdnaWahZ+UkJSWjpadp62joqOfoaaio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J5aXV0b2VVYmRYXVJPTUlASVJETkM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K8qZmZlWlOQFJ4cVBJSUtnnIFZRVKuu7Gss6+urK22trK0ta6opp+am52epqieoKipn6Gnlp+RVYGekYyOlIuVmaKnn5+hoqGlpZyjo6CepaCkrKWmqKWio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqppKmrpqmsq6ahiHiDfHZ/emN4bW5dUWlVUE9HUE1NQ1BSQT87PjQ6OjU7Oj07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaqlpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcKrpb5pRVKdglFXSUpgSlSOYGNigK61qrK0rqqrr7Cys62lnZGXk4+XoJ+hoJyjpJ+eqJSjVVaHlY+LjJSQlpqgp56fn6Cjpaicn6ChnKGfo6innKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclpOPj5KRmZCWlZiXn5icmZukmZeUlZqdoJ2nqKWgo6Kho5+doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn58gHV2fW5se2RpVlNkTkpIR09TTktOSDxFQD0yQDg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62trq5ure3u66ooKGpoKrGv8uhUEFynndPbktLY2Z1c2BaXnCQsa+us7Wqpqyso5uZlI2RlZeYmJyfoqKcnaSemqSakzpkhI2Mi46XlJmeoqmdoaCcpqerop+gp5+dn6OmqJ6jpp+qnaqtqq6nqLClo6Smp6ymoqWim5mer6iusqumq6qgm5iYmJWTlpqTlZaalpuXmJihnpyclpuhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl8gH53eXxleXlhYlNWYUlJS0xTVUpTUU05P0E2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZykx8eOV1NJZaNbZX5vcl1Ra2NbZF9da4+0sLC4rKahnJ2alJeamZCOkZWRjI6Nk5minJeio4A9ZICBe3l/lJido6Onnqarn6eurqqmorGjmqOmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Ggo7GusrG0qrKuo5mcnZ6hmJubmpiZm5WWm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaYJtZVxTW1pNUktPT1ZNVE1CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6KanqukjXpVaXJ2dXBjdnZYV2NgY2dZWFdmra6sr6efnqKglpCTm6CcmZeSk5+coaOanpuWnqCDamNmcHp4dX6Mm6apq6W1sp+ttLe2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztbizuK2ytKSgnaWgrKGhoqGgmpmWlp+bm5iloaCeo6Ggn5ucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh2and1Xm1bUmFJUlZIRlZXS0NNSD1LSThGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamorqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6KhoKSAboJwYGNYTFtTWk1MUFhSSE1NSJisqqmloJ+akpGUmJiWlpaMiIuOlJ2cnZyelp2etqt/Z3+GfXV5e4GdtK6zwZipt7i9v7qttbSwt7CutKmmpKWsqbmztbvDvMPBt7u2q66xube8r7OwtcG8t76zs7WirKKpqbKpq6inqJqZnpqqp6CZp6Cfn6iopaWfnaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWFfnZybWl3bWhuXFhcQ1dOSkdNSENGTj0+TD40PDo2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqZSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco5+dimJXXmVgV01RRz4+P0NDPz5CUXipramqpqCen6KjnZ+em52blJOVlJ6emJSFnZmgvNW5lYWIjIV6cXBsgKm7xJyQucO+v8K/trq7wMO5vbusrqexrbHCtrjCxsDIysDKv7C5ub24wr64tLvGxL3DvLi0qrOtqrO0r7Ouqq+jnqyot7Kto7CmoaOwsa6wpKWvo6GgmqGmoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXx0cmtsdXJxaFdcUUZVSERKUEk/RUI0Rkg5Njw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+flX1gXmVgUUdEPEM+RTw/OTZOfqqzp6SjoqCepaymn5idlZKanpmVjIqGiIZ4bYefs9vUvKuciYaLgnJoXV2QzrZzrcfFxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3GzMzM0se+v8DDvsfHwrjEysnEwce/urS6u7W7t7C2squ7sq+8t8C7uqu4rauquLu1vK6uuKOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlZSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtkaW94a2VaXEZMTUVEVE1FQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QD9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn5zamFXTkU+SVl8b2JCPVyOrqygmZucnp6Zl5eYk42Pl5eUj42QjIKDgnZycG1wkbvDx8TAt5aDgoSEcmBXhbmAgNDMzMzHysXFzNDS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysHGx8bKyM/AydHNx8bIxsK9xMG/v7+1vrOtv8DDw8fFyMSvv7myuL3EwsG7vLy1rqenrqigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dXNlYmdyb2deWlpET01DRlFJRENBNTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+OTtBQTs7Pjc4Njo7PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56bnZZrZl1USURAP0uGnqWahKCyraOenJ+amJeUk5SXkZCQjYiEhImHg4CBgYB5cXJvbHuIZ46ttrWhjn16emtoZXGEX7rU0dHNzc7QxM3U1djR183Gx8nMw8XKz8rS19LX0tXW09TIzMfMzcrTzc7TzcbJysrCx8zHycnGv8Ozs8jFy8vLz8fKv76/vcHHxczMycnAw8CusLOonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5aQjIaRi4B7cnV2Z2NndmplVlhSRE5HQElRQz5CPToyMkE8RTw3ODxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGcY1NMSkRDP0NSrtG9sq+mnJycoKShnZqUlJWUin15cWxlYmhycHJ7hYqAdXBtcXFweVFZfJiko5Z+b2pjZmpmXZPY0dLT1NLP0cPQ09bY1dXSy8nO0MvGzdLK0tXX2dbY09bYzdLKz9HMz9HN09DAycjLxMzNzM/PxsfItsDLwNLNzNDHysnAxMPIz83Q0c/NysjNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNhZXJjXVJcSktHQUZJSj87QTg+NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGlpaCioltJQEFEQUZRdrKvppqUl5+cmqCgnpudmpWJd2lkYV9fX19eX19dYWx1c3Bwbmxxb3WAY1p3kpuZhWlhX2NpY3nM1M3P1dTU0dHM0M3T19bT1dDP0tPRydPRyNDX19jS2NLX2dXWzM/Pyc3SzM7RwMfEycfPztHR0sjMzcDLzcbUz8zPycXLx8fJzMvU1NHVz9LM08K5xbGlqLWuqJuoq6Wdsqiws6ysk4+TjoiKjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZRYEpKQ0VDU04/PD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48P0A9RkFEPYKknKClnqWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fX1NXZ2dHO0L+8zMm2vq6nqqiho6xnQzg9PkRYgqqon5eVl5manJ+dmJudk31xZWNiX19hX15hYF5hYF9gZW1wcG1rbnFydnxgXYCUmIpnWVlebXWXx9TOy9LN1dTRys/M09bS0dbNz9XV0cXR08rQ1NXWztPR2NjY18vIzsTKz83KzMDJwcnKzs/QzNDOzszP0MjM0NHLzsvDysjKzcvM0tPO1NLR0NDKvci5sK67ubWrtrCtqLits7+7sZqOoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcG9rYWRucGFYXFtJRkZETVlFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pzk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cgo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSyfEhGQjtWjaGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGBgXl9fXlxibXFubnFxcnF3d1tnh4+KYlVZaoKRnbPNzsTNytLSzsbOzM3Uy87SzcvX1tDM0dTLzNDR08rO0dXS1dbKwMrCxs3DyMrDzcTGycvLz8vOzdHO1MzHydDNycfLxsfCxsrMztHRx9DPzs7M0MXHwbi5vcPCvcO5srK+sLvDxLWqmKWhmJaRlZWSi5SNmpGUlI+PlYKJhnlxcmttaGBgcWhZWGhWTUdMSVFRQjtEPzs2ODo4Ojo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4ytXW2drb2MzMz8jW1cTCta+0qKCtl3hsb3B3j5qNjJeVkJORkZWWlZCLfGViYmJgXV5hY2JgX19gYWFgX11bXWdxcXBxcW1pbXhoVXiDfFtUaX+Sm5+uxca/wcTOzsfFx83K0cfKzc3G0dLPzczUysfKzs/Hx8/Sy9DPxbrEv8bKvcPHyc7Fw8jAx87IxM3LzdDJxcXQycbCxsnFv8HIzczMz8PKzMnHzNDFxci7x8PJycLPwb28v7DByce5vaqxsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Vka2BeZnFhW1dgR0lIR0lNVUc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62ktn5ngoWiqpONjZaPhYODg4F9hIR+c19bXl1eYF5gY2RjX11cXl9gYF9bWlxha3JwbW1oZ2lrcV9lb2pYXHeCkZeXore6uri7yMXBw8DDyMnIyMnHwcXLxcfKzcnEwcrJwcHLz8TLyL+5wbzGyL7Axs/LxMDDu8rHyLvJxsXKwb7Cy8bFxL7Gvr3BxMbMxsW8v8rDxcfSxcHJwMrKxsjG0MPDxsOuxMvHw8q3v7y6s6mspKWYn5iso6Gmm6Ogm5V8d3N1ZmpbYW5tWlxYUkRMR0NHRExERlM/NTQzMzVAPTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ovri8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76ysLZtXnp8npGKkpaGeoCEhX91eHVycF9aW11gYGJjZGRlZGBbXF5dXl1fW1laXGJucW5pZmdraW52XFpaXGBzfoaGgpKur7GvrsC5uru5uMDBwcO9vbm8v7nEycXGwr3GwLe7w8i/wcm7tru7xcO/vMLOw8a+vrXBvsS7vce8w7q1vcbEwsO3wLa2v7+8zcS9trrIu7++zMTCxsPGycfJxtDGwszIssfJw87MwMXDv7yyt7Cyp6ioubClrbCqrayUend4a2VoYGhvZFZeWUpGSkZIS0FFQkZKQTk6NjU4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWrt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTV183Kz8XJxcfBusW9rK6nYGN2gZKLiIuEeH+Ghn99g3t0dGNcXF1eYGBiY2JiZGViXVxbXF5cXl1aW1xdZ3Jwa2RjaWpqdXBIT1xZaHNvaWSTpaaqqKO1sbWzsrKzu7W8sLavs6+yu8K7wcS8v7q0srq+wLjIuLS8tsDCvbi9x8HDu7Wvs7W7v7TFuLu1rLm9vsC9sbu2sLe6s8a9t6+8v7W3tcW9vsPGwMTGxsfMxb/GxrvHy7/PycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkdCREFFRj89OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMXLzcjFyM3M0MvNyMnIysnKxNDN0s/NxcfBxcG/urjJt6uwmltnb4iOhoiJenh+hYZ2d4F8c2hdXV1dX2BfYGRhXmNlY19eXFteXF1eWltbXF9rb2xmY2ZoZ2p5X0NQTFxcVlJzoZqepqKap6mvq6mrqLOtta+xp62mrLO7urbDubq5sKq0ubuzwrmvwLG9vLu1u8e5w7etqqiwssC2uL2wsaiys7W7vKuutqeutq68srCquLCuu667uLvAwb66w7/Gw8XAvMbBx8q4xcfFv8fDw7nExsK7xsnMy7O5wr27s4l0dndraWBibGlZV1dbQUxMTUpFQUM/RkE6Ojo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxM/HzcHCxr/ExMPDysLJyr/AvMK6s7W1w66qsZNbaX6SiI6Pe3h9iYV5e4SAd25eXVxcXV9gX19kY2JkY2JgX11aW1paXVpaWlpdY21tZmRkZGVnbHhRPUVMWF9al6WWnZ+blZehp6uipqGqqauqr6Klnqqttbaxvbivt6+orbi0s7y3s7ywuLm1srzBssCupamjq7Gzs6i9qquoq6yutbSmqa6hpbCps6anqK6mqLessbO3uru7sry+vr7Ev7XBwMfIt76/xbfFw8C7v8TCvsTIzMq/v8TAwKmHc3RzamlcYW9kV1ZYUEhaU1NLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPHubnLwsu+u8m2vcO+usq3wcPCtba8trGvtbytqauTZG2Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX11dXFpYWVtbWFdZXF9lamRiY2FkZGhuc0ZEZIFwXZSZh5yulpKMnJ6moaGfpKWmpayfnJukpayysLa2p7Crp6q0q7O5sLW1rra5s7C6urG2pKCkoKaxqKypuaqlp6eop7OtoKenn5ylpqyfn6ekoaGxra2ssrWztLC1vLa7wcCyu77DwbG5ucKzwL3Atbi8vb68wsfEw8S/wMSghHlxbGJmYGtvYFVZX0hOaE9USEZLRjw9QD06Ozw4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBur22oJ6VnaCmurars7O7s8TPycvCxbi3x8DMv7jKt7vFuLPFuLO/wKy2vLKspq+0raGjkmlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYF5cW1xcWFlYWFhWWFpdXmNiYGNjY2JlZWxrWXt5X1RcRF5ik6SRh5idnqSbnZ6ipKKmnZqim56qrqyxtKOoqamrrKS0uKy2r62zta+zta+wqp+en6SisqWmqritoqamn6itq5mfoJ+ZnZ+lmpmjnJyesKmsqKqrrK2ws7mvuLm6sLa8u7qrs7K5s720t7KxtrW/tb3AvcPCu7u9l4R7c2xfZV5kZFhUV15JV11LUEdKSkdBPD8/QTs/PDA1NjM2Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru4wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765yLi4v7eywrSxu7usurqxop+pq6eYnpBtfoWGf3hybW9ta2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYV1dXV1dYV1pdYWJjY2JiY2Rlb2ZZWEgyISJcWF+OlImWnZ6lnJmbo6WhpJueoJqYra2trrGgpKKtq6ehtbCxsaypr7OourOntqGin5yjoa2joqq2qqKjpp6mpqOWmZ2XmZqdoJqXnZydnK2hrKijpKatq7OzqrWwsquyubSvqq+ysrO3s66pra6yuLC6trq9v7ezsZSGenZmX2ZfW1lWU1pVS1tRTEpFSEtJQz0/QkJAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7KdpaOYpbHDtba9rbS4wszIxsDFtsHAx863wMO9s7m5sr+2sbm7rbK1r5+ao6qhlJqPeH+DhH94b3F0cWhlZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdVV2BiY2FhYmBgZGZxUTozIRoraJSPeJGMkZuZnZqUn5+oop2ep5yamaqmrrCqm6Kjt6mhoK6otaqmp66xpLiwpLego5yZmaqmoZqtubCjoaScoqCgk5WhlJaWnJmYlpeclZ+pnqqkop6jqqqxrai0rKqnrbOwpauus7GvsK+vp6iosq6ytLC8tLq4rqOUgnp3ZV9hV1lYU1JUS01eTFBMR0hNTEU9QD49Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS6wrG+t72tnaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa68u7W7vLW5ubCwsaqcmqGplZGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXVlVaYmJgYGFfX2BiaWk9My0yTn+Nk4yTjo+Wm5ick52dpaSipaaenJ6ln6qupZ+ho7anoaGiqbOipailsKaxrqu1n6GdlpWpoaKUrbGxn6Ojnp6YnJOMoJSRk5iYkpeYmJeep5unoqKapKWlq6SlsKelo6usraaprq+vq6iqqrOmpquvtLGuvLaxr6+fknt4c2ViXFtdWE5MUUhSYU1WUE9KTk9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtr2wu7G3rJ6lpqy4u7zBxbqyubXEycnAwsbFx7bGxLPBv8Wrt7e9tr26u7WyrK2omZmfo4uKdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZWUlRSVF9fXV5fXF1dYGFrWDQ/TXSEiomMkoyOkZ6VnZSZnaOgq6Sjo6KjoZupqqOZnaSxqaGgnaWqnqiin62sqqmuraKiopWYopqckKypsJyfop+fl5mTip2RjZKUlpCYmJOcoaOcpaGilaCipKWbo6uloqSqpKutpa6yqaalpqa1pqqorbO1tLm6r6qsnoxzcXBhW1dWVlJHUU9IWlxPUkpUS1NMRUdKQzg7Oz08OTY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsa2dqKevubmzwMi6tcCvxcjMusHJzMi1ybyxvsPJrbG4wbW8wLy0taqsppaanJyJgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFVWVVRVVVJTTlBZXVtbXFxcXVxfY2hAUnGHe4WGhY+KjIyXlp6YmJ6lpqmmqqaopaKYpK2jlJikrqmgnJmboJ+umZyqs5+lpp+jo6GUlJuWlpKpqa2bnJ+hoJuUkIyYjYyRjZKNlpWQnaGgo52co5WboaOhmKKoo6Koq6CrsKSuuKWjpKOsraqoq6+0t7K9tbOrrpiFdXRpW1lZU1VSRlhMUVtYTVVPUExRUklPSUI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02ODo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraezt66oqK+um6morLe2rLzKu7a/rMzGxbjAzs/Hs8S7t7vCyLGtuL+3vL67s7amqaCWmJmXiHp0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05PUVhZWVlcW1pbXV5lcXl2f3OAhYGJhI+LkpSdm5ecqKekrKqnr6OmmJ6rn5SUo6imnZeRj5qerpaYp6qYn52UpaCekpGSkZOVqKqlmpiZnp6WjoyLk4aJjYOPi5KVkaCeoaSZlp+VmqGinpSbpaWnqaigsLCmsb2nn6OstKqup6+0sLm1wLGusKuRfnJ0Y1ZUVU5SSkdWUFJSTExYTktMT1NHTktBQ0ZFQz5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/tKymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrG3uLy9wMOxsLG3rrS0u7O0o6OdnZiXlYSAdmtnbG5xbnFqb2tkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVFFNTk1SV1hZWFhXWltbYGp0bHJpe4J8hn+PhI+Ok5eVmqWYnailpKqdppeepJqRjp6impeXhoWSm6SPlaKclZaVh6Kam5OMjoqQmqWnm5WVl5yRk4iUjouBjI2AkIuSkpKhmqCilpSZmJWippqNmaSnqaehoLSyqLO4oZ2jtqyqrqSysqa1u7SrrLGiinpzbl5OUVFNT0ROTk5QS0ZOTkpKTk5RSE1KQUhMSUhDPjk1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLawpKekqqWgqaaks6qissS1tbKzxsW3usPKzMazrbq9tLjAr66psJ6mrruvraCam56VlYh8hG5fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTk1LS1NXV1ZXV1dWWl1haWRoY3Z8dn53iX6IhY+Nj5qdjJeaoqCimKSVoJqUjIaYmotzjYN+jpeWhpKakJOOjXuZj5yMgomAipigo56Qk5iWhY6ClH5+dIqOepCIk5CQnZuampKWkJ2Oo6OOiZqgoaSkm6K0r6ywrZ+YprimpbChsa6csLuqqa+pmYR4dGRWTVJQUE1DU05MUE1CUFFISU5TTklKSkVLTUdLSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI0ODUvMDEwMikoLC0wMjc2NDc4OTo6NjY6ODdBN3i3oaO0qKalqKOlpaamprKnprTBuK+0sMnEuLnAzsa+s6y6waytxK2ooqaSnaa3raOgkZaXkpB+eH9mV1ZfZ2ZpZ2huY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkdOU1NTVFRTVVlaXWhfY2BxeHFrSVNti32RgoiYk4iRjp6XnJWVlZONlYl/k4lfO1ZvfIyUioCMkoyPhoZyi4SWgXmBe4aUnZWDlo6Qj4OGfZN4cXCGjX2JgZCOkJeamZOLkIqdiJ+Yh4iWnpqhoJenrqmtqamelq2zoqWtma2smKezo6mto5N/dG5gW05TUldMRFRKUE1MRk5PSUVMUU1LUEpJTlBHSko9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CiraGmpqqgpqmno6qwqKe0wrmwtbDHwrizvc+/ua+utcKnqsSqop2Yg5ScsaOamYeUkIuHfnN2XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNTlFNS0hGSE5RUUxPUlRVWFlgZV5bbXVpSj07fJKNi3mEkImCh4qZjJWUiZGGhJSFeIh/YEpRbniLkoR+hIyLhH9/bX5/k3d1dniEjZpwUY2IioZ8fnmUdmd3hoh+ioiVi46Rk5eMhIqIlIWbjYKFkpuWnp2UpKKoqaWknpuwqqGkpJGmqpahqZyhpqeKd25mXlxIUVFTTUlVTVNJTEtPSUhGSk5MTVVLUVJQR0pEPTc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjExNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aboqedn6Guoaeopaeor6yqtby2uLezwbu2p7nIuLaoqLW2qrK8p56Vjn+JlKmWlYt/joSDfnhxb1hNS01NTkxNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERENJTk9oWU5RU1NVWmt0ZGhxYF9VT4yDkIRweoJ9eYKKkYCRmYuPeoWOf3R/eHJudXB0jo6Ben6Kq4V6e2h2e45wcm14gYuNknh7gHuAd3NyknhodYWEhIV8lYqIio2LgH+Ei42AlIR8gY+YlJyWkZ+dqZ6goZ2gqaWfnZiNp6SSoJ+Wnp+kgXNpYl1dSldQUkhLWFJPSk1MUkpKSkxQSExRTVJVTUZJQjw3ODs5OT49Ojs8OThAPzo6Pjw3PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwuLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqqWtq7Cxqr20sru4trq0sZ+3urKqnZ2sqaiyr6KakY2UgY6cjpF/d4Z4fHZwb2pZS0hJSEdFSEhQVFRUV1dTVVVVVVZXWFdYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MTlFRU1ZecXpwa1xuhpGVjIx3Y3V9c3V8ho57gpiSf3CGjnt2em5rfq18dJCLf3qGkoB8f3RmdXyGbG9oc3yKjYeAbXpxfXFtdo9xaHGBfo5wRIuFgoOFf3d3eoyGfYx7dX2Oko+Yi5Kbm6OWmZ2bnZ6hnJaNi6Wbjp2XjpaYkHhvbmdjW1hYVVFKU1VUT1BOUFZLTktPT0tST0lPUExGRD07Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagprCsrquoqbGvsau8uKu7vrizrKebsKesm4+WnKWppaGYmo6EknmJj4uLdnF8bXVxam1qWEtGR0VBQENESExMTVFRT1FTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WUpOT1FUWF1kbWlif5+jvnxwdF93dGt4dYaOeHqKhG5ri5F4c3hpan+CcZaRjIF9lX9JkpluZ3d+gm1qZGx5hZCShmtzbHxucnyGaW1wf3ONiYWGe35/e3dwdHSGgnmBeXB8jouKk4OWlpiakJOWlpmXnZaMg4mfkouSjYaQl4Bwam9vb1lWWFRSUllPUlVUUlhVTU5ITUtNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5ibn6Ssr6Ktqqi1r66stL+rvMO/pqKalaSYno2Ei5ShoZiZkZOLc456gIaMhnVvdGxxbWVra1lOREZDQDw+PkFGRkdLS0tMT1JSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUlZaUVhaWqCBXZVjbXRhemxqfHeIhnSAhYRza5iQc3J7aWqdjkx5hZOJhI1mMXaHcmt9fYN0ZmV1f4SEhYBmaWx1a3CAfGhxcXxuk42Pe3R+fXFxb3Vtg393eXVqeYiCiImDlpKSkIuNkZSUjpeNgHmIl4iHioaAkIh4bGtwaGVYUltYWVlbTlBVVllYTklIRUpKSEdCQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW2SiJqQmZakqK2esZ6nuq+rsrDCsbvDx5qWjpWZi46FeoSQmJWNkIyQh3GHgnSHjIZ6cHNxb3BkcGdfVEZJQz48Ozk6P0BBRENFR0lLT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FVS0FJUUhgqq6cbHVyaHlpbn9+gn94goSEeHGfk3N3gHJ0k4c1cJ2onY2goYSihXZwhnuGfHSMro2JgWhnYmpucm1wg3Vpb1h1cI6bkXZtf3t9bnJucIB7c3ZuYnWDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY58c3JxbWBcXV5cWllhX1JOW1pYV0xISkZJSD9DQUJIP0NEPTs6Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MDEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikYGSiJWRnaSnnq+VpbSprrCuwbK7wcWWj4yUj4CIfG6BkJKJg4qHj4Z1goRslYiIfHV4eG14bndkal5JUEc9Pzc0NDk7Ojs9PkBCRUhMTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVFSQ0iAb3p3dnF6aXOEhXl7goF9inx0oJh5fYWAhJmEmpxhhqqenIuDkI56d4h+iYiOdIuXj4R7XWRxdHp8d4ptaGpieW+FkIJ6b4F4dYV6cHR6eGtuaV12hn2HfIeGjn+KkpeDjYWMhn1xhH+EfXZ3e3yJeHF0dWdoYFtcXlNcZ15XUVRYW1VHSkpES0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1NDI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4in+TjJGcnZ6mkaCqoLGor8Cyu8S6lo6Rk4d6hnZrf4uRg32Kg46MeIOAc6CEin19gX9wgX56aHdrUlhMQEUyMTEzNzY2ODg6PD5BRUZGR0pLTU9RUlNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUtNT1FLSlRbV1FJZH2DdoR1d255i4h3eoaEfZSFdp+Yh4aNkZSljKypSIatr66KgYCUi4KLgoSSqYiBmJiKnHRtfIGGh36OaGdoeX9uhYeChXGEhkhsgHdyeXZobWtfdn2DiH+HhYt5lJybiYuIkX96dYp2fHhtb3d+gXV1c21cXl5cY2RYZ2VcVVBQV1lQRExLRk9JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Nzg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkI6Vl5KWoJ2soKa4r7O9s5eNkouYi310cH6Jkn59jIOSlH2Gfoakh4h/goiFeIeJfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0+P0JFR0hKTU5RU1RVVFRWVVNRT0ZDPzgwLCOHWz8/ODQuXZZwc6NVRklLTE1PV2BYbVhaXGWGjYCPfIB9gY2PfIOGjn+Yk4CfoJeUmpmlrZKZu7Gnu8fDp4uMoaWOk4mBkXxxg56fkZ1/d4WFi5CHkGlocISBdIyHhIpyhoJ3iIB7doR8bXV1Zn+UjoaIiIeIh6CqopaJjpd/eoGIenlvZ2t4fnyAdWxlXltbXmpeYmdgWk9MTlhSUUhQSkROR0NKRENBRERCPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmd4J6f4x/gZGOipqbpJ2hrKaqrrCXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46EgIGMioKJjYN/in9scGpdQkA0LS0vLy4uMDIyMzQ3Nzg7PT9CREhJTlFSVFJTU1RSUE9IREI8ODcvOUM+PDw2My5sk5dNUEhKTEtKTVZfYXxlZWpxlZSIlY6Ph4qLloWQjZuJnp6QoamkoqqTqLWhp8HCrceveLmUmnyNoZ6ZhJOFgo6hn5SZkYWKhY+akZZscHWKjIKVjI2Od4+EcW2FgYqWkYKFiHGIoJaGkYmNj5aktKibjJSig4eSg31/a2pqfIKDg3VjX2VgW2hsXmxsXldLSE5SUU5MTEZJUENETkZCQ0VGQz06OTY9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcXaShn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReYCSiJGSfYqEmJKQg4CAi4yJhpCHhImFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5PUlRQUFFTUU5QSUVEPjs8OkRGPz48NzUyPD9SNUhISExLTU5SXmyHenF+eZiWlaKgnZadk5+SmpymnKapnaerqKm0lqu+q7bHyLfI0M++m6Bwaaupn4STkoWcoJqbmaaSkYiVo5ubeHp+lJiTopKXl4GUnnt3lZKqsoiMl598lJ2bjZGVmKOhpbWvnJCYp4eWj42AiGxzc32BfnNqYV5iYGJoZGBoZ1xSRUpLUE9JSUxGRk1DSExGRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYuOjXyKho+QjoGCgImLioWShYOGiYGAh3deYlA0NjAtMi8sLjAvLi8uLjAwMTU+QUFNUVJTUVJTVVJOU0xFRUA8Pj1GR0BBQDg2NjI8OTtGSEdJSU1PUVlsg411kIacoKOvubSgqqmqpaayqa60sLCsurCyvZuyw6u6ycu4w7+3paKws6ytqqOLlpiEpaago5eBppmNoqqopYiFlKShoKuhpKiPnLGLlaOmt7qboKKvkqKcoZ2Po6GrrquytKGUpKmImYiSiZV5en6GgWliaV1mY19lZF5nZ19bT0NJSFNORkhMRkpHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGJXaW5YeoR2gZOFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkY6DhIGLhYaIkoaChYmHiIeHcW5hQEU2NDwzLzExMC0sKy0wLi00P0NBTVVQUlNVVVZVTltQR0dEPD4+RkhDRUE3Ozw1Qzs9RktJRkhRTlBXgJCdgqqfraWsvMTAp7DDtaqxvrG2vLS9s8C1u7qiuMWotcnHtb24tKijtK2wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqK62u7K6rLC1orGssbW7trSutJ+mp6GmmqmvrLG4t7immrWojKSOkJKfhniChXhbY2VXZ2NiZGFhZ2BbVEpERExVUUhJSkRJR0VBQEBLREJNRzw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtZUWJiV3l1cYGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomJeYaAjJOMh4SBjn+BiY+Gf4aIhoqHkHp4bl1XQEVOPDY6NDVBQjc2NC8vNkNIQlFbT1FVV1VcV1BfVUlLSkE/PkdLRkVEOz5AN0Q3P0JKSkVGVlNQXo2hqqGusL2ws7zJxrS5w7yysr+1tsCzvq+2dLCzpbrEpK/GubCzsbOnpLW2qrGgopebopKlsK6mraunpJihrbS7oqiyurW8v8y/xcW9vbPBt7q3vra6t7msq7Ckr6mtvbC8usHBq5i5p5StjpeXqYh+g35tWGRiWWxma2ZYXGNZVlNJR0ZMUUdDSElBSEQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxRVlNZVVp2anB+joOAjoRuenN4h2K5oZmjiZSUlpKUk42PlpGHhnuGgY2VioCEgYp6fIqHhnyKgoGLg5V9d3p1ZVBcZEdFTDtRY2FbXlNGPztIUEVaY1FSWVhaZ1lUYF9MU1BFQT9JSkhFRUFARDxFNkI+SEdKTFNaVF2SrLSyuLXFu7a6x8u5usC7trS6uba9s7mxxWB0saSxmp6qvamlqKuqo6KytaCrqJ+Vlp+ZoK6lp6aln6SUo6extKiys722wb7TycnTxsPFzMLKw8C+vb67vLe0r7i3tsO5xb3Cx6+euKmhq42kp7WIgYF0YWNjX1ljYGpnU1hgVlJVSUVFTktBPkdEPUtBPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoKy0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhY9zbHJyc4fVwLWZoI2VmJmRjpeRlpaOhod9hoOMlop+g3+CeHuLg4d7i3mBioKXfnR9emtmcHVZXlxQZWRiYGVkXVtYV1xNZG1VUm1tX25fWGdkVFlVSkRCS0tJRkhISEhCSTpEP0hLU1RVXFpbkra+tru0w7y4t8jJubW5tbe4sra0s661tZhkdaecrXBeoqycmKCim6SeqqWUn5+Qk46WmZion6agnpqZg6SeraWqsK24sL251NHP19DKzNLMz87Kxr++wsm9wbzBwMTExcq+x82yo7qwtK6aq7e7mIB8bV9iXlpfY1pkY1FbYFNQS0NBRUZFPEBGPkFIQkBDPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRW1loX2+WkpCUbmxvdHWHtKyhoZ+LmZyZjI2VkZqRhYqKfoiGjJCLiHyBg3N7ioOFe4l0goqGlX9ze3lsbXV7aHJlaWxpZ2pqaWBmaWlsWm1zlq2kvIiGZ1tvZ11aWlRIS05QSktQS1NRSUxBSkZKT19eYWZpYZe1xa+3sbm7s7DDxbSvuLCwu6uysKaqt6uMtaedmqeaTZmdjI6flpGmmKWVipOTiZCJj5GRnZuhl5qVl4efmqebrK+osKi0tNTU1NbTzNDT1c3Sz8zFwsnQvsnJysnRx8zNws/Rt6/DvMO5pLW5waKEcWVeX19aYllaZ1pRXVhPUEJCSEVCSDtBQz5BRz8/QTc7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlSZVZzkJCYgmdxb3l5g6GqnqaXjJqbl4uNlZGajn2Ji4SNioqKkId8hIJwf4eBhnuHcoOSi459cXh1bHF4fnF6bXhzbWmBcG1jaW1weGl3fH7Lv8Hfp21jeG5jW2JgSlBSVU5ZXk9dXE5QTlRQVFRcbm12gnGWrbersqWvtKmru7+wqrSmpLimq66gq7SjjrCtmpeYjI+SkYSOm4GNppGciYOLhIqJhIuElJWYl5SbkZyXmZqfn6uspaiirK3P0tXSzszT1NTP1NHOx8PU0cfN0tPT18zR0cTS1sXBzsfHwqi9t86efHFoYGVfWGJTX1tQUVRRT0g+QEZBQkU8QEE+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFVRTU5adYaFindsd3B9fn+hnp6hjIyYk5OLjJKPlYV5hY+QjYqKiJCGfoJ7cn6AgId6hHWFk5CIf292cmtzfXt3e3OCeHJrgHNyaW9xenlxer7Lmn6MsoR2coR2aGFrXUNaWltWZWNYZGpTWFxdYGNdY3d6fYuBmKmjpKCeoKelqq+4qqWzoqGtoaOtoaexn4immpOSkYmQjoiBk4lqlKKMmYSBhn6Rg4OTl62LlY2VmY6GkpGel6iwoqGhpaSpyc3PyMLM0dTS1NLO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsw8LLjXVxZWJhWlZaVVxRS0dKSkpAOzo7REFEPEJDPkdCPkJCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtPTEZKWHCAdX1oc3hygomAnZWdlIWLlYmOiYiNho5/eIOTmIqMh4iLiH6Cd3N7fYKHd396hpGVf4Nud3BtdX91eH10hXx5bId2dG59doR0eHudtYw7QYvFpX6MfGllV0lDZmNlY2dqY213W15maGtuaG6AgoeRi5ydoJyQl5ieo6OlsaOksp+hpZ2gqKCjsZyFnpKRkY+KjIqGg4+Ef5ybjI2ChIV5lH+CqZWjjJGJl5KLfpiLm5Krs5ibnKicp77Dxrm2xs7S0dLQzNLLyNTO0NXa19fY1NnYzdjbzsnZ2tHVvsrLtXp5cGdfXFRXUl1XRkdKSUVFPTo3OkBAQjpGRD9EQ0FEQjs/Ozs3REM3NTY1NTswNjc5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfJeRnYt+h5KDiYaEiYGHfHiFl5aIjoOHhYd6hHhxenuDhXV5hY6NnHmLcHxvb3p/cXuAcYOHgW6OenV3fXyCdH58hoevc1ipwraNkYJwbWI9XmhycHFwbnh2gWVob3J1eHF6i4aNk5GalZ+Vh4uTm6CanameoayboZqYnqWen6uZi5qLkJGNhHyHh4OFi46fmZOIhId+bJl6hJiGiJOMjZSMhnyciZSQrqqUlpifmaevtr2prb7HzMnJzMvQycPSytTX2dfY19Xb19PZ29XQ2trR1sjUy5Z8fWtqXVxRVVRhSUNGSUg+QT49Nzo9Pzs9Rz0/QUFBREE+Pjo4N0RCNzU1NDc5LjU1NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw5OUQ+Q0dSal5tZGJma3aAiHGRkJqAeoCNfoKCgYN+g3t8hJiNh4t+hYaAd4J5bnt7hoF0eZKejqB2jnWCc3WBfXOAhG+BkIJvkoR1fIGFenaGe4m3xaTBybiBlpuPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aUlI6XkIOJj5aZlpWlnJeflZ6TkZeinZmrlZCQioyRgoyEiIiBhY+RnZuZiYaMgYWYeoiJn5eQiI2Ki4J9oYmRjLyhmJOYmZ2ppqaun6i2v8DBucfKzs7FzcnR1tXV2dXX29TX2drb19va2djO28aIfXxpa2dhVllXV05MRU5DOz09PDg6Oz05PUA2PT9APD89PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0lQXVtTVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9YZWFdW2h0enlsio2Sd3Z6int+gH5/fIR6foKRiYSFeoSHe3V9dG18fYZ+c36SnpGeg5F7hn54j354iopugpqAdJmGfoGJhHt+kHqPqY6Pw6G9i5yknX2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJKFiIqQkpONnJmSk5CWjYuVn5yUoJSRjY2Pi36Pjo2Kg4iSlpqenoiMlZKdkYGLf6WZiISNgoWEgaWGioy4mJ2RlZaiqKGenp2kr7e6tazAxsrQyMfMz9PT0tjT1dfA19jZ29ja2tnZ19u4e3x6bmtoWWJdVFBPSURMQjw8Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDpEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODY4OT89Q1FTUlheVVhmbW1taYGOinFyeYp7en98f3uHenx7i4aCfXSDhXlzenNtgH6EfneFm6KbnZSSf4yIf5iHgJuSboiohXqhi3yRjYOIhJx9mpCKjKOioJCkr5+LkIuFi4GThldyrYufq5uPg5ibj4+OXIKikYKMn5OUjIaIi5KSi5OTk46Lj4qHlpqcj5SWkIqRk4aAi4iRjIqJnJaYoqKGk52WoIqJiI2bkIOIjn+Dh4akhYyRs5idkpSXoaGempKcnqiyuK2mvcLHzcjGz83QzM/X0dHVrtbV2NrY2trX1dnZoHKAd2poX19aVVlZQ0FJQz8+Pjo0OTo7Nzo7OjM7Oz89Pjc7OToxOkc9OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI6ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J6bWF+koNvbXeLeHl/eoF8hnx7d4aEf3NwhYJ6dXd2dISChH5/kqakn6Wil4qdkJSXi4qol3OKso2EqJKEmZOFmYyilZ+YkoibnqOSqbCfkJSQjY6IloxujbeFmsTIspuhpZucmJaQspFkpM3IlY6Gh4iPkoyMkpOJhYqJhZaZmo+PlJOGlJeDf4+LmYeNkKqXlqKiiJmelpqIjoaXl4mEjoyBf4ePpIiOk6ial5OXmaGZn5mTnZujs7Smo7zBvsfFxcnIycLL083N1KnS0dbW1tja1NLazoV1g2tmYGBfUUtWXEJCR0M7QT04Mzc7PDo4PTY0OTo8OjgyPzk5MjpJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRKUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJlg0d1go58fG1+iHh6fnqBgYJ+dnaAgntsbot+eXx3eHyEhot+i6O0qKSrs6GWp6ClpJaVr6KDkLiVkrOajaGgjKSbr6KknZiQp5epma2wpJeUlZSQi5ialqDAjqPJuKuaoqWtmZGbnLKdhoWoopyYhYiIjZSLi5OPh4CGh4iSmJSMipOThpSYhoSRkJxzkJiylZajoYicmZOPipCKlpqJipaNhn2MmJ+KkJCcmpmTmZiglKGdlZ+bobGto6S3vrPFx8S9w8O/xs7KydKnz8zT0dDW2NLP2Lx1fXlgYldiWFJJS09FQkNENT47NzY6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2Pz83ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SUVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER01cXFlKaGE7SISLenpthYZ5fIR4gIWBfXB4fH18b3ONen2Be3iGi4mGhJKovK2ps72wpa6zs6mjorCtipq1naO5pZWtpJeprbempKOfmamYqqSvsaqamZyUlZGYoJeau7utyqFptreqsJWYnqKrkpe9pF6qsoKJiYyUhpB8jo59g4aOj5SUiIeSlouPlY2LjJeYkZuZtJaVqp2LnJSSjZCSi5iaipKdj4uKlp+ijZWNl5mdk5yYnpShoJScnaauqKKks7irwsjEtrq9vMXIyMLQocbJzc3E19bQytOjc31sX1xVYVNRSEQ+PENBQTg/ODc0PkY8PDY8MzUzNTU0NTRCMzk6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZkhhYGJwSkCLiX+AcoaHfIGJdYKKg35tfXx8fnB3h3eNgYd7jZCMhoyaq8LAsL3GvLO0wby0rKuztoyosq2tvaubu6Oorbm4q6amoqKko6qvsrGqnZykmJuYmJ6ipqWTo7mvqL+8rK2yuaWjp32IhpytvbCCi4uKkIOPg5GOeoGHkI2OnIiIj5eNipSXlJCalpunmrGakaudjpqPko6VkI+Vlo6QoJCIlZykrJSWj5ScnpSgnZuYn6CVm5+op6SipLCzpsDGw7Cwu7bFxcO/zafHw8fDvNXQzMTKinZ1ZF9dYl1PTENMQEVHPkE/Qjw6ND5BPT01PTY+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNCNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVKSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGhGX2lnW11ck4yMiHuHi4aDjHWGkIqBbn57gX5xfoF6lHqSlJSYkZOVqLTHycDCzMLDuce8uq+rubuXsra6ssCvpcCjq7C8vKquq6Ojnqesr7WxqZugqpyinJafsLSnjKO6urXBu6uonLKkpKiUhI6pxMSkgouOh4iEhpWUjHqDjJGOkaGMjJSRjoeXoJiTmZWWpaCunYyqnI6Wj5KRlZWNkJSRjqGThpefoLKflJuUoKGZpJ+aoJuglJmfp6Smp6SvraW/w8KuqLe1ycO+ts6yxL7Du7PRycfBtXd7b15bX21UTklETUtLSkBBPUJEPDVBRDs6Mz04QjMzMjI2M0ExNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmdcTWVcZlRjapqNloqLiJKPhol5hpOQgXKAe4x/d4eCgY95jaGWqJqamLu+ycjKwtLJysLNvcGzrby/p7q/vbzEuK3BqayzvL2qsKqkpaOsrrSutrWgn66fpqKZo7S9qZyovMGjtravq5OwrKqsloaaqqelkYKMkqSViYB1iZF5hY2RkJ6fko+Ui4+Lk6OZl5uUk6GeqZ+RpZqMj4+QlZaIfI6VkpGimpWgopy1ppCgl6Wko6WfnqaYnpWXnKWjqKiisq2ou8DEr6Wzt8zAuq7Ds7u9wbmtwsLCv5lwe2NbWV9eTE1OS0dEQ0hCQUFESzo0REg6OzQ8N0YuMTIzNTJBMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5sSV9YYVpkZViej52Ol46ekomKf4ifkoR4hX+Ufn+QiImQgJahmq6no5jDvsnEyMbTzc7Ny7zCt7C6vbS9y7vDwba3vK20wLm8rq+ooamotq6uqbK3mp6soqiinau3t6qlr77Esb25s6eqtLOtrZaVpa2ooJGOkrHFp5WNfZGVfYeRmI+qmZeTk4+TlJKlnZOdmZOgoaGcmJ+Yi4yPkJ6IWo+Wl5KWpJlmmaOes6WWopasraynnJ+ml5iWmJWho6imn7Wrqbq7w7SmtLXLwbiqtqyzu7iuqLi6vLeEb3BcWlZXUEdMVE5LP0FIRERIRkY4NUZNOz43PkFLLjMyMDI1QjU1UFdOPExGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhWPD5AQkZCc0ZpSVJmZE1GppSclqGXqJaMkIOHpZKIgYeCm4ODlZCQlI6aop+vvq6hx77GxcjHzs7P0sq+u7axu7u8v8+1xL23ubezsrazuLOsp5yrrLmrqaivr5ejrqWopKW1wbCrrbS+wrnAubOnuLS3sq+VpK2wr6WLk5SgjXPBmX2XmYSOlpqLsZWamZWSkpmYpaOVn5qVmaicm6GgmYqMj5adYEqWnJqUmaSXVJawn6+cn6WVr6+tppuhppSTmZiOnZ+moZm0qaqzvLy7q7Cyx8C4pqyrrbGxo6GysrSlc3FnXlxQUk1GUVFQUTtIS0hGR0FDPTlLVD9BOj1FTS83NTM0OkI0NE5XTjxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NUVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oWDw6QkNAPVJFV1N0YlZGSKuXmZ+hqK6YkJeHiqeWjYiShZ+HhJ2Xjp6gmqOktcm0qce8w8TJy8nIzM7Gvrqzr7q4wMHNtci6wbm1urKvr7O0p6Scq7S1q6qnrayZpK6mpamsur+oq7e3vsHAvreyssOwt72so660rbqmiJuXpZp1vp+EmJ2Okpiai66WoZybl5SanqCpnqegmJmpmaGnnZeQjZGdg211k6KalZyin5CusqKrlamqmKqvpqWhpaqSkpmciZWcop6WsKepqrq3vrOyrr65tqCjp6ilppycrampjWZoY2BTTU1HSU9KVUw9TEVNSUpAQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNDOjlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc8Oj0uLlNhTVZIfmVeSEaslJyhn7uumJSei5Oqm5GRk4iqjYeinoyjrJSjpLbHvbTCu8PCyMnFws7Iwr25sq+5tcDDyrbGssG8tbusqa2ssKOjmaq1u6aqp6yqnaivqKSrq768qK28tLe+xry2tbjAsL2/s6m1t6y/pY+il5Chn7yeiZqgmZednY+3nqicpaOam6Cap6WyoZqdpZynqZ2YlI+Um4uWiYykoZScop+gtbClppSxq5qrrZ+fpaSqkpaVoISQnp+clqmloaG0tLq2rai1srKenKOlmpeVmaqhnnhjX2FfTElGSE5RSU5FRkZCUUpIQERHQVZTREg8QUdRMTtCNzpCRjc5XVlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdFqJeknp/DrJuXpJeZqJuVmpqOqpaVqKaVrayZoqu3xcK8v7fBwsDIxL/Nxru+ubKwubS+w8i1wLC8trq3p6Srq62hoZurq8Sipaispp6rr6yiqqi+uKatvrC3t8a3tLi4vrG+wLa0srWwvqOWo5WTmpOtn5ChoaSio56QvqSonairnJygm6afvaKYpJ6iqaugnZWNlZ6TnoeOhI2TnqSgnbaspp2Xs6easKignKufoo2alZ+EjqGanJKlpJqYq7G1saqlqq2snJigoJKPkJapn5RpZVxiXlBKSEtPTEhFRElAPU9IQDtGSUhbUlBLPUhOVTRCRjg+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLTBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZmNYTqKbo5uexaugnqudnK2fkaKelqSfpqqrl7axo6mztsXCvcC2wMK8ycK/ysi2uLW0sbS0t8LGt7+xubW6tqCnrKusnp+gpaTBpaGqraCkqa2woqeovbWlsbu3trXDsrK3ur6yw8C4uK20tbWjnaSUkZOgrZ+YoZ2oqKqimsKsqJ2rrZqanZimoL2hnaSYq6uspqGZjZqfkp6Ijlh/lp+moaC5qqeUmbejn7OioZywmKGPmpWego+gl5eOoqOVkKWus6upoqKlpJWVnJiLj5KTpJ+JY2dcZWFNSktLT0ZFQUdLPj1JQTk5SkpOXVFRST1MVl05Rkk9RE1JOEhjXEtDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YVM2U1prV3NIRTY9dWVcTFCeoKCYnsOnpKKzoJyyp5Kqo5+jnq2prJ27samstbHIw8HDs8LDvsfEvcTKvbCxtq6xtbDAxbW6sbG6tq2aqbCpqpufpqGnwq2crbGcqqKusaqkqL23pra7va+3w62zs8K/ssazurertbauqqKmlZWUoquhn5+Zp6uvr6+7saWfqamZmJeToqS4oKGjkq6vq6SlnpGhnpSdjpCNlJ2ao5+otaenjZm1nKOvm6CcsJGhlZiVm4CSopaQjp+gk4umrLClp6KdoJ6SkpqThYuSjZyfgGRoXWhmS0pMS1NBQ0BJRzs7Rj44OU5NVV9SU0o+T15ePUhQQk1MSThOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8d11eP1tVX2dyQDg8SJZ3ZUE0n6SemqDCp6OpsaCjtKmVsaumoqSyrK2pu7KtsLW0xr/ExLa/xL7KxbbAycK1rLWpsLmswMS0uK+ttrqlmauyrKqYoaeYrbu0nKiwm62frrWyp6q7s6e5s7iyuMCqt7LDvbTFp76urbe1qaesoZaWkaWkoaGXl6Sut62xtLafnqikmZOUk6Ogt6OkpZWusbGlqaWhnpuZmpWYqKCfmaKer7Oipo2Yr5qlrJibn6eTnpCVmZqGl6CVjZCdnpSLqamqoqehmp6WjY+ZkIKGlYmVn3plal1sa05RTk5UPUNBTkM7Okk/NzdRTl1fUlZRQldgXUJKU0hWS0g6VGRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzkwNnBbYkgwNUpxalZDV0aMeWZDO6SknKClv6aorq6gqbWqnbevq6OqtLawsLi3sLe4t8S9w8e9vMPCx8G6wcbBuqq2pa27rcHDuLiqrbK8o5Wtsa2yl6aokaq5qqGnsJ2roK+0s6qqt7Wsu6yzsrm3rLiwwbq9v6bDqrC2rqmrq6admJiqoaGgkZegsK+zq7C4mZupn5mWkpemoLeppaKir7Gzq7Gnq6CcoJ+bnqWdoZido7SwnJ+RlKaaoamclqSimJqMlpmUlpeelImSm5mUjqmpp6CjnJmbk4ePmYt+jZeGj5tsaW1ibm5YUVFaVEFDRFVAOztIQDc6WFBkXlFXV0VZX15OTFNPX0xKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE3NDdnWWFGKEA4bX1oXFY6iXtjQz2on5yhqbygqq+qo7G3qaW0squhrbW9r7O4vLu9t7bAwr/JxLnEw8DAucW9wbivtqirt7K8v7+0qq+yuJ+XrK2orpipqY6nu5+lrbOeq6KxsLOsqraztbytsLG1rLC1ssC6xbarvK+xt6ytqqOxpZ6lqJ6jlo+Yn7Kqs6mqspmdp5ualIygpqS0rqehrKytsaezq7Gpo5ueqKSelaGanKi2qZiakpKfmZ+hoJKtoZuaiJeZjJ2anpSLj5eXmpenpaOgnpeWlpSAkJWEe4+ThI2XZ21yaHFzYEdZZlZEQ01YRFo5SEI1Pl1RaFxPWl1HW15eT01TWGRKS0NcY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVYxNTE9YFZfOClDM1lVXGdLNYx6ZkxApZmfpKu2o6yopa6ttamvs7mmp7C3xrext7/Cwra1usW+zMW5w8G6wLrFuMG6s7Ssqrq4u7q+tauvsbeZmKirq6ycrquPq76eq6+xo6qfsa2zrq61sbm3qq2usae1sLO6vMmyqrW1sbSwrqags6CaqKygpZWWmpmxoq2gpa+WoaSamZKNoqWnsqmhprGsqrWlrrC0r6OZna2nm5eem5qsuKKYk5GPmJyhmZiVrqGfl4OWm46enJqXkYuUk56ZpaOjoZmXk5KWe4yRhXuNi4OMk2xueW92fWJGYGpaSUhaWz17SkdFNkFiVWlbTVxhS1xcWlJTU2JhTEtFYGFgUE1JUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4rQS9KR1BbRzNjWVRMRZqWn7CosamspKOurbWot7O3o6y0t8m7tbu7wL61tLfDwMzHu8S9t7+/wbjAvbK9rqi6ubi3wresrrK6lpenr6yopLKplK+7pKyysqano7K0sbKxtbC3s6muq7KmuK+1s8TFtqm1tauwrqmnoraen6awoKOUm5mUsJ6nm5+pjaminpuVl6WlpLenorCzq6ewp62vtKykmaGsqJycnZ2VqrmclY+PjJido5iRmKikoZmGlZiRnZyYl5aIl4+Xm6idpaGSlpKQlneEkYZ8hoKEjY1ucXh2fIBdTGVsXEpPZF0/YntHSThHZ1dmW01eYk1ZWVdVWFVpXU9QSGFeX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZzI3J0ZhTFYlLUIuPUVMUTwzcmtMRUSRmaStpKytqqajsLKyqrewtZ+rtbnJua7BvMO4s7K1wsPPxMDCvrW+wMC7v720xKmqubG2t8C8r6y0tJ6hp7GupaaxpZ6yta2qsrGrqKi1uqy1srWrtK2qq6isqbmtsrDHv7ilubCpra2mp62wpaSjrqOonJ2bmq+ZoqKio5Csn6Ogn6GppqW4pKu0tKSqq6msrrauop2jqKucoJmbk6S1mo+JjoiRo6GWj5afo5eWh5GWlJ6bmZaVh5iSlZmnnKCgjZOSjpF4fo+FfX19h4qKcnRzf35+XVNjbl5OWmddRkSWW0c6Tm1YYltOYWJOVlZWV1VZaF5RU01jWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozRGQ7NipIZEhKKzpJPzNDSVMsPo9sQEhJkJqoqaGpsKSno7O0sLS0sLCgq629zLuuwr3HsrSutMHD0cTGv8GyvsLDvL+4vcWorbestLi8wLGssq6ho6euqqilsaOqsKquq7Gurqyrs7unt7CyqbKqq6alo626rauwwrm0rLmpqaitqaexpamkoq6pqKKenKKslaWdmJ6ZrJ6ip6ihrKajray2sLGgqaOgqq2wrJ2ep6epmqOYmZCgqJiGhI+Li5+gkIyOl56SkoiJkpahnZaZloaXk5SXpZyenYySkI6Kf3+IhHx3gIeFh3V0col3bF9ZYG5jUXNxXEs7hHxGPld1WGBZT2NcTlVWVVdRXGJfU09PaFlXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mzk3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSzAuSmdERjg8QjA1RUtYMUCUXUBORpWWrKegqbGcp6iwtay4ta2qpKqqvcm8sb+5w6+wrbPDxM7Ow7/AtMDDxLrBtMnErK+3rrO6wL60rq6spqiqsammqbKmtK2qr62tsa6yrbS7pbezrKyuqKugo56wt6yqrbm2pLW1pKqnrKyqraCopqexsaSnpaGhq5aqoZOboKaepKOqo6yinqaxtqysoqWjmqmrrqmdoaWkpJmgmZaPmJ2TgYKQiYWdoI2LkI2ckZONhY6ZpZuTkZuMk5KSlKOanJqLj4uMfIaCgoF6dYGEgX51d4uih3hqXmBuZldmh2ROQGeSTEVieldiWFJmVU1WVlVUT1xdYVZMT2pXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI7OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREh0JJSUSWkK6koaqvmKmorbWqtbGqpauqqbzAwLm6tLy1prOvw8nL0b/Bu7m/v8O6wrrBxK6xtbK0vMG+s7Gvraysp7eqpa2wq7iuqLCvrrGrtaq2tae0t6uspKqqnKSes7OpqKSztJ+1raGqqKuoq6efq6uoubapqqqpoqmfrZuRqqGdoKSjpqKqnpymtK6npamipJilpqeqnKKko6CZmJ+Rjo+ZjX+HjIeEnp6JhoyMkJCTj4WIlqOajo2bkZKQj5KfmJmXjYuEgHSHgn9+eHWDgHp4fn+InY9wcWZncXhcYXSIak9dmFZIbXlVZFZTY1BNVVVVUU9YW2JWSVFqVFZUR1BZVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTIzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDJAZj1OWD9DLD9MVF8vSWs3UkY7lY2voKWqrJmqo62usrSvqqSvqai7v7zBsrC5raK2r8jHyNHAv726vMO+u8TCwL+vsrOztr28wbGytKu0qaW2qaWts7K4r6KttLGvsbmrua6qrrerqp6qq6CjobWtqaGfrrKhtKqeqKero6qhoaytqL2uq66toaeon6yZj7ChmKKgqKaep5uZqbCpop+soqGSoqKjp5maqaaYmJmdj4uHlYh9joaEhaSWhoOEjYiRkJKGh5ahl4mRnpGTkI2RnJWYj4uGhnh0gYB9dHh6gHt0dHtqgoikdmleZWuBdWeIi3xSVnBfS3hzVGRTUV9NTVNaZk5NV1llWUdTalJRPkJOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaDozOF89YWQ/RjFDUFtbK0hQO1lDM4+OsKCkpaqjpKOsprSzsaiksKequL/BvbGpuqqnrbDJxsjQw77Avbm/wL3JvMK4sbC1srq8ucCztbysuayjtaenrLG2uLKlp7m1rbS8r7ylra22q62cqa+kn6SsqqicnaqypLOomqqnqqSpnaKpp6m9q7Swrp2ppKCvnJqzopalm6Wkn6WamqiqpZ6aqaGbkZugpJ6Zl6mqkZmakpCLgo+FfpCDgIifj4eBf42Jk5CRhoOVm5SGk6KOlJGLkZuTloeKf4Byenl+fGh2fHt1cXF+aoZ6hYhkX2djcoV7bWd5XV5WQld7bVRhUFJZS0xOcHRdSVpbaFlGVmdPQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOkrCZn5+ppKKhq6S2srGkqbCmrbnCvbewpLmsqaiwwsjJzMK3vb+1uMG6yLbDtbSztbK9ubq9tq65tr+sorSmqquutbe0qZy5u6ixvrK6oK60tqmrn62xo5ylqKmjnZuksKavoZ+qqaeiqpyjqKCtvKeusa6hqqKkrp6erKaYn5qhopufm5mjqqKamaOjlZaUn6GWnJamrIyfko+RjIKKgICPgXualYyJfYCNiJKQjYuHk5iRh5SkipKRh5CZkJSBiH16bH12eXhienpycHFzeGqCdWuCZ2NnYW5zjm1iam9fcEFdeWtWXk5RUUtJTVNZVk1cXmxXRVhhT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNSXT4jkZarmJ+Xp6Khn6ikt6+toq+vqKy4w7q0rqC5r6uns7rHyse/uMK9r7S/t8S2w7KwurGywLa7vbequbi+qqS1p6iqr624r6iYuLykrb60tKGtuLWnpqiws6CepaWnoaWZnqynqJ6gqq+noKaXoqifsLifo7GvoauhrKScp6aompubn6KVnJyanammlpueqJGYkpmdk5mWoaqRm4qOkId9h36Cjnx8oY2MiXqEjYaMjo2GipOaj4mVoImQlYKMl42RfIV8dHB8cXN0YHh4am9xcXBrf3NkemxoZWNhZoeAYFtyanJNToBpWFpNUUxLSFBSUEdNW19vVEVZWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXVs1KJWbpZiclayfnqGkobersKO0s6mpusW3s66huK2tq6+1xcfAt7/CubC1vbe/u76wrL6ws7+yvMK4qru6uKeotainq6+rsq+kmLu2pKu6ta+esbmvqaWnr7KcoaSgpKOglpuvpqGfoqivoaCik6Okorawoaaxq5+so66YnaqlqJ+Ymp2jk5qbmp2lqpqbm6WVlJeVnI6Tl6KpopGKi5CGeoR+hIt6j5eKjYd6goiFio2PhpCTmIyOlpmLj5Z+hpeMj3qBe3Bydm5vc194d2VsbGxqaoVuZnJpa2VoXWRzgWBba3ZpWkp/XlxYT09LSEhSVUczOV1ebFBFWVVZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVF1oRC48MmRXLDKUoaGXlJuqnKOhoqG3qq2gu7elrL3FtLGvo7WvrKyutMPDvLO/urexs7m4uri6r67As7O4r7/At629urWlorKpp6mxqq2xn5m/taSntLWonrK8qailqa+smaKnnKSllJegsqSZnqOoqZyin5KkoKS4qaSnrqaepaGok6CpoqGhmZudn5GZm5afoaqbmpiglJGUl5qNlJOkqKSQiYqPhnqEe4SGfZ2NiouHeoGFiImKkoaXkpKLkJWUjo2Ue4OYj4t3fnxsdHJsbHNhd3VoaGpnZ3CHaGhpZGZpaWBqY2poW2Z7Y2BTdFRcW1JMSkZJT1NAISpoXmlMRFdVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnUCcynqKkkY6kppqdnp2jtK2nqrq2p6zEwbixrKO2rqetrrfAv7yywrewrrK2trm2tq2qvbOusrG8v7euu7uxpZ+2qqWls6eprZ2cwKunpa+zqqy1u56pqquxpZieqp2mpJGYpayimJ6kqaGcoZuWn52ntaawqq6hoZ2eoZWgpp+hoJqbmZuSmJ2TpZ2soZeWnZSTjZWXi4+Ym6mfkomKi4l5hXeBgoGdh4uCin2AhYiHhpGEl5SQjo+RkZGMk3uDlY+Gc35+ZnlvamprZnRza2NnZGR2gWJlZmZmamlja3JbX1lebWRhTmlYWmBWSkdIS01SWD45X2xoSENVVF1bSUlHRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWUpWYmZAOjNCaEglNZqjoI+MraGXl6CWpLOxorK9tqGxxry6srGjt6yqram4vLu6rcCyrq6utq+zuLOpq7mxr66ztrq2r7i9rKaetaqfoK+jqa6bob+gsKOusa+3rrWera+traKZnaeppZ+Vmqeln5mkoqidmp+ak5yerK+muqiuoqGam56ZnqSapJ2XnpiblJifkqiVqqeak5qakoyVmY6UlJqppo6OioqPe4JzgYGKmIWHfImKhoaKjImShZWbk5KPkJGXjpB/gI2Og2+Bf2Z5bWdraWZxcmtcaGNjdIFiZmdqbmxnampobl1sbHNwYFRjaWNmWUlGTE1PWFJRVWFlgFVBV1NZVEdJRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJjSRoZuNj7CdmZOhmqmxr5+5v7WgtMK7vrqxprevp62kt7i3t627rq2qq7eqs7euprK1sq6psLa2sLO1uqapn7WonJ2ooKismqe9mKykrq+2taytn7GtsKmim5yjq6iclJyno52aqaKklpqfm5CbpKqrqryfp6SgmJqZnaGPa6KWmZxwgpWao391kamnnpSUnpCImJqAloqhkHmHlI2DbWl/d4NxbIaLhn2FjIdxXmNhZ4SYhmuLjpSSdHeLhH6DkIBnh4BndWhlV1xoc21OUGpjZ3OFaF9lZm5tal1gYYqPg4RlTktEOUdUaF5KR1BQVVVMSFJgb3RlRltRVVBGSEVDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QUBAPTI4QEU9MSwrMDg9RzcwMS4qLiovNTY4LCMxJzIxNDoxNzVYgWwxNk9rW05cS1tmYj5HMVFkPSoui6SZhpWwm5uToJuqraqjvcWvqbfCt729raa3sKWqorezsrKxuayppqy0pq+0oqm3traop6y2sq60rbOhqZ+zqZ2ho5ulppiruZSlpa+zt62upamuq6yloZ6coaemm5egpaWbm6emnZOenpePnaeppLawpKOinZaYl5ejiKGOkpqGoYeTnKB/pX+lqp6SkpqRiIRzeI2OhYihdomNaZeIZn5zeKBviIeEfo99f6GgoJmAfYiedIeOdZuKbIeBg21pZWN6bHJhU4VtYmxpmHFYaXFwiFheaVtsbFuIcm56coVnhoRaX0dOP0dfTUVSVlZRUVNXVGddTVZIUlJPRkhHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcvKIqnl4Ocq5yYmJ2fqqmnqr/Dr7G6vLfAv6qlt7CprKSytK6us7eqqKWwraW0sputtba1pqeosrCssqetnamgsaefo6KZn6GarLOUo6Wltr2mraerqqyopaGgmKCmo5mZpaOkmJykqZaUopuTkqOlpqG3pKSgo5iVk5eSnIivkJeUiamLlqGchbGAo6ydk5mdlHmC1KiAh5XBm8d5eLGlt5dlgMCcv3mEhXqShHyQkJHKcpe8nMV6crWmu5B7gG2WsauweWhsWLGubmVpvZK8bmd6b3KP2H5Ta2O2sn6BcpRzmqGqkFdPV2JPVk5GVVtYUVFTjFxXW1BBXERRTkVISTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjpCPD9BODpKPjUyKjIyQkUvLjMyLisvKC0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGMp5OBp6qfl5yepayyqbDCvrK1v7W2vsGrp7SsrKmmrrOpr7azp6emtKWnuK2cs7K2q6Wkp7GtrLCmqp2mpLCioZ+dlpqenK2rk52in7O6o6qpoq2upaGcmpqip5+Xm6egn5iep6eRnKaak52hpqKhsaOfn6OWlpKXkpmFr2tqio2qfmaDlYatZHCdnZSZppRxrqGkfni7fWuhkHaxX2q0W6WAZZyRYGeDe2d/anhrqWW+cmemjHWxanyxeHSSlGNubaduW4ShRWhmh5ZFdZxgfmd8pKeCWl+Mq2iAlXh5aqc3Sq9cWFNsZFtLTlhfXFdWO06JT1dXL0lUU0pDRkY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzAbkKKVg62npZ6jpKqxt6y1vb+wtsSyt7rBpqmwqq6oqK+uo7C6r6OkrbKjqbinnrOzsKOloKmsr6uvpqeeo6Gvm6KblpWWmpqrpZWaoZ+0s6KrnKOtraCemZagoqicmJ2jn5uZoaakj5yimZegn6qepqagmqChlpWRlpCahbWbtXiFqZm1mXaGs5u3fpOWlqmUfmuCpnuChoiTlJN3q2drsVyreo2GlHSJco+HgH+IkJd4goGLmIuDoI+EsHZ3n3FsbGx8i06kWEhiYpl+Y2imYHlydVOTh15QqW1jcX6HgGKcLlGhb1tTa2hgTEtbZFhcWkI+sXlXWEEjTWhGQ0VBQEExOT44ODo4NDs6OTw4OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzMsPjgzMR8vMi1EMT08U31uMytYalxPWE1fZ1c3SjhhVTUwG5SglYizpqahr6mns6ypu7bCsLvBrbi3v6msra2tpq2xqaCuu6qgp7Sso6u0pKays6ejop6nqrGnsKelnZ+frpWemZSUlZidrKCZmaSota+iqo+qqKqbnZWXoKWomp6cop6bn6Olo5WbnpeZnKKpm6aZnJuioJeTkZOTnIPVk5m5cLDBfsWGfNaUm7t8mpWlj42djaR7joikg6WCeqx5j51Wr3qIfp9quVq5doaEfqaClHuYeqp4jZ2PerFujoR0kbyFb5RQr6fFilGgemNgqmJzcohtl4hgU7W0yIWAiXxjpDNCnXZdUGppY1BAWGdaZGFKSE1uTlxRT1lmWUNEP0U/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo7REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVA3MSWbopSYsqioprSqpbSppLy3wbC5v7G1tLqytKexr6KwsqafrbWnmqe5raKvsJ+ztLChpJ6fpqmwqLSoo5udnaqVmJeVlZSWoKmcmZanrbCpo5+PraOolp2Wm6GloZihoaGhmqGip5ueoJ6UmJqmoJunlZubn6GYkJKUkJ2Ism5otXGrh26OpnK0c3K2e5qXpIuPnY2if5Ghpn+xdoOR0tJ2XK57hX+kb5uqpmuHhX2tfZiZjnuxcZKejnizZZd0hJ5vnmaUUciLWsJcn3liX61gdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2VYQU9rYGxoUFZHSTk9VVJaV1hJQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFMNjIwop2SpbCso6u8raa0pqe2u7yyur62trS5uLKltLOgsbGinquvpJemua2ksbCbtLiqoKWeoamksaesqaOZnJmnnZWTl5eRkqGmn5WTpaqwpqKWk62gppKUoJukpp+VmqWmoZqjn62ZoJ6ekJWboZ2cpZWdlZqin5WYlZGbhax7d6h2o42IhqlvrYqCp4OYmKGJkpqLon+TmomuhX+Cs1xys1KufYKCpH9x1314hX6PnYaamXavhoeRnId3tGGaZZqCgpVtklqwWEuadZh5ZmCtXnZ3iGiYiGxdr3eVno94bDV5yK6yX0JUb15nYEVQbGBwbVZWTS5mZGlTWVA7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Njw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSDo5OaCelaC5sJe0wq2os6ipsrq3s7e+ubextLq0pLeyn7Osn56oq5+Up7WrqK+xqq20pJupoJ+nobWmpqmimJ2UpKCTkpuXkZShpJqSkKatr6ahlZmqoKOPkaGZqKSglZmlqJ2cpJ6tnaGdoI2TnpqdoZiZm5aXoqCUl5CmnYapfX2leKGOjYKqcK2LgaeGlp+hiZeXiKOCkYiUqnyAi514b7FaqIKCiKB5dNh/doh0qIGOm4ySpHuUj5+Ee7JenWSgfoOVbZJcq1tak4CRf2hnqmRye4FrmIdzXqtaiaCOa29lT0pDoVxbTHRdYmdOW2FfcnNfS1Y3SpuVWUdFPUdGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANS47PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MyPziinpqawKuYtMKuq62ppbSwt7C1vrm5sbC1uqi6tJ+vpJ2kp6eek6mwqa+ptKuqrqGYoKCmpKO5oqKroJabkaGflJOemZOXnp+QjIyosLCnnpebqKagjJKkl6iqp5SXqaeenqCiraShnqKMlKGYn6CSnpeclZ6hlZaOq5yPrm1ytHOpi3WKp3O0eHOzgJGko5Kcjomkh5B3uHCNe4uiamu2WqGFZZeXaaGip22UcrR0k5l+smqFkYetanWzYZ1mom+Hk2uXXK1fTaF8h5FSc6NseX9+b5iHcl2vVjycd2ZUb24uXKdPY1NrZWJtWmNdYXB7Y1RaUj4/bnAzQ0JAP006ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4ppybnryhm7LArq2rrKe3qbevtb+0u6+ut7aqwLWoqaCapaOhnJGqqae1orKnrqmgl5ynn6SruJ2irJqVmY6jopWMnaCbmJyfkZOUqrawqJmVnKypl4yUpZmlrKKRlqqyo5+epquxmaGjj5iilp+blpyWoZOdqZyUkKuZh9SSmrtzsMOAw4Z+1ZabuHiIkJiMl4uMp4h6pLZ1fnd2woKasmCDunnAfHW4Y7WCjIepfZWBq6lxe390vIinoGmdYaaOr6F+jHSHqn2+b3O8dLKDdXiBim6aiHJujaR0vV53fVphebxrWlZcanleamFlZ2NteG9aXFlDQUFzQENGKzVHIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPUU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaebnqK9oZeyw7Ctqqussae3r7bEsLiwrbmurcCwq6OhnqOhnJuQqKOqsqS0paylnpWaqpimrLicoq2XlJ+PpJ+SjJyinZedmpGWkq+5sqyWmKSop5SQlqScpKyekKCoq5+an6ijs5+jpY6nopSimpyYlaOYkK+gkpSpnoSQmLZ/j5GMt5V4gpOatXdta25zb3mQhY+KdJ/Bu72ae4GxqHGAc5G5g3yGhoyHjXyKh42YfKS7ub2cdHq0o3R3l3Z0sHWZnmaGao21dHJxd7aMXn96fYlog3luemOLrHB1hX9YW6dqRWVaVGZgY15jUWdncGx1Q05QTUQ7Wk0/SjM7MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQUtOR0VPRj9HPDc+NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JXOCpPXV09KzpWVSc+OzynnqGiv6WWtMO0rKuorKupuq6wxa2zsq22prO4q6mhoaWeoJ2Zk6qjrKmltaenn5uVoKOdq6S9pqGplpObkKGbkY+hp6GTnJeUmJSxtbetmZ6kpKKLkpKmm6Wqm5WppaWbmaGopaekqaGRrZ+WpJ6Xl5edno+vqJSbpqGNan1pm6Z3h3J9mY50eWSHe72+wLpvk4NylohgcmpaXpuJYGOIj5VrYICVY22dd2KVbICalZRlXmBjcJqKaXKLfYaVZ2t/cnV4fX5iW3d0gWhQXG2DfXuLa1hreoJzSkpvhnBOdE1FWF1nYUxbV2djX09bbXVpcVJRREVNO0dJPU0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVLT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF9MKDM+W08nPzI+qaCoosKjm7W6tqOspa6np7WxrMirr7Kqs6K9sLGmn6KnnaObmZmrpq6jpLSopZuXlKCbpq2ovaeopJSTm5WfmZKXpKiokJ2RkJicsLK/rJynnqeiiZORqZqoo5qaq6CjmZqjp6yjoKujmrCblaeglpSdn52XsKWYoaeZm5CcnKKimKWhmZuZmZmPlYFnbX1xd5KYlJKFi7WqjYaYlY6KjJiWh5SVioSTlJGJjpOUmJSYlpqgoZqblKCcjYJ6pYVta32RfIB1ioqBcYJ4eXZ1iX98impzgXSDdWV3fXdrb3ptYGNdcGhNWVpmamBXWm95bW1mVFBGUzlPWk1RTygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxKLDwtQLOhs6LAoaSysragqaWyp6WwtKrIqqyvpbSlwKazoJ2kpJyjlZWfqqasoqO2q5+YlpWflq2ppcCeq6OUkZuXnZeSlKGenqKnk5KZqKeyxLCbq52rn5CWlqidqpycn6yYoZucoqSvp6KlqJ+umJennZmZoJ6dnK+gnKGmlZeSl5OfoJSinZegjpaTioqNjpeukHyWnIOSgouqqYWAmZeJhJCeiHqEkIeGmpKIhoqWj5uXjZGYnaSWmZOQnI1/jmehs6+FioR2e5KKfXd5em9meY+BgIlqdYF5iHNpc397doOHgmt1ZHlmYGplY2Rma1lse29pa11TTFBEXlRFQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2JjYV9dXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRbRzU8LEC0oLmwv6yrrrKxoKqmsq2irLOvxK+pqqKxrbyis5ufpqKhnJiXp6WppaSlsrWelJOdmZmvpa2+oKuikJGdmZmUkZWhnJeonISfq6yjtMi0oKqkq5eWl5qmnambn6SrlJ6fnaCqr6qmpKuirpufoKCYpJ6cn5yvo5iep5KXlpyRo5iXp5yal2WCknxlfo2akGN5jm1oa3uSpKpqZZuYfWeGimVlaWh7jqGPa2eNmJGjd2tqi5mjn5hzbG16hI6IelhmXoaDXm2MioF2XGhzd3aRgIiCbXeBeH9zbXmEdHaJiI+DfGuHWV5sdGRec4lpa3xxa2RfUk5YSWRYQUo0Pkc3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8yWUM7Py49pqC6vbqvrLSxqqWora6wpq2tsLywqKajra6wnqyWn6OdoZmZpqqcraOlp6myrZ6Uo4+ir6W2uaWuoo6OmqGZk5KaoJmZpJV8pq6jqLTEuKWip6+fnZWeop6jnKOpqJKfoZ2hqrCrq6SroKqcp5+noKyWoZulsKSXm6mVoJ2akaOWnamXnX29g4hytHKEnYataHi5xLhxk6KjeqaZmXKrgnzLwMC7cYyjiIKffZeZiZ3AvYKXnZ6NncLBfIJ8k42aw8B9bKWyb4yBb8p6f5t2kIOOgXV5gIB5cXp/h3B3hYyTeW54lGNnYHhkYGWCY150Z2xkZFlMVklRWkhPRDJJRT9EQj4vPD8+QEE6OENDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAuI0ZbM1BZL1ZBQjsvOJajucO1sLDAqaiUo6+osK6tprKzrqmkpaavq5+qmJqin5yaqqahnKuipKikpLSknKKSpq2rt7OnrqKRkJmcpZKRn6GYm5+diKetpayuwMCxoamvqZaSn52imqKkqqOToKKdnq2vqq2npKSooaalnayokaOaqK2pmpyom6uglZaklZ+ilpx+zpR4eqSBeZWWm1+uj16Op4GioHynlptzq4OAr15jjap7qIeFoHWXk4izY4KrhqGOjbNqhK90fZeIt2GDrVqjzW6Qdnvae3+ZcH2HknZ9ZXqHdnZrfIdufYaRkX5tg5Bhcm1waGBgemRccWhqZGdgUlRTV11LT0M1QUhERDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1LMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaOqp62zq6ayq6uqo6qmr6mfppuZpZecoq+foJ+op6KloJ+wq5qdlaeurLCqqKuflJGan6SSj56lmJ6no5+upqyxqcDHs6ipsa6Wkp2copefqaqflaGfnZ2usKmsqpyoqKWiq5KsspaloqqqnaKlpKCun5GYppifmZOTkZegcYWMl3WFqIZxsX2ecqx+op+BpY+edquCfa1/nHOtf6yHhp92mZJ7fJd+qoiijJKMnX6re4mUkJ+Ae61XncV7j3CTwX2BlW11b4xtZXZlhm9hd25yb4mKko+DbpKRZnB1dXFhZ21lX29paW9nZFhUXWFaUlNEOUlJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXFtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1dARiEcRzpDMS4rsNPGxrK0oJ2jjqOioqyvtq6osaaoqqatq6umoaOdmaKVn6Wrn6Gln6ioop6dsKyXmpaop66rp6annpeUmaOhkZSgrZudp6OwraWttqu6zrKtpq6sl5WcnaKZnq6snJegmp6fqbOrq6ubraulo6uarrGhp6utpZikqaior6GRlaKjmZORhKRqpHWJeql0erJwgqaKmYxxiaCbh6RgYFKrhX+ug5t2rYKohoWfepmXhntmgKOJpJmGgqN9qX6CloeuX3ypVp6jkoF6o5+Ae8OvxYtyr7OzuXJiqa/CdGiMjJiOgm6clXFvenh5cG1nZWVycGZ9amNdV2BqWFlVTU1RTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjJQS0wjIEE5RDQsJ8LJ1dS/oZmrp6Cvop6wtLCuqayip6aoqquppKagm6SenaWnp6Ocq5qirKGjn6+hnJqSq6S1r66gp5qdlZOmopCaoqigoKacsaamqbKut8iytaqsqZaRnZyimaCls52aoZSdn6esraSwm62ro6OqobOtoaqzsaGaqKetrrShkZSippeakXuqbJ6Eh3WreXywb4KljImflpaglYHSuLS4yYGBsl9glKmDpYiHoHqYlpp4qsl0mqSVqKmRk5qNgZyKmsbGeWehgqV0gZ+Ogn2vXXC0YrB1S6OHbadHgpNkj5CekXxxmZWBcXx1fnxuXGZqc3FmgWtfYVlkblxfWUlOTUtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2osq2spaKcsrisqqGlmqikqquqpp+mppiqo5+uq52loKyanqmlnKe2nqKXk6mrtbKsm6WcoJSPpayRmZyoo6Gqp66ipaepsLXDsrOqraiTipecpZuho66ll6GVmZympq2csZ6vqaefrKO3rKGxuK+dmq6msbKxo5OWpqKYno6CnU54moF/n3qEo32DpIWHpp+dn5SEuHt7ebmCf8zGwrZ4m6GRi59+mpaXinaemIqkl6Opf7CFnYaghKx9mpVjpm2kcI+FkIF9loJyrGCjc3GAmmC8fVJVdI6So5Z7fpSTjXd7c4Z/cVxubnhyaoJwW2RgaW9jZF1MTVFUQUlIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVllZWltcX19eXV9fXVpaWlhVU09IQDg4Mi4sKi4rKicnP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7mqrp+boayys6WeoJWlra2uqqecpqebo6ihs66iqaayoJippJSjtqKilZeiqbS4o5uhnKKSj6GxmZ6bp6ahorCunaaporayxbGtqa2pkYeQnKidoqScpZeemZqapqWrm7Cir6WnmK+ku6yhtratnZy0sbevsaWXnK6fop2Fj9G1w7d5h46FkZOQgKZ5lKF3jKCShKWBinGqhoW0bnJpmqSclYqffJiZhoePc6+CpZuijqaLk52LlpCbbnGyXaV0k3qcbJl/e5l8balho3Fxf59ic7K4aHePlKaYfY2OlY56fnmQg25qeWl6c2+BdV5lZW9uZmhgS1tYWDxISEBVNEBGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dW1taWFVSUlFGOjIyMy8vKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZJzjIqtvr+8urSelqekrbWhopmUoqimrqurmKajn6Whobano6insKOUrKOOpK2inZCamqqzs6ScpJyokZSXrp+fnqeknaidtpujq6S2rMSwqaupooyEjpyioKailpmanZmcmaemp5mtqK+kpputpr2slL2vrJ+hr7K3qbKlmqiwoqeXeaiRfXywd4qApKWInG2ycKGHrXyhj4OnlZiArImFrYWglaqgopeGn4CZlYB7kn6rgJ2aloureJ2hkoqUkoF6r16kgX2mp2SdgHyXc2qvXaVrcIWZXWBbjKBtlZGmmYOWjpqOfHyEmYBrbn9jf3RugHpgaGZxb2loaENaYVs+S1UzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVJTU1ZaXV9hYGFhYV5dW1pYU1BPTkk3MDQyLiosQVRWVlZVVFVVVVVUVFVUVFRWV1dYVlVVUUhGSUojKCi9k5qDqMXCtsCznpqsoK23paOOm6Sin7Cwqp+loJ6tmZ65oaOroK+pma6hkKuoo5aJmpCusKymnqWbrJeXj6yhoZ2moZqlna6Yoaint6nBr6SppJ6LgY6bmp+nn5KUmZuVm5qmpaabqqytpKWfqai+pJbCrKqioKqxt6ispZ6yraeol3WvfpCLnIWHfrqtipllsI1lla19oY+EppWagayKhLCFppqkoaGRhaFcbGqBs2B/rXt7g4GxbWdvmZmMiLFbfrVcpIRryKJkn4B7vFh2tFmyfVKugHqsWIChbZiPqJuMmJKamnx6kZ9/ZXV/Y4Z4dIF9YmpncW5nZmZQVWRcQVVgPkkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5QUVJUV1peYF9gYWJeX1xbWFVQTkpGQzU1My4vQFVZWFdYV1dYV1dXV1ZXV1ZXWFdXWFlaWltcWFdXR0I70p+ysbe9urPBsqKcrKaktamgipqgnpyzs6mfpKGetpmgtKiqrJ6vrZ2sm5Wvp6GOiJuOr6uopqGlma6SmI+pmaKepZ+ao6OlmaCiqrOpva+kqJ6dj36Lm5ahoZqQkZqckpqYqaCimqmuqKamoqSpu56gxqakqKCps7OqraWeuqyrq5SAqZKjr46bgIekl5mQgoC4w7qDjpyThKeXnIKsioKviKecm6aqkH7VvcKqYqO/vX1+o4KE17q4tYWVk4Oevb6EbaOCb6uEbJx/erKwx4Npq7C9rHh3or68c4CWjqedkZuSmqB7g5Ode2R+e2WPZ3mCfGFsZmtrY1FiW1NqXD9VYkNNKT06NC8fHyQfJTIgHSQoMDQ5NjY3Nzs+QUNGR0lLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz89QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Owv7ixvLKinK6mpbKmnYuYpcCquLKoosCnqLOdn7Kduqifra+lp5SUsKuXjIObka6loqygo5yqoJeLo5KmnqecmqGpo5mfoayuqrqtp6Oal5N9iJmRppyTj5GYmY+YlKmboZmqqaGrp6CjqrueqMSin62iqLKyp66pn7mmra2Zc3aqpbiGZImgcGiukYuQbm53pJCZn4F1rpiUcI+LcZWoo5qXrqRybGxsZot4b26CmXGBempxaWeKl5aYcWlphohncYZkXYhiam9ZXGZ9dqZfYXGOkW5lZH+Nk4+imZmZk5qifomRmHdniXhpj2t5gHplbWRnbWNLZVhKa1o6UWZGUSdLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXV1dZXV5eXVxcXF1eXV5dW1tVV16plKyzqbm4srOqqaGunqOzqpiSv7PFyr+3qp/Bra6koqisn7qjpK6rraaOl66pj4uFlZatnqaqoJ2ko6CRi6WSp5mpmpejqqGWnqanqLC7q6uam5OTfISWjqaZjpKRmZWOmJaplqCZqaOcsaadoqu5n6/Bp6OypaqusKmrqaW1oqy2lYqhqKa3nYmWo5mIqpuRlZ2SqbOZmqOqoLKWoqGdn6KcoaWilaunjZKSjIeTnJ2VkZmTmZGPlYWBpZuYlo6LlJSMkIeFfmeJfnSCdXOHinCnbHqTkJOSgIGNj5CPnZWil5qapYSJl5Bza5F3cYx4d316am1lZHBlVWFZQGpcSGNiUFkrRj0rJyE3NTAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFRWWV5gYWNdXlRRS0VDPjk9QEFTWFtcWVdYWFhYWFlYWFpaW1xeX19gXl5eX19gYGBfWVlgppaoqqS0tq6uobCjrZ+gtrGQjqzIvsa8uqujpp+dp5+xqaO2p52ptKaokZisoouHiY+cp5WspJ+Yp56ekpSjl6iaqJqUpqGkkZypmqK2u6eqmJqQjX2BlYyilYuVkZaRkJSYppCgm6qgnbajnaart6euwK2itqWurq+rp6extp+tu5iRpaSmtqKSnqegjqqgjpOfo6uwmqCjsKivmKOgnKOqnp6enZesnZOZoZuUkJarmo6ZmZeRlp+RiKGelpWFko2RjpWLgX5mi4V1hnV4h4JznGqFj5KTkIl9i5WSkpiUo5OfmaSFipuKfXSXdHuMgHN8f2pvZV9xamBbYFpuZFBhZlFaOkdHRT4yPT45LyomKykmHSY0MTY2Njg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYWVWUEtBQ0I6OUVNVlteXltaXFtbW1xdXV5fXV5fYGFiYmFhYWBiYmJkYlxbY5eVo6eir7GrrqOppqyfp7WqkI+dpbW9sK6to6SbfJ+ksqSlsamXm7mmo5OZqpyOhoqJnKKPrp6ilaifoJKWmZuui6mWj6iZqI2aqpCfurekpJicjYl6gpSNnJSLlZKUkY2Sl6ONn5+pnp+4o3+Dr7Wir650o7yisJ53eJ6nr7iUdayjnomAq39kXGJ2oI+ln4SYfW2Ss5yjp62qomWen5JzeZqXcYGZqJhtf6KoimWcpp2SmJiWjZKckIaem5CWhJKHj5CSiYV3ao6HdoZwe4V/f2Boh4mTkYtadZSQZ2iQj3N7qJycZnubioV6mWqFjIRveoBrcmVgd3Bsa2lcZmZiYnFUWz5OTk5TRz5AVUQ6MS8eHyY0OjMwNjY3ODw7PkBBQUZIQkdGSUtNU1RVWV1gaGZnWFFKPERHPDhVUltgYWJgXl9fYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaajoK6vrKuppaitoqetpJKWq7exs6ebq6itmHSNnrGgqKunlJe5oKCPnKSdkX+JiJqejKuZoZSnoZ2OlpKehHatj4inm6mSmaWKnbu0qKCZmIuJdXeTjZeTipSRkZSNkJShj5yhp5mcspWAjJu1nbOMko66pp99p6J5oKy0f46NpZ6Di4aQsKqvjYuXpJt6gYushZydoaeop4eVhZh3pZt6h5yBl6eCgnucsnqKhqGYmpWYloKRl5eEm5lieoeQhY+QkouDbXCNh3mAcH+AhH6Fc4WDlJF4lmiSdKCadX2ZhaOgiZh/lIyFhZprj46GbHl8cXFoZXhwamxrXGVsamZ1XV5JVExSQEU2LlpVVTcpITA5Pj43NDM1Njg7Oj0+PkBEST9KRUpLR1NYW1lcYmFoZlpRSDlFTDs+YVZeYmRmZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJein6asrauorKCnr6amqaWZlK/JwLGil6iqt5+RhZ6tnKeioI6Qvp6ajJ+aoJB8hY6Yl4eqm6CVn6CRjJOJhoCRp42Ho56klZmfiJ+6sqiempKOhXF2kImVkIqUkI+bjJCSoJKYoaSWnquHn7SJtJqtisqHqayItoWNsIGvrIKojKaYjZ19qI9ze3edj6eXaJWkebSMn56mp5KYwoF/q4iYoXKegJqlfZeFlbKBoX2hlKGQmJeBj5Sci5mSi32Fk4eNlpKJg21yj4V+eXGGgIN7g3SEgJaAj8Vmf6mHj6NrnoWknYWagY6Ph4uacZCUhml5dXx4aGl2cmhobF5kcG1nbllnR11STTNFNDdOYmQ3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TklKTENQWl1cV2FeaWxcUUU9S01ASmNYXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSWop+vp6iopaufo7ewqaummpSgpKWspZimrLmksIGiqZ2mnp2JlL2Zk42hkp6PeYSWlZGHqpiampmhhI6Ld5ucj5+QiJ6lnJeamYikua6lmpyMjH5ibY+Lk5CNkI2NmIyRk6CPlaGhmaGnfqGnh62doJatj52cnJCFgKCMqayFo42pmYyaf6J1gZmUbIKtdk2reIeNnJGaqKaAqat9g6F7eqdqnn+Sa2eXhpe3iZ5+bmBkWYOXgI17ZGiLcpl9eZZsXX2XbV9ScINcX2t4gl9YZIF8g3+XcKeqa4OjbnKlcJ+FoGpnoG1bb4x9Z1pghIFjWFFwd2ZudXNram9danFubGpZaU9dWUY5QTVIRF9sNSxJRFJNTj04NDg1OTs2QDs7PkJQPlFSTE1CSlxdX1ddXmJ1YE1EOk1PTlRiXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlZ2guKCpo6askaC2u6quopmYoaOmra+hnrC2pKmToqGgp5yajpm0mZCLn4yVi3WBk5KMiqaUlJidnn6ShYWspIebkIqZqpmbm5KJp7GnopaaiImAaW6Ih4uOjoqLjZKMkZOjjZSfn5yipH+TgY+ioZSgdpyVj6eCoKZ/haerg6V4iXyEmn6icHOUiJZ8n415bYabjJmPm6iZjoede4Kic3amZp5+d6RfmHp9k3Sibpi3tLp0k4iDgLWoZIHGuHtwlbaMcoCao2JzrKtgfGmds35tfIaBjYKLmHF/o2xyo3SfhYGkYZ2Zs5ZyfZifs3V0XJ6yg2tjcHV3cmlvWGttc3NnXWleYkxFPUQ2UUJaczM9U0dgSlI9PDM5NTo5NkQ7O0BKUD9VTU9RQERfX1taWGBgfGRIQzhNV1VXYmFaZWZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2hok5WUo7eYqpuTn42ktrStraCaop2ko6avnZyzr62UmaKaoaWZm5Wfq5uLiJJ4i4VxgZaNio+gjpKUnZh9kImNqKCHl46JkqSVnJuNi6mopZ6Ql4eFfmp7h359kI2Di5GRiZCUoYOXnqCdn56LiXecmKKNn3Ghioeph5uljpSmqX2tjH56oJl6o5N4gXSWiI2cfZafhpuOmJulhaJkoXyIlpCbjW2eaJuOb5qZeoCLp31yaXSrg5+DdKpolZpdm4V2hZ5nqmuAuGZcqHCBnGCVjF6ndnWHiH6eaJp1hpOSl46An2+akW6nml2pf3m7a36qXI6EXbRoXW5yenhraVxxa3l6ZGBmWGJCUUZPN1dDUm81TFtbX05aREEyNTE8OzdIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TlteWWRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcWBkZWVrZWNpaGdraZWbiam0mqeIY5Sbq7mxr6yeppycqaCfr5yesqmun5ilm6GgmZeXoKOZhomNaoiAcnuXiIuWlYORlZiQeoqElaScipSPhoyfk56diZCpo6CajJKKgYBpgYZ5f5eMe4mOjoiQl5t/lKKen6GTmHJon4mfj4xwkoyBqYeYnqGlnqZ7sK2joriXd6Ozo6SAiZR5nXurmX6ijpyaloiXcaF8hY2vtX1rmpGheX6YtaKkq6iEmXybfZ6bf3SqWl1ve5aLeJ5iTH97eoVjeZdCTJ9Yompxe45sgIiEmXWbeIaJsbN/gJuTp3eDnm5zfZVwmnRrpF6VdkhlZGF0cn9/b2ZgbGl3fGVlYVFfV11UV0BaRlFoRVRXXWJYXklEPUI4P0I6SUY4TEVYQVdSW1ZERmJcWmBLYG1+ckVCPFVfYlplaVZnaG1vYmZnXmFhXF1eYGhiX2Vjdm1dZWdma2RlbGlpa2mTnICwrZmEU16gprO5srKpmqKMnKycnKqVoq2lo6mQoJ+dm5qWmaGdloiHiXeGgW95lYWRm4p7kZOWiHKAiJKhnHORkIGJmpahnIWPqZyblYuLi32DbISFcYKhjHiGjYiIk5mWfJOjoJ6iiK2GfbWEjp6de6WWeqmAlZuPiZ+bfKdod21+mXShc3J8noaZcJODrn2kg6WdmYCjb16oZ3WiY2+lYZzTkH17mXhzc2KihpB+o3SkkHZrj7OMYIKYiXOqsqi8f3eDbX6/pqm0XZttfHCWbX9yonJdpGdzpmBopm2b1Jp+hptwenuXbJx8eJdzbqmkZ2FlenKAhWxoZmRvdnhoYGNTXGZRUWJIWUpVYVdUXGZrXGVRRkNLTUpLQktFOE9AUU5YU1lPU1FgZmZqUmN3eXdJRkVjXWVaaGpUaWhqb2NqZ2BjYFxdXV9oYmFpZXxkXmRnZGtkamxnaGxol5p/r6pUXEt+qa+xs6+yo5uZhZmqoaKlj6apoZqri5uZmZSZk5OhmI6HhXtwfYRofY+DlJqAd5GOj4lvf4WOkpJsl5N8ipOUpZeDj6ublJOLhol5g3aIgW6Cn4Z4gZKGiJmjmHuUoqOZn4mzoaK2i3qsp6SupXCpgJqOhYCakHukgKGZhphynoSkrq+Kl4yAjaSNlYOtoJN2tba1yaFzlIuBn2Cel6lteZaHoJt0ooh3oH6Tl4uBcE1mo5Jwm4dzpHt5dGGDgWt+oGtxZF+ccX1zlmh5aLK1tMamc5h9ep1rnJurdoWbbnd5mGqae3WYclFFfbNfandseohna2hjdXVxbldfVFlpUFNoSVdNWVRWXmlsb1ZoV05LQUpNS0hKT0FRS1BlY2ptZXRyc395fG51iXt7VFFPbF5pXGtpUmpoaWxobGZjZV9cXV1eaWJkaWt7X11kZ2NqZm9tZWlsZaGbiK6lg2Q/k6Gyqq6vtaKikICYq6Ojpo2mqJ+ep4SbmJeOl5CQnJOOiIN6anmHZYONf5igeXWPiYyBaYSFkYKMhZ2Neo6Ml6aUhJmqmI2Si4GJeoB9jHlwkKGGeoKVh4mWoJZ/lKWonJWVg2ZueJxsomR7caV3m5hwZ6aAlYp6pHqfloOXc553gYqVl4+5bpGKomJ9maCViG5yaaprdaBtb6Zgm2mLkGmWh5uWdaKBfppgjIaNdXCIYmigZZ5+aZt1b2NmiIFtcaJaXltioWxdiItuen1xcWSlbXiiZGenaJlzjJlwonBViZBvoF9mqFSLXlSYbm50a3ODbnFpbHl0a3BSWVdXZlpUbUlaUF1JWGlpc2pZbFdRUkZWXExYU2FVaWtfd3R7fXB8fHKDe4Bzdo2AhHZeUnJiZ2NwZ1BqaGhrbG5oZGdfXV5dYGpiaml2dV1cY2hjampzbWZrbWOco5eleWRzbYumraOpsLGmn4uAmKyen6eNo6KcpKOBlpmUjpqQjJiQjop7h3GAiGmLi3yYm3N1iX6Qe2SDh5SJipWZgnyJiJiokoGjrZGGkIuCin6AgI90aZCmhH2HlI2ImaCPiJOppp2IpniVm36kiJaLsZidkIKvl5+ldpSGeKlzpY+Emm6kooyShI2Du259pa+DhoWGk5Wcn3ylenKolaCWZ55+b6xkloqWk3eobaqigYl2iYN3q5GmiGuRsGt2s4ypa4qFbW2fnpKVYH6ri6p2fn6KpJ53n3yDpJWdoGqbiHisaJ+ujLZ0d76NpJNag6eOq2F2c3VyfHVxY2t/b2ltU1dbVmFiXWtNXVJeSl5tb3dgW3FZXGBbZ3Rlbm9yY3J0YHd6fnlyeYNzhH+Be3uMgYOAdmJ4ZGNucmRSa2dob2xyamZpYWBeXGFrYm1sem9cXGJpYmxqeG1nbG5ilaSpnIF/naOWqamdqKaupJmKgpism5+mipymnquehY2bkIeckYaSjYyMc4Z6iIRvjIR9mZN0dIZzkoJtf4uRh4aTjn17goeZp4+Ap6ePgY6JhZV2goeSb2yLqYGDjJSOiZ2fiYyUqqKfj4B1lJeIfoF5lK6if4GacY+Gd46Jgn17cqeMcn59epiWm4SQeXt/foeUlZOKdpCYnqCDe32Ja4yFW3l5cnpxaW5+kolxgHWBj5STcYeEgmWMf1+Bf4t3dHKUdW95bm2HbIOFXXVnd45lf4CEjKeZfXR7lWqJiHCBdn2Hd25uaI10enyYeIVcbFh5j2lveHNycHh4cF1sh25qZ1ZbYFddZmtkVmNVX1JgcHl5bWt3Zmtra3d9cnJ1dGFvdmJ0e4J4dXqCdYCAgIF4i4WDfXtuf2xkeW5eV25naHVreGppamVcYFpjamVtcXRuW1tibGRsbHluaGxvYY2Tt6imiaCimqajmKScq6KhhISYrZKeooqbqJuqmYOCnIx/l5SHjoqJjXGCfI99fo6Ee5iPdHKEcZWFe32Si4aGj4R5foCIm6WPfKiijIaQkIWVg4aOmHZyhKmGjpKdkImfnoiMm6efn6qDiY6Vmn5+iZatp4+RpY93b5uPgXiQbn6ohXF+lXFrcH2CoI2Ak46LaGxcgouLm5qejnOVi4hxdGuCd3SBWXJuh5GBfn+Mal1qZXuGhImAYGl4epp7goqBdYGFgWd3ioZqX29xgXVecYmAiI2klIVli42DbneLhHGGj3pxaGlmfIR7lltca2hudlt8eXh2b3Rzg2hdbotra2JaWl9bWWxxXF9hWl9eZnR/fHZwdWRra2t8fXN8eXVkbnVobXx+d3p8e3l6gIB+b4aKhHt9dH55c39oVFxxaWx2cHVna2hkXWFYa2hra3FybldbZW5sZ3N6b2hqbWCLiqmwoY+ioZqenZeemKijon6Dma6OoJWJnaORppWAfJiGfZKZiomHh4pyfYGMdoWLgYSXinJvgHKYhoN+koOEhomAeoGEjZyhkYOoooh5jpeJlYuLnJeEg3qtgpGYmpWKnp2HiKGqn6GipIuIk5uco5mVqqGnpp+SmoaUjHp2jY2Dp35/kpCSlJ2yppuVn5CNsZKXg6WMjJWan4mQm4KIkYprfI53eGWDh5GLfImehIeMkImJgYWEkHd8enSZoIiGiZ2JhJN+fYqAf3RucoSBfXaFhYmOpI+ChYyGgoyQjH2IjIqRhHpuhIV+eplrc2lhdIpxfnt4d3B4dYJdXm+HaG5fXlpdXVNoclZkXV1ibWh2fH10b3Bla2ppgH1ueYByanBxbGeBe3KCgHh/fX+Ee22CjIZ8enh7fXqDeE5jdmpzbnB6ZWtlY2JgW3RmcGdycW1VXWx0bWl5enFnaWtkjIecuZ6WoaCYlJiZlJikoZ58f5qsj5+Oh6CdjJ6WfXmVhHyOmYqGhISGbnmBgXOBh32JlIRta356l4eDg49+gIeEhXyIhY+cn5OIrKCEc4uQhpKRi52RfY17qoSOk5iWj5yXh4ebpZ+imZyFgpKamZiPmqefpZ2cj5V/j4h1e4aNhKV7fI6QkYaZq6KelJ2QjqmNkICdjIiTmZ6Cj5d+ho6Db3iGcnVgf4SQhnWNmYGDkIOHhX+FhJVueXZ0kqGKi4WahISMc3+Je3xxcXqHgnp3iI2DkaWOhYOOgIOKiYp3homLjX5ybYCCfW9pbG5oXnp/aX59d3Z3dnt4XWBxfm50YGNbXV9SZ25UZlteYmtpdnp/cmxtZGtqaIF/bHSCbGx1b3pwhnpuh4B2goB+hXZxgo2Ifnt8fH97gopgaHtqdWlpgmRqY2BpXGN1aG9idW1sVWNxeWVwentzZWptbYuJnraZoKOfkpGVmIuanp+ee3ifp5Gci4ellYyZmXp6jYZ9iZGEjIKCg258gHlzgYR9i5J9a2h9gpeJgYiNe32GhIZ8kIORnZ2TiamdgXGMi4yShqChioWMfKiRiZCSl5OWk3iNo5+gnZWYfoCQmpiSjJujoaOZlpCafYyDd3+Cjoagf36MjI98mKWiopOakZCmjI+BmpGJkpebfpOSfoeOgXV0gnF3YX6AjoZyi5Z9iIxyjH+ChYaPaHhyeIuYkY9/ln6IiXKBhnt8cHd6ioN5eI+LgpWkk4qFj3uGhoeEdoOEiYl9aHN+gXp8cm1saF9+dGl9dnZ0fXOBa19gdHZwd2RjWV9fUmtpVmZaYGFoanZ5gnFna2RsaGaAgGtufmhvcWx+eId7bIyBc4GBfoF0doKNhn98e4CBfX+PaXKDbnRpYYdobGJfcVZ0b2xtYHhobVdqdHZjdXp7cmJqb3qJjJ6xkaWknI6Pl4+GnKCbnX13paGOmICNo4uJmpZ5fIaIf4OJf4mCgX9yf3t0doOFfYqRd2djfoaXioKKi3h8gI2DeZeDlpmYjZehnH9wjIKRk4alm4eMiYOmloWTi5aXk5J2kZ2goZeTlXh+jpeXjZabnaSdmJKUmniNhIJ3g5WNnX6BiY2Mc5ejn6KUmY+PooyKgpaXg5KWmX6YjXyIjYF2cX5ue2SAfIuFcYeTgJGCbIeDgYCJhWZ1b3uGkZeLfJN4i4h7f4Z7enF9d4iFeIOPh4qXoZWBg4t2iISDgnd8g4qGeGF6en91gHlobWZif2preHR0d35yfWNkYXNudXJtYVphXltsZVNkWWFhaGt2eYZxY2tjbWZofINtaXVobnBpgH2Dem6QhnKAg4N+dHyDjIGAfnuCg358kG12iXN1bWWKbGpiYnVWhGlwbmB4Z2xianZwZnl8enFgcmyGhY+brZemp56NjJeHhp+Tl5l+eKqdi5p7l52MjJmQeXyBjH58hHyBg4F4dHl6dH2AhH+Ji4BkX32LlId/hIZ0fX6Lf32ZhpeVmI2kopmAc4d7k5GJpo+MjoqToJKEkpCUl5GLgY+Xn5qRj49yf42Rk4mdnZ6ml5eMlJVyi4yJa4SXj5l6h4iPiW+XnpuklJWLjJ6LhoGRnH+SkpWGmYh7ioqBeXF6bHVsfH+Lfm6Gk4OVeHGChH5+i4Blcml7f5WWg36NdJCHgniGfXV3f3yEgHuCi4KLk6OPeIOBdImHfYB0doKJhXFifHZ7cn5wY3BkZXxjb3B3c3l4dHVid2BwbHZub1xcX15ea15QXlljYWhudHuJbGBpZWtjaXeHbmdtaWttaIF9e3hvkIhzgISEfXSBhol7g316gYR9fY5yeot4eG1sh2poX2lyY4dncW9ld2dubGF5aWt9e3hwYXhti4CYmKmfpKidioqShoqdi5WYfnivmY2Yfp+UkZeUiHd+fIp9fIB3eICAcHV0fG+GfYGBin98YVx+j5GGgIOCc3uAh3qPkomTkp2VppyWgn2BfY6KkaOJjoqNmJqNhpKZlJaOioiMkpySj4uLbYSQj5GInpmioJaViJaQbYeYg2WFmI6TeomEkIpwlpuVo5OSiYuZjIF/kJ19ko6SjJmOe4qFh3NzdmxxbnV8inRuhpGPk3F1gXyBgYh8ZXBseXuYk3yDiHSQiYBzh3huf3yAhXuEi4eCi5SnjHqGe36LhXh+cXCBh4VmaXp1dnF8Y19xYWt0X3Fre3p5bHNxZnpeb2xzbXJYW19gYWxcUFdYZWNncXF/iGddaWlnYmdxjW9kamhlaWmBend1b46FdIGCg3t1goiFeIV8eISFen+Jd3+Le3tyeINqa19waHSAa3JvbXJnb2xlfGNugHp3cWx3d4p+opehp6Cmm4eLi4GPnIeTnXaCq5WTj4ihjZaUkIB0fHeFeHl/cnN7hmtzcHpui3aAgYdvcFtZfpGNh4B/f3Z1gICAoIeSi5SemqKVmHiKf4GNiJydio+GkpiWhYmVmpCXjIyNjYyciY6QgmyJi5GRip2WoZuXlISXhmmDooFlhJyJkH6Lg4uBd5OZk5+SkYmJlI1+fY6Xe5GMj46aknyKgIJvdnBsbW9we4ZpdIOPmYtxd4B1goiDeWZybnV/mI57h4R5k5B5dYdzb4h6hIp5ioWBho2bood7g3WCi394eW5sgYWDX3R1dHJyeVtfcWFwa19wa358cW5ua253YXBva3FtWVliYWJvWVFUWmZnY3VwhINjXWtuZGNma5JuYGdnX2hrgXVyc3CLgHV/g4B5doCLgHmFf3iIhneDhXyGi397dop/anFjfGOGfG5xbXRqaG9sdnhfcX95fHR1dICDfqSVmqyep5aFjYR/l5SDkKB2jKCUk4eMm42Wjot6cnl1gnByhXRxdohscG52bYh2g36AbW1VUYGrlIaCd393coN6g6GDk4KVlJqdk5t4knuDjJKjmZOOiZWZkoSHl5mMlIuJj4+HnYSQintyi4WKjoicmp+blZN/k31nhJuGZ4Wfh5GEkYKJcYORmJCcj4+MjI+Md3uRkHqOi4ySlox8iHyAa3dqbmtsbHt/Ynp+j5eBdnuBeIOMfXlnc2xzhpSLfoeFepKPcXmDb3WLeYiKeYh8gIqOnZyEe3p2got8d3FqbIKEe2F5cW9tc3RWX3BicmJgbW96cWlwZmd1dWlybGJ3ZV1XZmFgc1RRT1xmZV15cIh9YFxpcmJiZWaRal9oZVtncH5wa3F0in12fIaAdXZ+jHl7hYF4iINzhoV+jIyEfHmVeGZyaoNgiH5vb2t6YGpudH91X3R9eYd4dHOFfXigj5mwnKWOgot/g5qHgIyfgIualI+FiJiOj4+Ed3R3dIBxcIV0cHKEcGtpd26Dbn19bXRzUk2C38iS1pN7cHWEdoWhhJR3lpGZnZGZe5RzhZCeoZKTkYuTnJSGf5eWiI2Nh5GNh5t+jYB3eo1+iYyKnJucmpSSeYx1ZoeQhWuHooSRiJaDhmOMkZmPlYuXjIyKinF6lIh7joiKk5GJeoZ8f218ZXNva2x6eluBeZCQgXp+f4CGjnt7aXNqc4qPiYGFhHyUimt9fm1/in2KhXyEeYCNk5mYiXx1d4OPeHNtZ3GAhW5sdXBpanVuU19wZXBaYG1zeWhsa2NneXNwcWRgeGFgVmxfX3ZQTkxiZ2NdenGJdV1cZXZhYmVljmRhZ2JZaXNzbmtxdox8dHqGgnV2fYtzgIZ/e4l/comIgZGLiHx+mHZlc258ZYh+bnBsgFlsbnl5c2B2enuNdnJ3ind5noubrpqgkIKFd4iVfnyKnoiGoJKPhYyYhJOPh4F0eHB5cW+EcG1vf3NlZXlxfW15fWpoa2OkmsHcrvChc2x2hXeGpIaTcJeRlqGVnIGScoaLopeJjZaLkJ2Wg4GWkIWJj4CRi4mVfYZ6dX+JeIeEjpyamJiOj3aJdW2FiIl8iaKDkYmchIVei5OXi4+Jj4uLhIlte5aBfYiFiZGPhnaGfn5rfWR4dmpueXNYiXuSiIV6foGBhox/eWZyaX+JjYmCgX6LlYRrgXVtho+BjoJ9gXh+jpSRl490cneHjHVzcWd2eoRjdW5xY2p2aFJhcmhsVmBvdXphcmRgaX9xc29bZHJhYlduW114Tk1MZWdiXndziW5cXGR5Xl9lZYVgY2NfWWpza25rc3eMfXR3hIF4d3uJcYOEfX6Ie3SLiYiWhox/fpdzZ3VyeWyMe250cYFXcXp2eXJkd3mGjGl2gIlyf5yGmKebo5KEfXGMlHd5jJ6FhaGNj3yWjYCaiIR7c3dwdGpwgmxqbXx1X2F4d3txdXtnYGR869q1ycPch3NsdIJ3i5yKj2qZkZCelpSBiXGFiJ+NhIuWi4yYlHyNk4iDiZB7kIuFjoB/dXiDhHKIgpOclpSXhYx1hn1vg4GHhpihgpOMnoOJYYOUj4eKhoqOh4GHaXyTf32DhImOjYJyh39/cXdodnNqdHdsWo19k4OFfYCEgYSKgnZhcmuIgY6JgX5+kZB9bYFrd4WOhJCBe4B8fY+RjpSIbXB5jIV0a3Bsc3mCYXVqcF5sd2FSZXNpZlNgcXd1YXBgXWiEcnRrWGhoY2lZbVdcdUxLTGZnXmJzc4VqXFxleV5eZGd7YWRfXVlrb2ZvanR4in5zc4F+e3Z6iHOFg3x/h3Z3ioaPmYGMgnuTdWx3dnl4k3RueHt9WHmGcX9vZ3h3koJkdoaFcIqWhZmhmqKKiHRvkoxxd4+cfouaiYl9oH+EmoCBeHJ0bm9kcn9pZm14eFxgeXt7cXGAaWFnYX/Vto6RpnhvcXh9cZSSjohrmo+JnZOMhntph4uZhoGSkYaHmI58jY2BgYmNe46MfYiEenN6g3txhoCWmo6Tk4GIdIKFdYJ/iZGcnYaVj59+iGJ/k4eFiIWLjYCAg2d8kIB+f4KMj5B+bYN8g3VsbXd1dXh2bGOOgY+AhX59hn+EiX9wX3FwhHuOi4F7fpCIeXCDZXmBiIWKgHqEfH6SjY+Rgm1ueYt+dW1ua2x7f2RpbGtabndaU2pzaWJRY3N4bWNmXlprhG50YlxoX2VtYG9VXHBPSE9nZlxob3KAbltcY3NgXGNsd2VlXV1abG1jbWpzd4Z/cXB/fH10eIZ4hYJ8gId1eYmBk5V8iYZ2iIFweHl7hJNvbnuBd16DgHSBbWl6dJRzZ3OIfHGSkYOZn5ughoh2dpR/bXeUmH+IkISLjpp9jJp3fnZycGxqYXV9Z2JqdXpbYHh8emxwfmVjZ2dXnY9fcXOWvcWFd3KVi5GAdJiMh52UjYhza4iPlYB7lIuBhJuMfIqGfXyJjH6Th3SHhXZ2fYJxdYaBnpWGlI+CgnF+h3ODeoiWm5aGk42dgIhmfZOCgIaEiolygX1nfYt7eX9/h4uPfWmAfYR2ZnB5eHR4dGxrj4aLgot/eYOBhISAa15wdnp9i4eEe4COf35ygGh4gYWJhIF3gnt/lYqOi3xta3qJfHZ0b2hofndlXXJkWXB0U1Rvc2liTmh1eWdhXl1Zb4FwdFplY11rbmFxUFpsUkRUaGJabG9ufHBaW15tY1pjb3dkZ1xdYGtqY2xpc3eBg3Fufnt/dHWDeoSCfIKFdn6JgZaReIOKdIGIc3l5fo2Qb297gXFqgnl6fm5tfHaVa2p4hHRrk4yFnpigmYWIb36Mdmp5mY+AgoqClpiKeY+Wb3pzcWxqZGB0e2lgZnJ7W2FyfXpmcHphZWSOsbJ3S2JapdrSmHN8ko2Ren+WjIWako2Gb2yFkpF5eZOGgISZinyHgHl4iYqDlX9uiYZxc317anmGg6WRhJOMgn9ufoJ1gneEmpeSipOPlIWIcHqShH6DhImDb4F4aICFeHJ/f4OKh3xlfH6EdmNxc4BqenFvdZmNhoSLfHd5gIR6gmtccHxyf4eDiH2Fh3qIcYBtcIKFjYKCcYN3f5aKjIN3bWx9hH52emVoan5yYVp4W1pybk5YcnRnYEtud3ZiXlxbWXV+c3BYZ15ma3Ffb09YaVM/WWdfW3FraHpyXFtZa2VZY3B5X2hdXmVsaGZsaXF4f4dvbX99gXVwgnuAgX+Df3aBhYmXinGCjXF7hnx6eYSUjHVren9scH50f31vcnx7k3BvgX95ZpKKgqGYnZGDhmeHhHBnepeKf4CFgpqKgXyNjWl4cmxsZl9hb3ltX2JveVxkbIN6YXF2X2Rl1eu+izM6PouPgHJ5hoqQjniFmY5/lI6Nf25thYyLdX2Pf4WClYl8g3hudoeEgpV2bYeEa3V7dWV5g4SnjIOPjIN9bX9zdYJ4hJqPi4+RkoyMh397koh5gIWOg2yAcmmAfnhtfHuBioN4YnmEgnJkcWl/bnZydYKcjIGAhn90dn6Ac4FvW2t9c3iIgYp7hn98iHd5cGuHgo6CiHCAd32TiYp9c21qdoCAdXVdaWl5cVpXflRbcmZNW3NyZlxKcnlxXVtbWl52gHZpWmJbZ2ZvY2pOWGZRPV5mXV52Zl91cVtZVW9kWmRxelxoXmBnbWdqa2lweH2ObWqChIB5boF7fYF/gnp1goGMk4VwgItud32Ae3uIk4mAaXt9a3R8coZ7c3Z9f4x6eIR+fGuMjISbnZaMgoFtjX5saX+Pjnx+f4OUgn99iohrdXFnaWNbY2dzb2BhbHRhaHCJemFzdF5iY5ugkG5dNluwtnVqgIl+lId3iJmHdZCMindwbYWChnR5iXiJfZOIen9zZ3aIfXyWbm+FfWh2eW5leomFpYeAh42JfW19dH5/e4qXhoGSkJiJi4WKfJCKcXx+hnxpfm1rgHt5anp2goeBcmB3gn5yZHJndoNudXyGlZKCfYKAcHd6fHV+bVdtfXVziYCFdoZ0gol6d3JtiH+Of4NxfXt8kIeHeW1taGyCgXVuXWhndXJSXH1PXXJdT1xzcGRWS3R5a1hZWVpicoF2YV5dYWdkaWpmT1poTkFhZFxgd2FcdW1YWFN1Ylplb3NYal9iaGtnbWxpcHd8k2xphIp9fHB/fnuBf4J6d4CAiYuEcnuHb3F3hH97iY2PhGp+e254eXeKd314gIKHf4R+fnpthIyImKONhYR8dot6a22FiZN6fXuCkoCAfoqEcHJwY2ZeWWdfcHBgYWhwZmpviXRhdG9bYGRqdnt/v52opcm4coWEdJV+eomVhHSSjodyc3CEeoJzdYZ0iHeUiXl5cWR3hnl/kmhxg3Vmd3ZkanyEiJ6CgH+Ojn1xfnKDeH6QjoJ3lYyUkIiCiHuJimx5eoB1aHtpbH95c2l6doCDfWhgd4h9a2p0aHuBanaCjZGVf3x+fnF8dnx0fmJVdXtxcoeCgXuBcIaJd3hvb4KBi318d3x6c4yEgHVncGdsiIFycF1oY3RvTGZ3TV9vVlRadG5iUU91eWJSWFhdYnGDdFxiXWllZWNrZFJccUlEZGJcZHFeXHhoVVdWeF5cZm5pV2xeYWpnZW5uaHB3epNuaYiMeX5ze355goGCfHZ9g4iGg3B2g3Nud4KCfoiLlH9xgHx4enqBi3WDeH+BgYKEeoB1b32Ki5ueiH6Ge3eGfGh1h42Sen+AfImGhHaPgGdwbmBlXFhmWW1zYWFhcWxsaIluYHNpWF5jbYB3qdqpyIeIs3KKeXGPdn2JkYF7lIuAdXR1fnZ/b3B/bYV0lIZ4dWxgeYF5iI1lcYJuZ3VuW219gZCTgIF5kpJ9d3pshXR/j4qDcpWJkY+IhoZ7f4ZtdXd/bWh3ZW18dm1qd3Z/f3xgYniGemh1dmN+fGh1h4+Oln11gHZygHp9bYBZVnJ9b3OBhX1/d2uIhnN4anR/goJ8eXt3enGJf3tyZnNkbYuEbHNbamB2Zklvb01cY1hXVnltYlBTdXdZUVZYXmFyhXBdYWNtZWNeb2NVXnJHQmZfXmdpXVp7Y1JWXXZbW2drYVdrYGBuZmZscWhwdniPdGuOjXZ/d3h9d4GDgXt0fYOIiINvcX91cXV9hYGJjYt7d394hHx9hYd4iHx9gX2EgHt+cnZ4i46fjIl7ind1g3pefoeajXqHhHSGh4V3iXtibm1cYltbYVVqdGRgW2hvcGeHcWFxZldcY2t/fMrOh7qia25vi25yhXN+hox/e5OFenl0enV0empsdmOEdpKCdm9nX3yBeYuIZHGAampxY1hte4aciYOCcpeTd317bYZvgImKhnCWjpCIhoyEe3l/cnJwfmdocmNueHFqbHF3fXx5XWV6gHhpdXlngndodYiMjpV9c4dqb36AeG59XVdwfW1zfoh6gG5uin9wdmZ2fn9+gHV6b3lyhXp4cWVxYG2MgWtyWGtfeV1JcGxPWFZfVVZ8a2JPVHZzUlJUV15jdYZqXWFra2ZjWm9iWWNwR0FoXWFnX1xWfF5PVmZxWltqaF1YaGFfcmZqaHFncXN2h3lulYp1gHt3fnmDh4B1c3+FhY6DcHB7eHd1eYaFh4yGenx/dYt+fYaDhId/fn59hn98eHZ5dpKUn36NfYtudYB6ZISImIZ0kopvhYaCeoN1Y25qWV9bXV1VaHNlYFlkcnJngXJha2RXWl9pf3i+rnufuG5idIdpdX1ze4WIe36NgHd4c3dvenZlam9hh3WOgXNqYl59d3mLgmVwfWdra1tWb3iLpIGFf3CZknF/d3SAbH+Aj4Zyk4eMiIWJhX15dXNwaXpham1hbXZqZ2treXd6d1tnfXx5ZnJ+boV0ZnaGjYaWgHCLZ2t7g3RsdWJbbnpqc3qJeoBldIZ8bXBndH12fH5wemp5eX94dm9ka2BtiX1sblZqYXhWTGxtUFNQaU5ZfWhiT1V2bE1RVFVfaHeEZ15hcWlnYVdpXV1saUpEalpiZVdZVXlaTldva1ldbGVdWmVjXnRmbGVxZnNwdIF4cJmFdoB/eH98hYd9dXOCh3+Vg25zeXt7c3KFhoiJhHmBfXaPf32EiY6EgYN6fouDe3d8d3aanZh6ioOHanZ+fW2FhZWBc4+CcYaCf4KAcGZsZ1hdW1xbVGVwZV9YY3J1aXZwZGViV1tbaH9wb3KAc4plZnp/anZ3dHSFhniChXp3dHZua3pwYWhrZ4Z0jYNtZ15ffG96iXxobHdmamRWV3Nwjqd9hHx2lpBze3F7eGx5eo+DdZd7iIaEh4R9dXFzbWh1XW1pYGx1ZGdmaXpve3JZZ4F2dWhwgXiCd2N4hYt9lYJvjGtte4FxZnNlYGt4ZnB1iHl8YXWDdWlrcXR5b3h3cntlfX19dnVtY2RgbIZ8bWtWamNyVExrbFBNT3BHXnxmYU5WdWVLTlRYYWx4f2ZeZ3NqZWBXZFhjcl5MS2tZZGJWVFVzVk1Zd2VaX2xgXFtkZV93Z21ib2l0b3F+dXSZgXiAgXiAf4aEen12goN+mIVucnR8e3VxhYWOgoF6i3V0kIB9gZWOgIWEfH6Mhnp+gXZ7o6aKeYmGhWx1fHx1hIONe2+GdHqFfYKDdW5qaWVWXVtbWlNjbmVcWWJ0e2pobWhgYVdeWmmAaWtwgGhtYml7emt1dXVwh4J6gX53dm57aGp5al9lbmiBd5CEZ2VYYXZpfYZ5bmlvZmZdVVhvaI+od4F6fJCOeHRufW1xdHiNfneUdIaDgIaJdmpzd2hpb1xtZV5uc19nYmp4aHttW22Dc3Rqb4F+enhid4WFepGGc4hycHp/cmNxaFttdWRucYZ6d2FygG9naXhzcWt3dnN1YoJ5fXV0b2NiYmx9fGtrVWliZ1RMbmhQSFJsRWF5ZmJNVHJeSk1VWmZteXtmX21xamRdVmBWb29YS1RpWGdfWU5VbFRLXXpfXF9sXV1bYmVgemhsYW5wdm5vd3V6mH13gIF5gICHhnp5eoN9gZOEcXR0f3p2dIWIkH6BfZFsc5WBe4KfhX+HfYB+hoKAint1hKyff3qIiIRscoJ6doGAgnVviG99gHSKgGpvbmVkWF9aWlpVYmpnXFpfdYJpXm1sXGFXW1xrgWVydH1qal5teHdodXhzb4d8fn56dnNsemhpd2ddZHNneneSgGNjVGRvZoGEdnZmaGlhV1ZZaGSQqG9/d3+Kjnpwb3tmd215inp2jnGEfn+Ah25kd3RlaGldbGJecHBbZ19tdWV6aF10gG5ya3F7f3Z2ZHWGjHyJiIB/eHJ1fnRhcGxYcHFhbm+CenNjcYBrYGx6bmloeXdzcGSEdHh4dG9jYGNtc31qbFRpXl9VTHVjUUdXYkdjd2ZhTFRxWUtMWFlpbXd7ZWVucmZjWlheWXdmVUtdZFhpWFpJV2VRSWN4W11fbVteXGJkXn9pamBudHhtb252g5d5coGAfX+JjIZ+dXaGeIaMfXR1dYJ5enqCjI59f4WJanSWgXuKnX1+hXmAe358holzcY+ujHx8h5B+ZnGIenR+fXdzcIZtfH5tkHpjcHBiZV1lVlpZV2Nma2BdXXSGaFhwbVteWFpcbHticXd2bWNcbnR1aXZ3cm6GeX+Bendvb3RlaHRlW2d1ZnZ2kXlfXVNlZWqCgXN8YWJpXFRYXmNkkKVpeXSChZB4bG15Zndse4N5dIdygXl9eYBpZXdtYGdhX2tgXnVrWWZdb29iemVbd3xrbm9weHl0dWZzg5OAiYOJenZvcn1yYXhjWW5uYG9wgHpzZXGAZF5tdWhjZnh6cmxtgXNxe3FwYV1kbW99ZWlUaFlaVU55X1JKWllIY3VkYUpVblVKTFtXam1ze2RsbHVjYVlaXGJ3XFRMZF5ZalRXSFlhTkhqdlhfYW5bW19iY12FaWhibnh5bW9qdoGQeW6DfoCCkoiEgXZ1iXSMhnRxdnaBd319foyPgX+TfnB4loN9mZJ5gIB4eX5/c4eEc3CZont7f4mWeWV1iHpzeXdsdHB/bHl8cJJzXnBvYWdibFRbWldpZG1mXFxyiWVTcm5bWVhXYGx2Y2p1ampfW251c251dHVrh31/gXx3b25sZGlwY1trcmR0do5zXFdUZGBxf35xgVxhY15TWmFcZJOfZXJxhYOQc2tqeGxubnl5enGAdn9ze3p7ZGZ2aF5jW2FoXF93aFdiXnBoYXdhW3x2ampybnh0dHVqcoKWhId/hXZzanB8bWZ3V1tpbGFvcX95c2VvflpgcHBhXmlvfGtqcn1wb3ZqcGBaZGtte2FnVGdVWFNRd1xSUFlSSGRzYmBHVmxRSVBaVWtsa3xlbW9yYVtaWFptcVhTUGdYV2lUVUdaXE9Jc3VYYGNuY1hhYWFejGpjZW16eWxvaXZ5hntrhH2AhZl8goR5fYhtj4Zxb3Z6fXSCgn2Lj4ODl3R4gpSFgZ+JdYGAgXR/gnCHg3Zvopd0e4aMh3tmd4tvbnxwZ3hxe2xzdnONa150b2JnZmtTXlxWaGJsbFtccYxkTm9tXFZXVWdpc2hjdGVlXlpwdnBydnZ6bIh9f32Id5BzY2Rrb2Fcbm1jc3iHa1pUVmJjd3x8cIRcY15jVFtgWmOXlWNucIKFiXJpZnluZHJ1cXpreXR1b3t/dl9nc2RcX1diZFlidWVVX2BtZGFxXV1+b2hpc3F0cXV3bW2FlIOKfIVxcmdufG9xb1JaZWlkcHJ/dXNibHVVYnFqW15uZHtka3V8cHFxaW1fWGNpanheZlVkVVdRVm9YUVdUUEhlcl9hRlhrT0lZVFZuaWR8aWx5a2JXXFZcdWVUUlZpUllnVVRJWltQTnl3W19lbWpaYmFeXo9uYmdsenZub2l2dn9+bYSAfoaXe3+HgYp/a5OIcmd0gHt1gIN+iY5/jJNzfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4KNjHd4bnqNYGV9cWd6dHltbXF3g2dkfG1kZ2doU2BfVWdgbG9cXm6OaE1pbGBVVlNvZ3NrZnhlZl5acnZvdHx5dG6Ke393nHt6a2FlbG1eYG5qZXF5fmdaVlhfbHh7em+DXmFdaFZYYFhknIhia3CBhnx2a2p2bFt1cGp5aXVybm98gXNZa25gWV5WY2RZZXFjVF9iaWFibFpgfmtmbHR1b214d21pho2AinuIbXFmcHtscWxhWF9nZm5ygHNyXmlsU2VwZFVibWF4YW90enRpbmtqX1dgZmh1XGRWYlZUT1lnU09dT1BIZXBdY0daak5KYEtYbWVfeGlvf2VgVV5UXnZcVVJgZ1BeYlVUS1xaUVp2dl1fZm1oWGNhW16OcWNoanhyc21ndnN5g3OCg3uIjn58ioiOeW6PinRsc4J0f3+IhYeShJWPen2Mj4iRm4SAfI2Ecn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6OjY2NjY2Njo6Ojo6Ojo6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySlJOTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2NjY2NjY2Ojo6Ojo6OjY2Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA/LzExMTAvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDRERERENHZGhnZ2dnaE1CQ0NERENYaGZnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMjy0aHR0dHBpohoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1NDlcYF9fX2BhQTU2NTU1NE1hX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn1+fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYeHiIiIh46QkJCQkJCMh4eHh4eGiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFhoiJiImJiYmHhYWFhYWFh4mIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7enx8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46RkpGJh46KkJKTkYuQjouNhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjY2Njo6Ojo6Ojo6Ojo6NjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCLhYiHio6IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkIiFhYWIj4mMkI+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQiIWHh4iMiI6Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin58dnZ4fHx7fH19fX19fn5+fn5/fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhImIhYyIj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+KjoyLjYyOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enl5e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo+Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx+f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomHgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYSEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX1+fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSUk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OTkpKSkpOTkpOTlJWVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZGSk5KTk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZKRkZKSk4iFk5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJKCgpKQkZGOdYaRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf35/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCPkIhwhZCPkHx1iJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6PjHNvio+KcniHj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNd217j4JzeIaNjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39/f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4dzbm+Ee3V2gIWDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFlYWFdUUFFSU1JTTU1KSUZFSEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3dGJeZF9ibHFmaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhiXWpsXWZmZ2VjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSElKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWlpqd21ibnJqYVlZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NW2tybGFtdXJmUVFTUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU5dY29rWWlzdXBTTU9QUFBPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRkJGSFViaGtvcG9tbFpMTE5NTk9NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUNGR0hNWmdoZ3JubmhmZGBeXlhMSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+Af4CAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+SVpdWlxlbG5rb21tbGtpaGtkU0dFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7PUtbaW1ub2pvbWtpbG1mUUdFREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwc3R0c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgYJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oj1IY29zbW5samtoVUM+Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3RycXR4eHl9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTk9SmBzdHBnVD86Oz1AQUA9Ozs+PD08QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl6e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09Pjw6Qmx8aj85Oz49Pj9AQEA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A7W25APkRFP0BBRF9kOz09Ozo9PkFBQD5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpHVnBwcXNzdHR1eXp7fHx+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojptd0k4Ozo9PkE7SGQ9PD08ODo7Pz89PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPD09SUxGRXV2Tjc4ODo7Pj9XakE7PDw6Ojs+Pz89PTk6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3lJO1x/g396fHdXPD0/PT0+RWh0TDo9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUdyeWtig4SDgoOAfV4+QENAQD1Kc3tZOj1BRUFCQkZIQz08QEREQUA/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARW90fYKCgYN+fYR2TUFDRUA/Pll7gF0/Q0VJSUxRTU1LRUNGR0dFR0VFRURFQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXJDREVEQ1d1hoeHflhHSEpOaVpPUE5JR0lISElJSEhHR0hIRUNFRUVGRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnV2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEiWxBQVZ0h4mHh4eIg1dIS1ZzXlZRS0hISEhER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklLS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIhFZshIeGhoaHiIiHfFBKWW5lXl1UR0NNRkBAQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERkdJSklKSEhIR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xLSlSBg4SEgoKFhoaEgoaFhISGhoaHh4aKdUpgYmFhY2VTTlg8PDw+Ozo8QUFAPjw5OTg8PD07Pjs4Oz9BQkBBQ0NCQEFBRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGAgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISklJZYWEhIR/gYKDgoODhIWFhoeIiIiIiYyOcWhoZ2VnaWZoRjY4ODk2NDc5Ozw6ODU2Nzc4OTc4NzU4ODs7Oz1AOzk5OT08Pjs8PUFDRUhKTUxMR0lHT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlohoSEgX6Bg4ODgoOEhomKjIyLi4mKi4yMeG1saWhpalk1NjU1ODczNTY4Ojg3NjU2NTY3Njc2Nzo2Nzg4OTo3NTc4OTc5Nzc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHZ5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANjc4OD06PUVDQmWFg4GAgoODg4ODhomLiomJioqKiouKiouJdm1tbWxsVTc4NTY4ODU1NzY5OTc3Njc2NTo5Ojo6Ozc5ODk4NzY2OTo5ODg2ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1dnp7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhYaJioqIh4eIiIqKjIuKi42Icm5vb3BlQD46Ozs8OTo7OTo7Ojo5Ozo5PT09Pjs7PDw6Pjs5Ozs8Ozw7OTo8ODo6Ojo5OTk8Pzw8QUJESUpNS0lLTFdvcnN1c3Z4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4qMjY6CcnJxcWNHRkNCQUI+QENBQD49Pj5APz8/QD9APT0/Qj5AQT9APz1AQEA+P0E8Pjw7Ojs6OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uLi4yNjY1+cnNyU0tKS0hISEVGSEdFQ0FAQkVDQ0FCQ0I/QERIRUNFQ0VEQUZFRkRFRkRAQj48QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDREZXhIKDhIWFhoaIiYmIh4aGhoeJiYqLjI2MjIyMjIt7enReZ11QS0tLSUpKSklGRERHSEdEQ0VGREJISUtHSEdGSEdFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT5CQkdHSVmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjY2NjY2Mjol7eHtvZ1VNTE1KSktIS0dER0lISUVFSEZGRUxMTUlKR0dISUpOTU9MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg4PDs7PTo+QD4/QENGSUlQX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjYyMjYyNjoJ4clVSUk9NTktJSUZKSUVLSUdLSklKR0dHS0xOTExISElKTVFOUE5NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1RucHV3d3l6eHl6e3x8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AOTo8OD0+Oz1BPj9BREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMjIyMjHNbVlRRUU9MS0hHQ0hKSE1MR0tPTEtKSkxNTE9QTkhJS0xPUVFQUU9PSkhKSkxKTEZHSEdGRklGRUVCQUJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4qMjIyMjIyNfFxbV1ZXVVFOTEtFRkdNUE9QV1VRUE9RU1JNU1RPTVNMUFNVVlJTUlBMSk1NTUtOR0dKRkZISkVERUVCRUNjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CQEJCR1ZORk5QUFRYe4aDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjI2PjIuLbF1abWJHVVNSUUs7O1NUU2B1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9NUlFQUFFLS0tISEpIRUZJSUlISWlydnl4eXh6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHR0ZFPz9BQUVBQ0dFREVMWFJNVFVWWFp8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfmGKi4uHb19nWDxZWllUUT9AV1ZZXGRgVllicl1dV11aVkVRWVpbWV9UWWdSVlZYVVRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3l5ent6e3x9e35/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36LiYuMe3FyWl1dXFNVU1dXVVtadYNZVX2QYVxYXV9XSVZdXVtbX1lIWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4SLgGhbXF1aVVdVWFNSWFZjloBSZXJYWldfaFBgZltbWFxnYUdPWmhnXVtcXV1XUk9TUFBSVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FQUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfoB9X1NXWlZTVlRSUk1QTUxmeltdVFlVVl1aTFRaVVNUXlpYV1dXemtYW1xcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fX19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrf35rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlVjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d6b3JZTE1QUE1PTEpLRUZJRkM/VGRVf1JRUU5LUVRRTU9ZUk1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dXVzc3d6ent7fH17fX19fn19fX59fn9/f39/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5cWVVQTElMSWFsknRQUVNOUVJRUltSU1JRUlVUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnZgXk5FQERERERDQUVRQ0VBQz5DSUdWQEhOTEddaVBIRk5GREVGSUdIQkRIR0lLR0RCQURAT1FNUmRydHZ1c3R1enx7e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUU09WYGtscnZ7e3h5dHJuc3RzeXh+f4OAg4OCgIKAgoGCbE5IQUE8PD5AQUBAP2tRS2BFRkhJRUI/R0xOR01RVUlBRT8/PD08PT0/PT9BQ0NAPz09Qj5KTkdVbnV0dXN0dnh7fHt8fHx8fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSkpQUU5LTFFSUVRWVVdRUVdVUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlREJBQj07Q0NCQkRCXF1Pe05PT05LTE1PT1FMS01XTUhHQEE8OTc3NTk5PTs7Ozg6ODo/PEJIP1xzdHV1dXZ3eXx8fH18fH19fX58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF9cWklIUFJRT01QUU5RUlRWWFNTWVRPWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIR0hIQ0JHSUZGRURNUlBhV1NYUVBTU1JVW09PUVZQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEM+ZXNzdnd3eXl7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFZXXlpYTUtUVFNQUVVPTFJTVFhYVFRZUk1XWVpWWFhWWFldV1dYaHNrXVZhc2tiYV9eZGFfXllVUU5PT01JSEpMSklGQ1FQU1tXVFROUVNZU1xlVU9TVFJOS0lIQz9BOTk5ODk3ODg1NzU3ODU5OkdtcnR3eHl7e3x+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RWVVVVV1BTVVdUVVJdbl5STlpfW1ZZO0RWWFRbZkpMUFNST05NTk5OTEpGUVBVWVNUT0pPT1VTVFxWUlVTUk9NTElISEY/Pjw6Nzg3NjU5OTY3Njc1V29wc3d5ent8fX19fXx9fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwb2ZlZGNcXVJUWlZXVVRXVFJYWFlZWVNVT0pHT1BPT01SSlBQT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFNNSUxLT1JQUlJTVFFST0xNS0xMSENCQT06Ojg3NjtCNTU2Njpkb3F0d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpJR0VITEhLSEZMTVBNRy9FX1I+Mz8+am9hU1JRQEdUUVBRUFFOUU9RUExKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHV5e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hFRkhKTUxFR0NPUkM4RU5TXWdUUVNBR1VQT1FRUE5NTk1LTEtMTk9PUUxPT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ0eHt6e317fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRYV1VMTEtJPDk4Nzs+QD48PUFAQj0+RUhHQ0VGSUdKSkBGQUFARkhFSk9IUVJiXFFQUk9TT09QTExPTUxNTU5PTltXS01RT0dJSENISkxMS0ZGRkU/QkM+PEJHP0I/QWRwc3d6enp7fHt6end7d3l+fnx7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0Q9OTc3OT9CPjs/QkBAPkBESUVDR0dJR0lFQkI/Pj1DQkFHSURNT2JlUU1PTldLTE5LTE1NTUxMT05TZE5KTFJISUlFQUhKTE1OSkdJR0JBQkA/RUZFSERLbm92eXl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTU1KTVBNUE9ISkQ/QT05ODo6P0I/PEFCQUFERUdLRkNISUdHSENDP0I/P0BBPkRFQ0tOUlRMSklNVEZJSUpMSktMSUpNTU9QUlBKR0NMR0NCSklMTU9OSUpJR0NDQ0RISk1MSVlybXd5eHp7enl8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUdLREdISEdKS0lKS0RGQj0+PTk5OjtAQj89QUJDQ0dGSUtKRElJRkdHQ0M7QUBCPkBAQkVDSU1QSEhLR0hLREhKTE1ISkxISUpMS01dUkhIRE5GQUNKSk1MUE1LTUpLRkdHSk5OUU5MYm1pdnZ3enl7en1ybWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktERkVHRUZGR0VHQkNAPjw9OTo6OkBDQD5BQ0RFSUVJSkxGSUlHRkZEQjtBQ0M+QENEQ0RHTE5IS05IREhFSUxOTUhJTEdGR0lJTE5LSUdFTkhCRk1LTUxPTU1OTUtISElPUlJTTlJmZmZxb3N4dXt6fGxoam5la3Fsc3BmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSURGRkVDQ0NFQERCPj8+Ojs7PTo9PkNBPkFDRUZKRklITEhHR0dGRUNAPURFQj5BQ0NDREdISUdNUEpGRkdLTk9LRkhJRkVERUlKSEpJRkhPS0NJTUtPTU9OT1BOSkpJTFJVVVJPV2RgYW1ncHJvcnl6Z2VoaGRpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxIRUVIQ0JBQkQ9QkE+QT06Oj0/Oz0+QEI+QEJER0pFSUZJSEdGR0VDQkFBRkZDQkJCREVER0dJRkxRTElPSkpNTElHSEVHRkRDSUlIS0pHS1JNQk5OTVBOT09NTk9LS0tPVVdWVVNYX15caWFtaW5ocnNiZWZmZGhoZm5qZm1taGtrbXJpcXZ0c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3d2dHd1anN1bnV0c3FyamtzTUdIRkhCQkFERTxBQEBDPDg6PT45Pzw/QkBAQERGSEVIRkZIR0ZGRENFQ0RJRUNHRUJFR0VGR0dFSk1LSFFNSktISElFRkhIRUNJSUlLTUtPU05EUVJQUFFOT01OUE1MTVNXVlhYVVhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpbnlNSEdISEJCQkZFPD9CQkQ8Nzo+PTo+OkBCPj8/Q0VGREZERUhGREVDREVGR0pFRUpHQ0dIRkhHRUNGSkpHTktMS0hKTEZJSUtIRUtLTE1OT1JUT0hTVVNQUk9RTU5RTk1QV1pWWllWWl1ZWGFgYWBeaGVjYGRmaGdqaGhpZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1d3V7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5ISEdJREJDSEU8QEVCRT04OT4+PTw8QUI8Pz5BQUZDRkNESUVERUVGR0dHSUZHS0hESUhHSUdGREhLSUdLSE1LSktMSExLTUtKTktPTk9SVVZPS1VXU1BTUVJMT1FQT1RZWllcWllbXl5dYGNeXGFja2JgZGdncoVoZ2lmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB0TElLSUtGQkVHRTxAR0NEQDo8P0A/Pj9CQTxAPkFBRkNFRUVJRUZFR0ZISEZISElLSkZKSEhLSEZGTElISEpHTExNTExJTUtOTU1QTFBQUVVWV09LVlZVU1NRUkxPUlJQVltbXV5bXF5fX2FgYWRdY2BlZmBlaGpkc3Nmamdna29ycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKS0xKTEdDRURFPEBGRERDOz8/QkBAQENBP0I/QUNIQ0ZGR0lGSUZHRElIR0lISkxISEpKSUxKRkpLSElLSkdLS01NSkpNTU5OTlBLT1FSVFhWTU5UVlRSUlFQTU5UU1JXW11eX11dYF9gYWFgYWNlYmRoYmRpamd2i2xqaWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZud0tMTExNR0RDQUQ8P0VFRUM9QUFDQkJDREFDREFBRUdDSEhJSEdKR0NISUdISkZJTEhJSk1LTkxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1BXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BEQkVEREZCQ0VHQ0NJRkNISktJSUtHREtKR0hKSUlLSEpKTkxPS0lMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGF2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RDRkVERkJGRkdERUtGRkpNTEtMTEdHTUlHSktIS0tJS0tOTE1MTExJTE1MW3NiZHBebG1VTU5mc11mZnFsbnRncGlfYVlubmJwcGJrampmb3F0ZXRub1xvdWdwTUpxeXZrYWBrZWVteGxrdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUhHRUQ/QUJAPkNGR0JGQ0ZFRkVEQ0hISERFS0hHTE5OTE1NRkpOSEpLSklMSkpKS0xNTk5NTUpNTU5bcm9vbnBwbGtNUFFsV01pYnRycGFtbnVcWWxQXG5tWnFta29teHh0c2lwXV9ya3FqVXV5eG9jXmtmYmdwcGpqb3BwcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHR0VFRUJCQj5AQEZHQkdESUZFRUJGSUhJRUhMSkdNTU9MTU5HTE1JTEtJSk1JS0pKS09QT05NTE5OTFxoZHVdbHFXbE5QUW1UWWtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl1eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITEZJREVFQ0FCPUJBQ0dESEdMSEVDQ0hKSUhGSkxMRk5MTFNSTEdMTEhOSklITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllya2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altedGN3eHJqbnpoYWFjZmJiaW10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9uc3N2c0hLSElCRUVFQUE+RERCR0RISU1JRkNGSkxKR0ZLTkxGT0pLV1JLR0tKSk5JSEpMSUtKSEhLTU1NTUlLS0tTa2NbaV5faWNyclpfWWpuX2VlVWtfY1thYVFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ2dHdyR0dGSURFQ0ZBQEJGRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpFSEhLTUlISkpLS0lISUdLS0tMR0hLS0xNTUxKS01OVFtcVFBUTFBPTk9PVlFPT1FOT1FKSk9QUWRxaVRZV1xbXFZZW11YXVxcY2ZhYWViY2ZfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRkVBRUNAREhERkdDSUtMSEZER0tMSUVHSVBLTE9LTFdMSUVFSElKSElLSU1KSEZHR0lHSElFRkxJSkxPTUpQXFdeUFxbYF5NWFlTXFxiXk1YWk1YYVJLWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJEQ0JFSUVHR0ZLSktIRUVJSktGRUhIUEtNTUpNUklHRUFIRkpJS0xKTEpIRkRJRkRGR0VGS0hDSk5MTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5fXF5TWl5jXlpdYGNgWV9jW2BeW1RYV1leXWNiY2FjZWhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhoaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0dIRkhHSEtKSklERktLS0VGSUpOS05LSExOR0hFPkdHTElLTEtLS0lHREhEQ0RFQUZKRUBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVhVVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHh5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQkVHSUZHSEhGRklHSEdIS0lMRERLS05NTEtIS0pISUY/R0dOS0tLTUtLS0lGR0NEQERBSElDQElKSFBdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXGRjYmRjZlhRVVRRW1daYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZERktKRkZGSEdHSUdGRklMSk5GREtLTU5KTElLSkhIRkJISFFNS0tPTUpLSUdHRUQ/RUNJSUJCR0ZFVF1ZXlhfWV9bXVVYWE9dXVFLSlZeWF5bXVVZYFJRX19iYmBgYmJgY2JhZGRiWE9RUVFaUltdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhIWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FIRkRHTVJIQ1FKRUdISEVGS0pNUEVGSUpLTkxMSUtMSUhHREhLUU9NTVBMTEpLSElDREFFRElHQ0JHRkRXVUVcVF1TVl9YT1RVTlpaTUlKVGBhW19YXl5hXU9ZYVxgYF9iY2JdYWJXYF9UUE9PT1dRXFtbXFxeX2JmZmVsZW9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZIRElSYlBDVl5JR0dIREZNS1BQRUlJSktOTEtLTEtJSkdFSk5RUU5PT01OTE1IS0FEQUNER0VDQkVHQk1IQktLT09OTEZNRkdJSkhHTEtNT1BJTE9QT1NPTFBTUlVaWVdZWFhkV09TVFBQTk1PVFNaWFhaXVxgYWRlY2dja2xwc3J5eX97en+EhISFhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdHWExHSEpIR01MUVFIS0tLS05NVU5PSkpLR0dLUFNTTlBPTk5OTkdLRmBFRF9MRWZkRU5cSV5bcm1PTVVtWUxEUGBVa1dnSl1XVV5ETFFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqUlZVVFtcW2BgYWJhYmBmaGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWAg4N/fnp7TElGR0ZIRUVLT1NJSkZgVEhJT0pJT01SUUxNTExPUlVST09JS01HSE1RW1lPUFBOT09PSUpRf1FJfFlZcnRZUW1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtfVlZYf2p0dXVeX3ZeV2FbW2ZbX2BhYGFdYGFnbXBsYHB3dHiBgYKDg4J/fX+Adnh6bHZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSkVITU5CRExMRklLRVJWTEtOSUtSWFdRTU9PTVFUTk9RT0tLTkdNUFNbWlNRUk9QUFBKSFp4XVR4ZWhaU1VSdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Jye3xvfnhugHJfYGBiYVpgX2drbmtibGZnbXd+gYCCfnt4d4B0dnppcn5uc3x+d3h7foCDeHyAdXx/fHxzc05LR2BdR0FFTU1ISkpHSlBPTU1KTlZeWVVMUVNOWFpNU1NSTktPSFFSVFlXVlBUUFBQUUtIZ3hsY3hybVtLTlZ5cHVtdWJvdlBlZUpmdnFtd2+AamZ4eGlXclFoem1panp6fWx4en9vaG9ZdnZqdnVwgF9yZn1pbHh8b15fX2JhW11iZGdpaWRnYmNkbGxwcHN0c3NzeXFyeGJsdWdxeXtzcnZ5foFzdXpufH15eHJvTktTdU5DQkZQUEhKS0lLUE9PT01QWmBaV0tUV1BhXlJWUVlSTFBJU1RWWFdXT1VQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmhxdW5teXB3bHZ0dHJsbl10fnprbXl8a3RsfGtwdnV4Xl9fYl5dX2RkaWdnZWVeYWJpaWlqa25va3FvbWpwYWNmY293eG9tcHN5fm5xcGt7enRzb21MTFtWSEdFR1JQSUxNSktQUVBQUFBXXFhVTVVZVWVYUlJZXlNMTklUVFZXWVdPU05OTlJJUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1pwenteYHpzY3JveHFoZH1pcnxeVExsYHZ1a2l1e3ptfnhrfHBcXl5iW15iZGRnZWVlYlpjY2lra3JzcnZnbGloZGdgYWthZ3NybGdtbXJ8a21oa3t0bW5rbU9IS0tISkhIUVBMTk9MS1JSUk9TUldSVlRQV1pWVlRUVGFfUE5NS1RTVFFWVk5OTE1PUEtIUU5QVUxLTFNUVFNUUFZVUVFOUVFYWVJOUFVUWFhYW1tVUlNXW1dYWFpPU1VXWFhSXllXXlZUUFlSV1dXV1heWmdyXltbWVxdX2NaX2NjZGZkY2NiWmNiZ2ZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2dqdWpoZ2lsUUlLTExNS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVdPT0xNVlRRTlVTTk9NTFFQTEpRUUtRTUtMUFJVU1FSU1NJSExOT1FSUVFRVFZSWFdcV1NSUFJUVVZTWlFOU1JYVlRZVlVaVlRSVVRUVVdYVlxZXmBdXFpaXFxfY1tdYmNkZmRkZGFZYGFjYWJoaGltYmFkXl9jXVpkXGJtYV5mZWZtc2RpZ2prZWRjZmhQSktMT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYU1BQSk5XU1BOVVBOUU5MU1BNT1VTTlJOTU9RVVFVUVJUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdWVllbVFBUVVhVVVpVV1pWU1JXVlVXW1haX1xVWF5cXl1bXWFhXltiYmNnZmVkYlhfYWJdYGdkZmVhXl9dXV5aWmBaX2dgXl1dYmhrYWdmaGZkYGJjYk9MTUxRUUxPVE9PU1FPUVtZV1dYW1lYWVZdamRWWFlaV1ZTU09KTlZUUE9VUFBQTU1SUlBSWFRRUU9NUFRWT1hSVFVVT05NUVRWVVRUUlRXVlpdXFpWVlFRVlhWW1tXUVRWVlZWWVRYWFZTUllXVlpeWV1fXlVeXF5gXFtfX19fWmJiZGhnZGRiWGFgYl5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUU9VXFpaV1tbXFhaW2RxbWhkX1tYVlVXUUxNVlNNTlJPUVJPTFFTUlVaVVNQUE1RWFdSV1NTU1hNT09RVFhWVVVTVVlYW15dW1tWUU5VVlVbXFdSU1dWV1hWVFlbVVRSWlhXXF5aXl9gVWFcYWFdYGJfXGBdY2FjZ2hkZmBZY2BhX19lZF9gYltaXFtcWVpZWFdcWlxbYF5fW15eYWBeYlxZYFtRTk9OVlFQVFFPVFRTUFdcXFxYXlxeVlxeanF3eYBjXFtVVVdRTU9WU05RUU9SVFJMUlRUWVpXVU9ST1NYV1RTVVJSWk9QU1JWW1ZXV1NWWlhcXVtbXVZTTVRVVVxcV1JVVlZYWVNVWlxVU1NdWFpdXlxgYGBWYVtjYl1hZF5cYmFjX2NmaWRmXltkYGFgYGNlX2JeWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVUUlFXUlRQW15eXVtgXGBVXF1oanJ9c2xnXFRXV1FOUlpTUlFUUlRVVEtSV1ZbWlpTT1NRVlZWVE9XUlNaUlRUVFhdV1hZU1hdWF5dWVpdVFVOVVZXXltZUlVVWVlZVVdaXFZTV15aXV1gXGJiXVlfW2VhX2RkXl5jY2FeZWZpZGZeXWRhYGFhYmRgYl5YWl9bXFtYWFhXV1tZW2BcW1tcW1haW15WXlldUU9PUlpQWlRVVlZTVFReXmBeXmJcYFVdXmJreXRsfWtaVVlUUFBTXFRVVFVUVllXTFJbV11bXVJPVVNYV1dUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlRV1JZWFlfW1pUVVZaWVpXWFpdV1VbXl1eYGFfZGNcXl1dZWFiZmReXmRjYFxnZGhlZGJfZGFgYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TTlBWWVFdVVZZV1dVWF9fYWFgY11fVF1fYmVldYF6aFdZWVNVU1ZcWFdXVlZXXVhPVV1aXl1cVFJXU1dXVVNUWFJTVlRYV1hdXlhdW1ZdX1hfX1hcVlFYVFlaWmFZXFZXWFtaW1lZWltZV15fYF9jYmFkZFxiXGBmYWRmZF5fZGJiW2ZjaGVjZmBmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOU1lWU1xUVldZVlZcYGFiY2BjXl9WW2BkYV96dW9oWVtZVVdUV1taWlxZWFlgV1BVXlxgYFxUVFhQVVdWVFZXUlNVV1paW19eWl9cVl9fWl1eWV1VUllXWVldYlpeV1hbXFtcW1taXFpaX19gYGRiY2RkYmRZYWZjZmZlXmFiYGNeYmNpZGNnX2deYWJjYWFgXl9YVFtaWltbWFtYWFxbWltYV1lYV1xbW2BdVl1dU09WWVZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5bXFpWV1hZXFxdX1tZW2JWVFheXWFjXFJWWVBXV1dXV1ZTVVRYXFxeYGBdYFxXYV5bXltaXlhVWFdbW19gXF9YWVxcXV5fXFtdWVtgYV5gZWNkZWVmYlhjZWRoZ2ReY2BgZWNcZWlkZWlfZl1jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldZWFtcWFdZXmBiYWRhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1laWF1gY2RfUlhZUFdXWFlZV1ZXVl1dXmBhYF9iXllhXV1eWVxeWVhVV1tcYF5dX1paXl1eXmFdXFtaXGBiX2JlY2VmZWZiWmRmZmlnYl9jXmFmZFppaGJmaWNlXmJiY2FgYF9dXVpYXFlZWFhaWFdaW1pZV1hVVVtdXV1gYGJieEtYV1tZVlxbXF1aV1xdX2BiZGFiYV1gWGJjYmFjYWJdW1xbWFdbXF9dYF9dW2BkXVxYW2JlY2FSXFpPWVhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl1ZWVRYXV1fYF9gXFteXmBiY11cWFxeYGJiY2VkZmRlZmRcZWZnaWZjYWJcY2dgXGloYmhpZWRgYmFjYV9gX1xdXFlcWVhXWFlYV1xaWldXWE9YWl1hY2Zmcmt/SllXXFpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGJiYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF5eXllYVVtfXl1hYmBeW2BhYmZjX11UXWBhY2RkZmVnZWZmZV5lZmhoZ2RkYFtmZ15haGhiaGhmY2BiYGNiX19fXF1bWltZWFhYVlpWXFtaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhIKCgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoKCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t6enp6enp6e3t7fHt7e3t6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7enp6enp6enp7e3t7e3t7e3p6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYiQzNPS0tLT1Z6GiYmJiYaz1tLS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMipTd5uTk5eTnpYmMjIyMiL/p5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh4eHh4eHd3d3d3d3d4eXl5eXl5d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYSFhISEhIR+fHx8fHx7gYSEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnV1dXl2dnZ6e3h7eHd2d3p3eXp6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7eXl5eXl5eXp7e3p7e3t6enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3Z5fXx8enl8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomNjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3dnp9fX59eXt6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDhISCgoKCgYGCgoKCgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd2e318fHx6fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enl6fXt8fXp8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh7eHp7eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoKBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYWEg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KBgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDg4GBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t7fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgYCAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGBgYGCgoKCgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3Nzc3JycXBvb29vcHFzc3NycnJyc3R0dHNxcXFyc3R0dHR0dHRzc3Rzc3N0dHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3NycXFxcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Nzc3JxcXBwb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubm5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgoGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnNzc3JycXFwcHBwb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5ubm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGBgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFxc3FycnFxb3yCb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoGBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFxcXCHhnBycXBzmIJucHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYGBgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcX2hgm9yb4uefG9wcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoGBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXJxdZ2hdnF3n5x9b3FxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcXBwcHFwcHFxcXFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGCgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJxmKiQb4KjnX5wcXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgYN5cnNzcnJyc3Jyc3Nzc3JzdHKTqaR5iKGefHJzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/gH5+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fXx2dnd3dnV4enh4eHh4d3h5eZ+0qaSnqZd9e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt8e3uJr6ahtaqso357enp4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX19fZillqKyoJmnk32Af319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af36AgH9/fn9/gICBgICBgIGBnJyOoLCgn6KfgICBgH5+f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/gICBgYCXmo6YsaGYlZyFfH5+fn9+fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6MiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5+gIF+fp+rpJekm5uWoZ+Gf319f4B/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGBgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgoODho6fsqiioJmdnaaorKigmZGHgYCAgYCAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpGPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4ODho2grbGmm5qgm56cnJ2hpKOdlIeDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBg4uXmpeWmKCbnZ2dmZqXkImGh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhISFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+PkJKRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYGGjpSTl5qcnJuUj4mHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6Tk5KOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhIOEiJCTj5SYkoeDgoWFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKBgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZOSkI6QjpGRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgYKCgoGAh5uIi4eCgoKBgICAf4GAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgIB/g4iOgIGCg4OAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiYaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJloiEgoSCgn9/jJWCgoGChIKBgYGCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKRkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6Zi4OFhISEgoCRmYaCgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KTkI2MioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBkIyDgX9+fXx9jJyOgIKBgYKChJSUjIGCgYKDgoGBgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhIWFhIODhIOEg4KGlJSSk5KPjYyIg4SEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GWl4mAfX19fXuBmIyAg4GBgYCOlIyQgYKBgoKBg4KDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgZWfin5+gH2Hi36EhIOEgoODgo2JhYyCgoODgoqPgoODgoODg4KCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yEfYaJgH6FhYWEhYJ/fX19gIOEg4OGmI+Cg4SEhISFg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoaGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyKiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOJkYOEi4WCgYF+fYGHhoOAfn5/f39/f4OEg42ZlZKIhIWEhYWEhISFhYWEhYSGhYWFhYaGhoWGhYWGhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f36AgISFlJujq6KTh4WQh4aHhoaFhoWFhoeHh4iGh4eGhoaHh4eGhoeHhoaGhYODhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiYiFhoWDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/f4mSnaWmpqKTkJKIh4iHiIiIhoaHiImJiYmIh4aHh4eJiIaHh4eHhoeFg4OEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWFhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt5iZiXnKGgnZ2ajIiJiYmKi4qIiIiJiYuLioqIh4eIiIiHh4iIh4eGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJKQj5GOioaFhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKCgoKCgH9+fX19fX59fHt+kpuZnZ6cnZOHiImJiImLiomJiImIioqJi4mGhoaGh4WGiIiIiIaGh4SDg4SHiIiIh4WCgoGDg4KDg4SCgYKDgoGEg4SDgY6TkpCPj4uJhYWGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fX5+fn5+fn1+fX2AlZqZm5qZkoWGh4eHh4iHh4mHh4aIh4aJiYODhIOFhISFhYaIiIaFg4KCg4WHhoeGhoSCgoOEgoODhIKBgoGBgYODhIOEkZKQjo+Oi4eEhoaEgoGBgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCg4F9fH1/gH9+fn59fH1+fHqAlpmZmJWSgoKEhIaFhYODhYSEhISEhIWEgoKCgYSEgYKDg4WGhYSCgoGCgoODhYSEhIWEhIaEg4SFg4KDgYKDg4SFhIeSkY+Nj4yJhYSFhIWCgYGBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgICAgX9/gYSEg4ODgoKAfX1/gICBf31+fn18fX17e3qGl5eVlo+BgYKBgoKBf36BgYGCgYOBgoGCgoKBg4SAf4CAgYKCgICAgYCBgoGDgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGAgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn5+fX+ChISCg4KDgn59fn+AgIGAfn19fX1+fXx6fHuKlpaThIB/gH9/gIB+fYB/foCAgX+AgIF/f4CBgX59fX+AgX9/fn+AgH+AgICAf4CCgICCgYGDgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYGDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gIODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p7e3yNjIqLl4x9f35+f35/gH9+f3+Af4CAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B/f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEhIKBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9+fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enp6eX6MjYqRj4F/fn9/f4CAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/foB/f35/f4CAfn6Af39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6enp6eYaOh4KCg4KAgIGAf4F/gICAgYGCgoB+gH5/fn5+foGAgYB/f39/gICAf39/gYB+f3+Afn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSEgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYKBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19fHp6eXl5e4WEgoKEg4GCg4GAgoCCgYGDg4ODgYGCgIGAf4CBg4GEgoCAgYCBgYGAgYCCgn+BgIF/gIB/gICAfn9/fnx8iZSQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICAgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFhISFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX18fX18e3l5eXl4fIKDhIWDgYSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgYKCgICBgIF/gIGAf36Ok4yHiIeIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYGBgYB/gH9/gICBgH+AgYB/fn19fX5+f36Ag4SHh4SGhoaFhoaHh4aHh4iHh4eGf32AgICCgX59fX19fX19fX19fX18fH5+fnx7eXh4eXl6f4KCf4OLhIOEhISXl4ODhIF9foGBgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYODhIOCg4OCgoKCg4OCgpGQi4iIh4mHhoaEhoWEhISDgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgICAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eHh4eIhoeHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eXl8gIB9h5SDg4OEhJSTgIGBf39/fn6Ei4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOEhISIko+MiYiIiYeHh4WGhYSEhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx5enp7fH2BgoGCgYOCgH59f397iJF8fI6Wf31/f4KGioWDg4SDgoONiX99f4OEhYWDhYaGhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4SDgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenl6e3x5eX1+f4B/gX99e3x/fn2ClZF/hIh9fH5/goR8fIGChIN/f4eDfYKBgIKCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX19fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn5/f35+fn59fICBgH6Gj4F+fYJ+f36Agnx8gH+CgIGAfnx7ioJ9gH9+gYCAgYKAgoCAgIGAf4uUkIyMjo6NiIiHhYWFhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaGhYSAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx9fHl6e3t4eHl7e3p8goCBf4CBfX9/gH99gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6BlJKNjI2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gIGAgIB/foB+f39/fn+Bfnx7fHx8fHx8fHx8fH19fHt8fHx8e3x8fHp6eXt8en2Fg4OAgYF+gH9/gH6FgoF+gH9+foCFhoKAfn6Dhn99fH5/gIGAf39+fX19fX57fH1/f3+AfX9+f4yRjo2Njo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KEhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aFg4CAgH1+fX5/fouEgYd+fXx8f36Cgn99fX19gXx7fXx+gYSDgYB+fn5+fXx+f4B9foB+f36Eko2NjI+NjIqGhIWEhIODg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fn58fn6Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fXt8fHx7e3p9foCAg4OCf35/fHx8fXx8gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIuQjY2MjYuKiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfX59fX17e319fHp8fH2BgoGAgIB9fX18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIOBgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e317f4GAf35/foB/f35/f35/gH9/f39/f39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5/fnx8fXx8fXx+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiIqJhYiSj42JioeFhYOCgoODhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fn+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4ODfX19fH18fX19fX1+fH17fXx9fX59fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4uJjJGQjoqJhoWEgoKCgoODg4OBgYGBgYGBgYGBgYKCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX5+fX59fHx8fn19fXx9fX1+fX1+fnx7e3t8fH18e3p7e3l6enl5e35/g4OEh4mKiImOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAf4CAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36DkYSEg4F/fn18jYd9fX59fXx+f3x9fXx9fX5+fX5/fH18e3x9fnx8e3x9enp5eXl5ent+foCBg4eEiI+Oi4qHhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoWFhIKBgYKBgoF/gIKEgX9+gYB9foF+fX5/gIB9foCEgH5+f31+fX2KhX1+f31+foB+fX18fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjouMiIWFhYSDgoKCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgIGDgX+AgYSBfn6Af31+gH59fn6AgH+Bfn+Af39/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8fHx9e3t7fHt8fH19fIqKiYmGhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKBgICAg4B+foB/fX+AfX1+foCAf4J/gYCAgICBgH1/f3+AgICAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fX58fXx8fHt8e3x+ioeHhYaIhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35+f4B9foB9fX1+gH9/gYCBgICAgIGBfn6Af4GAf4GAgH9+fX19fn1+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCIg4SEhYSEhIWDgYKBgYKBgICCgoOBgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgYODg4OFhIWDg4OEg4OEhIOBgICAf4CBfn19fn9+fn5+gH19f3x9fX6Af4CAgIKAgIGAg4KAf4B+gIF/gIGAgH9+fn5+fn1/fn6FhYGBgX+Ag4F/foGAf35/f4B/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgoB+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/f4B/gIB/gICDgoGAf36AgH+AgYCBgH9/f39/f4B/gIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x6fHp8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF/f4B/gHx9fX6AfX5/f39+fX98fn5+gX+BgH9+f4B/gYOCg4B/f4GBgIKBgYGAgIGAgIB/gIGAgIKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fYB9f4B8f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIGDgoGDgX+AgX5+gH6AfX19foB+f4B+fn99f3x/f4CBgIF/f3x+gH6AgYKDgYCAgYOEgoGAgYB/gYCAgYGAgYGBg4OBgX+Ag4B+goOEgICCgYKChIJ+e3t8fHx9fn1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYWChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CAgICAgIKCgYCAfoCCf3+BgoOBgYOCg4OFg399fX18e3x8eXp7en15e3l4f357fHt+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SFhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gIB/f39/f3x/gH+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4CAgH9/gYKBgH9+gIF+f4CCgoCBg4KEhIaEgH5+fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH59fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX6AgIB/f39/fIB/f4GAgYCAf3yAf35/fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn1/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7f4V9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB8gH6AgH+BgIB/fYB+fn9/f359fX6AgYGAfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgoCAgIB9fn5/gH18fnx/gIGAgICAgHyAf4B+f4GAf399gX9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd7eXd4d3d4e3t6e3yFiX17end6fH19fHx9fX1/fnx9fn59fX18fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgoGBgoCCgICBgH5/fn9/fXx+foCBgoGAgIGBfX6Af35/gX+Af3+BgH9/f319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKBgYGCgYKBgYGAf4B/f399fX9+gICBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYR+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBko16fH18e315e3p6eHqBgXh5fHx8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCBgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7j393d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgYCCgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHenh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCf4B/gIB/gH+AgIB/fn2Af35/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x9eHh1eHh5e3x8fXt8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgoKDgICCgYSDg4SBgYOBgoKCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GAgYKAf4CBgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx7fXx7fX94d3Z5eXp8fHx8fHt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KChISAgIOBhoODhIGChICEg4KCgICCgoSBgYKBhIJ/gIB/gYOCgYCBgYCAf4GBgYGBg4B/gIOCf35/goGAgH9+gYCBf4CAgYCBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH9/hH19fXx/fXp9f3t6dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B8f35+fn15eXt6enp5c3J0b3dxd3lzd3uFgoKCgoOEgoOEg4CAg4OGg4ODgoKEgYSDgYOAgIKBg4GCgoGCgX6AgICCgYKCgYKCgIGAgICCgoGEgH6Bg4F/f4CDgoCBf4CCg4KAgYKBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhxeXR2eHR2e4SCg4KDg4SChIODgYKChIaEgoOCg4SBhIOBg4CBg4KCgoKCgYKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgIKEgoOCgoGCgoOBg4SDhIOEhISFg4SCgYOCgYOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBf4CAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISBgoOFhYWDg4KDhIKEhYKCgYKDg4GCgYKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOCgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoCBgHt9gX58eXx6enp9fHyBfnp8fH19fHp7fn5+gIB/gYGBgICAgIKBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhIGChIaEhIOCg4SEgYOFg4KCgoODgYOBgoCCgH2AgIGCg4KCgoKEgoCCgoODgoKBgICCg4KAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCf4OBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6fH2AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fn5/fn18fHh2f3Z3f4SHg4KDhoODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4KCgYGDgn+Cg4SDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH9+fX6BgYB+fn1+fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiGhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGCg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYODgoODgoGEg4GDg4SEg4SEhYSEhIWFhYWEg4ODf36BhIB9fXx8fHx/gX5+f39/fX99e3x9fX19fX5+f4CBgIGBgH99fH6Cf39+fn5+fX1/f39/gICAf4CEhIODg4WDhIOFf36CiouFhYSDgoSFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhIOEhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoSFi4mEhISEhYWCh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF6hH9/f36EhIKDgoKBg4SDhISFg4SFhoSFhn2EeX1+f4N7hYOAhIOAf31+f35+gYOBfXt/fX6Afn18fHx9fX19fH19foB/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOAgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBhH6Dg32BfX5/fn+Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFhIaIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SEhn1we4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd216c26Ah3ltfXJzdnN2bW53bHB5bHV9f358foGAgX2Af32Af4B/fX18fH19fH1+f32Af4CAfnx/foCBgYCBgICAgYGAgIKDgoKDhYeGhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb2x3fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fYF+gIB+foCAgYB+fn9+foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhYWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYSFhIWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f396fn19f31/f359gIGDg4CCg4GBhIKBf4GCgH1/f4F+f359foGAfn6BgoCAgoSHhoODhoSEhIWHhoWFhYWHhoiFhYaFh4eFhoSGhomIhYSJi4iFhIaFhoWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cHl9fW19dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WFhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSDgYODhIOFg4WEhYSGg4WGhYWEhIWHhoSEhYaFhX13hYOEhIOCgX5/fnt8e357fH1+f399fH9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGh4WFhYWGhoeIhoSGhYeFhYWDhIWGhYSGhoeGhYSGhIWGhoaGhIeGh4eGhoeIiIiIhoWHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIaEhoWEhYWDhoaFhYWEhoeGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1+fnx8fn2Afn1/gH5+gH99fXyAfX5/fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFhoaFg4OFhoaEhIOEhIOEhoSGhoWFhYOGhoWGhYSGh4WEhIWFg4SIhoSDg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYF/fHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWGiIWGh4aHhoeGh4WIiIeHhYaGh4WGhoWChISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDhIeDhIGChIWDgYCAgXt7fn18fHx+fXx8fH1+fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhIaGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDhIKCgn+Ae31/fXx8fH59fH19fH17fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGh4aGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHhoiGhoiEg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f39+fHx9f318fX18fnt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWFhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4iIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWDhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBgoKBg4WCg36BgoF/hIJ/f35/fn98fH1/fXt9fXx+enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x8iYeEhoSGhIaGhYSFhYWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaEhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWIg4SFhIaGhoeFhYSDhYWGhoeGh4WGhoaFhoaEg4SFgoGCgYCEg4KCfYGBf36DgX5/f4B8f3x9fX59e359fH15enp5e3x9enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhIODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4WHiIiGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhYWGhoWFhoKDg4WBgIGAgISAg4B8gYB+foKAfYB/gX2AfH1+fX57fn18e3l6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoWFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4SFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWGh4aIiIaFiIeJh4aFhYWDhoSFh4ODhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhIWFgoKDhH9+gICAgYCDgHyBf31+gn5+gH6Af399fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXx/fn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhYaGh4eHhYWIhomHhYSEhIKFg4SGgoOGhISGhIeGhoWFhYOEhYSFhoWGhISEhIWDhYSAgIKDf35/f39/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t8fX19fYB9fXx8fYB/fXyGg4aGhYaGg4SDhoKFgYGAf3+AgH5/gYF8fn9/fn+AgoKChIWDgoGChIGAg4KBgISFhIKBf4CCg4KEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhYaEhoaGhoaFg4SEg4SFhYWDhIODhIKEhIB/goJ/fX5+fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8enx8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gnx9f35+f3+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYKGhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWEg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgX6Cf35/gnx/fn19fHx8e3t6enp6eXt5e3p5enp6e3x5e317e35/f4GAfX99fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Afn5+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGAgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx8fn18foN9e358fYB/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzMzMvLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs+QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTw+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT48Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPTM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbLy8vLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTT09PT09PT1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDs5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5HqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWy8vR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX2NfX19rb2tra2tra2tvc29vb2dfX19fX19fX19fX19fW1NPT09PT09PT09PU1NbV1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0A8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1NRqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1svMg21wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSNi4uLi4uLi4uLioqKiJ+7ubm5ubm5uLi4uLi3vdPT09PT09PS0tLS09PT2+Lh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXJsaU5TYkxMVk08Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLUEae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fLzU4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWFJTU1NTU1NTU1NTU093qKSko6Ojo6Ojo6OjoqvT0tLT09PT0tLS0tLS0t/r6uvr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h3bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9QkA5PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXy81SLDExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmnlxWV1dXV1dXV1dXV1dTeqmlpaWkpKSkpKSkpKOs0tLS0tLS0tLS0tLS0tHf6urq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8Oz46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX18zOXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqqJmYWJiYmJiYmJiYmJiXoKtqampqampqampqamosNLS0tLS0tLS0tLS0tLR3+np6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTo6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjMzcTCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs7Ozs7NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMvLy8vN0tLS0tLS0tLS0tLS0tLU09TW1tbW1tbW1tbW1dfY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojs4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzc3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7O0tPPz8/T08/P0NPSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfX19fX19fX1tbW1tbW1dbW1tbW1tbW1tbW19fW1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9WSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O0qucz9DQoZbL08eSq9HOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTw9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0racpaPWp6Crn8+ZrJqy0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz86dnJGeuZ6WkKG0lYadnM3Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj48PDk2P0I/Qjo2NDg6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz9G/mKCbtZefoKiZtb/Jl5nF0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0I6NzQ6Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/TtJmWqrmcpqCLn8TTkZmhz9DQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD08OTY0Ojk4Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyqCjv8qcpYynrdiqmarUz8/P1KuafqOPpZvHyZTYraO/ntXR0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjk8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NSsm6eLl5SflZWku82IlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENHREFBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw8PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DTtrKypZ2Gnq+znaXQ26OZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GSbF1cb2doYl1PRj9ISEZFQDw8Pj48PT08NzU2Ojk2Ojs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cSimZagj6ObopyckaeYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09Ojo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LiroMfVoquknL6eqKGjnqiiqZ3Q09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlJRS0tAPj1EPD9DRj01NTc7OTY6Ozo7PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT08iRjbTZr42RpdSako6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVpaltMX01KTEpUTEZCPDw/RkVHS0k9NjY3Ojk3OTo7Ojs9OT45ODo4Oz0+PkE+PTk8PDo9Pj47PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHUyMHV0tXAvdbU07nI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FETExBPjc3NTo4ODg5OTo8Pjw+Nzo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0dPU0tLS1NXT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPT03ODY5Nzc4OTk7Oz0/QDw8ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEFBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PS0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJES0lNS0ZJRT5CRDg4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT48SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDREVDQUxINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NTU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFFBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDs6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hERUA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb2tra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8ODc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ozg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg6ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk5Ojg2ODg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+GgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvN3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5NzY4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODY1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vb6/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1MzU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njk9Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm5uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTU4ODY4Njw6OTw9PTs6ODY2ODg6NzY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEY+ODs3Mjg5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY2OD8+QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY2NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7W1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3t7e3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLe3t7i5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurq6+wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM6PT5AP0A6QEJCQj8/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLezsLCtrKuqqamop6ipqamoqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e4t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmJmZmZmampqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk5MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WlpaWlpqiop6iopaaoqKeoqKeoqKmqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3tre3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmYmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw+OjpBPDc8ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87O0BDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKysq6qpqKWjpKWmpqWmp6eqqKamp6enqKinp6iop6WkpKKhoaGgn56en5+fn56foKGho6Wko6OkpKSlp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW1tra1tbOwraupqa6rqKWlpqanpaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJmampmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8Pz0/QT88P0JDP0JCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpaWjoqOlpqalpaWmqaqppqWjpKWmpqSjo6Kio6Khn5+fnp6cnJycnZ2dnJ2en6CioaKjo6OhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mYl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj4+Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0A/QkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaSkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzU3ODs9ODo6OTk7PTs7ODk+Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6emoJ2cm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTkpSUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OD07PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjoqOjpKSlpqalpKSioaGjo6OjoqOlpqampqenpp+bmpuioJqWl5Wam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampqSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4OTo4OTc4ODo9Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8+QUE+QUE/Ojk9PjpQnaCfnJucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36amn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoKGgpKenpqWjoqGjp6ampaOjpqampqanpqagm5mboaCXkpOSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKjpaSlpaWlpaWlpKOko6KioqGgoKGgnp+fn5+fnp6foJ+cm5qZl5WUlJSTkZCQkZKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmpydnqGmpqalpKOioqanp6ajpKampaWmp6amop2cn6Gfl5GRkJSXm52YlpeXmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOjpKWko6SkpKSioqKhoqGgoJ+gnp2enp2dnZ2dnZ+em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojg2NTg0Njc4OT04ODs6Oz87Ojs8Ojo6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWl5iXl5qeoqKhoqOkpKOjpqalpKanpqWlpaalpaOgoKGhoJmSkI+Wm5qenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKCfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkZCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampaWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp+foKOkoqGhoqOio6SkpqalpKSjoqGhnpyblZOVmZyam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Njg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJydnJ6enp+goaCfn6CgoKGio6OkpKSkoqGhnpyamZejt5+ZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmYmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamZeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoJ+foKGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKGgoaGgoKGhoqahoqKioaCenJubm5mhqZacm5uZnJ6alpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CRkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPT07Ojo7Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+PDo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipaGeoKGioqKhoKWyraCgn5+enJmZmpqcrmZ4nZ2em5manJmXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qbmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTkpCRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoJ+mk5isn6CfnZuampqZqoBEgZ+enpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgn56dm5qampuamJmZmJeXlpWUlJORkZCQkZKSk5OSk5OUl5mYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8PTk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ojk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpubn6KinpucnZycnJ2eoJ9hmaifnpyampuco6FPSISgnZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6ChoJ2cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fnpyZm5qcnJuampmWlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtCQzk8Pz87Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo8Pjk/QTw6PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJeYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udm5qnalyioJuZmZudnK9ySkyGoZycnZybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZiYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFE8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmYpYJTd6KZmZqdm6CjX1dOh6GcnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpuanJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaChn5+fn52ZmpucnZqZmJWWl5aVlpaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkXFxRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycm5iYmaCKXGCTm5qbnZyjj2VaTYGinp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj5COkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtbTEY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5yZmJmemV1edZaanJ2dooFlWk1/op6fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5ubm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw5PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2cnJ2cm5ubm5ucmpiZmZthYmB+lZ6cnpd0Y1VPgaKen5+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJmamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKZmJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTo9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enZ2dnJqbm5ybm5uYmZmfaV1bY32cnJ6LaV5QU4efm56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjJCOkIuLj4+WiIiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKqsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ojk7PDo+PTtAQDs8QjxAOjg0Nzw7QkBBQj4+O0NEREBDQz0+PjlhmZWLkYaNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmbmpqXk3ZuZlZ5lJidiVtUUFmLko6SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6ODs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPjJGPi4yPkJGRjpOdn5J/oqWYpp10T1Bkh4eCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6OkA8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDgIWim4x8ZpKlk5x7iINjdICAgpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY5Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn6Co4l5bFFznI2LWHB7fH9+fIWOjYuGjZSRi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzk6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqFgIJ9mZl1U0tLc5OFgkxeb3F3iYWKjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6PTg4Ozo5Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0uAgomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gH56gXyDfoJ/fYB/g4KFj52RiYF/go+Xjo6HgoCBiIuFfoqRi3+IjYyLi4eRjqOLUDAvO3iGdnVAQltqboKQiYmQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzo8ODk1ODc1Nzk1Ojo6OTw4Ojw9Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZCeoZ2Tl5uhmp2boqecY0NfSzx4eGlmRzE2V21ykI+LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQz44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqaqujkl4qn5AfHhlYlFWY0peb4qhoaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0U+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKmqaeoonZjwtSlRX2QhHhPbY14VmKAo6inoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQERCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaeqqaSnp5mdpKWjop5jgbvArnyko5qXbElce3BSdJWjoqChn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZWRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9O0BBQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKgoqehpq6mppyfbIOYuYus06ObtKxcTa+aVWWQoZ6goJ6doKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaiqrbGyr6ujo4d3fnpz0cSwmaOtbFanrmZdh6agpaKhnZ+imJWem5+fpKGclZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVVxoZG9jbWlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Gem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqp6+3t7W1trKtsK2Ph4Ftksu9lZWmlXRWbXd1c3+VpqqnpKGfo5udoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrsri7vLy6usK5tbSehnZhVp61u6anmYd4bXJweHl6fYSMkZaboaanrKalmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh2a3FoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tbjCyM7S0MzIvbGjjXBlUkSIlIWFhX14cm9mZWtoa3FzcXFydHuLqcbGu6Knqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWlhZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8XH2+Tj2cm7rqOVhnJZWlFEZndqbnRua2VlWVhdWFxiaWpoZWFrj7jBwLmpr7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdubVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGvszQ1Mq5ppqRhHBcUVRLRFtmXmNqZWJhaFtVWVRXWVpcWV15nri6q7SyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4R/amZoYWtsZ252cnJ1cmdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL7DwcfLybiVdGFUT09TSD5fbF9fZWNiX2RiVFZXVlRVW3mirrCqqKutrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dWtsbmRvbWlxeG95amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7m4w59mS0RHS0Q9WmRiYmpkYVxkX1hTUFBSXIe2uqyupaSjqKSgoKWZqbSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+dlJOJiX6GiIyWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3dua2lodlpncnhzemdnXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMTEwsTBsIpTR01FO0taX2ZsZ19cYFlaVE9Zh6esuLWyrKmjoa2prKetn6y0tL/Dvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXZ2ZWZqamhea29ueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx8LHnXFcSD8/RF5iYWtiW1hXU1mAobm/u7y6vKytpqm7urm3v7O1uLLBxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhaHZoamp0bnlsXmRbVWBZTEhENjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc7GxsbAr3pVTi9WVFdoYVJOVHqyycjCxMfAvL60sLCwwr6+wcbAvre2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46LlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cn14cGdga2p3bWlmdm90Y11jVVdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXCwsLDwZVDTnmDjlZQea3N08W2v7/Av7q7vbWzs8C/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enmAc3BmZWdkbGVia25vb19ZXVdWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK+vMemeW2CkZZytMzIx9HBr729uLm7u763tLC5vrO8vrG5tbi8tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXqDeG5mYWViYWNkZGpjZ2RbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zJz8C6v8C8u8W9usDEv72/rnBhfJGKi9HFv7/Jv7DBv7q3u765tbi0uLy0vbi1tLCzvLG3t7i/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66srKemnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKeho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFjY2hrZ2dqZmpeVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTk2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1Iy4v7vDtbrHtrW4ury4ubarpZiNfITJv7+7wb65xr3Cv7zFuLa3tLi2tru7uLa0t7q1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaGioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWdwamVsaFlZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+8z8N2qMy9x7e5t622tLe5s7WxvcnFlUh8yr6/vr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d9a25xZ3FrdGZjbmBcVUhLS0RKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNetc4C7yM/CwLiutLS7vbe5sb3Dyo1Eds3Dwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcmZsam51b3lkaGNcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCxsnRmHBzrNHRzMrEtbq/xMi+vrS/wMB3UW/LxsK+wby/w8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRwbWx0bG1vYGNfYmJOSE4/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdHDur68xL63vMC/yc/HyMrJwYVxc6XMzMvNysbCw8vOwby4vbqwbmNjvMjEwMC/xMDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh7bW14fGBxZFxfYF9UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7ur28O+tr7Avr66ppypsrbDv6V4dXibxMbLyMHDwL/JysG/u7mxoHxya67IxcS/wMG/y8fDwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSknp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem5zeHRocF5cX11aUkZFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8S3ba3Ovba5wLysfW5obm1ygZWYc3d8l72/xsC5wLy+xcS9vbixsJiPfICbysLDvL2/v8PDv7/HvLy/tLSutbW8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdtdXtwb2pcYGFaVFFBRklHS0BFQ0k8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fm52bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNsnaBs722tcKlh2laXmBNUltabnN3gZ+4uMK6s7u3u72/uru7rqSal4aQfsDEw768v7u7uLbBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytry0sayjqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnZ3bnJhX2ZdW1VKPT8/R0c9R0NDOTo1Ozk5Pjw8OTo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaeFeIqgr7WdamVnVllgSUlNUFNsd4alsLe+ubK1sru5vLa5vrSWm6WVoHGuycTAvb+5s66yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NhXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8WqiHx1jKCYYFRDWFVHYWpWT0VKYY2grK+2urW0sqy8ubi1uMG9i5evoaVypcvCv7m6ta6lrLOwpq+tqJ2gn6WttrXCt7a0paiqqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnNuY15nWV1eU09OQj9KQ0FLSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmpGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi+tJCCeIiPb05KP2RZQk53gJRqTkFdgbC1s7WytK+su7q4trm/xXWCqJ2ZY6m/uLWysa2tn6SmppyjpZyWmZman6muuayrq5+lqKSrrq+nsKuvsbGtsa6ur7mwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVqbF1ca1ReXFBOSERHTUJHTkc4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiEe1hGQU6HWUpKWHeNgWNBU6O4s7SysLGtsLm4tru3uryPobGqo3KssKmrraujqKCdnp2Wl6GVkZWXj5eeqK6ko6Sgoqaio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J5aHV0b2VVYWRXXVJPTUlASVJETkM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K8qpmZlWlNQFJ4cVBJSUtnnIFZRFKuu7Gss6+urK22trK0ta6opp6am52epqieoKipn6GnlpqWl42bkoyOlIyWmqOooJ+hoqGmpZyjo6CepaCkrKWmqKWio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqppKmrpqmsq6ahiHiDfHZ/emN4bW5dUWlVUE9HUE1NQ1BSQT87PjQ6OjU7Oj07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaqlpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcKrpb5pRVKdglFXSUpgS1SOYWNiga61qrK0rqqrr7Cys62lnZGXk4+XoJ+hoJyjpJ+eqJSZlJWKlI6KjZWRl5uhqZ6en6Cjpaicn6ChnKGfo6innKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclpOPj5KRmZCWlZiXn5icmZukmZeUlZqdoJ2nqKWgo6Kho5+doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn58gHV2fW5se2RpVlJkTklIR09TTktOSDxFQD0yQDg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62trq5ure3u66ooKGpoKrGv8uhUEFznXdQbktMY2Z1c2BaXnCQsa+us7Wqpqyso5uZlI2RlZeYmJyfoqKcnaSemqSVnZqUjY+Pj5CXlpqeo6mdoKCepqerop+gp5+dn6OmqJ6jpp+qnaqtqq6nqLClo6Smp6ymoqWim5mer6iusqumq6qgm5iYmJWTlpqTlZaalpuXmJihnpyclpuhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl8gH53eXxleXlhYlNWYUhJS0xTVUpTUU05P0E2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZykx8eOV1NKZaNaZX5vcl1Ra2NbZF9ca4+0sLC4rKahnJ2alJeamZCOkZWRjI6Nk5minJanpaGVlZaRlpaUm5mdo6Son6WjnqeurqqmorGjmqOmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Ggo7GusrG0qrKuo5mcnZ6hmJubmpiZm5WWm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaYJtZVxTW1pNUUtPT1ZNVE1CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6KanqukjXpVaXJ2dXBjdnZYV2NgY2dZWFdnra6sr6efnqKglpCTm6CcmZeSk5+coaOanpqYo259l5mgm6KenKKcoqarraerqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztbizuK2ytKSgnaWgrKGhoqGgmpmWlp+bm5iloaCeo6Ggn5ucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh2and1Xm1bUmFJUlZIRlZXS0NNSD1LSThGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamorqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6KhoKSAboJwYGNYTFtTWk1MUFhSSE1NSJisqqmloJ+akpGUmJiWlpaMiIuOlJ2cnZyfmUhHj5+fpqOup6SsoKirtbC0sLCttri9v7qttbSwt7CutKmmpKWsqbmztbvDvMPBt7u2q66xube8r7OwtcG8t76zs7WirKKpqbKpq6inqJqZnpqqp6CZp6Cfn6iopaWfnaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWFfnZybWl3bWhuXFhcQ1dOSkdNSENGTj0+TD40PDo2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqZSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco5+diWFXXmVgV01RRz4+P0NDPz5CUXipramqpqCen6KjnZ+em52blJOVlJ6emJSFpnYqYJKeo6uuuK+vrq+vuLy7u7i1uMO+v8K/trq7wMO5vbusrqexrbHCtrjCxsDIysDKv7C5ub24wr64tLvGxL3DvLi0qrOtqrO0r7Ouqq+jnqyot7Kto7CmoaOwsa6wpKWvo6GgmqGmoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXx0cmtsdXJxaFdcUUZVSERKUEk/RUI0Rkg5Njw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+flXxfXmVgUUdEPEM+RTw/OTZOfqqzp6SjoqCepaymn5idlZKanpmVjIqGiIZ4bItXNWaFfHmAlry8vLC5wcPCxr++wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3GzMzM0se+v8DDvsfGwrjEysnEwce/urS6u7W7t7C2squ7sq+8t8C7uqu4rauquLu1vK6uuKOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlZSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtkaW94a2VaXEZMTUVEVE1FQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QD9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1zamFXTkU+SVl8b2JCPVyOrqygmZucnp6Zl5eYk42Pl5eUj42QjIKDgnZycGxwbFRga3BybnOPrsS+wczN0MjEyNDMzMzHysXFzNDS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysHGx8bKyM/AydHNx8bIxsK9xMG/v7+1vrOtv8DDw8fFyMSvv7myuL3EwsG7vLy1rqenrqigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dXNlYmdyb2deWlpET01DRlFJRENBNTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+OTtBQTs7Pjc4Njo7PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56bnZZrZl1USURAP0uGnqWahKCyraOenJ+amJeUk5SXkZCQjYiEhImHg4CBgYB5cXFuanuAZFh3d3Jucn+dvs/N08qz0dDQ0dHNzc7QxM3U1djR183Gx8nMw8XKz8rS19LX0tXW09TIzMfMzcnTzc7TzcbJysrCx8zHycnGv8Ozs8jFy8vLz8fKv76/vcHHxczMycnAw8CusLOonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5aQjIaRi4B7cnV2Z2NndmplVlhSRE5HQElRQz5CPToyMkE8RTw3ODxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGcY1RMSkRDP0NSrtG9sq+mnJycoKShnZqUlJWUin15cWxlYmhycHJ7hYqAdXBtcHJvhHt2gH10cnVvdJ7P0NOZttfT0dLU1NLP0cPQ09bY1dXSy8nO0MvGzdLK0tXX2dbY09bYzdLKz9HMz9HN09DAycjLxMzNzM/PxsfItsDLwNLNzNDHysnAxMPIz83Q0c/NysjNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNhZXJjXVJcSktHQUZJSj87QTg+NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGlpaCioltJQEFEQUZRdrKvppqUl5+cmqCgnpudmpWJd2lkYV9fX19eX19dYWx1c3Bvbmtwb3ODgHuBeW1paF5tvtOjf9LW1M7P1dTU0dHM0M3T19bT1dDP0tPRydPRyNDX19jS2NLX2dXWzM/Pyc3SzM7RwMfEycfPztHR0sjMzcDLzcbUz8zPycXLx8fJzMvU1NHVz9LM08K5xbGlqLWuqJuoq6Wdsqiws6ysk4+TjoiKjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZRYEpKQ0VDU04/PD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48P0A9RkFEPYKknKClnqWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fX1NXZ2dHO0L+8zMm2vq6nqqiho6xmQzg9PkRYgqqon5eVl5manJ+dmJudk31xZWNiX19hX15hYF5hYF9gZW1wcG1qbG9zdn1yeYByYlxTWaOtcqvaz9POy9LN1dTRys/M09bS0dbNz9XV0cXR08rQ1NXWztPR2NjY18vIzsTJz83KzMDJwcnKzs/QzNDOzszP0MjM0NHLzsvDysjKzcvM0tPO1NLR0NDKvci5sK67ubWrtrCtqLits7+7sZqOoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcG9rYWRucGFYXFtJRkZETVlFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pzk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cgo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSye0hGQjtXjaGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGBgXl9fXlxibXJubnBxcnF2dG93eXRjW1x7d4jR1MnMzcTNytLSzsbOzM3Uy87SzcvX1tDM0dTLzNDS08rO0dXS1dbKwMrCxs3DyMrDzcTGycvLz8vOzdHO1MzHydDNycfLxsfCxsrMztHRx9DPzs7M0MXHwbi5vcPCvcO5srK+sLvDxLWqmKWhmJaRlZWSi5SNmpGUlI+PlYKJhnlxcmttaGBgcWhZWGhWTUdMSVFRQjtEPzs2ODo4Ojs1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4ytXW2drb2MzMz8jW1cTCta+0qKCtl3hsb3B3j5qNjJeVkJORkZWWlZCLfGViYmJgXV5hY2JgX19gYWFgX11bXWdxcW9wcW1pbXNwaHJ0Z2ZjXXfCxcfHxMS9wcXOzsfFxs3K0cjLzc3G0dLPzczUysfKzs/Hx8/Sy9DPxbrEv8bKvcPHyc7Fw8jAx87IxM3LzdDJxcXQycbCxsnFv8HIzczMz8PKzMnHzNDFxci7x8PJycLPwb28v7DByce5vaqxsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Vka2BeZnFhW1dgR0lIR0lNVUc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw6Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62ktn5ngoWiqpONjZaPhYODg4F9hIR+c19bXl1eYF5gY2RjX11cXl9gYF9bWlxha3JwbW1oZ2lqdWpjYl5iZV2oxri/wbm5uLi9yMXBw8DDx8rIyMnIwcXMxsjKzcnEwcrJwcHLz8TLyL+5wbzGyL7Axs/LxMDDu8rHyLvJxsXKwb7Cy8bFxL7Gvr3BxMbMxsa8v8rDxcfSxcHJwMrKxsjG0MPDxsOuxMvHw8q3v7y6s6mspKWYn5iso6Gmm6Ogm5V8d3N1ZmpbYW5tWlxYUkRMR0NHRExERlM/NTQzMzVAPTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ovri8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76ysLZsXnl8n5GKkpaGeoCEhX91eHVycF9aW11gYGJjZGRlZGBbXF5dXl1gW1laXGFucW1pZmdraW53XFhWXWFpqsGttbiwsLGvr8G6uru6uMDBwcS+vbm9wLnEysXGwr3GwLe7w8i/wcm7tru7xcO/vMLOw8a+vrXBvsS7vce8w7q1vcbEwsO3wLa2v7+8zcS9trrIu7++zMTCxsPGycfJxtDGwszIssfJw87MwMXDv7yyt7Cyp6ioubClrbCqrayUend4a2VoYGhvZFZeWUpGSkZIS0FFQkZKQTk6NjU4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWrt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTV183Kz8XJxcfBusW9rK6mYGN2gZKLiIuEeH+Ghn99g3t0dGNcXF1eYGBiY2JiZGViXVxbXF5cXl1aW1xdZ3Jva2RjaWprd3JPUVdicZq0q66upKerqaS1srWzsrO0u7W9sbewta+yu8K7wcS8v7q0srq+wLjIuLS8tsDCvbi9x8HDu7Wvs7W7v7TFuLu1rLm9vsC9sbu2sLe6s8a9t6+8v7W3tcW9vsPGwMTGxsfMxb/GxrvHy7/PycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkdCREFFRj89OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMXLzcjFyM3M0MvNyMnIysnKxNDN0s/NxcfBxcG/urjJt6uwmVtnb4iPhoiJenh+hYZ2d4F8c2hdXV1dX2BfYGRhXmNlY19eXFteXF1eWltbXV9rb2xmY2ZoaGx7ZUlcdYeUqKioo5ufp6SbqKmwrKmrqbOttbCyqK2nrLO7urbDubq5sKq0ubuzwrmvwLG9vLu1u8e5w7etqqiwssC2uL2wsaiys7W7vKuutqeutq68srGquLCuu667uLvAwb66w7/Gw8XAvMbBx8q4xcfFv8fDw7nExsK7xsnMy7O5wr27s4l0dndraWBibGlZV1dbQUxMTUpFQUM/RkE6Ojo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxM/HzcHCxr/ExMPDysLJyr/AvMK6s7W1w66qsJJbaX6SiI6Pe3h9iYV5e4SAd25eXVxcXV9gX19kY2JkY2JgX11aW1paXVpaWlpcY21tZmRkZGZobXlkbYSQk5uipa6am6GdlpmiqKyjp6GrqaursKOmn6mttbaxvbivt6+orbi0s7y3s72wuLm1srzBssCvpamjq7Gzs6i9qquoq6yutbSmqa6hpa+ps6aoqK6mqLessbO3uru7sry+vr7Ev7XBwMfIt7+/xbfFw8C7v8TCvsTIzMq/v8TAwKmHc3RzamlcYW9kV1ZYUEhaU1NLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPHubnLwsu+u8m2vcO+usq3wcTBtLa8trGvtbytqauTZG2Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX11dXFpYWVtbWFdZXF9lamRiY2FkZGhteXmAh4aTmJGVraagmJSOnqCnoqKfpKSmpa2fnJujpayysLa3p7CsqKq0q7O5sLa2rra6s7C6urG2pKCkoKaxqKypuaqlp6eop7OtoKenn5ykpqyfn6ekoaGxra2ssrWztLC1vLa7wcCyu77DwbG5ucKzwL3Atbi8vb68wsfEw8S/wMSghHlxbGJmYGtvYFVZX0hOaE9USEZLRjw9QD06Ozs4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBur22oJ6VnaCmurars7O7s8TPycvCxbi3x8DMv7jKt7vFuLPFuLO/wKy2vLKspq+0raGjkmlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYF5cW1xcWFlYWFhWWFpdXmNiYGNjY2JlZmx5c3FqWFtvRXugn5SSiZqen6Wbnp6ipKKnnZuim56qrqyxtaSoqqmsrKS0uKy3sKyzta+zta+wqp+en6SisqWmqritoqamn6itq5mfoJ6ZnZ+lmpmjnJyesKmsqKqrrK2ws7mvuLm6sLa8u7qrs7K5s720t7KxtrW/tb3AvcPCu7u9l4R7c2xfZV5kZFhUV15JV11LUEdKSkdBPD8/QTs/PDA1NjM2Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru4wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765yLi4v7eywrSxu7usubqxop+pq6eYnpBtfoWGf3hybW9ta2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1dYV1pdYWJjY2JiY2RlcGpYQSI6cWhph5ySkoyXnp6mnZqbo6WhpJufoJmYrq2tr7KgpKKtq6ehtbCxsqypsLOourOntqGin5yjoa2joqq2q6Kjpp6mpqOWmZ2XmZqdn5qXnZydnK2hrKijpKatq7OzqrWwsquyubSvqq+ysrO3s66pra6yuLC6trq9v7ezsZSGenZmX2ZfW1lWU1pVS1tRTEpFSEtJQz0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7KdpaOYpbHDtba9rbS4wszIxsDFtsHAx863wMO9s7m5sr+2sbm7rbK1r5+ao6qhlJqPeH+DhH94b3F0cWhlZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldWVlhXWFdVV2BiY2FhYmBgZGZyRBkcSIqUkI6ZkZSOk5yanpuVn5+nop2dp5uamqunr7CqnKOjt6mhoK6otaqnp66xpLiwpLego5yZmaqmoZqtubCjoaScoqCgk5WhlJaWnJmYlpeclZ+pnqqkop6jqqqxrai0rKqnrbOwpauus7GvsK+vp6iosq6ytLC8tLq4rqOUgnp3ZV9hV1lYU1JUS01eTFBMR0hNTEU9QD49Qjw6NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS6wrG+t72tnaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa68u7W7vLW5ubCvsKqcmqGplZGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXVlVaYmJgYGFfX2Bial8lN26Hi46OlJKWkJGYnJmdlJ6dpaSipaaenJ+moKuvpp+ho7anoaGiqbOipailsKaxrqu1n6GdlpWpoaKUrbGxn6Ojnp6YnJOMoJSRk5iYkpeYmJeep5unoqKapKWlq6SlsKelo6usraaprq+vq6iqqrOmpquvtLGuvLaxr6+fknt4c2ViXFtdWE5MUUhSYU1WUE9KTk9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtr2wu7G3rJ6lpqy4u7zBxbqyubXEycnAwsbFx7bGxLPBv8Wrt7e9tr26u7WyrK2omZmfo4uKdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdVVFZWUlRSVF9fXV5fXF1dYGFsV1yHg4mHjYuNlY6Qk6CXnpWanqOgq6Sjo6Kkopyqq6SanqWxqqGhnqWqnqiin62sqqmuraKiopWYopqckKupsJyfop+fl5mTip2RjZKUlpCYmJOcoaOcpaGilaCipKWbo6uloqSqpKutpa6yqaalpqa1pqqorbO1tLm6r6qsnoxzcXBgW1dWVlJHUU9IWlxPUkpUS1NMRUdKQzg7Oz08OTY2Njo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsa2dqKevubmzwMi6tcCvxcjMusHJzMi1ybyxvsPJrbG4wbW8wLy0taqsppaanJyJgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTTlBZXVtbXFxcXVxfYmuDiX2Kf4iIh5KMj46YmKCZmZ+mp6qnq6eppaKYpK6klZikr6mgnJmboJ+umZyqs5+mpp+jo6GVlJuWlpKpqa2bnJ+hoZuUkIyYjYyRjZKNlpWQnaGgo52co5WboaOhmKKoo6Koq6CrsKSuuKWjpKOsraqoq6+0t7K9tbOrrpiFdXRpW1lZU1VSRlhMUVtYTVVPUExRUklPSUI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraezt66oqK+um6morLe2rLzKu7a/rMzGxbjAzs/Hs8S7t7vCyLGtuL+3vL67s7amqaCWmJmXiHp0gHZ3bm1obW1tcGdnaGZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05PUVhZWVlcW1pbXV5keoR6g3eEiIOLh5GMk5aenZieqailraupsKOnmZ6soJSUo6innZiQj5qerpaYp6qYn52UpaCekpGSkZOVqKqlmpiZnp6XjoyLk4aJjYOPi5KVkaCeoaSZlp+VmqGinpSbpaWnqaigsLCmsb2nn6OstKqup6+0sLm1wLGusKuRfnJ0Y1ZUVU5RSkdWUFJSTExYTktMT1NHTktBQ0ZFQz5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/tKymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrG3uLy9wMOxsLG3rrS0u7O0o6OdnZiXlYSAdmtnbG5xbnFqb2tkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVFJNTk1SV1hZWFhXWltbYGl3cHZtf4V/iIKRhpCQlJiWm6aZnqmmpaudppiepZuSjp6impeXhoWSm6SPlaKclpaVh6Kam5OMjoqQmqWnnJWVl5yRk4iUjouBjI2AkIuSkpKhmqCilpSZmJWippqNmaSnqaehoLSyqLO4oZ2jtqyqrqSysqa1u7WrrLGiinpzbl5OUVFNT0ROTk5QS0ZOTkpKTk5RSE1KQUhMSUhDPjk1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLawpKekqqWgqaaks6qissO1tbKzxsW3usPKzMazrbq9tLjAr66psJ6mrruvraCam56VlYh8hG5fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTk1LS1NXV1ZXV1dWWl1hbGltZ3t/eoF6jICKhpGNkJufjZibo6GjmKSWoZuUjYeZmoxzjYN+jpeWhpKakJSOjXuZj52MgomAipigo56Qk5iWhY6ClH5+dIqOepCIk5CQnZuampKWkJ2Oo6OOiZqgoaSkm6K0r6ywrZ+YprimpbChsa6csbyqqa+pmYR4dGRWTVJQUE1DU05MUE1CUFFISU5TTklKSkVLTUdLSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI0ODUvMDEwMikoLC0wMjc2NDc4OTo6NjY6ODdBN3i3oaO0qKalqKOlpaamprKnprTBuK+0sMnEuLnAzsa+s6y6waytxK2ooqaSnaa3raOgkZaXkpB+eH9mV1ZfZ2ZpZ2huY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkdOU1NTVFRTVVhbXWlkZ2R1fHRtS1VujH+Tg4qalYmSkJ6YnZWUlpONlYmAlIlfO1ZvfIyUioCMkoyPhoZyi4SWgXmBe4aUnZWDlo6Qj4OGfZN4cXCGjX2JgZCOkJeamZOLkIqdiJ+Yh4iWnpqhoJenrqmtqamelq2zoqWtma2rmKi0o6mto5N/dG5gW05TUldMRFRKUE1MRk5PSUVMUU1LUEpJTlBHSko9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CiraGmpqqgpqmno6qwqKe0wbmwtbDHwrizvc+/ua+utcKnqsSqop2Yg5ScsaOamYeUkIuHfnN2XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNTlFNS0hGSE5RUUxPUlRVWFlgaWRecXlsTD89fZOPjXqFkoqDiIuajZaUiZGGhJOFeYl/YEpRbniLkoR+hIyLhH9/bX5/k3d1dniEjZpwUY2IioZ8fnmUdmd3hoh+ioiVi46Rk5eMhIqIlIWbjYKFkpuWnp2UpKKoqaWknpuwqqGkpJGmqpaiqpyhpqeKd25mXlxIUVFTTUlVTVJJTEtPSUhGSk5MTVVLUVJQR0pEPTc2ODo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjExNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aboqedn6Guoaeopaeor6yqtry2uLezwbu2p7nIuLaoqLW2qrK8p56Vjn+JlKmWlYt/joOCfnhxb1hNS01NTktNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERENJTk9oWU5RU1RVWm19am12Y2NYUo6GkoVxfIR+eoOLkoGSmYuOeoWPf3V/eHNvdXB0jo6Ben6Kq4V6e2h2e45wcm14gYuNknh7gHuAd3NyknhodYWEhIV8lYqIio2LgH+Ei42AlIR8gY+YlJyWkZ+dqZ6goZ2gqaWfnZiNp6OToJ+Wnp+kgXNpYl1dSldQUkhLWFJPSk1MUkpKSkxQSExRTVJVTUZJQj03ODs5OT49Ojs8OThAPzo6Pj03PT03OTk0Nzc4NTY3NTI1MTQ3Mi8yLiwuLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqqWtq7Cxqr20sru4trq0sZ+3urKqnZ2sqaiyr6KakY2UgY6cjpF+d4Z3fHdwb2pZS0hJSEdFSEhQVFRUV1dTVFVVVVZXWFdYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MTlFRU1Zec352cmFxiZSXjY15ZHd+dHZ9h498g5iRf3CGj3t2e29rfq18dJCLf3qGkoB8f3RmdXyGbG9oc3yKjYeAbXlxfXFtdo9xaHGBfo5wRIuFgoOFf3d3eoyGfYx7dX2Oko+Yi5Kam6OWmZ2bnZ6hnJaNi6Wajp2XjpaYkHhvbmdjW1hYVVFKU1VUT1BOUFZLTktPT0pST0lPUExGRD07Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNTExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagprCsrquoqbGvsau8uKu7vrizrKebsKesm4+WnKWppaGYmo6EknmJj4uLdnF8bXVwam1qWEtGR0VBQENESExMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WUpOT1FUWF1lb29ng6WpwH1xdmB5dmx5d4aPeXuLhW5ri5J4c3hpaoCCcZaRjIF9lX9JkpluZ3d+gm1qZGx5hZCShmtybHxucnyGaW1wf3ONiYWGe35/e3dwdHSGgnmBeXB8jouKk4OWl5iakJOWlpmXnZaMg4mfkouSjYaQl4Bwam9vb1lWWFRSUllPUlVUUlhVTU5ITUtNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5ibn6Ssr6Ktqqi1r66stL+rvMO/pqKalaSYno2Ei5ShoZiZkZOLc456gIaMhnVvdGxwbWVra1lOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUlZaUVhbXqWGYZhlb3VifG1rfXiJh3WBh4Vza5mRdHN8aWqdjkx5hZOJhI5mMXaHcmt9fYN0ZmV1f4SEhYBmaWx1a3CAfGhxcXxuk42Pe3R+fXFxb3Vtg393eXVqeYiCiImDlpKSkIuNkZSUjpeNgHmIl4iHioaAkIh4bGtwaGVYUltYWVlbTlBVVllYTklIRUpKSEdCQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzMzUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW2SiJqQmZakqK2esZ6nuq+rsrDCsbvDx5qWjpWZi46FeoSQmJWNkIyQh3GHgnSIjIZ6cHNxb3BkcGdfVEZJQz48Ozk6P0BBRENFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FVTEJJUUlirrKebnd0aXpqb4B/g4B5g4WFeXKglHR4gHN0lIc1cJ2onY+hoYSihXZwhnuGfHSMro2JgWhnYmpucm1wg3Vpb1h1cI6bkXZtf3t9bnJucIB7c3ZuYnWDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY58c3JxbWBcXV5cWllhX1JOW1pYV0xISkZJRz9DQUJIP0NEPTs6Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTExMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikYGSiJWRnaSnnq+VpbSprrCuwbK7wcWWj4yUj4CIfG6BkJKJg4qHj4Z1goRslYiIe3V4eGx3bndkal5JUEc9Pzc0NDg7Ojs9PkBCRUhMTExMTlBRU1RVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDhETlJTREqEc3x5eXN7anSFhnp8g4J+i311oZl5foWAhJmEmpxhhqqfnYqDkI56d4h+iYiOc4uXj4R7XWRxdHp8d4ptaGpieW+FkIJ6b4F4dYV6cHR6eGtuaV12hn2HfIeGjn+KkpeDjYWMhn1xhH+EfXZ3e3yJeHF0dWdoYFtcXlNcZ15XUVRYW1VHSkpES0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4in+TjJGcnZ6mkaCqoLGor8Cyu8S6lo6Rk4d6hnZrf4uRg32Kg46MeIOAc6GEin19gX9wgX56aHdrUlhMQEUyMTEzNzY2ODg6PD5BRUZGR0pLTU9RUlNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1FMS1RcWFJLZ4GFeIZ3eW96jYl4e4eFfpaHdqCZh4aOkpSljaypSIausK6LgYCUi4KLgoSSqYeAmJiKnHRtfIGGh36OaGdoeX9uhYeChXGEhkhsgHdyeXZobWtfdn2DiH+HhYt5lJybiYuIkX96dYp2fHhtb3d+gXV1c21cXl5cY2RYZ2ZcVVBQV1lQRExLRk9JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Nzg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkI6Vl5KWoJ2soKa4r7O9s5eNkouYi310cH6Jkn59jIOSlH2Gfoakh4iAgoiFeIeJfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0+P0JFR0hKTU5RU1RVVFRWVVNRT0dDPzgwLCOHWz8/OTQuXZZwc6NVRklLTU1QV2BYb1lbXWeJj4ORfoF/g4+PfISHj4CZlIGfoJeUm5qmrZOZu7Gnu8fDqIuMoaWOk4mBkXxxg56fkZ1/d4WFi5CHkGlocISBdIyHhIpyhoJ3iIB7doR8bXV1Zn+UjoaIiIeIh6CqopaJjpd/eoGIeXlvZ2t4fnyAdWxlXltbXmpeYmdgWk9MTlhSUUlQSkROR0NKRENBRERCPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmd4J6f4x/gZCOipqbpJ2hrKaqrrCXkZGEoZSEeHd/jJR8fpKGkpV/ioCSm46EgIGMioKJjYN/in9scGpdQkA0LS0vLy4uMDIyMzQ3Nzg7PT9CREhJTlFSVFJTU1RSUE9IREI8ODcvOUM+PDw2My5sk5dNUEhKTExLTlZfYn5mZmtymJaLl5CQiIuMl4aRjpyKn5+Roqmko6uTqbaiqMHCrceveLqUmnyNoZ6ZhJOFgo6hn5SZkYWKhY+ZkZZscHWKjIKVjI2Od4+EcW2FgYqWkYKFiHGIoJaGkYmNj5aktKibjJSig4eSg31/a2pqfIKDg3VjX2VgW2hsXmxsXldLSE5SUU1MTEZJUENETkZCQ0VGQz06OTY9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcXaShn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReX+SiJGSfYqEmJKQg4CAi4yJhpCHhImFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5PUlRQUFFTUU5QSUVEPjs8OkRGPz48ODUyPD9SNUhISExMTU5SXm2Je3J/e5uZl6Sin5eelKCTm52nnaeqnqerqaq1l6u/q7bHyLfI0M++m6Bwaaupn4STkoWcoJqbmaaSkYiVopubeHp+lJiTopKXl4GUnnt3lZKqsoiMl598lJ2bjZGVmKOhpbWvnJCYp4eWj42AiGxzc32BfnNqYV5iYGJoZGBoZ1xSRUpLUE9JSUxGRk1DSExGRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjHyKho+QjoGCgImLioWShYOGiYGAh3deYlA0NjAtMS8sLjAvLi8uLjAwMTU+QUFNUVJTUVJTVVJOU0xFRUA8Pj1GR0BBQDg2NjI8OTtGSEdJSk5PUVlshI52koieoqaxu7airKqrpqezqq+1sbGturGzvZuyw6u6ycu3w7+4paKws6ytqqOLlpiEpaago5eBppmNoquopYiFlKShoKuhpKiPnLGLlaOmt7qboKKvkqOdop2Po6GrrquytKGUpKmImYiSiZV5en6GgWliaV1mY19lZF5nZ19bT0NJSFNORkhMRkpHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGJXaW5YeoR2gZOFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkY6DhIGLhYaIkoaChYmHiIeHcW5hQEU2NDwyLzExMC0sKy0wLi00P0NBTVVQUlNVVVZVTltQR0dEPD4+RkhDRUE4Ozw1Qzs9RktJR0hRT1FXgJGeg6uhr6euvsXBqLHEtauyv7K3vbW+tMG2u7qjuMWotcjHtb25tKijtK2wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqK62u7K6rLC1orGssbW7trSutKCnqKOnmqmvrLG4t7immrWojKSOkJKfhniChXhbY2VXZ2NiZGFhZ2BbVEpERExVUUhJSkRJR0VBQEBLREJNRzw5Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtZUWJiV3l1cIGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomIeYaAjJOMh4SBjn+BiY+Gf4aIhoqHkHp4bl1WQEVOPDY6NDVBQjc2NC8vNkNIQlFbT1FVV1VcV1BfVUlLSkE/PkdLRkZEOz5AN0Q3P0JKSkVGVlRQXo6jrKKwsb+ytb7Kx7W6xL2ys8C2t8G0vrC3dLGzprrEpLDGubCysbSopLW2qrGgopebopKlsK6mraunpJigrLS7oqiyurW8v8y/xcW9vbPBt7q3vra6t7msrLGlsKmtvbC8usHBq5i5p5StjpeXqYh+g35tWGRiWWxma2ZYXGNZVlNJR0ZMUUdDSElBSEQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxRVlNZVVp2am9+joOAjoRuenN4h2K5oZmjiZSUlpKUk42PlpGHhnuGgY2VioCEgYp6fIqHhnyKgoGLg5V9d3p1ZVBcZEdFTDtRY2FbXlNGPztIUEVaY1FSWFhaZ1lUYF9MU1BFQT9JSkhFRUFARDxFNkI+SEdKTFNZVF2SrbazubbHvLi7ycy6u8C7t7W7ura9s7mxxWB1sqSxmp6qvamlqKuqpKKytaCrqJ+Vlp+ZoK6lp6aln6OTo6extKiys722wb7TycnTxsPFzMLKw8C9vL67vLe0r7i3tsO5xb3Cx6+euKmhq42kp7WIgYF0YWNjX1ljYGpnU1hgVlJVSUVFTktAPkdEPUtBPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUFJTVBSS1FdZ2xrcI+NhY9zbHJyc4fVwLWZoI2VmJmRjpeRlpaOhod9hoOMlop+g3+CeHuLg4d7i3mBioKXfnR9emtmcHVZXlxQZWRiYGVkXVtYV1xNZG1VUm1tX25fWGdkVFlVSkRCS0tJRkhISEhCSTpEP0hLU1RVXFpbkre+t7y1xL65uMnKura5tbe5sre0s661tphkdaecrXBeoqycmKCim6SeqqWUn5+Qk46WmZion6agnpqZg6SerKWqsK24sL251NHP19DKzNLMz87Kxr++wsq9wbzBwMTExcq+x82yo7qwtK6aq7i7mIB8bV9iXlpfY1pkY1FbYFNQS0NBRUZFPEBFPkFIQkBDPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRW1loX2+WkpCUbmxvdHWHtKyhoZ+LmZyZjI2VkZqRhYqKfoiGjJCLiHyBg3N7ioOFe4l0goqGlX9ze3lsbXV7aHJlaWxpZ2pqaWBmaWlsWm1zlq2kvIiGZ1tvZ11aWlRIS05QSktQS1NRSUxBSkZKT19eYWZpYZa1xbC4srq7s7DExrWvuLCwu6uysaaqt6uMtaedmqeaTpmdjI6flpGmmKWVipOTiZCJj5GRnZuhl5qVloeemqebrK+osKi0tNTU1NbTzNDT1c3Sz8zEwsnQvsnJysnRx8zNws/Rt6/DvMO5pLW5waKEcWVeX19aYllaZ1pRXVhPUEJCSEVCSDtBQz5BRz8/QTc7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlSZVZzkJCYgmdxb3l5g6GqnqaXjJqbl4uNlZGajn2Ji4SNioqKkId8hIJwf4eBhnuHcoOSi459cXh1bHF4fnF6bXhzbWmBcG1jaW1weGl3fH7Lv8Hfp21jeG5jW2JgSlBSVU5ZXk9dXE5QTlRQVFRcbm12gnGWrLers6avtamru7+wqrSlpLimq66gq7SjjrCtmpeYjJCTkYSOm4GNppGciYOLhIqJhIuElJWYl5SbkZyXmZqfn6uspaiirK3P0tXSzszT1NTP1NHOx8PU0cfN0tPT18zR0cTS1sXBzsfHwqi9t86efHFoYGVfWGJTX1tQUVRRT0g+QEZBQkU8QEE+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFVRTU5adYaFindsd3B9fn+hnp6hjIyYk5OLjJKPlYV5hY+QjYqKiJCGfoJ7cn6AgId6hHWFk5CIf292cmtzfXt3e3OCeHJrgHNyaW9xenlxer7Lmn6MsoR2coR2aGFrXUNaWltWZWNYZGpTWFxdYGNdY3d6fYuBmKmkpKGfoKelqq+4qqWyoaGtoaOtoaexn4immpOSkYmRjoiBk4lqlKKMmYSBhn6Rg4OTl62LlY2VmY6GkpGel6iwoqGhpaSpyc3PyMLM0dTS1NLO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsw8LLjXVxZWJhWlZaVVxRS0dKSkpAOzo7REFEPEJDPkdCPkJCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtPTEZKWHCAdX1oc3hygomAnZWdlIWLlYmOiYiNho5/eIOTmIqMh4eLiH6Cd3N7fYKHd396hpGVf4Nud3BtdX91eH10hXx5bId2dG59doR0eHudtYw7QYvFpX6MfGllV0lDZmNlY2dqY213W15maGtuaG6AgoeRi5ydoJ2Ql5ieo6OlsaOjsZ6hpZ2gqKCjsZyFnpKRkY+LjYuGg4+Ef5ybjI2ChIV5lH+CqZWjjJGJl5KLfpiLmpKrs5ibnKicp77Dxrm2xs7S0dLQzNLLyNTO0NXa19fY1NnYzdjbzsnZ2tHVvsrLtXp5cGdfXFRXUl1XRkdKSUVFPTo3OkBAQjpGRD9EQ0FEQjs/Ozs3REM3NTY1NTswNjc5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfJeRnYt+h5KDiYaEiYGHfHiFlpaIjoKHhYd6hHhxenuDhXV5hY6NnHmLcHxvb3p/cXuAcYOHgG6OenV3fXyCdH58hoevc1ipwraNkYJwbWI9XmhycHFwbnh2gWVob3J1eHF6i4aNk5GalZ+Vh4yTmqCanqmfoKyboZqYn6Wen6uZi5qLkJKNhX2Ih4OFi46gmZOIg4d+bJl6hJiGiJOMjZSMhnyciZSQrqqUlpifmaevtr2prb7HzMnJzMvQycPSytTX2dfY19Xb19PZ29XQ2trR1sjUy5Z7fWtqXVxRVFVgSUNGSUg+QT49Nzo9Pzs9Rz0/QUFBREE+Pjo4N0RCNzU1NDc5LjU2NjQzNTU0MjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw5OUQ+Q0dSal5tZGJma3aAiHGRkJqAeoCNfoKCgYN+g3t8hJiNh4t+hYaAd4J5bnt7hoF0eZKejqB2jnWCc3WBfXOAhG+BkIJvkoR1fIGFenaGe4m3xaTBybiBlpuPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aUlI6XkYOJj5aalpalnJeflp6SkZeinZmrlZCQioyRgoyFiIiBhpCRnpuZiIaMgYWXeoiJn5eQiI2Ki4J9oYmRjLyhmJOYmZ2ppqaun6i2v8DBucfKzs7FzcnR1tXV2dXX29TW2drb19va2djO28aIfXtpa2dhVVlWV05MRU5DOz09PDg6Oz05PUA2PT9APD89PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9YZWFdW2h0enlsio2Sd3Z6int+gH5/fIR6fYKRiYSFeoSHe3V9dG18fYZ+dH+SnpGeg5F7hn54j354iopugpqAdJmGfoGJhHt+kHqPqY6Pw6G9i5yknX2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJKFiIqQk5SOnJmSlJCWjYyVn5yUoJSRjY2Pi36Qjo6KhImSlpqen4mMlJKdkYKLgKWZiISNgoWEgaWGioy4mJ2RlZaiqKGenp2kr7e6tazAxsrQyMfMz9PT0tjT1dfA19jZ29ja2tnZ19u5e3t6bmtoWWJdVFBPSURMQjw8Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3RD83Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODY4OT89Q1FTUlheVVhmbW1taYGOinFyeYp7en98f3uHenx7i4aCfXSDhXlzenNtgH6EfneFm6KbnZSSf4yIf5iHgJuSboiohXqgi3yRjYOIhJx9mpCKjKOioJCkr5+LkIuFi4GThldyrYufq5uPg5ibj4+OXIKikYKMn5OVjIeIjJKSi5SUk46Lj4qHlpqcj5SWkIqRk4aAi4iSjYqKnJaYoqKGk52WoIqJiI2bkIOIjoCDh4akhYyRs5idkpSXoaGempKcnqiyuK2mvcLHzcjGz83QzM/X0dHVrtbV2NrY2trX1dnZoHJ/d2poX15ZVVlZQ0FJQz8+Pjo0OTo7Nzo7OjM7Oz89Pjc7OTowOkc9OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J6bWF+koNvbXeLeHl/eoF8hXt7doWEf3NwhYJ6dXd2dISChH5/kqakn6Wil4qdkJSXi4qol3OKsY2Ep5KEmZOFmYyilZ+Yk4ianqOSqbCfkJSQjY6IloxujbeFmsTIspuhpZucmJaQspFkpM3Ilo+Gh4iQko2NkpOJhYqJhZaZmo+PlJOGlJeDf4+LmYiNkKqWl6OjiJmelpqIjoaWl4mEjoyBf4ePpIiOk6ial5OXmaGZn5mTnZujs7Smo7zBvsfFxcnIycLL083N1KnS0dbW1tja1NLazoR1gmtmYGBfUEtWXEJCR0M7QT04Mzc7PDo4PTY0OTo8OjgyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRKUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJlg0d1go58fG1+iHh6fnqBgYJ+dnaAgntsbot+eXx3eHyEhop+i6O0qKSqs6GWp6ClpJaVr6KDkLiVkrOajaGgjKSbr6KknZiQp5epma2wpJeUlZSQi5ialqDAjqPJuKuaoqWtmZGbnLKdhoWoopyYhYiIjpSMipOPh4CGh4iTmJSMipOThpSYhoSRkJx0kJiylZakoYicmZOPipCKlpqJipaNhn2MmJ+KkJCcmpmTmZiglKGdlZ+bobGto6S3vrPFx8S9w8O/xs7KydKnzszT0dDW2NLP2Lx1fHhfYldiWFJJS09FQkNENT47NzY6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2Pz83ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SUVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER01cXFlKaGE7SISLenpthYZ5fIR4gIWBfXB4fH18b3ONen2Be3iGi4mGhJKovK2psr2wpa6zs6mjorCtipq1naK4pZWtpJeprbempKOfmamYqqSvsaqamZyUlZGYoJeau7utyqFptreqsJWYnqKrkpe9pF6qsoKJioyUh5B8jo59g4aOkJSUiIeSlouPlY2LjJeZkpyZtJaVq56LnJSSjZCSi5iaipKdj4uJlqCijZWNl5mdk5yYnpShoJScnaauqKKks7irwsjEtrq9vMXIyMLQocbJzc3E19bQytOjc31rX1tVYVNRR0Q+PENBQjg/ODc0PkY8PDY8MzUzNTU0NTRCMzk6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBRUA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZkhhYGJwSkCLiX+AcoaHfIGJdYKKg35tfXx8fnB3h3eNgYd7jZCMhoyaq8LAsL3GvLO0wby0rKuztoyosq2tvaubu6Oorbm4q6amoqKko6qvsrGqnZykmJuYmJ6ipqWTo7mvqL+8rK2yuaWjp32IhpytvbCCi4uKkIOPg5GOeoGHkI2OnIiIj5eNipSXlJCalpynmrCakaudjpqPko6WkY+Vl46RoJCIlJukrJSWj5ScnpShnpuYoKCVmp6np6SipLCzpsDGw7Cwu7bFxcO/zafHw8fDvNXQzMTKinZ2ZF9cYl1PTENMQEVHPkE/Qjw6ND5BPT01PTY+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNCNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVKSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGhGX2lnW11ck4yMiHuHi4aDjHWGkIqBbn57gX5xfoF6lHqSlJSYkZOVqLTHycDCzMLDuce8uq+rubuXsra6ssCvpcCjq7C8vKquq6Oinqesr7WxqZugqpyinJafsLSnjKO6urXBu6uonLKkpKiUhI6pxMSkgouOhoiEhpWUjHqDjJGPkaGMjJSRj4iXoJiTmZSWpaCunIyqnI6Wj5KRlZWNkJSRj6GThpefoLKflJuUoKGZpKCaoJuglJiep6Smp6SvraW/w8KuqLe1ycO+ts6yxL7Du7PRycfBtXd7b15bXmxUTklETUtLSkBBPUJEPDVBRDs6Mz04QjMzMjI2M0EwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmdcTWVcZlRjapqNloqLiJKPhol5hpOQgXKAe4x/d4eCgo95jaGWqJqamLu+ycjKwtLJysLNvcGzrby/p7q/vbzEuK3BqayzvL2qsKqkpaOsrrSutrWgn66fpqKZo7S9qZyovMGjtravq5OwrKqsloaaqqelkYKMkqSViYB1iZF5hY2RkJ6fko+Ui4+MlKOZl5uUk6KeqZ+RpZqMj4+QlZaIfI6VkpKjmpWgopy1ppCgl6Wko6WfnqaYnpWXnKWjqKiisqyou8DEr6Wzt8zAuq7Ds7u9wbmtwsLCv5lwe2NbWV5dTU1OS0dEQ0hCQUFESzo0REg6OzQ8N0YuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5sSV9YYVpkZViej52Ol46ekomKf4ifkoR4hX+Ufn+QiImQgJahmq6no5jDvsnEyMbTzc7Ny7zCt7C6vbS9y7vDwba3vK20wLm8rq+ooamotq6uqbK3mp6soqiinau3t6qlr77Esb25s6eqtLOtrZaVpa2ooJGOkrHFp5WNfZGVfYeRmI+qmZeTk46TlZOlnZOdmZOgoqGcmJ+Yi4yPkJ6IWpCWl5KWpJlmmaOes6WWopasraynnJ+nl5iWmJaho6imn7Wrqbq7w7SmtLXLwbiqtqyzu7iuqLi6vLeEb3BcWlZXUEdMVE5LP0FIRERIRkY4NUZNOz43PkFLLjMyMDI1QjU1UFdOPExGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhWPD5AQkZCc0ZpSVJmZE1GppSclqGXqJaMkIOHpZKIgYeCm4ODlZCQlI6aop+vvq6hx77GxcjHzs7P0sq+u7axu7u8v8+1xL23ubezsrazuLOsp5yrq7mrqaivr5ejrqWopKW1wbCrrbS+wrnAubOnuLS3sq+VpK2wr6WLk5SgjXPBmX2XmYSOlpmLsZWamZWSkpmZpaOVn5uWmqicm6GgmYqMj5adYEqWnJqVmaWXVJawn6+cn6WVr6+tppuhppSTmZmOnZ+moZm0qaqzvLy7q7Cyx8C4pqyrrbGxo6GysrSlc3FnXlxQU01GUVFQUTtIS0hGR0FDPTlLVD9BOj1FTS83NTM0OkIzNE5XTjxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NUVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oWDw6QkNAPVJFV1N0YlZGSKuXmZ+hqK6YkJeHiqeWjYiShZ+HhJyXjp6gmqOktcm0qce8w8TJy8nIzM7Gvrqzr7q4wMHNtci6wbm1urKvr7O0p6ScqrS1q6qnrayZpK6mpamsusCoq7e3vsHAvreyssOwt72so661rbqmiJuXpZp1vp+EmJ2Okpiai66WoZybl5San6CpnqegmZqqmaGnnpeQjZGdg211k6KalZyin5CtsqKrlamqmKqvpqWhpaqTkpmciZWcop6WsKepqrq3vrOyrr65tqCjp6ilppycrampjWZoY2BTTU1HSU9KVUw9TUVNSUpAQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNDOjlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc8Oj0uLlNhTVZIfmVeSEaslJyhn7uumJSei5Oqm5GRk4iqjIahnoyjrJSjpLbHvbTCu8PCyMnFws7Iwr25sq+5tcDDyrbGscG8tbusqa2ssKOjmaq0u6aqp6yqnaivqKSrq768qK28tLe+xry2tbjAsL2/s6m1t6y/pY+il5Chn7yeiZqgmZednY+3n6mcpaOanKGap6SzoZudpZynqZ2YlI+Um4uWiYykopSco5+gtbClppOxq5qrrZ+fpaSqkpaVoISQnp+clqmkoaG0tbq2rai1srKenKKmmpeVmauhnnhjX2FfTElGSE5RSU5FRkdCUUpIQERHQVZTREg8QUdRMTtCNzpCRjc5XVlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdFqJeknp/DrJuXpJeZqJuVmpqOqpaVqKaVrayZoqu3xcK8v7fBwsDIxL/Nxru+ubKwubS+w8i1v7C8trq3p6Srq62hoZurqsSipaispp6rr6yiqqi+uKatvrC3t8a3tLi4vrG+wLa0srWvvqOWo5WTmpOtn5ChoaSio56QvqSpnamsnZ2hm6afvaKYo56iqaugnZWNlZ6TnoeOhI2TnqSgnbasppyWsqaZsKignKufoY2alZ+EjqGanJKlpJqYq7G1saqlqq2sm5igoZKOkJapn5RpZVxiXlBKSEtPTEhFRElAPU9IQDtGSUhbUk9LPUhOVTRCRjg+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLTBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZmNYTqObo5uexaugnqudnK2fkaKelqSfpqqrl7axo6mztsXCvcC2wMK8ycK/ysi2uLW0sbS0t8LGt76xuLS6tqCnrKqrnp6fpaTBpaGqraCkqa2woqeovbWlsbu3trXDsrK3ur6yw8C4uK20tLWjnaSUkZOgrJ+YoZ2oqKqimsKsqJ2srZubnpimoL2hnaSYq6uspqGZjZqfkp6Ijlh/lp+moaC5qqeUmLajnrOioZyxmKCPmpWego+gl5aOoqOVkKWus6upoqKlpJWVnJmLj5KTpJ+JY2dcZWFNSktLT0ZFQUdLPj1JQTk5SkpOXVFRST1MVlw4Rkk9RE1JOEhjXEtDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YVM2U1prV3NIRTY9dWVcTFCfoKCYnsOnpKKzoJyyp5Kqo5+jnq2prJ27samstbHIw8HDs8LDvsfEvcTKvbCxtq6xtbDAxbW6sbC6tq2aqbCpqZuepqGnwq2crbGcqqKusaqkqL23pra7va+3w62zs8K/ssazurertLatqqKmlZWUoquhn5+Zp6uvr6+7sqWfqamZmZeToqS4oKGjkq6vq6SlnpGhnpSdjpCNlJ2ao5+otaenjZi0nKOvm6CcsJGhlJiVm4CSopaPjqCgk4umrLClp6KdoJ6SkpqUhYuSjZyfgGRoXWhmS0pMS1NBQ0BJRzs7Rj44OU5NVV9SU0o+T15dPUhQQk1MSThOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8d11eP1tVX2dyQDg8SJZ3ZUE0n6Sfm6DCp6OpsaCjtKmVsaumoqSyrK2pu7KtsLW0xr/ExLa/xL7KxbbAycK1rLWpsLmswMS0t6+ttrqlmauyrKqYoaeYrbu0nKiwm62frrWyp6q7s6e5s7iyuMCqt7LDvbTFp76urbe1qaesoZaWkaWkoaGXl6Sut62xtLafn6mkmZOUk6Ogt6OkpZWusbGlqaWhnpuZmpWXqKCfmaKfr7OjpoyXr5qlq5ebn6eTnY+VmZqGlqCVjJCdnpSLqamqoqehmp6WjI+ZkIGGlYiVn3plal1sa05RTk5UPUNBTkM7Okk/NzdRTl1fUlZRQVdgXEJKU0hWS0g6VGRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzkwNnBbYkgwNUpxaVZDV0aMeWZDO6SknKGlv6aorq6gqbWqnbevq6OqtLaxsLi3sLe4t8S9w8e9vMPCx8G6wcbBuqq2pa27rcHDt7eqrbK8o5Wtsa2yl6aokaq5qqGnsJ2roK+0s6qqt7Wsu6yzsrm3rLiwwbq9v6bDqrC2rqmrq6admJiqoaGgkZegsK+zq7C5mZupn5mWkpemoLeppaKir7Gzq7Gnq6CcoJ+bnqWdoZidpLSwnJ+Qk6aaoamblqOhmJqLlpmUlpedlImSm5mUjqmpp6CjnJmbk4ePmYt+jJeGj5tsaW1ibm5YUVFaVEFDRFVAOztIQDc6WFBkXlBXV0RZXl5OTFNOX0xKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE3NDdnWWFGKEA4bH1oXFY6iXtjQz2on5yhqbygqq+qo7G3qaW0squhrbW9r7O4vLu9t7bAwr/JxLnEw8DAucW9wbivtqirt7K8v7+0qq6yuJ+XrK2orpioqY6nu5+lrbOeq6KxsLOsqraztbytsLG1rLC1ssC6xbarvK+xt6ytqqOxpZ6kqJ6jlo+Yn7Kqs6mqs5mdp5ualI2gpqS0rqehrKytsaezq7Gpo5ueqKSelaGZnKi2qZiakpGemZ6hn5KtoJqah5eZjJ2anZSLj5eXmpenpqOgnpeWlpSBkJWFe4+Tg4yXZ21yaHFzYEdZZlZEQ01YRFo5SEI1Pl1RaFxOWl1HW15dT01TWGRKS0NcY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVYxNTE9YFZfOClDM1lVXGdLNYx6ZkxApZmfpKu2o6uopa6ttamus7imp7C3xrawt7/Bwra0usW+zMW5w8G6wLrEuMG6s7Wsqrq4u7q+tauvsbeZmKirq6ycrquPq76eq6+xo6qfsa2zrq62sbi2qq2usae1sLO6vMmyqrW1sbSwrqags6CaqKygpJWVmpmxoq2gpa+WoqSamZKMoqWnsqmhprGsqrWkrrC0r6OZna2nm5eempmsuKKXk5GPmJyhmZiVrqGfloKVmY6enJqXkYuUk56ZpaOjoZmXk5KWe4yRhXuNi4OMk2xueW92fWJGYGpaSUhaWz17SkdFNkFiVWlbTVxhSlxcWlJTU2JhTEtFYGFgUE1JUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4rQS9KR1BbRzNjWVRMRZqWn7CosamspKOurbWot7O3o6y0t8m6tLu7wL60s7fDwMzHu8S9t7/AwLjAvbK9rqi6ubi3wresrrK6lpenr6yopLOplK+7pKyysqano7K0sbKxtbC3sqmuq7KmuK+1s8TFtqm1tauwrqmnoraen6awoKOUm5mUsJ6nm5+pjaminZuVl6WlpLenorCzq6exp62vtaykmaCsqJycnZyUqrmclY+PjJido5iRmKikoJiFk5eRnZyYl5aIl4+Xm6idpaGSlpKQlneEkYZ8hoKEjY1ucXh2fIBcTGVsXEpPZF0/YntHSThHZ1dmW0xeYkxZWVdVWFVpXU9QSGFeX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZzI3J0ZhTFYlLUIuPUVMUTwzcmtMRUSRmaStpKytqqajsLKyqrewtZ+rtbnJuK7BvMO3s7G1wsPPxMDCvrW+wcC7v7y0xKiqubG2t8C8r6y0tJ6hp7GupaaxpZ6ytayqsrGrqKi1uqy1srWrs6yqq6isqbmtsrDHv7ilubCpra2mp62wpaSjrqOom52bmq+ZoqKio5Csn6Ogn6GppqW4pKu0tKSqq6isrrauop2jqKucoJmbkqS1mo+JjoiRo6GWj5afopaVhpCVlJ6bmZaVh5iSlZmnnKCgjZOSjpF4fo6EfX19h4qKcnRzf35+XFNjbl5OWmddRkSWW0c6Tm1YYlpNYWJOVlZWV1VZaF5RU01jWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozRGQ7NipIZEhKKzpJPzNDSVMsPo9sQEhJkJqoqaGpr6Sno7O0sLS0sLCgq629zLquwbzHsbSts8HD0cTGv8GyvsPCvL+4vcWorbestLi8wLGssq6ho6euqqilsaOqsKquq7Gurqyrs7unt7CyqbKpqqalo626rauwwrm0rLmpqaitqaexpamkoq6qqKGem6OslaWdmJ6Zq52hp6ihrKajray2sLGgqaKfqq2wq52ep6epmqOYmZCgqJiGg4+Li5+gkIyOl56SkYiIkpahnZaZloaXk5SXpZyenYySkI6Kf3+IhH13gIeFh3V0col3bF9ZYG5jUXNxXEs7hHxGP1d1WGBZT2NcTVVWVVdRXGJfU09PaFlXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mzk3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSzAuSmdERjg8QjA1RUtYMUCUXUBORpWWrKegqbGbqKiwtay4ta2ppKuqvcm8sb64w6+wrLPDxM7Ow7/AtMDExLrBtcnErK+3rrO6wL60rq6spqiqsammqbKmtK2qr62tsa6yrbS7pbizrKytp6ugo56wt6yqrbm2pLW1pKqnrKyqraCopqexsaSmpaGhq5aqoZOboKWeo6Oqo6yinqaxtqysoqWjmqmrramdoaWkpJmgmZaPmJ2TgYKQiYWdoI2LkI2bkJKNhY6ZpZuTkZuMk5KSlKOanJqLj4uMfIeBgoJ7dYGEgX51d4ujh3hqXmBuZldmh2ROQGeSTEVieldiWFJlVU1WVlVUT1xdYVZMT2pXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI7OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREh0JJSUSWkK6koamvmKmorbWqtbCqpKuqqbzAwLm5tLy1prKvw8nL0b/Bu7nAwMK6wbrCxK6xtbK0vMG+s7Gvraysp7eqpa2wq7iuqLCvrrGrtaq2tae1t6yspKmqnKSes7OpqKSztJ+1raGqqKuoq6efq6uoubapqqqpoamfrZuRqqGdoKOjpqKqnpymtK6npamipJekpqeqnKKko6CZmJ+Rjo+ZjX6HjIeFnp6JhYyLkI+SjoWIl6Oajo2bkZKQj5KfmJmXjYuEgHSHgX9+eHWDgHp4fn+InY9wcWZncXhcYXSIak9dmFZIbXlVZFZSYk9MVVVVUU9YW2JWSVFqVFZUR1BZVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTIzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDJAZj1OWD9DLD9MVF8vSWs3UkY7lY2voKWprJmqo62usrSvqqSvqai7v7zBsrC5raK2r8jHyNHAv726vMO+u8TBwL+vsrOztr28wbKytKu0qaW2qaWts7K4r6KttbGvsbmrua6qrrerqp6qq6CjobWtqaGfrrKhtKqeqKero6qhoaytqL2uq66toaeon6yZj7ChmKKgqKeep5uYqbCpop+soqGSoaKjp5iaqaaYmJmdj4uHlYh8jYaEhaSWhoODjIeQkJKFh5WglomRnZGTkI2RnJWYj4uGhnh0gX99dHh6gHt0dHtqgoikdmleZWyBdWeIi3xSVnBeS3hzVGRTUV9NTVNaZk5NV1llWUdTalJRPkJOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaDozOF89YWQ/RjFDUFtbK0hQO1lDM4+OsKCkpaqipaOsprSzsaiksKequL/BvbGpuqqnrbDJxsjQw77Avbm/wL3JvMK4sbC1srq8ucCztbytuayjtaanrLG2uLKmp7m1rbS8r7ylra21q62cqa+kn6SsqqicnaqypLOomqqnqqSpnaKpp6m9q7Owrp2ppKCvnJqzopalm6Wkn6WamaiqpZ6aqaGbkZugpJ2Zl6mqkZmakpCLgo+FfY+DgIiej4eAfoyIkpCRhYKUmpOGk6KNlJGLkZuTloeKf4Byenl+fGh2fHt1cXF+aoZ6hYhkX2hjcoV7bWd5XV5WQld7bVRhUFJZS0xOcHRdSVpbaFlGVmdPQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOkrCZn5+ppKKhq6S2srGkqbCmrbnCvbewpLmsqaiwwsjJzMK3vb+1uMG6yLbDtbSztbK9ubq9tq65tr+torOmqquutLe0qZy5u6ixvrK6oK60tqmrnq2xo5ylqKmjnZuksKavoZ+qqaeiqpyjqKCtvKeusa6hqqKkrp6erKaYn5qhopufm5mjqqKamaOjlZaUn6GWnJamrIyfko+RjIKKgICPgXualIyJfX+Mh5GQjYqGkpeRh5SjipKRh5CZkJSBiH16bH12eXhienpycHFzeGqCdWuCZ2NnYW5zjm1iam9fcEFdeWtWXk5RUUtJTVNZVk1cXmxXRVhhT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNSXT4jkZarmJ+Xp6Khn6ikt6+toq+vqKy4w7q0rqC5r6uns7rHyse/uMK9r7S/t8S2w7KwurGywLa7vbequri+qqS1p6iqr624sKiYuLyjrb60tKGtt7Wmpqiws6CepaWnoaSZnqynqJ6gqq+noKaXoqifsLifo7GvoauhrKScp6aompubn6KVnJuanammlpueqJGYkpmdk5mWoaqRm4qOkId9h3+Cjnx8oYyMiXqEjYWLjo2FiZOajomVn4mQlYKMl42RfIV8dHB8cXN0YHh4am9xcXBrf3NkemxoZWRhZoeAYFtyanJNToBpWFpNUUxLSFBSUEdNW19vVEVZWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXVs1KJWbpZiclayfnqGkobersKO0s6mpusW3s66huK2tq6+1xcfAt7/CubC1vbe/u76wrL6ws7+yvMK4qru6uKeotainq6+rsq+kmLu2pKu6ta+esbivqaWnr7KcoaSgpKOglpuvpqGfoqivoaCik6Okorawoaaxq5+so66YnaqlqJ+Ymp2jk5qbmp2lqpqbm6WVlJeVnI6Tl6KpopGKi5CGeoN+hIt5j5eKjYd6goiEiY2PhY+TmIyOlpmLj5Z+hpeMj3qBe3Bydm5vc194d2VsbGxqaoVvZnJpa2ZoXmRzgWBba3ZpWkp/XlxYT09LSEhSVUczOV1ebFBFWVVZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVV1oRC48MmRXLDKUoaGXlJuqnKOhoqG3qq2gu7elrL3FtLGvo7WvrKyutMPDvLO/urexs7m4uri6r67As7O4r7/At629urWmorKpp6mxqq2xoJm/taSntLWonrK8qailqbCsmaKnnKSllJegsqSZnqOoqZyin5KkoKS4qaSnrqaepaGok6CpoqGhmZudn5GZm5afoaqbmpiglJGUlpmNlJOkqKSQiYqPhnmEe4SGfZ2NiYqHeoGEh4iKkoWWk5OLkJaUjo2Ue4OYj4t3fnxsdHJsbHNhd3VoaGpnZ3CHaGhpY2ZqamBrY2poW2Z7Y2BTdFRcW1JMSkZJT1NAISpoXmlMRFdVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnUCcynqKkkY6kppqdnp2jtK2nqrq2p6zEwbiwrKO2rqetrrbAv7yywrawrrK2tbi2tq2qvbOusrG8v7evvLuxpZ+2qqWls6eprZ2cwKunpa+zqqy1u56oqquxpZieqp2mpJGYpayimJ6kqaGcopyWn52ntaawqq6hoZ2eoZWgpp+hoJqbmZuSmJ2TpZ2soZeWnZSTjZWXi4+Ym6mfkoiKi4h4hXaBgoGdh4qCin1/hYiHhpGElpSQjo+RkZGMk3uDlY+Gc35+Znlva2prZnVza2NnZGR2gWJlZmZmampja3JbX1lebWRhTmlYWmBWSkdIS01SWD45X2xoSENVVF1bSUlHRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKywwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWUpWYmZAOjNCaEglNZqjoI+MraGXl6CWpLOxorK9tqGxxry6sbGjt6yqram4vLu6rcCyrq6utq6yuLOpq7mxr66ztrq2r7i9rKaetamfn6+jqa6cob+gsKOusa+3rrWera+trqKZnaeppZ+Vmqeln5mkoqidmp+alJyerK+muqiuoqGam56ZnqSapJ2Xnpebk5ifkqiVqqeak5qakoyVmY6UlJqppo6NiomOe4FzgYGKmIWHfImJhYWKjImShJSbk5KPkJGXjpB/gI2Og2+Bf2Z5bWhraWZxcmtcaGNjdIFiZmdqbmxna2pobl1sbHNwYFRjaWNmWUlGTE1PWFFRVWFlgFVBV1NZVEZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJjSRoZuNj7CdmZOhmqmxr5+5v7WgtMK7vbqxprevp62kt7e2t627rqyqq7aps7euprK1sq6psLa2sLO2uqapn7WonJ2ooKismqe9mKykrq+2taytn7GtsKmim5yjq6iclJynpJ2aqaKklpqfm5CbpKqrqryfp6SgmJqZnaGPa6KWmZxwgpWao391kamnnpSUnpCImJqAloqhkHmHlIyDbWl+doNxbIaLhn2FjIdwXmNhZ4SYhWuLjpSSdHeLhH6DkIBnh4BndWhlV1xoc21OUGpjZ3OFaF9lZm5tal5fYYqPg4RlTktEOUdUaF5KR1FQVFVMSFJgb3RlRltRVVBGSEVDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QUBAPTI4QEU9MSwrMDg9RzcwMS4qLiovNTY4LCMxJzIxNDoxNzVYgWwxNk9rW05cS1tmYj5HMVFkPSoui6SZhpWwm5uToJuqraqjvcWvqbfCt729raa3sKWqorazsbKxuayppqy0pa+0oqm3traop6y2sq60rbOhqZ+zqp6go5ulpperuZSlpa+zt62upamuq6yloZ6coaemm5egpaWbm6emnZOen5iQnqippLawpKOinZaYl5ejiKGOkpqGoIeTnKB/pX+lqp6SkpqRiIRzeI2OhYihdoiMaZeIZn1zeKBviIeDfo58f6GgoJmAfIeedIeOdZuKbIeBg21pZWN6bHJhU4VtYmxpmHFYaXFwiFheaVtsbFuIcm56coVnhoRaX0dOP0dfTUVSVlZRUVNXVGddTVZIUlJPRkdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcvKIqnl4Ocq5yYmJ2fqamnqr/Dr7G6vLbAv6qlt6+prKSytK6us7aqqKWwraW0sputtba1pqeosrCssqetnaqgsaefoqKZoKGarLOUo6Wltr2mraerqqyopqGgmKCmo5mZpaOkmJykqZaUopyTk6OlpqG3pKSgo5iVk5eSnIivkJeUiamLlqGchbGAo6ydk5mdlHmC1KiAh5XBm8d5eLGlt5dkgMCcv3mEhHmRhHyQkJHKcpe8nMV6crWmu5B7gG2WsauweWhsWLGubmVpvZK8bmd6b3KP2H5Ta2O2sn+BcpRzmqGqkFdPV2JPVk5GVVtYUVBSjFxXW1BBXERRTkVHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjpCPD9BODpKPjUyKjIyQkUvLjMyLisvKC0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGMp5OBp6qfl5yepayyqLDCvrK1v7W2vsGrp7OsrKmmrrOprrazp6emtKWnt62cs7K2q6Wkp7GtrLCmqp2mo7CioZ+dlpqenK2rk52in7S6o6qpoq2upaGdmpqip5+Xm6egn5iep6eRnKaak52hpqKhsaOfn6OWlpKXkpmFr2tqio2qfmaDlYatZHCdnZSZppRxrqGkfni7fWuhj3axX2q0W6WAZZyRYGaCe2Z/anhrqWW+cmemjHWxanyxeHSSlGNubaduW4ShRWhmh5ZFdZxgfmd8pKeCWl+Mq2iAlXh5aqc3Sq9cWFNsZFtLTlhfXFdWO06JT1dXL0lUU0pDRkY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzAbkKKVg62npZ6jpKqxt6y1vb+wtsSyt7rBpqmwqq6oqK+uorC6r6OkrbKjqLinnrOzsKOloKmsr6uvpqeeo6Gvm6KalpWWmZqrpZWaoZ+0s6KrnKOtraCempagoqicmJ2jn5uZoaakj5yimZegn6qepqagmp+hlpWRlpCahbWbtXiFqZm1mXaGs5u3fpOWlqmUfmuCpnuChoiSlJJ3q2drsVyreo2GlHSJco+GgH+IkJd4goKLmIuDoI+EsHZ3n3FsbGx8i06kWEhiYpl+Y2imYHlydVOTh15QqW1jcX6HgGKcLlGhb1tTa2hgTEtbZFhcWkI+sXlXWEEjTWhGQ0VBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjlhVTUwG5WglYizpqahr6mns6ypu7bCsLvBrbi3v6msra2tpq2xqaCuu6qgp7Sso6u0pKays6ejop6nqrGnsKelnp+frpWemZSVlZedq6CZmaSota+iqY+pqKqbnZWXoKWomp6cop6bn6Olo5WbnpeZnKKpm6aZnJuioJeTkZOTnIPVk5m5cLDBfsWGfNaUm7t8mpWlj42djaR7joekgqWCeqx5j51Wr3qIfp9quVq5doaDfaaCk3yYeqp4jZ2PerFujoR0kbyFb5RQr6fFilGgemNgqWJzcohtl4hgU7W0yIaAiXxjpDNCnXZdUGppY1BAWGdaZGFKSE1uTlxRT1lmWUNEP0U/MD08NTk7NzQ8PDg9OjxDOkY6Oj82OkBDOzZAT0xIPDo7REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVA3MSWbopSZsqioprSqpbSppLy3wbC5v7G1tLqytKexr6KwsqafrbWnmqe5raKvsJ+ztLChpJ6fpqmwqLSoo5udnaqVmJaVlpSWoKicmZaorbCpo56PraKolp2Xm6CloZihoaGhmqGip5ueoJ6UmJqmoJunlZubn6GYkJKUkJ2Ism5otXGrh26OpnK0c3K2e5qXpIuPnY2if5GhpX6wdoOR0tJ2XK57hX+kb5uqpmuGhHytfZeZjnuwcpKdjnizZZd0hJ5vnmaUUciLWsJcn3liX61gdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2VYQU9rYGxoUFZHSTk9VVJaV1hJQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFMNjIwop2TpbCso6u8raa0pqe2u7yyur62trS5uLKltLOgsbGinquvpJemua2ksbCbtLiqoKWdoamksaesqaOZnJmnnZWTl5eRkaGmn5WSpauwpqKWk62gpZKUoJukpp+VmqWmoZqjn62ZoJ6ekJWboZ2cpZWdlZqin5WYlZGbhax7d6h2o42IhqlvrYqCp4OYmKGJkpqLon+TmomuhX+Cs1xys1KufYKCpH9x1314hX6OnYWamnavhomRnId3tGGaZZqCgpVtklqwWEuadZh5ZmCtXnZ3iGiYiGxdr3eVno94bDV5yK6yX0JUb15nYEVQbGBwbVZWTS5mZGlTWVA7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Njw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSDo5OaCelaC5sJe0wq2os6ipsrq3s7e+ubextLq0pLeyn7Osn56oq5+Up7WrqK+xqq20pJupoJ+nobWmpqmimJ2UpKCTkpuYkZShpJqSkKatr6aglZmpoKKPkaGZqKSglZmlqJ2cpJ6tnaGdoI2TnpqdoZiZm5aXoqCUl5CmnYapfX2leKGOjYKqcK2LgaeGlp+hiZeXiKOCkYiUqnyAi514b7FaqIKCiKB5dNh/dodzqIGOm42SpHyWkJ+Ee7JenWSgfoOVbZJcq1tak4CRf2hnqmRye4FrmIdzXqtaiaCOa29lT0pDoVxbTHRdYmdOW2FfcnNfS1Y3SpuUWEdFPUdGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANS47PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MyPziinpqawKuYtMKuq62ppbSwt7C1vrm5sbC1uqi6tJ+vpJ2kp6eek6mwqa+ptauqrqGYoJ+mpKO5oqOroJabkKGflJOemZOXnp+PjIuosLCnnZebqKafjJKkl6iqp5SXqaeenqCiraShnqKMlKGYn6CSnpeclZ6hlZaOq5yPrm1ytHOpi3WKp3O0eHOzgJGko5Kcjomkh5B3uG+Me4uiamu2WqGFZZeXaaGip22TcrR0k5h/smqFkoitanWzYZ1mom+Hk2uXXK1fTaF8h5FSc6NseX9+b5iHcl2vVjycd2ZUb24uXKdPY1NrZWJtWmNdYXB7Y1RaUj4+bW8zQ0JAP006ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4ppybn7yhm7LArq2rrKe3qbevtb+0u6+ut7aqwLWoqaCapaOhnJGqqae1orKnrqmgl5unn6SruJ2irJqVmY6jopWMnKCbmJyfkZOUqrawqJmUm6yql4yUpZilrKKRlqqyo5+epquxmaGjj5iilp+blpyWoZOdqZyUkKuZh9SSmrtzsMOAw4Z+1ZabuHiIkJiMl4uMp4h6pLZ1fXd2woKasmCDunnAfHW4Y7WCjIepfJWBrKlxe390vIinoGmdYaaOr6F+jHSHqn2+b3O8dLKDdXiBim6aiHJujaR0vV53fVphebxrWlZcanleamFlZ2NteG9aXFlDQUBzQENGKzVHIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaebnqK9oZeyw7Ctqqussae3r7bEsLiwrbmurcCwq6OhnqOhnJuQqaOqsqS0paylnpWZqpimrLicoq2XlJ+PpJ+SjJyinZedmpGVkq+5sqyWmKSop5SQlqScpK2ekaCoq5+bn6ijs5+jpY6nopSimpyYlaOYkK+gkpSpnoSQmLZ/j5GMt5V4gpOatXdta25zb3mQhY+KdJ/Bu72ae4GxqHGAc5G5g3yGhoyHjXyKh4yXfKS7ub2cdXq0o3R3l3Z0sHWZnmaGao21dHJxd7aMXn96fYlog3luemOLrHB1hX9YW6dqRWVaVGZgY15jUWdncGx1Q05QTUQ6Wk0/SjM7MCA4PjsuMz1BOTk/PTs8QzZCU1laWltbWlteYGJgXVNHR0g0RElUQUtOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JXOCpPXl09KzpWVSc+OzynnqCiv6WWtMO0rKuorKupuq6wxa2zsq21prO4q6mhoaWeoJ2Zk6ukrKmltaenn5uVoKOdq6S9pqGplpObkKGakY+hp6GTnJeTl5SxtbetmZ6kpKKLkpKmm6Wqm5WppKWcmqGopaekqaGRrZ+WpJ6Xl5edno+vqJSbpqGNan1pm6Z4h3J9mY50eWSHe72+wLpvk4NylohgcmpaXpuJYGOIj5VrYICVY22dd2KVbICalZRlXmBjcZqKaXKLfYaVZ2t/cnV4fX5iW3d0gWhQXG6DfXuLa1hreoJzSkpvhnBOdE1FWF1nYUxbWGdjX09bbXVpcVJRREVNO0dJPU0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF9MKDM+W08nPzI+qaCoosKjm7W6tqOspa6np7WxrMirr7Kqs6K9sLGmn6KnnaObmZmrpq6jpLSopJuXlKCbpq2ovaeopJSTmpWfmZKXpKiokJ2RkJicsLK/rJynnqeiiZORqZqoo5uaq6CjmZujp6yjoKujmrCblaeglpSdn52XsKWYoaeZm5CcnKKjmKWhmZuZmZmPlYFnbX1xd5KYlJKFi7WqjYaYlY6KjJiWh5SVioSTlJGJjpOUmJSYlpqgoZqclKGdjoJ6pYVta32RfIB1ioqBcYJ4eXZ2ioB8imtzgXSDdWV3fXdrb3ptYGNdcGhNWVpmamBXWm95bW1mVFBGUzlPWk1RTygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxKLDwtQLOgs6LAoaSysragqaWyp6WwtKrIqqyvpLSlwKazoJ2kpJyjlZWfqqasoqO2q5+YlpWflq2ppcCeq6OUkZuXnZeSk6GenqKnkpKZqKeyxLCbq52rn5CWlqedqpucn6yYoZucoqSvp6KlqJ+umJennZmZoJ6dnK+gnKGmlZeSl5OfoJWinZegjpaTioqNjpeukHyWnIOSgouqqYWAmZeJhJCeiHqEkIeGmpKIhoqWj5uXjZGYnaSWmpORnY1/jmehs6+FioR2e5KKfXd5em9meZCBgIlrdYF6iHNpc397doOHgmt1ZHlmYGpmY2Rma1lse29pa11TTFBEXlRFQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2JjYV9dXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRbRzU8LEC0oLmvv6yrrrKxoKqmsq2irLOvxK+pqqKxrbyis5ufpqKhnJiXp6WppaSlsrWdlJOdmZmvpa2+oKuikJGdmZiUkJShnJeonISeqqujtMi0oKqkq5eWl5mlnamanqOrlJ6fnqCpr6qmpKuirpufoKCYpJ6cn5yvo5iep5KXlpyRo5iXp5yal2WCknxlfo2akGN5jm1oa3uSpKpqZZuYfWeGimVlaWh7jqGPa2eNmJGjd2tqi5mjn5hzbG56hI6IelhmXoaDXm2LiYF2XGhzd3aSgIiCbniCeIBzbXmEdHaJiI+DfGuHWV5sdGRec4lpa3xxa2RfUk5YSWRYQUo0Pkc3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8yWUM7Py49pZ+6vLqvrLSxqqWora6wpq2tsLywqKajra6wnqyWn6OdoZmZpqqcrKOlp6iyrZ6Uo4+ir6W2uaWuoo6OmqGZk5KaoJmZpJV7pa2iqLTEuKWip6+fnZSdoZ6jm6KpqJKfoZ6gqbCrq6SroKqcp5+noKyWoZulsKSXm6mVoJ2akaOWnamXnX29g4hytHKEnYataHi5xLhxk6KjeqaZmXKrgnzLwMC7cYyjiIKffZeZiZ3AvYKXnZ6NncLBfIJ8k42aw8B9bKWyb4yBb8p6f5t3kYOOgXZ5gYB5cXp/h3B3hYyTeW54lGNnYHhkYGWCY150Z2xkZFlMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYV9eXl5eX19fXlxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAuI0ZbM1BZL1ZBQjsvOJajucO1sLDAqaiUo6+osK6tprKzrqmkpaavq5+qmJqin5yaqqeinauipKikpLSjnKKSpq2rt7OnrqKRkZmcpZKRn6GXm5+diKaspKytwMCxoamvqZeRnpyimaGjqqOToaKdnayuqq2npKSnoaalnayokaOaqK2pmpyom6uglZWklaCilpx+zpR4eqSBeZWWm1+uj16Op4GioHynlptzq4OAr15jjKp7qIeFoHWYk4izY4KrhqGOjbNqhK91fZeIt2GDrVqjzW6Qdnvae3+ZcH6HknZ+ZXuIdnZrfIdufYaRkX5tg5Bhcm1waGBgeWRccWhqZGdgUlRTV11LT0M1QUhERDg+NjtAP0E7PThAPj4/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1LMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaOqp62zq6ayq6uqo6qmr6mfppuZpJecoq+foJ+op6KloJ+wrJqdlaeurLCqqKuflJGan6SSj56kl52no5+tpauwqMDHs6ipsa6WkpyaoZefqamflaGfnZysrqisqpyoqKSiq5KsspaloqqqnaKlpKCun5GYppmfmZOTkJegcYWMl3WFqIZxsX2ecqx+op+BpY+edquCfa1/nHKtfquHhp92mZJ7fJd+qoiijJKMnX6re4mUkJ+Ae61XncV7j3CTwX2BlW11b4xtZXZlhm9hd25yb4mKko+DbpORZnB1dXFhZ21lX29paW5nZFhTXWFZUlNDOUlJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1dARiEcRzpDMS4rsNPGxrK0oJ2jjqOioqyvtq6osaaoqqatq6umoaOdmaGVn6Wrn6Gln6ioop6dsKyXmpaop66rp6annpeUmaOhkZSgrJqdpqOvrKSstaq6zrKtpq6sl5SbnKKZnq6snJegmp6fqLGqq6ubraulo6uarrGhqKuupZikqaior6GRlaKjmZORhKRqpHWJeql0erJwgqaKmYxxiaCbh6RgYFKrhX+ug5t2rYGnhoWfepmXhntmgKOJpJmGgqN9qX6CloeuX3ypVp6jkoF6o5+Ae8OvxYtyr7OzuXJiqa/CdGiMjJiOgm6clXFvenh5cG1nZWVycGZ8aWNdV2BqWFlVTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYWFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dS/oZmrp6Cvop6wtLCuqayip6aoqquppKWfm6SenaWnp6Ocq5qirKGjn6+hnJqSq6O1r66gp5qdlZOmopCaoqefn6WcsaWkqLGtt8iytaqsqZaSnJuimZ+ls52aoZSdn6asraSwm62qo6OqobOtoaqzsaGaqKetrrShkZSippeakXypbJ6Eh3WreXywb4KljImflpaglYHSuLS4yYGBsl9glKmDpImHoHqYlpp4qsl0mqSVqKmRk5qNgZyKmsbGeWehgqV0gZ+Ogn2vXXC0YrB1S6OHbadHgpNkj5CekXxxmZWBcXx1fnxuXGZqc3FmgWteYVlkbVxfWUlNTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2osq2spaKcsrisqqGlmqikqquqpp+mpZiqo5+uq52loKyanqmlnKe2nqKXk6iqtbKsm6WcoJSPpayRmZyno5+pp66hpaepsLXDsrOqraiTipecpZuho6+ll6GVmZylpq2csZ6uqKafrKO3rKGyuK+dmq6msbKxo5OWpqKZno6CnU54moF/n3qEo32DpIWHpp+dn5SEuHt7ebmCf8zGwrZ4m6GQi59+mpaXinaemIqlmKSpf7CFnYaghKx9mpVjpm2kcI+FkIF9loJyrGCjc3GAmmC8fVJVdI6So5Z7fpSTjHZ7c4aAcVxubnhyaoFvW2RfaW5iZF5MTFFUQUlIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXVpaWlhVU09IQDg4Mi4sKi4rKicnP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7mqrp+boayys6WeoJWlra2uqqecpqaao6ehs66iqaayoJippJSjtqKilZehqbS4o5uhnKKSj6GxmZ6bpqWgoa+unKWoorayxbGtqa2pkYeQnKicoqScpZeemJqapqSrm7CirqSmmK+ku6yhtratnZy0sbevsaWXnK6go5yFj9G1w7d5h46FkZOQgKZ5lKF3jKCShKWBinGqhoW0bnJqmaOclYqefJiZhoePc6+CppyjjqaLk52LlpCbbnGyXaV0k3qcbJl/e5l8balho3Fxf59ic7K4aHePlKaYfY2OlY55fnmQg25qeWl6c2+AdV5lZW9tZmdgSltYWDxISEBVNEBGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dW1taWFVSUlFGOjIyMy8vKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZJzjIqtvr+8urSelqekrbWhopmUoqimrqurmKain6agoLano6insKOUrKOOpK2inZCamqqzs6ScpJyokZSXrp+fnqainKedtZqiqqS2rMSwqaupoYyEjpyioKailZmanZmbmaalqJmtqK6jpZutpr2slL2vrJ+hr7K4qbKlmqiwoqeXeaiRfXywd4qApKWInG2ycKGHrXyhj4OnlZiArImFroWflKqgoZeGn4CZlYB7kn6rgJ2bloureJ2hkoqUkoF6r16kgX2mp2SdgH2Xc2qvXaVrcIWZXWBbjKBtlZGmmYOWjpmOfHyEmYBrbn9jf3RugHpgZ2ZxbmhnaENZYVs+S1UzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVJTU1ZaXV9hYGFhYV5dW1pYU1BPTkk3MDQyLiosQVRWVlZUVFVUVVVUVFVUU1RWV1dYVlVVUUhGSUojKCi9k5qDqMXCtsCznpqsoK24paOOm6Sin7Cwqp+kn52tmZ65oKOroK+pma6hkKuoo5aJmpCusKymnqWbrJeXj6yhoJ2moZqkna6Yoaint6nBr6WppJ6LgI6bmp+mnpKUmZuUm5qmpaabqqyspKWfqai+pJbCrKqioKuyuKmspZ6yraeol3WvfpCLnIWHfrqtipllsI1lla19oI+DppWagayKhLCFppqkoaGQhKBcbGqBs2B/rXt7g4GxbWdvmZmMiLFbfrVcpIRryKJkn4B7vFh2tVmyfVKugHqsWIChbZiQqJuMmJKamnx6kZ9/ZXV+Y4Z4dIF8YWpncG1nZWZPVWRcQVVfPkkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5QUVJUV1peYF9gYWFeX1xbWFVQTkpGQzU1My4vQFVZWFdYV1dYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+ysbe9urPBsqKcrKaktaigipqgnpyzs6mfo6CetZmgtKiqrJ6vrZ2sm5Wvp6GOiJuOr6uopqGlma6SmI+omaGdpZ+ao6OlmaCiqrOpvbClqJ6cjn2Lm5ahoJiPkZqckpqYqaCimqmuqKamoqWpu56gxqakqKCqtLSrraWeuqyrq5SAqZKjr46bgIekl5mQgoC4w7qDjpyShKeXnIKsioKviKecm6aqkH7VvcKqYqO/vX1+o4KD17q4tYWVk4Oevb6EbaOCb6uEbJx/erKwx4Npq7C9rHh3or68c4CWjqadkZuSmqB7g5Oce2R+e2WPZ3mCe2FsZWtqY1BiW1NqXD9UYUNOKT06NC8fHyQfJTIgHSQoMDQ5NjY3Nzs+QUNGR0lLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz89QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Owv7ixvLKinK6mpLKmnYuYpcCquLKoob+mp7KcnrGcuqifra+lp5SUsKuXjIObka6loqygo5yqoJeLo5KmnaecmqGpo5mfoaytqrquqKOalpJ8iJmRppuSj5GYmY+YlKmboZmqqaGrp6CjqrueqMSin62iqbOzqa6on7mmra2Zc3aqpbiGZImgcGiukYqQbm53pJCZn4F1rpiUcI+LcZWoo5uXrqRybGxsZot4b26CmXGBempxaWeKl5aYcWlphYhncYZkXYhiam9ZXGZ9dqZfYXGOkW5lZH+Nk4+hmJmZk5qifomRlnZniHhpj2t5gHllbWNmbGJLZVhKbFo6UGVFUidLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXF5eXVxcXF1eXV5dW1tVV16plKyzqbm4srOqqaGunaOyqZeSv7PFyr+3q57ArK2koqesn7qjpK6rraaOl66pj4uFlZatnqaqoJ2ko6CRi6SSppipmpejqqGWnaamp6+6rKyam5KRe4SWjaWYjZGRmZWOmJaplqCYqaObsaadoqu5n6/Bp6OypauvsKmsqqa1oqy2lYqhqKa3nYmWo5mHqpuRlZ2SqbKZmqOqoLKWoqGdn6KcoaWhlaunjZKSjIeTnJ2VkZmTmZGPloaBpZuYlo6LlJSMkIaEfWeJfnSCdXOHinCnbHqUkZOSgYGNj5CPnZWil5qapYSJl49zapF3cYx4d316am1kY29kVWFZQGpcSGNhT1krRj0rJyE3NTAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFVWWV5gYWNdXlRRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpaXFxeX19gXl5eX19gYGBfWVlgppaoqqS0tq6uobCjrZ+gtbGQjqzIvsa8uqujpZ6cp5+xqaO2p52ptKaokZisoouHiY+cp5WspJ+Yp56ekpSjlqeZqJqUpqGkkJuomaG1uqirmZqPjHyBlIuhlIqVkZaRkJSYppCgm6qfnLajnaart6euwK2itqWur6+rqKixt6Ctu5iRpaSmtqKSnqegjqqgjpKfo6uvmqCjr6ivmKOgnKOqnp6enJarnZOZoZuUkJarmo6ZmZeRlp+SiaGelpWFko2RjpWLgH1mi4V1hnV4h4JznGqFj5STkIl9i5WSkpiUo5OfmaSFipqJfHOXc3uMgHN8f2pvZF5wamBbYFpuZFBgZVBaOkdHRT4yPT45LyomKykmHSY0MTY2Njg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYWVWUEpBQ0I6OUVNVlteXltaXFtbW1xdXV5fXV5fX2FhYmFhYWBiYmJkYlxbY5eVo6eir7GrrqOppqyfp7WqkI+dpbW9sK6toqOaep6jsqSlsamXm7mmo5OZqpyOhoqJnKKPrp6ilaifoJKWmZutiqmWj6iZqY2ZqY+eubakpZmcjIh5gpSMm5OKlZKUkY2Sl6ONn5+pnp+4o3+Dr7Wir650o7yisZ93eJ+osLmUdayjnomAq39kXGJ2oI+ln4SXfW2Ss5yjp62qomWen5JzeZqXcICYqJhtf6KoimWcpp2SmJiWjZKckoaem5CWhJKHj4+SiYV3ao6GdoZwe4V/f2Boh4qUkotadZSQZ2iQj3N7qJycZnubiYR5mWqFjIRveoBrcmVfdnFsa2hcZmZiYnBTWz5OTk5TRz5AVUQ6MS8eHyY0OjMwNjY3ODw7PkBBQUZIQkdGSUtNU1RVWV1gaGZoWFBKPERHPDhVUltgYWJgXl9fYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaajoK6wrKuppaitoqetpJKWq7axs6ebq6esl3OMnbCgqKunlJe5oKCPnKSdkX+JiJuejKyaopWnoZ2OlpKehHWtj4inm6mRl6SJnLqzqKCZmIuJdXeTjZaTipSRkZSNkJShj5yhp5mcspWAjJu1nbOMko66pqB+p6J6oa21gI6NpZ6Di4aQsaqvjIqXpJt6gIushpudoaeop4eVhZh3pZt6h5yBl6eCgnucsnqKhqGYmpWYloORl5eFm5lieoeQhY+QkouDbXCOh3mAcH+AhH6Fc4WElZF4lmiSdKCadX2ZhaOgiZh/lIyFhZprj46GbHh7cXFnZHdvamxrXGVramZ0XF5JVExSQEU2LlpVVTcpITA5Pj43NDM1Njg7Oj0+PkBEST9JRUpMR1NYW1lcYmFoZlpRSDlETDs+YVZeYmRmZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJein6asrauorKCnr6amqaWZlK/Iv7Gil6iptp6QhJ2snKeioI6Qvp6ajJ+aoJB8ho+Zl4esnKGWn6CRjJOJhoCRp42Ho52klJiehp66sqiempKOhXF2kImVkIqUkI+bjJCSn5KXoaWWnquHn7SJtJqtisqHqayItoWNsIGvrIKojKaYjZ19qI9ye3ecj6eXaJWkebSMn56mp5KYwoF/q4iYoXKegJqlfZeFlbKBoX2hlKGQmZeBj5Sci5mSi32Fk4eOlpKJg21yj4V+eXGGgIN7g3SEgJaAj8Vmf6mHj6NrnoWknYWagY6Ph4uacY+UhWh4dXx4aGh2cGhobF5kcGxnbllnR11STTNFNDdOYmQ3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TklKTENQWl1cV2FeaWxcUUU9S01ASmNYXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSWop+vp6iopaufo7ewqaummpSgo6SrpJemq7ijr4ChqJ2mnp2JlL2Zk42hkp6PeYSWlpGHq5mbnJmhhI6Ld5ucj5+QiJ6knJaamIejua6lmpyMjH5ibY+Lk5CNkI2NmIyRkqCPlKGhmaGnfqGnh62doJatj52cnJCFgKCMqa2Fo42pmYyaf6J1gJmUa4Ktdk2reIeNnJGaqKaAqat9g6F7eqdqnn+Sa2eXhpe3iZ5+bmBkWYOXgI17ZGiLcpl9eZZsXX2XbV9ScINcX2t4gl9YZIF8g3+WcKeqa4OjbnKlcJ+FoGpnoG1bb4x9Z1pghIBiWFBvd2ZtdHJram9danBsbGpZaU9dWUY5QTVIRF9sNSxJRFJNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1ddXmJ1YE1EOk1PTlRiXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlZ2guKCpo6askaC2u6quopmYoaKlra6hnq+1o6iSoaCgp5yajpm0mZCLn4yVi3WBlJKMiqaVlZmenn6ShYWspIebkIqZqZmam5KIprGnopaaiImAaW6Ih4uOjoqLjZKMkZOjjZSfoJyhpH+TgY+ioZSgdpyVj6eCoKZ/haerg6V4iXyEmn6icHOUiJZ8n415bYabjJmPm6iZjoede4Kic3amZp5+d6RfmHp9k3Sibpi3tLp0k4iDgLWoZIHGuHtwlbaMcoCao2JzrKtgfGmds35tfIaBjYKLmHF/o2xyo3SfhYGkYZ2Zs5ZyfZifs3VzW56yg2pib3R2cWlvWGtscnNnXWleYkxFPUQ2UUJaczM9U0dgSlI9PDM5NTo5NkQ7O0BKUD9VTU9RQEVfX1taWGBgfGRIQzhNV1VXYmFaZWZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2hok5WUo7eYqpuTn42ktrStraCaop2ko6aunZyyrqyTmKKaoaSZm5Wfq5uLiJJ4i4VxgJaOipChj5KUnZh9kImNqKCHl46JkqSUnJuNi6mopZ6Ql4eFfmp7h359kI2Di5GRiZCUoYOXnqCdoJ6LiXecmKKNn3Ghioeph5uljpSmqX2tjH56oJl6o5N4gXSWiI2cfZafhpuOmJulhaJkoXyIlpCbjW2eaJuOb5qZeoCLp31yaXSrg5+DdKpolZpdm4V2hZ5nqmuAuGZcqHCBnGCVjF6ndnWHiH6eaJp1hpOSl46An2+akW6nml2pf3m7a36qXI6EXbRnXG5yenhraVxxanh5ZGBmWGJCUUZPN1dDUm81TFtbX05aREEyNTE8OzZIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TlteWWRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcWBkZWVrZWNpaGdraZWbiam0mqeIY5Sbq7mxsKyeppycqaCfr5yesamtnpekm6GgmZeXoKOZhomNaoiAcnuXiIyWloSRlZiQeoqElaOcipSPhoyfkp2diZCpo6CajJKKgYBpgYZ5f5eMe4mOjoiQl5t/lKOfoKGTmHJon4mfj4xwkoyBqYeYnqGlnqZ7sK2joriXd6Ozo6SAiJR5nXurmX6ijpyaloiXcaF8hY2vtX1rmpGheX6YtaKkq6iEmXybfZ6bf3SqWl1ve5aLeJ5iTH97eoVjeZdCTJ9Yompxe45sgIiEmXWbeIaJsbN/gJuTp3eDnm5zfZVwmnRrpF2VdkhlZGB0cX5+b2ZgbGl2fGVlYVFfV11UV0BaRlFoRVRXXWJYXklEPUI4P0I6SUY4TEVYQVdSW1ZERmJcWmBLYG1+ckVCPFVfYlplaVZnaG1vYmZnXmFhXF1eYGhiX2Vjdm1dZWdma2RmbGloa2mTnICwrZmEU16gprO5srKpmqKMnKycnKqUoqyko6iPoJ6dm5qWmaGdloiHiXeGgW95lYWRm4t8kZOWiHKAiJKhnHORkIGJmpWhm4WPqZyblYuLi3yDbISFcYKhjHiGjYiIk5mWfJOkoJ6iiK2GfbWEjp6de6WWeqmBlZuPiZ+bfKdod21+mXShc3J8nYaZcJODrn2kg6WdmYCjb16pZ3WiY2+lYZzTkH17mXhzc2KihpB+o3SkkHZrj7OMYIKYiXOqsqi8f3eDbX6/pqm0XZtufHCWbX9yonJdpGdzpmBopm2b1Jp+hptwenuYbJx8eJdzbqmkZ2BlenGAhWxoZmRudXhoYGNTXGZRUWJIWUpVYVdUXGZrXGVRRkNLTUpLQktFOE9AUU5YU1lPU1FgZmZqUmN3eXdJRkVjXWVaaGpUaWhqb2NqZ2BjYFxdXV9oYmFpZXxkXmRnZGtkam1naGxol5p/r6pUXEt+qa+xs6+yo5uZhZmpoKGkjqapoZmqi5uZmZSZk5KhmI6HhXtwfYRofY+DlJqAd5GOj4lvf4aPk5Jsl5N8iZKTpZeDj6ublJOLhol5g3aHgG6Cn4Z3gJKGiJmjmHuUo6SZn4mzoaK2i3qsp6SupXCpgJqOhYCakHukgKGZhphynoSkrq+Kl4yAjaSNlYOtoJN2tba1yaFzlIuBn2Cel6lteZaHoJt0ooh3oH6Tl4uBcE1mo5Jwm4dzpHt5dGGDgWt+oGtxZF+ccX1zlmh5abO1tMamc5h9ep1rnJurdoWbbXZ4mGqae3WYclFFfbNfanZreohma2hjdXVxbldfVFlpUFNoSVdNWVRWXmlsb1ZoV05LQUpNS0hKT0FRS1BlY2ptZXRyc395fG51iXt7VFFPbF5pXGtpUmpoaWxobGZjZV9cXV1eaWJkaWt7X11kaGNqZm9tZWlsZaGbiK6lg2Q/k6Gyqq6vtaKikICXqqKjpYylp56dpoObmJeOl5CPnJOOiIN6anmHZYONf5igeXWPiYyBaYSFkoOMhZ2NeY2LlqaThJmqmI2Si4GJeoB9i3lwkKGGeYCVh4mWoJZ/lKWonJWVg2ZueJxsomR7caV3m5hwZ6aAlYp6pHqfloOXc553gYqVl4+5bpGKomJ9maCViG5yaaprdaBtb6Zgm2mLkGmWh5uWdaKBfppgjIaNdXCIYmigZZ5+aZt1b2NmiIFtcaJaXltioW1diItuen1zcmSlbXiiZGenaJlzjJlwom9ViZBvoF9mqFSLXlSYbm1za3KCbXBpbHl0a3BSWVdXZlpUbUlZT11JWGlpc2tZbFdRUkZWXExYU2FVaWtfd3R7fXB8fHKDe4Bzdo2AhHZeUnJiZ2NwZ1BqaGhrbG5oZGdfXV5dYGpiaml2dV1cY2hjampzbWZrbWOco5eleWRzbYumraOpsLGmn4uAmKudn6aMo6Kbo6KBlpmUjpqQi5iQjop7h3GAiGmLi3yYm3N1iX6Qe2SDh5WKipWZgnyIh5eokYGjrZGGkIuCin6AgI5zaZCmhH2Gk42ImaCPiJOppp2IpniVm36kiJaLsZidkIKvl5+ldpSGeKlzpY+Emm6kooyShI2Du259pa+DhoWGk5Wcn3ylenKolaCWZ55+b6xkloqWk3eobaqigYl2iYN3q5GmiGuRsGt2s4ypa4qFbW2fnpKVYH6ri6p2fn6LpZ52n3yDpJWdoGqbiHisaJ6tjLZ0d76NpJNag6eOq2F1cnRwfHVxY2t/b2ltU1dbVmFiXWtNXVJdSl5tb3dgW3FZXGBbZ3Rlbm9yY3J0YHd6fnlyeYNzhH+Be3uMgYKAdmJ4ZGNucmRSa2dob2xyamZpYWBeXGFrYm1sem9cXGJpYmxqeG1nbG5ilaSpnIF/naOWqamdqKaupJmKgpismp+lipumnamdhY2bkIeckYWSjYyNdId7iIRvjYV+mJN0dIZzkoJtf4uRh4aTjn17goaYpo5/p6ePgY6JhZV2goeSb2yLqYGDjJSOiZ2fiYyUqqKfj4B1lJeIfoF5lK6if4GbcY+Gd46Jgn17cqeMcn59epiWm4SQeXt/foeUlZOKdpCYnqCDe32Ja4yFW3l5cnpxaW5+kolxgHWBj5STcYeEgmWMf1+Bf4t3dHKUdW95bm2HbISFXnVnd45lgICFjaiafXR7lWqJiHCBdn2Hd25uaIxzenyYeIVcbFh5j2lveHJxb3h4cF1rh25qZ1ZbYFddZmtkVmNVX1FfcHl5bWt3Zmtra3d9cnJ1dGFvdmJ0e4J4dXqCdYCAgIF4i4WDfXtuf2xkeW5eV25naHVreGppamVcYFpjamVtcXRuW1tibGRsbHluaGxvYY2Tt6imiaCimqajmKScq6KhhISYrZKeoYmbp5upmIOCnIx/lpSHjoqJjXKDfI99fo+Fe5iPdHKEcZWFe32Si4aGj4R5foCHmqWOfKiijIaQkIWVg4aOmHdyhKmGjpKdkImfnoiMm6efn6qEiY6Vmn5+iZatp4+Rpo93b5uPgXiQbn6ohXF+lXFrcH2CoI2Ak46LaGxcgouLm5qejnOVi4hxdGuCd3SBWXJuh5GBfn+Mal1qZHuGhImAYGl4epp7goqBdYGFgWd3ioZqYXBxgXRecYqBiI6llIVli42DbneLhHGGj3pxaGhlfIR7lltca2hudlt8eXh1bnNzg2dcbYtra2JaWl9bWWxxXF9hWl9dZXR/fHZwdWRra2t8fXN8eXVkbnVobXx+d3p8e3l6gIB+b4aKhHt9dH55c39oVFxxaWx2cHVna2hkXWFYa2hra3FybldbZW5sZ3N6b2hqbWCLiqmwoY+ioZqenZeemKijon6Dma6OoJWInKKRpZV/fJiGfZKZiYmGh4pzfoGMdoWMgoSXinJvgHKYhoN+koOEhomAeoGEjJyhkYOnooh5jpeJlYuLnJeEg3qtgpGYmpWKnp2HiKGqn6Gio4uIk5uco5mVqqGnpp+SmoeVjHp2jY2Dp35/kpCTlJ2yppuVn5CNsZKXg6WMjJWan4mQm4KIkYprfI53eGWDh5GLfImehIeMkImIgYWEkHd8enSZoIiGiZ2JhJN+fYqAgHVvcoSCfneFhoqPpZCChYyGgoyQjH2IjIqRhHptg4V+eplrc2lhdIpxfnp3d293dIJdXm+HaG5fXlpdXVNoclZkXV1ibGh2fH10b3Bla2ppgH1ueYByanBxbGeBe3KCgHh/fX+Ee22CjIZ8enh7fXqDeE5jdmpzbnB6ZWtlY2JgW3RmcGdycW1VXWx0bWl5enFnaWtkjIecuZ6WoaCYlJiZlJikoJ58f5qsj5+OhqCdi56WfXmVhHyOmYqGg4SHbnmBgXOBiH6JlIRta356l4eEg5B/gIeEhXyHhY+cn5OIrKCEc4uQhpKRi52RfY17qoSOk5iWj5yWh4ebpZ+imp2FgpKampiPmaafpZ2cj5V/j4h1e4aNhKV7fI6QkYaZq6KelJ2QjqmNkICdjIiTmZ6Cj5d+h46Db3iGcnVgf4SQhnWNmYGDkIOHhX+FhJVueXZ0kqGKi4Wag4SMc3+Je3xycXqHgnp3iY2DkaaPhYOOgIOKiYp3homLjH5xbX+CfG9obG1oX3p/aH58dnV2dXt4XF9xfm50YGNbXV9SZ25UZVteYmtpdnp/cmxtZGtqaIF/bHSBbGx1b3pwhnluh4B2goB+hXZygo2Ifnt8fH97gopgaHtqdWlpgmRqY2BpXGN1aG9idW1sVWNxeWVwentzZWptbYuJnraZoKOfkpGVmIuanp+ee3ifp5Gci4ellYuYmXl6jYV8iZGEjIKCg258gHlzgYV+i5F9a2h9gpeJgYiOfH6GhIZ8j4KQnZ2TiamdgXGMi4yShqChioWMfKiRiJCSl5OWk3iNo5+gnZaZf4CQm5mSjJqioKOZl5CafYyDd3+Cjoagf36MjI98mKShopOakZCmjI+BmpGJkpebfpOSfoeOgXV0gnF3YX6AjoZyi5Z9iIxyjH+ChYaPaHhyeIuYkY9/ln2IinKBhnt8cHd6ioJ4eI+LgZSlkouFj3uFhoeEdoOEiYl8Z3N9gHl7cW1rZ19+c2h8dXZ0fHOAal5gdHZwd2RjWV9fUmtpVWVZYGFoanZ5gnFna2RsaGaAgGtufmhvcWx+eYd6bIyBc4GBfoF0doKNhn98e4CBfX+PaXKDbnRpYYdobGJfcVZ0b21tYHhobVdqdHZjdXp7cmJqb3qJjJ6xkaWknI6Pl4+GnKCbnX13paGOmICNo4uImpZ5e4aHfoOJf4mCgX9yf3t0doOFfoqReGdjfoaXioKKjHl9gI2DeZaClpmYjZehnH9wjIKRk4alm4eMiYOmlYWTi5aYk5J3kZ2goZeUlnl+jpiYjpaanKOdmJKUmniNhIJ3g5WNnX6BiY2Mc5ejn6KUmY+PooyKgpaXg5KWmX6YjXyIjYF2cX5ue2SAfIuFcYeTgJGCbIeDgYCJhWZ1b3uFkZeLfJJ3i4h7f4Z7enF9d4iDeIOPh4mXoZWBg4t2iISDgnd8g4qHeGB6eX50f3hnbWVhf2pqd3N0dn5xfGNjYHNudXJtYVphXltsZVJjWWFhaGt2eYZxY2tjbWZofINtaXVobnBpgH2CeW2QhnKAg4N+dHyDjIGAfnuCg358kG12iXN1bWWKbGpiYnZWhGlwbmB4Z2xianZwZnl8enFgcmyGhY+brZemp56NjJeHhp+Tl5l+eKqdi5l6l52LjJiQeXyBjH58hHyBg4F4dHl6dH2AhICJi4BkX32LlYd/hYZ1fX6Lf32YhpeVmI2kopmAc4d7k5GJpo+MjoqToJGDkpCVl5GLgY+Xn5qRkJBzf42SlImdnZ6ml5eMlJVyi4yJa4SXj5l6h4iPiW+XnZqklJWLjJ6MhoGRnH+SkpWGmYh7ioqBeXF6bHVsfH+Lfm6Gk4OVeHGChH5+i4Blcml7f5aXg36Nc4+HgniGfXV3f3yEf3uCi4OKk6OPeIOBdImHfYB0doKJhXBifHZ7cn1wYm9jZHxjbnB2c3h3c3RidmBvbHZub1xcX15eal5QXVljYWhudHuJbGBpZWtjaXeHbmdsaWttaIF9e3dvkIhzgISEfXSBhol7g316gYR9fY5yeot4eG1sh2poX2lyY4dncW9ld2dubGF5aWt9e3hwYXhti4CYmKmfpKidioqShoqdi5WYfnivmY2XfZ+UkZeTiHd+e4p9fIB3eICAcHV0fG+GfYGBin98YVx+j5GGgIODc3uAh3qPkomTkp2VppyWgn2BfY6KkaOIjoqNmJqNhpKZlJaOioiMkpySj4yMboSQj5GInpmioJaViZaQbYeYg2WFmI6TeomEkIpwlpqUo5OSiYuZjIF/kJ19ko6SjJmOe4qFh3NzdmxxbnV8inRuhpGPk3F1gXyBgYh8ZXBseXyZk3yDiHSQiYBzh3huf3yAhXuEi4eCi5SnjHqGe36KhXd+cXCBh4VmaXp1dnF8Yl9wYWt0X3Fqe3l5bHNwZXlebmxzbXJYW19gYWtbUFdYZWNncXF/iGddaWlnYmdxjW9kaWhlaWmBend1b46FdIGCg3t1goiFeIV8eISFen+Jd3+Le3tyeINqa19waHSAa3JvbXJnb2xlfGNugHp3cWx3d4p+opehp6Cmm4eLi4GPnIeTnXaCq5WTjoehjZaUj39zfHaFeHl/c3N7hmtzcHpui3aAgYhvcVtZfpGNh4B/f3Z1gICAoIeSi5SemqKVmHiKf4GNiJydio+GkpiWhYmVmpCXi4uNjYyciY2Qg22Ji5CRip2WoZuXlIWXh2mDooFlhJyJkH6Lg4uBd5OYkp+TkYmJlI1+fY6Xe5GMj46aknyKgIJvdnBsbW9we4ZpdIOPmYtxd4B1goiDeWZybnWAmY57h4N5k5B5dYdzb4d6hIp5ioWBh42aooZ7g3WCi393eW5sgYWDX3R1c3FxeVpfcWFwa15wan17cW1tam12YG9va3FtWVliYWJuWFFUWmZnY3VwhINjXWtuZGNma5JuYGdnX2hrgXVyc3CLgHV/g4B5doCLgHmFf3iIhneDhXyGi397dop/anFjfGOGfG5xbXRqaG9sdnhfcX95fHV1dICDfqSVmqyep5aFjYR/l5SDkKB2jKCUk4eLm42Wjot5cXh0gnByhXRxdohscG52bYh2g36Abm5VUYGrlYeDeH93coN6g6CCk4KVlJqdk5t4knuDjJKjmZOOiZWZkoSHl5mMlIuJj4+HnYSQinxzi4WKjoicmp+blZN/k31ohJuGZ4Wfh5GEkYKJcYORmJCcj4+MjI+Md3uRkHqOi4yRlox8iHyAa3dqbmtsbHt/Ynp+j5eBdnuBeIOMfXlnc2xzhpWLfoeFepOPcXmDb3aLeYiKeYh8gYqPnZ2Ee3p2got8d3FqbIKEe2F5cW5tcnRWX3BicmFgbW96cWhvZmZzdGlxa2J3ZV1XZmBgclNRT1xmZV15cIh9YFxpcmJiZWaRal9oZVtncH5wa3F0in12fIaAdXZ+jHl7hYF4iINzhoV+jIyEfHmVeGZya4NgiH5vb2t6YGpudH91X3R9eYZ4dHOFfXigj5mwm6WOgot/g5qIgIyfgIualI+FiJiOj4+EdnR3dIBxcIV0cHKEcGtpd26Dbn19bXVzUk2C38iS1pN7cHWEdoSgg5R3lpGZnZGZe5RzhZCeoZOTkImTnJSGf5eWiI2NiJGMh5t/joB3eo1+iYyKnJucmpSSeYx1ZoeQhWuHooSRiJeDhmOMkZmPlYuXjIyKinF6lIh7joiKkpGJeoZ8f218ZXNva2x6eluBeZCQgXp+f4CGjnt6aHJqc4qPiYGFhHyUimt9fm1/i32KhXyDeICOlJmZinx1d4OPeHJtZ3GAhW5rdXBoanVuU19vZXBaYGxyeGdramJmeHJwcWNfd2BgVmtfXnZQTkxhZ2NdenGJdV1cZXZhYmVljmRhZ2JZaXNzbmtxdox8dHqGgnV2fotzgIZ/e4l/comIgZGLiHx+mHZlc258ZYh+bnBsgFlsbnl5c2B2enuNdnJ3ind5noubrpqgkIKFd4iVfnyKnoiGoJKPhYyYhJOOh4F0eHB5cW+Eb21vf3NlZXlxfW16fWpoa2OkmsHcrvChc2x2hHaFo4aTcJeRlqGVnIGScoaLopeJjZWKkJ2Wg4GWkIWJj4CRiYmWfod6dX+JeIeEjpyamJiOj3aJdW2FiIl8iaKDkYmchIVei5OXi4+Jj4uLhIlte5aBfYiFiZGPhnaGfn5rfWR4dmpueXNYiXuSiIV6foGBhox/eWVyaX+JjYmCgX6LlYRrgXVth4+BjoN9gXh+j5SSmI90cneHjHVzcWd2eoRjdW5xY2p2aFJhcWdsVl9vdHphcmRgaX1wc29bY3JgYlZuWVx4Tk1MZGZiXndziW5cXGR5Xl9lZYVgY2NfWWpza25rc3eMfXR3hIF4d3uJcYOEfX6Ie3SLiYiWhox/fpdzZ3VyeWyMe250cYFXcXp2eXJld3mHjWl2gIlyf5yGmKabo5KEfXGMlHd5jJ6FhaGNj3yWjYCZiIR7c3dwdGpwgWxpbXx1X2F4d3xxdXxoYGR869q1ycPch3NsdIJ3i5uJj2qZkZCelpSBiXGFiJ+NhIuVioyYlHyNk4iDiY97j4qFj4F/dniDhHKIgpOclpSXhYx1hn5vg4GHhpihgpOMnoOJYYOUj4eKhoqOh4GHaXyTf32DhImOjYJyh39/cXdodnNqdHdsWo19k4OFfYCEgYSKgnZhcmuIgY6JgX5+kZB9bYFrd4SOhJCCe4B8fo+Rj5WIbnB5jIV0a3Fsc3mCYXVqb11sd2FSZXJpZlNgcHZ1YXBgXWiDcXNrV2doYmlYbVZbdUxLTGVnXmJzc4VqXFxleV5eZGd7YWRfXVlrb2ZvanR4in5zc4F+e3Z6iHOFg3x/h3Z3ioaPmYGMgnuTdWx3dnl4k3RueHt9WHmGcYBvZ3l3koNkdoaFcIqWhZmgmqKKh3Rvkoxxd4+cfouaiYl9oH+DmYCBeHJ0bm9kcn9pZm14eFxgeXt7cXGAamFnYX/Vto6RpnhucXd8cZORjYhrmo+JnZOMhntph4uZhoGSkYaHmI58jY2BgYqNfI+MfYmEenR6g3txhoCWmo6Tk4GIdYKFdIJ/iZGcnYaUj59+iGJ/k4eFiIWLjYCAg2d8kIB+f4KMj5B+bYN8g3VsbXd1dXh2bGOOgY+AhX59hn+EiX9wX3FvhHuOi4F7fpCIeXCDZXmBiYWKgXqEfH6SjY+Rg21ueYt+dW1ua2x7f2RpbGpZbndaU2pzaWJRY3J4bWNmXlpqg250YlxoX2RsX25VW3BPSE9nZVxnb3GAbVpcY3NgXGNsd2VlXV1aa2xjbWpzd4Z/cXB/fH10eIZ4hYJ8gId1eYmBkpV8iYZ2iIFweHl7hJNvbnuBd16DgHSCbWl6dJRzZ3OIfHGSkYOZnpughoh2dpR/bXeUmH+IkISLjpp8i5p3fnZxcGxqYXV8Z2JqdXpbYHh8em1xf2VjaGdXnY9fcXOWvMSEd3GUipCAdJiMh52UjYhza4iPlYB7lIuBhJuMfIqGfXyJjH+Th3SIhXZ2fYJxdYaBnpWGlI+CgnF+h3ODeoiWm5aGko2cgIhmfZOCgIaEiolygX1nfYt7eX9/h4uPfWmAfYR2ZnB5eHR4dGxrj4aLgot/eYOBhISAa15wd3p9i4eFe4COf35ygGh4gYaJhIJ3gnp/louOi3xta3qIfHZ0b2lofndlXXFjWHB0U1Rvc2liTmh1eWdhXl1Yb4BvdFllY11qbWBwT1lsUkRUaGJabG9te29ZW15tY1pjb3dkZ1xdYGtqY2xpc3eBg3Fufnt/dHWDeoSCfIKFdn6JgZaReIOKdIGIc3l5fo2Qb297gXFqgnl6fm5tfHaWa2p4hHRrk4yFnpigmYWIb36Mdmp5mY+AgoqClpiKeY6Wb3pzcWxqZGB0e2lgZnJ7W2FzfXpncHphZWSOsbJ3S2JapdrRl3J7koyReX+WjIWako2Gb2yFkpF5eZOGgISZinyHgHl4iYqElYBviodxdH17anmGg6WRhJOMgn9ufoJ1gneEmpeSipOPlIWHcHqShH6DhIqDb4F4aICFeHJ/f4OKh3xlfH6EdmNxc4BqenFvdZmNhoSLfHd5gIR6gmtcb3xyf4aDiH2Fh3qIcYBtcIKFjYKDcYN3f5eLjYN3bW1+g392emVoan5yYVp4Wllybk5YcnRmYEttd3ViXlxbWXV9cnBXZ15manFfb05XaVM/WWdfW3BrZ3lxW1tZa2VZY3B5X2hdXmVsaGZsaXF4f4dvbX99gXZwgnuAgX+Df3aBhYmXinGCjXF7hnx6eYSUjHVren9scH50f31vcnx7lHBvgH95ZpKKgqGYnZGDhmeHhHBnepeKfoCFgpmKgXyNjWl4cmxsZl9hb3ltX2JveVxkbIN6YXF2X2Rl1eu+izI6PouOgHJ5homPjXeFmY5/lI6Nf25thYyLdX2Pf4WClYl8g3hudoeFgpZ3boeEa3V7dGV5g4SnjIOPjIN9bX9zdYJ4hJqPi4+RkoyLh397kod4gIWNg2yAc2mAfnhtfHuBioN4YnmEgnJkcWl/bnZydYKcjIGAhn90dn6Ac4FvWmt9c3iIgYp7hn98iHd5cGuHgo6CiXGAd32UiYp9dG1qdoCAdXVcaWl5cVpXfVNacmZNW3NyZlxKcXhwXVtbWl11f3VpWWJbZ2VuYmlNV2ZRPV5mXV52Zl91cVtZVW9kWmRweVtoXmBnbWdqa2lweH2ObWqChIB5boF7fYF/gnp1goGMk4VwgItud32Ae3uIk4mAaXt+a3R8coZ7c3d9f4x6eIR+fGuMjISbnZaMgoFsjX5raH+Pjnx+f4OUgn99iohrdXFnaWNbY2dzb2BhbHRhaHCJemFzdF5iY5ugkG5cNVqvtXVqgIp+k4d3iJiHdZCMindwbYWChnR5iXiJfZOIen9zZ3WIfn2Xb3GFfWh2eW5leomFpYeAh42JfW19dH5/e4qXhoGSkJiJi4WKfI+Jcnx+hXxpfm1rgXt5anp2goeBcmB3gn5yZHJndoNudXyGlZKCfYKAcHd6fHV+bVhtfXVzin+GdoZ0gol6d3JtiH+Of4NxfXt8kYeIem1taG2CgXVuXWhmdHJSXHxOXHFdT1xzcGRWS3R5a1hZWVphcYF1YV1dYGZkaGhmTlpoTkFhZFxgdmFcdW1YWFN0YVtlb3JXal9iaGtnbWxpcHd8k2xphIp9fHB/fnuBf4J6d4CAiYuEcnuHb3F3hH97iY2PhGp+e254eXeKd314gIKHf4R+fnpthIyImKONhYR7dot6a22FiZJ5fXuCkoCAfYqEcHJwY2ZeWWdfcHBgYWhwZmpviXRhdG9bYGRqdnt/vpynpMm4coWEc5R9eYiUhHSSjodyc3CEeoJzdYZ0iHeUiXl5cWR3hnqAkmhxhHVmd3ZkanyEiJ6CgH+Ojn1xfnKDeH6QjoJ3lYyUkIiCiHqJiWx5en91aHppbH95c2l6doCDfWhgeIh9a2p0aHuBanaCjZGVf3x+fnF8dnx0fmJVdXtxcoiCgnuBcIaJd3hvb4KBi318d3x7dI2EgXVocGdsiIJycF1oY3RvTGZ2TF5vVlRadG5iUU90eWJSWFhdYXCCc1thXWhlZWNqZFFbcUlEZGJcZHFeXHhoVVdWd15cZm5oVmxeYWpnZW5uaHB3epNuaYiMeX1ze355goGCfHZ9g4iGg3B2g3Nud4KCfoiLlH9xgHx4enqBi3SDeH+BgYKEeoB1b32Ki5ueiH6Ge3eGe2d1h42Ren+AfImGhHaPgGdwbmBlXFhmWW1zYWFhcWxsaIluYHNpWF5jbYB3qdqpx4aIs3KKeXCOdn2IkIF7lIuAdXR1fnZ/b3B/bYV0lIZ4dWxgeYF5iI5lcYNvZ3VuW219gZCTgIF5kpJ9d3pshXR/j4qDcpWJkY+IhoZ7f4ZtdXZ/bWh3Zm18dm1qd3Z/f3xgYniGemh1dmN+fGh1h4+Oln11gHZygHp9bYBZVnJ9b3OChn5/d2uIhnN4anR/goJ8eXt3eXGKf3tyZ3NkbYuEbHNbal92Zklvb0xbY1hXVnltYlBTdXZZUVZYXmByhG9cYGNtZGNdb2NUXXJHQmZfXmZpXVp7Y1JWXHVbW2drYVZrYGBuZmZscWhwdniPdGuOjXZ/dnh9d4GDgXt0foOIiINvcX91cXV9hYGJjYt7d394hHx9hYd4h3x9gX2EgHt+cnZ4i46fjIl7ind1g3pefoeajXmHhHSGh4R3iXtibm1cYltbYVVqdGRgW2hvcGeHcWFxZldcY2t/fMrOh7qia25vi21yhHJ+hot/e5KFenl0enV0empsdmOEdpKCdm9nX3yBeYuIZXGAampxY1hte4aciYOCcpeTd317bYZvgImKhnCWjpCIhoyEe3l/cnJwfmdocmNueHFqbHF3fXx5XWV6gHhpdXlngndodYiMjpV9c4dqb36AeG59XVdwfW1zfol7gG1uin9wdmZ2fn9+gHV7cHhyhXt4cWVyYG2LgWtyWGtfeF1JcGxOV1ZfVFV8a2JPVHZyUVJUV15idIZpXWBramZiWW5hWGNwR0FoXWFmX1xWfF5PVmVxWVtqaF1YaGFfcmZqaHFncXN3h3lulYp1f3t3fnmDh4B1c3+FhY6DcHB7eHd1eYaFh4yGenx/dYt+fYaEhId/fn59hn98eHZ5dpKUn36NfYtudYB6ZISImIZ0kopvhYWCeoN1Y25qWV9bXV1VaHNlYFlkcnJngXJha2RXWl9pf3i+rnqfuG5idIdpdXxyeoSHe36NgHd4c3dvenZlam9hh3WOgXNqYl59d3iKgmVwfWhra1pWb3iLpIGFf3CZknF/d3SAbH+Aj4Zyk4eMiIWJhX15dXNvaXlham1hbXZqZ2treXd6d1tnfXx5ZnJ+boV0ZnaGjYaWgHCLZ2t7g3RsdWJbbnpqc3qKe4BldId8bXBndH12fH5wemp4eX94d29lbGFsiX1sblZqYXhWS2tsT1JPaU5ZfWhiT1V1a01RVFVeZnaEZ11hcWhnYVdpXFxraUpFalpiZVdYVXlaTldualldbGVcWmVjXnRmbGVxZnNwdIF4cJmFdn9/eH98hYd9dXSCh3+Vg25zeXt7c3KFhoiIhHmBfXaPf32EiY6EgYN6fouDe3d8d3aanZh6ioOHanZ+fWyEhpWBco+CcYaCfoKAb2ZsZ1hdW1xbVGVwZV9YY3J1aXZwZGViV1tbaH9wb3KAc4plZnp/anV3dHSEhniChXp3dHZua3pwYWhrZ4Z0jYRuZl5ffG96iX1obXdmamRWV3Nwjqd9hHx2lpBze3F7eGx5eo+DdZd8iIaDh4R9dXFzbWh1XW1pYG11ZGdmaXpve3NZZ4F2dWhwgXiCdmJ3hYt9lYJvjGtte4FxZnNlX2t4ZnF1iXp9YXWDdWlrcXR5b3h3cntlfH1+d3VuY2VgbIZ8bWtWamNyVExqa1BMT3BIXnxmYU5WdGRLT1RYYWt3fmZdZ3NpZV9XY1djcV1LS2tYZGJVVFVzVk1ZdmVaX2xgXFtkZV93Z21icGl0b3F+dXSZgXh/gHiAf4aEen12goN+mIVucnR8e3RxhYWOgYF6i3V0kIB9gZSOgIWEfH6Mhnp+gXZ7o6aKeYmGhWx1fHx1hIONe2+Fc3qFfYKDdW5qaWVWXVtbWlNjbmVbWGJ0e2ppbWhgYVdeWmmAaWxvgGdtYml7emt0dXVvhoJ6gX53dm57aGp5al9lbmiBd5CEZ2VYYXZpfYZ5bmlvZmZdVVhvaY+od4F6fJCOeHRufW1xdHiNfneUdIaDgIWJdmpzdmhpb1xtZV5uc19nYmp4aHttW22Dc3Rqb4F+endhd4WFepGGc4hycHp/cmNxaFttdmRvcod6d2FygG9naXhzcWt3dnN1YoJ6fXZ1b2NiYm18fGtrVWliZ1RMbmhQSFJsRWF5ZmJNVHJfSk1VWWVseHtmX21wamNdVmBWcG9XSlNoWGdeWE1VbFRLXXpfXF9sXV1bYmVgemhsYW9vdm5vd3V6mH13gIF5gICHhnp5eoN9gZOEcXR0fnp2dIWIkH6BfZFsc5WBe4KfhX+HfYB+hoKAint1hKyff3qIiIRscoJ6doGBgnVuh299gHSKgGpvbmVkWF9aWlpVYmpnXFpfdYJpXm1sXGFXW1xrgWVxdX1pal5teHdodXhzbod8fn56dnNsemhpd2ddZHNneneSgWNjVGRvZoGEdnZmaGphV1ZZaGOQqG9/d3+Kjnpwb3tmd215inp2jnGEfX9/h25kd3RlaGldbGJecHBbZ19tdWV6aF10gG5ya3F7f3Z1YnWGjHyJiIB/eHJ1fnRhcGxYcHJhb3CDenRjcYBrYGx6bmloeXdzcGSDdHh4dHBkYGNtcn1qbFRpXl9VTHVjUUdXYkdjd2ZhTFRxWUtMWFhobHZ6ZWRtcWZjWlhdWHdnVEpcY1hpWFhIV2VRSWN4W11fbVteXGJkXn9pamBvdHhtb252g5d5coGAfX+JjIZ+dXaGeIaMfXR1dYJ5enqCjI59f4WJanSWgXuKnX1+hXmAe358holzcY+ujHx8h5B+ZnGIenR+fXZyb4ZsfH5tkHpjcHBiZV1lVlpZV2Nma2BdXXOGaVlxblteWFpcbHticXd2bGNcbnR1aHV3cW6GeX+Bendvb3RlaHRlW2d1ZnZ2knpfXVNlZWqCgXN8YWNpXFRXXmJkkKVpeXSChZB4bG15Zndse4N5dIdygXh8eYBpZXdtYGdhX2tgXnVrWWZdb29iemVbd3xrbm9weHl0dWVzg5OAiYOJenZvcn1yYXhjWm5vYG9wgHpzZXGAZF5tdWhjZnh6cmttgHNye3FxYV5lbW59ZGlUaFlaVU55X1JKWllIY3VkYUpVblVKTFpXaWxye2RsbHNiYVlaW2F3XVRLY11ZalNWR1lhTkhqdlhfYW5bW19iY12FaWhibnh5bW9qdoGQeW6DfoCCkoiEgXZ1iXSMhnRxdnaBd319foyPgX+TfnB4loN9mZJ5gIB4eX5/c4eEc3CZont7f4mWeWV1iHpzeXdsdHB/bHl8cJJzXnBvYWdibFRbWldpZG1mXFxxiWVTcm5bWVhXYGt1ZGp1ampfW250cm10dHVrh31/gX13b25sZGlwY1trcmR0do5zXFdUY19wf35xgVxiY15TWmFcZJOfZXJxhYOQc2tqeGxubnl5enGAdn9ze3p7ZGZ2aF5jW2FoXF53aFdiXnBoYXdhW3x2ampybnh0dHRpcYKWhId/hXZzanB8bWZ3V1tpbGFwcX94c2VvflpgcHBhXmlvfGtqcn1xb3Zpb2BbZGtse2FmVGdVWFNRd1xSUFlSSGRzYmBHVmxRSVBaVWtsa3xlbW9yYVtaWFlscFdTUGZXV2lTVEZaXE9Jc3VYYGNuY1hhYWFejGpjZW16eWxuaXZ5hntrhH2AhZl8goR5fYhtj4Zxb3Z6fXSCgn2Lj4ODl3R4gpSFgZ+JdYF/gXR/gnCHg3Zvopd0e4aMh3tmd4tvbnxwZ3hxe2xzdnONa150b2JnZmtTXlxWaGJsbFtccY1kT29tXFZXVWZoc2hjdGVlXlpwdm9xdnZ6bIh9gH2Id5BzY2Rrb2Fcbm1jc3iHa1pUVmJidnx8cIRcY19jVFpgWmOXlWNucIKFiXJpZnluZHJ1cXpreXR1b3t/dl9nc2RcX1diZFlhdWVVX2BtZGFxXV1+b2hpc3F0cXV2bG2FlIOKfIVxcmdufG9xb1JaZWlkcHJ/dXNibHVVYnFqW15uZHtka3R8cXFxaWxfWGRpanheZlVkVVdRVm9YUVdUUEhlcl9hRlhrT0lZVFZuaWR8aWt4a2FXXFVbdGRTUlZoUVlnVFNIWltQTnl3W19lbWpaYmFeXo9uYmdseXZubml2dn9+bYSAfoaXe3+HgYp/a5OIcmd0gHt1gIN+iY5/jJNzfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4KNjHd4bnqNYGV9cWd6dHlsbXF3g2dkfG1kZ2doU2BfVWdgbG9cXm6OaE1pbGBVVlNvZXJrZnhlZV1acnZuc3t5c26Ke4B3nHt6a2FlbG1eYG5qZXB5fmdaVlhfand7em+DX2JeZ1ZZYFhknIhia3CBhnx3a2p2bFt1cGp5aXVybm97gXNYa29gWV5WY2RYZXFjVF9iaWFibFpgfmtmbHR1b214dmxoho2AinuIbXFmcHtscWxhWF9nZ25yf3NyXmlsU2VwZFVibWF4YW90enRpbmtqXldgZmh1XGRWYlZUT1lnU09dT1BIZXBdY0daak5KYEtYbWVfeGhufmRgVV5UXXVbVFJgZ05eYlVTSlxaUVp2dl1fZm1oWGNhW16OcWNoanhyc21odnN5g3OCg3uIjn58ioiOeW6PinRsc4Jzf3+IhYeShJWPen2Mj4iRm4SAfIyEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6OjY2NjY2Njo6Ojo6Ojo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2NjY2NjY2Ojo6Ojo6Ojo6Pjo6Ojo6MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDRERERENHZGhnZ2dnaE1CQ0NEREU5Li4uLi4rSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1NDlcYF9fX2BhQTU2NTU1NycbHBwcHBg7g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn1+fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmJiZmZKPkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFhoiJiImJiYmHhYWFhYWFhIODg4KDgoWKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7enx8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQkJCQkIuOkZGJh46KkJKTkYuQjYyPh4+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjY2Njo6Ojo6Ojo6Ojo6Ojo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCLhYeHh4yGiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkIiFhYaFjoaLj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQiIWGhoeMiIiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin58dnZ4fHx7fH19fX19fn5+fn5/fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhIiGhoiFiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp8enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+KjoqKjIqOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enl6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx+f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomHgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYWEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f4B/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f3+AgIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f4CAf39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/gH9/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlZWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSUk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTkpKSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fX59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZGSk5KTk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkJKRkZKSk4eFk5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJKCgZKRkZKOdYaRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf35/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCPkIhwhJGPkHx1iJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+Pj5CQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX19fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6PjHNvio+JcniHj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNdm57j4JzeIaNjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4dzbW6DenR2gIWDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFlYWFdUUFFSU1JTTU1KSUZFSEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f35+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3dGJeZF9ia3FmaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/fn5+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhiXmxsXWZnZ2ViY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSElKSEhISUlISVZwc3V5ent5dnZ5enp7fX59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtZVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWlprd21ibnNqYlpZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3l2d3h3ent9fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NW2tybGFtdHJnUVFTUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU5cZG9rWWlzdXBTTU9QUFBPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgH+BbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRkJFSVZjZ2tvcG5tbFpNTE5NTk9NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIJvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUNHSElOW2dpZ3JubmlmZGBfX1hMSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+SVpdW11mbG5rb21tbGtpaWtjUkdFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4CAgICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7PUpbaW5ub2pvbWtqbGxlUEdFREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwc3R0c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgYJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk6Oj1HYm5zbm5sa2xnVEI/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUZFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3RycXR4eHl9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTk8SV9zdHFmUj86Oz1AQUA9Ozs+PD08QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl6e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09Pjw6Qmx9aT46Oz49Pj9AQEA+P0FAQEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBBREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A8XG5APkRFPz9BRF9kPD09Ozs9PkFBQD5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkNFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7fHx+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojttd0g4Ozo9PkE6SWU9PD08ODo7Pz89PD07PEA9PTw9PTs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJR0hISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPDw9SUxGRnV3TTc4ODo7Pj9XakE7PDw6Ozs+Pz89PTg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDcnlJO1x/g396fHdXPD0/PT0+RWh0TDo9Pj89PT9BQ0A8OTtBPz4+QT07P0FAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUdyeWtig4SDgoOAfV4+QENAQD1Kc3tZOj1BRUFCQkZIQz08QEREQUA/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARW50fYKCgYN+fYR2TUFDRUA/Pll7gF0/Q0VJSkpJTU1LRUNGRkdFR0VFRURFQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXJDREVEQ1d1hoeHflhHSEpMTk9QUE1JR0lHSElJSEhHR0hIRUNFRUVGRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnV2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEiWxBQVZ0h4mHh4eIg1dISk9OT09NS0dHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklLS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIhFZshIeGhoaHiIiHfE9YZExJSUdHRERDQ0BAQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERkdJSklKSEhIR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xLSlSBg4SEgoKFhoaEgoaFhISGhoaHh4aKdm9pU01APkE/Pz88PDw+Ozo8QUFAPjw5OTg8PD07Pjs4Oz9BQkBBQ0NCQEFBRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGAgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISklJZYWEhIR/gYKDgoODhIWFhoeIiIiIiYyOfmxiYVI+OD9ANzc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzU4ODs7Oz1AOzk5OT08Pjs8PUFDRUhKTUxMR0lHT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlohoSEgX6Bg4ODgoOEhomKjIyLi4mKi42Mb2BkZVlBVz01NjU1ODczNTY4Ojg3NjU2NTY3Njc3Nzo2Nzg4OTo3NTc4OTc5Nzc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHZ5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANjc4OD06PUVDQmWFg4GAgoODg4ODhomKiomJioqKiouKi4yGamZraWZRNzg4NTU4ODU1NzY5OTc3Njc2NTo5Ojo6Ozc5ODk4NzY2OTo5ODg2ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1dnp7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhYaJioqIh4eIiIqKjIuKi46Ea2xrYj88Pj85OTs8OTo7OTo7Ojo5Ozo5PT09Pjs7PDw6Pjs5Ozs8Ozw7OTo8ODo6Ojo5OTk8Pzw8QUJESUpNS0lLTFdvcnN1c3Z4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4qMjY6AbWxgRURGRkJBQUI/QENBQD49Pj5APz8/QD9APT0/Qj5AQT9APz1AQEA+P0E8Pjw7Ojs6OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e319e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoOCgoSFhIWEhomJiIiGhoaHiImKi4uLi4yNjI17bWtPS01LSkdISEVGSEdFQ0FAQkVDQ0FCQ0I/QERIRUNFQ0VEQUZFRkRFRkRAQj49QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDREZXhIKDhIWFhoaIiYmIh4aGhoeJiYqLjI2MjIyMjYt4bWFtZE1PS0tLSUlKSklGRERHSEdEQ0VGREJISUtHSEdGSEdFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT5CQkdHSVmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjY2NjYyMjId5eWVhT09NTE1KSUpIS0dER0lISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg4PDs7PTo+QD4/QENGSUlQX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjYyMjIuMjYZpUlJPTk5NTkpISEVKSUVLSUdLSklKR0dHS0xOTE1ISElKTVFOUE5NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1RucHV3d3l6eHl6e3x8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AOTo8OD0+Oz1BPj9BREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiIiJjIyLjIyMjIyMjGFUVVNQUE9MS0hHQ0hKR0xLR0tPTEtKSkxNTE9QTkhJS0xPUVFQUU9PSkhKSkxKTEZHSEdGRklGRUVCQUJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4qMjIyMjIyOfVpYVVVWVVBOTEtFRkZMT05QV1VRUE9RU1JNU1RPTVNMUFNVVlJTUlBMSk1NTUtOR0dKRkZISkVERUVCRUNjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CQEJCR1ZORk5QUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjI2PjIyMalpYbGNHVFJSUUs7O1JTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9NUlFQUFFLS0tISEpIRUZJSUlISWlydnl4eXh6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHR0ZFPz9BQUVBQ0dFREVMWFJNVFVWWFp8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMiouMfmGKi4uHbl1lVjtZWllUUT9AVlVYXGRgVllicl1dV11aVkVRWVpbWV9UWWdSVlZYVVRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p6ent6e3x9e35/fn1+fX19fn5/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36LiYqMem9wWlxdXFNVU1ZWVVtadYNZVX2QYVxYXV5XSVZdXVtbX1lIWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/f4B/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4SLfmdaWlxaVVdVV1JRV1ZjloBSZXJYWldfaFBgZltbWFxnYUdPWmhnXVtcXV1XUk9TUFBSVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltTU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfoB8XlJXWVZTVlNSUUxPTUtmeVtdVFlVVl1aTFRaVVNUXlpYV1dXemtYW1xcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fH1+fn99fX1+fX1+f39/gIB/f39/fn56eHd2c3V7f3+AgHRrf35rcnleW1ZVU1JPS0ZDREFOXoNsVlJTTk9RT1FVUlNSUlVjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYmHhoOHh4d5b3JYS01PUE1PTEpLREVJRUM+VGRVf1JRUU5LUVRRTU9ZUk1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dXVzc3d6ent7fH17fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5cWVVQTElMSWFsknRQUVNOUVJRUltSU1JRUlVUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnZgXk1FQERERERDQUVQQkNBQz1DSUdWQEhOTEddaVBIRk5GREVGSUdIQkRIR0lLR0RCQURAT1FNUmRydHZ1c3R1enx7e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUU09WYGtscnZ7e3h5dHJuc3RzeXh+f4OAg4OCgIKAgoGCbE5IQEE7PD5AQD9AP2tQSmBFRkhJRUI/R0xOR01RVUlBRT4/PD08PT0/PT9BQ0NAPz09Qj5KTkdVbnV0dXN0dnh7fHt8fHx9fX19fH59fXx+fn9/f4CAf39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSkpQUU5LTFFSUVRWVVdRUVdVUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlREJBQj06QkNBQURCXF1Pe05PT05LTE1PT1FMS01XTUhHQEE8OTc3NTk5PTs7Ozg6ODo/PEJIP1xzdHV1dXZ3eXx8fH18fH19fn58fn19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF9dWklIUFJRT01QUU5RUlRWWFNTWVRPWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIR0hIQkFHSUVFRkRNUlBhV1JXUVBTU1JVW09PUVZQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEM+ZXNzdnd3eXl7fX18fHt8fX5+fnt+fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFZXXlpYTUxUVFNQUVVPTFJTVFhYVFRZUk1XWVpWWFhWWFldV1dYaHNrXVZhc2tiYV9eZGFfXllUUU5PTkxJSEpMSUlGQ1FQU1tXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk5ODk3ODg1NzU3ODU5OUdtcnR3eHl7e3x+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RWVVVVV1BTVVdUVVJdbl5STlpfW1ZZO0RWWFRbZkpMUFNST01NTk5OTEpGUVBVWVNUT0pOT1VTVFxWUlVTUk9NTElISEY/Pjw6Nzg3NjU5OTY3NjY1V3Bwc3d5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwb2ZlZGNcXVJUWlZXVVRXVFJYWFlZWVNVT0pHT1BPT01SSlBQT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFNNSUxKT1JQUlJTVFFST0xNS0xMSENCQT06Ojg3NjtCNTU2Njpkb3F0d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpJR0VITEhLSEZMTVBNRy9FX1I+Mz8+am9hU1JRQEdVUVBRUFFOUU9RUExKTExPUE9OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHV5e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hFRkhKTUxFR0NPUkM4RU5TXWdUUVNBR1VQT1FRUE5NTk1LTEtLTk9PUUxPT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ0eHt6e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa25xbWltY0xPT01RU0xUVVRYV1VMTEtJPDk4Nzs+QD48PUFAQj0+RUhHQ0VGSUdKSkBGQUFARkhFSk9IUVJiXFFQUk9TT09QTExPTUxNTE1PTltXS01RT0dJSENISkxMSkZGRkU/QkM+PEJHP0I/QWRwc3d6ent7fHt6end7d3l+fnx7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0Q9OTc3OT9CPjs/QUBAPkBESUVDR0dJR0lFQkI/Pj1DQkFHSURNT2JlUU1PTldLTE1LTE1NTUxMT05TZE5LTFJJSUlFQUhKTE1OSkdJR0JBQkA/RUZFSERLbm92eXl5e3t6fHp3dHh1eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTU1KTVBNUE9ISkQ/QT05ODo6P0I/PEBCQUFERUdLRkNISUdHSENDP0I/P0BBPkRFQ0tOUlRMSklNVEdJSUpMSUtMSUpNTU9QUlBLR0NLR0NCSUlMTU9OSUpJR0NDQ0RJSk1MSVlybXd5eHp7enl8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUhLREdISEdKS0lKS0RGQj0+PTk5OjtAQj89QkJDQ0dGSUtKRElJRkdHQ0M7QUBCPkBAQkVDSU1QSEhLR0hLREhJTE1ISkxISUpMS01dUkhIRE5GQUNKSk1MUE1LTUpLRkdHSk1OUU5MYm1pdnZ3enl7en1ybWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktERkVHRUZGR0VHQkNAPjw9OTo6OkBDQD5CQ0RFSUVJSkxGSUlHRkZEQjtBQ0M+QENEQ0RHTE5IS05IREhFSUxOTUdJTEdGR0lJTE5LSUdFTkhCRk1LTUxPTU1OTUtISElPUlFSTlJmZmZxb3N4dXt6fGxoam5la3Fsc3BmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSURGRkVDQ0JFQERBPj8+Ojs7PTo8PkNBPkFDRUZKRklITEhHR0dGRUNAPURFQj5BQ0NDREdISUdNUEpGRkdLTk9LRkhJRkVERUlKSEpJRkhPS0NJTUtPTU9OT09OSkpJTFJVVVJPV2RgYW1ncHJvcnl6Z2VoaGRpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxIRUVIQ0JBQkQ9QkE+QT06Oj0/Oj0+QEI+QEJER0pFSUZJSEZGR0VDQkFBRkZDQkJCREVER0dJRkxRTElPSkpMTElHSEVHRkRDSUlIS0pHS1JNQk5OTVBOT09NTk9LS0tPVVdWVVNYX15caWFtaW5ocnNiZWZmZGhoZm5qZm1taGtrbXJpcXZ0c3Ftdm5vcXJzd3Nyc3R1dXZ2dnd2d3d2dHd1anN1bnV0c3FyamtzTUdIRkhCQkFERTxBQEBDPDg6PT45Pzw/QkBAQERGSEVIRkZIR0ZGRENFQ0RJRUNHRUJFR0VGR0dFSk1LSFFNSktISElFRkhIRUNJSUlLTUtPU05EUVJQUFFOT01OUE1MTVNXVlhYVVhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpbnlNSEdISEJCQkZFPD9CQkQ8Nzo+Pjo+OkBCPj8/Q0VGREZERUhFREVDREVGR0pFRUpHQ0dIRkhHRUNGSkpHTktMS0hKTEZJSUtIRUtLTE1OT1JUT0hTVVNQUk9RTU5RTk1QV1pWWllWWl1ZWGFgYWBeaGVjYGRmaGdqaGhpZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1d3V7fn14dnR3dnZ2eHBsdXBtc3Rub3JyeE5ISEdJREJDSEU8QEVCRT04OT4+PTw8QUI8Pz5BQUZDRUNDSURERUVGR0dHSUZHS0hESUhHSUdGREhLSUdLSE1LSktMSExLTUtKTktPTk9SVVZPS1VXU1BTUVJMT1FQT1RZWllcWllbXl5dYGNeXGFja2JgZGZncoVoZ2lmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB0TElLSUtGQkVHRTxAR0NEQDo8P0A/Pj9CQTxAPkFBRkNFRURJRUZFR0ZISEZISElLSkZKSEhLSEZGTElISEpHTExNTExJTUtOTU1PTFBQUVVWV09LVlZVU1JRUUxPUlJQVltbXV5bXF5fX2FgYWRdY2BlZmBlaGpjc3Nmamdna29ycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKS0xKTEdCRURFPEBGRERDOz8/QUBAQENBP0I/QUNIQ0ZFRklGSUZHRElJR0lISkxISEpKSUxKRkpLSElLSkdLS01NSkpNTU5OTlBLT1BSVFhWTU5UVlRSUlFQTE5UU1JXW11eX11dYF9gYWFgYWNlYmRoYmRpamd2i2xqaWdtbnNxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZud0tMTExNR0NDQUQ8P0VFRUM9QUFDQkJDREFDREFBRUdDSEdISEdKR0NISUdISkZJTEhJSk1LTkxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1BXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1uc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BDQUVEREZCQ0VHQ0NJRkNJSkpJSUtHREtKR0hKSUlLSEpKTkxPS0lMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGF2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RCRUVERkJGRkdERUtGRUpNTEtMTEdHTUlHSktIS0tJS0tOTE5MTExJTExMW3NiZHBebG1VTU5mc11mZnFsbnRncGlfYVlubmJwcGJrampmb3F0ZXRub1xvdWdwTUpxeXZrYWBrZWVteGxrdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dHRibXVrcHBscnJxektMSUhHRUQ/QUJAPkNGR0JGQ0ZFRkVEQ0hIR0RFS0hHTE5OTE1MRkpOSEpLSklMSkpKS0xNTk5NTUpNTU5bcm9vbnBwbGtNUFFsV01pYnRycGFtbnVcWWxRXG1tWnFta29teHh0c2lwXV9ya3FqVXV5eG9jXmtmYmdwcGppb3BwcnNwcXBxcHJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHR0VFRUJCQj5AQEZHQkdESUZFRUJGSUhIRUhMSkdNTU5LTU5HTE5JTEtJSk1JS0pKS09QT05NTE5OTFxoZHVdbHFXbE5QUW1UWWtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl1eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITEZJREVFQ0FCPUJBQ0dESEdMSEVDQ0hLSUhGSkxMRk5MTFNSTEdMTEhOSklITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllya2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altedGN3eHJqbnpoYWFjZmJiaW10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9uc3N2c0hLSElCRUVFQUE+RERCR0RISU1JRkNGSkxKR0ZLTkxFT0pLV1JLR0tKSk5JSEpMSUtKSEhLTU1NTUlLS0tTa2NbaV5faWNyclpfWWpuX2VlVWtfY1thYVFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ2dHdyR0dGSURFQ0ZBQEJGRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpFSEhLTUlISkpLS0lISUdLS0tMR0hLS0xNTUxKS01OVFtcVFBUTFBPTk9PVlFPT1FOT1FKSk9QUWRxaVRZV1xbXFZZW11YXVxcY2ZhYWViY2ZfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRkVBRUNAREhERkdDSUtMSEZER0tMSUVHSVBLTE9LTFdMSUVFSElKSElLSU1KSEZHR0lHSElFRkxJSkxPTUpQXFdeUFxbYF5NWFlTXFxiXk1YWk1YYVJLWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYWFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJEQ0JFSUVHR0ZLSktIRUZJSktGRUhIUEtNTUpNUklHRUFIRkpJS0xKTEpIRkRJRkRGR0VGSkhDSk5LTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5fXF5TWl5jXlpdYGNgWV9jW2BeW1RYV1leXWNiY2FjZWhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0dIRkhHSEtKSklERktLS0VGSUpOS05LSExOR0hFPkdHTElLTEtLS0lHREhEQ0RFQUZKREBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVhVVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHh5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQkVHSUZHSEhGRklHSEdIS0lMRERLS05NTEtIS0pISUY/R0dOS0tLTUtLS0lGR0NEQERBSElCP0lKSE9dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXGRjYmRjZlhRVVRRW1daYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhYaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktKRkZGSEdHSUdGRklMSk5GREtLTU5KTElLSkhIRkJISFFNS0tPTEpLSUdHRUQ/RUNJSUJCR0ZFVF1ZXlhfWV9bXVVYWE9dXVFLSlZeWF5bXVVZYFJRX19iYmBgYmJgY2JhZGRiWE9RUVFaUltdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhIWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eIh4WDgHx4XFNLQ0FIRkRHTVJIQ1FKRUdISEVGS0pNUEVGSUpLTkxMSUtMSUhHREhLUU9NTVBMTEpLSElDREFFRElHQ0JHRkRXVUVcVF1TVl9YT1RVTlpaTUlKVGBhW19YXl5hXU9ZYVxgYF9iY2JdYWJXYF9UUE9PT1hRXFtbXFxeX2JmZmVsZW9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZIRElSYlBDVl5JR0dIREZNS1BQRUlJSktOTExLTEtJSkdFSk5RUU5PT01OTE1IS0FEQUNER0VDQkVHQk1IQktLT09OTEZNRkdJSkhHTEtNT1BJTE9QT1NPTFBTUlVaWVdZWFhkV09TVFBQTk1PVFNaWFhaXVxgYWRlY2dja2xwc3J5eX97en+EhISFhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdHWExHSEpIR01MUVFITEtLS05NVU5PSkpLR0dLUFNTTlBPTk5OTkdLRmBFRF9MRWZkRU5cSV5bcm1PTVVtWUxEUWBVa1dnSl1XVV5ETFFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqUlZVVFtcW2BgYWJhYmBmaGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElGR0ZIRUVLT1NJSkZgVEhJT0pJT01SUUxNTExPUlVST09JTE1HSE1RW1lPUFBOT09PSUpRf1FJfFlZcnRZUW1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtfVlZYf2p0dXVeX3ZeV2FbW2ZbX2BhYGFdYGFnbXBsYHB3dHiBgYKDg4J/fX+Adnh6bHZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSkVITU5CRExMRklLRVFWTEtOSUtSWFdRTk9PTVFUTk9RT0tLTkdNUFNbWlNRUk9QUFBKSFp4XVR4ZWhaU1VSdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Jye3xvfnhugHJfYGBiYVpgX2drbmtibGZnbXd+gYCDfnt4d4B0dnppcn5uc3x+d3h7foCDeHyAdXx/fHxzc05LR2BdR0FFTU1ISkpHSlBPTU1KTlZeWVVMUVNOWFpNU1NSTktPSFFSVFlXVlBUUFBQUUtIZ3hsY3hybVtLTlZ5cHVtdWJvdlBlZUpmdnFtd2+AamZ4eGlXclFoem1panp6fmx4en9vaG9ZdnZqdnVwgF9yZn1pbHh8b15fX2JhW11iZGdpamRnYmNkbGxwcHN0c3NzeXFyeGJsdWdxeXtzcnZ5foFzdXpufH15eHJuTktTdU5DQkZQUEhKS0lLUE9PT01QWmBaV0tUV1BhXlJWUVlSTFBJU1RWWFdXT1VQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmhxdW5teXB3bHZ0dHJsbl10fnprbXl8a3RsfGtwdnV4Xl9fYl5dX2RkaWdoZWVeYWJpaWlqa25va3FvbWpwYWNmY293eG9tcHN5f25xcGt7enRzb21MTFtWSEdFR1JQSUxNSktQUVBQUFBXXFhVTVVZVWVYUlJZXlNMTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1pwenteYHpzY3JveHFoZH1pcnxeVExsYHZ1a2l1e3ptfnhrfHBcXl5iW15iZGRnZWVlYlpjY2lra3JzcnZnbGloZGdgYWthZ3NybGdtbXJ8a21oa3t0bW5rbU9IS0tISkhIUVBMTk9MS1JSUk9TUldSVlRQV1pWVlRUVGFfUE5NS1RTVFFWVk5OTE1PUEpIUU5QVUxLTFNUVFNUUFZVUVFOUVFYWVJOUFVUWFhYW1tVUlNXW1dYWFpPU1VXWFhSXllXXlZUUFlSV1dXV1heWmdyXltbWVxdX2NaX2NjZGZkY2NiWmNiZ2ZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2dqdWpoZ2lsUUlLTExNS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVdPT0xNVlRRTlVTTk9NTFFQTEpRUUtRTUtLUFNVU1FRU1NJSExOT1FSUVFRVFZSWFdcV1NSUFJUVVZTWlFOU1JXVlRZVlVaVlRSVVRUVFdYVlxZXmBdXFpaXFxfY1tdYmNkZmRkZGFZYGFjYWJoaGltYmFkXl9jXVpkXGJtYV5mZWZtc2RpZ2prZWRjZmhQSktMT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYU1BQSk5XU1BOVVBOUU5MU1BNT1VTTlFOTU5RVVFVUVJUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdWVllbVFBUVVhVVVpVV1pWU1JXVlVXW1haX1xVWF5cXl1bXWBhXltiYmNnZmVkYlhfYWJdYGdkZmVhXl9dXV5aWmBaX2dgXl1dYmhrYWdmaGZkYGJjYU9MTUxRUUxPVE9PU1FPUVtZV1dYW1lYWFZcamRWWFlaV1ZTU09KTlZUUE9UUFBQTU1SUlBSWFRRUU9NT1NWT1hSVFVVT05NUVRWVVRUUlRXVlpdXFpWVlFRVlhWW1tXUVRXVlZWWVRYWFZTUllXVVpeWV1fXlVeXF5gXFtfX19fWmJiZGhnZGRhWGFgYl5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUU9VXFpaV1tbXFlaW2RxbWhkX1tYVlVXUUxNVlNNTlJPUVJPTFFTUlVaVVNQUE1RV1dSV1NTU1hNT09RVFhWVVVTVVlYW15dW1tWUU5VVlVbXFdSVFdWV1hWVFhbVVRSWlhXXF5aXl9gVWFcYWFdYGJfXGBdY2BjZ2hkZmBZY2BhX19lZF9gYltaXFtcWVpZWFdcWlxbYF5fW15eYWBeY1xZYFpRTk9OVlFQVFFPVFRTUFdcXFxYXlxeV1xeanF3eYBjXFtVVVdRTU9WU05RUU9SVFJMUlRUWVpXVU9ST1NYV1RTVVJSWk9QU1JWW1ZXV1RWW1hcXVtbXVZTTVRVVVxcVlJVVlZYWVNVWlxVU1NdWFpdXlxgYGBWYVtjYl1hZF5cYmFiX2NmaWRmXltkYGFgYGNlX2JeWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVUUlFXUlRQW15eXVtgXGBVXF1oanJ9c2xnXFRXV1FOUlpTUlFUUlRVVEtSV1ZbWlpTT1NRVlZWVE9XUlNaUlRUVFhdV1hZU1hdWF5dWVpdVFVOVVZXXltYUlVVWVlZVVdaXFZUV15aXV1gXWJiXVlfW2VhX2RkXl5jY2FeZWZpZGZeXWRhYGFhYmRgYl5YWl9bXFtYWFhXV1tZW2BcW1tcW1haW15WXlldUU9PUlpQWlRVVlZTVFReXmBeXmJcYFVdXmJreXRsfWtaVVlUUFBTXFRVVFVUVllXTFJbV11bXVJPVVNYV1dUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlRV1JZWFlfW1pUVVZaWVpXWFpcV1VbXlxeYGFfZGNcXl1dZWFhZmReXmRjYFxnZGhlZGJfZGFgYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TTlBWWVFdVVZZV1dVWF9fYWFgY11fVF1fYmVldYF6aFdZWVNVU1ZcWFdXVlZXXVhPVV1aXl1cVFJXU1dXVVNUWFJTVlRYV1hdXlhdW1ZdX1hfX1hcVlFYVFlaWmFZXFZXWFtaW1lZWltZV15fYF9jYmFkZFxiXGBmYWRmZF5fZGJiW2ZjaGVjZmBmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOU1lWU1xUVldZVlZcYGFiY2BjXl9WW2BkYV96dW9oWVtZVVdUV1taWlxaWFlgV1BVXlxgYFxUVFhQVVdWVFZXUlNVV1paW19eWl9cVl9fWl1eWV1VUllXWVldYlpeVldbXFtcXFtaXFpaX19gYGRiY2RkYmRZYWZiZmZlXmFiYGNeYmNpZGNnX2deYWJjYWFgXl9YVFtaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU09WWVZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5bXFpWV1hZXFxdX1tZW2JWVFheXWFjXFJWWVBXV1dXV1ZTVVRYXFxeYGBdYFxXYV5bXltaXlhVWFdbW19gXF9YWVxcXV5fXFtdWVxgYV5gZWNkZWVmYlhjZWRoZ2ReY2BgZWNcZWlkZWlfZl1jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldZWFtcWFdZXmBiYWRhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1laWF1gY2RfUlhZUFdXWFlZV1ZXVlxdXmBhYF9iXllhXV1eWVxeWVhVV1tcYF5dX1paXl1eXmFdXFtaXGBiX2JlY2VmZWZiWmRmZmlnYl9jXmFmZFppaGJmaWNlXmJiY2FgYF9dXFpYW1lZWFhaWFdaW1pZV1hVVVtdXV1gYGJieEtYV1tZVlxbXF1aV1xdX2BiZGFiYV1gWGJjYmBjYWJdW1xbWFdbXF9dYF9dW2BkXVxYW2JlY2FSXFpPWVhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl1ZWVRYXV1fYF9gXFteXmBiY11cWFxeYGJiY2VkZmRlZmRcZWZnaWZjYWJcY2dgXGloYmhpZWRgYmFjYV9gX11dXFlcWVhXWFlYV1xaWldXWE9YWl1hY2Zmcmt/SllXXFpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGJiYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF5eXllYVVtfXl1hYWBeW2BhYmZjX11UXWBgY2RkZmVnZWZmZV5lZmhoZ2RkYFpmZ15haGhiaGhmY2BiYGNiX19fXF1bWltZWFhYVlpWXFtaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhIKCgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoKCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t6enp6enp6e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2d3d2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7enp6enp6enp7e3t7e3t7e3t7e3t7fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb3Bwen59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYiQzNPS0tLT1Z6GiYmJiYmLjYyMjIyOiX9/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb296gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMipTd5uTk5eTnpYmMjIyMjI+Qj4+Pj5CLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dXZ3d3d3d3d4eXl5eXl6eG9vb29wcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYOEhISEhIR+fHx8fHx8fH18fH19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl3dnZ6e3h7eHd2d3p4enp5fXl4eHl4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7eXl5eXl5eXp7e3p7e3t7e3t7fHx8fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3Z5fXx9fXp8e3d3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomNjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3dnp9fX19eXx6d3h4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDhISCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd2e3x9fHt6fHt3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enl6fXx9fHt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh7eHp7eXt5eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKCgYKCgoKBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYWEg4SDg4KBgYGBgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eXl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KBgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm94eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSCg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDg4GBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx9fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgYCAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGBgYGCgYKCgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3Nzc3JycXBvb29vcHFzc3NycnJyc3R0dHNxcXFyc3R0dHR0dHRzc3Rzc3N0dHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3NycXFxcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Nzc3JxcXBwb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubm5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgoGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnNzc3JycXFwcHBwb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJxcnFxcXFxcXFxcHBwcHBxb29ubm5tbW5ubm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgIGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFxdHFycnFxb36CbnBwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFxcXCHiHBycXB0moFucHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcX2ig29yb42ffG9wcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXJxdZ6id3F3oJx9b3FxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcXBwcHFwcHFxcXFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJxmKmQb4KjnX5wcXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgYN5cnNzcnJyc3Jyc3Nzc3JzdHKTqaR7iaGdfHJzc3Nyc3N0dHV1dXV1dHV3eHd3d3d3eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/gH5+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fXx2dnd3dnV4enh4eHh4d3h5eaC0qaapqZd9e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f39/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt8e3uKr6Shtaqso397enp4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX19fZmllqKxoJmnlH2Af319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgIGBnJyNoLCgn6KfgICBgH5+f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/gICBgYCXm5CYsaGYlZ2FfX5+foB+fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjI6MiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35/f39/f39/gH5+gIF+f6GrpZakm5uYoqCHf35+f4B/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSBgYGDg4GBgYKDgoSEh4+hsqehoJmdnaaorKmhmpGHgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMj5GPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4ODho2frbGmm5qgm56cnJ6hpKOdlIiDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OCg4qXmZeWmKCbnZ6dmpqXkImGh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhISFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+PkJKRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYGGjpSTl5qcnZyVj4mHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6Tk5KOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhIODiJCUjpSYkYeCgoWFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKBgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZOSkI6QjpGRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGBgYKDgYKCgoGAh5uIjIeCg4KBgICAf4GAgICAgH9/gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgYB/g4mOgIGCg4OAf39/gICAgICAgICCg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiYaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOKloiEgoSCgX9/jJWCgoGChIOBgYGCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWGhISDg4OChI6Zi4OFhISEgoCRmYaCgoKEg4OCg4GBhIWEg4ODgoKDhISDhIODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSkI2MioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBkIyDgX9+fXx9jJyOgIKBgYKChZSUjIGCgYKDgoKCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhIWFhIODhIOEg4KGlJSSlJKPjYyIg4SEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GWl4mAfX19fXuBmIyAg4GBgYCOlIyQgYKBgoKCgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgZWfin5+gH2Hi36EhIOEgoODgo2JhYyCgoODg4KCg4ODgoODg4KCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fX19gIOEg4KDhIOEg4OEhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoaGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSko2KiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOJkYOEi4WCgYF+fYGHhoOAfn5/f39/f4ODhIuGhISEhIWFhISEhISFhYWEhYSGhYWFhYaGhoWGhYWGhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f36AgIOPl4aFhoWFhYWFhoeHhoaFhoWFhoeHh4iGh4eGhoaHh4eGhoeHhoaGhYODhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiIiFhoWDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/gZWWko+IiIeHhoeIh4iHiIiIhoaHiImJiYmIh4aHh4eJiIaHh4eHhoeFg4OEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWFhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt6ip2npJiMiYuLiImJiYmKi4qIiIiJiYuLioqIh4eIiIiHh4iIh4eGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJKQj5GOioaFhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKCgoKCgH9+fX19fX5+fHt9maekopiPlYuIiIqJiImLiomJiImIioqJi4mGhoaGh4WGiIiIiIaGh4SDg4SHiIiIh4WCgoGDg4KDg4SCgYKDgoGEg4SDgY6TkpCPj4uJhYWGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fX5+fn5+fn1+fXyBnKCdnZyPhoWGh4eHh4iHh4mHh4aIh4aJiYODhIOFhISFhYaIiIaFg4KCg4WHhoeGhoSCgoOEgoODhIKBgoGBgYODhIOEkZKQjo+Oi4eEhoaEgoGBgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCg4F9fH1/gH9+fn59fH1+fHqDnJuclYSDgoODhIaFhYODhYSEhISEhIWEgoKCgoSEgYKDg4WGhYSCgoGCgoODhYSEhIWEhIaEg4SFg4KDgYKDg4SFhIeSkY+Nj4yJhYSFhIWCgYGBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgICAgX9/gYSEg4ODgoKAfX1/gICBf31+fn18fX17enmJm5uXhYCBgYGBgoKBf36BgYGCgYOBgoGCgoKBg4SAf4CAgYKCgICAgYCBgoGDgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn5+fX+ChISCg4KDgn59fn+AgIGAfn19fX1+fXx6enuNmpWFgoB/f39/gIB+fYB/f4CAgX+AgIF/f4CBgX59fX+AgX9/fn+AgH+AgICAf4CCgICCgYGDgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYGDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gIODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enuPk5Gaj35+f35+f35/gH9+f3+Af4CAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B/f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEhIKBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9+fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enp6eYCMjIyLgX9/fn9/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/foB/f35/f4CAfn6Af39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6enp6eX+FgICBgYKAgIB/f4F/gICAgYGCgoB+gH5/fn5+foGAgYB/f39/gICAf39/gYB+f3+Afn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYKBg4ODhYSEhISEg4ODhIKCgoKCgX9+fX19fn6AfX19fX19fX18fHp6eXl5eoGCgoKFg4GCg4GAgoCCgYGDg4ODgYGCgIGAf4CBg4GEgoCAgYCBgYGAgYCCgn+BgIF/gIB/gICAfn9/fnx8iZSQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICAgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFhISFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX18fX18e3l5eXl5fIKDhIWCgYSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgYKCgICBgIF/gIGAf36Ok4yHiIeIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYGBgYB/gH9/gICBgH+AgYB/fn19fX5+f36Ag4SHh4SGhoaFhoaHh4aHh4iHh4eGf32AgICCgX59fX19fX19fX19fX18fH5+fnx7eXh4eXl5gIKDf4OMhIOEhISXl4ODhIF9foGBgoGCgYKBhIaIjIWDgoKBhIKEg4KDhYSEhYODhIOCg4OCgoKCg4OCgpGQi4iIh4mHhoaEhoWEhISDgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgICAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eHh4eIhoeHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eXl8gYF+iJWDg4OEhJSTgICBf39/fn6Ei4B/gYCEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOEhISIko+MiYiIiYeHh4WGhYSEhIKBgoKDg4ODg4OCgYGBgYB/gICAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx5enp7fH6Bg4GCgYOCgH59f397iJF8fI6Wf31/f4KGioWDg4SDgoONiX99f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4SDgYGCgoKDhIODg4GBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenl6e3x5eX19f4B/gX99e3t/fn2ClZF/hIh9fH5/goR8fIGChIN/f4eDfYOBgIKCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhIWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX19fHx8fHx8fHx8fHx8fHx9fHx8f36Kgnt6e3p4ent7fH18fn5/f35+fn59fICBgH2Gj4F+fYJ+f36Agnx8gH+CgIGAfn17ioJ9gH9+gYCAgYKAgoCAgIGAf4uUj4yMjo6NiIiHhYWFhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhYaHhYSAhpSIgIKBgYGBgH9/f3+Afn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx9fHl6e3t4eHl7e3p8goCBf4CBfX9/gH99gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfXx9e319fXx9fHx9gH+AgH6Afn6ClJKNjI2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gIGAgIB/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH19fHt9fHx8e3x8fHp6eXt8e32Fg4OAgYF+gH9/gH+FgoF+gH9+foCFhoKAfn6Dhn99fH5/gIGAf39+fX19fX57fH1/f3+AfX9+f4yRjo2Njo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgICBgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KEhoaFf3+FgX5/gIB/gH5+f35/gIB/gIB/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aFg4CAgH1+fX5/foyEgYd+fXx8f36Cgn99fX19gXx7fXx+gYSDgYB+fn5+fXx+f4B9foB+f36Eko2OjI+NjIqGhIWEhIODg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4F6fn58fn6Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fXt8fHx7e3p9foCAg4OCf35/fHx8fXx9gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOBf4B+f4KCgn9/goJ/gIuQjY2MjYuKiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfX59fX17e319fHp8fH2BgoGAgIB9fX18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIKAgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e317f4GAf35/foB/f35/f35/gH9/f39/f39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn5/fn5/fnx8fXx8fXx+fnt8e3x8fHx9fH18fnx9fHt7e3x6e3x7fH16fX5+f4CAg4eJiYmKiYqJhYiSj42JioeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4ODfX19fX18fX19fX1+fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6ChYiHiIqLi4uJjJGQjoqJhoWEgoKCgoODg4OBgYGBgYGBgYGBgYKCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX5+fX59fHx8fn18fXx9fX1+fX1+fnx7e3t8fH18e3t7e3l6eXl5e35/g4OEh4mKiImOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGBf4GBgX9/gH+AgX+AgIGCgYGFg4SCgYGCgYKBgICBg4KAf4F/fX6Afnx/f4mCf36DkYSEg4F/fn18jYd9fX59fXx+fnx9fXx9fX5+fX5/fH19e3x9fnx8e3x9enp5eXl5ent+foCBg4eEiI+Oi4qHhYSEhIKBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoWFhIKBgYKBgoF/gIKEgX9+gYB9foF+fX5/gIB9foCEgH5+f31+fX2KhX1+f31+foB+fH18fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjouMiIWFhYSEgoKCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgIGDgX+AgYSBfn6Af31+gH59fn6AgH+Bf3+Af39/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8e3x9e3t7fHt8fH19fIqKiYmGhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKBgICAg4B+foB/fX+AfX1+foCAf4J/gYCAgICBgH1/f3+AgICAgIB/fnx9fX19fn59gn2AfoKAfX6AgX98fn59fX17fX58fXx8fHt8e3x+ioeHhYaIhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35+f4B9foB9fX1+gH9/gYCBgICAgIGBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCIg4SEhYSEhISDgYKBgYKBgICCgoOBgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX1+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgYODg4OFhIWDg4OEg4OEhIOBgICAf4CBfn19fn9+fn5+gH19f3x9fX6Af4CAgIKAgIGAg4KAf4B+gIF+gIGAgH9+fn5+fn1/fn6FhYGBgX+Ag4F/foGAf35/foB/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgoB+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf4B/f4B9fX1+f31+f39/fn1+fH19foF/f4B/gIB/gICDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x6fHp8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF/f4B/gHx9fX6AfX5/f39+fX98fn5+gX+BgH9+f4B/gIOCg4F/f4GBgYKBgYGBgIGAgICAgIGAgIKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fYB+f4B8f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WFgoSEhYSEg4GDgoGDgX+AgX5+gH6AfX19foB+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGBg4OBgX+Ag4B+goOEgICCgYKChIJ+e3t8fHx9fn1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYWChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CAgICAgIKCgYCAfoCCf3+BgoOBgYOCg4OFg399fX18e3x8eXp7en15e3l4f357fHx+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3d2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gIB/f39/f3x/gH+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4B/gIB/gYKBgH9+f4F+f4CCgoCBhIKEhIaEgH5+fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH59fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX6AgIB/f39/fIB/f4GAgYCAf3yAf35/fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7f4V9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB8gH6AgH+BgIB/fYB+fn9/f359fX6AgYGAfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgoCAgIB9fn5/gH18fnx/gIGAgICAgHx/f4B+f4GAf399gX9+f39+fX18f4CAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36BhIKCg4WFgoJ+fX17e3x8eXd7eXd4d3d4e3t7e3yFiX17end6fH19fHx9fX1/fnx9fn59fX18fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgoGBgoCCgICAgH5/fn9/fXx+foCBgoGAgIGBfX6Af35/gX+Af3+BgH9/f319fH1/gICAgH9/f35+fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKBgYGCgYKAgYGAf4B/f399fX9+gICBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9+gIB/f39/gH+AgICAgH+BgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHqBgXh5fHx8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt9fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoGAgYGCgYKBgYCBgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiXx8fnt7fnl6e3p7j393d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eHN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgYCCgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHenh4eXx8fH17fHx9fX18fX19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCf4B/gIB/gH+AgIB/fn2Af35/f4CAgH+AgH+AgYGAgICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x9eHh1eHh5e3x8fXt8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgoKDgICCgYSDg4SBgYOBgoKCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GAgYKAf4CBgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/gIB/gId+fnx7fXx7fX94d3Z5eXp7fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KChISAgIOAhoODhIGChICEg4KCgICCgoSBgYKBhIJ/gIB/gYOCgYCBgYCAf4GBgYGBg4B/gIOCf35/goGAgH9+gYCBf4CAgYCBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH9/hH19fXx/fXt9f3t6dnp4eXt7fH19e3x9fX19fn+AgYCAgH+AgICDg4B8f35+fn15eXt6enp5c3J0b3dxd3lzd3uFgoKCgoOEgoOEg4CBg4OGg4ODgoKEgYSDgYOAgIKBg4GCgoGCgX6AgICCgYKBgYKCgIGAgICCgoGEgH6Bg4F/f4CDgoCBf4CCg4KAgYKBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhxeXR2eHR2e4SCg4KDg4SChIODgYKChIWEgoODg4SBhIOAg4CBg4KCgoKCgYKAf4GAgIKBgoGCgoKBgIGBgYKCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgIKEgoOCgoGCgoOBg4SDhIOEhISFg4SCgYOCgYOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBf4CAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISBgoOFhYWDg4KDhIKEhYKCgYKDg4GCgYKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOCgICChIODgoGCgoGDgoKDg4ODg4SAgoSDhIOBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoCBgHt9gX58eXx6enp9fHyBfXp8fH19fHp7fn5+gH9/gYGAgICAgIKBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhIGChIaEhIOCg4SEgYOFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoCCgoODgoKBgICBg4KAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCf4OBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6fH2AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fn5/fn18fHh2f3Z3f4SHg4KDhoODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgYKCg4OCg4KCgYGDgn+Cg4SDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn1+fX5+fn5+f3+AfH2AgYKCg4OFg4SDhoSBgoiGhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGCg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYODgoODg4GEg4GDg4SEg4SEhYSEhIWFhYWEg4ODf36BhIB9fXx8fHx/gX5/fn9/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODg4WDhIOFf36CiouFhYSDgoSFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhIODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoSFi4mEhISEhYWCh4aGhISEhIWEhYSEg4SEgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOFgH2BdYF6hH9/f36FhIKDg4KBg4SDhISFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf31+f35+gYOBfXt/fX6Afn18fHx9fX19fH19foB/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg3+Dg32BfX5/fn+Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFhIaIhoaFgoaGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1we4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd216c26Ah3ltfXJzdnN2bW53bHB5bHV9f358foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgYCBgICAgYCAgIKDgoKEhYeGhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb2x3fXiGcHF6cHJ1ZoF1fm57eXNveX+Af31+gYB/e39+fIB+gIB+foCAgYB+fn9+foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhYWFhoaIhISGh4iIhoeEhoaLiYWEhoeHhYSFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+g3SIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f396fn18f31/f359gIGDg4CCg4GBhIKBf4GCgH1/f4F+f359foGAfn6BgoCAgoSHhoODhoSEhIWHhoWFhYWHhoiFhYaFh4eFhoSGhomIhYSJi4iFhIaFhoWDhYWEhoaGhoaFg3iLeXKIentwcIWFeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cHl9fW19dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXt9e3x9fH9/fX1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhYWFhomKh4WFhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYSDhIOFg4WEhYSGg4WGhYWEhIWHhoSEhYaFhX13hYOEhIOCgX5/fnt8e358fHx9f399fX9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeJhoSGhYeFhYWDhIWGhYSGhoeGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhYWHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhISEhIaEhoWEhYWDhoaFhYWEhoeGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1+fnx8fn2Afn1/gH5+gH99fXyAfX1/fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFhoaFg4OFhoaEhIOEhIOEhoSGhYWFhYOGhoWGhYSGh4WEhIWFg4SHhoOCg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYF/fHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iJiIWGiIWGh4aHhoeGh4WIiIeHhYaGh4WGhoWChISFhoWFhISEg4SFhYaGhoWGhIaFhoaFhYaHhYSDhISDhIeDhIGChIWDgYCAgHt7fn58fHx+fXx8fH1+fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoWGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhIaGhoeGh4WHhoiIh4eFh4eHhoaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDhIKCgn+Ae31+fnx8fH59fH19fH17fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGh4aGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHh4iGhoiEg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fnt7e3p7fHx8e3t7fnt8fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWFhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4iIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoSDhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBgoKBg4WCg36BgoF/hIJ/fn5/fn58fH1/fXt9fXx+enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x8iYeEhoSGhIaGhYSFhYWEhIOEgoCDgYaCgYJ/eoSMe4CEhYeGhoaEhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIiIeHhoeIhoSGhoaHhYWIg4SFhIaGhoeFhYSDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCEg4KCfYGBf36DgX5/f4B8f3x9fX59e359fH15enp5e319enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYKAgH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4WHiIiGhYiHiIeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIWGhoWFhoKDg4WAgIGAgIOAg4B8gYB+foKAfYB/gX2AfH1+fX57fn18e3l6enl6fX15ent7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4SFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWGh4aIiIaFiIeJh4aFhYWDhoSFh4ODhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhIWFgoKDhH9+gICAgYCDgHyAf31+gn5+gH6Af399fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXx/fn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhYaGh4eHhYWIhomHhYSEhIKFg4SGgoOGhISGhIeGhoWFhYOEhYSFhoWGhISFhIWDhYSAgIKDf35/f39/gIN/fIB+fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6ent7fHp7e3t8fX59fYB9fXx8fYB/fXyGg4aGhYaGg4SDhYKFgYGAf3+AgH5/gYF8fn9/foCAgoKChISDgoGChIGAg4KBgIOFhIKBf4CCg4KEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhYaEhoaGhoaFg4SEg4SFhYWDhIODhIKEhIB/goJ/fX5+fn5/hH57f3x8gIF9gYB9foN8fn59fX57fnt7enl6enl6ent5enp6e3t8enx8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gnx9f35+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYKGhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWEg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgX6Cf35/gnx/fn19fHx8e3t6enp6eXt5enp5enp6e3x5e317e35/f4GAfX99fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Afn5+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGAgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx8fn18foN9e358fYB/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzMzMvLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs+QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTU09TU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT48Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPTM2Njo7PDhDPEJBPjtBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbLy8vLy8rKysvLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDs5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5HqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWy8vQ0dDQ0NDQ0dHR0dHR0c3Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19jZ2NjY2NjY2NjZ2dnZ29zc3Nzc3Nzd3Nvb29vb2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0A8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1NRqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1svMlYWGhoaGhoeHh4eHh4Ky4t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLepp6enp6enp6enp6enqZeAgoKCgoKCgoGBgYGBg4uKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXJsaU5TYkxMVk08Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLUEae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fLzG5QU1NTU1NUVFRUVFRMoPPr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6Ogh4SEhISEhISEhISEhIhnQERERERERENDQ0REQ0ZTU1NTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h3bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9QkA5PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXy8xxVVhXV1dYWFhYWFhYUaHx6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSlooqGh4eHh4eHh4eHh4eKakZJSUlJSUlJSEhISEdKV1dXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8Oz46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX18zNeF5hYGBgYGFhYWFhYVqk7ufn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqaeQjo6Ojo6NjY2NjY2NkHNRVFRUVFRUVFRUVFVUVmBiYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTo6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjMzMfFxcXFxcXFxcXFxcXFytDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs/Ozs/NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS0NDQ0NDPz8/Pz8/Pz8/NysrKysrKysvLysvLy8vNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojs4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzc3Pz8/Pz8/Pz8/Pz9PPz87MzczP09LSzs3P0s7Ozs7Ozs7O0dTPz87S0s/OztPTz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1tfX19fX19fX19fX2NjX2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O07udz8/Sp57Qz9GlotDOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0rWVm7PWs56jptawoKKq0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz9GfoKqu0J2ak53AnpiWnMfPzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj48PDk2P0I/Qjo2NDg6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RxYeatMCYoZy0mJyinq+x0s/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0I6NzQ6Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9anmbW2mZatuYaelrCzqdTQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD08OTY0Ojk4Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyqCjv8qcpYynrdiqmarUz8/Pz8/VpZm2rZiBoJZ4m4Sek6PV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjk8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1qWZtq6bqIiceZ+phZml1dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENHREFBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0NWlmra3ta+mnIq9raaYr9bR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GSbF1cb2doYl1PRj9ISEZFQDw8Pj48PT08NzU2OTk2Ojs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09DWppq0xqOXl52lp5aYmrrV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocfS16Wbsdifq6Sb0J+rpJvQ0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0tAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT0dS1gsPVxZCNt9fCj4271NHS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVpaltMX01KTEpVTEZCPDw/RkVHS0k9NjY3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj47PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0cPU0dTHw9XR1cXE1dHS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FETExBPTc3NTo4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLU0tLS1NXT09PU1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPT03ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRklEPEFBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDg4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT48SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDREVDQUxINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFFBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb2tra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvN3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODY1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vb6/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs7Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3t7e3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLe3t7i5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e4t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKeoqKeoqKmqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3tre3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87O0BDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WkpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSlp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSko6Kio6Khn5+fnp6cnJycnZ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0A/QkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2epKShn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzU3ODs9ODo6OTk7PTs7ODk+Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6emoJ2cm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTkpSUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqamp6enpp+bmpuioJqWl5Wam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampqSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4OTo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8+QUE+QUE/Ojk9PjpQnaCfnJucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36amn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaOipaampaanpqagm5mboaCXkpOSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cn6Gfl5GRkJSXm52YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgoJ+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpKanpqWlpqalpaOgoKGhoJmSkI+Wm5menJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKCfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqOio6SkpqalpKSjoqGhnpyblZOVmZyam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn5+goKGioqOkpKSkoqGhnpuamZamuZ+ZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgo6ahoqGioaCenJubm5mjppGcm5yZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoKaxrqCgn5+enJmZmpqdrWF5nZ2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcm5qbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6CgoJ+mkpWtn6CgnpuamZqZq3tDgZ+enpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uamJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2en6FhlqienpyampubpJ9NSYSgnZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udm5mnbFqgoJuampudnK9uS0yGoZydnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFE8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmYpYRUdKKamZqdm6GhYFhOh6GcnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaChn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkXFxRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycm5iYmaCLXWCRmpmbnZyjjmVaTICinp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtbTEY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJmemV5fc5WanJ2doYBlWk1/op6fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmJthYmB8lJ6cnpZzY1VPgaGen5+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZigalxaYXubnJ6JaV5QVIiem56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7QkBBQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqWknhza1h8lZieiltUUFmLko6SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGRjpWfn5KApKeZppp5VU9kh4eCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDgIWkmYt6Yo6jkphzhYVodX+AgpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY5Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn6Eood2alBxm42KV255e39+fIWOjYuGjZSRi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqFgIJ9mZhyTkdJc5KDgEpcbm92iYWKjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gH56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRi3+IjYyLi4eRj6OITDMyO3mEdXI/PVZqbYGQiYmQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZCeoZ2Tl5uhmp2boqebX0VkTj15d2dkSDU2VG5xj4+LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqamujEuCtoZAe3toY1JfcVFbb4qhoaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKmqaeoonRoxdKoSYCVjH1PbIp7WmCAo6inoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSnp5mdpKWjop5igri/qoWvo5qdd0dXgXJSc5SioqChn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZWRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKhoqehpq6mppyeb4KUs4i21qacuLFiULSjVmSQoZ6goJ6doKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaiqrbGyr6ujo4l3f3V407upk56obFWhqmhfh6egpaKhnZ+imJWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVVxoZG9jbWlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Gem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqp6+3t7W0trKssK2QiH9smMfEl5yqknZaaXN1dX+SpamnpKCfo5udoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCqsre7vLy6usK5tLOdhHReUZ2wr6SikYR3bnNxd3h5fIKJjpSZoKWnrKalmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh2a3BoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tbjDydDU0czHvK+hjG1jUkODjX5+gHl1b21kZGlnanFycXFxcnmJqcfHvKKnqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWlgZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8TH2+Tj18e5raKUhG9XWFBEYXJna3JraGNlWFdcV1tgaGlnZGBskrrAv7mpr7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdubVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGvsvP1Mu5pZiPgm5aUFRKQ1xmXWFoZGFhaVxUWFVXWFlbWF99obi5q7SyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4R/amZoYWtsZ251cnJ1cmdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL7DwcfLybqXdF9STk9SRz1ebGBfZWNhXmRjVFVXVlRVXX+nrq+qqKutrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dWtsbmRvbWlxeG95amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7m3xKNqTENFSkQ9WWFhZGxkYVxlX1lTUFBVYYu3uayupaSjp6SgoKWZqbSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+dlJOJiX6GiIyWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3dua2lodlpncnhzemdnXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMTEwsTBs5BWSE1GO0lYX2htaF9cX1laVFBdjaqsuLWyrKmjoa2prKetn6y0tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXZ1ZWZqamhea29ueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx8LIo3dgSD8/QV5dXGtkW1hWUl2IqLq+ury6vKytpqm7urm3v7O1uLLBxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhaHZoamp0bnlsXmRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc3GxsfCtYFdVC9VWV1sX1FNV4S5ysfCxMbAvL60sLCwwr6+wcbAvre2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46LlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cn14cGdga2p3bWlmdm90Y11jVVdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXBwsLFxpxOUoCJlVVUg7XO0sW2v7/Av7q7vbWzs8C/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enmAc3BmZWdkbGVia25vb19ZXVdWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK+vMWnfHSAkZR1vM7Hx9DAr729uLm7u763tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWViYWNkZGpjZ2NbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zJz8C6v8C8u8W9usDEv72+sXNhgJGJis/Ev8DJvrDBv7q3u765tbi0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFiY2dqZ2dqZmpeVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1Iy4v7vDtbrHtrW4ury4ubaztp6NdITJv7+7wb65xr3Cv7zFuLa3tLi2tru7uLa0t7q1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWZwamVsaFlZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+8z8N2qMy9x7e5t622tLe5s7Wxu8bHlkJ8yr6/vr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25xZ3FrdGZjbmBcVUhLS0RKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNetc4C7yM/CwLiutLS7vbe5sL3DyIxGds3Dwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcmZsam51b3hjaGNcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCxsnRmHBzrNHRzMrEtbq/xMi+vrS/wL93U2/LxsK+wby/w8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRwbWx0bGxuX2NfYmJOSE4/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDCur68xL63vMC/yc/HyMrJwYZxc6XMzMvNysbCw8vOwby4vbqwb2Rju8jEwMC/xMDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh7bW14fGBxY1tfYF9UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7ur2sO+tr7Avr66ppypsrbDv6V4dXibxMbLyMHDwMDJysG/u7mxoH5zbK3IxcS/wMG/y8fDwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7W4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem5zeHRocF5cX11aUkZFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8S3ba3Ovba5wLysfW5obm1ygZWYcnd8l72/xsC5wLy+xcS9vbixsJmPfoKcysLDvL2/v8PDv7/HvLy/tLSutbW8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGxt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdtdXtwb2pcYGFaU1FBRklHS0BFQ0k8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fm52bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNsnWBs722tcKlh2laXmBNUltabnN2gZ+4uMK6s7u3u72/uru7r6Sal4iSfsDEw768v7u7uLbBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytry0saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnZ3bnJhX2ZdW1VKPT8/R0c9R0NDOTo1Ozk5Pjw8OTo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaeEeIqgr7WdamVnVllgSUlNUFNsdoalsLe+ubK1sru5vLa5vrSVnKaXoXKuycTAvb+5s66yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NhXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8WqiHx1jKCYYFRDWFVHYWpWT0VKYI2grK+2urW0sqy8ubi1uMG9ipewoaZzpcvCv7m6ta6lrLOxprCtqJ2gn6WttrXCt7a0paiqqLC2s7K6tbu7u7W4trC2xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnNuY15nWV1eU09OQT9KQ0FLSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmpGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi+tJCCeIiPb05KP2RZQk53gJRqTkBcga+1s7WytK+su7q4trm/xXWBqZ2aZKe/uLWysa2tn6Smp52kpZyWmZmZn6muuayrq5+lqKSrrq+nsKuvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cndzbXVqbF1ca1ReXFBOSERHTUJHTkc4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiEe1hGQU6HWUpKWHeNgWNAU6O5s7SysLGtsLm4tru3uryPobGrpHOrsKmrraujqKCdnp6Xl6CVkpaXj5ifqK6ko6Sgoqaio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J5aHV0b2VVYWRXXVJPTUlASVJETkM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K8qpmZlWhOQFJ4cFBJSUtnnIBZRFKuu7Gss6+urK22trK0ta6opp6am52fpqieoKipn6GnlpqWl46dk46Qlo2Xm6SooKCioqGlpZyjo6CepaCkrKWmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqppKmrpqmsq6ahiHiDfHZ/emN3bW5dUWlVUE9HUE1NQ1BSQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaqlpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcKrpb1oRVKdglFXSUpgSlSNYGNiga61qrK0rqqrr7Cys62lnZGXk4+XoJ+ioJyjpJ+eqJSalZaLlpGNj5eSmJ2iqp+fn6Cjpaicn6ChnKGfo6innKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclpOPj5KRmZCWlZiXn5icmZukmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn58gHV2fW5re2RpVlJkTklIR09TTktOSDxFQD0yQDg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62trq5ure3u66ooKGpoKrGv8ugUEFznXdQbktLY2Z0c19aXnCQsa+us7Wqpqyso5uZlI2RlZeYmJyfoqKcnaSemqSWl5eVj5GRkZKal5ugpKqeoaGepqerop+gp5+dn6OmqJ6jpp+qnaqtqq6nqLClo6Smp6ymoqWimpmer6iusqumq6qgm5iYmJWTlpqTlZaalpuXmJihnpyclpuhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl8gH53eXxleXpgYlNWYUhJS0tTVEpTUU05P0E2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZykx8eOV1NKZaNaZX5vclxRa2NbZF9cao+0sLC4rKahnJ2alJeamZCOkZWRjI6Nk5minJeimJmXl5iUmZiWnZufpaWpoKaknqeurqqmorGjmqOmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Ggo7GusrG0qrKuo5mcnZ6hmJubmpiZm5WWm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaYJsZltTW1pNUUtPT1ZNU01CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6KanqukjHlVaXJ2dXBjdnZYV2NgY2dYV1Znra6sr6efnqKglpCTm6CcmZeSk5+coaOanpuWnpqel5qinaSgnqOepKisraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztbizuK2ytKSgnaWgrKGhoqGgmpmWlp+bm5iloaCeo6Ggn5ucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh2anh1Xm1bUmFJUlZIRlZXSkNNSD1LSThGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamorqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6KhoKOAboJwYGNYTFtTWk1MUFhSR0xMR5isqqmloJ+akpGUmJiWlpaMiIuOlJ2cnZyelp2Zpp+gp6WwqaatoqqttrC1srCttri9v7qttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q66xube8r7OwtcG8t76zs7WirKKpqbKpq6inqJqZnpqqp6CZp6Cfn6iopaSenaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWFfnZybWl3bWhuXFhcQ1dOSkdNSENGTj0+TD40PDo2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqZSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco5+dimFXXmVgV01RRz4+P0NDPz5CUXipramqpqCen6KjnZ6emp2blJOVlJ6emJSFnp2gmaujq7GvubGxsLGwur28vLm2uMO+v8K/trq7wMO5vbusrqexrbHCtrjCxsDIysDJv7C5ub24wr64tLvGxL3DvLi0qrOtqrO0r7Ouqq6jnqyotrKto7CmoaOwsa6wpKWvo6GgmqGmoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXx0cmtsdXJxaFdcUUZVSEVKUEk/RUI0Rkg5Njw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+flXxfXmVgUUdEPEM+RTw/OTZOfqqzp6SjoqCepaymnpeclJGanpmVjIqGiIZ4bIqloqKrq7K8tsO9vrK7wcPCxb+/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3GzMzM0se+v8DDvsfGwrjEysnEwce/urS6u7W7t7C2squ7sq+8t7+7uqu4rauquLu1vK6uuKOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlZSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtkaW94a2VaXEZMTUVEVE1FQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QD9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1zamFXTkU+SVl8b2JCPVyOrqygmZucnp6Zl5eYko2Pl5eUj42QjIKDgnZycG1wh6WsrbS4xLrNx8u+wszNzczHyNDMzMzHysXFzNDS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysHGx8bKyM/AydHNx8bIxsK8w8G/v7+1vrOtv8DDw8fFx8Svv7myuL3EwsK6vLy1rqenrqigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dXNlYmdyb2deWlpET01DRVBJRENBNTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+OTtBQTs7Pjc4Njo7PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56bnZZrZl1USURAP0uGnqWahKCyraOenJ+amJeUk5SXkZCPjIeEhIiGg4CBgYB5cXJva3iitru5vMrB09LSyM3O0dPR0dDQ0dHNzc7QxM3U1djR183Gx8nMw8XKz8rS19LX0tXW09TIzMfMzcnTzc7TzcbJysrCxszHycnGv8Ozs8jFy8vLz8fKv76/vcHHxczMycnAw8CusLOonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5aQjIaRi4B7cnV2Z2NndmplVlhSRE5HQElRQz5CPToyMkE8RTw3ODxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGcY1RMSkRDP0NSrtG9sq+mnJycoKShnZqUlJWUin14cWtlYmhycHJ7hYqAdXBtcXJvhJytvMfR0dfW1dHWzdTW1tPT0dLU1NLP0cPQ09bY1dXSy8nO0MvGzdLK0tXX2dbY09bYzdLKz9HMz9HN09DAycjLxMzNzM/PxsfItsDLwNLNzNDHysjAxMPIz83Q0c/NysjNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNhZXJjXVJcSktHQUZJSj87QTg+NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGlpaCioltJQEFEQUZRdrKvppqUl5+cmqCgnpucmpWJd2ljYV9fX19eX19dYWx1c3Bwbmxwb3WAd5i41dfW19bT18/V1NnU1M7P1dTU0dHM0M3T19bT1dDP0tPRydPRyNDX19jS2NLX2dXWzM/Pyc3SzM7RwMfEycfPztLR0sjMzcDLzcbUz8zOycXLx8fJzMvU1NHVz9LM08K5xbGlqLWuqJuoq6Wdsqiws6ysk4+TjoiKjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZRYEpKQ0VDU01APD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48P0A9RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fX1NXZ2dHO0L+8zMm2vq6nqqiho6xmQzg9PkRYgqqon5eVl5manJ+dmJuck31xZWNiX19hX15hYF5hYF9gZW1wcG1rbnB0eXZpfKnN1NjY2NHF09LXz9POy9LN1dTRys/M09bS0dbNz9XV0cXR08rQ1NXWztPR2NjY18vIzsTJz83KzMDJwcnKzs7QzNDOzszPz8jM0NHLzsvDycfKzcvM0tPO09LR0NDKvci5sK67ubWrtrCtqLits7+7sZqOoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcG9rYWRucGFYXFtJRkZETVlFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pzk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSye0hGQjtXjaGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGBgXl9fXlxibXFubnJydHV6cWJtnsfV1NCkys/O08rNzsTNytLSzsbOzM3Uy87SzcrW1tDM0dTLzNDR08rO0dXS1dbKwMrBxs3DyMrDzcTGycvLz8vOzdDO1MzGydDNycfLxsfCxsrMztHRx9DPzs7M0MXHwbi5vcPCvcO5srK+sLvDxLWqmKWhmJaRlZWSi5SNmpGUlI+PlYKJhnlxcmttaGBgcWhZWGhWTUdMSVFRQjtEPzs2ODo4Ojs1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4ytXW2drb2MzMz8jW1cTCta+0qKCtl3hsb3B3j5qNjJeVkJORkZWWlZCLfGViYmJgXV5hY2JgX19gYWFgX11bXWdxcXBxcm9rcXl0ZW6fz82bl9bJw8jIxca+wsXOzsfFxs3K0cjLzc3F0NLPzczUysfKzs/Hx8/Sy9DPxbrEv8bKvcPHyc7Fw8jAx87IxM3KzNDIxcXQycbCxsnFv8HIzczMz8PKzMnHzNDFxci7x8PJycLPwb28v7DByce5vaqxsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Vka2BeZnFhW1dgR0lIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62ktn5ngoWiqpONjZaPhYODg4F9hIR+c19bXl1eYF5gY2RjX11cXl9gYF9bWlxha3Jwbm5pam1uemdVgMCiebvPw7i/wrq6uri9yMXBw8DDx8rIyMnHwMXLxsjKzcnEwcrJwcHLz8TLyL+5wbzGyL7Axs/LxMDDu8rHyLvJxsXKwb7Cy8bFxL7Gvr3BxMbMxsa8v8rDxcfSxcHJwMrKxsjG0MPDxsOuxMvHw8q3v7y6s6mspKWYn5iso6Gmm6Ogm5V8d3N1ZmpbYW5tWlxYUkRMR0JHRExERlJANTQzMzVAPTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ovri8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76ysLZsXnl8n5GKkpaGeoCEhX91eHVycF9aW11gYGJjZGRlZGBbXF5dXl5gW1laXGJucW5qaGlubXN5VmqUe6vDxcCutbiwsbKwsMG7u7u5uMDBwcS+vbm9v7nEycXGwr3GwLe7w8i/wcm7tru7xcO/vMLOw8a+vrXBvsS7vce8w7q1vcbEwsO3wLa2v7+8zcS9trrIu7++zMTCxsPGycfJxtDGwszIssfJw87MwMXDv7yyt7Cyp6ioubClrbCqrayUend4a2VoYGhvZFZeWUpGSkZIS0FFQkZKQTk6NjU4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWrt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTV183Kz8XJxcfBusW9rK6mYGN2gZKLiIuEeH+Ghn99g3t0dGNcXF1eYGBiY2JiZGViXVxbXF5cXl1aW1xdZ3JwbGZlbG1ve3heZpLHub+3rK+upaisqqW3s7WzsrO0u7W9sbewta6yu8K7wcS8v7q0srq+wLjIuLS8tsDCvbi9x8HDu7Wvs7W7v7TFuLu1rLm9vsC9sbu2sLe6s8a9t6+8v7W3tcW9vsPGwMTGxsfLxb/GxrvHy7/PycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkdCREFFRj89OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MvNyMnIysnKxNDN0s/NxcfBxcG/urjJt6uwmVtnb4iOhoiJenh+hYZ2d4F8c2hdXV1dX2BfYGRhXmNlY19eXFteXF1eWltbXF9rb21nZWhrbG9+bWi6uLazrqirpZygp6WcqaqxrKmrqbOttbCyqK2mrLO7urbDubq5sKq0ubuzwrmvwLG9vLu1u8e5w7etqqiwssC2uL2wsaiys7W7vKuutqeutq68srGquLCuu667uLvAwb66w7/Gw8XAvMbBx8q4xcfFv8fDw7nExsK7xsnMy7O5wr27s4l0dndraWBibGlZV1dbQUxMTUpFQUM/RkE6Ojo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxM/HzcHCxr/ExMPDysLJyr/AvMK6s7W1w66qsJJbaX6SiI6Pe3h9iYV5e4SAd25eXVxcXV9gX19kY2JkY2JgX11aW1paXVpaWlpcZG1uZmVmZ2lrcHqJt6+0rKOipKSYnqKemJqjqayjp6GrqayrsKOmn6qttLaxvbivt6+orbi0s7y3s72wuLm1srzBssCvpamjq7Gzs6i9qquoq6yutbSmqa6hpa+ps6aoqK6mqLessbO3urq7sry+v77Ev7XBwMfIt7+/xbfFw8C7v8TCvsTIzMq/v8TAwKmHc3RzamlcYW9kV1ZYUEhaU1NLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPHubnLwsu+u8m2vcO+usq3wcTBtLa8trGvtbytqauSY22Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX11dXFpYWVtbWFdZXF9ma2VjZWRmaGxxgqWkqqKamZ6hkZqimJWPn6CnoqKfpaWnpa2fnJukpqyysLa3p7CsqKq0q7O5sLa2rra6s7C6urG2pKCkoKaxqKypuaqlp6eop7OtoKenn5ykpqyfn6ekoaGxra2ssrWzs7C1vLa7wcCyu77DwbG5ucKzwL3Atbi8vb68wsfEw8S/wMSghHlxbGJmYGtvYFVZX0hOaE9USEZLRjw9QD06Ozs4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBur22oJ6VnaCmurars7O7s8TPycvCxbi3x8DMv7jKt7vFuLPFuLO/wKy2vLKspq+0raGjkmlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYF5cW1xcWFlYWFhWWFtdXmRiYWRlZWRoamyGnKelopaXnZOYn5WTiZufoKWbnp+jpaKnnZqim5+qr62xtaSoqqmsrKS0uKy3sKyzta+zta+wqp+en6SisqWmqritoqamoKitq5mfoJ6ZnZ+lmpmjnJyesKmsqKqrrK2wsrmvuLm6sLa8u7qrs7K5s720t7KxtrW/tb3AvcPCu7u9l4R7c2xfZV5kZFhUV15JV11LUEdKSkdBPD8/QTs/PDA1NjM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru4wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765x7i4v7eywrSxu7usubqxop+pq6eYnpBtfoWGf3hybW9ta2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1dYV1pdYWNjZGRlZmdpcYmQgpOrl5aTl52Sk42Zn5+mnZucpKahpJufoZuYrq2trrKgpKKtq6ehtbCxsqypsLOourOntqGin5yjoa2joqq2q6Kjpp2mpqOWmZ2XmZqdn5qXnZydnK2hrKijpKatq7OzqrWwsquyubSvqq+ysrO3s66pra6yuLC6trq9v7ezsZSGenVmX2ZfW1lWU1pVS1tRTEpFSEtJQz0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7KdpaOYpbHDtba9rbS4wczIxr/FtsHAx862wMO9s7m5sr+2sbm7rbK1r5+ao6qhlJqPeH+DhH94b3F0cWhlZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldWVlhXWFdVV2FjZGJiY2NjZmlzc0dNfZCQkpOak5aRlJ2bn5uWoKCoo56eqJybmqunrrCqnKOjt6mhoK6otaqnp66xpLiwpLego5yZmaqmoZqtubCjoaSco6Cgk5WhlJaWnJmYlpeclZ+pnqqkop2jqqqxrai0rKqnrbOwpauus7GvsK+vp6iosq6ytLC8tLq4rqOUgnp2ZV9hV1lYU1JUS01eTFBMR0hMS0U9QD49Qjw6NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS6wrG+t72tnaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa68u7W7vLW5ubCvsKqcmqGplZGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXVlVaYmJhYWJgYWNka3JlZ26Ijo+PlpSYkpKYnZqdlZ+epqWjpqefnZ+moKqvpp+ho7anoaGiqbOipailsKaxrqu1n6GdlpWpoaKUrbGxn6KjnZ6YnJOMoJSRk5iYkpeYmJeep5unoaKapKWlq6SlsKelo6usraaorq+vq6iqqrOmpquvtLGuvLaxr6+fknt4c2ViXFtdWE5MUUhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtr2wu7G3rJ6lpqy4u7zBxbqyubXEycnAwsbFx7bFxLPBv8Wrt7e9tr26u7WyrK2omZmfo4uKdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZWUlRSVF9fXl9gXV9fYWNpgY+FhYuJj42Ol5CRk6GXnpWbnqShrKWkpKOjopyqq6SanqWxqqGhnqWqnqiin62sqqmuraKiopWYopqckKupsJufop+fl5mTip2RjZKUlpCYmJOcoaOcpKCilaCipKWbo6uloqSqpKutpa6yqaalpqa0pqqorbO1tLm6r6qsnoxzcXBgW1dWVlJHUU9IWlxPUkpUS1NMRUdJQzg7Oz08OTY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsa2dqKevubmzwMi6tcCvxcjMusHJzMi1ybyxvsPJrbG4wbW8wLy0taqsppaanJyJgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTTlBZXVtcXV1dXl5hY2yIin6LgYqLiZSPkI+ZmaGamp+nqKqoq6eppqOZpa+klZmlr6mgnJmboJ+umZyqs5+mpp+jo6GUlJuWlpKpqa2bnJ+hoZuUkIyYjYyRjZKNlpWQnaGgo52co5WboaOhmKKoo6Koq6CrsKSuuKWjpKOsraqoq6+0t7K9tbOrrpiFdXRpW1hZU1VSRlhMUVtYTVVPUExRUklPSUI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraezt66oqK+um6morLe2rLzKu7a/rMzGxbjAzs/Hs8S7t7vCyLGtuL+3vL67s7amqaCWmJmXiHp0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05PUVlZWVlcXFxdXl9keoZ8hHmGi4WNiZONlJefnpmeqqimrqypsKSomp+soJWVpKinnZiQj5qerpaYp6qYn52UpaCekpGSkZOVqKqlmpiZnp6XjoyLk4aJjYOPi5KVkaCeoaSZlp+VmqGinpSbpaWnqaigsLCmsb2nn6OstKuup6+0sLm1wLGusKuRfnJ0Y1ZUVU5RSkdWUFJSTExYTktNT1JHTktBQ0ZEQz5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/tKymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrG3uLy9wMOxsLG3rrS0u7O0o6OdnZiXlYSAdmtnbG5xbnFqb2tkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVFFNTk1SV1hZWFlYW1tcYGl6dHlvgoeCi4WTh5GRlZiXnKean6qmpqudp5mgpZuSj5+jmpeXhoWSm6SPlaKclpaVh6Kam5OMjoqQmqWnnJWVl5yRk4iUjouBjI2AkIuSkpKhmqCilpSZmJWippqNmaSnqaehoLSyqLO4oZ2jt6yqrqSysqa1u7WrrLGiinpzbl5OUVFNT0ROTk5QS0ZOTkpKTk5RSU1KQUhMSUhDPjk1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLawpKekqqWgqaaks6qissO1tbKzxsW3usPKzMazrbq9tLjAr66psJ6mrruvraCam56VlYh8hG5fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTk1LTFNXV1ZXWFhXWl1hbGxwan6CfYN8jYGLh5KOkZygjpmco6GjmKSXoZyVjYeZmoxzjYN+jpeWhpKakJSOjXuZj52MgomAipigo56Qk5iWhY6ClH5+dIqOepCIk5CQnZuampKWkJ2Oo6OOiZqgoaSkm6K0r6ywrZ+YprimpbChsa6csbyqqa+pmYR4dGRWTVJQUE1DU05MUE1CUFFISU5TTUhKSkRLTUZLSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI0ODUvMDEwMikoLC0wMjc2NDc4OTo6NjY6ODdBN3i3oaO0qKalqKOlpaamprKnprTBuK+0sMnEuLnAzsa+s6y6waytxK2ooqaSnaa3raOgkZaXkpB+eH9mV1ZfZ2ZpZ2huY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkdOU1NTVFVUVlhaXWlma2d5f3dwTFZvjYCUhIualomSkJ6YnZWUlpSPloqAlIlfO1ZvfIyUioCMkoyPhoZyi4SWgXmBe4aUnZWDlo6Qj4OGfZN4cXCGjX2JgZCOkJeamZOLkIqdiJ+Yh4iWnpqhoJenrqmtqamelq2zoqatma2rmKi0o6mtopN/dG5gW05TUldMRFRKUE1MRk5PSUVMUU1LT0pJTVBGSUo9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CiraGmpqqgpqmno6qwqKe0wbmwtbDHwrizvc+/ua+utcKnqsSqop2Yg5ScsaOamYeUkIuHfnN2XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNTlFNS0hGSE5RUU1PUlRVWFlgamhidXxvTUA+fpWQjnuGk4uDiYyajZaUiZKHhZWGeYl/YEpRbniLkoR+hIyLhH9/bX5/k3d1dniEjZpwUY2IioZ8fnmUdmd3hoh+ioiVi46Rk5eMhIqIlIWbjYKFkpuWnp2UpKKoqaWknpuwqqGkpJGmqpaiqpyhpqeKd25mXlxIUVFTTUlVTVNJTEtPSUhGSk5MTVRLUVFPRkpEPTc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjExNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aboqadn6Guoaeopaeor6yqtry2uLezwbu2p7nIuLaoqLW2qrK8p56Vjn+JlKmWlYt/joOCfnhxb1hNS01NTkxNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERENJTk9oWU5RU1RVWm6BbnB4ZWVZUo6Ik4ZyfYV/e4SLk4GSmYuPe4aPgHV/eHNvdXB0jo6Ben6Kq4V6e2h2e45wcm14gYuNknh7gHuAd3NyknhodYWEhIV8lYqIio2LgH+Ei42AlIR8gY+YlJyWkZ+dqZ6goZ2gqaWfnZiNp6OToJ+Wnp+kgXNpYl1dSldQUkhLWFJPSk1MUkpKSkxQSExRTVJUTUZJQj03ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwuLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqqWtq7Cxqr20sru4trq0sZ+3urKqnZ2sqaiyr6KakY2UgY6cjpF+d4Z3fHdwb2pZS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MTlFRU1ZedYF5dGJzipSXjY16ZXh/dXd+iJB8g5iSgHGGj3t2e29rfq18dJCLf3qGkoB8f3RmdXyGbG9oc3yKjYeAbXlxfXFtdo9xaHGBfo5wRIuFgoOFf3d3eoyGfYx7dX2Oko+Yi5Kam6OWmZ2bnZ6hnJaNi6Wajp2XjpaYkHhvbmdjW1hYVVFKU1VUT1BOUFZLTktPT0pST0lPUExGRD07Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagprCsrquoqbGvsau8uKu7vrizrKebsKesm4+WnKWppKGYmY6EknmJj4uLdnF8bXVwam1qWEtGR0VBQENESExMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WUpOT1FUWF1mcHBphaWpwH1yd2F6d216d4ePeXuLhW9sjJJ4c3hpaoCCcZaRjIF9lX9JkpluZ3d+gm1qZGx5hZCShmtybHxucnyGaW1wf3ONiYWGe35/e3dwdHSGgnmBeXB8jouKk4OWl5iakJOWlpmXnZaMg4mfkouSjYaQl4Bwam9vb1lWWFRSUllPUlVUUlhVTU5ITUtNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5ibn6Ssr6Ktqqi1r66stL+rvMO/paKZlaSYno2Ei5ShoZiZkZOLc456gIaMhnVvdGxwbGVsallOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUlZaUVlbX6aGYZhmcHdjfG5sfnmKiHWBh4V0bJmRdHN8aWqdjkx5hZOJhI5mMXaHcmt9fYN0ZmV1f4SEhYBmaWx1a3CAfGhxcXxuk42Pe3R+fXFxb3Vtgn93eXVqeYiCiImDlpKSkIuNkZSUjpeNgHmIl4iHioaAkIh4bGtwaGVYUltYWVlbTlBVVllYTklIRUpKSEdCQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW2SiJqQmZakqK2esZ6nuq+rsrDCsbvDx5qWj5WZi46FeoSQmJWNkIyQh3GHgnSIjIZ6cHNxb3BkcGdfVEZJQz48Ozk6P0BBRENFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FVTEJJUUlirrKecHl1antrcIKAhIB6hIWFeXKglHR4gHN0lIc1cJ2onY+hoYSihXZwhnuGfHSMro2JgWhnYmpucm1wg3Vpb1h1cI6bkXZtf3t9bnJucIB7c3ZuYnWDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY58c3JxbWBcXV5cWllhX1JOW1pYV0xISkZJRz9DQUJIP0NEPTs6Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikYGSiJWRnaSnnq+VpbSprrCuwbK7wcWWkIyUj4CIfG6BkJKJg4qHj4Z1goRslYiIe3V4eGx3bndjal5JUEc9Pzc0NDk7Ojs9PkBCRUhMTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDhETlJTREqEc356enR9a3WGh3t8hIN+i311oZl5foWAhJmEmpxhhqqfnYqDkI56d4h+iYiOc4uXj4R7XWRxdHp8d4ptaGpieW+FkIJ6b4F4dYV6cHR6eGtuaV12hn2HfIeGjn+KkpeDjYWMhn1xhH+EfXZ3e3yJeHF0dWdoYFtcXlNcZ15XUVRYW1VHSkpES0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4in+TjJGcnZ6mkaCqoLGor8Cyu8W6lo6Rk4d6hnZrf4uRg32Kg46MeIOAc6CEin19gX9wgX56aHZrUlhMQEUyMTEzNzY2ODg6PD5BRUdGR0pLTU9RUlNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1FMS1RcWFJLZ4GHeoh4enB7jop5e4iGfpaHdqGZh4aOkpSljaypSIausK6LgYCUi4KLgoSSqYeAmJiKnHRtfIGGh36OaGdoeX9uhYeChXGEhkhsgHdyeXZobWtfdn2DiH+HhYt5lJybiYuIkX96dYp2fHhtb3d+gXV1c21cXl5cY2RYZ2ZcVVBQV1lQRExLRk9JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Nzg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkI6Vl5KWoJ2soKa4r7O9s5eNkouYi310cH6Jkn59jIOSlH2Gfoakh4h/goiFeIeJfnOEeF9jV0tCNjAuLzIzMTI0NjY4Oj0+P0JFR0hKTU5RU1RVVFRWVVNRT0dDPzgwLCOHWz8/ODQuXZZwc6NVRklLTU1QV2BYb1lbXWiLkYWTf4KAg5CRfYWIkICZlIGgoZiUm5qmrZOZu7Gnu8fDqIuMoaWOk4mBkXxxg56fkZ1/d4WFi5CHkGlocISBdIyHhIpyhoJ3iIB7doR8bXV1Zn+UjoaIiIeIh6CqopaJjpd/eoGIenlvZ2t4fnyAdWxlXltbXmpeYmdgWk9MTlhSUUlQSkROR0NKRENBRERCPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmd4J6f4x/gZCOipqbpJ2hrKaqrrCXkZGEoZSEeHd/jJR8fpKGkpV/ioCSm46DgIGMioKJjYN/in9scGpdQkA0LS0vLy4uMDIyMzQ3Nzg7PT9CREhJTlFSVFJTU1RSUE9IREI8ODcvOUM+PDw2My5sk5dNUEhJTExLTlZgY39mZmx0mpiNmJGRiYyNmIeSj52LoJ+Ro6qlo6uTqbaiqMHCrceveLqUmnyNoZ6ZhJOFgo6hn5SZkYWKhY+ZkZZscHWKjIKVjI2Od4+EcW2FgYqWkYKFiHGIoJaGkYmNj5aktKibjJSig4eSg31/a2pqfIGCg3VjX2VgW2hsXmxsXldLSE5SUU1MTEZJUENETkZCQ0VGQz06OTY9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcXaShn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReX+SiJGSfYqEmJKQgoCAi4yJhpCHhImFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5PUlRQUFFTUU5QSUVEPjs8OkRGPz48NzUyPD9SNUhISExMTU5SXm6Ke3KAfJ2amqWkoJiflqGUnJ6nnaiqn6isqaq1l6u/q7bHyLfI0M++m6Bwaaupn4STkoWcoJqbmaaSkYiVopubeHp+lJiTopKXl4GUnnt3lZKqsoiMl598lJ2bjZGVmKOhpbWvnJCYp4eWj42AiGxzc32BfnNqYV5iYGJoZGBoZ1xSRUpLUE9JSUxGRk1DSExGRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjHyKho+QjoGCgImLioWShYOGiYGAh3deYlA0NjAtMS8sLjAvLi8uLjAwMTU+QUFNUVJTUVJTVVJOU0xFRUA8Pj1GR0BBQDg2NjI8OTtGSEdJSk5PUVlthY92lImgpKeyvLejraurpqizq6+1sbGtu7GzvZuyw6u6ycu3w7+4paKws6ytqqOLlpiEpaago5eBppmNoquopYiFlKShoKuhpKiPnLGLlaOmt7qboKKvkqGdop2Po6GrrquytKGUpKmImYiSiZV5en6GgGliaV1mY19lZF5nZ19bT0NJSFNORkhMRkpHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGJXaW5YeoR2gZOFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkI6DhIGLhYaIkoaChYmHiIeHcW5hQEU2NDwyLzExMC0sKy0wLi00P0NBTVVQUlNVVVZVTltQR0dEPD4+RkhDRUE3Ozw1Qzs9RktJR0hRT1BXgJKfg6yisamwv8bCqbLFtauyv7K3vbW/tMG2u7qjuMWotcjHtb25tKijtK2wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqK62u7K6rLC1orGssbW7trSutJ+mp6OnmqmvrLG4t7immrWojKSOkJKfhniBhXdbY2VXZ2NiZGFhZ2BbVEpERExVUUhJSkRJR0VBQEBLREJNRz04Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtZUWJiV3l1cIGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomIeYaAjJKMh4SBjn+BiY+Gf4aIhoqHkHp4bl1WQEVOPDY6NDVBQjc2NC8vNkNIQlFbT1FVV1VcV1BfVUlLSkE/PkdLRkZEOz5AN0Q3P0JKSkVGVlRQXo6jrKKxs8G0tsDLyLW7xL2ys7+2t8G0v7C3dLGzprrEpLDGubCysbSopLW2qrGgopebopKlsK6mraunpJigrLS7oqiyurW8v8y/xcW9vbPBt7q3vra6t7msq7ClsKmtvbC8usHBq5i5p5StjpeXqYh+g35sWGRiWWxma2ZYXGNZVlNJR0ZMUUdDSElBSEQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxRVlNZVVp2am9+joOAjoRuenN4h2K5oZmjiZSUlpKUk42PlpGHhnuGgY2VioCEgYp6fIqHhn2KgoGLg5V9d3p1ZVBcZEdFSztRY2FbXlNGPztIUEVaY1FSWVhaZ1lUYF9MU1BFQT9JSkhFRUFARDxFNkI+SEdKTFNZVF2Trre0ubfIvri8ycy6u8C7t7W7ura9s7mxxWB1saSxmp6qvamlqKuqpKKytaCrqJ+Vlp+ZoK6lp6aln6OTo6extKiys722wb7TycnTxsPFzMLKw8C+vb67vLe0r7i3tsO5xb3Cx6+euKmhq42kp7WIgYFzYWNjX1ljYGpnU1hgVlJVSUVFTktAPkdEPUtBPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhY9zbHJyc4fVwLWZoI2VmJmRjpeRlpaOhod9hoOMlop+g3+CeHuKg4d7i3mBioKXfnR9emtmcHVZXVxQZWRiYGVkXVtYV1xNZG1VUm1tX25fWGdkVFlVSkRCS0tJRkhISEhCSTpEP0hLU1RVXFpbk7i/uL22xb+6uMnKura5tbe5sre0s661tphkdaecrXBeoqycmKCim6SeqqWUn5+Qk46WmZion6agnpqZg6SerKWqsK24sL251NHP19DKzNLMz87Kxr++wsq9wbzBwMTExcq+x82yo7qwtK6aq7i6mIB7bV9hXVpfYlpkY1FbYFNQS0NBRUZFPEBFPkFIQkBDPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRW1loX2+WkpCUbmxvdHWHs6ugoZ+LmZyZjIyVkZqRhYqKfoiGjJCLiHyBg3N7ioKFe4l0goqGlX9ze3lsbXV7aHJlaWxpZ2pqaWBmaWlsWm1zlq2kvIiGZ1tvZ11ZWlRIS05QSktQS1NRSUxBSkZKT19eYWZpYZe2xrC4srq8tLDExrWvuLCwu6uysaaqt6uMtaedmqeaTpmdjI6flpGmmKWVipOTiZCJj5GRnZuhl5qVloeemqebrK+osKi0tNTU1NbTzNDT1c3Sz8zFwsnQvsnJysnRx8zNws/Rt6/DvMO5pLW5waKDcGVeX19aYVhaZ1pRXVhPUEJCSEVCSDtBQz5BRz8/QTc7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlSZVZzkJCYgmdxb3l5g6CpnqaXjJqbl4uNlZGajn2Ji4SNioqKkId8hIJwf4eBhnuHcoOSi459cXh1bHF4fnF6bnhzbWmBcG1jaW1weGl3fH7Lv8Hfp21jeG5jW2JgSlBSVU5ZXk9dXE5QTlRQVFRcbm12gnGWrbers6avtamsu7+wqrSmpLimq66gq7SjjrCtmpeYjJGTkYSOm4GNppGciYOLhIqJhIuElJWYl5SbkZyXmZqfn6uspaiirK3P0tXSzszT1NTP1NHOx8PU0cfN0tPT18zR0cTS1sXBzsfHwqi9t86efHBnX2RfV2FTX1tQUVRRT0g+QEZBQkU8QEE+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFVRTU5adYaFindsd3B9fn+hnp6hjIyYk5OLjJKPlYV5hY+QjYqKiJCGfoJ7cn6AgYd6hHWFk5CIf292cmtzfXt3e3OBeHJrgHNyaW9xenlxer7Lmn6LsYR2coR2aGFrXUNaWltWZWNYZGpTWFxdYGNdY3d6fYuBmKmkpKGfoKelqq+4qqWzoqGtoaOtoaexn4immpOSkYmSj4iBk4lqlKKMmYSBhn6Rg4OTl62LlY2VmY6GkpGel6iwoqGhpaSpyc3PyMLM0dTS1NLO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsw8LLjXVwZWJhWVVaVFxRS0dKSkpAOzo7REFEPEJDPkdCPkJCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtPTEZKWHCAdX1oc3hygomAnJSdlIWLlYmOiYiNho5/eIOTmIqMh4iLiH6Cd3N7fYKHd396hpGVf4Nud3BtdX91eH10hXx5bId2dG59doR0eHudtYw7QIvFpX6MfGllV0lDZmNlY2dqY213W15maGtuaG6AgoeRi5ydoJ2Ql5ieo6OlsaOksp+hpZ2gqKCjsZyFnpKRkY+LjouGg4+Ef5ybjI2ChIV5lH+CqZWjjJGJl5KLfpiLmpKrs5ibnKicp77Dxrm2xs7S0dLQzNLLyNTO0NXa19fY1NnYzdjbzsnZ2tHVvsrLtXp5cGZfW1NXUlxXRkdKSUVFPTo3OkBAQjpGRD9EQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfJeQnYt+h5KDiYaEiYGHfHiFlpaIjoOHhYZ6hHhxenuDhnV5hY6NnHmLcHxvb3p/cXuAcYOHgG6OenV3fXyCdH58hoevc1iqwraNkYJwbWI9XmhycHFwbnh2gWVob3J1eHF6i4aNk5GalZ+Vh4yTmqCanqmfoayboZqYn6Wen6uZi5qLkJGNhX2Ih4OFi46gmZOIg4d+bJl6hJiGiJOMjZSMhnyciZSPrqqUlpifmaevtr2prb7HzMnJzMvQycPSytTX2dfY19Xb19PZ29XQ2trR1sjUy5Z7fWpqXVxRVFRgSUNGSUg+QT49Nzo9Pzs9Rz0/QUFBREE+Pjo4N0RCNzU1NDc5LjU1NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw5OUQ+Q0dSal5tZGJma3aAiHGRkJqAeoCNfoKCgYN+g3t8hJiNh4t+hYaAdoJ5bnt7hoF0eZKejqB2jnWCc3WBfXOAhG+BkIJvkoR1fIGFenaGe4m3xaTBybiBlpuPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aTlI6XkYOJj5aalpalnJeflp6SkZeinZmrlZCQioyRgoyFiIiBhpCRnpuZiIaMgYWXeoiJn5eQiI2Ki4J9oYmRi7yhmJOYmZ2ppqaun6i2v8DBucfKzs7FzcnR1tXV2dXX29TX2drb19va2djO28aIfXtpa2dhVVlWV05MRU5DOz09PDg6Oz05PUA2PT9APD89PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9YZWFdW2h0enlsio2Sd3Z6int+gH5/fIR6fYKRiYSFeoSHenV9dG18fYZ+dH+SnpGeg5F7hn54j354iopugpqAdJmGfoGJhHt+kHqPqY6Pw6G9i5yknH2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYuLkJKFiIqQk5SOnJmSlJCWjYyVn5yUoJSRjY2Pi36Qjo6LhImSlpqen4mMlJKdkYKLgKWZiISNgoWEgaSHi4u4mJ2RlZaiqKGenp2kr7e6tazAxsrQyMfMz9PT0tjT1dfA19jZ29ja2tnZ19u5e3t6bmtoWWJdVFBPSURMQjw8Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3RD83Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODY4OT89Q1FTUlheVVhmbW1taYGOinFyeYp7en98f3uHenx7i4aCfXSDhXlyenNtgH6EfneFm6KbnZSSf4yIf5iHgJuSboeohXqgi3yRjYOIhJx9mpCKjKOioJCkr5+LkIuFi4GThldyrYufq5uPg5ibj4+OXIKikYKMn5OVjIeIjJKSi5SUk46Lj4qHlpqcj5SWkIqRk4aAi4iSjYqKnJaYoqKGk52WoIqJiI2bkIOIjoCDh4WkhoyQs5idkpSXoaGemZKcnqiyuK2mvcLHzcjGz83QzM/X0dHVrtbV2NrY2trX1dnZoHJ/d2poX15ZVVlZQ0FJQz8+Pjo0OTo7Nzo7OjM7Oz89Pjc7OTowOkc9OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J6bWF+koNvbXeLeHl/eoF8hXt7doWEf3NwhYF6dXZ2dISChH5/kqakn6Wil4qdkJSXi4qol3KKsY2Ep5KEmZOFmYyilZ+Yk4ianqOSqbCfkJSQjY6IloxujbeFmsTIspuhpZucmJaQspFkpM3HlY+Gh4iQko2NkpOJhYqJhZaZmo+PlJOGlJeDf4+LmYiNkKqWl6OjiJmelpqIjoaWl4mEjoyBf4ePpImOlKial5OXmaGZn5mTnZujs7Smo7zBvsfFxcnIycLL083N1KnS0dbW1tja1NLazoR1gmtmYGBfUEtWXEJCR0M7QT04Mzc7PDo4PTY0OTo8OjgyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRKUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJlg0d1go58fG1+iHh6fnqBgYJ+dnaAgntsb4p+eXx3eHyEhop+i6O0qKSqs6GWp6ClpJaVr6KDkLiVkrOajaGgjKSbr6KknZiQp5epma2wpJeUlZSQi5ialqDAjqPJuKuaoqWtmZGbnLKdhoWoopyYhYiIjpSMipOPh4CGh4iTmJSMipOThpSYhoSRkJx0kZiylZakoYicmZOPipCKlpqJipaNhn2MmJ+KkJCcmpmTmZiglKGdlZ+bobGto6S3vrPFx8S9w8O/xs7KydKnzszT0dDW2NLP2Lx1fHhfYldiWFJJS09FQkNENT46NzY6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER01cXFlKaGE7SISLenpthYZ5fIR4gIWBfXB4fH18b3OMeX2Be3iGi4mGhJKovK2psr2wpa6zs6mjorCsipq1naK4pZWtpJeprbempKOfmamYqqSvsamZmJuUlZGYoJeZu7utyqFptreqsJWYnqOrkpe9pF6qs4KJioyUh5B8jo59g4aOkJSUiIeSlouPlY2LjJeZk5yZtJaVq56LnJSSjZCSi5iaipKdj4uJlaCijZWNl5mdk5yYnpShoJScnaWuqKKks7irwsjEtrq9vMXIyMLQocbJzc3E19bQytOjc31rX1tVYVNRR0Q+PENBQjg/ODc0PkY8PDY8MzUzNTU0NTRCMzk6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZkhhYGJwSkCLin6AcoaHfIGJdYKKg35tfXx8fnB3h3eNgYd7jZCMhoyaq8PAsL3GvLO0wby0rKuztoyosq2tvaubu6Oorbm4q6amoqKko6qvsrGqnZyjmJuYmJ6ipaWTo7mvqMC7rK2yuaWjp32IhpytvbCCi4uKkIOPg5GOeoGHkI2OnIiIj5eNipSXlJCal52nmrCakaudjpqPko6VkY+Vl46RoJCIlJukrJSWj5ScnpShnpuYn6CVmp6np6SipLCzpsDGw7Cwu7bFxcO/zafHw8fDvNXQzMTKinZ2ZF9cYl1PTENMQEVHPkE/Qjw6ND5BPT01PTY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGhGX2lnW11ck4yMiHuHi4aDjHWGkIqBbn57gX5xfoF6lHqSlJSYkZOVqLTHycDCzMLDuce8uq+rubuXsra6ssCvpcCjq7C8vKquq6Oinqesr7WxqZugqpyinJafsLOnjKK6urXBu6uonLKko6iUhI6pxMSkgouOhoiEhpWUjHqDjJGPkaGMjJSRj4iXoJiTmZWXpaCunIyqnI6Wj5KRlZWNkJSRj6GThpefoLKflJuUoKGZpKCaoJuglJiep6Smp6SvraW/w8KuqLe1ycO+ts6yxL7Du7PRycjBtXd7b15bXmxUTklETUtLSUBBPUJEPDVBRDs6Mz04QjMzMjI2M0EwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmdcTWVcZlRjapmNlomLiJKPhol5hpOQgXKAe4x/d4aBgo95jaGWqJqamLu+ycjKwtLJysLNvcGzrby/p7q/vbzEuK3BqayzvL2qsKqkpaOsrrSutrWgn66fpqKZo7S8qZupvMGjtravq5Ovq6qsloaaqqelkYKMkqSViYB1iZF5hY2RkJ6fko+Ui4+MlKOZl5uVlKKeqZ+RpZqMj4+QlZaIfI6VkpKjmpWgopy1ppCgl6Wko6WfnqaYnpWXnKWjqKiisqyou8DEr6Wzt8zAuq7Ds7u9wbmtwsLCv5lwe2NbWV5dTU1OS0dEQ0hCQUFDSzo0REg6OzQ8N0YuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5sSV9YYVpkZVeekJ2Ol46ekomKf4ifkoR4hX+Ufn+QiImQgJahmq6no5jDvsnEyMbTzc7Ny7zCt7C6vbS9y7vDwba3vK20wLm8rq+ooamotq6uqbK3mp6soqiinau3t6mlr77Esb24s6eqtLOtrpaVpa2ooJGOkrHFp5WNfZGVfYeRmI+qmZeTk46TlZOlnZOdmZSgoqGcmJ+Yi4yPkJ6IWo+Wl5KWpJlmmaOes6WWopasraynnJ+nl5iWmJaho6imn7Wrqbq7w7SmtLXLwbiqtqyzu7iuqLi6vLeEb3BcWlZXUEdMVE5LP0FIRERIRkY4NUZNOz43PkFLLjMyMDI1QjU1UFdOPExGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhWPD5AQkZCc0ZpSVJmY01GppSclqGXqJaMkIOHpZKIgYeCm4ODlZCQlI6aop+vvq6hx77GxcjHzs7P0sq+u7axu7u8v8+1xL23ubezsrazuLOsp5yrq7mrqaivr5ejrqWopKW1wbCrrLS+w7nAuLOnuLS3sq+VpK2wr6SLk5SgjXPBmX2XmYSOlpmLsZWamZWSkpmZpaOVn5uWmqicm6GgmYqMj5adYEqWnJqVmaWXVJawn6+cn6WVr6+tppuhppSTmZmOnZ+moZm0qaqzvLy7q7Cyx8C4pqyrrbGxo6GysrSlc3FnXlxQU01GUVFQUTtIS0hGR0FDPTlLVD9BOj1FTS83NTQ0OkIzNE5XTjxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NUVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oWDw6QkNAPVJFV1NzYlZGSKuXmZ+hqK6YkJeHiqeWjYiShZ+HhJyXjp2gmqOktcm0qce8w8TJy8nIzM7Hvrqzr7q4wMHNtci6wbm1urKvr7O0p6ScqrS1q6qnrayZpK6mpamsusCoq7e2vsHAvreyssOwt7yso661rbqliJuXpZp1vp+EmJ2Okpiai66WoZybl5San6CpnqegmZqqmaGnnpeQjZGdg211k6KalJyjn5CtsqKrlamqmKqvpqWhpaqTkpmciZWcop6WsKepqrq3vrOyrr65tqCjp6ilppycrKmpjWZoY2BTTU1HSU9KVUw9TUVNSUpAQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNDOjlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc8Oj0uLlNhTVZIfmVeSEaslJyhn7uumJSei5Oqm5GRk4iqjIahnoyjrJSjpLbHvbTCu8PCyMnFws7Iwr25sq+5tcDDyrbGscG8tbusqa2ssKOjmaq0u6aqp6yqnaivqKSrqr68qK28tLe+xry2tbjAsL2/s6m1t6y/pY+il5Chn7yeiZqgmZednY+2n6mcpaOam6Cap6WzoZudpZyoqp2YlI+Um4uWiYykoZScop+gtbClppOxq5qrrZ+fpaSqkpaVoISQnp+clqmkoaG0tbq2rai1srKenKKmmpeVmaqhnnhjX2FfTElGSE5RSU5FRkdCUUpIQERHQVZTREg8QUdRMTtCNzpCRjc5XVlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdFqJeknp/DrJuXpJeZqJuVmpqOqpaVqKaVrayZoqu3xcK8v7fBwsDIxL/Nxru+ubKwubS+w8i1v7C8trq3p6Srq62hoZurqsSipaispp6rr6yiqqi+uKatvrC3t8a3tLi4vrG+wLa0srWvvqOWo5WTmpOtn5ChoaSio56QvqSonamsnJygm6afvaKYo56iqaugnZWNlZ6TnoeOhI2TnqSgnbasppyWsqaZsKignKufoY2alZ+EjqGanJKlpJqYq7G1saqlqq2sm5igoZKOkJapn5RpZVxiXlBKSEtPTEhFRElAPU9IQDtGSUhbUk9LPUhOVTRCRjg+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLTBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZmNYTqObo5uexaugnqudnK2fkaKelqSfpqqrl7axo6mztsXCvcC2wMK8ycK/ysi2uLW0sbS0t8LGt76xuLS6tqCnrKqrnp6fpaTBpaGqraCkqa2woqaovbWlsbu3trXDsrK3ur6yw8C4uK20tLWjnaSUkZOgrJ+YoZ2oqKqimsKsqJ2srZqanZimoL2hnaSYq6urpqCZjZqfkp6Ijlh/lp+moaC5qqaUmLajnrOioZyxmKCPmpWego+gl5aOoqOVkKWus6upoqKlpJWVnJmLj5KTpJ+JY2dcZWFNSktLT0ZFQUdLPj1JQTk5SkpOXVFRST1MVlw4Rkk9RE1JOEhjXEtDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YVM2U1prV3NIRTY9dWVcTFCfn6CYnsOnpKKzoJyyp5Kpo5+jnq2prJ27samstbHIw8HDs8LDvsfEvcTKvbCxtq6xtbDAxbW6sbC6tq2aqbCpqZuepqGnwq2crbGcqqKusamkp723pra7va+3w62zs8K/ssazurertLatqqKmlZWUoquhn5+Zp6uvr6+7sqWfqamZmJeSoqS4oKGjkq6vq6SlnpGhnpSdjpCNlJ2ao5+otaenjZi0nKOvm6CcsJGhlJiVm4CSopaPjqCgk4umrLClp6KdoJ6SkpqUhYuSjZyfgGRoXWhmS0pMS1NBQ0BIRzs7Rj44OU5NVV9SU0o+T15dPUhQQk1MSThOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8d11eP1tVX2dyQDg8SJZ3ZUE0n6Sem6DCp6OpsaCjtKmVsaumoqSyrK2pu7KtsLW0xr/ExLa/xL7KxbbAycK1rLWpsLmswMS0t6+ttrqlmauyrKqYoaeYrbu0nKiwm62frrSxp6q6s6e5s7iyuMCqt7LDvbTFp76urbe1qaeroJaWkaWkoaGXl6Sut62xtLafn6mkmZOUk6Ogt6OkpZWusbKlqaWhnpuZmpWXqJ+emaKfr7Oipo2Yr5qlq5ebn6eTnY+VmZqGlqCVjJCdnpSLqamqoqehmZ6WjI+ZkIGGlYiVn3plal1sa05RTk5UPUNBTkM7Okk/NzdRTl1fUlZRQVdgXEJKU0hWS0g6VGRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzkwNnBbYkgwNUpxaVZDV0aMeWZDO6SknKClv6aorq6gqbWqnbevq6OqtLaxsLi3sLe4t8S9w8e9vMPCx8G6wcbBuqq2pa27rcHDt7eqrbK8o5Wtsa2yl6aokaq5qqGnsJ2roK+0s6qqt7Wsu6yzsrm3rLiwwbq9v6bDqrC2rqmrq6admJiqoaGgkZegsK+zq7C5mZupn5mWkpemoLeppaKir7Gzq7Gnq6CcoJ+bnqWdoZido7Swm5+RlKaaoamblqOhmJqLlpmUlpedlImSm5mUjqmpp6CjnJibk4ePmYt+jJeGj5tsaW1ibm5YUVFaVEFDRFRAOztIQDc6WFBkXlBXV0RZXl5OTFNOX0xKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE3NDdnWWFGKEA4bH1oXFY6iXtjQz2on5yhqLygqa+qorG3qKS0saqhrbW9r7O4vLu9t7bAwr/JxLnEw8DAucW9wbivtqirt7K8v7+0qq6yuJ+XrK2orpioqY6nu5+lrbOeq6KxsLOsqraztbytsLG1rLC0ssC6xbarvK+xt6ytqaOxpZ6kqJ6jlo+Yn7Kqs6mqs5mdp5ualI2gpqS0rqehrKytsaeyq7Gpo5ueqKSelKCZnKi2qZeak5KfmZ6hn5KtoJqah5eZjJ2anZSLj5eXmpenpqOgnpaWlpSBkJWFe4+Tg4yXZ21yaHFzYEdZZlZEQ01YRFo5SEI1Pl1RaFxOWl1HW15dT01TWGRKS0NcY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVYxNTE9YFZfOClDM1lVXGdLNYx6ZkxApJqgpKu2o6uopK6ttamus7imp7C3xrawt7/Bwra0usW+zMW5w8G6wLrEuMG6s7Wsqrq4u7q+tauvsbaZmKirq6ycrquPq76eq6+xo6qfsa2zrq62sbi2qq2usae1sLO6vMmyqrW0sLSwrqags6CaqKygpJWVmpmxoq2gpa+WoqSamZKMoqWnsqmhprGsqrWkrrC0r6OZna2nm5eempmsuKKXk5GPmJyhmZiVrqGfloKVmY6enJqXkYuUk56ZpaOjoZmXk5KWe4yRhXuNi4OMk2xueW92fWJGYGpaSUhaWz17SkdFNkFiVWlbTVxhSlxcWlJTU2JhTEtFYGFgUE1JUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4rQS9KR1BbRzNjWFRLRZqWoLCnsamspKOurbSot7O3o6y0t8m6tLu7wL60s7fDwMzHu8S9t7/AwLjAvbK9rqi6ubi3wresrrG5lZenr6yopLOplK+7pKyysqano7K0sLKxtLC3sqmuq7KmuK+1s8TFtqm1tauwramnoraen6awoKOUm5mUsJ6nm5+pjaminZuVl6WlpLenorCzq6exp62vtaykmaCsqJycnZyUqrmclY+PjJido5iRmKikoJiFk5eRnZyYl5aIl4+Xm6idpaGSlpKQlneEkYZ8hoKEjY1ucXh2fIBcTGVsXEpPZF0/YntHSThHZ1dmW0xeYkxZWVdVWFVpXU9QSGFeX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZzI3J0ZhTFYlLUIuPUVMUTwzcmtMRESRmaSto6ytqqajsLKyqrewtZ+rtbnJuK7BvMO3s7G1wsPPxMDCvrW+wcC7v7y0xKiqubG2t8C8r6y0tJ6hp7GupaaxpZ6ytayqsrGrqKi0uqy0srSrs6yqq6isqbmtsrDHv7ikubCpra2mp62wpaSjrqOom52bmq+ZoqKio5Csn6Ogn6GppqW4pKu0tKSqq6isrrauop2jqKucoJmbkqS1mo+JjoiRo6GWj5afopaVhpCVlJ6bmZaVh5iSlZmnnKCgjZOSjpF4fo6EfX19h4qKcnRzf35+XFNjbl5OWmddRkSWW0c6Tm1YYlpNYWJOVlZWV1VZaF5RU01jWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozRGQ7NipIZEhKKzpJPzNDSVMsPo9rP0hJkJupqaGpr6Sno7OzsLS0sLCgq629zLquwbzHsbSts8HD0cTGv8GyvsPCvL+4vcWorbestLi8wLGssq2ho6euqqilsaOqsKquq7Gurqyrs7qmt7CyqbKpqqalo626rKqwwrm0rLmoqKitqaexpamkoq6qqKGem6OslaWdmJ6Zq52hp6ihrKajray2sLGgqaKfqq2wq52ep6epmqOYmZCgqJiGg4+Li5+gkIyOl56SkYiIkpahnZaZloaXk5SXpZyenYySkI6Kf3+IhH13gIeFh3V0col3bF9ZYG5jUXNxXEs7hHtGP1d1WGBZT2NcTVVWVVdRXGJfU09PaFlXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSzAuSWdERjg8QjA1RUtYMUCUXUBORpWWrKegqbGbqKiwtay4ta2ppKuqvcm8sb64w6+wrLPDxM7Ow7/AtMDExLrBtcnErK+3rrO6wL60rq6spqipsammqbKmtK2qr62tsa6yrbO6pLizrKytp6ugo56wt6uqrbm2pLW1o6mnrKyqraCopqexsaSmpaGhq5aqoZOboKWeo6Oqo6yinqaxtqysoqWjmqmrramdoaWkpJmgmZaPmJ2TgYKQiYWdoI2LkI2bkJKNhY6ZpZuTkZuMk5KSlKOanJqLj4uMfIeBgoJ7dYGEgX51d4ujh3hqXmBuZldmh2ROQGeSTERieldiWFJlVU1WVlVUT1xdYVZMT2pXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREhkJJSUSWka+koqmvmKmorbWqtbCqpKuqqbzAwLm5tLy1prKvw8nL0b/Bu7nAwMK6wbrCxK6xtbK0vMG+s7Guraysp7eqpa2wq7iuqLCvrrGrtaq2taa0t6yspKmqnKSes7OoqKSztJ+1raGpqKuoq6efq6uoubapqqqpoamfrZuRqqGdoKOjpqKqnpymtK6npamipJekpqeqnKKko6CZmJ+Rjo+ZjX6HjIeFnp6JhYyLkI+SjoWIlqOajo2bkZKQj5KfmJmXjYuEgHSHgX9+eHWDgHp4fn+InY9wcWZncXhcYXSIak9dmFZIbXlVZFZSYk9MVVVVUU9YW2JWSVFqVFZUR1BZVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDI/Zj1OWD9DLD9MVF8vSWs3UkY7lY2voKWprJmqo6yusrSvqqSvqai7v7zCsq+5raK2r8jHyNHAv726vMO9u8PBv7+vsbOytr28wbKytKu0qaW2qaWts7K4r6KttbGvsbmquK6qrrerqp6qq6CjobWtqaGfrrKhtKqeqKero6qhoaytqL2uq66toaenn6uZj7CimKKgqKeep5uYqbCpop+soaGSoaKjp5iaqKWYmJicj4uHlYh8jYaEhaSWhoODjIeQkJKFh5WhlomRnpGTkI2RnJWYj4uGhnh0gX99dHh5gHt0dHtqgoikdmleZWyBdWeIi3xSVnBeSnhzVGRTUV9NTVNaZk5NV1llWUdTalJRPkJOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaDozOF89YWQ/RjFDUFtbK0hQO1lDM4+OsKCkpaqipaOsprSzsaiksKequL7BvbCouaqnrbDJxsjQwr2/vbm/v73JvMK4sbC1sbq8ucCztLytuayjtaanrLG2uLKmp7m1rbS8r7ulra21q62cqa+kn6SsqqicnaqypLOomqqnqqSpnaKpp6m9q7Owrp2po6Cum5qzopalm6Wkn6WamaiqpZ6aqaCbkZqgpJ2Zl6mpkZmakpCLgo+FfY+DgIiej4eAfoyIkpCRhYKUm5SGk6KNlJGLkZuTloeKf4Byenl+fGh2fHt1cHJ+aoZ6hYhkX2hjcoV7bWd5XV5WQld7bVRhUFJZS0xOcHRdSVpbaFlGVmdPQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOkrCZn5+ppKKhq6S2srGkqbCmrbnCvbewpLmsqaiwwsjJzMG3vb+1uMG6yLXDtbSztbK9ubq9tq65tr+torOmqquutLe0qZy5u6ixvrK6oK60tqmrnq2xo5ylqKmjnZuksKavoZ+qqaeiqpyjqKCtvKeusa6hqqKjrp6erKaYn5qhopufm5mjqqKamqOjlZaTn6GWnJamrIufkY+RjIKLgICPgXualIyJfX+Mh5GQjYqGk5iRh5SjipKRh5CZkJSBiH16bH12eXhienpycHBzeGqCdWuCZ2NnYW5zjm1iam9fcEFdeWtWXk5RUUtJTVNZVk1cXmxXRVhhT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNSXT4jkZarmJ+Xp6Khn6ejt6+toq+vqKu4wrqzraC5r6uns7rHyse/t8K9r7S+t8S2wrKwubGywLa7vbequbi+qqS1p6iqr624sKiYuLyjrb60tKGtt7Wmpqiws6CepaWnoaSZnqynqJ6gqq+noKaXoqifsLifo7GvoauhrKScpqaompubn6KVnJuanammlpueqJGYkpidk5mWoaqQmomNkId9h3+Cjnx8oYyMiXqEjYWLjo2FiZOajomVn4mQlYKMl42RfIV8dHB8cXN0YHh4aW9wcXBrf3NkemxoZWRhZoeAYFtyanJNToBpWFpNUUxLSFBSUEdNW19vVEVZWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXVs1KJWbpZiclayfnqGkobersKO0s6mpusS3sq6huK2tq6+1xcfAt7/BubC0vbe/u76wrL6ws7+xvMK4qbu6uKeotainq6+rsq+kmLu2pKu6ta+esbivqaWnr7KcoaSgpKOglpuvpqGfoqivoaCik6Okorawoaaxq5+so66XnKqlqJ+Ymp2jk5qbmp2lqpqbm6WUlJeVnI6Tl6KooZCJio+GeoN+hIt5j5eKjYd6goiEiY2PhY+TmIyOlpmLj5Z+hpeMj3qBe3Bydm5vc194d2RsbGxqaoVvZnJpa2ZoXmRzgWBba3ZpWkp/XlxYT09LSEhSVUczOV1ebFBFWVVZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVV1oRC48MmRXLDKUoaGXlJuqnKOhoqG3qq2gu7elrL3FtLGvo7WvrKyutMPDvLO/urexs7m4ure6r67As7S5r7/At6y9urWmorKpp6mxqq2xoJm/taSntLWonrK8qailqbCsmaKnnKSllJegsqSZnqOoqZyin5KkoKS4qaSnrqaepaGokp+poqGhmZudn5GZm5afoaqbmpihlJGUlpmNlJOkqKSQiYmOhnmEe4SGfZ2NiYqHeoGEh4iKkoWWk5OLkJaUjo2Ue4OYj4t3fnxsdHJsbHNhd3RoaGpnZ3CHaGhpY2ZpaWBqY2poW2Z7Y2BTdFRcW1JMSkZJT1NAISpoXmlMRFdVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnUCcynqKjkI2kppqdnp2jtK2nqrq2p6zEwbexrKO2rqetrrbAv7yywrawrrK2tbi2tq2qvbOusrG8v7euvLuxpZ+2qqWls6eprZ2cwKunpK+yqay1u56oqquxpZieqp2mpJGYpayimJ6kqaGcopuWn52ntaawqq6hoZ2eoZSgpp+hoJqbmZuSmJ2TpZ2soZeWnZOTjZWXi4+Ym6ifkYiJi4h4hXaBgoGdh4qCin1/hYiHhpGElpSQjo+RkZGMk3uDlY+Gc35+Znlva2prZnRza2NnZGR2gWJlZmZmampja3JbX1lebWRhTmlYWmBWSkdIS01SWD45X2xoSENVVF1bSUlHRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNCaEglNZqjoI+MraGXl6CWpLOxorK9tqGxxry6sbGjt6yqram4vLu6rcCyrq6utq6yuLOpq7mxr66ztrq2sLi9rKadtamfn6+jqa6cob+gsKOusK63rrWera+trqKZnaeppZ+Vmqeln5mkoqidmp+alJyerK+muqiuoqGam56ZnqSapJ2Xnpebk5ifkqiVqqeak5qakoyVmY2UlJqppo6NiomOe4FzgYGKmIWHfImJhYWKjImShJSbk5KPkJGXjpB/gI2Og2+Bf2Z5bWhraWZxcmtcaGNjdIFiZmdqbmxna2pobl1sbHNwYFRjaWNmWUlGTE1PWFFRVWFlgFVBV1NZVEZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJjSRoZuNj7CdmZOhmqmxr5+5v7WgtMK7vbqxprevp62kt7e2t627rqyqq7aps7euprK1sq6psLa2sLO2uqeon7WonJ2ooKismqe9mKyjrq+1ta2tn7GtsKmim5yjq6iclJympJ2aqaKklpqfm5Cbo6qrqryfp6SgmJqZnaGPa6KWmZxwgpWao391kamnnpSUnpCIl5mAloqhkHmHlIyDbWl+doNxbIaLhn2FjIdwXmNhZ4SYhWuLjpSSdHeLhH6DkIBnh4BndWhlV1xoc21OUGpjZ3OFaF9lZm5tal5fYYqPg4RlTktEOUdUaF5KR1FQVFVMSFJgb3RlRltRVVBGSEVDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QUBAPTI4QEU9MSwrMDg9RzcwMS4qLiovNTY4LCMxJzIxNDoxNzVYgWwxNk9rW05cS1tmYj5HMVFkPSouiqOZhZWwm5uToJuqraqjvcWvqbfCt729raa3sKWqorazsbKxuayppqy0pa+0oqm3traop6y2sq60rbOhqZ6zqp6go5ulpperuZSlpa+zt62upamuq6yloZ6coaemm5egpaWam6emnZOen5eQnaippLawpKOinZaYl5ejiKGOkpqGoIeTnKB/pX+lqp6SkpqRiIRyeI2OhYihdoiMaZeIZn1zeKBviIeDfo58f6GgoJmAfIeedIeOdZuKbIeBg21pZWN6bHJhU4VtYmxpmHFYaXFwiFheaVtsbFuIcm56coVnhoRaX0dOP0dfTUVSVlZRUVNXVGddTVZIUlJPRkdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcvKIqmloKcq5yYmJ2fqamnqr/DrrG6vLbAv6qlt6+prKSytK6us7aqqKWwraW0sputtba1pqeosrCssqetnamfsaefoqKZoKGarLOUo6SltbymraerqqyopqGgmKCmo5mZpaOkmJykqZaTopyTkqOlpqG3pKSgo5iVk5eSnIivkJeUiamLlqGchbGAo6ydk5mdlHmC1KiAh5XBm8d5eLGlt5dkgMCcv3mEhHmRhHyQkJHKcpe8nMV6crWmu5B7gG2WsauweWhsWLGubmVpvZK8bmd6b3KP2H5Ta2O2sn+BcpRzmqGqkFdPV2JPVk5GVVtYUVBSjFxXW1BBXERRTkVHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjpCPD9BODpKPjUyKjIyQkUvLjMyLisvKC0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGMppKAp6qfl5yepayyqLDCvbG1v7W2vsGrp7OsrKmmrrOprrazp6emtKWnt62cs7K2q6Wkp7GtrLCmqp2mo7CioZ+dlpqenK2rk52in7S6o6qpoq2upaGdmpqip5+Xm6egn5iep6eRnKaak52hpqKhsaOfn6OWlpKXkpmFr2tqio2qfmaDlYatZHCdnZSZppRxrqGkfni7fWuhj3axX2q0W6WAZZyRYGaCe2Z/anhrqWW+cmemjHWxanyxeHSSlGNubaduW4SgRWhmh5ZFdZxgfmd8pKeCWl+Mq2iAlXh5aqc3Sq9cWFNsZFtLTlhfXFdWO06JT1dXL0lUU0pDRkY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzAbkKKVgq2npZ6jpKqxt6y0vb+vtsSyt7rBpqmwqq6oqK+uorC6r6OkrbKjqLinnrOzsKOloKmsr6uvpqeeo6Gvm6KalpWWmZqrpZWaoZ60s6KrnKOtraCemZagoqicmJ2jn5uZoaakj5yimZagn6qepqagmp+hlpWRlpCahbWbtXiFqZm1mXaGs5u3fpOWlqmUfmuBpnuChoiSlJJ3q2drsVyreo2GlHSJco+GgH+IkJd4goKLmIuDoI+EsHZ3n3FsbGx8i06kWEhiYpl+Y2imYHlydVOTh15QqW1jcX6HgGKcLlGhb1tTa2hgTEtbZFhcWkI+sXlXWEEjTWhGQ0VBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjhhVDUwG5WglYizpqahr6mns6ypu7bCsLvBrbi3v6msra2tpq2xqaCuu6qgp7Sso6u0pKays6ejop6nqrGnsKeknp+frpWemZSVlZedq6CZmaSotK+iqY+pqKqbnZWXoKWomp6cop6bn6Olo5WbnpeZnKKpm6aZnJuioJeTkZOTnIPVk5m5cLDBfsWGfNaUm7t8mpWlj42djaR7joejgqWCeqx5j51Wr3qIfp9quVq5doaDfaaCk3yYeqp4jZ2PerFujoR0kbyFb5RQr6fFilGgemNgqWJzcohtl4hgU7W0yIaAiXxjpDNCnXZdUGppY1BAWGdaZGFKSE1uTlxRT1lmWUNEP0U/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo7REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVA3MSWbopSZsqioprSqpbSppLy3wbC5v7G1tLqytKexr6KwsqafrbWnmqe5raKvsJ+ztLChpJ6fpqmwqLSoo5udnaqVmJaVlpSWoKicmZanrbCpo56PraKolp2Xm6CloZihoaGhmqGip5ueoJ6UmJqmoJunlZubn6GYkJKUkJ2Ism5otXGrh26OpnK0c3K2e5qXpIuPnY2jf5GhpX6wdoOR0tJ2XK57hX+kb5uqpmuGhHytfZeZjnuwcpKdjnizZZd0hJ5vnmaUUciLWsJcn3liX61gdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2VYQU9rYGxoUFZHSTk9VVJaV1hJQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFMNjIwoZ2SpbCso6u8raa0pqe2u7yyur62trS5uLKltLOgsbGinquvpJemua2ksbCbtLiqoKWdoamksaesqaOZnJmnnZWTl5eRkaGmn5WSpaqwpqKWk62gpZKUoJukpp+VmqWmoZqin6yZoJ6ekJWboZ2cpZWdlZqin5WYlZGbhax7d6h2o42IhqlvrYqCp4OYmKGJkpqLon+TmomuhX+Cs1xys1KufYKCpH9x1314hX6OnYWamnavhomRnId3tGGaZZqCgpVtklqwWEuadZh5ZmCtXnZ3iGiYiGxdr3eVno94bDV5yK6yX0JUb15nYEVQbF9wbVZWTS5mZGlTWVA7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Njw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSDo5OaCelaC5sJe0wq2os6ipsrq3s7e+uLextLq0pLeyn7Osn56oq56Up7WrqK+xqq20pJupoJ+nobWmpqmimJ2UpKCTkpuYkZShpJqSkKatr6aglZmpoKKPkaGZqKSglZmlqJ2cpJ6snKGdoI2TnpqdoZiZm5aXoqCUl5CmnYapfX2leKGOjYKqcK2LgaeGlp+hiZeXiKOCkYiUqnyAi514b7FaqIKCiKB5dNh/dodzqIGOm42SpHyWkJ+Ee7JenWSgfoOVbZJcq1tak4CRf2hnqmRye4FrmIdzXqtaiaCOa29lT0pDoVxbTHRdYmdOW2FfcnNfS1Y3SpuUWEdFPUdGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANS47PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MyPziinpqav6uYtMKuq62ppbSwt7C1vri4sbC1uqi6tJ+vpJ2kp6edk6mwqa+ptKuqrqGYoJ+mpKO5oqOroJabkKGflJOemZOXnp+PjIuosK+nnZebqKafjJKkl6iqp5SXqaeenqCiraShnqKMlKGYn6CSnpeclZ6hlZaOq5yPrm1ytHOpi3WKp3O0eHOzgJGko5Kcjomkh5B3uG+Me4uiamu2WqGFZZeXaaGip22TcrR0k5h/smqFkoitanWzYZ1mom+Hk2uXXK1fTaF8h5FSc6NseX9+b5iHcl2vVjycd2ZUb24uXKdPY1NrZWJtWmNdYHB7Y1RaUj4+bW8zQ0JAP006ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4ppybnruhm7LArq2rrKe3qbevtb+0uq+ut7aqwLWoqaCapaOhnJGqqae1orKnrqmgl5unn6SruJ2irJqVmY6jopWMnKCbmJyfkZOUqrawqJmUnKyql4yUpZilrKKRlqqyo5+dpquxmaGjj5iilp+blpyWoZOdqZyUkKuZh9SSmrtzsMOAw4Z+1ZabuHiIkJiMl4uMp4h6pLZ1fXd2woKasmCDunnAfHW4Y7WCjIepfJWBrKlxe390vIinoGmdYaaOr6F+jHSHqn2+b3O8dLKDdXiBim6aiHJujaR0vV53fVphebxrWlZcanleamFlZ2JteG9aXFlDQUBzQENGKzVHIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaebnqK9oZeyw7Ctqqussae3r7bDsLiwrbmurcCwq6OhnaKhm5uQqaOqsqS0paylnpWZqpimrLicoq2Xk5+PpJ+SjJyinZedmpGVkq+5sqyVl6Onp5SQlqScpKyekKCoq5+bn6ijs5+jpY6nopSimpyYlaOYkK+gkpSpnoSQmLZ/j5GMt5V4gpOatXdta25zb3mQhY+KdJ/Bu72ae4GxqHCAc5G5g3yGhoyHjXyKh4yXfKS7ub2cdXq0o3R3l3Z0sHWZnmaGao21dHJxd7aMXn96fYlog3luemOLrHB1hX9YW6dqRWVaVGZgY15jUWdmcGx1Q05QTUQ6Wk0/SjM7MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JXOCpPXl09KzpWVSc+OzynnqCiv6WWtMO0rKuorKupuq6wxa2zsq21prO4q6mioaWeoJ2Zk6ujrKmltaenn5uVoKOdq6S9pqGplpObkKGakY+hp6GTnJeTl5SxtbetmZ6kpKKLkpKmm6Wqm5WppKWcmqGopaekqaGRrZ+WpJ6Xl5edno+vqJSbpqGNan1pm6Z4h3J9mY50eWSHe72+wLpvk4NylYdgcmpaXpuJYGOIjpVrYICVY22dd2KVa4CalZRlXmBjcJqKaHKLfYaVZ2t/cnV4fX5iW3d0gWhQXG6DfXuLa1hreoJzSkpvhnBOdE1FWF1nYUxaWGdjX09bbXVpcVJQREVNO0dJPU0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF9MKDM+W08nPzI+qaCoosKjm7W6tqOspa6np7WxrMirr7Kqs6K9sLGmn6KnnKObmZmrpq6jpLSopJuXlKCbpq2ovaeopJSTmpWfmZKXpKiokJ2RkJicsLK/rJunnqeiiZORqZqoo5uaq6CjmZujp6yjoKujmrCblaeglpSdn52XsKWYoaeZm5CcnKKjmKWhmZuZmZmPlYFnbX1xd5KXlJKFi7WqjYaYlY6KjJiWh5SVioSTlJGJjpKUmJOYlpqgoZqclKCdjoJ6pYVta32RfIB1ioqBcYJ4eXZ2ioB8impzgXSDdWV3fXdrb3ptYGNdcGhNWFpmamBXWm95bW1mVE9GUzlPWk1RTygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxKLDwtQLOgs6LAoaSysragqaWyp6WwtKrIqqyvpLSlwKazoJ2kpJyjlZWfqqasoqO2q5+YlpWflq2ppcCeq6OUkZuXnZeSk6GenqKnkpKZqKeyxLCaq52qn5CWlqidqpucn6yYoZucoqSvp6KlqJ+umJennZmZoJ6dnK+gnKGmlZeSl5OfoJWinZegjpaTioqNjpeukHyWm4OSgouqqYWAmZeJg4+eiHqEkIeGmpKIhoqWjpuXjZGYnaSWmpORnY1/jmehs6+FioR2e5KKfXd5em9meZCBgIlrdYF6iHNpc397doOHgmt1ZHlmYGplY2Rma1lse29pa1xTTFBEXlRFQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2JjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRbRzU8LEC0oLmvv6yrrrKxoKqmsq2irLOvxK+pqqKxrbyis5ufpqKhnJiXp6WppaSlsrWdlJOdmZmvpa2+oKuikJGdmZiUkJShnJeonISeqqujtMi0n6qkqpaWl5qmnamanqOrlJ6fnqCpr6qmpKuirpufoKCYpJ6cn5yvo5iep5KXlpyRo5iXp5yal2WCknxlfo2akGN5jm1pa3uSpKpqZZuYfWeGimVlaWh7jqGPa2eNmJGjd2tqi5mjn5hzbG56hI6IelhmXoaDXm2LiYF2XGhzd3aSgIeCbneCeIBzbXmEdHaIiI+DfGuHWV5sdGRec4lpa3xxa2RfUk5YSWRYQUo0Pkc3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8yWUM7Py49pZ+6vLqvrLSxqqWora6wpq2tsLywqKajra6wnqyWn6OdoZmZpqqcrKOlp6iyrZ6Uo4+ir6W2uaWuoo6OmaGZk5KaoJmZpJV7pa2iqLTEuKWip6+fnZSeop6jm6KpqJKfoZ6gqbCrq6SroKqcp5+noKyWoZulsKSXm6mVoJ2akaOWnamXnX29g4hytHKEnYataHi5xLhxk6KjeqaZmXKrgnzLwMC7cYyjiIKffZaYiZ3AvYKXnZ6NncLBfIJ8k42aw8B9bKWyb4yBb8p6f5t3kYOOgXZ5gIB5cXp/h3B3hYyTeW54lGNnYHhkYGWCY150Z2xkY1hMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAuI0ZbM1BZL1ZBQjsvOJajucO1sLDAqaiUo6+osK6tprKzrqmkpaavq5+qmJqin5yaqqeinKuipKikpLSjnKKSpq2rt7OnrqGRkZmcpZKQn6GYm5+diKaspKytwMCxoamvqZeRn52imaGjqqOToaKdnqyvqq2npKSnoaalnayokaOaqK2pmpyom6uglZaklaCilpx+zpR4eqSBeZWWm1+uj16Op4GioHynlptzq4OAr15jjKp7qIeFoHSXk4izY4KrhqGOjbNqhK91fZeIt2GDrVqjzW6Qdnvae3+ZcH6HknZ+ZXuIdnZrfIdufYaRkX5tg5Bhcm1waGBgeWRccWhqZGdgUlRTV11LT0M1QUhERDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1LMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaOqp62zq6ayq6uqo6qmr6mfppuZpJecoq+foJ6op6KloJ+wrJqdlaeurLCqqKuflJGan6SSj56lmJ6no5+tpauwqMDHs6ipsa6Wkp2bopefqamflaGfnZ2tr6msqpyoqKWiq5KsspaloqqqnaKlpKCun5GYppmfmZOTkJegcYWMl3WFqIZxsX2ecqx+oZ6BpY+edquCfa1/nHKtfquHhp92mZJ7fJd+qoiijJKMnX6re4mUkJ+Ae61XncV7j3CTwX2BlW11b4xtZXZlhm9hd25ybomKko+DbpORZnB1dXFhZ21lX29paW5nZFhTXWFZUlNDOUlJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNPGxrK0oJ2jjqOioqyvtq6osaaoqqatq6umoaOdmaGVn6Wrn6Gln6ioop6dsKyXmpaop66rp6annpeUmaOhkZSgrZudpqOvrKSstaq6zrKtpq6sl5WcnaKZnq6snJegmp6fqbKrq6ubraulo6uarrGhqKuupZikqaior6GRlaKjmZORhKRqpHWJeql0erJwgqaKmYxxiKCah6RgYFKshX+ug5t2rYGnhoWfepmXhntmgKOJpJmGgqN9qX6CloeuX3ypVp6jkoF6o5+Ae8OvxYtyr7OzuXFiqa/CdGiMjJiOgm6clXFvenh5cG1nZWVycGZ8aWNdV2BqWFlVTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dS/oZmrp6Cvop6wtLCuqayip6aoqquppKWfm6SenaWnp6Ocq5qirKGjn6+hnJqSq6O1r66gp5qdlZOmopCaoqign6WcsaWkqLGtt8iytaqsqZaRnZyimZ+ls52aoZSdn6esraSwm62qo6OqobOtoaqzsaGaqKetrrShkZSippeakXypbJ6Eh3WreXywb4KljImflpaflIHSuLS4yYGBsl9glKmDpImHoHqYlpp4qsl0mqSVqKmRkpqNgZyKmsbGeWehgqV0gZ+Ogn2vXXC0YrB1S6OGbadHgpNkj5CekXxxmZWBcXx1fnxuXGZqc3FmgWteYVlkbVxfWUlNTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2osq2spaKcsrisqqGlmqikqquqpp+mpZiqo5+uq52loKyanqmlnKe2nqKXk6iqtbKsm6WcoJSPpayRmZyoo6Cqp66hpaepsLXDsrOqraiTipecpZuho6+ll6GVmZylpq2csZ6vqaefrKO3rKGxuK+dmq6msbKxo5OWpqKZno6CnU54moF/n3qEo32DpIWHpp+cnpOEuHt7ebmCf8zGwrZ4m6GQi59+mpaXinaemIqlmKSpf7CFnYaghKx9mpVjpm2kcI+FkIF9loJyrGCjc3GAmmC8fVJVdI6So5Z7fpSTjHZ7c4aAcVxubnhyaoFvW2RfaW5iZF5MTFFUQUlIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXVpaWlhVU09IQDg4Mi4sKi4rKicnP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7mqrp+boayys6WeoJWlra2uqqecpqaao6ehs66iqaayoJippJSjtqKilZehqbS4o5uhnKKSj6GxmZ6bp6ahorCunKWoorayxbGtqa2pkYeQnKicoqScpZeemJqapqSrm7Cir6WnmK+ku6yhtrWtnZy0sbevsaWXnK6go5yFj9G1w7d5h46FkZOQgKZ5lKF3jKCRhKWBinGqhoW0bnJqmaOclYqefJiZhoePc6+CppyjjqaLk52LlpCbbnGyXaV0k3qcbJl/e5l8balho3Fxf59ic7K4aHePlKaYfY2OlY55fnmQg25qeWl6c2+AdV5lZW9tZmdgSltYWDxISEBVNEBGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dW1taWFVSUlFGOjIyMy8vKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZJzjIqtvr+8urSelqekrbWhopmUoqimrqurmKain6agoLano6insKOUrKOOpK2inZCamqqzs6ScpJyokZSXrp+fnqeknaidtZqiqqS2rMSwqaupoYyEjpyioKailZmanZmbmaalqJmtqK+kpputpr2slL2vrJ6hr7K4qbKlmqiwoqeXeaiRfXywd4qApKWInG2ycKGHrXyhj4OnlZiArImFroWflKqgoZeGn4CZlYB7kn6rgJ2bloureJ2hkoqUkoF6r16kgX2mp2SdgHyXc2qvXaVrcIWZXWBbjKBtlZGmmYOWjpmOfHyEmYBrbn9jf3RugHpgZ2ZxbmhnaENZYVs+S1UzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVJTU1ZaXV9hYGFhYV5dW1pXU1BPTkk3MDQyLiosQVRWVlZUVFVUVVVUVFVUU1RWV1dYVlVVUUhGSUojKCi9k5qDqMXCtsCznpqsoK24paOOm6Sin6+wqp+kn52tmZ65oKOroK+pma6hkKuoo5aJmpCusKymnqWbrJeXj6yhoJ2moZqlna6Yoaint6nBr6WppJ6LgI6bmp+mnpKUmZuUm5qmpaabqqytpKWfqai+pJbDrKmioKuyuKmspZ6yraeol3WvfpCLnIWHfbqtipllsI1lla19oI+DppWagayKhLCFppqkoaGQhKBcbGqBs2B/rXt7g4GxbWdvmZmMiLFbfrVcpIRryKJkn4B7vFh2tVmyfVKugHqsWIChbZiQqJuMmJKZmXx6kJ9/ZXV+Y4Z4dIF8YWpncG1nZWZPVWRcQVVfPkkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5QUVJUV1peYGBgYWJeX1xbWFVQTkpGQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+ysbe9urPBsqKcrKaktaigipqgnpyzs6mfo6CetZmgtKiqrJ6vrZ2sm5Wvp6GOiJuOr6uopqGlma6SmI+omaGdpZ+ao6OlmaCiqrOpvbClqJ6cjn2Lm5ahoJiPkZqckpqYqaCimqmuqKamoqSpu56gxqakqKCqtLSrraWeuqyrq5SAqZKjr46bf4ekl5mQgoC4w7qDjpyShKeXnIKsioKviKecm6aqkH7VvcKqYqO/vX1+o4KD17q4tYWVk4Oevb6EbaOCb6uEbJx/erKwx4Npq7C9rHh3or68c4CWjqadkZuSmp97gpKce2R+e2WPZ3mCe2FsZWtqY1BiW1NqXD9UYUNOKT06NC8fHyQfJTIgHSQoMDQ5NjY3Nzs+QUNGR0lLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz89QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Owv7ixvLKinK6mpLKmnYuYpcCquLKoob+mp7KcnrGcuqifra+lp5SUsKuXjIObka6loqygo5yqoJeLo5KmnaecmqGpo5mfoaytqrquqKOalpJ8iJmRppuSj5GYmY+YlKmboZmqqaGrp6CjqrueqMSin62iqbOzqa6on7mmra2Zc3aqpbiGZImgcGiukYqQbm53pJCZn4F1rpiUcI+LcZWoo5uXrqRybGxsZot4b26CmXGBempxaWeKl5aYcWlphYhncYZkXYhiam9ZXGZ9dqZfYXGOkW5lZX+Nk4+hmJmZk5mhfoiRlndniHhpj2t5gHllbWNmbGJLZVhKbFo6UGVFUidLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXF5eXVxcXF1eXV5dW1tVV16plKyzqbm4srOqqaGunaOyqZeSv7PFyr+3qp7ArK2koqesn7qjpK6rraaOl66pj4uFlZatnqaqoJ2ko6CRi6SSp5ipmpejqqGWnaamp7C7rKyam5KRe4SWjaWYjZGRmZWOmJaplqCYqaObsaadoqu5n6/Bp6OypauvsKmsqqa1oqy2lYqhqKa3nYmWo5mHqpuRlZ2SqbKZmqOqoLKWoqGdn6KcoaWhlaunjZKSjIeTnJ2VkZmTmZGPlYaBpZuYlo6LlJSMkIaEfWeJfnSCdXOHinCnbHqUkZOSgYGNj5CPnZWil5qapISJlo9zapF3cYx4d316am1kY29kVWFZQGpcSGNhT1krRj0rJyE3NTAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFVWWV5gYWNdXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpaXFxeX19gXl5eX19gYGBfWVlgppaoqqS0tq6uobCjrZ+gtbGQjqzIvsW7uauipZ6cp5+xqaO2p52ptKaokZisoouHiY+cp5WspJ+Yp56ekpSjlqiaqJqUpqGkkJuomaG2u6irmZqPjHyBlIuhlIqVkZaRkJSYppCgm6qfnLajnaart6euwK2itqWur6+rqKixt6Ctu5iRpaSmtqKSnqegjqqgjpKfo6uvmqCjr6ivmKOgnKOqnp6enJarnZOZoZuUkJarmo6ZmZeRlp+SiaGelpWFko2RjpWLgH1mi4V1hnV4h4JznGqFj5STkIl8i5WSkpiUo5OfmaSFipqJfHOXc3uMgHN8f2pvZF5wamBbYFpuZFBgZVBaOkdHRT4yPT45LyomKykmHSY0MTY2Njg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYGVWUEpBQ0I6OUVNVlteXltaXFtbW1xdXV5fXV5fX2FhYmFhYWBiYmJkYlxbY5eVo6eir7GrrqOppqyfp7WqkI+dpbW8sK2toqOaep6jsqSlsamXm7mmo5OZqpyOhoqJnKKPrp6ilaifoJKWmZuui6qWj6iZqY2ZqY+furekpZmcjIh5gpSMm5OKlZKUkY2Sl6ONn5+pnp+4o3+Dr7Wir650o7yisZ93eJ+osLmUdayjnomAq39kXGJ2oI+ln4SXfW2Ss5yjp62qomWen5JzeZqXcICYqJhtf6KoimWcpp2SmJiWjZKckoaem5CWhJKHj4+SiYV3ao6GdoZwe4V/f2Boh4qUkotadZSQZ2iQj3N7qJybZnqaiYR5mWqFjIRveoBrcmVfdnFsa2hcZmZiYnBTWz5OTk5TRz5AVUQ6MS8eHyY0OjMwNjY3ODw7PkBBQUZIQkdGSUtNU1RVWV1gaGZnWFBKPERHPDhVUltgYWJgXl9fYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaajoK6vrKuppaitoqetpJKWq7axs6ebq6esl3OMnbCgqKunlJe5oKCPnKSdkX+JiJuejKyaopWnoZ2OlpKehHWtj4inm6mRl6SJnLu0qKCZmIuJdXeTjZaTipSRkZSNkJShj5yhp5mcspWAjJu1nbOMko66pqB+p6J6oa21gI6NpZ6Di4aQsaqvjIqXpJt6gIushpudoaeop4eVhZh3pZt6h5yBl6eCgnucsnqKhqGYmpWYloORl5eFm5lieoeQhY+QkouDbXCOhnmAcH+AhH6Fc4WElZF4lmeSdKCadX2ZhaOgiJh/lIyFhZprj46GbHh7cXFnZHdvamxrXGVramV0XF5JVExSQEU2LlpVVTcpITA5Pj43NDM1Njg7Oj0+PkBEST9JRUpMR1NYW1lbYWFoZlpRSDlETDs+YVZeYmRmZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJein6WsrKuorKCnr6amqaWZlK/Iv7Gil6iptp6QhJ2snKeioI2Qvp6ajJ+aoJB8ho+Zl4esnKGWn6CRjJOJhoCRp42Ho52klJiehp66sqiempKOhXF2kImVkIqUkI+bjJCSn5KXoaWWnquHn7SJtJqtisqHqayItoWNsIGvrIKojKaYjZ19qI9ye3ecj6eXaJWkebSMn56mp5KYwoF/q4iYoXKegJqlfZeFlbKBoX2hlKGQmJeBj5Sci5mSi32Fk4eOlpKJg21yj4V+eXGGgIN7g3SEgJaAj8Vmf6mHj6NrnoWknYSagY6Ph4uacY+UhWh4dXx4aGh2cGhobF5kcGxmbFhnR11STTNFNDZOYmQ3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TklKTENQWl1cV2FeaWxcUUU9S01ASmNYXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSWop+vp6iopaufo7ewqaummpSgo6SrpJemq7ijr4ChqJ2mnp2JlL2Zk42hkp6PeYSWlpGHq5mbnJmhhI6Ld5ucj5+QiJ6knJaamIejua6lmpyMjH5ibY+Lk5CNkI2NmIyRkqCPlKGhmaGnfqGnh62doJatj52cnJCFgKCMqa2Fo42pmYyaf6J1gJmUa4Ktdk2reIeNnJGaqKaAqat9g6F7eqdqnn+Sa2eXhpe3iZ5+bmBkWYOXgI17ZGiLcpl9eZZsXX2XbV9ScINcX2t4gl9YZIF8g3+XcKeqa4OjbnKlcJ+FoGpnoG1bb4x9Z1pghIBiWFBvd2ZtdHJram9danFta2lYaU9dWUY5QTVIRF9sNSxJQ1JNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1ddXmJ1YE1EOk1PTlRiXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlZ2guKCpo6askaC2u6quopmYoaKlra6hnq+1o6iSoaCgp5yajpm0mZCLn4yVi3WBlJKMiqaVlZmenn6ShYWspIebkIqZqZmam5KIprGnopaaiImAaW6Ih4uOjoqLjZKMkZOjjZSfoJyhpH+TgY+ioZSgdpyVj6eCoKZ/haerg6V4iXyEmn6icHOUiJZ8n415bYabjJmPm6iZjoede4Kic3amZp5+d6RfmHp9k3Sibpi3tLp0k4iDgLWoZIHGuHtwlbaMcoCao2JzrKtgfGmds35tfIaBjYKLmHF/o2xyo3SfhYGkYZ2Zs5ZyfZifs3VzW56yg2pib3R2cWlvWGttc3JmXWleYkxFPUQ2UUJaczM9U0dfSlI9PDM5NTo6NkQ7O0BKUD9VTU9RQEVfX1taWGBgfGRIQzhNV1VXYmFaZWZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2hok5WUo7eYqpuTn42ktrSsraCaop2ko6aunZyyrqyTmKKaoaSZmpSeq5uLiJJ4i4VxgJaOipChj5KUnZh9kImNqKCHl46JkqSUnJuNi6mopZ6QloeFfmp7h359kI2Di5GRiZCUoYOXnqCdoJ6LiXecmKKNn3Ghioeph5uljpSmqX2tjH56oJl6o5N4gXSWiI2cfZafhpuOmJulhaJkoXyIlpCbjW2eaJuOb5qZeoCLp31yaXSrg5+DdKpolZpdm4V2hZ5nqmuAuGZcqHCBnGCVjF6ndnWHiH6eaJp1hpOSl46An2+akW6nml2pf3m7a36qXI6EXbRnXG5yenhraVxxa3l5Y2BmWGJCUUZPN1dDUm81S1taX05aREEyNTE7OzZIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TlteWWRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcWBkZWVrZWNpaGdraZWbiam0mqeIY5Sbq7mxr6yeppycqaCfr5yesamtnpekm6GgmZaWoKOZhomNaoiAcnuXiIyWloSRlZiQeoqElaOcipSPhoyfkp2diZCpo6CajJKKgYBpgYZ5f5eMe4mOjoiQl5t/lKOfoKGTmHJon4mfj4twkoyAqYeYnqGlnqZ7sK2joriXd6Ozo6SAiJR5nXurmX6ijpyaloiXcaF8hY2vtX1rmpGheX6YtaKkq6iEmXybfZ6bf3SqWl1ve5aLeJ5iTH97eoVjeZdCTJ9Yompxe45sgIiEmXWbeIaJsbN/gJuTp3eDnm5zfZVwmnRrpF2VdkhlZGB0cX5+b2ZgbGl2fGRlYlFfV11UV0BaRlFoRFNXXGJYXklEPUI4P0I6SUY4TEVYQVdSW1ZERmJcWmBLYG1+ckVCPFVfYlplaVZnaG1vYmZnXmFhXF1eYGhiX2Vjdm1dZWdma2RmbGloa2mTnICwrZmEU16gprO5srKomqKMnKycnKqUoqyko6iPoJ6dm5mWmKGdloiHiXeGgW95lYWRm4t8kZOWiHKAiJKhnHORkIGJmpWhm4WPqZyblYuLi3yDbISFcYKhjHiGjYiIk5mWfJOkoJ6iiK2GfbWEjp6ce6WWeqmBlZuPiZ+bfKdod21+mXShc3J8nYaZcJODrn2kg6WdmYCjb16oZ3WiY2+lYZzTkH17mXhzc2KihpB+o3SkkHZrj7OMYIKYiXOqsqi8f3eDbX6/pqm0XZxtfHCWbX9yonJdpGdzpmBopm2b1Jp+hptweXuXbJx8eJdzbqmkZ2BlenGAhWxoZmRudnhnYGNTXGZRUWJIWEpVYVdUW2VqXGVRRkNLTUpLQktFOE9AUU5YU1lPU1FgZmZqUmN3eXdJRkVjXWVaaGpUaWhqb2NqZ2BjYFxdXV9oYmFpZXxkXmRnZGtkam1naGxol5p/r6pUXEt+qa+xs6+yo5uZhZmpoKGkjqapoZmqipqYmJOZk5KhmI6HhXtwfYRofY+DlJqBd5GOj4lvf4aPk5Jsl5N8iZKTpZeDj6ublJOLhol5g3aHgG6Cn4Z4gZKGiJmjmHuUo6SZn4mzoaK2i3qsp6SupXCpgJqOhYCakHukgKGZhphynoSkrq+Kl4yAjaSNlYKtoJN2tba1yaFzlIuBn2Cdl6ltepWHoJt0ooh3oH6Tl4uBcE1mo5JwmodzpHt5dGGDgWt9oGtxZF+ccX1zlmh5abO1tMamc5h9ep1rnJurdoWbbXZ4mGqae3WYclFFfbNfanZreohma2hjdXVxbldfVFlpUFNoSVZNWVRWXWhrblZnV05LQUpNS0hKT0FRS1BlY2ptZXRyc395fG51iXt7VFBObF5pXGtpUmpoaWxobGZjZWBcXV1eaWJkaWt7X11kaGNqZm5tZWlsZaGbiK6lg2Q/k6Gyqq6vtaKikICXqqKjpYylp56dpoOal5aOl5CPnJOOiIN6anmHZYONf5igeXWPiYyBaYSFkoOMhZ2NeY2LlqaTg5iqmI2Si4GJeoB9i3lwkKGGeoKVh4mWoJZ/lKWonJWVg2ZueJxsomR7caV3m5hwZ6aAlYp6pHqfloOXcp53gYqVl4+5bpGKomJ9mKCViG1yaaprdaBtb6ZfmmmLkGmWh5uWdaKBfppgjIaNdXCIYmigZZ5+aZt1b2NmiIFtcaJaXltioW1diItuen1zcmSlbXiiZGenaJlzjJlwom9ViZBvoF9mqFSLXlSYbm1za3KCbXBpbHl0a3BSWVdXZlpUbUlZT11JWGlpc2pZa1ZRUkZWXExYU2FVaWtfd3R7fXB8fHKDe4Bzdo2AhHZeUXJiZ2NwZ1BqaGhrbG5oZGdfXV5dYGpiaml2dV1cY2hjampzbWZrbWOco5eleWRzbYumraOpsLGmn4uAmKudn6aMo6Kbo6KBlpiTjpqQi5iQjop7h3GAiGmLi3yYm3N1iX2Qe2SDh5WKipWZgnyIh5eokYGjrJCGkYuCin6AgI5zaZCmhH2HlI2ImaCPiJOppp2IpniVm36kiJaLsZidkIKvl56ldpSGeKlzpY+Emm6kooyShI2Du259pa+ChoWGk5Wcn3ylenKolaCWZp5+b6xkloqWk3eobaqigYl2iYN3q5GmiGuRsGt2s4ypa4qFbW2fnpKVYH6ri6p2fn6LpZ52n3yDpJWdoGqbiHisaJ6tjLZ0d76NpJNag6eOq2F1cnRwfHVxY2t/b2ltU1dbVmFiXWtNXVJdSl5tbndfW3FZXGBbZ3Rlbm9yY3J0YHd6fnlyeYNzhH+Be3uMgYKAdmJ4ZGNucmRSa2dob2xyamZpYWBeXGFrYm1sem9cXGJpYm1qeG1nbG5ilaSpnIF/naOWqamdqKaupJmKgpismp+lipumnamdhYyaj4ackYWSjYyNdId7iIRvjYV+mJN0dIZykYJtf4uRh4aTjn17goaYpo5/pqeOgY6JhZV2goeSb2yLqYGDjJSOiZ2fiYyUqqKfj4B1lJeIfoF5lK6if4GbcY+Gd46Jgn17cqeMcX19epiWm4SPeXt/foeUlZOKdpCYnqCDe32Ja4yFW3l5cnpxaW5+kolxgHWBj5STcYeEgmWMf1+Bf4t3dHKUdW95bm2HbISFXnVnd45lgICFjaiafXR7lWqJiHCBdn2Hd25uaIxzenyYeIVcbFh5j2lveHJxb3h4cF1rh25qZ1ZbYFddZmtkVmNVX1FfcHh5bGt2Zmtra3d9cnJ1dGFvdmJ0e4J4dXqCdYCAgIF4i4WDfXtuf2xkeW5eV25naHVreGppamVcYFpjamVtcXRuW1tibGRsbHluaGxvYY2Tt6imiaCimqajmKScq6KhhISYrZKeoYmbp5upmIOBm4t/lpSHjoqJjXKDfI99fo+Fe5iPdHKEcJWFe32Si4aGj4R5foCHmqWOfKihi4aQkIWVg4aOmHdyhKmGjpKdkImfnoiMm6efn6qDiI6Vmn5+iZatp4+Rpo93b5uPgXiQbn6ohXB9lXFrcH2BoI2Ak46LaGxcgouLm5qejnOVi4hxdGuBdnSBWXJuh5GBfn+Mal1qZHuGhImAYGl4epp7goqBdYGFgWd3ioZqYXBxgXRecYqBiI6llIVli42DbneLhHGGj3pxaGhlfIR7lltca2hudlt8eXh1bnNzg2dcbYtra2JaWl9bWWxxXF9hWl9dZXR/e3VwdGRra2t8fXN8eXVkbnVobXx+d3p8e3l6gIB+b4aKhHt9dH55c39oVFxxaWx2cHVna2hkXWFYa2hra3FybldbZW5sZ3N6b2hqbWCLiqmwoY+ioZqenZeemKijon6Dma6OoJWInKKRpZV/e5iFfZKZiYmGh4pzfoGMdoWMgoSXinJvgHKYhoN+koOEhomAeoGEjJyhkYOnooh5jpeJlYuLnJeEg3qtgpGYmpWKnp2HiKGqn6Gio4uHk5uco5mVqqGnpp+SmoeVjHp2jY2Dp35/kpCTlJ2yppuVn5CNsZKXg6WMjJWan4mQm4KIkYprfI53eGWDh5GLfImehIeMkImIgYWEkHd8enSZoIiGiZ2JhJN+fYqAgHVvcoSCfneGhoqPpZCChYyGgoyQjH2IjIqRhHptg4V+eplrc2lhdIpxfnp3d293dIJdXm+HaG5fXlpdXVNoclZkXV1ibGh1fHxzb3Bka2ppgH1ueYByanBxbGeBe3KCgHh/fX+Ee22CjIZ8enl7fXqDeE5jdmpzbnB6ZWtlY2JgW3RmcGdycW1VXWx0bWh5enFnaWtkjIecuZ6WoaCYlJiZlJikoJ58f5qsj5+OhqCdi56WfXmUg3uOmYqGg4SHbnmBgXOBiH6JlIRta356l4eEg5B/gIeEhXyHhY+cn5OHq6CEc4uQhpKRi52RfY17qoSOk5iWj5yWh4ecpZ+imp2FgpKamZiPmaafpZ2cj5V/j4h1e4aNhKV7fI6QkYaZq6GelJ2QjqmNkICdjIiTmZ6Cj5d+ho6Db3iGcXVgf4SQhnWNmYGDkIOHhX+FhJVueXZ0kqGKi4Wag4SMc3+Je3xycXqHg3p3iY6DkaaPhYOOgIOKiYp3homLjH5xbX+CfG9obG1oX3p/aH58dnV2dXt4XF9xfm50YGNbXV9SZ25UZVteYmtpdnl/cWxtZGtqaIF/bHSBbGx1b3pwhnluh4B2goB+hXZxgo2Ifnt7fH97gopgaHtqdWhpgmRqY2BpXGN1aG9idW1sVWNxeWVwentzZWptbYuJnraZoKOfkpGVmIuanp+ee3ifp5Gci4ellYuYmXl6jYV8iZGEjIKCg258gHlzgYV+i5F9a2h9gpeJgYiOfH6GhIZ8j4KQnZ2TiaidgHCMi4yShqChioWMfKiRiJCSl5OWk3iNo5+gnZaZf4CQmpiSjJqioKOZl5CafYyDd3+Cjoagf36MjI98mKShopOakZCmjI+BmpGJkpebfpOSfoeOgXVzgnB3YX6AjoZyi5Z9iIxyjH+ChYaPaHhyeIuYkY9/ln2IinGBhnt8cHd6ioN5eY+MgpSkkouFj3uFhoeEdoOEiYl8Z3N9gHl7cW1rZ19+c2h8dXZ0fHOAal5gdHZwd2RjWV9fUmtpVWVZYGFoanZ5gnFna2RsaGaAgGtufmhvcWx+eYd6bIyBc4GBfoF0doKNhn98en+BfX+PaXKDbnRpYYdobGJfcVZ0b21tYHhobVdqdHZjdXp7cmJqb3qJjJ6xkaWknI6Pl4+GnKCbnX13paGOmICNo4uImpZ5e4aHfoOJf4mCgX9yf3t0doOFfoqReGdjfoaXioKKjHl9gI2DeZaClpmYjpehnH5wjIKRk4alm4eMiYOmlYWTi5aYk5J3kZ2goZeUlnl+jpeXjZaanKOdmJKUmniNhIJ3g5WNnX6BiY2Mc5ejn6KUmY+PooyKgpaXg5KWmX6YjXyIjYF2cX1ue2SAfIuFcYeTgJGCbIeDgYCJhWZ1b3uFkZeLfJJ3i4h7f4V7enF9d4iEeYOPiIqXoZWBg4t2iISDgnd8g4qHeGB6eX50f3hnbWVhf2pqd3N0dn5xfGNjYHNudXJtYVphXltsZVJjWWFhaGt2eYZxY2tjbWZofINtaXVobnBpgH2CeW2QhnKAg4N/dHyDjIGAfXqCg358kG12iXN1bWWKbGpiYnZWhGlwbmB4Z2xianZwZnl8enFgcmyGhY+brZemp56NjJeHhp+Tl5l+eKqdi5l6l52LjJiQeXyBjH58hHyBg4F4dHl6dH2AhICJi4BkX32LlYd+hIZ1fX6Lf32YhpeVmI2kopl/cod7k5GJpo+MjoqToJGDkpCVl5GLgY+Yn5qRkJBzf42Rk4mdnZ6ml5eMlJVyi4yJa4SXj5l6h4iPiW+XnZqklJWLjJ6LhoGRnH+SkpWGmYh7ioqBeXF5a3VsfH+Lfm6Gk4OVeHGChH5+i4Blcml7f5aXg36Nc4+Hg3iGfHV3f3yEf3uCi4OLk6OPeIOBdImHfYB0doKJhXBhfHZ7cn1wYm9jZHxjbnB2c3h3c3RidmBvbHZub1xcX15eal5QXVljYWhudHuJa2BpZWtjaXeHbmdsaWttaIF9e3dvkIhzgISEfXSBhol7g316gYR9fY5yeot4eG1sh2poX2lyY4dncW9ld2dubGF5aWt9e3hwYXhti4CYmKmfo6idioqShYqdi5WYfnivmY2XfZ+UkZeTiHd+e4p9fIB3eICAcHV0fG+GfYGBin98YVx+j5GGf4ODc3uAh3qPkomTkp2TppyWgn2BfY6KkaOIjoqNmJqNhpKZlJaOioiMkpySj4yMboSQj5GInpmioJaViZaQbYeYg2WFmI6TeomEkIpwlpqUo5OSiYuZjIF/kJ19ko6SjJmOe4qFh3NzdmtwbnV8inRuhpGPk3F1gXyBgYh8ZXBseXyZk3yDiHSQiYBzh3huf3yAhXuEi4eCi5SnjHqGe36KhXd+cXCBh4RlaHl1dnF8Yl9wYWt0X3Fqe3l5bHNwZXlebmxzbXJYW19gYWtbUFdYZWNncXF/h2ZdaWlnYmdxjW9kaWhlaWmBend1b46FdIGCg3t1goiFeIV8eISFen+Jd3+Le3tyeINqa19waHSAa3JvbXJnb2xlfGNugHp3cWx3d4p+opehp6Cmm4eLi4GPnIeTnXaCq5WTjoehjZaUj39zfHaFeHl/c3N7hmtzcHpui3aAgYhvcVtZfpGNh4B/f3Z1gICAoIeSi5SemKKVmHiKf4GNiJydio+GkpiWhYmVmpCXi4uMjYyciY6Qg22Ji5CRip2WoZuXlIWXh2mDooFlhJyJkH6Lg4uBd5OYkp+TkYmJlI1+fY6Xe5GMj46aknyKgIJvdnBsbW9we4ZpdIOPmYtxd4B1goiDeWZybnWAmY57h4N5k5B5dYdzb4d6hIp5ioWCh42aooZ7g3WCi393eW5sgYWDXnN1c3FxeVpfcWFwa15wan17cW1tam12YHBva3FtWVliYWJuWFFUWmZnY3VwhIJiXWtuZGNma5JuYGdnX2hrgXVyc3CLgHV/g4B4dYCLgHmFf3iHhneDhXyGi397dop/anFjfGOGfG5xbXRqaG9sdnhfcX95fHV1dICDfqSVmqyep5aFjYR/l5SDkKB2jKCUk4aLm42Wjot5cXh0gnByhXRxdohscG52bYh2g36Abm5VUYGrlIeDeH93coN6g6CCk4KVlJmck5t4knuDjJKjmZOOiZWZkoSHl5mMlIuJj4+HnYSQinxzi4WKjoicmp+blZN/k31ohJuGZ4Wfh5GEkYKJcYORmJCbj4+MjI+Md3uRkHqOi4yRlox8iHyAa3ZqbmtsbHt/Ynp+j5eBdnuBeIOMfXlnc2xzhpWLfYeFepOPcHmDb3aLeYiKeYh8gYuPnZ2Ee3p2got8d3FqbIKEe2B4cW5tcnRWX3BicmFgbW96cWhvZmZzdGlxa2J3ZV1XZmBgclNRT1xmZV15cIh8YFxpcmJiZWaRal9oZVtncH5wa3F0in12fIaAdXV+jHl7hYF4iINzhoV+jIyEfHmVeGZya4NgiH1vb2t6YGpudX91X3R9eYZ4dHOFfXigj5mwm6WOgot/g5mHgIyfgIualI+FiJiPj4+EdnR3dIBxcIV0cHKEcGtpd26Dbn19bXVzUk2C38iS1pN7cHWEdoSgg5R3lpGZnZGZe5RzhZCeoZOTkImTnJSGf5eWiI2NiJKNiJt/joB3eo1+iYyKnJucmpSSeYx1ZoeQhWuHooSRiJeDhmOMkZmPlYuXjIyKi3F6lIh7joiKkpGJeYV8f2x7ZXNwa2x6eluBeZCQgXp+f4CGjnt6aHJqc4qOiYGEhHyUimt9fm1/i32KhXyDeICOlJmZinx1d4OPeHJtZ3GAhW5rdXBoanVuU19vZXBaYGxyeGdramJmeHJwcGNgd2BgVmtfXnZQTkxhZ2JdenGJdV1cZXZhYmVljmRhZ2JZaXNzbmtxdox8dHqGgnV2fotzgIZ/e4l/comIgZGLiHx+mHZlc258ZYh+b3BsgFlsbnl5c2B2enuNdnJ3ind5noubrpqgkIKFd4iVfnyKnoiGoJKPhYyYhJOOh4F0eHB5cW+Eb21vf3NlZXlxfW16fWpoa2OkmsHcrvChc2x2hHaFo4aTcJeRlqGVnIGScoaLopeJjZWKkJ2Wg4GWkIWJj4CRiomWfod6dX+JeIeEjpyamJiOj3aJdG2FiIl8iaKDkYmchIVei5OXi4+Jj4uLhIlte5aBfYiFiZGPhnaFfX5rfWR4dWpueXNYiXuSiIV6foGBhox/eWVyaX+JjYmBgn6LlYRrgXVtho+BjoN9gXh+j5SSmI90cneHjHVzcWd2eoRjdW5xY2p2aFJhcWdsVl9vdHphcmRgaX1wcm5bY3JgYlZuWVx4Tk1MZGZiXndziW5cXGR5Xl9lZYVgY2NfWWpza25rc3eMfXR3hIF4d3uJcYOEfX6Ie3SLiYiWhox/fpdzZ3VyeWyMe250cYFXcXp2eXJld3mHjWl2gIlyf5yGmKabo5KEfXGMlHd5jJ6FhaGNj3yWjYCZiIR7c3dwdGpwgWxpbXx1X2F4d3xxdXxoYGR869q1ycPch3NsdIJ3i5uJj2qZkZCelpSBiXGFiJ+NhIuVioyYlHyNk4iDiY97kIuFj4F/dniDhHKIgpOclpSXhYx1hn5vg4GHhpihgpOMnoOJYYOUj4eKhomNh4GHaXyTf32DhImOjYJxhn5/cXdodnJpdHdsWo19k4OFfYCEgYSKgnZhcmuIgI6JgX5+kZB9bYFrd4SNhJCCe4B8fo+Rj5WIbnB5jIV0a3Fsc3mCYXVqb11sd2FSZXJpZlNgcHZ1YXBgXWiDcXNqV2doYmlYbVZbdUxLTGVnXmJzc4VqXFxleV5eZGd7YWRfXVlrb2ZvanR4in5zc4F+e3Z6iHOFg3x/h3Z3ioaPmYGMgnuTdWx3dnl4k3RueHt9WHqGcYBvZ3l3koNkdoaFcIqWhZmgmqKKh3Rvkoxxd4+cfouaiYl8oH+EmYCBeHJ0bm9kcn9pZm14eFxgeXt7cXGAamFnYX/Vto6RpnhucXd8cZORjYhrmo+JnZOMhntph4uZhoGSkYaHmI58jY2BgYqNfI+MfYmEenR6g3txhoCWmo6Tk4GIdIKFdIJ/iZGcnYaUj59+iGJ/k4eFiISKjYCAg2d8kIB+f4KMj5B+bYN8gnRrbXd1dHd2bGOOgY+AhX59hn+EiX9wX3FvhHuOi4F7fpCIeXCDZXmBiYWKgXqEfH6SjY+Rg21ueYt+dW1ua2x7f2RpbGpZbndaU2pzaWJRY3J4bWNmXlpqg25zYltnX2RsX25VW3BPSE9nZVxnb3GAbVpcY3NgXGNsd2VlXV1aa2xjbWpzd4Z/cXB/fH10eIZ4hYJ8gId1eYmBkpV8iYZ2iIFweHl7hJNvbnuBd16DgHSCbWl6dJRzZ3OIfHGSkYOZnpughoh2dpR/bXeUmH+IkISLjpp9jJp2fnZxcGxqYXV8Z2JqdXpbYHh8em1xf2VjaGdXnY9fcXOWvMSEd3GUipCAdJiMh52UjYhza4iPlYB7lIuBhJuMfIqGfXyJjH+Th3SJhXZ2fYJxdYaBnpWGlI+CgnF+h3ODeoiWm5aGko2cgIhmfZOCgIaDiYlygX1nfYt7eX9/h4uPfWmAfIN2Zm95eHN3dGxrj4aLgot/eYOBhISAa15wd3p9i4eEe4COf35ygGh4gYaJhIJ3gnp/louOi3xta3qIfHZ0b2lofndlXXFjWHB0U1Rvc2liTmh1eWdhXl1Yb4BvdFlkYV1qbWBwT1lsUkRUaGJabG9te29ZW15tY1pjb3dkZ1xdYGtqY2xpc3eBg3Fufnt/dHWDeoSCfIKFdn6JgZaReIOKdIGIc3l5fo2Qb297gXFpgnl6fm5tfHaWa2p4hHRrk4yFnpigmYWIb36Mdmp5mY+AgoqClpiKeo+Wb3pzcWxqZGB0e2lgZnJ7W2FzfXpncHphZWSOsbJ3S2JapdrRl3J7koyReX+WjIWako2Gb2yFkpF5eZOGgISZinyHgHl4iYqElYBviodxdH17anmGg6WRhJOMgn5ufoJ1gneEmpeSipOPlIWHcHqShH6Dg4mDb4F4aICFeHJ/f4OKh3xlfH6DdmNwc4BpeXFvdZmNhoSLfHd5gIR6gmtcb3xyf4eDiH2Fh3qIcYBtcIKFjYKDcYN3f5iLjYN3bW1+g392emVoan5yYVp4Wllybk5YcnRmYEttd3ViXlxbWXV9cnBXZl1manFfb05XaVM/WWdfW3BrZ3lxW1tZa2VZY3B5X2hdXmVsaGZsaXF4f4dvbX99gXVwgnuAgX+Df3aBhYmXinGCjXF7hnx6eYSUjHVren9rb350f31vcnx7lHBvgH95ZpKJgqGYnZGDhmeHhHBnepeKfoCFgpmKgXyNjWl4cmxsZl9hb3ltYGJveVxkbIN6YXF2X2Rl1eu+izI6PouOgHJ5homPjXeFmY5/lI+Nf25thYyLdX2Pf4WClYl8g3hudoeFgpZ3boeEa3V7dGV5g4SnjIOPjIN9bX9zdYJ4hJqPi4+RkoyLhn57kod4gIWNg2yAcml/fnhtfHuBioN4YnmEgnFkcWh+bnVydYKcjIGAhn90dn6Ac4FvW2t9c3iIgYp7hn98iHd5cGuHgo6CiXGAd32UiYp9dG1qdoCAdXVcaWl5cVpXfVNacmZNW3NyZlxKcXhwXVtbWl11f3VpWWJbZ2VuYmlNV2ZRPV5mXV52Zl91cVtZVW9kWmRweVtoXmBnbWdqa2hweH2ObWqBhH95boF7fYF/gnp1goGMk4VwgItud32Ae3uIk4mAaXt+anR8coZ7c3d9f4x6eIR+fGuMjIObnZaMgoFsjX5raH+Pjnx+f4OUgn99iohrdXFnaWNbY2dzb2BhbHRhaHCJemFzdF5iY5ugkG5cNVqvtXVqgIp+k4d3iJiHdZCMindwbYWChnR5iXiJfZOIen5zZ3WIfn2Xb3GGfWh2eW5leomFpYeAh42JfW19dH5/e4qXhoGSkJiIi4SJfI+Jcnx+hXxpfm1rgHt5anp2goeAcmB3gX5xZHJndYJudXuGlZKCfYKAcHd6fHV+bVdtfXVzin+GdoZ0gol6d3JtiH+Of4NxfXt8kYeIem1taG2CgXVuXWhmdHJSXHxOXHFdT1xzcGRWS3N5alhZWVphcYF1YV1dYGZkaGhmTlpoTkFhZFxgdmFcdW1YWFN0YVtlb3JXal9iaGtnbWxpcHd8k2xohIl9fHB/fnuBf4J6d4CAiYuEcnuHb3F3hH97iY2PhGp+e254eXeKd314gIKHf4R+fnpthIyImKONhYR7dot6a22FiZJ5fXuCkoCAfYqEcHJwY2ZeWWdfcHBgYWhwZmpviXRhdG9bYGRqdnt/vpynpMm4coWEc5R9eYiUhHSSjYdyc3CEeoJzdYZ0iHeUiXl5cWR3hnqAkmhxhHVmd3ZkanyEiJ6CgH+Ojn1xfnKDeH6QjoJ3lYyUj4iCiHqJiWx5en91aHppbH95c2l6doCDfWhgeId9amp0aHuAanaBjZGVf3x+fnF8dnx0fmJVdXtxcoiCgnuBcIaJd3hvb4KBi318d3x7c42EgXVocGdsiIJycF1oY3RvTGZ2TF5vVlRadG5iUU90eWJSWFhdYXCCc1thXWhlZWNqZFFbcUlEZGJcZHFeXHhoVVdWd15cZm5oVmxeYWpnZW5uaHB3epNuaYiMeX1ze355goGCfHZ9g4iGg3B2g3Nud4KCfoiLlH9xgHx4enqBi3SDeH+BgYKEeoB1b32Ji5ueiH6Ge3eGe2d1h42Ren+AfImGhHaPgGdwbmBlXFhmWW1zYWFhcWxsaIluYHNpWF5jbYB3qdqpx4aIs3KKeXCOdn2IkIF7lIuAdXR1fnZ/b3B/bYV0lIZ4dGxgeYF5iI5lcYNvZ3VuW219gZCTgIF5kpJ9d3pshXR/j4qDcpWJkY+HhYV7f4ZtdXZ/bWh3Zm18dm1qd3Z/f3xgYniGemh1dmN+e2h1ho+Oln11gHZygHp9bYBZVnJ9b3OChn5/d2uIhnN4anR/goJ8eXt3enGKf3tyZ3NkbYuEbHNbal92Zklvb0xbY1hXVnltYlBTdXdZUVZYXmByhG9cYGNtZGNdb2NUXXJHQmZfXmZpXVp7Y1JWXHVbW2drYVZrYGBuZmZscWhwdniOdGuOjHV/dnh9d4GDgXt0foOIiINvcX91cXV9hYGJjYt7d394hHx9hYd4h3x9gX6FgHt+cnZ4i46fjIl7ind1g3pefoeajXmHhHSGh4R3iXtibm1cYltbYVVqdGRgW2hvcGeHcWFxZldcY2t/fMrOh7qia25vi21yhHJ+hot/e5KFenl0eXV0empsdmOEdpKCdm9nX3yBeYuIZXGAampxY1hte4aciYOCcpeTd317bYZvgImKhnCWjpCIhoyEe3l/cnJwfmdocmNteHFqbHF3fXx5XWV5gHdpdXhmgndodYeMjpV9c4dqb36AeG59XVdwfW1zfol7gG1uin9wdmZ2fn9+gHV7cHlzhXt4cWVyYG2LgWtyWGtfeF1JcGxOV1ZfVFV8a2JPVHZzUlJVV15idIZpXWBramZiWW5hWGNwR0FoXWFmX1xWfF5PVmVxWVtqaF1YaGFfcmZqaHFncXN2hnlulYp0f3t3fnmDh4B1c3+FhY6DcHB7eHd1eYaFh4yGenx/dYt+fYaEhId/fn99h398eHZ5dpGTn36NfYtudYB6ZISImIZ0kopvhYWCeoN1Y25qWV9bXV1VaHNlYFlkcnJngXJha2RXWl9pf3i+rnqfuG5idIdpdXxyeoSHe36NgHd4cndvenZlam9hh3WOgXNqYl59d3iKgmVwfWhra1pWb3iLpIGFf3CZknF/d3SAbH+Aj4Zyk4eMiIWJhX15dXNvaXlham1hbXZqZ2treXd6d1tnfXx4ZXJ9boR0ZnWGjYaWgHCLZ2t7g3RsdWJbbnpqc3qKe4BldId8bXBndH12fH5wemp5eoB4dm9lbGFsiX1sblZqYXhWS2tsT1JPaU5ZfWhiT1V2bE1RVFVeZnaEZ11hcWhnYVdpXFxraUpFa1piZVdYVXlaTldualldbGVdWmVjXnRmbGVxZnNwdIF4cJmFdn9/eH98hYd9dXOCh3+Vg25zeXt7c3KFhoiIhHmBfXaPf32EiY6EgYN7fouDe3d8d3aanZd6ioOHanZ+fWyEhpWBco+CcYWCfoKAb2ZsZ1hdW1xbVGVwZV9YY3J1aXZwZGViV1tbaH9wb3KAc4plZnp/anV3dHSEhXiBhXp3dHVua3pwYWhrZ4Z0jYRuZl5ffG96iX1obXdmamRWV3Nwjqd9hHx2lpBze3F7eGx5eo+DdZd8h4aDh4R9dXFzbWh1XW1pYG11ZGdmaXpve3JZZ4F2dWhwgHiCdmJ3hYt8lYJvjGtte4FxZnNlYGt4ZnF1iXp9YXWDdWlrcXR5b3h3cntlfX1+d3VuYmVgbIZ8bWtWamNyVExqa1BMT3BIXnxmYU5WdWVKT1NYYWt3fmZdZ3NpZV9XY1dicV1LS2tYZGJVVFVzVk1ZdmVaX2xgXFtjZV93Z21icGl0b3F+dXSZgXd/gHiAf4aEen12goN+mIVucnR8e3RxhYWOgYB6i3V0kIB9gZSOgIWEfX6Mhnp+gXZ7o6WKeYmGhWx1fHx1hIONe2+Fc3qFfYKDdW5qaWVWXVtbWlNjbmVbWGJ0e2ppbWhgYVdeWmmAaWxvgGdtYml7emt0dXVvhoJ6gX52dW56aGp5al9lbmiBd5CEaGVYYXZpfYZ5bmlvZmddVVhvaY+od4F6fJCOeHRufW1xdHiNfneUdIWDgIWJdmpzdmhpb1xtZV5uc19nYmp4aHttW22DcnRqb4B+eXdhd4WEeJCGc4hycHp/cmNxaFttdmRvcod6d2FygG9naXhzcWt3dnN1YoJ6fXZ1b2NiYm18fGtrVWliZ1RMbmhQSFJsRWF5ZmJNVHJeSk1VWWVseHtmX21wamNdVmBVb25XSlNoWGdeWE1VbFRLXXpfXF9sXV1bYmVgemhsYW9vdm5vd3V6mH13gIF5gICHhnp5eoN9gZOEcXR0fnp2dIWIkH6BfZBsc5WBe4KfhX+HfYB+hoKAint1hKyff3qIiIRscoJ6doGBgnVuh299gHSKgGpvbmVkWF9aWlpVYmpnXFpfdYJpXm1sXGFXW1xrgWVxdX1pal5teHdodXhzbod8fn56dnNsemdpd2ddZHNneneSgWNjVGRvZoGEdnZmaGphV1ZZaGOQqG9/d3+Kjnpwb3tmd215inp2jnGDfX9/h25kd3RlaGldbGJecHBbZ19tdWV6aF10gG5ya3F7fnV1YnWGjHuIiIB/eHJ1fnRhcGxYcHJhb3CDenRjcYBrYGx6bmloeXdzcGSDdHh4dHBkYGNtcn1qbFRpXl9VTHVjUUdXYkdjd2ZhTFRwWUtMWFhobHZ6ZWRtcWZjWlhdWHZmVEpcY1hpWFhIV2VRSWN4W11fbVteXGJjXn9pamBudHhtb252g5d5coGAfX+JjIZ+dXaGeIaMfXR1dYJ5enqCjI59foWJanSWgXuKnX1+hXmAe358holzcY+ujHt7h5B+ZnGIenR+fXZyb4ZsfH5tkHpjcHBiZV1lVlpZV2Nma2BdXXOGaFlxblteWFpcbHticXd2bGNcbnR1aHV3cW6FeX+Bendvb3RlaHRlW2d1ZnZ2knpfXVNlZWqCgXN8YWNpXFRXXmJkkKVpeXSChZB4bG15Zndse4N5dIdygHh8eYBpZXdtYGdhX2tgXnVrWWZdb29iemVbd3xrbm5weHl0dWVzg5N/iIOJenZvcn1yYXhjWm5vYG9wgHpzZXGAZF5tdWhjZnh6cmttgHNye3FxYV5lbW59ZGlUaFlaVU55X1JKWllIY3VkYUpUbVVKTFpXaWxye2RsbHNiYVlaW2F2XFRLY11ZalNWR1lhTkhqdlhfYW5bW19iY12FaWhibnd5bW9qdoGQeG2DfoCCkoiEgXZ1iXSMhnRxdnaBd319foyPgX+TfnB4loN9mZJ5gIB4eX5/c4eEc3CZonp7gImVeWV1iHpzeXdsdHB/bHl8cJJzXnBvYWdibFRbWldpZG1mXFxxiWVTcm5bWVhXYGx2ZGp1ampfW250cm10dHVrhn1/gH13b25sZGlwY1trcmR0do5zXFdUZGBxf35xgVxiY15TWmFcZJOfZXJxhYOQc2tqeGxubnl5enGAdn9ze3p7ZGZ2aF5jW2FoXF53aFdiXnBoYXdhW3x2ampyb3h0c3RpcYKVg4d/hXZzanB8bWZ3V1tpbGFwcX94c2VvflpgcHBhXmlvfGtqcn1xb3Zpb2BbZGtse2FmVGdVWFNRd1xSUFlSSGRzYmBHVmtRSVBaVWtsa3xlbW9yYVtaWFlscFdTUGZXV2lTVEZaXE9Jc3VYYGNuY1hhYWJdjGpjZW16eWxuaXZ5hnprhH2AhZl8goR5fYhtj4Zxb3Z6fXSCgn2Lj4OCl3R4gpSFgZ+JdYF/gXR/gnCHg3Zvopdze4aLh3tmd4tvbnxwZ3hxe2xzdnONa150b2JnZWtTXlxWaGJsbFtccY1kTm9tXFZXVWdpdGhjdGVlXlpwdm9xdnZ6bIh9gH2Id5BzY2Rrb2Fcbm1jc3iHa1pUVmJjd3x8cIRcY19jVFpgWmOXlWNucIKFiXJpZnluZHJ1cXpreXR1b3t/dl9nc2RcX1diZFlhdWVVX2BtZGFxXV1+b2hpc3F0cHV2bG2FlIKJfIVxcmdufG9xb1JaZWlkcHJ/dXNibHVVYnFqW15uZHtka3R8cXFxaWxfWGRpanheZlVkVVdRVm9YUVdUUEhlcl9hRlhrT0lYVFZuaWR8aWt4a2FXXFVbdGRTUlZoUVlnVFNIWltQTnl3W19lbWpaYmBfXo9uYWdreXZubml2dn9+bYSAfoaXe3+HgYp/a5OIcmd0gHt1gIN+iY5/i5NzfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4GNi3d4bnqNYGV9cWd6dHlsbXF3g2dkfG1jZ2doU2BfVWdgbG9cXm6OaE1pbGBVVlNvZnNrZnhlZV1acnZuc3t5c26Je4B3nHt6a2FlbG1eYG5qZXB5fmdaVlhfbHh7em+DX2JeZ1ZZYFhknIhia3CBhnx3a2p2bFt1cGp5aXVybm98gXNYa29gWV5WY2RYZXFjVF9iaWFibFpgfmtmbHN1b214dmxohox/iXuIbXFmcHtscWxhWF9nZ25yf3NyXmlsU2VwZFVibWF4YW90enRpbmtqXldgZmh1XGRWYlZUT1lnU09dT1BIZXBdY0daak5KYEtYbWVfeGhufmRgVV5UXXVbVFJgZ05eYlVTSlxaUVp2dl1fZm1oWGNhW16OcGNoandyc21odnR5gnOCg3qIjn58ioiOeW6PinRsc4Jzf3+IhYeShJWPen2Mj4iRm4SAfIyEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY2NjY2Njo6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5KTk5KSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6NjY2NjY2NjY2Njo2MjY2Ojo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJFtZmdnZ2dnfYWEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJLkpqZmZmZmnpsbm1ubm9qZmdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMkWdfYGBgX155g4KCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1Mz+TnpycnJydd2VnZ2dnaGNfX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRjo2NjY2NjY+QkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho2Ojo6Ojo6LioqKiomKiYiIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7enx8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GSkpKSko2QkpGJh46KkJKTkYuSjo2RiI+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIyMjY2NjY2NjY2NjY2NjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOhY2HhomGiJCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJCIi4aFhIWHj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQkIiLhIeEhomPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fX19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yQiIyGhoiDio+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp8enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+LjoyLjomOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enl6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSUk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OSkpKSkpOTk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpGRkZGSk5KSkpOSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSj5KRkZKSk4aFk5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJGCgJKQkZKNdYeRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCPkIhwgpCPkHt1iJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6PjHNuiY+JcniHj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyMdm16j4JzeIaNjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4dzbW2CeXR1gIWDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFlYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3dGFeZF9ianBmaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhhX21sXWZnZ2ViY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWlprd2xib3NqYlpZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NW2pya19sdHNnUVFTUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU5cY25rWmlzdXBTTU9QUFBPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRUNFSVZiZmtxcG5tbFpNTE5NTk9NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUNHSElOW2doZ3FubmlmZGBfX1hMSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw9SFlcW15mbG5rb21tbGtpaWpiUUdFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7PUpaaG5ucGpubWtqbGxkT0dFREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwc3R0c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oj1FYG5zbm5sbGxmUUI/Q0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3RycXR4eHl9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTk8SFx0dXFlUD46Oz1AQUA9Ozs+PD08QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl6e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09Pjw6QWp8aT05Oz49Pj9AQEA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A8XG5APkRFP0BBQVtjPD09Ozo9PkFBQD5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7fHx+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojttd0g4Ozo9PkE6SWQ9PD08ODo7Pz89PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPD09SUxGRnV3TTc4ODo7Pj5WakE7PDw6Ojs+Pz89PTk6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDcnlJO1x/g396fHdXPD0/PT0+RWh0TDo9Pj89PT9BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUdyeWtig4SDgoOAfV4+QENAQD1Kc3tZOj1BRUFCQkZIQz08QEREQUA/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARW50fYKCgYN+fYR2TUFDRUA/Pll7gF0/Q0VJSklJTU1LRUNGR0dFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6e3t+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXJDREVEQ1d1hoeHflhHSEpNTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVGRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnV2eXt7e3p8fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEiWxBQVZ0h4mHh4eIg1dITE1MTU5MSUZHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklLS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIg1ZshIeGhoaHiIiHfFBLTEtISEZGRERDQ0BAQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklKSEhIR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xLSlSBg4SEgoKFhoaDgoaFhISGhoaHh4aKdUtKRkI/P0A/Pz88PDw+Ozo8QUFAPjw5OTg8PD07Pjs4Oz9BQkBBQ0NCQEFBRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGAgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISklJZYWEhIR/gYKDgoODhIWFhoeIiIiIiYyPaENBPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzU4ODs7Oz1AOzk5OT08Pjs8PUFDRUhKTUxMR0lHT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlohoSEgX6Bg4ODgoOEhomKjIyLi4mKi4yJYEM3NTU1NzY2NjU1ODczNTY4Ojg3NjU2NTY3Njc2Nzo2Nzg4OTo3NTc4OTc5Nzc2OjxAR0ZJR0lGRUZPU1JTU1JPUFBSVGVwcXN0dHZ5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANjc4OD06PUVDQmWFg4GAgoODg4ODhomLiomJioqKiouJioqHZkk1OUA1ODg3NDU3ODU1NzY5OTc3Njc2NTo5Ojo6Ozc5ODk4NzY2OTo5ODg2ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1dnp7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhYaJioqIh4eIiIqKjIuKioyDZVBaQzo8PT45OTo7ODo7OTo7Ojo5Ozo5PT09Pjs7PDw6Pjs5Ozs8Ozw7OTo8ODo6Ojo5OTk8Pzw8QUJESElNS0lLTFdvcnN1c3Z4e3t8fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4qLi4x9alM9QkRFRUJBQEI/QENBQD49Pj5APz8/QD4/PT0/Qj5AQT9APz1AQEA+P0E8Pjw7Ojs6OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uLi4uMiot0RUNHSkxKSkdHSEVGSEdFQkFAQ0VEQ0FCQkI/QERIRUNFQ0VEQUZFRkRFRkRAQj48QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp7fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDREZXhIKDhIWFhoaIiYmIh4aGhoeJiYqLjI2MjIyLi4laSlBOTkxPSkpLSUlKSklFQ0RGR0ZEQ0VGREJISUtHSEdGSEdFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT5CQkdHSVmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjY2NjIyLjIFsbVVOTU9MSkxKSUpISkZER0lISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg3PDs7PTo+QD4/QENGSUlQX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjYyMjIuLjn1gWFBPTk1MTUpISEVJSUVLSUdKSklKR0dHS0xOTExISElKTVFOUE5NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1RucHV3d3l6eHl6e3x8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AOTo8OD0+Oz1BPj9BREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMjIuLil9UVFJPT05LSkdGQkdKR0xLRktPTEtKSkxNTE9QTkhJS0xPUVFQUU9PSkhKSkxKS0ZHSEdGRkhGRUVCQUJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4qMjIyMi4uOfVpYVFRWVE9NS0pERUdMT05PV1VRUE9RU1JNU1RPTVNMUFNVVlJTUVBMSk1NTUtOR0dKRkZISkRERUVCRUNjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CQEJCR1ZORk5QUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjI2PjIyMaVlYa2JGVFFRUEo7O1JTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9NUlFQUFFLS0tISEpIRUZJSUlISWlydnl4eXl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHRkZFPz9BQUVBQ0dFREVMWFJNVFVWWFp8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfmGKi4uHbVxlVjpZWVhTUT9AVlVYXGRgVllicl1dV11aVkVRWVpbWV9UWWdSVlZYVFRWVE9PTUpMSklJTE1LT01Tb3R2eHl4d3p5ent6enx9e35/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36LiYqMem9wWVtcW1JUUlZWVVtadYNZVX2QYVxYXV5XSVZdXVtbX1lIWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4SLfmdZWVxZVFZUV1JRV1ZjloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXVtcXV1XUk9TUFBSVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfoB8XVFWWFVSVVNRUUxPTUtmeVtdVFlVVl1aTFRaVVNUXlpYV1dXemtYW1xcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fH1+fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlVjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFXSkxOT0tOS0lKREVJRUM+VGRVf1JRUU5LUVRRTU9ZUk1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dXVzc3d6ent7fH17fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5cWVVQTElMSWFsknRQUVNOUVJRUltSU1JRUlVUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUxEP0NDQ0NCQERQQkNBQz1DSUdWQEhOTEddaVBIRk5GREVGSUdIQkRIR0lLR0RCQURAT1FNUmRydHZ1c3R1enx7e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUU09WYGtscnZ7e3h5dHJuc3RzeXh9f4OAg4OCgIKAgoGCa01HP0A7Oz4/Pz8/PmtQSmBFRkhJRUI/R0xOR01SVUlCRT8/PD08PT0/PT9BQ0NAPz09Qj5KTkdVbnR0dXN0dnh6fHt8fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSkpQUU5LTFFSUVRVVVdRUVdVUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlQ0BAQj06QkNBQURCXF1Pe05PTk5LTE1PT1FMS01XTUhHQEI8OTc3NTk5PTs7Ozg5ODo/PEJIP1xzdHV1dXZ3eXx8fH18fH19fn58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF9dWklIUFJRT01QUU5RUlRWWFNSWVRPWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIRkZIQkFHSUVFRkRNUlBhV1JXUVBTU1JVW09PUVZQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEM+ZXNzdnd3eXl7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFZXXlpYTUtUVFNQUVVPTFJTVFhYVFRZUk1XWVpWWFhWWFldV1dYaHNrXVZhc2thYV9eZGFfXllUUU5PTkxJSEpMSUlGQ1FQU1tXVFROUVNZU1xlVU9TU1FOS0lIQz9BOTk5ODk3ODg1NzU3ODU5OkducXR3eHl7e3x+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVFZYWFlTVVRMS1RWVVVVV1BTVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMUFNTT01NTk5OTEpGUVBVWVNUT0pOT1VTVFxWUlVTUk9NTElISEY/Pj06Nzg3NjU5OTY3Njc1V3Bwc3d5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXVJUWlZXVVRXVFJYWFlZWVNVT0pHT1BPT01SSlBQT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFJNSUxKT1JQUlJTVFFST0xNS0xMSENCQT06Ojg3NjtCNTU2Njpkb3F0d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpJR0VITEhLSEZMTVBNRy9FX1I+Mz8+am9hU1JRQEdVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHV5e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hFRkhKTUxFR0NPUkM4RU5TXWdTUVNBR1VQT1FRUE5NTk1LTEtLTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ0eHt6e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRYV1VMTEtJPDk4Nzs+QD48PUFAQj0+RUhHQ0VGSUdKSkBGQUFARkhFSk9IUVJhXFFQUk9TT09QTExPTUxNTE1PTltXS01RT0dJSENISkxMSkZGRkU/QkM+PEJHP0I/QWRwc3d6enp7fHt6end7d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0Q9OTc3OT9CPjs/QkBAPkBESUVDR0dJR0lFQkI/Pj1DQkFHSURNT2JlUU1PTldLTE1LTE1NTUxMT05TZE5KTFJJSUlFQUhKTE1OSkdJR0JBQkA/RUZFSERLbm92eXl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTU1KTVBNUE9ISkQ/QT05ODo6P0I/PEBCQUFERUdLRkNISUdHSENDP0I/P0BBPkRFQ0tOUlRMSklNVEdJSUpMSktMSUpNTU9QUlBLR0NMR0NCSkpMTU9OSUpJR0NDQ0RJSk1MSVlybXd5eHp7enl8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUhLREdISEdKS0lKS0RGQj0+PTk5OjtAQj89QkJDQ0dGSUtKRElJRkdHQ0M7QUBCPkBAQkVDSU1QSEhLR0hLREhJTE1ISkxISUpMS01dUkhIRE5GQUNKSk1MUE1LTUpLRkdHSk1OUU5MYm1pdnZ3enl7en1ybWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktERkVHRUZGR0VHQkNAPjw9OTo6OkBDQD5CQ0RFSUVJSkxGSUlHRkZEQjtBQ0M+QENEQ0RHTE5IS05IREhFSUxOTUdJTEdGR0lJTE5LSUdFTkhCRk1LTUxPTU1OTUtISElPUlFSTlJmZmZxb3N4dXt6fGxoam5la3Fsc3BmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSURGRkVDQ0JFQERCPj8+Ojs7PTo9PkNBPkFDRUZKRklITEhHR0dGRUNAPURFQj5BQ0NDREdISUdNUEpGRkdLTk9LRkhJRkVERUlKSEpJRkhPS0NJTUtPTU9OT1BOSkpJTFJVVVJPV2RgYW1ncHJvcnl6Z2VoaGRpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxIRUVHQ0JBQkQ9QkE+QT06Oj0/Oj0+QEI+QEJERkpFSUZJSEZGR0VDQkFBRkZDQkJCREVER0dJRkxRTElPSkpMTElHSEVHRkRDSUlIS0pHS1JNQk5OTVBOT09NTk9LS0tPVVdWVVNYX15caWFtaW5ocnNiZWZmZGhoZm5qZm1taGtrbXJpcXZ0c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1anN1bnV0c3FyamtzTUdIRkhCQkFERTxBQEBDPDg6PT45Pzw/QkBAQERGSEVIRkZIR0ZGRENFQ0RJRUNHRUJFR0VGR0dFSk1LSFFNSktISElFRkhIRUNJSUlLTUtPU05EUVJQUFFOT01OUE1MTVNXVlhYVVhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpbnlNSEdISEJCQkZFPD9CQkQ8Nzo+PTo+OkBCPj8/Q0VGREZERUhFREVDREVGR0pFRUpHQ0dIRkhHRUNGSkpHTktMS0hKTEZJSUtIRUtLTE1OT1JUT0hTVVNQUk9RTU5RTk1QV1pWWllWWl1ZWGFgYGBeaGVjYGRmaGdqaGhpZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1d3V7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5ISEdJREJDSEU8QEVCRT04OT4+PTw8QUI9Pz5BQkZDRUNDSURDRUVGR0dHSUZHS0hESUhHSUdGREhLSUdLSE1LSktMSExLTUtKTktPTk9SVVZPS1VXU1BTUVJMT1FQT1RZWllcWllbXl5dYGNeXGFja2JgZGdncoVoZ2lmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB0TElLSUtGQkVHRTxAR0NEQDo8P0A/Pj9CQTxAPkFBRkNFRURJRUZFR0ZISEZISElLSkZKSEhLSEZGTElIR0pHTExNTExJTUtNTU1PTFBQUVVWV09LVlZVU1NRUUxPUlJQVltbXV5bXF5fX2FgYWRdY2BlZmBlaGpkc3Nmamdna29ycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKS0xKTEdDRURFPEBGRERDOz8/QkBAQENBP0I/QUNIQ0ZFRklGSUZHRElJR0lISkxISEpKSUxKRkpLSElLSkdLS01NSkpNTE5OTlBLT1FSVFhWTU5UVlRSUlFQTE5UU1JXW11eX11dYF9gYWFgYWNlYmRoYmRpamd2i2xqaWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZud0tMTExNR0RDQUQ8P0VFRUM9QUFDQkJDREFDREFBRUdDSEdISEdKR0NISUdISkZJTEhJSk1LTUxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1BXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BDQUVEREZCQ0VHQ0NJRkNJSkpJSUtHREtKR0hKSUlLSEpKTkxOS0lMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGF2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RCRUVERkJGRkdERUtGRUpNTEtMTEdHTUlHSktIS0tJS0tOTE5MTExJTE1MW3NiZHBebG1VTU5mc11mZnFsbnRncGlfYVlubmJwcGJrampmb3F0ZXRub1xvdWdwTUpxeXZrYWBrZWVteGxrdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUhHRUQ/QUJAPkNGR0JGQ0ZFRkVEQ0hIR0RFS0hHTE5OS01NRkpOSEpLSklMS0pKS0xNTk5NTUpNTU5bcm9vbnBwbGtNUFFsV01pYnRycGFtbnVcWWxRXG1tWnFta29teHh0c2lwXV9ya3FqVXV5eG9jXmtmYmdwcGpqb3BwcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHR0VFRUJCQj5AQEZHQkdESUVFRUJGSUhIRUhMSkdNTU5LTU5HTE1JTEtJSk1JS0lKS09QT05NTE5OTFxoZHVdbHFXbE5QUW1UWWtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl1eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITEZJREVFQ0FCPUJBQ0dESEdMSEVDQ0hLSUhGSkxMRk5MTFNSTEdMTEhOSklITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllya2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altedGN3eHJqbnpoYWFjZmJiaW10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9uc3N2c0hLSElCRUVFQUE+RERCR0RISU1JRkNGSkxKR0ZLTkxFT0pLV1JLR0tKSk5JSEpMSUtKSEhLTU1NTUlLS0tTa2NbaV5faWNyclpfWWpuX2VlVWtfY1thYVFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ2dHdyR0dGSURFQ0ZBQEJGRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpFSEhLTUlISkpLS0lISUdLS0tMR0hLS0xNTUxKS01OVFtcVFBUTFBPTk9PVlFPT1FOT1FKSU5QUWRxaVRZV1xbXFZZW11YXVxcY2ZhYWViY2ZfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRkVBRUNAREhERkdDSUtMSEZER0tMSUVHSVBLTE9LTFdMSUVFSElKSElLSU1KSEZHR0lHSElFRkxJSkxPTElQXFdeUFxbYF5NWFlTXFxiXk1YWk1YYVJKWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJEQ0JFSUVHR0ZLSktIRUVJSktGRUhIUEtNTUpNUklHRUFIRkpJS0xKTEpIRkRJRkRGR0VGSkhDSk1LTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5eXF5TWl5jXlpdYGNgWV9jW2BeW1RYV1leXWNiY2FjZWhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0dIRkhHSEtKSklERktLS0VGSUpOS05LSExOR0hFPkdHTElLTEtLS0lHREhEQ0RFQUZKREBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVhVVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHh5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQkVHSUZHSEhGRklHSEdIS0lMRERLS05NTEtIS0pISUY/R0dOS0tLTUtLS0lGR0NEQERBSElCP0lKSE9dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXGRjYmRjZlhRVVRRW1daYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktKRkZGSEdHSUdGRklMSk5GREtLTU5KTElLSkhIRkJISFFNS0tPTEpLSUdHRUQ/RUNJSUJCR0ZFVF1ZXlhfWV9bXVVYWE9dXVFLSlZeWF5bXVVZYFJRX19iYmBgYmJgY2JhZGRiWE9RUVFaUltdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhIWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FIRkRHTVJIQ1FKRUdISEVGS0pNUEVGSUpLTkxMSUtMSUhHREhLUU9NTVBMTEpLSElDREFFRElHQ0JHRkRXVUVcVF1TVl9YT1RVTlpaTUlKVGBhW19YXl5hXU9ZYVxgYF9iY2JdYWJXX19UUE9PT1dRXFtbXFxeX2JmZmVsZW9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZIRElSYlBDVl5JR0dIREZNS1BQRUlJSktOTEtLTEtJSkdFSk5RUU5PT01OTE1IS0FEQUNER0VDQkVHQk1IQktLT09OTEZNRkdJSkhHTEtNT1BJTE9QT1NPTFBTUlVaWVdZWFhkV09TVFBQTk1PVFNaWFhaXVxgYWRlY2dja2xwc3J5eX97en+EhISFhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVIRkdES01dTEdHWExHSEpIR01MUVFITEtLS05NVU5PSkpLR0dLT1NTTlBPTk5OTkdLRmBFRF9MRWZkRU5bSV5bcm1PTVVtWUxEUGBVa1dnSl1XVV5ETFFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqUlZVVFtcW2BgYWJhYmBmaGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElGR0ZIRUVLT1NJSkZgVEhJT0pJT01SUUtNTExPUlVST09JTE1HSExQW1lPUFBOT09PSUpRf1FJfFlZcXRZUW1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtfVlZYf2p0dXVeX3ZeV2FbW2ZbX2BhYWFdYGFnbXBsYHB3dHiBgYKDg4J/fX+Adnh6bHZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSkVITU5CRExMRklLRVFWTEtOSUtSWFdRTU9PTVFUTk9RT0tLTkdNT1JbWlNRUk9QUFBKSFp4XVR4ZWhaU1VSdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Jye3xvfnhugHJfYGBiYVpgX2drbmtibGZnbXd+gYCDfnt4d4B0dnppcn5uc3x+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1ISkpHSlBPTU1KTlZeWVVMUVNOWFpNU1NSTktPSFFSVFlXVlBUUFBQUUtIZ3hsY3hybVtLTlZ5cHVtdWJvdlBlZUlmdnFtd2+AamZ4eGlXclFoem1panp6fWx4en9vaG9ZdnZqdXVwgF9yZn1pbHh8b15fX2JhW11iZGdpaWRnYmNkbGxwcHN0c3NzeXFyeGJsdWdxeXtzcnZ5foFzdXpufH15eHJuTkpTdU5DQkZQUEhKS0lLUE9PT01QWmBaV0tUV1BhXlJWUVlSTE9JU1RVWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmhxdW5teXB3bHZ0dHJsbl10fnprbXl8a3RsfGtwdnV4Xl9fYl5dX2RkaWdoZWVeYWJpaWlqa25va3FvbWpwYWNmY293eG9tcHN5fm5xcGt7enRzb21MTFtWSEdFR1JQSUxNSktQUVBQUFBXXFhVTVVZVWVYUlJZXlNNTUlUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1pwenteYHpzY3JveHFoZH1pcnxeVExsYHZ1a2l1e3ptfnhrfHBcXl5iW15iZGRnZWVlYlpjY2lra3JzcnZnbGloZGdgYWthZ3NybGdtbXJ8a21oa3t0bW1rbU9IS0tISkhIUVBMTk9MS1JSUk9TUldSVlRQV1pWVlRUVGFfUE5NSlRTVFFWVk5OTE1PUEpIUU5QVUxLTFNUU1NUUFZVUVFOUVFYWVJOUFVUWFhYW1tVUlNXW1dYWFpPU1VXWFhSXllXXlZUUFlSV1dXV1heWmdyXltbWVxdX2NaX2NjZGZkY2NiWmNiZ2ZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2dqdWpoZ2lsUUlLTExNS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVdPT0xNVlRRTlVTTk9NTFFQS0pRUUtRTUtLUFJVU1FSU1NJSExOT1FSUVFRVFZSWFdcV1NSUFJUVVZTWlFOU1JXVlRZVlRaVlRSVVRUVFdYVlxZXmBdXFpaXFxfY1tdYmNkZmRkZGFZYGFjYWJoaGltYmFkXl9jXVpkXGJtYV5mZWZtc2RpZ2prZWRjZmhQSktMT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYU1BQSk5XU1BOVVBOUU5MU1BNT1VTTlFOTU5RVVFVUVJUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdWVllbVFBUVVhVVVpVV1pWU1JXVlVXW1haX1xVWF5cXl1bXWBhXltiYmNnZmVkYlhfYWJdYGdkZmVhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYU9MTUxRUUxPVE9PU1FPUVtZV1dYW1lYWVZcamRWWFlaV1ZTU09KTlZUUE9UUFBQTU1SUlBSWFRRUU9NT1NWT1hSVFVVT05NUVNWVVRUUlRXVlpdXFpWVlFRVlhWW1tXUVRXVlZWWVRYWFVTUllXVVpeWV1fXlVeXF5gXFtfX19fWmJiZGhnZGRiWGFgYl5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUU9VXFpaV1tbXFhaW2RxbWhkX1tYVlVXUUxNVlNNTlJPUVJPTFFTUlVaVVNQUE1RWFdSV1NTU1hNT09RVFhWVVVTVVhYW15dW1tWUU5VVlVbXFdSVFdWV1hWVFhbVFNSWlhXXF5aXl9gVWFcYWFdYGJfXGBdY2BjZ2hkZmBZY2BhX19lZF9gYltaXFtcWVpZWFdcWlxbYF5fW15eYWBeYlxZYFpRTk9OVlFQVFFPVFRTUFdcXFxYXlxeVlxeanF3eYBjXFtVVVdRTU9WU05RUU9SVFJMUlRUWVpXVU9ST1NYV1RTVVJSWk9QU1JWW1ZXV1RWWlhcXVtbXVZTTVRVVVxcVlJUVlZYWVNVWlxVU1NdWFpdXlxgYGBWYVtjYl1hZF5cYmFiX2NmaWRmXltkYGFgYGNlX2JeWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVUUlFXUlRQW15eXVtgXGBVXF1oanJ9c2xnXFRXV1FOUlpTUlFUUlRVVEtSV1ZbWlpTT1NRVlZWVE9XUlNaUlRUVFhdV1hZU1hcWF5dWVpdVFVOVVZXXltYUlVVWVlZVVdaXFZUV15aXV1gXWJiXVlfW2VhX2RkXl5jY2FeZWZpZGZeXWRhYGFhYmRgYl5YWl9bXFtYWFhXV1tZW2BcW1tcW1haW15WXlldUE9PUlpQWlRVVlZTVFReXmBeXmJcYFVdXmJreXRsfWtaVVlUUFBTXFRVVFVUVllXTFJbV11bXVJPVVNYV1dUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlRV1JZWFlfW1pUVVZaWVpXWFpcVlVbXlxeYGFeZGNcXl1dZWFhZmReXmRjYFxnZGhlZGJfZGFgYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TTlBWWVFdVVZZV1dVWF9fYWFgY11fVF1fYmVldYF6aFdZWVNVU1ZcWFdXVlZXXVhPVV1aXl1cVFJXU1dXVVNUWFJTVlRYV1hdXlhdW1ZdX1hfX1hcVlFYVFlaWmFZXFZXWFtaW1lZWltYV15fYF9jYmFkZFxiXGBmYWRmZF5fZGJiW2ZjaGVjZmBmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOU1lWU1xUVldZVlZcYGFiY2BjXl9WW2BkYV96dW9oWVtZVVdUV1taWlxZWFlgV1BWXlxgYFxUVFhQVVdWVFZXUlNVV1paW19eWl9cVl9fWl1eWV1VUllXWVldYlpeVldbXFtcW1taXFlaX19gYGRiY2RkYmRZYWZjZmZlXmFiYGNeYmNpZGNnX2deYWJjYWFgXl9YVFtaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU09WWVZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5bXFpWV1hZXFxdX1tZW2JWVFheXWFjXFJWWVBXV1dXV1ZTVVRYXFxeYGBdYFxXYV5bXltaXlhVWFdbW19gXF9YWVxcXV5fXFtdWFtgYV5gZWNkZWVmYlhjZWRoZ2ReY2BgZWNcZWlkZWlfZl1jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldZWFtcWFdZXmBiYWRhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1laWF1gY2RfUlhZUFdXWFlZV1ZXVl1dXmBhYF9iXllhXV1eWVxeWVhVV1tcYF5dX1paXl1eXmFdXFtaXGBiX2JlY2VmZWZiWmRmZmlnYl9jXmFmZFppaGJmaWNlXmJiY2FgYF9dXFpYXFlZWFhaWFdaW1pZV1hVVVtdXV1gYGJieEtYV1tZVlxbXF1aV1xdX2BiZGFiYV1gWGJjYmFjYWJdW1xbWFdbXF9dYF9dW2BkXVxYW2JlY2FSXFpPWVhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl1ZWVRYXV1fYF9gXFteXmBiY11cWFxeYGJiY2VkZmRlZmRcZWZnaWZjYWJcY2dgXGloYmhpZWRgYmFjYV9gX1xdXFlcWVhXWFlYV1xaWldXWE9YWl1hY2Zmcmt/SllXXFpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGJiYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF5eXllYVVtfXl1hYWBeW2BhYmZjX11UXWBgY2RkZmVnZWZmZV5lZmhoZ2RkYFpmZ15haGhiaGhmY2BiYGNiX19fXF1bWltZWFhYVlpWXFtaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhIKCgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoKCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnV1dXV1dXV2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5ent7e3t7e3t7e3t7e3t7e3t7e3t7enp6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dXR1dXV1dHV2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3x8fHx8fHx6e3t7e3p7e3t6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHjF1NLS0tLUk3t9fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1ryGiYmJiYqCRT4/Pz8/O5vDvr++vr3K1NLS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19eNXn5OTk5OeZe39/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjYM6MjMzMzMuodLMzMzMy9nl5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12fn9/f39/f3l3d3d3d3d4eXl5enp6eG9wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHZ1dXV1dXV+g4KCgoKCg4SEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ0dHR0dHd0dnd6e3h7eHd2d3p4enp5fnp5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7fHx8fHx8fHp5eXl5eXp6enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d4fXl9fXx9e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8en19fH19eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4SCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3d3x6fXt8fXx4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4fHp9fHt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh6eXp6eHt4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaEg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KBgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGBgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3Nzc3JycXBvb29vcHFzc3NycnJyc3R0dHNxcXFyc3R0dHR0dHRzc3Rzc3N0dHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3NycXFxcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Nzc3JxcXBwb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnJzc3JycXFwcHBwb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFxdHFycnFxbn+DbnBwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFxcXCIiHBxcXB0moBucHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXyihHBycI6efG5wcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxdZ6jeHB4oJx9b3FxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcXBwcHFwcHFxcXFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJxmKmRb4KjnX5wcXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgYN5cnNzcnJyc3Jyc3Nzc3Nzc3KTqqV8iqGdfHJzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fXx2dnd3dnV4enh4eHh4d3h4eaGzqaepqpd9e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt8e3uKr6KhtamrpH97enp4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX19fZmklqGxn5imlX2Af319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgIGBnJuMn7ChoKKegICBgH5+f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/gICBgYCXm5CXsKCYlJyGfH5+foB+fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6MiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5/f4B+gKGspZeimpyZoqGIgH5+f4B/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgoSEiJCisqagoZmdnaanrKmhm5KHgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMj5GPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4ODho2fra+kmpqgm52cnZ2gpKKck4eDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBg4mVmJaVmJ+bnZ6dmpmXj4iGh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhISFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYGFjZSTlpmcnZyVj4mHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhIODh4+VjZSYkIaDgoWFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKBgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpGRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgYKCgoGAhpmIjIaCgoKBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgIB/gomOgIGCg4OAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJloiEgoSCgn9/jJWCgoGChIOBgYGCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6Zi4OFhISEgoCRmYaCgoKEg4OCg4GBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBkIyDgX9+fXx9jJyOgIKBgYKChJSUjIGCgYKDgoKBgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIg4SEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GWl4mAfX19fXuBmIyAg4GBgYCOlIyQgYKBgoKCgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgZWfin5+gH2Hi36EhIOEgoODgo2JhYyCgoOCg4KCg4ODgoODg4KCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fX19gIOEg4OEg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5ORkoyKiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOJkYOEi4WCgYF+fYGHhoOAfn5/f39/f4OEg4SEhISEhISEhISEhISFhYWEhYSGhYWFhYaGhoWGhYWGhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f36AgISEhIWGhoaFhYWGhoeHhoaFhoWFhoeHh4iGh4eGhoaHh4eGhoeHhoaGhYODhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiYiFhoWDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/gImFhoiIiIeHhoaIh4iHiIiIhoaHiImJiYmIh4aHh4eJiIaHh4eHhoeFg4OEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWFhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt7goaHiYqKiYmJiImJiYmKi4qIiIiJiYuLioqIh4eIiIiHh4iIh4eGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJKQj5GOioaFhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKCgoKCgH9+fX19fX5+fHt7i4yIi4qLiomIiImJiImLiomJiImIioqJi4mGhoaGh4WGiIiIiIaGh4SDgoSHiIiIh4WCgoGDg4KDg4SCgYKDgoGEg4SDgY6TkpCPj4uJhYWGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fX5+fn5+fn1+fX2Bl5CIjI6Hh4WGh4eHh4iHh4mHh4aIh4aJiYODhIOFhISFhYaIiIaFg4KCg4WHhoeGhoSCgoOEgoODhIKBgoGBgYODhIOEkZKQjo+Oi4eEhoaEgoGBgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCg4F9fH1/gH9+fn59fH1+fHqEmpOWioODgYKDhIaFhYODhYSEhISEhIWEgoKCgYSEgYKDg4WGhYSCgoGCgoODhYSEhIWEhIaEg4SFg4KDgYKDg4SFhIeSkY+Nj4yJhYSFhIWCgYGBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgICAgX9/gIODg4ODgoKAfX1/gICBf31+fn18fX17enqInY2DgoGBgIGBgoKBf36BgYGCgYOBgoGCgoKBg4SAf4CAgYKCgICAgYCBgoGDgYGChIODhYSBg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGAgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn5+fX+Cg4OCg4KDgn59fn+AgIGAfn19fX1+fXx6e3uKhYKAf39/f35/gIB+fYB/foCAgX+AgIF/f4CBgX59fX+AgX9+fn+AgH+AgICAf4CCgICCgYGDgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYGDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gIODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enuDhIN+gH9+fn1/f35/gH9+f3+Af4CAf359fn9/fn18fn+Afn5+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEhIKBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9+fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enp6eX6Wk4N/gH9/fn9/foCAf35/f4B/goB/fH5+f35+fXx/f4B/fn5/foB/f35/f4CAfn5/f39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfn19fn5+f359fX19fXx8fHt6enp5eYKLhICBgYGAgIB/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gICAf39/gYB+f3+Afn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYKBg4ODhYSEhISEg4ODhIKCgoKCgX9+fX19fn6AfX19fX19fX19fHp6eXl5eoCCgoKFg4GCg4GAgoCCgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8iZSQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICAgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFhISFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX18fX18e3l5eXl4fYKDhIWCgYSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgYKCgICBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYGBgYB/gH9/gICBgH+AgYB/fn19fX5+f36Ag4SHh4SGhoaFhoaHh4aHh4iHh4eGf32AgICCgX59fX19fX19fX19fX18fH5+fnx7eXh4eXl5gIODf4OMhIOEhISXl4ODhIF9foGBgoGBgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYODg4OCg4OCgoKCg4OCgpGQi4iIh4mHhoaEhoWEhISDgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgICAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eHh4eIhoeHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eXl8gYF+iJaDg4OEhJSTgIGBf39/fn6Ei4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOEhISIko+MiYiIiYeHh4WGhYSEhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx5enp7fH6Bg4GCgYOCgH59f397iJF8fI6Wf31/f4KGioWDg4SDgoONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4SDgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWFhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenl6e3x5eX19f4B/gH98e3t+fn2ClZF/hIh9fH5/goR8fIGChIN/f4eDfYKBgIKCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4OCgYKDgoOCgoGBgIB/gX5+fX19fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH18fn5+f35+fX19fH+BgH2Gj4F+fYJ+f36Agnx8gH+CgIGAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uUkIyLjo6NiIiHhYWFhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaHhYSAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx9fHl6e3t4eHl7e3p8goCBf3+AfX9+f359gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJKNjI2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gIGAgIB/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH19fHt9fHx8e3x8fHp6eXt8en2Fg4OAgYF+gH5/gH6FgoF+gH9+foCFhoKAfn6Dhn99fH5/gIGAf39+fX19fX57fH1/f3+AfX9+f4yRjo2Njo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KEhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aFg4CAgH1+fX5/fouEgYd+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fXx+f4B9foB+f36Eko2NjI+NjIqGhIWEhIODg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4F6fn58fn6Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fXt8fHx7e3p9foCAg4OCf35/fHx8fXx8gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIuQjY2MjYuKiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfX59fX17e319fHp8fH2BgoGAgIB9fX18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIOBgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e317f4GAf35/foB/f35/f35/gH9/f39/f39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn5/fn5/fnx8fXx8fXx9fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiYqJhYiSj4yJioeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fYCAgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4ODfX19fH18fX19fX19fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6ChYiHiIqLi4uJjJGQjoqJhoWEgoKCgoODg4OBgYGBgYGBgYGBgYKCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX59fX59fHx8fn18fXx9fX1+fX1+fnx7e3t8fH18e3p7e3l6eXl5e35/g4OEh4mKiImOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGBf4GBgX9/gH+AgX+AgIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36DkYSEg4F/fn18jYd9fX59fXx+fnx9fXx9fX5+fX5/fH19e3x9fnx8e3x9enp5eXl5ent+foCBg4eEiI+Oi4qHhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoaFhIKBgYKBgoF/gIKEgX9+gYB9foF+fX5/gIB9foCEgH5+f31+fXyKhX1+f31+foB+fX18fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fX2Ag4CJjouMiIWFhYSDgoKCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgIGDgX+AgYSBfn6Af31+gH59fn6AgH+Bfn+Af39/gH99fn5/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e31+fXx8e3x9e3t7fHt8fHx9fIqKiYmGhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKBgICAg4B+foB/fX+AfX1+foCAf4J/gYCAgICBgH1/f3+AgICAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fX58fXx8fHt8e3x+ioeHhYaIhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35+f4B9foB9fX1+gH9/gYCBgICAgIGBfn6Af4GAf4CAgH9+fX19fn1+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCIg4SEhYSEhIWDgYKBgYKBgICCgoOBgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgYODg4OFhIWDg4OEg4OEhIOBgICAf4CBfn19fn9+fn5+gH19f3x9fX6Af4CAgIKAgIGAg4KAf4B+gIF+gIGAgH9+fn5+fn1/fn6FhYGBgX+Ag4F/foGAf35/f4B/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgoB+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/f4B/gIB/gICDgoGAf36AgH+AgYCBgH9/f39/f4B/gIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x6fHp8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF/f4B/gHx9fX6AfX5/f39+fX98fn5+gX+BgH9+f4B/gYOCg4B/f4GBgIKBgYGBgIGAgIB/gIGAgIKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fYB9f4B8f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WEgoSEhYSEhIGDgoGDgX+AgX5+gH6AfX19foB+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgYOEgoGAgYB/goCAgYGAgYGBg4OBgX+Ag4B+goOEgICCgYKChIJ+e3t8fHx9fn1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CAgICAgIKCgYCAfoCCf3+BgoOBgYOCg4OFg399fX18e3x8eXp7en15e3l4f357fHt+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SFhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gIB/f39/f3x/f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4CAgIB/gYKBgH9+f4F+f4CCgoCBg4KEhIaEgH5+fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH59fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX6AgIB/f39/fIB/f4GAgYCAf3yAf35/fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7f4V9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB8gH6AgH+BgIB/fYB+fn9/f359fX6AgYGAfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgoCAgIB9fn5/gH18fnx/gIGAgICAgHx/f4B+f4GAf399gX9+f39+fX18f4CAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd7eXd4d3d4e3t6e3yFiX17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgoGBgoCCgICAgH5/fn9/fXx+foCBgoGAgIGBfX6Af35/gX+Af3+BgH9/f319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKBgYGCgYKAgYGAf4B/f399fX9+gICBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHqBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCBgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7j393d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgYCCgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHenh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCf4B/gIB/gH+AgIB/fn2Af35/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgoKDgICCgYSDg4SBgYOBgoKCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GAgYKAf4CBgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx7fXx7fX94d3Z5eXp8fHx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KChISAgIOBhoODg4GChICEg4KCgICCgoSBgYKBhIJ/gIB/gYOCgYCBgYCAf4GBgYGBg4B/gIOCf35/goGAgH9+gYCBf4CAgYCBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH9/hH19fXx/fXp9f3t6dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B8f35+fn15eXt6enp5c3J0b3dxd3lzd3uFgoKCgoOEgoOEg4CAg4OGg4ODgoKEgYSDgYOAgIKBg4GCgoGCgX6AgICCgYKBgYKCgIGAgICCgoGEgH6Bg4F/f4CDgoCBf4CCg4KAgYKBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhxeXR2eHR2e4SCg4KDg4SChIODgYKChIaEgoODg4SBhIOAg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgIKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgYOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBf4CAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISBgoOFhYWDg4KDhIKEhYKCgYKDg4GCgYKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOCgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoCBgHt9gX58eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIKBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhIGChIaEhIOCg4SEgYSFg4KCgoODgYOBgoCCgH2AgIGCg4KCgoKEgoCCgoODgoKBgICBg4KAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCf4OBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6fH2AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fn5/fn18fHh2f3Z3f4SHg4KDhoODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4KCgYGDgn+Cg4SDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn1+fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiGhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGCg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYODgoODg4GEg4GDg4SEg4SEhYSEhIWFhYWEg4ODf36BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODg4WDhIOFf36CiouFhYSDgoSFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhIODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoSFi4mEhISEhYWCh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF5g39/f36EhIKDgoOBg4SDhISFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf31+f35+gYOBfXt/fX6Afn18fHx9fX19fH19foB/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKChH6Dg32BfX5/fn+Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFhIaIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1we4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd216c26Ah3ltfXJzdnN2bW53bHB5bHV9f358foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgYCBgICAgYCAgIKDgoKEhYeGhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb2x3fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhYWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhIWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f396fn18f31/f359gIGDg4CCg4GBhIKBf4GCgH1/f4F+f35+f4GAfn6BgoCAgoSHhoODh4SEhIWHhoWFhYWHhoiFhYaFh4eFhoSGhomIhYSJi4iFhIWFhoWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXt9e3x9fH9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WFhoWGhoWGhoSGhoaGhoWGh4eHhoaDhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhIOFhIWEhYSGg4WGhYWEhIWHhoSEhYaFhX13hYOEhIOCgX5/fnt8e357fHx9f399fH9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8gH58fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYeFhYWDhIWGhYSGhoeGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoWHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIaEhoWEhYWDhoaFhoWEhoeGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1+fnx8fn2Afn1/gH5+gH99fXyAfX5/fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFhoaFgoOFhoaEhIOEhIOEhoSGhYWFhYOGhoWGhYSGh4WEhIWFg4SHhoOCg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYF/fHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWGiIWGh4WHhoeGh4WIiIeHhYaGh4WGhoSChISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDhIeDhIGChIWDgYCAgXt7fn18fHx+fXx8fH1+fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhIaGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDhIKCgn+Ae31/fXx8fH59fH19fH17fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGh4aGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHhoiGhoeEg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f39+fHx9f318fX18fnt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWFhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWDhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBgoKBg4WCg36BgoF/hIJ/fn5/fn98fH1/fXt9fXx+enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x8iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaEhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWIg4SFhIaGhoeFhYSDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCEg4KCfYGBf36DgX5/f4B8f3x9fX59e359fH15enp5e3x9enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4WHiIiGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIWGhoWFhoKDg4WAgIGAgIOAg4B8gYB+foKAfYB/gX2AfH1+fX57fn18e3l6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoGAgoGAgICDgX5+foB5en2Ag4SFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWGh4aIiIaFiIeJh4aFhYWDhoSFh4ODhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhIWFgoKDhH9+gICAgYCDgHyBf31+gn5+gH6Af399fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXx/fn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhYaGh4eHhYWIhomHhYSEhIKFg4SGgoOGhISGhIeGhoWFhoOEhYSFhoWGhISFhIWDhYSAgIKDf35/f39/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t8fX19fYB9fXx8fYB/fXyGg4aGhYaGg4SDhoKFgYGAf3+AgH5/gYF8fn9/foCAgoKChISDgoGChIGAg4KBgISFhIKBf4CCg4KEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhYaEhoaGhoaFg4SEg4SFhYWDhIODhIKEhIB/goJ/fX5+fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8enx8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gnx9f35+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYKFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWDg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgX6Cf35/gnx/fn19fHx8e3t6enp6eXt5enp5enp6e3x5e317e35/f4GAfX99fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Afn5+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGAgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx8fn18foN9e358fYB/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzMzMvLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs+QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0E9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjtBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1dXU0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU9IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8rKy8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19jZ2NjY2NjY2NjZ2dnZ29zc3Nzc3Nzd3Nvb29za09LT09PT09TU1NTU1NbW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0A8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLepp6enp6enp6enp6enqZeAgoKCgoKCgoGBgYGAj9LS0tLS0tLT09PS09PT3OPi4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXJsaU5TYkxMVk08Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLUEae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uzr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6OghoSEhISEhISEhISEhIhnQERERERERENDQ0RDP1zT09LS0tLS0tLS0tLS0eDs6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h3bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9QkA4PDo9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzR0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSloomHh4eHh4eHh4eHh4eKakZJSUlJSUlJSEhISENg0tPS0tLS0tLS0tLS0tHf6+rq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8PD46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183N0NLS0tLS0tLS0dHR0dDc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqaeQjo6Ojo6NjY2NjY2NkHNRVFRUVFRUVFRUVFVRatLT0tLS0tLS0tLS0tLS3+np6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc7Ozs7Ozs7Ozc3Nzc3Nzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs7Ozs7NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS0NDQ0NDPz8/Pz8/Pz8/NysrKysrKysvLysvMzMzT1NTV1dXV1dXW1dbW1tjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7O0dTPz87R0s7P0tTV1NDPz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfW1tbW1tbW1tXV1dXV1tfX19fX19fX19fX2NjX1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O07udz8/TuJ7P0ZyChIrGz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0rWVm7PVspeZubqVuLmvodLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz9GfoKqu1JyjqLLRkn1+r7DRzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDk2P0I/Qjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RxYeasdXDhpq11dPNnp7D0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9anmbHU1qOYtNTTwKCg0M/Pz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD09OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/UpJmx1NWimbTU1bCiqdTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1KSZstXVopm11NSjobrU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENHREFBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0NWkmrPV1aKattTNnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GSbF1cb2doYl1PRj9ISEZFQDw8Pj48PT08NzU2OTk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09DVpJqz1dajmrbXw5+g0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocfS1qObsdbXopu02rKkptbS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT0dW1gsPT1bGDxta5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPDw/R0VHS0k9NjY3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj47PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0cPU0tLQw9XR0cLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz8+PkFFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLU0tLS0tXT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo2OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEFBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT48SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDREVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw7OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo5Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvN3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je29zc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vb6/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urm6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLe3t7i5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e4t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqKmqp6Wko6KioqOioKKioaGhoKChoaKjpKOjpaWmqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3tre3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WkpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKalpaempaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSko6Kio6Khn5+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT43NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2epKShn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKCgoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk+Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6emoJ2cm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqamp6enp5+bmpuioJqWl5Wam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnJucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaOipaampqanpqagm5mboaCXkpOSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWnp6amop6cn6Gfl5GQkJSXm52YlpeWmJuZmpqampqZl5iam6Ghn56fnZybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgoJ+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2Njg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0BEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpKanpqWlpqalpaOgoKGhoJmSj46Wm5menJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bmJWVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoaGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0JAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqOio6SkpqalpKSjoqGhnpyblJmqnJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn5+goKGioqOkpKSkoqGhnpuamZqtqp6ZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foKGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgorCnoaKioqCenJubm5queXqbm5yZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoKSlraefoKCenJmZmpmmk0uBnZ2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qbmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6ChoJ+jonmqpKCgnpuampudqFpJhJ+enpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KkpKKgnp6cm5qam5uamJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2enqhtb6uin5yampycrIJLT4efnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udnJqkiFSEqJuamZucnqpkVFGIoJ2dnZybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ucmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFE8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmZoJNiYpudmJudm6KWZl1Rh6GdnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycnJmYmZyZZWN9nJibnZykh2dcUYKinZ6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTEY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5yZmZmapGhnZoiXnJyenHlmWlSDop6fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmJ9uZWJshp2dn5BvY1ZXh6GfoJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZmfeXNyXniZnKGOYVlTWo6dm56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM5Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7QkBBQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqWkpuflHmaqKGqlHxiUmCQko6SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGRjqCfjn1iiamYmm6Dh2twiIeCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDf4yojXhpUnCdj4xWbXl7gn5/gpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn6QoHpPQ0l2lIODSVdvc3eCe4aOjYuGjZSRi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqFgIGAoJRTNDQ7eYV1ckM4TmtvgIeKjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gH56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRi3+IjYyLi4eRj6FuRmRVP3p6Z2RMPDlNbnWNiomQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZCeoZ2Tl5uhmp2boqSYUXSwkUh7h3htUml/WVdxiJCMmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqamshF+/2KxGkqOakF1rgnteXoOioaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKmqaeopm96vcCqmsyonrOaSFaEcFJ4n6mnoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSop5qdpKWjoqJygZmujsnOsp6wsm5TvqBUbJSjoqChn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZWRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKgo6ehpq6mppygjX2Fe4bQvZiXqJxyUpqsZ2OOo52goJ6doKOalpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqaKgoqiqrrGyrqukqZiIe2qdvcOrrp6JdmRweHp2h6Okp6OhnaCimZWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVVxoZG9jbWlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Gem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqp6+3trSztrKwsqeJdV5Olp+Qj42Ae3Nwc3F4fH6Fkp2hpKOipJudoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrsra7vr/Av8W/tauTcGZYR3eAc3V6cW5paGJiaWlvdnd4fYONmKOorKakmaGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh2a3FoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tbrI0tnc1ce6rZ+QeFxbT0Vea2VqcGhkYmdZV11ZXmZubm1tbG6BqMjGu6Knqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWlgZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8TF2eLfz72wqJyNeGJVV01FXmxhY2plYWJpXVVcV1laXmNhXGOAqcXAvbipr7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdubVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGvMfHztDEq417b1xTVFZLQF5sZWZuZWJeZmFVWFpYVldXYoOltru5q7SyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4R/amZoYWtsZ251cnJ1cWdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/EwsbJycCkiFpMSEpOSD5aYGJscWhhX2VcWFVTVFFWgLbDr6yqqqqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dWtsbmRvbWlxeG95amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjHxsTEw7izwbqgd0xKUUk9TVRiamluY19fWlxVU1p/mq23tKuupaSjp6SgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIyWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3dua2lodlpmcnhzemdnXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPEwsW9u76RZVZLQko9XlZYa2dbWllYVnCQsLGruLWzrKmjoa2prKetoKy1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXZ1ZWZpamheam9ueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIyL/GxragbEtZQVJye4BaUlBTa5++wLq9u7y6vKytpqm7urm3wLO1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3Zpamp0bnlsXmRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc3FxcXEycCqjXhvjJmdU09xn8LSx8TBxMfBvL60sbCwwr6+wcbAv7i2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cn14cGdga2p3bGlmdW90Y11jVVdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXBwcDCzrxzaoWZl1qRy8vNz8W2v7/AwLq7vbWzs8C/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enmAc3BmZWZja2Ria21vb19ZXVdWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK9vMLBmYCOmYh/0svEyNHBr729uLm7u763tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWViYWNjZGpjZ2NbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8C7v8C8u8S9usDEv729tr7IpJRmj83Ev8DJv7DBv7q3u765tbi0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFiY2hqZ2dqZWpeVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1Y26v7vDtbrHt7a5u7y4ubW6xMmmQovJv7+7wb65xr3Cv7zFuLa3tLi2tru7uLa0t7q1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWZwamVsaFhZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+8z8R4qcy9x7e5uK22tLe5s7WyusXKmkaAyr+/vr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25xZ3FrdGZibmBcVEhLS0RKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNeudIG7yM/CwLiutbW7vbe5sb7Dx45Me83Dwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcmZsam51b3hjaGJcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCx8nSmXF0rtHRzMrEtbq/xMi+vrS+wMB7WXPLxsK+wby/w8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0bGxuX2NfYWJOSE4/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDCur68xL63vMC/yc/HyMrKwYZydKbMzMvNysbCw8vOwby4vLqxcmlmu8jEwMC/xMDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh7bW14fGBxY1tfYF9UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7ur2sO+tr7Avr66ppypsrbDwKV5dnmcxMbLyMHDwMDJysG/u7mxoYF4ca7IxcS/wMG/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7W4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem5zeHRocF5cX11aUkZFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8S3ba3Ovba5wL2rfW5obm1ygZWYc3h9mL2/xsC5wLy+xcS9vbixr5yVg4icysLDvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGxt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdtdXtxb2pcYGBaU1BBRklHS0BFQ0k8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fm52bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNsnaBs722tcKlh2laXmBNUltbbnR3gqG4uMK6s7u3u72/uru7rqOenY6Zf7/Ew768v7u7uLbBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnZ3b3FhX2ZdW1VKPT8/R0c9R0NDOTo1Ozk5Pjw8OTo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaeFeIqgr7WdamZnVllgSUlNUFRsd4emsLe+ubK1sry5vLa5vrWVoKudqHSuycTAvb+5s66yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NhXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WblY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8WqiHx2jKGYYFRDWFVHYWpWT0VKYY6hrK+2urW0sqy8ubi1uMG9i5qzpqp0psvCv7m6ta6lrLOxprCtqJ2gn6WttrXCt7a0paiqqLC2s7K6tbu7u7W4trC2xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnNuY15nWV1dU09OQT9KQ0FKSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmpGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/tJCCeYiQb09KP2RZQk53gJRqTkFcgrC1s7WytK+su7q4trm/xnaErKCcZam/uLWysa2tn6Smp52kpZyWmZmZn6muuayrq5+lqKSrrq+nsKuvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cndzbXVqbF1ca1VeXFBOSERHTUJHTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiEfFhGQU+HWUpKWHeNgWNBU6O5s7SysLGtsLm4tru3u7yQorGrpHOssKmrraujqKGdnZ6Xl6CVkpaXj5ifqK6ko6Sgoqaio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J5aHV0bmVVYWRXXVJPTUlASVNFTkM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K8qZiZlGhNP1J4cVBJSUtnnIBaRVOvu7Gss6+urK22trK0ta6ppp6am52fpqieoKipn6GnlpuWl46dk4+Qlo2Xm6SooKCioqGlpZyjo6CepaCkrKWmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJaVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6ahiHiDfHZ/emN3bW5dUWlVUE9HUE1NQ1BSQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcKqpb1oRFKdglFXSUpgSlWNYWRjga61qrK0rqqrr7Cys62lnZGXk4+XoJ+ioJyjpJ+eqJSblpaMl5GNkJeTmJ2jqp+fn6Cjpaicn6ChnKKfo6ionKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclZOQj5GRmZCWlZiXn5icmZukmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn58f3V2fW5se2RpVlJkTkpIR09TTktOSDxFQDwyQDg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoKrGv8qgUEFznXZPbUpLY2Z0c2BbYHGQsa+us7Wqpqyso5uZlI2RlZaYmJyfoqKcnaSemqSXl5eWkJKRkpOal5ugpKqeoaGepqerop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoqWimpmer6iusqumq6qgm5iYmJWTlpqTlZWalpuXl5ihnpyclpuhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eXxleXpgYlNVYUhJSktTVEpTUU05P0E2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZykxsaMV1NKZaRaZX1vclxRa2NbZWBea4+0sLC4rKahnJ2alJeamZCOkZWRjI6Nk5minJejmZqXmJmUmZiWnZufpaapoKaknqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Ggo7GusrG0qrKuo5mcnZ6hmJubmpeZm5SWm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaYJsZlxTWlpNUUtPT1ZNU01CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6Kan6qjjHlVaXF2dXBjdnZYWGNgY2haWVdnra6sr6efnqKglpCTm6CbmZeSk5+coaObnpuWn5qfl5uinqWhnqSfpKitramsqaSstLe2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztrizuK2ytKSgnaWgrKGhoqGgmpiWlZ+bm5iloaCeo6Ggn5ucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYKAfXh2anh1Xm1bUmFJUlVIRlVXSkNNRz1LSThFPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoKOAb4JwYGNYTFtSWk1MUFhSSE1NR5isqqmloJ+akpGUmJiWlpaMiIuOlZ2dnZyel56Zpp+gqKWxqqeuo6uutrC1srGutri9v7qttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q66xubi8r7OwtcK8t76zs7WirKKpqbKpq6inqJqZnpqqp6CZp6Cfn6iopaSenaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWFfnZybWl3bWluXFhcQ1dOSkdNSENGTj0+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco56dimJXXmVgV01RRz0/QENDPz5CUXipramqpp+en6KjnZ6dmp2blJOVlJ6emJSFnZqgmqukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDJv7C5ub25wr64tLvGxL3DvLezqrOtqrO0r7Ouqq+jnayotrGto7CmoaOwsa6wpKWvo6GgmqGmoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXx0cmtsdXJxaFdcUUZVSERKUEk/RUI0Rkg5NTw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PDw7Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmqCflXxfXmVgUUdFPEM+Rjw+OTZOfqqzp6OjoqCepaumnpeclJGanpmVjIqGiIZ4bYigpKKrrLS8tsO9vrO7wcPCxcC/wsbFxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DDvsfGwrfDysnDwce/urS6u7W7t7C2sqq6sq68uL+7uqu4rauquLu1vK6uuKOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtkaW94a2VaXEZMTUVEVE1FQ0U3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pj1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1zamFXT0U+SVp8b2JCPVyOrqygmZubnp6Zl5eXko2Pl5eUj42QjIKDgndycW1wj6atrrS5xbvNx8u+wczNzczIyNDMzMzHysXGzNDS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysHGxsbKyM/AydHNx8bIxsK8xMG+v7+2vrOtv8DDw8fEx8Svv7myuL3EwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dHNlYmdyb2deWlpET01ERVBJRENBNTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT88QD8+OTtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnZVqZl1USURBP0uGnqWZhKCyraOenJ+amJeUkpSWkZCPjIeEhIiGg4CBgYB5cXJvbHmktrq5vsvB09HTyM3O0dPR0tDQ0dHNzs/Qxc3U1djR183Gx8nMw8XKz8rT19HX0tXW09TIzMbMzcnTzc7TzcbJysrCxszHycnGv8Ozs8jFy8vLz8fKv76/vcHHxczMycnAw8Cur7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5aQjIaRi4B7cnV2Z2NndmplVlhSRE5GQElRQz5CPToyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGcYlRMSkRDP0NSr9G9sq+mnJycoKShnZqUk5WUiX14cWtlYmhycHJ7hYqAdXBucXNwhbPDvsXR0NfW1dLWzdTW1tTT0dLT1NLP0sPQ09bY1dXSy8rO0cvGzdLK0tXW2dbY09bYzdLKz9HMz9HM09DAycjLxMzNzM/PxcfItsDLwNLNzNDGysnAxMPIzs3Q0c/NysjNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNgZXJjXVJcSktHQUVJSj47QTg+NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaCioVpJQEFEQUZRdrKvppqUl5+cmqCgnpucmpWJd2ljYV9fX19eX19dYWx1c3Bwb2xxcXWSxMjH1NbX19bT1tDV1NnU1M7P1dTU0dHM0c3T19bT1dDP0tPRydPRyNDY19jR2NLX2dTWzM/Pyc3Sy87RwMbEycfPztHR0sjMzcDLzcbUz8zPyMTLx8fIzMvU1NHVz9LM08K5xbGlqLWup5uoq6Wdsqiws62sk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1iY2ltX1ZRYEpKQ0VDUk1APD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48P0A9RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fY1NXZ2dHO0L+8zMm2vq6mqqiho6xmQzg9PkRYgqqon5eVl5manJ+dmJyckn1xZWNiX19hX15hYF9gYF9gZW1wcG5rb3J2d5zMwdPV09jY1tnR0tLXz9POy9LN1dTRys/M09bS0dXNz9XV0cXR1MrQ1NXWztPR2NfX18vIzsTJz8zKzMDJwcnKzs7Py9DOzszPz8jM0NDLzsvDysfJzcvM0tPO1NLR0NDKvci5sK67ubWrtrCtqLits767sZqOoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcG9rYWRucGFYXFtKRkZETVhFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj09P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufo6efuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSxekhGQjtXjaGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGBgXmBfXlxibXJvb3N0dXZ5pL/M1dHW09PY1s7O08vOzsXOytLSz8fOzc3Uy87SzcvX1tDM0dTLy9DS08rO0dXS1dXKwMrBxs3CycrDzcTGycvLz8rOzdDO1MzGydDNycfLxcfCxsrMzdDSx9DPzs7M0MXHwbi5vcPDvcO5s7K+sbvDxLaqmKWhmJaSlZWSi5SNmpGUlI+PlYKJhnlxcmttaGBgcWhZWGhWTUdMSVBRQjtEPzs2ODo4Ojs1Nz09QDs6PD05PD05PT06Pjo8Nzs9OTtAPD47Pj5BPDk9Pj1CPTs3NzY/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4ytXW2drb2MzMz8jW1cTCta+0qKCtl3hsb3B3j5qNjJeVkJORkZWWlZCLe2ViYmJgXV5hY2JgX2BgYWFfX11bXWdycnByc3Btcnmlx9POzNDP09TJxMjIxca/w8XPzsfFx83K0cjLzs3G0dLQzszUysfKzs/Hx8/Sy9DPxbrEv8bKvcPIys7Fw8fAx83IxMzKzM/IxMTQycbCxsnFv8HHzMvMz8LLzMnHy9DFxce7x8PJycLPwb28v7DByce6vaqxsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Vka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62ktn5ngoWiqpONjZaPhYODg4F9hIR+c2BbXl1eYF5gY2RjX11dXl9gYF9bWlxgbHJxbm9rbG9vfbnRy8LCz8vNxLq/w7q7urm+yMbCw8DDyMrJyMrIwcXMxsjKzcnEwcrJwcHL0MXLyL+5wbzGx77Axs/LxMDDu8nHybzJx8XKwb7Cy8bFxL7Gvb3Bw8XMxca8wMnDxcfSxMHJv8rKxsjG0cPDxsOuxMvHw8q3v7y6tKmspKWYn5iso6Gmm6Ogm5V8d3N1ZmpbYW5tWlxYUkRMR0JHRUxERlNANTQzMzVAPTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76ysLZsXnl8n5GKkpaGeoCFhX91eHVycF9bW11gYGJkZGRlZGBcXF5dXl5gW1laXGJvcm5raWtwb3OPyLuYwMzAxsGwtrmxsbOxsMG7u7y6uMHBwcS+vbm9v7nEysXGwr3GwLe7w8m/wcm7tru6xsO/vMLOw8a+vrXBvcO7vce8w7q0vcbEwsO3wLa2vr+7zMO9trrIu7++y8PBxsPGycfJxtDGwszHssfJw87NwcXDv72yt7Cyp6ioubClrbCqrayUend4a2VoYGhvZFZeWUpGSkZIS0FGQkZKQTk6NjU4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTV183KzsXJxcfBusW9rK6mYGN1gZKLiIuEeH+Ghn99g3t0dGNcXF1eYGBiY2JiZGViXVxbXF5cXl1aW1xeaHNxbWdnbm9yeZuOn8TDusC4rbCwpqmtq6W3s7W0s7O0u7a9srewtK6yu8K8wcS8v7q0srq+wLjIuLS8tsHCvbi9x8HEu7WvsrW6v7TFuLu1rLm9vsC9sbu2sLe6s8a8t6+7v7W3tcW8v8PGwMTFxsfMxcDGxrvHy8DPycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkZCREFFRj89OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MvNyMnIysnKxNDN0s/NxcfBxcG/urjJt6uwmVtnb4mOhoiJenh+hoZ2d4F8c2hdXV1dX2BfYGRhXmNlY19eXFteXF1eWltbXV9scG5pZmptbnN7ir+/uLi0r6qrpp2hqKadqaqxraqsqbSttrCzqa6nrLO7urbDubq5sKu0ubu0wrmvwLG+vLu2vMi5w7etqqiwssC2uL2wsaixs7W7vKyutqautq67srGqubCuu668uLzAwL66w7/Gw8XAvMbCyMu4xcfFv8fEw7rExsK7xsnMy7O5wr27s4l0dndraWBibGlZV1dbQUxLTUpFQUNAR0E7Ojo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxM/HzcHCxr/ExMPDysLJyr/AvMG6s7W1w66qsJJbaX6SiI6Pe3h9iYV6e4SAd25eXVxcXV9gX19kY2JjZGJgX15aW1paXVpaWlpcZW5vaGZnaWtucoStubC1raSjpaWZn6OfmJqkqq2kqKKrqqyrsKOmn6qttbaxvbivt6+orri0tLy4s7ywuLm2srzBssGvpqmjq7GztKi9qquoq62utbSmqK2hpK+psqaoqK6lqLessbO3urq7sry+vr/Fv7XCwcfIt7/AxbfEw8C7v8TCvsTIzMq/v8TAwKmHc3RzamlcYW9kV1ZYUEhaUlNLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzcPHubnLwsu+u8m2vcO+usq3wcPBtLa8trGvtbytqauSY22Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBgX15dXFpYWVtbWVhaXF9ma2ZkZmVoa29yhamlq6Ocmp+jk5ujmZaPoKGoo6OfpaWnpq6gnZukpqyysLe3p7CsqKq0q7S6sba2rra6s7C7urG3paCkoKexqKypuqqlpqeop7OtoKinn5ykpqyfn6ekoKGxra2ssrWztLG1vba7wcCyu77DwbK5ucKzwL3Atbi8vb68wsfEw8S/wMSghHhxbGJmYGtvYFVZX0hOaE9USEZLRjw9QD06Ozs4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrAur21oJ6UnaGmurars7O7s8TPycvCxri3x8DMv7jKt7vFuLPFuLO/wKy1vLKspq+0raGjkmlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYF5cW1xcWFlYWFhWWFtdX2RjY2ZnZ2drbW6Hnaidk5OXnpSZoJaUi5ygoaacn5+jpaOnnpuinJ+rsK2xtaSpqqqsrKW0uK23sKyzta+ztq+xqp+en6SisqWmqrmtoqamoKitq5mgoJ6ZnZ+lmpqjnJyesKmsqKqrrK2ws7mvuLm6sLa8u7qss7O5s720t7GxtrW/tb3AvcPCu7u9l4R7c2xfZV5kZFhUV15JV11LUEdKSkdBPD8/QTs/PDA1NTM2Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru4wcHBtKSkmZqkpsCyr7astbfFz8jIwMa7u8PDz765x7i4v7eywrSxu7usubqxop+pq6eYnpBtfoWGf3hybW9ta2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpdYmRkZmZmaGlrcoynmpCRkZiUmJ6TlI6aoKCnnpudpaaipZufoZqZr66ur7KhpaOuq6iitbCysqypsLOou7OntqGjn5yjoq6joqq2q6Ojpp6mpqOWmZ2XmZudoJqXnZydnK2hrKijpKatq7O0qrWwsquzubSvqrCysrO3s66pra6yt7C6trq9wLizsZSGeXVmX2ZfW1pWU1pVS1tRTEpFSEtJQz0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7OdpaOYpbHDtba9rbS5wczIxr/FtsHAx862wMO9s7m5sr+2sbm7rbK0r5+ao6qhlJqPeH+DhH94b3F0cWhlZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oJmQkI2Rk5SclJeSlZ6coJyWoaGpo56eqJyamqunr7CrnKOkuKqhoK+ot6unp66xpLiwpLego5yZmaumoZqtubCjoaScoqCfk5ShlJaWm5mYlpeclZ+pnqqkop2jqqqxrai0rKqnrbOwpauus7GvsK+vp6iosq6xtLC8tLq4r6OVgnp2ZV9hV1lYU1JUS01eTFBMR0hMS0U9QD49Qjw6NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS6wrG+t72unaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa68u7W7vLW5ubCvsKqcmqGplZGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNjYmNiYmNmaYCSjpGJjpCRl5WZk5SZnpuelaCfpqWjpqefnJ+moKuvpqCio7eooaGiqbOipailsKaxrqy1n6GdlpWpoaKUrbGxn6Ojnp6Ym5OLoZSRk5iYk5eYmJeep5unoaKapKWlq6SlsKelo6usraaprrCvq6iqqrOmpquvtLGuvLaxsK+gk3t4c2ViXFtdWE5MUUhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtr2wu7G3rJ6lpqy3u7zBxbqyubXEycnAw8bFx7bGxLPBv8Wrt7e9tr26u7WyrK2omZmfo4uKdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdVVFZWUlRSVWBhX2BhX2BgYmRpfo6Oho2LkI6QmZGTlaKYn5acoKWhrKWkpKOko52rq6Wan6WxqqGhnqWqnqiin66sqqmuraKiopWYopuckKupsJyfop+fl5iTiZ6RjZKTlpCYmJOcoaOcpKCilaCipKWbo6uloqOrpKutpa6yqqalpqa0pqqorbO1tLm6sKusnoxzcXBgW1dWVlJHUU9IWlxPUkpUS1NMRUdKRDg7Oz48OTY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsq2dqKevubmzwMi6tsCvxcjMusHJzMi1ybyxvcPJrbG4wbW8wLy0taqsppaanJyJgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFVWVVRVVVJSTlFZXVxdXV5eX19iZG2Ji3+NgouNi5aQkZCbmqGbm6CoqauorKeppqSZpa+klZmlr6mgnJmboJ+umpyrs6Cmpp+ipKGUlJuWlpKpqq2bnZ+hoZuUkIyZjoyRjJKNlpWQnaGgo52co5WboaOhmKKoo6Koq6CrsKSuuKajpKOsramoq6+0t7K9tbOrr5iFdXRpW1hZUlVSRlhMUVtYTVVPUUxRUklOSkI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraeztq6oqK+um6morLe2rLzKu7a/rMvGxbjBzs/Hs8S6t7vCyLGtuL+3vL67s7amqaCWmJmXiHp0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05PUVlaWlpdXFxdX2Bke4h9hnqIjIaPipSPlZegn5qfq6mmr6yosKWpmp+toZWWpKinnZiQj5qer5eZp6qZoJ2UpaGfkpGSkZOVqKulmpmZnp6XjoyLk4aJjYOPi5KVkaCeoaSZlp+VmqGinpSbpaWnqaigsLCmsb2ooKOstKqup7C0sLm1wLGusauQfnJ0Y1ZUVk5SSkdWUFJSTExYTktNT1JITktBQ0ZERD5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/tKymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrK2uLy9wMOxsLG3rrS0u7O0o6OdnZiXlYSAdmtnbG5xbnJqb2tkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVFJOTk5SV1haWVlYXFxdYWp8dntxhImDjYaViJKSlpqYnaiboKumpqyeqJmgppyTj5+jmpeXhoWSm6SQlaOdlpaWiKKbm5SMjoqQmqWnnJWVl5uRk4iUjouBjI2AkIuSkpKhmqCilpSZmJWippqNmaSnqaehoLSyqLO4oZ2jt6ypraSzsqa1u7WrrLGjinpzbl5OUVFNT0ROTk5QS0ZOTkpKTk5RSU1KQUhMSEhDPjk1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLexpaekqqWgqaaks6qissO1tbKzxsa3usPKzMazrLm9tLjAr66psJ6mrruvraCam56VlYh8hG5fX2ZycHZxam5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYWl1hbm5ybICEf4V9j4KNiJKQkp2hjpqdo6KkmKWWopyVjYiZmoxzjYN+jpeWhpKakJSOjnuZj52NgomAipigo56Qk5iWhY6DlH5+dIqOepCIk5CQnZuampKWkJ2Oo6OOiZqgoaSkm6K0r6ywrZ+YprimpbChsa6csbyqqa+qmYN4dGRWTVJQUE1DU05MUE1CUFFISU5TTUhKSkRLTUZLSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0wMjc2NDc4OTo6NjY6ODdBN3i3oaO0qKalqKOlpaamprKnprTBuK+0sMnEuLnAzsa+s6y6waytxK2ooqaSnaa3raOgkJaXkpB+eH9mV1ZfZ2ZpZ2hvY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkhOVFNTVFVVV1lbXWlobWh7gXlxTVZwjoGVhYybl4qTkZ+YnZWUlpSPloqAlIlfO1ZvfIyUioCMkoyQhoZzi4WXgXmBe4aUnZWDlo6RkIOGfZN4cXCGjX2JgZCOkJeamZOLkIqdiJ+YiIiWnpqhoJenrqmtqamelq2zoqaumaysmKi0o6mto5N/dG5gW05TUldMRFRKUE1MRk5PSUVMUU1LT0pJTVBGSUo9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqmgpqmno6qwqKe0wbmwtbDHwrizvc+/ua+utcKnqsSqop2Yg5ScsaOamIeUkIuHfnN2XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNTlFNS0lGSE5RUU1PUlRWWFpga2pkdn5xTkE/f5WRkHyHlIyEio2bjpaViZKIhpWHeYl/YEpRbniLkoR+hI2LhYB/bX9/lHh2dniEjZpwUY2IioZ8fniUdmh3hoh+ioiVi46Rk5eMhIqIlYSbjYOEkpuWnp2UpKKoqaWknpuwqqGkpJKmqpaiqpyhpqiJdm5nXlxIUVFTTUlVTVJJTEtPSUhGSk5MTVRLUVFPR0pEPTc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aco6edn6Guoaeopaeor6yqtry2uLezwbu2qLnIuLaoqLW2qrK8p56VjX+JlKmWlYt/joOCfnhxb1hNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWVhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtFRENJTk9oWU9RU1RVWm6BcHN6Z2ZaU4+JlIdzfoaAfIWMk4KSmYuPe4aPgHaAeHNvdXF0jo6Ben6Kq4V6e2l2e45wcm14gYuNknh7gHuAd3NzknhndYWEhIV8lYqIio2LgH+Ei42AlIR8gI+YlJyWkZ+dqZ6goZ2gqaWenZiNp6SToJ+Wnp+kgXNpYl1dSldQUkdLWFJPSk1MUkpKSkxQSExRTFJUTUZJQj03ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqqWtq7Cxqr20sru4trq0sZ+3urKqnZ2sqaiyr6KakY2UgY6cjpF/doZ3fHZvb2pZS0hISEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedYJ6dmR0i5WYjY57ZnmAdnh/iJB8g5iSgHGHj3x3e29rfq19dJCLf3qGkoF9f3RmdnyGbG9oc3yKjYeAbXlxfXFtdo9xaHGBfo5wRIuFgoOFf3d3eoyGfYx7dX2Oko+Yi5Kam6OWmZ2anZ6hnJaNi6Wbjp2XjpaYkHhvbmdjW1hYVVFKU1VUT1BOUFZLTktPT0pST0hOUExGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNTExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagprCsrquoqbGvsau8uKy7vrizrKebsKesm4+WnaWppKGYmY+FknmJj4uLdnF8bXVwam1qWEtGR0VBQENESExMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF1lb3BqhqWqwH5zeGJ7d257eIePeXuLhm9tjJJ5dHlqaoCCcZaRjIF9lYBKk5luaHd+gm1qZGx5hZCShmtybHxucnyGaW1wf3ONiYWHe35/e3dwdHSGgnmBeXB8jouKk4OWl5iakJOWlpmXnZaMg4mfkouSjYaQl4Bvam9vb1lWWFRSUVlPUlRUUlhVTU5ITUtNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5ibn6Wtr6Ktqqi1r66stL+rvMO/paKalaSYno2Ei5ShoZiZkZOLc456gIaMhnVvdGtwbGRsallOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUlZaUVhbX6aHYZlncnhkfW9sf3mKiHWBh4V0bJqSdHR8amqdjk15hZOJhI5nMXaHc2x+foN0ZmV1f4SEhYBmaWx1a3CAfGhxcXxuk42PfHR+fXFxbnVtgn93eXVqeYiCiImDlpKSkIuNkZSUjpeNgHmIl4iHioaAkIh4bGtwaGVYUltYWVlbTVBVVllYTklIRUpKSEdDQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS8qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW2SiJqQmZakqK2esZ6nuq+rsrDCsbvDx5qWj5SZi46FeoSQmJSNkIyPhnGHgnSIjIZ6cHJwb29kcWdfVEZJQz48Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FVTEFJUUlir7KfcHp2a3xscYKBhIB6hIWFeXKglXR4gHN1lIc1cZ2onY6hoYSjhXZwh3yHfHSMro2JgWhnYmpucm1wg3VpcFh1cI6bkXZtf3t9bXJucIB7c3ZuYnWDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY57c3FxbWBbXV5cWllhX1JOW1pYV0xISkZJRz9DQUJHP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJWRnaSnnq+VpbSprrCuwbK7wcWWkIyUj4CIfG6BkJKJg4qHj4Z1goRslYiIe3V4eG13bndkal5JUEc9Pzc0NDk7Ozs9PkBCRUhMTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0hMTU5QTDdDTVFTREuFdH97e3V+bHaHh3t8hIN+i311opp6foaBhJmEmpxhhqqfnYqDkI56d4l+iYiOc4uXj4R7XWRxdHp8d4ptaGpieW+FkIJ6b4F4dYR6cHR6eGtuaV12hn2HfIeGjn+KkpeDjYWMhn1xhH+EfXZ3e3yJeHF0dWZnYFtbXlNcZ15XUFRYW1VHSkpFS0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJicnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XI14in+TjJGcnZ+mkaCqoLGor8Cyu8W6lo6RlId7hnZrf4yRgn2Kg46MeIOAc6CEin19gX9wgX56aHZsUlhMQEUyMTEzNzY2ODg6PD5BRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1FMS1RdWVJLaIKHeol5e3F8j4t5fIiGfpaHdqGaiIePkpSlja2pSIaur66LgYCUi4KLgoSSqYeAmJiKnHRtfIGGh36OaGdoeX9uhYeChXGEhkhsgHdyeXZobWtfdn2DiH+IhIt5lZybiYuIkX96dYp2fHhtb3d+gXV1c21cXl5bY2RYZ2VcVFBQVllQRExLRk9JQ0ZDQ0BAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkY6Wl5KWoJ6soKa4r7O9s5eNkouYi310cH6Jkn59jIOSlH2Gfoakh4h/goiFeIeJfnOEeF9jV0tCNjAuLzMzMTIzNjY4Oj0+P0JFR0hKTU5RU1RVVFRWVVNRT0dDPzgwLCOHWz8/ODQuXZZwc6NVRklLTU1QV2BZb1lcXmmMkoaUgIOBhJGSfoWIkYGalYKhoZiVm5qmrZOZu7Gnu8fDqIuMoaWOlImBkXxxg56fkZ1/d4WFi5CHkGlocISBdIyHhIpyhoJ3iIB7doR8bnZ1Zn+UjoeIiYeIh6GropaJjpd/eoGIeXlwZ2t4f3x/dWxlXltbXmpeYmdgWk9MTldSUUlQSkROR0NKRENBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmd4N6f4x/gZCOipqbpJ2hrKarr7CXkZGEoZSEeHd/jJR8fpKGkpV/ioCSm46DgIGMioKJjYN/ioBtcGpdQkA0LS0vLy4uMDIyMzQ3Nzk7PT9CREhJTlFSVFJTU1RSUE9IREI8ODcvOUM+PDw2My5sk5dNUElJTExLTlZgY39mZ210m5mOmZKSio2OmYiSj52LoKCSo6qlpKyTqbaiqMHCrseveLqUmnyNoZ6ZhJOFgo6hn5SZkYWKhY+ZkZZscHWKjIKWjI2Od4+EcW2FgYqWkYOFiHGIoJaGkomNj5aktKmbjJSig4eSg31/a2pqfIGCg3VjXmRgW2dsXWxsXldLSE5SUU1MTEZJUENETUZCQ0VGQj05OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcXaShn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReX+SiJGSfYqEmJKQgoCAi4yJhpGHhYmFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5PUlRQUFFTUU5QSUVEPjs8OkRGPz48NzUyPD9SNUhISExMTU5SXm6KfHOBfJ6cm6eloZmglqKUnJ6onqirn6isqaq2l6u/q7bIyLfI0M++m6Bwaaupn4STkoWcoJqbmaaSkYiVopubeHp+lJiTopOXl4GUnnt3lZKrsomNl598lJ2bjZKVmKOhprWvnJCYqIeWj42AiGxzc32BfnNpYF5iYGJoZGBnZlxSRUpLUE9JSUxGRk1DSExGR0NCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfGF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjHyKho+QjoGCgImLioSShYOHiYGAh3ZeYlA0NjAtMS8sLjAvLy8uLjAwMTU+QUFNUVJTUVJTVFJOU0xFRUA8Pj1GR0BBQDg2NjI8OTtGSEdJSk5PUVlthY93lImhpaizvLekrqurpqi0q7C2srGtu7Gzvpyzw6u6ycq3w7+4paKws6ytqqOLlpiFpqago5eBppmNoquopYiFlKShoKuhpKiPnLGLlaOmt7qboKKwkqKdop2Qo6Grr6yytaKUpKqImYiSiZV5en6GgGliaV1mY15kZF5nZ19bT0NJSFNORkhMRkpHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGJXaW9YeoV2gZOFiIKbg5KQjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkI6DhIGLhYaIkoaDhYmHiIeHcW5hQEU2NDwzLzExMC0sKy0xLi00P0NBTVVRUlNVVVZVTltQR0hFPD4+RkhDRUE3Ozw1Qzs9RktJR0hRT1BXgZKfhK2isamxwMbCqrPFtquzv7O4vra/tMG2u7qjuMWotsnHtb65tKijtK2wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqa62u7K6rLC1orGssbW7t7WutKCnqKOnmqmvrLK5t7imm7apjKSOkZOfhniBhXdbY2VXZ2NiZGBhZ2BbVEpERExVUUhJSkRJR0VBQEBLREJNRzw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtZUWJjV3l1cIGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomIeYaAjJKMh4SBjn+BiY+HgIaIhYqHkXp4bl1WQEVNPDY6NTZBQjc2NC8vNkNIQlFcUFFVV1VcVlBfVUlMS0E/PkdLRkZEOz5AN0Q3P0JKSkVGVlNQXo+kraOxs8G1t8HMyLW7xL2zs8C2uMG1v6+3dLGzpbrEpLDGubGzsbSopLW2qrGgopebopKlsK6mraunpJigrLS7oqiyurW8v8y/xcW9vbPBt7q3vre6t7msrLClsKmtvbC8usHBq5i5p5StjpeXqoh+g35sWGRiWWtmamZXXGNZVlNJR0ZMUUdDSElBSEQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxRVlNZVVp2am9+joSAjYRuenN4h2K5oZmjiZSUlpKUk42PlpKHhnuGgY2VioCEgYp6fIuHhn2KgoGLhJV9d3p1ZVBcZEdFTDtRY2FbXlNGPztIUEVaY1FSWFhaZ1lUYGBMU1BFQT9JSkhFRUFARDxFNkI+SEdKTFNaVF2Trri0urjIv7m9ycy7vMG7t7W7ura9tLqxxmB1sqSxmp6rvamlqKuqpKKytaCrqJ+Vlp+ZoK6lp6aln6SToqextKeysr22wb7TycnTxsPFzMLKw8C+vb67vLe0r7i3tsO5xb3Cx6+euamhq46kqLWIgYFzYGNjX1hjYGpnUlhgVlJVSUVFTktAPkdEPUpBPUJAPUY+O0hBNzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+MhI9zbHJyc4fVwLWZoI2VmJmRjpeSlpaOhod9hoONlop+g3+DeHuLg4d8i3mBioKXfnR9emtmcHVZXVxQZWRiYGVkXVtYV1xNZG1VUm1tX25fWGdkVVlVSkRCS0tJRkhISEhCSTpEP0hLVFRWXFpbkrnAuL22xb+6uMnKura5tbe5sre1s662tphkdaicrXBeoqycmKCim6SeqqWUn6CQk46WmZion6agnpqZg6SerKWqsK24sL251NHP1tDKzNLMz87Kxr++wsq9wbzBwMTExcq+yM6zpLuwtK+aq7i7mH97bV5hXVpfYlpkY1BbYFNQS0NBRUZFPEBFPkFIQUBEPTpFPj1KPzM3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRXFloX2+WkZCUbmxvdHWHs6ugoZ+LmZyZjIyVkZuShYqKfoiHjJCLiXyBg3N7ioOFe4l0goqGlX9ze3lsbXV7aHJlaWxpZ2ppaGBmaWlsWm1zlq2kvIiGZ1tvaF1aWlRIS05QSktQS1NRSExBSkZKT19eYmdpYZe3x7C5srq9tbHExrWvuLGwu6uysaert6uMtqedmqeaTpqdjI6flpGmmKWVipOTiZCJj5GRnZuhl5qVloeemqebrK+osKi0tNTV1dbTy9DU1c3Tz83FwsnQvsnJysnRx8zNwtDRt6/DvMS5pbW6wqKDcGVeXl9ZYVhaZlpRXVhPUEJCSEVCSDtBQz5BRz8/QTc7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlSZVZzkJCYgmhxb3l5g6CpnqaXjJqbl4uNlZGajn2Ji4SNioqLkIh8hIJwf4eBhnuHcoOSi459cXh1bHF4fnF6bnhzbGmBcG1jam1weGl3fH7Lv8Hfp21jeG5jW2FgSlBSVU5ZXlBdXE5QTlRRVVRcbm12gnGWrbistKawtaqsvL+wqrSmpLimq66gq7SjjrGumpeYjJGTkYSOm4GNppGciYOLhIqJhIuElJWYl5ObkJyYmZqfnquspaiirK3P0tXSzszT1NTQ1NHOyMPU0cfN0tPT18zR0cXS1sXAzsfHwqi+t86ee3BnX2ReWGFTXlpQUVRRT0g+QEZBQkU8QEE+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU5adYaFindsd299fn+hnp6hjIyYk5OLjJKPloR5hY+QjYqJiJGGf4J7cn6AgYd6hHWFk5CIf292cmtzfXt3e3OBeHJqgHNyaW9xenlxer7Lmn6MsoR2coR2aGFrXUNaWltWZWNZZGpUWFxdYGReY3d6fouBmKmjpaGfoKilqrC4qqWzo6GtoqOtoaexn4immpOSkYmRjoiBk4lqlKKMmYSBhn6Rg4OTl62LlY2Umo6Gk5Gel6ewoaGhpaSpyM3PyMLM0dTS1NLO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsw8LLjHRwZWJhWVVaVFxQS0dJSkpAOzo7REFEPEJDPkdCPkJCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnJSdlIWLlYmPioiNh45/eIOTmIqMiIiLiX6DeHN7fYOHd396hpGVf4Nud3BtdX92eH10hXx5bId2dG59doR0eHudtYw7QYvFpX6MfGllV0lDZmNlY2dqZG53W15maGtuaW6Ag4iQi5ydoJ2Ql5ieo6OlsaOks5+hpZ2gqKCjsZyFnpKSkpCKjouGg4+EfpybjI2ChIV6lH+CqZWjjJGKl5KLfpiLmpKrs5ibnKicp73Dxrm2xs7S0dLQzNLLydTO0NXa19fY1NnYzdjbzsnZ2tHWvsvLtXp4cGZeW1NXUltWRkdKSUVFPTo3OkBAQjpGRD9EQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxc4WNfJeQnYt/h5KDiYaFiYGHfHiFlpaIjoKHhYZ6hHlxe3uDhnV6hY6NnHmLcHxvb3p/cXuBcYOHgG6OenR3fXyCdX57hoevc1ipwraNkYJwbmI9XmhycHFwbnh2gWVob3J1eHF6i4aOk5GblZ+Vh4yTm6CanqmfoayboZqZn6Wen6uZi5qMkJGNhH2Ih4OFi46gmZOIg4d+bJl6hJmGiJOMjZSMhnyciZSPrqqUlpifmaevtr2prb7HzMnJzMvQycPSytTX2NfY19Xb19PZ29XQ29rR1sjUy5Z7fWpqXFtRVFRfSENGSUg+QT49Nzo9Pzs9Rz0/QUFBREE+Pzo4N0VCNzU1NDc5LzU2NjQzNTU0MjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw5OUQ/Q0dSal5tZGJma3aAiHGRj5qAeoCNfoKCgYN+g3t8hJiNh4t+hYaAdoJ5b3t7hoF0epKejqB2jnWCdHWBfXOAhG+BkIJvkoR1fIGFenaGe4i3xaTBybiBlpuPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aUlY+XkYSJj5aZl5alnJiflp6TkpejnZmrlZCQiYyRgoyFiIiBhpCRnpuZiIaMgYWXeoiJn5eQiI2Ki4J9oYqRi7yhmJSYmZyppqaun6i2v8DAucfKzs7FzcrR1tXV2dXX29TW2drb19va2tjO28aIfXtpa2diVVhWVk5MRU5DOz09PDg6PD44PUA2PT9APT8+PDk4NjdEQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9YZWFdW2h0enlsiYySd3Z6int+gH5/fIR6fYKRiYSFeoSHenV9dG18fYZ+dH+TnpGeg5F8hn54j354iopugpqAdJmGfoGJhXx9kHqPqY6Pw6G9jJyjnH2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJKFiYuQkpSOnZqSlJCWjYyVn5yUoJSRjY2Pi36Qjo6LhImSlpqen4mMlJKdkYKLgKaZiISNgoWEgKWHiou4mJ2RlZaiqKGenp2kr7e6tazAxsrQyMfMz9PT0tjT1dfA19jZ29ja2tnZ19u5e3t6bWtnWWJcVFBPSURMQjw8Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3REA4Mzc4PjYwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODY4OT89RFJTUlheVVhmbW1taYGOinFzeYp7en98f3uHenx7i4aCfXSDhXlyenNtgH6EfneFnKKbnZSSgIyIf5iHgJyRboeohXqgi3yRjYOIhJt9mpCKjKOioJCkr5+LkIuFi4GThldyrYufq5uPg5ibj4+OXIKikYKMn5OVjIeIjJKTi5SUk46Lj4qHlpucj5SWkIqSk4aAi4iSjYqKnZaZoqKGk52WoIqJiI2ckIOIjn+Dh4WkhoyQs5idkpWXoaKfmZKcnaiyuaymvcLHzcjGz83QzM/X0dHVrtbV2NrY2trX1dnZoHJ/d2loX15ZVFhZQ0FIQz8+Pjo0OTo7Nzo7OzM7Oz89Pjc7OToxOkg+OjM3PUA1MTY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2N6bWF+kYNvbXeLeHl/eoF8hXt7doWEf3NwhYF6dXZ2dISDhX5/kqakn6ailoqdkJSXi4qol3OKsY2Ep5KEmZOFmYyilZ+Yk4ianqOSqbCgkJSQjY6IloxujbeFmsTIspuhpZucmJaQspFkpM3Ilo+Gh4iPko2NkpOJhYqJhZaZm4+PlJOGlJeDf4+LmYiNkKqWl6OjiJmflpqIjoaWl4qEjo2Bf4iPpImNk6ial5OXmaGZn5mTnZujs7Smo7zBvsfFxcnIycLL083N1KnS0dbW1tja1NPazoR1gmtmYGBfUEtWXEJCR0M7QT04Mzc7PDo4PTY0OTo8OjgyPzk5MjpJOj02N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRKUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJlg0d1go59fG19iHh6fnqBgYJ+dnaAgntsb4t+eXx3eHyEh4t+i6O0qKSrs6GWp6ClpJaVr6KDkLiVkrOZjaGgjKSbr6KknZiQp5epma2wpJeUlZSQi5ialqDAjqPJuauaoqWtmZGbnLKdhoWoop2YhYiIjpWMi5OPh4GGh4iTmJSMipOThpSYhoSRkJx0kZmylZakoYicmpOPipCKl5qJi5aNhn2MmZ6KkI+cmpmTmZiglaGdlZ+bobGuo6S3vrPFx8S9w8O/xs7KydKnz83T0dDW2NLP2Lx1fHhfYldiWFJJS09FQkNENT46NzY6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER01bXFlJaGE7SISKentthYZ5fIR4gIWBfXB4fH18b3OMen2Ce3iFi4mGg5KovK2ps72vpa6zs6mjorCsipq1naK4pZWtpJeprbempKOfmamYqqSvsaqamJuUlZGYoJeZu7utyqFptreqsJWYnqKrkpe9pF6psoKJioyUh5F8j459g4aOkJSUiIeSlouPlY2LjZaZk52atJaVq56LnJSSjZCSi5ibipKdj4uJlaChjZWNl5mdk5yZnpWioJScnaWvqKGls7irwsjEtru9vMXIyMLQocbJzc3E19bQy9Ojc31rX1xVYVNRR0Q+PENBQjg/ODc0PkY8PDY8MzUzNTU0NTRCMzk6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZkhhYGJwSUCLiX+AcoaHfIGJdYKKg35tfX18fnB3h3eNgYd7jY+Mhoyaq8PAsL3Gu7O0wby0rKuzt4yosq2tvaubuqSorbm3qqamoqKko6qvsrGqnZyjmJuYl56ipaWSo7muqMC7rK2yuaWkp32Ihpytva+Ci4uKkIOOg5GOeYGHkI2OnIiIj5eNipSXlJCal52nmrCakaudjpqPko6VkI+Vl46RoJCIlJujrJWWj5ScnpSgnpuYoKGUmp6np6SipLCzpsHGw7Cwu7bFxMO/zafHw8fDvNbQzMTKinZ1ZF9cYl1PS0NMQEVHPkE/Qjw6ND5BPT01PTY+MzMzMjQyQTE3QEJOP0dAQ05DQT1DPTs4NkNCNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGhGX2lnWl1ck4yMiHuHi4aDjHWGkIqBbn57gX5xfoF6lXqSlJSYkZOVqLTHycDCzMHDuse8uq+rubuXsra6s8CupcCkq7C8vKquq6Ojnqisr7WwqpugqpyinJafsLSni6K6urXBu6uonLKkpKiUhI6pxMOkgouOh4iEhpWUjHmDjJGPkqGMjJSRj4iXoJeSmZWXpqCunIyqnI6Wj5KRlZWOkJWRj6GThpefoLKflJuUoKGZpKCaoJyglJiep6Smp6SvraW/xMKuqbe1ycO+ts+yxb7DvLPRycfBtXd7b19aXmxUTklETUtLSUBBPUJEPDVBRDs6Mz04QjMzMjI2M0EwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmdcTWVcZlRjapmNl4mLiJKPhol5hpOQgXKAe41/d4aBgpB6jaGWqJqamLu+ycjKwtLJysLNvMGzrby/p7q/vrzEuKzBqayzu72qsKqkpaOsrrSttrWgoK6fpaKYo7S8qZuovMGjtbavq5KvrKqrloaaqqelkYKMk6SVioB1iZJ5hY2RkJ6gko6Ui4+MlKOZlpuUlKOeqZ+RpZqMj4+QlZaIfY+VkpKjmpWgopy1ppCfl6Wko6WfnqaYnpWXnKWjqKiisq2ou8DEr6Wzt8zAua7Ds7u9wbmtwsLCv5lwe2NbWF5cTU1OSkdEQ0hCQkFDSzo0REg6OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5sSV9YYVpkZFeekJ2Nl46ekomKf4ifkoR4hX+Vfn+QiIqQgJWgma6no5jDvsnEyMbSzc7Ny7zCt7C6vbS9y7vDwba3vK2zwLm8rq+ooamotq2uqbK3mp6soqehnau3t6mlr77Esb25s6eps7OtrpaVpa2ooJGOkrHFp5WNfZGVfYeRmI+qmZiTk46TlZOlnpOdmZOhoqGcmJ+Yi4yPj56IWpCWl5KWpZllmKOes6WWoparraunnJ+nl5iWmJWhpKmnn7asqbq8w7WmtLXLwbiqtqyzu7iuqLi6vLeEbnBcWlZXUEdLU01LP0FIRURIRkY4NUZNOz43PkFKLjMyMDI1QjU1UFdOPExGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhWPD5AQkZCc0ZpSVJlY0xGpZSclaGXqJaMkIOHpZKIgYeCm4SDlZCRlI6aop+vvq6hx77GxcjHzs7O0sq+u7axuru8v8+1xL23ubeysrazt7Osppyrq7mrqaivsJejrqSnpKW0wbCrrLO+wrnAubOnuLS3s6+VpK2wr6WLk5WhjXPBmX2WmYSOlpmLsZWampWSkpmZpqOVoJuWmqmcm6GgmYqMj5adYEqWnJqVmaWXVJawn6+cn6WUr6+tppuhppSTmZmOnaCnoZm0qaqzvby7q7Cyx8C4pqyrrbGxo6GysrSlc3FnXlxQUk1FUVFQUTtIS0lGR0FDPTlLVD9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oWDw6QkNAPVJFV1NzYlZGSKuXmZ+hqK6YkJeHiqeWjoiThaCIhJyXj56gm6Oltcm0qca8w8TIy8nIzM7Hvrqzrrm5wcHNtci7wbm1urGvr7K0p6ScqrS1q6mmrayZpK6lpaisusCoq7a2v8HAv7iyssOwt72ro661rbqliJuXppt2vp+EmJyOkpiai66WoZybl5San6GpnqigmpuqmaGnnpeQjZGdg211k6KalZ2jn5CusqOrlamqmKuvpaWhpaqTkpmciZWcop6Wsaapq7q3vbOyrr65tqCjp6mlppycrKmpjWZoYmBTTE1HSE5KVUw9TUVNSUpAQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc8Oj0uLlNhTVZIfmVeSEaslZyhn7uumZSei5Oqm5GSk4mqjYahnoyjrJSkpLbHvbTBu8LCx8nFws7Iwr25sq+5tcDCyrbGscG8tburqa2ssKOjmaq0uqaqp6yqnaivp6Srqr68qK28tLi+xry2tbjAsL3As6m1tqu/pY+jl5Ghn7ueiZqgmZednY+2nqmcpaObnKGap6WzopuepZyoqp2YlY+Um4uWiYykoZScop+hta+lppOxq5qrrZ+fpaSqkZaVoISQnp+clqmkoaG0tLq1rai1srKenKOmmpeVmaqhnnhjX2FfTElGSE5RSU1ERkZCUUtIQURHQVZSREg8QUdRMTtBNzpCRjc5XVlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdFp5eknp7DrJuXpJeZqJuVmpqPqpaVqKaVrayZoqq2xcK8v7jAwsDIxL/Nxru+ubKwuLS/w8i1v7C8t7q3p6Srq6yhoZurqsSipamspp6rr6yiqqi/uKatvrC3t8a2tLm4vrK/wba0srSvvaOWo5WSm5Otn5ChoaSio56QvqSpnamsnZ2gm6afvaKYo56iqaugnZaNlZ6TnoeOhI2TnqShnbWsppyWsqaZsKmgm6ufoY2alZ+EjqGam5KlpJqYq7G1saqlqq2snJigoZKOkJWon5RqZVxiXlBKSEtPTUhFQ0lAPU9IQDtHSUhbUk9LPUhOVTRCRTg+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZmNYTqKbpJuexayhn6ydnK2fkqKelqWgpqmsl7axo6qztsXCvcC2v8G7ycK/ysi2uLW1sbS0t8LGt76xuLW6tqCnraqrnZ6fpaTBpaCprqCkqa2woqaovbWmsry3trXDsrO3ur6zxMC4uK60tLSjnaSUkZOgrJ+YoZ2oqKqimsKtqZ2srZubnpimoL2hnaSYq6urpqCZjZmfkp6Ijlh/lp6moaC4qqaUmLajnrKioZywmKCPmpSego+gl5aOoqOVkKWus6upoqKlpZWVnJmLj5GTpJ+JY2dcZWFNSktLT0ZFQUZLPj1JQTk5SkpOXVFRST1MVlw4Rkk9RE1JOEhjXEtDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YVM2U1prV3NIRTY9dWVcTE+eoKGYnsOnpaKzoJyyp5Oqo5+jn6yprJ27samstbHIw8HDs8LDvsfEvcTKvbCwtq6xtbDAxbW6sbC6tq2aqbCpqZuepqGowq2brLGcqqKusaqkp723pre7va+3w62zs8K/ssezurertLatqqKmlZWUoquhn5+Zp6uvr6+7sqafqamZmZeToqS4oaGjkq6vq6SlnpKhnpSdjpCNlJ2ao5+ntKenjZi0nKOvm5+cr5GglJiUmoCSopaPjqCgk4umrLClp6KdoJ6SkpqUhYuSjZyfgGRoXWhmS0pMS1NCQ0BJRzs7Rj44OU5NVV9SU0o+T15dPUhQQk1MSThOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8d11eP1tVX2ZyQDg8SJZ3ZUE0n6Sfm5/CqKOqsaCjtKmVsqumoqSyrK2pu7KtsLS0xr/ExLXAxL7KxbbAycK1q7WpsbmswMW0uK6ttrqlmauyq6qYoaeXrbu1m6iwm62frrSyp6q6s6e5sriyuMCquLLCvbTFp76urbe1qaesoZaWkaWkoaGXl6Sut62ytbafnqikmZSUk6Ogt6OkpZWusbKlqaShnpqZmpWYqJ+emKKfr7Kip42Xr5ilq5ibn6aSnY+VmJqGlqCVjJCdnpSLqamqoqehmZ2WjI+ZkIGGlomVn3pmal1sa09RTk5UPUJBTkM7Okk/NzdRTl1fUlZRQVdgXEJKU0hWS0g6VGRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzkwNnBbYkgwNUpxalZDV0aMeWZDO6SknKGlv6aorq6gqbWqnbivq6SqtLexsLi3sLe4t8W9w8e9vMTCx8G5wcbBuqq2pa27rcHDt7iqrbK8o5WtsK2yl6aokaq5qqGnsJ2roK+0s6qqt7Wsu6yzsrm3rLiwwbq9v6bDqrC2rqmqq6admJiqoaGgkZegsK6zq7C5mZupn5mWkpemoLeppaKir7Gzq7Gnq6CcoJ+bnqWdoJedpLSwm5+QlKaaoKmblqOgl5mLlpmUlpedlImSm5mUjqmpp6CjnJibk4ePmYt+jJeGj5psam1ibm5YUVFaVEFDRVVAOztIQDc6WFBkXlBXV0RZXl5OTFNPX0xKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE3NDdnWWFGKEA4bX1oXFY6iXtjQz2on5yhqbyhqq+qorG3qaW0squhrbW9r7O4vbu9t7bBw7/JxLnFw8DAucW+wbivtqirt7K8v7+0qq6yuJ+XrK2orpioqY6nu5+lrbOfq6KxsLOsqraztbytsLG1rLC1scC6xbarvK+xt6ysqaKxpZ6kqJ+jlo+Yn7Kqs6mqs5mdp5ualI2gpqS0rqehrKytsaeyq7Gpo5ueqKSelKCZm6m2qZeakpKfmZ6hn5KtoJqZh5eYjJ2anZSLj5aXmpempqOgnpaWl5SBkJWFe4+Tg4yXZ21zaHBzX0dZZlZEQ05YRFo5SEI1Pl1RaFxOWl1HW15dT01SWGRLS0NdY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVYxNTE9YFZfOClDM1lVXGdLNYx6ZkxApJqfpKy2o6yopK6ttamus7imprC4xrawt7/Bwra0usW+zMW5w8G6wLrEuMG5srWsqrq4u7q+tauvsbeZmKirq6ucrquPq76eq6+xo6qfsa2yrq62sri2qq2usae1r7S6vMmyqrW0sbSvrqags5+aqKygpJWVmpmxoq2gpa+WoaSZmZKNoqWmsqmhprGsqrWkrrC0r6OZna2nm5edmZmsuKKXk5GPmZyhmJiUraGfloKVmY6enZqWkYqUk56apaOjoZmXk5KWe4yRhXuNi4OLk2xueW91fGFGYGpaSUhaWz17SkdFNkFiVWlbTVxhSltcWlNTU2JhTEtFYGFgUExJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4rQS9KR1BbRzNjWFRLRZqWn6+osamspaOurrWpt7O3o6y0t8q6tLu7wL60s7fEwMzHvMS9t7/AwLjAvbK9rqi6ubi3wresrrK5lZenrqynpLKqlK+7pKyysqanorGzsLKxtbC3sqmuq7KmuK+1s8TFtqm1tauwramnorafn6axoKSUm5iUsJ6nm5+pjaminZuVl6WlpLanorCzq6exp62wtaykmaGsqJycnZuUqrmclY+PjJidopiRmKikoJiFk5eRnZyYl5eIlo+Xm6icpKGSlpKQlneEkYZ8hoKEjI1ucXh2fH9dS2VsXEpPZFw/YntHSThHZ1dmW0xeYk1YWVdVWFVpXU9PSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZzI3J0ZhTFYlLUIuPUVMUTwzcmtMRESRmaStpKytq6ajsLKyqrewtZ+rtbrJuK7BvMO3s7G1wsPPxMDCvrS9wcC7v7y0xKiqubG2t8C8r6y0tJ2hp7GtpaaxpZ6ytayqsrGrqKi0uay0srWss6yqq6isqbmtsrDHv7ikubCpra2mp6ywpaSjrqOpnJ2bmq+ZoqKio5Csn6Ogn6GppqW4pKu0tKSqq6isrrauop2jqKqcoJmakqS0mY+JjoiRo6CWjpWfopaVhpCVlJ6bmZaVh5eSlZmnnKCgjZOSjpF4fo6EfX19h4qKcnRzf35+XFNkbl5OWmddRkSWW0c6Tm1YYlpNYWJOVlZWV1RZaF5RUkxkWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozRGQ7NipIZEhKKzpJPzNDSVMsPo9rP0hJkJupqqGpr6Sno7O0sLS1sbCgq629zLquwbzHsbSttMLD0cTFv8GyvsPCvL+4vcWorbestLi8wLGssq6ho6euqqelsaOrsaquq7Gurqyrsrqnt7GyqbKpqqalo626rKqwwrm0rLmoqaitqaewpamkoq6qqKKenKKslaWdl56Yq52hp6ihrKairKy2sLGgqaKfqq2wrJ2epqepmqOXmJCgqJiGg4+Li5+gkIyOl56SkYiIkpahnZaYloaWk5OXpZydnYySkI2Kf3+IhH13gIeFh3V0col2bF9ZYG5jUXNyXEs8hHxGP1d1WGBZT2NcTVVWVVdRXGJfU09PaFhXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSzAuSWdERjg8QjA1RUtYMUCUXUBORpWXrKehqbGcqKivtay4ta6ppKurvcm7sL64w6+wrLLExM7Ow7+/tMHExLrBtMnErK+3rrO6wL60rq6spqepsammqLKmtK2qsK2tsa+yrLO6pLizrKytp6ugo56wt6uqrbm2pLW1o6morKyqrKCopqexsaOmpaGhq5aqoZSboKWeo6Kqo6yinqaxtqysoqWjmqmrrqmdoaWkpJmfmZWPmJ2TgYKQiYWdoI2Lj42bkJONhY6ZpZuSkZuLk5GRlKOam5qLj4uLfIeBgoJ7dYGEgX51eIujh3hrXmBuZ1dmh2ROQGeSTERieldiWFJlVU1WVVVUT1xdYVZLTmlXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREhkJJSUSXka+koqmvmKmorbWqtrCqpKupqbzBwLi5tLy1prKvxMrL0b/Bu7jAwMK6wbrCxK6xtbK0vMG+s7GvraysqLeqpq2wq7iuqLGwrrGrtaq1tqe1t6uspKmqnKSes7OoqKSztJ+1raGpqKuoq6afq6uoubapqqmpoamfrZuRqaGdoKOipqKqnZumtK6npamipJelpqeqnKKjo5+ZmJ+Rjo+YjX6HjIeFnp6IhYuLkJCSjoWIlqOajo2akZKQjpKfl5mWjYuEf3SHgX9+eHWDgHp4foCInY9wcmdncXhcYXSIaU9dmFZIbXlVZFZSYk9MVlRVUU9YW2JWSFBqVFZUR1BZVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDI/Zj1OWD9DLD9MVF8vSWs3UkY7lY2vn6WqrJmqpK2usrSvqqWvqam7vrvBsbC5raK2r8nHyNHAv726vMO9u8PBv7+vsrOytr28wbGys6uzqaW1qKSss7K4r6KttbGvsbmquK6qr7erqp6qq6CjobWtqaGfr7KhtaqeqKeqo6qhoaytqL2vq66toaenn6uZj6+imKKgqKaep5uYqbCpop+soqGSoaKjp5iaqKWYmJidj4uHlIh8jYaEhaSWhoOCjIeQj5KFh5WhlomSnZGTkI2RnJSXj4qGhnh0gX99dHh6gXt0dHtqgoijdmleZWyBdWeIi3xSV3BeS3hzVGRTUV9NTVNaZ05NV1llWUdTalJRPkJOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaDozOF89YWQ/RjFDUFtbK0hQO1lDNI+OsJ6kpaqipaOsprSzsamksKequL7BvLCouaqnrrDJx8jRwr3Avrm/v73JvMK4sbC1srq8ucCztLytuayjtaanrLG2uLKmp7m1rbS8r7ulra22qq2cqa+kn6Wsq6icnaqypLSpmqqnqaSpnaOpqKm9q7Owrp2po6Cum5qyopakm6Wkn6WamaeqpZ6aqaGbkZugpJ2ZlqipkZmakpCLgo+FfY+Cf4iej4eAfoyIkpCRhYKUm5SGk6KNk5GLkZqSlYeKf4Byenh+fGh3fHt1cXJ+aYZ6hIhkYGhjcoV7bWh5XV5WQ1h7bVRhUFJZS0tNcHRdSVpbZ1pGVmdPQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOkq+Yn56ppKOhqqS3srGkqbGnrbnBvbWwpLmsqKiww8nJzMG3vb+1uMG6yLXDtbSztbK9ubq9tq65tr+torOmqquutbe0qZy6u6ixv7K6oK+0tqmsnq2xo5ylp6mjnZykr6avoZ+rqaeiqpyjqaCtu6eusa6hqqKjrp6erKaXn5qhopufmpmiqqKamqOjlZaTn6GWnJalrIufkY+RjIKKf3+PgHqalIyJfX+Mh5GQjYqGk5iRh5SjipGRh5CZkJOBiH15bH12eXhie3pycHFzeGqCdWqDZ2NoYW5zjm1ianBgb0JdeWtWXk5RUUtJTVNZVk1cXm1XRVhhT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNSXT0jkZermJ+Xp6Ohn6ejt6+uoq+wqau5wrqzraC5r6uns7rHysi/t8G+r7S+t8S2wrKwurGywLa7vrequbi9qqS0pqiqr625sKiYuLyjrb60s6GuuLWnpqiws6CepKWooaSZnqyoqJ6gqq+noKaXoqigsLifo7GvoauhrKScpqapmpqbn6KVnJuZnammlpueqJCXkpidk5mWoamQmomNkId9h36CjXx7oYyNiHmEjYaLjo2GiZOajomVn4mQlYOMlo2RfYV8dHB8cXN0YHl4am9wcXBqf3NkemxoZWRiZoeAYFtyanFNToBpWFpNUUxLSFBSUUhNXF9vVEVZWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXVs1KJWbpZiclayfnqGkobersKO0tKmpusW3s66guK2urLC1xcfAtr/CubC0vbe/u76wrL6ws7+yvcK5qru6uKeotainq6+rs7ClmLu2pKu6ta6esbivqaWnr7KcoaSgpKShlpuvpqGfo6ivoaCik6Skorewoaaxq5+so6+XnKqlqJ+Ymp2jk5qbmZylqpqbm6SUlJeVnI6Tl6KooZCJio+GeoN9g4p5jpeKjYd6goiEiY2PhY+TmIyOlpmLjpZ/hpeMj3mBe3Bydm5vdF94d2VtbGxqaoRvZnJpa2ZoXmR0gWBba3ZpWkp/XlxYT09LSEhSVUczOV1ebFFFWVVZZU1ISUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVV1oRC48MmRXLDKUoaGXlJyqnKShoqC3qq6gu7ilrL3FtLGvo7WwrKyutcPDvLO/urexs7m4ure6r67As7S5sL/AuK29urWlorKpp6mxq62xoJm/taSntbWonrK8qailqbCsmaOnnKSllJihsaWZn6OoqZyin5OloKS4qKSnrqaepaGokp+ooqGhmZudn5Gam5afoaqbmpiglJCTlpmNlJOjp6SQiYmOhnmEeoSFfJ2NiYqHeoGEh4mKkoWWk5OLkJaUjY2UfIOXjot3fnxsdHJsbHNhd3VpaWpnZ2+GaGhpY2ZpaWBqY2poXGZ7Y2BTdFRcW1NMSkdJT1NAISpoXmpNRFdVXmBLSUdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnUCcynaKkkI2kppqdnp2jtK2nqrq2p6zEwbexrKO2rqeurra/vryywbewrrK2tri2tq2qvbOusrG9v7euvLuxpJ+2qqWls6iqrZ2cwKunpa+yqay1u56oqauxpZieqZ2mpJGZpqyimJ6kqaGboZyWn52ntaawqq6hoZ2eoZSgpp+hoJqbmZuSmJyTpZ2soZeWnJSSjZWXi4+Ym6mfkYiJi4h4hXaBgoGdh4qCiX1/hYiHhpGElpSQjpCRkZGMknuDlY6Gc319Znhva2prZnVza2NnZGR2gWNlZmZmampja3NbX1pdbWRhTmlYWmBWSkdIS01TWD45X2xpSENVVF1bSUhGRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNCaEglNZqjoI+LrKGYl6CWpLOxorK9tqGxxry6sbGktqyqrqi4u7q5rcCyrq6utq6yuLOprLmxr66ztrq2sLi9rKaetamfn6+jqa6cosCgsaOusK63rbWera6traKanaappZ+Vmqeln5mloqidmp+blJyerK+muqiuoqGam56ZnqSapJ2Xnpebk5ifkqiVqqeak5qakoyVmY2UlJqppo6NiomOe4F0gYGKmIWHfImJhYWKjIqShJSbk5KPkJCWjpB/gIyOgnCAfmZ5bWhraWZxcmtcaGNjdIFiZmdqbmxnampobl1sbHRwYVRjaWRmWklGTE1PWVFQVmFlgVVBV1NZVEZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJzSRoZuNjrCempOhmqmxr5+5v7WgtMK7vbqxpravqK2ktre2tqy8r6yqq7aqs7iuprO1sq6psLa2sbO1uqapn7WonJ2ooaismqe9mKyjrq+1taysn7Gtr6mim5yiq6iclJympJ2aqqKklpqfnJCbpKqqqryfp6SgmJqZnaGPa6KWmZxwgpWao391kamnnpSUnpCJl5mAloqhkHmHlIyDbWl+doNxbIaLhn2FjIdwXmNhZ4SYhWuLj5SSdHeLhH6Dj39nhoBndWhlV1xoc25OUGpjZ3OFaF9lZm5tal1gYYqPhIRmTktEOUdUZ15KR1BQVVVMSFNhcHRmRltRVVBGSEVDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QUBAPTI4QEU9MSwrMDg9RzYwMS4qLiovNTY4LCMxJzIxNDoxNzVYgWwxNk9rW05cS1tmYj5HMVFkPSoui6OZhZWwm5uToJuqraqjvcWvqbjCuL28rae2sKWro7aysbKwua2ppqy0pq+1o6m4traop6y2sq60rbOhqZ+zqp6go5ulppiruZSlpa+zt62upamtqqyloZ6coKemm5egpaWbm6emnZOfn5iQnqippLawpKOinZaYl5ejiKCOkpmGoIeTnKB/pH+lqp6SkpqSiIRyeI2OhYihdoiMaZeIZn1zeKBviIeDfo58f6GgoJmAfIeedIeOdZuKbIeBg2xoZWN6bHFhU4VtYmxpmHFYaXFwiFheaVtsbFuIcW56coVnhoRaXkdOP0dfTUVSVlZRUVJXVWdeTVdJUlJQRkdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcwKIqmloOcq5yZmJ2fqqqnqr/DrrG6vbfAvqqlt7CprKWytK6vsraqqaWwraW0s5yttba1pqeos7CtsqeunaqfsaefoqKZoaGarbOUo6Wltb2mrKerqqyopaGgmJ+mo5mZpaOkmJykqZaUo5yUk6OkpqG3pKSgo5iVk5eSnIivkJeUiamLlqGchbGAo6ydk5mdlHmC1KiAh5XBm8d5eLGlt5dkgMCcv3mEhHmRhHyQkJHKcpe8nMV6crWmu5B7gGyWsauweGhrWLGubmVpvJK8bmd6b3KP2H5Ta2O2sn+BcpV0mqGqkFdPV2JQVk5GVVtYUVBSjVxXW1FBXURRTkVHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGMppKAp6qfl5ydpayyqLDCvbG1v7W3vsGqp7OsrKmnrrOpr7WzpqemtKWnuK+cs7K2q6Wkp7GurrCmqp2no7CioZ+dlpqenK2rk56in7S6oqqpoa2upaGdmpqhp5+Xm6egn5iep6eRnKealJ2hpqKhsaOfn6OWlpKXkpmFr2tqio2qfmaDlYatZHCdnZSZppRxrqGkfni7fWuhj3axX2q0W6WAZZyRYGaCe2Z/anhrqWW+cmemjHWxanyxeHSSk2NtbaduW4SgRWhmh5ZFdZxgfmd8pKeCWl+Lq2mAlXh5aqc3Sq9cWFNsZFtLTlhfXFdWO06JUFdXL0lUU0pERUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzAbkKKVgqyopZ6jpKqxt6y0vb+vtsSyt7rBpqmwq66oqa+uo7C6rqOkrbKjqLionrOzsKOloKqtr6yvpqefo6Gvm6KalpWWmpqspZaboZ+0s6KrnKKtraCdmpegoaicmJ2jn5yZoaakj52imZehn6qepqagmp+hlpWRlpCahbWbtXiFqZm1mXaGs5u3fpOWlqmUf2uBpnuChoiSlJJ3q2drsVyreo2GlHSJco+GgH+IkJd4goKLmIuDoI+EsHZ3n3Fra2x8i06kWEhiYpl+Y2imYHlydVOTh15QqW1jcX6HgGKcLlGhb1tTa2hgTEtbZFhcWkI/snlYWEEjTWhGQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjhhVTUwG5WflYizpqahr6mns6ypu7bCsLvCrbi2v6qsra2tpq2xqaCuvKqgp7Sso6u1pKays6ekop6nqrKosKelnp+frZWfmJSVlZedq6CZmaSotK6iqY+pqKqbnZWYoKSnmp6cop+boKOko5WbnpeZnaKpm6aZnJyioJeTkZOTnYPVk5m5cLDBfsaGfNaUm7t8mpWlj42djaR7joekgqWCeqx5j51Wr3qIfp9quVu6d4eEfaaCk3yYeql4jZ2Pe7FujoR0kbyFb5RQr6fFilGgemNgqmJzcohtl4hgU7W0yIaAiXxjpDNCnXZdUGppZFBAWGdaZGFKSE5uTlxST1lmWUNEP0U/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo7REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKC4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVE3MSWbopSZsqioprSqpbSppLy3wbC5wLG1tLqztaexr6Kwsqafrbaomqe5raOvsaCztLGhpJ6fp6mwqLSopJudnamVmJeVl5WWoKicmZanrbCpo5+PraKolp6Xm6GloZihoaGhmqGippueoZ6UmZumn5unlZucn6GYkJGUkZ2Ism5otXGrh26OpnK0c3K2e5qXpIuPnY2jf5GhpX6wdoOR0tJ2XK57hX+kb5uqpmuHhX2tfZeZjnuwcpKdjnizZZZ0hJ5vnmaUUsiLWsJcn3liX61gdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9rYGxoUFVISTk9VlJaV1hJQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFNNjIwoZ2SpbCso6u8raa0pqe2u7yyur+3trO5ubKktLOgsbGinquwpJemua2ksbCctLiqoKadoamksaisqaSZm5mmnZWTl5iSkqGmn5WSpaqwpqKWk62gpZKUoJukpp+Vm6amoZqin62ZoJ6ekJWboZ2cppWdlpqin5WYlZGbhax7d6h2o42IhqlvrYqCp4OYmKGJkpqLon+TmYmuhX+Cs1xys1KufYKCpH9y2H54hn6PnYWamnavhomRnId3tGGaZZqCgpRsklqwWEuadZh5ZmCtXnZ3iGiYiGtdr3eVno94bDV5yK6yX0JUb15nYEVQbV9wbVZWTS5mZGlTWFE7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSTo5OZ+elKC5sJe0wq2os6ipsrq3s7i+ubextLu1pLeyn7Osn56orJ+Up7WrqLCxq620pJupoJ+oobWmpqmimZ2Uo6GTkpuYkZShpJqSkKatr6ahlZmpn6KOkaGZqKWhlZmlqZ2cpJ6snaGdoI2TnpqdoZiZm5aXoqCTl5CmnoapfX2leKGOjYKqcK2LgaeGlp+hiZeXiKOCkYiUqnyAi514b7FaqIKCiKB5dNmAd4h0qIGOm42SpHyWkJ+Ee7JenGSgfoOVbJJcq1tak4CRf2hnqmRye4FrmIdzXataiaCOa29lT0pDoVxbTHRdYmdNW2FfcnRfS1Y3SpuUWEdFPUdGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MyPziinpqav6uYtMKuq62ppbSwt7G1vrm5srC2uqi6tJ+vpJ2kp6eek6qwqa+ptayqr6GYoaCmpKS5oqOroJabkKGflJOemZOXnp6PjIuosK+nnZebqKafjJKjl6irp5WXqaeenqCjraShnqKNlKGYn6CSnpeclZ6hlZaOq5yPrm1ytHOpi3WKp3O0eHOzgJGko5Kcjomkh5B3uG+Me4uiamu2WqGFZZeXaaCip26UcrR0k5h/smqFkoita3WzYZ1mom+Hk2qXXK1fTaF8h5FSc6NseX9+b5iHcVyvVjycd2ZUb24uXKdPY1NrZWJtWmNdYXB7Y1RaUj4+bW8zQ0JAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4ppubnbuhm7LAr62rrKe3qbevtcC0u6+ut7aqwLWoqaCapaOhnJGqqae1o7Korqqgl5ynoKWruZ2jrZuWmY6kopWMnaCbmJyfkZOUqrawqJmUnKypl4yTpZmlraORlqqypJ+epquxmaGjkJmilqCblpyXoZOdqZyUkKuZh9SSmrtzsMOAw4Z+1ZabuHiIkJiMl4uMp4h6o7Z1fXd2woKasmCDunnAfHW4Y7WBjIepfZWBrKlxe390vIinoGmdYaaOr6J+jHSHqn2+b3O8dLKDdXiBim6aiHFujaR0vV53fVphebxrWlZcanleamFlZ2NteG9aXFpEQUBzQENGKzVHIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaeanqK8oZeyw7Ctqqursae4r7bEsLmwrLmurcCxq6OinqOhm5uQqaSqsqO0pq2ln5aaqpmnrLmdo62YlKCQpZ+SjJyinZidmpGVkq+5sqyVl6Onp5SQlqScpK2ekaCoq5+bn6ijs5+jpY6ooZSimpyYlaOYkK+gkpSpnoSQmLZ/j5GMt5V4gpOatXdta25zb3mQhY+KdJ7Bu72ZeoGxqHCAc5G5g3yGhoyHjXyKh42XfKS7ub2cdXq0o3R2l3Z0sHWZnmaGao21dHJxd7aMXn96fYlog3lueWKLrHB1hX9YW6dqRWVaVGZgY15jUWhncW11Qk5QTUQ7Wk0/SjM7MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcwN0xUX0cnU2JXOCpPXl09KzpWVic+OzynnqChv6WWtMO0rKuorKupuq6wxa60say2prS4rKmhoaWeoJ2Zk6ukramltKenn5uWoKOdrKS+pqGqlpOckKGakY+hp6GTnJeTl5SxtbetmZ6kpKKLkpKmm6Wqm5appaWcmqGopaekqaGSrZ6Wo56Xl5edno+vqJSbpqGNan1pm6Z4h3J9mY50eWSHe72+wLpvk4NylYdhc2paXZqJYWOIjpVrYICVY22dd2KVa4CalZRlXmBjcJqKaHKLfYWVZ2p+cnV4fX5iW3d0gWhQXG6DfXyLa1hre4JySkpvhnBOdE1FWF1nYUxaWGdjX09bbnVpclJQREVOO0hJPU0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF9MKDM+W08nPzI+qaCoosKjm7W6taOspa6np7WxrMirr7Gps6K9sbGmoKKonKKbmZmspq+jo7SppZuXlaGbpq2ovqeopZSTm5WfmZKXpKiokJ6RkJicsLK/rJunnqeiiZORqZqoo5qarKCjmZujp6yjoKujmrGblKeglpSdn52XsKWXoaeZm5CcnKKjmKWhmZuZmZmPlYFnbX1xd5KXlJKFi7WqjIWXlY6KjJiWh5SVioSTlJGJjpKUmJSYlpqgoZqclKCdjYJ6pYZsanyRfIB1ioqBcYJ4eXZ2ioB8impzgXWDdWV3fXdrb3ptYGNdcGhNWFpmamBXWnB6bm1mVE9GUzlPWk1STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLOhs6LAoaSysragqqayp6WwtKrIqqyvpLSlwKezoJ2kpJyjlZWgqqeso6K2q5+Zlpafl62qpcGeq6OVkZuXnZeSk6GenaGnk5KZqKeyxLCaq52rn5CXlqidqpucn62ZoZudoqSvp6KlqJ+umJennJmaoJ6dnK+gnKGmlZeSl5OfoJWinZegjpaTioqNjpeukHyWm4OSgouqqYWAmJeJg4+eiHqEkIeGmpKIhoqWj5uXjZGYnaOWmpORnY1/jmahs6+FioR2e5KKfXZ5em9meZCBgIlrdYF6iHJpc397doOHgmt1ZHlmYGplY2Rma1lse3BpalxTTFBEXlRGQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2JjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRbRzU8LEC0oLqvv6yrrrKxoKumsa2irLOvxK+qq6Kyrbyjs5ufpqKhnJmXqKWppqSlsrSelZSdmZmwpa6+oKyikJGdmZmUkZShnJeonISfqqujtMi0n6qkq5aWl5qmnamanqOslJ6fnqCpr6qmpKyirpufoKCYpJ6cn5yvo5iep5KXlpyRo5iXp5yal2WCknxlfo2akGN5jm1pa3uSpKpqZJqXfWeGimVlaWh7jqGPbGiNmJGjd2tqi5mjnplzbG56g42HelhlXoaDXm2LiYF2XGhzd3eSgIeCbniCeIBzbXmEdHaIiI+DfGuHWV5sdWRec4lpa3xxa2NeUk5YSWRYQUo0Pkc3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8yWUM7Py49pZ+6vLmvrLSxqqWora2wpq2tsLywqaajra6wnqyWoKOdopmZpqqcraOlqKmyrZ6Vo4+ir6W2uaauo46OmqGZk5Kan5mZpJV7pa2iqLTEuKWip6+fnpSeop6jm6KpqZKfoZ6gqrCrrKSroKqbp5+noKuVoZulsKSXm6qVoJyakaOWnamXnX29g4hytHKEnYataHi5xLhxk6KjeqWZmHOrgnzLwMC7cYyiiIOffZaYiZ3AvYKXnZ2NncLBfIJ7ko2aw8B+bKWyboyBb8p6f5t3kYOOgXZ5gYB5cXp/h3B3hYyTeW54lGNmX3lkYGWCY150aGxkY1hMV0lRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAuI0ZbM1BZL1ZBQjsvOJajucO0sLDAqaiUo6+psK6tprO0r6mlpaawq5+rmJqin5yaqqeinayipaikpLSknaKSpq2rt7OnrqKRkZmcpZKRn6CYm5+dh6aspKutwMCxoamvqZeRn52imqGjqqOToKKenq2vqq2npKSnoaalna2okaSaqK2pmpypm6uglZWklaCilpx+zpR4eqSBeZWWm1+uj16Op4GioHynlptzq4OAr15jjap7p4eFoHWXk4izY4KrhqGNjbNqhK50fZeIt2GCrVqjzW2QdXvae3+ZcH6IknZ+ZXuIdnZrfIhufYaRkX9tg5BhcmxwaGBgeWRccWhqZGdgUlRTV11LT0M1QUhERDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU0NzcxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1LMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaOqp62zq6ayrKyqoqqnr6mgp5uZpZecoq+foJ6op6OmoZ+wrJqdlaeurLCqqKyflJKbn6STj56kl52no56upauwqL/Hs6ipsa6Wkp2bopefqaqflaCfnZ2tr6msqp2oqKSiq5KsspaloqqqnaOmpKGvn5GYppifmZOTkZegcYWMl3WFqIZxsX2ecqx+oZ6BpY+ed6qCfa1/nHOtfquHhp92mZJ7fJd+qoiijJGMnX6reoiUkJ+Ae61WnMR6j2+SwX2BlW11b4xtZXZlhm9hd25yb4mKko+EbpKRZnB1dXFhZ21lX29paW5nZFhTXWFaUlNDOUlJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkyNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwoPjEpM1ZARiEcRzpDMS4rsNPGxrK0oJ2jjqOioqyvtq6osKaoqqatq6umoaSdmaGVoKWrn6KloKioo5+dsKyXmpapp66sqKeonpeUmqOhkpSgrZudpqKvrKSstaq5zbKtpq6sl5WcnaKYnq2snZegmZ6fqbKrq6ucrKuko6ybr7GiqKuupZilqqipsKGRlaKkmZORhKRqpHWJeql0erJwgqaKmYxxiKCah6RgYFKrhH+ug5t2rYGnhoafepmXhntmgKOJpJmGgqN9qX6BloeuX32pVZ2ikoF6op+Ae8OvxYtyr7OzuXFiqa/CdGiMjJiOgm6clXFuenh5cG1nZWVycGZ8aWNdV2BqWFlVTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8PJ1dW/oZmrp6Cvop6wtLCuqayip6aoqquppKafm6Senaanp6OcrJqirKGjn6+inJuTq6S1r66gqJqdlpSmo5CaoqifoKWcsKakqLGstsiytaqsqZaRnZyhmJ+ks52aoZSdn6esraWwm62qo6KqobOtoaqzsKGaqKeurrSikpWippiakXuqbJ6Eh3WreXywb4Kki4mflpaflIHSuLS4yYCBsl9glKmDpImHoHqYlpp4qsl0mqSVqKmRk5qMgJyKmsbHeGahgqVzgZ+Ogn2vXXC0YrB1S6OGbadHgpNkjpCeknxxmZWBcXx1fnxuXGZqc3FmgWteYVlkbVxfWUlOTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2osq2spaKcsrisqqClmqilqquppp+mppiqo6Cuq52moKyanqmlnae2n6KXk6mqtrKtm6WcoJSPpayRmZynoqCppq6hpKepsLXDsrOqraiTiZedpZqho66ll6GVmZylpq2csZ6vqaeerKO3rKGxuK+dmq6msrKyo5OWp6KZno6CnU54moF/n3qEo32DpISHpp6cnpOEuHt7ebmCf8zGwrZ4m6GQi59+mpaXinaemIqlmKSof7CFnYaghKx9mpRipWykcI+EkIF9loJyrGCjc3GAmmC8fVJVdI6So5Z7fpSTjHZ8c4aAcVxubnhyaoFvW2RfaW5iZF5MTFFUQUlIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXVpaWllVU09IQDg4Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7mqrp+boayys6WeoJWlrq2uq6ecpqaao6ehs6+iqaeyoJmqpZSitaKilZehqbS4pJuinaOSj6GxmZ6bpqShoq+unKWoorayxLGtqa2pkYeQnKecoqScpZeemJqapqSrm7Cir6WmmK+ku6yhtratnZy0sbewsaWXnK6fo5yFj9G1w7d5h46FkZOQgKZ4lKF3jKCRhKWBinGqhoW0bnJqmaOclYqefJiZhoePc6+CpZuijaaLk52LlpCbbXGyXaVzk3qba5l/e5l8balho3Fxf59ic7K4aHePlKaYfY2OlY15fnmQg25qeWl5cm+AdV5lZW9tZmdgSltYWDxISEBVNEBGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZNzjYqtv7+8urSelqelrbWhopmVo6imrqusmaain6agobano6mnsaOUrKOOpa2jnZCamqqzs6ScpJypkZSXrp+fnqajnKectZmiqqS2q8OwqaupoYyEjpyioKajlZqanJmbmaelqJmtqa+jpZutpr2slL2wrJ6hr7K5qrKlmqiwoqeXeaiQfXywd4qApKWInG2yb6CHrXyhj4OnlZiArImFroWflKqgoZeGn4CZlYB7kn6rgJ2aloureJ2gkoqUkoF6r16jgX2mp2OdgHyXc2qvXaVrcIWZXWBbjKBtlZGmmYOWjpmNfHyEmIBrbn9jf3RugHphZ2ZxbmhnaENaYVs+S1UzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGBhYV1dW1pYU1BPTkk4MDUyLiosQVRWVlZVVFVVVVVUVFVUVFRWV1dYVlVVUUhGSUojKCi9k5qDqcbCtsGzn5qsoK24paOOm6Sjn7Cwqp+kn52tmZ+5oKOroK+pmq6hkKuopJaJm5CusKymnqabrJeXj6yhoJ2loZmknK6Yoaint6nBr6WppJ6LgI6bmp+mnpKVmpuUm5qmpaWbqqytpKWfqqi+pJbCq6mioKuyuKmtpZ+yraeol3avfpCLnIWHfbqtipllsY1lla19oI+DppWagayKhLCFppqkoaGRhaBbbGqBs2B/rXt7g4GxbWdvmZiMiLFbfrVdpIRryKJkn4B7vFh2tVmyfVKugHqsWIChbZiQqJuMmJKZmHx6kJ5/ZXV/Y4V4dIB8YmpncW1nZWZPVmRcQVVfPkkoPjo9NCEiLCUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUVJUV1peYF9gYWJeX1xbWFVQTkpHQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsbe9urPBs6OcrKaktqigipqgn52zs6mfo6CetZmgtKiqrJ6vrZ6sm5WvqKKOiJuOr6yop6Gmma6SmI+omaGdpJ+Zo6OmmaCiqrOpva+kqJ6dj32Lm5ahoJmQkpqckpqYqaCimqmuqKamoqWpu56gxqakqKCqtLSrraWeuqyrq5SAqZKjr46bf4ekl5mQgoC4w7qDjpyShKeXnIKsioKviKecm6aqkH7VvcKqYqO/vX1+o4KD17q4tYWVk4Oevb6EbKOCb6uEbJx/erKwx4Npq7C9rHh3or68c4CWjqadkZuSmp97gpKce2R+fGWOZ3mCe2FsZWtqY1BhW1NqXD9VYkNOKT06NC8fHyQfJTIgHSQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz89QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Oxv7myvbKhnK6mpbKmnYyYpb+quLKoor+np7KcnrGcuqifra+mp5SUsKyXjIObka6loqygo5yqoJeKopKmnaecmqGoopmfoayuqrqtqKOal5N8h5mRppuSj5GYmI+YlKmboZmqqaGqp6CjqrudqMWioK6jqbOzqa6on7mmra2Zc3WqpLeGZImgcGiukYqQbm53pJCZn4F1rpiUcI+LcZWoo5uXrqRybWxsZot4b26CmXGBempxaWeKl5aYcWlphYhncYZkXYhiam9ZXGZ9dqZfYXGOkW5lZX+Nk4+hmJmZk5mhfomRlndniHhpjmt6f3llbGNmbGJLZFhKbFo6UGVFUidLOisjHCAbIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWVdXVldZXF5eXVxcXF1eXV5dW1tVV16plKyzqbm4srOqqaGunqOyqZeSvrLEyr+3qp/ArK2koaesoLqjpK6srqeOl66pj4uFlpetnaaqoJ2jo6CRi6SSppmomZajqqCWnaamp7C7rKyam5OSe4SWjaWYjZGRmZSOmJaplqCYqaObsaadoqu5n6/Bp6OypauvsKmsqqa2oqy2lYqgqKW2nYmWo5mHqpuRlZ2SqbKZmqOqoLKWoqGdn6KcoaWhlaunjZKSjIeTnJ2VkZmTmZGOlYaBpZuYlo6LlJSLkIaEfWeJfnSCdXOGinCnbHqUkZOSgYGNj5CPnZWil5qZpISJlo9zapF3cYx4d3x6am1kY29kVWFZQGpcSGNhT1krRj0rJyE3NTAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFRWWV5gYWNdXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpbXFxeX19gXl5eX19gYGBfWVlgppaoqqW0tq6uorCjrZ+gtbGQjqzHvsa7uaujpZ6cpp+xqaS3p52ptaeokZitoouHiY+cp5WspJ+Yp56ekpSjlqeaqJmUpqGkkJuomaG2u6irmZqQjHyBlIuhlIqVkZaQkJSYppCfm6qfnLajnqert6euwa2jtqWur6+rqKiyt6Ctu5iRpaSmtqKSnqegjqqgjpKfo6yvmqCjr6ivmKOgnKOqnp6dnJarnZOZoZuUkJarmo6ZmZaQlp+SiaGelZWFko2RjpWLgH1mi4V1hnV4h4JznGqFj5STkIl8i5WSkpiUo5OfmaSFipqJfHOXc3qLgHN8f2pvZF5wamBbYFluZFBgZVBaOkdHRT4yPT45LyomKykmHSY0MTY2Njg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYGVWUEpBQ0I6OUVNVlteXltaXFtbW1xdXV9fXV5fYGFhYmFhYWBiYmJkYlxbY5eVo6ejr7KsrqOppq2fp7WqkJCdpbW8sK2toqOae56jsqSlsamXm7mno5OZqpyOhoqJnKKPrp6ilaifoJKWmJqti6mWj6iZqY2ZqY+eurekpZmbjYh5gZSMm5OKlZKUkY2Sl6ONnp+pnp+4o4CEr7Wir690o72jsZ93eZ+psLmUdayjnomAqn9kXGJ2oI+ln4SXfW2Ss5yjp62qomWen5JzeZqXcICYqJdtf6KoimWcpp2SmJiWjJKckoaempCWhJKHj4+SiYV3ao6GdoZwe4V/f2Boh4qUkotadZSQZ2iQj3N7qJybZnqaiYR5mWqEi4RveYBrcmVfdnBsa2hbZ2ZiYnBTXD5OTk5TRz5AVUQ5MS8eHyY0OjMwNjY3ODw7PkBBQUZIQkdGSUtNU1RVWV1gaGZnV1FKPERHPDhVUltgYWJgXl9fYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaajoK6wrKuppaiuoqatpJKWq7axs6ebq6esl3SMnbCgqKunlJe5oKCPnKSdkX+JiJuejayaopWnoZ2OlpGehHWtj4imm6mRl6SJnLu0qKCZmIuJdXeTjZaTipORkZSMkJShj5uhp5mcspaAjJu1nLOMko67pqB+p6J6oa21gI6NpZ6Di4aQsaqvjIqXpJt6gIushpydoaeop4eVhZh3pZt6h5uBmKeCgnucsnqKhqGYmpWYloKRl5eFm5ljeoeQhY+QkouDbXCOhnmAcH+AhH6Fc4WElZF4lmeSdKCadX2ZhaOfiJh/lIyFhZprjo6GbHh7cXFnZHhvamxrW2VsamV0XF5JVExSQEU1LlpVVTYpITA5PT43NDM1Njg7Oj0+PkBEST9JRUpMR1NYW1lbYWFoZllRSDlFTDw+YlZeYmRmZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJein6WsrKuorJ+osKamqaWZlK/Iv7Gil6iptZ6QhZ2snKeioI2Qvp6ajZ+aoJB8ho+ZmIisnKKWn6GRjJOJhoCRp42Hop2klJieh5+6sqiempKOhXF2kImVkIqUkI+bjJCSn5KXoaWWnquHn7SJtJqtisqHqa2It4WNsIGurIKojKaYjZ19qI9ye3ecj6eXaJWkebSMn56mp5KYwoF/q4iYoXKegJqlfZeFlbKBoX2hk6CQmJeBjpOci5mSjH2Fk4eOlpKJg21yj4V+eXGGgIN7g3SEgJaAj8Vmf6mHj6NrnoSknYSagY6Ph4uacZCUhWh4dXx4aGh2cWhobF5kcG1nbVhnR11STTJENDZOYmU3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TklKTENQWl1cV2FeaWxcUUU9TE1ASmRYXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSWop+vp6iopaufo7ewqaqmmpSgo6SrpJemq7ijsIGhqJ2mnp2JlL2ak42hkp6PeYSWlpGIq5mbm5mihY6Ld5ucj5+QiJ6lnJaamIejua6lmpyMjH5ibY+Lk5CNkI2NmIyRkqCPlKChmaGnfqGnh62doJatj56cnZGFgKCMqa2Fo42pmYyaf6N1gJmUa4Ktdk2reIeNnJGaqKeAqat9g6F7eqdqnn+Sa2eXhpe3iZ5+bmBkWYOXf4x7ZGiLc5l9eZZsXX2XbV9TcINcX2t4gl9YZIF8g3+XcKeqa4OjbnKlcJ+FoGpmoG1bb4x9Z1pghIBiWFBvd2ZtdHNram9ea3Fta2lYaU9eWUY5QTRIRF9sNSxJQ1JNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deXmJ1YE1EOk1PTlRiXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlZ2guKCpo6askaC2u6utopmYoaKlra6hnq+1o6iToaCgp5yajpm0mpCLn4yVi3WBlJKNiqeWlZien3+ShYWspIeakIqZqZmam5KIprGnopaaiImAaW6Ih4uOjoqLjZKMkZOjjZSfoJyhpH+TgY+joZSgd5yVj6eDoaZ/haerg6V4iXyEmn6icHOUiJZ8n415bYebjJmPm6iaj4ede4Kic3amZp5+d6RfmHp9k3Sibpi3tLp0k4eCf7WoZIHGuHtwlbaMcoCapGNzrKtgfGmds35tfIaBjYKLmHF/o2xyo3SfhYGkYJ2Zs5ZxfZifs3VzW56yg2pjb3R2cWhvWGttc3JmXWleY0xFPUQ2UkJaczM9U0dfSlI9PDM5NTo6NkQ7O0BKUD9VTU9RQEVfXltaWGBgfGRIQzhMV1VXY2FaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2hok5WUo7eYqpuToI2kt7StraCaop2ko6aunZyyrqyTmKGaoaSZmpSfq5uLiJJ4i4VxgJaOipChj5KUnZh9kImNqKCHl46JkqOUnJuNi6mopZ6Ql4eFfmp7h359kI2Di5CRiZCUoYOXn6CdoJ6LiXecmKKMn3Khi4epiJuljpSmqX2tjH56oJl6o5N4gXSWiI2cfZafhpuOmJulhqJkoXyIlpCbjW2eaJuOb5qZe4CLp31yaHSrg56DdKpolZpdm4V2hZ1nqmuAuGZcqHCBnGCVjF6ndnWHiH6eaJp0hZOSl46An2+akG6nml2ofni7a36qXI6EXbRnXG5yenhraVxxa3l5Y2BmWGJCUUZPN1dEU281S1taX09aREAxNTE7OzZIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TlteWWVnWGZnbm1iYmVfYWFfX2BgZWNeYmRvcWBkZWVrZWNpaGdraZWbiam0mqeIY5Sbq7qxr6yeppycqaCfr5yesamtnZekm6GgmZaWoaSZhomNaoiAcnuXiIuWloSRlZiQeoqElaScipSPhoyekp2diZCpo6CajJKKgYBpgYZ5f5eMe4mOjoiQl5t/lKOfoKGTmHJon4qfj4xwkoyBqYeYnqGlnqZ7sK2joriXd6Ozo6SAiJR5nXuqmn+ijpyaloiXcaF8hY2vtX1rmpGheX6ZtaOkq6iEmXybfZ2af3SqWl1ve5aLeJ5iTH97eoVjeZdCTJ9Yompxe45sgIiEmXWbeIaJsbN/gJuTp3eDnW5zfZVwmnRrpF2VdkhlZGB0cX5+bmZgbGl2e2RkYlFfWF1VV0BaRlFoRVNXXGJYXklEPUI4P0E6SUY4TEVYQVdSW1ZERmJcWmBLYG1+ckVDPFVfYlpmalZnaG1vYmZnXmFhXF1eYWhiX2Vjdm1dZWdma2RmbGloa2mTnICwrZmEU16gprO5srKpmqKMnKycnKqUoqykoqiPoJ6dm5mWmKGdloiHiXeGgW95lYWRm4t8kZOWiHKAiJKhm3OQkIGJmpWhm4WPqZyblYuLi32DbISFcYKhjHiGjYiIk5mWfJSkoZ6iiK2GfbWEjp6ce6WWeqmBlZuPiZ+bfKdod21+mXShc3J8nYaZcJODrn2kg6admYGkb16oZ3WiY2+lYZzTkH17mXhzdGKihpB+o3Okj3Vrj7OMYIKYiXOqsqi8f3eDbX6/pqm0XZtufHCWbX9yonJdpGdzpmBopm2b1Jp9hptwenuYbJx8eJdzbqmkZ2BlenGAhGxnZmRvdXdnYWNTXGZRUWJJWEpVYVdTW2VqW2VRRkRLTUpLQktFOE9AUU5YU1lPU1FhZWVqUmN3eXdJRkVjXWVaaGpUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5qAsKtUXEt+qa+xtK+zo5uZhZmpoKGkjqWpoZmqipqYmJOZk5KhmI+IhntwfYVofY+DlJqBd5CNj4lvf4WPk5Jsl5N8iZKTpZaDj6ublJOLhop5g3aIgG6Cn4Z3gJKGiJqjmHuUo6San4mzoaK2i3qsp6SupXCpgJqOhYCakHukgKGZhphynoSjrq+Kl4yAjaSNlYOtoJR2tbW1yaFzlIuBn2Cdl6lteZWHoJt0ood3oH6Tl4uBb01mo5JwmodzpHt6dGGDgWt9oGtxZF+ccX1zlmh5abO1tMamc5h9ep1rnJurdoWbbXZ4mGqae3WYclBFfbNfanZreYdma2hjdXVwbldfVFlpUVNoSVZNWVRWXWhrblZnV05LQkpNS0hKT0FRS1BlY2ptZXRzc355fG51iXt7VFBPbF5pXGtpUmpoaWxnbGZjZWBcXV1eaWJkaWt7X11kaGNqZm5tZWlsZaGbiK6mhGU/k6Gyqq6vtaKikICXqqKjpYylp56dpoObl5aOl5CPnJOOiIN6anmHZYONf5igeXWPiIyBaYSFkYOMhZ2Neo2LlqaTg5mqmI2Si4GJen99i3lwkKGGeoGVh4mWoJZ/lKWonJaWhGZueJxsomR8caV3m5hwZ6aAlYp6pHqfloOXcp93gYqVl4+5bpGKomJ9maCViG1yaaprdaBtb6ZfmmmLkGmWh5uVdKKAfZpgjIaNdW+IYmigZZ5+aZt1b2NmiIJtcaJaXltjoW1diItuen1zcmSlbXiiZGenaJlzjJlwom9ViZBvoF9mqFSLXlSYbm1za3KCbXBpbHlza29SWVdXZlpUbUlZT11JWGlpc2pZa1ZRUkZWXE1YU2FVaWtfd3R7fXB9fHKDe4Bzdo2AhHZeUXJiZ2NwZ1BqaGhrbG5oZGdfXV5dYGpjaml2dV1cY2ljampzbWZrbWOcpJilemR0bYunrqOpsLGmn4yAmKudn6aMo6Kbo6KBlpiTjpqQi5iQjop8h3GAiWmLi3yYnHN0iX2QfGSCh5SJiZWZgnyIh5eokYGjrJCGkYuCin6AgI9zaZCmhH2GlI2ImaCPiJOppp2IpniVm36liJaMspiekIKvl5+ldpSGeKlzpY+Emm6looyShI2Du259pa+DhoWGk5Wcn3ylenKolaCWZp5+b6xjlYqWk3eobaqigYl2iIN3q5GmiGuRsGt2s4ypa4qGbW2fnpKVYH6ri6p2fn6LpZ52n3yDpJWdoGqbiHisaJ6tjLZ0d76NpJNZg6eOq2F1cnRxfHVxY2t/b2hsU1dbVmFiXWtNXVJdSl5tbndfW3FZXGBbZ3Rlbm9yYnF0YHd6fnlyeYNzg3+Be3uMgYKAdmJ4ZGNucmRSa2dob2xyamZpYWBeXGJrYm1sem9cXGJpYmxqeG1nbG5ilaWqnIB/naOWqaqdqKaupJmKgpismp+lipumnamdhYyaj4eckYWSjYyNdId7iYRwjYV+mJR0dIVykoNtf4uRh4aTjn17goaYpo5/pqeOgY6JhZV2goeTb2yLqYGDjJSOiZ2fioyUq6Ogj4B1lJeIfoF5lK6jf4GbcY+Gd46Jgn17cqeMcX19epiWm4SPeXt/foeTlZOKdpCYnqCDe32Ja4yFW3l5cnpxaW5+kolxgHWBj5STcYaEgmWMf1+Af4t3dHKUdW95bm6HbISFXnVnd45lgICFjaiafXR7lWqJiHCBdn2Hd25tZ4xzenyYeIVca1h5j2lveHJyb3h4cF1rh25qZ1ZbYFddZmtkVmJVX1FfcHh5bGt2ZmprbHd9cnJ1c2FvdWJ0e4F4dXqDdX+Af4B4ioWDfXttf2xkeW5fV25naHVreGppamVcYFpjamVtcXRuW1tibGRsbHluaGxvYY2UuKimiaCimqakmKWcq6KhhISYrZKeoYmbp5upmIOBm4t/lpSHjoqJjXKDfI99fo+Fe5iPdHKDcJWFe3ySi4aGj4V5foCHmqWOfKihi4aQkIWVg4aOmHdyhKmGjpKdkImfnoiMm6ifoKqDiI6Vmn5+iZatqI+Rpo93b5uPgXiQbn6ohXB9lXFrcH2BoI2Ak46MaG1dg4uLm5qejnOVi4hxdGuBdnSBWXJuhpGBfn6Mal1qZHuFhImAYGl4epp7goqBdYGFgmd3ioZqYXBxgXVecYqAiI6llIVli42DbneLhHGGkHpxZ2hlfIR7lltcamdudlt8eXh1bnNzg2dcbYtra2JaWl9bWmxxXF9hWl9dZnR+e3VwdGNra2t8fnN8eHVkbXVobXx+dnp8e3l6gIB+b4aKhHt9c355c39oVVxxaWx1b3Vna2hkXWFYa2hsa3FybVdbZW5sZ3N6b2hqbWCLi6qwoI+ioZqenZeemKijon6Dma6OoJWInKKRpZV/e5iFfZKZiYmGh4pzfoGMdoWMgoWXinFvgHKYhoN+koOEhoqBeoGFjJyhkYOnooh5jpeJlYuLnJiEg3qtgpGXmpWKnp2IiKGqn6Gio4uHk5uco5mWqqGnpp+SmoaUjHp2jY2Dp35/kpCSk5yyppuVn5CNspOXg6WMjJWan4mQm4KIkYprfI53eGWChpCLfImdhIeMkIiIgISEkHd8enSZoIiGiZ2JhJN+fYqAgHVvcoSBfXeGhoqPpZCChYyGgoyQjH2HjIqRhHltg4V+eplrcmhhdIpxfnp3d3B3dIJdXm+HaG5fXlpdXVNoclZkXF1ibGh1e3xzb3Bka2tqgH1ueYByanBwbGeBe3KCgHh/fX+Ee22CjYZ8eXh7fXqDeE5kdmpybXB6ZWtlY2JgW3RmcGZycW1VXWx0bWl5enFnaWtkjIecuZ6WoqCYlJiYlJikoJ58f5qsj5+OhqCdi56WfXiUg3yOmYqGg4SHbnmBgXOBiH6JlIRta356l4aDgo9/gIeEhn2HhY6cnpOHq6CEc4uQhpKRi52SfY17qoSOk5iWj5yWh4ecpZ+imp2FgpKamZmQmqafpZ2dj5V/j4h1e4aNhKV7fI6QkYaYq6GelJ2QjqqNkICdjIiTmZ6Cj5d+ho6Db3eGcXVgfoOPhnWMmICDj4KGhX6FhJRueXV0kaGKi4WahISMc3+JfHxycXqHgnp3io6DkaaPhYOOgIOKiYp3homLjX5wbH+CfG5obG1oX3p/aX58dnV2dXt4XF9wfm51YGNbXV9SZ25UZVteYmtpdnp+cWxtZGtqaIGAbHOBbGx1b3lvhnluh4B2goB+hXZxgo2Ifnt6fH97gopgaXxqdWhpgmRqY2BpXGN1aG9idW1sVWNxeWVwentzZWptbYuJnreaoaOfkZGVl4uanp+ee3ifp5Gci4ellIuYmXl6jYV8iZGEjIKCg258gHlzgYV+i5F9amh9gpeIf4eNfX6GhIZ9j4KQnJ2SiaidgHCMi4ySh6ChioWMfaiRiZCSl5OWk3iMo6CgnZaZf4CQmpiSjJujoaSZl5GafYyDd3+Cjoaff36MjI98mKWhopOakZCmjI+BmpGJkpebfpOSfoeOgXV0gnB3YX2AjYZxi5V8iIxxjH+ChYaPaHdxeIuYkY9/ln2HinGBhnt8cHd6ioN5eY+MgpSlkouFj3uGhoeEdoOEiYl8Z3N9gHl7cWxrZ19+c2h8dXZ0fXOAal5gdHZwd2RjWV9fUmtpVWVZX2FoanZ5gnFna2RtaGaAgWtufWhvcmx+eYd6bIyBc4GBfoF0doKNhn98en+BfX+PaXKDbnNpYYdobGJfcVZ0b21tYHhobVdqdHZjdXp7cmJqb3qJjJ6ykqWlnI6Pl4+GnKCbnXx2paGOmICNo4uImpZ5e4aHfoOJf4mCgX9yf3t0doOFfoqReGdjfYaXiYCJi3l9gI2DeZeClpmXjZehnH5wjIKRlIamm4iMiYOmlYWTi5aXk5J3kZ2goZeTlnl/jpiXjpaanKSdmJKUmniOhIJ3g5WNnX6BiY2Mc5ejn6KTmY+PooyLg5aYg5KWmX6YjHyIjYF2cX1ue2SAfIqFcIeTf5GCbIeDgoCJhWV1bnuFkZeLfJN3i4h7f4V8enF9d4iEeISPiIqXoZWBg4t2iISDgnd8g4qHeGF6eX50f3hnbWVhf2pqd3N0dX1xfGJjYHRudXJtYVphXltsZVJjWWBhaGt2eYZxY2pjbWVofYNsaHRobnBpgH2CeW2QhnGAhIN/dHyDjIGAfXqCg358kG12iXR0bWWKbGpiYnZWhGlwbmB4Z2xianZwZnl8enFgcmyGhY+crZemqJ6NjJeHhp+Tl5l+eKqdi5l6l52Li5iQeXyBjH58g3yBg4F4dHl7dH2BhICJi4BkX32LlIZ+hIZ1fX6Kf32ZhZeVmI2ko5l/c4d7lJKKpo+MjoqToZKDkZCVl5GLgY+Xn5qSj5Bzf42SlImdnZ6ml5eMlJVyi42Ja4SXj5l6h4iPiW+XnZqklJWLjJ+MhoKSnH+SkpWHmYh8ioqBenF5a3Vse36Lfm2FkoKUeHCBg35+i4BkcWl7f5aXhH6Mc4+Hg3iGfHV3f3yEf3uCi4SLk6OPeIOBdImHfYB0doKJhXBhfHZ6cX1vYm9jZHxjbm92c3h3c3RhdmBvbHVtb1xcX15eal5QXVljYWhtdHuJbGBpZmpjaXeIbmZsaWptaIF9e3dvkIhzgISEfXSBhol7g316gYR9fY5yeot4eG5sh2poX2lyY4dncW9ld2dubGF5aWt9e3hwYXhti4CYmaqgo6idioqRhoqdi5WYfnivmY2XfZ+UkZaTiHd+fIp9fIB3eICAcHV0fG+GfYGBin98YVx+j5KGf4ODc3uAh3uPkomTkp2TppyWgn2BfY6KkqSJjoqNmJuNhpGYlJaPioiMkpySj4uMbYOPj5GJnpmioZeViJaQbYeYg2aFmI6TeoiEkIpwlpqUo5OSiYuZjIJ/kJ19ko+SjJmOe4qFh3NydWtwbnV8inRuhpCOknF1gHyBgoh8ZHBseXyZk32DiHOQiYBzh3huf3x/hXuEi4eDi5SnjHuHe36LhXd+cXCBh4RlaHl1dXB8Yl9wYWt0XnFqe3l5bHNwZXhdbmxzbXJYW19gYWtbUFdYZWNncXF/h2ZdamlnYmdxjW9kaWdlaWmBend1b46FdIGCg3t1goiFeIV8eISFen+Jd3+Le3tyeINqa2BwaHSAa3JvbXJnb2xlfGNugHp3cWx3d4p+opehqKCmm4eMioGQnIeTnXaCq5WTjoehjZaTj390fHeFeHl/c3N7hmtzcHpui3eAgYhvcVtZfpGNiIB/f3d1gYGAoIaRi5OdmKGVmHiKf4GNiZydio+GkpiWhYmVmZCXi4uMjYyciY2Pgm2Ji5CRip2WoZyXlIWXh2mDooJlhJyJkH6Lg4uBd5OYkp+TkYmJlY1/fo+XfJGNj46akXyKgINvdXBsbW9we4Vpc4OOmItxd4B1gomDeWZybnWAmo57h4N5k5B5dodzb4h6hIt5ioWCh42aood7g3WCi393eW5sgoWDXnN1c3FweVpfcWFwa15wan17cW1tamx2YG9vanFtWVliYWJuWFFUWmZnY3ZwhIJiXWtuZGJma5JuYGdmYGhrgXVyc3CLgHV/g4B4dYCLgHmFf3eHhneDhXyHjH97d4p/anFjfGOGfG5xbXRqaG9sdnhfcX95fHV1dICDfqSVmq2eppaFjYN/l5SDkKB2jKCUk4aLm42Wjot6cnh0gnByhXRxdohscG52bYl3g36Abm5VUYGrlIeCeIB3coN6gqGCk4KVlJmck5t4knuDjJKkmpOOiZWZkoSHl5mMlIuJj4+HnYSQinxyi4WJjoicmp+blZR/k31ohJuGZ4Wfh5KEkYKJcYORmJCcj5CMjI+Nd3uSkXqOi4yRlox8iHyAa3ZqbmtsbHt/YXp+jpaCdnqAeIOMfHlmc2tzhpWLfoeFepOOcHmEb3aLeYiLeYd8gYuPnZ2EfHt2got9d3BqbIKEe2F5cW5tc3RWX3BicmFgbG56cWhwZmZzdGhxa2F3ZV1XZmFgclNRT1xmZV15cIh8YFxpcmJiZWaRal9oZVtncH5wbHF0in12fIWAdXV+jHl7hYF4iINzhoV+jI2EfHmVeGZya4NgiH5vb2t6YGpudH91X3R9eYZ4dHOFfXigj5mwnKWOgop/g5qIgIyegIualI+FiJiPj4+Ed3R3dIBxcIV0cHKEcGtpd26Dbn19bnVzUk2C38iS1pN7cHWDdYSgg5R3lpKZnJGZe5RzhZCfoZOTkYmTnJSGf5eWiY6NiJKNiJx/joF3eox+iYyKnJucm5WSeYx1ZoeQhmuHooSRiJeDhmOMkZmPlYuXjIyKi3F6lIh7joiKkpGJeYV8fmx7ZXNwa2t6eVuAeY+PgXp9fn+Gjnt6Z3JqcoqOiYGFhHyUimt9fm1/i36KhXyDeYCOlJmZiXx1d4OQeHJtZ3GAhW5rdXBoanVuVF9vZXBaYGxyeGdra2JmeHJwcGNfd2BgVmtfXnZQTkthZ2NdenGKdV1cZXZhYmVlj2RhZmJZaXNzbmtyd4x9dHqGgnV2fotzgIZ/e4l/comIgZGLiHx+mHZlc259ZYh+bnBsgFlsbnl5dGF2e3uNdnJ3ind5n4ubrpufkIKFd4iVfn2KnYiGoJGPhYyYhJOOh4F0eHB5cW+Eb21vf3NlZXlxfW16fWpoa2OkmsHcrvChcmx2hHaFo4aSb5eRlqGWnIGScoaLo5eJjpWKkZ2Wg4GWkIaKkICRiomWfod6dX+JeIeEjpyamJmOj3aJdW2FiIp8iaKDkYmchIVei5OXi4+Jj4uLhYlte5aBfYiFiZGPhnaFfX1rfWR4dWpueXNXiHqSh4V5foCBhox/eWVyaX+JjomBgn6LloRrgXVth5CBjoN9gXh+j5SSmI90cneHjHVzcWd2eoRjdW5xY2p3aFJhcWdsVl9vdHphcmRfaH5wcm5aY3JgYlZuWVx4Tk1MZGdiXndziW5cXGR5XmBkZYVgY2NfWWpya25rc3eMfnR3hIF4d3uJcYOEfX6Ie3SLiYiWhox/fpdzZ3VyeWyLe250cYFXcXp2eXJld3mHjGl2gIlyf5yHmKeco5KFfXGMlHh5jJ6EhaGNjnyWjYCZh4R7cndwdGpwgWxpbXx1X2F4d3txdXxoYGR869q1ycPch3JsdIF2i5uJjmqZkJCdlpSBiXGFiaCOhYuVioyYlHyNk4iDiZB7kIuFj4F/dniDhHKIgpOclpSXhox1hn1ug4GIhpihgpOMnoOJYYOUj4eKhomNh4GHan2UgH2DhImOjYJxhn5/cXdodnJpdHdrWox8koKFfX+DgISKgnVhcmqHgI+KgX5+kZB8bYFrd4WOhZGCe4B8fo+Rj5WIbnB5jIZ1a3Fsc3mCYHVqb11rd2BSZXJpZlNgcHZ0YXBgXWiDcXNqV2doYmlYbVZbdUxLTGVnX2Jzc4VqXFxleV5eZGd7YWRfXVlrbmVvanR4in5zc4F+e3Z6h3OFg3x/h3Z3ioaPmYGMgnuTdWx3dnl4k3RueHp9WHqGcYBvZ3l3koJkdoaFcIqWhZmhmqKKh3Rvk4tyd4+cfouaiYl8oH+EmX+BeHJ0bm9kcn9pZm14eFxfeXt7cXGAamFmYX/Vto6RpnhucXd8cZORjYdrmo+JnJOMhntph4uZh4GSkYaHmI58jY2BgYqNfI+MfYmEenR6g3txhoCWmo6TlIGIdYOFdYJ/iZGcnoaUj59+iGJ/k4eFiISKjYCAg2d9kYB+f4KMj5B+bYJ8gnRrbXd1dHd2a2ONgY6AhX58hX+EiX9wX3FvhHuOi4F7fpCHeXCDZXmBiYaLgnqDfH6SjY+Rg25ueYt+dW1ua2x7fmRpbGpZbndaUmpzaWJRY3N4bGJlXlpqg25zYlxoX2RsYG5VW3BOSE9nZVxnb3GAbVpcY3NgXGNsd2RlXV1abGxjbWpzd4d/cXCAe310eIZ4hYJ8gIh1eYmBkpZ8iYZ2iYFweHl7hJNvbnyBd16Df3SCbWl6c5RzZ3OIfHKSkYOan5ughoh2dpV/bXeVmH6IkISKjZp9jJp2fnZxcGxqYXV8Z2JqdXpbYHh8em1xf2VjZ2dXnY9fcXOWvMSEd3GUipB/c5iMh52UjYh0a4iPlYB7lIyBhJuMfIqGfXyJjH+TiHWJhXZ2fYFxdYaBnpWGlI+CgnF/h3ODeoiWm5eGk42cgIhmfZOCgIaDiYlygn5nfYt7eX9/h4uPfWmAfYN2Zm95eHN3c2xqjoWKgYp/eIKBhISAa11wd3p9i4iFe4COf31xgGh4gYaKhYN3gnp/louOi3xta3qJfHZ0b2lofXdlXXFjWHB0U1Rvc2liTmh0eGZhXl1Yb4BvdFllY11qbWBwT1lsUkRUaGJabG9te29ZW15tY1pjcHZkZ1xdYGxqY2xpc3eBgnFufnt/dHWDeoSCfIKGdn6JgZaReIOKdIGIc3l5fo2Qb297gXFpgXl6fm5tfHaWa2p4hHRrlI2FnpigmYWIb36Mdmp5mY9/goqClZeKeo+Wb3pzcGxqZGB0e2lgZnJ7W2FzfXpncHphZWSOsbJ3S2JapdrRl3J7koyReX+WjIWZko2Gb2yGkpF6eZOHgYSZinyHf3l4iYqElYBviodxdH17anmGg6WRhZONg39ufoJ1gneFmZeTipOPlIWHcHuShH6Dg4mDb4F4aICFeHJ/f4OKh3xlfH6EdmNwc4BoeXFvdZmMhoOKe3Z4gIR6gmtbb3xyf4eDiH2FiHqIcYBtcIKFjYOEcYN3f5iLjYN3bW19g392emVoan5yYVp4W1lybk5YcnNmYEttd3ViXltbWXV9cnBYaF5manFfb05XaVI/WWdfW3BrZ3lxW1tZa2VZY3F5X2hdXmVsaGZsaXF4f4dvbX99gXVwgXuAgX+Df3aBhYmXinGCjXF7hnx6eYSUjHVren9sb350gH1vcnx7lHBvgH95ZpKKgqGYnZKDhWeHg3BnepeKfoCFgpqKgXyNjWl4cmtrZl9hb3ltX2JveV1kbIN6YXF2X2Rl1eu+izI6PouOgHJ5homPjXeFmI1/k4+Nf25thYyMdX2Pf4WClYl8g3hudoeFg5Z3boeEa3V7dWV5g4SnjIOPjIN9bX9zdYJ4hJqPi4+RkoyLhn57kod4gIWNg2yAcmmAfnhtfHuBioN4YnmEgXFkcWh+bXVxdYGbi4F/hX5zdX2AcoBvWmt8c3iIgYp7hn98h3d5cGuGgo6CiXGAd36Viop+dG1qdoCAdXVcaWl4cVpXflNacmVMW3NyZltKcXhwXltaWVx1f3VpWWJbZ2VuYmlNWGZRPV5mXV52Zl91cVtZVW9kWmVxeVtoXmBnbWdpa2lweH2ObWqBhH95boB7fYF/gnp1goGMk4VwgItud36Be3uIk4l/aXt9a3R8coZ7c3d9f4x6eIR+fGuMjISbnZaMgoBsjX5raH+Pjnt+f4OVgn99iohrdXFnaWNbY2dzb2BhbHRhaHCJemFzdF5iY5ugkG5cNVqvtXVqgIp+k4Z3h5iHdY+MinhwbYWDh3R5iXiJfZOIen5yZ3aIfn2Xb3GGfWh2eW5leomFpYeAh42JfW19dX5/e4qXhoGTkJeIi4SJfI+JcXx+hXxpfm1rgXt5anp2goeAcmB3gn5xZHJndYJtdXuGlJGBfYF/b3d5e3R9bFdtfXVzioCGd4Z1gYl6d3JtiH+Of4NxfXt8kYeIem5taW2CgnVuXWhmdHJSXHxOXHFcT1xzb2RWS3N5a1hZWFlgcYB1YV1dYGdkaGhmTlpoTkFhZFxgdmFcdW1YWFN0YVtlb3NXal9iaGtnbWxpcHd8k2xohIl9fHB+fnyBf4J6d4CAiYuEcnuHb3F3hH97iY2Pg2p+e254eXeKd314gIKHf4R+fnpthIyImKONhYR7dot5a22FiZJ5fXuCkoCAfYqDcHJwYmZeWWdfcHBgYWhwZmpviXRhdG9bYGRqdnt/vpynpMm4coWEc5N9eYiUhHSRjYhyc3CEe4NzdYZ0iHeUiXl5cGN3hnmAkmlyhHVmd3ZjanyEiJ6CgH+Oj31xfnODeH6QjoJ3lY2Uj4iCiHuJiWx5en92aHppbH95c2l6doCDfWhgeIh9ampzaHuAanaBjJGUfnp9fnF7dntzfWFVdXtxc4iCgXuCcIaJd3dvb4KBi318d3x7dI2EgXVocWhsiIJycF1oY3RvTGZ2TF5vVVRZc25iUU90eWJTV1dcYXCCc1thXWhlZWNqZFFbcUlEZGJcZHFeXHhoVVdWd15cZm5pVmxeYWpnZW5uaHB3epNuaYiMeX1ye355goGCfHZ9g4iGg3B2g3Ntd4KCfomLlH9xgHx4enqBi3SDeH+BgYKEeoB1b32Ji5ueiH6Ge3eHfGh1ho2Ren+AfImGhHaPgGdwbl9kXFhmWW1zYWFhcWxsaIluYHNpWF5jbYB3qdmpx4aIs3KKeXCOdn2IkIF6lIuAdXR1fnd/cHB/boV0lIZ4dGxgeoF5iI5lcYNvZ3VuW219gZCTgIF5kZJ9d3pshXR+j4qDcpWKkI6HhYV7f4ZtdXZ/bmh3ZW18dm1qd3Z/f3xgYniGemh1dWN+e2d1ho6NlXx0f3VxgHp8bH5ZVnJ8b3SChn5/d2uIhnN4anR/goJ8eXt3enGKf3xyZ3RkbYuEbXRba2B2Zklvb0xbY1hXVnhtYlBTdXZZUVVXXWByhG9cYGNtZGNdb2NUXXJHQmZfXmZpXVp7Y1JWXHVbW2drYVZrYGBuZmZscWhwdniPdGuOjHV/dnh9d4GDgXt0foOIiINvcYB1cXV+hoKJjYt7d394hHx9hYd4h3x9gX6FgHt+c3Z4i46fjYl7ind1g3pefoeajXmHhHSGh4R3iXpibmxbYltbYVVqdGRgW2hvcGeHcWFxZldcY2t/fMrOhrmia25ui21yhXJ+hYt/e5KGenl0enV1e2psdmOEdpKCdm9nX3yBeYuIZXGAampxY1hse4aciYOCcpeUdn17bYdwgImKhnCWjpCIhYuEe3l/cnJwfmdocmNueHFqbHF3fX16XWV6gHdpdXlmgnZndIeLjZR9coZqb36AeG17XFhwfWxzfol7gW1uiX9wdmZ2foB+gHV6cHlzhXt4cWVyYG2LgWtzWGtfeV1JcGxOV1ZfVFV8a2JPVHZzUVJUVl1idIZpXGBramZiWW5hWGNwR0FoXWFmX1xWfF5PVmVxWVtqaF1YZ2FfcmZqaHFncXN3h3lulYp0f3t3fnmDh4B1c3+GhY6DcHB8eHd1eYeGh4yGenx/dYt+fYaEhId/fn59h398eHZ5dpGTn36NfYtudYB6ZISIl4ZzkopvhYWCeoN1ZG5qWV9bXV1VaHNlYFlkcnJngXJha2RXWl9pf3i+rnqft25idIdpdHxyeoSHe36NgHh4c3dve3dlam9gh3WOgXNqYl5+eHiKgmVwfWhra1pWb3eLpIGFf3GZknF/d3SBbH+Bj4Zyk4eMh4SJhX15dXNvaXlham1hbXZqZ2treXd6d1tnfnx4ZXN+boR0ZnaGjYaVf2+LZmt6gnRsdGJbbnpqc3qKeoFldIZ9bXBndH53fH5wemp5eoB4d29lbGFsiX1sblZrYXhWTGtsT1JPaU5ZfWdiT1V2bE1RVFVeZnaEZ15hcWhnYVdpXVxraUpFa1piZVdYVXlaTldualldbGVdWmVjXnVmbGVxZnNwdIF4cJmFdn9/eH98hYd9dnSCh4CVg25zeXt7c3OFh4iIhHmBfXaPf32EiY6DgYN7fouDe3d8d3aanZd6ioOHanZ+fWyEhpSAco+CcYaCfoKAcGZsZ1ddW1xbU2VwZV9YY3J1aXZwZGViV1tbaH9wb3J/c4llZnp/anV2dHSEhXiBhXp3dHVua3pxYmhrZ4Z0jYNtZl5ffG96iX1obXdmamRWV3Nwjqd9hHx2lpBze3J7eWx6eo+Ddpd8h4aDh4R9dXFzbWh1XW1pX2x1ZGdmaXpve3JZZ4F3dWhwgHiCdmJ3hYt8lIFui2pte4BwZXJlX2t4ZnF1iXp9YXWDdmlrcXR6b3h4cntlfX5+d3VuY2VhbIZ8bWtWamNyVExrbFBMT3BIXntlYU5WdWVLT1NXYGt3fmZdZ3NpZV9XY1dicV1MS2tYZGJVVFVzV01ZdmVaX2xgXFtjZV93Z21icGl0b3F+dXSZgXd/gHiAf4aEen12goN+mIVucnR8e3RxhYWPgoB6i3V0kIB9gZSOgIWEfH6Mhnp+gXZ7o6WKeYmGhWx1fXt1hIONem+Fc3qFfYKEdW5qaWVWXVtbWlNjbmVbWGJ0e2pobWhgYVdfWmmAaWtvf2dsYml7emt0dXVvhoJ7gX12dm56aGp5al9lbmmBd5CEZ2VYYndpfoZ5bmlvZmZdVVlwaY+od4F6fJCOeHVvfW5ydHiOfneUdIWCgIaIdmpzdmhpb1xtZV5uc19nYmp4aHttW22Dc3Rqb4B+eXdhdoWEeZCGc4hxb3l/cWJwaFttdmNwcod6d2FygG9naXhzcWt3dnR1YoJ6fXZ1b2NjYm18fGtrVWliZ1RMbmhQSFJsRWF4ZWFNVHNeSk1VWWVseHtmX21wamRdVmBVb29XSlNoWGdeWE1VbFRLXHpfXF9rXV1bYmVgemhsYW9vdm5vd3V6l313gIF5gICHhnp5eoN9gZOEcXR0fnp2dIWIkH2BfJBsc5WBe4KfhX+HfYB+hoKAint2hKyff3qIiIRscoJ6doGBgnRuh299gHSKgGpvbmRkWF9aWlpVYmpnXFpfdYJpXm1sXGFWW1xrgWVxdHxpal1teHdodXhzboZ8fn56dnNsemhpeGddZHNoeneSgWNjVGRvZ4GEdnZmaGlhV1ZZaGSQqG9/eICLjnpwb3tmeG55inp2jnGDfX9/hm5kd3NkaWldbGJecG9bZ19tdWV6aF10gG9ya3F7fnV2YnWFi3uIiIB/d3J1fnNgcGxYcHJhcHCDe3NjcYBrYGx6b2lneXd0cGSDdHl5dHFkYWRtcn5qa1RpXl9VTHVjUUdXYkdjdmVhTFRxWUtMWFhnbHZ6ZWVtcWZjWlhdWHdmVEpcY1hpWFhIV2VRSWJ4W11fbVteXWJjXoBpa2BvdHhtb252g5d5coGAfX+JjIZ+dXaGeIaMfXR1dYJ5enqCjI59f4SJanSWgXuKnX1+hXmAe358holzcY+ujHt7h5B+ZnGIenR+fXZyb4Zse35tkHpjcG9iZV1lVlpZV2Nma2BdXXOGaVhwbVteV1pcbHticXd1bGJbbnR1aHV3cm6GeX+Bendvb3RlaHRlW2d1ZnZ2knpgXVNlZmqCgXN8YWNpXFRYXmJkkKVpeXSChZB4bG54Zndse4N5dIhygHh8eIBpZndtYGhhX2tgXnVrWWZdb29iemVbd3xrbm5weHl0dGVzg5J/iIOIenZvcXxxYXdjWm5vYG9wgHtyZXGAZF5tdWljZnh6cmxtgHRyfHJxYV5lbW59ZWlUaFlaVU55YFJLWllIYnRjYEpVblVKTFpWaWxye2NsbHNjYVpaW2F3XFRLY11ZalNWR1lhTkhqdlhfYW1bW19iY12FaWhibnh5bG9qdoGQeG2CfoCBkoiEgXZ1iXSLhnRxdnaCd319foyPgX+TfnB4loN9mZJ5gIB4eX5/c4iEc3CZont7f4mWeGR1iXlzeXZrdHB/bHl8cJFyXnBvYGdibFRbWldpZG1mXFxyiWZScm1bWVhXYGx2ZGp1amlfW251cm10dXVrhn1/gHx3b25sZWlxY1trcmR0do5zXFdUZGBxf35xgVxiY15TWmFcZJOfZXJxhIOQc2tqeGxub3l5enGAdn9zenp7ZGZ2aF5jW2FoXF53aVdiXnBoYXdhW3x2ampyb3h0c3RocYKVg4d/hHVyanB7bGV2V1tpbGFwcX95c2Vvflpgb3FiXmlvfGtqcn1xb3Zpb2BbZGtse2FnVGdVWFJRd1xTUFlSSGNzYmBHVmxRSVBaVmtsa3xlbW9yYVtaWFlscFdTUGZXV2lTVEZaXE9Jc3VYYGRtY1hgYWJdjGpkZW16eGtvaXV5hXtrhH2AhJl9goR5fYhtj4Zxb3Z6fXSCgn2Lj4OCl3R4gpOGgZ+JdYF/gXR/gnCHgnVvopdze4aMh3tmd4tvbnxwZ3hxe2xzdnONa150bmFnZmtTXlxWaGJsbFtccYxkTm9tXFZXVWZpdGhjdGVlXVpwdm9xdnZ6bIh9gH2Id5BzY2Vrb2Fdbm1kc3iIa1pUVmJjd3x8cIRcY19jVFpgWmOXlWNucIOEiXJqZ3luZXJ1cXpreXR1b3p+dl9nc2RcX1diZFlhdWZWX2BtZGFxXV1+cGhpc3F0cXV2a22Fk4KJfIVxcWZue29wblJaZWlkcHJ/dXNibHVVYnFrW15uZHtka3R8cXFxaWxfWGRpanheZlVlVVZQVW9YUldUUEhlcl9hRlhrT0lYVFZuaWR8aWt4a2FXXFZbdGRTUldoUVlnVFNIWltQTnh3W19mbWpaYmBfXo9uYmdreXZubml2dn5+bYSAfoaXe3+HgYp+a5OIcmd0gHt1gIN+iY5/i5NzfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4GNjHd4bnqNYGV9cWd6dHlsbXF3g2dkfG1jZmdoU2BfVWdgbG9cXm6OaE1pbGBVVlNuZnNrZnhkZV1acnZuc3t5dG6Je4F3nHt6bGJlbG1eYG9qZXF5f2daVlhfbHh7em+DX2JeaFZZYFhknIhia3GBhnx3a2p2bFt1cGp5aXVybm97gHNYa29fWV5XY2RYZXFjVF9iaWFibFpgfmtmbHN1b214dmtohYx/iXqIbXBlb3tscWxiWF9nZ25yf3NyXmlsU2VwZFVibWF4Ym91enRqbmtqX1hgZmh1XWRXYlZTT1lnU09dT09IZW9dY0daak5KX0tYbWVfeGhufmRgVV5UXXVbVFNgZ05eYlVTSlxaUVp2dl1fZm1oWGNhW16OcWNoanhyc21ndnN5g3OCg3uIjn58ioiOeW6QinRsc4J0f3+IhYeRhJWPen2Mj4iRm4SAfIyEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY2NjY2Njo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6NjY2NjY2NjY2Njo2MjY2Njo+Pj46Ojo2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA+LjExMTEvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJLkpqZmZmZmnpsbm1ubnFJLDAwLy8sSYWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMjy0aHR0dHBpohoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1Mz+TnpycnJydd2VnZ2dnazwYHBwdHRg7g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYeIiIiIho2QkJCQkJCMh4eHh4eHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho2Ojo6Ojo6LioqKiomJhoKCgoKCgoSKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7enx8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46SkpGJh46KkJKTkYuSjo6OhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIyMjY2NjY2NjY2NjY2Njo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOhY6JiY6IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJCIjo2JkYmMkI+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQkImOjImQiI6Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fHx9fX19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4uQiI2MiY6Hj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+Mjo2LjYyOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enl5e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8e3t7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHt9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYSEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4eIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX1+fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSUk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OTkpKSkpOTk5STk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZGSk5ORj5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkZKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSjpCRkZGSk3+Ek5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJKEeZCRkJKIc4mRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCPkI1we5CPj3d2iJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6OjnVshZCHcniHj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNeG11joF0doaNjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4hwYmd4c291goWDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3clxiaVxiZGtnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhgY3RsXmpuZ2RiY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWltrc2thbXRuZVlZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NW2Vva1ppc3RrUlFTUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU5YYmhtbm9wcW5TTE9QUFBPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRUNGSVZjZmdxbm1oZ11RTk5OT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUVLTU1SX2ptaG5tbWpoZmNjY1pMSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw+RVRdX2NpbG5pbWxsampramdeT0dFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7O0dWX25wcWtta2ppbWdYSUVFREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwc3R0c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Ozw9UWVxcnNvbGhYRUA/Q0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTk5PEtue3FWQTg6PD1AQUA9Ozs+PD08QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl6e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09PT08O0psZTk6Oz09Pj9AQUA/P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A8XG5APkRFPz9BOkZfPj49Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7fHx+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojttd0g4Ozo9PUE8S2Q9PD08ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPDw9SU1GRnV3TTc4ODo7Pj5XakE7PDw6Ojs+Pz89PTk6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3lJO11/g396fHdXPD0/PT0+Rmh0TDo9Pj89PT9BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUhyeWtig4SDg4OAfV4+QENAQT1KcntZOj1BRUFCQkZIQz08QEREQUA/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkJDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARm90fYKCgYN+fYV2TUFDRUA/Pll7gF0/Q0VJSklJTU1LRUNGR0dFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXJDREVEQ1d1hoeHflhHSEpNTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEZIRlFubnBxcnV2eXt7e3p8fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEimxBQVZ0h4mHh4eIg1dITE1MTU5MSUdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklLS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIg1ZshIeGhoaHiIiHfFBLTEtIR0ZGREVDQ0BAQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklKSEhIR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlSBg4SEgoKFhoaEgoaFhISGhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ozo8QUFAPjw5OTg8PD07Pjs4Oz9BQkBBQ0NCQEFBRERCQ0ZISUhISEtNTEdJSk1NTk1KSktLSkxMU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJZYWEhIR/gYKDgoODhIWFhoeIiIiIiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU1Nzc4OTc4NzU4ODs7Oz1AOzk5OT08Pjs8PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlohoSEgX6Bg4ODgoOEhomKjIyLi4mKi4yJVDo4NjU2NzY2NjU2NzczNTY4Ojg3NjU2NTY3Njc2ODo2Nzg4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZQU1JTU1JPUFBSVGVxcXN0dHZ5e3t7fH1+fn5/fn19fX19f39/f39/fn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmWFg4GAgYODg4ODhYmLiomJioqKiouJioqBRzU2NjQ2ODg3NDU3ODU2NzY5OTc3Njc2NTo5Ojo6Ozc5ODk4Nzc3OTo5ODg3ODY4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1dnp7e3t9fX5/fn9+fX19fX5/f4B+f39/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYODhISEhYaJioqIh4iIiIqKjIqJiYx6Pjw6ODs8PT45Ojo7ODo7OTo7Ojo5Ozo5PT09Pjs7PD06PTs5Ozs8Ozw8OTo8ODo6Ojo5OTk8Pzw8QUJESUpMS0lLTFdvcnN1c3V4e3t8fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4mKioxvTz4+QkRFRUJBQEI/QEJBQD49Pj5APz8/QD8/PT0/Qj9BQT9APz1AQEA+P0E9Pjw7Ojs5OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e319e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQkFHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uLioqLiYxjPkRGSkxKSkZHSEVGR0dFQkFAQ0VDQ0FCQ0I/QERIRENFQ0VFQUZFRkRFRkRAQj48QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp7fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDQ0ZXhIKDhIWFhoaIiYmIh4aGhoeJiYqLjI2MjIuKiodWSE1NTkxPSkpLSUlKSklFQ0RGR0ZEQ0VGREJISUtISEdGSEdFSklLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0FCQkE5ODw+Ozw7PkA/QT5CQkdHSlmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjY2NjIuKjH9QTlBPTU9MSkxKSUlISkZERkhISUVFSEZGRUxMTUlKR0ZISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg3PDs8PTo+QD4/QENGSUpRX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjYyMi4uKjXJOU1FPTk1MTUpIR0VJSUVKSEdKSklKR0dHS0xOTE1ISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1VucHV3d3l6eHl6e3x8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo8OD0+Oz1BPj9BREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiIiJjIyLjIyMi4uLi2BUVFJPT05LSkhGQkdKR0xKRktPTEtKSktNTE9QTkhJS0xPUVFQUU9PSkhKSkxKS0ZHSEdGRkhGRUVCQUJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4qMjIyMi4uOfVlYVFRVVE9NS0pERUZLT05PV1VRUE9RU1JNU1RPTVNMUFNVVlJTUVBMSk1NTUtOR0dKRkZISkRERUVCRUNjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JCR1ZORk5QUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uMaVlXa2FGVFFRUEk7O1JTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9NUlFQUFFLS0tISEpIRUZJSUlISWlydnl4eXh6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHRkZFPz9BQUVBQ0dFREVMWFJNVFVWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbVxlVTpZWVhTUT9AVlVZXGRgVllicl1dV11aVkVRWVpbWV9UWWdSVlZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3l5ent6e3x9e35/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36LiYqLeW9wWVtcW1JUUlZWVFtadYNZVX2QYV1YXV5XSVZdXVtbX1lIWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4SKfmdZWVxZVFZUV1JRV1ZjloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXFtcXV1XUk9TUFBRVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltTU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB8XFFWWFVSVVJRUUxPTUtmeVtdVFlVVl1aTFRaVVNUXlpYV1dXemtYW1tcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fX19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVVFJPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlVjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bnFWSkxOT0tNS0hKREVJRUM+VGRVf1JRUU5LUVRRTU9ZUk1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dXVzc3d6ent7e317fX19fn19fX59fn9/f39/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlVUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUxEP0NDQ0NCP0RQQkNAQz1DSUdWQEhOTEddaVBIRk5GREVGSUdIQ0RIR0hLR0RCQURAT1FNUmRydHZ1c3R1enx7e3t7fH19fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PT0xRU1FVWVNVUVFUU09WYGtscnZ7e3h5dHJuc3RzeXh+f4OAg4OCgIKAgoGCa01HP0A7Oz5AQD8/PmtQS2FFRkhJRUI/R0xOR01RVUlBRT8/PD08PT0/PT9BQ0NAPzw9Qj5KTkdVbnR0dXN0dnh6fHt9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSkpQUU5MTFFSUVRWVFdSUVdWUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlQ0BAQj06QkNCQkRCXF1Pe05PTk5LTE1PT1FMS01XTUhHQEE8OTc3NTk5PTs7Ozg5ODk/PEJIP1xzdHV2dXZ3eXx8fH18fH19fn58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklIUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIRkZIQkFHSUVFRkRNUlBhV1JXUVBTU1JVW09PUVZQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEM+ZXNzdnd3eXl7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpYTUxUVFNQUVVPTFJTVFdYVFRYUUxXWVpWWFhWWFldV1hYaHNrXVZhc2tiYV9eZGFfXllUUU5OTkxJSEpMSUlGQ1FQU1tXVFROUVNZU1xlVU9TU1FOS0lIQz9BOTk5ODk3ODg1NzU3ODU5OUdtcXR3eHl7e3x9fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBwbm1kXV9fWVdPUFhWVlNUVk9PVFZYWFlTVVRMS1RWVVVVV1BTVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMT1JST01NTk5OTUpGUVBVWVNUT0pOT1VTVFxWUlVTUk9NTElISEY/Pj06Nzg3NjU5OTY3NjY1V3Bwc3d5ent8fX59fnx9fXx9fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwb2ZlZGNcXVJUWlZXVVRXVFJYWFlZWVJVT0pHT1BPT01SSlBQT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFJNSUxLT1JQUlJTVFFST0xNS0xMSENCQT06Ojg3NjtCNTU2Njpkb3F0d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpJR0VITEhLSUZMTVBNRy9FX1I+Mz8+am9hUlJRQEdVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHV5e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hGRkhKTUxFR0NPUkM4RU5TXWdTUFNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ0eHt6e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRYV1VNTEtJPDk4Nzs+QD48PUFAQj0+RUhHQ0ZGSUdKSkBGQUFARkhFSk9IUVJhXFFQUk9TT09QTExPTUxNTE1PTltXS01RT0dJSENISkxMSkZGRkU/QkM+PEJHP0I/QWRwc3d6ent7fHt6end7d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIREQ9OTc3OT9CPjs/QkBAPkFESkVDR0dJRklFQkI/Pj1DQkFHSUVOT2JlUU1PTldLTE1LTE1NTUxLT05TZE5KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLbm92eXl5e3t6e3p3dHh1eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnZyVlZucWdseYRqbXFybm5qaG9ISkNHTU1KTVBNUE9ISkQ/QT05ODo6P0I/PEBCQUFERUdKRkNISUdHSENDP0I/P0BBPkRFQ0xOUlRMSklNVEdJSUpMSktMSUpMTU9QUlBLR0NMR0NCSklMTU9OSUpJR0NDQ0RJSk1MSVlybXd5eHp7e3l8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUdLREdISEdKS0lKS0RHQj0+PTo5OjtBQj89QkJDQ0dGSUtKRElJRkdHQ0M7QUBCPkBAQ0VESU1QSEhLR0hLREhJTE1ISkxISUpMS01dUkhIRE5GQURKSk1NUE1LTUpLRkdHSk1OUU5MYm1pdnZ3enl8en1ybWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktERkVHRUZGR0VHQkNAPjw9OTo6O0BDQD5CQ0VFSUVJSkxGSUlHRkZEQjtBQ0M+QENDQ0RHTE5IS05IREhFSUxOTUdJTEdGR0lJTE5LSUdFTkhDR01LTUxPTU1OTUtISElPUlFSTlJmZmZxb3N4dXt6fGxoam9la3Fsc3BmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkRGRkVDQ0JFQERBPj8+Ojs7PTo9PkNBPkFDRUZKRklITEhHR0dGRUNAPURFQj5BQ0NDREdISUdNUEpGRkdLTk9LRkhJRkVERUlKSEpJRkhQS0RJTUtPTU9OT1BOSkpJTFJVVVJPV2RgYW1ncHJvcnl6Z2VoaGRpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxIRUVIQ0JBQkQ9QkE+QT06Oj0/Oj0+QEI+QEJER0pFSUZJSEZGR0VDQkFBRkZDQkJCREVFR0dJRkxRTElPSkpMTElHSEVHRkRDSUlIS0pHS1JNQk5PTVFOT09NTk9LS0tPVVdWVVNYX15caWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1anN1bnV0c3FyamtzTUdIRkhCQkFERDxBQEBDPDg5PT45Pzw/QkBAQERGSEVJRkZIR0ZGRENFQ0RJRUNHRUJFR0VGR0dFSk1LSFFNSktISElFRkhIRUNJSUlLTUtPU05EUVJQUVFOUE1OUE1MTVNXVlhXVVhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpbnlNSEdISEJCQkZEPD9CQkQ8Nzo+Pjo+OkBCPj8/QkVGREdERUhGREVEREVGR0pFRUpHQ0dIRkhHRUNGSkpHTUtMS0hKTEZJSUtIRUtLTExOT1JUUEhTVVNQU09RTU5RTk1QV1pWWllWWl1aWGFgYGBeaGVjYGRmaGdqaGhpZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5JSEdJQ0FDSEU8QEVCRT05Oj4+PTw8QUI8Pz5BQkZDRUNDSEVDRUVGR0dHSUZHS0hESEhHSUdGREhLSUdLSE1LSktMSExLTUtKTkxPT09SVVZPS1VXU1FTUVJMT1FQT1RZWllcWllbXl5eYGNeXGFja2JgZGdocoVoZ2lmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB0TUlLSEpGQkVHRTxAR0NEQDo8PkA/Pj9CQTxAPkFBRkNFRURJRUZFR0ZISEZISElLSkZKSEhLSEZGTElISEpHTExNTExJTUtNTU1PTFBQUVVWV09LVlZVU1NRUUxPUlJQVltbXV5bXF5fX2FgYWRdY2BlZmBlaGpjc3NmamdnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKSkxKTEdDRURFPEBGRERDOz8/QUBAQENBP0I/QUNIQ0ZFRklGSUZGRUlJR0lISkxISEpKSUxKRkpLSElKSkdLS01NSkpNTE5OTlBMT1BSVFhWTU5UVlRSUlFQTE5UU1JXW15eX11dYF9gYWFgYWNlYmRoYmRpamd2i2xqaWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZud0tNTEtNR0RDQUQ8P0VFRUM9QUFDQkJDREFDREFBRUdDSEdISEdKR0RISUdISkZJTEhJSk1LTUxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1BXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5oY2loaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BDQUVEREZCQ0VHQ0NJRUNJSkpJSUtHRUtKR0hKSUlLSEpKTkxOS0lMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGF2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RCRUVERkJGRkdERUpFRUpNTUtMTEdHTUlHSktIS0tJS0tOTE5MTExJTE1MW3NiZHBebG1VTU5mc11nZnFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpxeXZrYmBrZWVteGxrdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHJ2dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUhHRUQ/QUJAPkNGR0JGQ0ZFRkVEQ0hIR0RFS0hHTE1OTE1NRkpOSEpLSklMSkpKS0xNTk5NTUpOTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtbnVcWWxRXG1tWnFta29teHh0c2lwXV9ya3FqVXV5eHBjXmtmYmdwcGpqb3BwcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHR0VFRUJCQj5AQEZHQkdESUVFRUJGSUhIRUdLSkdNTU5LTU5HTE5JTEtJSk1JS0lKS09QT05NTE5OTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGp1eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITEZJREVFQ0FCPUJBQ0dESEdMSEVDQ0hLSEhGSkxMRk5MTFNSTEdMTUhOSkhITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9udHN2c0hLSElCRUVFQUA+RERCR0RISU1JRkNGSkxJR0ZKTUxFT0pLV1JLR0tLSk5JSUpMSUtKSUhKTU1NTUlLS0tTa2NbaV5faWNyclpfWWpvX2VlVWtfY1thYVFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHh0dW5xdW53cXJ2dHdyR0dGSURFREZBQEJGRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpFSEhLTUlIS0pLS0lISUdLS0tMR0hLS0xNTUxKS01OVFtcVFBUTFBPTk9PVlFPT1FOT1FKSU5QUWRxaVRZV1xbXFVZW11YXVxcY2ZhYWViY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUNAREhERkdDSUtMSEZER0tMSERHSVBLTE9LTFdMSUVFSElKSElLSU1KSEZHR0lHSElFRkxJSkxPTElQXFdeUFxbYF5NWFlTXFxiXk1YWk1YYVJKWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0eHl5eHl4d3h0cXhyeHNxcnVydE9CQ0VMTUJEQ0JFSUVHR0ZLSktIRUZJSktGRUhIUEpNTUpNUklIRUFIRkpJS0xKTUpIRkRJRkRGR0VFSkhDSk1LTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5eXF5TWl5jXlpdYGNgWV9jW2BeW1RYV1leXWNiYmFjZWhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JREJCQ0dIRkhHSEtJSUlER0tLS0VGSUpOS05MSExOR0hFPkdHTElLTEtLS0lHRElEQ0RFQkZKREBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZWlBaX2FhXV5jYWBiYmJjY2VaUVlWVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQkVHSUZHSEhGRkpHSEdJS0lMRERLSk1NTExISkpISkY/R0dOS0tLTUtLS0lGR0NEQERBSElCP0lKSFBdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXGRjYmRjZlhRVVRSW1daYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhYaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktKRkZGSEdGSUZGRklMSk5GREtLTE5KTElLSkhJRkJISVFNTEtPTEpLSUdHRUQ/RUNISEFCR0dFVF1ZXlhfWV9bXVVYWE9dXVFLSlZeWF5bXVVZYFJRX19iYmBgYmJgY2JhZGRhWE9RUVFaUltdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SEhIWFhYWEhIWDhIWHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FIRkRHTVJIQ1FKRkhISEVGS0pNUEVGSUpLTkxMSUxMSElHREhLUU5NTFBMTEpLSElDREFFREhHQkFHRURXVUVcVF1TVl9YT1RVTlpaTUlKVGBhW19YXl5hXU9ZYVxgYF9iY2JdYWJXX19UUE9PT1dRXFtbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZIRElSYlBDVl5JR0dIREZNS1BQRUlJSktOTExMTUtKSkdFSk5RUU5PT01OTE1IS0FEQUNERkRDQkVGQk1IQktLT09OTEZNRkdJSkhHTEtNT1BJTE9QT1NPTFBTUlVaWVdZWFhkV09TVFBQTk1PVFJaWFhaXVxgYWRlY2dja2xwc3J6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVIRkdES01dTEdHWE1ISEpIR01MUVFITEtLS05NVU5PS0tLR0dLUFNTTlBPTk9OTkdLRmBFRF9MRWZkRU1bSV5bcm1PTVVtWUxEUGBVa1dnSl1YVV5ETFFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqUlZVVFtcW2BgYWJiYmBmaGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KBg4SEhYWBhIWBg4N/fnp7TElGR0ZIRUVLT1NJSkZgVEhJT0pJT01SUUtNTExPUlVST09JS01HSE1RW1lPUFBOT09PSUpRf1FJfFlZcXRZUW1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtgVlZYf2p0dXVfX3ZfWGFbW2ZbX2BhYWFdYGJnbXBsYHB3dHiBgYKDg4J/fX+Adnh6bHZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSkVITU5CRExMR0lMRVFWTEtOSUtSWFdRTU9PTVFUTk9RUEtLTkdNUFNbWlNRUk9QUFBKSFp4XVR4ZWhaU1VSdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Nye3xvfnhugHJfYGBiYVpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5uc3x+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1ISktHSlBPTU1KTlZeWVVMUVNOWVpNU1NSTktPSFFSU1lXVlBUUFBQUUtIZ3hsY3hybVtLTlZ5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclFoem1panp6fWx4en9vaG9ZdnZqdXVwgWByZn1pbHh8b15fX2JhW11jZGdpaWRnYmNkbGxwcHN0c3NzeXFyeGJsdWdxeXtzcnZ5foFzdXpufH15d3JuTkpTdU5DQkZQUEhKS0lLUE9PT01QWmBaV0tUV1BhXlJWUVlSTE9JU1RVWFdXUFVQT05SSkxyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmhxdW5teXB3bHZ0dHJsbl10fnprbXl8a3RsfGtwdnV4Xl9fYl5dX2RkaWdoZWVeYWJpaWlqa25va3FubWpwYWNmY293eG9tcHN5fm5xcGp7enRzb21MTFtWSEdFR1JQSUxNSktQUVBQUFBXXFhVTVVZVWVYUlJZXlNMTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1twenteYHpzY3JveHFoZH1pcnxeVExsYHZ1a2l1e3ttfnhrfHBcXl9iW15iZGRnZWVlYlpjY2lra3JzcndnbGloZGdgYWthZ3NybGdtbXJ8a21oa3t0bW1rbU9HS0tJSkhIUVBMTk9MS1JSUk9TUldSVlRQV1tWVlRUVGFfUE5NS1RTVFFVVk5OTE1PUEpIUU5QVUxLTFNUU1NUUFZVUVFOUVFYWVJOUFVUWFhYW1pVUlNXW1dYV1pPU1VXWFhSXllXXlZUUFlSV1dXV1heW2dyXltbWVxdX2NaX2NjZGZkY2NiWmNjZmZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLTE1NS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVdPT0tNVlRRTlVTTk9NTFFQS0pSUUtRTUtLUFJVU1FSU1NJSExOT1FSUVFRVFZSWFdcV1NTUFJUVVZTWlFOU1JYVlRZVlRaVlRSVVRUVVdYVl1ZXmBdXFpaXFxfY1tdYmNkZmRkZGFZYGFjYWJoaGltYmFkXl9jXVpkXGJtYV5mZWZtc2RpaGtrZWRjZmhQSktLT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYU1BQSk5XU1BOVVBOUU5MU1BMT1VTTlFOTU5RVVFVUVJUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdXV1lbVFBUVVhVVVpVV1pWU1JXVlVXW1haX1xVWF5cXl1bXWBhXltiYmNnZmVkYlhfYWJdYGdkZmVhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYVBMTUxQUUxPVE9PU1FPUVtaWFdYW1lYWVZcamRWWFlaV1ZTU09KTlZUUE9UUFBQTkxRUVBSWFRRUU9NT1NWT1dSVFVVT05NUVNWVVRUUlRXVlpdXFpWVlFRVlhWW1tXUVRXVlZWWVRYWFZTUllXVlpeWV1fXlVeXF5gXFtfX19fWmJiZGhnZGRiWGFgYl5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUU9VXFpaV1tbXFhaW2RxbWhkX1tZVlVXUUxNVlNNTlJPUVJPTFBTUlVaVVNQUE1RWFdSV1NTU1hNT09RVFhWVVVTVVlYW15dW1tWUk9VVlZbW1dSVFdWV1hWVFhbVFNSWlhXXF5aXl9gVWFcYWFdYGJfXWBdY2BjZ2hkZmBZY2BhX19lZF9gY1taXFtcWVpZWFdcWVxbYF5fW15eYWBeYlxZYFpRTk9OVlFQVFJPVVRTUFdcXFxYXlxeVlxeanF3eYBjXFtVVVhRTU9WU05RUVBSVFJLUVRUWVpXVU9ST1NYV1RTVVJSWk9QU1JWW1ZWV1NWWlhdXltbXlZTTlRVVlxcVlJUVlZYWVNUWVxVU1NdWFpdXlxgYGBWYVtjYl1hY19cYmFiX2NmaWRmXltkYGFgYWNkX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVUUlFXUlRQW15eXVtgXGBVXF1oanJ9c2xnXFRXV1FOUlpTUlFUUlRVVEtSVlZbWlpTT1NRVlZWVE9XUlNaUlRUVFhdV1hYU1hcWF5dWVpdVFVOVldXXltYUlVVWVlZVVdZXFVUV15ZXV1gXWJiXllfW2VhX2RkXl5jY2FeZWZpZGZdXWRhYGBhYmRgYl5YWl9bXFtYWFhXV1taXGBcW1tcW1haW15WXlldUE9PUlpQW1RVVlZUVFReXmBeXmJcYFVdXmJreXRsfWtaVVlVUVFTXFRVVFVUVllXTFJbV11bXVJPVVNYV1dUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSV1JZWVlfW1pUVVZaWVpXWFpcVlVaXlxeYGFfZGNcXl1dZWFhZmReXmRjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFcVVZZV1dVWF9fYWFgY11fVF1fYmVldYF6aFhZWVNVU1ZcWFdXVlZXXVhPVV1aXl1cVFJXU1dWVVNUWFJTVlRYV1hdXlhdW1ZdX1hfX1hcVlFZVFlaWmFZXFZXWFtaW1lZWltYVl1fYF9jYmFkZF1iXGBmYWRmZF5fZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOVFlWU1xUVldZVlZcYGFiY2FjXl9WW2BkYV96dW9oWVxaVVdUV1taWVxZWFlgV1BWXlxgYFxUVFhQVVdWVFZXUlNVV1paW19eWl9cVl9fWV1eWV5VU1lXWVldYlpeVldbXFtcW1taW1lZX19gYGRjY2RlYmRZYWZjZmZlXmFiYGNeYmNpZGNnX2deYWJjYWFgXl9YVFtaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU09WWlZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5bXVtWV1hZXFxcX1tZW2JWVFheXWFjXFJWWVBXVldXV1ZTVVRYXFxeYGBdYFxXYV5bXlxbXlhWWFhbW19gXF9YWVxcXV5eXFtdWFtgYV5gZWNkZWVmYlhjZWRoZ2ReY2BgZWNdZWlkZWlfZl1jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldaWFtcWFdZXmBiYWRhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1laWF1gY2RfUlhZUFdXWFlZV1ZXVl1dXmBhYF9iXllhXV1eWV1eWVhVV1tcYF5dX1paXl1eXmFdXFtaXGBiX2JlY2VmZWZiWmRmZmlnY19jXmFmZFppaWNmaWNlXmJiY2FgYF9dXVpYXFlZWFhaWFdaW1pZV1hVVVtdXV1gYGJieEtYV1tZV11bXF1aV1xdX2BiZGFiYV1gWGJjYmFjYWJdW1xbWFdbXV9dYF9dW2BkXVxYWmJlY2FSXFpPWFhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl5ZWVRYXV5fYF9gXFteXmBiY11cWFxeYGJiY2VkZmRlZmRcZWZnaWZjYWJcY2dgXGlpYmhpZWRgYmFjYV9gX11dXFlcWVhXWFlYV1xaWldXWE9YWl1hY2Zmcmt/SllXXFpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGJjYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVxaW1tjYGJiY2BiZGFgY15gXF5eXlpYVltfXl1hYWBeW2BhYmVjX11UXWBgY2RkZmVnZWZmZV5lZmhoZ2RkYFtlZ15haGhiaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFtbVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYOCgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoKCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3x8fHx8fHx6e3t7e3p6ent7e3t7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqCRT4/Pz8/O5vDvr++vsGiioyMjIyNiX5/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjYM6MjMzMzMuodLMzMzMz6qNkJCQkJKLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh5eHh4eHd3d3d3d3d4eXl5enl5d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHZ1dXV1dXV+g4KCgoKCgHx8fX19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ1dXl2dnZ6e3h7eHd2d3p3eXl6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7fHx8fHx8fHp5eXl5eXp6fHt7fHx7fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d4fXl7e3l8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGBgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d7eXl7eHx6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4SCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3d3t5ent3fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp3e3l6fHl8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh6eXl6eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYWDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KBgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISFhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSCg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGBgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3Nzc3JycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3NycXFxcG9ubm1tbW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgoGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Nzc3JxcXBwb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d3Bwb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnJzc3JycXBydXBwb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFyd3RxcnJxbomGbnBwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcnCFk3JxcW97nn5ucHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXejkHBxcZWffW9wcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFyc5yogW97op5+cHFxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcXBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJxlKubcIOjn35wcXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHd4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3Nzc3Nzc3KTsaqLlaade3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fnx2dnd3dnV4enh4eHh4eHh4fKmvo7Gtr598e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHx8fHuPq5mhtKSfqYh6e3p4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX19fZmhlaOvn5yjmn5/f319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgIGBmZuJmLChnZ2dg4CBgH9/f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/gICBgX+XpJ2Uo5uZkZ2Ie31+foB+fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5/f4B+hqivpp6ZnZ+mqaaPhYF/f4B/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgoWGjZqrr6Cbo52fnqKkqquln5SHgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMj5GPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SDhoyfq6mgmZminZ6en52eoaCakIaDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OCgoaPkpSVl5ycnp+emZiTjYiGh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhISFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkY+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYCDiJCVlJCXnZqRioaHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhIOCg4ybh5CUioSCg4WFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpGRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgYKCgoKBgYiHjYOCg4KBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgIB/f4mRgIGCg4OAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJloiEgoSCgn+AjJWCgoGChIKBgYGCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6Zi4OFhISEgoCRmYaCgoKEhIOCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBkIyDgX9+fXx9jJyOgIKBgYKChZSUjIGCgYKDg4KCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIg4SEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GWl4mAfX19fXuBmIyAg4GBgYCPlIyQgYKBgoKCgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgZWfin5+gH2Hi36EhIOEgoODgo6JhYyCgoOCgoKCg4ODgoODg4KCgoODg4KDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fn19gIKEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyLiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOJkYOEi4WCgYF+fYGHhoOAfn5/f39/f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWFhYaGhoWGhYWGhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaFhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f36AgISFhIWGhoaFhYWGhoeHhoaFhoWFhoeHh4iGh4eGhoaHhoeGhoeHh4aGhYSDhIWFhoWFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiYiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4OEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/f4WFhoiIiIeHh4eIh4iHiIiIhoaHiImJiYmIh4aHh4eJiIaHh4eHhoeFhIOEhYaGhYWFhoaGh4eFhoeGh4aHh4eHh4eHh4eFh5OTkY+RkIuHhoWFhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt6gIaHiIqKiYmJiImJiYmKi4qIiIiJiYuLioqIh4eIiImHh4iIh4iGh4aEg4OFh4eHhoWFhISEhYWEhYWGhISEhYWFhoWGhYOJlJOQj5COioaFhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhYSCgoKCgoKCgH9+fX19fX5+fHt8g4eJi4uKiomIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIaGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgYKDgoGEg4SDgY6TkpCPj4uJhYWGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fX5+fn5+fn1+fX19g4eJioqHh4WGh4eHh4iHh4mHh4aIh4eJiYODhIOFhISFhYeIiIaFg4OCg4WHhoeGhoSCgoOEgoOEhIKBgoGBgYODhIOEkZKQjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgoKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCgoF9fH1/gH9+fn59fH19fHl8g4iIhoSDgoKDhIaFhYODhYSEhISEhIWEgoKCgoSEgYKDg4WGhYSCgYGCgoODhYSEhIWEhIaEg4SFg4KDgYKDg4SFhIeSkY+NkIyJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhIWFhoeHh4aAgYGFg4OEhYSHiIWCgICAgX9/gYODg4ODgoKAfX1/gICBf31+fn18fX17enqBkISEgoGBgIGAgoKBf36BgYGCgYOBgoGCgoKBg4SAf4CAgYKCgICAgICBgYGDgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGAgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn5+fX+Cg4OCg4KDgn59fn+AgIGAfn19fX1+fXx6eXyDgoKBf39/f35/gIB+fYB/foCAgX+AgIF/f4CBgX59fX+AgYB/foCAgICAgICAf4CCgICCgYGDgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gIODgoKCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgIB/f39+fn1/f35/gH9+f3+Af4CAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f39+f4CBf4B+f39/gH9+f4B/hZKSj46PjIuHiYWEg4KBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9+fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXuAgH+AgH9/fn9/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/f4B/f35/f4CAfn2Af39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfn19fn5+f359fX19fXx8fHt6eXl5eH2BgICBgYGAgIB/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gICAf39/gYB+f3+Afn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISEg4ODhIKCgoKCgX9+fX19fn6AfX19fX19fX19e3p6eXl5eoGCgoKFg4GCg4GAgoCCgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipSQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChoSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX18fX18e3l5eXh4fYODhIWCgYSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgYKCgICBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICBgH+AgYB/fn19fX5+f36Ag4SHh4SGhoaFhoaHh4aHh4iHh4eGf32AgICCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9f4GCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYODg4OCg4OCgoKCg4OCgpGQi4iJh4mHhoaEhoaFhISDgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgICAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoeHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eXl8gYF+iJaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhIOEhIODhIOEhISIko+MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gICAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx5enp7fH+Bg4GCgYOCgH59fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX99f4OEhYWDhYWFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yAenl6e3x5eX19f4B/gH98e3t+fn2ClZF/hIh9fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgoKDhYODhYWFhYODg4SCgYKDgoODgoGBgIB/gX5+fX19fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH18fn5+f35+fX19fH+BgH2Gj4F9fYJ+f36Agnx8gH+CgIKAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uUkIyMjo6NiIiHhYWFhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx9fHl6e3t4eHl7enp8goCBf3+BfX9+f359gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJKNjI2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gIGAgIB/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt8fHx8e3x8fHp6eXt8en2Fg4OAgYF+gH5/gH6FgoF+gH9+foCFhoKAfn6Dhn99fH5/gIGAf39+fX19fX57fH1/f3+AfX9+f4yRjo2Njo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KEhoaFf3+FgX5/gIB/gH5+f35/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aFg4CAgH1+fX5/foyEgYd+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fXx+f399foB+f36Eko2NjI+NjIqGhIWEhISDg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fn58fn6Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fXt8fHx6e3p9f4CAg4OCf35/fHx8fXx8gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIuQjY2MjYuKiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfX59fX17e319fHp8fH6AgoGAgIB9fX18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIOBgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f3+Af39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5/fnx8fXx8fXx9fnt8e3x8fHx9fH18fXx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiYqJhYiSj4yJioeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHx8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CBf358enx9fX59fX5+jIZ9fX57e4ODfX5+fX18fX19fX19fH17fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4uJjJGQjoqIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX5+fX59fHx8fn18fXx9fX1+fX1+fnx7e3t8fH18e3p7e3l6enh5e35/g4OEh4mKiImOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGCf4GBgX9/gH+AgX+AgIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36CkYSEg4F/fn18jYd9fX59fXx+fnx9fXx9fX5+fX5/fH19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI+Oi4uHhYSEhIKBgoKCgoGBgYGCgoKBgoKBgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB+fH18fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjouMiIWFhYSEgoKCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4GAgIGDgX+AgYSBfn6Af35+gH59fn6AgX+Bf3+Af39/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8fHt8e3t7fHt8fH19fIqLiYiGhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoODhIOFhoOCgX9/gIOBgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBgH1/f3+AgICAgIB/fnx9fX19fn5+gn2AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x+ioeHhYaIhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6AgoB+f36Bf35+f4B9foB9fX1+gH9/gYCBgYCAgIGBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCIg4SEhYSEhIWDgYKBgYKBgICCgoOBgoOEg4SDg4KBgYKBgYOAf4CBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgYODg4OFhIWDg4OEg4OEhIOBgH+Af4CBfn19fn9+fn5+gH19f3x9fX6Af4CAgIKAgIGAg4KAf4B+gIF+gIGAgH9+fn5+fn1/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgoB+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dXR6hISBhISDhIWFhoSDg4SEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/f4B/gIB/gICDgoGAf36AgH+AgYCBgH9/f39/f4B/gIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x6fHp8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF/f4B/gHx9fX6AfX5/f39+fX98fn5+gX+BgH9+f4B/gYOCg4B/f4GBgIKBgYGAgIGAgIB/gIGAgIKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fH9+f4B8f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WEgoSEhYSEg4GDgoGDgX+AgX5/gH6AfX19foB+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgYOEgoGAgYB/gYCAgYGAgYGBg4OBgX+Ag4B+goOEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CAgYGAgIKCgYCAfoCCf3+BgoOBgYOCg4OFg399fX18e3x8eXp7en55e3l4f357fHt+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gICAf39/f3x/f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4CAgX9/gYKBgH9+f4F+f4CCgoCBg4KEhIaEgH5+fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fH6AgIB/f39/fIB/f4GAgYCAf3yAf35/foB/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgICAgIB8gH6AgH+BgIB/fYF/fn9/f359fX6AgYKBfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYODg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAgICAgHx/f4B+f4GAf39+gX9+f39+fX18f4CAgIB+f35+f318fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd8eXd4d3d4e3t7e3yFiX17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgoGBgoCBgICBgH5/fn9/fXx+fYCBgoGAgIGBfX6Af35/gX+Af3+BgH9/f319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKBgYGCgYKBgYGAf4B/f399fX9+gICBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoCCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHqBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGBgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7j393d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgYCCgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHenh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCf4B/gIB/gH+AgIB/fn2Af35/f4B/gH+AgH+AgYGAgICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9fHx8eHh1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgoKDgICCgYSDg4SBgYOBgoOCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CBgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGBgYB/gIB/gId+fnx7fXx7fX94d3Z5eXp7fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KChISAgIOBhoODg4GChICEg4KCgICCgoSBgYKBhIJ/gIB/gYOCgYGBgYCAf4GBgYGAg4B/gIOCf35/goGAgH9+gYCBf4CAgYCBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH9/hH19fXx/fXt9f3p5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J0b3dxd3lzd3uFgoKCgoOEgoOEg4CAg4OGg4ODgoKEgYSDgYOAgIKBhIGCgoGCgX6AgICCgYKBgYKCgIGAgICCgoGEgH6Bg4J/f4CDgoCBf4CCg4KAgYKBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhxeXR2eHR3e4SCg4KDg4SChIODgYKDhIaEgoOCg4SBhIOBg4CBg4KCgoKCgYKAf4GAgIKBgoGBgoKBgIGBgYKCgoOAfoGDgX+AgYSEgYN/goKBg4GCgoGDg4OEgIKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgYOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIKEhYKCgYKDg4GCgYJ/gYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOCgICChIODgoGCgoGDgoKDg4SDg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt9gX58eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIKBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgYSFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoCCgoOEgoKBgICBg4KAgYOFhIOCg4CCgoOCg4ODhIOEg4CCg4KEg4KCf4OBgoSEgoSDhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6fH1/fX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fn5/fn18fHh2f3Z3f4SHg4KDhoODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4GCgYGDgn+ChISDg4KEf4KEg4ODgoSEg4OCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn1+fX59fX5+f3+AfH2AgYKCg4OFg4SDhoSBgoiHhYSDgoSEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODgoGEg4GDg4SEg4SEhYSEhIWFhYWEg4ODf36BhIB9fXx8fHx/gX5/fn9/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODg4WDhIOFf36CiouFhYSDgoSFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhIODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhYWCh4aGhIWEhIWEhYSEg4SDgYKCg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF6hH9/f36EhIKDgoKBg4SDhISFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf31+f31+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhIWFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBhH6Dg32BfX5/fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd216c26Ah3ltfXJzdnN2bW53bHB5bHV+f398foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgYCBgICAgYCAgIKDgoKEhYeGhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb2x3fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLiYWEhoeHhYOFhIWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f396fn18f31/f359gIGDg4CCg4GBhIKBf4GCgH1/f4F+f35+f4GAfn6BgoCAgoSHhoODhoSFhYaHhoWFhYWHhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhoWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXt9e3x9fH9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhIOFhIWEhYSGg4WGhYWEhIWHhoSEhYaFhX14hYOEhIOCgX5/fnt8e357fHx9f399fH9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYeFhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIaEhoaEhYWDhoaFhoWEhoeGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1+fnx8fn2Afn1/gH5+gH99fXyAfX5/fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFhoaFgoOFhoaEhIOEhIOEhoSGhYWFhYOGhoWGhYSGh4WEhIWFg4SHhoOCg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYF/fHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWGh4WHhoeGh4WIiIeHhYaGh4WGhoSBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDhIeDhIGChIWDgYCAgHt7fn18fHx+fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhIaGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDhIKCgn+Ae31/fXx8fH59fH19fH17fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f39+fHx9f318fX18fnt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWEhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iHiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWDhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBgoKBg4WCg36BgoF/hIJ/fn5/fn98fH1/fXt9fXx+enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x8iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaEhIeIh4eHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhYSDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCEg4OCfYGBf36DgX5/f4B9f3x9fX59e359fH15enp5e3x9enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIWGhoWFhoKDg4WAgIGAgIOAg4B8gYB+foKAfYB/gn2AfH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhYWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhIWFgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Af399fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXx/fn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhYaGh4eHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhISFhIWDhYSAgIKDf35/f39/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t8fX19fYB9fXx8fYB/fXyGg4aGhYaGg4SDhoKFgYGAf3+AgH5/gYJ8fn9/foCAgoKChISDgoGChIGAg4KBgISFhIKBf4CCg4OEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhIODhIKEhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8enx8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX5/gnx9f35+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWDg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt5enp5enp6e3x5e317e35/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Afn5+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzMzMvLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTU09TU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjtBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTU1NTT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19jZ2NjY2NjY2NjZ2dnZ2NfX19fX19fX1tbW1tbX2tva2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0A8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNhG1wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLepp6enp6enp6enp6enprG+vb29vb29vby8vLy9tIuKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk08Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzk4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6OghoSEhISEhISEhISEhIKVrKqqqqqqqqqpqamprJtUU1NTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs8QkA4PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzc5SKzExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSloomHh4eHh4eHh4eHh4eFl62rq6urq6urq6qqqq2dWVhYV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8PD46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183PXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqaeQjo6Ojo6NjY2NjY2Ni5yxr6+vr6+vr6+vr6+xoWNiYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcXCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs7Ozs7NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS0NDQ0NDPz8/Pz8/Pz87Q09LS0tLS0tLS0tLT09HMzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7O0dTPz9DU0s/Pz9PSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbW1tbW1tbW19bW2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O07udz9HIlKfS0ceSq9HOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0rWVm7TRmqycsNGZrJqy0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz9GfoKqvzZOInJ7EkoadnM3Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDk2P0I/Qjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RxYeasde9yZiYxbzJl5nF0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9anmbHV0pSWn87Rkpmhz9DQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD09OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/VpZmx2bCfw5varaO/ntXR0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1qWZstbNipKex8uIlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0NWlmrPWzdulmbPQ26OZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRj9ISEdFQDw8Pj48PT08NzU2OTk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09DWppq0zY6nmqCtkKeYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBDOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocfS16WbtLyjpaigr6eiqZ3Q09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT0dS1gsTVnZKNutWako6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPDw/R0VHS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0cPU09O5x9XT07nI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPTc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLU0tLS1dTT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo2OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEFBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDREVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvN3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vb6/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLe3t7i5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e4t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKeoqKeoqKmqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3tre3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WkpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSko6Kio6Khn5+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2epKShn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6emoJ2cm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqamp6enp5+bmpuioJqWl5Wam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnJucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaOipaampaanpqagm5mboaCXkpOSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop6cn6GgmJKRj5SXm52YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpKanpqWlpqempaOgoKGhn5mSlaSampmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoaGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqOio6WkpaWlpKSjoqGhnZyalqmqnZuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn5+goKGipqSjpKSkoqGhnpuamap9fpyZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoLG1pKCioaCenJuamqKXUIOcm5yZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoKGnkrGin5+enJmZmpuqYkyHnZ2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qbmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6ChoKCfqoF9rqKgnpuZmpqnjE5Tip+enpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uamJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2enqKXWYmtnpyZm5ydq2pVVYqenZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udnJudom1jnqCZmZydoZppYFiMoJydnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmZm6JzaX+imJucnKOLal9YhqCcnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycnJmYmZmpdXBqi5ecnZ2bfGhfXIehnZ6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5yZmJmYo3tsa2+HnJyelHBlW1+KoZ6fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmZ+Ji5J0fpygo5F4ZVVgkKGfoJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZqgppyNbIixp6R4ioZjYZecm56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqWpaCIeFtrp5aWW3SBfHaUko2SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGQkqiPa1RQcpyKi05ddHiAiIeCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDf5OoejsvPHiPenlHOlNvdYGAgpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn+emU9PVD97hG5mTjs1UHB6foWOjYuGjZSRi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqFgIGApHVTgXhQfJWJeVJofFJcdYSKjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gH56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRi3+IjYyLi4eRjZ9hjdbAX6avpKZwcYp/VmiGi4mQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZCeoZ2Tl5uhmp2boqORZb/QrZXbt6bAsVRed2lVhJCLmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqaqygXOzr53RxaKYrK1xasWHUHufoqSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKmqaeorI1+k4SKyM6ws6qSdEausVtwnamnoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGRjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSoppqdpKWjoqWhjINvmLGjnpyHgXRjeox1bZSkoqChn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZWRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKgo6ehpq6mppyonYFrUYySgH6CdnRvcHN0foCQo6Ghn56doKOalpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nec19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaiqrbGyrqyrqYNwX0hvdW5xdmtpZWhmZ3F2foqWoaSln6CimZWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVVxoZG9jbWlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Gem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqp6+3tbO2ur27r5RqY1dIXGtmanFnY2NlWlphYmt1en6IlJ2jppydoJqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrsre+xc3Qx8C1ppN3Xl1TR1x0a2pxZWBjaVpYXlleZW5wcXR4hZimrqelmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh2a3FoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tbzQ3ODZyruvoJF5Y1xeU0FfbGpxd2diXmdeVVxcW1teZWRiY26JssnCuaGnqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWlgZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8TAztfYzrqjj3xvXVZYWEw9XmJodHJtYmFmW1dXWFhWWFhdcZKwxcu6uLepr7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdubVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGusTAx8/Sx6aFXU9LT1NMPVZXaGJgcWhhX1haV1hWVF6HscS9s7S2qrWyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4R/amZoYWtsZ251cnJ1cWdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/Dw8bGwbadx7OMXFNWUENWU1xhZnBlWFtaXlhZZ5Cvv7q2pqmpqaqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dWtsbmRvbWlxeG95amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsPExLm0v7m7yq55XVBOV3x0kJeWVVRYV1lhgbC3qauytKyupaWjp6SgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl5e3dua2lodlpmcnhzeWZmXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPEwsW+t73Dw7J9Vkxwd5elnU5RU1t0oLW3sq2suLWzrKmjoa2prKetn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWZpamheam9ueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx7/Ex8PHyLCAYFiRppJITG2Xs8K8vrm8ury6vKytpqm7urm3v7K1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3Zpamp0bnlsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc3FxcXCxcXN0MeTi6iLRW25xcnNxsXBxMfBvL60sbCwwr6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdga2p3bGlmdW90Y11iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXBwcDBxcbJzrGMXmnE0MfLz8W2v7/AwLq7vbWzs8C/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWZja2Ria21ub15ZXVZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK9vMHBv8DJkz+U0szFyNHBr729uLm7u763tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWViYWNjZGpjZ2NbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zJzsG7v8C8u8S9usDEv728uLvAxatIlczEwMDJv7DBv7q3u765tbi0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFiY2hqZ2dqZWpeVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1I26v7vDtbrHt7a5u7y4ubW6w8mpTI/Jv7+7wb65xr3Cv7zFuLa3tLi2tru7uLa0t7q1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWZwamVsaFhZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+8z8R4qsu9x7e5uK22tLe5s7WyusXJnE2Eyr+/vr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25xZ3FrdGZibmBcVEhLS0RKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNeudYK8yM/CwLiutbW7vbe5sb7Dx5FUf83Dwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcmZsam51b3hjaGJcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCx8nSmXJ0rtHRzMrEtbq/xMi+vrS+wL9/YXbLxsK+wby/w8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0bGxuX2NfYWJOSE4/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDCur68xL63vMC/yc/HyMrKwYZzdKbMzMvNysbCw8vOwby4vLqweHFpu8jEwMC/xMDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh7bW14fGBxY1tfYF9UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7ur2sO+tr7Avr66ppyqsrbDwKV5d3qcxMbLyMHDwMDJysG/u7myoop/da7IxcS/wMG/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem5zeHRocF5cX11aUkZFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8S3ba3Ovba5wLyqfW5obm1ygZaYdHh9mb2/xsC5wLy+xcS9vbixrqCfjI6dysLDvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdtdXtxb2pcYGBaU1BBRklHS0BFQ0k8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNsnWBs722tcGkhmlaXmBNUltbb3R4g6K4uMK6s7u3u72/uru7rqKippefgL7Ew768v7u7uLbBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnZ3b3FhX2ZdW1VKPT8/R0c9R0NDOTo1Ozk5Pjw8OTo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaaEeIqgr7WcamZnVllgSUlNUFRteIinsLe+ubK1sry5vLa5vrWVpbWlrXatycTAvb+5s66yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NhXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8apiHx2jKGYX1NDWFVHYWpWT0VKYY6ira+2urW0sqy8ubi1uMG9i565q651psvCv7m6ta6lrLOxprCtqJ2gn6WttrXCt7a0paiqqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnNuY15nWV1dU09OQT5KQkBKSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/tJCCeYiQbk5LP2RZQk53gJRpTUFdg7C1s7WytK+su7q4trm/xnaHsKScZqm/uLWysa2tn6Smp52kpZyWmZmZn6muuayrq5+lqKSrrq+nsKuvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVqbF1ca1VeXFBOSERHTUJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiEfFhGQU+HWUpKWHeNgWJAU6O5s7SysLGtsLm4tru3u7yRo7OtpHSssKmrraujqKGdnZ6Xl6CVkpaXj5ifqK6ko6Sgoqaio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J5aHV0bmVVYWRXXVJPTUlASVJETkM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K8qZiZlGhNP1J4cVBJSUtonIBaRVKuu7Gss6+urK22trK0ta6pp5+am52fpqieoKipn6GnlpuWl46dlI+Qlo2Xm6SooKCioqGlpZyjo6CepaCkrKWmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6ahiHiDfHZ/emN4bW5dUWlVUE9HUE1NQ1BRQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcKqpb1oRFKdglFXSUpgSlWNYWRjga61qrK0rqqrr7Cys62lnZGXk4+XoJ+ioJyjpJ+eqJSblpaMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6ionKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclZOQj5GRmZCWlZiXn5icmZukmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn58f3V2fW1re2RoVlJkTkpIR09TTktOSDxFQDwyPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoKrGv8qgUEFznXZPbUpLY2Z0c2BcYHKQsa+us7WqpqyropuZlI2RlZaYmJyfoqKcnaSemqSXl5eWkJKRkZOal5ugpKqeoaGepqerop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoqWimpmer6iusqumq6qgm5iYmJWTlpqTlZWalpuXl5ihnpyclpuhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eXxleXpgYlNVYUhJSktTVEpTUU05P0E2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZykxsaMV1NKZaRaZX1vcltRa2NbZWFea4+0sLC4rKahnJ2alJeamZCOkZWRjI6Nk5minJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Ggo7GusrG0qrKuo5mcnZ6hmJubmpeZm5SWm5aZnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaYJsZltTWlpNUUtPT1ZNU01CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6Kan6qjjHlVaXF2dXBjdnZYV2NgY2haWVdnra6sr6efnqKglpCTm6CbmZeSk5+coaObnpuWn5qfl5uinqWhnqSfpKitraisqaSstLe2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztrizuK2ytKSgnaWgrKGhoqGgmpiWlZ+bm5iloaCeo6GgnpucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYKAfXh2anh1XW1bUmFJUlVIRlVXSkNNRz1LSThFPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoKOAb4JwYGNYTFtSWkxLUFhSSE1NR5isqqmkn5+ZkpKUmJiWlpaMiIuOlZ2cnZ2el56Zpp+gqKWxqqeuo6uutrC1srGutri9v7qttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q66xubi8r7OwtcK8t76zs7WirKKpqbKpq6inqJqZnpqqp6CZp6Cfn6iopaSenaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWFfnZybWl3bWltXFhcQ1dOSkdNSENGTj0+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqco56dimJXXmVgV01RRz0+P0NDPz5CUXipramqpZ+en6KjnZ6dmp2blJOVlJ6dmJSFnZqgmqukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDJv7C5ub25wr64tLvGxL3DvLezqrOtqrO0r7Ouqq+jnayotrGto7CmoaOwsa6wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXx0cmtsdXJxaFdcUUZVSERKUEk/RUI0Rkg5NTw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmqCflXxfXmVgUUZEO0M+Rjw/OTZOfqqzp6OjoqCepaumnpeclJGanpmVjIqGiIZ4bYigpKKrrLS8tsO9vrO7wcPCxcC/wsbFxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DDvsfGwrfDysnDwce/urS6u7W7t7C2sqq6sq68uL+7uqu4rauquLu1vK6uuKOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtkaW94amVaW0ZMTUVEVE1FQ0U3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1zamFXTkU+SVl8b2FCPVyOrqygmZubnp6Zl5eXko2Pl5eUj42QjIKDgndycW1wj6atrrS5xbvNx8u+wczNzczIyNDMzMzHysXGzNDS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysHGxsbKyM/AydHNx8bIxsK8xMG+v7+2vrOtv8DDw8fEx8Svv7myuL3EwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dHNlYmdyb2ZeWlpET01ERVBJRENBNTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+OTtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnZVqZl1USURAP0qFnqSZg6CyraOenJ+amJeUkpSWkZCPjIeEhIiGg4CBgYB5cXJvbHmktrq5vsvB09HTyM3O0dPR0tDQ0dHNzs/Qxc3U1djR183Gx8nMw8XKz8rT19HX0tXW09TIzMbMzcnTzc7TzcbJysrCxszHycnGv8Ozs8jFy8vLz8fKv76/vcHHxczMycnAw8Cur7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5aQjIaRi4B7cnV2Z2NndmpkVldSRE5GQElRQz5CPToyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGbYlRMSkRDP0NSr9G9sq+mnJycoKShnZqUk5WUiX14cWtlYmhycHJ7hYqAdXBucXNwhbPDvsXR0NfW1dLWzdTW1tTT0dLT1NLP0sPQ09bY1dXSy8rO0cvGzdHK0tXW2dbY09bYzdLKz9HMz9HM09DAycjKxMzMzM/PxcfItsDLwNLNzNDGysnAxMPIzs3Q0c/NysjNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNgZXJjXVJcSUtHQUVJSj47QTg+NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaCioVpJQEFEQUZRdrGvppqUl5+cmqCgnpucmpWJd2ljYV9fX19eX19dYWx1c3Bwb2xxcXWSxMjH1NbX19bT1tDV1NnU1M7P1dTU0dHM0c3T19bT1dDP0tPRydPRyNDY19jR2NLX2dTWzM/Pyc3Sy87RwMbDyMbPztHR0sjMzcDLzcbUz8zPyMTLx8fIzMvU1NHVz9LM08K5xbGlqLWup5uoq6Wdsqiws62sk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1iY2ltX1ZRYEpKQ0VDUk1APD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48P0A9RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqiho6tmQzg9PkRYgqqon5eVl5manJ+dmJyckn1xZWNiX19hX15hYF5hYF9gZW1wcG5rb3J2d5zMwdPV09jY1tnR0tLXz9POy9LN1dTRys/M09bS0dbNz9XV0cXR1MrQ1NXWztPR2NfX18vIzsTJz8zKzMDKwMnKzs7Py9DOzszPz8jM0NDLzsvDysfJzcvM0tPO1NLR0NDKvci5sK67ubWrtrCtqLits767sZqPoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcG9rYWRucGFYXFpKRkZETVhFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSxe0hGQjtXjaGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGFgXl9fXlxibXJvb3N0dXZ5pL/M1dHW1NPY1s7O08vOzsXOytLSz8fOzc3Uy87SzcvX1tDM0dTLy9DS08rO0dXS1dXKwMrBxs3CyMrDzMTGyMvLz8rOzdDO1MzGyc/NycfLxcfCxsrMzdDSx9DPzs7M0MXHwbi5vcPDvcO5s7K+sbvDxLWqmKWhmJaSlZWSi5SNmpGUlI+PlYKJhnlxcmttaGBgcWhZWGhWTUdMSVBRQjtDPjs2ODo4Ojs1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4ytXW2drb2MzMz8jW1cTCta+0qKCtl3hsb3B3j5qNjJeVkJORkZWWlZCLfGVhYmJgXV5hY2FgYGBgYWFfX11bXWdycnByc3Btcnmlx9PPy9DQ09TJxMjJxca/w8XPzsfFx83K0cjLzs3G0dLQzszUysfKzs/Hx8/Sy9DPxbrEv8bKvcPIyc7Fw8fAx83IxMzKzM/IxMTQycbCxsnFv8HHzMvMz8LLzMnHy9DFxce7x8PJycLPwb28v7DByce5vKqwsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Vka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62ktn5ngoWiqpONjZaPhYODg4F9hIR+c19bXl1eYF5gY2RjX11dXl9gYF9bWlxgbHJxbm9rbG9vfbnRyMnKz8vNxLq/w7q7urm9yMbCw8DDyMrIyMrIwcXMxsjKzcnEwcrJwcHL0MXLyL+5wbzGx77Axs/LxMDDu8nHybzJx8XKwb7Cy8bFxL7Gvb3Bw8XMxca8wMnDxcfSxMHJv8rKxsjG0cPDxsOuxMvHxMq3v7y6tKmspKWYn5iso6Gmm6Ogm5V8d3N1ZmpbYW5tWlxYUkRMR0JHRUxERlNANTQzMzVAPTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76ysLZsXnl8n5GKkpaGeoCFhX91eHVycF9aW11gYGJjZGRlZGBcXF5dXl5gW1laXGJvcm5raWtwb3OPx73JxcvAxsGwtrmxsbOyscK8vLy6uMDBwcS+vbm9v7nEysXGwr3GwLe7w8m/wcm7tru6xsO/vMLOw8a+vrXBvcO7vce8w7q0vcbEwsO3wLa2vr+7zMO9trrIu7++y8PBxsPGycfJxtDGwszHssfJw87MwcXDv72yt7Cyp6ioubClrbCqrayUenZ4a2VoYGhvZFZeWUpGSkZIS0FGQkZJQDk6NjU4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTV183KzsXJxcfBusW9rK6mYGN1gZKLiIuEeH+Ghn99g3t0dGNcXF1eYGBiY2JiZGViXVxbXF5cXl1aW1xeaHNxbWdnbm9yeZ29y8HDusC4rbCwpqmtq6a4tLa0s7Ozu7a9sbewtK6yu8K8wcS8v7q0srq+wLjIuLS8tsHCvbi9x8HEu7WvsrW6v7TFuLu1rLm9vsC9sbu2sLe6s8a8t6+7v7W3tcW8v8PGwMTFxsfLxcDGxrvHy8DOycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkZCREFFRT89OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MvNyMnIysnKxNDN0s/NxcfBxcG/urjJt6uwmVtnb4mOhoiJenh+hoZ2d4F8c2hdXV1dX2BfYGRhXmNlY19eXFteW11eWltbXV9scG5pZmptbnJ8pMa/uLi0r6qrp56hqaaeqqyyraqsqbSttrGzqa6nrLO7urbDubq5sKu0ubu0wrmvwLG+vLu2vMe5w7etqqiwssC2uL2wsaixs7W7vKyutqautq67srGqubCuu668uLzAwL66w7/Gw8XAvMbCyMu4xcfFv8fEw7rExsK7xsnMy7O5wr27s4l0dndraWBibGlZV1dbQUxLTUpFQUNARkE6Ojo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxM/HzcHCxr/ExMPDysLJyr/AvMG6s7W1w66qsJJbaX6SiI6Pe3h9iYV6e4SAd25eXVxcXV9gX19kY2JjZGJgX15aW1paXVpaWVpcZW5vaGZnaWtucoGturC1raWjpqaZn6SfmZukqq6kqKKrqqyqsKOmn6qttbaxvLivt6+orri0tLy4s7yvuLm1srzBssGvpamjq7Gys6i9qquoq62utbSmqK2hpK+psqaoqK6lqLessbO3urq7sry+vr7Ev7XBwcfIt77AxbfFw8C7v8TCvsTIzMq/v8TAwKmHc3RzamlcYW9kV1ZYUEhaUlNLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzcPHubnLwsu+u8m2vcO+usq3wcPBtLa8trGvtbytqauSY22Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBgX15dXFpYWVtbWVhaXF9ma2ZkZmVoa29yhamlq6Sdm6Cjk5yjmpeQoKKpo6Kfpaanpq2gnZukpqyyr7e3p7CsqKq0q7S6sba2rra5srC6urG3pKCkoKaxqKypuqqlp6eop7OtoKinn5ykpqyfn6ekoKGxra2ssrWztLG1vba7wcCyu77DwbG5ucKzwb3Atbi8vb68wsfEw8S/wMSghHhxbGJmYGtvYFRZX0hOaE9USEZLRjw9QD06Ozs4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrAur21oJ6UnaGmurars7O7s8TPycvCxri3x8DMv7jKt7vFuLPFuLO/wKy1vLKspq+0raGjkmlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFtdX2RjY2ZnZ2drbW6HnaielJSZn5SZoZeVi52goaacn5+kpaKnnpuim5+rsK2xtaSpqqqsrKS0uK23sKyztq+zta+wqp+en6SisqWmqrmtoqamoKitq5mgoJ6ZnZ+lmpqjnJyesKmsqKqsra2ws7mvuLm6sLa8u7qrs7O5s720t7GxtrW/tb3AvcPCu7u9l4R7c2xfZV5kZFhUV15JV11LUEdKSkdBPD8/QTs/PDA1NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru4wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765x7i3v7eywrSxu7usubqxop+pq6eYnpBtfoWGf3hybW9ta2JeYWZmXV1eXV1dXF1fYWFiY2NiYV9cW1taWllYWFdXV1hYWFpdYmRkZmZmaGlrcoynm5GSkpmVmZ+UlY+boaGonpudpaaipZugoZqZr66tr7KhpaOuq6iitbCysqypr7OnurOmtqGjn5yjoa2joqq2q6Ojpp6mpqOWmZ2XmZudoJqXnZydnK2hrKijpKatq7O0qrWwsquzubSvq6+ysrO4s66pra6yt7C6trq9wLizsZSGeXVmX2ZfW1lWU1pVS1tRTEpFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7OdpaOYpbHCtba9rbS4wczIxr/FtsHAx862wMO9s7m5sr+2sbm7rbK0r5+ao6qglJqPeH+DhH94b3F0cWhlY2hkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oJqRkY6SlJWdlZeTlp+doJyWoaGopJ+fqZ2bm6umr7CrnKOkuKmgoK+ot6unp62wpLewpLego5yZmaqmoZutubCjoaScoqCfk5ShlJaWm5mYlpeclZ+pnqqkop2jqqqxrai0rKqnrbOwpauus7GwsK+vp6iosq6xtLC8tLq4rqOVgnp2ZV9hV1lYU1JUS01eTFBMR0hMS0U9QD49Qjw6NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS6wrG+t72unaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa68u7W7vLW5ubCvsKqcmqGplZGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNjYmNiYmNmaYCTj5KKj5GSmJabk5San5uelZ+fp6akp6ignZ+moKuvpqCio7eooaGiqbOipailsKaxrqy1nqGdlpWpoaKUrbGxn6Ojnp6Ym5OLoZSRk5iYk5eYmJeep5uooaKapKWlq6SlsKelo6usraaprq+vq6iqqrOmpquvtLGuvLaxsK+gknt4c2ViXFtdWE5MUUhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtr2wu7G3rJ6lpqy3u7zBxbqxubXEycnAw8bFx7bGxLPBv8Wrt7e9tr26u7WyrK2omZmfo4uKdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZVUlRSVWBhX2BhX2BgYmRpf4+Ph46LkY+RmpKTlaOZoJacoKWhraalpaSko52qq6Wan6WxqqGhnqWqnqiin66sqqmtraKiopWXopqckKupsJyfop+fl5iTiZ6RjZKTlpCYmJOcoaOcpKGilaCipKWbo6uloqOrpKutpa6yqqalpqa0pqqorbO1tLm6sKusnoxzcXBgW1dWVlJGUE9IWlxPUkpUS1NMRUdKRDg7Oz48OTY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsq2dqKevubmzwMi6tcCvxcjMusHJzMi1ybyxvcPJrbG4wbW8wLy0taqsppaanJyJgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJSTlFZXVxdXV5eX19iZG2KjIGOg42NjJeRkpGcmqGcm6CoqauorKeppqSZpa+klZmlr6mgnJmboJ6umpyrtKCmpp+jpKGUk5uWlpKpqq2bnaChoZuUkIyZjoyRjJKNlpWQnaGgo52co5WboaOhmKKoo6Koq6CrsKSuuKajpKOsramoq6+0t7K9tbOrr5iFdXRpW1hZUlVSRVhMUVtYTVVPUUxRUklOSkI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraeztq6oqK+um6morLe2rLzKu7a/rMvGxbjBzs/Hs8S6t7vCyLGtuL+3vL67s7amqaCWmJmXiHp0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05PUVlaWlpdXFxdX2BkfIl/iHyJjYeQi5WPlpihn5qgq6qmr6yosKWpmp+toZWWpKinnZiQj5qer5eZp6qZoJ2UpaGfkpGSkZOVqKulmpmZnp6WjoyLk4aJjYOPi5KVkaCeoaSZlp+VmqGinpSbpaWnqaigsLCmsb2ooKOstKqup7C0sLm1wLGusauQfnJ0Y1ZUVk5SSkdWUFJSTExYTkpMT1JHTUtBQ0ZERD5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/tKymsbeqpaKxq52pp6mysKS2xrS5urPKxbm6wcvQyrK2uLy9wMOxsLG3rrS0u7O0o6OdnZiXlYSAdmtnbG5xbnJqb2tkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVFJOTk5SV1haWVlYXFxdYWp9d3xyhYuEjoeViJOSl5qYnqibn6umpqyeqJmgppyTj5+jmpeXhoWSm6SQlaOdlpaWiKKbm5OMjoqQmqWnnJWVl5uRkoeUjouBjI2AkIuSkpKhmqCilpSYmJWippqNmaSnqaehoLSyqLO4oZyjt6ypraSzsqa1u7WrrLGjinpzbl5OUVFNT0ROTk5QS0ZOTkpKTk5RSU1KQUhMSEhDPjk1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLexpaekqqWgqaaks6qissO1tbKzxsa2usPKzMazrLm9tLjAr66psJ6mrruvraCam56VlYh8hG5fX2ZycHZxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYWl1hbm9zbYGFf4V+j4KNiZOQkp2hjpqco6KkmKWWopyVjYiZmoxzjYN+jpeWhpKakJSOjnuZj52MgomAipigo56Qk5iWhY6DlH5+dIqOepCIk5CQnZuampKWkJ2Oo6OOiZqgoaSkm6K0r6ywrZ+YprimpbChsa6csbyqqa+qmYN4dGRWTVJQUE1DU05MUE1CUFFISU5TTUhKSkRLTUZLSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0wMjc2NDc4OTo6NjU6ODdBN3i3oaO0qKalqKOlpaamprKnprTBuK+0sMnEt7nBzsa+s6y6waytxK2ooqaSnaa3raOgkJaXkpB+eH9mV1ZfZ2ZpZ2huY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkhOVFNTVFVVV1lbXWlpb2p8gnpyTVdxjoGWhYycl4uTkZ+YnZWUlpSPloqAlIlfO1ZvfIyUioCMkoyQhoZzi4WXgXmBe4aUnZWDlY6RkIOGfZN4cXCGjX2JgZCOkJeamZOLkIqciJ+YiIiWnpqhoJenrqmtqKielq2zoqaumaysmKi0o6mto5N/dG5gW05TUldMRFRKUE1MRk5PSUVMUU1LT0pJTVBGSUo9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqmgpqmno6qwqKe0wbmwtbDHwrezvc+/ua+utcKnqsSqop2Yg5ScsaOamIeUkIuHfnN2XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNTlFNS0lGSE5RUU1PUlRWWFpga2xmeH9yT0E/f5WRkHyIlIyEio2bjpaViZKIhpWHeYl/YEpRbniLkoR+hI2LhYB/bX9/lHd1dniEjZpwUY2IioZ8fniUdmh3hoh+ioiVi46Rk5eMhIqIlISbjYOEkpuWnp2UpKKoqaWknpuwqqGkpJKmqpaiqpyhpqiJdm5nXlxIUVFTTUlVTVNJTEtPSUhGSk5MTVRLUVFPR0pEPTc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aco6edn6Guoaeopaeor6yqtry2uLezwbu2qLnIuLaoqLW2qrK8p56VjX+JlKmWlYt/joOCfnhxb1hNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERENJTk9oWU5RU1RWWm6CcXR8aGdbU4+JlIhzfoaBfIWMk4KSmYuPe4aPgHaAeHNvdXF0jo6Ben6Kq4V6emh2e45wcm14gYuNknh7gHuAd3NzknhndYWEhIV8lYqIio2LgH+Ei42AlIR8gI+YlJyWkZ+dqZ6foZ2gqaWenZiNp6SToJ+Wnp+kgXNpYl1dSldQUkdLWFJPSk1MUkpKSkxQSExRTFJUTUZJQjw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqqWtq7Cxqr20sru4trq0sZ+3urKqnZ2sqaiyr6KakY2UgY6cjpF/doZ3fHZvb2pZS0hISEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedIJ7d2V1i5WYjY58Z3iAdnh/iZB9hJiSgHGHj3x3e29rfq19dJCLf3qGkoB8f3RmdnyGbG9oc3yKjYeAbXlxfXFtdo9xaHGBfo5wRIuFgoOFf3d3eoyGfYx7dX2Oko+Yi5Kam6OWmZ2anZ6hnJaNi6Wbjp2XjpaYkHhvbmdjW1hYVVFKU1VUT1BOUFZLTktPT0pST0hOUExGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagprCsrquoqbGvsau8uKy7vrizrKebsKesm4+WnaWppKGYmY+FknmJj4uLdnF8bXVwam1qWEtGR0VBQENESExMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOT1FUWF1lcHFrh6aqwH50eGJ7d257eYiQeXyLhm9tjJJ5dHlqaoCCcZaRjIF9lX9JkpluaHd+gm1qZGx5hZCShmtybHxucnyGaW1wf3ONiYWGe35/e3dwdHSGgnmBeXB8jouKk4OWl5iakJOWlpmXnZaMg4mfkouSjYaQl4Bvam9vb1lWWFRSUVlPUlRUUlhVTU5ITUtNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5ibn6Str6Ktqqi1r66stL+rvMO/paKalaSYno2Ei5ShoZiZkZOLc456gIaMhnRvdGtwbGRsallOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUlZaUVlcX6eHYZlocnlkfm9sf3qLiXaCiIZ0bJqSdHR8amqdjk15hZOJhI5mMXaHc2x+foN0ZmV1f4SEhYBmaWx1a3CAfGhxcXxuk42Pe3R+fXFxbnVtgn93eXVqeYiCiImDlpKSkIuNkZSUjpeNgHmIl4iHioaAkIh4bGtwaGVYUlpYWVlbTVBVVllYTklIRUpKSEdDQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW6SiJqQmZajqK2esZ6nuq+rsrDCsbvDx5qWj5SZi46FeoSQmJSNkIyPhnGHgnSHjIZ5cHJwb29kcWdfVEZJQz48Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FVTEFJUUlir7KfcXp3a3xscYKBhYF6hIaGeXKglXR4gHN1lIc1cZ2onY6hoYSihXZwh3yHfHOLrY2JgWhnYmpucm1wg3Vpb1h1cI6bkXZtf3t9bXJucIB7c3ZuYnWDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY57c3FxbWBbXV5cWllhX1JOW1pYV0tISkZJRz9DQUJHP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJWRnaSnnq+VpbSprrCuwbK7wcWWkIyUj4CIfG6BkJKJg4qHj4Z1goRslYiIe3R4eG13bndkal5JUEc9Pzc0NDk7Ozs9PkBCRUhMTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVFTREuGdX98e3V+bHaIiHx9hIN/jH51opp6foaBhJmEmpxhhqqfnYqDkI56d4l+iYiOc4qXj4R7XWRxdHp8d4ptaGpieW+FkIJ6b4F4dYV6cHR6eGtuaV12hn2HfIeGjn+KkpeDjYWMhn1xhH+EfXZ3e3yJeHF0dWZnYFtbXlNcZ15XUFRYW1VHSkpFS0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4in+TjJGcnZ+mkaCqoLGor8Cyu8W6lo6RlId7hnZrf4yRgn2Kg46MeIOAc6CEinx8gX9wgX16aHZsUlhMQEUyMTEzNjY2ODg6PD5BRUdGR0pLTU9RUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1FMS1RdWVJLaIOIe4l5e3F8j4x6fImHfpeHdqGaiIePkpSlja2pSIaur66LgYCTioKLgoSSqYeAmJiKnHRtfIGGh36OaGdoeX9uhYeChXGEhkhsgHdyeXZobWtfdn2CiH+HhIt5lJybiYuIkX96dYp2fHhtb3d+gHV1c21cXl5bY2NYZ2ZcVFBQV1lQRExLRk9JQ0ZDQ0BAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkY6Wl5KWoJ6soKa4r7O9s5eNkouYi310cH6Jkn59jIOSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTI0NjY4Oj0+P0JFR0hKTU5RU1RVVFRWVVNRT0dDPzgwLCOHWz8/ODQuXZZwc6NVRklLTU1QV2BYcFlcXmmMk4aUgISBhZGSfoWIkYCalYKhoZiVm5qmrZOZu7Gnu8fDqIuMoaWPlImBkXxxg56fkZ1/d4WFi5CHkGlocISBdIyHhIpyhoJ3h397doR8bnZ1Zn+UjoeIiIeIh6CqopaJjpd/eoGIenlwZ2t4f3t/dWxlXltbXmpeYmdgWk9MTldSUUlQSkROR0NKRENBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmd4N6f4x/gZCOipqbpJ2hrKarr7CXkZGEoZSEeHd/jJR8fpKGkpV/ioCSm46DgIGMioKJjYN/ioBtcGpdQkA0LS0vLy4uMDIyMzQ3Nzg7PT9CREhJTlFSU1JTU1RSUE9IREI8ODcvOUM+PDw2My5sk5dNUEhJTExLTlZgY39mZ210m5qOmZKSio2OmYiSj52LoKCSo6qlpKyTqbaiqMHCrseveLqUmnyNoZ6ZhJOFgo6hn5SZkYWKhY+ZkZZscHWKjIKWjI2Od4+EcW2FgYqWkYOFiHGIoJWGkomNj5aktKmbjJSig4eSg31/a2pqfIGCg3VjXmRgW2dsXWxsXldLSE5SUU1MTEZJUENETUZCQ0VGQj05OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcXaShn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReX+SiJGSfYqEmJKQgoCAi4yJhpCHhYmFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5PUlRQUFFTUU5QSUVEPjs8OkRGPz48NzUyPD9SNUhISExMTU5SXm6KfHOBfZ+cm6eloZmhl6KUnJ6onqirn6isqaq2l6u/q7bIyLfI0M++m6Bwaaupn4STkoWcoJqbmaaSkYiVopubeHp+lJiTopOXl4GUnnt3lZKrsomNl598lJ2bjZKVmKOhprWvnJCYqIeWj42AiGxzc32BfXNpYF5iYGJoZGBnZlxSRUpLUE9JSUxGRk1DSExGR0NCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfGF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjHyKho+QjoGCgImLioSShYOGiYGAhnZeYlA0NjAtMS8sLjAvLy8uLjAwMTU+QUFNUVJUUVJTVFJOU0xFRUA8Pj1GR0BBQDg2NjI8OTtGSEdJSk5PUVlthY93lIqipqm0vLikrayspqi0q7C2srGtu7Gzvpyzw6u6ycu3w7+4paKws6ytqqOLlpiFpqago5eBppmNoquopYiFlKShoKuhpKiPnLGLlaOmt7qboKKwkqKdop2Qo6Grr6yytaKUpKqImYiSiZV5en6GgGliaV1mY15kZF5nZ19bT0NJSFNORkhMRkpHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGJXaW9YeoV2gZOFiIKbg5KQjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkI6DhIGLhYaIkoaChImHiIeHcW5hQEU2NDwzLzExMC0sKy0xLi00P0NBTVVRUlNVVVZVTltQR0hFPD4+RkhDRUE3Ozw1Qzs9RktJR0hRT1BXgZKfhK2jsqmxwMbCqrPFtquzv7O4vra/tMG2u7qjuMWotsnHtb65tKijtK2wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqa62u7K6rLC1orGrsbW7t7WutKCnqKOnmqmvrLK5t7imm7apjKSOkZOfhniBhXdaY2VXZ2NiZGBhZ2BbVEpERExVUUhJSkRJR0VBQEBLREJNRzw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtZUWJjV3l1cIGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomIeYaAjJKMh4SBjn+BiY+HgIaIhYqHkXp4bl1WQEVOPDY6NTZBQjc2NC8vNkNIQlFcUFFVV1VcVlBfVUlLS0E/PkdLRkZEOz5AN0Q3P0JKSkVGVlNQXo+kraOxtMK1t8HLyLW7xL2zs8C2uMG1v6+3dLGzpbrEpLDGubGzsbSopLW2qrGgopebopKlsK6mraunpJigrLS7oqiyurW8v8y/xcW9vbPBt7m3vre6t7msrLClsKmtvbC8usLBq5i5p5StjpeXqoh+g35sWGRiWWtmamZXXGNZVlNJR0ZMUUdDSElBSEQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxRVlNZVVp2am9+joSAjYRuenN4h2K5oZmjiZSUlpKUk42PlpKHhnuGgY2VioCEgYp6fIuHhn2KgoGLhJV9d3p1ZVBcZEdFTDtRY2FbXlNGPztIUEVaY1JSWVhaZ1lUYGBMU1BFQT9JSkhFRUFARDxFNkI+SEdKTFNaVF2Trri0urjIv7m9ycy7u8C7t7W7ura9tLqxxmB1sqSxmp6rvamlqKuqpKKytaCrqJ6Vlp+Zn66lp6aln6SToqextKeysr22wb7TycnTxsPFzMLKw8C+vb67vLe0r7i3tsO5xb3Cx6+euamhq46kqLWIgYFzYGNjX1hjYGpnUlhgVlJVSUVFTktAPkdEPUtBPUJAPUY+O0hBNzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+MhI9zbHJyc4fVwLWZoI2VmJmRjpeSlpaOhod9hoOMlop+g3+DeHuLg4d8i3mBioKXfnR9emtmcHVZXVxQZWRiYGVkXVtYV1xNZG1VUm1tX25fWGdkVVlVSkRCS0tIRkhISEhCSTpEP0hLVFRWXFpbkrnAuL22xb+6uMnKura5tbe5sre1s662tphkdaicrXBeoqycmKCim6SeqqWUn6CQk46WmZennqagnpqZg6SerKWqsK24sL251NHP1tDKzNLMz87Kxr++wsq9wbzBwMTExcq+yM6zpLuwtK+aq7i7mH97bV5hXVpfYlpkY1BbYFNQS0NBRUZFPEBFPkFIQUBEPTpFPj1KPzM3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRXFloX2+WkZCUbmxvdHWHs6ugoZ+LmZyZjIyVkZuShYqKfoiHjJCLiXyBg3N7ioOFe4l0goqGlX9ze3lsbXV7aHJlaWxpZ2ppaGBmaWlsWm1zlq2kvIiGZ1tvaF1aWlRIS05PSktQS1NRSExBSkZKT19eYmdpYZe3x7C4srq9tbHExrWvuLCwu6uysaert6uMtqedmqeaTpqdjI6flpGmmKWVipOTiJCJj5GRnZuhl5qVloeemqebrK+osKi0tNTV1dbTzNDT1c3Tz83FwsnQvsnJysnRx8zNwtDRt6/DvMS5pbW6wqKDcGVeXl9ZYVhaZlpRXVhPUEJCSEVCSDtBQz5BRz8/QTc7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlSZVZzkJCYgmhxb3l5g6CpnqaXjJqbl4uNlZGajn2Ji4SNioqLkId8hIJwf4eBhnuHcoOSi459cXh1bHF4fnF6bnhzbGmBcG1jam1weGl3fH7Lv8Hfp21jeG5jW2FgSlBSVU5ZXlBdXE5QTlRRVVRcbm12gnGWrbistKawtaqsvL+wq7SmpLimq66gq7SjjrGumpeYjJGTkYSOm4GNppGciYOLhIqJhIuElJWXl5ObkJyYmZqfnquspaiirK3P0tXSzszS1NTQ1NHOyMPU0cfN0tPT18zR0cXS1sXAzsfHwqi+t86ee3BnX2ReWGFTXlpQUVRRT0g+QEZBQkU8QEE+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU5adYaFindsd299fn+hnp6hjIyYk5OLjJKPloR5hY+QjYqJh5GGfoF7cn5/gYd6hHWFk5CIf292cmtzfXt2e3OBeHJqgHNyaW9xenlxer7Lmn6MsoR2coR2aGFrXUNaWltWZWNZZGpUWFxdYGReY3d6fouBmKmjpKGfoKilqrC4qqWzo6GtoqOtoaexn4immpOSkYmRjoiBk4lqlKKMmYSBhn6Rg4OTl62LlY2Umo6Gk5Gel6ewoaGhpaSpyM3PyMLM0dTS1NLO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsw8LLjHRwZWJhWVVaVFxQS0dJSkpAOzo7REFEPEJDPkdCPkJCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnJSdlIWLlYmPioiNh45/eIOTmIqMiIiLiH6CeHN7fYOHd396hpGVf4Nud3BtdX92eH10hXx5bId2dG59doR0eHudtYw7QYvFpX6MfGllV0lDZmNlY2dqY253W15maGtuaW6Ag4iQi5ydoJ2Ql5ieo6OlsaOjsp+hpZ2gqKCjsZyFnpKSkpCKjouGg4+EfpybjI2ChIV6lH+CqZWjjJGKl5KLfpiLmpKrs5ibnKicp73Dxrm2xs7S0NLQy9LLydTO0NXa19fY1NnYzdjbzsnZ2tHWvsvLtXp4cGZeW1NXUltWRkdKSUVFPTo3OkBAQjpGRD9EQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxc4WNfJeQnYt/h5KDiYaFiYGHfHiFlpaIjoOHhYZ6hHlxenuDhnV6hY6NnHmLcHxvb3p/cXuBcYOHgG6OenR3fXyCdX57hoevc1ipwraNkYJwbmI9XmhycHFwbnh2gWVob3J1eHF6i4aOk5GblZ+Vh4yTm6CanqmeoKyboZqZn6Wen6uZi5qMkJGNhH2Ih4OFi46gmZOIg4d+bJl6hJmGiJOMjZSMhnyciZSPrqqUlpifmaevtr2prb7Hy8nJzMvPycTSytTX2dfY19Xb19PZ29XQ29rR1sjUy5Z7fWpqXFtRVFRfSENGSUg+QT49Nzo9Pzs9Rz0/QUFBREE+Pjo4NkRCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw5OUQ/Q0dSal5tZGJma3aAiHGRj5qAeoCNfoKCgYN+g3t8hJiNh4t+hYaAdoJ5bnt7hoF0epKejaB2jnWCdHWBfXOAhG+BkIJvkoR1fIGFenaGe4i3xaTBybiBlpqPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aUlY+XkYSJj5aZl5alnJeflp6TkpeinZmrlZCQiYyRgoyFiIiBhpCRnpuZiIWMgYWXeoiJn5eQiI2Ki4J9oYqRi7ygmJOXmZ2ppqaun6i2v8DAucfJzc7FzcrR1tXV2dXX29TX2drb19va2tjO28aIfXtpa2diVVhWVk5MRE1COz09PDg6PD44PUA2PT9APT8+PDk4NjdEQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9YZWFdW2h0enlsiYySd3Z6int+gH5/fIR6fYKRiYSFeoSHenV9dG18fYZ+dH+SnpGeg5F8hn54j354iopugpqAdJmGfoGJhXx9kHqPqY6Pw6G9i5yjnH2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJKFiYuQkpSOnJmSlJCWjYyVn5yUoJSRjY2Pi36Qjo6LhImSlpqen4mMlJGdkYKLf6WZiISNgoWEgKWHiou4mJ2RlZaiqKGenp2kr7e6tazAxsrQyMfMz9PT0tjT1dfA19jZ29ja2tnZ19u5e3t6bWtnWWJcVFBPSUNMQTw8Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODY4OT89RFJTUlheVVhmbW1taYGOinFzeYp7en98f3uHenx7i4aCfXSDhXlyenNtgH6EfneFnKGanZSSgIyIf5iHgJyRboeohXqgi3yRjYOIhJt9mpCKjKOioJCkrp+KkIuFi4GThldyrYufq5uPg5ibj4+OXIKikYKMn5OVjIeIjJKTi5SUk46Lj4qHlpucj5SWkIqSk4aAi4iSjYqKnJaZoqKGk52WoIqJiI2ckIOIjn+Dh4WkhoyQs5idkpWXoaGfmZKcnaiyuaymvcHHzcjGz83QzM/X0dHVrtbV2NrY2trX1dnZoHJ/d2loX15ZVFhZQ0FIQz8+Pjo0OTo7Nzo7OzM7Oz89Pjc7OToxOkg+OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J5bWF+kYNvbXeLeHl/eoF8hXt7doWEf3NwhIF6dXZ2dISDhX5/kqakn6WiloqdkJSXi4qol3OKsY2Ep5KEmZOFmYyilZ+Yk4ianqOSqa+fkZSQjY6IloxujbeFmsTIsZuhpZucmJaQspFkpM3Ilo+Gh4iPko2NkpOJhYqJhZaZmo+PlJOGlJeDf4+LmYiNkKqWl6OjiJmflpqIjoaWl4qEjo2Bf4iPpImNk6ial5OXmaGZn5mTnZujs7Smo7zBvsfFxcnIycLL083N1KnS0dbW1tja1NPazoR1gmtmYGBfUEtWXEJCRkM7QT04Mzc7PDo4PTY0OTo8OjgyPzk5MjpJOj02N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRKUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJkg0d1go59fG19iHh6fnqBgYJ+dnaAgntsbop+eXx3eHyEh4t+i6OzqKSrsqGWp6ClpJaVr6KDkLiVkrOZjaGgjKSbr6KknZiQp5epma2vpJeUlZSQi5ialqDAjqPJuKuaoqWtmZGbnLKdhoWoop2YhYiIjpWMi5OPh4GGh4iSmJSMipOThpSYhoORkJx0kZmylZakoYicmpOPipCKl5qJipaNhn2MmJ6KkI+cmpmTmZiflKCdlZ+bobGuo6S3vrPFx8S9w8O/xs7KydKnz83T0dDW2NLP2Lx1fHhfYldiWFJJS09FQkNENT46NzY6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER01bXFlJaGE7SISKentthYZ5fIR4gIWAfXB4fH18b3OMen2Ce3iFi4mGg5KovK2psr2vpa6zs6mjorCsipq1naK4pZWtpJeprbempKOfmamYqqSvsKmamZuUlZGYoJeZu7utyaFptreqsJWYnqKrkpe9o16psoKJioyUh5F8jo59g4aNj5SUiIeSlouPlY2LjJeZkp2atJaVq56LnJSSjZCSi5iaipKdj4uJlZ+hjZWNl5mdk5yYnpWioJScnaWvqKGls7irwsjEtru9vMXIyMLQocbJzc3E19bQytOjc31rX1xVYVNRR0Q+PENBQjg/ODc0PkY8PDY8MzUzNTU0NTRCMzk6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZkhhYGJwSUCLiX+AcoaHfIGJdYKKgn5tfX18fnB3h3eNgYd7jY+Mhoyaq8PAsL3Gu7O0wby0rKuzt4yosq2tvaubuqSorbm3qqamoaKjo6qvsrGqnZyjmJuYl56ipaWSo7muqMC7rK2yuaWkp32Ihpytva+Ci4uKkIOOg5GOeoGHkI2OnIiIj5eNipSXlJCal52nmrCakaudjpqPko6VkI+Vl46RoJCIlJujrJWWj5ScnpSgnpuYoKGUmp6np6SipLCzpsHGw7Cwu7bFxMO/zafHw8fDvNbQzMTKinZ1ZF9cYl1PS0NMQEVGPkE/QTw6ND5BPT01PTY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGhGX2lnWl1ck4yMiHuHi4aDjHWGkIqBbn57gX5xfoF6lXqSlJSYkZOVqLTHycDCzMHDuse8uq+rubuXsra6s8CupcCkq7C8vKquq6Kinqesr7WwqpugqpyinJafsLSni6K6urXBu6uonLKkpKiUhI6pxMOkgouOh4iEhpWUjHmDjJGPkqGMjJSRj4iXoJeSmZWXpqCunIyqnI6Wj5KRlZWOkJWRj6GThpefoLKflJuUoKGZpJ+aoJyglJiepqSmp6SvraW/xMKuqbe1ycO+ts6yxL7Du7PRycfBtXd7b19aXmxUTklETUtLSUBBPUJEPDVBRDs6Mz04QjMzMjI2MkEwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmdcTWVcZlRjapmNl4mLiJKPhol5hpOQgXJ/e41+d4eBgpB6jaGWqJqamLu+ycjKwtLJysLNvMGzrbu/p7q/vrzEuKzBqayzu72qsKqkpaOsrrSttrWgoK6fpaKYo7S8qZuovMGjtbavq5KvrKqrloaaqaelkYKMk6SVioB1iZJ5hY2RkJ6gko6Ui4+MlKOZlpuUlKOeqZ+RpZqMj4+QlZaIfY+VkpKjmpWgopy1ppCfl6Wko6WfnqaYnpWXnKWjqKiisq2ou8DEr6Wzt8zAua7Ds7u+wbitwsLCv5lwe2NbWF5cTU1OSkdEREhCQkFDSzo0REg6OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5sSV9YYVpkZFeekJ2Nl46ekomKf4ifkoR4hX+Vfn+QiIqQgJWgma6no5jDvsnEyMbSzc7Ny7zCt7C6vbS8y7vDwba3vK2zwLm8rq+ooamotq2uqbK3mp6soqehnau3t6mlr77Esb25s6eps7OtrpaVpa2ooJGOkrHFp5WNfZGVfYeRmI+qmZiTk46TlZOlnpOdmZOhoqGcmJ+Yi4yPj56IWpCWl5KWpZllmKOes6WWoparraunnJ+nl5iWmJWhpKinn7asqbq8w7WmtLXLwbiqtqyzu7iuqLi6vLeEbnBcWlZXUEdLU01LP0FIRERIRkY4NUZNOz43PkFKLjMyMDI1QjU1UFdOO0xGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhWPD5AQkZCc0ZpSVJlY0xGpZSclaGXqJaMkIOHpZKIgYeCm4SDlZCRlI6aop+vvq6hx77GxcjHzs7O0sq+u7axuru8v8+1xL23ubeysrazt7Ospp2rq7irqaivsJejrqSnpKW0wbCrrLO+wrnAubOnuLS3s6+VpK2wrqSLk5WhjXPBmX2WmYSOlpmLsZWampWSkpmZpqOVoJuWmqmcm6GgmYqMj5WcYEqWnJqUmqWXVJawn6+cn6WUr6+tppuhppSTmZmOnaCnopm0qaqzvby7q7Cyx8C4pqyrrbKxo6GysrSlc3FnXlxQUk1FUVFQUTtIS0lGR0FDPTlLVD9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oWDw6QkNAPVJFV1NzYlZGSKuXmZ+hqK6YkJeHiqeWjoiShZ+IhJyXj56gm6Oltcm0qca8w8TIy8nIzM7Hvrqzrrm5wMHNtci7wbm1urGvr7K0p6ObqrS0q6mmrayZpK6lpaisusCoq7a2v8HAv7iyssOwt72ro660rbmliJuXppt2vp+EmJyOkpiai66WoZybl5San6GpnqigmpuqmaGnnpeQjZCdg211k6KalZyin5CusqOrlamqmKuvpaWgpaqTkpmciZWcop6Wsaapq7q3vbOyrr65tqCjp6mlppycrKmpjWZoYmBTTE1HSE5KVUw9TURNSUpBQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc8Oj0uLlNhTVZIfmVeSEaslZyhn7uumJSei5Oqm5GRk4mqjYahnoyjrJSkpLbHvbTBu8LDyMnFws7Iwr25sq+5tMDCyrbGscG8tburqa2ssKOjmaq0uqaqp6yqnaivp6Srq768qK28tLi+xry2tbjAsL2/s6m1tqu+pI+il5Ghn7ueiZqgmZednY+2nqmcpaObnKGap6WzopuepZyoqp2YlY+Um4uWiYykoZScop6hta+lppOxq5qrrZ+fpaSqkZaVoISQnp+clqmkoaG0tLq1rai1srKenKOmmpeVmaqhnnhjX2FfTElHSE1RSU1ERkZBUUtJQURHQVZSREg8QUdRMTtCNzpCRjc5XVlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdFqJeknp7DrJuXpJeZqJuVmpqPqpaVqKaVrayZoqq2xcG8v7jBw8HIxL/Nxru+ubKwuLS/w8i1v7C8t7q3p6Srq6yhoZurqsSipamspp6rr6yiqqi/uKasvbC3t8a2tLm4vrC+wba0srSvvaOWo5WSm5Otn5ChoaSio56QvqSpnamsnZ2gm6afvaKYo56iqaugnZaNlZ6TnoeOhI2TnqShnbWsppyWsqaZsKmgm6ufoY2alZ+EjqGam5KlpJqYq7G1saqlqq2snJigoZKOkJWon5RpZVtiXlBKSEtPTEhFQ0lAPU9IQDtHSUhbUk9LPUhOVTRCRTg+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZmNXTaKbpJuexauhn6udnK2fkqKelqWgpqmsl7axo6qztsXCvcC2wMK8ycK/ysi2uLW1sbS0t8LGt76xuLW6tqCnraqrnZ6fpaTBpaCprqCkqa2voqaovbWlsbu3trXDsrO3ur6xw8C4uK60tLSjnKSUkZOgrJ+YoZ2oqKqimsKtqZ2srZubnpimoL2hnaSYq6urpqCZjZmfkp6Ijlh/lp6moaC4qqaUmLajnrKioZywmKCPmpSego+gl5aOoqOVkKWus6upoqKlpZWVnJmLj5GTpJ+JY2dcZWFNSktLT0ZFQUZLPj1JQTk5SkpOXVFRST1MVlw4Rkk9RE1JOEhjXEtDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YVM2U1prV3NIRTY9dWVcTE+eoKGYnsOnpaKzoJyyp5Oqo5+jn6yprJ27samstbHIw8HDs8LEvsfEvcTKvbCwtq6xta/AxbW6sbC6tq2aqbCpqZuepqGowq2brLGcqqKusKmkp723pra6va+3w62zs8K/scazurertLauqqKmlZWUoquhn5+Zp6uvr6+7sqafqamZmZeToqS4oaGjkq6vq6SlnpKhnpSdjpCNlJ2ao5+ntKenjZi0nKOvm5+cr5GglJiUmoCSopaPjqCgk4umrLClp6KdoJ6SkpqUhYuSjZyfgGRoXWhmS0pMS1NCQ0BJRzs7Rj44OU5NVV5SU0o+T15dPUhQQk1MSThOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8d11eP1tVX2ZyQDg8SJZ3ZUE0n6Sfm5/CqKOpsaCjtKmVsqumoqSyrK2pu7KtsLS0xr/ExLW/xL7KxbbAycK1q7WpsbiswMW0uK6ttrqlmauyq6qYoaeXrbu1m6iwm62frrSyp6q6s6e5s7iyuMCquLLCvbTFp76urbe1qaesoZaWkaWkoaGXl6Sut62ytbafnqikmZSVk6Ogt6OkpZWusbKlqaShnpqZmpWYqJ+emKKfr7Kip42Xr5ilq5ibn6aSnY+VmJqGlqCVjJCdnpSLqamqoqehmZ2WjI+ZkIGGlomVn3plal1sa09RTk5UPUJBTkM7Okk/NzdRTl1fUlZRQVdgXEJKU0hWS0g6VGRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzkwNnBbYkgwNUpxalZDV0aMeWZDO6SknKGlv6aorq6gqLWqnbivq6SqtLexsLi3sLe4t8W9w8e9vMTCx8G5wcbBuqq2pa27rcHDt7iqrbK8o5WtsK2yl6aokaq5qqGnsJ2rn6+0s6qqt7Wsu6uzsrm3rLiwwbq9v6bDqrC2rqmqq6admJiqoaGgkZegsK6zq7C5mZupn5mWkpemoLeppaKir7Gzq7Gnq6CcoJ+bnqWdoJedpLSwm5+QlKaaoKmblqSgl5mLlpmUlpedlImSm5mUjqmpp6CjnJibk4ePmYt+jJeGj5psam1ibm5YUVFaVEFDRVVAOztIQDc6WFBkXlBXV0RZXl5OTFJPX0xKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE3NDdnWWFGKEA4bX1oXFY6iXtjQz2on5yhqbyhqq+qorG3qKW0squhrbW9r7O4vLu9t7bBw7/JxLnFw8DAucW+wbivtqirt7K8v7+0qa+yuJ+XrK2orpioqY6nu5+lrbOfq6KxsLOsqraztbytr7G1rLC1sb+6xbarvK+xt6ysqaKxpZ6kqJ+jlo+Yn7Kqs6mqs5mdp5ualI2gpqS0rqehrKytsaeyq7Gpo5ueqKSelKCZm6m2qZeakpKfmZ6hn5KtoJqZh5aZjJ2anZSLj5aXmpempqOgnpaWl5SBkJWFe4+Tg4yXZ21zaHBzX0dZZlZEQ05YRFo5SEI1Pl1RaFxOWl1HW15dT01SWGRKS0NdY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19eYVYxNTE9YFZfOClDM1lVXGdLNYx6ZkxApJqfpKy2o6yopK6ttamus7imprC4xrawt7/CwrW0usW+zMW5w8G6wLrEuMG5srWsqrq3u7q+tauusbeZmKirq6ucrauPq76eq6+xo6qfsa2yrq61sbi2qq2usae1r7S6vMmyqrW0sbSvrqags5+aqKygpJWVmpmxoq2gpa+WoaSZmZKNoqWmsqmhprGrqrWkrrC0rqOZna2nm5edmZmsuKKXk5CPmJyhmZiUraCelYKUmY6enZqWkYqUk56apaOjoZmXk5KWe4yRhXuNi4OLk2xveW91fGFGYGpaSUhaWz17SkdFNkFiVWlbTVxhSltcWlJTU2JhTEtFYGFgUExJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4rQS9KR1BbRzNjWFRLRZqWn6+osamspaOurrWpt7O3o6y0t8q6tLu7wL+1s7fEwMzHvMS9t7/AwLjAvbK9rqi6ube3wresrrK5lZenrqynpLKqlK+7pKyysqanorGzsLKxtLC3sqmuq7KmuK+1s8TFtqm1tauwramnorafn6axoKSUm5iUsJ6nm5+pjaminZuVl6WlpLanorCzq6exp62vtaykmaGsqJycnZuUqrmclY6Oi5icopiRmKijoJiFk5eRnpyYl5eIlo+Xm6icpKGSlpKQlneEkYZ8hoKEjI1ucXh2fH9dS2VsXEpPZFw/YntHSThHZ1dmW0xeYk1YWVdVWFRpXVBPSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5JZzI3J0ZhTFYlLUIuPUVMUTwzcmtMRESRmaStpKytq6ajsLKyqrewtZ+rtbrJuK7BvMO3s7G1wsPPxMDCvrS9wcC7v7y0xKirurG2t7+9r6y0tJ2hp7GtpaaxpZ6ytayqsrGrqKi0uay0srWss6yqq6isqbmtsbDHv7ikua+pra2mp6ywpaSjrqOpnJ2bmq+ZoqKio5Csn6Ogn6GppqW4pKuztKSqq6isrrauop2jqKqcoJmakqS0mY+JjYeRo6CWjpWfopaVhpCUlJ6bmZaVh5eSlZmnnKCgjZOSjpF4fo6EfX19h4qKcnRzf35+XFJkbl5OWmddRkSWW0c6Tm1YYlpNYWJOVlZWV1RZaF5RUkxkWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQ2U7NipIZEhKKzpJPzNDSVMsPo9rP0hJkJqpqqGpr6Sno7O0sLS1sbCgq629zLquwbzHsbSutMLD0cTFv8GyvsPCvL+4vcWorbettLm8wLCssq6ho6euqqelsaOrsaquqrCurqyrsrqnt7GyqbKpqqWlo626rKqwwrm0rLmoqaitqaewpamkoq6qqKKenKKslaWdl56Yq52hp6ihrKairKy3sLGgqaKfqq2wq52epqepmqOXmJCgqJiGg46Ki5+gkIyOl56SkYeIkZWhnZaYloaWk5OXpZydnYySkI2Kf3+IhH13gIeFh3V0col2bF9ZYG5jUXNyXEs8hHxGP1d1WGBZT2NcTVVWVVdRXGJfVE9PaFhXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSzAuSWdERjg8QjA1RUtYMUCUXUBNRpWWrKehqbGcqKivtay4ta6ppKurvcm7sL64w6+wrbLExM7Ow7+/tMHExLrBtMnErK+4rrO5wL+0rq6spqepsammqLKmtK2qsK2tsa+yrLO6pLizrKytp6ufo56wt6uqrbm2pLW1o6morKyqrKCopqexsaOmpaGhq5aqoZSboKWeo6Kqo6yinqaxt6ysoqWimqmqramdoaWkpJmfmZWPmJ2TgYKQiYWdoI2Lj42bkJKMhY6ZpJuSkZuLk5GRlKOam5qLj4uLfIeBgoJ7dYGEgX51eIujh3hrXmBuZ1dmh2ROQGeSTERieldiWFJlVU1WVVVUT1xdYlZLTmlXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREhkJJSESWkK+koqmvmKmorbWqtrCqpKupqbzBwLi5tLy1prKvxMrL0b/Bu7jAwMK6wbrCxK6xtrK0u8G+s7KvraysqLeqpq2wq7iup7CwrrGrtaq1tqe1t6uspKmqnKOes7OoqKSztJ+1raGpqKuoq6afq6uoubapqqmpoamfrZuRqaGdoKOipqKqnZumtK6npamio5elpqapnKKjo5+ZmJ+Rjo+YjX6HjIeFnp6IhYuLj5CSjYWHlqOajo2akZKQjpKfl5mWjYuEf3SHgX9+eHWDgHp4foCInY9wcmdncXhcYXSIaU9dmFZIbXlVZFZSYk9MVlRVUU9YW2JWSFBqVFZUR1BZVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDI/Zj1OWD9DLD9MVF8vSWs3UkY7lY2voKWprJmqpK2usrSvqqWvqam7vrvBsbC5raK2r8nHyNDAv726vMO9u8PBwL+vsrOytr28wbGys6uzqaW1qKSss7K4r6KttLGvsbmquK6qr7erqp6pq6CjobWtqaGer7KhtaqeqKeqo6qhoaytqL2vq66soaenn6uZj6+imKKgqKaep5uYqbCoop+soaGSoaKippiZqKWYmJidj4qHlIh8jYaEhaSWhoOCjIeQj5GFhpShlomRnZCTkI2RnJSXj4qGhnh0gX99dHh6gXt0dHtqgoijdmleZWyBdWeIi3xSV3BeS3hzVGRTUV9NTVNaZ05NV1llWUdTalJRPkJOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaDozOF89YWQ/RjFDUFtbK0hQO1lDNI+OsZ+kpaqjpaOsprSzsKmksKequL7BvLCouaqnrrDJxsjQwr3Avrm/v73JvMK5sbC1srq8ucCztLytuayjtaanrLG2uLKmp7q1rbS8r7ulra21qq2cqa+kn6WsqqecnaqypLSpmqqnqqSpnaKoqKm9q7OwrZ2po6CunJqyopakm6Skn6SamaeqpZ6aqaGbkZugpJ2YlqipkZmZkpCLgo+FfY+Cf4iej4eAfoyIkpCQhYGUm5SGk6KMk5GLkZqSlYeJfoByenh+fGh3fHt1cXJ+aYZ6hIhkYGhjcoV7bWd5XV5WQ1h7bVRhUFJZS0tNcHRdSVpbZ1pFVmdPQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOkrCZn56ppKOhqqS2srGkqbGnrbnBvbawpLmsqKiww8nIzMG3vb+1uMG6yLbEtrSztbK9ubq9tq65tr+torOmqquutbe0qZy6u6ixv7K6oK60taisnq6xo5ylp6mjnZykr6avoZ+rqaehqZyjqKCtu6eusa6hqqKjrZ6erKaYn5uhopufmpmiqqKamqOjlZaTnqGWm5WlrIuekY+RjIKKf3+PgHqalIyJfX+Mh5CPjIqGk5iRh5SjiZGRh5CZkJOBiHx5bH12eXhie3pycHFzeGqCdWqDZ2NoYW5zjm1iaXBgb0JdeWtWXk5RUUtJTVNZVk1cXm1XRVhhT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNSXT0jkZesmJ+XpqOhn6ejt6+toq+wqau5wrqzraC5r6uns7rHysi/t8G+r7S+t8S2w7KwurGywLa7vrequbi9qqS0pqiqr624sKiYuLyjrb60s6Gut7Smpqews6CepKWnoaSZnqyoqJ6gqq+noKaXoqifsLifo7GvoauhraSbpqapmpqbnqKVnJuZnammlpueqJCXkpidk5mWoamQmomNj4d9h36CjXx7oYyNiHmEjYWKjY2FiZOajomVn4iQlYKMlo2RfYR7c3B8cXN0YHl4am9wcXBqf3NkemxoZWRiZoeAYFtyanFNToBpWFpNUUxLSFBSUUhNXF9vVEVZWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXVs1KJWbpZiclayfnqGkobersKOztKmpusW2sq6guK2urLC1xcfAtr/CubC0vbe/u76wrL6ws7+yvcK5qru6uKeotainq6+rs6+lmLu2pKu6ta6esLiuqaWnr7KcoaSgpKShlpuvpqGfo6ivoaCik6Okobewoaawq5+ro6+Xm6qlqJ+Ymp2jk5qbmZylqZmbm6SUlJeVnI6Tl6KooZCJio+GeoN9g4p5jpeKjYd6goiEiY2PhY+TmIyOlpmKjpZ+hZeMj3qAenBxdm5vdF94d2VtbGxqaoRvZnJpa2ZoXmR0gWBba3ZpWkp/XlxYT09LSEhSVUczOV1ebFFFWVVZZU1ISUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVV1oRC48MmRXLDKUoaGXlJuqnKShoqC3qq6gu7ilrL3Fs7Cuo7WwrKyutMPDvLO/urexs7m4uri7r67As7S5sL/AuK29urWlorKpp6myqq2xn5m/taSntbWonbK8qKelqa+smaOnnKSllJihsaWZn6OoqZyin5Kkn6O4qKSnraadpaGokp+ooqGhmZucn5Gam5afoambmpiglJCTlpmNk5Ojp6SQiYmOhnmEeoSFfJ2NiYqHeoGEh4mJkoWWk5KLkJWTjI2Ue4KXjot3fntsdHFsbHNhd3VpaWpnZ2+GaGhpY2ZpaWBqY2poXGZ7Y2BTdFRcW1NMSkdJT1NAISpoXmpNRFdVXmBLSUdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnUCcynaKkkI2kppqdnp2jtKynqrq3p6zEwbawrKO2rqeurre/v7yywbewrrK2tri2tq6qvbOusrG9v7euvLuxpJ+2qqWls6iqrZ2cwKqnpa+yqay1u56oqauxpZieqZ2mpJGZpq2imJ6kqaGboZyWn52ntaavqq6hoZ2doZSgpp+hoJqbmZuSmJyTpZyroZeWnJSSjJWXi4+YmqifkYiJioh4hXaBgoGdh4qCiX2AhYiHhpCElpSQjpCRkJGMknuDlY6Gc319Znhva2prZnVza2NnZGR2gWNlZmZmampja3NaX1pdbWRhTmlYWmBWSkdIS01TWD45X2xpSENVVF1bSUhGRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNCaEglNZqjoI+LrKGYl6CWpLOxorK9tqGxxry6sbGktqyqrqm5vLu6rcCyrq6utq6yuLOprLmxr66ztrq2sLi9rKaetaqgn6+jqa6cor+gsaOusK63rbWera6traKanaappZ+Vmqeln5mloqidmp+blJyerK+luqeuoqGamp2ZnqSapJ2Xnpebk5ifkqiVqaeak5qakYuVmY2UlJqopo6NiomOe4F0gYGKmIWHfImJhYWKjIqShJSbk5KPkJGWjpB/gIyOgnCAfmZ5bWhraWZxcmtcaGNjdIFiZmdqbmxnampobl1sbHRwYVRjaWRlWklGTE1PWVFQVmFlgVVBVlNZVEZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJzSRoZuNjrCempOhmamxr5+5v7WgtMK7vbqxpravqK2lt7i3t627rqyqq7aqs7itprO1sq6psLa2sbO1uqapn7WonZ2ooaismqe9mKyjrq+1taysn7Gtr6mim5yiq6iclJympJ2aqqKklpqfnJCbpKqqqbufp6SgmJmZnaGPa6KWmZxwgpWao391kamnnpSUnpCIl5mAloqhkHiGlIyDbWl+doNxbIaLhn2FjIdwXmNhZ4SYhWuLj5SSdHeLhH6Dj39nhoBndWhlV1xoc25OUGpjZ3OFaF9lZm5tal1gYYqPhIRmTktEOUdUZ15KR1BQVVVMSFJhb3RmRltRVVBGSEVDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg9RzYwMS4qLiovNTY4LCMxJzIxNDoxNzVYgWwxNk9rW05cS1tmYj5HMVFkPSoui6OZhZWwm5uSoJuqraqjvcWvqbjCuL28rae2sKWro7ezsrOxua2ppqy0pq+1oqm4traop6y2sq60rbOhqZ+zqp6ho5ulppiruZSlpa+zt62upamtqqyloZ6coKemm5egpaWbm6ennZOfn5iQnqepo7Wvo6KinZaXl5ejiKCOkpmGoIeTnKB/pX+lqp6SkZqRiIRyeI2OhYihdoiMaZeIZn1yeKBviIeEfo59f6GgoJmAfIeedIeOdZuKbIeBg2xoZWN6bHFhU4VtYmxpmHFYanFwiFleaVtsbFuIcW56coVnhoRaXkdOP0dfTUVSVlZRUVJXVWdeTVdJUlJQRkdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcwKIqmloOcq5yZmJ2fqqqnqr/Dr7G6vbfAvqqlt7CprKWytK6vs7eqqaWwraW0s5yttba1pqeos7CtsqeunaqgsqifoqKZoaGarbOTo6SltbymrKerqqyopaGgmJ+mo5mZpaOkmJykqZaUo5yTk6OkpqG3o6Sgo5iVkpeTnIivkJeUiamLlqGbhbGAo6ydk5mdlHmC1KiAh5XBm8d5eLGlt5dkf8Ccv3mEhHmRhHyQkJHKcZe8nMV6crWmu5B7gGyWsauweGhrWLGubmVpvJK8bmd6b3KP2H5Ta2O2sn+BcpV0mqGqkFdPV2JQVk5GVVtYUVBSjVxXXFBBXURRTkVHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGMppKAp6qfl5ydpayyqLHCvbK1v7W3vsGqp7OsrKmnrrOpr7a0p6eltKWnuK+cs7K2q6Wkp7GurrCmqp2npLCjoZ+dlpqenK2rk56in7O6oqqpoa2upaGdmpqhp5+Xm6egn5iep6eRnKealJ2hpqGhsKKfn6OWlpKXkpmFr2tqio2qfmaDlYatZHCcnZSZpZRxrqGkfni7fWuhj3axX2q0W6WAZZyRYGaCe2Z/anhrqWS+cmemjHWxanyxeHSSk2NtbaduW4SgRWhmh5ZFdZxgfmh8pKeCWV+Lq2mAlXh5aqc3Sq9cWFNsZFtLTlhfXFdWO06JUFdXL0lUU0pERUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzAbkKKVgqyopZ2jpKqxt6y1vb+wtsSyt7rBpqmwq66oqbCuo7C6r6OkrbKjqLionrOzsKOloKqtr6yvpqefo6Kwm6KalpWWmpqrpZWboZ6zs6GrnKKtraCdmpegoaicmJ2jn5yZoaakj52imZehn6qepqafmp+hlZWRlpCahbWbtXiFqZm1mXaGs5u3fpOWlqiUfmuBpnuChoiSlJJ3q2drsVureo2GlHSJco+GgH+IkJd4goKLmIuDoI+EsHZ3n3Fra2x8i06kWEhiYpl+Y2imYHlzdlOSh15QqW1jcX6HgGKcLlGhb1tTa2hgTEtbZFhcWkI/snlYWEEjTWhGQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjhhVTUwG5WflYizpqagr6mnsqyqu7bCsLvCrbi2v6qsra2tpq2xqaGuvKqgp7Sso6u1paays6ekop2nqrKosKelnp+frpafmJSVlZedrKCZmaSotK6hqY+pqKqbnZWYoKSnmp6cop+boKOko5WbnpeZnaKom6WZnJyioJaTkZOTnYPVk5m5cLDBfsWGfNaUm7t8mpWkj42cjaR7joejgqWCeqx5j51Wr3qIfp9quVu6d4eEfaaCk3yYeql4jZ2Pe7FujoR0kbyFb5RQr6fFilGgemNgqWJzc4htl4hgU7W0yIaAiXxjpDNCnXZdUGppZFBAWGdaZGFKSE5uTlxST1lmWUNEP0U/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo7REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVE3MSWbopSZsqiopbSqpbSppLy3wrC5wLG1tLqztaexsKKwsqafrbaomqe5raOvsaCztLChpJ6fp6mwqLSopJudnaqWmJeVl5WWoKmcmZanrbCoop+PrKKolp2Wm6GloZihoaGhmqGippueoZ6UmZumn5unlZubn6CYkJGUkZ2Ism5otXGrh26OpnK0c3K2e5qXo4uPnY2jf5GhpX6wdoOR0tJ2XK57hX+kb5uqpmuHhX2tfZeZjnuwcpKdjnizZZZ0hJ5vnmaUUsiLWsJcn3liX61gdnSHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9rYGxoUFVISTk9VlJaV1hJQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFNNjIwoZ2SpbCto6q8raa0pqe2u7yyur+3trO5ubKltLOhsbGin6uwpJemua2ksbCctLiqoKadoamksaisqaSZm5monpWTl5iSkqGmn5aSpaqwpqGVk62fpZKToJukpp+VmqWmoZqin62ZoJ6dkJWboZ2cpZSdlZminpWYlZGbhax7d6h2o42IhqlvrYqCp4OYmKCJkpqKon+TmYmuhX+Cs1xys1KufYKCpH9y2H54hn6PnYaZmXavhomRnId3tGGaZZqCgpRsklqwWEuadZh5ZmCtXnZ3h2iYiGtdr3eVno94bDV5yK6yX0JUb15nYEVQbV9wbVZWTi5lZGlTWFE7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSTo5OZ+elKC5sJa0wq2os6ipsrq3s7i+ubextLu1pLiynrSsn56orJ+Up7WrqLGxq620pJupoJ+oobWmpqmimZ2UpKGTkpuYkZSipJqSj6atr6aglZmpn6KOkaGaqKSglZmlqJ2cpJ6snKGdoI2TnpqdoJiZm5aXoaCTl5CmnoapfX2leKGOjYKqcK2LgaeGlp+giZeXiKOCkYiUqnyAi514b7FaqIKCiKB5dNmAd4h0qIGOm42SpHyWkJ+Ee7JenGSgfoOVbJJcq1tak4CRf2hnqmRye4FrmIdzXaxaiaCOa29lT0pDoVxbTHRdYmdNW2FfcnNfS1Y2SpuUWEdFPUdGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MyPziinpqav6uYtMKuq62ppbSwt7G1vrm5srC2uqi7tJ+wpJ6kp6eek6qwqa+ptayqr6GYoaCmpKS5oqOroJabkKGflJOemZOXnp+PjIuosK+mnZabqKafjJKjl6iqppSWqaeenqCjraOhnqKNlKGYn5+SnpeclZ2hlZaOq5yPrm1ytHOpi3WKp3O0eHOzgJGko5KcjYmkh5B3uG+Me4uiamu2WqGFZZeXaaCip26UcrR0k5h/smqFkoita3WzYZ1mom+Hk2qXXK1fTaF8h5FSc6NseX9+b5iHcVyvVjycd2ZUb24uXKdPY1NrZWJtWmNdYXB7Y1RaUT4+bW8zQ0JAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4ppubnbuhm7LArq2rrKe3qbivtcC0u6+ut7arwLWoqaCbpaShnJGqqae1o7Knrqqgl5ynoKSruZ2jrZuWmY6kopWMnaCbmJyekZKUqrawp5iUnKypl4yTpZmlrKKRlqqyo5+epquwmaGjkJmilqCblpyXoZKcqZyUkKuZh9SSmrtzsMOAw4Z+1ZabuHiIkJiMl4qMp4h6o7Z1fXd2woKasmCDunnAfHW4Y7WBjIepfZWBrKlxe390vIinoGmdYaaOr6J+jHSHqn2+b3O8dLKDdXiBi26aiHFujaR0vV53fVphebxrWlZcanleamFlZ2JteG9ZW1lEQUBzQENGKzVHIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaeanqK8oZeyw7Csqqursae4r7bEsLmwrbmurcCxq6OinqOhm5uQqaOqsqS1pq2lnpaaqpmmrLmdo62YlKCQpZ+SjJyinZidmpGVkq65sqyVl6Onp5SQlqScpKyekKCoq5+bn6ijs5+jpY6noZSimpyXlaOXj6+gkpSpnoSQmLZ/j5GMt5V4gpOatXdta25zb3mQhY+KdJ7Bu72ae4GxqHCAc5G5g3yGhoyHjXyKh42XfKS7ub2cdXq0o3R2l3Z0sHWZnmaGao21dHJxd7aMXn96fYlog3lueWKLrHB1hX9YW6dqRWVaVGZgY15jUWhncW11Qk5QTUQ7Wk0/SjM7MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JXOCpPXl09KzpWVic+OzynnqCiv6WWtMO0rKuorKupuq6wxa60sq22prS4rKmhoaWeoJ2Zk6ukraqmtaenn5uWoKOdrKS+pqGqlpOckKGakY+hp6GTnJeTl5SxtbetmJ2kpKKKkpKlm6Wqm5aopaWcmqGopaekqaGSrZ6Wo56Xl5edno+vqJSbpqGNan1pm6Z4h3J9mY50eWSHe72+wLpvk4NylYdhc2paXpuJYWOIjpVrYICVY22dd2KVa4CalZRlXmBjcJqKaHKLfYWVZ2p+cnR4fX5iW3d0gWhQXG6DfXyLa1hseoJySkpvhnBOdExFV11nYUxaWGdjX09bbnVpclJQREVOO0hJPU0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF9MKDM+W08nPzI+qaCoosGim7W6taOspa6np7WxrMirr7KqtKK9sbGmoKKonKKbmZmspq+kpLWppZuXlaGbpq2ovqeopZSTm5WfmZKXpKiokJ2RkJicr7K/rJunnqeiiJORqZqoo5qarKCjmpujp6yjoKujmrGblKeglpSdn52XsKWXoaeZm5CcnKKjmKWhmZuZmZmPlYFnbX1xd5KXlJKFi7WqjYaYlY6KjJiWh5SVioSTlJGJjpKUmJOYlpqgoZqclKCdjYJ6pYZsanyQfIB1ioqBcYJ4eXZ2ioB8impzgXWDdWV3fXdrb3ptYGNdcGhNWFpmamBXWnB6bm1mVE9GUzlPWk1STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLOhs6LAoaSysregqqayp6WwtKrIqqywpLSlwKezoJ2kpJyjlZWgqqeso6O2q5+Zlpafl62qpcGeq6OVkZuXnZeSk6GenaGnk5KZqKeyxK+aq52qn5CXlqedqpucn62ZoZudoqSvp6KlqJ+umJennJmaoJ6dnK+gnKGmlZeSl5OfoJWinZegjpaTioqNjpeukHyWm4OSgouqqYWAmZeJg4+eiHqEkIeGmpKIhoqVj5uXjZGYnaOWmpORnY1/jmahs6+FioR2e5KKfXZ5em9meZCBgIlrdYF5iHJpc397doOGgmt1ZHlmYGplY2Rma1lse3BpalxTTFBEXlRGQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRbRzU8LEC0oLqvv62rrrKyoKumsa2irLOvxK+qq6Kyrbyjs5ufpqKhnJmXqKWppqSlsrSelZSdmZmwpa6+oKyikJGdmZmUkZShnJeonISfqquis8izn6qkqpaWl5qmnaianqOrlJ6fnqCpr6qmpKyirpufoKCYpJ6cn5yvo5iep5KXlpyRo5iXp5yal2WCknxlfo2akGN5jm1pa3uSpKpqZJqXfWeGimVlaWh7jqGPbGiMl5Gjd2tqi5mjnplzbG56g42HelhlXoaCXm2LiYF2XGhzd3eSgIeCbneCeH9zbXmEdHaIiI6DfGqHWV5sdWRec4lpa3xxa2NeUk5YSWRYQUo0Pkc3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8yWUM7Py49pZ+6vLqvrLSxqqWora2wpq2tsLywqaajra6wnqyWoKOdopmZpqqcraOlqKmyrZ6Vo4+ir6W2uaWto46OmqGZk5Kan5mZpJV7pa2iqLTEuKWip6+enZSeop6jm6KpqZKeoZ6gqrCrrKSroKqbp5+noKuVoZulsKSXm6qVoJyakaOWnamXnX29g4hytHKEnYataHi5xLhxk6KjeqWZmHOrgnzLwMC7cYyiiIOffZaYiZ3AvYKXnZ2NncLBfIJ7ko2aw8B9a6WyboyBb8p6f5t3kYOOgXZ5gYB5cXp/h3B3hYyTeW54lGNmX3lkYGWCY150aGxkY1hMV0lRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAuI0ZbM1BZL1ZBQjsvOJajucO1sLDAqaiUo6+psK6tprO0r6mlpaawq5+rmJqin5yaqqeinayipaikpLSknaKSpq2rt7OnrqKRkZmcpZKQn6CYm5+ch6aspKutwMCxoKmvqZeRnp2hmaGjqqSToKGenq2vqq2npKSnoaalna2okaSaqK2pmpypm6uglZWklaCilpx+zpR4eqSBeZWWm1+uj16Op4GioHynlptzq4OAr15jjap7p4eFoHWXk4izY4KrhqGNjbNqhK50fZeIt2GDrVmjzW2QdXvae3+ZcH6IknZ+ZXuHdnZrfIhufYWQkX9tg5BhcmxwaGBgeWRccWhqZGdgUlRTV11LT0M1QUhERDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1LMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaOqqK2zq6ayrKyqoqqnr6mgp5uZpJecoq+foJ6op6OloZ+wrJqdlaeurLCqqKyflJKbn6SSj56kl52no56upauwqL/Hs6ipsa6Wkp2bopefqaqflaCfnZ2tsKisqpyoqKSiq5KsspaloqqqnaOmpKGvn5GYppifmZOTkZegcYWMl3WFqIZxsX2ecqx+oZ6BpY+ed6qCfa1/nHOtfqqGhp92mJJ7fJd+qoiijJGMnX6reoiUkJ+Ae61WnMR6j2+SwX2BlW11b4xtZXZlhm9hd25yb4mKko+EbpKRZnB1dXFhZ21lX29paW5nZFhTXWFaUlNDOUlJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNPGxrK0oJ2jjqOjoqyvtq6osKaoqqatq6umoaSdmaGVoKWrn6KloKioop6dsKyXmpapp66sqKeonpeUmqOhkZOgrJudpqKvrKSstaq5zbKtpq2sl5WcnaKYnq2snZegmZ6eqbKqq6qcrKuko6ybr7GiqKuupZilqqipsKGRlaKkmZORhKRqpHWJeql0erJwgqaKmYxxiKCah6RgYFKrhH+ug5t2rYGnhoafepmXhntmgKOJpJmGgqN9qX6ClYeuX32pVZ2ikoF6op+Ae8OvxYtyr7OzuXFiqa/CdGiMjJiOgm2blXFuenh5cG1nZWVycGZ8aWNdV2BqWFlVTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8PJ1dW/oZmrp6Cvop6wtLCuqayip6aoqquppKafm6Senaanp6OcrJqirKGjn6+inJuTq6S1r66gqJqdlpSmopCaoqifoKWcsKakqLGstsiytaqrqZaRnZyhmJ+ks52aoZSdnqesrKWvm62qo6KqobOtoaqzsKGaqKeurrSikpWippiakXuqbJ6Eh3WreXywb4Kki4mflpaflIHSuLS4yYCBsl9glKmDpIiHoHqYlpp4qsl0maOVqKmRk5qMgJyJmsbHeGahgqVzgZ+Ogn2vXXC0YrB1S6OGbadHgpNkjpCeknxxmJWBcXx1fnxuXGZqc3FmgWteYVlkbVxfWUlOTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2osq2spaKcsrisqqClmqilqquppp+mppiqo5+uq52moKyanqmlnae1n6KXk6mqtrKtm6WcoJSPpayRmZynoqCppq6hpKepsLXDsrKprKiTiZecpZqho66ll6GVmZylpqybsJ6uqaeerKO3rKGxuK+dmq6msrKyo5OWpqKZno6CnU54moF/n3qEo32DpISHpp6cnpOEuHt7ebmCf8zGwrZ4m6GQi59+mpaXinaemIqlmKSof7CFnIWfhKx9mpRipWykcI+EkIF9loJyrGCjc3GAmmC8fVJVdI6So5Z7fpOTjHZ8c4aAcVxubnhyaoFvW2RfaW5iZF5MTFFUQUlIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDg4Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7mqr6Cboayys6WeoJWlrq2uq6ecpqaao6ehs6+iqaeyoJippJSitaKilZehqbS4pJuinaOSj6GxmJ6bpqShoq+unKWoorayxLGtqa2pkYeQnKecoqScpZeemZmapqSqm7Cir6WmmK+ku6yhtratnZy0sbewsaWXnK6fop2Fj9G1w7d5h46FkZOQgKZ4lKF3jKCRhKWBinGqhoW0bnJqmaOclYqefJiZhoePc6+CpZuijaaLk52KlZCbbXCyXaVzk3qba5l/e5l8balho3Fxf59ic7K4aHePlKaYfY2OlY15fnmQg25qeWl5cm+AdV5lZW9tZmdgSltYWDxISEBVNEBGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZNzjYqtv7+8urSelqelrbWhopmVo6imrqusmaain6agoLano6mnsaOUrKOOpK2jnZCamqqzs6ScpJypkZSXrZ+fnaajnKectZmiqqS2q8OwqaqpoYyEjpuioKajlZqanJmbmaelp5mtqK+jpZutpr2slL2wrJ6hr7K5qrKlmqiwoqaXeaiQfXywd4qApKWInG2yb6CHrXyhj4OnlZiArImFroWflKqgoZeGn4CZlYB7kn6rgJ2aloureJ2fkYmUkoB5r16jgX2mp2OdgHyXc2qvXaVrcIWZXWBbjKBtlZGmmYOVjpmNfHyEmIBrbn9jf3RugHpgZ2VxbmhnaENaYVs+S1UzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pYU1BPTkk4MDUyLiosQVRWVlZUVFVVVVVUVFVUU1RWV1dYVlVVUUhGSUojKCi9k5qDqcbCtsG0n5qsoK24paOOm6Sjn7Cwqp+kn52tmZ+5oKOroK+pmq6hkKuopJaJmpCusKymnqabrJeXj6yhoJ2loZmknK6YoaimtqnAr6Wpo56LgI2bmp+mnpKVmpuUm5qmpaWbqqytpKWfqqi+pJbCq6mioKuyuKmtpZ+yraeol3avfpCLnIWHfbqtipllsY1lla19oI+DppWagayKhLCFppqkoaGQhaBbbGqBs2B/rXt7g4GxbWdvmZiMiLFbfbRcpINryKJkn4B7vFh2tVmyfVKugHqsWIChbZiPp5uMl5GYmHx6kJ5/ZXV/Y4V4dIB8YWpncW1nZWZPVmRcQVVfPkkoPjo9NCEiLCUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUVJUV1peYGBgYWJeX1xbWFVQTkpGQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsbe9urPBs6OcrKaktqigipqgn5yztKmfo6CetZmgtKiqrJ6vrZ6sm5WvqaKOiJuOr6yop6Gmma6SmI+omaGdpJ+Zo6OmmaCiqbKpva+lqJ6dj32Mm5agoJmQkpqckpqYqaCimqmuqKamoqWpu56gxqakqKCqtLSrraWeuqyrq5SAqZKjr46bf4ekl5mQgoC4w7qDjpyShKeXnIKsioKviKecm6aqkH7VvcKqYqO/vX1+o4KD17q4tYWUk4Oevb6Ea6KBb6uEbJx/erKwx4Npq7C9rHh3or68c4CWjqackZuRmZ57gpKce2R+fGWOZ3mCe2FsZWtqY1BhW1NqXD9VYkNOKT06NC8fHyQfJTIgHSQoMDQ5NjY3ODo+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz89QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Oxv7myvbKhnK6mpbKmnYyYpb+quLKoor+np7KcnrGcuqifra+mp5SUsKyXjIObka6loqygo5yqoJeKopKmnaecmqGoopmfoaytqbmtqKOal5N8h5mRppqSj5GYmI+YlKmboZmqqaGqp6CjqrudqMWioK6jqbOzqa6on7mmra2Zc3WqpLeGZImgcGiukYqQbm53pJCZn4F1rpiUcI+LcZWoo5uXrqRybWxsZot4b26CmXGBempxaWeJlpaYcWlphIdmcIZkXYhiam9ZXGZ9dqZfYXGOkW5lZX+Nk4+hmJmZkpihfoiQlndniHhpjmt6f3llbGNmbGJLZFhKbFo6UGVFUidLOisjHCAbIiwpGBsYLTIuNTo0NTc5PD9BQkRFSEtMTU9RU1ZcV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXF5eXVxcXF1eXV5dW1tVV16plKyzqbm4srOqqaGunqOyqZeSvrLEyb63qp/ArK2koaesoLqjpK6srqeOl66pj4uFlpetnaaqoJ2jo6CRi6SSppmomZajqqCWnaamp7C6q6yam5OSe4SWjaWYjZGRmZSOmJaolaCYqaObsaadoqu5n6/Bp6OypauvsKmsqqa2oqy2lYqgqKW2nYmWo5mHqpuRlZ2SqbKZmqOqoLKWoqGdn6KcoaWhlaunjZKSjIeTnJyUkJmTmZGOlYWBpJqXlo6Lk5OLj4aEfWeJfnSCdXOGinCnbHqUkZOSgYGNj5CPnJShlpqYo4OJlo9zapF3cYx4d3x6am1kY29kVWFZQGpcSGNhT1krRj0rJyE3NTAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFVWWV5gYWNdXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpbXFxeX19gXl5eX19gYGBfWVlgppaoqqW0tq6uoa+jrZ+gtbGQjqzHvsa7uaujpZ6cpp+xqaS3p52ptaeokZitoouHiY+cp5WspJ+Yp56ekpSjlqeaqJmUpqGkkJunmaG2u6irmZqQjHyBlIuhlIqVkZaQkJSYppCfm6qfnLajnqert6euwa2jtqWur6+rqKiyt6Ctu5iRpaSmtqKSnqegjqqgjpKfo6yvmqCjr6ivmKOgnKOqnZ6dnJarnZOZoZuUkJaqmY2YmZeQlp6RiKCdlZWFkoyQjZSKgH1mi4V1hnV4h4JznGqFj5STkIl8i5WSkpeUopOemKOFipqJfHOXc3qLgHN8f2pvZF5wamBbYFluZFBgZVBaOkdHRT4yPT45LyomKykmHSY0MTY2Njg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYGVWUEpBQ0I6OUVNVlteXltaXFtbW1xdXV9fXV5fYGFhYmFhYWBiYmJkYlxbY5eVo6ejr7KsrqOppq2fp7WqkJCdpbW8sK2toqOae56jsqSlsamXm7mmo5OZqpyOhoqJnKKPrp6ilaifoJKWmJqti6mWj6iZqY2ZqY+eurakpZmbjYh5gZSMmpOKlZKUkY2Sl6ONnp+pnp+4o4CEr7Wir690o72jsZ93eZ+psLmUdayjnomAqn9kXGJ2oI+ln4SXfW2Ss5yjp62qomWen5JzeZmXcICYqJdtf6KoimWcpZyRl5iWjJKckYadmo+Vg5KHjo6SiYR3ao6GdoZwe4V/f2Boh4qUkotadZSQZ2iQj3N7p5ubZnqaiYR5mWqEi4RveYBrcmVfdnBsa2hbZ2ZiYnBTXD5OTk5TRz5AVUQ5MS8eHyY0OjMwNjY3ODw7PkBBQUZIQkdGSUtNU1RVWV1gaGZnV1FKPERHPDhVUltgYWJgXl9fYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaajoK6wrKuppaiuoqatpJKWq7axsqebq6esl3SMnbCfqKunlJe5oKCPnKSdkX+JiJuejayaopSnoZ2OlpGehHWtj4imm6mRl6SJnLu0p6CZmIuJdHeTjZaTipORkZSNkJSgj5uhp5mcspaAjJu1nLOMko67pqB+p6J6oa21gI6NpZ6Di4aQsaqvjIqXpJt6gIushpydoaeop4eVhZh3pZt6h5uBmKeCgnucsnqKhqCXmZSYloKRl5eEmplieYeQhI2PkYqDbXCOhnmAcH+AhH6Fc4WElZF4lmeSdKCadX2ZhKKfiJh/lIyFhZprjo2GbHh7cXFnZHhvamxrW2VsamV0XF5JVExSQEU1LlpVVTcpITA5PT43NDM1Njg7Oj0+PkBEST9JRUpLR1NYW1lbYWFoZllRSDlFTDw+YlZeYmRmZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJijn6asrauorJ+osKamqaWZlK/Iv7Gil6iptZ6QhJ2snKeioI2Qvp6ajZ+aoJB8ho+ZmIisnKKVn6GRjJKJhoCRp42Hop2klJieh5+6sqedm5KOhXB1kImVkIqUkI+bjJCSn5KXoaWWnquHn7SJtJqtisqHqa2It4WNsIGvrIKojKaYjZ19qI9ye3ecj6eXaJWkebSMn56mp5KYwoF/q4iYoXKegJqlfZeFlbKBoX2hk6CQmJeBjpObipiRi3yFk4aNlZKJg21yj4V+eXGGgIN7g3SEgJaAj8Vmf6mHj6NrnoSjnISagY6Ph4uacY+ThWh3dHx4aGh2cWhobF5kcG1nbVhnR11STTJENDZOYmQ3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TklKTENQWl1cV2FeaWxcUUU9TE1ASmRYXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSWoqCwp6iopaufo7ewqaqmmpSgo6SrpJemq7ijsIChqJ2lnp2JlLyalI2hkp6PeYSWlpGIq5mbm5mihY6Ld5qcj5+QiJ6lnJaamIejua2kmpyMjH5ibY+Lk5CNkI2NmIyRkqCPlKGhmaGnfqGnh62doJatj56cnZGFgKCMqq2Fo42pmYyaf6N1gJmUa4Ktdk2reIeNnJGaqKeAqat9g6F7eqdpnn+Sa2eXhZe3iZ5+bmBkWYOXf4x7ZGiLcpl9eZVsXXyWbV9TcINcX2t4gl9YZIF8g3+XcKeqa4OjbnKlcJ+FoGpmoG1bb4x9Z1pghIBiV1Bvd2ZtdHNram9ea3Fta2lYaU9eWEY5QTRIRF9rNCxJQ1JNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deXmJ1YE1EOk1PTlRiXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlZ2guKCpo6askaC2u6utopmYoaKlra6hnq+1o6iToaCgp5yajpm0mpCLn4yVi3WBlJKNiqeWlZien3+ShYWrpIeakIqZqZmam5KIprGnoZWaiImAaW6IiIuOjoqLjZKMkJKjjJSfoJyhpH+TgY+joZSgd5yVj6eDoaZ/hqirg6V4iXyEmn6icHOUiJZ8n415bYebjJmPm6iaj4ede4Kic3amZp5+d6RfmHp9k3Sibpi3tLp0k4eCf7WoZIHGuHtwlbaMcX+apGJzrKtgfGmds35tfIaBjYKLmHF/o2xyo3SfhYGkYJ2Zs5ZxfZifs3VzW56yg2pjb3R2cWhvWGttc3JmXGleY0xEPUQ2UUJacjM9U0dfSlI9PDM5NTo6NkQ7O0BKUD9VTU5RQEVfXltaWGBgfGRIQzhMV1VXY2BaZWZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2hok5aUo7eZq5uToI2kt7StraCaop2ko6aunZyyrqyTmKGZoaSZmpSfq5uLiJJ4i4VxgJaOipChj5KUnZh9kImNp6CHl46JkqOUnJuNi6mopZ6Pl4eEfmp7h399kI2Di5CRiZCUoIOXnqCdoJ6LiXecmKKMn3Khi4epiJulj5WmqX2tjH56oJl6o5N4gXSWiI2cfZafhpuOmJulhqJkoXyIlpCbjWyeaJqNbpqZeoCLp31yaHSrg56DdKpolZpdm4V2hJ1nqmqAuGZcqHCBnGCVjF6ndnWHiH6eaJp0hZOSl46An2+akW6nml2ofni7a36qXI6EXbRnXG5yenhraVxxa3l5Y19mWGJCUUZPN1dDUm81S1taX09aREAxNTE7OzZIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TlteWWVmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcWBkZWVrZWNpaGdraZWbiam1m6eIY5Saq7mxr6yeppycqaCfr5yesamtnZekm6GgmZaWoaSZhomNaoiAcnuXiIuWloSRlZiQeoqDlaOcipSPhoyekp2diZCpo6CajJGKgIBpgId5f5eMe4mOjoiPlpt/lKKfoKGTmHJon4qfj4xwkoyBqYeYnqGlnqZ7sK2joriXd6OzoqSAiJR5nXuqmn+ijpyaloiXcaF8hY2vtX1rmpGheH6YtKKjq6iEmXybfZ2af3SqWl1ve5aLeJ5iTH57eoVjeZdCTJ9Yompxe45sgIiEmXWbeIaJsbN/gJuTp3eDnW5zfZVwmnRrpF2VdkhlZGB0cX5+bmZgbGl2e2RkYVFfV11VV0BZRlFoRFNXXGJYXklEPUI4P0I6SUY4TEVYQVdSW1ZERmJcWmBLYG1+ckVDPFVfYlpmalZnaG1vYmZnXmFhXF1eYWhiX2Vjdm1dZWdma2RmbGloa2mTnICwrZmEU16gprO5srKpmqKMnKycnKqUoqykoqiPoJ6dm5mWmKGdloiHiXeGgW95lYWRm4t8kZOWiHKAiJKgm3ORkIGJmpWhm4WPqZyblYuLinyDbISGcYGhjHiGjYiIk5mWfJOjoJ6iiK2GfbWEjp6ce6WWeqmBlZuPiZ+bfKdod21+mXShc3F8noaZcJODrn2kg6admYCkb16oZ3WiY2+lYZzTkHx7mXhyc2OihpB+o3Okj3VrkLOMYIKYiXOqsqe8f3eDbX6+pqm0XZtufHCWbX9yonJdpGdzpmBopm2b1Jp9hptwenuYbJx8eJdzbqmkZ2BlenGAhGtnZmRvdXdnYGNTXGZRUWJJV0pUYVdTW2VqW2VRRkNLTUpLQktFOE9AUU5YU1lPU1FhZWVqUmN3eXdJRkVjXWVaaGpUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5qAsKtUXEt+qa+xtK+zo5uZhZmpoKGkjqWpoJmqipqYmJOZk5KhmI+IhntwfYRofY+DlJqBd5CNj4lvf4WPkpJsl5N8iZKTpZaDj6qblJKLhYl5g3aIgG6Cn4Z3gJOGiJmil3qUo6San4mzoaK2i3qsp6SupXCpgJqOhYCakHukgKGZhphynoSjrq+Kl4yAjaSNlYOtoJR2tLW1yaFzlIuBn2Cdl6lteZWHoJt0ood3oH6Sl4uBb0xmo5Jwm4dzpHt6dGGDgWt+oGtxZF+ccX1zlmh5abO1tMamc5h9ep1rnJurdoWbbXZ4mGqae3WYclBFfbRfanZreYdmamdjdXVwblZeVFlpUFJoSVZNWVRWXWhrblZnV05LQUpNS0hKT0FRS1BlY2ptZXRzc355fG51iXt7VFBPbF5pXGtpUmpoaWxnbGZjZWBcXV1eaWJkaWt7X11kaGNqZm5tZWlsZaGbiK6mhGU/k6Gyqq6vtaKikICXqqKjpYylp56dpoObl5aOl5CPnJOOiIN6anmHZYONf5igeXWPiIyBaYSFkYOMhZ2Neo2LlqaTg5ipmI2Ri4GIen99i3lwkKGGeoGVh4mWoJZ/lKWonJaWhGZueJxsomR8caV3m5hwZ6aAlYp6pHqfloOXcp52gYqVl4+5bpGKomJ9maCViG1yaaprdaBtb6ZfmmmLkGmWh5uVdKKAfZpgjIaNdW+IYmigZZ5+aZt1b2NmiIJtcaJaX1tioW1diItuen1zcmSlbXiiZGenaJlzjJlwom9ViZBvoF9mqFSLXlSYbm1za3KCbXBpbHlza29SWVdXZ1pTbUlZT11JWGlpc2pZa1ZRUkVWXExYU2FVaWtfd3R7fXB9fHKDe4Bzdo2AhHZeUXJiZ2NwZ1BqaGhrbG5oZGdfXV5dYGpjaml2dV1cY2ljampzbWZrbWOcpJilemR0bYunrqOpsLGmn4yAmKudn6aMo6Kbo6KBlpiTjpqQi5iQjop7hnGAiGiLi3yYnHN0iX2QfGSCh5SJiZWZgnyIh5eokYGirJGGkIqCin6AgI9zaZCmhH2GlI2JmaCPiJOppp2IpniVm36liJaMspiekIKvl5+ldpSGeKlzpY+Emm6kooyShI2Du259pa+DhoWGk5Wcn3ylenKolaCWZp5+b6xjlYqWk3epbKmigYl2iIN3qpGmh2qRsGt2s4ypa4qGbW2fnpKVYH6ri6p2fn6LpZ52n3yDpJWdoGqbiHisaJ6tjLZ0d76NpJNZg6aNq2F1cnRxfHVxY2t/b2hsU1dbVmFiXWtNXVJdSl5tbndfW3FZXGBbZnRlbm9yYnF0YHd6fnlyeYNzg3+Be3uMgYKAdmJ4ZGNucmRSa2dob2xyamZpYWBeXGJrYm1sem9cXGJpYmxqeG1nbG5ilaWqnIB/naOWqaqdqKaupJmKgpismp+lipulnamdhYyaj4eckYWSjYyNdIZ6iIRwjYV+mJR0dIVykoNtf4uRh4aTjn17goaZpo5/pqaOgY6JhZR2goeTb2yLqYGDjJSOiZ2fioyUq6Ogj4B1lJeIfoF5lK6jf4GbcY+Gd46Jgn17cqeMcX19epiWm4SPeXt/foeTlZOKdpCYnqCDe32Ja4yFW3l5cnpxaW5+kolxgHWBj5STcYaEgmWMf16Af4t3dHKUdW55bm2GbISFXnVnd45lgICFjaiafXR7lWqJiHCBdn2Hd25tZ4xzeXyYeIVca1h5j2lueHJyb3h4cF1rh25qZ1ZbYFdcZmtkVmJVX1FfcHh5bGt2Zmpra3Z9cXJ1c2FvdWJ0e4F4dXqDdX+Af4B4ioWDfXttf2xkeW5eV25naHVreGppamVcYFpjamVtcXRuW1tibGRsbHluaGxvYY2UuKimiaCimqakmKWcq6KhhISYrZKeoYmbp5qpmIOBm4t/lpSHjoqJjXKDfI99fo+Fe5iPdHKDcJWFe3ySi4aGj4V5foCHmqWOfKehi4aQkIWVg4aOmHdyhKqGjZKdkImfnoiMm6ifoKqDiI6Vmn5+iZatqI+Rpo93b5uPgXiQbn6ohXB9lXFrcH2BoI2Ak46MaG1dg4uLm5qejnOVi4hxdGuBdnSBWXJuhpGBfn6Mal1qZHuFhImAYGl3epp7goqBdYGFgmd3iYVqYXBxgXVecYqAiI6llIVli42DbneLhHGGkHpxZ2hlfIR6lltcamdudlt7eXh1bnNzgmdcbYtra2JaWl9aWWxxXF9hWl9dZnR+e3VwdGNra2t8fXN8eHVkbXVobXx+dnp8e3l6gIB+b4aKhHt9c355c39oVFxxaWx1b3Vna2hkXWFYa2hsa3FybVdbZW5sZ3N6b2hqbWCLi6qwoI+ioZqenZeemKijon6Dma6OoJWInKKRpZV/e5iFfZKZiYmGh4pzfYGMdoWLgoWXinFvgHKYhoN9koOEhoqBeoGFjJyhkYOmooh4jpeJlYqLnJiEg3qtgpGXmpWKnp2IiKGrn6Gio4uHk5uco5mWqqGnpp+SmoaUjHp2jY2Dp35/kpCTlJyyppuVn5CNspOXg6WMjJWan4mQm4KIkYprfI53eGWChpCLfImdhIeLkIiIgISEkHd8eXSZoIiGiZ2JhJN+fYp/f3VvcoSBfXeGhoqPpZCChYyGgoyQjH2HjIqRhHltg4V9eplrcmhhdIpxfnp3d3B3dIFdXm+HaG5fXlpdXVRoclZkXFxibGh1e3xzb3Bka2tpgHxueYByanBwbGeBe3KCgHh/fX+Ee22CjYZ8eXh7fXqDeE5kdmpybXB6ZWtlY2JgW3RmcGZycW1VXWx0bWl5enFnaWtkjIecuZ6WoqCYlJiYlJikoJ58f5qsj5+OhqCdi56WfXiUg3uOmYmGg4SHbnmBgHKBiH6JlIRta356l4eEg5B/gIaEhn2HhY6cnpOHq5+EcouQhpKRi52SfY57qoSOk5iWj5yWh4abpZ+imp2FgpKamZmQmqafpZ2dj5V/j4h1e4aNg6R6fI6QkYaYq6GelJ2QjqqNkH+djIiTmZ6Cjpd+ho6Db3eGcXVgfoOPhnWMmICDj4KGhH6FhJRueHV0kaGKi4Wag4SMc3+Ie3xycXqHgnp3io2DkaaOhYOOgIOKiYp3homKjH5wbH+CfG5obG1oX3p/aX18dnV2dXt3XF9wfm51YGNbXV5SZ25UZVteYmtpdnp+cWxtZGtqZ4GAbHOBbGx1b3lwhXluh4B2goB+hXZxgo2Ifnt6fH97gopgaXxqdWhpgmRqY2BpXGN1aG9idW1sVWNxeWVwentzZWptbYqJnreaoaOfkZGVl4uanp+ee3ifp5Gci4ellIuYmXl6jYV8iZGDjYKCg258f3lzgYV+i5F9amh9gpiJgYiOfH2GhIZ9j4KQnJ2SiaidgHCMi4ySh6ChioWMfaiRiZCSl5OWk3iMo6CgnZaZf4CQmpiSjJujoaSZl5GafYyDd3+Cjoaff36MjI98mKWhopOakZCmjI+BmpGJkpebfpOSfoeOgXR0gnB3YX2AjYZxi5V8iIxxjH+ChYaOaHdxeIuXkY9/ln2HinGBhnp8cHd6ioN5eY+LgpSlkouEj3qGhoeFdoKEiYl8Z3N9gHl7cWxrZ19+c2h8dXZ0fXOAal5gdHZwd2RjWV9eUmtpVWVZX2FoanZ5gXFna2RtaGaAgWtufWhvcWx+eId6bIyBc4GBfoF0doKNhn98en+BfX+PaXKDbnNpYYdobGJfcVZ0b21tYHhobVdqdHZjdXp7cmJqb3qIjJ6ykqWlnI6Pl4+GnKCbnXx2paGOmICNo4uImpZ5e4aHfoOKf4mCgX9yf3t0doOFfoqReGdjfYaXioGKjHh9gI2DeZeClpmXjZegnH5wjIKRlIamm4iMiYOmlYWTi5aXk5J3kZ2goZeTlnl/jpiXjpaanKSdmJKUmniOhIJ3g5WNnH2BiY2Mc5ejn6KTmY+PooyLg5aYg5KWmX6YjHyIjYB2cX1ue2SAfIqFcIeTf5GCbIeCgYCJhGV1bnuFkZeLfJJ3i4h7f4V7enF9d4iEeIOPiIqXoZSBgop2iISCgnd8g4qGeGF6eX50f3hnbWVhf2pqd3N0dX1xfGJjYHRudXJtYVphXltsZVJjWWBhaGt2eYZxYmpjbWVofYNsaHRobnBpgH2CeW2QhnGAhIN/dHyDjIGAfXqCg358j212iXR0bWWKbGpiYnZWhGlwbmB4Z2xianZwZnl8enFgcmyGhY+crpemqJ6NjJeHhp+Tl5l+eKqdi5l6l52Li5iQeXyBi318hHyBg4F4dHl6c32AhICJi4BkX32LlYd+hIZ0fX6Kf32ZhZeVmI2kopl/c4d7k5KKpo+MjoqToZKDkZCVl5GLgY+Xn5qSj5Bzf42SlImdnZ6ml5eMlJVyi42Ja4SXj5h6h4iPiW+XnZqklJWLjJ6MhoKSnH+SkpWHmYh8iomBenF5a3Vse36Lfm2FkoKUeHCBg31+in9kcWl7f5aXhH6Mc4+HgniFfHV3f3yEf3uCi4OLkqOPeIOBdImHfYB0doKJhXBhfHZ6cX1vYm9jZHxjbm92c3h3c3RhdmBvbHVtb1xcX15eal5QXVljYWhudHuIa2BpZmpjaXeIbmZsaWptaIF9e3dvkIhzgISEfXSBhol7g316gYR9fI5yeot4eG5sh2poX2lyY4dncW9ld2dubGF5aWt9e3hwYXhti4CYmaqgo6idioqRhoqdi5WYfnivmY2XfZ+UkZaTiHd+e4p8e4B3eICAcHV0fG+GfYGBin98YVx+j5KGf4ODc3qAh3qPkomTkp2Tpp2Vgn2BfY2KkqSJjoqNmJuNhpGYlJaPioiMkpySj4uMbYOPj5GJnpmioZeViJaQbYeYg2aFmI6TeoiEkIpwlpqUo5OSiYuZjIJ/kJ19ko+SjJmOe4qFh3NydWtwbnV8inRuhpCOknF1gHuBgYd7ZHBseXyZk32DiHOQiYBzh3huf3x/hXuEi4eDi5SnjHqHe32LhXd+cXCBhoRlaHl1dXB8Yl9wYWt0XnFqe3l5bHNwZXhdbmxzbXJYWl9fYWtaUFdYZWNncXF/h2ZdamlnYmdxjW9kaWdlaWiBend1b46FdIGCg3t1gomFeIV8eISFen+Jd3+Le3tyeINqa2BwaHSAa3JvbXJnb2xlfGNugHp3cWx3d4p+opehqKCmm4eMioGQnIeTnXaCq5WTjoehjZaTj390fHaFeHl/c3N7hmtzcHptinaAgYhvcVtZfpGNh4B/f3Z1gICAoIaRi5OdmKGVmHiKf4CMiZydio+GkpiWhYmVmZCXi4uMjYyciY2Pgm2Ji5CRip2WoZyXlIWXh2mDooJlhJyJkH6Lg4uBd5OYkp+TkYmJlY1/fo+XfJGNj42akXyKgINudXBsbW9we4Vpc4OOmItxd4B1goiCeGZybnWAmY57h4N5k5B5dYdzb4h6hIt5ioWCh42aood7g3WBi393eW5sgoSCXnN1c3FweVpfcWFwa15wan17cW1tamx2YG9vanFtWVhhYGFuWFFUWmZnY3VwhIJiXWtuZGJma5JuYGdmYGdrgXVyc3CLgHV/g4B4dYCLgHmFf3eHhneDhXyHjH97d4p/anFjfGOGfG5xbXRqaG9sdnhfcX95fHV1dICDfqSVmq2eppaFjYN/l5SDkKB2jKCUk4aLm42Wjot6cnh0gnByhXRxdohscG12bYh2g36Abm1VUYGrlIeCeIB3coN6gqGCk4KVlJmck5t4knuDjJKkmpOOiZWZkoSHl5mMlIuJj4+HnYSPinxyi4WJjoicmp+blZR/k31ohJuGZ4Wfh5GDkYKJcYORmJCcj5CMjI+Nd3uSkXqOi4ySlox8iHyAa3ZqbmtsbHt/YXp+jpaCdnqAeIOMfHlmc2tzhpWLfoeFepOOcHmDb3WLeYiLeYd8gIuPnZ2EfHp2gYt8d3BqbIKEe2B5cW5tc3RWXnBicmFgbG56cWhwZmZzdGhxa2F3ZV1WZmBgclNRTlxmZV15cIh8X1xpcmJiZWaRal9oZVtncH1wbHF0in12fIWAdXV+i3p7hYB4iINzhoV+jI2EfHmVeGZyaoNgiH1vb2t6YGpudH91X3R9eYZ4dHOFfXigj5mwnKWOgop/g5qIgIyegIualI+FiJiPj4+Ed3R3dIBwcIV0cHKEb2tpd26Dbn19bnVzUk2C38iS1pN7cHWDdYSgg5R3lpKZnJGZe5RzhZCfoZOTkYmTnJSGfpaWiY2NiJKNiJx/joB3eox+iYyKnJucm5WSeYx2ZoeQhmuHooSRiJeDhmOMkZmPlYuXjI2Ki3F6lIh7joiKk5GJeYV8fmx7ZXJva2t6eVuAeY+PgXp9fn+Gjnp6Z3JqcoqOiYGFhHyUimt9fm1/in2KhXyDeYCOlJmZinx1d4OQeHJtZ3GAhW5rdXBoanVuVF9wZXBaYGxyeGdra2JmeHJwcGNfd2BgVmtfXnZQTkthZ2NdenCJdFxcZXZgYWVlj2RhZ2JYaXNzbmtyd4x9dHqGgnV2fotzgIZ/eol/comHgZGLiHx+mHZlc259ZYh+b3BsgFlsbnl5c2F2e3uNdnJ3ind5n4ubrpufkIKFd4iVfn2KnYiGoJGPhYyYhJOOh4F0d3B5cW+Eb21vf3NlZXlxfW16fWpoa2OkmsHcrvChcmx2hHaFo4aSb5eRlqGWnIGScoWLo5eJjpWKkZ2Wg4CVkIWJkICRiomWfod6dX+JeIeEjpyamJmOj3aJdW2FiIp8iaKDkImchIVei5OXi4+Jj4uLhYlte5aBfYiFiZGPhnaFfX1rfWR4dWpueXNXiHqSh4V5foCAhYx+eGVyaX+JjomBgn6LloRrgXVtho+BjoN9gXh+j5SSmI90cneHjHVzcWd2eoRjdW5xYmp3aFJhcWdrVl9vdHphcmRfaH1wcm5aY3JgYlZuWVx4Tk1MZGdhXndziW5cXGR5Xl9kZYVgY2NfWWpya25rc3eMfnR3hIF4d3uJcYOEfH6Ie3SLiYeWhox/fpdzZ3VxeW2Le250cYFXcXp2eXJkd3mHjGl2gIlyf5yHmKeco5KFfXGMlHh5jJ6EhaGNjnyWjYCZh4R7cndwdGpwgWxqbXx1X2F4d3txdXxoYGR869q1ycPch3JsdIF2i5uJjmqZkJCdlpSBiXGFiaCOhYuVioyYlHyNkoiDiZB7kIuFj4F/dniDhHKIgpOclpSXhox1hn1ug4GIhpihgpOLnoOJYYOVj4eKhomNiIGHan2UgH2DhImOjYJxhn5/cXdodnJpdHdrWox8koKFfX+DgISKgnVhcmqHgI+KgX5+kZB8bYFrd4SNhZGCe4B8fo+Rj5WIbnB5jIZ1a3Fsc3mCYHVqb11rd2BSZXJoZlNgcHZ0YXBgXWiDcXNqV2doYmlYbVZbdUxLTGZnXmJyc4VqW1xleV5eZGd7YWRfXVlrbmVvanR4in5zc4F+e3Z6h3OFg3x/h3Z2ioaOmYGMgnuTdWx3dXl4k3RueHp9WHqGcYBvZ3l3koJkdoaFcIqWhZmhmqKKh3Rvk4tyd4+cfouaiYl8oH+EmX+BeHJ0bm9kcn9pZm14eFxfeXt7cXGAamFmYX/Vto6RpnhucXd8cZORjYdrmo+JnJOMhntph4uZhoGSkYaHmI58jYyAgYqNfI+MfYmEenR6g3txhoCWmo6Tk4GIdYOFdYJ/iZGcnYWUjp9+iGKAk4iFiISKjoCAg2d9kYB+f4KMj5B+bYJ8gnRrbXd1dHd2a2ONgY6AhX58hX+EiH5vX3FvhHuOi4F7fpCHeXCDZXmBiYWKgXqDfH6SjY+ShG5ueYt+dW1ua2x7fmRpbGpZbndaUmpzaWJRY3N4bGJlXlpqg25zYVtnX2RsX25VW3BOSE9nZVxnbnGAbFpbY3NgXGNsd2RlXV1abGxjbWpzd4d/cXCAe310eIZ4hYJ8gId1eYmBkpZ8iYZ2iYFweHl7hJNvbnyBd16Df3SBbWl6c5RzZ3OIfHKSkYOan5ughoh2dpV/bXeVmH6IkISKjZp9jJp2fnZxcGxqYXV8Z2JqdXpaYHh8em1xf2VjZ2dXnY9fcXOWvMSEd3GUipB/c5iMh52UjYh0a4iPlYB7lIyBhJuMfIqGfXyJjH+TiHWJhXZ2fYFxdYaBnpWGlI+CgnF/h3ODeoiWm5aGk42cgIhmfZOCgIaEiolygn5nfYt7eX9/h4uPfWmAfYN2Zm95eHN3c2xqjoWKgYp/eIKAhIN/al1wd3p9i4iFe4COf31xgGh4gYaJhIJ3gnp/louPjH1ta3qJfHZ0b2lofXdlXXFjWHB0U1Rvc2hiTmh0eGZhXl1Yb4Bvc1llYl1qbWBwT1lsUkRUZ2FabG5te29ZW15sY1pjcHZkZ1xdYGxqY2xpc3eBgnFufnt/dHWDeoSCfIKFdn6JgZaReIOKdIGIc3l5fo2Qb297gXFpgXl6fm5tfHaWa2p4hHRrlI2FnpigmYWIb36Mdmp5mY9/goqClZeKeo+Wb3pzcGxqZGB0e2lgZXJ7W2FzfXpncHphZWSOsbJ3S2JapdrRl3J7koyReX+WjIWako2Gb2yGkpF6eZOHgYSZinyGf3h4iYqElYBviodxdH17anmGg6WRhZOMg35ufoJ1gneFmZiTipKPlIWHcHuSg32DhIqEb4F4aICFeHJ/f4OKh3xlfH6EdmNwc4BoeXFvdZmMhoOKe3Z4gIR5gWpbb3xyf4eDiH2FiHqIcYBtcIKFjYKDcYN3f5iLjIR3bW19hH92emVoan5yYVp4W1lybk5YcnNmYEttd3ViXltbWXV9cm9XZ11manBfb05XaVI/WWdfWnBrZ3lxW1tZa2VZY3F5X2hdXmVsaGZsaXF4f4dvbX99gXVwgXuAgX+Cf3aBhYmXinGCjXF7hnx6eYSUjHVren9rb350gH1vcnx7lHBvgH95ZpKKgqGYnZKDhWeHg3BnepeKfn+FgpmKgXyNjWl4cmtrZl9hb3ltX2JveV1kbIN6YHF2X2Rl1eu+izI6PouOgHJ5homPjXeFmI1/k46Nf25shY2MdX2Pf4WClYl8gnhudoeFg5Z3boeEa3V7dWV5g4SnjIOPjIN9bX9zdYJ4hJqPi4+RkoyLhn57kod4gIWNg2yAcmmAfnhtfHuBioN4YnmEgXFkcWh+bXVxdYGbi4F/hX5zdX2AcoBuWmt8c3iIgYp7hn98h3d5cGuGgo6CiXGAd36Viop+dG1qdoCAdXVcaWl4cVpXflNacmVMW3NyZltKcXhwXltbWVx1f3VpWWJbZ2VuYmlMV2ZRPV5mXV12Zl91cVtZVW9kWmVxeVtoXmBnbWdqa2lweH2ObWqBhH95boB7fYB/gnp1goGMk4VwgItud36Be3uIk4l/aXt9a3R8coZ7c3d9f4x6eIR+fGuMjISbnZaMgoBsjX5raH+Pjnt+f4OUgn99iohrdXFnaWNbY2dzb2BhbHRhaHCJemFzdF5iY5ugkG5cNVqvtXVqgIp+k4Z3h5iHdY+MindwbIWDh3R5iXiJfZOIeX5yZ3aIfn2Xb3CGfWh2eW5leomFpYeAh42JfW19dX5/e4qXhoGTkJeIi4SJfI+JcXx+hXxpfm1rgXt6anp2goeAcmB3gn5xZHJndYJtdXuGlJGBfYF/b3d5e3R9bFdtfXVzioCGd4Z1gYl6d3JtiH+Of4NxfXt8kYeIem5taW2CgXRuXWhmdHJSXHxOXHFcT1xzb2RWS3N5a1hZWVpgcYB1YV1dYWdkaGhmTlpoTkFhZFxgdmFcdW1YWFN0YVtlb3NXal9iaGtnbWxpcHd8k2xohIl9fHB+fnyBf4J6d4CAiYuEcnuHb3F3hH97iY2Pg2p+e254eXeKd314gIKHf4R+fnpthIyImKONhYR7dot5a22FiZJ5fXuCkoCAfYqDcHJwYmZeWWdfcHBgYWhwZmpviXRhdG9bYGRqdnt/vpynpMi4coWEc5N9eYiUhHSRjYhyc3CEe4NzdYZ0iHeUiXl5cGN3hnmAkmlyhHVmd3ZjanyEiJ6CgH+Oj31xfnODeH6QjoJ3lY2Uj4iCiHuJiWx5eX92aHppbH95c2l6doCDfWhgeIh9ampzaHuAanaBjJGUfnp9fnF7dntzfWFVdXtxc4iCgXuCcIaJd3dvb4KBi318d3x7dI2EgXVocWhsiIJycF1oY3RvS2Z2TF5vVVRZc25iUU90eWJTWFhcYXCCc1thXGhlZGNqZFFbcUlEZGJcY3FeXHhoVVdWd15cZm5pVmxeYWpnZW5uaHB3epNuaYiMeX1ye355goCCfHZ9g4iGg3B2g3Ntd4KCfomLlH9xgHx4eXqBi3SDeH+BgYKEeoB1b32Ji5ueiH6Ge3eHfGh1ho2Ren+AfImGhHaPgGdwbl9kXFhmWW1zYWFhcWxsaIluYHNpWF5jbYB3qdmpx4aHs3KKeXCOdn2IkIF6lIqAdXR1fneAb3B/boV0lIZ4dGxgeoF5iI5lcYJvZ3VuW219gZCTgIF5kZJ9d3pshXR+j4qDcpWKkI6HhYV7f4ZtdXZ/bmh3ZW18dm1qd3Z/f3xgYniGemh1dWN+e2d1ho6NlXx0f3VxgHp8bH5ZVnJ8b3SChn5/d2uIhnN4anR/goJ8eXt3enGKf3xyZ3RkbYuEbXRba2B2Zklvb0xbY1hXVnhtYlBTdXZZUVZYXWByhG9cYGNtZGNdbmJUXXJHQmZfXmZpXVp7Y1JWXHVbW2drYVZrYGBuZmZscWhwdniPdGuOjHV/dnh9d4GDgXt0fYOIiINvcYB1cXV+hoKJjYt7d394hHx9hYd4h3x9gX6EgHt+c3Z4i46fjYl7ind1g3pefoeajXmHhHSGh4R3iXpibmxbYltbYVVqdGRgW2hvcGaHcmFxZldcY2t/fMrOhrmia25ui21yhXJ+hYt/e5KFenl0eXV1e2psdmOEdpKCdm9nX3yBeYuIZXGAampxY1hse4aciYOCcpeUdn17bYdwgImKhnCWjpCIhYuEe3l/cnJwfmdocmNueHFqbHF3fXx6XWV6gHdpdXlmgnZndIeLjZR9coZqb36AeG17XFhwfWxzfol7gW1uiX9wdmZ2foB+gHV6cHlzhXt4cWVyYG2LgWtzWGtfeV1JcGxOV1ZfVFV8a2JPVHZzUVJUVl1idIZpXGBramZiWW5hWGNwR0FoXWBmX1xWfF5PVmVwWVtqaF1YZ2FfcmZraHFncXN3h3lulYp0f3t3fnmDh4B1c3+GhY6DcHB7eHd1eYeGh4yGenx/dYt+fYaEhId/fn59h398eHZ5dpGTn36NfYtudYB5ZISIl4ZzkopvhYWCeoN1ZG5qWV9bXV1VaHNlYFlkcnJngXJha2RXWl9pf3i+rnqft25idIdpdHxyeoSHe36NgHd3c3dve3Zlam9gh3WOgXNqYl5+eHiKgmVwfWhra1pWb3iLpIGFf3GZknF/d3SBbH+Bj4Zyk4eMh4SJhX15dXNvaXlham1hbXZqZ2treXd6d1tnfnx4ZXN+boR0ZnaGjYaVf2+LZmt6gnRsdGJbbXpqc3qKeoFldIZ9bXBndH53fH5wemp5eoB4d29lbGFsiX1sblZrYXhWTGtsT1JPaU5ZfWdiT1V2bE1RVFVeZnaEZ15hcGhnYVdpXVxraUpEa1piZFZYVXlaTldualldbGVdWmVjXnVmbWRyZnNwdIF4cJmFdn9/eH98hYd9dXSCh4CVgm5zeXt7c3OFh4iIhHmBfXaPf32EiY6DgYN7fouDe3d8d3aanZd6ioOHanZ+fGyEhpSAco+CcYWCfoKAcGZsZ1ddW1xbVGVwZV9YY3J1aXVwZGViV1tbaH9wb3J/c4lkZXl/anR2dHSEhXiBhHp3c3Vua3pwYWhrZ4Z0jYNtZl5ffG96iX1obXdmamRWV3Jwjqd9hHx2lpBze3J7eWx6eo+DdpZ7h4aDh4R9dXFzbWh1XW1pX211ZGdmaXpve3JZZ4F2dWhwgHiCdmJ3hYt8lIFui2pte4BwZXJlX2t4ZnF1iXp9YXWDdmlrcXR6b3h3cXtlfX5+d3VuY2VhbIZ8bWtWamNyVExqa1BMTnBIXntmYk5WdWVLT1NXYGt3fmZdZ3NpZV9WYldicF1LS2tYZGFVVFVzVk1ZdmVaX2xgXFtjZV93Z21icGl0b3F+dXSZgXd/gHiAf4aEen12goN+mIVucnR8enRxhYWPgoB6i3V0kIB9gZSOgIWEfH6Mhnp+gXZ7o6WKeYmGhWx1fXt1hIONem+Fc3qFfYKEdW5qaWVWXVtbWlNjbmVbWGJ0e2pobWhgYVdfWml/aWxvf2dsYWl6emt0dXRvhoJ7gX12dW56aGp5al9lbmmBd5CEZ2VYYndpfoZ5bmlvZmZdVVhvaI+od4F6fJCOeHVvfW5ydHiOfneUdIWCgIaIdmpzdmhpb1xtZV5uc19nYmp4aHttW22Dc3Rqb4B+eXdhdoWEeI+Fc4hxb3l/cWJwaFttdmNwcod6d2FygG9naXhzcWt3dnN1YoJ6fXZ1b2NjYm18fGtrVWliZ1RMbWhQR1JsRWF4ZmJNVHNeSk1VWWVseHtmX21xamNcVl9Vbm9XSlNoWGdeWE1VbFRLXHpfXF9rXV1bYmVgemhsYW9vdm5vd3V6l313gIF5gICHhnp5eoN9gZOEcXR0fnp2dIWIkH2BfJBsc5WBe4KfhX+HfYB+hoKAint2hKyff3qIiIRscoJ6doGBgnRuh299gHSKgGpvbmRkWF9aWlpVYmpnXFpfdYJpXm1sXGFWW1xrgWVydHxpal1seHdodXdybod8fn56dnNsemhpeGddZHNoeneSgWNjVGRvZ4GEdnZmaGlhV1ZZaGSQqG9/eICLjnpwb3tmeG55inp2jnGDfX9/hm5kd3NkaWldbGJecG9bZ19tdWV6aF10gG9ya3F7fnV2YnWFi3uHh4B/d3J1fnNgcGxYcHJhcHCDe3NjcYBrYGx6b2loeXdzcGSDdHl5dHFkYWRtcn5qbFRpXl9VTHRjUUdXYkdjd2ZhTFRxWUtMWFhnbHZ6ZWVtcWZjWlhdWHZmVEpcY1hpWFhIV2VRSWJ4W11fbVteXWJjXoBpamBudHhtb252g5d5coGAfX+JjIZ+dnaGeIaMfXR1dYF5enqCjI59f4SJanSWgXuKnX1+hXmAe358holzcY+ujHt7h5B+ZnGIenR+fXZyb4Zse35tkHpjcG9iZV1lVlpZV2Nma2BdXXOGaVhwbVteV1pcbHtjcXd1bGJbbnR1aHV2cW2FeX+BeXdub3RlaHRlW2d1ZnZ2knpgXVNlZmqCgXN8YWNpXFRYXmJkkKVpeXSChZB4bG54Zndse4N5dIhygHh8eIBpZndtYGhhX2tgXnVrWWZdb29iemVbd3xrbm5weHl0dGVzg5J/h4KIenZvcXxxYXdjWW5vYG9wgHtyZXGAZF5tdWljZnd5cmttgHRye3JxYV5lbW59ZWlUaFlaVU55YFJLWllIYnVkYUpVblRKTFpWaWxye2NsbHNjYVlaW2F3XFRLY11ZalNWR1lhTkhqdlhfYW1bW19iY12FaWhhbnd5bG9qdoGQeG2CfoCBkoiEgXZ1iXSLhnRxdnaBd3x9foyPgX+TfnB4loN9mZJ5gIB4eX5/c4iEc3CZont7f4mWeGR1iXlzeXZrdHB/bHl8cJFyXnBvYGdibFRbWldpZG1mXFxyiWZScm1bWVhXYGt2Y2p1amlfW210cm10dHRrhn1/gHx3b25sZGlxY1trcmR0do5zXFdTZGBxf35xgVxiY15TWmFcZJOfZXJxhIOQc2tqeGxub3l5enGAdn9yenp7ZGZ2aF5jW2FoXF53aVdiXnBoYXdhW3t2ampyb3h0c3RocYKVg4Z+hHVyanB7bGV2V1tpbGFwcX95c2Vvflpgb3FiXmlvfGtqcn1xb3Zpb2BbZGtse2FnVGdVWFJRd1xTUFlSSGNzYmFHVmxRSVBaVmtsa3xlbW9xYVtaWFlscFdTT2ZXV2lTVEZaXE9JcnVYYGRtY1hgYWJdjGpkZG15eGtvaXV5hXtrhH2AhJl9goR5fYhtj4Zxb3Z6fXSBgn2Lj4OCl3R4gpOGgZ+JdYF/gXR/gnCHgnVvopdze4aMh3tmd4tvbnxwZ3hxe2xzdnONa150bmFnZmtTXlxWaGJsbFtccYxkTm9tXFZXVWZpc2hjdGVlXVpvdm9xdXV6bIh9gH2Id5BzY2Vrb2Fdbm1kc3iIa1pUVmJjd3x8cIRcY19jVFpgWmOXlWNucIOEiXJqZ3luZXJ1cXpreXN1b3p+dl9nc2RcX1diZFlhdWZWX2BtZGFxXV1+b2hpc3F0cXV2a22Fk4GJe4VxcWZue29wblJaZWlkcHJ/dXNibHVVYnFrW15uZHtka3R8cXFxaWxfWGRpanheZlRlVVZQVW9YUVdUUEhlcl9hRlhrT0lYVFZuaWR8aWt4a2FXXFVbdGRTUlZoUVlnVFNIWltQTnh3W19mbWpaYmBfXo9uYmdreXZubml2dn5+bYSAfoaXe3+HgYl+a5OIcmd0gHt1f4N+iY5/i5NzfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4GNjHd4bnqNYGV9cWd6dHlsbXF3g2dkfG1jZmdoU2BfVWdgbG9cXm6OaE1pbGBVVlNuZnNrZnhkZV1acXVuc3t4c26Je4F3nHt6bGJlbG1eYG9qZXF5f2daVlhfbHh7em+DX2JeaFZZYFhknIhia3GBhnx3a2p2bFt1cGp5aXVybW97gHNYa29fWV5XY2RYZXFjVF9iaWFibFpgfmtma3N1b214dmtohYx/iXqHbXBlb3tscWxiWF9nZ25yf3NyXmlsU2VwZFVibWF4YW90enRqbmtqX1hgZmh1XWRWYlZTT1lnU09dT09IZW9dY0daak5KX0tYbWVfeGhufmRgVV5UXXRbVFNgZk5dYlVTSlxaUVl1dl1fZm1oWGNhW16OcWNoanhyc21ndnN5g3OCg3uIjn58ioiOeW6QinRsc4J0f3+IhYeRhJWPen2Mj4iRm4SAfIyEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fX59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY2NjY2NjY6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6NjY2NjY2NjY2NjY2NjY2NjY6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJLkpqZmZmZmZ6goKCgoKOAZGdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1Mz+TnpycnJuboqSkpKSkp3xdX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmJiZmZKPkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho2Ojo6Ojo6Pj4+Pj4+Pi4iIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7enx8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQj5CQkIuOkZGJh46KkJKTkYuRjI6Ph4+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIyMjY2NjYyMjIyMjIyMjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOhY6Kho2GiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJCIjoqFjoaLj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQkIiNjIaMiIiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fHx9fX19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yQiIuHhoiFiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+LjYqLjYqOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enl5e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSUk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OTkpKSkpOTk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKSkZGSkpOKh5SSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSjIuSkZGSkXeGk5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJGJcoqSkJKAc4mRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj49zcIyQjHR3iJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Oj3drepCGdHeHj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyOe2Vrhn5xdYaNjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouKi4doXmhlZ2NugoWDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3b15ybFxpbWdlaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGheaHVsXW11bmZiY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWl1nb21fa3N1bFlZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NVmJobXNwcHNuUlFUUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU5UYWVlbm1taWhUTU5PUFBPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRENGTFpobGhtbG1pZ2NbVVJPTk9NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUVQVFVaZGttZ2xsa2pqaWhpZ1tMSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+QkpZY2hsa29sbWxqaWpraV9USUVFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7OkZOTWFtcHB0cGpraVhLQkVFREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwc3R0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oz07O0tgbXtzaltHPUBAQ0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTk6OThCam1IOTc8PD1AQUA9Ozs+PD08QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09PTw9PDtHXDk8PD49Pj9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A8XG5APkRFPz5BPEVePT49Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojttd0g4Ozo9PUE8S2M9PD08ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPD09SUxGRnV3TTc4ODo7Pj5XakE7PDw6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3lJO11/g4B6fHdWPD0/PT0+Rml0TDo9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUhyeWtigoSDgoOAfF0+QENAQD1KcntZOj1BRUFCQkZIQz08QEREQUA/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARm90fYKCgYN+fYR1TEFDRUA/Pll7gF0/Q0VJSklJTU1LRUNGR0dFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXJDREVEQ1d1hoeHflhHSEpNTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnV2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEiWxBQVZ0h4mHh4eIg1dITE1MTU5MSUdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklLS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIg1ZshIeGhoaHiIiHfFBLTEtIR0ZGREVDQ0BAQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklKSEhIR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlSBg4SEgoKFhoaDgoaFhISGhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ozo8QUFAPjw5OTg8PD07Pjs4Oz9BQkBBQ0NCQEFBRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJZYWEhIR/gYKDgoODhIWFhoeIiIiIiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU1Nzc4OTc4NzU4ODs7Oz1AOzk5OT08Pjs8PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlohoSEgX6Bg4ODgoOEhomKjIyLi4mKi4yJVDo4NjU2NzY2NjU2NzczNTY4Ojg3NjU2NTY3Njc2ODo2Nzg4OTs3NTc4OTc5Nzc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHZ5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmWFg4GAgoODg4ODhYmLiomJioqKiouJioqBRzY3NjQ2ODg3NDU3ODU2NzY5OTc3Njc2NTo5Ojo6Ozc5ODk4Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1dnp7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhYaJioqIh4iIiIqKjIqJiYx6Pjk4ODs8Pj45Ojo7ODk7OTo7Ojo5Ozo5PT09Pjs7PD06PTs5Ozs8Ozw8OTk8ODo6Ojo5OTk8Pzw8QUJESUpNS0lLTFdvcnN1c3Z4e3t8fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUJBQEI+QEJBQD49Pj5APz8/QD8/PT0/Qj9BQT9APz1AQEA+P0E9Pjw7Ojs5OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uKioqLiotePkRHSUxKSkZHR0RGR0dFQkFAQ0VDQ0FCQ0I/QERIRENFQ0VFQUZFRkRFRkRAQj48QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp7fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDQ0ZXhIKDhIWFhoaIiYmIh4aGhoeJiYqLjI2MjIuKiohWSE1MTkxOSklLSUlKSklFQ0RGR0ZEQ0VGREJISUtIR0dGSEdFSklLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT5CQkdHSlmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjY2NjIuKjH9QTlBOTE9MSkxKSUlISkZERkhISUVFSEZGRUxMTUlKR0ZISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg3PDs8PTo+QD4/QENGSUpRX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjYyMi4uKjXJOUlBOTU1MTEpIR0VJSUVKSEdKSklKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0hHQ0JBQ1VucHV3d3l6eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo8OD0+Oz1BPj9BREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMi4uLi19TU1FOT01LSkdFQkdKR0xKRktOS0tKSktNTE9QTkhJS0xPUVFQUU9PSkhKSkxKS0ZHSEdGRklGRUVCQUJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4qMjIyMi4uNfFhXU1NVU05MS0pERUZLT05PV1VRUE9RU1JNU1RPTVNMUFNVVlJTUVBMSk1NTUtOR0dKRkZISkRERUVCRUNjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JCR1ZORk5QUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLaFhXa2FFUlFRUEk7O1JTUmB1XFVWVFZZWVJYWFJaZlBVV1pdUlRXUU9NUlFQUFFLS0tISEpIRUZJSUlISWlydnl4eXl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHRkZFPz9BQUVBQ0dFREVMWFJNVFVWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbVxkVTpYWFhTUT9AVlVZXGRgVllicl1dV11aVkVRWVpbWV9UWWdSVlZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p5ent6enx9e35/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36LiYqLeW5wWVpbW1JTUlZWVFtadYNZVX2QYFxYXV5XSVZdXVtbX1lIWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4SKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXFtcXV1XUk9TUFBRVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTUtmeVtdVFlVVl1aTFRaVVNUXlpYV1dXemtYW1tcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVVFJPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlVjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtNTktNS0hKREVJRUM+VGRVf1JRUU5LUVRRTU9ZUk1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dXVzc3d6ent7e317fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlVUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUxEP0NDQ0NCP0RQQkNAQz1DSUdWQEhOTEddaVBIRk5GREVGSUdIQ0RIR0hLR0RCQURAT1FNUmRydHZ1c3R1enx7e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUU09WYGtscnZ7e3h5dHJuc3RzeXh+f4OAg4OCgIKAgoGCa01HP0A7Oz5AQD8/PmtQS2FFRkhJRUI/R0xNR01SVUlCRT8/PD08PT0/PT9BQ0NAPzw9Qj5KTkdVbnR0dXN0dnh6fHt9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSkpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlQ0BAQj06QkNCQkRCXF1Pe05PTk5LTE1PT1BMS01XTUhHQEI8OTc3NTk5PTs7Ozg5ODk/PEJIP1xzdHV2dXZ3eXx8fH18fH19fn58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklIUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIRkdIQkFHSUVFRkRNUlBhV1JXUVBTU1JVW09PUVZQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEM+ZXNzdnd3eXl7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpYTUtUVFNQUVVPTFJTVFdYVFRYUUxXWVpWWFhWWFldV1dYaHNrXVZhc2tiYV9eZGFfXllUUU5OTkxJSEpLSUlGQ1FQU1tXVFROUVNZU1xlVU9TU1FOS0lIQz9BOTk5ODk3ODg1NzU3ODU5OkducXR3eHl7e3x+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBwbm1kXV9fWVdPUFhWVlNUVk9PVFZYWFlTVVRMS1RWVVVVV1BTVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMT1JST01NTk5OTEpGUVBVWVNUT0pOT1VTVFxWUlVTUk9NTElISEY/Pj06Nzg3NjU5OTY3Njc1V3Bwc3d5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXVJUWlZXVVRXVFJYWFlZWVJVT0lHT1BPT01SSlBQT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFJNSUxKT1JQUlJTVFFST0xMS0xMSENCQT06Ojg3NjtCNTU2Njpkb3F0d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpJR0VITEhLSUZMTVBNRy9FX1I+Mz8+am9hUlJRQEdVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHV5e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hFRkhKTUxFR0NPUkM4RU5TXWdTUFNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ0eHt6e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRYV1VNTEtJPDk4Nzs+QD48PUFAQj0+RUhHQ0ZGSUdKSkBGQUFARkhFSk9IUVJhXFFQUk9TTk9QTExPTUtNTE1PTltXS01RT0dJSENISkxMSkZGRkQ/QkM+PEJHP0I/QWRwc3d6enp7fHt6end7d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIREQ9OTc3OT9CPjs/QkBAPkFESkVDR0dJR0lFQkI/Pj1DQkFHSUVOT2JlUU1PTldLS01LTE1NTUxLT05TZE5KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLbm92eXl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTU1KTVBNUE9ISkQ/QT05ODo6P0I/PEBCQUFERUdLRkNISUdHSENDP0I/P0BBPkRFQ0xOUlRMSklNVEZJSUpMSktMSUpMTU9QUlBLR0NMR0NCSkpMTU9OSUpJR0NDQ0RJSk1MSVlybXd5eHp7e3l8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUdLREdISEdKS0lKS0RHQj0+PTo5OjtBQj89QkJDQ0dGSUtKRElJRkdHQ0M7QUBCPkBAQ0VESU1QSEhLR0hLREhJTE1ISkxISUpMS01dUkhIRE5GQURKSk1NUE1LTUpLRkdHSk1OUU5MYm1pdnZ3enl8en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktDRkVHRUZGR0VHQkNAPjw9OTo6O0BDQD5CQ0VFSUVJSkxGSUlHRkZEQjtBQ0M+QENDQ0RHTE5IS05IREhFSUxOTUdJTEdGR0lJTE5LSUdFTkhDR01LTUxPTU1OTUtISElPUlFSTlJmZmZxb3N4dXt6fGxoam9la3Fsc3BmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkRGRkVDQ0JFQERCPkA+Ojs7PTo9PkNBPkFDRUZKRklITEhHR0dGRUNAPURFQj5BQ0NDREdISUdNUEpGRkdLTk9LRkhJRkVERUlKSEpJRkhQS0RJTUtPTU9OT1BOSkpJTFJVVVJPV2RgYW1ncHJvcnl6Z2VoaGRpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxIRUVIQ0JBQkQ9QkE+QT05Oj0/Oj0+QEI+QEJER0pFSUZJSEZGR0VDQkFBRkZDQkJCREVFR0dJRkxRTElPSkpMTElHSEVGRURDSUlIS0pHS1JNQk5PTVFOT09NTk9LS0tPVVdWVVNYX15caWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1anN1bnV0c3FyamtzTUdIRkhCQkFERDxBQEBDPDg6PT45Pzw/QkBAQERGSEVJRkZIR0ZGRENFQ0RJRUNHRUJFR0VGR0dFSk1LSFFNSktISElFRkhIRUNJSUlLTUtPU05EUVJQUVFOUE1OUE1MTVNXVlhXVVhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpbnlNSEdISEJCQkZEPD9CQkQ8Nzo+Pjo+OkBCPj8/QkVGREdERUhGREVDREVGR0pFRUpHQ0dIRkhHRUNGSkpHTUtMS0hKTEZJSUtIRUtLTE1OT1JUUEhTVVNQU09RTU5RTk1QV1pWWllWWl1aWGFgYGBeaGVjYGRmaGdpaGhpZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5JSEdJQ0FDSEU8QEVCRTw4Oj4+PTw8QUI8Pz5BQkZDRUNDSEVDRUVGR0dHSUZHS0hESEhHSUdGREhLSUdLSE1LSktMSExLTUtKTkxPTk9SVVZPS1VXU1FTUVJMT1FQT1RZWllcWllbXl5eYGNeXGFja2JgZGdocoVoZ2lmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB0TUlLSEpGQkVHRTxAR0NEQDo8PkA/Pj9CQTxAPkFBRkNFRURJRUZFR0VISEZISElLSkZKSEhLSEZGTElISEpHTExNTExJTUtNTU1PTFBQUVVWV09LVlZVU1NRUUxPUlJQVltbXV5bXF5fX2FgYWRdY2BlZmBlaGpjc3NmamdnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKSkxKTEdCRURFPEBGRERDOz8/QUBAQENBP0I/QUNIQ0ZFRklGSUZGRElJR0lISkxISEpKSUxKRkpLSElKSkdLS01NSkpNTE5OTlBMT1BSVFhWTU5UVlRSUlFQTE5UU1JXW15eX11dYF9gYWFgYWNlYmRoYmRpamd2i2xqaWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZud0tNTEtNR0RDQUQ8P0VFRUM9QUFDQkJDREFDREFBRUdDSEdISEdKR0RISUdISkZJTEhJSk1LTUxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1BXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BDQUVEREZCQ0VHQ0NJRUNJSkpJSUtHRUtKR0hKSUlLSEpKTkxOS0lMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGF2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RCRUVERkJGRkdERUpFRUpNTUtMTEdHTUlHSktIS0tJS0tOTE5MTExJTE1MW3NiZHBebG1VTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpxeXZrYmBrZWVteGxrdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUhHRURAQkJAPkNGR0JGQ0ZFRkVEQ0hIR0RFS0hHTE1OTE1NRkpOSEpLSklMSkpKS0xNTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtbnVcWWxRXG1tWnFta29teHh0c2lwXV9ya3FqVXV5eHBjXmtmYmdwcGpqb3BwcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHR0VFRUJCQj5AQEZHQkdESUVFRUJGSUhIRUdLSkdNTU5LTU5HTE5JTEtJSk1JSklKS09QT05NS05OTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITEZJREVFQ0FCPUJBQ0dESEdMSEVDQ0hLSEhGSkxMRk5MTFNSTEdMTUhOSkhITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9uc3N2c0hLSElCRUVFQUA+RERCR0RISU1JRkNGSkxJR0ZKTUxFT0pLV1JLR0tLSk5JSEpMSUtKSUhKTU1NTUlLS0tTa2NbaV5faWNyclpfWWpvX2VlVWtfY1thYVFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ2dHdyR0dGSURFREZBQEJGRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpFSEhLTUlISkpLS0lISUdLS0tMR0hLS0xNTUxKS01OVFtcVFBUTFBPTk9PVlFPT1FOT1FKSU5QUWRxaVRZV1xbXFVZW11YXVxcY2ZhYWViY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUNAQ0hERkdDSUtMSEZER0tMSERHSVBLTE9LTFdMSUVFSElKSElLSUxKSEZHR0lHSElFRkxJSkxPTElQXFdeUFxbYF5NWFlTXFxiXk1YWk1YYVJKWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0VMTUJEQ0JFSUVHR0ZLSktIRUVKSktGRUhIUEpNTUpNUklHRUFIRkpJS0xKTEpIRkRJRkRGR0VFSkhDSk1LTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5eXF5TWl5jXlpdYGNgWV9jW2BeW1RYV1leXWNiY2FjZWhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JREJCQ0dIRkhHSEtJSUlERktLS0VGSUpOS05MSExOR0hFPkdHTElLTEtLS0lHRElEQ0RFQkZKREBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVlVVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQkVHSUZHSEhGRkpHSEdIS0lMRERLSk1NTExISkpISkY/R0dOS0tLTUtLS0lGR0NEQERBSElCP0lKSFBdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXGRjYmRjZlhRVVRSW1daYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZERktKRkZGSEdGSUZGRklMSk5GREtLTE5KTElLSkhJRkJISFFNS0tPTEpLSUdHRUQ/RUNISEFCR0dFVF1ZXlhfWV9bXVVYWE9dXVFLSlZeWF5bXVVZYFJRX19iYmBgYmJgY2JhZGRiWE9RUVFaUltdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FIRkRHTVJIQ1FKRkhISEVGS0pNUEVGSUpLTkxMSUxMSElHREhLUU5NTVBMTEpLSElDREFFREhHQkFHRURXVUVcVF1TVl9YT1RVTlpaTUlKVGBhW19YXl5hXU9ZYVxgYF9iY2JdYWJXX19UUE5PT1dRXFtbXFxeX2JmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZIRElSYlBDVl5JR0dIREZNS1BQRUlJSktOTExMTUtKSkdFSk5RUU5PT01OTE1IS0FEQUNERkRDQkVGQk1IQktLT09OTEZNRkdJSkhHTEtNT1BJTE9QT1NPTFBTUlVaWVdZWFhkV09TVFBQTk1PVFJaWFhaXVxgYWRlY2dja2xwc3J6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVIRkdES01dTEdHWExHSEpIR01MUVFITEtLS05NVU5PS0tLR0dLUFNTTlBPTk9OTkdLRmBFRF9MRWZkRU1bSV5bcm1PTVVtWUxEUGBVa1dnSl1XVV5ETFFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqUlZVVFtcW2BgYWJiYmBmaGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElGR0ZIRUVLT1NJSkZgU0hKT0pJT01SUUtNTExPUlVST09JS01HSE1RW1lPUFBOT09PSUpRf1FJfFlZcXRZUW1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtgVlZYf2p0dXVfX3ZfWGFbW2ZbX2BhYWFdYGJnbXBsYHB3dHiBgYKDg4J/fX+Adnh6bHZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSkVITU5CRExMRklMRVFWTEtOSUtSWFdRTU9PTVFUTk9RUEtLTkdNUFNbWlNRUk9QUFBKSFp4XVR4ZWhaU1RSdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Nye3xvfnhugHJfYGBiYVpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5uc3x+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1ISktHSlBPTU1KTlZeWVVMUVNOWVpNU1NSTktPSFFSVFlXVlBUUFBQUUtIZ3hsY3hybVtLTVV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclFoem1panp6fWx4en9vaG9ZdnZqdXVwgWByZn1pbHh8b15fX2JhW11iZGdpaWRnYmNkbGxwcHN0c3NzeXFyeGJsdWdxeXtzcnZ5foFzdXpufH15d3JuTktTdU5DQkZQUEhKS0lLUE9PT01PWmBaV0tUV1BhXlJWUVlSTE9JU1RVWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmhxdW5teXB3bHZ0dHJsbl10fnprbXl8a3RsfGtwdnV4Xl9fYl5dX2RkaWdoZWVeYWJpaWlqa25va3FubWpwYWNmY293eG9tcHN5fm5xcGp7enRzb21MTFtWSEdFR1JQSUxNSktQUVBQUFBXXFhVTVVZVWVYUlJZXlNMTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1twenteYHpzY3JveHFoZH1pcnxeVExsYHZ1a2l1e3ttfnhrfHBcXl9iW15iZGRnZWVlYlpjY2lra3JzcndnbGloZGdgYWthZ3NybGdtbXJ8a21oa3t0bW1rbU9IS0tJSUhIUVBMTk9MS1JSUk9TUldSVlRQV1tWVlRUVGFfUE5NS1RTVFFVVk5OTE1PUEpIUU5QVUxLTFNUU1NUUFZVUVFOUVFYWVJOUFVUWFhYW1pVUlNXW1dYV1pPU1VXWFhSXllXXlZUUFlSVldXV1heW2dyXltbWVxdX2NaX2NjZGZkY2NiWmNjZmZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLTE1NS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVdPT0tNVlRRTlVTTk9NTFFQS0pSUUtRTUtLUFJVU1FSU1NJSExOT1FSUVFRVFZSWFdcV1NTUFJUVVZTWlFOU1JYVlRZVlRaVlRSVVRUVVdYVl1ZXmBdXFpaXFxfY1tdYmNkZmRkZGFZYGFjYWJoaGltYmFkXl9jXVpkXGJtYV5mZWZtc2RpaGtrZWRjZmhQSktLT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYU1BQSk5XU1BOVVBOUU5MU1BMT1VTTlFOTU5RVVFVUVJUVU5LTU9RVFRSUlFWV1RZWltZU1VSVFdXV1lbVFBUVVhVVVpVV1pWU1JXVlVXW1haX1xVWF5cXl1bXWBhXltiYmNnZmVkYlhfYWJdYGdkZmVhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVtaWFdYW1lYWVZcamRWWFlaV1ZTU09KTlZUUE9UUFBQTkxRUVBSWFRRUU9NT1NWT1dSVFVVT05NUVNVVVRUUlRXVlpdXFpWVlFRVlhWW1tXUVRXVlZWWVRYWFZTUllXVlpdWV1fXlVeXV5gXFtfX19fWmJiZGhnZGRiWGFgYl5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUU9VXFpaV1tbXFhaW2RxbWhkX1tZVlVXUUxNVlNNTlJPUVJPTFBTUlVaVVNQUE1QWFdSV1NTU1hNT09RVFhWVVVTVVlYW15dW1tWUk9VVlZbW1dSVFdWV1hWVFhbVFNSWlhXXF5aXl9gVWFcYWFdYGJfXWBdY2BjZ2hkZmBZY2BhX19lZF9gY1taXFtcWVpZWFdcWVxbYF5fW15eYWBeYlxZYFpRTk9OVlFQVFJPVVRTUFdcXFxYXlxeVlxeanF3eYBjXFtVVVhRTU9WU05RUVBSVFJLUVRUWVpXVU9ST1NYV1RTVVJSWk9QU1JWW1ZWV1NWWlhdXltbXlZTTlRVVlxcVlJUVlZYWVNUWVxVU1NdWFpdXlxgYGBWYVtjYl1hY19cYmFiX2NmaWRmXltkYGFgYWNkX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVUUlFXUlRQW15eXVtgXGBVXF1oanJ9c2xnXFRXV1FOUlpTUlFUUlRVVEtSVlZbWlpTT1NRVlZWVE9XUlNaUlRUVFhdV1hYU1hcWF5dWVpdVFVOVldXXltYUlVVWVlZVVdZXFVUV15ZXV1gXWJiXllfW2VhX2RkXl5jY2FeZWZpZGZdXWRhYGBhYmRgYl5YWl9bXFtYWFhYV1taXGBcW1tcW1haW15WXlldUE9PUlpQW1RVVlZUVFReXmBeXmJcYFVdXmJreXRsfWtaVVlVUVFTXFRVVFVUVllXTFJbV11bXVJPVVNYV1dUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSV1JZWFlfW1pUVVZaWVpXWFpcVlVaXlxeYGFfZGNcXl1dZWFhZmReXmRjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFcVVZZV1dVWF9fYWFgY11fVF1fYmVldYF6aFhZWVNVU1ZcWFdXVlZXXVhPVV1aXl1cVFJXU1dWVVNUWFJTVlRYV1hdXlhdW1ZdX1hfX1hcVlFZVFlaWmFZXFZXWFtaW1lZWltYVl1fYF9jYmFkZFxiXGBmYWRmZF5fZGJiW2ZjaGVjZmBmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOVFlWU1xUVldZVlZcYGFiY2FjXl9WW2BkYV96dW9oWVxaVVdUV1taWVxZWFlgV1BWXlxgYFxUVFhQVVdWVFZXUlNVV1paW19eWl9cVl9fWV1eWV5VU1lXWVldYlpeVldbXFtcW1taW1lZX19gYGRiY2RlYmRZYWZjZmZlXmFiYGNeYmNpZGNnX2deYWJjYWFgXl9YVFtaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU09WWlZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5bXVtWV1hZXFxcX1tZW2JWVFheXWFjXFJWWVBXVldXV1ZTVVRYXFxeYGBdYFxXYV5bXlxbXlhWWFhbW19gXF9YWVxcXV5eXFtdWFtgYV5gZGNkZWVmYlhjZWRoZ2ReY2BgZWNdZWlkZWlfZl1jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldaWFtcWFdZXmBiYWRhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFdXWFlZV1ZXVl1dXmBhYF9iXllhXV1eWV1eWVhVV1tcYF5dX1paXl1eXmFdXFtaXGBiX2JkY2VmZWZiWmRmZmlnY19jXmFmZFppaWNmamNlXmJiY2FgYF9dXVpYXFlZWFhaWFdaW1pZV1hVVVtdXV1gYGJieEtYV1tZV11bXF1aV1xdX2BiZGFiYV1gWGJjYmFjYWJdW1xbWFdbXF9dYF9dW2BkXFxYWmJlY2FSXFpPWFhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl5ZWVRYXV5fYF9gXFteXmBiY11cWFxeYGJiY2VkZmRlZmRcZWZnaWZjYWJcY2dgXGlpYmhqZWRgYmFjYV9gX11dXFlcWVhXWFlYV1xaWldXWE9YWl1hY2Zmcmt/SllXXFpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGJjYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF5eXlpYVltfXl1hYWBeW2BhYmVjX11UXWBgY2RkZmVnZWZmZV5lZmhoZ2RkYFtlZ15haGhiaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFtbVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3x8fHx7fHt6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3x8fHx8fHx9fX19fXx9fHt6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb29veX59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqCRT4/Pz8/QDAqKysrKiKM29LS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb255gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjYM6MjMzMzM0IRobGxsbEI/v5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dXZ3d3d3d3d4eXl5enl6eG9wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHZ1dXV1dXV0c3Nzc3NzfYWEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl3dnZ6e3h7eHd2d3p4enl5fXp5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7fHx8fHx8fHx9fX19fX17enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d4fXl7fXp8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGBgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8eXt+eXx6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4SCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3d3x5eXx6fHt3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4fHp7fHt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh6eXp6eXt5eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KBgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3Nzc3JycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3NycXFxcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Nzc3JxcHBwb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnJyc3NycW96f29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFxeXtwcnFwcZeDbnBwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcnF9nnpwcW+GoHxvcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXKdn3ZwdJyffW9wcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFycJeskG5/o59+cHFxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJwjrGoeoimoH1wcXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3Nzc3Nzc3Ocs6akp7GidnNzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fnx2dnd3dnV4enh4eHh4eHd3gaudobamoqeEenl5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHx8fHuSppmjsaGbpJR6e3p4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX19fZWeipSsnp6fmoB/f319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgIGAlKOclJybl46bg3+BgH5/f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/f4CBgH6asqmjm5+fpaeRfXx9foB/fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5/gIGEla+mnqWfn56kqK2fkYeBf4B/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgoaJlqaxqZ6bpZ+en6Cfo6ioo5eHgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMj5GPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4ODhYqZo5+ZmJidnZ6hn5ucnZmTjIWDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBgIGHjJGVmJmNlZ2bmJSNh4aGh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYGBg4uWnIeOm5qMh4aIiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhISCgYSLipKOhYSDg4WFhYOEhIWFg4GCgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpGRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgYKCgoGBgYCIkYKCg4GCgICAf4GAgIB/gH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgICAgImRgIGCg4OAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJloiEgoSCgn+AjJWCgoGChIOBgYGCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6YioOFhISEgoCSmoaCgoKEg4OCg4GBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBj4yDgX9+fXx9jJyNgIKBgYKChZSTjIGCgYKDg4GBgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIg4SEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GVl4mAfX19fXuBl4yAg4GBgYCPk4yQgYKBgoKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgJWfin5+gH2Hi36EhIOEgoODgo6JhYyCgoOCgoKCg4ODgoODg4KCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fn19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5ORkoyKiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOJkYOEi4WCgYF+fYGHhoOAfn5/f39+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWFhYaGhoWGhYWGhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f36AgISFhIWGhoaFhYWGhoeHhoaFhoWFhoeHh4iGh4eGhoaHh4eGhoeHhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiYiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/f4WFhoiIiIeHh4eIh4iHiIiIhoaHiImJiYmIh4aHh4eJiIaHh4eHhoeFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWFhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt6gIaHiIqKiYmJiImJiYmKi4qIiIiJiYuLioqIh4eIiImHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5GOioaFhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKCgoKCgH9+fX19fX5+fHt8g4eJi4uKiomIiIqJiImLiomJiIiIioqJi4mHhoaGh4WGiIiJiIaGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgYKDgoGEg4SDgY6TkpCPj4uJhYWGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fX5+fn5+fn1+fX19g4eJioqHh4WGh4eHh4iHh4mHh4aIh4aJiYODhIOFhISFhYeIiIaFg4KCg4WHhoeGhoSCgoOEgoOEhIKBgoGBgYODhIOEkZKQjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCgoF9fH1/gH9+fn59fH19fHl8g4aGhoSDgYKDhIWFhYODhYSEhISEhIWEgoKCgoSEgYKDg4WGhYSCgYGCgoODhYSEhIWEhIaEg4SFg4KDgYKDg4SFhIeSkY+Nj4yJhYSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhIWFh4eHh4aAgYGFg4OEhYSHiIWCgICAgX9/gIODg4ODgoKAfX1/gICBf31+fn19fX17enp+hISEgoGBgIGBgoKBf36BgYGCgYOBgoGCgoKBg4OAf4CAgYKCgICAgICBgYGDgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGAgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn5+fX+Cg4OCg4KDgn19fn+AgIGAfn19fX1+fXx6enqAgoKBf39/f35/gIB+fYB/foCAgX+AgIF/f4CAgX59fX+AgX9/fn+AgICAgICAf4CCf4CCgYGDgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gIODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgH9/f39+fnx/f35/gH9+f3+Af4GAf359fn9/fn18fn+Afn5+f3+Af39/f4B/f39+f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEg4KBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9+fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXuAgH+AgH9/fn5/foCAf35/f4B/goB/fH5+f35+fXx/f4B/fn5/f4B/f35/f4CAfn2Af39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfn19fn5+f359fX19fXx8fHt6eXl5eH2BgICBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5/foGAgYF/f39/gICAf39/gYB+f3+Afn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoODhYOBg4ODhYSEhISEg4ODhIKCgoKCgX9+fX19fn6AfX19fX19fX19e3p6eXl5eYCCgoKEg4CCg4GAgoCCgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipSQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChoSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX18fX18e3l5eXh4fIKDhIWCgYSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgYKCgICBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICBgH+AgYB/fn19fX5+f36Ag4SHh4SGhoaFhoaHh4aHh4iHh4eGf32AgICCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGBgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYODg4OCg4OCgoKCg4OCgpGQi4iIh4mHhoaEhoWFhISDgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgICAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoeHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eXl8gYF+iJaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhIOEhIODhIOEhISIko+MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx5enp7fH+Bg4GCgYOCgH59fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYWFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenl6e3x5eX19foB/gH98e3t+fn2ClZF/hIh9fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX19fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX19fH+BgH2Gj4F+fYJ+f36Agnx8gH+CgIKAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uUkIyMjo6NiIiHhYWFhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx9fHl6e3t4eHl7e3p8goCBfn+AfH5+f359gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJKNjI2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gYGAgIB/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4N/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn99fH5/gIGAf39+fX19fX57fH1/f3+AfX9+f4yRjo2Njo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KEhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEg4CAgX1+fX5/fouEgYd+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fXx+f399foB+f36Eko2NjI+NjIqGhIWEhIODg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fn58fn6Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fXt8fHx7e3p9f4CAg4OCf35/fHx8fXx8gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIuQjY2MjYuKiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfX59fX17e319fHp8fH6AgoGAgIB9fX18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIOBgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f3+Af39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5/fnx8fXx8fXx9fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiYqJhYiSj4yJioeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fYCAgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4ODfX5+fX18fX19fX19fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4uJjJGQjoqIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX5+fX59fHx8fn18fXx9fX1+fX1+fnx7e3t8fH18e3p7e3l6eXl5e35/g4OEh4mKiImOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGCf4GBgX9/gH+AgX+AgIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36DkYSEg4F/fn18jYd9fX59fXx+fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI+Oi4uHhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB+fX18fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fX2Ag4CJjouMiIWFhYSDgoKCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4GAgICCgX+AgYSBfn6Af35+gH59fn6AgH+Bfn+Af39/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8fHt8e3t7fHt8fHx9fIqLiYiGhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKBgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBgH1/f3+AgICAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3t+ioeHhYaIhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35+f4B9foB9fX1+gH9/gYCBgYCAgIGBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCIg4SEhYSEhIWDgYKBgYKBgICCgoOBgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgYODg4OFhIWDg4OEg4OEhIOBgH+Af4CBfn19fn9+fn5+gH19f3x9fX6Af4CAgIKAgIGAg4KAf4B+gIF+gIGAgH9+fn5+fn1/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4SEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/f4B/gIB/gICDgoGAf36AgH+AgYCBgH9/f39/f4B/gIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x6fHp8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF/f4B/f3x9fX6AfX5/f39+fX98fn5+gX+BgH9+f4B/gYOCg4B/f4GBgIKBgYGAgIGAgIB/gIGAgIKDgYF/gISAfYGChICAgX+BgYKBfXp7e3x8fH9+f4B8f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WEgoSEhYSEhIGDgoGDgX+AgX5/gH6AfX19foB+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgYOEgoGAgYB/gYCAgYGAgYGBg4OBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CAgYGAgIKCgYCAfoCCf3+BgoOBgYOCg4OFg399fX18e3x8eXp7en55e3l4f357fHt+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gIB/f39/f3x/f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4CAgX9/gYKBgH9+f4F+f4CCgYCBg4KEhIaEgH5+fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fH6AgIB/f39/fIB/f4GAgYCAf3yAf35+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB8gH6AgH+BgIB/fYF/fn5/f359fX6AgYKBfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAgICAgHx/f4B+f4GAf39+gX9+f39+fX18f4CAgIB+f35+f318fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd8eXd4d3d4e3t7e3yFiX17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgoGBgoCBgICBgH5/fn9/fXx+fYCBgoGAgIGBfX6Af35/gX+Af3+BgH9/f319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKBgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXt8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoCCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHqBgXh5e3x8fXx8e3x8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7j393d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHenh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCf4B/gIB/gH+AgIB/fn2Af35/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgoKDgICCgYSDg4SBgYOBgoOCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CBgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx7fXx7fX94d3Z5eXp8fHx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KChISAgIOBhoODg4GChICEg4KCgICCgoSBgYKBg4J/gIB/gYOCgYCBgYCAf4GBgYGAg4B/gIOCf35/goGAgH9+gYCBf4CAgYCBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH9/hH19fXx/fXp9f3t5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J0b3dxd3lzd3uFgoKDg4OEgoOEg4CAg4OGg4ODgoKEgYSDgYOAgIKBhIGCgoGCgX6AgICCgYKBgYOCgIGAgICCgoGEgH6Bg4F/f4CDgoCBf4CCg4KAgYKBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhxeXR2eHR3e4SCg4KDg4SChIODgYKDhIaEgoODgoSChIOBg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYKCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgIKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgYOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIKEhYKCgYKDg4GCgYKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOCgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt9gX58eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIKBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgYSFg4KCgoODgYOBgoCCgH2AgIGCg4KCgoKEgoCCgoOEgoKBgICBg4KAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCf4OBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6fH2AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18fHh2f3Z3f4SHg4KDhoODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4GCgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGCg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYODgoODg4GEg4GDg4SEg4SEhYSEhIWFhYWEg4ODf36BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODg4WDhIOFf36CiouFhYSDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhIODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhYWCh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF5g39/f36EhIKDgoOBg4SDhISFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf31+f31+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg3+Dg32BfX5/fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd216c26Ah3ltfXJzdnN2bW53bHB5bHV+f398foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgYCBgICAgYCAgIKDgoKEhYeGhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb2x3fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhIWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIKBf4GCgH1/f4F+f35+f4GAfn6BgoCAgoSHhoODhoSFhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhoWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXp9e3x9fH9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhIOFhIWEhYSGg4WGhYWEhIWHhoSEhYaFhX13hYOEhIOCgX5/fnt8e357fHx9f399fH9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYeFhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhoWEhYWDhoaFhoWEhoeGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1+fnx8fn2Afn1/gH5+gH99fXyAfX5/fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFhoaFgoOFhoaEhIOEhIOEhoSGhYWFhYOGhoWGhYSGh4WEhIWFg4SHhoOCg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYF/fHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWGh4WHhoeGh4WIiIeHhYaGh4WGhoSBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDhIeDhIGChIWDgYCAgHt7fn18fHx+fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhIaGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDhIKCgn+Ae31/fXx8fH59fH19fH17fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f39+fHx9f318fX18fnt7e3p7fHx8e3t7fnt8fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWEhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iHiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWDhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBgoKBg4WCg36BgoF/g4F/fn5/fn98fH1/fXt9fXx+enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x8iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaEhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhYSDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCEg4OCfYGBf36DgX5/f4B8f3x9fX59e319fH15enp5e3x9enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIWGhoWFhoKDg4WAgIGAgIOAg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhYWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhIWFgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXx/fn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhYaGh4eHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhISFhIWDhYSAgIKDf35/f39/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t8fX19fYB9fXx8fYB/fXyGg4aGhYaGg4SDhoKFgYGAf3+AgH5/gYJ8fn9/foCAgoKChISDgoGChIGAg4KBgISFhIKBf4CCg4OEhYWHhoaEhYeFh4WGgoOCgoOBgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhIODhIKEhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8enx8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX5/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWDg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt5enp5enp6e3x5e317e35/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjtBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8rKysvLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTT0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzQ0dDQ0NDQ0dHR0dHR0c3Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19jZ2NjY2NjY2NjZ2dnZ2NfX19fX19fX1tbW1tbW09LT09PT09TU1NTU1NbW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0E8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNloSGhoaGhoeHh4eHh4Ky4t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLepp6enp6enp6enp6enprG+vb29vb29vby8vLy7v9LS0tLS0tLT09PS09PT3OPi4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk08Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzm5QU1NTU1NUVFRUVFNMoPPr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6OghoSEhISEhISEhISEhIKVrKqqqqqqqqqpqampqLDS0tLS0tLS0tLS0tLS0eDs6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs8QkA4PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzM5xVFhXV1dYWFhYWFhXUKHx6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSloomHh4eHh4eHh4eHh4eFl62rq6urq6urq6qqqqmy0tLS0tLS0tLS0tLS0tHf6+rq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8PD46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183OeF5hYGBgYGFhYWFgYFqk7ufn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqaeQjo6Ojo6NjY2NjY2Ni5yxr6+vr6+vr6+vr6+uttLS0tLS0tLS0tLS0tLS3+np6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcfFxcXFxcXFxcXFxcXEy9DPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs/Oz8/NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS0NDQ0NDPz8/Pz8/Pz87Q09LS0tLS0tLS0tLT09LV1NTV1dXV1dXW1dbW1tjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Pz8/Pz8/Pz8/Pz9PPz87MzczP09LSzs3P0s7Ozs7Ozs7O0dTPz9HU1NPOztPTz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbW1tbW1tbW19bW1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O07udz9Ktg4OVz9KkodDOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0rWVm7XKmry4mbWzn6Gp0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz9GfoKqwxKKMgI3FnZeVnMjQzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDk2P0I/Qjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RxYeas8CeiKzWupehnbCy08/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9anmbW7p6ubpbKZlq+zqtXQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD09OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/VpZm0waCdlqeQmoSdk6TV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1qWZstajtKuff6CphZmk1dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0NWlmrPWydjBnIC8raaYr9bR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRj9ISEdFQDw8Pj48PT08NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09DVpZm0yY2hn5+ZqJaYm7vV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBDOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocfS1qOas8KkqqOhw6CrpJzR09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT0dW1gsPYqY+QrNfCj4281dLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPDw/R0VHS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0cLU0tXBv9bS1cXE1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLU0tLS1NXT09PU1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPT43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo2OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT48SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0JHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODU2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urq5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTk3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTU4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLe3t7i5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojo7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqysraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e4t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqamqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3tre3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojk6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WkpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW0tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSko6Kio6Khn5+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6imoJ2cm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqamp6enp5+bmpuioJqWl5Wam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaOipaampaanpqagm5mboaCXk5KRl5qcmpaXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWnp6amop6cn6GgmZGSmpaXmp2YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpaanpqWlp6empaOgoKGgn5qTpq+bmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoaGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKipKWkpqampKSjoqKhnp2ao4qHm5yam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGipq6kpKSkoqGhnpubn6BbhpyZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKq0sKKjoqCenJuamqlwUIubm5yZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoaCrk5yuoKCenZqZmqKZU1qPnJ2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qbmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6ChoKCgo6Fol6yfnZuam5yqc1Zfj56enpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uamJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2enp2odGiko5ubm5yfoWtiYpGenZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udnJuap4Jsgaebm5ycopJsZGONn5ydnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmZmqaEdnCTmpucnZ2CamVljKCcnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycnJmYmZmmjXV8fI6anZ+WeGZfZY2hnZ6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5yZmJmZnJWUnXt/nKKghox/YGaRoJ6fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmZ+pnIprba6qoWd/i3pnl5+goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZempYhwX2qklJhWZ3t9fJ2cm56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqXqZlnRUh0mYOFT0VgdYCUkY2SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGQlq2EPTo8eIx2blE5NV52goeCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDfpijWl5sUHmhloNTY2pGZ3iBgpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn6djFmYo2+2vLG8gnmafU51foWOjYuGjZSSi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqEf4J9oHiM3Myz1rGeuLxlYnJhYIiLjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRjH+IjYyLi4iSippos8m0yNSvrrqndIupaliIi4qQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZGeoZ2Tl5uhmp6co6OTb6mbkcK+trGYjXddyppVgo+LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqqmzoIeQeZSslIyPfXlyZ52cY3idoqSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKlqaenqaqOeFeDjXt6gHBua3N2fH12oKmnoKKirqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSoppqdpKaioamefGhLaXRucHhqaGRqa256hJako6Chn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kho6ehpq6mp6evhGxiS11zbm93Z2JjZV9eanR+jpuioZ+doKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqaKgoaiprbCztbyylm9lXEdWdnJzfGdhZGpaWmBjbXh/ipmioqGimZaem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbWlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6uqqK62uLzBw72vmXtlZFtAXWxueHtrYV9nW1hgXmFmcHN5gZOiqJ2eoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrs7rG0NrVxrioln1nYmNVPV5qbHZxcmRiY1lXXF9dXWFoamtue5KlrqelmaGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWl2a3BoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tb3S4OHQuqWSg3JhWVtbTz9XcmleW25sXl1XWVhaWlhZWVtkcoadusi+t6Gnqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllUYWlgZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8O8w8jO1NDAo35hVVNVWFFGSYJueoN/XlZYV1xbXVpXYHycsrzAxse3t7epr7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdubVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TBxcjIxb/FrYplVlhVUUlrdaOso09VXF9hXF1skLHEvL2uqbK3q7WyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8foR/amZoYWtsZ251cnJ1cWdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QkJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/Ew8bGwLGUxMjSu4tmVVZRVmairp1OVldYW2eHs7eusK2ypqqqqqutrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dWtsbmRvbWlxeG96amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTExLm0wLazvsbIsIBaVFNQmbGRR09WWXGOprywpa20tayvpaWjp6SgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl5e3dua2lodlpncnhzeWZmXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPEwsW+uL3AwsLDoW5VSo22hUVLWn6hoqe0sq2suLWzrKmjoa2prKetn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWZpamheam9ueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx7/Ex8TEyMvGrHNfdl9LV5a3ucC9vrm8ury6vKytpqm7urm3v7K1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3Zpamp0bnlsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc3FxcXDxsXIzNTMhklMV6DJwcjNxsTBxMfBvL60sbCwwr6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdga2p3bGlmdW90Y11iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXCw8HCxsbGysx7R4XOzcfM0MW2v7/AwLq7vbWzs8C/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWdjamRia21ub15ZXVZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK+vcHAv8DHpUqf0szFydHBr729uLm7u763tLG5vrO8vrG5tbi7try0tbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWNjZGpjZ2NbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8G7v8C8u8S9usDEv728uLzAxa9Pmc3EwMHJv7DBv7q3u765tbi0uLy0vbi1tLCzvLG3t7i/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFiY2hqZ2dpZWleVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1Y67v7vDtbrHt7a5u7y4ubW6xMiqUJHJv7+7wb65xr3Cv7zFuLa3tLi2tru7uba0t7q1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1mZWZwamVraFhZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+8z8V5rMy9x7e5uK22tLe5s7WyusXKnlKIyr+/vr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d9a25xZ3FrdGZibmBcVEhLS0RKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNeudoS9yM/CwLiutbW7vbe5sb7Dx5NYg87Dwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcmZsam51b3hjZ2JcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCx8nRmXN2sNHRzMrEtbq/xMi+vrS+wL+CZnjLxsK+wby/w8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgnRvbGx0bGxuX2NeYWJOSE4/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDCur68xL63vMC/yc/HyMrKwod1dqfMzMvNysbCw8vOwby4vLqwfXdrvMjEwMC/xMDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh7bW14fGBxZFteX19UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7us28O+tr7Avr66ppyqs7fDwKZ7eXuexMbLyMHDwMDJysG/u7mxo5GFeq/IxcS/wMG/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem5zeHRocF5cX1xaUUVFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8W3ba7Ovba5wLyqfW5obm10gpeZdHp+mr6/xsC5wLy+xcS9vbiyrqSnkpKdysPDvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdtdntxb2pcYGBZU1BBRklHS0BFQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNsnaCs722tcGkhmlaXmBOU1tccHV5hKO4t8K6s7u3u72/uru7r6KorZ6kgb7Fw768v7u7uLbBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnZ3b3JhX2ZdW1VKPT8/R0c9R0NDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaeEeIuhsLWcamZnVllfSUlNUFRueYmpsLe+ubK1sry5vLa5vrWWqryrsXesysTAvb+5s66yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdXd0d3JsYGNhXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8aph3t2jKGYX1NDWVVIYmpVT0VKY5Ckrq+2urW0sqy8ubi1uMG9jaK+r7B2p8vCv7m6ta6lrLOxprCtqJ2gn6WttrXCt7a0paiqqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnNuY15nWV1dU09OQT5KQkBKSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/tJCBeYiQbk5LP2VZQk94gZNoTUJehLG1s7WytK+su7q4trm/xXeKtKeeZqq/uLWysa2tn6Smp52kpZyWmZmZn6muuayrq5+lqKSrrq+nsKuvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0tq+qsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVqbF1ca1VdW1BOSERHTUJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiEfFhGQU+HWEpKWXiOg2NBVKO5s7SysLGtsLm4tru3u72So7OupHSssKmrraujqKGdnZ6Xl6CVkpaXj5ifqK6ko6Sgoqaio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHV0b2VVYWRXXVFPTUhASVJETUM9ODg3NTo3PD46Oz04OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K8qZiZlWhNQFN5cVBJSUtonIBaRVSvu7Gss6+urK22trK0ta6pp5+am56fpqieoKipn6GnlpuWl46dlI+Qlo2Xm6SooKCioqGlpZ2jo6CepaCkrKWmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6bmaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6ahiHiDfHZ/emN3bG5dUWlVUE9HUE1MQ1BRQD47PjQ5OjU7OT07Ojk8OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcKqpbxnRFObf1FYSUthSlaOYmVkgq+1qrK0rqqrr7Cys62lnZGXk46XoJ+ioJyjpJ+eqJSblpeMl5GNkJeTmJ2jqp+fn6Cjpaicn6ChnKKfo6ionKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclZOQj5GRmZCWlZiXn5icmZukmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn58f3V2fW5re2RoVlJkTkpIR09TTktOSDxFQDwyPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoKrGv8qfT0FzmHNQbkpMY2Z1dGBcYnORsq+us7WqpqyropuZlI2RlZaYmJyfoqKcnaSemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoqWimpmer6iusqulqqqgm5iYmJWTlpqTlZWalpuXl5ihnpyclpuhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eXxleXlgYlNWYUhJSktTVElTUU05P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZylxsaMV1NKZqRaZn1vcltRa2NcZmJgbJG0sLC4rKahnJ2alJeamZCOkZWRjI6Nk5minJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Ggo7GusrG0qrKuo5mcnZ6hmJubmpiZm5SWm5aZnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaIJsZVtTWlpNUUpPT1ZNU01CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6Kan6qjjHlVaXJ3dXBjd3ZYV2NgZGlaWldnra6sr6efnqKglpCTm6CbmZeSk5+coaObnpuWn5qfl5uinqWhnqSfpKitraisqaSstLe2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztrizuK2ytKSgnaWgrKGhoqGgmpiWlZ+bm5iloaCeo6GgnpucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYKAfXh2and1Xm1bUmFJUlVIRlVXSkNNRz1LSDhGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoKR/b4JwYGNYTFtSWkxMUVlSSE5OSJmsqqmkn5+ZkpKUmJiWlpWMiIuOlZ2cnZ2el56Zpp+gqKWxqqeuo6uutrC0srGutri9v7qttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q66xubi8r7OwtcK8t76zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6iopaSenaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWFfnZybWl3bWhtXFhcQ1dOSkdNR0NGTTw+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco56ciWJXXmVgV01RRz0+QENEPz5CUnipramqpZ+en6KjnZ6dmpyblJOVlJ6dmJSFnZqgmqukq7KwubKysbKxur28vLm2uMO+v8K/tru7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGxL3DvLezqrOtqrO0r7Ouqq+jnayotrGto7CmoKOwsa6wpKWvo6GgmqGmoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXx0cmtrdXJxaFZcUUZVSERKUEk/RUE0Rkg5NTw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmqCflXxfXmVgUUZEO0M/Rjw+OTZOfqqzp6OjoqCepaumnpiclJGZnZmVjIqGiIZ4bYigpKKrrLS8tsO9vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvsfGwrfDysrDwce/urS6u7W7t7C2sqq6sq67uL+7uqu4rauquLu1vK6uuKOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtkaW94a2VZW0ZLTEVEVE1FQ0U3Oj86NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pj1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1yaWFXTkU+SVp8b2FBPVyOrqygmZubnp6Zl5eYko2Pl5eTjo2QjIKDgndycW1wj6atrrS5xbvNx8u+wczNzczHydHMzMzHycXGzNDS1c7Tyb3Av8O7xsXIxdHTzdTQ09PMysLFxsbKyM/AydHMx8bIxsK8w8G/v7+2vrOtv8DDw8fFx8Svv7myuLzEwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dHNlYmdyb2ZeWlpDTkxERlBJRENANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT88QD8+OTtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnpVpZlxUSURAP0uGnqSYg6CyraOenJ+amJeUkpSWkZCPjIiEg4iHg4CBgYB5cXJvbHmktrq5vsvB09HTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19LX0tXW09TIzMfMzcrTzc7TzcbJysrCxszHycnGv8Ozs8jFy8vLz8fKv76/vcHGxc3MycnAw8Cur7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5aQjIaRi4B7cnV2Z2NndmpkVldRRE5GQElRQz5CPDoyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGbYVNMSkRDP0NSsNK9sq+mnJycoKShnZqUk5WUiX14cWtlYmhyb3F7hYqAdXBucXRwhbPDvsXR0NfW1dLWzdTW19TT0dPU1NPP0sTQ09bY1dbSy8nO0cvGzdHK0tXW2dbX09fYztLKz9HMz9DM09DAycjKxMzMzM/PxcfItsDLwNLNzNDGysnAxMPIzs3Q0c/Ny8jNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNgZXJjXVJcSUpHQUVJSj47QTg9NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaCioVlJQEFEQUZRdrKvppqUl5+cmqCgnpucmpWJd2ljYV9fYF9eX19dYWx1c3Bwb2xycXWSxMjH1NbX19bT1tDV1NrU1M7P1dTU0dHM0c7T19bT1dDP0tPRydPRyNDY19jR2NLX2dTVzM/Pys3Sy8/RwMbDyMbPztHR0sjMzcDLzcbTz8zOyMTLx8fJzMrU1NHVz9LM08K5xbGlqLWup5uoq6Wdsqiws62sk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1iY2ltX1ZQX0pKQ0ZDUk1APD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48P0A9RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fY1NXZ2dHO0L+8zMm2vq6mqqiho6tlQzg9PkRYgqqon5eVl5manJ+dmJyckn1xZWNiX19hX15hYF9gYF9gZW1wcG5rb3J3d5zMwdPV09jY1tnR0tLXz9POy9LN1dTRy8/N09bS0dXNz9XV0cXR1MrQ1NXWztPR2NfX2MvIzsTJz8zKzMDKwMnKzs7Py9DOzszPz8jM0NDLzsvDysfJzcrM0tPN09LR0NDKvci5sK67ubWrtrCtqLits767sZqPoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcG9rYWRucGFXXFpJRkZETVhFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSxekhGQjtXjaGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGBhXl9fXlxibXJvb3N0dnZ5pL/M1dHW1NPY1s7O08vOzsXOytLSz8fOzc7UzM7SzcvX1tDM0dTLzNDS08rO0dXS1dXKwMrCxc3CyMrDzMTGycrLz8vOzdDO08zGydDNyMfLxcfCxsrMzdDSx9DPzs7M0MXHwbi5vcPDvcO4srK+sbvDw7WqmKWhmJaSlZWSi5SNmpGUlI+PlYKJhnlxcmttZ2BgcWhZWGhWTUdMSVBRQjtDPjs2ODo4Ojo1Nz09QDs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/Ozw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8O4ytXW2drb2MzMz8jW1cTCta+0qJ+tl3hscHF5j5qNjJeVkJORkZWWlZCLfGVhYmJgXV5hY2FgX19gYWFgX11bXWdycnByc3Ftcnmlx9PPy9DQ09TKxcnJxsa/w8XPzsfFx83K0sjLzs3G0dLQzszUysfLzs/Hx8/Sy9DPxrrEv8bKvcPIyc7Fw8fAx83IxMzLzM/IxMTQycbCxsnFv8HHzMvMz8LLzMnHy9DExce7x8PIycLPwb28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Rka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62jtn5og4Wkq5ONjZaPhYODg4F9hIR+c19bXl5eYF5gY2RjX11dXl9gYF9bWlxgbHJxb29rbG9vfbnRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMrJyMrIwcXMxsjKzcnEwsvJwcHL0MXLyL+5wrvGx77Axs/LxMDDu8nHybzJx8XKwL7Cy8bFxL7Gvb3Bw8XMxca8wMnDxcfSxcHJv8rJxsjG0cPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Gmm6Ogm5V8d3N0ZmlaYW5tWlxYUkRMRkJHRUxERlNANTQzMzU/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2tjZz8vSzc3OyMG1w76xr7ZsXnp9oZGKkpaGeoCFhX92eHVycF9bW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWtwb3OPx73KxcvAxsKwtrqysrOyscK8vLy6uMHBwcS+vbm9v7nEysXGwr3GwLi7xMm/wcm7t7u6xsO/vMLOw8a+vrXBvcS7vce7w7q0vcbEwsO3wLa2vr+7zMO9trrIu7++y8PBxsLFycfJxtDGwszIssfJw87MwMXDv72yt7Cyp6ioubClrbCqrayUenZ3amRnYGhvZFZeWUpGSkZIS0FGQkZKQDk6NjU4ODU0Ozo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKycbNzc7RyNDG1dTV183KzsXJxcfBucW9q66mYGR1g5OLiIuEeH+Ghn9+hHt0dGNcXF1eYGBiY2JiZGViXVxbXF5cXl1aW1xeaHNxbWdnbnByeZ29zMDDusC4rbCxp6qtrKe4tLa0s7O0u7a9sbewta+yu8K8wcS8v7u1srq+wLjIubS7t8HCvbi9x8HEvLWvsra7v7TFt7u1q7m9vsC9sbu2sLe6s8a8t6+7v7W3tcW8vsPFwMTFxsfLxcDGxrvHy8DPycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMnIysjKxNDN0s/NxcfBxsC/urfJtqqwmVtncIqPhYiJenh+hoZ2d4F8c2hdXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5pZmptbnJ8pMfAuLi1sKusp56iqaeeqqyzraqsqrSttrGzqa6nrLO7urbDubq6sau1ubu0wrqwwLG+vLu2vMe5w7atqqiwssC2uL2wsaexs7W7vKyutqautq67srGqubCuu667uLvAwL66w7/Gw8XAvMbBx8u4xcfFv8fDw7rExsK7xsnMy7O5wr27s4lzdnZraWBibGlZV1dbQUxLTUpFQUNARkE6OTo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxNDHzcHDxr/ExMPDysLJyr/AvMK6s7W1w66qsJJban+Sh46Pe3h9iYV6e4SBd25eXVxcXV9gX19kY2JjZGJgX11aW1paXVpaWlpcZW5vaGZoaWtucoGturC1rqWkpqaaoKSgmZylq66kqKKrqqyrsKOmn6qttLaxvbmvt7Corri0s7y4tLyvuLm2srzBssGupaijq7Gys6i9qquoq62utbSmqK2hpK+psqaoqK6mqLessbO3urq7sry+vr7Ev7XCwcfIt77AxLfEw7+7v8TCvsTIzMq/v8PAwKmHc3RzamlcYW9kV1ZYUEhZUlNLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzcPHubnLwcu+u8m2vcO+usq3wcPBtLa8trGvtbutqKuSZG2Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX15dXFpYWVtbWVhaXF9ma2ZkZ2Voa29yhaqlq6WenKCklJ2kmpeRoaKpo6Ofpaanpq2gnZykpq2ysLa3p7GtqKq0q7S6sba2rra5s7C6urG3paCkn6axqKypuqqkp6eop7KtoKinn5ykpqyfn6ekoKGxra2ssrSztLC1vLa7wcCyu77DwbG5ucKzwb7Atbi8vb68wsfFw8S/wMSghHhxbGJmYGtvYFRZX0hOZ09USEZLRjw9QD06Ozs4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItLa9uLrAur22oJ6UnaGmurars7O7s8TPycvDxri3x8DMv7jJt7vFuLPFuLO/wKy1vLKspa+zraGjkWlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYV5cW1xcWFlYWFhWWFteX2RjYmVnZ2drbW+InamflZWaoJWaopiVjJ2hoqecoJ+kpaKnnpujnKCrsK2xtaSpqqqsrKS0uK23sKyztq+zta+wqp+en6OisqWmqrmtoqamoKitq5mgoJ6ZnZ+lmpqjnJyer6mrqKqsra2wsrivuLm6sLa8u7qrs7K5s720trGxtrW/tr3AvsPCu7q9l4R7c2tfZV5kZFhUV15JV1xLUEdKSkdBPD8/QDs/PDA1NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765x7i3vreywrSxu7usubqxop6pq6eYno9tfoWGf3hybW9ta2JeYWZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZmZmaGlrco2nnJKTk5qWmqCVlZCboqGonpydpaeipZygoZuZr66ur7KhpaOuq6eitbCysqypr7OnurOmtqGjn5ujoa2joqq2q6Ojpp6lpqOWmZ2XmZudoJqXnp2dnK2hq6ijpKatq7KzqrWwsquyubSvqq+ysrO3s66pra6yuLG6trq9wLizsZSGenVmX2ZeW1lWU1pVS1tRTEpFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7OdpaOYpbHCtba9rbS4wczIxr/FtsHAx863wMS9s7m5sr+2sbm7rbK0r5+apKqglJqPeH+DhH94b3F0cWhlY2hkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oJuSk4+TlZaelpiTl5+doZyWoaGppJ+fqZ2cm6unr7CrnKOkuKqhoK6otqqnqK2xpLiwpLego5yZmaqnoZutubCjoaScoqCgk5ShlJaWm5mYlpeclZ+pnqmkop2jqqqxrai0rKqnrbOwpauus7GwsK+vp6iosq6ytbC8tLq4rqOVgnp3ZV9hVllYU1JUS01eTFBMR0hMS0U9QD49Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+t72unaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa68u7W7vLW5ubCvsKqcmaGplJGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiYmNmaYCUkZOLkJKTmZeclZWbn5yflqCgp6akp6ignaCmoKqvpp+io7eooaGiqLOipailsKaxray1nqGdlpWpoqKUrbKxn6Ojnp6Ym5OLoZSRk5iYk5eYmJeep5unoqKapKWlq6SlsKelo6usraaorq+vq6iqqrOmpquvtLGvvLaxr6+gknt4c2VhXFtdWE5MUUhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6lpqy3u7zBxbqxubXEycnAw8bFx7bFxLPBv8Wrt7e9tr26u7Wyq62omZifo4uJdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWlpbWVlaW1dVWFdUVFZVUlRSVWBhX2BhX2BhY2RpgJGRh4+NkpCSnJOVlqSZoJecoKWiraalpaSko52qq6Wan6WxqqChnqWrnqiin66tqamuraKiopWYopuckKupsZyfop+fl5iTiZ6RjZKTlpCYmJScoaOdpKGilaCipaabo6uloqSqo6uupa6yqaalpqa0pqqorbO1tLm6sKqsnoxzcXBgW1dWVlJGUE9IWlxPUkpUTFNMRUdKRDg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsq2dqKevubmzwMm6tcCvxcjMusHKzMi1ybyxvcPJrbG4wbW8wLy0taqsppWZm5uIgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxcXV5eX19iZG2MjYKPhI6PjZiSk5KcmqKcm6GpqauprKeppqSZpa+llZqlr6mgnJmboZ6vmpyrtKCmpp+jpKGUk5uWlpKpqq2anaChoZuUkIyZjoyRjJKNlpWQnqKgo52co5WboKOhl6Koo6Ooq6Crr6SuuKajpKOsraqoq6+zt7K9tbOrr5iFdHNoW1hZU1VSRVhMUVtYTVVPUUxRUklOSkM9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MDE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraezt6+op6+um6morLe2q7zKu7a/rMvGxbjBzs/Is8S6t7vCyLGtuL+3vL27s7WmqaCWl5iWh3p0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05PUVlaWlpdXFxeX2BlfYqAiX2Kj4iQjJaRl5mioJugq6qmr6yosaWpmqCtoZWWpKinnZiQj5qerpeZp6qZoJ2UpaGfkpGSkZOVqKulmpmZnp6WjoyLk4aJjYOPi5KVkaCeoaSZlp+VmqGinpSbpaaoqKigsbCmsb2ooKOstKuup7C1sLm1wLGusauRfnJzYlZUVk5SSkdWUFJSTExYTkpMT1JHTUtBQ0ZERD5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY3NjEzMjEtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/tKymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrG2t7y9wcOxsLG3rbS0u7O0oqOdnZeXlIOAdmtnbG5xbnJrcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVFJOTk5SV1haWVlZXFxdYWp+eH1zh4yFjoiXiZSTmJuYnqmboKumpqyeqJqhppyTj5+jmpeXhYSSm6SQlaOdlpaWiKKbm5SMjoqQmqWnnJWVl5uRkoeUjouBjI2AkIuSkpKgmqCilpSZmZWippmNmaSmqaahoLSyqLO4oZyjt6yqrqSysqa1vLWrrLGjiXlzbl1OUVFMT0ROTk5QS0ZOTkpKTk5RSU1KQUhMSEhDPjk1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKiktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLexpaekqqWgqaaks6qissO1tbKzxsa2usPKzMazrLm9tLjAr62psJ6mrrqvrZ+Zmp2VlId7g25fX2ZycHZxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYW11hbnB0boKGgYd/kIOOipORk52hj5qco6KkmaWXopyVjYiZmoxzjYN+jpeWhpKakJSOjnuZj52Mgol/ipigo56Qk5iWhY6DlH5+dIqOepCHk5CQnZuampKWkJ2Oo6OOiZqgoaSkm6K0r6ywrZ+ZprimprGhsK6csLyqqa+qmYN3c2NWTVJPUE1DU05MUE1CUFFISU5TTUhKSkRLTUZLSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0wMjc2NDc4OTo6NjU6ODdBN3i3oaO0qaalqKOmpaamprOnpbTBuLC0sMnEt7nBzsa9s6y6waytw62ooqaSnaa2raOgj5WWkpB9d35mV1ZfZ2ZpZ2huY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkhOVFNTVFVVVllbXWpqcGt9g3tzTlhyj4KXho2cl4uUkaCZnZWUlpWPl4qAlIlfO1ZvfIyUiYCMkoyQhoZzi4WXgXmBe4aTnZSDlY6RkIOGfZN4cXCGjX2KgZGNj5eamZOLkIqdiJ+Yh4iWnpqhoJenrqmtqKiel66zoqaumayrmKi0o6mto5N/c25fW05TUldMRFRKUE1MRk5PSUVMUU1LT0pJTVBGSUo9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKCsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjrqGmpqqgpqmno6mvqKe0wrmwtbDHwrezvc+/ua+utcKnqsWqo52Yg5ScsaKamIaUj4uHfXN1XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNTlFNS0lGSE5RUU1PUlRWWFpgbG1neYBzUEI/f5WSkX2IlYyEio2bjpaVipKIhpWHeYl/YEpRbniLkoR+hI2LhYB/bX9/lHd1dniEjZpwUY2IioZ8fniUdmh3hoh+iomWi46Rk5eMhIqIlYSbjYKEkpqWnp2UpKOoqaWknpyxqqGkpJGmqZaiqpyipqiJdm1mXltIUVFTTUlVTVNJTEtPSUhGSk5MTVRLUVFPR0pEPTc2ODo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykqKiw0ODMzOTg5Ojk5Ojo6Oj85d7aco6edn6Gvoaeopaeor6yqtby2uLazwbu2qLnIuLaoqLW2qrK8p56WjX+KlKiWlYp+joOCfXdwb1hNS01NTkxNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUpFRENJTk9oWU9RU1RVWm6CcnV9aWhcVJCJlIh0foaBfIWMk4KSmouPe4aPgHaAeHNvdnF0jo6Ben6Kq4R6emh2e45wcm14gYuNknh7gHuAdnNyknhndYWEhIV8lYqIio2LgH+Ei42AlIR8gI+YlZyWkZ+dqZ6foJ2gqaWenZiNp6SSoKCWnp+kgXNoYV1dSldQUkdLWFJPSkxNUkpKSkxQSExRTFJUTUZJQjw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwuLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqqWtq7Cxqr20sry4trq0sZ+3urKqnZ2sqaiyr6KakY2UgY6cjpF+doZ4fHZvb2lYS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedIJ7eGZ2jJaYjY58Z3mBdniAiZB9hJiSgXGHj3x3e29rfq19dJCLf3uGkoB8f3RmdnyGbG9oc3yJjIeAbXlxfXFtdo9xaHGBfo5wRIuFgoOFf3d4eoyGfYx7dX2Oko+Yi5Kam6OWmZyanZ6hnJaNi6Wajp2XjpaYkHhvbmdjW1hYVVFKU1VUT1BOUVZLTktPT0pST0lOUExGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNTExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpahprCsrquoqbGvsau8uKy7vrizrKebsKesm4+WnaWppKGYmY+FknmJjouKdXF7bXVwam1qWEtGR0VBQENESExMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF1lcHJsiKeqwH50eWJ7eG98eYmQen2Lhm9tjJJ5dHlqaoCCcZaRi4F+loBJkpluaHd+gm1qZGx5hZCShmxybHxucnyGaW5wf3ONiYWGe35/e3dwdHSGgnmBeXB8joyKlIOWl5iakJKWl5mXnZaMg4mekouSjYaQloBvam9vb1lWWFRSUVlPUlRUUlhVTU5ITUpNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WssKOtqqi1r66stL+rvMO/paKalaSYno2Ei5ShoZiZkZOLc456gIaMhnRvdGtwbGRsallOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcX6eHYZppc3llfm9tf3qLiXaCiIZ0bJqSdHR8amqdj015hZOJhI5nMXaHc2x+foN0ZmV1f4SEhYBnaWx1a3GAfGhxcXxuk42PfHR+fXFxbnZtgn93eXVqeYmCiImDlpKSkIuNkZSUjpeNgHmIl4iGioaAkIh3a2twaGZYUlpXWVlbTVBVVllYTklIRUpKSEdDQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW6SiJqRmZajqK2esZ6nuq+rsrDCsbvDx5qWj5SZi46FeoSQmJSNkIyPhnGHgnSHjIZ5cHJwb29kcGZfVEZJQz88Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7KgcXt4bH1scYKChYF6hIaGeXKhlXR4gXN1lIc1cZ2onY6hoYSihXZwh3yHfHSMro2JgWhnYmpucm1wgnVpb1h1cI6bkndtf3t9bXJucIB7c3ZuYnaDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY57c3FxbWBcXV5bWVhgX1JOW1pYV0xISkZKRz9DQUJIP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnn6+VpbSprrGuwbK7wcWWkIyUj4CIfG6BkJKJg4qHj4Z1goRslYiIe3R4eGx3bndjaV5KUEc+PzY0NDk7Ozs9PkBCRUhMTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHaIiHx+hYN/jH51opp6foaBhJmEm5xhhqqfnYuDkI56d4l+iYiOc4uXj4R7XWVxdHp8d4ptaGpieW+FkIJ6b4F4dYV6cHR5eGtuaV12hnyHfIeHjn+KkpeDjYWMhn1xhH+EfXV3e3yJd3BzdGZnYFtbXlNbZ15XUFRYW1VHSkpES0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJGcnZ+mkaCqoLGor8Cyu8W6lo6RlId7hnZrf4yRgn2KhI+MeIOAc6CEin18gX9wgH56Z3ZrUldMQEUyMTEzNjY2ODg6PD5BRUdGR0pLTU9RUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaISIe4l5fHF8j4x6fYmHfpeHdqGaiIePkpSlja2qSIaur6+LgYCTioKLgoSSqYeAmJiKnHRtfIGGh32OaGdoeX9uhYeChXGEhkdsgHdyeXZobWtfdn2CiH+HhIt5lJ2ciYuIkX96dYt2fHhtcHd+gHR0cmxbXl5cY2NYZ2VcVE9QVllQRExLRk5JQ0ZDQ0BAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkY6Wl5KXoJ6toaa4r7O9s5eNkouYi310cH6Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0+P0JFR0hKTU5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU1QV2BYcFlcXmmNk4eVgISChZGTfoWIkYGalYKhoZiVm5umrZOau7Gnu8fDqIuMoaWPlIqBkXxxg56fkZx/doaFi5CHkGlocISBdI2HhIpxhoJ3h397doV9bnZ1Zn+UjoeIiIeIh6CropaJjpd/eoKIeXlvZ2t4f3t/dGxlXltbXmpeYmdgWk9LTldSUUlQSkROR0NKRENARERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmd4N7gIx/gZCOipqbpJ2hrKarr7CXkZGEoZSEeHd/jJR8fpKFkpV/ioCSm46DgIGMioKJjYN/ioBtcGpdQkA0LS0vLy4uMDIyMzQ3Nzg7PT9CREhJTlFSU1JTU1RSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJTExLTlZgY39nZ211nZuPmpKTi42OmoiTj52LoKCSo6qlo6yTqbaiqMHCrseveLqUmnyNoZ6ZhJOFgo6in5OYkoSKhY+ZkZZscHWKjIKWjI2Od4+EcW2FgYqWkYOFiHGIoJaGkomOj5aktambjZSig4eTg31/a2prfYGCg3VjXmRgW2dsXWxsXldLR05SUU1MTEZJUENETUZCQ0VGQj05OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcXaShn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReX+SiJGSfYqEmJKQgoCAi4yJhpCHhYmFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5QUlRQUFFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6elopmhl6KUnJ6onqirn6isqaq2l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqbmaeRkYiVopubeHp+lJiSoZOXl4GUnnt3lZKrsomNl598lJ2bjZKVmKOipravnZGZqIeWj42BiGxzc32BfXNpYF5iYGJoZGBnZlxSRUpLUE9JSUxGRk1DSExGR0RCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImLioSShYOGiYGAhnZeYlA0NjAtMS8sLjAwLy8uLjAwMTU+QUJNUVJTUVJTVFJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk5PUVlthZB3lYqjp6q0vbikraysp6i0q7C2srKtu7GzvZyzw6u6ycu3w7+4paKws6ytqqOLlpiFpqago5eBppmNoquopYiFlKShoKuhpKmPm7CLlaOmt7uboaOwkqKdop2Qo6Grr6yytaKUpKqImYmSiZV6en6GgGliaV1mY15kZF5nZ19bT0NJSFNORkhMRkpHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGNXaW9YeoV2gZOFh4Kbg5KQjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkI6DhIGLhYaIkoaChImGiIeHcW5hQEU2NDwzLzExMC0sKy0xLi00P0NBTVVRUlNVVVZVTltQR0hEPD4+RkhDRUE4Ozw1Qzs9RktJR0hRT1BXgZKghK6js6qywMfDqrPFtqyzv7O4vra/tMG2u7qjuMWotsnHtb65taijtK2wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqK62u7K6rK+1orGrsbW7t7WutKCnqKOnmqmvrbK5t7inm7aojKSOkZOfhniChHdaY2VXZ2JiZGBhZmBbVUpERExVUUhJSkRJR0VBQEBLREJNRzw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtaUWJjV3l1cIGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomIeYaAjJKMh4SBjn+BiY+HgIaIhYmHkXp4bl1WQEVNPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcVlBfVUlLS0FAP0dLRkVEOz5AN0Q3P0JKSkVGVlNQXo+kraOxtMO2uMHMyba7xL2zs8C2uMG1vq+3dLGzpbrEpLDGubGzsbSopLW2qrGgopabopKlsK6mraynpJigrLS7oqiyurW8v8y/xcW9vbPCt7m3v7e6t7msrLClsKmtvbC8usLCrJm6qJOtj5eXqoh9g35sWGRiWWtmamZXXGNZVlNJR0ZMUUdDSElBSEQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1NZVVp2am9+joSAjYRuenN4h2K5oZmiiJSUlpKUk42QlpKHhnuGgY2VioCEgYp6fIuHhn2KgoGKg5V9d3p1ZVBcZEdFTDtRY2FbXlNGPztIUEVaY1FSWFhaZ1lUYGBMU1BFQT9JSkhFRUFAQzxFNkI+SEdKTFNaVF2Trri1urjIv7q9ycy7vMC8t7W7ura9tLqxxmB1sqSxmp6rvaqlqKurpKKytaCrp5+Vlp+Yn66lp6aln6OUo6extKeys722wb7TycnTx8PFzMLKw8C+vb67vLe0r7i3tsO5xb3Cx6+euaqhq46kqLaIgYFzYGNjX1hiYGpnUlhgVlFVSUVFTktAPkdEPUpBPUJAPUY+PEhANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3MzQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhY9zbHJzc4fVwLWZoI2VmJmRjpeSlpaOhod9hoOMlop+g3+DeHuLg4d8i3mBioKXfnN9emtmcHVZXVxQZWRiYGVkXVtYV1xNZG1VUm1tX25fWGdkVVlVSkRCS0pIRkhISEdBSTlEP0hLVFRWXFpbk7nAuL23xsC7ucrKura5tbi5sre1tK62tplkdaicrXBeoqycmKCim6Seq6WUn5+QlI6WmJenn6WfnpqZg6SdrKWqsK24sL251NHO1s/JzNLMz87Kxr++wsq9wbzBwMTExcq+yM6zpLuwtK+aq7i7mH97bV5hXVpfYVpkY1BbYFNQS0NBRUZFPEBFPkFIQUBEPTpFPj1KPzM3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTREM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRXFloX2+WkpCUbmxvdXWHs6yhoJ+LmZyZjIyVkZuShYqKfoiHjJCLiXyBhHN7ioOFe4l0goqGlX9ze3lsbXV7aHJlaWxpZ2ppaGBmaWlsWm1zlq2kvIiHZ1tvaF1aWlRIS05PSktQS1NRSExBSkdKT19eYmZpYZe3x7C4sru9tbHExrWwuLCvu6uysaert6uNtaedmqeaTpqdjI6flpGmmKWVipOTiZCJkJGRnZuhl5qVloeemqebrK+osKe0tNTU1NbSy9DT1c3Tz83FwsnQvsnJysnRx8zNwtDRt6/DvMS5pbW6wqKDcGVeXl5ZYVhaZlpRXVdPUEJCSEVCSDtBQz5BRz8/QTg7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVZzkJCYgmhxb3l5g6CqnqWWjJqbl4uNlZGajn2Ji4SNioqLkId8hIJwf4iBhnuHcoOSi459cXh1bHF4fnF7bnhzbGmBcG1jam1weGl3fH7Lv8Hfp25jeG5jW2FgSlBSVU5ZXlBdXE5QTlRRVVRcbm12gnGWrbistKavtqqsvMCwq7SmpLimq66gq7SjjrGtmpeYjJGTkYSOm4GNppGciYOLhIqJhIuDlJWXl5OckZyYmZmfnquspKeirK3P0tXRzczS1NTQ1NHOyMPU0cfN0tPT18zR0cXS1sXAzsfHwqi+t86ee3BnX2ReWGFTXlpQUVRQT0g+QEZBQkU8QEI+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU5adYaFindsd3B9fn+hnp6hi4yYk5OLjJKPloR5hZCQjYqJh5GGfoF7cn6AgYd6hHWFk5CIf292cmtzfXt2e3OBeHJqgHNyaXBxenlyer7Lmn6MsoR2coR2aGFrXUNaWltWZWNYZGpTWF1dYGReY3h6fouBmKmjpKGfoKilqrC4qqWzo6GtoaOtoaexn4mmmpOSkYmRj4iBlIlqlKKMmYSAhX6Rg4OTlq2LlY2Vmo6GkpGel6ewoaChpaSoyM7PyMLL0dTS1NLO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsw8LLjHRwZWJhWVVaVFxQS0dJSkpAOzo7REFEPEJDPkdCPkJCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnZWdlIWLlYmPioiNh4+AeISUmIqMiIiLiH6CeHN7fYOHd396hpGVf4Nud3BtdX91eH10hXx5bId2dG59doR1eHydtYw7QYvFpX6MfGllV0lDZmNlY2dqZG54W15maGtuaW6Ag4iRi5ydoJ2Ql5ieo6OmsaOjs5+hpZ2gqaCjsZyGnpKSkpCKjouGg4+EfpybjI2ChIV6lH6CqZWjjJGKl5KLfZeKmpKrs5ianKicp73Dxrm2xs7S0NLQy9LLydTO0NXa19fY1NnYzdjbzsnZ2tHWvsvLtXp4cGZeW1NXUltWRkdKSUVFPTo3OkBAQjpHRD9EQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzU0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfZeRnYt+h5KDiYaFiYGHfHiFlpaIjoOHhYZ6hHlxenuEhnV6hY6NnHmLcHxvb3p/cXuBcYOHgG6OenV3fXyCdX57hoevc1ipwraNkYJwbmI9XmhycHFwbnh2gWVob3J1eHF6jIeOk5GblZ+Vh4yTm6CbnqqfoKycoZqYn6Wen6uZi5qMkJGNhH2Ih4OFi46gmZOIhId+bZl5hJiGiJOMjZSMhnyciZSPrqqUlZifmaevtb2prb7Hy8nJzMvQycPSytTX2NfY19Xb19PZ29XQ2trR1sjUy5Z7fWppXFtRVFRfSENGSUg+QT09Nzo9Pzs9Rz0/QUFBREE+Pzo4NkRCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NjU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw6OkQ/Q0dSal5tZGJma3aAiHKRj5qAeoCNfoKCgYN+g3t8hJiNh4t+hYaAdoJ5bnt7h4J0epKejaB2jnWCdHWBfXSAhG+Bj4FvkoV0fICEenaGe4i3xaTBybiBlpqPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aUlY+XkIOJjpaZl5alnJeflp6TkZejnZmrlZCQiYyRgoyFiIiBhpCRnpuZiYWMgYaXeoiIn5ePiI2Ki4J9oYqRjLyhmJOXmZ2ppqaun6i2v8DAucfKzs7FzcnR1tXV2dXX29TW2drb19va2tjO3MaHfXtpa2dhVVhWVk5MRE1COz09PDg6PD45PUA2PT9APT8+PDk4NjdEQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTU1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiYySd3Z6inx+gH5/fIR6fYKRiYSFeoSHenV+dW18fYZ+c36SnpGeg5F8hn54jn14iopugpqAdJmGfYGIhHt9kHqPqY6Pw6G9i5yjnX2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJKFiYqQkpWPnZqTlJCWjYyVn5yUoJSRjY2Pin6Qjo6LhImSlpqen4mMlJKdkYKLf6WZiISNgoWEgaWHi4u4mJ2RlZaiqKGdnp2jr7e6tazAxsrQyMfMz9PT0tjT1dfA19jZ29ja2tnZ19u4ent6bWtnWGJcVFBPSUNMQTw8Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODY4OT89RFJTUlhfVlhmbW1taYGOinFzeYp7en98f3uHenx7i4aCfXSDhXlyenNtgH6EfneFnKGanZSSgIyIf5iHgJuSboeohXqgi3yRjYKIhJt9mpCKjKOioJCkrqCLkYuFi4GThldyrYufq5uPg5ibj4+OXIKikYKMn5OUjIaIjJKTjJSUlI+Lj4qHlpudj5WWkIqSk4WAi4iSjYqKnJaZoqOHk52WoIqJiI2ckIOIjn+Dh4akhoyQs5idkpWXoaGfmZKcnaiyuaymvcLHzcjGz8zQzM/X0NHUrtbV2NrY2trX1tnZn3F/dmloX15ZVFhZQ0FIQz8+Pjo0OTo7Nzo7OzM7Oz89Pjc7OToxOkg+OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J5bWJ+kYNvbXiLeHp/eoF8hXt7doWEf3NwhIF6dXZ2dISDhX1+kqakn6WiloqdkJSXi4qol3KKsY2Ep5KEmZOEmYyilZ+Yk4ianqOSqa+fkJWQjY6IloxujbeFmsTIspuhpZucmJaQspFkpM3HlY6Gh4mQko2Nk5SJhYqJhZaZm4+QlJOGlJeEf4+LmYiNkKqXl6OjiJmflpqIjoeXl4qEjo2Bf4iPpYmNk6mal5OXmaGZn5mTnZujs7Smo7zBvsfFxcnIycLL083N1KnS0dbW1tja1NPazoNzgWllYF9fUEtWXEJCRkM7QT04Mzc7PDo4PTY0OTo8OjgyPzk6MjpJOj02N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ1go59fG1+iHh6fnqBgYJ+dnaAgntsbop+eXx3eHyEh4t+i6OzqKSrsqGWp6ClpJaVrqKDkLeVkrOZjaGgi6Sbr6KknZiQp5epma2vpJeVlZSQi5ialqDAjqPJuKuaoqWtmZGbnLKdhoWoopyYhYiJjpWNi5OPh4GGh4iTmJSMi5OThpSYhoORkJx0kZmylpekoYicmpOPipCLl5qJipaOhn2MmZ+KkJCcmpmTmZiflKCdlZ+bobKuo6W3vrPFx8S9w8O/xs7KydKnzs3T0tDW2NLP2Ltze3deYldiWFFJSk9FQkNENT46NzY6Pzs8Nz00MjY2OTc3ND01PDU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER05bXFlKZ2E7SISKentthYZ5fIR4gIWAfXB4fH18b3OMen2Ce3iGi4mFhJKnvK2psr2vpa6zs6ijorCsipq1nqK4pZWtpJeprbempKOfmamYqqSvsKmamZyUlZGYoJeZu7utyaBptrirsJWYn6Krkpe9o16qsoKJio2Vh5F8j459g4aOj5SUiIeSlouPlY2LjZeZkp2ZtJaVq56LnJSSjZCSjJibipKej4uJlZ+ijpWOmJqdk5yYnpWioJScnKWvqKKls7irwsjEtbu9vMXIyMLRocbJzc3E1tbQy9OicXxqXlxVYFNRR0Q/PUNBQjg/ODc0PkY8PDY8MzUzNDU0NTRCMzo6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojk2Pj00N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZUhiYGNwSkCLin6AcoaHfIGJdYKKgn5tfX18f3B3h3eNgYd7jY+Mhoyaq8LAsL7Gu7O0wby0rKuztoyosq6uvaubuqSorbm3q6amoqGjo6qvsrGqnZyjmJuYl56ipaWSo7muqMC7rK2yuaWkp32IhpytvbCDi4yLkIOPg5GPeoGHkI2OnIiIj5eNi5WXlJCalpynm7GakaudjpmPko6VkJCWl4+RoJGIlZukrJWWj5ScnpShnpuZoKGUmp6op6ShpLCzpsHGw7Cwu7bFxMO+zafHw8fDvNbQzcTKiXZ1ZF9cYl1PS0NMQEVGPkE/Qjs6ND5BPT01PTY+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGdHYGlnWl1bk4yMiHuHi4aDjHWGkIqBbn57gn9xfoF6lXqSlJSYkZOVqLTHycDCzMHDuse8uq+rubuXsra6s8CupcCkq7C7u6quq6Kinqesr7WwqpugqpyinJafsLSni6O6urXBu6uonLKkpKiUhI6pw8SkgouOh4iEhpWUjXqDjJGPkaGMjJSRj4mYoJeTmZSXpqCunYyqnI6Vj5KRlZWOkJWRj6GUhpefoLOflJuUoKGZpJ+aoJyglJiep6Smp6SvraW/xMKuqbe1ycO+ts6yxb7Du7PRycjBtXd7b19aXmxUTklETUtLSUBBPUNEPDVBRDs6Mz04QjMzMjI2M0EwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmdcTWVcZlRjapmNlomLiJKPhol5hpOQgXJ/e41+d4eBgpB6jaGWqJqamLu+ycjKwtLJysLNvMGzrbu+p7q/vrzDuKzBqayzu72qsKmkpaOsrrSttrWgoK6fpaKYo7S9qZuovMGjtravq5KvrKqrloaaqaalkYKMk6WViYB1ipJ5hY2RkJ6gko6Ui4+NlKOZl5uUlKOeqZ+RpZqMj4+PlZaIfY+VkpKjmpWgopy1ppCfl6Wko6WfnqaYnpWXnKWjqaiisq2ou8DEr6Wzt8zAua7Ds7u+wbmtwsLBwJlwe2NbWV5cTU1OSkdEQ0hCQkFDSzo0REg6OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5rSV9YYVpkZVaej52Ol46ekomKf4mfkoR4hX+Vfn+QiIqQgJWgma6no5jDvsnEyMbTzc7Ny7zCt7C6vLS8yrzDwba3vK20wLm8ra+ooKmntq2uqbK3mp6soqehnau3uKmlr77Esb25s6eps7OtrpaVpaynoJGOkrHFp5WNfJGVfYeRmY+qmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi4yPj56IWpCXl5KWpZlmmaOfs6WWo5asraunnJ+nl5iWmJWhpKimnrasqbq8w7WmtLbLwbiqtqyzu7iuqLi6vbiDbnBcWlZXUEdLU01LP0FIRURHRkc4NUZNOz43PkFKLjMyMDI1QjU1UFdOO0xGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhXOz1AQkZCckZpSVJlYkxGppSclqGXqJaMkIOHpZKIgYeCnISDlZCRlI6aop+vvq6hx77GxcjHzs7O0sq+u7axuru8vs62xL23ubeysrWzuLKrppyrq7irqaiwsJejrqSnpKW0wLCqrLO+wrrAubOnuLO3s66Vpa2urqSLk5WhjXPBmX2WmYSOlpqLsZWampWSk5mZpqOVoJuWmqicm6GgmYuMj5adYEqWnJqUmqWXVJawn6+cn6WUr6+tppuhppSTmZmOnaCnopm0qaqzvby7q7Cyx8C4pqurrbGxo6GysrSkcnFnXlxQUk1FUVFQUTtIS0lGSEFDPjlLVD9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pWDs6QkNAPVJFV1JzYldGSKuXmZ+hqK6YkJeHi6eWjoiShZ+IhJyXj56gm6Oltcm0qca8w8TIysnIzM7Hvrqzr7m4wMHNtci6wLi1urGvr7K0pqObqrS0q6mmrqyZpK6lpaisur+oq7a2v8HAv7izssKvt72ro660rLiliJuXppt2vqCEmJyOk5mai66WoZybl5WboKGpnqigmpqqmaGnnpeQjZGdg252k6KalZ2in5CusqOrlamqmKuupaWgpaqTkpmciZWcop6Wsaeqq7q3vbOyrr65tp+jp6ilppycrKmpjWVoYmBTTE1HSE5KVUw9TURNSUpBQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlNhTVZIf2VeSEaslJyhn7uumJSei5Oqm5GSk4mrjYeinoykrJSjo7bHvbTBu8PDyMnFws7Iwr25sq+5tMDCyrbGscG8tburqa2sr6OimKq0uqaqp6yqnaivp6Srq768qKy8s7i+xry3tbjAsL2/s6m1tqu+pI+il5Gin7yfiZqgmZeenY63n6mcpaObnKGap6WzopudpZyoqp6ZlY+UmouXiY2kopScop+gta+lppOxq5qrrZ+fpaSqkpaVoISQnp+clamloqG0tbq1rai1srKenKKmmpeVmaqhnnhiX2FfTElHSE1RSU1FRkZCUkpIQURHQVZTREg8QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdFqJeknp7DrJuXpZeZqZyWmpqPqpaVqKaVrayZoaq2xMK8v7jBw8HIxL/Nxru+ubKwuLO/w8i1wLC8t7m3p6Srq6yhoJqqqsSipamspp6sr6yiqqi/uKasvbC3t8a2tbm4vrC+wba0srSvvqOWo5aTm5Stn5ChoaWjo5+QvqWpnaisnZ2hm6afvaKYpJ6iqauhnZaNlZ6Tn4ePhY2TnqSgnbWsppyWsqeZsKmgm6ufoY2alZ+EjqGam5KlpJqYrLG2saqlqq2snJigoZKOkJWon5RpZVtiXlBKSEtPTEhFQ0lAPU9IQDtHSUhbUk9LPUhOVTRCRjk+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZmNYTaKao5uexauhn6ydna2fkqKelqSgp6qsl7awo6qztsXCvcC2wMK8ycK/ysi2uLW1sbS0t8HGt76xuLW6tqCnraqsnZ6fpaTBpaCprqCkqa2voqanvbalsbu3trXDsrO3ur6xw8C4uK60tLSinKSVkZOgrZ+YoZ2oqKuimsOtqZ6srpubnpimoL2hnaSYq6urpqGZjZqfkp6Jjlh/lp6moaC4qqeTmbejn7OioZywmKCPmpSego+gl5aNoqSVkKaus6upoqKlpZWVnJmLj5GTpJ+JY2dcZWFNSktLT0ZFQUZLPj1JQTk5SkpOXVFRST1MV1w5Rkk9RE1JOEhjXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3NIRTY9dWVcTE+en6GYnsOnpaKzoZyyp5OqpJ+jn62prJ27sKistbLIw8HDs8LEvsfEvcXKvbCwtq6xta+/xbW6sbC6tq2aqbGpqpqepqGnwq2brLGcqqKusKmkp723pra6va+3w62zs8K/scazurertLatqqKllZWUo6uhn5+Zp6uvr6+7sqagqamZmZeSoqS4oaGkkq6vrKSmn5KhnpWej5GNlZ2ao5+ntKenjZi0nKOvm5+cr5GglJiUmoCSopaPjqChk4umrLClp6KdoJ6SkpqUhYuSjZyfgGRoXGhmS0pMS1NCQ0BJRzs7Rj44OU5NVV5SU0o+T15ePUhQQk1MSTlOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tVXmZyQDg8SJZ3ZUE0n6Sfm6DCqKOqsaGjtKmWsqumoqSyrK6pu7KtsLS0xr/ExLbAxb7KxbbAycK1q7WpsbiswMS0t66tt7qlmauyq6qYn6aXrbu1m6iwm62frrSyp6q6s6e6s7iyuMCqt7LCvLTFp72urbe1qaesoZeWkaWkoaGXl6SvuK2ytbagn6ikmZSVk6Ogt6OkpZWusbKlqaWinpqampWYqJ+emKKerrKipo2Yr5mlrJibn6aSnY+VmJqGlp+UjJCcnpSLqamroqehmZ2WjI+ZkIGGlomVn3plal1sa09RTk5UPUJBTkM7Okk/NzdRT11eUlZRQVdgXEJKU0hXS0g6VWRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzkwNnBbYkgwNUpwaVZDV0aMeWZDO6SknKGlv6anr6+hqbWqnbmvq6SqtLexsLm2sLe4uMW9w8e9vMTCx8G5wcfBuqq2pa27rcHDt7iqrbK8o5WtsK2yl6Wokaq5qqCnsJ2qn7C0s6qptrasu6yzsrm3rLmwwbm9vqbCq7C2rqmqq6admJiqoaGgkZegsK6zq7C5mpupn5mWkpemoLeppaKir7Gzq7Gnq5+boKCbnqWdoZedo7Owm5+QlKaaoamblqSgl5mLlpmUlpedk4iQm5mUjqmpp6CjnJibk4ePmYt+jJeGj5psam1ibm5YUlFaVEFDRVVAOztIQDc6WFBkXlBXV0RZXl5NTFJPX0tKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE3NDdnWWBGKEA4bH1oXFY6iXtjQz2on5yhqbyhqrCqo7G4qaW1squhrLW9r7O4vLq9t7bBwr/JxLnFw8HAucW+wbivtqert7K8v7+1qq6yuJ+XrK2orZeoqY6nu5+lrbOeq6KxsLOsqraztb2tr7G1rLC1scC5xLarvK+xt6ysqaKxpZ6kqJ+jlo+Yn7Kqs6mqs5mdp5uZlI2gpqS0rqeirKyusaeyrLKpo5ufqKSelaCZm6i1qZeZkpKfmZ+hn5KtoJqZh5aZjJ2anZOKjZaXmpenpqOgnpaWl5SBkJWFe4+ThIyXZ21zaHBzX0dZZlZEQ05YRFo5SEI1Pl1SaFxOWV1HW15dT01SWGRKSkNcY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19eYVYxNTE9YFZeOClDM1lVXGdLNYx6ZkxApJmgpKy2o6yppa6utqqutLmmprC4xrext77BwrW0u8W+zMW5w8G6wLrEuMG5s7Wsqrq3u7q+tauusbaYmKirqqubrauPq72eq66xo6qfsa2zrq62srm3qq2usqe1r7S6vMmyqrW0sbSvrqags5+ZqKygpZWVmpmxoq2gpa+WoaSZmZKNoqWmsqmhprGrqrWkrrC1r6OYnq2nm5eemZmsuKKXk5CPmJyhmZiUraCelYKUmY6enZqXkYuUkp6apaOjoZmWk5KWe4yRhXuNi4OLlGxueW91fGFGYGpaSUhaWz17SkdFNkFiVGlaTVxhSltcWlJSU2JhTEtFYGFgUExJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4qQS9KR1BbRzNjWVRLRJmXn6+osamspaOurrWptrS3o6u0t8q6tLu6v761tLfDwc3HvMS9t7/AwLjAvbK9rqe6ure3wresrrK4lZemrquno7OqlK+6pK2ysaanorKzsbKxtbG3sqmuq7KnuK+1s8TEtqm0tauwramnorafnqaxoKSUm5iUsZ2nm5+pjaminZuVl6WlpLanorCzq6exp62wtaykmaGsqJycnZuUqrmclY6Oi5icopiRmKijoJeEk5eRnpyYl5aIlo+XmqidpKGTlpKQlneFkYd8hoKEjY1ucXh2fH9dS2VsXEpPZFw/YntHSThHZ1dlW01eYk1YWVdVWFRpXVBPSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5JZzI3J0ZhTFYlLUIuPUVMUTwzcmtLREORmKStpKytq6ajsLKzqrawtp+rtbrIua7Bu8O3s7K1wsPPxMDCvrS9wcC6v72zxKiqubG2t8C9sKyzs52gp7CtpaaxpZ6ytayrsrCsqai0uqy0s7WstKypq6isqbmtsbDHvrikua+pra2mp6ywpaOjrqOpnJ2bmq+ZoqOio5Csn6Ogn6GppqW4pKu0tKSqq6isrrauop2jqKqcoJmakqS0mY+JjYeRo6CWjpWfoZaUhpCUlJ6bmZaVh5iSlZmnnaCgjZORjpF4fo6FfX19h4qKcnRzf35+XFJkbl5OWmddRkSWW0c6Tm1YYltNYWJOVlZWV1RZZ15RUkxkWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQ2U7NipIZEhKKzpJPzNDSVMsPo9rPkhJj5qpqqGpr6Sno7O0sbS1sbGhq629zLquwbvGsbSttMLD0cTGv8GzvsPCvMC4vMWorbess7i8wbGssq2hpKetqaiksaOrsaqvq7Gurq2rs7unt7GyqbKpq6alo626rKqwwrm0rLmoqaitqaewpamkoq6qqKKenKKslaSdl56Yq52hp6ihrKairKu3sbGgqaKfqq2wrJ2epqepmqOYmY+gqJiGg46Ki5+gkIyOl56RkIeIkZWhnZaYloaWk5OXpZ2dnYySkI6KgH+IhX13gIeFh3Vzcol2bF9ZYG5jUXNyXEs8hHxGP1d1WGBZT2NcTlVWVVdQXGFfVE9PaFhXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSzAuSWdERjg8QjA1RUtYMUCUXEBNRpWWrKehqbGcqKmwtqy4tK6qpKurvcm7sb63w6+wrbPExM7Ow7+/tMHExLrBtMnErK+3rrK6wL+0rq6rpaiqsKmmqLKmtK2qsK6tsa+zrLO6pLizrKytp6ugop6wt6uqrbq2pLW1o6morKyqrKCopqaxsqOmpaGhq5apoJOaoKaeo6KqpKyinqaxt6ysoqWimqmqramcoaWkpJmgmpWPmJ2TgYKQiYWdoI2Lj42bkJKMhY6ZpJyTkZuMk5GRlKObm5qLjouLfIeBgoJ7dYGEgn51d4ukh3lrXmBuZ1dmh2ROQGeSTERieldiWFJlVU1WVVVUT1xdYVZLTmlXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREhkFJSESWka+koqmvmKmorbWrtrCrpKuqqbzBwLi5s7y1prKvxMnL0b/Bu7nAwMK6wbrCxK6xtbK0u8G+s7KvrausqLaqpa2wq7muqLCwrrGrtaq2taa0tquspKmqnKOds7OoqKSztKC2rqGpqKuoq6afq6uoubapqampoamfrZuRqKGdoKOipqKqnZumtK6npamio5elpqeqnKKjo6CZmJ+Rjo+YjX6HjYeFnp6IhYuLj4+RjYWHlqOajo2akZKRjpOfmJmWjYuEf3SHgYB/eHWEgHt4foCInY9wcmdncXhcYXSIaU9dmFZIbXlVZFZSY09MVlRVUU9YWmJWSFBqVFZTR1BZVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDI/Zj1OWD9DLD9MVF8vSWs3UUU7lY2voKWqrJmqpK2us7SuqqWvqam7vrvBsa+4raK1r8nHyNDAv727vMO9usPBwL+vsbOytr28wbKys6u0qaW1qKSts7K4r6KttbGvsbmquK6qrrarqp6pq6CjobWtqaGer7KhtaqeqKiqo6qhoaytqL2vrK6soaenn6yZj6+imKKgqKeep5uYqbCoop+soqGSoaKippiaqKWYmJidj4qHlIh8jYaEhaSWhoOCjIeQj5GFhpShl4mRnZCTkI2RnZWXj4qFhnhzgX99dHh6gXt0dHtqgoikdmleZWyBdWeIi3xSV3BeS3hzVGRTUV9NTVNaZ05NV1llWUdTalJRPkJOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaTozOF89YWQ/RjFDUFtbK0hQO1lDNI+OsZ+kpaqjpaOsprSzsKmksKequL7BvLCouaqnrrDJxsjQwr3Avrm+vrzJvMK5sbC1srq8ucCztLutuayjtaanrLG2uLKmp7q1rbS8r7ulra21q62cqa+kn6WsqqecnaqypLSpmqqnqqSpnaKoqKm9q7SvrZ2po6Cum5qyopakm6Sln6SamaeqpZ6aqaGbkZugpJ2YlqmpkZmZkpCLgo+FfY+CgIiej4eAfoyIkpCQhYGUm5SGk6KMk5GLkZuTlYeJfoByenl+fGh3fHt1cXJ+aYZ6hIhkYGhjcoV7bWh5XV5WQ1h7bVRhUFJZS0tNcHRdSVpbaFpFVmdPQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOkrCZn5+ppaOhqqS2srGkqbGnrbnBvbWwo7mtqKiww8nIzMG3vcC1t7+6yLbDtbSztbK9ubq9tq25tr+torOmqquutbe0qp26u6ixv7K6oK+0tqmsnq6xo5ylp6mjnZykr6avoZ+qqaehqZyjqKCtu6eusa6gq6KjrZ6erKaYn5uhopyfmpmiqqKamaOjlZaTnqGWm5amrIuekY+RjIKKf3+PgXualIyJfX+Mh5CPjIqGk5iRh5SjiZGRh5CakJOBiHx5bH12eXhie3pycHFzeGqCdWqDZ2NoYW5zjm1ianBgb0JdeWtWXk5RUUtJTVNZVk1cXm1XRFhhT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNSXT0jkZesmJ+Xp6Ohn6ejt6+toq+vqau5wrqzrZ+5r6uotLrHysi/t8K+r7S+tsS2w7KwurGywLa7vripubi9qqS0pqiqr624sKmZubyjrb60s6Gut7Wnpqews6CepKWnoaSZnqyoqJ6gqq6noKaXoqifsLifo7GvoauhraSbpqapmpqbn6OVnJuZnammlpqeqJGYkpidk5mWoaqQmomNj4d9h36CjXx8oYyMiHmEjYWKjY2FiZOajomVn4iQlYKMl42RfYR7c3B8cXN0YHl4am9wcXBqf3NkemxoZmRiZoeAYFtyanFNToBpWFpNUUxLSFBSUUhNXF9vVEVYWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXVs1KJWbpZiclaygnqGkobeqsKO0tKmpusW2sq6gt6ytrbC1xcfAtr/CubC1vLa+u7+vrL6ws7+yvcO5qbu6uKeotainq6+rs6+lmby2pKu6ta6fsbivqaWnr7KcoaSgpKShlpuvpqGfo6ivoaCik6Okorawoaawq5+ro6+Xm6qlqJ+Ymp2kk5qbmZylqZmbm6SUlJeVnI6Tl6KpoZCJio+GeoN9g4p5j5eKjYd6goiEiY2PhY+TmIyOlpmKjpZ+hZeMj3qAenBxdm5vdF94d2VtbGxqaoRvZnJpa2ZpXmR0gWBba3ZpWkp/XlxYT09LSEhSVUczOV5ebVFFWFZZZU1ISUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVV1oRC48MmRXLDKUoaGXlJuqnaShoqG3qa6gurilrL3Fs7Cuo7Wvra2utMPDvLO/urexs7m3ube6r67As7S5r7/BuKy9urWmorKpp6myqq2xoJrAtaSntbWonrK8qaelqa+smaOnnKSllJihsaWZn6SoqZyin5Kkn6O4qKSnraadpaGokp+ooqGhmZucoJKam5afoaqbmpiglJCTlpmNk5OjqKSQiYmOhnmEeoOFfZ2NiYqHeoGEh4mJkoWWk5KLkJWTjI2Ue4KXjot3fntsdHFsbHNhd3VpaWpnZ2+GaGhpY2ZpamBrY2poXGV7Y2BTdFRcW1NMSkdJT1NAISppXmpNRFdVXmBLSUdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnUCcynaKjkY2kp5uenp2jtaynqrq3p6zEwbawrKO1rqeur7e/v7yywbewrrK2tbi2tq2qvbOusrG9v7iuvLuxpZ+2qqWls6iqrZ6dwKuopa+yqay1u56oqauxpZieqZ2mpJGZpq2imJ6kqaGboZyWn52ntqWvqq6hoZ2doZSgpp+hoJqbmZyRmJyTpZ2roZeWnJSSjJWXi4+YmqmgkYiJioh5hXaBgoKdiIuCiX1/hYiHhpCElpWQjpCRkJGMknuDlY6Gc319Znhva2prZ3Vza2NnZGR2gWNlZmZmampja3NaX1ldbWRhTmlYWmBWSkdJS01SWD45X2xpSENVU1xbSUhGRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNCaEglNZqjn5CMraGYmJ+WpLOxorG9tqGxxry6sbGkt6yqrqm5vLu6rcCyrq6utq6yuLOoq7mxr66ztrq2sLi9rKaetaqgoK+jqa6cosCgsaOur623rrWera6traKanaeppZ+Vmqeln5mloqidmp+blJydrK+luqeuoqGamp2ZnqSapJ6XnpiblJmgkqiVqaeak5qakYuVmY6UlJmpp46NiomPfIJ0gYGKmIWHfImJhYWKjIqShJSck5KPkJGWjpB/gIyNgnCAfmZ5bWhraWdxcmtcaGNjdIFiZmhqbmxnampobl1sbHRwYVVjaWRlWklGTE1PWFFRVmFlgVRAVlNZVUZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJzSRoZqNjrCempOhmaiyr5+4v7agtMK7vbmxprawqK6lt7i3t627rqyqq7aqs7itpbO1sq6psLe2sbO1uqapn7WonZ6ooaismqe+mK2jrq60ta2sn7Gtr6minJ2jq6iclJympJ2aqqKklpqfnJCbo6uqqbufp6SgmJmZnaGPa6KWmZxwgpWao391kamnnpSUnpCIl5mAloqhkHiGlIyDbml+doNxbIaLhn2EjIdwXmNhZ4SYhmyLj5SSdHeLhH6Dj39nhoBndWhlV1xoc25OUGpjZ3OFZ19kZm5tal1gYYqPg4RlTktEOUZUZ15KR1BQVFVLSFJgb3RlRlpRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNTY4LCMxJzIxNDoxNzVYgWwxNk9rW05cS1tmYj5HMVFkPSoui6OZhpWwm5yToJuqraqjvcWvqbjCuL28rae2sKWro7ezsrOxua2ppqy0pq+1oqi4traop6y3s660rbOhqZ6zqp6ho5ulppirupWlpa+ytq2upKmuq6yloZ+coKenm5egpaWbm6ennZOfn5iQnqeqo7Wvo6KinZaXl5ejiKCOkpqHoYeTnKB/pH+lqp6SkZqRiIRyeI2OhYihdoiMaZeIZn1yeKFviIeEfo59f6GgoJmAfIeedIeOdpuKbIeBg2xoZWN6a3FhU4VtY2xpmHFZanBviFheaVtsbFuIcW56coVnhoRaXkdOP0dfTUVSVlZRUVJXVGdeTVdJUlNQRkdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcwKIumloOcq5yZmJ2fqqqnqr/Dr7G6vbfAv6qlt7CpraWytK6vs7eqqaWwraW0s5yttba0pqeos7Gtsqiunaqgsqigo6KZoaGarbOUo6SltbymrKerqqyopaGgmKCmo5mZpaOkmJykqZaUo5yUk6SlpqG3o6Ogo5iVk5eSnIivkJiUiamLl6GbhbGAo6ydk5mdlHmD1KiAh5XBm8d5eLGlt5dkgMCcv3mEhHmQhHyQkJHKcZe8nMV6crWmu5B7gGyWsauweGhrWLGubmVpvJK8bmh6b3KQ2H5Ta2O2sn+BcpV0mqGqkFdPV2JQVk5GVVtYUVBSjFxXXFBAXERRTkVHSjw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGNppKAp6qfl5ydpa2yqLHCvbK1wLW3vsKrprOtrKmnrrOpr7a0p6eltKWnt66cs7K2qqWkp7KurrGmqp2npLGjop+dlpqena6rlJ6in7O5o6qpoq2upaGdm5qip5+Xm6egn5iep6eRnKeak52hpqKgsKKfn6OWlpKXkpmFr2tqio2qfmeDlYatZHCdnZSZpZRxrqGkfni7fWuhj3axX2q0W6WAZpyRYGaCemZ/anhrqWS+cmemjHWxanyxeHSSk2NtbaduW4SgRWhmh5ZFdZxgfmh8pKeCWV+Lq2mAlnh5aqc3Sq9cWFNsZFtLTlhfXFdWO06JT1hXL0lUVEpERkY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzAbkKKVgqynpZ6jpKqyt6y0vb6wtsSyt7rCp6mwq66pqbCuo7C6r6OkrbKjqLionrOysKOloKqtr6yvpqefo6Kwm6KblpWWmpqspZaboZ6zsqKrnKKtraCdmpegoaicmJ2jn5yZoaakj52impegn6qepqagm5+hlZWRlpGahbWbtXiFqZm1mXaGs5u3fpOWlqiUfmyCpnuChoiSlJJ3q2drsVure4+HlHSJcY+GgH+IkJd4goKLmIyDoI+EsHZ3n3Fra2x8i06kWEhjY5l+Y2imYHlzdVOTh15QqW1jcX6HgGKcLlGhb1tTa2hgTEtbZFhcWkI+sXlYWEEjTWhGQ0VBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjhhVTUwG5WflYezpqagrqmnsqypu7bCsLvCrbi2v6qsra2upq2xqaGuu6qgp7Sso6u1paazs6ejop2nqrKosKilnp+fr5afmJSVlZedrKGZmaSotK6hqY+pqKqbnZWYoKWnmp6cop+boKOko5WbnpeZnaKpm6WZnJyioJaTkZOTnYPVk5m5cLDCfsWGfNaUm7t8mpWkj42cjaR7joekgqWCeqx5j51Wr3qIfp9quVq5doeEfaaCk3yYeqp5jZ2Qe7FujoR0kLyFb5RQr6fFilGgemNgqWJzc4htl4hgU7W0yIaAiXxjpDNCnXZdUGppZFBAWGdaZGFKSE5tTVtST1lmWUNEP0U/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVE3MSWbopOYsaiopbOqpbSppLy3wbC5wLG1s7qztaexsKOwsqafrbWnmqe5raOvsaCztLCgpJ6fp6mwqbSopJudnquXmJeVl5WVoKmcmZanrbCoop+PrKKolp2Wm6GloZihoaGhmqGippueoZ6UmZumoJunlZubn6CYkJGUkZ2Ism5otXGrh26OpnK0c3K2e5qXpIuPnY2jf5GhpX6wdoOR0tJ2XK57hX+kb5uqpmuHhX2tfZeZj3uxc5Kdj3mzZZZ0hJ5vnmaUUsiLWsJcn3liX61gdnSHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9rYGxoUFVHSTg9VlFaV1hJQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFNNjIwoZ2Spa+tpKq8raa1pae2u7yyur+3tbO5urOltLShsbGin6uvpJemua2ksbCctLiqoKadoamksqisqaSZm5qonpWUl5iSkqKnn5aSpaqwpqGVk62fpZKToJukpp+VmqWmoZqin62ZoJ6dkJWboZ2cpZSdlZminpWYlZGbhax7d6h2o46IhqlvrYqCp4OYmKGJkpqKon+TmYmuhX+Cs1xys1KufYOCpH9x1314hX6PnYaZmnevhoqRnIh4s2GaZZqBgpRsklqwWEuadZh5ZmCtXnZ3h2iYiGtdr3eVno94bDV5yK6yX0JUb15nYEVQbV9wbVZVTS5lY2hSWFE7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSTo5OZ+dlJ+4sJe0wa2os6ipsrq3s7i/ubextLu0pLiznrOsn56oq56Up7WrqLGxq620pJupoKCoobanpqmimZ2UpKGTkpuYkZSipZqSj6atr6aglZmpn6KOkaGaqKSglZmlqJ2cpJ6snKGdoI2UnpqdoJiZm5aXoaCTl5CmnoapfX2leKGPjoKqcK2LgaeGlp+hiZeXiKOCkYiUqnyAi514b7FaqIKCiKB5dNh/doh0qIGOm42So3yWkJ+Ee7JenGSgfoOVbJJcq1tak3+Rf2hnqmRye4FrmIdzXaxaiaCOa29lT0pDoVxbTHRdYmdNW2FfcnNfSlY2SpuTWEhFPUdGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MyPzihnZmZv6uXtMKurK2pprSwt7G1v7m5sbC1uqm6tJ6vpJ6kp6edk6qwqa+ptayqr6GYoaCmpaS6oqOroJabkaKglJOemZOXnp+PjYuosK+mnZabqKafjJKjl6iqppSWqaeenqCjraOhnqKNlaGYn5+SnpeclZ2hlZaOq5yPrm1ytHKpjHaKp3O0eHOzgJGko5KcjYmkh5B3uG+Me4uiamu2WqCFZZeXaaGip22TcrR0k5h/smqFkoita3WzYZ1mom+HkmqXXK1fTaF8h5FSc6NseX9+b5iHcVyvVjycd2VUb24uXKdPY1NrZWJtWmNdYXB7Y1RaUT4+bW8zQ0JAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4pZqbnbuhnLLArq6rq6e3qbivtcC1u7CuuLaqwbWoqKCbpaShnJGqqae1o7Kor6qgl5ynoKSruJ2jrZuWmY+lo5WMnaCamJyfkZOUqrawp5iUnKypl4yTpZmlrKKRlqqyo5+epquwmaGjj5milp+blpyXoZKcqZyUkKuZh9SSmrtzsMOAw4Z+1ZabuHiIkJiMmIqMp4h6o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZWBrKlxe391vIinoGmdYaaOr6F+jHSHqn2+bnO8dLKDdXiBi26aiHFujaR0vV53fVthebxrWlZcanleamFlZ2JteG9ZW1lDQUByQENGKzVHIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdCOaebnqG8opexw7Ctqqussae4r7bEsbmwrbmurcCxq6OinqOhnJuQqaOqsqS1pq2lnpaZqpmmrLmdo66YlKCQpZ+SjJyjnZedm5GVkq65sqyVl6Onp5SQlqScpKyekKCoq5+anqijs56jpY6nopSimpyXlaOYkK+gkpSpnoWQmbV/j5GMt5V4gpOatXdta25zb3mPhI6JdJ7Bu72ae4GyqHCAdJG5g3yGhoyGjXuKh42XfKS7ub2cdXq0o3R2l3V0sHWZnmaGao21dHJxd7aMXoB6fYpog3lteWOLrHB1hX9ZW6dqRWVaVGZgY15jUWhncW11Qk1QTEQ6Wk0/SjM7MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JXOCpPXl09KzpWVic+OzynnqChv6WWtMK0rKuorKupuq6wxa60sq22prS4rKmhoaWeoJ2Zk6ukraqmtaenn5uWoKOdrKS+pqGql5SckKGakY+hqKGTnZiTl5SxtbetmJ2kpKKKkpKlm6Wqm5WopaWbmaCopqajqaGRrZ6Wo56Xl5edno+wqJSbp6GOan5pm6V4h3J9mo50emSHe72+wLpvkoJxlYdhc2paXpuKYWOIjpVrYICVZG2dd2KVa4CalZRlXmBjcZqKaXKMfYWVZ2p+cnR4fX5iW3d0gWhQXG6EfXyLa1hseoJzSkpvhnBOdExFV11nYUxaWGdjX09bbnVpclJPREVOO0hIPU0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF9MKDM9W08nPzI+qKCoocKjmrS5taOspa6np7Wxq8irsLKqtKK9sbGmoKKonKKbmZmspq+kpLWppZuXlaGbpq2ovqeoppWTm5WfmZKXpKmokJ2Rj5icr7K/rJunnqeiiJORqZqoo5qbrKCjmZmip6yin6uimrGblKeglpSdn52XsaSXoaiZnJGdnKKjmKWhmpyampmPlYFnbn1xd5KXlJGFi7WqjYaYlY6KjJiXh5SVioSSlJGJjpKUmJSYlpqgoZqclKGejYJ6pIZsanyQfIB1ioqBcYJ4eXZ2i4B8imtzgXSDdWV2fXdrb3ptYGNdcGhNWFpmamBXWnB6bm1mU09GUzlPWU5STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLOhs6G/oaSxsregqqayp6WwtKrIq62wpLSlwKezoJ2kpJyjlZWgqqeso6O2q5+Zlpafl62qpcGeq6SVkpyXnZeSk6KfnqKnk5GZqKeyxK+aq52qn5CXlqedqpucoKyYoZqboaSvpqGlqJ+umJennJmaoJ6enK+gnKGmlZeSmJOfoJWinZigjpaTioqNjpeukHyVm4KSgouqqIaBmZeKhI+fiHuEkIeGmpKIhoqVj5uXjZGYnaOWmpORno1/jmahs6+FioR2e5KKfXZ5em9mepGBgIlrdYF5iHNpc397doOGgmt1ZHlmYGplY2Rma1lse3BpalxTTFBEX1RGQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvv6yrrrKxoKumsa2irLOwxLCqq6Kyrbyjs5ufpqKhnJmXp6WppqSlsrSelZSdmZmwpa6+oKuikJGdmpmUkZSinJeonISeqquis8izn6qkqpaWl5qmnaian6Oqk56fnaCpr6mlo6uirpufoKCYpJ6cn52vo5ieqJOXlpuQo5iXp5yal2WCknxlfo2akGR5jWxoa3uSpKpqZZqYfmeGimVlaWh7jqGPa2iNl5Gjd2tqi5mjnplzbG57hI2HelhlXoaCXm2LiYF2XGhzd3eSgIeCbniCeIBzbXmEdHaIiI6DfGqHWV5sdWRdc4lpa3xxa2NeUk5XSmRYQUo0Pkc3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvrLOxqqWora2wpq2tsLyxqaajra6wnqyWoKOdopmZpqucraOlqKmyrZ6Vo4+ir6W2uaWuo46OmqGZk5KaoJmZpZV7pa2iqLTEuKSip6+enZSeop6jnKOpqJGeoZ2gqrCqq6SqoKqbp5+noKuVoZulsKSXm6qVoJ2akaSWnamXnn69g4hytHKEnYataHi5xLhxk6KjeqaZmXOqgnzLwMC7cYyiiIKffZaYiZ3AvYKXnZ2NncLBfIJ8ko2aw8B9a6WyboyBb8p6f5t3kYOOgXZ6gYB5cXp/h3B3hYyTeW54lGNmX3lkYGWCY150aGxkYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlEvI0ZbM1BZL1VBQjsvOJajucO0sLDAqaiUo6+psK6tprO0r6mlpqawq5+rmJqin5yaqqeinayjpaikpLSknaKSpq2ruLOnr6KRkZmdpZKQn6GYm5+dh6espKutwMCxoKmvqZeRnp2hmaKjqaOSoKGdna2uqayno6Onoaalna2okaSaqK2pm5ypm6yglZWklaCilpx/zpR4eqSBeZWWm1+uj16Op4GioH2nlpt0q4OAr15jjap7p4eFoHWXk4izY4KrhqGOjbNqha90fZeIt2GDrVmjzW2QdXvae3+ZcH6IknZ+ZXuIdnZrfIhufYWQkX5tg5BhcmxwaGBfeWRccWhqZGZgUlRSV11LT0M1QUhERDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1LMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaSqqK2zq6ayrKyqo6qmr6qgp5uZpJacoq+foJ6op6OloZ+wrJqdlaeurLGqqKyglJKbn6SSj56lmJ2no56upKuwqL/Hs6ipsa6Wkp2boZefqaqflKCfnJ2tr6erqZynqKSiq5KsspaloqqqnaOmpKGwoJKZppifmZOUkZegcYWMl3SEqIdxsXydcax+oZ6BpY+ed6qCfa1/nHOtfquHhp92mJJ7fJd+qoiijJGMnX6re4mUkJ+Ae61WnMR6j2+SwX2BlW11b4xtZXZlhm9hd25yb4mKko+DbZKQZnB1dXFhZ21lX29paW5nZFhTXGFZUVNDOUlJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNTGxrK0oJyjjqOjoqyvtq6osKaoqqasq6unoqOdmaGUoKWrn6KloKioop6dsKyXmpapp66sqKapnpeUmqOhkZOgrZudpqOvrKOstaq5zbKtpq2slpWcnaKYnq6snZagmZ2fqbKpqqqbrKuko6ybr7GiqKuupZilqqipsaKSlqOkmZORhKRqpHWJeql0erJwgqaKmYxxiKCah6RgYVKrhH+ug5t2rYGmhoafepmXhntmgKOJpJmGgqN9qX+ClYeuX32pVZ2ikoF6op+Ae8OvxYtyr7OzuXFiqa/CdGiMjJiOgW2alHBueXh5cG1mZWVxcGZ8amNdV2BpWFhVTExRTENDQUI7Q0FAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8PJ1tW/oZmrp6Gvop6wtLCuqayip6apqquppKagm6SdnKanp6OcrJqirKGjn6+inJuTq6S1sK+gqZudlpSmopCaoqigoKWcsKakqLGstsiytaqrqZWRnZyimJ+ls52aoJScn6esrKSumq2qo6KqobOtoaqzsaGaqKeurraikpaippiakXyqbJ6Eh3WreXywb4Kki4mflpaflIHSuLS4yYCBsl9glKmDo4iHoHqYlpp4qsl0maSVqKmRk5qMgJyKmsbHeGahgqVzgZ+Ogn2vXXC0YrB1S6OGbadHgpNkjpCeknxxl5OAcXt1fnxvW2ZqcnBlgWteYVljbVxeWUlOTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2ps62spaKcsrisqqClmqilqquqp6CmpZiqo5+uq52moKyanqmlnae1n6KXk6mqtbKsnKWcoJSPpayRmZuno6Cppq6hpKepsLXDsrOqraiTiJacpJqho66mmKGVmJylpqubsJ2uqKafrKO3rKGxua+dmq6msrKypJOXp6KZno6CnU54moF/n3qDo32DpISGpp6cnpOEuHt8ebmCfszGwrZ4m6GQi59+mpaXinaemIqlmKSof7CFnYWfhKx9mpRipWykcI+FkIF9loJyrGCjc3GAmmC8fVJVdI6So5Z7fpOSi3V7c4V/cV1ubnhyaoFvW2RfaG5iZF1MTFFUQUlIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDg4Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7mqr6Cboayys6WeoJWlrq2uqqedpqaao6ehs66iqaeyoJippJSitaKilZehqbS5o5uinaKTj6GxmJ6bp6Whoq+unaSoorayxLGtqa2pkYePm6ecoqScpZeemJmapqSpmq+irqWmmK+ku6yhtretnZ20sbewsqaXna6fop2Fj9G1w7d5h46FkZOQgaZ4lKF3jKCRhKWBinGqhoS0bnJqmaOclYqefJiZhoePc6+CpZuijaaLk52KlZCbbXCyXKVzk3qcbJl/e5l8balho3Fxf59ic7K4aHePlKaYfYyNlI14fXmPgm5qeWl5cm6AdV5lZG5tZmdgSltYWDxIR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZNzjYqtv7+8urSelqelrbWhopmVo6inrqusmaain6agoLWno6mnsaOUrKOOpK2jnZCamqq0tKSdpJypkZSXrZ+fnaeknaectZqhqqS2q8OwqaupoYyEjZuhoKailZqanJibmaakppisqK6jpZutpr2slL2wrJ+ir7K5qrOmmqixoqaXeaiQfXywd4qApKWInG2yb6CHrXyhjoOolZmArImFroWflKqhoZeGn4CZlYB7kn6rgJ2aloureJ2fkYqUkoF6r12jgX2mp2SdgHyXc2qvXaVrcIWZXWBbjKBtlZGmmYKVjpiNe3uEmH9sbn9jfnRugHpgZ2VxbmhnaEJaYVs+S1QzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pYU1BPTkk4MDUyLiosQVRWVlZUVFVVVVVUVFVUVFRWV1dYVlVVUUhGSUojKCi9kpqDqcbCtsG0n5qsoK24paOOm6Sjn7Cvqp+kn52tmZ65oKOroK+pmq6hkKuopJaJmpCusaymnqaarJeXj6yhoZ2loZqknK2YoKimtqnAr6WppJ+LgI2bmp+mnpKUmpqUmpqlpKSaqayspKWfqqi+pJbDrKqioauyuaqupp+yraeol3avfpCLnIWHfbquiphlsIxlla19oY+DppWagayKhLCFppmkoaGRhaBbbGqBs2B/rXt7goGxbWdvmZiMiLBbfbRcpINryKJkn4B7vFh2tVqyfVKugHqsWIChbpiQqJuLl5GXmHx6j55+ZXV+YoR4dIB8YWpmcW1mZWZPVmRcQlVfPkooPjo9NCEiLCUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUVJUV1peYF9gYWJeX1xbWFVQTkpGQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWlxcWFdXR0I70p+zsre9urPBs6ObrKaktqigi5qgn5yzs6mfo6CetZigtKiqrJ6vrZ6sm5WvqaKOiJuOr6yop6Gmma6SmI+omqGepJ+Zo6OlmZ+jqbKpva+kqJ6cjn2LmpWgoJmPkZqbkpqXqJ+hmqiuqKamo6Wpu56gxqakqKGrtLWsrqaeuqyrq5SAqZKjr46bgIekl5iQgYC4w7qDjpyThKeWnIKsioKviKabm6WqkX7VvcKqYqO/vX1+o4KD17q4tYWUk4Oevb6Ea6OBb6uEbJx/erKwx4Nqq7C9rHh3or68c4GWjqeckJuRmJ57gpKce2R+e2SOZ3mCe2BrZWtqYlBhW1NqXEBVYUNOKT06NC8eHyQeJTIgHSQoMDQ5NjY3ODo+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz88QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVs7Sxv7myvbKina6lpbKmnYyYpb+quLKoob+mp7KcnrGcuqifra+lppSUsKyXjIKbka6loqygo5yqoJeKo5KmnqecmqGoopmeoaytqbmtqKOal5J7h5mRppuTjpGYmI+Yk6iaoJipqaGqp6GjqrueqMSioK6jqrO0qq+pn7mmra2Zc3WqpLeGZImgcGetj4qPbW93pJCZn4F1rpiUcI+LcZWoo5uXrqRybW1sZot4b26CmXGBempxaWeJlpWYcWlphIdncIZkXYhiam9ZXWd+d6ZfYXGOkW5lZX+Nk4+imJmZkZigfoiQlndniHhpjmt5f3lkbGNmbGJLZFhKa1o6UWVFUidLOisjHCAbIiwpGBsYLTIuNTo0NTc5PD9BQkRFSEtMTU9RU1ZdV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola2zqbm4srOqqaGunqOyqZiSvrLEyb62qp7ArKyjoaisoLqjpK6sraeNl66pj4uFlZatnqaqoJ2jo6CRi6SSp5momZajqqCWnKamp7C6q6yam5OSe4SXjaWYjZGRmJSNl5WolZ+YqaObsaaeoqu5n6/Ap6Sypaywsaqtqqa2oqy2lYqgqKW2nYmWo5mHqZqQlJ2SqbOZm6OroLGWoqCdoKKcoKWhlaunjZOSjIeTnJyVkJqTmJGOlYWBpJqXlY2Lk5OLj4aEfWeJfnSCdnSHi3GnbHqUkZOSgYGNkJCPnZWhlpqYo4OJlo5zapF3cYt4d3x6amxkY29kVWFZQGpbSGNhT1krRj0rJyE3NDAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFRWWV5gYWNdXlVRSkVEPjk9QEFTWFtcWldYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqW0tq6uorCjrZ+gtbGQjqzHvcW7uauipp6bpp+xqKO2p52ptaepkZitoouHiY+bqJWspJ+Yp56ekpSjl6iaqJmUpqGjkJqnmaG2u6irmZqQjXuBlIuglIqVkZWQkJOXpZCfmqqgnLajnqert6euwa6jtqavr7CsqKiyt5+tu5iRpaSmtqKSnqefjamfjZKfo6yvm6GjsKivl6OgnKOqnp6dnJarnZKZoZuUkJaqmY2ZmZaQlp6RiaCdlZSFkoyQjZSLgH1mi4V1hnV5iINznGqFkJSTkIl8i5aSkpeUopOemKOFiZqIe3OXc3qLf3J8f2pvZF5wamFbYFluY1BgZFBaOkdHRT4yPT04LysmKykmHSY0MTY2Njg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYGVWUEpBQ0I6OUVNVlteXltaXFtbW1xdXV9fXV5fX2FhYmFhYWBiYmJkYlxbY5eVpKiir7KsrqOppq2fp7WqkJCdpbS8r62toqOaep2isaSlsamXm7mno5SZqpyOhoqJnKOPrp6ilaefoJKWmJuui6mWj6iZqIyYqY+furakpZmbjYh5gpOLmpOKlZKUkI2Sl6KNnZ6onp+4o4CEr7Wir691pL2jsp93eZ+psLmUdaujnomAqn9kXGJ2oI6knoSXfW6Ts52jp62qo2Wdn5JzeZmWcICYqJdsf6KoimWcpZyRl5iWjJKckYadmpCVg5KHj4+SiYR3ao6GdoZwe4aAgGFph4qUkotadZSQaGiPj3N7ppqaZnqaiIR5mWqEi4NveYBrcWVfdnBsa2hbZ2ViYnBTXD5OTk5TRz5AVEQ5MS8eHyY0OjMwNjY3ODw7PkBBQUZIQkdGSUtNVFRVWV1gaGZnV1FKPERHPDhVUltgYWJgXmBfYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaajoK+wrKuppaiuo6atpJKWq7awsqebq6asl3SMnbCfqKunlJe5oKCPnKSdkX+JiJuejayaopWnoZ2OlpGehHWtjoimmqmRl6SJnLq0p6CZmIuJdXeTjZaTipSRkJSMkJOgjpuhp5mcspaAjJu1nbOMko+7p6B+p6J6oq21gI6NpZ6Di4aQsaqvjIqWo5p5gIushpydoqepp4eVhZh3pZt6h5uBl6eCgnucsnqKhqCXmZSYloKRl5eEmpljeYeQhI6PkYuDbXCOh3mAcICBhX+GdIaElZF4lmeSdKCadH2ZhKKeiJh/lIuFhZprjo6FbHh7cXFnZHhvamxqW2VramV0XF5JVExRQEU1LlpUVTcpITA5PT43NDM1Njg7Oj0+PkBEST9KRUpLR1NYW1lbYWFoZllRSDlFSzw+YVZeYmRmZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJejn6atrquorJ+osKamqaWZlK7IvrGil6eptp6QhJ2snKeioI2Qvp6ZjZ+aoJB8ho6ZmIisnKGVn6CRjZOJhoCRp4yGop2klJiehp+6sqedm5KOhXB1kImVkIqUkI+bi4+Rn5KXoaWWnquHn7SJtJqtisqHqq2It4WMr4KwrIKpjaWYjZ19qI9ye3ecj6eWaJWkebSMn56mqJKYwoF/q4iYoXKegJqlfZeFlbGAoX2hk6CQmJeBjpObipiRi3yFk4aNlZKJg21ykIV/eXGGgYR8hHWEgZaAj8Vmf6mHj6NrnoOjnIOagY6Ph4uacY6ThWh3dHx3aGh2cWhoa15kcG1nbVhnR11STTJENDZOYWM3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TklKTENQWl1cV2Feam1cUUU9TE1ASmRYXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSXop+wp6mppqufo7ewqaqmmpSgo6SrpJelq7ijsIChqJ2lnp2JlL2Zk42hkp6PeYSWlpGIq5mbm5mhhY+Md5ucj56Ph56knJaamIejua6kmpyMjH5ibY+Lk5CNkI2NmIyPkZ+PlKGhmaGnfqGnh62doJatj56cnZGFgKCNqq2Fo42pmYyaf6N1gJmUa4KsdU2reIeNnJGbqKeAqat9g6F7eqdpnn+Sa2eXhpe2iZ5+bmBkWYOXf4x7ZGiLcpl9eZVsXXyWbV9TcINcX2t5g2BZZYJ9g4CXcKeqa4OjbnKlcJ+FoGpmoG1bb4x9Z1pgg39iV1Bvd2ZtdHNram9ea3BtbGlYaU9eWEY5QTRHRF5rNCxJQ1JNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deXmN2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlp2guKCqpKaskaC2u6utopmYoKKlra6hna62o6iToaCgp5yajpm0mZCLn4yVi3WBlJKNiqaWlZienn+ShYaspIeaj4qYqZmam5KIprGnopWaiImAaW6IiIuPjoqLjZKMkJGijJSfoJyhpH+TgY+joZSgd5yWj6eDoad/hqirg6V4inyEmn6icHOUiJZ7nox5bYebjJmQm6iaj4ede4Kic3amZp5+d6RfmHp9knOibpi3tLp0k4eCf7WoZIHGuHtwlbeLcYCapGJzrKtgfWmds35ufIaCjYKLmHF/o2xyo3SfhYGkYJ2Zs5ZxfZiftHRzW56yg2pib3R2cWlvWGtscnJmXWleY0xEPUQ2UUFZcTM9U0dfSlI9PDM5NTo6NkQ7O0BKUD9VTU5RQEVfXltaWGBgfGRIQzhMV1VWY2FaZWZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7iZq5yToI2kt7StraCaop2jo6aunZyyrqyTmKCYoaSZmpSfq5uLiJJ4i4VxgJaOio+hkJKUnZd9kImOqKCHmI6KkaOUnJuNi6mopZ6Pl4eEfmt7h359j42Di5CRiY+UoIOXnqCdoJ6LiXecmKKMn3Khi4eoiJulj5WmqX2tjH56oJl6o5N4gXSWiI2cfZWfhpuOmZumhqJkoXyIlpCbjWyeaJqNbpqZe4CLp31yaHSrg56DdKpolZpdm4V2hJ1oqmqAuGZcqHCBnGCVjF6ndnWHiX6eaJp1hpOSl46An2+akG2nml2ofni7a36qW46EXbNnXG5yenhraVxxanh5Y2BmWGJCUUZPN1ZDUm81S1taX09aREAxNTE7OzZIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TltdWWVmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq1m6eIY5Saq7mxr6yeppycqZ+fr5yesamtnZejmqGgmZaWoaSZhomNaoiAcnuXiIuWloSRlJiPeoqElqOdipSPhouekp2diZCpo6CajJGKgIBpgIZ4f5eMe4mOjoiPlpp/lKKfoKGTmHJon4qfj4xwkoyBqYeYnqGmnqZ7sK2joriXd6OzoqSAiJR5nXuqmn+ijp2bl4iXcaF8hY2vtX1rmpGheH6YtKOjq6iEmXybfZ2af3SqWl1ve5aLeJ5iTH56eoVjeZdCTJ5ZompyfI5tgIiEmXWbeIaJsbN/gJuTp3eCnW5zfZVwmnRrpF2VdkhlZGF0cX5+bmZgbGl2e2RlYlJfV11VV0BaRlFoRFNXXGJYXklEPUI4P0I6SUY4TEVYQVdSW1ZERmJcWmBLYG1+ckVDPFVfYlpmalZnaG1vYmZnXmFhXF1eYWhiX2VjdmxeZWdma2RmbGloa2mTnIGwrpmEVF6gprO5srKpmqKMnKucnKqUoqykoqiPnp2dm5mWmKGdloiHiXeGgW95lYWRm4t8kZOWiHJ/iJKhm3ORkIGImZWhm4WOqZyalYuLinyDbISFcYGhjHiGjYiIk5iVfJOjoJ6jiK2GfbWEjp6ce6WWeqmBlZyPiZ+bfKdod21+mXShc3F8noaZcJODrn2kg6aemYCjb16oZ3WjY2+lYZzTkHx7mXhyc2OihpB+o3Okj3ZrkLOMYIKYiXOqsqi8f3eDbX6+pqm0XpxufXGXbn9yonJdpGdzpmFopm2b1Jp9hZtwenuYbJx8eJdzbqmkZ2FlenGAhGtnZmRudXdnYGNTXGZRUWJJV0pUYVdTW2VqXGVRRkNLTUpLQktFOE9AUU5YU1lPU1FhZmVqUmN3eXdJRkVjXWVaaGpUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5t/sKtUXEt+qa+xtK+zo5uZhZmpoKGkjqWooJipipqYmJOZk5KgmI6HhntwfYRofY+DlJqBd5CNj4lvf4aPkpJslpN8iZKTpZaDj6ublJKLhYl6g3aHgG6Bn4Z3gJKGh5mil3uUo6San4mzoaK2i3qsp6SupXCogJqQhYCakHukgKGZhphynoSjrq+Kl4x/jKSNlYOtoZR2tLW1yaFzlIqBn2Cdl6lteZWGoJt1oYd3oH6Sl4uBb0xmo5Jwm4dzpHt6dGGDgWt+oGtxZF+ccX10l2l6abO1tMamc5h+ep1rnJurdoWbbXZ4mGqZe3WYclBFfbReanZreYhmamhidHVwblZeVFlpUFNpSlZNWVRWXWhrblZoV05LQUpNS0hKT0FRS1BlY2ptZXVzc395fG51iXt7VFBPbF5oW2tpUmpoaWxnbGZjZWBcXVxeaWJkaWt7X11kaGNqZm9tZWlsZaGciK+mhGY/k6Gyqq6vtaKikICYqqKjpYymp52dpoKbl5aOl5CPnJOOiIN5anmHZYONf5igeXWPiIyBaYSFkoKMhZ2Neo2LlqaTg5ipmI2Ri4GJeoB9i3lwkKGGeYGVh4mWoJV/lKWnnJaWhGZueJxsomR8caV3m5hwZ6aAlYp6pHqfloOXcp52gYqUlo+5bpCKomJ9maGViG1yaaprdaBtbqZfmmmLkGiWh5qVdaKAfZpgjIaNdW+IYmigZZ5+aZt1b2NmiIJtcqJaX1tioW1diYxue35zcmSlbXeiZGenaJlzjJlwom9ViZBvoF9mqFSLXlSYbm1za3KCbXBpa3lza29SWVdXZ1pUbUpZT11JWGlpc2pZa1ZRUkVWXExYU2FVaWtfd3R7fXB9fHKDe39zdo2AhHZeUXJiZ2JwZ1BqaGhrbG5oZGdfXV5dYGtjaml2dV1cY2ljampzbGZrbWOcpJimemV0bYunrqOpsLGmn4uAmKudn6aNo6GboqKAlpmTjpqPi5iQjop7hnGAiGiLi3yYnHN0iX2Qe2SCh5WKiZaZgnyIh5eokYGirJGGkIqCin6AgI5zaY+lhH2GlI2ImKCOiJOqpp2JpniVm36liJaMspiekIKvl5+ld5SGeKlzpY+Emm6kooyShIyDu259pa+DhoaGk5Wcn3ylenKolaCWZp5+b6tjloqVkniobKmigYl2iIN3qpGmh2qRsGt2s4ypa4qGbW2fnpKVYH6ri6p2fn+MpZ52n32EpJWdoGqbiHesZ56tjLZ0d76NpJNZg6aNq2F1cnRxfHRxY2p+bmhsU1dbVmFiXWtNXVJdSl5tbnZgW3FZXGBbZnRlbm9yYnF0YHd6fnlyeYNzhH+Be3uMgYKAdmJ4ZGNtc2RSa2dob2xyamZpYWBeXGJrYm1sem9cXGJpYmxqd21nbG5ilaWqnYGAnqSWqaqdqKaupJmJg5irmp+lipulnamdhYyaj4eckYWSjYyNdIZ6iIRwjYV+mJR0dIVykoNtf4uSh4aTjn17goaZpo5/pqaOgY6KhZR2goeSb2yLqYCDi5SOiZyfiYyUqqKfj4B1lJeIfoF5lK6jf4GbcY+FeI+Kg357cqeMcX19epeWm4SOeHt+foeUlZOKdpCYn6CDe32Ja4yFW3l5cnpwaG5+kolxf3WBj5STcYaEgmWMf16Bf4t3dHKUdW95bm6HbYSFXnZoeI5lgICFjambfXR8lmqJiHCBdn2Gdm5tZ4xzeXuYeIVca1h5j2lueHJyb3h4cF1shm5pZ1ZbYFdcZmtkVmJVX1FfcHh4bGt2Zmpra3Z9cXJ1c2FvdWJ0e4F4dXqDdYCBf4F5i4WDfXttf2xkeG5eV25naHVreGppamVcYFpjamVtcXRuW1tibGRsbHluaGxvYY2UuKimi6GimqakmKWcq6KhhISYrJKeoYmbp5qpmIOBm4t/lpOHjoqJjXKDfI99fo+Fe5iPdHKDcJaFe32Si4aGkIV5foCHmqWOfKehi4aQkIWUg4aOmHdyhamFjpGdkIienoiMm6ifn6qDiY6Vmn5+iZatqI+Spo93b5yQgnmRbn6ohXB9lXFrcH2Bn4x/k46MaG1dg4uMnJuejnOVi4hxdGuCdnSBWXJuhpGBfX6Mal1qZHuFhImAYGl4epp7goqBdYGFgmd3ioZrYXBxgXZecoqBiI+mlYVljI+DbneLhHGGj3pxZ2hle4N6lltcamdudlt7eXh1bnNzgmZcbYpra2JaWl9aWWxxXF9hWl9dZnR+enRwdGNra2t8fXN8eHVkbXVobXx+dnp8e3p6gIB+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hsa3FybVdbZW5sZ3N5b2hqbWCLi6qwoZCjoZqenZeemKijon6Dma2NoJWInKKRpZV/e5iFfZKZiYiGh4pzfYCMdoWLgoWXinFvgHKYhoR+k4SDhoqBeoGFjJyhkYKmooh4jpiIlIuLnJeFg3qsgpGXmZSKnp2HiKGrnqGho4uIk5uco5mWqqGnpqCSm4eVjXt3jY2Dp35/kpGSk5yyppuVnpCNspKXhKWMjJWbn4mQm4KIkYprfI53eGWChpCLfImdhIeLkIiIgISEkHd8eXSZoIiGiZ6KhJR+fYqAgHVvc4SCfneGhoqPppCDhY2Hg42QjH2IjIqRhHltg4R9eplqcmhhdIpwfXp3d3B3dIFdXm+GaG5fXlpdXVRoclZjXFxibGh1fHxzb3Bka2tpgHxueYByanBwbGeBe3KCgHh/fn+Fe22CjIZ8eXh7fXqDeU5kdmpybXB6ZWtlY2JgW3RmcGZycW1VXWx0bWl5enFnaWtkjIeduZ6WoqGYlJiYlJikoJ57gJqrjp+NhqCci56WfXmUg3uOmYmGhISGbniBgHOBiH6JlIRta356l4eEg5B/gIaEhn2HhY6cnpOHrJ+EcouQhpKRi52RfY17qoSNkpiWj5yWh4abpp+hmp2GgpGamZiQmqafpZ2dkJZ/j4l1e4aNg6R6fI6QkYaYqqGdk52PjaqOkYCdjImTmp6Cjpd+ho6Db3iGcnVhfoOPhnWLmIGDj4KGhX6FhJRueXV0kqGKi4Wag4SMc3+JfHxycnuHg3p4io6DkqaOhYOOgIOKiYp3homKjH5xbX+BfG5obG1oX3p/aH18dnV2dXt3XF9wfW51YGNbXV5RZ25UZVteYmtpdnp+cWxtZGtqaIGAbHOBbG11bnlwhXluh4B2goB+hXZxgo2Ifnt6fH97gopgaXxqdWhpgmVqY2BpXGR1aG9idW1sVWNxeWVwentzZWptbIuJnreaoaOfkZGVl4uan5+ee3iep5GcioeklIuYmXl6jYV8iZGDjIKCgm58f3lzgYV9i5B9a2h9gpiJgIeNfH6GhIZ9j4KQnJ2SiamdgHCMi4yTh6GiioWMfaiRiJCSl5OWk3iMo5+gnZaZf4CQmpiSjJqjoaOal5GafYyDd3+Cjoagf36MjI98mKSgoZOZkI+mjY+BmpGJk5ebfpOSfoeOgXR0gnB2YH2AjYZxipV8iIxxjH+ChYaOaHdxeIuYkY9+ln2HinKBhnt8cXh6ioR6eZCLgpWlk4uEj3qGhoeFdoKEiYh8Z3N9f3l7cWxrZ19+c2h8dXZ0fXOAal5gc3Zwd2RjWV9eUmtpVWVZX2FoanZ5gXFna2RtaGWAgWttfmhwcWt9eYd6a4yBc4GBfoF0doKNhn98en+BfX+PanKDbnNpYodobGJfcVZ0b21uYHhobVdqdHZjdXp7cmJqb3mJjZ6ykqWlnI6Pl4+GnaCbnXx2paGOmICMooqImpZ4e4aHfoOJf4iCgX9xf3t0doOFfoqReGdjfYaXioGJjHl9gI2DeZeClpmXjZehnH5wjIKRlIamm4eMiYOmlYWTi5aXk5J3kZ2goZeTlnl+jpiXjpaanaSdmJKUmniNhIJ3g5aNnX6BiY2McpejnqGTmY6PooyLg5aYg5KWmX6YjHyIjYB2cX1uemSAfIqFcIaTf5CCbIeCgYCJhGV1b3uGkpeMfJJ3i4h7f4V8e3F+d4iFeYSPiYqXopWBgop2iISCgnd8goqGeGF6eX10f3hnbWVhf2pqd3N0dX1xfGJjYXNudXJtYVphXltsZVJjWWBhaGt2eYZxYmpjbWVofYNsaHVpbm9nf32CeW2QhnGAhIN/dHyDjIGAfnqCg358kG12iXR0bWWKbGpiY3VWhGlxbmB4Z2xianZwZnl8enFfcWyGhY+crpemqJ6NjJeHhp+Tl5l9eKqcipl6l52LjJiQeXyBjH58g3yAgoF4dHl6dH2AhH+Ji4BkXn2LlYd+hIZ1fX6Kf32ZhZeVmI2ko5l/c4d7lJKKp4+MjoqToZKDkZCUl5GLgY+Xn5qSj5Bzf42SlImdnZ6ml5eNlZVzjI2Ja4WXj5l6h4iQiW+XnZqjk5WKjZ6MhoKSnH+SkpWHmYh8iomBeXF6a3Vse36Lfm2FkoKUeHCCg31+in9kcml7gJaXhH6Mc4+Hg3iGfXZ3f3yFgHyCjIOLk6SPeIOBdImHfYB0doGJhXBifHZ6cX1vYm9jZHxjbm92c3h3c3RhdWBvbHVtb1xcX15fal5QXVljYWhtdHuIa19pZmpjaHeIbmZsaWpsZ4B9e3dukIhzgISEfXSBhol7g316gYR9fY5yeot4eG5sh2poX2lyYodocW9ldmdubGF5aWt9e3hwYXdti4CZmaqgo6idioqRhoqei5WYfneumY2XfZ+TkZaUiHd+e4p9e4B2eH+AcHR0fG+GfYGAin98YVt+j5KGf4ODc3qAh3qPkomTkp2TppyVgn2CfI6LkqSJjoqNmJuNhpGYk5aPioiMkpySj4uMboOPj5GInpmioZeWiZaRboeYg2aFmI6TeoiEkIpwlZqUopKSiYuZjIJ/kJ59ko+SjJmOe4qEh3NydWtwbnV8inRuhpCOknF1gHuBgYd7ZHBseH2Zk32DiHOQiYBzh3luf32AhXuFi4iDi5WojHqHe32LhXd+cXCBhoRkaXl1dXB8Yl9wYWt0XnFqe3l5bHNwZXhdbmxzbXJZWl9fYWtaUFdYZWNncXF+h2ZdamlnYmdxjW5kaWdkaWmBend1b46FdIGCg3t1goiFeIV8eIOFeoCJd3+Le3pyeINqa19waHSAanJvbXFnb2xlfGNugHp3cWx3d4p+opehqKCmm4eMioGPnYeTnXWBqpWTjoehjJWTkIB0fHaFeHl/cnN7hWtycHptinaAgYducVtYfpGNiH9/f3d1gYGAoIaRi5OdmKGVmHiKgIGNiZyeio+GkpiWhYmVmY+Wi4uMjYyciY2Pg22Ji5CQip2WoZyXlIWYh2qDooJlhZ2KkH6Lg4uBd5OYkZ6RkImJlY1/fo+YfJGNj42akXyKgIJudXBsbW9we4Vpc4OOmIpxd4B1goiCeGZybnWBmY57iIN5k5B5dodzb4h7hYt6ioWCh42bo4d7g3WBi393eW5sgYSCXnN1c3FweFpecWFwa15wan17cW1tamx2YHBvanFtWlhhYWJuWFFUWmZnY3ZvhIJiXWtuZGJma5JuYGZmX2drgXVyc3CLgHV/g4B4dYCLgHmFf3eHhneDhXyHjH97dop/anFjfGOGfG5xbHRqaG9sdnhfcX95fHR1dICCfqSVmq2ep5aFjYN/l5SDkKB1i6CUkoaLm4yVjot6cnh0gnByhXNxdYhrb212bYh2g36AbW5VUYGrlYeCd393c4J6gqGCk4KVlJmck5p4knuDjZOkmpOOiZWZkoWHl5mMlIuJj4+HnYSPinxzi4WJjoicmp+blZR/k35ohJuGZ4Wgh5GDkYKJcYORl4+bjo+MjI+NeHuSkHqOi4ySlox8iHyAa3ZqbmtsbHt/YXp+jpaCdnqAeIOMfHlnc2xzh5WKfoeFepOOcXmDb3aMeomLeYh9gYuPnp2EfHp2gYt9d3BqbIKDemF5cW5tcnRWXnBicmFgbG56cWhwZmZzdGhwa2F3ZV1WZmBgclNRTlxmZV15cIh8X1xpcmJiZWaSal9oZFtncH5wa3F0in12fIWAdHV+jHl7hoB4iINzhoV+jY2EfHmVeGZyaoNgiH1vb2t6YGpudH91X3R9eYZ4dHOFfHigj5mwnKWOgop/g5qHgIyef4ualI+FiJiOjo+Ed3R2c4Bwb4V0cHKEcGtqd26Dbn19bXVzUk2C38iS1pN8cHWDdoSgg5R3lZKZnJGZe5RzhZCfoZOTkYmSm5SGfpaWiI2NiJKNiJx/joB3eox+iYyKnJudm5WTeYx1ZoeQhmuHooSRiJeChWOMkZmOlYqXi42Ki3F6lIh7jYiKk5GJeYV8fmx7ZXJva2t6eVuAeZCOgHp9fn+Gjnp6aHJqc4qOiYGFhHyUimt9fm5/i36LhnyDeYCOlJqainx1d4OQeHJtZ3GAhW5rdXBoanVuU19wZXBaYGxyeGdra2JmeHJwcGNfd2BgVmtfXnZQTkthZ2NdenCJdFxcZXZgYWVlj2NhZmJYaXNzbWpxdox9dHmGgXV2fotzgIZ/eol+comHgZGLiHx+mHZlc259ZYh+b3BrgFpsbnl5c2F2e3uNdnJ3ind5n4ubrpugkIKFd4iVfn2KnYeGoJGPhYyYhJOOh4F0d3B5cW6Eb21vf3NlZXlxfW15fWpoa2OkmsHcru+hc2x2hHaFo4aSb5eRlqGWnIGScoWLo5eJjpWKkJ2Wg4GVkIWJkICRiomWfod6dX+JeIeEjpybmJmOj3aJdW2FiIp8iaKDkImchIVei5OXio6JjoqKhIlte5aBfYiFiZGPhnaFfX1rfWR4dWpueXNXiHqSh4V5foCAhYx+eGVyaX+JjomBgn6LloRrgXVth5CBj4R9gXh+kJWTmJB0cneHjHVzcWd2eoRjdW5xYmp3aFJhcWdrVl9vdHphcmRfaH1wcm1aY3JhYlZuWVx4Tk1MZGdiXndziW1cXGR5XmBkZYVgY2NeWWpya25rcneMfnR3hIF4d3uJcYOEfH6Ie3SLiYeWhox/fpdzaHVxeW2Lem50cIBXcXp2eXFleHmHjGl2gIlyf5yHmaeco5KFfXCMlHh5i52EhaGNjnyWjYCaiIR7c3dwc2pwgWxqbXx1X2F4d3txdXtnYGR869q1ycPciHNsdIF2i5uJjmqZkJCelpSBiXGFiaCOhYuVioyYlHyOk4iDiZB7kIuFj4F/dniDhHKIgpOcl5SXhox1hn1ug4GIhpihgpOLnoOJYYOUj4aJhomNh4GHan2UgH2DhImOjYJxhn5/cXdodnJpdHdrWox8koOFfX+DgISKgnVhc2uIgI+KgX5+kZB8bYFreIWOhZGCe4B8fpGSkJaIbnB5jIZ1a3Fsc3mCYHVqb11rd2BSZXJoZlNgcHZ0YXBgXWiDcXNqV2doYmlYbVZbdUxLTGZnX2Jyc4VpW1xleV5eZGd7YWRfXVlrbmZvaXN4in5zc4F+enZ6iHOFg3x/h3Z3ioaOmYGMgnuTdWx3dXl4k3RueHt8WHqGcYBvZ3l3koJkdoaFcYqWhZmhmqKKh3Nvk4tyd46cfouaiYl8n3+Emn+BeHJzbm9kcn9pZm14eFxfeXt7cXGAamFnYX/Vto6QpnhucXd8cZORjYdrmo+JnZOMhntph4uZhoGSkYaHmI58jY2BgYqNfI+MfYmEenR6g3txhoCWmo6TlIGIdIOFdYJ/iZGcnYWUjp9+iGF/k4eEiISJjX+Ag2d9kYB+f4KMjpB+bYJ8gnRrbXd1dHd2a2ONgY9/hX58hH+EiH5vXnFwhHuOi4F7fpCHeXCDZnmCioaLgnqDfX+Tjo+ShG5ueYt+dW1ubGx7fmNpbGpZbndaUmpzaWJRY3N4bGJlXlpqg25zYVtnX2RsX25VW3BOSE9nZVxnbnGAbFtbY3NgXGNsd2RlXV1aa2xibWp0d4Z/cXB/fH10eIZ4hYJ8gId1eYmBkpZ8iYZ2iYFwd3l7hJNvbXyBd16Df3SBbWl6dJRzZ3OHfHKSkYOan5ughoh2dpV+bXaUl36IkYSKjpp9jJp2fXZxb2xqYXV8Z2JqdXpaYHh8em1xf2VkaGdXnY9ecXOWvMSEdnGUipB/c5iMh5yUjYh0a4iPlYB7lIyBhJuMfIuGfXyJjH+TiHWJhXZ2fYFxdYaBnpWGlY+CgnF/h3ODeoiWm5aGk42cgIhlfZKCf4WDiYlygn5nfYt7eX9/h4uPfWmAfYN2Zm95eHN3c2xqjYWKgYp/eYKAhIN/al1wd3p8i4iFe4COf31ygGh4goaKhYJ3gnuAl4yPjH1ta3qJfHZ0b2lofXdlXXFjWHB0U1Rvc2hiTmh0eGZhXl1Yb4Bvc1llYl1qbWBwT1lsUkRUaGFaa25te29aW15sY1pjcHZkZ1xdYGtqY2xpc3aBg3Fufnt/dHWDeoSCfIKFdn6JgZaReIOKdIGIcnl5f46Qb298gXFpgXl6fm1tfHaWa2p4hHRrlI2Fn5igmoWIbn2Mdmp4mI9/goqClZiKeo+Wb3pzcWxqZGB0e2lgZnJ7W2FzfXpncHphZWWOsbJ3SmJapNnQl3J7koyReX+WjIWako2Gb2yGkpF6eZOHgYSZinyHf3h4iYqElYBviodxdH17anmGg6WRhJONg35ufoJ1gneFmZiTipKPlIWHb3qSg32Dg4mDb4J4aICFeHJ/f4OKh3xlfX6EdWNwc4BoeXFvdZiNhYKKe3Z4gIR5gWpab3xyf4eDiH2FiHqIcoBtcIOGjYODcYN4gJiMjYR3bW19g392emVoan5yYVp4W1lybk5YcnNmYEttd3ViXltbWXV9cm9XZ11manBfb05XaVI/WWdfW3BqZ3lxW1tZa2VZY3F5X2hdXmVsaGZsaXF3f4dvbX99gHVwgXuAgX+Cf3aBhYmXinGCjXF7hn16eoSUjHVqen9sb350f31vcnx7lHBvgH94ZpKKgqGYnJKChWeHhHBoepeJfoCFgpmKgXyNjWl4cmtsZl9hb3ltX2JveV1kbIN6YXF2X2Vl1eu+izI6PouOgHJ5homPjXeFmI1/k46Nf25shY2MdX2Pf4WClYl8g3hudoeFg5d3boiEbHV7dWZ5goOojIOPjIN9bX90doF4hJuPi4+RkoyLhn57kod4gISNg2yAc2l/fnhtfHuBioN4YXmEgXFkcWl+bXRxdIGbi4B/hH5zdX2Ac4BuWmt9dHiJgop7hn98iHh5cGuHgo6CiXGBeH+Wiop+dG1qdoCAdXVcaWl4cVlXfVNacmVMW3NyZVtKcXhwXltbWVx1f3VoWWJbZ2VuYmlNV2ZRPV5mXV12Zl90cFtZVW9kWmVxeVpoXmBnbWdpbGhweH6ObGqChH95boB7fYB/gnp1goGMk4VwgItud36Be3uIk4mAaXt+a3R8coZ7c3d9f4x6eIR+fGuMjIObnZaMgYBsjX5raX+PjXt+f4OUgn99iohrdXFnaGNbYmdzb2BhbHRhaHCJemFzdF5jZJugkG5cNVmvtXVqgIp+k4Z3h5iHdY+MindwbIWDh3R5iXiJfZOIen9zZ3aIfn2Yb3CGfWh3eW5leoiEpYeBh42Kfm5+dn5/e4qYhoGTkJeIi4SJfI+IcXt9hXxpfm1rgHt6anp2goeAcmB3gX5xZHJndYJtdXuFlZGBfIF+b3d5e3R9bFdtfXVzioGGd4d1gYl6d3JtiH+Of4Nyfnx9koiIem5taW2CgXVuXWhmdHJSW3tOXHFcT1xyb2RWS3N5a1hZWVpgcYF1YF1dYWdkaGhmTlpoTkFhZFxgdmJcdW1YWFN0YVpkbnJXal5iaGtnbWxpcHd8k2xphIp9fXB+fnuBf4J6d4CAiYuEcnuHb3F3g397io2Pg2p+e254eXeKd314gIKHf4N/fnpthYyImKONhIN7dox5a22EiZJ5fXuCkYCAfYqDcHJwY2ZeWWdfcHBgYWhwZmpvinVhdG9bYWRpdnt/vpymo8i4coWEc5N9eYiUhHSRjYhyc3CEe4NzdYZ0iHeUiXl5cWN3hnmAk2lyhHVmd3ZjanyDiJ6CgH+Ojn1yfnODd36Qj4J3lY2Uj4eCiHqJiWt4eX51aHppbH95c2l6doCDfWhgd4d+ampzaHuAaXaBjJCUfnp9fXF7dntzfWFVdXtxc4mDgnyCcIaKd3dvb4KBi318eH18dY2FgnZocWhsiIJycF1oY3RvS2V2TF5vVVRZc21iUU90eWJTWFhcYXCCdFtgXGhlZGNqZFBbcUlEZGJcY3FfXHdoVVdWd15cZW5oVmxeYWpnZW9vaHB3epNuaYiLeX5ze355goGCfHZ9g4iGg3B2g3Ntd4ODfomLlH9xgHx4eXqBi3SDeH+BgYKEeYB2b36Ji5ueiH2GeneHfGh0ho2Ren9/fImGhHaQgGdwbl9kXFhlWW1zYWFhcWxsaIluYHNpWV5kbYB3qdqqx4aHs3KKeXCOdn2IkIF6lIqAdXR1fneAcHF+bYV0lIV4dGxgeoF5iI5mcYNvZ3VuW219gZCTgIF5kpJ9eHtthnR/kIuDcpWKkI6HhYV7f4VtdXZ/bmh3Zm18dm1qd3Z/f3xgYniGemh1dWN+e2d0ho6MlXt0gHVxgHp8bH5ZVnJ8b3SDhn9/eGuIhnN4anR/goJ8eXx3e3KKgHxzZ3RkbYuEbXRba2B2Zkhub0xbY1hXVnhtYlBTdXdZUVZYXWByhG9cYGNtZGNdbmJUXXJHQ2ZfXmZpXVp7YlJWXHVbW2drYVZrX2FuZmZscWhwdniPdGuOjXV/dnh9d4GDgXt0fYOIiINvcYB1cXV+hoKJjYp7d394hHx9hYd4h3x9gX6EgHt+c3Z5jI6fjIl6iXd1g3lefoaajXmHg3SGhoR3iXtibmxbYltbYVVqdGRgW2hvcGeHcmFxZlddY2t/fMrOh7mia25ui21yhXJ+hYt/e5KFenl0eXV1e2ptdWOEdpKBdm9nX3yBeYuJZXGBampxY1hte4aciYOCc5eUd357bYdwgImKhnCWjpCIhYuDenl+cXFvfWdocmNueHJqbHF3fXx6XWV5gHdpdXlmgnZndIeMjZR8codqbn6AeG17XFhwfWxzf4p8gW5uiX9wdmZ2foB+gHV7cXpzhnt5cWVyYG2MgmxzWGtfeF1Jb2xNV1ZfVFV8a2FPVHZzUVJUVl1idIVoXGBramZiWW5hWGNwR0FoXWBmX1xWe15PVmVwWltqaF1XZ2BfcmZqaHJocXN3h3hulYp0f3t3fnmDh4B1c3+GhY6CcHB7eHd1eYeFh4yGenx/dYt+fYaEhId/fn59h398eHV5d5GTn36MfYtudYB5ZIOIl4Z0kopvhYWCeoN1Y25qWV9bXV1VaHNlYFlkcnJngXNia2RXW2Bpf3i+rnuft21idIdpdHxyeoSHe36NgHh4c3dve3dlam5gh3WOgHJpYl9+eHmKg2ZwfWhqa1tXb3iKo4GFf3GZk3GAeHSBbX+BkIdyk4eMh4OIhX15dHJvaHlham1hbXZrZ2tsend6d1tnfXx4ZXN+boR0ZXWGjYaVfnCLZmt6gnRsdGJbbXpqdHuLeoFmdIZ9bXBndH53fH5xe2t5e4F5d3BlbGFsiX5tblZrYHhWS2tsT1JPaU5ZfWdiTlV2bE1RVFVeZnaDZl1hcGhnYVdpXVxsaUpFa1piZFZYVXlaTldualldbGVcWWVjXnRmbGRyZ3NwdIF4cJmFdoB/eH98hYd9dXOCh4CVgm5zeXt7c3KFh4iIhHmBfXaPf32EiY6DgYN7fouDe3d8d3eanZd6ioOHaXZ+fGyEhZSAco+CcYaCfoJ/b2ZsZ1ddW1xbU2VwZV9YY3N1aXVwZGViV1xcaIBwb3KAc4llZXl/anR2dHSEhXiChHp3dHVua3pwYWdrZ4Z0jYNtZl5ffG97iX1obXdmaWRWV3Jwjad8hHx2lpBzfHJ7eW16epCEdpZ7h4aChoN9dXBybWd1XW1pX2x1ZGdmaXpve3JZZ4F2dWdwgHiCdmJ3hYt8lIBui2pteoBwZXJlYGt4ZnJ2iXp9YXWDdmlrcXR6b3h4cnxlfX5+eHZuY2VhbIZ8bWtWamJyVExpa1BMTnBIXntmYU5VdWVLT1NXYGt3fmVdZ3NpZV9WY1dicF1LS2tYZGFVVFVzV01ZdmVaX2tgXFpjZV93Z21icGl0b3F+dXSZgXiAgHiAfoaEen12goN+mIVucnR8enRxhYWPgoB6i3V0kIB9gZSOgIWEfH6Mhnp+gHZ7o6WKeYiGhWx1fHt1hIKMem+Fc3qFfYKDdW5qaWVWXVtbWlNjbmVbWGF0e2pobWhgYldfW2mAaWtvgGdsYWl6eWp0dXRvhoJ7gX12dW56aGp5al9lbmmBd5CEaGZYYndpfod6b2lvZ2ZdVVhvaI+ndoF6fJCOeHVufW1xdHiOfneUdIWCf4WIdmpydmdob1xtZV5uc19nYmp4aHttW22Dc3Rqb4B+eXdid4SEeI+Fc4hxcHl/cWJwaFtud2Rwc4d7eGFygHBnaXhzcWt3dnN1YoJ6fnd1cGNjY218fWtrVWliZ1RMbWlQR1JsRWF4ZmJNVHNeSk1VWWVseHtmX21xamNcVl9Vb29XSlNoWGdeWE1VbFRLXHpfW19rXV1bYmVgemhsYW9vdW5vd3V6l313gIF5gICHhnp5eoN9gZOEcXR0f3p2dIWIkH2AfZBsc5WBe4KfhX+HfYB+hoKAint2hKyff3qIh4RscoJ5doGAgnRuh299gHSKgGpvbmRkWF9aWlpVYmpnXFpfdYJpXm1sXGFWXFxrgWVydH1pal1sd3ZodXdybod8fn56dnNsemdpd2ddZHNoeneSgWNjVGRvZ4KEd3ZmaGphV1ZZaGSQp25+eICLjnpwb3tmeG55inp2jnGDfX5/hm5kdnNkaGhdbGJecG9bZ15tdWV6aV10gG9ya3F7fnV2Y3WFinuHh4B/d3J1fnNgcGxZcHJicXGEe3VkcoBsYGx6b2poend0cGSDdHl5dXFkYWRtc35qbFRpXl9VTHRjUUdXYkdjd2ZhTFRxWUtMWFhnbHZ6ZWVtcWZjWlhdWHZmVEpcY1hpWFhIV2VRSWN5W11gbFteXGJkXoBpal9vdHhub252g5d5coGAfYCJjIZ+dnaGeIaMfXR1dYJ5enqCjI59foSJanSWgXuKnX1+hXmAe358hohzcY+ujHt7hpB+ZnGIenR9fXZyb4Zte35tj3picG9iZV1lVlpZV2Nma2BdXXOGaVhwbVteWFpcbHtjcXd2bWNbbnR0aHV2cW2FeX+BeXdub3RlaHRlW2d1ZnZ2knpgXVNlZmqCgXN9YWNpXFVYXmJkkKVoeXSChZB4bG54Zndse4N5dIhygHh7eH9oZXZtYGZhX2pgXnVrWWVdb25iemZbeHxrbm5wd3l0dWVyg5J/h4OIenZvcXxxYXdjWm5vYXBxgXtzZXGAZF5tdmljZnh6c2ttgHRzfHJxYl5lbW99ZWlUaFlaVU55YFJLWllIYnVkYUpVblRKTFpWaWxye2NsbHNjYVlaW2F3XFRLY11ZalNWR1lhTkhqdlhfYm1bW19iY12FaWhhbnh5bG9qdoGQeG2CfoCCkoiEgXZ1iXSLhnRxdnaCeHx9foyQgH6TfnB4loN9mZJ5gIB4eX5/c4iDc3CZont7gImVeWR1iHlzeXZrc3B/bHl8cJFyXnBvYWdibFRbWldpZG1mXFxyiWZScm1bWVhYYGx2ZGp1ampfW210cm10dHRrhn1/gHx3b25sZGlwY1trcmR0do5zXFdTZGBxf35xglxhY15TWmFcZJOfZXJxhIOQc2tqeGxub3l5enGAdn9yeXp6ZGZ1Z15iW2FoXF53aVdiXnBoYXhhW3t2ampyb3d0c3RpcIGUg4Z+hHZyanB7bGV2V1tqbWJwcoB6c2Vvfltgb3FiXmlvfWxqcn1xcHdrcGBbZWtte2FnVGdVWFJRd1xTUFlSSGNzYmFHVmxRSVBaVmtsa3xlbW9xYVtaWFlscFdTT2ZXV2lTVEZaXE9JcnVZYGRtY1hhYGFejGpjZG15eGtvaXV5hXtrhH2AhZl9goR5fYhtj4Zxb3d6fHSCgn2Lj4OClnR4gpOGgZ+JdYF/gXR/gnCHgnVvopdze4aLh3tmd4tvbnxwZnhxe2xzdnONa150bmFnZmtTXlxWaGJsbFtccYxkTm9tXFZYVWdpdGhjdGVlXVpvdm9xdXV6bIh9gH2Id5BzY2Rrb2Fdbm1kc3iIa1pUVmJjd3x8cIVcY19jVFpgWmOWlWNucIOEiXJqZ3luZXJ1cXpreXN1bnp+dV9mc2NbXldiZFlhdWZWX2FtY2FxXV1+b2hpc3FzcHV1a2yEk4GJe4VxcmZue29wblJaZWplcXOAdnNibHZVYnFrW15uZHxla3R8cXJyam1gWWNpanheZlRlVVZQVW9YUVdUUEhlcl9hRlhrT0lYVFZuaWR8aWt4a2FXXFVbdGRTUlZoUVlnVFNIWltQTnh3W2BmbGlaYmBeXo9uYmZreXVubml2dn5+bYSAfoaXe3+HgYl+a5OIcmd0gHp1gIN+iY9/i5NyfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4GNi3d4bnuNYGR8cWd5c3ltbXF2g2dkfG1jZmdoU2BfVWdgbG9cXm6OaE1pbGBVVlNvZnNsZXhkZV1acXVuc3t4c26Je4F3nHt6bGJlbG1eYG9qZXF5f2daVlhfbHh7e2+DX2JeaFZZYFhknIhia3GBhnx3a2p2bFt1cGp5aXVybW57gHJYam5eWV1WYmRYZXFkVF9iaWJibVpgfmtma3N1bm13dmtohYx/iXqHbXFmb3tscWxiWF9oaG9zgHNzXmltU2VwZFVibmF5Ym90enRqb2xqX1hgZmh1XWVWYlZTT1lnU09dT09IZW9dY0daak5KX0tYbWVfeGhufmRgVV5UXXRbVFNgZk5dYlVTSlxaUVl1dl1fZm1oWGJhW16OcWNnandxc21ndnN5g3OCg3uIjn58ioiOeW6QinRsc4Fzf3+IhYeShJWPen2Mj4iRm4SAfIyEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fX59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY2NjY2NjY6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkpOTk5KTk5KSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6NjY2NjY2NjY2NjY2NjY2NjY+Pjo6OjY6MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJFtZmdnZ2dnfYWEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJLkpqZmZmZmZ6goKCgoKVeKi8vLzAsSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMkWdfYGBgX155g4KCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1Mz+TnpycnJuboqSkpKSkqlYVHBwcHBc6g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRjo2NjY2NjY+QkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho2Ojo6Ojo6Pj4+Pj4+PiIKDg4KCgoWKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GSkpKSko2QkpGJh46KkJKTkYuQi4qQiY+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIyMjY2NjYyMjIyMjIyNjo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOhoyFioqGiJCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJCIjIaIh4WHj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQkIiNjYmEhoiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fX19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yQiIyHhYiDio+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+MjoqKjomOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enl6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj4+Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYWEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4mJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTk5SUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSkpOTkpKSkpKUkpGUk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKSkZGSk5SDhZSSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSjoOSkZGTjXWJk5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJGOb3+SkZF8dImRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj5B4aoSRinN2iJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Oj3tncY6EcnWHj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyOeVxodXBkb4iOjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouKioZkaWtcZ2prg4WDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3bmN1bFtqdW5laGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGdgZ29vZmxydGpiY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWVxiZ2pyb3FzbVpZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3l2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NUl9jZW1ubmpoUlFUUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5PTU1VY2tnbG1tZ2VZUU9PUFFPTk5PTk9QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRUVLUl5obWdsbWxqamZiXFVQT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRkZTW11hZmpuam9ta2pra2pqZlpLSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs/QENTXmNtbGxud3JqaWtoX1RNRkVFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs8O0dLQk5ibXB6c2tqYEtGQkVGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwc3R0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oz08Oj5NYHRwY05DP0BAQ0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTk7OjY4V2ZBODg7PD1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09PTw8PDpEWTk8PD09Pj9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A8XW5APkRFPz9BPEZdPT49Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojttd0k4Ozo9PUE8S2I9PD08ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPD09SUxGRnZ3Tjc4ODo7Pj5XaUE7PDw6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ2d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3lJO11/g395fHdWPD0/PT0+RWl0TTo9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUhyeWtigoSDg4OAfV0+QENAQD1JcntaOj1BRUFCQkZIQz08QEREQUA/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARm90fYKCgYN+fYR1TEFDRUA/Plh7gF0/Q0VJSklJTU1LRUNGR0dFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXFDREVEQ1d1hoeHflhHSEpNTE5PT0xIR0hISElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p8fX5+fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEim1BQVZ0h4mHh4eIg1dITE1MTU5MSUdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzdnd6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIg1ZshYeGhoaHiIiHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklKSEhIR0lJSUpJSEZKSkpKSUpJSkpKRklMTEtKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlWBg4SEgoKFhoaEgoaFhISGhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ozo8QUFAPjw5OTg8PD07Pjs5Oz9BQkBBQ0NCQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJZYWEhIR/gYKDgoODhIWFhoeIiIiIiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4ODs7Oz1AOzk5OT08Pjs7PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlqhoSEgX6Bg4ODgoOEhomKjIyLiomKi4yJVDo4NjY2NzY2NjQ1NzczNTY4Ojg3NjU2NTY3Njc3ODo2Nzc4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmaFg4GAgoODg4ODhYmKiomJioqKiouJioqBRzY3NjQ2ODg3NDU3ODU2NzY5OTc2Njc2NTo5Ojs6Ozg5ODk4Nzc3OTo5ODg3ODY4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhIaJioqIh4iIiYqKi4qJiYx6Pjk4ODs8PT45Ojo8OTo7OTo7Ojk5Ozo5PT09Pjs7PD06Pjs5Ozs8Ozw8OTo8ODo6Ozo5OTk8Pzw9QUJESUpNS0lLTFdvcnN1c3Z4e3t8fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQEI+QEJAQD49PT5APz4/QD9APT0/Qj9AQT9BPz1AQEA+P0E9Pjw7Ojs5OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e319e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQkFHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uLioqLiotePkRHSUtKSUZHR0RGSEdFQkBAQ0VDQkBCQ0I/QERIRUNFQ0VFQUZFRkRFRkRAQj88QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp7fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDREZXhIKDhIWFhoaIiYmIh4aGhoeJiYqLjI2MjIuKiohWSE1MTUxPSUlLSUlKSklFQ0RGR0ZEQ0VGREJISUtIR0dGSEdFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT5CQkdHSVmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTlBOTE5MSkxKSUlISkZERkhISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEdHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg4PDs8PTo+QD4/QENGSUlQX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjIyMi4uKjXJOUlBOTU1MTEpIR0VJSURKSEdLSkhKR0dHS0xOTExISElKTVFOUE5NT0tJR0lKSElESUhIRkZHR0hHQ0JBQ1VucHV3d3l6eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHR0I/OD9AODo8OD0+Oz1BPj9BREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMi4uLi19SUlBNTk1LSkdFQkdKR0xLRktOS0tKSkxNTE9QTkhJS0xPUVBQUU9PSklKSkxKTEZHSEdGRklGRUVCQUJCXG9yd3h5enp5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFhWUlJUU09MS0pERUZLT05PV1VRUE9RU1NNU1RPTVNMUFNVVlJTUVBMSk1NTUtOR0dKRkZJSkRERUVCRENjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JCR1ZORk5QUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLaFdVa2FFUlFRUEk7O1JUUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9OUlBQUFFLS0tISEpIRUZJSUlISWlydnl4eXl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHR0ZFPz9BQUVCQ0dFREVMWFJNVFVWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMiouMfWGKi4uHbFtkVTpYWFhTUT9AVlVZXGRgVllicl1dV11aVUVRWVpbWV9UWWdSVlZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3l5ent6e3x9e35/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36LiYqLeW5wWFpcW1JTUlZWVFtadYNZVX2QYFxYXV5XSVZdXVtbX1lIWVhZW11YWFlXUlFOUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZVFVUV1JRV1ZjloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXFtcXV1XUk9TUFBRVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTUtmeVtdVFlVVl1aS1RaVVNUXlpYV1dXemtYW1tcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVVFJPS0ZDREFNXoNsVlJTTk9RT1FVUlNSU1VjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtNTktNS0hKREZIRUM+VGRVf1JRUU5LUlRRTU9ZUk1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dnVzc3d6ent7e317fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlZUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDP0NDQ0NCP0RQQkNAQz1DSUdWQEhOTEddaVBIRk9GREVGSUdIQ0RIR0hLR0RCQURATlFNUmRydHZ1c3R1enx7e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGCa01HP0A6Oz5AQD8/PmpRS2FFRkhJRUI/R0xOR01RVUlCRT8/PD08PT0/PT9BQ0NAPzw9Qj5KTUdVbnR0dXN0dnh6fHp9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGpqZmBbUVJaXFleSkpQUU5LTFFSUVRWVFdRUVdWUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlQ0BAQj06QkNBQURCXF1Pe05PTk5LTE1PT1FMS0xXTkhHQEE8OTc3Njk5PTs7Ozg5ODk/PEJIP1xzdHV2dXZ4enx8fH18fH19fn58fn19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklIUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIRkZIQkFHSUVFRkRNUlBhV1JXUVBTU1JVW09PUVdQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEM+ZXNzdnd3eXl7fX18fHt8fX1+fnt+fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpYTUxUVFNQUVVPTFJTVFdYVFRYUUxXWVpWWFhWWFldV1hYaHNrXVZhc2thYV9eZGFfXllUUU5OTkxJSEpLSUlGQ1FQU1tXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk5ODk3ODg1NzU3ODU5OUducXR3eHl7e31+fX18e318fn5+en1+fH1/f359fn5+f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVFZYWFlTVVRMS1RWVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMT1JST01NTk5OTEpGUVBVWVNUT0pOT1VTVFxWUlVTUk9NTElISEY/Pzw6Nzg3NjU5OTY3NjY1V3Bwc3d5ent8fX59fnx9fXx9fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwb2ZlZGNcXVJUWlZXVVRXVFJYWFlZWVJVT0lHT1BPT01SSk9QT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFJNSUxKT1JQUlJTVFFST0xMS0xMSENCQT06Ojg3NjtCNTU2Njpkb3F0d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpIR0VITEhLSUZMTVBNRy9FX1I+Mz8+am9hUlJRQEdVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHZ6e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hFRkhKTUxFR0NPUkM4RU5TXWZTUVNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ1eXt6e318fHt5fHp6fn58e3V0dnJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRYV1VNTEtJPDk4Nzs+QD48PUFAQj0+RUhHQ0ZGSUdKSkBGQUFARkhFSk9IUFJhXFFQUk5TTk9QTExPTUtNTE1PTltXS01RT0dJSENISkxMSkZGRkU/QkM+PEJHP0I/QWRwdHd7ent7fHt6end7d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIREQ9OTc3OT9CPjs/QkBAPkFESUVDR0dJR0lFQkI/Pj1DQkFHSURNT2JlUU1OTldLS01LTE1NTUxLTk5TZE1KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLbm92eXl5e3t6e3p3dHh1eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9ISkQ/QT05OTk6P0I/PEBCQkFERUdLRkNISUdHSENDP0I/P0BBPkRFREtNUlRMSklNVEdJSUpMSktMSUpMTU9QUVBLR0NLR0NCSkpMTU9OSUpJR0NDQ0RJSk1MSVlybXd5eHp7e3l8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUdLREdISEdKS0lKS0RHQj0+PTo6OjtBQj89QkJDQ0hGSUxKRElJRkdHQ0M7QUBCPkBAQkVESU1QSEhLR0hLREhJS01ISkxISUpLSk1cUkhIRE5GQURLSk1NUE1LTUpLRkdHSk1OUU5MYm1pdnZ3e3h8en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktDRkVHRUZGR0VHQkNAPTw9OTo6OkFDQD5CQ0VFSUVJSkxGSUlHRkZDQjtBQ0M+QENDQ0RHTE5IS05IREhFSUxOTUdJTEdGR0lJTE5LSUhFTklCRk1MTkxPTU5OTUtISElPUlFTTlJmZmZxb3N4dXt5fGxoam5la3Fsc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkRGRkVDQ0NFQERCPkA/Ojs7PTo9PkNBPkFDRUZKRklITEhHR0dGRUNAPUVFQj5CQ0NDREdISUdNUEpGRkdLTk9LRkhKRkVERUlKSEtJRkhQS0NJTUxQTU9OT09OSkpJTFJVVVJPV2RgYW1ncHJvcnl6Z2VoaGRpbGZxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxHRUVIQ0JBQkQ9Q0I+QD05Oj0/Oj0+QEI+QEJER0pGSUZJSEZGR0VDQ0FBRkZDQkNCREVFR0dJRkxRTElPSkpMTElHSEVGRURDSUlIS0pHS1JNQk5PTVFOT09NTk9LS0tQVVdWVVRYX15caWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1anN1bnV0c3FyamtzTUdIRkhCQkBERDxCQUFDPDg6PT45Pzw/QkBAQERGSEVIRkZIR0ZGRENFQ0RJRUNGRUJFR0VGR0dFSk1LSFFNSktISElFRkhIRUNJSklLTUtPU05EUVJQUVFOUE1OUE1MTVNXVlhYVlhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpb3lNSEdISEJCQkZFPEBDQkQ8Nzo+PTo+OkBCPj8/Q0VGREZERUhGREVEREVGR0pFRUpHQ0dIRkhHRUNGSkpHTUpMS0hKTEZJSUtIRUtLTE1OT1JUT0hTVVNQU09RTU5RTk1QV1pWWllWWl1aWGFgYGBfaGVjYGRmaGdqaGhpZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5JSEdJQ0FDSEU8QEVCRTw4Oj4+PTw8QUI8Pz5BQkZDRUNDSEVDRUVGR0dHSUZHS0hESUhHSUdGREhLSUdLSE1LSktMSExLTUtKTkxPTk9SVVZPS1VXU1FTUVJMT1FQT1RZWllcWllbXl5eYGNeXGFja2JgZGdocoVoZ2lmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB0TUlLSEpGQkVHRTxAR0NEQDo8PkA/Pj9CQTxAPkFBRkNFRURJRUZFR0VISEZISElLSkZKSEhLSEZGTElISEpHTExMTExJTUtNTU1PTFBQUVVWV09LVlZVU1NRUUxPUlJRVltbXV5bXF5fX2FgYWRdZGBlZmBlaGpjc3NmamdnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKS0xKTEdCRURFPEBGRERDOz8/QUBAQENBP0I/QUNIQ0ZFRklGSUZGRElJR0lISkxISEpKSUxKRkpLSElKSkdLS01NSkpNTE5OTlBMT1BSVFhWTU5UVlRSUlFQTE5UU1JXW15eX11dYF9gYWFfYWNlYmRoYmRpamd2i2xraWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZud0tNTEtNR0RDQUQ8P0VFRUM9QUFDQkJDREFDREFBRUdDSEdISEdKR0RHSUdISkZJTEhJSk1LTUxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1FXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BDQUVEREZCQ0VHQ0NJRUNJSkpJSUtHREtKR0hKSUlLSEpKTkxOTElMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGJ2dWh1Y2F2YFhucWJkdmluemZbbHRgbGtUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RCRUVERkJGRkdERUpFRUpNTUtMTEdHTUlHSktIS0tJS0tOTE1NTExJTE1MW3NiZHBebG1VTU5mc11mZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRublxvdWdwTUpyeXZrYmBrZWVteGxrdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUhHRURAQUJAPkNGR0JGQ0ZFRUVEQ0hIR0RFS0hHTE1OTE1NRkpOSEpLSklMSkpKS0xNTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtbnVcWWxRXG1tWnFta29teHh0c2lwXV9ya3FqVXV5eHBjXmtmYmdwcGpqb3BwcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHSEVFRUJCQj5AQEZHQkdESUVFRUJGSUhIRUdLSkdNTU5MTU5HTE5JTEtJSk1JSklKS09QT05NS05OTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITUdJREVEQ0FCPUJBQkZER0ZMSEVDQ0hLSEhGSkxMRk5MTFNSTEdMTUhOSklITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9udHN2c0hLSElCRUVFQUA+RERCR0RISU1JRkNGSkxJR0ZKTUxGT0pLV1JLR0tLSk5JSEpMSUtKSUhKTU1NTUlLS0tTa2JbaV5faWNyclpfWWpvX2VlVWtfY1thYVFgbWhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ2dHdyR0dGSURFREZBQEJGRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpFSEhLTUlISkpLS0lISUdLS0tMR0hLS0xMTExKS01OVFtcVFBUTFBPTk9PVlFPT1FOT1FKSU5QUWRxaVRZV1xbXFVZWl1YXVxcY2ZhYWViY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUNAQ0hERkdDSUtMSEZER0tMSERHSVBLTE9LTFdMSUVFSElKSElLSUxKSEZHR0lHSElFRktJSktOTElQXFdeUFxbYF5NWFlTXFxiXk1ZWk1YYVJKWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0VMTUJEQ0JFSUVHR0ZLSktIRUVKSktGRUhIUEpNTUpNU0hHRUFIRkpJS0tJTEpIRkVJRkRGR0VFSkhDSk1LTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5eXF5TWl5jXlpdYGNgWV9iW2BeW1RYV1leXWNiY2FjZWhla3Jwb3Bwbm53hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JREJCQ0dIRUhHSEtJSUlERktLS0VGSUpOS05MSExOR0hFPkdHTElLS0pMS0lHRUlEQ0RFQkZKREBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVlWVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQkVHSUZHSEhGRkpHSEdIS0lMRERLSk1NTExISkpISkY/R0ZOS0tLTUtLS0lHR0NEQERBSElCP0lKSFBdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXGRjYmRjZlhRVVRSW1daYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktKRkZGSEdGSUZGRklMSk5GREtKTE5KTElLSkhJRkJISVFNS0tPTUtLSUhHRUQ/RUNISEJCR0dFVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVVZYFJRX19iYmBgYmJgY2JhZGRiWE9RUVFaUltdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FHRkRHTVJIQ1FKRkhISEVGS0pNUEVGSUpLTkxMSUxMSUlHREhLUU9NTVBMTUtLSElDREFFREhHQkFHRURXVUVcVV5TVl9YTlRVTlpaTUpLVGBhW19YXl5hXU5ZYlxgYF9iY2JdYWJXX19UUE5PT1dRXVtbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZIRElSYlBDVl5JR0dIREZNS1BQRUlJS0tOTExMTUtKSkdFSk1RUU5PUE1OTE5IS0FEQUNERkRDQkVGQk1IQktMUE9OTEZNRkdJSkhHTEtNT1BJTE9QT1NPTFFTUlVaWVdZWFhkV09TVFBQTk1PVFNbWVhaXVxgYWRlY2dja2xwc3J6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdHWExHSEpIR01MUVFJTEtMS05NVU5PS0tMR0dLUFNTTlBPTk9OT0hLRmBFRF9MRGZkRU1bSV5bcm1PTVVtWUxDUWBVa1dnSl1YVV5ETVFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqU1dWVFtcW2BgYWFhYmBmaGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TEhFR0ZIRUVLT1NJSkZgU0dKT0pJT01SUUtNTExPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpRf1FJfFlZcXNYUG1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtgVlZYf2p0dXVfX3ZfWGFbXGZbX2FhYWFeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU5CRExMR0lMRVFWTEtOSUtSWFdRTU9PTVFUTk9RUEtLTkdNUFNbWlRRUk9QUFBKSFp4XVR4ZWhaUlRRdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Nye3xvfnlvf3JfYGBiYVpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1ISktHSlBPTU1KTlZeWVVMUVNOWFpMU1NSTkxQSVFSVFlXV1BUUFBQUUtIZ3hsY3hybVtLTVV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclFoem1panp6fmx4en9vaG9ZdnZqdXVwgWByZ3xpbHh8b15fX2JhW11iZGdpaWRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdXpufH15d3JuTktTdE5DQkZQUEhKS0pMUU9PT01QWmBaV0tUV1BhXlJWUVlSTE9JU1RWWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmhxdW5teXB3bHZ0dHJtbl10fnprbXl8a3RsfGtwdnV4Xl9fYl5dX2RkaWdoZmVeYWJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRyb21MTFtWSEdFR1JQSUxNS0xRUVBQUFFXXFhVTVVZVWZYUlJZXlNMTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1twenteYHpzY3JveHFoZHxpcnxeVExsYHZ1a2l1fHttfnhrfHBdXl9iW15iZGRnZWVlYlpjY2lra3JzcndnbGloZGdhYWthZ3NybGdtbXJ8a21oa3t0bW1rbU9ISktISUhIUVBMTk9NTVNSUk9TUldSVlRQV1tWVlRUVGFfUE5NS1RTU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVBOUVFYWVJOUFVUWFhYW1pVUlNXW1dYV1pPU1VXWFhSXVlXXldUUFlSVldXV1hfW2dyXltbWV1dX2NaX2NjZGZkY2NiWmNjZmZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLS0xNS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVdPT0xNVlRQTlVTTk9NTFFQS0pSUUtRTUtLT1JVUlFSU1JJSExOT1FSUVFRVFZSWFdcV1NTUFFVVVZTWlFPU1JYVlRZVlRaVVRSVVNUVVdYV11aXmFdW1paXFxgY1tdYmNkZmRkZGFZYGFjYWJoaGltY2FkXl9jXVpkXGJtYV5mZWdtc2RpaGtrZWRjZmhQSktMT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYU1BQS09XU1BOVVBOUU5LU1BMT1VTTlJOTU5RVFFVUVNUVU5LTU9RVFRSUlFWV1RZWltZU1VSVFdXV1lbVE9UVVhVVVpVV1lVUlJXVlVXW1laX11VWF5cXl1bXWFhXltiYmNnZmRkYlhfYGJeYGhlZmVhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVtaWFdYWlpYWVZcamRWWFlaV1ZTU09KTlZUUE9UUFBQTk1RUVBSWFRRUU9NT1NWT1hSVFVVT05NUVNVVVRUUlRXVlpdXFpWV1FSV1hWW1tXUVRXVlZWWVRYWFVSUllXVlpdWV1fXlZeXV5gXFtfX19fWmJiZGhnZGRiWWJgYV5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUU9VXFtaV1tbXFlaW2RxbWhkXltZVlVXUUxNVlJNTlJPUVJPTFBTUlVaVVNQUExQWFdSV1NTU1hNT1BSVFhWVVVTVVlYW15dW1tWUk9VVlZbW1dSVFdWV1hWVFhbVFNSWlhXXF5aXl9gVWFcYWFdYGJfXWBdY2BjZ2hkZmBaY2BhX19lZF9gY1taXFtcWVpZWVdcWVxbYF5fW15eYWBeYlxZYFpRTk9OVlFQVFJPVVRTUFdcXVxYXlxeVlxeanF3eYBiXFtWVlhRTU9WU05RUVBSVFJLUVRUWVpXVU9RTlNYV1RTVVJSWk9QU1NWW1ZWV1RWWlhdXltbXlZTTlRVVlxcVlJUVlZYWVNUWVxVU1NdWFpdXlxgYGBWYVtjYl1hY19cYmFiX2NmaWRmXltkYGFgYWNkX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVUlFXUlRQW11eXltgXGBVXF1panJ9c2xnXFVZV1BOUlpTUlFTUlRVVEtSVlZbWlpTT1NSVlZWVE9XUlNaUlRUVFhdV1hYU1hcWF5dWVpdVFVOVldXXltYUlVVWVlZVVdZXFVUV15ZXV1gXWJiXllfW2VhX2RkXl5jY2FeZWZpZGZeXmRhYGBhYmRgYl5YWl9bXFtYWFhYV1taXGBcW1tcW1hZW15WXlldUE9PUlpQWlRVVlZTVFReXmBfXmJcYFVdXmJreXRsfWtaVVlVUVBTXFRVVFVUVllXTFJbV11bXVJPVVNYV1dUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSV1JZWFlfWlpUVVZaWVpXWFpcVlVaXlxeYGFfZGNcXl1dZWFhZmReXmRjYFxnZGhlZGJfZGFgYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1FXWVFdVVZZV1dVWF9fYWFgY11gVF1fYmVldYF6aFhZWVNWU1ZcWFdXVlZXXVhPVV1aXl1dVFJXU1dWVVNUWFJTVlRYWFhdXlhdW1ZdX1hfX1hdVlFZVFlaWmFZXFZXWFtaW1lZWltYVl1fYF5jYmJlZFxiXGBmYWRmZF9gZGJiW2ZjaGVjZmFmX2BhYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWU1xUVldZVlZcYGFiY2FjX19WW2BkYV96dW9oWVxaVVhUV1taWVxZWFlgV1BWXlxgYVxUVFhQVVdWVFZXUlNVV1paXF9eWl9cVl9fWV5eWV5WU1lXWVldYlpeVldbXFtcW1taW1lZX19gYGRiY2RlYmRZYmZjZmZlXmFiYGNeYmNpZGNnX2deYmJjYWFgXl9YVFtaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU1BWWlZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5cXVtWV1hZXFxcX1tZW2JWVFheXWFjXFJWWFBXVldXV1ZTVVRYXFxeYGBdYF1XYV5bXlxbXlhWWFhbW19gXF9YWV1cXV5eXFtdWFtgYV5gZGNkZWVmYlhjZWRoZ2ReY2BfZWNdZWlkZWlfZl5jYmNhYWBfX1tYWVpZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldaWFtcWFdZXmBiYWRhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFdXWFlZV1ZXVl1dXmBhYF9iXllhXV1eWV1eWVhWV1tcYF5dYFpaXl1eXmFcW1taXF9iXmJkY2VmZWZiWmRmZmlnY19jXmFmZVppaWNmaWNlXmJiY2FgYF9dXVpYXFlZWFhaWFdaW1pZV1hWVVtdXV1gYGJieEtYV1xZV1xbXF1aV1xdX2BiZGFiYV1gWGJjYmFjYWJdW1xbWFdbXF9dYF9dW2BkXFxYWmJlY2FSXFpPWFhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl5ZWVVYXV5fYF9gXFteXmBiY1xcWFxeYGJiY2VkZmRlZmRcZWZnaWZjYWJcY2dgXGlpYmhqZWRgYmFjYV9gX11dW1lcWVhXWFlYV1xbWldXWE9YWl1hY2Zmcmt/SllXXVpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGJiYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF1eX1pYVltfXl1hYWBeW2BhYmViX11UXWBgY2RkZmVnZWZmZV5lZmhoZ2RkYFtlZ15haGhiaGhmY2BiYGNiX19fXV1cWltZWFhYVlpWXFpaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnV1dXV1dXV2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3x8fHx8fHt7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dXR1dXV1dHV2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3x8fHx8fHx9fX19fXx8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHjF1NLS0tLUk3t9fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqCRT4/Pz8/QDAqKysrKiVikoyMjY2OiX5/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19eNXn5OTk5OeZe39/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjYM6MjMzMzM0IRobGxsbFF2Wj4+QkJCLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12fn9/f39/f3l3d3d3d3d4eXl5enl7eG5vb29wcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHZ1dXV1dXV0c3Nzc3NzeX19fX19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ0dHR0dHd0dnd6e3h7eHd2d3p4e3p5fXl4eHl4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7fHx8fHx8fHx9fX19fX18e3t7e3t8fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d4fXp9ent9e3d3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8en18fX58d3h4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4SCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3d3x6ent9fnx4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4e3l8fXx+e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh5eHp7eXx4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3Nzc3JycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3RycXFwcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Nzc3JwcXNwb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnNxdHNycW+GhG5wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFxeINxcnJwd51/bnBwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFxcXF2oYhwcnCPoX1vcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcm+Vqn9wd6ChfW9wcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFycI+xnnCBpaF9cHFxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJwjLaqkZuypnpxcXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3Nzc3Nzc3Wgp6OzqKaleHRzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fnx2dnd3dnV4enh4eHh4d3h4gqifo7Gjm6SPenl6eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fXx7fHyPo5GTpZygoZZ7e3l4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX19fY6gmJaZnJaQmYJ/f319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgIGAj7GqpZ+hn6Ghg36BgH5/f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/f4CBgIOkrqGnoaCgqKyehX59foB/fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6MiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5/gIWPp7GknKehoKCio6upnIyCgIB/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgoaLm6mqo52aop2foaCen6KloZWGgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpGPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4OChIeQmJiWl5mcjJSfnZucmpSMiISDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OCgYGEho6Wl5WHj5qclo6Jh4aHh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+PkJKRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYKBgYiSl46UmpOGh4eIiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhISCgoKHkpaKhISDg4WFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpGRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgYKCgoKCgoGIkYKDg4GCgICAf4GAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgICAgIiRgIGCg4OAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJloiEgoSCgn+AjJaCgoGChIOBgYGCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6YioOFhISEgoCSmoaCgoKEg4OCg4GBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KTj4yMioWEg4ODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBj4yDgX9+fXx9i5yNgIKBgYKChpSTjIGCgYKDg4GBgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIg4SEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GVl4mAfX19fXuBl4uAg4GBgYCPk4yQgYKBgoKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgJWfin5+gH2Hin2EhYOEgoODgo6JhYyCgoOCgoKCg4ODgoODg4KCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSTkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fn19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyLiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOKkYOEi4WCgYF+fYGHhoOAfn5/fn9+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWGhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWCf39/f39/f36AgISFhIWGhoaFhYWFhoeHhoaFhoWFhoeHh4iHh4eGhoaHhoeGhoeHh4aGhYSDhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGh4aHh4eRlJORkZCLiYiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4OEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/f4WFhoiIiIeHh4eIh4iHiIiIhoaHiImJiYmIh4aHh4eJiIeHh4eHhoeFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGg4KCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt6gIaHiIqKiYmJiImJiYmKi4qIiIiJiYqLioqIiIeIiIiHiIiIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoaGhYOJlJOQj5COioaEhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICBhISCgoKCgoKCgH9+fX19fX59fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaHh4WGiIiJiIaGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SEgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCg4OFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fn5+fn5+fn1+fX19g4eJioqHh4WGh4eHh4iHiImHiIaIh4aJiYODhIOFhISFhYeIiIaFg4KCg4WHhoeGhoSCgoOEgoOEhIKBgoGBgYODhIOEkZKQjo+Oi4eFhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCgoF9fH1/gH9+fn59fH19fHl8g4aHh4SDgYODhIWFhYODhYSEhISEhIWEgoKCgoSEgYKDg4WGhYSCgYGCgoODhYSEhIWEhIaEg4SFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhIWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gX9/gYODg4ODgoJ/fX1/gICBf31+fn18fX17enp+hISEgoGBgIGBgoKBf36BgYGCgYOBgoGCgoKBg4OAf4CAgoOCgICAgICBgYGDgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fX+Cg4OCg4KDgn19fn+AgIGAfn19fX1+fXx6enqAgoKBf39/f35/f4B+fYB/f4CAgX+AgIF/f4CBgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gYODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgH9/gH9+fn1+f35/gH9+f3+Af4CAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f4B/f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXuAgH+AgH9/fn5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/f4B/f35/f4CAfn5/f39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfn19fn5+f359fX19fXx8fHt6eXl5eH6BgICBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgoF/f39/gICAf4B/gYB+f3+Afn9/fn+Af31+fX17fIaTkoyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoODhYOBg4ODhYSEhISEg4ODhIKCgoKCgX9+fX19fn6AfX19fX19fX18e3p6eXl5eYCCgoKEg4CCg4GAgoGCgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOPiYmIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/f39/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aGh4iHh4eGf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIKDf4ONhISEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKDg4KDhYSEhYOCg4OCg4OCgoKCg4KCgpKQi4iIh4mHhoaEhoWFhISDgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoeHh4eGh4V/fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko+MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GCgYOCgH59fn57iJF8fI6Wf31/f4KGioWDg4SCgYONiX99f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fHx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh9fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYGEkZGOi4yLjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgoKDhYODhIWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX19fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX19fICBgH2Gj4F9fYJ+f36Agnx8gH+CgIKAfn17ioJ9gH9+gYCAgYKAgoCAgIGAf4uUkIyMjo6NiIiHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhYaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8goCBfn+BfH5+f359gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfXx9e319fXx9fHx9gH+AgH6Afn6BlJKNjY2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gIGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt8fHx8e3x8fHp6eXt8en2Fg4N/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn99fX6AgIGAf39+fX19fX57fH1/f3+AfX9+f4yRjo2Nj46Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KEhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEg4CAgX1+fX5/fYuEgYZ+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fXx+f399foB+f36Eko2NjI+Ni4qGhIaEhISDg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn6Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn1+fHt8fHx6e3p9f4CAhIOCf35/fHx8fXx9gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIuQjY2MjYuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfn59fX17fH19fHp8fH6AgoGAgIB9fH18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIOBgoGFhoWFhoaHhYGEkY+Ni4qLh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f3+Af39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5/fnx9fXx8fHt+fnt8e3x8fXx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiIuJhYiSj4yJioeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx/gH9/f39/gIB/fn5+fYCAgH9/f3+Af4CDgoB/gIGAgIB/f4CBf358enx9fX59fX5+jIZ9fX57e4ODfX5+fX18fX19fX19fH17fXx9fX58fn19fX18e3t7fHt7fHt6e3t6enp7fn6DhYiHiIqLi4qJjJGQjoqIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+f357foGSjHx9f4qAjYx+fn19fX5+fX59fHx8fn18fXx9fX1+fX1+fnx7e3t8fH18e3t7e3l6eXh5e35/g4OEh4mKh4mOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGCf4GBgX9/gH+AgX+AgIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36DkYSEg4F/fn18jYd9fX59fXx+fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI+Oi4uHhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoWFhIKCgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+fn9/fX19fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjouMiIWFhYSDg4GCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBgoKBgYKCgoKBgYGDg4OChYaEg4GAgICDgX+AgYSBfn6Af35+gH59fn6AgH+Bf3+Af39/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8fHx8e3t7fHt8fHx9fIqLiYiGhoWEhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBgH1/f3+AgICAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x9iYeHhYaIhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhISEgYGAgH6AgoB+fn6Bf35+f4B9foB9fX1+gH9/gYCBgYCAgIGBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCIg4SEhYSEhISDgYKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgYODg4OFhIWDg4OEhIODhIOBgH+Af4CBfn1+fn9+fn5+gH19f3x9fX6Af4CAgIKAgIGAg4KAf4B+gIF+gIGAgH9+fn5+fX1/fn6FhYGBgH+Ag4F/foGAf35/foB/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+f31+f39/fn1/fH19foF/f4B/gIB/gICDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GDgX9/g4J/f4B/gX+Af3x6e3p8e3yCgH+Cf3+AgIKCgYF/f3+CgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF/f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gYODg4B/f4GBgIKBgYGAgICAgICAgIGAgIKDgYF/gISAfYGDhICAgX+BgYKAfXp7e3x8fH9+f4B8f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WEgoSEhYSEhIGDgoGDgX+AgX5/gH6AfX19foB+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGBg4OBgX+Ag4B+goOEgICCgYKChIJ+e3x8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CAgICAgIKCgYCAfoCCf3+BgoOBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357fHt+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gIB/f39/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4B/gIB/gYKAgH9+gIF+f4CCgYCBg4KEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fH+AgIB/f39/fIB/f4GAgYCAf3yAf35+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn1/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eHl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB8gH6AgH+BgIB/fYF/fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn2AgIGAgICAgHx/f4B+f4GAf39+gX9+f39/fX18f4CAgIB+f35+f318fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd8eXd4d3d4e3t7e3yFiX17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgoGBgoCBgICBgH5/fn9/fXx+fYCBgoGAgIGBfX6Af35/gX+Af3+BgH+Af319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoGEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKBgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgYGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9+f4B/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnqBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoGAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgH9/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKBgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+f4CAf359foB+fn+Af39/gH9/gIGBf4CBgH+BgIGBg4KBgICAgIB9foB9gIOCe35+e3x9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgYCBgoF/gIKCgoKDgYGDgoCCgYB/f4CCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCf4B/gIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYGAgICAgIGAgIGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8eHh1eHh5e3x8fXx7fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KCgoKDgICCgYSDg4SBgYOBgoKCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAgICBgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoKCgoCCgYGCgYB/gIB/gId+fnx7fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KChISAgIOBhoODg4GChICEg4KCgICCgoSBgYKBg4J/gIB/gYOCgYCBgYCAf4GBgYGAg4B/gIOCf35/goGAgH9+gYCBf4CAgYGBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH9/hH19fXx/fXt9f3t5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKCgoOEgoOEg4CBg4OGg4ODgoKEgYSDgYOAgIKBhIGCgoGCgX6AgICCgYKBgYKCgIGAgICCgoGEgH6Bg4J/f4CDgoCBf4CCg4KAgYKBgoKDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKDhIaEgoOCgoSBhIOBg4CBg4KCgoKCgYKAf4GAgIKBgoGCgoKBgIGBgYKCgoOAfoGDgX9/gYSEgYN/goKBg4GCgoGDg4OEgYKEgoOCgoGCgoOBg4SDhIOEhYSFg4SCgYOCgYOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIKEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYKCgICChIODgoGCgoGDgoKDg4SDg4SAgoSDhIOBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt9gX58eXx6enp9fHyBfnp8fH19fHp7fn5+gIB/gYGAgICAgIKBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgYSFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBg4KAgYOFhIOCg4CCgoOCg4ODhIOEg4CCg4KEg4KCfoOBgoSEgoODg4SEhIOEhIOEg4WEg4ODgoKAfICBf3x8fXp6fH2AfX9/fHx6fH59fX19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18fHh2f3Z3f4SHg4KDhoODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoOBfoCAgoKDgoODg4SDgYKCg4OCg4KCgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIKBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fX19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OFg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODgoGEg4GDg4SDg4SEhYSEhIWFhYWEg4ODf36BhIB9fXx8fHx/gX5+fn9/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODg4WDhIOFf36CiouFhYSDgoSFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDhIOFhIWFhIGEg4OGgoOCg4GCgYSDgoODhYODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhYWCh4aGhISEhIWEhYSEg4SEgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF6hH9/f3+EhIKDg4KBg4SDhISFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf31+f31+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhIWFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg36Dg32BfX5/fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFgoaGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW53bHB5bHV9f398foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYeGhoCChYODhYeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fIB+gIB+foCAgYB+fn9+foF/gH9+fYB9f4CBf4B+fn+BgH9+goOCgoSFh4eEfoaEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhIWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIGBf4GBgH1/f4F+f35+f4GAfn6BgoCAgoSHhoODhoSFhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhoWDhYWEhoaGhoaFg3iLeXKIentwcIWFeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW19dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXp9e3x9fX9/fX1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iEhoSFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSDgYODg4SFhIWEhYSGg4WGhYWEhIWHhoSEhYaFhn13hYSEhIOCgX1/fnt8e357fHx9f359fX9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGh4WFhYWGhoeIhoSGhYeGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhoWEhYWDhoaFhYWEhoaGhISFhoOFhIKEg4OFg4OBfYB/fHt8fnt8fH1/fnx8fn2Afn1/gH5+gH99fXyAfX5/fn5+f3x9fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoSFhoaEhIOEhIOEhoSFhYWGhYOGhoWGhYSGh4WFhIWFg4SHhoOCg4SDhIJ+gYB8e31+e3x7fn59e3x+fX5+fX9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaIh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoSBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaHhYSDhISDhIeDhIGChIWDgYCAgHt7fn58fHx+fXx8fH19fH18fn18fX19fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoWGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYaGhoeHh4WHhoiIh4eFh4eHhoaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDhIKCgn+Ae31+fnx8fH59fH19fH17fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHh4iGhoiEg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fnt7e3p7fHx8e3t7fnt8fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWEhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iHiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWDhoaHhoWEg4WFhoaGhoaFhoaHhYeHhYOFhYOBgoKBg4WCg36BgoF/g4F/fn5/fn98fH1/fXt9fXx+enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhYWEhIOEgoCDgYaCgYJ/eoSMe4CEhYeGhoaFhIeIh4eHhYWHioeDh4WGhoiGhYeEhoeJhoaIiIeHhoeIhoSGhoaHhYWIg4SFhIeGhoeFhYSDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCEg4OCfYGBf36DgX5/f4B8f3x9fX59e319fH15enp5e319enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYKAgH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4aHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGiIWFhIKFhYaFhoaHhIWGhoaFhoKDg4WBgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15ent7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgIGDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIWFiIeJh4aFhYWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWFgoKDg39+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXx/fn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX5/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhIaGh4eHhYWIhomHhYSEhIKFg4SGgoOFhIWGhIeGhYWFhoOEhYSFhoWGhISFhIWDhYSAgIKDf35/f39/gIN/e4B9fX+Cfn+Bfn6Bfn5+fX1/e398e3p5enp5ent8eXp6ent7fHp7e3t8fX59fYB9fXx8fYB/fXyGg4aGhoaFg4SDhYKFgYGAf3+AgH5/gYJ8fn9/foCAgoKChISDgoGChIGAg4KBgISFhIKBf4CCg4OEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhIaEhoaHhoaFgoSEg4SFhYWDhIODhIKEhIB/goJ+fX5/fn5/hH57f3x8gIF9gYB9foN8fn59fX57fnt7enl7enl6ent5enp6e3t8enx8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX5/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWDg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt5enp5enp6e3x5e317e35/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjtBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8rKy8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19jZ2NjY2NjY2NjZ2dnZ2NfX19fX19jX19fX19bX2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0E8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLepp6enp6enp6enp6enpq65uLi4uLi4uLi4uLi5sIqKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk08Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uzr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6OghoSEhISEhISEhISEhIKSpaOjo6Ojo6Ojo6OjpZVTUlNTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs8QkA4PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzR0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSloomHh4eHh4eHh4eHh4eFlaakpKSkpKSkpKSkpKaXV1dXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8PD46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183N0NLS0tLS0tLS0dHR0dDc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqaeQjo6Ojo6NjY2NjY2NjJqqqampqampqampqamrnmJhYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc7Ozs7Ozs7Ozc3Nzc3Nzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Oz87Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS0NDQ0NDPz8/Pz8/Pz87Q0dLS0tLS0tLS0tLS0tHNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7O0dTPz87Q09DO0tTV1NDPz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dbW1tbW1tbW1tbW19fW2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O07udz8/SuY++1JyChIrGz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0rWVm7PUwJSwnLGWuLmvodLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz9GfoKqu1qKgi5HDk31+r7DRzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDk2P0I/Qjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RxYeasc+Yh5261NLNnp7D0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9anmbPImZCfoNLTwKCg0M/Pz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD09OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/VpZm0vqmvkaG516+iqdTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1qWZtb+emq2bqdijobrU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0NWlmrXGlqbFmKLRnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRj9ISEdFQDw8Pj48PT08NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09DVpZmz0Zqcm5utx5+h0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBDOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocfS1qOasNmlq6SexbSkptbS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT0dW1gsPVzJOQp9e5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPDw/R0VHS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0cLU0tTLvdXS0cLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPTc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLU0tLS09XT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPT43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo2OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDg4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT48SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0JHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urq5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTk3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm4uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTU4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5uLi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqamqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojk6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WkpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW0tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSko6Kio6Khn5+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2epKShn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6imoJ2cm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqamp6enp5+bmpuioJqWl5Sam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaOipaampaanpqagm5mboaCXk5KUmZqcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop6cn6GgmJChrJeXm52YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpaanpqWlpqelpaOgoKGhn5mZmpaYm5qenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoaGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKipKWkpqWlpKSjoqKhnZycomqJm5yam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGipbapo6SkoqGhnpqZpYFWjpuampienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKeqsKigoaCenJuanaJZXZSam5yZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoaCmooCrpZ+enZqZmad/VWaVnJ2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qbmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6CgoKCgn6p3dq2inpyampyka2FplZyfnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uamJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ6fnp2ojGmMq5ybm5ygl25pa5adnZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udnJuao5F5dZ+cmpydoIhraWuSn5ydnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmamqOUeHyFmJqcnpl9amdskp+cnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycm5mZmZqgnIuegH6YoJyFjYFmbZSgnZ6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5yZmZmanKehkXFlpqyhaIGNeWuXn56fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmKGtkndlZqaXmlhnfX94nZ6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZenpXhOSnCbhIRSRGF4gp2bm56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqXq5lONzx0kn1wUz82YXqOko2SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGQlq1zVHBXfLCpmVpnbkhrfYiCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDfpakXIWbfMrFscWdfp16UHiCgpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn6SkXLP183Vppy5vGtdcl1ngIWOjYuGjZSSi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqEf4J8mXea0b3H08fBtJx3pahjYoqKjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRjH+IjY2Li4iSjJtvoqaVuayioYmFdmHIi1qIiomQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZGeoZ2Tl5uhmp6co6CdhJN8j6WNhYt3dXBsppdhgY+LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmsqqqvp5Z+WHKGeXmAbWtpdXh/eHqgoaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKlqainq6mFcFJgdHFyemlmYmlrcHyFoqmnoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSoppqdpKaio7CYcGlPVnh2dHxoYWRmX19ufYqgpKCgn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgo6eipq2nsLKpfGljSVJzdXiBaGBjalpbYmt1g5GdoaCdoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqaKgoaiprbW6vL2sim1nYUJabnB9fm5hX2ZbWWFhaHB4f42aoKGimZaem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbWlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6uqp665wcbMxbeljnJoaVo/U3BvcWx0aGFhWlhfY2FianF2e4yfp52eoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCqtL/O2dvOuquciG9gYWJTQ0p5a2BibWxbW1daWV1bWl5jZmZod4+lr6elmaGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWl2a3BoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tbzO2t3UwKSKdmVdWVpcU0pDbWqUnpRWVFhXXVxdXVhVV1tpfpWqwce6tqGnqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllUYWlgZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8O5vcDGztHNt5J1ZFtZWldTSVVvqrOmTlVeYWJfX19md5Cnur7BxcW0trapr7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdubVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8XBxcbBvrzMxLCRb1xVWFNQU6G1m05ZW11dYG2OqrrBtbmpp7G1q7WyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8foR/amZoYWtsZ251cnJ1cWdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QkJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/Dw8bGwbGSv7/OzryVaVhXWkyZuZNMVFlXYH+mvLCmq6yypqqpqautrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dWtsbmRvbWlxeG96amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTExLm1wLezvMHGvql5WFVRireGTFNVXYSgprevpa20tK2upaSjp6SgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl5e3dua2lodlpncnhzeWZmXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPEwsW+uL3Bw7/HvZZsUlppWlFSZJSrn6a0sq2suLWyrKmjoa2prKetn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWZpamheam9ueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx7/Ex8TExsnOypxWSE9Qa627t8C9vrm8ury6vKytpqm7urm3v7K1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3Zpamp0bnlsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc3FxcXDxcTJy9HTpFJMYLDHwMnNxsTBxMfBvL60sbCwwr6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdga2p3bGlmdW90Y11iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXCw8HCxsbGyM6KSZPOzMfM0MW2v7/AwLq7vbWzs8C/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWdjamRia21ub15ZXVZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK+vcHAwMDFqk6k0czFydHBr729uLm7u763tLG5vrO8vrG5tbi7try0tbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWNjZGpjZ2NbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8G7v8C8u8S9usDEv729uLzAxK9TnMzEwMHJv7DBv7q3u765tbi0uLy0vbi1tLCzvLG3t7i/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFiY2hqZ2dpZWleVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1Y68vrvDtbrHt7a5u7y4ubW6xMmqVJPIv7+7wb65xr3Cv7zFuLa3tLi2tru7uba0t7q1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1mZWZwamVraFhZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+8z8V5rcu9x7e5uK22tLe5s7Wyu8XKn1WLyr+/vr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d9a25xZ3FrdGZibmBcVEhLS0RKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNevdoS+yM/CwLiutbW7vbe5sb7Dx5Rchs7Dwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcmZsam50b3hjZ2JcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCx8nRm3R3sdHRzMrEtbq/xMi+vrS+v7+FanrLxsK+wby/w8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgnRvbGx0bGxuX2NeYWJOSE4/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDCur68xL63vMC/yc/HyMrKwoh2d6jMzMvNysbCw8vOwby4vLmvgnxtvMjEwMC/xMDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh7bW14fGBxZFteX19UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7qs28O+tr7Avr66ppyqs7fDwKZ8enyfxMbLyMHDwMDJysG/u7mxo5iKfrDIxcS/wMG/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem5zeHRocF5cX1xaUUVFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8W2ba7Ovba5wLyqfW5obm10gpeZdXt/nL6/xsC5wLy+xcS9vbixr6esl5edysPDvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdsdntxbmlcYGBZU1BBRklHS0BFQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNsXaCs722tcGkhmlaXmBOU1tccHZ6haS4t8K6s7u3u72/uru7r6KssqKogr7Fw768v7u7uLbBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnZ3b3FhX2ZdW1VKPT8/R0Y9R0NDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaaEeIuhr7WcamZnVllfSUlNUFRve4upsLe+ubK1sry5vLa5vrWWr8CwtXisysPAvb+5s66yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdXd0d3JsX2NhXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8aoh3t2jKGYX1NDWVVIYmpVT0VKZZGlr6+2urW0sqy8ubi1uMG9jafCsrJ2p8rCv7m6ta6lrLOxprCtqJ2gn6WttrXCt7a0paiqqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnNuY15nWV1dU09OQT5KQkBLSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/tJCBeYiQbk5LP2VZQk94gZNoTUNehbG1s7WytK+su7q4trm/xXiOuKmfZqu/uLWysa2tn6Smp52kpZyWmZmZn6muuayrq5+lqKSrrq+nsKuvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVqbF1ca1VdW1BOSERHTUJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiFfFhGQU+HWEpKWXiOg2NBVaO5s7SysLGtsLm4tru3u7ySpLOupHSssKmrraujqKGdnZ6Xl6CVkpaXj5ifqK6ko6Sgoqaio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHV0b2VVYWRXXVFPTUhASVJETUM9ODg3NTo3PD45Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K8qZiZlWhNP1N4cVBJSUtonYBaRVWwurGss6+urK22trK0ta6pp56Zm56fpqieoKipn6GnlpuWl46dlI+Qlo2Xm6SooKCioqKlpZ2jo6CepaCkrKWmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6bmaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6ahiHiDfHZ/emN3bG5dUWlVUE9HUE1MQ1BRQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcKqpbxnRFObfVFYSUthSlaNYmVlg6+1qrK0rqqrr7Cys62lnZGXk4+XoJ+ioJyjpJ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6ionKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclZOQj5GRmZCWlZiXn5icmZukmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn58f3V2fW5re2RoVlJkTkpIR09TTktOSDxFQDwyPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoKvGv8qfT0F0mHFQbkpMY2Z1dGBdYnSSsq+us7WqpqyropuZlI2RlZaYmJyfoqKcnaSemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoqWimpmer6iusqulqqqgm5iYmJWTlpqTlZWalpuXl5ihnpyclpuhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eXxleXlgYlNWYUhJSktTVElTUU05P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZylxsaMV1NKZqRZZn1vcltSa2NcZ2JgbZG0sLC4rKahnJ2alJeamZCOkZWRjI6Nk5minJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Ggo7GusrG0qrKuo5mcnZ6hmJubmpiZm5SWm5aZnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaIJsZVtTWlpNUUpPT1ZNU01CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6Kan6qjjHlVaXJ3dXBjd3ZYV2JgZGlbWldora6sr6efnqKglpCTm6CbmZeSk5+coaObnpuWn5qfl5uinqWhnqSfpKitraisqaSstLe2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztrizuK2ytKSgnaWgrKGhoqGgmpiWlZ+bm5iloaCeo6GgnpucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYKAfXh2and1Xm1bUmFJUlVIRlVXSkNNRz1LSDhGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoKR/b4JwYGNYTFtSWkxMUVlSSE9OSJmsqqmkn5+ZkpKUmJiWlpWMiIuOlZ2cnZ2el56Zpp+gqKWxqqeuo6uutrC0srGutri9v7qttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q66xubi8r7OwtcK8t76zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6iopaSenaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWFfnZybWl3bWhtXFhcQ1dOSkdNR0NGTTw+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqco56ciWJXXmVgV01RRz0+QENEPz5CUnipramqpZ+en6KjnZ6dmpyblJOVlJ6dmJSFnZqgmqukq7KwubKysbKxur28vLm2uMO+v8K/tru7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGxL3DvLezqrOtqrO0r7Ouqq+jnayotrGto7CmoKOwsa6wpKWvo6GgmqGmoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXx0cmtrdXJxaFZcUUZVSERKUEk/RUE0Rkg5NTw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmqCflXxfXmVgUUZEO0M+Rjw+OTZOfqqzp6OjoqCepaumnpiclJGZnZmVjIqGiIZ4bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvsfGwrfDysrDwce/urS6u7W7t7C2sqq6sq67uL+7uqu4rauquLu1vK6uuaOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtjaW94a2VZW0ZLTEVEVE1FQ0U3Oj86NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1yaWFXTkU+SVl8b2FBPVyOrqygmZubnp6Zl5eXko2Pl5eTjo2QjIKDgndycW1wj6atrrS5xbvNx8u/wszNzczHydHMzMzHycXGzNDS1c7Tyb3Av8O7xsXIxdHTzdTQ09PMysLFxsbKyM/AydHMx8bIxsK8w8G/v7+2vrOtv8DDw8fFx8Svv7myuLzEwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dHNlYmdyb2ZeWlpDTkxERlBJRENANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+OTtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnpVpZlxUSURAP0qGnqSYg6CyraOenJ+amJeUkpSWkZCPjIeEg4iHg4CBgYB5cXJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19LX0tXW09TIzMfMzcrTzc7TzcbJysrCx8zHycnGv8Ozs8jFy8vLz8fKv76/vcHGxc3MycnAw8Cur7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B7cnV2Z2NndmpkVldRRE5GQElRQz5CPDoyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGbYVNMSkRDP0NSsNG9sq+mnJycoKShnZqUk5WUiX14cWtlYmhyb3F7hYqAdXBucXRwhbPDvsXR0NfW1tLWztTW19TT0dPU1NPP0cTQ09bY1dbSy8nO0cvGzdHK0tXW2dbX09fYztLKz9HMz9DM09DAycjKxMzMzM/PxcfItsDLwNLNzNDHysnAxMPIzs3Q0c/NysjNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNgZXJiXVJcSUpHQUVJSj47QTg9NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaCioVlJQEFEQUZRdrKvppqUl5+cmqCgnpucmpWJd2ljYV9fYF9eX19dYWx1c3Bwb2xycXWSxMjH1NXX19fT19DV1NrU1M7P1dTU0dHM0c7T19bT1dDP0tPRydPRyNDY19jR2NLX2dTVzM/Pys3Sy8/RwMbDyMbPztHR0sjMzcDLzcbTz8zPyMXLx8fJzMrU1NHVz9LM08K5xbGlqLWup5uoq6Wdsqiws62sk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk1APD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48P0A9RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fY1NXZ2dHO0L+8zMm2vq6mqqiho6tlQzg9PkRYgqqon5eVl5manJ+dmJyckn1xZWNiX19hX15hYF9gYF9gZW1wcG5rb3J3d5zMwdPV09jY1tnR0tLXz9POy9LN1dTRys/N09bS0dbNz9XV0cXR1MrQ1NXWztPR2NfX2MvIzsTJz8zKzcDKwMnKzs7Py9DOzszPz8jM0NDLzsvDysfJzcvM0tPN09LR0NDKvci5sK67ubWrtrCtqLits767sZqPoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcG9rYWRucGFXXFpJRkZETVhFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSxekhGQjtXjaGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGBhXl9fXlxibXJvb3N0dnZ5pL/M1dHW1NPY1s7O08vOzsXOytLSz8fOzc7UzM7SzcvX1tDM0dTLzNDS08rO0dXS1dXKwMrCxc3CyMrDzMTGycrLz8vOzdDO08zGydDNycfLxcfBxsrMzdDSx9DPzs7M0MXHwbi5vcPDvcO4srK+sbvDw7WqmKWhmJaSlZWSi5SNmpGUlI+PlYKJhnlxcmttZ2BgcWhZWGhWTUdMSVBRQjtDPjs2ODo4Ojo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8O4ytXW2drb2MzMz8jW1cTCta+0qJ+tl3hscHF5j5qNjJeVkJORkZWWlZCLfGVhYmJgXV5hY2FgYF9gYWFgX11bXWdycnByc3Ftcnmlx9PPy9DQ09TKxcnJxsa/w8XPzsfFx83K0sjLzs3G0dLQzszUysfLzs/Hx8/Sy9DPxrrEv8bKvcLHyc7Fw8fAx83IxMzLzM/IxMTQycbCxsjEv8HHzMvMz8LLzMnHy9DExce7x8PIycLPwb28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Rka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62jtn5og4Wkq5ONjZaPhYODg4F9hIR+c19bXl5eYF5gY2RjX11dXl9gYF9bWlxgbHJxb29rbG9vfbnRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMrJyMrIwcXMxsjKzcnEwsvJwcHL0MXLyL+5wrvGx77Axs/LxMDDu8nHybzJx8XKwL7Cy8bFxL7GvbzBw8XMxca8wMnDxcfSxcHJv8rJxsjG0cPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Gmm6Ogm5V8d3N0ZmlaYW5tWlxYUkRMRkJHRUxERlNANTQzMzU/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2tjZz8vSzc3OyMG1w76xr7ZsXnp9oZGKkpaGeoCFhX92eHVycF9bW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWtwb3OPx73KxcvAxsKwtrqysrOyscK8vLy6uMHBwcS+vbm9v7nEysXGwr3GwLi7xMm/wcm7t7u6xsO/vMHOw8a+vrXBvcO7vce7w7q0vcbEwsK3v7a2vr+7zMO9trrIu7++y8PBxsLFycfJxtDGwszIssfJw87MwMXDv72yt7Cyp6ioubClrbCqrayUenZ3amRnYGhvZFZeWUpGSkZIS0FGQkZKQDk6NjU4ODU0Ozo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKycbNzc7RyNDF1dTV183KzsXJxcfBucW9q66mYGR1g5OLiIuEeH+Ghn9+hHt0dGNcXF1eYGBiY2JiZGViXVxbXF5cXl1aW1xeaHNxbWdnbm9yeZ29zMDDusC4rbCxp6qtrKe4tLa0s7O0u7a9sbewta+yu8K8wcS8v7u1srq+wLjIubS7t8HCvbi9x8HEvLWvsra7v7TFt7u1q7m9vsC9sbq2sLe6s8a8t6+7v7W3tcW8vsPFwMTFxsfLxcDGxrvHy8DPycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMnIysjKxNDN0s/NxcfBxsC/urfJtqqwmVtncIqPhYiJenh+hoZ2d4F8c2hdXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5pZmptbnJ8pMfAuLi1sKusp56iqaeeqqyzraqsqrSttrGzqa6nrLO7urbDubq6sau1ubu0wrqwwLG+vLu2vMi5w7atqqiwssC2uL2wsaexs7W7vKuutaautq67srGqubCuu667uLvAwL66w7/Gw8XAvMbBx8u4xcfFv8fDw7rExsK7xsnMy7O5wr27s4lzdnZraWBibGlZWFdbQUxLTUpFQUM/RkE6OTo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxNDHzcHDxr/ExMPDysLJyr/AvMK6s7W1w66qsJJban+Sh46Pe3h9iYV6e4SBd25eXVxcXV9gX19kY2JjZGJgX11aW1paXVpaWVpcZW5vaGZoaWtucoGturC1rqWkp6eaoKSgmpylq66kqKKrqqyrsKSmn6qttLaxvbmvt7Corri0s7y4tLyvuLm1srzBssGupaijq7Gys6i9qquoq6yutbOlqK6hpK+psqaoqK6mqLessbK3urq7sry+vr7Ev7XCwcfIt77AxLfEw7+7v8TCvsTIzMq/v8PAwKmHc3RzamlcYW9kV1dYUEhZUlNLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzcPHubnLwcu+u8m2vcO+usq3wcPBtLa8trGvtbutqKuSZG2Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX15dXFpYWVtbWVhaXF9ma2ZkZ2Voam9yhaqlrKWenKGklJ2kmpeRoaOpo6Ofpaanpq2gnZykpq2ysLa3p7GtqKq0q7S6sba2rra5srC6urG3paCkn6axqKypuqqkp6eop7KtoKemn5ukpqyfn6ekoKGxra2ssrSztLC1vLa7wcCyu77DwbG5ucKzwb7Atbi8vb68wsfFw8S/wMSghHhxbGJmYGtvYFVZX0hOZ09USEZLRjw9QD06Ozs4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItLa9uLrAur22oJ6UnaGmurars7O7s8TPycvDxri3x8DMv7jJt7vFuLPFuLO/wKy1vLKspa+zraGjkWlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYV5cW1xcWFlYWFhWWFteX2RjYmVnZ2drbW+InamflpWaoZabopiVjJ6hoqecoJ+kpaKnnpujnKCrsK2xtaSpqqqsrKS0uK23sKyztq+zta+wqp+en6OisqWmqrmtoqamoKitq5mgn56ZnZ+lmpqjnJyer6mrqKqsra2wsrivuLm6sLa8u7qrs7K5s720trGxtrW/tr3AvsPCu7q9l4R7c2tfZV5kZFhUV11JV1xLUEdKSkdBPD8/QDs/PDA1NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765x7i3vreywrSxu7usubqxop6pq6eYno9tfoWGf3hybW9ta2JeYWZmXV1eXV1dXF1fYWFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrco2nnJOUlJqXmqGWlpCboqGonpydpaeipZygoZuZr66ur7KhpaOuq6eitbCysqypr7OnurOmtqGjn5ujoa2joqq2q6Ojpp6lpqOWmZ2XmZudoJqXnp2dnK2hq6ijpKatq7KzqrWwsquyubSvqq+ysrO3s66pra6yuLG6trq9wLizsZSGenVmX2ZeW1lWU1pVS1tRTEpFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7OdpaOYpbHCtba9rbS4wczIxr/FtsHAx863wMS9s7m5sr+2sbm7rbK0r5+apKqglJqPeH+DhH94b3F0cWhlY2hkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oJuTk4+TlpaelpiTl6CdoZyWoaGppJ+fqZ2cm6unr7CrnKOkuKqhoK6otqqnqK2xpLiwpLego5yZmaqnoZutubCjoaScoqCgk5ShlJaWm5iYlpeclZ+pnqmkop2jqqqxrai0rKqnrbOwpauus7GwsK+vp6iosq6ytbC8tLq4rqOVgnp3ZV9hVllYU1JTS01eTFBMR0hMS0U9QD49Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+t72unaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa68u7W7vLW5ubCvsKqcmaGplJGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiYmNmaYGVkpSLkZOTmpiclZacn5yflqCgp6akp6ignaCmoKqvpp+io7eooaGiqLOipailsKaxray1nqGdlpWpoqKUrbKxn6Ojnp6Ym5OLoZSRk5iYk5eYmJeep5unoqKapKWlq6SlsKelo6usraaorq+vq6iqqrOmpquvtLGvvLaxr6+gknt4c2VhXFtdWE5MUUhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6lpqy3u7zBxbqxubXEycnAw8bFx7bFxLPBv8Wrt7e9tr26u7Wyq62omZifo4uJdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWlpbWVlaW1dVWFdUVFZVUlRSVWBgX2BhX2FhY2RpgJKSiI+Nk5GSnJSVlqSZoJecoKWiraalpaSko52qq6Wan6WxqqChnqWrnqiin66tqamuraKiopWYopuckKupsZygop+fl5iTip6RjZKTlpCYmJScoaOdpKGilaCipaabo6uloqSqo6uupa6yqaalpqa0pqqorbO1tLm6sKqsnoxzcW9gW1dWVVJGUE5IWlxPUkpUS1NMRUdKRDg7Oz08OTY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo8PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1ybyxvcPJrbG4wbW8wLy0taqsppaanJyJgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJSTlFZXVxdXV5fX19iZG2MjYKQhY6QjZiSlJKcmqKcm6GpqauprKeppqSZpa+llZmlr6mgnJmboZ6vmpyrtKCmpp+jpKGUk5uWlpKpqq2anaChoZuUkIyZjoyRjJKNlpWQnqKgo52co5WboKOhl6Koo6Ooq6Crr6Sut6ajpKOsraqoq6+zt7K9tbOrr5iFdHNoW1hZU1VSRVhMUVtYTVVPUExRUklOSkM9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NjU3MDE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraezt6+oqK+um6morLe2q7zKu7a/rMvGxbjBzs/Is8S6t7vCyLGtuL+3vL27s7WmqaCWmJmXiHp0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXVxeX2BlfYqAiX2Kj4iQjJaRl5mioJugq6qmr6yosaWpmqCtoZWWpainnZiQj5qerpeZqKuZoJ2UpaGfkpGSkZOVqKulmpmZnp6WjoyLk4aJjYOPi5KVkaCeoaSZlp+VmqGinpSbpaaoqKigsbCmsb2ooKOstKuup7C1sLm1wLGusauRfnJzYlZUVk5SSkdWUFJSTExYTkpMT1JHTUtBQ0ZERD5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/tKymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrG2t7y9wcOxsLG3rbS0u7O0oqOdnZiXlYSAdmtnbG5xbnJrcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWp+eH50h4yFjoiXiZSTmJuYnqmboKumpqyeqJqhppyTj5+jmpeXhYSSm6SQlaOdlpaWiKKbm5SMjoqQmqWnnJWVl5uRkoeUjouBjI2AkIuSkpKgmqCilpSYmZWippmNmaSmqaahoLSyqLO4oZyjt6yqrqSysqa1vLWrrLGjiXlzbl1OUVFMT0ROTk5QS0ZOTkpKTk5RSU1KQUhMSEhDPjg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKiktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLexpaekqqWgqaaks6qissO1tbKzxsa2usPKzMazrLm9tLjAr62psJ6mrrqvrZ+Zmp2VlYh8g25fX2ZycHZxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYW11hbnB1b4OHgYd/kIOOipORk52hj5qco6KkmaWXopyVjYiZmoxzjYN+jpeWhpGakJSOjnuZj52Mgol/ipigo56Qk5iWhY6DlH5+dIqOepCHk5CQnZuampKWkJ2Oo6OOiZqgoaSkm6K0r6ywrZ+ZprimprGhsK6csLyqqa+qmYN4dGRXTVJPUE1DU05MUE1CUFFISU5TTUhKSkRLTUZLSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0wMjc2NDc4OTo6NjU6ODdBN3i3oaO0qaalqKOmpaamprOnpbTBuLC0sMnEt7nBzsa9s6y6waytw62ooqaSnaa2raOgj5WWkpB+eH5mV1ZfZ2ZpZ2huY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkhOU1NTVFVVVllbXWpqcGt+hHtzTlhyj4KXho2cl4uUkaCZnZWUlpWPloqAlIlfO1ZvfIyUioGMkoyQhoZzi4WXgXmBe4aTnZSDlY6RkIOGfZN4cXCGjX2KgZGNj5eamZOLkIqdiJ+Yh4iWnpqhoJenrqmtqKiel66zoqaumayrmKi0o6mto5N/dG9gXE9TUldMRFRKUE1MRk5PSUVMUU1LT0pJTVBGSUk9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjrqGmpqqgpqmno6mvqKe0wrmwtbDHwrezvc+/ua+utcKnqsWqo52Yg5ScsaKamIaUj4uHfnN1XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1PUlRWWFpgbG5neoFzUEI/f5WSkX2IlYyEio2bjpaVipKIhpWHeYl/YEpRbniLkoR+hI2LhX9/bX9/lHd1dniEjZpwUY2IioZ8fniUdmh3hoh+iomWi46Rk5eMhIqIlYSbjYKEkpqWnp2UpKOoqaWknpyxqqGkpJGmqZaiqpyipqiJdm5nX11IUVFTTUlVTVNJTEtPSUhGSk5MTVRLUVBPRklDPTc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aco6edn6Gvoaeopaeor6yqtby2uLazwbu2qLnIuLaoqLW2qrK8p56WjX+KlKiWlYp+joOCfXhxb1hNS01NTkxNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DcnV9aWhcVJCJlIh0foaBfIWMk4KSmouPe4aPgHaAeHNvdnF0jo6Ben6Kq4V5e2h2e45wcm14gYuNknh7gHuAdnNyknhndYWEhIV8lYqIio2LgH+Ei42AlIR8gI+YlZyWkZ+dqZ6foJ2gqaWenZiNp6SSoKCWnp+kgXNoYl1dSldQUkdLWFJPSkxNUkpKSkxQSExRTFJUTUVIQT03Nzs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqqWtq7Cxqr20sry4trq0sZ+3urKqnZ2sqaiyr6KakY2UgY6cjpF+doZ4fHZvb2lYS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedIJ7eGZ2jJaYjY58Z3mBdniAiZB9hJiSgXGHj3x3e29rfq19dJCLf3uGkoF8f3VmdnyGbG9nc3yJjIeAbXlxfXFtdo9xaHGBfo5wRIuFgoOFf3d4eoyGfYx7dX2Oko+Yi5Kam6OWmZyanZ6hnJaNi6Wajp2XjpaYkHhvbWdjW1hYVVFKU1VUT1BOUVZLTktPT0pST0lOUExGRDw8Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpahprCsrquoqbGvsau8uKy7vrizrKebsKesm4+WnaWppKGYmY+FknmJjouKdXF7bXVwam1qWEtGR0VBQENESExMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF1lcHJsiKeqwH50eWJ7eG98eYmQen2Lhm9tjJJ5dHlqaoCCcZaRi4F+loBJkphuaHh+gm1pZGx5hZCShmxybHxucnyGaW5wf3ONiYWGe35/e3dwdHSGgnmBeXB8joyKlIOWl5iakJKWl5mXnZaMg4mekouSjYaQloBvam9vb1lWWFRSUVlPUlRUUlhVTU5ITUpNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WssKOtqqi1r66stL+rvMO/paKalaSYno2Ei5ShoZiZkZOLc456gIaMhnRvdGtwbGRsallOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcX6eHYZppc3llfm9tf3qLiXaCiIZ0bJqSdHR8amqdj015hZOJhI5nMXaGc2x+fYN0ZmV1f4SEhYBnaWx1a3GAfGhxcXxuk42PfHR+fXFxbnZtgn93eXVqeYmCiImDlpKSkIuNkZSUjpeNgHmIl4iGioaAkIh3a2twaGZYUlpXWVlbTVBVVllYTklIRUpKSEdDQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW6SiJqRmZajqK2esZ6nuq+rsrDCsbvDx5qWj5SZi46FeoSQmJSNkIyPhnGHgnSHjIZ5cHJwb29kcGZfVEZJQz88Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7KgcXt4bH1scYKChYF6hIaGeXKhlXR4gXN1lIc1cZ2onY6hoYSihXZwh3yHfHSMro2JgWhnYmpucm1wgnVpb1h1cI6bkndtf3t9bXJucIB7c3ZuYnaDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY57c3FxbWBcXV5bWVhgX1JOW1pYV0xISkZKRz9DQUJIP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnn6+VpbSprrGuwbK7wcWWkIyUj4CIfG6BkJKJg4qHj4Z1goRslYiIe3R4eGx3bndjaV5KUEc+PzY0NDk7Ozs9PkBCRUhMTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHaIiHx+hYN/jH51opp6foaBhJmEm5xhhqqfnYuDkI16d4h+iYmOc4uXj4R7XWVxdHp8d4ptaGpieW+FkIJ6b4F4dYV6cHR5eGtuaV12hnyHfIeHjn+KkpeDjYWMhn1xhH+EfXV3e3yJd3BzdGZnYFtbXlNbZ15XUFRYW1VHSkpES0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJGcnZ+mkaCqoLGor8Cyu8W6lo6RlId7hnZrf4yRgn2KhI+MeIOAc6CEinx8gX9wgH56Z3ZrUldMQEUyMTEzNjY2ODg6PD5BRUdGR0pLTU9RUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaISIe4l5fHF8j4x6fYmHfpeHdqGaiIePkpSlja2qSIaur6+LgYCTi4KLgoSSqYeAmJiKnHRtfIGGh32OaGdoeX9uhYeChXGEhkdsgHdyeXZobWtfdn2CiH+HhIt5lJ2ciYuIkX96dYt2fHhtcHd+gHR0cmxbXl5cY2NYZ2VcVE9QVllQRExLRk5JQ0ZDQ0BAQ0E9Ojg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkY6Wl5KXoJ6toaa4r7O9s5eNkouYi310cH6Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTI0NjY4Oj0+P0JFR0hKTU5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BYcFlcXmmNk4eVgISChZGTfoWIkYGalYKhoZiVm5umrZOau7Gnu8fDqIuMoaWPlIqBkXxxg56fkZx/doaFi5CHkGlocISBdI2HhIpxhYJ3h397doV9bnZ1Zn+UjoaJiIeIh6CropaJjpd/eoKIenlvZ2t4f3t/dGxlXltbXmpeYmdgWk9LTldSUUlQSkROR0NKRENBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmd4N7gIx/gZCOipqbpJ2hrKarr7CXkZGEoZSEeHd/jJR8fpKFkpV/ioCSm46DgIGMioKJjYN/ioBtcGpdQkA0LS0vLy4uMDIyMzQ3Nzg7PT9CREhJTlFSU1JTU1RSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZfY39nZ211nZuPmpKTi42OmoiTj52LoKCSo6qlo6yTqbaiqMHCrseveLqUmnyNoZ6ZhJOFgo6in5OYkoSKhY+ZkZZscHWKjIKWjI2Od4+EcW2FgYqWkYOFiHGIoJWGkomOj5aktambjZSig4eTg31/a2prfYGCg3VjXmRgW2dsXWxsXldLR05SUU1MTEZJUENETUZCQ0VGQj05OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcXaShn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReX+SiJGSfYqEmJKQgoCAi4yJhpCHhYmFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5QUlRQUFFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6elopmhl6KUnJ6onqirn6isqaq2l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqbmaeRkYiVopubeHp+lJiSoZOXl4GUnnt3lZKrsomNl598lJ6bjZKVmKOipravnZGZqIeWj42BiGxzc32BfXNpYF5iYGJoZGBnZlxSRUpLUE9JSUxGRk1DSExGR0RCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImLioSShYOGiYGAhnZeYlA0NjAtMS8sLjAwLy8uLjAwMTU+QUJNUVJTUVJTVFJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk5PUVlthZB3lYqjp6q0vbikraysp6i0q7C2srKtu7GzvZyzw6u6ycu3w7+4paKws6ytqqOLlpiFpqago5eBppmNoquopYiFlKShoKuhpKmPm7CLlaOmt7uboaOwkqKdoZ2Qo6Grr6yytaKUpKqImYmSiZV6en6GgGliaV1mY15kZF5nZ19bT0NJSFNORkhMRkpHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGNXaW9YeoV2gZOFh4Kbg5KQjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkI6DhYGMhYaIkoaChImGiIeHcG5hQEU2NDwyLzExMC0sKy0xLi00P0NBTVVRUlNVVVZVTltQR0hFPD4+RkhDRUE3Ozw1Qzs9RktJR0hST1BXgZKghK6js6qywMfDqrPFtqyzv7O4vra/tMG2u7qjuMWotsnHtb65taijtK2wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqK62u7K6rK+1orGrsbW7t7WutKCnp6KnmqmvrbK5t7inm7aojKSOkZOfhniChHdaY2VXZ2JiZGBhZmBbVUpERExVUUhJSkRJR0VBQEBLREJNRzw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtaUWJjV3l1cYGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomIeYaAjJKMh4WBjn+BiY+HgIaIhYmHkXp4bl1WQEVNPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcVk9eVUlLS0FAP0dLRkZEOz5AN0Q3P0JKSkVGV1RQXo+kraOxtMO2uMHMyba7xL2zs8C2uMG1vq+3dLGzpbrEpLDGubGzsbSopLW2qrGgopabopKlsK6mraynpJigrLS7oqiyurW8v8y/xcW9vbPCt7m4v7e6t7msrLClsKqtvbC8usLCrJm6qJOtj5eXqol9g35sWGRiWWtmamZXXGNZVlNJR0ZMUUdDSElBSEQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1NZVVp2anB+joSAjYRuenN4h2K5oZmjiZSUlpKUk42QlpKHhnuGgY2VioCEgYp6fIuHhn2KgoGKg5Z9d3p1ZVBcZEdFTDtRY2FbXlNGPztIUEVaY1FSWVhaZ1lUYGBMU1BFQT9JSkhFRUFAQzxFNkI+SEdKTFNaVF2Trri1urjIv7q9ycy7vMC7t7W7ura9tLqxxmB1sqSxmp6rvaqlqKurpKKytaCrp5+Vlp+Yn66lp6aln6OUo6extKeys722wb7TycnTx8LFzMLKw8C+vb+7vLe0r7i3tsO5xb3Cx6+euaqhq46kp7aIgYFzYGNjX1hiYGlnUlhgVlFVSUVFTktAPkdEPUtBPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhY9zbHJzc4fVwLWZoI2VmJmRjpeRlpaOhod9hoOMlot+g3+DeHuLg4d8i3mBioKXfnR9emtmcHVZXVxQZWRiYGVkXVtYV1xNZG1VUm1tX25fWGdkVVlVSkRCS0tIRkhISEdBSTlEP0hLVFRWXFpbk7nAuL23xsC7ucrKura5tbi5sre1tK62tplkdaicrXBeoqycmKCim6Seq6WUn5+QlI6WmJenn6WfnpqZg6SdrKWqsK24sL251NHO1tDJzNLMz87Kxr+/wsq9wbzBwMTExcq+yM6zpLuwtK+aq7i7mYB7bV5hXVpfYVpjY1BbYFNQS0NBRUZFPEBFPkFIQUBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRXFloX2+WkpCUbmxvdXWHs6yhoJ+LmZyZjI2VkZuShYqKfoiHi5CMiXyBhHN7ioOFe4l0gYqHlX9ze3lsbXV7aHJlaWxpZmppaGBmaWlsWm1zlq2kvIiHZ1tvaF1aWlRIS05PSktQS1NRSExBSkdKT19eYmZpYZe3x7C4sru9tbHExrWwuLCvu6uysaert6uNtaedmqeaTpqdjI6flpGmmKWVipOTiZCJkJGRnZuhl5qVloeemqebrK+osKe0tNTU1NbSy8/U1c3Tz83FwsnQv8rJysnRx8zNwtDRt6/DvMS5pba6w6KDcGVeXl5ZYVhaZlpRXVdPUEJCSEVCSDtBQz5BRz8/QTg7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVZzkJCYgmhxb3l5g6CqnqWWjJqbl4uNlZGajn2Ji4WNioqLkId8hIJwf4iBhnuHcoOSi499cXh1bHF4fnF7bnhzbGiBcG1jam1weGl3fH7Lv8Hfp25jeG5jW2FgSlBSVU5ZXlBdXE5QTlRRVVRcbm12gnGWrbistKavtqqsvMCwq7SmpLimq66gq7SjjrGtmpeYjJGTkYSOm4GNppGciYOLhIqJhIuDlJWXl5OckZyYmZmfnquspKeirK3P0tXRzcvS09TQ1NHOyMPU0cfN0tPT18zR0cXS1sXAzsfHwqi+t8+eenBmX2ReWGFTXVpQUVRQT0g+QEZBQkU8QEI+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU5adYaFindsd3B9fn+hnp6hi4yYk5OMi5OPloR5hZCQjYuKh5GHf4J7cn6AgYd6hHWFk5GIf292cmtzfXt2e3OBd3FqgHNyaXBxenlyer7Lmn6MsoR2coR2aGFrXUNaWltWZWNYZGpTWF1dYGReY3h6fouBmKmjpKGfoKilqrC4qqWzo6GtoaOtoaexn4mmmpOSkYmRj4iBlIlqlKKMmYSAhX6Rg4OTlq2LlY2Vmo6GkpGel6ewoaChpaSoyM7PyMLL0dTR1NPO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsw8PMjHRwZGFgWVVaVFxQS0dKSkpAOzo7REFEPEJDPkdCPkJCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnZWdlIWLlYmPioiOh49/eIOUmIqNiIiLiX6CeHN7fYOHd396h5GWgINud3BtdX91eH10hXx5bId2dG59doR1eHydtYw7QYvFpX6MfGllV0lDZmNlY2dqZG54W15maGtuaW6Ag4iRi5ydoJ2Ql5ieo6OmsaOjs5+hpZ2gqaCjsZyGnpKSkpCKjouGg4+EfpybjI2ChIV6lH6CqZWjjJGKl5KLfZeKmpKrs5ianKicp73Dxrm2xs3S0NLQzNLLydTO0NXa19fY1NnYzdjbzsnZ2tHWvsvMtHl3cGZeW1NXUltWRkdKSUVFPTo3OkBAQjpHRD9EQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzU0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfZeRnYt+h5KDiYaFiYGHfHiFlpaIjoOHhYZ6hHlxenuEhnV6hY6NnXmLcHxvb3p/cXuBcYOHgG6OenV3fXyCdX57hoevc1ipwraNkYJwbmI9XmhycHFwbnh2gWVob3J1eHF6jIeOk5GblZ+Vh4yTm6CbnqqfoKycoZqYn6Wen6uZi5qMkJGNhH2Ih4OFi46gmZOIhId+bZl5hJiGiJOMjZSMhnyciZSPrqqUlZifmaavtb2prb7Hy8nJzMvQycPSytTX2NfY19Xb19PZ29XQ2trR1sjUy5V7fWppXFtRVFRfSENGSUg+QT49Nzo9Pzs9Rz0/QUFBREE+Pzo4NkRCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NjU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw6OkQ/Q0dSal5tZGJma3aAiHKRj5qAeoCNfoKCgYN+g3x8hJiOh4t+hoaAd4J5bnt7h4J0epKejaB2jnWCdHWBfXSAhG+Bj4FvkoV0fICEenaGe4i3xaTBybiClpuPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aUlY+XkYSJj5aZl5alnJeflp6TkpejnZmrlZCQiYyRgoyFiIiBhpCRnpuZiYWMgYaXeoiIn5ePiI2Ki4J9oYqRjLyhmJOXmZ2ppqaun6i2v8DAucfJzc7FzcnR1tXV2dXX29TX2drb19va2tjO3MaHfXtpa2dhVVhWVk5MRE1COz09PDg6PD45PUA2PT9APT8+PDk4NjdEQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTU1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiYySd3Z6inx+gH5/fIR7foKRiYSFeoSHenV9dW18fYZ+c36SnZGeg5F8hn54jn14iopugpqAdJmGfYGIhHt9kHqPqI6Pw6G9jJyjnX2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJKFiYuQkpWPnZqTlJCWjYyVn5yUoJSRjY2Pin6Qjo6LhImSlpqen4mMlJKdkYKLf6WZiISNgoWEgaWHi4u4mJ2RlZaiqKGdnp2jr7e6tazAxcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u4ent6bWtnWGJcVFBPSUNMQTw8Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlhfVlhmbW1taYGOinFzeYp7en98f3uHe3x7i4eBfnWDhXlyenNtgH6EfneFm6GanpSSgIyIf5iHgJuSboeohXqgi3yRjYKIhJt9mpCKjKOioJCkrqCLkYuFi4GThldyrYufq5uPg5ibj4+OXIKikYKMn5OVjIeIjJKTjJSUlI+Lj4mHlpudj5WWkIqSk4WAi4iSjYqKnZaZoqOHk52WoIqJiI2ckIOIjn+Dh4akhoyQs5idkpWXoaGfmZKcnaiyuaymvcLHzcjGz8zQzM7X0NHUrtbV2NrY2trX1tnZn3F/dmloX15ZVFhZQ0FIQz8+Pjo0OTo7Nzo7OzM7Oz89Pjc7OToxOkg+OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J5bWJ+kYNvbXiLeHp/eoF8hnx7d4aEf3NwhYJ6dXZ2dISDhX1+kqajn6WiloqdkJSXi4qol3KKsY2Ep5KEmZOEmYyilZ+Yk4manqOSqa+fkJWQjY6IloxujbeFmsTIspuhpZucmJaQspFkpM3Ilo+Gh4mQko2Nk5SJhYqJhZaZm4+QlJOGlJeEf4+LmYiNkKqXl6OjiJmflpqIjoeXl4qEjo2Bf4iPpYmNk6mal5OXmaGZn5mTnZujs7Smo7zBvsjFxcnIycLK083N1KnS0dbW1tja1NPazoNzgWllYF9fUEtWXEJCRkM7QT04Mzc7PDo4PTY0OTo8OjgyPzk6MjpJOj02N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ1go59fG1+iHh6fnqBgYJ+dnaAgntsbot/eXx4eHyEh4t+i6OzqKOrsqGWp6ClpJaVrqKDkLeVkrOZjaGgi6Sbr6KknZiQp5apma2vpJeVlZSQi5ialqDAjqPJuKuaoqWtmZGbnLKdhoWoop2YhYiJjpWNi5OPh4GGh4iTmJSMi5OThpSYhoORkJx0kZmylpekoYicmpOPipCLl5qJipaOhn2MmZ+KkJCcmpmTmZiflKCdlZ+bobKuo6W3vrTFx8S9w8O/xs7KydKnzs3T0tDW2NLP2Ltze3deYldiWFFJSk9FQkNENT46NzY6Pzs8Nz00MjY2OTc3ND01PDU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER05bXFlKZ2E7SISKentthYZ5fIR4gIWBfXB4fX18b3ONen2Be3iGi4mFhJKou62osr2vpa6zs6ijorCsipq1nqK4pZWspJeprbempKOfmamYqqSvsKmamZyUlZGYoJeZu7utyaBptrirsJWYn6Krkpe9o16psoKJio2Vh5F8j459g4aNj5SUiIeSlouPlY2LjZeZkp2as5aVq56LnJSSjZCSjJibipKej4uJlZ+ijpWOmJqdk5yYnpWioJScnKWvqKKls7irwsjEtbu9u8XIyMLRocbJzc3E1tbQy9OicXxqXlxVYFJRR0Q+PUNBQjg/ODc0PkY8PDY8MzUzNTU0NTRCMzo6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pj00N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZUhiYGNwSkCLin6AcoaHfIGJdYKKgn5tfX18f3B3h3eNgYd7jY+Mhoyaq8LAsL7Gu7O0wby0rauztoyosq6uvaqbu6Sorbm3q6amoqGjo6qvsrGqnZykmJuYl56ipaWSo7muqMC7rK2yuaWkp32IhpytvbCDi4yLkIOPg5GPeoGHkI2OnIiIj5eNi5WXlJCalpynmrGakaudjpmPko6VkJCWl4+RoJGIlZukrJWWj5ScnpShnpuZoKGUmp6op6ShpLCzpsHGw7Cwu7bFxMO+zafHw8fDvNXQzcTKiXZ1ZF5cYVxPS0NMQEVGPkE/Qjs6ND5BPT01PDY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGdHYGlnWl1bk4yMiHuHi4aDjHWGkIqBbn58gn9xfoF6lXqSlJSYkZOVp7TGycDCzMHDuse7uq+rubuXsra6s8CupcCkqrC7u6quq6Kinqesr7WwqpugqpyinJafsLSni6O6urXBu6uonLKkpKiUhI6pw8SkgouOh4iEhpWUjXqDjJGPkaGMjJSRj4mYoJeTmZSXpqCunYyqnI6Vj5KRlZWOkJWRj6GUhpefoLOflJuUoKGZpJ+aoJyglJiepqSmp6SvraW/xMKuqbe1ycO+ts6yxb7DvLPRysjBtXZ7bl5aXWxUTklDTEtKSUBBPUNEPDVBRDs6Mz04QjMzMjI2MkEwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmdcTWVcZlRjapmNlomLiJKPhol5hpOQgXKAfI1+d4eBgpB6jaGWqJqamLq+yMnKwtLJysLNvMGzrbu+p7q/vrzDt6zBqayzu72qsKmkpaOsrrSttragoK+fpaKYo7S9qZuovMGjtravq5KvrKqrloaaqaalkYKMk6WViYB1ipJ5hY2RkJ6gko6Ui4+NlKOZl5uUlKOeqZ+RpZqMj4+PlZaIfY+VkpKjmpWgopy1ppCfl6Wko6WfnqaYnpWXm6Wjqaiisq2ou8DEr6Wzt8zAua7Ds7u+wbitwsLBwJlwe2NaWF1cTUxNSUdEQ0hCQkFDSzo0REg6OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5rSV9YYVpkZVaej52Ol46ekomKf4mfkoR4hX+Vfn+QiIqQgJWgma6no5jCvcnEyMbTzc7Ny7zCt7C6vLS8yrzDwba2u62zv7m8ra+ooKmntq2uqbK3mp6toqehnau3uKmlr77Esb25s6eps7OtrpaVpaynoJGOkrHFp5WNfJGVfYeRmY+qmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi4yPj56IWpCXl5KWpZpmmaOfs6WWo5asraunnJ+nmJmWmZWhpKimnrasqbq8w7WmtLbLwbiqtqyzuriuqLi6vbiDbnBcWlZXT0dLU01LP0FIRURHRkc4NUZNOz43PkFKLjMyMDI1QjU1UFdOO0xGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhXOz1AQkZCckZpSVJlYkxGppSclqGXqJaMkIOHpZKIgYeCnISDlZCRlI6aop+vvq6hx73GxcjHzs7O0sq+u7axuru8vs62xL23uLeysrWzuLKrppyrq7irqaiwsJejrqSnpKW0wLCqrLO+wrrAubOnuLO3s66Vpa2urqSLk5WhjXPBmX2WmYSOlpqLsZWampWSk5mapqOVoJuWmqicm6GgmYuMj5adYEqWnJqUmqWXVJawn6+cn6WUr6+tppuhppSTmZmOnaCnopm0qaqzvby7q7Cyx8C4pqurrbGxo6GysrSkcnBnXlxQUk1FUFBQUTtIS0lGSEFDPjlLVD9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pWDs6QkNAPVJFV1JzYldGSKuXmZ+hqK6YkJeHi6eWjoiShZ+IhJyXj56gm6Oltcm0qca7w8TIysnIzM7Hvrqzr7m4wMHNtci6wLm1urGvr7K0pqObqrS0q6mmrqyZpK6lpaisur+oq7a2v8HAvrizssKvt72ro660rLiliJuXppt2vqCEmJyOk5mai66WoZybl5WboKGpnqigmpqqmaGnnpeQjZGdg252k6KalZ2in5CusqOrlamqmKuvpaWgpaqTkpmbiJScop6Wsaeqq7q3vbOyrr65tp+jp6ilp5ycrKmpjWVoYmBTTE1HSE5KVkw9TURNSUpBQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlNhTVZIf2VeSEaslJyhn7uumJSei5Oqm5GSk4mrjYeinoykrJSjo7bHvbTBusPDyMnFws7Iwr25sq+5tMDCyrbGscG8tbqrqK2sr6Oimaq0uqappqyqnaivp6Srqr68qKy8s7e9xry2tbjAsL2/s6m0tqu+pI+il5Gin7yfiZqgmZeenY63n6mcpaObnKGap6WzopudpZyoqp6ZlY+UmouXiY2kopScop+gta+lppOxq5qrrZ+epaSqkZWVoIOQnp+clamloqG0tbq1rai1srOenKKmmpeVmaqhnnhiX2FfTElHSE1RSU1FRkZCUkpIQURHQVZTREg8QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdFqJeknp7CrJuXpZeZqZyWmpqPqpaVqKaVrayZoaq2xMG8v7jBw8HIxL/Nxru+ubKwuLO/w8i1v7C8t7m3p6Srq6yhoZurq8Sipaispp6sr6yiqqi/uKasvbC3tse2tLm4vrC+wba0srSvvqOWo5aTm5Stn5ChoqWjo5+QvqWpnaisnZ2hm6afvaKYpJ6iqauhnZaNlZ6Tn4ePhY2TnqSgnbWsppyWsqeZsKigm6ufoY2ZlZ+FjqGam5KlpJqYrLG2saqlqa2snJigoZKOkJWpn5RqZVtiXlBKSUtPTUhGQ0lAPU9IQDtHSUhbUk9LPUhOVTRCRjk+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZmNYTaKao5udxKuhn6ydna2fkqKelqSgp6qsl7awo6qztsXCvcC2wMK8ycK/ysi2uLW1sbS0t8HGt76xuLW6tqCnraqsnZ6fpaTBpaCqrqCkqa2voqanvbalsbu3trXDsrO3ur6xw8C4uK2ztLWinKSVkZOgraCZoZ2pqKuimsOtqZ6srpubnpimoL2hnaSYq6urpqGZjZqfkp6Jjlh/lp6moaC4qqeTmLejn7OioZyvmKCPmZSdgo+gl5aNoqSVkKaus6upoqKlpZWVnZmLj5GTpJ+JY2ZcZWFNSktLT0ZFQUZLPj1KQTk5SkpOXVFRSj1MV1w5Rkk9RE1JOEhjXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3NIRTY9dWVcTE+en6GYnsOnpaKzoZyyp5OqpJ+jn62prJ27sKistbLIw8HDs8LEvsfEvcXKvbCxt66xta+/xbW6sbC6tq2aqbGpqpuepqGowq2brLGcqqKusKmkp723pra6vK+3xK2zs8K/scazurertLatqqKllZWUo6uhn5+ap6uvr6+7sqagqamZmZeSoqS4oaGkkq6vrKSmn5KhnpWej5GNlZ2ao5+ntKenjZi0nKOvm5+cr5GglJeUmoCSoZaPjqChk4umrLClp6KcoJ6SkpuUhYuSjZyegGNnXGhmS0pMS1NCQ0BJRzs7Rj85OU5NVV5SU0o+T15ePUhQQk1MSTlOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tVXmZyQDg8SJZ3ZUE0n6Sfm6DCqKOqsaGjtKmWsqumoqSyrK6pu7KtsLS0xr/ExLXAxb7KxbbAycK2q7WpsbiswMS0t66ttrqlmauyq6qYoKeXrbu1m6iwm62frrSyp6q6s6e6s7eyuMCqt7LCvLTFp76urbe1qaesoZeWkaWkoqKXl6SvuK2ytbagn6ikmZSVk6Ogt6OkpZWusrKlqaWinpqampWYqJ+fmKKerrKipo2Xr5mlrJibn6aSnY6VmZuGl5+UjJCcnpSLqamroqehmZ6WjI+ZkIGGlomUn3plal1sa09RTk5UPUJBTkM7OklANzdRT11eUlZRQVdgXEJKU0hXS0g6VWRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzkwNnBbYkgwNUpwaVZDV0aMeWZDO6SknKGlv6aor6+hqbWqnbmvq6SqtLexsLm2sLe4uMW9w8e9vMTCx8G5wcfBuqq3pa27rcHDt7iqrbK8o5WtsK2yl6aokaq5qqCnsJ2qn7C0s6qptrasu6yysrm3rLmwwbm9vqbDq7C3rqiqq6admJiqoaKgkZegsK6zq7C5mpupn5mWkpemoLeppaKir7Gzq7Gnq5+boKCbnqWdoZedo7Owm5+QlKaaoamblqOgl5mKlpmUl5idk4iQm5mUjqmpp6Ckm5ibk4ePmYt+jJaGjptram5ibm5YUlFaVEFDRVVAOzpJQTc6WFBkXlBXV0RZXl5NTFJPX0tKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE3NDdnWWBGKEA4bH1oXFY6iXtjQz2on5yhqb2hqrCqo7G4qaW1squhrbW9r7O4vLq9t7bBw7/JxLnFw8HAucW+wbivtqirt7K8v7+1qq6yuJ+XrK2orZeoqY+nu5+lrbOeq6KxsLOsqraztb2tr7G1rLC1scC5xLarvK+xuKysqaKxpZ6kqJ6kl5CYn7Kqs6qqs5mdp5uZlI2gpqS0rqeirKyusaeyrLKpo5ufqKSelaCZm6i1qZeZkpKfmZ+hn5Gsn5mZhpaYjJ6anZOKjZaXmpenpqOgnpaVlpSBkJWFe4+ShIyXZm1zaHBzX0dZZlZEQ05YRFo5SEI2Pl1SaFxOWl1HW15dT01SWGRKSkNcY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19eYVYxNTE9YFZeOClDM1lVXGdLNYx6ZkxApJmgpKy3o6yppa6utqqutLmmp7C4xbext77BwrW0u8W+zMW5w8G6v7rEt8G5s7Wsqrq3u7q+tauusbeZmKirqqubrauPq72eq66xo6qfsa2zrq62srm3qq2usae1r7S6vMmyqrW0sbSvrqahs5+aqKygpZWVmpmxoq2gpa+WoaSZmZKNoqWmsqmhprGrqrWkrrC1r6OZna2nm5eemZmsuKKXk5CPmJyhmZiUraCelYKTmY2enJqXkYuUkp6apaOioZmWk5KWe4yQhXuNi4OLlGxueW91fGFGYGpaSUhaWz17SkdFNkFiVGlaTVxhSltcWlJSU2JhTEtFYGFgUExJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4qQS9KR1BbRzNjWVRLRJmXn6+osamspaOurrWptrS3o6y0t8m6tLu6v761tLfDwc3HvMS9t76/wLe/vbK9rqe6ure3wresrrK5lZenrquno7OqlK+6pK2ysaanorKzsbKxtbG4sqmuq7KnuK+1s8TEtqm0tauwramnorafnqaxoKSUm5mUsZ6nm5+pjaminZuVl6WlpLenorCzq6exp62wtaykmaGsqJucnZuUqrmclY+Oi5mdopiRmKijoJeEkpaQnZyYl5aIlo+XmqidpKGSlpKQlneEkId8hoKEjY1ucXh2fH9dS2VsXEpPZFw/YntHSThHZ1dlW01eYk1YWVdVWFRpXVBPSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5JZzI3J0ZhTFYlLUIuPUVMUTwzcmtLREORmKStpK2tq6ajsLKzqrawtp+rtbnJua7Bu8O3s7K1wsPPxMDCvrW9wL+6v72zxKiqubG2t8C9sKy0tJ2hp7CtpaaxpZ6ytayrsrCsqai0uqy0s7WstKypq6isqbmtsbDHvrikua+pra2mqK2wpaOjrqOpnJ2bmq+ZoqOio5Csn6Ogn6GppaW4pKu0tKSqq6isrrauop2jqKqcoJmakqS0mY+JjYeRo6CWjpWfoZaUho6Uk52bmZaVh5iSlZmnnaCgjZORjpF4fo6FfX19h4qKcnRzf35+XFJkbl5OWmddRkSWW0c6Tm1YYltNYWJOVlZWV1RZZ15RUkxkWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQ2U7NipIZEhKKzpJPzNDSVMsPo9rPkhJj5qpqqGpsKSoo7O0sbS1sbGhrK29y7quwbvGsbSttMLD0cTGv8GzvsLCvL+4vMWorbess7i8wbGssq6hpKetqaiksaOrsaqvq7Gurq2rs7unt7GyqbKpq6alo626rKqwwrm0rLmoqKitqaexpamkoq6qqKKem6KslaWdl56Yq52hp6ihrKWjray3sbGgqaKfqq2wrJ2epqepmqOYmY+gqJiGg46Ki5+gkIyNl56RkIeIkZWhnZaYloaWk5OXpZ2dnYySkI6KgH+IhX13gIeFh3Vzcol2bF9ZYG5jUXNyXEs8hHxGP1d1WGBZT2NcTlVWVVdQXGFfVE9PaFhXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSzAuSWdERjg8QjA1RUtYMUCUXEBNRpWWrKehqrKcqamwtqy4tK6qpKurvcm7sb63w6+wrbPExM7Ow7+/tMHDxLrAtMnErK+3rrK6wL+0rq6spqiqsKmmqLKmtK2qsK6tsa+zrLO6pLizrKytp6ugop6wt6uqrbq2pLW1pKmnrKyqrKGopqaxsqSmpaGhq5aqoZOaoKaeo6KqpKyinqaxt6ysoqWimqmqramcoaWkpJmgmpWPmJ2TgYKQiIWdoI2Lj42bkJKMhI2ZpZyTkZuMk5GRlKObm5qLjouLfIeBgoJ7dYGEgn51d4ukh3lrXmBuZ1dmh2ROQGeSTERieldiWFJlVU1WVVVUT1xdYVZLTmlXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREhkFJSESWka+koqqwmKqorbWrtrCrpKuqqbzBwLi5s7y1prKvxMnL0b/Bu7nAwMK5wbrCxK6xtbK0u8G+s7KvraysqLaqpa2wq7muqLCwrrGrtaq2taa0tquspKmqnKOds7OoqKSztKC2rqGpqKuoq6egqquoubapqqqpoamfrZuRqKGdoKOipqKpnZymtK6npamio5elpqapnKKjo5+ZmJ+Rjo+YjX6HjYeFnp6IhYuLj4+RjYSGlqOajo2akZKRjpOfmJmWjYuEf3SHgYB/eHWEgHt4foCInY9wcmdncXhcYXSIaU9dmFZIbXlVZFZSY09MVlRVUU9YWmJWSFBqVFZTR1BZVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDI/Zj1OWD9DLD9MVF8vSWs3UkU7lY2voKWqrJmrpK2us7SuqqWvqam7vrvBsa+4raK1r8nHyNHAv727vMO9usPBwL+vsbOytr28wbKys6u0qaW1qaSts7O4r6KttbGvsbmquK6qrrarqp6qq6CjobatqKGer7KhtKqeqKeqo6qhoaytqL2vrK6soaenn6yZj6+imKKgqKeep5uYqbCoop+soqGSoaKippiaqKWYmJidj4qHlYh9jYaEhaSWhoOCjIeQj5GFhpWhl4mSnZGTkI2RnZWXj4qFhnhzgX99dHh6gXt0dHtqgoikdmleZWyBdWeIi3xSV3BeS3hzVGRTUV9NTVJaZ05MVlllWEdTalJRPkJOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaTozOF89YWQ/RjFDUFtbK0hPO1hCNI+OsaCkpaqjpaOsprSzsKmksKequL7BvLCouaqnrrDJx8jQwr3Avrm+vrzJvMK5sbC1srq8ucCztLutuayjtaenrLK2ubKmp7q1rbS8r7ylra21q62cqa+kn6WsqqecnaqypLOomqqnqqSpnqKpqKm9q7SvrZ6po6CunJqyopakm6Sln6SamaeqpZ6aqaGbkZugpJ2YlqmpkZmak5CKgo+FfY+CgIiej4eAfoyHko+QhYGUm5SGk6KNlJGLkZuTlYeJfoByenl+fGh3fHt1cXJ+aYZ6hIhkYGhjcoV7bWh5XV5WQ1h7bVRhUFJZS0tNcHRdSFpbZ1lFVmdPQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOk7GZn5+ppaOhqqS2srGkqbGnrbnBvbWwo7mtqKiww8nJzMG3vcC1t7+6yLbDtbSztbK9ubq9tq25tr+torOnqquvtbe0qp26u6ixv7K5oK+0tqmsnq2xo5ylqKqjnZyksKavoJ+rqaehqZyjqKCtu6eusa6hqqKjrZ6erKaXn5uhopyfmpmiqqKamaOjlZaTnqGWm5amrIuekZCRjIKLgH+PgXualIyJfX+Mh5CQjIqGkpiRh5SkipKSh5CakJOBiHx5bH12eXhie3pycHFzeGqCdWqDZ2NoYW5zjm1ianBgb0JdeWtWXk5RUUtJTFNZVk1cXm1XRFhhT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNRXT0jkpesmZ+Xp6Ohn6ejt6+toq+vqau5wrqzrZ+5r6uotLrHyse/t8K+r7S+t8S2w7KwurGywLa7vripubi9qqS1p6iqsK25sKmZubyjrb+0tKGut7Wmpqews6CfpaaooaSZnqyoqZ6gqq6noKaXoqifsLifpLGuoKyhraSbpqapmpqbn6OVnJuZnammlpqeqJGYkpidk5mWoaqQmomNkId9iH+Cjnx8oYyMiHmEjYWKjY2FiZOajomVn4mRlYOMl42RfYR7c3B8cXN0YHl4am9xcXBrf3NkemxoZmRiZoeAYFtyanFNToBpWFpNUUxLSFBSUUhNW19vVERYWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXFs1KJabpZiclaygnqGkobeqsKO0tKmpusW2sq6gt6ytrbC2xcfAt7/CubC1vLe/u7+vrL6ws7+yvcO5qbu6uKeotqinq7Css7CmmLy2o6q6ta6fsbivqaWnr7KboaSgpKOhlpuvpqGfo6ivoaCik6Okorawoaaxq5+so6+Xm6qlqJ+Ymp2kk5qbmZylqZmbm6SUlJeVnI6Tl6KpoZCJio+GeoR+hIp6j5eKjYd6goiEiY2PhY6TmIyOlpmKj5d+hpeMj3qAenBxdm5vdF94d2VtbGxraoRvZnJpa2ZpXmR0gWBba3ZpWkp/XltYT09LSEhSVUYyOV1ebVBEWFZZZU1ISUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVV1oRC48MmNWLDKVoqGXlJuqnaShoqG3qa6gurilrL3Fs7Cuo7Wvra2vtMPDvLO/urexs7m4uri6r67As7S5r7/BuKy9urWmorOqp6myq62xoJrAtaSmtLWonrK8qailqa+smaOnnKSllJihsqWZn6SoqZyioJOkn6O4qKSnrqadpaGokp+ooqGhmZucoJKam5afoaqbmpiglJCTlpmNk5OjqKSQiYmPhnmEe4SGfZ2NiYqHeoGEh4mJkoWWk5OMkJWUjY6Ue4OXjot3fntsdHFsbHNhd3VpaWpnZ2+GaGhpY2ZpamBrY2poXGV7Y2BTdFRcW1NMSkdJT1NAISpoXmpMQ1ZVXmBLSUdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnTycynqKjkY6kp5uenp2jtaynqrq3p6zEwbawrKO1rqeur7fAv7yywbewrrK2tri2tq2qvbOusrG9v7iuvLuxpZ+2q6WltKmqrp6dwKuopK+yqay1u56oqauxpZieqZ2mpJGZpq2imJ6kqaGboZyWn52ntqWvqq6hoZ2doZSgpp+hoZqbmZyRmJyTpZ2roZeWnJSSjJWXi4+YmqmgkYiJi4h5hXeCgoKdiIuCiX2AhYiHhpGEl5WQjpCRkZGMknuDlY6Gc319Znhva2prZ3Vza2NnZGR2gWNlZmZmampka3JaX1ldbWRhTmlYW2BWSkdJS01SWD45X2xpSEJUU1xbSUhGRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNCaEglNZqjn5CMraGYmJ+WpLOxorG9tqGxxry6sbGkt6yqrqm5vLu7rsGyrq6utq6yuLOoq7mxr66ztrq2sLi9raaetaqgoLCkqq6cosCgsaSusK63rrWera6traKanaeppZ+Vmqeln5mloqidmp+blJydrK+luqiuoqGamp2ZnqSapJ6XnpiblJmgkqiVqaeak5qakYuVmY6UlJmpp46NiomPfIJzgYGKmIWHfImJhYWKjIqShJSck5KPkJCWjpB/gIyNgnCAfmZ5bWhraWdxcmtcaGNjdIFiZmhqbmxnampobl1sbHRwYVVjaWRlWklGTE1PWFFRVmFlgVVAVlNZVUZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJzSRoZqNjrCempOhmaiyr5+4v7agtMK7vbqxprawqK6lt7i3t627r6yqq7aqs7itpbO1sq6psLe2sbO1uqepn7WonZ6ooqmtmqe+mK2jrq+1ta2sn7Gtr6minJ2jq6iclJympJ2aqqKklpqfnJCbo6uqqbufp6SgmJmZnaGPa6KWmZxwgpWao391kamnnpSUnpCIl5mAloqhkHiGlIyDbml+doNxbIaLhn2EjIdwXmNhZ4SYhmyLj5SSdHeLhH6Dj39nhoBndWhlV1xoc25OUGpjZ3OFZ19kZm5tal5fYYqPg4RlTktEOUZUZ15KR1BQVFVLSFJgb3RlRlpRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNTY4LCMxJzIxNDoxNzVYgWwxNk9rW05cS1tmYj5HMVFkPSoui6OZhpWwm5yToJuqraqjvcWvqbjCuL29rae3sKWrpLezsrOxua2ppqy0pq+1oqi4traop6y3s660rbOiqZ+zqp6hpJymp5irupWmpa+zt62upKmuq6yloZ+coKenm5egpaWbm6ennZOfn5iQnqeqo7Wvo6OjnJaXl5ejiKCOkpqHoYeTnKB/pH+lqp6SkZqRiIRyeI2OhYihdoiMaZeIZn1yeKFviIeEfo59f6GgoJmAfIeedIeOdpuKbIeBg2xoZWN6a3FhU4VtY2xpmHFZanBviFheaVtra1uIcW56coVnhoRaXkdOP0dfTUZSVlZRUVJXVGdeTVdJUlNQRkdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcwKIumloOcq5yZmJ2fqqqnqb7Dr7G6vbfAv6qlt7CpraaztK6vs7erqaWxraW0s5yttba0pqeos7Gtsqiunqugsqigo6KaoaKarbOUo6WltbynrKerqqyopaGgmKCmo5mZpaOkmJykqZaUo5yUk6SlpqG3o6OgpJiUk5eSnIivkJiUiamLl6GbhbGAo6ydk5mdlHmC1KiAh5XBm8d5eLGlt5dkgMCcv3mEhHmQhHyQkJHKcZe8nMV6crWmu5B7gGyWsauweGhrWLGubmVpvJK8bmh6b3KQ2H5TamK2sn+BcpV0mqGqkFdPV2JQVk5GVFtYUVBSjFxXXFBAXERRTkVHSjw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGNppKAp6qfl5ydpa2yp7DCvbK1wLW3vsKrp7OtrKmnrrOpr7a0p6emtKWnuK6cs7K2qqWkp7KurrGmqp6npLGjop+el5ufna6rlJ2in7O6o6qpoq2upaGdm5qhp5+Xm6egn5iep6eRnKeak52hpqKgsKKfn6OWlZKYkpmFr2tqio2qfmeDlYatZHCdnZSZpZRxrqGkfni7fWuhj3axX2q0W6WAZpyRYGaCemZ/anhrqWS+cmemjHWxanyxeHSSk2NtbaduW4SgRWhmh5ZFdZxgfmh8pKeCWV+Lq2mAlnh5aqc3Sq9cWFNsZFtLTldfXFdWO06JT1hXL0lUVEpERkY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzAbkKKVgqynpZ6jpKqyt6uzvb6wtsSyt7rBp6mwq66oqbCuo7C6r6SkrrKjqbionrOysKOloKqtr6yvpqefo6Kwm6Kbl5WXm5uspZaboZ6zs6KrnKKtraCdmZegoaicmJ2jn5yZoaakj52impegn6qepqagm5+hlZWRlpGahbWbtXiFqZm1mXaGs5u3fpOWlqiUfmyCpnuChoiSlJJ3q2drsVure4+HlHSJcY+GgH+IkJd4goKLmIyDoI+EsHZ3n3Fra2x8i06kWEhjY5l+Y2imYHlzdVOTh15QqW1jcX6HgGKcLlGhb1tTa2hgTEtbZFhcWkI+sXlYWEEjTWhGQ0VBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjhhVTUwG5WflYezpqagrqmnsqypu7bCsLvCrbi2v6mrra2upq2xqaGvvKqhp7Sso6u1paazs6ejop2nqrKosKilnp+fr5afmJSVlZedrKGZmaSotK6hqY+pqKmanZWYoKWnm5+dop+boKOko5Wbn5eZnaKpm6WZnJyioJeTkZOTnYPVk5m5cLDCfsWGfNaUm7t8mpWkj42cjaR7joekgqWCeqx5j51Wr3qIfp9quVq5doeEfaaCk3yYeqp5jZ2Qe7FujoR0kLyFb5RQr6fFilGgemNgqWJzc4htl4hgU7W0yIaAiXxjpDNCnXZdUGppZFBAWGdaZGFKSE5tTVtST1lmWUNEP0U/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVE3MSWbopOYsaiopbOqpbSppLy3wbC5wLG1s7qytKaxsKOwsqafrraomqe5raOvsaCztLCgpJ6fp6mwqbSppJydnquXmJeVl5WVoKmcmZanrbCoo56PraKmlZ6XnKGloZmioaGhmqGippueoZ6UmZumoJynlZubn6GZj5GUkZ2Ism5otXGrh26OpnK0c3K2e5qXpIuPnY2jf5GhpX6wdoOR0tF2XK57hX+kb5uqpmuHhX2tfZeZj3uxc5Kdj3mzZZZ0hJ5vnmaUUsiLWsJcn3liX61gdnSHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9rYGxoUFVHSTg9VlFaV1hJQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFNNjIwoZ2Spa+tpKq8raa1pae2u7yyur+3tbO5ubKktLShsbGin6ywpJemua2ksbCctLiqoKadoamksqisqaSanJqonpWUl5iSkqKnn5aSpaqwpqKWk62fpJGUoJukpp+Vm6amoZqin62aoJ6dkJWboZ6cppWdlpmin5WYlZGbhax7d6h2o46IhqlvrYqCp4OYmKGJkpqKon+TmYmuhX+Cs1xys1KufYOCpH9x1314hX6PnYaZmnevhoqRnIh4s2GaZZqBgpRsklqwWEuadZh5ZmCtXnZ3h2iYiGtdr3eVno94bDV5yK6yX0JTb15nYEVQbV9wbVZVTS5lY2hSWFE7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSTo5OZ+dlaC5sJe0wa2os6ipsrq3s7i/ubextLu0pLezn7Ssn5+orJ+Up7WrqLGxq620pJupoKCoobanpqmimZ2VpKGTkpuYkZSipZqSj6atr6aglZmpn6GNkaKZqKWglJmlqJ2cpJ6snaGdoI2UnpqdoZiZnJaXoaCTmJCmnoapfX2leKGPjoKqcK2LgaeGlp+hiZeXiKOCkYiUqnyAi515b7FaqIKCiKB5dNh/doh0qIGOm42So3yWkJ+Ee7JenGSgfoOVbJJcq1tak3+Rf2hnqmRye4FrmIdzXaxaiaCOa29lT0pDoVxbTHRdYmdNW2FecXNeSlY2SpuTWEhFPUdGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MyPzihnZqav6uXtMKurK2pprSwt7G1v7m5sbC1uqm6tJ+wpJ6lp6eek6qwqa+ptayqr6GYoaCmpaS6oqOroJebkaKglJOemZOXnp+PjYuosK+mnZabqKaei5Kkl6irp5SWqaeenqCjraShnqGNlaGYn6CSnZeclZ2hlZaPq5yPrm1ytHKpjHaKpnO0eHOzgJGko5KcjYmkh5B3uG+Me4uia2u2WqCFZZeXaaGip22TcrR0k5h/smqFkoita3WzYZ1mom+HkmqXXK1fTaF8h5FSc6NseX9+b5iHcVyvVjycd2VUb24uXKdPY1JrZWJtWmNcX296YlRaUT4+bW8zQ0JAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4pZqcnruhnLLArq6rq6e3qbivtcC1u6+uuLaqwbapqaCbpqSinZGqqae1o7Knr6qgl5ynoKSruJ2jrZuWmY+lo5WMnaCamJyfkZOUqrawp5mUnKyplYuTpZmlraKQlqqyo5+epquwmKGjj5milp+blpyXoZKcqZyUkKuZh9SSmrtzsMOAw4Z+1ZabuHiIkJiMmIqMp4h6o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZWBrKlxe391vIinoGmdYaaOr6F+jHSHqn2+bnO8dLKDdXiBi26aiHFujaR0vV53fVthebxrWlZbanpeamFlZ2Fsd25ZW1lDQUByQENHKzVHIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaebnqK8oZexw7Ctqqussae4r7bEsbmxrbqvrsCxq6SinqOhnJuQqaOqsqS1pq2lnpaZqpmmrLmdo66YlKCQpZ+SjJyjnZedm5GVkq65sqyVl6Onp5OQlqScpKyekKCoq5+bn6ijs56jpY6nopSimpyYlaOYj7CgkpSpnoWQmbWAkJGMt5V4gpOatXdta25zb3mPhI6JdJ7Bu72ae4GyqHCAdJG5g3yGhoyGjXuKh42XfKS7ub2cdXq0o3R2l3V0sHWZnmaGaY21dHJwd7aMXoB6fYpog3lteWOLrHB1hX9aW6dqRWRZU2ZgY15jUWdmcGx1Qk1QTEQ6Wk0/SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JXOCpPXl09KzpWVic+OzynnqChv6WWtMK0rKuorKupuq6wxa60sq63p7S4ramioaWeoJ2Zk6ukraqmtainn5uWoKOdrKS+pqGql5SckKGakY+hqKGTnZiTl5SxtbetmJ2kpKKKkpKmm6Wqm5appaWcmqGopqajqaGRrZ6Wo56Xl5edno+wqJSbp6GOan5pnKZ4h3J9mo50emSHe72+wLpvkoJxlYdhc2paXpuKYWOIjpVrYICVZG2dd2KVa4CalZRlXmFjcZqKaXKMfYWVZ2p+cnR4fX5iW3d0gWhQXG6EfXyLa1hseoJzSkpvhnBNdU1FV15mYEtaV2djX09bbXVpclJPREVOO0hIPUw/Mi0yQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF9MKDM9W08nPzI+qKCoocKjmrS5taOspa6np7Wxq8irsLKrtKO+sbKmoKKonKKbmZmspq+kpLWppZuXlaGbpq2ovqeoppWTm5WfmZKXpKmokJ2Rj5icr7K/rJunnqeiiJORqZqoo5qbrKCjmpqjp6yin6uimrGblaegl5Wdn52XsaSXoaiZnJGdnKKkmKaimpyampmPlYFnbn1xd5KXlJGFi7WqjYaYlY6KjJiXh5SVioSSlJGJjpKUmJSYl5qgopqclKGejYJ6pIZsanyQfIB1iYqBcYJ4eXZ2i4B8imtzgXSDdWV2fXdrcHttYGNdcGdMWFpmamBXWm95bW1mU09GUzlPWU1STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLOhs6G/oaSxsregqqayp6WwtKrIq6ywpbWmwKe0oJ2kpJyjlZWgqqeso6O2q5+Zlpafl62qpcGeq6SVkpyXnZeSk6KfnqKnk5GZqKeyxK+aq52qn5CWlqidqpucoKyYoZucoqSvpqGlqJ+umJennZmaoJ6enK+gnKGmlZeSmJOgoZWjnpegjpaTioqNjpeukHyVm4KSgouqqIaBmZeKhI+fiHuEkIeGmpKIhoqVj5uXjZGYnqOWmpORno1/jmahs6+FioR2e5CKfHZ5em9mepGBgIlrdYF5iHNpc396dYOHgmt1ZHlmYGllY2Rma1lse29palxSTFBEX1RFQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvv6yrrrKxoKumsa2irLOwxLCqq6OzrryjtJufpqKhnJmXp6WppqSlsrSelZSdmZmwpa6+oKuikJGdmpmUkZSinJeonISeqquis8izn6qkqpaWl5qnnaian6Srk56fnaCpr6mlo6uirpufoKGYpJ6cn52vo5ieqJOXlpyRpJiXqJ2al2WCknxlfo2akGR5jWxoa3uSpKpqZZqYfmeGimVlaWh7jqGPa2iNl5Gjd2tqi5mjnplzbG57hI2HelhlXoaCXmyLiYB2XGhzd3eSgIeCbniCeIBzbXmEdHeJiI6EfGqGWV5rdGRdc4lpa3xxa2NeUU1XSmRYQUo0PUY3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvrLOxqqWora2wpq2tsbyxqaekra+wn62XoKOdopmZpqucraOlqKmyrZ6Vo4+ir6a2uaWuo46OmqGZk5KaoJmZpZV7pa2iqLTEuKSip6+enZSeop6jnKOpqJKeoZ2gqrCqq6SqoKqbp5+ooKyWoZulsKSXm6qVoJ2akqWXnqqYnn69g4hytHKEnYataHi5xLhxk6KjeqaZmXOqgnzLwMC7cYyiiIKffZaYiZ3AvYKXnZ2NncLBfIJ8ko2aw8B9a6Wyb4yBb8p6f5t3kYOOgXZ6gYB5cXp/h3F4hY2TeW54lGNmX3lkYGWCY150Z2xkYldLVUlRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlEvI0ZbM1BZL1VBQjsvOJajucO0sLDAqaiUo6+psK6tprO0r6mlpqaxq5+rmJqin5yaqqeinayjpaikpLSknaKSpq2ruLOnr6KRkZmdpZKQn6GYm5+dh6espKutwMCxoKmvqZeRnp2hmaKjqqOToKGdnq2uqayno6Onoaalna2pkqSaqK2pm5ypnKyglpallaGil5x/zpR4eqSBeZWWm1+uj16Op4GioHynlpt0q4OAr15jjap7p4eFoHSXk4izY4KrhqGNjbNqha90fZeIt2GDrVmizW6QdXvae3+ZcH6IknZ+ZXuIdnZrfIhvfYWRkX5tg5BgcmxwaGBfeWRccWhqY2ZfUVRSV11LT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1LMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaSqqK20q6ayrKyrpKumsKqgp5uZpZecoq+foJ6op6OmoZ+wrJqdlaatrLGqqKyglJKbn6SSj56lmJ2no56upKuwqL/Hs6ipsa6Wkp2boZefqaqflaCfnZ2usKerqZynqKSiq5Oss5eloqqqnaOmpaGwoJKZppmgmpSUkZegcYWMl3SEqIdxsXydcax+oZ6BpY+ed6qCfa1/nHOtfquHhp92mJJ7fJd+qoiijJGMnX6re4mUkJ+Ae61WnMR6j2+SwX2BlW11b4xtZXZlhm9hd25yb4mKko+DbZKQZnB1dXFhZ21lX29paW5nY1dTXGFZUlNDOElJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNTGxrK0oJyjjqOjoqyvtq+osaaoqqetq6unoqOdmaKVoKWrn6KloKioop+dsKyXmpeopq6sqKapnpeUmqOhkZOgrZudpqOvrKOstaq5zbKtpq2slpWcnaKYnq6snZagmZ6fqrKpqqqbrKuko6ybr7GiqKuupZimqqmpsaKSlqOkmpSShaRqpHWJeql0erJwgqaKmYxxiKCah6RgYVKrhH+ug5t2rYGmhoafepmXhntmgKOJpJmGgqR9qX+ClYeuX32pVZ2ikoF6op+Ae8OvxYtyr7OzuXFiqa/CdGiMjJiOgW2alHBueXh5cG1mZWVxcGZ8aWJdV2BpWFhVTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8PJ1tW/oZmrp6Gvop6wtLCvqa2ip6aqq6uppKagm6Senaanp6OcrJqirKGkn6+inJuTqqO1sK+gqZudlpSmopCaoqigoKWcsKakqLGstsiytaqrqZWRnZyimJ+ls52aoJSdn6esrKSumq2ro6OqorOuoqqzsaGaqaiur7aikpWip5ibkXyqbJ6Eh3WreXywb4Kki4mflpaflIHSuLS4yYCBsl9glKmDo4iHoHqYlpp4qsl0maSVqKqRk5qMgJyKmsbHeGahgqVzgZ+Ogn2vXXC0YrB1S6OGbadHgpNkjpCeknxxl5OAcXt1fnxuW2ZqcnBlgWpfYVhkbVxeWUlOTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2ps62spaKcsrmsqqGmmqilqquqp6CmpZiqo5+vq52moKyanqmlnae1n6KXk6iptbKsnKWcoJSPpayRmZuno6Cppq6hpKepsLTCsbOqraiTiZedpJqho66mmKGVmZympqybsJ2uqaeerKS3rKCxua+dm66nsrOzpJOXp6KZn46CnU54moF/n3qDo32DpISGpp6cnpOEuHt8ebmCfszGwrZ4m6GQi59+mpaXinaemIqlmKSpf7CFnYWfhKx9mpRipWykcI+FkIF9loJyrGCjc3GAmmC8fVJVdI6So5Z7fpOSjHZ7c4V/cVxtbnhyaoFvW2RfaG5iZF1LTFFUQUlIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDg4Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7mqr6Cboayzs6WfoJWlrq2uqqedpqaao6ehs66iqaeyoJmppJSitaKilZehqLS5o5uinaKTj6GxmJ6bp6Whoq+unaSooraww7Gtqa2pkYeQnKecoqScpZeemJmapqSpmq+hr6WmmK+lvK2htretnZ21sriws6aXna+go52Fj9G1w7d5h46FkZOQgaZ4lKF3jKCRhKWBinGqhoS0bnJqmaOclYqefJiZhoePc6+CpZuijqaLk52KlZCbbXCyXKVzk3qcbJl/e5l8balho3Fxf59ic7K4aHePlKaYfYyNlI55fXmPgm1peGl5cm6AdV1lZG5tZmdgSltYWDxIR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZNzjYqtv7+8urSelqelrbWhopmVo6inrqusmaain6agoLWno6mnsaOUrKOOpK2jnZCamqiztKSdpJypkZSXrZ+fnaeknaectZqhqqS2qsKwqaupoYyEjpyhoKajlZqanJibmaelppisqK6jpZutpr6slL2wrJ+isLK5q7Smmqixo6eXeqiQfXywd4qApKWInG2yb6CHrXyhjoOolZiArImEroWflKqhoZeGn4CZlYB7kn6rgJ2al4ureJ2fkYqUkoF6r12jgX2mp2SdgHyXc2qvXaVrcIWZXWBbjKBtlZGmmYKVjpiOfHuEmH9rbX9jfnRugHpgZ2VxbmhnZ0NaYVs+S1QzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pYU1BPTkk4MDUyLiosQVRWVlZUVFVVVVVUVFVUU1RWV1dYVlVVUUhGSUojKCi9k5qDqcbCtsG0n5qsoK64paOOm6Sjn7Cvqp+kn52tmZ65oKOroK+pmq6hkKuopJaJmo+usaymnqaaq5aXjqyhoZ2loZqknK2YoKimtqi/r6WppJ+LgI2bmp+mnpKUmpqUmpqmpaWbqqyspKWfqqi+pJbDrKqioauyuaqupp+zrqipmHavfpCLnIWHfbquiphlsIxlla19oY+DppWagayKhLCFppmkoaGRhaBbbGqBs2B/rXt7goGxbWdvmZiMiLFbfbRcpINryKJkn4B7vFh2tVqyfVKugHqsWIChbpiQqJuLl5GYmHx6j51+ZHR+YoR4dIB8YWpncW1mZWVPVWRcQlVfPkooPjk9NCEiLCUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUVJUV1peYF9gYWJeX1xbWFVQTkpGQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWlxcWFdXR0I70p+zsre9urPBs6ObrKaltqigi5qgn5yzs6mfo6CetZigtKiqrJ6vrZ6sm5WvqKKOiJuOr6yop6GmmK2RmI6omqGepJ+Zo6OlmZ+jqrKou6+kqJ6cjn2Lm5ahoJmPkZqbkpqYqaCimqmuqKamo6Wpu56gxqakqKGrtLWsrqaeu6ysrJWAqZKjr46bgIekl5iQgYC4w7qDjpyThKeWnIKsioKviKabm6WqkX7VvcKqYqO/vX1+o4KD17q4tYWUk4Oevb6Ea6OBb6uEbJx/erKwx4Nqq7C9rHh3or68c4GWjqeckJuRmJ57gpKbemN9e2SOZ3mCe2BsZWtqYlBhWlNqXEBVYUJOKj06NC8eHyQeJTIgHSQoMDQ5NjY3ODo+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz88QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVtLSxv7myvbKina6mpbKmnYyYpb+quLKoob+mp7KcnrGcuqifra+mppSUsKyXjIObka6loqygo5uonpeKo5KmnqecmqGoopmeoaytqLitqKObl5J7h5mSppuTjpGYmI+Yk6mboZmqqaGqp6GjqrueqMSioK6jqrO0qq+on7qnrq6ac3WqpLeGZImgcGetj4qPbW93pJCZn4F1rpiUcI+LcZWoo5uXrqRybW1sZot4b26CmXGBempxaWeJlpaYcmlphIdncIZkXYhiam9ZXWd+d6ZfYXGOkW5lZX+Nk4+imJmZkZigfoiQlXZmh3hpjmt5f3lkbGNmbGJLZFhKbFo6UWVFUidLOisjHCAbIiwpGBsYLTIuNTo0NTc5PD9BQkRFSEtMTU9RU1ZdV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16pla2zqbm4srOqqaGunqOyqZiSvrLEyb62qp7ArKyjoaisoLqjpK6sraaNl66pkIyFlZatnqaqoJ2jop6QiqSSp5momZajqqCWnKamp6+6q6yam5KSe4SWjaWYjZGRmJSNl5WolZ+YqqSbsaaeoqu5n6/Ap6Sypaywsaqtq6a3oq23loqgqKW2nYmWo5mHqZqQlJ2SqbKZmqOroLGWoqCdoKKcoKWhlaunjZOSjIeTnJyVkJqTmJGOlYWBpJmXlo6Lk5OLj4aEfWeJfnSCdnSHi3GnbHqUkZOSgYGNkJCPnZWhlpqYo4OJlo1yaZB3cYt4d3x6amxkY29kVWBYQGlbSGNhT1orRj0rJyE3NDAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFVWWV5gYWNdXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgppapqqS0tq6uorCjrZ+gtbGQjqzHvcW7uauipp6bpp+xqKO2p52ptKeokZisoouHiY+bqJWspJ+Ypp2dkZSjl6iaqJmUpqGjkJqnmaG1u6irmJmPjXuBlIyhlIqVkZWQkJOXpZCfm6qgnLajnqert6euwa6jtqavr7CsqamyuKCuvJmRpaSmtqKSnqefjamfjZKfo6yvmqCjsKivl6OgnKOqnp6dnJarnZKZoZuUkJaqmY2ZmZaQlp6RiaCdlZSFkoyQjZSLgH1mi4V1hnV5iINznGqFkJSTkIl8i5aSkpeUopOemKOFiZmIe3KWc3qLf3J8f2pvZF5wamFbX1htY1BgZFBaOkdHRT4yPT04LysmKykmHSY0MTY2Njg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYGVVUEpBQ0I6OUVNVlteXltaXFtbW1xdXV9fXV5fX2FhYmFhYWBiYmJkYlxbY5eVpKijr7KsrqOppq2gp7WqkJCdpbS8r62toqOaep2isaSlsamXnLimo5SZqpyOhoqJnKOQrp6ilaeeoJGWmJuui6mWj6iZqIyYqY+fubakpZiajIh5gpSMm5OKlZKUkI2Sl6KNnp+pnp+4o4CEr7Wir691pL2jsp93eaCqsbqUdayknomAqn9kXGJ2oI6knoSXfW6Ts5yjp62qo2Wdn5JzeZmWcICYqJdsf6KoimWcpZyRl5iWjJKckYadmpCVg5KHj4+SiYR3ao6GdoZwe4aBgGFph4qUkotadZSQaGiPj3N7ppqaZnuah4N4mGqEi4NveYBrcWVfdnBsa2hbZmViYnBTXD5OTk5TRz5AVEQ5MS8eHyY0OjMxNjY3ODw7PkBBQUZIQkdGSUtNVFRVWV1gaGZnV1FKPERHPDhVUltgYWJgXmBfYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaajoK+wrKuppamuo6atpJKWq7awsqebq6asl3SMna+fqKunlJe5n6CPnKSdkX+JiZuejKuZopSmoJyNlpGehHWtjoimmqmRl6SIm7qzp6CZl4qJdXeTjZaTipSRkJSMkJOgj5uhp5mcspaAjJu1nbOMko+7p6B+p6J6oq62gI6Opp6Di4aQsaqvjIqWo5p5gIushpydoaepp4eVhZh3pZt6h5uBl6eCgnucsnqKhqCXmZSYloKRl5aEmplieYeQhI6PkYqDbXCOh3mAcICBhX+GdIaElZF4lmeSdKCadH2ZhKKeiJh/k4qEhJlrjo6FbHh7cXFnZHhvamxqWmVramV0XF9JVExRQEU1LlpUVTcpITA5PT43NDM1Njg7Oj0+PkBEST9KRUpLR1NYW1lbYWFpZllRSDlFSzw+YVZeYmRmZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJejn6atrquorKCosaamqaWZlK7IvrGil6eptZ6PhJ2snKeioI2Qvp6ajZ+aoJB8ho6Yl4eqm6CUnp+RjZOJhn+Qp4yGop2klJiehp65sKedm5OOhXB1kImVkIqUkI+bjJCSn5KXoaWWnquHn7SJtJqtisqHqq2It4WMr4KvrIKpjaWYjZ19qI9ye3ecj6eWaJWkebSMn56mqJKYwoF/q4iYoXKegJqlfZeFlbGAoX2hk6CQmJeBjpObipiRi3yFkoaNlZKJg21ykIV/eXGGgYR8hHWEgZaAj8Vmf6mHj6NrnoOjnISagI2OhoqZcY6ThWh3dHx3aGh1cWhoa11jcG1nbVhnR11STTJENDZOYWM3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TklKTENQWl1cV2Feam1cUUU9TE1ASmRYXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSXop+wp6mppqugpLiwqaqmmpSgo6SrpJelqrejr4Chp5ylnp2JlL2Zk42hkp6PeYSWlpCGqpiZmpmghI+Md5qbjp6Ph56knJaamIaiuKykmpyMjH5ibY+Lk5CNkI2NmIyRkqCPlKGhmaGnfqGnh62doJatj56cnZGFgKCNqq2Fo42pmYyaf6N1gJmUa4KsdU2reIeNnJGbqKeAqat9g6F7eqdpnn+Sa2eXhpe2iZ5+bmBkWYOXf4x7ZGiLcpl9eZVsXXyWbV9TcINcX2t5g2BZZYJ9g4CXcKeqa4OjbnKlcJ+FoGpmoGxbbot8Zlpgg39iV1Bvd2ZtdHJram9danBtbGlYaU9eWEY5QTRHRF5rNCxJQ1JNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deXmN2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlp2guKCqpKaskaG1vKuuopmYoKKlrK6hna61o6iSoaCfppuajpm0mZCLn4yVi3WBlJKMiqaVk5ednX6ShYWro4eaj4qYqZmam5GHpbCmoZWaiImAaW6IiIuPjoqLjZKMkJKjjJSfoJyhpH+TgY+joZSgd5yWj6eDoad/hqirg6V4inyEmn6icHOUiJZ7nox5bYebjJmQm6iaj4ede4Kic3amZp5+d6RfmHp9knOibpi3tLp0k4eCf7WoZIHGuHtwlbeLcYCapGJzrKtgfWmds35ufIaCjYKLmHF/o2xyo3SfhYGkYJ2YspVxfJefs3RzW56yg2pib3R2cWlvWGpscnJmXWleY0xEPUQ2UUFZcTM9U0dfSlI9PDM5NTo6NkQ7O0BKUD9VTU5RQEVfXltaWGBgfGRIQzhMV1VWY2FaZWZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7iZq5yToI2kt7WuraCaop2jo6aunJuyrq2TmKGZoaSZmpSfq5uLiJJ4i4VxgJaNio+hj5GTnZh9kImNqKCHmI6KkaOUnJuMi6iopZ6Pl4eEfmt7h359j42Di5CRiZCUoIOXnqCdoJ6LiXecmKKMn3Khi4eoiJulj5WmqX2tjH56oJl6o5N4gXSWiI2cfZWfhpuOmZumhqJkoXyIlpCbjWyeaJqNbpqZe4CLp31yaHSrg56DdKpolZpdm4V2hJ1oqmqAuGZcqHCBnGCVjF6ndnWHiX6eaJp1hpOSl46An2+akG2nmVyofni7an2pW46EXbNnXG5yenhraVxwanh5Y2BmWGJCUUZPN1ZDUm81S1paX09aREAxNTE7OzZIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TltdWWVmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq1m6eIY5Sbq7qysayeppycqZ+erpuesamsnZekmqGfmJaWoaSZhomNaoiAcnuXiIuWloSQk5iPeoqElaOcipSPhouekp2diY6oo6CajJGKgIBpgIZ4f5eMe4mOjoiPlpt/lKKfoKGTmHJon4qfj4xwkoyBqYeYnqGmnqZ7sK2joriXd6OzoqSAiJR5nXuqmn+ijp2bl4iXcaF8hY2vtX1rmpGheH6YtKOjq6iEmXybfZ2af3SqWl1ve5aLeJ5iTH56eoVjeZdCTJ5ZompyfI5tgIiEmXWbeIaJsbN/gJuTp3eCnW1yfZRvmXJqo12VdkhlZGFzcX5+bmZgbGl2e2RlYlJfV11VV0BaRVFoRFNXXGJYXklEPUI4P0I6SUY4TEVYQVdSW1ZERmJcWmBLYG1+ckVDPFVfYlpmalZnaG1vYmZnXmFhXF1eYWhiX2VjdmxeZWdma2RmbGloa2mTnIGwrZmEU16gprO5s7OpmqKMnKucnKmUoayloqiPn56dmpmWmKGdloiHiXeGgW95lYWQm4t8kJGWiHJ/iJKgm3ORkIGImZWhm4WNqJyalYuLinyDbISFcYGhjHiGjYiHk5mWfJOjoJ6jiK2GfbWEjp6ce6WWeqmBlZyPiZ+bfKdod21+mXShc3F8noaZcJODrn2kg6aemYCjb16oZ3WiY2+lYZzTkHx7mXhyc2OihpB+o3Okj3ZrkLOMYIKYiXOqsqi8f3eDbX6+pqm0XpxufXGXbn9yonJdpGdzpmFopm2b1Jp9hZtveHqXa5t7d5dzbqmkZ2FleXGAhGtnZmRudXdnYGNTXGZRUWJJV0pUYVdTW2VqXGVRRkNLTUpLQktFOE9AUU5YU1lPU1FhZmVqUmN3eXdJRkVjXWVaaGpUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5t/sKtUXEt+qa+xtLCzo5uZhZmpoKGkjqWooJipipqYmJOZk5KgmI6HhntwfYRofY+DlJqBd4+MjohvfoWPkpJsl5N8iZGSpJaDjqqak5KLhYl6g3aHgG6Bn4Z3gJOHiJmil3uUo6San4mzoaK2i3qsp6SupXCogJqQhYCbkXukgKKZhphynoSjrq+Kl4x/jKSNlYOtoZR2tLW1yaFzlIqBnmCdl6lteZWGoJt1oYd3oH6Sl4uBb0xmo5Jwm4dzpHt6dGGDgWt+oGtxZF+ccX10l2l6abO1tMamc5h+ep1rnJurdYSbbXV4mGmae3WYclBFfbReanZreYhmamhidHVwblZeVFlpUFNpSlZMWVRWXWhrblZoV05LQUpNS0hKT0FRS1BlY2ptZXVzc395fG51iXt7VFBObF5oW2tpUmpoaWxnbGZjZWBcXVxeaWJkaWt7X11kaGNqZm9sZWlsZaGciK+mhGY/lKGzq6+vtqKikICYqqKjpYymp52dpoKbl5aOl5CPnJOOiIN5anmHZYOMf5egeXWNh4uAZ4OFkYOMhZ2NeoyLlaaTg5epmIyRi4GJeoB9i3lwkKGGeYGWiImWoJV/lKWnnJaWhGZueJxsomR8caV3m5hwZ6aAlot7pHqfloOXcp52gYqUlo+5bpCKomJ9maGViG1yaaprdaBtbqZfmmmLkGiWh5qVdaKAfZpgjIaNdW+IYmigZZ5+aZt1b2NmiIJtcqJaX1tioW1diYxue35zcmSlbXeiZGenaJlzjJlvom9TiZBvoF9mqFSLXlSYbm1za3KCbXBpa3lza29SWVdXZ1pUbUpZT11JWGlpc2pZa1ZRUkVWXExYU2FVaWtfd3R7fXB9fHKDe39zdo2AhHZeUXJiZ2JwZ1BqaGhrbG5oZGdfXV5dYGtjaml2dV1cY2ljampzbGZrbWOcpJimemV0bYunrqSpsLGmn4uAmKudn6aNo6GboqKAlpmTjpqPi5iQjop7hnGAiGiLi3yYm3N0iHyPemOBhpSJiZWZgnyIh5aokYGirJGGkIqCin6AgI5zaY+lhH2GlI6JmKCOiJOqpp2JpniVm36liJaMspiekIKvl5+ld5SHeal0pY+Emm6kooyShIyDu259pa+DhoaGk5Wcn3ylenKolaCWZp5+b6tjloqVkniobKmigYl2iIN3qpGmh2qRsGt2s4ypa4qGbW2fnpKVYH6ri6p2fn+MpZ52n32EpJWdoGqbiHesZ5+tjLZ0d76NpJNZg6aNq2F1cnRxfHRxY2p+bmhsU1dbVmFiXWtNXVJdSl5tbnZgW3FZXGBbZnRlbm9xYnF0YHd6fnlyeYNzhH+Be3uMgYKAdmJ4ZGNtc2RSa2dob2xyamZpYWBeXGJrYm1sem9cXGJpYmxqd21nbG5ilaWqnYGAnqSWqaqdqKeupJmJg5irmp+lipulnamdhYyaj4eckYWSjYyNdIZ6iIRwjYR+mJN0dIVykoNsf4uRh4aTj317goWYpo5/paaOgY6JhZV2goeSb2yLqYCDi5SOiZyfiYyUqqOgj4B1lJeIfoF5lK6jf4GbcY+FeI+Kg357cqeMcX19epeWm4SOeHt+foeUlZOKdpCYn6CDe32Ja4yFW3l5cnpwaG5+kolxf3WBj5STcYaEgmWMf16Bf4t3dXOUdW95bm6HbYSFXnZoeI5lgICFjambfXR8lmqJiHCBdn2Gdm1tZ4xzeXuYeIVca1h5j2lueHJyb3h4cF1shm5pZlZbYFdcZmtkVmJVX1FfcHh4bGt2Zmpra3Z9cXJ0c2FvdWJ0e4F4dXqDdYCBf4F5i4WDfXttf2xkeG5eV25naHVreGppamVcYFpjamZscXVuWltibGRsbHluaGxvYY2UuKimi6GimqakmaWcq6OhhISYrJKeoYmbp5qpmIOBm4t/lpOHjoqJjXKDfI99fo+Fe5eOc3KDcJWFe32Si4aGkIV4fYCGmaSOfKehi4aQkIWWg4aOmHdyhamFjpGdkIienoiMm6ifoKqDiY6Vmn5+iZatqI+Spo93b5yQgnmRb36ohXB9lXFrcH2Bn4x/k46MaG1dg4uMnJuejnOVi4hxdGuCdnSBWXJuhpGBfX6Mal1qZHuFhImAYGl4ept7gouCdYGFgmd3ioZrYXBxgXZecoqBiI+mlYVljI+DbneLhHGGj3pwZmdle4N6lltcamdudlt7eXh1bnNzgmZcbYpra2FZWl9aWWxxXF9hWl9dZnR+enRwdGNra2t8fXN7eHRkbXVobXx+dnp8e3p6gIB+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hsa3FybVdbZW5sZ3N5b2hqbWCLi6qwoZCjoZqenpiemaijo36Dma2NoJWInKKRpZV/e5iFfZKZiYiGh4pzfYGMdoWLgYSWinFvgHKYhoR+koOEhoqBeoCDi5ugkIKnoYd4jpiJlYuLnJeEg3qsgpGXmZSKnp2HiKGrn6Kio4uIk5uco5mWqqGnpqCSm4eVjXt3jY6Ep35/kpGSk5yyppuVnpCNspOXhKWMjJWbn4mQm4KIkYprfI53eGWChpCLfImdhIeLkIiIgISEkHd8eXSZoYiGiZ6KhJR+fYqAgHVvc4SCfneGhoqPppCDhY2Hg42QjH2IjIqRg3dsgoR9eplqcmhhdIpwfXp3d3B3dIFdXm+GaG5eXlpdXVRoclZjXFxibGh1fHxzb3Bka2tpgHxueX9xanBwbGeBe3KCgHh/fX+Ee22CjIZ8enh8fXqDeU5kd2pybXB6ZWtlY2JgW3RmcGZycW1VXWx0bWl5enFnaWtkjIeduZ6WoqGYlZiZlZmkoZ58gJqrjp6Nhp+ci56WfXmUg3uOmYmGhISGbniAgHKBiH6JlIRta356l4eEg5B/gIaEhn2HhI6bnZKHq5+EcouQhpORi52RfY17qoSNkpiWj5yWh4abpp+imp2GgpKamZiQmqagpZ2dkJZ/j4l1fIeOhKV7fI6QkYaYqqKek52PjaqNkYCdjImTmp6Cjpd+ho6Db3iGcnVhf4OPhnWLmIGDj4KGhX6FhJRueXV0kqKKi4WahISMc3+IfHxycnuHg3p4io6DkqaPhYOOgYOKiYp3homKjH1vbH6BfG5obG1oX3p/aH17dnV2dXt3XF9wfW50X2NbXV5RZ25UZVteYmtpdnp+cWxtZGtqZ4GAbHOBbGx1b3lwhXluh4B2goB+hXZxgo2Ifnt7fH97gopgaXtqdWhpgmRqY2BpXGR1aG9idG1sVWNxeWVwentzZWptbIuJnreaoaOfkpGWmIuan5+ee3iep5Gbioakk4uYmXl6jYV8iZGDjIKCgm57f3hzgYV9i5F9a2h9gpiJgIeNfH6GhId9j4GQm5uRiaicgHCMi4yTh6GiioWMfaiRiJCSmJSWk3iMo5+gnZaZf4CQmpiSjJqjoaSal5GafYyEeICDjoagf36MjI98mKSiopOZkI+mjI6AmpGJk5ebfpOSfoeOgXR0gnB2YH6AjYZxipV8iIxxjH+ChYaOaHdxeIuYkY9+l32HinKBhnt8cXh6ioR6eZCLgpWlk4uFkHuGhoeFdoKEiYh7ZnJ8f3l7cWxqZl9+c2h8dXZ0fXOAal5gc3Zwd2RjWV9eUmtpVGRZX2FoanZ5gXFma2RsaGWAgWttfmhvcWx+eId6a4yBc4GBfoF0doKNhn98en+BfX+PanKCbXNpYodobGJfcVZ0b21uYHhobVdqdHZjdXp7cmJqb3mJjZ6ykqWlnI6QmI+GnaCbnXx2paGOl3+MooqImpZ4e4aHfoOJf4iCgX9xf3t0doKFfoqReGdjfYaXioGJjHl9gI2DeZaBlZiWjZagm35wjIKRlIamm4eMiYOmlYWTi5eYk5J3kZ2goJeTlnl+jpiXjpaanaSdmJKUmniOhIJ3hJaNnX6BiY2Mcpejn6KTmY6PoYuKgpaYg5KWmX6YjHyIjYB2cX1uemSAfIqFcIaTf5CCbIeCgYCJhGV1b3uGkpeMfJN3ioh7f4V8e3F+d4iFeYSPiYqXopWBg4t2iISCgnd8goqGd2B5eH10f3hnbGVhf2lqd3N0dn1xfGJjYXNudXJtYVphXltsZVJjWGFhaWx2eYZxY2pjbWVofYNsaHVobHBpgH2CeW2QhnGAhIN/dHyDjIGAfnqCg358kG12iHN0bmWKbGpiY3VWhGlxbmB4Z2xianZwZnl8enFfcWyGhY+crpemqJ6NjZeHhp+Tl5l9eKqcipl6lpyLjJiQeXyBjH58g3yAgoF4dHl6dH2AhH+Ji4BkXn2LlYd+hIZ1fX6Kf32YhJeUl4ykoph/c4d7lJKKp4+MjoqToZKDkZCVmJGLgY+Yn5qSj5Bzf42SlImdnZ6mmJiNlZVyjI2Ja4WXj5l6h4iQiW+Xnpukk5WKjZ6LhoGSnH+SkpWHmYh8iomBeXF6a3VsfH6Lfm2FkoKUeHCCg31+in9kcml7gJaXhH6Nc4+Ig3iGfXZ3f3yFgHyCjISMlKSPeISCdImHfYB0doGJhG9he3V6cX1vYm9jZHtibm92c3h3c3RhdWBvbHVtb1xcX15ea15QXVhjYmltdHuIa19qZmpjaHeIbmZsaGpsaIF9e3dukIhzgYSEfXSBhol7g316gYR9fY5yeop4eG5sh2poX2lyYodocW9ldmdubGF5aWt9e3hwYXdti4CZmaqgo6idioqRhouei5WYfneumY2XfZ6TkJaUiHd+e4p9e4B2eH+AcHR0e2+FfYGAin98YVt+j5KGf4ODc3qAh3qPkoiSkZyTpZyVgn2CfY6LkqSJjoqNmJuNhpGYk5aPioiMkp2Tj4uMboOPj5GInpmioZeWiZaQbYeYg2aFmI6TeoiEkIpwlZqUo5KSiYuZjIJ/kJ59ko+SjJmOe4qEh3NydWtwbnV7i3RuhpCOknF1gHuAgId7ZHBseH2Zk32EiHSQioBzh3luf32AhXuFi4iEjJWojHqHfH6LhXd+cXCBhoRkaXl0dXB8Yl9wYWt0XnBqe3l5bHNwZXhdbmxzbXJZWl9fYmtaUFdYZWNncXF+h2ZdaWhnYmdxjW5kaWdkaWiBend1b46FdIGCg3t1goiFeIV8eIOFeoCJd3+Le3pyeINqa19waHSAanJvbXFnb2xlfGNugHp3cWx3d4p+opehqKCmm4eMioKQnYeTnXWBqpWTjoegjJWTkIB0fHaFeHl/cnN7hWtycHptinaAgYducVtYfpGNiH9/f3d1gYB/oIaRi5KdmKGVmHiKgIGNiZyeio+GkpiWhYmVmY+Wi4uNjY2dio2Pg22Ji5CQip2WoZyYlYWYh2mDooJmhZ2KkH6Lg4uBd5OYkp+RkImJlY1/fo+YfJGNj42akXyKgIJudXBsbW9we4Vpc4OOmIpxd4B0gYeCeGZybnWBmY57iIR6k5F5dodzb4h7hYt6ioWCiI6bo4d7g3WCi393eW5sgYSCXnN0cnBweVpecGBwal5vanx7cW1tamx2YHBvanFtWlhhYWJuWFFUWmZnY3ZvhIJiXWttZGJma5JuYGZmX2drgXVyc3CLgHV/g4B4dYCLgHmFf3eHhneDhXyHjH97dop/anFjfGOGfG5xbHRqaG9sdnhfcX95fHR1dICCfqSVmq2eppaFjYR/l5SDkKB1i6CUk4aLmoyVjot6cnh0gnByhXNxdYhrb211bYh2g36AbW5VUYGrlYeCd393c4N6gqCCkoKTk5ick5p4knuDjZOkmpOOiZWZkoWHl5mMlIuJj4+InoSPinxyi4WJjoicmp+blpR/k31nhJuGZ4Wgh5GDkYKJcYORmJCbjo+MjI+NeHuSkHqOi4ySlox8iHyAa3ZqbmtsbHt+YXp+jpaCd3qAd4KMfHlnc2xzh5WKfoiGe5OPcXmDb3aMeomLeoh9gYuQnp2EfHt3got9dnBqbIKDemF4cG5scnRWXm9icmBfbG55cWhwZmdzdGhwa2F3ZV1WZmBgclNRTlxmZV55cIh8X1xocmJiZWaSal9oZFtncH5wa3F0in12fIWAdHV+jHl7hoF4iINzhoV+jY2EfHmVeGZyaoNgiH1vb2t6YGpudH91X3R9eYZ4dHOFfHigj5mwnKWOgop/g5qHgIyef4ualI+FiJiOjo+Ed3R2c4Bwb4VzcHGDb2ppdm6Dbn19bXVzUk2C38iS1pN8cHWDdoSgg5N3lZKZnJGZe5RzhZCfoZOTkoqSm5SGfpaWiY2NiJGMiJx+joB3eox+iIyKnJydm5WTeYx1ZoiRhmyIooSRiJeChWOMkZmPlYqXi42Ki3F6lIh7joiKk5GJeYV8fmx7ZXJva2t5eVyAeZCOgHt9fn6FjXp6aHJqc4qPiYKFhHyUimt9fm5/i36LhnyEeYGOlJqainx2eIOQeHJsZ3GAhW5rdW9oanRtUl5vZHBZX2txd2dra2JmeHJvcGNfd2BgVmtfXnZQTkthZ2NdenCJdFxcZXZgYWVlj2NhZmJYaXNzbWpxdox9dHmGgnV2fotzgIZ/eol+comHgZGLiHx+mHZlc259ZYh+b3BrgFpsbnl5c2F2e3uNdnJ3ind5n4ubr5ugkIKFd4iVfn2KnYeGoJGPhYyYhJOOh4F0d3B5cW6Eb21ufnJkZXhwfW16fWpoa2OkmsHcru+hc2x2hHaFo4aSb5eRlqGWnIGScoWLo5eJjpaLkJ2Wg4GVkIWJj4CRiomWfod7dX+JeIaEjZybmJmOj3WJdW2FiIp9iqKDkImchIVei5OYjI+JjoqKhIlte5aBfYiFiZGPhnaFfX1rfWR4dWlueHNYiHqSh4V5foB/hIt+eGVyaX+JjomCgn+LloVrgXVth5CBj4R/gnl/j5WTmJB1c3eIjXVzcGd2eoRjdW5wYml2Z1FgcWdsVV9udHlhcmRfaH1wcm5aY3JhYlZuWVx4Tk1MZGdiXndziW1cXGR5XmBkZYVgY2NeWWpya25rcneMfnR3hIF4d3uJcYOEfX6Ie3SLiYeWhox/fpdzaHVxeW2Lem50cIBXcXp2eXFleHmHjGl2gIlyf5yHmaeco5KFfXCMlHh5i52EhaGNjnyWjYCaiIR7c3dwc2pvgWtpbXx1XmF4d3txdXtnYGR869q1ycPciHNsdIF3i5uJjmqZkJCelpSBiXGFiaCOhYuWi4yYlHyOk4iDiY97kIuFj4F/dniDhHKHgpObl5SXhox1hn5vhIGJhpihgpOLnoOJYYOUj4eKhomNh4GHan2UgH2DhImOjYJxhn5/cXdodnJpc3ZrWox8koOFfH+DgIOJgnVhc2uIgY+KgX5+kZB9bYFreIWOhZGDfIF8f5CSkJaIbnF5jIZ1bHBrc3mCYHVqbl1rdl9RZHFpZlNgcHZ0YHBgXWiCcXNpV2doYmlYbVZbdUxLTGZnX2Jyc4VpW1xleV5eZGd7YWRfXVlrbmZvaXN4in5zc4F+enZ6h3OFg3yAh3Z3ioaOmYGMgnuTdWx3dXl4k3RueHt8WHqGcYBvZ3l3koJkdoaFcYqWhZmhmaKKh3Nvk4tyd46cfouaiYl8n3+Emn+BeHJzbm9kcn5oZmx3eFtfeXt7cXGAaWBmYX/Vto6QpnhucXd8cZORjYdrmo+JnJOMhntph4uZhoGSkYaHmI58jY2BgYqNe4+NfYiEenR6g3txh4GWmo6TlIGIdIKFdYJ/ipKcnYWUjp9+iGF/k4iFiYSJjX+Ag2d9kYB+f4KMjpB+bYJ8gnRrbXd1dHZ1amKNgY9/hH18hH+EiH5vX3JwhHuOjIF8fpCIeXCDZnmCioaLgnuEfX+Tjo+ShG5veYx+dW1va2x7fmRpbGpZbnZaUmlyaWJRYnJ3bGJlXlpqg21zYltnX2RsX25VW3BOSE9nZVxnbnGAbFtbY3NgXGNsd2RlXV1aa2xibWp0d4Z/cXB/e310eIZ4hYJ9gId1eYmBkpZ8iYZ2iYFwd3l7hJNvbXyBd16Df3SBbWl6dJRzZ3OHfHKSkYOanpqfhoh2dpV+bXaUl36IkYSKjpp9jJp2fXZxb2xqYXV8ZmJpdXpaX3d8em1xf2VjZ2dXnY9ecXOWvMSEdnGUiZB+c5iMh5yUjYh0a4iPlYB7lIyBhJuMfIuGfXyJjH+UiHWJhXV2fYFxdYeCnpWGlY+CgnF+h3SDe4mXnJaGk42cgIhlfZKDgIaDiYlygn5nfYt7eX9/h4uPfWmAfYN2Zm95eHN2cmtqjYWKgYl+eIKAhIN/al5xd3p9jImFe4CPf35ygGh4goaKhIN4g3uAl4yPjH1ubHqJfXd0b2lofXdlXnJjWHBzU1Ruc2liTmd0eGZgXl1YboBvc1llYl1qbWBwT1lsUkRUaGFaa25te29aW15sY1pjcHZkZ1xdYGtqY2xpc3aBg3Fufnt/dHWDeoSCfIGFdn6JgZaReIOKdIGIc3l5f46Qb298gXFpgXl6fm1tfHaWa2p4hHRrlI2Fn5efmYWIbn2Mdmp4mI9/goqClZiKeo+Wb3pzcWxqZGB0emhfZXJ7WmFyfHlmcHphZGSOsbJ3SmJapNnQl3J7kYuReH+WjIWako2Gb2yGkpF6eZOHgYSZinyHf3h4iYqEloBviodxdH17anmGhKaRhJONg35tfYJ2gniFmpiTi5KPlIWHb3qShH6Dg4mDb4F4aICFeHJ/f4OKh3xlfX6DdWNwc4BoeHBudJiNhYKJenZ4gIR5gWpbcHxygIeEiX2FiHqIcoBtcIOGjYODcoN4gJiMjYR3bW5+hH93emVoan5yYVp4WllybU5YcnNmYEptdnRhXltbWXV9cm9XZ11manBfb05XaVI/WWdfW3BqZ3lxXFpZa2VZY3F5X2hdXmVsaGZsaXF3f4dvbX99gHVwgXuAgX+Cf3aBhYmXinGCjXF7hn16eoSUjHVqen9rb350f31vcnx7lHBvgH94ZpKKgqGYnJKChWeHhHBoepeJfn+FgpmKgXyNjWl4cmtsZl9hb3ltX2JveVxkbIN5YHB2X2Vl1eu+izI6PouOgHJ5hYiOjXaEmI1/k46Nf25shY2MdX2Pf4WClYl8g3hudoeFg5d3boiEbHV7dGZ5g4OojIOPjIN9bX90dYN5hZqPi4+RkoyLhn57kod5gISNg2yAc2l/fnhtfHuBioN4YnmEgXFkcWl+bXRxdIGbi4B/hH1zdX6Ac4BvW2t9dHiJgop7hn98iHh6cWyIgo6CiXGBeH+Viop+dG1qdoCAdXVcaWl4cVlXfVNacWVMW3NyZVtKcHdvXVtaWV10fnRoWWJbZ2VuYmlNV2ZRPV5mXV12Zl90cFtZVW9kWmVxeVpoXmBnbWdpbGlweH2ObGqChH95boB7fYB/gnp1goGMk4VwgItud36Be3uIk4l/aHt+a3R8coZ7c3d9f4x6eIR+fGuMjIObnZaMgYBsjX5raX+PjXt+f4OUgn99iohrdXFnaGNbYmdzb19hbHRhaHCJeWBzdF5jZJugkG5cNVmvtXVqgIl9koZ2hpiHdY+MindwbIWDh3R5iXiJfZOIen9zZ3aIfn2Xb3CGfWh3eW5leoiEpYeBh42Kfm5+dn6AfIuXhoGTkJeIi4SJfI+Jcnx9hXxpfm1rgHt6anp2goeAcmB3gX5xZHJndYJtdXuFlZGBfIF+b3d5fHR+bVdtfnZzioGGd4d1gYl6d3NuiYCOf4Nyfnx9koiIem5taW2CgXVuXWhmdHJSW3tOXHFcT1xyb2RWS3N4aldZWVphcYB0YF1dYGZkaGhmTlpoTkFhZFtgdmFcdW1YWFN0YVpkbnJXal5iaGtnbWxpcHd8k2xphIp9fXB+fnuBf4J6d4CAiYuEcnuHb3F3hH97io2Pg2p+e254eXeKd314gIKHf4N/fnpthYyImKONhIN7dox5a22EiZJ5fXuCkYCAfYqDcHFwY2ZeWWdfcHBgYGhwZmpvinRgc29bYWRpdnt/vpymo8i4coWDc5R9eIeUhHSRjYhyc3CEe4NzdYZ0iHeUiXl5cWN3hnmAk2lyhHVmd3ZjanyDiJ6CgH+Ojn1yfnODeX+QjoJ3lY2Uj4eCiHqJiW15eX51aHppbH95c2l6doCDfWhgd4d+ampzaHuAaXaBjJCUfnp9fXF7dnt0fWFVdXxyc4mDgnyCcIaKd3hwcIOCi318eH18dY2FgnZocWhsiIJycF1oY3RvS2V2TF5vVVRac21iUU90eGFSV1hcYXCCc1tgXGhlZGNqZFBbcUlEZGFcZHFeXHdoVVdWd15cZW5oVmxeYWpnZW9vaHB3e5NuaYiLeX5ze355goGCfHZ9g4iGg3B2g3Ntd4ODfomLlH9wgHx4eXqBi3SDeH+BgYKEeYB2b36Ji5ueiH2GeneHfGh0ho2Ren9/fImGhHaPgGdvbV9kXFhlWW1zYWBhcWxsaIltX3NpWV5kbYB3qdqqx4aHsnKKeHCNdXuHkIF6lIqAdXR1fneAcHF+bYV0lIZ4dWxgeoF5iI5mcYNvZ3VuW219gZCTgIF5kpJ9eHtthnV/j4qDc5WKkI6HhYV7f4VtdXZ/bmh3Zm18dm1qd3Z/f3xhYniGemh1dWN+e2d0ho6MlXt0gHVxgHp8bH9ZVnJ9b3SDhn9/eGuIhnN4a3V/g4J8eXx3e3KKgHxzZ3RlbYuEbXRba2B2Zkhub0xbY1hXVnhtYlBTdHZYUFVYXmBxhG9cYGJsZGNebmJUXXJHQ2ZfXWZoXlp7YlJWXHVbW2drYVZrX2FuZmZscWhwdniPdGuOjXV/dnh9d4GDgXt0fYOIiINvcYB1cXV+hoKJjYp7d394hHx9hYd4h3x9gX6EgHt+c3Z5jI6fjIl6iXd1g3lefoaajXmHg3SGhoR3iXtibmxbYltbYVZqdGNgW2hvcGeHcWBxZlddY2t/fMrOh7mia21ui21yhXJ9hYt/e5KFenl0eXV1e2ptdWOEdpKCd29nX3yBeYuJZXGBampxY1hte4aciYOCc5eUd357bYdwgImKhnCWjpCIhYuDenl+cXFvfWdocmNueHJqbHF3fXx6XWV5gHdpdXlmgnZndIeMjZR8codqbn6AeW18XVhwfW1zf4p8gW5uiX9wdmd3foB+f3V7cXpzhnt5cWVyYW6MgmxzWGtfeF1Jb2xNV1ZfVFV8a2FPVHVyUVFUVl5idIVoXGBqaWViWW5hWGNwR0FoXWBmXl1We15PVmVwWltqaF1XZ2BfcmZqaHJocXN2h3hulYp0f3t3fnmDh4B1c3+GhY6CcHB7eHd1eYeFh4yGenx/dYt+fYaEhId/fn59h398eHV5d5GTn36MfYtudYB5ZIOIl4Z0kopvhYWCeoN0Y25qWV9bXV1UZ3NlYFlkcnJngXJha2RXW2Bpf3i+rnuft25ic4dodHxyeoOHe36NgHh4c3dve3Zlam5hh3WOgXNqYl9+eHmKg2ZwfWhqa1tXb3iKo4GFf3GZk3GAeHSBbH+Bj4ZylIeMh4OIhX15dHJvaHlham1hbXZrZ2tsend6d1tnfXx4ZXN+boR0ZXWGjYaVfnCLZmt6g3RsdGJbbntrdHyLeoFmdIZ9bXBodX53fH1xe2t5e4F5d3BlbGFtiX5tblZrYHhWS2tsT1JPaU5ZfGdiTlV1a01QVFVeZ3aDZl1hb2dmYVdpXVxsaUpFalpiZFdZVXlaTldualldbGVcWWVjXnRmbGRyZ3NwdIF4cJmFdoB/eH98hYd9dXOCh4CVgm5zeXt7c3KFh4iIhHmBfXaPf32EiY6DgYN7fouDe3d8d3eanZd6ioOHaXZ+fGyEhZSAco+CcYaCfoJ/b2ZsZlddW1xbVGRwZV9YY3J1aXZvZGViV1xcaIBwb3KAc4llZXl/anR2c3ODhXiBhHp3dHVua3pwYmdrZ4Z0jYRuZl5ffG97iX1obXdmaWRWV3Jwjad8hHx2lpBzfHJ7eWx6eo+Edpd7h4aChoN9dXBybWd1XW1pX211ZGdmaXpve3JZZ4F2dWdwgHiCdWF3hYt8lIFui2pteoFxZXJlYGx5Z3J2iXp9YXWDdmlrcXV6cHl3cnxmfX5+eHZuY2VhbYZ8bWtWamJxVExqa1BMTnBIXntlYU1VdGRLTlNXYWp3fmVdZ3JoZV9WY1dicF1LS2tYY2FUU1RzVkxZdmVaX2tgXFpjZV93Z21icGlzb3F+dXSZgXiAgHiAfoWEen12goN+mIVucnR8enRxhYWPgoB6i3V0kIB9gZSOgIWEfH6Mhnp+gHZ7o6aKeYiGhWx1fHt1hIKMem+Fc3qFfYKDdW5qaWVWXVtbWlNjbmVbWGF0e2ppbWhgYldfWmmAaWtvgGdsYWh6eWt0dHRvhoJ7gH12dW56aWt6al9lbmiBd5CEZ2VYYndpfod6b2lvZ2ZdVVhvaI+ndoF6fJGOeHVvfm5ydHiOfneUdIWCf4WIdmpydmdob1xtZV5uc19nYmp4aHttW22Dc3Rqb4B+eXdgdoSEeI+Fc4hxcHl/cWNwaFtudmRwc4d7eGFygHBnaXhzcWt3dnR2Y4N7fnd1cGNjY2x7fGtrVWliZ1RLbWlQR1JsRWF4ZWFNVHJdS01VWWRrd3plX21waWRcVl9Vb25WSVNoWGZeV0xUa1RLXHpfW19rXV1bYmVgemhsYW9vdW5vd3V6l312gIF5gH+Hhnp5eoN9gZOEcXR0fnl2dIWIkH2AfZBsc5WBe4KfhX+HfYB+hoKAint2hKyfgHqIh4RscoJ5doGAgnRuh299gHSKgGpvbmRkWF9aWltVYmpnW1pfdYJpXm5sXGFWXFxrgWVydH1pal1sd3ZndHdybod8fn56dnNsemhqeGZdZHJneneSgWNjVGRvZ4KEd3ZmaGphV1ZZaGSQp25+eICLjnpwcHxmeG55inp2jnGDfX5/hm5kdnNkaGhdbGJecG9bZ15tdWV6aV10gG9ya3F7fnV1YXSFinuHh4B/d3J1fnRhcGxZcHJicXGEe3VkcoBsYGx6b2poend0cWWEdHl5dXFkYWRscn1qbFRpXl5VTHRjUUdXYkdjdmVgS1RwWEpNWFhna3Z6ZGVtcGZjWlhdWHZmU0lcY1hoWFhIVmRQSGJ5W11gbFteXGJkXoBpal9vdHhub252g5d5coGAfX+Ji4Z+dXaGeIaMfXR1dYF5enqCjI59foSJanSWgXuKnX1+hXmAe358hohzcY+ujHx7hpB+ZnGIenR9fXZyb4Zte35tj3picG9iZV1lVlpZV2Nma2BdXXOGaVlxblteWFpcbHtjcXd2bWNbbXN0aHV2cW2FeX+BeXdub3RlaXVlW2d0ZnZ2kXpfXVNlZmqCgXN9YWNpXFVYXmJkkKVoeXSDhpB4bG55Z3dse4N5dIhygHh7eH9oZXZtYGZhX2pgXnVrWWVdb25iemZbeHxrbm5wd3l0dGRyg5J/h4KIenZvcXxyYXdjWm5vYXBxgXtzZXGAZF5tdmljZnh6c2xtgXRzfHJxYl5lbW59ZWlUaFlaVU55YFJLWllIY3RjYElUbVRKTVpWaWxye2NsbHNjYVlaW2F3XFNKY11YaVNWR1hgTkdqdlhfYm1bW19iY12FaWhhbnh5bG9qdoGQeG2CfoCCkoiEgXZ1iXSLhnRxdnaBd3x9foyQgH6TfnB4loN9mZJ5gIB4eX5/c4iDc3Caont7gImVeWR1iHlzeXZrc3B/bHl8cJFyXnBvYWdibFRbWldoY21mXFxyiWZTcm5bWVhYYGx2ZGp1ampfW210cW10dHRrhn1/gHx3b29sZWlxY1trcmR0do9zXFZTZGBxf35xglxhY15TWmFcZJOfZXJxhIOQdGtqeWxub3l5enGAdn9yeXp6ZGZ1Z15iW2FoXF53aVdiXnBoYXhhW3t2ampyb3d0c3RpcIGUg4Z+hHZyanB8bWV2V1tqbWJwcoB6c2Vvfltgb3FiXmlve2trc31ycHdrcGBbZWtte2FnVGdVWFJRd1xTUFlSSGNzYmBHVmxSSVBaVWtra3xlbW9xYVtaWFlscFdST2ZXVmhTVEZZXE9JcnVZYGRtY1hhYGFejGpjZG15eGtvaXV5hntrhH2AhZl8goR5fYhtj4Zxb3d6fHSCgn2Lj4OClnR4gpOGgZ+JdYF/gXR/gnCHgnVvopd0e4aLh3tmd4tvbnxwZnhxe2xzdnONa150bmFnZmtTXlxWaGJsbFtccYxkTm9uXVZYVWdpdGhjdGVlXVpudW5wdXV6a4h9gH2Id5BzY2VrbmFcbm1jc3iHa1pUVmJjd3x8cIVcY19jVFpgWmOWlWNucIOEinNqZ3luZXJ1cXpreXR1bnp+dV9mc2NbXldiZFlhdWZWX2FtY2FxXV1+b2hpc3FzcHV1a2yEk4GJe4VxcmZue29xblNaZWplcXOAdnNibHZVYnFrW15uZHtka3V8cnJyam1gWWNpanheZlRlVVZQVW9YUVdUUEhlcl9hRlhrT0lYVFZtaGR8aWt3amFXXFVbdGRTUlZoUVhlU1NIWVpQTnh3W2BmbGlaYmBeXo9uYmZreXVubml2dn9+bYSAfoaXe3+HgYl+a5OIcmd0gHt1gIN+iY9/i5NyfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4GNi3d4bnuNYGR8cWd5c3ltbXF2g2dkfG1jZmdoU2BfVWdgbG9cXm6OaE1pbWBVVlNvZnNsZXhkZV1ZcXVtcnt4c22JfIF3nHt6bGJlbG1eYG5qZXB5fmdaVlhfbHh7e2+DX2JeaFZZYFhknIhia3GBhnx3a2p2bFt1cGp5aXVybW57gHJYam5eWV1WYmRYZXFkVF9iaWJibVpgfmtma3N1bm13dmtohYx/iXqHbXFmb3tscWxiWF9oaG9zgHNzXmltU2VwZFVibmF4Ym91e3Vqb2xqX1hgZmh1XWVWYlZTT1lnU09dT09IZW9dY0daak5KYEtYbWRfeGhufWRgVV5UXXRbVFJfZk5cYVRTSltZUVp2dl1fZm1oWGJhW16OcWNnandxc21ndnN5g3OCg3uIjn58ioiOeW6QinRsc4Fzf3+IhYeShJWPen2Mj4iRm4SAfIyEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fX59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY6Ojo2Ojo6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6NjY2NjY2NjY2Njo6Ojo6Ojo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA+LjExMTEvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJLkpqZmZmZnFtBRERERENYaGdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMjy0aHR0dHBpohoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1Mz+TnpycnJyfUjE1NTU1NE1hX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYeHiIiIh46QkJCQkJCMh4eHh4eHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho2Ojo6Ojo6IhoaGhYWFh4mIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46RkpGJh46KkJKTkYuSj4yOhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIyMjY2NjY6Ojo6Ojo6NjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOhY6HiI2IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJCIjIWGj4mMkI+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQkIiMh4iMiI6Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fX19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yQiI2HhYyIj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+Mj4yLjYyOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enl6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo+Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYSEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTk5SUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSVlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OTkpKSkpKUj46Uk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKSkZGSkpN8hpSSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSj36PkpGTiHOMk5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJCQdHaQkZB4dIqRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj5F8aH2RiXV2iZCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6OkIBiaop+bHSIj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyOd15qZmljbIqOjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouKi4Zkb21baXJrgYaDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3b2Nxb2Fqc3FlaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhjZWtuc3BydWxjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWVxgYmNtb3BwbVpZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NT19oZmxubWdlUVBTUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5PTExWZG1mam1tamdcU09PUFFPTk5PTk9QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLR0dPVWBobmhsbGtqamhkX1ZPT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUVTXmJmaGptbHNwamlqbGtqZlhKSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+Pz9NWV5qbWxueXNqamxmXFJMRUVFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7O0dKPkdZam93cGtpWUdEQUVGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oz49OjtEWG1sX0hBPkFAQ0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTo7Ojc3U2M9Nzg8PD1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09Pj09PTtFWTk7PD49Pj9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A8XW5APkRFPz9BPEVcPT09Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojttdkg4Ozo9PUE8SmE8PD08ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPD09SUxGRnZ3TTc4ODo7Pj9XaUE7PDw6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3lJO11/g395fHdWPD0/PT0+Rmp1TTo9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUhyeWtigoSDg4OAfV0+QENAQD1Kc3xZOj1BRUFCQkZIQz08QEREQUA/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARm90fYKCgYN+fYR1TEFDRUA/Pll8gF0/Q0VJSklJTU1LRUNGRkdFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXFCREVEQ1d1hoeHflhHSEpNTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEZIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEimxBQVZ0h4mHh4eIg1dITE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzdnd6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIg1ZshIeGhoaHiIiHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklKSEhIR0lJSUpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlWBg4SEgoKFhoaEgoaFhISGhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ozo8QUFAPjw5OTg8PD07Pjs5Oz9BQkBBQ0NCQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJZYWEhIR/gYKDgoODhIWFhoiIiIiIiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4ODs7Oz1AOzk5OT08Pjs7PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlqhoSEgX6Bg4ODgoOEhomKjIyLiomKi4yJVDo4NjU2NzY2NjQ1NzczNTY4Ojg3NjU2NTY3Njc3ODo2Nzc4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUE9SVGVwcXN0dHd5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmaFg4GAgoODg4ODhYmLiomJioqKiouJioqBRzY3NjQ2ODg3NDU3ODU2NzY5OTc2Njc2NTo5Ojs6Ozg5ODk4Nzc3OTo5ODg2ODY4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhIaJioqIh4iIiIqKi4qJiYx6Pjk4ODs8PT45Ojo8OTo7OTo7Ojk5Ozo5PT09Pjs7PD06Pjs5Ozs8Ozw8OTo8ODo6Ozo5OTk8Pzw9QUJESUpNS0lLTFdvcnN1c3V4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQEI+QEJAQD49PT5APz4/QD9APT0/Qj9AQT9BPz1AQEA+P0E9Pjw7Ojs5OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e319e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uKioqLiotePkRHSUtKSUZHR0RGSEdFQkBAQ0VDQkBCQ0I/QERIRUNFQ0VFQUZFRkRFRkRAQj88QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp7fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDREZXhIKDhIWFhoaIiYmIh4aGhoeJiYqLjI2MjIuKiohWSE1MTUtOSklLSUlKSklFQ0RGR0ZEQ0VGREJISUtIR0dGSEdFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT5CQkdHSVmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTlBOTE5LSkxKSUlISkZERkhISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEdHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg3PDs8PTo+QD4/QENGSUlQX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXJOUk9OTExMTEpIR0VJSURKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0hGQ0JBQ1VucHV3d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo8OD0+Oz1BPj9BREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyLi4uLi19SUlBNTk1LSkdFQkdKR0xKRktOS0tKSkxNTE9QTkhJS0xPUVBQUU9PSklKSkxKTEZHSEdGR0lGRUVCQUJCXG9yd3h5enp5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFhWUlJUU09MS0pERUZLT05PV1VRUE9SU1NNU1RPTVNMUFNVVlJTUVBMSk1NTUtOR0dKRkZJSkRERUVCRENjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JCR1ZORk5QUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLaFdVa2FFUlFRUEk7O1JUUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9OUlBQUFFLS0tISEpIRUZJSUlISWlydnl4eXl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHRkZFPz9BQUVBQ0dFREVMWFJNVFVWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUT9AVlVZXGRgVllicl1dV11aVkVRWVpbWV9UWWdSVlZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p5ent6enx9e35/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36LiYqLem5wWFpcW1JTUlZWVFtadYNZVX2QYFxYXV5XSVZdXVtbX1lIWVhZW11YWFlXUlFOUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZVFVUV1JRV1ZjloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXFtcXV1XUk9TUFBRVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTUtmeVtdVFlVVl1aTFRaVVNUXlpYV1dXemtYW1tcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVVFJPS0ZDREFNXoNsVlJTTk9RT1FVUlNSU1VjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtNTktNS0hKREZIRUM+VGRVf1JRUU5LUlRRTU9ZUk1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dnVzc3d6ent7e317fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlZUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDP0NDQ0NCP0RQQkNAQz1DSUdWQEhOTEddaVBIRk9GREVGSUdIQ0RIR0hLR0RCQURATlFNUmRydHZ1c3R1enx7e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGCa01HP0A6Oz5AQD8/PmpRS2FFRkhJRUI/R0xOR01RVUlCRT8/PD08PT0/PT9BQ0NAPzw9Qj5KTUdVbnR0dXN0dnh6fHp9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSkpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlQ0BAQj06QkNBQURCXF1Pe05PTk5LTE1PT1FMS0xXTUhHQEI8OTc3NTk5PTs7Ozg5ODk/PEJIP1xzdHV2dXZ4enx8fH18fH19fX58fn19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklIUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIRkZIQkFHSUVFRkRNUlBhV1JXUVBTU1JVW09PUVdQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEI9ZXNzdnd3eXp7fX18fHt8fX1+fnt+fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpYTUxUVFNQUVVPTFJTVFdYVFRYUUxXWVpWWFhWWFldV1dYaHNrXVZhc2thYV9eZGFfXllUUU5OTkxJSEpLSUlGQ1FQU1tXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg1NzU3ODU5OUdtcnR4eHl7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVFZYWFlTVVRMS1RWVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMT1JST01NTk5OTEpGUVBVWVNUT0pOT1VTVFxWUlVTUk9NTElISEY/Pzw6Nzg3NjU5OTY3Njc1V3BwdHd5ent8fX19fnx9fXx9fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwb2ZlZGNcXVJUWlZXVVRXVFJYWFlZWVJVT0lHT1BPT01SSk9QT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFJNSUxKT1JQUlJTVFFST0xMS0xMSENCQT06Ojg3NjtCNTU2Njpkb3J1eHh7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpJR0VITEhLSUZMTVBNRy9FX1I+Mz8+am9hUlJRQEdVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHZ6e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hFRkhKTUxFR0NPUkM4RU5TXWdTUVNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ1eXt6e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRYV1VNTEtJPDk4Nzs/QD48PUFAQj0+RUhHQ0ZGSUdKSUBGQUFARkhFSk9IUVJhXFFQUk5TTk9QTExPTUtNTE1PTltXS01RT0dJSENISkxMSkZGRkU/QkM+PEJHP0I/QWRwdHd7enp7fHt6end7d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIREQ9OTc3OT9CPjs/QUBAPkFESUVDR0dJRklFQkI/Pj1DQkFHSUVNT2JlUU1OTldLS01LTE1NTUxLTk5TZE1KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLbm92eXl5e3t6fHp3c3h1eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9ISkQ/QT05OTk6P0I/PEBCQUFERUdLRkNISUdHSENDP0I/P0BBPkRFRExNUlRMSklNVEdJSUpMSktMSUpMTU9QUVBLR0NLR0NCSkpMTU9OSUpJR0NDQ0RJSk1MSVlybXd5eHp7e3l8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUhLREdISEdKS0lKS0RHQj0+PTo6OjtBQj89QkJDQ0hGSUtKRElJRkdHQ0M7QUBCPkBAQkVDSU1QSEhLR0hLREhJS01ISkxISUpLSk1cUkhIRE5GQURLSk1NUE1LTUpLRkdHSk1OUU5MYm1pdnZ3e3l7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktDRkVHRUZGR0VHQkNAPTw9OTo6OkBDQD5CQ0RFSUVJSkxGSUlHRkZEQjtCQ0M+QENDQ0VHTE5IS05IREhFSUxOTUdJTEdGR0lJTE5LSUhFTklCRk1MTk1PTU5OTUtJSElPUlFSTlJmZmZxb3N4dXt6fGxoam5la3Fsc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkRGRkVDQ0NFQERCPkA/Ojs7PTo9PkNBPkFDRUZKRklITEhHR0dGRUNAPUVFQj5CRENDRUdISUdNUEpGRkdLTk9LRkhKRkVERUlKSEtJRkhQS0NJTUxQTU9OT09OSkpITVJVVVJPV2RgYW1ncHJvcnl6Z2VoaGRpbGZxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxHRUVIQ0JBQkQ9QkE+QT05Oj0/Oj0+QEI+QEJER0pGSUZJSEZGR0VDQkFBRkZDQkNCREVFR0dIRkxRTElPSkpMTElHSEVGRkRDSUlIS0pHS1JNQk5PTVFPT09NTk9LS0tQVVdWVVRYX15caWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1anN1bnV0c3FyamtzTUdIRkhCQkBERDxBQEBDPDg5PT45Pzw/QkBAQERGSEVIRkZIR0ZGRENFQ0RJRUNGRUJFR0VGR0dFSk1LSFFNSktISElFRkhJRkNJSklLTUtPU05EUVJQUVJOUE1OUE1MTVNXVlhYVlhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpb3lNSEdISEJCQkZEPD9CQkQ8Nzo+Pjo+OkBCPj8/Q0VGREZERUhGREVEREVGR0pFRUpHQ0dIRkhHRUNGSkpHTUpMS0hKTEZJSUtIRUtLTE1OT1JUT0hTVVNQU09RTU5RTk1QV1pWWllWWl1aWGFgYGBfaGVjYGRmaGdqaWhpZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5JSEdJQ0FDSEU8QEVCRD05Oj4+PTw8QUI8Pz5BQkZDRUNDSEVDRUVGR0dHSUZHS0hDSUhHSUdGREhLSUdLSE1LSktMSExLTUtKTkxPTk9SVVZPS1VXU1FTUVJMT1FQT1RZWllcWllcX19eYGNeXGFja2JgZGdocoVoZ2lmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdm90TUlLSEpGQkVHRTxAR0NEQDo8PkA/Pj9CQTxAPkFBRkNFRURJRUZFR0VISEZISElLSUVKSEhLSEZGTElISEpHTExMTExJTUtNTU1PTFBQUVVWV09LVlZVU1NRUUxPU1JQVltbXV5bXF5fX2FgYWRdZGBlZmBlaGpjc3NmamdnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKS0xKTEdCRURFPEBGRERDOz8/QUBAQENBP0I/QUNIQ0ZFRklGSUZGRElIR0lISk1ISEpKSUxKRkpLSElKSkdLS01NSkpNTE5OTlBMT1BSVFhWTU5UVlRSUlFQTE5UU1JXW15eX11dYF9gYWFfYWNlYmRoYmRpamd2i2xqaWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZvd0tNTEtNR0RDQUQ8P0VFRUM9QUFDQkJDREFDREFBRUdDSEdISEdKR0RHSUdISkZJTEhJSk1LTUxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1FXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BDQUVEREZCQ0VHQ0NJRkNJSkpJSUtHREtKR0hKSUlLSEpKTkxOTElMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGJ2dWh1Y2F2YFhucWJkdmluemZbbHRgbGtUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RCRUVERkJGRkdERUtFRUpNTUtMTEdHTUlHSktIS0tJS0tOTE1NTExJTE1MW3NiZHBebG1VTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpyeXZrYmBrZWVteGxrdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUhHRURAQkJAPkNGR0JGQ0ZFRkVEQ0hIR0RFS0hHTE1OTE1NRkpOSEpLSklMSkpKS0xNTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtbnVcWWxRXG1tWnFta29teHh0c2lwXV9ya3FqVXV5eHBjXmtmYmdwcGpqb3BwcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHSEVFRUJCQj5AQEZHQkdESUVFRUJGSUhIRUdLSkdNTU5MTU5HTE1JTEtJSk1JSklKS09QT05NS05NTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITUdJREVFQ0FCPUJBQkZESEdMSEVDQ0hLSEhGSkxMRk5MTFNSTEdMTEhOSkhITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9udHN2c0hLSElCRUVFQUA+RERCR0NISU1JRkNGSkxJR0ZKTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTU1NTUlLS0tTa2JbaV5faWNyclpfWWpvX2VlVWtfY1thYVFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ2dHdyR0dGSURFREZBQEJGRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpFSEhLTUlISkpKS0lISUdLS0tMR0hLS0xMTExKS01OVFtcVFBUTFBPTk9PVlFPT1FOT1FKSU5QUWRxaVRZV1xbXFVZWl1YXVxcY2ZhYWViY2ZfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUNAQ0hERkdDSUtMSEZER0tMSERHSVBLTE9LTFdMSUVFSElKSElLSExKSEZHR0lHSElFRkxJSktOTElQXFdeUFxbYF5NWFlTXFxiXk1ZWk1YYVJKWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0VMTUJEREJFSUVHR0ZLSktIRUVKSktGRUhIUEpNTUpNU0hHRUFIRkpJS0tJTEpIRkVJRkRGR0VFSkhDSk1LTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5eXF5TWl5jXlpdYGNgWV9iW2BeW1RYV1leXWNiY2FjZmhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnV2YVNKSk1JREJCQ0dIRUhHSEtJSUlERktLS0VGSUpOS05MSExOR0hFPkdHTElLS0pMS0lHRUlEQ0REQkZKREBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVlWVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQkVISUZHSEhGRkpHSEZIS0lMRERLSk1NTExISkpISkY/R0ZOSktLTUtLS0lHR0NEQERBSElCP0lKSFBdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXGRjYmRjZlhRVVRSW1daYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktKRkZGSEdGSUZGRklMSk5GREtKTE5KTElLSkhJRkJISFFNS0tPTUtLSUhHRUQ/RUNISEFBR0dFVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVVZYFJRX19iYmBgYmJgY2JhZGRiWE9RUVFaUltdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FHRkRHTVJIQ1FKRkhISEVGS0pNUEVGSUpLTkxMSUxMSUlHREhLUU9NTVBMTUtLSElDREFFREhHQkFHRURXVUVcVV5TVl9YTlRVTlpaTUpLVGBhW19YXl5hXU9ZYlxgYF9iY2JdYWJXX19UUE5PT1dRXVtbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERUZHRElSYlBDVl5JR0dIREZNSlBQRUlJS0tOTExMTUtKSkdFSk1RUU5PUE1OTE5IS0FEQUNERkRDQkVGQk1IQktMUE9OTEZNRkdJSkhHTEtNT1BJTE9QT1NPTFFTUlVaWVdZWFhkV09TVFBQTk1PVFNbWFhaXVxgYWRlY2dja2xwc3J6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdHWExHSEpIR01MUVFJTEtMS05NVU5PS0tMR0dLUFNTTlBPTk9OT0hLRmBFRF9MRGZkRU1bSV5bcm1PTVVtWUxDUGBVa1dnSl1YVV5ETVFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqU1dWVFtcW2BgYWFhYmBmaGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TEhFR0ZIRUVLT1NJSkZgU0hKT0pJT01SUUtNTExPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpRf1FJfFlZcXNYUG1IcW5vYVZQcXFzUEJrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtgVlZYf2p0dXVfX3ZfWGFbXGZbX2FhYWFeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU5CRExMRklLRVFWTEtOSUtSWFdRTk9PTVFUTk9RUEtLTkdNUFNbWlRRUk9QUFBKSFp4XVR4ZWhaUlRRdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Nye3xvfXlvf3JfYGBiYVpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1ISkpHSlBPTU1KTlZeWVVMUVNOWFpNU1NSTktPSVFSVFlXV1FUUFBQUUtIZ3hsY3hybVtLTVV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclFoem1panp6fWx4en9vaG9ZdnZqdXVwgWByZ3xpbHh8b15fX2JhW11iZGdpaWRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdXpufH15d3JuTktTdE5DQ0ZQUEhKS0pLUE9PT01QWmBaWEtUV1BhXlJWUVlSTE9JU1RVWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmhxdW5teXB3bHZ0dHJsbl10fnprbXl8a3RsfGtwdnV4Xl9fYl5dX2RkaWdoZmVeYWJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRyb21MTFtWSEdFR1JQSUxNSktQUVBQUFFXXFhVTVVZVWZYUlJZXlNMTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1twenteYHpzY3JveHFoZHxpcnxeVExsYHZ1a2l1fHttfnhrfHBdXl9iW19iZGRnZWVlYlpjY2lra3JzcndnbGloZGdgYWthZ3NybGdtbXJ8a21oa3t0bW1rbU9ISktISUhIUlBMTk9MS1JSUk9TUldSVlRQV1tWVlRUVGFgUE5NS1RTU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWVJOUFVUWFhYW1pVUlNXW1dYV1pPU1VXWFhSXVlXXlZUUFlSVldXV1heW2dyXltbWVxdX2NaX2NjZGZkY2NiWmNjZmZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLTExNS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVhQT0xNVlRQTlVTTk9NTFFQS0pSUUtRTUtLT1JVUlFRU1NJSExOT1FSUVFRVFZSWFdcV1NTUFFVVVZTWlFPU1JYVlRZVlRZVVRSVVRUVVdYV11aXmFdXFpaXFxgY1tdYmNkZmRlZGFZYGFjYWJoaGltY2FkXl9jXVpkXGJtYV5mZWZtc2RpaGtrZWRjZmhQSktMT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYU1FQS09XU1BOVVBOUU5LU1BMT1VTTlJOTU5RVFBUUVNUVU5LTU9RVFRSUlFWV1RZWltZU1VSVFdXV1lbVE9UVVhVVVpVV1lVUlJYVlVXW1laYF1VWF5cXl1cXWFhXltiYmNnZmVkYlhfYWJeYGhlZmVhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVtaWFdYWlpYWVZcamRWWFlaV1ZTVE9KTlZUUE9UUFBQTk1RUVBSWFRRUU9NT1NWTldSVFVVT05NUVNVVVRUUlRXVlpdXFpWV1FSV1hWW1tXUVRWVlZWWVRYWFVSUlhWVlpdWV1fXlZeXV5gXFxgX19fWmJiZGhnZGRiWWJgYl5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUVBVXFpaV1tbXFlaW2RxbWhkXltZVlVXUUxNVlNNTlJPUVJPTFBTUlVaVVNQUExQV1dSV1NTU1hNT1BSVFhWVVVTVVlYW15dW1tWUk9VVlZbW1dSVFdWV1hWVFhbVFNSWldXXF5aXl9gVWFcYWFeYGJfXWBdY2BjZ2hkZmBaY2BhX19lZF9gY1taXFtcWVpYWVdcWVxbYF5fW15eYWBeYlxZYFpRTk9OVlFQVFJPVVRTUFdcXVxYXlxfV1xeanF3eYBiXFtWVlhRTU9WU05RUVBSVFJLUVRUWVpXVU9STlNYV1RTVVJSWk9QU1NWW1ZWV1RWWlhdXltbXlZTTlRVVlxcVlJUVlZYWVNUWVxVU1NdWFpdXlxgYGBWYltjYl5hY19cYmFiX2NmaWRmXltkYGFgYWNkX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVUlFXUlRQW11eXltgXGBVXF1panJ9c2xnXFVYV1BOUlpTUlFUUlRVVEtRV1ZbWlpTT1NSVlZWVE9XUlNaUlRUVFhdV1hYU1hcWF5dWVpdVFVOVldXXltYUlVVWVlZVVdZXFZUV15ZXV1gXWJiXllfW2ViX2RkXl5jY2FeZWZpZGZeXmRhYGFiYmRgYl5YWl9bXFtYWFhYV1taXGBcW1tcW1haW15WXlldUE9PUlpQWlRVVlZUVFReXmBfXmJcYFVdXmJreXRsfWxaVVlVUVBTXFRVVFVUVllXTFJaV11bXVJPVVNYV1ZUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSV1JZWFlfWlpUVVZaWVpXWFpcVlVaXlxeYGFfZGNcXl1dZWFhZmReXmRjYFxnZGhlZGJfZGFgYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9fYWFgY11gVF1fYmVldYF6aFhZWVNWU1ZcWFdXVlZXXVhPVV1aXl1dVFJXU1dWVVNUWFJTVlRYWFhdXlhdW1ZdX1hfX1hdVlFZVFlaWmFZXFZXWFtaW1lZWltYVl1fYF5jYmJlZFxiXGBmYWRmZF9gZGJiW2ZjaGVjZmFmX2BhYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWU1xUVldZVlZcYGFiY2FjX19WW2BkYV96dW9oWVxaVVhUV1taWVxZWFlgV1BWXlxgYVxUVFhQVVdWVFZXUlNVV1paXF9eWl9cVl9fWV5eWV5WU1lXWVpdYlpeVldbXFtcW1taW1lZX19gYGRiY2RlYmRaYmZjZ2ZlXmFiYGNeYmNpZGNnX2deYmJjYWFgXl9YVFtaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU1BWWlZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5cXVtWV1hZXFxcX1tZW2JWVFheXWFjXFJWWVBXVldXV1ZUVlRYXFxeYGBdYFxXYV5bXlxbXlhWWFhbW19gXF9YWV1cXV5eXFtdWFtgYV5gZGNkZWVmYlljZWVoZ2ReY2FgZWNdZWlkZWlfZl5jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldaWFtcWFdZXmBiYWVhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFdXWFlZV1ZXVl1dXmBhYV9iXllhXV1eWV1eWVhWV1tcYF5dX1paXl1eXmFcW1taXGBiXmJkY2VmZWZiWmRmZmlnY19jX2FmZVppaWNmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWFdaW1pZV1hWVVtdXV1gYGJieExYV1xZV1xbXF1aV1xdX2BiZGJiYV1gWGJjYmFjYWJdW1xbWFdbXF9dYF9dW2BkXFxYWmJlY2FSXFpPWFhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl5ZWVVYXV5fYF9gXFteXmBiY1xcWFxeYGJiY2VkZmRlZmRcZWZnaWZjYWJcZGdgXGlpYmhpZmVgYmFjYV9gX11dW1lcWVhXWFlYV1xbWldXWE9YWl1hY2Zmcmt/SllXXVpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGJiYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF1eX1pYVltfXl1hYWBeW2BhYmViX11UXWBgY2RkZmVnZWZmZV5lZmhoZ2RkYFtlZ15haGhiaGhmY2BiYGNiX19fXV1cWltZWFhYVlpWXFpaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7fHt7e3t6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3x8fHx8fHx8fHx7e3t7e3p6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqCRT4/Pz8/PXWNiYmJiYaz1tLS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjYM6MjMzMzMwc5CMjIyMiL/p5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh4eHh3eHd3d3d3d3d4eXl5enl5d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHZ1dXV1dXV6fX19fHx7gYSEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnV1dXl2dnZ6e3h7eHd2d3p3eXp6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7fHx8fHx8fHt7e3t7e3t6enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d4fXl9enl8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8en59eXt6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4SCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3d3x6fHx6fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4fHl8fXp8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh5eHp7eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3Nzc3JycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3RycXBwcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Rzc3FwdXdvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnNyc3NycW+Qg25wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFxdox1cnJvfaB7bnBwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFynZVxcXGVontvcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcm+Pr4lveaKiem9wcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFycIiypnaKrKR7cHFxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJwjbOopKaxqHZxcXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3Nzc3Nzc3ahoaO0ppukfHNzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fnx2dnd3dnV4enh4eHh4d3h4gqefnKefo6OSenl6eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fXx8fHyLoY6PmJqZm5V7e3l4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX59f4inp6OdoJqTmIF/f319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgYGAjbKnqaKgoaumhH6AgH5/f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/f4CAf4qprp+po6ChpamkjH58foB/fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5/gYiVqq+knKShoKGhoamroI2BgIB/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDg4aMm6ajnZyan5OYoaCenZ6hoJSFgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMj5GPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgoSMlJaXl5mYh5Cdm5ucmJGLh4ODg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OCgIKDhIyWmZWJkpmckouHhYaHh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+PkJKRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYKBgYSPl5SWmZCFh4eIiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhISCg4OEkZaIhIWDg4WFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgYKCgoKCgoGHkYKDg4GCgICAf4GAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgICAgIiSgIGCg4OAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOKloiEgoSCgn+AjJaCgoGChIOBgYGCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6YioOFhISEgoCSmoaCgoKEg4OCg4GBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KTj4yMioWEg4ODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBj4yDgX9+fXx9i5yNgIKBgYOChZSTjIGCgYKDg4GBgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GVl4mAfX19fXuBl4yAg4GBgYCPk4uQgYKBgoKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgJWfin5+gH2Hin2EhIOEgoODgo6JhYyCgoOCgoKCg4ODgoODg4KCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSTkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fn19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSko2KiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOKkYOEi4WCgYF+fYGHhoOAfn5/fn9+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaFhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f36AgISFhIWGhoaFhYWFhoeHhoaFhoWFhoeHh4iHh4eGhoaHhoeGhoeHh4aGhYSDhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiYiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/f4WFhoiIiIeHh4eIh4iHiIiIhoaHiImJiYmIh4aHh4eJiIaHh4eHhoeFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGg4KCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt6gIaHiIqKiYmJiImJiYmKi4qIiIiJiYqLioqIiIeIiIiHiIiIh4iGh4aEg4OFh4eHhoWFhISEhYWEhYWGhISEhYWFhoaGhYOJlJOQj5COioaEhoWDgYGCgYKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICBhISCgoKCgoKCgH9+fX19fX59fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIaGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SEgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fX5+fn5+fn1+fH19g4eJioqHh4WGh4eHh4iHh4mHiIaIh4aJiYODhIOFhISFhYeIiIaFg4KCg4WHhoeGhoSCgoOEgoOEhIKBgoGBgYODhIOEkZKQjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCgoF9fH1/gH9+fn59fH19fHl8g4aGh4SDgYODhIWFhYODhYSEhISEhIWEgoKCgoSEgYKDg4WGhYSCgYGCgoODhYSEhIWEhIaEg4SFg4KDgYKDg4SFhIeSkY+NkIyJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhIWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gX9/gYODg4ODgoJ/fX1/gICBf31+fn19fX17enp+hISEgoGBgIGBgoKBf36BgYGCgYOBgoGCgoKBg4OAf4CAgoOCgICAgICBgYGDgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn5+fX+Cg4OCg4KDgn19fn+AgIGAfn19fX1+fXx6enqAgoKBf39/f35/f4B+fYB/foCAgX+AgIF/f4CAgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gYODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgH9/f39+fn1+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B/f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXuAgH+Af39/fn5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/f4CAfn5/f39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfn19fn5+f359fX19fXx8fHt6eXl5eH2BgICBgYF/f4B/f4F/gYCAgYGCgoB+gH5/fn5/foGAgoF/f39/gIB/f4B/gYB+f3+Afn9/fn+Af31+fn17fIaTkoyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoODhYOBg4ODhYSEhISEg4ODhIKCgoKCgX9+fX19fn6AfX19fX19fX19e3p5eXl5eYCCgoKEg4CCgoGAgoCCgYGDgoKDgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOPiYmIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX58e3l5eXl4fIKDhIWCgYSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhISEhISXl4ODhIF9foGCgoGCgYKBhIaIjIWDgoKBhIKDg4KDhYSEhYOCg4OCg4OCgoKCg4KCgpKQi4iIh4mHhoaEhoWFhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoeHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko+MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GCgYOCgH59fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh9fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX19fH+BgX2Gj4F+fYJ+f36Agnx8gH+CgIKAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uUkIyLjo6MiIiHhYWFhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7e3p8goCBfn+BfH5+f359gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJKNjY2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4N/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn99fX6AgIGAf39+fX19fX57fH1/f3+AfX9+f4yRjo2Oj46Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KEhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEg4CAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fXx+f399foB+f36Eko2OjI+Ni4qGhIaEhISDg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn6Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn1+fHt8fHx6e3p9f4CAhIOCf35/fHx8fXx8gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOBf4B+f4KCgn9/goJ/gIuQjY2MjYuKiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoGAgIB9fH18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIKBgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f3+Af39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5/fnx9fXx8fHt+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiIqJhYiSj4yJioeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHx8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4ODfX5+fX18fX19fX19fH17fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4qJjJGQjoqIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX5+fX59fHx8fn18fXx9fX1+fX1+fnx7e3t8fH18e3p7e3l6enh5e35/g4OEh4mKh4mOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36DkYSEg4F/fn18jYd9fX59fXx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI+Oi4uHhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+fn9/fX19fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjouMiISFhYSDg4GCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBgoKBgYKCgoKBgYGDg4OChYaEg4GAgICDgX+AgYSBfn6Af35+gH59fn6AgX+Bf3+Af35/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8fHx8e3t7fHt8fHx9fIqLiYiGhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoODhIOFhoOCgX9/gIKAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBgH1/f3+AgICAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x9iYeHhYWHhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXd0dICAgoKCgoKDhYOEg4KDhISEhISEgYGAgH6AgoB+f36Bf35+f4B9foB9fX1+gH9/gYCBgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHg4SEhYSEhISDgYKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWDg4OEhIODhIOBgH+Af4CBfn1+fn9+fn5+gH19f3x9fX6Af4CAgIKAgIGAg4KAf4B+gIF+gIGAgH9+fn5+fn1/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4B/gIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x7e3p8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgIGAgIB/gIGAgIKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fH99f4B9f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WEgoSEhYSEhIGDgoGDgX+AgX5/gH6AfX19foB+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgYOEgoGAgYB/gYCAgYGAgYGBg4OBgX+Ag4B+goOEgICCgYKChIJ+e3x8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CAgICAgIKCgYCAfoCCf3+BgoOBgYOCg4OFg399fX18e3x8eXp7en55e3l4f357fHt+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gICAf39/f3x/f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4CAgIB/gYKBgH9+f4F+f4CCgoCBg4KEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fH+AgIB/f39/fIB/f4GAgYCAf3yAf35+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB7gH6AgH+BgIB/fYF/fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYODg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAgICAgHyAf4B+f4GAf39+gX9+f39+fX18f4CAgIB+f35+f318fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd8eXd4d3d4e3t7e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgoGBgoCBgICBgH5/fn9/fXx+fYCBgoGAgIGBfX6Af35/gX+Af3+BgH9/f319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKBgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoCCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3t9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgYCBgoF/gIKCgoKDgYGDgoCCgYB/f4CCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYGAgICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9fHx8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KCgoKDgICCgYSDg4SBgYOBgoOCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CBgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGBgYB/gIB/gId+fnx6fXx7fX94d3Z5eXp8fHx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KChISAgIOBhoODg4GChICEg4KCgICCgoSBgYKBg4J/gIB/gYOCgYCBgYCAf4GBgYGAg4B/gIOCf35/goGAgH9+gYCBf4CAgYGBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH+AhH19fXt/fXp9f3t6dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKCgoOEgoOEg4CAg4OGg4ODgoKEgYSDgYOAgIKBhIGCgoGCgX6AgICCgYKBgYKCgIGAgICCgoGEgH6Bg4J/foCDgoCBf4CCg4KAgYKBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKDhIaEgoODgoSChIOBg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIKEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKChIKCg4B/gYOCgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt9gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIKBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgYSFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBg4KAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6fH2AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18fHh2f3Z3f4SHg4KDhoODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4GCgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OFg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEhIGDg4SDg4SEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODg4WDhIOFf36CiouFhYSDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhYWCh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF6hH9/f3+EhIKDg4KBg4SDhISFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf31+f31+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOAgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg3+Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW53bHB5bHV9f398foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYeGhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoaEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+g3SIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIKBf4GBgH1/f4F+f35+f4GAfn6BgoCAgoSHhoODhoSFhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhYWDhYWEhoaGhoaFg3iLeXKIentwcIWFeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXp9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iEhoSFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4WGhYWEhIWHhoSEhYaFhX13hoOEhIOCgX1/fnt8e357fHx9f359fH9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYeFhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhoWEhYWDhoaFhoWEhoeGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1/fnx8fn2Afn1/gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSGhYWFhYOGhoWGhYSGhoWEhIWFg4SHhYOCg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoSBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDg4eDhIGChIWDgYCAgHt7fn18fHx+fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYaGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDhIKCgn+Ae31/fXx8fH59fH19fH57fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHh4iGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f39+fHx9f318fX18fnt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWEhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iHiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWDhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBgoKBhIWCg36BgoF/g4F/fn5/fn98fH1/fXt9fXx+enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIeGhoeFhYSDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCEg4OCfYGBf36DgX5/f4B8f3x9fX59e319fH15enp5e319enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhYKFhYaFhoaHhIaGhoaFhoKDg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgIGDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhYWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWFgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXyAfn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhIaGh4eHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhISFhIWDhYSAgIKDf35/f39/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t8fX19fYB9fXx8fYB/fXyGg4aGhoaFg4SDhoKFgYGAf3+AgH5/gYJ8fn9/foCAgoKChISDg4GChIGAg4KBgISFhIKBf4CCg4OEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SFhYWDhIODhIKEhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8enx8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWEg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt5enp5enp6e3x5e317e35/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjtBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTT09PT09PT1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19jZ2NjY2NjY2NjZ2dnZ2NfX19fX19jX19fX19fW1NPT09PT09TU1NTU1NXV1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0E8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNhG1wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLepp6enp6enp6enp6enpq65uLi4uLi4uLi4uLi3vdPT09PT09PT09PT09PT2+Li4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk08Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzk4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6OghoSEhISEhISEhISEhIKSpaOjo6Ojo6Ojo6OjoqvT0tLS0tLS0tLS0tLT0d/q6uvr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs8QkA4PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzc5SKzExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSloomHh4eHh4eHh4eHh4eFlaakpKSkpKSkpKSkpKOs0tLS0tLS0tLS0tLT09Hf6urq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8PD46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183PXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqaeQjo6Ojo6NjY2NjY2NjJqqqampqampqampqamosNLS0tLS0tLS0tLS09LS4Onp6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcXCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs7Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS0NDQ0NDPz8/Pz8/Pz87Q0dLS0tLS0tLS0tLS0tLU1NTV1dXV1tbW1tbW19nZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7O0dTPz8/T08/Pz9PSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dbW1tbW1tbW1tbW19fW1dbW1tbX19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O07udz9DQoZbL0seSq9HOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0rWVm7PWp6Crn8+ZrJqy0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz9GfoKqvypyWkKG0lYadnM3Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDk2P0I/Qjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RxYeas7+boKiZtb/Jl5nF0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9anmbLMo6CLn8TTkZmhz9DQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD09OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/VpZmx2ZjHyZTYraO/ntXR0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1qWZs8iclZWku82IlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0NWlmrexmq+znaXQ26OZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRj9ISEdFQDw8Pj48PT08NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09DVpZm3sZ6bopyckaeYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBDOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocfS1qOassmdqKGjnqiiqZ3Q09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT0dW1gsPXr42RpdSako6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPDw/R0VHS0g9NTU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0cLU0tXAvdbU07nI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjY3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLU0tLS1NXT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo2OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRklEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PS0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT48SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDS0A7Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE+SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFBP0pPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFDQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0JHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29zc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NjY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTU0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE0NjQ5ODU2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNDczNzg2NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urq5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTU4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2t7a3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a1tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ0NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqysraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqiop6iopaaoqKinqKeoqamqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojk6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqKWmp6enqKinp6iop6WkpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpq6urrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSko6Kio6Khn5+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp6eo6Shn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6emoJ2cm6Ghnpubmp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqamp6enp5+bmpyioJqWlZWam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaOipaampqanpqagm5mboaCXkp2gl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6emop6dn6Ggl5ioopSXm52YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpaanpqWlpqampaOgoKGhn5qgdI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoaGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKipKWlrKakpaSjoqGhnZumgmGUmZuZm56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGipLa1paOkoqGhnpuco11mmpmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoaKjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKalk7GioaCenJuap4VVbpyZmpyZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoaCgrXqMrZ+enZqanKZnXXGcmp2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qbmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6ChoKCgn6mNaZynnZyamp+XamdynZuenpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uamJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ6fnp2klnR9qZyam5yii2tpcJudnZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udnJuaoJZ7d5GdmpyenH1qaXKbnpydnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmZmqCgeoqFkJmdnpKAa2Zzmp+cnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycm5mZmZqboJegfXKZpZt4joZpcpufnZ6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5yZmZmZnKufinFgp6mdYXqJeXSenp6fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmJ+tjXBgaaKQk1RfeXuFoJ6goJ+enZ+hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZenp3RFRm6XgHtQPlt2hJ2bm56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxtK2vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpuWqZpMREZwlYJxUkc4YHiOko2SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKqiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGQlax1XXhfg7avpWJ2fktqfoiCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnpeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDf5KoYI6zjM7DrMClgJV6UnqCgZKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn6Kl3LQ1snXrZ+6s2NkcFpugYaNjYuGjZSSi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCsppuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqEf4J9kX+QzbXCzsi/rJR8qqxfaImMjouNkJmclJSUoJqan6Ktsa6ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRjH+IjY2Mi4iSi5h1mKKNtKqdnoeCcGjNgGCLi4qQj42PlJSYkJWcmp2eqK6ysLC1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZGeoZ2Tl5uhmp6co6GdipB6hqOMhIl3dG12o4tmho+MmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmsqqqvp5l+W2aGeHh/bWpodXZ9d4SjoaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKlqqinqqyHcVZbdHFyeWllYmlpcHyLo6mnoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5RT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSoppmepaWiorCecWtSUnZ3dHtoYWVmXl9vfIugpKCgn6GhqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKgo6ehpq6osLKsgGhmS05wdXeAaWBiaVpdYmt1g5GdoaCdoKOalpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaeprba8vr2sjW5oY0ZVbm98fG5gXmZaWmFiZ3B4f46aoKGimJaem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbWppYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqp6+8xsvNxremj3NoalxCTnBudG5zZ2JhWVhfY2FianF1eo6hqJydoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX19cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrtMDU3dvLuaubh3BgYGJVRkV1bmBfbW1cW1daWV1bW15iZGVoeJKnr6almKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWl2a3BoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tLfF0tnWya6ReGZdWltcVExBa2qMmI9ZVFhXXFxdXVhVWGByiaGyxcO0sqCnqqynq6mlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllUYWlgZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8O5vb7Bx83QxKB+aV1ZWFdTSVRsp7OoTlVeYWJfX19mepavv76+wMKytbaor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXdubVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8XBxcbAvLnMybmXc1xVWFRRUpyzn05ZXF5dYG2OqrvBsranprG1q7WyrbOtqa6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8foR/amZoYWtsZ251cnJ1cWdeYFxSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QkJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/Dw8bGwbGTv7zL0L+YalhXWUySt5ZNVVlYYH+mvLCmq66zp6qpqautrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtsbmRvbWlxeG96amlhXWdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTExLm1wLizvMHFv6l3V1VRir2PTVNWW4Ogprevpa20tK2vpaSjqKSgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl5e3dua2lodVpmcnhzeWZmXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPEwsW+uL3Bw7/Hu41jUWF/ZVBTYI2qn6a0sq2suLWzq6mjoa2prKetn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWZpamhdam9ueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx7/Ex8TExsrOwo1SSVBRZqe6t8C9vrm8ury6vKytpqm7urm3v7K1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3ZoaWl0bXlsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc3FxcXDxcTJzNPTlk1NXKrHwMjNxsTBxMfBvL60sbCwwr6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdga2p3bGlldW50Y11iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXCw8HCxsbHys1/SY/NzcfM0MW2v7/AwLq7vbWzs8C/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWdjamRiam1ub15ZXVZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK+vcHBwMDHpk2k0czFydHBr729uLm7u763tLG5vrO8vrG5tbi7try0tbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWNjY2piZ2NbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8G7v8C8u8S9usDEv729uLvAxLBTns3EwMHJv7DBv7q3u765tbi0uLy0vbi1tLCzvLG3t7i/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFiY2hqZ2dpZWleVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1Y68vrvDtbrHt7a4u725ubW6w8irVJfIv7+7wb65xr3Cv7zFuLa3tLi2tru7uba0t7q1s7i8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWZwamVraFhZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+80MV5rcu9x7e5uK22tLe6tLezu8XKoFWOyb+/vr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d9a25xZ3Brc2ZibmBcVEhLS0RKQ0NHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNivdoS+yM/CwLiutbW7vre6sr7CyJZbiM3Cwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcmZsam50bndjZ2JcY1FLVUhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCx8nRm3R3sdHRzMrEtbq/xMi+vrW/wMCHaH3NxsK+wby/w8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgnRvbGx0bGxuX2NeYWJOSE4/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDCur68xL63vMC/yc/HyMrKwoh2d6jMzMvNysbCw8vOwby5vbuxgXptwMfEwMC/xMDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh7bW14fGBxY1teX19UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7qt28O+tr7Avr66ppyqs7fEwKZ8enyfxMbLyMHDwMDJysHAvLqypZaIebPIxcS/wMG/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem5zeHRocF1cX1xaUUVFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8W2bq/Ovba5wLyqfW5obm10gpeZdXt/nL6/xsC5wLy+xcS9vbixrqarlpSiysPDvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdsdXtwbmlcX19ZU1BBRklHS0BFQ0g8PTY7OTk8Ozo6Ozs9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNsXaCtL22tcGkhmlaXmBOU1tccHZ6haS4t8K6s7u3u72/uru7rqWtsqGlh8HFw768v7u7uLbBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnZ3bnFhX2ZdW1VKPT8/R0Y9R0NDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaaEeIuisLWcamZnVllfSUlNUFRve4upsLe+ubK1sry5vLa5vrWZsb6us3iwycTAvb+5s66yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NhXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8aoh3t2jKGYX1NDWVVIYmpVT0VKZZGlr6+2urW0sqy8ubi1uMG9j6zEtLR3p8rCv7m6ta6lrLOxprCtqJ2gn6WttrXCt7a0paiqqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnJuY11mWV1dU09OQT5KQkBLSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/s5CBeYiQbk5LQGVZQk94gZNoTUNehbG1s7WytK+su7q4trm/xn6TuquiaKu/uLWysa2tn6Smp52kpZyWmZmZn6muuayrq5+lqKSrrq+nsKuvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0tq+qsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpbF1balRdW1BOSERHTUJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiFfFhGQU+HWElKWXiOg2NBVaO5s7SysLGtsLm4tru3ur2Up7Svp3etsKmrraujqKGdnZ6Xl6CVkpaXj5ifqK6ko6Sgoqaio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHV0bmVVYWNXXVFPTUhASVJETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K8qZiZlWhNQFN5cU9JSUxpnYBaRVWwurGss6+urK22trK0ta6ppp+am52fpqieoKipn6GnlpuXl46dlI+Qlo2Xm6SooKCioqKlpZ2jo6CepaCkrKWmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6bmaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6ahiHiDfHZ/emN3bG5dUWlUUE5HUE1MQ1BRQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcGqpbxnRFOcflBYSUthSleOYmVlg6+1qrK0rqqrr7Cys62lnZGXk4+XoJ+ioJyjpJ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6ionKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclZOQj5GRmZCWlZiXn5ibmZukmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn58f3V2fW5re2RoVlJkTUpIR09TTktOSDxFQDwyPzg1OTs+Ozk4Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoKvGv8qfT0F1mXBQbUpMZGZ2dGFdYnSSsq+us7WqpqyropuZlI2RlZaYmJyfoqKcnaSemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoqWimpmer6iusqulqqqgm5iYmJWTlpqTlZWalpuXl5mhnpyclpuhm56ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eXxleXlgYlNVYEhJSktTVElTUU05P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZylx8aLV1NKZqRZZn1vcltSa2RcZ2JgbZG1sLC4rKahnJ2alJeamZCOkZWRjI6Nk5minJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Ggo7GusrG0qrKuo5mcnZ6hmJubmpiZm5SWm5aZnaWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaIJsZVtTW1lNUUpPT1ZNU01CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6Kan6qjjHlVanJ3dXBjd3ZYV2JgZGlbWldora6sr6efnqKglpCTm6CbmZeSk5+coaObnpuWn5qfl5uinqWhnqSfpKitraisqaSstLe2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztrizuK2ytKSgnaWgrKGhoqGgmpiWlZ+bm5iloaCeo6GgnpucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYKAfHh2and1Xm1bUmBIUlVIRlVXSkNNRz1LSDhGPDc3Oz49PDo7OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoKR/b4JwYGNXS1tSWkxMUVlSSE9OSJmsqqmkn5+ZkpKUmJiWlpWMiIuOlZ2cnZ2el56Zpp+gqKWxqqeuo6uutrC0srGutri9v7qttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q66xubi8r7OwtcK8t76zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6iopaSenaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZybWl3bWhtXFhbQ1dOSkdNR0NGTTw+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqco56ciWJXXmVgV01RRz0/QENEPz5CUnipramqpZ+en6KjnZ6dmpyblJOVlJ6dmJSFnZqgmqukq7KwubKysbKxur28vLm2uMO+v8K/tru7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGxL3DvLezqrOtqrO0r7Ouqq+jnayotrGto7CmoKOwsa6wpKWvo6GgmqGmoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmpuipJ6fm5ubnIeGgXt0cmtrdXJxaFZcUUZVSERKUEk/RUE0Rkg5NTw+Nzs8Pj08Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmqCflXxfXmVgUEZEO0M+Rjw+OTZOfqqyp6OjoqCepaumnpiclJGZnZmVjIqGiIZ4bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvsfGwrfDysnDwce/urS6u7W7t7C2sqq6sq67uL+7uqu4rauquLu1vK6uuaOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhX56cmtjaW94a2VZW0ZLTEVEVExEQ0U3Oj86NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1yaWFXTkU+SVl8b2FBPVyOrqygmZubnp6Zl5eXko2Pl5eTjo2QjIKDgndycW1wj6atrrS5xbvNx8u/wszNzczHydHMzMzHycXGzNDS1c7Tyb3Av8O7xsXIxdHTzdTQ09PMysLFxsbKyM/AydHMx8bIxsK8w8G+v7+2vrOtv8DDw8fFx8Svv7myuLzEwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYF5dHNlYmdyb2ZeWlpDTkxERlBJRENANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+OTtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnpVpZlxUSURAP0uGnqSYg6CyraOenJ+amJeUkpSWkZCPjIeEg4iHg4CBgYB5cXJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19LX0tXW09TIzMfMzcrTzc7TzcXJysrCx8zHycnGv8Ozs8jFy8vLz8fKv76/vcHGxc3MycnAw8Cur7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B7cnV2Z2NndmpkVldRRE5GQEpRQj5CPDoyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGbYVNMSkRDP0NTsNK9sq+mnJycoKShnZqUk5WUiX14cWtlYmhyb3F7hYqAdXBucXRwhbPDvsXR0NfW1tLWztTW19TT0dPU1NPP0cTQ09bY1dbSy8nO0cvGzdHK0tXW2dbX09fYztLKz9HMz9DM09DAyMjKxMzMzM7PxcfItr/KwNLNzNDHysnAxMPIzs3Q0c/NysjNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR9eHN2cGNgZXJiXVJcSUpHQUVJSj47QTg9NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaCioVlJQEFEQUZRdrKvppqUl5+cmqCgnpucmpWJd2ljYV9fYF9eX19dYWx1c3Bwb2xycXWSxMjH1NbX19fT1tDV1NrU1M7P1dTU0dHM0c7T19bT1dDP0tPRydPRyNDY19jR2NLX2dTVzM/Pys3Sy87RwMbDyMbPztHR0sjMzcDLzMbTz8zPyMXLx8fJzMrU1NHVz9LM08K5xbGlqLWup5uoq6Wdsqiws62sk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk1APD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48P0A9RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fY1NXZ2dHO0L+8zMm2vq6mqqiho6tlQzg9PkRYgqqon5eVl5manJ+dmJyckn1xZWNiX19hX15hYF9gYF9gZW1wcG5rb3J3d5zMwdPV09jY1tnR0tLXz9POy9LN1dTRys/N09bS0dbNz9XV0cXR1MvQ1NXWztPR2NfX2MvIzsTJz8zKzMDKwMnKzs7Qy9DOzszPz8jM0NDLzsvDysfJzcvM0tPN09LR0NDKvci5sK67ubWrtrCtqLits767sZqPoJSRjo2IjpCFkY2ZjJGRlY6RgIWJenZvcW9rYWRucGFXXFpJRkZETVhFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSxekhGQjtXjqGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGBhXl9fXlxibXJvb3N0dnZ5pL/M1dHW1NPY1s7O08vOzsXOytLSz8fOzc7UzM7SzcvX1tDM0dTLzNDS08rO0dXS1dXKwMrCxc3CyMrDzMTGycvLz8vOzdDO08zGyc/NyMfLxcfBxsrMzdDSx9DPzs7M0MXHwbi5vcPDvcO4srK+sbvDw7WqmKWhmJaSlZWSi5SNmpGUlI+PlYKJhnlxcmttZ2BgcWhZWGhWTUdMSVBRQjtDPjs2ODo4Ojo1Nz09QDs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8O4ytXW2drb2MzMz8jW1cTCta+0qJ+tl3hscHF5kJuNjJeVkJORkZWWlZCLfGVhYmJgXV5hY2FgYF9gYWFgX11bXWdycnByc3Ftcnmlx9PPy9DQ09TKxcnJxsa/w8XPzsfFx83K0sjLzs3G0dLQzszUysfLzs/Hx8/Sy9DPxrrEv8bKvcLHyc7Fw8fAx83IxMzLzM/IxMTQyMbCxsjEv8HHzMvMz8LLzMnHy9DExce7x8PIycLPwb28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Rka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62jtn5og4Wkq5SOjZaPhYODg4F9hIR+c19bXl5eYF5gY2RjX11dXl9gYF9bWlxgbHJxb29rbG9vfbnRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMrJyMrIwcXMxsjKzcnEwsvJwcHL0MXLyL+5wrvGx77Axs/LxMDDu8nHybvJx8XKwL7Cy8bFxL7GvbzBw8XMxca8wMnDxcfSxcHJv8rJxsjG0cPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Gmm6Ogm5V8d3N0ZmlaYW5tWltYUkRMRkJHRUxERlNANTQzMzU/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2tjZz8vSzc3OyMG1w76xr7ZsX3p8oZGLkpaGeoCFhX92eHVycF9bW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWtwb3OPx73KxcvAxsKwtrqysrOyscK8vLy6uMHBwcS+vbm9v7nEysXGwr3GwLi7xMm/wcm7t7u6xsO/vMHOw8a+vrXBvcO7vca7w7q0vMbEwsK3v7a2vr+7zMO9trrIu7++y8PBxsLFycfJxtDGwszIssfJw87MwMXDv72yt7Cyp6ioubClrbCqrayUenZ3amRnYGhvY1ZeWUpGSkZIS0FFQkZKQDk6NjU4ODU0Ozo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKycbNzc7RyNDF1dTV183KzsXJxcfBucW9q66mYGR2g5OLiIuEeH+Ghn9+hHt0dGNcXF1eYGBiY2JiZGViXVxbXF5cXl1aW1xeaHNxbWdnbnByeZ29zMDDusG4rbCxp6qtrKe4tLa0s7O0u7a9sbewta+yu8K8wcS8v7u1srq+wLjIubS7t8HCvbi9x8HEvLWvsra6v7TFt7u1q7i9vsC9sbq2sLe6s8a8t6+7v7W3tcW8vsPFwMTFxsfLxcDGxrvHy8DPycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl1WXmBGS0hISkZCREFFRT88OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMnIysjKxNDN0s/NxcfBxsC/urfJtqqwmVtocIqPhYiJenh+hoZ2d4F8c2hdXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5pZmtubnJ8pMfAuLi1sKusp56iqaeeqqyzraqsqrSttrGzqa6nrLO7urbDubq6sau1ubu0wrqwwLG+vLu2vMi5w7atqqiwssC2uL2wsaexs7S7vKuutaautq67srGqubCuu667uLvAwL66w7/Gw8XAvMbBx8u4xcfFv8fDw7rExsK7xsnMy7O5wr27s4lzd3ZraWBibGhYWFdbQUxLTUpFQUM/RkE6OTo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxNDHzcHDxr/ExMPDysLJyr/AvMK6s7W1w66qsJJban+Sh46Pe3h9iYV6e4SBd25eXVxcXV9gX19kY2JjZGJgX11aW1paXVpaWVpcZW5vaGZoaWtucoGturC1rqWlp6eaoKSgmpylq66kqKKrqqyrsKOmn6qttLaxvbmvt7Corri0s7y4tL2vuLm2srzBssCupaijq7Gys6i9qquoq6yttbOlqK6hpK+psqaoqK6lqLessbO3urq7sry+vr7Ev7XCwcfIt77AxLfEw7+7v8TCvsTIzMq/v8PAwKmHc3RzamlcYW9jV1ZYUEhZUlNLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPHubnLwcu+u8m2vcO+usq3wcPBtLa8trGvtbutqKuSZG2Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX15dXFpYWVtbWVhaXF9ma2ZkZ2Voam9yhaqlrKWenKGklJ2kmpeRoaOpo6Ofpaanpq2gnZykpqyysLa3p7GtqKq0q7S6sba2rra5s7C6urG3paCkn6axqKuouaqkpqeop7KtoKemn5ukpqyfn6ejoKGxra2ssrSztLC1vLa7wcCyu77DwbG5ucKzwb7Atbi8vb68wsfFw8S/wMSgg3hwbGJmYGtvYFVZX0hOZ09UR0ZLRjw9QD06Ozs4MjY1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItLa9uLrAur22oJ6UnaGmurars7O7s8TPycvDxri3x8DMv7jJt7vFuLPEuLO/wKy1vLKspa+zraGjkWlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYV5cW1xcWFlYWFhWWFteX2RjYmVnZ2drbW+InamflpWaoZabopiVjJ6hoqecoJ+kpaKnnpujm6CrsK2xtaSpqqqsrKS0uK23sKyztq+zta+wqp+en6OisqWmqbitoqamoKitq5mgn56ZnZ+lmpqjnJyer6mrqKqrra2wsrivuLm6sLa8u7qrs7K5s720trGxtrW/tr7AvsPCu7q9l4R6c2tfZV5kZFhUV11JV1xLT0dKSkdBPD8/QDs/PDA1NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765x7i3vreywrSxu7usubqxop6pq6eYno9tfoWGf3hybW9ta2JeYWZmXV1eXV1dXF1fYWFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrco2nnJOUlJqXmqGWlpCboqGonpydpaeipZygoZuZr66ur7KhpaOuq6eitbCysqypr7OnurOmtqCin5yjoa2joqq2q6Ojpp6lpqOWmZ2XmZudoJqXnZydnK2hq6ejo6atq7KzqrWwsquzubSvqq+ysrO3s66pra6yuLG6trq9wLizsZSFeXVmX2ZeW1lWU1pVS1tRTElFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7OdpaOYpbHCtba9rbS4wczIxr/FtsHAx863wMS9s7m5s7+2sbm7rbK0r5+apKqglJqPeH+DhH94b3F0cWhlY2hkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oJuTk4+TlpaelpiTl6CdoZyWoaGppJ+fqZ2bm6unr7CrnKOkuKqhoK6otqqnp62xpLiwpLego5yZmaqnoZqsua+ioaScoqCgk5ShlJaWm5iYlpeclZ+pnqmkop2jqqqxrai0rKqnrbOwpauus7GwsK+vp6insq6xtK+8tLq4rqOUgXp2ZV9hVllYU1JTS01eTFBMR0hMS0U9QD49Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+t72unaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa68u7W7vLW5ubCvsKqcmaGplJGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiYmNmaYGVkpSLkZOTmpiclZacn5yflqCgp6akpqefnaCmoKqvpp+io7eooaGiqLOipailsKWxrqy1nqGdlpWpoaKUrbGxn6Ojnp6Ym5OLoZSRk5iYk5eYmJeep5unoqKapKWlq6SlsKelo6usraaorq+vq6iqqrOlpquvtLGuvLaxr6+gknp3cmVhXFtdWE5MUUhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6lpqy3u7zBxbqxubXEycnAw8bFx7bFxLPBv8Wrt7e9tr26u7Wyq62omZifo4uJdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWlpbWVlZW1dVWFdUVFZVUlRSVWBgX2BhX2FhY2RpgJKSiI+Nk5GSnJSVlqSZoJedoKWiraalpaOko52qq6Wan6WxqqChnqWrnqiin66sqamuraKiopWXopuckKupsJyfop+fl5iTip6RjZKTlpCYmJOcoaOdpKGilaCipaabo6uloqSrpKuupa6yqaalpqa0pqmorbO1tLm6sKqsnoxycG9gW1dWVVJGUE5IWlxQUklUS1NMRUdKRDg7Oz08OTY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5NTc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1ybyxvcPJrbG4wbW8wLy0taqsppWZm5uIgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJSTlFZXVxdXV5fX19iZG2Nj4OQhY6QjZmTlJKcmqKcm6GpqauorKeppqSZpa+llZqlr6mgnJmboZ6vmpyrtKClpp+jpKGUk5uWlpKpqq2anaChoZuUkIyZjoyRjJKNlpWQnaKgpJ2co5WboKOhl6Koo6Ooq6Crr6Stt6ajpKKsraqoq6+zt7K9tbOrr5iFdHNoW1hZU1VSRVhMUVtYTVROUExRUklOSkM9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MDE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraezt6+op6+um6morLe2q7zKu7a/rMvGxbjBzs/Is8S6t7vCyLGtuL+3vL27s7WmqaCWl5iWh3p0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXVxeX2FlfYuAin2Kj4mSjZaRl5mioJugq6qmr6yosaWpmqCtoZWWpainnZiQj5qerpeZqKuZn52UpaGfkpGSkZOVqKulmpmZnp6WjoyLk4aJjYOPi5KVkaCeoaSZlp+VmqGinpSbpaaoqKigsbCmsb2on6OstKqup7C1sLm1wLGusauRfnJzYlZUVk5SSkdWUFJSTExXTUpNT1JHTUtBQ0ZERD5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY3NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrG2t7y9wcOxsLG3rbS0u7O0oqOdnZeXlIOAdmtnbG5xbnJrcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWp/eX50h4yGkImXiZSUmJuYnqmboKumpqyeqJqhppyTj5+jmpeXhYSSm6SQlaOdlpaWiKKbm5OLjoqQmqWnnJWVl5uRkoeUjouBjI2AkIuSkpKgmqGilpSYmZWippmNmaSmqaahoLSyp7K4oZyitqypraSysqa1vLWrrLGjiXlzbl1OUVFMT0ROTk5QS0ZOTkpKTk5RSU1KQUhMSEhDPjg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLawpaekqqWgqaaks6qissO1tbKzxsa2usPKzMazrLm9tLjAr62psJ6mrrqvrZ+Zmp2VlId7g25fX2ZycHZxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYW11hbnF1b4OHgYd/kIOOipSRk52hj5qco6KkmaWXopyVjYiZmoxzjYN+jpeWhpGakJSOjnuZj52Mgol/ipigo56Qk5iWhY6DlH5+dIqNepCHk5CQnZuampKWkJ2Oo6OOiZqgoaSkm6K0r6ywrJ+YpbimprGhsK6csLyqqa+qmYN3c2NWTVJPUE1DU05MUE1CUFFISU5STUhKSkRLTUZLSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0wMjc2NDc4OTo6NjU6ODdBN3i3oaO0qaalqKOmpaamprOnpbTBuLC0sMnEt7nBzsa9s6y6waytw62ooqaSnaa2raOgj5WWkpB9d35mV1ZfZ2ZpZ2huY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVVllbXWpqcWt+hHtzTlhyj4KXho2cl4uUkZ+YnZWUlpWPloqAlIlfO1ZvfIyUioGMkoyQhoZzioWXgXmBe4aTnZSDlY6RkIOGfZN4cXCGjH2JgZGNkJeamJOLkIqdiJ+Yh4iWnpqhoJenrqmtqKielq2zoqaumayrmKi0o6mto5N/c25fW05TUldMRFRKUE1MRk5PSUVMUU1LT0pJTVBGSUk9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjrqGmpqqgpqmno6mvqKe0wrmwtbDHwrezvc+/ua+utcKnqsWqo52Yg5ScsaKamIaUj4uHfXN1XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1PUlRWWFpgbG5neoFzUEI/f5WSkX2IlYyEio2bjpaVipKIhpWHeYl/YEpRbniLkoR+hI2LhX9/bn9/lHh1dniEjZpwUY2IioZ8fniUdmh3hoh+iomWi46RkpaMhIqIlYSbjYKEkpqWnp2UpKOoqaWknpuwqqGkpJGmqZaiqpyipqiJdm1mXltIUVFTTUlVTVJJTEtPSUhGSk5MTVRLUVBPRklDPTc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aco6edn6Gvoaeopaeor6yqtby2uLazwbu2qLnIuLaoqLW2qrK9pp6VjX+Jk6iWlYp+joOCfXdwb1hNS01NTkxNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DcnV9aWhcVJCJlIh0foaBfIWMk4KSmouPe4aPgHaAeHNvdnF0jo6Ben6Kq4V5e2h2e45wcm14gYuNknh6gHuAdnNyknhndYSEhIV8lYqIio2KgH+Ei42AlIR8gI+YlJyWkZ+dqZ6foJ2gqaWenZiNp6SSoKCWnp+kgXNoYV1cSldQUkdLWFJPSkxNUkpKSkxQSExRTFJUTUVIQjw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MjQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqqWtq7Cxqr20sry4trq0sZ+3urKqnZ2sqaiysKGakY2UgI2cjpF+doZ4fHZvb2lYS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedIJ7eGZ2jJaYjY58Z3mBdniAiZB9hJiSgXGHj3x3e29rfq19dJCLf3uGkoF8f3VmdnyGbG9nc3yJjIeAbHlxfXFtdo9xaHGBfo5wQ4uFgoOFfnd3eoyGfYx7dX2Oko+Yi5Kam6OWmZyanZ6hnJaNi6Wajp2XjpaYkHhvbWZjWlhYVVFKU1VUT1BOUFZLTktPT0pST0lOUExGRDw8Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpahprCsrquoqbGvsau8uKy7vrizrKebsKesm4+WnaWppKCYmY+FknmIjouKdXF7bXVwam1qWEtGR0VBQENESExMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOT1FUWF1lcHJsiKeqwH50eWJ7eG98eYmQen2Lhm9tjJJ5dHlqaoCCcZaRi4F+loBJkphuaHh+gm1pZGx5hZCShmtzbHxucnyGaW5wf3ONiYSGe35/e3ZvdHSGgnmBeXB8joyKk4OWl5iakJKWl5mXnZaMg4mekouSjYaQloBvam9ub1hWWFRSUVlPUlRUUlhVTU5ITUpNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WssKOtqqi1r66stL+rvMO/paKalaSYno2Ei5ShoZmZkZOLc456gIaMhnRvdGtwbGRsallOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcX6eHYZppc3llfm9tf3qLiXaCiIZ0bJqSdHN8amqdj015hZOJhI5nMXaGc2x+fYN0ZmV1f4SEhYBmaWx1a3GAfGhxcXxuk42PfHR+fXFwbnVtgn93eXVqeYmCiImDlpKSkIuNkZSUjpeNgHmIl4iGioaAkIh3a2tvaGVYUlpXWVlbTVBVVllYTklIRUpKSEdDQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW6SiJqRmZajqK2esZ6nuq+rsrDCsbvDx5qWj5SZi46FeoSQmJSNkIyPhnGHgnSHjIZ5cHJwb29kcGZfVEZJQz88Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7KgcXt4bH1scYOChYF6hIaGeXKhlXR4gHN1lIc1cZ2onY6hoYSihXZwh3yHfHSMro2JgGhnYmpucm1wgnVpb1h1cI6bkndsf3p9bXJucIB7c3ZuYnaDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY57c3FxbWBbXV5bWVhgX1JOW1pYV0xISkZKRz9DQUJIP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnn6+VpbSprrGuwbK7wcWWkIyUj4CIfG6BkJKJg4qHj4Z1goRslYiIe3R4eGx3bndjaV5KUEc+PzY0NDk7Ozs9PkBCRUhMTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0hMTU5QTDdDTVJTREqGdoB8fHZ+bHaIiHx+hYN/jH51opl5foaBhJmEmpxhhqqfnYuDkI16d4h+iYmOc4uXj4R6XWRxdHp8d4ptaGpieW+FkIJ6boF3dIR6cHR5eGtuaV12hnyHfIeHjn+KkpeDjYWMhn1xhH+EfXV3e3yJd3BzdGZnYFtbXlNbZ15XUFRYW1VHSkpES0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJGcnZ+mkaCqoLGor8Cyu8W6lo6RlId7hnZrf4yRgn2KhI+MeIOAc6CEin18gX9wgH56Z3ZrUldMQEUyMTEzNjY2ODg6PD5BRUdGR0pLTU9RUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaISIe4l5fHF8j4x6fYmHfpeHdqGZiIePkpSljayqSIaur6+LgYCTi4KLgoSSqYeAmJiKm3RtfIGGh32OaGdoeX9uhYeChXGEhkdsgHdyeXZobWtfdn2CiH+HhIt5lJ2ciYuIkX96dYt2fHhtb3d+gHR0cmxbXl5bY2NYZ2VbVE9QVllQRExLRk5JQ0ZDQ0BAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkY6Wl5KXoJ6toaa4r7O9s5eNkouYi310cH6Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTI0NjY4Oj0+P0JFR0hKTU5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BYcFlcXmmNk4eVgISChZGTfoWIkYGalYKhoZiVm5umrZOau7Gnu8fDqIuMoaWPlIqBkXxxg56fkZx/doaFi5CHkGlocISBdI2HhIpxhoJ3h397doV9bnZ1Zn+UjoaJiIeIh6CropaJjpd/eoKIeXlvZ2t4fnt+dGxlXltbXmpdYWZgWk9LTldSUUlQSkROR0NKREJBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmd4N7gIx/gZCOipqbpJ2hrKarr7CXkZGEoZSEeHd/jJR8fpKFkpV/ioCSm46DgIGMioKJjYN/ioBtcGpdQkA0LS0vLy4uMDIyMzQ3Nzk7PT9CREhJTlFSU1JTU1RSUE9IREI8ODcvOUQ+PDw2My5sk5dNUElJS0tLTlZfY39nZ211nZuPmpKTi42OmoiTj52LoKCSo6qlo6yTqbaiqMHCrseveLqUmnyNoZ6ZhJOFgo6in5OYkoSKhY+ZkZZscHWKjIKWjI2Od4+EcW2FgYqWkYOFiHGIoJWGkomOj5aktambjZSig4eTg31/a2pqfIGBgnRiXmRgW2drXWxrXldLR05SUU1MTEZJUENETUZBQ0VGQj05OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcXaShn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReX+SiJGSfYqEmJKQgoCAi4yJhZCHhYmFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5QUlRQUFFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6elopmhl6KUnJ6onqirn6isqaq2l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqbmaeRkYiVopubeHp+lJiSoZOXl4GUnnt3lZKrsoiNl598lJ6bjpKVmKOiprawnZGZqIeWj42BiGxzc32AfXJpYF1iYGJoZGBnZltSRUpLUE9JSUxGRk1DSExGR0RCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImLioSShYOGiYGAhnZeYlA0NjAtMS8sLjAwLy8uLjAwMTU+QUJNUVJTUVJTVFJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk5PUVlthZB3lYqjp6q0vbikraysp6i0q7C2srKtu7GzvZyzw6u6ycu3w7+4paKws6ytqqOLlpiFpqago5eBppmNoquopYiFlKShoKuhpKmPm7CLlaOmt7qboKOwkqKdop6Qo6Grr6yytaKUpKqImYmSiZV6en2Ff2hhaFxlY15kZF5mZ19aT0NJSFNORkhMRkpHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGNXaW9YeoV2gZOFh4Kbg5KQjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkI6DhYGMhYaHkoaChImGiIeHcG5hQEU2NDwyLzExMC0sKy0xLi00P0NBTVVRUlNVVVZVTltQR0dEPD4+RkhDRUE3Ozw1Qzs9RktJR0hST1BXgZKghK6js6qywMfDqrPFtqyzv7O4vra/tMG2u7qjuMWotsnHtb65taijtK2wsZuZkpqfiKevq6WUdp+kl6GssrSZlqquqK62u7K6rK+1orGrsbW7t7SutKCnqKOnmqmvrbK5t7inm7aojKSOkZKfhniCg3ZaYmVXZmJiZGBgZmBbVElERExVUUhJSkRJR0VBQEBLREJNRzw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtaUWJjV3l1cYGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomIeYaAjJKMh4WBjn+BiY6GgIaIhYqHkXp4bl1WQEVOPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcVk9eVUlLSkFAP0dLRkZEOz5AN0Q3P0JKSkVGV1RQXo+kraOxtMO2uMHMyba7xL2zs8C2uMG1vq+3dLGzpbrEpLDGubGzsbSopLW2qrGgopabopKlsK6mraynpJigrLS7oqiyurW8v8y/xcW9vbPCt7q4vre6t7msrLCmsaqtvbC8u8LCrJm6qJOtj5eXqol9gn1rV2RiWWtlamZXXGNZVlNJR0ZMUUdDSElBSEQ+P0JCS0BATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1NZVVp2anB+joSAjYNuenN4h2K5oZmjiZSUlpKUk42QlpKHhnuGgY2VioCEgYp6fIqHhn2Kg4GKg5V9d3p1ZU9cZEdFTDtRY2FbXlNGPztIUEVaY1FSWVhaZ1lUYGBNU1BFQT9JS0hFRUFAQzxFNkI+SEdKTFNaVF2Trri1urjIv7q9ycy7vMC7t7W7ura9tLqxxmB1sqSxmp6rvaqlqKurpKKytaCrp5+Vlp+Yn66lp6aln6OUo6extKeys722wb7TycnTx8LFzMLKw8C+vb+7vLe0r7i3tsO5xb3CyLCeuamhq46kp7aIgYFzYGNiXlhiYGlnUlhgVlFVSUVFTktAPkdEPUpBPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3MzQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhY9zbHJzc4fVwLWZoI2VmJmRjpeRlpaOhod9hoOMlot+g4CDeHuLg4d8i3mBioKXfnR9emtlcHVZXVxQZWRiYGVkXVtYV1xNZG1VUm1tX25fWGdkVVlVSkRCS0tIRkhISEdBSTlEP0hLVFRWXFpbk7nAuL23xsC7ucrKura5tbi5sre1tK62tplkdaicrXBeoqycmKCim6Seq6WUn5+QlI6WmJenn6WfnpqZg6SdrKWqsK24sL251NHO1tDJzNLMz87Kxr+/wsq9wbzBwMTExcq+yM6zpLuwtK+aq7i7mYB7bV9hXVleYVpjY1BbYFNQS0NBRUZFPEBFPkFIQUBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTREM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRXFloX2+XkpCUbmxvdXWHs6yhoJ+LmZyZjI2VkZuShYqKfoiHi5CLiHyBhHN7ioOFe4l0gYmHlX9ze3lrbXV7aHJlaWxpZmppaGBmaWlsWm1zlq2kvIiHZ1tvaF1aWlRIS05PSktQS1NRSExBSkdKT19eYmZpYZe3x7C4sru9tbHExrWwuLCvu6uysaert6uNtaedmqeaTpqdjI6flpGmmKWVipOTiZCJkJGRnZuhl5qVloeemqebrK+osKe0tNTU1NbSy8/U1c3Tz83FwsnQv8rJysnRx8zNwtDSuK/DvMS5pba6w6KDcGVeXl5ZYFdZZlpRXVdPUEJCSEVCSDtBQz5BRz8/QTg7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVZzkJCYgmhxb3l5g6CqnqWWjJqbl4uNlZGajn2Ji4WNioqKkId8hIJwf4iBhnuHcoORi499cXh1a3F4fnF7bnhzbGiBcG1jam1weGl3fH7Lv8Hfp25jeG5jW2FgSlBSVU5ZXlBdXE5QTlRRVVRcbm12gnGWrbistKavtqqsvMCwq7SmpLimq66gq7SjjrGtmpeYjJGTkYSOm4GNppGciYOLhIqJhIuDlJWXl5OckZyYmZmfnquspKeirK3P0tXRzcvS09TQ1NHOyMPU0cfN0tPT18zR0cXS1sXAzsfHwqi+t8+eenBmX2NdV2BTXVpQUVRQT0g+QEZBQkU8QEI+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU5bdYaFindsd3B9fn+hnp6hi4yYk5OMi5OPloR5hZCQjYuKh5GHf4J7cn6AgYd6hHWFk5CIf292cmtzfHx3e3OBd3FqgHNyaXBxenlyer7Lmn6MsoR2coR2aGFrXUNaWltWZWNYZGpTWF1dYGReY3h6fouBmKmjpKGfoKilqrC4qqWzo6GtoaOtoaexn4mmmpOSkYmRj4iBlIlqlKKMmYSAhX6Rg4OTlq2LlY2Vmo6GkpGel6ewoaChpaSoyM7PyMLL0dTR1NPO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsw8PMjHRwZGFgWFRZVFxQS0dKSkpAOzo7REFEPEJDPkdCPkJCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnZWdlIWLlYmPioiOh49/eIOUmIqNiIiLiX6CeHN7fYOHd396h5GWgINud3BtdX92eH10hXx5bId2dG59doR1eHydtYw7QYrFpX6MfGllV0lDZmNlY2dqZG54W15maGtuaW6Ag4iRi5ydoJ2Ql5ieo6OmsaOjs5+hpZ2gqaCjsZyGnpKSkpCKjouGg4+EfpybjI2ChIV6lH6CqZWjjJGKl5KLfZeKmpKrs5ianKicp73Dxrm2xs3S0NLQzNLLydTO0NXa19fY1NnYzdjbzsnZ2tHWvsvMtHl3cGZeW1NWUltWRkdKSUVFPTo3OkBAQjpHRD9EQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfJeRnYt+h5KDiYaFiYKHfHiFlpaIj4OHhYZ6hHlxenuEhnV6hY6NnXmLcHxvb3p/cXuBcYOHgG6OenV3fXyCdX57hoevc1ipwraNkYJwbmI9XmhycHFwbnh2gWVob3J1eHF6jIeOk5GblZ+Vh4yTm6CbnqqfoKycoZqYn6aen6uZi5qMkJGNhH2Ih4OFi46gmZOIg4d+bZl5hJiGiJOMjZSMhnybiJSPrqqUlZifmaeutb2prb7Hy8nJzMvQycPSytTX2NfY19Xb19PZ29XQ29rR1sjUy5V7fWppXFtQU1ReSENGSUg+QT49Nzo9Pzs9Rz0/QUFBREE+Pjo4NkRCNzU1NDc5LjU2NjQzNTU0MjMyMzY0NjU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw6OkQ/Q0dSa19tZGJma3aAiHGRkJqAeoCNfoKCgYR/g3x8hJiOh4t+hoaAd4J5b3t7h4J0epKejaB2jnWCdHWBfXSAhG+Bj4FvkoV0fICEenaGe4i3xaTBybiClpuPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aUlY+XkIOJjpaZl5alnJeflp6SkpejnZmrlZCQiY2RgoyFiIiBhpCRnpuZiYWMgYaXeoiIn5ePiI2Ki4J9oYmQi7yhmJOXmpyppqWun6i2v8DAucfJzc7FzcnR1tXV2dXX29TX2drb19va2tjO3MaHfXtpa2dhVFhVVU1MRE5DOz09PDg6PD45PUA2PT9APD8+PDk4NjdEQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTU1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6inx+gH5/fIR7foKRiYSFeoSHenV9dG18fYZ+c36SnZGeg5F8hn54jn14iopugpqAdJmGfYGIhHt9kHqPqI6Pw6G9jJyjnX2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJKFiYqQkpWPnZqTlJCWjIuVn5yUoJSRjY2Pin6Qjo6LhImSlpqen4mMlJKdkYKLf6WZiISNg4aEgKWHi4u4mJ2RlJaip6Gdnp2jr7e6tazAxcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u4ent6bWtnWGBcU1BPSUNMQj08Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODY4OT89RFJTUlhfVlhmbW1taYGPinFzeYp7en98f3uHe3x7i4eBfnWDhXlyenNtgH6EfneFm6GanpSSgIyIf5iHgJuSboeohXqgi3yRjYKIhJt9mpCKjKOioJCkrqCLkYuFjIGThldyrYufq5uPg5ibj4+OXIKikYKMn5OUjIaIjJKTjJSUlI+Lj4mHlpudj5WWkIuSk4WAi4iSjYqKnZaZoqOGk52WoIqJiI2ckIOIj4CDiIWkhoyQs5idkpSXoaGemZKcnaiyuaymvcLHzsfGz8zQzM7X0NHUrtbV2NrY2trX1tnZn3F/dmloX15YVFdYQ0BIQz4+Pjo0OTo7Nzo7OjM7Oz89Pjc7OToxOkg+OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J5bWJ+koNvbXiLeHl/eoF8hnx7d4aEf3NwhYJ6dXZ2dISDhX1+kqajn6WiloqdkJSXi4qol3KKsY2Ep5KEmZOEmYyilZ+Yk4manqOSqa+fkJWQjY6IloxujbeFmsTIspuhpZucmJaQspFkpM3HlY6Gh4mQko2Nk5SJhYqJhZaZm4+QlJOGlJeEf4+LmYiNkKqXl6OjiJmflpqIjoeXl4qEjo2Bf4iQpYmNk6mal5OWmaGZn5mTnZujs7Smo7zBvsjFxcnIycLK083N1KnS0dbW1tja1NPazoNzgWllYF9fT0pVW0JBRkM7QT04Mzc7PDo4PTY0OTo8OjgyPzk6MjpJOj02N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ1go59fG1+iHh6fnqBgYJ+dnaAgntsbot/eXx4eHyEh4t+i6OzqKOrsqGWp6ClpJaVrqKDkLeVkrOZjaGgi6Sbr6KknZiQp5apma2vpJeVlZSQi5ialqDAjqPJuKuaoqWtmZGbnLKdhoWoopyYhYiJjpWNi5OPh4GGh4iTmJSMi5OThpSYhoORkJx0kZmylpekoYicmZOPipCLl5qJipaOhn2MmZ+KkJCcmpmTmJiflKCdlZ+bobKuo6W3vrTFx8S9w8O/xs7KydKnzs3T0tDW2NLP2Ltze3deYldiWFBISk9FQkNENT46NzY6Pzs8Nz00MjY2OTc3ND01PDU8TDw+OzxCQTc1PDs0Mjc3P0A2Pz83ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER05bXFlKZ2E7SISLentthYZ5fIR4gIWBfXB4fX18b3ONen2Be3iGi4mFhJKou62osr2vpa6zs6ijorCsipq1nqK4pZWspJeprbempKOfmamYqqSvsKmamZyUlZGYoJeZu7utyaBptrirsJWYn6Krkpe9o16qsoKJio2Vh5F8j459g4aNj5SUiIeSlouPlY2LjZeZkp2as5aVq56Lm5SSjZCSjJibipKekIyJlZ+ijZWOmJqdk5uYnpShoJScnKWvqKKls7irwsjEtbu9u8XIyMLRocbJzc3E1tbQy9OicXxqXlxVYFJQRkQ+PUNBQjg/ODc0PkY8PDY8MzUzNTU0NTNCMzo6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pj00N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZUhiYGNwSkCLin6AcoaHfIGJdYKKgn5tfX18f3B3h3eNgYd7jY+Mhoyaq8LAsL7Gu7K0wby0rauztoyosq6uvaqbu6Sorbm3q6amoqGjo6mvsrGqnZykmJuYl56ipaWSo7muqMC7rK2yuaWkp32IhpytvbCDi4yLkIOPg5GPeoGHkI2OnIiIj5eNi5WXlJCalpynmrGakaudjpmPko6VkJCWl4+RoJGIlZukrJSWj5ScnpSgnpuYoKGUmp6op6Sho7CypsHGw7Cwu7bFxMO+zafHw8fDvNXQzcTKiXV0ZF5cYVxPS0JMQEVGPkE/Qjs6ND5BPT01PTY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGdHYGlnWl1bk4yMiHuHi4aDjHWGkIqBbn58gn9xfoF6lXqSlJSYkZOVp7TGycDCzMHDuci8uq+rubuXsra6s8CupcCkqrC7u6quq6KinqerrrWwqpugqpyinJWesLSni6K6urXBu6uonLKkpKiUhI6pw8SkgouOh4iEhpWUjXqDjJGPkaGMjJSRj4mYoJeSmZSXpqCunYyqnI6Vj5KRlZWOkJWRj6GUhpefoLOelJuUoKGZpJ+aoJyglJiepqSmp6SvraW/xMKuqbe1ycO+ts6yxb7DvLPRysjBtXZ6bl5aXWxUTklDTEpKSUBBPUNEPDVBRDs6Mz04QjMzMjI2MkEwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmdcTWVcZlRjapmNlomLiJKPhol5hpOQgXKAfI1+d4eBgpB6jaGWqJqamLq+yMjKwtLJysLNvMGzrbu+p7q/vrzDt6zBqayzu72qsKmkpaOrrrSutrWgn66fpqKYo7S9qZuovMCjtravq5KvrKqrloaaqaalkYKMk6WViYB1ipJ5hY2RkJ6fk46Ui4+NlKOZl5uUlKOeqZ+RpZqMj4+PlZaIfY+VkpKjmpWgopy1ppGfl6Wko6WenqaYnpWXm6Wjqaiisqyou8DEr6Wzt8zAua7Ds7u+wbitwsLBwJlwe2NaWF1cTUxNSUdEQ0hCQkFDSzo0REg6OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5rSV9YYVpkZVaej52Ol46ekomKf4mfkoR4hX+Vfn+QiIqQgJWgma6no5jCvcjEyMbTzc7Ny7zCt7C6vLS8yrzDwba2u62zv7m8ra+ooKmntq2uqbK3mp6toqihnau3uKmlr77Esb25s6eps7OtrpaVpaynoJGOkrHFp5WNfJGVfYeRmY+qmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi4yPj56IWpCXl5KWpZpmmKOfs6WWo5asraunm5+nmJmWmZWhpKimnrarqbq8w7WltLbLwbiqtqyzuriuqLi6vbiDbnBcWlZXT0dLU01LP0FIRURHRkc4NUZNOz43PkFKLjMyMDI1QjU1UFdOO0xGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhXOz1AQkZCckZpSVJlYkxGppSclqGXqZaMkIOHpZKIgYeCnISDlZCRlI6aop+vvq6hx73FxMfHzs7O0sq+u7axuru8vs62xL23uLeysrWzuLKrppyrq7iqqaevsJejrqSnpKW0wLCqrLO+wrnAubOnuLO3s66Vpa2urqSLk5WhjXPBmX2WmYSOlpqLsZWamZWSk5mapqOVoJuWmqicm6GgmYuMj5adYEqWnJqUmqWXVJawn6+cn6WUr6+tpZqhppSTmZmOnaCnopm0qaqzvby7q7Cyx8C4pqurrbGxo6GysrSkcnBnXlxQUk1FUFBQUTtIS0lGSEFDPjlLVD9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pWDs6QkNAPVJFV1JzYldGSKuXmZ+hqa+YkJeHi6eWjoiShZ+IhJyXj56gm6Oltcm0qca7w8TIysjHzM7Hvrqzr7m4wMHNtci6wLm1urGvr7K0p6ObqrS0qqmmrqyZpK6lpamtur+oq7a2vsG/vrizssKvt72ro660rLiliJuXppt2vqCEmJyOk5mai6+WoZybl5WboKGpnqigmZqqmaGnnpeQjZGdg252k6KalZ2in5CusqOrlamqmKuupaSfpamSkpmbiJScop6WsKepq7q3vrOyrr65tp+jp6ilp5ycrKmpjWVoY2BTTE1HSE5KVkw9TURNSUpBQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlNhTVZIf2VeSEaslJyhn7uvmJSei5Oqm5GSk4mrjYeinoykrJSjo7bHvbTBusLDyMnFws7Iwb25sq+5tMDCyrbGscC8tbqrqK2sr6OimKq0uqappqyqnaivp6Srq767qKy8s7e9xry2tbjAsL2/s6m0tqu+pI+il5Gin7yfiZmgmZaenY+3n6mcpaObnKKaqKWzoZudpZyoqp6ZlY+UmouXiY2kopScop+gta+lpZOxq5qsrJ+epKOpkpWVoIOQnp+clamloqG0tbq1rai1srOenKKmmpeVmaqhnndiXmBeS0lHSE1RSU1FRkZCUkpIQURHQVZTREg8QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZEQ5xwYkdFqJeknp7DrZuXpZeZqZyWmpqPqpaVqKaVrayZoaq2xMG8v7jBw8HIxL7Nxru+ubKwuLO/w8i1v6+8t7m3p6Sqq6ygoJqqqsSipaispp6sr6yiqqi+uKasvbC3tse2tLm4vrC+wba0srSvvqOWo5aTm5Stn5ChoqWjo5+QvqWpnamsnZ2hm6afvaKYpJ6iqauhnZaNlZ6Tn4ePhY2TnqSgnbWspZyWsqeZsKifmqqeoI2ZlZ+FjqGam5KlpJqYrLG2saqlqa2snJmgoZKOkJWpn5RpZFphXVBKSUtPTUhFQ0lAPU9IQDtHSUhbUk9LPUhOVTRCRjk+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZmNYTaKao5uexayhn6ydna2fkqOelqSgp6qsl7awo6qztsXCvcC2wMK8ycK+ysi2uLW0sLO0t8HGtr6wuLS6tqCnraqrnZ6fpaTBpaCqrqCkqa2voqanvbWlsbu3trXDsrO3ur6xw8C4uK2ztLWinKSVkZOgraCYoZ2pqKuimsOtqZ6srpubnpmmoL2hnaSYq6urpqGZjZqfkp6Jjld/lZ6moaC4qqeTmLajn7OioJuvl5+PmZSdgo+gl5aNoqSVkKaus6upoqKlpZWVnZmLj5GTpJ+JY2VbZGBMSUtLT0ZFQUZLPj1KQTk5SkpOXVFRSj1MV1w5Rkk9RE1JOEhjXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3NIRTY9dWVcTE+en6GYnsSnpaKzoZyyp5OqpJ+jn62prJ27sKistbLIw8HDs8LEvsfEvcTKvbCwtq6wta+/xbW5sLC6tq2aqbCpqZqepqGnwq2brLGcqqKusKmkp723pra6va+3xK2zs8K/scazurertLatqqKllZWUo6uhn5+ZqKuwrq67sqagqamZmZeToqS4oaGkkq6vrKSmn5KhnpWej5GNlJ2ao5+ntKenjJi0nKOwmp6brpGflJeUmoCSopaPjqChk4umrLClp6KcoJ6SkpuUhYuSjZyegGNmW2hmS0lNS1NCQ0BJRzs7Rj85OU5NVV5SU0o+T15ePUhQQk1MSTlOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tVXmZyQDg8SJZ3ZUE0n6Sfm5/CqKOqsaGjtKmWsqumoqSyrK6pu7KtsLS0xr/ExLXAxb7KxLXAyMK1q7WosLiswMS0t66strqlmauxq6mYn6aXrbu1m6iwm62frrSyp6q6s6e6sreyuMCqt7LCvLTFp76urbe1qaesoZeWkaWkoqKXmKSvuK2ytbagn6ikmZSVk6Oft6OkpZWusbKlqaWinpqampWYqJ+fmKKerrKipo2XrpmlrJeanqWRm46UmJqFlp+UjJCcnpSLqamroqehmZ6WjI+ZkIGGlomUn3lkaV1sak5QTk5UPUJBTkM7OklANzdRT11eUlZRQVdgXEJKU0hXS0g6VWRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzkwNnBbYkgwNUpwaVZDV0aMeWZDO6SjnKGlv6aor6+hqbWqnbmvq6SqtLexsLm2sLe4uMW9w8e9vMTCx8G5wcbBuqq2pa27rcHDt7eqrbK8o5WtsK2xlqWokaq5qqCnsJ2qn6+0s6qptrasu6uysrm3rLmwwbm9vqbDq7C3rqiqq6admJiqoaGgkZegsK6zq7C5mpupn5mWkpemoLappaKir7Gzq7Gnq5+boKCbnqWcoZedo7Owm5+QlKaaoamblaKflpiKlZiTlpedk4mQm5mUjqmpp6Ckm5ibk4eOmYt+jZaGjptraW1hbW5YUVFaVEFDRVVAOzpJQTc6WFBkXlBXV0RZXl5NTFJPX0tKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE3NDdnWWBGKEA4bH1oXFY6iXtjQz2on5yhqb2hqrCqo7G4qaW1squhrbW9r7O4vLq9t7bBw7/JxLnFw8HAuMW9wbivtqert7K8v761qa6yuJ+XrK2orZenqY6nu5+lrbOeq6KxsLOsqraztbytr7G1rLC1scC5xLarvK+xuKysqaKxpZ6kqJ+kl5CYn7Kqs6mqs5mdp5uZlI2gpaS0rqeirKyusaeyrLKpo5ufp6SdlaGYm6i1qZeZkZKfmZ+hnpCsn5iYhpWYi52anZOKjZaXmpenpqOgnZaVlpSBj5WFe4+ShIyWZmxzaHByX0dZZlZEQ05YRFo5SEI2Pl1SaFxOWV1HW15dTk1SWGRKSkNcY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19eYVYxNTE9YFZeOClDM1lVXGdLNYx6ZkxApJqgpKy3o6yppa6utqqutLmmp7C4xbext77BwrW0u8W+zMW5w8G6v7rEuMG5s7Wsqrq3u7q+taqtsbaYmKirqqubrKuPq72eq66xo6qfsa2zrq62srm2qa2usae1sLO6vMmyqrW0sbSvrqahs5+aqKygpZWVmpmxoq2gpa+WoaSZmZKNoqWmsqmhprGrqrWkrrC1r6OYna2nmpeemZmsuKKYk5CPmJyhmZeUrJ+dlIGTmY2enJqWkIqUkp6apaOioJmWkpKWe4uQhXuMioOLkmtueW51fGFGYGpaSUhaWz17SkdFNkFiVGlaTVxhSltdWlJSU2JhTEtFYGFgUExJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4qQS9KR1BbRzNjWVRLRJmXn6+osamspaOurrWptrS3o6y0t8m6tLu6v761tLfDwc3HvMS9t76/wLe/vbK9rqe6ure3wresrbG5lZemrquno7KqlK+6pK2ysaenorGzsbKxtbG4sqiuq7KnuK+1s8PFtqm0tauwramnorafnqaxoKSUm5mUsZ2nm5+pjaminZuVl6WlpLenorCzq6exp62wtaykmaGsqJucnZuUqriclY6Oi5mdopiQl6ein5aDkpaQnZyYl5aIl4+XmqedpKCSlpGQlnaEkId7hYKEjIxucXh2fH9dS2VsXEpPZFw/YntHSThHZ1dlW0xeYk1YWVdUWFRpXVBPSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5JZzI3J0ZhTFYlLUIuPUVMUTwzcmtLREORmKStpK2tq6ajsLKzqrawtp+rtbnJua7Bu8O3s7K1wsPPxMDBvbS9wL+6v72zxKiqubG2t7+9r6uzs52gp7CtpaawpZ6ytayrsrCsqai0uay0s7WstKypq6isqbmtsbDHvrikua+pra2mqK2wpaOjrqOpnJ2bmq+ZoqOio5Csn6Ogn6GppaW4pKu0tKSqq6isrravop2jqKqboJmakqS0mo+JjYeRo6CWjpSeoJWThY6Uk52bmZaUh5iSlZmnnKCfjZKRjpF3fo6FfHx9h4qJcXRzfn1+XFJkbl5OWmddRkSWW0c6Tm1YYVtNYGJOVldWV1RZZ15RUkxkWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQ2U7NipIZEhKKzpJPzNDSVMsPo9rPkhJj5qpqqGosKSoo7O0sbS1sbGhrK29y7quwbvGsbSttMLD0cTGvsCyvsLCvL+4vMWorbess7i8wbCrsq2hpKetqaiksKOrsaqvq7Gurq2rs7unt7GyqbKpqqalo626rKmxwrm0rLmoqKitqaexpamkoq6qqKKem6KslaSdl56Yq52hp6ihrKWjray3sbGgqaKfqq2wrJ2epqepmaOYmI+gp5iGg46Ki5+hkIyNl52QkIaIkZWgnZWYlYaWk5OXpZydnIuRkI2Kf3+HhXx3f4eFh3Vzcol2bF9ZYG5jUXNyXEs8hHxGP1d1WGBZT2RcTlVWVVdQXGFfU09OaFhXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSzAuSWdERjg8QjA1RUtYMUCUXEBNRpWWrKehqrKcqaiwtay4tK6qpKurvcm7sb63w6+wrbPExM7Ow7+/tMDDxLrAtMnErK+3rrK6wL+zrq6rpaiqsKmmqLKltK2qsK6tsa+zrLO6pLi0rKyup6ugop6wt6uqrbq2pLW1pKmnrKyqrKGopqaxsqSmpaGhq5apoJOaoKaeo6KqpKyinqaxt6ysoqWimqmqramcoaWko5igmpWPmJ2UgYKQiIWdoI2Kjo2aj5GLhI2YpJySkZuMk5GRlKOam5qLjouLfIeBgoJ7dYCEgX51d4ujh3lrXmBuZ1dmh2ROQGeSTERieldiWFJlVU1WVVVUT1xdYVVLTmlXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREhkFJSESWka+koqqwl6qorbWrtrCrpKuqqbzBwLi5s7y1prKvxMnL0b/Bu7nAwMK5wbrCxK6xtbK0vMG+s7KurausqLaqpa2wqrmvqLCwrrGrtaq2taa0tquspKmqnKOds7OoqKS0tKC2rqGpqKuoq6egqquoubapqqmpoamfrZuRqKGdoKOipqKpnZymtK6npamio5elpqeqnKKjo5+ZmJ+Rjo+Zjn6HjYeFnp6IhIqLj46RjYSGlaKajo2akZKRjpOfl5iWjYqDf3SHgX9/eHWDf3t4foCInY9wcmdncXhcYXSIaU9dmFZIbXlVZFZSY09MVVRVUU9YWmJWSFBqVFdTR1BZVUk+SUhPUVB4TU5WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDI/Zj1OWD9DLD9MVF8vSWs3UkU7lY2vn6WqrZmrpK2us7SuqqWvqam7vrvBsa+4raK1r8nHyNHAv726vMO9usPBwL+vsrOytr28wbKys6uzqaW1qaSts7O5r6KttbGvsbmquK6qrrarqp6qq6CjobauqKGer7KhtKqeqKeqo6qhoaytqL2vrK6soaenn6uYj6+imKKgqKefp5uZqbCoop+soaCSoaKjppiaqKWYmJidj4qHlYh9jYaEhaSXhoKCjIePjpGFhZWgl4mSnZGTkI2RnZWXj4qFhnhzgX99dXh6gHt0dHtqgoejdWleZWyBdWeIi3xSV3BeS3hzVGRTUV9NTVNaZ05MVlllWEdTalJSPkJOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaTozOF89YWQ/RjFDUFtbK0hPO1hCNI+OsJ+kpaqjpaOsprSzsKmksKequL7BvLCouaqnrrDJx8jQwr3Avrm+vrzJvMK5sbC1srq8ucCztLutuayjtaenrLK2ubKmp7q1rbS8r7ylra21q62cqa+kn6WsqqecnaqypLOomqqnqqSpnqKoqKm9q7SvrZ6po6Cum5qyopWkm6Sln6SamaiqpZ6aqaGbkZqgpJ2YlqmpkZmZk5CKgo+FfY+CgIiej4eAfoyHkY+QhYCUm5SGk6KMlJGLkZuSlYeJfoByenl+fGh3fHp1cHF+aYZ5hIhkYGhkcoV7bWd5XV5WQ1h7bVRhUFJYS0tNcHRdSFpbZ1lFVmdPQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOk7CZn5+ppaOhqqS2srGkqbGmrbnBvbWwo7mtqKiww8nJzMG3vcC1t7+6yLbDtbSztbK9ubq9tq25tr+torOnqquvtbe0qp26u6ixv7K5oK+0tqmsnq2xo5ylqKminZyksKavoJ+rqaehqZyjqKCtu6eusa6hqqKjrZ6erKWXn5ugopyfm5miqqKamaOjlZaTn6GWm5amrIuekZCRjIKLgH+PgXualI2JfX6Mh5CPjIqFkpiRh5SkipKSh5CakJOBiHx5bH12eXhie3pycHBzeGqCdGqCZ2NoYW5zjm1ianBgb0JdeWtWXk5QUUpJTFNZVk1cXm1XRFhhT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNRXT0jkpermJ+Xp6Ohn6ejt6+toq+vqau4wrqzrZ+5r6uotLrHyse/t8K+r7S+t8S2w7KwurKzwLW7vripubi9q6S1p6iqsK25sKmZubyjrr+0tKGut7Wnpqews6CfpaanoKWZnqyoqZ6gqq6noKaXoqifsLifpLGuoKyhrKSbpqaompqbnqOVnZyanammlpqeqJGXkpidk5mVoaqQmomNkId9iH+Cjnx8oYyNiXmDjYWKjY2FiJOajomVn4mRlYKMl42QfYR7c3B8cXN0YHl4am9wcXBqf3NjemxoZmRhZYeAYFtyanFNToBpWFpNUExKR1BSUUhNW19vVERYWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXFs1KJabpZiclayfn6GkobeqsKO0tKmpucW2sq6gt6ytrbC2xcfAt7/CubC1vLe/u7+vrL6ws7+xvcO5qbu6uKeotqinq7Css7Cmmby2pKu6ta6fsbivqaWnr7KboaSgo6ShlpuvpqGfo6ivoaCik6Okorawoaaxq5+soq6Xm6qkqJ6Xmp2kk5qbmp2lqZmbm6SUlJeUnI6Tl6KpoZCJio+FeoR+hIp6j5eKjYd6goiEiYyOhY6TmIyOlpmKj5Z/hpeLj3qAenBxdm5wdF94d2VtbGxraYRuZnJpa2ZpXWN0gWBba3ZpWkp/XltYT09LSEhSVUYyOV1ebVBEWFZZZU1ISUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVV1oRC48MmNWLDKVoqGXlJupnKShoqG3qa6gurilrL3Fs7Cuo7Wvra2vtMPDvLO/urews7m4uri6r67As7S5sL/BuKy9urWlorOqp6myq62xoZrAtaSntbWonrK8qailqa+smaOnnKSllJehsqWZn6SoqZyioJOkn6O4qKSnrqadpaGokp+ooaGgmJqcoJKam5afoaqbmpiglJCTlpmNlJKjqKSQiYmPhnmEe4SGfZ2OiYqHeoGEh4mJkYWVk5OMkJWUjY6Ue4KXjot3fntsdHFsbHNhd3RoaGpnZ2+FZ2hoY2ZpamBqY2lnW2V7Y2BTdFRcW1NMSkdJT1NAISpoXmpMQ1ZVXmBLSUdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnTycynqKjkY6jppuenp2jtaynqrq3p6zEwbawrKO1rqeur7fAv7yywbawrrK2tri2tq2qvbOusrG9v7iuvLuxpZ+2q6WltKmqrp6dwauopa+yqay1u56pqauxpZieqZ2npJGYpq2imJ6kqaGboZyWn52ntqWvqq6hoZ2doZSgpp+hoJmbmZyRmZ2UpZ2roZeWnJSSjJWXi4+YmqmgkYiJi4h5hXeCgoKdiIuCiX1/hYiGhpGElpWQjpCRkZGMknuDlY2Gc319Znhva2prZ3Vza2NnZGR2gGJlZmZlampka3JaX1ldbWRhTmlYW2BWSkdJS01SWD45X2xpSEJUU1xbSUhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQipKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNCaEglNZqjn5CLrKGYmJ+WpLOxorG9tqGxxry6sbGkt6yqrqm5vLu7rsCyrq6utq6yuLOoq7mxr66ztrq2sLi9raaetaugoLCkqq6cosCgsaSusK63rrWera+traKanaeppZ6Vmqeln5mkoqidmp+blJydrK+luqiuoqGamp2ZnqOapJ2XnpiblJmgkqiVqaeak5qakYuUmY2UlJmpp46NiomPfIJzgYGKmIWHfImJhYWKjIqShJSck5GPkJCWjpB/gIyNgnCAfmZ5bWhraWdxcmtcaGNjc4FhZmhqbmxnampobl1sbHRwYVVjaWRlWklGTE1PWFFRVmFlgVVAVlNZVEZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJzSRoZqNj7CdmpOhmaiyr5+4v7agtMK7vbmxprawqK6lt7i3t627r6yqq7aqs7itpbO1sq6psLe2sbO1uqepn7WonZ6ooqmtmqe+mK2jrq+0ta2sn7GtsKminJyjq6iblJymo52aqaKklpqfnJCbo6uqqbufp6SgmJmZnaGPa6GWmZxwgpWao391kamnnpSUnpCIl5mAloqhkHiGlIyDbmp+doNxbIaLhn2EjIdwXmNhZ4SYhmyLj5SSdHeLhH6Dj39nhoBndWhlV1xoc25OUGpjZ3KEZ19kZm5tal5fYYqPg4RlTktEOUZUZ15KR1BQVFVLSFJgb3RlRlpRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNTY4LCMxJzIxNDoxNzVYgWwxNk9rW05cS1tmYj5HMVFkPSoui6OZhpSwm5yToJuqraqjvcWvqbjCuL28rae2sKWrpLezsrOxua2ppqy0pq+1oqi4traop6y3s660rbOiqZ+zqp6hpJymppirupWmpa+ytq2upKmuq6yloZ+doKenm5egpaWbm6ennZOfn5iQnqeqo7Wvo6OjnJaXl5ejiKGOkpqHoYeTnKB/pH+lqp6SkZqRiIRyeI2OhYihdoiMaZeIZn1yeKFviIeEfo59f6GgoJmAfIeedIeOdpuKbIeBg2xoZWN6a3FhU4VtY2xpmHFZanFvh1heaVtra1uIcW56coVnhoRaXkdOP0dfTUZSVlZRUVJXVGdeTVdJUlNPRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcwKIumloOcq52ZmJ2fqqqnqr/Dr7G6vbfAv6qlt7CpraaztK6vs7erqaWxraW0s5yttba0pqeos7Gtsqiunqugsqigo6KaoKGarbOUo6WltbynrKerqqyopaGgmKCmo5mZpaOkmJujqZaUo5yUk6SlpqG3o6OgpJiUk5eTm4iuj5iUiamLl6GbhbGAo6ydk5mdlHmC1KiAh5XBm8d5eLGlt5dkgMCcv3mEhHmQhHyQkJHKcZe8nMV6crWmu5B7gGyWsauweGhrWLGubmVpvJK8bmh6bnKP2H5TamK2sn+BcpV0mqGqkFdPV2JQVk5GVFtYUVBSjFxXXFBAXERRTkRHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGNppKAp6qfl5ydpa2yqLHCvbK1wLW3vsKrprOtrKmnrrOpr7a0p6emtKWnuK6cs7K2qqWkp7KurrGmqp6npLGjop+el5qenK6rlJ2in7O6o6qpoq2upaGdmpqhp5+Xm6egn5idpqeRnKeak52hpqKgsKKfn6OWlZKYkpmFr2pqio2qfmeDlYatZHCdnZSZpZRxrqGkfni7fWuhj3axX2q0W6WAZpyRYGaCemZ/anhrqWS+cmemjHWxanyxeHSSk2NtbaduW4SgRWhmh5ZFdZxgfmd8pKeCWV+Lq2mAlnh5aqc3Sq9cWFNsZFtLTldfXFdWO06JT1hXL0lUVElDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzAbkKKVgqynpZ6jpKqyt6y0vb6wtsSyt7rCpqmwq66oqbCuo7C6r6OkrrKjqbionrOysKOloKqtr6yvpqefo6Kwm6Kbl5WWmpqspZaboZ6zs6KrnKKtraCdmZegoaicmZ2jn5yZoKWkj52impegn6qepqagm5+hlZWRlpGahbWbtXiFqZm1mXaGs5u3fpOWlqiUfmuBpnuChoiSlJJ3q2drsVure4+HlHSJcY+GgH+IkJd4goKLmIyDoI+EsHZ3n3Fra2x8i06kWEhjY5l+Y2imYHlydVOSh15QqW1jcX6HgGKcLlGhb1tTa2hgTEtbZFhcWkI+sXlYWEEjTWhFQkVBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjhhVTUwG5WflYezpqahrqmnsqypu7bCsLvCrbi3wKqsra2upq2xqaGvvKqhp7Sto6u1pKazs6ejop2nqrKosKelnp+fr5afmJSVlZedrKGZmaSotK+iqY+pqKqbnZWYoKWnmp+cop+boKOko5Wbn5eZnaKpm6WZnJyioJeTkZOSnIPVk5m5cLDCfsWGfNaUm7t8mpWkj42cjaR7joekgqWCeqx5j51Wr3qIfp9quVq5doeEfaaCk3yYeqp5jZ2Qe7FujoR0kLyFb5RQr6fFilGgemNgqWN0cohtl4hgU7W0yIaAiXxjpDNCnXZdUGppZFBAWGdaZGFKSE5tTVtST1lmWkNEP0U/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVE3MSWbopOYsaiopbOqpbSppLy3wbC5wLG1tLuztaexsKOwsqafrraomqe5rqOvsaCztLCgpJ6fp6mwqbSopJudnquXmJeWl5WVoKqcmZanrbCpo56PrKKolp2XnKGloZiioaGhmqGip5ueoZ6UmZumoJynlZubn6GZj5GUkZyIsm5otXGrh26OpnK0c3K2e5qXpIuPnY2jf5GhpX6wdoOR0tF2XK57hX+kb5uqpmuHhX2tfZeZj3uxc5Kdj3mzZZZ0hJ5vnmaUUsiLWsJcn3liX61gdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9rYGxoUFVHSTg9VlFaV1hJQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFNNjIwoZ2Spa+tpKq8raa1pae2u7yyur+3tbS6urOltLShsbGin6ywpJemuq6ksbCctLiqn6adoamksqisqaSZm5qonpWUmJmSkqKnn5aSpaqwpqKWk62fpZKUoJukpp+UmqWmoZqin62aoJ6dkJWboZ6cpZWdlpmin5WYlZGahax7d6h2o46IhqlvrYqCp4OYmKGJkpqKon+TmYmuhX+Cs1xys1KufYOCpH9x1314hX6PnoaZmXevhoqRnIh4s2GaZZqBgpRsklqwWEuadZh5ZmCtX3d3h2iYiGtdr3eVno94bDV5yK6yX0JTb15nYEVQbV9wbVZVTS5lY2hSWFE7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSTo5OZ+dlJ+4sJe0wa2os6ipsrq3s7i/ubeytby1pLezn7Ssn5+orJ+Up7WrqLGxq620pJupoKCoobanpqmimZ2VpaGTkpuYkpSipZqSkKasr6aglZmpn6KOkaKZqKWglZqlqJ2cpJ6snaGdoI2UnpqdoZiZnJaXoaCTmJCmnoapfX2leKGPjoOqcK2LgaeGlp+hiZeXiKOCkYiUqnyAi515b7FaqIKCiKB5dNh/doh0qIKOm42So3yWkJ+Ee7JenGSgfoOVbJJcq1tak3+Rf2hnqmRye4FrmIdzXaxaiaCOa29lT0pDoVxbTHRdYmZNW2FfcnNfSlY2SpuTWEhFPUdGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MyPzihnZmZv6uXtMKurK2pprSwt7G1v7m5srC3u6m6tJ+wpJ6lp6eek6qwqa+qtayqr6GYoaCmpaS6oqOroJabkaKglJOempSXnp+PjYuor6+mnZabqKafjJKkl6irp5SXqaeenqCjraShnqGNlaGYn6CSnZeclZ2hlZaOq5uPrm1ytHKpjHaKpnO0eHOzgJGko5KcjYmkh5B3uG+Me4uia2u2WqCFZZeXaaGip22TcrR0k5h/smqFkoita3WzYZ1mom+HkmqXXK1fTaF8h5FSc6Nten9+b5iHcVyvVjycd2VUb24uXKdPY1JrZWJtWmNdYHB7Y1NaUT4+bW8zQ0JAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4pZqbnbuhnLLArq6rq6e3qbivtcC1vLCvubirwbapqaCbpqOinZGqqqi2o7Knr6qgl5ynoKSruJ2jrZuWmY+lopWMnaGbmJyfkZOUq7Wwp5mUnKyql4yTpZmlraKRlqqxpJ+epquwmKGjkJmilp+blpyXoZKcqZyUkKqZh9SSmrtzsMOAw4Z+1ZabuHiIkJiMmIqMp4h6o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZWBrKlxe391vIinoGmdYaaOr6F+jHSHqn2+bnO8dLKDdXiBim6aiHFujaR0vV53fVthebxrWlZbanpeamFlZ2JteG9ZW1lDQUByQENHKzVHIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaebnqG8opexw7Ctqqqssae4r7bEsbqxrrqvrsCxq6SinqOinJuQqaSqsqS1pq2ln5aZqpmmrLicoq6YlKCQpZ+SjJyjnpedm5GVkq+5sqyVl6Onp5OQlqScpKyekaCoq5+bn6ijs56jpY6noZSimpyYlaOYj7CgkpSpnoWQmbWAkJGMt5V4gpOatXdta25zb3mPhI6JdJ7Bu72ae4GyqHCAdJG5g3yGhoyGjXuKh42XfKS7ub2cdXq0o3R2l3V0sHWZnmaGaY21dHJwd7aMXoB6fYpog3lteWOLrHB1hX9aW6dqRWVaVGZgY11jUWdncGx1Qk1QTEQ6Wk0/SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JXOCpPXl09KzpWVic+OzynnqChv6WWtMK0rKqorKupu66wxa60sq63p7S4ramioaWeoJ2Zk6ukraqmtainn5uWoKOdq6S9pqCql5SckKGakY+iqKGTnZiTl5SytbetmJ2jo6KKkpKmm6Wqm5appKWcmqGopqajqaGRrZ6Wo56Xl5edno+wqJSbp6GOan5pnKZ4h3J9mo50emSHe72+wLpvkoJxlYdhc2paXpuKYWOIjpVrYICVZG2dd2KVa4CalZRlXmFjcZqKaXKMfYWVZ2p+cnR4fX1iW3d0gWhQXG6EfXyLa1hseoJzSkpvhnBNdU1FV11nYUxaV2djX09bbXVqcVJPREVOO0hIPUw/Mi0yQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF9MKDM9W08nPzI+qKCoocKjmrS5tqOspa6nqLWyq8irsLOrtKO+sbKmoKKonaObmZmspq+kpLWppZuXlaGapq2ovaeoppWTm5WfmZKXpKmokJ2Rj5icsLK/rJunnaahiJORqZqoo5qbrJ+jmZqjp6yin6uimrGblaegl5Wdn52XsaSXoaiZnJGdnKKkmKaimpyampmPlYFnbX1xd5KXlJGFi7WqjYaYlY6KjJiXh5SVioSSlJGJjpKUmJSYl5qgopqclKGejYJ6pIZsanyQfIB0iYqBcYJ4eXZ2i4B8imtzgXSDdWV2fXdrcHttYGNdcGhNWFpmamBXWm95bW1mU09GUzlPWU1STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLOhs6G/oaSxsregqaWyp6WwtarIq6ywpbWmwKe0oJ2kpJyjlZWgqqeso6O2q5+ZlpWflq2ppcCeq6SVkpyXnZeSk6KfnqKnk5GZqKeyxK+aq5yqnpCWlqidqpucoKyYoZucoqSvpqGlqJ+umJennZmaoJ6enK+gnKGmlZiSmJOgoZWjnpegjpaTioqNjpatj3yVm4KSgouqqIaBmZeKhI+fiHuEkIeGmpKIhoqVj5uXjZGYnqSWmpORno1/jmahs6+FioR2epCKfHZ5em9mepGBgIlrdYF5iHNpc396dYOHgmt0ZHlmYGllY2Rma1lse3BpalxTTFBEX1RFQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvv6yrrrKxoKqmsa2irLOwxLCqq6OzrryjtJufpqKhnJmXp6WppqSlsrSelZSdmZmwpq2+oKuikJGdmpmUkZSinJeonISeqquis8izn6qkqpaWl5qnnaian6Srk56enaCpr6mlo6uirpufoKGYpJ6cn52vo5ieqJOYl5yRpJmYqJ2al2WCknxlfo2Zj2N5jWxoa3uSpKpqZZqYfmeGimVlaWh7jqGPa2iNl5Gjd2tqi5mjnplzbG57hI2HelhlXoaCXmyLiYB2XGhzd3eSgIeCbniCeIBzbXmEdHeJiI6De2mGWV5rdGRdc4lpa31xa2NeUk5XSmRYQUo0PUY3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvrLOwqqWora2wp62tsLyxqaekra+wn62XoKOdopmZpqucraOlqKmyrZ6Vo5Cir6a2uaWuo46OmqGZk5KaoJmZpZV7pa2iqLPEuKSip6+enZSeop6jnKOpqZKeoZ2gqrCqq6SqoKqbp5+ooKyWoZulsKSXm6qVoZ6bkqWXnqqYnn69g4dytHKEnYWtaHi5xLhxk6KjeqaZmXOqgnzLwMC7cYyiiIKffZaYiZ3AvYKXnZ2NncLBfIJ8ko2aw8B9a6Wyb4yBb8p6f5t3koOOgXZ6gYB5cXp/h3F4hY2TeW13lGNmX3lkYGWCY150aGxkYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlEvI0ZbM1BZL1VBQjsvOJajucO0sLDAqaiUo6+psK6tprO0r6mlpqaxq5+rmJqin5yaqqeinayjpaikpLSknaKTpq2rt7OnrqKRkZmdpZKQn6GYm5+dh6espKutwMCxoKmvqZeRnp2hmaKjqqOToKGdnq2uqayno6Onoaalna2pkqSaqK2pm5ypnKyhlpallaGil5x/zpR4eqSBeZSWm1+uj16Op4GioH2nlpx0q4OAr15jjap7p4eFoHSXk4izY4KrhqGNjbNqha90fZeIuGGDrVmjzW2QdXvae3+ZcH6IknZ+ZXuIdnZrfIhvfoWRkn5tgo9gcmxwZ2BfeWRccWhqY2ZgUlRSV11LT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1LMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaSqqK20q6WyrKyrpKumsKqgp5uZpZecoq+foJ+op6OloZ+wrJqdlaeurbGrqKyglJKbn6SSj56lmJ2no56upKuwqcDHs6ipsa6Wkp2boZefqaqflKCfnZ2usKerqZynqKSiq5Oss5eloqqpnaOmpaGwoJKZppmgmpSUkZegcYWMl3SEqIdxsXydcax+oZ6BpY+ed6qCfa1/nHOtfquHhp92mJJ7fJd+qoiijJGMnX6re4mUj5+Ae61WnMR6j2+SwX2BlW11b4xtZXZlhm9hd25yb4qLkpCDbZKQZnB1dXBgZ21lX29paW5nY1dTXGFZUlNDOElJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNTGxrK0oJyjjqOjoqyvtq+osaaoqqetq6unoqOdmaKVoKWqn6GloKioop+dsKyXmpaop6+sqKapnpeUmqOhkZOgrZudpqOvrKOstaq6zrKtpq2slpWcnaKYnq6snZagmZ6fqrKpqqqbrKuko6ybr7GiqKuupZimqqmpsaKSlqOkmpSShaRqpHWJeql0erJwgqaKmYxxiKCah6RgYVKrhH+ug5t2rYGmhoafepmXhntmgKOJpJmGgqR9qX+ClYeuXn2pVZ2ikoF6op+Ae8OvxYtyr7OzuXFiqa/CdGiNjJiPgW2alHBueXh4b2xmZWVxcGZ8aWJdV2BpWFhVTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8PJ1tW/oZmrp6Gvop6wtLCvqa2ip6aqq6uppKagm6SenaanpqOcq5qirKGkn6+inJuTqqS1sK+gqZudlpSmopCaoqigoKWcsKakqLKtt8mytaqrqZWRnZyimJ+ls52aoJSdn6esrKSumq2ro6OqorOuoqqzsaGaqaiur7aikpaip5ibkXyqbJ6Eh3WreXywb4Kki4mflpaflIHSuLS4yYCBsl9glKmDo4iHoHqYlpp4qsl0maSVqKqRk5qMgJuKmcbGeGahgqVzgZ+Ogn2vXXC0YrB1S6OGbadHgpNkj5Ceknxxl5OAcXt1fntuW2ZqcnBlgWpfYVhkbVxeWUlOTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2ps62spaKcsrmsqqGmmqilqquqp6CmpZiqo5+vq52moKyanqmlnae1n6KXk6mqtrKsnKWbn5SPpayRmZuno6Cppq6hpKeqsLXCsrOqraiTiZedpJqho66mmKGVmZympqybsJ2uqaeerKS3rKCxua+dm66nsrOzpJSXp6KZn46CnU54moF/n3qDo32DpISGpp6cnpOEuHt8ebmCfszGwrZ4m6GQi59+mpaXinaemIqlmKSpf7CFnYWfhKx9mpRipWykcI+FkIF9loJyrGCjc3GAmmC8fVJVdY+SpJd7fpOSi3V7c4V/cVxtbnhyaoFvW2RfaG5iZF1LTFFUQUlIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDg4Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7mqr6Cboayzs6WfoJWlrq2uqqedpqaao6ehs66iqaayoJmppJSitaKilZeiqbW5o5uinKGSj6GxmJ6bp6Whoq+unaSoorayxLGtqa2pkYeQnKecoqScpZeemJmapqSpmq+hr6WmmK+lvK2htretnZ21sriws6aXna+go52Fj9G1w7d5h46FkZOQgaZ4lKF3jKCRhKWBinGqhoS0bnJqmaOclYqefJiZhoePc6+CpZuijqaLk52KlZCabXCyXKVzk3qcbJl/e5l8balho3Fxf59ic7K4aHiQlKaYfYyNlI14fXmPgm1peGl5cm6AdV1lZG5tZmdgSltYWDxIR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZNzjYqtv7+8urSelqelrbWhopmVo6inrqusmaain6agoLWnoqmnsKOUrKOOpK2jnZCamqq0tKSdpJunkZSXrZ+fnaeknaectZqhqqS2q8OwqaupoYyEjpyhoKajlZqanJibmaelppisqK6jpZutpr6slL2wrJ+isLK5q7Ommqixo6eXeqiQfXywd4qBpKWInG2yb6CHrXyhjoOolZiArImEroWflKqhoZeGn4CZlYB7kn6rgJ2al4ureJ2fkYmTkoB5r12jgX2mp2SdgHyXc2qvXaVrcIWZXWBbjKBtlZKmmYKVjpiNe3uEmH9rbX9jfnRugHpgZ2VxbmhnZ0NaYVs+S1QzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGBhYV5dW1pYU1BPTkk4MDUyLiosQVRWVlZUVFVVVVVUVFVUU1RWV1dYVlVVUUhGSUojKCi9kpqDqcbCtsGzn5qsoK64paOOm6Sjn7Cvqp+kn52tmZ65oKOroK+pmq6hkKuopJaJmpCusaymn6aarJeYj6yhoZ2loZqlna2YoKimtqnAr6WppJ+LgI2bmp+mnpKUmpqUmpqlpKSaqayspKWfqqi+pJbDrKqioauyuaqup6CzrqipmHavfpCLnIWHfLquiphlsIxlla19oY+DppWagayKhLCFppmkoaGRhaBbbGqBs2B/rXt7goGxbWdvmZiMiLBbfbRcpINryKJkn4B7vFh2tVqyfVKugHqsWIChbpiQqJuLl5GYmHx5j51+ZHR+YoR4dIB8YWpncW1mZWVPVWRcQlVfPkooPjk9NCEiLCUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUVJUWFpeYGBgYWJeX1xbWFVQTkpGQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWlxcWFdXR0I70p+zsre9urTCs6ObrKaltqigi5qgn5yzs6mfo6CetZigtKiqrJ6vrZ6sm5WvqKKOiJuOr6yop6Kmma6SmY+omqGdpJ+ZpKOlmZ+jqrKpva+lqJ6djn2LmpWgoJmPkZqbkpqXqJ+hmqiuqKamo6Wpu56gxqakqKGrtLWsrqaeu62srJWAqZKjr4+bgIekl5iQgYC4w7qDjpyThKeWnIKsioKviKabm6WqkX7VvcKqYqO/vX1+o4KD17q4tYWUk4Oevb6Ea6OBb6uEbJx/erKwx4Nqq7C9rHh3or68dIGWjqeckJuRmJ16gpGbemN9e2SOZ3mCe2BsZWtqYlBhWlNqXEBVYUJOKj06NC8eHyQeJTIgHSQoMDQ5NjY3ODo+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz88QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVs7Sxv7mxvbKina6mpbKmnYyYpb+quLKoob+mp7KcnrGcuqifra+mppSUsKyXjIObka6loqyho5yqn5iLo5KmnqecmqGoopmeoaytqrmuqKObl5J7h5mRppuTjpGYmI+Yk6iaoJipqaGqp6GjqrueqMSioK6jqrO0qrCpoLqnrq6ac3WqpLeGZYmgcGetj4qPbW93pJCZn4F1rpiUcI+LcZWoo5uXrqRybW1sZot4b26CmXGBempxaWeJlpWYcWlphIdncIZkXYhiam9ZXWd+d6ZfYXGOkW5mZYCNk4+imJmZkZiffYeQlXZmh3hpjmt5f3lkbGNmbGJLZFhKbFo6UWVFUidLOisjHCAbIiwpGBsYLTIuNTo0NTc5PD9BQkRFSEtMTU9RU1ZdV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola2zqbm5srOqqaGunqOyqZiSvrLEyb62qp7ArKyjoaisoLqjpK6sraaNl66pkIyFlZatnqaroZ6jo5+Ri6SSp5momZajqqCWnKamp6+6rKyam5OSe4SXjaWYjZGRmJSNl5WolZ+YqaObsaaeoqu5n6/Ap6Sypaywsaqtq6e3o623loqgqKW2nYmWopiHqZqQlJ2SqbOZm6OroLGWoqCdoKKcoKWhlaunjZOSjIeTnJyVkJqTmJGOlYWBpJqXlY2Lk5OLj4aEfWeJfnSCdnSHi3GnbHqUkZOSgYGOkJCPnZWhlpqYooOIlY1yaZB3cYt4d3x6amxkY29kVWBYQGpbSGNhT1orRj0rJyE3NDAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFRWWV5gYWNdXlVRSkVEPjk9QEFTWFtcWldYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqW1tq6uorCjrZ+gtbGQjqzHvcW7uauipp6bpp+xqKO2p52ptKeokZisoouHiY+bp5aspaCZp56ekpWjl6iaqJmUpqGjkJqnmaG1u6irmJqQjXuBlIuglIqVkZWQkJOXpZCfmqqgnLajnqert6euwa6jtqavr7CsqamzuKCuvJmRpaSmtqKSnaafjamfjZKfo6yvm6GjsKivl6OgnKOqnp6dnJarnZKZoZuUkJaqmY2ZmZaQlp6RiaCdlZSFkoyQjZSLgH1mi4V1hnV5iINznGqFkJSTkIl9jJaSkpeUopOemKKEiZmHe3KWc3qLf3J8f2pvZF5wamFbX1luY1BgZFBaOkdHRT4yPT04LysmKykmHSY0MDY2Njg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYGVVUEpBQ0I6OUVNVlteXltaXFtbW1xdXV9fXV5fX2FhYmFhYWBiYmJkYlxbY5eVpKijsLOsrqOppq2gp7WqkJCdpbS8r62toqOaep2isaSlsamXnLimo5SZqpyOhoqJnKOPrp+ilaefoZKXmJuui6qWj6iZqIyYqY+fubalppmbjYh5gpOLmpOKlZKUkI2Sl6KNnZ6onp+4o4CEr7Wir691pL2jsqB3eaCqsrqUdayknomAqn9kXGJ2oI6knoSXfW6Ts52jp62qo2Wdn5JzeZmWcICYqJdsf6KoimWcpZyRl5iWjJKckYadmpCVg5KHj4+SiYR3ao6GdoZwe4aBgGFph4qUkotadZWRaGiPj3N7ppqZZXmZh4N4mGqEi4NveYBrcWVfdnBsa2hcZ2ViYnBTXD5OTk5TRz5AVEQ5MS8eHyY0OjMxNjY3ODw7PkBBQUZIQkdGSUtNVFRVWV1gaGZnV1FKPERHPDhVUltgYWJgXmBfYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaajoa+xrKuppamuo6atpJKWq7awsqebq6asl3SMna+fqKunlJe5n6CPnKSdkX+JiJuejauaopWnoZ2Ol5GehHWuj4immqmRl6SJnLq0qKCZmIuJdXeTjZWTipSRkJSMkJOgjpuhp5mcspaAjJu1nbOMko+8p6B+p6J6oq62gY6Opp6Di4aQsamvjIqWo5p5gIushpydoqepp4eVhZh3pZt6h5uBl6eCgnucsnqKhqCXmZSYloKRl5aEmpljeYeQhI6PkYqDbXCOh3mAcICBhX+GdIaElZF4lmiSdKCadH2ZhKKeh5h/k4uDhJlrjo6FbHh7cXFnZHhvamxqXGZramV0XF9JVExRQEU1LlpUVTcpITA5PT42NDM1Njg7Oj0+PkBEST9KRUpLR1NYW1lbYWFpZlpRSDlFSzw+YVZeYmRmZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJejn6atrquorKCosaamqaWZlK7IvrGil6eptZ6PhJ2snKeioI2Qvp6ajZ+aoJB8ho6ZmIisnKGWn6CRjZOJhoCRqI2Hop2klJiehp+6sqeem5KOhXB1kImUkIqUkI+bjJCSn5KXoaWWnquHn7SJtJqtisqHqq6It4WMr4KwroOpjaWYjZ19qI9ye3ecj6eWaJWkebSMn56mqJKYwoF/q4iYoXKegJqlfZeFlbGAoX2hk6CQmJeBjpObipiRi3yFk4aNlZKJg21ykIV/eXGGgYR8hHWEgZaAj8Vmf6mHj6NrnoOjm4SagY6OhoqZcY6ThWh3dHx3aGh1cWhoa15kcG1nbVhnR11STTJENDZOYWM3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TklKTENQWl1cV2Feam1cUUU9TE1ASmRYXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSXop+wp6mopqugpLiwqaqmmpSgo6SrpJelqrejr4Chp5ylnp2JlL2Zk42hkp6PeYSWlpGIq5mbm5mhhY+Md5ucj5+QiJ6knJaamIejua6lmpyMjH5ibY+Lk5CNkI2NmIyRkp+PlKGhmaGnfqGnh62doJatj56cnZGFgKCNq66Go42pmYyaf6N1gJmUa4KsdU2reIeNnJGbqKeAqat9g6F7eqdpnn+Sa2eXhpe2iZ5+bmBkWYOXf4x7ZGiLcpl9eZVsXXyWbV9TcINcX2t5g2BZZYJ9g4CXcKeqa4OjbnKlcJ+FoGlmoG1bbop8Zlpgg39iV1Bvd2ZtdHJram9ea3BtbGlYaU9dWEY5QTRHRF5rNCxJQ1JNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deXmN2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlp2guKCqpKaskaG1vKuuopmYoKKlrK6hna61oqiSoaCfppuajpm0mZCLn4yVi3WBlJKNiqaWlZienn+ShYaspIebkIqYqZmam5KIprGnopaaiImAaW6IiIuOjoqLjZKMkJKijJSfoJyhpH+TgY+joZSgd5yWj6eDoad/hqmshKV4inyEmn6icHOUiJZ7nox5bYebjJmQm6iaj4ede4Kic3amZp5+d6RfmHp9knOibpi3tLp0k4eCf7WoZIHGuHtwlbeLcYCapGJzrKtgfWmds35ufIaCjYKLmHF/o2xyo3SehICjYJ2Zs5ZxfJefs3RzW56yg2pib3R2cWlvWGtscnJmXWleYktFPUQ2UUFZcTM9U0dfSlI9PDM5NTo6NkQ7O0BKUD9VTU5RQERfXltZWGBgfGRIQzhMV1VWY2FaZWZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7iZq5yToI2kt7WuraCaop2jo6aunJuxrayTmKGZoaSZmpSfq5uLiJJ4i4VxgJaNio+hkJKUnZd9kImNqKGHmI6KkaOUnJuNi6mopZ6Ql4eFfmt7h359j42Di5CRiY+UoIOXnqCdoJ6LiXecmKKMn3Khi4eoiJulj5anqn6tjH56oJl6o5N4gXSWiI2cfZWfhpuOmZumhqJkoXyIlpCbjWyeaJqNbpqZe4CLp31yaHSrg56DdKpolZpdm4V2hJ1oqmqAuGZcqHCBnGCVjF6ndnWHiX6eaJp1hpOSl45/n26akG2nml2ofni7a36qW46EXbNnXG5yenhraVxxanh5Y2BmWGJBUUZPN1ZDUm81S1paX09aREAxNTE7OzZIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TltdWWVmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq1m6eIY5Sbq7qysayeppycqZ+erpuesKisnZekmqGfmJaWoaSZhomNaoiAcnuXiIuWloSRlJiPeoqElqSdipSPhouekp2diZCpo6CajJKKgIBpgIZ4f5eMe4mOjoiPlpp/lKKfoKGTmHJon4qfj4xwkoyBqYeYnqKnn6d8r62joriXd6OzoqSAiJR5nXuqmn+ijp2bl4iXcaF8hY2vtX1rmpGheH6YtKOjq6iEmXybfZ2af3SqWl1ve5aLeJ5iTH56eoVjeZdCTJ5ZompyfI5tgIiEmXWbeIaJsbN/f5uTp3aCnW5zfZRvmXNrpF2VdkhlZGFzcX5+bmZgbGl2e2RlYlJeV11VV0BaRVFoRFNXXGJYXklEPUI4P0I6SUY4TEVYQVdSW1ZERmJcWmBLYG1+ckVDPFVfYlpmalZnaG1vYmZnXmFhXF1eYWhiX2VjdmxeZWdma2RmbGloa2mTnIGwrZmEVF6gprO5s7OpmqKMnKucnKmUoaukoaiPn56dmpmWmKGdloiHiXeGgW95lYWQm4t8kZOWiHJ/iJKhnHORkIGImZWhm4WOqZyalYuLi3yDbISFcYGhjHiGjYiIk5iVfJOjoJ6jiK2GfbWEjp6ce6WWeqmBlZyPiqCcfKdod21+mXShc3F8noaZcJODrn2kg6aemYCjb16oZ3WjY2+lYZzTkHx7mXhyc2OihpB+o3Okj3ZrkLOMYIKYiXOqsqi8f3eDbX6+pqm0XpxufXGXbn9yonJdpGdzpmFopm2b1Jl9hZtwenqXa5t8eJdzbqmkZ2FleXCAhGtnZmRudXdnYGNUW2ZRUWJJV0pUYVdTW2VqXGVRRkNLTUpLQktFOE9AUU5YU1lPU1FhZmVqUmN3eXdJRkVjXWVaaGpUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5t/sKtUXEt+qa+xtLCzo5yZhZmpoKGkjqWooJipipmYmJOZk5KgmI6HhntwfYRofY+DlJqBd5COj4lvf4aPkpJsl5N8iZGSpJaDjqqak5KLhYl6g3aHgG6Bn4Z3gZKGiJmil3uUo6San4mzoaK2i3qsp6SupXCogJqQhYCbkXukgKKZhphynoSjrq+Kl4x/jKSNlYOtoZR2tLW1yaFzlIqBn2Cdl6lteZWGoJt1oYd3oH6Sl4uBb0xmo5Jwm4dypHt6dGGDgWt+oGtxZF+ccX10l2l6abO1tMamc5h+ep1rnJurdYSbbXV4mGmaenWYclBFfbReanZreYdmamhidHVwblZeVFlpUFNpSVZNWVRWXWhrblZnV01KQkpNS0hKT0FRS1BlY2ptZXVzc395fG51iXt7VFBObF5oW2tpUmpoaWxnbGZjZWBcXVxeaWJkaWt7X11kaGNqZm9sZWltZaGciK+mhGY/lKGzq6+vtqKikICYqqKipYylp52dpoKal5aNl5CPnJOOiIN5anmGZYOMf5egeXWOiIyBaYSFkoKMhZ2NeoyLlaaTg5epmIyRi4GJeoB9i3lwkKGGeYGVh4mWoJV/lKWnnJaWhGZueJxsomR8caV3m5hwZ6aAlot7pHqfloOXcp52gYqUlo+5bpCKomJ9maGViG1yaaprdaBtbqZfmmmLkGiWh5qVdaKAfZpgjIaNdW+IYmigZZ5+aZp1b2NmiIJtcqJaX1tioW1diYxve35zcmSlbXeiZGenaZlzjJlvom9TiZBvoF9lqFSLXlSYbm1za3KCbXBpa3lza29SWVdXZ1pUbUpZT11JWGlpc2pZa1ZRUkVWXExYU2FVaWtfd3R7fXB9fHKDe39zdo2AhHZeUXJiZ2JwZ1BqaGhrbG5oZGdfXV5dYGtiaml2dV1cY2ljampzbGZrbWOcpJimemV0bYunrqSpsLGmn4uAmKudn6aMoqGboqKAlpiTjZqPi5iQjop7hnGAiGiLi3yYm3N0iX2Qe2SCh5WKiZaZgnyIh5aokYGirJGGkIqCin6AgI5zaY+lhH2GlI2ImKCOiJOqpp2JpniVm36liJaMspiekIKvl5+ld5SHeal0pY+Emm6kooyShIyDu259pa+DhoaGk5Wcn3ylenKolaCWZp5+b6tjloqVkniobKmigYl2iIN3qpGmh2qRsGt2s4ypa4qGbW2fnpKVYH6ri6p2fn+MpZ52n32EpJWdoGqbiHesZ5+tjLZ0d76NpJNZg6aNq2F1cnRwfHVxY2p+bmhsU1dbVmFiXWtNXVJdSl5tbnZgW3FZW2BbZnRlbm9xYnF0YHd6fnlyeYNzhH+Be3uMgYKAdmJ4ZGNtc2RSa2dob2xyamZpYWBeXGJrYm1sem9cXGJpYmxqd21nbG5ilaWqnYGAnqSWqaqdqKeupJmJg5irmp6kiZulnamdhYyajoackYWSjYyNdIZ6iIRvjYR+mJN0dIZykoNtf4uSh4aTj317goWYpo5/paaOgY6JhZV2goeSb2yLqYCDi5SOiZyfiYyUqqOgj4B1lJeIfoF5lK6jf4GbcY+FeI+Kg357cqeMcX19epeWm4SOeHt+foeUlZOKdpCYn6CDe32Ja4yFW3l5cnpwaG5+kolxf3WBj5STcYaEgmWMf16Bf4t3dXOUdW95bm6HbYSFXnZoeI5lgICFjambfXR8lmqJiHCBdn2Gdm1tZ4xzeXuYeIVba1h5j2lud3JxcHh4cF1shm5pZ1ZbYFdcZmtkVmJVX1FfcHh4bGt2ZWpra3Z9cXJ0c2FvdWJ0e4F4dXqDdYCBf4F5i4WDfXttf2xkeG5eV25naHVreGppamVcYFpjaWZscXVuWltia2RsbHluaGxvYY2UuKimi6GimqakmaWcq6OhhISYrJKeoYmappqpmIOBm4p+lpOHjoqJjXKDfI99fo+Fe5eOc3KDcJWFe32Si4aGkIV4fYCGmaSOfKehi4aQkIWWg4aOmHdyhamFjpGdkIienoiMm6ifoKqDiY6Vmn5+iZatqI+Spo93b5yQgnmRb36ohXB9lXFrcH2Bn4x/k46MaG1dg4uMnJuejnOVi4hxdGuCdnSBWXJuhpGBfX6Mal1qZHuFhImAYGl4ept7gouCdYGFgmd3ioZrYXBxgXZecoqBiI+mlYVljI+DbneLhHGGj3pwZmdle4N6lltcamdudlt7eXd1bnNzgmZcbYpra2JaWl9aWWxxXF9hWl9dZnR+enRvdGNra2t8fXN7eHRkbXVobXx+dnp8e3p6gIB+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hsa3FybVdbZW5sZ3N5b2hqbWCLi6qwoZCjoZqenpiemaijo36Dma2Nn5WInKKRpZV/e5iEfJKZiYiGh4pzfYCLdoWLgYSWinFvgHKYhoR+k4SDhoqBeoCDi5ugkIKnoYd4jpiJlYuLnJeFg3qsgpGXmZSKnp2HiKGrn6Kio4uIk5uco5mWqqGnp6CSm4eVjXt3jY6Ep35/kpGSk5yyppuVnpCNspOXhKWMjJWbn4mQm4KIkYprfI53eGWChpCLfImdhIeLkIiIgISEkHd8eXSZoYiGiZ6KhJR+fYqAgHVvc4SDf3eGhoqPppCDhY2Hg42QjH2IjIqRg3dsgoR9eplqcmhhdIpwfXp3d292dIFdXm+GaG5fXlpdXVRoclZjXFxibGh1fHxzb3Bka2ppgHxueX9xanBwbGeBe3KCgHh/fX+Ee22CjIZ8enh8fXqDeU5kdmpybXB6ZWtlY2JgW3RmcGZycW1VXWx0bWl5enFnaWtkjIeduZ6WoqGYlZiZlZmkoZ58gJqrjp6NhqCci56WfXmUg3uOmYmGhISGbniAgHKBh36JlIRta356l4eEg5B/gIaEhn2HhI6bnZKHq5+EcouQhpORi52RfY16qoSNkpiWj5yWh4abpp+imp2GgpGamZiQmqafpZ2dkJaAkIl2e4eOhKV7fI6QkYaYqqGdk52PjaqOkYCdjImTmp6Cjpd+ho6Db3iGcnVhf4OPhnWLmIGDj4KGhX6FhJRueXV0kqGKi4WahISMc3+IfH1ycnuHg3t4io6DkqaPhYOOgYSKiYp3homKjH1vbH6BfG5obG1nX3p/aH17dnR2dXt3XF9wfW51YGNbXV5RZ25UZVteYmtpdnp+cWxsZGtqaIGAbHOBbGx1b3lwhXluh4B2goB+hXZxgo2Ifnt7fH97gopgaXxqdWhpgmVqY2BpXGN1aG9idG1sVWNxeWVwenpyZWptbIuJnreaoaOfkpGWmIuan5+ee3iep5GcioellIuYmXl6jIV8iZGDjIKCgm57f3hzgYV9i5F9a2h9gpiJgYiOfH6GhId9j4GQm5uRiaicgHCMi4yTh6GiioWMfKiRiJCSl5OWk3iMo6CgnZaZf4CQmpiSjJqjoaOZl5Gbfo2FeICDjoagf36MjI98mKSgoZOZkI+mjY+BmpGJk5ebfpOSfoeOgXR0gnB2YH6AjYZxipV8iIxxjH+ChYaOaHdxeIuYkY9+l32HinKBhnt8cXh6ioR6eZCMgpWlk4uFkHuGh4eFdoKEiYh7ZnJ8f3l7cWxqZl9+c2h8dXZzfHOAal5gc3Zwd2RjWV9eUmtpVGRZX2FoanZ5gXFma2RsaGWAgWttfmhvcWx+eId6a4yBc4GBfoF0doKNhn98en+BfX+PanKDbnNpYodobGJfcVZ0b21uYHhobVdqdHZjdXp7cmJqb3mJjZ6ykqWlnI6QmI+GnaCbnXx2paGOmICMooqImpZ4e4aHfoOJf4iCgX9xf3t0doKFfoqReGdjfYaXioKKjHl9gI2DeZaBlZiWjZagm35wjIKRlIamm4eNiYOmlYWTi5aXk5J3kZ2goZiTlnl+jpiXjpaanaSdmJKUm3mPhYJ3hJaNnX6BiY2McpejnqGTmY6PooyLg5aYg5KWmX+YjHyIjYB2cX1uemSAfIqFcIaTf5CCbIeCgYCJhGV1b3uGkpeMfJN3ioh7f4V8e3F+d4iFeYSPiYqXopWBg4t3iISDgnd8goqGd2B5eH10f3hnbGVhf2lqd3N0dX1xfGJjYXNudXJtYVphXltsZVJjWGBhaGt2eYZxY2pjbWVofYNsaHVobHBpgH2CeW2QhnGAhIN/dHyDjIGAfnqCg358kG12iXR0bWWKbGpiY3VWhGlxbmB4Z2xianZwZnl8eXFfcWyGhY+crpemqJ6NjZeHhp+Tl5l9eKqcipl6l52LjJiQeXuAi318g3yAgoF4dHl6dH2AhH+Ji4BkXn2LlYd/hYd0fX6Kf32YhJeUl4ykoph/c4d7lJKKp4+MjoqSoJGDkZCUl5GLgY+YoJqSkJBzf42SlImdnZ6mmJiNlZZzjY6Ka4WXj5l6h4iQiW+XnZqjk5WKjZ6MhoKSnH+SkpWHmYh8iomBeXF6a3VsfH6Lfm2FkoKUeHCCg31+in9kcml7gJaXhH6Nc4+Ig3iGfXZ3f3yFgHyCjISMlKSPeISCdImHfYB0doGJhG9he3V6cX1vYm9jZHtibm92c3h3c3RhdWBvbHVub1xcX15ea15QXVhjYWhtdHuIa19qZmpjaHeIbmZsaGpsaIF9e3dukIhzgYSEfXSBhol7g316gYR9fY5yeot4eG5sh2poX2lyYodocW9ldmdubGF5aWt9e3hwYXdti4CZmaqgo6idioqRhouei5WYfneumY2XfZ+TkZaUiHd9e4p8e4B2eH+AcHR0e2+FfYGAin98YVt+j5KGgISEc3qAh3qPkoiSkZyTpZyVgn2CfY6LkqSJjoqNl5qNhZGYk5aPioiMkp2Tj4uMboOPj5GInpmioZeWiZaQboiZg2aFmI6TeoiEkIpwlZqUopKSiYuZjIJ/kJ59ko+SjJmOe4qEh3NydWtwbnV7i3RuhpCOknF1gHuBgYh8ZHBseH2Zk32EiHSQioBzh3luf32AhXuFi4iEjJWojHqHfH6LhXh+cXCBhoRjaHl0dXB8Yl9wYWt0XnBqe3l4bHNwZXhdbmxzbXNYWl9fYmtaUFdYZWNncXF+h2ZdaWhnYmdxjW5kaWdkaWiBend1b46FdIGCg3t1goiFeIV8eIOFeoCJd3+Le3pyeINqa19waHSAanJvbXFnb2xlfGNugHp3cWx3d4p+opehqKCmm4eMioKQnYeTnXWBqpWTjoehjJWTkIB0e3aFeHl/cnN7hWtycHptinaAgYducVtYfpGNiICAgHd1gYB/oIaRi5KdmKGVmHiKgIGNiZyeio+GkpeWhYmVmY+Wi4uNjY2dio2Pg22Ji5CQip2WoZyYlIWYh2qEo4JmhZ2KkH6Lg4uBd5OYkZ6RkImJlY1/fo+YfJGNj46aknyKgIJudXBsbW9we4Vpc4OOmIpxd4B0goiCeGZybnWBmY57iIR6k5F5dodzb4h7hYt6ioWCiI6bo4d7g3WBi394eW9sgYSCXnJ0cnBweFpecGBwal5van16cG1tamx2YHBvanFtWlhhYWJuWFFUWmZnY3ZvhIJiXWttZGJma5JuYGZmX2drgXVyc3CLgHV/g4B4dYCLgHmFf3eHhneDhXyHjH97dop/anFjfGOGfG5xbHRqaG9sdnhfcX95fHR1dICCfqSVmq2ep5aFjYR/l5SDkKB1i6CUk4aLm4yVjot6cnh0gnByhXNxdYhrb211bYh2g36AbW5VUYGrlYeCeIB3c4N6gqCCkoKTk5ick5p4knuDjZOkmpOOiZWYkoSGl5mMlIuJj4+InoSPinxzi4WJjoicmp+alpR/k35ohZyHZ4Wgh5GEkYKJcYORl4+bjo+MjI+NeHuSkHqOi4ySlox8iHyAa3ZqbmtsbHt+YXp+jpaCd3qAeIOMfHlnc2xzh5WKfoiGe5OPcXmDb3aMeomLeoh9gYuQnp2EfHt3got9d3FqbIKDemB4cG5scnRWXm9icmBfbG55cGhvZmZzdGhwa2F3ZV1WZmBgclNRTlxmZV15cIh8X1xocmJiZWaSal9oZFtncH5wa3F0in12fIWAdHV+jHl7hoF4iINzhoV+jI2Ee3mVeGZyaoNgiH1vb2t6YGpudH91X3R9eIZ4dHOFfHigj5mxnKWOgop/g5qHgIyef4uak4+FiJiOjo+Ed3R2c4Bwb4VzcHGDb2ppdm6Dbn19bXVzUk2C38iS1pN8cHWDdoSgg5N3lJGZnJCZe5RzhZCfoZOTkIqSm5OGfpaWiI2NiJGMiJx+joB4eo1+iIyKnJydm5WTeo11Z4iRhmyIooSRiJeChWOMkZmOlYqXi42Ki3F6lIh7joiKk5GJeYV8fmx7ZXJva2t5eVyAeZCOgHt9fn+Gjnp6aHJqc4qPiYKFhHyUimt9fm5/i36Lh3yEeYGPlZqZinx2eIOQeHNtZ3GAhG1qdG9oanRuU15vZHBZX2txd2ZramJmeHJvcGNfd2BgVmtfXnZQTkthZ2NdenCJdFxcZXZgYWVljmNhZmJYaXNzbWpxdox9dHmGgnV2fotzgIZ/eol+comHgZGLiHx+mHZlc259ZYh+b3BrgFpsbnl5c2F2enuNdnJ3ind5n4ubrpugkIKFd4iVfn2KnYeFoJGPhYyYhJOOh4F0d3B5cW6Eb21ufnJkZXhwfW16fWpoa2OkmsHcru+hc2x2hHaFo4aSb5aRlaCVnIGScoWLo5eJjpWKkJ2Wg4CVkIWJj4CRiomWfod7dX+JeIaEjZybmJmOj3aKdm6FiIp9iqKDkImchIVei5OXio6JjoqKhIlte5aBfYiFiZGPhnaFfX1rfWR4dWlueHNYiHqSh4V5foCAhYx+eGVyaX+JjomCgn+LloVrgXVth5CBj4R+gnp/kJWTmI91c3eIjXVzcWd1eoNidG1wYml2Z1JhcWdsVV9udHlhcmRfaH1wcm5aY3JhYlduWVx4Tk1MZGdiXndziW1cXGR5XmBkZYVgY2NeWWpya25rcneMfnR3hIF4d3uJcYOEfX6Ie3SLiYeWhox/fpdzaHVxeW2Lem50cIBXcXp2eXFld3mGjGh2gIlyf5yHmaeco5KFfXCMlHh5i52EhaGNjnyWjYCaiIR7c3dwc2pvgWtpbXx1XmF4d3txdXtnYGR869q1ycPciHNsdIF3i5uJjmqYkI+dlpOBiXGFiaCNhIuVioyYk3yNk4iDiY97kIuFj4F/dniDhHOHgpObl5SXhox1h39whIGJhpihgpOLnoOJYYOUj4aJhomNh4GHan2UgH2DhImOjYJxhn5/cXdodnJpc3dsWox8koOFfX+DgISKgnVhc2uIgY+KgX5+kZB9bYFreIWOhZGDfIF8f5GSkJaIbnF6jIZ1bHFscnmBYHRpbl1rdmBSZXFpZlNgcHZ0YG9gXWiCcXNpV2doYmlYbVZbdUxLTGZnX2Jyc4VpW1xleV5eZGd7YGRfXVlrbmZvaXN4in5zc4F+enZ6iHOFg3yAh3Z3ioaOmYGMgnuTdWx3dXl4k3RueHt8WHqGcYBvZ3h3koJjdoaFcYqWhZmhmqKKh3Nvk4tyd46cfYqaiYl8n3+Emn+BeHJzbm9kcn5oZmx3eFtfeXt7cXGAamFnYX/Vto6QpnhucXd8cZORjYdqmY6JnJKMhntph4uZhoGSkYaHmI18jY2BgYqNe4+NfYiEenR7g3txhoCWmo6TlIGIdYOFdYN/ipKcnYWUjp9+iGF/k4eEiISJjX+Ag2d9kYB+f4KMjpB+bYJ8gnRrbXd0c3Z1a2ONgY9/hX58hH+EiH5vX3JwhHuOjIF8fpCIeXCDZnmCioaLgnuEfX+Tjo+Sg25veYx+dW1va2x7fmNoa2pZbnZaUmpyaWJRYnJ3bGJlXlpqg21zYltnX2RsYG5VW3BOSE9nZVxnbnGAbFtbY3NgXGNsd2RlXV1aa2xibWp0d4Z/cXB/e311eIZ4hYJ9gId1eYmBkpZ8iYZ2iYFwd3l7hJNvbXyBd16Df3SBbWl6dJRzZ3OHfHKSkYOan5ughoh2dpV+bXaUl36IkYSKjpp9jJp2fXZxb2xqYXV8ZmJpdXpaX3d8em1xf2VkaGdXnY9ecXOWvMSEdnGUiZB+c5iMhp2TjIh0a4iPlYB7lIuBhJuMfIuGfXyJjH+UiHWJhXV2fYFxdYaBnpWGlY+CgnJ/h3SDe4mXnJaGk42cgIhlfZKCf4WDiYlygn5nfYt7eX9/h4uPfWmAfYN2Zm94eHN2c2xqjYWKgYp/eYKAhIN/al5xd3p9jImFe4CPf35ygGh4goaKhYN4g3yAl4yPjH1ubHqJfXd0b2lofXdlXXFjWHBzU1Ruc2liTmd0eGZgXVxYboBvc1llYl1qbWBwT1lsUkRUaGFaa25te29aW15sY1pjb3ZkZ1xdYGtqY2xpc3aBg3Fufnt/dHWDeoSCfIGFdn6JgZaReIOKdIGIc3l5f46Qb298gXFpgXl6fm1tfHaVa2p4hHRrlI2Fn5igmoWIbn2Mdmp4mI9/goqClZiKeo+Wb3pzcWxqZGB0emhfZXJ7WmFyfHlmcHphZWWOsbJ3SmJapNnQl3J7kYuReH6Vi4WZko2Gb2yGkpF6eZKGgYSZinyHf3h4iYqEloBviodxdH17anmFg6WRhJONg39vfoJ2gniFmpiTi5KPlIWHb3qSg32Dg4mDb4J4aICFeHJ/f4OKh3xlfX6DdWNwcoBoeHFvdZiNhYKKe3Z4gIR5gWpbcHxygIeEiX2FiHqIcoBtcIOGjoODcoN4gJmMjYR3bW5+hH93emVoan1yYFl3WllybU5YcnNmYEptdnRhXVtbWXR9cm9XZ11manBfb05XaVI/WWdfW3BqZ3lxXFpZa2VZY3B5X2hdXmVsaGZsaXF3f4dvbX99gHVwgXuAgX+Cf3aBhYmXinGCjXF7hn16eoSUjHVqen9rb350f31vcnx7lHBvgH94ZpKKgqGYnJKChWeHhHBoepeJfn+FgpmKgXyNjWl4cmtsZl9hb3ltX2JveVxkbIN6YXF2X2Vl1eu+izI6PouOgHJ5hYiOjXaEmI1/k46Nf25shY2MdX2Pf4WClYh8g3hudoeFg5d3boiEbHV7dGZ5goOojIOPjIN9bn90dYN5hZuQi4+RkoyLhn57kod4gISNg2yAcml/fnhtfHuBioN4YnmEgXFkcWh+bXRxdIGbi4B/hX5zdX6Ac4BvW2t9dHiJgop7hn98iHh5cGuIgo+DiXGBeH+Wiop+dG1qdoCAdXVcaWl4cVlXfVNacWVMW3NyZVtKcHdvXVtaWV10fnRoWWJbZ2VuYmlMV2ZRPV5mXV12Zl90cFtYVG9kWmRweVpoXmBnbWdpbGlweH2ObGqChH95boB7fYB/gnp1goGMk4VwgItud36Ae3uIk4l/aHt+a3R8coZ7c3d9f4x6eIR+fGuMjIObnZaMgYBsjX5raX+PjXt+f4OUgn99iohrdXFnaGNbYmdzb19hbHRhaHCJemFzdF5jZJugkG5cNVmvtXVqgIl9koZ2hpiHdY+MindwbIWDh3R5iXiJfZOIen5yZ3aIfn2Xb3CGfWh3eW5leoiEpYeBh42Kfm5+dX6AfIuYhoGTkJeIi4SJfI+IcXt9hXxpfm1qgHt6anp2goeAcmB3gX5xZHJndYJtdXuFlZGBfIJ/b3d5fHR+bVdtfnZzioGGd4d1gYl5eHJtiICPgIRyfnx9koiIem5taW2CgXVuXWhmdHJSW3tOXHFcT1xyb2RWS3N4aldZWVphcYB0YF1dYGZkaGhmTlpoTkFhZFtgdmFcdW1YV1J0YVpkbnJXal5iaGtnbWxpcHd8kmxphIp9fXB+fnuBf4J6d4CAiYuEcnuHb3F3g397io2Pg2p+e254eXeKd314gIKHf4N/fnpthYyImKONhIN7dox5a22EiZJ5fXuCkYCAfYqDcHFwY2ZeWWdfcHBgYGhwZmpvinVhdG9bYWRpdnt/vpymo8i4coWDc5R9eIeUhHSRjYhyc3CEe4NzdYZ0iHeUiXl5cWN3hnmAk2lyhHVmd3ZjanyDiJ6CgH+Ojn1yfnODeX+Rj4J3lY2Uj4eCiHqJiWt4eX51aHppa395c2l6doCDfWhgd4d+ampzaHuAaXaBjJCUfnp+fnF7dnt0fWFVdXxyc4mDgnyCcIaJd3hwb4KCi359eH18dY2Fg3ZocWhsiIJycF1oY3RuS2V2TF5vVVRac21iUU90eGFSV1hcYXCCc1tgXGhlZGNqZFBbcUlEZGFcZHFeXHdoVVZUd15cZW5oVmxeYWpnZW9vaHB3e5NuaYiLeX5ye355goGCfHZ9g4iGg3B2g3Jtd4KDfomLlH9wgHx4eXqBi3SDeH+BgYKEeYB2b36Ji5ueiH2GeneHfGh0ho2Ren9/fImGhHaPgGdvbV9kXFhlWW1zYWBhcWxsaIluYHNpWV5kbYB3qdqqx4aHsnKKeHCNdXuHkIF6lIqAdXR1fneAcHF+bYV0lIZ4dGxgeoF5iI5mcYNvZ3VuW219gZCTgIF5kpJ9eHtthnWAkIuDc5WKkI6HhYV7f4VtdXZ/bmh3ZW18dm1qd3Z/f3xhYniGemh1dWN+emd0ho6MlXt0gHVxgHp8bH9ZVXJ9b3SDhn9/eGuIhnN4anR/g4N9enx3e3KKgHxzZ3NlbYuEbXRbal92ZUhub0xbY1hXVnhtYlBTdHZYUFVYXmBxhG9cYGNtZGNebmJUXXJHQ2ZfXWZoXlp7YlJWXHVbW2drYVZrX2FuZmZscWhwdniOdGuOjXV/dnh9d4GDgXt0fYOIiINvcX90cXV+hoKJjYp7d394hHx9hYd4h3x9gX6EgHt+c3Z5jI6fjIl6iXd1g3lefoaajXmHg3SGhoR3iXtibmxbYltbYVZqdGNgW2hvcGeHcmFxZlddY2t/fMrOh7mia21ui21yhXJ9hYt/e5KFenl0eXV1e2ptdWOEdpKCd3BnXnyBeYuJZXGBampxY1hte4aciYOCc5eUd357bYdwgImKhnCWjpCIhYuDenl+cXFvfWdocmJteHJqbHF3fXx6XWV5gHdpdXhmgnZndIeMjZR8codpbn6AeW18XVdwfW1zf4p8gW5uiX9wdmd2foB+gXV7cXpzhnt5cWVyYW6MgmxzWGtfeFxJb2xNV1ZfVFV8a2FPVHVyUVFUVl5idIVoXGBramZiWW5hWGJwR0FoXWBmXl1We15PVmRwWltqaF1XZ2BfcmZqaHJncHN3hnhulYp0f3p3fnmDh4B1c3+GhY6CcHB7d3d1eYeFh4yGenx/dYt+fYaEhId/fn59h398eHV5d5GTn36MfYtudYB5ZIOIl4Z0kopvhYWCeoN0Y25qWV9bXV1UZ3NlYFlkcnJngXNia2RXW2Bpf3i+rnuft25ic4dodHxyeoOHe36NgHh4c3dve3Zlam5hh3WOgXNqYl5+eHmKhGZxfWhqa1tXb3iKo4GFf3GZk3GAeHSBbX+BkIZylIeMh4OIhX15dHJvaHlham1gbXZrZ2tseXd6d1tnfXx4ZXN9boR0ZXWGjYaVfnCLZmt6g3RsdGJbbntrdHyLeoFmdIZ9bXBndH53fX5ye2t5e4F5d3BlbGFtiX5tblZrYHdWS2tsT1JPaU5ZfGdiTlV1a01QVFVeZ3aDZl1hcGhnYFdpXVxraEpFalpiZFdZVXlaTldualldbGVcWWVjXnRmbGRyZ3JwdIB4cJmFdn9+eH98hYd9dXOCh4CVgm5zeHp6c3OFh4iIhHmBfXaPf32EiY6DgYN7fouDe3d8d3eanZd6ioOHaXZ+fGyEhZSAco+CcYaCfoJ/b2ZsZ1ddW1xaU2RwZV9YY3J1aXZwZWViV1xcaIBwb3KAc4llZXl/anR2c3ODhXiBhHp3dHVua3pwYmdrZ4Z0jYRuZl5ffG97iX5obHdmaWRWV3Jwjad8hHx2lpBzfHJ7eW16epCEdpd7h4aChoN9dXBybWd1XW1oX2x1ZGdmaXpve3JZZ4F2dWhwgHiCdWF3hYt8lIFui2pteoFxZXNlYGx5Z3J2iXp9YXWDdmlrcXR6cHl4cnxlfn5+eHZuY2VhbYZ8bWtWamJxVExpa1BMTnBIXntmYU1VdGRKTlNXYWp3fmVdZ3NpZV9WY1dicF1LS2tYY2JVVFVzV01YdWRaX2tgXFpjZV93Z21icGlzb3F+dXSZgXh/gHh/foWEen12goN+mIVucnR7enRxhYWPgoB6i3V1kYB9gZSOgIWEfH6Mhnp+gHZ7o6aKeYiGhWx1fHt1hIKMem+Fc3qFfYKDdW5qaGVWXVtbWlNjbmVbWGF0e2ppbWhfYldfW2mAaWtvgGdsYWh6eWt0dHRvhoJ7gH12dW56aGp5al9lbmiBd5CEZ2VYYndpfod6b2lvZmZdVVhvaI+ndoF6fJGOeHVvfm5xdHiOfneUdIWCf4WIdmpydmdob1xtZV5tc19nYWp4aHttW22Dc3Rqb4B+eXdgdoSEeI+Fc4hxcHl/cWNwaFtudmRwc4d7eGFygHBnaXhzcWt3dnR1YoN7fnd1cGNjY218fWtrVWliZ1RLbGhQR1JsRWF4ZmJNVHJdSkxUWWRrd3plX21waWRcVl9Vb29XSlNoWGZeWE1VbFRLW3lfW19rXV1bYmVgemhsYW9vdW5vd3V6l313f4F5gH+Hhnp5eoN9gZOEcXR0fnl2dIWIkH2AfZBsc5WBe4KfhX+HfYB+hoKAint2hKyfgHqIh4RscoJ5doGAgnRuh299gHSKgGpwbWRkWF9aWlpVYmpnW1pfdYJpXm5sXGFWXFxrgWVydH1pal1sd3ZndHdybod8fn56dnNsemdpeGZdZHJneneSgWNjVGVvZ4KEd3ZmaGlgV1ZZaGSQp25+eICLjnpwcHxmeG55inp2jnGDfX5/hm5kdnNkaGhdbGJdb29bZ15sdGV6aV10gG9ya3F7fnV1YXSFinuHh4B/d3J1fnRhcGxZcHJicXGEe3VkcoBsYGx6b2poend0cGSEdHl6dXFkYWRtc35qbFRpXl5VTHNjUUdXYkdjdmZhS1RwWEpLV1hna3Z6ZGVtcGZjWlhdWHZmVEpcY1hoWFlJV2VRSGJ4Wl5gbFteXGJkXoBpal9vdHhub252g5d5coGAfX+Ii4Z+dXaGeIaMfXR1dYF5enqCjI59foSJanSWgXuKnX1+hXmAe358hohzcY+ujHx7hpB+ZnGIenR9fXZyb4Zte35tj3picG9hZV5lVllZV2Nma2BdXXOGaVlxblteV1pcbHtjcXd2bWNbbXN0aHV2cW2FeX+BeXdub3RlaHRlW2d0ZnZ2kXpfXVJlZmqCgXR9YWNpXFRYXmJjkKVoeXSDhpB4bG55Z3dse4N5dIhygHh7eH9oZXZtYGZhX2pgXXRrWWVdb25iemZbeHxrbm5wd3l0dGRyg5J/h4KIenZvcXxyYXdjWm5vYXBxgXtzZXGAZF5tdmljZnh6c2xtgXRzfHNxYV5lbW99ZWlUaFlaVU55YFJLWllIYnRkYUlUbVNJS1pXaWxye2NsbHNjYVlaW2F3XFNLY11YaVNXSFlgTkdpdVheYW1bW19iY12FaWhhbnh5bG9qdoGQeG2CfoCBkoiEgXZ1iXSLhnRxdnaBd3x9foyQgH6TfnB4loN9mZJ5gIB4eX5/c4iDc3Caont7gImVeWR1iHlzeXZrc3B/bHl8cJFyXnBvYGdibFRaWVdoY21mXFxyiWZTcm5bWVhYYGx2ZGp1ampfW210cW10dHRrhn1/gHx3b29sZWlxY1trcmR0do9zXFdUZGBxf35xglxhY11TWmBcY5OfZXJxhIOQdGtqeWxub3l5enGAd39yeXp6ZGZ1Z15iW2FoXF53aFdiXXBoYXhhW3t2ampyb3d0c3RpcIGUg4Z+hHZyanB8bWV2V1tqbWJwcoB6c2Vvfltgb3FiXmlvfGxrc31ycHhrcGBbZWtte2FnVGdVWFJRd1xTUFlSSGNzYmBHVmtRSE9aVWtra3xlbW9xYVtaWFlscFdST2ZXV2lTVEZaXE9JcnRYX2NtY1hhYGFejGpjZG15eGtvaXV5hntrg32AhZl8goR5fYhtj4Zxb3d6fHSCgn2Lj4OClnR4gpOGgZ+JdYF/gXR/gnCHgnVvopd0e4aLh3tmd4tvbnxwZnhxe2xzdnONa150bmFnZWtSXVtWaGJsbFtccYxkTm9uXVZYVWdpdGhjdGVlXVpudW5wdXV6a4h9gH2Id5BzY2VrbmFcbm1jc3iHa1pUVmJjd3x8cIVcY19jVFtgWWKWlWNucIOEinNqZ3luZXJ1cXpreXR0bnp+dV9mc2NbXldiZFlhdWZVX2BtY2FxXV1+b2hpc3FzcHV1a2yEk4GJe4VxcmZue29xblNaZWplcXOAdnNibHZVYnFrW15uZHxla3V8cnJyam1fWWNpanheZlRlVVZQVW5YUldUUEhlcl9hRlhqTkhXVFZtaGR8aWt3amFXXFVbdGRTUlZoUVlmVFNIWltQTnh2Wl5lbGlaYmBeXo9uYmZreXVubml2dn9+bYOAfoaXe3+HgYl+a5OIcmd0gHt1gIN+iY9/i5NyfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4GNi3d4bnuNYGR8cWd5c3ltbXF2g2dkfGxjZmdoU19fVWdgbG9cXm6OaE1pbWBVVlNvZnNsZXhkZV1ZcXVtcnt4c22JfIF3nHt6bGJlbG1eYG5qZXB5fmdaVlhga3d7em+DXmJeZ1ZZYFdjnIhia3GBhnx3a2p2bFt1cGp5aXVybW57gHJYam5eWV1WYmRYZXFjVF5iaWJibVpgfmtma3N1bm13dmtohYx/iXqHbXFmb3tscWxiWF9oaG9zgHNzXmltU2VwZFVibmF5Ym91e3Vqb2xqX1hgZmh1XWVWYlZTT1lmU09dT09IZW9dY0daaU1JX0tYbWRfeGhufWRgVV5UXXRbVFJfZk5dYlRTSlxaUVp1dVxeZW1oWGJhW16OcWNnandxc21ndnN5g3OBg3uIjX58ioiOeW6QinRsc4Fzf3+IhYeShJWPen2Mj4iRm4SAfIyEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fX59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY6Ojo2Ojo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6NjY2NjY2NjY2Njo6Ojo6Ojo6Ojo6Ojo2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJLkpqZmZmZnFtBREREREU5LzAwMDAsSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1Mz+TnpycnJyfUjE1NTU1NyccHR0dHRg6g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmJiZmZKPkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho2Ojo6Ojo6IhoaGhYWFhIODg4KCgoSKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQj5CQkIuOkZGJh46KkJKTkYuRjY2Ph4+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIyMjY2NjY6Ojo6Ojo6Ojo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOhY2Hh4yGiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJCIjIaFjoaLj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQkIiLh4eMiIiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fX19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yQiIyGhoiFiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY+MjoqKjIqOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enl6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo+Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYWEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTk5SUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZWVlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSkpOTk5KSkZKUiIyUk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpGQkpGSk5B3jJOSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkHeJkpGTgHWOkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJCSeW6Nko50doyRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj5F/Z3iSh3V3i5CPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Oj4JhaYZ6aHSKj46OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyOd2BrYmdkbouNjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouKi4dkb25banJsgYWDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcXt4eXt8e3h3e394dXd0dHZ1dXZ3cGNwcGRrcnFkaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhkZWltc3BydWtiY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWl1gYWNsbm9va1pZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9OUF5pZmxua2djUVBTUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5PTExVZG1mam1raWZcU09PUFFPTk5PTk9QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLR0lPVWBobmhrbGtpamhkX1dPTk9NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRURSXWJmaGpubHNvamlqbGtpZVVKSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+Pj5LVlxpbWxueXNqamxmW1FKRERFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7O0dKPUZZa253cGtpWUdEQkVFREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oz49OjtGW25tYElBPkFAQ0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTo7Ojc4VmQ/ODg8PD1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09Pj09PTtFWTk7PD49Pj9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A7XW5APkRFPz9BPERbPT09Ozs9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojttd0g4Ozo9PUE8SWA8PD08ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlSPD09SU1GRnZ3TTc4ODo7Pj5VZ0A7PDw6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ2d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3lJO11/g395fHdWPD0/PT0+RWl0Szo9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQEhyeWtigoSDg4OAfV0+QENAQT1Jc3xZOj1BRUFCQkZIQz08QEREQUA/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARm90fYKCgYN/fYR1TEFDRUA/Pll8gF0/Q0VJSklJTU1LRUNGR0dFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXFCREVEQ1d1hoeHflhHSEpNTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5+fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEimxBQVZ0h4mHh4eIg1dITE1MTU5MSUdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzdnd6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIg1ZshIeGhoaHiIiHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklKSEhIR0lJSkpJSEZKSkpKSUpJSkpKRklMTEtKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlWBg4SEgoKFhoaEgoaFhISGhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ozo8QUFAPjw5OTg8PD07Pjs5Oz9BQkBBQ0NCQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJZYWEhIR/gYKDgoODhIWFhoiIiIiIiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4ODs7Oz1AOzk5OT08Pjs7PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlqhoSEgX6Bg4ODgoOEhomKjIyLiomKi4yJVDo4NjU2NzY2NjQ1NzczNTY4Ojg3NjU2NTY3Njc3ODo2Nzg4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmaFg4GAgoODg4ODhYmLiomJioqKiouJiouBRzY3NjQ2ODg3NDU3ODU2NzY5OTc2Njc2NTo5Ojs6Ozg5ODk4Nzc3OTo5ODg3ODY4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhIaJioqIh4iIiIqKjIqJiYx6Pjk4ODs8PT45Ojo8OTo7OTo7Ojk5Ozo5PT09Pjs7PD06PTs5Ozs8Ozw8OTo8ODo6Ozo5OTk8Pzw9QUJESUpNS0lLTFdvcnN1c3Z4e3t8fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQEI+QEJAQD89PT5APz4/QD9APT0/Qj9BQT9BPz1AQEA+P0E9Pjw7Ojs5OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uKioqLiotePkRHSUtKSUZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREVFQUZFRkRFRkRAQj88QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp7fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDQ0ZXhIKDhIWFhoaHiYmIh4aGhoeJiYqLjI2MjIuKiohWSE1MTUtOSklLSUlKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0dnd6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/f4CAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT5CQkdHSlmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTlBOTE5LSkxKSUlISkZERkhISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg4PDs8PTo+QD4/QENGSUpRX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXJOUk9OTExMTEpIR0VJSURKSEdLSkhKR0dHS0xOTExISElKTVFOT05NT0tJR0lKSElESUhIRkZHR0hHQ0JBQ1VucHV3d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHR0I/OD9AODo8OD0+Oz1BPj9BREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyLi4uLi19SUlBNTk1LSkdFQkdKR0xKRktOS0tKSkxNTE9QTkhJS0xPUVFQUU9PSkhKSkxKS0ZHSEdFRklGRUVCQUJCXG9yd3h5enp5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFhWUlJUUk9MS0pERUZLT05PV1VRUE9SU1JNU1RPTVNMUFNVVlJTUVBMSk1NTUtOR0dKRkZISkRERUVCRENjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JDR1ZORk5QUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLaFdVa2FFUlFRUEk7O1JUUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9OUlBQUFFLTEtISEpIRUZJSUlISWlydnl4eXl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHRkZFPz9BQUVBQ0dFREVMWFJNVFVWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUT9AVlVZW2NgVllicl1dVl1aVkVRWVpbWV9UWWdSVlZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p5ent6e3x9e35/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36LiYqLem5wWFpcW1JTUlZWVFpadINZVX2QYFxYXV5XSVZdXVtbX1lIWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZVFVUV1JRV1ViloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXFtcXV1XU05TUFBRVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTEtmeVtdVFlVVl1aTFRaVVNUXlpYV1dXemtYW1tcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fX19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtNTktNS0hKREZIRUM+VGRVf1JQUU5LUlRRTU9ZUk1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dnVzc3d6ent7e317fX19fn19fX59fn9/f39/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV1bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlZUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDP0NDQ0NCP0RQQkNAQz1DSUdWQEhOTEddaVBIRk9GREVGSUdIQ0RIR0hLR0RCQURATlFNUmRydHZ1c3R1enx6e3t7fH19fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGCa01HP0A6Oz5AQD8/PmpRS2FFRkhJRUI/R0xOR01RVUlCRT8+PD08PT0/PT9BQ0NAPzw9Qj5KTUdVbnR0dXN0dnh6fHp9e3x9fX19fH59fXx+fn9/f4CAf39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGpqZmBbUVJaXFleSkpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlQ0BAQj06QkNBQURCXF1Pe05PTk5LTE1PT1FMS0xXTUhHQEI8OTc3NTk5PTs7Ozg5ODk/PEJIP1xzdHV2dXZ4enx8fH18fH19fn58fn19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklIUFFRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIRkZIQkFHSUVFRkRNUlBhV1JXUVBTU1JVW09PUVdQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEI9ZXNzdnd3eXp7fX18fHt8fX5+fnt+fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUxUVFNRUVVPTFJTVFdYVFRYUUxXWVpWWFhWWFldV1hYaHNrXVZhc2thYV9eZGFfXllUUU5OTkxJSEpLSUlGQ1FQU1tXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk5ODk3ODg1NzU3ODU5OUducnR4eHl7e31+fX18e318fn5+en1+fH1/f359fn5+f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RWVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMT1JST01NTk5NTEpGUVBVWVNUT0pOT1VTVFxWUlVTUk9NTElISEY/Pz06ODg3NjU5OTY3Njc1V3BwdHd5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0lHT1BPT01SSk9QT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFJNSUxKT1JQUlJTVFFST0xMS0xMSENCQT06Ojg3NjtCNTU2Njpkb3J1eHh7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpIR0VITEhLSUZMTVBNRy9FX1I+Mz8+am9hUlJRQEdVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHZ6e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRERBQEdIR0hGRkhKTUxFR0NPUkM4RU5TXWZTUVNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ1eXt7e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa25xbWltY0xPT01RU0xUVVRYV1VNTEtJPDk4Nzs/QD48PUBAQj0+RUhHQ0ZGSUdKSkBGQUFARkhFSk9IUFJiXFFQUk5TT09QTExPTUtNTE1PTltXS01RT0dJSENISktMSkZGRkQ/QkM+PEJHP0I/QWRwdHd7enp7fHt6end7d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIREQ9OTg3OT9CPjs/QkBAPkFESUVDR0dJRklFQkI/Pj1DQkFHSURNT2JlUU1OTldLTE1LTE1NTUxLTk5TZE5KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLbm92eXl5e3t6fHp3dHh0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9ISkQ/QT05OTk6P0I/PEBCQkFERUhLRkNISUdHSENDP0I/P0BBPkRFQ0tOUlRMSklNVEdJSUpMSktMSUpMTU9QUlBLR0NMR0NCSkpMTU9OSUpJR0NDQ0RJSk1MSVlybXd5eHp7e3l8dnJwdXJ0eHl2eGpxb2psbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUhLREdISEdKS0lKS0RHQj0+PTo6OjtBQj89QkJDQ0hHSkxKRElJRkdHQ0M7QUBCPkBAQkVDSU1QSEhLR0hLREhJS01ISkxISUpLSk1cUkhIRE5GQURLSk1NUE1LTUpLRkdHSk1OUU5MYm1pdnZ3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktDRkVHRUZGR0VHQkNAPTw9OTo6OkFDQD5CQ0RFSUdLSkxGSUlHRkZEQjtCQ0M+QENDQ0VHTE5IS05IREhFSUxOTUhJTEdGR0lJTE5LSUhFTklCRk1MTk1PTU5OTUtJSElPUlFSTlJmZmZxb3N4dXt6fGxoam5la3Fsc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkRGRkVDQ0NFQERCPkA/Ojs7PTo9PkNBPkFDRUZKR0pIS0hHR0dGRUNAPUVFQj5CQ0NDRUdISUdNUEpGRkdLTk9LRkhKRkVERUlKSEtJRkhQS0NJTUxQTU9OT09OSkpITVJVVFJPV2RgYW1ncHJvcnl6Z2VoaGRpbGZxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxHRUVHQ0JBQkQ9QkE+QT05Oj0/Oj0+QEI+QEJER0pGSkZJSEZGR0VDQkFBRkZDQkNCREVFR0dIRkxRTElPSkpMTElHSEVHRkRDSUlIS0pHS1JNQk5PTVBPT09NTk9LS0tQVVdWVVRYX15caWFtaW5ocnNiZWZlZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1anN1bnV0c3FyamtzTUdIRkhCQkBERDxBQEBDPDg5PT45Pzw/QkBAQERGSEVIRkZIR0ZGRENFQ0RJRUNGRUJFR0VGR0dFSk1LSFFNSktISElFRkhJRkNJSklLTUtPU05EUVJQUVJOUE1OUE1MTVNXVldYVlhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcmh0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpb3lNSEdISEJCQkZFPD9CQkQ8Nzo+Pjo+OkBCPj8/QkVGREZEREhGREVDREVGR0pFRUpHQ0dIRkhHRUNGSkpHTUpMS0hKTEZJSUtIRUtLTE1OT1JUT0hTVVNQU09RTU5RTk1QV1pWWllWWl1aWGFgYGBeaGVjYGRmaGdqaWhqZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5JSEdJQ0FDSEU8QEVCRD05Oj4+PTw8QUI8Pz5BQkZDRUNDSEVDRUVGR0dHSUZHS0hDSUhHSUdGREhLSUdLSE1LSktMSExLTUtKTkxPTk9SVVZPS1VXU1FTUVJMT1FQT1RZWllcWllbXl5eYGNeXGFja2JgZGdocoVoZ2pmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdm90TUlLSEpGQkVHRTxAR0NEQDo8PkA/Pj9CQTxAPkFBRkNFRURJRUZFR0VISEZISElLSUVKSEhLSEZGTElISEpHTExMTUxJTUtNTU1PTFBQUVVWV09LVlZVU1NRUUxPU1JRVltbXV5bXF5fX2FgYWRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKS0xKTEdCRURFPEBGRERDOz8/QUBAQENBP0I/QUNIQ0ZFRkhGSUZGRElIR0lISk1ISEpKSUxKRkpLSElKSkdLS01NSkpNTE5OTlBMT1BSVFhWTU5UVlRSUlFQTE5UU1JXW15eX11dYF9gYWFfYWNlYmNoYmRpamd2i2xqaWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZvd0tNTEtNR0RDQUQ8P0VFRUM9QUFDQkJDREFDREFBRUdDSEdISEdKR0RHSUdISkZJTEhJSk1LTUxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1FXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BDQUVEREZCQ0VHQ0NJRkNJSkpJSUtHREtKR0hKSUlLSEpKTkxOTElMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGJ2dWh1Y2F2YFhucWJkdmluemZbbHRgbGtUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RDRUVERkJGRkdERUtFRUpNTUtMTEdHTUlHSktIS0tJS0tOTE1NTExJTE1MW3NiZHBebG1VTU5mc11mZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpyeXZrYmBrZWVteGxrdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUhHRURAQkJAPkNGR0JGQ0VFRkVEQ0hIR0RFS0hHTE1OTE1NRkpOSEpLSklMSkpKS0xNTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtbnVcWWxRXG1tWnFta29teHh0c2lwXF9ya3FqVXV5eHBjXmtmYmdwcGpqb3BwcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHSEVFRUJCQj5AQEZHQkdESUVFRUJGSUhIRUdLSkdNTU5MTU5HTE5JTEtJSk1JSklKS09QT05NS05NTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITUdJREVEQ0FCPUJBQkZESEdMSEVDQ0hLSEhGSkxMRk5MTFNSTEdMTEhOSkhITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9udHN2c0hLSElCRUVFQUA+RERCR0NISU1JRkNGSkxJR0ZLTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTU1NTUlLS0tTa2JbaV5faWNyclpfWWpvX2VlVWtfY1thYVFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ2dHdyR0dGSURFREZBQEJGRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpFSEhLTUlISkpKS0lISUdLS0tMR0hLS0xMTExKS01OVFtcVFBUTFBPTk9PVlFPT1FOT1FKSU5QUWRxaVRZV1xbXFVZWl1YXVxcY2ZhYWViY2ZfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUNAQ0hERkdDSUtMSEZER0tMSERHSFBLTE9LTFdMSUVFSElKSElLSExKSEZHR0lHSElFRkxJSktOTElQXFdeUFxbYF5NWFlTXFxiXk1ZWk1YYVJKWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYWFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0VMTUJEREJFSUVHR0ZLSktIRUVKSktGRUhIUEpNTUpNU0hHRUFIRkpJS0xJTEpIRkVJRkRGR0VFSkhDSk1LTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5eXF5TWl5jXlpdYGNgWV9iW2BeW1RYV1leXWNiY2FjZmhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JREJCQ0dIRUhHSEtJSUlERktLS0ZGSUpOS05MSExOR0hGPkdHTElLS0pMS0lHRUlEQ0REQkZKREBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVlWVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQ0VISUZHSEhGRkpHSEZIS0lMRERLSk5NTExISkpISkc/R0ZOSktLTUtLS0lHR0NEQERBSElCP0lKSFBdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXGRjYmRjZlhRVVRSW1daYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktKRkZGSEdGSUdGRklMSk5GREtKTE5KTElLSkhJRkJISVFNS0tPTUtLSUhHRUQ/RUNISEFBR0ZFVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVVZYFJRX19iYmBgYmJgY2JhZGRiWE9RUVFbUltdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FHRkRHTVJIQ1FKRkhISEVGS0pNUEVGSUpLTkxMSUxMSUlHREhLUU9NTVBMTUtLSElDREFFREhHQkFHRURXVUVcVF5TVl9YTlRVTlpaTUpLVGBhW19YXl5hXU5ZYlxgYF9iY2JdYWJXX19UUE5PUFhSXVtbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERUZHRElSYlBDVl5JR0dIREZNSlBQRUlJS0tOTEtLTEtKSkdFSk1RUU5PUE1OTE5IS0FEQUNERkRDQUVGQk1IQktMUE9OTEZNRkdJSkhHTEtNT1BJTE9QT1NPTFFTUlVaWVdZWFhkV09TVFBQTk1PVVRbWFhaXVxgYWRlY2dja2xwc3J6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdHWExHSEpIR01MUVFJTEtMS05NVU5PS0tMR0dLUFNTTlBPTk9OT0hLRmBFRF9MRGZjRU1bSV5bcm1PTVVtWUxDUGBVa1dnSl1YVV5ETVFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFNrU1ZWVFtcW2BgYWFhYmBmaGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TEhFR0ZIRUVLT1NJSkZgU0hKT0pJT01SUUtNTExPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpRf1FJfFlZcXNYUG1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtgVlZYf2p0dXVfX3ZfWGFbXGZbX2FhYWFeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU5CRExMRklLRVFWTEtPSUtSWFdRTk9PTVFUTk9RUEtLTkdNUFNbWlRRUk9QUFBKSFp4XVR4ZWhaUlRRdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Nye3xvfXlvf3JfYGBiYVpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1ISkpHSlBPTU1KTlZeWVVMUVNOWFpNU1NSTktPSVFSVFlXV1FUUFBQUUtIZ3hsY3hybVtLTVV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclFoem1panp6fmx4en9vaG9ZdnZqdXVwgWByZ3xpbHh8b15fX2JhW15iZGdpaWRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdXpufH15eHJuTktTdE5DQ0ZQUEhKS0pLUE9PT01QWmBaWEtUV1BhXlJWUVlSTE9JU1RVWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmhxdW5teXB3bHZ0dHFsbV10fnprbXl8a3RsfGtwdnV4Xl9fYl5dX2RkaWdoZmVeYWJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRzb21MTFtWSEdFR1JQSUxNSktQUVBQUFFXXFhVTVVZVWZYUlJZXlNMTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVTFdraH1sbWx4X1twenteYHpzY3JveHFoZHxpcntdVUxsYHZ1a2l1e3ttfnhrfHBdXl5iW19iZGRnZWVlYlpjY2lra3JzcndnbGloZGdgYWthZ3NybGdtbXJ8a21oa3t0bW1rbU9ISktISUhIUlBMTk9MS1JSUk9TUldSVlRQV1tWVlRUVGFgUE5NS1RTU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWVJOUFVUWFhYW1pVUlNXW1dYV1pPU1VXWFhSXVlXXVZUUFlSV1dXV1hfW2dyXltbWVxdX2NaX2NjZGZkY2NiWmNjZmZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLS0xNS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVhQT0xNVlRQTlVTTk9NTFFQS0pSUUtRTUtLT1JVUlFRU1NJSExOT1FSUVFRVFZSWFdcV1NTUFFVVVZTWlFPU1JYVlRZVlRZVVRSVVRUVVdYV11aXmFdXFpaXFxgY1tdYmNkZmRkZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZWZtc2RpaGtrZWRjZmhQSktMT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYU1FQS09XU1BOVVBOUU5LU1BNT1VTTlJOTU5RVFBUUVNUVU5LTU9RVFRSUlFWV1RZWltZU1VSVFdXV1lbVE9UVVhVVVpVV1lVUlJYVlVXW1laX11VWF5cXl1cXWFhXltiYmNnZmRkYlhfYWJeYGhlZmRhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVpZWFdYWlpYWVZcamRWWFlaV1ZTVE9KTlZUUE9UUFBQTk1RUVBSWFRRUU9NT1NWTldSVFVVT05NUVNVVVRUUlRXVlpdXFpWV1FSV1hWW1tXUVRWVlZWWVRYWFVSUlhWVlpdWV1fXlZeXV5gXFxgX19fWmJiZGhnZGRiWWJgYV5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUVBVXFpaV1tbXFlaW2RxbWhkXltZVlVXUUxNVlNNTlJPUVJPTFBTUlVbVVNQUExQV1dSV1NTU1hNT1BSVFhWVVVTVVlYW15dW1tWUk9VVlZbW1dSVFdWV1hWVFhbVFNSWldXXF5aXl9gVWFcYWFeYGJfXWBdY2BjZ2hkZmBaY2BhX19lZF9gY1taXFtcWVpYWVdcWVxbYF5fW15eYWBeYlxZYFpRTk9OVlFQVFJPVVRTUFdcXVxYXlxfV1xeanF3eYBiXFtWVlhRTU9WU05RUVBSVFJLUVRUWVtXVU9STlNYV1RTVVJSWk9QU1NWW1ZWV1RWWlhdXltbXlZTTlRVVlxcVlJUVlZYWVNUWVxVU1NdWFpdXlxgYGBWYltjYl5hY19cYmFiX2NmaWRmXltkYGFgYWNkX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVUlFXUlRQW15fXltgXGBVXF1panJ9c2xnXFVYV1BPUlpTUlFTUlRVVEtRV1ZbWlpTT1NSVlZWVE9XUlNaUlRUVFhdV1hYU1hcWF5dWVpdVFVOVldXXltYUlVVWVlZVVdZXFVTVl5ZXV1gXWJiXllfW2ViX2RkXl5jY2FeZWZpZGZeXmRhYGFhYmRgYl5YWl9bXFtYWFhYV1taXGBcW1tcW1haW15WXlldUE9PUlpQWlRVVlZUVFReXmBfXmJcYFVdXmJreXRsfWxaVVlVUVBTXFRVVFVUVllXTFJaV11bXVJPVVNYV1ZUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSV1JZWFlfWlpUVVZaWVpXWFpcVlRaXlxeYGFfZGNcXl1dZWFhZmReXmRjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9fYWFgY11gVF1fYmVldYF6aFhZWVNWU1ZcWFdXVlZXXVhPVV1aXl1dVFJXU1dWVVNUWFJTVlRYWFhdXlhdW1ZdX1hfX1hdVlFZVFlaWmFZXFZXWFtaW1lZWltYVl1fX15jYmFkZFxiXGBmYWRmZF9gZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWU1xUVldZVlZcYGFiY2FjX19WW2BkYV96dW9oWVxaVVhUV1taWVxaWFlgV1BWXlxgYVxUVFhQVVdWVFZXUlNVV1paXF9eWl9cVl9fWl1eWV5WU1lXWVpdYlpeVldbXFtcW1taW1laX19gYGRiY2RlYmRaYmZjZ2ZlXmFiYGNeYmNpZGNnX2deYmJjYWFgXl9YVFtaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU1BWWlZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5cXVtWV1hZXFxcX1tZW2JWVFheXWFjXFJWWVBXVldXV1ZUVlRYXFxeYGBdYFxXYV5bXlxbXlhWWFhbW19gXF9YWV1cXV5fXFtdWFtgYV5gZGNkZWVmYlljZWVpZ2ReY2FgZWNdZWlkZWlfZl5jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOU1dZVldaWFtcWFdZXmBiYWRhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFdXWFlZV1ZXVl1dXmBhYF9iXllhXV1eWV1eWVhWV1tcYF5dX1paXl1eXmFcW1taXF9iXmJkY2VmZWZiWmRmZ2pnY19jX2FmZVppaWNmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWFdaW1pZV1hWVVtdXV1gYGJieExYV1xZV1xbXF1aV1xdX2BiZGJiYV1gWGJjYmFjYWJdW1xbWFdbXF9dYF9dW2BkXFxYWmJlY2BSXFpPWFhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl5ZWVVYXV5fYF9fXFteXmBiY1xcV1xeYGJiY2VkZmRlZmRcZWZoamdjYWJcZGdgXGlpYmhpZmRgYmFjYV9gX11dW1lcWVhXWFlYV1xbWldXWE9YWl1hY2Zmcmt/SllXXVpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGJiYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF1eX1pYVltfXl1hYV9eW2BhYmViX11UXGBgY2RkZmVnZWZmZV5lZmhpZ2RkYFtlZ15haGhiaGhmY2BiYGNiX19fXV1cWltZWFhYVlpWXFpaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3x8fHx8fHx8fHx7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb29veX59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqCRT4/Pz8/PXWNiYmJiYmLjIyMjIyNiH9/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb255gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjYM6MjMzMzMwc5CMjIyMjI+QkJCQkJCMf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dHZ3d3d3d3d4eXl5enl6eG9wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHZ1dXV1dXV6fX19fHx8fH19fX19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl3dnZ6e3h7eHd2d3p4enp5fXp5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d4fXl9fXp8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8en19eXx6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4SCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3d3x7fHt6fHt3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4e3p9fHt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXh5eHp6eXt5eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx9fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3NycnJycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3RycXBwcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzc3Nzc3Jvfntvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnN1cnJycHOYe29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFxdJV8cHJviKB2cHBwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXJwlKF1cHOdoHZwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcW+JsZFufqSgdnBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFycIOzqXyQr6N3cHFxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJwjbGnq6ivpHRycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3Nzc3Nzc3WfoqKzpZujenNzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fnx2dnd3dnV4enh4eHh4d3h4gKWemqWfpKOPenl6eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fXx7fH2KopCQl5qXmZJ7e3l4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX59foamqaSeoJuVlX9/f319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgIGAirGoqaKhoaujgn6AgH5/f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/f4CAgIqnrp+oo6ChpamkjH98foB/fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH+AgYiWqq6km6ShoKGhoamqn46BgIB/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgoaMmqajnZyaoJSZoaCenZ6hn5KEgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMj5GPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgoOKkpWYl5mYiJCdm5ucmJCJhYODg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OCgIGCg4yWmZWJkZmckouHhYaGh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSDgoKBgYSQl5OWmZCFh4eIiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46RkY+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhISCg4OFkZeJhISDg4WFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgYKCgoKCgoGIkYKDg4GCgICAf4GAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgICAgImTgIGCg4OAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiYaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJloiEgoSCgn9/jZeCgoGChIOBgYGCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6YioOFhISEgoCTm4WCgoKEg4OCg4GBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUkpKTj4yMioWEg4ODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBj4yDgX9+fXx8i5yNgIKBgYKChZSUi4GCgYKDg4GBgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSTlJKPjYyIhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GVl4mAfX19fXuBl4uAg4GBgYCPk4yPgYKBgoKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgJWfin5+gH2Hin2EhYOEgoODgo6JhYyCgoOCgoKCg4ODgoODg4KCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSTkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fn19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyLiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOKkYOEi4WCgYF+fYGHhoOAfn5/fn9+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWGhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYaGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f36AgISFhIWGhoaFhYWFhoeHhoaFhoWFhoeHh4iHh4eGhoaHhoeGhoeHh4aGhYSDhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGh4aHh4eRlJORkZCLiYiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/f4WFhoiIiIeHh4eIh4iHiIiIhoaHiImJiYmIh4aHh4iJiIeHh4eHhoeFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt6gIaHiIqKiYmJiImJiYmKi4qIiIiJiYqLioqIiIeIiIiHiIiIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5COioaEhoWDgYGCgYKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKCgoKCgH9+fX19fX59fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaHh4WGiIiJiIaGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SEgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4ODg4OFiYqJh4WHhYSFhYKAgYSEgoOCgoKDgX59fn5+fn5+fn1+fX19g4eJioqHh4WGh4eHh4iHiImHiIaIh4aJiYODhIOFhISFhYaIiIaFg4OCg4WHhoeGhoSCgoOEgoOEhIKBgoGBgYODhIOEkZKQjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIODhYeIi4qGhIaEgoaGgoKEhIODg4OCgoF9fH1/gH9+fn59fH19fHl8g4aHh4SDgYODhIWFhYODhYSEhISFhIWEgoKCgoSEgYKDg4WGhYSCgYGCgoODhYSEhIWEhIaEg4SFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhIWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gX9/gYODg4ODgoJ/fX1/gICBf31+fn19fX17enp+hISEgoGBgIGBgoKBf36BgYGCgYOBgoGCgoKBg4OAf4CAgoOCgICAgICBgYGDgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fX+Cg4OCg4ODgn19fn+AgIGAfn19fX1+fXx6enqAgoKBf39/f35/f4B+fYB/f4CAgX+AgIF/f4CAgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gYODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgH9/f39+fn1+f35/gH9+f3+Af4GAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f4B/f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9/fX6Af4B/foF/f4GBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXuAgH+Af39/fn5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35+f4CAfn5/f39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfn19fn5+f359fX19fXx8fHt6eXl5eH2BgIGBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f4B/gYB+f3+Afn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f4B/gICAgICAgH9+fn+BgYGAgISGh4aHgoODhYOBg4ODhYSEhISEg4ODhIKCgoKCgX9+fX19fn6AfX19fX19fXx9e3p5eXl5eYCCgoKEg4CCg4GAgoGCgYGDgoODgYGCgIGAf4CBg4GEgoCAgYGBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiYmIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgIGBgYGAf39/gICAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhISEhISXl4ODhIF9foGCgoGCgYKBhIaIjIWDgoKBhIKDg4KDhYSEhYOCg4OCg4OCgoKCg4KCgpKQi4iIh4mHhoaEhoWFhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoeHh4eGh4V/fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYOFhYaGhIOFhYOEhIODhIOEhISIko+MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GCgYOCgH59fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yAenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh9fH5/goR8fIGChIKAf4eDfYOBf4KCgIODhISEhISChIOEhYGEkZGOi4yLjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX19fICBgH2Gj4F+fYJ+f36Agnx8gH+CgIKAfn17ioJ9gH9+gYCAgYKAgoCAgIGAf4uUj4yMjo6NiIiHhYWFhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhYaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7e3p8goCBfn+BfH5+f359gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfXx9e319fXx9fHx9gH+AgH6Afn6ClJKNjY2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gYGAgIB/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt8fHx8e3x8fHp6eXt8en2Fg4N/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn99fX6AgIGAf39+fX19fX57fH1/f3+AfX9+f4yRjYyNj46Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgICBgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEg4CAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fXx+f399foB+f36Eko2NjI+Ni4qGhIaEhISDg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH19fX5+gYGCg4B6fX18fn6Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH58fn1+fHt8fHx6e3p9f4CAhIOCf35/fHx8fXx8gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOBf4B+f4KCgn9/goJ/gIuQjYyMjYuKiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfX59fX17e319fHp8fH6AgoGAgIB9fH18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIKBgoGFhoWFhoaHhYGEkY+NioqLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gIB/f39/f39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5/fnx9fXx8fHt+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiYuJhYiSj4yIiYeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHx8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CBf358enx9fX59fX5+jIZ9fX57e4ODfX5+fX18fX19fX19fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4qJjJGQjoqIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+f357foGSjHx9f4qAjYx+fn19fX5+fX59fX18fn18fXx9fX1+fX1+fnx7e3t8fH18e3t7e3l6enh5e35/g4OEh4mKh4mOkI6MiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKBgICBg4KAf4F/fX6Afnx/f4mCf36DkYSEg4F/fn18jYd9fX59fXx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp6eXl5e3t+foCBg4eEiI+Oi4qGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+fn9/fX19fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjouMiISFhYSDg4GCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBgoKBgYKCgoKBgYGDg4OChYaEg4GAgICDgX+AgYSBfn6Af31+gH59fn6AgH+Bf3+Af35/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8fHx8e3t7fHt8fHx9fIqLiYiGhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBgH1/f3+AgICAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x9iYeHhYWHhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCgoKDhYOEg4KDhISEhIWEgYGAgH6AgoB+f36Bf35/f4B9foB9fX1+gH9/gYCBgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHg4SEhYSEhIWDgYKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWDg4OEhIODhIOBgH+Af4CBfn1+fn9+fn5+gH19f3x9fX6Af4CAgIKAgIGAg4KAf4B+gIF+gIGAgH9+fn5+fX1/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x7e3p8e3yCgH+Cf3+AgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIOCg4B/f4GBgIKBgYGAgICAgIB/gIGAgIKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fH9+f4B9f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WEgoSEhYSEhIGDgoGDgX+AgX5/gH6AfX19foB+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgYOEgoGAgYB/gYCAgYGAgYGBg4KBgX+Ag4B+goOEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CAgICAgIKCgYCAfoCCf3+BgoOBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357fHt+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gIB/f39/f3x/f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4B/gIB/gYKBgH9+f4F+f4CCgYCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fH6AgIB/f39/fIB/f4GAgYCAf3yAf35+fn9/fX5+gYGCgn5/fn5+fn5+f3+Af32AgIB+fn5/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB7gH6AgH+BgIB/fYF/fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgoGAgIB9fn5/gH18fnyAgIGAgICAgHyAf4B+f4GAf39+gX9+f39/fX18f4CAgIB+f35+f318fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fX17e3x8eXd8eXd4d3d4e3t7e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgoGBgoCBgICBgH5/fn9/fXx+fYCBgoGAgIGBfX6Af35/gX+Af3+BgH+Af319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoGEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKBgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgYGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9+f4B/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnqBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoGAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgH9/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgYCBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYGAgICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9fHx8eHh1eHh5e3x8fXx7fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KCgYKDgICCgYSDg4SBgYOBgoKCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgYCAgYGAgoOCgoCCgYGCgYB/gIB/gId+fnx7fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIOBhoODg4GChICEg4KCgICCgoSBgYKBg4J/gIB/gYOCgYCBgYCAf4GBgYGAg4B/gIOCf35/goGAgH9+gYCBf4CAgYGBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9f3t5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKCgoOEgoOEg4CAg4OGg4ODgoKEgYSDgYOAgIKBg4GCgoGCgX6AgICCgYKCgYKCgIGAgICCgoGEgH6Bg4J/f4CDgoCBf4CCg4KAgYKBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKDhIaEgoOCgoSBhIOBg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYKCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhIOEhISFg4SCgYOCgoOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIKEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKChIKCg4B/gIKBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt9gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIKBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgYSFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6fH2AfX9/fHx6fH59fX19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18fHh2f3Z3f4SHg4KDhoODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgoKCg4OCg4GCgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fX19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODgoGEg4GDg4SDg4SEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODg4WDhIOFf36CiouFhYSDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhYWCh4aGhISEhIWEhYSEg4SEgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOFgH2BdYF6hH9/f3+FhIKDg4KBg4SDhISFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf31+f31+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg3+Dg32BfX5+fX6Cg4F8f4F9f4B9fXx8fHx9fHx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW53bHB5bHV9f398foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYeGhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fIB+gIB+foCAgYB+fn9+foF/gH9+fYB9f4CBf4B+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIGBf4GBgH1/f4F+f35+f4GAfn6BgoCAgoSHhoODhoSFhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhYWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXp9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iEhoSFhYWFhoeFhYWFhYeHiIaEhoWGhoWFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4WGhYWEhIWHhoSEhYaFhX13hoOEhIOCgX1/fnt8e357fHx9f359fH9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYeGhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhoWEhYWDhoaFhYWEhoeGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1/fnx8fn2Afn1/gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSGhYWFhYOGhoWGhYSGhoWEhIWFg4SHhYOCg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaIh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDg4eDhIGChISDgoCAgHt7fn18fHx+fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYaGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDg4KCgn+Ae31/fXx8fH59fH19fH57fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHh4iGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f39+fHx9f318fX18fXt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWEhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWDhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBgoKBhIWCg36BgoF/g4F/fn5/fn98fH1/fXt9fXx9enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHioeEh4WGhoiGhYeFhoeIhoaIiIeHhoeIhoSGhoaHhYWHg4SFhIeGhoeFhISDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCEg4OCfYGBf36DgX5/f4B8f3x9fX59e319fH15enp5e319enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSEh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIaGhoaFhoKDg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15ent7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgIGDgn5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIWFiIeJh4aFhYWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWFgoKDg39+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXyAfn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX5/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBhIWEhIaGh4eHhYWIhomHhYSEhIKFg4SGgoOFhIWGhIeGhYWFhoOEhYSFhoWGhISFhIWDhYSAgIKDf35/f39/gIN/fIB+fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t8fX59fYB9fXx8fYB/fXyGg4aGhoaFg4SDhoKFgYGAf3+AgH5/gYJ9fn9/foCAgoKChISDg4GChIGAg4KBgISFhIKBf4CCg4OEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhIaEhoaHhoaFgoSEg4SGhYWDhIODhIKEhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8enx8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gXx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWEg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt5enp5enp6e3x5e317e35/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTU09TU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc2PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjtBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8rKysvLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dXU1NTU1NTU1NTU1dXV1dXU1NXV1dXV1dXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzQ0dDQ0NDQ0dHR0dHR0c3Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19XV1dXV1dXV1dXV1dXV2Nvc3dzc3Nzd3Nvb29vb2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0E8Nz05QUM9QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNloSGhoaGhoeHh4eHh4Ky4t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLrR1NTU1NTU1NTU1NTU2K58gYKCgoKCgoGBgYGBg4uKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk08Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzm5QU1NTU1NUVFRUVFNMoPPr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6KmztPS0tLS0tLS0tLS0tmRO0RERERERENDQ0REQ0ZTU1NTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs8QkA4PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzM5xVFhXV1dYWFhYWFhXUKHx6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSkp83T0tLS0tLS0tHR0dLZlEBISUlJSUlJSEhISEdKV1dXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDw8PD46Ojs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183OeF5hYGBgYGFhYWFgYFqk7ufn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqazO09LS0tLS0tLS0dLS2ZlNVFRUVFRUVFRUVFVUVmBiYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PTw7PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcfFxcXFxcXFxcXFxcXEy9DPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs/Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS1dXV1dXV1dXV1NTU1dXQy8vKysrKysvLysvLy8vNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Pz8/Pz8/Pz8/Pz9PPz87MzczP09LSzs3P0s7Ozs7Ozs7O09TQz87S1M/OztPTz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dTU1NTU1dfX19fX19fX19fX2NjX2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O0KaSxdHSqKDQz9GkodDOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw9Qj5CQkA8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0qqdrJTOs56jp9avn6Gp0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MmXmYWlq6Gak53AnpiVnMjQzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDk2P0I/Qjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RpLC9mouboZy0mJyinbCy08/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9DVuZyHnZatuYaelq+zqtXQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD09OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/Q0Zqij5yBoJZ4m4Sdk6TV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APT08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1aekpaybqIiceZ+phZmk1dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FBODs/PD07PDw3NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0sCdosy2ta+mnIq9raaYr9bR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRj9ISEdFQDw8Pj48PT08NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09SkoI+5wKOXl52lp5aYm7vV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBDOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocjGpr2Vkaijq6Sb0J+rpJzR09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDUyo6Tl5CoyZCNt9fCj4281dLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPDw/R0VHS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tTCr7Cz0NXHw9XR1cXE1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR1NbW1tLS1NXT09PU1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjU4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BRD9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKeoqKeoqamqp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKiop6iop6WkpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaempaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6Kio6Khn5+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2epKShn56foKCdnJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaOioaGhoaKjpaempqesq6emoJ2cm6Ghnpqbm52cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqamp6enp5+bmpuioJqVl5aam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJiZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaOipaampaanpqagm5mboaCWnqKSmJqcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCP0RBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaSlqKemop6dn6GfnqmfkJSXm52YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpqalpaanpqWkpaampaOgoKGhnqd5jo+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ2fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoaGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKipKWkq7CjpKSjoqGhnKKWYZGVmZuZm56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacn6Ggn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6qwq6KjoqGhnpqmc1+XmpmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKfnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ2dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGtkqiloaCenJudn11kmpuZmpyZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGioqKhoaCgqJeBrJ+enZqYpIhYZpmcmp2em5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qbmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ+en6ChoKCgoKOkb5uknZyamqV5YmaYnJuenpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uamJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2enp6ep3mHpJuanJ2geGtmk52cnZ6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo8Pjk/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udnJubnKJ+gJyZm5udlXVqZ4+fnZydnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZmZmpqqf32Jk5ycm4hxaGiOn52cnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpucnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycnJmYmZmYon+GgoKZnpyBcGJojp+enZ6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5yZmJmZl6Cbm3x6m6ObgIdrZZCfnp6fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ucmpiZmZupnIhnbq2qjGiDgWyUn56goJ6enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmZegpoh0X2WeloJXcnt6m5ybm56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpuVop50Uk1vlYR4SVlwd5GUkY6SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJGRj6eVUzlAdIlxZ0U6VW+Bh4aCjYuGiYp/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaDgIqoeU5oVHSLd2VPVUNfd36AgpKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKCfn6CoF91jGJ/p56IXYZ7UWt/fYWOjYuGjZSSi5CXj5SXkpihlp6WlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiIqFgIJ9jJZjudSPvbqpt4d0fGlZf4aKjouNkJmclJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRjH+IjY2Mi4eSiZWCgc/EnNWtmrCeX4JxVHqRiYmQj42PlJSYkJWcmp2eqK6yr7C1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1ODc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZGeoZ2Tl5uhmp2bo6Gcbo+6pLjRsaiuk2yzp1V0lI+LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUpUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqamwo3SNlX6xvLOrlYddlsRsb5yioaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWUtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKlqaeoqq+Si3Z7p5eOj396am2Rem+Wo6inoKKhrqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVlpOUk5QT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2ZnKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSoppqdpKWjoaGrlHxbaZF+e4Byb2tzcXt7lJ2ioqChn6GhqKCcnqGloaCmo6KepKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPWE9eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKgo6ehpq2np6Ksp31sU1t3b3F2a2dkamZueIGPnqChoJ6doKOalpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nfc19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqGfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaeprrS3trm2ro9qY09Wbmtrc2hiZGJbYGZvdoCNm6OloaGimJWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfn6GmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbWppYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqqbTCxsbIx7+zppJ1YmBKT29xbXRnYGdnWF1bYGdsb3V+iZOcpJ+hoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrssDY4d7VxreqnZF8Z2JfRlJqbnF4aGBiaVlbXltcXWFiYWBmfKG9vaikmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh2bHBoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tba/ydXWx62YjoJ1ZWBjXEFRbGh1dm1iY2RaWVpbWFlbWVdnjbXAv7aus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllUYWlgZnNvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8O5vb7ByNDNrYBmXVlXXFVCSnFobWdyZ2FfWFtXWVdUU2KOvMK4t7uwtbaor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXZubVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8XBxcXBwcC9jmZWVVdSSER0a2Jgb2dZW1ldW15YY4y6xb6lpbG2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8foR/aWZoYWtsZ252cXJ1cWdeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/Dw8bGwbGUx8q2hV5WVE9HYmiAi4xWVV1gYV1ig7HBua6yp6uoqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx+dGtsbmRvbWlxeG55aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTExLm1wLa1yc+ja1VVUVNfmKmlUVZbXl5mlcC3pquzta2upaSjp6SgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl5e3Zua2lodVpmcnhzeWZmXmRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPEwsW+t73Dyrp9VVRUTI+tnk1UV1dolru0sa2suLWyrKmjoa2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWZpamhdam9ueXhjYmFgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx7/Fx8PHwotYUUuGsJNJT1VooMG9v7m8ury6vKytpqm7urm3v7K1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3ZoaWl0bXlsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc3FxcTDxcfJp3RNerKKR054rczNxsTBxMfBvL60sbCwwr6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdga2p3bGlldW50Y11iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXBwcDAxsvDk2R9ZEuDycnL0MW2v7/AwLq7vbWzs8C/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWdjamRiam1ub15ZXVZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcK9vMHAwMSTUElzyc7EyNDBr729uLm7u763tLG5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWNjY2piZ2NbWlpdWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8G7v8C8u8S9usDEv728uLu/xXlJoM3Ev7/Jv7DBv7q3u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFiY2hqZ2dpZWleVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1Y68vrvDtbrHt7a5u7y4ubW6xMqXTaXIwL+7wb65xr3Cv7zFuLa3tLi2tru7uba0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cW1lZWZwamVraFhZT0tLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+80MV5rcu9x7e5uK22tLe5s7Wyu8XKn1Ckyb+/vr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d8a25wZ3Brc2ZibmBcVEhLS0RKQ0NHPjo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNiudoS+yM/CwLiutbW7vbe5sb7Dx5hRos7Dwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcWZsaW50bndjZ2JcY1FLVUhFRUNHQjw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCx8nRmXN3sdHRzMrEtbq/xMi+vrS/wMONVZbPxsK+wby/w8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0bGxuX2NeYWJOSE4/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDCur68xL63vMC/yc/HyMrKwod1d6jMzMvNysbCw8vOwby4vbq7gV2LzMbEwMC/xMDKycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW14fGBxY1teX19UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7qt28K+tr7Avr66ppyqs7fEwKZ7eXyfxMbLyMHDwMDJysG/u7qyrnpsesfGxcS/wMG/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem5zeHRocF1cX1xaUUVFRE1JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8W2ba/Ovba5wLyqfW5obm10gpeZdXp/nL6/xsC5wLy+xcS9vbixsaCGe3G8yMPDvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdsdXtwbmlcX19ZU1BBRklHS0BFQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNsXWCtL21tcGkhmlaXmBOU1tccHZ6haS4t8K6s7u3u72/uru7ra6in4qDr8XDw768v7u7uLbBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF7gnpzdnZ3bnFhX2ZdW1VKPT8/R0Y9R0NDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaaEd4uisLWcamZnVllfSUlNUFRve4upsLe+ubK1sry5vLa5vrKtsKmXlJXHx8PAvb+5s66yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NhXF5PSUI/PUlERk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8aoh3t2jKGYX1NDWVVIYmpVT0VKZZGlr6+2urW0sqy8ubi1uMG9obGwpKN6v8jCv7m6ta6lrLOxprCtqJ2gn6WttrXCt7a0paiqqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S2trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnJuY11mWV1dU09OQT5KQkBLSkA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/s5CBeYiPbk5LQGVZQk94gZNoTUNehbG1s7WytK+su7q4trm/xYy1v66tbqy+uLWysa2tn6Smp52kpZyWmZmZn6muuayrq5+lqKSrrq+nsKuvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpbF1balRdW1BOSERHTUJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzt7aVjIiEe1hGQU+HWElKWXiOg2NBVaO5s7SysLGtsLm4tru3ur6esLWur36ssKmrraujqKGdnZ6Xl6CVkpaXj5ifqK6ko6Sgoqaio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHV0bmVVYWNXXVFPTUhASVJETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K8qZiZlGhNP1N5cU9JSUxonX9aRVWwurGss6+urK22trK0ta6ppZ2Zmpyep6ieoKipn6GnlpuXl46dlI+Qlo2Xm6SooKCioqKlpZ2jo6CepaCkrKWmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6qoq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6bmaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6ahiHiDfHZ/emN3bG5dUWlUUE5HUE1MQ1BRQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcGqpbxmRFOcflBYSUthSVeNYmVlg6+1qrK0rqqrr7Cys62lnZGXk4+YoJ+ioJyjpJ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6ionKehoKSfrKisrKCpq6agpKimrKOenp6al5qrpqqxo6WonqCclZOQj5GRmZCWlZiXn5icmZujmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn58f3V2fW5re2RoVlJkTUpIR09TTktOSDxFQDwyPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoKvGv8qeTkF2mW5PbUpMZGZ2dGFdYnSSsq+us7WqpqyropuZlI2RlZaYmJyfoqKcnaSemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoqWimpmer6iusqulqqqgm5iYmJWTlpqTlZWalpuXl5ihnpyclpuhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eXxleXlgYlNVYEhJSktTVElTUU05P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZykx8aLVlNKZqNZZn1vcltSa2NcZ2JgbZG0sLC4rKahnJ2alJeamZCOkZWRjI6Nk5minJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrG0qrKuo5mcnZ6hmJubmpiZm5SWm5aZnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2eoJ6gpaGenqWgppmBe4F8dnZzaIJsZVtTW1lNUUpPT1ZNU01CNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6Kan6qjjHlVaXF3dW9jd3ZYV2JgZGlbWldora6sr6efnqKglpCTm6CbmZeSk5+coaObnpuWn5qfl5uinqWhnqSfpKitraisqaSstLe2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCoq6iztrizuK2ytKSgnaWgrKGhoqGgmpiWlZ+bm5iloaCeo6GgnpucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYKAfHh2and1Xm1bUmBIUlVIRlVXSkNNRz1LSDhGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoKN/b4JwYGNXS1tSWkxMUVlSSE9OSJmsqqmkn5+ZkpKUmJiWlpWMiIuOlZ2cnZ2el56Zpp+gqKWxqqeuo6uutrC0srGutri9v7qttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q66xubi8r7OwtcK8t76zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6iopaSenaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZybWl3bWhtXFhbQ1dOSkdNR0NGTTw+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqco56ciWJXXmVgV01RRz0/QENEPz5CUnipramqpZ+en6KjnZ6dmpyblJOVlJ6dmJSFnZqgmqukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGxL3DvLezqrOtqrO0r7Ouqq+jnayotrGto7CmoKOwsa6wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeGgXt0cmtrdXJxaFZcUUZVSERKUEk/RUE0Rkg5NTw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmqCflXxfXmVgUEZFO0I+Rjw+OTZOfqqyp6OjoqCepaulnpeclJGZnZmVjIqGiIZ4bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM08e+v8DCvsfGwrfDysnDwca+urW6u7W7t7C2sqq6sq67uL+7uqu4rauquLu1vK6uuaOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtjaW94a2VZW0ZLTEVEVExEQ0U3Oj86NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1yaWFXTkU+SVl8b2FBPVyOrqygmZubnp6Zl5eXkoyOlpeTjo2QjIKDgndycW1wj6atrrS5xbvNx8u/wszNzczHydHMzMzHycXFzNDS1c7Tyb3Av8O7xsXIxdHTzdTQ09PMysLFxsbKyM/AydHMx8bIxcK8w8G+v7+2vrOtv8DDw8fFx8Svv7myuLzEwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWlpDTkxERlBJRENANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+OTtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnpVpZlxUSURAP0qFnqSYg6CyraOenJ+amJeUkpSWkZCPjIeDg4iHg4CBgYB5cXJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djR183Gx8nMw8XKz8rT19LX0tXW09TIzMfMzcrTzc7TzcXJysrBx8zHycnGv8Ozs8jFy8vLz8fKv76/vcHGxc3MycnAw8Cur7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaQi4B6cnV2Z2NndmpkVldRRE5GQEpRQj5CPDoyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGbYVNMSkRDP0NTsNK9sq+mnJycoKShnZqUk5WUiX14cGtlYmhyb3F7hYqAdXBucXRwhbPDvsXR0NfW1tLWztTW19TT0dPU1NPP0cPQ09bY1dbSy8nO0cvGzdHK0tXW2dbX09fYztLKz9HMz9DM09DAyMfKxMzMzM7PxcfItr/KwNLNzM/Gysi/xMPIzs3Q0c/NysjNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZXJiXVJcSUpHQUVJSj47QTg9NTU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaCioVlJQEFEQUZRdrKvp5qUl5+cmqCgnpucmZWJd2ljYV9fYF9eX19dYWx1c3Bwb2xycXWSxMjH1NbX19fT1tDV1NrU1M7P1dTU0dHM0M7U19bT1dDP0tPRydPRyNDY19jR19HX2dTVzM/Pys3Sy87RwMbDyMbPztHR0sjMzcDLzMbTz8zOyMTLx8fJzMrU1NHVz9LM08K5xbGlqLWup5uoq6Wdsqiws62sk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk1APD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48P0A9RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqiho6tlQzg9PkRYgqqon5eVl5manJ+dmJyckn1wZWNiX19hX15hYF9gYF9gZW1wcG5rb3J2d5zMwdPV09jY1tnR0tLXz9POy9LN1dTRys/M09bS0dbNz9XV0cXR1MvQ1NXWztLQ2NjX2MvIzsTJz8zKzMDKwMjKzs7Qy9DOzszPz8jM0NDLzsrDysfJzcvM0tPN09LR0NDKvci5sK67ubWrtrCtqLits767sZqPoJSRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWVucGFXXFpJRkZETVhFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSxeUhGQjtXjqGblZOWm56enpyTlpeUiGteXl5hZGJgYGFhYGBhXl9fXlxibXJvb3N0dnZ5pL/M1dHW1NPY1s7O08vOzsXOytLSz8fOzc7UzM7SzcvX1tDM0dTLzNDS08rO0dXS1dXKwMrCxc3CyMrDzMTGycrLz8vOzdDO08zGyc/NyMfLxcfBxsrMzc/Rx9DPzc7M0MXHwbi5vcPDvcO4srK+sbvDw7WqmKWhmJaSlZWSi5SNmpGUlI+PlYKJhnlxcmttZ2BgcWhZWGhWTUdMSVBRQjtDPjs2ODo4Ojo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8O4ytXW2drb2MzMz8jW1cTCta+0qJ+tl3hscHF5kJuNjJeVkJORkZWWlZCLfGVhYmJgXV5hY2FgYF9gYWFgX11bXWdycnByc3Ftcnmlx9PPy9DQ09TKxcnJxsa/w8XPzsfFx83K0sjLzs3G0dLQzszUysfLzs/Hx8/Sy9DPxrrEv8bKvcLHyc7Fw8fAx83IxMzLzM/IxMTQyMbCxsjEv8HHzMvLzsLLzMnHy9DExce7x8PIycLPwb28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Rka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68uczMxtDV1dja29jQyc/P0dPIwre7u62jtn1og4Wkq5SOjZaPhYODg4F9hIR+c19bXl5eYF5gY2RjX11dXl9gYF9bWlxgbHJxb29rbG9vfbnRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMrJyMrIwcXMxsjKzcnEwsvJwcHL0MXLyL+5wrvGx77Axs/LxMDDu8nHybvJx8XKwL7Cy8bFxL7GvbzBw8XMxcW8wMnDxcfSxcHJv8rJxsjG0cPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Gmm6Ogm5V8d3N0ZmlaYW5tWltYUkRMRkJHRUxERlNANTQzMzU/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76xr7VsXnp8oZGLkpaGeoCFhX91eHVycF9bW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWtwb3OPx73KxcvAxsKwtrqysrOyscK8vLy6uMHBwcS+vbm9v7nEysXGwr3GwLi7w8m/wcm7t7u6xsO/vMHOw8a+vrXBvcO7vca7w7q0vMbEwsK3v7a2vr+7zMO8tbrIur++y8PBxsLFycfJxtDGwszIssfJw87MwMXDv72yt7Cyp6ioubClrbCqrayUenZ3amRnYGhvY1ZeWUpGSkZIS0FFQkZKQDk6NjU4ODU0Ozo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKycbNzc7RyNDF1dTW183KzsXJxcfBucW9q66lX2R1g5OLiIuEeH+Ghn9+hHt0dGNcXF1eYGBiY2JiZGViXVxbXF5cXl1aW1xeaHNxbWdnbm9yeZ29zMDDusG4rbCxp6qtrKe4tLa0s7O0u7a9sbewta+yu8K8wcS8v7u1srq+wLjIubS7t8HCvbi9x8HEvLWvsra6v7TFt7u1q7i9vsC9sbq2sLe6s8a8t6+7v7W3tcW8vsPFwMTFxsfLxcDGxrvHy8DPycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl1WXmBGS0hISkZCREFFRT88OjU2NjYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMnIysjKxM/N0s/NxcfBxsC/urfJtqqwmFtob4qPhYiJenh+hoZ2d4F8c2hdXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5pZmptbnJ8pMfAuLi1sKusp56iqaeeqqyzraqsqrSttrGzqa6nrLO7urbDubq6sau1ubu0wrqwwLG+vLu2vMi5w7atqqiwssC2uL2wsaexs7S7vKuutaautq67srGqubCuu667uLvAwL66w7/Gw8XAvMbBx8u4xcfFv8fDw7rExsK7xsnMy7O5wr27s4lzd3ZraWBibGhYV1dbQUxLTUpFQUM/RkE6OTo5OTY4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxNDHzcHDxr/ExMPDysLJyr/AvMK6s7W1w66qsJFban+Sh46Pe3h9iYV6e4SBd25eXVxcXV9gX19kY2JjZGJgX11aW1paXVpaWVpcZW5vaGZoaWtucoGturC1rqWlp6eaoKSgmpylq62kqKKrqqyrsKOmn6qttLaxvbmvt7Corri0s7y4tL2vuLm1srzBssCupaijq7Gys6i9qquoq6yttbOlqK6hpK+psqaoqK6lqLessbK3urq7sry+vr7Ev7XBwcfIt77AxLfEw7+7v8TCvsTIzMq/v8PAwKmHc3RzamlcYW9jV1ZYUEhZUlNLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPHubnLwcu+u8m2vcO+usq3wcPBtLa8trGvtbutqKuSZG2Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBgX15dXFpYWVtbWVhaXF9ma2ZkZ2Voam9yhaqlrKWenKGklJ2kmpeRoaOpo6Ofpaanpq2gnZykpqyysLa3p7GtqKq0q7S6sba2rra5srC6urG3paCkn6axqKuouaqkp6eop7KtoKemn5ukpqyfn6ejoKGxra2ssrSztLC1vLa7wcCyu77DwbG5ucKzwb7Atbi8vb68wsfFw8S/wMSgg3hwbGJmYGtvYFVZX0hOZ09UR0ZLRjw9QD06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs+OTc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItLa9uLrAur22oJ6UnaGmurars7O7s8TPycvDxri3x8DMv7jJt7vFuLPEuLO/wKy1vLKspa+zraGjkWlyhoWGgHx4dXNvbWppaXBpX2BdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2drbW+InamflpWaoZabopiVjJ6hoqecoJ+kpaKnnpujm6CrsK2xtaSpqqqsrKS0uK23sKyztq+zta+wqp+en6OisqWmqbitoqamoKitq5mgn56ZnZ+lmpqjnJyer6mrqKqrra2wsrivuLm6sLa8u7qrs7K5s720trGxtrW/tr7AvsPCu7q9l4R6c2tfZV5kZFhUV11JV1xLT0dKSkdBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfFz8jIwMa7u8PDz765x7i3vreywrSxu7usubqxop6pq6eYno9tfoWGf3hybW9ta2JeYWZmXV1eXV1dXF1fYWFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrco2nnJOUlJqXmqGWlpCboqGonpydpaeipZygoZuZr66ur7KhpaOuq6eitbCysqypr7OnurOmtqCin5yjoa2joqq2q6Ojpp6lpqOWmZ2XmZudoJqXnZydnK2hq6ejo6atq7KzqrWwsquzubSvqq+ysrO3s66pra6yuLG6trq9wLizsZSFeXVmX2ZeW1lWU1pVS1tRTElFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr68v7OdpaOYpbHCtba9rbS4wczIxr/FtsHAx863wMS9s7m5s7+2sbm7rbK0r5+apKqglJqPeH+DhH94b3F0cWhlY2hkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oJuTk4+TlpaelpiTl6CdoZyWoKGppJ+fqZ2bm6unr7CrnKOkuKqhoK6otqqnp62xpLiwpLego5yZmaqnoZqsua+ioaScoqCgk5ShlJaWm5iYlpeclZ+pnqmkop2jqqqxrai0rKqnrbOwpaqus7GwsK+vp6insq6xtK+8tLq4rqOUgXp2ZV9hVllYU1JTS01eTFBMR0hMS0U9QD49Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+t72unaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa68u7W7vLW5ubCvsKqcmaGplJGKi4CAfHdxaWxydHBoaGVkZmFcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiYmNmaYGVkpSLkZOTmpiclZacn5yflqCfp6akpqefnaCmoKqvpp+io7eooaGiqLOipailsKWxrqy1nqGdlpWpoaKUrbGxn6Ojnp6Ym5OLoZSRk5iYk5eYmJeep5unoqKapKWlq6SlsKelo6urraaorq+vq6iqqrOlpquvtLGuvLaxr6+gknp3cmVhXFtdWE5MUUhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6lpqy3u7zBxbqxubXEycnAw8bFx7bFxLPBv8Wrt7e9tr26u7Wyq62omZifo4uJdImIfnZuY2FmaWhmZ2lmaWxgXVxbWlpaWlxdXFtcXl9cWlpbWVlaW1dVWFdUVFZVUlRSVWBgX2BhX2FhY2RpgJKSiI+Nk5GSnJSVlqSZoJedoKWiraalpaOko52qq6Wan6WxqqChnqWrnqiin66sqamuraKiopWXopuckKupsJyfop+fl5mTip6RjZKTlpCYmJOcoaOdpKGilaCipaWbo6uloqSrpKuupa6yqaalpqa0pqmorbO1tLm6sKqsnoxycG9gW1dWVVJGUE5IWlxQUklUS1NMRUdKRDg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rLS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1ybyxvcPIrLG4wbW8wLy0taqsppWZm5uIgXKIg3t0aWlqbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJSTlFZXVxdXV5fX19iZG2Nj4OQhY6QjZmTlJKcmqKcm6GpqauorKeppqSZpa+llZmlr6mgnJmboZ6vmZyrs6Clpp+jpKGUk5uWlpKpqq2anaChoZuUkIyZjoyRjJKNlpWQnaKgpJ2bo5WboKOhmKKoo6Ooq6Crr6Stt6ajpKKsraqoq6+zt7K9tbOrr5iFdHNoW1hZU1VSRVhMUVtYTVROUExRUklOSUI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraezt6+oqK+um6morLe2q7zKu7a/rMvGxbjBzs/Is8S6t7vCyLCtuL+3vL27s7WmqaCWl5iWh3p0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXVxeX2FkfYuAin2Kj4mSjZaRl5mioJugq6qmr6yosaWpmp+toZWWpainnZiQj5qerpeZqKqZn52UpaGfkpGSkZOVqKulmpmZnp6WjYyLk4aJjYOPi5KVkaCeoaSYlZ+VmqGinpSbpaaoqKigsbCmsb2on6OstKqup7C1sLm1wLGusauRfnJzYlZUVk5SSkdWUFJSTExXTUpNT1JHTUtBQ0ZERD5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ymsbeqpaKxq52qp6mysKS2xrS5urPKxbm6wcvQyrG2t7y9wcOxr7G3rbS0u7O0oqOdnZeXlIOAdmtnbG5xbnJrcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWp/eX50h4yGkImXiZSUmJuYnqmboKumpqyeqJqgppyTj5+jmpeXhYSSm6SQlaOdlpaWiKKbm5OLjoqQmqWnnJWVl5uRkoeUjouBjI2AkIuSkpKgmqGilpSYmJWippmNmaSmqaahoLSyp7K4oZyitqypraSysqa1vLWrrLGjiXlzbl1OUVFMT0NNTk5QS0ZOTkpKTk5RSE1KQUhMSEhDPjg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLawpaekqqWgqaaks6qissO1tbKzxsa2usPKzMazrLm9tLjAr62psJ6mrrqvrZ+Zmp2VlId7g25fX2ZycHZxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYW11hbnF1b4OHgYd/kIOOipSRk52hj5qco6KkmaWXopyVjYeZmoxzjYN+jpeWhpGakJSOjnuZj52Mgol/ipigo56Qk5iWhY6ClH5+dIqNepCHk5CQnZuampGWkJ2Oo6OOiZqgoaSkm6K0r6ywrJ+YpbimprGhsK6csLyqqa+qmYN3c2NWTVJPUE1DU05MUE1CUFFISU5STUhKSkRLTUZLSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0wMjc2NDc4OTo6NjU6ODdBN3i3oaO0qaalqKOmpaamprOnpbTBuLC0sMnEt7nBzsa9s6y6waytw62noqaSnaa2raOgj5WWkpB9d35mV1ZfZ2ZpZ2huY2lpZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVVllbXWlqcWt+hHtzTlhyj4KXho2cl4uUkZ+YnZWUlpWPlomAlIlfO1ZvfIyUioCMkoyQhoZzioWXgXmBe4aTnZSDlY6RkIOGfZN4cXCGjH2JgZGNkJeamJOLkIqdiJ+Yh4iWnpqhoJenrqmtqKielq2zoqaumayrmKi0o6mto5N/c25fW05TUldMRFRKUE1MRk5PSUVMUU1LT0pJTVBGSUk9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjrqGmpqqgpqmno6mvqKe0wrmwtbDHwrezvc+/ua+utcKnqsWqop2Yg5ScsaKamIaUj4uHfXN1XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1PUlRWWFpgbG5neoFzUEI/f5WSkX2IlYyEio2bjpaViZKIhpWGeYl/YEpRbniLkoR9hI2KhX9/bn9/lHh1dniEjZpwUY2IioZ8fniUdmh3hoh+iomWi46RkpaMhIqIlYSbjYKEkpqWnp2UpKOoqaWknpuwqqGkpJGmqZaiqpyipqiJdm1mXltIUVFTTUlVTVNJTEtPSUhGSk5MTVRLUVBPRklDPTc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTg5Ojk5Ojo6Oj85d7aco6edn6Gvoaeopaeor6yqtby2uLazwbu2qLnIuLaoqLW2qrK9pp6VjX+Jk6iWlYp+joOCfXdwb1hNS01NTkxNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DcnV9aWhcVJCJlIh0foaBfIWMk4KSmouPe4aPgHaAeHNvdnB0jo6Ben6Kq4R5e2h2e45wcm14gYuNknh6gHuAdnNyknhndYSEhIV8lYqIio2KgH+Ei42AlIR8gI+YlJyWkZ+dqZ6foJ2gqaWenZiNp6SSoKCWnp+kgXNoYV1cSldQUkdLWFJPSkxNUkpKSkxQSExRTFJUTUVIQT03Nzs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqqWtq7Cxqr20sry4trq0sZ+3urKqnZ2sqaiysKGakY2UgY6cjpF+doZ4fHZvb2lYS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedIJ7eGZ2jJaYjY58Z3mBdniAiZB9hJiSgXGHj3x3e29rfq19dJCLf3uGkoF8f3VmdnyGbG9nc3yJjIeAbHlxfXFtdo9xaHGBfo5wQ4uFgoOFfnd3eoyGfYx7dX2Oko+Yi5Kam6OWmZyanZ6hnJaNi6Wajp2XjpaYkHhvbWZjWlhYVVFKU1VUT1BOUFZLTktPT0pST0hOUExGRDw8Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpahprCsrquoqbGvsau8uKy7vrizrKebsKesm4+WnKWppKCYmY+FknmIjouKdXF7bXVwam1qWEtGR0VBQENESExMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOT1FUWF1lcHJsiKeqwH50eWJ7eG97eYmQen2Lhm9tjJJ5dHlqaoCCcZaRi4F+loBJkphuaHh+gm1pZGx5hZCShmtzbHxucnyGaW5wf3ONiYSGe35/e3ZvdHSGgnmBeXB8joyKk4OWl5iakJKWl5mXnZaMg4mekouSjYaQloBvam9ub1hWWFRSUVlPUlRUUlhVTU5ITUpNT0tDSU5HRkA6OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WssKOtqqi1r66stL+rvMO/paKalaSYno2Ei5ShoZmZkZOLc456gIaMhnRvdGtwbGRsallOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcX6eHYZppc3llfm9tf3qLiXaCiIZ0bJqSdHN8amqdj015hZOJhI5nMXaGc2x+fYN0ZmV1f4SEhYBmaWx1a3F/fGhxcXxuk42PfHR+fXFwbnVtgn93eXVqeYmCiImDlpKSkIuNkZSUjpeNgHmIl4iGioaAkIh3a2tvaGVYUlpXWVlbTVBVVllYTklIRUpKSEdCQEdFQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW6SiJqRmZajqK2esZ6nuq+rsrDCsbvDx5qWj5SZi46FeoSQmJSNkIyPhnGHgnSHjIZ5cHJwb29kcGZfVEZJQz88Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7KgcXt4bH1scYOChYF6hIaGeXKhlXR4gHN1lIc1cZ2onY6hoYSihXZwh3yHfHSMro2JgGhnYmpucm1wgnVpb1h1cI6bkndsf3p9bXJucIB7c3ZuYnaDf4aAhZCQioqJkYuRi4uOg3V4io6AfoOAfY57c3FxbWBbXV5bWVhgX1JOW1pYV0xISkZKRz9DQUJIP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnn6+VpbSprrGuwbK7wcWWkIyUj4CIfG6BkJKJg4qHj4Z1goRslYiIe3R4eGx3bndjaV5KUEc+PzY0NDk7Ozs9PkBCRUhMTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHaIiHx+hYN/jH51opl5foaBhJmEmpxhhqqfnYuDkI16d4h+iYmOc4uXj4R6XWRxdHp8d4ptaGpieW+FkIJ6boF3dIR6cHR5eGtuaV12hnyHfIeHjn+KkpeDjYWMhn1xhH+EfXV3e3yJd3BzdGZnYFtbXlNbZ15XUFRYW1VHSkpES0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJGcnZ+mkaCqoLGor8CxusW6lo6RlId7hnZrf4yRgn2KhI+MeIOAc6CEinx8gX9wgH56Z3ZrUldMQEUyMTEzNjY2ODg6PD5BRUdGR0pLTU9RUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaISIe4l5fHF8j4x6fYmHfpeHdqGZiIePkpSljayqSIaur6+LgYCTi4KLgoSSqYeAmJiKm3RtfIGGh32OaGdoeX9uhYeChXGEhkdsgHdyeXZobWtfdn2CiH+HhIt5lJ2ciYuIkX96dYt2fHhtb3d+gHR0cmxbXl5bY2NYZ2VbVE9QVllQRExLRk5JQ0ZDQ0BAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWHkY6Wl5KXoJ6soaa4r7O9s5eNkouYi310cH6Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTI0NjY4Oj0+P0JFR0hKTU5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BYcFlcXmmNk4eVgISChZGTfoWIkYGalYKhoZiVm5umrZOau7Gnu8fDqIuMoaWPlIqBkXxxg56fkZx/doaFi5CHkGpob4OBdI2HhIpxhYJ3h397doV9bnZ1Zn+UjoaJiIeIh6CropWJjpd/eoKIenlvZ2t4fnt+dGxlXVpbXWpdYWZgWk9LTldSUUlQSkROR0NKREJBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmd4N7gIx/gZCOipqbpJ2hrKarr7CXkZGEoZSEeHd/jJR8fpKFkpV/ioCSm46DgIGMioKJjYN/ioBtcGpdQkA0LS0vLy4uMDIyMzQ3Nzg7PT9CREhJTlFSU1JTU1RSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZfY39nZ211nZuPmpKTi42OmoiSj52LoKCSo6qlo6yTqbaiqMHCrseveLqUmnyNoZ6ZhJOFgo6in5OYkoSKhY+ZkZZscHWJjIKWjI2Od4+EcW2FgYqWkYOFiHGIoJWGkomOj5aktambjZSig4eTg31/a2pqfIGBgnRiXmRfW2drXWxrXldLR05SUU1MTEZJUENETUZBQ0VGQj05OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWW+Cb3WGcXaShn6XlpqUnp6cp6CplpOYnmdlpJp+hJKReX+SiJGSfYqEmJKQgoCAi4yJhZCHhYmFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5QUlRQUFFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6elopmhl6KUnJ6nnqirn6isqaq2l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqbmaeRkYiVopubeHp+lJiSoZOXl4GUnnt3lZKrsoiNl598lJ2bjpKVmKOipravnZGZqIeWj42BiGxzc32AfXJpYF1hX2FnZGBnZltSRUpLUE9JSUxGRk1DSExGR0RCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdGBtfWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImLioSShYOGiYGAhnZeYlA0NjAtMS8sLjAwLy8uLjAwMTU+QUJNUVJTUVJTVFJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk5PUVlthZB3lYqjp6q0vbikraysp6i0q7C2srKtu7GzvZyzw6u6ycu3w7+4paKws6ytqqOLlpiFpqago5eBppmNoquopIiFlKShoKuhpKmPm7CLlaOmt7qboKOwkqKdop6Qo6Grr6yytKKUpKqImYmSiZV6en2Ff2hhaFxlYl1kZF5mZ19aT0NJSFNORkhMRkpHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaGNXaW9YeoV2gZOFh4Kbg5KQjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkI6DhYCLhYaHkoaChImGiIeHcG5hQEU2NDwyLzExMC0sKy0xLi00P0NBTVVRUlNVVVZVTltQR0dEPD4+RkhDRUA4Ozw1Qzs9RktJR0hST1BXgZKghK6js6qywMfDqrPFtqyzv7O4vra/tMG2u7qjuMWotsnHtb65taijtK2wsZuZkpqfiKevq6WUdp+kl6GssrOYlqquqK62u7K6rK+1orGrsbW7t7SutKCnqKOnmqmvrbK5t7imm7aojKSOkZKfhniCg3ZaYmVXZmFhY2BgZmBbVElERExVUUhJSkRJR0VBQEBLREJNRzw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtaUWJjV3l1cYGUfYSGk3WFf4CMe7+7o7yCtJSTjZuPhIiPkomIeYaAjJKMh4WBjn+BiY6GgIaIhYqHkXp4bl1WQEVOPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcVk9eVUlLSkFAP0dLRkZDOz5AN0Q3P0JKSkVGV1RQXo+kraOxtMO2uMHMyba7xL2zs8C2uMG1vq+3dLGzpbrEpLDGubGzsbSopLW2qrGgopabopKlsK6mraynpJigrLS7oqiyurW8v8y/xcW9vbPCt7q4vre6t7msrLCmsaqtvbC8u8HBq5m6qJOtj5eXqol9gn1rV2RiWWtlamVXXGNZVlNJR0ZMUUdDSElBSEQ+P0JCS0BATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1NZVVp2anB+joSAjYNuenN4h2K5oZmjiZSUlpKUk42QlpKHhnuGgY2VioCEgYp6fIqHhn2Kg4GKg5V9d3p1ZU9cZEdFTDtRY2FbXlNGPztIUEVaY1FSWVhaZ1lUYGBNU1BFQT9JSkhFRUFAQzxFNkI+SEdKTFNaVF2Trri1urjIv7q9ycy7vMC7t7W7ura9tLqxxmB1sqSxmp6rvaqlqKurpKKytaCrp5+Vlp+Yn66lp6aln6OUo6extKeys722wb7TycnTx8LFzMLKw8C+vb+7vLe0r7i3tsO5xb3CyK+euamhq46kqLaIgYBzYGNiXlhiYGlnUlhgVlFVSUVFTktAPkdEPUtBPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhY9zbHJyc4fVwLWZoI2VmJmRjpeRlpaOhod9hoOMlot+g3+CeHuLg4d8i3mBioKXfnR9emtlcHVZXVxQZWRiYGVkXVtYV1xNZG1VUm1tX25fWGdkVVlVSkRCS0tIRkhISEdBSTlEP0hLVFRWXFpbk7jAuL23xsC7ucrKura5tbi5sre1tK62tphkdaicrXBeoqycmKCim6Seq6WUn5+QlI6WmJenn6WfnpqZg6SdrKWqsK24sL251NHO1tDJzNLMz87Kxr+/wsq9wbzBwMTExcq+yM6zpLuwtK+aq7i7mYB7bF5hXVleYVpjY1FbYFNQS0NBRUZFPEBFPkFIQUBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRXFloX2+XkpCUbmxvdXWHs6yhoJ+LmZyZjI2VkZuShYqKfoiHi5CLiHyBhHN7ioOFe4l0gYmHlX9ze3lrbXV7aHJlaWxpZmppaGBmaWhsWm1zlq2kvIiHZ1tvaF1aWlRIS05PSktQS1NRSExBSkdKT19eYmZpYZe3x7C4sru9tbHExrWwuLCvu6uysaert6yMtaedmqeaTpqdjI6flpGmmKWVipOTiZCJkJGRnZuhl5qVloeemqebrK+osKe0tNTU1NbSy8/U1c3Tz83FwsnQv8rJysnRx8zNwtDSuK/DvMS5pba6w6KDb2RdXV5ZYFdZZlpRXVdPUEJCSEVCSDtBQz5BRz8/QTg7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVZzkJCYgmhxb3l5g6CqnqWWjJqbl4uNlZGajn2Ji4WNioqKkId8hIJwf4iBhnuHcoORi499cXh1a3F4fnF7bnhzbGiBcG1jam1weGl3fH7Lv8Hfp25jeG5jW2FgSlBSVU5ZXlBdXE5QTlRRVVRcbm12gnGWrbistKavtqqsvMCwq7SmpLimq66gq7SijrGtmpeYjJGTkYSOm4GNppGciYOLhIqJhIuDlJWXl5OckZyYmZmfnquspKeirK3P0tXRzcvS09TQ1NHOyMPU0cfN0tPT18zR0cXS1sXAzsfHwqi+t8+eem9mXmJdV2BTXVpQUVRQT0g+QEZBQkU8QEI+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU5bdYaFindsd3B9fn+hnp6hi4yYk5OMi5OPloR5hZCQjYuKh5GHf4J7cn6AgYd5hHWFk5CIf292cmtzfHx3e3OBd3FqgHNyaXBxenlyer7Lmn6MsoR2coR2aGFrXUNaWltWZWNYZGpTWF1dYGReY3d6fouBmKmjpKGfoKilqrC4qqWzo6GtoaOtoaexn4mmmpOSkYmRj4iBlIlqlKKMmYSAhX6Rg4OTlq2LlY2Vmo6GkpGel6ewoaChpaSoyM7PyMLL0dTR1NPO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsw8PMjHNvZGFgWFRZVFxQS0dKSkpAOzo7REFEPEJDPkdCPkJCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnZWdlIWLlYmPioiOh49/eIOUmIqNiIiLiX6CeHN7fYOHd396h5GWgINud3BtdX92eH10hXx5bId2dG59doR1eHudtYw7QYrFpX6MfGllV0lDZmNlY2dqZG54W15maGtuaW6Ag4iRi5ydoJ2Ql5ieo6OmsaOjs5+hpZ2gqaCjsZyGnpKSkpCKjouGg4+EfpybjI2ChIV6lH6CqZWjjJGKl5KLfZeKmpKrs5ianKicp73Dxrm2xs3S0NLQzNLLydTO0NXa19fY1NnYzdjbzsnZ2tHWvsvMtHl3b2VeW1NWUltWRkdKSUVFPTo3OkBAQjpHRD9EQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfJeRnYt+h5KDiYaFiYKHfHiFlpaIjoOHhYZ6hHlxenuEhnV6hY6NnXmLcHxvb3p/cXuBcYOHgG6OenV3fXyCdX57hoevc1ipwraNkYJwbmI9XmhycHFwbnh2gWVob3J1eHF6i4aOk5GblZ+Vh4uTm6CbnqqfoKycoZqYn6aen6uZi5qMkJGNhH2Ih4OFi46gmZOIg4d+bZl5hJiGiJOMjZSMhnubiJSPrqqUlZefmaeutb2prb3Gy8nJzMvQycPSytTX2dfY19Xb19PZ29XQ29rR1sjUy5V6fGppXFtQU1ReSENGSUg+QT49Nzo9Pzs9Rz0/QUFBREE+Pjo4NkRCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw6OkQ/Q0dSa19tZGJma3aAiHGRkJqAeoCNfoKCgYR/g3x8hJiOh4t+hoaAd4J5bnt7h4J0epKejaB2jnWCdHWBfXSAhG+Bj4FvkoV0fICEenaGe4m3xaTBybiClZuPd3BlTmZjgXqBd4aikIp4eXZ7g397hHZtk5aUlY+XkIOJjpaZl5alnJeflp6SkpejnZmrlZCQiY2RgoyFiYiBhpCRnpuZiYWMgYaXeoiIn5ePiI2Ki4J9oYmQi7yhmJOXmpyppqWun6i2v8DAucfJzc7FzcnR1tXV2dXX29TX2drb19va2tjO3MaHfHtoamZgVFhVVU1MRE5DOz09PDg6PD45PUA2PT9APD8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6int+gH5/fIR7foGRiYSFeoSHenV9dG18fYZ+c36SnZGeg5F8hn54jn14iopugpqAdJmGfYGIhHt9kHqPqI6Pw6C8jJyjnH2JhH2JcouKfnOmmpyYk4V7jpCIhGhHcaCknYyLkJKFiYqQkpWPnJqTlJCWjIuVn5yUoJSRjY2Pin6Qjo6LhImSlpqen4mMlJKdkYKLf6WZiISNg4aEgKWHi4u4mJ2RlJaip6Gdnp2jr7a6tazAxcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u4eXl5bWtmV2BcU1BPSUNMQj08Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3RD84Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlhfVlhmbW1taYGOinFyeYp7en98f3uHe3x7i4eBfnWDhXlyenNtgH6EfneFm6GanpSSgIyIf5iHgJuSboeohXqgi3yRjYKIhJt9mpCKjKOin5CjrqCLkYuFi4GThldyrYufq5uPg5ibj4+OW4KikYKMn5OUjIaIjJKTjJSUlI+Lj4mHlpudj5WWkIuSk4WAi4iSjYqKnZaZoqOGk52WoIqJiI2ckIOIj3+Dh4WkhoyQs5idkpSXoaGemZKcnaeyuKymvcLHzsfGz8zQzM7X0NHUrtbV2NrY2trX1tnZn3F+dWlnXl1YVFdYQ0BIQz4+Pjo0OTo7Nzo7OjM7Oz89Pjc7OToxOkg+OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J5bWJ+koNvbXeLeHl/eoF8hnx7d4aEf3NwhYJ6dXZ2dISDhX1+kqajn6WiloqdkJSXi4qol3KKsY2Ep5KEmZOEmYyilZ+Yk4manaKSqa+fkJWQjY6IloxujbeFmsTIspuhpZucmJaRspFkpM3HlY6Gh4mPko2Nk5SJhYqJhZaZm4+QlJOGlJeEf4+LmYiNkKqXl6OjiJmflpqIjoeXl4qEjoyBf4ePpYmNk6mal5OWmaGZn5mTnZuis7Slo7zBvsjFxcnIycLK083N1KnS0dbW1tja1NPazoNzgWlkX15eT0pVW0JBRkM7QT04Mzc7PDo4PTY0OTo8OjgyPzk6MjpJOj02N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ1go58fGx9iHh6fnqBgYJ+dnaAgntsbot/eXx4eHyEh4t+i6OzqKOrsqGWp6ClpJaVrqKDkLeVkrOZjaGgi6Sbr6KknZiQp5aoma2vpJeVlZSQi5iZlqDAjqPJuKuaoqWtmZGanLKdhoWoopyYhYiJjpWNi5OPh4GGh4iTmJSMi5OThpSYhoORkJx0kZmylpekoYicmZOPipCLl5qJipaOhn2MmJ+KkJCcmpmTmJiflKCdlZ+bobGuo6S3vrTFx8S9w8O/xs7KydKnzs3T0tDW2NLP2Ltze3deYVZhV1BISk9FQkNENT46NzY6Pzs8Nz00MjY2OTc3ND01PDU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER05bXFlKZ2E7SISLenpthYZ5fIR4gIWBfXB4fH18b3ONen2Be3iGi4mFhJKou62osr2vpa6zs6ijorCsipq0nqK4pZWspJeprbempKOfmamYqqOvsKmamZyUlZGXoJeZu7utyaBptrirsJSYnqKrkpe9o16qsoKJio2Vh5F8j459g4aNj5SUiIeSlouPlY2KjJaZkp2as5aVq56Lm5SSjZCSjJibipKekIyJlZ+ijZWOmJqdk5uYnpShoJScnKWvqKKls7irwsjEtbu9u8XIx8LRocbJzc3E1tbQy9OicXxqXltVX1JQRkQ+PUNBQTg/ODc0PkY8PDY8MzUzNTU0NTRCMzo6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZUhiYGNwSkCLin6AcoaHfIGJdYKKgn5tfX18f3B3h3eNgYd7jY+Mhoyaq8LAsL7Gu7K0wby0rauztoyosq6uvaqbu6Sorbm3q6amoqKjo6mvsrGqnZykmJuYl56ipaWSo7muqMC7rK2yuaWkp32IhpytvbCDi4uLkIOPg5GPeoGHkI2OnIiIj5eNi5WXlJCalpynmrGakaudjpmPko6VkJCWl4+RoJGIlZukrJSWj5ScnpSgnpuYoKGUmp6op6Sho7CypsHGw7CwurbFxMK+zafHw8fDvNXQzcTKiXV0Y11bYVtOS0NMQEVGPkE/Qjs6ND5BPT01PTY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGdHYGlnWl1bk4yMiHuHi4aDjHWGkIqBbn58gn9xfoF6lXqSlJSYkZOVp7TGycDCzMHDuci8uq+rubuXsra6s8CupcCkqrC7u6quq6KinqerrrWwqpugqpyinJWesLSni6K6urXBu6uonLKkpKiUhI6pw8SkgouOh4iEhpWUjXqDjJGPkaGMjJSRj4mYn5eTmZSXpqCunYyqnI6Vj5KRlZWOkJWRj6GUhpefoLOelJuUoKGZpJ+aoJyglJiepqSmp6SvraW/xMKuqbe1ycO+ts6yxb7DvLPRysjBtXZ6bl1ZXWtTTUlDTEpKSUBBPUNEPDVBRDs6Mz04QjMzMjI2MkEwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmdcTWVcZlRjapmNlomLiJKPhol5hpOQgXKAfI1+d4eBgpB6jaGWqJqamLq+yMjKwtLJysLNvMGzrbu+p7q/vrzDt6zBqayzu72qsKmkpaOrrrSutrWgn66fpqKYo7S9qZuovMCjtravq5KvrKqrloaaqaalkYKMk6WViYB1ipJ5hY2RkJ6fk46Ui4+NlKOZl5uUlKOeqZ+RpZqMj4+PlZaIfY+VkpKjmpWgopy1ppGfl6Wko6WenqaYnpWXm6Wjqaiisqyou8DEr6Wzt8zAua7Ds7u+wbitwsLBwJlvemNZV1xcTExNSUdEQ0hCQkFDSzo0REg6OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5rSV9YYVpkZVaej52Ol46ekomKf4mfkoR4hX+Vfn+QiIqQgJWgma6no5jCvcjEyMbTzc7Ny7zCt7C6vLS8yrzDwba2u62zv7m8ra+ooKmntq2uqbK3mp6toqihnau3uKmlr77Esb24s6eps7OtrpaVpaynoJGOkrHFp5WNfJGVfYeRmY+qmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi4yPj56IWpCXl5KWpZpmmKOfs6WWo5asraunm5+nmJmWmZWhpKimnrarqbq8w7WltLbLwbiqtqyzuriuqLi6vbiDbm9bWFVWT0ZLU01LP0FIRURHRkc4NUZNOz43PkFKLjMyMDI1QjU1UFdOO0xGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhXOz1AQkZCckZpSVJlYkxGppSclqGXqZaMkIOHpZKIgYeCnISDlZCRlI6aop+vvq6hx73FxMfHzs7O0sq+u7axuru8vs62xL23uLeysrWzuLKrppyrq7iqqaevsJejrqSnpKW0wLCqrLO+wrnAuLOnuLO3s66Vpa2urqSLk5WhjXPBmX2WmYSOlpqLsZWamZWSk5mZpqOVoJuWmqicm6GgmYuMj5adYEqWnJqUmqWXVJawn6+cn6WUr6+tpZqhppSTmZmOnaCnopm0qaqzvby7q7Cyx8C5pqurrbGxo6GysrSkcnBmXVtPUUxFUFBQUTtIS0lGSEFDPjlLVD9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pWDs6QkNAPVJFV1JzYldGSKuXmZ+hqa+YkJeHi6eWjoiShZ+IhJyXj56gm6Oltcm0qca7w8TIysjHzM7Hvrqzr7m4wMHNtci6wLm1urGvr7K0p6ObqrS0qqmmrqyZpK6lpamtur+oq7a2vsG/vrizscKvt72ro660rLiliJuXppt2vqCEmJyOk5mai6+WoZybl5Wbn6GpnqigmZqqmaGnnpeQjZGdg252k6KalZ2in5CusqOrlamqmKuupaSfpamSkpmbiJScop6WsKepq7q3vrOyrb25tp+jp6ilp5ycrKmpjWVnYV9STE1HR05KVkw9TURNSUpBQ0Q8UVU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlNhTVZIf2VeSEaslJyhn7uvmJSei5Oqm5GSk4mrjYeinoykrJSjo7bHvbTBusLCyMnFws7Iwb25sq+5tMDCyrbGscC8tLqrqa2sr6OimKq0uqappqyqnaivp6Srq767qKy8s7e9xry3tbjAsL2/s6m0tqu+pI+il5Gin7yfiZmgmZaenY+3n6mcpaObnKGaqKWzoZudpZyoqp6ZlY+UmouXiY2kopScop+gta+lpZOxq5qsrJ+epKOpkpWVoIOQnp+clamloqG0tbq1rai1srOenKKmmpeVmaqhnndiXmBeS0lGSE1RSU1FRkZCUkpIQURHQVZTREg8QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpoXUZERJxvYkdFqJeknp7DrZuXpZeZqZyWmpqPqpaVqKaVrayZoaq2xMK8v7fBw8DHxL/Nxru+ubKwuLO/w8i1v6+8trm3pqOrq6ygoJqqqsSipaispp6sr6yiqqi+uKasvbC3tse2tLm4vrC+wba0srSvvqOWo5aTm5Stn5ChoqWjo5+QvqWpnaisnZ2hm6afvaKYpJ6iqauhnZaNlZ6Tn4ePhY2TnqSgnbWspZyWsqeZsKifmqqeoI2ZlZ+FjqGam5KlpJqYrLG2saqlqa2snJmgoZKOkJWpn5RpZFphXVBKR0tPTEhFQ0lAPU9IQDtHSUhbUk9LPUhOVTRCRjk+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZWNXTKKao5uexayhn6ydna2fkqOelqSgp6qsl7awo6qztsTDvcC2v8K8yMK+ysi2uLW0sLO0t8HGtr6wuLS5tZ+mraqrnZ6fpaTBpaCqrqCkqa2voqanvbWlsbu3trXDsrO3ur6xw8C4uK2ztLWinKSVkZOgraCYoZ2pqKuimsOtqZ6srpubnpmmoL2hnaSYq6urpqGZjZqfkp6Jjld/lZ6moaC4qqeTmLajn7OioJuvl5+PmZSdgo+gl5aNoqSVkKausqupoqKlpZWVnZmLj5GTpJ+JY2VbZGBMSUpLTkZFQUZLPj1KQTk5SkpOXVFRSj1MV1w5Rkk9RE1JOEhjXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3NIRTY9dWVcS06en6GYnsSnpaKzoZyyp5OqpJ+jn62prJ27sKistbLIw8HCs8LEvcbEvcTKvbCwtq6wta+/xbW5sLC6tayaqLCpqZqepqGnwq2brLGcqqKusKmkp723pra6va+3xK2zs8K/scazurertLatqqKllZWUo6uhn5+ZqKuwrq67sqagqamZmZeToqS4oaGkkq6vrKSmn5KhnpWej5GNlJ2ao5+ntKenjJi0nKOwmp6brpGflJeUmoCSopaPjqChk4umrbClp6KcoJ6SkpuUhYuSjZyegGNmW2hmS0lMSlNCQ0BJRzs7Rj85OU5NVV5SU0o+T15ePUhQQkxMSTlOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tVXmZyQDg8SJZ3ZUE0n6Sfm5/CqKOqsaGjtKmWsqumoqSyrK6pu7KtsLS0xr/ExLbAxL7KxLXAyMK1q7WosLiswMS0t66strqlmauxq6mYn6aXrbu1m6iwm62frrSyp6q6s6e6sreyuMCqt7LCvLTFp76urbe1qaesoZeWkaWkoqKXmKSvuK2ytbagn6ikmZSVk6Oft6OkpZWusbKlqaWinpqampWXqJ+fmKKerrKipo2XrpmlrJeanqWRm46UmJqFlp+UjJCcnpSLqamroqehmZ6WjI+ZkIGGlomUn3lkaV1sak5QTU5UPUJBTkM7OklANzdRT11eUlZRQVdgXEJKU0hXS0g6VWRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFcY1ozMzgwNnBbYkgwNUpwaVZDV0aMeWZDO6SjnKGlv6aor6+hqbWqnbmvq6SqtLexsLm2sLe4uMW9w8e9vMTBx8C5wcbBuqq2pa27rcHDt7eqrbK8opWtsK2xlqWokaq5qqCnsJ2qn6+0s6qptrasu6uysrm3rLmwwbm9vqbDq7C3rqiqq6admJiqoaGgkZegsK6zq7C5mpupn5mWkpemoLappaKir7Gzq7Gnq5+boKCbnqScoZedo7Owm5+QlKaaoamblaKflpiKlZiTlpedk4mQm5mUjqmpp5+km5ibk4eOmYt+jZaGjptraW1hbW5YUVFaVEFDRVVAOzpJQTc6WFBkXlBWV0RZXl5NTFJOX0tKPlpkXk5JUU5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE2NDdnWWBGKEA4bH1oXFY6iXtjQz2on5yhqb2hqrCqo7G4qaW1squhrbW9r7O4vLq9t7bBw7/JxLnFw8DAuMW9wbivtqert7K8v761qa6xt5+Xq62orZenqY6nu5+lrbOeq6KxsLOsqraztbytr7G1rLC1scC5xLarvK+xuKysqaKxpZ6kqJ+kl5CYn7Kqs6mqs5mdp5uZlI2gpaS0rqeirKyusaeyrLKpo5ufp6SdlKGYm6i1qZeZkZKfmZ+hnpCsn5iYhpWYi52anZOKjZaXmpempqOgnZaVlpSBj5WFe4+ShIyWZmxzaHByX0dZZlZEQ05YRFo5SEI2Pl1SaFxOWV1HW15dTk1SWGRKSkNcY2BQTE1OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19eYVYxNTA9YFZeOClDM1lVXGdLNYx6ZkxApJqgpKy3o6yppa6utqqutLmmp7C4xbext77BwrW0u8W+zMW5w8G6v7rEuMG5s7Wsqrq3u7q+taqtsbaYmKirqqubrKuPq72eq66xo6qfsa2zrq62srm2qa2usae1sLO6vMmyqrW0sbSvrqahs5+aqKygpZWVmpmxoq2gpa+WoaSZmZKNoqWmsqmhprGrqrWkrbC1r6OYna2nmpeemZmsuKKYk5CPmJyhmZeUrJ+dlIGTmY2enJqWkIqUkp6apaOioJmWkpKWe4uQhXuMioOLkmtueW51fGFGYGpaSUhaWz17SkdFNkFiVGlaTVxhSltdWlJSU2JhTEtFYGFgUExJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4qQS9KR1BbRzNjWVRLRJmXn6+osamspaOurrWptrS3o6y0t8m6tLu6v761tLfDwc3HvMS9t76/wLe/vbK9rqe6ure3wresrbG5lZemrquno7KqlK+6pK2ysaenorGzsbKxtbG4sqiuq7KnuK+1s8PFtqm0tauwramnorafnqaxoKSUm5mUsZ2nm5+pjaminZuVl6WlpLenorCzq6exp6ywtaykmaGsqJucnZuUqriclY6Oi5mdopiQl6ein5aDkpaQnZyYl5aIl4+XmqedpKCSlpGQlnaEkId7hYKEjIxucXh2fH9dS2VsXEpPY1w/YntHSThHZ1dlW0xeYk1YWVdUWFRpXVBPSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5JZzI3J0ZhTFYlLUIuPUVMUTwzcmtLREORmKStpK2tq6ajsLKzqrawtp+rtbnJua7Bu8O3s7K1wsPPxMDBvbS9wL+6v72zxKiqubG2t7+9r6uzs52gp7CtpaawpZ6ytayrsrCsqai0uay0s7WstKypq6isqbmtsbDHvrikua+pra2mqK2wpaOjrqOpnJ2bmq+ZoqOio5CsnqOgn6GppaW4pKu0tKSqq6isrravop2jqKqboJmakqS0mo+JjYeRo6CWjpSeoJWThY6Uk52bmZaUh5iSlZmnnKCfjZKRjpF3fo6FfHx9h4qJcXRzfn1+XFJkbl5OWmZdRkSWW0c6Tm1YYVtNYGJOVldWV1RZZ15RUkxkWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQ2U7NipIZEhKKzpJPzNDSVMsPo9rPkhJj5qpqqGosKSoo7O0sbS1sbGhrK29y7quwbvGsbSttMLD0cTGvsCyvsLCvL+4vMWorbess7i8wbCrsq2hpKetqaiksKOrsaqvq7Gurq2rs7unt7GyqbKpqqalo626rKmxwrm0rLmoqKitqaexpamkoq6qqKKem6KslaSdl56Yq52hp6ihrKWjray3sbGgqaKfqq2wrJ2epqepmaOYmI+gp5iGg46Ki5+hkIyNl52QkIaIkZWgnZWYlYaWk5OXpZydnIuRkI2Kf3+HhXx3f4eFh3Vzcol2bF9ZYG5jUXNyXEs8hHxGP1d1WGBZT2RcTlVWVVdQXGFfU09OaFhXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSjAuSWdERjg8QjA1RUtYMUCUXEBNRpWWrKehqrKcqaiwtay4tK6qpKurvcm7sb63w6+wrbPExM7Ow7+/tMDDxLrAtMnErK+3rrK6wL+zrq6rpaiqsKmmqLKltK2qsK6tsa+zrLO6pLi0rKyup6ugop6wt6uqrbq2pLW1pKmnrKyqrKGopqaxsqSmpaGhq5apoJOaoKaeo6KqpKyinqaxt6ysoqSimqmqramcoaWko5igmpWPmJ2UgYKQiIWdoI2Kjo2aj5GLhI2YpJySkZuMk5GRlKOam5qLjouLfIeBgoJ7dYCEgX51d4ujh3lrXmBuZ1dmh2ROQGeSTERieldiWFJlVU1WVVVUT1xdYVVLTmlXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREhkFJSESWka+koqqwl6qorbWrtrCrpKuqqbzBwLi5s7y1prKvxMnL0b/Bu7nAwMK5wbrCxK6xtbK0vMG+s7KurausqLaqpa2wqrmvqLCwrrGrtaq2taa0tquspKmqnKOds7OoqKS0tKC2rqGpqKuoq6egqquoubapqqmpoamfrZuRqKGdoKSipqKpnZymtK6npamio5ekpqepnKKjo5+ZmJ+Rjo+Zjn6HjYeFnp6IhIqLj46RjYSGlaKajo2akZKRjpOfl5iWjYqDf3SHgX9/eHWDf3t4foCInY9wcmdncXhcYXOIaU9dmFZIbXlVZFZSY09MVVRVUU9YWmJWSFBqVFdTR1BZVUk+SUhPUVB4TE5WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDI/Zj1OWD9DLD9MVF8vSWs3UkU7lY2vn6WqrZmrpK2us7SuqqWvqam7vrvBsa+4raK1r8nHyNHAv726vMO9usPBwL+vsrOytr28wbKys6uzqaW1qKSts7O5r6KttbGvsbmquK6qrrarqp6qq6CjobauqKGer7KhtKqeqKeqo6qhoaytqL2vrK6soaenn6uYj6+imKKgqKeep5uZqbCoop+soaCSoaKjppiaqKWYmJidj4qHlYh9jYaEhaSXhoKCjIePjpGFhZWgl4iRnZCTkI2RnZWXj4qFhnhzgX99dXh6gHt0dHtqgoejdWleZWyBdWeIi3xSV3BeSnhzVGRTUV9NTVNaZ05MVlllWEdTalJSPkJOUWFROklITFNJcVBMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaDozOF89YWQ/RjFDUFtbK0hPO1hCNI+OsJ+kpaqjpaOsprSzsKmksKequL7BvLCouaqnrrDJxsjQwr3Avrm+vrzJvMK5sbC1srq8ucCztLutuayjtaanrLK2ubKmp7q1rbS8r7ylra21q62cqa+kn6WsqqecnaqypLOomqqnqqSpnqKoqKm9q7SvrZ6po6Cum5qyopWkm6Sln6SamqiqpZ6aqaGbkZqgpJ2YlqmpkZmZk5CKgo+FfY+CgIiej4eAfoyHkY+QhYCUm5SFk6KMlJGLkZuSlYeJfoByenl+fGh3fHp1cHF+aYZ5hIhkYGhkcoV7bWd5XV5WQld7bVRhUFJYS0tNcHRdSFpbZ1lFVmdPQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZcQCqOk7CZn5+ppaOhqqW3srGkqbGmrbnBvbWwo7mtqKiww8nJzMG3vcC1t7+6yLbDtbSztbK9ubq9tq25tr+torOmq6uvtbe0qp26u6ixv7K5oK+0tqmsnq2xo5ylqKminZyksKavoJ+rqaehqZyjqKCtu6eusa6hqqKjrZ6erKWXn5ugopyfm5miqqKamaOjlZaTn6GWm5amrIuekZCRjIKLgH+PgXualI2JfX6Mh5CPjIqFkpiRh5SkiZKSh5CakJOBiHx5bH12eXhie3pycHBzeGqCdGqCZ2NoYW5zjm1ianBgb0FdeWtWXk5QUUpJTFNZVk1cXm1XRFhhT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE4pPTNRXT0jkpermJ+Xp6Ohn6ejuK+toq+vqau4wrqzrZ+5r6uotLrHyse/t8K+r7S+t8S2w7KwurKzwLW7vripubi9q6S1p6iqsK25sKmZubyjrr+0tKGut7Wnpqews6CfpaanoKWZnqyoqZ6gqq6noKaXoqifsLifpLGuoKyhrKSbpqaompqbnqOVnJyanammlpqeqJGXkpidk5mVoaqQmomNkId9iH+Cjnx8oYyNiXmDjYWKjY2FiJOajomVn4iRlYKMl42QfYR7c3B8cXN0YHl4am9wcXBqf3NjemxoZmRhZYeAYFtyanFNToBpWFpNUExKR1BSUUhNW19vVERYWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXFs1KJabpZiclayfn6GkobeqsKO0tKmpucW2sq6gt6ytrbC1xcfAt7/CubC1vLe/u7+vrL6ws7+xvcO5qbu6uKeotainq7Css7Cmmby2pKu6ta6fsbivqaWnr7KboaSgo6ShlpuvpqGfo6ivoaCik6Okorawoaaxq5+soq6Xm6qkqJ6Xmp2kk5qcmp2lqZmbm6SUlJeUnI6Tl6KpoZCJio+FeoR+hIp6j5eKjYd6goiEiYyOhY6TmIyOlpmKj5Z/hpeLj3qAenBxdm5wdF94d2VtbGxraYRuZnJpa2ZpXWN0gWBba3VpWkp/XltYT09LSEhSVUYyOV1ebVBEWFZZZU1ISUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNtNzRHQWZbSFREVV1oRC48MmNWLDKVoqGXlJupnKShoqG3qa6gurilrL3Fs7Cuo7Wvra2vtMPDvLO/urews7m4uri6r67As7S5sL/BuKy9urWlorOqp6myq62xoZrAtaSntbWonrK8qailqa+smaOnnKSllJehsqWZn6SoqZyioJOkn6O4qKSnrqadpaGokp+ooaGgmJqcoJKam5afoaqbmpiglJCTlpmNlJKjqKSQiYmPhnmEe4SGfZ2OiYqHeoGEh4mJkYWVk5OMkJWUjY6Ue4KXjot3fntsdHFsbHNhd3RoaGpnZ2+FZ2hoY2ZpamBqY2lnW2V7Y2BTdFRcW1NMSkdJT1NAISpoXmpMQ1ZVXmBLSUdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEEzQ0RnW0tXR1VgaEIzNzlnTycynqKjkY6jppuenp2jtaynqrq3p6zEwbawrKO1rqeur7fAv7yywbawrrK2tri2tq2qvbOusrG9v7iuvLuxpJ+2q6WltKmqrp6dwauopa+yqay1u56pqquxpZieqZ2npJGYpq2imJ6kqaGbopyWn52ntqWvqq6hoZ2doZSgpp+hoJmbmZyRmJ2UpZ2roZeWnJSSjJWXi4+YmqmgkYiJi4h5hXeCgoKdiIuCiX1/hYiGhpGElpWPjpCRkZGMknuDlY2Gc319Znhva2prZ3Vza2NnZGR2gGJlZmZlampka3JaX1ldbWRhTmlYW2BWSkdJS01SWD45X2xpSEJUU1xbSUhGRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNCaEglNZqjn5CLrKGYmJ+WpLOxorG9tqGxxry6sbGkt6yqrqm5vLu6rsCyrq6utq6yuLOoq7mxr66ztrq2sLi9raaetaqgoLCkqq+cosCgsaSusK63rrWera+traKanaeppZ6Vmqeln5mkoqmdmp+blJydrK+luqiuoqGamp2ZnqOapJ2XnpiblJmgkqiVqaeak5qakYuUmY2UlJmpp46NiomPfIJzgYGKmIWHfImJhYWKjIqShJSck5GPkJCWjpB/gIyNgnCAfmZ5bWhraWdxcmtcaGNjc4FhZmhqbmxnampobl1sbHRwYVVjaWRlWklGTE1PWFFRVmFlgVVAVlNZVEZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJzSRoZqNj7CdmpOhmaiyr5+4v7agtMK7vbmxprawqK6lt7i3t627r6yqq7aqs7itpbO1sq6psLe2sbO1uqepn7WonZ6ooqmtmqe+mK2jrq+0ta2sn7GtsKminJyjq6iblJymo52aqaKklpqfnJCbo6uqqbufp6SgmJmZnaGPa6GWmZxwgpWao391kamnnpSUnpCIl5mAloqhkHiGlIyDbmp+doNxbIaLhn2EjIdwXmNhZ4SYhmuLj5SSdHeLhH6Dj39nhoBndWhlV1xoc25OUGpjZ3KEZ19kZm5tal5fYYqPg4RlTktEOUZUZ15KR1BQVFVLSFJgb3RlRlpRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNTY4LCMxJzIxNDoxNzVYgWwxNk9rW05cS1tmYj5HMVFkPSoui6OZhpSwm5yToJuqraqjvcWvqbfCuL28rae2sKWrpLezsbOxua2ppqy0pq+1oqi4traop6y3s660rbOiqZ+zqp6hpJump5irupWmpa+ytq2upKmuq6yloZ+doKenm5egpaWbm6ennZOfn5iQnqeqo7Wvo6OjnJaXl5ejiKGOkpqHoYeTnKB/pH+lqp6SkZqRiIRyeI2OhYihdoiMaZeIZn1yeKFviIeEfo59f6GgoJmAfIeedIeOdpuKbIeBg2xoZWN6a3FhU4VtY2xpmHFZanFvh1heaVtra1uIcW56coVnhoRaXkdOP0dfTUZSVlZRUVJXVGdeTVdJUlNPRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcwKIumloOcq52ZmJ2fqqqnqr/Dr7G6vbfAv6qlt7CprKaztK6us7erqaWxraW0s5yttba0pqeos7Gtsqiunqugsqigo6KaoaOarbOUo6WltbynrKerqq2opaGgmKCmo5mZpaOkmJykqZaUo5yUk6SlpqG3o6OgpJiUk5eTm4iuj5iUiamLl6GbhbGAo6ydk5mdlHmC1KiAh5XBm8d5eLGlt5dkgMCcv3mEhHmQhHyQkJHKcZe8nMV6crWmu5B7gGyWsauweGhrWLGubmVpvJK8bmh6bnKP2H5TamK2sn+BcpV0mqGqkFdPV2JQVk5GVFtYUVBSjFxXXFBAXERRTkRHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGNppKAp6qfl5ydpa2yqLHCvbK1wLW3vsKrprOsrKmnr7Opr7a0p6emtKWnuK6cs7K2qqWkp7GurrGmqp6npLGjop+el5ufna6rlJ2in7O6o6qpoq2upaGdmpqhp5+Xm6egn5iep6eRnKeak52hpqKgsKKfn6OWlZKYkpmFr2pqio2qfmeDlYatZHCdnJOZpZRxrqGkfni7fWuhj3axX2q0W6WAZpyRYGaCemZ/anhrqWS+cmemjHWxanyxeHSSk2NtbaduW4SgRWhmh5ZFdZxgfmd8pKeCWV+Lq2mAlnh5aqc3Sq9cWFNsZFtLTldfXFdWO06JT1hXL0lUVElDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzAbkKKVgqynpZ6jpKqyt6y0vb6wtsSyt7rCpqmwq66pqbCuo7C6r6OkrrKjqLionrOysKOloKqtr6yvpqefo6Kwm6Kbl5WXm5uspZaaoZ6zs6KrnKKtraCdmZegoaicmZ2jn5yZoaakj52jmpegn6qepqagm5+hlZWRlpGahbWbtXiFqZm1mXaGs5u3fpOVlqiUfmuBpnuChoiSlJJ3q2drsVure4+HlHSJcY+GgH+IkJd4goKLmIyDoI+EsHZ3n3Fra2x8i06kWEhjY5l+Y2imYHlydVOSh15QqW1jcX6HgGKcLlGhb1tTa2hgTEtbZFhcWkI+sXlYWEEjTWhFQkVBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjhhVTUwG5WflYezpqahrqmnsqypu7bCsLvCrbi3wKqsra2upq2xqaGvvKqhp7Sto6u1pKazs6ejop2nqrKosKelnp+fr5afmJSVlZedrKGZmaSotK+iqY+pqKqbnZWYoKWnmp+cop+boKOko5Wbn5eZnaKpm6WZnJyioJeTkZOSnIPVk5m5cLDCfsWGfNaUm7t8mZWkj42cjaR7joejgqWCeqx5j51Wr3qIfp9quVq5doeEfaaCk3yYeqp5jZ2Qe7FujoR0kLyFb5RQr6fFilGgemNgqWN0cohtl4hgU7W0yIaAiXxjpDNCnXZdUGppZFBAWGdaZGFKSE5tTVtST1lmWUNEPkU/MD08NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVE3MSWbopOYsaiopbOqpbSppLy3wbC5wLG1tLuztaexsKOwsqafrraomqe5rqOvsaCztLCgpJ6fp6mwqbSopJydnqqXmJeWl5WVoKqcmZanrbCpo56PrKKolp2XnKGloZiioaGhmqGippueoZ6UmZumoJynlZubn6GZj5GUkZyIsm5otXGrh26OpnK0c3K2e5mXo4uPnY2jf5GhpX6wdoOR0tF2XK57hX+kb5uqpmuHhX2tfZeZj3uxc5Kdj3mzZZZ0hJ5vnmaUUsiLWsJcn3liX61gdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9rX2xoT1VHSTg9VlFaV1hIQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFNNjIwoZ2Spa+tpKq8raa1pae2u7yyur+3tbS6urOltLShsbGin6ywpJemuq6ksbCctLiqn6adoamksqisqaSanJqonpWUmJiSkqKnn5aSpaqwpqKWk62fpZKUoJukpp+UmqWmoZqin62aoJ6dkJWboZ6cpZWdlpmin5WYlZGahax7d6h2o46IhqlvrYqCp4OYmKGJkpqKon+TmYmuhX+Cs1xys1KufYOCpH9x1314hX6PnoaZmXevhoqRnIh4s2GaZZqBgpRsklqwWEuadZh5ZmCtX3d3h2iYiGtdr3eVno94bDV5yK6yX0JTb15nYEVQbV9wbVZVTS5lY2hSWFE7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSTo5OZ+dlJ+4sJe0wa2os6ipsrq3s7e/ubeytby1pLezn7Ssn5+orJ+Up7WrqLGxq620pJupoKCoobanpqmimZ2VpaGTkpuZkpSipJqSkKasr6aglZmpn6KOkaKZqKWglZqlqJ2cpJ6snaGdoI2UnpqdoZiZnJaXoaCTmJCmnoapfX2leKGPjoOqcK2LgaeGlZ+hiJeXiKOCkYiUqnyAi515b7FaqIKCiKB5dNh/doh0qIKOm42So3yWkJ+Ee7JenGSgfoOVbJJcq1tak3+Rf2hnqmRye4FrmIdzXaxaiaCOa29lT0pDoVxbTHRdYmZNW2FfcnRfSlY2SpuTWEhFPUdGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MyPzihnZmZv6uXtMKurK2pprSwt7G1v7m5srC3u6m6tJ+wpJ2lp6eek6qwqa+ptayqr6GYoaCmpaS6oqOroJebkaKglJOempSXnp+PjYuor6+mnZabqKafjJKkl6irp5SXqaeenqCjraShnqGNlaGYn6CSnZeclZ2hlZaOq5uPrm1ytHKpjHaKpnO0eHOzgJGkopGcjYmkh5B3uG+Me4uia2u2WqCFZZeXaaGip22TcrR0k5h/smqFkoita3WzYZ1mom+HkmqXXK1fTaF8h5FSc6Nten9+b5iHcVyvVjycd2VUb24uXKdPY1JrZWJtWmNdYXB7Y1NaUT4+bW8zQ0JAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4pZqbnbuhnLLArq6rq6e3qbivtcC1vLCvubirwbapqqCbpqOinZGqqqi2o7Knr6qgl5ynoKSruJ2jrZuWmY+lopWMnaGbmJyfkZOUq7Wwp5mUnKyql4yTpZmlraKRlqqxpJ+epquwmKGjkJmilp+blpyXoZKcqZyUkKqZh9SSmrtzsMOAw4Z+1ZabuHiHkJeMmIqMp4h6o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZWBrKlxe391vIinoGmdYaaOr6F+jHSHqn2+bnO8dLKDdXiBim6aiHFujaR0vV53fVthebxrWlZbanpeamFlZ2Jtd29ZW1lDQUByQENHKzVHIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaebnqG8opexw7Ctqqqssae4r7bEsbmxrrqvrsCxq6SinqOinJuQqaOqsqS0pq2ln5aZqpmmrLmdo66YlKCQpaCSjJyjnpedm5CVkq+5sayVl6Onp5OQlqScpK2ekaCoq5+bn6ijs56jpY6nopShmpyYlaOYj7CgkpSpnoWQmbWAkJGMt5V4gpOatXdta25zbnqPhI6JdJ7Bu72ae4GyqHCAdJG4g3yGhoyGjXuKh42XfKS7ub2cdXqzo3R2l3V0sHWZnmaGaY21dHJwd7aMXoB6fYpog3lteWOLrHB1hX9aW6dqRWVaVGZgY11jUWdncGx0Qk1QTEQ6Wk0/SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JWOCpPXV09KzpWVic+OzynnqChv6WWtMK0rKqorKupu66wxa60sq63p7S4ramioaWeoJ2Zk6ukrammtainn5uWoKOdrKS+pqGql5SckKKbkY+iqKGTnZiTl5SytbetmJ2kpKKKkpKmm6Wqm5appKWcmqGopqajqaGRrZ6Wo56Xl5edno+wqJSbp6GOan5pnKZ4h3J9mo50emSHe72+wLpvkoJxlYdgcmpaXpuKYWOIjpVrYH+VY22dd2KVa4CalZRlXmBjcZqKaHKMfYWVZ2p+cnR4fX1iW3d0gWhQXG6EfXuLa1hseoJzSUpvhnBNdU1FV11nYUxaV2djX09bbXVqcVJPREVOO0hIPUw/Mi0yQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF5MKDM9W08nPzI+qKCoocKjmrS5tqOspa6nqLWyq8irsLKrtKO+sbKmoKKonaObmZmspq+kpbWppZuXlaGapq2pvqeoppWTm5WgmpKXpKmokJ2Rj5icsLK/rJunnaeiiJORqZqoo5qbrJ+jmZqjp6yin6uimrGblaegl5Wdn52XsaSXoaiZnJGdnKKkmKaimpyampmPlYFnbX1xd5KXlJGFi7WqjYaYlY6KjJiXh5SVioSSlJGJjpKUmJSYl5qgopqclKGejYJ6pIZsanyQfIB0iYqBcYJ4eXZ2i4B7imtzgXSDdWR3fXdrcHttYGNdcGhNWFpmamBXWm95bm1mU09GUzlPWU1STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLOhs6G/oaSxsregqaWyp6WwtarIq6ywpbWmwKe0oJ2kpJyjlZWgqqato6O2q5+ZlpWflq2ppcGeq6OVkpyXnpiTlKKfnqKnk5GZqKeyxK+aq5yrn5CWlqidqpucoKyYoZucoqSvpqGlqJ+umJennZmaoJ6enK+gnKGmlZiSmJOgoZWjnpegjpaTioqNjpatj3yVm4KSgouqqIaBmJaKhI+fiHuEkIeFmZKIhoqVj5uXjZCXnqOWmpORno1/jmahs6+FioR2epCKfHZ5em9mepGBgIlrdYF5iHNoc396dYOHgmt0ZHlmYGllY2Rma1lre3BpalxTTFBEX1RFQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvv6yrrrKxoKqmsa2irLOwxLCqq6OzrryjtJufpqKhnJmXp6WppqSls7WelZSdmZmwpq6+oKuikJGdmpmTkZWhnJeonISeqquis8izn6qkq5aWl5qnnaian6Srk56enaCpr6mlo6uirpufoKGYpJ6cn52vo5ieqJOYl5yRpJmYqJ2al2WCknxlfo2Zj2N5jWxoa3uSpKpqZZqYfmeGimVlaWh7jqGPa2iNl5Gid2tqi5ijnplzbG56hI2HelhlXoaCXmyLiYB2XGhzd3eSgIeCbniCeIBzbXmEdHeJiI6De2mGWV5rdGRdc4lpan1xa2NeUk5XSmRYQUo0PUY3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvrLOwqqWora2wp62tsLyxqaekra+wn62Xn6OdopmZpqucraOlp6myrZ6Vo5Cir6a2uaWuo46OmqGZkpKboJmZpZV7pa2iqLPEuKShp6+enZSeop6jnKOpqZKeoZ2gqrCqq6SqoKqbpp+ooKyWoZulsKSXm6qVoZ6bkqWXnqqYnn69g4dytHKEnYWtaHi5xLhxk6KjeqaZmXOqgnzLwMC7cYuiiIKffZWYiJ3AvYKWnZ2NncLBe4J8ko2aw8B9a6Wyb4yBb8p6f5t3koOOgXZ6gYB5cXp/h3F4hY2TeW13lGNmX3lkYGWCY150aGxkYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAvI0ZbM1BZL1VBQjsvOJajucO0sK/AqaiUo6+psK6tprK0r6mlpqaxq5+rmJqin5yaqqeinayipailpLSknaKTpq2ruLOnr6KRkZmdpZKRoKGYm5+dh6espKutwMCxoamvqZeRnp2hmaKjqqOToKGdna2uqayno6OnoaWlna2pkqSaqK2pm5ypnKyhlpallaGil5x/zpR4eqSBeJSWm1+uj16Op4GioHynlpt0q4KAr15jjap6p4eFoHSXk4izY4KrhqGNjbNqhK90fZeIuGGDrVmjzW2QdXvae3+ZcH6HknZ+ZXuIdnZrfIhvfoWRkn5tgo9gcmxwZ2BfeWRccWhqY2ZgUlRSV11LT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJedkaSqqK2zq6WyrKyrpKumsKqgp5uZpZecoq+foJ+op6OloZ6wrJudlaeurbGqqKyglJKbn6WTj5+lmJ2no56upKuwqMDGs6ipsa6Wkp2boZefqaqflaCfnJ2tr6erqZynqKSiq5Oss5eloqqpnaOmpaGwoJKZppmgmpSUkZegcYWMl3SEqIdxsXydcax+oZ6BpY+ed6qCfa1/nHKtfquHhp92mJJ6fJd+qoiijJGMnX6re4mUj5+Ae61WnMR6j2+SwX2BlW11b4xtZXZlhm9hd25yb4qLkpCDbZKQZnB1dXBgZ21lX29paW5nY1dTXGFZUlNDOElJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNTGxrK0oJ2jjqOjoqyvtq6osaaoqqetq6unoqOdmaKVoKWqn6GloKioop+dr6yYmpaop6+sqKapnpeUmqOikZShrZudpqOvrKOstKq5zbKtpq2slpWcnaKYnq6snZagmZ2fqbKpqqqbrKuko6ybr7GiqKuupZilqqmpsaKSlqOkmpSShaRqpHWJeql0erJwgqaKmYxxiKCah6RgYFKrhH+ug5t2roGmhoafepmWhntmgKOJpJmGgqR9qX+ClYeuXn2pVZ2ikoF6op+Ae8OvxYtyr7OzuXFiqa/CdGiNjJiPgW2alHBueXh4b2xmZWVxcGZ8aWJdV2BpWFhVTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8PJ1tW/oZmrp6Gvop6wtLCvqa2ip6aqq6uppKagm6SenaanpqOcq5qirKGkn6+inZuTqqS1sK+gqZudlpSmo5CaoqigoKWcsKakqLGtt8iytaqrqZWRnZyimJ+ls52aoJScn6esrKSumq2qo6KqorOuoqqzsaGaqaiur7aikpaip5ibkXyqbJ6Eh3WreXywb4Kki4mflpaflIHSuLS4yYCBsl9flKmDo4iHoHqYlZp4qsl0maSVqKqRk5qMgJuKmcbGeGahgqVzgZ+Ogn2vXXC0YrB1S6OGbadHgpNkj5Ceknxxl5OAcXt1fntuW2ZqcnBlgWpfYVhkbVxeWUlOTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPS01T1RRHRw7PEYyLCSnpMDGuK2ps62spaKcsrmsqqGmmqilqquqp6CmpZiqo5+vq52moKyanqmlnae1n6KXk6mqtrKsnKWcoJWQpayRmZyno6Cppq6hpKepsLXCsrOqraiTiZedpJqho66mmKGVmJylpqubsJ2uqKafrKS3rKCxua+dm66nsrOzpJSXp6KZn46CnU54moF/n3qDo32DpISGpp6cnpOEuHt8ebmCfszGwrZ4m6GRi59+mpaWinaemIqkmKSpf7CFnYWfhKx9mpRipWykcI+FkIF9loJyrGCjc3GAmmC8fVJVdY+SpJd7fpOSi3V7c4V/cVxtbnhyaoFvW2RfaG5iZF1LTFFUQUlIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDg4Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7mqr6Cboayzs6WfoJWlrq2uqqedpqaao6ehs66iqaayoJmppJSjtqKilZeiqbW5o5uinaKTkKGxmZ6cp6Whoq+unaSoorayxLGtqa2pkYeQnKecoqScpZeemJmapqSpmq+irqWmmK+lvK2htretnZ21srixs6aXna+go52Fj9G1w7d5h46FkZOQgaZ4lKF3jKCRhKWBinGqhoS0bnJqmaOblYqefJiZhoePc6+CpZuijqaLk52KlZCabXCyXKVzk3qcbJl/e5l8balho3Fxf59ic7K4aHiQlKaYfYyNlI14fXmPgm1peGl5cm6AdV1lZG5tZmdgSltYWDxIR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZNzjYqtv7+7urSelqekrbWhopmVo6inrqusmaain6agoLWnoqmnsKOUrKOOpK6jnZCamqq0tKSdpJyokZSXrqCgnaeknaectZqhqqS2rMOwqaupoYyEjpyhoKailZqanJibmaakppisqK6jpZutpr6slL2wrJ+isLO5q7Smmqixo6eXeqiQfXywd4qBpKWInG2yb6CHrXyhjoOnlZiArIiFroWflKmgoZeGn4CZlYB7kn6rgJ2alouqeJ2fkImTkoB5r12jgX2mp2SdgHyXc2qvXaVrcIWZXWBbjKBtlZKmmYKVjpiNe3uEmH9rbX9jfnRugHpgZ2VxbmhnZ0NaYVs+S1QzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pYU1BPTkk4MDUyLiosQVRWVlZUVFVVVVVUVFVUU1RWV1dYVlVVUUhGSUojKCi9kpqDqcbCtsGzn5qsoK64paOOm6Sjn7Cvqp+kn52tmZ65oKOroK+pmq6hkKuppJaJmpCusaymn6aarJeYj6yhoZ2loZqlna2YoKimtqnAr6WppJ+LgI2bmp+mnpKUmpqUmpqlpKSaqayspKWfqqi+pJbDrKqioauyuaqup6CzrqipmHavfpCLnIWHfLquiphlsIxlla19oY+DppWagayKhLCFppmkoaGRhaBbbGqBs2B/rXt7goGxbGdvmZiMiLBbfbRbpINryKJkn4B7vFh2tFqyfVKugHqsWIChbpiQqJuLl5GYmHx5j51+ZHR+YoR4dIB8YWpncW1mZWVPVWRcQlVfPkooPjk9NCEiLCUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUVJUV1peYGBgYWJeX1xbWFVQTkpGQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWlxcWFdXR0I70p+zsre9urTCs6ObrKaltqigi5qgn5yzs6mfo6CetZigtKiqrJ2vrZ6sm5WvqKKOiJuOr6yop6Kmma6SmY+omqGdpJ+ZpKOlmZ+jqrKpva+lqJ6djn2LmpWgoJmPkZqbkpqXqJ+hmqiuqKamo6Wpu56gxqakqKGrtLWsrqaeu62srJWAqZKjr46bgIekl5iQgYC4w7qDjpyThKeWnIKsioKviKabm6WqkX7VvcKqYqO/vX1+o4KD17q4tYWUk4Oevb6Da6OBb6uEbJx/erKwx4Nqq7C9rHh3or68dIGWjqeckJuRmJ16gpGbemN9e2SOZ3mCe2BsZWtqYlBhWlNqXEBVYUJOKj06NC8eHyQeJTIgHSQoMDQ5NjY3ODo+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz88QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVs7Sxv7mxvbKina6mpbKmnYyYpb+quLKoob+mp7KcnrGcuaiera+mppSUsKyXjIObka6loqyho5yqn5iLo5KmnqecmqGoopmeoaytqrmuqKObl5J7h5mRppuTjpGYmI+Yk6iaoJipqaGqp6GjqrueqMSioK6jqrO0qrCpoLqnrq6ac3WqpLeGZYmgcGetj4qPbW93pJCZn4F1rpiUcI+LcZWoo5uXrqRybW1tZYp4b26CmXGBempxaWeJlpWYcWlphIdncIZkXYhiam9ZXGd+d6ZfYXGOkW5lZICNk4+imJmZkZiffYeQlXZmh3hpjmt5f3lkbGNmbGJLZFhKbFo6UWVFUidLOisjHCAbIiwpGBsYLTIuNTo0NTc5PD9BQkRFSEtMTU9RU1ZdV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola2zqbm5srOqqaGunqOyqZiSvrLEyb62qp7ArKyjoaisoLqjpK6sraaNl66pkIyFlZatnqaroZ6jo5+Ri6SSp5momZajqqCWnKamp6+6rKyam5OSe4SXjaWYjZGRmJSNl5WolZ+YqaObsaaeoqu5n6/Ap6Sypaywsaqtq6e3o623loqgqKW2nYmWopiHqZqQlJ2SqbOZm6OroLGWoqCdn6KcoKWhlaunjZOSjIeTnJyVkJqTmJGOlYWBpJqXlY2Lk5KKj4aEfWeJfnSCdnSHi3GnbHqUkZOSgYGOkJCPnZWhlpqYooOIlY1yaZB3cYt4d3x6amxkY29kVWBYQGpbSGNhT1orRj0rJyE3NDAuHxwhJTIoKjY5OTQ2OTs+P0FCREVKS0tNUFBRWFVWWV5gYWNcXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqW1tq6uorCjrZ+gtbGQjqzHvcW7uauipp6bpp+xqKO2p52ptKeokZisoouHiY+bp5aspaCZp56ekpWjl6iaqJmUpqGjkJqnmaG1u6irmZqQjXuBlIuglIqVkZWQkJOXpZCfmqqgnLajnqert6euwa6jtqavr7CsqamzuKCuvJmRpaSmtqKSnaafjamfjZKfo6yvm6GjsKivl6OgnKOpnp6dnJarnZKZoZuUkJaqmY2ZmZaQlp6RiaCdlZSFkoyQjZSKgH1mi4V1hnV5iINznGqFkJSTkIl9jJaSkpeUopOemKKEiZmHe3KWc3qLf3J8f2pvZF5wamFbX1luY1BgZFBaOkdHRT4yPT04LysmKykmHSY0MDY2Njg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYGVVUEpBQ0I6OUVNVlteXltaXFtbW1xdXV9fXV5fX2FhYmFhYWBiYmJkYlxbY5eVpKijsLOsrqOppq2gp7WqkJCdpbS8r62toqOaep2isaSlsamXm7imo5SZqpyOhoqJnKOPrp+ilaefoZKXmJuui6qWj6iZqIyYqY+fubalppibjYh5gpOLmpOKlZKUkI2Sl6KNnZ6onp+4o4CEr7Wir691pL2jsqB3eaCqsrqUdayknomAqn9kXGJ2oI6knoSXfW6Ts52jp62qo2Wdn5JzeZmWcICYqJdsf6KnimWcpZyRl5iWjJKckYadmpCVg5KHj46SiYR3ao6GdoZwe4aBgGFph4qUkotadZWRaGiPj3N7ppqZZXmZh4N4mGqEi4NveYBrcWVfdnBsa2hcZ2ViYnBTXD5OTk5TRz5AVEQ5MS8eHyY0OjMxNjY3ODw7PkBBQUZIQkdGSUtNVFRVWV1gaGZnV1FKPERHPDhVUltgYWJgXmBfYGFhX1xdX19gYWFiY2RhYmFhZWRjaGReXWablaajoa+xrKuppamuo6etpJKWq7awsqebq6asl3SMna+fqKqnk5e5n6CPnKSdkX+JiJuejauaopWnoZ2OlpGehHWuj4immqiRl6SJnLq0qKCZmIuJdXeTjZWTipSRkJSMkJOgjpugppmcspaAjJu1nbOMko+8p6B+p6J6oq62gY6Opp6Di4aQsamvjIqWo5p5gIushpydoqepp4eVhZh3pZt6h5uBl6eCgnucsXqKhqCXmZSYloKRl5aEmpljeYeQhI6PkYqDbXCOh3mAcICBhX+GdIaElZF4lmiSdKCadH2ZhKKeh5h/k4uDhJlrjo6FbHh7cXFnZHhvamxqXGZramV0XF9JVExRQEU1LlpUVTcpITA5PT42NDM1Njg7Oj0+PkBEST9JRUpLR1NYW1lbYWFpZllRSDlFSzw+YVZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJejn6atrquorKCosaanqaWZlK7IvrGil6eptZ6PhJ2snKeioI2Qvp6ajZ+aoJB8ho6ZmIisnKGWn6CRjZOJhoCRqI2Hop2jk5eehp+6sqeem5KOhXB1kImUkIqUj4+bi5CSn5KXoKSWnquHn7SJtJqtisqHqq6It4WMr4KwroOpjaWYjZ19qI9ye3ecj6eWaJWkebSMn56mqJKYwoF/q4iYoXKegJqlfZeFlbGAoX2hk6CQmJeBjpObipiRi3yFk4aNlJKJg21ykIV/eXGGgYR8hHWEgZaAj8Vmf6mHj6NrnoOjm4SagY6OhoqZcY6ThWh3dHx3aGh1cWhoa15kcG1nbVhnR11STTJFNDZOYWM3JjM8RUdEOjY0NjU4Ozg+PT0/Qk0/TklKTENQWl1cV2Feam1cUUU9TE1ASmRYXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSXop+wp6mopqugpLixqqunmpSgo6SrpJelqrejr4Chp5ylnp2JlL2Zk42hkp6PeYSWlpGIq5mbm5mhhY+Md5ucj5+QiJ6km5WZmIejua6lmpyMjH5ibY+Lk5CNkIyNmIyRkp+PlKChmaGnfqGnh62doJatj56cnZGFgKCNq66Go42pmYyaf6N1gJmUa4KsdU2reIeNnJGbqKeAqat9g6F7eqdpnn+Sa2eXhpe2iZ5+bmBkWYOXf4x7ZGiLcpl9eZVsXXuWbV9TcINcX2t5g2BZZYJ9g4CXcKeqa4OjbnKlcJ+FoGlmoG1bbop8Zlpgg39iV1Bvd2ZtdHJram9ea3BtbGlYaU9dWEY5QTRHRF5rNCxJQ1JNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deXmN2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGJkY2FjaWtkYmRkZ2RiZ2VhY2iXlp2guKCqpKaskaG1vKyuopmYoKKlrK6hna61oqiSoaCfppuZjZi0mZCLn4yVi3WBlJKNiqaWlZienn+ShYaspIebkIqYqZiZmpKIprGnopaaiImAaW6IiIuOjoqLjZKLkJKijJSeoJyhpH+TgY+joZSgd5yWj6eDoad/hqmshKV4inyEmn6icHOUiJZ7nox5bYebjJmQm6iaj4ede4Kic3amZp5+d6RfmHp9knOibpi3tLp0k4eCf7WoZIHGuHtwlbeLcYCapGJzrKtgfWmds35ufIaCjYKLmHF/o2xyo3SehICjYJ2Zs5ZxfJefs3RzW56yg2pib3R2cWlvWGtscnJmXWleYktFPUQ2UUFZcTM9U0dfSlI9PDM5NTo6NkQ7O0BKUD9VTU5RQEVfXltZWGBgfGRIQzhMV1VWY2FaZWZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7iZq5yToI2kt7WuraCbop2jo6aunJuxrayTmKGZoaSZmpSeq5uLiJJ4i4VxgJaNiY+hkJKUnZd9kImOqKCHmI6KkaOTnJuNi6mopZ6Ql4eFfmt7h359j42Di5CQiY+UoIOXnqCdoJ6LiXecmKKMn3Khi4eoiJulj5anqn6tjH56oJl6o5N4gXSWiI2cfZWfhpuOmZumhqJkoXyIlpCbjWyeaJqNbpqZe4CLp31yaHSrg56DdKpolZpdm4V2hJ1oqmqAuGZcqHCBnGCVjF6ndnWHiX6eaJp1hpOSl45/n26akG2nml2ofni7a36qW46EXbNnXG5yenhraVxxanh5Y2BmWGJBUUVPN1ZDUm81S1paX09aREAxNTE7OzZIPzpDSFU+WVJZXT5EYl5WYFFhY31qRUI5TltdWWVmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq1m6eIY5Sbq7qysKydppycqZ+erpuesKisnZekmqGfmJaWoKOZhomNaoiAcnuXiIuWloSRlJiPeoqElqOdipSPhouekp2diZCpo6CajJKKgIBpgIZ4f5eMe4iOjoiPlpp/lKKfoKGTmHJon4qfj4xwkoyBqYeYnqKnn6d8r62joriXd6OzoqSAiJR5nXuqmn+ijp2bl4iXcaF8hY2vtX1rmpGheH6YtKOjq6iEmXybfZ2af3SqWl1ve5aLeJ5iTH56eoVjeZdCTJ5ZompyfI5tgIiEmXWbeIaJsbN/f5uTp3aCnW5zfZRvmXNrpF2VdkhlZGFzcX5+bmZgbGl2e2RlYlJeV11VV0BaRlFoRFNXXGJYXklEPUI4P0I6SUY4TEVYQVdRW1ZERmJcWmBLYG1+ckVDPFVfYlpmalZnaG1vYmZnXmFhXF1eYWhiX2VjdmxeZWdma2RmbGloa2mTnIGwrZmEVF6gprO5s7OpmqKMnKucnKmUoqukoaiPn56dmpmVmKGdloiHiXeGgW95lYWQm4t8kZOWiHJ/iJKhm3ORkIGJmZWgm4WOqZyalYuLinyDbISFcYGhjHiFjYiIk5iVfJOjoJ6jiK2GfbWEjp6ce6WWeqmBlZyPiqCcfKdod21+mXShc3F8noaZcJODrn2kg6aemYCjb16oZ3WiY2+lYZzTkHx7mXhyc2OihpB+o3Okj3ZrkLOMYIKYiXOqsqi8f3eDbX6+pqm0XpxufXGXbn9yonJdpGdzpmFopm2b1Jl9hZtwenqXa5t8eJdzbqmkZ2FleXCAhGtnZmRudXdnYGNUW2ZRUWJJV0pUYFdTW2VqXGVRRkNLTUpLQktFOE9AUU5YUllPU1FhZmVqUmN3eXdJRkVjXWVaaGlUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5t/sKtUXEt+qa+xtLCzo5uZhZmpoKCkjqWooJipipmYmJOZk5KgmI6HhntwfYRofY+DlJqBd5COj4lvf4aPkpJsl5N8iZGSpJaDjqqak5KLhYl6g3aHgG6Bn4Z4gJKGh5mil3uUo6San4mzoaK2i3qsp6SupXCogJqQhYCbkXukgKGZhphynoSjrq+Kl4x/jKSNlYOtoZR2tLW1yaFzlIqBn2Cdl6lteZWGoJt1oYd3oH6Sl4uBb0xmo5Jwm4dypHt6dGGDgWt+oGtxZF+ccX10l2l6abO1tMamc5h+ep1rnJurdYSbbXV4mGmaenWYclBFfbReanZreYdmamhidHVwblZeVFlpUFNoSVZNWVNWXWhrblZnV01LQUlNS0hKT0FRS1BlY2ltZXVzc395fG51iXt7VFBObF5oW2tpUmpoaWxnbGZjZV9cXVxeaWJkaWt7X11kaGNqZm9tZWlsZaGciK+mhGY/lKGzq6+vtqKikICYqqKipYylp52dpoKal5aNl5CPnJOOiIN5anmGZYOMf5egeXWOiIyBaYSFkoKMhZ2NeoyLlaaTg5epmIyRi4GJeoB9i3lwkKGGeYGVh4mWoJV/lKWnnJaWhGZueJxsomR8caV3m5hwZ6aAlot7pHqfloOXcp52gYqUlo+5bpCKomJ9maGViG1yaatqdaBtbqZfmmmLkGiWh5qVdaKAfZpgjIaNdW+IYmigZZ5+aZp1b2NmiIJtcqJaX1tioW1diYxve35zcmSlbXeiZGenaJlzjJlvom9TiZBvoF9lqFSLXlSYbm1za3KCbXBpa3lza29SWVdXZ1pUbUlZT11IWGlpc2pZa1ZRUkVWXExYU2FVaWtfd3R6fXB9fHKDe39zdo2AhHZeUXJiZ2JwZ1BqaGhrbG5oZGdfXV5dYGtiaml2dV1cY2ljampzbGZrbWOcpJimemV0bYunrqSpsLGmn4uAmKudn6aMoqGboqKAlpiTjZqPi5iQjop7hnGAiGiLi3yYm3N0iX2Qe2SCh5WKiZaZgnyIh5aokYGirJGGkIqCin6AgI5zaY+lhH2GlI2ImKCOiJOqpp2JpniVm36liJaMspiekIKvl5+ld5SHeal0pI6Emm6kooyShIyDu259pa+DhoaGk5Wcn3ylenGolaCWZp5+b6tjloqVkniobKmigYl2iIN3qpGmh2qRsGt2s4ypa4qGbW2fnpKVYH6ri6p2fn+MpZ52n32EpJWdoGqbiHesZ5+tjLZ0d76NpJNZg6aNq2F1cnRwfHVxY2p+bmhsU1dbVmFiXWtNXVJdSV5ubnZgW3FZW2BaZ3Rlbm9xYnF0YHd6fnlyeYNzhH+Be3uMgYKAdmJ4ZGNtc2RSa2dob2xyamZpYV9eXGJrYm1sem9cXGJpYmxqd21nbG5ilaWqnYGAnqSWqaqdqKeupJmJg5irmp6kiZulnamdhYyajoackYWSjYyNdIZ6iIRvjYR+mJN0dIZykoNtf4uSh4aTj317goWYpo5/paaOgY6JhZV2goeSb2yLqYCDi5SOiZyfiYyUqqOgj4B1lJaIfoF5lK6jf4GbcY+FeI+Kg357cqaMcX19epeWm4SOeHt+foeUlZOKdpCYn6CDen2Ja4yFW3l4cnpwaG5+kolxf3WBj5STcYaEgmWMf16Bf4t3dXOUdW95bm6HbYSFXnZoeI5lgICFjambfXR8lmqJiHCBdn2Gdm1tZ4xzeXuYeIVba1h5j2lud3JxcHh4cF1shm5pZ1ZbYFdcZWtjVWJVX1FfcHh4bGt2ZWpra3Z9cXJ0c2FvdWJ0e4F4dXmDdYCBf4F5i4WDfXttf2xkeG5eV25naHVreGppamVcYFpjaWZscXVuWltia2RsbHluaGxvYY2UuKimi6GimqakmaWcq6OhhISYrJKeoYmappqpmIOBm4p+lpOHjoqJjXKDfI99fo+Fe5eOc3KDcJWFe32Si4aGkIV4fYCGmaSOfKehi4aQkIWWg4aOmHdyhamFjpGdkIienoiMm6ifoKqDiY2Umn5+iZatqI+Spo93b5yQgnmRb32ohXB9lXFrcH2Bn4x/k46MaG1dg4uMnJuejnOVi4hxdGuBdnSAWHJuhpGBfX6Mal1qZHuFhImAYGl4ept7gouCdYGFgmd3ioZrYXBxgXZecoqBiI+mlYVljI+DbneLhHGGj3pwZmdle4N6lltcamdudlt7eXd1bnNzgmZcbYpra2JaWl9aWWxxXF9hWl5dZnR+enRvdGNra2p7fXN7eHRkbXVobXx+dnp8e3p6gIB+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hsa3FybVdbZW5sZ3N5b2hqbWCLi6qwoZCjoZqenpiemaijon6Dma2Nn5WInKKRpZV/e5iEfJKZiYiGh4pzfYGLdoWLgYSWinFvgHKYhoR+k4SDhoqBeoCDi5ugkIKnoYd4jpiJlYuLnJeFg3qsgpGXmZSKnp2HiKGrn6Kio4uIk5uco5mWqqGnpqCSm4eVjXt3jY6Ep35+kpGSk5yyppuVnpCNspOXhKWMjJWbn4mQm4KIkYprfI13eGWChpCLfImdhIeLkIiIgISEkHd8eXSZoYiGiZ6KhJR+fYqAgHVvc4SDf3eGhoqPppCDhY2Hg42QjH2IjIqRg3dsgoR9eplqcmhhdIpwfXp3d292dIFdXm+GaG5fXlpdXVNoclVjXFxhbGh1fHxzb3Bka2ppf3xueYBxanBwbGeBe3KCgHh/fX+Ee22CjIZ8enh8fXqDeU5kdmpybXB6ZWtlY2JgW3RmcGZycW1VXWx0bWl5enFnaWtkjIeduZ6XoqGYlZiZlJmkoZ58gJqrjp6NhqCci56WfXmUg3uOmYmGhISGbniAgHKBh36JlIRta356l4eEg5B/gIaEhn2HhI6bnZKHq5+EcouQhpORi52RfY17qoSNkpiWj5yWh4abpp+imp2Fg5GamZiQmqafpZ2dkJaAkIl2e4eOhKV7fI6QkYaYqqGdk52PjaqOkYCdjImTmp6Cjpd+ho6Db3iFcnRgf4OPhnWLmIGDj4KGhX6Fg5RteXV0kqGKi4WahISMc3+JfHxycnuHg3p4io6DkqaPhYOOgYOKiYp3homKjH1vbH6BfG5obG1nX3p/aH17dnR2dXt3XF9wfW50YGNbXV5RZ25UZFpeYmtpdnp+cWxsZGtqZ4CAbHOBbGx0b3lvhXluh4B2goB+hXZxgo2Ifnt7fH97gopgaXxqdWhpgmVqY2BpXGN1aG9idG1sVWNxeWVwenpzZWptbIuJnreaoaSfkpGWmIuan5+ee3iep5GcioellIuYmXl6jIV8iZGDjIKCgm57f3hzgYV9i5F9a2h9gpiJgYiOfH2GhId9j4GQm5uRiaicgHCMi4yTh6GiioWMfKiRiJCSl5OWk3iMo6CgnZaZf4CQmpiSjJqjoaOZl5Gbfo2FeICDjoagf36MjI98mKSgoZOZkI+mjY+CmpGJk5ebfpOSfoeOgXR0gnB2YH6AjYZxipV8iIxxjH+ChYaOZ3dxeIuYkY9+l32HinKBhnt8cXh6ioR6eZCMgpWlk4uFkHuFhoeFdoKEiYh7ZnJ8f3l7cWxqZl9+c2h8dXZzfHOAal5gc3Zwd2RjWV9eUmtpVGRZX2FoanZ5gXFma2RsaGWAgWttfmhvcWt9eIZ6a4yBc4GBfoF0doKNhn58en+BfX+PanKDbnNpYodobGJfcVZ0b21uYHhobVdqdHZjdXp7cmJqb3mJjZ6ykaSlnY6QmI+GnaCbnXx2paGOmICMooqImpZ4e4aHfoOJf4iCgX9xf3t0doKFfoqReGdjfYaXioKKjHh9gI2DeZaBlZiWjZagm35wjIKRlIamm4eNiYOmlYWTi5aXk5J3kZ2hoZeTlnl+jpiXjpaanaSdmJKUm3mPhYJ3hJaNnX6BiY2McpejnqGTmY6PooyLg5aYg5KVmX+YjHyIjYB2cX1uemSAfIqFcIaTf5CCbIeCgYCJhGV1b3uGkpeMfJN3ioh7gIV8e3F+d4iFeYSPiYqXopWBg4t3iISDgnd8goqGd2B5eH10f3hnbGVhf2lqd3N0dX1xfGJjYXNudHJtYVphXltsZVJjWGBhaWt2eYZxY2pjbWVofYNsaHVobG9pgHyBeW2QhnGAhIN/dHyDjIGAfnqCg358kG12iXR0bWWKbGpiY3VWhGlxbmB4Z2xianZwZnl8eXFfcWyGhY+crpemqJ6NjZeHhp+Tl5l9eKqcipl6l52LjJiQeXuAi318g3yAgoF4dHl6dH2AhH+Ji4BkXn2LlYd/hYd0fX6Kf32YhJeUl4ykoph/c4d7lJKKp4+MjoqSoJGDkZCUl5GLgY+Yn5qSkJBzf42SlImdnZ6mmJiNlZZzjY6Ka4WXj5l6h4iQiW+XnZqjk5WKjZ6MhoKSnH+SkpWHmYh8iomBeXF5a3VsfH6Lfm2FkoKUeHCCg31+in9kcml7gJaXhH6Nc4+Ig3iGfXZ3f3yFgHyCjISMlKSPeISCdImHfYB0doGJhG9he3V6cX1vYm9jZHtibm92c3h3c3RhdWBvbHVub1xcX15ea15QXVhjYWhtdHuIa19qZmpjaHeIbmZsaGpsaIF8endukIhzgYSEfXSBhol6g316gYR9fY5yeot4eG5sh2poX2lyYodocW9ldmdubGF5aWt9e3hwYXdti4CZmaqgo6ieioqRhoqei5WYfneumY2XfZ+TkZaUiHd9e4p8e4B2eH+AcHR0e2+FfYGAin98YVt+j5KGgISEc3qAh3qPkoiSkZyTpZyVgn2CfY6LkqSJjoqNl5qNhZGYk5aPioiMkpyTj4uMboOPj5GInpmioZeWiZaQboiZg2aFmI6TeoiEkIpwlZqUopKSiYuZjIJ/kJ59ko+SjJmOe4qEh3NydWtwbnV7i3RuhpCOknF1gHuBgYh8ZHBseH2Zk32EiHSQioBzh3luf32AhXuFi4iEjJWojHqHfH6LhXh+cXCBhoRjaHl0dXB8Yl9wYWt0XnBqe3l4bHNwZXhdbmxzbXNYWl9fYmtaUFdYZWNncXF+h2ZdaWhnYmdxjW5kaWdkaWiAend1b46FdIGCg3t1goiFd4V8eIOFeoCJd3+Le3pyeINqa19waHSAanJvbXFnb2xlfGNugHp3cWx3d4p+opehqKCmm4eMioGQnYeTnXWBqpWTjoehjZWTkIB0e3aFeHl/cnN7hWtycHptinaAgYducVtYfpGNiICAgHZ1gIB/oIaRi5KdmKGVmHiKgIGNiZyeio+GkpeWhYmVmY+Wi4uNjYydio2Pg22Ji5CQip2WoZyYlIWYh2qEo4JmhZ2KkH6Lg4uBd5OYkZ6RkImJlY1/fo+YfJGNj46akXyKgIJudXBsbW9we4Vpc4OOmIpxd4B1goiCeGZybnWBmY57iIR6k5F5dodzb4h7hYt6ioWCiI6bo4d7g3WBi394eG9sgYSCXnJ0cnBweFpecGBwal5van16cG1tamx2YHBvanFtWlhhYWJuWFFTWmZnY3VvhIJiXWttZGJma5JuYGZmX2drgXVxc3CLgHV/g4B4dYCLgHiFf3eHhneDhXyHjH97dop/anFjfGOGfG5xbHRqaG9sdnhfcX95fHR1dICCfqSVmq2eppaFjYR/l5SDkKB1i6CUk4aLm4yVjot6cnh0gnByhXNxdYhrb211bYh2g36AbW5VUYGrlYeCeIB3coJ6gqCCkoKTk5ick5p4knuDjZOkmpOOiZWYkoSGl5mMlIuJj4+InoSPinxyi4WJjoicmp+alpR/k35ohZyHZ4Wgh5KEkYKJcYORl4+bjo+MjI+NeHuSkHqOi4yRlox8iHyAa3ZqbmtsbHt+YXp+jpaCd3qAeIOMfHlnc2xzh5WKfoiGe5OPcXmDb3aMeomLeoh9gYuQnp2EfHt3got9d3FqbIKDemB4cG5scnRWXm9icmBfbG55cGhvZmZzdGhwa2F3ZV1WZmBgclNRTlxmZV55cIh8X1xocmJiZWaSal9oZFtncH5wa3F0in12fIWAdHV+jHl7hoF4iINzhoV+jY2De3mVeGZyaoNgiH1vb2t6YGpudH91X3R9eIZ4dHOFfHigj5mxnKWOgop/g5qHgIyef4uak46FiJeOjo+EdnR2c4Bwb4VzcHGDb2ppdm6Dbn19bXVzUk2C38iS1pN8cHWDdoOfg5N3lJGZnJCZe5RzhZCfoZOTkIqSm5OGfpaWiI2NiJGMiJx+joB3eox+iIyKnJydm5WTeo11Z4iRhmyIooSRiJeChWOMkZmOlYqXi42Ki3F6lIh7joiKk5GJeYV8fmx7ZXJva2t5eVyAeZCOgHt9fn+Gjnp6aHJqc4qPiYGFhHyUimt9fm5/i36Lh3yEeYGPlZqZinx2eIOQeHNtZ3GAhG1qdG9oanRuU15vZHBZX2txd2ZramJmeHJvcGNfd2BgVmtfXnZQTkthZ2NdenCJdFxcZXZgYWVljmNhZmJYaXNzbWpxdox9dHmGgnV2fotzgIZ/eol+comHgZGLiHx+mHZlc259ZYh+b3BrgFpsbnl5c2F2enuNdnJ3ind5noubr5ugkIKFd4iVfn2KnYeFoJGPhYyYhJKOh4F0d3B5cW6Eb21ufnJkZXhwfW16fWpoa2OkmsHcru+hc2x2hHaEooWSb5aRlaCVnIGScoWLo5eJjpWKkJ2Wg4CVkIWJj4CRiomWfod6dX+JeIaEjZybmJmOj3aKdm6FiIp9iqOEkYmchIVei5OXio6JjoqKhIlte5aBfYiFiZGPhnaFfX1rfWR4dWlueHNYiHqSh4V5foCAhYx+eGVyaX+JjomCgn+LloVrgXVth5CBj4R+gnp/kJWTmI91c3eIjXVzcWd1eoNidG1wYml2Z1JhcWdsVV9udHlhcmRfaH1wcm5aY3JhYlduWVx4Tk1MZGdiXndziW1cXGR5XmBkZYVgY2NeWWpya25rcneMfnR3hIF4d3uJcYOEfX6Ie3SLiYeWhox+fpdzaHVxeW2Lem50cIBXcXp2eXFld3mGjGh2gIlyf5yHmaeco5KFfXCMlHh5i52EhaGNjnyWjX+aiIR7cndwc2pvgWtpbXx1XmF4d3txdXtnYGR869q1ycPciHNsdIF2ipqJjmqYkI+dlpOBiXGFiaCNhIuVioyYk3yNk4iDiY97kIuFj4F/dniDhHKHgpObl5SXhox1h39whIGJhpihgpOMnoKJYYOUj4aJhomNh4GHan2UgH2DhImOjYJxhn5/cXdodnJpc3dsWox8koOFfX+DgISKgnVhc2uIgY+KgX5+kZB9bYFreIWOhZGDfIF8f5GSkJaIbnF6jIZ1bHFscnmBYHRpbl1rdmBSZXFpZlNgcHZ0YG9gXWiCcXNpV2doYmlYbVZbdUxLTGZnX2Jyc4VpW1xleV5eZGd7YGRfXVlrbmZvaXN4in5zc4F+enZ6iHOFg3yAh3Z3ioaOmYGMgnuTdWx3dXl4k3RueHt8WHqGcYBvZ3h3koJjdoaFcYqWhZmhmqKKh3Nvk4tyd46cfYqaiYl8n3+DmX+BeHFzbm9kcn5oZmx3eFtfeXt7cXGAamFnYX/Vto6QpnhucXd8cZKRjYdqmY6JnJKMhntph4uZhoGSkYaHmI18jY2BgYmNe4+NfYiEenR6gnpwhoCWmo6TlIGIdYOFdYN/ipKcnoaVj59+iGF/k4eEiISJjYCAg2d9kYB+f4KMjpB+bYJ8gnRrbXd0c3Z1a2ONgY9/hX58hH+EiH5vX3JwhHuOjIF8fpCIeXCDZnmCioaLgnuEfX+Tjo+Sg25veYx+dW1va2x7fmNoa2pZbnZaU2lyaWJRYnJ3bGJlXlpqg21zYltnX2RsX25UW3BOSE9nZVxnbnGAbFtbY3NgXGNsd2RlXV1aa2xibWp0d4Z/cXB/fH10eIZ4hYJ9f4d1eYmBkpZ8iIZ2iYFwd3l7hJNvbXyBd16Df3SBbWl6dJRzZ3OHfHKSkYOan5ughoh2dpV+bXaUl36IkYSKjpp8jJp2fXZxb2xqYXV8ZmJpdXpaX3d8em1xf2VkaGdXnY9ecXOWvMSEdnGUiZB+c5iMhp2TjIh0a4iPlYB7lIuBhJuMfIqGfXyJjH+UiHWJhXV2fYFxdYaBnpWGlY+CgnJ/h3SDe4mXnJeGk42cgIhlfZKCf4WDiYlygX1nfYt7eX9/h4uPfWmAfYN2Zm94eHN2c2xqjYWKgYp/eYKAhIN/al5xd3p9jImFe4CPf35ygGh4goaKhYN4g3yAl4yPjH1ubHqJfXd0b2lofXdlXXFjWHBzU1RucmliTmd0eGZgXVxYboBvc1llYl1qbWBwT1lsUkRUaGFaa25te29aW15sY1pjb3ZkZ1xdYGtqY2xpc3aBg3Fufnt/dHWDeoOCfIGFdn6JgZaReIOKdIGIcnl5f46Qb298gXFpgXl6fm1tfHaVa2p4hHRrlI2Fn5igmoWIbn2Mdmp4mI9/goqClZiKeY+Wb3pzcGxqZGB0emhfZXJ7WmFyfHlmcHphZWWOsbJ3SmJapNnQl3J7kYuReH6Vi4WZkY2GcGyGkpF6eZKGgYSZinyHf3h4iYqEloBviodxdH16aXmFg6WRhJONg39vfoJ2gniFmpiTipOPlIWHb3qSg32Dg4mDb4F4aICFeHJ/f4OKh3xlfX6DdWNwcoBoeHFvdZiNhYKKe3Z4gIR5gWpbcHxygIeFiH2FiHqIcoBtcIOGjoODcoN4gJiMjYR3bW5+hH93emVoan1yYFl3WllybU5YcnNmYEptdnRhXVtbWXR9cm9XZ11manBfb05XaVI/WWdfW3BqZ3lxXFpZa2VZY3B5X2hdXmVsaGZsaXF3f4dvbX99gHVwgXp/gX+Cf3aBhYmXinGCjXF7hnx6eoSUjHVqen9rb350f31vcnx7lHBvgH94ZpKKgqGYnJKChWeHhHBoepeJfn+FgpmKgXyNjGl4cmtsZl9hb3ltX2JveVxkbIN6YXF2X2Vl1eu+izI6PouOgHJ5hYiOjXaEl41/k46Nf25shY2MdX2Pf4WBlYh8g3hudoeEgpZ3boiEbHV7dGZ5goOnjIOPjIN9bn90doJ5hZuPi4+RkoyLhn57kod4gISNg2yAcml/fnhtfHuBioN4YXmEgXFkcWh+bXRxdIGbi4B/hX5zdX2Ac4BvW2t9dHiJgop7hn98iHh5cGuIgo+DiXKBeH+Wiop+dG1qdoCAdXVcaWl4cVlXfVNacWVMW3JyZVtKcHdvXVtaWV10fnRoWWJbZ2VuYmlNV2ZRPV5mXV12Zl90cFtZVW9kWmRweVpoXmBnbWdpbGlweH2ObGqChH95boB7fYB/gnp1goGMk4VwgItud36Ae3uIk4l/aHt+a3R7coZ7c3d9f4x6eIR+fGuMjIObnZaMgYBsjX5raX+PjXt+f4OUgn99iohrdXFnaGNbYmdzb19hbHNhaHCJemFzdF5jZJugkG5cNVmvtXVqgIl9koZ2hpeGdI+MindwbIWDh3R5iXiJfJOIen5yZ3aIfn2Xb3CGfWh2eW1leYiEpYeBh42Kfm19dn+AfIuYhoGTkJeIi4SJfI+IcXt9hXxpfm1qgHt6anp2goeAcmB3gX5xZHJndYJtdXuFlZGBfIJ/b3d5fHR+bVdtfnZzi4GGd4d1gYl5eHJtiICPgIRyfn19koiIem5taW2CgXVuXWhmdHJSW3tOXHFcT1xyb2RWS3N4aldZWVphcYB0YF1dYGZkaGhmTlpoTkFhZFtgdmFcdW1YWFN0YVpkbnJXal5iaGtnbWxpcHd8kmxphIp9fXB+fnuBf4J6d4CAiYuEcnuHb3F3g397io2Pg2p+e254eXaKd314gIKHf4N/fnpthYyImKONhIN7dox5a22EiZJ5fXuCkYCAfYqDcHFwY2ZeWWdfcHBgYGdwZmpvinVhdG9bYWRpdnt/vpymo8i4coWDc5R9eIeUg3SQjIhycnCEe4NzdYZ0iHeUiHl5cWN3hnmAkmhyhHVmd3ZjanyDiJ6CgH+Ojn1xfnOEeH+Rj4J3lY2Uj4eCiHqJiWt4eX51aHppa395c2l6doCDfWhgd4d+ampzaHuAaXaBjJCUfnp+fnF7dnt0fWFVdXxycomDgnyCcIaJd3hwb4KCi359eH18dY2Fg3ZocWhsiIJycF1oY3RuS2V2TF5vVVRZc21iUU90eGFSV1hcYXCCc1tgXGhlZGNqZFBbcUlEZGFcZHFeXHdoVVdWd15cZW5oVmxeYWpnZW9vaHB3e5NuaYiLeX5ye355goGCfHZ9g4iGg3B2g3Jtd4KDfomLlH9wgHx4eXqBi3SDeH+BgYKEeYB2b36Ji5ueiH2GeneHfGh0ho2Ren9/fImGhHaPgGdvbV9kXFhlWW1zYWBhcWxsaIluYHNpWV5kbYB3qdqqx4aHsnKKeHCNdXuHj4B6k4qAdXR1fneAb3F+bYV0lIZ4dGxgeoF5iI5lcYNvZ3VuW219gZCTgIF5kpJ9d3pthnV/kIuDc5WKkI6HhYV7f4VtdXZ/bmh3ZW18dm1qdnZ/f3xhYniGemh1dWN+emd0ho6MlXt0gHVxgHp8bH9ZVXJ9b3SDhn5/eGuIhnN4anR/g4N9enx4e3KKgHxzZ3NlbYuEbXRbal92ZUhub0xbYldXVnhtYlBTdHZYUFVYXmBxhG9cYGNtZGNebmJUXXJHQ2ZfXWZoXlp7YlJWXHVbW2drYVZrX2FuZmZscWhwdniOdGuOjXV/dnh9d4GDgXt0fYOIiINvcX90cXV+hoKJjYp7d394hHx9hYd4h3x9gX6EgHt+c3Z5jI6fjIl6iXd1g3lefoaajXmHg3SGhoR3iXtibmxbYltbYVZqdGNgW2hvcGeHcmFxZlddY2t/fMrOh7mia21ui21yhXJ9hYp/e5KFenl0eXV0emptdWOEdpKCd3BnXnyBeYuJZXGBampxY1hse4aciYOCc5eUd357bYdwgImKhnCWjpCIhYuDenl+cXFvfWdocmJteHJqbHF3fXx6XWV5gHdpdXhmgnZndIeMjZR8codpbn6AeW18XVdwfW1zf4p7gW5uiX9wdmd2foB+gXV7cXp0hnt5cWVyYW6MgmxzWGtfeFxJb2xNV1ZeVFV7a2FPVHVyUVFUVl5idIVoXGBramZiWW5hWGJwR0FoXWBmXl1We15PVmRwWltqaF1XZ2BfcmZqaHJncHN3hnhulYp0f3p3fnmDh4B1c3+GhY6CcHB7d3d1eYeFh4yGenx/dYt+fYaEhId/fn59h398eHV5d5GTn36MfYtudYB5ZIOIl4Z0kopvhYWCeoN0Y25qWV9bXV1UZ3NlYFlkcnJngXNia2RXW2Bpf3i+rnuft25ic4dodHxyeoOGe32NgHh4c3Zve3Zlam5hh3WOgXNqYl5+eHmKg2ZxfWhqa1pWb3iKo4GFf3GZk3GAeHSBbX+BkIZylIeMh4OIhX15dHJvaHlham1gbXZrZ2trend6d1tnfXx4ZXN9boR0ZXWGjYaVfnCLZmt6g3RsdGJbbntrdHyLeoFmdIZ9bXBndH53fX5xe2t6e4F5d3BlbGFtiX5tblZrYHdWS2tsT1JPaE5ZfGdiTlV1a01QVFVeZ3aDZl1hcGhnYFdpXVxraEpFalpiZFdZVXlaTldualldbGVcWWVjXnRmbGRyZ3JwdIB4cJmFdn9+eH98hYd9dXOCh4CVgm5zeHp6c3OFh4iIhHmBfXaPf3yEiY6DgYN7fouDe3d8d3eZnZd6ioOHaXZ+fGyEhZSAco+CcYaCfoJ/b2ZsZ1ddW1xbU2RwZV9YY3J1aXZwZWViV1xcaIBwb3KAc4llZXl/anR2c3ODhXiBhHp3dHVuanpwYmdrZ4Z0jYRuZl5ffG97iX5obHdmaWRVV3Jwjad8hHx2lpBzfHJ7eW16epCEdpd7h4aChoN9dXBybWd1XW1oX2x1ZGdmaXpve3JZZ4F2dWdwgHiCdWF3hYt8lIBui2pteoBwZXJlYGx5ZnJ2iXt9YXWDdmlrcXR6cHl4cnxmfn5+eHZuY2VhbYZ8bWtWamJxVExpa1BMTnBHXntmYU1VdGRKTlNXYWp3fmVdZ3NpZV9WY1dicF1LS2tYY2JVVFVzV0xZdmRaX2tgXFpjZV93Z21icGlzb3F+dXSZgXd/gHh/foWEen12goN+mIVucnR7enRxhYWPgoB6i3V1kYB9gZSOgIWEfH6Mhnp+gHZ7o6WKeYiGhWx1fHt1hIKMem+Fc3qFfYKDdW5qaGVWXVtbWlNjbmVbWGF0e2ppbWhfYldfWmmAaWtvgGdsYWh6eWt0dHRvhYF6f312dW56aGp5al9lbmiBd5CEZ2VYYndpfod6b2lvZmZdVVhvaI+ndoF6fJGOeHVvfm5ydHiOfneUdIWCf4WIdmpydmdob1xtZV5tc19nYWp4aHttW22Dc3Npb4B+eXdgdoSEeI+Ec4hxcHl/cWNxaFtudmRwc4h7eGFygHBnaXhzcWt3dnR2Y4N7fnd1cGNjY218fWtrVWliZ1RLbGhQR1JsRWF3ZmJNVHJdSkxUWWRrd3plX21waWRcVl9Vbm5XSlNoWGZeWE1VbFRLXHpfW19rXV1bYmVgemhsYW9vdW5vd3V6l313f4F5gH+Hhnp5eoN9gZOEcXR0fnl2dIWIkH2AfZBsc5WBe4KfhX+HfYB+hoKAint2hKyef3qIh4RscoJ5doGAgnRuhm98gHSKgGpwbWRkWF9aWlpVYmpnW1pfdYJpXm5sXGFWXFxrgWVydH1pal1sd3ZndHdyboZ7fn15dnNsemdpeGZdZHJneneSgWNjVGVvZ4KEd3ZmaGlgV1ZZaGSQp25+eICLjnpwcHxmeG55i3p2jnGDfX5/hm5kdnNkaGhdbGJdb29bZ15sdGV6aV10gG9ya3F7fnV1YXSFinqHh4B/d3J1fnRhb2xZcHJicXGEe3VkcoBsYGx6b2poend0cWWEdHl6dXFkYWRtc35qbFRpXl5VTHNjUUdXYkdjdmZhS1RwWEpLV1hna3Z6ZGVtcGZjWlhdWHZmVEpcY1hoWFlJV2VRSGJ5Wl1gbFteXGJkXoBpal9vdHhub252g5d5coGAfX+Ii4Z+dXaGeIaMfXN1dYF5enqCjI59foSJanSWgXuKnX1+hXmAen58hohzcY+tjHt7hpB+ZnGIenR9fXZyb4Zse35tj3picG9hZV5lVllZV2Nma2BdXXOGaVlxblteV1pcbHtjcXd2bWNbbXN0aHV2cW2FeX+AeXdub3RlaHRlW2d0ZnZ2kXpfXVJlZmqCgXR9YWNpXFRYXmJjkKVoeXSDhpB4bG55Z3dse4R6dIhygHh7eH9oZXZtYGZhX2pgXXRrWWVdb25iemZbeHxrbm5weHl0dGRyg5J/h4KIenZvcXxyYXdjWm5vYXBxgXxzZXGAZF5tdmljZnh6c21ugXRzfHNxYV5lbW99ZWlUaFlaVU55YFJLWllIYnRkYUlUbVNJS1pXaWxye2NsbHNjYVlaW2F2XFNLY11YaVNXSFlgTkdqdlhfYW1bW19iY12FaWhhbnh5bG9qdoGQeG2CfoCBkoiEgXZ1iXOLhnNxdnaBd3x9foyQgH6TfnB4loN9mZJ5gIB4eX5/c4iDc3CZoXt7gImVeWR1iHlzeXZrc3B/a3l8cJFyXnBvYGdibFRaWVdoY21mXFxyiWZTcm5bWVhYYGx2ZGp1ampfW210cW10dHRrhnx/gHx3b25sZGlxY1trcmR0do9zXFdUZGBxf35xglxhY11TWmBcY5OfZXJxhIOQdGtqeWxub3p6enGAd39yeXp6ZGZ1Z15iW2FoXF53aFdiXXBoYXhhW3t2amlyb3d0c3RpcIGUg4Z+hHZyanB7bWV2V1tqbWJwcoB6c2Vvfltgb3FiXmlvfGxrc31ycHhrcGBbZWtte2FnVGdVWFJRd1xTUFlSSGNzYmBHVmtRSE9aVWtra3xlbW9xYVtaWFlscFdST2ZXV2lTVEZaXE9IcnVZYGRtY1hhYGFejGpjZG15eGtvaXV5hntrg32AhZl8goR5fYdtj4Zxb3d6fHSCgn2Lj4OClnR4gpSFgZ+JdYF/gXR/gnCHgnVvopd0e4aLh3tmd4tvbnxwZnhxemxzdnONa150bmFnZWtSXVtWaGJsbFtccYxkTm9uXVZYVWdpdGhjdGVlXVpudW5wdXV6bId9gHyId5BzY2VrbmFcbm1jc3iHa1pUVmJjd3x8cIVcY19jVFtgWWKWlWNucIOEinNqZ3luZXJ1cnpreXR0bnp+dV9mc2NbXldiZFlhdWZVX2BtY2FxXV1+b2hpc3FzcHV1a2yEk4GIe4VxcmZue29xblNaZWplcXOAdnNibHZVYnFrW15uZHxla3V8cnJyam1fWWNpanheZlRlVVZQVW5YUldUT0hlcl9hRlhqTkhXVFZtaGR8aWt3amFXXFVbdGRTUlZoUVlmVFNIWltQTnh3W2BmbGlaYmBeXo9uYmZreXVubml2dn9+bYOAfoaXe3+HgYl+a5KIcmd0gHt1gIN+iY9/i5NyfYqRhYefhnt/hoxzgIZzfYJ1bqSMc4GNi3d4bnuNYGR8cWd6c3lsbXF2g2dkfGxjZmdoU19fVWdgbG9cXm6OaE1pbWBVVlNvZnNsZXhkZV1ZcXVtcnt4c22Je4B3nHt6bGFlbG1eYG5qZXB5fmdaVlhga3d7em+DXmJeZ1ZZYFdjnIhia3GBhnx3a2p2bFt2cGt5aXVybW57gHJYam5eWV1WYmRYZXFjVF5iaWJibVpgfmtma3N1bm13dmtohYt+iHqHbXFmb3tscWxiWF9oaG9zgHRzXmltU2VwZFVibmF5Ym91e3Vqb2xqX1hgZmh1XWVWYlZTT1lmU09dT09IZW9dY0daaU1JX0tYbWRfeGhufWRgVV5UXXRbVFJfZk5dYlRTSlxaUVp2dl1fZm1oWGJhW16OcWNnandxc21ndnN5g3OBg3uIjX58ioeOeW6QinRsc4Fzf3+IhYeShJWPen2Mj4iRm4SAfIyEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fX59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6Ojo6Ojo6OjY2NjY2Njo6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkpOTk5KTk5KSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2MjY2Ojo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJFtZmdnZ2dnfYWEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREVCMS8wMDAwLlxwbm1ubm9qZmdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMkWdfYGBgX155g4KCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1NTMeHBwcHR0bU2pnZ2dnaGNfX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRjo2NjY2NjY+QkJCQkJCMh4eIh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWGhYODg4SEhISIioqKiomKiYiIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GSkpKSko2QkpGJh46KkJKTkImQjo2RiI+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ojo6Oj4+Pj46NjY2NjY2NjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCMiIeHhomFiJCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJGNhoaFhYWHj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQj4eLhIeEhoiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fHx9fX19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yMhIqGhoiDio+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2Ii4yLjomOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYmJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTk5SUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OTk5KSkZOShpOUk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpGOkZGSk4V8lJOSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSknyEkpGSeH+Tk5GRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJCSgm2Nkolxf5GRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj5CEZ32SgHR+kI+Pj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Oj4ZocI98dHuOjo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyOgV1pdm1le42MjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouKi4hnZm1eaWd0hoWDhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ1dXZ3cWB0bmFwdGplaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGdjZm5tXWx1cGViY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWl1mam9xcXN0ZVlZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9OUV9jZW5vb25iT1FUUFBOTk9NSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5PTE1QX2hnbW5sZ2FSTU5PT1BPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLSEZJTlhmbWhsbWxqaGNcV1VRT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJQWltdZGlvaWtsamlqaWtrY1JISklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+Pj1MXmdsa25rb21paWpsZVRJQ0RFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs8O0dLR11tbW54cWlqaFZIQUVGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oz47Ok9pcHpzbGNJPUBAQ0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTk6OkFXdHFYPzc8PD1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09PTw+OztXXzo6PD49Pj9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A7XW5APkRFPz9BO0ZYOz09Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojttd0g4Ozo9PUE7SVs6PD08ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlRPD09SUxFRnV3TTc4ODo7Pj5QYDs7PTw6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3lJO11/g395fHdWPD0/PT0+Ql1qQTs9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUhyeWtigoSDgoOAfV0+QENAQD5GbnZNOj1BRUFCQkZIQz08QEREQUA/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARm90fYKCgYN+fYR1TEFDRUA/P1d8gVw/Q0VJSklJTU1LRUNGR0dFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXFCREVEQ1d1hoeHflhHSEpNTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSEhIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnV2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEimxBQVZ0h4mHh4eIg1dITE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzdnd6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIg1VshIeGhoaHiIiHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklJR0hIR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlWBg4SEgoKFhoaDgoaFhISGhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkBBQ0NCQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJZYWEhIR/gYKDgoODhIWFhoeIiIiIiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2NzY4OTc4NzY4ODs7Oz1AOzk5OT08Pjs7PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlqhoSEgX6Bg4ODgoOEhomKi4yLiomKi4yJVDo4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Njc3ODo2Nzc4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmaFg4GAgoODg4ODhYmLiomJioqKiouJioqBRzY3NjQ2ODg3NDU3ODU2NzY5OTc2Njc2NTo5Ojo6Ozg5ODk4Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhIaJioqIh4iIiIqKjIqJiYx6Pjk4ODs8PT45Ojo8OTo7OTo7Ojk5Ozo5PT09Pjs7PD06PTs5Ozs8Ozw8OTk8ODo6Ozo5OTk8Pzw9QUJESUpNS0lLTFdvcnN1c3Z4e3t8fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQEI+QEJAQD49PT5APz4/QD9APT0/Qj9BQT9BPz1AQEA+P0E9Pjw7Ojs5OTs/PTs8PT1BQUNBQkNBWHBxdHR0dnp7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uKioqLiotePkRHSUtKSUZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRENFQ0VFQUZFRkRFRkRAQj88QD49P0A+Pz4/Pj8+Pjo7PTxgcXJ0dHV3enp7fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDQ0ZXhIKDhIWFhoaIiYmIh4aGhoeJiYqLjI2MjIuKiohWSE1MTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d5eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT5CQkdHSlmEgoOFhYaHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTlBOTE5LSkxKSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg3PDs8PTo/QD4/QENGSUpRX4GDhYSFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXJOUk9OTExMTEpIR0VJSURKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0hHQ0JBQ1VucHV3d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo8OD0+Oz1BPj9BREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyLi4uLi19SUlBNTk1LSkdFQkdKR0xKRktOS0tKSk1NTE9QTkhJS0xPUVFQUU9PSkhKSkxKS0ZHSEdFR0lGRUVCQUJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pERUZLT05PV1VRUE9RU1JNU1RPTVNMUFNVVlJTUVBMSk1NTUtOR0dKRkZISkRERUVCRENjcHV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0NCRlZORk5QUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLaFdVa2FFUlFRUEk7O1FTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUU9OUlBQUFFLS0tISEpIRUZJSUlISWlydnl4eXl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUhHRkZFPz9BQUVBQ0dFREVMWFJNVFVWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUT9AVlVZW2NgVllicl1dVl1aVkVRWVpbWV9UWWdSVlZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p5ent6enx9e35/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36LiYqLem5wWFpcW1JTUlZWVFpadINZVX2QYFxYXV5XSVZdXVtbX1lIWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZVFVUV1JRV1ViloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXFtcXV1XU05TUFBRVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTEtmeVtdVFlVVl1aTFRaVVNUXlpYV1dXemtYW1tcXlRRUVBJTk9XVlhbWmRwcnZ2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtNTktNS0hKREZIRUM+VGRVf1JRUU5LUlRRTU9ZUU1OUVNVVU1RU1JQT01MSENJSFJUVVpcbHF1dnVzc3d6ent7e317fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV1bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlZUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDP0NDQ0NCP0RQQkNAQz1DSUdWQEhOTEddaVBIRk5GREVGSUdIQ0RIR0hLR0RCQURATlFNUmRydHZ1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGCa01HP0A6Oz5AQD8/PmpRS2FFRkhJRUI/R0xOR01RVUlCRT8+PD08PT0/PT9BQ0NAPzw9Qj5KTUdVbnR0dXN0dnh6fHp9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSkpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlQ0BAQj06QkNBQURCXF1Pe05PTk5LTE1PT1FMS0xXTUhHQEI8OTc3NTk5PTs7Ozg5ODk/PEJIP1xzdHV2dXZ4enx8fH18fH19fn58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklIUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIRkdIQkFHSUVFRkRNUlBhV1JXUVBTU1JVW09PUVdQTUlERj46OTY1ODc5Nzk6MzY1Nzk1PEI9ZXNzdnd3eXp7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtUVFNQUVVPTFJTVFdYVFRYUUxXWVpWWFhWWFldV1dYaHNrXVZhc2thYV9eZGFfXllUUU5OTkxJSEpLSUlGQ1FQU1tXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg1NzU3ODU5OUducnR4eHl7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RWVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMT1JST01NTk5OTEpGUVBVWVNUT0pOT1VTVFxWUlVTUk9NTElISEY/Pj06Nzg3NjU5OTY3Njc1V3BwdHd5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0lHT1BPT01SSk9QT1BOTk9UTE1JUE9TVFUyPVhNSUBRPWNhUVNRUE5QUVBOTk1RTlRSUFJNSUxKT1JQUlJTVFFST0xMS0xMSENCQT06Ojg3NjtCNTU2Njpkb3J1eHh7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpJR0VITEhLSUZMTVBNRy9FX1I+Mz8+am9hUlJRQEdVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHZ6e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A9Oz0/QUJBQ0BCRURBQEdIR0hFRkhKTUtFR0NPUkM4RU5TXWZTUVNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ1eXt6e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRYV1VNTEtJPDk4Nzs/QD48PUFAQj0+RUhHQ0ZGSUdKSkBGQUFARkhFSk9IUFJhXFFQUk5TT09QTExPTUtNTE1PTltXS01RT0dJSENISktMSkZGRkQ/QkM+PEJHP0I/QWRwdHd7enp7fHt6end7d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIREQ9OTc3OT9CPjs/QkBAPkFESUVDR0dJRklFQkI/Pj1DQkFHSURNT2JlUU1OTldLTE1LTE1NTUxLTk5TZE5KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLbm92eXl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9ISkQ/QT05OTk6P0I/PEBCQkFERUdLRkNISUdHSENDP0I/P0BBPkRFQ0tOUlRMSklNVEZJSUpMSktMSUpMTU9QUlBLR0NMR0NCSkpMTU9OSUpJR0NDQ0RJSk1MSVlybXd5eHp7e3l8dnJwdXJ0eHl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhkcUhLREdISEdKS0lKS0RHQj0+PTo6OjtBQj89QkJDQ0dGSUxKRElJRkdHQ0M7QUBCPkBAQkVDSU1QSEhLR0hLREhJS01ISkxISUpLSk1cUkhIRE5GQURLSk1NUE1LTUpLRkdHSk1OUU5MYm1pdnZ3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0Z2RvRktDRkVHRUZGR0VHQkNAPTw9OTo6OkBDQD5CQ0RFSUVJSkxGSUlHRkZEQjtCQ0M+QENDQ0VHTE5IS05IREhFSUxOTUhJTEdGR0lJTE5LSUhFTklCRk1MTk1PTU5OTUtJSElPUlFSTlJmZmZxb3N4dXt6fGxoam5la3Fsc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkRGRkVDQ0NFQERCPkA/Ojs7PTo9PkNBPkFDRUZKRklIS0hHR0dGRUNAPUVFQj5CRENDRUdISUdNUEpGRkdLTk9LRkhKRkVERUlKSEtJRkhQS0NJTUxQTU9OT1BOSkpITVJVVFJPV2RgYW1ncHJvcnl6Z2VoaGRpbGZxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxHRUVHQ0JBQkQ9QkE+QT05Oj0/Oj0+QEI+QEJER0pGSkZJSEZGR0VDQkFBRkZDQkNCREVFR0dIRkxRTElPSkpMTElHSEVHRkRDSUlIS0pHS1JNQk5PTVBPT09NTk9LS0tQVVdWVVRYX15caWFtaW5ocnNiZWZlZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1anN1bnV0c3FyamtzTUdIRkhCQkBERDxBQEBDPDg5PT45Pzw/QkBAQERGSEVIRkZIR0ZGRENFQ0RJRUNGRUJFR0VGR0dFSk1LSFFNSktISElFRkhJRkNJSklLTUtPU05EUVJQUVJOUE1OUE1MTVNXVldYVlhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpb3lNSEdISEJCQkZEPD9CQkQ8Nzo+Pjo+OkBCPj8/QkVGREZEREhGREVDREVGR0pFRUpHQ0dIRkhHRUNGSkpHTUpMS0hKTEZJSUtIRUtLTE1OT1JUT0hTVVNQU09RTU5RTk1QV1pWWllWWl1aWGFgYGBeaGVjYGRmaGdqaWhqZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3RucHJyeE5JSEdJQ0FDSEU8QEVCRT04Oj4+PTw8QUI8Pz5BQkZDRUJDSEVDRUVGR0dHSUZHS0hDSUhHSUdGREhLSUdLSE1LSktMSExLTUtKTkxPTk9SVVZPS1VXU1FTUVJMT1FQT1RZWllcWllbXl5eYGNeXGFja2JgZGdocoVoZ2pmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdm90TUlLSEpGQkVHRTxAR0NEQDo8PkA/Pj9CQTxAPkFBRkJFRERJRUZFR0VISEZISElLSUVKSEhLSEZGTElISEpHTExMTExJTUtNTU1PTFBQUVVWV09LVlZVU1NRUUxPU1JQVltbXV5bXF5fX2FgYWRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2bnZKS0xKTEdCRURFPEBGRERDOz8/QUBAQENBP0I/QUNIQkZFRkhGSUZGRElIR0lISk1ISEpKSUxKRkpLSElKSkdLS01NSkpNTE5OTlBMT1BSVFhWTU5UVlRSUlFQTE5UU1JXW15eX11dYF9gYWFfYWNlYmNoYmRpamd2i2xqaWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZvd0tNTEtNR0RDQUQ8P0VFRUM9QUFDQkJDREFDREFBRUdDSEdHR0ZKR0RHSkdHSkZJTEhJSk1LTUxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1FXXFpSV1BOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BDQUVEREZCQ0VHQ0NIRUNISUlISUtHREtKR0hKSUlLSEpKTkxOTElMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NTUGJ2dWh1Y2F2YFhucWJkdmluemZbbHRgbGtUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpKSkZDP0BCPz1ERUZEQ0RCRUVERkJGRkdEREpFRUpMTEpMTEdHTUlHSUtIS0tJS0tOTE1NTExJTE1MW3NiZHBebG1VTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpyeXZrYmBrZWVteGxrdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUhHRURAQkJAPkNGR0JGQ0ZFRkVEQ0hIR0RFS0hHTE1OS01NRkpOSEpLSklMSkpKS0xNTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtbnVcWWxRXG1tWnFta29teHh0c2lwXF9ya3FqVXV5eHBjXmtmYmdwcGpqb3BwcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHSEVFRUJCQj5AQEZHQkdESUVFRUJGSUhIRUdMSkdNTU5MTU5HTE1JTEtJSk1JSklKS09QT05NS05NTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkc1NlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITUdJREVFQ0FCPEJBQkZESEdMSEVDQ0hLSEhGSkxMRk5LTFNSTEdMTEhOSkhITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210XW5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9uc3N2c0hLSElCRUVFQUA9Q0RCR0NISU1JRkNGSkxJR0ZKTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTU1NTUlLS0tTa2JaaV5faWNyclpfWWpvX2VlVWtfY1thYVFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ2dHdyR0dGSURFREZBQEFFRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpFSEhLTUlISkpKS0lISUdLS0tMR0hLS0xMTEtJS01OVFtcVFBUTFBPTk9PVlFPT1FOT1FKSU5QUWRxaVRZV1xbXFVZWl1YXVxcY2ZhYWViY2ZfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUNAQ0hERkdDSUtMSEZER0tMSERHSVBLTE9LTFdMSUVFSElKSElLSExKSEZHR0lHSElFRkxJSktOTElQXFdeUFxbYF5NWFlTXFxiXk1ZWk1YYVJKWWFaUl9kXGFYW2RkVlZYXFlaWFxWWVxdYl5kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0VMTUJEREJFSUVHR0ZLSktIRUVKSktGRUhIUEpNTUpNU0hHRUFIRkpJS0tJTEpIRkVJRkRGR0VFSkhDSk1LTFVfWWBYYGFbYFRYWVReXlpfUllcUF5cWU5eXF5TWl5jXlpdYGNgWV9iW2BeW1RYV1leXWNiY2FjZmhla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JREJCQ0dIRUhHSEtJSUlERktLS0ZGSUpOS05MSExOR0hGPkdHTElLS0pMS0lHRUlEQ0REQkZKREBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVlWVVxZXWNgX19jZGJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQkVISUZHSEhGRkpHSEZIS0lMRERLSk1NTEtISkpISkY/R0ZOSktLTUtLS0lHR0NEQERBSElCP0lKSFBdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RT1xfYWNjY2NiXGRjYmRjZlhRVVRSW1daYF9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktKRkZGSEdGSUZGRklMSk5GREtKTE5KTElLSkhJRkJISFFNS0tPTUtLSUhHRUQ/RUNISEFBR0ZFVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVVZYFJRX19iYmBgYmJgY2JhZGRiWE9RUVFaUltdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FHRkRHTVJIQ1FKRkhISEVGS0pNUEVGSUpLTkxMSUxMSUlHREhLUU9NTVBMTUtLSElDREFFREhHQkFHRURXVUVcVF5TVl9YTlRVTlpaTUpLVGBhW19YXl5hXU5ZYlxgYF9iY2JdYWJXX19UUE5PT1dRXVtbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERUZHRElSYlBDVl5JR0dIREZNSlBQRUlJS0tOTEtLTEtKSkdFSk1RUU5PUE1OTE5IS0FEQUNERkRDQUVGQk1IQktMUE9OTEZNRkdJSkhHTEtNT1BJTE9QT1NPTFFTUlVaWVdZWFhkV09TVFBQTk1PVFNbWFhaXVxgYWRlY2dja2xwc3J6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdHWExHSEpIR01MUVFJTEtMS05NVU5PS0tMR0dLUFNTTlBPTk9OT0hLRmBFRF9MRGZjRU1bSV5bcm1PTVVtWUxDUGBVa1dnSl1XVV5ETFFVTExTVlFSVFhXVFhVVFxVUGZaaGhkWFJqU1dWVFtcW2BgYWFhYmBmaGZua2hyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TEhFR0ZIRUVLT1NJSkZgU0hKT0pJT01SUUtNTExPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpRf1FJfFlZcXNYUG1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtgVlZYf2p0dXVfX3ZfWGFbXGZbX2FhYWFeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU5CRExMRklLRVFWTEtPSUtSWFdRTk9PTVFUTk9RUEtLTkdNUFNbWlRRUk9QUFBKSFp4XVR4ZWhaUlRRdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3Nye3xvfXlvf3JfYGBiYVpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1ISkpHSlBPTU1KTlZeWVVMUVNOWFpNU1NSTktPSVFSU1lXV1FUUFBQUUtIZ3hsY3hybVtLTVV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclFoem1panp6fWx4en9vaG9ZdnZqdXVwgWByZ3xpbHh8b15fX2JhW11iZGdpaWRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdXpufH15eHJuTktTdE5DQkVQUEhKS0pLUE9PT01QWmBaWEtUV1BhXlJWUVlSTE9JU1RVWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGl5fXhgeXtzbmFdbW9jUmhxdW5teXB3bHZ0dHFsbV10fnprbXl8a3RsfGtwdnV4Xl9fYl5dX2RkaWdoZWVeYWJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRyb21MTFtWSEdFR1JQSUxNSktQUVBQUFFXXFhVTVVZVWZYUlJZXlNMTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnfnZVTFdraH1sbWx4X1twenteYHpzY3JveHFoZXxpcntdVUxsYHZ1a2l1e3ttfnhrfHBdXl5iW19iZGRnZWVlYlpjY2lra3JzcndnbGloZGdgYWthZ3NybGdtbXJ8a21oa3t0bW1rbU9ISktISUlIUVBMTk9MS1JSUk9TUldSVlRQV1tWVlRUVGFgUE5NS1RTU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWFJOUFVUWFhYW1pVUlNXW1dYV1pPU1VXV1hSXVlXXVZUUFlSV1dXV1heW2dyXltbWVxdX2NaX2NjZGZkY2NiWmNjZmZlbW5tdWVlZ2NhZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLTExNS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVhQT0xNVlRQTlVTTk9NTFFQS0pSUUtRTUtLT1JVUlFRU1NJSExOT1FSUVFRVFZSWFdcV1NTUFFVVVZTWlFPU1JXVlRZVlRZVVRSVVRUVFdYV11aXmFdXFpaXFxgY1tdYmNkZmRlZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZWZtc2RpaGtrZWRjZmhQSktMT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYU1FQS09XU1BOVVBOUU5LU1BNT1VTTlJOTU5RVFBUUVNUVU5LTU9RVFRSUlFWV1RZWltZU1VSVFdXV1lbVE9UVVhVVVpVV1lVUlJYVlVXW1laX11VWF5cXl1cXWFhXltiYmNnZmRkYlhfYWJeYGhlZmRhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVpZWFdYWlpYWVZcamRWWFlaV1ZTVE9KTlZUUE9UUFBQTk1RUVBSWFRRUU9NT1NWTldSVFVVT05NUVNVVVRUUlRXVlpdXFpWV1FSV1hWW1tXUVRWVlZWWVRYWFVSUlhWVVpdWV1fXlZeXV5gXFxgX19fWmJiZGhnZGRiWWJgYl5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUVBVXFpaV1tbXFlaW2RxbWhkXltZVlVXUUxNVlNNTlJPUVJPTFBTUlVaVVNQUExQV1ZRV1NTU1hNT1BSVFhWVVVTVVlYW15dW1tWUk9VVlZbW1dSVFdWV1hWVFhbVFNSWldWXF5aXl9gVWFcYWFeYGJfXWBdY2BjZ2hkZmBaY2BhX19lZF9gY1taXFtcWVpYWVdcWVxbYF5fW15eYWBeYlxZYFpRTk9OVlFQVFJPVVRTUFdcXVxYXlxfV1xeanF3eYBiXFtWVlhRTU9WU05RUVBSVFJLUVRUWFpXVU9STlNYV1RTVVJSWk9QU1NWW1ZWV1RWWlhdXltbXlZTTlRVVlxcVlJUVlZYWVNUWVxUU1NdWFpdXlxgYGBWYltjYl5hY19cYmFiX2NmaWRmXltkYGFgYWNkX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVUlFXUlRQW11eXltgXGBVXF1panJ9c2xnXFVYV1BOUlpTUlFTUlRVVEtRV1ZbWlpTT1NSVlZWVE9XUlNaUlRUVFhdV1hYU1hcWF5dWVpdVFVOVldXXltYUlVVWVlZVVdZXFRTVl5ZXV1gXWJiXllfW2ViX2RkXl5jY2FeZWZpZGZeXmRhYGFhYmRgYl5YWl9bXFtYWFhYV1taXGBcW1tcW1haW15WXlldUE9PUlpQWlRVVlZUVFReXmBfXmJcYFVdXmJreXRsfWxaVVlVUVBTXFRVVFVUVllXTFJaV11aXFJPVVNYVlZUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSV1JZWFlfWlpUVVZaWVpXWFpcVlRaXlxeYGFfZGNcXl1dZWFhZmReXmRjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9fYWFgY11gVF1fYmVldYF6aFhZWVNWU1ZcWFdXVlZXXVhPVV1aXl1dVFJXU1dWVFNUWFJTVlRYWFhdXlhdW1ZdX1hfX1hdVlFZVFlaWmFZXFVWWFtaW1lZWlpYVl1fX15jYmFkZFxiXGBmYWRmZF9gZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWU1xUVldZVlZcYGFiY2FjXl9WW2BkYV96dW9oWVxaVVhUV1taWVxZWFlgV1BWXlxgYVxUVFhQVVdWVFZXUlNVV1paXF9eWl9cVl9fWl1eWV5WU1lXWVpdYlpeVldbXFtcW1tZWllaX19gYGRiY2RlYmRaYmZjZ2ZlXmFiYGNeYmNpZGNnX2deYmJjYWFgXl9YVFtaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU1BWWlZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGxmaF5cXVtWV1hZXFxcX1tZW2JWVFheXWFjXFJWWVBXVldXV1ZUVlRYXFxeYGBdYVxXYV5bXlxbXlhWWFhbW19gXF9YWV1cXV5eXFpcWFtgYV5gZGNkZWVmYlljZWVoZ2ReY2FgZWNdZWlkZWlfZ15jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOUldZVldaWFtcWFdZXmBiYWVhZGFdXllhY2JfYWBgXlxcXFdXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFdXWFlZV1ZXVl1dXmBhYF9iXllhXV1eWV1eWVhWV1tcYF5dX1paXl1eXmFcW1taXF9iXmJkY2VmZWZiWmRmZmlnY19jX2FmZVppaWNmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWFdaW1pZV1hWVVtdXV1gYGJieExXV1xZV1xbXF1aV1xdX2BiZGJiYV1gWGJjYmFjYWJdW1xbWFdbXF9dYF9dW2BkXFxYWmJlY2BSXFpPWFhaW1taV1pZYF1gYmJgYWNfXGJdX11bXl5ZWVVYXV5fYF9fXFpeXmBiY1xcV1xeYGJiY2VkZmRlZmRcZWZnaWZjYWJcZGdgXGlpYmhpZmVgYmFjYV9gX11dW1lcWVhXWFlYV1xbWldXWE9YWl1hY2Zmcmt/SllXXVpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGJiYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlJZWFxdXVtaW1tjYGJiY2BiZGFgY15gXF1eX1pYVltfXl1hYV9dW2BhYmViX11UXGBgY2RkZmVnZWZmZV5lZmhoZ2RkYFtlZ15haGhiaGhmY2BiYGNiX19fXV1cWltZWFhYVlpWXFpaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnV1dXV1dXV2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7e3t7e3p6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dXR1dXV1dHV2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t8e3p6enp6enp6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHjF1NLS0tLUk3t9fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYmJjI2NjY2Ni7DBvr6+vr3K09LS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19eNXn5OTk5OeZe39/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjIyPkJCQkJCOu87Ly8zMy9vm5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12fn9/f39/f3l3d3d3d3d4eXl5eXl6eG9vcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fX19fX19fH2AgoKCgoKChISEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ0dHR0dHd0dnd6e3h7eHd2eHt4eXl5fXp5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3p6enp5eXl5eXp6enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHx7fHt9fHh3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d5fX19fX59eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4SCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3d3x6fXx9fnx4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KCgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6fnt8fHt+e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl8enp6eXx4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN1dXR0c3NycnJycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3R0c3RycHBxcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXJzcnN0c3Fzg3Fvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJycnN3c3Nyb4ORb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcXFycZGEcHJwl49ucHBwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXJwiKR1b3ukkG9wcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXCBr4xth6eScHFwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFycX2uonCPppVxcXFxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJxgrKpkKGxknBycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3Nzc3NzcnObqqKzp6uVcnRzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fnx2dnd3dnV4enh4eHh4eHh3faego7CfnKGBe3l6eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fXx8fHyIppebrKCjooh6enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX59foigkZCem5WYj35/f319fYCDgoCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgYGBhqipoZqemZiUfICBgH5/f39+f4B/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/f3+BgIKVsKWmoZ+iqqWJfn19fn9/fn5/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH+AgoePobKqnqahn6CiqKuglIuEgYB/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYaLmqmuqaOcpKGfoqGgoqSjno+CgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgoOMmZ2Zmpqhm52ioJydmpOIg4KDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OCgIGEi5SWmZqMkp2bmpaMhoaHh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSDgYKBhJCYlYiOmpqOh4eIiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46RkY+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhISCgouWjZOXjIOCg4WFhYOEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgYKCgoKCgYKQk4SCg4GCgICAf4GAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgH+AgICAf4iPf4GCg4OAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJloiEgoSCgn+AipKAgoGChIOBgYGCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6YioOFhISEgoCOmIOCgoKEg4OCg4GBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj42MioWEg4ODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBj4yDgX9+fXx9i5yNgIKBgYOCgZWahoKCgYKDg4GBgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GVl4mAfX19fXuBl4yAg4GBgYCLlZKOgIKBgoKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioaDhIOEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgJWfin5+gH2Hin2EhIOEgoODgo2JhY2CgoOCgoKCg4ODgoODg4KCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fX19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyKiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOKkYOEi4WCgYF+fYGHhoOAfn5/fn9+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWGhYWHhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f36AgISFhIWGhoaFhYWFhoeHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoeHhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiYiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/f4WFhoiIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHh4eHhoeFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt6gIaHiIqKiYmJiImJiYmKi4qIiIiJiYqLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5COioaEhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKCgoKCgH9+fX19fX5+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIaGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgYKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fX5+fn5+fn1+fX19g4eJioqHh4WGh4eHh4iHh4mGh4aIh4aJiYODhIOFhISFhYaIiIaFg4KCg4WHhoeGhoSCgoOEgoOEhIKBgoGBgYODhIODkZKQjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCgoF9fH1/gH9+fn59fH19fHl8g4aGhoSDgYODhIWFhYODhYSEhISEhIWEgoKCgoSEgYKDg4WGhYSCgYGCgoODhYSEhIWEhIaEg4SFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhIWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gX9/gIODg4ODgoJ/fX1/gICBf31+fn19fX17enp+hISEgoCBgIGBgoKBf36BgYGCgYOBgoGCgoKBg4OAf4CAgoOCgICAgICBgYGDgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn5+fX+Cg4OCg4KDgn19fn+AgIGAfn19fX1+fXx6enqAgoKBf39/f35/f4B+fYB/foCAgX+AgIF/f4CAgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gYODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgH9/f39+fn1+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B/f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXuAgH+Af39/fn5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/f4CAfn5/f39+f35/f35+fn19fX2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfn19fn5+f359fX19fXx8fHt6eXl5eH2BgICBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f4B/gYB+f3+Afn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoODhYOBg4ODhYSEhISEg4ODhIKCgoKCgX9+fX19fn6AfX19fX19fX19e3p5eXl5eYCCgoKEg4CCg4GAgoCCgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiYmIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYeCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKDg4KDhYSEhYOCg4OCg4OCgoKCg4KCgpKQi4iIh4mHhoaEhoWFhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoaHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko+MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GCgYOCgH59fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh9fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODg4KBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX19fH+BgX2Gj4F+fYJ+f36Agnx8gH+CgIKAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uUkIyLjo6MiIiHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7e3p8goCBfn+BfH5+f359gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJKNjY2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/goKCgoKEhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4N/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fX6AgIGAf39+fX19fX57fH1/f3+AfX9+f4yRjYyNjo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH18f4aEg4CAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fXx+f399fn9+f36Eko2NjI+Ni4qGhIaEhIODg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn6Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH58fn1+fHt8fHx7e3p9fn+AhIOCf35/fHx8fXx8gYN+jH58e3t9fn1+fn17e3t9fHt7e3uAhoSChIOBf4B+f4KCgn9/goJ/gIuQjIyMjYuKiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfX59fX17e319fHp8fH6AgoGAgIB9fH18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIKBgoGFhoWFhoaHhYGEkY+MioqLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f3+Af39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5/fnx9fXx8fHt+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiYqJhYiSjouIiYeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4ODfX5+fX18fX19fX19fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4qJjJGPjYqIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX5+fX59fX18fn18fXx9fX1+fX1+fnx7e3t8fH18e3p7e3l6eXl5e35/hIOEh4mKh4mOkI2LiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36DkYSEg4F/fn18jYd9fX59fXx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI+Oi4qGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+fn9/fX19fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjouMh4SFhYSDg4GCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4GAgICDgX+AgYSBfn6Af31+gH59fn6AgH+Bfn+Af39/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8fHx8e3t7fHt8fHx9fIqLiYiFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBgH1/f3+AgICAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x9iYeGhIWHhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6AgoB+f36Bf35+f4B9foB9fX1+gH9/gYCBgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHg4SEhYSEhIWDgYKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWDg4OEhIODhIOBgH+Af4CBfn19foB+fn5+gH19f3x9fX6Af4CAgIKAgIGAg4KAf4B+gIF+gIGAgH9+fn5+fX1/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goWAg4KCgoKCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4B/gIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x6fHp8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgIGAgIB/gIGAgIKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fH9+f4B8f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WEgoSEhYSEhIGDgoGDgX+AgX5/gH6AfX19foB+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgYOEgoGAgYB/gYCAgYGAgYGBg4KBgX+Ag4B+goOEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CAgICAgIKCgYCAfoCCf3+BgoOBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357fHt+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gICAf39/f3x/f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4CAgIB/gYKBgH9+f4F+f4CCgYCBg4KEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fH6AgIB/f39/fIB/f4GAgYCAf3yAf35+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKCf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB7gH6AgH+BgIB/fYF/fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF+gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fnx/gIGAf4CAgHyAf4B+f4GAf39+gX9+f39+fX18f4CAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd8eXd4d3d4e3t7e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhYWDhYKBg4OBgoGBgoCBgICBgH5/fn9/fXx+fYCBgoGAgIGBfX6Af35/gX+Af3+BgH6Af319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKBgYGCgYKBgYGAf4B/f399fX9+f4CBgYF/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoCCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgYCBgoF/gIKCgoKDgYGDgoCCgYB/f4CCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af35/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KCgYKDgICCgYSDg4SBgYOBgoOCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9/gICAgIB/f4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx7fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIOBhoODg4GChICEg4KCgICCgoSBgYKBg4J/gIB/gYOCgYCBgYCAf4GBgYGAg4B/gIOCf35/goGAgH9+gYCBf4CAgYCBgYCAgIKBgYKBgX+BgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9f3t5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKCgoOEgoOEg4CAg4OGg4ODgoKEgYSDgYOAgIKBhIGCgoGCgX6AgICCgYKBgYKCgIGAgICCgoGEgH6Bg4F/f4CDgoCBf4CCg4KAgYKBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgoCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKDhIaEgoODgoSChIOBg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIKEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIKBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgYSFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6fH2AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18fHh2f3Z3f4SHg4KDhoODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDg4SEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODg4WDhIOFf36CiouFhYSDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+BgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhYWCh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF5g39/f36EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf31+f31+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGBgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg3+Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gX+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd216c26Ah3ltfXJzdnN2bW53bHB5bHV9f398foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYeGhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIKBf4GBgH1/f4F+f35+f4GAfn6BgoCAgoSHhoODhoSEhIaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhYWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXp9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iEhoSFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4WGhYWEhIWHhoSEhYaFhX13hoOEhIOCgX1/fnt8e357fHx9f359fH9+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYeFhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhoWEhYWDhoaFhoWEhoeGhISFhoOFhIKEg4OFg4OBfYB/e3t8fnt8fH1/fnx8fn2Afn1/gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhYeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSGhYWFhYOGhoWGhYSGhoWEhIWFg4SHhYOCg4SDhIJ+gYB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoSBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDg4eDhIGChISDgoCAgHt7fn18fHx+fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYaGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDg4KCgn+Ae31/fXx8fH59fH19fH57fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHh4iGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f39+fHx9f318fX18fXt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWEhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWDhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBgoKBhIWCg36BgoF/g4F/fn5/fn98fH1/fXt9fXx9enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHioeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIeGhoeFhISDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCEg4OCfYGBf36DgX5/f4B8f3x9fX59e319fH15enp5e319enp7e318fXx8enp9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIaGhoaFhoKDg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgIGDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhYWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWFgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXyAfn18fHx/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBg4SEhIaGh4eHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhISFhIWDhYSAgIKDf35/f39/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t8fX19fYB9fXx8fYB/fXyGg4aGhoaFg4SDhoKFgYGAf3+AgH5/gYJ8fn9/foCAgoKChISDgoGChIGAg4KBgISFhIKBf4CCg4OEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SFhYWDhIODhIKEhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8enx8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYWDg4ODhIWFhIGDgYOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt5enp5enp6e3x5e317e35/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjtBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dXU1NTU1NTU1NTU1dXV1dXU1NXV1dXV1dXU1NTU1dXU0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8rKy8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19XV1dXV1dXV1dXV1dXV2Nvc3dzc3Nzd3Nvb29za09LT09PT09TU1NTU1NbW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLrR1NTU1NTU1NTU1NTU2K58gYKCgoKCgoGBgYGAj9LS0tLS0tLT09PS09PT3OPi4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk08Ojo3Nz5DPjg+Oj8/QT0/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uzr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6Knz9PS0tLS0tLS0tLS0tmRO0RERERERENDQ0RDP1zT09LS0tLS0tLS0tLS0eDs6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzR0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSjqM/T0tLS0tLS0tLS0tLZlEBISUlJSUlJSEhISENg0tPS0tLS0tLS0tLS0tHf6+rq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183N0NLS0tLS0tLS0dHR0dDc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqazP09LS0tLS0tLS0tLT2ZlNVFRUVFRUVFRUVFVRatLT0tLS0tLS0tLS0tLS3+np6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc7Ozs7Ozs7Ozc3Nzc3Nzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs7Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS1NXV1dXV1dXV1NTU1NXQy8vKysrKysvLysvMzMzT1NTV1dXV1dXW1dbW1tjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7O09TQzs7S1M/P0tTV1NDPz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dTU1NTU1dfX19fX19fX19fX2NjX1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/ODk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O0KaSxdHTuZ/Q0ZyChIrGz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0qqdrJTNs5eaurqVuLmvodLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+PDc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MmXmYWlr6Cip7LRkn1+r7DRzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQjk2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RpLC9l6HHhpq11dPNnp7D0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9DVuZik2qSZtdTTwKCg0M/Pz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/Q0Zqdt9iimbXU1K+iqdTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1aekoNLWopm11NSjobrU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQUNGREFCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0sCdosnU1aKattTOnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09SkoI+30NajmbbXw5+g0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09Ojo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocjGpr2Vkabaopq02bGkp9bS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDUyo6Tl5Cm2rGDxta5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZHS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tTCr7Cz0dPRw9TS0sLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89PkFFTExBPTc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR1NbW1tPS0tXT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPT43ODY5Njc4OTk7Oz0/QDw8ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4Nzc3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9P0BAPUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY4OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxCQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSEBFPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA8RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKWmpqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqWjo6KioqKhoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ6dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Njc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKimoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqampqenpp+bmpuioJqWlpWam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaOipaampaanpqagm5mboZ+Wk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop6cn6Cem5ORkJSXm52YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0BEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGeqbWTkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoaGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0JAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaakpKSjoqGgna2jlpOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fnp+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6OqqaOkoqGhnaONipuZmZiZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKKirK+hoaCenJqnc4KenJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoaChoaeipJ+enJmaoGF8n5ubmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgoJ+nlqWfnZuanpNZeaCbm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qam5uamJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2enp2dpI6bnpyamqSGWHShm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udnJqamaSPkJqbm5ykeV9vop2cnZydnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ybmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmZqjjo2VmZudoHhpaZyenJ2cnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycnJiYmZmYpY2Kj5abnZx4amWUn56enZ6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5yZmZmYlqWPhImSnZ2Ud2pkj6Cenp+fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJafjICCip6eiXRoYoufnp6foJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXnop5enmcnIRsYl6NoJybm56dnZ2doaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqWi5mThHd3mJ6HbWFdipeSkY2SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkZCPi5GPi4yPkJCRjo2Zm4lykJychHt0ZIONhYeBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4yGiouLiYeEgYaCgIGSnYh4WoeTlmxue3OBh32AgZKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKBfX9ymJR0ZE91i4xgXHFzg3t9fIaOjYuGjZSSi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4eIhYSIiImEf4J+faCHX0tJdIN8Wkpha3qEhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqRjH+IjY2Li4eSiY+eeElCRXR4bVU+TGRzi4uNiYmQj46PlJSYkJWcmp2eqK6yr7C1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZGeoZ2Tl5uhmp2cop+glGFTW0p0cmNXRkVTbH+QkY6LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqqpp6KlqKmrqqmvpIRWgo1UdHxsXFltVV93lp+foaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rq6ykoaKlqaenqaN0asC9UH+Th29fe2tWbpuhoainoKKirqurqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqaSoppqdpKaioaGbZYfGvWWpoZOXXnGDXWCXnJmioqCgn6ChqKCcnqGloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1cUFVPWE9eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkoKKhoqehpq6mppyfmV+Ntb6byqSTqXVor3JXjZubn56gn56eoKOdl5qYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfW1VZUVVXW2Nec19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qj86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaeprbGyr6ujo6RtgpWVqMadkqGERqyNWIahn52epaSloKSzpZWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbWppYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgo6qqp7jBvrm2t7OurK2vhH17bK27oJyagFeDgWeDqKGXnqWimZawvqCdoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4amJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCrsrfP3t7Yzcm8t7m6r4l4ZGqno5qWintoa3J2eoeLhYWEdm+NuKmjq6almKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh2bHBoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLK0tba7w9fg2M7Gvbq2rpp4alBjlISDhHpybWhobmtsbGtmX1p3srSqtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllUYWlgZnNvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8O5vb/E1M+5rqmknpSAZF9KXHxucHdvaWhiXV9eYWBeWlRut7KqtLywtbaor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXZubVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8XBxcnMxqGRjoh8aFdYSVNrZWZuaGJlYFlbWFpaWVVss7miprG2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8foR/aWZoYWtsZ252cXJ1cWdeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/Dw8bGwMKvlHRtZFpWV0VOZ2JhamRgZ2ZZWllYWFRms7yypqqpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx+dGtsbmRvbWlxeG55aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTExLm0x7qAWVNTV1VAT2ZkYWlkYGZpW1hXWFNiqbiztayupaSjqKSgn6WZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl5e3dua2lodVpmcnhzeWZmXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPEwsTCsnlRS05PPVFjYmVtZl9kaF5ZV1dkqruquLWzrKmjoa2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWZpamhdam9ueXhjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFycfIx8K9gk9NTUBNZ15na2pgYmFeXFlkpcG7ury6vKytpqq7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3ZoaWl0bXlsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfMyc7FyL98U05FR29gYWFsYlxdXltdm8fCxMfBvL60sbCwwb6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdga2p3bGlldW50Yl1iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMnJxcXDrn9UTUhqY1xfbl1UWllbksi3v7/AwLq7vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWdjamRiam1ub15ZXVZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPBwcDEwcO7hlRJWV5teYFQUFNWhsjDr729uLm7u763tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWNkY2pjZ2NbWlpcWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8G7v8C8u8S9usDEwbqLV0dOf5WSRUtafrjLvrDBv7q3u766tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFiY2hqZ2dqZmldVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB1o67vrvDtrnHt7W3ury6uZZuSnidkUBakLa8wb65xrzCv7zFuLa3tLi2tru7uba0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWZvaWVsaFhYTktLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+80MV4rMu9x7i5uK22s7a5s7a0tIZ8m4lWoL/Avr28v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d8a25wZ3Brc2ZibWBcVElLSkRKQ0NHPjo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNetdYK9yM/CwLiutbS6vbe4sb+/m5WBl83Dwr++vbzHzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcWZsaW50bnhjZ2JcY1FLVEhFRUNHQjw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCx8nRmHF1sNHRzMrEtbq/w8i+vrS/w698abXMxcK+wby/w8zKx8XGwLm+vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2NeYGFOSU0/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDCur68xL63vMC/yc/HyMrKwYVzdKjMzMvNysbCw8vOwby4vLq5dVi2yMbEwMC/xMDKysPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW14fGBxY1teX19UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7qt28K+tr7Avr66ppyqs7fEwKV5d3qexMbLyMHDwMDJysG/u7qwtnZWtcbFxcS/wMG/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem5zeHNocF1bXl1ZUkZEQ01JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8W0ba/Ovba5wLyqfW5obm10gpeYc3l+mr6/x8C5wLy+xcS9vbiyr65uVKnFxsPDvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdsdXtwbmlbX19ZU1BBRkhHS0BFQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNsHWCtL21tcGkhmlaXmBOU1tccHR4hKO4t8K6s7u3u72/uru7ra+sbFecxcPDw768v7u7uLXBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2ZdW1RKPT8/R0Y9R0NDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaWEeIyisLWcamZnVVlfSUlNUVRueYmosLe+ubK1sry5vLa5vrG0qG9fisHDx8PAvb+5s6+yvbquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NiXF5PSUI/PUlERk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8anh3t2jaKXYFNDWVVIYmpVT0VKZZCjrq+2urW0sqy8ubi1uMG6upx/bHq8wsfCv7m6ta6lrLOxprCtqJ6goKWttrXCt7a0pairqLC2s7K6tru7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393cHxvdnJuY11nWF1dU09NQT5KQkFKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/s5CBeYiPbk5KQGVZQlB4gJNoTENeg7G1s7WytK+su7q4trm/xLOfloJ6qLy7uLWysa2tn6Smp52kpZ2WmZman6muuayrq5+lqKSrrq+nsKyvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpbF1balRdXFBOSERGTEJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzuLWVjIiEe1hGQlGIWElKWXiOgmJBVaS5s7SysLGtsLm4tru3ur+tsbKqn6C5rqmrraujqKGdnZ6XmKGVkpaXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+QlJKSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J5aXV0bmRVYWNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K7qZiZlGhNQFR5cU9JSUtonX9aRVaxu7Gss6+urK22trK0ta6pop6bm52ep6eeoKipn6GnlpuXl4+dlI+Qlo6Xm6SooKCioqGlpZ2jo6CepaCkrKWmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moq6ufpqKbo5yVkIyPkJCTkJeVlpifnp6bmaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/emN3bG5dUWhUUE5HUE1MQlBRQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcGqpb1mRFOhhFBYSUtgSViNYWVlhK+1qrK0rqqrr7Cys62lnZGXk4+YoJ6ioJyjpJ+dqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6ionKehoKSfrKisrKCpq6agpKimrKOdnp6al5qrpqqxo6WonqCclZOQj5GRmZCWlZiXn5icmZukmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV2fW1re2RoVlJkTUpIR09STkpOSDxFQDwyQDg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoKvGv8ueTkF1nG9QbkpMY2Z2dWFdYnOSsq+us7WqpqyropuZlI2RlZaYmJyfoqKcnaSemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaWim5ier6iusqulqqqgm5iYmJWTlpqTlZWalpuXl5ihnpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eHxkeXlgYlNVYEhJSktTVElSUU05P0I2Nzw2NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZykx8aLVlJLZqNYZ31vcltSa2NcZ2JhbZG0sLC4rKahnJ2alJeamZCOkZWRjI6Nk5minJejmZqXmJmUmZiWnZufpaapoKaknqeurqumorGjmqSmpqqioaqiqaSosquxsqu6qKarp6urqaysp6Cgo7GusrG0qrKuo5mcnZ6hmZubmpiZm5SWm5aZnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dnZzaIJsZltTWlpNUUpPT1VMU01CNz5CNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6Kan6qjjHlVaXF3dW9kd3ZYV2JgZGlbWldora6sr6efnqKglpCTm6CbmZeSk5+coaObnpuWn5qfl5uinqWhnqSfpKitraisqaSstLe2sKe0rKKtraOvpaSmoamorrWzsr23v7Cssa6tqaq0sbCoq6iytrizuK2ytKSgnaWfrKGhoqGgmpiWlp+bm5iloaCeo6GgnpucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1and1Xm1bUmBIUlVIRlVWSkNNRz1LSDhGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoKN/b4JwYGNXTFtTWkxMUVlSSE9OSJmsqqmkn5+ZkpGTmJiWlpWMiIuOlZ2cnZ2el56Zp6CgqKWxqqeuo6uutrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcK8t76zs7WirKKpqLKpqqinqJqZnpqqp6CZp6Cfn6eopaSfnaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZybWl2bWhtXFhcQ1dOSkdNR0NGTTw+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqco56ciWJXXmVgV01RRz0/QENEPz5DUnipramqpZ+enqKjnZ6dmpyblJOVlJ2dmJSFnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGxL3DvLezqrOtqrO1r7Ouqq+jnayotrGto7CmoKOvsa6wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeGgXt0cmtrdHJxaFZcUUZUSURKUEk/RUE0Rkg5NTw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmqCflXxfXmVgUEZFO0I+Rjw+OTZOfqqzp6OjoqCepaulnpeclJGZnZiUjIqGiIZ4bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvsfGwrfEysnDwca+urW6u7W7t7C2sqq6sq67t7+7uqu4rauquLu1vK6uuaOmo56mpaKjqaaZm5+Zmp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtjaG94a2VaW0ZLTEVEVE1EQ0U3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pj1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1yaWFXTkU+SVp8b2FBPVyOrqygmZubnp6Zl5eXkoyOlpaTjo2Qi4KDgndycW1wj6atrrS5xbvNx8u/wszNzczHydHMzczHycXFzNDS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysLFxsbKyM6/yNHMx8XHxcK8w8G/v7+2vrOuv8DDw8fEx8Suv7iyuLzEwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxERlBJRENANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT88QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnpVpZlxUSURAP0qGnqSYg6CyraOenJ+amJeUkpSWkZCPjIeDg4iHg4CBgYB5cXJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1dfR183Gx8nMw8XKz8rT19LX0tXW09TIzMbMzcnSzc7TzcXIysrBx8zHycjGv8Ozs8jEy8vLz8fKv76/vcHHxc3MycnAw8Cur7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE5GQEpRQj5CPDoyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEE/Pjk6QEE6OT45Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGbYVNMSkRDP0NUsdG9sq+mnJycoKShnZqUk5WUiX14cGtlYmhxb3F7hYqAdXBucXRwhbPDvsXR0NfW1tLWztTW19TT0dPU1NPP0cPQ09bY1dbSy8nO0cvGzdLK0tXW2dbX09bYztLKz9HMz9DM09C/yMfKxMzMzM7PxcbHtr/Kv9LNzNDGycjAxMPIzs3Q0c/NysjNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZHJiXVJcSUpHQUVJSj47QTg9NTU4Njs4NTo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaCioVlJQEFEQUZRdrKvp5qUl5+cmqCgnpucmZWJd2ljYV9fYF9eX19dYmx1dHBwb2xycXWSxMjG1NbX19fT1tDV1NrU1M7P1dTU0dHM0M3T19bT1dDP0tPRydPRyNDX19jR19LY2dTWzM/Pys3Sy87QwMbCyMbOztHR0sjLzcDKzMbTz8zOyMXKx8fIzMrU1NHVz9LM08K5xbGlqLWup5uorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk0/PD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fY1NXZ2dHO0L+8zMm2vq6mqqiho6tlQzg9PkRYgqqon5eVl5manJ+dmJyckn1wZWNiX19hX19hYV9gYF9gZm5wcG5rb3J3d5zMwdLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dXNz9XV0cXR1MrQ1NXWztLQ2NjY18vIzsTJz8zKzMDJwMjKzc7Qy9DNzsvOz8jL0NDLzsrCycfJzMvM0tPN09LR0NDKvci5sK67ubWrtrCtqLits767sZqPoJSRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVhFO0A9MzM8PDg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taylrK6+tLDA2NLX2tzWzs3Kw9LPwcGxqaytqaSxeUhGQjtXjqGblZOWm56enpyTlpeUiGteXl5hZGJgYGBgYGBhXl9fXlxibXJvb3N0dnZ5pL/M1dHW1NPY1s7O08vOzsXOytLSz8fOzc3UzM7TzcvX1tDM0dTLzNDS08rO0dXS1dXKwMrCxc3CyMnDzMPFyMrLz8rNzdDO08zGyc/NyMfLxcfBxsrMzdDRx9DPzs3M0MXHwbi5vcPCvcO5srK+sbvDw7WqmKWhmJaSlZWSi5SNmpGUlI+PlYKJhnlxcmttZ2BgcWhZWGhWTUdMSVBRQjtDPjs2ODk4Ojo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/Ozw7PD04O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCta+0qJ+tl3hscHJ7kZqNjJeVkJORkZWWlZCLfGVhYmJgXV5hY2JgX19gYWFgX11bXWdycXFyc3Btcnmlx9PPy9DQ09TKxcnJxse/w8XPzsfFx83K0sjLzs7G0dLQzczUysfLzs/Hx8/Sy9DPxrrEv8bKvcLHyc7EwsfAx83IxMzKzM/IxMTQyMbCxsjFv8HHzMzMz8LLzMnHy9DExce7x8PJycLPwb28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J4b3Rka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL69uc3MxtDV1dna29jQyc/P0dPIwre7u62jtn1og4Wkq5SOjZaPhYODg4F9hIR+c19bXl5eYF5gY2RjX1xdXl9gYF9bWlxga3Jyb29rbG9vfbnRyMnKz8vNxLrAw7u7u7q+ycbCw8DDyMrJyMrIwcXMxsjLzcnEwsrJwcHL0MXLyL+5wrvGx76/xs/Lw7/Du8nHybvIx8XKwL7Cy8bFxL7GvbzAw8XMxcW8wMrDxcfSxcHJv8rJxsjG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Gmm6Ogm5V8d3N0ZmlaYW5tWltYUkRMRkJHRExERlNANTQzMzU/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76yr7ZsXnl9opGLkpaGeoCFhX92eHVycF9aW11gYGJjZGRlZGBbXF1dX15gW1laXGJvcm9raWxwb3OPx73KxcvAxsKwtrqysrOyscK8vLy6uMHBwcS+vbm9v7nEysXGwr3GwLi7w8m/wcm7t7u6xsO/vMHNw8a+vrXBvcO7vca8w7q0vMbEwsO3wLa2vr+7zMO8trrIur++y8PBxsLFycfJxtDGwszIssfJw87MwcXDv72yt7Cyp6ioubClrbCqrayUenZ3amRnYGhvZFZeWUpGSkVHS0FFQkZKQDk6NjQ4ODU0Ozo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTW183KzsXJxcfBucW9rK6lX2R1hJOLiIuEeH+Ghn9+hHt0dGNcXF1eYGBiY2JhZGViXVxbXF5cXl1aW1xeaHNxbWdnbm9yeZ29zMDDusC4rbCxp6qtrKe4tLa0s7O0u7W+sbawta+yvMK8wcS8wLu1srq+wLjIubS7t8HCvbe8xsHDvLWusrW6v7TFt7u1q7i9vsC9sbu2sLa6s8W8t6+7v7W3tMW8vsLFwMPFxsfLxcDGxrvHy8DPycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMrIysnKxNDN0s/NxcfBxsC/urjJtqqwmFtob4qPhYiJenh+hoZ2d4F8c2hdXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5oZmtubnJ8pMfAuLi1sKutp56iqaeeqqyzraqsqbSut7Gzqa6mrLO8urbDubq6sau1ubu0wrqwwLG+vLu2vMe5wretqqiwssC2uL2wsaixs7W7vKyutaautq67srGqubCtu667uLvAwL65w7/Gw8XBvMbCyMu4xcfFv8fDw7rExsK7xsnMy7O5w727s4lzd3ZraWFibGhZV1dbQUxLTUpFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5PTk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxc/HzcHDxr/ExMPDysLJyr/AvMK6s7W1w66qsJFban+Sh46Pe3h9iYV6e4SAd25eXVxcXV9gX19kY2FkY2JgX11aW1paXVpaWlpcZW5vaGZnaWtucoGturC1rqWkp6eaoKSgmpylq62kqKKrqqyrsKOmn6qttbaxvbmvt7Corri0tLy4tL2vuLm1srzAssCvpaijq7Gys6i9qquoq6yttbSmqK6hpK+psqaoqK6mqLetsbK3urq7sry+vr7Ev7XCwcfIt76/xbfEw7+7v8TCvsTIzMq/v8TAwKmHc3RzamldYW9kV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcq+u8m2vcO+usq3wcPBtLa8trGvtbutqKuSZG2Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBgX11dXFpYWVtbWVhaXF9ma2ZkZ2Voam9yhaqlrKWenKGklJ2km5eRoaOpo6Ofpaanpq2gnZykpqyysLa3p7GtqKq1q7S5sba2rra5srC6urG3paCkn6axqKuouaqkpqeop7KtoKemn5ukpqyen6ejoKGxra2ssrSztLC1vba7wcCyur7DwbG5ucKzwb7Atbi8vb68wsfEw8S/wMSgg3hwbGJmYGtvYFVZXkhOZ09UR0ZLRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTs6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItbW9uLrAur22oJ6UnaGmurars7O7s8TPycvCxri2x8DMv7jJt7vFuLPEuLO/wKy2vLKspa+zraGjkWlyhoWGgHx4dXNvbWpqaXBpXmBdXFxcXl9fYWNiYGBgYV1cW1xcWFlYWFhWWFteX2RjYmVnZ2drbW+HnamflZWaoZabo5iVjZ6hoqecoJ+kpaKnnpujm6CrsK2xtaSpqqqsrKS0uK23sKyztq+zta+wqp+en6OisqWmqbitoqamoKisq5mgn56ZnZ+lmpmjm5yesKmrp6urrK2wsrivuLm6sLa8u7qrs7K5s760trKxtrW/tr7AvcPCu7q9l4R6c2tfZV5kZFhUV11JV1xLUEdKSkdBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8PDz766x7i4v7eywrSxu7usurqxop6pq6eYnpBtfoWGf3hybW9ta2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrcYyonJOUlJqXmqGWlpCboqGonpydpaeipZygoZuZr66ur7KhpaOuq6eitbCysqypr7OnurOmtqCinpyjoa2joqq2q6Ojpp6lpqOWmZ2XmZudoJqXnZydnK2iq6eko6atq7KzqrWwsquyubSvqq+ysrO4s66prK6yuLC6trq9wLizsZSFeXVmX2ZeW1lWU1pVS1tRS0lFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7KdpaOYpbHCtba9rbS4wszIxr/FtsHAx863wMS9s7m5s7+2sbm7rbK0r5+apKqglJqPeH+DhH94b3F0cWhlZGhkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oZuTk4+Ulpafl5mUl6CeoZyWoKGppJ+fqZ2bm6unr7Crm6OkuKqhoK6otqqnp62xpLiwpLegopuZmaqnoZqsua+ioaScop+gk5ShlJaWm5iXlpeclZ+qnqmkop2jqqqwrai0rKqnrbOwpauus7GwsK6vp6iosq2xtLC8tLq4rqOUgXp2ZV9hVllYU1JTS01eTE9LR0dMTEU9QT48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunaenoqq7wL3Aua60uMHMx8XCw73FuMjMssHCwa28u7W7vLW5ubCvsKqcmaGplJGKi4CAfHdxaWxydHBoaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiY2RmaYGVkpSLkZOUmpiclZacoJyflqCfp6akpqefnaCmoKqvpp+io7eooaGiqLOipailsKWxrqy1nqGdlZWpoaKUrbGxn6OjnZ6Ym5OLoZSRk5iYk5eXmZeep5ynoaKapKWlq6SlsKelo6urraaprq+vq6iqqrOmpqyvtLGuvLWxr6+gknp3c2VhXFtdWE5MUUdRYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6lpqy4u7zBxbqxubXEycnAw8bFx7bFxLPCv8Wrt7e9tr26urWyq62omZifo4uJdImIfnZuY2FmaWhmZ2lmam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdVVFZVUlRSVWBgX2BhX2FhYmVpgJKSiJCOk5KTnJSVlqOZoJedoKWiraalpaOko5yqq6Wan6WxqqChnqWqnqiin66sqamuraKiopWXopuckKupsJyfop+el5mTip6RjZKTlpCYmJOcoaOdpKGilaChpKWbo6uloqSqo6uupa6yqaalpqa0pqmorbO1tLm6sKqsnoxycHBgW1dWVlJGUU5IWVtPUklUS1NMRUZJRDg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjY5ODo4ODY1OTo7PDk3Pzw5NTc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCrsq2dqKevubmzwMm6tcCvxcjMusHKzMi1ybyxvsPIrLG4wbW8wLu0tKqsppWam5uIgXKIg3t0aWlpbGdqbG1ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFVWVVRVVVJSTlFZXVxdXV5fX19iZG2NjoOQho+QjpmTlJKcmqOcm6GoqauorKeppqSZpa+llZmlr6mgnJmboJ6vmZyrs6Clpp+jpKGUk5uWlpKpqq2anaChoJuUkIyZjoyRjJKNlpWQnqKhpJ2bo5WboKOhl6Koo6Ooq6CrsKStt6ajpKKsraqoq6+zt7O+tbOrr5iFdHNoW1hZU1VSRVhMUVtYTVROUExRUklOSUI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj01ODo7ODk3Njk4OTo2Oj05OTU3NzU3MDE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraezt66pqK+um6morLe2rLzKu7a/rMvGxbjBzs/Is8S6t7vCyLCtuL+3vL27s7WmqaCWl5iWh3p0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXVxeX2FkfYuAin6Kj4mSjZeRl5mioJugq6qmr6yosKWpmp+toJWWpamnnZiQj5qerpeYqKqZn52UpaGfkpGSkZOVqKulmpmZnp6WjYyLk4aIjYOPi5KVkaCeoaSYlZ+VmqGinpSbpaaoqKigsbCmsb2on6OstKqup7C1sLm1wLGusauRfnJzYlZUVk5SSkdWUFNRTExXTUpNT1JHTUtBQ0ZEQz5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY3NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ylsbeqpqOxq52qp6mysaS2xrS5urPKxbm6wcvQyrG2t7y9wcOxr7G3rbS0u7O0oqOdnZeXlIOAdmtnbG5xbnFqcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXF1dYWp/eX90iIyGkImXiZSTmJuYnqmboKumpqyeqJqgppyTj5+jmpeXhYSSm6OQlaOdlpaWiKKbm5OLjoqQmqSnnJWVl5uRkoeUjouBi46AkIuSkpKgmqGilpSYmJWippmNmaSmqaahoLSyp7K3oZyitqypraSysqa1vLWrrLGjiXlzbl1OUVFMT0NNTk5QS0ZOTkpKTk5RSE1KQUdLSEhDPjg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLawpaekqqWgqKals6qissO1tbKzxsa2usPKzMazrLm9tLjAr62psJ6mrrqvrp+Zmp2VlId7g25fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYW11hbnJ1b4OHgYiAkYSOipSRk56hj5uco6KkmaWXopyVjYeZmoxzjYN+jpeWhpGakJSOjnuZj52Mgol/ipigo56Qk5iWhY2ClH5+c4mOepCHk5CQnZuampGWkJ2Oo6OOiZqgoaSkm6K0r6yvrZ+YpbimprGhsK6csLyqqa+qmYN3c2NWTVJPUE5DU05MUExCUFFISU5STUhKSkRKTEZKSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0wMjc2NDc4OTo6NjU6ODdBN3i3oaO0qaamqKOmpaamprOnpbTBuLC0sMnEt7nBzsa9s6y6waytw62noqaSnaa2rKOgj5WWkpB9d35mV1ZfZ2ZpZ2huY2poZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVVllbXWlrcWt+hHtzTlhyj4KXho2cl4uUkZ+YnZWUlpWPlomAlIlfO1ZvfIyUiYCMkoyQhoZzioWXgXmBe4aTnZSDlY6RkIOGfZN4cXCFjH2JgZGNkJeamJOLkImdiJ+Yh4iWnpqioJenrqmtqKiel62zoqaumayrmKi0oqmto5N/c25fW05TUldMRFRKUExMRk5PSUVMUU1LT0pJTFBGSUk9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjrqGmpqqgp6mno6mwqKe0wrmwtbDHwrezvc+/ua+utcKnqsWqo52Yg5ScsaKamIaUj4uHfXN1XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbG5oeoF0T0I/f5WSkX2IlI2Eio2bjpaViZKIhpWGeYl/YEpRbniLkoR9hI2KhX9/bn9/lHh1dniEjZpwUY2IioZ7fniUdmd3hoh+iomWi46RkpaMhImIlYSbjYKEkpqWn52UpKOoqaWknpuwqqGkpJGmqpaiqpyipqiJdm1mXltIUVFTTUlVTVJJTEtPSUhGSk5MTVRLUVBPRklDPDc2ODo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs3Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykqKiw0ODMzOTg5Ojk5Ojo6Oj85d7aco6edn6Gvoqeopaeor62qtby2t7ezwbu2qLrIuLaoqLW2qrK9p56VjX+Jk6iWlYp+joOCfXdwb1hNS01NTkxNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DcnV+aWhcVI+JlIl0f4aBfIWMk4KSmouPe4aPgHaAeHNvdnF0jo6Ben6Kq4R5e2h2e45wcm14gYuNknh6gHuAdnNykndodYSEhIV8lYqIio2KgH+Ei42AlIR8gI+YlJyWkZ+dqZ6foJ2gqaWenZiMp6SSoKCWnp+kgHNoYV1dSldQUkdLWFJPSkxNUkpKSkxQSExRTFJUTUVIQTw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MjQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJ2ftKmvqaWtrLCxqr20sru4trq0sZ+3urKqnZ2sqaiysKGakY2UgY6cjpF/doZ4fHZvb2lYS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedIJ7eGZ2jZaYjY59Z3mBdniAiZB9hJiSgXGHj3x3e29rfq19dJCLf3uGkoF8f3VmdnyFbG9nc3yJjIeAbHlxfXFtdo9xaHGBfo5wQ4uFgoOFf3d3eoyGfYx7dX2Oko+Yi5Kam6OWmZ2anZ6hnJaNiqSbjp6XjpaYkHdvbWZiWlhYVVFKU1VUT1BOUFZLTktPT0pRT0hOUExGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpahprCtrquoqbGvsau8uKy7vrizrKebsKesm4+WnKWppKCXmY+FknmIjouKdXF7bXVwam1qWEtGR0VBQENESExMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF1lcHJsiKeqwH50eWJ7eG98eYmQen2Lhm9tjJJ5dHlqaoCCcZaRi4F+loBJkphuaHh+gm1pZGx5hZCShmtzbHxucnyGaW5wf3OMiYSGe35/e3ZvdHSGgnmBeXB8joyKk4OWl5iakJKWl5mXnZaMg4mekYuSjYaQloBuaW9vb1hWWFRSUVlPUlRUUlhVTU5ITkpNTktDSE1HRUA6ODk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WtsKKtqqi1r66stL+rvMO/paKalaSXno2Ei5ShoZmYkZOLc456gIaMhnRvdGtwbGRsallOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcX6eIYpppc3llfnBtf3qLiXaCiIZ0bJqSdHN8amqdj015hZOJhI5nMXaGc2x+foN0ZmV1f4SEhYBmaWx1a3F/fGhxcXxuko2PfHR+fXFwbnVtgn93eXVqeYmCiImDlpKSkIuNkZSUjpeNgHmIl4iGioaAkIh3a2tvaGVYUVpXWVlbTVBVVllYTklIRUpKSEdCQEdEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS8qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW6SiJqRmZakqK6fsp6nuq+rsrDCsbvDx5qWj5SZi46GeYSQmJSNkIyPhnGHgnSHjIZ5cHJwb29kcGZfVEZJQz88Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7OgcXt4bH1scYOChYF6hIaGeXKhlXR4gHN1lIc1cZ2onY6hoYSihXZxh3yHfHSMro6JgGhnYmpucm1wg3VpcFh1cI6bkndsf3t9bXJucIB7c3ZuYnaDf4aAhZCQioqJkYuRjIuOg3V4io6AfoOAfY97cnBwbGBbXV5cWVhgX1JOW1pYV0xISkZJRz9CQUJIP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnqWnn6+VpbSprrGuwbK7wcaWkIyUj4CIfW6BkJKJg4qHj4Z1goRslYiIe3R4eGx3bndjaV5KUEc+QDc0NDk7Ozs9PkBCRUhMTExMTlBRUlRVVldYWlhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHeIiHx+hYN/jH51opl5foaBhZmEmpxhhqqfnYuDkI56d4l+iYiOc4uXkIR6XWRydHp8d4ptaGpieW+GkIJ6b4F3dIR6cHR5eGtuaV12h32HfIeHjn+KkpeDjYWMhn1xhH+DfXV3e3yJd3BzdGZnYFtbXlRcZl5XUFRYW1VHSktES0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJGdnZ+mkaCqoLGor8CxusW6lo6RlId6hXZrf4yRgn2KhI+MeIOAc6CEin18gX9wgH56Z3ZrUldMQEUyMTEzNjc2ODg6PD5BRUdGR0pLTU9RUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaISJe4l5fHF8j4x6fYmHfpeHdqGZiIePkpSljayqSIaur6+LgYCTioKLgoSSqYeAmJiKm3RtfYGGh32OaGdoeX9uhoeChXGEhkdsgHdyeXZobWtfdn2DiH+IhIt5lJ2ciYuIkX96dYt2fHhtb3d9f3R0cmxbXl1bY2NYZ2VcVVBQVllQRExLRk5JQ0ZDQ0BAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKysvMDArbnUyMjQyMEyBXDU9PF6EdHx+iYWIkY6Wl5KXoJ2soaa4r7O9s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0+P0JFR0hKTU5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/OTQuXZZwc6NVRklLTU5QV2BYcFlcXmmNk4eVgISChZGTfoWIkYGalYKhoZiVm5umrZOau7Gnu8fDqIuMoaWPlImBkXxxg56fkZx/doWFi5CIkGlob4OAdY2HhItxhoJ3h397doV9bnZ1ZoCUjoaJiIeIh6CropaJjph/eoKJenlvZ2t4fnp/c2xlXlpbXWpdYWZgWU9LTldSUUlQSkROR0NKREJBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmeIN7gIx/gZCOipqbpJ2hrKarr7GXkZGEoZSEeHd/jJR8fpKFkpV/ioCSm46DgIGMioKJjYN/iX9tcGpdQkA0LS0vLy4vMDIyMzQ3Nzg7PT9CREhKTlFSU1JTU1RSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhKS0tLTlZfY39nZ211nZuPmpKTi42OmoiSj52LoKCSo6qlo6yTqbaiqMHDrseveLqUmnyNoZ6ZhJOFgo+in5OYkoSLhY+akZZscHWJi4KWjI2Pd4+EcW2FgYqWkYOFiHKIoJWGkomOj5aktambjZWig4eTg36Aa2prfICBgnRiXmRfW2drXWxrXldLR09SUU5MTEZJUENETUZBQ0VGQj06OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCCcHWGcXaShn6XlpqVnp6cp6CqlpOYnmdlpJp+hJKReX+SiJGSfYqEmJKRgoCAi4yJhpCGhIiFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5QUlRQUFFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdnKelopmhl6KUnJ6nnqirn6isqaq2l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqbmaeRkYmWopqad3p+lJiSoZKWmIGUnnt3lZKrsoiNl599lJ2bjpKVmKOiprawnZGZqIiWj42BiWxzcnx/fXJpYF1hX2FnZGBnZltSRUpLUE9JSUxGRk1DSExGR0RCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdWBufWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImLioSShYOGiYGAhnZeYlA0NjAtMS8sLjAwLy8uLjAwMTU+QUJNUVJTUVJTVFJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk5PUVlthZB3lYqjp6q0vbikrqysp6i0q7C2srKtu7GzvZyzw6y7ycu3w7+4paOwsqytqqOLlpiFpqago5eBppmNoquopIiFlKShoKqgpKmPnLGLlaOnt7qboKOwkqKdop6Qo6Grr6yytaKUpKqImYmSipZ6en2Ff2hhaFxlYl1kY15mZ19aT0RJSFNORkhMRkpHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXam9YeoV2gZOFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkI6DhYGMhYaHkoaChImGiIeHcG5hQEU2NDwyLzExMC0sKy0xLi0zP0RBTVVRUlNVVVZVTltQR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZKghK6js6qywMfDqrPFtqyzv7O4vra/tMG2u7qjuMWotsnHtb65tKijtK2xsZuakpqfiaevq6WUdp+kl6GssrOYlqqtqK62u7K6rK+1orGssbW7t7WutaCnp6OnmqmvrbK5t7inm7apjKWOkZOghniCg3ZaYmVXZmFhY19gZmBbVElERExVUUhJSkRJR0VBQEBLREJNRzw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtaUWJjV3l1cYGUfYSGknWFf4GMe7+7o7yCtJSTjZuPhIiPkomIeYaAjJKMh4WBjn+BiY6Gf4aJhYqHkXp4bl1WQEVOPDY6NDZBQjc2NC8vNkNIQ1FcT1FVV1VcVk9eVUlLSkFAPkdLRkVEOz5AN0Q3P0JKSkVGV1RQXo+kraOxtMK2uMHMyba7xL2zs8C3uMG1vq+3dLGzpbrFpLDGubGzsbSopLW2qrGgopaaopKlsK2mraynpJigrLS6oqmyurW7vsy/xcW9vbPCt7q4vre6t7msrLCmsaqtvbC8usLCrJm6qJSuj5eYq4l+gn1rV2RiWWtlamVXW2NZVlNJR0ZMUUdDSElBSEQ+P0JCS0BATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1NZVVp2anB+joSBjYNuenN4h2K5oZmjiZWUlpOUk42QlpKHhnuGgY2VioGEgYp6fIuHhn2Kg4GKg5V9d3l1ZU9cZEdFTDtRY2FbXlNGPztIUEVbY1FSWVhaZ1lUYGBNU1BFQT9JSkhFRkFAQzxFNkI+SEdLTFNaVF6Tr7i1urjJv7q9ycy7vMC8t7W7u7e9tLqxxmB1sqWxmp6rvaqlqKuqo6KytaGrqJ6Vlp+Zn66lp6aln6SUoqextKeys722wb7TycnTx8LFzMLKw8C+vb+7vLe0r7i3tsO5xb3DyLCeuaqhq46kp7aJgYBzYGJiXlhiYGlmUlhgVlJVSUVFTktBPkdEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhY9zbHJyc4fVwLWZoI2VmZmRjpeSlpaOhod9hoOMlot/g3+CeHuLg4d8i3mBioKXf3N9emtlcHVZXVxQZWViYGVkXVtYV1xNZW1VUm1tX25fWGdlVVlVSkRCS0pIRkhISEdCSTlEP0hLVFRWXFpbk7nAuL23xsC7ucrKura6tri5sre1tK62tplkdaidrXBeoqycmKCjm6SeqqWUoJ+QlI6WmJeon6WfnpqZg6SdrKWqsK23sL251NHO19DJzNLMz87Kx8C/wsq9wbzBwMTExcq/yM6zpLuwtK+bq7i8mYB6bF5hXVleYVpjY1FcYFNQS0NBRUZFPEBFPkFIQUBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRXFloX2+XkpCUbmxvdXWHs6yhoJ+LmZyZjI2VkZuShYqKfoiHi5CLiHyBhHN7ioOFe4l0gYmGlX9ze3hrbXV7aHJlaWxpZmppaGBmaWhsWm50lq2kvIiHZ1tvaF1aWlRIS05PSktQS1NRSExBSkZLUF9eYmZqYpi3x7C4s7u9tbHExrWwubCwu6uysaeqt6yNtaedm6eaT5qdjI6flpGmmKWVipOTiZCJj5GRnpuhl5qVloaemqebrK+osKi0tNTU1NbSy9DU1c3Tz83FwsnQvsrJysnRx8zNw9DSuLDDvMS5pba6w6KDcGRdXV5ZYFhZZlpRXVdPUEJCR0RCSDtBQz5BRz8/QTg7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVZzkJCYgmhxb3l5g6CqnqWWjJubl4uNlZGajn2Ji4WNioqKkId8hIJwf4iBhnuHcoORi499cXh1a3F4fnF7bnhzbGmBcG1jaW1weGl3fH7Lv8Lfp25jd29jW2FgSlBSVU5ZXlBdXE5QTlRRVVRbbm12gnGWrbiss6ewtqqsvMCwq7WmpLimq66gq7SjjrGtmpiYjJGTkYSOm4GNppGciYOLhIqJhIuDk5WXlpOckZyYmZmfnquspKeirK3P0tXRzczS09PQ1NHOyMPU0cfN0tPT183R0cXS1sXAzsfHw6i+t8+eem9mXmNeV2BTXVpQUVVQTkg+QEZBQkU8QEI/RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU5bdYaFindsd3B9fn+hnp6hi4yZk5OMi5OPloR5hZCQjYuKiJGHf4J7cn6AgYd5hHWFkpGJf292cmtzfHx3e3OBd3FrgHNyaXBxenlyer7Lmn6MsoR2coR3aGFqXUNaWltWZWNYZGpTWF1cYGReY3d6fouBmamkpKGfoKilqrC4qqW0o6GtoaOtoaexn4mmmpOSkYmRj4iBlIlqlaKMmYSAhX2Rg4OTlq2LlY2Vmo6GkpGel6ewoaChpaSoyM7PyMLL0dTR1NPO083G1tPM1NjW1tjV19XJ1NrNydfX0cqsw8PMjHNwY2FgWFRaVFxQS0dKSkpAOzo7REFEPEJDPkhCPkJCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnZWdlIWLlomPioiOh49/d4OUmIqNiIiLiX6CeHN7fYOId396h5GWgINueHBtdX92eH10hXx5bYd2dG59doR1eHydtYw7QYvFpX6MfGllVklDZmNlY2dqZG54W19maGtuaW6Ag4iRi52eoJ2Ql5ifo6SmsqOks6ChpZ2gqaCisZyGnpKSkpCLj4uGg4+EfpybjI2DhIV6lH6CqZWjjJKKl5KLfZeKm5Krs5ianKicp73Dxrm2xs3S0NLQzNLLydTO0dXa19fY1NnYzdjbzsna2tLVvsvMtHl3b2VeWlNWUltXRkdKSUVFPTo3OkBBQjpHREBFQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfJeRnYt+h5KDiYaFiYKHfHiFl5eJj4OHhYd6hHlxenuEhnV6hY6NnHqMcHxvb3p/cXyBcYOHgG6OenV3fXyCdX97hoewdFipwraNkYJwbmI9XmhycHFwbnh2gWVpb3J1eHF6i4eOk5GblaCVh4yTm6Cbn6qfoK2coZqZn6Wen6uZi5qMkJGNhH2Ih4OFi46gmZOIhId+bZl5hJiGiJOMjZSMhnubiJSPrqqUlZefmaeutb2prb3Gy8jJzMvPycPRytTX2dfY19Xb19PZ29bP29rR1snUy5V6fGppXFtQU1ReSENFSUg+QT09Nzo9Pzs9Rz0/QUFBREE+Pjo4NkRCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw6OkQ/Q0dSa19tZGJma3aAiHGRkJqAeoCNfoKCgYR/hHx8hJiOh4t+hoaAd4J5b3t7hoF1epKejaB2jnWCdHWBfXSAhG+Bj4FvkoR0fICFenaGe4m3xqXCybiClpuPd3BlTmZjgXqBd4aikIp4eXZ7g397hHVtk5aUlY+XkIOJj5eal5alnJegl5+SkpejnZmrlZCRio2RgoyFiYiBhpCRnpyZiYaMgYaYeoiIn5ePiI2KjIJ8oYmQi7yhmJOXmpyppqWun6i2v8DAucfJzc7FzcrR1tXV2dXX29TW2drb19va2tjO3MaHfHpoaWVgVFhWVU1MRE5DOz09PDk6PD45PUA2PT9APD8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6int+gH6AfIV7foGRiYWFeoSHe3V9dG18fYZ+c36SnZGeg5F8hn54jn15iopugpqAdJiFfYGIhXt9kHqPqY6Pw6C8jJyknH2JhH2JcoyKfnOmmpyYk4V7j5CIhGhHcKCknYyLkJKFiYuQkpWPnJqSlJGWjYuVn52UoJSRjo2Qi36Qjo6LhImSlpqfn4mMlJKdkYKLf6WZiISNg4WEgaWHi4u4mJ2RlJaip6Gdnp2jr7a6tazAxcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u4eXl5bWpmV2BcVFBPSENMQj09Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3RD84Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYGOinFyeYp7en98f3uIenx7i4eCfnWDhXlzenNtgH6EfXeFm6GanZSSgIyIf5iHgJuSboeohXqgi3yRjoKIg5x9mpGKjKOin5Ckr6CLkYuFi4GShldyrYufq5uPg5ibj4+OW4KikYKMn5OVjIeIjJKSjJSUlI+Mj4qHlpudj5WWkYuSk4WAi4iSjYqKnZaZoqKGk52WoIqJiI2ckIOIj3+Dh4WkhoyQs5idkpSXoaGemZKcnaeyuKymvcLHzsfGz8zQzM7X0NHUrtbV2NrY2trX1tnZn3F+dWhnXl1YVFdYQ0BIQz4+Pjo0OTo7Nzo7OjM7Oz88Pjc7OToxOkg+OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J5bWJ+koNvbXeLeHl/eoF9hnt7d4aEf3NwhYJ6dXZ2dISDhX1/kqajn6WiloqdkJSXi4qol3KKsYyEp5GEmZOFmYyilqCYk4mbnqKSqa+gkZWQjY6IlYtujbeFmsTIspuhpZucmJaQspBkpM3Hlo+Gh4mPko6Nk5SJhYqJhZaam4+QlJOGlJeDf4+LmYiNkKqXl6OjiJmfl5uIj4eXl4qEjoyBf4ePpYmNk6mal5OWmaGZn5mTnZuis7Slo7zBvsjFxcnIycLK083N1KnS0dbW1tja1NPazoN0gWlkX15eTktUWkJBR0M7QT04Mzc7PDo4PjY0OTo8OjgyPzk6MjpJOj02N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ1go58fGx9iHh6fnqBgYJ+dnaAg3xsb4t/eXx4eHyEh4t9iqOzqKOrs6GWp6ClpJaVrqKDkLeVkrOZjaGgjKSbr6KknZiQp5aoma2vpJeVlpSQi5iZlqDAjqPJuKuboqatmZGanLKdhoWoopyYhYiJjpWNi5OOiIGGh4iSmJSMi5OThpSYhoORkJx0kZmylpekoYicmpSPipCLl5qJipaOhn2MmJ+KkJCcmpmTmJiflKCdlZ+bobGuo6S3vrTFx8S9w8O/xs7KydKnzs3T0tDW2NLP2Ltze3deYVZhV1FJSU9FQUJFNT46NzY6Pzs8Nz00MjY2OTc3ND01PDU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER05bXFlKZ2A7SISLenpthYZ6fIR4gIWAfXB4fH18b3ONen2Be3iGi4mFg5Knu62osr2vpa6zs6ijorCsipq0naO4pJWspJaprbempKOfmamYqqOvsKqamZyUlZGXn5eZu7utyaBptrirsJSYnqOrkpe9o16qsoKJio2Uh5F8jo59g4aNj5SViIeSlouQlY2KjJeYkp2Zs5aVqp6Lm5SSjZCSjJmbipKekIuJlZ+ijZWNmJqdk5yZnpShoJScnKWvqKKls7irwsjEtbu9u8XIx8LRocbJzc3E1tbQy9SicXxqXltUX1JQR0Q+PENBQjg/ODc0PkY8PDY8MzUzNDU0NTNCMzo6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojk2Pj00N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZUdiYGNwSkCLin+BcoaHfYGJdYKKg39tfX18f3B3h3eOgoZ7jY+Mhoyaq8LAr73Gu7K0wby0rauztoyosq6uvaqbu6Sorbm3q6amoqKjo6mvsrGrnZykmJuYl56ipaWSo7muqL+7rK2yuaWjpn2IhpytvbCDi4yLkIOPg5GPeoGHkI2OnIiIj5eNi5WXlJGalp2nmrGakaudjpqPko6VkJCWl4+RoJGJlZujrJSWj5ScnpSgnpuYoKGVmp6np6ShpLCypsHGw7CwurbFxMK+zafHw8fDvNXQzcTKiHRzY11bYVtOS0JMQEVGPkE/Qjs6ND5BPT01PDY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGZGYGlnWl1bk4yMiHuHi4eDjHWGkIqBb358gn9xfoF6lXqRlJSYkJOWp7TGyb/CzMHDuci8uq+rubuXsra6ssCupcCkqq+7u6qtq6Kinqerr7WwqpugqpyinJWesLSni6K6ubXBu6uonLKko6iThY2pw8SkgouPh4iEhpWUjXqDjJGPkaGMjJSRj4mXn5iTmZSXpqCunYyqnI6Wj5KRlZWOkJWRj6GUhpefoLOelJqUoKGZpJ+aoJuglJiepqSmp6SvraXAxMKuqbe1ycO+ts6yxb7EvLPRycjBtXV5bV1ZXWtTTUlDTEtLSUBBPUNEPDVBRDs6Mz04QjMzMjI2MkEwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmZbTWVcZlRjapmNl4qLiJOQhol5hpOQgXKAfI1/eIeCgpB6jaGWqJmamLq+x8jKwtLJysLNvcGzrLu+p7q/vbvDuKzBqayzu72qsKqjpaOrrrSttrWgn66fpqKYo7S9qZuovMGjtravq5KvrKqrloaZqaalkYKMk6WViYF1ipJ5hY2RkJ6fk4+Ui5CNlKOZl5uUlKOeqZ+RpZqMj4+QlZaIfY+VkpKjm5Wgopy1ppCflqWko6WenqaYnpWXm6WjqaiisqyovMDEr6Wzt8zAua7Ds7u+wriswsLBwJluemJZWF1cTExNSkdEQ0hCQkFDSzo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5rSV9YYVpkZFaekJ2Ol46ekomKf4ifk4R4hX+Vfn+QiIqRgJWhmq6mpJjDvsjDyMXTzc7Ny7vCt6+6vbS8yrzDwba2vK2zv7m8rq+ooKmntq2uqbK3mp6toqihnau3uKmlr77Dsb25s6eps7OsrZaWpKunoJGOkrHFp5WOfJGVfYeRmY+qmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi42Pj56IWpCXl5KWpZpmmKOfs6WWopasraunm5+ml5mWmZWhpKimnrarqbq8xLWltLbLwbiptqyzu7iuqLi6vbiDbm9bWFVWT0ZLU05LP0FIRURIRkc5NUZNOz43PkFKLjMyMDI1QjU1T1ZOO0xGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhXOz1AQkZCckZpSVJlYkxGppSclqGXqZaNkIOHpZKIgYeCnISDlZCRlI6aop+vvq6hx73FxMfGzs7O0sq+u7axuru8vs62xL23uLeysrWzt7Osppyrq7irqaevsJejr6SopKW0wLCqrLO+wrnAubOnt7O3sq6VpKyurqSLk5WhjXTBmn2WmYSOlpqLsZWamZWSk5mZpqOVoJuWmqicm6GgmYuNj5adYEqWnJqUmqWXVJawn6+cn6WUr6+spZqhpZSTmZmOnaCnopm0qaqzvLy7q7Cyx8C5paurrbGxo6GysrSkcW9mXFtPUUxFUFBRUTtIS0lGSEJDPjlLVD9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pWDs6QkNAPVFFV1JzYldGSKuXmaCiqK+ZkJeHi6eWjoiShZ+IhJ2Xj56gmqOktci0qca7w8PIysnHzM7Hvrqyrrm4wMHNtci6wLm1ubGvr7K0p6ObqrS0q6mmrqyZpK6lpamsur+oq7a2vsG/vriyssKwuLyro660rLiliJuXppt2vqCEmJyOk5mai6+WoZybl5Wbn6GpnqigmZqpmaGnnpeQjZGdg252kqKalZ2in5CtsqOrlamqmKuupaSgpKiSkpmciJScop6Xsaepq7q3vrOyrb25tqCjp6ilp5ycrKmpjGVmYV9STE1HR05KVkw9TURNSUpBQ0Q8UFU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlNhTVVIf2VeSEWslZyhn7uumZSejJOqm5GSk4mrjYeinoykrZSjo7bGvbTBusLCyMjFws7Iwr25sq+4tMDCyrbGscG8tLqrqK2sr6Oimaq0u6appquqnaivp6Srqr28qK28s7e9xry2tbfAr72/s6i0tqu+pI+jl5Gin7yfiZmgmZaenY+3n6mcpaObnKGaqKWzoZudpZyoqZ6ZlY+Um4uXiY2koZSco56gtK+lpZOwq5mrrJ6epKOpkZWVoIOQnp+clamloqG0tLq1rai1srOfnKKmmpeVmaqhnndhXmBeSklGSE1RSU5FRkZCUktJQURHQVZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpnXEZDQ5xvYkdFp5ekn5/DrJyXpJeZqZyWmpqPqpaWqKaVra2Zoau2xMK7vrfBw8DHxL7Nx7u+ubKwuLO/w8i1v6+8trq3pqSqq6ygoJqqq8Sipairpp6rr6uiqai+uKatvbC3tse2tbm4vrC+wba0srSvvaOXo5aTm5Sun5ChoqWjo5+QvqWpnaisnZ2hm6afvaKZo56iqauhnZeNlZ6Tn4ePhY2SnqSgnbWsppyVsqeZsKefmqqeoI2ZlZ+EjqGam5OlpJqYrLG2sqqlqa2snJmgoZKOkJapn5RpZFphXU9KSEtPTUhFRElBPU9IQTtHSUhbUk9LPUhPVTRCRjk+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZWNXTKKao5uexayhn6ydnK6fkqOelqSgp6qsl7awo6qztsTCvb+2wMK8yMK+ysi2uLW0sLO0t8HGtr6wuLS5tZ+mrKqrnZ6fpaTBpaCpraCkqa2voqanvbWlsby3tbXDsrO3ub6xw8C3t62ztLWinKSVkZOgraCYoZ2oqauimsOtqZ6srpubnpmmoL6hnaSYq6urpqGZjZqfkp6Jjlh/lZ6loaC4qqeTmLajn7OhoJuvl56OmZSdgo+fl5aOoqSVkKausqupoqKlpZaVnZmLj5GTpJ+JY2VbZGBMSUpLT0ZFQUZKPz1KQjk5SktOXVFRST1MV1w5Rkk9RE1JOEhjXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3NIRTY9dWVcS06en6GYnsOnpaKzoJyyp5OqpJ+jn62prJ27sKmstbLHw8HCs8LEvcbEvMXKvLCwtq6wta+/xbW5sLC6tayaqLCpqZqepqGnwq2brLCcqqKusKmkp723pra6vK62w62zs8K/scazurartLWtqqKllZWUo6uhnp+aqKuwrq+7sqagqamZmZeToqS5oKGkkq6vrKWmn5KhnpWej5GOlZ2Zo5+ntKanjZi0nKOvmp6brpGelJeUmoCSoZWPjqChk4umrLClp6KcoJ6TkpuUhYuSjZyegGNmW2hlS0lMSlNCQ0BIRzs7Rj85OU5NVV5SU0o+T15ePUhQQkxMSTlOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tVXmZyQDg8SJZ3ZUE0n6Sfm6DCqKOqsqGjtamWsqumoqWyrK6pu7KtsLW0xr/ExLXAxb7KxLbAyMK1q7WosLiswMS0t66strmlmauyq6qXn6aXrbu1m6iwm62frrSxp6q6sqe5s7eyuMCqt7LCvLPFp76urbe0qaesoZeWkaWkoqKXmKSuuK2xtbagn6ikmZSVk6Sgt6KkpZatsbKlqqahnpqam5aYqJ+fmKKer7Kipo2XrpmlrJeZnqWRm46UmJqFlp+UjJCcnpSLqamqoqehmZ6WjI+ZkIGGlomUn3llaV1saU5QTU5UPUNBTUM6OklANzdRT11eUlZRQVdgXEJKU0hWS0g6VWRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUpwaVZDV0aMeWZDO6SjnaGmv6anr6+gqbWrnbmvq6SqtLexsLm3sLe4uMW9w8e9vMTBx8C5wcbBuqq2pa27rcHDt7iqrbK7opWtsK2ylqWnkau5qqCnsJ2qn7C0sqqptrWsu6yysrm3rLmwwrq9vqbCqrC3r6mqq6admJiqoaGgkZigsK6zq7C5mpupn5mWkpemoLappaKir7Gzq7Gnq5+boKCbnqWcoZedo7Owmp+Qk6WaoamalaKflpiJlJiTlpedk4iQm5mUjqmop5+jnJibk4eOmYt+jZaFj5traW1hbW5YUVFaVUFDRVRAOztIQTc6WFBkXlBWV0RZXl5NTFJOXktKPlpkXk5IUE5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE2NDdnWWBGKD84bH1oW1Y6iXtjQz2on5yhqb2hqrCqo7G4qaW1squhrbW9r7O4vLq9t7bBwr/JxLnFw8DAuMS+wbivtqirt7K8v7+0qa6xt5+Xq62orZenqY+nu5+lrbOeq6KxsLOsqbaztbytr7G1rLC1scC6xLarvK6xuKusqaKxpZ6kqZ+jl5CZn7Kqs6mqs5mdp5uZlI2gpqS0rqehrKytsaeyrLKppJufqKSelKGYm6i1qZeZkpKfmZ6hnpCsn5iYhpWYi52anJOKjZaXmpempaOgnZaVlpSBj5WFe4+Sg4yXZmxzaHByX0dZZlZEQ05YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcY2BQS01OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19eYVUxNTA9YFZeOClDM1lVXGdLNYx6ZkxApJqgpKy3pKyppa6utqmus7mmp7G4xrext77BwrW0usW+zMW5w8C6v7rEuMG5srWsqrq3urq+taqtsbaZmKerqqubrKuPq72eq66xo6qfsK2zrq62sbm2qa2usKe2sLO7vMmyqrW0sbSvrqahs5+aqK2gpZWVmpmxo62gpa+WoaSZmZKNoqWnsqmhprGrqbWlrrC1r6OZna2nmpeemZmsuKOYlJGPmJyhmJeUrJ+dlIGTmY2enZqWkIqUk56apaOioJmWkpKWe4uQhXuMi4OMk2tueG51fGFGYGpZSUhaWz17SkdFNkFiVGlaTVxhSltdWlJSUmJgTEtFX2FgUExJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4qQi9KR1BbSDNjWVVLRJmXoLCosamspaOurrWpt7S4o6y0t8q7tLu6v760tLfDwc3Hu8O9t76/wLi/vbG9rqe6ube3wresrbG5lZemrquno7KplK+6pK2ysaenorKzsLKwtLG3sqiuq7GmuK+1s8PFtqm0tauwramnorafnqaxoKSUm5mUsZ6nm5+pjaminZuVl6WlpbenorGzq6exp6ywtaykmaGsqJucnZuUqrmclY6Oi5mdopiQl6ahn5aEkpeQnZyYlpaIl5CXm6idpKCSlpGQlnaEkId8hYKEjYxucXh2fH9dS2VsXEtPY1w/YntHSThHZ1dlW0xeYk1YWVdUWFRpXVBPSGFeX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5JZzI3J0ZhTFYlLUIuPUVNUTwzcmtKREORmaStpK2tq6eksLKzqrewtp+rtbnJua7Bu8K3s7K1wsPPxMDBvrW9wL+6v72zxKiqubC2t8C9r6yzs5ygp7CtpaawpZ6ytayrsrCsqai0uay0srWss6yprKisqbmusbDHvrilua+pra2mqK2wpaOjrqOpnJ2cmq+ZoqOio5CsnqOfn6Gqpqa4pau0tKSpq6irr7auop2jqKqboJqakqS0mo+JjYiSo6CVjZSdoJSThY6Uk52bmJaVh5iSlZmnnKCfjZKRjpF3fo6FfXx9h4qKcXRyfn1+XFJkb15OWmZdRkSWW0c6Tm1YYVtNYGFOVldWV1RZZ15RUkxjWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQ2Q7NipIZEhKKzpJPzNCSVMsPo9rPUdIj5upqqKpr6SopLO0sbS1sbGhrK29zLquwbzHsbSttMLD0cXGvsCyvsHCvL+4vMWorbess7i8wbCssq2gpKetqaiksKOqsaqvq7Gur62rs7unt7GyqbKpq6Wlo626rKqxwrm0rLqoqKitqaixpamkoq6qqKKem6KslaSdl56Yq52hp6mhrKWirKu3sbGgqKKfqq6wrJ2epqepmaOYmY+gp5iGg46Ki5+gj4uMlpyPj4aIkZWgnZaYlYaWk5OXpZydnIyRkI2Kf3+IhX13f4eFh3Rzcol2bF9ZYG5jUXNyXEs8hHxGP1d1WGBZTmNcTlVWVVdQXGJeU09OZ1hXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSjAuSWdERjg8QjA1RUtYMUCUWz9NRpWXrKeiqrKcqamwtqy4ta6qpaurvcm8sb63w6+xrbPExM7Ow7+/tMDDxLrAtMnErK+3rrK5wL+zrq6rpaeqsKmnqLGltK2qsK6tsa+zrLO7pLi0rKyup6ufo56wt6uqrbq2pLa1pKmnrKyqraGopqaxsqSmpaGhq5apoJSaoKaepKKqpKyinqaxt6ytoqSimqiqramcoaWkpJmgmZWPmJ2UgYKQiIWdoI2LjoyZj5CLhI2YpJySkZuMk5KSlKOam5qLjouLfIeBgoN7dICEgn50eIykh3lrXmBuZ1dmh2ROQGeSTERieVdiWFJlVU1WVVZUT1xdYVVLTmlXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEMrOkpPXjREhkBISESXkq+ko6qwl6qprbWrtrGrpKuqqbzBwLi5s7y1prOvxMnL0b7Bu7nAv8K5wbrCxK6xtbKzu8G+s7Kurausp7aqpa2vq7mvqLCwrrGrtaq2tae1tquspKmqnKOds7OoqKS0tKC2rqGpqKuorKegq6youbapqqmpoamfrZuRqKGdoKSipqKpnZymtK6npamio5ekpqapnKKko5+ZmZ+Rjo+Zjn6HjYeFnp6IhYqLj46QjYSGlaOajo2bkZKRj5Kfl5mWjYqDf3SHgX9/eHWDf3t4foCJno9vcWdncXhcYXSIaU9dmFZIbXhVZFZRYk9MVVRVUU9YW2JWSFBqVFdUR1BZVUk+SUhPUVB4TE5WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSYvMlJjMDI/Zj1OWD9DLD5MVF8vSWs2UUU7lY2voKWqrZmrpK2vs7SuqqWvqam6vrvBsa+4rqK2r8nHyNHAv726vMO+usPBwL+vsrOytb28wbKys6uzqaW1qKSts7O5r6OttbGvsbmquK6qrrarqp6qq5+joLatqaGfr7OhtKqeqKeqo6qhoaytqL2vrK6soaenn6uYj6+imKKgqKeep5uZqrCoop+soaGSoaKjppiaqKaXl5idj4qHlYh9jYaFhKSXhYKCjIePjpGEhZShl4iRnZCTkY2RnZWXj4qFhnh0gX99dXl6gHt0dHtqgoejdWleZWyCdWeIi3xSV3BeSnhzU2RTUV5NTVJaZ05MVlllWEdTaVJRPkJOUWFROklITFNJcVBMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBMaDozOF89YWQ/RjFDUFtbK0hPOldCNJCOsZ+kpqujpqSsprSzsKmjsKequL7AvLCouaqnrrDJxsjQwr3Avrm+v7zJvMK5sLC1srq8ucCztLutua2jtaanrLG2ubKnp7q1rbW8r7ylra21q62cqa+jn6Wsq6ecnqqzpLOomqqnqaSpnaOpqKm9rLSvrp2po6Cum5qyo5akm6Sln6SamqiqpZ6aqaGbkZqgpZ2YlqmpkZiZk5CKgo+FfY+CgIiej4Z/foyHkY+QhICTm5SFk6KMlJGLkZuTlYeJfoByenl+fGl3fHp1cHF+aYZ5hIhkYGhjc4V6bWd5XV5VQld6bFRhUFJZS0tNcHRdSFpbZ1lFVmZQQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9PEZbQCqPk7GZn5+opaShq6S3srKkqLCnrLjBvbWwo7msqKiww8nJzMG3vcC1t7+6yLbDtbSztbK9ubq9tq25tr+torOmq6uvtbi0qp26u6iyv7K6oK+0tqmsnq2wopylqKmjnpyksaawoJ+qqaeiqpujqKCtvKiusK6hq6Kjrp6erKaXn5uho5yfm5qjqaKamaOjlZaTn6GWm5amrIuekZCRjIKLgH+OgXualI2JfH+LhpCPjImFkpiRh5SjipKSh5CakJOBiHx5bH12eXhie3pycHBzeGqCdGqDZ2RoYW9zjm1ianBgb0FceGtVXk5QUUpJTFNaV01cXm1XRFdgT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE8pPTNRXD0jkpirmJ+Xp6Sin6ikuK+uoq+vqau4wrqyrZ+4r6uotLrHyse/t8K+sLS+t8S2w7KvurKzwLW7vripubi+q6S1p6iqsK25sKmZubyjrr+0tKGuuLWnpqews6CfpKanoaWZn62oqZ6gqq+noKaXo6mgsLifpLGvoauhrKSbpqapmpqbnqOVnJyanammlpqep5GXkpidk5mVoaqQmomNkId9h36CjXx8oYyNiXmDjIWKjI2FiJOajomVn4iRlYKLl42QfYV7c3B8cXN0YHl4am9wcXBqf3NjemxpZmRhZoaAYFtyanFMTX9pWFpNUExKSFBSUUlNW19vVERYWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wXFo1KJacpZiclq2gn6GkobersKO0tKmoucW2sq6gt6ytrLC1xcfAt7/CurG1vbe/u7+vrL6wtL+yvcO5qbu7uKeotainq7Css7Cmmby2pKu7ta6fsbiwqaWnr7KboaSgo6ShlpywpqGfoqevoqCik6Olorewoaaxq5+soq6YnKqkqJ6Xmp2kk5qcmp2lqZmcm6SUlJeUnI6Tl6KpoZCJi4+GeoR9hIp5jpeKjYd6goiEiIyOhY2UmYyOlpmKj5d+hpeLj3qAenBxdm9vdF94d2VtbGxqaYRuZnJpbGZpXWRzgWBba3VpWkl9XVtYT09LSEdSVUYyOV1ebVBEV1ZZZU1ISUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWRtODRHQWZbSFREVV1oRC48MmNWLDKVoqGXlJuqnaShoqC4qq6gurimrL3Fs7Cvo7Wwra2vtMPDvLO/urixs7m4uri6r67As7S5sL/BuKy9u7WmorOqp6myq62xoZrAtaSntbWonrK8qaimqa+smaOnnKOmlJihsqWZn6OoqZyioJOkoKS4qKSnrqaepaCokp+ooqGgmJudoJKam5agoaqbm5ihlJGUlpmNlJKjqKSQiYqPhnmEe4SGfZ2NioqHeoGEiIiIkYWVk5OMkJWUjY6Ue4OXjot3fntsdHFsbHNheHRoaGpnZ3CGZ2hpZGZpamBqYmpnW2V7Y2BTc1RcW1NMSkdJT1NAISpoXWpMQ1ZVXmBLSUdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEIzQ0RnW0tXR1VgaEIzNzlnTycynqOjkY6jp5udnp2jta2mqrm3p6zDwbawrKO1rqeur7fAv7yxwbaxrrK2tri3tq2qvbSvsrG9v7iuvLyxpZ+2q6WltKmqrp+dwauopbCyqay1u56pqquxpZieqp2mpJGZp62imJ6kqaGbop2XoJ2ntqWvqq+hoZ2doZSgpp+hoJmbmZySmZ2UpZ2roZeWnZSTjZWXi4+YmqigkoiKi4h5hXeCgoKciIuCiXx/hIiGhZGElpWPjpCRkZGMk3uDlY2Fc319Znhva2psZ3Vza2NnZGR2gGJlZmZlampka3FaXlldbWRhTmhXWmBWSkdIS01SWD45X2xpSEJUU1xbSUhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNCaEglNZujn5CLrKGYmKCWpbSxobG9t6Gxxry6sbGkt6yrrqm5vLu6rb+xr66utq+zuLOorLqxr660trq2r7m+raaetaugoLCkq6+dosCgsaOusK63rrWera+sraKanaeppZ6Vm6iln5mkoqmdmqCblJyerK+luqiuoqGamp2ZnqOapJ2XnpiblJmgkqiWqqeak5qakYuUmY2UlJmpp46OiomPfIJzgYGLmIWHfImJhIWKjIqThJOckpKQkJGWjpB/gIyNg3CAfmZ5bWhramdxcmtcaGRjc4FhZmhqbmxna2pobVxsa3RxYVRiaGRlWklGTE1PWFFRVmFlgVRAVlNZVEZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmZDJzSSoZqNjrCdmpOhmqmyr5+4v7agtMK7vbmxprawqK6lt7i3t6y6rq2qq7eqtLmuprO1sq6psbe2sbO1uqepn7apnZ6poqmtmqe+mK2jrq+1ta2sn7Gtr6minJyjq6iblZyno52aqaKklpqgnJGcpKuqqbufp6SgmJmZnaGPa6GWmZxxgpWao4B1kqmnnpSUnpCIl5mAloqhkHiGlIyDbmp+doNxbIaLhn2Ei4ZvXmNhZ4SXhmuLj5STdXeLhH6DkH9nhoBodWlmV1xoc25OUGpkZ3KEZ19kZm5tal5gYYqQhIVlTktEOEZUZ15KR1BQVFVLSFNhb3RlRlpRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNTY4LCMxJzIxNDoxNzZZgWwxNk9rW05cS1tmYj5HMVFkPSsujKSZhpWwm5yToZuqraqjvcSvqbfCuL28rae2sKWrpLezsbOwuK2qp6y0prC1o6i4trWop6y3s660rbOiqp+0q56hpJymp5irupWmpa+yt62upKmuq6yloZ+coKenm5ehpaWbm6ennZOfn5iQnqiqo7Wvo6OjnJaXl5ejiKGOkpqHoYeTnaB/pX+mqp6SkZqRiIRyeI2OhYihdomNaZeIZn1yeKFwiIeEfo18f6GgoJmAe4eedIiOdpuKbIeBg21oZWN6bHFiVIZtY2xpmHFZanFvh1heaVtra1uIcW56coZnhoRaXkZNP0dfTUZSVlZRUVJXVWdeTVdJUlNPRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcwKIuml4Ocq52ZmZ2fqqqnqb7DrrK6vLfAv6qkt7CprKaztK6us7arqaWxraW1tJyutra0paeps7Gtsqivn6uhsqmgo6OaoaOarbOUo6SltrynrKerqqyopaGgmKCmo5mZpqOkmJykqZaUo5yUk6SlpqG3o6OgpJiUk5eTm4iuj5iUiamLl6KbhbGAo6ydk5mdlHmC1KiAh5XBm8d5eLGlt5dkgMCcv3mEhHmQhHyQkJHKcZa8nMV7cramu5B7gGyWsauweGhrWLGubmVpvJK8bmh6bnKP2H5TamK2sn6BcpR0mqGqkFdPV2FPVk5GVFtYUVBSjFxXXFBAXERRTkVHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGNppKBpqmfl5yepa2yqLDCvbK1wLW3v8KrprOsrKmnr7Opr7azqKimtaanuK+cs7K2qqWkqLGurrGmqp6npLGkoaCel5ugna6rlJ2hn7S6o6qpoq2upaKdmpqhp5+Xm6ign5iep6eRnKeblJ2hpqKgsKKfn6OWlZKYkpmFr2pqio2qfmeElYatZHCdnJOZpZRxrqGkfni7fWuhkHaxX2q0W6WAZpyRYGaCemZ/anhrqWS+cmemjHaxanyxeHSSk2NtbaduW4SgRWhnh5ZFdZxgfmd8pKeCWV+Lq2mAlXh5aqc3Sq9cV1NtY1tLTldfXFdWO06JT1dXL0lUU0lERUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzEbkaGVg6ynpZ6jpaqyuKy0vb6vtsSyt7rCpqiwq66pqbCuo7G6r6SlrrOjqbmonrOysKOloKqtr6yvpqefo6Kwm6Kbl5WXm5uspZaboZ60s6KrnKKtraCempegoqidmZ6kn5yaoaekj52jmpegn6qepqagm5+hlZWRlpGahbWbtXiFqZm1mXeHs5u3fpOVlqiUfmuBpnuChoiSlJJ4q2drsVure4+HlHSIcY+GgH+IkJd4g4KLmIyDoI+EsHZ3n3Fra2x8i06kWEhjY5l+Y2imYHlydVOSh15QqW1jcX6HgGKcLlGib1tTa2hgTEtbZFhcWkI+sXhXWEEjTWhFQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjhhVTUwG5WflIizpqahrqmns6yqu7bCsLvCrbi3waqsra6upq6yqaGvvKqhp7StpKu1pKays6ejoZ2oqrKosKilnp+fr5afmZSVlpidrKKamaSotK+iqY+pqKqbnpWYoKWnmp+cop+boKOlo5WbnpianaKqm6WZnJuioJaTkZOSnIPVk5m5cLDCfsaGfNaUm7t8mZWkj42cjaR7joejgqWCeqx5j51Wr3qIfp9quVq5d4aDfKaCk3yYeqp5jZ2Qe7FujoR0kLyFb5RQr6fFilGgemNgqWN0cohtl4hgU7W0yIaAiXxjpDNCnXZdUGppZFBAWGdaZGFKSE1sS1tST1lmWUNEPkU/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVE3MiWboZOYsaiopbOqpbWopLy3wbC5wLG1tLuztaexsKOwsqafrraom6i5rqOvsaCztLCgpJ6fqKqxqbSppJydnqqXmJeWl5WWoKmdmpaorbCpo56PrKKolp6XnKGloZiioaGhmqKip5ueoZ6VmZumoJynlZubn6GYj5KUkZyIsm5otXGrh2+OpnK0c3K2e5mXo4uOnI2ifpGhpX6wdoOR0tF2XK57hX+kb5uqpmuHhHytfZeZj3uxc5Kdj3mzZZZ0hJ5vnmaUUsiLWsJcn3liX61gdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqZGZYQU9rX2xoT1VHSTk9VlJbWFhJQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFNNjIwoZyRpbCtpKq8raa1pae2u7yyur+3trS6urOltLOhsbGin6yvpJimuq6ksbGctLiqn6adoqqksqisqqSanJqonpWUmJiSkqKnn5aSpauwpqKWk62fpZKUoZukpp+UmqWmoZqjn62aoJ6dkJaboZ2cpZWdlpmin5WYlpKahax7d6h2o46Jh6lvrYqCp4OYmKGJkpqKon+TmYmuhX+Cs1xys1KufYOCpH9x1314hX2OnoaZmnevhoqRnIh4s2GaZZqBgpRsklqwWEuadZh5ZmCtX3d3h2iYiGter3eVno94bDV5yK6yX0JUb15nYEVQbV9wbVZVTS5lY2lTWVE7QkRBTDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSTk4OJ+dlKC4sJe0wa2os6ipsrq3s7i/ubeytby1pbezn7Ssn5+oq5+Vp7arqLGxq620pJupoKCoobanpqqjmZ6VpaGUk5uZkpSipZqSkKasr6aglZmpn6KPkaKZqKWglZqlqJ2cpJ6tnaGdoI2UnpudoZiZnJaWoqCTmJCmnYapfX2leKGPjoOqcK2LgaeGlZ+hiJeXiKOCkYiUqnyAi515b7FaqIKCiKB5dNh/dodzp4GOm42SpHyWkJ+Ee7JenGSgfoOVbJJcq1tak3+Rf2hnqmRye4FrmIdzXaxaiaCOa29lT0pDoVxbTHRdYmZNW2FfcnRfSlY2SpuTWEhFPUhGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjAwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MxPzihnZmZv6uXtMKuq62pprSwt7C1v7m5srC3vKm6tJ+wpJ6lp6eek6qwqbCptayrr6GYoaCmpaS6oqOroJebkaKglZSempSYnqCPjYuor6+mnZabqKafjJKkl6irp5SXqaeen6CjraShnqGNlaGZn6CSnZeclZ6hlZaOq5uPrm1ytHKpjHaKpnO0eHOzgJGkopGcjYmkh5B3uG+Me4uia2u2WqCFZZeXaaGip22TcrR0k5h/smqFkoita3WzYZ1mom+HkmqXXK1gTaF8h5FSc6Nten9+b5iHcVyvVjycd2VUb24uXKdPY1JrZWJtWmNdYHB7Y1RaUT4+bW8zQkJAP005ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzwwMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4pZqbnbqhnLLArq2rq6e3qbivtcC1vLCvubirwbapqqCbpqShnZGqqqi2o7Kor6qgl5ynoKSruJ2jrZuWmY+lo5WNnaGbmJyfkJOUq7Wwp5mUnKyql4yTpZmlraKRlqqxo6Cep6uwmKGjkJmil5+blpyXoZOcqpyUkKuZh9SSmrtzsMOAw4Z+1ZabuHiHkJeMmIqMp4h6o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6F+jHSHqn2+bnO8dLKDdXiBi26aiHFujaR0vV53fVthebxrWlZbanpeamFmZ2Jtd29ZW1lDQUByP0NHKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTZBOaeanqG8opexw7Ctqqqssae4r7bFsbqxrruwrsGyrKSinqOhnJuRqaSqsqS1pq2kn5aaqpmmrLido66YlaGQpaCSjJyjnpedmpCVkq+5sayVl6Onp5SRlqSdpK2dkKCoq5+bn6mjs56jpY6nopWimpyXlaOYj7CgkpSqnoWQmbWAkJGMt5V4gpOatXdta25zbnmPhI6JdJ7Bu72ae4GyqHCAdJG4g3yGhoyGjXuLho2XfKS7ub2cdXq0o3R2l3V0sHWZnmaGaY22dHJwd7aMXoB6fYpog3lueWOLrHB1hX9ZW6dqRWRZU2ZgY11jUWdmcW11Qk1QTUQ7Wk0+SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JWOCpPXV09KzpWVic+OzynnqCgv6WWtMO0rKunrKupu66wxq+1s663p7S4ramioaWeoJ2ZlKukraqmtainn5uWoKOerKS+p6Gql5SdkKKbkY+iqKGTnZeTl5SytbetmJ2jpKKLkpGmnKarm5aopKWcmqGopqejqaGRrZ6XpJ6Xl5edno+wqJScp6KOan5pnKZ4h3N9mo90emWHer2+wLpvkoJxlYdfcmpaXpqJYWOIjpVrYH+VY22dd2KVa4CalZRlXmBjcZuKaXKMfYaVZ2p+cnR4fX1iW3d0gWhQXG6EfXuLa1hse4JzSUpvhnBOdU1FV11mYExbWGdjX09bbXVpcVJQREVOPEhJPUw/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF5MKDM9W08nPzI+qJ+oocGjm7S6tqOspa6nqLWxrMisr7OrtaO+sbKnoKKpnaKbmpmspq6kpbWppZuYlaGbp62pvqipppWUnJWgmpKXpKmokJ2Rj5ecsLK/rJunnaeiiZORqZuppJubq6CjmZqjp6yjn6uimrCblaeglpWdn52XsaSYoaiZnJGdnKOjmaaimpyampmPloFnbX1xd5KXlJGFirWqjYaYlY+KjJiXh5SVioSSlJGJjpKUmJSYl5qgopqclKGdjYJ6pYZsanyQfIB0iYqBcYJ4eXZ2i4B7imtzgXSDdWR3fXdrcHttYGNdcGdNWVlmamBXWnB6bmxmU09GUzlPWk1STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwuQLOgs6K/oaOxsregqaWyp6WwtarJq6yxpbWmwKi0oZ2kpZyjlZagqqaso6O3q5+Zlpafl62qpsGfrKSVkpyXnpiTlKKfnqKmk5GZqKeyxK+aq5yqn4+Wlqmeq5ycoKyYoZucoqSvp6KlqJ6umJennZmaoZ6enLCgnKKmlZiTmJOgoZWjnpegjpaTioqNjpatj3yVm4KSgouqqIaBmJaKhI+fiHuEkIeFmZKIhoqVj5uXjZCXnqOWmpORnY1+jmahs6+FioR2epCKfHZ5em9mepGBgIlrdYF5iHJoc396doOIgmt0ZHlmYGplY2Rma1lre3BpalxTTFBEX1VFQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvvqyrrrKyoKqmsa2irLOwxbCqrKOzrryktJyfpaKhnZmXqKWppqSls7WelZSdmZmwpq6+oKyikJGempmTkZWhnJeonISeqauis8izn6qjqpeWl5qnnaibnqSrk56fnaCpr6qmo6uirZufoKGZpJ6cnp2vo5ieqJOYl5yRpJmYqJ2al2WCknxlfo2Zj2N5jWxoa3qRpKtrZZqYfmeFimVlaWh7jqGPa2iNl5GjeGtqi5ijnphzbG56hI2HelhlXoWCXmyLioB2XGhzd3eSgIeCbniCeIBzbXmEdHeJiI6De2mGWV5rdGRdc4lpanxxbGNeUk5XSmRYQUo0PUY3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvrLOwqqWora2wp66tsL2xqaekra+wn62Xn6OdoZqZp6ucraOlqKmyrp6Vo5Cir6a3uaWuo46OmqGZkpKboJmZpZV7payiqLTEuKShp66fnpWeo56jnKOqqJKeoZ2gqrCqq6OqoKmbpp+ooayWoZulsKSXnKuVoZ6bkqWXnqqYnn69g4dytHKEnYataHi5xLhxk6Kje6aYmXOqgnzLwMC7cYuiiIKffZWYiZ7AvYKWnZ2NncLBe4J7ko2aw8B9aqWxb4yBb8p6f5t3koOOgXZ6gYB5cXp/h3F4hY2TeW13lGNmX3hkYGWCY150Z21kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAvI0ZbM1BZL1VBQjsvOJajuMO1sK/AqaiUo6+psK6tprK1r6mlpqawq6CrmJqin5ybqqeinKyjpailpLSknaKSpq6ruLOnr6KRkZqdpZKRoKGXm5+dh6arpKutwMCwoKmvqZeSn52imaGjqqOToKGdna2uqaymo6OnoaWmnq2pkqSbqa2pm52qnKyhlpellqGjl5x/zpR4eqSBeZWWm1+uj16Op4GioHynlZt0q4OAr15jjap6p4eFoHSXk4izY4KrhqCOjbNqhK50fZeHuGGDrVmjzW6QdXvae3+ZcH6IknZ+ZXuIdnZrfYhufoWRkn5tgo9gcWtwZ2BfeWRccWhqY2ZgUlRSV15LT0M1QUhFRDk+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDtMLSFQQEY0LjGtwr+/tbSwt5edkaSqqK2zq6WyrKyrpKunr6qgp5uZpJecoq+foJ6op6OloZ6wrJuelaeurbGqqKyglJKbn6WTj5+ll52no56tpKqwqMDGs6ipsa6Wkp2copefqaqflKGfnJ2tr6erqZynqKSiq5KttJemoqqpnaOmpaGwoJKap5qgmpSUkZegcYWMl3SEqIdxsXydcax+oZ6BpY+ed6qCfa1/nHKtfquHhp92mJJ6fJd+qoiijJGMnX6re4mUj5+Ae61WnMR6j2+SwX2BlW11cIxtZXZlhm9hd25yb4qLkpCDbZGRZXB0dXBgZ21lYG9paW5mY1dTXWFZUlNDOUpJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNTGxrK0n52jjqOjoayvtq6psaeoqqetq6unoqOdmaKVoKarn6GloKioop+dsKyYmpaop6+sqKepnpeUmqOikZShrZudpqOvrKOrtKq6zbKtpq6slpScnaKZn66snZagmZ2fqbKpqqqbrKuko6ybsLGiqKyupZimqqmpsaKSlqOlmpSShKRqpHWJeql0erJwgqWJmYxxiKCah6RgYFKrhH+ug5t2roGmhoafepmWhntmgKOJpJmFgqN9qX6BlYeuX3yoVZ2ikoF6op+Ae8OvxYxzr7OzuXFiqa/CdGiNjZiPgW2ak3BueXh3b2xmZWVycGZ8aWJdV2BpWFhVTE1RTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY3NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8PJ1tW/oZmrp6Gvop6wtLCvqa2ip6aqq6uppKagm6WfnKanpqOcrJqirKGkn6+inZqSqqS1sK6gqZudlpSnpJCaoqigoKWcsaajp7GstsiytaqsqpWRnZyimaCls52aoJScn6esq6Sumq2qo6KrorOuoqqzsaGaqaiur7ajk5ajp5ibkXyqbJ6Eh3WreXywb4KkiomflpWflIHSuLS4yYCBsl9flKmDpIiHoHmYlZp4qsl0maOVp6mQk5qMf5uKmsbGeGWhgqVzgZ+Ogn2vXnC1Y7F1S6OGbadHgpNkj5Ceknxwl5OAcXt1fXtuW2Zqc3FmgWpfYVlkbVxeWUlOTUtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPi01T1RRHRw7PEYyLCSnpMHGuK2psq2spaKcsrmsqqGmm6ilqquqp6CmpZiqo5+uq52moKyanqmlnae2n6KXk6iqtrKsm6acoJWQpayRmZyno5+ppq6ho6epsLTCsrOqraiTiZedpJqho6+ml6GUmJylpqubsJ6uqKafrKO3raGyua+dm66nsrOzpJSXp6OZn46CnU54moF/n3qDo32DpISHp5+cnpOEuHt8ebmCfszGwrZ4m6GRi599mpaWinaemIqkmKOofrCFnYWfhKx9mpRhpWyjcI+FkIF9l4NyrGCkc3GAmmC8fVJVdY6SpJd8fZOSi3V6c4V/cVxtb3hyaoJvWmRfaG5jZF1LTVFUQklIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDg4Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7irr6Cboayzs6afoJWmrq2uqqedpqabo6egsq6iqaayoJmqpJSjtqKilZeiqbS4pJyinaKTkKGxmZ6cp6Whoq+unaSoobayw7Gtqa2pkYeQnKecoqScpZadmJmapqSpmq+irqWmmK+lvK2ht7etnp21sriws6aYna+ho56Fj9G1w7d5h46FkZOQgaZ4lKJ3jKCRhKWBinGqhoS0bnJqmaOblYqffJiZhoePc6+CpZuijaaLk52JlZCabXCyXKVzk3qcbJl/e5l9bqlho3Fxf59ic7K4aHiPlKaZfoyNk4x4fXmOgm1peGp5c26AdF1kZG5tZmdgSltZWDxIR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVlZUUU9RW1UlITJBSCQpJZNzjYqtv7+7urWelqekrbWho5mVo6mnrqqrmaain6ahoLWno6mnsKOUrKOOpK2jnZCamqq0tKSdpJyokZSXrqCgnqajnKectJqhqqO2q8OwqaupoYyEjpyhoKailZqam5ibmaakppisqK6jpZutp76slL2wrJ+isLK5q7OnmqixpKeYeqiQfXywd4qBpKWInG2yb6GHrXyhjoOolZiArIiFroWflKmgoZaGn4CZlYB7kn6rgJ2alouqeJ2gj4mUkoB5r12jgXymp2SdgHyXdGuvXaVrcIWZXWBbjKBtlZKnmYOUjZeMe3uDl39rbH9jfnVtgHpgZ2VxbmhnaENaYVs9S1QzVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pYU1BPTkk4MDUyLiosQVRWVlZUVFVVVVVUVFVUU1RWVldYVlVVUUhGSUojKCi9kpqEqcbCtsG0n5qsoK64paOOm6Sin7Cvqp+kn52tmZ64oKOroK+pmq6hkKuppJaJmo+usKynn6earJeYj6yioZ2loZqknK2Yn6imtqnAr6WppJ+LgI6bmp+mnpKVmpqUmpqmpKSaqayspKWgqqi/pZfDrKqioauyuaqup6CzrqipmHavfpCLnIWHfLquiphlsIxlla19oY+DppWagayKhLCFpZmkoaGRhaBbbGqBs2B/rXt7goGxbGdvmZeMiLFbfbRbpINryKJln4B7u1l2tVqyfVKvgHqsWIChbpiQqJuLl5GXl3x5j51+ZHN+YoR4dIB8YWpncW1mZWVPVWRcQlVfPkooPjk9NCEiLCUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5QUFJUV1peYF9gYWJeX1xbWFVQTkpGQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsre9u7TBs6ObrKaltqigi5qgn5yzs6mfo5+dtZigs6iqq56vrZ6sm5WvqaKOiJuOr6yop6Knma6SmY+omaKdpZ+Zo6KlmZ+jqrKpva+lqJ6djn2Lm5WgoJmQkpqbkZqYqaChmaiup6amo6Wpu5+gxqelqaGrtLWsrqaeu62srJWAqZKjr46bgIekl5iQgYC4w7qDjpyThKeWnIKsioKviKabm6WqkX7VvcKqYqO/vX1+o4KD17q4tYWUk4Oevb6EaqOBb6uEbZ1/erKwx4Nqq7C9rHh3or68dIGWjqeckJuRmJ16gpGbemN9e2SNZ3mCe2BrZWtqYlBhW1NqXEBVYUNOKj06NC8eHyQeJTIgHSQoMDQ5NjY3Nzs+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz88QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVs7Sxv7mxvbKina6mpbKmnYyYpb+quLGoob+mprKcnrGcuaiera+lp5SUsKyXjIObka6mo6yhpJypn5iLo5KmnqecmqCoopieoKytqrmuqKObl5J7h5mRppuTj5GYmI+YlKmaoJipqaGqp6Giq7ueqcWjoK+jqrO0qq+poLqnrq6ac3WqpLeGZYmgcGetj4qPbW94pI+Zn4F1rpmVcI+LcZWoo5uXrqRybW1tZYp4b22CmXGBempxaWeJlpWYcWlphIZncIZkXYljam9ZXWd+d6ZgYnGOkW9mZICNk4+imJiZkpeffYePlXZmh3hojmt5f3lkbGNmbGJLZFdKbFk6UWVFUidLOisjHCAaIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZdV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16pla2zqbm5srOqqaGunqOyqZiSvrLDyL62qp7Aq6yjoKesn7qjpK2sraaNl66pkIyFlZatnqaroZ+jo6CRi6SSp5momZajqaCWnKamqK+6rKyam5OSe4SWjaWYjZGSmJSOmJWolZ+YqaObsaeeo6y6n7DBp6Szpqywsaqtq6e4o623loqgqKW2nYmWopiHqZqQlJ2TqrOZm6OroLGWoaGdn6KcoKShlaunjZOSjIeSnJyUkJqTmJGOlYWBpJmXlY2Lk5KKj4aEfWeKf3SCdnSHjHGnbXuUkZSSgYGOkJCPnZShlpmXooOIlY1yaZB3cIt4d3x6amxkY29kVWBYQGlbSGNhT1orRj0rJyE3NDAuHxwhJTIoKjY5OTQ2OTs+P0FCREZKS0tNUFBRWFVWWV5gYWNcXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqW1tq6uorCkrZ+gtbGQjqzGvcS7uKqipZ6bpp6wqKO2p52ptaaokZisoouIiY+cp5aspaCZp56ek5WjlqiaqJmUpqGjkJuomaG1u6irmZqQjXyBlIuhlIqVkpWQkJSXpZCfmqqgnLajnqist6euwa6jt6evr7CsqamyuKCuvJmRpaSmtqKSnaafjamfjZKfo6yvm6GjsKivl6OgnKOpnp6dnJarnZKZoZuUkJaqmY2ZmZaQlp6RiaCdlZSFkoyQjZSKgH1mi4Z1hnZ5iINznGqGkJSUkIl9jJaSkpeToZOdl6KEiZmHenKWc3qKf3J8f2pvZF5wamFbX1luY1BgZVBaOkdHRT4yPT43LysmKykmHSY0MDY2NTg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYGVVUEpBQ0I6OUVNVlteXltaXFtbW1xdXV9fXV5fYGFhYmFhYWBiYmJkYlxbY5eVpKijsLOsrqOpp62gp7WqkJCdpbO7r6ysoqOaep2isaSlsKmWm7imo5OZqpyOhoqJnKOQrp+jlaefoJKWmJuuiqqWj6iZp4yZqI+fubalppmcjYl5gpOLmpOKlZKUkI2Sl6KNnp6pnp+4pICEr7WisK91pL6jsqB3eaCqsbuUdayknomAqn9kXGJ2oI6knoSXfm6Ts52jp62qo2Wdn5JzeZmXcICYqJdsf6KoimWcpZyRl5iWjJKckIadmpCVg5KGj46SiYR3ao6HdoZxfIaAgGFpiIqUkotadpWRaGiPjnJ6ppqZZXmZh4J4mGqDioNveYBrcWVfdnBsa2hcZmViYnBTXD5OTk5TRz5AVEM6MS8eHyY0OjMxNjY3ODw7PkBBQkZIQkdGSUtNVFRVWV1gaGZnV1FKPERHOzhVUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWablaajoa+xrKuppamuo6etpZKWq7awsqaaqqerl3OMnbCfqKunk5e5oKCPnKSdkX+IiJuejauaopSnoZ6Ol5GehXWuj4immqiRl6SJnLq0qKCZmIuJdXeTjZaTipSRkJSMkJOgjpugp5mcspaAjJy1nbOMko+8p6B+p6J6oq63gY6Opp6Di4aQsamvjIqWo5p5gYushpydoqepp4eVhZh3pZt6h5uBl6aCgnucsXqKhaCXmZSYlYKRl5aEmpljeYeQhI6PkYqDbXCPh3mAcYCBhX+GdIaElZJ4lmiSdKCadH2ZhKGeh5h/k4qDg5lrjo2FbHh7cXFnZHhvamxqW2VramZ0XF9JVExRQEU1LllVVTcpITA5PT42NDM1Njg7Oj0+PkBESUBKRUpLR1NYWllbYWBoZllRSDlFTDs+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJejn6aurquorKCosaanqqWZlK7IvrChlqaptZ6QhJ2snKeioI2Qvp6ajZ+aoJB9ho+Zl4isnKGWn6CRjZOIhoCRqI2Hopyjk5eehp+6sqeem5KOhXB1kImVkIqUj4+bi4+Sn5KXoKSWnqyIn7SJtJqtisqHqq6It4WMr4KwroOpjaWYjZ18qI9ye3ecj6eWaJWkebSLn56mqJKYwoF/q4iYoXGegJmkfZeFlbGAoXyhlKCQmJaAjpObipiRi3yFkoaNlJKJg21zkIV/enKGgYR8hHWEgZeAj8Vmf6mHj6NrnoOim4SagY2OhYqZcY6ThWh3dHx3aGh1cWdoa15kcG1nbVhoR11STTJFNDZOYWM3JjM8REdEOTY0NjU4Ozg+PT0+Qkw/TklKTENQWl1cV2FdamxcUUU9S01ASmRZXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSXop+wqKmopaugpLmxqqummpSgo6Sqo5alqrejr4Chp5ylnp2JlL2ak42hkZ2QeYSWlpGIq5mbm5mhhY+Mdpucj5+QiJ6km5WZmIejua6kmZyMjH5ibY+Lk5CNkIyNmIuQkp+PlKChmaGofqGnh62doJatj56cnZGFgKCNqq6Go42pmYyafqJ1gJmUa4KsdU2reIeNnZGbqKeAqat9g6F7eqdpnn+Sa2eXhpe2iZ59bmBkWYOWf4x7ZGiLcpl9eZVsXXuWbV9TcINcX2t5g2BZZYJ9g4CXcKeqa4OjbnKlcJ+En2lmoG1bbop8Zlpgg39iV1Bvd2ZtdHJram9eanBtbGpYaU9dWEY5QTRHRF9rNCxJQ1FNTj04NDg1OTs2QDs7PUFPPlFSTE1CSlxdX1deXmJ2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGNkY2FjaWtkYmRkZ2RiZ2VhY2iXlp2guaGqo6askaG2vKyuo5mXoKKlrK2hna61o6iSoaCgppuZjZi0mZCLn4yVjHWBlJKMiqaWlZienn+ShYWspIebkIqYqZiZmpKIprGnopWaiImAaW6IiIuOjoqLjZKLkJKijJSeoJyipX+TgY+joZSgd5yWj6eDoad/hqmshKV4inyEmn2icHOUiJZ7nox5bYecjJmQm6iaj4ede4Kic3amZp5+dqRfmHp9knOibpi3tLp0koeCf7WoZIHGuHtwlbeLcYCapGNzrKtgfWqds35ufIaCjoKLmHF/o2xyo3OehICkYJ2Zs5ZxfJeftHRzW56yg2pib3R2cmhvWGtsc3NmXWleYktFPUQ1UUFacjI9U0dfSlI9PDM5NTo6NkQ7O0BJUT9VTU5RQEVfXltZWGBgfGRIQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7iZq5yToI2kt7WuraCbopyjo6atnJuxrayTl6GZoaSZmpSeq5uLiZJ4i4ZwgJaNiY+hkJKUnZd9kImOqKCHmI6KkaOTnJuNjKmopZ6QloeEfmt7h399kI2Di5CQiY+UoIOXnqCdoJ+LiXecmKKMn3Khi4eoiJulj5anqn6tjH56oJl6o5N4gXSWiI2cfZagh5uOmZumhqJkoXyIlpCbjWyeaJuNbpqZe4CKp31yaHSrg52DdKpolZpdm4V2hJ1oqmqAuGZcqHCBnGGVjF6ndnaIiX+eaJp1hpOSl45/n26akG2nml2pfni7a36qW46EXbRnXG5yeXhraVxxanl5Y2BmWGJBUUVPN1ZDUm40S1paX05aREAxNTE7OzdIPzpDSFU/WVJZXT5EYl5WYFFhY31pRUI5TltdWGRmWGZnbm1iYmVfYmFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq1m6eJY5Sbq7qysKydppycqJ+erpuesKisnZekmqGfmJaWoKOZhomNaoiAcnuXiIuWloSRlJiPeoqElqOdipSPhouekp2ciZCpo6CajJGKgIBpgIZ5f5eMe4iOjoiPlpp/k6KfoKGTmHJon4qfj4xwkoyBqYeYnqKnn6d8r62joriXd6OzoqSAiJR5nXurmn+ijp2bl4iXcaF8hY2vtX1rmpGheH6YtKOjq6iEmXybfZ2ZfnSqWl1ve5aLeJ5iTH56eoVjeZdCTJ5ZompxfI5tgYmEmXWbeIaJsbN/f5uTp3aCnW5zfZRvmXNrpF2VdkhlY2BzcX5/bmZgbGl2e2RlYlJeV11VV0BZRlFnRFNXW2JYXklEPUI4P0E6SUU4TEVXQVZRW1ZERmJcWmBLYG1+cUVDPFVfYlplalZnaG1vYmZnXmFhXF1eYWhiX2VjdmxeZWdma2RmbGloa2mTnYGxrZmEVF6gprO5s7OpmqKMnKucnKmUoaukoqiPn56dmpmVmKCdloiHiXeFgW55lYWQm4t8kZOWiHJ/iJKhm3ORkIGJmZWgm4WOqZyalYuLinyEbISFcYKhjHiFjYiIkpiVfJOjoZ6iiK6GfbWEjp6ce6WWeqmBlZyPiqCcfKdod21+mXShc3F8noaZcJODrn2kg6aemoCjb16oZ3WjY2+lYZzTkHx7mXhyc2OihZB+o3Ojj3VrkLOMYIKYiXOqsqi8f3eDbX6+pqm0XpxufXGXboBzonJdpGdzpmFopm2b1Jl9hZtweXqXa5t7eJdzbqmkZ2BleXCAhGtnZmRudndnYGNTW2ZRUWJJV0lUYFdTW2VqXGVRRkNLTUpLQkpFOFBAUU5XUllPU1FgZmVpU2N3eXdJRkVjXmVaaGlUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5t/satUXEt+qa+xtLCzo5uZhZmooKCkjqSooJipipmYmJOZk5KgmI6IhntwfYRofY+DlJqBd5GOj4lvf4aPk5Jsl5N8iJGSpJaDjqqalJKLhYl5g3eIgG6Cn4d3gJOGiJmil3uUoqSan4mzoaK2i3qsp6SupXCogJqQhYCbkXukgKGZhphynoSjrq+Kl4yAjKSNloOuoZR2tbW1yaFzlIqBn2Cdl6lteZWGoJt1oYd3oH6Sl4qAb0xmo5Jwm4dypHt5dGGDgmt+oGtxZGCccn50l2l6abO1tMamc5h+ep1rnJurdYSbbXV3mGmaenWYclBFfbReanZreYhmamhidHVwblZeVFlpUFNoSVVMWVNVXWhrblZnV01LQUpNS0hKTkFRS1BlY2ltZXVzc395fG51iXt7VFBObF5oW2tpUmpoaWxnbGZjZV9cXVxeaWJkaWt7X11kaGNqZm9tZWlsZaGciK+mhGY/lKGzq6+vtqKikICXqaKipYylp52dpoKal5aNl5CPnJOOiIN5anmGZYOMf5egeXWPiYyBaYSFkoOMhZ2NeoyKlaaTg5epmIyRi4GJeoB9i3lwkKGGeYGVh4mWoJZ/lKWonJaWhGZueJxsomR8caV3m5hwZ6aAlot7pHqfloOXcp52gYqUlo+5bpCKomJ9maGViG1yaatqdaBtbqZfmmmLkGiWh5qVdaKAfZpgjIaMdG+IYmigZZ5+aZp1b2NmiIJtcqJaX1tjoW1diYxve35zcmSlbXeiZGenaJlzjJlvom9TiZBvoF9lqFSLXlSYbm1za3KCbXBpa3lza29SWVdXZlpTbUlYT11JWGloc2pZa1ZRUkVWXExYUmFVaGpfd3R6fXB8fHKDe39zdo2AhHZeUXJiZ2JwZ1BqaGhrbG5oZGdfXV5dYGtjaml2dV1cY2ljampzbGZrbWOcpJimemV0bYunrqSpsLGmn4uAl6udn6WMoqGaoqKAlpiTjZqPi5iQjop7hnGAiGiLi3yYm3N0iX2Qe2SCh5WKiZWZgnyIhpaokIGirJGGkIqCin6AgI5zaI+lhH2GlI2JmKCOiJOqp52JpniWm3+kiJaMspiekIKvl5+ld5SHeal0pI6Emm6kooyShIyDu259pa+ChoaGk5acn3ylenGolaCWZp5+b6tjloqVkneobKmigYl1h4J3q5Gmh2qRsGt2s4ypa4qGbW2fnpKVYX+ri6p2f3+MpZ52n32EpJWdoGqbiHesZ5+tjbZ0d76NpJNZg6aNq2F1cnRwfHRxY2p+bmhsU1ZbVmFiXWtNXVJdSV1tbXZgW3FZXGBaZ3Rlbm9xY3F0YHh6fnlyeYNzhH6Ae3uMgYKAdmJ4ZGNtc2RSa2dob2xyamZpYV9eXGJrYm1se29cXGJpYmxqd21nbG5ilaWqnYGAnqSWqaqdqKeupJmJg5irmp6kiZqlnamdhYyajoackYWSjYyNdIZ6iIRvjYR+mJN0dIZykoNtf4uSh4aTj3x7gYWYpo5/paaOgY6JhZV2goeSb2yLqYGDi5SOiZyfiY2Uq6Ogj4B1lJaIfoF5lK6jf4GbcY+FeI+Kg357cqaMcX19epeWm4SOeHt+foeUlZOKdpCYn6CDen2Ja4yFW3l4cnpwaG5+kolxf3SCj5STcYWDgmWMf16Bf4t3dXOUdW95bm6HbYSFXnZoeI5lgIGFjqmbfXR8lmqJiG+Adn2Gdm1tZ4xzeXuYeIVba1h5j2lud3Jxb3h4cF1shm5qZ1ZaYFddZWtjVmFVX1FfcHh5bGt2ZWpranZ8cXJ0c2FvdWJ0e4F4dXqDdoCAf4B4i4WDfXttf2xkeG5eV25naHVreGppamRcYFpjamVscXVuWltia2RsbHltaGxvYY6UuKimi6GimqakmaWcq6KhhISYrJKeoYmappupmIOBm4p+lpOHjoqJjXKDfI99fo+Fe5eOc3KEcJWFe32Si4aGkIV4fn+GmaSOfKehi4aQkIWWg4aOmHdyhamGjpKdkIienoiMm6ifoKqDiY2Umn5+iZatqI+Spo93b52RgnmRb32ohXB9lXFrcH2Bn4x/k46MaG1dg4uMnJuejnOVi4hxdGuBdnSBWXJuh5GBfX6Mal1qZHqFg4iAX2l4ept7gouCdYGGgmd3ioZrYXBygnZfcouBiY+mlYVmjI+DbneLhHGGj3pwZmdke4N6lltcamdudlt7eXd1bnNzgmZcbYprbGNZWV5bWWxxXF9hWl5dZnR+e3VvdGNra2p7fXJ7eHRkbXRobXx+dnp8fHp6gIB+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hsa3FybVdbZW1sZ3N5b2hqbWCLi6mwoZCjoZqenpiemaijon6DmK2Nn5WIm6KRpZV/e5iEfJKZiYiGh4pzfYCLdoWLgYSWinFvgHKYhoR+k4SDhoqBeoCDi5ugkIKnooh4jpiJlYuLnZeFg3qtgpGYmZSKnp2HiKGrn6Kio4uHk5uco5mWqqGnpqCSm4eVjXt3jY6Ep35/kpGSk5yyppuVnpCNspOYhKWMjJWbn4mQm4KIkYprfI13eGWChpCKfImdhIeLkIiIgIWEkHd8eXSaoYiGiZ6KhJR+fYuBgXVwc4WDf3eHh4qQppGEhY2Hg42QjH2Ii4mQgndsgoR9eplqcmhhdIpwfXp3dm92dIFdXm+HaG9gXlpcXVNoclVjXFxhbGh1fHxzb3Bka2ppf3xueX9xaXBwbGaAe3KCgHh/fX+Fe22CjIZ8enh8fXqDeU5kdmpybXB6ZGtlYmJgW3RmcGZycW1VXWx0bWl5enFnaWtljIeduZ6XoqGYlZmYlJmkoZ58f5qrjp6NhqCci56WfXmUg3uOmYmGhISGbniAgHKBh36JlIRta356l4eEg5B/gIaEhn2Gg46bnZKHq5+DcoqQhpORjJ2RfY16qoSNkpiWj5yXh4abpp+imp2Gg5GamZmQmqagpZ2dkJaAkIp2e4eOhKV7fI6QkYaYqqGdk52PjaqOkYCejImTmp6Cjpd+ho6Db3eFcXVhfoKPhnWLmICDj4KGhX6Fg5RteHV0kqKKjIWZhYSNdICJfH1ycnuHhHt4i46EkqaPhoOPgYSKiop3hoiKjHxva36BfG5obG1nXnp/aH17dnR2dXt3XGBwfW51YGNbXV5RZ25UZVteYWtpdnp+cWxsZGtqaICAbHOBbGx0b3lvhXlth4B2goB+hXZxgo2Ifnt7fH97gopgaXtqdWhpgmVqY2BpXGR1aG9idG1sVWNxeWVwenpyZWptbYuJnreaoaSfkpGWl4uan5+ee3iep5GcioellIuYmXl6jIV8iZGDjIKCgm58f3hzgYV9i5F9a2h9gpiJgYiOfH6GhId9j4GQm5uRiKedf3CLi4yTh6GhioWNfKiRiJCSl5OWk3iMo6ChnZaaf4GQmpiSjJqjoaOal5Gbfo2FeICDjoegf32MjZB8mKSgoZOZkI+mjZCBm5GJk5ebfZKSfoeOgXRzgnB2YH1/jYZyipV8iIxxjH+ChYaOaHdxeIyYkY9/ln6HinKBhnx8cXl7i4R6epGMg5alk4uGkHyGhoeFdoKEiYh6ZXJ8f3h6cWxqZl5+c2h8dXZ0fHOAal5gdHZweGRjWV9eUmtoVGVZX2FoanZ4gXFma2RsaGaAgWtufmhvcWt+eIZ6a4yBc4GBfoF0doKNhn58en+BfX+PanKDbnNpYodobGJfcVZ0b21uYHhobVdqdHZjdXt6cmJrb3mJjZ6ykaSlnY6QmI+GnaGbnXx2paGOmICMooqImpZ4e4aHfoOJf4mCgX9xf3t0doKFfoqReGdjfYaXioKKjXh9gIyDeZaBlZiWjZagm35vjIKRlIamm4eNiYSmlYWTi5aXk5J3kZ2hoZeUl3p+jpiXjpaanaSdmJKUm3mPhYJ3hJaNnX6BiY2Mc5ejnqGTmY6PooyMg5eYg5KWmX6YjXyIjYF2cX1uemSAfIqFcIaSf5CCbIeCgYCJhGV1b3uHkpeMfJN4i4l7f4Z8e3F+d4mFeYSQiouXopWChIx3iISDgnd8goqGdmB4eH10fnhnbGRhf2lqd3N0dX1xfGJjYXNudXNtYVphXltsZVJjWGBhaWt2eYZxYmpjbWVpfYNsaHVobG9pgH2BeW2QhnGAg4N/dHyDjIGAfnqCg358kG12iXR0bWWKbGpiY3VWhGlxbmB4Z2xianZwZnl7eXFfcmyGhY+crpemqJ6NjZeHhp+Tl5l9eKqdipl6l52LjJiQeXuBi318g3uAg4F4dHl6c32AhH+Ji4BkXn2LlYd/hYd1fX6Kf32YhJeUl4ykoZh/cod7lJKKp4+MjoqToJKDkpCUl5GLgY+YoJqSkJFzf42SlImdnZ6ml5eNlZZzjY6Ka4WXj5l6h4iQiW+XnZqjk5WKjZ+Mh4KSnH+TkpWGmYh8iomBenF5a3Vse32Lfm2FkoKUd3CCg31+in9kcml7gJaXhH6Nc5CIg3iHfnZ4gH2GgHyDjYSMlKSPeYSCdImHfYB0doGJhG5he3V6cX1vYW9jZHtibm92c3h3c3RhdV9vbHVub1xbX15ea15QXVhjYWhtdHuIa19qZmpjaXeIbmZsaGpsaIF9e3dvkIhzgYOEfXSBhol6g316gYR9fY5yeot4eG5sh2toX2lyYodocm9mdmdubGF5aWt9e3hwYXhti4CZmaqgo6ieiouShoqei5WYfXeumY2XfZ+UkZaUiHd+e4p8e4B2d3+AcHR0e2+FfYGAin58YVx+kJKGgISEc3qAhnqPkoiSkZyTpZyVgn6BfY6LkqSJjoqNmJqNhpGYk5aPioiMkpyTkIyNboOPj5GJnpmioZeWiZaRboiZhGaFmI6UeomFkItwlZqUopKSiYuajIJ/kZ59ko+Si5mOe4qEh3NydWtxbnR7i3RuhZCNknF0gHuBgYh8ZHBseH2Zk32EiHSQioBziHlvgH2AhnyFjImEjJWojHuIfH6LhXh+cXCBhoRjaHl0dXB8Yl5wYGt0XnBqe3l4bHNwZXhdbWxzbXNYWl5fYmtaUFdYZWNncXF/h2ZdaWhnYmdxjm5kaWdkaWiBend1b46FdIGCg3t1g4mFd4V8eISFeoCKd3+Le3tyeINqa19waHSAa3JvbXFnb2xlfGNugHl2cWx3d4p+opehqKCmm4eMi4GQnIeTnHWBqpWTjoehjZaTkIB0e3aFeHl/cnN7hWtycHptinaAgYducVtZfpKNiICAgHZ1gICAoIaQi5KdmKGUmHiKf4GNiZyeio+GkpiWhYmVmY+Wi4uNjY2dio6Qg22Ji5CRiZyWoZyYlYWXiGmEo4JmhZ2KkX6Lg4uBd5OYkZ6RkImJlY5/fpCYfJGNj42aknyKgIJudXBsbW9we4Vpc4OOmIpwd390goiCeGZyb3WBmY58iIR6lJF5doh0cIl7hYx6i4aDiY6bo4h8hHaCi394eG9sgYSCXnJzcnFweFpecGBwal5van16cG1tamx2YHBvanJtWlhhYWJuWFFUWmZnY3VwhIJiXWttZGJma5NuYGZmX2drgXVyc3CLgHV/g4B4dYCLgHiFf3eHhneDhXyGjH97dop/anFjfGOGfG9xbXRqaG9sdnhfcX95e3R1dICCfqSVmq2eppaFjIR/l5SDkJ91i6CUk4aLm4yVjYt6cnh0gnByhXRxdYhrb211bYh2g36AbW5VUYGrlYeCeIB3c4J6gqCCkoKTk5ickpp4knuDjZOkmpOOiZWZkoSHl5mMlIuJj4+InoSQinxzi4WJjoicmp+alpSAk39ohZyHZ4Wgh5KDkYOJcYORl4+bjo+MjJCNeHuSkHqOi4yRlox8iHyAa3ZqbmtrbHp/YXp+jpaCdnqAeIOMfHlnc2x0h5WLfoiGe5OQcXqEcHaMeomMeol9goyQnp2FfHx3gox9d3FqbIKDemB4b21scnRWXm9icmBfbG55cGhvZmZzdGhwa2F3ZV1WZmBgclNRTlxmZV15cIh8X1xocmJiZWaSal9oZFtncH5wa3B0in12fIWAdHV/jHl7hoF4iINzhoV+jIyEe3mVeGZyaoNgiH5vb2t7YGpudH91X3R9eIZ4dHOFfHigj5mwnKWPgop/g5qIgIyff4uak46FiJeOjo+EdnR3c4Bwb4V0cHGDcGppdm6Dbn18bXVzUk2C38iS1pN8cHWDdoOfgpN3lJGZnJCZe5RzhZCfoZOTkIqTm5SGfpaWiI2NiJGMiJx/joB3eox+iIuKnJydm5WTeo12Z4mSh2yIo4SSh5eDhmOMkZmOlYqXjI2Ki3F7lIh7joiKk5GKeoV8fmx7ZXJvamt5eVyAeZCOgXp9fn+Gjnp6aHNqc4qOiYGFhX2Vi2t+f26Ai36Lh3yEeoKPlZqainx2eIOQeXNtZ3GAhG1qdG9oanRuU15vZHBZX2tyeGZramJmeHJvcGNfd2BgVmtfXndQTkthZ2NdenGJdFxcZXZgYWVlj2RgZWJYaXNzbmtxdox9dHmGgXV2fotzgIZ/e4l+comHgZGKiHx+mHZlc258ZYd+b3Brf1psbnl5c2F2enuNdnN3ind5n4ubr5ugkIKFd4iVfn2KnYeFn5GOhYyXhJOOh4F0d3B5cW6Eb21ufnJkZHhxfW15fWpobGOkmsHcru+hc2x1hHaEooWSb5aQlaCVnIGScYaLo5eJjpWKkJ2Wg4CVkIWJj4CRiomWfod6dX+JeIaEjZybmJmOj3aKdm6GiYt9iqOEkYmdhYVei5OXio+JjouLhIptfJaBfYiFiZGPhnaFfX1rfWR4dWlueHNYiHqShoZ5foCAhYt+eGZzan+JjomCgoCMloVrgXZuiJCCj4R+gXp/kJWTmZB0c3iIjXVzcWd1eoNidG1wYmp2Z1JgcWdsVV9udHlhcmNfaH1wcm5bY3JgYlduWlx4Tk1MZGdhXnZziW1cXGR5XmBkZoVgY2JeWWpya25rcneMfnR3hIF4d3uJcYOEfX6Ie3SLiYiWh4x+fphzaHVxeWyLem50cYFXcXp2eXFld3mGjGl3gIlyf5yHmaeco5KEfXCMlHh5i52EhaGNjXuWjX+ZiIR7cndwc2pvgWtpbXx0XmB4d3txdXtnYWV869q1ycPciHNsdIF3ipqIjWmYkI+dlpOBiXGFiaCNhIuVioyYlHyNk4iDiY97kIuFj4J/dniDhHKHgpOblpSYhox1h39whIKJh5ihg5SMn4OJYYOUj4eKhoqNh4GHaX2Uf32DhImOjoJxhn5/cXdodnJpc3dsWox8koKGfX+DgISJgnVhc2uIgY+KgX5/kpB9bYJseIaPhpKDfIB9gJGTkJaIb3F6jIZ1bHFscnmBYHRpbl1rdmBSZXJpZlNfcHZ0YG9gXWiCcHJqV2doYmlYbVZcdU1LTGVnXmJyc4VpW1xleV5eZGd7YGRfXFlrbmZvaXN4in5zc4F+enZ6iHOFg32Ah3Z3ioaOmIGMgXuTdmx3dXl4k3RueHt9WXqGcYBvZ3h3koJkdoaFcYqVhZmhmqKKh3Rvk4tyd46cfYqaiYl8n3+DmX+BeHFzbm9kcn5pZmx3eFteeXt7cXGAamFnYX/Vto6Qp3hvcXd8cZKQjIdqmY6JnJKMhntpiIuah4GSkYaHmI18jY2BgYmNe4+NfomFenR7gnpwhoCWmY6TlIKJdYOGdoN/ipOcn4aVj59+iGGAk4eFiISKjoB/g2d9kYB+f4KMj5B+bYJ8gnRrbXZ0c3Z1a2KNgY9/hX58hH6Dh35vX3JwhXuOjIF8fpGIenCDZnmDioaLg3yEfoCUj5CShG5veox+dW5va2x7fmNoa2pZbnZaUmlyamJRYnJ4bGJlXVpqg21zYVtnX2RsX25UW3BOSE9nZVxnbnGAbFtbY3NgXGNsd2RlXV1abGxibWp0d4Z/cW9/fHx0eIZ4hYJ9gId1eYmBkpZ8iIZ2iYFwd3l7g5NvbXyBd16Df3SBbWl6dJRzZ3OHfHKRkYOan5ughoh2dpV+bXaUl36IkIOKjZp8i5p2fXZxb2xqYXV8Z2JpdXpaX3h8em1xf2VkaGdXnY9ecXOXvMWEdnGUiZB+cpeMhp2TjIh0a4mPloF7lIuBhJuMfIuGfXyJjH+UiHWJhXZ2fYFxdYaBnpSGlY+Dg3F/iHSDe4mYnJeGk46dgIhlfZOCgIaEiYlygX1nfYt7eX9/h4yPfWmAfYN2Zm94eHN2c2xqjYWKgYp/eIKAg4J/al5xeHp9jImFe4GPgH5ygWl4goeLhYR5g3yBmIyPjH1ubHuJfXd0b2lofXdlXXFjWG9zU1Nuc2lhTmZ0eGZgXVxYboBuc1llYl1qbWBwT1lsUkRUaGFaa25te29aW15tY1pib3djZlxdYGtqY2xpc3aBg3Fufnt/dHWDeoOCfIGFdn6JgZaReIOKdIGIcnl5fo2Qb298gXFpgXl6fm1tfHaVa2p4hHRsk42Fn5igmYWIbn2Mdmp4mI9/goqClZeKeY+Wb3pzcGxqZGBzemlgZXJ7WmByfHlncHphZWWOsbJ3SmJapNrQl3J7kYuQeH6Vi4WZkY2Gb2yGkpJ6eZKGgYSYinyHf3h4iYqEloBviodxdH56aXmFg6WRhJONg39vfoN2g3iFm5iTipKQlIWHcHuSg32Dg4mDb4F4aICFeHJ/f4OLh3xlfX6DdmNwc4BoeHBvdJiMhYKKe3Z4f4N5gWpccH1ygIeFiH2GiXqIcoFucYOGjoSEc4R4gJmMjYR4bm5+hH93e2Voan1yYFl3Wllxbk5YcnNnYEpsdnRhXVtbWXR9cm9XZ11manBfb05XaVI/WWZfWnBrZ3lxW1tYa2VZY3B5X2hcXmVsaGZsaXF3f4dvbH99gHVwgXqAgX+Cf3aBhYmXinGCjXF7hnx6eYSTjHRqen9rb350f31vcnx7lG9ugH94Z5KKgqGZnJKChmeHhHBoepaJfn+FgpmKgXyNjGl4cmtsZl9hb3htX2JveVxkbIN6YXF2X2Vl1Oq+ijI6PouOgHJ5hYiOjXaDl41+k46Nf25shY2Mdn2Pf4WClYl8g3hudoaEg5d3boiEa3V7dGZ5goOnjIOPjIR9bn90doN5hZuQi5CRkoyLhn57kod4gISNg2yAcml/fnhtfHuBioR4YXmEgXFkcWh+bXRxdYGbi4B/hX5zdn2AcoBvW2x+dHiJgop7hn98iHh6cWyIg4+DinKBeX+Wi4p+dG1rdoCAdXZdaWl4cVlXfFNacWVMW3JyZVtKcHdvXFtaWV10fnRoWWJbZ2VuY2lNV2ZRPV5mXF12ZV90cFtZVW9kWWVweVpoXl9nbWdqbGlweH2ObGmChH95boB7fYF/gnp1goGMk4VwgItud36Ae3uIk4l/aHt+anR7coZ7c3d9f4x5eIR+fGuMjIObnZaMgYBsjn5raX+OjXt+f4OUgn99iohrdXFnaGNbYmdyb19hbHNhaHCJemFzdF5jZJugj25cNVmvtXVqgIl9koZ2hpeGdI+LindwbYWDh3V5iniJfZOIen9zZ3aIfn6Yb3CGfWh2eW1leYiFpYeBh42Kfm5+dX+AfIuZh4KTkJiIi4SJfI+JcXt9hXxpfm1rgHt6anp2goeAcmB3gX5xZHJndYJtdXuFlJGBfIF/b3d5fHR+bFdvfnZzi4GGd4d1gYl6eHJuiYCPgIVyfn1+koiJem5uaW2CgnVuXWhmdHJSW3tOXHFcT1xycGNWS3N4aldZWVphcYB0YF1dYGdkaGlmTlpoTkFhZFtgdmFcdG1YWFN0YVpkbnJXal5haGtnbWxpcHd8kmtohIl8fXB+fnuBf4J6d4CAiYuEcnuHb3F3g397io2Pg2p+e253eXaKd314gIKHf4N/fnpthIyImKONhIN7dox6a22EiZF5fXuCkYCAfoqDcHJwY2ZeWWdfcHBgYGdwZmpvinVhdG9bYWRqdnt/vpymo8i4cYWEc5R9eIaUgnSQjYhycnCEe4N0dYd0iHeUiHl5cWN3hnqAk2lyhHVmd3ZjanyDiJ6CgH+Pj31yf3OEeH+RkIJ4lo2Uj4eCiHuJiWx4eX51aHppa395c2l6doCDfWhgd4d9amt0aHt/aXaBi5CUfnp+fnB7dntzfmJVdnxycomDgnyCcIaJd3hwcIOCjH59eX58dY6FgnVpcWlsiIJycF5oY3NuS2V1TF5vVVRZc25iUE9zeGFSV1hcYXCCc1thXGhlZGNqZFBbcUlEZGFcZHFeXXdoVVdWd15cZW5oVmteYWpnZW9vaXB3e5NuaYiMeX5ze354goGCfHZ9g4iGg3B2g3Jud4KDfomLk39wgHx4eXqBjHSDeH+BgYKEeYB2b36Ji5qeiH2FeneHfGh0ho2Ren9/fImGhHaPgGdvbV9kXFhlWW1yYWBhcWxraIluYHNpWV5kbYB3qdqpx4aHsnGJeHCNdXuHj4B6k4qAdXR1fneAcHF/bYV0lIZ4dWxgeoJ5iI5mcYNvZ3VuW219gZCTgIF5kpN9eHtth3WAkIuDc5aKkY6HhYV7gIVtdXZ/bmh3ZW17dm1qdnZ/f3xhYniGemh0dWN9emd1ho6MlXt0gHVxgHp8bH9ZVnN9b3SDhn5/eGuIhnN5a3R/g4N9en14e3KLgHxyZ3RlbYuDbXRba191ZUhubkxbYldXVnhtYk9TdHZYUFVYXmFxhG9cYGNtZGNdbmJUXXJHQ2ZfXWZoXVp6Y1JWXHVbW2drYVZqX2BuZmZrcWhwdniOdGuOjHV/dnh+d4GDgXt0foOIiINvcX90cXV+hoKJjYp7d394hHx8hYd4h3x9gX6FgHt+c3Z5jI6fjYl6inZ1g3lefoaajHmHg3SFhoV3iXpibmxbYltbYVZqc2NgW2dub2eHcmFxZlddY2t/fMrOh7miam1timxxhHF8hIp+e5KFenl0eXV1e2ptdWOEdpKCd3BnXn2CeYuJZXGBa2pxY1hse4aciYOCc5eUd357bodxgYmLh3GWjpCIhYuDe3l+cXFvfWdocmJueHFqbHF4fXx6XWV5gHdpdXhmgnZndIeLjZR8codpb36AeG18XVhxfm1zf4p7gW5uiX9xdmd3f4F/gXZ8cXp0hnx5cmZzYW6LgmxzWGtfd1xJb2tOV1ZeVFV7a2FPVHVyUVFUVl5idIVoXGBramZiWW5hWGJwR0FoXWBmXl1Ve15PVmRwWVtqaF1XZ2BfcmZrZ3JncHN3hnhulYp0f3p4fnmCh4B1c4CGhY6CcHB7d3d1eoeGh4yGenx/dYt+fYWEhId/fn59h398eHV5d5GTn3+MfYttdYB5ZIOIl4ZzkopvhYWBeoN0Y25qWV9bXV1UZ3NlYFlkcnJngXNia2VXWmBpf3e+rnuft25ic4ZodHxyeoOGen2Mf3h4c3Zve3Zlam5hh3WOgXNqYl5+eHmKg2ZxfWhqa1pWb3iKo4GFf3GZk3GAeHWBbYCBkIdylIiMh4OIhX15dXJvaHlham1gbXZqZ2tsend6d1tnfXx4ZXJ9boR0ZXWFjIaVf2+LZmt6g3RsdGJcb3xrdHyLeoFmdIZ9bXFodX54fX9yfGx6eoF6d3BlbGJtiX5tblZrYHdWS2prT1JPaE5ZfGhiTlV1akxQVFVeZnaDZl1hcGhnYFdpXVtraEpFalpiZFdZVXlaTldualldbGVcWWVjXnRmbWRxZnJwdIB3cJqEdn9+eH98hYd9dXOCiH+Vgm5zeHp6c3OFh4mIhHiAfXaPf32EiY6EgoR7fouDe3d8d3eanZd6ioOHaXd+fGyEhZSAco+CcYaCfoJ/b2ZsZ1ddW1xbVGRwZV9YY3N1aXVwZGVjV1xcaIBwb3KAc4lkZXh+aXR2c3ODhXiBhHl3dHVua3twYmhrZ4Z0jYRuZl1ffW97iX1obHdmaWRVV3Jwjad8hHx2lpBzfHN7eW17epCEdpd8h4aChoN9dXBybWd1XW1oX2x1ZGdmaXpve3JZZ4F3dGdwgHiCdWJ3hYp8lIBui2pteoBwZXJlYGx5ZnJ2iXt9YXWDdmlrcXR6cHl4cn1mfn9/eHZuY2VhbYZ8bWtWa2NxU0xpa1BMTnBHXntmYU1VdGNKTlNXYGp3fWVdZ3NpZV9WY1dhcF1MS2tYY2FVVFVzV01YdWRaX2tgXFpjZV93Zm1icGlzb3J+dHSZgXd/gHh/foaEen12goR+mIVucnR7enRxhYWPgoB6i3V0kX99gZSOgIWEfH6Mhnp+gHZ7o6WKeYiGhWx1fHt1hIKMem6Fc3qFfYGDdW5qaGVWXVtbWlNibmVbWGF0e2pobWhfYldfW2mAamtvgGdsYWh5eWt0dHRvhYF6f312dW56aGp5al9lbmiBd4+EZ2VYYndpfoZ6b2lvZmZdVVhvaI+ndoF6fJCOeXVvfm9ydXmOf3eUdIWCf4WIdWpydmdob1xtZV5tc19nYWp4aHttW22Dc3Npb4B+eXdhd4SEeI+Ec4hxb3l/cWJwaFtudmRwc4h7eGFygHBnanhzcWt3dnR3Y4N7fnd2cGRjY258fWtrVWpjZ1NLbGhQR1JsRWF4ZWFNU3JdSk1UWWVrd3plXm1waWRdVl9Vbm5XS1NoWGZeWE1VbFVLXHlfW19rXV1bYmVgemhsYW9vdW5vd3V6l313gIF6gH+Hhnp5eoN+gZOEcXR0fnp3dIWIkH2AfZBsc5WBe4KfhX+HfYB+hoKAint2hKyff3qIh4RscoJ6doGAgXVuh298gHOJgGpvbWRkWF9aWlpVYmpnW1pfdYJpXm1sXGFWXFxrgWZydH1pal1rdnZodHdyboZ7fn15dnJtemhpd2ZdZHJneneSgWNjVGVvZoKEd3ZmaGlgV1ZZaGSQp25+eICLjnpwcHxmeG55i3p2jnGDfX5/hm5kdnNkaGhdbGJdb29bZ19tdWV6aF10gG9ya3F7fnV1YnSFinqHhoB/d3J1fnRhcGxZcHJicXGEe3VkcoBsYWx6b2poeXd0cmaFdXp6dXFkYWRuc35qbFRpX15UTHNjUUdXYkdidmVgS1RwWEpMWFhna3Z6ZGVucGZjWlhdWHZlVEpcY1hoWFlJV2VRSGJ4Wl1fbFteXGJkXoBpal9vdHltb252g5d5coGAfX+Ii4Z9dnaGeIeMfXN1dYF5enqCjI59foSJanSWgXuKnX1+hXmAen58hohzcY+ujHt7hpB+ZnKIenR9fXZyb4Zse35sj3picG9hZV5lVllZV2Nma2BdXXOGaVhwbVtfV1tcbHtjcHd2bGJbbXN0Z3V2cW2FeX+AeXdub3RlaXRlW2d0ZnZ2kXpfXVJmZmqCgXR9YWNpXFRYXmJjkKVoeXSChZB4bW55Z3dte4R6dIhygHh8eH9oZXZtYGZhX2pgXXRrWWVdb29iemVbd3xrbm5weHh0dGRyg5J+h4KIenZvcX1yYXdkWm5vYXBxgXxzZXGAZF5udmljZnl6dG1ugXVzfXNxYl5mbm99ZWlUaVlZVE54X1JKWllIYnRjYElUbVRJTFpWaWxye2JsbHNiYVlaW2F2W1NLZF1YaVNXSFlgTkdpdVheYW1bW19iY12FaWhhbnh5bG9rdoGQeG2DfoCBkoiEgXZ1iXSMhnNxdnaBd3x9foyPgH6TfnB4loN9mZJ5gIB4eX5/c4iDc3CZont6f4mVeWR1iHlzeHZsdG9+bHl8cJFyXnBuYGdibFRaWldoY21lXFxyiWZScm1bWlhYYGx2ZGl1ampeWm1zcWx0dHRrhnx+gHx3b25sZGlxY1trcmR0do9zW1dUZGByf35yglxhY11TWmBcZJOfZXJxhYSRdGxqeWxvb3p7e3GAdn9yenp6ZGV1Z15iW2FoXF53aFdiXW9oYXdhW3x2amlyb3d0c3RocIGUgoZ+hHZyanB7bGZ2V1xqbWJwcoB6c2VvfltgcHFiXmlwfGxsdH5ycXhrcGBcZWxte2FnVGdVV1JQdltTUFpSSGNzYmBHVmtRSVBaVWtra3xlbW9xYFtaWFlscFdSUGZXV2hTVEZaXE9IcnVYX2NtY1hhYGFejGpjZG15eGtvaXV5hntrg32AhZl8goR5fYhuj4Zxb3d6fHSCgnyLj4OClnR4gpSFgZ+JdYGAgXR/gnCHgnVvopd0e4aLh3tmeItvbntvZnhwemxzdnONa150bmFnZWtTXVtVZ2JsbFtccYxkTm9tXFZYVWdpdGhidGVlXVpudW5wdXV6bId8f3yId5BzY2Vrb2Fcbm1jc3iHa1pUVmNjd3x8cIVcY19jVFtgWmOWlWNucIOFinNqaHpuZXJ2c3treXR1b3p+dV9mcmNbXldiZFlhdWZVX2BtZGFxXV1+cGhpc3FzcHV1a22Ek4GIe4VxcmZufG9xblNaZWplcXOAdnNibHZVYnFrW15uZXxlbHV8cnJyam1gWWRqanheZlRlVVZQVW5YUVdUUEhlcl9hRldqT0hYVFZtaWR8aWt3a2FXXFVbdGNTUldpUVlmVFNIWltQTnh3W19mbGlaYmBeXo9uYmZreXVub2l2dn9+bYOAfoeXe3+HgYp/a5OIcmd0gHt1gIN9iY9/i5NyfYqRhYefhnt/hoxzgIZzfYJ1bqWMc4GNjHd4bnuNYGR8cWZ6c3lsbXF2g2dkfGxjZmdoU19fVGdgbG9cXm6OaE1pbGBVVlNvZnNrZXhkZV1ZcHRtcnt4c22Ie4B3nHt6bGFlbG1eYG5qZXB5fmdaVlhga3h7e2+DXmJeZ1ZZYFhknIhia3GBh313a2p3bFt2cWt5aXVybW97gHJYam1fWV1WYmRYZXFjVF5haWJibFpgfmxma3N1bm13dmtohYx/iHqHbXFlb3tscWxiWF9oaG9zgHRzXmltU2VwZVVibmF5YnB1e3Vrb2xqX1hhZ2h1XWVWYlZTTllmU09dT09IZW9dY0dZaU1JX0tYbWRfeGhufWRgVV5UXXRbVFJgZk5dYVRTSlxaUVp1dV1fZm1oWGJhW16OcWNnandxc25odnN5g3OCg3uIjX58ioeOem6QinRsc4J0f3+IhYeShJWPen2Mj4iRm4SAfIyEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fX59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6Ojo6Ojo6OjY2NjY2Njo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY2MjY2Njo+Pj46Ojo2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA+LjExMTEvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREVCMS8wMDAwLlxwbm1ubnFJLDAwLy8sSYWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMjy0aHR0dHBpohoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1NTMeHBwcHR0bU2pnZ2dnazwYHBwdHRg7g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYeIiIiIho2QkJCQkJCMh4eIh4eHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWGhYODg4SEhISIioqKiomJhoKCgoKCgoSKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46SkpGJh46KkJKTkIqQjY6OhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ojo6Oj4+Pj46NjY2NjY2Njo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCMiIiIiY6IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJGNiI2JkImLkI+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQj4eNjImPho2Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5/fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yMhIuMiY2Gj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx7fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2Ii46MjYuOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt7fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7ent9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp7e3x9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXx8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYSEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t8fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t+fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjpCPjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlZWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSUk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OTkpKSkpOUkpOTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKSkpGSkoOQk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSkpKSkouKkpKNepGSkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJGSiHeRkoR3j5GRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+LboqRenWMkI+Pj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Pj4pogI92dYmPjo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNiWl3jHV1ho2NjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eAaG2BcXOBhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ1dXZ3dWhgZ2BkaW5naGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhmX2tsYGpoaWdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3Z5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWlxjdG1lcXBlXVpZX1tYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3l2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NUmhwbGFwdWtUUFFUUFBOTk9NS01MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU5UZmxuY29zcldOTk5PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRkJFSU1haGtxcW9uWUxOUlZQT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUFLT0dITmFoZnBva2hjXmNoV0hISklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+PkBUXlldaG1pbm1sampsbFZGQkRFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs8PEVZZmlrb2ptbWpqa2xXQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR1c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7OzxOaW5va21saWlsVUA/Q0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6ODdJaW9tcG5ra1c8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz09PTxKZ3J3c2xcPz09Pj9AQUA/P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dHR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A7XW5APkRFPz5HW3lyVEA8Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojttdkg4Ozo9PkA9Z1w5PD08ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlRPD09SUxFRnZ2TTc4ODo8Pz9TVTk7PTw6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3lJO11/g395fHdWPD0/PT4/QlVbOjs9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUhyeWtigoSDgoOAfV0+QENAQD8+WmM+Oz1BRUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARm90fYKCgYN+fYV1TEFDRUA/P1Bydkw/Q0VJSklJTU1LRURGR0hGR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFFZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXFCREVEQ1d1h4iIf1hHSEpNTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5+fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEimxBQVV0h4mHh4eIg1dITE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhIR0hGRkZISklJSUlIXW9vcXJ0dnd6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIg1VshYeGhoaHiIiHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPT5AQUFAQkQ/Pj9ERkhERUdJSklJSEhJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlWBg4SEgoKFhoaDgoaFhIWGhoaHiIaKdUlJRkI/P0A/Pz48PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oj9BQkBBQ0NCQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxMU2xwcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f4B+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJZYWEhIR/gYKDgoOEhIWFhoeIiIiJiYyOZkJCPjg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4ODs7Oz1AOzk5OT08Pjs7PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlqhoSEgX6Bg4ODgoOEhomKi4yLiomKi4yJVDo4NjU2NzY2NjQ2NzYzNTY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmaFg4GAgYODg4ODhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY6OTc2Njc2NTo5Ojs6Ozg5ODk4Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1d3l7ent9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhIaJioqIh4iIiYqKjIqJiYx6Pjk4ODs8PT45Ojs7ODk7OTo7Ojk5Ozo5PT09Pjs7PD06Pjs5Ozs8Ozw8OTk8ODo6Ozo5OTk8Pzw8QUJESUpNS0lLTFdvcnN1dHZ4e3t8fHt9f39+f359fX19fn9/f35/f39/f3+Af4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QUNFRUFBQUI+QEJAQD49PT5APz8/QD9APT0/Qj9BQT9BQD1AQEA+P0E9Pjw7Ojs5OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uLioqLiotePkNHSUtKSUZHR0RGSEdFQkBAQ0VDQkFCQ0I/QERIRENFREVFQkZFRkRFRkRAQj88QD49P0A+Pz8/Pj8+Pjo7PTxgcXF0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDREZYhYKDhIWFhoaHiYmIh4aGhoeJiYqLjI2MjIuKiohXR0xNTUtOSUlLSUlKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkBBQ0JEQ0NERENAPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/f4CAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT9CQkdHSVmFgoOFhYaHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTU9OTE5LSkxKSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDk4PDs7PTo/QD4/QENGSUlQX4KDhYSFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXJOUU9OTExLTEpIR0VKSURKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1VucHV3d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AOTo8OD0+Oz1BPj9BREhKTFVxg4SEhIWFhoeIiIiIiIeGiIiIiImJjIyLjIyLi4uLi19SUlBNTk1LSkdGQkdKR0xKRktOS0pKSk1NTE9QTkhJS0xPUVFQUU9PSkhKSk1KTEZHSEdGR0hGRUVCQUJCXG9yd3h5enl5eXp6e3x+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFhWUlJUUk9MS0pERUZLT05PV1VRUE9RU1JNU1RPTVJMUFNVVlJTUVBMSk1NTUtOR0dKRkZJSkRERUVCRENjcHV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdIR0dIRj5AQj0/PT1CP0NDRlZORk5PUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLaFdWa2FFUlFRUEk7O1FTUmB1XVVWVFZZWVJZWFJaZlBVV1pdUlRXUVBOUlFQUFFLTEtISEpIRUZJSUlISWlydnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUlHRkZFPz9BQUVCQ0dFREVMWFJNVFVWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUT9AVlVZXGRgVllicl1dVl1aVkVRWVpbWV9UWmdSVlZYVVRWVE9PTUpMS0lJTE1LT01Tb3N2eHl4d3p5ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLeW5wWFpbWlJUUlZWVFpadYNZVX2QYFxYXV9XSVZdXVtbX1lJWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKf2ZZWVxZU1VUV1JRV1ZjloBRZXJYWldfZ1BgZltbWFxnYUdPWmhnXFtcXV1XU05TUFBRVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTUtmeVtdVFlVVl1aTFRaVFNUXlpYV1dXemtYW1tcXlRRUVBJTk9XVlhbWmRxc3Z2dHR2eHl5e3t8fX19fn99fX1+fX1+f39/gIB/f3+Afn57eHd2c3V7f3+AgHRrfn5rcnleW1ZVVFJPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYmHhoOHh4d5bXFWSUtNTktNS0hKREZIRUM+VGNVf1JRUU5LUlRRTU9ZUU1OUVNVVU1RU1JQT01MSENJSFJUVVpcbXJ1dnV0dHd7enp7e317fX19fn19fX59fn9/f39/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlZUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDP0NDQ0NCP0RQQkNAQz5CSEdWQEhOTUddaVFIRk9GREVGSEdIQ0RIR0hLR0RCQURBT1FNU2RzdHZ1c3R2enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PT0xRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGCbE1HPj87Oz5AQD8/PmpRS2FFRkhJRUI/R0xNR01RVUlCRT8/PD08PT0/PT9BQ0NAPzw9Qj5KTUdVbnV1dXN0dnh6fHt9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSkpQUU5LTFFSUVRVVFdRUVdVUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hlQ0BAQj06QkNBQURCXF1Pe05PTk5LTE1PT1FMS0xXTUhHQEE8OTc3NTk5PTs7Ozg5ODk/O0JIP1xzdHV2dXZ4enx8fH18fH19fX58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklIUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5fZWBdXnF2a15gZ2t3b29sam9ubmxmYllIRkZIQkFHSUVFRkRNUk9hV1JXUVBTU1JVW09PUVdQTUlERj46OTY1ODc5Nzk6MzY2Nzk1PEI9ZXN0dnh3eXp7fX18fHt8fX1+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUxUVFNRUVVPTFJTVFdYVFRYUkxYWVpWWFhWWFldV1hYaHNrXVZhc2thYV9eZGFfXllVUU1PTkxJSEpLSUhGQ1FQU1tXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg1NzU3ODU5OUdtcXR4eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVFZYWFlTVlRMS1RVVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMUFJST01NTk5OTEpGUVBVWVNUTkpPT1VTVFxWUlVTUk9NTElISEY/Pj06Nzg3NjU5OTY3Njc1V3Bwc3d5ent8fX19fXx9fXx9fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwb2ZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0lHT1BPT01SSk9QUFBOTk9UTE1JUE9TVFUyPVhNSUFRPWNhUVNRUE5QUVBOTk1RTlRSUFJNSUxLT1FQUlJTVFFST0xMS0xMSENCQT06Ojg3NjtCNDU2Njpkb3F1d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdVUVNGRkFGR0dIRkpESEpIR0VITEhLSUZMTVBNRy9FX1I+M0A+am9hUlJRQEZVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PTw5PUc2Njc3RG1wdHZ5e3t8fH18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1dWWVlWUVFRT0A+Oz0/QUJBQ0BCRURBQEdIR0hGRkhKTUtFR0NPUkM4RU5TXWZTUVNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ1eXt7e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa25xbWltY0xPT01RU0xUVlRXV1VMTEtJPTk4Nzs/QD48PUFAQj0+RUhHQ0ZGSUdKSkBGQUFARkhFSk9IUFJiXFFQUk5TT09QTExPTUtNTE1PTltXS01RT0dJSENJSkxMSkZGRkU/QkM+PEJGP0I/QWRwdHd7ent7fHt6end8d3l9fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPjs/QkBAPkFESUVDSEdJRklFQkI/Pj1DQkFHSkVNT2JlUU1OTldLTE1LTE1NTUxLTk5TZE1KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLbm92eXl5e3t6e3p3dHh0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9IS0U/Qj05OTk6P0I/PEBCQkFERUdLRkNISUdHSENDP0I/P0BBPkRFQ0tOUVRMSklNVEdJSUpMSktMSUpMTU9QUlBLR0NMR0NCSkpMTU9NSUpJR0NDQ0RISk1MSVlybXd5eHp7e3l8dnJwdXJ0eXl2eGpxbmtsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhlcUhKQ0dISEdKS0lKS0RHQj0+PTo6OjtAQj89QkJCQ0hGSkxKRElJRkdHQ0M7QUBCPkBAQ0RDSU1QR0lLR0hLREhJS01ISkxISUpLSk1dUkhIRE5GQUNLS01NUE5LTUpLRkdHSk1OUU5MYm1pdnZ3e3l7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRvRktERkVHRUZGR0VHQkNAPTw9OTo6OkBDQD5CQ0RFSUZKSkxGSElHRkZEQjtCQ0M+QEREQ0VHTE5IS05IREhFSUxOTUhJTEdGR0lJTE5LSkhFTklCRk1MT01PTU5OTUtJSElPUlFSTlJmZmZxb3N4dXt6fGxoam5ma3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkNFRkVCQ0JFQERCPkA/Ojs7PTo9PkNBPkFDRUdKRklIS0hHR0dGRUNAPUVFQj5CRENDRUdISUdNUEpGRkdLTk9LRkhJRkVERUlKSEtJR0hQS0RJTUxQTU9OT09OS0pITVJVVVJPV2RgYW1ncHJvcnl6Z2VoaGRpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlckxIREVHQ0JAQkQ9QkE+QD06Oj0/Oz4+QEI+QUJER0tGSUZJSEZGR0VDQ0FBRkZDQkNCREVFR0dIRkxRTElPSkpMTElHSEVGRURDSUlIS0pHS1JNQk5PTVBPT09OT09LS0tPVVdWVVRYX15caWFtaW5ocnNiZWZlZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1anN1bnV0c3FyamtzTUdHRkhCQkBERTxBQEBDPDg5PT45Pzw/QkBAQERGSEVIRkZIR0VFRENFQ0RJRkNGRUJFR0VGR0dFSk1LSFFNSktISElFRkhJRkNJSklLTUtQU05EUVJQUVJOT01OUE1MTVNXVldYVlhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpb3pNSEdISEJCQkZFPEBCQkQ8Nzo+PTo+OkBCPj8/Q0VGREZEREhGREVDREVFR0pFRUpHQ0dIRkhHRUNGSkpHTUpMS0hKTEZJSUtIRUtLTExPT1JUT0lTVVNRU1BRTU5RTk1QV1pWWllWWl1aWGFgYGBeaGVjYGRmaGdpaWhqZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3VucHJzeU5JSUdJREFDSEU8QEVCRT04Oj4+PTw8QUI9Pz5BQkZDRUJDSEVDRUVGR0dHSUZIS0hDSUhHSUhGREhLSUdLSE1MSktMSExLTUtKTkxPTlBSVVZPS1VXVFFUUVJMT1FQT1RZWlpcWllcXl5eYGNeXGFja2JgZGdocoVoZ2pmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB1TUlLSEpGQkVHRTxAR0NEQDo8PkA/Pj9CQjxAPkFBRkNFRERJRUZFR0VISEZIR0lLSkZKSEhLSEZGTEhISEpHTExMTExJTUtNTU1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXF5fX2FgYWRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3b3ZKS0xKTEdCRURFPEBGRERDOz8/QUBAQERBP0I/QUNIQkZFRkhGSUZGRElIR0lISk1ISEpKSUxKRkpLSElKSkdLS01NSkpNTE5OTlBLT1BSVVhWTU5UVlRTUlFQTE5UU1JXW15eX11dYF9gYWFfYWNlYmNoYmRpamd2i2xraWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZvd0tNTExNR0NDQUQ8P0VFRUM9QUFDQkJDRUFCREFBRUdDR0hHR0ZKR0NHSkdHSkZJTEhJSk1LTUxHS0lIS0tOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BDQUVEREZCQkVHQ0NJRkNISkpJSUtHREtKR0hKSUlLSEpKTkxOTElMSEpMS1pmSmRcS2xTSE9OX25Va3NbcXBid2NSUGF2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpLSkZCP0BCPz1ERUZEQ0NCRUVERkJFRkhDREpFRUpMTUtMTEdHTUlHSUtIS0tJS0pOTE1NTExJTE1MW3NiZHBebG1VTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpyeXZrYmBrZWVteG1rdm1ucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRURAQUI/PkJGR0JGQ0VERUVEQ0hIR0RFS0dHTE1OS01NR0pOSEpLSklMS0pKS0xNTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtb3ZcWWxRXG1tWnFta29teHh0c2lwXF9ya3FqVXV5eHBjXmtmYmdwcGppb3BwcnNwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEVFRUJCQj1AQEZHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5HTE1JTEtJSk1JSkpKS09QT05NS05NTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkdFRlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJREVFQ0FCPEJAQkZER0ZMSEVDQ0hLSEhGSkxMRk5LTFNSTEdMTEhOSkhITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210Xm5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9uc3N2c0hLSElCRUVFQUA+Q0RCR0NISU1JRkNGSkxJR0ZKTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTU1NTElLS0tTa2JaaV5faWNyclpfWWpvX2VlVWtfY1thYVFgbGhdalxvamlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSURFREZBQEFFRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpGSEhLTUlISklLS0lISUdLS0xMRkhLS0xMTEtJS0xOVFtcVFBUTFBPTk9PVlFPT1FOT1FKSU5QUWVyaVRZV1xbXFVZWl1YXVxcY2ZhYWViY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNIQ0VHRkZBRUM/Q0hERkdESUtMSEZER0tMSERHSFBLTE9LTFdMSUZFSElKSElLSUxKSEZHR0lHSElFRkxJSktOTElPXFdeUFxbYF5PWFlTXFxiXk1ZWk1YYVJKWWFaU2BkXGFYW2RkVlZYXFlaWFxWWVxdYl5kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJFSUVHR0ZLSktIRUVKSkpHRUhIUEpNTUpNU0lIRkFIRkpJS0xJTEpIRkVJR0RGR0VFSkhDSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5eXF5TW15jXlpdYGNgWV9iW2BeW1RYV1leXWNiY2FjZmlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0dHRUhHSEtJSUlERktLS0ZGSUpOS05MSExOSEhGPkdHTElLTEpLS0lHRUlEQ0REQkdKREBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXl5jYWBiYmJjY2VaUVlWVVxaXWNgX19jZWJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQkVISUZHSEhGRkpHSEZIS0lMRERLSk1NTExISkpISkc/R0ZOSktLTUtLS0lHR0NEQERBSElCP0lKSE9dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTl5RT1xfYWNkY2NiXGRjYmRjZlhRVVRSW1haYV9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRUtKRkZGSEdHSUZGRklMSk5FREtKTE5KTElLSkhJRkJISFFNS0tPTUtLSUhHRUQ/RUNJSEFBR0ZFVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVZZYFJRX19hYmFgYmJgY2JhZGRiWE9RUVFbU1tdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FHRkRHTVJIQ1FKRkhISEVGS0pNUEVHSUpLTkxMSUxLSUlHREhLUU9NTVBMTUtLSElDREFFREhHQkFHRUNXVUVcVF5TVl9YTlRVTlpbTUpLVGBhW19YXl5hXU9ZYlxgYF9iY2JdYWJXX19UUE5PUFhSXVtbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERUZHRElSYlBDVl5JR0dIREZNSlBQRUlJS0tOTEtLTUxKSkdFSk1RUU5PUE1OTE5IS0FEQUNERkRDQUVGQk1IQktMUE9OTEZNRkdJSkhHTExNT1BJTE9QT1NQTFFTUlVaWVdZWFhkV09TVFBQTk1PVVRbWVlbXVxgYWRlY2dja2xwc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdHWE1HSEpIR01MUVFJTEtMS05OVU5PS0tMR0dLUFRTTlBPTk9OT0hLRmBFRF9MRGZjRU1bSV5bcm1PTVVtWUxDUGBVbFdnSl1XVV5ETFFVTE1UVlFSVFhXVFhVVFxVUGZaaGhkWFNrU1ZWVVtcW2BgYWFhYmBmaGZubGhyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1NJS0ZgVEhKT0pJT01SUUtNTExPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpRf1FJfFlZcnNYUG1IcW5vYVZQcXFzUENrc21xdHBTb19bblhdVlxYVWtoVV1WY1pgWVtgVlVXf2p0dXVfX3ZfWGFcXGZbX2FhYWFeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU5CRExMRkpMRlJWTEtOSUtSWFdRTk9PTVFUTk9RUEtLTkdNUFNbWlRRUk9QUFBKSFp4XVR4ZWhZUlRRdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZnp1eHFxenF+c31rdX1iUmd8ZXNzb3Nye3xvfXlvf3JfYGBiYVpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1IS0tISlBOTU1KTlZeWVVMUVNOWVpNU1NSTkxPSVFSVFlXV1BUUFBQUUtIZ3hsY3hybVpLTVV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclJpe2xpanp6fWx4en9waG9YdnZqdXVwgGByZ31pbHh8b15fX2JhW11iZGdpamRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdXpufH15eHJuTktTdE5DQkVQUEhKS0pMUU9PT01QWmBaWEtUV1BhXlJWUVlTTE9JU1RVWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUS2h4fXhgeXtzbmFebW9jUmdxdW5teXB3bHZ0dHFsbVx0fnprbXl8a3RtfGtwdnV4Xl9fYl5dX2RkaWdoZWVeYWJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRyb21MTFtWSEdFR1JQSUxNS0xRUVFQUFFXXFlVTVVZVWZYUlJZXlRNTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVS1draH1sbWx4YFtwenteYHpzY3JveHFoZXxpcnxdVEtsYHZ1a2l2fHttfnhrfHBdXl5iW19iZGRnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3NybGdtbXJ8a21oa3t0bW1rbU9ISktISUlIUVBMTk9MS1NTU09TUldSVlRQV1tWVlRUVGFgUE5OS1RTU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWFFOUFVUWFhYW1tVUlNXW1dYV1pPU1VXV1hSXVlXXVZUT1lSV1dXWFleW2dyXltbWVxdX2NaX2NjZGZkY2NiWmNjZmZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLTExNS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVhQT0xNVlRRTlVTTk9NTFFQS0pSUktRTUtLT1JVUlFRU1NJSExOT1FSUVFRVFZSWFdcV1NTUFFVVlZTWlFPU1JXVlRZVlRZVVRSVVRUVFdYV11aXmFdXFpaXFxgY1xdYmNkZmRlZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZWZtc2RpaGtrZWRjZmhQSktMT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYVFFQS09XU1BOVVBOUU5LU1BNT1ZUTlFOTU5RVFBVUVNUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdXV1lbVE9UVVhVVVpVV1lVUlJYVlVXW1laX11VWV5cXl1cXWBhXltiYmNnZmRkYlhfYWJeYGhlZmRhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVpZWFdYWlpYWVZcamRWWFlaV1ZUVFBLT1ZUUE9UUFBQTk1RUVBSWFRRUU9NT1NWTldSVFVVT05NUVNVVVRUUlRYVlpdXFpWV1FSV1hWW1tXUVRWVlZWWVRXWFVTUlhWVVpdWV1fXlZeXV5gXFxgX19fWmJiZGhnZGRhWWJgYl5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUVBVXFpaV1tbXFlaW2RxbWhkX1tZVlZYUkxNVlNNTlJPUVJPTFBTUlVaVVNQUExQV1ZSV1NTU1hNT1BSVFhVVVVTVVlYW15dW1tWUk9VVlZbW1dSVFdWV1hWVFhbVFNSWldWXF5aXl9gVWFcYWFdYGJgXWBdY2FjZ2hkZmBZY2BhX19lZF9gY1taXFtcWVpYWVdcWVxbYF5fW15eYWBfYlxZYFpRTk9OVlFQVFJPVVRTUFdcXVxYXlxfV1xeanF3eYBjXFtWVllRTk9WU05RUVBSVFJLUVRUWVpXVU9STlNYV1RTVFJSWk9RU1NWW1ZWV1RWWlhdXlxcXlZTTlRVVlxcVlJUVlZYWVNUWVxUU1NdWFpdXlxgYGBWYltjYl5hY19dYmFiX2RmaWRmXltkYGFgYWNlX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVUlFXUlRQW11eXltgXGBVXF1panJ9c2xnXFVYV1FPUlpTUlFUUlRVVEtRV1ZbWlpTT1NSVlZWVE9WUlNaUlRVVFhdV1hYU1hcWF5dWVpdVFVOVldXX1tYUlVVWVlZVVdZW1RTVl5ZXV1gXWJiXllgW2ViX2RkX15jY2FdZWZpZGZdXmRhYGFiY2RfYl5YWl9bXFtYWFhYV1taXGBcW1tcW1haW15WXlldUE9PUlpQWlRVVlZUVFReXmBfXmJcYFVdXmJreXVtfWxaVVlVUVFTXFRVVFVUVllXTFJaV11aXFJPVVNYVlZUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSV1JZWFlfWlpUVVZaWVpXWFlcVlRaXlxeYGFfZGNcXl1dZWFiZmReX2RjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9gYWFgY11fVF1fYmVldoJ7aFhZWVNWU1ZcV1dXVlZXXVhQVV1aXl1dVFNYU1dWVFNUWFJTVlRYWFhdXlhdW1ZdX1hfX1hdVlFZVFlaWmFZXFVWWFtaW1lZWlpYVl1eX15jYmFkZFxiXGBmYWRmZF9gZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWU1xUVldZV1ZcYGFiY2FjXl9WW2BkYV96dW9oWVxaVVdVV1taWVxZWFlgV1BWXlxgYVxUVVhQVVdVU1dWUlNVV1paXF9eWl9cVl9fWl1eWV5WU1lXWVpdYlpeVldbXFtcW1tZWllZXl9gYGRiY2VlYmRaYmZjZ2ZlXmFiYGNeY2NpZGRnX2deYmJjYWFgXl9YVFpaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU1BWWlZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGtmaF5cXVtWV1hZXFxcX1tZW2JWVFheXWFjXFJWWVFXVldWV1ZUVlRYXVxeYGBdYVxXYV5bXlxbXlhWWFhbW19gXF9YWV1cXV1eXFpcWFtfYV5gZGNkZmZmYlljZWVoZ2ReY2BgZWNdZmlkZWlfZ15jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOUldZVldaWFtcWFdZXmBiYWVhZGFdXlliY2JfYWBhXlxcXFdXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFhXWFlZV1ZYVl1dXmBhYF9iXllhXV1eWV1eWVhWV1tcYF5dX1paXl1eXmFcW1taXGBiXmJkY2VmZWZiWmRmZ2lnY19jXmFmZFppaWJmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWFdaW1pZV1hWVVtdXV1gYGJieExXV1xZV1xbXF1aV1xdX2BiZGJiYV1gWGJjYmBjYWJdW1xbWFdbXF9dYF9dW2BkXFxYWmNlY2BSXFlPWFhaW1paV1pZYF1gYmJgYWNfXGJdX11bXl5ZWVVYXV5fYF9fXFpeXmBiY1xcV1xeYGJiY2VkZ2VlZmRcZWZoaWZjYmJcY2dgXGlpYmhpZmVgYmFjYV9gX11dW1lcWVhXWFlYV1xbWldXWFBYWl1hY2Zmcmt/SllXXVtaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGNjYlxbW1pXWGlxYFxgX11cYWNfXllZZGVkYVNfWlFZWFxdXFtaW1tjYGNiY2BiZGFgY15gXF5eX1pYVltfXl1hYV9dW2BhYmViX11UXGBgY2RkZmRnZmVmZV5lZmhoZ2RkYFtmZ15haGhjaGhmY2BiYGNiX19fXV1cWltZWFhYVlpWXFpaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t8e3p6enp6ent7e3t7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYmJjI2NjY2Ni7DBvr6+vsGiioyMjIyNiX5/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjI2PkJCQkJCOu87Ly8zMz6qNkJCQkJKLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh5eHh4eHd3d3d3d3d4eXl5eXl6d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fX19fX19fHyAg4KCgoKCgHx9fX19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKDgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ1dXl2dnZ6e3h7eHd2eHt4eXl6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3p6enp6eXl5eXp6fHt8fHx7fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHt7e3l8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d5fHp7eHt6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3d3x5eXt3fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6f3t5e3l8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl8e3l5eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoKBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODhISCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkX3R8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgd3x7e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ1fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnJxcG9wcXFxc3Rzc3NycXFwcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgoGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hvcHBycnJycXFwcHFxcXJyc3Nzc3FxcnBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubm5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzcnJycYVzb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHFycnp7cXF4lnFvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXJwfpZxb4Occm9wcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXB2pHtukJ92b3BwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcHaqiG+ZoXpvcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJwdquVcZ2ifXBycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3Nzc3Nzc3R6q6J7nqJ9cnRzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fnx2dnd3dnV4enh4eHh4eHh4eJSypaSrp357e3l6eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fXx8fH1/pqaisqSoi3p7e3p4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fX19foaonKOrmp6bfn9/f3x8fYCDgoCAf319fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICBgIGBjaOToK2foZ+Ef4CBgH5+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/f3+BgYCKnoyUrpyWm4d9fn1+f39+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5/g4OAfoilopmfm5aclIOFiY2Ff4B/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KSkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYSLkJaYpK6mopudoKepoaGgkoF/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgoSUqbCwpJ2inZ6foaKjn5KCg4KDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OCgIKUn5+dmaGdnaCfnZ2Th4eHh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqHgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCgYKNlJWXn52eoZ6blYiHiYiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46RkY+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISEhISIk5adl5qenJKEg4WFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgoKCgoKLlZeLkZyWhIGCgICAf4GAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgX+AgH+HkoqPkoWBg4OAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOKloiEgoSCgX6CiYyCgoKChIOBgYGCgoODgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6Zi4OFhISEgoCKjoCCgoKEg4OCg4GBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioSEg4ODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAj4yDgX9+fXx9jJyNgIKBgoKDgI+TgYKCgoKDg4GBgYKDhYODg4ODg4SEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GVl4mAfX19fXuBl4yAg4GBgYGCmZmEgYKBgoKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioeDg4OEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgJWfin5+gH2Hin6EhIOEgoODg4WNjYWCgoODgoODg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSTkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWFhYKAfn19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSGhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyLiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOKkYOEi4WCgYF+fYGHhoSAfn5/f39/f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYaGhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaFhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWCf39/f39/f36AgISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHhoeGhoaGh4aGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiYiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gIGAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhISBgICAhIR/fn5/gH9/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHhoeHhoeFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIyHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt6gIaIiIqKiYmJiImJiYmKi4qIiIiJiYuLioqIh4eIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQjpCOioaEhoWDgYGCgYKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICBhISCgoKCgoKCgH9+fX19fX59fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJiomHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCg4OFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fn5+fn5+fn1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4eJiIODhIOFhISFhYaIiIaFg4KCg4WHhoeGhoSCgoOEgoOEhIKBgYGBgYODhIODkZKQjo+Oi4eEhoaDgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeJi4qGhIaEgoaGgoKEhIODg4OCgoF+fX1/gH5+fn59fH19fHl8g4aGh4SDgYODhIWFhYODhYSEhISEhIWEgoKCgoSEgYKDg4WGhYSCgoGCgoODhYOEhIWEhIaEhISFg4KDgYKDg4SFhIeSkY+Nj4yKhYSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gX9/gYODg4ODgoJ/fX5/gICBf31+fn19fX17enp+hISEgoGBgIGBgoKBf36BgYGCgYOBgoGCgoKBg4OAf4CAgoOCgICAgYCBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn5+fn+Cg4OCg4ODgn19fn+AgIGAfn19fX1+fXx6enp/goKBf39/f35/f4B+fYB/f4CAgX+AgIF/f3+AgX59fX+AgYB/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn19fn+Af31/fn1+gYODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgIB/f39+fn1+f35/gH9+f3+Af4GAf35+fn9/fn18fn+Af35+f3+Af39/f4CAf4B+f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEhIKCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgoSEgYKBg4OCg4OBgH98fn9/fX6Af4B/foF/f4GBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXuAgH+Af39/fn5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/f4B/f35/f4CAf36Af39+fn5/f35+fn18fH2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2BgIGBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f4B/gYB+f3+Afn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoODhYOBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19e3p5eXl5eYCCgoKEg4GCgoF/gYCBgYGDgoKDgYGCgIGAf4CBg4GEgoCAgYCBgYCAgX+Cgn+BgIF/gH9/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDgoKCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGCgYKDgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aGh4iHh4eGf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4OMhIOEhISXl4ODhIF9foGCgoGBgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYOChIOCg4OCgoKCg4KCgpKQi4iJh4mHhoaEhoWFhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4iIhoaHh4eGh4V/fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl9gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOEhISIko+MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gICAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GCgYOCgH59fn57iJF8fI6WgH1+f4KGioWDg4SCgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh9fH5/g4R8fIGChIKAf4eDfYOBf4KCgYODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgoKDhYODhIWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH18fn1+f319fX18fH+BgX2Gj4F+fYJ+fn6Agnx8gH+CgIKAfn17ioJ9gH9+gYCAgYKBgoCAgYGAf4uUkIyLjo6NiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f39/gHx6gYF4e4CCgYOFhIOFhYaHhIWAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8goCBfn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6BlJKNjI2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAgICAf39/fXt6fYCAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gIGAgIB/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4OAgYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjo2Njo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KEhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEg4CAgX1+fX5/foyEgYZ+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fXx+f399foB+f36Eko2MjI+Ni4qGhIaEhISDg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn1+fHt8fHx7e3p9f4CAhIOCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoSChIOBf4B+f4KCgn9/goJ/gIuQjYyMjYuKiISEhIOEhIODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+Af4GBgH99gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH17fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIKBgoGFhoWGhoaHhYGEkY+NioqLh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f39/f39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5+fnx8fHx8fXx+fnt8e3x8fHx9fH18fnx9fHt7e3x6e3x7e316fX5+f4CAg4eJiYmKiYqJhYiRjoyIiYeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fYCAgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4ODfX5+fX18fX19fH1+fH17fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHh4uLi4qJjJGPjYqIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSDgYCAgYGAgX+AgYKCf39+f31+gH57foGSjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7e3l6eXh5e35/g4OEh4mKh4mOkI2LiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX2Afnx/f4mDf36DkISEg4F/fn18jYd9fX59fXx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI6OioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoWFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn2AgoCJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4GAgICDgX+AgYSBfn6Af35+gH59fn6AgX+Bfn+Af35/gH99f39/f3+Afn9/gH58fXx8fn5+foF/gH2CgHx9gIB9e319fXx8fHx8e3t7fHt8fHx9fIqKiIiFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoSDg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBgH1/f3+AgIGAgIB/fnx9fX19fn59gn2AfoKAfX6AgX98fn59fX17fH58fXx8fHp8e3x9iYeHhYWHhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6AgoB+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn5/f4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHg4SEhYSEg4WDgYKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F5eHt4eXV1fYKDgoODg4OFhIWDg4OEhIODhIOBgH+Af4CBfn19foB+fn5+gH19f3x9fX6Af4CAgIKAgIGAg4KAf4B+gIF+gIGAgH9+fn5+fX1/fn6FhYGBgH+Ag4F/foGAf35/foB/fn17ent6fHt6goWAg4KCgoOCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCAgH9/f39/f4B/gIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x6fHp8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgIGAgICAgIGBgYKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fH9+f4B9f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgYSEhYSEhIGDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z3dnN0hoSEhYSChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX5+fH5/fn5/gYJ/gYGCg4eFgX9/fn6AgIGBgICAgIGCgYCAfoCCf36BgoOBgYOCg4OFg399fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gIB/f39/f3x/f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5/f4CAgH9/gYKAgH99gIF+f4CCgoCBg4KEhYaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX+AgIB/f39/fIB/f4GAgYCAf3yAf35+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn1/gX5+gIKBf4KDgoOEh4SAgH58fXx8e3x1eHl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgICAgIB7gH6AgH+BgIB/fYF/fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYODg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYaFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf4CAgHyAf4B+f4GAf39+gX9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fX1+gIJ/foCAf36ChIKCg4WFgoJ+fX17e3x8end8eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH6Af319fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoGEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaDhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgYCBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYF/gICAgIGBgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KCgYKDgH+CgYSDg4SBgYOBgoOBgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9/gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYKAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIOBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9f3t5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAg4OGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX+BgICCgYKBgYKCgIGAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKDhYaEgoODg4SChIOBg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIKEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgYSFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAfICBf3x8fXp6fH6AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDg4SEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgoaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhYWDh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF5g39/f36EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf31+f31+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIWEgYOEhYOEhoSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg3+Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKCgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW53bHB5bHV9f398foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYeGhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIKBf4GBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhIaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhYWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96a3N8bnaCgYF+fn99fXp9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYWEhIWHhoSEhYaFhX13hoOEhIKBgX1/fnt8e357fHx9f359fH5+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhoWEhYWDhoaFhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fnt8fH1/fnx8fn2Af31/gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSGhYWFhYOGhoWGhYWGhoWEhIWFg4SHhYOCg4SDhIF+gIB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoSBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDg4eDhIGChISDgoCAgHt7fn18fHx+fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYaGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYaFhIOEg4OEh4GDgIKDg4KCgn+Ae31+fXx8fH59fH19fH57fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWEhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWEhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBg4KBhIWCg36BgYF/g4F/fn5/fX98fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWGhoeGhoWGhoaFhoeEg4SFgoGCgYCEg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIaGhoaFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t7e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhYWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWFgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOEhYWDhYSBgYODf35/gH9/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t8fX19fYB9fXx8fYB/fXyGg4aGhoaFg4SDhoKFgYGAf3+AgH5/gYJ8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SFhYWDhIODhIKEhIB/goJ/fX5/fn5/hH57f318gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8ent8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX5/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIWFhIGDgoOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt6enp5enp6e3x5e317e35/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e318fYF/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88Qzo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTU09TU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjtBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19XV1dXV1dXV1dXV1dXV1tfX19fX19fX1tbW1tbX2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMTkA5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNhG1wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLrR1NTU1NTU1NTU1NTU1cm7vb29vb29vb29vb2+tIqKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk08Ojo3Nz5DPjg+Oj8/QT0/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzk4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6Knz9PS0tLS0tLS0tLS0tS/qKqqqqqqqqqqqqqqrJtTUlNTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzc5SKzExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSjqM/T0tLS0tLS0tLS0tLUwamrq6urq6urq6urq66dWFdXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183PXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqazP09LS0tLS0tLT09PT1cKtr6+vr6+vr6+vr6+xoWJhYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcXCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs7Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS1NXV1dXV1dXV1NPT09TT0tLS0tLS0tLS0tLT09HNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8N0BBPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7O09TQz9DU0s/Pz9PSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dTU1NTU1NbV1tbW1tbW1tbW19bW2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O0KaSxdPIlKfS0ceSq9HOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0qqdrJTJmqycsNGZrJqy0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD5AOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MmXmYWmp5eInJ7EkoadnM7Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQjk2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RpLC9l6LAyZiYxbzJl5nG0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEVAP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9DVuZim1pSWn87RkpmgztDQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/Q0Zqdu7Ofw5varaO/ntXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1aekoNPNipKex8uIlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0sCdosjVzdulmbPQ26OZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09SkoI+4yI+nmqCtkKeYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocjGpr2VlIynpaigr6eiqZ3Q09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDUyo6Tl5CooZKNutWako6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZHS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tTCr7Cz0tS5x9XT07nI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR1NbW1tLS1dTT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJS0FBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREk7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzbnVwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi4t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKeoqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqWjo6KioqKhoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ6dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqampqenpp+bmpuioJqWlpWam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboZ+XkpOSl5qcmpeXl5ibmpmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cn6Gfl5GRkJSXmp2YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhoJmSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKSjoqGhnpyblZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6Nzg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6OjpKSkoqGhnpuamZiZmZiZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGhoZ+enJubmpubnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGfn5+enJmZop2bm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoJ+gn5+goKCgnpuZnLGempucm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZycnJ2enp2cnaSin5yamaOsnpycnJycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubm5udnJqam5upo5uampyji56dnZ2cnZydnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmZuapqKamZuel3SenJ2enJ2cnJ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ycnJiYmZmamaOemZmboY5km52dn56enZ6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmZmYmJihmpeanKOCXJignZ6enp+fnp2dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiYopWUm5yjeFqQop2dnp6foJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJiXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl6KRjp2boXFbhaWenpybm56dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpubnJuYmZqYmJmbmpqWjJKdjoiZlZxvYnaelpWSkY2SkY+Uk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkJCPi5GPi4yPkJCRjoqIlo1+i4qOdGhpi4iMhYeBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYeEgYaCgIKJlZCJeop/hXZqZIKAh32AgZKQhoSEhY2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKBfX9zfI2MhHqLhIVzamCGinl9fIaNjYuGjZSSi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4aIhoSIiIqEf4J/enuGh353h4CCb2dbgouChIWKj4uNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjY2Li4eSioeGloh2bIGFfmhjWH+OjoqNiYmQj46PlJSYkJWcmp2eqK6yr7C1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV01PX15cTlVVYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZCdoJ2Tl5qhmp2coqGVj6GLc2x+mIhlYFmBkZGOkY6LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KRFBLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmpp6KlqKmsqqmvoJ2mkXx7i52acmJfh5eUl5+foaSem5qkp6Spq66spaSoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6rqqykoaKlqaenqKipnI14e5aOlnhwbZOdl56hoainoKKirqurqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1NlXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6aoqaepqKSnppmdpKaioaCkpop6ZmGNg4VjcHOLnZafmpmioqCgn6ChqKCcnqGloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1cUFVPWE9eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq2nppydppx6ZlZOfnt5Tl9qeJqbnJmbn56gn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfW1VZUVVXW2Nec19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuvqaiqqKKgoaiqrrGzrquioaySa1FKSXd0b0VRYWuQo52dn52epKKioaCimJWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbWppYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOgoqqqp6+3trW1trOuq6+rglxIQ0dyaWZDRlhmfp+anJuWoqelp6mfo5ueoZqWnqScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inaCqsri9vby7ur+0rrG8nnFQV01Eb2FfSERPYG+VlpOalqOrqLatoqOkq6almKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh2bHBoaWliWlNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLG0tba8wcjAu73Gurm4vI1hWY5yQ2xgX05SV1pmkZ+WoqSop6C6pqqrtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllUYWlgZnRvdGl0ZGlkYltMSz46OTg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcTHw8O5vcPU1sfAwry7urqIVnvCqk5ubmdRW2RdXIisqKesoouUtaartLywtbaor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGJfXmtjYm54dXZubVtiUlZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TC1eDayrW8vMDAklCLwL9hfYJ5XUppcFN6s7ionIJvlrCjprG2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8foR/aWZoYWtsZ251cXJ1cWdeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxL/Dwsvb2cqzwbzAxqVVgqKicJyPhXxFd45Va6uwlHpjcau0pqqpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx+dGtsbmRvbWlxeG55aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEzc/Dvbi4vsWvY3R7a4u3koiZV3uPXWuQhXJhWo23tayupaSjqKSgn6WZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl5e3dua2lndVpmcnhzeWZmXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMXLwquprbK3nnBxbVykuJCInWhncmhoamVeV2ikurWzrKmioa2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamddam9ueHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Oz8zDx8bIycjIycfFy8uvl5mcnY52cGNgqqqMi5RwYGRnYV1cWFWLu7y6vKytpqq7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3ZoaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwsvLyMfOw5uGiIN5Z19NYKGZh4yLc2VgXlhXWFVntMnAvL60sLCwwb6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW50Yl1iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyby8yMfJzcjDyMq0fnFqXVFQQlyMgn+CfW9mW1hUVVVUicLAwLq6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWZjamRiam1ub15ZXVZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjIw8XEwMPCwZJeUk1IS0FVdmluc29oZ11YVFZTYKnAuLm7u763tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWNjY2piZ2NbWlpcWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub66urTAuLW3sq66u7fAt7zKz8G7v8C8u8avbklGREhATWRZYGdmYmhkWVNSW4y/v7q3u765tbi0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xZGFiY2hqZmdpZWleVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vC1426vrrDtbnHt5xgQUBFO0pcU1hhYWBnaFxSU360xbzBv7zEt7a3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F5cW1lZWZvaWVsaFhYTktLS1JKTEhEOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+80MR1qsu9x7i5t623j1BAQThMWFNTXV9eZWhdU2GhwcjDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d8a25wZ3Frc2ZibWBcVElLSkRKQ0NHPjk7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby7wLeqraSusLi7sr2+u8S2tbi1t7++xLzCxNescoC9yM/CwLetta19Tz84TVVSU15gW2FiXlWMuL3Hy8fHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcWZsaW50bnhjZ2JcY1FLVEhFRUNHQjw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ubzGycrCx8nSlm5yrtLRzMrEtbq/roJMPExXT1RfYFlaW1Zvt73Aw8zKx8XGwLm+vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2NeYGFOSU0/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xdDCur68xL63vMC/yc/HyMrKwYRwcqbMzMvNysbCwsm+dUdHXlBSWmJWUVJcosK/xcDKycLDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13fGBxY1teX19UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy3u7mt28K+tr7Avr66ppyqs7fEwKV2dHedxMbLyMHDwL/Jy6ZsS11SUFZmTkpZj8TAwMG/ysfCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem5zeHNocF1bXl1ZUkZEQ01JQUQ9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8W0ba/Ovba5wLyqfW5obm10gpiXcHd8mL6/xsC4v7y9xMO8qHRmWFZjcE1bkMDEvL2/v8PCvr7HvLy/tLSutbW8vr/OzcvCt7K4t7e9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXtwbmlbX19ZU1BBRkhHS0BFQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDNsHWCtL21tcGkhmlZXmBOU1tcb3J2gqC4t8K6s7q3ury+ur2xjW5mdIRvmb/Ewr27vrq6uLXBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+urq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2ZdW1RKPT8/R0Y9R0NDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyaWEeIyisLWcamZnVVlfSUlNUVRsdYemsLe+ubK1sbu4u7W5wK+fdnmarb3DxcPAvL+5s66yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NiXF5PSUI/PUlERk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8anh3t2jaGXX1NDWVVIYmpVTkRJZI6hrK+2urWzsau7uLi0uMG7u4J1m7e8wcbCvrm5ta2lrLOxprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tru7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdnJuY11nWF1dU09NQT5KQkFKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/s5CBeYiPbU1KQGVZQlB4gZNnTEJdgrC1s7WytK+su7m4trm/wreNdYSutbq7uLWysa2sn6Smp52jpZ2WmZman6muuayrq5+lqKSrrq+nsKyvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpbF1balRdXFBOSERGTEJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzuLWVjIiFe1dFQlGIWElKWHiNgWFAVqS5s7SzsLGtsLm4tru3ur6xrKqkrq24rqmqrKujqKGdnZ2Xl6GVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRVYWNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K7qZiZlGdMP1R5cU5JSUtonX5YRVizu7Gss6+urK22trK0ta6oop2bm5ucp6een6ipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moq6ufpqKbo5yVkIyPj5CTkJeVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/emN3bG5dUWhUUE5HUE1MQlBRQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcGqpb1mRVOhhFBXSUtfSViLYGVmhK+1qrK0rqqrr7Cys62lnJCWko6Xn56hoJyjpJ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp6al5qrpqqxo6WonqCclZOQj5GQmJCWlZiXn5icmZukmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV2fW1re2RoVVJkTUpIR09STkpOSDxFQDwyPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoKzGv8ueTkF1nG5PbUpNY2Z2dGBdYnORsq+us7WqpqyropuZlI2QlZaYl5ufoaGbnaSemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaWim5ier6iusqulqqqgm5iYmJWTlpqTlZWalpuXl5ihnpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eHxkeXlgYlNVYEhJSktTVElSUU05P0I2Nzw2NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZylx8aLVlJLZqNYZn1vcltRa2NcZ2JgbJG0sLC4rKahnJ2alJeamY+NkJWRi42Nk5minJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrC0qrKuo5mcnZ6hmZubmpiZm5SWm5aZnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dnZzaIJsZVtTWlpNUUpPT1VMU01CNz5CNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6Kan6qji3hUanF3dm9kd3ZYV2JgZGlbW1Znra6sr6efnqKglpCTm6CbmJeRkp+coaObnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuK2ytKSgnaWfrKGhoqCgmpiWlp+bm5ikoaCeo6GgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1and1XW1aUWBIUlVIRlVWSkNNRz1LSDhGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoKN+boJwYGNXTFtSWkxMUVlSSE9NR5qsqqmkn5+ZkpGTmJiWlZWMiIqOlZ2cnZ2elp6apqCgqKWxqqeuo6uutrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6enpaSfnaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZybWl2bWhtXFhcQ1dOSkdNR0NGTTw+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqco56biGFXXmVgV01RRj0/QENEPz5CUXepramqpZ+enqKjnZ6dmpyblJOUlJ2dmJSFnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGxL3DvLezqrOtqrO1r7Ouqq+jnauntrKtorCmoKOvsa6wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeGgXt0cmtrdHJxaFZcUUZUSURKUEk/RUE0Rkg5NTw+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmqCflXxfXmVgUEZFO0I+Rjw+OTZOfqqzp6OjoaCepaulnpeclJGZnZiUjIqGiIZ4bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvsfGwrfEysnDwca+urW6u7W7t7C1sqq6sq67t7+7uqu4rauquLq1vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtjaG94a2VaW0ZLTEVEU01EQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bmn1yaWFXTkU+SVp8b2FBPVyOrqygmZubnp6Zl5eXkoyOlpeTjo2Qi4KDgndycW1wj6atrrS5xbvNx8u/wszNzczHydHMzczHycXFzNDS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysLFxsbKyM6/yNHMx8XHxcK8w8G/v7+2vrOuv8DDw8fEx8Suv7iyuLzEwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxERVBJRENANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnZVpZlxUSURAP0qHnqSYg6CyraOenJ+al5aUkpSWkZCPjIeDg4iHg4CBgYB5cXJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19LX0tXW09TIzMbMzcnSzc7TzcXIysrBx8zHycjGv8Ozs8jEy8vLz8fKv76/vcHHxc3MyMnAw7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEE/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGbYVNMSkRDP0NUsdG9sq+mnJycoKShnZqUk5WUiX13cGtlYmhxb3F7hYqAdXBucXRwhbPDvsXR0NfW1tLWztTW19TT0dPU1NPP0sPQ09bY1dbSy8nO0cvGzdLK0tXW2dbX09fYztLKz9HMz9DM09C/yMfKxMzMzM7PxcbHtr/Kv9LNzNDGycjAxMPIzs3Q0c/NysjNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZHJiXVJcSUpHQUVJSj47QTg9NTU4Njs4NTo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaCioFlJQEFEQUZRd7Kvp5qUl5+cmqCgnpucmZWJd2ljYF9fYF9eX19dYmx1dHBwb2xycXWSxMjG1NbX19fT1tDV1NrU1M7P1dTU0dHM0M3T19bT1dDP0tPRydPRyNDX19jR19LY2dTWzM/Pys3Sy87QwMbCyMbOztHR0sjLzcDKzMbTz8zOyMXKx8fIzMrU1NHVz9LM08K5xbGlqLWup5uorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk0/PD40Mzo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52lrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqiho6plQzg9PkRYgqqon5eVl5manJ+dmJyckn1wZWNiX19hX15hYF9gYF9gZm1wcG5rb3J3d5zMwdLV09jY1tnR0tLXz9POy9LN1dTRys/M09bS0dbNz9XV0cXR1MrQ1NXWztLQ2NjX18vIzsTJz8zKzMDJwMjKzc7Qy9DNzszOz8jL0NDLzsrCycfJzMvM0tPN09HR0NDKvci5sK67ubWrtrCtqLits767sZqPoJSRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVhFO0A9MzM8PDg3ODY1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taylrK6+tLDA2NLX2tzWzs3Kw9LPwcCwqaytqaSxeUhGQjtXjqGblZOWm56enpyTlpeUiGteXl5hZGJgYGBhYGBhXl9fXlxibXJvb3N0dnZ5pL/M1dHW1NPY1s7O08vOzsXOytLSz8fOzc3UzM7TzcvX1tDM0dTLzNDS08rO0dXS1dXKwMrCxczCyMnDzMPFyMrLz8rNzdDO08zGyc/NyMfLxcbBxsrMzdDRxtDOzs3M0MXHwbi5vcPCvcO5srK+sbvDw7WqmKWhmJaSlZWSi5SNmpGUlI+PlYKJhnlxcmttZ2BgcGhZWGhWTUdMSVBRQjtDPjs2ODo4Ojo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCta+0qJ+tl3hscHJ7kZqNjJeVkJORkZWWlZCLfGVhYmJgXV5hY2JgX19gYWFgX11bXWdycXFyc3Btcnmlx9PPy9DQ09TKxcnJxsa/w8XPzsfFx83K0sjLzs7G0dLQzczUysfLzs/Hx8/Sy9DPxrrEv8bJvcLHyc7EwsfAx83IxMzKzM/IxMTQyMbCxsjEv8HHzMzMz8LKy8nHy9DExce7x8PJycLPwb28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3b3Rka2BeZnBhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL69uc3MxtDV1dna29jQyc/P0dPIwra7u62jtn1og4Wkq5SOjZaPhYODg4F9hIR+c19bXl5eYF5gY2RjX1xdXl9gYF9bWlxha3Jyb29rbG9vfbnRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMrJyMrIwcXMxsjLzcnEwsrJwcHL0MXLyL+5wbvGx76/xs/Lw7/Du8nHybvIx8XKwL7Cy8bFxL7GvbzAw8XMxcW8wMnDxcfSxcHJv8rJxsjG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Gmm6Ogm5V7d3J0ZmlaYW5tWlxYUkRMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76xr7ZsXnl9opGLkpaGeoCFhX92eHVycF9aW11gYGJjZGRlZGBbXF1dX15gW1laXGJvcm9raWxwb3OPx73KxcvAxsKwtrqysrOyscK8vLy6uMHBwcS+vbm9v7nEysXGwr3GwLi7w8m/wcm7t7u7xsO/vMHNw8a+vrXBvcO7vca7w7qzvMXEwsO3v7W2vr+7zMO8tbrIur++y8PBxsLFycfJxtDGwszHssfJw87MwcXDv72yt7Cyp6ioubClrbCqrayUenZ3amRnYGhvY1ZeWUpGSkVHS0FFQkZKQDk6NjQ3ODU0Ozo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTW183KzsXJxcfBucW9q62lX2R1hJOLiIuEeH+Ghn9+hHt0dGNcXF1eYGBiY2FhZGViXVxbXF5cXl1aW1xeaHNxbWdnbm9yeZ29zMDDusC4rbCxp6qtrKe4tLa0s7O0u7W+sbawta+yvMK8wcS8wLu1srq+wLjHubS7tsHCvbe8xsHDvLWusrW6v7TEt7u1q7i9vsC9sbq2sLa6s8W8tq67v7W3tMW8vsLFwMPFxsfLxcDFxrvHy8DPycfDxsHDt8O9vba5vse/rLW7tbe2jnl0eGdnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMrIysnKxNDN0s/NxcfBxsC/urfJtqqwmFtob4qPhYiJenh+hoZ3d4F8c2hdXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5oZmtubnJ8pMfAuLi1sKutp56iqaeeqqyzraqsqbSut7Gzqa6mrLO8urbDubq6sau1ubuzwrqwwLG+vLy2vMe5wretqqiwssC2uL2wsaixs7W7vKuutaautq+7srCqubCtu667uLvAwL65w7/Gw8XBvMbCyMq4xcfFv8fDw7rExsK7xsnMy7O5wr27s4lzdnZraWFibGhZV1dbQUxLTUpFQUM/RkE6OTo5OTU3NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxc/HzcHDxr/ExMPDysLJyr/AvMK6s7S1w66psJFban+Sh46Pe3h9iYV6e4SAd25eXVxcXV9gX19kY2JkY2JgX11aW1paXVpaWVpcZW5vaGZnaWtucoGturC1rqWkp6eaoKSgmpylq62kqKKrqqyrsKOmn6qttbaxvbmvt7Corri0tLy4tLyvuLm1srzAssCvpaijq7Gys6i9qquoq6yttLOmqK6hpK+psqanqK6lqLetsbK3urq7sry+vr7Ev7XCwcfIt76/xbfEw7+7v8TCvsTIzMq/v8PAwKmHc3RyamldYW9jV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcu+u8m2vcO+usq3wcPBtLa8trGvtbutqKuSZG2Ig4eLgHp9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX15dXFpYWVtbWVhaXF9ma2ZkZ2Voam9yhaqlrKWenKGklJ2km5eRoaOpo6Ofpaanpq2gnZykpqyysLa3p7GtqKq1q7S5sba2rra5srC6urG2paCkn6axp6uouaqkp6eop7KtoKemn5ukpqyen6ejoKGxra2ssrSztLC1vba7wcCyur7DwbG5ucKzwb7Atbi8vb68wsfEw8S/wMSgg3hwbGJmX2tvYFVZXkhOZ09UR0ZLRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItbW9uLrAur22oJ6UnaGmurars7O7s8TPycvCxri2x8DMv7jJt7vFuLPEuLO/wKy1vLKspa+zraGjkmlyhoWGgHx4dXNvbWpqaXBpXmBdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2drbW+HnamflZWaoZabopiVjZ6hoqecoJ+kpaKnnpujm6CrsK2xtaSpqqqsrKS0uK23sKyzta6zta6wqp+en6OisqSmqbitoqamoKisq5mgn56ZnZ+lmpmjnJuesKmrp6urrK2wsrivuLm6sLa8u7qrs7K5s760trKxtrW/tr7AvcPCu7q9l4R6c2tfZV5kZFhUV11JV1xLUEdKSkdBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8PDz766x7i4v7eywrSxu7yrubqxop6pq6eYnpBtfoWGf3hybW9ta2JeYWZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrcYyonJOUlJqXmqGWlpCboqGonpydpaeipZygoZuZr66ur7KhpaOuq6eitbCysqyor7OnurOmtqCinpyjoa2joqq2q6Ojpp6lpqOWmZ2XmZudoJqXnZydnK2iq6eko6atq7KzqrWwsquyubSvqq+ysrO4s66prK6yuLC6trq9wLizsZSFenVmXmVeW1lWU1pVS1tRS0lFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7KdpaOYpbHCtba9rbS4wszIxr/FtsHAxs63wMS9s7m5s7+2sbm7rLK0r5+apKqglJqPeH+DhH94b3F0cWhlY2hkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oZuTk4+Ulpafl5mUl6CeoZyWoKGppJ+fqZ2bm6unr7Crm6OkuKqhoK6otqqnp62xpLiwpLegopuZmaqmoZqsua+ioaScop+gk5ShlJaWm5iXlpeclZ+qnqmkop2jqqqwrai0q6qnrbOwpauus7GwsK6vp6iosq2xtLC8tLq4rqOUgXp2ZF5hVllYU1JTS01eTE9LR0dMTEU9QT48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunaenoqq7wL3Aua60uMHMx8XCw73FuMjLssHCwa28u7W7vLW5ubCvsKqcmaGplJGKi4CAfHdxaWxydHBoaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiY2RmaYGVkpSLkZOUmpiclZacoJyflqCfp6akpqefnaCmoKqvpp+io7eooaGiqLOipailsKWwrqy0nqGdlZWpoaKUrbGxn6OjnZ6Ym5OLoZSRk5iYk5eXmZeep5ynoaKapKWlq6SlsKelo6urraaprq+vq6iqqrOmpqyvtLGuvLWxr6+gknp3cmVhXFpdWE5MUUdRYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6lpqy4u7zBxbqxubXEycnAw8bFx7bFxLLCv8Wrt7e9tr26urWyq62omZifo4uJdImIfnZuY2FmaWhmZ2lmam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZVUlRSVWBgX2BhX2FhY2VpgJKSiJCOk5KTnJSVlqOZoJedoKWiraalpaOko52qq6Wan6WxqqChnqWqnqiinq2sqamuraKiopWXopuckKupsJyfop+el5mTip6RjZKTlpCYmJOcoaOdpKGilaChpKWbo6uloqSqo6uupa6yqaalpqa0pqmorbO1tLm6sKqsnoxycG9gW1dWVVJGUU5IWVtPUklUS1NMRUZJRDg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1ybyxvsPIrLG4wbW8wLu0tKqsppWam5yIgXKIg3t0aWlqbGdqa21ramxlXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJSTlFZXVxdXV5fX19iZG2NjoOQho+QjpmTlJKcmqOcm6GpqauorKeppqSZpa+llZmlr6mgnJmboJ6vmZyrs6Clpp+jpKGUk5uWlpKpqq2anJ+hoJuUkIyZjoyRjJKNlpWQnqKgo52bo5WboKOhl6Goo6Ooq6CrsKStt6ajpKKsraqoq6+zt7O+tbOrr5iFdHNoW1hZU1VSRVhMUVtYTVROUExQUUlOSUI9Pz9BPz03NTc5OTw8OTc3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraeztq6oqK+um6morLe2rLzKu7a/rMvGxbjBzs/Is8S6t7vCyLCtuL+3vL27s7WlqaCWl5iXh3p0gHZ3bm1obW1tcGdnaWZkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXVxeX2BkfYuAin6Kj4mSjZeRl5mioJugq6qmr6yosKWpmp+toJWWpKmnnZiQj5qerpeYqKqZn52UpaGekpGSkZOVp6qlmpmZnp6WjYyLk4aIjYOPi5KVkaCeoaSYlZ+VmqGinpSbpaWoqKigsbCmsb2on6OstKqup7C1sLm1wLGusaqRfnJzYlZUVU5SSkdWUFJRTExXTUpMTlJHTUtBQ0ZEQz5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ylsbeqpaKxq52qp6mysaS2xrS5urPKxbm6wcvQyrG2t7y9wcOxr7G3rbS0u7O0oqOcnZeXlIOAdmtnbG5xbnFqcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWp/eX90iIyGkImXiZSTmJuYnqmboKumpqyeqJqgppyTj5+jmpeXhYSSm6OQlaOdlpaWiKKbm5OLjoqQmqSnnJWVl5uRkoeUjouBi46AkIuSkpKgmqCilpSYmJWippmNmaSmqKahoLSyp7K3oZyitqypraSysqa1vLWrq7GjiXlzbl1OUVFMT0NNTk5QS0ZOTkpKTU5RSE1KQUdLSEhDPjg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLawpaekqqWgqKals6qissO1tbKzxsa2usPKzMazrLm9tLfAr62psJ6mrrqvrp+Zmp2VlId7g25fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYW11hbnF1b4OHgYiAkYSOipSRk56hj5uco6KkmaWXopyVjYeZmoxzjYN+jpeWhpGakJSOjnuZj52Mgol/ipifo56Qk5iWhY2ClH5+c4mOepCHk5CQnJuampGWkJ2Oo6OOiZqgoaOkm6K0r6yvrZ+YpbimprGhsK6csLyqqa+qmYN3c2NWTVJPUE5DU05MUExCUFFISU1STUhKSkRKTEZKSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0wMjc2NDc4OTo6NjU6ODdBN3i3oaO0qaalqKOmpaamprOnpbTBuLC0sMnEt7nBzsa9s6y6waytw62noaaSnaa2rKOgj5WWko9+eH5mV1ZfZ2ZpZ2huY2poZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVVllbXWlqcWt+hHtzTlhyj4KXho2cl4uUkZ+YnZWUlpWPlomAlIlfO1ZvfIyUiYCMkoyQhoZzioWXgXmBe4aTnZODlY6RkIOGfZN4cXCFjH2JgZGNj5eamJOLkImdiJ+Yh4iWnpqhoJenrqmtqKiel62zoqatmayrmKi0oqmto5N+dG5fW05TUldMRFRKUExMRk5PSUVMUU1LT0pJTFBGSUk9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjrqGmpqqgp6mno6mwqKe0wrmwtbDHwrezvc+/ua+utcKnqsWpo52Yg5ScsaKamIaUj4uHfXN1XVBMUVVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbG5oeoF0T0I/f5WSkX2IlI2Eio2bjpaViZKIhpWGeYl/YEpRbniLkoR9hI2KhX9/bn5/lHh1dniEjZlvUY2IioZ7fniUdmd3hoh+iomWi46RkpaMg4mIlYSbjYKEkpqWnp2UpKOoqaWknpuwqqGkpJGmqpaiqpyipqiJdW1mXltIUVFTTUlVTVNJTEtPSUhGSk5MTVRLUVBPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7aco6edn6Gvoaeopaeor62qtby2t7ezwbu2qLrIuLaoqLW2qrK9pp6VjX+Jk6iWlYp+joOCfXhwblhNS01NTkxNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6Dc3V+aWhcVI+JlIl0f4aBfIWMk4KSmouPe4aPgHaAeHNvdnB0jo6Ben6Kq4R5e2h2e45wcm14gYuNknh6gHuAdnNykndodYSEhIV7lYqIio2KgH+Ei42AlIR8gI+YlJyWkZ+dqZ6foJ2gqaWenZiMp6SSoKCWnp+kgHJoYV1dSldQUkhLWFJPSkxNUkpKSkxQSExRTFJUTUVIQTw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzo4Nzc1Ojw7N3aumaOhmJyftKmvqaWtrLCxqr20sru4trq0sZ+3urKqnZ2sqaiysKGakY2UgY6cjpF/doZ4fHZvb2lYS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedIJ7eGZ2jZaYjY59Z3mBdniAiZB9hJiSgXGHj3x3e29rfq19dJCLf3uGkoF8f3VmdnyFbG9nc3yJjIeAbHlxfXFtdo9xaHGBfo5wQ4uEgoOFf3d3eoyGfYx7dX2Oko+Yi5Kam6OWmZ2anZ6hnJaNiqSbjp6XjpaYkHdvbWZiWlhYVVFKU1VUT1BOUFZLTktOT0pRT0hOUExGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagpq+srquoqbGvsau8uKy7vrizrKebsKesm4+WnKWppKCXmY+FknmIjouKdXF7bXVwam1qWEtGR0VBQENESExMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOT1FUWF1lcHJsiKeqwH50eWJ7eG98eYmQen2Lhm9tjJJ5dHlqaoCCcZaRi4F+loBJkphuaHh+gm1pZGx5hZCShmtzbHxucnyGaW5wf3OMiYSGe31+e3ZvdHSFgnmBeXB8joyKk4OWl5iakJKWl5mXnZaMg4mekYuSjYaQloBuaW9vb1hWWFRSUVlPUlRUUlhVTE5ITUpNTktDSE1HRUA6ODk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WtsKOtqqi1r66stL+rvMO/paKZlaSXno2Ei5ShoZmYkZOLc456gIaMhnRvdGtwbGRsallOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcX6eIYpppc3llfnBtf3qLiXaCiIZ0bJqSdHN8amqdj015hZOJhI5nMXaGc2x+foN0ZmV1f4SEhYBmaWx1a3F/fGhxcXxuko2PfHN9fHFwbnVtgn53eXVqeYiCiImDlpKSkIuNkZSUjpeNgHmIl4iGioaAkIh3a2tvaGVYUVpXWVlbTVBVVllYTkhIRUpKSEdCQEdEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDQ3NzU0NzhpTzg7NW6SiJqRmZajqK6esp6nuq+rsrDCsbvDx5qWj5SZi46GeYSQmJSNkIyPhnGHgnSHjIZ5cHJwb29kcGZfVEZJQz88Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7OgcXt4bH1scYOChYF6hIaGeXKhlXR4gHN1lIc1cZ2onY6hoYSihHZxhnyHfHSMrY6JgGdnYmpucm1wg3VpcFh1cI6bkndsf3p9bXJucIB7c3ZuYnaDf4aAhZCQioqJkYuRjIuOg3V4io6AfoOAfY97cnBwbGBbXV5cWVhgX1JOW1pYV0xISUZKRz5CQUJIP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnnq+VpbSprrGuwbK7wcaWkIyUj4CIfW6BkJKJg4qHj4Z1goRslYiIe3R4eGx3bndjaV5KUEc+QDc0NDk7Ozs9PkBCRUhMTExMTlBRUlRVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHeIiHx+hYN/jH51opl5foaBhZmEmpxhhqqfnYuDkI16d4h+iYiOc4qXj4N6XWRydHp8d4ptaGpieW+GkIJ6boF3dIR6cHR5eGtuaV12h3yHfIeHjn+KkpeDjYWMhn1xhH+DfXV3e3yJd3BzdGZnYFtbXlRcZl5XUFRYW1VHSktES0c/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJGdnZ+mkaCqoLGor8CxusW6lo6RlId6hXZrf4yRgn2KhI+MeIOAc6CEinx8gX9wgH56Z3ZrUldMQEUyMTEzNjc2ODg6PD5BRUdGR0pLTU9RUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaISIe4l5fHF8j4x6fYmHfpeHdqGZiIePkpSljayqSIaur6+LgYCTioKLgoSSqYeAmJiKm3RtfYGGh32OaGdoeX9uhoeChXGEhkdsgHdyeXZobWtfdn2CiH+HhIt5lJ2ciYuIkX96dYt2fHhtb3d9f3R0cmxbXl1bY2NYZ2VcVVBQVllQRExLRk5JQ0ZDQ0BAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+iYWIkY6Wl5KXoJ2soaa4r7O8s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0+P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BYcFlcXmmNk4eVgISChZGTfoWIkYGalYKhoZiVm5umrZOau7Gnu8fDqIuMoaWPlImBkXxxg56fkZx/doWFi5CIkGlob4OAdY2HhItxhYJ3h397doV9bnZ1ZoCUjoaJiIeIh6GropaJjph/eoKJenlvZ2t4fnp+c2xlXlpbXWpdYWZfWU9LTldSUUlQSkROR0NKREJBRERBOzo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmeIN7gIx/gZCOipqbpJ2hrKarr7CXkZGEoZSEeHd/jJR8fpKFkpV/ioCSm46DgIGMioKJjYN/iX9tcGpdQkA0LS0vLy4vMDIyMzQ3Nzg7PT9CREhKTlFSU1JTU1RSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZfY39nZ211nZuPmpKTi42OmoiSj52LoKCSo6qlo6yTqbaiqMHDrseveLqUmnyNoZ6ZhJOFgo+hn5OYkoSLhY+akZZscHWJi4KWjI2Pd4+EcW2FgYqWkYOFiHKIoJaGkomOj5aktambjZWig4eTg31/a2prfICBgnNiXmRfW2drXGxsXldLR09SUU5MTEZJUENETUZBQ0VGQj06OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ0NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCCcHWGcXaShn6XlpqVnp6cp6CplpOYnmdlpJp+hJKReX+SiJGSfYqEmJKRgoCAi4yJhpCGhIiFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDY3Oz9DRU5QUlRQUFFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdnKelopmhl6KUnJ6nnqirn6isqaq2l6u+q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqbmaeRkYmWopqad3p+lJiSoZKWmIGUnnt3lZKrsoiNl599lJ2bjpKVmKSiprWwnZGZqIiWj42BiGxzcnx/fXFoX11hX2FnZGBnZltRRUpLUE9JSUxGRkxDSExGRkNCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdWBufGF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImLioSShYOGiYGAhnZeYlA0NjAtMS8sLjAwLy8uLjAwMTU+QUFNUVJTUVJTVFJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk5PUVlthZB3lYqjp6q0vbikrqysp6i0q7C2srKtu7GzvZyzw6y7ycu3w7+4paOwsqytqqOLlpiFpqago5eBppmNoquopIiFlKShoKqgpKmPnLGLlaOnt7qboKOwkqKdo56Qo6Grr6yytaKUpKqImYmSipV5en2Ff2hhaFxlYl1kY15nZl9aT0RJSFNORkhMRkpHRUZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXam9YeoV2gZOFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkI6DhYGMhYaHkoaChImGiIeHcG5hQEU2NDwyLzExMC0sKy0xLi0zP0NBTVVRUlNVVVZVTltQR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZKghK6js6qywMfDqrPFtqyzv7O4vra/tMG2u7qjuMWotsnHtb65tKijtK2xsZuakpqfiaevq6WUdp+kl6GssrOYlqqtqK62u7K6rK+1orGssbW7t7WutaCnp6OomqmvrbK5t7inm7apjKWOkZOfhniCg3VaYmRWZmFhY19gZl9bVElERExVUUhJSkRJR0VBQEBKREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtaUWJjV3l1cYGUfYSGknWFf4CMe7+7o7yCtJSTjZuPhIiPkomIeYaAjJKMh4WBjn+BiY6GgIaJhYqHkXp4bl1WQEVNPDY6NDZBQjc2NC8vNkNIQ1FcT1FVV1VcVk9eVUlLSkFAPkdLRkVEOz5AN0Q3P0JKSkVGV1RQXo+kraOxtMK2uMHMyba7xL2zs8C3t8G1vq+3dLGzpbrFo7DGubGzsbSopLW2qrGgopaaopKlsK2mraunpJigrLS7oqmyurS7vsy/xcW9vbPCt7q4vre6t7msrLCmsKqtvbC9u8LCrJm6qJSuj5eYq4l9gn1rV2NiWWplamVXW2NZVlNJR0ZMUUdDSElBSEQ+P0JCS0BATUM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1NZVVp2anB+joSBjYNuenN5h2K4oZmjiZWTlpOUk42QlpKHhnuGgY2VioGEgYp6fIqHhnyKg4GKg5V9d3l1ZU9cZEdFTDpRY2FbXlNGPztIUERbY1FSWVhaZ1lUYGBNU1BFQT9JSkhFRkFAQzxFNkI+SEdKTFNaVF2Tr7i1urjJv7q9ycy7vMC8t7W7u7a9tLqxxmB1sqWxmp6qvaqlqKuqo6KytaGrqJ6Vlp+Zn66lp6aln6OUoqextKeys722wb7TycnTxsLFzMLKw8C+vb+7vLe0r7i3tsO6xr3DyLCeuamhq46kp7aJgH9yYGJiXlhhX2lnUlhgVlFVSUVFTktBPkdEPUtBPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSS1FdZ2xrcI+NhY9zbHJyc4fVwLWZoI2VmJmRjpeSlpaOhod9hoOMlot/g3+DeHuLg4d7i3mBioKXf3R9emtlcHVZXVxQZWViYGVkXVtYV1xNZW1VUm1tX25fWGdlVVlVSkRCS0tIRkhISEdCSTlEP0hLVFRWXFpbkrnAuL23xsC7ucrKura6tri5sre1tK62tplkdaicrXBeoa2cmKCim6SeqqWUoJ+QlI6WmJeon6Wfnpqag6SdrKWqsK23sL251NHP18/JzNLMz87KxsC/wsq9wbzBwMTExcq/yM6zpLuwtK+bq7i8mX96bF5hXFldYVpjY1FcYFNQS0NCRUZFPEBFPkFIQUBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RRXFloX2+XkpCUbmxvdXWHs6yhoZ+LmZyZjI2VkZuShYqKfoiGjJCLiHyBhHN7ioOFe4l0gYmGlX9ze3hrbXV7aHJlaWxpZmppaGBmaWhsWm50lq2kvIiHZ1tvaF1aWlRIS05PSktQS1NRSExBSkZLUF9eYmZpYpi3x7C4s7u9tbHExrWwubCwu6uysaeqt6yNtaedm6eaT5qdjI6flZGmmKWVipOTiZCJj5GRnpuhl5qVloaemqebrK+osKeztNTU1NbSy9DU1c3Tz83FwsnQvsrJysnRx8zNwtDSuLDDvMS5pba6w6KCb2RdXV5ZYFhZZVpRXVdPT0JCR0RCSDtBQz5BRz8/QTg7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVZzkJCYgmhxb3l5g6CqnqWXjJubl4uNlZGajn2Ji4SOioqLkId7hIJwf4iBhnuHcoORi499cXh1a3F4fnF7bXhzbGmBcG1jaW1weGl3fH7Lv8Lfp25jd29jW2FgSlBSVU5ZXlBdXE5QTlRRVVRbbm12gnGWrbiss6ewtqqsvMCwq7WmpLimq66gq7SjjrGtmpiYjJGTkYSOm4GNppGciYOLhIqJhIuDk5WXlpObkZyYmZmfnquspKeirK3P0tXRzczS09PQ1NHOyMPU0cfN0tPT183S0cXS1sXAzsfHwqi+t8+eem9mXmJeV19TXVpPUFRQTkg+QEZBQkU8QEI+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU5bdYaFindsd3B9fn+hnp6gi4yZk5OMi5OPloR5hY+QjYuKiJGHf4J7cn6AgYd5hHWFkpGJf292cmtzfHx3e3OBd3FrgHNyaXBxenlyer7Lmn6MsoR2coR3aGFqXUNaWltWZWNYZGpTWF1cYGReY3d6fouBmamkpKGfoKilqrC4qqW0o6GtoaOtoaexn4mmmpOSkYmRj4iBlIlqlaKMmYSAhX2Rg4OTlq2LlY2Vmo6GkpGdl6ewoaChpaSoyM7PyMLL0dTR1NPO083G1tPM1NjW1tjU19XJ1NrNydfX0cqsw8PLjHNvY2BfWFRZU1xQS0dKSkpAOzo7REFEPEJDPkhCPkJCOzs5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnZWdlIWLlomPioiOh49/d4OTmYqNiIiLiX6DeHN7fYOId396h5GWgINueHBtdX92eH10hXx5bYd2dG59doR1eHydtYw8QYvFpX6MfGllVklDZmNlY2dqZG54W19maGtuaW6Ag4iRi52eoJ2Ql5ifo6SmsqOks6ChpZ2gqaCisZyGnpKSkpCLjouGg4+EfpybjI2DhIV6lH6CqZWjjJKKl5KLfZeKmpGrs5iam6ecp73Dxrm2xs3S0NLQy9LLydTO0dXa19fY1NnYzdjbzsna2tLVvsvMtHh3b2VdWlJWUVpXRkdKSUVFPTo3OUBBQjlHREBFQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRrbm5wYnBxdIaNfJeRnYt+h5KCiYaFiYGHfHiFlpaIj4OHhYd6hHlxenuEhnV6hY6NnHqMcHxvb3p/cXyBcYOHgG6OenV3fXyCdX97hoewdFipwraNkYJwbmI9XmhycHFwbnh2gWVpb3J1eHF6i4eOk5GblaCVh4yTm6Cbn6qfoK2coZqZn6Wen6uZi5qMkJGNhH2Ih4OFi46fmZOIhId+bZl5hJiGiJOMjZSMhnubiJSPrqqUlZefmaeutb2prb3Gy8jJzMvPycPRytTX2dfY19Tb19PZ29bP29rR1snUy5V6e2loXFpQU1RdSENFSUg+QT09Nzo9Pzs9Rz0/QUFBREE+Pjo4NkRCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw6OkQ/Q0dSa19tZGJma3aAiHGRkJqAeoCNfoKCgYR+g3x8hJiOh4t+hoaAd4J5bnt7hoF1epKejaB2jnWCdHWBfXSAhG+Bj4FvkoR0fICFenaGe4m3xqXCybiClpuPd3BlTmZjgXqBd4aikIp4eXZ7g397hHVtk5aUlY+XkIOJj5eal5alnJegl5+SkpejnZmrlZCQio2RgoyFiYiBhpCRnpyZiYWLgYaYeoiIn5ePiI2KjIJ8oYmQi7yhmJOXmpyppqWun6i2v8DAucfJzc7FzcrR1tXV2dXX29TX2drb19va2tjO3MaHfHpoaWVgVFhWVU1MRE5DOz08PDk6PD45PUA2PT9APD8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6int+gH5/fIV7foGRiYSFeoSHe3V9dG18fYZ+c36SnZGeg5F8hn54jn15iopugpqAdJiFfYGIhXt9kHqPqY6Pw6C8jJyjnH2JhH2JcoyKfnOmmpyYk4V7jpCIhGhHcKCknYyLkJKFiYqRkpWPnJqSlJGWjYuVn52UoJSRjY2Qi36Qjo6LhImSlpqfn4mMlJKdkYKLf6WZiISNg4WEgaWHi4u4mJ2RlJaip6Gdnp2jr7a6tazAxcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u4eXl5bWpmV2BcVFBPSENMQj09Pjk5Ojo5OTs8Nj8+Pjw9OTo7OzM3RD84Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYGOinFyeYp7en98f3uIenx7i4eCfnWDhXlzenNtgH6EfXeFm6GbnZSSgIuIf5iHgJuSboeohXqgi3yRjoKIg5x9mpGKjKOin5CkrqCLkYuFi4GShldyrYufq5uPg5ibj4+NW4KikYKMn5OVjIeIjJKSjJSUlI+Mj4qHlpudj5WWkYuSk4WAi4iSjYqKnZaZoqKGkp2WoIqJiI2ckIOIj3+Dh4WkhoyQs5idkpSXoaGemZKcnaeyuKymvcLHzsfGz8zQzM7X0NHUrtbV2NrY2trX1tnZn3F+dWhnXl1YVFdYQ0BIQz4+Pjo0OTo7Nzo7OjM7Oz88Pjc7OToxOkg+OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J4bWJ+koNvbXeLeHl/eoF8hnt7d4aEf3NwhYJ6dXZ2dISDhX1/kqajn6Wilomdj5SXi4qol3KKsYyEp5GEmZOFmYyilqCYk4mbnaKSqa+fkZSQjY6IlYtujbeFmsTIspyhpZucmJaQspBkpM3Hlo+Gh4mPko6Nk5SJhYqJhZaam4+QlJOGlJeDf4+LmYiNkKqXl6OjiJmel5uIj4eXl4qEjoyBf4ePpYmNk6mal5OWmaGZn5mTnZuis7Slo7zAvsjFxcnIycLK083N1KnS0dbW1tja1NPaz4NzgGlkX15eTktUWkJBR0M7QT04Mzc7PDo4PTY0OTo8OjgyPzk6MjpJOj02N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ1go58fGx9iHh6fnqBgYN+dnaAg3xsbot/eXx4eHyEh4t9iqOzp6OqsqGWp5+lpJaVrqKDkLeVkrOZjaGgjKSbr6KknZiQp5aoma2vpJeUlpSQi5iZlqDAjqPJuKuaoqatmJGanLKdhoWoopyYhYiJjpWNi5OOiIGGh4iSmJSMi5OThpSYhoORkJx0kZmylpekoYicmpOPipCLl5qJipaOhn2MmJ+KkJCcmpmTmJiflKCdlZ+bobGuo6S3vbTFx8S9w8O/xs7KydKnzs3T0tDW2NLP2Ltze3deYVZhV1FJSU9FQUJFNT46NzY6Pzs8Nz00MjY2OTc3ND01PDU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nz06SkZER05bXFlJZmA7SISLenpthYZ6fIR4gIWAfXB4fH18b3KNen2Be3iGi4mFg5Knu62osr2vpK2zs6ijorCsipq0naO4pJWspJaprbempKOfmamXqaOvsKqamJyUlZGXn5eZu7utyaBptrirsJSYnqOrkpe9o16qsoKJio2Uh5F8jo59g4aNj5SViIeSlouPlY2KjJeYkp2as5aVq56Lm5SSjZCSjJmbipKekIuJlZ+ijZWNmJqdk5yZnpShoJScnKWvqKKls7erwsjEtbq9u8XIx8LRocbJzc3E1tbQy9SicXxpXltUX1JQRkQ+PENBQTg/ODc0PkY8PDY8MzUzNTU0NTRCMzo6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZUdiYGJwSUCLin+Bc4aHfYGIdYKKg39tfX18f3B3hneNgYd7jY+MhoyZqsLAr73Gu7K0wby0rauztoyosq6uvaqbu6Sorbm3q6amoqKjo6mvsrGqnZykmJqXl56ipaWSo7muqL+7rK2yuaWjpn2IhpytvbCDi4yLkIOPg5GPeoGHkIyOnIiIj5eNi5WXlJGalp2nmrGakaudjpmPko6VkJCWl46RoJGJlZujrJSWj5ScnpSgnpuYoKGVmp6np6SipLCypsHHw7CwurbFxMK+zafHw8fDvNXQzcTKiHRzY11aYFtOS0JLQERGPkE/Qjs6ND5BPT01PTY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGZGYGlnWl1bk4yMiHuHi4eDjHWGkIqBb358gn9xfoF6lXqRlJSYkJOVp7TGyb/CzMHDuce8uq+rubuXsra6ssCupcCkqq+7u6qtq6Kinqerr7Wwqpufqpuhm5Wer7Oni6K6ubXBu6uonLKko6iThY2pw8SkgouPh4iEhpWUjXqDjJGOkaGMjJSRj4mXn5iTmZSXpqCunYyqnI6Vj5KRlZWOkJWRj6GUhpefoLOelJqUoKGZpJ+aoJuglJiepqSmp6SvraXAxMKuqLe1ycO+ts6yxb7EvLPRycjBtXV5bV1ZXGpTTUlDTEtKSkBBPUJEPDVBRDs6Mz04QjMzMjI2MkEwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmZbTWVcZlRjapmNl4qLiJOQhol5hpOQgXKAfI1/eIeCgpB5jaGWqJqamLq+x8jKwtLIysLNvcGzrLu+p7q/vbvDuKzBqayzu72qsKqjpaOsrbSttrWgn66epqKYo7O8qZuovMGjtravq5KvrKqrloaZqaalkYKMk6WViYF1ipJ5hY2RkJ2fk4+Ui5CNlKOZl5uUlKOeqZ+RpZqMj4+QlZaIfY+VkpKjm5Wgopy1ppCflqWko6WenqaYnpWXm6WjqaiisqyovMDEr6Wzt8zAua7Ds7u+wriswsLBwJluemJZV11bTEtNSkdEQ0lCQkFDSzo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5rSV9YYVpkZFaekJ2Nl46ekomKf4ifk4R3hX+Vfn+QiIqQf5Whmq6mo5jCvcjDyMXTzM7Ny7vCt6+6vbS8yrzDwba2vK2zv7m8rq+ooKmntq2uqbK3mp6toqihnaq3t6mkr77Dsb25s6eps7OsrZaWpKunoJGOkrHFp5WOfJGVfYeRmY+qmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi42Pj56IWpCXl5KWpZpmmKOfs6WWopasraunm5+ml5iWmZWhpKimnrarqbq7xLWltLbLwbiptqyzu7iuqLi6vbiDbm9bWFVWT0ZLU05LP0FIRURIRkc4NUZNOz43PkFKLjMyMDI1QjU1T1ZOO0xGS1JMT0dHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhXOz1AQkZCckZpSVJlYkxGpZSclqGXqZaNkIOHpZKIgYeCnISDlZCQlI6aop+vvq6hxr3FxMfGzs7O0sq+u7axuru8vs62xL23uLeysrWzt7Osppyrq7iqqKevsJejrqSnpKS0wLCqrLO+wrnAubOnt7O3sq6VpKyurqSLk5WhjXTBmn2WmYSOlpqLsZWamZWSk5mZpqOVoJuWmqicm6GgmYuNj5adYEqWnJqUmqWXVJawn6+cn6WUr6+spZqhpZSTmZmOnaCnopm0qaqzvLy7q7Cyx8C5paurrbGxo6GysrSkcW9mXFtPUUxFUFBQUTtHS0hGSEJDPjlLVD9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pWDs6QkNAPVFFV1JzYldGSKuXmKCiqK+ZkJeHi6eWjoiShZ+IhJ2Xjp6gmqOktci0qca6w8PIysjHzM7Gvrqyrrm4wMHNtci6wLm1ubGvr7K0p6ObqrS0qqmmrqyZpK6lpaisur+oq7a2vsG/vriyssKwuLyro660rLiliJuXppt2vqCEmJyOk5mai6+WoZybl5Wbn6GpnqigmZqpmaGnnpeQjZGdg252kqKalZ2in5CtsqOrlamqmKuupaSgpKiSkpmciJScop6Xsaepq7q2vrOyrb25tqCjp6ilp5ycrKmpjGRmYV9SS0xHR05KVkw9TURNSUtBQ0Q8UFU8QUFCRE8xOD03Nz9CNzVVWE4/SE5RWFJQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlNhTVVIf2VeSEWrlZyhn7uumZSejJOqm5GSk4mqjYeinoykrZSjo7bGvbTBusHCx8jFws7Iwb25sq+5tMDCyrbGscG8tLqrqK2sr6Oimaq0u6appquqnaivp6Sqqr28p6y8s7e9xry2tbfAr72/s6i0tqu+pY+il5Gin7yfiZmgmZaenY+3n6mcpaObnKGaqKWzoZudpZyoqZ6ZlY+Um4uXiYykoZScop6gtK+lpZOwq5mrrJ6epKOpkZWVoIOQnp+clamloqG0tLq1rai0srKenKKmmpeVmaqhnndhXmBeSklGSE1RSU5FRkZCUktJQURHQFZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpnXEZDQ5xvYkdFp5ekn5/DrJyXpJeZqZyWm5qPqpaWp6aVrayZoqu2xMK7vrfBwsDHxL7Nx7u9ubKwuLO/w8i1v6+8trq3pqSrq6ygoJqqq8Sipairpp6rr6uiqai+uKatvbC3tse2tbm4vrC+wba0srSvvaOWo5aTm5Sun5ChoqWjo5+QvaWpnamsnZ2hm6afvaKZo56iqauhnZeNlZ6TnoePhI2TnqSgnbWsppyVsqeZsKefmqqeoI2ZlZ+EjqGam5KlpJqYrLG2sqqlqa2snJigoZKOkJapn5RpZFphXU9KR0tPTEhFRElBPU9IQTtHSUhbUk9LPUhPVTRCRjk+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZWNXTKKao5uexayhn6ydnK6fkqOelqSgp6mrl7awo6qytcTCvb+2wMK7yMK+ysi2uLW0sbO0t8HGtr6wuLS5tZ+mrKqrnZ6fpaTBpaCpraCkqa2voqanvbWlsby3tbXDsrO3ub6xw8C3t62ztLWinKSVkZOgraCYoZ2oqauimsOtqZ6srZubnpmmoL2hnaSYq6urpqGZjZqfkp6Jjld/lZ6loaC4qqeTmLajn7OhoJuvl56OmZSdgo+fl5aOoqSVkKWusqupoqKlpZaVnJmLj5GTpJ+JYmVbZGBMSUpKT0ZFQUZLPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhjXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3NIRTY9dWVcS06en6GYnsOnpaKzoJyyp5OrpKCjn62prJ27sKistbHIw8HCs8LEvcbDvMXKvLCwtq6wta+/xbW5sLC6tayaqLCpqZqepqGnwq2brLCcqqKusKmkp723pra6vK62w62zs8K/scazurartLWtqaGllZWUo6uhnp+aqKuwrq+7sqagqamZmZeToqS4oKGkkq6vrKWmn5KhnpWej5CNlZ2Zo5+ntKanjZi0nKOvmp6brpGelJeUmoCSoZWPjp+hk4umrLClpqKcoJ6TkpqUhYuSjZyegGJmW2hlS0lMSlNCQ0BIRzs7Rj85OU5NVV5SU0o+T15ePUhQQkxMSTlOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tVXmZyQDg8SJZ3ZUE0n6Sfm6DCqKOqsqGjtamVsqunoqWyrK6pu7KssLW0xr/ExLXAxL7KxLbAyMK1q7WosLiswMS0t66strmlmauyq6qXn6aXrbu1m6iwm62frrSxp6q6sqe5s7eyuMCqt7LCvLPFp76urbe0qaeroZaWkaWkoqKXmKSuuK2xtbagn6ikmZSVk6Ogt6KkpZatsbKlqqahnpqampaYqJ+fmKKer7Kipo2XrpmlrJeZnqWRm46UmJqFlp+UjJCcnpSLqamqoqegmZ6WjI+ZkIGGlomUn3lkaV1saU5QTU5UPUNBTUM6OklANzdRT11eUlZRQVdgXEJKU0hWS0g6VWRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUpwaVZDV0aMeWZDO6SjnaGmv6anr6+gqbWqnbmvq6OqtLexsLm3r7a4t8S9w8e9vMPBx8C5wcbBuqq2pa27rcHDt7iqrbK7opWtsK2ylqWnkau5qqCnsJ2qn7C0sqqptrWsu6yysrm3rLmwwrq9vqbCqrC3r6mqq6admJiqoaGgkZigsK+zq7C5mpupn5mWkpemoLappaKir7Gzq7Gnq5+boKCbnqWcoZedo7Owmp+Qk6WaoamalaKflpiJlJiTlpedk4iQm5mUj6mop5+jm5ebk4eOmYt+jZaFj5traW1hbW5YUVFaVEFDRVRAOztIQTc6WFBkXlBWV0RZXl5NTFJOXktKPlpkXk5IUE5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE2NDdnWWBGKD84bH1oW1Y6iXtjQz2nn5yhqb2hqrCqo7G4qaW0s6uhrbW9r7O4vLq9trbAwr/JxLjEwsDAuMS9wbivtqirt7K8v7+0qa6xt5+Xq62orZenqY+nu5+lrbOeq6KxsLOsqbaztbytr7G1rLC1scC6xLarvK+xuKusqaKxpZ6kqZ+jl5CZn7Kqs6mqs5mdp5uZlI2gpqS0rqehrKytsaeyrLKppJufqKOdlKGYm6i1qZeZkpKemZ6hnpCsn5iYhpWYi52anJOKjZaXmpempaOgnZaVl5SAj5SFe4+Sg4yWZmxyaHByX0dZZlZEQ05YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYmBQS01OWFdYUEpWVldMPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19eYVUxNTA9YFZeOClDM1lVXGdLNYx6ZkxApJqgpKy3pKyppa6utqmvs7mmprC3xbextr7BwrW0usW+zMW5w8C6v7rEuMG5srWsqrq3urq+taqtsbaZmKerqqubrKuPq7ydrK6xo6qfsK2zrq62sbm2qa2usKe1r7O7vMmyqrW0sbSvrqags5+aqK2gpZWVmpmxo62fpa+WoaSZmZKNoqWnsqmhprGrqbWlrrC1r6OZna2nmpeemZmruKOXk5GPmJyhmJeUrJ+dlIGTmY2dnZqWkIqUk56apaOioJmWkpOWe4uQhXuMi4OLkmtueG51fGFGYGpZSUhZWj17SkdFNkFiVGlaTVxhSltdWlJSUmJgTEtFX2FgUExJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFZhLjUoQ15RXC4qQi9KR1BbSDNjWVVLRJmWoLCosamspaOurrWpt7S4o6u0t8q7tLu6v760tLfDwc3Hu8O9t76/wLi/vbG9rqe6ube3wrerrbG5lZemrquno7KplK+7pK2ysaenorKzsLKwtLG3sqiuq7GmuK+1s8PFtqi0tauwramnorafnqaxoKSUm5mUsZ6nm5+pjaminZuVl6WlpbenorGzq6exp6ywtaykmaCsqJucnZuUqriblI6Oi5icopiQl6ahn5aEkpaQnZyYlpaIl5CXm6idpKCSlpGRl3aEkId8hYKEjYxucXh2fH9dS2VsXEtPY1w/YntHSThHZ1dlW0xeYk1YWVdUWFRpXVBPSGFeX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5JZzI3J0ZhTFYlLUIuPUVNUTwzcmtKREOQmaStpK2tq6eksLKzqrewtp+rtbnJua7Bu8K3s7K1wsPPxMDBvrW9wL+6v72zxKiqubC2t7+9r6uzs5ygp7CtpaawpZ6yta2rsrCsqai0uay0srWss6yprKisqbmtsbDHvrekua+pra2lqK2wpaOjrqOpnJ2cmq+ZoqOio5CsnqOfn6Gqpqa4pau0tKSpq6irr7auop2jqKqboJmakqS0mY+JjYeRoqCVjZSdoJSThY+Ukp2bmJaVh5iSlZmnnKCfjZKRjpF3fo6FfXx9h4qKcXRyfn1+XFJkb15OWmZdRkSWW0c6Tm1YYVtNYGFOVldWV1RZZ15RUkxjWltUS0dPVFNOR0lWU1xOO1BeSkJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQ2Q7NipIZEhKKzpJPzNCSVMsPo9rPUdIj5upqqGpr6SopLO0sbS1sbGhq628y7quwLvHsbSttMLD0cXGvsCyvsHCvL+4vMWorbess7i8wLCrsq2gpKetqaiksKOqsaqvrLCur62rs7qmtrCyqbKpq6Wlo626rKqxwrm0q7moqKitqaixpamkoq6qqKKem6KslaSdl52Yq52hp6mhrKWirKu3sbGgqKKfqq6wrJ2epqeomaOYmI+gp5iGg46Ki56hj4uMlpyPj4aHkJWfnZaYlYaWk5OXpJydnIuRj46Kf3+HhX13f4eFh3Rzcol2bF9ZYG5jUXNyXEs7hHxGP1d1WGBZTmNcTVVWVVdQXGJeU09OZ1hXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxeSjAuSWdERjg8QjA1RUtYMUCUWz9NRpWXrKeiqrKcqamwtqy4ta6qpauqvcm7sL63wq+xrbPEw87Ow7+/tMDDxLrAtMnErK+3rrK5wL+zra2rpaeqsKmnqLGltK2rsK6tsa+zrLO6pLizrKyup6ufo56wt6uqrbq2pLW1pKmnrKyqraGopqaxsqSmpaGhq5apoJOaoKadpKKqpKyinqaxt6ysoqSimqiqramcoaWko5igmZWPmJ2TgYKQiIWcoI2LjoyZj5CLhI2Yo5uSkZuMk5KSlKKZm5qLjYuLfIaBgYN7dICEgn50eIykh3lrXmBuZ1dmh2ROQGeSTERieVdiWFJlVU1WVVVUT1xdYVVLTmlXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2WFouMEpnQUE8PEMrOkpPXjREhkBISESWkq+koqqwl6qprbWrtrGrpKuqqbzAwLi5s7y1prOvxMnL0b7Bu7nAv8K5wbrCxK6xtbKzu8G+s7Gurausp7aqpa2vq7mvqLGxrrGrtaq2tae0tquspKmqnKOds7OoqKS0tKC1raGpqKuprKegq6youbapqqmpoamfrZuRqKGdoKSipqKpnZymtK6npamio5ekpqepnKKko5+ZmJ+Rjo+ZjX6HjIeEnp6IhYqLj46QjYSGlaKajo2bkZKRj5Kfl5mWjIqDf3SGgX9/eHWDf3t4foCJno9vcWdncXhcYXSIaU9dmFZIbXhVZFZRYk9MVVRVUU9YW2JWSFBqVFZUR1BZVUk+SUhPUVB4TE5WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlJjMDI/Zj1OWD9DLD5MVF8vSWs2UUU7lY2voKWqrZmrpK2vs7SuqqWvqam6vrvAsa+4rqK2sMnHyNDAv727vMO+usPBwL+vsrOytb28wrKys6uzqaW1qaWts7O5r6OutrGvsbmquK6qrrasqp6qq5+joLatqKGer7OhtKqeqKeqo6qhoaytqL2vrK6soaenn6uYj6+imKGgqKeep5uZqrCoop+soaGSoaKjppiaqKWXl5idj4qHlYh8jYaFhKSXhYKCjIePjpGEhZSgl4iRnZCTkY2RnJWXj4qFhnh0gX99dXh6gHp0dHppgoejdWleZWyCdWeIi31SV3BeSnhzU2RTUV5NTVJaZ05MVlllWEdTaVJRPkJOUWFROklITFNJcVBMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBNaDozOF89YWQ/RjFDUFtbK0hPOlZCNJCOsZ+kpqujpqSsprSzsKmjsKequL7AvLCouaqnrrDJxsjRw73Avrm+v7zJvMK5sLC1srq8ucGztLutua2jtaanrLG2ubKnp7q1rbW8r7ylra21q62cqa+jn6WsqqecnqqzpLOomqqnqaSpnaOpqKm9rLSvrp2po6Cum5qyo5Wkm6Sln6SamqiqpZ6aqaGbkZqgpJ2YlqmpkZiZk5CKgo+FfY+CgIiej4Z/foyHkY+QhICTm5SFk6KMlJGLkZuTlYeJfoByenl+fGl3fXp1cXF9aIZ5hIhkYGhjc4V6bWd5XV5VQld6bFRhUFJZS0tNcHRdSFpbZ1lFVmZQQz5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktJMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9O0VaPyqPk7CZn5+opaShq6S3srKkqLCnrLjBvbWwo7msqKiww8nJzMG3vcC1t7+6yLbDtbSztbK9ubq+t625tr+torOmqquvtbi0qp67u6iyv7K6oK+0tqmrnq2wopylqKminpyksaawoJ+qqaeiqpujqKCtvKiusK6hq6Kjrp6erKaXnpqho5yfm5qjqaKamaOjlZaTnqGWm5amrIuekZCRjIKLgH+OgXualI2JfH+LhpCPjImFkpiRh5SjipKSh5CakJOBiHx5bH12eXhie3pxcHBzeGmBdGqDZ2RoYW9zjm1ianBgb0FceGtVXk5QUUpJTFNaV01dXm1XRFdgT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qTD4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWjEzUz1lX0RMNktWZE8pPDJQWz0jkpirmJ+Xp6Sin6ikuK+uoq+vqau4wrqyrZ+4r6uotLrHy8e/t8K+sLS+t8S2w7KvurKzwLa7vripubi+q6S1p6iqsK25sKmaurykrr+0tKGut7WnpqewsqCfpKanoKWZn62oqJ6gqq+noKaXo6mfsLifpLGvoauhrKSbpqapmpqbnqOVnJyanammlpqep5GXkpidk5mVoaqQmomNkId9h36CjXx8oYyNiXmDjIWKjI2FiJOajomVn4iRlYKLl42QfYV7c3B8cXN0YHl4aW9wcW9qf3NjemxpZmRhZoaAYFtyanFMTX9pWFpNUExKSFBSUUlOXF9vVERYWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj8wWlo1KJacpZiclq2gn6GkobersKO0tKmoucW2sq6gt6ytrLC1xsjAt7/CurG1vbe/u7+vrL2wtL+yvcO6qbu7uKeotqinq7Css7Cmmry3pKu7ta6fsLivqaWmr7GboaSgo6OhlpuwpqGeoqevoqCik6Olorewoaaxq5+soq6YnKqkqJ6Xmp2kk5qcmp2lqZmcm6SUlJeUnI6Tl6KpoZCJio+FeoR9hIp5jpeKjYd6goiEiIyOhY2UmYyOlpmKj5d+hpeLj3qAenBxdm9vdF94d2VsbGxqaYRuZnJpbGZpXWRzgWBba3VpWkl9XVtYT09LSEdSVUYyOV5ebVBEV1ZZZU1ISUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IjhSPSoxMTM+RDUsLSc0Mio7KzEzOWNsODRHQWZbSFREVV1oRC48MmJWLDKVoqGXlJuqnaShoqC3qq6gurimrL3Fs7Cvo7Wwra2vtcTEvLO/urixs7m4uri6r67As7S4sL/BuKy9urWmorOqp6myq62xoZvAtqSntbWonrK8qaimqK+smaOnnKOmlJiisqWZnqOoqZyioJOkoKS4qKSnrqaepaCokp+ooqGgmJudoJKam5agoaqbm5ihlJGUlpmNk5KjqKSQiIqOhXmEe4SGfZ2NioqHeoGEiIiIkYWVk5OMkJWUjY6Ue4OXjot3fntsdHFsbHNheHRoaWpnZm+GZ2hpZGZpamBpYmpnW2V7Y2BTc1RcW1NLSkdJT1NAISppXmpMQ1ZVXmBLSUdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw/MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEIzQ0RnW0tXR1VgaEIzNzlmTycynqOjkY6jp5udnp2jta2mqrm3p6zDwbawrKO1rqeur7fAwLyywbexrrK3tri3tq2qvbOvsrG9v7iuvLyxpZ+2q6Wls6mqrp+ewauopbCyqay1u56pqquxpZeeqp2mpJGZp62imJ6kqaGcop2XoJ2ntqavqq+hoZ2doZSgpZ+hoJmbmZySmZ2UpZ2roZeWnZSTjZWXi4+YmqigkoiKioh5hXeCgoGciIuCiXx/hIiGhZGElpWPjo+RkZGMknuDlY2Fc319Znhva2psZ3Vza2NnZWR1gGJlZmZlampka3FaXlldbWRhTmhXWmBWSkdJS01SWD45X2xpSEJUU1xbSUhGRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZAOjNBZkglNZujn5CLrKGYmKCWpbOxobG9t6Gxxry6sbGktqurrqm5vbu7rsCyr66ttq+zuLOoq7mxr660trq2sLm+raaetaugoLCkq66do8GgsaOusK63rrWera+sraKZnKeppJ6Vm6iln5mkoqidmqCblJydrLCmuaiuoqGamp2YnaOapJ2XnpiblJmgkqiWqqeak5qakYuUmY2UlJmpp46OiomPe4JzgYGKmIWHfImJhIWKjIqThJOckpKPkJGWjpCAgIyNg3CAfmZ4bWhramdxcmtcaGNjc4FhZmhqbmxna2pnbVxsa3RxYVRiaGRlWklGTE1PWFFRVmFkgVRAVlNZVEZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmVDJzSSoZqNjrCdmpOhmamyr5+4v7agtMK7vbmxprawqK6kt7i3t627r62qq7eqtLmuprO1sq6psbe2sbO1uqepn7apnZ6poqmsm6i/mK2jrq+1ta2tn7Gtr6mim5yjq6iblZyno52aqaKklpqgnJCbo6uqqbufp6SgmJmZnaCPa6GWmJxxgpWao4B1kqmnnpSUnpCIl5mAloqhkHiGlIyDbmp+doNxbIaLhn2Ei4ZvXmNhZ4SXhmuLj5STdXeLhH6DkIBnhoBodWlmV1xoc25OUGpjZ3KEZ19kZm5sal5gYYqQhIVlTktEOEZUZ15KR1BQVFVLSFNhb3RlRltRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNTY4LCMxJzIxNDoxNzZYgWwxNk9rW05cS1tmYj5HMVFkPSsvjKOZhpWwm5yToZuqraqjvcSvqbfCuL28rae2sKWrpLizsrOxua2qp6y0prC1o6i4trWop6y3s660rbOjqp+0q56hpJymp5msu5Wmpa+yt62upamtq6yloZ+coKemm5ehpaWbm6ennZOen5iQnqeqo7Wvo6OjnJaXmJejiKGOkpqHoYeTnaB/pX+mqp6SkZqRiINyeIyOhYihdomNaZeIZn1yeKFviIeEfo18f6GgoJmAe4eedIiOdpuKbIeBgm1oZWN6bHFhVIZtY2xpmHFYanBvh1heaVtra1uIcW56coZnhoRaXkZNP0dfTUZSVlZRUVJXVWdeTVhKUlJPRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcvKIuml4Ocq52ZmZ2fqqqnqb7DrrK6vLfAv6qkt7CprKayta6vs7arqaWxraW1s5yttba0paeps7Gtsqivn6uhsqmgo6KaoaKbrrSVo6SltrymraerqqyopaGgmKCmo5mZpqKkmJykqZaUo5yUk6SlpqG3o6OgpJiUk5iTnIiuj5iUiamLl6KbhbGAo6ydk5mdlHmC1Kh/h5XBm8d5eLGlt5dkgMCcv3mEhHmQhHyQkJHKcZa8nMV7cramu5B7gGyWsauweWhrWLGubmVpvJK8bmh6bnKP2H5TamK2sn6BcpR0mqGqkFdPV2FPVk5GVFtYUVBSjFxXXFBAXERRTkVHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGNpZOApqmfl5yepa2yqLDCvbK1wLW3v8KrprOsrKmnr7Opr7azqKimtaanuK+cs7K2qqWkqLGurrGmqp6npLGkoaCel5ufna6slJ2hn7S6oqqooa2upaKdmpmhp5+Xm6egn5iep6eRnKealJ2hpqKgsKKfn6OWlZKYkpmFr2pqio2qfmeElYatZHCdnJOZpZRxrqGkfni7fWuhkHaxX2q0W6WAZpyRYGaCemZ/anhrqWS+cmemjHaxanyxeHSSlGNtbadtW4SgRWhnh5ZFdZxgfWd8pKeCWV+Lq2mAlXh5aqc3Sq9cV1NtY1tLTldfXFdWO06JT1dXL0lUU0lERUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzEbkaGUgqynpZ6jpaqyt6y0vb6vtsSyt7rCpqiwq66pqbCuo7G6r6SlrrOjqbmonrOysKOloKqtr6yvpqefo6Kwm6Kbl5WXmputpZaboZ60s6Grm6KtraCemZagoaicmJ6kn5yZoaekj52impegn6qepqagm5+hlZWRlpGahbWbtXiFqZm1mXeHs5u3fpOVlqiUfmuBpnqChoiSlJJ4q2drsVure4+HlHSIcY+GgH+IkJd4g4KLl4yDoI+EsHZ3n3Fra2x8i06kWEhjY5l+Y2imYHlydVOSh15QqW1jcX6HgGKcLlGib1tTa2hgTEtbZFhcWkI+sXhXWEEjTWhFQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjhhVTUwG5WflIizpqahrqmns6ypurbCsLvCrbi3waqsra6upq6yqaGvvKqhp7StpKu1pKays6ejoZ2oqrKosKilnp+fr5afmZSVlpidrKGamaOotK6iqY+pqKqbnpWXoKSnmp6cop+boKOlo5abnpiZnaKqm6WanJuioJaTkZOSnIPVk5m5cLDCfsaGfNaUm7t8mZWkj42cjaR7joekgqWCeqx5j51Wr3qIfp9quVq5d4aDfKaCk3yYeqp5jZ2Qe7FujoR0kLyFb5RQr6fFilGgemNgqmJzcohtl4hgU7W0yIaAiXxjpDNCnXZdUGloZFBAWGdaZGFKSE1sS1tST1lmWUNEPkU/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVE3MiWbopOYsaiopbSqpbWopLu3wbC5wLG1tLuztaexsKOwsqafrraom6i5rqOvsaCztLCgpJ6fqKqxqbSppJydnqqXmJeWl5WWoKmdmpanrbCoo5+PrKKolp6Xm6GloZiioaGhmqKip5ueoZ6VmZumoJunlZubn6GYj5KUkZyIsm5otXGrh2+OpnK0c3K2e5mXo4uOnI2ifpGgpX6wdoOR0tF2XK57hX+kb5uqpmuGhHytfZeZj3uxc5Kdj3mzZZZ0hJ5vnmaUUsiLWsJcn3liX61gdnOHYpeIXlnKnW+/gXVNS7VTVcZkU1FqY2ZYQU9rX2xoT1VHSTk9VlJbV1hIQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFNNjIwoZyRpbCtpKq7raa1pae2u7yyur+3trS6urOltLOhsbGin6yvpJimuq6ksbGctLiqn6adoaqksqisqqSanJqonpWUmJiSkqKnn5aSpauvpqKWk6yfpZKUoJukpp+UmqWmoZqjn62aoZ+ekJaboZ2cpZWdlZmin5WYlpKahax7d6h2o46Jh6lvrYqCp4OYmKGJkpqKon+TmYiuhX+Cs1xys1KufYOCpH9x1313hH2OnoaZmXevhoqRnIh4s2GaZZqBgpRsklqwWEuadZh5ZmCtXnd3h2iYiGter3eVno94bDV5yK6yX0FUb15nYEVQbF9wbVZVTS5lY2lTWVE6QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSTk4OJ+dlKC4sJe0wa2os6ipsrq4tLi/ubeytby1pbezn7Ssn5+oq5+Vp7arqLGxq620pJupoKCoobanpqqjmZ6VpaGUk5uZkpSipZqSkKasrqahlZqpn6KPkaKZqKWglZqlqJ2cpJ6tnaGdoI2UnpudoJiZnJaXoqCTmJCmnYapfX2leKGPjoOqcK2LgaeGlZ+hiJeXiKOCkYiUqnyAi515b7FaqIKCiKB5dNh/dodzp4GOm42SpHyWkJ+Ee7JenGSgfoOVbJJcq1tak3+Rf2hnqmRye4FrmIdzXaxaiaCOa29lT0pDoVxaTHRdYmZNW2FfcnRfSlY2SpuTWEhFPUhGQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjAwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MxPzihnZmZv6uXtMKuq62ppbSwt7G1v7m5srC3vKm6tJ+wpJ6lp6eek6qwqbCptayrr6GYoaCmpaS6oqOroJebkaKglZSempSYnqCPjYuor6+mnZebp6afjJKkl6eqp5SXqaeen6CjraShnqGNlaGZn6CSnZeclZ6hlZaOq5uPrm1ytHKpjHaKpnO0eHOzgJGkopGcjYmkh5B3uG+Me4uia2u2WqCFZZeXaaGip22TcrR0k5h/smqFkoita3WzYZ1mom+HkmqXXK1gTaF8h5FSc6Nten9+b5iHcVyvVjycd2VUb24uXKdPYlJrZWJsWmNdYHB7Y1RaUT4+bW8zQkJAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzwwMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4pZqbnbqhnLLArq2rq6e3qbivtcC1vLCvubirwbapqqCbpqShnZGqqqi2o7Kor6qgl5ynoKSruJ2jrZuWmY+lo5WNnaCbmJyfkJOUq7Wvp5mUm6ypl4yTpZikrKKRlqqxo6Cep6uxmaGjkJmil5+blpyXoZOcqpyUkKuZh9SSmrtzsMOAw4Z+1ZabuHiHkJeMmIqMp4h6o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiBim6aiHFujaR0vV53fVthebxrWlZbanpeamFmZ2Jtd29ZW1lDQUByP0NHKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTZBOaeanqG8opexw7Ctqqqssae4r7bFsbqxrruwrsGxq6SinqOhnJuRqaSqsqS1pq2kn5aaqpmmrLido66YlaGQpaCSjZyjnpedmpCVkq+5sayVl6Onp5SRlqSco6yekaCoq5+cn6mjs56jpY6nopWimpyXlaOYj7CgkpSpnoWQmbWAkJGMt5V4gpOatXdta25zbnmPhI6JdJ7Bu72ae4GyqHCAdJG4g3yGhoyGjXuKho2XfKS7ub2cdXq0o3R2l3V0sHWZnmaGaY21dHJwd7aMXoB6fYlog3lteWOLrHB1hX9ZW6dqRGRZU2ZgY11jUWdmcW11Qk1QTUQ7Wk0+SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JWOCpPXV09KzpWVic9OzynnqCgv6WWtMO0rKunrKupu66wxq+1s663p7S4ramioaWeoJ2ZlKukraqmtainn5uWoKOerKS9pqGql5SdkKKbko+iqKKTnZeTl5SytbatmJ2jpKKLkpGmm6Wqm5aopKWcmqGpp6ejqaGRrZ6XpJ6Xl5edno+wqJSbp6GOan5pnKZ4h3N9mo90emWHer2+wLpvkoJxlYdfcmpaXpqJYWOIjpVrYH+VY22dd2KVa3+alZRlXmBjcZuKaXKMfYaVZ2p+cnR4fX1iW3d0gWhQXG6EfXuLa1hseoJzSUpvhnBOdE1FV11mYExbWGZjX09bbXVpcVJPREVNPEhJPUw/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF5MKDM9W08nPzI+qJ+oocGjm7S6tqOspa6nqLWxrMisr7OrtaO+sbKnoKKpnaKbmpmspq6kpbWppZuYlaGbp62pvqepppWUnJWgmpOXpamokJ2Rj5ecsLK/rJunnaeiiZORqZqoo5ubq6Cjmpujp62jn6uimrCblaeglpWdn52XsaSYoaeYnJGdnKOjmaaimpyampmPloFnbX1xd5KXlJGFirWqjYaYlY+KjJiXh5SVioSSlJGJjpGTmJSYl5qgopqclKGdjYJ6pYZsanyQfIB0iYqBcYJ4eXZ2i4B8imtzgXSDdWR3fXdrcHptYGNdcGdNWVlmaWBXWnB6bmxmU09GUzlPWk1STygrOkpCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLOgs6K/oaOxsregqaWyp6WwtarJq6yxpbWmwKe0oZ2kpZyjlZagqqaso6O3q5+Zlpafl62ppcGeq6SVkpyXnpiTlKKfnqKnk5GZqKeyw6+aq5yqn4+WlqmdqpycoKyYoZudoqWwp6KlqJ6umJennZmaoZ6enLCgnKKmlZiTmJOgoZWjnpegjpaTioqNjpatj3yVm4KSgouqqIaBmJaKhI+fiHuEkIeFmZKIhoqVjpuXjZCXnqOWmpORnY1+jmahs6+FioR2eo+KfHZ5em9mepGBgIlrdYF5iHJoc396doOHgmt0ZHlmYGplY2Rma1lre3BpalxSTFBEX1VFQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvvqyrrrKyoKqmsa2irLOwxbCqrKOzrryktJyfpaKhnZmXqKWppqSls7WelZSdmZmwpq2+oKyikJGempmUkZWhnJeonISeqauis8izn6qjqpeWl5qnnaibnqSrk56fnaCqr6qmo6uirZufoKGZpJ6cnp2vo5ifqJOYl5yRpJmYqJ2al2WCknxlfo2Zj2N5jWxoa3qRpKtrZZqYfmeFimVlaWh7jqGPa2iNl5Gid2tqi5ijnphzbG56hI2HelhlXoWCXmyKiYB2XGhzd3eSgIeCbniCeIBzbXmEdHeJiI6De2mGWV5rdGRdc4lpanxxbGNdUk5YSmRYQUo0PUY3P0ZENzE8PT9BRDs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvrLOwqqWora2wp66tsL2xqaekra+wn62Xn6OdoZqZp6ucraOlqKmyrp6Vo5Cir6a3uaWuo46OmqGZk5KboJmYpJV7payiqLPDt6Shp66fnpWeo56jnKOqqJKeoZ6gqrGqq6OqoKmbpp+ooayWoZulsKSXnKqVoZ6bkqWXnqqYnn69g4dytHKEnYataHi5xLhxk6Kje6aYmXOqgnzLwMC7cYuih4KffZWYiZ7AvYKWnZ2NncLBe4J7koyaw8B9aqWxb4yAb8p6f5t3koOOgXZ6gX95cXp/h3F4hY2TeW12k2NmX3hkYGWCY150Z21kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAvI0ZbM1BZL1VBQjsvOJajuMO1sK/AqaiUo6+psK6tprK1r6mlpqawq5+rmJqin5ybqqeinKyjpailpLSknaKSpq6ruLOnr6KRkZqdpZKRoKGXm5+dh6arpKutv8CxoKmvqZeSn52imaGjqqOToKGenq2vqaymo6OnoaWmnq2pkqSbqa2pnJ2qnKyhlpellqGjl5x/zpR4eqSBeZWWm1+uj16Op4GioHynlZt0q4OAr15jjap6p4eFoHSXkoizY4KrhqCOjbNqhK50fZaHuGGDrVmjzW6PdXvae3+ZcH6IknZ+ZXuIdnZrfYhufoWRkn5tgY9gcWtwZ2BfeWRccWhqY2ZgUlRSV15LT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDtMLSFQQEY0LjGtwr+/tbSwt5edkaSqqK2zq6WyrKyrpKunr6qgp5uZpJecoq+foJ6op6OloZ6wrJuelaeurbGqqKyglJKbn6WTj5+ll52no56tpKqwqMDGs6ipsa6Wkp2copefqaqflKGfnZ2usKirqZynp6Siq5KttJemoqqpnaOnpaGwoJKap5qgmpSUkZegcYWMl3SEqIdxsXydcax+oZ6BpY+ed6qCfa1/nHKtfquHhp92mJJ6fJd+qoiijJGMnX6re4mTj5+Ae61WnMR6j2+SwX2BlW11cIxtZXZlhm9hd25yb4qLkpCDbZGRZXB0dXBgZ21lX29paW5mY1dTXWFZUlNDOUlJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNTGxrK0n52jjqOjoayvtq6psaeoqqetq6unoqOdmaKVoKarn6GloKioop+dsKyXmpaop6+sqKepnpeVmqOikZShrZudpqOvrKOrtKq6zbGtpq6rlpScnaKYn66snZagmZ6fqrOpqqqbq6qko6ybsLGiqKyupZimqqmpsaKSlqOlmpSShKRqpHWJeql0erJwgqWJmYxxiKCah6RgYFKrhH+ug5t2roGmhoafepmWhntmgKOJpJmFgqN9qX6BlIeuXnypVZ2ikoF6op+Ae8OvxYxzr7OzuXFiqa/CdGiNjZiPgW2ak3BueXh3b2xmZWVycGZ8aWJdV2BpWFhVTU1RTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY3NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8PJ1tW/oZmrp6Gvop6wtLCvqa2ip6aqq6uppKagm6WfnKanpqOcrJqirKGkn6+inZqSqqS1sK6gqZudlpSmo5CaoqigoKWcsaajp7GstsiytaqsqZWRnZyimaCls52aoJSdn6esrKSumqyqo6KrorOuoqqzsaGaqqiur7ajk5ajp5ibkXyqbJ6Eh3WreXywb4KkiomflpWflIHSuLS4yYCBsl9flKmDpIiHoHmYlZp4qsl0maOVp6mQk5qMf5uJmsbGeGWhgqVzgZ+Ogn2vXnC1Y7F1S6OGbadHgpNkj5Ceknxwl5OAcXt1fXtuW2Vqc3FmgWpfYVlkbVxeWUlNTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPi01T1RRHRw7PEYyLCSnpMHGuK2psq2spaKcsrmsqqGmm6ilqquqp6CmpZiqo5+uq52moKyanqmlnae2n6KXk6iqtrKsm6acoJWQpayRmZyno5+ppq6ho6epsLTCsbOqraiTiZecpJqho6+mmKGVmZylpqubsJ6tqKeerKO3raGyua+dm6+ns7OzpJSXp6OZn46CnU54moF/n3qDo32DpISHp5+cnpOEuHt8ebmCfszGwrZ4m6GRi599mpaWinaemIqkmKOofrCFnYWehKx9mZRhpWyjcI+FkIF9l4NyrGCkc3GAmmC8fVJVdY6SpJd8fZOSi3V6c4V/cVxtb3hyaoJvWmRfaG5jZF1LTVFUQklIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7irr6Cboayzs6afoJWmrq2uqqedpqaao6egsq6iqaayoJmqpJSjtqKilZeiqbS4pJyinaKTkKGxmZ6cp6Whoq+unaSoobayw7Guqa2pkYeQnKecoqScpZeemZqapqSpmq+irqWmmK+lvK2ht7etnZ21sriws6aYna+ho56Fj9G1w7d5h46FkZOQgaZ4lKJ3jKCRhKWBinGqhoS0bnJqmaOblYqffJiZhoePc6+CpZuijaaLk52JlJCbbXCyXKVzk3qcbJl/e5l9bqlho3Fxf59ic7K4aHiPlKaZfoyNk4x4fXmOgm1peGl5c26AdF1kZG5tZmdgSltYWDxIR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVlZUUU9RW1UlITJBSCQpJZNzjYqtv7+7urWelqekrbWho5mVo6mnrqqrmaain6ahoLWno6mnsKOUrKOOpK2jnZCamqq0tKSdpJypkZSXraCgnqajnKectJqhqqO2q8OvqaupoYyEjpyhoKailZqanJmbmaelppisqK6jpZuup76slL2wrJ+isLO5q7SnmqixpKeYeqiQfXywd4qBpKWInG2yb6GHrXyhjoOnlZiArIiFroWflKmgoZaGn4CZlYB7kn6rgJ2alouqeJ2gj4mTkoB5r12jgXymp2SdgHyXdGuuXaVrcIWZXWBbjKBtlZKnmYOUjZeMe3uDl39rbH9ifnRtgHpgZ2VxbmhnaENaYVs9S1QyVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pYU1BPTkk3MDUyLiosQVRWVlZUVFVVVVVUVFVUU1RWVldYVlVVUUhGSUojKCi9kpqEqcbCtsG0n5qsoK24paOOm6Sin7Cvqp+kn52tmZ64oKOroK+pmq6hkKuppJaJmo+usKymn6earJeYj6yioZ2loZqknK2Yn6imtqnAr6Wpo5+LgI6bmp+mnpKVmpqUmpqmpaSaqayso6Sgqqi/pJfDrKqioauyuaqup6CzrqipmHavfpCLnIWHfLquiphlsIxlla19oY+DppWagayKhLCFpZmkoaGRhaBbbGqBs2B/rXt7goGxbGdvmZeMiLBbfbRbpINryKJln4B7vFl2tVqyfVKvgHqsWIChbpiQqJuLl5GXl3x5jp1+ZHN+YoR4dIB8YWpncW1mZWVPVWRcQVRfPkooPjk9NCEiLCUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTUpHQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsre9u7TBs6ObrKaltqigi5qgn5yzs6mfo5+dtZigs6iqq56vrZ6sm5WvqKKOiJuOr6yop6Knma6SmY+omaKdpZ+Zo6KlmZ+jqbKovK+lqJ6djn2Lm5WgoJmPkpqbkZqYqaChmaiup6Wmo6Wpu5+gxqelqaGrtLWsrqaeu62srJWAqZKjr46bgIekl5iQgYC4w7qDjpyThKeWnIKsioKviKabm6WqkX7VvcKqYqO/vX1+o4KD17q4tYWUk4Oevb6EaqOBb6uEbZ1/erKwx4Nqq7C9rHh3or68dIGWjqeckJuRmJ16gpGbemN9e2SNZ3mCe2BrZWtqYlBhW1NqXEBVYUNOKj06NC8eHyQeJTIgHSQoMDQ5NjY3Nzs+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz88QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Sxv7mxvbKina6mpbKmnYyYpb+quLGoob+mprKcnrGcuaiera+lp5SUsKuXjIObka6mo6yhpJypn5iLo5KmnqecmqCoopieoKytqrmuqKOal5J7h5mRppuSjpGYmI+YlKmaoJipqaGqp6Giq7ueqcWjoK+jqrO0qq+poLqnrq6ac3WqpLeGZYmgcGetj4qPbW94pI+Zn4F1rpmVcI+LcZWoo5uXrqRybW1tZYp4b22CmXGAeWlxaWeJlpWYcWhphIZncIZkXYljam9ZXWd+d6ZgYnGOkW9lZICNk4+imJiZkpeffYeOlXZmh3hojmt5f3lkbGNmbGJLZFdKbFk6UWVFUidLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZdV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola2zqbm5srOqqaGunqOyqZiSvrLDyL62qp7Aq6yjoKesn7qjpK2sraaNl66pkIyFlZatnqaqoZ+jo6CRi6SSp5momZajqaCWnKWmp6+6q6yam5KSe4SXjaWYjZGRmJSOmJWolZ+YqaObsaeeo6y6n7DBp6Szpqywsaqtq6e4o623loqgqKW2nYmWopiHqZqQlJ2TqrOZm6OroLGWoaGdn6KcoKShlaunjZOSjIeSnJyUkJqTmJCOlYWBpJqXlY2LkpKKj4aEfWeKf3SCdnSHi3CnbXuUkZOSgYGOkJCPnZShlpmXooOIlI1yaZB3cIt4d3x6amxkZG9kVWBYQGlbSGNhT1orRj0rJyE3NDAuHxwhJTIoKjY5OTQ2OTs+P0FCREZKS0tNUFBRWFVWWV5gYWNcXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgppapqqW1tq6uorCkrZ+gtbGQjqzGvcS7uKqipZ6bpp6wqKO2p52ptaaokZisoouIiY+cp5aspKCZp56ek5WjlqiaqJmUpqGjkJuomaG1uqermJqQjXyBlIuglIqUkZWQkJSXpZCfmqqgnLajnaest6euwa6jt6evr7CsqamyuKCuvJmRpaSmtqKSnaafjamfjZKfo6yvm6GjsKivl6OgnKOpnp6dnJarnZKZoZuUkJaqmY2ZmZaQlp6RiaCdlZSFkoyQjZSKgH1mi4Z1hnZ5iINznGqGkJSUkIl9jJaSkpeToZOdl6KEiJiHenKWc3qKf3J8f2pvZF5wamBbX1luY1BgZVBbOkdHRT4yPT03LysmKykmHSY0MDY2NTg6PT0/QUFDSUpHSktMTVNTU1VaYGBpYGVWUEpBQ0I6OUVNVlteXltaXFtbW1xdXV9fXV5fYGFhYmFhYWBiYmJkYlxbY5eVpKijsLOsrqOpp62gp7WqkJCdpbO7r6ysoqOaep2isaSlsKmWm7imo5OZqpyOhoqJnKOQrp+jlaefoJKWmJuuiqqWj6iZp4yZqI+eubakpZibjYl5gpOLmpOJlZKUkI2Sl6KNnp6pnp64pICEr7WisK91pL6jsqB3eaCqsbuUdayknomAqn9kXGJ2oI6knoSXfm6Ts52jp62qo2Wdn5JzeZmXcICYqJdsf6KoimWcpZyRl5iVi5GckIadmpCVg5KGj46SiYR3ao6HdoZxfIaAgGFph4qUkotadZWQaGiPjnJ6ppmZZXmZh4J4mGqDioNveYBrcWVfdnBsa2hcZmViYnBTXD5NTk5TRz5AVEM6MS8eHyY0OjMxNjY3ODw7PkBBQkZIQkdGSUtNVFRVWV1gaGZnV1BKPERHOzhVUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWablaajoa+xrKuppamuo6etpZKWq7awsqaaqqerl3OMnbCfqKunk5e5oKCPnKSdkX+IiJuejayaopSnoZ6Ol5GehHWuj4immqiRl6SIm7q0p6CZmIuJdXeTjZaTipSRkJSMkJOgjpugp5mcspaAjJy1nbOMko+8p6B+p6J6oq63gY6Opp6Di4aQsamvjIqWo5p5gYushpydoqepp4eVhZh3pZt6h5uBl6aCgnucsXqKhaCXmZSYlYGRl5aEmZljeYeQhI6PkYqDbXCPh3mAcYCBhX+GdIaElZJ4lmiSdKCadH2ZhKGeh5h+kouDg5lrjo2FbHh7cXFnZHhuamxqW2VramZ0XF9IVExRQEU1LllVVTcpITA5PT42NDM1Njg7Oj0+PkBESUBKRUpLR1NYW1lbYWBoZllRSDlFTDs+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJejn6aurquorKCosaanqqWZlK7IvrChlqaptZ6Pg52snKeioI2Qvp6ajZ+aoJB9ho+Zl4isnKGWn6CRjZOIhoCRqI2Hopyjk5eehp66sqeem5KOhXB1kImVkIqUj4+bi4+Sn5KXoKSWnqyIn7SJtJqtisqHqq6It4WMr4KwroOpjaWYjZ18qI9ye3ecj6eWaJWkebSLn56mqJKYwoF/q4iYoXGegJmkfZeFlbGAoXyhlKCQmJaAjpObipeRi3yFkoaNlJKJg21zkIV/enKGgYR8hHWEgZeAj8Vmf6mHj6NrnoOim4OagIyOhYqZcI6ThWh3dHx3aGh1cWdoa15kb21nbVhoR11STTJFNDZOYWM3JjM8REdEOTY0NjU4Ozg+PT0+Qkw/TklKTENQWl1cV2FdamxcUUU9S01ASmRZXWNmaGdiYmJiY2NgX2JhYmNjY2VpaWNiYmJlY2FmY2JiaZSXop+wqKmopaugpLmxqqummpSgo6Sqo5alqrejr3+hp5ylnp2JlL2ak42hkZ2QeYSWlpGIq5mbm5mhhY+Mdpucj5+QiJ6km5WZmIaiua6kmZyMjH5ibY+Lk5CNkIyNmIuQkp+PlKChmaGofqGnh62doJatj56cnZGFgKCNqq6Go42pmYyafqJ2gJmUa4KsdU2reIeNnZGbqKeAqat9g6F7eqdpnn+Sa2eXhpe2iZ59bmBkWYOWf4x7ZGiKcpl9eZVsXXuWbV9TcINcX2t5g2BZZYJ9g4CXcKeqa4OjbnKlcJ+En2lln2xbbop8Zlpgg39iV1Bvd2ZtdHJram9eanBtbGpYaU9dWEY5QTRHRF9rNCxJQ1FNTj04NDg1OTs2QDs7PUFPPlFSTE1CSlxdX1deXmJ2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGNkY2FjaWtkYmRkZ2RiZ2VhY2iXlp2guaGqo6askaG2vKyuo5mXoKKlrK2hna61oqiSoaCfppuZjZi0mZCLn4yVjHWBlJKMiqaWlZienn+ShYWspIebkIqYqJiZmpGHpbGnopWaiImAaW6IiIuOjoqLjZKLkJKijJSeoJyipX+TgY+joZSgd5yWj6eDoad/hqmshKV4inyEmn2icHKTiJZ7nox5bYecjJmQm6iaj4ede4Kic3amZp5+dqRfmHp9knOibpi3tLp0koeCf7WoZIHGuHtwlbeLcYCapGNzrKtgfWqds35ufIaCjoKLmHF/o2xyo3OehICkYJyYs5ZxfJeftHRzW56yg2pib3R2cmhvWGtsc3NmXWleYktFPUQ1UUFacjI9U0dfSlI9PDM5NTo6NkQ7O0BJUT9VTU5RQEVfXltZWGBgfGRIQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7iZq5yToI2kt7WuraCbopyjo6atnJuxrayTl6GZoaSZmpSeq5uLiZJ4i4ZwgJaNiY+hkJKUnZd9kImOqKCHmI6KkaKTm5qMiqiopZ6PloeEfmt7h399kI2Di5CQiY+UoIOXnqCdoJ+LiXecmKKMn3Khi4eoiJulj5anqn6tjH56oJl6o5N4gXSWiI2cfZagh5uOmZumhqJkoXyIlpCbjWyeaJuNbpqZe4CKp31yaHSrg52DdKpnlJpdm4V2hJ1oqmqAuGZcqHCBnGGVjF6ndnaIiX+eaJp1hpOSl45/n26akG2nmV2ofni7a36qW46EXbRnXG5yeXhraVxxanl5Y2BmWGJBUUVON1ZDUm40S1paX05aREAxNTE7OzdIPzpDSFU/WVJZXT5EYl5WYFFhY31pRUI5TltdWGRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq1m6eJY5Sbq7qysKydppycqJ+erpuesKisnZekmqGfmJaWoKOZhomNaoiAcnuXiIuWloSRlJiPeoqElqOdipSPhYudkZyciI+oo6CZi5GKgIBpgIZ5f5eMe4iOjoiPlpp/k6KfoKGTmHJon4qfj4xwkoyBqYeYnqKnn6d8r62joriXd6OzoqSAiJR5nXurmn+ijp2bl4iXcaF8hY2vtX1rmpGheH6YtKOjq6iEmXybfZ2ZfnSqWl1ve5aLeJ5iTH56eoVjeZdCTJ5ZompxfI5tgYmEmXWbeIaJsbN/f5uTp3aBnW1yfZRvmXNqpF2VdkhlY2BzcX5/bmZgbGl2e2RlYlJeV11VVkBZRlFnRFNXW2JYXklEPUI4P0E6SUU4TEVXQVZRW1ZERmJcWmBLYG1+cUVDPFVfYlplalZnaG1vYmZnXmFhXF1eYWhiX2VjdmxeZWdma2RmbGloa2mTnYGxrZmEVF6gprO5s7OpmqKMnKucnKmUoaukoaiPn56dmpmVmKCdloiHiXeFgW55lYWQm4t8kZOWiHJ/iJKhm3ORkICImJSfmoSOqZyalIqLinyDbISFcYKhjHiFjYiIkpiVfJOjoZ6iiK6GfbWEjp6ce6WWeqmBlZyPiqCcfKdod21+mXShc3F8noaZcJODrn2kg6aemoCjb16oZ3WjY2+lYZzTkHx7mXhyc2OihZB+o3Ojj3VrkLOLYIKYiXOqsqi8f3eDbX6+pqm0XpxufXGXboBzonJdpGdzpmFopm2b1Jl9hJpveHqXa5t7d5dzbamkZ2BleXCAhGtnZmRudndnYGNTW2ZRUWFIV0lUYFdTW2VqXGVRRkNLTUpLQkpFOFBAUU5XUllPU1FgZmVpU2N3eXdJRkVjXmVaaGlUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5t/satUXEt+qa+xtLCzo5uZhZmooKCkjqSooJipipmYmJOZk5KgmI6IhntwfYRofY+DlJqBd5GOjolvf4aQk5Jsl5N8iJGRo5WDjqqalJKLhYl5g3aIgG6Cn4d3gJOGiJmilnqToqSan4mzoaK2i3qsp6SupXCogJqQhYCbkXukgKGZhphynoSjrq+Kl4x/jKSNloOuoZR2tLW1yaFzlIqBn2Cdl6lteZWGoJt1oYd3oH6RloqAb0xmo5Jwm4dypHt5dGGDgWt+oGtxZGCccn50l2l6abO1tMamc5h+ep1rnJurdYSbbXV3mGmaenWYcVBFfbReanZreYhmamhidHVwblZeVFlpUFNoSVVMWVNVXWhrblZnV01KQUpNS0hKTkFRS1BlY2ltZXVzc395fG51iXt7VFBObF5oW2tpUmpoaWxnbGZjZV9cXVxeaWJkaWt7X11kaGNqZm9tZWlsZaGciK+mhGY/lKGyq6+vtqKikICXqaKipYylp52dpoKal5aNl5CPnJOOiIN5anmGZYOMf5egeXWPiYyBaYSFkoOMhZ2NeoyKlaWSg5epl4yRi4GJeoB9i3lwkKGGeYGVh4mWoJV/lKWonJaWhGZueJxsomR8caV3m5hwZ6aAlot7pHqfloOXcp52gYqUlo+5bpCKomJ9maGViG1yaatqdaBtbqZfmmmLkGiWh5qVdaKAfZpgi4WMdG+IYmigZZ5+aZp1b2NmiIJtcqJaX1tjoW1diYxve35zcmSlbXeiZGenaJlzjJlvom9TiZBvoF9lp1SLXlSYbm1za3KCbXBpa3lza29SWVdXZlpTbUlYT11JWGloc2pZa1ZRUkVWXExYUmFVaGpfd3R6fXB8fHKDe39zdo2AhHZeUXJiZ2JwZ1BqaGhrbG5oZGdfXV5dYGtjaml2dV1cY2ljampzbGZrbWOcpJimemV0bYunrqSpsLGmn4uAl6udn6WMoqGaoqKAlpiTjZqPi5iQjop7hnGAiGiLi3yYm3N0iX2Qe2SCh5WKiZWZgnyIhpankIChrJCFkIqCin2AgI5zaI+lhH2GlI2ImKCOiJOqp52JpniWm3+kiJaMspiekIKvl5+ld5SHeal0pI6Emm6kooyShIyDu259pa+ChoaGk5acoHylenGolaCWZp5+b6tjloqVkneobKmigYl1h4J3q5Gmh2qRsGt2s4ypa4qGbW2fnpKVYX+ri6p2f3+MpZ52n32EpJWdoGqbiHesZ5+tjbZ0d76NpJNZg6aNq2F1cnRwfHRxY2p+bmhsU1ZbVmFiXWtNXVJdSV1tbXZgW3FZW2BaZ3Rlbm9xY3F0YHh6fnlyeYNzhH6Ae3uMgYKAdmJ4ZGNtc2RSa2dob2xyamZpYV9eXGJrYm1sem9cXGJpYmxqd21nbG5ilaWqnYGAnqSWqaqdqKeupJmJg5irmp6kiZqlnamdhYyajoackYWSjYyNdIZ6iIRvjYR+mJN0dIZykoNtf4uSh4aTj3x7gYWXpY1/paaOgY6JhZV2goeSb2yLqYGDi5SOiZyfiY2Uq6Ogj4B1lJaIfoF5lK6jf4GbcY+FeI+Kg357cqaMcX19epeWm4SOeHt+foeUlZOKdpCYn6CDen2Ja4yFW3l4cnpwaG5+kolxf3SCj5STcYWDgmWMf16Bf4t3dXOUdW95bm6HbYSFXnZoeI5lgIGFjqmbfXR8lmqJiG+Adn2Gdm1tZ4xzeXuYeIRba1h5j2lud3Jxb3h4cF1shm5qZ1ZaYFddZWtjVmFVX1FfcHh5bGt2ZWpranZ8cXJ0c2FvdWJ0e4F4dXqDdoCAf4B4i4WDfXttf2xkeG5eV25naHVreGppamRcYFpjamVscXVuWltia2RsbHltaGxvYY6UuKimi6GimqakmaScq6KhhISYrJKeoYmappupmIOBm4p+lpOHjoqJjXKDfI99fo+Fe5eOc3KEcJWFe32Si4aGkIV4fn+GmKONe6ehi4aQkIWWg4aOmHdyhamGjpKckIienoeMm6ifoKqDiY2Umn5+iZatqI+Spo93b52RgnmRb32ohXB9lXFrcH2Bn4x/k46MaG1dg4uMnJuejnOVi4hxdGuBdnSBWXJuh5GBfX6Mal1qZHqFg4iAX2l4ept7gouCdoGGgmd3ioZrYXBygnZfcouBiY+mlYVmjI+DbneLhHGGj3pwZmdke4N6lltcamdudlt7eXd1bnNzgmZcbYprbGNZWV5bWWxxXF9hWl5dZnR+e3VvdGNra2p7fXJ7eHRkbXRobXx+dnp8fHp6gIB+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hsa3FybVdbZW1sZ3N5b2hqbWCLi6mwoZCjoZqenpiemaijon6DmK2Nn5WIm6KRpZV/e5iEfJKZiYiGh4pzfYCLdoWLgYSWinFvgHKYhoN+k4SDhoqBeoCDi5ufj4KnoYd4jpiJlYuLnZeFg3qtgpGYmZSKnp2HiKGrn6Kio4uIk5uco5mWqqGnpqCSm4eVjXt3jY6Ep35/kpGSk5yxppuVnpCNspOYhKWMjJWbn4mQm4KIkYprfI13eGWChpCKfImdhIeLkIiIgIWEkHd8eXSaoYiGiZ6KhJR+fYuBgXVwc4WDf3eHh4qQppGEhY2Hg42QjH2Ii4mQgndsgoR9eplqcmhhdIpwfXp3dm92dIFdXm+HaG9gXlpcXVNoclVjXFxhbGh1fHxzb3Bka2ppf3xueX9xaXBwbGaBe3KCgHh/fX+Fe22CjIV8enh8fXqDeU5kdmpybXB6ZGtlYmJgW3RmcGZycW1VXWx0bWl5enFnaWtljIeduZ6WoqGYlZmYlJmkoZ58f5qrjp6NhqCci56WfXmUg3uOmYmGhISGbniAgHKBh36JlIRta356l4aDg5B/gIaEhnyGg42bnZKHqp+DcoqQhpORi52RfY16qoSNkpiWj5yXh4ebpp+imp2Gg5GamZmQmqagpZ2dkJaAkIp2e4eOhKV7fI6QkYaYqqGek52QjquOkYCejIiTmp6Cjpd+ho2Cb3eFcXVhfoKPhnWLmIGDj4KGhH6Fg5RteHV0kqKKjIWZhYSNdICJfH1ycnuHhHt4i46EkqaPhoOPgYSKiop3hoiJjHxva36BfG5obG1nXnp/aHx7dnR2dXt3XGBwfW51YGNbXV5RZ25UZVteYWtpdnp+cWxsZGtqZ4CAbHOAa2x0b3lvhHlthoB2goB9hHZxgo2Hfnt7fH97gopgaXtqdWhpgmVqY2BpXGR1aG9idG1sVWNxeWVwenpyZWltbYuJnreaoaOfkpGWl4uan5+ee3ieppGbioellIuYmXl6jIV8iZGDjIKCgm58f3hzgYV9i5F9a2h9gZeIgYiOfH2FhId8j4CPm5uRiKedf3CLi4yTh6GhioWNfKiRiJCSl5OWk3iMo6ChnZaaf4CQmpiSjJqjoaOal5Gbfo2EeICDjoegf32MjY98mKSgoZOZkJCnjZCBm5GJkpebfZKSfoaNgXRzgnB2YH1/jYZyipV8iIxxjH+ChYaOaHdxeIyYkY9/ln6HinKBhnx9cHh7i4R6epGMg5alk4uGkHyGhoeFdoKEiIh6ZXJ8f3h6cWxqZl5+c2h8dXZ0fHOAal5gdHZweGRjWV9eUmtoVGVZX2FoanZ4gXFma2NsaGV/gWttfWhvcWt9eIZ6a4uBc4GBfoF0doKNhn58en+BfX+PanKDbnNpYYdobGJfcVZ0b21uYHhobVdqdHZjdXt6cmJqbnmJjZ6ykqWlnI6QmI+GnaGbnXx2pKCOl3+NooqImpZ4e4aHfoOJf4mCgX9xf3t0doKFfoqReGdjfYaXioKKjXh9gIyDeZaAlZeWjZWgm35vjIKRlIamm4eNiYSmlYWTi5aXk5J3kZ2hoZeUl3p+jpiXjpaanaSdmJKUm3mPhYJ3hJaNnX6BiY2Mc5einqKTmY6PooyMg5eYg5KWmX6YjXyIjYF2cX1uemSAfIqFcIaSf5CCbIeCgYCJhGV1b3uHkpeMfJN4i4l7f4Z8e3F+d4mFeYSQiouXopWChIx3iISDgnd8gomFdmB4eH10fnhnbGRhf2lqd3N0dX1xfGJjYXNudXNtYVphXltsZVJjWGBhaWt2eYZxYmpjbWVofYNsaHRobG9pgHyBeW2QhnGAg4N/dHyDjIF/fnqCg358kG12iXR0bWWKbGpiY3VWg2lxbmB4Z2xianZwZnl7eXFfcmyGhY+crpemqJ6NjZeHhp+Tl5l9eKqcipl6l52LjJiQeXuAi318g3uAg4F4dHh6c32AhH+Ji4BkXn2LlYd+hYd0fX6Jf32XhJeTloyjoZh/cod7lJKKp4+MjoqToJKDkpCUl5GLgY+YoJqSkJFzf42SlImdnZ6ml5eNlZZzjY6Ka4WXj5l6h4iQiW+XnZqjk5WKjZ+Mh4KSnH+SkpWGmYh8iYmBeXF5a3Vse32Lfm2FkoKUd3CCg31+in9kcml7gJaXhH6Nc5CIg3iHfnV4gH2GgHyDjISMlKSPeYSCdImHfYB0doGIhG5he3V6cX1vYW9jZHtibm92c3h3c3RhdV9vbHVub1xbX15ea15QXVhjYWhtdHuIa19qZWpjaHeIbmZsaGpsaIF8e3dvkIdzgYOEfXOBhol6gn16gYR9fY5yeot4eG5sh2toX2lyYodocm9ldmdubGF5aGt9e3hwYXdti4CZmaqgo6idiouShoqei5WYfXeumIyXfZ6UkZaUiHd+e4p8e4B2d3+AcHRze2+FfYGAin98YVx+j5GGf4SEc3qAhnqPkYeSkZuSpZyVgn6BfY6LkqSJjoqNmJqNhpGYk5aOioiMkpyTkIyMboOPj5GJnpmioZeWiZaRboiZhGaFmI6UeomFkItwlpqUopKSiYuajIJ/kZ58ko+Si5mOe4qEh3NydWtxbnR7i3RuhZCNknF0gHuBgYh8ZHBseH2Zk32EiHSQioBziHlvgH2AhnyFjIiEjJWojHuIfH6LhXh+cXCAhYNjaHl0dXB8Yl5wYGt0XnBqe3l4a3NwZXhdbWxzbXNYWl5fYmtaUFdYZWNncXF/h2ZdaWhnYmdxjW9kaWdkaWiAend0bo6FdIGCg3t1gomFd4V8eISFeoCJd3+Le3tyeYNqa19waHSAa3JvbXFnb2xlfGNugHl2cWx3d4p+opehqKCmm4eMi4GQnIeTnHWBqpSSjoegjZaTkIB0e3aFd3h/cnN7hWtycHptinaAgYducVtYfpGNiICAgHZ1gIB/oIaQipKcl6GUmHiKf4GNiZyeio+GkpiWhYmVmY+Wi4uNjY2dio6Qg22IipCRiZyWoZyYlYWXiGqEo4JmhZ2KkX6Lg4uBd5OYkp+SkYmJlY5/fpCYe5GNj42aknyKf4JudXBsbW9we4Vpc4OOmIpwd390goiCeGZyb3WBmY58iIR6lJF5doh0cIl7hYx6i4aDiY6bo4h8hHaCi394eG9rgYOBXnJzcnFweFpecGBwal5vaXx6cG1tamx2YHBvanJtWlhhYWJuWFFUWmZnY3VwhIJiXWttZGJma5NtYGZmX2drgXVxcnCLgHV/g4B4dYCLgHiFf3eHhneDhXuGjH97doqAanFjfGOGfG9xbXRqaG9sdndfcX95e3R1dICCfqSVmq2eppaFjIN/l5SDkJ91i5+Uk4aLmoyVjYt6cnh0gnByhXRxdYhrb211bYh2g36AbW5VUYGrlIeCeIB2coJ5gaCCkYGTkpickpp4knuDjZOkmpOOiZWZkoSHl5mMlIuJj4+InoSQinxyioWJjoicmp+alpSAk35ohZyHZ4Wgh5KDkYOJcYORl4+bjpCNjJCNeHuSkHqOi4yRlox8iHyAa3ZqbmtrbHp/YXp+jpaCdnqAeIOMfHlnc2x0h5WLfoiGe5OQcXqEcHaMeomMe4l9goyQnp2FfHx3gox9d3FqbIGCeWB4b21scnRWXm9icmBfbG55cGdwZmZzdGhwa2F3ZV1WZmBgclNRTlxmZV15cIh8X1xocmJiZWaSal9oZFtncH5wa3Bzin12fIWAdHV/jHl7hoF4iINzhoV+jIyEe3mVeGdyaoNgiH5vb2t6YGpudH90X3R9eIZ4dHOFfHigj5mwnKWPgop/g5qIgIyff4uak46FiJeOjo+EdnR2c4Bwb4VzcHGDcGppdm6Dbn18bXVzUk2C38iS1pN8cHWDdYOggpN3lZGZm5CZe5RzhZCfoZOUkIqTm5SGfpaWiI2NiJGNiJx/joB3eox+iIuKnJydmpWTeo12Z4mRh2yIo4SSh5eDhmOMkZmOlYqXjI2Ki3F7lIh7joiKkpGJeYV7fmx7ZXJvamt5eVyAeZCOgXp9fn+Gjnp5aHNqc4uPiYGFhX2Vi2t+fm6Ai36Lh32EeoGPlZqainx2eIOQeXNtZnCAg21qdG9oanRuU15vZHBZX2tyeGZramJmeHJvcGNfeGBgVmtfXnZQTktgZ2NdenGJdFxcZXZgYWVlj2RgZWFYaXNzbWpxdox8dHmGgnV2fotzf4Z/e4l+comHgZGKiHx+mHZlc258ZYd+b3Brf1lsbnl5c2F2enuNdnN3ind5n4ubr5ugkIKFd4iVfn2KnYeFn5GOhYyXhJOOh4F0d3B5cW6Eb21ufnJkZHhxfW15fWpobGOkmsHcru+hc2t1g3WEooWSb5aQlaCVnIGRcYaLo5eJjpaLkJ2Wg4CVkIWJj4CSiomWfod6dX+JeIaEjZybmJiOj3aKdm6GiYt9iqOEkYmdhYVei5OXio+JjouLhIptfJaBfYiFiZCPhnaFfX1rfWR4dWlueHNYiHqShoZ5foCAhYt+eGVzan+JjomCgoCMloVrgXZuiJCCj4R/gnp/kJWTmZB0c3iHjXVzcWd1eoNidG1wYmp2Z1JgcWdsVV9udHlhcmNfaH1wcm5bY3JhYlduWlx4TU1MZGdhXnZziW1cXGR5XmBkZoVgY2JeWWpya25rc3eLfXR3hIF4d3uJcYOEfX6Ie3SLiYiWh4x+fphzaHVxeWyLem50cIBXcXp2eXFld3mGjGl3gIlyf5yHmaeco5KEfXCMlHh5i52EhaGNjXuWjX+ZiIR7cndwc2pvgWtpbXx0XmB4d3txdXtnYWV869q1ycPciHNsdIF2ipqIjWmYj4+dlZOBiXGFiaCNhIuWioyYlHyNk4iDiY97kYuFj4J/dniDg3KHgpOblpSYhox1h39whIKJhpihg5SMn4OJYYOUj4eKhoqNh4GHaX2Uf32DhImOjYJxhn5/cXdodnJpc3dsWox8koKGfX+DgISJgnVhc2uIgY+Kgn5/kpB9bYJseIaPhpGDfYF9gJKTkJaIb3F6jIZ1bHFscniBX3Rpbl1rdmBSZXJpZlNfcHZ0YG9gXWiCcHJqV2doY2lYbVZcdUxLTGVnXmJyc4VpW1xleV5eZGd7YGRfXFlrbmZuaXR3in5zc4F+enZ6iHOFgnyAh3Z3ioaOmIGMgXuTdmx3dXl4k3RueHp9WHmFcYBvZ3h3koJkdoaFcYqVhZmhmqKKh3Rvk4tyd46cfYqaiYl8n3+DmX+BeHFzbW9kcn5pZmx3eFteeXt7cXGAamFnYX/Vto6QpnhucXd7cJKQjIdqmY6InJKMhXtpiIuah4GSkYaHmI18jY2BgYmOe5CNfomFenR7gnpwhoCWmY6TlIGIdYOGdoN/ipKcn4aVj59+iGGAk4eFiISKjoB/g2d9kYB+f4KMjpB+bYJ8gnRrbXZ0c3Z1a2KNgY9/hX58hH+EiH5vX3JwhXuPjIJ8fpGIenCDZnmDioaLg3yEfoCUj5CShG5veYx+dW5va2x6fWNoa2pZbnZaUmlyamJRYnJ4bGJlXVpqg21zYVtnX2RsX25UW3BOSE9nZVxnbnGAbFtbY3NgXGNsd2RlXV1abGxibWpzdod/cW9/fHx0eIZ4hYJ9gId1eYmBkpZ8iIZ2iYFwd3l7g5NvbXyBd16Df3SBbWl6dJRzZ3OHfHKRkYOan5ughoh2dpV+bXaUl36IkIOKjZp8i5p2fXZxb2xqYXV8Z2JpdXpaX3h8em1xf2VkaGdXnY9ecXKWvMSEdnGUiZB+cpeMhpyTjIhza4mPloF7lIuBhJuMfIuGfXyJjH+UiHWJhXZ2fYFxdYaBnpSGlY+DgnF/iHSDe4mYnJeGk46dgIhlfZOCgIaEiYlygX1nfYt7eX9/h4uPfGmAfYN2Zm94eHN2c2xqjYWKgYp/eIKAhIN/al5xeHp9jImFe4GPgH5ygWl4goeLhYR4g3yBmIyPjH1ubXuJfXd0b2hofXZkXHFjWG9zU1Nuc2lhTmZ0eGZgXVxYboBuc1llYl1qbWBwT1lsUkRUaGFaa25te29aW15tY1pib3djZlxdYGtqY2xpc3aBg3Fufnt/dHWDeoOCfIGFdn6JgZaReIOKdIGIcnl5fo2Qb298gXFpgXl6fm1tfHaVa2p4hHRsk42Fn5igmYWIbn2Mdmp4mI9/goqClZeKeY+Wb3pzcGxqZGBzemhfZXJ7WmByfHlncHphZWWOsbJ3SmJapNnQl3F7kYuQeH2Vi4WZkY2Gb2yGkpJ6eZKGgYSYinyHf3h4iYqEloBviodxdH56aXmFg6WRhJONg39vfoN2g3iFm5iTipKQlIWHcHuSg32Dg4mDb4F4aICFeHJ/f4OKh3xlfX6DdmNwc4BoeHBvdJiMhYKKe3Z4gIR5gWpccH1ygIeFiX2GiXqIcoFucYOGjoSEc4R4gJmMjYR4bm5+hH93e2Voan1xYFl3Wllxbk5YcnNnYEtsdnRhXVtbWXR9cm9XZ11manBfb05XaVI/WWZfWnBrZ3lxW1tYa2VZY3B5X2hcXmVsaGZsaXB3f4dubH99gHVwgXqAgX+Cf3aBhYmXinGCjXF7hnx6eYSTjHRqen9rb350f31vcnx7lG9ugH94Z5KKgqGZnJKChmeHhHBoepaJfn+FgpmKgXyNjGh4cmtsZl9hb3htX2JveVxkbIN6YXF2X2Vl1Oq+ijI6PouOgHJ5hYiOjXaDl41+k46Nf25shY2Mdn2Pf4WClYl8g3hudoeEg5d3boiEbHV7dGZ5goOnjIOPi4R9bn90doN5hZuQi5CRkoyLhn57kod4gISNg2yAcml/fnhtfHuCioR4YXmEgXFkcWh+bXRxdYGbi4B/hX5zdn2Ac4BvW2x+dHiKgot7hoB8iHh6cWyIg4+DinKBeX+Wi4p+dG1rdoCAdXZdaWl4cFlXfFNacWVMW3JyZVtKcHdvXFtaWV10fnRoWWJbZ2VuY2lNV2ZRPV5mXF12Zl90cFtZVG9kWWVweVpoXl9nbWdqbGlvd32ObGmChH55boB7fIB/gnp1goGMk4VwgItud36Ae3uIk4l/aHt9anR7coZ7c3d9f4x5eIR9fGuMjIObnZaMgYBsjn5raX+OjXt+f4OUgn99iohrdXFnaGNbYmdyb2BhbHNhaHCJemFzdF5jZJugj25cNVmvtXVqgIl9koZ2hpeGdI+LindwbYWDh3V5iXiJfZOIen9zZ3aIfn6Yb3CGfWh2eW1leYiEpYeBh42Jfm5+dX+AfIuZh4KTkJiIi4SJfI+IcXt9hHxpfm1rgHt6anp2goeAcmB3gX5xZHJndYJtdXuFlJGBfIF/b3d5fHR+bFdvfnZ0i4GGd4d1gol6eHJuiYCOgIVyfn1+koiJem5uaW2CgnVuXWhmdHJSW3tOXHFcT1xycGNWS3N4aldZWVphcYB0YF1dYGdkaGlmTlpoTkBhZFtgdmFcdG1YV1N0YVpkbnJXal5haGtnbWxpcHd8kmtohIl8fHB+fnuBf4J6d4CAiYuEcXuHb3F3g397io2Pg2p+e253eXaKd314gIKHf4N+fnpthIyImKONhIN7dox6a22EiZF5fXuCkYCAfoqDcHJwY2ZeWWdfcHBgYGdwZmpvinVhdG9bYWRqdnt/vpymo8i4cYWEc5R9eIaUgnSQjYhycnCEe4N0dYd0iHeUiHl5cWN3hnqAk2lyhHVmd3ZjanyDiJ6CgH+Pj31yfnOEeH+RkIJ4lo2Uj4eCiHqJiWx4eX91aHtpa395c2l6doCDfWhgd4d9amt0aHt/aXaBi5CUfnp+fnB7dntzfmJVdnxyc4qEgn2DcIaKd3hwcIOCjH59eX58dY6FgnVpcWlsh4JycF5oY3NuS2V1TF5vVVRZc25iUE9zeGFSV1hcYXCCc1thXGhlZGNqZFBbcUlEZGFcY3FeXXdoVVdVd11bZW5oVmteYWpnZW9vaXB2e5NuaYiMeX1ye354goGCfHZ9g4iGg3B2g3Jud4KDfomLk39wgHx4eXqBjHSDeH+BgYKEeoB1b36Ji5qeiH2FeneHfGh0ho2Ren9/fImGhHaPgGdvbV9kXFhlWW1yYWBhcWxraIluYHNpWV5kbYB3qdqpx4aHsnGJeHCNdXuHj4B6k4qAdXR1fneAcHF/bYR0lIZ4dWxgeoJ5iI5mcYNvZ3VuW219gJCTgIF5kpJ9eHtth3WAkIuDc5aKkY6HhYV7gIVtdXZ/bmh3ZW17dm1qdnZ/f3xhYniGemh0dWN9emd1ho6MlXt0gHVxgHp8bH9ZVnN9b3SEh3+AeWuIhnN5a3R/g4N9en14e3KLgHxyZ3RlbYqDbXRba191ZUhubkxbYldXVnhtYk9TdHZYUFVYXmFxhG9cYGNtZGNdbmJUXXJHQ2ZfXWZoXVp6Y1JVXHVbW2drYVZqX2BuZmZrcWhwdXiOdGuOjHV/dnh+d4GDgXt0foOIiINvcX90cXV+hoKJjYp7d394hHx8hYd4h3x9gX6FgHt+c3Z5jI6fjYl6inZ1g3lefoaajHmHg3SFhoV3iXpibmxbYltbYVZqc2NgW2dub2eHcmFxZlddY2t/fMrOh7miam1timxxhHF8hIp+e5KFenl0eXV1e2ptdWOEdZGCd3BnXn2CeYuJZXGBa2pxY1hse4aciIKCc5eUd357bodxgYmLh3GWjpCIhYuDe3l+cXFvfmdocmJueHFqbHF3fXx6XWV5gHdpdXhmgnZndIeLjZR8codpb36AeG18XVhxfm1zgIt8gW5viX9xdmd3f4F/gXZ8cXp0hnx5cmZzYW6LgmxzWGtfd1xJb2tOV1ZeVFV7a2FPVHVyUVFUVl5idIVoXGBramZiWW5hWGJwR0FoXWBmXl1Ve15PVmRwWVtqaF1XZ2BfcmZrZ3JncHJ3hnhulYp0f3p3fnmCh4B1c4CGhY6CcHB7d3d1eoeGh4yGenx/dYt+fYWEhId/fn59h398eHZ5d5GTn3+MfYttdYB5ZIOIl4ZzkopvhYWBeoN0Y25qWV9bXV1UZ3NlYFlkcnJngXNia2VXWmBpf3e+rnuft25ic4ZodHxyeoOGen2Mf3h4c3Zve3Zlam5gh3WOgXNqYl5+eHmKg2ZxfWhqa1pWb3iKpIGFf3GZk3GAeHWBbYCBkIdylIiMh4OIhX15dHJvaHpham1gbXZqZ2treXd6d1tnfXx4ZXJ9boR0ZXWFjIaVf2+LZmt6g3RsdGJcb3xrdHuLe4JmdYd9bXFndX54fX9yfGx6eoF6d3BlbGJtiX5tblZrYHdWS2prT1JPaE5ZfGhiTlV1akxQVFVeZnaDZl1hcGhnYFdpXVtraEpFa1piZFdZVXlaTlZtalldbGVcWWVjXnRmbWRxZnJvdIB3cJqFdn9+d398hYd9dXOCiH+Ugm5zeHp6c3OFh4mIhHiAfXaPf3yEiY6EgoR7fouDe3d8d3eanZd6ioOHaXd+fGyEhZSAco+CcYaCfoJ/b2ZsZ1ddW1xbVGRwZV9YY3N1aXZwZWViV1xcaIBwb3KAc4lkZXh+aXR2c3ODhXiBhHl3dHVua3txYWdrZ4Z0jYRuZl1ffW97iX1obHdmaWRVV3JwjaZ8hHx2lpBzfHN7eW17epCEdph8h4aChoN9dXBybGd1XW1oX2x1ZGdmaXpve3JZZ4F3dWdwgHiCdWJ3hYp8lIBui2pteoBwZXJlYGx5ZnJ3int+YnWDdmlrcXR6cHl4cn1mfn9/eHZuY2VhbYZ8bWtWa2NxU0xpa1BMT3BHXntmYU1VdGNKTlNXYGp2fWVdZ3NpZV9WY1dhcF1MS2tYY2FVVFRzV0xYdWRaX2tgXFpjZV93Zm1icGlzbnF+dHSZgXd/gHd/foaEen11goR+l4VucnR7enRxhYWPgoB6i3V0kIB9gZSOgIWEfH6Mhnp+gHZ7o6WKeYiFhGx1fHt1hIKMem6Fc3qFfYGDdW5qaGVWXVtaWlNibmVbWGF0e2pobWlfYldfWmmAamtvgGdsYWh5eWt0dHRuhYF6f312dW56aGp5al9lbmmBd4+EZ2VYYndpfod6b2lvZmZdVVhvaI+ndoF6fJCOeXVvfm9ydXmOf3eUdIWCf4WIdWpydmdob1xtZV5tc19nYWl4aHttW22CcnNpb4B+eXdhd4SEeI+Ec4hxb3l/cWJwaFtud2Rwc4h8eWJzgHBnanhzcmt3dnR3Y4N7fnd2cGRjY258fWtsVmpjZ1NLbGhQR1JsRWF4ZmFNU3FdSU1UWWVrd3plXm1waWRdVl9Vbm5XS1NoWGZeWE1VbFVKXHlfW19rXV1aYmVgemhsYW9vdW5vd3V6mH13gIF6gH+Hhnp5eoN+gZOEcXR0fnp2dIWIkH2AfZBsc5SBe4KfhX+HfYB+hoKAint2hKyff3qIh4RscoJ6doGAgXVuh298gHOJgGpvbWRkWF9aWVpVYmpnW1pfdYJpXm1sXGFWXFxrgWZydH1pal1rdnZodHdxbYZ7fn15dnJsemhpd2ZdZHNoeneSgWNjVGVvZoKEd3ZmaGlgV1ZZaGSQp25+eICLjnpwcHxmeG55i3t2jnGEfX5/hm5kdnNkaGhda2Jdb29bZ19sdWV6aF10gG9ya3F7fnV1YnSFinqHhoB/d3J1fnRhcGxZcHNicXKFfHRkcoBsYWx6b2poeXd0cWaFdXp6dXBkYWRuc35qbFVqXl5UTHNjUUdXYkdidmZhS1RvV0pMWFhna3Z6ZGVucGZjWlhdWHZlVEpcY1hoWFlIV2VRSGJ4Wl1fbFteXGFkXn9pamBvdHhtb252g5d5coGAfX+Ii4Z9dnaGeIeMfXN1dYF4enqCjI59foSJanSWgXuKnX1+hXmAen58hohzcY+ujHt7hpB+ZnKIenR9fXZyb4Zse35sj3picG9hZV5lVllZV2Nma19dXXOFaFlwblpeV1pcbHtjcHd2bGJbbXN0Z3V1cG2FeX+AeXdub3RlaXRlW2d1ZnZ2kXpfXVJmZmqCgXN9YWNpXFRYXmJjkKVoeXSChZB4bW55Z3dte4R6dYhygHh8eH9oZXZtYGZhX2pgXXRrWWVdb29iemVbd3trbm5weHh0dGRyg5J+h4KIenZvcX1yYXdkWm5wYXBxgnxzZnKAZF5udmljZnl6dG1ugXVzfHNxYl5mbm99ZWpUaVlZVE54X1JKWllIYnRjYUlUbVNJTFpWaWxye2JsbHNiYVlaW2F2XFNLZF1YaVNXR1lgTkdpdVheYW1bW19iYl2FaGhhbnh5bG5qdoGQeW6DfoCBkoiEgXZ0iXSMhnNxd3aBd3x9foyPgH6TfnB4loN9mZJ5gIB4eX5/c4iDc3CZont6f4mVeWR1iHlzeHZsdG9+bHl8cJFyXnBuYGdibFRaWVdoY21lXFxxiWVTcm5bWlhYYGx2ZGl1ampeWm1zcWx0c3Rqhnx+gHx3b25sZGlxY1tqcmR0do9zW1ZTZGBxf35xgVxhY11TWmBcY5KfZXJxhYSRdGxqeWxvb3p7enGAdn5yenp6ZGV1Z15iWmFnXF53aFdiXW9oYXdhW3t2amlyb3d0c3RocIGUgoZ+hHZyanB7bGZ2V1tqbWJwc4F6c2ZvfltgcHFiXmlwfGxrc35ycXhrcGBcZWxte2FoVGdVV1JQdltTUFpSSGNzYmBHVWpQSE9aVWtra3xlbW9xYFtaWFlscFdSUGZXV2lTVEZaXE9IcnVYX2NtY1hhYGFdi2ljZG15eGtuaXV5hntrg31/hJl8goR5fYhuj4Zxb3d6fHSCgnyLj4OClnR4gpSFgZ+JdYCAgXR/gnCHgnVvopd0e4aLh3tmeItvbntvZnhwemxzdnONa150bmFnZWtSXVtVZ2JsbFtccYxkT29uXVZYVWdpdGhidGVlXVpudW5wdXV6a4d8f3yId5BzY2Vrb2Fcbm1jc3iHa1pUVmJjd3x8cIVcY19jVFtgWWOWlWNucIOFinNqaHpuZXJ2c3tsenR1b3p+dV9mcmNbXldiZFlhdWVVX2BtZGFxXV1+cGhpc3FzcHV1a22Ek4GIe4VxcmZufG9xblNaZWplcXSBdnNibXZVYnFrW15uZXxlbHV8cnJyam1gWWRqanhfZ1RlVVZQVW5YUVdUUEhlcl9hRldpTkhYVFZtaWR8aWt3a2FXXFVbdGNTUldoUVlmVFNIWlpQTnh3W19mbGlaYmBeXo9uYmZreXVub2h2dn9+bYOAfoaXe3+HgYp/a5OIcmd0gHt1gIN9iY9/i5NyfYqRhYefhnt/hoxzgIZzfYJ1bqWMc4GNi3d4bnqMYGR8cWZ6c3lsbXF2g2dkfGxjZmdoU19eVGdgbG9cXm6OaE5pbWBUVlNvZnNrZXhkZV1ZcHRtcnp4c22Ie4B3nHt6a2FlbG1eYG9qZXB5fmdaVlhga3d7e2+DXmJeZ1ZZYFdknIhia3GBh313a2p3bFt2cWt5aXVybW97gHJYam1fWV1WYmNYZXFjU15haWJibFpgfmxma3N1bm13dmtohYx/iHqHbXFlb3tscWxiWF9oaG90gXNyXmltU2VwZVVibmF5YnB2e3Vrb2xqX1hhZ2h1XWVWYlZTTllmU09dT09IZW9dY0dZaU1JX0tYbWRfeGhufWRgVV5UXXRbVFJgZk5dYVRTSlxaUVl1dV1fZm1oWGJhW16OcWNnandxc21odnR5g3OCg3qIjX58ioeOem6QinRsc4J0f3+IhYeShJWPen2Mj4iRm4SAfIyEcn+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fX59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6Ojo6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6MjI2NjY2Njo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREVCMS8wMDAvLICkoKCgoKOAY2dnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1NTMeHBwcHBwYfqmkpKSkp3xcX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16enp8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmJiZmZKPkJCQkJCMh4eIh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWGhYODg4SEhIOMkI+Pj4+Pi4iIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQj5CQkIuOkZGJh46KkJKTkIqPjI6Ph4+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ojo6Oj4+Pj42MjIyMjIyMjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCMiIeKho2GiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJGNiIqFjoaLj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQj4eNjIaMiIiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yMhImHhoiFiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2IioqLjYqOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJOSk5OTkpKSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZGSk5KSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSkpKSkZGRkZKTk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkJGRkJGRko2QkpGRkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCPj4+PiI+QfYyQkI+Pj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Pjo57jYx2io+Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyMjnOHinOFjoyNjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDboKCcH+IhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ1dXZ3dXFmbWpxc29naGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhnbGdpZnJuaGdjYmJhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWl5cZWZecmxdXlpZX1tYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9OUFNhYllrZFRRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QWWhoYmliUU9PTk9QUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktLRkNGSk1jcmtncGpVTk1MTU9PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJAP0BCUGxzbWlzcV9PS0tSTEhISklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+PUJJQjxPaXBtZHJ0ZkVKXlRGQkRFRUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs7QVlRPkVmbWlgcHFpUmFmRUVGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR1c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk6R1tTU2Nqam5xbWpobVQ+Q0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6TWNjaWxqcm9ta2xjQD1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DOz0+XW1vcG1xbmxrbE87Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A7XW0/PkNLZnJxb3BuamtdPDo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9CRkQ+PDw9QD04Ojttdkg4PDlLa3JvcG5rZ0c7ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFlRPD09SUxFRnV2TTc4OThKbHJycG1TOzw6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3lJO11/g395e3dWPD4/PT1KZndtUj09Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUhyeWtigoSDgoOAfV0+QENAQT5FdFY7PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARm90fYKCgYN+fYR1TUFDRUBAQU52akhAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXBCREVEQ1h1hoiJflhHSUpMTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnV2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/d3+EhYOEiWxBQVZ0h4mHh4eIg1dITE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzdnd6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIg1VshIeGhoaHh4iHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklJSEhJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlWBg4SEgoKFhoaDgoaFhISGhoaHiIaKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkBBQ0NCQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJZYWEhIR/gYKDgoOEhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4ODs7Oz1AOzk5OT08Pjs7PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlqhoSEgX6Bg4ODgoOEhomKi4yLiomKi4yJVDs4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmaFg4GAgoODg4ODhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo5Ojs6Ozg5ODk3Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1d3l7ent9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9cYSAgYOEhISEhIaJioqIh4iIiIqKjIqJiYx6Pjk4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pjs7PD06Pjs5Ozs8Ozw8OTk8ODo6Ozo5OTk8Pzw9QUJESUpNS0lLTFdvcnN1dHZ4e3t8fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQUI+QEJAQD49PT5APz8/QD9APT0/Qj9BQT9BQD1AQEA+P0E9Pjw7Ojs5OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoKCgoSFhIWEhomJiIiGhoaHiImKi4uKioqLiotePkNHSUtKSUZHR0RGSEdFQkBAQ0VDQ0FCQ0I/QERIRENFREVFQUZFRkRFRkRAQj88QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDREZYhYKDhIWFhoaIiYmIh4aGhoeJiYqLjI2MjIuKiohXR0xNTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT9CQkdHSVmFgoOFhYaHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxKSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LR0ZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDk4PDs8PTo/QD4/QENGSUlQX4KDhYSFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXJOUU9NTExLTEpISEVKSURKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VucHV3d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AOTo8OD0+Oz1BPj9BREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyLi4uLi19SUlBNTk1LSkdGQkdKR0xKRktOS0tKSk1NTE9QTkhJS0xPUVFQUU9PSkhKSkxKS0ZHSEdFR0hGRUVCQUJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFhWUlJUUk9MS0pERUZLT05PV1VRUE9RU1JNU1RPTVNMUFNVVlJTUVBMSk1NTUtOR0dKRkZJSkRERUVCRENjcHV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0NCRlZORk5QUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLaFZVa2FFUlFRUEk7O1FTUmB1XVVWVFZZWVJZWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tISEpIRUZJSUlISWlydnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUlHRkZFPz9BQUVCQ0dFREVMWFJNVFVWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUT9AVlVZXGRgVllicl1dVl1aVkVRWVpbWV9UWmdSVVZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p5ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdFRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJUUlZWVFpadYNZVX2QYFxYXV9XSVZdXVtbX1lJWVhZW11YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3p8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSEZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1VUV1JRV1ZjloBRZXJYWldfZ1BgZltbWFxnYUdPWmhnXFtcXV1XU05TUFBRVlZWVllabnJ0d3Z2dXh4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVFNUXlpYV1dXemtYWltcXlRRUVBJTk9XVlhaWmRxc3Z2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVVFJPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtNTktNS0hKREZIRUM+U2NVf1JRUU5LUlRRTU9ZUU1OUVNVVU1RU1JQT01MSENJSFJUVVpcbXJ1dnV0c3d7ent7e317fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlZUYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDP0NDQ0NCP0RQQkNAQz5CSEdWQEhOTUddaVFIRk9GREVGSEdIQkNIR0hLR0RCQURBT1BNU2RzdHZ1c3R2enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPz87Oz5AQD8/PmpRS2FFRkhJRUI/R0xNR01RVUlCRT8/PD08PT0/PT9BQ0NAPzw9Qj5KTUZVbnV1dXN0dnh6fHp9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSkpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9rZ2BucmptbHF1e3p9e3h6fHx4d3hkQkBAQj06QkNBQURCXF1Pe05PTk5LTE1PT1FMS0xXTUhHQEI8OTc3NTk5PTs7Ozg5ODk/O0JIP1xzdHV2dXZ4enx8fH18fH19fn58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklIUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5gZWBdXnF2a15gZ2t3b29sam9ubmxmYlhHRkZIQkFHSUVFRkRNUlBhV1JXUVBTU1JVW09PUVdQTUlERj46OTY1ODc5Nzk6MzY2Nzk1PEI9ZXNzdnd3eXp7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtUVFNRUVVPTFJTVFdYVFRYUkxXWVpWWFhWWFldV1dYaHNrXVZhc2thYV9eZGFfXllVUE1PTkxJSEpLSUhGQ1FQU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg1NzU3ODU5OUducXR3eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RVVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMUFJST01NTk5OTEpGUVBVWVNUTkpPT1VTVFxWUlVTUk9NS0lISEY/Pj06Nzg3NjU5OTY3Njc1V3Bwc3d5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0lHT1BPT01SSk9QUFBOTk9UTE1JUE9TVFUyPFhNSUFRPWNhUVNRUE5QUVBOTk1RTlRSUFJNSUxLT1JQUlJTVFFST0xMS0xMSENCQT06Ojg3NjtCNDU2Njpkb3F1d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRkFGR0dIRkpESEpIR0VITEhLSEZMTVBNRy9FX1I+M0A+am9hUlJRQEZVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG1wdHZ5e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYWVQU1RSU1RPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hFRkhKTUtFR0NPUkM4RU5TXWZTUVNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlTcHJ0eHt6e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRXV1VMTEtIPTk4Nzs/QD48PUFAQj0+RUhHQ0ZGSUdKSkBGQUFARkhFSk9IUFJhXFFQUk5TT09QTExPTUtNTE1PTltXS01RT0dJSENJSkxMSkZGRkQ/QkM+PEJGP0I/QWRwc3d6ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPjs/QkBAPkFESUVDR0dJRklFQkI/Pj1DQkFHSkVNT2JlUU1OTldLTE1LTE1NTUxLTk5TZE1KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLbm92eXl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9IS0U/Qj05OTk6P0I/PEBCQkFERUdLRkNJSUdHSENDP0I/P0BBPkRFQ0tOUVRMSklNVEZJSUpMSktMSUpMTU9QUlBLR0NLR0NCSkpMTU9NSUpJR0NDQ0RJSk1MSVlybXd5eHp7e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhlcUhLQ0dISEdKS0lKS0RHQj0+PTo6OjtAQj89QkJCQ0hGSkxKRElJRkdHQ0M7QUBCPkBAQ0RDSU1QR0lLR0hLREhJS01ISkxISUpLSk1dUkhIRE1HQURLS01NUE5LTUpLRkdHSk1OUU5MYm1pdnZ3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRvRktERkVHRUZGR0VHQkNAPjw9OTo6OkBDQD5CQ0RFSUZKSkxGSUlHRkZEQjtCQ0M+QEREQ0VHTE5IS05IREhFSUxOTUhJTEdGR0lJTE5LSkhFTklCRk1MT01PTU5OTUtJSElPUlFSTlJmZmZxb3N4dXt6fGxoam5la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkNFRkVCQ0JFQERCPkA+Ojs7PTo9PkNBPkFDRUdKRklIS0hHR0dGRUNAPUVFQj5CRENDRUdISUdNUEpGRkdLTk9LRkhKRkVERUlKSEtJRkhQS0RJTUxQTU9OT09OS0pITVJVVFJPV2RgYW1ncHJvcnl6Z2VoaGNpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR3bGp1dW1ydnFsbmxlck1IREVHQ0JAQkQ9QkE+QT06Oj0/Oz4+QEI+QEJER0tGSUZJSEZGR0VDQkFBRkZDQkNCREVFR0dIRkxRTElPSkpMTElHSEVGRURDSUlIS0pHS1JNQk5PTVBPT09OT09LS0tPVVdWVVRYX15caWFtaW5ocnNiZWZlZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1anN1bnV0c3FyamtzTUdHRkhCQkBERTxBQEBDPDg5PT45Pzw/QkBAQERGSEVIRkZHRkVFRENFQ0RJRkNGRUJFR0VGR0dFSk1LSFFNSktISElFRkhJRkNJSklLTUtPU05EUVJQUVJOT01OUE1MTVNXVldYVlhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3htb3VvcnN1cXFpb3pNSEdISEJCQkZFPD9CQkQ8Nzo+Pjo+OkBCPj8/Q0VGREZEREdFREVDREVGR0pFRUlHQ0dIRkhHRUNGSkpHTUpMS0hKTEZJSUtIRUtLTExPT1JUT0hTVVNRU1BRTU5RTk1QV1pWWllWWl1aWGFgYGBeaGVjYGRmaGdqaWhqZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3RucHJyeU5JSEdJREFDSEU8QEVCRT04Oj4+PTw8QUI8Pz5BQkZDRUJDSUVDRUVGR0dHSUZHS0hDSEhHSUdGREhLSUdLSE1LSktMSExLTUtKTkxPTlBSVVZPS1VXVFFUUVJMT1FQT1RZWllcWllbXl5eYGNeXGFja2JgZGdocoVoZ2pmam1ucG9uc3JqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnB1TUlLSEpFQkVHRTxAR0NEQDo8PkA/Pj9DQjxAPkFBRkNFRERJRUZFR0VISEZIR0lLSUZKSEhLSEZGTEhISEpHTExMTExJTUtNTU1PTFBQUVVWV09LVlZVU1NSUUxPUlJQVltbXV5bXF5fX2FgYWRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3b3ZKS0xKTEdCRURFPEBGRERCOz8/QUBAQENBP0I/QUNIQkZFRkhGSUZGRElIR0lISkxISEpKSUxKRkpLSElKSkdLS01NSkpNTE5OTk9LT1BSVVhWTU5UVlRTUlFQTE5UU1JXW15eX11dYF9gYWFfYWNlYmNoYmRpamd2i2xqaWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZvd0tNTExNR0NDQUQ8P0VFRUM9QUFDQkJDRUFCREFBRUdDR0hHR0ZKR0NISUdHSkZJTEhJSk1LTUxHS0lITEtOUUtSUU1TTUtOTk9QUE9UT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmBiXmBlYWFjaW5nYmloaG54dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE5MTExHRUFARD4+REVGQ0BDQUVEREZCQkVHQ0NJRkNISkpJSUtHREtKR0hKSUlLSEpKTkxOTElMSEpNS1pmSmRcS2xTSE9OX25Va3NbcXBid2NSUGF2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlMTkpLSkZDP0BCPz1ERUZEQ0RCRUVFRkJFRkhDREpFRUpMTUtMTEdHTUpHSUtIS0tJS0pOTE1NTExJTE1MW3NiZHBebG1VTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpyeXZrYmBrZWVteG1sdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QkI/PkJGR0JGQ0VERUVEQ0hIR0RFS0dHTE1OS01NR0pOSEpLSklMS0pKS01NTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtb3ZcWWxRXG1tWnFta29teHh0c2lwXF9ya3FqVXV5eHBjXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEVFRUJCQj1AQEZHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5HTE5JTEtJSk1JSkpKS09QT05NS05NTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkdFRlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJREVFQ0FCPEJAQkZER0ZMSEVDQ0hLSEhGSkxMRk5LTFNSTEdMTUhOSkhITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210Xm5YYXRfbm5vb3Fyb251c3R0altedGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl4dHVrb3VtdG9uc3N2c0hLSElCRUVFQUA+Q0RCR0NISU1JRkNGSkxJR0ZKTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTU1NTElLS0tTa2JaaV5faWNyclpfWWpvX2VlVWtfY1thYVFgbGhdalxvamlkW3BmZHBcWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSURFREZBQEFFRURHQkhKTEhGREdLTElFRkpPTElQSUxbUUpGSEhLTUlISklLS0lISUdLS0xMRkhLS0xMTEtJS0xOVFtcVFBUTFBPTk9PVlFPT1FOT1FKSU5QUWVyaVRZV1tbXFVZWl1YXVxcY2ZhYWViY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNIQ0VHRkZBRUM/Q0hERkdDSUtMSEZER0tMSERHSFBLTE9LTFdMSUVFSElKSElLSUxKSEZHR0lHSElFRkxJSktOTElPXFdeUFxbYF5PWFlTXFxiXk1ZWk1YYVJKWWFaU2BkXGFYW2RkVlZYXFlaWFxWWVxdYl5kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJFSUVHR0ZLSktIRUVKSkpHRUhIUEpNTUpNU0lIRkFIRkpJS0xJTEpIRkVJR0RGR0VFSkhDSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5eXF5TW15jXlpdYGNgWV9iW2BeW1RYV1leXWNiY2FjZmlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0dHRUhHSEtJSUlERktLS0ZGSUpOS05MSExOSEhGPkdHTElLS0pLS0lHRUlEQ0REQkZKREBKTEpPW2NZX15hX1JUUldfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXl5jYWBiYmJjY2VaUVlWVVxaXWNgX19jZWJob21ubGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtGQ0dFQkVISUZHSEhGRkpHSEZIS0lMRERLSk5NTEtISkpISkc/R0ZOSktLTUtLS0lHR0NEQERBSElCP0lKSE9dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTl5RT1xfYWNkY2NiXGRjYmRjZlhRVVRSW1haYV9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRUtKRkZGSEdHSUZGRklMSk5FREtKTE5KTElLSkhJRkJISFFNS0tPTUtLSUhHRUQ/RUNISEFBR0ZFVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVZZYFJRX19hYmFgYmJgY2JhZGRiWE9RUVFbU1tdXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQ0FHRkRHTVJIQ1FKRkhISEVGS0pNUEVHSEpLTkxMSUxLSUlHREhLUU9NTVBMTUtLSElDREFFREhHQkFHRUNXVUVcVF5TVl9YTlRVTlpbTUpLVGBhW19YXl5hXU9ZYlxgYF9iY2JdYWJXX19UUE5PUFhSXVtbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERUZHRElSYlBDVl5JR0dIREZNSlBQRUlJSktOTEtLTUxKSkdESk1RUU5OT01OTE5IS0FEQUNERkRDQUVGQk1IQktMUE9OTEZNRkdJSkhHTExNT1BJTE9QT1NQTFFTUlVaWVdZWFhkV09TVFBQTk1PVVRbWVlbXVxgYWRlY2dja2xwc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdHWE1HSEpIR01MUVFJTEtLS05OVU5PS0tMR0ZLUFNTTlBPTk9OT0hLRWBFRF9MRGZjRU1bSV5bcm1PTVVtWUxDUGBVbFdnSl1XVV5ETFFVTE1UVlFSVFhXVFhVVFxVUGZaaGhkWFNrU1ZWVVtcW2BgYWFhYmBmaGZubGhyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1NJS0ZgVEhKT0pJT01SUUtNTExPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpQf1FJfFlZcnNYUG1IcW5vYVZQcXFzUENrc21xdHBTb19bblhdVlxYVWtoVV1WY1pgWVtgVlVXf2p0dXVfX3ZfWGFcXGZbX2FhYWFeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU5CRExMRkpMRlFWTEtOSUtSWFdRTk9PTVFUTk9RUEtLTkdNUFNbWlRRUk9QUFBKSFp4XVR4ZWhZUlRRdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvb4BdZnp1eHFxenF+c31rdX1iUmd8ZXNzb3Nye3xvfXlvf3JfYGBiYVpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1IS0tISlBOTU1KTlZeWVVMUVNOWVpNU1NSTkxPSVFSVFlXV1BUUFBQUUtHZnhsY3hybVpLTVV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclJpe2xpanp6fWx4en9vZ29YdnZqdXVwgGByZ31pbHh8b15fX2JhW11iZGdpamRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdXpufH15eHJuTktTdE5DQkVQUEhKS0pMUU9PT01QWmBaWEtUV1BhXlJWUVlTTE9JU1RVWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUS2h4fXhgeXtzbmFebW9jUmdxdW5teXB3bHZ0dHFsbVx0fnprbXl8a3RtfGtwdnV4Xl9fYl5dX2RkaWdoZWVeYWJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRyb21MTFtWSEdFR1JQSUxNS0xRUVFQUFFXXFlVTVVZVWZYUlJZXlRNTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVS1draH1sbWx4YFtwenteYHpzY3JveHFoZXxpcnxdVEtsYHZ1a2l2fHttfnhrfHBdXl5iW19iZGRnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3NybGdtbXJ8a21oa3t0bW1rbU9ISktISUlIUVBMTk9MS1NTU09TUldSVlRQV1tWVlRUVGFgUE5OS1RTU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWFFOUFVUWFhYW1tVUlNXW1dYV1pPU1VXV1hSXVlXXVZUT1lSV1dXWFleW2dyXltbWVxdX2NaX2NjZGZkY2NiWmNjZmZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLTExNS0pTUU1RUE9MVlVUUFRVWFVZVVFaXVZVVFdVWVhQT0xNVlRRTlVTTk9NTFFQS0pRUktRTUtLT1JUUlFRU1NJSExOT1FSUVFRVFZSWFdcV1NTUFFVVVZTWlFPU1JXVlRZVlRZVVRSVVRUVFdYV11aXmFdXFpaXFxgY1xdYmNkZmRlZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZWZtc2RpaGtrZWRjZmhQSktMT09MTVNQTlNRUU1YV1VUVVdXV1pVU1xgVldWWVVYVFFQS09XU1BOVVBOUU5LU1BNT1VUTlFOTU5RU1BUUVNUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdXV1lbVE9UVVhVVVpVV1lVUlJYVlVXW1laX11VWV5cXl1cXWBhXltiYmNnZmRkYlhfYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVpZWFdYWlpYWVZcamRWWFlaV1ZUVFBLT1ZUUE9UUFBQTk1RUVBSWFRRUU9NT1NWTldSVFVVT05NUVNVVVRUUlRYVlpdXFpWV1FSV1hWW1tXUVRWVlZWWVRYV1RTUlhWVVpdWV1fXlZeXV5gXFxgX19fWmJiZGhnZGRhWWJgYl5eZmNjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRlYmRfX2BcUE1OTlJRTVJST1NUUVBVXFpaV1tbXFlaW2RxbWhkX1tZVlZYUUxNVlNNTlJPUVJPTFBTUlVaVVNQUExQV1ZSV1NTU1hNT1BSVFhVVVVTVVlYW15dW1tWUk9VVlZbW1dRVFdWV1hWVFhaVFNSWldWXF5aXl9gVWFcYWFdYGJgXWBdY2FjZ2hkZmBZY2BhX19lZF9gY1taXFtcWVpYWVdcWVxbYF5fW15eYWBfYlxZYFpRTk9OVlFQVFJPVVRTUFdcXVxYXlxfV1xeanF3eYBjXFtWVlhRTk9WU05RUVBSVFJLUVRUWVpXVU9STlNYV1RTVFJSWk9RU1NWW1ZWV1RWWlhdXlxcXlZTTlRVVlxcVlJUVlZYWVNUWVxUU1NdWFpdXlxgYGBWYltjYl5hY19dYmFiX2RmaWRmXltkYGFgYWNlX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVUlFXUlRQW11eXltgXGBVXF1panJ9c2xnXFVYV1FPUlpTUlFUUlRVVEtRV1ZbWVpTT1NSVlZWVE9WUlNaUlRVVFhdV1hYU1hcWF5dWVpdVFVOVldXX1tYUVRVWVlZVVdZW1RTVl5ZXV1gXWJiXllgW2ViX2RkX15jY2FdZWZpZGZdXmRhYGFiY2RfYl5YWl9bXFtYWFhYV1taXGBcW1tcW1haW15WXlldUE9PUlpQWlRVVlZUVFReXmBfXmJcYFVdXmJreXVtfWxaVVlVUVFTXFRVVFVUVllXTFJaV11bXFJPVVNYVlZUUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSV1JZWFlfWlpTVFZaWVpWWFlcVlRaXlxeYGFfZGNcXl1dZWFiZmReX2RjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9gYWFgY11fVF1eYmVldoJ7aFhZWVNWU1ZcV1dXVlZXXVhQVV1aXl1dVFJYU1dWVFNUWFJTVlRYWFhdXlhdW1ZdX1hfX1hdVlFZVFlaWmFZXFVWWFtaW1hZWVpYVl1eX15jYmFkZFxiXGBmYWRmZF9gZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWU1xUVldZV1ZcYGFiY2FjXl9WW2BkYV96dW9oWVxaVVdVV1taWVxZWFlgV1BWXlxgYVxUVVhQVVdVU1dWUlNVVlpaXF9eWl9cVl9fWl1eWV5WU1lXWVpdYlpeVldbXFtcW1tZWllZXl9gYGRiY2VlYmRaYmZjZ2ZlXmFiYGNeY2NpZGRnX2deYmJjYWFgXl9YVFpaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU1BWWlZWWlVYVVhXWF1fYmFkYWRgXllZYWRiYGtmaF5cXVtWV1hZXFxcX1tZW2JWVFheXWFjXFJWWFFXVldWV1ZTVlRYXFxeYGBdYVxXYV5bXlxbXlhWWFhbW19gXF9YWV1cXV1eXFpcWFtfYV5gZGNkZmZmYlljZWVoZ2ReY2BgZWNdZmlkZWlfZ15jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOUldZVldaWFtcWFdZXmBiYWVhZGFdXllhY2JfYWBhXlxcXFdXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFhXWFlZV1ZYVl1dXmBhYF9iXllhXV1eWV1eWVhWV1tcYF9dX1paXl1eXmFcW1taXGBhXmJkY2VmZWZiWmRmZ2lnY19jXmFmZFppaWJmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWFdaW1pZV1hWVVtdXV1gYGJieExXV1xZV1xbXF1aV1xdX2BiZGJiYV1gWGJjYmBjYWJdW1xbWFdbXF9dYF9dW2BkXFxYWmNlY2BSXFlPWFhaW1pZWFpZYF1gYmJgYWNfXGJdX11bXl5ZWVVYXV5fYF9fXFpeXmBiY1xcWFteYGJhY2VkZ2VlZmRcZWZoaWZjYmJcY2dgXGlpYmhpZmVgYmFjYV9gX11dW1lcWVhXWFlYV1xbWldXWFBYWl1hY2Zmcmt/SllXXVpaX1xbXlxYXVteX2FjYmFhXWJbYmRiYGNjYlxbW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlFZWFxdXFtaW1tjYGNiY2BiZGFgY15gXF5eX1pYVltfXl1hYV9dW2BhYmViX11UXGBgY2RkZmRnZmVmZV5lZmhoZ2RkYFtmZ15haGhjaGhmY2BiYGNiX19fXV1cWltZWFhYVlpWXFpaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3x8fHx7fHt6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2d3d2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t8fX18fHx9fHp6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCgoOCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb3Bwen59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYmJjI2NjY2NkEYoKioqKiKL29LS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb296gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjI2PkJCQkJCUOxYaGhobEI/v5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dXZ3d3d3d3d4eXl5eXl6eG9wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fX19fX19fX12c3Nzc3NzfYWEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl3dnZ6e3h7eHd2eHt4enl5fXp5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3p6enx9fX19fX17enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHx7fXp8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d5fHt+eXx6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3d3x5eXx6fHt3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6f3t7fHt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl8e3p6eXt5eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycHBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHFxcnJxcXFwcHBvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcHVycHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxenFvi3ZvcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXGNc3OYeHBxcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnJxcJd7dqB/cHJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0n4J7pIdxdHRzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6fnx+fnx2dnd3dnV4enh4eHh3d3d3eH+njIimkHd8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7e3x9fqmShqWVent7e3l4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fXx8f3yCq5yKopV9fX9/f3x8fYCDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgICAgICCgJqvqKenlX9/f4CBgH5+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/f3+BgYCFrKalr6afgn9+f35+fn9/fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/gH5+f4F/fo+pmaKqm6OPf4B+f4B/gIB/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYODgoGBn6GTn6SYn5iAgISOgn+AgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBg4uLhYGYnYqdqpudmoSIm5KCg4KDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBhZWbjJKdk52umZOen5+aiIeHh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4GDhYSCjaWqrKmjnaWZnaSinZCHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46RkY+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDk6aooZyfmpuen56WhISFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgoKEkZeWmJ2ZnJ6cmoyAgICAfoGAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2DgX+DjZKWmpeboJ2ThIOAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOJl4iEgoWGkJaZl5yfm4iBhIOBgYCBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGPjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWFhISDg4OChI6Zi4OFhISKk5mVmpyQgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEg4ODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBj4yDgX9+fXx9jJyNgIKBgoOHko2RjoOBgYKDg4GBgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GVl4mAfX19fXuBmIyAg4CBgoCEiYiBgYKBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioeDg4OEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgJWfin5+gH2Hin6EhIOEgoODg4KEg4CCgoODgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKf4yFfYaJgH6FhYWEhYJ/fn59f4OEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOKkYOEi4WCgYF+fYGHhoOAfn5/f39/f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWGhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf359foWBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiYiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhIR/fn5/gH9/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDg4GAgIGMiYGAgYKCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiYuLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5COioaFhoWDgYGCgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKCgoKCgH9+fX19fX5+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fn5+fn5+fn1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4aJiYODhIOFhISFhYaIh4aFg4KCg4WHhoeGhoOCgoOEgoODhIKBgoGBgYODhIODkZKQjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCgoF+fX1/gH5+fn59fH19fHl8g4aGh4SDgYODhIWFhYODhYSEhISEhIWEgoKCgYSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gn9/gIODg4ODgoJ/fX5/gICBf31+fn19fX17enp+hISEgoGBgIGBgoKBf36BgYGCgYOBgoGCgoKBg4OAf4CAgoOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYODhIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fYCCg4OCg4KDgn19fn+AgIGAfn19fX1+fXx6enqAgoKBf39/f35/f4B+fYB/foCAgX+AgIF/f3+AgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gYODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgIB+f35+fn1+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEhIKCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXuAgH9/f39/fn5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+fn18fH2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoOCgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2BgICBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f39/gYB+f3+Afn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoODhYOBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19e3p5eXl5eYCCgoKEg4GCg4F/gYCBgYGDgoODgYGCgIGAf4CBg4GDgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8iZOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFgoiFgoGBgYKDgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4OMhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYOCg4OCg4OCgoKCg4KCgpKQi4iJh4mHhoaEhoWFhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoaHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko+MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GCgYOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYGEkZKOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgH2Gj4F+fYJ+fn6Agnx8f3+CgIKAfnx7ioJ9gH9+gYCAgIKBgoCAgYGAf4uUj4yLjo6MiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8goCBfn+BfH5+f399gIKBgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJKMjI2Oj4qFhoaFhISFg4KDgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4N/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+f4yRjoyNjo2Nh4SGhoWEhISDgoOCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEg4CAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1+f399foB+f36Eko2MjI+Ni4qGhIaEhIODg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn1+fHt8fHx7e3p9foCAg4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoSChIOBf4B+f4KCgn9/goJ/gIuQjYyLjYuJh4SEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+Af4GBgH99gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoF/gIB8fH17fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoKEhIKBgoGFhoWFhoaHhYGEkY+NiomLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f3+Af39/gYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn1/fnx8fHx8fXx+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiYqJhYiSjoyIiYeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4ODfX19fX18fX19fH1+fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4qJjJGPjYqIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSDgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7e3l6eXl5e35/hIOEh4mKh4mOj42LiYmFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fXx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI6NioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4GAgICDgX+AgYSBfn6Af35+gH59fn6AgH+Bfn+Af39/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8fHx8e3t7fHt8fHx9fIqKiIiFhYWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBgH1/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHp8e3x9iYeHhYWHhYWFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6AgoB+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHg4SEhYSEg4SDgYKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWDg4OEhIODhIKBgH+Af4CBfn19foB+fn5+gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fX1/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goWAg4KCgoOCg4GBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4CDgn9/g4J/f4B/gX+Af3x7e3p8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fH9+f4B8f399fYGAgH59fX9/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgYSEhYSEhIGDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgYOEgoGAgYB/goCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX5+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIGCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gICAf35/f3x/f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5+f4CAgIB/gYKBgH9+f4F+f4CCgoCBg4KEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX+AgIB/f39/fIB/f4GAgYCAf3yAf35+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKBf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB7gH6AgH+BgYB/fYB+fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYODg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf4CAgHyAf4B+f4GAf39+gX9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd8eXd4d3d4e3t7e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNveHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH9/f31+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXt8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8e3x8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXl0dXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYF/gICAgIGBgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDgH+CgYSDg4SBgYOBgoOBgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9/gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYKAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIOBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9f3t5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYKCgIGAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKDhIaEgoODg4SChIOBg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB9fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIKEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgYSFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGEhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDg4SEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhYWCh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF5g39/f36EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf31+f31+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIWEgYOEhYOEhYOKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg3+Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKCgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW53bHB5bHV9f398foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYeGhoCChYODhYeGg4WFhYaHh4SDhoaIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af31+gYB/e39+fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyaW95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIKBf4GBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhIaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhYWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bnaCgYF+fn99fXp9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYWEhIWHhoSEhYaFhX13hYOEhIKBgX1/fnt8e357fHx9f359fH5+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhoWEhYWDhoaFhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fnt8fH1/fnx8fn2Af31/gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoiFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSGhYWFhYOGhoWGhYWGhoWEhIWFg4SHhYOCgoWDhIF+gIB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoSBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDg4eDhIGChISDgoCAgHt7fn18fHx+fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYaGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoWFh4WFh4WGhYaFhIOEg4OEh4GDgIKDg4KCgn+Ae31+fXx8fH59fH19fH57fHx7fHx9fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeFh4eGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWEhIWFhYWFhIOBhIGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFiIOEhoWEhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOFhYOBg4KAg4WCg36BgYF/g4F/fn5/fX98fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYaDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHt7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIaGhoaFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhYWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWFgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOEhYWDhYSAgIODf35/gH9/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t8fX19fYB9fXx8fYB/fXyGg4aGhoaFg4SDhoKFgYGAf3+AgH5/gYJ8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SFhYWDhIODhIKEhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8ent8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIWFhIGDgoOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt6enp5enp6e3x5e317e35/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgIDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8rKysvLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dXU1NXV1NTU1NTV1dXV1dXV1dXV1dXV1dXU1NTU1NTT0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzQ0dDQ0NDQ0dHR0dHR0c3Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19XV1dTU1NTV1dXV1dXV1tfX19fX19fX1tbW1tbW09LT09PT09TU1NTU1NbW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNloSGhoaGhoeHh4eHh4Ky4t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLrR09PT09PT09PT1NTU1cm7vb29vb29vb29vb28v9LS0tLS0tLT09PS09PT3OPi4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QT0+QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzm5QU1NTU1NUVFRUVFNMoPPr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6Knz9PS0tLS0tLS0tLS0tS/qKqqqqqqqqqqqqqqqLDS0tLS0tLS0tLS0tLS0eDs6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzM5xVFhXV1dYWFhYWFhXUKHx6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSjqM/T0tLS0tLS0tLS0tLUwamrq6urq6urq6urq6qx0dLS0tLS0tLS0tLS0tHf6+rq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs8PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183OeF5hYGBgYGFhYWFgYFqk7ufn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqazP09LS0tLS0tLT09PT1cKtr6+vr6+vr6+vr6+uttLS0tLS0tLS0tLS0tLS3+np6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcfFxcXFxcXFxcXFxcXEy9DPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs/Oz8/NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS1NXV1dXV1dXV1NPT09TT0tLS0tLS0tLS0tLT09LV1NTV1dXV1dXW1dbW1tjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Pz8/Pz8/Pz8/Pz9PPz87MzczP09LSzs3P0s7Ozs7Ozs7O09TQztHU1NPOztPTz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dTU1NTU1NbV1tbW1tbW1tbW19bW1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O0KaSxdStg4OVz9KkodDOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A9Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0qqdrJXDm7y4mbSzn6Gp0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD5BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MmXmYWmn6iOgI3FnZiVnMjQzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PTo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RpLC9moyjiazWupiinbCy08/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9DVuZuLq62bpbKZlq+zqtXQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/Q0ZqgpaSclqeQmoSdk6TV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1aekoNWktKuff6CphZmk1dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0sCdosjXytnBnIC8raaYr9bR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09SkoI+5w4+hn5+ZqJaYm7vV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocjGpr2Vk5Ooq6Kfw6CrpJzR09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xBPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDUyo6Tl5Cqq42PrNjCj4281dLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZHS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tTCr7Cz0NbAv9bS1cXE1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR1NbW1tLS1dXT09PU1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4Nzc3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY4OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKWmpqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgXNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKhoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ6dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5ibmpmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpqampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXmp2YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaOe2pmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojs8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OkoqGgnpuZmZiZmZmZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD87OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGhoZ+enJuampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5qbm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpuampucnZybm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuamZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmZqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZibnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iYm5ucnKGdnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CUmZmYlZumlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouEjJaLjIqRnIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkI6Wgox+jpKMiIWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYaNmZuQhIx7jYqPinp9fYaOjYqGjZSSi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4aIhYSIiImEf4J/enx6iZWRkIKFaYaFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfomQi3+HjYyLioeSioeGjZuWi5GIf1+GhYiMjouOiomQj46PlJSYkJWcmp2eqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVVYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamZCdoJ2Tl5qgmZ2boqGVkJuskZObmHtZho+JkZGOko6LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqqmvoZqgrIqOoZ92WYOZjZiUmKCgoaSem5qlp6Spq6+spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq+qqqukoaKkqaemqaiipqSFhqejdFtzoJmdmJ+hoqmnoKKirqyrqqetr6ilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6WnqaepqKOnppmcpKaioaGhoaWcgoKhonJjZpmfnpafm5qioqChn6GiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1cUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnrKmkn6Kgoqahpq6mpp2fn5+lkoB+nZ1xaF+NoqGbnJqcoJ6hn56eoKOZlpuYpKKipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nec19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuwqaiqqKGfoKeprbCyr6yjoqahrop8fqWeb2pchKSlop6doJ6fpaKinp+imJWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1pgX1pcVlxoZG5jbmppYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7mDd32ypmxpWH6loqOanJyXoqiloZ+eo5udoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ5amJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS4enJxsK9nZlSBpZ6flpWal6SqpqahpKOkq6almaGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh1a3FoaWlhWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLG0tbW8vL68vL7Guri3ur20rnduZay3a2BSja2lpZ2XpKSnqKSupKurtbWvs6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllUYWlgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGwsO5vb/AwL2/xL28ur2+tql+dWmitnVgVpy1rq6qqqesp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmtjYm53dXZubFtiUVZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TAxcbAua+9vMC+vremiX59laOEbWqqvKyvr7Spqqaqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWttZm51cXJ1cWdeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8mwloh7hoyRiXmAobiwn5qwrqykrbC0p6qpqKqtrKmmpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtsbmRvbWlxeG55aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7y7vsS+xcjGxsTExLm0wLe0u8XLnYJ4ZnaEhnxsfIamtqqZorewprC7tayupaSjqKSgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcnhzeWZmXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbJxb/DwMvNz8rHxMPEwsS+uL3KvYluYVNifX5pVWdwjbOqnaa0s6yywLWzrKmjoa2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWZpamhda29ueHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM7Pz8zDx8bIycjHys7KycfIx7/Gy6R5Xk5IVHd1XkRZYnmnt8C+vrmsucG6vKytpqq7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3Zoaml0bXhsXWRbVmBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDOx8zJwsLHwczV183Lys7FybyKa1BFP05waFg9TlxslcTMxsawmbrEu760sLCwwb6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW50Yl1iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDxL+/vsTLyMrLyby8yMbJ1dvVzcnJxcmndlpMV0VKaF1WPUlWY3u80MawkIm5wru6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWZjamRiam1ub15ZXFZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjJw8vZ08jDwsHGomlMYpVqSGFWWEFNVV5pr9a9k3aFvLq7u763tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWNkZGpjZ2NbWlpcWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tri0tLW/u72/ub66urTAuLW3sq66u7fAt7zK0cG9z9O8tLy9va5sRoC+j0pgV1pEVF9bX6LGo3tok8O3u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xY2BiY2hqZ2dpZmldVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS1sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vC1ou6v8LZuaGlr7S4d0mDq45MaGVjQlVzYFeRn4JsZajGv7zFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F4cW1lZWZvaWVsaFhYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+80MRzqcu+3M2aj5aisIFNcX5wV394cU5WgWVVeHZrY27BxsW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d8a25wZ3Brc2ZibWBcVElLSkRKQkNHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLi7sr2+u8S2tbi1t8C+xLzCxNircH+8yNTesoSFj5l9VWNmVnKZgn5uVXRjWmNiYVyF0sfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcmZsaW50bnhjZ2JcY1FLVEhFRUNIQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ub3HysrDx8nSlGxxrdHQ29SSdnx/dF5iXU6VpYOEiVRdXVxZWVhhqtLJx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2NeYGFOSU0/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7xtPDur68xL63vMC/ydDHyMrKwIJub6PLy8/guHNqa2dgYFdVqKGAg5JeWFlWUVVSecbLycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh6bW13e19wY1teX19UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy2u7mq28O+tr7Avr63opimr7PCwKN0cnSZxMfK1teGV1VRT1BFW5+ReYOJZ1pUT05PVpzJy8bCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem5zeHNncF1bXl1ZUkVEQ01JQUU9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8a1bKvNvLW5wLynemxnbmpyf5WWbXR3lb2/xsHVqFVCQD5COVqJfXF/f2lbU0xMTna3wMHCvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fXZsdXtwbmlbX19aU1BBRkhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDOsXaAsry1tsGhhWlaX19MUltbbW5yfZ24t8K4vbtzRDU1OTRScmpqc3BkX1dMS1ygwLq5t7bBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdXZ3bnFgX2ZdW1RKPT8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCyqaEd4qhr7SYaGNmVVlgSkpNUFRqc4Sjr7e+ubO2nmg3MDUzRl1VXmRiYGJdT0x2tL+4sq6yvLquu7Szpquorbq+uMvCv76sq7Cvs7u3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NiW15PSEI/PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8aniHt2jaGUXlNCWVRIYmxXUEZJY4ufqq+2urW0sq2UUDMxMUFQRlFXWFhgYFBcmLm6tK2lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJtY11nWFxdUk5OQT5KQkFKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLi/s5CBeYiOa05KQGhYQk93g5ZsTEJXfrC0s7WytK+urXdMMDA/RTtFVldRWF1RfLCysaysnqSnp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXRpbF1balRdXFBNSERGTEJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzuLWVjYmEeVZGQVKIV0pKVnaMgGE/Vae4s7SysLGtsLmke0AtPlp7l6eiknNVWpWrrKujp6CdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRVYWNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K7qZiZlWhNQFZ6bk9JSUxmmn9XRVWvu7Gss6+urK21t6BmZ5Opp5+am56gf3ednqepn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moq6ufpqObo5yVkIyPj5CTkJeVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/emN3bG5cUWhUUE5HUE1MQk9RQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcGqpr1kRVWig1BZSUthSliJY2Zmgay1qrK0rqqqrrCtq7CnnI+WkY2WnqCgn5qjpJ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqqxo6WonqCclZOQj5GQmJCWlZiXn5ibmZukmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV2fW1re2RoVVFjTUpIR09STUpORzxFQDwyQDg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoKzGwMqaTkJ3nW5Pb0tOYmZ1cmBfZnSNsK+us7WqpquqopyYkoyPlJWWl5qeoqGbnKSemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWalpuXl5ihnpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eHxkeXlgYlJVYEhJSktTVElSUEw5P0E2Nzw2NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZylxsaIV1JLZqJeaX5ydllSa2NdaWZlaou0sLC4rKagm52ZlJeZmI6NkJSQio2Nk5iinJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrC0qrKuopmcnZ6hmZubmpiZm5SWm5aZnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dnZzaIJsZVtTWlpNUUpPT1VMU0xBNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6Kan6qjjXlVbHJ1dW1idXJYWWBfZGldYFhirK6sr6efnaGflpCTm5+amJaRkp6boaObnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuK2ytKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCeo6GgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1and1XWxaUmBIUlVIRlVWSkJMRz1LSDhGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoKN+b4FuYGRXTVtSWEtLUVdRSVJPQ5esqqmkn56YkpKTmJeVlJSLh4qNlJ2cnZ2el56Zpp+gqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6enpaSfnaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZybWl2bWhtXFhcQ1dOSkdNR0NGTTw+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco5+ciGFXX2ZgVk1PRTw+P0NDPj1CUXeoramqpZ+dnaKjnZ+dmZubk5KUk52dmJSFnZqgmqukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGxL3DvLezqbOtqrO1r7Ouqq+jnauntrGtorCmoaOvsa2wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeGgXt0cmtrdHJxaFZcUUZUSERKUEk/RUE0Rkg5NTs+Njs8Pj08Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+fk3tgXmVfUEVFOkRARjw+OTZOfqqzp6OjoaCepaulnpeclJGZnZiUjIqGiIZ4bYigo6KrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvsfGwrfEysnDwca+urS6urW7t7C1sqq6sq67t7+7uqu4rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtjaG94a2VaW0ZLTEVEU01EQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2cmXtyaWBVTkQ+Slx9cGJBPVyOrqygmZubnp6Zl5eXkoyOlpeTjo2Qi4KDgndycW1wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXFzNHS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysLFxsbKyM6/yNHMx8bHxcG8w8G/v7+2vrOuv8DDw8fEx8Suv7iyuLzDwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxERVBJRENANTU1ODpCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnpVoZFtTSERAP0yKoamag6CyraOenJ+al5aUkpSWkZCPjIeDg4iHg4CBgYB5cXJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19LX0tXW09TIzMbMzcnSzc7TzcXIysrBxsvHycjGv8Ozs8jEy8vLz8fKv76/vcHHxMzMyMnAw7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEE/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGbYlNLSURCP0RWs9K9srCmnJycoKShnZqUk5WUiX13cGtlYmhxb3F7hYqAdXBucXRwhbPDvsXR0NfW1tLWzdTW19TT0dPU1NPP0cPQ09bY1dbSy8nO0cvGzdLK0tXW2dbX09fYztLKz9HMz9DN09C/yMfKxMzMzM7PxcbHtr/Kv9LNzNDGycjAxMPIzs3Q0c/NysjNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZHJiXVJcSUpHQUVJSj47QTg9NDU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaCioFlJQEFEQEdRebKup5qUl5+cmqCgnpucmZWJd2ljYF9fYF9eX19dYmx1dHBwb2xycXWSxMjG1NbX19fT1tDV1NrU1M7P1dTU0dHM0c3T19bT1dDP0tPRydPRyNDX19jR19LY2dTWzM/Pys3Sy87QwcbDyMbOzdHR0snMzcDKzMbTz8zOyMXKx8fIzMrU1NHVz9LM08K5xbGlqLWup5uorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52mrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqiho6tlQzg9PkVYgqqon5iVl5manJ+dmJyckn1wZWNiX19hX19hYF9gYF9gZm5wcG5rb3J3d5zMwdLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cXR1MrQ1NXWztLQ2NjX18vIzsTJz83KzMDKwMjKzc7Qy9DOzszOz8jL0NDLzsrCycfJzMvM0tPN09HR0NDKvci5sK67uLWqtrCtqLits767sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVhFO0A9MzM8PTg3ODU1Oz5APTk8PDg7Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcCwqaytqaSxekpIQz1YjKGblZOXm56enpyTlpeUiGteXl5hZGJgYGFhYGBhXl9fXlxibXJvb3N0dnZ5pL/M1dHW1NPY1s7O1MvOzsXOytLSz8fOzc3Uy87TzcvX1tDM0dTLzNDS08rO0dTS1dXKwMrCxczCyMnDzMPFyMrKz8rNzNDO08zGyM/MyMfLxcbBxsrMzdDRxtDOzc3Mz8XHwbi5vcPDvcO5srK+sbvDw7WqmKWhmZaRlZWSi5SNmpGUlI+PlIKJhnlxcmttZ2BgcGhZWGhWTEZMSVBQQjtDPjs2Nzo4Ojo1Nz09QTw6PDw5PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCta+0qJ+ulXhvc3WCkpmNjJeVkJORkZWWlZCLfGVhYmJgXV5hY2JgX19gYWFgX11bXWdycnFyc3Btcnmlx9PPy9DP09TKxcnJxsa/w8bPzsfFx83K0sjLzs7G0dLQzczUysfLzs/Ix8/Sy9HPxrrEv8bJvcLHyc7FwsjAx83IxMzKzM/IxMTQyMbCxsjEv8HHzMzMz8LKy8jHy9DExce7x8PIycLPwb28v7DByca5vaqxsqelnaKcmJCbkKOZl5mRlZiJj4J3b3Rka2BeZnBhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68us3NxtDV1dna29jQyc/P0dPIwra7u62jtn1og4Slq5ONjZaPhYODg4F9hIR+c2BbXl5eYF5gY2RjX1xdXl9gYF9bWlxga3Jyb29rbG9wfbnRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMvJyMrIwcXMxsjLzcnEwsrJwcLM0MXLyL+5wbvGyL6/xs/Lw7/Du8nHyLvIxsXKwL3Cy8bFxL7GvbzAw8XMxcW8wMrCxcfSxcDJv8rJxsjG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Glm6Ogm5R7d3J0ZmlaYW5sWlxYUkRMRkJHRExERlNANTQzMzQ/PTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76xr7VsX3p+pJCKkpaGeoCFhX92eHVycF9bW11gYGJjZGRlZGBbXF1dX15gW1laXGJvcm9raWxwb3OPx73JxczAxsKwtrqysrOyscK8vLy6uMHBwcW+vbm9v7nEysXGwr3GwLi7xMm/wcm7t7u7xsO/vMHNw8a+vrXBvcO6vca7w7qzvMXEwsK3v7W2vr+7zMO8tbrIur++y8TBxsLFycbJxtDGwszHssfJw87MwcXDwL2zt7Cyp6ioubClrbCqrayUenZ3amRnYGhvY1deWUpGSkZISkFFQkVJQDk6NjQ4ODU0Ozo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTW183Kz8XJxcfBucW9q62lX2V1hpOLiIuEeH+Ghn9+hHt0dGNcXF1eYGBiY2FhZGViXVxbXF5cXl1aW1xeaHNxbWdnbnByeZ29zMDDusC4rrCxp6qtrKe4tLe0s7O0u7W+srewta+yvMK8wcS8wLu1srq+wLjHubS7tsHCvLi9xsHDu7Wvsra6v7TEt7u1q7i9vcC9sbq2sLa6s8W8tq67v7W3tMW8vsPFwMPFxsjLxcDGxrvHy8DPycfDxsLDt8O9vba5vse/rLW6tbe2jnl0eGdnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMrIysnKxNDN0s/NxcfBxcC/urfJtqqwmVtpcYyPhYiJenh+hoZ3d4F8c2hdXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5oZmtubnJ8pMe/ubi1sKutp56iqaeeq62zraqsqbSut7Gzqa6mrLO8urbDubq6sau1ubu0wrqwwLG+vLu2u8e5wratqqiwssC2uL2wsaiys7W7vKuutaautq+7srCqubCtu667uLvAwL65wr/Hw8XAvMbCyMq4xcfFv8fEw7rExsK7xsnMy7O5wr27s4lzdnZraWFibGhZWFdbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj05QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxdDHzcHDxr/ExMPDysLJyr/AvMK6s7S1w66psJFban+Sh46Pe3h9iYV6e4SAd25eXVxcXV9gX19kY2FkY2JgX11aW1paXVpaWlpcZW5vaGZnaWtucoGtubC1rqWkp6eaoKShmpylrK6kqKKrqq2rsKOmn6qttbaxvbmvt6+orri0tLy4tLyvuLm1srzBssCupamjq7Gys6i9qquoq62ttLOmqK2hpK+psqanqK6mqLessbK3urq8sby9vr7Ev7XCwcfIt7/AxbfEw7+7v8TCvsTIzMq/v8TAwKmHc3RyamldYW9jV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0I7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcq+u8m2vcO+usq3wcPBtLa8trGvtbutqKuTZW2Ig4eLgHt9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX11dXFpYWVtbWVhaXF9ma2ZkZ2Voam9yhamlq6Wem6GllJ6lm5iRoaOqo6Ogpaanpq2gnZykpqyysLa3p7CsqKq0q7S6sba2rra5sq+6urG2paCkn6axp6uouaqkp6eop7KtoKemn5ukpqyen6ekoKGxra2ssrSztLC1vLa7wcCyur7DwbK5ucOzwb3Atbi8vb68wsfEw8S/wMSgg3hwbGJmX2tvYFVZXkhOZ09USEVLRjw9Pz06Ozs4MjU1MzY5Ojg7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItbW9uLrAur22oJ6VnaGmurars7O7s8TPycvCxri2x8DMv7jJt7vFuLPEuLO/wKy1vLKspa+zraGjkmlxhoWGgHx5dXNvbWpqaXBpXmBdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+HnaiflZWaoZaco5mWjZ+ho6ecoKCkpaKnnpujm6CrsK2xtqOpqqqsrKS0ua23sKyzta6zta6wqp+en6OisqSmqbitoqamoKisq5mfoJ6ZnZ+lmpmjnJudr6mrp6qsrK2xsrivuLm7sLa8vLqrs7O5s760trKxtrW/tr7AvcPCu7q9l4R6c2xfZV5kZFhUV11JV1xLUEdJSkdBPD8/QDs/PDA0NTM1Ojs5Ojg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8PDz766x7i4v7eywrSxu7yrubqxop6pq6eXnpBtfoWGf3hybW9ta2JeYWZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrcY2nnJOUlJuYm6KXlpGcoqKonpydpaeipZygoZuZr66urrKgpqKuq6eitbGysqyor7OnurOmtqCinpyjoa2joqq1qqKjpp6lpqOWmZ6XmZudoJqXnZ2dnK2iq6ekpKatq7O0qrWws6uyubSvqq+ysrO4s66prK6yuLC7trq9wLizsZSFeXVmXmVeW1lWU1pVS1tRS0lFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7OdpaOYpbHCtba9rbS4wszIxr/FtsHAxs63wMS9s7m5s7+2sbm7rLK0r5+apKmflJqPeH+DhH94b3F0cWhlY2hkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oZuTlI+Ul5egl5mVl6CeoZ2WoKGppJ+fqZ2bm6unr7Crm6OkuKqhoK6otqqnp62xpLiwpLegopuZmaqmoZqsuK+ioaScop+gk5ShlJaWm5iXlpeclZ+qnqmkop2jqqqwrqi0q6qnrbOwpauus7GwsK6vp6iosq2xtLC8tLq4rqOUgXl1ZF5hVllYU1JUS01eTE9LR0dMTEU9QT48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunaeoo6q7wL3Aua60uMHMx8XCw73FuMjLssHCwa28u7W7vLW5ubCvsKqcmaGolJGKi4CAfHdxaWxydHBoaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNjYmNiY2RmaYGWk5WLkpSUnJmdlpacoJyflqCfp6akpqefnaCmoKqvpp+ipLeooaGiqLSipailsKWxrqy0nqGdlZWpoaKUrbGxn6KjnZ6Ym5OLoZSRk5iYk5eXmJeep5ynoaKapKWlq6SlsKelo6urraaprq+uq6iqqrOmpqyvtLGvvLWxr6+gknp3cmVhXFpdWE5MUkhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G4rJ6lp623u7zBxbqxubXEycnAw8bFx7bFxLLCv8Wrt7e9tr26urWyq62omZifo4uJdImIfnZuY2FmaWhmZ2lmam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZVU1VSVWBgX2BhX2FhYmVqgJOTiZCOlJOUnZWWl6SZoJedoKWiraalpaOko5yqq6Wan6WxqqChnqWrnqiinq2sqamuraKiopWYo5uckKupsJygop+el5mTip6RjZKTlpCYmJScoaOdpKGilaCipKabo6uloqSqo6uupa6yqaalpqa0pqmorbO1tLm6r6qsnoxycW9gW1dWVlJHUU9IWltPUklUS1NMRUZJRDg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5NTc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1ybyxvsPIrLG4wbW7wLu0tKqsppWam5yIgHKIg3t0aWlqbGdqa21ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXl5fX19iZG2Oj4SRh4+QjpqTlZKcm6Ocm6GoqauorKeppqSZpa+llZmlr6qgnJmboJ6vmZyrs6Clpp+jpKGUk5uWlpKpqq2anKChoJuUkIyZjoyQjJGNlpWQnaKgo52co5WboKOhl6Koo6Koq6CrsKStt6WjpKKtraqoq6+zt7O+tbOrr5iFdHNoW1lZU1VSRVhMUVtYTVROUExQUUlOSUI9Pz9BPz03NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MDE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraeztq6oqK+um6morLe2rLzKu7a/rMvGxbjBzs/Is8S6t7vCyLCtuL+3vL27s7WlqaCWl5iXh3p0gHZ3bm1obW1tcGdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXVxeX2BkfoyBi3+Lj4mSjZeRl5mioJugrKqmr6yosKWpmp+toJWWpKmonZiQj5qerpeYqKqZn52UpaGekpGSkZOVp6qlmpmZnp6WjYyLk4aJjYOPi5KVkaCeoaSYlZ+VmqGinpSbpaWnqKigsbGmsbynn6Kstauup7C1sLi1wLGtsauRfnJzYlZUVU5SSkdWUFJRTExXTUpMTlJHTUtBQ0ZEQz5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY3NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDl/s6ylsbeqpaKxq52qp6mysaS2xrS5urPKxbm6wcvQyrG2uLu9wcOxr7G3rbSzu7O0oqOcnZeXlIN/d2tnbG5xbnFqcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen91iIyGkIqXiZSTmJuZnqmboKumpqyeqJqgppyTj5+jm5eXhYSSm6OQlaOdlpaWiKKbm5SLjoqQmqSnnJWVl5uRkoeUjouBi42AkIqSkpKgmqCilpSYmZWippmNmaSmqKahoLSyp7K3oZyit6yqrqSysqa1vLWsq7GjiXlzbV1OUVFMT0NNTk5QS0ZOTkpKTU5RSE1KQUdLSEhDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLawpKekqqWgqKals6qissO1tbKzxsa3usPKzMazrLq9tLfAr62psJ6mrbqvrp+Zmp2VlId7g25fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYW11hb3N2cISIgoiAkYSOipSRlJ6hj5uco6KkmKWXopyVjYeZmox0jYN+jpeWhpGakJSOjnuZj52Mgol/iZifo56Qk5iWhY2ClH5+dIqOepCHk5CQnZuampKWkJ2Oo6OOiZqgoaOkm6K0r6yvrZ+YpbimprGhsK6csLuqqa+qmYN3c2NWTVJPUE5DU05MUUxCUFFISU1STUhKSkRKTEZKSj03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3i3oaO0qKalqKOmpaemp7OnpbTBuLC0sMnEt7nBzsa9s6y6wautw62noaaSnaa2rKOgj5WWko9+eH5lV1ZfZ2ZpZ2huY2poZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkhOU1NTVFVVVllbXWlscmx/hXx0Tlhyj4KXho2dl4uUkZ+YnZWUlpWPlomAk4pfO1dvfIyUiYCMkoyQhoZzioWXgXmBe4aTnZODlY6RkIOGfZN4cXCFjX2JgZGNj5eamZOLkImdiJ+YiIeWnpqhoJenrqmtqaielq2zoqatmayrmKizoqmto5N+cm5gW05TUldMRFRKUExMRk5PSUVMUU1LT0pJTFBGSUk9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6moo6qwqKe0wbmwtbDHwrezvc+/ua+utcKnqsWpo52Yg5SbsaKamIaUj4uHfXN1XVBMUlVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbW9pe4J0UUJAf5WSkX2JlY2Eio2bjpaViZKIhpWGeYl/YEpRbniLkoR9hI2KhX9/bn5/lHh1dniEjZlvUY2IioZ7fniUdmd3hoh9iomVi42RkpeMhIqIlYSajIKEkpqWnp2UpKOoqaWknpqwq6GkpJGmqpaiqpyipqiJdW1mXltIUVFTTUlVTVNJTEtPSUhGSk5MTVRLUVBPRklDPDc2ODo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7abo6edn6GvoaeopaeosK2qtry2t7ezwbu2p7rIuLaoqLW2qrK8pp6VjX+Jk6iWlYp+joOCfXhwblhNS01NTktNUVdbXFpYWlVVVlZWV1lZWFhZWVhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUpERERJTk9oWU5RU1RVWm6Dc3Z+amlcVY+JlIl0f4aBfIWMk4KSmouPe4aPgHaAeHNvdnF0jY6Ben6Kq4V5emh2e45wcm14gYuNknh6gHuAdnJykndodYSEhIV7lYmIio2LgH+Ei4yAlIN8gI+YlJyWkZ6dqZ6foJ2gqaWenZiMp6SToaCWnp+kgHJoYVxdSldQUkdKWFJPSkxNUkpKSkxQSUxRTFJUTUVIQTw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumaOimJyftKmvqaWtrLCyqr20sru4trq0sZ+3urKqnZ2sqaiyr6GakY2UgI6cjpF/doZ4fHZvb2lYS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedIJ7eGZ3jZeYjY99aHmBdniAiZB9hJiSgXKHj3x3e29rfq18c5CKf3uGkoF9f3RmdnyGbG9oc32JjIiAbHlxfXFtdo9xaHGBfo5wQ4uEgoOFf3d3eouFfYx7dX6Oko+YipKam6OWmZ2anZ6hnJaNiqSbjp6XjpaYkHdvbWViWlhYVVFKU1VUT1BOUFZLTktOT0pRTkhPT0xGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagpq+srquoqbGvsau8uKy7vrmzrKebsKesm4+WnKWppKCXmY6FknmIjouKdXF8bXVwam1qWEtGR0VBQENESUxMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOT1FUWF1lcHJsiKeqwH51eWN8eG98eYiQen2Lhm9tjJJ5dHhqaoCCcZaRi4F+loBJk5huaHd+gmxpY2x5hZCShmtzbHxucnuGaW1wf3ONiYSGe31+e3ZvdHOFgnmBeXB8joyKlIOWl5iakJKVl5mXnZaMg4mekYuSjYaQloBvam5vblhWWFRSUVlPUlRUU1hVTU5ITktNTktDSE5HRT86ODk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WtsKOsqqi1r66stL+rvMK/pqKZlaSXno2Ei5ShoZiYkZOLc456gIaMhnRvdGtxbGRsallOREZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcYKeIYpppdHplfnBtf3qLiXaCiIZ0bJqRdHN8amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3F/fGhxcXxuk46PfHN9fHFwbnZtgn93eXVqeYmCiImElpKSkIuNkZSUjpeNgHmIl4iGioaAkIh3a2tvaGVYUVpXWVlbTVBVVllYTklIRUpKSEdCQEZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDU3NzU0NzhpTzg7NW6SiJqRmZakqK6esp+nu6+rsrDCsbvDx5qWj5SZi46GeYSQmJSNkIyPhnGHgnSHjIZ6cHJwb29kcGZfVEZJQz88Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7Ogcnx4bX1scYOChYF6hIaGeXKhlXR4gHN1lIc1cZ2onY6hoYSihHZwhnyHfHOMrY2JgGdnYmpucm1wg3Vpb1h1cI6bkndsf3p9bXJucIB6c3ZuYnaDfoaAhZCQioqJkYuRjIuOg3V4io6AfoOAfY97cnBwbGBbXF5cWVhhX1JOW1pYV0xISkZKRz5CQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGTiJaRnaSnnq+VpbWqrrGuwbK7wcaWkIyUj4CIfW6BkJKJg4qHj4V1goRslYiIe3R4eGx3bndjaV5KUEc+QDc0NDk7Ozs9PkBCRUhMTExMTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHeIiHx+hYN/jH52opl5foaBhZmFm5xhhqqfnYuDkI16d4h+iYiNc4qXkIN6XWRydHp8d4ptaGpieW+GkIJ6boF3dIR6cHR5d2tuaV13h3yHfIeHj3+LkpeDjYWMhn1xhH+DfXV3e3yJd3BzdGVnX1tbXlRcZ15XUVVYW1VHSkpETEc/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJKcnZ+mkaCroLGor8CxusW6lo6RlId6hXZrf4yRgn2KhI6MeIOAc6GEi319gX9wgH56Z3ZrUldMQEUyMTEzNjc2ODg6PD5BRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHF8j4x6fYmHfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSSqIeAmJiKm3RtfIGGh32OaGdoeH9uhYeChXGEhkdsgHdyeXZobWtfd32DiX+IhYt6lZ2biYuIkX96dYt2fHhtb3d9f3R0cmxbXV1bY2NYZ2ZcVU9QVllQRExLRk5JQ0ZDQ0FAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWIkY+WmJKXoZ2soaa4r7O8s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0+P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgISChZGTfoWIkYGalYKhoZiVm5qlrZOau7Gnu8fDqIuMoaWPlImBkXxxg56fkZx/doWFipCIkGlob4OAdIyHhItxhYJ3h397doV9bnZ1ZoCUj4aJiYeIh6GqopaJjph/eoKJenlvZ2t4fnp+cmpkXlpaXWpdYWZgWU9LTldSUUhQSkROR0NKREJARERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMjBPg180PztudXBmeIN7gIyAgZGOipqbpJ2hrKarr7CXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46DgIGMi4KJjYN/iX9tcGpdQkE0LS0vLy4vMDIyMzQ3Nzk7PT9CREhKTlFSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZqPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyNoZ6ZhJOFgo+hn5OYkoSLhY+ZkZZscHWJi4KWjI2Pd4+EcW2FgYqWkYOFiHKIoZaHk4mOj5altambjZWig4eTg31/a2prfICBgXNhXWNeWmZrXGxrXldLR09SUU5NTEZJUENETUZBQ0VHQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCCcHWHcXaShn6XlpqVnp6cp6CplpOYnmdlpJp+hJKReYCSiJCSfYqEmJKRgoCAi42JhZCGhIiFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDU3Oz9DRU5QUlRQUVFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdnKilopmhl6KVnZ+onqiroKisqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqbmaeRkYmVopqaeHp+lJiSoZKWmIGUnnt3lZKrs4iNl599lJ6cjpOWmaSiprawnZGZqIiWj42BiGxzcnx/fHFoYFxgXmJnY2BoZ1tSRUpLUE9JSkxGRk1DSExGRkNCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdWBufWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImMioSShYOGiYGAhndfYlA0NjAtMS8sLjAwLy8uLjAwMTU+QUFNUVJTUFJTVVJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk5PUVlthpB3lYujp6q0vbikrqysp6i0q7C2srKtu7Gzvpyzw6y7ycu3w7+4paOwsqytqqOLlpiFpqago5eBppmNoqqopIiFlKShoKqhpKmPnLGLlaOnt7uboKOwk6Odo56RpKKrr62ztaKUpKqImYmSipV5en6FfmdgaFxlYl1kY19mZl9aT0RJSFNPRkhMRkpHRUZIQUtFQ0ZHQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gZOFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkY+DhYCLhYaHkoaChImGiIeHcW5hQEU2NDwyLzExMC0sKy0xLi0zP0RBTVVRUlNVVVdVTltQR0dFPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qxwcfDqrPFtqyzv7O4vra/tMG2u7ukuMaotsnHtb65tKijtK2xsZuZkpqfiaivq6WUdp+kl6GrsbOZlqqtqK62u7K6rK+1orGssbW8t7WutaCnp6OomqmwrbK6uLinm7apjKWOkZOfhniCg3VZYWRWZWFhY2BhZl9bVElERExVUUhJSkRJR0VBQEBKREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtaUWNkV3l1cYGUfYWHk3aFf4CMe7+7o7yCtJSTjZuPhIiPkomJeYaAjJONh4SBjn+BiY6GgIaJhYqHkXp4bl1WQEVNPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcVk9eVUlLSkFAPkdLRkVEOz5AN0Q3P0JKSkVGV1RQXo+lrqOxtMO2uMHMyba7xL2zs8C3t8G1v7C3dLGzprrFpLDGubGzsbSopLW2qrGgopabopKlsK6mraunpJigrLO6oqmyurS7vsy/xcW9vbPCt7q4v7e6t7msrLCmsKqtvrC9u8LCrJm6qJSuj5eXq4l9gnxqV2JhV2plamVXW2RZVlNJR0ZMUUdDR0lBSEQ+P0JCS0BATUM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1RZVVp2anB/j4SBjoRuenN5h2K4oZmiiJWTlpOUk42QlpKHh3uGgY2WioCEgYp6fIuHhnyKg4GKg5V9eHp1ZU9cZEdFTDpRY2FbXlNGPztIUERaY1FRWVhaZ1lUYGBNU1BFQT9JSkhFRkFAQzxFNkI+SEdKTFNaVF2Tr7i1urjJv7q9ycy7vMG8t7W7u7e9tLqxxmF1sqWxmp6qvaqlqKuqo6KytaGrqJ+Vlp+Yn66lp6aln6OUoqaxtKeysr22wb3TycrTxsLFy8HKw8C+vb+7vLe0r7i3tsO6xb3DyLCeuaqiq46lqLaJgX9yX2FiXVdhX2hmUlhhVlJVSUVFTktBPkdEPUtCPUJAPUY9O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdZ2xscZCNhZBzbHJyc4jVwLWZoI2VmJmRjpeSlpaOhod9hoOMlop/g3+DeHuLg4d7i3mBioKXf3R9emtlcHVZXVxQZWViYGVkXVtYV1xNZG1VUm1tX25fWGdlVVlVS0RBS0tIRklISEdCSTlEP0hLVFRWXFpbkrnAuL23xsC7ucrKure6tri5sre1tK62tplkdaicrXBeoa2cmKCim6SeqqWUoJ+QlI6WmJeon6WfnpqahKSdrKWqsKy3sL251NHP18/JzNHMz87KxsC+wsq9wbzBwMTExcq/yM60pLuwtK+bq7m8mn96bF1gXFleYVljY1FcYFNQS0NCRUdFPEBFPkFIQUBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpX3CXkpCUb2xvdXWHs6yhoZ+LmZyZjI2VkZuShYqKfoiGjJCLiXyBhHN7ioOGe4l0gYmGlX9ze3hrbXV7aHJlaWxpZmppaGBmaWhsWm50l62kvIiHZ1tvaF1aWlRIS05PSktRS1RRSExBSkdLUF9eYmZpYZe3x7C4s7u9tbHEx7WwubCwu6uysaeqt6yNtqedm6eaT5qdjI6glpGmmKWVipOTiZCJj5GRnpuhl5qVloeemqabrK+or6eztNTU1NbSy8/U1c7Tz83FwsnQv8rJysnRx8zNwtDSuLDDvMS5pba6xKKCb2NcXF5YYVhZZVpRXVdPT0JCSEVCSTtBQz5BRz8/QTg7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVdzkJCYgmhxb3l5g6CqnqaXjJubl4uOlZGajn2Ji4SOioqLkId8hIJwf4eBhnuHcoORi49+cXh1a3F4fnF7bXhzbGmBcG1jaW5weGl3fH7Lv8Lfp21jeG5jW2FgSlBSVU5ZXlBeXU1QTlRRVVRcbm52gnKXrbiss6ewtqqsvMCxq7WmpLimq66hq7SjjrGumpiYjJGTkYSOm4GNp5KciYOLhIqJhIuDk5WYl5ObkZyYmZmenquspKehrK3P0tXRzczS09TQ1NHOyMPU0cjN0tPT183S0cXS1sXAzsfHw6i+t9Ceem9mXWJdV2BTXVtPUFRQTkg+QUZBQkU8QEI+RUQ+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYaFindsd3B9fn+hnp6hi42Zk5OMjJOPloV5hY+QjYuKiJGHf4J7cn6AgYd5hHWFkpGJf292cmtzfHt3fHOBd3FrgHNyaG9xenlye77Lm36MsoN2coR2aGFqXUNaWltXZmRYZWtTWF1dYGReY3h7fouBmaqkpKGfoKilqrC4qqW0o6GtoaOtoqexn4mmmpSSkYmRjoiBlIlrlaKNmYSAhX2Rg4OTlq2LlY2VmY6FkpCdl6ewoaChpKSoyM7PyMLL0dTR1NPO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsxMPLi3NvY2BfWFRaU1xQSkdJSkpAOzo7RUJEPEJDPkhCPkJCOzs5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnZWdlIWLlomPioiOh49/eISTmYqNiIiLiX6CeHN7fYOHd396h5GWgINueHBtdX92eH50hXx5bYd2dG59doR1eXudtow8QYvGpX6NfGllVklDZmNlY2hqZG94W19maWtuaW6Ag4mRi52eoJ2Ql5ifo6SmsqSks6ChpZ2gqaCisZyGnpKSkpCLjouGg5CEfpybjI2DhIV6lH6CqZWjjJKKl5KLfZeKmpGqs5iam6ecp73Dxrm2xs3S0NLQzNLLydTO0NXa19fY1NnYzdjbzsna2tLVv8vMtHh2b2VdWVJWUVpWRkdKSUVFPTo3OUBBQjlHREBFQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYXFxc4aNfJeRnYt+h5KCiYaFioGHfHiFlpaIj4OHhYd6hHhxenuEhnV6hY6NnHqMcHxvb3p/cXyBcYOHgG6OenV3fXyCdX98h4iwdFmpwraMkoJwbmI9XmhycHFwbnh3gWVpb3J1eHJ6i4eOlJKblaCVh4yTm6Cbn6qfoK2coZqZn6Wen6yZi5qMkZGNhH2Ih4OFi46fmZOIhId+bZl5hJiGiJOMjpSMhnubiJOPrqqUlZeemKeutb2prb3Gy8jJzMvPyMPRytTW2NfY19Xb19PZ29bQ29rR1snUy5V5e2lpW1pQUlReSEJFSUk+QT09Nzo9Pzs9Rz0/QUFBREE+Pjo4NkRCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJma3aAiHGRkJqAeoCNfoKCgYR+g3x8hJeOh4t+hoaAd4J5bnt7hoF1epKejaB2j3WCdHWBfXSAhG+Bj4FvkoR0fIGFenaGe4m3xqXCybeBlpuPd3BlTmZjgXqBd4aikIt4eXd7g398hHVuk5aUlY+YkIOKj5aal5elnJegl5+TkpejnZmrlZCQio2RgoyFiYiBhZCRnpyZiYWLgYaYeomIn5ePiI6KjIJ8oYmQi7yhmJOXmpyppqWun6i1vsDAucfJzc7FzcnR1tbV2dXX29TX2drb19va2djO3MaGenpoaWRgVFdWVU1KRE5EOz08PDk6PD45PUA2PT9APD8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6i3x+gH5/fIV7foGRiYSFeoSIe3V9dG18fYZ+c36SnZGeg5J8hn54jn15iopugpqAdJiFfoGJhXx+kHqPqY+Qw6C8jJyjnH2JhH2Jc4yKfnOmmpyYlIV7j5CJhGhHcKCknYyLkJKFiYuQkpWPnJqSlJGXjYyVn52UoZSRjY2Qi36Qjo6LhIiSlZqfn4mMlJKekYKLf6WZiISOg4aEgKWGiou4mJ2RlZaip6Gdnp2jrra6tau/xsrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19y3eHh4bGpkV2BbVFBOR0NMQj09Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYGOinFyeYp7en98f3uIe3x7i4eCfnWDhnlzenNtgH6EfXeFm6GbnZSSgIuIf5iHgJySboeohXqgi3yRjoOIhJx+mpGKjaOin5CkrqCLkYuFi4GShldyrYufq5uPg5ibkJCOW4KikYKMn5OVjIeIjJKTjJSUlI+Mj4qIlpudj5WWkYuSlIaAi4iSjYmKnJaZoqKGkp2WoYuKiI2ckIOIj4CDh4WkhoyQs5idkpSXoaGemZKcnqexuKylvMLHzcfGz8zQzM7Xz9HUrtbV2NrY2trX1tnan298dWhnXF1YU1dYQ0BJRD4+Pjo0OTo7Nzo7OjM7Oz88Pjc7OToxOUc9OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bWJ+koNvbXeLeHl/eoF8hnx7d4aEf3NwhYJ6dXZ2dISDhX1/kqajn6Wilomdj5SXi4qol3KKsYyEp5GEmZOFmYuilqCYk4mbnaGSqa+fkZSQjY2IlYtujbeFmsTIspyhpZucmJaQspBkpM3Hlo+Fh4mQko6Nk5SJhYqKhpaam4+QlJOGlJeEf4+LmYiNkKqXl6OjiJmelpuJj4eXl4qEjo2Bf4ePpYmNk6mal5OWmaGZn5mTnZujs7Slo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoJyf2hjX11eTkpUWkJBR0Q7QT04Mzc7PDo4PTY0OTo8OjgyPzk6MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PjpFTUZIUldTUkJjgUZ1go99fG1+iHh6fnqBgYN+dnaAg3xsbot/eXx4eHyEh4t9iqOzp6OqsqGWp5+lpJaVrqKDkLiVkrOZjaGgjKWbr6OknZiQp5anma2vpJeUlpSQi5iZlqDAjqTJuKuboqatmJGanLKdhoWoopyYhYiJjpWNi5OOiIGGh4iTmJSMi5OThpSYhoSRkJx0kZmylpekoYicmZOPipCLl5qJipaOhn2MmJ6JkJCcmpmTmJiglKCdlZ+bobGuoqS3vrTFx8S9w8O/xs3KydKnzs3T0tDW2NPQ2LtyeXZcYFVfV1BISU5FQkNFNj46NzY6Pzs8Nz00MjY2OTc3ND01PDU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nj06SkZER05bXFlJZmA7SISLenpthYZ6fIR4gIWBfnB4fH18b3KNen2Be3iGi4mFg5Knu62osr2vpa2zs6ijorCsipq1naO4pJWtpJaprbempKOfmamYqaOvsKqamJyUlZGXn5eZu7utyaBptrirsJSYnqOrk5e+o16qsoKJio2Uh5F8jo59g4aOj5SViIeSlouPlY2LjJeYkp2ZtJaVq56Lm5SSjZCSjJmbipKekIuJlaChjZSNmJqdk5yZnpShoJScnaWvqKGls7irwsjEtbq9u8XHx8LRocbJzc3E19bRy9OhcHpoXVlTXlJPRkQ+PENBQjg/ODc0PkY8PDY8MzUzNTU0NTRCMzo6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZUdiYGJwSUCLin6Bc4aHfYGIdYKKg39tfX18f3B3hneNgYd7jY+MhoyZqsLAr73Gu7O0wby0rauztoyosq6uvKqbu6Sorbm4q6amoqGjo6ivsrGrnZykmJuYl56ipaWRo7muqL+8rK2yuaWjp32IhpytvbCDi4yLkIOPg5GPeoGHkIyOnIiHj5eNi5WXlJGalp2nmrGakaydjpqPko6VkJCWl46RoJGJlZujrJSWj5ScnpSgnpuYoKGVmp6np6SipLCypsHHw7CwurbFxMK+zafHw8fDvNXRzcTKiHRzYlxaYFtNSkJMQEVHP0E/Qjs6ND5BPD01PTY+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGZGYGlnWl1bk4yMiHuHi4aDjHWGkIqBb358gn9xfoF6lXqRlJSYkJOVp7TGyb/CzMHDuce8uq+rubuXsra6ssCupcCkq6+7vKqtq6KinaeqrrSwqpufqpuhm5WfsLSni6K6ubXBu6upnLKlpKiUhY2pw8SkgouPh4iEhpWUjXqDjJGOkaGMjJSRj4mXn5eTmZWXpqCunYyqnI6Wj5KRlZWOkJWRj6GUhpefoLKelJqUoKGZpJ+aoJyglJiepqSmp6SvraXAxMOuqLe1ycO+ts6yxL7EvLPRysjCtXR5bVxYXGpTTUhETEtLSkFBPUNEPDVBRDs6Mz04QjMzMjI2M0EwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmZaTWVcZlRjapmNl4qMiJKQhol5hpSQgXKAfI1/eIeCgpB5jaGWqJqamLq+yMjKwdLJysLMvcGzrLu+p7q/vbzEt6zBqayyu72qsKmjpaOsrbOttrWgn6+epaKYo7S8qZuovMGjtravq5KvrKusl4aZqaalkYKMk6WViYF1ipJ5hY2RkJ6fk4+Ui5CNlKOZl5yVlKOeqZ+RpZqMj4+QlZaIfY+VkpKjm5Wgopy1ppCel6Wko6WenqaYnpWXm6WjqaiisqyovMDEr6Wzt8zAua7Es7u+wriswsPCwJhteWFYV1xbS0tNSkZERElCQkFDSzo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Nl46ekomKf4mfk4R3hX+Vf3+QiIqQf5Whmq6mo5jCvcjDx8XTzc7Ny7vCt6+6vbS8yrzDwbW2vK2zv7m8rq+ooKintq2tqbG3mp6toqehnau3t6mlr77Dsb25s6eqtLOtrpaWpKunoJGOkrHFp5WOfJGVfYeRmY+qmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi42Qj56IWpCXl5KWpZllmKOesqWWopasraunm5+ml5iWmZWhpKmmn7arqbq8xLWltLbLwbiptqyyuriuqLi6vbiDbG5aV1RVTkZKU05LP0JIRURIR0c5NUZNOz43PkFKLjMyMDI1QjU1UFZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhXOz1AQkZCcUZpSVJlYkxGpZSclqGXqZaNkIOHppOIgYeCnISDlZCQlI6aop+vvq6hxr3FxMbGzs7O0sq+u7axuru8vs62xL23ubeysrWzuLOsppyrq7iqqKevsJejrqSnpKS0wLCqrLO+wrnAubOnuLS4sq6VpKyurqSLk5WhjXTBmn2WmYSOlpqLsZWamZWSk5mZpqOVn5uWmqicnKGgmouNkJadYEqWnJqVmqWWVJawn6+cn6WUr6+sppqhppSTmZmOnaCnopm0qaqzvLy7q7Cyx8C4paurrbGxo6GysrSkcW5mXFpOUEtEUFBQUTtHSklHSEJDPjlLVT9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pWDs6QkNAPVFFV1JzYldGSKqXmaCiqK+ZkZeHi6eWjoiShZ+HhJ2Xjp6gmqOktci0qca6w8PHysjIzM3Gvrqyrrm4wMHNtsi6wbm2urGvrrK0p6ObqrO0qqimrayZpK6lpKisur+oq7a2vsG/vriyssOxub2so660rLiliJuXppt2vqCEmJyOk5mai66XoZybl5Wbn6GpnqigmZqpmaKnnpiQjZGdg252kqKalZ2inpCtsqOrlaiqmKuupaSfpamTkpmciJWcop6Xsaapq7q2vrOyrb25tqCjp6ilp5ycrKmpjGNlYV9SS01HSE5JVUw9TUROSktCQ0Q8UVU9QUFCRE8xOD03Nz9CNzVVWE4/SE5RWVNQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlJgTVVIf2VeSEWrlJyhn7uvmZSejJOqm5GSk4mrjYeinoykrZSjo7bGvbTBusLCx8jFwc3Iwb25sq+5tMDCyrXGscG8tbqrqK2ssKOimaq0uqappquqnaivp6Oqqr28p6y8s7e9xry3tbjAsL3As6i0tqu+pY+il5Gin7yfiZmgmZaenY+3n6mcpaObnKGaqKWzoZudpZyoqp6ZlY+Um4uXiYylopSdop6gtK+lpZOwq5mrrJ6epKOpkZWVoIOQnp+clqmkoqG0tbu1rai1srOenKKlmpeVmaqhnndhXWBdSklGSE1RSU1FRkdCUkxJQUVHQFZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpnXEZDQ5xwYkdFp5ekn5/DrJuXpJeZqZyWm5qPqpaWp6aVra2Zoau2xMK7vrfBwsDHw73Nx7u9ubKvuLO/w8i1v6+8trq3pqOqrK2goJqqqsSipairpp6rr6yiqai+uKatvbC3tse2tbm4v7C+wba0srSvvaOWo5aTm5Sun5ChoqWjo5+QvaWpnamsnZ2hm6afvaKZo56iqauhnZaNlZ6TnoePhI2TnqSgnbWsppyVsqeZsKefmqqeoI2ZlZ+EjqGam5OlpJqYrLG2sqqlqq2snJigoJKOkJapn5RoY1piXU5JSEtPTEhFRElBPVBJQTxHSUhbUk9LPUhPVTRCRjk+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZWNXTaKao5yexayhn6ydnK6fkqOelqWgp6mrl7awoqqytcTCvb+2wMK7yMK9ysi2uLW0sLO0t8HGtr6wuLS5tZ+mrKqrnZ2epaPBpaCpraCkqa2voqanvbWlsby3trXDsrO3ur6xw8C3t62ztLWinKSVkZOgraCYoZ2oqauimsOtqZ6srZubnpmmoL2hnaSYq6uspqGZjZqfkp6Jjld/lp6loaC4qqeTmLajn7OhoJuvl56OmZSdgo+fl5aOoqSVkKWusqupoqKmpZWVnJiLj5GTpJ+JYmVbZGBMSUpLT0ZFQUZLPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhjXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3NIRTY9dWVcS06en6GZnsOnpaKzoJyyp5OrpKCkn62prJ27sKistbHHw8HCs8LEvcbDvMTKvK+xtq2wta+/xbW5sbC6tayaqLCpqZqdpaGnwq2brLCcqqKusKmkp723pra6vK62w62zs8K/scazurartLWtqaGllZWUo6uhnp+aqKuwrq+7sqagqamZmZiToqS4oKGkkq6vrKWnn5KhnpWej5CNlJ2aop+ntKanjZi0nKOvmp6brpGelJeUmoCSoZaPjp+hk4umrLClp6KcoZ6SkpqThYuSjZyegGJmW2hmSklMSlNCQ0BJRzs7Rz85OU5NVV5SU0o+T15dPUhQQkxMSTlOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tVXmZyQDg8SJZ3ZUE0n6Sfm6DDqKSqsqGjtamVsqunoqSyrK6pu7KssLW0xr/ExLXAxL3Iw7bAyMK1q7WosLiswMS0t66strmlmauxq6qYn6aXrbu1m6iwm62frrSxp6q6sqe5s7eyuMCqt7LCvLPFp76urbe0qaeroZaWkaWkoqKXmKSuuK2xtbagn6ikmZWVk6Sgt6KkpZausrKmqqahnpuampaYqJ6emKGer7Kipo2XrpmlrJeZnqWRm46TmJqFlp+UjJCcnpSLqamqoqegmZ6WjI6ZkIKGlomUn3lkaV1rak1QTk5UPUNBTkM6OklANzdRT11eUlZRQVdgXEJKU0hWS0g6VWVdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUpwaVZDV0aMeWZDO6SknaGmv6aor6+gqbWqnbmvq6OqtLexsLm3r7a4uMW9w8e9vMPBxsC5wcbBuqq2pK27rcHDuLiqrbK7opWtsK2ylqWnkKq5qqCnsJ2qoLC0sqqptrWsu6yysrm3rLmwwrq9vqbCqrC3r6mqq6admJiqoaGgkZigsK+zq7C5mpupoJmWkpemobeppaKir7G0q7Koq5+boKCbnqWboZedo7Owmp+Qk6WaoamalaKflpiJlJiTlpedk4iQm5mUj6mop5+jm5ebk4eOmYt+jZaFj5traW1hbG5XUFJaVEFDRVRAOztJQTc6WFBkXlBWV0RZXl1NTFJOXktKPlpkXk5IUE5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE2NDdnWWBGKD84bH1oW1Y7iXtjQz2nn5yiqb2hqrCqo7G4qaW0s6uhrbW9r7O4vLq9trbAwr/JxLjEwr/AuMS+wbevtairt7K8v7+1qa6xt5+Xq62orZanqI6nu5+lrbOeq6KxsLOsqbaztb2tr7G1rLC1scC6xLarvK+xuKusqaKxpZ6kqZ+jl5CZn7Kqs6mqs5mdp5ualY2gpqS0rqehrKytsaezrbKpo5yfqKOdk6CYm6i1qZeZkpKfmZ+hnpCsn5iYhpWYi52anZOKjZaXmpempaOgnZaVl5SBj5SFe4+Sg4yWZmxyZ3ByX0dZZlZEQ01YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYmBQS01OWFdYUEpWVldNPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVUxNTA9YFZeOClDM1lVXGdLNYx6ZkxApJmgpKy3pKyppa6utqmvs7mmprC3xbext77BwrW0usW+zMW4wr+6v7rEuMG5srWsqrq3urq+tKqusLWYmKerqqubrKuPq7ydrK6xo6qfsK2zrq62sbm3qa2usae1r7O7vMmyqrW0sbSvrqags5+aqK2gpZWVmpmxo62fpa+WoaSZmZKNoqWnsqmhprGrqbWlr7G1r6OZna2nmpeemZmsuKOXk5CPmJyhmJeUrJ+dlIGTmY2dnZqWkIqTkp6apaGhoJmWkpOWe4uQhnuMioOLkmtueG52fGFGYWpZSUhZWz17SkdFNkFiVGlaTVxhSltdWlJSUmJgTEtFX2FgUExJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ15RXC4qQi9KR1BbSDNjWVVLRJmWoLCosamspaOurrWpt7S4o6u0t8m7tLu7v760tLfDwc3Hu8O8tr6/wLi/vLG9rqe6ube3wbarrbG4lJemrquno7KplK+7pK2ysaenorKzsLKwtLG4s6muq7KnuK+1s8PFtqi0tauwramnorafnqaxoKSUm5mUsZ6nm5+pjaminZuVl6WlpbenorGzq6exqK6wtaykmaCsqJubnJuUqbiclI6Oi5mcopiQl6ahn5aEkpaQnZyYlpaIlo+Xm6eco6CSlpGRl3aEkId7hYGEjYxucXd2fH9dTGVsXEtOY1w/YntHSThHZ1dlW0xeYk1YWVdUWFRpXU9PSGFeX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0ZhTFYlLUIuPUVNUTwzcmtKREOQmaWupK2tq6eksLKzqrewtp+rtbnJua7BvMK3s7K1wsPPxL/BvbS9wL+6v7yzxKipubC2tr+8r6yzspygp7CtpaawpZ6yta2rsrCsqai0uay0srWttKypq6isqbmtsbDHvrekua+pra2lqK2wpaOjrqOpnJ2cmq+ZoqOio5CsnqOfn6Gqpaa5pau0tKSpq6msr7auop2jqKqbn5makqS0mo+JjYeRoqCWjZSeoJSThY6Ukp2bmJaVh5eSlZmmm5+fjZKRjpF3fo6FfHx9h4qKcnRyfn1+XFNkb15OWmZdRkSWW0g7Tm1YYVtNYGFOVldWV1RZZ15RUkxjWltUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZEhKKzpJPzNCSVMsPo9rPUhIj5uqqqKpr6Soo7K0sbS1sbGhq628y7quwLvHsbSttMLD0cXFvsCyvsHCvL+3vMSnrbess7i8wLCrsq2gpKetqaiksKOqsaqvrLCur62rs7qmtrCyqbKpq6alo626rKqxwrm0q7moqKitqaixpamkoq6qqKKem6KslaSdl56Yq52hp6mhrKWjray3sbGgqKKgq66wrJ2fp6ipmaSYmY+gp5iGg46Ji5+hj4uMlpyPj4aHkJWgnZaYlYeWk5OXpJydnIuRj46Kf3+Ihnx3f4eFh3Rzcol2bF9ZYG5jUXNxXEs7hHxGPld1WGBZTmNcTVVWVVdQXGJeU09OZ1hXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSWdERjg8QjA1RUtYMUCUWz9NRpWYraeiqrKcqaivtqy4ta6qpauqvcm7sL64w6+xrbPEw87Ow76/tMDDxLrAtMnErK+3rrK5wL+0rq6rpaeqsKmnqLGltK2rsK6tsa+zrLO6pLizrKyup6ugop6wt6uqrbq2pLW1pKmnrKyqraGopqaxsqSmpaGhq5apoJOaoKaepKKqpKyin6ext6ysoqSim6mqramcoqWkpJigmZaPmJ2TgYKPiIWcoIyKjoyZj5CLhI2YpJuSkZuMk5KRlKKZm5mKjouLfIaBgoN6dICEgn50d4ykh3lrXmBuZ1dlh2ROQGeSTERieVdiWFJlVU1WVVVUT1xdYVVLTmlXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEMrOkpPXjREhkBISESXkq+ko6qwl6qorLWrtrGrpKuqqbzAwLi5s7y1prOvxMnL0b/Bu7nAv8O5wbrBxK6xtbKzu8G+s7GurKurqLaqpa2vq7mvqLGxrrGrtaq2tae0tquspKmqnaOds7OoqKS0tKC1raGpqKuprKegq6youbapqqmpoamfrZuRqKGdoKSipqKpnZymtK6npamio5ikpqapnKKko5+ZmJ+Rjo+Zjn6Hi4aEnp6IhYuLjo6QjYSGlaOajo2bkZKRj5Kfl5iWjIqDf3SGgX9/eHWDf3t4f4GInY9vcWdncXhcYHOIak9dmFZIbXhVZFZRYk9MVVRVUE9YW2JVSFBqVFZUR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlFjMDI/Zj1OWD9DLD5MVF8vSms2UEU7lY6woKWqrZmrpKyus7SuqqWvqam6vrvAsa+4rqK2sMnHyNDAvr27vMK9usPBwL+usrKytb28wrKys6qzqKS1qKSss7O5r6OutrGvsbmquK6qrrasq56qrJ+joLatqKGer7OhtKqeqKeqpKqhoaytqL2vrK6soaenn6uYj6+imKKgqKeep5uZqrCpo5+soqGToqKjppiZqaWXl5idj4qHlYh9jYaEhKSWhYKCi4aOjpGEhZSgl4iRnZCTkI2RnJSWj4qFhXh0gX99dXh5gHt0c3ppgoejdWleZWyCdWeIjH1SWHBeSnhzU2RTUV5NTVJZZk5MVlllWUZTaVJSP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBMaDo0OF89YWQ/RjFDUFtbK0hPOlZCNJCPsaCkpqujpqSsprSzsKmjsKequL7AvLCouaqnrrDJxsjRwr2/vrm+v7zJvMK5sLC0sbq7ucGztLusuKyjtaamq7G2ubKnp7q1rbW8r7ylra21q62cqa+jn6WsqqecnqqzpLOomqqnqaSpnaOpqKm9rLSvrp2po6Cum5qyo5Wkm6Sln6SamqirpZ6bqqGbkpugpJ2YlqmpkZiZk5CKgo+FfY+CgIiej4Z/fYuGkI+QhICTm5SFk6KMlJKLkZqRlIeJfn9xenl+fGl3fHp1cXF9aIZ4hIdkYGhjcoV6bWd5XV5WQld6bVRhUFJZS0tOcXRdSFpbZ1lFVWZQRD5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktIMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9O0VaPyqPk7GZn5+opaShq6S3srKkqLCnrLjBvbWwo7msqKiww8nJzMG2vb+1t7+6yLbDtbSztbG9uLq+t625tb+tobOmqaqvtbi0qp67u6iyv7K6oK+0tqmsn66wopylqKminpyksaavoJ+qqaiiqpujqKCtvKiusK6hq6Kjrp6erKaXnpqho5yfm5qjqqKamqSklZaUn6GWm5amrIuekZCRjIKLgH+OgXualI2JfH6LhY6PjImFkpiRh5SjiZKSh5CZj5OBiHx5a312eXhie3pxcHFzeGmBc2qDZ2RoYW9zjm1ianBgcEFceGtWXk5QUUpKTVNZVk1dXm1XRFhgT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MEJoWTEzUz1lX0RMNktXZU8pPDNQWz0jkpismZ+Xp6Sin6ikuK+uoq+vqau4wrqyrZ+4r6uotLrHy8e/t8G+r7S+t8S2w7GuubKywLW7vripube9q6S1p6epsK25sKmaurykrr+0tKGut7Wnp6ews6CfpKanoKWZnq2nqJ6gqa6noKaXo6mfsLifpLGvoauhrKSbpqapmpqbnqOVnJyanammlpufqJKYk5idk5mVoaqQmomNkId9h36CjXx8oYyMiHmDjISJjI2Eh5OajomVn4mRlYKLloyQfYR7c299cXN0YHl4aW9wcW9qf3JkemxpZmRhZoaAYFtzanJNTX9pWFpNUExKSFBSUElOXF9vVERYWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmhIKj8wWlk1KJadpZiclq2gn6GkobersKO0tKmoucW2sq6gt6ytrLC1xsjAt7/BubC0vbe/u7+vq72wtL+xvcO6qbu6t6eotqimqrCss7Cmmry3pKu7ta6fsLivqaanr7GboaSgo6OhlpyvpqGfoqevoqCik6Olorewoaaxq5+soq6YnKqkqJ6Xmp2kk5qcmp2mqpmcnKSVlZeVnI6Tl6KpoZCJio+FeoR9hIp5jpeKjYZ5goeEiIyOhIyTmYyOlpmKj5Z+hpeLj3qAenByd29vdF94d2RsbGxqaYRuZnNpa2ZpXWRzgWBba3VpWkl9XltYT09LSEdSVUYyOV5ebVBEWFZZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mio7KzEzOWNsODRHQWZbSFREVV1oRS48MmJVLDKWo6GXlJuqnaShoqC3qq6gurimrL3Fs7Cvo7Wwra2vtcTEvLO/urews7m4uri6rq2/s7S4r7/BuKy9urWmorOqpqiyq62xoZvAtaSntbWonrK8qqimqa+smaOnnKOmlJiisqSZn6SoqZyioJOkoKS4qKSnrqaepaCokp+ooqGgmJudoJKam5agoaqbm5mhlJGUlpmNlJKjqKSQiYqOhXmEe4SGfZ2NioqGeYCEiIiIkYSUk5OMkJWUjY6Ue4OXjot3fntsdHJsbHNheHRoaGpnZm+FZ2hpY2ZpamBpYmpnW2V7Y2BTc1RbW1NLSkdJT1NAISppXmpMQ1ZVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEIzQ0RnW0tXR1VgaEIzNzllTycynqOjkY6jp5udnp2jta2mqrm3p6zDwbawrKO1rqeur7fAwLyywbaxrrK2tri3tqypvbOvsrG9v7iuu7yxpZ+2q6WktKmrrp+ewquopbCyqay0u56pqquxpZieqp2mpJGZpq2imJ6kqaGcop2XoJ2ntqavqq+hoJ2doZSgpZ+hoJmbmZySmZ2UpZ2sopiWnZSTjZWXi4+YmqigkYiJi4h5hXeCgoGciIuCiXx/hIiGhZGDlZWPjpCRkZGNknuDlY2Fc319Znhva2psZ3Vza2NnZGR1gGJlZmZlampka3FaXlldbWRhTmhXWmBWSkdJS01SWD45X2xpSEJUU1xbSUhGRUEuPD85QTg5UkdANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWUpWYmZBOjNBZ0glNZqjnpCLrKGYmKCWpbOxorG9t6Gxxru5sbGktqurrqm5vbu7rsCyr66ttq+zuLOoq7mxr620trq2sLm+raaetaugoLClq66epMKgsqOusK63rbWera+sraKZnKeppJ6Vm6iln5mlo6idmqCblJydrbCmuaiuoqCamp6ZnqOapJ2XnpiblJqgkqiWqqeak5qakYuVmY2UlJmpp46NiomPfIJ0goGKmIWHfImJhISKjIiShJOckpKPkJGWjpB/gIyNgnCAf2Z5bmhramdxcmtcaGNjc4FhZmhqbmxna2pnbVxsbHVxYVRiaGRlWklGTE1PWFFRVmFlgVRAVlNZVEZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmVDJzSSoJqOjrCdmpOhmamysJ+4wLagtMK7vbmxprawqK6kt7i3t627r62qq7eqtLmupbO1sa6psbe2sbO1uqepn7apnZ6po6qtnKnAma2jrq+1ta2tn7Gtr6mim5yjq6iblZyno52aqaKklpqgnJCbo6uqqbufqKSfl5qZnqGPa6KWmJxxgpabpIB1kqmnnpSUnpCIl5mAloqhkHiGlIyDbmp+d4NxbIaLhn2Ei4ZvXmNgZ4SXhmuLkJSTdXeLhH6Dj39nhoBodWlmV1xoc25OUGpjZ3KEZ19kZm5sal5gYIqQhIZnT0tEOEZUZ15KR1FQVVVLSFNhb3RlRltRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNTY4LCMxJzIxNDoxNzZYgWwxNk9rW05cS1tmYj5HMVFkPSsvjKOZh5Swm5yToZuqraujvcWvqbfCuL29rae2sKWrpLizsrOxua2qp6y0prC1o6i4trWop6y3s660rbOjqp+0q56hpJynp5msu5Wmpa+yt62upaiuq6yloZ+coKemm5ehpaWbm6ennZOen5iQnqiqo7Wvo6Ojm5aXmJejiKGOkpqHoYeUnaF/pX+mqp6SkZqRiINyeI2OhYihdomNaZeIZn1zeKFviIeEfo18f6Ggn5mAe4eedIiOdpuKbIeBg2xoZWN6bHFiVIZtY2xpmHFYanBvh1heaVtra1uIcW56coZoh4RaXkZNP0dfTUZSVlZRUVJXVGdeTVhKUlJPRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcvKIyml4Ocq52ZmZ2fqqqnqb/DrrG6vLfAv6qlt7CprKayta6vs7arqaWxraW1s5yttba0pqeps7Gtsqivn6uhsqmgo6OaoqOcrrWVpKSltrymrKeqqqyopaGgmKCmo5mZpqOkmJykqZaUopyUk6SlpqC2o6Ogo5iUkpeTm4iuj5iUiamLl6KbhbGAo6ydk5mdlHmC1Kh/h5XBm8d5eLGlt5dkgMCcv3mEhHmQhHyQkJHKcZa8nMV7cranupB6gWyWsauweWhrWLGubmVpvJK8bmh6bnKP2H5TamK2sn+BcpR1mqGqkFdPV2FPVk5GVFtYUVBSjFxXXFBAXERRTkVHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGNppOBpqmfl5yepa2yqLDCvbK1wLW3v8KrprOsrKmnr7Oqr7azqKimtaanuK+ds7K2qqWkp7GurrGmqp6npLGkoaCel5ygnq+tlZ6hn7S6oqqooa2upaKdmpmhp5+Xm6egn5iep6eRnKeblJ2hpqKgr6Kfn6OWlpKXkZiFr2pqio2qfmeElYetZHCdnJOZpZRxrqGkfni7fWuhj3axX2q0W6WAZpyRYGaCemZ/anhqqWW+cmemjHayanyxeHSSk2NtbadtW4SgRWhnh5ZFdZxgfWh8pKeCWV+Lq2mAlXh6aqc3Sq9bV1NtY1tLT1hfXFdWO06IT1dXL0lUU0lERUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzEbkaKVgqynpZ6jpaqyt6y0vb6wtsSyuLvCp6mwq66pqbCupLC6r6SlrrOjqbmpnrOysKOloKqtr6ywpqefo6Kwm6Kbl5WXmpytppeboZ60s6Grm6KtraCempagoaicmJ6koJyZoaekkJ2jmpegn6ufpqafmp+hlpWQlpCZhbWbtXiFqZm1mXeHs5u3fpOVlqiUfmuBpnqChoiSlJJ3q2drsVuse4+HlHSIcY+GgICIkJd4g4KLl4yDoI+EsHZ3n3Fra2x8i06kWEhjY5l+Y2imYHlydVOSh15QqW1jcX6HgGKdLlGibltTa2hgTEtcZFhcWkI+sHhXWEEjTWhFQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1c3SjlhVTUwG5WflIizpqahrqmns6ypu7bCsLvCrbi3waqsra6upq6yqaGvvKqhp7StpKu1paays6ejop6oqrKosKilnp+fr5afmZWVlpieraKamqOotK6hqY+pqKqbnpWXoKSnmp6do5+boKOlo5Wbn5ianaKqm6aZm5uioJaSkZOTnIPVk5m5cLDCfsaGfNaUm7t8mZWkj42cjaR7joekgqWCeqx5j51Wr3uJfp9quVq5d4aDfKaCk3yYeqp5jZyQe7FtjoR0kLyFb5RQr6fFilGgemNgqmJzcohtl4hgU7W0yIaAiXxjpDNCnXZdUWpoZFBAWGdaZGFKSE1sS1tTT1lmWkNEP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS11PX2ZUN0c6YVE3MiWbopOYsaiopbSqpbSopLy3wbC5wLG2tbyztaexsKOwsqafrraom6i5rqOvsaCztLCgpJ6fqKqxqbSppJydnqqXmJeWl5WWoaudm5anrbCoo56PrKKolp6Xm6GloZihoaKhmqKip5ueoZ6VmZumoJynlJuan6GYj5KVkZ2Ism5otXGrh2+OpnK0c3K2e5mXo4uOnI2ifpGhpX6wdoOR0tF2XK58hn+kb5uqpmuGhHytfZeZj3uxc5Odj3mzZZZ0hJ5vnmaUUsiLWsJcn3liX61gdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9rX2xoT1VHSTk9V1JbV1hIQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJPVF9lUDVHPWFNNjIwoZyRpbCtpKq7raa0pae2u7yyur+3trW6urOltLShsbGin6ywpJimuq6ksbGdtLiqn6adoqqlsqitqqSanJqonpWUmJiSkqOooJeSpauvpqKWk62fpZKUoZukpp+UmqamoZqjn62aoJ6dkJaboZ2cpZSclZmin5WZlpKbhax7d6h2o46Jh6lvrYqCp4OYmKGJkpqKon+TmYmuhX+Cs1xys1KufYOCpH9x1313hH2OnYeZmXevhoqRnIh4s2GaZZqBgpRsklqwWEuadZh5ZmCtXnd3h2iYiGter3eVno94bDV5yK6yX0FUb15nYEVQbF9wbVZVTS5lY2lTWVE6QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPlZfY042R0NgSTk4OJ+dlKC4sJe0wa2osqiqsrq4tLi/ubeytry1pLezn7Ssn5+oq5+Vp7arqLGxq660pJupoKCoobanpqqjmZ6VpaGUk5uZkpSipZqTkKasrqaglZmpn6KPkaKZqKWglZmlqJ2cpJ6tnaGdoI2UnpudoJiZnJWXoqCTmJGmnYapfX2leKGPjoOqcK2LgaeGlZ+hiJeXiKOCkYiUqnyAi515b7FaqIKCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfoOVbJJcq1tak3+Rf2hnqmRye4FrmIdzXaxaiaCOa25lT0pDoVxaTHReYmZNWmFfcnRfSlY2SpqTWUhFPUhGQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjAwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzJVX2JMN0ZJX0MxPzihnZmZv6uXtMKuq62ppbSwuLG1v7m6s7G3vKm6tJ+wpJ6lp6eelKqxqbCptayrr6GYoaCmpKS6oqOroJebkaKglZSempSYnqCPjYyor6+mnZabqKafjJKkl6eqp5SXqaeen6CjraShnqGNlaGZn6CSnZeclZ6hlZaPq5uPrm1ytHKpjHaKpnO0eHOzgJGkopGcjYmkh5B3uG+Me4uia2u2WqCFZZeXaaGip22TcrR0k5h/smqFk4ita3WzYZ1mom+HkmqXXK1gTaF8h5FSc6Nten9+b5iHcVyvVjycd2ZUb24uXKdPYlJrZWFtWWJcYXB7Y1RaUT4+bXAzQkJAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzwwMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUM4pZqbnbqhnLLArq2rq6e3qbivtcC1vLGvubiqwLWpqqCbpqOhnZKqqqi2o7Korqqgl5ynoKWruJ2jrZuWmY+lo5WNnaCbmJyfkJOUq7Wvp5mUnKyql4yTpZmkrKKRl6qypKCep6uwmKGjkJmil6CblpuXoZOcqpyUkauZh9SSmrtzsMOAw4Z+1ZabuHiHkJeMmIqMp4h6o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiBim6aiHFujaR0vV13fVthebxrWlZbanpeamBkZmJtd29ZW1lDQUByP0NHKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaeanqG8opexw7Ctqqqssae5r7bEsbqyrruwrsCxrKSinqOhnJuRqaSqsqS1pq2kn5aaqpmmrLicoq6YlaGQpaCSjZyjnpidm5CVkq+5sayVl6Onp5SRlqSco6yekaCoq5+bn6iis56ipY6nopShmpyXlqSYj7CgkpSqnoWQmbWAkJGMt5V4gpOatXdta25zbnmPhI6JdJ7Bu72ae4GyqHCAdJG4g3yGhouHjXuKho2XfKS7ub2cdXq0o3R2l3V0sHWZnmaGaY21dHJwd7aMXn96fYlog3lteWKLrHB1hX9ZW6dqRGRZU2ZgY11jUGdmcW11Qk5QTEQ7Wkw+SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JWOCpPXV09KzpWVic9OzynnqCgv6WWs8O0rKunrKupu66wxq+1s663p7S4ramioaWeoJ2ZlKukraqmtainn5uWoKOerKS+pqGrl5SdkKKbko+iqKKTnZeTl5SytbatmJ2jpKKLkpGmm6Wqm5aopKWcmqGopaajqaGSrZ+Xo56Xlpedno+wqZSbp6GOan5pnKZ4h3N+mo90emWHer2+wLpvkoJxlYdfcmpaXpqJYWOIjpVrYH+VY22cdmKUa3+alZRlXmBjcZuKaXKMfYaVZ2p+cnR4fX1iW3d0gWhQXG6DfHuLa1hseoJySUpvhXBNdE1FV11mYExbWGdjXk9bbXVpcVFPREVNO0hJPEw/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF5MKDM9W08nPzI+qJ+oocGjm7S6tqOtpa6nqLWxrMissLOrtaO+sbKnoKKpnaKbmpmspq6kpbWppZuYlaGbp62ovqepppWUnJWgmpOYpamnkZ2Rj5ecsLK/rJunnaeiiZORqZqopJubq6CjmZujpqyin6qimrCblaaglpWdn52XsaWYoaeYnJGdnKOjmaaimpyampmPloFnbX1xd5KXlJGFirWqjYaYlY+KjJiXh5SVioSSk5GJjZGTmJSYl5qgopqclKGdjoJ6pYVsanyQfIB0iYqBcYJ4eXZ2ioB7iWpzgXSDdWN3fXZrcHttYGNdcGdNWVllal9XWnB6bm1mU09GUzlPWk5STygrOkpCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLOgs6K/oqSxsregqqWyp6WwtarJq62xpbWmwKe0oZ2kpZyjlZagqqaso6O3q5+Zlpafl62ppcCeq6SVkpyXnpiTlKKfnaKnk5GZqKeyw6+aq5yqn4+WlqmdqpuboK2YoZucoqSvpqGkqJ6tmJemnZmaoZ6enbCgnKKmlZiSmJOgoZWjnpegjpaTioqNjpatj3yVm4KSgouqqIaBmJaKhI+fiHuEkIeFmZCHhomVjpuXjZCYnqSWmpORnY1/jWahs6+FiYR2eo+KfHZ5em9neZCBgIlrdYF5iHJoc396doOIgmt0ZHlmYGlkYmRmallre3BpalxTTFBEX1VGQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvvqyrrrKyoKqmsa2irLOwxbCqrKOzrryktJyfpaKhnZmXqKWppqSls7WelZSdmZmwpq6+oKujkJGempmUkZWhnJaonISeqauis8izn6qjqpeWl5qnnaianaOrk56fnaCqrqmlo6uhrZufoKGZpZ6cnp2wpJifqJOYl5yRpJmYqJ2al2aDknxlfo2Zj2N5jWxoa3qRpKtrZZqYfmeFimVlaWh7jqGOa2iMl5Gid2tqi5ijn5lzbG56hIyHelhlXoWBXmyKiYB2XGhzd3eRgIeCbniCeIBzbXmDdHeIiI6De2qGWV5rdGRdc4lpanxxbGNdUU1XSmRYQEo0PUY3P0ZENzE8PT9BRDw8REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvrLOxqqWora6wpq6tsL2xqaekra+wn62Xn6OdoZqZp6ucraOlqKmyrp6Vo5Cir6a2uaWuo4+OmqGZk5KboJmYpJV7payiqLPDt6Shp66fnpWeo56jm6KpqZKeoZ6gqq+qq6Oqn6ibpp+ooayWoZulsKSXnKqVoZ6bkqWXnqqYnn6+g4dytHKEnYataHi5xLhxk6Kje6aYmXOqgnzLwMC7cYuih4KffJWYiZ7AvYKWnZ6NncLBe4F7ko2aw8B9a6Wxb4yAb8p6f5t3kYOOgXZ6gX95cXp/h3F4hYyTeW13k2JmX3hkX2WCY150aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAvI0ZbM1BZL1VBQjsvOJajuMO1sK/AqaiUo6+psK6tprK1r6qlpqawq5+rmJqin5ybqqeinKyjpailpLSknaKTpq2st7Onr6KSkZqdpZKRoKGXm5+ch6arpKutv8CxoKmvqZeSn52imaGiqaOToKGdnq2uqKymo6KnoKWlnq2pkaSbqa2qnJ2qnKyhlpellaGjl5x/zpR4eqSBeZWWm1+uj16Op4GioHynlZt0q4OAr15jjap6p4eFoHSXkoizY4KrhqGOjbNqhK50fZaHuGGCrVmjzW6PdXvae3+ZcH6Ik3Z+ZXuIdnZrfYhufoWRkn5tgY9gcWtwZ2BfeWRccWhqZGZgUlRSV15LT0M1QUhFRDg+NjtAP0E7PTdAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDtMLSFQQEY0LjGtwsC/tbSwt5eekaSqqK2zq6ayrK2spKunsKqgp5uZpZecoq+foJ6op6OmoZ6wrJuelaeurbGqqKyglJKbn6WTj5+ll56oo56tpKqwqMDGs6ipsa6Wkp2copeeqKqflaCfnJ2ur6eqqZunp6Shq5KstJamoqqpnaOnpaGwoZOap5qgmpSUkZegcYWMl3SEqIdxsXydcax+oZ6BpY+ed6uCfa1/nHKtfquHhp92mJJ6fJd+qoiijJGLnX6re4mTj5+Ae61WnMR6j2+SwX2BlW11cIxtZXZlhm9hd25yb4qLkpCDbZGQZG90dXBgZ21lX29paW5mY1dTXWFZUlNDOUlJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNTGxrK0n52jjqOjoayvtq6osKepqqiuq6unoqSdmaKVn6arn6GloKioop+dsKyXmpaop6+sqKepnpeUmqOikpShrZudpqOvrKOrtKq6zbGtpq6rlpScnaKZnqysnZagmZ2eqbGpqambq6mjoqybr7GiqKyupZimqqmpsaKSl6OlmpSShKRqpHWJeql0erJwgqWJmYxxiKCah6RgYFKshH+ug5t2roGmhoafepmWhntmgKOJpJmGgaN9qX6BlIeuXnypVZ2ikoF6op+Ae8OvxYxzr7OzuXFiqa/CdGiNjZiPgW2ak29teXh3b2xmZWVxcGZ8aWJdV2BpWFhVTU1RTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY3NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8PJ1tXAoZmrqKGvop6wtLCvqayjqKaqqquppKagm6SenaWnpqOcrJqirKGkn6+inZqSqqS1sK6gqZudlpSno5CaoqifoKacsaajp7GstsiytaqsqZWRnZyimZ+ks52aoJScn6erq6OumqypoqGqo7OtoqqzsaGaqqiur7ajk5ajp5ibkXyqbJ6Eh3WreXywb4Kki4mflpWflIHSuLS4yYCBsl9flKmDpIiHoHmYlZp4qsl0maOVp6mQkpuMf5uJmsbGeGWhgqVzgZ+Ogn2vXnC1Y7F1S6OGbadHgpNkj5Ceknxwl5N/cHt1fXtuW2VqcnFmgWpfYVlkbVxeWUlNTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPi01T1RRHRw7PEYyLCSnpMHGua2psq2spaKcsrmsqqGmm6imqqyppqCmpZiro5+uq52moKyanqmlnae2n6KXk6iqtrKsm6acoJWQpa2RmZymoqCqpq6ho6epsLTCsbOqraiTiZecpJqgoq6mmKGVmJylpquar52tqKaerKO3rKGyua+dm6+ns7OzpZSYp6OZn46CnU54moF/n3qDo32DpISHp5+cnpOEuHt8ebmCfszGwrZ4m6GRi599mpaWinaemIqkmKOofrCFnIWehKx9mZRhpWyjcI+FkIF9l4NyrGCkc3GAmmC8fVJVdY6SpJd7fZOSi3V6c4V/cVxtbndyaoFvWmRfaG5jZF1LTVFUQklIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaukq7irr6Ccoayzs6afoJWlrq2uqqedpqaao6ehsq6iqaayoJmppJSjtqKilZeiqbS4pJyinaOTkKGxmZ6cpqShoq+unaSoobayw7Guqa2pkYeQnKecoqKcpZeemJmZpaSomq6hrqWml7ClvK2ht7etnZ21sriws6eYnq+ho56Fj9G1w7d5h46FkZOQgaZ4lKJ3jKCShKWBinGqhoS0bnJqmaOblYqffJiZhoePc6+CpZuijaaLk52JlJCbbXCyXKVzk3qcbJl/e5l9bqlhonFxf59ic7K4aHiPlKaYfoyNk4t4fXmOgm1peGl4c25/dF1kZG5tZmdgSltYWDxIR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVlZUUU9RW1UlITJBSCQpJZNzjYqtv7+7urWel6ikrbWho5mVo6mnrqqrmaWin6WgoLWmoqmnsKOUrKOPpa2jnZCamqq0tKSdpJ2pkpSXrqCgnaajnKectJqhqqO2q8OvqaupoYyEjpyhoKWhlZqanJiamaakppirp62ipJutp76slb2wrJ+isLO5q7Snm6mxpKeYeqiQfXywd4qBpKWInG2yb6GHrXyhj4OolZiArIiFroWflKmgoZaGn4CZlYB7kn6rgJ2aloqqeJ2gj4mTkoB5r12jgXymp2SdgHyXdGuuXaVrcYWZXWBbjKBtlZKnmYKUjZeMe3uDl39rbH9ifXRtgHpgZ2VxbmhnaENaYVs9S1QyVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pYU1BPTkk3MDUyLiosQVRWVlZVVFVVVVVUVFVUU1RWVldYVlVVUUhGSUojKCi9kpqEqcbCtsG0n5qsoK64paSOm6SjoK+vqp+kn52tmZ64oKOroK+qmq6hkKqppJaJm5CusKynn6ebrZiYj6yioZ2loZmknK2Yn6imtqnAr6Wpo56LgI2bmp+mnZKVmpqUmpqlo6SaqKyso6Sfqqi+pJfDrKqioayyuquup6CzrqipmHavfpCLnIWHfLquiphlsIxlla19oY+DppWagayKhLCFpZmkoaGQhaBbbGqBs2B/rXt7goCxbGdumZeMiLBbfbRbpINryKJln4B7vFl2tVqyfVKvgHqsWIChbZiPqJuLmJGWlnt5jp1+ZHN+YoN3dIB8YWpmcW1mZWVPVWRcQlRePkkoPjk9NCEiLSUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5QUFJUV1peYF9gYWJeX1xbWFVQTkpHQzU1My8vQFVaWFdXV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsre9u7TCs6ObrKaltqihi5qgn52zs6meo6CdtZigs6iqq56vrp+rm5WvqKKOiJuOr6ypp6Knma6TmY+omqKdpZ+Zo6KlmZ+jqbKovK+lqJ2cjn2Lm5WgoJmPkpqbkpmXqJ6hmaiup6amo6Wpu5+gxqelqaGrtLatrqaeu62srJWAqZKjr4+bgIekl5iQgYC4w7qDjp2ThKeWnIKsioKviKabm6WqkH7VvcKqYqO/vX1+o4KD17q4tYWUk4Oevb6EaqOBb6uEbZ1/erKwx4Nqq7C9rHh3or67dICWjqadkJyRl5x5gpGbemN9e2SMZnmCe2BrZWtqYlBiW1NqXEBUYUJOKT06NC8eHyQeJTIgHSQoMDQ5NjY3Nzs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1JQz88QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Sxv7myvbKina6mpbOmnouYpb6pt7Goob+mprKcnrGcuaiera+mp5WUsKyXjIObka6mo62hpJyqoJiLo5KnnqecmqCoopieoKytqrmuqKOalpJ7h5mRppuSjpGYmI+Yk6iZoJipqaGqp6Gjq7ueqcWjoK+jq7O1q6+poLqnrq6ac3WqpLeGZYmgcGetj4qPbW93pJCZn4F1rpmVcI+LcZWoo5uXrqRybW1tZYp4b22CmXGAeWlxaWeJlpWYcWhphIZncIZkXYljam9ZXWd+d6ZgYnGOkW9mZICNko6imJiZkZaefIeOlXZmh3hojWp5fnlkbGNmbGJLZVhKbFk6UWVFUidLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZdV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola2zqrq5srOqqaGunqSyqZiSvbLEyL62qp7Aq6yjoaesn7qjpK2sraaOlq6pkIyFlZetnqaqop+jo6CRjKSSp5momZajqaCWnKWmp6+6q6yam5KSe4SXjaWYjZGRmJSNmJWnlJ+YqaObsaeeo6y6n7DBp6Szpqyxsqutq6e4o623loqhqKW2nYmWopiHqZqQlJ2TqrOZm6OroLGWoaGdoKKcoKShlaumjJKSjIeSnJyUkJqTmJCNlYaBpJqXlY2Lk5KKj4aEfmeKf3SCdnSHjHGnbXuUkZSTgYGPj4+PnZShlpmXooKIlI1yaZB3cIt3dnx6amxkZG9jVWBZQGlbSGNhT1orRj0rJiE3NDAuHxwhJTIoKjY5OTQ2OTs+P0FCREZKS0tNT1BRWFRWWV5fYWNdXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpaW1xeX19gXl5eX19gYGBfWVlgppapqqW1t66uorCkraCgtbGQjqvGvcS6uKqipZ2bpp6xqaO2p52ptaeokZisoouIiY+cqJaspKGZp56ek5Wjl6iaqJmUpqGjkJuomaG1uqirmZqQjXyBlIuglIqUkZWQkJOXpY+fmqqgnLajnaest6evwa6jt6avr7CtqamyuKCuvJmRpqOmtqKSnaafjamfjZKfo6yvmqGjsaivl6OgnKOpnp6dnJarnJKZoZuUkJaqmY2ZmZaQlZ6RiaCdlZSFkoyQjJSKgH5mjIZ1hnZ5iINznGqGkJSUkYp9jJaSkpiToZOel6KEiJiHenKWc3qKf3F7f2puZF9waWBbYFptY1BgZFBbOkdHRD0yPT03LiomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I6OUVNVlteXltaXFtbW1xdXV9fXV5fYGFhY2FhYWBiYmJkYlxbY5eVpKijsLOsrqOpp62gqLWqkJCdprS7r6ysoqOaep2isaSlsKmWm7mno5SZqpyOhoqJnKOQrp+jlqigoZKXmJuvi6qWj6iZp4yZqI+eubakpZmbjYl5gpOLmpOJlZKUkI2RlqKMnp6pnp+4pICEr7WisK90pL6jsqB4eqCqsbuUdayknomAqn5kXGJ2oI6knoSXfm6Ts5yjp66qo2Wdn5NzeZmXcICYqJdsf6KoimWcpZyRl5iWi5GbkYadmpCVgpKHjo6SiYV3a4+HdoZxfIaAgGFph4qUkotbdpWRZ2iQjnJ7ppmZZXmZh4J4mGqEioJueX9rcGVgdm9ra2hcZmViYm9TXD5OTk5SRz1AVEI5MS8eHyY0OjMxNjY3ODw7PkBBQkZIQkZGSUtNVFRVWVxfaGZnV1FKPERHOzhVUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWablaajobCxrKuppaito6etpJKVq7awsqaaqqerl3OMnbCfqKunk5e5oKCPnKSdkX+IiJuejauao5Wnop6Ol5GehXWukIimmqiRl6SInLq0qKCZmIuJdXeTjJWSiZORkJSMj5Ogjpugp5mcs5aAjJy1nbOMko+8p6F+p6J6oq63gY6Npp6Di4WPsamvjIqWo5p5gYushpydoqepp4eVhZh3pZt6h5uBl6aCgXucsXqKhaCXmZSYloGQlpaEmZljeYeQhI2PkoqDbXCPh3mAcYCBhX+GdIaElZJ4lmiTdKCadH2ZhKGdh5h+kouDg5lrjo2Fa3h7cXBnZHduaWxqW2VramVzXF5JVExRQEU1LllUVTYpITA5PT42NDM1Njg7Oj0+PkBESD9JRUpLR1NYWllbYWFoZllRSDlFTDs+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJejn6aurquorKCosKanqaWZlK7HvrChlqaptZ6Pg52snKeioI2Qvp6ZjZ+aoJB9ho+Zl4irnaKWn6CRjZOJhoCRqI6Hopyjk5eehp66sqeem5KOhXB1kIiTj4mTj4+bi4+RnpGXoaSWnqyIn7SJtJqti8qHqq6It4WNsIKwroOpjaaZjZ18qI9ye3ecj6eWaJWkebSLn56mqJKZwoF/q4iYoXGegJmkfZeFlbGAoXyhlKCQmJaAjpObipeRi3yFk4aNlZOJg21zkYV/enKGgYR8hHSFgpeBj8VmgKmHj6NrnoOimoOagIyOhYqZcI2ThWh3dHt2Z2h1cGdnbF5jb2xnbVhoR11RTDJFNDZNYGM3JjM8REdEOjY0NjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASmRZXWNmaGdiYmJiZGNgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZSXop+wqKmopaugpLmwqqummpSgpKWro5alqrejr3+hp5ylnp2JlL2ak42hkZ2QeYSWlpGHq5mbm5mhhY+Md5ucj6CRiJ6km5WZmIaiua6kmZyMjH9ibY+Kko+Mj4yNmIuQkZ6OlKChmaGofqGnh62doJauj56dnZGGgaCNqq6GpI2qmoyafqJ2gJmUa4KsdU2reIeNnZGbqKeAqqt9g6F7eqdpnn+Sa2eXhpe2iZ59bmBkWYOWf4x7ZGiKcpl9eZVsXXuXbV9TcIRcX2x5g2BZZYJ9hIGYcaeqa4OjbnKlcJ+En2pln2xbbop8Zlpfg39iV1BvdmVtdHFqam9eam9tbGpYaU9dWEU5QTRHQ15rNCxJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deX2N2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGNkY2FiaWtkYmRkZ2RiZ2VhY2iXlp2guaGqo6askqG2vKuuopmXoKKmra2hna61oqiSoaCgppyZjpi0mZCLnoyVjHWBlJKNiqaWlZienn+ShYaspIeckYqYqZiZmpKHpbGnopWaiImAaW6Ih4qNjYmLjZKLkJKhi5SeoJyipX+TgY+joZSgd5yWj6eDoad/hqmshKV5in2Emn2icHKTiJZ7nox5bYecjJmQm6iaj4edfIKic3amZp5+dqRfmHp9knOibpi3tLp0koeCf7WoZIHGuHtwlbeLcYCbpGNzrKtgfWqds35ufYeDjoKLl3GAo2xzpHOehICkYJ2Zs5ZxfJeftHRzW56yg2pib3R1cWhvWGtscnNmXWleYktEPUQ1UUFZcTM9U0dfSlI9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltaV2BgfGRIQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7iZq5yToI2kuLWuraCbopyjo6atnJuxrayTl6GZoaSZmpSeq5uLiZJ4i4ZwgJaNio+gkJOUnZd9kImOqKCHmI+KkaKTm5qMi6iopZ6PloeEfmt7h359j42Di5CQiY+UoIKWnqCdoJ+LiXecmKKMoHKii4ipiJymkJanqn6ujH16oJl6o5N4gXSWiI2cfZagh5uOmZumhqJkoXyIlpCbjWyeaJuNbpqZe4CKp31yaHSrg52DdKpnlJpdm4V2hJ1oqmqAuGZcqHCBnGGVjF6ndnWJin+eaJp1h5OSmI5/n26akG2nmV2ofni7a36qW46EXbRnXG5xenhraVtxanh5Y2BmWGJBUEVON1ZCUm40S1paX05aQ0AxNTE7OzdIPzpDR1Q/WVJZXT5EYl5WYFFhY31pRUI5TltdWGRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq1m6eJY5SbrLqysKydppycqJ+erpuesKisnZekmqGfmJaWoKOZhomNaoiAcnuXiIuWloSRlJiPeoqElqSdipSPhYudkZyciY+oo6CZi5GKgIBpgYd4f5aLe4iOjoiPlpp/lKOfoKKTmHJon4qfj4xxkoyBqYiZn6Onn6d8sK2joriXd6OzoqSAiJR5nXurmn+ijp2bl4mXcaF8hY2vtX1rmpGheH6YtKOjq6iEmXybfZ2afnSqWl1ve5aLeJ5iTH56eoVjeZdCTZ9ZompxfI5tgYmEmXWbeYeJsbN/f5uTp3WBnW5yfZRvmXNqpF2VdkhlY2BzcX5+bmVgbGh2fGRlYlJeV11UVkBZRVFnRFNXW2JYXklEPUI4P0I6SUU4TERXQVZRW1ZERmJcWmBLYG1+cUVDPFVfYlplalZnaG1vYmZmXmFhXF1eYWhiX2VkdmxeZWdma2RmbGloa2mTnYGxrZmEVF+gp7O5s7OpmqKMnKucnKmUoaukoaiPn56dmpmVmKCdloiHiXeFgW55lYWQm4t8kZOWiHKAiZOhnHORkIGImJSfmoSOqZyalIqLinyDbISFcYGgi3iFjYiHkpmVfJOjoZ+jiK6GfbWEjp6de6WWeqmBlp2QiqCcfKdodm1+mXShc3F8noaZcJODrn2kg6aemoGjb16oZ3WjY2+lYZzTkHx6mXhyc2OihZB+o3Ojj3VrkLOLYIKYiXOqsqi8f3eDbX6+pqm0XpxufXGXb4FzonJdo2d0pmFopm2b1Jl8hJtveHqXa5t7d5dybamkZ2BleXCAhGtnZmRtdXhnYGNUW2ZRUWJJV0lUX1dTW2VqXGRQRUNLTUpLQkpFOFA/UE1XU1hPUlJgZmVpUmN3eXdJRkVjXWRaaGlUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5uAsatUXEt+qa+xtLCzo5yZhZmooKCjjaSooJipipmYmJOZk5KgmI6IhntwfYRofY+DlJqBd5GNjolvf4aQk5Jsl5R9iJGRo5WDjqqalJKLhYl5g3aHgG6Cn4Z4gJOGiJmil3qToqSaoImzoaK2i3qsp6SupXCpgJqPhoGcknykgKKZhphynoSjra6Kl4yAjKSNloOuopV2tbW1yaFzlIqBn2Cdl6lteZWGn5p1oYd3oH6RloqAb0xmo5JwmodypHt5dGGDgmx+oGtxZGCccn90l2l7abO1tMamc5h+e51qm5urdYOabHR3l2maenWYclBEfbNeanZreYdmamdidHRxblZeVFloT1FoSVVMWVNVXWhrblZnV01KQUpNS0hKTkFRSlBkY2ltZXRyc355e251iXt7VFBPbF5oW2tpUmpoaWxnbGdjZV9cXVxeaWJkaGt7X11kaGNqZm9tZWlsZaGcibCnhGY/lKGyq6+vtqKikICXqaKipYylp52dpoKal5aNl5CPnJOOiIN5anmGZYOMf5egeXWPiIyBaYSFkoOMhZ2NeoyKlaWSg5epl4yRi4GJeoB9i3hwkKGHeYGVh4mWoJZ/lKWonJaWhGdueJxsomR8caV3m5hwZ6eBl4x7pXqfloOXcp52gYmUlo+5bpCKomJ9maKViG1yaatqdaBtbqZgm2mLkGiWh5qVdaKAfZpgi4WMdG+IYmigZZ5+aZp1b2NmiIJucqJaX1tjoW5diYxve39zcmSlbXeiZGenaJhzi5huoW9TiI9voF9lp1SLXVSYbW1za3KCbHBoa3hza29SWFdWZllSbUlYT11JWGloc2pZa1ZRUkVWXExYUmFUaGped3V6fHB8fHKDe39ydo2AhHZeUXJiZ2JwZ1BqaGhrbG5nZGdfXV5dYGtjaml2dV1cY2ljampzbGZrbWOcpZmmemV0bYunrqSpsLGmn4uAl6udnqWMoqGaoqKAlpiTjZqPi5iQjop7h3GAiGiLi3yYm3N0in2QfGSCh5WKipWZgnyIhpankIGirJCFkIqCin2AgI9zaI+mhH2GlI2JmKCOiJKqp52JpniWnH6liZaMspiekIKvl5+leJWIeql0pY+Emm6kooyShIyDu259pa+ChoaHk5acn3ylenGolaCWZ55+b6tjloqVkneobKmigYl1h4J3q5GmiGuRsGt2s4ypa4qGbm2fnpKVYX+ri6p2gH+Mpp93n32FpZWdoGmah3asZ56tjLdzd76NpJNZg6aNq2F1cnRwfHRxYmp+bmhtU1ZbVWFhXGtNXVJdSV1tbXZgW3FZW2BaZ3Nlbm9xY3F0YHd6fnlyeYNzhH+Ae3uMgYKAdmJ4ZGNtc2RSbGdob2xyaWZpYV9eXGJrYm1sem9cXGJpYmxqd21nbG5ilaaqnYGAnqSWqaqdqKeupJmJg5irmp6kiZqlnamdhYyajoackYWSjYyNdIZ6iIRvjYR+mJN0dIZykoNtf4uSh4aUj3x7gYWXpY1/paaOgY6JhZV2goeSb2yLqYGDjJSOiZyfiY2Tq6OgkIB1lJeIfoF5lK6jf4GbcY+FeZCLhH97cqaMcX19epeWm4SOeHt+foeUlZOKdpCYn6CDen2JbIyFW3l4cXlwaG5+kolxf3SCj5STcYWDgmWNf1+Bf4t3dXOUdW95bm6HbYSGXndpeI1mgYKGjqmbfnR8l2qJiG+Adn2Gdm1sZ4xzeXuYeIRba1h5j2hud3Jxb3h4b11shm5pZ1ZaYFdcZWtjVmFVX1FfcHh5bGt2ZWpranZ8cXJ0c2FvdWJze4F4dXmCdYCAf4B4i4WDfXttf2xkeG5eV25naHVreGppamRcYFpjamVscHVuWltia2RsbHltaGxvYY6Uuamni6GimqakmaScq6KhhISYrJKdoImappupmIOBm4p+lpOHjoqJjXKDfI99fo+Fe5eOdHKDcJaFe32Si4aGkIV4fn+GmKONe6ehi4aQkIWWg4aOl3ZyhaqGjpKckIienoiMm6igoKuDiY6Umn5+iZatqI+Tpo93b52Rg3qSb36ohXB9lXFrcHyBn4x/k46MaG1dg4uMm5uejnOVi4hxdGuCdnOAWXJuh5GBfX6Mal1qZHuFg4iAX2l4e5t7gouCdoGGgmh5i4drYXFyg3dfc4yCiZCnlYZmjI+DbneLhHGGj3pvZWdkeoN6lltcamdudlt7eHd1bnNzgmZcbYprbGJZWV5aWGxyXF9hWl5dZnR+e3VvdGNra2p7fHJ7eHRkbXRnbHt+dnp8e3p6f39+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hranFybVdbZW5sZ3N5b2hqbWCLjKqxopCjoZqenpeemaijon6DmK2Nn5SHm6KRpZV/e5iEfJKZiYiGh4pzfYCLdoWLgYSWinFvgHKYhoR+koSDhoqBeoCDi5ufj4KmoYd4jpiJlYuLnJeEg3qtgpGYmZSKnp2HiKGroKKio4uIk5uco5mWqqGnpqCSm4eWjnt4jo6Ep35/kpGSk5yxppuVnpCNspOYhKWMjJWbn4mQm4KJkYprfI12d2WChpCKe4mdhIeLj4iIgIWEkHd8eXWaoYiGip+LhZR/foyBgHZwdIaEf3iIh4uQppCEhY2Ig42QjH2Ii4mQgXZsgoR8eZlqcmhhdIpwfXp3dm92dIFdXm+GaG5fXlpcXVNoclZjXFxhbGh1fHxzb3Bka2ppf3tteH9xaW9wbGaAe3KCgHh/fYCEem2DjIZ8enh8fXqDeU5kdmtzbXB6ZGtlYmJgW3RmcGZycm1VXWx0bWl5enFnaWtljIidup+WoqGYlZmYlJmkoJ57f5qrjp6NhZ+di56WfXmUg3uOmYmGhISGbniAgHKBiH6JlIRta356l4aEg5B/gIaEhnyHg42bnZKHqp+DcoqQhpOSjJ2RfY17qoSNkpiWj5yXhoabp6Cimp2Gg5GamZmQmqagpp2dkJaAkIp2fIeOhKV7fI6QkYaYqqGek52QjquOkYCejImTmp6Cjpd+ho2Cb3iFcXRgf4KPhnWLl4CDj4KGhH6Fg5RueHV0kqGLjIWahYSNdICJfHxycnuIhHt5i46Ek6ePhoSPgoSKiop3hoiJi3xva36Ae25obG1nXnp/aHx7dnR2dXt3XGBwfW51YGNaXV5RZ21TZVteYWtpdnp+cWxsZGtqZ4B/bHOAbGx0b3huhHluh4B2goB9hHZxgo2Ifnt7fH97gopgaXtqdWhpgmRqY2BpXGR1aG9idW1sVGNxeWVwenpyZWltbYuKn7eaoaOfkpGWl4uan5+ee3ieppCbioaklIuYmXl6jYV8iZGDjIKBgm18f3hzgYV9i5F9a2h9gZeIgYiOfH6GhId8j4CPm5uRiKedf3CLi4yTh6GhioWNfKiRiJCSl5OWk3iMo6Ghnpaaf4CQmpiTjJujoaSal5Gbfo2EeH+Dj4eggH2MjI98mKSgoZOZkJCnjY+Bm5GJkpebfZKSfoaNgXV0gnB2YH1/jYZyipV8iItyjH+ChYaOaHdxeIyYko9/l36Ii3KBhnx9cHh7i4R6epGNg5amk4uGkXyGhoeFdoKEiYh6ZXJ7f3l6cWxqZl5+c2h8dXZ0fHOAal5gdHZweGRjWV9eU2toVGRZX2FoanZ4gXFma2NsaGV/gGptfmhucWt9d4Z6a4yBc4GBfYF0doKNhn58e3+BfX+PanKDbnNpYYdobGJfcVZ0b21uYHhobVdqdHZjdXt7cmJqbnmJjZ+ykqWlnI6QmI+GnKCbnHx2pKCNl3+MooqImpZ4e4aHfoOJf4mCgH9xf3t0doOFfoqReGdjfYaXioKKjXh9gIyDeZaAlZeWjZagm35vjIKRlIamm4iNiYSmlYWTi5aXk5J2kZ6hoZiUl3p+jpiXjpabnaSdmJKUm3mPhYJ3hJeNnX6BiY2Mc5einqKTmY6PooyMg5eYg5KWmX6YjXyIjYF2cX1uemSAfIqFcIaTf5CCbIeCgYCJhGV1b3yHkpeNfZN4i4l7f4Z8e3F+d4mFeYSQiouYopWBhI13iISDgnd8gomGdl94d310fnhnbGRhf2lqd3N0dX1xfGJjYXNudXNtYVphXltrZFJiWGBhaWt2eYZxY2pjbWVofINsaHRobG9of3yCeW2QhnGAg4N/dHyDjIF/fnqCg358kG12iXR0bWWKbGphY3VWhGlxbmB5Z2xianZwZnl8enFgcmyGhZCcrZemqJ6NjZeHhp+Tl5h9eKqcipl6l5yLjJiQeXuBi318g3uAgoB4dHh6c32AhH+Ji4BkXn2LlYd/hYd0fX6Kf32XhJeTloyjoZh/cod7k5KKp4+MjoqToZKEkpCUl5GLgY+YoJqSkJF0f42SlImdnZ6nmJiNlZZzjY6Ka4WYj5l6h4iQiW+XnZqjk5WKjZ+Mh4KSnH+SkpWGmYh8iYmBenF5a3Vse32Lfm6FkoKUd2+Cg31+in9kcmp7gJaXhH+NdJCJg3iHfnV4gH2GgHyDjIWNlKSQeYWCdImHfYB0doGIhG5ge3V6cX1vYW9jZHtibm92c3h3c3Rhdl9vbHVub1xcX15eal5PXVhjYWhtdHuIa19qZWpjaHeHbWZsaGlsaIB8endvkIdzgYOEfXOBhol6gn16gYR9fY5yeot4eG5sh2toX2lxY4docW9ld2hubGF5aGt9e3hwYXdti4GZmqqgpKidioqRhoqeipWXfXeumIyXfp6TkZaUiHd+e4p9e4B2eH+AcHRze2+GfYGAin98YVx+j5GGf4OEc3qAhnqPkYeSkZuSpZuVgn6BfI6LkqSJjoqNmJuNhpGYk5aOiYmMk52TkIyNboOQj5GJnpmioZeWipeRboiZhGaGmY6TeomFkIpwlpqUopKSiYuajIJ/kZ58ko+Si5mOe4qEh3RzdWtxbnR7i3RuhZCOknF0gHuBgoh8ZHFseX2ZlH2EiHSQi4BziHlvgH2AhnyFjIiFjZWojXuIfX6LhXh+cXCAhYNjaHh0dXB8Yl5wYGt0XnFqenh4a3NwZXhdbWxzbXNZWl5gYmpaUFdYZWNncXF/h2ZdaWhnYmdxjm9kaWdlamiAend0bo6FdIGBgnt1gomFd4V8eISFeoCJd3+Le3pyeYNqa19waHSAa3JvbXFnb2xlfGNugHl2cWx3d4p/opiiqKGmm4eMioGQnIaTnHWBqpSSjoegjJaTkIB0fHaFd3h/cnN7hWtyb3puinaAgYducVtZfpGNiH+AgHZ1gIB/oIaQipKcl6GUmHiKf4GNiZ2eio+GkpiWhYmVmY+WjIuNjo2dio6Qg22IipCRiZyWoZuYlYaYiGmEo4JmhZ2KkX6Lg4uBd5OYkp+SkYmJlY5/fpCXfJGNj42akn2Kf4JudnBsbW9we4Vpc4OOl4pwd390gomCeGZzb3aBmY58iYR6lJF5doh0cIl7hYx6i4aDiY+co4h8hHeCi394eG9rgYOBXXJzcXBweFpecGBwal5vaXx6cG1tamx2YHBvanJtWlhhYWJuWFFTWmZnY3VwhIJiXWptZGJma5JtYGZmX2hqgXVxcnCLgHV/goB4dYCLgHiFf3eHhneDhXuGjH97dop/anFjfGKGfG9xbHRqaG9sdndfcX95e3R1dICCfqSVmq2fp5aFjYN/l5SDkJ91i5+Uk4aLm4yVjYt6cnh0gnByhXRxdYhsb2x1bYh3g36AbW5VUYGrlIeCeIB2coJ5gaCCkYGTkpickpp4knuDjZOkmpOOiZWZk4WHl5mMlIyJj4+InoWQinxyioWJjoicmp+blpSAlH9ohZyHZ4agiJKEkYOJcYORl4+bjpCNjJCNeHuSkHqOi4yRlox8iHyAa3ZqbmtrbHp/YXl+jpWBdnqAd4ONfHlndGx0h5WLf4iGe5SQcXqEcHaMeomMe4l9goyRn52FfXx4gox9d3FqbIGCeV93b21scnNWXm9icmBfbG55cGdwZmZzdGhxa2F3ZV1WZmFgclNQTlxmZV15cIh8X11ocmJiZWaSaV9oZFtncH5wa3Bzin12fIWAdHV/jHl7hoB4iINzhoV+jIyEe3mVd2ZyaoNgiH5vb2t6YGpudH90X3R9eYZ4dHOFfHigj5mwnKWOgop/g5qIgIyef4uak4+EiJiOjo+EdnR2c4Bwb4VzcHGDcGtpdm6Dbn18bXVzUk6C38iS1pN8b3SEdoOggpN3lZGZm5Cae5RzhZCfoZOTkIqTm5SGfpaViI2NiJGNiZyAjoF4eox+iIyKnJydm5WTeY12Z4iRh2yIo4SSh5eDhmOMkZmOlYqXjI2Ki3F7lIh7joiKkpGJeYV7fmx7ZXJva2t5eVyAeY+OgHp9fn+Gjnp5aHNrc4uPiYKFhX2VjGt+fm6Ai36Lh32EeoGPlpqain13eIOQeXNtZ3CAhG1qdG9oanRuU15vZHBZX2tyeGZramJmeHJwcGNfeGBgVmtfXnZPTkxgZ2NdeXGJdFxcZXZgYWVlj2RgZmFYaXNzbmtxdox8dHmGgnV2fotzf4Z/e4l+comHgZGKiHx+mHZlc218ZYh+b3BsgFpsbnl5c2F2enuNdnN3ind5n4ubrpugkIKFd4iVfn2KnYeFn5GOhYyXhJOOh4F0d3B5cW6Eb21ufnJkZHhxfW16fWpobGOkmsHcru+hc2t1hHaFooWSb5aQlaCUnIGScYaLo5eJjpWKkJ2Wg4CVkIWJj4CSioqXf4d7dX+JeIaEjZybmJmPj3aKdm6GiIt9iqOEkYmdhYVei5SXio+JjouLhIptfJaBfYiFiZCPhnaFfX1rfWR4dWpueHNYiHqSh4V6fn+AhYt+eGVzan+JjomCgoCMloVrgXZuiJCCj4R/gnp/kJaTmZB1dHiIjXVzcWd1eoNidG1vYml2Z1JgcWdsVV9udHlhcmNfaH1wcm5bY3JhYlduWlx3TU1MZGdhXnZziW1cXGR5XmBkZoVgY2JeWWpya25rcnaMfXR3hIF4d3uJcYOEfX6Ie3SLiYiWh4x+fphzaHVxeW2Lem50cIFYcXp2eXFld3mGjGl3gIlyf5yHmaeco5KEfHCMlHh5i52EhaGNjnuVjX+ZiIR7cndwc2pvgWtpbHx0XmB4d3txdXtnYWV869q1ycPciHNsc4F3ipqIjWmYj4+dlZOBiXGFiaCNhIuVioyYlHyNk4iDiY97kYuGkIJ/dniDg3KHgpOblpSYhox2h39whIGJh5mhg5SMnoOJYYOVj4eJhoqNh4GHaX2Uf32DhImOjYJxhn5/cXdodnJpc3dsWox8koKFfH+DgISKgnVhdGyIgY+Kgn5/kpB9bYJseIaPhpGDfYF9gJKTkJeJb3J6jYZ1bHFscniBX3NpblxrdmBSZHJpZlNfcHZ0YG9gXWiCcXNqV2doY2lYbVZbdUxKTGVnXmJyc4VpW1xleV5eZGd7YGRfXFlrbmVvanN3in5zc4F+enZ6iHOFgnyAh3Z3ioaOmIGMgXuTdmx2dXl4k3RueHp9WHmFcYBvZ3l3koJkdoaFcYqVhZmhm6KKhnNvkotyd46cfYqaiYl8n3+DmX+BeHFzbm9kcn5oZmx3d1tfeXt7cXGAaWFnYX/Vto6QpnhucXd7cJKQjIdqmY6InJKMhXtpiIuah4GSkYaHmI18jY2BgYmOfJCNfoqFenV7gnpwhoCWmY6TlIGIdYOGdoN/ipOdnoaVj59+iGGAk4eFiISKjoB/g2d9kYB+f4KMj5B+bYJ8gnRrbXZ0c3Z1a2KNgY9/hX58hH+Eh35wX3NxhXuPjIJ8fpGIenCDZnmDioaLg3yEfoCUj5GThG5weox/dW5va2x6fWJoamlYbXZaUmlyamJRYnJ4bGJlXVlqg21zYlxnX2RsX25UW29OSE9nZVxnbnGAbFtcY3NgXGNsd2RlXV1abGxibWpzdod/cW9/fHx0eIZ4hYJ9gId1eYmBkpZ8iIZ2iYFvd3l7hJNwbXyBd16Df3SBbWl7c5RzZ3OHfHKRkYOan5ughod2dpR+bXaUl36IkYOKjZp8i5p2fXZxb2xqYXR8Z2JpdXpaX3h8em1xf2VkaGhXnY9ecXKWvMODdXGUiZB+cpeMhpyTjIhza4mPloF7lIuBhJuMfIuGfXyJjH+UiHWJhXZ3fYFxdYaBnpSGlY+DgnJ/iHWEe4mYnJeGk46dgIhlfZOCgIaEiYlygX1nfYt7eX9/h4uOfGmAfIN2Zm94eHN2c2xqjYWKgYp/eIGAhIN/a15yeHp9jImFe4GPgH5ygWl4goeLhYR4g3yBl42QjH1ubXuJfXd1b2hofXZkXHBiV3BzU1Nuc2lhTmZ0eGZgXVxYboBvc1llYl1qbWBwT1lrUURTZ2Faa25te29aW15tY1pib3djZlxdYGxqY21qc3aCg3Fufnt/dHWDeoOCfIGFdn6JgZaReIOKdIGIcnh5fo2Qb298gXFpgXl6fm1tfHaVa2p4hHRsk4yGn5igmYWIbn2Mdmp4mI9/goqDlZeJeY6Wb3pzcGxqZGB0emhgZXF6WmFyfXlncHphZWWPsbJ3SmJapNnQlnF7kIuQeH2Vi4WZkY2Gb2yGkpJ6eZKGgYSYinyHf3h4iYqEloBwjIhxdH16aXmFg6WRhJONg39vfoN2g3eFm5iTipKQlIWHcHuSg32Dg4mDb4F4aICFeHJ/f4OKhntlfX6EdWRwc4BoeHBvdZiMhYKKe3Z4gIR5gWtccX1ygIeFiX2GiXqIcoFucYOGjoSEc4R4gJmNjYR4bm9/hH93e2Voan1xYFl3Wlhxbk5XcnNnYEtsdnRhXVtbWXR9cm9XZ11manFfb05XaFE/WWZfWnBrZ3lxW1tYa2VZY3B5X2hcXmVtaGZsaXF3f4dvbH99gHVwgXqAgX+Cf3aBhYmXinGCjXF7hnx5eYOTjHVqen9rb350f31vcnx7lG9ugH94Z5KKgqGZnZGChmeHg29oepaKfoCFgpmKgXyNjGl4cmtsZl9hb3ltX2JveVxka4J6YXF2X2Vm1Oq+ijI6PouOgHJ5hYiOjXaDl41+k46Nf25shY2Mdn2Pf4WClYl8g3hudoeEg5d3b4mFbHV7dGZ5goOnjIOPi4R9bn90doN5hpyQi5CRkoyLhn57kod4gISNg2yAcml/fnhtfHuBioN3YXmEgXFkcWh+bXRxdYGbi4B/hX5ydX2AcoBvW21+dHiKgot7hn98iHh6cWyIg4+DinKBeX+Wi4t/dG5rd4CAdXVcaWl3cFlXfFNacWVMW3JyZVtKcHdvXFtaWV10fnVoWWJbZ2ZuY2lMV2ZRPV5mXF11ZV90cFtZVW9kWWRxeVpoXl9nbWdqa2lwd32ObGmChH55boB7fIB/gnp1goGMk4VwgItueH6AenuIkol/aHt+a3R7coZ7c3d9f4x5eIR9fGuMjIObnZaMgYBsjn5raH6OjXt+f4OUgn99iohrdXFnaGNbYmdyb2BhbHRhaHCJeWJzdF5jZJugj25cNVmvtXVqgIl9koZ2hpeGdI+LindwbYWDh3V5iXiJfZOIen9zZ3aIfn6Yb3GGfmh2eW1leYiEpYeAh42Jfm5+dX+AfYyZh4KTkJiIi4SJfI+IcXt9hHxpfm1rgHt6anp2gYeBcmB3gX5xZHJndYJtdHuFlJGBfIF/bnd5fHR+bFhvf3Z0i4GGd4d1gYl6eHNuiYCOgIVyfn1+k4mJem5uam6CgnVuXWdmc3FRW3tOXHFcT1xycGRWS3N4aldZWVphcYB0YF1dYGdkaGlmTlloTUBhZFtgdmFcdG1YWFN0YVpkb3JXal5haGtnbWxpcHd8kmtohIl8fHB+fnuBf4J6d4CAiYuEcXuHb3F3g397iY2Pg2p+e253eXaKd314gIKHf4N+fnpthYyImKONhIN7dYt5a2yEiZJ5fXuCkYCAfoqDcHJwY2ZeWWdfcHBgYGdwZmpvinRhdG9bYWRqdnt/vpymo8i4cYWEc5R9eIaUgnSQjYhycnCEe4N0dYd0iHeUiHl5cWN3hnqAk2lyhHZmd3ZjanyDiJ6Cf3+Ojn1yfnOEeYCRkIJ4lo2Uj4iCiHqJiWx4eX91aHtpa395c2l6doCCfWhgd4d9amt0aHt/aXaBjJCUfnp+fnB7dntzfmJWd31yc4qEgnyCcIaJd3hwcIOCjH59eX58dY6Gg3ZpcWltiIJycF1oY3NuSmV1TF5vVlRZc25iUU9zeGFSWFhdYnCCc1thXWhlZGNqZFFacElEZGFbY3BeXXdoVVdWd15cZW5oVmteYWpnZW9vaHB2epJuaYiMeX1ye354goGCfHZ9g4iGg3B2g3Jud4KCfomLk39wgHx4eXqBjHWDeH+BgYKEeoB1b36Ji5qeiH2FeneGe2d0hYyQen9/fImGhHaPgGdvbl9kXFhlWW1yYWBhcWxraIluYHNpWV5kbYB3qdqpx4aHsnGJeHCNdXuHj4B6k4qAdXR1fneAcHF/bYR0lIZ4dWxgeoJ5iI9mcYNvZ3ZuW219gJCTgIB4kpJ9eHtth3WAkIuDc5aKkY6HhYV7gIVtdXZ/bmh3ZW17dm1qdnd/f3xgYniGemh0dWN+emd0hY6MlXt0f3VxgHp8bH9ZVnR9b3SEh3+AeGuIhnN4a3V/g4N9en14e3KLgX1zZ3RlbouEbXRbal91ZEhubkxbYldXVnhtYlBTdHZYUFVYXmFxhG9cYGNtZWNebmJUXHJHQmZfXWZoXVp6Y1JWXHVbW2drYVZqX2BvZmZrcWhwdXiNdGuOjHV/dnh+d4GDgXt0foOIiINvcX90cXV+hYKJjYp7d394hHx8hYd4h3x9gX6EgHt+c3Z5jI6fjYl6iXZ0g3lefYWZjHmHg3SFhoV3iXtibmxbYltbYVZqc2NgXGdub2aHcWFxZlddY2t/fMrOiLmiam1timxxhHJ8hIp+e5KFenl0eXV1e2psdWOEdZGCd3BnXn2CeouJZXKCa2pxY1hse4aciIKBc5eUd357bodxgYqLh3GWjpCIhYuDe3l+cXFvfmdocmJueHFqa3F3fHx5XGV5gHdpdXhmgnZndIeLjZR8coZpb36AeG18XVhxfmxzgIt8gW5uiX9xdmh3f4F/gXZ8cXp0h3x6cmZzYW6MgmxzWGtfd1tJbmtNVlVeVFV7a2FPVHVyUVFUVl5idIVoXGBsamZjWW5hWGJwR0FoXWBmX11Ve15PVmRwWltqaF1XZ19ecmZrZ3JncHJ2hXhulYp0f3p4fnmCh4B1c4CGhY6CcHB7eHZ0eYaGhouGenx/dYt+fYWEhId/fn59h398eHZ5d5KTn3+MfIttdoB5Y4OHl4ZzkopvhYWBeoN0Y25qWV9bXV1UZ3NlYFlkcnJmgXNia2VXW2Bpf3e+rnugt21ic4ZodHxyeoOGen2Mf3h4c3Zve3Zlam5gh3WOgXNqYl5+eHmLhGZxfmhqa1pWb3iKpIGFf3GZk3GAeHWBbYCCkYdylIiMh4OIhX15dHJvaHpham1gbXZrZ2preXd6d1tnfXx4ZXJ9boR0ZXWFjIaVf2+LZmt6g3RsdGJcb3tqdHuLe4FldIZ9bXFndX54fX9yfGx6eoF6eHBmbGJuin5tblZrYHdVSmprT1JPaE5ZfGhiTlV2akxQVFVfZ3aDZl1gcWhnYVdpXVtraEpFa1piZFdZVXlaTldualldbGVcWmRiXnRmbWRxZ3JvdIB3cJmFdn9+d398hYd9dXOCiH+Ugm5zeHp5cnKFh4iIhHmBfXaPf3yEiY6EgoR7fouDe3d8d3eanZd6ioOGaXd9fGyDhJOAco+CcYaCfoF/b2ZsZ1ddW1xbVGRwZV9YY3N1aXZwZWViV1xcaIBwb3KAdIllZXh+aXR2c3ODhHiBhHl3dHVua3twYWdrZ4Z0jYRuZl1ffXB7iX5pbXdmaWRVV3JwjaZ8hHx2lpBzfHN7eW17e5GEdph8h4aDhoN9dXBybGd1XW1oX2x1ZGdmaXpve3JZZ4F3dWdwgHeCdWJ3hYp8lIBui2pteoBwZXJlYG15ZnJ3int+YnWCdmlrcXR6cHl4cn1mfn9/eXduY2ViboZ8bWtWamJwU0tpa09MT3BHXntmYU1VdGNKTlNXYWp2fmVcZ3NpZWBWY1dicF1MS2tYY2FVVFVzV0xZdWRaX2thXFtjZF93Zm1icGlzbnF+dHSZgXd/gHd/foaFen11goR+l4VucnR7enRwhIWPgYB6i3V0kYB9gZSOgIWEfX6Mhnt+gHZ7o6WKeYiFhGx1fHt1g4KMem6Fc3qEfYGDdW5qaGVWXVtaWlNibmVbWGJze2pobWlfYldfWmmAamtvgGhsYWh5eGt0dHRuhYF7f312dW16aGp5al9lbmiBdo+EZ2VYYndpfod7b2lvZ2ZdVVhvaI+ndoF6fJCOeXVvfm9ydXiOf3eUdIWCf4WIdmpydmdob1xtZV5tc19nYWl4aHttW22CcnNpb4B+eXdhd4SEeI+Ec4hxb3l/cWJwaFxvd2Rxc4h8eGJzgHBnanhzcmt3dnR3Y4N7f3d2b2RjY258fWtsVWliZlNLbWhPR1JsRWF4ZmFNU3JdSU1UWWVrd3plXm1waWRcVl9Vbm5XS1RoWGZeWE1VbFRKXHlfW19rXV1aYmVgemhsYW9vdW5vd3V6mH13gIF6gH+Hhnp5eoN+gZOEcXR0fnp2dIWIkH2AfZBsc5WBfIOfhX+HfYB+hoKAint2hKyff3qIh4RscoJ6doCAgXVuh298f3OJgGpvbWRkWF9aWVpVYmpnW1pedYFpXm1sXGFWXFxrgWZydH1qal1rdnZndHdxbYV7fX15dnJsemhpeGZdZHNoeneSgWNjVGVwZ4KFd3dmaGpgV1ZZaGSQp25+eICLjnpwcHxmeG55i3t2jnGEfX5/hm5kdnNkaGhda2Jdb29bZ19sdWV6aF10gG9ya3F7fXV1YnSFinqHhoB/d3J1fnRhcGxZcXRicXKFfHRkcn9sYWx6b2poeXd0cWaFdXp6dXBkYWRuc35pbFRpXl1US3NjUUdXYkdidmZhS1RvV0pMWFhnbHZ6ZGVucGZjWlddWHZlVEpcY1hoWFlJV2VRSGJ4Wl1fbFteXGFkXn9pamBvdHhtb252g5h5coGAfX+Ii4Z9dXaGeIeMfXN1dYJ4enqCjI59foSJanSXgXuLnX1+hXqBen58hohzcY+ujHt7hpB+ZnKIenR8fHZyb4Zse35sj3picG9hZV1lVllZVmNma2BdXHOFaVlwblpeV1pcbHtjcHd2bGJbbXN0Z3V1cG2EeH6AeXdubnRlaXRlW2d1ZnZ2kXpfXVJlZmqCgnR9YmNpXFRYXmJjkKVoeXSChZB4bW55Z3dte4R6dYhygHh8eH9oZXZtYGZhX2pgXXRrWWVdb29iemVbd3trbm5wd3hzdGRyg5J+h4KIenZvcn1yYXdkW29wYnBxgnxzZnGAZF5udmljZnl6dG1ugXV0fXNxYl5mbm99ZGpTaFhZVE13X1FKWllIYnRjYUlUbVNJTFpXaWxye2JsbHNiYVlaW2F2W1NLZF1YaVNXSFlgTkdpdVheYW1bW19iYl2FaGhhbnh5bG5qdoGQeW6DfoCBkoiEgXZ0iXSMhnNxd3aBd3x9foyPgH6TfnB4loN9mZJ5gIB4eX1/dIiDc3CZont6f4mVeWR1iHlzeHVsdG9+bHl8cJFyXnBuYGdibFRbWldoY21mXFxxiGVTcm5bWlhYYG13ZGl1ampeWm1zcW10c3RqhXx+f3x3bm5sZGlxY1tqcmR0do9zW1dTZGFygH9ygl1iY11TWmBbY5OfZXJxhYSRdGxqeWxvb3p7enGAdn5yenp6ZGZ2Z15iWmFnXF53aFdiXm9oYXdhW3t2amlybndzc3RocIGUgoZ+hHZzanB8bGZ2V1xrbWJwc4F6c2Zvfltgb3FiX2lwfGxrc35ycXhrcGBbZWxtemFnU2dVV1JQdltSUFpSSGNzYmBHVWpQSE9aVmtsa3xlbW9xYFtaWFlscFdSUGZXV2lTVEZaXE9IcnVYX2NtY1hhYGFdi2pjZG15eGtuaXV5hntrg31/hJl8goR5fYhuj4Zxb3d6fHSCgnyLj4OClnR4gpSFgZ+JdYCAgXN/gXCHgnVvopd0e4aLh3tmeItvbntvZnhwemxzdnKMa150bmFnZWtSXVtWZ2JsbFpccYxkT29uXVZYVWdqdWhidGVlXVpudW5xdXV6a4d8f3yId5BzZGRrbmFcbm1jc3iHa1pUVmJjeH19cYVdY19jVFtgWWOWlWNucIOFinNqaHpuZXJ2c3tsenR1b3p+dV9mcmNbXldiZFlhdWVVX2BtZGFxXV1+cGhpc3FzcHV1a22Ek4GIe4VxcmZufG9xblNbZmpmcXSBdnNibHZVYnFqW19uZXxlbHV8cnJzam1gWWRqandeZlRkVVZQVG1XUVdUUEhlcl9hRldpTkhYVFZuaWR8aWt3a2FXXFVbdGRTUldoUVlmVFNIWlpQTXh3W19lbGlaYmBeXo9uYmZreXVub2h2dn9/bYOAfoaXe3+IgYp/a5OIcmd0gHt1gIN9iY9/i5NyfYqRhYefhnt/hoxzgIZzfYN2bqWMc4GNi3d4bnqMYGR8cGZ6c3lsbXF2gmdke2xjZmdoU15eVGdgbG9bXm6NaE5pbWBUVlNvZ3RsZXhkZV1ZcHRtcnp4c22Ie4B2nHt6a2FlbG1eYG9qZXB5fmdaVlhga3h8e3CEX2JeZ1ZZYFdknIhia3GBh313a2p3bFt2cWt5aXVybW97gHJYam5fWV1WYmNYZXFjU15haWJibFpgfmxma3N1bm13dmtohYx/iHqHbXFmcHxscWxjWWBoaW90gXNyXmlsUmVxZFRibmF5YnB2e3VrcG1rX1hhZ2h0XGVWYVZTTlhlUk9cT09IZW9dY0dZaU1JX0tYbWRgeGhufWRgVV5UXXRbVFJgZk5dYVRTSlxZUFl1dl1fZm1oWGNhW16OcGNnandxc21odnR6g3OCg3qIjX58ioeOem6QinRsc4J0f3+IhYeShJWPen2Mj4iRm4SAfIyEc3+Bc3R4cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6Ojo6Ojo6OjY2NjY2NjY6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkpOTk5KTk5KSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6MjI2NjY2NjY+Pjo6OjY6MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8fH1+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJFtZmdnZ2dnfYWEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREVCMS8vLy8vLICkoKCgoKVeKi8vLzAsSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMkWdfYGBgX155g4KCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1NTMfHR0dHRwYfqmkpKSkqlYVHBwcHBc6g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRjo2NjY2NjY+QkJCQkJCMh4eIh4eGiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWGhYODg4SEhIOMkI+Pj4+PiIKDg4KCgoWKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GSkpKSko2QkpGJh46KkJKTkIqPi4qQiY+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ojo6Oj4+Pj42MjIyMjIyNjo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCMiIaFiYmFiJCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJGNhoaHhYWHj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQj4eMjYmEhoiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yMhIqGhoiDio+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2IiomKjomOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYSEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSkpKTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fn5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSkpKSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f35+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjI2MjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDioqHh4mGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dXZ3dXJwcWtscnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhnbWVqZmhlaGdjYmJhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWl5cXV5iaWBdXlpZX1tYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3l2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NUFBcV15sV1VSUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUGBXXXJVT09PTk9QUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktMY1RbdFZLUE1MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0dmVFV1U0pQTElJSkhISklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+Af4CAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+PjxFRD0/SmNbVXBLREZIR0ZHQkREREZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozs8PEhMPT5VZGJeZ09BRUVGREZGREZJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR1c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgYJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7Oz48SGJtaGZsYEZDP0xDQ0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nz09ODlVbHJranBrTjVKWD5AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3VzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9DQE9CPFhucW5sc3FbQ2NVPT9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A7XW0/UllKUmtva2dycmZfakg7PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRkQ+PDw9QD04OjtudkdBYl1caW5oY3Fua2xmPjk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fX5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFpRPDw9S05ISHZ2TThXamhrbmpvcW5tbFY6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BDc3lIPF+Ag4B6e3dWO0Ngc3Ryb3Vxbm9gQT89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQEhyeWtlg4SDg4OAfV0+P0doeHVyc3BtbEw+RUJCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV0d3p8e3x7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFARm90foKCgYR+fYR1TEJDQ09sd3h7enFfRUVJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaHN9gXx/hH55hXJDREVFQ2SCh4eIhV5GSUpMTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4CAeICEhYOEiW1BQVd1hYiHh4eJgldITE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKCg4OFhoaIg1VthoiGh4aHiImIfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklJSEhJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlaBhISEgoKGhoaEgoaFhYWGhoaHiIaKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkBBQ0NCQEFCRERCQ0ZISUhISExNS0dJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJZoWEhIR/gYODgoOEhIWFhoeIiIiIiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4ODs7Oz1AOzk5OT08Pjs7PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlphoSEgX6Bg4ODgoOEhomKi4uLiomKi4yJVDo4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmaFg4GAgYODg4ODhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo6Ojo6Ozg5ODk4Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1d3l7ent8fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9coSAgYOEhISEhIaJioqIh4iIiYqKjIqJiYx6Pjk4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7PD06Pjs5Ozs8Ozw8OTo8ODo6Ozo5OTk8Pzw9QUJESUpNS0lLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQUI+QEJAQD49Pj5APz8/QD9APT0/Qj9BQT9BPz1AQEA+P0E9Pjw7Ojs5OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoOCgoSFhIWEhomJiIiGhoaHiImKi4yLioqLiotePkRHSUtKSUZHR0RGSEdFQkBAQ0VDQ0FCQ0I/QERIRUNFREVFQUZFRkRFRkRAQj88QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHZ3enl6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDQ0ZYhYKDhIWGhoaIiYmIh4aGhoeJiYqLjI2MjIuKiohXSExNTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX19fn9+fn59fn+Af3+AgH9/f4CAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT9CQkdHSlmFgoOFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTU9NS05LSkxKSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpPTU5MTE5LR0dHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg4PDs8PTo/QT5AQENGSUpRYIKDhYSFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpIR0VKSERKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0hGQ0JBQ1VucHV3d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHR0I/OD9AODo8OD0+Oz1BPj9AREhKTFVxg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyLi4uLi19SUlBNTk1LSkdGQkdKR0xKRktPTEtKSk1NTE9QTkhJS0xPUVBQUU9PSklKSkxKTEZHSEdFR0lGRUVCQEJCXG9yd3h5enl5eXp6e3x+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQVnmFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pERUZLT05PV1ZRUE9RU1JNU1RPTVNMUFNVV1JTUVBMSk1NTUtOR0dKRkZISkRERUVCRENjcHV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0NDRlZORk5QUFRYe4aDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyPi4uLZ1ZVa2FFUlFRUEk7O1FTUmB1XVVWVFZZWVJZWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tISEpIRUZJSElISWlydnl5enl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUlHR0ZFPz9BQUVCQ0dFREVMWFJNVFVWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUT9AVlVZXGRgVllicl5dVl1aVkVRWVpbWV9UWmdSVVZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p5ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLeW5wWFpbWlJUUlZWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lJWVhZW11YWFlXUlFOUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSUZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKf2ZZWVxZU1VUV1JRV1ZjloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXFtcXV1XUk9TUFBRVlZWVllabnJ0d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltTU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVFNUXlpYV1dXemtYWltcXlRRUVBJTk9XVlhaWmRxc3Z2dHR2eHl5e3t8fX19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVVFJPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtNTktNS0hKREZIRUM+U2NVf1JRUU1LUlRRTU9ZUU1OUVNVVU1RU1JQT01MSENJSFJUVVpcbXJ1dnVzc3d7enp7e317fX19fn19fX59fn9/f39/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlZVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDP0NDQ0NCP0RQQkRAQz5CSEdWQEhOTUddaVFIR09GREVGSEdIQkNIR0hLR0RBQURAT1BNU2RzdHV1c3R1enx6e3t7fH19fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJbWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUU09WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPz87Oz5AQD8/PmtRS2FFRkhJRUI/R0xNR01RVUlCRT8+PD08PT0/PT9BQ0M/Pjw9Qj5KTUZVbnV1dXN0dnh6fHt9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGpqZmBbUVJaXFleSUpQUU5LTFFSUVRWVFdSUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9e3h6fHx4d3hkQkBAQj06QkNBQURCXF1Pe05PT05LTE1PT1FMS0xXTkhHQEI8OTc3NTk5PTs7Ozg5ODk/O0JIP1x0dHV2dXZ4enx8fH18fH19fn58fn19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5gZWBdXnF2a15gZ2t3b29sam9ubmxmYlhHRkZIQkFHSUVFRkRNUlBhV1JYUVBTU1JVW09PUVdQTUpDRj46OjY0ODc5Nzk6MzY2Nzk1PEI9ZXNzdnd3eXp7fX18fHt8fX5+fnt+fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUxUVFNRUVVPTFJTVFdYVFRYUUxYWVpWWFhWWFldV1dYaHNrXVZhc2thYV9dZGFfXllVUE1PTkxJSEpLSUhGQ1FQU1pXVFROUVNZU1xlVU9TVFFOTElIQz9BOTk4ODk3ODg1NzU3ODU5OUducnR4eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RVVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMUFJST01NTk5OTEpGUVBVWVNUTkpPT1RTVFxWUlVTUk9NS0lISEY/Pz06Nzg3NjU5OTY3NjY1V3BxdHd5ent8fX59fXx9fXx9fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwb2ZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0lHT1BPT01SSk9QUFBOTk9UTE1JUE9TVFUyPFhNSUFRPWNhUVNRUE5QUVBOTk1RTlRSUFJNSUxLT1FQUlJTVFFST0xNS0xMSENCQT06Ojg3NjtCNDU2NjtlcHJ2d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRkFGR0dIRkpESEpIR0VITEhLSEZMTVBNRy9FX1I+M0A+am9hUlJRQEZVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc2RG5xdXd6e3t8fH18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hFRkhKTktFR0NPUkM4RU5TXWZTUVNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01ITExJS0tMS0hGRkVEPEFBPjtARTs8ODlUcXJ0eXt7e318fHt5fHp6fn58e3V0dnJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa25xbWltY0xPT01RU0xUVVRXV1VMTEtIPTk4Nzs/QD48PUBAQj0+RUhHREZGSUdLSkBGQUFARkhFSk9IUFJhXFFQUk5TT09QTExPTUtNTE1PTltXS01RT0dJSENJSkxMSkZGRkU/QkM+PEJGP0I/QWRxdXd7ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPjs/QUBAPkFESUVDSEhJR0lFQkI/Pj1DQkFISkVNT2JlUU1OTldLTE1LTE1NTUxLTk5TZE1KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLb3B3enl5e3t6e3p3dHh1eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9IS0U/Qj05OTk6P0I/PEBCQUFERUdLRkNJSUdHSENDP0I/P0BBPkRFQ0tOUVRMSklNVEdJSUpMSktMSUpMTU9QUlBLR0NLR0NCSkpMTU9NSUpJR0NDQ0RJSk1MSVpzbXh5eHp7e3l8dnJwdXJ0eXl2eGpxb2tsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FqcWhlcUhLREdISEdKS0lKS0RHQj0+PTo6OjtAQj89QkJCQ0hGSkxKRElJRkdHQ0M7QUBCPkBAQ0RDSU1QR0lLR0hLREhJS01ISkxISUpMS01dUklIRE1HQURLS05NUE5LTUpLRkdHSk1OUU5MY25pd3Z3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRvRktERkVHRUZGR0VHQkNAPjw9OTo6OkBEQD5CQ0RFSUZKSkxGSUlHRkZEQjtCQ0M+QEREQ0VHTE5IS05IREhFSUxOTUhJTEdGR0lJTE5LSkhFTklCRk1MT01PTU5OTUtISEpPUlFSTlJmZ2Zyb3N4dXt6fGxoam5la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkNFRkVCQ0JFQERCPkA+Ojs7PTo9PkNBPkFDRUdKRklIS0hHR0dGRUNAPUVFQj5CQ0NDRUdISUdNUEpGRkdLTk9LRkhKRkVERUlJSEtJRkhQS0RJTUxQTU9OT09OSkpJTVJVVFJPV2RgYW1ncHJvcnl6Z2VoaGNpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0JAQkQ8QkE+QT06Oj0/Oz4+QEI+QEJER0tGSUZJSEZGR0VDQkFBRkZDQkNCREVFR0dIRkxRTElPSkpMTElHSEVGRURDSUhIS0pHS1JNQ05PTVFPT09OT09LS0tPVVdWVVRYYF5caWFtaW5ocnNiZWZlZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3FyamtzTUdHRkhCQkBERTxBQUBDPDg5PT45Pzw/QkBAQERGSEVIRkZHRkVFRENFQ0RJRUNGRUJFR0VGR0dFSk1LSFFNSktISElFRkhJRkNJSUpLTUtPU05EUVJQUVJOT01OUE1MTlNXVldYVlhdWl1kYGhiamlna19lZWZjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpb3pNSEdISEJCQkZFPEBCQkQ8Nzo+Pjo+OkBCPj8/Q0VGREZEREdFREVDREVGR0pFRUlHQ0dIRkhHRUNGSkpHTUpMS0hKTEZJSUtIRUtLTE1PT1JUT0lTVVRRU1BRTU5RTk1RV1pWWllWWl1aWGFgYGBeaGVjYGRmaGdqaGhqZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3VucHJzeU5JSEdJREFDSEU8QEVCRT04Oj4+PTw8QUI9Pz5BQkZDRUJDSUVDRUVGR0dHSUZHS0hDSEhHSUdGREhLSUdLSE1LSktMSExLTUtKTkxPTlBSVVZPS1VWVFFUUVJMT1FQT1RZWlpcWllbXl9eYGJeXGFja2JgZGdocoVoZ2lmam1ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnF1TUlLSEpFQkVHRTxAR0NEQDo8PkA/Pj9CQjxAPkFBRkNFRERJRUZFR0VISEZIR0lLSUZKSEhLSEZGTEhISEpHTExMTExJTUtNTU1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXF5fX2FgYWRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2b3ZKS0xKTEdCRURFPEBGRERCOz8/QUBAQERBP0I/QUNIQkZFRkhGSUZGRElJR0lISkxISEpKSUxKRkpLSElKSkdLS01NSkpOTE5OTlBLT1BSVVhWTU5UVlVTUlFQTE5UU1JXW15eX11dYF9hYWFgYmRlYWNoYmRpamd2i2xraWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXVlcXNrcHFqcnZvd0pNTExNR0REQUQ8P0VFRUM9QUFDQkJDRUJCREFBRUdDR0hIR0ZKR0NHSUdHSkZJTEhJSk1LTUxHS0lITEtOUUtSUUxTTUtOTk9QUE9UT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmBiXmBlYWFiaG1nYmloaG14dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE1MTExHRUFARD4+REVGQ0BDQUVEREZDQ0VHQ0NJRkNISkpJSUtHRUtKR0hKSUlLSEpKTktOTElMSEpNS1pmSmRcS2xTSE9OX25Va3NbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUYHd1aGpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlLTkpLSkZDP0BCPz1ERUZEQ0NCRUVFRkJGRkhDREpFRUpNTUtMTEdHTUlHSUtIS0tJS0pOTE1NTExJTExMW3NiZHBebG1VTU5mc11mZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpyeXZrYmBrZWVteW1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRURAQkI/PkNGR0JGQ0VERUVEQ0hIR0RFS0dHTE1OS01NR0pOSEpLSklMS0pKS01NTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtb3ZcWWxRXG1tWnFta29teHh0c2lwXF9ya3FqVXV5eHBjXmtmYmdxcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEVFRUJCQj1AQEZHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5HTE5JTEtJSk1JS0pKS09QT05NS05NTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkdFRlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2dhZGp1eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJREVEQ0FCPEJBQkdER0ZMSEVDQ0hLSEhGSkxMRk5LTFNSTEdMTEhOSkhITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210Xm5YYXRfbm5vb3Fyb251c3R0altddGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2c0hLSElCRUVFQUA+Q0RCR0NISU1JRkNGSkxJR0ZLTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTU1NTUlLS0tTa2JaaV5faWNyclpfWWpvX2VlVWtfY1thYlFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW52cXJ1dHdySEhGSURFREZBQEFFRURHQkhKTEhGREdLTElFRkpPTElPSUxbUUpGSEhLTUlISklLS0lISUdLS0xLRkhLS0xMTEtJS0xOVFtcVFBUTFBPTk9PVlFPT1FPT1FKSU5QUWRxaVRZV1tbXFVZWl1YXVxcY2ZhYWZiY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNIREVHRkZBRUM/Q0hERkdDSUtMSEZER0tMSERHSFBLTE9LTFdMSUVFSElKSElLSExKSEZIR0pHSElFRkxJSktOTElPXFdeUFxbYF5PWFlTXFxiXk1ZWk1YYVJKWWFaU2BkXGFYW2RkVlZYXFlaWFxWWVxdYl9kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUFDREJESUVHR0ZLSktIRUVKSkpHRUhIUEpNTUpNU0lIRkFIRkpJS0xJTEpIRkVKR0RGR0VGSkhDSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5eXF5TW15jXlpdYGNgWV9iW2BeW1RYWFleXWNiYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JREJCQ0ZHRUdHSUtKSUlERktLS0ZGSUpOSk5MSExOSEhGPkdHTElLS0pMS0lHRUlEQ0NFQUZKREBKTEpPW2NZX15hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXl5jYWBiYmJjY2VaUVlWVVxZXWNgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtHQ0dFQkVHSEZHSElGR0pHSEZIS0lMRERLS05NTExISkpISkc/R0ZOS0tLTUtLS0lHR0NEQERBSElCP0lKSE9dYVpbZF1fVFFTWF1cXFxfWktXXExSXFlJTV5QT1xfYWNkY2NiXGRjYmRjZlhRVVRTW1haYV5eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhYaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktJRkZHSUdHSUZGRklMSk5FREtKTE5KTElLSkhJR0JISFFNS0tPTEtLSUhHRUQ/RUNISEFBR0ZFVF1ZXlhfWV9bXVVYWFBdXVFLSldeWF5bXVZaYFJRX19iYmFgYmJgY2JhZGRiWE9RUVJbU1tdXV1dX19fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIQ1JLRkhISEVGS0pNUEVHSUpLTkxMSUxLSUlIREhLUU9NTVBMTUtLSElDREFFREhHQkFHRUNXVUVcVF1TVl9YTlRVTlpbTUpLVWBhW19YX15hXU9ZYl1gYF9iY2JdYWJXX19UUE5QUVhSXVtbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERUZHRElSYlBEV19JR0dIREZNSlBQRkpJSktOTEtLTUxKSkdFSk1RUU5OT01OTE5IS0FEQUNERkRDQUVGQk1IQ0xMUE9PTEZNRkdJSkhHTExNT1BJTE9QUFNQTFBUU1VaWVdZWFhkV09TVFBQT05QVVRbWFlaXVxgYWRlY2dja2xwc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdIWU1HSEpIR05MUVFJTEpLS05OVU5PS0tMR0dLUFNTTlBPTk9OT0hLRWBFRF9MRGZjRU1bSV9cc21PTVZtWUxDUGBVbFdnSl1XVV5ETVFVTE1UVlFTVFhXVFhVVFxVUGZaaGhkWFNrU1ZWVVtcW2BgYWJiYmBmaGZubGhyenx9foGEhISDg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1NJS0ZgVEhKT0pJT01SUUtMS0xPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpQf1FJfFlZcnNYUG1IcW5wYVZQcXFzUEJrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtgVlVXf2p0dXVfYHdgWGFcXGZbX2FhYWFeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMRkpMRlFWTEtPSUtSWFdRTk5OTFFUTk9RUEtMT0dNUFNbWlRRUU9QUFBKSFp4XVR4ZWhZUlRRdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvcIFdZnp1eHFxenF+c31rdX1iUmd8ZXNzb3NzfH1vfXlvf3JfYGBiYlpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1IS0tISlBPTU1KTlZeWVVMUVNOWFpMU1NSTkxQSVFSVFlXV1FUUFBQUUtIZnhsY3hybVpLTVV5cHVtdWJudlBkZUlmdnFtd2+AamZ4eGlYc1Jpe21panp6fmx4en9vZ29YdnZqdXVwgGBzaHxpbHh8b19fX2NiWl5jZGZpamRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdXpufH15eHJuTktTdE5DQkVQUEhKS0pMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBJU1RVWFdXT1VQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGh4fXhgeXtzbmFebW9kUmdydW5teXB3bHZ0dHFsbVx0fnprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZmVeYWJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRyb21MTFtWSEdFR1JQSkxNS0xRUVFQUFFXXFlVTlZZVWZYUlJZXlRNTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVS1draH1sbWx4YFtwenteYHpzY3JveHFoZXxpcntdVEtsYHZ1a2l1e3ttfnhrfHBdXl5iW15iZGRnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3Nya2htbXJ8a21oa3t0bW1rbU9ISktISUlIUlBMTk9MS1NTU09TUldSVlRQV1pWVlRUVGFgUU9OS1RTU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWFFOUFVUWFhYW1tVUlNXW1dYV1pPU1VXV1hSXVlXXVZUT1lSV1dXWFlfW2dyXltbWVxdX2NaX2NjZGZkY2NiWmNjZmZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLS0xNS0pTUU1RUE9MVlZUUFRVWFVZVVJaXVZVVFdVWVhQT0xNVlRRTlVTTk9NTFFPSklRUktRTUtLT1JUUlFRU1NJSExOT1FSUVFRVFZSWFdcV1NTUVJVVVZTWlFPU1JXVlRZVlRZVVRSVVRUVFdYV11aXmFdXFpaXFxgY1xdYmNkZ2VlZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRkZmhQSktMT09MTVRQTlNRUU1YWFVUVVdXV1pWVFxgVldWWVVYVFFQS09XU1BOVVBOUU5LU1BMTlVUTlFOTU5RU1BUUVNUVU5LTU9RVFRSUlFWV1VZWltZUlVSVFdXV1lbVE9UVVhVVVpVV1lVUlJYVlVXW1laX11VWV5cXl1cXWBhXltiYmNoZmVkYlhfYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl1dY2hrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVtaWFdYWlpYWFZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBQTk1RUU9RWFRSUU9NT1NWTldSVFVVT05NUVNVVVRUUlRYVlpdXFpWVlFSV1hWW1tXUVRWVlZWWVRYV1RTUlhWVVpdWV1fXlZeXV5gXFxgX19fWmJiZGhoZWRhWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJST1NUUVBVXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTFBTUVVaVVRQUExQV1ZSV1NTU1hNT1BSVFhVVVVTVVlYW15dW1tWUk9VVlZbW1dRVFdWV1hWVFhaVFNSWldWXF5aX19gVWFcYWFdYGJfXGBdY2FjZ2lkZWBZY2BhX19lZV9gY1taXFtcWVpZWVdcWVxbYF5gW15eYWBfYlxZYFpRTk9OVlFQVFFPVVRTUFdcXFxYXlxfV1xeanF3eYBjXFtWVlhSTk9XU05RUVBSVFJLUVRUWVpXVU9STlNYVlRTVFJSWk9RU1NWW1ZWV1RWWlhdXlxcXlZTTlRVVlxcVlJUVlZYWVNUWVxUUlJdWFpdXlxgYWBXYltjYl5hY19cYmFiX2RnamRmXltkYGFgYWNlX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVUlJXUlRQW11eXVtgXGBVXF1panJ9c2xnXFVZV1FPUltTUlFUUlRVVEtRV1ZbWVpTT1NSVlZVU09WUlNaUlRVVFhdV1hYU1hcWF5dWVpdVVVOVldXXltYUVRVWVlZVVdZW1RTVl5ZXV1gXWJjX1lgW2ViX2RkXl5jY2FdZWdqZGZeXmRhYGFiY2RfYl5YWl9bXFtYWFhYV1taXGBdW1tcW1haW15WXlldUE9PUlpQWlRVVlZTVFReXmBeXmJcYVVdXmJreXRsfWxaVVpVUVFTXFRVVFZUVllXTFJaVl1bXFJPVVNYV1ZTUFhSU1dTVlVVW11YW1lVWl5YX15ZXFlSV1JZWFlfWlpTVFZaWVpWWFlcVlVaXlxeYGFfZGRdXl1dZWFiZmReXmRjYFxnZWhlZGJfZGFgYWBiYl9gXldYXlpcXFpZWVdWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9gYWFgY11gVV1eYmVldYF6aFhZWlRWU1ZcWFdXVlZXXVhQVVxZXl1dVFJYUldWVFJUWFJTVlRYWFhdXlhdW1VeX1hfX1hdVlFZVFlaWmFZXFVWWFtaWlhZWVpYVl1eX15jYmFlZVxiXGBmYmRmZF9fZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWVtcW1lbWVldW1tbWFhZW1laWl1fXVRZXVVOU1pWU1xUVldZV1ZcYGFiY2FkX19WW2BkYV96dW9oWVxaVVdVV1taWVxZWFlgV1BVXltgYVxUVVhQVVdVU1ZWUlNVVlpaXF9eWl9cVl9fWl1eWV5WU1lXWVpdYlpeVldbXFtcW1tZWllZXl9gYGRiY2VlYmRaYmZjZ2ZlXmFiYGNeY2NpZGRnX2deYmJjYWFgXl9YVFpaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU1BWWlZWWlVYVVhXWF1fYmFkYWRhXllZYWRiYGxmaF5cXVtWV1hZXFxcX1tZW2JWVFdeXWFjXFJWWFFXVldWVlZTVlRYXFxeYGBdYV1XYV5bXlxbXlhWWFhbW19gXF9YWV1cXV5eXFpcWFtfYV5gZGNkZmZmYlljZWVoZ2ReY2BfZWNdZmlkZWlfZl5jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOUldZVldaWVtcWVdZXmBiYWRhZGFdXllhY2JfYWBhX1xcXVhXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFdWWFlZV1ZXVlxdXmBhYF9iXllhXV1eWV1dWVhWV1tcYF9dX1paXl1eXmFcW1taW19hXmJkY2VmZWZiWmRmZ2lnY19jXmFmZVppaWJmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWFdaW1pZV1hWVVtdXV1gYGJieExXV1xZV11cXF1aV1xdX2BiZGJiYV1gWGJjYmBjYWJeXFxcWFdbXV9dYF9dW2BkXFxYWmNlY2BSXFlPWFdZW1pZWFpZYF1gYmJgYWNfXGJdX11bXl5ZWVVYXV5fYF9fXFpeXmBiY1xcWFtdYGJhY2VkZ2VlZmRcZWZoaWZjYmJcY2dgXGlpYmhpZmVgYmFjYV9gX11dW1lcWVhXWFlYV1xbWldXWFBYWl1hY2Zmcmt/SllXXVpaX11cXlxZXVteX2FjYmFhXWJbYmRiYGNjYl1cW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlFYV1xdXFtaW1tjYGNiY2BiZGFgY15gXF5eX1pYVltfXl1hYV9dW2BhYmViX11UXF9gY2RkZmRnZmVmZV5lZmhoZ2RkYFtmZ15haGhjaGhmY2BiYGNiX19fXV1cWltZWFhYVlpWXFpaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYOBg4OCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnV1dXV1dXV2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3x8fHx8fHt7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dXR1dXV1dHV2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t8fX19fXx8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHjF1NLS0tLUk3t9fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYmJjY2NjY2NkEYoKysrKiVjkoyMjY2OiX5/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19eNXn5OTk5OeZe39/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjIyPkJCQkJCUOxYbGxsbFF2Wj4+QkJCLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12fn9/f39/f3l3d3d3d3d4eXl5eXl7eG5vb29wcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fX19fX19fX12c3Nzc3NzeX19fX19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ0dHR0dHd0dnd6e3h7eHd2eHt5e3p5fXl4eHl4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3p6enx9fX19fX18e3t7e3t8fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fH1+ent9e3d3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d5fXx8fX58d3h4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3d3x5eXt9fnx4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6f3t8fHx+e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl8e3t6eXx4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYKBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJyc3KDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN1c3N0dnN0c3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3d3Z6f3x+fnx2dnd3dnV4enh4eHh3d3d2eH2DeoaIeXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eHh5eXl4enp6enp6e3t7fH1+fHt7ent8e5J/jJJ5e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx7fn18moWQmn9+fX9/f3x8fYCDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gICBgIB/foCCgYGih5OfhYB/f4CBf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiIaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn6AgICAg6aJlqKHfn9+fn59fn9/fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6MiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+f4B/f3+EqIyUo4l+gIB+fn5/gIB/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KSkIqKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGBgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYGBgoKBf4WpkZCiiX6BgX9/f3+AgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKFhYODlqujoaCHgYKCgoOCg4KDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBgIOEgY2sqauwpZKHh4aJiIeIh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqHgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4KDhYSEgYKCm6idpaqgoIuGiZOLiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChIuKhIWknZSgopehlYORmIaFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKCh5eSg5mXjpyfl56ZkZ2SgIGAf4GAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI2Dk6mYlJaQoKaXmJ6hnIt/gH9/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOKl4iHnqupn5qhq5aZn52Zh4KBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWGhISDg4OChI6Zi4SPoKKgnJ+jmZydnJOEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBj4yDgX9+fXx9jJyPgYeRkpOWnJmbnJqTg4KDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GWl4mAfX19fXyCl4uBg4ONkJOXl5yfmYmBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioeDg4OEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgJWfi35/gH2Hi36EhIOEgomOko6JjpyUg4OCgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkaGKgIuFfYaJgX+GhYWFhoeDfn59g4eEhIODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOKkYOEi4WDgoF/foKHhoSBf3+AgICAgISEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYmBf39+foWCgICAgICAgH+BgYSFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHhoeGhoaGhoaGhYSDhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhYV/f35/gH+AgICAgICAgIGAf4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEg4GAgIGNiIGAgYKCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiYqLioqIiIeIiIiHh4iHh4iGh4aEg4OFh4eHhoWFhISEhYWEhYWGhISEhYWFhoWGhYOJlJOQj5COioaFhoWDgYGBgYKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICBhISCgoKCgoKCgH9+fX19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SEgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCg4OFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fn5+fn5+fn1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4aJiYODhIOFhISFhYaIiIaFg4KCg4WHhoeGhoSDgoOEgoOEhIKBgYGBgYODhIODkZKQjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCgoF9fH1/gH5+fn59fH19fHl8g4aHh4SDgoODhIWFhYODhYSEhISEhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gn9/gYODg4ODgoJ/fX1/gICBf31+fn19fX17enp+hISEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4SAf4CAgoOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYOChIKBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fYCCg4OCg4KDgn19fn+AgIGAfn19fX19fXx6enqAgoKBf39/f35/f4B+fYB/f4CAgX+AgIGAf4CBgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoODg4SFgIB/fH19fn19foCAf31/fn1+gYODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgH9+f39+fn1+f35/gH9+f3+Af4CAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEhIKCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXuAgH9/f39+fn5+foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+fn18fH2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6enl5eX2BgICBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5/foGAgoF/f39/gIB/f4B/gYB+f4CAfn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSDgoGBgYGCg4OCg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19e3p5eXl5eYCCgoKEg4GCgoF/gYCBgYGDgoKDgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKDgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIKDf4OMhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYOCg4OCg4OCgoKCg4OCgpKQi4iJh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoaHh4eGh4V/fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYOFhYaGhIOFhYOFhIODhIOEhISIko6MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GCgYOCgH59fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX99f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYGEkpGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgoKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+fn6Agnx8f3+CgIKAfnx7ioJ9gH9+gYCAgIKBgoCBgYGAf4uUj4yLjo6NiIeHhYWFhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gn+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6BlJGMjI2OjoqFhoaFhISFg4ODgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYyNjo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEg4CAgX1+fX5/foyEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6Eko2MjI+Ni4mGhIaEhISDg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+Af35/f35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn1+fHt8fHx6e3p9f4CAg4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIuQjYyLjYyKh4SEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+Af4GBgH99gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f39/f39/gYKAfn6BgIB/f39+f39+fYN8fH19fH99fX19e3x+fn9+fn5/fnx8fHx8fXx+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7fH16fX5+f4CAg4eJiYmKiIqJhYiRjoyIiYeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn9+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f3+Af358enx9fX59fX5+jIZ9fX58e4OCfX19fH18fX19fH1+fH17fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4uJjZGOjYmIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSDgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX59fX59fHx8fn18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/g4OEh4mKiImOkI2LiIiFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKBgICBg4KAf4F/fX6Afnx/f4mCf36CkISEg4F/fn18jYd9fX59fXx/fnx9fXx9fX5+fX5/fH19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI6NioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoWFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+fn1+foB/fX19fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgICDgX+AgYSBfn6Af35+gH59fn6AgX+Bfn+Af39/gH99f39/f4CAfn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8e3x8e3t7fHt8fHx9fIqKiIiFhYWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBgH1/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHp8e3x9iYaGhYWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCgoKDhYOEg4KDhISEhIWEgYGAgH6AgoB+f36Bf35/f4B9foB9fX1+gH9/gYCBgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWDg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goR/g4KCgoKChIKBgYCAgoGAgIKCg4GBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GDgX+Ag4J/f4B/gX+Af3x7e3p8e3yCgH+Cf3+BgIKCgYF/fn+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6Afn5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fH9+f4B9f399fYGAgH59fYB/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/goCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSBhISFg4ODgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf3+BgoOBgYOCg4OFg399fX18e3x8eXp7en55fHl4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gIB/f35/f3x/f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5+f4CAgIB/gYKAgH9+gIF+f4CCgoCBg4KEhYaEgH59fHx8fHt5dnl5enl3eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fXd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX+AgIB/f39/fIB/f4GAgYCAf3yAf31+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn1/gX5+gIKBf4KDgoOFh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgIB7gH6AgH+BgYB/fYB+fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fXh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cnmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn2AgIGAf3+AgHyAf4B+f4GAf39+gX9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36BhIKCg4WFgoJ+fX17e3x8eXd8eXd4d3d4e3t7e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXJveHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH+Af31+fH1/gICAgH9/f35+fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9+f4B/f39/gH+AgICAgH+BgICBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoGAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fX6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgH9/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiXx8fnt7fnl6e3p7jn54d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l5e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGBgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYGAgICAgIGBgIGCgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8eHh2eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDgH+CgYSDg4SBgYOBgoKCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIJ/f4CCgH9/gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYKAgoKCgoCCgYGBgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIOBhoOEg4GChICEg4KCgICCgoSBgYKBhIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYCBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9f3p5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYKBgIGAgICBgoGEgH6Bg4J/foCDgoCBfoCCg4KAgYGBgoKDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChYaEgoODgoSChIOBg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgoOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGDg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIKEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYKBgICChIODgoGCgoGDgoKDg4SDg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfnp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgYSFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4GCgYGDgn+ChISDg4KEf4KEg4ODg4SDg4SCgIOEg4SDg4KCg4KChIOCg4SEhISEhIWEg4OEhYSFhIOBgoB9gYJ/fXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOAgoSEhYOCgoODg4GEg4GDg4SDg4SEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OGgoOCg4GCgYSDgoODhYODhIWEhYWHh4aHhYWEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIKBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhIWCh4aGhIWEhIWEhYSEhISDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOFgH2BdYF5g39/f36EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOAhIOAf319fn5+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhIWFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg36Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnOEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW53bHB5bHV9f399foGAgX2Af32Af4B/fX18fH19fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gYB/e39+fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBf4B+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLiYWEhoeHhYOFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+g3SIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f359foGAfn6BgoCAgYSHhoODhoSFhIaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhYWDhYWEhoaGhoaFg3iLeXKIentwcIWFeIV4eWtzfnl7a3KDh4N6fG17eXl0foB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgYF+fn99fXp9e3x9fX9/fX1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhYWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeHhoOHhoWFg4SGhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIaHhoSEhYaEhX13hYSEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaGhYaGhYODhYWGhYWDhYSEhIWEhYWEhYWDhoaGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/fHt8fnt8fH1/fnx8fn2Af31/gH5+gH99fXyAfX5/fn5+fnx9fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIaGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoiFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWFhYOGhoWGhYWGhoWEhIWFg4SHhYOCgoWDhIF+gIB8e31+e3x7fn59e3x+fX5+fX9+fX1+fn19fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGh4aGhISGhoeGiIaEhYWGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaIh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoSBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDg4eDhIGChISDgYCAgHt7fn18fHx+fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoWGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhYeGh4WHhoiIh4eFh4eHhoaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WFhYeFhIOEg4ODh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH57fHx7fHx8fXt7e318e358e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeGh4eGhoeHhYeGiIiHhoWHh4eGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXt7e3p7fHx8e3t7fnt8fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiIqHhYeGh4eIh4WIhYaHiIaGh4eGh4eIiIeFhoeGh4WFh4OEhoWEhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOGhYOBg4KAg4WCg36BgYF/g4F/fn5/fn58fH1/fXt9fXx9enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhYWEhIOEgoCDgYWCgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHioeDh4WGhoiGhYeEhoeJhoaIiIeHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCDg4KCfYGBgH6DgX5/f4B8f3x9fX59e319fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIGBhYKAgH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4aHiImGhYiHiIeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIaGhoaFhoODg4WBgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIWFiIeJh4aFhYWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWGgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+gIKCfX5/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhIWGh4iHhYWIhomHhYSEhIKFg4SGgoOFhIWGhIeGhYWFhoOEhYSFhoWGhIOEhYWDhYWBgIODf35/gH9/gIN/e4B9fX+CfoCBfX6Bfn5+fX1/e398e3p5enp5ent8eXp6ent7fHp7e3t7fX59fYB9fXx8fYB/fXyGg4WGhoaGg4SDhYKFgYGAf3+AgH5/gYJ8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYWHhoaEhYeFh4WGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SFhYWDhIODhIKEhIB/goJ+fX5/fn5/hH57f3x8gIF9gYB9foN8fn59fX57fnx7enl6enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIWFhIGDgoOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt6enp5enp6e3x5e317e35/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dXU1NXV1NTU1NTV1dXV1dXV1dTU1dXV1dXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8rKy8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19XV1dTU1NTV1dXV1dXV1djY19fX19jX19fX19bX2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLrR09PT09PT09PT1NTU1ce3ubm4uLi4uLi4uLi5sIqKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QT0+QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uzr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6Knz9PS0tLS0tLS0tLS0tS9oKOjo6Ojo6Ojo6OjpZVTUlNTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzR0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSjqM/T0tLS0tLS0tLS0tLVvqKlpaSkpKSkpKSkpKaXV1dXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs8PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183N0NLS0tLS0tLS0dHR0dDc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqazP09LS0tLS0tLT09PT1cCmqKipqampqampqamrnmJhYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc7Ozs7Ozs7Ozc3Nzc3Nzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Oz87Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS1NXV1dXV1dXV1NPT09TT0tLS0tLS0tLS0tLS0tHNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7O09TQz87Q09DO0tTV1NDPz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dTU1NTU1NbW1tbW1tbW1tbW19fW2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O0KaSxdHSuY++1JyChIrGz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A9Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0qqdrJTNwZSwnLGWuLmvodLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD5BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MmXmYWlsKagi5HDk31+r7DRzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PTo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RpLC9mJuch5261NLNnp7D0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9DVuZqYnZCfoNLTwKCg0M/Pz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/Q0ZqgoayvkaG516+iqdTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1aeko7uemq2bqdijobrU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0sCdosvFlqbFmKLRnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09SkoI+4y5ucm5utx5+h0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocjGpr2Vkaqpq6SexbSkptbS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xBPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDUyo6Tl5Cnz5KQp9e5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZHS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tTCr7Cz0NXLvdXS0cLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR1NbW1tPS09XT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKhoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ6dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5ibmpmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXmp2YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OkoqGgnpuZmZiZmZmZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGhoZ+enJuampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5qbm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpuampucnZybm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuamZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmZqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZibnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSSi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfomQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkJWcmp2eqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVVYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2boqGVkJugpKOak42IiIuJkZGOko6LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqqmvoZufoaOjoJqeoJyUjZiUmKCgoaSem5qlp6Spq6+spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq+qqqukoaKkqaemqaijop2bm6ShpaijoJidmJ+hoqmnoKKirqyrqqetr6ilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6WnqaepqKOnppmcpKaioaGhoaCemZmfoKamo6Kenpafm5qioqChn6GiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1cUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnrKmkn6Kgoqahpq6mpp2fn5+gqp6ZnJuqpKGkn6GbnJqcoJ6hn56eoKOZlpuYpKKipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nec19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuwqaiqqKGfoKeprbCyr6yjoqahqrKhpKKjq6KlpKKlo56doJ6fpaKinp+imJWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1pgX1pcVlxoZG5jbmppYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7e1pLKxsJuip56io6ObnZyXoqiloZ+eo5udoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ5amJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbO4sp62tLl/naqkop+gl5Wal6SqpqahpKOkq6almaGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh1a3FoaWlhWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLG0tbW8vL68vL7Guri3ur20sKyTsbu5a4+4sqqmpp+YpKSnqKSupKurtbWvs6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllUYWlgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGwsO5vb/AwL2/xL28ur2+s6mlh67Bt2F6vsCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmtjYm53dXZubFtiUVZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrCvnoCtvLJeabbDuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWttZm51cXJ1cWdeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K1u5R9qrWlXmGgvLuxoJuxr6ykrK60p6qpqKqtrKmmpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtsbmRvbWlxeG55aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7y7vsS+xcjGxsTEw7i0wLe0vMHCucGHe7PFomFhhrm7tqybo7ewpqy0tayupaSjqKSgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcnhzeWZmXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbJxb/DwMvNz8rGxMPDwcS+uL7Bw8G6fXy/1aZkYnKxs7Sqn6e0sq6ruLWzrKmjoa2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWZpamhda29ueHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM7Pz8zDx8bIycjIycfFycfIx7/Fx8THsnR2vdekZWNmrrS3t8C+vrq9ury6vKytpqq7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3Zoaml0bXhsXWRbVmBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDOx8zJwsLHwsvLyMbMys7FxsXDyKpscLLXn2NjXrXEwcjMxsTBxMfBvL60sLCwwb6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW50Yl1iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDxL+/vsTLyMrLyby8yMfJzcjDyMnJxcXDwsKjZWmf0ppgYV6+z8fLzsS3v7/AwLu6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWZjamRiam1ub15ZXFZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucjJw8XEwMPBwsHDwsPBnGRjh8eeW15jxM3FyNDBrr2+uLm7u763tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWNkZGpiZ2NbWlpcWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tri0tLW/u72/ub66urTAuLW3sq66u7fAt7zK0sC7wMG8u8W9u8HExKNpZHi9o1tca8bFwMDJv7DBv7u4u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xY2BiY2hqZ2dpZWleVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS1sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB2YqywrvDtbrHt7a5u8CmdnJ3pp1oaYDGwL+7wb65xrzCwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F4cW1lZWZvaWVsaFhYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+80cZ2oMy9x7e5uK63tb6xnYWEgpOVe3+ZxcC/vr28v8nCx8i+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d8a25wZ3Brc2ZibWBcVElLSkRKQkNHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLi7sr2+u8S2tbi1t8C+xLzCxNitcnu2yc/CwLivtb6/oI6EfYeEj4GEmbDCwr++vbzHxsvKxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcmZsaW50bnhjZ2JcY1FLVEhFRUNIQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm9vLK8vrzFuLG4ur3HysnCyMnSlm9wqdLRzMrEtbvJr4h4cGV9eYVvc4CItcS+wbzAv7fKycXGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2NeYGFOSU0/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS7x9LCub68xL63vMG/yM/GyMrKwIRwcqLNy8vNysbFwZVwYllPbHN7V1hocpm/wcC/xKikyMTDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh6bW13e19wY1teX19UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy2u7iu3MK+tr7Avr20npSiq6+/vqN2dHei0MnLyMHDw6Z4XE1GQV9vcElFWGF9qsW/wbKImcjDwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem5zeHNncF1bXl1ZUkZEQ01JQUU9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8itbLHNvbW5wLykdmpnbGhvfJGUbnR5otHGyMG4v72HYkxCQTpUaGRFOk5YaJLDwLSQcp7Ivr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fXZsdXtwbmlbX2BZU1BBRkhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucDQqXKDtL22tb+ehGhZX15LUVpaa29yfaPNvrq5tL20eFBAUWVAS1xZRzlHU1x7vLmccmmsvLXBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdXZ3bnFgX2ZdW1RKPT8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnCy6CCdouisLORZmBlVVlfS0pNT1Nsc4Slx7uio624sIRFQHCWUUVSUUs6SlJVbKqhf2Rytq+yvLquu7Szpquorbq+uMvCv76sq7Cvs7u3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NhW15PSEI/PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3v8Wihnl1jaKOW1JBWFRHYW1ZU0dJY42jqsPGmYSQo7ClQkd7ml9CUFFOOVNaUmGLf2lfibelrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJtY11mWFxdUk5OQT5KQkFKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLjCsI5/eIeOaE5JQWtXQk91hZlwTUNWfbC70a56doKhpkZIaHdYQlhYWzxWY1Jab2hgX6GznqSnp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXRpbF1balRdXFBNSERGTEJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzuLOSjIiDd1VFQFSJVkpKU3WLf2JAWam5ssfPkmdsg4RLRlNVSWSRn6mel3tRVl5cV3Kvp6GdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K6p5iZlmhMP2CAak5JSU1nmn9WR1mturGv0rpyW2FkUUVQcJWppZ6anJ6fgVRQU1OUr5+nlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moq6ufpqObo5yVkIyPj5CTkJeVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/emN3bG5cUWhUUE5HUE1MQk9RQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyovcGppr1hQlyjfU9aSUthS1uJZm1zjq+1qbzSl1VPT1BuorCnnI+VkY6XnqKOU0lcpaSdqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqqxo6WonqCclZOQj5GQmJCWlZiXn5ibmZukmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV2fW1re2RoVVFjTUpIR09STUpORzxFQDwyPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoKvFwMmWTkJ2nWtRcUxQYWd3cF9ga4GZsLCuxrpdPmCUpZ6YkoyPlJWXl5ufpotQcqCemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWalpuXl5ihnpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eHxkeXlgYlJVYEhJSktTVElSUEw5P0E2Nzw2NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZykxsaGV1JNZJ9ebn11eVdRa2NeamdseI60r7TCf4Shn52ZlJeZmI+NkJSQi42QgYqhnZejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrC0qrKuopmcnZ6hmZubmpiZm5SWm5aZnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dnZzaIJsZVtTWlpNUUpPT1VMU0xBNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6Kan6qjj3lXc3VydGlfcm5YWV1eZGdZYl9orK6rsKijn6KglpCTm6CamJaRkp6boaWbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuK2ytKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCeo6GgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1and1XWxaUmBIUlVIRlVWSkJMRz1LSDhGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoKJ+b3tpYGNXTVtSVUhKT1VQR1JTSpmsqqmkn5+ZkpGTmJiWlZSLh4qNlJ2cnZ2el56Zpp+gqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6enpaSfnaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZybWl2bWhtXFhcQ1dOSkdNR0NGTTw+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqco5+ciF9WX2ZfVUxMRDo+PkJDPj5DU3ipramqpZ+en6KjnZ6dmpybk5KUk52dmJSFnZqgmqukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGxL3DvLezqbOtqrO1r7Ouqq+jnauntrGtorCmoaOvsa2wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeGgXt0cmtrdHJxaFZcUUZUSERKUEk/RUE0Rkg5NTs+Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+fk3tgYGZeTkRFPEpFSDw/OjZOfqqzp6OjoaCepaulnpeclJGZnZiUjIqGiIZ4bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvsfGwrfEysnDwca+urS6urW7t7C1sqq6sq67t7+7uqq4rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtjaG94a2VaW0ZLTEVEU01EQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2cmXtyaV9UTEQ+S2CCc2VCPVyOrqygmZubnp6Zl5eXkoyOlpeTjo2Qi4KDgndycW1wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXFzNHS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysLFxsbKyM6/yNHMx8bHxcG8w8G/v7+2vrOuv8DDw8fEx8Suv7iyuLzDwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxERVBJRENANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnpVoZFtTSENAQE2Qp7Ccg6CyraOenJ+al5aUkpSWkZCPjIeDg4iHg4CBgYB5cXJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19HX0tXW09TIzMbMzcnSzc7TzcXIysrBxsvHycjGv8Ozs8jEy8vLz8bKv76/vcHHxMzMyMnAw7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEE/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGbYFJLSERDQEZYttK8sq+mnJycoKShnZqUk5WUiX13cGtlYmhxb3F7hYqAdXBucXRwhbPDvsXR0NfW1tLWzdTW19TT0dPU1NPP0cPQ09bY1dbSy8nO0cvGzdLK0tXW2dXX09fYztLKz9HMz9DN09C/yMfKxMzMzM7PxcbHtr/Kv9LNzM/Gyci/xMPIzs3Q0c/NysjNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZHJiXVJcSUpHQUVJSj47QTg9NDU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpZ+ioVlJP0FDQUlTfLKtppmUl5+cmqCgnpucmZWJd2ljYF9fYF9eX19dYmx1dHBwb2xycXWSxMjG1NbX19fT1tDV1NrU1M7P1dTU0dHM0c3T19bT1dDP0tPRydPRyNDX19jR19LY2dTWzM/Pys3Sy87QwcbDyMbOzdHR0snMzcDKzMbTz8zOyMTKx8fIzMrU1NHVz9LM08K5xbGlqLWup5uorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52mrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqiho6tnQzk9Pkdag6unn5eVl5manJ+dmJyckn1wZWNiX19hX19hYF9gYF9gZm5wcG5rb3J3d5zMwdLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cXR1MrQ1NXWztLQ2NjX18vIzsTJz83KzMDKwMjKzc7Qy9DOzszOz8jL0NDLzsrCycfJzMvM0tPN09HR0NDKvci5sK67uLWqtrCtqLits767sZqPoJSRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVhFO0A9MzM8PDg3ODY1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcCwqaytqaSwektKRT9ajaGblZOXm56enpyTlpeUiGteXl5hZGJgYGBhYGBhXl9fXlxibXJvb3N0dnZ5pL7M1dHW1NPY1s7O1MvOzsXOytLSz8fOzc3Uy87TzcvX1tDM0dTLzNDS08rO0dXS1dXKwMrCxczCyMnDzMPFyMrKz8rNzNDN08vGyM/MyMfLxcbBxsrMzdDRxtDOzc3Mz8XHwbi5vcPDvcO5srK+sbvDxLWqmKWimZaRlZWSi5SNmpGUlI+PlIKJhnlxcmttZ2BgcGhZWGhWTEZMSVBRQjtDPjs2Nzo4Ojo1Nz09QDs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCta+0qKCuk3hydnuLlZqNjJeVkJORkZWWlZCLfGVhYmJgXV5hY2JgX19gYWFgX11bXWdycnFyc3BtcnmkxtPPy9DP09TKxcnJxsa/w8bPzsfFx83K0sjLzs7G0dLQzczUysfLzs/Ix8/Sy9HPxrrEv8bJvcLHyc7FwsjAx83IxMzKy8/IxMTQyMbCxsjEv8HHzMzMz8LKy8jHy9DExce7x8PIycLPwb28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3b3Rka2BeZnBhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68us3NxtDV1dna29jQyc/P0dPIwra7u62jtnxmg4OnrJOOjZaPhYODg4F9hIR+c2BbXl5eYF5gY2RjX1xdXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMvJyMrIwcXMxsjLzcnEwsrJwcLM0MXLyL+5wbvGyL6/xs/Lw7/Du8nHyLvIxsXKwL3Cy8bFxL7GvbzAw8XMxcW8wMrCxcfSxcDJv8rJxsjG0MPDxsOvxMvHxMq3v7y6tKmspKWYn5iso6Glm6Ogm5R7d3J0ZmlaYW5sWlxYUkRMRkJHRExERlNANTQzMzQ/PTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76xr7VrX3l/ppCKkpaGeoCFhX92eHVycF9bW11gYGJjZGRlZGBbXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKwtrqysrOyscK8vLy6uMHBwcW+vbm9v7nEysXGwr3GwLi7xMm/wcm7t7u7xsO/vMHNw8a+vrXBvcO6vca7wrqzvMXEwsK3v7W2vr+7zMO8tbrIur++y8TBxsLFycbJxtDGwszHssfJw87NwcXDwL2zt7Cyp6ioubClrbCqrayUenZ3amRnYGhvY1ZeWUpGSkZISkFFQkVJQDk6NjQ4ODU0Ozo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTW183Kz8XJxcfBucW9q62kX2V0h5OLiIuEeH+Ghn9+hHt0dGNcXF1eYGBiY2FhZGViXVxbXF5cXl1aW1xeaHNxbWdnbm9yeZ29zMDDusC4rrCxp6qtrKe4tLe0s7O0u7W+srewta+yvMK8wcS8wLu1srq+wLjHubS7tsHCvLi9xsHDu7Wvsra6v7TEt7u0q7i9vcC9sbq2sLa6s8W8tq67v7W3tMW8vsPFwMPFxsjLxcDGxrvHy8DPysfDxsLDt8O9vba5vse/rLW6tbe2jnl0eGdnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMrIysnKxNDN0s/NxcfBxcC/urfJtqqwmFtocYyPhYiJenh+hoZ3d4F8c2hdXV1dX2BfYGRhXmNlY19fXFteXF1eWlxbXV9scG5oZmttbnJ8pMe/ubi1sKutp56jqqeeq62zraqsqbSut7Gzqa6mrLO8urbDubq6sau1ubu0wrqwwLG+vLu2u8e5wratqqiwssC2uL2wsKeys7W7vKuutaautq+7srCqubCtu667uLvAwL65wr/Hw8XAvMbCyMq4xcfGv8fEw7rExsK7xsnMy7O5wr27s4lzdnZraWFibGhZWFdbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxdDHzcHDxr/ExMPDysLJyr/AvMG6s7S1w66psJFcan6Sh46Pe3h9iYV6e4SAd25eXVxcXV9gX19kY2FkY2JgX11aW1paXVpaWlpcZW5vaGZnaWtucYGtubC1rqalqKeaoKWhmpylrK6kqKKrqq2rsKSmn6qttbaxvbmvt6+orri0tLy4tLyvuLm1srzBssCupamjq7Gys6i9qquoq62ttLOmqK2hpK+psqanqK6mqLessbK3urq8sby9vr7Ev7XCwcfIt7/AxbfEw7+7v8TCvsTIzMq/vsTAwKmHc3RyamldYW9jV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcq+u8m2vcO+usq3wcPBtLa8trGvtbutqKuTZWyIg4eLgHt9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX11dXFpYWVtbWVhaXF9ma2ZkZ2Voam9yhamlq6WgnKKllJ6lm5iRoaOqo6Ogpaanpq2gnZykpq2ysLa3p7CsqKq0q7S6sba2rra6sq+6urG2paCkoKaxp6uouaqkp6eop7KtoKemn5ukpqyen6ekoKGxra2ssrSztLC1vLa7wcCyur7DwbK5ucOzwb2/tbi8vb+8wsfEw8O+wMSgg3hwbGJmX2tvYFVZXkhOZ09UR0VLRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9OjY2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItbW9uLrAur22oJ6VnaGmurars7O7s8TPycvCxri2x8DMv7jJt7vFuLPEuLO/wKy1vLKspa+zraGjkmlxhoWGgHx5dXNvbWpqaXBpXmBdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+Hnamgl5abopaco5mWjZ+ho6ecoKCkpaKnnpujm6CrsK2xtqOpqqqsrKS0ua23sKyzta6zta6wqp+en6SisqSmqbitoqamoKisq5mfoJ6ZnZ+lmpmjnJudr6mrp6qsrK2xsrivuLm7sLa8vLqrs7O5s760trKxtrW/tr7AvcPBu7u9l4R6c2xfZV5kZFhUV11JV1xLUEdJSkdBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8PDz766x7i4v7eywrSxu7yrubqxop6pq6eXnpBtfoWGf3hybW9ta2JeYWZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrcY2nnZSVlZuYm6KXlpGcoqKonpydpaeipZygoZuZrq6urrKgpqKuq6eitbGysqyor7OnurOmtqCin5yjoa2joqq1qqKjpp6lpqOWmZ6XmZudoJqXnZ2dnK2iq6ekpKatq7O0qrWws6uyubSvqq+ysrO4s66prK6yuLG7trq9v7ezsZSFeXVmXmVeW1lWU1pVS1tRS0lFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7OdpaOYpbHCtba9rbS4wszIxr/FtsHAxs63wMS9s7m5s7+2sbm7rLK0rZ6apKmflJqPeH+DhH94b3F0cWhlY2hkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oZyTlZCVl5egl5mVl6CeoZ2WoKGppJ+fqZ2cmqunr7Crm6OkuKqhoK6otqqnp62xpLiwpLego5uZmaqmoZqsuK+ioaScop+gk5ShlJaWm5iXlpeclZ+qnqmkop2jqqqwrqi0q6qnrbOwpauus7Gwr66vpqiosq2xtLC8tLm3rqOUgXl1ZF5hVllYU1JUS01eTE9LR0dMTEU9QT48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunaeoo6q7wL3Aua60uMHMx8XCw73FuMjLssHCwa28u7W7vLW5ubCvsKmbmaGolJGKi4CAfHdxaWxydHBoaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiY2RmaYGWk5aMkpSUm5mdlpacoJyflqCfp6akpqefnZ+moKqvpp+ipLeooaGiqLSipailsKWxrqy0nqGdlZWpoaKUrbGxn6KjnZ6Ym5OLoZSRk5iYk5eXmJeep5ynoaKapKWlq6SlsKelo6urraaprq+uq6iqqbOmpqyvtLGvvLWxr6+gknp3cmVhXFpdWE5MUkhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G4rJ6lp623u7zBxbqxubXEycnAw8bFx7bFxLLCv8Wrt7e9tr26urWyq6ynmJifo4uJdImIfnZuY2FmaWhmZ2lmam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZVU1VSVWBgX2BhX2FhY2VqgJSTipCOlJOUnZWWl6SZoJedoKWiraalpaOjopyqq6Wan6WxqqChnqWrnqiinq2sqamuraKiopWYo5uckKupsJygop+el5mTip6RjZKTlpCYmJScoaOdpKGilaCipKabo6uloqSqo6uupa6yqaalpqa0pqmorbO1tLm6r6msnoxycW9gW1dWVlJHUU9IWltPUkpUS1NMRUZJRDg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo8PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1ybyxvsPIrLG4wbW7wLu0tKqsppWam5yIgHKIg3t0aWlqbGdqa21ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXV5fX19iZG2OkISRh4+Rj5qTlZOcm6Ocm6GpqauorKeppqSZpa+llZmlr6qgnJmboJ6vmZyrs6Clpp+jpKGVk5uWlpKpqq2anJ+hoJuUkIyZjoyRjJGNlpWQnaKgo52co5WboKOhl6Koo6Koq6CrsKStt6WjpKKtraqoq6+zt7O+tbKrr5iFdHNoW1lZU1VSRVhMUVtYTVROUExQUUlOSUI9Pz9BPz03NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NjU3MDE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraeztq6oqK+um6morLe2rLzKu7a/rMvGxbjBzs/Is8S6t7vCyLCtuL+3vL27s7WmqaCWl5iXh3p0gHZ3bm1obW1tcGdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXVxeX2BkfoyBi3+LkIqSjZeRl5mioJugq6qmr6yosKWpmp+toJWWpKmonZiQj5qerpeYqKqZn52UpaGekpGSkZOVp6qlmpmZnp6WjYyLk4aJjYOPi5KVkaCeoaSYlZ+VmqGinpSbpaWnqKigsbGmsbynn6Ostauup7C1sLi1wLGtsauRfnJzYlZUVU5SSkdWUFJRTExXTUpMTlJHTUtBQ0ZEQz5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ylsbeqpaKxq52qp6mysaS2xrS5urPKxbm6wcvQyrG2uLu9wcOxr7G3rbSzu7OzoqOcnZeXlIN/d2tnbG5xbnFqcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen91iY2HkIqXiZSUmJuZnqmboKumpqyeqJqgppyTj5+jm5eXhYSSm6OQlaOdlpaWiKKbm5SLjoqQmqSnnJWVl5uRkoeUjouBi42AkIqSkpKgmqCilpSYmZWippmNmaSmqKahoLSyp7K3oZyit6yqraSysqa1vLWsq7GjiXlzbV1OUVFMT0NNTk5QS0ZOTkpKTk1RSE1KQUdLSEhDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLawpKekqqWgqKals6qissO1tbKzxsa3usPKzMazrLq9tLfAr62psJ6mrbqvrZ+Zmp2VlId7g25fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYW11hb3N2cISIgoiAkYSPi5SRlJ6hj5uco6KkmaWXopyVjYeZmoxzjYN+jpeWhpGakJSOjnuZj52Mgol/iZifo56Qk5iWhY2ClH5+dIqOepCHk5CQnZuampKWkJ2Oo6OOiZqgoaOkm6K0r6yvrZ+YpbimprGhsK6csLuqqa+qmYN3c2NWTVJPUE5DU05MUUxCUFFISU5STUhKSkRKTEZKSj03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3i3oaO0qKalqKOmpaemp7OnpbTBuLC0sMnEt7nBzsa9s6y6wautw62noaaSnaa2rKOfj5WWko9+eH5lV1ZfZ2ZpZ2huY2poZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVVllbXWlscmx/hXx0TlhykIOXh46dl4uUkZ+YnZWUlpWPlomAk4pfO1dvfIyUiYCMkoyQhoZzioWXgXmBe4aTnZODlY6RkIOGfZN4cXCFjX2JgZGNj5eamZOLkImdiJ+YiIeWnpqhoJenrqmtqaielq2zoqatmayrmKizoqmto5N+cm5gW05TUldMRFRKUExMRk5PSUVMUU1LT0pJTFBGSUk9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6moo6qwqKe0wbmwtbDHwrezvc+/ua+utcKnqsWpo52Yg5SbsKKZl4aUj4uHfXN1XVBMUlVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbW9pe4J0UUJAf5WSkn2JlY2Eio2bjpaViZKIhpWGeYl/YEpRbniLkoR9hI2KhX9/bn5/lHh1dniEjZlvUY2IioZ7fniUdmd3hoh9iomVi42RkpeMhIqIlYSajIKEkpqWnp2UpKOoqaWknpqwq6GkpJGmqpaiqpyipqiJdW1mXltIUVFTTUlVTVNJTEtPSUhGSk5MTVRLUVBPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7abo6edn6GvoaeopaeosK2qtry2t7ezwbu2p7rIuLaoqLW2qrK8pp6VjX+Jk6iWlYp+joOCfXhwblhNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amlcVY+JlIl0f4eBfIWMk4KSmouPe4aPgHaAeHNvdnB0jY6Ben6Kq4V5emh2e45wcm14gYuNknh6gHuAdnJykndodYSEhIV7lYqIio2LgH+Ei4yAlIN8gI+YlJyWkZ6dqZ6foJ2gqaWfnZiMp6SToaCWnp+kgHJoYVxdSldQUkhKWFJPSkxNUkpKSkxQSExRTFJUTUVIQTw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumaOimJyftKmvqaWtrLCyqr20sru4trq0sZ+3urKqnZ2sqaiyr6GakY2UgY6cjpF/doZ4fHZvb2lYS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedYN8eGZ3jZeYjY99aHmBdniAiZB9hJiSgXKHj3x3e29rfq18c5CKf3uGkoF9f3RmdnyGbG9oc32JjIiAbHlxfXFtdo9xaHGBfo5wQ4uEgoOFf3d3eouFfYx7dX6Oko+YipKam6OWmZ2anZ6hnJaNiqSbjp6XjpaYkHdvbWViWlhYVVFKU1VUT1BOUFZLTktOT0pRTkhPT0xGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagpq+srquoqbGvsau8uKy7vrmzrKebsKesm4+WnKWppKCXmY6FknmIjouKdXF8bXVwam1qWEtGR0VBQENESUxMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOT1FUWF1lcHJtiKeqwH51eWN8eG98eYiQen2Lhm9tjJJ5dHhqaoCCcZaRi4F+loBJk5huaHd+gmxpY2x5hZCShmtzbHxucnuGaW1wf3ONiYSGe31+e3ZvdHOFgnmBeXB8joyKlIOWl5iakJKVl5mXnZaMg4mekYuSjYaQloBvam5vblhWWFRSUVlPUlRUU1hVTU5ITktNTktDSE5HRT86ODk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WtsKOsqqi1r66stL+rvMK/pqKZlaSXno2Ei5ShoZiYkZOLc456gIaMhXRvdGtxbGRsallORUZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcYKeIYpppdHplf3Btf3qLiXaCiIZ0bJqRdHN8amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3F/fGhxcXxuk46PfHN9fHFwbnZtgn93eXVqeYmCiImElpKSkIuNkZSUjpeNgHmIl4iGioaAkIh3a2tvaGVYUVpXWVlbTVBVVllYTklIRUpKSEdCQEZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDU3NzU0NzhpTzg7NW6SiJqRmZakqK6esp+nu6+rsrDCsbvDx5qWj5SZi46GeYSQmJSNkIyPhnGHgnSHjIZ6cHJwb29kcGZfVEZJQz88Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7Ogcnx4bH1tcoOChYF6hIaGeXKhlXR4gHN1lIc1cZ2onY6hoYSihHZwhnyHfHOMrY2JgGdnYmpucm1wg3Vpb1h1cI6bkndsf3p9bXJucIB6c3ZuYnaDfoaAhZCQioqJkYuRjIuOg3V4io6AfoOAfY97cnBwbGBbXF5cWVhhX1JOW1pYV0xISkZKRz5CQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGTiJaRnaSnnq+VpbWqrrGuwbK7wcaWkIyUj4CIfW6BkJKJg4qHj4V1goRslYiIe3R4eGx3bndjaV5JUEc+QDc0NDk7Ozs9PkBCRUhMTExMTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx+hYN/jH52opl5foaBhZmEm5xhhqqfnYuDkI16d4h+iYiNc4qXkIN6XWRydHp8d4ptaGpieW+GkIJ6boF3dIR6cHR5d2tuaV13h3yHfIeHj3+LkpeDjYWMhn1xhH+DfXV3e3yJd3BzdGVnX1tbXlRcZ15XUVVYW1VHSkpETEc/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJKcnZ+mkaCroLGor8CxusW6lo6RlId6hXZrf4yRgn2KhI6MeIOAc6GEi319gX9wgH56Z3ZrUldMQEUyMTEzNjc2ODg6PD5BRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHJ8j4x6fYmHfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSSqIeAmJiKm3RtfIGGh32OaGdoeH9uhYeChXGEhkdsgHdyeXZobWtfd32DiX+IhYt6lZ2biYuIkX96dYt2fHhtb3d9f3R0cmxbXV1bY2NYZ2ZcVU9QVllQRExLRk5JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWIkY+WmJKXoZ2soaa4r7O8s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0+P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgISChZGTfoWIkYGalYKhoZiVm5qlrZOau7Gnu8fDqIuMoaWPlImBkXxxg56fkZx/doWFipCIkGlob4OAdIyHhItxhYJ3h397doV9bnZ1ZoCUj4aJiYeIh6GqopaJjph/eoKJenlvZ2t4fnp+cmpkXlpaXWpdYWZgWU9LTldSUUhQSkROR0NKREJARERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmeIN7gIyAgZGOipqbpJ2hrKarr7CXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46DgIGMi4KJjYN/iX9tcGpdQkE0LS0vLy4vMDIyMzQ3Nzg7PT9CREhKTlFSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZqPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyNoZ6ZhJOFgo+hn5OYkoSLhY+ZkZZscHWJi4KWjI2Pd4+EcW2FgYqWkYOFiHKIoZaHk4mOj5altambjZWig4eTg31/a2prfICBgXNhXWNeWmZrXGxrXldLR09TUU5NTEZJUENETUZBQ0VHQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCCcHWHcXaShn6XlpqVnp6cp6CplpOYnmdlpJp+hJKReYCSiJCSfYqEmJKRgoCAi42JhZCGhIiFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDU3Oz9DRU5QUlRQUVFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdnKilopmhl6KVnZ+onqiroKisqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqbmaeRkYmVopqaeHp+lJiSoZKWmIGUnnt3lZKrs4iNl599lJ6cjpOWmaSiprawnZGZqIiWj42BiGxzcnx/fHFoYFxgXmJnY2BoZ1tSRUpLUE9JSkxGRk1DSExGRkNCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdWBufWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImMioSShYOGiYGAhndfYlA0NjAtMS8sLjAwLy8uLjAwMTU+QUFNUVJTUFJTVVJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk5PUVlthpB3lYujp6q0vbikrqysp6i0q7C2srKtu7Gzvpyzw6y7ycu3w7+4paOwsqytqqOLlpiFpqago5eBppmNoqqopIiFlKShoKqhpKmPnLGLlaOnt7uboKOwk6Odo56RpKKrr62ztaKUpKqImYmSipV5en6FfmdgaFxlYl1kY19mZl9aT0NJSFRPRkhMRkpHRUZIQUtGQ0ZGQTo4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gZOFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkY+DhYCLhYaHkoaChImGiIeHcW5hQEU2NDwyLzExMC0sKy0xLi0zP0RBTVVRUlNVVVdVTltQR0dFPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qxwcfDqrPFtqyzv7O4vra/tMG2u7ukuMaotsnHtb65tKijtK2xsZuZkpqfiaivq6WUdp+kl6GrsbOZlqqtqK62u7K6rK+1orGssbW8t7WutaCnp6OomqmwrbK6uLinm7apjKWOkZOfhniCg3VZYWRWZWFhY2BhZl9bVEpERUxVUUhJSkRJR0VBQEBLREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtaUWNkV3l1cYGUfYWHk3aFf4CMe7+7o7yCtJSTjZuPhIiPkomJeYaAjJONh4SBjn+BiY6GgIaJhYqHkXp4bl1WQEVNPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcVk9eVUlLSkFAPkdLRkVEOz5AN0Q3P0JKSkVGV1RQXo+lrqOxtMO2uMHMyba7xL2zs8C3t8G1v7C3dLGzprrFpLDGubGzsbSopLW2qrGgoZabopKlsK6mraunpJigrLO6oqmyurS7vsy/xcW9vbPCt7q4v7e6t7msrLCmsaqtvrC9u8LCrJm6qJSuj5eXq4l9gnxqV2JhV2plamVXW2RZVlRJR0dMUUdDSElBSEQ+P0JCS0BATUM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1RZVVp2anB/j4SBjoRuenN5h2K4oZmjiZWTlpOUk42QlpKHhnuGgY2WioGEgYp6fIqHhnyKg4GKg5V9eHp1ZU9cZEdFTDpRY2FbXlNGPztIUERaY1FRWVhaZ1lUYGBNU1BFQT9JSkhFRkFAQzxFNkI+SEdKTFNaVF2Tr7i1urnJv7q9ycy7vMG8t7W7u7e9tLqxxmF1sqWxmp6qvaqlqKuqo6KytaGrqJ6Vlp+Yn66lp6aln6OUoqaxtKeysr22wb3TycrTxsLFy8HKw8C+vb+7vLe0sLm3tsO6xb3DyLCeuaqiq46lqLaJgH9xX2JiXVdhX2hmUlhhVlJVSUVFTktBPkdEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdZ2xscZCNhZBzbHJyc4jVwLWZoI2VmJmRjpeSlpaOhod9hoOMlop/g3+DeHuLg4d7i3mBioKXf3R9emtlcHVZXVxQZWViYGVkXVtYV1xNZG1VUm1tX25fWGdlVVlVS0RBS0tIRklISEdCSTlEP0hLVFRWXFpbkrnAub23xsC6uMrLure6tri5sre1tK62tplkdaicrXBeoa2cmKCim6SeqqWUoJ+QlI6WmJeon6WfnpqahKSdrKWqsKy3sL251NHP18/JzNHMz87KxsC+wsq9wbzBwMTExcq/yM60pLuwtK+bq7m8mn95bF1gXFleYVljY1FcYFNQS0NCRUdFPEBFPkJIQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpX3CXkpCUb2xvdXWHs6yhoZ+LmZyZjI2VkZuShYqKfoiHjJCLiXyBhHN7ioOFe4l0gYmGlX9ze3hrbXV7aHJlaWxpZmppaGBmaWhsWm50l62kvIiHZ1tvaF1aWlRIS05PSktRS1RRSExBSkdLUF9eYmZpYZe3x7C5s7u+tbHEx7WwubCwu6uysaeqt6yNtqedm6eaT5qdjI6glpGmmKWVipOTiZCJj5GRnpuhl5qVloeemqabrK+or6eztNTU1NbSy8/U1c7Tz83FwsnQv8rJysnSx8zNwtDSuLDDvMS5pba6xKKCbmNcXF5YYVhZZVpRXVdPT0JCSEVCSTtBRD5BRz8/Qjc7Qz5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVdzkJCYgmhxb3l5g6CqnqaXjJubl4uOlZGajn2Ji4WOioqLkId8hIJwf4iBhnuHcoOSi49+cXh1a3F4fnF7bXhzbGmBcG1jaW5weGl3fH7Lv8Lfp21jeG5jW2FgSlBSVU5ZXlBeXU1QTlRRVVRcbm52gnKXrbistKewtqusvMCxq7WmpLimq66hq7SjjrGumpiYjJGTkYSOm4GNp5KciYOLhIqJhIuDk5WYl5ObkZyYmZmenquspKehrK3P0tXRzczS09TQ1NHOyMPU0cjN0tPT183S0cXS1sXAzsfHw6i+t9Ceem5lXWJdV2BTXVtPUFRQTkg+QUZBQkU8QEI+RUQ+QD86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYaFindsd3B9fn+hnp6hi42Zk5OMjJOPloV5hY+QjYuKiJGHf4J7cn6AgYd5hHWFk5GJf292cmtzfHt3fHOBd3FrgHNyaG9xenlye77Lm36MsoN2coR2aGFqXUNaWltXZmRYZWtTWF1dYGReY3h7fouBmaqkpKGgoaimqrC4qqW0o6GtoaOtoqexn4mmmpSSkYmRjoiBlIlrlaKNmYSAhX2Rg4OTlq2LlY2VmY6FkpCdl6ewoaChpKSoyM7PyMLL0dTR1NPO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsxMPLi3NvYmBfWFRaU1xQSkdJSUpAOzo7RUJEPEJEPkhCP0JDOzs5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnZWdlIWLlomPioiOh49/eISUmYqNiIiLiX6CeHN7fYOHd396h5GWgINueHBtdX92eH50hXx5bYd2dG59doR1eXudtow8QYvGpX6NfGllVklDZmNlY2hqZG94W19maWtuaW6Ag4mRi52eoJ2Ql5ifo6SmsqSks6ChpZ2gqaCisZyGnpKSkpCLjouGg5CEfpybjI2DhIV6lH6CqZWjjJKKl5KLfZeKmpGqs5iam6ecp73Dxrm2xs3S0NLQzNLLydTO0NXa19fY1NnYzdjbzsna2tLVv8vMtHh2bmRdWVJWUVpWRkdKSkVFPTo3OUBBQjpIREBFQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYXFxc4aNfJeRnYt+h5KCiYaFioGHfHiFlpaIj4OHhYd6hHlxenuEhnV6hY6NnXqMcHxvb3p/cXyBcYOHgW6OenV3fXyCdX98h4iwdFmpwraMkoJwbmI9XmhycHFwbnh3gWVpb3J1eHJ7i4eOlJKblaCVh4yTm6Cbn6qfoK2coZqZn6Wen6yZi5qMkZGNhH2Ih4OFi46gmZOIhId+bZl5hJiGiJOMjpSMhnubiJOPrqqUlZeemKeutb2prb3Gy8jJzMvPyMPRytTW2dfY19Tb19PZ29bP29rR1snUy5V5e2hoW1lQUlReSENFSUk+QT49Nzo9Pzs+SD0/QUFBREE+Pjo4NkRCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJma3aAiHGRkJqAeoCNfoKCgYR+g3x8hJeOh4t+hoaAd4J5bnt7h4F1epKejaB2j3WCdHWBfXSAhG+Bj4JvkoR0fIGFenaGe4m3xqXCybeBlpuPd3BlTmZjgXqBd4aikIt4eXd7g398hHZulJaUlY+YkIOKj5aal5emnJegl5+TkpejnZmrlpGQio2RgoyFiYiBhZCRnpyZiYWLgYaYeomJn5ePiI6Ki4J8oYmQi7yhmJOXmpyppqWun6i1vsDAucfJzc7FzcrR1tbV2dXX29TX2drb19va2djO3MaGenlnaGVgVFdWVU1LRE5EOzw9PDk6PD45PUA2PT9APD8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6i3x+gH5/fIV7foGRiYSFeoSIe3V9dG58fYZ+dH6SnZGeg5J8hn54jn15iopugpqAdJiFfoGJhXx+kHqPqY+Qw6C8jJyjnH2JhH2Jc4yKfnOmmpyYlIV7j5CJhGhHcaGknYyLkJKFiYuQkpWPnZqTlZGXjYyVn52UoZSSjo2Qi36Qjo6LhIiSlpqfn4mMlJKekYKLgKaZiISOg4aEgKWGiou4mJ2RlZaip6Gdnp2jrra6tau/xsrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19y3eHh3a2lkV2BbVFBPSERMQj09Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYGOinFyeYp7en98f3uIe3x7i4eCfnWDhnlzenNtgX6FfXeFm6GbnZSSgIuIf5iHgJySboeohXqgi3yRjoOIhJx+mpGKjaOin5CkrqCLkYuFi4GShldyrYufq5uPg5ibkJCOXIKikYKMn5OVjIeIjJKTjJSUlI+Mj4qIlpudj5WWkYuSlIaAi4iSjYmKnJaZo6OGkp2WoYuKiI6ckIOIj4CDh4WkhoyQs5idkpSXoaGemZKcnqexuKylvMLHzcfGz8zPzM7Xz9HUrtbV2NrY2trX1tnan298dGdnXF1YU1dYQ0BJRD4+Pjo0OTo7Nzo7OjM7Oz89Pjc7OToxOUc9OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bWJ+koNvbXeLeHl/eoF8hnx7d4aEf3NwhYJ6dXZ2dISDhX1/kqajn6Wilomdj5SXi4qol3KKso2Ep5GEmZOFmYuilqCYk4mbnaGSqa+fkZSQjY2IlYtujbeFmsTIspyhpZucmJaRspFkpM3Hlo+Fh4mQko2Nk5SKhYqKhpaam4+QlJOGlZeEf4+LmYiNkKqXl6SjiJmelpuJj4eXl4qEj42Bf4ePpYmNk6mal5OWmaGZn5mTnZujs7Slo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoJyf2hjX11eTkpUWkJBR0Q7QT04Mzc7PDo4PTY0OTo8OjgyPzk6MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PjpFTUZIUldTUkJjgUZ1go99fG1+iHh6fnqBgYN+dnaAg3xsbot/eXx4eHyEh4t9iqOzp6OqsqGWp5+lpJaVrqKDkLiVkrOZjaGgjKWbr6OknZiQp5anma2vpJeUlpSQi5iZlqDAjqTJuKuboqatmJGbnLKdhoWoopyYhYiJjpWNi5OPiIGGh4iTmJSMi5OThpSYhoSRkJx0kZmzlpeloYicmZOPipCLl5qJipaOhn2MmJ6JkJCcmpmTmJiglKCdlZ+bobGuoqS3vrTFx8S9w8O/xs3KydKnzs3T0tDW2NPQ2LtyeXZcYFVfV1BISU5FQkNFNT46NzY6Pzs8Nz00MjY2OTc3ND01PDU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nj06SkZER05bXFlJZmA7SISLenpuhYZ6fIR4gIWBfnB4fH18b3KNen2Be3iGi4mGg5Knu62osr2vpa2zs6ijorCsipq0nqO4pJWtpJaprbempKOfmamYqaOvsKqamJyUlZGXn5eZu7utyaFptrirsJSYnqOrk5e+o16qsoKJio2Uh5F8jo59g4aOj5SViIeTl4yQlY2LjJeYkp2ZtJeWq56Lm5SSjZCSjJmbipKekIuJlaChjZSNmJqdk5yZnpShoJScnaWvqKGls7irwsjEtbq9u8XHyMLRocbJzc3E19bRy9OhcHpoXVlTXlJPRkQ+PENBQjg/ODc0PkY8PDY8MzUzNDU0NTRCMzo6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZUdiYGJwSUCLin6Bc4aHfYGIdYKKg39tfX18f3B3h3eNgYd7jY+MhoyZqsLAr73Gu7O0wby0rauztoyosq6uvKqbu6Sorbm4q6amoqGjo6ivsrGrnZykmJuYl56ipaWSo7muqMC7rK2yuaWkp32Ih5ysvbCDjIyLkIOPg5GPeoGHkIyOnIiHj5eNi5WXlJGalp2nmrGakaydjpqPko6UkJCWl46RoJGJlZujrJSWj5ScnpSgnZuYoKGVmp6np6SipLCypsHHw6+wurbFxMK+zafHw8fDvNXRzcTKiHRzYlxZX1tNSkJMQEVHP0E/Qjs6ND5BPD01PTY+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGZGYGlnWl1bk4yMiHuHi4aDjHWGkIqBb358gn9xfoF6lXqRlJSYkJOVp7TGyb/CzMHDuce8uq+rubuXsra6ssCupcCkq6+7vKqtq6KinaeqrrSwqpufqpuhm5WfsLSni6K6urXBu6upnLKlpKiUhY6qw8SkgouPh4iEhpWUjXqDjJGOkaGMjJSRj4mXn5eTmZWYpqCunYyqnI6Wj5KRlJWOkJWRj6GUhpefoLKelJqUoKGZpJ+aoJyglJmepqSmp6SvraXAxMOuqLe1ycO+ts6yxL7EvLPRysjCtXR5bVxYXGlTTEhETEtLSkFBPUNEPDVBRDs6Mz04QjMzMjI2M0EwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmZaTWVcZlRjapmNl4qMiJKQhol5hpSQgXKAfI1/eIeCgpB5jaGWqJqamLq+yMjKwdLJysLMvMGzrbu+p7q/vbzEt6zBqayyu72qsKmjpaOsrbOttrWgn6+epaKYo7S8qZuovMGjtravq5Kwrausl4aaqqalkYKMk6WViYB1ipJ5hY2SkJ6fk4+Ui5CNlKOZl5yVlKOfqp+RpZqMj4+QlZaIfI+VkpKjm5Wgopy1ppCel6Wko6WenqaYnpWXm6WjqaiisqyovMDEr6Wzt8zAua7Es7u+wriswsPCwJhteWFYV1xbS0tNSkZERElCQkFDSzo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Nl46ekomKf4mfk4R3hX+Vf3+QiIqQf5Whmq6mo5jCvcjDx8XTzc7Ny7vBt6+6vbS8yrzDwbW2vK2zv7m8rq+ooKintq2tqbG3mp6toqehnau3t6mlr77Dsb25s6eqtLOtrpaWpayooJGOkrHFp5WOfJGVfYeRmI6pmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi42Qj56IWpCWl5KWpZllmKOesqWWopasraunm5+ml5iXmZWhpKmmn7arqbq8xLWltLXLwbiptqyyuriuqLi6vbiDbG5aV1RVTkZKU05LP0JIRURIR0c5NUZNOz43PkFKLjMyMDI1QjU1UFZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhXOz1AQkZCcUZpSVJlYkxGpZSclqGXqZaNkIOHppOIgYeCnISDlZCQlI6aop+vvq6hxr3FxMbGzs7O0sq+u7Wxuru8vs62xL23ubeysrWzuLOsppyrq7iqqKevsJejrqSnpKS0wLCqrLS+wrnAubOnuLS4sq6Vpa2vrqWLk5WhjXTBmn6XmYWOlpmKsZWamZWSk5mZpqOVn5uWmqmdnKGgmouNkJadYEqWnJqVmqWWVJawn6+cn6WUr6+sppqhppSTmZmOnaCnopm0qaqzvLy7q7Cyx8C4paurrbGxo6GysrSkcW5mXFpOUEtEUFBQUTtHSklHSEJDPjlLVT9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pWDs6QkNAPVFFV1JzYldGSKqXmaCiqK+ZkZeHi6eWjoiShZ+HhJ2Xj56gmqOktci0qca6w8PHysjIzM3Gvrqzrrm4wMHNtsi6wbm2urGvrrK0p6ObqrO0qqimrayZpK6lpKisur+oq7a3v8G/vriyssOxub2so661rLmmiJyYppt2v6CFmZ2Ok5mZiq6XoZybl5Wbn6GpnqigmZqqmqKnnpiQjZGdg252kqKalZ2inpCtsqOrlaiqmKuupaSfpamTkpmciJWcop6Xsaapq7q2vrOyrb65tqCjp6ilp5ycrKmpjGNlYV9SS01HSE5JVUw9TUROSktCQ0Q8UVU9QUFCRE8xOD03Nz9CNzVVWE4/SE5RWVNQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlJgTVVIf2VeSEWrlJyhn7uvmZSejJOqm5GSk4mrjYeinoykrZSjo7bGvbTBusLCx8jFws3Iwr25sq+5tMDCyrXGscG8tLqrqK2ssKOimaq0uqappquqnaivp6Oqqr68p6y8s7e9xry3tbjAsb3As6m1t6u+pY+jl5Gin7yfiZqgmZaenY63n6mcpaObnKGaqKWzoZudppyoqp6ZlY+Um4uXiYylopSdop6gtK+lpZOwq5mrrJ6epKOpkZWVoIOQnp+clqmkoqG0tbu1rai1srOenKKlmpeVmaqhnndhXF9dSkhGR01RSU1FRkdCUkxJQUVHQFZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpnXEZDQ5xwYkdFp5ekn5/DrJuXpJeZqZyWmpqPqpaWp6aVra2Zoau2xMK7vrfBwsDHxL7Nx7u9ubKvuLO/w8i1v6+8trm3pqOqrK2goJqqqsShpKirpp6rr6yiqai/uKatvbC3tse2tbm4v7G/wba0s7SvvqOXo5aTm5StoJGhoqWjo5+QvqWpnamsnZ2hm6afvaKZo5+iqauhnZaNlZ6TnoePhY2TnqSgnbWsppyVsqeZsKifmqqeoI2ZlZ+EjqGam5OlpJqYrLG2sqqlqq2snJigoJKOkJapn5RoY1lhXU5JR0pOS0hFRElBPVBJQTxHSUhbUk9LPUhPVTRCRjk+SEc1Q2JbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZWNXTKKao5yexayhn6ydnK6gk6Ofl6Wgp6mrl7awoqqytcTDvcC2v8K7yMK+ysi2uLW0sLOzt8HGtr6wuLS5tZ+mrKqrnZ2epaPBpaCpraCkqa2voqanvbamsby3trXDsrO3ub6yw8C3uK6ztbWjnaSVkZOgraCZop2pqKujmsOtqZ6srZubnpmmoL2inaWYq6uspqGZjZqfkp6Jjld/lp6loaC4qqeTmLajn7OhoJuvl56OmZSdgo6fl5aOoqSVkKaus6upoqKmpZWVnJiLj5GTpJ+JYmVaY2BMSEpKTkZFQUZLPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhjXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3NIRTY9dWVcS06en6GZnsOnpaKzoJyyp5OqpKCkn62prJ27sKistbHHxMHCs8LDvMbDvMTKva+xtq2wtK+/xbW5sbC5tayaqLCpqZqdpaGnwqybrLGcqqKusKmkp723pre6vK62w62zs8K/ssazurestLatqqKmlpWUo6yin5+aqKuwr6+8sqagqamZmZiToqS4oKGkk6+vrKWnn5KhnpWej5CNlZ2aop+ntKanjZi0nKOvmp6brpGelJeUmoCSoZaPjp+hk4umrLClp6KcoZ6SkpqThYuSjZyegGJmW2dlSklMSlJBQ0BJRzs7Rz85OU5NVV5SU0o+T15dPUhQQkxMSTlOZF1MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tVXmZyQDg8SJZ3ZUE0n6Sfm6DDqKSqsqGjtamWsqumoqSyrK6pu7KssLW0xr/ExLXAxL3JxLXAyMK1q7WosLiswMS0t66strmlmauxq6qYn6aXrbu0m6iwm62frrSyp6q6s6e6s7eyuMCqt7LCvLTFp76urbe1qqisoZeWkaaloqOYmKWvuK6ytbagn6ikmZWVk6Sgt6KlppausrKmqqahnpuampaYqJ+gmKGer7Kipo2XrpmlrJeanqWRm46Tl5mFlp+UjJCcnpSLqamqoqegmZ6WjI6ZkIKGlomUn3lkaV1rak1QTU5UPUNBTkM6OklANzdRT11eUlZRQVdgXEJKU0hWS0g6VWVdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUpwaVZDV0aMeWZDO6SknaGmv6aor6+gqbWqnbmvqqOqtLexsLm3r7a4uMW9w8e9vMPBxsC4wcbBuqq2pK27rcHDuLiqrbG7opWtsK2ylqWnkKq5qaCnsJ2qoLC0sqqptrWsvKyysrm3rLmwwrq9vqbDq7C3r6mrq6aemJiroqKgkZihsa+zq7G6m5ypoJmWkpemobeppaOir7G0q7Koq5+boKCbnqWcopado7Owmp+Qk6WaoamalaKflpiJlJiTlpedk4iQm5mUj6mop5+jm5ebk4eOmYt+jZaFj5traW1hbG5XUFFaVEFDRVRAOztJQTc6WFBkXlBWV0RZXl1NTFJOXktKPlpkXk5IUE5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE2NDdnWWBGKD84bH1oW1Y7iXtjQz2nn5yiqb2hqrCqo7G4qaW0squhrbW9r7O4vLq9trbAwr/JxLnEwcDAuMS9wbevtairt7K8v7+1qa6xtp6Xq62orZanqI6nu5+krbOeq6KxsLOsqba0tb2tr7G1rLC1scC6xLarvK+xuKutqqOxpp6kqqCkl5CZn7Oqs6qrs5qdp5ualY2gpqS0rqeira2usaezrbKppJyfqKSelaGYm6i1qZeZkpKfmZ6hnpGsn5iYhZWYi52anZOKjZaXmpempaOgnZaVl5SBj5SFe4+Sg4yWZmxyZ3ByX0ZZZlZEQ01YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYmBQS01OWFdYUEpWVldNPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVUxNTA9YFZeOClDM1lVXGdLNYx6ZkxApJmgpKy3pKyppa6utqmvs7mmprC3xbext77AwbW0usW+zMW5wr+6v7nEuMG5srWsqrq2u7m+taqtsbaZmKerqqubrKuPq72erK6xo6qfsK2zrq62sbm3qa2usai1r7O7vMmyqrW0sbSvrqehs6CaqK2gpZWVmpmyo62gpq+WoaSampKNoqWnsqmip7Ksqralr7G1r6SZna2nmpifmZmsuKOXk5CPmJyhmJeUrJ+dlIGTmY2dnZqWkIqUk56apaKioJmVkZOVeouQhnuMioOLkmtueG52e2BFYWpZSUhZWz17SkdFNkFiVGlbTVxhSltdWlJSUmJgTEtFX2BgUExJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ15RXC4qQi9KR1BbSDNjWVVLRJmWoLCosqmtpaOurrWpt7S4o6u0t8m7tLu7v760tLfDwMzIu8O8tr6+wLi/vLG9rqe6ube2w7errbK5lZemrquno7GqlK+7pK2ysqenorKzsLGxtbG4s6muq7GnuK+1tMPFtqm0tauwraqno7afn6eyoKSUm5mUsp6nnKCqjamjnpuWmKWlpbenorK0rKexp62wtaylmaCsqJucnZuUqbiclI6Oi5mcopiQl6ahn5aDkpaQnZyYlpaIl5CXm6idpKCSlZCQlnaEkId7hYGEjYxucXd2fH5cS2VsXEtOY1w/YntHSThHZ1dlW0xeYk1YWVdUWFRpXU9PSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0ZhTFYlLUIuPUVNUTwzcmtKREOQmaWupa2uq6eksLKzqrewtp+rtbnJua7BvMK3s7G1wsPOxb/BvbS9v7+6v7yzxKipubC2tsC9r6uzs5ygp7CtpaawpZ6ytq2rsrCsqai0uay0srWttKyprKisqbmusbHHv7ikua+pra2mqK2wpqSkrqOpnJ2bmrCZoqOio5CsnqSgn6Kqpqa5pay1taSpq6msr7avo56jqKqboJqakqS0mo+JjYeRoqCWjZSeoJSThY6Tkp2bmJaViJiTlZmnnKCfjJKQjZB3fo6FfHx9h4qKcnRyfn19W1Jkb15OWmZdRkSWW0g7Tm1YYVtNYGJOVldWV1RZZ15RUkxjWltUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZEhKKzpJPzNCSVMsPo9rPUhIj5uqqqKqsKSopLO0sbS1sbGhq628y7quwLvHsbSttMLC0cXFvsCyvsHCvL+3vMSnrLess7i8wLCrsq2gpKetqaiksKOrsaqvrLCur66rs7qntrCyqbKpq6WlpK+6rKqxwrm1q7moqKisqqixpaqkoq6qqKKem6KslaSdmJ6ZrJ2ip6miraajray3sbKgqaKgq66wrJ6fp6ipmaSYmY+gp5iGg4+Ki5+hj4uMlpyPj4aHkJWgnZaYlYeWk5OXpJydnIuRj42Jf36Ihnx3f4eFh3Rzcol2bF9ZYG5jUXNxXEs7hHxGPld1WGBaT2NcTlVWVVdQXGJeU09OaFhXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSWdERjg8QjA1RUtYMUCUWz9NRpWXraeiqrKcqamwtqy4ta6qpauqvcm7sL63wq+wrLPEw87Ow76/tMDCxLrBtMnErK+3rbK4v76zra6rpaeqsKmnqLGltK6rsK6tsbCzrLO6pLizrKyup6ufop+xuKuqrbq3pbW1o6mnrKyqraGpp6axsqOmpaGhrJaqoZSboKaepKKrpK2jn6ext62to6Wim6mqrqmdoqWkpJigmZaPmJ2TgYKQiYWcoIyKjoyZj5CLhI2YpJuSkZuMk5KRlKKZm5qKjoqKfIaBgoN6dICEgn50d4ykh3lrXmBuZ1dlh2ROQGeSTERieVdiWFJlVU1WVVVUT1xdYVVLTWlXVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEMrOkpPXjREhkBISESXkq+ko6qwmKuprbWrtrGrpKuqqbzAwLi5s7u1pbKvxMnL0b/Bu7nAv8K5wbrBxK6ytbGzu8C+s7GurKurqLaqpa2wq7mwqbGxr7Kttqq2tae0tqyspKmqnKOftbOoqKS0tKC1raGpqKupq6egq6uoubapqqmpoqmgrZuSqaGdoKSipqOqnp2mta6opqqio5elp6eqnKKko5+ZmJ+Rjo+Zjn6HjIeEnp6IhYuLj46QjYSGlaOajo2bkZKRj5Kfl5mWjIqDf3SGgX9/eHWDf3t4f4GInY9vcWdncXhcYHOIak9dmFZIbXhVZFZSY1BNVVRVUE9YW2JVSFBpVFZUR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlFjMDI/Zj1OWD9DLD5MVF8vSms2UEU7lY6woKWrrZqrpa2us7SvqqWvqam6vrvAsa64rqG1r8nHyNHAvr27vMK9usPBv7+usrKxtb28wrGys6qzqKS1qaWts7O5sKOttrKvsrmquK6qrrWrq56qrJ+joLatqKGfr7OhtKqeqKeqpKuhoqytqL2vrK6toaeon6uZkK+hmKKhqKefqJuZqrCpo5+soqGToqOjp5iaqKWXl5mdj4qHlYh9jYWEhKSWhYKCi4ePjpGEhJSgl4iRnZCTkY2RnZSXj4qFhXh0gX99dXh5gHt0c3ppgoekdWleZWyCdWeIjH1SWHBeSnhzU2RTUV5NTVJZZk5MVlllWUZTaVJSP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBMaDo0OF89YWQ/RjFDUFtbK0hPOlZCNJCPsaCkpqujpqSsprSzsaqksKequL7AvK+muKqnrrDJxsjRw72/vrm+v7zJvMG4sLC0sbq7ucGztLusuKyitKanrLK2ubOnpru1rbW8r7ymray1q62cqa+koKWsqqecnqqzpLOomqqnqaSpnqOpqKm9rLSvrp2ppKCunJuyo5WknKSln6SamqirpZ6bqqGbkpuhpZ2Yl6mpkZiak5CKgo+Ffo+Cf4iej4Z/fYyHkY+QhH+Tm5SFk6KMlJGLkZuSlYeIfn9xenl+fGl3fHp1cXF9aIZ5hYhkYGhjcoV6bWd5XV5WQld6bVRhT1JYS0xOcXRdSFpbZ1lFVWZQRD5LTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktIMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9O0VaPyqPk7GZn5+ppaShq6S3srKlqbCnrLjBvbWvormtqKiww8nJzMG2vb+1t7+6yLbDtbSztbG9uLq+t625tb+tobOmqquwtbi0qp27vKiyv7K5oK+ztaqsn66wo5ylqKminpylsaavoJ+qqaiiqpykqaCtvKiusK6hq6Okrp6eraaXn5uho5yfm5qjqqKamqSklZaUn6KWm5amrIuekZCRjIKLgYCOgHqalI2JfH6Lho+PjIqEkpiRh5SjipKSh5Caj5OBh3x5a312eXhie3pxcHFzeGmBdGuDZ2RoYW9zjm1ianBgcEFceGtWXk5RUUpKTVNZVk1dXm1XRFhgT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MEJoWTEzUz1lX0RMNktXZU8pPDNQWz0jkpismZ+Xp6Sin6ikuK+uoq+vqKq4wrmyrZ+5r6uotLrHysi/t8G+r7S+t8S2w7GvurKywLW7vripube9q6S0p6iqsK65saqZur2kr7+0tKCut7Wmp6ews6CepKanoaWZnq2nqJ6gqa6noaeXo6mgsLifpLGvoaygrKScpqepmpqbn6OVnZyanammlpufqJKYk5idkpmWoaqQmomOkId9iH+Cjnx7oYyMiHmDjIWKjI2Fh5KajomVn4iRlYKLl4yRfYR7c299cXN0YHl4aW9wcW9qf3Nke2xpZmRhZoaAYFtzanJNTX9pWFpNUExKSFBSUUlOXF9uU0RYWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmhIKj8wWlk1KJadpZiclq2gn6GkobersKS0s6ioucS1sa6gt6yurbC1xsjAt7/BubC0vbe/u7+vq72wtL+xvcO6qbu6t6eotainq7Cts7Gnmby3pKu7tq+fsbewqaWnr7KboaSgo6Shl5uvpqGfoqevoqCik6Slorewoaaxq5+soq6XnKqlqZ6Xmp2lk5ucmp2mqpmcnKSVlZeVnI6Tl6KpoZCJipCGeoR+hIp5jpeKjYZ5goeEiIyOhY2TmIyOlpmKj5d+hpeLj3qAenByd25vdF94d2RsbGxqaYRuZnNpa2ZpXWRzgWBba3VpWkl9XltYT09KSEhSVUYyOV9ebFBEWFZZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mio7KzEzOWNsODRHQWZbSFREVV1oRS48MmJVLDKWo6GXlJyqnaWhoqC3qq6gurilq73Fsq+uo7WvrK2vtcTEvLO/urews7m4uri7rq3As7S4r7/BuKy9urWmorOqp6qzq62yoprAtqWntLWpnrK7qaemqa+smaKnnKOmlJiisqSZn6SoqZyioJOloKS4qKSnrqeepaCnkp+poqGgmZudoJKbnJagoaubm5mhlJGUlpqOlJKjqKSQiIqPhnmEfIWGfZ2NioqGeYCEiIiIkYWVk5KMkJWUjY6Ue4OYj4t3fntsdHJsbHNheHRoaGpnZm+FZ2hpY2ZpamBpYmpnW2V7Y2BTc1RbW1NMSUdJT1NAISppXmpMQ1ZVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEIzQ0RnW0tXR1VgaEIzNzllTycynqOjkY6kp5uenp2jta2mqrq3pqvDwbavrKO1rqevr7fAwLyywbaxrrK2tri3taypvbOvsrG9v7iuu7uxpZ62q6WltKmrrqCewquopa+zqqy1u52oqquxpZieqp6mpJGZpq2imJ6kqaGcop2XoJ2ntaavqq6hoZ6coZWgpp+hoJmbmZySmZ2UpZ2sopiWnpSTjZWXjI+YmqmgkYiKi4l5hXeCgoGciIuCiXx/hIiGhZGElpWPjpCRkZGMknuDlY6Gcn19Znhva2psZ3Vza2NnZWR1gGJlZmZlampka3FaXlldbWRhTmhXWmBWSkdJS01SWD45YGxpR0JUU1xbSUlHRkEuPD85QTg5UkdANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWUpWYmZBOjNBZkglNZqjnpCLrKGYmKCWpbSxorG9tqCwxru5sbGkt6yqrqm5vbu7rcCyr66ttq+zt7Kmqrmxr620trq2sLi9raadtaqfoLClq66epMKgsqSusa+3rbWera+trqKZnaiqpZ6Vm6iln5mlo6idmqCblJydrK+luaetoqGam56ZnqOapJ2XnpiblJqgkqiWqqeak5uckoyVmY2UlJmop42NiomPfIJ0goGKmIWHfImJhISKjIiShJOckpKPkJGWjpB/gIyNg2+Af2Z5bmhramdxcmtcaGNjc4FhZWhqbmxna2pnbVxsbHVxYVRiaGRlWklGTE1PWFFRVmFlgVRAVlNZVUZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSmVDJzSSoJqOjrCdmpOhmqmysJ+4wLWfs8K7vbmxpravqK6lt7i3t6y7r62qq7eqtLitpLG1sa6psbe2sbO1uqeon7apnJ6po6qtnKnAma2krrC2ta2tn7GtsKqim5ykrKiblZyno52aqaKklpqgnJCbo6qpqbuepqSgmJqZnqGPa6KWmJxxgpabpIB1kqmnnpSVn5GJl5mAloqgj3mGlIyDbmp+d4NxbIaLhn2Ei4ZvXmNgZ4SXhmuLkJSTdXeLhH6Dj39mhoBodWlmV1xpc25OUGpjZ3KEZ19kZm5sal5gYIqQhIZnT0tEOEVUZ15KR1FQVVVLSFNhb3RlRltRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNTY4LCMxJzIxNDoxNzZYgWwxNk9rW05cS1tmYj5HMVFkPSsvjKOZh5Swm5yToJuqraujvcWvqLbCuL29rae2sKWrpLizsrOwua2qp6y0prC0oqe3tbWop6y3s660rbOiqZ+0q52hpJynp5msu5Wmpa+zuK2upaiuq6yloZ+coaemm5ihpqWbm6ennZOen5iQnqiporWvo6KjnZaXmJejiKGOkpqHoYeUnaF/pX+mqp2SkpuSiIRyeI2OhIihdoiNaZeIZn1zeKFviIeEfo17f6Ggn5mAe4eedIiOdpuKbIeBg21oZWN6bHFiVIZtY2xpmHFYanBvh1heaVtra1uIcW56coZoh4RaXkZOPkZfTUZSVlZRUVJXVGdeTFhKUlJQRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcvKIyml4Ocq52ZmZ2fqqqnqb/DrrG6vLfAv6qlt7CprKayta6vs7arqaWxraW1spustLa0pqeps7Gtsqevn6qgsqmgpKOaoqOcrrWVpKWmtr2nraeqqqyopqKgmKCno5mZpqOkmJykqZaUopyUk6SlpqC2o6Sgo5iVk5iTnIiuj5iUiamLl6KbhbGAo6yck5qelXmC1Kh/h5TBm8d5eLGlt5dkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB6gWyWsauweWhrWLGub2VpvJK8bmh6bnKP2H5TamK2sn+BcpR1mqGqkFdPV2FPVk5GVFtYUVBSjFxXXFBAXERQTkVHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGNppOBpqmfl5yepa2yqbDCvbK1wLW3v8KrprStramnr7Oqr7a0qKimtaanuK2csrC1qqWkp7GurrGmqp6npLGkoqGel5ygnq+tlZ6in7S6o6upoa2upaKdm5qiqJ+Ym6ign5iep6eRnKeblJ2hpqKgr6Kfn6OWlpOYkpmFr2pqio2qfmeElYetZHCdnJSappVxrqGkfne7fGuhj3axX2q0W6WAZpyRYGaBemZ/anhqqWW+cmemjHayanyxeHSSk2NtbadtW4SgRWlnh5ZFdZxgfWd7pKeCWV+Lq2mAlXh6aqc3Sq9bV1RsY1tLT1hfXFdWO06IT1dWL0hTU0pERUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzEbkaKVgqynpZ6jpaqyuKy0vb6wtsSyt7rCp6mwq6+pqbCupLC6sKSlrrOjqbionrKxsKOloKqtr6ywpqefo6KwnKOcmJWXm5ytppebop60s6GsnKKtraCempegoqmcmZ6koJyZoaekkJ2jmpegn6ufpqafmp+hlpWRl5GahbWbtXiFqZm1mXeHs5u3fpOWlqmUfmuBpnqChYiTlJJ3q2drsVuse4+HlHSIcI+GgH+IkJd4g4KLl4yDoI+EsHZ3n3Fra2x8i06kWEhjY5l+Y2imYHlydVOSh15QqW1jcX6HgGKdLlGhbltUa2dgTEtcZFhcWkI+sHhXWEEjTGhFQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1c3SjlhVTUwHJWflIizpqahrqmns6ypu7bCsLzCrbi3waqsra6upq6yqaGvvKqhp7StpKu1paaysqejop6oqrKosKilnp+frpafmZWVlpieraKamqSota+hqY+pqKqbnpWYoKWomp+co5+boKOlo5Wbn5ianaKqm6aanZuioJeTkZOTnIPVk5m5cLDCfsaGfNaUm7t8mZWkj42cjaR7joekgqWCeqx5j51Wr3uJfp9quVq5d4eEfaaCk3yYeqp5jZyPe7FtjoR0kLyFb5RQr6fFilGgemNgqmJzcodtl4hgU7W0yIaAiXxjpDNCnXZdUWpoY1BAWGZaZGFKSE1sS1tTT1lmWkNEP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS1xQX2ZUN0c6YVE3MiWbopOYsaeopbOqpbSopLy3wbC6wLG1tbyztaexsKOwsqafrraom6i5rqOvsaCzs6+gpJ6fp6mwqLSppJydnqqXmJeWl5WWoaqdm5eorbCpo5+PrKKnlp6XnKGloZihoaKhmqKip5ueoZ6VmZumoJynlZybn6GZkJKVkZ2Ism5otXGrh2+OpnK0c3K2e5mXo4uOnI2ifpGgpX6wdoOR0tF2XK58hn+kb5uqpmuGhX2tfZeZj3uxc5OdjnizZZZ0hJ5vnmaUUsiLWsJcn3liX61fdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9qX2xpT1VHSTk9V1JbV1hIQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJOVF9lUDVHPWFNNjIvoZyRpa+spKq7raa0pae2u7yyur+3trW6urOltLShsbGin6ywpJimuq6ksbGdtLeon6adoqqksaesqaSanJqonpWUmJiSkqOooJeTpquwpqKWk62fpZKUoZukpqCUmqamoZqjn62aoJ6dkJaboZ2cpZWdlZqin5aZlpKbhax7d6h2o46Jh6lvrYqCp4OYmKGJkpqKon+TmYmuhX+Cs1xys1KufYOCpH9x1313hX+PnYaZmXevhoqRnId3tGGaZZqBgpRsklqwWEuadZh5ZmCtXnZ3h2iYiGter3eVno94bDV5yK6yX0FUb15nYEVQbF9xbVZVTS5lY2lTWVE6QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo4OJ+dlKC4sJe0wa2osqipsrq4tLi/ubeytr21pbizn7Ssn5+oq5+Vp7arqLGyq620o5upoKCoobWmpqqjmZ6VpaGUk5yZkpWipZqTkKesr6aglZmpn6KPkaKZqKaglZmlqJ2cpJ6tnaGdoI2UnpudoJiZnJaXoqCTmJGmnYapfX2leKGPjoOqcK2LgaeGlZ+hiJeXiKOCkYiUqnyAi515b7FaqIKCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfoOVbJJcq1tak3+Rf2hnqmNye4FrmIdyXaxaiaCOa25lT0pDoVxaTHReYmVNWmFfcnNfSlY2SpqTWUhFPUhGQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjAwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzFVX2JMN0ZJX0MxPjihnZmZvquXtMKuq62ppbSwuLG1v7m6s7G3vKq7tJ+wpJ6lp6eelKqxqbCqtayrr6GYoaCmpKO5oqOroJebkaKglZSfmpSYn6CPjYypsK+mnZabqKafjJKkl6irp5SXqaeen6CjraShnqGNlaGZn6CSnZeclZ6hlZaPq5uPrm1ytHKpjHaKpnO0eHOzgJGkopGcjYmkh5B3uG+Me4uia2u2WqCFZZeXaaGip22TcrR0k5h/smqFk4ita3WzYZ1mom+HkmqXXK1gTaF8h5FSc6NseX9+b5iHcVyvVjycd2ZUb24uXKdPYlJrZWFsWWJcYHB7Y1RaUT4+bXAzQkJAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzwwMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV9hTDVGTV44MUI4pZqbnbqhm7LArq2rq6e3qbivtMC1vLGvubirwbapqqCbpqShnZKqqqe2o7Korqqgl5ynoKWruZ2jrZuWmY+lo5WNnaGbmZyfkJOUq7avp5mUnKyql4yTpZmlrKORl6qypKCep6uwmKGjkJmil6CblpuXoZOcqpyUkauZh9SSmrtzsMOAw4Z+1ZabuHiHkJeMmIqMp4h6o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiAim6aiHFujaR0vV13fVthebxrWlZbanpeamBkZmJtd29ZW1lDQUByP0NHKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaeanqG8opexw7Ctqqqssae5r7bFsbqyrruwrsGyrKSinqOhnJuRqqSqsqS0pq2kn5aaqpmmrLicoq6YlaGQpaCSjZyjnpidmpCWk6+5sayVl6Oop5SRlqScpK2ekaCoq5+bn6mjs56ipY6nopShmpyXlaSYj7CgkpWqnoWQmbaAkJGMt5V4gpObtXdua25zbnmPhI6Jc57Bu72ae4GyqHCAdJG4g3yGhouHjXuKho2XfKS7ub2cdXq0o3R2l3V0sHWZnmaGaY21dHJwd7aMXn95fYlog3lteWKLrHB1hX9ZW6dqRGRZU2ZgY11jUWdmcWx1Qk5QTEQ7Wkw+SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JWOCpPXV09KzpWVic9OzynnqCgv6WWtMO0rKunrKupu66wxq+1s663p7W4ramjoaWeoJ2ZlKykraqmtaion5uWoKOerKS+pqGrl5SdkKKbko+iqKKTnZeSmJSytbatmJ2kpKKLkpGmm6Wrm5aopKWcmqGppqejqaGSrZ+Xo56Xlpedno+wqZScp6KOan5pnKZ4h3N+mo90emWHer6+wLpukoNxlIZfcmpaXpqJYWSIjpVrYH+VY22cdmKUa3+alZRlXmBjcZuKaXKMfYaVZ2p+cnR4fX1iW3d0gWhQXG6DfHuLa1hseoJySUpvhXBNdE1FV11mYExbWGdjXk9bbXVpcVFPREVNO0hJPEw/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF5MKDM9W08nPzI+qJ+oocGjm7S6tqOtpa6nqLWxrMissLOstaO+sbKmoKKpnaKbmpmsp66kpLWppZuXlaGbp62ovqepppWUnJWgmpOYpamnkZ6Qj5icsLK/rJumnqeiiZORqZqopJqbq5+jmZujp62in6qimrCblaaglpWdn52XsaWYoqiZnJGdnKOjmaaimpyampqQloFnbX1xd5GXlJGFirWqjYaYlY6KjJiXh5SVioOSk5GJjZGTmJSYl5qgopqclKGdjoJ6pYVsanyQfIB0iYqBcYJ4eXZ2ioB7iWpzgXSDdWN3fXZrcHttYGNdcGdNWVllal9XWm96bW1mU09GUzlPWk5STygrOkpCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLOgs6K/oqSxsregqqWyp6WwtarJq62xpbWmwKi0oZ6kpZyjlZagq6aso6O2rKCZlpafl62ppcCeq6SVkpyXnpiTlKKfnqKnk5GYqKeyw6+aq52rno+WlqmeqpycoKyYoZqcoqWvpqGkqJ6tmJemnZmaoZ6enbCgnaKmlZiTmJSgoZWjnpegjpaUi4qNjpatj3yVm4KSgouqqIaBmJaKhI+fiHuEkIaFmZCHhomVjpuXjZCYnqSWmpORnY1/jWahs6+FiYR2eo+KfHZ5em9neZCBgIlrdYF5iHJoc396doOIgmt0ZHlmYGlkYmRmallre3BpalxTTFBEX1VGQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvvqyrrrKyoKqmsa2irLOwxbCqraOzrryktJyfp6OhnZmXqKappqSms7WelZSdmZmwpq6+oKujkJGempmUkZWhnJepnISeqayis8izn6qkq5aWl5qnnaibn6SrlJ6fnaCqrqmlo6uhrZufoKGZpZ6cnp2wpJmfqJOYmJ2RpZmYqJ2al2aDknxlfo6Zj2N5jWxoa3qRpKtrZZqYfmeFimVlaWh6jaGOa2iMl5Gid2tqi5ijn5lzbG56hIyHelhlXoWBXmyKiYB2XGhzd3eRgIeCbniCeIBzbXmDdHeIiI6De2qGWV5rdGRdc4lpanxxbGNdUU1XSmRYQEo0PUY3P0ZENzE8PT9BRDw8REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvrLOxqqWora6wpq6tsL2xqaikra+xn62Xn6SeoZqZpqucrKOmqKmyrp6Vo5Cir6a2uaWuo4+OmqGZk5KboJmZpZZ7payiqLPDt6Sip6+enpWeo56jnKOqqJGeoZ6gqq+qq6Oqn6ibpp+ooayWoZulsKSYnKqVoZ6ak6WXnqqYnn6+g4hytHKEnYataHi5xLhxk6Kje6aYmXOqgnzLwMC7cYuih4KffJWYiZ7AvYKWnZ6NncLBe4F7ko2aw8B9a6Wxb4yAb8p6f5t3kYOOgXZ6gX95cXp/h3F4hYyTeW13k2JmX3hkX2WCY150aG1kYlhMVklRWkhPRTJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAvI0ZbM1BZL1VBQjsvOJajuMO1sK/AqaiUo6+psK+tprK1r6qmpqaxq5+rmJujoJybqqeinauipailpLSjnaKTpq2st7Onr6KSkZqdpZKRoKGXnJ+dh6erpKutv8CwoamvqZeSn52imaKjqqOSoKGdnq2uqKymo6OnoaWlnq2pkaSbqa2qnJ2qnKyhlpellqGjl5x/zpR5eqSBeZWWm1+uj16Op4GioHynlZt0q4OAr15jjal6p4eFoHSXkoizY4KrhqGOjbNqhK50fZaHuGGCrVmjzW6PdXvae3+ZcH6Ik3Z+ZXuHdnZrfYhufoWRkn5tgY9gcWtwZ2BfeWRbcGhqZGZgUlRSV15LT0M1QUhFRDg+NjtAP0E7PTdAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJiekaSqqK20q6ayrK2spKunsKqgp5uZpZecoq+foJ6op6OmoZ6wrJuelaeurbGqqKyglJKbn6WTj5+ll56oo56upKuwqMDGs6ipsa6Wkp2copefqaqelKGfnJ2ur6eqqZunp6Siq5KstJamoquqnqOnpqGwoJOap5qgmpSUkZegcIWMl3SEqIdxsXydcax+oZ6BpY+ed6uCfa1/nHKtfquHhp92mJJ6fJd+qoiijJGLnX6re4mTj5+Ae61WnMR6j2+SwX2BlW11cIxtZXZlhm9hd25yb4qLkpCDbZCQZW90dXBgZ21kX29paW5mY1dTXGFaUVFCOUlJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNTGxrK0n52jjqOjoa2vtq6osKepqqiuq6unoqSdmaKVn6arn6KloKioop+dsKyXmpaop6+sqKepnpeUmqOikpShrZudpqOvrKOstaq6zbGtp66slpScnaKYn66snJagmZ2eqbGpqambq6qko6ybr7GiqKyuppmmq6qqsaKSl6OkmpSShKRqpHWJeql0erJxgqWJmYxxiKCah6RgYFKshH+ug5t2roGmhoafepiWhntmgKOJpJmGgaN9qX6BlIeuXnypVZ2ikoF6op+Ae8OvxYxzr7OzuXFiqa/CdGiNjZiPgW2aknBueXd3b2xmZGVxcGZ7aGNdV2BqWFhUS01RTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY3NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzY2KjFQS0wjIEE5RDQsJ8PJ1tXAoZmrqKGvop6wtbCvqayjqKaqqquppKagm6SenaWnpqOcrJqirKGkn6+inZqSqqS1sK6gqZudlpSno5CaoqifoKacsaajp7GstsiytaqsqZWRnZyimaCls52aoZScn6erq6Oumqyqo6Kro7OtoqqzsaGbqqivsLajk5ajp5ibkXyqbJ6Eh3WreXywb4Kki4mflpWflIHSuLS4yYCBsl9flKmDpIiHoHmYlZp4qsl0maOVp6mQkpuMf5uJmsbGeGWhgqVzgZ+Ogn2vXnC1Y7F1S6OGbadHgpNkj5Ceknxwl5KAcHp0fHttW2ZqcnFmgWpeYlljbVxeWEhNTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPi01T1RRHRw7PEYyLCSnpMHGua2ps66spaKcsrmsqqGmm6imqqyppqCmpZiro5+uq52loKyanqmlnaa1n6KXk6iqtrKsm6acoJWQpa2RmZyno6Cqp66io6eqsLTCsrOqraiTiZedpZuho66ml6GVmZ2lpquar52tqKeerKO3rKGyua+dm6+ns7SzpJSYqKSan46CnU54moF/n3qDo3yCpISHp5+cnpOEuHt8ebmCfszGwrZ4m6GRi599mZaXinaemIqkmKOofrCFnIWehKx9mZRhpWyjcI+FkIF9l4NyrGCkc3GAmmC8fVJVdY6SpJd8fpKRinR6c4R+cFttbndyaoFvWmRfaG5jZF1LTVFUQklIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaykq7mrr6Ccoayzs6afoJWlrq2uqqedpqaao6ehsq6iqKayoJmppJSitaKjlZeiqbS4pJyinaOTkKGxmZ6cp6ahoq+unaSoorWyw7Gtqq2qkYeQnKedo6ScpZeemZmapqSomq6hrqWmmLClvK2ht7etnp21srmxs6eYnrCipJ6Fj9G1w7d5h46FkZOPf6Z4lKJ3jKCShKWBinGqhoS0bnJqmaOblYqfe5aYhoePc6+CpZuijaaLk52JlJCbbXCyXKVzk3qcbJl/e5l9bqlhonFxf59ic7K4aHiPlKaYfoyMk4p3fHmNgW1peGl4c25/dF1kZG5tZmhgSltYWDxIR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVlZUUU9RW1UlITJBSCQpJZNzjYqtv7+7urWel6ikrbWho5mVo6mnrqqrmaWin6WgoLWmoqinsKOUq6OOpK2jnZCamqq0tKSdpJ2pkpSXrqCgnqaknKectZqgqqO1q8OwqaupooyEjpyioaailZqbnJmcmaakppirp62jpZutp76slb6wrZ+jsLO6rLSnm6mxpaeYeqiQfXywd4qBpKWIm2yxb6GHrXyhj4OolZiArIiFroWflKmgoZaGn4CYlYB7kn6rgJ2aloqqeJ2gj4mTkoB5r12jgXymp2SdgHyXdGuuXaVrcYWZXWBbjKBtlZGnmYOUjJaLenqCln5rbH9ifXRtf3pgZ2Vxb2hnaENZYFs9S1QyVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pYU1BPTkk3MDUyLiosQVRWVlZUVFVVVVVUVFVUU1RWVldYVlVVUUhGSUojKCi9kpqEqcbCt8G0n5utoK64paSOm6SjoK+vqp+kn52tmZ65oKKqoK+qmq2hkKqopJaJm5CusKynn6ebrZiYj6yioZ2lopqlnK2Yn6imtqnAr6WqpJ+LgI6cmp+mnpKVmpqUm5umpKSaqKyso6Sgqqi+pJfDrKqioayyuquup6Czr6mqmHavfpCLnIWHfbqtiphksIxlla19oY+DppWagayKhLCFpZmkoaGPhKBbbGqBs2B/rXt7goCxbGdumZeMiLBbfbRbpINryKJln4B7vFl2tVqyfVKvgHqsWIChbZiPqJqKl5GWlnt4jZx+ZHN+YoN3dIB8YWpmcW5mZWVPVWNbQlRePkkoPjk9NCEiLSUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTkpHQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsre9u7TCs6OcrKaltqihi5qgn52zs6meo6CdtZigs6iqq52vrp+rm5WvqKKOiJuOr6ypp6Knma6TmY+omqKepZ+ao6OlmZ+jqbKovK+lqJ6djn2Lm5WgoJmPkpqbkpuYqZ+hmaiup6Wmo6Wpu5+gxqelqaGrtLatrqefvK2trJWBqZKjr4+bgIakl5iQgYC4w7qDjp2ThKeWnIKsioKviKabm6Wpj37VvcKqYqO/vX1+o4KD17q4tYWUk4Oevb6EaqOBb6uEbZ1/erKwx4Nqq7C9rXh3or67dICWjqacj5uSl516gZCbemN9e2SMZnmCe2BrZWtqYlBiW1NqXEBUYUJOKT06NC8eHyQeJTIgHSQoMDQ5NjY3Nzs+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1JQz88QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Sxv7myvbOina6mpbOmnouYpb6pt7Goob+mprKcnrGcuaiera+mp5WUsKyXjIObka6mo6yhpJyqoZiLo5KnnqecmqGoopieoKytqrmuqKObl5N7h5mRppuSjpGYmI+ZlKqaoJipqaGqp6Gjq7ueqcWjoK+jq7O1q7CqoLuor6+ac3WqpLeGZYmfcGetj4qPbW93pJCZn4F1rpmVcI+LcZWoo5uXraNybW1tZYp4b22CmXGAeWlwaWeJlpWYcWhphIZncIZkXYljam9ZXWd+d6ZgYnGOkm9mZICNko6imJeZkZaffYeOlXZmh3hojWp5fnlkbGNmbGJLZFhKa1k6UWVFUidLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZdV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola2zqrq5srOrqaKunqSyqZiSvbHDyL62qp7Aq6yjoaesn7qjpK2sraaOlq6pkIyFlZetnqaqop+jo6CRjKSSp5mpmZajqqCWnKWmp6+6q6yam5OTe4SXjaWYjZGRmJSOmJaolJ+YqaObsaeeo6y6n7DBp6SzpqyxsquurKi5pK64loqhqKW2nYmWopeHqZqQlJ2TqrOZm6OroLGWoaGdoKKcoKShlaqmjJKSjIeSnJyUkJqTmJCOlYaBpJmXlY2Lk5KKj4aEfmeKf3SCdnSHjHGnbHuVkZSTgYGPj4+PnZSglpiWoYOHk41xaZB3cIp3dnx6amxkZG9jVWBYQGlbSGNhT1orRj0rJiE3NDAuHxwhJTIoKjY5OTQ2OTs+P0FCREZKS0tNT1BRWFVWWV5fYWNdXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpaW1xeX19gXl5eX19gYGBfWVlgpZapqqW1t66uorCkrZ+gtbGQjqvFvMS7uKqipZ2bpp6xqaO2p52ptaeokZisoouIiY+cp5aspKGZp56ek5Wjl6iaqZmUpqGjkJuomaG1uqirmZqQjXyBlIuglIqUkZWQkJOXpY+fmqqgnLajnaest6evwa6jt6avr7CtqqqzuaGvvZmSpqOmtqKSnaaejamfjZKfo6yvmqGjsaivl6OgnKOpnp6dnJarnZKZoZuUkJaqmY2ZmZaQlp+RiaCdlZSFkoyQjJSKgH5mjIZ1hnZ5iINznGqGkZSUkYp9jJaSkpiToZOdlqCDh5eHenKWc3mJf3F7f2puZF9waWBbYFltY1BgZFBbOkdHRD0yPT03LiomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I6OUVNVlteXltaXFtbW1xdXV9fXV5fYGFhYmFhYWBiYmJkYlxbY5eVpKijsLOsrqOpp62gqLWqkJCdpLO7r6ysoqOaep2isaSlsKiWm7ino5SZqpyOhoqJnKOQrp+jlqigoZKXmJuui6uWj6iZp4yZqI+eubakpZmbjYl5gpSLmpOJlZKUkI2RlqKMnp6pnp+4pICEr7WisK90pL6jsqB4eqCqsruVdq2kn4qAqn5kXGJ2n46knoSXfm6Ts5yjp66qo2Wdn5NzeZmXcICYqJdsf6KoimWcpZyRl5iVi5KckYadmpCVgpKHjo6SiYV3a4+HdoZxfIaAgGFpiIuVk4tbdpWRZ2iQjnJ7pZiYZHmYhoJ4mGmDioJueX9rcGVgdm9ra2hbZmViYm9TXD5OTk5SRz1AVEI5MS8eHyY0OjMxNjY3ODw7PkBBQkZIQkZGSUtNVFRVWVxfaGZnV1FKPERHOzhVUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWablqajobCxrKuppaito6etpJKWq7Wvsqaaqqarl3OMnbCfqKqmlJa5oKCPnKSdkX+IiJuejauao5Wnop6Ol5GehXWukIimmqiRl6SInLq0qKCZmIuJdXeTjJaTipSRkJSMj5Ogjpugp5mcs5aAjJy1nbOMko+8p6F+p6J6o6+3gY6Opp6Ei4WPsamvjImWo5p5gYushpydoqepp4eVhZh3pZt6h5uBl6aCgXucsXqKhaCXmZSYloKRl5aEmZljeYeQhI2PkoqDbXCPh3mAcYCBhX+GdIaElpJ4lmiTdKCadHyZg6Cchph+komCg5lqjYyFa3h7cXBnZHduaWxrW2VramVzXF5JVExRQEU1LllUVTYpITA5PT42NDM1Njg7Oj0+PkBESD9JRUpLR1NYWllbYWFoZllRSDlFTDs+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJijn6aurquorKCosKanqaWZlK7GvbChlqaptZ6Pg52snKeioI2Qvp6ZjZ+aoJB9hY6Zl4irnaKWoKGSjZOJhoCRqI6Hopyjk5eehp66sqeem5KOhXB1kImVkIqUj4+bi4+Rn5KXoKSWnqyIn7SJtJqti8qHqq6It4WNsIOxroOpjaaYjZ18qI9ye3ebj6eWaJWkebSLn56mqJKZwoF/q4iYoXGegJmkfZeFlbGAoXyhlKCQmJaAjpObipeRi3yFk4aNlZOJg21zkYV/enKGgYR8hHSFgpeBj8VmgKmHj6NrnoOhmYOagIyMg4mYcI6ShWh3dHt2Z2h1cGdnbF5jb2xnbVhnR11RTDJFNDZNYGM3JjM8REdEOjY0NjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASmRZXWNmaGdiYmJiZGNgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLmwqqummpSgo6SqpJalqbajr3+hp5ylnp2JlL2ak42hkZ2QeYSWlpGHq5mbm5qihY+Md5ucj6CRiJ6km5WZmIaiua6lmpyMjH9ibY+Lk5CNkIyNmIuQkZ+PlKChmaGofqGnh62doJauj56dnZGGgaCNq6+GpI2qmoyafqJ2gJmTaoKsdU2reIeNnZGbqKeAqqt9g6F7eqdpnn+Sa2eXhpe2iZ59bmBkWYOWf4x7ZGiKcpl9eZVsXXuXbV9TcIRcX2x5g2BZZYJ9hIGYcaeqa4OjbnKlcJ+Dnmlln2xbbYl7ZVlfg39iV1BvdmVtdHJqam9eam9tbGpYaU9dV0U5QTRHQ15rNCxJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deX2N2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGNkY2FiaWtkYmRkZ2RiZ2VhY2iYlp2guaGqo6askqG2vKuuopmXoKGlra2hna21oqiSoaCgppyZjpi0mZCLnoyVi3WBlJGNiqaWlZien3+ShYaspIeckYqYqZiZmpKHpbGnopWaiImAaW6Ih4uOjoqLjZKLkJKijJSeoJyipX+TgY+joZSgd5yWj6eDoad/hqmthaV5in2Emn2icHKTh5Z7nox5bYecjJmQm6iaj4edfIKic3amZp5+dqRfmHp9knOibpi3tLp0koeCf7WoZIHGuHtwlbeLcYCbpGNzrKtgfWqds35ufYeDjoKLl3GAo2xzpHOeg3+kYJ2Zs5VwfJeetHRzW56yg2pib3N1cWhvWGtscnNmXWleYktEPUQ1UUFZcTM9U0dfSlI9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltaV2BgfGRIQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7mZq5yToI2kuLWuraCbopyjo6aunJuxrayTl6GZoaSZmpSeq5uLiZJ4i4VwgJaNio+gkJOUnZd9kImOqKCHmI+KkaKTm5qMi6iopZ6PloeEfmt7h399j42Di5CQiY+UoIKWnqCdoJ+LiXecmKKMoHKii4ipiJymkJaoq3+ujH16oJl6o5N4gHOWiI2cfZagh5uOmZumhqJkoXyIlpCbjWyeaJuNbpqZe4CKp31yaHSrg52DdKpnlJpdm4V2hJ1oqmqAuGZcqHCBnGGVjF6ndnWJin+eaJp1h5OSmI5/n26akG2nmV2ofne7a36qW46EXbRnXG5xeXdraVtxanh5Y2BmWGJBUEVON1ZCUm40S1paX05aQ0AxNTE7OzdIPzpDR1Q/WVJZXT5EYl5WYFFhY31pRUI5TltdWGRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq2m6iJY5SbrLqysKydppycqJ+erpuesKirnZekmqGfmJaWoKOZhomNaoiAcXuXiIuWloSRlJiPeoqElqSdipSPhYudkZyciY+oo6CZi5GKgIBpgYZ5f5eMe4iOjoiPlpp/lKOfoKKTmHJon4qfj4xxkoyBqYiZn6OooKh9sK2joriXd6OzoqN/iJR5nXurmn+ijp2bl4mXcaF8hY2vtX1rmpGheH6YtKOjq6iEmXybfZ2afnSqWl1ve5aLeJ5iTH56eoVjeZdCTZ9ZompxfI5tgYmEmXWbeYeJsbN/f5uTp3WBnW5yfJRvmXJqpF2VdkhlY2BzcH19bmVgbGh2fGRkYVFeVl1UVkBZRVFnRFNXW2JYXklEPUI4P0I6SUU4TERXQVZRW1ZERmJcWmBLYG1+cUVDPFVfYlplalZnaG1vYmZmXmFhXF1eYWhiX2VkdmxeZWdma2RmbGloa2mTnYCxrpmEU1+gp7O5s7OpmqKMnKucnKmUoaukoaiPn56dmpmVmKCdloiHiXeFgW55lYWQmot8kZOWiHKAiZOhnHORkIGImJSfmoSOqZyalIqLinyDbISFcYGhjHiFjYiHkpmVfJOkoZ+jiK6GfbWEjp6de6WWeqmClp2QiqGdfadodm1+mXShc3F8nYWZcJODrn2kg6aemoGjb16oZ3WjY2+lYZzSkHx6mXhyc2OihZB+o3Ojj3VrkLOLYIKYiXOqsqi8f3eDbX6+pqm0XpxufXGXb4FzonJdo2d0pmFopm2b1Jl8hJtveHmXa5t6d5dybamkZ2BleXB/g2tnZmRtdXdnYGJTW2VRUWFJV0lUX1dTW2VqXGRQRUNLTUpLQkpFOFA/UE1XU1hPUlJgZmVpUmN3eXdJRkVjXWRaaGlUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5uAsatUXEt+qa+xtLCzo5yYhZmooKCjjaSooJipiZmYmJOZk5KgmI6IhntwfYRofY+ClJqBd5GNjolvf4aQk5Jsl5R9iJGRo5WDjqqalJKLhYl5g3aIgG6Cn4Z3gJOGiJmil3qUo6Wan4mzoaK2i3qsp6SupXCpgJqQhYGcknykgKKZhphynoSira6Jl4yAjKSNloOtoZR2tbW1yaFzlIqBn2CdlqlteZWGn5p1oYd3oH6RloqAb0xmo5JwmodypHt5dGGDgmx+oGtxZGCccn90l2l7arS1tMamc5h+e51qm5urdYOabHR3l2maenWYclBEfbNeanZreIdmamdidHRxblZeVFloT1JoSVVMWVNVXWhrblZnV01KQUpNS0hKTkFRSlBkY2ltZXRyc355e251iXt7VFBPbF5oW2tpUmpoaWxnbGZjZV9cXVxeaWJkaGt7X11kaGNqZm9tZWlsZaGcibCnhGY/lKGyq6+vtaKjkICXqaKipYylp52cpYKal5aNl5CPnJOOiIN5anmGZYOMf5egeXWPiIyBaYSFkoOMhZ2NeoyKlaWSg5epl4yRi4GJeoB9i3lwkKGGeYGVh4mWoJZ/laapnJaWhGdueJxsomR8caV3nJhwZ6eBl4x7pXqfloOXcp52gYmUlo+5bpCKomJ9mKGViG1yaatqdaBtbqZgm2iKkGiWh5qVdaKAfZpgi4WMdG+IYmigZZ5+aZp1b2NmiIJucqJaX1tjoW5diYxve39zcmSlbXeiZGenaJhzi5huoW9TiI9voF9lp1SLXVSYbW1za3GBbXBoa3hza29SWFdWZllTbUlYT11IWGloc2pZa1ZRUkVWXExYUmFUaGped3V6fHB8fHKDe39ydo2AhHZeUXJiZ2JwZ1BqaGhrbG5nZGdfXV5dYGtjaml2dV1cY2ljampzbGZrbWOcpZmmemV0bYunrqSpsLGmn4uAl6udnqWMoqGaoqKAlpiTjZqPi5iQjop7h3GAiGiLi3yYm3N0in2QfGSCh5WKipWZgnyIhpankIGirJCFkIqCin2AgI5zaI+mhH2GlI2JmKCOiJOrp52JpniWnH+liZaMspiekIOvl5+leJWIeql0pY+Emm6kooyShIyDvG58pa+ChoWGkpacn3ylenGolaCWZ559bqtjloqVkneobKmigYl1h4J3q5GmiGuRsGt2s4ypa4qGbm2fnpKVYX+ri6p2gH+Mpp93n32FpZWdoGmah3asZ56tjLdzd76NpJNZg6aNq2F1cnNve3RxYmp+bmhtU1ZbVWFhXGtNXVJdSV5tbXZgW3FZW2BaZ3Nlbm9xY3F0YHd6fnlyeYNzhH+Ae3uMgYKAdmJ4ZGNtc2RSbGdob2xyaWZpYV9eXGJrYm1sem9cXGJpYmxqd21nbG5ilaaqnYGAnqSWqaqdqKeupJmKg5irmp6kiZqlnamchIyajoackYWSjYyNdIZ6iIRvjYR+mJN0dIZykoNtf4uSh4aUj3x7gYWXpY1/paaOgY6JhZV2goeSb2yLqYGDi5SOiZyfiY2Uq6SgkIB1lJeJf4F5lK6jf4GbcY+GeZCLhH97cqaMcX19epeWm4SOeHt+foiUlZOKdpCYn6CDen2JbIyFW3l4cXlxaG5+kolxf3SCj5STcYWDgmWNf1+Bf4t3dXOUdW95bm6HbYSGXndpeI1mgYKGjqmbfnR8l2qJiG+Adn2Fdm1sZ4xzeXuYeIRba1h5j2hud3Jxb3d4b11shm5pZ1ZaYFdcZWtjVWFVX1JfcHh5bGt2ZWpranZ8cXJ0c2FvdWJze4F4dXmCdYCAf4B4i4WDfXttf2xkeG5eV25naHVreGppamRcYFpjamVscHVuWltia2RsbHluaGxvYY6Uuamni6GimqakmaScq6OhhISYrJKdoImappqomIKBm4p+lpOHjoqJjXKDfI99fo+Fe5eOdHKDcJaFe32Si4aGkIV4fn+GmKONe6ehi4aQkIWWg4aOmHdyhaqGjpKckIienoiMm6igoKuDiY6Um4B+iZatqI+TppB4b52Rg3qSb36ohXB9lXFrcHyBn4t/ko6MaG1dg4uMm5uejnOVi4hxdGuCdnOAWXJuh5GBfX6Mal1qZHuFg4iAX2l4e5t7gouCdoGGgmh5i4drYXFyg3dfc4yCiZCnlYZmjI+DbneLhHGFjXlvZWdkeoN6lltcamdudlt7eHd0bXNygmZcbYprbGJZWV5aWGxxW19hWl5dZnR+e3VvdGNra2p7fHJ7eHRkbXRnbHt+dnp8e3p6f39+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hranFybVdbZW5sZ3N6b2hqbWCLjKqxoZCjoZqenpiemaijon6DmK2Nn5SHm6KQpZV/e5iEfJKZiYiGh4pzfYCLdoWLgYSWinFvgHKYhoR+k4SDhoqBeoCDi5ufj4KmoYd4jpiJlYuLnZeFg3qtgpGYmZSKnp2HiKGroKKio4uIk5ydo5mWqqGnpqCSm4iXjnx4jo6Ep35/kpGSk5yxppuUnpCNspOYhKWMjJWbn4mQm4KJkYprfI12d2WChpCKe4mdhIeLj4iIgIWEkHd8eXWaoYiGip+LhZR/foyBgHZwdIaEf3iIh4uQppGEhY2Ig42QjH2Ii4iPgXZsgoR8eZlqcmhhdIpwfXp3dm93dIFdXm+GaG5fXlpcXVNocVVjXFxhbGl1fHxzb3Bka2ppf3tteH9xaW9wbGaAe3KCgHh/fYCEem2DjIZ8enh8fXqDeU5kdmtzbXB6ZGtlYmJgW3RmcGZycm1VXWx0bWh5enFnaWtljYidup+XoqGYlZmYlJmkoJ57f5qrjp6NhZ+ci56WfXmUg3uOmYmGhISGbniAgHKBiH6IlIRtbH56l4aEg5B/gIaEhnyHg42bnZKHqp+DcoqQhpOSjJ2RfY17qoSNkpiVj5yXhoabp6Cimp2Gg5GampmQmqagpp2dkJaBkYp3fIiOhKV7fI6QkYaYqaGdk52PjauNkYCejImTmp6Cjpd+ho2Cb3iFcXRgf4KPhnWLl4CDj4KGhH6Fg5RueXV0kqKLjIWahYSNdICKfHxycnuIhHt5jI+Ek6ePhoSPgoSKiop3hoiJi3xva36Ae21obG1nXnl/aHx7dnR1dXt3XGBwfW51YGNaXV5RZm1TZVpeYWtpdnp+cWxsZGtqZ4B/bHOAbGx0b3huhHluh4B2goB9hHZyg42Ifnt7fH97gopgaXtqdWhpgmRqY2BpXGR1aG9idW5sVGNxeWVwenpzZWltbYuKn7eboqSfkpGWl4uan5+ee3ieppCbioaklIuYmXl6jYV8iZGDjIKBgm18f3hzgYV9ipF9a2h9gZeIgYiOfH6GhId8j4CPm5uRiKedf3CLi4yTh6GhioWNfKiRiI+Sl5OWk3iMo6Ghnpaaf4CQmpiTjJujoaSal5Gbf46FeYCDj4eggH2MjI98l6SgoJOZkI+mjY+Bm5GJkpebfpKSfoaNgXV0gnB2YH1/jYZyipV8iItyjH+ChYaOaHdxeIyYko9/l36Ii3OCh3x8cHl7jIR6e5KNg5amk4uGkXyGhoeFdoKDiId6ZXJ7fnh6cGxqZl59c2h8dXVzfHKAal5gdHZweGRjWV9eU2toVGRZX2FnanZ4gXFma2NsaGV/gGptfmhucWt9d4Z6a4yBc4GBfYF0doKNhn58e3+BfX+PanKDbnNpYYdobGJfcVZ0b21uYHhobVdqdHZjdXt7cmJqbnmJjZ+ykqalnI6QmI+GnKCbnHx2pKCNl3+MooqImpZ4e4aHfoOJfoiCgH9xf3t0doKFfoqReGdjfYaXioKKjXh9gIyDeZaAlZeWjZagm35vjIKRlIamm4iNiYSmlYWSi5aXk5J2kZ6hoZiUl3p+jpiXjpabnaSdmZOUnHqQhoN4hZeNnX6BiY2Mc5einqGTmY6PooyLg5aYg5KWmX6YjXyIjYF2cX1uemR/fIqFcIaTf5CCbIeCgYCJhGV1b3yHkpeNfZN4i4l8gId8e3F+eIqFeYWRiouYopWBhI13iISDgnd8gYmGdl94d31zfXdmbGRhfmlqd3N0dH1xfGJjYXNudXNtYVphXltrZFJiV2BhaGt2eYZxYmpjbWVofINsaHRobG9of3yCeW2QhnGAg4N/c3yDjIF/fnqCg358kG12iHR0bWWKbGphY3VWhGlxbmB5Z2xianZwZnl8enFgcmyGhZCcrpemqJ6NjZeHhp+Tl5h9eKqciph5l5yLjJiQeXuBi318g3uAgoB4dHl6c32AhH+Ji4BkXn2LlYd/hYd0fX6Kf32XhJeTloyjoZh/cod7k5KKp4+MjoqToZKDkZCUl5GLgY+YoJqSkJF0f42SlImdnZ6nmJiNlZZ0jo6LbIaYj5l6h4iQiW+XnZqjk5WKjZ+MhoGSnH+SkpWGmYh8iYmBenF5a3Vse32Lfm6FkoKUd2+Cg31+in9kcmp7gJaXhH+NdJCJg3mHfnV4gH2HgHyEjoWMlKSQeYWCdImHfYB0doGHg25ge3V6cXxvYW5jZXtibm92cnd3c3Rhdl9vbHVub1xcX15eal5PXVdjYWhtdHuJa19qZWpjaHeHbWZsaGlsaIB8endvkIdzgYOEfXOBhol6gn16gYR9fY5yeop4eG5sh2toX2lxY4docW9ld2hubGF5aGt9e3hwYXdti4GZmqqgo6idioqRhoqeipWXfXeumIyWfZ6TkZaUiHd+e4p9fIB2d3+AcHV0e2+GfYGAin98YVx+j5GGf4OEc3qAhnqPkYeSkZuSpZuVgn6BfI6LkqSJjoqNmJuNhpGYk5aOiYmMk52TkIyNboOQj5GJnpmioZeWipeRb4iZhGeGmY6UeomFkIpwlZqUoZKSiIuZjIJ/kJ58ko+Si5mOe4qEh3RzdWtxbnV7i3RuhZCOknF0gHuBgoh8ZHFseX2ZlH2EiHSQi4F0iHlvgH6Bh3yFjYqFjZWojXuIfX6LhXh+cXCAhYNjaHh0dnB7Yl5wYWt1XnFqenh4bHJwZXhdbWxzbXNZWl5gYmpaUFdXZWNncXF/h2ZdaWhnYmdxjm9kaWdlamiAend0bo6FdIGBgnt1goiFd4V8eISFeoCJd3+Le3pyeYNqa19waHSAa3JvbXFnb2xlfGNugHl2cWx3d4p/opiiqKCmm4eMioGQnIaTnHWBqpSSjYagjJaTkIB0fHaFd3h/cnN7hWtzcHpuinaAgYducVtZfpGNiH+AgHZ1gIB/oIaQipKcl6GUmHiKf4GNiZ2eio+GkpiWhYmVmY+XjIuNjo2dio6Qg22IipCRiZyWoZuYlYaYiGqFo4Nnhp2KkX6Lg4uBd5OYkZ6RkIiJlY1/fo+XfJGNj42aknyKf4JudnBsbW5we4Vpc4OOl4pwd390gomCeGZzb3aBmY58iYR6lJF6d4h0cIl7ho16i4eEiY+co4h8hHeCi394eG9rgYKBXXJzcXFxeFpecGBxa15vaXx5cG1tamx2YHBvanJtWlhhYWJuWFFTWmZnY3VwhIJiXWptZGJma5JtYGZmX2hqgXVxcnCLgHV/goB4dYCLgHiFf3eHhneDhXuGjH97dop/anFjfGKGfG9xbHRqaG9sdndfcX95e3R1dICCfqSVmq2eppaFjIN/l5SDj591i5+Uk4WKm4yVjYt6cnh0gnByhHNxdYhscG11bYh3g36AbW5VUYGrlIeCeIB2coJ5gaCCkYGTkpickpp4knuDjZOkmpOOiZWZk4WHl5mMlIyJj4+InoWQinxyioWJjoicmp+blpSBlH9php2IZ4ahiJKEkYOJcYORl4+ajY+Mi4+Nd3uSkHqOi4yRlox8iHyAa3ZqbmtrbHp+YXl+jpWBdnqAd4ONfHlndGx0h5WLf4iGe5SQcXqEcHeMeoqMeol+g4yRn52FfXx4gox9d3FqbIGCeV93b21scnNWXm9icmFfbG55cGdwZmZzdGhxa2F3ZV1XZmFgclNQTlxmZV14cIh8X1xocmJiZWaSaV9oZFtncH5wa3Bzin12fIWAdHV/jHl7hoF4iINzhoV+jIyDe3mVd2ZyaoNgiH5vb2t6YGpudH90X3R9eYZ4dHOFfHigj5mwnKWPgop/g5qIf4uef4uak4+EiJiOjo+EdnR2c4Bwb4VzcHGDb2tpdm2Cbn18bXVzUk6C38iS1pN8b3SEdoOggpN3lZGZm5Cae5RzhZCfoZOTkImTm5SGfpaViI2NiJGNiJyAjoF4eox+iIyKnJydm5WTeo52aImSh2yIo4WSh5eDhmOMkZmPlYmWjI2Ki3F7lIl6jYiKkpGJeYV7fmx7ZXJva2t5eVyAeY+NgHp9fn+Gjnp5aHNrc4uPioKFhX2VjGt+fm6AjH+Mh32Ee4OQlZqainx3eIOReXNtZnB/g2xqdG9oanRtU15vZHBZYGtxd2ZramJmeHJwcGNfeGBgVmtfXnZPTktgZmNdeXGJdFxcZXZgYWVlj2RgZmFYaXNzbmtxdox8dHmGgnV2fotzf4Z/e4l+comHgZCKiHx+mHZlc218ZYh+b3BsgFpsbnl5c2F2enuNdnN3ind5n4ubrpugkIKFd4iVfnyJnIeFn5GOhYyXhJOOh4F0d3B5cW6Eb21ufnJkZHhwfG16fWpobGOkmsHcru+hc2t1hHaFooWSb5aQlaCUnIGScYaLo5eJjZWKkJ2Wg4CVkIWJj4CSioqXf4d7dX+JeIaEjZybmJmPj3eMdm6GiYt9iqOEkYmdhYVei5SXio+IjouLhIlsfJaBfYiFiZCPhnaFfX1rfWR4dWpueHNYiHqRhoV6fn+AhYt+eGVzan+KjoqDgn+MloVrgXZuiJGCkIV/gnuAkZaTmZB1dHiIjXVzcWd1eYJidG1vYml2Z1JgcWdsVV9udHlgcmNfaH1wcm5bY3JhYlduWlx3TU1MZGZhXnZziW1cXGR5XmBkZoVgY2JeWWpya25rcnaMfXR3hIF4d3uJcYOEfX6Ie3SLiYiVhox+fphzaHVxeW2Lem50cIFYcXp2eXFld3mGjGl3gIlyf5yHmKeco5KEfHCMlHh5i52EhaGNjnuVjX+ZiIR7cndwc2pvgWtpbHx0XmB4dntwdXtnYWV869q1ycPciHNsc4F3ipqIjWmYj4+dlZOBiXGFiaCOhYqVio2YlHyNk4iDiY97kYuGkIJ/dniDg3KHgpOblpSYhox3iH9whYKJh5mig5SMnoOJYYOVj4eJhomNh4CHaX2Uf32DhImOjYJxhn5/cXdodnJpc3dsWox9koGFfH+DgISKgnVhdGyIgY+Lgn5/kpF9bYJseIaQhpOEfYF+gZKTkJeJb3J6jYZ1bHFrcniAX3NpblxrdmBSZHJpZlNfcHZ0YG9gXWiCcXNqV2doY2lYbVdbdUxKTGVnX2Jyc4VpW1xleV5eZGd7YGRfXFlrbmVvanN3in5zc4F+enZ6iHOFgnyAh3Z3ioaPmIKMgXuTdmx2dXl4k3RueHp9WHmFcYBvZ3l3koJkdoaFcYqWhZmhm6KKhnNvkotyd46cfYqaiYl8n3+DmX+BeHFzbm9kcn5oZmx3d1tfeXt6cXGAaWFnYX/Vto6QpnhucXd7cJKQjIdqmY6InJKMhXtpiIuah4GSkYaHmI18jY2BgYmOfJCNfoqFenV7gnpwhoCWmY6TlIGIdYOGdoOAi5Odn4aVj59+iGGAk4eFiISJjX9/g2d9kH9+f4KLj5B+bYJ8gnRrbXZ0c3Z1a2KNgY5/hX58hH+Eh35wX3NxhXyPjYJ8f5KJenCDZnmDioeMg3yEfoCUkJGThG5weox/dW5vamx6fWJoamlYbHVaUmlyamJRYnJ4bGFlXVpqg21zYlxnX2RsX25UW29OSE9nZVxnbnGAbFpbY3NgXGNsd2RlXV1abGxibWpzdod/cW9/fHx0eIZ4hYJ9gId1eYmBkpV8iIZ2iYFvd3l7hJNwbXyBd16Df3SBbWl7c5RzZ3OHfHKSkYOan5ughod2dpR+bXaTl36IkYOKjZp8i5p2fXZxb2xqYXR8Z2JpdXpaX3d8em1xf2VkaGhXnY9ecXKWvMODdXGUiZB+cpeMhpyTjIhza4mPloF7lIyBhJuMfIuGfXyJjH+UiHWJhXZ3fYFxdYaBnpSGlY+DgnJ/iHWEfImYnZiHk46dgIhlfZOCgIWDiYlygX1nfot7eH5/h4uOfGmAfIN2Zm94eHN2c2xqjYWKgYp/eIGAhIN/a15yeHp+jYqFe4KPgH5ygGl4g4eLhoR4g3yBl42QjH1ubXuJfXd1b2hnfHZjXHBiV29yU1Nuc2lhTmZ0eGVgXVxYboBvc1llYl1qbWBwT1lrUURTZ2Faa25te29aW15tY1pib3dkZlxdYGxqY21qc3aCg3Fufnt/dHWDeoOCfIGFdn6JgZaQeIOKdIGIcnh5fo2Qb298gXFpgXl6fm1tfHaVa2p4hHRslI2FnpigmYWIbn2Mdmp4mI5/goqClZeJeY6Wb3pzcGxqZGB0e2hgZXF6WmFyfXlncXphZWWPsbJ3SmJapNnQlnF7kIuQeH6Vi4WZkY2Gb2yGkpJ6eZKGgISYinyHf3h4iYqEloBvi4hxdH16aXmFg6WRhJONg39vfoN2hHmFm5iTi5KQlIWHcHuSg32Dg4mDboF4aICEeHJ/f4KKhntlfX6EdWRwc4BoeHBvdZiNhYKKe3Z4gIR5gWtccX1ygYiFiX2GiXqIcoBucYSHjoSFc4R4gJmNjYR4bm9/hH93e2Voan1wX1l3WlhxbU5XcnNnYEtsdnRgXVtbWXR9cm9XZ11manFfb05XaFE/WWdfW3BqZ3lxW1tYa2VZY3B5X2hcXmVtaGZsaXF3f4dvbH99gHVwgXp/gX6Cf3aBhYmXinGCjXF7hnx5eYOTjHVqen9rb350f31vcnx7lG9ugH94Z5KKgqGZnZGChmeHg29nepWJfn+FgZmKgXyNjGl4cmtsZl9hb3ltX2JveVxka4J6YXF2X2Vm1Oq+ijI6PouOgHJ5hYiOjXaDl4x+ko6Nf25shY2Mdn2Pf4WClYl8g3hudoaEg5d3b4iFa3V7dGZ5goOnjIOPi4R9bn90doN5hpyQjJCRkoyLhn57kod4gISNg2yAcml/fnhtfHuBioN3YnmEgXFkcWh+bXRxdYGbi4B/hX5ydX2AcoFwW21+dHiKg4t7h4B8iHh6cWyIg4+Ei3KBeX+Xi4t/dG5rd4CAdXVcaWh3cFlXfFNacGVMWnJyZVtKcHdvXFpaWV10fnVoWWJbZ2ZuY2lMV2ZRPV5mXF11ZV90b1pZVG9kWWRxeVpoXl9nbWdqbGlwd32ObGmChH55boB7fYF/gnp1goGNk4VwgItueH6AenuIkol/aHt9anR7coZ7c3d9f4x5eIR9fGuMjIObnZaMgYBsjn5raH6OjHt+f4OUgn99iohrdXFnaGNbYmdyb2BhbHRhaHCJeWJzdF5jZJugj25cNVmvtXVqgIl9koZ2hZaFc46LindwbYWDh3V5iXiJfZOIen9zZ3aIfn6Yb3GGfmh2eW1leYiEpYeAh42Jfm5+dn+AfIyZh4KTkJiIi4SJfI+IcXt9hHxpfm1rgHt6aXp2gYeBcmB3gX5xZHJndYJtdHuFlJGBfIF/bnd5fHR+bVhvf3Z0jIKGd4h2gol6eHNuiYGPgYVyfn1+k4mJem5uam6CgnVuXGdmc3FRW3tOXHBcT1tycGRWS3N4aldZWVphcYB0YF1dYGdkaGlmTlloTUBhZFtgdmFcdGxXV1N0YVpkb3JXal5haGtnbWxpcHd8kmtohIl8fHB+fnuBgIJ6d4CAiouDcXuHb3F3g397iY2Pg2p+e253eXaKd314gIKHf4N+fnpthYyImKONhIN7dYt5a2yEiJF4fXuBkYCAfoqDcHJwY2ZeWWdfcHBgYGdwZmpvinRhdG9bYWRqdnt/vpymo8i4cYWEc5R9eIaTgnORjYhycnCEe4N0dYd0iHeUiHl5cWN3hnqAk2lyhHZmd3ZjanyDiJ6Cf3+Ojn1yfnOEeYCRkIJ4lo2Uj4iCiHuJiWx5eX91aHtpa395c2l6doCCfWhgd4d9amt0aHt/aXaBjJCUfnp+fnB7dnt0fmJWd31yc4qEgnyDcYaKd3hwcIOCjX99eX59do6Gg3ZpcWltiIJycF1oY3NuSmV1TF5uVVRZc25iUU9zeGFSWFhdYnCCc1thXWhlZGNqZFFacElEZGFbY3BeXXdnVFZWd11bZW5oVmteYWpnZW9vaHB2epJuaYiMeX1ye354gYGBfHZ9hIiGg3B2g3Jud4KCfomLk39wgHt3eXqBjHWDeH+BgYKEeoB1b36Ji5qeiH2FeneGe2d0hYyQen9/e4mGhHaPgGdvbl9kXFhlWW1yYWBhcWxraIluYHNpWV5kbYB3qdqpx4aHsnGJeHCNdXuHj4B6k4qAdXR1fneAcHF/bYR0lIZ4dWxgeoJ5iI9mcYNvZ3ZuW219gJCTgIB4kpJ9eHtth3WAkIuEdJaKkY6HhYV7f4VsdXZ/bWh3ZW17dm1qdnd/f3xgYniGemh0dWN+emd0hY6MlXt0f3VxgHp8bX9ZVnR+b3WEh3+AeWyIhnR4a3V/g4R9e314e3KLgX1zZ3RlbouEbXRbal91ZEhubkxbYldWVXhtYlBTdHZYUFVYXmFxhG9cYGNtZWNebmJUXHJHQmZfXWZoXVp6YlFVXHVbW2drYVZqX2BuZmZrcWhwdXiOdGuOjXV/dnh+d4GDgXt0foSIh4NvcX90cXV+hYKJjYp7d394g3x8hYd4h3x9gX6EgHt+c3Z5jI6fjYl6iXZ0g3lefYWZjHmGg3SFhoV3iXtibmxbYltbYVZqc2NgXGdub2aHcWFxZlddY2t/fMrOiLmiam1timxxhHJ8hYp/e5GFenl0eXV1e2psdWOEdZGCd3BnXn2CeouJZXKCa2pxY1hse4aciIKBc5eUd357bohxgYqLh3GXjpCIhYuDe3l+cXFvfWZocmJueHFqa3F3fHx5XGV5gHdpdXhmgnZndIeLjZR8coZpb36AeW58XVhyf210gIt8gm9viX9xdmh3f4F/gXZ9cXp0h3x6cmZzYW6MgmxzWGtfd1tJbmtNVlVeVFV7a2FPVHVyUVFUVl5idIVoXGBsamZjWW5hWGJwR0FoXWBmX11Ve15PVmRwWVtqaF1XaGBfcmZraHJncHJ3hnhulYp0f3p4fnmCiIB1c4CGhY2CcHB7eHd1eYaGhouGenx/dYt+fYWEhId/fn59h398eHZ5d5KTn3+MfIttdoB5Y4OHl4ZzkotvhYWBeoN0Y25qWV9bXV1UZ3NlYFlkcnJmgXNia2VXW2Bpf3e+rnugt21ic4ZodHxyeoOGe32Mf3h4c3Zve3Zlam5gh3WOgXNqYl5+eHmLhGZxfmhqa1pWb3iKpIGFf3GZk3GAeHWCbYCCkYdzlYiMh4SIhX14dHJuaHlgam1gbXZrZ2preXd6d1tnfXx4ZXJ9boR0ZXWFjIaVf2+LZmt6g3VtdGJcb3xrdXyMfIFmdYd9bXFndX54fn9yfWx6eoF6eHBmbGJuin5tblZrYHdVSmprT1JOaE5ZfGhiTlV2akxQVFVfZ3aDZl1gcWhnYVdpXVtraEpFa1piZFdZVXlaTlZtalldbGVcWmVjXnRmbWRxZ3JvdYF3cJmFdn9+d398hYd9dXOCiH+Vgm5zeHp6c3OFh4iIhHmBfXaPf3yEiY6EgoR7fouDe3d8d3eanZd6ioOGaXd9fGyDhJOAco+CcYWCfoF/b2ZsZlddW1xbVGRxZV9YY3N1aXVwZWVjV1xcaIBwb3KAdIllZXh+aXR2c3ODhXiAhHl3dHVua3twYWdrZ4Z0jYRuZl1ffXB7iX5pbXdmaWRVV3JwjaZ8hHx2lpBze3N8em57e5CFdph8h4aDhoN8dHBybGd1XG1oX2x0ZGdmaXpve3JZZ4F3dGdwgHeCdWJ3hYp8lIBui2pteoFxZnNlYG16Z3N3inx+YnWDdmlrcXR6cHl5c31mfn9/eXduY2ZiboZ8bWtWamJwU0tpa09MTnBHXntmYU1VdGNKTlNXYWp2fmVcZ3NpZmBWY1dicF1MS2tYY2FVVFVzVkxYdWRaX2thXFtjZV93Zm1icGlzbnJ/dHSagXd/gHd/foaFen11goR+l4VucnR7enVxhIWPgYB6i3V0kYB9gZSOgIWEfX6Mhnt+gHZ7o6WKeYiFhGx1fHt1g4KMem6Fc3qEfYGDdW5qaGVWXVtaWlRibmRbWGJze2lobWlgYldfWmmAamtvgGhsYWh5eGt0dHRuhYF7f312dW16aGp5al9lbmiBdo+EZ2VYYndpfod7b2lvZ2ZdVVhvaI+ndoF6fJCOeXVvfm9zdXmPgHeVdIWCf4WIdmpydmdobltsZF1sc19nYWl4aHttWm2CcnNpb4B+eXdhd4SEeI+Ecohxb3l/cmNxaFxvd2Rxc4h8eGJzgHBnanhzcmx4d3V3ZIN7f3d2b2RkY258fWtsVWliZlNLbWhPR1JrRWF4Z2FNU3FdSU1UWWVrd3tlXm1xaWRdVl9Vbm5XS1RoWGZeWE5VbFRKXHlfW19rXV1aYmVgemhsYW9vdW5vd3V6mH13gIF6gH+Hhnp4eoN+gZOEcXR0fnp2dIWIkH2AfZBsc5WBfIOfhX+HfYB+hoKAint2hKyff3qIh4RscoJ6doCAgXVuh298f3OJgGpvbWRkWF9aWVpVYmpnW1pedYFpXm5sXGJWXFxrgWZydH1pal1rdnZndHdxbYV7fX15dnJsemhpeGZdZHNoeneSgWNjVGVwZ4KFd3dmaGpgV1ZZaGSQp25+eICLjnpwcHxmeW96jHt2jnGEfX5/hm5kdnNkaGhca2Jdb29bZ19sdWR6aF10gG9ya3F7fXV1YnSFinqHhn9/d3J1f3VhcGxZcXRicXKFfHVkcn9sYWx6b2ppenh1cmaFdXp6dXBkYWRuc35pbFRpXl1US3NjUUdWYUdidmZhS1RvV0pMWFhnbHZ6ZGVucWZjWlddWHZlVEpcY1hoWFlJV2VRSGJ4Wl1fbFteXGFkXn9pamBvdHhtb252g5h5coGAfH+Ii4Z9dXaGeIeMfXR1dYJ4enqCjI59foSJanSXgXuLnX1+hXqBen58hohzcY+ujHt7hpB+ZnKIenR8fHZyb4Zse35sj3picG9iZV1lVllZV2Rma2BdXHOFaFhxblpeV1pcbHtjcHd2bGJbbXN0Z3V1cG2EeH6AeXdubnRlaXRlW2d1ZnZ2kXpfXVJlZmqCgnR9YmNpXFRYXmJjkKVoeXSChZB4bW55Z3htfIV7dYhygHh8eH9oZXZtYGZgXmpfXXNrWWVdb29iemVbd3trbm5wd3hzdGRyg5J+h4KIenZvcn1yYnhkW29wYnFxgnxzZnGAZF5udmlkZ3l6dG5vgXV0fXNxYl9mbm99ZGpTaFhZVE13X1FKWVlIYnRkYUlUbVNJTFpXaWxye2JsbHNjYVpaW2F2W1NLZF1YaVNXR1lgTkdpdVheYW1bW19iYl2FaGhhbnh5bG5qdoGQeW6DfoCBkoiEgXZ0iXSMhnRyd3aBd3x9foyPgH6TfnB4loN9mZJ5gIB4eX1/dIiDc3CZont6f4mVeWR1iHlzeHVsdG9+bHl8cJFyXnBvYGdibFRbWldoY21mXFxxiGVScm5bWlhYYGx3ZGl1ampeWm1zcW10c3RqhXx+f3x3bm5sZGlxY1tqcmR0do9zW1dTZGFygH9ygl1iY11TWmBbY5OfZXJxhYSRdGxqeWxvcHp8e3GAd39yenp6ZGZ2Z11iWmFnW153aFdiXm9oYXdgW3t2amlybndzc3RocIGUgoZ+hHZyanB8bWZ3V1xrbWJxc4F6c2Zvfltgb3FiX2pxfWxsdH5zcXhrcGFcZWxsemFnU2dVV1JQdltSUFlSSWNzYmBHVWpQSE9aVmtsa3xmbW9xYVxaWFlscFdSUGZXV2lTVEZaXE9IcnVYX2NtY1hhYGFdi2pjZG15eGtuaXV5hntrg32AhJl8goR5fYhuj4Zxb3d6fHSCgnyLj4OClnR4gpSFgZ+JdYCAgXN/gXCHgnVvopd0e4aLh3tmeItvbntvZnhwemxzdnKMa150bmFnZWtSXVtWZ2JsbFpccYxkT29uXVZYVWdqdGhidGVlXVpudW5xdXV5a4d8f3yId5BzZGRrbmFcbm1jc3iHa1pUVmJjeH19cYVdY19jVFtgWWOWlWNucIOFinNqaHpuZXN2c3xsenR1b3p+dV9mcmNbXlZiZFhhdWVVX2BtZGFxXV1+cGhpc3FzcHV1a22Ek4GIe4RxcmZufXByb1NbZmpmcXSBd3NibHZVYnFqW19uZXxlbXZ8c3Jzam1gWmRqandeZlRkVVZQVG1XUVdTUEhlcl9hRlhpTkhYVFZuaWR8aWt4a2JXXFVbdGRTUldoUVlmVFNIWlpQTXh3W19lbGlaYmBeXo9uYmZreXVub2h2dn9/bIOAfYaXe3+IgYp/a5OIcmd0gHt1gIN9iI5/i5NyfYqRhYefhnt/hoxzgIZzfYN2bqWMc4GNi3d4bnqMYGR8cGZ6c3lsbXF2gmdke2xjZmdoU15eVGdgbG9bXm6NaE5qbWBUVlNvZ3RrZXhkZV1ZcHRtcnp4c22Ie4B2nHt6a2FlbG1eYG9qZXB5fmdaVlhga3h8e3CEX2JeZ1ZZYFdknIhia3GBh313a2t4bFt2cWx6aXZzbm97gHJYam5fWV1VYWNXZHFjU15haWJibFpgfmxma3N1bm13dmtohYx/iHqHbXFmcHxtcm1jWWBoaW90gXRyXmlsUmVxZFRibmJ6Y3F2e3VrcG1rX1hhZ2h0XGVWYVZTTlhlUk9cT09IZXBdY0ZZaU1JX0tYbWRgeGhufmRgVV5UXXRbVFJgZk5dYVRTSlxZUFl1dl1fZm1oWGNhW16OcGNnandxc21odnR6g3OBg3qIjX58ioeOem6QinRsc4J0f3+IhYaRhJWPen2Mj4iRm4SAfIyEc3+Bc3R4cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo2Ojo6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo6Oj4+Pjo6Njo6Ojo6Ojo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8fH1+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA+LjExMTEvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREVCMS8vMDAwLz5ERERERENYaGdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMjy0aHR0dHBpohYKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1NTMfHR0dHBwcLjc1NTU1NE1hX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYeHiIiIh46QkJCQkJCMh4eIh4eHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWGhYODg4SEhISFhYaFhYWFh4mIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46RkpGJh46KkJKTkImQj4yOhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ojo6Oj4+Pj46Ojo6Ojo6NjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCMiIeHiI2IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJGNhoWGj4mMkI+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQj4eLh4iMiI6Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yMhIuHhoyIj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2Ii4yLjYyOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSkpKTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dXZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhnbWdqZ2hlaGdjYmJhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWl5dWVleYmFeXlpZX1tYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NUFFRUVFSVlZSUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRT05NT09PTk9QUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktKTklOTkxNT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0VTQlVQSEtPS0lJSkhISklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+PjxFRD0/RllDW1Y+RUVHR0dHQkREREZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozs8PEhMPT1DXUReYT5BRERGQ0ZGREZJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR1c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7PD49OkNgPlxrQ0FCP0FAQ0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Njk6OTk6RmdAXG0/OTg8PD1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09PT9EOz49PjtGaUtcbT46PD49Pz9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkBBP0A7XXBCPkRGP01kWF1lPj09Ozw+PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRkQ+PDw9QD04Ojpud0o3PDlFWmNgYGRJOzw9RDo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQFtRPDw9TFBJSHZ3Tzc4OVRobWdobGBBO05ROTs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BFdXlIPGGBhIB6e3dcRj1BZXJ0bG1ybU9GZk86PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQUlzeWtmhISDgoOAfWBYUUZicXJxb3VxYGBpSkBCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAR3B0fYKCgYN+fYR0SlNmWGFxcnR2fHRrbWNJSklJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFaXN9gXx/hH55hnFCSGRtbHaBhoeHhHRrVklNTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdge4B/eICEhYOEim1AT3OBhYeHh4eIhmdKTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTE5bfIKDhIOFh4WHglZshIeHh4aHiImIfFFLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklJSEhJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlaChISEgoKGhoWDgoWFhYWGhoaHiIaKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkBBQ0NCQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJZoWEhIR/gIODgoOEhIWFhoeIiIiIiYuOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4ODs7Oz1AOzk5OT08Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlqhoSEgX6Bg4ODgoOEhomKi4uLiomKi4yJVDs4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmaFg4GAgYODg4ODhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo5Ojo6Ozg5ODk4Nzc3OTo5ODg2ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1d3l7ent8fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9coSAgYOEhISEhIaJioqIh4iIiYqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw8OTo8ODo6Ozo5OTk8Pzw9QUJESUpNS0lLTFdvcnN1dHV4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/Pkh+hIKChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQUI+QEJAQD49Pj5APz8/QD9APT0/Qj9BQT9BPz1AQEA+P0E9Pjw7Ojs5OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCUoOCgoSFhIWEhomJiIiGhoaHiImKi4uLioqLiotePkRHSUtKSUZHR0RGSEdFQkFAQ0VDQ0FCQ0I/QERIRUNFREVFQUZFRkRFRkRAQj88QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDQ0ZYhYKDhIWGhoaIiYmIh4aGhoeJiYqLjI2MjIuKiohXSExNTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT9CQkdHSlmFgoOFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxKSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpPTU5MTE5LR0dHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RUdHPTxAQDg4PDs8PTo/QT5AQENGSUpRYIKDhYSFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpISEVKSURKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1VucHV3d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo8OD0+Oz1BPj9ARUhKTFdyg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMi4uLi19SUlBNTk1LSkdGQkdKR0xKRktPTEtKSk1NTE9QTkhJS0xPUVFRUU9PSklKSkxKTEZHSEdFR0lGRUVCQEJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FIS0xQV3mFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pERUZLT05PV1ZRUE9RU1JNU1RPTVNMUFNVV1JTUVBMSk1NTUtOR0dKRkZISkRERUVCRENjcHV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0NCRlZORk9QUFRZfIaDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyPi4uLZ1ZVa2FFUlFRUEk7O1FTUmB1XVVWVFZZWVJZWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tISEpIRUZJSElISWlydnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUlHR0ZFPz9BQUVCQ0dFREVMWFJNVFZWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUT9AVlVZXGRgVllicl5dVl1aVkVRWVpbWV9UWmdSVVZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1NYWlpcXHmFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJUUlZWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lJWVhZW11YWFlXUlFOUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSUZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1VUV1JRV1ZjloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXFtcXV1XUk9TUFBRVlZWVllabnJ0d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVFNUXlpYV1dXemtYWltcXlRRUVBJTk9XVlhaWmRxc3Z2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVVFJPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtNTktNS0hKREZIRUM+U2NVf1JRUU5LUlRRTU9ZUU1OUVNVVU1RU1JQT01MSENJSFJUVVpcbXJ1dnVzc3d7ent7e317fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlZVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDP0NDQ0NCP0RQQkRAQz5CSEdWQEhOTUddaVFIRk9GREVGSEdIQkNIR0hLR0NCQURAT1BNU2RzdHV1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJbWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUU09WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPz87Oz5AQD8/PmtRS2FFRkhJRUI/R0xNR01RVUlCRT8+PD08PT0/PT9BQ0M/Pjw9Qj5KTUZVbnV1dXN0dnh6fHp9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSUpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9e3h6fHx4d3hkQkBAQj06QkNBQURCXF1Pe05PT05LTE1PT1FMS0xXTUhHQEI8OTc3NTk5PTs7Ozg5ODk/O0JIP1x0dHV2dXZ4enx8fH18fH19fn58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5gZWBdXnF2a15gZ2t3b29sam9ubmxmYlhHRkZIQkFHSUVFRkRNUlBhV1JYUVBTU1JVW09PUVdQTUpDRj46OjY0ODc5Nzk6MzY2Nzk1PEI9ZXNzdnd3eXp7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUxUVFNRUVVPTFJTVFdYVFRYUUxYWVpWWFhWWFldV1dYaHNrXVZhc2thYV9dZGFfXllVUE1PTkxISEpLSUhGQ1FQU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU5OUducXR3eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RVVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMUFJST01NTk5OTEpGUFBVWVNUTkpPT1RTVFxWUlVTUk9NS0lISEY/Pz06Nzg3NjU5OTY3NjY1V3Bwc3d5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0lHT1BPT01SSk9QUFBOTk9UTE1JUE9TVFUyPFhNSUFRPWNhUVNRUE5QUVBOTk1QTlRSUFJNSUxLT1FQUVJTVFFST0xNS0xMSENCQT06Ojg3NjtCNDU2NjtlcHF0d3h7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRkFGR0dIRkpESEpIR0VITEhLSEZMTVBNRy9FX1I+M0A+am9hUlJRQEZVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc2RG5xdHZ5e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hFRkhKTktFR0NPUkM4RU5TXWZTUVNBR1VQT1FRUE1NTkxKTEtMTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlUcXN1eXt7e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRXV1VMTEtIPTk4Nzs/QD48PUFAQj0+RUhHREZGSUdKSkBGQUFARkhFSk9IUFJhXFFQUk5TT09QTExPTUtNTE1PTltXS01RT0dJSENJSkxMS0ZGRkQ/QkM+PEJGP0I/QWRxdXh7ent7fHt6end8d3l9fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPjs/QkBAPkFESUVDSEdJR0lFQkI/Pj1DQkFHSURNT2JlUU1PTldLTE1LTE1NTExLTk5TZE1KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLb3B3enl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9IS0U/Qj05OTk6P0I/PEBCQkFERUdLRkRJSUdHSENDP0I/P0BBPkNFQ0tOUVRMSklNVEZJSUpMSktLSUlMTU9QUlBLR0NLR0NCSkpMTU9NSUpJR0NDQ0RJSk1MSVpzbXh5eHp7e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FqcWhlcUhLREdISEdKS0lKS0RHQj0+PTo6OjtAQj89QkJDQ0dGSkxKRUlJRkdIQ0M7QUBCPkBAQ0VESU1QR0lLR0hLREhJS01ISkxISEpMS01dUklIRE1GQURLS05NUE5LTUpLRkdHSk1OUU5MY25pdnZ3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRvRktERkVHREVFR0VHQkNAPjw9Ojs6OkBEQD5CQ0RFSUZKSkxGSUlHRkZEQjtCQ0M+QENDQ0VHTE5IS05IREhFSUxOTUhJTEdFRklJTE5LSkhFTkhDR01MT01PTU5OTUxJSEpPUlFSTlJmZ2Zyb3N4dXt6fGxoam5la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkRGRkVCQkJFQERCPj8+Ojs7PTo9PkNBP0FDRUdKRklJTEhHR0dGRUNAPUVFQj5CRENDRUdISUdNUEpGRkdLTk9LRkhKRkVERUlJSEtJRkhQS0RJTUxQTU9OT09OSkpJTVJVVFJPV2RgYW1ncHJvcnl6Z2VoaGNpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0JBQkQ8QkE+QT06Oj0/Oz4+QEI/QEJER0tGSUdJSEZGR0VDQkFBRkZDQkNCREVER0dIRkxRTElPSkpMS0lHSEVGRURDSUhIS0pHS1JNQk5PTVFPT09OT09LS0tQVVdWVVRYYF5caWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3FyamtzTUdHRkhCQkBERTxBQUBDPDg5PT45Pzw/Qj9AQERGSEVIRkZHRkVFRENFQ0RJRkNGRUJFR0VFRkdFSk1LSFFNSktISElFRkhJRUNJSUpLTUtPU05EUVJQUVJOT01OUE1MTlNXVldYVlhdWl1kYGhiamlna19lZWdjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpb3pNSEdISEJCQkZFPEBCQkQ8Nzo9Pjo+OkBCPj8/Q0VGREZEREdFQ0VDREVGR0pFRUlHQ0dIRkhGRUNGSkpHTUpMS0lKTEZJSUtIRUtLTE1OT1JUT0lTVVRRU1BRTU5RTk1RV1pWWllWWl1aWGFgYGBeaGVjYGRlaGdqaWhqZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3RucHJzeU5JSEdJREFDSEU8QEVCRT04Oj4+PTw8QUI8Pz5BQkZDRUJDSERDRUVGR0dHSUZHS0hDSEhHSUdGREhLSUdLSE1LSktMSExLTUtJTUxPTk9SVVZPS1VWVFFUUVJMT1FQT1RZWllcWllbXl9eYGJeXGFja2JgZGdocoVoZ2lmam1ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnF1TUlLSEpFQkVHRTxAR0REQDo8PkA/Pj9DQjxAPkFBRkNFRERIREZER0VISEZIR0lLSkZKSEhLSEZGTEhISEpHTExMTExJTUtNTU1PTFBQUVVWV09LVlZVU1NSUUxPU1JRVltbXV5bXF5fX2FgYWRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2b3ZKS0xKTEdCRURFPEBGRERCOz8/QUBAQERBP0I/QUNIQkZFRkdFSUVGRElJR0lISk1ISEpKSUxKRkpLSElKSkdLS01NSkpOTE5OTk9LT1BSVVhWTU5UVlVTUlFQTE5UU1JXW15eX11dYF9hYWFgYmNlYWNoYmRpamd2i2xraWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZvd0pNTExNR0REQUQ8P0VFRUM9QUFDQkJDRUJCREFBRUdDSEhIR0ZKRkNHSUdHSkZJTEhKSk1LTUxHS0lITEtOUUtSUUxTTUtOTk9QUE9UT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmBiXmBlYWFiZ25oYmloaG14dmxoam1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE1MTExHRUFARD4+REVGQ0BDQUVEREZDQ0VHQ0NJRkNISkpJSUtGREtKR0hKSUlLR0pKTktOTElMSEpNS1pmSmRcS2xTSE9OX25Va3NbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUYHd1aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlLTkpLSkZDP0BCPz1ERUZEQ0RCRUVFRkJGRkhDREpFRUpMTUtMTUdHTUlISUtIS0pJS0pOTE1NTExJTE1MW3NiZHBebG1VTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpyeXZrYmBrZWVteW1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QkI/PUNGR0JGQ0VERUVEQ0hIR0RFS0dHTE1NS01NR0pOSEpLSklMS0pKS01NTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtb3ZcWWxRXG1tWnFta29teHh0c2lwXF9ya3FqVXV5eHBjXmtmYmdxcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEVFRUJCQj0/QEZHQkdESUVFREJGSUhIRUdLSkdNTU5MTU5ITE1JTEtISk1JS0pKS09QT05NS05NTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkdFRlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2hhZGp1eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHdJTUdJREVFQ0FCPEJBQkZER0ZMSEVDQ0hLSEhGSkxMRk5LTFNSTEhMTEhOSklITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210Xm5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZ2Jiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dEhLSElCRUVFQUA+Q0NCR0NISU1JRkNGSkxJR0ZKTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTU1NTUlLS0tTa2JaaV5famNyclpfWWpvX2VlVWtfY1thYlFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSURFREZBQEFFRERHQkhKTEhGREdLTElFRkpPTElPSUxbUUpGSEhLTUlISkpLS0lISUdLS0xLRkhLS0xMTEtJS0xOVFtcVFBUTFBPTk9PVlFPT1FPT1FKSU5QUWRxaVRZV1tbXFVZWl1YXVxcY2ZhYWZiY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNIQ0VHRkZBRUM/Q0dDRUdDSUtMSEZER0tMSERHSFBLTE9LTFdMSUVFSElKSElLSUxKSEZIR0pHSElFRkxJSUtOTElPXFdeT1xbYF5PWFlTXFxiXk1ZWk1YYVJKWWFaU2BkXGFYW2RkVlZYXFlaWFxWWVxdYl9kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJESURHR0ZLSktIRUVKSkpHRUhIUEpNTUpNU0lIRkFHRkpJS0tJTEpJRkVKR0RGR0VFSkhDSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5eXF5TW15jXlpdYGNgWV9iW2BeW1RYWFleXWNjYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUlERktLS0ZGSUpOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlEQ0NFQUZKREBKTEpPW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXl5jYWBiYmJjY2VaUVlWVVxZXmRgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtHQ0dFQkVHSEZHSElGR0pHSEZIS0lMRERLS05NTExISkpISkc/R0ZOSktLTUtLS0lHR0NEQERBSElBP0lKSE9dYVpbZF1fVFFTWF1cXFxfWktXXExSXFlJTV5QT1xfYWNkY2NiXGRjYmRjZlhRVVRTW1haYV5eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktJRkZHSEdHSUZGRklMSk5FREtKTE5KTElLSkhJR0JISFFNS0tPTUtLSUhHRUQ/RUNISEFBR0ZFVF1ZXlhfWV9bXVVYWFBdXVFLSldeWF5bXVZaYFJRX19iYmFgYmJgY2JiZGRiWE9RUVJbU1teXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIQ1JLRkhISEVGS0pNUEVHSUpLTkxMSUxLSUlIREhLUU9NTVBMTUtLSElDREFFREhHQkFHRUNXVUVcVF1TVl9YTlRVTlpbTUpLVWBhW19YX15hXU9ZYl1gYF9iY2JdYmJXX19UUE5QUVhSXVxbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERUZHRElSYlBEV19JR0dIREZNSlBQRkpJSktOTEtLTEtKSkdFSk1RUU5OT01OTE5IS0FEQUNERkRDQUVGQk1IQ0xMUE9PTEZNRkdJSkhHTExNT1BJTE9QUFNQTFBUU1VaWVdZWFhkVk9TVFBQT05QVVRcWVlaXVxgYWRlY2dja2xwc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdIWU1HSEpIR05MUVFJS0tLS05OVU5PS0tMR0dLUFNTTlBPTk9OT0hLRWBFRF9MRGZjRU1bSV9cc21PTVZtWUxDUGBVbFdnSl1XVV5ETFFVTE1UVlFTVFhXVFhVVFxUUGZaaGhkWFNrVFdWVVtcW2BgYWJiYmBmaGZubGhyenx9foGEhISDg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1NJS0dgVEhKT0pJT01SUUtMS0xPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpQf1FJfFlZcnNXUG1IcW5wYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtgVlVXf2p0dXVfYHdgWGFcXGZbX2FhYWFeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMRkpMRlJWTEtOSUtSWFdRTk5OTFFUTk9RUEtMT0dNUFNbWlRRUk9QUFBKSFp4XVR4ZWhZUlRRdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvcIFdZnp1eHFxenF+c31rdX1iUmd8ZXNzb3NzfH1vfXlvf3JfYGBiYlpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1IS0tISlBOTU1KTlZeWVVMUVNOWFpMU1NSTkxQSVFSVFlXV1BUUFBQUUtHZnhsY3hybVpLTFV5cHVtdWJudlBkZUlmdnFtd2+AamZ4eGlYc1Jpe21panp6fWx4en9vZ29YdnZqdXVwgGBzaHxpbHh8b15fX2NiWl1iZGdpamVnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdXpufH15eHJuTktTdE5DQkVQUEhKS0pMUE9PUE1QWmBaWEtUV1BhXlJWUVlTTVBJU1RVWFdXUFVQT05SSktyb3V1cXVxZGliV25McXBeRmh5V3ZUTGh4fXhgeXtzbmFebW9kUmdydW5teXB3bHZ0dHFsbVx0fnprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZmVeYWJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRyb21MTFtWSEdFR1JQSkxNS0xRUVFRUFFXXFlVTlZZVWZYUlJZXlRNTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlZYbE9ubHtzYWpnf3ZVS1draH1sbWx4YFtwenteYHpzY3JveHFoZXxpcntdVEtsYHZ1a2l1e3ttfnhrfHBdXl5iW15iZGRnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3Nya2htbXJ8a21oa3t0bW1rbU9ISktISUlIUlFMTk9NTFRTU09UUldSVlRQV1pWVlRUVGFgUU9OS1RTU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWFFOUFVUWFhYW1tVUlNXW1dYV1pPU1VXV1hSXVlXXVZUT1lSV1dXWFlfW2dyXltbWVxdX2NaX2NjZGZkY2NiWmNjZmZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLTExNS0pTUU1RUE9MVlZUUFRVWFVZVVJaXVZVVFdVWVhQT0xNVlRRTlVTTk9NTFFQS0pRUktRTUtLT1JUUlFRU1NJSExOT1FSUVFRVFZSWFdcV1NTUVJVVVZTWlFPU1JXVVRZVlRZVVRSVVRUVFdYV11aXmFdXFpaXFxgY1xdYmNkZ2VlZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRjZmhQSktMT09MTVRQTlNRUU1YWFVUVVdXV1pWVFxgVldWWVVYVFFQS09XU1BOVVBOUU5LU1BNT1VUTlFOTU5RU1BUUVNUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdXV1lbVE9UVVhVVFlVV1lVUlJYVlVXW1laX11VWF9dXl1cXWFhXltiYmNoZmVkYlhfYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVtaWFdYWlpYWVZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBQTk1RUVBSWFRSUU9NT1NVT1dSVFVVT05NUVNVVVRUUlRYVlpdXFpWVlFSV1hWW1tXUVRWVlVWWFRXV1RTUlhWVVpdWV1fXlZeXV5gXFxgYF9fWmJiZGhoZWRhWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRkYmRfX2BcUE1OTlJRTVJST1NUUVBVXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTFBTUlVaVVRQUExQV1ZSV1NTU1hNT1BSVFhVVVVTVVlYW15dXFtWUk9VVlZbW1dRVFdVV1hWVFhaVFNRWldWXF5aX19gVWFcYGFdYGJfXGBdY2FjZ2hkZmBZY2BhX19lZV9gY1taXFtcWlpZWVdcWVxbYF5gW15eYWBfYlxZYFpRTk9OVlFQVFJPVVRTUFdcXFxYXlxfV1xeanF3eYBjXFtWVlhSTk9XU05RUVBSVFJLUVRUWVpXVU9STlNYVlRTVFJSWk9RU1NWW1ZWV1RWWlhdXlxcXlZTTlRVVlxcVlJUVlZYWVNUWVxUUlJcV1pdXl1hYWBXYltjYl5hY19cYmFiX2RmaWRmXltkYGFgYWNlX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQW11eXVtgXGBVXF1panJ9c2xnXFVZV1FPUltTUlFUUlRVVEtRV1ZbWVpTT1NSVlZVU09WUlNaUlRVVFhcV1hYU1hcWF5dWVpdVFVOVldXXltYUVRVWFlZVVdZW1RTVl1ZXV1gXWJjXllgW2ViX2RkXl5jY2FdZWZpZGZdXmRhYGFiY2RfYl5YWl9bXFtYWFhYV1taXGBdW1tcW1haW15WXlldUE9PUlpQWlVVVlZUVFReXmBeXmJcYVVdXmJreXRsfWxaVVpVUVFTXFRVVFVUVllXTFJaVl1bXFJPVVNYV1ZTUFhSU1dTV1ZVW11YW1lVWl5YX15ZXFlSV1JZWFlfWlpTVFZaWVpWWFlcVlVaXVxeYWFfZGRdXl1dZWFiZmReXmRjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWldWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9gYWFgY11gVV1eYmVldYF6aFhZWlRWU1ZcWFdXVlZXXVhQVVxZXl1dVFJYUldWVFJUWFJTVlRZWFldXlhdW1VeX1hfX1hdVlFZVFlaWmFZXFVWWFtaWlhZWVpYVl1eX15jYmFlZV1iXGBmYmRmZF9fZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOU1pWU1xUVldZV1ZcYGFiY2FkX19WW2BkYV96dW9oWVxaVlhVV1taWVxZWFlgV1BVXltgYVxUVVhQVVZVU1ZWUlNVV1taXF9eWl9cVl9fWl1eWV5WU1lXWVpdYlpeVldbXFtcW1tZW1lZXl9gYGRiY2VlYmRaYmZjZ2ZlXmFiYGNeY2NpZGRnX2deYmJjYWFgXl9YVFpaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU1BWWlZWWlVYVlhXWF1fYmFkYWRhXllZYWRiYGxmaF5cXVtXWFhZXFxcX1tZW2JWVFdeXWFjXFJWWFFXVlZWVlZTVlRYXFxfYGBdYF1XYV5bXlxbXlhWWFhbW19gXF9YWV1cXV1eXFpcWFtfYV5gZGNkZmZmYlljZWVoZ2ReY2BfZWNdZmlkZWlfZ15jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOUldZVldaWVtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX1xcXVhXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFhXWFlZV1ZYVl1dXmBhYV9iXllhXV1eWV1eWVhWV1tcYF9dX1lZXl1eXmFcW1pZXF9iX2JkY2VmZWZiWmRmZ2lnY19jXmFmZFppaWJmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWFdaW1pZV1hWVVtdXV1gYGJieExXV1xZV11cXF1aV1xdX2BiZGJiYV1gWGJjYmBjYWJeXFxcWFdbXV9dYF9dW2BkXFxYWmNlY2BSXFlPWFdZW1pZWFpZYF1gYmJgYWNfXGJdX11bXl5aWVVYXV1fYF9fW1peXmBiY1xcV1tdYGJhY2VkZ2VlZmRcZWZoaWZjYmJcY2dgXGlpYmhpZmVgYmFjYV9gX11dW1lcWVhXWFlYV1xbWldXWFBYWl1hY2Zmcmt/SllXXVpaX11cXlxZXVteX2FjYmFhXWJbYmRiYGNjYl1cW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlFZV1xdXFtaW1tjYGNiY2BiZGFgY15gXF1eX1pYVltfXl1hYV9dW2BhYmViX11TXF9gY2RkZmRnZmVmZV5lZmhoZ2RkYFtmZ15haGhjaGhmY2BiYGNiX19fXV1cWltZWFhYVlpWXFpaVlZVTVhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYOBg4OCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7fHt7e3t6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t8fHx7e3t8fHx7e3t7e3p6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYmJjY2NjY2NjYuJiYmJiYaz1tLS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjIyQkJCQkJCQjYyMjIyMiL/p5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh4eHh3eHd3d3d3d3d4eXl5eXl5d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fX19fX19fX18fHx8fHx7gYSEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnV1dXl2dnZ6e3h7eHd2eHt4eXp6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3p6enp7e3t7e3t6enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHx9enl8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d5fX59eXt6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3d3x6fHx6fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6fnt9fXp8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl8enp7eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7e3l4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx7fnx9fn5+fn5+fX9/f3x8fYCDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgIB/fn+BgICAf4CBgYB/f4CBf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn6Af3+AgIR/g4F+f39+fn59fn9/fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn9/jH6NhX5/f39+fn5/gIB/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYKBgYCAf4GXgpSMfn+AgX9/f3+AgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKEhIKChp6Gl5SAgoGBgoKCg4KDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBgIGDgYKKoYiZmoeHhoaGhoeIh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4KDhYSDgYGBgYujipqciYaGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDg4KAjaOJl5yIhISDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgoKCgoGNo4+WmYSCg4GBgYGAfoGAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCBhI6EgYCAhZ+mqaiXgoKBg4aDf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoSEgoOKl4mEg4SYraerrKCOgYKEkISBgYCBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoWGhISDg4OChI6Zj4WFiaWhmaWjm56JgpSVhIOCgYGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GBj4yDgX9+fXx9jZ2Zk4SIn5SQn5yUnZWSno6Cg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4GWl4mAfX19fnyCl5OhnYyTko2YmpSZoaGbh4GBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioeDg4OEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgJafi35/gH2Hi3+EhpWopZ+SkZWPiZWgnZmEgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkqCKgIyFfYaIgYCGiZyhopCDf35+gpadkYKDg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOKkIKEioWDgoF/f4OIj4+GgH9/gIB/go6Gg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgYKCgYiBf4CAf4aCf3+AgICAgICAgIOFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICAhYV/f39/gICAgICAgICAgIF/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDg4GAgIGMiIGAgYKCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiYuLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5COioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgICAhISCgoKCgoKCgH9+fX19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SEgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYKAgYOEgoOCgoKDgX59fn5+fn5+fn1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4aJiYODhIOFhISFhYaIh4aFg4KCg4WHhoeGhoSCgoOEgoODhIKBgYGBgYODhIODkZKQjo+Oi4eEhoaDgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKEhIODg4OCgoF9fH1/gH5+fn59fH19fHl8g4aHh4SDgYODhIWFhYODhYSEhISEhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gn9/gYODg4ODgoJ/fX1/gICBf31+fn18fX17enp+hISEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4SAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORj4+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fYCCg4OCg4KDgn19fn+AgIGAfn19fX1+fXx6enqAgoKBf39/f35/f4B+fYB/f4CAgX+AgIF/f4CBgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoODg4SFgIB/fH19fn19foCAf31/fn1+gYODgoKCgYF/fX1+f4CAgH9+fX19fHt7e3p6eXqAgIB+f39+fn1+f35/gH9+f3+Af4CAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEhIKCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXuAgH9/f39+fn5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+fn18fH2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2BgICBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19e3p6eXl5eYCCgoKEg4GCg4F/gYCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKDgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4OMhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYOCg4OCg4OCgoKCg4OCgpKQi4iJh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoaHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOFhIODhIOFhISIko6MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GBgYOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYGEkpKOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+fn6Agnx8f3+CgIKAfnx7ioJ9gH9+gYCAgIKBgoCAgYGAf4uUj4yLjo6NiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gn+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJGMjI2OjoqFhoeFhISFg4ODgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYyNjo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6Eko2MjI+Ni4qGhIaEhIODg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+Af36Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9f4CAg4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoWChIOCf4B+f4KCgn9/goJ/gIqPjIyLjYyLiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+Af4GBgH99gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBgoGFhoWFhoaHhYGEkY6Mi4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f3+Af3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fXx+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5/f4CAg4eJiYmKiYqJhYiRjYuIiYeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX19fX18fX19fH1+fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6ChYiHiIqLi4uJjZGOjYmIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSDgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImOkI2LiIiFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI6NioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX18fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgICDgX+AgYSBfn6Af35+gH59fn6AgH+Bfn+Af39/gH99f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8e3x8e3t7fHt8fHx9fIqKiIiFhYWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIKAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBgH1/f3+AgIGAgIB/fnx9fX19fn59gn2AfoKAfX6AgX98fn59fX17fH58fXx8fHp8e3x9iYaGhYWHhYWFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6AgoB+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhYWDg4OEhIODhIKBgH+Af4CBfn19fn9+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goR/g4KCgoOChIKBgYCAgoGAgIKCg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4CDgX+Ag4J/f4B/gX+Af3x7e3p8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fH9+f4B8f399fYGAgH59fYB/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgYOEgoGAgYB/goCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4ODgoOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX5+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoOBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gICAf39/f3x+f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5+f4CAgIB/gYKBgH9+f4F+f4CCgoCBg4KEhIaEgH59fHx8fHt5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX+AgIB/f39/fIB/f4GAgYCAf3yAf31+foB/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKBf4KDgoOEh4SAgH58fXx8e3x1eHl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgICAgX97gH6AgH+BgYB/fYB+fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYODg4OGhICBfnx9fHx7fXh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cnmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf3+BgHyAf4B+f4GAf39+gX9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd8eXd4d3d4e3t7e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXJveHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn+AfXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH9/f31+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+BgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGBgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYF/gICAgIGAgIGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8eHh1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDf3+CgYSDg4SBgYOBgoOBgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9/gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhIR/gIOBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9f3p5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYOBgIGAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChYaEgoODg4SChIOBg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDhIOBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgISFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISBhIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KEg4ODgoOAgoWDg4ODhIODhIOAg4SEhYOCgoODgoGEg4GDg4SDg4SEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5+fn9/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIKBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhIWCh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF5g39/f36EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf319fn5+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhIWFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg3+Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGhoeGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnOEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW53bHB5bHV9f399foGAgX2Af32Af4B/fX18fH19fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHWCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gYB/e399fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+g3SIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRyam95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhIaHhoWFhYWHhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhYWDhYWEhoaGhoaFg3iLeXKIentwcIWFeIV4eWtzfnl7a3KDh4N6fG17enl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXp9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSDgYODhISFhIWEhYSGg4aHhYaEhIaHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWDhoaGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fnt8fH1/fnx8fn2Af31/gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aGgoOFhoaEhIOEhIOEhoSFhYWFhYOGhoWGhYWGhoWEhIWFg4SHhYOCgoWDhIF+gIB8e31+e3x7fn59fHx+fX5+fX9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGh4aGhISGhoeGiIaEhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoSBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDg4eDhIGChISDgYCAgHt7fn18fHx+fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoWFh4WFh4WGhYeFhIOEg4OEh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH57fHx7fHx9fXt7e318e358e3x/fX18fX1/fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fImHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiIqHhYeGh4eIh4WIhYaHiIaGh4eGh4eIiIeFhoeGh4WFh4OEhoWEhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOGhYOBg4KAg4WCg36BgYF/g4F/fn5/fX98fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHioeDh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGh4eFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIaGhoaFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWGgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOEhYWDhYWBgIODf35/gH9/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5enp8eXp6e3t7fHp7e3t7fX59fYB9fXx8fYB/fXyGg4aGhoaGg4SDhoKFgYGAf3+AgH5/gIJ8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYWHhoWEhoeFh4WGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhIODhIOFhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt6enp5eXp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+Oj06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8Ojw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dXU1NXV1NTU1NTV1dXV1dXV1dTU1dXV1dXU1NTU1NTT0tPT09TU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19XV1dTU1NTV1dXV1dXV1djY19fX19jX19fX19fW09LS09PU1NPT09PU1NXV1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNhG1wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4uLrR09PT09PT09PT1NTU1ce3ubm4uLi4uLi4uLi3vdPS0tPT0tLS0tLS09PT2+Lh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QT0+QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzk4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6Knz9PS0tLS0tLS0tLS0tS9oKOjo6Ojo6Ojo6OjoavS0tLT0tLS0tLS0tLS0N/r6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pzs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzc5SKzExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSjqM/T0tLS0tLS0tLS0tLVvqKlpaSkpKSkpKSkpKOt0tLS0tLS0tLS0tLT0tDf6+rq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs8PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183PXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqazP09LS0tLS0tLT09PT1cCmqKipqampqampqamosNLS0tLS0tLS0tLS09PR3+rp6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcXCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs7Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLS1NXV1dXV1dXV1NPT09TT0tLS0tLS0tLS0tLS0tPU1dbW1tbW1tbW1tbW1tjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7O09TQz8/T08/Pz9PSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1dTU1NTU1NbW1tbW1tbW1tbW19fW1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7O0KaSxdLQoZbL08eSq9HOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A9Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7O0qqdrJTOqKCrn8+ZrJqy0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD9BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MmXmYWmpJ+WkKG0lYadnM7Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PTo2P0JAQjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RpLC9moqdoKeZtL/Jl5nG0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9DVuZmdpZ6MoMTSkpmgztDQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz8/Q0ZqdvZvFyZTZraO/ntXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDQ1aekosadk5aju82IlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0sCdos2ym66znaXQ26OZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem09SkoI+7rJ+aoZyckaeYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocjGpr2Vk5ihqZ+inqiiqZ3Q09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xBPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDUyo6Tl5Cqs42QpdSako6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZHS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tTCr7Cz0dbAvdbU07nI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR1NbW1tLS1NXT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PS0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKhoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ6dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5qXl5iZmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5ibmpmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXmp2YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OkoqGgnpuZmZiZmZmZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGhoZ+enJuampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5qbm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTw8Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpuampucnZybm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuamZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmZqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZibnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSSi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIKGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfomQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiYmQj46PlJSYkJWcmp2eqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVVYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2boqGVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnZugnaSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqqmvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qlp6Spq6+spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq+qqqukoaKkqaemqaijopybm6SgpaijoJidmJ+hoqmnoKKirqyrqqetr6ilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6WnqaepqKOnppmcpKaioaGhoaCcmJmfoKGkpKKenpagm5qioqChn6GiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1cUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnrKmkn6Kgoqahpq6mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpuYpKKipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2eGJfXFVZUVVXW2Nec19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rq6yoqKuwqaiqqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWem5+fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1pgX1pcVlxoZG5jbmppYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5udoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ5amJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6almaGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh1a3FoaWlhWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLG0tbW8vL68vL7Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWvs6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllUYWlgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGwsO5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmtjYm53dXZubFtiUVZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWttZm51cXJ1cWdeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmmpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtsbmRvbWlxeG55aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7y7vsS+xcjGxsTEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpqy0tayupaSjqKSgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcnhzeWZmXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbJxb/DwMvNz8rGxMPDwcS+uL7Bw8DEv8HPz87Hq6+2tLWroKe0s66ruLWzrKmjoa2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWZpamhdam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM7Pz8zDx8bIycjIycfFycfIx7/Fx8TEyczK0s/Tzry4trS4uMG+vrq9ury6vKytpqq7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3Zoaml0bXhsXWRbVmBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDOx8zJwsLHwsvLyMbMys7FxsXDxcrHytDN0MzHxMDDwsnNx8XBxMfBvL60sLCwwb6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW50Yl1iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDxL+/vsTLyMrLyby7yMbIzcjDyMnJxcXDwsDFtcLJysi+xcfIzcbLz8W3wMDAwLu6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWZjamRham1ub15ZXFZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O6uLm8vsHHwca7ucfQysTEwMPBwsHDwsO+v6G3wcHBoLrHzMvFyNHCsL6+uLq7u763tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWNkY2piZ2NbWlpcWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tri0tLW/u72/ub66urTAuLW3sq66u7fAt7zL1Le7wMG8u8W9u8HEv7+Sp73Cu3qpwMnEwMDKwLHBv7u3u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xY2BiY2hqZ2ZpZWleVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS1sbC1t7W7wbi+ub+8vLe0t6+ut7W5v7vB3pd+ybzDtbrHt7a5u729ipu9xrZglcDFwL+8wb64xrzCv7zFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4F4cW1lZWZvaWVraFhYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm6u7+80Mt9gLjEx7e5uK63tbi9tYCRvcisVnzAxsDAv728v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d8a25wZ3Brc2ZhbWBcVElLSkRKQkNHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7sr2+u8S2tbi1t8C+xLzCxNaqdHeQxs/CwLivtbW7w6p5ib/JnVVmtcvDwr+/vr3HzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaAcmZsaW50bnhjZ2JbY1FLVEhFRUNIQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsbm8vbK8vrzFuLG3ub7KysjDxsvOinN0jszRzMrEtbrAxM6XcYXBx5BYWpfOxsK/wrzAw8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYGJOSU0/RUA/REM7Ozo6Ozo4Ozw6OTw+Ojo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS8z8y8ur68xL63vbywr7+9wcvJsXp1eo3GzMvNysbCxMvThG2Cv76GXlh6ysbEwcG/xcDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh6bW13e19wY1tdX19UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy2wLjL2L2+tr/Av6+Fdm97doSXtJlxeXuPv8fLyMHDwcDJy3Npe7m0fGFXaMbGxcS/wMG/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem5zeHNncF1bXl1ZUkVEQ01JQUU9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a7u8VyfMHMvLa5w62HZ1tjXlBbX3B/b3Z8krq/xsC5wLy+xsJlYXKts3VhVmHBx8PDvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fXZsdXtwbmlbX2BZU1BBRkhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucXKdGeGtb22tp5uamdVX1tJTFFTXm9zgZ64uMK6s7u3u769YVpkoLR3XVRnwsPEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GwtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdXZ3bnFgX2ZdW1RKPT8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620tbfHxnx0aYWltphiU0VfUU1pZVNMSFBxeIihsLe+ubK1sry6u2dVV5i8flNQcsHExsTAvb+5s6+xvLquu7Szpquorbq+uMvCv76sq7Cvs7u3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NhW15PSEI/PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3w7mFem5ujqBvT0lCa1JDXHuHh1tGV4imp7C2urW0sqy8urp0VVCFt4FMVIK/wcfDv7m6ta2lrbaxprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJtY11mWFxdUk5OQT5KQkFKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLq9kYF3coV+V0ZCV4hRS05hfYd+UUNPhrqys7WytK+su7q6hGZbeJ+BXHGXubu9uLaysa2roK2uqJ2jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXRpbF1balRdXFBNSERGTEJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWyv6GHg4R9ZkxAVXpwTEpMToerb1Y/c765s7SysLGtsLq3q46DdIWlqampra64r6qrrayjqKy0p52XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7Wqk42Qm2NFVp15UldIUWFJfH9jY3euubKss6+urK23qZWNnaSppJ+cnJ2dp6ieoKiooam3sZ+Wl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moq6ufpqObo5yVkIyPj5CTkJeVlpifnp6amaaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/emN3bG5cUWhUUE5HUE1MQk9RQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyqubKeorVRQXqdd1hrSlVjaXZ1ZGp6nbK0qrK0rqqrqZKUq6+nnZCXk4+YoJ6hoJykpa2nqaCalpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqqxo6WonqCclZOQj5GQmJCWlZiXn5ibmZukmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV2fW1re2RoVVFjTUpIR09STUpORzxFQDwyPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGooLDBub18T0tsqlxqfnF2U15vYWBtaICWsa+us7Wqp6Gho52ZlI2QlZeYmJyfoqKbn62qkJeXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWalpuXl5ihn5ycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eHxkeXlgYlJVYEhJSktTVElSUEw5P0E2Nzw2NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZ2hw8GAVVZmcH12bWZ6clRfYmRqbGJscJS0sLC4rKahnZ6alZiamZCOkZWRjI6OlJyjjHaXmpqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrC0qrKuopmcnZ6hmZubmpiZm5SWm5aZnaWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dnZzaIJsZVtTWlpNUUpOT1VMU0xBNz5DNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6KanrGlkHtthnBiZVdRXFVXS05VWlRPX1lstLOrr6efnqKgl5GUm6CbmJeSk5+coaSYhmx1nZufl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuK2ytKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCeo6GgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1and1XWxaUmBIUlVIRlVWSkJMRz1LSDhGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoaKEZFpfaWFWTlBGPz9BREVCR1JMT6i2qqmkn5+ZkpKUmJiWlZWMiIuOlZ2dnnlhhp+Zpp+gqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6enpaSfnaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZybWl2bWhtXFhcQ1dOSkdNR0JGTTw+TD40PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco5+ZgV9eZmBSRUU8SzxGPEI/PkBBTXqpramqpZ+enqKjnp+dmpyblJOVlJ2emJZ9dJOimqukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGw7zDvLezqbOtqrO1r7Ouqq+jnauntrGtorCmoaOvsa2wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeGgXt0cmtrdHJxaFZcUUZUSERKUEk/RUE0Rkg5NTs+Nzs8Pzw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+giXZqYVdORD9MX35sX0M8MzVLe6qyp6OjoaCepaulnpeclJGZnZiUjIqGiIZ4b4KdpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvsfGwrfEycnDwca+urS6urW7t7C1sqq6sq67t7+7uqq4rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtjaG94a2VaW0ZLTEVEU01EQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2cmXFqYFVJRUBBUo2epIpQR16NrqyhmZubnp6Zl5eXkoyOlpeTjo2Qi4KDgndycW1xjqatrrS5xbvNx8u/wszOzczHydHMzczHycXFzNHS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysLFxsbKyM6/yNHMx8XHxcG8w8G/v7+2vrOuv8DDw8fEx8Suv7iyuLzDwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxERVBJRENANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnpRlWFBMRURBRl6+1sOjk6OzrqOenJ+al5aUkpSWkZCPjIeDg4iHg4CBgYB5cXJvbHmktrq5vcvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19HX0tXW09TIzMbMzcnSzc7TzcXIycrBxsvHycjGv8Ozs8jEy8vLz8bKv76/vcHHxMzMyMnAw7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEE/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGbXExDREZES1V4urirr6+mnJycoKShnZqUk5WUiX13cGtlYmhxb3F7hYqAdXBucXRwhbPCvcTR0NfW1tLWzdTW19TT0dPU1NPP0cPQ09bY1dbSy8nO0cvGzdLK0tXW2dXX09fYztLKz9HMz9DN09C/yMfKxMzMzM7PxcbHtr/Kv9LNzM/Gyci/xMPIzs3Q0c/NysjNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZHJiXVJcSUpHQUVJSj47QTg9NDU4Njs4Njo8QD47Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpZ+io15FO0FCSVpsmq6sqJuUl5+cmqCgnpucmZWJd2ljYF9fX19eX19dYmx1dHBwb2xycXWSxMfF1NbX19fT1tDV1NrU1M7P1dTU0dHM0c3T19bT1dDP0tPRydPRyNDX19jR19LY2dTWzM/Pys3Sy87QwMbDyMbOzdHR0snMzcDKzMbTz8zOyMTKx8fIzMrU1NHVz9LM08K5xbGlqLWup5uorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52mrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqiho7BzREBBP1NtnbCon5eVl5manJ+dmJyckn1wZWNiX19hX19hYF9gYF9gZm5wcG5rb3J3d5zLwNLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cXR1MrQ1NXWztLQ2NjX18vIzsTJz83KzMDJwMjKzc7Qy9DOzszOz8jL0NHLzsrCycfJzMvM0tPN09HR0NDKvci5sK67uLWqtrCtqLits767sZqPoJSRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVhFO0A9MzM8PDg3ODY1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcCwqaytqaWqf2JnYmmHnZ+blZOWm56enpyTlpeUiGteXl5hZGJgYGBhYGBhXmBfXlxibXJvb3N0dnZ5pL3L1dHW1NPY1s7O1MvOzsXOytLSz8fOzc3Uy87TzcvX1tDM0dTLzNDS08rO0dXS1dXKwMrCxczCyMnDzMPFyMrKz8rNzNDN08vGyM/NyMfLxcbBxsrMzdDRxtDOzc3Mz8XHwbi5vcPDvcO5srK+sbvDxLWqmKWimZaRlZWSi5SNmpGUlI+PlIKJhnlxcmttZ2BgcGhZWGhWTEZMSVBRQjtDPjs2Nzo4Ojo1Nz09QTw6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCta+0qJ+tiXOEh6HDqpaMjJeVkJORkZWWlZCLfGVhYmJgXV5hY2JgYF9gYWFgX11bXWdycnFyc3BtcnmkxtPPy9DP09TKxcnJxsa/w8bPzsfFx83K0sjLzs7G0dLQzczUysfLzs/Ix8/Sy9HPxrrEv8bJvcLHyc7FwsjAx83IxMzKy8/IxMTQyMbCxsjEv8HHzMzMz8LKy8jHy9DExce7x8PIycLPwb28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3b3Rka2BeZnBhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68us3NxtDV1dna29jQyc/P0dPIwra7u62ktXNjf4C2rJCOjZaPhYODg4F9hIR+c2BbXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9wfbjRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMvJyMrIwcXMxsjLzcnEwsrJwcLM0MXLyL+5wbvGyL6/xs/Lw7/Du8nHyLvIxsXKwL3Cy8bFxL7GvbzAw8XMxcW8wMrCxcfSxcDJv8rJxsjG0MPDxsOvxMvHxMq3v7y6tKmspKWYn5iso6Glm6Ogm5R7d3J0ZmlaYW5sWlxYUkRMRkJHRExERlNANTQzMzQ/PTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76xsLFlZXqLtpCLkpaGeoCFhX92eHVycF9bW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKwtrqysrOyscK8vLy6uMHBwcW+vbm9v7nEysXGwr3GwLi7xMm/wcm7t7u7xsO/vMHNw8a+vrXBvcO6vca7wrqzvMXEwsK3v7W2vr+7zMO8tbrIur++y8TBxsLFycbJxtDGwszHssfJw87NwcXDwL2zt7Cyp6ioubClrbCqrayUenZ3amRnYGhvY1deWUpGSkZISkFFQkVJQDk6NjQ4ODU0Ozo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTW183Kz8XJxcfAucW9q6+eXGlyl5SLiIqEeH+Ghn9+hHt0dGNcXF1eYGBiY2JiZWViXVxbXF5cXl1aW1xeaHNxbWdnbnByeZ29zMDDusC4rrCxp6qtrKe4tLe0s7O0u7W+srewta+yvMK8wcS8wLu1srq+wLjHubS7tsHCvLi9xsHDu7Wvsra6v7TEt7u0q7i9vcC9sbu2sLa6s8W8tq67v7W3tMW8vsPFwMPFxsjLxcDGxrvHy8DPysfDxsLDt8O9vba5vse/rLW6tbe2jnl0eGdnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMrIysnKxNDN0s/NxcfBxb++ubfJtqqxklxtdZGOhomJenh+hoZ3d4F8c2hdXV1dX2BfYGRhX2RlY19fXFteXF1eWlxbXV9scG5oZmttbnJ8pMe/ubi1sKutp56jqqeeq62zraqsqbSut7Gzqa6mrLO8urbDubq6sau1ubu0wrqwwLG+vLu2u8e5wratqqiwssC2uL2wsKeys7W7vKuutaautq+7srCqubCtu667uLvAwL65wr/Hw8XAvMbCyMq4xcfGv8fEw7rExsK7xsnMy7O5wr27s4lzdnZraWFibGhZWFdbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxdDHzcHDxr/ExMPDysLJyr7AvMG6srS0w66psI5fb4CQiI6Qe3h9iYV6e4SAd25eXVxcXV9gX19kYmJjY2JgX15aW1paXVpaWlpcZW5vaGZnaWtucYGtubC1rqakp6eaoKWhmpylq66kqKKsqq2rsKSmn6qttbaxvbmvt6+prri0tLy4tLyvuLm1srzBssCupamjq7Gys6i9qquoq62ttLOmqK6hpK+psqanqK6mqLessbK3urq8sby9vr7Ev7XCwcfIt7/AxbfEw7+7v8TCvsTIzMq/vsTAwKmHc3RyamldYW9jV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0I7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcq+u8m2vcO+usq3wcPBtLW7tbCutLutp6qRaWmHhIeLgHt9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX15dXFpYWVtbWVhaXF9ma2ZkZ2Voam9yhamlq6Wgm6GllJ6lm5iRoaOqo6OgpqWopa2gnZykpqyysLa3p7CsqKq0q7S6sba2rra5srC6urG2paCkoKaxp6uouaqkp6eop7KtoKemn5ukpqyen6ekoKGxra2ssrSztLC1vLa7wcCyur7DwbK5ucOzwb2/tbi8vb+8wsfEw8O+wMSgg3hwbGJmX2tvYFVZXkhOZ09UR0VLRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItbW9uLrAur22oJ6VnaGmurars7O7s8TPycvCxri2x8DMv7jJt7vFuLPEuLO+wKu1u7GrpK6zrZ+hkGdshoaGgHx5dXNvbWpqaXBpXmBdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+Hnamgl5WaoZaco5mWjZ+ho6ecoKCkpqKnnpuim5+rsK2xtqOpqqqsrKS0ua23sKyzta6zta6wqp+en6SisqSmqbitoqamoKisq5mfoJ6ZnZ+lmpmjnJudr6mrp6qsrK2xsrivuLm7sLa8vLqrs7O5s760trKxtrW/tr7AvcPBu7u9l4R6c2xfZV5kZFhUV11JV1xLUEdJSkdBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8PDz766x7i4v7eywrSxu7uruLmwoZ6oq6eWnZBrfYaGf3hybW9ta2JeYWZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXWFhYWFpeYmRkZWZmaGlrcY2onZOUlJuYm6KXlpGcoqKonpydpaaipZygoJuZrq6urrKgpqKuq6eitbGysqyor7KnurOmtqCin5yjoa2joqq1qqKjpp6lpqOWmZ6XmZudoJqXnZ2dnK2iq6ekpKatq7O0qrWws6uyubSvqq+ysrO4s66prK6yuLG7trq9v7ezsZSFeXVmXmVeW1lWU1pVS1tRS0lFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7OdpaOYpbHCtba9rbS4wszIxr/FtsHAxs63wMS9s7m5s7+2sbi6rLG0rp6Zo6mfk5mNdICEhH94b3F0cWhlY2hkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oZyTlZCVl5egl5mVl6CeoZ2WoaGppJ+eqJ2cmqunr7Crm6OkuKqhoK6otqqmp62wpLiwpLego5uZmaqmoZqsuK+ioaScop+gk5ShlJaWm5iXlpeclZ+qnqmkop2jqqqwrqi0q6qnrbOwpauus7Gwr66vpqiosq2xtLC8tLm3rqOUgXl1ZF5hVllYU1JUS01eTE9LR0dMTEU9QT48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+t72unaeoo6q7wL3Aua60uMHMx8XCw73FuMjLssHCwa28u7W7vLW4ua+ur6mbmKColJCJiH+BfXdxaWxydHBoaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNjYmNiY2RmaYGWk5aMkpSUm5mdlpacoJyflqGgpqakpqefnZ+moKqvpp+ipLeooaGiqLSipailsKWxrqy0nqGdlZWpoaKUrbGxn6KjnZ6Ym5OLoZSRk5iYk5eXmJeep5ynoaKapKWlq6SlsKelo6urraaprq+uq6iqqbOmpqyvtLGvvLWxr6+gknp3cmVhXFpdWE5MUkhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G4rJ6lp623u7zBxbqxubXEycnAw8bFx7bFxLLCv8Wrt7e9tr26urWyq6ynmJeeo4uIc4mIf3duY2FmaWhmZ2lmam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZVU1VSVWBgX2BhX2FhY2VqgJSTipGOlJOUnZWWl6SZoJedoaWhraakpKOjopyqq6Wan6WxqqChnaWrnqihnq2sqamuraKiopWYo5uckKupsJygop+el5mTip6RjZKTlpCYmJScoaOdpKGilaCipKabo6uloqSqo6uupa6yqaalpqa0pqmorbO1tLm6r6msnoxycW9gW1dWVlJHUU9IWltPUkpUS1NMRUZJRDg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1ybyxvsPIrLG4wbW7wLu0s6mrppWam5yIgHKIg3t0aWlqbGdqa21ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXV5fX19iZG2OkISRh4+Rj5qTlZOcm6Ocm6GpqauorKeopqSZpa+llZmlr6qgnJmboJ6vmpyrs6Clpp+jpKGVk5uWlpKpqq2anJ+hoJuUkIyZjoyRjJGNlpWQnaKgo52co5WboKOhl6Koo6Koq6CrsKStt6WjpKKtraqoq6+zt7O+tbKrr5iFdHNoW1lZU1VSRVhMUVtYTVROUExQUUlOSUI9Pz9BPz03NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NjU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraeztq6oqK+um6morLe2rLzKu7a/rMvGxbjBzs/Is8S6t7vCyLCtuL+3vL26srSlqaCWl5iXh3p0gHZ3bm1obW1tcGdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXVxeX2BkfoyBi3+MkYqSjZeRl5mioJugq6qmrqyosKSpmp+toJWWpKmonZiQj5qerpeYqKqZn52UpaGekpGSkZOVp6qlmpmZnp6WjYyLk4aJjYOPi5KVkaCeoaSYlZ+VmqGinpSbpaWnqKigsbGmsbynn6Ostauup7C1sLi1wLGtsauRfnJzYlZUVU5SSkdWUFJRTExXTUpMTlJHTUtBQ0ZEQz5BNzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ylsbeqpaKxq52qp6mysaS2xrS5urPKxbm6wcvQyrG2uLu9wcOxr7G3rbSzurKyoaKcnZeXlIN/d2tnbG5xbnFqcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY6HkIqXiZSUmJuZnqmboKqmpayeqJqgppyTj5+jm5eXhYSSm6OQlaOdlpaWiKKbm5SLjoqQmqSnnJWVl5uRkoeUjouBi42AkIqSkpKgmqCilpSYmZWippmNmaSmqKahoLSyp7K3oZyit6yqraSysqa1vLWsq7GjiXlzbV1OUVFMT0NNTk5QS0ZOTkpKTk1RSE1KQUdLSEhDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLawpKekqqWgqKals6qissO1tbKzxsa3usPKzMazrLq9tLfAr62psJ6mrbqvrJ6YmZyUk4d7g25fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYW11hb3N2cYWIgoiAkYSPi5SRlJ6hj5uco6KkmaWXopyVjYeZmoxzjYN+jZeWhpGakJSOjnuZj52Mgol/iZifo56Qk5iWhY2ClH5+dIqOepCHk5CQnZuampKWkJ2Oo6OOiZqgoaOkm6K0r6yvrZ+YpbimprGhsK6csLuqqa+qmYN3c2NWTVJPUE5DU05MUUxCUFFISU5STUhKSkRKTEZKSj03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3i3oaO0qKalqKOmpaemp7OnpbTBuLC0sMnEt7nBzsa9s6y6wautw62noqaSnaa2raKejpSVkY5+eH5lV1ZfZ2ZpZ2huY2poZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVVllbXWlscm1/hXx0TlhykIOXh46dl4uUkZ+YnZWUlpWPlomAk4pfO1dvfIuUiYCMkoyQhoZzioWXgXmBe4aTnZODlY6RkIOGfZN4cXCFjX2JgZGNj5eamZOLkImdiJ+YiIeWnpqhoJenrqmtqaielq2zoqatmayrmKizoqmto5N+cm5gW05TUldMRFRKUExMRk5PSUVMUU1LT0pJTFBGSUk9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6moo6qwqKe0wbmwtbDHwrezvc+/ua+utcKnqsWpo52Yg5SbsKKZloWTjoqGfXN1XVBMUlVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbXBpe4J0UUJAf5WSkn2JlY2Eio2bjpaViZKIhpWGeYl/YEpRbniKkYR9hI2KhX9/bn5/lHh1dniEjZlvUY2IioZ7fniUdmd3hoh9iomVi42RkpeMhIqIlYSajIKEkpqWnp2UpKOoqaWknpqwq6GkpJGmqpaiqpyipqiJdW1mXltIUVFTTUlVTVNJTEtPSUhGSk5MTVRLUVBPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7abo6edn6GvoaeopaeosK2qtry2t7ezwbu2p7rIuLaoqLW2qrK8pp6Wjn+Jk6iVlIl9jYOBfHdwblhNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWVhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amlcVY+JlIl0f4eBfIWMk4KSmouPe4aPgHaAeHNvdnF0jY2Ben6Kq4V5emh2e45wcm14gYuNknh6gHuAdnJykndodYSEhIV7lYqIio2LgH+Ei4yAlIN8gI+YlJyWkZ6dqZ6foJ2gqaWfnZiMp6SToaCWnp6kgHJoYVxdSldQUkhKWFJPSkxNUkpKSkxQSExRTFJUTUVIQTw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumaOimJyftKmvqaWtrLCyqr20sru4trq0sZ+3urKqnZ2sqaiyr6GakY6UgY2bjZB+doV3e3VubmlZS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedYN8eGZ3jZeYjY99aHmBdniAiY99hJiSgXKHj3x3e29rfq18c5CKf3uGkoF9f3RmdnyGbG9oc32JjIiAbHlxfXFtdo9xaHGBfo5wQ4uEgoOFf3d3eouFfYx7dX2Oko+YipKam6OWmZ2anZ6hnJaNiqSbjp6XjpaYj3dvbWViWlhYVVFKU1VUT1BOUFZLTktOT0pRTkhPT0xGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagpq+srquoqbGvsau8uKy7vrmzrKebsKesm4+WnKWppKCXmY+FknqIjYqJdXB7bXRwaWxqWEtGR0VBQENESUxMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOT1FUWF1lcHJtiKeqwH51eWN8eG98eYiQen2Lhm9tjJJ5dHhqaoCCcZaRi4F+loBJk5huaHd+gmxpY2x5hZCShmtzbHxucnuGaW1wf3ONiYSGe31+e3ZvdHOFgnmBeHB8joyKlIOWl5iakJKVl5mXnZaMg4mekYuSjYaQln9uaW5vblhWWFRSUVlPUlRUU1hVTU5ITktNTktDSE5HRT86ODk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WtsKOsqqi1r66stL+rvMK/pqKZlaSXno2Ei5ShoZiYkZOLc456gIWLhXRudGtwbGRrallORUZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcYKeIYpppdHplf3Btf3qLiXaBiIZ0bJqRdHN8amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3F/fGhxcXxuk46PfHN9fHFwbnVtgn93eXVqeYmCiImElpKSkIuNkZSUjpeNgHmIl4iGioaAkIh2ampvaGVYUVpXWVlbTVBVVllYTklIRUpKSEdCQEZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDU3NzU0NzhpTzg7NW6SiJqRmZakqK6esp+nu6+rsrDCsbvDx5qWj5SZi46GeYSQmJSNkIyPhnGHgnSHjIV6b3Jwbm9kcGZfVEZJQz88Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7Ogcnx4bH1tcoOChYF6hIaGeXKhlXR4gHN1lIc1cZ2onY6hoYSihHZwhnyHfHOMrY2JgGdnYmpucmxwg3Vpb1h1cI6bkndsf3t9bXFtcIB6c3VuYnaDfoaAhZCQioqJkYuRjIuOg3V4io6AfoOAfY96cXBva2BbXF5cWVhhX1JOW1pYV0xISkZKRz5CQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGTiJaRnaSnnq+VpbWqrrGuwbK7wcaWkIyUj4CIfW6BkJKJg4qHj4V1goRslYiHe3R4eGx3bndjaV5JUEc+QDc0NDk7Ozs9PkBCRUhMTExMTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx+hYN/jH52opl5foaAhJmEm5xhhqqfnYuDkI16d4h+iYiNc4qXkIN6XWRydHp7d4ptaGpieW+GkIJ6boF3dIR6cHR5d2tuaV13h3yHfIeHj3+LkpeDjYWMhn1xhH+DfXV3e3yJdnBzdGVnX1tbXlRcZ15XUVVYW1VHSkpETEc/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJKcnZ+mkaCroLGor8CxusW6lo6RlId6hXZrf4yRgn2KhI6MeIOAc6GEi319gX5wgH56Z3ZrUldMQEUyMTEzNjc2ODg6PD5BRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHJ8j4x6fYmHfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSSqIeAmJiKm3RtfIGGh32OaGdoeH9uhYeChXGEhUdsgHdyeXZobWtfd32DiH+IhYt6lZ2biYuIkX96dYt2fHhtb3d9f3NzcmxbXV1bY2NYZ2ZcVU9QVllQRExLRk5JQ0ZDQ0FAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWIkY+WmJKXoZ2soaa4r7O8s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0+P0JFR0hKTE5RU1RVVFRWVVNRTkdDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgISChZGTfoWIkYGalYKhoZiVm5qlrZOau7Gnu8fDqIuMoaWPlImBkXxxg56fkZx/doWFipCIkGlob4OAdIyHhItxhYJ3h397doV9bnZ1ZoCUj4aJiYeIh6GqopaJjph/eoKJenlvZ2t4fnp+cmpkXlpaXWpdYWZgWU9LTldSUUhQSkROR0NKREJARERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmeIN7gIyAgZGOipqbpJ2hrKarr7CXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46DgIGMi4KJjYN/iX9tcGpdQkE0LS0vLy4vMDIyMzQ3Nzg7PT9CREhKTlFSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZqPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyNoZ6ZhJOFgo+hn5OYkoSLhY+ZkZZscHWJi4KWjI2Pd4+EcW2FgYqWkYOFiHKIoZaHk4mOj5altambjZWig4eTg31/a2prfICBgXNhXWNeWmZrXGxrXldLR09TUU5NTEZJUENETUZBQ0VHQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCCcHWHcXaShn6XlpqVnp6cp6CplpOYnmdlpJp+hJKReYCSiJCSfYqEmJKRgoCAi42JhZCGhIiFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDU3Oz9DRU5QUlRQUVFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdnKilopmhl6KVnZ+onqiroKisqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqbmaeRkYmVopqaeHp+lJiSoZKWmIGUnnt3lZKrs4iNl599lJ2cjpOWmaSiprawnZGZqIiWj42BiGxzcnx/fHFoYFxgXmJnY2BoZ1tSRUpLUE9JSkxGRk1DSExGRkNCR0VBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdWBufWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImMioSShYOGiYGAhndfYlA0NjAtMS8sLjAwLy8uLjAwMTU+QUFNUVJTUFJTVVJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk5PUVlthpB3lYujp6q0vbikrqysp6i0q7C2srKtu7Gzvpyzw6y7ycu3w7+4paOwsqytqqOLlpiFpqago5eBppmNoqqopIiFlKShoKqhpKmPnLGLlaOnt7uboKOwk6Kdo56RpKKrr62ztaKUpKqImYmSipV5en6FfmdgaFxlYl1kY19mZl9aT0NJSFRPRkhMRkpHRUZIQUtGQ0ZHQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gZOFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkY+DhYCLhYaHkoaChImGiIeHcW5hQEU2NDwyLzExMC0sKy0xLi0zP0RBTVVRUlNVVVdVTltQR0dFPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qxwcfDqrPFtqyzv7O4vra/tMG2u7ukuMaotsnHtb65tKijtK2xsZuZkpqfiaivq6WUdp+kl6GrsbOZlqqtqK62u7K6rK+1orGssbW8t7WutaCnp6OomqmwrbK6uLinm7apjKWOkZOfhniCg3VZYWRWZWFhY2BhZl9bVEpERUxVUUhJSkRJR0VBQEBLREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtaUWNkV3l1cYGUfYWHk3aFf4CMe7+7o7yCtJSTjZuPhIiPkomJeYaAjJONh4SBjn+BiY6GgIaJhYqHkXp4bl1WQEVNPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcVk9eVUlLSkFAPkdLRkVEOz5AN0Q3P0JKSkVGV1RQXo+lrqOxtMO2uMHMyba7xL2zs8C3t8G1v7C3dLGzprrFpLDGubGzsbSopLW2qrGgoZabopKlsK6mraunpJigrLO6oqmyurS7vsy/xcW9vbPCt7q4v7e6t7msrLCmsaqtvrC9u8LCrJm6qJSuj5eXq4l9gnxqV2JhWGplamVXW2RZVlRJR0dMUUdDSElBSEQ+P0JCS0BATUM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1RZVVp2anB/j4SBjoRuenN5h2K4oZmjiZWTlpOTk42QlpKHhnuGgY2WioGEgYp6fIuHhnyKg4GKg5V9eHp1ZU9cZEdFTDpRY2FbXlNGPztIUERaY1FRWVhaZ1lUYGBNU09FQT9JSkhFRkFAQzxFNkI+SEdKTFNaVF2Tr7i1urnJv7q9ycy7vMG8t7W7u7e9tLqxxmF1sqWxmp6qvaqlqKuqo6KytaGrqJ6Vlp+Yn66lp6aln6OUoqaxtKeysr22wb3TycrTxsLFy8HKw8C+vb+7vLe0sLm3tsO6xb3DyLCeuaqiq46lqLaJgH9xX2FiXVdhX2hmUlhhVlJVSUVFTktBPkdEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdZ2xscZCNhZBzbHJyc4jVwLWZoI2VmJmRjpeSlpaOhod9hoOMlop/g4CDeHuLg4d7i3mBioKXf3R9emtlcHVZXVxQZWViYGVkXVtYV1xNZG1VUm1tX25fWGdlVVlUSkRBS0tIRklISEdCSTlEP0hLVFRWXFpbkrnAub23xsC6uMrLure6tri5sri1tK62tplkdaicrXBeoa2cmKCim6Seq6WUoJ+QlI6WmJeon6WfnpqahKSdrKWqsKy3sL251NHP18/JzNHMz87KxsC/wsq9wbzBwMTExcq/yM60pLuwtK+bq7m8mn95bF1fXFhdYFljY1FcYFNQS0NCRUdFPEBFPkJIQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpX3CXkpCUb2xvdXWHs6yhoZ+LmZyZjI2VkZuShYqKfoiHjJCLiXyBhHN7ioOFe4l0gYmGlX9ze3hrbXV7aHJlaWxpZmppaGBmaWhsWm50l62kvIiHZ1tvaF1aWVRIS05PSktRS1RRSExBSkdLUF9eYmZpYZe3x7C5s7u+tbHEx7WwubCwu6uzsaeqt6yNtqedm6eaT5qdjI6glpGmmKWVipOTiZCJj5GRnpuhl5qVloeemqabrK+or6eztNTU1NbSy8/U1c7Tz83FwsnQv8rJysnSx8zNwtDSuLDDvMS5pba6xKKCbmNcXF1YYFdYZlpRXVdPT0JCSEVCSTtBRD5BRz8/Qjc7Qz5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVdzkJCYgmhxb3l5g6CqnqaXjZubl4uOlZGajn2Ji4WOioqLkId8hIJwf4iBhnuHcoOSi49+cXh1a3F4fnF7bXhzbGmBcG1jaW5weGl3fH7Lv8Lfp21jeG5jW2FgSlBSVU5ZXlBeXU1QTlRRVVVcbm52gnKXrbistKewtqusvMCxq7WmpbinrK6hq7SjjrGumpiYjJGTkYSOm4GNp5KciYOLhIqJhIuDk5WYl5ObkZyYmZmenquspKehrK3P0tXRzczS09TQ1NHOyMPU0cjN0tPT183S0cXS1sXAzsfHw6i+t9Ceem5lXWJcVmBSXVtPUFRQTkg+QUZBQkU8QEI+RUQ+QD86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYaFindsd3B9fn+hnp6hi42Zk5OMjJOPloV5hY+QjYuKiJGHf4J7cn6AgYd5hHWFk5GJf292cmtzfHt3fHOBd3FrgHNyaG9xenlye77Lm36MsoN2coR2aGFqXUNaWltXZmRYZWtTWF1dYGReY3h7fouBmaqkpKGgoaimqrC4qqW0o6GtoqOtoqexn4mmmpSSkYmRjoiBlIlrlaKNmYSAhX2Rg4OTlq2LlY2VmY6FkpCdl6ewoaChpKSoyM7PyMLL0dTR1NLO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsxMPLi3NvYmBfWFRZUlxQSkdJSUpAOzo7RUJEPEJEPkhCP0JDOzs5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnZWdlIWLlomPioiOh49/eISUmYqNiIiLiX6DeHR7fYOHd396h5GWgINueHBtdX92eH50hXx5bYd2dG59doR1eXudto08QYvGpX6NfGllVklDZmNlY2hqZG94W19maWtuaW6Ag4mRi52eoJ2Ql5ifo6SmsqSks6ChpZ6hqaCisZyGnpKSkpCLjouGg5CEfpybjI2DhIV6lH6CqZWjjJKKl5KLfZeKmpGqs5iam6ecp73Dxrm2xs3S0NLQzNLLydTO0NXa19fY1NnYzdjbzsna2tLVv8vMtHh2bmRdWVJVUFpWRkdKSkVFPTo3OUBBQjpIREBFQ0FEQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYXFxc4aNfJeRnYt+h5KCiYaFioKHfHiFlpeIj4OHhYd6hHlxenuEhnV6hY6NnXqMcHxvb3p/cXyBcYOHgW6OenV3fXyCdX98h4iwdFmpwraMkoJwbmI9XmhycHFwbnh3gWVpb3J1eHJ7i4eOlJKblaCVh4yTm6Cbn6qfoK2copqZn6Wen6yZi5qMkZGNhH2Ih4OFi46gmZOIhId+bZl5hJiGiJOMjpSMhnubiJOPrqqUlZeemKeutb2prb3Gy8jJy8vPyMPRytTW2NfY19Tb19PZ29bP29rR1snUy5V5e2hoW1lQUlNeSENFSUk+QT49Nzo9Pzs+SD0/QUFBREA+Pjo4NkRCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJma3aAiHGRkJqAeoCNfoKCgoR+hHx8hJeOh4t+hoaAd4J5bnt7h4F1epKejaB2j3WCdHWBfXSAhG+Bj4JvkoR0fIGFenaGfIm3xqXCybeBlpuPd3BlTmZjgXqBd4aikIt4eXd7g398hHZtk5aUlY+YkIOKj5aal5emnJegl5+TkpejnZmrlpGQio2RgoyFiYiBhZCRnpyZiYWLgYaYeomJn5ePiI6Ki4J8oYmQi7yhmJOXmZyppqaun6i1vsDAucfJzc7FzcrR1tbV2dXX29TX2drb19va2djO3MaGenlnaGVgVFdWVU1LRE5DOzw9PDk6PD45PUA2PT9APD8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6i3x+gH+AfYV7foGRiYSFeoSIe3V9dG58fYZ+dH6SnpGfg5J8hn54jn15iopugpqAdJiFfoGJhXx+kHqPqY+Qw6C8jJyjnH2JhH2Jc4yKfnOmmpyYlIV7j5CJhGhHcKCknYyLkJKFiYuQkpWPnZqTlZGXjYyVn52UoZSSjo2Qi36Qjo6LhIiSlpqfn4mMlJKekYKLgKaZiISOg4aEgKWGiou4mJ2SlZaip6Gdnp2jrra6tau/xsrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19y3eHh3a2lkV2BbVFBPSERNQj09Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYCOinFyeYp7en99f3yIenx7i4eCfnWDhnlzenNtgX6FfXeFm6GbnpSSgIuIf5iHgJySboeohXqgi3yRjoOIhJx+mpGKjaOin5CkrqCLkYuFi4GShldyrYufq5yPg5ibkJCOXIKikYKMn5OVjIeIjJKTjJSUlJCMj4qIlpudj5WWkYuSlIaAi4iSjYmKnJaZo6OGkp2WoYuKiI6ckIOIj4CDh4WkhoyQs5idkpSXoaGfmZKcnqexuKylvMLHzcfGz8zPzM7Xz9HUrtbV2NrY2trX1tnan298dGdnXF1YU1dYQ0BJRD4+Pjo0OTo7Nzo7OjM7Oz89Pjc7OToxOUc9OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bWJ+koNubXeLeHl/eoF8hnx7d4aEf3NwhYJ6dXZ2dISDhX1/kqajn6Wilomdj5SXi4qol3KKso2Ep5GEmZOFmYuilqCYk4mbnaGSqa+fkZWQjY2IlYtujbeFmsTIspyhpZucmJaRspFkpM3Hlo+Fh4mQko2Nk5SKhYqKhpaam4+QlJOGlZeEf4+LmYiNkKqXl6SjiJmelpuJj4iXl4qEj42Bf4ePpYmNk6mal5OWmaGYn5mTnZujs7Slo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoJyf2hjX11eTkpUWkJBR0Q7QT04Mzc7PDo4PTY0OTo8OjgyPzk6MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PjpFTUZIUldTUkJjgUZ1gY59fG1+iHh6fnqBgYN+dnaAg3xsbot/eXx4eHyEh4t9iqOzp6Oqs6GWp5+lpJaVrqKDkLiVkrOZjaGgjKWbr6OknZiQp5anma2vpJeVlpSQi5iZlqDAjqTJuKuboqatmJGbnbKdhoWoopyYhYiJjpWNi5OPiIGGh4iTmJSMi5OThpSYhoSRkJx0kZmzlpeloYicmZOPipCLl5qJipaOhn2MmJ6JkJCcmpmTmJiflKCdlZ+bobGuoqS3vrTFx8S9w8O/xs3KydKnzs3T0tDW2NPQ2LtyeXZcYFVfV1BISU5FQkNFNT46NzY6Pzs8Nz00MjY2OTc3ND01PDU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nj06SkZER05bXFlJZmA7SISLentuhYZ6fIR4gIWBfnB4fH19b3ONen2Be3iGi4mGg5Knu6yosr2vpa2zs6ijorCsipq0nqO4pJWtpJaprbempKOfmamYqaOvsKqamZyUlZGXn5eZu7utyaFptrirsJSYnqOrk5e+o16qsoKJio2Uh5F8jo59g4aOj5SViIeTl4yQlY2LjJeYkp2ZtJeWq56Lm5SSjZCSjJmbipKekIuJlaChjZSNmJqdk5uYnpShoJScnaWvqKGls7irwsjEtbq9u8XHyMLRocbJzc3E19bRy9OhcHpoXVlTXlJPRkQ+PENBQTg/ODc0PkY8PDY8MzUzNTU0NTRCMzo6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZUdiYGJwSUCLin6Bc4aHfYGIdYKKg39tfX18f3B3h3eNgYd7jY+MhoyZqsLAr73Gu7O0wby0rauzt4yosq6uvKqbu6Sorbm4q6amoqGjo6ivsrGrnZykmJuYl56ipaWSo7muqMC7rK2yuaWkp32Ih5ysvbCDjIyLkIOPg5GPeoGHkIyOnIiHj5iNi5WXlJCalp2nmrGakaydjpqPko6UkJCWl46RoJGJlZujrJSWj5ScnpSgnZuYoKGUmp6npqSipLCypsHHw6+wurbFxMK+zafHw8fDvNXRzcTKiHRzYlxZX1tNSkJMQEVHP0E/Qjs6ND5BPD01PTY+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGZGYGlnWl1bk4yMiHuHi4aDjHWGkIqBb358gn9xfoF6lXqRlJSYkJOVp7TGyb/CzMHDuce8uq+rubuXsra6ssCupcCkq6+7vKqtq6KinaeqrrSwqpufqpuhm5WfsLSni6K6urXBu6upnLKlpKiUhY6qw8SkgouPh4iEhpWUjXqDjJGOkaGMjJSSj4mXn5eTmZWYpqCvnYyqnI6Wj5KRlJWNkJWRj6GUhpefoLKelJqUoKGZpJ+aoJyglJiepqSmpqSvraXAxMOuqLe1ycO+ts6yxL7EvLPRysjCtXR5bVxYXGlTTEhETEtLSkFBPUNEPDVBRDs6Mz04QjMzMjI2M0EwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmZaTWVcZlRjapmNl4qMiJKQhol5hpSQgXKAfI1/eIeCgpB5jaGWqJqamLq+yMjKwdLJysLMvMGzrbu+p7q/vbzEt6zBqayyu72qsKmjpaOsrbOttrWgn6+epaKYo7S8qZuovMGjtravq5Kwrausl4aaqqalkYKMk6WViYB1ipJ6hY2RkJ6fk4+Ui5CNlKOZl5yVlKOfqp+RpZqMj4+QlZaIfI+VkpKjm5Wgopy1ppCel6Wko6WenqaYnpWXm6WjqKeisqyovMDEr6Wzt8zAua7Es7u+wriswsPCwJhteWFYV1xbS0tNSkZERElCQkFDSzo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Nl46ekomKf4mfk4R3hX+Vf3+QiIqQf5Whmq6mo5jCvcjDx8XTzc7Ny7vBt6+6vLS8y7zDwbW2vK2zv7m8rq+ooKintq2tqbG3mp6toqehnau3t6mlr77Dsb25s6eqtbOtrpaWpayooJGOkrHFp5WOfJGVfYiRmY+qmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi42Qj56IWpCWl5KWpZllmKOesqWWopasrKunm56ml5iXmJWhpKimn7arqbq8xLWltLXLwbiptqyyuriuqLi6vbiDbG5aV1RVTkZKU05LP0FHRERIRkc5NUZNOz43PkFKLjMyMDI1QjU1UFZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhXOz1AQkZCcUZpSVJlYkxGpZSclqGXqZaNkIOHppOIgYeCnISDlZCQlI6aop+vvq6hxr3FxMbGzs7O0sq+u7Wxuru8vs+2xL23ubeysbWzuLOsppyrq7iqqKevsJejr6SnpKS0wLCqrLS+wrnAubOnubW4sq6Vpa2vrqWLk5WhjXTBmn6XmYWPlpqMsZWamZWTk5mZpaOVn5uWmqmdnKGgmouNkJadYEqWnJqVmqWWVJawn6+cn6WUr66sppqgpZSTmZmOnJ+nopm0qaqzvLy7q7Cyx8C4paurrbGxo6GysrSkcW5mXFpOUEtEUFBQUTtHSklHSEJEPjlLVT9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pWDs6QkNAPVFFV1JzYldGSKqXmaCiqK+ZkZeHi6eWjoiShZ+HhJ2Xj56gmqOktci0qca6w8PHysjIzM3Gvrqzrrm4wcHNtsi6wbi1urGvrrK0p6ObqrO0qqimrayZpK6lpKisur+oq7a3v8G/vriyssOxub2so661rLqmiJyYppt2v6CFmZ2Ok5mai6+XoZybl5Wbn6GpnqigmZqqmqKnnpiQjZGdg252kqKalZ2inpCtsqOrlaiql6qupaSfpamTkpmciJScop6Wsaapq7q2vrOyrb65tqCjp6ilp5ycrKmpjGNlYV9SS01HSE5JVUw9TEROSktCQ0Q8UVU9QUFCRE8xOD03Nz9CNzVVWE4/SE5RWVNQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlJgTVVIf2VeSEWrlJyhn7uvmZSfi5Oqm5GSk4mrjYein4ykrZSjo7bGvbTBusLCx8jFws3Iwr25sq+5tMHCyrXGscG8tLqrqK2ssKOimaq0uqappquqnaivp6Oqqr68p6y8s7e9xry3tbjAsb3As6m1t6u/pY+jmJGioLyfiZqgmZeeno+3n6mcpaObnKGaqKWzoZudppyoqp6ZlY+Um4uXiYylopSdop6gtK+lpZOwq5mrrJ6eo6OpkZWVoIOQnp6clamkoqG0tLq1rai1srOenKKlmpeVmaqhnndgXF9dSkhGR01RSU1FRkZCUkxKQUVHQFZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpnXEZDQ5xwYkdFp5ekn5/DrJuXpJeZqZyWmpqPqpaWqKaVra2Zoau2xMK7vrfBwsDHxL7Nx7u9ubKvuLO/w8i1v6+8trm3pqOqrK2goJqqqsShpKirpp6rr6yiqai/uKatvbC3tse2tbm4v7G/wba0s7SvvqOXpJeUnJSuoJGhoqWjo5+QvqWpnaisnZ2hm6afvaKZo5+iqauhnZaNlZ6TnoePhY2TnqSgnbWsppyVsqeZr6ifmqmeoI2ZlZ+EjqGam5OlpJqYrLG2saqlqq2snJigoJKOkJaonpRoYllhXU5JR0pOS0hFRElBPVBJQTxHSUhbUk9LPUhPVTRCRjk+SEc1Q2FbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZWNXTKKao5yexayhn6ydna6gk6Ofl6Wgp6mrl7axo6qytcTDvcC2v8K7yMK+ysi2uLW0sLOzt8HGtr6wuLS5tZ+mrKqrnZ2epaPBpaCprZ+kqa2voqanvbamsby3trXDsrO3ub6yw8C3uK6ztbWjnaWWkpShrqCZop2pqKujmsOtqZ6srZubnpmmoL2inaWYq6uspqGZjZqfkp6Jjld/lp6loaC4qqeTmLajn7KhoJuulp6OmZSdgo6fl5WOoqSVkKatsqupoaKlpZWVnJiLj5GTpJ6JYWRaY2BMSEpKTkZFQUZLPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3NIRTY9dWVcS06en6GZnsOnpaKzoZyzp5OqpKCkn62prJ27sKistbHHxMHCs8LDvMbDvMTKva+xtq2wtK+/xbW5sbC5tayaqLCpqZqdpaGnwqybrLGbqqKusKmkp723pre6vK62w62zs8K/ssazurestLatqqKmlpWVpKyin5+aqKuwr6+8sqagqamZmZiToqS4oKGkk6+vrKWnn5KhnpWej5CNlZ2aop+ntKanjZi0nKOvmp6brpCek5eUmoCSoZWPjp+hk4umrLClpqGcoJ6SkpqThYuSjZyef2FlW2dlSklMSlJBQ0BJRzs7Rz85OU5NVV5SU0o+T15dPUhQQkxMSTlNY11MRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tVXmZyQDg8SJZ3ZUE0n6Sfm6DDqKSqsqGktamVsqynoqSyrK6pu7KssLW0xr/ExLXAxL3JxLXAyMK1q7WosLiswMS0t66strmlmauxq6qYn6aXrbu0m6iwm62frrSyp6q6s6e6s7eyuMCqt7LCvLTFp76urbe1qqisoZeXkqaloqOYmKWvuK6ytbagn6ikmZWVk6Sgt6KlppausrKmqqahnpuampaYqJ+gmKGer7Kipo2Xrpmlq5eanaSRm46Tl5mFlp+UjJCcnpSLqamqoqegmJ2UjI6ZkIKGlomUn3hjaF1rak1QTU5UPUNBTkM6OklANzdRT11eUlZRQVdgXEJKU0hWS0g6VGRdTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUpwaVZDV0aMeWZDO6SknaGmv6aor6+hqbWqnbmwq6OqtLexsLm3r7a4uMW9w8e9vMPBxsC4wcbBuqq2pK27rcHDuLiqrbG7opWtsK2ylqWnkKq5qaCnsJ2qoLC0sqqptrWsvKyysrm3rLmwwrq9vqbDq7C3r6mrq6eemJmroqKgkZihsa+zq7G6m5ypoJmWkpemobeppaOir7G0q7Koq5+boKCbnqWcopado7Owmp+Qk6WaoKialaGelZiJlJiTlpeck4iQm5mUjqmop5+jm5eakoaOmYt+jZaFj5tqaGxhbG5XUFFaVEFDRVRAOztJQTc6WFBkXlBWV0RZXl1NTFJOXktKPlpkXk5IUE5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE2NDdnWWBGKD84bH1oW1Y7iXtjQz2nn5yiqb2hqq+ro7G4qaW1s6yhrbW9rrO4vLq9trbAwr/JxLnEwcDAuMS9wbevtairt7K8v7+0qa6xtp6Xq62orZanqI6nu5+krbOeq6KxsLOsqba0tb2tr7G1rLC1scC6xLervK+xuKutqqOxpp6lqqCkl5CZn7Oqs6qrs5qdp5ualY2gpqS0rqeira2usaezrbKppJyfqKSelaGYm6i1qZeZkpKfmZ6gnpCrnpeXhZWYi52ZnJOKjZaXmpempaKgnZWVlpOAj5SFe4+Sg4yWZWxyZ3ByX0ZZZlZEQ01YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYl9QTE1OWFdYUEpWVldNPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVUxNTA9YFZeOClDM1lVXGdLNYx6ZkxApJmgpKy3pKyppq6utqmvtLqnprC3xbextr7AwbW0usW+zMW5wr+6v7nEuMG5srWsqrq2u7m9tKqtsLWYmKerqqubrKuOq72eq66xo6ugsa2zrq62sbm3qa2usai1r7O7vMmyqrW0sbSvrqehs6CaqK2gpZWWmpqyo62gpq+WoaSampKNoqWnsqmip7Ksqralr7G1r6SZna2nmpifmZmsuKOXk5CPmJyhmJeUq56ck4CTmI2dnJqWkYqUk56apaGhoJiVkZOVeouQhXuMioOLkmtueG51e2BFYWpZSUhZWz17SkdFNkFiVGlbTVxgSltdWlJSUmJgTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ15RXC4qQi9KR1BbSDNjWVVLRJmWoLCosqmtpaSurrWpt7S4pKu0t8m7tLq6v760tLfDwMzIu8O8tr6+wLi/vLG9rqe6ube2wbarrbG4lJemrquno7GqlK+7pKyysqeoo7KzsLGxtbG4s6iuq7GnuK+1tMPFtqm0tauwraqno7afn6eyoKSVm5qVsp6nnKCqjamjnpuWmKWlpbenorK0rKexp66wtaylmaCsqJucnZuUqbiclI6Oi5mcopeQmKWgnpWDkZWQnZyYlpWIl5CXm6eco6CSlZCQlnaEkId7hYGEjYttcXd1fH5cS2VsXEtOY1w/YntHSThHZ1dlW01eYk1YWVdUWFRpXU9PSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0ZhTFYlLUIuPUVNUTwzcmtKREOQmaWupa2uq6eksLKzqrewtp+rtbnJua7BvMK3s7G1wsPOxb/BvbS9v7+6v7yzxKipubC2tr+8r6uzspygp7CtpaWwpZ6ytayrsrCsqai0uay0srWstK2prKirqbmtsbHHv7ikua+pra2mqK2wpqSkrqOpnJ6cm7CaoqOjo5GsnqSgn6Kqpqa5pay1taWqq6isr7avo56jqKqboJqakqS0mo+JjYeRoqCVjZSdn5OShI6Skp2bmJWUh5iTlZmmm5+fjJKQjZB3fo6FfHx9h4qJcXRyfn19XFNkb15OWmZdRkSWW0g7Tm1YYVtNYGJOVldWV1RZZ15RUkxjWltUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZEhKKzpJPzNCSVMsPo9rPUhIj5uqqqKqsKSopLO0sbS1sbGhq629y7quwLvHsbSttMLC0cXFvsCyvsHCvL+3vMSnrLess7i7wLCrsq2gpKetqaiksKOqsaqvrLCurq2ss7untrCyqbKpq6Wlo626rKqxwrm1q7moqKisqqixpaqkoq6qqKKenKOslaSdmJ6ZrJ2ip6miraajray4sbKhqaKgq66wrJ6fp6ipmaSYmY+gp5iGg4+Ki5+gj4uMlpuOjoWHkJWgnZaXlYaWk5OXpJydnIqRj42Jf36Ihnx3f4eFhnRzcYl2bF9ZYG5jUXNxXEs7hHxGPld1WGFZTmNbTlVWVVdQXGJeU09OaFhXV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSWdERjg8QjA1RUtYMUCUWz5NRpSXraeiqrKcqamvtqy4ta6qpauqvci7sL23wq+wrLPEw87Ow76/tMDCxLrBtMnErK+3rbK4v76zra6rpaeqsKmnqLGltK6rsK6tsa+yrbO7pLizrKyup6ufop6wt6uqrbq2pbW1o6mnrKyqraGpp6axsqSmpqGhrJaqoZSboKaepKKrpK2jn6ext62to6Wim6mqrqmdoqWkpJigmZaPmJ2TgYKQiYWcoIyKjoyZjZCLg4yXo5uSkJuMk5KRlKKZm5mKjoqKfIaBgoN6dICEgn50d4ukiHlrXmBuZ1dlh2ROQGeSTERieVdiWFJlVE1WVVVUT1xdYVVLTWlXVVdJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEMrOkpPXjREhkBISESWkq+ko6qwmKuprbWrtrGrpayqqbzAwLi4s7u1pbKvxMnL0b/Bu7nAv8K5wbrBxK6ytbGzu8C+s7GurKurqLaqpa2vq7mwqLGxr7Grtaq2tae0tqyspKmqnKOes7OoqKS0tKC1raGpqKuoq6egq6uoubapqqqqoqmgrZuSqaGdoKSipqOqnp2mta6opqqio5elp6eqnKKko5+ZmJ+Rjo+Zjn6HjIeEnp6HhIqKjo2QjISGlaKajoyakZKRj5Kfl5iWi4qDf3SGgX9/eHWDf3t4foCInY9vcWdncXhcYHOIak9dmFZIbXhVZFZSYlBNVVRVUE9YW2JVSFBpVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlFjMDI/Zj1OWD9DLD5MVF8vSWs3UEU7lY6woKWqrZmrpayus7SvqqWvqai6vrzAsK64rqG1r8nHyNHAvr27vMK9usPBv7+usrKxtby8wrGys6qzqKS1qaWts7O5sKOutrGvsrqrua6qrrWrqp6pq5+ioLatqKGfr7OhtKqeqKeqo6qhoqytqL2urK6toaeon6uZkK+hmKKhqKefqJuZqrCpo5+soqGToqOjp5iaqKWXl5mdj4qHlYh9jYaFhKSWhYKCi4aOjZCEhJOgloiRnZCTkI2RnJSXj4mFhXh0gX99dXh5gHt0dHppgYajdWleZWyCdWeIi3xSWHBeSnhzU2RTUV5NTVJZZk5MVlllWUZTaVJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw1MiMyKScsJS47LiYxLjAtMTQlLDBMaDo0OF89YWQ/RjFDUFtbK0hPOlZCNJCPsaCkpqujpqSsprSzsaqksKequL7Bu6+nuaqnrrDJxsjRwry/vrm+v7zJvMG4sLC0sbq7uMCys7usuKyitKanrLK2ubOnp7u1rba9sLymray1q62cqa+jn6WsqqecnqqzpLOomqqnqaSpnaOpp6m9qrOvrp2ppKCunJuyo5WknKSln6SamqirpZ6bqqGbkpuhpZ2Yl6mpkZiak5CKgo+Ffo+CgIiej4Z/fYuHkI6PhH+Tm5OFk6KMlJKLkZuSlYeIfn9xenl+fGl3fHp1cXF9aIZ4hIdkYGhjcoV6bWd5XV5WQld6bVRhT1JYS0xOcXRdSFpbZ1lFVWZQRD5KTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktIMSUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9O0VaPyqPlLGZn5+ppaShq6S3srKlqLGnrLjBvbWwo7mtqKiww8nJzMG2vb+1t7+6yLbDtbSztbG9uLq+tq25tb+tobOmqquwtbi0q568vKiywLO6oK+ztaqsnq6wo5ylqKminpylsaavoJ+qqaiiqZukqKCtu6etsK6hq6Okrp6eraaXn5uho5yfm5qjqqKamqSklZaUn6KWm5amrIuekZCRjIKLgYCPgXualY2JfH6Lho6Ni4qEkpiRh5SjiZKSh5Caj5OBh3x5a312eXhie3pxcHFzeGmBc2qDZ2RoYW9zjW1iaXBgcEFceGtWXk5RUUpKTVNZVk1dXm1XRFhgT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MEJoWTEzUz1lX0RMNktXZU8qPDJQWz0jkpmsmZ+Xp6Sin6ejuK+uoq+vqau4wrqzrZ+5r6uotLrHysi/t8G+r7S+t8S2w7GvurKywLW7vrepube9q6S0p6iqsK65saqbu72ksMC1tKGut7Wmp6exs6CepKanoaWZnq2nqJ6gqa6noKaXo6igsLiforGvoayhrKScpqepmpqbn6OVnZyanammlpufqJKYk5idkpmWoaqQmomOkId9iH+Cjn18oY2NiHmDjIWJjIyFh5KajomVn4mRlYKLl4yRfYR7c299cXN0YHl4aW9wcW9qf3JjemxpZmRhZoZ/YFtyanJNTX9pWFpNUExKSFBSUUlOXF9uU0RYWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmhIKj4vWlk1KJedpZiclq2gn6GkobersaS0tKmoucS1sq6gt6yurbC1xsjAt7/BubC0vbe/u7+vq72wtL+xvcO5qbu6t6eotainq7Cts7Gnmr23pK28tq+fsbewqKWnr7GboKSgo6Shl5uvpqGfoqevoqCik6Sko7ewoaaxq5+so6+YnKqlqZ6Xmp2lk5ucmp2mqpmcnKSVlZeVnI6Tl6OpoZCJipCGeoR+hIp6j5eKjYZ5goeEiIuOhY2TmIyOlpmKj5Z+hpeLj3qAenByd25vdF94d2RsbGxqaYRtZXJpa2ZpXWRzgF9aa3VpWkl9XltYT09KSEhSVUYyOV9ebFBEWFZZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mio7KzEzOWNsODRHQWZbSFREVV1oRS47MmJVLDKWo6GXlJyqnaWhoqC3qq6gurimrL3Fs6+uorWvrK2vtMPEvLO/urews7m4uri7rq3As7S4r7/BuKy8urWmorOqp6mzq62yopzBtqWotbWpnrK7qqemqa+smaKnnKOmlJiisqSZn6SoqZyioJOloKS5qKSnrqeepaGokp+poqGgmZudoJKbnJagoaubm5mhlJGUlpqOlJOjqKSQiIqPhnmEfIWGfZ2NiouGeYCEh4iHkYWVk5KMkJWUjY6Ue4OYj4t3fntsdHJsbHNheHRoaGpnZm+FZ2doY2ZpamBpYmlmWmV7Y2BTc1RbW1NMSUdJT1NAISppXmpMQ1ZVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEIzQ0RnW0tXR1VgaEIzNzllTycynqSjkY6kp5uenp2jtaynqrm3p6zDwbawrKK1rqevr7fAwLyywbaxrrK2tri3tqyqvbOvsrG9v7euu7uxpZ62q6WltKmrrqCfwquopbCzqqy1u52oqquxpZidqp6mpJGZpq2imJ6kqaGcop2XoJ2ntqavqq6hoZ6doZWgpp+hoJmbmZySmZ2UpZ2sopiXnpSTjZWXjI+YmqmgkYiJi4l5hXeCgoKdh4uCiXx/hIiGhJCElpWPjpCRkZGNk3uDlY6Gcn19Znhva2psZ3Vza2NnZGR1f2FkZmZlampjanFZXlhebWRhTmhXWmBWSUdIS01SWD45YGxpR0JUU1xbSUlHRUEuPD85QTg5UkdANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNBZkglNZukn5CMraGZmKCWpLSxorG9t6Gxxru5sLGjt6yqrqm5vbu7rcCyr66ttq+zuLOoq7mxr660tru2r7i9raadtaugobClq66epMKgsqSusa+3rbWera+trqKZnaiqpZ6Vm6iln5mlo6idmqCclJydrbCmuaiuo6Gamp6ZnqOapJ2XnpiblJqgkqiVqqebk5uckoyVmY2UlJmop42NiomPfIJ0goGLmIWHfImJhISKjIiShJOckpKPkJGWjpB/gIyNg2+Af2Z5bmhramdxcmtcaGNicn9hZWhqbmxnamlmbFxsbXVxYVRiaGRlWUlGTE1PWFFRVmFlgVRAVlNZVUZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSWVDJzSTopqOjrCdmpOhmqmysJ+4wLagtMK7vbmxpbavqK6lt7i3t6y7r62qq7eqtLmupbO1sa6psba2sLK1uqeon7apnp6poqqtnKnAma2krrC2ta2tn7GtsKqim5yjrKiblZyno52aqaKklpqgnJGbo6uqqbufqKSgmJqZnqGPa6KWmJxxgpabpIB2kamnnpWVn5GJl5mAloqgj3mGlI2Dbmp+d4NxbIaLhn2Ei4ZvXmNgZ4SXhmuLkJSTdXeLhH6Dj39mhoBodWlmV1xpc25OUGpjZnGEZ19kZm5saV5fX4mQhIZnT0tEOEVUZ15KR1BQVVVLSFNhb3RlRltRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNTY4LCMxJzIxNDoxNzZYgWwxNk9rW05cS1tmYj5HMVBkPSsvjaSZh5Wwm5yToJuqrqujvcWvqbfCuL28raa2sKWrpLizsrOwua2qp6y0prC1o6i4trWop6y2sq60rbOiqZ+0q56ipJynqJqsu5Wmpa+zuK2upaiuq6yloZ6coKemm5ihpqWbm6ennZOeoJmQnqiqo7Wwo6OjnZaXmJejiKGOkpqHoYeUnaF/pX+mqp6SkpuSiIRyeI2OhIihdoiNaZeIZn1zeKFviIeEfo17f6Ggn5mAe4eedIiOdpuKbIeBg21oZWN6bHFiVIZtY2xpmHFYam9uhlheaVtraluIcG15coZoh4RaXkZOPkZeTUVSVlZRUVJXVGdeTFhKUlJQRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFXYTcvKIyml4OcrJ2ZmZ2fqqqnqb/DrrG6vLfAvqqkt7CprKayta6vs7arqaWxraW1s5yttba0pqeps7Gtsqevn6qgsqifpKOaoaOcrrWVpKWmtr2mrKeqqqyopqKgmKCno5mZpqOkmJykqZaUopyVk6OlpqC3pKSgo5iVk5iTnIiuj5iUiamLl6KbhbGApKyck5mdlXmC1Kh/h5TBm8d5d7Glt5dkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB6gWyWsauweWhrWLGub2VpvJK8bmh5bXKP2H5TamO2sn+BcZR1mqGqkFdPV2FPVk5GVFtYUVBSjFxXXFBAXUVRTkVHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxXF00MSGNppOBpqmfl5ydpayyqLDCvbK1wLW3vsKrprStramnr7Oqr7a0qKimtaanuK+ds7K2qqWkp7GurbGmqp6npLGkoqGel5ugnq+tlZ6in7S6oqqooa2upaKdm5qiqJ+Ym6ign5iep6eRnKeblJ2hp6KgsKOfn6OWlpOYkpmFr2pqio2qfmeElYetZXGdnJSZpZVxrqGkfne7fGuhj3axX2q0W6WAZpyRYGaBemZ/anhqqWW+cmemjHayanyxeHSSk2NtbadtW4SgRWlnh5ZFdZxgfWd7pKeCWV+Lq2mBlXh6aqc3Sq9bV1RsY1tLTldfXFdWO06IT1dWL0lUVEpERUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzEbkaKVgqynpZ6jpKmxt6yzvb6wt8SyuLrCp6mwq6+pqbCvpLC6sKSlrrOjqbmpnrOysKOloKqtr6uvpqefo6KwnKOcmJWXm5ytppeboZ60s6Grm6KtraCemZegoqmcmZ6koJyZoaekkJ2jmpehn6yfpqegm5+hlpWRl5GahbWbtXiFqZm1mXeHs5u3fpOVlaiUfmuBpnqChYiSlJJ3q2drsVuse4+HlHSIcI+GgICIkJd4g4KLl4yDoI+EsHZ3n3Fra2x8i06kWEhjY5l+Y2imYHlydVOSh15QqW1jcX6HgGKdLlGhbltUa2dgTEtbZFhcWkI+sHhXWEEjTWlFQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjlhVTUwHJWflIizpaahrqmns6ypu7bCsLzCrbi3waqsra6upq6yqaGvvKqhp7StpKu1paays6ejop6oqrKosKelnp+fr5afmZWVlpifraKamqSota+hqY+pqKqbnpWYoKWomp+co5+boKOlo5Wbn5ianaOrm6aanZuioJeTkpOTnIPVk5m5cLDCfsaGfNaUm7t8mZWlj42cjaR7joekgqWCeqx5j51Wr3uJfp9quVq5d4aEfaaCk3yYeqp5jpyPe7FtjoR0kLyFb5RQr6fFilGgemNgqmJzcodsl4hgU7W0yIaAiXxjpDNCnXZdUWpoY1BAWGZaZGFKSE1sS1tTT1lmWkNEP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQy4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS1xQX2ZUN0c6YVE3MiWbopOYsaeopbOqpbSopLu3wbC6wLG1tbyztaexsKOws6afrraom6i5rqOvsaCztLCgpJ6fp6mwqLSppJydnqqXmJeWl5WWoauempeorbCpo5+PrKKnlp6XnKGloZehoaKhm6Kip5ueoZ6VmZumoJynlZybn6GZkJKVkZ2Ism5otXGrh2+OpnK0c3K2e5mYpIyPnI2ifpGgpX6wdoOR0tF2XK58hn+kb5uqpmuGhX2tfZeZj3uxc5OdjnizZZZ0hJ5vnmaUUsiLWsJcn3liX61fdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9qX2xpT1VGSTk9V1JbV1hIQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QT4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJOVF9lUDVHPWFNNjIvoZyRpa+spKq7raa0pae2u7yyur+3trW6urOltLShsbKjn6ywpJimuq6ksbGdtLiqn6adoqqksaesqaSanJqonpWUmJiSkqOooJeTpqqxpqKWk62fpZKUoZukpp+UmqamoZujn62aoJ6dkJacop6cpZWdlZqin5aZlpKbhax7d6h2o46Jh6lvrYqCp4OYmaGJkpqKon+TmYmuhX+Cs1xys1KufYOCpH9x1313hX+PnYaZmXevhoqRnId3tGGaZZqBgpRsklqwWEuadZh5ZmCtXnZ3h2eYiGter3eVno94bDV5yK6yX0FUb15nYEVQbF9xbVZVTS5lY2lTWVE6QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo4OJ+dlKC4sJe0wa2os6ipsrq4s7i/ubeytr21pbizn7Ssn6Coq5+Vp7arqLGyq660pJupoKCoobWmpqqjmZ6VpaGUk5yZkpWipZqTkKesr6aglZmpn6KPkaKZqKWflJmlqJ2cpZ6snaGdoI2Un5ueoJiZnJaXoqCTmJGmnYapfX2leKGPjoOqcK2LgaeGlaChiZeXiKOCkYiUqnyAi515b7FaqIKCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfoOVbJJcq1tak3+Rf2hnqmNye4FrmIdxXaxaiaCOa25lT0pDoVxaTHReYmVNWmFfcnNfSlU2SpqTWUhFPUhGQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC47PjAwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzFVX2JMN0ZJX0MxPjihnZmZvquXtMKuq62ppbSwuLG1v7m6s7G3vKq7tJ+wpJ6lp6eelKqxqbCqtayrr6GYoaCmpKO5oqOroJebkaKglZSfmpSYn6CPjYypsK+mnZebqKafjJKkl6iqppOXqaeen6GjraShnqGNlKGYn6CSnZeclZ6hlZaPq5uPrm1ytHKpjHaKpnO0eHOzgJGkopKcjYmkh5B3uG+Me4uia2u2WqCFZZeXaaGip22TcrR0k5h/smqFk4itanWzYZ1mom+HkmqXXK1gTaF8h5FSc6NseX9+b5iGcFyvVjycd2ZUb24uXKdPYlJrZWFsWWJcYHB7Y1NZUT4+bXAzQkJAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzwwMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV9hTDVGTV44MUI4pZqbnbqhm7LArq2rq6e3qbivtMC1vLGvubirwbapqqCbpqShnZKqqqe2o7Korqqgl5ynoKWruZ2jrZuWmY+lo5WNnaGbmZyfkZOUq7avp5mUnKyql4yTpZmlrKGRl6qypKCeqKuwmKGjkJmil6CblpuXoZOcqpyUkauZh9SSmrtzsMOAw4Z+1ZabuHiIkJeMmIqMp4h6o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiAim6aiHFujaR0vV13fVthebxrWlZbanpeamBkZmJtd29ZW1lDQUByP0NHKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaeanqG8opexw7Ctqqqrsae5r7bEsbqyrruwrsGyrKWinqOhnJuRqqSqsqS0p62kn5aaqpmmrLicoq6YlaGQpaCSjZyjnpidmpCWk6+5sKuVl6Oop5SQlqScpKydkaCoq5+bn6mjs56ipY6nopShmpyXlaSYj7CgkpWqnoWQmbaAkJGMuJV4gpObtXdua25zbnmPhI6Jc57Bu72ae4GyqHB/dJG4g3yGhouHjXuKho2XfKS7ub2cdXq0o3R2l3V0sHWZnmaGaY21dHJwd7aMXn95fYlog3lteWKLrHB1hX9ZW6dqRGRZU2ZgY11jUWdmcWx1Qk5QTEQ7Wkw+SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JWOCpPXV09KzpWVic9OzynnqCgv6WWtMO0rKunrKupu66wxq+1s663p7W4ramjoqaeoJ2ZlKykraqmtaion5uWoKOerKS+pqGrl5SdkKKbko+iqKKTnZeSmJSytbatmJ2kpKKLkpGmm6Wrm5aopKWcmqGppqejqaGSrZ+Xo56Yl5edno+wqZScp6KOan5pnKd4iXN+mo90emWHer6+wLpukoNxlIZfcmpaXpqJYWSHjpVrYH+VY22cdmKUa3+alZRlXmBjcZuKaXKMfYaVZ2p+cnR4fX1iW3d0gWhQXG6DfHuLa1hseoJySUpvhXBNdE1FV1xmYExbWGdjXk9bbXVpcVJPREVNO0hJPEw/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF5MKDM9W08nPzI+qJ+oocGjm7S6tqOtpa6nqLWxrMissLOstaO+sbKmoKOpnaObmpmsp66kpLWppZuXlaGbp62ovqepppWUnJWgmpOYpamnkZ6Qj5icsLK/rJumnqeiiZORqZqopJqbq5+jmZujp62in6qimrCblaagl5Wdn52XsKWYoqiZnJGdnKOkmaejmpyampqQloFnbX1xd5GXlJGFirWqjYaYlY6KjJeXh5SVioOSk5GJjZGTmJSYl5qgopqclKGdjoJ6pYVsanyQfIB0iYqBcYJ4eXZ2ioB7iWpzgXSDdWN3fXZrcHttYGNccGdNWVllal9XWm96bW1mU09GUzlPWk5STygrOkpCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLKgs6K/oqSxsregqqWyp6WwtarJq62xpbWmwKi0oJ6kpZyklpagq6aso6O2rKCZlpagl62ppcCeq6SVkpyXnpiTlKKfnqKnk5GYqKeyw6+aq52rno+WlqmeqpycoKyYoZqcoqWvpqGkqJ6tmJemnZmaoZ6enLCgnaKmlZiTmJSgopajnpegjpaUi4qNjpatj3yVm4KSgouqqIaBmJaKhI6fiHuEkIaFmZCHhomVjpuXjZCYnqSWmpORnY1/jWahs6+FiYR2eo+KfHZ5em9neZCBgIlrdYF5iHJoc396doOIgmt0Y3lmYGlkYmRmallre3BpalxTTFBEX1VGQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvvqyrrrKyoKqmsa2irLOwxbCqraOzrryktJygpqKhnZmXqKappqSms7WelZSdmZmwpq6+oKujkJGempmUkZWhnJepnISeqayis8izn6qkq5aWl5qnnaibn6SrlJ6fnaCqrqmlo6uhrZufoKGZpZ6cn52vo5mfqJOYmJ2RpZmYqZ6al2aDknxlfo6Zj2N5jWxoa3qRpKtrZZqYfmeFimVlaWh6jaGOa2iMl5Gid2tqi5ijn5lzbG56hIyHelhlXoWBXmyKiYB2XGhzd3eRgIeCbniCeIBzbXmDdHeIiI6De2qFWV5rdGRdc4hoanxxbGNdUU1XSmRYQEo0PUY3P0ZENzE8PT9BQzs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvrLOxqqWora6wpq6tsL2xqaikra+xn62Xn6OeoZqZpqucrKOmqKmyrp6Vo5Cir6a2uaWuo4+OmqGZk5KboJmZpZZ7payiqLPDt6Sip6+enpWeo56jnKOpqJGeoZ6gqq+qq6Oqn6ibpp+ooayWoZulsKSYnKqVoZ6ak6WYnquZnn6+g4hytHKEnYataHi5xLhxk6Kje6aYmXOqgnzLwMC7cYuih4KffJWYiZ7AvYKWnZ6NncLBe4F7ko2aw8B9a6Wxb4yAb8p6f5t3kYOOgXd6gX95cXp/h3F4hYyTeW12kmJmX3hkX2SAYl50aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAvI0ZbM1BZL1VBQjsvOJajuMO1sK/AqaiUo6+psK+tprK1r6qmpqaxq5+rmJqioJybqqeinauipailpLSjnaKTpq2st7Onr6KSkZqdpZKRoKGXnJ+dh6erpKutv8CwoamvqZeSn52imaKjqqOSoKGdnq2uqKymo6KnoKWlnq2pkaSbqa2qnJ2qnKyhlpellqGjmJx/zpR5eqSBeZWWm1+uj16Op4GioHynlZt0q4OAr15jjal6p4eFoHSXkoizY4KrhqGOjbNqhK50fZaHuGGCrVmjzW6PdXvae3+ZcH6Ik3Z/ZXuIdnZrfYhufoWRkn5tgY5gcWtwZ2BfeGRbcGhqZGZgUlRSV15LT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDtMLSFQQEY0LjGtwsC/tbSwuJiekaSqqK20q6ayrK2spKunsKqgp5uZpZecoq+foJ6op6OloZ+wrJuelaeurbGrqKyglJKbn6WTj5+ll56oo56upKuwqMDGs6ipsa6Wkp2copegqaqelKGfnJ2ur6eqqZunp6Shq5KttJamoquqnqOnpqGwoJKap5qhm5SUkZegcIWMl3WEqIdxsXydcax+oZ6BpY+ed6uCfa1/nHKtfquHhp92mJJ6fJd+qoiijJGLnX6re4mTj5+Ae61WnMR6j2+SwX2BlW11cIxtZXZlhm9hd25yb4mKkZCDbZCPZG90dXBgZ21kX29paW5mY1dTXGFaUlNDOUlJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rsNTGxrK0n52jjqOjoa2vtq6osKepqqiuq6unoqSdmaKVn6arn6KloKioop+dsKyXmpaop6+sqKepnpeUmqOikpShrZudpqOvrKOstaq6zbGtp66slpScnaKYn66snJagmZ2eqbGpqambq6mjoqybr7GiqKyuppmmq6qqsaKSl6Olm5SShaRqpHWJeql0erJwgqWJmYxxiKCah6RgYFKshH+ug5t2roGmhoafepiWhntmgKOJpJmGgaN9qX6BlIeuXnypVZ2ikoF6op+Ae8OvxYxzr7OzuXFiqa/CdGiNjJiPgW2akm9teXd3b2xmZGVxcGZ7aGNdV2BqWFhVTU1RTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY3NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzY2KjFQS0wjIEE5RDQsJ8PJ1tXAoZmrqKGvop6wtbCvqayjqKaqqquppKagm6SenaWnpqOcrJqiq6Gkn6+inZqSqqS1sK+gqZudlpSno5CaoqifoKacsaajp7GstsiytaqsqpWRnJyhmZ+ls52aoZScn6erq6OumqypoqGqo7OtoqqzsaKbqqivsLajk5akp5ibkXyqbJ6Eh3WreXywb4Kki4mflpWflIHSuLS4yYCBsl9flKmDpIiHoHmYlZp4qsl0maOVp6mQkpuMf5uJmsbGeGWhgqVzgZ+Ogn2vXnC1Y7F1S6OGbadHgpNkj5Cek3xwl5J/cHp0fHttW2ZqcnFmgWpeYlljbVxeWUlNTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPi01T1RRHRw7PEYyLCSnpMHGua2ps66spaKcsrmsqqGmm6imqqyppqCmpZiro5+uq52loKyanqilnaa1n6KXk6iqtrKsm6WdoJWQpa2RmZyno6Cqp66io6eqsLTCsrOqraiTiZecpJqho66ml6GVmJylpquar52tqKaerKO3rKGyua+em6+ns7SzpZSXp6OZn46CnU54moF/n3qEo3yCpISHp5+cnpOEuHt8ebmCfszGwrZ4m6GRi599mpaXinaemIqkmKOofrCFnIWehKx9mZRhpWyjcI+FkIF9l4NyrGCkc3GAmmC8fVJVdY6Ro5d8fpKRinR6c4R+cFttbndyaoFvWmRfaG5iZF1LTVFUQklIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaykq7mrr6Ccoayzs6afoJWlrq2uqqedpqaao6ehsq6iqKayoJmppJSitaKjlZehqbS5pJujnaOTkKGymZ6cp6ahoq+unaSoorWyw7Gtqq2qkYeQnKaco6ScpZeemZmZpaSomq6hrqWml7ClvK2ht7etnp61srmxs6eYna+ho56Gj9G1w7d5h46FkZOPgKZ4lKJ3jKCShKWBinGqhoS0bnJqmaOblYqffJiZhoePc6+CpZuijaaLk52JlJCbbXCyXKVzk3qcbJl/e5l9bqlhonFxf59ic7K4aHiPk6aYfoyMk4p3fHmNgW1peGl4c25/dF1kZG5tZmhgSlpYWDxIR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVlZUUU9RW1UlITJBSCQpJZNzjYqtv7+7urWel6ikrbWho5mVo6mnrqqrmaWin6WgoLWmoqinsKOUq6OOpK2jnZCamqq0tKSdpZ2pkpSXrqCgnqeknKectZqgqqO2q8OwqaupooyEjpyhoKailZqbnJmamaakppirp62ipZutp76slb6wrZ+jsLO6rLSnm6ixpKeYeqiQfXywd4qBpKWInG2yb6GHrXyhj4OolZiArIiFroWflKmgoZaGn4CZlYB7kn6rgJ2aloqqeJ2gj4mTkoB5r12jgXymp2SdgHyXdGuvXaVrcYWZXWBbjKBulZGmmYOUjZaLenqCln9rbH9ifXRtf3pgZ2Vxb2hnaENZYFs9S1QyVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pXU1BPTkk3MDUyLiosQVRWVlZVVFVVVVVUVFVUU1RWVldYVlVVUUhGSUojKCi9kpqEqcbCt8G0n5utn664paSOm6SjoK+vqp+kn52tmJ65oKKqoK+pma2hkKqopJaJm5CusKymn6ebrZiYj6yioZ2mopqlna2Yn6imtqnAr6WqpJ+LgI2bmqCmnpKVmpqUmpqlo6OZqKuro6Sfqai+pJfDrKqioayyuquup6Czr6mqmHavfpCLnIWHfbqtiphlsIxlla19oY+DppWagayKhLCFpZmkoaGQhaBbbGqBs2B/rXt7goCxbGdumZeMiLBbfbRbpINryKJln4B7vFl2tVqyfVKvgHqsWIChbZiPqJqKl5CWlnt4jZx9ZHN9YoN3dIB8YWpmcW5mZWVPVWNbQlRePkkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5QUFJUV1peX2BgYWJeX1xbWFVQTkpHQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsre9u7TBs6Ocraaltqihi5qgn52zs6meo6CdtJigs6iqq52vrZ2rm5WvqaKOiJuOr6ypp6Knma6TmY+omqKepZ+Zo6OlmZ6jqbKovK+lqJ6djnyLmpWhoJmQkpqbkpmXqJ6gmKitp6Wlo6Wpu5+gxqelqaGrtLatrqefvK2trJWBqZKjr4+bgIakl5iQgYC4w7qDjp2ThaeXnIKsioKviKabmqWqkH7VvcKqYqO/vX1+o4KD17q4tYWUk4Oevb6EaqOBb6uEbZ1/erKwx4Nqq7C9rXh3or67dICWjqacj5qRlpx5gZCaeWN9emSMZnmCe2BrZWtqYlBiW1NqXEBUYUJOKT06NC8eHyQeJTIgHSQoMDQ5NjY3Nzs+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1JQz88QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Sxv7myvbOina6mpbOmnYuYpb6pt7Goob+mprKbnrGcuaiera6lppWUsKyXjIObka6mo6yhpJyqoZiLo5KnnqicmqGpopmeoKutqbmuqKObl5N7h5mRppuTj5GYmI+Yk6mZn5ipqKCqpqGjq7ueqcWjoK+jq7O1q7CqoLuor6+ac3WqpLeGZYmfcGetj4qPbW93pJCZn4F1rpmVcI+LcZWno5uYrqRybW1tZYp4b22CmXGAeWlxaWeJlpWYcWhphIZncIZkXYljam9ZXWd+d6ZgYnGOkm9mZICNko6imJeYkJWefIeOlHVmhndojWp5fnlkbGNmbGJLZFhKa1k6UWVFUidLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola2zqrq5srOrqaKunqOyqZiSvbHDyL62qp7Aq6yjoKesn7qjpK2srKaOlq6pkIyFlZetnqaqop+jo6CRjKSSp5mpmZajqqCWnKWlp6+6q6yam5KSe4SWjaWXjZGRmJSNmJWnlJ6XqKKasKaeoqy6n7DBp6Szpqyxsqutq6e5pK64loqhqKW2nYmWopeHqZqQlJ2TqrOZm6OroLKWoqGdoKKcoKShlaumjJKSjIeSnJyUkJqTmJCNlYaBpJmXlY2Lk5KKj4aEfmeKf3SCdnSHjHGnbHuVkZSTgYGPj4+PnZSglZiWoIKHk4xwaI92cIp3dnx6amxkZG9jVWBYQGlbSGNhT1orRj0rJiE3NDAuHxwhJTIoKjY5OTQ2OTs+P0FCREZKS0tNUFBRV1RWWV5fYWNdXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqW1t66uorCkrZ+gtbGQjqvFvMS7uKqipZ2bpZ2wqaO2p52ptKankZisoouIiY+cp5aspKGZp56ek5Wjl6iaqZmUpqGjj5qnmaG1uqirmZqQjXyBlIuhlIqVkZWQkJOXpY+emaifnLajnaest6evwa6jt6avr7CtqamzuaGvvZmSpqOmtqKSnaaejamfjZKfo6yvmqGjsaivl6SgnKOpnp6dnJernJKZoZuTkJaqmY2ZmZaQlZ6RiaCdlZSFkoyQjJSKgH5mjIZ1hnZ5iINznGqGkZSUkYp9jJaSkpiToZOdlqCDh5eGeXGVcnmJf3F7f2puZF9waWBbYFltY1BgZFBbOkdHRD0yPT03LiomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9fXV5fYGFhY2FhYWBiYmJkYlxbY5eVpKijsLOsrqOpp62gqLWqkJCdpLO7r6ysoqOaep2isaSlsKiWm7imopSZqpyOhoqJnKOQrp+jlqigoZKXmJuui6uWj6iaqIyYqI+eubakpZmbjYl5gZOMmpOKlZGUkI2RlqKMnZ6onp+4pH+Er7WisK90pL6jsqB4ep+psruVdq2kn4qAqn5kXGJ2n46knoSXfm6Ts5yjp66romWen5NzeZmXcICYqJdsf6KniWWcpZyRl5iWi5GbkYadmpCVgpKHjo6SiYV3a4+HdoZxfIaAgGFpiIuVk4tbdpWRZ2iQjnJ7pZiYZHmYhoF3l2mDioJueX9rcGVgdm9ra2hbZmViYm9TWz5OTk5SRz1AVEI5MS8eHyY0OjMxNjY3ODw7PkBBQkZIQkZGSUtMU1RVWVxfaGZnV1FKPERHOzhVUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWablqajobCxrKuppaito6etpJKWq7Wvsaaaqqarl3OMnK+fqKqmlJa4oKCPnKOdkX+IiJuejauao5Wnop6Ol5GehXWukIimmqeRlqOIm7q0qKCZmIuJdXeTjZaTipSRkJSMj5OgjpqfppmcspaAjJy1nbOMko+8p6F+p6J6oq63gY6Opp6Ei4WPsamvjImWo5p5gYushpydoqepqIeVhph2pZt6h5uBl6aCgXucsXqKhaCXmZSYloGQlpaEmZljeYeQhI2PkoqDbXCPh3mAcYCBhX+GdIaElpJ4lmiTdKCadH2Zg6Cchph+kYmBg5hqjYyFa3h7cXBnZHduaWxrW2VramVzW15JVExRQEU1LllUVTYpITA5PT42NDM1Njg7Oj0+PkBESD9JRUpLR1JYWllbYWFoZllRSDlFTDs+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJijn6aurquorKCosKanqaWZlK7GvbChlqaotZ6Pg5yrnKahn42Qvp6ZjZ+aoJB9hY6Zl4irnaKWoKGSjZOJhoCRqI6Hopyjk5adhp+5sqeem5KOhXB1kImVkIqUj4+bi4+Rn5KWn6SWnqyIn7SJtJqtisqHqq6It4WNsIOxroOpjaaYjZ18qI9ye3ebjqaWaJWkebSLn56mqJKZwoF/q4iYoXGegJmkfZeFlbGAoXyhlKCQmJaAjpObipeRi3yFk4aNlZOJg21zkYV/enKGgYR8hHSFgpeBj8VmgKmHj6NrnoOhmYKZgIuMg4mYcI6ShWh3dHt2Z2h1cGdnbF5jb2xnbFhnR11RTDJFNDZNYGM3JjM8REdEOjY0NjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASmRZXWNmaGdiYmJiZGNgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLmwqqummpSgo6Sqo5akqbajr3+gp5ylnp2Jk7yZk42gkZ2QeYSWlpGHq5mbm5qihY+Md5ucj6CRiJ6km5WYl4aiuK2lmpyMjH9ibY+Lk5CNkIyNmIuQkZ+Pk5+hmaGofqGnh62doJauj56dnZGGgaCNq6+GpI2qmoyafqJ2gJmTaoGrdU2reIeNnZGbqKeAqqt9g6F7eqdpnn+Sa2eXhpe2iZ59bmBkWYOWfox7ZGiKcpl9eZVsXXuXbV9TcIRcX2x5g2BZZYJ9hIGYcaeqa4OjbnKlcJ+Dnmlln2xbbYl7ZVlfg39iV1BvdmVtdHJqam9eam9tbGlYaU9dV0U5QTRHQ15rNCxJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deX2N2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGNkY2FiaWtkYmRkZ2RiZ2VhY2iYlp2guaGqo6askqG2vKuuopmXoKGlra2gnK21oqiSoJ+fppuZjpi0mZCKnoyVi3WBlJGNiqaWlZien3+ShYaspIeckYqYqJeZmpGHpbCmopWaiImAaW6Ih4uOjoqLjZKLkJKijJOeoJyipX+TgY+joZSgd5yWj6eDoad/hqmthaV5in2Emn2icHKTh5V6nYx5bYecjJmQm6iaj4edfIKic3amZp5+dqRfmHp9knOibpi3tLpzkoeBf7WoZIHGuHtwlbeLcYCbpGNzrKtgfWqds35ufYeDjoKLl3GAo2xzpHOeg3+kX52Zs5VwfJeetHRzW56yg2pib3N1cWhvWGtscnNmXGleYktEPUQ1UUFZcTM9U0dfSlI9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltaV2BgfGRIQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7mZq5yToI2kuLWuraCbopyjo6WunJuxrayTl6CYoKSZmpOeq5uLiJF4i4VwgJaNio+gkJOUnZd9kImOqKCHmI+KkaKTm5qMi6iopJ6PloeEfmt7h399j42Di5CRiY+UoIKWnaCdoJ+LiXecmKKMoHKii4ipiJymkJaoq3+ujH16oJl6o5N4gHOWh4ycfZagh5uOmZumhqJkoXyIlpCbjWyeaJuNbpqZe4CKp31yaHOpgpyCc6pnlJpdm4V2hJ1oqmqAuGZcqHCBnGGVjF6ndnWJin+eaJp1h5OSmI5/n26akGynmVyofne7a36qW46EXbRnXG5xeXdraVtxanh5Yl9mWGJBUEVON1ZCUm40S1paX05aQ0AxNTE7OzdIPzpDR1Q/WVJZXT5EYl5WYFFhY31pRUI5TltdWGRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq2m6iJY5SbrLqysKydppycqJ+erpudsKirnZeimaGfmJaWoKOZhomMaoiAcXuXiIuWloSRlJiPeoqElqSdipSPhYudkZybiY+oo6CZi5GKgIBpgYZ5f5eMe4iOj4iPlpp/k6KfoKKTmHJon4qfj4xwkoyBqYiZn6OooKh9sK2joriXd6OzoqN/iJR4nXqrmn+ijp2bl4mXcaF8hY2vtX1rmpGheH6YtKOjq6iEmXyafJyZfnOqWl1ve5aLeJ5iTH56eoVjeZdCTZ9ZompxfI5tgYmEmXWbeYeJsbN/f5uTp3WAnW1xfJRvmXJqpF2VdkhlY2BzcH19bmVgbGh2fGNkYVFeVl1UVkBZRVFnRFNXW2JYXklEPUI4P0I6SUU4TERXQVZRW1ZERmJcWmBLYG1+cUVDPFVfYlplalZnaG1vYmZmXmFhXF1eYWhiX2VkdmxeZWdma2RmbGloa2mTnYCxrpmEU1+gp7O5s7OpmqKMnKucnKmToaukoaiPnp2cmpmVmKGdloeGiXeFgW55lYWQmot8kZOWiHKAiZOhnHORkIGImJSfmoSOqJyalIqLinyDbIWFcYGhjHiFjYiIkpmVfJKkoZ+jiK6GfbWEjp6de6WWeqmClp2QiqGdfadodm1+mXShc3F8nYWYb5OCrn2kg6aemoGjb16oZ3WjY2+lYZzTkHx6mXhyc2OjhZB+onKijnVrj7OLYIKYiXOqsqi8f3eDbX6+pqm0XpxufXGXb4FzonJdo2d0pmFopm2b1Jl8g5tvd3mXa5t6d5dzbamkZ2BleXB/g2tnZmRtdXhnYGJTW2VRUWJJV0lUX1dTW2VqXGRQRUNLTUpLQkpFOFA/UE1XU1hPUlJgZmVpUmN3eXdJRkVjXWRaaGlUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5t/satUXEt+qa+xtLCzo5yYhZiooKCjjaSooJipiZmXmJOZkpKgmI6HhXtwfYRofY+ClJqBd5GNjolvf4aQk5Jsl5R9iJCRo5WDjqqZlJKKhYl5g3aHgG6Cn4Z3gJOGiJmil3mToqSan4mzoaK2i3qsp6SupXCpgZqQhYGcknykgKKZhphynoSira6Jl4t/jKSNloOuopR2tba1yaFzlIqBn2Cdl6lteZWGn5p1oYd3oH6RloqAb0xmo5JwmodypHt5dGGDgmx+oGtxZGCccn90l2l7abO1tMamc5h+e51qm5urdYOabHR3l2maenWYclBEfbNeanZreIdmamdidHRxblZeVFloT1JoSVVMWVJVXWhrblZnV01KQUpNS0hKTkFRSlBkY2ltZXRyc355e251iXt7VFBPbF5oW2tpUmpoaWxnbGZjZV9cXVxeaWJkaGt7X11kaGNqZm9tZWlsZaGcibCnhGY/lKGyq6+vtaKjj4CXqaKipYylp52cpYKZl5aNl5CPm5KOiIJ5anmGZYOMfpageXWPiIyBaYSFkoOMhZ2NeoyKlKWSg5eol4yQioGJeoB9i3hwkKGGeYGVh4mWoJZ/lKWonJaWhGdueJxsomR8caV3nJhwZ6eBl4x7pXqfloOXcp52gYmUlo+5bpCKomJ9maKViG1yaatqdaBtbqZgm2mLkGiWh5qVdaKAfZpgi4WMdW+IYmigZZ5+aZp1b2NmiIJucqJaX1tjoW5diYxve39zcmSlbXeiZGenaJhzi5huoW9TiI9voF9lp1SLXVSYbW1za3GBbXBoa3hza29SWFdWZllTbUlYT11IWGloc2pZa1ZRUkVWXExYUmFUaGped3V6fHB8fHKDe39ydo2AhHZeUXJiZ2JwZ1BqaGhrbG5nZGdfXV5dYGtjaml2dV1cY2ljampzbGZrbWOcpZmmemV0bYunrqSpsLGmn4uAl6ucnqWMoqGaoqKAlZiTjZqPipeQjot7h3GAiGiLi3uXmnN0in2Qe2SCh5WKipWZgnyIhZamj4Ghq5CFj4mCin2AgI9zaI+mhH2GlI2ImKCOiJKqp52JpniWnH6liZaMspiekIOvl5+leJaIeql0pY+Emm6kooyShIyDvG58pa+ChoaHk5acn3ylenGolaCWZ55+b6tjloqVkneobKmigYl1h4J3q5GmiGuRsGt2s4ypa4qGbm2fnpKVYX+ri6p2gH+Mpp93n32FpZWdoGmah3asZ56tjLdzd76NpJNZg6aNq2F1cnNve3RxYmp+bmhtU1ZbVWFhXGtNXFJdSV1tbXdgW3FZW2BaZ3Nlbm9xY3F0YHd6fnlyeYNzhH+Ae3uMgYKAdmJ4ZGNtc2RSbGdob2xyaWZpYV9eXGJrYm1sem9cXGJpYmxqd21nbG5ilaaqnYGAnqSWqaqdqKeuo5mJgpermp6kiZqlnamchIyajoackYWSjYuMdIZ6iIRvjIR9l5N0dIZykoJtf4uSh4aUj3x7gYWXpI1/paWOgY2JhJR1goeSb2yLqYGDi5SOiZyfiY2Tq6OgkIB1lJeIfoF5lK6jf4GbcY+GeZCMhH97cqaMcX19epeWm4SOeHt+foiUlZOKdpCYn6CDen2JbIyFW3l4cXlwaG5+kolxf3SCj5STcYWEgmWNf1+Bf4t3dXOUdW95bm6HbYSGXndpeI1mgYKGjqmbfnR8l2qJiHCAdnyFdm1sZ4xzeXuYeIRba1h5j2hud3Jxb3d4b11shm5pZ1ZaYFdcZWtjVWFVX1FfcHh5bGt2ZWpranZ8cXJ0c2FvdWJze4F4dXmCdYCAf4B4i4WDfXttf2xkeG5eV25naHVreGppamRcYFpjamVscHVuWltia2RsbHluaGxvYY6Uuamni6GimqakmaScq6KghISXrJKdoImappqomIKBm4p+lpOHjomIjXKCfI99fo6EepePdHKDcJWFe32Ti4aGkIV4fn+GmKKMe6agi4WPkISVgoaOl3dyhaqGjpKckIienoiMm6igoKuDiY6Umn5+iZatqI+TppB4cJ2Rg3uSb36ohXB9lXFrcHyBn4t/ko6MaG1dg4uMm5uejnOVi4hxdGuCdnOAWXJuh5CBfX6Mal1qZHuFg4iAX2l4e5t7gouCdoGGgmh5i4drYXFyg3dfc4yCiZCnlYZmjI+DbneLhHCFjXlvZWdkeoN6lltcamdudlt7eHd0bXNygmZcbYprbGJZWV5aWGxxW19gWl5dZnR+e3VvdGNra2p7fHJ7eHRkbXRnbHt+dnp8e3p6f39+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hranFybVdbZW5sZ3N6b2hqbWCMjKqxopCjoZqenpiemaiioX2CmK2Nn5SHm6KQpZV/e5eEfJKYiIiGhopyfICLdoWLgYSVinFvgHKYhoR+koSDhoqBeoCDi5qej4KmoIZ4jpeIlYuLnZeEg3qtgpGYmZSKnp2HiKGroKKio4uIk5uco5mWqqGnpqCSm4iXjnx4jo6Ep35/kpGSk5yxppuUnpCNspOYhKWMjJWbn4mQm4KJkYprfI12d2WChZCKfImdhIeLj4iIgIWEkHd8eXWaoYiGip+LhZR/foyBgHZwdIaEf3iIh4uQppCEhY2Ig42QjHyHioiPgXZsgoR8eZlqcmhhdIpwfXp3dm93dIFdXm+GaG5fXlpcXVNocVVjW1xhbGh1fHxzb3Bka2ppf3tteH9xaW9wbGaAe3KCgHh/fYCEem2DjIZ8enh8fXqDeU5kdmtzbXB6ZGtlYmJgW3RmcGZycm1VXWx0bWh5enFnaWtljYidup+WoqGYlZmYlJmkoJ57f5mrjp6NhZ+cip6WfHiUgnuOmYmGhISGbXiAgHKBh36Ik4RtbH56l4aEg5B/gIaEhnyHg42anJKGqZ6DcoqPhZKRi52RfY17qoSNkpiVj5yXhoabp6Cimp2Gg5GamZmQmqagpp2dkJaBkYp3fIeOhKV7fI6QkYaYqaGdk5yPjaqOkYCejImTmp6Cjpd+ho2Cb3iFcXRgfoKPhnWLl4CDj4KGhH6Fg5RueXV0kqKLjIWahISNdICKfHxycnuIhHt5jI6Ek6ePhoSPgYSLiop3hYeJi3xva36Ae21obG1nXnl/aHx7dnR1dXt3XGBwfW51YGNaXV5RZm1TZVpdYWppdnl+cWtsZGtqZ4B/bHOAbGx0b3huhHluh4B2goB9hHZygo2Ifnt7fH97gopgaXtqdWhpgmRqY2BpXGR1aG9idW5sVGNxeWVwenpzZWltbYuKn7eaoaOfkpGWl4uan5+ee3idppCbioaklIuYmXh6jYV7iZGDjIKBgm18fnhzgIV9ipB8a2h9gZeIgYiOfH6GhId8j4CPmpuRiKacf3CLiouSh6ChioWMfKiRiI+Sl5OWk3iMo6Ghnpaaf4CQmpiTjJujoaSal5Gbfo6FeYCDj4eggH2MjI98l6SgoJKZkI+mjY+Bm5GJkpebfpKSfoaNgXV0gnB2YH1/jYZyipV8iItyjH+ChYaOaHdxeIyYko9/l36IinOCh3x8cHl7jIV6e5GNg5amk4uGkXyGh4eFdYKDiId6ZXJ7fnh6cGxqZl59c2h8dXVzfHKAal5gdHZweGRjWV9eUmtoVGRZX2FnanZ4gXFma2NsaGV/gGptfmhucWt9d4Z6a4yBc4GBfYF0doKNhn58e3+BfX+PanKDbnNpYYdobGJfcVZ0b21uYHhobVdqdHZjdXt7cmJqbnmJjZ+ykqWlnI6QmI+GnKCbnHx2pKCNl3+MooqImpZ4e4aHfoOJfoiCgH9xf3p0dYKFfomQeGdjfYaXioKKjXh9gIyDeZaAlZeVjJafmn1vi4GRk4amm4eMiYSmlYWSi5aXk5J2kZ6hoZiUl3p+jpiXjpabnaSdmZOUnHqQhYN4hJeNnX6BiY2Mc5einqGSmI6PooyLg5aYg5KWmX6YjXyIjYF2cX1uemR/fIqFcIaTf5CCbIeCgX+JhGV1b3yHkpeNfZN4i4l8gId8e3F+eIqGeYWRiouYopWBhI13iYWDgnZ7gYmGdl94d31zfXdmbGRhfmlqd3N0dH1xfGJjYXNudXNtYVpgXltrZFJiV2BhaGt1eIZwYmpjbWVofINsaHRobG9of3yCeW2QhnGAg4N/c3yDjIF/fnqCg358kG12iHR0bWWKbGphY3VWhGlxbmB5Z2xianZwZnl8enFgcmyGhZCcrZemqJ6NjZeHhp+Tl5h9d6qciph5l5yLi5iPeXuAi318g3uAgoB4dHh6c32Ag3+Ii4BkXn2LlYd/hYd0fX2Jf32XhJaTloyjoJd+cod6k5GKp4+MjoqToJGDkZCUl5GLgY+YoJqSkJF0f42SlImdnZ6nmJeNlZZ0jo+KbIaYj5l6h4iQiW+XnZqjk5WKjZ+MhoGSnH+SkpWGmYh8iYmBenF5a3Vse32Lfm6FkoKUd2+Cg31+in9kcmp7gJaXhH+NdJCJg3mHfnV4gH2HgX2DjYWNlKSQeIWCdImHfYBzdYCHg25ge3V6cXxvYW5jZHtibm92cnd3c3Rhdl9vbHVub1xbX11eal5PXVdjYWhtc3qJa19qZWpjaHeHbWZsaGlsaIB8endvkIdzgYOEfXOBhol6gn16gYR9fY5yeop4eG5sh2toX2lxY4docW9ld2hubGF5aGt9e3hwYXdti4GZmqqgpKidioqRhoqeipWXfXeumIyWfZ6TkZaTiHd9e4p8fIB2d3+AcHRzem+FfIGAin58YFx+j5GGf4OEc3p/hnqPkYeRkZuSpJuUgX2Ae42KkqSJjYqNmJqMhpGYk5aOiYmMk52TkIyNboOQj5GJnpmioZeWiZaRb4iahGeGmY6TeomFkIpwlZqUoZKSiIuZjIJ/kJ58ko+Si5mOe4qEh3RzdWtxbnV7i3RuhZCOknF0gHuBgYh8ZHFseX2ZlH2EiHSQi4F0iHlvgH6Bh3yFjImFjZWojXuIfX6LhXd+cG+AhYNjaHh0dW97Yl5wYGp0XnFqenh4bHJwZXhdbWxzbXNYWl5fYWpaUFdXZWNncXF/h2ZdaWhnYmdxjm9kaWdlamiAend0bo6FdIGBgnt1goiFd4V8eISFeoCJd3+Le3pyeYNqa19waHSAa3JvbXFnb2xlfGNugHl2cWx3d4p/opiiqKGmm4eMioGQnIaTnHSBqpSSjYagjJaTkH90e3aFd3h/cnN7hWtyb3ltinaAgIZucVtZfpGNiH+AgXZ1gH9/oIaPipGcl6CTl3eJfoCMiJ2eio+GkpiWhYmVmY+XjIuNjo2dio6Qg22IipCRiZyWoZuYlYWXiGqFo4Nnhp2KkX6Lg4uBd5OYkZ6RkIiJlY1/fo+XfJGNj42aknyKf4JudnBsbW5we4Vpc4OOl4pwd390gomCeGZzb3aBmY58iYR6lJF6d4h0cIl7ho17i4aEiY+co4h8hHeCi4B4eG5qgIKBXXJzcXBveFpecGBwal5vaXx5cG1tamx2YHBvanJtWVhhYWFuWFFTWmZnY3VwhIJiXWptZGJma5JtYGZmX2hqgXVxcnCLgHV/goB4dYCLgHiFf3eHhneDhXuGjH97dop/anFjfGKGfG9xbHRqaG9sdndfcX95e3R1dICCfqSVmq2fp5aFjIN/l5SDj591ip+UkoaKm4yVjYt6cnh0gXByhHNxdYhsb2x1bYh2g31/bW5VUYGrlIeCeIB2coJ5gaCBkYGSkpebkZp4kXqCjJKkmpOOiZWZkoSHl5mMlIyJj4+InoWQinxyioWJjoicmp+blpR/lH9php2IZ4ahiJKEkYOJcYORl4+ajY+Mi4+Nd3uSkHqOi4yRlox8iHyAa3ZqbmtrbHp+YXl+jpWBdnqAd4ONfHlndGx0h5WLf4iGe5SQcXqEcHeMeoqNe4l+g4yRn52FfXx4gox9dnBpa4GCeV93b21rcXNWXm9icWFfbG55cGdwZmZzdGhxa2F3ZV1WZmFgclNQTlxmZV14cIh8X1xocmJiZWaSaV9oZFtncH5wa3Bzin12fIWAdHV/jHl7hoF4iINzhoV+jIyDe3mVd2ZyaoJgiH5vb2t6YGpudH90X3R9eYZ4dHOFfHigj5mwnKWPgop/g5qIf4uef4qZk46EiJiOjo+EdnR2c4Bwb4VzcHGDb2tpdm2Cbn18bXRzUk6C38iS1pN8cHSCdYOfgpN3lJCYmo+Ye5NyhZCfoZOTkImTm5SGfpaViI2NiJGNiJyAjoF4eox+iIyJnJudm5WTeY12aImSh2yIo4WSh5eDhmOMkZiOlYmWjI2Ki3F7lIl6jYiKkpGJeYV7fmx7ZXJvamt5eVuAeY+NgHp9fn+Gjnp5aHNrc4uPioKFhX2VjGx+f2+AjH+Mh32EeYGPlpqainx3eIOQeXNtZnB/g2xqdG9oaXNtU15vZHBZYGtxd2ZramJmeHJwcGNfeGBgVmtfXXZQTktgZmNdeXGJdF1cZXZgYWVlj2RgZmFYaXNzbmtxdox8dHmGgnV2fotzf4Z/e4l+comHgZCKiHx+mHZlc217ZYd+b3BsgFpsbnl5c2F2enuNdnJ3ind5n4ubrpugkIKFd4iVfnyJnIeFn5COhYyXhJOOh4F1d3B5cW6Eb21ufnJkZHhwfG16fWpobGOkmsHcru+hc2t1g3WEooWRbpWPlJ+Tm4GRcIWLo5eJjZWKkJ2Wg4CVkIWJj4CSioqXf4d7dX+JeIaEjZubmJmPj3aKdm6GiYt9iqOEkYmdhYVei5SXio6IjouLhIlsfJaBfYiFiZCPhnaFfX1rfWR3dWpteHNXiHqRhoV6fn+AhYt+eGVzan+KjoqDgn+MloVrgnVuiJGCkYV/gnl/kJaTmZB1dHiIjXVzcWd1eYJidG1vYmh1Z1JgcWdsVV9udHlgcmNfaH1wcm5bY3JhYlduWVx3TU1MZGZhXnZziW1cXGR5XmBkZoVgY2JeWGpya25rcnaMfXR3hIF4d3uJcYOEfX6Ie3SLiYiVhox+fphzaHVweGyLem50cIFYcXp2eXFld3mGjGl2gIlyf5yHmKeco5KEfHCMlHh5i52EhaGNjnuVjX+ZiIR7cndwc2pvgWtpbHx0XmB4dntwdXtnYGV869q1ycPciHNsc4B2ipqIjWmXj46clJKBiHCFiKCOhYqVio2YlHyNk4iDiY97kYuGkIJ/dniDg3KHgpKblpSYhox2h39whYKJh5mig5SMnoOJYYOVj4aJhomNh4CHaX2Uf32DhImOjYJxhn5/cXdodXJpc3drWox9koGFfH+DgISKgnVhdGyIgY+Lgn5/kpF9boJseYaQhpOEfYF8f5KTkJeJb3J6jYZ1bHBrcniAX3NpblxqdmBSZHJpZlNfcHZ0YG9gXWiCcXNqV2doY2lYbVdbdUxKTGVnX2Jyc4VpW1xleV5eZGd7YGRfXFlrbmVvanN3in5zc4F+enZ6iHOFgnx/hnZ3ioaPmIKMgXuTdmx2dXh4k3RueHp9WHmFcYBvZ3l3koJkdoaFcYqWhZmhm6KKhnNvkotyd46cfYqaiIl7n3+DmX+BeHFzbm9kcn5oZmx3d1tfeXt6cXF/aWFnYX/Vto6QpnhucXd7cJKQjIdqmI2Im5GLhXtoh4uZhoGSkYaHmI18jY2BgYmOfJCMfoqFenV7gnpwhoCVmY6TlIGIdYOGdoOAi5Odn4aVj59+iGF/k4eEiISJjX9/g2d9kH9+f4KLj5B+bYJ8gnRrbXZ0c3Z1a2ONgY5/hX58hH+Eh35wX3NxhXyPjYJ8f5KJenGDZnqEioeMg3yFfX+UkJGThG5weox/dW1uamx6fWJoamlYbHVaUmlyamJRYnJ4bGFlXVpqg21zYlxnX2RsX25UWm9OSE9nZVxnbnF/a1pbY3NgXGNsd2RlXVxabGxibWpzdod/cW9/fHx0eIZ4hYJ9f4d1eYmBkpV8iIZ2iYFvd3l7hJNwbXyBd16Df3SBbWl7c5RzZ3KIfXKSkYOan5ughod2dpR+bXaTl32HkIOKjZp8i5p2fXZxb2xqYXR8Z2JpdXpaX3d8em1xfmVjaGhXnY9ecXKWvMODdXGUiJB+cpaLhpyTjIdyaoiPloB7lIyBhJuMfIuGfXyJjH+UiHWJhXZ3fYFxdYaBnpSGlY+DgnJ/iHWEfImYnZiHk46dgIhmfZOCf4WDiYlygX1nfot7eH5/h4uOfGmAfIN2ZW94eHJ2c2xqjYWKgYp/eIGAhIN/a15yeHp+jYqFe4KPgH5ygGl5g4eLhoR5hHyAl42QjH1ubXuJfXd0bmhnfHZjXHBiV29yU1Nuc2lhTmZ0eGVgXVxYboBvc1llYl1qbWBwT1lrUURTZ2Faa25te25ZW15tY1pjb3dkZlxdYGxqY2xqc3aCg3Fufnt/dHWDe4OCfIGFdn6JgZaQeIOKdIGIcnh5fo2Qb298gXFpgXl6fm1tfHaVa2p3hHRslI2FnpigmYWIbn2Mdmp4mI5+gYqClZeKeY6Wb3pzcGxqZGB0e2hfZXF6WmByfXlncXphZWWPsbJ3SmJapNnQlnF7kIqQd32Ui4SZkYuFbmuFkpJ6eZKGgISYinyHf3h4iYqEloBvjIhxdH16aXmFg6WQhJONg39vfoN2hHmFm5iTi5KQlIWHcHuSgn2Cg4mDboF4aICFeHJ/f4KKhntlfX6EdWNwcn9oeHBvdZiNhYKKe3Z4gIR5gWtccX1ygYiFiX2GiXqIcoFucYSHjoSFc4R4gJmNjYR4bm9/hH92emVoan1wX1l3WlhxbU5XcnNnYEtsdnRgXVtbWXR9cm9XZ11manFfbk5XaFE/WWdfW3BqZ3hwWlpZa2VZY3B5X2hcXmVtaGZsaXF3f4dvbH99gHVvgnt/gX6Cf3aBhYmXinGCjXF7hnx5eYOTjHVqen9sb350f31vcnx7lG9ugX94ZpKKgqGZnZGChmeHg29nepWJfn+FgZmKgXyNjGl4cmtsZl9hb3htX2JveFxka4J6YXF2X2Vl1Oq+ijI6PouOgHF5hYeOjXaDlox+ko2Mf21shY2Mdn2Pf4WClYl8g3hudoaEg5d3b4iFa3V7dGZ5goOnjIOPi4R9bn90doN5hpyQjJCRkoyLhn57koZ3f4SNg2yAcml/fnhtfHuBioN3YnmEgXFkcWh+bXRxdYGbi4B/hX5ydX2AcoFwW21+dHiKg4t7h4B8iHh6cWyIg5CEi3KBeX+Xi4t/dG5rdn+AdXVcaWh3cFlXfFNacGVMWnJyZVtKcHduXFpaWV10fnVoWWJbZ2ZuY2lMV2ZRPV5mXF11ZV90cFpZVG9kWWRxeVpoXl9nbWdqbGlwd32ObGmChH55boB8fYF/gnp1goGNk4VwgItueH6AenuIkol/aHt9anR7coZ7c3d9f4x5eIR9fGuMjIObnZaMgYBsjn5raH6OjHt+f4OUgn99iohrdXFnaGNbYmdybmBha3NhaHCJeWFzdF5jZJugj25cNVmvtXRpgIh8koZ2hZaFc46KiXdwbYWDh3V5iXiJfZOIen9zZ3aIfn6Yb3GGfmh2eW1leYiEpYeAh42Jfm5+dn+AfIyZh4KTkJiIi4SJfI+IcHt9hHtofm1rgHt6aXp2gYeBcmB3gX5xZHJndYJtdHuFlJGBfIF/bnd5fHR+bVhvf3Z0jIKGd4h2gol6eHNuiYGPgYVyfn1+k4mJem5uam2BgnVuXWdmc3FRW3tOXHBcT1tycGRWS3N4aVdZWVphcYB0YF1dYGdkaGlmTlloTUBhZFtgdmFddW1YV1N0YVpkb3JXal5haGtnbWxpcHd8kmtohIl8fHB+fnuBgIJ6d4CAiouDcXuHb3F3g397iY2Pg2p+e253eXaKd314gIKHf4N+fnpthYyImKONhIN7dYt5a2yEiJF4fXuBkYCAfoqDcHJwY2ZeWWdfb3BgYGdwZmpvinRhdG9bYWRqdnt/vpymo8i4cYWDc5N8eIaTgnORjIdycnCEe4N0dYd0iHeUiHl5cWN3hnqAk2lyhHZmd3ZjanyDiJ6Cf3+Ojn1yfnOEeYCRkIJ4lo2Uj4iCiHuIiWt4eX51Z3poa395c2l6doCCfWhgd4d9amt0aHt/aXaBjJCUfnp+fnB7dnt0fmJWd31yc4qEgnyDcYaKd3hwcIOCjX99eX59do6Gg3ZpcWlsh4JycF1oY3NuSmV1TF5uVVRZc25iUU9zeGBSWFhdYnCCc1thXWhlZGNqZFFacElEZGFbY3BeXXdoVVdVd11bZW5oVmteYWpnZW9vaHB2epJuaYiMeX1ye354gYGBfHZ9hIiGg3B2g3Jud4KCfomLk39wgHt3eXqBjHSDeH+BgYKEeoB1b36Ji5qeiH2FeneGe2d0hYyQen9/e4mGhHaPgGdvbl9kXFhlWW1yYGBgcGxraIluYHNpWV5kbYB3qdqpx4aHsnGJeG+MdXuGjoB6k4l/dXR1fneAcHF/bYR0lIZ4dWxgeoJ5iI9mcYNvZ3ZuW219gJCTgIB4kpJ9eHtth3WAkIuEdJaKkY6HhYV7f4VsdHZ/bWd3ZW17dW1qdnd/f3xgYniGemh0dWN+emd0hY6MlXt0f3VxgHp8bX9ZVnR+b3WEh3+AeWyIhnR4a3V/g4R9e314e3OLgX1zZ3RlbYqEbXRbal91ZEhubkxbYldWVXhtYlBTdHZXUFVYXmFxhG9cYGNtZWRebmJUXHJHQmZeXWZoXlt7YlFVXHVbW2drYVZqX2BuZmZrcWhwdXiOdGuOjXV/dnh+d4GDgXt0foSIh4NvcX90cXV+hYKJjYp7d394g3x8hYd4h3x9gX6EgHt+c3Z5jI6fjYl6iXZ0g3lefYWZjHmGg3SFhoV3iXtibmxbYltbYVZqc2NgW2dub2aHcWFxZlddY2t/fMrOiLmiam1timxxhHF8hIl+e5GEeXl0eXV1e2psdWOEdZGCd3BnXn2CeouJZXKCa2pxY1hse4aciIKBc5eUd357bohxgYqLh3GXjpCIhYuDe3l+cXFvfWZocWJteHFqa3F3fHx5XGV5gHdpdXhmgnZndIeLjZR8coZpb36AeW58XVhyf210gIt8gm9viX9xdmh3f4F/gXd9cXp0h3x6cmZzYW6MgmxzWGtfd1tJbmtNVlVeVFV7a2FPVHVyUFFUVl5idIVoXGBsamZjWW5hWGJwR0FoXF9lX11We15PVmRwWVtqaF1XaGBfcmZraHJncHJ3hnhulYp0f3p4fnmCiIB1c4CGhY2CcHB7eHd1eYaGhouGenx/dYt+fYWEhId/fn59h398eHZ5d5KTn3+MfIttdoB5Y4OHl4ZzkotvhYWBeoN0Y25qWV9bXV1UZ3NlYFlkcXFmgXNia2VXW2Bpf3e+rnugt21ic4Zoc3txeYKFe32Mfnd4c3Zve3Zlam5gh3WOgXNqYl5+eHmLhGZxfmhqa1pWb3iKpIGFf3GZk3GAeHWCbYCCkYdzlYiMiISIhX14dHJuaHlgam1gbXZqZ2preXd6d1tnfXx4ZXJ9boR0ZHWFjIaVf2+LZmt6g3VtdGJcb3xrdXyLfIFmdYd9bXFndX54fn9yfWt6eoF6eHBmbGJuiX5tblZrYHdVSmprT1JOaE5ZfGhiTlV1akxQVFVfZ3aDZl1gcWhnYVdpXVtraEpFa1lhY1dZVXlaTlZtalldbGVcWmVjXnRmbWRxZ3JvdYF3cJmFdn9+d398hYd9dXOCiH+Vgm5zeHp6c3OFh4iIhHmBfXaPf3yEiY6EgoR7fouDe3d8d3eanZd6ioKGaXd9fGyDhJOAco+CcYWCfoF/b2ZsZlddW1xbVGRwZF9XY3J1aXVwZWVjV1xcaIBwb3KAdIlkZHh+aXR1c3OChHiAhHl2dHVua3twYWdrZ4Z0jYRuZl1ffXB7iX5pbXdmaWRVV3JwjaZ8hHx2lpBze3N8em57e5CFdph8h4aDhoN8dHBybGd1XG1oX2x0ZGdmaXpve3JZZ4F3dWdwgHeCdWJ3hIp8lIBui2pteoFxZnNlYG16Z3N3inx+YnWDdmlrcXR6cXl5c31mfn9/eXduY2ZiboZ8bWtWamJwU0tpa09MTnBHXntmYU1VdGNKTlNXYWp2fmVcZ3NpZmBWY1dicF1MS2tYY2FVVFVzVkxYdWRaX2thXFtjZV93Zm1icGlzbnF+dHSagXd/gHd/foaFen11goR+l4VucnR7enVxhIWPgYB6i3V0kYB9gZSOgIWEfX6Mhnt+gHZ7o6WKeYmFg2t1fHt1g4KMem6Fc3mEfYGDdW5qaGVWXVtaWlRjbmVbWGJze2lobWlgYldfWmmAamtvgGhsYWh5eGpzdHRthIF7f312dW16aGp5al9lbmiBdo+EZ2VYYndpfod7b2lvZ2ZdVVhvaI+ndoF6fJCOeXVvfm9zdXmPgHeVdIWCf4WIdmpydmdobltsZF1sc19nYWl4aHttWm2CcnNpb4B+eXdgd4SEeI+Ecohxb3l/cmNxaFxvd2Rxc4h8eGJzgHBnanhzcmx4d3V3ZIN7f3d2b2RkY258fWtsVWliZlNLbWhPR1JrRWF4Z2FNU3FcSU1UWWVrd3tlXm1xaWRdVl9Vbm5XS1RoV2ZeWE5VbFRKXHlfW19rXV1aYmVgemhsYW9vdW1vdnV6mH13gIF6gH+Hhnp4eoN+gZOEcXR0fnp2dIWIkH2AfZBrc5WBfIOfhX+HfYB+hoKAint2hKyff3qIh4NrcoJ6doCAgXVuh298f3OJgGpvbWRkWF9aWVpVYmpnW1pedYFpXm5sXGFWXFxrgWZydH1pal1rdnVndHdxbIV7fX15dnJsemhpeGZdZHNoeneSgWNjVGVwZ4KFd3dmaGpgV1ZZaGSQp25+eICLjnpwcHxmeW96jHt2jnGEfX5/hm5kdnNkaGhca2Jdb29bZ19sdWR6aF10gG9ya3F7fXV1YXSFinqHhn9/d3J1f3VhcGxZcXRicXKFfHVkcn9sYWx6b2ppenh1cmaFdXp6dXBkYWRuc35pbFRpXl1US3NjUUdWYUdidmZhS1RvV0pMV1hna3Z6ZGVucWZjWlddWHZlVEpcY1doWFlJV2VRSGJ4Wl1fbFteXGFkXn9pamBvdHhtb212g5h5coGAfH+Ii4Z9dXaGeIeMfXR1dYJ4enqCjI59foSIanOXgXuLnX1+hXqBen58hohzcY+ujHt7h499ZXKIenR8fHZyb4Zse31sj3picG9iZV1lVllZV2Rma2BdXHOFaFhxblpeV1pcbHtjcHd2bGJbbHJzZ3R1cGyEeX6AeXdubnRlaXRlW2d1ZnZ2kXpfXVJlZmqCgnR9YmNpXFRYXmJjkKVoeXSChZB4bW55Z3htfIV7dYhygHh8eH9oZXZtYGZgXmpfXXNrWWVdb29iemVbd3trbm5wd3hzdGRyg5J+h4KIenZvcn1yYnhkW29wYXFxgnxzZnGAZF5udmlkZ3l6dG5vgXV0fXNxYl9mbm99ZGpTaFhZVE13X1FKWVlIYnRkYUlUbVNJTFpXaWxxe2JsbHNjYVpaW2F2W1NLZF5YaVNXR1lgTkdpdVheYW1bW19iYl2FaGhhbnh5bG9qdoGQeW2DfoCBkoiEgXZ0iXSMhnRyd3aBd3x9foyPgH6TfnB4loN9mZJ5gIB4eX1/dIiDc3CZont7f4iUeGR1iHlzeHVsdG9+bHl8cJFyXnBvYGdibFRbWldoY21mXFxxiGVScm5bWlhYYGx3ZGl1ampeWm1zcWxzc3NqhXx+f3x3bm5sZGlxY1tqcmR0do9zW1dTZGFygH9ygl1iY11TWmBbY5OfZXJxhYSRdGxqeWxvcHp8e3GAdn9yenp6ZGZ2Z11iWmFnW153aFdiXW9oYXdgW3t2amlybndzc3RocIGUgoZ+hHZyanB8bWZ3V1xrbWJxc4F6c2Zvfltgb3FiX2pxfWxsdH5zcXhrcGFcZWxsemFnU2dVV1JQdltSUFlSSWNzYmBHVWpQSFBaVWtra3xlbW9xYVxaWFlscFdSUGZWV2lTVEZaXE9IcnRYX2NtY1hhYGFdi2pjZG15eGtvaXV5hntrg32AhJl8goR5fYhuj4Zxb3d6fHSCgnyLj4OCl3R3gpSFgZ+JdYCAgXN/gXCHgnVvopd0e4aLhntleItvbntvZnhwemxzdnKMa150bmFnZWtSXVtWZ2JsbFpccYxkT29uXVZYVWdqdGhidGVlXVltdG1wdXV5aod8f3yId5BzZGRrbmFcbm1jc3iHa1pUVmJjeH19cYVdY19jVFtgWWOWlWNucIOFinNqaHpuZXN2c3xsenR1b3p+dV9mcmNbXlZiZFhhdWVVX2BtZGFxXV1+cGhpc3FzcHV1am2Ek4GIe4RxcmZufXByb1NbZmpmcXSBd3NibHZVYnFqW19uZXxlbXZ8c3Jzam1gWmRqandeZlRkVVZQVG1XUVdTUEhlcl9hRlhpTkhXVFZtaGR8aWt4a2JXXFVbdGRTUldoUVlmVFNIWlpQTXh3W19lbGlaYmBeXo9uYmZreXVub2h2dn9/bIOAfYaXe3+IgYp/a5OIcmd0gHt1gIN9iI5/jJNzfIqRhYefhnt/hoxzgIZzfYN2bqWMc4GNi3Z3bXqMYGR8cGZ6c3lsbXF2gmdke2xjZmdoU15eVGdgbG9bXm6NaE5qbWBUVlNvZ3NrZXhkZV1Yb3Rscnp3cmyIe4B2nHt6a2FlbG1eYG9qZXB5fmdaVlhga3h8e3CEX2JeZ1ZZYFdknIhia3GBh313a2t4bFt2cWx6aXVzbm97gHJYam5fWV1VYWNXZHFjU15haWFibFpgfmxma3N1bm13dmtohYx/iHqHbXFmcHxtcm1jWWFoaW90gXRyXmlsUmVxZFRibmJ6Y3F2e3VrcG1rX1hhZ2h0XGVWYVZTTlhlUk9cT09IZXBdY0ZZaU1JX0tYbWRfeGhufmRgVV5UXXRbVFJgZk5dYVRTSlxZUFl1dl1fZm1oWGNhW16OcGNnandxc25ndnR6g3KBg3qIjX58ioeOem6QinRsc4J0f3+IhYaRhJWPeX6Mj4iRm4SAfIyEc3+Bc3R4cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo2Ojo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Njo6Ojo6Oj4+Ojo+Pjo6MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8fH1+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREVCMS8vLy8wLz5EREREREU4Li8vMDAsSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1NTMfHRwcHBwcLjc1NTU1NicbHBwdHRg6g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmJiZmZKPkJCQkJCMh4eIh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWGhYODg4ODg4OFhYaFhYWFhIOCgoKCgoSKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQj5CQkIuOkZGJh46KkJKTkImPjo2Ph4+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ojo6Oj4+Pj46Ojo6Ojo6Ojo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCMiIaGh4yGiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkJGNh4aFjoaLj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyKjpCQj4eLh4eMiIiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yMhIqGhoiFiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2Ii4qKjIqOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSkpKTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dXZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhnbWdqZ2hlaGdjYmJhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWl5dWVleYmFeXlpZX1tYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NUFFRUVFRVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9QUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhISklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojs+PjxFRD0/RUE/QEFAREVHR0dHQkREREZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozs8PEhMPT1BQEBDRD1BRERGQ0ZGREZJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR1c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5Nzk7PD49Ozw7ODpAQEFCP0FAQ0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Njk6OTo7PD83PTs6Ojg8PD1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PD0/QD09PT9RPj09PTxBTDtMQjk7PD49Pj9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQD08PkBBP0E7WnlPPUNFPkRYPFlOOzw8Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRkQ+PDs9QD05Ojpvd1k3Ozo8R149YFw5Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHFycnJ0dXZ6e319fX5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQ19JPDtGY2dfV3d3WDc4ODhNYkJlaDw7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0BPfHRGRnWGhoaCfHdZPD0/PFNqR2drPjs9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQFV2enB2hIODgYKAfVk+QEM+U29MZGg9Oz1BRUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAUHRzf4OAgYR8fIVtRkJDREJSaWRzcklAQ0VISUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVHbHN9gHl/hYB9hnNGQ0RETWd9h4iIflhHSFFQTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdgen+AfIKEhoWFi2xAQFZ3hoiHh4eIglhSXk5MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMS05cfIOFhISEhYaIgFZshYeGh4aHiIiHfmlWS0tIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklJSEhJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlqDhISFgIGFh4aDgoWFhIWGhoaHiIaJe0tJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkBBQ0NCQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJaIWEhYR/gIODgoOEhIWFhoeIiIiJiYyNZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzU4ODs7Oz1AOzk5OT08Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlphoWEgYCChIODgoOEhomKi4uLiomKi4yJVDo4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmiFg4GBgoODg4ODhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo6Ojo6Ozg5ODk4Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1d3l7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo+doSBgoODhISEhIaJioqIh4iIiYqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw8OTo8ODo6Ozo5OTk8Pzw9QUJESUpNS0lLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/PUqBg4KChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQUI+QEJAQD49Pj5APz8/QD9APT0/Qj9BQT9BPz1AQEA+P0E9Pjw7Ojs5OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCVYSCgoSFhIWEhomJiIiGhoaHiImKi4uLioqLiotePkRHSUtKSUZHR0RGSEdFQkFAQ0VDQ0FCQ0I/QERIRUNFREVFQUZFRkRFRkRAQj88QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDQ0VahYKDhIWGhoaIiYmIh4aGhoeJiYqLjI2MjIuKiohXSExNTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0dnd6eHt8fH19fn5/f359fX19fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT9CQ0dHSluFgoOFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTU9NS05LSkxJSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpPTU5MTE5LR0dHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg4PDs8PTo/QT5AQENGSUpRYIKDhYSFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpISEVKSURKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1VucHV3d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo8OD0+Oz1BPj9ARUlLTVZyg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMi4uLi19SUlBNTk1LSkdGQkdKR0xKRktPTEtKSk1NTE9QTkhJS0xPUVFRUU9PSklKSkxKTEZHSEdFR0lGRUVCQEJCXG9yd3h5enl5eXp6e3x+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FITE1RV3mFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pERUZLT05PV1ZRUE9RU1JNU1RPTVNMUFNVV1JTUVBMSk1NTUtOR0dKRkZISkRERUVCRENjcHV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JDR1ZORk9RUVVZfIaDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyPi4uLZ1ZVa2FFUlFRUEo7O1FTUmB1XVVWVFZZWVJZWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tISEpIRUZJSElISWlydnl5enl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUlHR0ZFPz9BQUVCQ0dFREVMWFJNVFZWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD5AVlVZXGRgVllicl5dVl1aVkVRWVpbWV9UWmdSVVZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUlZWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lJWVhZW11YWFlXUlFOUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSUZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXFtcXV1XUk9TUFBRVlZWVllabnJ0d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVFNUXlpYV1dXemtYWltcXlRRUVBJTk9XVlhaWmRxc3Z2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVVFJPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtNTktNS0hKREZIRUM+U2NVf1JRUU5LUlRRTU9ZUU1OUVNVVU1RU1JQT01MSENJSFJUVVpcbXJ1dnVzc3d7ent7e317fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlZVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDP0NDQ0NCP0RQQkRAQz5CSEdWQEhOTUddaVFIRk9GREVGSEdIQkNIR0hLR0NCQURAT1BNU2RzdHV1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJbWFNRUFVSc1dlW09PT0xRU1FVWVNVUVFUU09WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPz87Oz5AQD8/PmtRS2FFRkhJRUI/R0xNR01RVUlCRT8+PD08PT0/PT9BQ0M/Pjw9Qj5KTUZVbnV1dXN0dnh6fHp9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSUpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9e3h6fHx4d3hkQkBAQj06QkNBQURCXF1Pe05PT05LTE1PT1FMS0xXTUhHQEI8OTc3NTk5PTs7Ozg5ODk/O0JIP1x0dHV2dXZ4enx8fH18fH19fn58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5gZWBdXnF2a15gZ2t3b29sam9ubmxmYlhHRkZIQkFGSUVFRkRNUlBhV1JYUVBTU1JVW09PUVdQTUpDRj46OjY0ODY5Nzk6MzY2Nzk1PEI9ZXNzdnd3eXp7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUxUVFNRUVVPTFJTVFdYVFRYUUxYWVpWWFhWWFldV1dYaHNrXVZhc2thYV9dZGFfXllVUE1PTkxISEpLSUhGQ1FQU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg1NzU3ODU5OUducXR4eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RVVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RWWFRbZkpMUFJST01NTk5OTEpGUFBVWVNUTkpPT1RTVFxWUlVTUk9NS0lISEY/Pz06Nzg3NjU5OTY3NjY1V3Bwc3h5ent8fX19fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0pIT1BPT01SSk9QUFBOTk9UTE1JUE9TVFUyPFhNSUFRPWNhUVNRUE5QUVBOTk1QTlRSUFJNSUxLT1FQUVJTVFFST0xNS0xMSENCQT06Ojg3NjtCNDU2NjtlcHF1eHh7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRkJGR0dIRkpESEpIR0VITEhLSEZMTVBNRy9FX1I+M0A+am9hUlJRQEZVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc2RG5xdHZ6e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hFRkhKTktFR0NPUkM4RU5TXWZTUVNBR1VQT1FRUE1NTkxKTEtMTk9PUU1PT01ITExJS0tMS0hGRkVEPEFBPjtARTs8ODlUcXN1eXt7e318fHt5fHt6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRXV1VMTEtIPTk4Nzs/QD48PUBAQj0+RUhHREZGSUdKSkBGQUFARkhFSk9IUFJhXFFQUk5TT09QTExPTUtNTE1PTltXS01RT0dJSENJSkxMSkZGRkQ/QkM+PEJGP0I/QWRxdXh7ent7fHt6end8eHl9fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPjs/QUBAPkFESUVDSEhJR0lFQkI/Pj1DQUFHSURNT2JlUU1PTldLTE1LTE1NTExLTk5TZE1KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLb3B3enl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9IS0U/Qj05OTk6P0I/PEBCQUFERUdLRkRJSUdHSENDP0I/P0BBPkNFQ0tNUVRMSklNVEZJSUpMSktLSUlMTU9QUlBLR0NLR0NCSkpMTU9NSUpJR0NDQ0RJSk1MSVpzbXh5eHp7e3l8dnJwdXJ0eXl2eGpxb2psbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FqcWhlcUhLREdISEdKS0lKS0RHQj0+PTo6OjtAQj89QkJDQ0dGSkxKRUlJRkdIQ0M7QUBCPkBAQ0VDSU1QR0lLRkhLREhJS01ISkxISEpMS01dUklIRE1GQURLSk5NUE5LTUpLRkdHSk1OUU5MY25pdnZ3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRvRktERkVHREVFR0VHQkNAPjw9Ojs6OkBEQD5CQ0RFSUZKSkxGSUlHRkZEQjtCQ0M+P0NDQ0VHTE5IS05IREhFSUxOTUhJTEdFRklJTE5LSkhFTkhDR01MT01PTU5OTUxJSEpPUlFSTlJmZ2Zyb3N4dXt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkRGRkVCQkJFQERCPj8+Ojs7PTo9PkNBP0FDRUdKRkpJTEhHR0dGRUNAPUVFQj5BQ0NDRUdJSUdNUElGRkdLTk9LRkhKRkVERUlJSEtJRkhQS0RJTUxQTU9OT09OSkpJTVJVVFJPV2RgYW1ncHJvcnl6Z2VoaGNpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0JBQkQ9QkE+QT06Oj0/Oz4+QEI/QEJER0tGSUdJSEZGR0VDQkFBRkZDQkNCREVER0dIRkxRTElPSkpMS0lHSEVGRURDSUhIS0pHS1JNQ05PTVFPT09OT09LS0tQVVdWVVRYYF5caWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3FyamtzTUdHRkhCQkFERDxBQUBDPDg5PT45Pzw/Qj9AQERGSEVIRkZHRkZFRENFQ0RJRkNGRUJFR0VFRkdFSk1LSFFNSktISElFRkhIRUNJSUpLTUtPU05EUVJQUVFOT01OUE1MTlNXVldYVlhdWl1kYGhiamlna19lZWdjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpb3pNSEdISEJCQkZFPEBCQkQ8Nzo9Pjo+OkBCPj8/Q0VGREZEREdFQ0VEREVGR0pFRUlHQ0dIRkhGRUNGSkpHTUpMS0hKTEZJSUtIRUtLTE1OT1JUT0lTVVRRU1BRTU5RTk1RV1pWWllWWl1aWGFgYGBeaGVjYGRlaGdqaWhqZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3Vub3JzeU5JSEdJREFDSEU8QEVCRT04Oj4+PTw8QUI8Pz5BQkZDRUJCR0RDRUVGR0dHSUZHS0hDSEhHSUdGREhLSUdLSE1LSktMSExLTUtJTUxPTk9SVVZPS1VWVFFUUVJMT1FQT1RZWllcWllbXl9eYGNeXGFja2JgZGdocoVoZ2lmam1ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnF1TUlLSEpFQkVHRTxAR0NEQDk8PkA/Pj9DQjxAPkFBRkNFRENIREZER0VISEZIR0lLSkZKSEhLSEZGTEhISEpHTExMTExJTUtNTU1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXF5fX2FgYWRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2b3ZKS0xKTEdCRURFPEBGRERCOz8/QUBAQERBP0I/QUNIQkVERkhFSUVGRElIRklISkxISEpKSUxKRkpLSElKSkdLS01NSkpOTE5OTlBMT1BSVVhWTU5UVlVTUlFQTE5UU1JXW15eX11dYF9hYWFgYmRlYWNoYmRpamd2i2xraWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZvd0pNTExMR0RDQUQ8P0VFRUM9QUFDQkJDRUJCREFBRUdDSEdIR0ZKRkNHSUdHSkZJTEhKSk1LTUxHS0lITEtOUUtSUUxTTUtOTk9QUE9UT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmBiXmBlYWFiZ25oYmloaG14dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE1MS0xHRUFARD4+REVGQ0BDQUVEREZDQ0VHQ0JJRkNISklISUtGREtKR0hKSUlLR0pKTktOTElMSEpNS1pmSmRcS2xTSE9OX25Va3NbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUYHd1aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlLTkpLSkZDP0BCPz1ERUZEQ0RCRUVFRkJGRkhEREpFRUpMTEpMTUdHTUlISUtIS0pJS0pOTE1NTExJTExMW3NiZHBebG1VTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpyeXZrYmBrZWVteW1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRURAQkI/PUNGR0JGQ0VERUVEQ0hIR0RFS0dHTE1NS01NR0pOSEpLSklMS0pKS01NTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtb3ZcWWxRXG1tWnFta29teHh0c2lwXF9ya3FqVXV5eHBjXmtmYmdxcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHR0VFRUJCQj0/QEZHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5ITE1JTEtISk1JS0pKS09QT05NS05NTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkdFRlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2hhZGp1eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHdJTUdJREVEQ0FCPEJBQkZER0ZMSEVDQ0hLSEhGSkxMRk5LTFNSTEdMTEhOSklITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210Xm5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZ2Jiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dEhLSElCRUVFQUA+Q0NCR0NISU1JRkNGSkxJR0ZLTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTE1NTUlLSktTa2JaaV5famNyclpfWWpvX2VlVWtfY1thYlFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSURFREZBQEFFRERHQkhKTEhGREdLTElFRkpPTElPSUxbUUpGSEhLTUlISkpLS0lISUdLS0xLRkhKSkxMTEtJS0xOVFtcVFBUTFBPTk9PVlFPT1FPT1FKSU5QUWRxaVRZV1tbXFVZW11YXVxcY2ZhYWZiY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNIREVHRkZBRUM/Q0dDRUdDSUtMSEZER0tMSERHSFBLTE9LTFdMSUVFSElKSElLSUxKSEZIR0pHSElFRkxISUtOTElPXFdeT1xbYF5PWFlTXFxiXk1ZWk1YYVJKWWFaU2BkXGFYW2RkVlZZXFlaWFxWWVxdYl9kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydFBCQ0RMTUJDREJESURHR0ZLSktIRUVKSkpGRUhIUEpMTUpNU0lIRkFHRkpJS0tKTEpJRkVKR0RGR0VFSkdDSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5eXF5TW15jXlpdYGNgWV9iW2BeW1RYWFleXWNjYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUlERktLS0VFSElOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlEQ0NFQUZKREBKS0lPW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXl5jYWBiYmJjY2VaUVlWVVxZXmRgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUtHQ0dFQkVHSEZHSElGR0pHSEZIS0lMRERLS05NTExISkpISkc/R0ZOS0tLTUtLS0lHR0NEQERBSElBP0lKR09dYVpbZF1fVFFTWF1cXFxfWktXXExSXFlJTV5QT1xfYWNkY2NiXGRjYmRjZlhRVVRTW1haYV5eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhYaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktJRkZHSEdHSkZGRklMSk5FREtKTE5KTElLSkhJR0JISFFNS0tPTUtLSUhHRUQ/RUNISEFBR0ZFVF1ZXlhfWV9bXVVYWFBdXVFLSldeWF5bXVZaYFJRX19iYmFgYmJgY2JiZGRiWE9RUVJbU1teXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIQ1JLRkhISEVGS0pNUEVHSUpLTkxMSUxLSUlHREhLUU9NTVBMTUtLSElDREFFREhHQkFGRURXVUVcVF1TVl9YTlRVTlpbTUpLVWBhW19YX15hXU9ZYl1gYF9iY2JdYmJXX19UUE5QUVhSXVxbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERUZHRElSYlBEV19JR0dIREZNSlBQRkpJSktOTEtLTEtKSkdFSk1RUU5PUE1OTE5IS0FEQUNERkRDQURGQk1IQ0xMUE9PTEZNRkdJSkhHTExNT1BJTE9QUFNQTFBUU1VaWVdZWFhkVk9TVFBQT05QVVRcWVlaXVxgYWRlY2hja2xwc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdIWU1HSEpIR05MUVFJS0tLS05OVU5PS0tMR0dLUFNTTlBPTk9OT0hLRWBFRF9MRGZjRE1bSV9cc21PTVZtWUxDUGBVbFdnSl1XVV5ETVFVTE1UVlFTVFhXVFhVVFxUUGZaaGhkWFRrVFdWVVtcW2BgYWJiYmBmaGZubGhyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1NJS0dgVEhKT0pJT01SUUtMS0xPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpQf1FJfFlZcnNXUG1IcW5wYVZQcXFzUEJrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtgVlVXf2p0dXVfYHdgWGFcXGZbX2FhYWFeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMRkpMRlJWTEtPSUtSWFdRTk5OTFFUTk9RUEtMT0dNUFNbWlRRUk9QUFBKSFp4XVR4ZWhZUlRRdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvcIFdZXp1eHFxenF+c31rdX1iUmd8ZXNzb3NzfH1vfXlvf3JfYGBiYlpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1IS0pISlBOTU1KTlZeWVVMUVNOWFpMU1NSTkxQSVFSVFlXV1BUUFBQUUtHZnhsY3hybVpKTFV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlYc1Foem1panp6fmx4en9vZ29YdnZqdXVwgGBzaHxpbHh8b15fX2NiW11iZGdpamRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdXpufH15eHJuTktTdE5DQkVQUEhKS0pMUE9PUE1QWmBaWEtUV1BhXlJWUVlTTVBJU1RWWFdXUFVQT05SSktyb3V1cXVxZGhgVm5McXBeRmh5V3ZUTGh4fXhgeXtzbmFebW9kUmdydW5teXB3bHZ0dHFsbVx0fnprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZWVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRyb21MTFtWSEdFR1JQSkxNS0xRUVFRUFFXXFlVTlZZVWZYUlJZXlRNTklUVFdXWVdPU05OTlFIUm1IaXdLYGR2dlVXbE9ubHtzYWpnf3ZVS1draH1sbWx4YFtwenteYHpzY3JveHFoZXxpcntdVEtsYHZ1a2l1e3ttfnhrfHBdXl5iW15iZGRnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3Nya2hsbXJ8a21oa3t0bW1rbU9ISktISUlIUlBMTk9NTFRTU09UUldSVlRQV1pWVlRUVGFgUU9OS1RUU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWFFOUFVUWFhYW1tVUlNXW1dYV1pPU1VXV1hSXVlXXVZUT1lSV1dXWFlfW2dyXltbWlxdX2NaX2NjZGZkY2NiWmNjZmZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tob3poZ2drdWpoZ2lsUUlLS0xNS0pTUU1RUE9MVlZUUFRVWFVZVVJaXVZVVFdVWVhQT0xNVlRRTlVTTk9NTFFQS0pRUktRTUtLT1JUUlFRU1NJSExOT1FSUVFRVFZSWFdcV1NTUVJVVVZTWlFPU1JXVVRZVlRZVVNSVVNUVFhZV11aX2FdXFpaXFxgY1xdYmNkZ2VkZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRjZmhQSktMT09MTVRQTlNRUU1YV1VUVVdXV1pWVFxgVldWWVVYVFFQS09XU1BOVVBOUU5LU1BNT1VUTlFOTU5RU1BUUVNUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdXV1lbVE9UVVhVVFlVV1lUUlJXVVVXXFpbX11WWV9dXl1cXWFhXltiYmNoZmVkYlhfYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl1dY2hrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVpZWFdYWlpYWVZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBQTk1RUVBSWFRSUU9NT1NVT1dSVFVVT05NUVNVVVRUUlRYVlpdXFpWVlFSV1hWW1tXUVRWVlZWWVRXV1RSUlhWVVpfWl1fX1dfXV5gXFxgYF9fWmJiZGhoZWRhWWJgYl5eZmRkYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRkYmRfX2BcUE1OTlJRTVJST1NUUU9VXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTFBTUlVaVVRQUExQV1ZSV1NTU1hNT1BSVFhVVVVTVVlYW15dXFtWUk9VVlZbXFdRVFdVVlhWVFhaVFNRWldWXF5bX19gVmJcYGFdYGJfXGBdY2FjZ2lkZmBZY2BhX19lZV9gY1taXFtcWlpZWVdcWVxbYF5gW15eYWBfYlxZYFpRTk9OVlFQVFJPVVRTUFdcXFxYXlxfV1xeanF3eYBjXFtWVlhSTk9XU05RUVBSVFJLUVRTWVpXVU9STlNYVlRTVFJSWk9RU1NWW1ZWV1RWWlhdXlxcXlZTTlRVVlxcVlJUVlZYWVNUWVxUUlJcV1pdXl1hYWBXYltjYl5hY19cYmFiX2RnaWRmXltkYGFgYWNlX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQW11eXVtgXGBVXF1panJ9c2xnXFVZV1FPUltTUlFUUlRVVEtSVlVbWVpTT1NSVlZVU09WUlNaUlRVVFhcV1hYU1hcWF5dWVpdVVVOVldXXltYUVRVWFhYVVdZW1RTVl1ZXV1gXWJjXllgW2ViX2RkXl5jY2FdZWZpZGZeXWRhYGFhY2RfYl5YWl9bXFtYWFhYV1taXGBdW1tcW1hZW15WXlldUE9PUlpQWlVVVlZUVFReXmBeXmJcYFVdXmJreXRsfWxaVVpVUVFTXFRVVFZUVllXTFJaVl1bXFJPVVNYV1ZTUFhSU1dTVlZVW11YW1lVWl5YX15ZXFlSV1JZWFlfWlpTVFZaWVpWWFlcVlVaXVxeYGFfZGRdXl1dZWFiZmReXmRjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWlhWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9gYWFgY11gVV1eYmVldYF6aFhZWlRWU1ZcV1dXVlZXXVhQVVxZXl1dVFJYUldWVFJUWFJTVlRZWFldXlhdW1VeX1hfX1hdVlFZVFlaWmFZXFVWWFtaWlhZWlpYVl1eX15jYmFlZV1iXGBmYmRmZF9fZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOU1pWU1xUVldZV1ZcYGFiY2FkX19WW2BkYV96dW9oWVxaVlhVV1taWVxZWFlgV1BVXltgYVxUVVhQVVZVU1ZWUlNVV1taXF9eWl9cVl9fWl1eWV5WU1lXWVpdYlpeVldbXFtcW1tZW1lZXl9gYGRiY2VlYmRaYmZjZ2ZlXmFiYGNeY2NpZGRnX2deYmJjYWFgXl9YVFpaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU1BWWlZWWlVYVVhXWF1fYmFkYWRhXllZYWRiYGxmaF5cXVtXWFhZXFxcX1tZW2JWVFdeXWFjXFJWWFFXVlZWVlZTVlRYXFxfYGBdYV1XYV5bXlxbXlhWWFhbW19gXF9YWV1cXV5eXFpcWFtfYV5gZGNkZmZmYlljZWVoZ2ReY2BfZWNdZmlkZWlfZ15jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJOUldZVldaWVtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX1xcXVhXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFhXWFlZV1ZYVl1dXmBhYV9iXllhXV1eWV1eWVhWV1tcYF9dX1lZXl1eXmFcW1pZXF9hX2JkY2VmZWZiWmRmZ2lnY19jXmFmZFppaWJmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWFdaW1pZV1hWVVtdXV1gYGJieExXV1xZV11cXF1aV1xdX2BiZGJiYV1gWGJjYmBjYWJeXFxcWFdbXV9dYF9dW2BkXFxYWmNlY2BSXFlPWFdZW1pZWFpZYF1gYmJgYWNfXGJdX11bXl5aWVVYXV1fX19fW1peXmBiY1xcV1tdYGJhY2VkZ2VlZmRcZWZoaWZjYWJcY2dgXGlpYmhpZmVgYmFjYV9gX11dXFlcWVhXWFlYV1xbWldXWE9YWl1hY2Zmcmt/SllXXVpaX11cXlxYXVteX2FjYmFhXWJbYmRiYGNjYl1cW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlFZV1xdXFtaW1tjYGNiY2BiZGFgY15gXF1eX1pYVltfXl1hYV9dW2BhYmViX11TXF9gY2RkZmRnZmVmZV5lZmhoZ2RkYFtmZ15haGhjaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYOBg4OCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2d3d2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7e3t8fHx7e3t7ent7e3t7e3x8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb3Bwen59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYmJjIyMjIyNjYuJiYmJiYmLjIyMjIyNiH5/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb296gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjI2Pj4+Pj5CQjYyMjIyMjI+QkJCQkJGLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dXZ3d3d3d3d4eXl5eXl6eG9vb29wcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fX19fX19fX18fHx8fHx8fH19fX19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl2dnZ6e3h7eHd2eHt4enp5fXl4eHl4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3p6enp7e3t7e3t7e3t7e3t7fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHx9fXp8e3d3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d5fH19eXx6d3h4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3d3x6fHx6fHt3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6fnx9fHt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl8e3p6eXt5eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx7fnx9fn5+fn59fH9/f3x8fYCDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgIB/fn+BgICAf4CBgX9+f4CBf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn6Af3+Af39/f35/f35+fn59fn9/fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn9+fn9/fn9+f39+fn5/gIB/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYKBgYCAf39/gICAf3+AgX9/f3+AgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKEhIKDgoeDg4KAgoGBgoKCg4KDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBgIGDgYKEhYWFhoaHhoaGhoeIh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4KDhYSDgYGBgoWHhoeHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDg4OCho2DjIeFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKDgoGCgoGIk4CSiIGCg4GBgYGAf4GAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoCCg5GHgH+Af4uagJWOf4KCg4OAgH9/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgoODgoOJmYyDgoSBj5yDmJKCgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDg4WFhIODgYB/g4+aj4OFhIKSnISXlISCgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4CEkImDgH58fHt7jJ2OgIKCgZGbhJWVhIKCgYKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4WblIh/fX18gYCBlYiAg4J/j5ySmJSBgYKBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioeDg4OEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAhJueiX6DgX2JiX6Cg4OEgoifoKGTiYGCgoGEh4KDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSClaCIgo2FfoOFf3+GhoWFnJ+Gfn19f4KDh5aMg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOLkoKEhoSJgX9/foKIhoWIf3x+f39/f4idmoSEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISEgoGAgYSBf39+gIqCfn9/f39/f35/hZ6Ng4WGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRlJORkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhISBgICBjIeAfn5/gX9/gH9/gIB/f4B+g4eFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEg4GAgIOJhYKAgYKCgYGBgYB/gH9/fnt5gIaIiIqKiYmIiImJiYmKi4qIiIiJiYuLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5COioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCf4CChYSCgoKCgoKCgH9+fX19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeHh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYOBgoSEg4OCgoKDgX59fn5+fn5+fXx+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4aJiYODhIOFhISFhYaIiIaFg4KCg4WHhoeGhoSDgoOEgoODhIKBgoGBgYODhIOEkZKRjo+Oi4eFhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgYKEhIODg4OCgoF9fH1/gH9+fn59fH19fHl8g4aHh4SDgYODhIWFhYODhYSEhISFhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gX9/gYODg4ODgoJ/fX1/gICBf31+fn19fX17enp+hISEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4SAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORjo+Pi4iFhYOChIKBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+foCCg4OCg4KDgn19fn+AgIGAfn19fX19fXx6enqAgoKBf39/f35/f4B+fYB/f4CAgX+AgIGAf4CBgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf3+AgYKDhIGCgoODg4SFgIB/fH19fn19fn+Af31/fn1+gYODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6eXqAgIB+f39+fn1+f35/gH9+f3+Af4GAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEhIKCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXuAgH9/f39+fn5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+fn18fH2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2BgICBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fn17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19e3p6eXl5eYCCgoKEg4GCgoF/gYCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKDgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4OMhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYOCg4OCg4OCgoKCg4OCgpKQi4iJh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoaHh4eGh4V/fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYOFhYaGhIOFhYOFhIODhIOFhISIko6MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GBgYOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SCgYONiX99f4OEhoWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfIKBf4KCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+fn6Agnx8f3+CgIKAfnx7ioJ9gH9+gYCAgIKBgoCAgYGAf4uUj4yLjo6NiIeIhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gn+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fX19fHx9gH+AgH6Afn6ClJGMjI2OjoqFhoeFhISFg4ODgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gIGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt8fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYyNjo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6Eko2MjI+Ni4qGhIaEhIODg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+Af36Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoWChIOCf4B+f4KCgn9/goJ/gIuQjYyLjYyLiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+Af4GBf399gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBgoGFhoWFhoaHhYGEkY+Ni4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f3+Af3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5+fnx8fHx8fXx+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7fH16fX5+f4CAg4eJiYmKiYqJhYiRjoyIiYeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDg4B/gIGAgIB/f4CBf358enx9fX59fX5+jIZ9fX57e4OCfX19fX18fX19fH1+fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4uJjZGOjYmIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSDgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImOkI2LiIiFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFhISCgYGCgYKBgICBg4KAf4F/fX6Afnx/f4mCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI6NioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX18fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgICDgX+AgYSBfn6Af35+gH59fn6AgH+Bfn+Af35/gH98f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8e3x8e3t7fHt8fHx9fIqKiIiFhYWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOBgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHp8e3x9iYaGhYWHhYWFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4ODhISEhIWEgYGAgH6AgoB+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWDg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goR/g4KCgoOChIKBgYCAgoGAgIKBg4GBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GDgX+Ag4J/f4B/gX+Af3x7e3p8e3yCgH+Cf3+BgIKCgYF/fn+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6Afn5/f39+fX98fn5+gX+Bf39+f4B/gIOCg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fH99f4B8f399fYGAgH59fYB/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/goCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX5+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55fHl4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3d2c3SGhISGg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gICAf35/f3x+f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5+f4CAgIB/gYKAgH9+gIF+f4CCgoCBg4KEhYaEgH59fHx8fHp5dnl5enl3eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fXd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX+AgIB/f39/fIB/f4GAgYCAf3yAf31+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKBf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgX97gH6AgH+BgYB/fYB+fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Dfn6AgIF/gYOCg4OGhICBfnx9fHx7fXh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cnmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf4CBgHyAf4B+f4GAf39+gX9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fX1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd8eXd4d3d4e3t7e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp6enhzd3VxcXJweHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH9/f31+fH1/gICAgH9/f35+fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgYGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/gICAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+BgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoGAgYGCgYKBgYCAgIGAfn5/f4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9/fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gIGBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdnaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoB/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+Af3+AgYF/gICAgIGAgIGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8eHh1eHh5e3x8fXx7fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDf3+CgYSDg4SBgYOAgoKCgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIJ/f4CCgH9/gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhIR/gIOBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXt9f3p5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYOBgIGAgICBgoGEgH6Bg4J/foCDgoCBfoCCg4KAgYGBgoKDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChYaEgoODgoSBhISBg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgoOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGDg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYKBgICChIODgoGCgoGDgoKDg4SDg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfnp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgISFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISBhIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4GCgYGDgn+ChISDg4KEf4KEg4ODg4SDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KEg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDg4SEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OGgoOCg4GCgoSDgoODhYODhYWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhYWCh4aGhIWFhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEhHyDhHuBhHd5g4F9hH5+cnWDgoF2foOFgH2BdYF6hH9/f36EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf319fn5+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIWEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhIWFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHKBg3+Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnOEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW53bHB5bHV9f399foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gYB/e399fIB+gIB+foCAgYB+fn9+foF/gH9+fYB9f4CBf4B+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIGBf4GBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhIaHhoWFhYWHhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhYWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17enl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXp9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhYWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeHhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWDhoaGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fnt8fH1/fnx8fn2Af31/gH5+gH99fXyAfX5/fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWFhYOGhoWGhYWGhoWEhIWFg4SHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fX9+fX1+fn19fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGh4aGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDg4eDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYeFhIOEg4OEh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH57fHx7fHx9fXt7e318e358e3x/fX18fX1/fXx6ent7fHyIh4KGhoaGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOGhYOBg4KAg4WCg36BgYF/g4F/fn5/fn58fH1/fXt9fXx9enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYSHioeDh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWGhoeGhoWGhoeFhoaEg4SFgoGCgYCDg4KCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYKAgH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4aHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIaGh4aFhoODg4WBgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15ent7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIWFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWGgoKDg39+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+gIKCfX5/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOEhYWDhYWBgIODf35/gH9/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t7fX59fYB9fXx8fYB/fXyGg4WGhoaGg4SDhYKFgYGAf3+AgH5/gIF8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYWHhoWEhoeFh4WGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhIODhIOFhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9foN8fn59fX57fnt7enl6enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gXx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/f319fHx8e3t6enp6eXt6enp5eXp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTU09TU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8rKysvLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXU1dTU1NXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk+Q0U/PDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzQ0dDQ0NDQ0dHR0dHR0c3Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19vb29vb29vb29vb29vb3Nzc29zb29vb3Nvb29vb2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNloSGhoaGhoeHh4eHh4Ky4t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSPjIyMjIyMjIyMjIyMjYiBgoGBgYGBgYGBgYGBg4uKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QT0/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzm5QU1NTU1NUVFRUVFNMoPPr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWlVWVlZWVlZWVlZWVldOQ0NDQ0NERENDQ0REQ0ZTU1NTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzM5xVFhXV1dYWFhYWFhXUKHx6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSlnl9ZWlpaWlpaWlpaWlpbU0hISEhISEhISEhISEdKV1dXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183OeF5hYGBgYGFhYWFgYFqk7ufn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqqNoZGVlZWVlZWVlZGRlZV1TVFRUVFRVVFRUVFVUVmBiYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcfFxcXFxcXFxcXFxcXEy9DPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs/Ozs/Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMzMzMzMy8vLy8vLy8vLysvMy8vNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Pz8/Pz8/Pz8/Pz9PPz87MzczP09LSzs3P0s7Ozs7Ozs7Q1NLPz87S1M/OztPTz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfX1tfX19fX1tbW1tbW1tfX19fX19fX19fX2NjX2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7Pypal0c/SqKDQz9GkodDOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Pz5yqnazWsp6jp9avn6Gp0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD9BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MuUiJqdyJ6ak53AnpiVnMjQzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RvciZm6yaoZy0mJyinbCy08/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9KXlKKtmpatuYaelq+zqtXQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9Ozm8SdrZiBoJZ4m4Sdk6TV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Ojw/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDRzo2Qo5ydqIiceZ+phZmk1dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0cvaqJyRua+mnIq9raaYr9bR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmOpZqgpaaXl52lp5aYm7vV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2Lirocq7oaannM2gq6Sb0J+rpJzR09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT056QjbbXxZCNt9fCj4281dLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZHS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHSusTV0dTHw9XR1cXE1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tXU0tLS1NXT09PU1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpDPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQUI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKhoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ6dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiampqampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5qXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5ibmpmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXmp2YlpeWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs8Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OkoqGgnpuZmZiZmZmZmZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGhoZ+enJuampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5qbm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpuampucnZybm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuamZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmZqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZibnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlFRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfomQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVVYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2boqGVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqqmvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qlp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFdPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq+qqqukoaKkqaemqaijopybm6SgpaijoJidmJ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaop6WnqaepqKOnppmcpKaioaGhoaCcmJmfoKGkpKKenpagm5qioqChn6GiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1cUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnrKmkn6Kgoqahpq6mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYpKKipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2JfXFVZUVVXW2Nec19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz49QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+qqqyoqKuwqaiqqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1pgX1pcVlxoZG5jbmppYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2r7Owq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5udoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqGZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ5amJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6almaGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh1a3FoaWlhWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLG0tbW8vL68vL7Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWvs6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllUYWlgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGwsO5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmtjYm53dXZubFtiUVZcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUE7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWttZm51cXJ1cWdeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmmpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtsbmRvbWlxeG55aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpqy0tayupaSjqKSgoKWZqrSxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcnhzeWZnXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPDwcS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzrKmjoa2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamddam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIycjIycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytpqq7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2NhZ3Voaml0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzNDNx8zJwsLHwcvLyMbMys7FxsXDxsXJzdDNz8zHxMDDwsnNx8XBxMfAu760sLCwwb6+wca/vri2w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW50Yl1iVFdVU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHCw7+/vsTLyMrLyby8yMjJzcjDyMnJxcXDwsHCx8fJysfMyMfIzcbLz8W3wL/AwLu6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWZjamRham1ub15ZXFZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O5uLm8vcHHwca7uM7dzsPEwMPBwsHDwsO+vcLAwMHCy8PGzMvFyNHCsL6+uLq7u763tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWNkY2piZ2NbWlpcWVFPRT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tri0tLW/u72/ub66urTAuLW3sq66u7bAt8DenpDCv8G8u8W9u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xY2BiYmdqZ2ZpZWleVlZUWU9TTEY4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5OYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS1sbC1t7W7wbi+ub+8vLe0t6+ut7S3v7rQw32Gyr7DtbrHt7a5u725ura7xcXKvbnFwL+8wb64xrzCv7zFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cW1lZWZvaWVraFhYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmZTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7a1ubm5ub+/1513ganEx7e5uK63tbi6tLezu8XGy8G8xsDAv728v8jDxcW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d8a25wZ3Brc2ZhbWBcVElLSkRKQkNHPzo7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY2PjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72+u8S2tbi3usO/xbzBzsSAd3mUxs/CwLivtbW8vri6sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb27u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWZsaW50bnhjZ2JbY1FLVEhFRUNIQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLm+vrK8vrzEt7K6sKOnubO9x8yidHl6l8/RzMrEtbrAxMi/v7W/wb/Gxr/LxsO/wrzAw8zKx8XGwLm9vMS/v7/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYGJOSU0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbPA3NvFub68xL64oHdrb3FrgJW4h3N+f5nKzMvNysbCxMvNxb+5vbm5wMO/yMbEwcG/xcDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh6bW13e19wY1tdX19UST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tby2wYqt2MS+tsC+nX1kWmdSTlhcdnx0foKfw8bLyMHDwcDJysjBu7uws729wMXGxcS/wMG/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem5zeHNncF1bXl1ZUkZEQ01JQUU9SDs7NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRl8W+urbDvMbCvr/Ixbe1uLe2ubu0r7e3srWzt7m8u7a6wLdlbqbJwLa3hmJgZlRkXU5OUVRodHuIpL6/xsC5wLy+xcTAtbqysK2/ub/Dx8PDvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fXZsdXtwbmlbX2BZU1BBRkhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4uMu1bWdvmLW4hFlORmZMT3RqYE9NWHR6jqy4t8K6s7u3u73BtZ69rrCwtrO5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdXZ3bnFgX2ZdW1RKPT8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trjNtnl1ZXOcol5OR1V6TEhmfpSDW0N1iZmrsbe+ubK1sry5v6qIvLOzt5+ouL3DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0d3JsX2NhW15PSEI/PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO2x7OAeXFsi3ZRRUd0f01OT1+KgXBGUn6mtLC2urW0sqy8ub6fd7m8ubd2lL28wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJtY11mWFxdUk5OQT5KQkFKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7Kttrqvrbyzt725jYJ6enlkS0d7fGFNSVFlp6VhTkpwrruws7WytK+su7jBjG+txbitXHa5try8uLaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXRpbF1balRdXFBNSERGTEJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzv52Hh4uIWkR2l3JbWkleYFKRcW5toMG4s7SysLGtsLm4v3JnoMKysKelsa65rqqrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7aplo+TqE9KfbNsanFda151cWNjboexubGts6+urK22t7Rdg6WrpJ6dnZyeqKieoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moq6ufpqKbo5yVkIyPj5CTkJeVlpifnp6amKaXk4+Slp2ioKWipqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/emN3bG5cUWhUUE5HUE1MQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyps7OirZVMVHKmc3R9jHNObm1lcHBuk6i2qrK0rqqrr7CwobGmnZGYlI+YoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqqxo6WonqCclZOQj5GQmJCWlZiXn5ibmZqjmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV2fW1re2RoVVFjTUpIR09STUpORzxFQDwyPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGooK3Bv6hXWnh1bnFaX2RiXFlbaWxiZnODsq+us7Wqpqyro56ZlI2RlpeZmZygoqKcnaWem6SXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWalpuXl5ihnpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH13eHxkeXlgYlJVYEhJSktTVElSUEw5P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZ2ev7d4Y3J8ZmdlV1paUUpHS09QTFViX5uysLC4rKahnJ2alJeampCOkZWRjI6OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrC0qrKuopmcnZ6hmZubmpiZm5SWm5aZnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dnZzaIJsZVtTWlpNUUpOT1VMU0xBNz5CNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6KanqmnnYdhWGZoXE5KRkQ+QEJFQkNMVk99sa2sr6efnqKglpCTm6CbmZeSk5+coaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuK2ytKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCeo6GgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUlVIRlVWSkJMRz1LSDhGPDc3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoJ5/Y2VmWEpCSU9mUktBQz5ARklIX6Oqqqmkn5+ZkpGTmJiWlpWMiIuOlZ2dnZ2el56Zpp+gqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6enpaSfnaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZybWl2bWhtXFhcQ1dOSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqco6CLd2tfUktDRFZ/i39oRj06Ojk4UYWqramqpZ+en6KjnZ6dmpyblJOVlJ6emJSGnZqhmqukrLKwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGw7zDvLezqbOtqrO1r7Ouqq+jnauntrGtoq+moaOvsa2wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cmtrdHJxaFZcUUZUSERKUEk/RUE0Rkc5NTs+Nzs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+fdWleVEpGREZns8TBjV1QSUJPe6qyp6OjoaCepaulnpeclJGZnZiUjIqGiIZ4bYigpKKrq7O8tsO+vrO7wcPCxcC/wsbGxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvsfGwrfEycnDwca+urS6urW7t7C1sqq6sq67t7+7uqq3rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtjaG94a2VaW0ZLTEVEU01EQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2cl2pXTktJSEhTfdHLtJOcjoKWr62hmZubnp6Zl5eXkoyOlpeTjo2Qi4KDgndzcW5xjqWssLm9xbvNx8u/wszOzczHydHMzczHycXFzNHS1c7Tyb3Av8O7xsXIxdHTzdPQ09PMysLFxsbKyM6/yNHMx8XHxcG8w8G/v7+2vrOuv8DDw8fEx8Suv7iyuLzDwsK6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxERVBJRENANTU1ODpCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo56cnpNcTUNGSUlZZpK6rI2DtLmxrKOenJ+al5aUkpSWkZCPjIeDg4iHg4CBgYB5cnJwbHimwcrKxcrB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19HX0tXW09TIzMbMzcnSzc7TzcXIycrBxsvHycnGv8Ozs8jEy8vLz8bKv76/vcHHxMzMyMnAw7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkE8RTw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEE/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGeXkg+REVXZoasn56hraujnJycoKShnZqUk5WUiX13cGtlYmhxb3F7hYqAdnBucXNviMPPzcjR0NfW1tLWzdTW19TT0dPU1NPP0cPQ09bY1dbSy8nO0cvGzdLK0tXW2dXX09fYztLKz9HMz9DM09C/yMfKxMzMzM7PxcbHtr/Kv9LNy8/Gyci/xMPHzs3Q0c/NysjNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZHJiXVJcSUpHQUVJSj47QTg9NDU4Njs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaChqXBHRUVIYoS8xKqrqpuUl5+cmqCgnpucmZWJd2ljYF9fYF9eX19dYmx1c3Fwb2xycXWPvcnF1NbX19fT1s/V1NrU1M7P1dTU0dHM0c3T19bT1dDP0tPRydPRyNDX19jR19LY2dTWzM/Pys3Ry87QwMbDyMbOzdHR0cjMzcDKzMbTzszOyMTKx8fIzMrU1NHVz9LM08G5xbGlqLWup5uorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52mrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqiho6+CYmtqepzCv66on5eVl5manJ+dmJyckn1wZWNiX19hX15hYF9gYF9gZm1wcG5rb3J3d5nKv9LV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cXR1MrQ1NXWztLQ2NjX18vIzsTJz83KzMDJwMjKzc7Qy9DNzszOz8jL0NDLzsrCycfJzMrL0tPN09HR0NDKvci5sK67uLWqtrCtqLits767sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVhFO0A9MzM8PDg3ODY1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcCwqaytqaeWe4iMqc3OsZualZSWm56enpyTlpeUiGteXl5hZGJgYGFhYGBhXl9fXl1ibXJvb3N0dXZ5pL3L1dDV09PY1s7O1MvNzsXOytLSz8fOzc3Uy87TzcvX1tDM0dTLzNDS08rO0dXS1dXKwMrCxczCyMnDzMPFyMrKz8rNzNDN08vGyM/NyMfLxcbBxsrMzdDRxtDOzc3Mz8XHwbi5vcPDvcO4srK+sbvDw7WqmKWimZaRlZWSi5SNmpGUlI+PlIKJhnlxcmttZ2BgcGhYWGhWTEZMSVBRQjtDPjs2Nzo4Ojo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCta+0qKCueGWDg7rOqpSNjJeVkJORkZWWlZCLfGVhYmJgXV5hY2FgYF9gYWFgX11bXWdycXFyc3FucnmjxdLOy9DP09TKxcnJxsa/w8bPzsfFx83K0sjLzs7G0dLQzczUysfLzs/Ix8/Sy9HPxrrEv8bJvcLHyc7FwsjAx83IxMzKy8/IxMTQyMbCxsjEv8HHzMzMz8LKy8jHy9DExce7x8PIycLPwL28v7DByca5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3b3Rka2BeZnBhW1dgR0hIR0lNVEc/Sj02NDM1NT09NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68us3NxtDV1dna29jQyc/P0dPIwra7u62ksGZmfIzRq5COjZaPhoODg4F9hIR+c2BbXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbfQx8nKzsvNxLrAw7u7urq+ycbCw8DDyMvJyMrIwcXMxsjLzcnEwsrJwcLM0MXLyL+5wbvGyL6/xs/Lw7/Du8nHyLvIxsXKwL3Cy8bFxL7GvLzAw8XMxcW8wMrCxcfSxcDJv8rJxsjG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Glm6Ogm5R7d3J0ZmlaYW5sWltYUkRMRkJHRExERlNANTQzMzQ/PTM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76ysqRdanOmuI6KkpeGeoCFhX92eHVycF9bW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWtwb3KPxbzJxMu/xsGwtrqysrOyscK8vLy6uMHBwcW+vbm9v7nEysXGwr3GwLi7xMm/wcm7t7u7xsO/vMHNw8a+vrXBvcO6vca7wrqzvMXEwsK2v7W1vr+7zMO8tbrIur++y8TBxsLFycbJxtDGwszHssfJw87NwMXDwL2zt7Cyp6ioubClrbCqrayUenZ3amRnYGhvY1ZeWUpGSkZISkFFQkVJQDk6NjQ4ODU0Ozo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0srKysfNzc7RyNDG1dTW183Kz8XJxcfAucW9q6+SXW52qJKLiIuFeICGhn9+hHt0dGNcXF1eYGBiY2JiZWViXVxbXF5cXl1aW1xeaHNxbWdnbm9yeJy8y7/CusC3rrCxp6qtrKe4tbe0s7O0u7W+srewta+yvMK8wcS8wLu1srq+wLjHubS7tsHCvLi9xsHDu7Wvsra6v7TEt7u0q7i9vcC9sbq2sLa6s8W8tq67v7W3tMW8vsPFwMPFxsjLxcDGxrvHy7/PycfDxsLDt8O9vba5vse/rLW6tbe2jnl0eGdnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMrIysnKxNDN0s/NxcfBxcC+ubfJtqqwiF5xgZeNhYiJe3h+hoZ2d4F8c2hdXV1dX2BfYGRhX2NlY19fXFteXF1eWlxbXV9rcG5pZmptbnJ7pMa+uLe0r6usp56iqqeeq62zraqsqbSut7Gyqa6mrLO8urbDubq6sau1ubu0wrqwwLG+vLu2u8e5wratqqiwssC2uL2wsKeys7W7vKuutaautq+7srCqubCtu667uLvAwL65wr/Hw8XAvMbBx8q4xcfFv8fEw7rExsK7xsnMy7O5wr27s4lzdnZraWBibGhZV1dbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxdDHzcHDxr/ExMPDysHJyr6/vMC6srS0w66psIxobISSh46Pe3h+ioV6e4SAd25eXVxcXV9gX19kY2JjY2JgX11aW1paXVpaWlpcZG5vaGdoaWtucYGsuK+0raWkp6eaoKWhmpylq66kqKKsqq2qsKSmn6qttbaxvbmvt6+prri0tLy4tLyvuLm1srvBssCupamjq7Gys6i9qquoq62ttLOmqK6hpK+psqanqK6mqLessbK3urq8sby9vr7Ev7XCwcfIt7/AxbfEw7+7v8TCvsTIzMq/vsTAwKmHc3RyamlcYW9kV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcq+u8m2vcO+usm3wcPBtLW7tbCutLutp6mNaWCGhIeLgHt9f354dH58c3dlX11cXF5fYF5fY2NhYmBhX15dXFpYWVtbWVhaXF9ma2ZlZ2Voam9yhamkqqWem6GllJ6km5iRoaOqo6OgpqWopa2gnZykpqyysLa3p7CsqKq0q7S6sba2rra5sq+6urG2pKCkoKaxp6uouaqkp6eop7KtoKemn5ukpqyen6ejoKGxra2ssrSztLC1vLa7wcGyur7DwbK5ucOzwb2/tbi8vb68wsfEwsO+wMSgg3hxbGFmX2tvYFRZXkhOZ09UR0VLRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItbW9uLrAur21oJ6VnaGmurars7O7s8TPyMvCxri2x8DMv7jJt7vFuLPEuLO+wKu1u7GrpK6yrKChjWRvh4WGgHx5dXNvbWpqaXBpXmBdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+HnKiflZWaoZacopmWjZ+ho6ecoKCkpqKnnpuim5+rsK2xtqOpqqqsrKS0ua23sKyzta6yta6wqp+en6SisqSmqbitoqamoKisq5mfoJ6ZnZ+lmpmjnJudr6mrp6qsrK2xsrivuLm7sLa8vLqrs7O5s760trKxtrW/tr3AvcPBu7u9l4R6c2xfZV5kZFhUV11JV1xLUEdJSkdBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8PDz766x7i3vreywbSxu7uruLmwoZ6oqqaXnpBmfoWGf3hybW9ta2JeYWZmXV1eXV1dXF1fYWFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrcYynnJOUlJuYm6KXlpGcoqKpnpydpaaipZygoJuZrq6urrKgpqKuq6eitbGysqyor7KnurOmtaCin5yjoa2joqq1qqKjpp6lpqOWmZ6XmZudoJqXnZ2dnK2iq6ekpKatq7O0qrWws6uyubSvqq+ysrO4s66prK6yuLG6trq9v7ezsZSFeXVmXmVeW1lWU1pVS1tRS0lFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7OdpaOYpbHCtba9rbS4wszIxr/FtsHAxs63wMS9s7m5sr+2sbi6rLG0rZ6Zo6ifkpqHbn+DhH94b3F0cWhlY2hkY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2oZuTlI+Vl5egl5mVl6CeoZ2WoaGppJ+eqJ2cmqunr7Crm6OkuKqhoK6otqqmp62wpLiwpLegopyZmaqmoZqsuK+ioaScop+gk5ShlJaWm5iXlpeclZ+qnqmkop2jqqqwrqi0q6qnrbOwpauus7Gwr66vpqensq2xtLC8tLm3rqOUgXl1ZF5hVllXU1JUS01eTE9LR0dMTEU9QT48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunaeoo6q7wL3Aua60uMHMx8XCw73FuMjLssHCwa28u7S7vLS4ua+ur6ibmKCnk5CKgHyAfHdxaWxydHBoaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiY2RmaYGWk5WLkpSUnJmdlpacoJyflqGgpqakpqefnZ+moKqvpp+ipLeooaGiqLSipailsKWxrqy1nqCdlZWpoaKUrbGxn6KjnZ6Ym5OLoZSRk5iYkpeXmJeep5ynoaKZo6Wlq6SlsKelo6urraaprq+uq6iqqbOlpqyvtLGvvLWxr6+gknp3cmVhXFpdWE5MUkdSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc3NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6lp623u7zBxbqxubXEycnAw8bFx7bFxLLCv8Wqt7e9tr26urWyq6ymmJeeoYuIc4WHfnZuY2FmaWhmZ2lmam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZVU1RSVWBgX2BhX2FhYmRqgJOTiZCPlJOUnZWWl6SZoJedoaWhraakpKOjopyqq6Wan6WxqqChnaWrnqihnq2sqamuraKhopWYo5uckKupsJygop+el5mTip6RjZKTlpCYmJOcoaOdpKCilaCipKabo6uloqSqo6uupa6yqaalpqa0pqmorbO1tLm6r6msnoxycW9gW1dWVVJHUU9IWVtPUklUS1NMRUZJRDg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7sq+rsa2dqKevubmzwMi6tcCvxcjMusHKzMi1ybyxvsPIrLG4wbW7wLu0s6mqpJSZmpuHf3GIg3t0aWlqbGdqa21ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXV5eX19iZG2Oj4SRh4+Rj5qTlZOcm6Ocm6GpqauorKeopqSZpK+llZmlr6qfnJmboJ6vmpyrs6Clpp+io6GUk5uWlpKpqayanJ+hoJqUkIyZjoyQjJGNlpWQnaGgo52bo5WboKOhl6Koo6Koq6CrsKStt6WjpKKtraqoq6+zt7O+tbKrr5iFdHNoW1hZU1VSRVhMUVtYTVROUExQUUlOSUI8Pz9BPz03NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraeztq6oqK+um6morLe2q7zKu7a/rMvGxbjBzs/Is8S6t7vCyLCtuL+3vL26srSlqJ+VlpeVhnl0gHZ3bm1obW1tcGdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXFxeX2BkfoyBi3+MkYqSjZeRl5mioJugq6qmrqyosKSpmp+toJWWpKinnZeQj5qerpeYqKqZn52UpaCekpCSkZOVp6qlmpmZnp6VjYyLk4aJjYOPi5KVkaCeoaOYlZ+VmqGinpSbpaWnqKigsbGmsbynn6Ostauup7C1sLi1wLGtsauRfnJzYlZUVU5SSkdWUFJRTExXTUpMTlJHTUtBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ylsbeqpaKxq52qp6mysaS2xrS5urPKxbm6wcvQyrG2uLu9wcOxr7G3rbSzurKyoaKbnJaWk4J+dmtnbG5xbnFqcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY6HkIqXiZSUmJuZnqmboKqmpaydqJqgppyTj5+jm5eXhYSSm6OQlaOdlpaWiKKbm5SLjoqQmqSnnJWVl5uRkYeUjouBi42AkIqSkpKgmqCilpSYmZWippmNmaSmqKahoLSyp7K3oZyit6yqraSysqa1vLWsq7GjiXlzbV1OUVFMT0NNTk5QS0ZOTkpKTk1RSE1KQUdMSEdDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7ampLawpKekqqWgqKWls6qissO1tbKzxsa3usPKzMazrLq9tLfAr62psJ6mrbmurJ6YmZyUkoZ6gm1fX2ZycHVxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFhYW11hb3N2cYWIgoiAkYSPi5SRlJ6hj5uco6KkmaWXopyVjYeYmoxzjYN+jZeWhpGakJSOjnuZj5yMgol/iZifo56Qk5iWhY2DlH5+dIqOepCHk5CQnZqampGVkJ2OoqOOiZqgoaOkm6K0r6yvrZ+YpbimprGhsK6csLuqqa+qmYN3c2NWTVJPUE5DU05MUUxCUFFISU5STUhKSkRKTEZLSj03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3i3oaO0qKalqKOmpaamprOnpbTBuLC0sMnEt7nBzsa9s6y6wautw62noqaSnaa1q6KejpSVkY59dn1lV1ZfZ2ZpZ2huY2poZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVVllbXWlscm1/hXx0TlhykIOXh46dl4uUkZ+YnZWUlpWPlomAk4lfO1ZvfIuUiYCMkoyQhoZzioWWgXmBe4aTnZODlY6RkIOGfZN4cXCFjX2JgZGNj5eamZOLj4mciJ+YiIeWnpqhoJenrqmtqaielq2zoqatmayrmKizoqmto5N+cm5gW05TUldMRFRKUExMRk5PSUVMUU1LT0pJTVBGSUk9NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6ioo6qwqKe0wbmwtbDHwrezvc+/ua+utcKnqsWpop2Yg5Sbr6GYloWTjoqGfHJ1XVFMUlVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbXBpe4J0UUJAf5WSkn2JlY2Eio2bjpaViZKIhpWGeYl/YEpRbniKkYR9hI2KhX9/bn5/lHd1dniEjZlvUY2IioZ7fniUdmd3hoh9iomVi42RkpeMhIqIlYSajIKEkpqWnp2UpKOoqaWknpqwq6GkpJGmqpaiqpyipqiJdW1mXltIUVFTTUlVTVNJTEtPSUhGSk5MTVRLUVFPRklDPTc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7abo6edn6Gvoaeopaeor62qtby2t7ezwbu2p7nIuLaoqLW2qrK8pp2Wjn+Jk6iVlIl9jYOBfHdwblhNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amlcVY+JlIl0f4eBfIWMk4KSmouPe4aPgHaAeHNudXB0jY2Ben6Kq4V5emh2e45wcm14gYuNknh6gHuAdnJykndodYSEhIV7lYqIio2LgH+Ei4yAlIN8gI+YlJyWkZ6dqZ6foJ2gqaWfnZiMp6SToaCWnp6kgHJoYVxdSlZPUkdKWFJPSkxNUkpKSkxQSExRTFJUTUVIQTw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumaOimJyftKmvqaWsq7Cxqr20sru4trq0sZ+3urKqnZ2sqaiyr6GakY2UgI2bjZB+doV3e3VubmhYS0hJSEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedYN8eGZ3jZeYjY99aHmBdniAiY99hJiSgXGHj3x3e29rfq18c5CKf3uGkoF9f3RmdnyGbG9oc32JjIiAbHlxfXFtdo9xaHGBfo5wQ4uEgoOFf3d3eouFfYx7dX2Oko+YipKam6OWmZ2anZ6hnJaNiqSbjp6XjpaYj3dvbWViWlhYVVFKU1VUT1BOUFZLTktOT0pRTkhPT0xGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODs9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagpq+srquoqbGvsau8uKy7vrmzrKebsKesm4+WnKWppKCXmY6EknmIjYqJdXB7bXRwaWxpV0tGR0VBQENESUxMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOT1FUWF1lcHJtiKeqwH51eWN8eG98eYiQen2Lhm9tjJJ5dHhqaoCCcZaRi4F+loBJk5huaHd+gmxpY2x5hZCShmtzbHxucnuGaW1wf3ONiYSGe31+e3ZvdHOFgnmBeHB8joyKlIOWl5iakJKVl5mXnZaMg4mekYuSjYaQln9uaW5vblhVWFRSUVlPUlRUU1hVTU5ITktNTktDSE5HRT86ODk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WtsKOsqqi1r66stL+rvMK/pqKZlaSXno2Ei5ShoZiYkZOLc456f4WLhXRudGtwbGRralhORUZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcYKeIYpppdHplf3Btf3qLiXaBiIZ0bJqRdHN8amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3F/fGhxcXxuk42PfHN9fHFwbnVtgn93eXVqeYmCiImElpKSkIuNkZSUjpeNgHmIl4iGioaAkIh2ampvaGVYUVlXWVlbTVBVVllYTklIRUpKSEdCQEZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDU3NzU0NzhpTzg7NW6SiJqRmZakqK6esp+nu6+rsrDCsbvDx5qWj5SZi46GeYSQmJSNkIyPhnGHgnOHjIV6b3Jwbm9kcGZfVEZJQz88Ozk6P0BBRENFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7Ogcnx4bH1tcoOBhYF6hIaGeXKhlXR4gHN1lIc1cZ2onY6hoYSihHZwhnyHfHOMrY2JgGdmYmpucmxwg3Vpb1h1cI6bkndsf3t9bXFtcIB6c3VuYnaDfoaAhZCQioqJkYuRjIuOg3V4io6AfoOAfY96cXBva2BbXF5cWVhgX1JOW1pYV0xISkZKRz5CQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGTiJaRnaSnnq+VpbWqrrGuwbK7wcaWkIyUj4CIfW6BkJKJg4qHj4V1goNslYiHe3R4eGx3bndjaV5JUEc+QDc0NDk7Ozs9PkBCRUhMTExMTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx+hYN/jH52opl5foaAhJmEm5xhhqqfnYuDkI16d4h+iYiNc4qXkIN6XWRxdHp7d4ptaGpieW+FkIJ6boF3dIR6cHR5d2tuaV13h3yHfIeHj3+LkpeDjYWMhn1xhH+DfXV3e3yJdnBzdGVnX1tbXVRcZ15XUVVYW1VHSkpETEc/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJKcnZ+mkaCroLGor8CxusW6lo6Rk4d6hXZrf4yRgn2KhI6MeIOAc6GEi318gX5wgH56Z3ZrUldMQEUyMTEzNjc2ODg6PD5BRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHF8j4x6fYmHfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSSqIeAmJiKnHRtfIGGh32OaGdoeH5uhYeChXGEhUdsgHdyeXZobWtfd32DiH+IhYt6lZ2biYuIkX96dYt2fHhtb3d9f3NzcmxbXV1bY2NYZ2ZcVU9QVllQRExLRk5JQ0ZDQ0FAQ0E9OTc3Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx9iYWIkY+WmJKXoZ2soaa4r7O8s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0+P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgISChZGTfoWIkYGalYKhoZiVm5qlrZOZu7Gnu8fDqIuMoaWPlImBkXxxg56fkZx/doWFipCIkGlob4OAdIyHhItxhYJ3h397doV9bnZ1ZoCUj4aJiYeIh6GqopaJjph/eoKJenlvZ2t4fnp+cmpkXlpaXWpdYWZgWU9LTldSUUhQSkROR0NKREJARERBPDk4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmeIN7gIyAgZGOipqbpJ2hrKarr7CXkZGDoZSEeHd/jJR8f5KGkpV/ioCSm46DgIGMi4KJjYN/iX9tcGpdQkE0LS0vLy4vMDIyMzQ3Nzg7PT9CREhKTlFSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZqPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyNoZ6ZhJOFgo+hn5OYkoSLhY+ZkZZscHWJi4KWjI2Pd4+EcWyEgYqWkYOFiHKIoZaHk4mOj5altambjZWig4eTg31/a2prfICBgXNhXWNeWmZrXGxrXldLR09TUU5NTEZJUENETUZBQ0VGQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCCcHWHcXaShn6XlpqVnp6cp6CplpOYnmdlpJp+hJKReYCSiJCSfYqEmJKRgoCAi42JhZCGhIiFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNDU3Oz9DRU5QUlRQUVFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdnKilopmhl6KVnZ+onqiroKisqaq1l6u+q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqbmaeRkYmVopqaeHp+lJiSoZKWmIGUnnt2lZKrsoiNl599lJ2cjpOWmaSiprawnZGZqIiWj42BiGxzcnx/fHFoYFxgXmJnY2BoZ1tSRUpLUE9JSkxGRk1DSExGRkNCR0RAOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdWBufWF3jn17lI6Oip+Sl56Wm6qYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImMioSShYOGiYGAhndfYlA0NjAtMS8sLjAwLy8uLjAwMTU+QUFNUVJTUFJTVVJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk5PUVlthpB3lYujp6q0vbikrqysp6i0q7C2srKtu7Gzvpyzw6y7ycu3w7+4paOwsqytqqOLlpiFpqagopeBppmNoqqopIiFlKShoKqhpKmPnLGLlaOnt7uboKOwk6Kdo56RpKKrr62ztaKUpKqImYmSipV5en6FfmdgaFxlYl1kY19mZl9aT0NJSFRPRkhMRkpHRUZIQUtGQ0ZGQTo4Nj08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gZOFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyOiop6h4KHkY+DhYCLhYaHkoaChImGiIeHcW5hQEU2NDwyLzExMC0sKy0xLi0zP0RBTVVRUlNVVVdVTltQR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qxwcfDqrPFtqyzv7O4vra/tMG2u7ujt8WotsnHtb65tKijtK2xsZuZkpqfiaevq6WUdp+kl6GrsbOYlqqtqK62u7K6rK+1orGrsbW7t7SutaCnp6OomqmwrbK6uLinm7apjKWOkZOfhniCg3VZYWRWZWFhY2BhZl9bVEpERUxVUUhJSkRJR0VBQEBLREFNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFGV1FKTFtaUWNkV3l1cYGUfYSHk3aFf4CMe7+7o7yCtJSTjZuPhIiPkomJeYaAjJONh4SBjn+BiY6GgIaJhYqHkXp4bl1WQEVNPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcVk9eVUlLSkFAPkdLRkVEOz5AN0Q3P0JKSkVGV1RQXo+lraOxtMO2uMHMyba7xL2zs8C3t8G1v7C3dLGzprrFpK/GubGzsbSopLW2qrGgoZabopKlsK6mraunpJigrLO6oqmyurS7vsy/xcW9vbPCt7q4vre6t7msrLCmsaqtvrC9u8LCrJm6qJSuj5eXq4l9gnxqV2JhWGplamVXW2RZVlRJR0dMUUdDSElBSEQ+P0JCS0BATUM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1RZVVp2anB/j4SBjoRuenN5h2K4oZmjiZWTlpOTk42QlpKHhnuGgY2WioGEgIp6fIuHhnyKg4GKg5V9eHp1ZU9cZEdFTDpRY2FbXlNGPztIUERaY1FRWVhZZ1lUYGBNU09FQT9JSkhFRkFAQzxFNkI+SEdKTFNaVF2Tr7i1urnJv7q9ycy7vMC8t7W7u7e9tLqxxmB1sqWxmp6qvaqlqKuqo6KytaGrqJ6Vlp+Yn66lp6aln6OUoqaxtKeysr22wb3TycrTxsLFy8HKw8C+vb+7vLe0sLm3tsO6xb3DyLCeuaqiq46lqLaJgH9xX2JiXVdhX2hmUlhhVlJWSUVFTktBPkdEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDQyNj84QD5HS1JUU1FQT1FRUEpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdZ2xscZCNhZBzbHJyc4jVwLWZoI2VmJmRjpeSlpaOhod9hoOMlop/g3+CeHqLg4d7i3mBioKXf3R9emtlcHVZXVxQZWViYGVkXVtYV1xNZG1VUm1tX25fWGdlVVlUSkRBS0tIRklISEdCSTlEP0hLVFRWXFpbkrnAub23xsC6uMrLure5tri5sre1tK62tphkdaicrXBeoa2cmKCim6Seq6WUoJ+QlI6WmJeon6WfnpqahKSdrKWqsKy3sL251NHP18/JzNHMz87KxsC/wsq9wbzBwMTExcq/yM60pLuwtK+bq7m8mn95bF1fXFhdYFljY1FcYFNQS0NBRUZEPEBFPkJIQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSTstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpX3CXkpCUb2xvdXWIs6yhoZ+LmZyZjI2VkZuShYqKfoiHjJCLiXyBg3N7ioOFe4l0gYmGlX9ze3hrbXV7aHJlaWxpZmppaGBmaWhsWm50l62kvIiHZ1tvaF1aWVRIS05PSktRS1RRSExBSkdLUF9eYmZpYZe3x7C5s7u+tbHEx7WvubCwu6uysaeqt6yNtqedm6eaT5qdjI6glpGmmKWVipOTiZCJj5GRnpuhl5qVloeemqabrK+or6eztNTU1NbSy8/U1c7Tz83FwsnQv8rJysnSx8zNwtDSuLDDvMS5pba6xKKCbmNcXF1YYFdYZlpRXVdPT0JCSEVCSTtBRD5BRz8/Qjc7Qz5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMC0xMzQ5PTk3LC4sMTtGSz0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVdzkJCYgmhxb3l5g6CqnqaXjZubl4uOlZGajn2Ji4WOioqLkId8hIJwf4eBhnuHcoOSi49+cXh1a3F4fnF7bXhzbGmBcG1jaW5weGl3fH7Lv8Lfp21jeG5jW2FgSlBSVU5ZXlBeXU1QTlRRVVRcbm52gnKXrbistKewtqusvMCxq7WmpbinrK6hq7SjjrGumpiYjJGTkYSOm4GNppGciYOLhIqJhIuDk5WYl5ObkZyYmZmenquspKehrK3P0tXRzczS09TQ1NHOyMPU0cjN0tPT183S0cXS1sXAzsfHw6i+t9Ceem5lXWJcVmBSXVtPUFRQTkg+QUZBQkU8QEI+RUQ+QD86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT41OTAxMDIyLTJETjMpLzMuMzI9TjIzOEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYaFindsd3B9fn+hnp6hi42Zk5OMjJOPloV5hY+QjYuKiJGHf4J7cn5/gYd5hHWFk5GJf292cmtzfHx2fHOBd3FrgHNyaG9xenlye77Lmn6MsoN2coR2aGFqXUNaWltXZWRYZWtTWF1cYGNdY3h7fouBmaqkpKGgoaimqrC4qqW0o6GtoqOtoqexn4mmmpSSkYmRjoiBlIlqlaKNmYSAhX2Rg4OTlq2LlY2VmY6FkpCdl6ewoaChpKSoyM3PyMLL0dTR1NLO083G1tLM1NjW1tjU19XJ1NrNydfX0cqsxMPLi3NvYmBfWFRZUlxQSkdJSUpAOzo7RUFEPEJEPkhCP0JDOzs5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLTtSMDE3LzUzMkZEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3hygomAnZWdlIWLlomPioiOh49/eISUmYqNiIiLiX6DeHN7fYOHd396h5GWgINueHBtdX92eH1zhXx5bYd2dG59doR1eXudtYw8QYvGpX6NfGllVklDZmNlY2hqZG94W19maGtuaW6Ag4mRi52eoJ2Ql5ifo6SmsqSks6ChpZ6hqaCjsZyGnpKSkpCLjouGg5CEfpybjI2DhIV6lH6CqZWjjJKKl5KLfZeKmpGqs5iam6ecp73Dxri2xs3S0NLQzNLLydTO0NXa19fY1NnYzdjbzsna2tLVv8vMtHh2bmRdWVJVUFpWRkdKSkVFPTo3OUBBQjpIREBFQ0FDQjs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlMzOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYXFxc4aNfJeRnYt+h5KCiYaFioKHfHiFlpeIj4OHhYd6hHlxenuEhnV6hY6NnXqMcHxvb3p/cXuBcYOHgW6OenR3fHyCdX98h4iwdFipwraMkoJwbmI9XmhycHFwbnh3gWVpb3J1eHJ7i4eOk5KblaCVh4yTm6Cbn6qfoK2copqZn6Wen6yZi5qMkZGNhH2Ih4OFi46gmZOIhId+bZl5hJiGiJOMjZSLhnubiJOPrqqUlZeemKautb2prb3Gy8jJy8vPyMPRytTW2dfY19Tb19PZ29bP29rR1snUy5V5e2hoW1lQUlNeSENFSUk+QT49Nzo9Pzs+SD0/QUFBREE+Pjo4NkRCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzNEJGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJma3aAiHGRkJqAeoCNfoKCgoR+hHx8hJeOh4t+hoaAd4J5bnt7h4F0eZKejaB2j3WCdHWBfXSAhG+Bj4JvkoR0fIGFenaGfIm3xqXCybeBlpuPd3BlTmZjgXqBd4aikIt4eXd7g398hHZtk5aUlY+YkIOKj5aal5emnJegl5+TkpejnZmrlpGQio2RgoyFiYiBhZCRnpyZiYWLgYaXeoiIn5ePiI2Ki4J8oYmQi7yhl5OXmZynpaWunqi1vsDAucfJzc7FzcrR1tbV2dXX29TX2drb19va2djO3MaGenlnaGVgVFdWVU1LRE5DOzw9PDk6PD45PUA2PT9APD8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6i3x+gH+AfYV7foGRiYSFeoSIe3V9dG58fYZ+dH6SnpGfg5J8hn54jn15iopugpqAdJiFfoGJhXx+kHqPqY+QwqC8jJyjnH2JhH2Jc4yKfnOmmpyYlIV7j5CJhGhHcKCknYyLkJKFiYuQkpWPnZqTlZGXjYyVn52UoZSSjo2Qi36Qjo6LhIiSlpqfn4mMlJKekYKLf6WZiISOgoaEgKWGiou4mJ2RlZahpqCdnp2jrra6tau/xsrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19y3eHh3a2lkV2BbVFBPSERNQj09Pjk5Ojo5OTs9Nj8+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYCOinFyeYp7en99f3yIenx7i4eCfnSDhnlzenNtgX6FfXeFm6GbnpSSgIuIf5iHgJySboeohXqgi3yQjoOIhJx+mpGKjaOin5CkrqCLkYuFi4GShldyrYufq5uPg5ibkJCOXIKikYKMn5OVjIeIjJKTjJSUlI+Mj4qIlpudj5WWkYuSlIWAi4iSjYmKnZaZo6OGkp2WoYqKiI6ckIOIj4CDh4WkhoyQs5ickpSXoaCemZKcnaexuKylvMLHzcfGz8zPzM7Xz9HUrtbV2NrY2trX1tnan298dGdnXF1YU1dYQ0BJRD4+Pjo0OTo7Nzo7OjM7Oz89Pjc7OToxOUc9OjM3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bWJ+koNubXeLeHl+eoF8hnx7d4aEf3NwhYJ6dXZ2dISChH1/kqajn6Wilomdj5SXi4qol3KKsoyEp5GEmZOEmYuilqCYk4mbnaGSqa+fkZWQjY2IlYtujbeFmsTIspyhpZucmJaRspFkpM3Hlo+Fh4mQko2Nk5SKhYqKhpaam4+QlJOGlZeEf4+LmYiNkKqXl6SjiJmelpuIj4eXl4qEj4yBf4ePpYmNk6iZlpOWmaGYn5mTnJuis7Slo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoJyf2hjX11eTkpUWkJBR0Q7QT04Mzc7PDo4PTY0OTo8OjgyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PjpFTUZIUldTUkJjgUZ1gY59fG1+iHh6fnqBgYN+dnaAg3xsbot/eXx4eHyEh4p9iqOzp6Oqs6GWp5+lpJaVrqKDkLiVkrOZjKGgjKSbr6OknZiQp5anma2vpJeVlpSQi5iZlqDAjqTJuKuboqatmJGbnbKdhoWoopyYhYiJjpWNi5OPiIGGh4iSmJSMi5OThpSYhoSRkJx0kZmzlpeloYicmZOPipCKl5qJipaOhn2MmJ6JkJCcmpmTmJiflKCdlZ6bobGuoqS3vrTFx8S9w8O/xs3KydKnzs3T0tDW2NPQ2LtyeXZcYFVfV1BISU5FQkNFNT46NzY6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04OTU2Nj06SkZER05bXFlJZmA7SISLentuhYZ6fIR4gIWBfnB4fH19b3ONen2Be3iGi4mGg5Knu6yosr2vpa2zs6ijorCsipm1naO4pJWtpJaprbempKKfmamYqaOvsKmamZyUlZGXn5eZu7utyaFptrirsJSYnqOrk5e+o16qsoKJio2Uh5F8jo59g4aOj5SViIeSl4yQlY2LjJeYkp2ZtJeWq52Lm5SSjZCSjJmbipKekIuJlaChjZSNmJqdk5uYnpShoJScnaWvqKGls7irwsjEtbq9u8XHyMLRocbJzc3E19bRy9OhcHpoXVlTXlJPRkQ+PENBQTg/ODc0PkY8PDY8MzUzNTU0NTRCMzk6Qk06QTtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZUdiYGJwSUCLin6Bc4aHfYGIdYKKg39tfX18f3B3h3eNgYd7jY+MhoyZqsLAr73Gu7O0wby0rauztoynsq6uvKqbu6Sorbm4q6amoqGjo6ivsrGqnJykmJuYl56ipaWSo7muqMC7rK2yuaWkp32Ih5ysvbCDjIyLkIOPg5GPeoGHkIyOnIiHj5eNi5WXlJCalp2nmrGakaycjpqPko6UkJCWl46RoJGJlZujrJSWj5ScnpSgnZuYoKGUmp6npqSipLCypsHHw6+wurbFxMK+zafHw8fDvNXRzcTKiHRzYlxZX1tNSkJMQEVHP0E/Qjs6ND5BPD01PTY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGZGYGlnWl1bk4yMiHuHi4aDjHWGkIqBb358gn9xfoF6lXqRlJSYkJOVp7PGyb/CzMHDuce8uq+rubuXsra6ssCupcCkq6+7vKqtq6KinaeqrrSwqpufqpuhm5WfsLSni6K6urXBu6upnLKlpKiUhY6qw8SkgouPh4iEhpWUjXqDjJGOkaGMjJSSjoiXn5eTmZWYpqCvnYyqnI2Vj5KRlJWNkJWRj6GUhpefoLKelJqUoKGZpJ+aoJyglJiepqSmpqSvraXAxMKtqLe1ycO+ts6yxL7EvLPRysjCtXR5bVxYXGlTTEhETEtLSkFBPUNEPDVBRDs6Mz04QjMzMjI2MkEwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmZaTWVcZlRjapmNl4qMiJKQhol5hpSQgXKAfI1/eIeCgpB5jaGWqJqamLq9yMjKwdLJysLMvMGzrbu+p7m/vbzEt6zBqayyu72qsKmjpaOsrbOttrWgn66epaKYo7S8qZuovMGjtravq5Kwrausl4aaqqalkYKMk6WViYB1ipJ6hY2RkJ6fk4+Ui4+NlKOZl5yVlKOfqp+RpZqMj4+QlZaIfI+VkpKjm5Wgopy1ppCel6Wko6WenqaYnpWXm6WjqKeisqyovMDEr6Wzt8zAua7Es7u+wbiswsPCwJhteWFYV1xbS0tNSkZERElCQkFDSzo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRjdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Nl46ekomKf4mfk4R3hX+Vf3+QiIqQf5Whmq6mo5jCvsjDx8XTzc7Ny7vBt6+5vLS8y7zDwbW2vK2zv7m8rq+ooKintq2tqbG3mp6toqehnau3t6mlr77Dsb25s6eqtbOtrpaWpayooJGOkrHFp5WOfZGVfYiRmY+qmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi4yPj56IWpCWl5KWpZllmKOesqWWopasrKunm56ml5iXmJWhpKimn7arqbq8w7Sms7XLwbiptqyyuriuqLe6vbiDbG5aV1RVTkZKU05LP0FHRERIRkc5NUZNOz43PkFKLjMyMDI1QjU1UFZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGhXOz1AQkZCcUZpSVJlYkxGpZSclqGXqZaNkIOHppOIgYeCnISDlZCQlI6aop+vvq6hxrzFxMbGzs7O0sq+u7Wxuru8vs+2xL23ubeysbWzuLOsppyrq7iqqKevsJejr6SnpKS0wLCqrLS+wrnAubOnubW4sq6Vpa2vrqWLk5WhjXTBmn6XmYWPlpqMsZWamZWTk5mZpaOVn5uWmqmdnKGgmouNj5adYEqWnJqVmqWWVJawn6+cn6WUr66sppqgpZSTmZmOnJ+nopm0qaqzvLy7qrCyx8C4paurrbGxo6GxsrSkcW5mXFpOUEtEUFBQUTtHSklHSEJEPjlLVT9BOj1FTTA3NTQ0OkIzNE5XTzxKS09VTlFKT0hISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQENBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31pWDs6QkNAPVFFV1JzYldGSKqXmaCiqK+ZkZeHi6eWjoiShZ+HhJ2Xj56gmqOktci0qca6w8PHysjIzM3Gvrqzrrm4wcHMtsi6wbi1urGvrrK0p6ObqrO0qqimrayZpK6lpKisur+oq7a3v8G/vriyssOxub2so661rLqmiJyYppt2v6CFmZ2Ok5mai6+XoZybl5Wbn6GpnqigmpqqmqKnnpiQjZGdg252kqKalZ2inpCtsqOrlaiql6qupaSfpamTkpmciJScop6Wsaapq7q2vrOyrr65tqCjp6ilp5ybrKmpjGNlYV9SS01HSE5JVUw9TEROSktCQ0Q8UVU9QUFCRE8xOD03Nz9CNzVVWE4/SE5RWVNQUVRKUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlJgTVVIf2VeSEWrlJyhn7uvmZSfi5Oqm5GSk4mrjYein4ykrZSjo7bGvbTAusLCx8jFws3Iwr25sq+5tMDCyrXGscG8tLqrqK2ssKOimaq0uqappquqnaivp6Oqqr67p6y8s7e9xry3tbjAsb3As6m1t6u/pY+jl5GioLyfiZqgmZeeno+3n6mcpaObnKGaqKWzoZudppyoqp6ZlY+Um4uXiYylopSdop6gtK+lpZOwq5mrrJ6eo6OpkZWVoIOQnp6clamkoqG0tLq1rai1srOenKKlmpeVmaqhnndgXF9dSkhGR01RSU1FRkZCUkxKQUVHQFZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpnXEZDQ5xwYkdEp5ekn57DrJuXpJeZqZyWmpqPqpWVqKaVra2Zoau2xMK7vrbBwsDHxL7Nx7u9ubKvuLO/w8i1v6+8trm3pqOqrK2goJqqqsShpKirpp6rr6yiqai/t6atvbC3tse2tbm4v7G/wba0s7SvvqOXo5aUnJSuoJGhoqWjo5+QvqWpnaisnZ2hm6afvaKYo5+iqauhnZaNlZ6TnoePhY2TnqSgnbWsppyVsqeZr6ifmqmeoI2ZlZ+EjqGam5OlpJqYrLG2saqlqq2snJigoJKOkJaonpRoYllhXU5JR0pOS0hFRElBPVBJQTxHSUhbUk9LPUhPVTRCRjk+SEc1Q2FbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLDBNdlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5b1JGPEt4ZWJWTKKao5yexayhn6ydna6gk6OflqWgpqmrl7axo6qytcTDvb+1v8K7yMK+ysi2uLW0sLOzt8HGtr2wuLS5tZ+mrKqrnZ2epaPBpaCprZ+kqa2voqanvbWmsby3trXDsrO3ub6yw8C3uK6ztbWjnaSVkpShrqCZop2pqKujmsOtqZ6srZubnpmmoL2inaWYq6uspqGZjZmfkp6Jjld/lp6loaC4qqeTmLajn7KhoJuulp6OmZSdgo6fl5WOoqSVkKatsqupoaKlpZWVnJiLj5GTpJ6JYWRaY2BMSEpKTkZFQUZLPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JIRTY9dWVcS02en6GYnsOnpaKzoZyyp5OqpKCkn6yprJ27sKistbHHxMHCs8LDvMbDvMTKva+xtq2wtK+/xLW5sLC5tayaqLCpqZqdpaGnwqybrLGbqqKusKmkp722pre6vK62w62zs8K/ssazurestLatqqKmlpWVpKyin5+aqKuwr6+8sqagqamZmZiToqS4oKGkk6+vrKWnn5KhnpWej5CNlZ2aop+ntKanjZi0nKOvmp6brpCek5eUmoCSoZWPjp+hk4umrLClpqGcoJ6SkpqThYuRjZyef2FlW2dlSklMSlJBQ0BJRzs7Rz85OU5NVV5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tVXmZyQDg8SJZ3ZUE0n6Ofm6DDqKSqsqGjtKmVsqynoqSyq66pu7KssLW0xr/Ew7XAxL3JxLXAyMK1q7WosLiswMS0t66strmlmauxq6qYn6aXrbu0m6iwm62frrSxp6q6sqe6s7eyuMCqt7LCvLTFp76urbe1qqisoZeXkqaloqOYmKWvuK6ytbagn6ikmZWVk6Sgt6KlppausrKmqqahnpuampaYqJ+gmKGer7Kipo2Xrpmlq5eanaSRm46Tl5mFlp+UjJCcnpSLqamqoqegmJ6WjI6ZkIGFlYmUn3hjaF1rak1QTU5UPUNBTkM6OklANzdRT11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hOUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUpwaFZDV0aMeWZDO6SjnKGmv6aor7ChqbWqnbmwq6OqtLaxsLm3r7a4uMS9w8e9vMPBxsC4wcbBuqq2pK27rcDCt7eqrLG7opWtsK2ylqWnkKq5qaCnsJ2qoLC0sqqptrWsvKyysrm3rLmwwrq9vqbDq7C3r6mrq6eemJmroqKgkZihsa+zq7G6m5ypoJmWkpemobeppaOir7G0q7Koq5+boKCbnqWcopado7Owmp+Qk6WaoKialaGelZiJlJiTlpeck4iQm5mUjqmop5+jm5ebk4eOmYt9i5aFj5tqaGxhbG5XUFFaVEFDRVRAOztJQTc6WFBkXlBWV0RZXl1NTFJOXktKPlpjXk5IUE5bVVlQS1NXWkk/RFhQREY+Tj89SUdHUVBCPUNGQk0/OjJEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPionKz1ccD0+MS4xZVtkQDE2NDdnWWBGKD84bH1oW1Y7iXtjQz2nn5yiqb2hqrCro7G4qaW1s6ygrLS9rrO4vLq9trbAwr/IxLnEwcDAuMS9wbevtairt7K8vr+0qa6xtp6Xq62orZanqI6nu5+krbOeq6KxsLOsqba0tb2tr7G1rLC1scC6xLervK+xuKytqqOxpp6lqqCkl5CZn7Oqs6qrs5qdp5ualY2gpqS0rqeira2usaezrbKqpJyfqKSelaGYm6i1qZeZkpKfmZ6gnpCrnpeXhZWYi52ZnJOKjZaXmpempaKgnZWVl5OAj5SFeo6Sg4yWZWxyZ3BxX0ZZZlZEQ01YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYl9QTE1OWFdYUEpWVldNPUVVSkVEQU0/QUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sKyUyKyo1SzEuJ19fYVUxNTA9YFZeOClDM1lVXGdLNYx6ZkxApJqgpKy3o6yppa6utqmvtLqnprC3xbextr7AwbW0usW+zMW5wr+6v7nEuMG5srWsqrq2u7m+tKqtsLWYmKerqqubrKuOq72eq66xo6ugsa2zrq62sbm3qa2usai1r7O7vMmyqrW0sbWwr6ehs6CaqK2gpZWWm5qyo62gpq+WoaSampKNoqWnsqmip7Ksqralr7G1r6SZna2nmpifmZmsuKKXk5CPmJyhmJeUq56ck4CTmI2dnJqWkYqUk56apaGhoJiVkZOVeouQhXuMioOLkmtueG11e2BFYWpZSUhZWz17SkdFNkFiVGlbTVxgSltdWlJSUmJgTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ15RXC4qQi9KR1BbSDNjWVRKRJmWoLCosamtpaSurrWot7S4pKu0t8m7tLq6v760tLfDwMzIu8O8tr6+wLi/vLG9rqe6ube2wbarrbG4lJemrqunorGqlK+7pKyysqeoo7KzsLGxtbG4s6iuq7GnuK+1tMPFtqm0tayxrqqno7afn6eyoKSUnJqVsp6nnKCqjamjnpuWmKWlpbenorK0rKexp66wtaylmaCsqJucnZuUqbiclI6Oi5mcopeQmKWgnpWDkZWQnZyYlpWIl5CXm6eco6CSlZCQlnaEkId7hYGEjYttcXd1e35cS2VsXEtOY1w/YntHSThHZ1dlW01eYk1YWVdUWFRpXU9PSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0ZhTFYlLUIuPUVNUTwzcmpKQ0OQmaWupa2uq6eksLKzqrewtqCrtbnJua7BvMK3s7G1wsPOxb/BvbS9v7+6v7yzxKipubC2tr+8r6uzspygp7CtpaWwpZ6ytayrsrCsqai0uay0srWstK2prKirqbmtsbHHv7ikubCpra2mqK2wpqSkrqOpnJ6cm6+aoqOjo5CsnqSgn6Kqpaa5pay1taWqq6isr7auo56jqKqboJqakqS0mo6JjYeRoqCVjZSdn5OShI6Skp2bmJWUh5iTlZmmm5+fjJKQjZB3fo6FfHx9h4qJcXRyfn19XFNkb15OWmZdRkSWWkc7Tm1YYVtNYGJOVldWV1RZZ15RUkxjWltUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZEhKKzpJPzNCSVMsPo9rPEdIj5uqqqKpsKSopLO0sbS1sbGhq629y7quwLvHsbSttMLC0cXFvsCyvsHCvL+3vMSnrLess7i7wLCrsq2gpKetqaiksKOqsaqvrLCur66ss7untrCyqbKpq6Wlo626rKqxwrm1q7moqKitqqixpaqkoq6qqKKenKOslaSdmJ6ZrJ2ip6mirKWjray4sbKgqaKgq66wrJ6fp6ipmaSYmY+gp5iGg4+Ki5+gj4uMlpuOjoWHkJWgnZaXlYaWk5OXpJydnIqRj42Jf36Ihnx3f4eFhnRzcYh1bF9ZYG5jUXNxXEs7hHxGPld1WGFZTmNbTlVWVVdQXGJeU09OaFhXV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSWdERjg8QjA1RUtYMUCUWj5MRZSXraeiqrKcqamvtqy4ta6qpauqvci7sL23wq+wrLPEw87Ow76/tMDCxLrBtMnErK+3rbK4v76zra6rpaeqsKmnqLGltK6rsK6tsbCzrbO7pLizrKyup6ufop6wt6uqrbq2pbW1o6mnrKyqraGpp6axsqOmpaGhrJaqoZSaoKaepKKrpKyin6ext62to6Wim6mqrqmdoqWkpJigmZaPmJ2TgoKQiYWcoIyKjoyZjZCLg4yXo5uSkJuMk5KRlKKZm5mKjoqKfIaBgoN6dICEgn50d4ujh3hqXmBuZ1dlh2ROQGeSTERieVdiWFJlVE1WVVVUT1xdYVVLTWlXVVdJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEMrOkpPXjREhj9IRkSWkq+ko6qwmKuprbWrtrGrpauqqbzAwLi4s7u1pbKvxMnL0b/Bu7nAv8K5wbrBxK6ytbGzu8C+s7GurKurqLaqpq2vq7mwqLGxr7Kstqq2tae0tqyspKmqnKOes7OoqKS0tKC1raCpqKuoq6egq6uoubapqqqpoqmgrJuSqaGdoKSipqOpnZymta6opqmio5elp6eqnKKko5+ZmJ+Rjo+Zjn6HjIeEnp6HhIqKjo2QjISGlaKajoyakZKRj5Kfl5iWi4qDf3SGgX9/eHWDf3t4foGInY9vcWdncXhcYHOIak9dmFZIbXhVZFZSYlBNVVRVUE9YW2JVSFBpVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkqKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD9DLD5MVF8vSmo2T0Q7lY6woKWrrZmrpayus7SvqqWvqai6vrzAsK64rqG1r8nHyNHAvr27vMK9usPBv7+usrKxtby8wrGys6qzqKS1qaWts7O5sKOutrGvsrqrua6qrrWrqp6pq5+ioLatqKGfr7OhtKqeqKeqo6qhoqytqL2vrK6toaeon6uZkK+hmKKhqKefqJqZqrCpo5+soqGToqOjp5iaqKWXl5idj4qHlYh9jYaFhKSXhYKCi4aOjZCEhJOgloiRnZCTkI2RnJSXj4mFhXh0gX99dXh5gHt0c3ppgYajdWleZWuBdWeIi3xSWHBeSnhzU2RTUV5NTVJZZk5MVlllWUZTaVJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw+SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMaDozOF89YWQ/RjFDUFtbK0hOOVVBNJCPsZ+kpqujpqSsprSysaqksKequL7Bu6+nuaqnrrDJxsjRwry/vrm+v7zJvMG4sLC0sbq7uMCys7usuKyitKanrLK2ubOnp7u1rba9sLymray1q62cqa+jn6WsqqecnqqzpLOomqqnqaSpnaOpp6m+q7Svrp2ppKCunJuyo5WknKSln6SamqirpZ6bqqGbkpuhpZ2Yl6mpkZiak5CKgo+Ffo+CgIiej4Z/fYuHkI6PhH+Tm5OFk6KMlJKLkZuSlYeIfn9xenl+fGl3fHp1cHB9aIV4hIdkYGdjcoV6bWd5XV5WQld6bVRhT1JYS0xOcXRdSFpbZ1lFVWZQRD5KTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZiQUo3R1NgVSo9O0RYPiqPlLGZn5+ppaShq6S3srKlqLGnrLjBvbWwo7mtqKiww8nJzMG2vb+1t7+6yLbDtbSztbG9uLq+tq25tb+tobOmqquwtbi0q568vKiywLO6oK+ztaqsnq6wo5ylqKminpylsaavoJ+qqaiiqZukqKCtvKiusK6hq6Okrp6eraaXn5uho5yfm5qjqqKamqSklZeUn6KWm5amrIuekZCRjIKKgYCPgHualY2JfH6Lho6Ni4qEkpiRh5SjiZKSh5Caj5OBh3x5a312eXhie3pxcHFyeGiAc2qDZ2RoYW5zjm1iaXBgcEFceGtWXk5RUUpKTVNZVk1dXm1XRFhgT15QSE1ERjs3SEVLTzxyaEpLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MEJoWTEzUz1lX0RMNktXZU8qPDJPWj0ikpmsmZ+Xp6Sin6ejuK+uoq+wqau4wrqzrZ+5r6uotLrHysi/t8G+r7S+t8S2w7GvurKywLW7vrepube9q6S0p6iqsK65saqbu72ksMC1tKGut7Wmp6exs6CepKanoaWZnq2nqJ6gqa6noKaXo6igsLifo7GvoayhrKScpqaompqbn6OVnZyanammlpufqJKYk5idkpmWoaqQmomOkId9h3+Cjnx8oY2NiHmDjIWJjIyFh5KajomVn4mRlYKLl4yRfYR7c299cXN0YHl4aW9wcG9pfnFjemxpZWNhZoZ/YFtyanJNTX9pWFpNUExKSFBSUUlOXF9uU0RYWlJnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmhIKj4vWVg1KJedpZiclqygn6GkobersaS0tKqoucS1sq6gt6yurbC1xsjAt7/BubC0vbe/u7+vq72wtL+xvcO5qbu6t6eotainq7Cts7Gnmr23pK28tq+fsbewqKWnr7GboKSgo6Shl5uvpqGfoqevoqCik6Sko7ewoaaxq5+so6+YnKqlqZ+Xmp2lk5ucmp2mqpmcnKWWlZeVnI6Tl6OpoZCJipCGeoR+hIp6j5eKjYZ5goeEiIuOhY2TmIyOlpmKj5Z+hpeLj3qAenByd25vdF94d2RsbGtpaINtZnJpa2VoXGNzgF9aa3VpWkl9XltYT09KSEhSVUYyOV9ebFBEWFZZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mio7KzEzOWNsODRHQWZbSFREVV1oRS47MmFULDKWo6GXlJyqnaWhoqC3qq6gurmmrL3Es7CuorWvrK2vtMPEvLO/urews7m4uri7rq3As7S4r7/BuKy8urWmorOqp6mzq62yopvBtqWotbWpnrK7qqemqa+smaKnnKOmlJiisqSZn6SoqZyioJOloKS5qKSnrqeepaGokp+poqGgmZudoJKbnJagoaubm5mhlZKVlpqOlJOjqKSQiIqPhnmEfIWFfZ2NiouGeYCEh4iHkYWVk5KMkJWUjY6Ue4OYj4t3fntsdHJsbHNheHRoaGpnZW+EZ2doY2Zoal9oYmlmWmV7Y2BTc1RbW1NMSUdJT1NAISppXmpMQ1ZVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEIzQ0RnW0tXR1VgaEIzNzhkTicynqSjkY6kppuenp2jtaynqrm3qKzDwLawrKK1rqevr7fAwLyywbaxrrK2tri3tqyqvbOvsrG9v7euu7uxpZ62q6WltKmrrqCfwquopbCzqqy1u52oqquxpZidqp6mpJGZpq2imJ6kqaGcop2XoJ2ntqavqq6hoZ6doZWgpp+hoJmbmZySmZ2UpZ2sopiXnpWUjpWXjI+YmqmgkYiKi4l5hXeCgoKdh4uCiXx/hIiGhJCElpWPjpCRkZGNknuDlY6Gcn19Znhva2psZ3Vza2NnZGN0f2FkZWZlaWpjanFZXlhebWRhTmhXWmBWSUdIS01SWD45YGxpR0JUU1xbSUlHRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNBZkglNZukn5CMraGZmKCWpLSxorG9t6Gxxru5sLGjt6yqrqm5vbu7rcCyr66ttq+zuLOoq7mxr660tru2r7i9raadtaugobClq66epMOgsqSusa+3rbWera+trqKZnaiqpZ6Vm6iln5mlo6idmqCclJydrbCmuaiuo6Gamp2ZnqOapJ2XnpiblJqgkqiWq6ibk5yckoyVmY2UlJmop42NiomPfIJ0goGKmIWHfImJhISKjIiShJOckpKPkJGWjpB/gIyNg2+Af2Z4bmhramdxcmtcaGNicn9gZGdqbWxnamlmbFxsbXVxYVRiaGRlWUlGTE1PWFFRVmFlgVRAVlNZVUZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSWVDJzSTopqOjrCdmpOhmqmysJ+4wLagtMK7vbmxpbavqK6lt7i3t6y7r62qq7eqtLmupbO1sa6psba2sLK1uqeon7apnp6poqqtnKnAmK2krrC2ta2tn7GtsKqim5yjrKiblZyno52aqaKklpqgnZGbo6uqqbufqKSgmJmZnqCPa6KWmJxxgpabpIB1kqqnnpWVn5GJl5mAloqgj3mGlI2Dbmp+d4NxbIaLhn2Ei4ZvXmNgZ4SXhmuLkJSTdXeLhH6Dj39mhoBodWlmV1xpc25OUGpjZnGEZl5kZm5saV5fX4mQhIZnT0tEOEVUZ15KR1BQVVVLSFNhb3RlRltRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNTY4LCMxJzIxNDoxNzZYgWwxNk9rW05cS1tmYj5HMVBkPSsvjaSZh5Wwm5yToJuqrqujvcWvqbfCuL28raa2sKWrpLizsrOwua2qp6y0prC1o6i4trWop6y2sq60rbOiqZ+0q56ipJynqJqsvJWmpa+zuK2upaiuq6yloZ6coKemm5ihpqWbm6ennZOeoJiQnqiqo7Wwo6OjnZaXmJejiKGOkpqHoYeUnaF/pX+nq56TkpuSiIRyeI2OhIihdoiNaZeIZn1zeKFviIeEfo17f6Ggn5mAe4eedIiOdpuKbIeBg21oZWN6bHFiVIZtY2xpmHFYam9uhldeaVtraluIcG15coZoh4RaXkZOPkZeTUVSVlZRUVJXVGdeTFhKUlJPRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFWYTcvKIyml4OcrJ2ZmZ2fqqqnqb/DrrG6vLfAvqqkt7CprKayta6vs7arqaWxraW1s5yttba0pqeps7Gtsqevn6qgsqifpKOaoaOcrrWVpKWmtr2mrKeqqqyopqKgmKCno5mZpqOkmJykqZaUopyVk6OlpqC3pKSgo5iVk5iTnIiuj5iUiamLl6KbhbGApK2elJqelXmC1Kh/h5TBm8d5d7Glt5dkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB6gWyWsauweWhrWLGub2VpvJK8bmh5bXKP2H5Sa2O2sn+BcZR1mqGqkFdPV2FPVk5GVFtYUVBSjFxXXFBAXUVRTkRHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGNppOBpqmfl5ydpayyqLDCvbK1wLW3vsKrprStramnr7Oqr7a0qKimtaanuK+ds7K2qqWkp7GurbGmqp6npLGkoqGel5ugn6+tlZ6in7S6oqqooa2upaKdm5qiqJ+Ym6ign5iep6eRnKeblJ2hp6KgsKOfn6OWlpKYkpmFr2pqio2qfmeElYetZXCenZSappVxrqGkfne7fGuhj3axX2q0W6WAZpyRYGaBemZ/anhqqWW+cmemjHayanyxeHSSk2NtbadtW4SgRWlmh5ZFdZxgfWd7pKeCWV+Lq2mBlXh6aqc3Sq9bV1RsY1tLTldfXFdWO06IT1dWL0lUVElDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46NS8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzEbkaKVgqynpZ6jpKmxt6yzvb6wt8Syt7rCp6mwq6+pqbCvpLC6sKSlrrOjqbipnrOysKOloKqtr6uvpqefo6KwnKOcmJWXm5ytppebop60s6Grm6KtraCemZegoqmcmZ6koJyZoaekkJ2jmpehn6yfpqegm5+hlpWRl5GahbWbtXiFqZm1mXeHs5u3f5SWl6mUfmuBpnqBhYiSlJJ3q2drsVuse4+HlHSIcI+GgICIkJd4g4KLl4yDoI+EsHZ3n3Fra2x8i06kWEhjY5l+Y2imYHlydVOSh15QqW1jcX6HgGKdLlGhbltUa2dgTEtcZFhcWkI+sHhXWEEjTWlFQkRBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkc6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjlhVTUwHJWflIizpaahrqmns6ypu7bCsLzCrbi3waqsra6upq6yqaGvvKqhp7StpKu1paays6ejop2nqrKosKelnp+fr5afmZWVlpifraKamqSota+hqY+pqKqbnpWYoKWomZ+co5+coKOko5abn5ianaOrm6aanZuioJeTkpOTnIPVk5m5cLDCfsaGfNaUm7t8mpalkI2cjaR7joajgqWCeqx5j51Vr3uJfp9quVq5d4aDfKaCk3yYeqp5jpyPe7FtjoR0kLyFb5RQr6fFilGgemNgqmJzcodsl4hgU7W0yIaAiXxjpDNCnXZdUWpoY1BAWGZaZGFKSE1sS1tTT1lmWkNEP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS1xQX2ZUN0c6YVE3MiWbopOYsaeopbOqpbSopLu3wbC6wLG1tbyztaexsKOws6afrraom6i5rqOvsaCztLCgpJ6ep6mwqLSppJydnquXmZeWl5WWoauempeorbCpo5+PrKKnlp6XnKGloZehoaKhm6Kip5ueoZ6VmZumoJynlZybn6GZkJKVkZ2Ism5otXGrh2+OpnK0c3K2e5qYpIyPnI2ifpCgpX6wdoOR0tF1W658hn+kb5uqpmuGhHytfZeZj3uxc5OdjnizZZZ0hJ5vnmaUUsiLWsJcn3liX61fdnOHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9qX2xpT1VGSTk9V1JbV1hIQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5ISTkxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJOVF9lUDVHPWFNNjIvoZyRpa+spKq7raa0pae2u7yyur+3trW6urOltLShsbKjn6ywpJimuq6ksbGdtLiqn6adoaqksaesqaSanJqpnpaVmJiSkqOooJeTpqqxpqKWk62fpZKUoZukpp+UmqamoZujn6yaoZ+ekJacop6cpZWdlZqin5aZlpKbhax7d6h2o46Jh6lvrYqDqIOZmaGJkpqKon+SmImuhX+Cs1xys1KufoOCpH9x1313hH2OnYeZmXevhoqRnId3tGGaZZqBgpRsklqwWEuadZh5ZmCtXnZ3h2eYiGter3eVno94bDV5yK6yX0FUb15nYEVQbF9xbVZVTS5lY2lTWVE6QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo4OJ+dlKC4sJe0wa2os6ipsrq4s7i/ubeytr21pbizn7Ssn6Coq5+Vp7arqLGyq660pJupoKCoobWmpqqjmZ6VpaGUlJyZkpWipZqTkKesr6aglZmpn6KPkaKZqKaglZmlqJ2cpJ6snaGdoI2Un5ueoJiZnJaXoqCTmJGmnYapfX2leKGPjoOqcK2MgqeGlqChipeXiKOCkYeUqnyAi515b7Fap4OCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfoOVbJJcq1tak3+Rf2hnqmNye4FrmIdxXaxaiaCOa25lT0pDoVxaTHReYmVNWmFfcnNfSlU2SpqTWUhFPUhGQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQUg2S0lOQElLQEVOOjpANC46PjEwMjE0NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzFVX2JMN0ZJX0MxPjihnZmZvquXtMKuq62ppbSwuLG1v7m6s7G3vKq7tJ+wpJ6lp6eelKqxqbCqtayrr6GYoaCmpKO5oqOroJebkaKglZSfmpSYn5+PjYypsK+mnZebqKafjJKkl6irp5SXqaeen6GjrKShnqGNlKGYn6CSnZeclZ6glZaPq5uPrm1ytHKpjHaKpnO0eXSzgJKkopKcjYmkh492uG+Me4uia2u2WaGGZZeXaaGip22TcrR0k5h/smqFk4ita3WzYZ1mom+HkmqXXK1gTaF8h5FSc6NseX9+b5iGcFyvVjycd2ZUb24uXKdPYlJrZWFsWWJcYHB7Y1NZUT4+bXAzQkJAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJJNklKUD9ITkNGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV9hTDVGTV44MUI4pZqbnbqhm7LArq2rq6e3qbivtMC1vLGvubirwbapqqCbpqShnZKqqqe2o7Korqqgl5ynoKSruZ2jrZuWmY+lo5aNnaGbmZyfkJOUq7avp5mUnKyql4yTpZmlrKORl6qyo6Cep6uwmKGjkJmil6CblpuXoZOcqZyUkauZh9SSmrtzsMOAw4Z+1ZacuHiIkJiMl4mMp4h6o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiAim6aiHFujaR0vV13fVthebxrWlZbanpeamBkZmJtd29ZW1lDQUByP0NHKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaeanqG8opexw7Ctqaqrsae5r7bFsbqyrruwrsGyrKWinqOhnJuRqqSqsqS0pq2kn5aaqpmmrLicoq2YlaGQpaCTjZyjnpidmpCWk6+5sauVl6Oop5SQlqScpK2ekaCoq5+bn6mjsp6jpY6nopShmpyXlaSYj7CgkpWqnoWQmbWAkJGMuJV4gpObtXdubG5zbnmPhI6Jc57Bu7yae4GyqHCAdJG4g3yGhouHjXuKho2XfKS7ub2cdXqzo3R2l3V0sHWZnmaGaY21dHJwd7aMXn95fYlng3lteWKLrHB1hX9ZW6dqRGRZU2ZgY11jUWdmcWx1Qk5QTEQ7Wkw+SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JWOCpPXV09KzpWVic9OzynnqCgv6WWtMO0rKqnrKupu66wxa+1s663p7W4ramjoqaeoJ2ZlKykraqmtaion5uWoKOeq6S+pqGql5SdkKKbko+iqKKTnZeSmJSytbatmJ2kpKKLkpGmm6Wrm5aopKWcmqGppqejqaGSrZ+Xo56Xl5edno+wqZScp6KOan5pnKd4iXN+mo90emWHer2+wLpukoNxlIZgcmpaXpqJYWSHjpVrYH+VY22cdmKUa3+alZRlXmBjcZqJaHKMfYaVZ2p+cXR4fX1iW3d0gWhQXG6DfHuLalhreoJySUpvhXBNdE1FV1xmYExbWGdjXk9bbXVpcVJPREVNO0hJPEw/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1xcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdKUl9JJ1NgVjQpUF5MKDM9W08nPzI+qKCoocGjmrS6tqKspa6nqLWxrMissLOstaO+sbKmoKOpnaObmpmsp66kpLWppZuXlaGbp6yovqepppWUm5WgmZOYpamnkZ6Qj5idsLK/rJumnqeiiZORqZqopJqbq5+jmZujp62in6qimrCblaagl5Sdn52XsKWYoqiZnJGdnKOkmaejmpyampqQloFobn1xd5GXlJGFirWqjYaYlY6KjJeXh5SVioOSk5GJjZGTmJSYl5qgopqblKCdjoJ6pYZraXyQfIB0iYqBcYJ4eXZ2ioB7impzgXSDdWN3fXZrcHttYGNccGdNWVllal9XWm96bW1mU09GUzlPWk5STygrOkpCNjM1PUBBOTpDPjxFTlNTVFZXWFlaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSiZSXlMxMFReOis9OFxLLDwtQLKgs6G/oqSxsregqaWyp6WwtarJq62xpbWmwKi0oJ6kpZyklZagq6aso6O2rKCZlpagl62ppcCeq6SVkpyXnpiTlKKfnqKnk5GYqaeyw6+aq52rno+WlqmeqpycoKyYoZqcoqWvpqGkqJ6tmJemnZmaoZ6enLCgnaKmlZiTmJOgopajnpegjpaUi4qNjpetj3yVm4KSgouqqIaBmJaKhI6fiHuEkIaFmZCHhomVjpuXjZCYnqOWmZORnY1/jWahs66EiYR2eo+KfHZ5em9neZCBgIlrdYF5iHJoc396doOIgmt0Y3lmYGlkYmRmallre3BpalxTTFBEX1VGQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTUQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvvqyrrrKyoKqmsa2irLOwxbCqraOzrryktJygpqKhnZmXqKWppqSms7WelZSdmZmwpq6+oKujkJGempmUkZWhnJepnISeqayitMizn6qkq5aWl5qnnaibn6SrlJ6enJ+qrqmlo6uhrZufoKGYpZ6cn52vo5mfqJOYmJ2RpZmYqZ6al2aDknxlfo6aj2N5jWxoa3qRpKtrZZqYfmeFimVlaWh6jaGOa2iMl5Gid2tqi5ijn5hzbG56hI2GeVhlXYWBXmyKiYB2XGhzd3eRgIeCbneCeIBzbXmDdHeIiI6De2qFWV5rdGRdc4lpanxxbGNdUU1XSmRYQEo0PUY3P0ZENzE8PT9BQzs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSltKLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvq7OwqqWora6wpq6tsL2xqaikra+xn62Xn6OeoZqZpqucrKOmqKmyrp6Vo5Cir6a2uaWuo4+OmqGZk5KboJmZpZZ7payiqLPDt6Sip6+enpWeo56jnKOpqJGeoJ2fqq+qq6Oqn6ibpp+noKyWoZulsKSYnKqVoZ6ak6WYnquZnn6+g4hytHKEnYataHi5xLhxk6Kje6aYmXOqgnzLwMC7cYuih4KffJWYiZ7AvYKWnZ6NncHBe4F7kYyawr99a6Wxb4yAb8p6f5t3kYOOgHZ5gX95cXp/h3F4hYyTeW12kmJmX3hkX2WCY150aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPklbTCojQlAvI0ZbM1BZL1VBQjsvOJajuMO1sK/AqaiUo6+psK+tprK1r6qmpqaxq5+rmJqioJybqqeinKuipailpLSjnaKSpq2st7Onr6KSkZqdpZKRoKGXnJ+dh6erpKutv8CwoamvqZeSn52imaKjqqOSoKGdna2uqKymo6KnoKWlna2pkaSbqa2qnJ2qnKyhlpellqGjmJx/zpR5eqSBeZWWm1+uj16Op4GhoHynlZt0q4OAr15jjap6p4eFoHSXkoizY4KrhqGOjbNphK50fZaHuGGCrVmjzW6PdXvae3+ZcH6IknV/ZXuIdnZrfYhufoWRkn5tgY5gcWtwZ2BfeWRbcGhqZGZgUlRSV15LT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDtMLSFQQEY0LjGtwr+/tbSwt5iekaSqqK20q6ayrK2spKunsKqgp5uZpZecoq+foJ+op6OloZ+wrJuelaeurbGrqKyglJKbn6WTj5+ll56oo56upKqwqL/Gs6ipsa6Wkp2copegqaqelKCfnJ2ur6eqqZunp6Shq5KttJalo6qqnqOnpqGwoJKap5qhm5SUkZegcIWMl3WFqIdxsHydcqx+oZ6BpY+ed6uCfa1/nHKtfquHhp92mJJ6fJd+qoiijJGLnX6re4mTj5+Ae61WnMR6j2+SwX2BlW11cIxtZXZlhm9hd25yb4mKkZCDbZCPZG90dXBgZ21kX29paW5mY1dTXGFaUlNDOUlJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PVdKLTwnPjEpM1ZARiEcRzpDMS4rr9TGxrK0n52jjqOjoayvtq6osKepqqiuq6unoqSdmaKVn6aqn6Kln6ioop+dsKyXmpaop66sqKepnpeUmqOikpShrZudpqOvrKOstKm5zbGtp66slpScnaKYn66snJagmZ2eqbGpqambq6mjoqybr7GiqKyuppmmq6qqsaKSl6Olm5SShaRqpHWJeql0erJwgqWJmYxwiKCah6RgYFKshH+ugpp2roGmhoafepiWhntmgKOJpJmGgaN9qX6BlIeuXnypVZ2ikoF6op+Ae8OvxYxzr7OzuXFiqa/CdGiNjJiPgW2akm9teXd3b2xmZGVxcGZ7aGNdV19pWFhVTU1RTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY3NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzY2KjFQS0wjIEE5RDQsJ8LJ1dXAoZmrqKGvop6wtbCvqayjqKaqqquppKagm6SenaWnpqOcrJqiq6Gkn6+inZqSqqS1sK+gqZudlpSno5CaoqifoKacsaajqLGstsiytaqsqZWRnJ2imZ+ls5yaoJScn6erq6OumqypoqGqo7OtoqqzsaGbqqivsLajk5akp5ibkXyqbJ6Eh3WreXywb4Kki4mflpWelIHSuLS4yYCBsl5flKmDpIiHoHmYlZp4qsl0maOVp6mQkpuMf5uJmsbGeGWhgqVzgZ+Ogn2vXm+1Y7F1S6OGbadHgpNkj5Cek3xwl5J/cHp0fHttW2ZqcnFmgWpeYlhjbVxeWUlNTEtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU2ODUvKSglJiUkJiksNEVOUFBNRktKVkYqTDAvPi01T1RRHRw7PEYyLCSnpMDGua2osq6spaKcsrmsqqGmm6imqqyppqCmpZiro5+uq52loKyanqilnaa1nqKXk6iqtrKsm6WcoJWQpa2RmZyno6Cqp66io6epsLTCsbKqraiTiZidpJqho66ll6GVmJylpquar52tqKaerKO3rKGxua+dm6+ns7SzpJSYqKSan46CnU54moF/n3qEo3yCpISGpp6cnpOEuHt8ebmCfszFwrZ4mqGRi599mpaXinaemIqkmKOofrCFnIWehKx9mZRhpWyjcI+FkIF9l4NyrGCkc3GAmmC8fVJVdY6Ro5d8fpKRinR6c4R+cFttbndyaoFvWmRfaG5iZF1LTVFUQklIRkk6OUs+QjEwODg2Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUzOlBbVBwbNj9ILC0gi4eZqaykq7mrr6Ccoayzs6afoJWlrq2uqqedpqaao6ehsq6iqKayoJmppJSitaKjlZehqbS5pJujnaOTkKGymZ6cp6ahoq+unaSoobWxw7Gtqq2pkYeRnKaco6ScpZeemJmZpaSomq6hrqWml7ClvK2ht7etnZ21srmxs6eYnrCipJ6Gj9G1w7d5h46FkZOPgKZ4lKJ3jKCShKWBinGqhoS0bnJqmaOblYqffJiZhoePc6+CpZuijaaLk52JlJCbbXCyXKVzk3qcbJl/e5l9bqlhonFxf59ic7K4aHiPk6aYfoyMk4p3fHmNgW1peGl4c25/dF1kZG5tZWhgSlpYWDxIR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdW1paWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVlZUUU9RW1UlITJBSCQpJZJzjYqtv7+7urWel6ikrbWho5mVo6mnrqqrmaWin6WgoLWmoqinsKOUq6OOpK2jnZCamqq0tKSdpZ2pkZSXrqCgnqeknKectZqgqqO1q8KwqaupoYyEj5uhoKailZmanJiamaakppirp62ipZutp76slb2wrJ+jsLO6rLSnm6mypaiYeqiQfXywd4qBpKWInG2yb6GHrXyhjoOnlZiArIiFroWflKigoZaGn4CZlYB7kn6rgJ2aloqqeJ2gj4mTkoB5r12jgXymp2SdgHyXdGuuXaVrcYWZXWBbjKBulZGmmYOUjZaLenqCln9rbH9ifXRtf3pgZ2Vxb2dnaENZYFs9S1QyVThCQkM3JCQzKycnMywgLzY2NzQzNTlAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pYU1BPTkk3MDUyLiosQVRWVlZUVFVVVVVUVFVUU1RWVldYVlVVUUhGSUojKCi8kpqEqcbCt8G0n5utn664paSOm6SjoK+vqp+kn52tmJ65oKKqoK+pma2hkKqppJaJmpCusKymn6ebrZiYj6yioZ2mopqlna2Yn6iltqi/r6WppJ6LgI6bmqCmnpKUmpqTmpqlo6OZqKuro6Sfqai+pJfDrKqjoayyuquup6Czr6mqmHavfpCLnIWHfbqtiphksIxlla19oI+DppWagayKhLCFpZmkoaGQhaBbbGqBs2B/rXt7goCxbGdumZeMiLBbfbRbpINryKJln4B7vFl2tVqyfVKvgHqsWIChbZiPqJqKl5CWlnt4jZx9ZHN9YoN3dIB8YWpmcW1mZWVPVWNbQlRePkkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk5PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTUpHQzU1My4vQFVaWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsre9u7TBs6Ocraaltqihi5qgn52zs6meo6CdtJegs6iqq52vrZ2rm5WuqKKOiJuOr6uopqKnma6TmY+omqGepZ+Zo6OlmZ6jqbKovK+kqJ6djnyLmpWhoJmPkpqbkZmXqJ6gmKitp6Wlo6Wpu5+gxqelqaGrtLatrqefvK6trJWBqZKjr46bgIakl5iPgIC4w7qDjp2ThaeXnIKsioKviKabmqWqkH7VvcKqYqO/vXx+o4KD17q4tYWUk4Oevb6EaqOBb6uEbZ1/erKwx4Nqq7C9rXh3or67dICWjqacj5qRlpx5gZCaeWN9emSMZnmCe2BrZWtqYlBiW1NqXEBUYUJOKT06NC8eHyQeJTIgHSQoMDQ5NjY3Nzs+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1JQz88QT81PVNZWFhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVs7Sxv7myvbOina6mpbOmnYuYpb6pt7Goob+mprGbnrGcuaiera6lppWUr6yXjIOaka6mo6yhpJyqoZiLo5KmnqicmqGpopmeoKutqbmtqKObl5N7h5mRppuTj5GYmI6Yk6mZn5ipqKCqpqGjq7ueqcWjoK+jq7O1q7CqoLuor6+ac3WqpLeGZYmfcGesj4qPbW93pJCZn4F1rpmVcI+LcZWno5uYrqRybW1tZYp3bm2CmXGAeWlxaWeJlZWYcWhphIZncIZkXYljam9ZXWd+d6ZgYnGOkm9mZICNko6imJeYkJWefIeOlHVmhndojWp5fnlkbGNmbGJLZFhKa1k6UWVFUidLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYGBhXV1bVFBMSEQ9OkFCN01YWlpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola2zqrq5srOrqaKunqOyqZiSvbHDyL62qp7ArKyjoKesn7qjpK2srKaOlq2pkIyFlZasnqWqoZ+jo6CRjKSSp5mpmZajqqCWnKWlp6+6q6yam5KSe4SWjaWXjZGRmJONmJWnlJ6XqKKasKaeoqy6n7DBqKSzpqyxsquurKi5o664loqhqKW2nYmWopeGqZqQlJ2TqrOZm6OroLKWoqGdoKKcoKShlaumjJKSjIeSnJyUkJmTmJCNlYaBpJmXlY2Lk5KKj4aEfmeKf3SCdnSHjHGnbHuVkZSTgYGPj4+PnZSglZiWoIKHk4xwaI92cIp3dnx6amxkZG9jVWBYQGlbSGNhT1orRj0rJiE3NDAuHxwhJTIoKjY5OTQ2OTs+P0FCREZKS0tNUFBRV1RWWV5fYWNdXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqW1t66uorCkrZ+gtbGQjqvFvMS7uKqipZ2bpZ2wqaO2p52ptKankZisoouIiY6cp5arpKGZp56ek5Wjl6ibqZmUpqGjj5qnmaG1uqiqmJqQjXyBlIuhlIqUkZWQkJOXpY+emaifnLajnaest6iuwa6jt6evr7CtqqqzuaGvvZmSpqOmtqKSnaaejamfjZKfo6yvmqGjsaivl6SgnKOpnp6dnJernJKZoZuTkJaqmY2YmJaQlZ6RiKCdlZSFkoyQjJSKgH5mjIZ1hnZ5iINznGqGkZSUkYp9jJaSkpiToZOdlqCDh5eGeXGVcnmJf3F7f2puZF9waWBbYFltY1BgZFBbOkdHRD0yPT03LiomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9fXV5fYGFhYmFhYWBiYmJkYlxbY5eVpKejsLOsrqOpp62gqLWqkJCdpLO7r6ysoqOaep2isaSlsKiWm7imopSYqZyOhoqJm6KQrp6jlaefoZKXmJuui6uWj6iaqIyYqI+eubakpZibjYl5gZOMmpOKlJGTkI2RlqKMnZ6onp+4pH+Er7Wir691pL6jsqB4eqCrsruVd62kn4qAqn5kXGJ2n46knYOXfm6Ts5yjp66romWen5JzeZmXcICYqJdsf6KniWWcpZyRl5iWi5GbkYWdmpCVgpKHjo6SiYV3a4+HdoZxfIaAgGFpiIuVk4tbdpWRZ2iQjnJ7pZiYZHmYhoF3l2mDioJueX9rcGVgdm9ra2hbZmViYm9TWz5OTk5SRz1AVEI5MS8eHyY0OjMxNjY3ODw7PkBBQkZIQkdGSUtMU1RVWVxfaGZnV1FKPERHOzhVUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWablqajobCxrKuppaito6etpJKWq7Wvsaaaqqarl3OLnK+fqKqmlJa4oKCPnKOdkX6IiJudjauao5Wnop6Ol5GehXWukIimmqeRlqOIm7q0p6CZmIuJdHaTjZaTipSRkJSMj5OgjpqfppmcspaAjJy1nbOMko+8p6F+p6J6o6+3gY6Op5+Ei4WPsamvjImWopp5gYushpydoqepqIeVhph2pZt6h5uBl6aCgXucsXqKhaCXmZSYloGQlpaEmZljeYeQhI2PkoqDbXCPh3mAcYCBhX+GdIaElpJ4lmiTdKCadHyZg6Cchph+kYmBg5hqjYyFa3h7cXBnZHduaWxrW2VramVzW15JVExRQEU1LllUVTYpITA5PT42NDM1Njg7Oj0+PkBESD9JRUpLR1JYWllbYWFoZllRSDlFTDs+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonJijn6aurauorKCosKanqaWZlK7GvbChlqaotZ6Pg5yrnKahn42Qvp6ZjZ+aoJB9hY6Zl4irnaKWn6CRjZOJhoCRqI6Hopyjk5adhp+5sqedmpKOhXB1kImVkIqUj4+bi4+Rn5KWn6SWnqyIn7SJtJqtisqHqq6It4WNsIOxroOpjaaYjZ18qI9ye3ebjqaWaJWkebSLn56mqJKZwoF/q4iYoXGegJmkfZeFlbGAoXyhlKCQmJaAjpObipeRi3yFk4aNlZOJg21zkYV/enKGgYR8hHSFgpeBj8VmgKmHj6JrnoOhmYKZgIuMg4mYcI6ShWh3dHt2Z2h1cGdnbF5jb2xnbFhnR11RTDJFNDZNYGM3JjM8REdEOjY0NjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASmRZXWNmaGdiYmJiZGNgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLmwqqummpSgo6Sqo5akqbajr3+gp5ylnp2Jk7yZk42gkZ2QeYSWlpGHq5mbm5mhhY+Md5ucj6CRiJ6km5WYl4aiuK2lmZuMjH9ibY+Lk5CNkIyMl4uQkZ+Pk5+hmaGofqGnh62doJauj56dnZGGgaCNq6+GpI2qmoyafqJ2gJmTaoGrdU2reIeNnZGbqKeAqqt9g6F7eqdpnn+Sa2eXhpe2iZ59bmBkWYOWfox7ZGiKcpl9eZVsXXuXbV9TcIRcX2x5g2BZZYJ9hIGYcaeqa4OjbnKlcJ+Dnmlln2xbbYl7ZVlfg39iV1BvdmVtdHJqam9eam9tbGlYaU9dV0U5QTRHQ15rNCxJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deX2N2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGNkY2FiaWtkYmRkZ2RiZ2VhY2iYlp2guaGqo6askqG2vKuuopmXoKGlra2gnK21oqiSoJ+fppuZjpi0mZCKnoyVi3WBlJGNiqaWlZienn+ShYaspIeckYqYqJeZmpGHpbCmopWaiImAaG6Ih4uOjomLjZKLkJKijJOeoJyipX+TgY+joZSgd5yWj6eDoad/hqmthaV5in2Emn2icHKTh5V6nYx5bYecjJmQm6iaj4ece4Kic3amZp5+dqRfmHp9knOibpi3tLpzkoeBf7WoZIHGuHtwlbeLcYCbpGNzrKtgfWqds35ufYeDjoKLl3GAo2xzpHOeg3+kX52Zs5VwfJeetHRzW56yg2pib3N1cWhvWGtscnNmXGleYktEPUQ1UUFZcTM9U0dfSlI9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltaV2BgfGRIQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7iZq5yToI2kuLWuraCbopyjo6WunJuxrayTl6CYoKSZmpOeq5uLiJF4i4VwgJaNio+gkJOUnZd9kImOqKCHmI+KkaKTm5qMi6iopJ6PloeEfmt6hn99j42Di5CRiY+UoIKWnaCdoJ+LiXecmKKMoHKii4ipiJymkJaoq3+ujH16oJl6o5N4gHOWh4ycfZagh5uOmZumhqJkoXyIlpCbjWyeaJuNbpqZe4CKp31yaHOpgpyCc6pnlJpdm4V2hJ1oqmqAuGZcqHCBnGGVjF6ndnWJin+eaJp1h5OSmI5/n26akGynmVyofne7a36qW46EXbRnXG5xeXdraVtxanh5Yl9mWGJBUEVON1ZCUm40S1paX05aQ0AxNTE7OzdIPzpDR1Q/WVJZXT5EYl5WYFFhY31pRUI5TltdWGRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq2m6iJY5SbrLqysKydppycqJ+erpudsKirnZeimaGfmJaWoKOZhomMaoiAcXuXiIuWloSRlJiPeoqElqOdipSPhYudkZybiY+oo6CZi5GKgIBpgYZ5f5eMe4iOjoePlpp/k6KfoKKTmHJon4qfj4xwkoyBqYiZn6OooKh9sK2joriXdqOzoqN/iJR4nXqrmn+ijp2bl4iXcaF8hY2vtX1rmpGheH6YtKOjq6iEmXyafJyZfnOqWl1ve5aLeJ5iTH56eoVjeZdCTZ9ZompxfI5tgYmEmXWbeYeJsbN/f5uTp3WAnW1xfJRvmXJqpF2VdkhlY2BzcH19bmVgbGh2fGNkYVFeVl1UVkBZRVFnRFNXW2JYXklEPUI4P0I6SUU4TERXQVZRW1ZERmJcWmBLYG1+cUVDPFVfYlplalZnaG1vYmZmXmFhXF1eYWhiX2VkdmxeZWdmbGRmbGhoa2mTnYCxrpmEU1+gp7O5s7OpmqKMnKucnKmToaukoaiPnp2cmpmVmKGdloeGiXeFgW55lYWQmot8kZOWiHKAiZOgnHORkIGImJSfmoSOqJyalIqLinyDbIWFcYGhjHiFjYiHkpmVfJKkoZ+jiK6GfbWEjp6de6WWeamClp2QiqGdfadodm1+mXOgc3F8nYWYb5OCrn2kg6aemoGjb16oZ3WjY2+lYZzTkHx6mXhyc2OihZB+onKijnVrj7OLYIKYiXOqsqi8f3eDbX6+pqm0XpxufXGXb4FzonJdo2d0pmFopm2b1Jl8g5tvd3mXa5t6d5dzbamkZ2BleXB/g2tnZmRtdXhnYGJTW2VRUWFJV0lUX1dTW2VqXGRQRUNLTUpLQkpFOFA/UE1XU1hPUlJgZmVpUmN3eXdJRkVjXWRaZ2lUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxol5t/sKtUXEt+qa+xtLCzo5yYhZiooKCjjaSooJipiZmXmJOZkpKgmI6HhXtwfYRofY+ClJqBd5GNjolvf4aQk5Jsl5R9iJCRo5WDjqqZlJKKhYl5g3aHgG6Cn4Z3gJKGiJmil3mToqSan4mzoaK2i3qsp6SupXCpgZqQhYGcknykgKKZhphynoSira6Jl4t/jKSNloOuopR2tLW1yaFzlIqAn2Cdl6lteZWGn5p1oYd3oH6RloqAb0xmo5JwmodypHt5dGGDgmx+oGtxZGCccn90l2l7abO1tMamc5h+e51qm5urdYOabHR3l2maenSYcVBEfbNeanZreIdmamdidHRxblZeVFloT1JoSVVMWVJVXGdrblZnV01KQUpNS0hKTkFRSlBkY2ltZXRyc355e251iXt7VFBPbV1oW2tpUmpoaWxnbGZjZV9cXVxeaWJkaGt7X11kaGNqZm9tZWlsZaGcia+nhGY/lKGyq6+vtaKjj4CXqaKipYylp52cpYKZl5aNl5CPm5KOiIJ5anmGZYOMfpageXWPiIyBaYSFkoOMhZ2NeoyKlKWSg5eol4yQioGJeoB9i3hwkKGGeYGVh4mWoJZ/lKWonJaWhGdueJxsomR8caV3nJdwZ6eBl4x7pXqfloOXcp52gYmUlo+5bpCKomJ9maKViG1yaatqdaBsbqZgm2mLkGiWh5qVdaKAfZpgi4WMdW+IYmigZZ5+aZp1b2NmiIJucqJaX1tjoW5diYxve39zcmSlbXeiZGenaJhzi5huoW9TiI9voF9kp1SLXVSYbW1za3GBbXBoa3hza29SWFdWZllTbUlYT11IWGloc2pZa1ZRUkVWXExYUmFUaGped3V6fHB8fHKDe39ydo2AhHZeUXNhZ2JwZ1BqaGhrbG5nZGdfXV5dYGtjaml2dV1cY2ljampzbGZrbWOcpZmmemV0bYunrqSpsLGmn4uAl6ucnqWMoqGaoqKAlZiTjZqPipeQjot7h3GAiGiLi3uXmnN0in2Qe2SCh5WKipWZgnyIhZamj4Ghq5CFj4mCin2AgI9zaI+lhH2GlI2ImKCOiJKqp52JpniWnH6liZaMspiekIOvl5+leJaIeql0pY+Emm6kooyShIyDvG58pa+ChoaHk5acn3ylenGolKCWZ55+b6tjloqVkneobKmigYl1h4J3q5GmiGuRsGt2s4ypa4qGbm2fnpKVYX+ri6p2gH+Mpp93n32FpZWdoGmah3asZ56tjLdzd76NpJNZg6aNq2F1cnNve3RxYmp+bmhtU1ZbVWFhXGtNXFJdSV1tbXZgW3FZW2BaZ3Nlbm9xY3F0YHd6fnlyeYNzhH+Ae3uMgYKAdmJ4ZGNuc2RSbGdob2xyaWZpYV9eXGJrYm1sem9cXGJpYmxqd21nbG5ilaaqnYGAnqSWqaqdqKeuo5mJgpermp6kiZqlnamchIyajoackYWSjYuMdIZ6iIRvjIR9l5N0dIZykoJtf4uSh4aUj3x7gYWXpI1/paWOgY2JhJR1goeSb2yLqYCDi5SOiZyfiY2Tq6OgkIB1lJaIfoF5lK6jf4GbcY+GeJCMhH97cqaMcX19epeWm4SOeHt+foiUlZOKdpCYn6CDen2Ja4yFW3l4cXlwaG5+kolxf3SBj5OTcYWEgmWMf1+Bf4t3dXOUdW95bm6HbYSFXndpeI1mgYKGjqmbfnR8l2qJiHCAdnyFdm1sZoxzeXuYeIRbalh5j2hud3Jxb3d4b11shm5pZ1ZaYFdcZWtjVWFVX1FfcHd5bGp2ZWpranZ8cXJ0c2FvdWJze4F4dXmCdYCAf4B4i4WDfXttf2xkeW5eV25naHVreGppamRcYFpjamVscHVuWltia2RsbHluaGxvYY6Uuamni6GimqakmaScq6KghISXrJKdoImappqomIKBm4p+lpOHjomIjXKCfI99fo6EepePdHKDcJWFe32Ti4aGkIV4fn+GmKKMe6agi4WPkISVgoaOl3dyhaqGjpKckIienoiMm6igoKuDiY2Umn5+iZatqI+TppB4cJ2Rg3uSb36ohXB9lXFrcHyBn4t/ko6MaG1dg4uMm5uejnOVi4hxdGuCdnOAWXJuh5CBfX6LaV1pZHuFg4iAX2l4e5t7gouCdoGGgmh5i4drYXFyg3dfc4yCiZCnlYZmjI+DbneLhHCFjXlvZWZjeYN6lltcaWZudlt7eHd0bXNygmZcbYprbGJZWV5aWGxxW19gWl5dZnR9e3Rvc2Nra2p7fHJ7eHRkbXRnbHt+dnp8e3p6f39+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hranFybVdbZW5sZ3N6b2hqbWCMjKqxopCjoZqenpiemaiioX2CmK2Nn5SHm6KQpZV/e5eEfJKYiIiGhopyfICLdoWLgYSVinFvgHKYhoR+koSDhoqBeoCDi5qej4KmoIZ4jpeIlYuLnZeEg3qtgpGYmZSKnp2HiKGroKKio4uIkpuco5mWqqGnpqCSm4iXjnx4jo6Ep35/kpGSk5yxppuUnpCNspOYhKWMjJWbn4mQm4KIkYlrfI12d2WChZCKfImdhIeLj4iIgIWEkHd8eXWaoYiGip+LhZR/foyBgHZwdIaEf3iIh4uQppCEhY2Ig42QjHyHioiPgXZrgYN8eZlqcmhgc4pwfXp3dm93dIFdXm+GaG5fXlpcXVNocVVjW1xhbGh1e3xybnBka2ppf3tteH9xaW9wbGaAe3KCgHh/fYCEem2DjIZ8enh8fnqDeE5kdmtzbXB6ZGtlYmJgW3RmcGZycm1VXWx0bWh5enFnaWtljYidup+WoqGYlZmYlJmkoJ57f5mrjp6NhZ+cip6WfHiUgnuOmYmGhISGbXiAgHKBh36Ik4Rta356l4aEg5B/gIaEhnyHg42anJKGqZ6DcoqPhZKRi52RfY17qoONkpeVj5yXhoabp6Cimp2Gg5GamZmQmqagpp2dkJaBkYp3fIeOhKV7fI6QkYaYqaGdk5yPjaqOkYCejImTmp6Cjpd+ho2Cb3iFcXRgfoKPhnWLl4CDj4KGhH6Fg5RteXV0kqKLjIWahISNdICKfHxycnuIhHt5jI6Ek6ePhoSPgYSLiop3hYeJi3xua32Ae21obG1nXnl/aHx7dnR1dXt3XGBwfW51YGNaXV5RZm1TZVpdYWppdnp+cGtsZGtqZ4B/bHOAbGx0b3huhHluh4B2goB9hHZyg42Ifnt7fH97gopgaXtqdWhpgmRqY2BpXGR1aG9idW5sVGNxeWVwenpzZWltbYuKn7eaoaOfkpGWl4uan5+ee3idppCbioaklIuYmXh6jYV7iZGDjIKBgm18fnhzgIV9ipB8a2h9gZeIgYiOfH6GhId8j4CPmpuRiKacf3CLiouSh6ChioWMfKiRiI+Sl5OWk3iMo6Ghnpaaf4CQmpiTjJujoaSal5Gbfo6FeYCDj4eggH2MjI98l6SgoJKZkI+mjY+Bm5GJkpebfpKSfoaNgXV0gnB2YH1/jYZyipV8iItyjH+ChYaOaHdxeIyYko9/l36IinOCh3x8cHl7jIV6e5GNg5amk4uGkXyGh4eFdYKDiId6ZXJ7f3h6cGxqZl59c2h8dXVzfHKAal5gdHZweGRjWV9eUmtoVGRZX2FnanZ4gXFma2NsaGV/gGptfmhucWt9d4Z6a4uBc4GBfYF0doKNhn58e3+BfX+PanKDbnNpYYdobGJfcVZ0b21uYHhobVdqdHZjdXt7cmJqbnmJjZ+ykqWlnI6QmI+GnKCbnHx2pKCNl3+MooqImpZ4e4aHfoOJfoiCgH9xf3p0dYKFfomQeGdjfYaXioKKjXh9gIyDeZaAlZeVjJafmn1vi4GRk4amm4eMiYSmlYWSi5aXk5J2kZ6hoZiUl3p+jpiXjpabnaSdmZOUnHqQhoN4hJeNnX6BiY2Mc5einqGSmI6PooyLg5aYg5KWmX6YjXyIjYF2cX1temR/fIqFcIaTf5CCbIeCgX+JhGV1b3yHkpeNfZN4i4l8gId8e3F+eIqGeYWRiouYopWBhI13iYWDgnZ7gYmGdl94d31zfXdmbGRhfmlqd3N0dH1xfGJjYXNudXNtYVpgXltrZFJiV2BhaGt1eIZwYmpjbWVofINsaHRobG9of3yCeG2QhnGAg4N/c3yDjIF/fnqCg358kG12iHR0bWWKbGphY3VWhGlxbmB5Z2xianZwZnl8enFgcmyGhZCcrZemqJ6NjZeHhp+Tl5h9d6qciph5l5yLi5iPeXuAi318g3uAgoB4dHh6c32Ag3+Ii4BkXn2LlYd/hYd0fX2Jf32XhJaTloyjoJd+cod6k5GKp4+MjoqToJGDkZCUl5GLgY+YoJqSkJF0f42SlImdnZ6nmJeNlZZ0jo6KbIaYj5l6h4iQiW+XnZqjk5WKjZ+MhoGSnH+SkpWGmYh8iYmBenF5a3Vse32Lfm6FkoKUd2+Cg31+in9kcmp7gJaXhH+NdJCJg3mHfnV4gH2HgX2DjYWNlKSQeIWCdImHfYBzdYCHg25ge3V6cXxvYW5jZHtibm92cnd3c3Rhdl9vbHVub1xbX11eal5PXVdjYWhtc3qJa19pZWpjaHeHbWZsaGlsaIB8endukIdzgYOEfXOBhol6gn16gYR9fI5yeop4eG5sh2toX2lxY4docW9ld2hubGF5aGt9e3hwYXdti4GZmqqgpKidioqRhoqeipWXfXeumIyWfZ6TkZaTiHd9e4p8fIB2d3+AcHRzem+FfIGAin58YFx+j5GGf4OEc3p/hnqPkYeRkZuSpJuUgX2Ae42KkqSJjYqNmJqMhpGYk5aOiYmMk52TkIyNboOQjpGJnpmioZeWiZaRb4iahGeGmY6TeomFkIpwlZqUoZKSiIuZjIJ/kJ58ko+Si5mOe4qEh3RzdWtxbnV7i3RuhZCOknF0gHuBgYh8ZHFseX2ZlH2EiHSQi4F0iHlvgH6Bh3yFjImFjZWojXuIfX6LhXd+cG+AhYNjaHh0dW97Yl5wYGp0XnFqenh4bHJwZXhdbWxzbXNYWl5fYWpaUFdXZWNncXF/h2ZdaWhnYmdxjm9kaWdlamiAend0bo6FdIGBgnt1goiFd4V8eISFeoCJd3+Le3pyeYNqa19waHSAa3JvbXFnb2xlfGNugHl2cWx3d4p/opiiqKGmm4eMioGQnIaTnHSBqpSSjYagjJaTkH90e3aFd3h/cnN7hWtyb3ltinaAgIZucVtZfpGNiH+AgXZ1gH9/oIaPipGcl6CTl3eJfoCMiJ2eio+GkpiWhYmVmY+XjIuNjo2dio6Qg22Iio+RipyWoZuYlYWXiGqFo4Nnhp2KkX6Lg4uBd5OYkZ6RkIiJlY1/fo+XfJGNj42aknyKf4Judm9sbW5we4Vpc4OOl4pwd390gomCeGZzb3aBmY58iYR6lJF6d4h0cIl7ho17i4aEiY+co4h8hHeCi4B4eG5qgIKBXXJzcXBveFpecGBwal5vaXx5cG1tamx2YHBva3JtWVhhYWFuWFFTWmZnY3VwhIJiXWptZGJma5JtYGZmX2hqgXVxcnCLgHV/goB4dYCLgHiFf3eHhneDhHuGjH97dop/anFjfGKGfG9xbHRqaG9sdndfcX95e3R1dICCfqSVmq2fp5aFjIN/l5SDj591ip+UkoaKm4yVjYt5cnh0gXByhHNxdYhsb2x1bYh2g31/bW5VUYGrlIeCeIB2coJ5gaCBkYGSkpebkZp4kXqCjJKkmpOOiZWZkoSHl5mMlIyJj4+InoWQinxyioWJjoicmZ+blpR/lH9php2IZ4ahiJKEkYOJcYORl4+ajY+Mi4+Nd3uSkHqOi4yRlox8iHyAa3ZqbmtrbHp+YXl+jpWBdnqAd4ONfHhndGx0h5WLf4iGe5SQcXqEcHeMeoqNe4l+g4yRn52FfXx4gox9dnBpa4GCeV93b21rcXNWXW9icWBfbG55cGdwZmZzdGhxbGF3ZV1WZmFgclNQTlxmZV14cIh8XlxocmJiZWaSaV9oZFtncH5wa3Bzin12fIWAdHV/jHl7hoF4iIJzhoR+jIyDe3mVd2ZyaoNgiH5vb2t6YGpudH90X3R9eYZ4dHOFfHigj5mwnKWPgop/g5qIf4uef4qZk46EiJiOjo6EdnR2c4Bwb4VzcHGDb2tpdm2Cbn18bXRzUk6C38iS1pN8cHSCdYOfgpN3lJCYmo+Ye5NyhZCfoZOTkImSm5SGfpaViI2NiJGNiJyAjoF4eox+iIyJnJudm5WTeY12aImSh2yIo4WSh5eDhmOMkZiOlImWjI2Ki3F7lIl6jYiKkpGJeYV7fmx7ZXJvamt5eVuAeY+NgHp9fn+Gjnp5aHNrc4uPioKFhX2VjGx+f2+AjH+Mh32EeoKPlZqainx3eIOQeXNtZnB/g2xqdG9oaXNtU15vZHBZX2txd2ZramJmeHJwcGNfd2BgVmtfXXZPTktgZmNdeXGJdFxbZXZgYWVljmNhZmFYaXNzbmtxdox8dHmGgXV2fotzf4Z/e4l+comHgZCKiHx+mHZlc218ZYh+bnBrgFpsbnl5c2F2enuNdnJ3ind5n4ubrpugkIKFd4iVfnyJnIeFn5COhYyXhJOOh4F0d3B5cW6Eb21ufnJkZHhwfG16fWpobGOkmsHcru+hc2t1g3WEooWRbpWPlJ+Tm4GRcIWLo5eJjZWKkJ2Wg4CVkIWJj4CSioqXf4d7dX+Jd4aEjZuamJmOj3aKdm6GiYt9iqOEkYmdhYVei5SXio6IjouKhIlsfJaBfYiFiZCPhnaFfX1rfWR3dWpteHNXiHqRhoV6fn+AhYt+eGVzan+KjoqDgn+MloVrgnVuiJGCkYV/gnqAkZaTmZB1dHiIjXVzcWd1eYJidG1vYmh1Z1JgcWdrVV9udHlgcmNfaH1wcm5bY3JhYlduWVx3TU1MZGZhXnZzim1bXGR4XmBkZYVfY2JeWGpya25rcnaMfXN3hIF4d3uJcYOEfX6Ie3SLiIiVhox+fphzaHVxeW2Lem50cIFYcXp2eXFld3mGjGl2gIlyf5yHmKeco5KEfHCMlHh5i52EhaGNjnuVjX+Zh4R7cndwc2pvgWtpbHx0XmB4dntwdXtnYGV869q1ycPciHNsc4B2ipqIjWmXj46clJKBiHCFiKCOhYqVio2YlHyNk4iDiY97kYuGkIJ/dniDg3KHgpKblpSYhox2h39whYKJh5mig5SMnoOJYYOVj4aJhomNh4CHaX2Uf32DhImOjYJxhn5/cXdodXJpc3drWox9koGFfH+DgISKgnVhdGyIgY+Lgn5/kpF9boJseYaPhpOEfYF9gJKTkJeJb3J6jYZ1bHBrcniAX3NpblxqdmBSZHFoZlNfcHZ0YG9gXWiCcXNqV2doY2lYbVdbdUxKTGVnX2Jyc4VoW1xleV5eZGd7YGRfXFlrbmVvanN3in5zcoF+enZ6iHOFgnx/hnZ3ioaPmIKMgXuTdmx2dXl4k3RueHp9WHmFcYBvZ3l3koJkdoaFcYqWhZmhm6KKhnNvkotyd46cfYqaiIl7n3+DmX+BeHFzbm9kcn5oZmx3d1tfeXt6cXF/aWFnYX/Vto6QpnhucXd7cJKQjIdqmI2Im5GLhXtoh4uZhoGSkYaHmI18jY2BgYmNfJCMfoqFenV7gntwhoCVmY6SlIGIdYOGdoOAi5Odn4aVj59+iGF/k4eEiISJjX9/g2d9kH9+f4KLj5B+bYJ8gnRrbXZ0c3Z1a2ONgY5/hX58hH+Eh35wX3NxhHyPjYJ8f5KJenGDZnqDioeMg3yFfoCUj5GThG5weox/dW1uamx6fWJoamlYbHVaUmlyaWJRYnJ4bGFlXVpqg21zYltnX2VsX25UWm9OSE9nZVxnbnGAbFpbY3JfXGNrd2RlXVxabGxjbWpzdod/cW9/fHx0eIZ4hYJ9f4d1eYmBkpV8iIZ2iYFvd3l7hJNwbXuBd16Df3SBbWl7c5RzZ3KIfXKSkYOan5ughod2dpR+bXaTl32HkIOKjZp8i5p2fXZxb2xqYXR8Z2JpdXpaX3d8em1xfmVjaGhXnY9ecXKWvMODdXGUiJB+cpaLhpyTjIdyaoiPloB7lIyBhJuMfIqGfXyJjH+UiHWJhXZ3fYFxdYaBnpSFlI+DgnJ/iHWEfImYnZiHk46dgIhmfZOCf4WDiYlygX1nfot7eH5/h4uOfGmAfIN2ZW94eHJ2c2xqjYWKgYp/eIGAhIN/a15yeHp9jYqFe4KPgH5ygGl5g4eLhoR5hHyBmI2QjH1ubXuJfXd0bmhnfHZjXHBiV29yU1Nuc2hhTmZ0eGVgXVxYboBvc1llYV5qbmBwT1lrUURTZ2Faa25tfG5aW15sYlpjb3ZjZlxdYGxpY2xqc3aCg3Fufnt/dHWDe4OCfIGFdn6JgZaQeIOKdIGIcnh5fo2Qb298gXFpgXl6fm1tfHaVa2p3hHRslI2FnpigmYWIbn2Mdmp4mI5+gYqClZeKeY6Wb3pzcGxqZGB0e2hfZXF6WmByfXlncXphZWWPsbJ3SmJapNnQlnF7kIqQd32Ui4SZkYuFbmuFkpJ6eZKGgISYinyHf3h4iYqEloBvjIhxdH16aXiFg6WQhJOMg39vfoN2hHmFm5iTi5KQlIWHcHuSgn2Cg4mDboF4aICFeHJ/f4KKhntlfX6EdWNwcn9oeHBvdZiNhYKKe3Z4gIR5gWtccX1ygYiFiX2GiXqIcoFucYSHjoSFc4R5gZmNjoR4bm9/hH92emVoan1wX1l3WlhxbU5XcnNnYEtsdnRgXVtbWXR9cm9XZ11manFfbk5XaFE/WWdfW3BqZ3lxWlpZa2VZY3B5X2hcXmVtaGZsaXF3f4dvbH99gHVvgnt/gX6Cf3aBhYiXinGCjXF7hnx5eYOTjHVqen9rb350f31vcnx7lG9ugX94ZpKKgqGZnZGChmeHg29nepWJfn+FgZmKgXyNjGl4cmtsZl9hb3htX2JveFxka4J6YXF2X2Vl1Oq+ijI6PouOgHF5hYeOjXaDlox+ko2Mf21shY2Mdn2Pf4WBlYl8g3hudoeEg5d3b4iFa3V7dGV5goOni4OOi4R9bn90doN5hpyQjJCRkoyLhn57koZ3f4SNg2yAcml/fnhtfHuBioN3YnmEgXFkcWh+bXRxdIGaioB/hX5ydX2AcoFwW21+dHiKg4t7h4B8iHh6cWyIg4+Ei3KBeX+Xi4t/dG5rd4CAdXVcaWh3cFlXfFNacGVMWnJyZVtKcHduXFpaWV10fnVoWWJbZ2VuY2lMV2ZRPV5mXF11ZV90cFpZVG9kWWRxeVpoXl9nbWdqbGlwd32ObGmChH55boB8fYF/gnp1goGMk4VwgItueH6AenuIkol/aHt9anR7coZ7c3d9f4x5eIR9fGuMjIObnZaMgYBsjn5raH6OjHt+f4OUgn99iohrdXFnaGNbYmdybmBha3NhaHCJeWFzdF5jZJugj25cNVmvtXRpgIh8koZ2hZaFc46LiXZwbIWDh3V5iXiJfJKIen9zZ3aJfn6Yb3GGfmh2eW1leYiEpIaAh42Jfm5+dn+AfIyZh4KTkJiIi4SJfI+IcHt9hHtofm1rgHt6aXp2gYeBcmB3gX5xZHJmdYJtdHuFlJGBfIF/bnd5fHR+bVhvf3Z0jIKGd4h2gol6eHNuiYGPgYVyfn1+k4mJem5uam6CgnVuXWdmc3FRW3tOXHBcT1tycGRVS3N4aVdZWVphcYB0YF1dYGdkaGlmTlloTUBhZFtgdmFddW1YV1N0YVpkb3JXal5haGtnbWxpcHd8kmtohIl8fHB+fnuBgIJ6d4B/iouDcXuHb3F3g397iY2Pg2p+e253eXaKd314gIKHf4N+fnpthYyImKONhIN7dYt5a2yEiJF4fXuBkYCAfoqDcHJwY2ZeWWdfb3BgYGdwZmpvinRhdG9bYWRqdnt/vpymo8i4cYWDc5N8eIaTgnORjIhycm+De4N0dYd0iHeTiHl5cWN3h3qAk2lyhHZmd3VjanyDh52Bf3+Ojn1yfnOEeYCRkIJ4lo2Uj4iCiHuIiWt4eX51Z3poa395c2l6doCCfWhgd4d9amt0Z3t/aXaBjJCUfnp+fnB7dnt0fmJWd31yc4qEgnyDcYaKd3hwcIOCjX99eX59do6Gg3ZpcWltiIJycF1oY3NuSmV1TF5uVVRZc25iUU9zeGBSWFhdYnCCc1thXWhlZGNqZFFacElEZGFbY3BeXXdoVVdVd11bZW5oVmteYWpnZW9vaHB2epJuaYiMeX1ye354gYGBfHZ9hIiGg3B2g3Jud4KCfomLk39wgHt3eXqBjHSDeH+BgYKEeoB1b36Ji5qeiH2FeneGe2d0hYyQen9/e4mGhHaPgGdvbl9kXFhlWW1yYGBgcGxraIluYHNpWV5kbYB3qdqpx4aHsnGJeG+MdXuGjoB6k4mAdXR0fneAcHF/bYR0lIZ4dGtgeoJ5iI9mcYNvZ3ZtW219gJCTf4B5kpJ9eHtth3WAkIuEdJaKkY6HhYV7f4VsdHZ/bWd3ZW17dW1qdnd/f3xgYniGemh0dWJ9emd0hY6MlXt0f3VxgHp8bX9ZVnR+b3WEh3+AeWyIhnR4a3V/g4R9e314e3OLgX1zZ3RlbouEbXNbal91ZEhubkxbYldWVXhtYlBSdHZXUFVYXmFxhG9cYGNtZGNebmJUXHJHQmZfXWZoXlt7YlFVXHVbW2drYVZqX2BuZmZrcWhwdXiOdGuOjHV+dnh+d4GDgXtzfoSIh4NvcX90cXV+hYKJjYp7d394g3x8hYd4h3x9gX6EgHt+c3Z5i46fjYl6iXZ0g3lefYWZjHmGg3SFhoV3iXtibmxbYltbYVZqc2NgW2dub2aHcWFxZlddY2t/fMrOiLmiam1timxxhHF8hIl+e5GFenlzeXV1e2psdWOEdZGCd29mXn2CeouJZXKCa2pxY1hse4WbiIKBc5eUd357bohxgYqLh3GXjpCIhYuDe3l+cXFvfWZocWJteHFqa3F3fHx5XGV5gHdpdXhmgXZndIeLjZR8cYZpb36AeW58XVhyf210gIt8gm9viX9xdmh3f4F/gXd9cXp0h3x6cmZzYW6MgmxyWGtfd1tJbmtNVlVeVFV7a2FPVHVyUFFUVl5idIVoXGBsamZjWW5hWGJwR0FoXWBmX11We15PVmRwWVtqaF1XaGBfcmZraHJncHJ3hnhulYp0f3p4fnmCiIB1cn+HhY2CcHB7eHd1eYaGhouGenx/dYt+fYWEhId/fn59h398eHZ5d5GTn3+MfIttdoB5Y4OHl4ZzkotvhYWBeYJ0Y25qWV9bXV1UZ3NlYFlkcXFmgXNia2VXW2Bpf3e+rnugt21ic4Zoc3txeYKFe32Mf3d4cnZve3Zlam5gh3WOgXNqYl5+eHmLhGZxfmhqa1pWb3iJo4GEf3GZk3GAeHWCbYCCkYdzlYiMiISIhH14dHJuaHlgam1gbXZqZ2preXd6d1tnfXx4ZXJ9bYR0ZXWFjIaVf2+LZmt6g3VtdGJcb3xrdXyLfIFmdYd9bXFndX54fn9yfWt6eoF7eHBmbGJuiX5tbVZrYHdVSmprT1JOaE5ZfGhiTlV1akxQVFVfZ3aDZl1gcWhnYVdpXVtraEpFa1piZFdZVXlaTlZtalldbGVcWmVjXnRmbWRxZ3JvdYF3cJmFdn9+d398hYd9dXOCiX+Vgm5zeHp6c3OFh4iIhHmBfXaPf3yEiY6EgoR7fouDe3d8d3eanZd6ioOGaXd9fGyDhJOAco+CcYWCfoF/b2ZsZlddW1xbVGRwZF9XY3J1aXVwZWVjV1xcaH9wb3KAdIlkZHh+aXR1c3OChHiAhHl2c3Vua3pwYWdrZ4Z0jYNuZl1ffXB7iX5pbXdmaWRVVnJvjaZ8hHt2lpBze3N8em57e5CFdph8h4aDhoN8dHBybGd1XG1oX2x0ZGdmaXpve3JZZ4F3dWdwgHeBdWJ3hIp8lIBui2lteoFxZnNlYG16Z3N3inx+YnWDdmlrcXR6cXl5c31mfn9/eHduY2ZiboZ8bWtWamJwU0tpa09MTnBHXntmYU1VdGNKTlNXYWp2fmVcZ3NpZmBWY1dicF1MS2tYY2FVVFVzVkxYdWRaX2thXFtjZV93Zm1icGlzbnJ/dHSagXd/gHd/foaEen11goR+l4VucnR7enVxhIWPgYB6i3V0kH98gZSOgIWEfX6Mhnt+gHZ7o6WKeYiFhGx1fHt1g4KMem6Fc3mEfYGDdW5qaGVWXVtaWlNibmRbWGJze2lobWlgYldfWmmAamtvgGdrYWh5eGpzdHRthIF7f312dW17aGp5al9lbmiBdo+EZ2VYYndpfod7b2lvZ2ZdVVhvaI+od4F6fJCOeXVvfm9zdXmPgHeVdIWCf4WHdWpydmdobltsZF1scl9nYWl4aHttWm2CcnNpb4B+eXdgd4SEeI+Ecodxb3l/cmNxaFxvd2Rxc4h8eGJzgHBnanhzcmx4d3V3ZIN7f3d2b2RkY258fWtsVWliZlNLbWhPR1JrRWF4Z2FNU3FcSU1UWWVrd3tlXm1xaWRdVl9Vbm5XS1RoV2ZeWE5VbFRKXHlfW19rXV1aYmVgemhsYW9vdW5wd3V6mH13gIF6gH+Hhnp4eoN+gZOEcXR0fnp2dIWIkH2AfZBrc5WAe4KfhX+HfYB+hoKAint2hKyff3qIh4RscoJ6doCAgXVuh298f3OJgGpvbWRkWF9aWVpVYmpnXFpedYFpXm5sXGFWXFxrgWZxdH1paV1rdnVndHdxbIV7fX15dnJsemhpeGZdZHNoeneSgWNjVGVwZ4KFd3dmaGpgV1ZZZ2OPp25+d4CLjnpwcHxmeW96jHt2jnGEfX5/hm5kdXNkaGhca2Jdb29bZ19sdWR6aF10gG9ya3F7fXV1YXSFinqHhn9/d3J1f3VhcGxZcXRicXKFfHVkcn9sYWx6b2ppenh1cmaFdXp6dXBkYWRuc35pbFRpXl1US3NjUUdWYUdidmZhS1RvV0pMV1hna3Z6ZGVucWZjWlddWHZlVEpcY1doWFlJV2VRSGJ4Wl1fbFteXGFkXn9pamBvdHhtcG52g5h5coGAfH+Ii4Z+dXWGeYeLfXR1dYJ4enqCjI59foSIanOXgXqKnX1+hXqBen58hohzcY+ujHt7ho9+ZnKIenR8fHZyb4Zse31sj3picG9iZV1lVllZVmNma2BdXHOFaFhxblpeV1pcbHtjcHd2bGJbbHJzZ3R1cGyEeX6AeXdubnRlaXRlW2d1ZnZ2kXpfXVJlZmqCgnR9YmNpXFRYXWJjkKVoeHSChZB4bW55Z3htfIV7dYhygHh8eH9oZXZsYGZgXmpfXXNrWWVdb29iemVbd3trbm5wd3hzdGRyg5J+h4KIenVvcn1yYnhkW29wYXFxgnxzZnGAZF5udmlkZ3l6dG5vgXV0fXNxYl9mbm99ZGpTaFhZVE13X1FKWVlIYnRkYUlUbVNJTFpXaWxxe2JsbHNjYVpaW2F2W1NLZF5YaVNXR1lgTkdpdVheYW1bW19iYl2FaGhhbnh5bG9rdoGQeW2DfoCBkoiEgHZ0iXSMhnRyd3aBd3x9foyPgH6TfnB4loN8mZJ5gIB4eX1/dIiDc3CZont7f4iVeGR1iHlzeHVsdG9+bHl8cJFyXnBvYGdibFRbWldoY21mXFxxiGVScm5bWlhYYGx3Y2l1ampeWm1zcWxzc3NqhXx+f3x3bm5sZGlxY1tqcmR0do5zW1dTZGFygH9ygl1iY11TWmBbY5KfZXJxhYSRdGxqeWxvcHp8e3GAdn9yenl5ZGV1aF1iWmFnW153aFdiXW9oYXdgW3t2amlybndzc3RocIGUgoZ+g3VyanB8bWZ3V1xrbWJxc4F6c2Zvfltgb3FiX2pxfWxsdH5zcXhrcGFcZWxsemFnU2dVV1JQdltSUFlSSWNzYmBHVWpQSFBaVWtra3xlbW9xYVxaWFlscFdSUGZWV2lTVEZaXE9IcnRYX2NtY1hhYGFdi2pjZG15eGtvaXV5hntrg32AhJl8goR5fYhuj4Zxb3d6fHSCgnyLj4OCl3R3gpSFgZ+JdYCAgXN/gXCHgnVvopd0e4aLhntleItubntvZnhwemxzdnKMa150bmFnZWtSXVtWZ2JsbFpccYxkT29uXVZYVWdqdGdidGVlXVltdG1wdXV5aod8f3yId5BzZGRrbmFcbm1jc3iHa1pUVmJjeH19cYVdY19jVFpgWWOWlWNucIOFinNqaHpuZXN2c3xsenR1b3l+dV5mcmNbXlZiZFhhdWVVX2BtZGFxXV1+cGhpc3FzcHV1am2Ek4GIe4RxcmZufXByb1NbZmpmcXSBd3NibHZVYnFqW19uZXxlbXZ8c3Jzam1gWmRqandeZlRkVVZQVG1XUVdTUEhlcl9hRlhpTkhXVFZtaGR8aWt4a2JXXFVbdGRTUldoUVlmVFNIWlpQTXh3W19lbGlaYmBeXo9uYmZreXVub2h2dn9/bIOAfYaXe3+IgYl+a5OIcmd0gHt1gIN9iI5/jJNzfIqRhYefhnt/hoxzgIZzfYN2bqWMc4GNi3Z3bXqMYGR8cGZ6c3lsbXF2gmdke2xjZmdoU15eVGdgbG9bXm6NaE5qbWBUVlNvZ3NrZXdkZV1Yb3Rscnp3cmyIe4B2nHt6a2FlbG1eYG9qZXB4fmdaVlhga3h8e3CEX2JeZ1ZYX1dknIhia3GBh313a2t4bFt2cWx6aXVzbm97gHJYam5fWV1VYWNXZHFjU15haWFibFpgfmxma3N1bm13dmtohYx/iHqHbXBmcHxtcm1jWWFoaW90gXRyXmlsUmVxZFRibmJ6Y3F2e3VrcG1rX1hhZ2h0XGVWYVZTTlhlUk9cT09IZXBdY0ZZaU1JX0tYbWRfeGhufmRgVV5UXXRbVFJgZk5dYVRTSlxZUFl1dl1fZm1oWGNhW16OcGNnandxc25ndnR6g3KBg3qIjX58ioeOeW6QinRsc4J0f3+IhYaRhJWPeX6Mj4iRm4SAfIyEc3+Bc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY2NjY2Njo6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkpOTk5KTk5KSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjYyMjYyNjY2NjY2Ojo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJFtZmdnZ2dnfYWEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJOpa+tra2usH9rbm5ubm9qZmdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMkWdfYGBgX155g4KCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1M0GptrS0tLS3fGVoZ2dnaGNfX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRjo2NjY2NjY+QkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho+QkJCQkJGLioqKiomKiYiIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GSkpKSko2QkpGJh46KkJKTkIqRjo2RiI+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIuLjIyMjI2NjY2NjY2NjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOh4mHhomFiJCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI+GiIaFhYWHj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCQj4mGhYeEhoiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhoiGhoiDio+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2JjoyLjomOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt7fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSkpKTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh6fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dXZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWZmZ2dnaGhnbWdqZ2hlaGdjYmJhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYWNfXF9dYF1eWl5dWVleYmFeXlpZX1tYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NUUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHN1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9QUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhISklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRUA+Ojs+PjxFRD0/RUE/QEFAREVHR0dHQkREREZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozw8PEhMPT1BQT9CQz1BRERGQ0ZGREZJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR1c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw5ODo8PD49Ozs6ODpAQEFCP0FAQ0ZEQ0NDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VycXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OTo6Nzg6OTo7Ozg3ODk7Ojg8PD1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/QD09O0tlQD09Pj08PDw7Ozo7PD49Pj9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT89PkA/PT89a3hUPUNFPz5APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRkQ/PDw9QE1MRkh3dVk3PDo9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5+fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJASW5QOz1kgYJ+dXp2Uzc4ODo8Pj8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQz9Xe3lSZYSDg4OEfHhSPD0/PUJGQUQ/Ozw9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQFl0d3uCgYGDfICDe0w/QEM/SlI9TUc8PD1BRUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x7fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUE/UnVzfoB7gIR7foZiQENDRT5PW0xtaElAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtMSUdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVGa3V+f3mChIWFhn1KREZEQmN+hYiJflhHSEpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkddeH+Cg4SEhoaHjWpBQlZ0hYeHh4eHgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTExYf4SFhYCDhoeJfVNthIeGhoaHh4eHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJSklJSEhJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSl6EhIWEf4GDhoaEgoaFhISGhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkBBQ0NCQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpJaoaFhYKAg4GCgoOEhIWFhoeIiIiJiYyOZkRDPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzU4ODs7Oz1AOzk5OT08Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlnhoWCf4CDhIOCgoOEhomKi4yLiomKi4yJXj83NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3NTc4OTc5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQmqEgYCBgoODg4ODhYmKiomJioqKiouJiYqCSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo5Ojo6Ozg5ODk3Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3FydHR1d3l7e3t8fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7QjlBe4SAgoOEhISEhIaJioqIh4iIiIqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw8OTk8ODo6Ozo5OTk8Pzw9QUJESUpNS0lLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/PVCDgoGChIWEhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QUNFRUFBQUI+QEJAQD49Pj5APz8/QD9APT0/Qj9BQT9BPz1AQEA+P0E9Pjw7Ojs5OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCWYWCgoSFhIWEhomJiIiGhoaHiImKi4uKioqLiYtePkRHSUtKSUZHR0RGSEdFQkBAQ0VDQ0FCQ0I/QERIRUNFREVFQUZFRkRFRkRAQj88QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBEREVehoKDhIWGhoaIiYmIh4aGhoeJioqLjI2MjIuKiohXSExNTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT9CQ0hISl2GgoOFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpPTU5MTE1LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDs8PTo/QD5AQENGSkpRY4KDhYSFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpISEVKSURKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VucHV3d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo8OD0+Oz1BPj9ARUlLTVZyg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMi4uLi19RUVBNTk1LSkdGQkdKR0xKRktPTEtKSk1NTE9QTkhJS0xPUVFRUU9PSklKSkxKTEZHSEdFR0lGRUVCQEJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FITE1RV3mFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdVUVJUUk9MS0pERUZLT05PV1ZRUE9RU1JNU1RPTVNMUFNVV1JTUVBMSk1NTUtOR0dKRkZISkRERUVCRENjcHV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JDR1ZORk9RUVVZfIaDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZVa2FFUlFRUEo7O1FTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUVBNUlBQUFFLS0tISEpIRUZJSElISWlydnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+U0hKSUlHR0ZFPz9BQUVCQ0dFREVMWFJNVFZWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uGbFtkVTpYWFhTUD5AVlVZW2NgVllicl5dVl1aVkVRWVpbWV9UWWdSVVZYVFRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p6ent6enx9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUlZWVFpadINZVX2QYVxYXV5XSVZdXVtbX1lIWVhZW11YWFlXUlFOUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSUZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxYU1ZUV1JRV1ViloBRZXJYWldfaFBgZltbWFxnYUdPWmhnXFtcXV1XUk9TUFBRVlZWVllabnJ0d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBVWFRSVFJRUUxPTEtmeVpdVFlVVl1aTFRaVFNUXlpYV1dXemtYWltcXlRRUVBJTk9XVlhaWmRxc3Z2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVVFJPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtNTktNS0hKREZIRUM+U2NVf1JRUU5LUlRRTU9ZUU1OUVNVVU1RU1JQT01MSENJSFJUVVpcbXJ1dnVzc3d7ent7e317fX19fn19fX59fn9/f4B/f399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZQTElMSWFsknRQUVNOUVJRUltSU1JRUlVVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDP0NDQ0NCP0RQQkNAQz5CSEdWQEhOTUddaVFIRk9GREVGSEdIQkNIR0hLR0NCQURAT1BNU2RzdHV1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJbWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPz87Oz5APz8/PmtRSmFFRkhJRUI/R0xNR01RVUlCRT8+PD08PT0/PT9BQ0M/Pjw9Qj5KTUZVbnV1dXN0dnh7fHp9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVJaXFleSUpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9e3h6fHx4d3hkQkBAQj06QkNBQURCXF1Pe05PT05LTE1PT1FMS0xXTUhHQEI8OTc3NTk5PTs7Ozg5ODk/O0JIP1x0dHV2dXZ3eXx8fH18fH19fn58fX19fX9/f39/fn9/f314dXZ6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5gZWBdXnF2a15gZ2t3b29sam9ubmxmYlhHRkZIQkFGSUVFRkRNUlBhV1JYUVBTU1JVW09PUVdQTUpDRj46OjY0ODY5Nzk6MzY2Nzk1PEI9ZXR0dnd3eXl7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUxUVFNRUVVPTFJTVFdYVFRYUUxYWVpWWFhWWFldV1dYaHNrXVZhc2thYV9dZGBfXllVUE1PTkxISEpLSUhGQ1FQU1pXVFRNUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU5OUducnV4eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RVVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RVV1RbZkpMUFJST01NTk5OTEpGUFBVWVNUTkpPT1RTVFxWUlVTUk9NS0lISEY/Pz06Nzg3NjU5OTY3NjY1V3Bwc3h5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ2dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0pIT1BPT01SSk9QUFBOTk9UTE1JUE9TVFUyPFhNSUFRPWNhUVNRUE5QUVBOTk1QTlRSUFJNSUxLT1FQUVJTVFFST0xNS0xMSENCQT06Ojg3NjtCNDU2NjtlcHF1eHh7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUJGR0dIRkpESEpIR0VITEhLSEZMTVBNRy9FX1I+M0A+am9hUlJRQEZVUVBRUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PDw5PUc2Njc2RG5xdHZ6e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hFRkhKTktFR0NPUkM4RU5TXWZTUVNBR1VQT1FRUE1NTkxKTEtMTk9PUU1PT01ITExJS0tMS0dGRkVEPEFBPjtARTs8ODlUcXN1eXt7e318fHt5fXt6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPT01RU0xUVVRXV1VMTEtIPTk4Nzs/QD48PUFAQj0+RUhHREZGSUdKSkBGQUFARkhFSk9IUFJhXFFQUk5TT09PTExPTUtNTE1PTltXS01RT0dJSENJSkxMSkZGRkQ/QkM+PEJGP0I/QWRxdXh7ent7fHt6end8eHl+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPjs/QkBAPkFESUVDSEdJR0lFQkI/Pj1DQkFHSURNT2FlUU1PTldLTE1LTE1NTExLTk5TZE1KTFJJSUlFQUhKTE1OSkdJRkJBQkA/RUZFSERLb3B3enl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9IS0U/Qj05OTk6P0I/PEBCQkFERUdLRkRJSUdHSENDP0I/P0BBPkNFQ0tNUVRMSklNVEZJSUpMSktLSUlMTU9QUlBLR0NLR0NCSkpMTU9NSUpJR0NDQ0RJSk1MSVpzbXh5eHp7e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG10dXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FqcWhlcUhLREdISEdKS0lKS0RHQj0+PTo6OjtAQj89QkJDQ0dGSkxKRUlJRkdHQ0M7QUBCPkBAQ0VDSU1PR0hLRkhLREhJS01ISkxISEpMSk1dUklIRE1GQURLSk5NUE5LTUpLRkdHSk1OUU5MY25pdnZ3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRvRktERkVHREVFRkVHQkNAPjw9Ojs6OkBEQD5CQ0RFSUZKSkxGSUlHRkZEQjtCQ0M+P0NDQ0VHTE5HS05IREhESUxOTUhJTEdFRklJTE5LSkhFTkhDR01MT01PTU5OTUxJSEpPUlFSTlJmZ2Zyb3N4dXt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSkRGRkVCQkJFQERCPj8+Ojs7PTo9PkNBP0FDRUdKR0lJTEhHR0dGRUNAPUVFQj5BQ0NDRUdISUdNUElGRkZLTk9LRkhKRkVERElJSEtJRkhQS0RJTUxQTU9OT09OSkpJTVJVVFJPV2RgYW1ncHJvcnl6Z2VoaGNpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0JBQkQ9QkE+QT06Oj0/Oz4+QEI/QEJER0pGSkdJSEZGR0VDQkFBRkZDQkNCREVER0dIRkxRS0lPSkpMS0lHSEVGRURDSUhIS0pHS1JNQ05PTVFPT09OT09LS0tQVVdWVVRYYF5caWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3FyamtzTUdHRkhCQkFERDxBQUBDPDg5PT45Pzw/Qj9AQERGSEVIRkZHRkVFRENFQ0RJRkNGRUJFR0VFRkdFSk1LSFFNSktISElFRkhIRUNJSUpLTUtPU05EUVJQUVFOT01OUE1MTlNXVldYVlhdWl1kYGhiamlna19lZWdjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpb3pNSEdISEJCQkZFPEBCQkQ8Nzo9Pjo+OkBCPj8/Q0VGREZEREdFQ0VDREVGR0pFRUlHQ0dIRkhGRUNGSkpHTUpMS0lKTEZJSUtIRUtLTE1OT1JUT0lTVVRRU1BRTU5RTk1RV1pWWllWWl1aWGFgYGBeaGVjYGRlaGdqaWhqZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3RucHJzeU5ISEdJREFDSEU8QEVCRT04Oj4+PTw8QUI8Pz5BQkZDRUJCR0RDRUVGR0dHSUZHS0hDSEhHSUdGREhLSUdLSE1LSktMSExLTUtJTkxPTk9SVVZPS1VWVFFUUVJMT1FQT1RZWllcWllbXl9eYGJdXGFja2JgZGdocoVoZ2lmam1ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxdnF1TUlLSEpFQkVHRTxAR0NEQDk8PkA/Pj9DQjxAPkFBRkNFRENIREZER0VISEZIR0lLSkZKSEhLSEZGTEhISEpHTExMTExJTUtOTU1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXF5fX2FgYWRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J2b3ZKS0xJTEdCRURFPEBGRERCOz8/QUBAQERBP0I/QUNIQkVERkdFSUVGRElIRklISkxISEpKSUxKRkpLSElKSkdLS01NSkpNTE5OTlBLT1BSVVhWTU5UVlVTUlFQTE5UU1JXW15eX11dYF9hYWFgYmNlYWNoYmRpamd2i2xraWdtb3NxcHFwcHJ5dnJ1dXRzbW1zc21xcm90dXRycHN3dHV1d3Z1dXRlcXNrcHFqcnZvd0pNTExMR0RDQUQ8P0VFRUM9QUFDQkJDRUJCREFBRUdDSEdIR0VKRkNHSUdHSkZJTEhKSk1LTUxHS0lITEtOUUtSUUxTTUtOTk9QUE9UT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmBiXmBlYWFiZ25oYmloaG14dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnFxdXZ1c3d5d3V0dWNtdGtvcGpxdG93TE1MS0xHRUFARD4+REVGQ0BDQUVEREZDQ0VHQ0JJRkNISkpISUtGREtKR0hKSUlLR0pKTktOTElMSEpNS1pmSmRcS2xTSE9OX25Va3NbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZbbHRgbGpUYHd1aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FycXlLTkpLSkZDP0BCPz1ERUZEQ0RCRUVFRkJGRkhDREpFRUpMTEpMTUdHTUlISUtIS0pJS0pOTE1NTExJTE1MW3NiZHBebG1VTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xvdWdwTUpyeXZrYmBrZWVteW1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QkI/PUNGR0JGQ0VERUVEQ0hIR0RFS0dHTE1NS01NR0pOSEpLSklMSkpKS0xNTk5NTUpNTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtb3ZcWWxRXG1tWnFta29teHh0c2lwXF9ya3FqVXV5eHBjXmtmYmdxcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbm5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHR0VFRUJCQj0/QEZHQkdESUVFREJGSUhIRUdLSkdNTU5MTU5ITE1JTEtISk1JS0pKSk9QT05NS05NTFxoZHVdbHFXbE5QUW1VWmtea2x2YWxkdFRlY05tWWxcdHBraWx4and1aHBdXnJraFdiY3d8b2NgZ2hhZGp1eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHdJTUdJREVFQ0FCPEJBQkZER0ZMSEVDQ0hLSEhGSkxMRk1LTFNSTEdNTEhOSklITkhKSklITk9NTkxKTU1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210Xm5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZ2Jiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dEhLSElCRUVFQUA+Q0NCR0NISU1JRkNGSkxJR0ZKTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTE1NTUlLSktTa2JaaV5famNyclpfWWpvX2VlVWtfY1thYlFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSURFREZBQEFFRERHQkhKTEhGREdLTElFRkpPTElPSUxbUUpGSEhLTUlISkpLS0lISUdLS0tLRkhKSkxMTEtJS0xOVFtcVFBUTFBPTk9PVlFPT1FPT1FKSU5QUWRxaVRZV1tbXFVZW11YXVxcY2ZhYWZiY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNIQ0VHRkZBRUM/Q0dDRUdDSUtMSEZER0tMSERHSFBLTE9LTFdMSUVFSElKSElLSUxKSEZIR0pHR0lFRkxISUtOTElPXFdeT1xbYF5PWFlTXFxiXk1ZWk1YYVJKWWFaU2BkXGFYW2RkVlZYXFlaWFxWWVxdYl9kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJESURHR0ZLSktIRUVKSkpHRUhIUEpMTUpNU0lIRUFIRkpJS0tJTEpJRkVKR0RGR0VFSkdDSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5eXF5TW15jXlpdYGNgWV9iW2BeW1RYWFleXWNjYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUlERktLS0ZFSElOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlEQ0NFQUZKREBKS0lPW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1BaX2FhXV5jYWBiYmJjY2VaUVlWVVxZXmRgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGREdFQkVHSEZHSElGR0pHSEZIS0lMRERLSk5NTExISkpISkc/R0ZOSktLTUtLS0lHR0NEQERBSElBP0lKR09dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5QT1xfYWNjY2NiXGRjYmRjZlhRVVRTW1haYV5eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRUtJRkZHSEdHSUZGRklMSk5FREtKTE5KTElLSkhJR0JISFFNS0tPTEtLSUhHRUQ/RUJISEFBR0ZEVF1ZXlhfWV9bXVVYWFBdXVFLSldeWF5bXVZaYFJRX19iYmBgYmJgY2JiZGRiWE9RUVJbU1teXV1dXl9fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIQ1JLRkhISEVGS0pNUEVHSUpLTkxMSUxLSUlHREhLUU9NTFBMTUtLSElDREFFQ0hHQkFGRUJWVUVcVF1TVl9YTlRVTlpbTUpLVWBhW19YX15hXU9ZYl1gYF9iY2JdYmJXX19UUE5QUVhSXVxbXFxeYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERUZHRElSYlBEV19JR0dIREZNSlBQRUpJSktOTEtLTEtKSkdFSk1RUU5PUE1OTE5IS0FEQUNERkRDQURGQUxIQ0xMUE9PTEZNRkdJSkhHTExNT1BJTE9QUFNQTFBUU1VaWVdZWFhkVk9TVFBQT05QVVRcWVlaXVxgYWRlY2hja2xwc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01dTEdIWU1HSEpIR05MUVFJS0pLS05OVU5PS0tMR0dLUFNTTlBPTk5OT0hLRWBFRF9MRGZjRE1bSF5cc21PTVZtWUxDUGBVbFdnSl1XVV5ETFFVTE1UVlFTVFhXVFhVVFxUUGZaaGhkWFNrVFdWVVtcW2BgYWJiYmBmaGZubGhyenx9foGEhISEg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1NJS0dgVEhKT0pJT01SUUtMS0xPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpQf1FJfFlZcnNXUG1IcW5wYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVtgVlVXf2p0dXVfYHdgWGFcXGZbX2FhYWFeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMRkpMRlJWTEtPSUtSWFdRTk5OTFFUTk9RUEtMT0dNUFNbWlRRUk9QUFBKSFp4XVR4ZWhZUlRRdmd0bHBibmZqUXJPTXdtanJwc3JxcnBvcIFdZXp1eHFxenF+c31rdX1iUmd8ZXNzb3NzfH1vfXlvf3JfYGBiYlpgYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyAdXx/fHxzc05LRmBdR0FFTU1IS0pISlBOTU1KTlZeWVVMUVNOWVlMU1NSTkxQSVFSVFlXV1FUUFBQUUtHZnhsY3hybVpKTFV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXc1Foem1panp6fWx4en9vZ29YdnZqdXVwgGBzaHxpbHh8b15fX2NiW11iZGdpamRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdXpufH15eHJuTUpTdE5DQkVQUEhKS0pMUE9PUE1QWmBaWEtUV1BhXlJWUVlTTVBJU1RWWFdXUFVQT05SSktyb3V1cXVxZGhgVm5McXBeRmh5V3ZUS2h4fXhgeXtzbmFebW9kUmdydW5teXB3bHZ0dHFsbVx0fnprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZWVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRyb21LS1tWSEdFR1JQSkxNS0xRUVFRUFFXXFlVTlZZVWZYUlJZXlRNTklUVFdXWVdPU05OTlFIUm1IaXdLYGR2dlVXbE9ubHtzYWpnf3ZVS1draH1sbWx4YFtwenteYHpzY3JveHFoZXxpcntdVEtsYHZ1a2l1e3ttfnhrfHBdXl5iW15iZGRnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3Nya2hsbXJ8a21oa3t0bW1rbU9ISktISUlIUlBMTk9NTFRTU09UUldSVlRQV1pWVlRUVGFgUU9OS1RUU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWFFOUFVUWFhYW1tVUlNXW1dYV1pPU1VXV1hSXVlXXVZUT1lSV1dXWFlfW2dyXltbWVxdX2NaX2NjZGZkY2NiWmNjZmZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tob3poZ2drdWpoZ2lsUUlLTExNS0pTUU1RUE9MVlZUUFRVWFVZVVJaXVZVVFdVWVhQT0xNVlRRTlVTTk9NTFFQS0pRUktRTUtLT1JUUlFRU1NJSExOT1FSUVFRVFZSWFdcV1NTUVFVVVZTWlFPU1JXVVRZVlRZVVNSVVNUVFdYV11aXmFdXFpaXFxgY1xdYmNkZ2VkZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRjZmhQSktMT09MTVRQTlNRUU1YV1VUVVdXV1pWVFxgVldWWVVYVFFQS09XU1BOVVBOUU5LU1BNT1VUTlFOTU5RU1BUUVNUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdXV1lbVE9UVVhVVFlVV1lUUlJXVVVXW1laX11VWF9dXl1cXWFhXltiYmNoZmVkYlhfYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl1dY2hrYWdmaGZkYGJjYVBLTUxQUUxPVE9PU1FPUVpZWFdYWlpYWVZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBQTk1RUVBSWFRRUU9NT1NVT1dSVFVVT05NUVNVVVRUUlRYVlpdXFpWVlFSV1hWW1tXUVRWVlVWWFRXV1RSUlhWVVpdWV1fXlZeXV5gXFxgYF9fWmJiZGhoZWRhWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRkYmRfX2BcUE1OTlJRTVJST1NUUVBVXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTFBTUlVaVVRQUExQV1ZSV1NTU1hNT1BSVFhVVVVTVVlYW15dXFtWUk9VVlZbXFdRVFdVV1hVU1haVFNRWldWXF5aX19gVWFcYGFdYGJfXGBdY2FjZ2hkZmBZY2BhX19lZV9gY1taXFtcWlpZWVdcWVxbYF5gW15eYWBfYlxZYFpRTk9OVlFQVFJPVVRTUFdcXFxYXlxfV1xeanF3eYBjXFtWVlhSTk9XU05RUVBSVFJLUVRTWFpXVU9STlNYVlRTVFJSWk9RU1NWW1ZWV1RWWlhdXlxcXlZTTlRVVlxcVlJUVlZYWVJTWVxUUlJcV1pdXl1hYWBXYltjYl5hY19cYmFiX2RmaWRmXltkYGFgYWNlX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQW11eXVtgXGBVXF1panJ9c2xnXFVZV1FPUltTUlFUUlRVVEtSVlVbWVpTT1NSVlZVU09WUlNaUlRVVFhcV1hYU1hcWF5dWVpdVFVOVldXXltYUVRVWFhYVFZYW1RTVl1ZXV1gXWJjXllgW2ViX2RkXl5jY2FdZWZpZGZdXmRhYGFhY2RfYl5YWl9bXFtYWFhYV1taXGBdW1tcW1haW15WXlldUE9PUlpQWlVVVlZUVFReXmBeXmJcYFVdXmJreXRsfWxaVVpVUVFTXFRUVFVUVllXTFJaVl1bXFJPVVNYV1ZTUFhSU1dTVlZVW11YW1lVWl5YX15ZXFlSV1JZWFlfWlpTVFZaWVpWV1lcVlVaXVxeYWFfZGRdXl1dZWFiZmReXmRjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWldWXVpdXlpZW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9gYWFgY11gVV1eYmVldYF6aFhZWlRWU1ZcWFdXVlZXXVhQVVxZXl1dVFJYUldWVFJUWFJTVlRZWFldXlhdW1VeX1hfX1hdVlFZVFlaWmFZXFVWWFtaWlhZWVpYVl1eX15jYmFlZV1iXGBmYmRmZF9fZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOU1pWU1xUVldZV1ZcYGFiY2FkX19WW2BkYV96dW9oWVxaVlhVV1taWVtZWFlgV1BVXltgYVxUVVhQVVZVU1ZWUlNVV1taXF9eWl9cVl9fWl1eWV5WU1lXWVpdYlpeVldbXFtcW1tZW1lZXl9gYGRiY2VlYmRaYmZjZ2ZlXmFiYGNeY2NpZGRnX2deYmJjYWFgXl9YVFpaWltbWFtYWFxbWltXV1lYV1xbXGBdVl1dU1BWWlZWWlVYVlhXWF1fYmFkYWRhXllZYWRiYGxmaF5cXVtXWFhZXFxcX1tZW2JWVFdeXWFjXFJWWFFXVlZWVlZUVlRYXFxfYGBdYF1XYV5bXlxbXlhWWFhbWl9gXF9YWV1cXV1eXFpcWFtfYV5gZGNkZmZmYlljZWVoZ2ReY2BfZWNdZmlkZWlfZ15jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJNUldZVldaWFtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX1xcXVhXW1tdXV9fXFpdY1haWF1gY2RfUlhZUFhXWFhYV1ZYVl1dXmBhYV9iXllhXV1eWV1eWVhWV1tbYF9dX1lZXl1eXmFcW1pZXF9iX2JkY2VmZWZiWmRmZ2lnY19jXmFmZFppaWJmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWFdaW1pZV1hWVVtdXV1gYGJieEtXV1xZV1xcXF1aV1xdX2BiZGJiYV1gWGJjYmBjYWJeXFxcWFdbXV9dYF9dW2BkXFxYWmNlY2BSXFlPWFdZW1pZWFpZYF1gYmJgYWNfXGJdX11bXl5aWVVYXV1fYF9fW1peXmBiY1xcV1tdYGJhY2VkZ2VlZmRcZWZoaWZjYWJcY2dgXGlpYmhpZmVgYmFjYV9gX11dXFlcWVhXWFlYV1xbWldXWE9YWl1hY2Zmcmt/SllXXVpaX1xcXltYXVteX2FjYmFhXWJbYmRhX2NjYl1cW1pXWGlxYFxgX11cYWNfXllZY2VkYVNfWlFZV1xdXFtaW1tjYGNiY2BiZGFgY15gXF1eX1pYVltfXVxhYV9dW2BhYmViX11TXF9gY2RkZmRnZmVmZV5lZmhoZ2RkYFtmZ15haGhjaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnV1dXV1dXV2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7enp6e3t7e3t7e3p6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dXR1dXV1dHV2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7enp6e3p6enp6enp6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgYKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHjF1NLS0tLUk3t9fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYiNsbW0tLSzs7u+vr6+vr3K09LS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19eNXn5OTk5OeZe39/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMi5G7wL/AwL+/yczMzMzMy9vm5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12fn9/f39/f3l3d3d3d3d4eXl5enp6eG9vcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYCBgYGBgICBgoKCgoKChISEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ0dHR0dHd0dnd6e3h7eHd2eHt3enp5fXp5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7enp6enp5enl5eXl5eXp6enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHt8fXt9fHh3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8fH19fX59eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3d3p8fXt9fnx4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6fXx8fHt+e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl7eHp6eXx4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG9ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7e3l4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx7fnx9fn5+fn59fX9/f3x8fYCDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgIB/fn+BgICAf4CBgX9+f4CBf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn6Af3+AgH9/f35/f35+fn59fn9/fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn9+fn9/f39+f39+fn5/gIB/gIF/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYKBgYCAf39/gICAf3+AgX9/f3+AgYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKEhIKCgoeDg4KAgoGBgoKCg4KDg4KDg4ODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBgIGDgYKFhYWFhoaHhoWGhoeIh4eGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4KDhYSCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Rko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChIODg4OCg4SFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKHgoGCgoKBgYGCgYKCg4GBgICAfoGAgICAgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoGBhpqIgH+AgIB/gIKBgIGCg4OAf39/gICAgICAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKBg4SCgoKBgYWOnYyDgoSCgX+AgoGCgoGChIOBgYCBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoaFhIOBfn18gJOdjYOFhIOHhYGAgYKDgoKEg4OCgYGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEhIODgYGCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4CFlIuFfnx9fX57jZ+LgYKBgYuLf4aEgoKCgYKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYyIhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/foael4d9f4B+i4WAkYSBg4F/j5KBk4uAgYKBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTko2NioeDg4OEgYGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAhJygiIGMgn2GhX2ChIOEgoGUmIKJiICCgoODgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBlJ+FhIiEh4GAfn6FhYWEhY6FfX19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5OSkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOIkIGCgYKFf39+fYKHhoOAfn5/f39/f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODgoCAgImEf359f4WBf3+AgH9/f36AgISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KRkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOBgICDjYaDgH5+gH9/f4CAgIB/f4B/f4WFhoiIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEg4CAgYWEgoOCgYGCgYGBgX9/gH9/fnt6gYuMiYqKiYmIiImJiYmKi4qIiIiJiYuLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5COioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgIGEhYSCgoKCgoKCgH9+fX19fX9+fHp8j4yJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYODhYSDhIOCgoKDgX59fn5+fn5+fX1+fX1+g4eJioqHh4WGh4eHh4iHh4mGiIaIh4aJiYODhIOFhISFhYaIh4aFg4KCg4WHhoeGhoOCgoOEgoODhIKBgoGBgYODhIODkZKRjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaFgIGEg4ODg4OCgoF9fH1/gH9+fn59fH19fHl8g4aGh4SDgYODhIWFhYODhYSEhISEhIWEgoKDgYSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gX9/goODg4ODgoJ/fX1/gICBf31+fn19fX17enp+hISEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4SAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+foCDg4OCg4KDgn19fn+AgIGAfn19fX1+fXx6enp/goKBf39/f35/f4B+fYB/foCAgX+AgIF/f4CAgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4ODgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn19foCAf31/fn1+gIODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6eXqAgIB+f35+fn1+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9+f4B/hZKSj46Pi4uHiYWEhIKCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn9/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXuAgH9/f39+fn5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+fn18fH2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2BgICAgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19e3p6eXl5eYCCgoKEg4CCg4F/gYCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKDgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYOCg4OCg4OCgoKCg4OCgpKQi4iJh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoaHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOFhIODhIOFhISIko6MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4ODgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYGEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+fn6Agnx8f3+CgIKAfnx7ioJ9gH9+gYCAgIKBgoCAgYGAf4uUj4yLjY6NiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJGMjI2OjoqFhoaFhISFg4OCgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYyNjo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31/f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/f4B/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH18f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6Eko2MjI+Ni4qGhIaEhIODg4OCgoKDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+Af36Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoWChIOCf4B+f4KCgn9/goJ/gIqPjIyLjYyLiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+Af4GBgH99gH9/fn9+fn5/f3yCfn59fX16fH19fHp8fH6AgoGAgIB8fH18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBgoGFhoWFhoaHhYGEkY6Mi4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f3+Af3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9/fn5+fnx8fHx8fHt+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmKiYqJhYiRjYuIiYeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX19fX18fX19fX1+fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6ChYiHiIqLi4uJjZGOjYmIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGSjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImOkI2LiIiFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4mCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI6NioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent9fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX18fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYGCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgICCgX+AgYSBfn6Af35+gH59fn6AgH+Bfn+Af39/f398f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8e3x8e3t7fHt8fHx9fIqKiIiFhYWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBgoJ/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHp8e3x9iYaGhYWHhYWFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWDg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goR/g4KCgoOChIKBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4CDgX+Ag4J/f4B/gX+Af3x7e3p8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBf4GCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fH9+f4B8f399fYGAgH59fYB/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/goCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX5+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF9gIB+gH1+fX5/gICAf35/f3x+f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5+f4CAgIB/gYKBgH9+gIF+f4CCgoCBg4KEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX+AgIB/f39/fIB/f4GAgYCAf3yAf31+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn1/gX5+gIKBf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEhIOChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgX97gH6AgH+BgYB/fYB+fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Dfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cnmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf4CBgHyAf4B+f4GAf39+gX9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36ChIKCg4WFgoJ+fXx7e3x8eXd8eXd4d3d4e3t7e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXJweHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH9/f31+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx7enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+fn+Bf4B/gIJ/gIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+BgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e3x9e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDf3+CgYSDg4SBgYOAgoOBgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9/gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhIR/gIOBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgH+CgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9f3p5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYOBgIGAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChYaEgoODg4SBhISAg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fX18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgIOFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISBhIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KEg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDg4SEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhIWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhYWCh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgH2BdYF5g39/f36EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf319fn5+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIWEgYOEhYOEhYOKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYSCaHpyc3N8gHKBg3+Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hnKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ptfXJzdnN2bW53bHB5bHV9f399foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gYB/e399fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoWFhIWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhIaHhoWFhYWHhoiFhYaFh4eFhoSGhomIhYSJi4iGhIaFhYWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG16eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXp9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWDhoaGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fnt8fH1/fnx8fn2Af31/gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGh4eIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWFhYOGhoWGhYWGhoWEhIWFg4SHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fX9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGh4aGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoSBhISFhoWFhISEg4SFhIaGhoWGhIaFhoaFhYaGhYSDhISDg4eDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoWFh4WFh4WGhYeFhIOEg4OEh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH57fHx7fHx8fXt7e318e358e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eIiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaIhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXt7e3p7fHx8e3t7fnt7fXt6e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOGhYOBg4KAg4WCg36BgYF/g4F/fn5/fX98fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYB8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIaGhoaFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWFgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOEhYWDhYWBgIODf35/gH9/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5enp8eXp6e3t7fHp7e3t7fX59fYB9fXx8fYB/fXyGg4aGhoaGg4SDhoKFgYGAf3+AgH5/gIJ8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYWHhoWEhoeFh4WGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhIODhIOFhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9foN9fn59fX57fnt7enl7enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf35/gnx/fn19fHx8e3t6enp6eXt6enp5eXp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXU1dTU1NXU1NTU1NTT0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8rKy8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19vb29vb29vb29vb29vb3Nzc29zb29vb3Nvb29va09LT09PT09TU1NTU1NXW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSPjIyMjIyMjIyMjIyMjYiBgoGBgYGBgYGBgYF/j9PS0tLS0tLT09PS09PS3ePi4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uzr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWlVWVlZWVlZWVlZWVldOQ0NDQ0NERENDQ0REQFzS09LS0tLS0tLS0tLS0ODs6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pjs9Qj84PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzR0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSlnl9ZWlpaWlpaWlpaWlpbU0hISEhISEhISEhISERg0dPS0tLS0tLS0tLS0tDf6+rq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183N0NLS0tLS0tLS0dHR0dDc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqqNoZGVlZWVlZWVlZGRlZV1TVFRUVFRVVFRUVFVRa9LT0tLS0tLS0tLS0tLS3unp6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc7Ozs7Ozs7Ozc3Nzc3Nzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs/Ozs7Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMzMzMzMy8vLy8vLy8vLysvMy83U1NTV1dXV1dXW1dbW1tjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7Q1NLPz8/R08/P0tTV1NDPz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfX1tfX19fX1tbW1tbW1tfX19fX19fX19fX2NjX1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7Pypal0c/SuJ/R0ZyChIrGz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Pz5yqna3VspeYuLqVuLmvodLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD9BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MuUiJqdzJ2jqLHRkn1+r7DSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RvciZmcLFiJu21dPNnp7D0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9KXlJ/L16WbtdTTwKCg0M/Q0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9Ozm8SY1NWimrXU1K+iqdTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDRzo2QnsLXopm11NOjobrU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0cvaqJmv2qKattTOnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmOpZqetNmjmrXXw5+h0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2Lirocq7oaannMvXopu02bKkptbS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT056QjbbW1bKExta5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHSusTV0tLRxNXR0cLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz8+PkFFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tXU0tLS09XT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PD05Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg6ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5NzY4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn5+fn5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojs8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD87OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foKGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtBPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5qbm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZybm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2enp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJmXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OkY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWcmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVVYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKkqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqqmmo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqaepqKOnppmcpKaioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnrKmkn6Kgoqahpq6mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Nec19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+qqq2oqKuwqaiqqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk+PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2r7Owq7GysaKfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqikoZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKamJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbWh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLG0tba8vL68vL7Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGwsO5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQ0REOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbWhxeG95amlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsPEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOxvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcndzeWZnXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPDwcS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1s7/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamddam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIycjIycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytp6q7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHHwcvLyMbMys3FxsXDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW90Yl1iVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDk+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHCw7+/vsTLyMrLyby61dbJzMjDyMnJxcXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWdkamVham1ub15ZXFZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O5uLm8vcHHwca5ysqcwcbDwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t73Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZ2NbWlpcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tri0tLW/u73Aub66urTAuLW3sq66u7bAudqbfrzCvsC8u8S+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u766tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb2+y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKeho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xY2BiYmdqZ2ZpZWldVlZUWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS1sbC1t7W7wbi+ub+8vLe0t6+ut7W4vcnKg4Slx7rDtbrHuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaGioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cW1lZWZvaWVraFhYTktLS1JJTEhDOT04PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw5Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3t7m3uru6u7/RqXt/ibq/x7e5uK23tbi6tLizu8XGy8G8xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmJ2epJyWnKOcnqGcppZ+f4d8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSvsLa5sr2+u8S2t7emmKemp7bEyIx5foW5yc/CwLiutbW8vri6sr7ExMrFwcrDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWZsaW50bnhjZ2JbY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9APTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8qqqjsLrR07S7vrzFurSObmhwY2t5n6x7e4KFu9HRzMrEtbrAw8i/vrW/wb/Gxr/LxsO/wbzAw8zKx8XGwLm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYGFOSE0/RUA/REM8Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ8QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbPEssbZvL27x62OeGNiak5SWmB+eX+FibzKzMvNysbCxMvOwry5vbm5wMO/yMbEwcG/xcDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tby4vWl3vc6/uK9vWWJkU2xnU1FRW3N9hI+7w8fLyMHDwcDJysLAu7qwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrKvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSknp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem5zeHNncF1bXlxZUUVEQ01JQUU9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7wcB0aX2rvrZwVkpWaklagXdzVFBmfIWavL2/xsC5wLy+xcS9vbmysK64t7/Dx8PDvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fXZsdXpwbmlbX19ZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQ0JBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucm/endpf6mXVk9Kd3RNUWx5g3tQVIKJobe4t8K6s7u3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20sayjqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2ZdWlRKPD8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trjIwIN+c3GTbE9IXIloT09Pga59XUt4pKixsre+ubK1sry5vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnFsX2NhW11PSEE+PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3xLuMg3t4fmFJYIxqXlFPXoGujl5QTnu2trC2urW0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJtY11mWFxdUk5NQT5JQkFKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLrBm4yFiX5TTYieeGpaVmxedYdub3qlvLaxtLWytK+su7q4trrAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzvKqQjZaaTFWKvWR7golnYntqYm12oL64srSzsLGtsLm4tr64u7+ysrKusa65r6qrrayjqKGdnp6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7KwpJqknUxgfo95bHl9Y2Fqa3R5bYKkt7Kts6+urK62trO8ta+qpJ6bnJyeqKieoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moq6ufpqKbo5yVkIyPj5CTkJeVlpifnp6amKaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HUE1MQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpKyptL+zs29hhW9paVdjXV5TVFljYVxxe6K2qrK0rqqrr7Cyta2lnpKYlI+YoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqqxo6WonqCclZOQj5GQmJCWlZiXn5ibmZqjmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUpIR09STUpORzxFQD0yPzc1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGooabDw5BVdW5mb2ZXW1FIRUdJTEtOYWV7s6+vs7WqpqyropyZlI6RlpeZmZygoqKcnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWalpuXl5ihnpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeXlgYlJVYElJSktTVElSUEw5P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZ6du7KDfWFfbWFUSEZRS0lESUdFSlVZXKWysLC4rKahnJ2alJeampCOkZWRjI6OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrG0qrKvopmcnZ6hmZubmpiZm5SWm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVtTWllNUUpOT1VMU0xBNz5CNjg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySm6KbnqOnoX9naF9UR0lWfX5oU0dDQkZMUFOKsa6sr6efnqKgl5GTm6CcmZeSk5+coaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuK2ytKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCeo6GgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUlVIRlVWSkJMRz1LSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpiem6GhoY93altRSkZMcaCnoGxORUJAP0JUg6Crqqmkn5+ZkpKTmJiWlpWMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6eopaSfnaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQldOSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqcpKB5Z1xSTUtKUo3Z2cCPdWRWSURTkayoramqpZ+enqGinZ+dmpyclJOVlJ6emJSFnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGw7zDvLezqbOtqrO0r7Ouqq+jnauntrGtorCmoaOvsa2wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cmtrdXJwaFdbUUVUSERKUEk/RUE0Rkg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+fmqCeblZOTE5NVmeh0Lugl7imkImYrriup6OjoaCepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DDvsfGwrfDycnCwca+urS6urS7t7C1sqq6sq67t7+7uqq3rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtjaG94amRaW0ZLTEVEU0xEQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hop2clWBORkpMVmt+p7iqhozU1sa/t6ifmpybnp6Zl5eXkoyOl5eTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXFzNDS1c7Tyb3Av8O7xsXIxdHUzdPQ09PMysLGxsfKyM6/yNHMx8XHxcG8w8G+v761vrOuv7/Cw8fEx8Suv7iyuLzDwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJRENANTU1ODpCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo5+cnpRcSkJITGh5qbihkH+xy7uvqaKenJ+amJaUkpSWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19HX0tXW09PIzMfMzcnSzc7TzcXIycrBxsvHyMnGv8Ozs8jEy8rLz8bKv76/vcHHxMzMyMm/w7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkA8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEE/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaCibEpKTFV1os3Su6Gks6qjnJycoKSgnZqUlJWUiXx3cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NbW1tLWzdTW19TT0dPU1NPP0sPQ09bY1dbSy8nO0cvGzdLK0tbW2dXX09bYztLKz9HMztDM0s+/yMfKw8zMzM7PxcbHtr/Kv9HNy8/Gyci/w8PIzszP0M/NysfNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZHJiXVJcSUpHQUVIST47QTg9NDU4NTs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaChrIFlcnaQs9Hb0b2vqZmVmKCcmqCgnpucmZWJd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M7P1dTU0dHM0M3T19bT1dDP0tPRydPRyNDY19jR2NLX2dXWzM/Pys3Sy87QwMbCx8XOzdHR0cjMzcDKzMXTzsvOyMTKx8bIzMrT09HVz9LM08G5xbGlqLWup5uorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltXlZQX0pKQ0ZDUk0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52mrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqihpaGCipK00tLVwq2moJeWmJqbnJ+dmJydk31xZWNjX19hX19hYF9gYF9gZm5wcG5rb3J3d5zMwdLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cXR1MrQ1NXWztLQ2NjY18vIzsTJz8zKzMDJv8fJzc7Py9DNzszOz8jL0NDKzsrCycfJzMrL0dLM09HRz9DKvci5sK67uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVdFO0A9MzM8PTg3ODY1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcCwqaytqaeBbIiHwNXMsJublpSXm56en5yUlpiUiGteXl5hZGJgYGFhYGBhXl9fXl1ibXJvb3J0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8fOzc3UzM7TzcvX1tDM0dTLzNDS08rO0dXS1dXKv8nBxczCyMnCzMPFyMrKz8rNzNDN08vGyM/NyMfLxcbBxcrMzc/RxtDOzc3Mz8XHwbi5vcPDvcO5s7K+sbvDxLWqmKWimZaRlZWSi5SNmpGUlI+PlIKJhXlwcWttZ2BgcGhYWGhWTEZMSVBQQjtDPjs2Nzo4OTo1Nz09QDs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCta+0qKCsamh+k9bQqpWOjZiWkZOSkZaWlpCLfGVhYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0sjLzs3G0dLQzszUysfLzs/Hx8/Sy9HPxbrEv8bJvcLHyc7FwsjAx83IxMzKy8/IxMTQyMbCxsjEvsDHzMvLzsLLy8jHy9DExci7x8PJyMLPwb28v7DByce5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3b3Rka2BeZnBhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68us3NxtDV1dna29jQyc/P0dPIwra7u62lpV9td6rUqpCOjpeQh4SEhIJ+hYV/c2BbXl5eYF5gY2RjX11dXl9gYF9bWlxga3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMrJyMrIwcXMxsjLzcnEwsvJwcLM0MXMyL+5wbvGx76/xs/Lw7/Du8nHyLvIxsXKwL3Cy8bFxL7GvLzAw8XMxcW7wMrCxcfSxcHJv8rJxsjG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Glm6Ogm5R7dnN0ZmlaYW5sWltYUkRMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76yspVecHe4tI+Lk5eHe4GFhoB2eHVycF9bW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKxtrqysrOyscK8vLy6uMHBwsW+vbm9v7nEysXGwr3GwLi7xMm/wsm7t7u6xcO/vMHNw8a9vbXBvcO6vca7wrqzvMXEwcK2v7a1vb+7zMO8tbrIur++y8TBxsLGycbIxtDGwszHssfJw87NwcXDwL2zt7Cyp6ioubClrbCqrayUeXZ3amRnYGhvY1ZeWUpGSkZISkFFQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0crKysfNzc7RyNDG1dTW183Kz8XJxcfBucW9q6+GYHODsJKMiYuFeYGHh4B+hHx0dGNbXF1eYGBiY2JiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tbe0s7O0vLa9sbewta+yu8K8wcS8v7q1s7q+wLjHubS7tsHCvLi9xsHDu7Wusra6v7TEt7u1q7i9vcC9sbq2r7a6s8W8t667v7W3tMW8vsPFwMPFxsjLxcDGxrvIy7/PysfDxsLDt8O9vba5vse/rLW6tbe2jnl0eGZnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMrIysnKxNDN0s/NxcfBxcC+urjJtamxhmhzk56MhomKe3l+hoZ3eIJ9dGleXV1dX2BfYGRhX2RlY19fXFteXF1eWltbXV9scG1oZmptbnJ8pMe/uLi1sKusp56iqqeeq62zraqsqbSvt7Cyqa6mrLK8urbDubq6sau1ubu0wrqwwLG+vLu2u8e5wratqqiwssC2uL2wsKeys7W7vKuutaWuta67srCpubCtu667uLvAwL25wr/Hw8XBvMbCyMu4xcfFv8bDw7rExsK7xsnMy7O5wry7s4hzdnZraWFibGhZV1dbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxc/HzsHDxr/ExMPDysHJyr6/vMC6srS0w66pr4lrY4mTiI6QfHh+ioV6e4SBd25eXVxdXV9gX19kYmFjY2JgX11bW1paXVpaWlpcZW5vaGZnaWtucoGtubC1rqalp6eaoKWhmpylq66kqKKsqqyqsKOmn6qttbaxvbmvt6+prri0tLy4tLyvuLm1srvBssCupamiq7Gys6i9qquoq6yttLOmqK2hpK+psqanqK6mqLessbK3urq7sry9vr7Ev7XCwcfIt7/AxbfEwr+7v8TCvsTIzMq/vsTAwKmHc3RyamldYW9kV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcu+u8m2vcO+usm3wcPBtLW7tbCutLutqKiKY2eLhIiLgHt+gH54dH98c3dlX11cXF5fYF5fY2NhYmBgX11dXFpYWltbWVhaXF9ma2ZlZ2Vpa29yhaqlrKWgnKKllJ6km5iSoaOqpKKfpqWopa2gnZylpqyyr7a3p7CrqKq0q7S6sba1rra5sq+6urG2pKCkn6axp6uouaqkpqeop7KtoKemn5ukpqyen6ejoKGxra2ssrSztLC1vLa7wcGyur7DwbK5ucOzwL2/tbi7vb68wsfEwsO+wMSgg3hwa2FmX2tvYFRZXkhOZ09USEVKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItLW9uLrAur21oJ6VnaGmurars7O7s8TPyMvCxri3x8HMv7jJt7vFuLPEuLO+wKu1u7GrpK6yrKCijWF7h4aGgXx5dXRvbWtqanFpXmBdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+Inamgl5aboZabopiWjZ6ho6ebn6CkpqKonpuim5+rsKyxtqOpqqqsrKS0ua23sKyzta6yta6wqp+dn6SisqSmqbitoqamn6isq5mfoJ6ZnZ+lmpmjnJudr6mrp6qsrK2xsrivuLm7sLa7u7qrs7O6s720trGxtbS/tr3AvcPBu7u9l4N7c2tfZV5kZFhUV11JV1xLUEdJSUZBPD8/QDs/PDA0NTM2Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8TDz765x7i3vreywbSxu7uruLmwoZ6oqqaXnollg4WGf3hybnBua2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXWFhYWFpeYmRlZWZmaGlrco2nnZSVlZuYm6KWlpGcoqKonZudpaaippygoJuZrq6trrKgpaKuq6eitbGysqyor7KnurOmtaCinpujoa2joqq1qqKjpp2mpqOWmZ6XmZudoJqXnZ2dnK2hq6ekpKatq7O0qrWws6uyubSvqq+ysrO3s66prK6yuLC6trq9v7ezsZSFeXVlXmVeW1lWU1pVS1tRS0lFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7KdpaSYpbHCtba9rbS4wszIxr/FtsG/x863wMS9s7m5sr+2sbi6rLG0rZ6Zo6ifkpp9aICDhH94b3F0cWlmZGhlY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2opyUlJCVl5egl5mVmKCeoZyWoaKppJ+fqZ2cmqunr7Cqm6OkuKqhoK6otqqmp62wpLiwpLegopuZmaqmoZqsuLCioaScop+fk5ShlJaWm5iXlpeclZ+qnqqkop2jqqqwrqi0q6qnrbKwpauus7GwsK6vpqensq6xtLC8tLm3rqOUgXl1ZF5hVllXU1JUS01eTE9LR0dMTEU8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uL2unaeoo6q7wL3Aua60uMHMx8XCw73Ft8jMssHCwa28u7S7vLS4ua+ur6ibmKCnk5CKdHuAfHdxaWxydHBpaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiY2RmaoGWk5WMkpSUm5mdlpacoJyglqGgp6akpqefnZ+moKqvpp+ipLeooaGiqLSipailsKWwrau0nqCdlZWpoaKUrbGxn6KjnZ6Ym5OLoZSRk5iYkpeXmJeep5ynoaKZo6Wlq6SlsKelo6urraaprq+uq6iqqbOlpqyvtLGvvLWxr66gknp2cmRhXFpdWE5MUkhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G4rJ6lp623u7zBxbqxubXEycnAw8bGx7bGxLPCv8Wqt7e9tr26urWyq6ymmJeeoouIcn2IfnZuY2JmaWhmaGpnam1gXVxbWlpaWlxdXFtcXl9cWllbWVlZW1dVWFdVVFZVU1RSVWBgX2BhX2BhY2RpgZSTiZGPlJOUnZSVl6SZoJedoaairaakpKOjopyqq6WZn6WxqqChnaWrnaehnq2sqamtrKGiopWYo5uckKupsJufop+el5mTiZ6RjZKTlpCYmJOcoaOdpKCilaCipKabo6uloqSqpKuupa6yqaalpqa0pqmorbO1tLm6r6msnotycG9gW1dWVVJHUE9IWltPUklUS1NMRUZJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi0xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1yb2xvsTJrLG4wbW7wLu0s6ippJSZmpuIfnCHg3t0aWlpbGdqa21ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXl5fX19iZG2OkISRh5CRj5mTlZOcm6Ocm6GpqauorKeopqSZpa6klJmlr6mfm5mboJ6umZyrs6Clpp+io6GVk5uWlpKpqq2anKChoJqUkIyZjoyRjJGNlpWQnaGgo5ybo5WboKOhl6Koo6Koq6Crr6Ott6Wjo6Ksraqoq6+zt7O+tbOrr5iEdHNoW1hYU1VRRVhMUVtYTVROUExQUUlOSUI8Pz9BPzw2NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MC0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraiztq6pp6+um6moq7e2rLvKu7a/rMvGxbjBzs/Is8S7t7vDyLGtuL+3vL26srOjp56UlpeVhnhzgHZ3bm1obW5tcGdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXVxeX2Bkfo2Bi3+MkIqSjZeRl5mioJugq6qmrqyor6Spmp+soJWWpKinnZeQj5qerpaYqKqZn52UpaCekpCSkZOVp6ulmpmZnp6VjYyLk4aJjYOPi5KVkaCeoaOXlZ+VmqGinpSbpaWnqKigsbCmsbynn6OstKuup7C1sLm1wLGtsauQfXJzYlZTVk5SSUZWUFJRTExXTUpMTlJHTUpBQ0ZEQz5ANjU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ymsbeqpqKwq52qp6mysaW2xrS5urPKxbm6wcvQy7G2uLy+wcOxsLK3rbSzurKxoaGam5eWkoJ+dmtnbG5xbnFqcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlYXFxdYWqAen92iY2HkIqXiZSUmJuZnqmboKqmpaudqJqhpZuTj5+jm5eXhYSSm6OPlKOdlpaWiKKbm5OLjoqQmqSnnJWVl5uRkYeUjouBi42AkIqSkpKgmp+ilZSYmZWippmNmaSmqKahn7SyqLK3oZyit6yqraSysqa1vLWsq7GjiXhzbV1OUVFMT0NNTk5QS0ZOTkpKTk1RSU1KQUdMSEdDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKiktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLaxpaejqaWgqKWls6qissO1tbKzxsa3usPKzMazrLq9tLfAr62psJ6mrbmuq52YmZyUkoV6gW1fX2ZycHZxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFlYW11hb3N2cYWIgoiAkYSPi5SRlJ6hj5uco6GjmKWXopyVjYeYmoxzjYN+jZeWhpGZkJSOjnuZj5yMgol/ipifo56Qk5iWhY2ClH5+dIqOepCHk5CQnZqZmpGVkJ2OoqOOiZqgoaSkm6K0r6yvrJ+YpbimprGhsa6csLyqqa+qmYJ3c2NWTVJPUE1DU05MUU1CUFFISU5STUhKSkNKTEZLSzw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3i3oaO0qaalqKOmpaamprOnprTBuLC0sMnEt7nBzsW+s6y6wautw62ooqaSnaa1q6GcjpSVkY58dn1lV1ZfZ2ZpZ2huY2poZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVV1lbXWlscm1/hXx0TlhykIOXho6dl4uUkJ+YnZWUlpWPlomAk4lfO1dvfIuUiYCMkYyQhoZzioWWgXmBeoWUnZSDlY6RkIOGfZN4cXCFjX2JgZGNj5eamJOKj4mciJ+YiIeWnpqhoJenr6mtqKiflq2zoqaumayrmKi0oqmto5N9cm5gW05TUlZMRFRKUE1MRk5PSUVMUU1LT0pJTU9GSUk8NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKCsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6moo6qwqKe0wbmxtbDHwrezvc+/ua+utcKnqsWpo52Yg5SbrqCYlYWTjoqGe3J0XFFMUlVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbXBpe4J0UEJAf5WRkX2JlI2Eio2bjZaViZKIhpWGeYh/YEpRbniKkYR9hI2KhX9/bn5/lHd1dXeEjZlwUY2IioZ7fniUdmh3hoh9iomVi42RkpaLhIqIlYSajIKEkpuWnp2UpKOoqaWknpuwqqGkpJGmqpaiqpyipqiJdG1nXltIUVFSTUlVTVNJTEtPSUhGSk5MTVRLUVBPRklDPDc2ODo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs3Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7abo6edn6Kvoaeopaeor6yqtby2uLezwbu2p7nIuLaoqLW2qrK8pp6Vjn+Jk6eVlIl9jYOBfHZvbVhNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4eBfIWMk4GSmYuPe4aPgHZ/eHNudXB0jY6Ben6Kq4V5emh2e45wcm14gYuNknh6gHuBdnJykndndYSEhIR7lYmIioyLgH+Ei4yAlIN8gY+YlZyVkZ+dqZ6foJ2gqaWfnZiNp6SToZ+Wnp6kgHJoYVxdSlZPUkdKWFJPSkxNUkpKSkxQSUxRTFJUTEVIQTw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumaOimJyftKmvqaWsq7Cxqr20sru4trq0sZ+3urKqnZ2sqaiyr6GakY2UgI2bjZB+doV3e3VvbmhYS0hISEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedYN8eGZ3jZeYjY99aHmBdniAiY99hJiSgXGHj3x3e29rfq19c5CLf3uGkoF9f3RmdnyGbG9oc3yJjIiAbHlxfXBtdY9xaXGAfo5wQ4uEgoOFf3d3eouFfYx7dX6Oko+YipKam6OWmZ2anZ6inZaNi6Wbj56XjpaYj3dvbWViWlhXVFFKU1VUT1BOUFZLTktOT0pRTkhOT0tFQzw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNTExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagpq+srquoqbGvsau8uKy7vrmzrKebsKesm4+WnKWppKCXmY6EknmIjYqJdXB7bXRwaWxpV0tGR0VBQENESUxMTVFSUFFTVFRUVVZXV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWN8eG98eYiQen2Lhm9tjJJ5dHhqaoCCcZaRi4F+loBJk5huaHd+gmxpY2x5hZCShmtzbHxucnuGaW1wf3ONiYSGen1+e3ZvdHOFgnmBeHB8joyKlIOWl5iakJKVl5mXnpeMg4mfkYuSjYaQln9uaW5vblhVV1RSUVlPUlRUU1hVTU5ITktNTktDSE5HRT87OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WtsKKsqqi1r66stL+rvMK/pqKZlaSXnY2Ei5ShoZiYkZOLc456f4WLhXRudGtwbGRralhORUZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcYKeIYpppdHplf3Btf3qLiXaBiIZ0bJqSdHN8amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3GAfGdxcXtuk42Pe3N9fHFwbnVtgn94eXVqeYmCiIqElpOSkIuNkZSUj5eOgHmIl4iGioaAkIh2ampvaGVYUVpXWVlbTVBVVllYTklIRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDU3NzU0NzhpTzg7NW6SiJqRmZakqK6esp+nu6+rsrDCsbvDx5qWj5SZi42FeYSQmJSNkIyPhnGHgnOHjIV6b3Jwbm9kcGZfVEZJQz88Ozk6P0BBRERFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7Ogcnx4bH1tcoOBhYF6hIaGeXKhlXR4gXN1lIc1cZ2onY6hoYSihXZwhnyHfHOMrY2JgGdmYmpucm1wg3Vpb1h1cI6akndsf3t9bXFtcIB6c3ZuY3aEfoaAhZCRiouJkYuRjIuPg3V4i4+AfoOAfo96cXBva2BbXF5bWVhgX1JOW1pYV0xISkZKRz9DQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSsqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGTiJaRnqSnnq+VpbWqrrGuwbK7wcaWkIyUkICIfW6BkJKJg4qHj4V1goNslYiHe3R4eGx3bndjaV5JUEc+QDc0NDk7Ozw9PkBCRUhMTExMTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx+hYN/jH52opl5foaBhZmEm5xhhqqfnYuDkI56d4h+iYiNc4qXj4R6XWRxdHp7d4psZ2pieW+Fj4J6boF3dIR6cHR6d2tuaV53h32HfIiHj4CLkpeDjYWNh31xhH+EfXV3e3yJdnBzdGVnX1tbXVNbZl5XUVVYW1VHSkpETEc/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJKdnZ+mkaCroLGor8CxusW6lo6RlId6hXZrf4yRgn2KhI6MeIOAc6GEi319gX5wgH56Z3ZrUldMQEUyMTEzNjc2ODg6PD5BRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHF8j4x6fYmHfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSRqIeAmJiKnHNtfIGGh32OaGdoeH5uhYeChXGEhUdrgHdyeXZobWtfd32DiX+IhYx6lZ6biYuIkX96dYt2fHhtb3d+f3NzcmxbXV1bY2NYZmVcVVBQVllQRExLRk5JQ0ZDQ0FAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWIkY+WmJKXoZ2soaa4r7O8s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTMzNjY4Oj0/QEJFR0hKTE5RVFRVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgYSChZGTfoWIkYGalYKgoZeVm5qlrZOau7Gnu8fDqIqMoaWPlImBkXtxg56fkZx/doWFio+IkGlob4OAdY2HhItxhoJ3h4B7doV9bnZ1Z4CUj4aJiIiIh6GroZaJjph/eoKJenpvZ2t4fnp+cmpkXlpaXWpcYWZfWU9LTldSUUhQSkROR0NKREJARERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmeIN7gIyAgZGPi5qbpJ2hrKarr7CXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46DgIGMi4KJjYN/iX9tcGpdQkE0LS0vLy4vMDIyMzQ3Nzk7PT9CRUhKTlFSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhKTEtLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyNoZ6ZhJOFgo6hn5SZkoSKhY+YkZZscHWJi4KWjI2Pdo+EcWyFgYqWkoOFiHKJoZaHk4mPj5altambjZWig4eThH1/a2prfICBgXNhXWNeWmZrXGtrXldLR09TUU5NTEZJUENETUZBQ0VHQj45OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCCcHWHcXaShn6YlpqVn5+cp6CqlpOYnmdlpJp+hJKReYCSiJCSfYqFmZKRgoCAi42JhZCGhIiFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNTU3Oz9DRU5QUlRQUVFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6imopmhl6KVnZ+onqmrn6isqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4SUkoacoZqamaeRkYiVopqaeHp+lJiSoZKXl4GUnnt2lZKrs4mNl6B9lJ6cjpOWmaSiprawnZGZqIiWj46BiGxzcnx/fHFoYFxgXmJnY2BnZ1xRRUpLUE9JSkxGRk1DSExGRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdWBufWF3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImMioSShYOGiYGAhndfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVJOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk1PUVlthpB3lYujp6q0vbilrqysp6i0q7C3srKtu7GzvpyzxKy7ycu4xL+4paOwsqytq6SLlpiFpqagopeBppmNoqqopIiFlKShoKqhpKmOnLGLlaOnt7uboKOwk6Odo56RpKKrr62ztaKVpaqImYmSipZ6en6FfmdgaFxlYl1kY19mZl5bT0NJSFRPRkhMRkpHRUZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gZSFiIKcg5KQjZLayJ2Wc1aXiI+InI98hoyOiop6iIKHkY6DhYCLhYaHkoaChImGiIeHcW5hQEU2NDwyLzExMC0sKy0xLy00P0RBTVVRUlNVVVdVTltQR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcfDq7PGtqyzv7O4vra/tMG2u7ukuMaptsnHtb65tKijtK2xsZyakpqfiaevq6SVdp+kl6GrsbOYlqquqK62u7K6rK+1orGssbW8t7WutaCnqKOom6mwrbK6uLinm7apjKSOkZOgh3iCg3VZYWRWZWFhY2BhZV9aVUpERUxVUUhJSkRJR0VBQEBLREFNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFtaUWNkV3p1cYKUfYWGk3aFfoCNe7+7o7yCtJSTjZuPhIiPkomJeYaAjJOMh4WBjn+BiY6GgIaJhYqHkXp4bl1WQEVNPDY6NDZBQjc2NTAvNkNIQ1FcT1FVV1VcVk9eVUlLSkFAP0dLRkVEOz5AN0Q3P0JKSkVHV1RQXo+lraOxtMO2uMHMyba8xb2zs8C3uMK1v7C4dLK0prrFpLDGubGzsbSopLW2qrGgopabopKlsK6lraynpJigrLO6oqmyurW7vsy/xcW9vbPCt7q4v7e6t7msrbCmsaqtvrC9u8LCrJm6qJSuj5iYq4l+gnxqV2JhWGplamVXW2NZVlRJR0dMUUdDSElBSEQ+P0JCS0BATUM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTc/RlFMQUxSV1RZVVp3anB/j4SBjoVuenJ5iGK4oZmjiZWTlpOTk42Ql5KHh3uGgY2VioCEgIp6fIuHhnyKg4GKg5V9d3l1ZU9cZEdFTDpRZGFbXlNGPztIUERaY1FRWVhZZ1lUYGBNU09FQT9JSkhFRkFAQz1FNkI+SEdLTFNaVF2Tr7i1urnJwLu9ycy7vMC8t7W8u7e+tbqyxmB1s6Wxmp6rvaqlqKuqo6KytaGrqJ6Vlp+YoK6lp6elnqSUoqextKeysry2wb3TycrTxsLFzMLKw8C+vb+7vLe0sLm3t8O6xr3DybCeuaqirI+lqLeJgX9xX2FhXFdhX2hmUlhhVlJVSUVGTktBPkdEPUtCPUJAPUY9O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3MzUyNj84QD5HS1JUVFJQUFFSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdaGxscZCNhZB0bXNyc4jVwLWZoI2VmJmRjpeSlpaOhod9hoOMlot/g3+CeHqLg4d7i3mBioKXf3R9emtlcHVZXVxQZWViYGVkXVtYV1xNZG1VUm1tX25fWGdlVVlUSkRBS0pIRkhISEhCSTlEP0hLVFRWXFpbkrnAub23xsC7ucrLure5tri5s7i1tK62tplkdaierXBeoqycmKGjm6Seq6WUoJ+QlI6WmJeon6afn5qZhKSdrKWqsK23sL251NHP18/JzNLMz87Kx8C/wsq9wb3CwMXExsq/yM60pLuwtbCbrLm9mn95bF1fW1hdYVljY1FbYFNRS0NBRUZEPEBFPkJIQkBDPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpX3CXkpGUb2xvdXWIs6yhoZ+LmZyZjI2VkZuShYqKfoiHjJCLiXyBhHN7iYOGfIl0goqGlX9ze3hsbXV7aHJlaWxpZmppaGBmaWhtWm10l62kvIiHZ1tvaF1aWVRISk5QSktRTFRRSUxBSkdLUF9fYmZpYZi3x7C5s7u+trLEx7WvubCwu6yzsaeqt6yNtqeem6eaT5udjI6glpGmmKWVipOTiZCJj5GRnpuhmJuVl4eemqabrK+or6eztNTU1dbSy8/T1c7Tz83FwsnQv8rJy8nSyM3NwtDSuLDEvMS6pra7xKOCbmNcXF1YYFdYZlpRXVdOUENCSEVCSTtBRD5BSD8/Qjc7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ5PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVdzkJCYg2hxb3l5g6CqnqaXjZubl4uOlZGajn2Ji4WOioqLkIh8hIJwf4eBhnuHcoOSi499cXh1bHF4fnF7bXhzbGmBcG1jaW1weWl3fX7Lv8Lfp21jeG5jW2FgSlBSVU5ZXlBdXU5RTlRRVVRcbm53gnKWrristKewtqutvcCxq7WmpbinrK6hrLSjjrGumpiYjJGUkYSOm4GNppGciYOLhIqJhIuDlJWYl5SbkZyYmZmenquspKehrKzO0tXRzczS09TQ1NHOyMPU0cjN0tPT183S0cXS1sbAzsfIw6m/uNCeeW5lXWJcVl9SXVtPUFRQTkg+QUZBQkU8QEI+RUU+Pz86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYaFindtd3B9foChnp6hi42Zk5OMjJOPloR5hZCQjYuKiJGHf4J7cn6Agod6hXWFk5GJf292c2xzfHt2fHOBd3FrgHNyaW9xenlye77Lmn6MsoN2coR2aGFqXUNaWltWZmRYZWtUWF1cYGNdY3h7f4uBmaqkpKGgoammqrG4qqW0o6KtoqOtoqexn4mmmpSSkYqSjoiCk4lrlaKNmYSAhX6Rg4OTlq2LlY2VmY6FkpCdl6ewoaChpKSox83PyMLL0NPR1NLO083G1tLM1NjW1tjV19XJ1NrNydfW0cqtxMPMinJvYmBfWFNZUlxQSkdJSUpAOzo7RUFEPEJEPkhCP0JCOzs5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3lygomBnZWdlIWLlomPioiOh49/d4SUmYuNiIiLiX6DeHN7fYOHd4B7h5GXgYNud3BtdX92eH1zhXx5bYd2dG99doR1eXudtYw8QYvGpX6NfGllVklDZWNmY2hqZG95W19maGtuaW6Ag4mRi52eoJ2Ql5ifo6OmsqSks6CipZ6hqaCisZyGnpKSkpCLjouGg4+EfpybjI2DhIV6lH6CqZWjjJKKmJKLfZeKmpGrs5iam6ecp73Dxri2xs3S0NLQzNLLydTO0NXa19fY1NnYzdjbzsna2tLWv8zMtHd2bmRdWVJVUFlWRkdKSkVFPTo3OUBBQjpIREBFQ0FEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYXFxc4aNfJeRnYt+h5KDiYaFioKHfHiFlpeIj4OHhod6hHlxenuEhnV6hY6NnXqMcHxvcHp/cnyBcYOHgW6OenR3fXyCdX98h4iwdFipwraMkoJwbmI9XmhycHFwbnh3gmVpb3J1eHJ7i4eOlJKblqCWh4yTm6Cbn6qfoK2copqZn6Wen6yZi5qMkZKNhX2Ih4OEi46gmZOIhId+bZl5hJiGiJOMjZWMhnubiJOPrqqUlZeemKautr2orb3Gy8jJy8vQycPRytTW2NfY19Xb19PZ29bP29rR1sjVy5V5e2hoW1lQU1NdSENFSUk+QT49Nzo9Pzs+SD1AQUFBREE+Pjo4NkRCNzU1NDc5LjU2NjQzNTU0MjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw5OUQ/Q0dSa19tZGJma3aAiHGRkJuAeYCOfoOCgoV/hHx8hJeOh4t+hoeAd4J5bnt7hoF0epKejaF2j3WCdHWBfXSAhG+BkIJvkoR0fIGFenaGe4m3xqTCybiBlpuPd3BlTmZjgXqBd4aikIt5eXd7g398hHZtlJaUlY+XkIOJj5aal5emnJigl5+TkpejnZqrlpGRi42Sg4yFiYiBhZCRnpyZiYWMgYaXe4iIn5eQiY2Ki4J8oYmQi7yhl5OXmZyopqWunqe1vsDAucfJzc7FzcrR1tXU2dXX29TW2drb19va2djO28aGenlmaGRfVFdWVU1LRE1DOz09PDk6PD45PkE2Pj9APT8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PUA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6inx+gH+AfYV6foKRiYSFeoWIe3V9dG58fYZ+dH+SnpGfg5J8hn54jn14iopugpqAdJiFfoGJhXx+kHqPqY+Qw6C8jJyknH2JhH2Jc4yKfnOmmpyZlIV7j5CJhGhHcaGknYyLkJKFiIuRkpWPnZqTlZGXjYyVn52UoZSSjo6Qi36Qj46LhIiSlpqfn4mMlJKekYKLf6aZiIWOgoaEgKWGioy4mJ2RlJahp6Cdnp2jrra6tau/xcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19y3eHh3amlkVmBbU09OSERMQj09Pjk5Ojo5OTw9NkA+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYGPinFyeIp7e399f3yIenx7i4eCfnWDhnlzenNtgX6EfXeGm6GbnpSSgIuIf5iHgJySboeohXqgi3yQjoOIhJx+mpGKjaOioJCkr6CLkYuFi4GShldyrYufrJyPg5ibkJCOXIOikYKMn5OVjIaIjJKTjJSVlJCMj4qIlpudj5WWkYuSlIaAi4mSjYmKnZaZo6OGk52WoYuKiI6ckIOIj4CDh4WkhoyQs5ickpSXoaGemZKbnaexuKylvMHHzcfGz8zPzM/Xz9HUrtbV2NrZ2trX1tnan298dGdmXF1YU1ZXQ0BJRD4/Pjo0OTo7Nzo7OjM7PD89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bGJ+koNubXeLeHl+eoF9hnx7doaEgHNwhYJ7dnZ1dISDhX1+kqajnqailomdkJSWi4qol3KKsoyEp5GEmZOEmYyilqCZk4manaKSqa+fkZWQjo2IlYtujbeEmsTIsp2ipZucmJaRspBjpM3IlY6Gh4mQko6Nk5SKhYqKhpaam4+QlJOHlZiEgI+LmYiNkKqXl6SjiJmelpuJj4eXl4uFj4yBf4aPpYmNk6iZlpOWmKGYn5mTnZuisrSlo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoJyf2hiXl1dTklUWUFCR0Q7QT04Mzc7PDo4PTY0OTo8OjgyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ2gY59fG1+iHh6fnqCgoN+dnaAgnxsbot/enx4eHyEh4p+iqOzp6Oqs6GWp5+lo5aVrqKDkLiVkrOZjKGhjKSbr6OknZiQp5anmayvpJeVlpWQi5iZlqDAjqPJuaubo6atmJGbnbKdhYWoopyYhYmJjpWNi5OPiIGGh4mTmJWMi5STh5SYhoSRkJx0kZmzlpeloYicmpOQipGKl5uJipaOhn2MmJ6JkJCcmpmTmJeflKCdlZ6boLGuoqS3vrTFx8S9w8O/xs3KydKmzs3T0tDW2NPQ2LtyeXZdYFVfVk9ISk5EQkNFNT46Nzc6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SUVORUQ6NkFAQlM+OURPMzIzNTY1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER05bXFlKZmA7SISLentuhYZ6fIR4gYWBfnB4fH59b3KNen2BfHiGi4mGhJKnu6yosr2vpK2zs6ijorCsipq0naO4pJWtpJeprbempKOfmamXqaOvsKmamZyUlZGXoJiau7uuyqFqtrirsJSYn6Ork5e+o16qsoKJio2Uh5F8jo59g4aOj5SViIeTl4yQlY2LjJeYkp2ZtJeWq52LnJSSjZCSjJmbipGekIuJlZ+hjZSNmJqdk5uYnpShoJScnKWvqKGks7irwsjEtbq9u8XHx8LRoMbJzc3E19bRy9ShcHpoXFpTXlFPRUM+PENBQjg/ODc1PkY8PDU8MzUzNDU0NTRCMzk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBRUA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEdiYGJwSkCLin+Bc4aHfYKIdYOKgn9tfX18f3B3h3eNgYd7jY+MhoyZqsLAr73Gu7O0wby0rauztounsq2uvKqbu6Sorbm4q6amoqGjo6ivsrGqnJykmJqXl56ipaWSpLquqcC8ra2yuaWkp32Ih5ysvbCDjIyLkIOPg5GPeoGIkI2OnIiHj5eNi5WXlJCalp2nmrGakaycjpqPko6VkZCWl46RoJGJlJujrJSWj5ScnZKfnZuYoKGUmp6npqSipLCypsHGw6+wurbFxMK+zabHw8fDvNXRzcTKiHRzYlxZX1tNSkJMQEVHPkE/Qjs6ND5BPD01PTY+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNCNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGVHYGlnWl1ck4yMiHuHi4aDjHWGkYqBb357gX9xfoF6lXqSlJSYkJOVp7PGyb/CzMHDuce8uq+rubqXsra6ssCupcCkq6+7vKqtq6KinaeqrrSwqpufqpuhm5WfsLSni6O6urbBvKyonLKlpKiUhY6qw8SkgouPh4iEhpWUjXqDjZGPkaGMjJSSjoiXn5eTmZWYpqCvnYyqnI2Vj5KRlJWOkJWRj6GUhpefoLKelJqUoKCYpJ+aoJuglJiepqSmpqSvraXAxMKuqLe1ycO+ts6yxL7EvLPRysjCtXV5bVxYXGlTTEhETEtLSkFBPUNEPDVBRDs6Mz04QjMzMjI2M0EwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmZaTmVcZlRjapmNl4qMiJKQhol5hpSQgXKAfI1/eIeCgpB5jaGWqJqamLq9x8jJwdLJysLNvMGzrbu+p7q/vbzEt6zBqayzu76qsKmjpaOsrbOttrWgn66epaKYo7S8qZuovcGjt7ewq5Kwrausl4aaqqalkYKMk6WViYF2ipJ6hY2SkJ6fk4+Ui4+NlKOZl5yVlKOfqp+RpZqMj4+QlZaIfI+VkpKjmpWgopy1ppCel6WjoqWenaaYnpWXm6WjqKeisqyovMDEr6Wzt8zAua7Es7u+wbiswsPCwJlteWFYV1xbS0tNSkZERElCQkFETDo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Ol46ekomKf4mgk4R4hX+Vf3+QiIqQf5ahma6mo5jCvsfDx8XTzc7Ny7zCt7C5vLO8y7zDwbW2u62zv7m8rq+ooKintq2tqbG3mp6toqehnau3t6mlsL/Esb65s6eqtbOtrpaWpayooJGOkrHFp5WOfZGVfYiRmZCqmZiTk4+TlZOlnpOdmZOho6KcmJ+Zi4yPj56IWpCWl5KWpZllmKOesqWWopasrKqnm56ml5iXmJWhpKimn7arqbq8w7Wms7XLwbiptqyyuriuqLe6vbiCbG5aV1RVTkZKU05LP0FHRERIR0c5NUZNOz43PUBKLjMyMDI1QjU1UFZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz1AQkZCcUZpSVJlYkxGpZSclqGXqZaNkYOHppOIgoeCnISDlZCQlI6aop+vvq6hxrzFxMbGzs7O0sq+u7axuru7vs+2xL23uLeysbWzuLOrppyrq7iqqKevsJejr6SnpKS1wLCqrLS/w7rAurOnubW4sq6Vpa2vr6WLk5WhjXTBmn6XmYWPlpqMsZWampWTk5mZpaOVn5uWmqmdnKGgmouNj5adYEqWnJqVmqWWVJawn6+cn6WUr66spZqgpZSTmZmOnJ+nopm0qaqzvLy8qrCyx8C4paurrbGxo6GxsrSkcG5mXFpOUEtEUFBQUTtHSklHSENDPjpLVT9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqXmaCiqK+ZkZeHi6eWjomThZ+HhJ2Xj56gmqOktci0qca6wsPHycjIzM3Gvruzrrm4wMHNtsi6wbi1urCvr7O0pqObqrO0qqimrayZpK6lpKesur+oq7W3v8G/vrmzssSxub2so661rLqmiJyYppt2v6CFmZ2Ok5mai6+XoZycl5Wbn6GpnqigmpqqmqKnnpiQjZGdg252kqKalZ2inpCusqKrlaiql6qupaSfpaiSkpmciJScop6Wsaapq7q2vrOyrr65tqCjp6ilp5ybrKmpjGJlYV9SS01HSE5JVUw9TEROSktCQ0Q8UVU9QUFCRE8xOD03Nz9CNzVVWE4/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlJgTVVIf2VeSEWrlJyhn7uvmZSfi5Oqm5GSk4mrjYein4ykrZSjo7bGvbTBusLCx8jFws3Iwb25sq+5tMDCyrXFscG8tLqqqK2tsKKimaq0u6appquqnaivp6Oqqr67p628tLe9x7y3tbjBsb3As6m1t6u/pY+jmJGioLyfiZqgmZeeno+3n6mcpaObnKGaqKWzoZudppyoqp6Zlo+Um4uXiYylopSdop6gtK+lpZOwq5mrq56dpKOokZWVoIOPnp6clamkoqG0tLq1rai1srOenKKlmpeVmKqhnndgXF9dSkhGR01RSU1FRkZCUkxKQkVHQFZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpnXEZDQ5xwYkdFp5ekn57DrZuXpJeZqZyWmpqPqpaVp6aVra2Zoau2xMK7vrfBwsDHxL7Nxru9ubKvuLO/wsi1v6+7tri2pqSqrK2goJqqqsSipairpp6rr6yiqai/t6atvbC3tse2tbi4v7G/wba0s7SvvqOXo5aUnJSuoJGioqWjo5+QvqWpnairnZ2gm6afvaKYo5+iqauhnZeNlZ6TnoePhY2TnqShnbWspZyVsqeZr6efmqmeoI2ZlZ+EjaCam5OlpJqYq7G1saqlqq2snJigoJKOkJaonpRoYllhXU9JR0pOTEhFRElBPVBJQTxHSUhbUk9LPUhPVTRCRjk+SEc1Q2FbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM8Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E6blJGPEt4ZWJXTKKao5yexayhn6ydna6gk6OflqWgpqmrl7axo6qytcTEvb+2v8K7yMK+ysi2uLW1sLOzt8HGtr6wuLS4tZ+mrKqsnZ2epaPBpaCqrZ+kqa2voqanvbWlsby4trbDsrO3ub6yw8C3uK6ztbWjnaWVkpShrqCZop2pqKujmsOtqZ6srZubnpmmob2inaWYq6uspqGZjZmfkp+Jj1d/lp+moaC4qqeTmLajn7KhoJuulp6OmZSdgo6fl5WOoqSVkKausqupoaKlpZWVnZiLj5GTpJ6JYWRZY2BMSEpKTkZFQUZLPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JIRTY9dWVcS06en6GYnsOopaKzoZyyqJOrpKCkn62prJ27sKistbHIxcHCs8LDvMbDvMTKvK+wtq2wtK+/xLS5sbC5tKyZqLCpqZqdpaGnwq2brLGbqqKusKmkp722pre7va+3w6yzs8K/ssazurestLatqqKmlpaVpKyin5+aqKuwr6+8sqagqaiZmZiToqS4oKGkk6+vrKWnn5KhnpWej5CNlZ2ao5+ns6amjZi0nKOump6brpCek5eUmoCRoZaOjZ+hk4umrLClpqGcoJ6SkpqThYuSjZyef2FlW2dlSklMSlJCQ0BJRzs7Rz85OU9NVV5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0n6Ofm6DDqKSqsqGjtKqVs6ynoqSyrK6pu7KssLW0xsDEw7XAxL3JxLXAyMG0q7Wor7isv8S0t66strmlmauxq6qYn6aXrbu0m6iwm62frrSxp6q5sqe6s7eyucCqt7LCvLTFp76vrbe1qqisoZeXkqaloqOYmKWvuK6ytbagn6mkmZWVk6Sgt6OkppausrKnq6ahnpuam5aYqJ+gmKKer7Kipo2Xrpmlq5eZnqSRm42Tl5qFlZ6UjI+cnpSLqamqoaegmJ6VjI6ZkIGFlYmUn3hjaF1rak1QTU5UPUNBTkM6OklANzdST11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlwaFZDV0aMeWZDO6SjnKGmv6aor7ChqbWrnbmwq6OqtLaxsLm3r7a4uMW+w8e9vMTBxsC4wMbAuqm2pKy7rMDCt7eprLG6opWtsK2ylqWnkKq5qaCnsJ2qoLC0sqqptratu6yzs7q3rLmwwrq9vqbDq7C3r6mrq6eemJmroqKgkZihsa+zq7G6m5ypoJmWkpemobeppaOisLG0q7Koq5+boKCbnqWdopedo7Owmp+Qk6WaoKialKKelZiJlJiTlpack4iQm5mUjqmopp+im5ebk4eOmYt9jJaFj5tqaGxhbG5XUFFaVEFDRVRAOztJQTc6WFBkXlBWV0RZXl1NTFJOXktKPlpjXk5IUE5bVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPSonKz1ccD0+MS4xZVtkQDE2NDdnWWBGKD84bH1oW1Y7iXtjQz2nn5yhqb2hqq+ro7G4qaW1s6ygrbW9rrO4vLq9trbAw7/IxLnEwcDAuMS9wLevtaert7G7vr+0qa6xtp6Xq62orZanqI6nu5+krbOeq6KxsLOsqba0tb2tr7G1rLC1scC6xbervK+xuKytqqOxpp+lqqCkl5CZoLOqs6qrs5qdp5ualY6gpqS0rqeira2usaezrbKqpJyfqKSelaGZm6i1qZeZkpKfmZ6gnpCrnpeYhZWXi52Zm5OKjZaXmpempKKgnZaVl5OAj5SFe46Sg4yWZWxyZ3BxX0ZZZlZEQ01YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtHREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYVUxNTA9YFZeOClDM1lUXGdLNox6ZkxApJqhpKy2pK2ppa+utqqvtbqnprC3xbext7/AwbW0usW+zMW5wr+6v7nDt8C4sbSrqbq2urm+tKqtsbWYmKesqqubrKuOq72eq66xo6ugsa2zrq62srm3qq2usai1r7O7vcqyqra1sbSvrqehs6CbqK2gpZWWm5qyo62gpq+XoaSampKNoqWnsqmip7KsqralrrG1r6SZna2nmpifmZmsuKOXk5CPmJyhmJeUq5+ck4GTmI2dnJqVj4mUk56apKGhoJiWkZOVeouPhXuMioOLkmtueG11e2BFYWpZSUhZWj17SkZENkFiVGlbTVxgSltdWlJSUmJgTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ19RXC4qQi9KR1BbSDNjWVRLRJmXoLGosaqtpqSvrrWpt7S5pKu0t8m6tLq7v760tLfDwMzIu8O8tr2/v7e+u7C8rae6uLe2wrarrbG3lJemrquno7GqlK+7pKyysqeoo7KzsLGxtbG4s6muq7GnuK+1tMPFtqm1tqywramno7afoKexoKSUnJqVsZ6nnKCqjqmjnpuWmKWlpbenorK0rKeyp62wtaylmaCsqJucnZuUqriclI6Oi5mcopeQmKWhnpWDkZWQnZyYlpSHl5CXmqabo6CSlpCQlXaEkId7hYGEjYttcXd1e35cS2VsXEtOY1w+YntHSThHZ1dmW0xeYk1YWVdUWFRpXU9PSGFdX1BKSFFWVVJLSVdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0diTFYlLUIuPUVMUTwzcmtKQ0ORmaWupa2uq6elsbKzqrext6CrtbnIuK7BvMO3s7G1wsLOxb/BvbS9v7+6vruxw6epuLC2tr+8r6uzspyfp7GtpqWwpZ6ytayrsrCsqai0uay0srWstK2qrKirqbitsbDHv7ilubCpra2lqK2wpqSkr6SpnJ6cm6+Zo6Oio5GsnqSgn6Kqpaa5pay1taWqq6isr7auo52jqaqboJqakqS0mo+JjoeRoqCVjZSdoJSShY6Skp2bmJWThpeTlZmmmp6fjJKRjpB3fo2FfHx9h4qJcXRyfn19XFNkb15OWWZcRkSWW0c7Tm1YYltNYGJOVldWV1RZZ15RUkxjWltUS0dPVFNOR0lXU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZUhKKzpJPzNCSVMsPo9rPEdIj5yqq6KpsaSppbO0sbS1srKhq629y7quwLvHsbSttMLC0cXFvsCyvcDCvL+3vMSnrLess7i8wLCrsa2go6etqqiksKOqsaqvrLCur66ss7untrCyqbKpq6Wlo626rKqxwrm1rLqoqaitqqixpaqko66qqKKfnKOslaWemJ6ZrJ2hp6mirKWjray4sbKgqaKgq6+wrJ6fp6ipmaSYmY+gp5iGhI+Ki56gj4uMlZuOjYWHkJWgnZaYlYaWk5OXpJucnIuSkI2Jfn6HhXx3f4eFhnRzcYh1a19ZYG5jUXNxXEs7hHxGPld0WGBaTmNbTlVWVVdQXGJeU09OaFhXV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSmdERjg8QjA1RUtYMUCUWj5MRZWYraihqrOcqqqwtq24ta6rpaqqvci7sb23wq+wrLPEw87Ow76/tMDCw7rAs8jErK63rbK4wL6zra6rpKeqsKmnqLGltK6rsK6tsbCzrbO7pLizrKyup6ugop6wt6qqrbq2pba1o6qnrKyqraGpp6aysqSmpqGhrJaqoZWaoKaepKKrpKyin6ext62to6Wim6qrrqmdoqWkpJigmZaPmJ2TgoOQiYWdoIyKjouYjY+Kg4yXo5uSkJuMk5KRlKKZm5mKjouKfIaAgYN6dICEgn50d4ykiHhqXmBuZ1dlh2NOP2eTTEVieVdiWFJlVE1WVVVUT1xdYVVLTWlXVVdJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEMrOkpPXjREhj5IRkSXkrClo6qxmKuqrbWrtrGrpayqqbzAwLi4s7u1pbKvxMnL0b/Bu7m/v8G5wbrBxK6xtbGzusC+s7GuraurqLaqpq6vq7mwqLGxr7Kstqq2tae0tqyspKmrnKOetLKoqKS0tKC2raCpqKupq6egq6ypubapqqqqoqmgrJySqaGdoKSipqOpnZymta6opqmio5ilpqeqnKKko5+ZmJ+Rjo+Zjn+HjYeFnp6HhIqKjYyPjISGlKKajoyakZKRj5KflpiWi4qDf3SGgX9/eHWDf3t4f4GInY9vcWdncXhcYHOIak9emVZIbXhVZFZRYlBNVVRVUU9YW2JVSFBpVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD5DLD5MVF8vSmo2T0Q7lY6woKWrrpqspa2us7Svq6Wvqai6vrzAsK64raG2r8nHyNHAvr26vMK9usPBv7+usrKxtby8wrGxs6uzqKS1qaWts7O5sKOutrGvsrqrua6qrrasqp6prJ+ioLatqKGfr7OhtKqeqKeqo6uhoqytqL2vrK6toaeon6uZkK+hmKKhqKefqJqZqrGpo5+toqGToqOjp5iaqaWYl5mdj4qHlYh9jYaFhKSXhYKCi4aOjZCEhJOgloiRnZCTkI2RnJSXj4mFhXh0gX99dXh5gHt0c3ppgYajdWleZWuBdWeIjH1TWHBeSnhzU2RTUV5NTVJZZk5MVlllWUZTaVJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMaDo0OF89YWQ/RjFDUFtbK0hOOVVBNJCPsZ+kpqykp6SsprSysaqksKequL7Bu6+nuaqmrrDJx8jRw7y/vri+v7zJvMG4sLC1sbq7uMCys7utuK2itKanrLK2ubOnp7u1rba9sLymray1q62cqa+jn6Wsq6ecnqqzpLOomqqnqaSpnqOpp6m+q7Svrp2ppKCunJuyo5WknKSln6SamqirpZ6bqqGbkpuhpZ2Yl6mokpiak5CKgo+Ffo+CgIiej4Z/fYuHkI6QhH+Tm5OFk6KMlJKLkZqRlYeIfn9xenl+fGl4fHp1cHB9aIV4hIhkYWhjcoV6bWd5XV5WQld6bVRhUFJYS0tOcXVdSFpbZ1lFVWZQRD5KTkRDQTlIR0tTP2phSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0vR2pJMTRYPWZjQko3R1NgVSo9O0RYPyqPlLGZn6CppaShq6S3srKmqbGnrLjBvbWwo7msqKixw8nJzcG2vb+1t7+5yLbDtbSztbG9uLq+tq25tr+tobOmqquwtbi1q568vKiywLO6oK+ztaqsn66wo5ylqKmjnpylsaavoJ+qqaiiqpykqKCtvKiusK6hq6Okrp6eraaXn5uho5yfm5qiqqOamqSklZeUn6KWm5emq4uekZCRjIKKgYCPgHualY2JfH6Lho+OjIqEkpiRh5SjiZKSh5CZj5OAiHx5a312eXhje3pxcHFyeGiAdGqDZ2RoYW5zjm1iaXBgcEFceGxVXk9RUUpKTVRZV01dXm1XRFhgT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MEJoWTEzUz1lX0RMNktXZU8qPDNPWT0jkpmsmZ+Yp6Sin6ejuK+uo6+wqau4wrqzrZ+4r6uotLvIy8i/t8K+r7S9t8S3w7GvurKzwLW7vrepubi9q6S0p6iqsK65saqbu72ksMC1tKGut7Wmp6exs6CepKanoaWZnq2nqJ6gqa6noKeYpKigsLifo7GvoayhrKScpqepmpqbn6OVnZyanamml5ufqJKYk5iek5mWoamQmomOkId9h3+Cjnx8oY2NiHmDjISJjIyFiJKajomVn4mRlYKLloyRfIR7c299cXN0YHl4aW9xcG9pfnFjemxpZWNgZoZ/YFtyanJNTX5oWFpNUExKSFBSUElOXF9uVERYW1JnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmhIKj4vWVg1KJedpZidlq2goKGkobersaSztKqoucS1sq6gt6yurbC1xsjBt7/BubC0vLe/u7+vq72wtL+xvcO5qbu6t6eotainq7Cts7Gnmr23pK28tq+fsbewqKWnsLKboKSgpKShl5yvpqGfoqevoqCik6Sko7ewoaaxq5+so6+YnKqlqZ6Xmp2lk5ucmp2mq5qcnKWWlZeVnY6Ul6OooZCJipCGeoV+hIt6j5eKjYZ5goeEiIuOhY2TmIyOlpmKj5Z+hpeLj3mAenByd29vdF95d2RsbGtpaINtZXJqa2VoXGNzgF9aa3VpWkl9XVtYT09KSEhSVUYyOV9ebFBEWFZZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRHQWZbSFREVV1oRS47MmBULDKWo6GXlZypnaWhoqC3qq+gurmmrL3Es7CuorWvrK6vtMTEvbO/urews7m4uri7rq7As7S4r7/BuKy9urWmorOqp6mzq66yopvBtqWotbWpnrK7qqemqbCsmaKnnKSmlJiisqSZn6SoqZyioJOloKS5qKSnrqeepaGokp+poqGgmZudoJKanJagoqubm5mhlZKVlpqNlJOjp6SPiIqPhnmEfIWFfZ2NiouGeYCEh4iIkYWVk5KMkJWUjY6Ue4OXjop3fntsdHJsbHRieHVoaGpnZW+EZ2hoZGZpamBoYmlmWmV7Y2BTc1RbW1NMSUdJT1NAISppXmpMQ1ZVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEIzQ0RnW0tXR1VgaEIzNzhjTicynqSjko6kppyenp2jta2nqrq3qKzDwLawrKK1raevr7jAwL2xwbexrrK3tri3tqyqvbOvsrG9v7euu7uxpZ+2q6WltKmrrqCfwquopbCzqqy0up2oqquxpZidqp6mpJGZpq2imJ6kqaGcop2XoJ2ntqavqq6hoZ6doZWgpp+ioJmbmZySmZ2UpZ6to5iXnpWUjpWYjI+YmqigkYiJioh5hXeCgoKdh4uCiXx/hIiGhZCElpWPjpCRkZGNknuDlY2Gc359Znhva2tsaHVza2NnZGN0f2JkZWZlaWpjaXFZXlhdbWRhTmhXWmBWSUdIS01SWD85YGxpR0JVU1xbSUlHRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWUpWYmZBOzNBZkglNZukoJGMraGZmKCWpbSxorG+t6Gxxru5sLGjtqurrqm5vby7rcCyr66ttq+zuLOoq7ixrq60tru2r7i9raadtaugobGlq6+fpMOgsqSusa+3rbWdra+trqOZnKeqpZ6Vm6iln5mloqecmqCclJydrbCmuaiuo6Kamp6ZnqOapJ2XnpiblJqhkqiVrKmblJuckoyVmY6UlJmpp42NiomPe4J0goGKmIWHfImJhISKjIiShZOckpKPkJGWjpB/gI2Ngm+Bf2Z5bmhramdxcmtcaGRicoBgZGdqbWxnamlmbFxsbXVxYVRiaGNlWUlGTE1PWFFQVWFlgVRAVlNZVUZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OjYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSWVDJzSTopuPjrCdmpOhmqmysJ+4wLagtMK7vbmxpbavqa6lt7m3uKy7r62qq7eqtLmupbK1sa6psba2sLK1uqeon7apnp6qoqqtnKnAmK2krrC2taysnrGtsKqim5yjrKiblZyno52aqaKjlZqgnZGbo6uqqbufp6SgmJqanqGPa6KWmJxxgpacpIB2kauonpWVn5GJl5mAl4ugj3mGk4yDbWl+d4NxbIaLhn2Ei4ZvXmNgZ4SXhmuLkJSSdXeLhH6Dj39mh4BodWlmV1xpc25OUGpkZnGEZl5kZm5saV5fX4mQhIZoT0tEOEVUZ15KR1BQVVVLR1Ngb3RlRVtRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzYwMS4qLiovNjY4LCMxJzIxNDoxNzZYgWwxNk9rW05cS1tmYj5HMVBkPSsvjaSZh5Wwm5yToJuqraujvcWvqbfCuL28rae2sKarpLi0srOwua2qp6y0prC1o6i4trWop6y2sq60rbOiqZ+0q56ipJynqJqsvJWmpa+zuK2tpKiuq6yloZ6coKinm5ihpqWbm6ennZKfoJmRnqiqo7Wwo6OjnZaYmJejiKGPkpqHoYeUnqF/pX+nq56TkpuSiIRyeIyOhIihdoiMaZeIZn1zeKFviIeEfo17f6Ggn5l/e4iedIiOdpuKbIeBg21oZWN6bHFiVIZtY21pmHFYanBuhldeaVtraluIcG15coZoh4RaXkZOPkZeTUVSVldRUVJXVGdeTFlLUlJPRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFWYTcvKIyml4ScrJ2ZmZ2fq6qoqr/DrrG6vLfAvqqkt7GqrKazta6vs7arqaWxraW1s5yttba0paeos7Gtsqevn6qgsqifpKOaoqScrrWVpKWmtr2mrKepqqyopqKgmZ+mo5mZpqOkmJykqZaTopyVk6OlpqG3pKSgpJiVk5iUnIiukJiUiamLl6OchbGApK2elJqelXmC1Kh/h5TBm8d5eLGlt5dkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyWsauweWhrWLGub2VpvJK8bmh6bXKP2H5TamO2sn+BcZR1mqGqkFdPV2FPVk5GVFtYUVBTi1xXW1BAXEVRTkRHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGOppOBpqmfl5ydpa2yqbHCvbK1wLW3vsKrprStramor7Sqr7a0qKemtaanuK+ds7G1qqWkp7GurbGmqp6npLGkoqGfl5ygn6+tlZ6in7S6oqmooK2upaKdm5qhqJ+Ym6ign5iep6eRnKeblJ2hp6OgsKOfoKOWlpKYkpmFsGtqio2qfmeEloetZXGenZWappVxrqGkfne7fGuhj3axX2q0W6WAZpyRYGaBemZ/anhqqWW+cmemjHaxanyxeHSSk2NtbaduW4SgRWlnh5ZFdZxgfmd7o6eCWV+Lq2mBlXh6aqc3Sq9bV1RsY1tLTldfXFdWO06IT1dWL0lUU0lDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzEbkqKVgqynpZ6jpKqxt620vb6wt8SyuLrCp6mwrK+pqbGvpLC6sKSlrrOjqbipnrOysKOloKqtr6uvpqefo6KwnKOcmJWYm52tppebop60s6Gqm6GtraCempegoqmcmZ6koJyZoaekkJ2jm5ihn6yfpqagm6ChlpWRlpGahrWbtXiFqZm1mXeHs5u3f5OWl6mUfmuBpnqBhYiSlJJ3q2dqsVuse4+HlHSIcI+GgH+IkJd4g4KLl4yDoI+FsHZ3n3Framx8i06kWEhjY5l+Y2imYHlydVOShl5QqW1jcX6HgGKdLlGibltUa2dgTEtcZFhcWkI+sHhXWEEjTWhFQkRBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjlhVTUwHJaflIizpqahrqmns6yqu7bCsLzCrbi3waqsra6vpq6yqaGvvKqhp7Wto6u1paays6ejop2nqrKosKelnqCfr5afmZWWl5ifraKamqSota+hqY+pqKmbnpWYoKWomp+do5+coKKlo5WbnpianaOrm6aZm5uioJeTkZOTnYPVk5m5cLDCfsaGfNaUm7t8mpalkI2bjKR6jYejgqWCeqx5j51Vr3uJfp9quVq5d4aDfaaCk3yYeqp5jZ2Pe7FujoR0kLuFb5RPr6fFilGgemNgqmJzcodsl4dfU7W0yIaAiXxjpDNCnXZdUWpoZFBAWGZaZGFKSE1sS1pTT1lmWkNDP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDk7REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS1xQX2ZUN0c6YVE4MiWcoZOYsaiopbOqpbSopby3wbC6wLG1tbyztqexsaOxs6afrraom6i6rqKvsaCztLCgpJ6ep6mwqLSppZydnquXmZeXl5aXoaqdmpeorbCpo5+OrKKnlp6XnKGloZiioaKhmqKip5ueoJ6VmZumoJynlJuan6GZkJKVkZ2Ism5otXGriHCOpnK0c3K2e5qYpI2Pm42ifpCgpX6wdoOR0tF1W658hn+kb5uqpmuGhX2tfZeZj3uxc5OdjnizZZZ0hZ5unmaUUsiLWsJcn3liX61gd3OHYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9qX2xpUFVGSTk9V1JbV1hIQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJOVF9lUDVHPWFNNjIvop2RpK+spKq7raa0pai2u7yyu7+3trS7u7OltbSisrKjn6ywpJimuq6ksbCctLiqoKadoaqksaesqqWanZqpnpaVmJmTk6KnoJeTpqqxpqGWkqyfpZKUoZukpp+Vm6anoZqjn62aoJ6ekJacop6cpZSclZqin5WYlpKbhax7d6h2o4+Kh6lvrYqDqIOZmaKKkpmLon6SmImuhX+Cs1xys1KufoOCpH9x1313hH6PnYaZmnevhoqRnId3tGGaZZqCgZVsklqwWEuadZh5ZmCtXnd3h2eYiGpdr3eVno94bDV5yK6yX0FUb15oYEVQbF9wbVZVTS9lY2lTWVE7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo4OJ+dlKC4sJi0wa2osqeqsrq4tLi/uriztr21pbi0oLSsn6Coq5+Vp7asqLCxq620pJupoKCoobWmpqqjmZ6VpaGUlJyZk5ajpZuTkKesr6aglZipn6KPkaKZqKaglZqmqZ6dpJ6snaCdoI2Un5ueoJiZnJaXoqCUmJGnnYapfX2leaGPj4OqcK2MgqeGlqChipeXiKOBkIiUqnyAi515b7FaqIOCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfYKUbJJcq1tak3+Rf2hnqmRze4FrmIdxXaxaiaCOa25lT0pDoVxaTHReY2ZNWmFfc3RfSlU1SpqSWUhFPUhGQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC46PjEwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzFVX2JMN0ZJX0MxPjihnJmZvqyYtMKuq62pprSwuLG1v7q6s7G3vKq7taCxpJ6lp6eek6qxqa+qtayrr6GYoaCmpKO5oqOroZeckaKglZSfmpSZoKCQjYypsK+mnZeap6afjZKkl6irp5SXqqifn6CjraOgnaGNlaGYn6CSnZeclZ6hlZePq5uPrm1ytHSpjHeKpnO0eXSzgJKko5KcjImkh452uG+Me4uia2u2WqGGZZeXaaCip22UcrR0k5h/smqGkoita3WzYZ1mom6GkmqXXK1gTaF8h5FSc6NseX9+bpiGb1yvVjycd2ZUb24uXKdPYlJrZWJtWWJcYHF8Y1NZUD4+bW8zQkJAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV9hTDVGTV44MUI4pZqbnbuinLLArq2rq6e3qbivtcC1vLGvubirwbeqqqCbpqShnZKrqqe1o7Korqqgl5yooKSruZ2jrZyWmY+lo5aNnaGcmZ2fkZOVq7avp5mUm6ypl4yTpZmlrKORl6uypKCeqKuwmaGij5mil6CblpuXoZOdqZyUkauZh9SSmrt0scSAw4Z91ZacuHiIkZeMl4mMp4d5o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiAim6aiHBtjaR0vV13fVthebxrWlZbanpeaWBkZmJteG9ZW1lDQUByP0NGKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjk3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdBOaaZnqK8opexw7Ctqaqssae4r7bEsbuyrruwrsGyrKWinqOhnJuRqqSqsqS1p62kn5aaqpmmrLicoq6ZlaGQpaCTjZyjnpiempCWkq+5sKuVl6Oop5SRlqWcpK2ekaCoq5+coKmks56ipI6nopShmpyXlaSYj7CgkpWqnoWQmbWAkZGNuJV4gpObtXdubG5zbnmPhI6Jc57Bu7yae4GyqHCAdJG5g3yGhouHjXuKho2XfKS7ub2cdXqzo3R2l3V0sHWYnmaGaY22dHJwd7aMXn96fYlng3lteWKLrHB1hX9ZW6dqRWRaVGZgY11iUWdncW11Qk1QTEQ7Wkw/SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQUtOR0VPRj9HPDc+NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JWOCpPXV09KztWVic9OzymnaChv6WWtMO0rKqnrKupu66wxq+1tK+4p7W4ramjoqaeoJ2ZlKykraqmtaion5uWoKOerKS+pqGqmJWckaKbko+hqKKTnZeSmJSytbatmJ2kpKKLkpKmm6Wrm5aopKWcm6KppqajqKCRrZ6Wop6Xl5edno+wqZScp6KOan5pnKd4iXN+mo51emWHe72+wLpukoNxlIZfcmpaXpqJYWSHjpVrYICVY22cdmKUa3+alZRlXmBjcZuKaHKMfYaVZ2p+cXR5fXxiW3d0gWhQXG6DfHuLalhseYJySUpvhXBNdE1FV11mYUxbWGdjXk9bbXVpcVJPREVOO0hJPE0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNURGVUVLT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdJUl9JJ1NgVjQpUF5MKDM+W08nPzI+qJ+oocGjmrS6tqOspa6nqLWyrMissLOstaO+sbKmoKOpnaObmpmsp66kpLWqpZuYlaKbpq2ovqepppaUm5WgmpOYpamnkZ6Qj5icsLK/rJumnqeiiZORqpqopJqbq5+jmZujp62in6qhmbCblKagl5Sdn52XsKWZoqiZnJGenKOkmaejmpyam5qQloJobnxxdpGXlJGEibSpjYaYlY6KjJeXh5SVioOSk5GJjZGUmZOYl5qgopublKCdjoJ6pIVranyQfIB0iYqBcYJ4eXZ2ioB7impzgXSDdWR3fXZrcHttYGNccGhNWVllal9XWW96bW1mU09GUzlPWk5STygrO0pCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlMxMFReOis9OF1LLDwtQLKgs6G/oqSxsregqaWyp6WwtarJq62xprWmwKi0oJ6kpZyklZagq6aso6O3rKCZlpagl62qpcCeq6SWkpyXnpiTlKKfnqKnkpGZqKeyw6+aq52rno+WlqmeqpycoKyYoZudoqWvpqKkp56tmJamnZmaoZ6enLCgnaKnlpiTmZSgopajn5egjpaUi4qNjpetj3uVm4KSgYmpqIWBmJaKhI6fiHuEkIaFmZCHhomVjpuXjZCYnqOWmpORnY1+jWais66FiYR2eo+KfXZ5em9neZCBgIlrdYF5iHJodH96doOIgmt0Y3lmYGlkY2Rmalhre3BpalxSTFBEX1VGQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXV1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLykrKjclKzwoNkNNTEQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvvq2rrrKyoKqmsq2irLOwxbCqrKOzr72ktJygpqKhnZmXqKWopqSms7WelZSemZmvpq6+oKujkZGempmUkZWhnJepnYWeqayis8i0oKqkq5aWmJqnnaibn6SrlJ6fnqCqrqmloqqhrZuen6GYpZ6cn52vpJmfqJOYl52SpZqYqZ6al2aDknxlfo6aj2N4jWxoa3qQo6trZZqYfmeFimVlaWh6jaGOa2iMl5Gid2tqi5ijn5hzbG56hI2GeVhlXYWBXmuKioF2W2hzd3eRgIeCbniCeIBzbXmEdHeIiI+De2qFWF5rdGRdc4hpanxxbGNdUU5XSWRYQEozPUY3P0ZENzE8PT9BQzs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS8qKyc2KiQ7Jy9BSVtJLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvq7Owq6Wora6wpq6usL2xqaikrbCxn62Xn6OeoZqZpqqbrKOmqKmzrp6Vo5Cir6a2uaWuo4+OmqGZk5KaoJmZpZZ7payiqLPDuKSip6+enpWeo56jnKOpqJGeoZ6gqq+qq6Kpn6ibpZ6noKyWoZulsKSYnKuWoZ6bk6WYnquZnn6+g4hytHKFnoataHi5xLhxkqGje6aYmXOqgnzLwMC7cYuih4OffJWYiJ7AvYKWnZ6NncHBe4F6kYyawr99a6Wxb4yBb8p6f5t3kYOOgHZ5gX95cXp/h3F4hYyTeW12kmJmX3hjX2WBYl50aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPkhbTCojQ1AvI0ZbM1BZL1VBQjsvOJajuMO1sK/AqamUo6+psK+tprK1r6umpqaxq5+rmJqioJybqqeinKuipaikpLSknaOTpq6st7Onr6KSkZqdpZKRoKGXnJ+dh6arpKutv8CwoamvqZeSn52imaKjqqOSoKGena2uqaylo6KmoKSlna2pkaSbqa2qnJ2qnKyilpellqGjmJx/zpR5eqWCeZWWm1+uj16Op4ChoX2nlpt0q4OAr15kjal6p4eFoHSXkoizY4KrhqGOjbNphK50fJaHuGGCrVmjzW6PdXvbe3+ZcH6IknV/ZXuHdnZrfYhufoWRkn5tgY5gcWtwZmBfeGRbcGhqY2ZgUlRSV11KT0M1QUhFRDg+NjtAP0E7PThAPj4/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLS1KMCc7XDpMLSFQQEY0LjGtwsDAtbSwt5iekaSqqK20q6ayrKyspKymsKqgp5uappicorCfoZ+op6OmoZ6wrJuelqaurbGrqKyglJKbn6WTj5+ll56oo56upKuwqL/Gs6ipsa6Wkp2copegqaqflKCenJ2tr6eqqZunpqOhq5KttJamoquqnqOnpqGwoZKap5qhm5SUkZegcIWMl3WFqIdxsXydcax+oZ+CpY+ed6uCfa1/nHKtfquHhp92mJJ6fJd+qoiijJGLnX6re4iTj6CAeq1WnMR6j2+SwX2BlW11cIxtZnZlhm9hd25yb4mKkZCDbZCPZW90dm9gZm1kX29paW5mY1dTXGFaUlJDOElJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl1cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJyAnNB41LSY3PldKLT0nPjEpM1ZARiEcRzpDMS4rr9TGx7K0n52jjqOjoayutq+psKepqqiuq6unoqOdmaKVn6arn6Kln6ioop+dsKyXm5aop6+tqKepnpeUmqOikpShrZudpqOurKOstam5zbKtpq6slpScnaKYn66snZafmZ2fqbGpqambq6mjoqubr7GiqKyuppmmq6qqsaOTl6Olm5SShaRqpHWJeql0erJwgqWJmYxwiKCah6RfYFKrhH+ugpt2roGnhoafepiWhXtmgKOJpJmGgaN9qX6AlIeuXnyoVZ2ikoF6op+Ae8OvxYxzr7OzuXFiqa/CdGiNjJiPgW2akm9ueXh3bmxmZWRxcGZ7aGNdV19pWFhUTExRTENDQUI7Q0FAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY3NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzY2KjFQS0wjIEE5RDQsJ8LJ1dbAoZmrqKGvop6wtbCvqayjqKaqq6uppKagm6WfnaWnpqOcrJqiq6Gkn6+inZuTqqS2sK6gqZudlpSno5CaoqifoKacsKajqLGstsiytaqsqpWRnJ2imZ+ls52aoJOcn6erq6OumqyooqGqorOtoqqzsaGbqqivr7ajk5ekp5ibkXyqbJ6Eh3WreXywb4Kki4mflpWflYHSuLS4yYCBsl5flKmDpIeHoHqYlZl4qsl0maOVp6mQkpuMfpuJmsbGd2WhgqVzgZ+Ogn2vXm+1Y7F1S6OGbadHgpNkj5Cek3xwl5J+cHt1fXptXGZqcnFmgWpeYlhjbVxeWUlNTUtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOT1BNRkxKVkYqTDAvPi00T1RRHRw7PEYyLCSopMHGua2osq6spaKcsrmsqqGmm6imqqypp6CmpZiqo5+uq52moKyan6mlnaa1nqKXk6eqtbKsm6acoJWQpa2RmZyno6Cqp66ho6epsLTCsrOqraiTiZidpJqho66klqGVmJylpquar52tqKaerKO3rKGyua+dm6+ns7SzpZWYqKSan46CnU54moF/n3qEo3yCpISHp5+cnpOEuHx8ebmCfszFwrZ4m6GQi59+mpaXinaemIqkmKOofrCFnISehKx9mZRhpWyjcI+FkIF9l4NyrGCkc3GAmmC8fVJVdY6Ro5d8fpKRiXV6c4R+cFxtbndyaoFvWmRfaG5iZF1LTFFUQUhHRkk6OUs+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUyOlBbVBwbNj9ILC0gjIeZqaykq7mrr6CcoayztKafoJWlrq6uqaadpqaao6ehsq6hqaayoJmopJSitaKjlZehqbS5pJujnqOTkKGymZ6cp6ahoq+tnaSoorWxw7Gtqq2pkYeRnKaco6ScpJaemJmZpaSomq6hraWmmK+lvK2it7etnp61srmys6eZnrCipJ6Gj9G1w7d5h46FkZOPgKZ4lKJ3jKCShKWCi3GrhoS0bnJqmaOclYmffJiZhoePc6+CpZuijaaLk52JlJCbbXCyXKVzk3qcbJl/e5l9bqlhonFxf59ic7K4aHiPk6aYfoyMkot4fXmNgW1pd2l4c25/dF1kZG5tZWhgSlpXWDxHR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVlZUUU9RW1UlITJBSCQpJZJzjIquv7+7u7Wel6ikrbahopmVo6mnrqmrmaWhn6WgoLWnoqmnsKOUq6OOpK2jnZCamqmztKSdpp2pkpSXrqCgnqeknKectZqgqqO2q8KwqauqoYyEjpuhoKailZiZnJiamKakppirp62ipZutp76slb6wrZ+jsLO6rLSnm6mypaiYeqiQfXywd4qBpKWInG2yb6GHrXyhj4OolpmArImEroWflKmgopaFn4CZlYB7kn6rgJ2aloqqeJ2gj4mTkoB5r12jgXymp2SdgHyXdGuuXaVrcYWZXWBbjKBulZGmmYOUjZaLenqCln5rbX5ifXRuf3pgZ2Vxb2dnaENZYFs9SlMyVThCQkM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV1dW1pYU1BPTkk3MDUyLiosQVRWVlZVVFVVVVVUVFVUU1RXV1dYVlVVUUhGSUojKCi8kpqEqcbDtsG0n5utoK64paSOm6SjoK+vqp+jnp2tmJ65oKKroK+qma2hkKqppJaJmpCusKymn6ebrJiYj6yioZ2mopqlnK2Yn6imtqi/r6WppJ6MgI6bmqCmnpKUmZqTmpqlpKOZqKuro6Sfqai+pJfDrKqjoqyzuqyvp6G0sKmqmXavfpCLnIWHfbquiphlsIxlla19oY+Dp5WagayKhLCFpZmkoaKQhKBbbGqBs2B/rXt7goCxbGdumZeMiLFbfbRbpINryKJln4B7vFl2tVqyfVKvgHqsWIChbZiPqJqKl5CVlnt4jZx9ZHN9YoN3dIB8YWpmcG1mZWVPVWNbQVRePkkoPjk9NCEiLSUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYF9gYWJeX1xbWFVQTUpHQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsre9u7TBs6Ocraaltqihi5mgn52zs6meop+dtJigs6iqq56wrp2rm5WuqaKOiJuOr6yopqKnma6TmY+omqGepZ+ao6OlmZ6iqbKovK+kqJ6dj3yLm5WhoJmPkpqbkZmXqJ6hmKitp6Wlo6Wpu5+gxqelqaKrtLatrqegva6trZaBqZKjr46bgIakl5iQgYC4w7qDjpyThaeXnIKsioKviKabmqWqkX7VvcKqYqO/vXx+o4KD17q4tYWUk4Oevb6EaqOBb6uEbp1/erKwx4Nqq7C9rXh3or67dICWjqacj5qQlZx5gZCaeWJ8emSMZnmCe2BrZWtqYlBiW1NqXEBUYUJOKT06NC8eHyQeJTIgHSQoMDQ5NjY3ODs+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1JQz88QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVtLSxv7myvbOina6mpbOmnYyYpb+qt7Goob+mprGbnrGcuaiera6lppWUr6yXjIOaka+mo6yhpJyqoZiLo5KmnqecmqGoopmeoKutqbmtqKObl5N7h5mRppuTj5GYmI6Yk6mZn5ipqKCqpqGjq7ueqcWjoK+jq7O1q7CqobyosLCadHWqpLeGZYmfcGetj4qPbW93pJCZn4F1rpmVcJCMcZWno5uYrqRybW1tZYp3bm2CmXGAeWlxaWeJlpWYcWhphYZncIZkXoljam9ZXWd+d6ZgYnGOkm9mZICNko6imJeYkJWefIeOlHVlhndojWp5fnlkbGNmbGJLZFhKa1k6UGVFUidLOisjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYGBhXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16olK2zqrq5srOqqaKunqSyqZiSvbHDyL62qp7Aq6yjoKarn7qjpK2srKaOlq2qj4yFlZetn6WqoZ+jo6CRjKSSp5mpmZajqqCWnKWlp6+6q6yam5KSe4SXjaWXjZGRmJONmJWnlJ6XqKKasKaeoqy6n7DCqKSzpqyxsquurKi5pK+4loqhqKW2nYmWopiHqZqQlJ2TqrOZm6OsoLKWoqCeoKKcoKShlaumjJKTjIeSnJyUkJmTmJCOlYaBpJqXlY2Lk5KKj4aEfmeLf3SCdnSIjHGnbXyVkZSTgYGPj4+PnZSglZeWoIKHk4xwaI92cIp3dnx6amxkZG9jVWBZQGlaR2JgT1orRj0rJiE3NDAuHxwhJTIoKjc5OTQ2OTs+P0FCREZKS0tNT1BRV1RWWV5fYWNdXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqW1uK+uorCkrZ+gtbGRjqvFvMS7uKqipZ2bpp2wqKO2p52ptKankZiso4uIiY+cp5arpKGZp56ek5Wjl6ibqZmUpqGkkJqnmaG1uqiqmJqQjXyBlIyhlIqUkZWQkJOXpY+emaifnLajnaest6euwq6jt6avr7Ctqqq0uqKvvZmSpqOmtqOSnaaejamfjZKfo6yvmqGjsaivl6SgnKSqnp2dnJernJKZoZuTkJaqmY2YmJaQlp6RiKCdlZSFkoyQjJSLgX5mjIZ1hnZ5iINznGqHkZSUkYp9jJaSkpiToZKclqCDh5eGeXGVcnmJf3F7f2puZF9waWBbYFltYlBgY1BbOkdHRD0yPT03LiomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlxeXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iVpKejsLOsrqOpp62gqLWqkI+cpbO7r6ysoaKZep2isKSlsamWm7imopSZqZyOhoqJm6KQrp6jlqefoZKXmJuui6uWj6iZqIyYqI+eubakpZibjYl5gZOMmpOKlJGTkI2RlqKMnZ6onp+4pH+Er7WisK90pL6jsqB4eqCrs7yVdq6kn4qAqn5kXGJ2n46knoSXfm6Ts5yjqK6romWeoJNzeZmWcICYqJdsf6KniWWcpZuQl5iWi5GbkYWdmpCVgpKHjo6SiYV4a5CHdoZxfIaBgGFpiIuVk4tbdpWRZ2iQjnJ6pJiYZHmYhoF3l2mDioJueX9rcGVfdm9ra2hbZmNiYm9TWz5OTk5SRz1AVEI5MS8eHyY0OjMxNjY3ODw7PkBBQkZIQkdGSUtMU1RVWVxfaGZnV1FKPERHOzhVUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclaajobCxrKuppaito6etpJKWq7Wvsaaaqqarl3OLnK+fqKqnk5a4oKCPnKSdkX6IiJqejauao5Snop6Ol5GehXWukIimmqiRlqOIm7q0p6CZmIuJdHaTjZWTipSQkJSMj5OgjpqfppmcspaAjJy1nbSMko+9p6F+p6J6o6+4gY6Op5+Ei4WPsamvjImWo5p5gYushpydoqeqqIeVhph3pZt6h5uBl6aCgXucsXqKhZ+XmZSYloGQlpaEmZpjeYeQhI6PkouDbnGQiHmBcYCBhn+GdIeFlpJ4lmiTdKCadHyZg5+chph+kYmBgphqjYyEa3h7cXBnZHduaWxrW2VqaWVyW15JVExRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+PkBESUBJRUpLR1JYWllbYWFoZlpRSDlFTDs+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZijn6aurquorKCosKenqqWZlK7GvbCglaWotZ6Pg5yrnKahn42Qvp6ZjZ+aoJB9hY6Zl4irnaKVn6CRjZOJhoCRqI6Hopyjk5adhp+5sqedmpKOhXB1j4iTkIqUj4+bi4+Rn5KWn6SWnqyIn7SJtJqui8qIq66Jt4WNsIOxr4SpjaeYjZ18qI9ye3ebjqaWaJWkebSLn56mqJKZwoF/q4iYoXGegJqkfZeFlbGBoXygk5+PmJeAjpObiZiSi3yFk4aNlZOJg21zkYaAe3KGgYV9hXSFgpeBj8VmgKmHj6JqnoOgmIGZf4qLg4iYb4yShGd3dHt2Z2h1cGdnbF5jbmxmbFhoR1xRTDJFNDZNYGM2JjQ8REdEOjY0NjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASmRZXWNmaGdiYmJiZGNgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLmxqqummpSgo6SqopWjqbajr3+gp5ylnp2Jk7yZk42gkZ2QeYSWlpGHq5mbmpmhhY+Md5ucj6CRiJ6km5WYl4aiuK2lmZuMjH9ibY+Kko+NkIyMl4uQkZ+Pk5+hmaGofqGnh62eoJauj5+dnZGGgaCNq6+HpI2qmoyafqN2gJiTa4GrdU2reIeNnZGbqKeBqqt9g6F7eqdpnn+Sa2eXhpe2iJ59bWBjWIOXf4x7ZGeLc5l9eZZsXXyXbl9TcYRcYGx5g2BZZYJ9hIGYcaeqa4OjbnKlcJ+Dnmhkn2xabIh6ZVlfgn5hV1BvdmVudHJqam9eam9sa2hXaU9dV0U5QTRHQ15rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deX2J2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGNkY2FiaWtkYmRkZ2RiZ2VhY2iYlp2guaGqo6askqG2vKuuopmXoKGlrKyfnK21o6iSoJ+fppuZjpi0mZCLnoyVi3WBlJGNiqaWlZeenn+ShYaspIeckYqYqJeZmpGHpbCmopWaiIl/aG6Ih4qOjomLjZKLkJKijJOeoJyipX+TgY+joZSgd5yWkKeDoaeAhqquhaV5i32Emn2icHOTh5Z7nox5bYebjJmQm6iaj4edfIKic3amZp5+d6RfmHp8knOibpi3tLp0koeBgLaoZIHGuHtwlbeMcYCbpGNzrKtgfWqds35ufYeDjoKLl3GAo2xzpHOeg3+kXp2Zs5Zve5ees3RyW56ygmlib3R1cWhvWGtscnJlXGleYktEPUQ1UUFZcTI8UkZfSlI9PDM5NTo6NkQ7O0BJUD9UTU5RQERfXltaWGBgfGRIQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7mZrJyToI2kuLWuraCbopyjo6Ssm5qxrayTl6CYoKSZmpOeq5uLiJJ4i4VwgJaNio+gkJOUnZd9kImOqKGHmI+KkaKTm5qMi6iopJ6PloaDfWp6hn99j4yCi5CQiY+UoIKWnaCdoJ+LiXecmKKMoHKii4ipiJynkZeoq3+ujH16oJl6o5N4gHOXiIycfZafhpuNmZumhqNkoXyJlpCbjWyeaJqNbpqZen+Kp31yZ3Oqg52Cc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF6ndnWJin+eaJp1h5OSmI5/nm6ZkGummVyofne7an2pWo6EXbNnXG5xeXdraVtxaXh5Y19lV2JBUEVON1ZCUm00SlpaX05aQ0AxNTE7OzdIPzpDR1Q/WVJZXT5EYl5WYFFhZH1pRUI5TltdWGRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZWciaq2m6iJY5SbrLqysKydppycp5+drZqdsKirnZeimaGfmJaWoKOZhomNaYiAcXuXiIuWloSSlZiPeoqElqOdiZSPhYudkZybiY+oo6CZi5CJf39pgYZ5f5aLeoiNjoePlpp/k6KfoKKTmHJon4qgj4xwkoyCqYiZn6OpoKh9sK2koriXdqOzoqN/iJR4nXqrmn6ijp2bl4iXcqF8hY2vtX1rmpGheH6YtKOjq6iEmHuafJyZfnOqWl1ve5eLeJ5iTX97e4VjepdCTZ9ZompyfI5tgYmEmXWbeYeJsbN/f5qSpnR/nW1xfJRvmXJpo12VdkhlY2BzcH1+bmVgbGh2fGRjYFFeVl1UVkBZRVFnRFJXW2JYXklEPUI4QEI6SUU4TERXQVZRW1ZERmJcWmBLYG1+ckVDPFVfYlplalZnaGxuYmZmXmFhXF1eYWhiX2VkdmxeZWdma2RmbGhoa2mTnYGxrpmEU1+gp7O5s7OpmqKLm6mcm6iSoaukoaiPnp2cmpmVmKGdloeHiXeFgW55lYWQmot9kZKWiHKAiZKgnHKRkICImJSfmoSOqJyalIqKiXuDa4SFcYGgi3eFjYiHkpmVfJKkoZ+jiK6GfbWEj56de6aWeqmClp2Qi6Gefqdod21+mXOgc3F8nYWYb5OCrn2jg6aemoGjcF6pZ3WjY2+lYZzTkHx6mXhyc2OihY9+onKijnVrj7OLYIKYinOqsqi8f3eDbX+/pqq0XpxvfnGXb4FzonJdo2d0pmFopm2b05h7g5tud3mXa5t6dpdybKmlZ19leXB/hGtnZmRtdnhoX2FSW2VRUWJJV0lUX1dTW2VqXGRQRkNLTEpLQkpFOFA/UE1XU1hPUlJgZmVpUmR4eXdJRkVjXWRZaGpUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxomJt/sKxUXEt+qa+ytbCzo5yYhZinoKCjjaSooJipiZmXmJOZk5Kgl42IhXtwfYRofY+Ck5qBd5GNjolwf4aQk5Jsl5N8iJCRo5WDjqqalJKKhYl5g3WIgG6Cn4Z3f5KGiJmil3mToqSan4mzoaK2i3qsp6SupXCpgJqQhYGckn2kgKKZhphynoSirK6Jl4uAjKSNloOuopR2tba1yaFzlIqAn2Gel6lteZWHn5p1oYd3oH2QloqBb0xmopJwmohzpHt5dGGDgmx+oGxyZGCccn90l2l7abO1tMamc5h+e51qm5urdYKabXR3l2maeXSYcVBFfLNeanVqeIdmamdidHRxblZeVFloUFJoSVVMWFJWXGdrblZnV01KQUpNSkhKTkFRSlBlY2ltZXRyc355e251iXt7VFBPbV1oW2tpUmpoaWxnbGdjZV9cXVxeaWJkaGt7X11kZ2NqZm9tZWltZaKcia+nhWY/lKGzq6+vtaKikICXqKKipIylp52cpYKZl5aNl5CQm5KNiIN5anmGZYOMfpegeXWPiIyBaYSFkoOMhZ2NeoyKlKWSgpepl4yRi4CJeX98i3lwkKGGeYCVh4mWoJZ/lKWonJaWhGdueJxsomR8caV3nJhwZ6eBl4x7pXqgloOXcp92gImUlo+5bpCKomJ9maKViG5yaatqdaBsbqZgm2mLkGiWh5qVdaKAfZpfi4WMdW+IYmihZZ5/aZt1b2NmiIJucqJaX1tkoW5eiYxve39zcmSlbniiZGenaJhzi5huoW9TiI9voF5kp1SLXVOYbW1yanGBbXBoa3hza3BSWFdXZllTbUlYT1xIWGloc2pZa1ZRUkVWXExYUmFVaGped3V6fHB8fHKDe39ydo2AhHZeUXNhZ2JwZ1BqaGhrbG5nZGdfXV5dYGtiaml2dV1cY2hjampzbGZrbWOdpZimemV0bYunrqWqsLGmn4uAlqqcnqWMoqGaoqKAlZiTjZqPi5eQjYp7hnGAiGiLi3yXmnN0in2Qe2WDh5WKipWZgnyIhZamj4Giq5CFkIqBin1/f45zaY+lhHyFk42ImKCOiJKqp56JpniWnH6liZaMspiekIOvl5+leJaIeql0pY+Emm6looyShIyDvG58pa+ChoWGlJecoHylenGolKCWZ55+b6xjloqVkneobKmigYl2h4J3q5GmiGuRsGt2s4ypa4qGbm2fnpKVYX+ri6p2gH+Np593n32FpJWdoGmah3asZ56tjLZzd76MpJNZg6aNq2F1cXNve3RxYmp+bmhsU1ZbVWFhXGtNXFJdSV1tbXZgW3FZW2BaZ3Nlbm9yY3F0YHd7fnlyeYNzhH+Ae3uMgYKAdmJ4ZGNuc2RSbGdob2xyaWZpYV9eXGJrYmxsem9cXGJpYmxqd21nbG5ilaaqnIGAnqSWqaqeqKeuo5mJgpeqmZ6kiZqlnamdhIuaj4WckYWSjYuNdIV6iINvjYR9lpN0dIZykoJtf4ySh4aUj317gYSXpI1/paWNgI2JhJR1goeSb2yLqYCDi5SOiZyfiY2Tq6SgkIB1lZeIfoF5lK6jf4GbcY+GeJCMhYB7cqeMcX19epeWm4SOeHt+fYiUlZOKdpCYnqCDen2JbIyFW3l5cnlxaG5+kolxf3SBj5STcYWDgWWNf1+BgIx3dXOUdW95b26HbYSGX3dpeI5mgYKGjqqcfnR9l2qJiG+AdnyFdm1sZ4xzeHuXd4Rbalh4j2htd3Fwb3d4b11shm5pZ1ZaYFdcZWtjVWFVXlFfcHd5bGp2ZWpqanV8cXJ0c2FvdWJze4F4dXmCdYCAf4B4i4WDfXttf2xkeW5eV25naHVreGppamRcYFpjamVscHVuWltia2RsbHltaGxvYY6Vuqmni6GimqakmaSdq6Kgg4OXq5GdoImappqomIKBm4t+lpSHjomIjXKCfI99fo+EepeOdHKDcJWFe32Si4aGkIV4foCGmKKMe6ehi4WPj4SVgoaOl3dyhaqGjpKckIienoiMm6igoKuDiY6Vmn5+iZatqI+Sp5B4cJ6Rg3uTb36phXB9lXFqb3yBn4t/ko6MaG1dg4uMm5qejnOVi4hxdGuCdnOAWXJuh5CBfX6LaV1pY3qFg4iAX2l4e5t8g4yDdoGGgmh5i4drYXFzg3dgc4yCiZCnlYZmjY+DbnaLg3CFjXlvZWZjeYJ6lVpcaWZudlt6eXd0bXNygmZcbYprbGJZWV5aWWxxW19gWV5dZnR9e3Rvc2Nra2l7fHF7eHRkbXRobHx+dXl8e3p6f39+b4aKhHt9c355c39pVFxxaWx1b3Vna2hkXWFYa2hranFybVdbZW5sZ3N6b2hqbWCMjKuxopCjoZqfnpiemamjoX2Dl6uMn5SHm6KQpZV/e5eEfJKZiImGhopyfYCLdoWLgYSWinFvgHKYhoR+koSDhoqBeoCDipqej4KmoId4jZeIlYuLnJeFg3qtgpGYmZSKnp2HiKGroKKio4yIk5uco5mWqqGnpqCSm4iXj3x5j46EqH5/kpGSk5ywpZqUnZCNspOYhKaMjJSan4mQm4KJkYprfI52d2WChpCKfImdhIeLj4eIgISDkHd8enWaoomHi56LhZR/foyBgXZxdIaFgHiIh4qRppGEho6Ig42QjHyHioiPgXZrgYN7eZlpcmhgc4pwfXp2dW93dIFdXm+HaG5fX1pcXVNocVVjW1thbGh1e3xybnBka2pof3tteH9xaW9wbGaBe3KBgHiAfYCEem2DjIZ8enh8fnqDeE5kdmtzbXB6ZGtlYmJgW3RmcGZycWxVXWx0bWh5enFnaWtljYidup+WoqGYlZmYlJikoJ17gJmqjZ6NhZ+cip6WfHmUgnuOmYmGg4SGbXiBgHKAh36Ik4Rta356l4aEg5B+gIaEhn2Hg4yanJKHqp6CcYqPhZKRi5yRfY17qoSNkpeVjpyWhoabp6Cimp2Gg5KamZmQmqagpp2dkJeBkYp3fYiOhaV7fI+QkYaYqqGdk5yPjauNkYCejIiSmZ6Cjpd+ho2Cb3iFcXRgf4OPhnWLl4CDj4KGhH6Fg5RueXV0k6KLjYWahISNdICKfXxyc3uIhHt5jI6Ek6ePhoSPgoOKiYl2hYeJi3tua31/e21oa2xnXnl+Z3x7dnN1dXt3XGBwfW51YGNbXF5RZm1TZVpdYWtpdnp+cWtsZGtqZ4CAbHOAbGx0b3huhHluhoB2goB9hHZxgo2Ifnt7fH97gopgaXtqdWhpgmRqY2BpW2N1aG9idW1sVGJxeWVwenpzZWptbYuKn7iaoaOfkpKWl4uan56de3iepZCbiYaklIuYmXl6jYV8iZGDjIKBgm18f3hygIV9ipB8a2h9gZeIgYiOfH6GhId8j4CPmpuRiKecf3CLiouShqChioWMfKiSiI+Sl5OWkneNo6Ghnpaaf4GQmpmTjJujoaSal5Gbf46EeYCEj4ehgH6MjY98l6SgoJKZkI+mjY+Bm5GJkpebfpKSfoaNgXV0gnB2YH2AjYZyipV8iItyjH+ChYaOaHdxeIyYko9/l36IinOCh3x8cXl6jIV6e5KNg5amk4uGkXyFhoeEdYKDiId5ZHJ7fnh5cGxqZl59cmh8dXVzfHKAal5gdHZweGRjWV5eUmtoVGRYXmFnanZ4gXFma2NsaGWAgGptfmhucWt9d4Z5a4uBcoGBfYF0doKNhn58e3+BfX+PanKDbnNpYYdobGJfcVV0b21uYHhobVdqdHZjdXt7cmJqb3qJjZ+ykqWlnI6QmI+GnaCanHx2pKCNln+MooqImpZ4e4aHfoOJfoiCgH9wf3t0dYKFfomQeGdjfYaXioKKjXh9gIyDeZaAlZeVjJagmn1vi4GQk4alm4eMiYOmloWSipWXkpF2kZ6hoZiUmHp/jpiXjpabnaSemZOUnHqPhYN4hZeNnn6Bio6Mc5einqGSmI6PooyLg5aYg5KWmX6YjXyIjYF2cX1temSAfIqFcIaTf5CCbIeCgX+JhGV1b3yHkpeNfZN4i4l8gId8fHJ/eIqHeYWRiouYopWChIx3iISCgXZ7gYmFdF54d3xzfXdma2RgfmlqdnN0dH1xfGNjYXNudXNtYVlgXltsZFJiV19gaGt1eYZwYmpjbWVofINsaHRobG9of3yCeG2QhnGAgoJ/dHyDjIF/fnqCg358kG12iHR0bWWKbGphY3VWg2lxbmB5Z2xianZwZnl8enFgcmyGhpCdrpemqJ6NjZeHhqCTl5h9d6mciph5l5yLi5iQeXyAi318g3uAgoB4c3h6c32AhH+Ii4BkXn2LlYd+hId0fX6Kf32YhJaTloyjoZd+cod7k5GKpo+MjoqSoJGDkY+Ul5GKgY+YoJqSkJJ0gI2SlImdnZ6nmJiNlZd0jY6KbIaYkJl6h4iQiW+XnZqjk5WKjZ+MhoGSnH+SkpWGmYh8iYmBenF5anVse36Lfm6FkoKUd2+Cg31+in9kcmp7gJaXhH+NdJCJg3mHfnZ4gH2GgX2EjoWMlKSQeYWDdImHfX9zdYCHg21genV5cHtvYW5iZHthbm92cnd3c3RidmBvbHVub11bXl1eal5PXVdiYWhtc3qJa19pZWpjaHeIbWZsaGptaIB8endukIdzgIOEfXSBhol6gn16gYR9fI5yeop4eG5sh2toX2lyY4docW9ld2hubGF6aGt9e3hwYXdti4GZmqqgpKidioqRhoqeipWXfXatmIyWfZ6TkZaTiHd+e4p8e4B2d3+AcHRzem+FfYGAin58YFx+j5GGf4OEc3qAhnqPkYeRkZuSpJuUgX2AfI2KkqSIjYqNl5qNhZGYk5WOiYmMk52TkIyNboSQj5GJnpmioZeWiZeSb4mZhGeGmo+UeomFkIpwlpqUoZKSiIuZjIJ/kJ58ko+Si5mOe4qEh3RzdWtxbnV8i3RuhZCOknF0gHuBgYh8ZHFseX2ZlH2EiHSQi4F0iHluf32Ah32FjYqFjZWojXuIfX6LhXd9cG+AhYNjaHdzdG56Yl5vYGp0XnBqenh4bHJwZXldbWxzbXNYWl5fYWpaUFdYZGNncXF/h2ZdaWhnYmdxjm9kaWdlamiAend0bo6Fc4CBgnt1goiFd4V8eISFeoCJd3+Le3pyeYNqa19waHR/a3FubXFnb2xle2JugHl2cWx3d4p/o5iiqKGmm4eMioGPnYaTnHSAqZSRjIagjJWTkH90e3aFeHh/cnN7hWtyb3ltiXaAgIZucVtZfpGNiICAgHZ1gH9/oIaPipGcl6CTl3eJfoCMiJydiY+GkpeVhIiUmY+Wi4uNjo2dio6QhG6Ji4+RipyWoZuYlYWYiGuFo4Nnhp2KkX+LhIuBd5OYkZ6RkIiJlY1/fo+XfJGNj42aknyKf4Judm9rbW9we4Vpc4OOl4pwd390gomCeGZzb3aBmY58iYR6lJF6d4h0cIh7hox7i4eEiY+co4h8hHeCi4B4eG5qgIKBXXJycG9vd1pecGBval5vaXx5cG1tam12YHBva3JtWVhhYWJuWFFTWWVmY3VwhIJiXWptZGJma5JtYGZmX2hrgXVycnCLgHR/goB4doCLgHiFf3eHhneDhHuGjH97dop/anFjfGKGfG9wbHRqaG9sdndfcX95e3R1dICCf6WVmq2fp5aFjYN/l5WDj591ip+TkoWKmoyVjYt6cnh0gnByhXNxdYhsb211bYh3g31/bW5VUYGrlIeCeIB2coJ5gqCBkYGTkpebkZp4kXqCjJKkmpOOiJWYkoSGlpmMk4uJj4+InoWQinxzi4WJj4icmZ+blpSAlH9phpyIaIehiJKEkYOJcYORl4+ajY+Mi4+Nd3uSkHqOi4yRlox8iHyAa3ZqbWtrbHp+YXl+jpWBdnqAd4ONfHlndGx0h5WLf4iGe5SQcXqEcHeMeoqMe4l+g4yRn52FfH14got9dnBpa4GCeV93bmxrcXJVXW5icWBfbW55cGdwZmdzdWhwa2F3ZV1WZmBgclNQTlxmZV14cIh8X11ocmJiZWaSal9oZFtncH5wa3Fzin12fIWAdHV/jHl7hoF4iIJzhoR+jIyEe3mVd2ZyaoNgh35vb2t6YGpudH90X3R9eYZ4dHOFfHigj5mwnKWPgop/g5qIgIuef4qZk46EiJeNjo+EdnR2c4Bwb4VzcHGDb2ppdm2Cbn18bXVzUk6C38mS1pN8cHSCdYOggpJ3lJCYm4+Ye5NyhZCfoZOTkIqSm5SGfpaViI2NiJGNiJyAjoF4eox+iIyKnJudm5WTeY13aImSh2yJpIWTiJeDhmOMkZiOlIqWjI2Ki3F7lIl6jYiKkpGJeYV7fmx7ZXJvamt5eVuAeY+OgHp9fn+Gjnp6aHNrc4uPioKFhX2VjGx+f2+AjH+MiH2EeoKQlpqbi3x3eIOQeXNtZnB/g2xpdG5naHNtU15uZHBZX2txd2ZramJmeHNvcGNfd2BgVmtfXnZQTkxgZmNdeXGJdFxbZXZgYWVljmNhZmFYaXNzbmtxdot8dHqGgXV2fotzf4Z/eoh+comHgZGKiHx+mHZlc258ZYd+bnBrgFpsbnl5c2B2enuNdnJ3ind5n4ubrpugkIKFd4iVf32JnIeFn5GOhYyXhJOOh4F1d3B5cW6Eb21ufnJkZHhwfG16fWpobGOkmsHcru+hc2t1g3WEoYWRbpWPlJ+Um4GRcIWLo5eJjpWKkJ2Wg4CVkIWJj4CSioqXf4d7dX+JeIaEjZuamJmOkHaLd2+HiYt9i6SFkomdhYVei5SXio6JjouKhIlsfJaBfYiFiZCPhnaFfX1rfWR3dWpteHNXiHqRhoV6fn+AhYx+eWVzan+KjoqDgn+MloVrgnVuiJGCkYV/gnqAkZaUmZB0dHiIjXV0cWd1eYJidG1vYWh1ZlJgcGdrVV9udHlgcmNfaH1xcm1aYnJhYlduWVx3TU1MY2ZhXnZzim1bXGR5XmBkZoRfY2NeWGpya25rcneLfXN3hIF4d3uJcYOEfX6Ie3SLiYiWhox+fphzaHVxeW2Lem50cIFYcXp2eXFkd3mGjGl2gIlyf5yHmKeco5KEfXCMlHh5i52EhaGNjnyVjH+aiIR7cndwc2pvgWtpbHx0XmB4dntwdXtnYGV869q1ycPciHNsc4B2iZqIjWmXj46clJKBiHCFiKCOhIuVio2YlHyNk4iDiY97kYuGkIJ/dniDhHKHgpKblpSYhox2h39xhYKJh5mig5SMnoOJYYOVjoaJhomNh4CHaX2Uf32DhImOjYJxhn5/cXdodXJpc3drWox9koGFfH+DgISKgnZidGyIgY+Lgn5/kpF9boJseYaPhpOEfYF9gJKTkZeJbnJ6jIZ1bHFrcniAX3RpblxqdWBSZHFoZlNfcHZ0YG9gXWiCcXJpV2doY2lYbVdbdUxKTGVmXmJyc4VoW1xleV5eZGd6YWRfXFlrbmVvanR3in5zc4F+enZ6iHOFg3x/h3Z3ioaPmIGNgnuTdmx3dXl5k3RueHp9WHmFcYBvZ3h3koJkdoaFcYqWhZmhm6KKhnNvkotyd46cfYqaiIl7n3+DmX+BeHFzbm9kcn5oZmx3d1tfeXt6cXF/aWFnYX/Vto6QpnhucXd7cJKQjIdqmI2Im5GLhntoh4uZhoGSkYaHmI18jY2BgYqNfJCMfoqFenV7gnpxhoCVmY6TlIKJdYSHd4SAi5Odn4aWj59+iGF/k4eEiISJjX9/g2d9kH9+f4KLj5B+bYJ8gnRrbXZ0c3Z1a2ONgY5/hX58hH+EiH9wX3NxhXyPjYJ8f5KJenGDZnqDioeMg3yFfoCVj5GThG5weYx/dW1uamt6fWJoamlYa3VaUmlyaWJQYnJ4bGFlXVpqg21zYltnX2RsX25UWm9OSE9mZFxnbnGAbFpbY3JfXGNsd2RlXVxabGxibWlzdoZ/cW5/fHx0eIZ4hYJ8gId1eYmBkpZ8iYZ2iYFveHl7hJNwbXuBd16Df3SBbWl6c5RzZ3KIfXKSkYOan5ughod2dpR/bXaTl32HkIOKjZl8i5p2fXZxb2xqYXR8Z2JpdXpaX3h8em1xfmVjaGhXnY9ecXKWvMODdXGUiJB+cpaLhpuSjIdyaoiPloB7lIyBhJuMfIqGfXyJjH+UiHWKhnZ2fYFxdYaBnpSFlI+Dg3KAiHWFfImYnZiHlI6dgIhmfZOCf4WDiYlygX1nfot7eH5/h4uOfGmAfIN2ZW94eHN2c2xqjYWKgYp/eIGAhIN/a15yeHp+jYqFe4KPgH5ygGl5g4eLhoR5hHyBmI2QjH1ubXuJfXd0bmhnfHZjXHFiV25yU1Nuc2hhTWZ0eGVgXVxYboBvc1llYV5qbWBwT1lrUURTZ2Baa25tfG5aW15sY1pib3dkZ1xdYGxqY2tpc3aBg3Btfnx/dHWDe4OCfIKFdn6JgZaReIOKdIGIcnl4fo2Qb298gXFpgXl6fm1sfHaVa2p3hHRslI2FnpigmYWIbn2Mdmp4mI5+gYqClZeJeY6Wb3pzcGxqZGB0e2hfZXF6WmFyfXlncXphZWWPsbJ3SmJapNnQlnF7kIqQd32Ui4SZkYyFbmuFkpJ6eZKGgYSYinyHf3h4iYqEloBwjIhxdH16aXmFg6WQhJONg39vf4N3hHmFm5mUi5OQlIWHcHuSgn2Cg4mDboF4aICEeHJ/f4OKhntlfX6EdWNwcn9oeHBvdZiNhoKKe3Z4gIR5gWtccX1ygYiFiX2GiXqIcoFucYSHjoSFc4R5gZmNjYR4bm9+hIB3emVoanxwX1l3WlhwbE5XcXNnYEpsdnRgXVtbWXR9cm9XZ11manFfbk5XaFE/WWZeWm9rZ3lxWlpZa2VZY3F5X2hcXmVtaGVraHF3f4dua39+gHVvgnuAgX6Df3aBhYmXinGCjXF7hnx5eYSTjHVqen9sb350f31vcnt7lG9ugX94ZpOKg6GZnJKChmeHg29oepWIfX+EgZiJgXyNjGl4cmtsZl9hb3htX2JveFxkbIN6YXF2X2Vl1Oq+ijI6PouOgHF5hYeOjXaDlox+ko2Mf21shYyLdX2Pf4WClYl8g3hudoeEg5d3b4iFa3V7dGZ5goOni4KPi4R9boB1d4N5hpyQjJCRkoyLhn57koZ3f4SNg2x/cmiAfnhtfHuBioN3YXmEgXFkcWh+bXRxdIGbi4B/hX5ydX2Ac4FwW21+dHiKg4t7h4B8iHh6cWyIg4+Ei3KCeoCXi4t/dG5rd4CAdXVcaWh3cFhWe1NZb2RMWnJyZVtJcHduXFpaWV11fnRoWWJbZ2VuY2lMV2ZRPV5lXF11ZV90cFpZVG9kWWRxeVpoXmBnbWdpbGlwd32ObGmChH55boB8fIF/gnp1goGNk4VwgItueH6Ae3uIkol/aHt+a3R7coZ7c3d9f4x5eIR9fGuMjYSbnZaMgYBsjn5raH6NjHp+f4OUgX59iohrdXFnaGNbYmdybmBha3NhaHCJemJzdF5jZJugj25cNVmvtXRpgIh8koZ2hZaFc4+LiXZwbYWChnR5iXiJfJKIen9zZ3aJfn6Yb3GGfmh2eW1leYiEpIeAh42Jfm5+doCBfIyZh4KTkJiJi4SJfI+IcHt9hHtofmxqgHt6aXp2gYeBcmB3gX5xZHJmdYJtdXuElJGBfIF/bnd5fHR/bVhvf3Z0jIKGd4h2gol6eHNuiYGPgYVzf31/k4mJem5uam6CgnVuXWdmc3FRWnpNWm9cTltycGRVS3N4aVdZWVphcYB0YF1dYGZkaGlmTlloTUBhZFtgdWFcdG1YV1N0YVpkb3JXal5iaGtnbWxpcHd8kmxphIl8fHB+fnuBf4J6d4B/iouDcXuHb3F3g397iY2Pg2p+e253eXeKd314gIKHf4N+fnpthYyImKONhIN7dYt5a2yEiJB4fXuBkX9/foqDcHJwY2ZeWWdfb3BgYGdwZmpviXRhdG9bYWRqdnt/vpymo8i4cYWDc5N8eIaTgnOQjIhycnCEe4JzdYd0iHeTiHl5cWN3h3qAk2lyhHZmd3ZjanyDh56Bf3+Oj31yf3SFeYCRkIJ4lo2Uj4iCiHuIiWt4eX51Z3pobH95c2l6doCCfWhgd4d9amt0Z3uAaXaAi5CUfnp+fnB7dnt0fmJWd31yc4qEgnyDcYaKd3hwcIOCjX99eX59do6Gg3ZpcWltiIJycF1oY3NuSmR1S11uVVNZc25iUU9zeGBSWFhcYW+Cc1thXGhlZWNqZFFacElEY2FaY3BeXXdoVVZVd15bZW5oVmteYWpnZW9vaHB2epJuaYiMeX1ye355goGBfHZ9g4iGg3B3g3JudoKDfYmLk39wgHx4eXqBjHSDeH+BgYKEeoB1b36Ki5ueiH2FeneGe2d0hYuQen5/e4iFhHaPgGdvbl9kXFhlWW1yYGBgcGxraIluYHNpWV5kbYB3qdqpx4aHsnGJeG+MdXuGjoB6k4mAdXR1fnd/b3F/bYR0lIZ4dGtgeoJ5iI9mcYNvZ3ZuW219gZCUf4B5kZJ9eXtth3aAkIuEdJaKkY6HhYV7f4VsdHZ/bWd2ZW17dW1qdnd/f3xgYniFeWh0dWJ9e2d0ho6MlXt0f3VxgHp8bX9ZVnR+b3WEh3+AeWyIhnR4a3V/g4R9e315e3OLgX1zZ3RlbouEbXNbal91ZEhubkxaYVdWVXhtYlBSdHZXUFVYXmFxhG9cYGNtZGRebmJUXHJHQmZfXWZoXVp6YlFVXHVbW2drYVZqX2BuZmZrcWhwdXiOdGuOjHV/dnh9d4GDgXtzfYOIh4NvcX90cXV+hYGJjYp7d394g3x8hod4h3x9gX6EgHt+c3Z5jI6gjYl6iXZ0g3lefYWYjHmGg3SFhoR3iXtibmxbYltbYVZqc2NgW2dub2aHcWFxZldcY2t/fMrOh7mham1timxxhHF8g4l+e5GFenlzeXV1e2psdWOEdZGCd29mXn2CeouJZXKCa2pxY1hse4abiIKBc5eUd398bYhxgYqLh3GXjpCIhYuDe3l+cXFwfWZocWJteHFqa3F3fHx5XGR5gHdpdXhmgXZndIeLjZR8cYZpb36AeW58XVhyf210gIt8gm9viX9xdmh3f4F/gXZ9cnt1h3x6cmZzYW6MgmxyWGtfd1tJbmtNVVReVFV7a2FPVHVyUFFUVl5idIVpXGBramZjWW5hWGJwR0FoXGBmX11Ve11PVWRwWltqaF1XaGBfcmZraHJncHJ3hnhulYp0f3p4fniDh391cn+GhY2CcHB7eHd1eoaFhoyFenx/dYt+fYaEhId/fn59h398eHZ5eJGToH+MfYttdoB5Y4OGloVzkYpvhYWBeoN0Y25qWV9bXV1UZ3NlYFlkcXJmgXNia2VXW2Bpf3i+rnugt21ic4Zoc3txeYKFe32Mf3d4cnZve3Zlam5gh3WOgXNqYl5+eHmLhGZxfmhqa1pWb3eKo4GEf3GZk3GBeXSCbYCCkYdzlYiMiISJhX14dHJuaHlgam1gbXZqZ2preXd6d1tnfXx4ZXJ9bYR0ZXWFjIWVf2+LZmt6g3VtdGJcb3xrdXyLfIFmdYd9bXFndX54fn9yfWx7e4F6eHBmbGJuiX5tbVZrYHdVSmprT1FOaE1ZfGhiTlV1akxQVFVeZnWDZl1gcGhnYVdpXVtraEpFa1phZFdZVXlZTlZtalldbGVcWmVjXnRmbWRxZ3JvdYF4cJmFdn9+d398hYd9dXOCiICVgm5zeHp6c3OFhoiIg3iBfXaPf3yEio6EgoR7fouDe3d8d3eanZd6ioKGaXd9fGyDhJN/co+CcIWCfoF/b2ZsZ1ddW1xbVGRwZF9XYnJ1aXVwZWViV1xcaH9wb3KAc4lkZHh+aXR1c3OChHiAhHl2c3Vua3pwYWdrZ4Z0jYNuZl1ffXB7iX5pbXdmaWRVVnJvjaZ8hHt2lpB0fHN8em17e5CFdph8h4aChoN8dHBybGd0XGxoXmx0ZGdmaXpve3JZZ4B2dWdwgHeBdWJ3hIp8lIBui2pteoFxZnNlYG16Z3N3inx+YnWDdmlrcXR6cHp5c35mfn9/eXduZGZiboZ8bWtWamJwU0toak9LTnBHXntmYU1VdGNKTlNXYWp2fmVcZ3NpZWBWY1dicF1MS2tYY2JVVVVzVkxYdWRaX2thXFpjZV93Zm1icGlzbnJ/dXSagXd/gHd/foWFenx1goR+l4VucnR8enRxhIWPgYB5i3V0kX98gZWOgIWEfX6Mhnt+gHZ7o6WKeYiGhGt1fHp1g4KLeW6Fc3mEfYGDdW5qaGVWXVtaWlNibmRbWGFze2lobWlgYldfW2qAaWtvgGdrYWh5eGpzdHRuhIF6f311dW56aGp5al9lbmiBdo+EZ2VYYndpfod7b2lvZ2ZdVVhvZ46od4F6fJCOeXVvfm9ydXmPgHeVdIWCf4WHdWpydmdobltsZF1tc19nYWp4aHttWm2CcnNpb4B+eXdgd4SEd4+Ecohxb3mAcmNxaVxvd2RxdIh8eGJzgHBnanhzcmx4d3V4ZIN7f3h2cGRjY258fWtsVWliZlNLa2dPR1JrRWF4Z2FNU3FcSk1UWWVrd3tlXm1xaWRdVmBVbm5XS1NoV2ZeWE5VbFRKXHlfW19rXV1bY2VgemhsYW9vdW5veHV6mH13gIF6gH+Hhnp5eoN+gZOEcXR0f3l2dIWIkH2AfJBrc5WAe4KfhX6HfYB/hoKAint2hKyff3qIiINrcoF5dYCAgXNuhm58f3OJgGpvbWRkWF9aWVpVYmpnW1pedYJpXm1sXGFWXFxsgWVxdH1paV1rdnZndHdybYV7fX15dXJseWhpeGZdZHNoeneSgWNjVGVwZ4KFd3dmaGpgV1ZZZ2OPp25+d4CLjnpwcHxmeG96jXx2jnGEfX5/hm5kdnNkaGhca2Jdb29bZ19tdWR6aF10gG9ya3F7fXV1YXSFinqHh4B/d3J1f3VhcG1ZcXRicXKFfHVkcn9sYWx6b2ppe3l2cmaFdnt6dXFlYWVtc35pbFRpXl1US3JiUEZWYUdidmdhS1RvV0pMV1hna3Z6ZGVucWZjWlddWXZlVUpcY1doWFlJV2VRSGJ4Wl1fbFteXGFkXn9pamBvdHhub252g5d5coGAfH+Ii4Z+dXWGeYeMfXN1dYJ5enqCjI59foSJaXOWgXqKnX1+hXqBen98hohzcY+ujHt7h499ZXGHeXN8fHVxboVse35sj3picG9iZV1lVllZVmNma2BdXHOFaFhwblpeV1pcbHticHZ2bGJbbHNzZ3V1cGyEeX6AeXdubnRlaXRlW2d1ZnZ2kXpfXVJmZmuDgnR9YmNpXFRYXWJjj6VoeHSChZB4bW55Z3dtfIV7dYhygHh8eH9oZXZtYGZgXmpfXXNrWWVdb29iemVbd3trbm5vd3hzdGRyg5J+h4KIenZvcn1zYnhkW29wYXFxgnxzZnGAZF5udmlkZ3l7dW5vgnV0fXNxYl9mbm99ZGpTaFhZVE13X1FKWVhIYnVkYUlUbVNKTFpXaWxxe2JsbHNjYVlZW2F2W1NMY11YaVNXSFlhTkdpdVheYW1bW19iYl2FaGhhbnh5bG9qdoGQeG2CfoCBkoiEgXZ0iXSMhnNxd3WCd3x9foyPgH6TfnB3lYN8mZJ5gIB4eX5/dIiDc3CZont6f4mUeGR1iHhzeHVrc25+bHl8cJFyXnBvYGdibFRbWldoY21mXFxxiWVTcm5bWlhYYGx2Y2l1ampeWm1zcWxzc3NqhXx+f3x2bm5sZGlxY1tqcmR0do5zW1dTZWFygH9ygl1iY11TWmBbY5GeZXJxhYSRdGxqem1vcHt8fHGAd39yenl5ZGV1aF1iWmBnW152aFdiXXBoYXdgW3t2amlybndzcnRocIGUgoZ+hHZyanB9bWZ3V1xrbWJxc4F6c2Zvfltgb3FiX2pxfmxsdX5zcXhrcGFcZWxsemFnU2dVV1JQdVtRT1lSSWN0YmBHVWpQSVBaVWtra3xlbW9xYVtaWFlscFdTT2ZXV2lTVEZaXE9IcnVYX2NtY1hgYGFdi2pjZG15eGtvaXV5hntrg31/hJl8goR5fYhuj4Zxb3d6fXSCgnyLj4OCl3R3gpOFgZ+JdYCAgXN/gnGHgnVvopd0e4aLhntld4pubntvZndwemxzdnKMa150bmFnZWtSXVtVZ2FsbFpccIxkT29uXVZYVWdqdGdidGVlXVludG5wdXV5a4d8f3yIdo9zZGRrbmFcbm1jc3iHa1pUVmNkeH19cYVcY19jVFpgWWOVlWNucIOFinNqaHtvZnN3c3xsenR1b3l+dV5mcmNbXlZhZFlhdGVVX2BtZGFxXV1+cGhpc3FzcHR1am2Ek4GIe4VxcmZufXByb1RbZmpmcXSBd3NibHZVYnFqW19vZn1mbXd9c3Nzam1gWmRqandeZlRkVVZQVG1XUVZTUEhkc19hRlhpTkhXVFZtaGR8aWt4a2JXXFVbdGRTUldoUVlmVFNIWlpQTXh3W19lbGlZYmBeXo9uYmZreXVub2h2dn9/bIN/fYaXe3+IgYp+a5OIcmd0gHt1gIN9iI5/i5NyfIqRhYefhnt/hoxzgYZzfYN2bqWMc4GNi3Z3bXqMYGR8cGZ4cnlsbXF2gmdke2xjZmdoU19eVWdfbG9bXm6NaE5pbWBUVlNvZ3NsZndkZV1YcHRscnp3cm2Ie392nHp5a2FlbG1eYG9qZXB4fmdaVlhgbHh8e3CDX2JeZ1ZYX1dkm4hia3GBh313a2t5bVx3cWx6aXZzbm97gHJYam5fWV1VYmNYZHFiU15haGJibFpgfmxma3N1bm13dmtohYt+iHqIbXFlcH1tcm1jWWFoaW90gXRyXmlsUmVxZFRibmJ6Y3F3e3ZrcG1rX1hhZ2h0XGVWYVZTTlhlUk9cT09IZXBdY0ZZaU1JX0tYbWRfeGhufmRgVF5UXXVcVFNgZk5dYVRTSlxZUFl1dl1fZm1oWGNhW16OcGNnandxc25ndnR6g3KBgnmIjX58ioiOem6QinRsc4J0f3+IhYaRhJWPeX6Mj4eRm4SAfIyEcoCBc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY2NjY2Njo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjYyMjYyNjY2NjY2Ojo+Pj46Ojo2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA+LjExMTEvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJOpa+tra2usH9rbm5ubnFKLDAwLy8sSYWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMjy0aHR0dHBpohYKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1M0GptrS0tLS3fGVoZ2dnaz0aHR0cHBg7g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYeHiIiIh46QkJCQkJCMh4eHh4aHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho+QkJCQkJGLioqKiomKhoODg4KCgoSKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46RkpGJh46KkJKTkIqRjo6OhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIuLjIyMjI2NjY2NjY2Njo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOh4qJiY6IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI+Gi42JkImLj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCQj4mIjImPh42Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhomMiI2Gj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2JjY2LjYuOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx+f39+fn19f39/f35+f4CAgH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYSEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUlJSUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlZWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fn5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f35+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjI2MjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e318fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESElHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dXZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaGhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3Z5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUtLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFRVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLSkhKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRUA+Ojs+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozs8PEhMPT1BQT9CQz1BRERGQ0ZGREdJSEM/QD9AQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgIB/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Oz07Nzg7PD49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VzcXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk3OjpAPzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0/Pz49PWppPj09PTw8PDw7PDo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMS0lJSUlLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFCPz0/QkREPz49Pj5AQDxKeHNMPUNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRkVKPzw7Um9tZ2V4c0g4PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJR0hISEpJSktKSk5MSUlfcHFycnJ0dXZ6e319fH5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgXZNTk5NTk5MTE5QTkw+QTw8PT8+QkM/P0FBQUJATXpjPVeBhYaGgnlyRjg4ODo7PT8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISkpKTEpGRmdwb3FxdHZ1d3t8fX18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBe05JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQz9Wd3tnfYOCg36CfnZHPT0/Pj0+Q0Q/Ozw9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wb3F0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRUNFQFd1dH+BfYKDeYGFckRAQENAQD9AQD49PD1BRUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFATnRyfn14goWBg4ZfPUNDRUA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtNSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFZneAgYGEhYeGiIRLQ0VEQ1d1homKflhHSEpMTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhGSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdYc4GEhYWDhYiIjWU/QVZ0h4mHh4aHgldJTE1MTU1MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTEpYgoWGhIGChoiKfFRshYeGhoaHh4eHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJS0lJR0hJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3R2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSmOGhoaDgYOChISDg4WFhISFhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpKbIeGhIGDhoCBgoODhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5AOzk5OT09Pjw8PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlohoOBf4CDhISEg4OEhomKi4uLiomKi4yJVDo4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3NTg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDRXKFgICBgoODhIODhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo5Ojo6PDg5ODk3Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PUFJXa3FydHR1d3l7e3t8fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7QjlGgISAg4SFhISEhIaJioqIh4eIiYqKjIqJiYx6Pjk4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw7OTo8ODo6Ozo5OTk8Pzw9QUJESUpNS0pLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/PVSFg4KDhYaFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQUI+QEJAQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQEA/P0E9Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHFxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQkFHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCXYeDg4WGhYWEhomJiIiGhoaHiImKi4uKioqLiotePkRHSUtKSUZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREVFQUZFRkVGRkRAQj89QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp7fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBEREVhh4ODhYWGhoaIiYmIh4aGhoeJioqLjI2MjIuKiohXSExNTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT9CQ0hISl+FgoOFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpPTU5MTE1LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9/fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg4PDs8PTo/QD5AQENGSkpQZ4ODhYSFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpIR0VKSERKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VucXV2d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHR0I/OD9AODo8OD0+Oz1BPj9ARUlLTVZzg4OEhIWFhoeIiIiIiIeGiIiIiIiJjIyLjIyLi4uLi15RUVBNTk1LSkdGQ0dKR0xKRktPTEtKSk1NTE9QTkhJS0xPUVBQUU9PSklKSkxKTEZHSEdGR0lGRUVCQEJCXG9yd3h5enl5eXp6e3x+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FITE1RV3mFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdVUlJUUk9MS0pFRUZLT05PV1ZRUE9RU1JNU1RPTVNMUFNVV1JTUVBMS01NTUtOR0dKRkZISkRERUVCRENjcHV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JDRlZORk9RUVVZfIaDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7OlFTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUVBOUlBQUFFLTEtHSElIRUZJSElISWpydnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/gICAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQUVCQ0dFREVMWFJNVFZWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD5AVlVZXGRgVllicl5dVl1aVkVRWVpbWV9UWWdSVVZYVVRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3l5ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLeW5wWFpbWlJTUlZWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lIWVhZXF1ZWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af4CAgICAf39/gIB/gHh5fVlOS0lJSUZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxYU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpbWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllabnJ0d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVVNUXlpYV1dXemtYWlxcXlNQUFBJTk9XVlhaWmRxc3Z2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcXleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JQUU1LUlRSTU9ZUU1OUVNVVU1RU1JQTkxMSENJSFJUVVpcbXJ2dnVzc3d7enp7e317fX19fn19fX59fn9/f4CAgH99fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZRTElMSWFsknRQUVNOUVJRUltSU1JRUlVVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkNDQ0NCP0RQQkRAQz5CSEdWQEhOTUddaVBIRk9GREVGSEdIQkNIR0hKR0NCQURAT1BNUmRzdXZ1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZWJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPj46Oz5AQD8/PmtQS2FFRkhJRUI/R0xOR01RVUlCRT8+PD08PT0/PT9BQ0I/Pjw9Qj5KTUZVbnV1dXN0dnh7fHp9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGpqZmBbUVJaXFleSUpQUU5LTFFSUVRWVFdRUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9enh6fHx4d3hkQkBAQT06QkNBQURCW1xPe05PT05LTE1PT1FMS0xXTUhHQEE8OTc3NTk5PTs7Ozg5ODk/O0FIP1x0dXV2dXZ3eXx8fH18fH19fX58fn19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5gZWBdXnF2a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSUVFRkRMUU9hV1JYUVBTU1JVW09PUVZQTUpDRj46OTY0ODY5Nzk6MzY2Nzk2PEI9ZnR1dnd3eXl7fX18fHt8fX1+fnt+fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUxUVFNRUVVPTFJTVFdYVFRYUkxYWVpWWFhWWFldV1dYaHNrXVZhc2thYV9dZGBfXllVUE1PTkxJSEpLSUhGQ1BPU1pXVFRNUVNZU1xlVU9TVFJOS0lIQz9BOTk4ODk3ODg0NzU3ODU4OUduc3V4eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RVVVVVV1BUVVdUVVJdbl5STllfW1ZZO0RVV1RbZkpMUFJST01NTk5OTEpGUFBVWVNUTkpOT1VTVFxWUlVTUk5NTElISEY/Pz06Nzg3NjU5OTY3NjY1V3FxdHd5ent8fX19fnx9fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwb2ZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0pIT1BPT01SSk9QUFBOTk9UTE1JUE9TVFUyPFhNSUFRPWNgUVNRUE5QUVBOTk1QTlRSUFJNSUxLT1FQUVJTVFFST0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUJGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+M0A+am9hUlJRQEZUUVBRUFFOUU9QT0xKTExPUE5OUFFRTlFPSkxNTUtHRUVEQjs9PTw5PUc2Njc3RG5xdXd6fHt8fH18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxFR0NPUkM4RU5TXWdTUVNBR1VQT1FRUE1NTkxKTEtMTk9PUU1PTk1JTUxJS0xMS0dGRkVEPEFBPjtARTs8ODlUcXJ1eXt7e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa25xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT88PUFAQj0+RUhHREZGSUdLSkBGQUFARkhFSk9IUVJhXFFQUk5TT09PTExPTUtNTE1PTltXS01RT0hKSENJS01MSkZGRkU/QkM+PEJGP0I/QWRxdXh7ent7fHt6end8d3l9fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPjs+QUBAPkFESUVDSEdJR0lFQkI/PjxDQUFHSURNT2FlUU1PTldLTE1LTE1NTExLTk5TZE1KTFJJSUlFQUhLTU1OS0dJRkJBQkA/RUZFSERLb3B3enl5e3t6e3p3dHh1eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9IS0U/Qj05OTk6P0I/PEFCQkFEREdLRkRJSUdHSENDP0I/P0BBPkNFQ0tOUVRMSklNVEZJSUpMSktLSUlMTU9QUlBLR0NLR0NCSkpMTU9OSUpJR0NDQ0RJSk1MSVpzbXh5eHp7e3l8dnJwdXJ0eXl2eGpxb2tsbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FqcWhlcUhLQ0ZISEdKS0lKS0RHQj0+PTo6OjtBQj89QkNDQ0hGSkxKRUlJRkdHQ0M7QUBCPkBAQ0VDSU1QR0hLRkhLREhJS01ISkxISEpMS01dUklIRE1GQkVLS05NUE5LTUpLRkdHSk1OUU5MY25pd3Z3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRvRktDRkVHREVFRkVHQkNAPjw9Ojs6OkBEQD5CQ0VFSUZKSkxGSUlHRkZDQjtCQ0M+P0NDQ0VHTE5IS05IREhFSU1OTUdJTEdFRklJTE5LSkhFTkhDR01MTk1QTU5OTUxJSEpPUlFSTlJmZ2Zyb3N4dXt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSUNFRkVCQ0JFQERCPj8+Ojs7PTo9P0NBP0FDRkdKR0lJTEhHR0dGRUNAPUVFQj5BQ0NDRUdISUdNUElGRkdLTk9LRkhJRkVERElJSEtJR0hQS0RKTUxQTlBOT09OSkpJTVJVVFJPV2RhYW1ncHJvc3l6Z2VoaGNpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0JBQkQ9QkE+QT06Oj0/Oj4/QEI/QEJFR0pGSkdJSEZGR0VDQkFBRkZDQkJCREVER0dIRkxRTElPSkpMS0lHSEVGRURDSUhIS0pIS1JNQ09PTlFQUE9OT09MS0tQVVdWVVNYYF5daWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Fya2tzTUZGRUhCQkFERDxBQUBDPDg5PT46Pzw/Qj9AQERGSEVIRkZHRkVFRENFQ0RJRkNGRUJFR0VFRkdFSk1LSFFNSktISElFRklIRUNJSUpLTUtQU05EUVNRUVJPUE1OUE1MTlNXVldYVlheW11kYGhiamlna19lZWdjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNSEdHSEJCQkZFPEBDQkQ8Nzo9Pjs+OkBCPj8/Q0VGREZEREdFQ0VDREVGR0pFRUlHQ0dIRkhGRUNGSkpHTUpMS0lKTEZJSEtIRUtLTE1OT1NUT0lTVVRRVFBRTU5RTk1RV1pWWllWWl5aWGFgYGBeaGVjYGRlaGdqaGhqZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2eHBsdXBtc3Vub3NzeU5JSEdJREFDSEU8QEVDRT04Oj4+Pj09QUI9Pz5BQkZDRUJDR0RDRUVGR0dHSUZISkhDSEhHSUdGREhLSUdLSE1LSktMSExKTUtJTkxPTk9SVVZPS1VWVFFUUVJMT1FQT1RZWllcWllcX19eYGNdXGFja2JgZGdocoVoZ2lmam1ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cmh1cWtydGxxd3F1TUlLSEpFQkVHRTxAR0REQDk8PkBAPz9CQjxAPkFBRkNFRENIREZER0VISEZIR0lLSkZKSEhLSEZGTEhISEpHTExMTExJTUtNTk1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXF5gX2FgYmRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3b3ZKS0xKTEdCRURFPEBGRERCOz8/QUFBQERBQEI/QUNIQkVERkdFSUVGRElIRklISkxISEpKSUxKRkpLSElKSkdLS01NSkpNTE5PTk9MT1BSVVhWTU5UVlVTUlFQTE5UU1JXW15eX11dYGBhYWFgYmRlYmNpYmRpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXRzcHN2dHV1d3Z1dXVlcXNrcHFqcnZvd0pNTExNR0RDQUQ8P0VFRUM9QUFDQkFDRUFDREFBRUdDSEdIR0VKRkNHSkdHSkZJTEhJSk1KTUxHS0lITEtOUUtSUUxTTUtOTk9QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhX2BiX2BlYWFjaW5oYmloaG14dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnJxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MS0xHREFARD4+REVGQ0BDQUVEREZDQkVHQ0JJRkNISkpISUtGREtKR0hJSUlLR0pKT0tOTElMSEpNS1pmSmRcS2xSSE9OX25VbHNbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZcbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPz1ERUZEQ0NCRUVFRkJGRkdDREpFRUpMTEpMTUdHTUpISkpIS0pJS0pOTE1NTExJTE1MW3NiZHBebGxVTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xwdWdwTUpyeXZrYmBrZWVteG1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dHRibXVrcHBscnJxektMSUlHRURAQUI/PUJGR0JGQ0VERUVEQ0hIR0RFS0dHTE1NSk1NRkpOSElLSklMSkpKS01NTk5NTUtOTU1bcm9vbnBwbGtOUFFsV05pYnRycGFtb3ZcWWxRXG1tWnFta29teHh0c2lwXGBzbHFqVXV5eHBjXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEVFRUJCQj0/QEZHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5ITE5JTEtJSk1JS0lKS09QT05NTE5NTFxoZHVdbHFXbE5PUW1VWmtea2x2YWxkdFRlY05tWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2hhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHdJTUdJREVEQ0FCPEJAQkZER0ZMSEVDQ0hLSEhGSkxMRk1LTFJSTEdNTUhOSklITkhKSklITk9NTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210Xm5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZ2Jiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dEhLSElCRUVFQUA+Q0NCR0NISU1JRkNGSkxJR0ZKTUxGTkpLV1JLR0tKSk5JSEpMSUtKSUhKTE1NTUlLS0tTa2JaaV5famNyclpfWWpvX2VlVWtfY1thYlFgbWhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW52cXJ1dHdzSEhGSURFREZBQEFFRERHQkhKTEhGREdLTElFRkpPTElPSUxbUUpGSEhLTUlISkpLS0lISUdLS0tLRkhKSkxMTEtJS0xOVFtcVFBUTVBPTk9PVlFPT1FPT1FKSk9QUWRxaVRZV1tbXFVZW11YXVxcY2ZhYWZiY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl4eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUM/Q0dERUdDSUtMSEZER0tMSERHSVBLTE9LTFdNSUVFSElKSElLSUxKSEZIR0pHR0lFRkxISUtOTElPXFdeT1xbYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXWJYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUFDREJESUVHR0ZLSktIRUVKSkpGRUhIUEpMTUpNU0lIRUFIRkpJS0tJTEpJRkVKSEVGR0VFSkdDSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5fXF5TW15jX1pdYGNgWV9iW2BeW1RYWFpfXmRiYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JREJCQ0ZHRUdHSUpKSUlERktLS0VGSElOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlFRERFQUZKREBKS0lPW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1FbX2FhXV5jYWBiYmJjY2VaUllWVVxbXmNgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGQ0dFQkVHSEZHSElGR0pHSEZIS0lMRENLS05NTExISkpISkc/R0ZOSktLTEtLS0lHSEREQERBSElBP0lKR09dYVpbZF1fVFFSV11cXFxfWktXXExSXFlJTV5QUF1fYWNjY2NiXGRjYmRjZlhRVVRTXFhbYV9eXmFhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUJASUZDRktJRkZGSEdHSkZGRklMSk5FQ0tKTE5KTElLSkhJR0JISFFNS0tPTEtLSUhHRUQ/REJISEFBR0ZEVF1ZXlhfWV9bXVVYWFBdXVFLSldeWF5bXVZaYFJRX19iYmBgYmJgY2JiZGRiWE9RUVJbU1xeXV1dX19fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIQ1FKRkhISEVGS0pNUEVHSUpLTkxMSUxLSUlHREhLUU9NTFBMTUtLSElDRUBEQ0hHQkFGRUJWVUVcVF5TVl9YTlRVTlpbTUpLVWBhW19YX15hXU9ZYlxgYF9iY2JdYmJXX19UUE9QUVhSXVxbXF5fYGFmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElSY1BEVl5JR0dIREZNSlBQRkpJSktOTEtLTEtKSkdFSk1RUU5PUE1OTE5IS0FEQEJDRkRDQURFQUxIQ0xMUE9PTEZNRkdJSkhHTExNT1FJTE9QUFNQTFFTUlVaWVdZWFhkVk9TVFBQT05QVVRcWVlaXl5hYWVmY2hka2xwc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01eTEdHWE1ISEpIR05MUVFJTEtLS05OVU5PS0tMR0dLUFNTTlBPTk9OT0hLRWBEQ19MRGZjRE1bSF5cc21PTVZtWUxDUGBVbFdnSl1YVl5ETFFVTE1UVlFSVFhXVFhVVFxUUGZaaGhkWVRrVFdWVVtcXGBgYWJiYmBmaGZubGhyenx9foGEhISDg4ODgX18enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1RJS0dhVEhKT0pJT01SUUtNS0xPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpQf1FJfFlZcnNYUG1IcW5vYVZQcXFzUEJrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVpfVlVXf2p0dXVfYXZfWGJcXGZbX2FhYWJeYGJnbXBsYHB3dHiBgYKDhIJ/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0lMRlJWTEtPSUtSWFdRTk9PTFFUTk9RUEtMT0dNUFJaWlRRUU9QUFBKSFp4XVR4ZGhZUlRRdmd0bHBibmZrUXJPTXdtanJwc3JxcnBvcIBdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3NzfH1vfnlvf3JgYGBiYlphYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tISlBPTU1KTlZeWVVMUVNOWVlMU1NSTkxQSVFSVFlXV1BUUFBQUUtHZnhsY3hxbVpKTFV5cHVtdWJudlBkZUlmdnFtd2+AamZ4eGlXclFoem1panp6fWx4en9wZ29YdnZqdnVwgGFzaH1pbHh8b19fX2NiW15jZGdpamRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdnpufH15eHJuTkpTdE5EQkVQUElLS0pMUE9PT01QWmBaWEtUV1BhXlJWUVlTTVBJU1RVWFdXUFVQT05SSktyb3V1cXVxZGhhVm5McXBeRmh5V3ZUTGh4fXhgeXtzbmFebW9kUmdydW5teXB3bHZzdHFsbVxzfnprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZWVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5fm5xcGp7enRyb21LS1tWSEdFR1JQSkxNS0xRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlVXbE9ubHtzYWpnf3ZVS1draH1sbWx4YFtwenteYHpzY3JveHFoZHxpcntdVEtsX3Z1a2l1e3ttfnhrfHBdXl5iW15iZGVnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3Nya2htbXJ8a21oa3t0bW1rbU9HSktISkhIUlFMTlBNTFRTUk9TU1dSVlRQV1pWVlRUVGFgUU9OS1RTU1FVVk5OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWFFPUFVUWFhYW1tVU1NXW1dYV1pPU1VXV1hRXVhWXVVTT1hSV1dXWFpgW2dyXltcW11dX2NaX2NjZWZkY2NiWWNjZmZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLS0xNS0pUUk1RUVBMVlZUUFRVWFVZVVJaXVZVVFdVWVhQT0xOV1RRTlVTTlBNTFFQS0pRUktRTUtLT1JUUlFRU1NJSE1OT1FSUVFRVFZSWFdcV1NTUVJVVVZTWlFOU1JYVVRZVlRZVVNSVVNUVVhZV15aX2FdXFtaXFxgY1xdYmNkZ2VkZGFZYGFjYWJpaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRkZmhQSktMT09MTVRRT1RRUU1YV1VUVVdXV1pWVFxgVldWWVVYVFFQS09YU1BOVVBOUU5LU1BNT1VUTlFOTU5RU1BUUVNUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdXV1lbVE9UVVhVVFlVV1lUUlJXVVVXXFlbYF5WWV9dXl1cXWFhXltiYmNoZmVkYlhgYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl1dY2hrYWdmaGZkYGJjYVBLTUxQUUxPVFBQU1FPUVpZWFdYWlpYWFZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBRTk1RUVBSWFRSUU9NT1NVTldSVFVVT05OUVNVVVRUUlRYVlpdXFpWVlFSV1hWW1tXUVRWVlVWWVRXV1RSUlhWVVpfWl5gX1ZeXV5gXFxgYF9fWmJiZGhoZWRiWWJgYl5fZmRkYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9VXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTFBTUlVaVVRQUExQV1ZRV1NTU1hNT1BSVFhVVVVTVVlYW15dW1tWUk9VV1ZbXFdRVFdVV1hWVFhaVFNRWVdWXF5bX19gVWFcYGFdYGJfXGBdY2FjZ2lkZmBaY2BhX19lZV9gY1taXFtcWVpZWVdcWVxbYF5fW15eYWBfYlxZYFpRTk9OVlFQVVNQVVRTUFdcXFxYXlxfV1xeanF3eYBjXFtWVlhSTk9XU05RUVBSVFJMUVRTWVpXVU9STlNYVlRTVFJSWk9RU1NWW1ZWV1RWWlhdXlxcXlZTTlRWVlxcVlJUVlZYWVNUWVxUUlJcWFpdXl1hYWBXYltjYl5hY19cYmFiX2RnaWRmXltkYGFgYWNlX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQW11eXVtgXGBVXF1panJ9c2xnXFVZV1FPUltTUlFUUlRVVEtSVlVbWVpTT1NSVlZVU09WUlNaUlRVVFhcV1hYU1hcWF5dWVteVVVOVldXXltYUVVVWFhYVVdZW1RTVl1ZXV1hXmNjXllgW2ViX2RkXl5jY2FdZWZpZGZeXmRhYGFiY2RfYl5YWl9bXFtYWFhYV1taXGBdW1tcW1hZW15WXlldUE9PUlpQWlVVV1ZTVFReXmBeXmJcYFVdXmJreXRsfWxaVVpVUVFTXFRVVFVUVllXTFJaVl1bXFJPVVNYVlZTUFhSU1dTV1ZWW11YW1lVWl5YX15ZXFpSV1JZWFlfWllTVFZaWVpWWFlcVlVaXVxeYGFfZWRdXl1dZWFiZmReX2RjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWlhWXVpdXltaW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9gYWFgY11gVV1eYmVldYF6aFhZWlRWU1ZcV1dXVlZXXVhQVVxZXl1dVFNYUlhWU1JUWFJTVlNZWFhdXlhdW1VeX1hfX1hcVlJZVFlaWmBYW1RWWFtaWlhZWlpYVl1eX15jYmFlZV1iXGBmYmRmZF9gZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWltcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWU1xUVldZV1ZcYGFiY2FkX19WW2BkYV96dW9oWVxaVlhVV1taWVxZWFlgV1BVXltgYVxUVVhQVVZVU1ZWUlNVV1taXF9eWl9cVl9fWl1eWV5WU1lXWVpdYlldVVZbXFtcW1tZW1lZXl9gYGRiY2VlYmRaYmZjZ2ZlXmFjYGNeY2NpZGRnX2deYmJjYWFgXl9YVFpaWltbWFtYWFxbWltXV1pYV1xbXGBdVl1dU1BWWlZWWlVZVVhXWF1fYmFkYWRhXllZYWRiYGxmaF5cXVtXWFhZXFxcX1tZW2JWVFdeXWFjXFNWWVBWVlZWVlZUVlRYXFxfYGBdYF1XYF5bXlxbXlhWWFhbW19fW15XWF1cXV5eXFpcWFtfYV5gZGNkZmZmYlljZWVoZ2ReY2FgZWNdZmlkZWlfZl5jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJNUldZVldaWVtcWVdZXmBiYWRhZGFdXllhY2JfYWBhX1xcXVhXW1tdXV9fXFpdY1hZWF1gY2RfUlhZUFhXWFhYV1ZXVl1dXmBhYV9iXllhXV1eWV1eWVhWV1tcYF9dX1lZXl1eXmFdW1pZXF9hX2JkZGVmZ2diWmRmZ2lnY19jXmFmZVpoaWNmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWVdaW1pZV1hWVVtdXV1gYGJieEtXV1xYV11cXF1aV1xdX2BiZGJiYV1gWGJjYmBjYWJeXFxcWFdbXV9dYF9dW2BkXFxYWmNlY2FSXFlPWFdZW1pZWFpZYF1gYmJgYWNfXGJdX11bX15aWVVYXV1fYF9fW1peXmBiY1xbV1tdYGJiY2VkZ2ZlZ2RcZWZoaWZjYWJcY2dgXGlpYmhpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldXWE9YWl1hY2Zmcmt/SllXXVpaX11cXlxYXVxeX2FjYmFhXWJbYmRhX2NjYl1cW1pXWGpxYFxgX11cYWNfXllZY2VkYVRfWlFZV1xdXFtaW1tjYGNiY2BiZGFgY15gXF5eX1pYVltfXVxhYV9dW2BhYmViX11TXF9gY2RkZmVnZmVmZV5lZmhoZ2RkYFtmZ15haGhiaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7enp6e3t7e3t7ent7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7enp6e3p6enp7ent7e3t7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYiNsbW0tLSzs7u+vr6+vsGhioyMjIyNiX5/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMi5G7wL/AwL+/yczMzMzMz6qNkJCQkJKLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSDgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh4eHh4eHd3d3d3d3d4eXl5enp6d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYCBgYGBgICBgoODg4ODf3x8fH19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnV1dXl2dnZ6e3h7eHd2eHt3enl6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7enp6enp5enl5eXl6enp7fHt7fHx7fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHp8e3l8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8e3l7eHx6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3d3p7eXt3fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6fXt5fHh8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl7eHl5eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDg4GBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycnFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1tbW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGBg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgYaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/gH5+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx+fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhoaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn+AgICBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+AgH+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDgoKCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6MiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fX9/fn9+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KSkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKEhIKDgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBgIGDgYKEhYWFhoaHhoWGhoeHh4aGhoeHhoWEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4KDhYSCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Qko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChIODg4OBg4SFhISFhYSDgoSFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYaNgoKCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9/gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhISEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgoGCgoGCj5uFgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgYCCg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAgoOCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCgYB/f4WWm4iEgoSCgX+AgoGCgoGChIKBgYGBgoOCgoKDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKRkZGOjYyHhYSDg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODhISDgYCCg4qIhoB9fX17f5eciYOFhISEgoGAgYKDgoKEhIOCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWEhIWEhISDhIODhJGUk5KSj4yMioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgIaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4CGmZCGfX5+fod+jZyFgYKAgYKCgYCCgoKCgoKDg4KCgYKDhYODg4ODg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhIWFhIODg4OEg4KGlJSSlJKPjYuHhISDg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAfn5/foaenYaAiYB/h4GAjIKBg4GAgIGChIOBgYKBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KCg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAg5qhiIWJg4OBgH2BhIOEg4ODg4KAgICCgoODgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEhIOEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkJ2EgoKEh35+fX2EhYWEhYR/fX19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOGjIKAf4CFgH19e4KHhoOAf35+fn9/f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODgoB/hI2Ef319gIaBf3+AgH9/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGh4aGhYSDhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOAgIGFhIODgX+AgH9/f4CAgIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDgX+Ag4WDgYKCgoKCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiYuLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5GOioaFhoWDgYGBgYKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4ODgoOEhISCgoKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhIODhYODhIOCgoKDgX59fX5+fn5+fXx+fX19g4eJioqHh4WGh4eHh4iHh4mHiIaIh4aJiIODhIOFhISFhYaIh4aFg4KCg4WHhoeGhoOCgoOEgoODhYKBgYGBgYODhIOEkZKRjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaFgIKEg4ODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYODhIWFhYODhYSEhISEhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDg4SFg4KDgYKDg4SFhIeSkY+NkIyJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gYCAgYODg4ODgoJ/fX1/gICBf31+fn18fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4SAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+foCCg4OCg4ODgn19fn6AgIGAfn19fX1+fXx6enp/goKAf39/f35/f4B+fYB/f4CAgX+AgIF/f4CBgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn1+foCAf31/fn1+gIODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgH9+f35+fn1+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXt/f35/f39+fX5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+f318fH2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6enl5eX2Af4CBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgoF/f39/gIB/f4B/gYB+f3+Afn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f4B/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISEg4ODhIKCgoKCgH5+fX19fn6AfX19fX19fX19e3p5eXl5eYCCgoKEg4CCg4F/gYCBgYGDgoKDgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fn18ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/gICAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKDgYGBgYSDgoOCgoKCgIGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/f39/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIKDf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYOCg4OCg4OCgoKCg4OCgpKQi4iJh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoaHh4eGh4V/fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYOFhYaGhIOFhYOFhIODhIOEhISIko6MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4OCgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYKEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgoKDhYODhIWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fICBgX2Gj4F+fYJ+fn6Agnx8f3+CgIKAfnx7ioJ9gH9+gYCAgYKBgoCBgYGAf4uTj4yLjY6NiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhYaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fX19fHx9gH+AgH6Afn6Bk5GMjI2OjoqFhoaFhISFg4OCgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gIGAgIB/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt8fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjoyNjo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCBgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6Eko2MjI+Ni4qGhIWEhISDg4OCgoKDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+Af36Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gIN9jH58e3t9fn1+fn17e3t9fHp7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIqPjIyLjYyLiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+AgIGBgH99gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH17fXt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBgoGFhoWFh4aHhoGEkY6Mi4qLh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fHt+fnp8e3x8fHx9fH18fnx9fHt7e3x5e3x7e316fX5+f4CAg4eJiYmLiYuJhYiRjYuIiYeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHx8fHx/gH9/f39/gIB/fn9+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CBf358enx9fX59fX5+jIZ9fX57e4OCfX5+fX18fX19fX1+e318fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4uJjZGOjYmIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgICBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/g4OEh4mKiImOkI2LiIiFhISCgYKCgoKCgoGCgoKCgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4iCf36CkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fH19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI6NioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39+fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgYGBgICBgoKCgoWFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX9/gIB9fn+EgH5+f31+fX2KhX1+fn1+foB/fX18fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBgoKBgYKCgoKBgYGDg4OChYaEg4CAgICDgX+AgYOBfn6Af35+gH59fn6AgH+Bfn+Af35/f398f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8e3x8e3t7fHt8fHx9fIqKiIiFhYWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHp8e3x+iYaGhYWHhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh1dICAgoKCgoKDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCBgYCAgIKBfn6Af4GAf4CAgH9+fX19fXx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWDg4OEhIODhIKBgH+Af4CBfn19fn9+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/foB/fn17ent6fHt6goR/g4KCgoOChIKBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GDgX+Ag4J/f4B/gX+Af3x7e3p8e3yCgH+Cf3+BgIKCgYF/fn+BgH6BgoKDgYGDg4KDgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWFhISChIOBg4GAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fH9+f4B9f399fYGAgH59fYB/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGBg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSBhISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX5+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf3+BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3d2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5+f4CAgIB/gYKAgH9+gIF+f4CCgYCBhIKEhYaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX+AgIB/f39/fIB/f4GAgYCAf3yAf31+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn1/gX5+gIKBf4KDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32DgXx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEg4KChIKBgYKBgIKBgIF/fn5+foB+fX58f4CAgH+AgX97gH6AgH+BgIB/fYB+fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Dfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh4e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cnmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn2AgIGAf4CBgHyAf4B+f4GAf39+gX9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fX1+gIJ/foCAf36BhIKCg4WFgoJ+fXx7e3x8eXd8eXd4d3d4e3t7e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp6enhzd3VxcXJweHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH9/f35+fH1/gICAgH9/f35+fXx+f39/f319f399fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+foCBf4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX17fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYF/gICAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/f4B/f39/gH+AgICAgH+AgIGBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fX1+fn59fHp8fHt9fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoGAgYGCgYKBgYCAgIGAfn5/f4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn1/gH9/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eHN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gIGBf4CBgH+BgIGBg4KAgICAgIB9foB9gIOCe35+e3t9e3p8e3uHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYGAgICAf4GAgIGBgYGAgYCAgH9/gH5/fX59fn57fXx9fHx8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19foB/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgYKDgH+CgYSDg4SBgYOBgoKBgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIJ/f4CCgH9/gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fXx8fXt8fX19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIOBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgH+CgYGBgoOCgoOBg4OCgYCBgH+AhH19fXt/fXp9f3p5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBg4GCgoGCgX6BgICCgYKBgYKCgIGAgICCgoGEgH6Bg4J/foCDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChYaEgoODg4SBhISAg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgn9/gYSEgYN/goKBg4GCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhYSFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7fHp6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYKBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fXyBfXp8fH19fHp7fn5+gH9/gYGAgICAgIGBgIB/fX18fH18dnJ2eHl2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgIOFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODhIOEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAfICBf3x8fXp6e32Afn9/fHx6fH59fX19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISBhIWFgoKDg4SCg4KDgoOBfoCAgoKDgoODg4SCgoKCg4OCg4GCgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fX19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOAgoSEhYOCgoODg4GEg4GDg4SDg4SEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFgH6CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OGgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIKBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhISEhIWDh4aGhISEhIWEhYSEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOFgX2BdYF5g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOBhIOBf31+fn5+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEg4WEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhIWFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4Z0cHVyc3SDdnt9dYF/goOAgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHOBhH6Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW14bHB5bHV9f399foGAgX2Af32Af4B/fX18fH19fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoKEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gYB/fH99fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBf4B+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLiYWEhoeHhYSFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn18f31/f359gIGDg4CCg4GBhIGBf4GBgH1/f4F+f359f4GAfn6BgoCAgYSHhoODhoSFhYaHhoWFhYWHhoiFhYaFh4eFhoSGhomIhYSJioiGhIaGhYWDhYWEhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXp9e3x9fX9/fX1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhoeHiIaEhoWHhoaFhIWFhIWFhomKh4WEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SGhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYOEhIWEhYWEhYWDhoaGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fnt8fH1/fnx8fn2Af31/gH5+gH99fXyAfX5/fn5+f3x9fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhYaEhYaGh4eFh4aJiIaGh4eIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhYOGhoWGhYWGhoWEhIWFg4SHhYOCgoWDhIF+gIB8e31+e3x7fX59e3x+fX5+fX9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWGh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhIaGhoWGhIaFhoeFhYaGhYSDhISDhIeDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX19fHx8fXx+fXt8gX99fH18fXx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoWGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhYeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WFhYeFhIOEg4ODh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHh4eGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDhIODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXx7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiIqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoSEhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOGhYOCgoKAg4WCg36BgYF/g4F/fn5/fX58fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYB8e3t7e3x7iYeEhoSGhIaGhYSFhYWEhIOEgoCDgYWCgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIiIeHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCDg4KCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYKAgH9/fXx7gYSFhYaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4aHiImGhYiHiIeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFhoaHhIaGh4aFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15ent7fHt8e3t6e319fH18f35+e3t7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIWFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWGgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+gIKCfX5/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBhIWEhIaGh4iHhYWIhomHhYSEhIKFg4SGgoOFhIWGhIeGhYWFhoOEhYSFhoWGhIOEhIWDhYWBgIODf35/gH9/gIN/fIB9fX+CfoCBfn6Bfn5+fX1/e398e3p5enp5enp8eXp6ent7fHp7e3t8fX59fYB9fXx8fYB/fXyGg4aGhoaGg4SDhYKFgYGAf3+Af35/gIF8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhIKBf4CCg4OEhYWHhoWFhoeFh4aGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhIODhIOFhIB/goJ+fn5/fn5/hH57f3x8gIF9gYB9fYN8fn59fX57fnx7enl7enl6ent5enp6e3t8ent8fHt+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gXx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGDgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIKDgoOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf31/gnx/f319fHx8e3t6enp6eXt6enp5eXp6e3x5e317e35/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e318fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19vb29vb29vb29vb29vb2NbX19fX19fX1tbW1tbX2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNhG1wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSPjIyMjIyMjIyMjIyMiaK/vL29vb29vb29vb2+tIqKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzk4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWlVWVlZWVlZWVlZWVlJ8rqqqqqqqqqqqqqqqrJtTUlNTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pjs9Qj84PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzc5SKzExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSlnl9ZWlpaWlpaWlpaWlpWgK+rq6urq6urq6urq66dWFdXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183PXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqqNoZGVlZWVlZWVlZGRkYYayr6+vr6+vr6+vr6+xoWJhYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcXCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs/Ozs7Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMzMzMvP09PS0tLS0tLS0tLT09HNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7Q1NLPz9DU0s/Pz9PSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfX1tfX19fX1tbW1tbW1dXW1dbW1tbW1tbW19bW2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7Pypal0dHIlKfS0ceSq9HOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Pz5yqna3RmaycsNGZrJqy0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD9BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MuUiJqdxJSInJ7EkoadnM7Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RvciZmcK/yZiYxbzJl5nG0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9KXlJ/M0pSWn87RkpmgztDQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9Ozm8SY2a+fwpvaraO/ndXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDRzo2QnsPOi5Oex8uIlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0cvaqJmvz9ulmbPQ26KZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk3OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmOpZqgq5GnmaCtkKiYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU0Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2Lirocq7oaann7GkpKigr6eiqZzQ09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT056QjbbWnJGOutWakY6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHSusTV09O5x9bT07jI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tXU0tLS1dTT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdKQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5qbm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZybm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2enp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVVYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKkqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqaepqKOnppmcpKaioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnrKmkn6Kgoqahpq6mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Nec19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+qqqyoqKuwqaiqqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2r7Owq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbWh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLG0tba8vL68vL7Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGwsO5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbWhxeG95amlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsPEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcndzeWZnXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPDwcS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamddam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIycjIycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytp6q7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHOw8rKyMbMys3FxsXDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW90Yl1iVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHCw7+/vsTLyMrLybrO08jIzcjDyMnJxcXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWdkamVham1ub15ZXFZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O5uLm7vsHHwcXD04mpz8TEwcTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t73Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZ2NbWlpcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tri0tLW/u73Aub66urTAuLW3s666u7a+zLaEntK8v8G8u8S+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u766tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb2+y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKeho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xY2BiYmdqZ2ZpZWldVlZUWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS1sbC1t7W7wbi+ub+8vLe0t7Cut7W4v8+bgYq1wbrDtbrHuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaGioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVraFhYTktLS1JJTEhDOT04PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3uLStuLK2vcXFh4GAn8S+x7e5uK23tbi6tLizu8XGy8G8xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pz09OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSvsba6sb2+u8S2t5x+d4J0hJPBrHuBgpzJxs/CwLiutbW8vri6sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bnhjZ2JbY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6ujsLvU2ru6vrzGsp13Y2xkUFthfY96hYaZy87RzMrEtbrAw8i/vrW/wb/Gxr/LxsO/wbzAw8zKx8XGwLm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYGFOSE0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ8QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbPEorLbv7y9un1kb2Bgc1tUVVhsfIaIm8jIzMvNysbCxMvOwry5vbm5wMO/yMbEwcG/xcDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tby3wW9vsM3BtHpaSmRjS3B+bmBRWXiCi6DFwsfLyMHDwcDJysLAu7qwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrKvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem1zeHNncF1bXlxZUUVEQ01JQUU9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7v8d9b3akv5tVUk+DZ09cfIGDbEZrgpCsw72/xsC5wLy+xcS9vbmysK64t7/Dx8PEvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbmlbX19ZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucfIgn9uf6VzUUxilV9RUVWOlnZOZYucrri4uMK6s7u3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2ZdWlRKPD8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trjHyIqDeHSNYUxiinFcT1ZksLp3VlB+r7Cysbe+ubK1sry5vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnFsX2NhW11PSEE+PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3w8ORiH9/eVZRjpRrbVZlcGeUfnFtXoe8s7C2urW0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJtY11mWFxdUk5NQT5JQkFKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLnDopCJkH5KXpjDdIGKkF12fGlqdIq0u7WxtLWytK+su7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWyu6+UkJ2WTGKNlHZwgHpjamxzfnpznrq5srSzsLGtsLm4try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K0pp2qjleBb25qXGhfXVZZXmdjaYCXuLKts6+urK62trK0ta+qpJ6bnJyeqKieoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moq6ufpqKbo5yVkIyPj5CTkJeVlpifnp6amKaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HUE1MQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpaypscC3r2h4eGtzaFleUEpISkxRT1prbqK2qrK0rqqrr7Cys66lnpKYlI+YoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqqxo6WonqCclZOQj5GQmJCWlZiXn5ibmZqjmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUpIR09STUpORzxFQD0yPzc1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGooaXEw45gZWNyY1RMRl1JUEZNS0tTXl18tq+vs7Wqp6yropyZlI6RlpeYmZygoqKcnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWalpuXl5ihnpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeXlgYlJVYElJSktTVElSUEw5P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpefpZ6dubGFemdqY1ZIUF6Oe2xTS0dHTlRUZKuysLC4rKahnJ2alJeampCOkZWRjI6OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrG0qrKvopmcnZ6hmZubmpiZm5SWm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVtTWllNUUpOT1VMU0xBNz5CNjg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySnKKbnqOnmn1sXVRMSVWDqrGfaFBGQ0NHTV6UsK2sr6efnqKgl5GTm6CcmZeSk5+coaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuK2ytKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCepKGgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUlVIRlVWSkJMRz1LSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpmem6GhoYZuYFVQTk9cq+Dauo91YlNIQk2LmZqrqqmkn5+ZkpKTmJiWlpWMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6eopaSfnaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQldOSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqcpKB0WVJPUlJddbjSuqCpuZ6EeYmuxKOoramqpZ+enqGinZ+dmpyclJOVlJ6emJSFnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGw7zDvLezqbOtqrO0r7Ouqq+jnauntrGtorCmoaOvsa2wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cWtrdXJwaFdbUUVUSERKUEk/RUE0Rkg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+fmqCcZlBJTlBddY2yvamHotzWztTZyLSup6OjoaCepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFx83QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DDvsfGwrfDycnCwca+urS6urS7t7C1sqq6sq67t7+7uqq3rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtkaG94amRaW0ZLTEVEU0xEQkU3Oj87NTQ5OTc4Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hop2clF1LRUxTdYWztqSSicXj3NHEtaafmZybnp6Zl5eXkoyOl5eTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXFzNDS1c7Tyb3Av8O7xsXIxdHUzdPQ09PMysLGxsfKyM6/yNHMx8XHxcG8w8G+v761vrOuv7/Cw8fEx8Suv7iyuLzDwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJRENANTU1ODpCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo5+cnpZjSklNXH6q0dC2oLPTzLqvqKKfnZ+amJaUkpSWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19HX0tXW09PIzMfMzcnSzc7TzcXIycrBxsvHyMnGv8Ozs8jEy8rLz8bKv76/vcHHxMzMyMm/w7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkA8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEE/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaCld11naIOw0tra1sq6sqqjnp2doaWgnZqUlJWUiXx3cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dPU1NPP0cPQ09bY1dbSy8nO0cvGzdLK0tbW2dXX09bYztLKz9HMztDM0s+/yMfKw8zMzM7PxcbHtr/Kv9HNy8/Gyci/w8PIzszP0M/NysfNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZXJiXVJcSUpHQUVIST47QTg9NDU4NTs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaChqomBkq/O1Nnaz7yvqJuWmKCcm6Gin5ucmZWJd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXX19fT1s/V1NrU1M7P1dTU0dHM0M3T19bT1dDP0tPRydPRyNDY19jR2NLX2dXWzM/Pys3Sy87QwMbCx8XOzdHR0cjMzcDKzMXTzsvOyMTKx8bIzMrT09HVz9LM08G5xbGlqLWup5uorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52mrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqihppV7k5LF1tLVwq2moZiVl5manaCemZydkn1xZWNjX19hX19hYF9gYF9gZm5wcG5rb3J3d5zMwdLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cXR1MrQ1NXWztLQ2NjY18vIzsTJz8zKzMDJv8fJzc7Py9DNzszOz8jL0NDKzsrCycfJzMrL0dLM09HRz9DKvci5sK67uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVdFO0A9MzM8PTg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcCwqaytqaZ2aX+U09bNsJyblpWXm56en52UlpiUiGteXl5hZGJgYGFhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8fOzc3UzM7TzcvX1tDM0dTLzNDS08rO0dXS1dXKwMnBxczCyMnCzMPFyMrKz8rNzNDN08vGyM/NyMfLxcbBxcrLzM/RxtDOzc3Mz8XHwbi5vcPDvcO5s7K+sbvDxLWqmKWimZaRlZWSi5SNmpGUlI+PlIKJhXlwcWttZ2BgcGhYWGhWTEZMSVBQQjtDPjs2Nzo4OTo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCta+0qKGoZG98qNnQqpWOjZiWkZOSkZaWlpCLfGVhYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0sjLzs3G0dLQzszUysfLzs/Hx8/Sy9DPxbrEv8bJvcLHyc7FwsjAx83IxMzKy8/IxMTQyMbCxsjEvsDHy8vLzsLLy8jHy9DExci7x8PJyMLPwb28v7DByce5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3b3Rka2BeZnBhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68us3NxtDV1dna29jQyc/P0dPIwra7u62mnF5vd7rQq5COjpeQh4SEhIJ+hYV/c2BbXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMrJyMrIwcXMxsjLzcnEwsvJwcLM0MXLyL+5wbvGx76/xs/Lw7/Du8nHyLvIxsXKwL3Cy8bFxL7GvLzAw8TLxcW7wMrCxcfSxcHJv8rJxsjG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Glm6Ogm5R7dnN0ZmlaYW5sWltYUkRMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMC0w76yso1gcoG/sJCLk5eHe4GFhoB2eHVycF9bW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKxtrqysrOyscK8vLy6uMHBwsW+vbm9v7nEysXGwr3GwLi7xMm/wsm7t7u6xcO/vMHNw8a9vbXBvcO6vca7wrqzvMXEwcK2v7a1vb+6y8O8tbrIur++y8TBxsLGycbIxtDGwszHssfJw87NwcXDwL2zt7Cyp6ioubClrbCqrayUeXZ3amRnYGhvY1ZeWUpGSkZISkFFQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0crKysfNzc7RyNDG1dTW183Kz8XJxcfAuMW9q69+ZHWQtZKMiYuFeYGHh4B+hHx0dGNbXF1eYGBiY2FiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tbe0s7O0vLa9sbewta+yu8K8wcS8v7q1s7q+wLjHubS7tsHCvLi9xsHDu7Wusra6v7TEt7u1q7i9vcC9sbq2r7a6s8W8t667v7W3tMW8vsPFwMPFxsjLxcDGxrvIy7/PysfDxsLDt8O9vba5vse/rLW6tbe2jnl0eGZnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMrIysnKxNDN0s/NxcfBxcC+uLfJtamwgm1xl5qNhomKe3l+hoZ3eIJ9dGleXV1dX2BfYGRhXmRlY19fXFteXF1eWltbXV9scG5oZmpubnJ8pMe/uLi1sKusp56iqqeeq62zramsqbSvt7Cyqa6mrLK8urbDubq6sau1ubu0wrqwwLG+vLu2u8e5wratqqiwssC2uL2wsKeys7W7vKuutaWuta+7srCpubCtu667uLvAwL25wr/Hw8XBvMbCyMu4xcfFv8bDw7rExsK7xsnMy7O5wry7s4hzdnZraWFibGhZV1dbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxc/HzcHDxr/ExMPDysHJyr6/vMC6srO0w66proZoZIqSiI6QfHh+ioV6e4SBd25eXVxdXV9gX19kY2JjY2JgX11bW1paXVpaWlpcZG5vaGZnaWtucoGtubC1rqalp6eaoKWhmpylq66kqKKsqqyqsKOmn6qttbaxvbmvt6+prri0tLy4tLyvt7m1srvBssCupamiq7Gys6i9qquoq6yttLOmqK6hpK+psqanqK6mqLessbK3urq7sry9vr7Ev7XCwcfIt7/AxbfEwr+7v8TCvsTIzMq/vsTAwKmHc3RyamldYW9kV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcu+u8m2vcO+usm3wcPBtLW7tbCutLutqKeHX3GOg4iLgHt+gH54dH98c3dlX11cXF5fYF5fY2NhYmBgX11dXFpYWltbWVhaXF9ma2ZlZ2Vpa29yhaqlrKWgnKKllJ6lm5iRoaOqpKKfpqWopa2gnZylpqyyr7a3p7CrqKq0q7S6sba1rra5sa+6urG2pKCkn6axp6uouaqkp6iop7KtoKemn5ukpqyen6ejoKGxra2ssrSztLC1vLa7wcGyur7DwbK5ucOzwL2/tbi7vb68wsfEwsO+wMSgg3hwa2FmX2tvYFRZXkhOZ09UR0VKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItLW9uLrAur21oJ6VnaGmurars7O7s8TPyMvCxri3x8HMv7jJt7vFuLPEuLO+wKu1u7GrpK6yrJ+iimGCh4aGgXx5dXRvbWtqanFpXmBdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+Inamgl5abopaco5mWjZ+ho6ebn6CkpqKonpuim5+rsKyxtqOpqqqsrKS0ua23sKyzta6yta6wqp+dn6SisqSmqbitoqamn6isq5mfoJ6ZnZ+lmpmjnJudr6mrp6qsrK2xsrivuLm7sLa8vLqrs7O6s720trGxtbS/tr3AvcPBu7u9l4N7c2tfZV5kZFhUV11JV1xLUEdJSUZBPD8/QDs/PDA0NTM2Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8TDz765x7i3vreywbSxu7uruLmwoZ2oqqaWnYJlgoWGf3hybnBua2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXWFhYWFpeYmRkZWZmaGlrco2nnZSVlZuYm6KXlpGcoqKonZudpaaippygoJuYrq6trrKgpaKuq6eitbGysqyor7KnurOmtaCinpujoa2joqq1qqKjpp2mpqOWmZ6XmZudoJqXnZ2dnK2hq6ekpKatq7O0qrWws6uyubSvqq+ysrO3s66prK6yuLC6trq9v7ezsZSFeXVlXmVeW1lWU1pVS1tRS0lFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7KdpaOYpbHCtba9rbS4wszIxr/FtsG/x863wMS9s7m5sr+2sbi6rLG0rZ2Yo6iekpp3aYGDhH94b3F0cWlmZGhlY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2opyUlJCVl5egl5mVl6CeoZyWoaKppJ+fqZ2cmqunr7Cqm6OkuKqhoK6otqqmp62wpLewpLegopuZmaqmoZqsuLCioaScop+fk5ShlJaWm5iXlpeclZ+qnqqkop2jqqqwrqi0q6qnrbOwpauus7GwsK6vpqensq6xtLC8tLm3rqOUgXl1ZF5hVllXU1JUS01eTE9LR0dMTEU8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uL2unaeoo6q7wL3Aua60uMHMx8XCw73Ft8jMssHCwa28u7S7vLS4ua+vr6ebmJ+nko+KcHqAfHdxaWxydHBpaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiY2RmaoGWk5WMkpSUm5mdlpacoJyglqGgp6akpqefnZ+moKqvpp+ipLeooaGiqLSipailsKWwrau0nqCdlZWpoaKUrbGxn6KjnZ6Ym5OLoZSRk5iYkpeXmJeep5ynoaKZo6Wlq6SlsKelo6urraaprq+uq6iqqbOlpqyvtLGvvLWxr66gknp2cmRhXFpdWE5MUkhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G4rJ6lp623u7zBxbqxubXEycnAw8bGx7bGxLPCv8Wqt7e9tr26urWyq6ulmJedoYqHcXyIfnZuY2FmaWhmaGpnam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdVVFZVU1RSVWBgX2BhX2BhY2RpgZSTiZCOlJOUnZWWl6SZoJedoaairaakpKOjopyqq6WZn6WxqqCgnaWrnaeinq2sqamtrKGiopWYo5uckKupsJufop+el5mTip6RjZKTlpCYmJOcoaOdpKCilaCipKabo6uloqSqpKuupa6yqaalpqa0pqmorbO1tLm6r6msnotycG9gW1dWVVJHUU9IWltPUkpUS1NMRUZJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo8PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1yb2xvsTJrLG4wbW7wLu0s6ippJSYmZqHfnCHg3t0aWlqbGdqa21ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXV5eX19iZG2OkISRh4+Rj5qTlZOcm6Ocm6GpqauorKeopaSZpa6klJmlr6mfm5mboJ6umZurs6Clpp+io6GVk5uWlpKpqq2anJ+hoJqUkIyZjoyRjJKNlpWQnqGgo5ybo5WboaOhl6Koo6Koq6Crr6Ott6Wjo6Ksraqoq6+zt7O+tbOrr5iEdHNoW1hYUlVRRVhMUVtYTVROUExQUUlOSUI8Pz9BPzw2NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraiztq6pp6+um6morLe2rLzKu7a/rMvGxbjBzs/Is8S7t7vDyLGtuL+3vL26srOjp56UlZaUhXhzgHZ3bm1obW5tcGdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXFxeX2Bkfo2Bi3+MkIqSjZeRl5mioJugq6qmrqyor6Somp+soJWWpKinnZeQj5qerpaYqKqZn52UpaCekpCSkZOVp6ulmpmZnp6VjYyLk4aIjYOQi5GVkaCeoaOXlZ+VmqGinpSbpaWnqKigsbCmsbynn6OstKuup7C1sLm1wLGtsauQfXJzYlZTVk5SSUZWUFJRTExXTUpMTlJHTUpBQ0ZEQz5ANjU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ymsbeqpqKwq52qp6mysaW2xrS5urPKxbm6wcvQy7G2uLy+wcOxsLK3rbSzurKxoaGam5aVkoF+dmtnbG5xbnFqcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY2HkIqXiZSUmJuZnqmboKqmpaudqJmhpZuTj5+jm5eXhYSSm6OPlKOdlpaWiKKbm5OLjoqQmqSnnJWVl5uRkYeUjouBi41/kIqSkpKgmp+ilZOYmJWippmNmaSmqKahn7SyqLK3oZyit6yqraSysqa1vLWsq7GjiXhzbV1OUVFMT0NNTk5QS0ZOTkpKTk1RSU1KQUdMSEdDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLaxpaejqaWgqKWks6qissO1tbKzxsa3usPKzMazrLq9tLfAr62psJ6mrbmuq52YmZuUkoV6gW1fX2ZycHZxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFlYW11hb3N2cYWIgoiAkYSPi5SRlJ6hj5uco6GjmKWXopyVjYeYmoxzjYN+jZeWhpGZkJSOjnuZj5yMgol/ipifo56Qk5iWhY2ClH5+dImOeZCHk4+QnZqZmpGVkJ2OoqOOiZqgoaSkm6K0r6yvrJ+YpbimprGhsa6csLyqqa+qmYJ3c2NWTVJPUE1DU05MUU1CUFFISU5STUhKSkNKTEZLSzw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3i3oaO0qaalqKOmpaamprOnprTBuLC0sMnEt7nBzsW+s6y6wautw62ooqaSnaa1q6GcjpSVkY58dn1lV1ZfZ2ZpZ2huY2poZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVV1lbXWlscm1/hXx0TlhykIOXho6dl4uUkJ+YnZWUlpWPlomAk4lfO1dvfIuUiYCMkYyQhoZzioWWgXmBeoWUnZSDlY6RkIOGfZN4cW+FjX2JgZGNj5eamJOKj4mch5+Yh4iWnpqhoJenr6mtqKiflq2zoqaumayrmKi0oqmto5N9cm5gW05TUlZMRFRKUE1MRk5PSUVMUU1LT0pJTU9GSUk8NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6mno6mwqKe0wbmxtbDHwrezvc+/ua+utcKnqsWpo52Yg5SbrqCYlYWTjoqGe3J0XFFMUlVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbXBpe4J0UEJAf5WRkX2JlI2Eio2bjZaViZKIhpWGeYh/YEpRbniKkYR9hI2KhX9/bn5/lHd1dXeEjZlwUY2IioZ7fniUdmh3hoh+ioiVio2RkpaLhIqIlISajIKEkpuWnp2UpKOoqaWknpuwqqGkpJGmqpaiqpyipqiJdG1nXltIUVFSTUlVTVNJTEtPSUhGSk5MTVRLUVBPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7abo6edn6Kvoaeopaeor62qtby2uLezwbu2p7nIuLaoqLW2qrK8pp6Vjn+Jk6eVlIl9jYOBfHZvbVhNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4eBfIWMk4GSmYuPe4aPgHZ/eHNudXB0jY6Ben6Kq4V5emh2e45wcm14gYuNknh6gHuBdnJykndndYSEhIR7lYmIioyLgH+Ei4x/lIN8gZCYlZyVkZ+dqZ6foJ2gqaWfnZiNp6SToZ+Wnp6kgHNoYFxcSlZPUkdKWFJPSkxNUkpKSkxQSUxRTFJUTEVIQTw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc4NTY3NTI1MTQ3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumaOimJyftKmvqaWtrLCxqr20sru4trq0sZ+3urKqnZ2sqaiyr6GakY2UgI2bjZB+doV3e3VvbmhYS0hISEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedYN8eGZ3jZeYjY99aHmBdniAiY99hJiSgXGHj3x3e29rfq19c5CLf3uGkoF9f3RmdnyGbG9oc3yJjIiAbHlxfXBtdY9xaXGAfo5wQ4uEgoOFf3d3eouFfox7dX6Oko+YipKam6OWmZ2anZ6inZaNi6Wbj56XjpaYj3dvbWViWldXVFFKU1VUT1BOUFZLTktOT0pRTkhOT0tFQzw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjExMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagpq+srquoqbCvsau8uKy7vrmzrKebsKesm4+WnKWppKCXmY6EknmIjYqJdXB7bXRwaWxpV0tGR0VBQENESUxMTVFSUFFTVFRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF1lcHJtiKeqwH51eWN8eG98eYiQen2Lhm9tjJJ5dHhqaoCCcZaRi4F+loBJk5huaHd+gmxpY2x5hZCShmtzbHxucnuGaW1wf3ONiYSGen1+e3ZvdHOFgnmBeHB8joyKlIOWl5iakJKVl5mXnpeMg4mfkYuSjYaQln5uaW5ubldVV1RSUVlPUlRUU1hVTU5ITktNTktDSE5HRT87OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDMyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WtsKKsqqi1r66stL+rvMK/pqKZlaSXnY2Ei5ShoZiYkZOLc456f4WLhXRudGtwbGRralhORUZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUVlcYKeIYpppdHplf3Btf3qLiXaBiIZ0bJqSdHN8amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3GAfGdxcXtuk42Pe3N9fHFwbnVtgn94eXVqeYmCiIqElpOSkIuNkZSUj5eOgHmIl4iGioaAkIh2ampvaGRXUVpXWVlbTVBVVllYTklIRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTIzNDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDU3NzU0NzhpTzg7NW6SiJqRmZakqK6esp+muq+rsrDCsbvDx5qWj5SZi42FeYSQmJSNkIyPhnGHgnOHjIV6b3Jwbm9kcGZfVEZJQz88Ozk6P0BBRERFR0lMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7Ogcnx4bH1tcoOBhYF6hIaGeXKhlXR4gXN1lIc1cZ2onY6hoYSihXZwhnyHfHOMrY2JgGdmYmpucm1wg3Vpb1h1cI6akndsf3t9bXFtcIB6c3ZuY3aEfoaAhZCRiouJkYuRjIuPg3V4i4+AfoOAfo97cnBvbGBbXF1bWVhgX1JOW1pYV0xISkZKRz9DQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTI1MzQ3NDUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGTiJaRnqSnnq+VpbWqrrGuwbK7wcaWkIyUkICIfW6BkJKJg4qHj4V1goNslYiHe3R4eGx3bndjaV5JUEc+QDc0NDk7Ozw9PkBCRUhMTExMTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx+hYN/jH52opl5foaBhZmEm5xhhqqfnYuDkI56d4h+iYiNc4qXj4R6XWRxdHp7d4psZ2pieW+Fj4J6boF3dIR6cHR6d2tuaV53h32HfIiHj4CLkpeDjYWNh31xhH+EfXV3e3yJdnByc2ZnX1tbXVNbZl5XUVVYW1VHSkpETEc/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4NTY1MzI0NDAwNDY0NTU1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPTIzMzMxRX5XND05XIx4ioCUjJKdnZ+mkaCroLGor8CxusW6lo6RlId6hXZrf4yRgn2KhI6MeIOAc6GEi319gX5wgH56Z3ZrUldMQEUyMTEzNjc2ODg6PD5BRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHF8j4x6fYmHfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSRqIeAmJiKnHNtfIGGh32OaGdoeH5uhYeChXGEhUdrgHdyeXZobWtfd32DiX+IhYx6lZ6biYuIkX96dYt2fHhtb3d+f3NzcWtbXl1bY2NYZmVcVVBQVllQRExLRk5JQ0ZDQ0FAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWIkY+WmJKXoZ2soaa4r7O8s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jV0tCNjAuLzIzMTIzNjY4Oj0/QEJFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgYSChZGTfoWIkYGalYKgoZeVm5qlrZOau7Gnu8fDqIqMoaWPlImBkXtyhJ6fkZx/doWFio+IkGpob4OAdY2HhItxhoJ3h4B7doV9bnZ1Z4CUj4aJiIiIh6GroZaJjph/e4KJenpvZ2t4fnl+cmpkXltbXWlcYWZfWU9LTldSUUlQSkROR0NKREJARERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmeIN7gIyAgZGPi5qbpJ2hrKarr7CXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46DgIGMi4KJjYN/iX9tcGpdQkE0LS0vLy4vMDIyMzQ3Nzk7PT9CRUhKTlFSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhKTEtLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyNoZ6ZhJOFgo+in5SZkoSKhY+YkZZscHWJi4KWjI2Pdo+EcWyFgYqWkoOFiHKJoZaHk4mPj5altambjZWig4eThH1/a2prfIB/gXNhXWNfWmZqXGtrXldLR09TUU5NTEZJUENETUZBQ0VHQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCCcHWHcXaShn6YlpqVn5+cp6CqlpOYnmdlpJp+hJKReYCSiJCSfYqFmZKRgoCAi42JhZCGhIiFeHh+Z01SPi8uLiwvLi0vMDAwMjEyNTU3Oz9DRU5QUlRQUVJTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6imopmhl6KVnZ+onqmrn6isqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4SUkoWcoZqamaeRkYiVopqad3p+lJiSoZKXl4GUnnt2lZKrs4mNl6B9lJ6cjpOWmaSiprawnZGZqIiXkI6BiGxzc3x+enFoYFxhX2FmY2BnZ1xRRUpLUE9JSkxGRk1DSExGRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdWBufWF3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYeYjXiCjYqOjXyKho+QjoGCgImMioSShYKGiYGAhndfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSk1PUVlthpB3lYujp6q0vbilrqysqKm0q7C3srKtu7GzvpyzxKy7ycu4xL+4paOwsqytq6SLlpiFpqagopeBppmNoqqopIeFk6ShoKqhpKmOnLGLlaOnt7uboKOwk6Odo56RpKKrr62ztaKVpauImomSipZ6e36EfWZgaFxlYl1jY15mZl5bT0NJSFRPRkhMRkpHRUZIQUtGQ0ZGQTo4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gZSFiIKcg5KQjZLayJ2Wc1aXiI+InI98hoyOiop6iIKHkY6DhYCLhYaHkoaChImGiIeHcW5hQEU2NDwyLzExMC0sKy0xLy00P0RBTVVRUlNVVVdVTltQR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcfDq7PGtq20v7O4vra/tMG2u7ukuMaptsnHtb65tKijtK2xsZyakpqfiaevq6SVdp+kl6GrsbOYlqqtqK62u7K6rK+1orGssbW8t7WutaCnqKOom6mwrbK6uLinm7epjaWOkZOgh3mBgnRYYWRWZWFgYl9gZV9aVUpERUxVUUhKSkRJR0VBQEBLREFNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFtaUWNkV3p1cYKUfYWGk3aFfoCNe7+7o7yCtJSTjZuPhIiPkomJeYaAjJOMh4WBjn+BiY6GgIaJhYqHkXp4bl1WQEVNPDY6NDZBQjc2NTAvNkNIQ1FcT1FVV1VcV1BfVUlLSkFAP0dLRkVEOz5AN0Q3P0JKSkVHV1RQXo+lraOxtMO2uMHMyba8xb20tMC3uMK1v7C4dLK0prrFpLDGubGzsbSopLW2qrGgopabopKlsa6lraynpJigrLO6oqmyurW7vsy/xcW9vbPCt7q4v7e6t7msrbCmsaqtvrC9u8LCrJm6qJSuj5iYq4l+gXpqV2JhWGpkaGRWWmNZVlRJR0dMUUdDSElBSEQ+P0JCS0BATUM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlFMQUxSV1RZVVp3anB/j4SBjoVuenJ5iGK4oZmjiZWTlpOTk42Ql5KHh3uGgY2VioCEgIl6fIuHhnyKg4GKg5V9d3l1ZU9cZEdFTDpRZGFbXlNGPztIUERaY1FRWVhZZ1pUYGBNU09FQT9JSkhFRkFAQz1FNkI+SEdLTFNaVF2Tr7i1urnJwLu9ycy7vcC7t7W8u7e+tbqyxmB1s6Wxmp6rvaqlqKuqo6KytaGrp56Vlp+YoK6lp6elnqSUoqextKeysry2wb3TycrTxsLFzMLKw8C+vb+7vLe0sLm3t8O6xr3DybCeuaqirI+lqLeJgX5xX2FhXFdhX2hmUlhhVlJVSUVFTktBPkdEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUVFJQUFFSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdaGxscZCNhZB0bXNyc4jVwLWZoI2VmJmRjpeRlpaOhod9hoOMlot/g3+CeHqLg4d7i3mBioKXf3R9emtlcHVZXVxQZWViYGVkXVtYV1xNZG1VUm1tXm9fWGdlVVlUSkRBS0tIRkhISEhCSTlEP0hLVFRWXFpbkrnAub23xsC7ucrLura6tri5s7i1tK62tplkdaierXBeoqycmKGjm6Seq6WUn5+QlI6WmJeon6afn5qZhKSdrKWqsK23sL251NHP18/JzNLMz87Kx8C/wsq9wb3CwMXExsq/yM60pLuwtbCbrLm9mn95bF1gW1hdYVpjYlFbYFNRS0NBRUZEPEBFPkJIQkBDPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpX3CXkpGUb2xvdXWIs6yhoZ+LmZyZjIyVkZuShYqKfoiHjJCLiXyBhHN7iYOGfIl0goqGlX9ze3hsbXV7aHJlaWxpZmppaGBmaWhtWm10l62kvIiHZ1tvaF1aWVRISk5QSktRTFRRSUxBSkdLUF9fYmZpYZi3x7C5s7u+trLEx7awubGwu6yzsaeqt6yNtqeem6eaT5udjI6glpGmmKWVipOTiZCJj5GRnpuhmJuVl4eemqabrK+or6eztNTU1dbSy8/T1c7Tz83FwsnQv8rJy8nSyM3NwtDSuLDEvMS6pra7xKOCbmNcXF1YYFdaZlpQXFdOUENCSEVCSTtBRD5BSD8/Qjc7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ5PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVdzkJCYg2hxb3l5g6CqnqaXjZubl4uNlZGajn2Ji4WOioqLkIh8hIJwf4eBhnuHcoOSi499cXh1bHF4fnF7bXhzbGiAcG1jaW1weWl3fX7Lv8Lfp21jeG5jW2FgSlBSVU5ZXlBdXU5RTlRRVVRcbm53gnKWrristKewtqutvcCxq7WmpbinrK6hrLSjjrGumpiYjJGUkYSOm4GNppGciYOLhIqJhIuDlJWYl5SbkZyYmZmenquspKehrKzO0tXRzczS09TQ1NHOyMPU0cjN0tPT183S0cXS1sbAzsfIw6m/uNCeeW5lXWJcVl9SXVtOT1NQTkg+QUZBQkU8QEI+RUU+Pz86PT09PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYaFindtd3B9foChnp6hi42Zk5OMi5OPloR5hZCQjYuKiJGHf4J7cn6Agod6hXWFk5GJf292c2xzfHt2fHOBd3FqgHJyaW9xenlye77Lmn6MsYN2coR2aGFqXUNaWltWZmRYZWtUWF1cYGNdY3h7f4uBmaqkpKGgoammqrG5qqa0o6KtoqOtoqexn4mmmpSSkYqSjoiCk4lrlaKNmISBhX6Rg4OTlq2LlY2VmY6FkpCdl6ewoaChpKSox83PyMLL0NPR1NLO083G1tLM1NjW1tjV19XJ1NrNydfW0cqtxMPMinJvYmBfWFNZUltPSkdJSUpAOzo7RUFEPEJEPkhCP0JCOzs5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3lygomBnZWdlIWLlomPioiOh49/d4SUmYuNiIiLiX6DeHN7fYOHd4B7h5GXgYNud3BtdX92eH1zhXx5bId2dG99doR1eXudtYw8QYrGpX6NfGllVklDZWNmY2hqZG95W19maGtuaW6Ag4mRi52eoJ2Ql5ifo6OmsqSks6CipZ6hqaCisZyGnpKSkpCLjouGg4+EfpybjI2ChIV6lH6CqZWjjJKKmJKLfZeKmpGrs5iam6ecp73Dxri2xs3S0NLQzNLLydTO0NXa19fY1NnYzdjbzsna2tLWv8zMtHd2bmRdWVJVUFlWRUZKSUVFPTo3OUBBQjpIREBFQ0FEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYXFxc4aNfJeRnYt+h5KCiYaFioKHfHiFlpeIj4OHhod6hHlxenuEhnV6hY6NnXqMcHxvcHp/cnyBcYOHgG6OenV3fXyCdX98h4iwdFipwraMkoFwbmI9XmhycHFwbnh3gmVpb3J1eHJ7i4eOlJKblqCWh4yTm6Cbn6qfoa2copqZn6Wen6yZi5qMkZKNhX2Ih4OFi46gmZOIhId+bZl5hJiGiJOMjZWMhnubiJOPrqqUlZeemKautr2orb3Gy8jJy8vPycPRytTW2NfY19Tb19PZ29bP29rR1sjVy5V5emhoW1lQU1NdSEJFSUk+QT49Nzo9Pzs+SD1AQUFBREE+Pzo4N0RCNzU1NDc5LjU2NjQzNTU0MjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYVY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw5OUQ/Q0dSa19tZGJma3aAiHGRkJuAeYCOfoOCgoV/hHx8hJeOh4t+hoeAd4J5bnt7hoF0epKejaF2j3WCdHWBfXSAhG+BkIFvkoR0fIGFenaGe4m3xqTCybiBlpuPeHBlTmZjgXqBd4aikIt5eXd7g398hHZtlJaUlY+XkIOJj5aal5emnJigl5+TkpejnZmrlpGRi42Sg4yFiYiBhZCRnpyZiYWLgYaXe4iIn5eQiY2Ki4J8oYmQi7yhmJOXmZyopqWunqe1vsDAucfJzc7FzcrR1tXU2dXX29TX2drb19va2djO28aGenlmaGRfVFdWVU1LRE1DOz09PDk6PD45PkE2Pj9APD8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozo6N0lQXVpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6inx+gH+AfYV6foKRiYSFeoWIe3V9dG58fYZ+dH+SnpGfg5J8hn54jn14iopugpqAdJiFfoGJhXx+kHqPqY+Qw6C8jJyjnH2JhH2Jc4yKfnOmmpyZlIV7j5CJhGhHcaGknYyLkJKFiIuRkpWPnZqTlZGXjYyVn52UoZSSjo6Qi36Qj46LhImSlpqfn4mMlJKekYKLf6aZiIWOgoaEgKWGioy4mJ2RlJahp6Cdnp2jrra6tau/xcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19y3eHl3amlkVmBbU09OSERMQj09Pjk5Ojo5OTw9NkA+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYGPinFyeIp7e399f3yIenx7i4eCfnWDhnlzenNtgX6EfXeGm6GbnpSSgIuIf5iHgJySboeohXqgi3yQjoOIhJx+mpGKjaOioJCkr5+LkYuFi4GShldyrYufrJyPg5ibkJCOXIOikYKMn5OVjIaIjJKTjJSVlJCMj4qIlpudj5WWkYuSlIaAi4mSjYqKnZaZo6OGk52WoYuKiI6ckIOIj4CDh4WkhoyQs5ickpSXoaGemZKbnaexuKylvMHHzcfGz8zPzM/Xz9HUrtbV2NrZ2trX1tnanm98dGdmXF1YU1ZXQ0BJRD4/Pjo0OTo7Nzo7OjM7Oz89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bWJ+koNubXeLeHl+eoF9hnx7doaEgHNwhYJ7dnZ1dISDhX1+kqajnqailomdkJSWi4qol3KKso2DppGEmZOEmYyilqCZk4manaKSqa+fkZSQjo2IlYtujbeEmsTIsp2ipZucmJaRspBjpM3IlY6Gh4mQko6Nk5SKhYqKhpaam4+QlJOHlZiEgI+LmYiNkKqXl6SjiJmelpuJj4eXl4uFj4yBf4aPpYmNk6iZl5OWmKGYn5mTnZuisrSlo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoJyf2hiXl1dTklUWUFCR0Q7QT04Mzc7PDo4PTY0OTo8OjgyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjw4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ2gY59fG1+iHh6fnqCgoN+dnaAgnxsbot/enx4eHyEh4p+iqOzp6Oqs6GWp5+lo5aVrqKDkLiVkrKZjKGhjKSbr6OknZiQp5anmayvpJeUlpWQi5iZlqDAjqPJuaubo6atmJGbnbKdhYWoopyYhYmJjpWNi5OPiIGGh4mTmJWMi5STh5SYhoSRkJx0kZiylpeloYicmpOQipGKl5uJipaOhn2MmJ6JkJCcmpmTmJeflKCdlZ6boLGuoqS3vrTFx8S9w8O/xs3KydKmzs3T0tDW2NPQ2LtyeXZdYFVfVk9ISk5EQkNFNT46Nzc6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SUVORUQ6NkFAQlM+OURPMzIzNTY1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER05bXFlJZmA7SISLentuhYZ6fIR4gYWBfnB4fH59b3KNen2BfHiGi4mGhJKnu6yosr2vpK2zs6ijorCsipq0naK4pJWtpJeprbempKOfmamXqaOvsKqZmJyUlZGXoJiau7uuyqFqtrirsJSYn6Ork5e+o16qsoKJio2Uh5F8jo59g4aOj5SViIeTl4yQlY2LjJeYkpyZtJeVq52LnJSSjpCSjJmbipGekIuJlZ+hjZSNmJmckpuYnpShoJScnKWvqKGks7irwsjEtbq9u8XHx8LRoMbJzc3E19bRy9ShcHpoXFpTXlFPRUQ+PENBQTg/ODc1P0Y8PDU8MzUzNDU0NTRCMzk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEdiYGJwSkCLin+Bc4aHfYKIdYOKgn9tfX18f3B3h3eNgYd7jY+MhoyZqsLAr73Gu7O0wby0rauztoynsq2tvaqbu6Sorbm4q6amoaKjo6ivsrGqnZykmJuXl56ipqWSpLquqcC8ra2yuaWkp36IhpytvbCDjIyLkIOPg5GPeoGIkI2OnIiHj5eNi5WXlJCal52omrGakaycjpqPko6VkZCWl46RoJGJlJujrJSWj5ScnZOgnZuYoKGUmp6npqSipLCzp8HGw6+wurbFxMK+zabHxMfDvNXRzcTKiHRyYVtZX1tNSkJMQEZHPkE/Qjs6ND5BPD01PTY+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNCNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVKSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGVHYGlnWl1ck4yMiHuHi4aDjHWGkYqBb357gX9xfoF6lXqSlJSYkJOVp7PGyb/CzMHDuce8uq+rubuXsre6ssCupcCkq6+7vKqtq6OjnqeqrrSwqpugqpuhm5WfsLSni6O6urbBvKyonLKlpKiUhY6qxMSkgouPh4iEhpWUjXqDjZGPkaGMjJSSjoiXn5eTmZWYpqCunYyqnI6Wj5KRlZWNkJWRj6GUhpefoLKelJqUn6GYpJ+aoJuglJiepaOmpqSvrqW/xMKuqLe1ycO+ts6yxL/EvLPRycjCtXR4bFxYW2lSTEhETEtLSkFBPUNEPDVBRDs6Mz04QjMzMjI2M0EwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmZaTmVcZlRjapmNl4qMiJKQhol5hpSQgXKAfI1/eIeCgZB6jaGWqJqamLq9x8jJwdLJysLNvMGzrbu+p7rAvrzEt6zBqayzu76qsKmkpaOsrbOttrWgn66epaKYo7O9qZuovcGjt7ewq5Kwrausl4eaqqelkYKMk6WViYF2ipJ6hY2SkJ6fk4+Ui4+NlKOZl5yVlaOeqZ+RpZqMj4+PlZaIfI+VkpKjmpWgopy1ppCel6SjoqWenaaYnpWXm6SjqKeisqyovMDEr6Wzt8zAua7Es7u+writwsPCwJlteWFYV1tbS0tNSkZERElCQkFETDo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Ol46ekomKf4mgk4R4hX+Vf3+QiIqQgJahma6mo5jCvsfDx8XTzc7Ny7zCt7C5vLS8y7zDwbW2u62zv7m8rq+ooKintq2tqbK3mp6soqehnau3uKmksL/Esb65s6eqtbOtrpeWpayooJGOkrHFp5WOfZGVfYiRmZCqmZiTk4+TlZOlnpOdmZSho6KcmJ+Yi4yPj56IWpCWl5KWpJllmKOesqWWopasrKqnm56ml5iWmJWgo6iln7arqbm8w7Wms7XLwLiqtqyyuriuqLi6vbiCa25aV1RUTkZKU05LP0JIRERIR0c5NUZNOz43PUBKLjMyMDI1QjU1UFZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz1AQkZCcUZpSVJlYkxGpZSclqGXqZaNkYOHppOIgoeCnISDlZCQk46aop+vvq6hxrzFxMbGzs7O0sq+u7axuru8v8+2xL24uLeysbWzuLOrppyrq7iqqKevsJejrqSnpKS1wLCrrLS/w7rAurOnubW4sq6Vpa2vr6WLk5WhjXTBmn6XmYWPlpqMsZWampWTk5mZpaOVn5uWmqmdnKGgmYqMj5adYEqWnJqVmqWWVJawn6+cn6WUr66rpZqgpZSTmJiOnJ+mopm0qaqzvLy8qrCyx8C4paurrbGxo6GysrSkcG1mXFpOUEtFUFBQUTtISklHSUNDPjpLVT9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqXmaCiqK+ZkZeHi6eWjomThZ+HhJ2Xjp2hmqOktci0qca6wsPHysjIzM3Gvruzrrm4wcHNtce6wbi1urCvr7O0pqObqrS0qqimrqyapK2lpKesur+oq7a3vsG/vrmzssSxub2so661rLqmiJyYppt2v6CFmZ2Ok5mai6+XoZycl5Wbn6GpnqigmpqqmaGnnpiQjZGdg252kqKalZ2inpCusqKrlaiql6qto6OfpaiSkpmciJScop6Xsaepq7q2vrOyrb65t6Cjp6ilp5ycrampjGJlYF9RS01HSE5JVUw9TUROSktCQ0Q8UVU9QUFCRE8xOD03Nz9CNzVVWE4/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlJgTVVIf2VeSEWrlZyhn7uvmZSfi5Orm5GSk4mrjYein4ykrZSjo7bGvbTBusLCx8jFws3Iwb25sq+5tMDCyrXFscG8tLqqqK2tsKKjmKq0u6appquqnaivp6Oqqr68p628tLi9x7y3tbfBsb3As6m1t6u/pY+jmJGioLyfiZqgmZeeno+3n6mcpaObnKGaqKWzoZueppyoqp6ZlY+Um4uXiYylopSdop6gtK+lpZOwq5mrq52dpKOokZWVoIOPnp6blamkoaG0tLq1rai1srOenKKlmpeVmaqhnndgXF9dSkhGR01RSU1FRkdCUkxKQkVHQFZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpnXEZDQ5xwYkdFp5ekn57DrZuXpZiZqZyWmpqPqpaVp6aVra2Zoau2xMK7vrfBwsDHxL7Nxru9ubKvuLO/wsi1v6+7tri2pqSqq62goJqrqsSipairpp6rr6yiqai/t6atvrG4tse2tbm4v7K/wbe1s7SvvqOXo5aUnJSuoJGioqWjo5+QvaSpnairnZ2gm6afvaKYo5+iqauhnZeNlZ6TnoePhY2TnqShnbWsppyWsqeZr6efmqmeoI2ZlZ+EjaCam5OlpJqYq7G1saqlqq2snJigoJKOkJaonpRoYllhXU9JR0pOTEhFRElBPVBJQTxHSUhbUk9LPUhPVTRCRjk+SEc1Q2FbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM8Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E6blJGPEt4ZWJXTKKao5yexayhn6yena6gk6OflqWgpqmrl7exo6qztcTEvb+2v8K7yMK+ysi2uLW1sLOzt8HGtr6wuLS4tZ+mrKqsnZ2epaTBpaCqrZ+kqa2voqanvbWlsby5t7bDsrO3ub+yxMC4uK6ztbWjnaWVkpShrqCZop2pqKujmsKtqZ6srZubnpmmob2inaWYq6uspqGZjZmfkp+Jj1d/lp+moaC4qqeTmLWjn7KhoJuulp6OmZSdgo6fl5WOoqSVkKausqupoaKlpZWVnZiLj5GTpJ6JYWRZY2BMSEpKTkZFQUZLPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JIRTY9dWVcS06en6GZnsOopaK0opyyqJOrpKCkn62prJ28saistbHIxcHCs8LDvMbDvMTKvK+wtq2wtK+/xLS5sbC5tKyZqLCpqZqdpaGnwq2brLGbqqKusKmkp722pre7va+3w62zssLAssezurestLatqqKmlpaVpKyin5+aqKuwr6+7sqagqaiZmZiToqS4oKGkk6+vrKWnn5KhnpWej5CNlZ2ao5+ns6amjZi0m6Oump6brZCek5eUmoCSoZaOjZ+hk4umrLClpqGcoJ6SkpqThYuSjZyef2FlW2dlSklMSlJCQ0BJRzs7Rz85OU9NVV5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0n6OfnKDDqKSqsqGjtKqVs6ynoqSyrK6pu7KssLS0xsDEw7XAxL3JxLXAyMG0q7Wor7isv8S0t66strmlmauxq6qXn6aXrbu0m6iwm62frrSyp6q5sqe6s7eyucCqt7HDvbTGp76vrbe1qqisoZeXkqaloqOYmKWvuK6ytbagn6ikmZWVk6Sgt6OkppausrKnq6ahnpuam5aYqJ+gmKKer7Kipo2Xrpmlq5eZnqSRm42Tl5qFlp+UjI+cnpSLqamqoaegmZ6VjI6ZkIGFlYmUn3hjaF1rak1QTU5UPUNBTkM6OklANzdST11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlwaFZDV0aMeWZDO6SjnaGmv6aor6+hqbSrnbmwq6OqtLaxsLm3sLe4uMS9w8e9vMTBxsC4wMbAuqm2pKy7rMDCt7eprLG6opWtsK2ylqWnkaq5qaCnsJ2qoK+0s6qptratu6yzs7q3rLiww7q+v6bDq7C3r6mrq6eemJmroqKgkZihsa+zq7C5mpypoJmWkpemobeppaOisLG0q7Koq5+boKCbnqWdopedo7Owmp+Qk6WaoKialKKelZiJlJiTlpedlIiQm5mUjqiopp+jm5ebk4eOmYt9jJaFj5tqaGxhbG5XUFFaVEFDRVRAOztJQTc6WFBkXlBWV0RZXl1NTFJOXktKPlpjXk5IUE5bVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPSonKz1ccD0+MS4xZVtkQDE2NDdnWWBGKD84bH1oW1Y7iXtjQz2nn5yiqb2hq7Cro7G4qaW1s6ygrbW8rrO4vLq9trbAwr/IxLnEwcDAuMS9wLevtqert7G7vr+0qa6xtp6Xq62orZenqI6nu5+krbOeq6KxsLOsqba0tb2tr7G1rLC0scG6xbervK+xuKytqqOxpp+lqqCkl5CZoLOqs6qqs5qdp5ualY6gpqS0rqeirK2usaezrbKqpJyfqKSelaGZm6i1qZeZkpKfmZ6gnpCrnpeXhZWXi52ZnJSKjZaXmpempaKgnZaVl5OAj5SFe46Sg4yWZWxyZ3BxX0ZZZlZEQ01YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtHREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYVUxNTA9YFZeOClDM1lUXGdLNox6ZkxApJqgpKy2pK2ppa+utqqvtbqnprC3xbext77BwrS0usW+zMW5wsC5vrnDt8C5srWsqrq2urm+tKqtsbWYmKesqqubq6uOq72dq66xo6ugsK2zrq62srm3qq6usqi1r7O7vcqyqra1sbSvrqehs6CbqK2gpZWWm5qyo62gpq+XoaSampKOo6Wns6mhprKsqralrrG1r6SZna2nmpifmZmsuKOXk5CPmJyhmJeUq5+bkoCTmIydnJmWkYqUk56apaKhoJiWkZOVeouPhXuMioOLkmtueG11e2BFYWpZSUhZWj17SkZENkFiVGlbTVxgSlxdWlJTUmJhTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ19RXC4qQi9KR1BbSDNjWVRLRJmXoLGosaqtpqSvrrWpt7S5pKyzt8q6tLq6v760s7fDwMzIvMO8tr2/v7e/vLG9rqe6uLe2wrarrbG3lJemrquno7CqlK+7pKyxsqeoo7G0sLGxtbG4s6muq7Knt6+1tMPFtqm1tqywramno7afoKexoKSUnJqVsZ6nnKCqjqmjnpuWmKampbinorG0rKeyp62wtqykmaCsqJucnZuUqriclI6Oi5mcopeQmKWhnZSCkpaPnJyYlpWIl5CXmqeco6CSlpCQlXaEkId7hYGEjIttcXd1e35cS2VsXEtOY1w+YntHSThHZ1dmW0xeYk1YWVdUWFRpXU9PSGFdX1BKSFFWVVJLSVdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0diTFYlLUIuPUVMUTwzcmtKQ0ORmaWupa2uq6elsbKzqrext6CrtbnJuK7Bu8K3srG1wsLOxcDBvbS8v7+6v7yyxKipuLC2tr+8rquzspyfp7GtpqWvpZ2ytayrsbGtqai0uqy0srWstK2qrKisqbitsbDHv7ilubCpra2lqK2wpqSkr6SpnJ6cm6+Zo6Oio5GsnqOgoKKqpqa5pay1taSqq6isr7auo52jqaqboJqakqS0mo+JjYeRoqCVjZSdoJORhI6Tkp2amJWUh5eTlZmnm5+ejJKRjpB3fo2FfXx8h4qJcXRyfn19XFNkb15OWWZcRkSWW0c7Tm1YYltNYGJOVldWV1RYZ15RUkxjWltUS0dPVFNOR0lXU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZUhKKzpJPzNCSVMsPo9rPEdIj5yqq6KpsaSppbO0sbS1srKhq628zLquwLvHsbSstMLC0cXGvsCyvcDCvL+3vMSnrLess7i7wLCrsa2go6etqqiksKOqsaqvrLCvsK+rs7untrGyqbKpq6alo626rKqxwrm1rLqoqaitqqixpaqko66qqKKfnKOslaWemJ6ZrJ2ip6mirKajray4sbKgqaKgq6+xrJ2fp6ipmaOYmY+gp5iGhI+Ki56gj4uMlpyPjoaHkJSfnZaYlYaWk5OXpJucnIuSkI2Jfn6HhXx3foeFhnRzcYh1a19ZYG5jUXNxXEs7hHxGPld0WGBaTmNbTlVWVVdRXGJeU09OaFhXV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSmdERjg8QjA1RUtYMUCUWj5MRZWYraihqrOcqqqwtq24ta6rpaqqvcm8sb23wq+xrLPEw87Ow76/s8DCw7rAs8jErK63rbK4wL6zra6rpKeqsKmnqLGmtK6qsK6tsbC0rbS7pLizrKyup6ugop6vt6qqrbq2pba1o6qnrKyqraGpp6aysqSmpqGhrJaqoZWaoKaepKKqpa2in6ext62uo6Wim6qrramcoaWkpJigmpaPmJ2TgoOQiYWcoIyKjoyZjpCLg4yXo5uSkJuMk5KRlKKZm5mKjouKfIaAgYN6dICDgX50d4yjiHhqXmBuZ1dlh2NOP2eTTEVieVdiWFJlVE1WVVVUT1xdYVVLTWlXVVdJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEMrOkpPXjREhj5IRkSXkrClo6qxmKuqrbWrtrGrpayqqbzAwLi4s7u1pbKwxMnL0b/Bu7i/v8G5wbrBxK6xtbGzusC+s7GuraurqLaqpq6vqrmwqLGxr7Kttqq3tqe0t6yspKmrnKOes7OoqKS0tKC2raCpqKupq6egq6ypubapqqqqoqmgrJySqaGdoKSipqOqnpynta6opqqio5ilpqeqnKKko5+ZmaCRjo+Zjn+HjIeFnp6HhIqKjo2QjYOGlKKajoyakZKRj5KflpiWi4qDf3SGgX9/eXSDf3p4f4GInY9vcWdncXhcYHOIa09emVZIbXhVZFZRYlBNVVRVUE9YW2JVSFBpVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD5DLD5MVF8vSmo2T0Q7lo6woaarrpqspa2us7Svq6Wwqqm6vrvAsK64raG2r8nHyNHAvry6vMK9usPBv7+usrKxtby7wrGxs6uzqKS1qaWts7K5sKOut7Kvsrmrua+prbasqp6prJ+ioLWtqKGfr7KitKqeqKeqo6uhoqytqL2vrK6toqiooKyZkK+hmKKgqKeeqJuZqrCpo5+toqGToqOjp5iaqaWYl5mdj4qHlYh9jYaEg6OXhYKCi4aOjZGEhJOgloeQnJCTkI2RnJSXj4qGhXh0gX98dXh5gHt0c3ppgYajdWleZWuBdWaIi31SWHBdSnhzU2RTUV5NTVJZZk5MVllkWEZTaVJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLC9LZzo0OF89YWQ/RjFDUFtbK0hOOVVBNJGPsqCkpqykp6SsprSysaqksaiquL7Bu6+nuaqmrrDJx8jRw7y/vri+v7zJvMG4sLC1sbq7uMCys7utuK2itKenrLK2ubOoqLy1rbW8sL2mrKy1q62cqa+jn6SrqqecnqqypLOomqqnqaSpnqOpp6m9q7Svrp2ppKCunJuyo5WknKWln6SbmqmrpZ6bqqGbkpuhpZ2Yl6mokpiak5CKgo+Ffo+Cf4edj4Z/foyHkI6QhH+Tm5OFk6GMlJKLkZqRlYaJfn9ye3l9fGh3fHp1cHB9aIV4hIhkYWhjcoV5bGZ4XV1VQVZ6bVRhUFJYS0tOcXVdSFpbZ1lFVWZQRD5KTkRDQTlIR0tTP2phSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0vRmpJMTRYPWZjQko3R1NgVSo9O0RYPyqPlLGZn6CppaShq6S3srKmqbGnrLjBvbWwo7msqKixw8nJzcG2vb+1t7+5yLbDtbSytbG9uLq+tq25tr+tobOnqquwtbi1q5+9vKmyv7O7oK+ztamsn66wo5ykqKqinpyksKawoJ+rqaiiqpykqKCtu6eusK6gq6Okrp6eraaXn5uho5yfnJqjqqOamqSklZeUn6KWm5emq4uekZCRjIKKgYCPgHuZlI2JfH+Lho+OjIqEkpiRhpSjiZKSh5CZj5OAiHx5bH12eHhje3pxcHFyeGiAdGqDZ2RoYW5zjWxhaW9fbz9beGxVXk9RUUpKTVRZV01dXmxXRFhgT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MEFoWTEzUz1lX0RMNktXZU8qPDNPWT0jk5msmZ+Yp6Sin6ejuK+uo6+wqqu4wrqzrZ+4r6uotLvIy8i/t8K+r7S9t8S3w7GvurKzwLW7vrepubi9q6S0qKmqsK65saqbu72ksL+1taGutrWmp6exs6CepKanoaWZn6yoqZ6gqq+noaeYpKigsLifpLGvoKuhrKScpqepmpqcn6OVnZ2anqmml5ufqJKYk5iek5mWoamQmomOkId9h3+Cjn18oIyMiHiDi4WJjIyFiJKajomVnoiQlIKLloyRfIV7c3B9cXN0YHl4aW9xcG9pfnFjemxpZWNgZoV+X1pzanFLTH5oWFpNUExKSFBSUElOXF9uU0RYW1JnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTI8ZmQyNE0/ZV1GTz1SWmhIKj4vWVg1KJedppmdlq2goKGkobersaSztKqoucW1sq6gt6yurbC1xsjBt7/BubC0vLe/u7+vq72wtL+xvcO5qbu6t6eotaioq7Cts7Cnmr63pa28ta+esLewqKWnsLKboKSgpKShl5yvpqGeoqevoqCik6Sko7ewoaaxq56so6+YnKqlqZ6Ym56lk5udmp2mqpqcnKWWlZeVnY6Ul6OooZCJipCGeoV+hIp6jpeKjYZ4gYeEiIuOhY2TmI2OlpiKjpV+hpeLj3mAe3Byd29vdF95d2RsbGtpaINtZXJqa2VoXGNzf19abHZpWkh9XVtYT09KSEhSVUYyOV5ebFBEWFZZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRHQWZbSFREVV1oRS47MmBULDKWo6GXlZypnaWhoqC3qq+gurmmrL3Fs7CuorWvrK6vtMTEvbO/urews7m4uri6rq7As7S4r7/BuKy9urWmorOrqKmzq66yo5zCtqaptrSpnrK7qaamqbCsmaKnnKSmlJihsqWZnqSpqZyioJOloKS5qKSnrqedpaGok5+poqGgmZudoJKbnJegoqubm5mhlZKVlpqNlJOjp6SPiIqPhnmEfIWFfJyNiYqGeICDh4iIkYWVk5KMkJWUjY2Te4OXjop3fntsdHJsbHNheHVoaGpnZW+EZ2hoZGZpamBoYmlmWmV6Y2FSc1RbW1NMSUdJT1NAISlpXmpMQ1ZVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEIzQ0RnW0tXR1VgaEIzNzhjTicynqSjko6kppyenp2jta2nqrq3qKzDwbewrKK0raevr7fAwL2xwbexrrK3tri3tqyqvbOvsrG9wLeuvLyxpZ+2rKaltKmrrqCfw6ypprCzq6y0up2oqquxpZidqp6npZGZpq2imZ6kqaGbop2XoJ2ntqWvqq6hoZ6doZWgpp+ioJmcmpySmp6Vpp6to5iXnpWUjpSYjI+YmqigkYiJioh5hXeCgoKch4uCiXt+hIiGhZCElpWPj4+RkZGMknuDlY2Gc359Znhva2psZ3Vza2NnZGN0f2JkZWZlaWpjaXBZXlhdbGRhTWhXWmBWSUdIS01SWD45X2xpR0JVU1xbSUlHRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOzNBZUglNZukoJGMrqCZmKCWpbSxorG+t6Gxxry5sLGjtqurrqm5vby7rcCyr66ttq+zuLOoq7myr620tru2r7i9raaetaugobGlq6+fpcOgsqOusa+3rbWdra+srqOZnKeqpZ+Vm6iln5mlo6mdmqCclJudrbCmuaiuo6Kamp6ZnqOapJ2XnpiblJqhkqiVrKmblJyckoyVmY6UlJmpp42NiomPe4J0goGKmIWHfImIhISKjIiShZOckpKPkJGWjpB/gI2Ngm+Bf2Z5bWhramdxcmtcaGRicoBgZGdqbWxnamhmbFxsbXVxYVRiaGNlWUlGTE1PWFFQVWFlgVRAVlNZVUZIRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OjYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSWVDJzSTopuPjrGdm5OhmqmysJ+4wLahtMK8vbmxpbavqa6lt7m3uKy7r62qq7eqtLmupbO2sq+psba2sbK1uqipn7apnp+qoqqtnKrBma6krrC2taysnrGtr6qjm5yjrKiclZyno52aqaOllpqgnZGbo6uqqbufp6SgmJqanqGPa6KWmJxxgpacpIB2kauonpaWoJGJl5mAl4ugj3mGk4yDbWl+d4NwbIaKhn2Ei4ZvXmNgZ4SXhmuLkJSSdXeLhH6Dj39mh4BodWlmV1xpc25OUGpkZnGDZl5kZm5saV5eX4mQhYdoT0tEOEVUZ15KR1BQVVVLR1Ngb3RlRVtRVVBGSEZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwrMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNk9rW05cS1tmYj5HMVBkPSsvjaSZh5Wxm5yToJuqraujvcWvqbfDuL28rae2sKarpLi0srOxua2qp620prC1o6i4t7app6y2s660rbOiqZ+0q56ipJynqJqtvJWnpa+zt62tpKiuqqumoZ6coKinnJehpqWbm6ennZOfoJmQnqeqo7Wwo6OjnZaYmJejiKGPkpqHoYeUnqF/pX+nq56Tk5yTiYRyeIyOhIihdoiMaZeIZn1zeKBviIeEfo18f6Ggn5l/e4iedIiOdpuKbIeBg21oZWN6bHFiVIZtY21pmHFYanBuhldeaVtraluIcG15codph4RaXkZOPkZeTUVSVldRUVJXVGdeTFlLUlJQRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIpLjE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFWYTcvKIyml4Scq5yZmZ2fq6qoqr/Dr7K6vbfAvqqkt6+qrKazta6vs7arqaWxraW1s5yttbe1pqeos7Gtsqivn6qhs6mgpKSaoqSdr7aVpKamtrymrKepqqynpqKgmZ+mo5mZpqOkmJykqZaUopyUk6KlpqG3pKSgpJiVk5iUnIiukJiUiamLl6OchbGApK2elJqelXmC1Kh/h5TBm8d5eLGlt5dkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyWsauweWhrWLGub2VpvJK8bmh6bXKP2H5TamO2sn+AcZR1mqGqkFdPV2FPVk5GVFtYUVBTi1xXW1BAXEVRTkRHSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW100MSGOppOBpqmel52dpa2yqbHCvbK1wLW3vsKrprOsrKmor7Sqr7azqKemtaanuK6ds7K2q6akp7KurbGmqp6npLKkoqKfl5ygn7CtlZ6jn7S5oqmooa2upKKem5qhqJ+Ym6ihn5iep6eRnKeblJ2hpqKgsKOfoKOWlpKYkpmFsGtqio2qfmeEloetZXGenZWappVxrqGkfne7fGuhj3axX2q0W6WAZZyRYGaBemZ/anhqqWW+cmemjHaxanyxeHSSk2NtbaduW4SgRWlnh5ZFdZxgfmd7o6eCWV+Lq2mAlHh6aqc3Sq9bV1RsY1tLTldfXFdWO06IT1dWL0lUU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzEbkqKVgqympZ+jpKqxt620vb6wt8WyuLrCp6mvq66pqbGupLC6sKSkrrOjqbmpnrOzsaSloKqtsKyvpqifo6KxnaSdmJWYm52up5eboZ+0sqGqm6GtraCempegoqmdmZ6koZyZoaekkJ2jmpegn6uepqegm6ChlpWRlpGahrWbtXiFqZm1mXeHs5u3f5OWl6mVfmuBpnqBhYiSlJJ3q2dqsVuse46HlHSJcI+GgH+IkJd4g4KLl4yDoI+FsHZ3n3Framx8i06kWEhjY5l+Y2imYHlydVKThl5QqW1jcX2GgGKdLlGibltUa2dgTEtcZFhcWkI+sHhXWEEjTWhGQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1g3SjlhVTUwHJaflIizpqairqmns6yqu7bCsLzCrbi3waqsra6upq6yqaGvvKqhp7Wto6u1pKWzs6ejop2nqrKosKilnqCfr5afmZWWl5ifrqOamqSotK6hqY+pqKmbnpWYoKWpmp+do5+coKKlo5WbnpianaKqnKWam5uioJeTkZOTnYPVk5m5cLDCfsaGfNaUm7t8mpalkI2bjKR6jYejgqWCeqx5j51Vr3uJfp9quVq5d4aDfaaCk3yYeqp5jZ2Pe7FujoR0kLuFb5RPr6fFilGgemNgqmJzcodsl4dfU7W0yIaAiXxjpDNCnXZdUWpoZFBAWGZaZGFKSE1sS1pTT1lmWkNDP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDk7REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS1xQX2ZUN0c6YVE4MiWcoZOYsaiopbOqpbSopby3wbC6wLG1tbyztqexsaOxs6afr7aom6i6rqKvsaCztLCgpJ6ep6mwqbSppZydnquXmZeXl5aXoquempeorbCoo5+OrKKnlp6XnKGmopiioaKhmqKip5ueoJ6VmZqmoJynlZubn6GZkJKVkZ2Ism5otXGriHCOpnK0c3K2e5qYpI2Pm42ifpCgpX6wdoOR0tF1W658hn+kb5uqpmuGhX2tfZeZj3uxc5OdjnizZZZ0hZ5unmaUUsiLWsJcn3liX61gd3OGYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2ZYQU9qX2xpUFVGSTk9V1JbV1hIQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJOVF9lUDVHPWFNNjIvop2RpK+spKq7raa0pai2u7yyu7+3trS7u7OltbSisrKjoKywpJimuq6ksbCctLipoKadoaqlsqisqqWanZqpnpaVmJmTk6OpoJeTpquwpaKWkqyfpZKUoZylp6CVm6anoZqjn62aoJ6ekJabop6cpZSclpqin5WYlpKbhax7d6h2o4+Kh6lvrYqDqIOZmaKKkpmLon6SmImuhX+Cs1xys1KufoOCpH9x1313hH6PnYaZmnevhoqRnId3tGGaZZqCgZVsklqwWEuadZh5ZmCtXnd3h2eYiGpdr3eVno94bDV5yK6yX0JUb15oYEVQbF9wbVZVTS9lY2lTWVE7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo4OJ+dlKC4sJi0wa2osqeqsrq4tLi/uriztr21pbi0oLWtn6Cpq5+Vp7asqLCxq620pJupoKCoorWnpqqjmZ6VpaGUlJyZk5ajppuTkKesr6WhlZipn6KPkaKaqaahlZqmqZ6dpJ6snaCdoI2UnpueoJiYm5aXoqCUmJGnnYapfX2leaGPj4OqcK2MgqeGlqChipeXiKOBkIeUqnyAi515b7FaqIOCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfYKUbJJcq1tak3+Rf2hnqmRze4FrmIdxXaxaiaCOa25lT0pDoVxaTXRdY2ZNWmFfc3RfSlU1SpqSWUhFPUhGQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzFVX2JMN0ZJX0MxPjihnJmZvqyYtMKuq62pprSwuLG1v7q6s7G3vKq7taCxpZ6lp6eek6qxqa+qtayqrqGYoaCmpKS6oqOroZeckaKglZSfmpSZn6CQjYypsK+mnZeap6afjZKkmKirqJSXqqifn6CjraOgnaGNlKGYn6CSnJeclZ6hlZePq5uPrm1ytHSpjHeKpnO0eXSzgJKko5KcjImkh452uG+Me4uia2u2WqGGZZeXaaCip22UcrR0k5h/smqGkoita3WzYZ1mom6GkmqXXK1gTaF8h5FSc6NseX9+bpiGb1yvVjycd2ZUb24uW6dPYlNrZWJtWWJcYHF8Y1NZUD4+bW8zQkJAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzwwMDAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV9hTDVGTV44MUI5pJqbnbuinLLArq2rq6e3qbivtcC1vLGvubirwbeqq6Gcp6SinZKrqqe1o7Korqqhl5yooKSruZ2jrZyWmY+lo5aNnaGcmZ2fkZOVq7avp5mUm6ypl4yTppqlraORl6uyo6CeqKuwmaCij5iil5+blpuXoZOdqZyUkauZh9SSmrt0scSAw4Z91ZacuHiIkZeMl4mMp4d5o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiAim6aiHBtjaR0vV13fVthebxqW1ZbaXleaWBkZmJteG9ZW1lDQUByP0NGKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjk3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdAOaeanqK8opexw7Ctqaqssae4r7bEsbuyrruwrsGyrKWjnqShnJuRqqSqsqS1p62kn5aaqpmmrLmdo66ZlaGQpaCTjZyjnpiempCWkq+5sKuVl6Oop5SRlqWdpK2ekaCoq6CcoKmksp6jpY6mopWhmZyXlaSYj7CgkpWqnoWQmbWAkZGNuJV4gpObtXdubG5zbnmPhI6Jc57Bu7yae4GyqHCAdJG5g3yGhouHjXuKho2XfKS7ub2cdXqzo3R2l3V0sHWYnmaGaY22dHJwd7aMXoB6fYlng3lteWKLrHB1hX9YW6dqRGVaVGZgY11iUWdmcW11Qk1QTEQ7Wkw+SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQUtOR0VPRj9HPDc+NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JWOCpPXV09KztWVic9OzynnqGhv6WWs8O0rKqnrKupu66wxq+1tK+4p7W4ramjoqafoJ2ZlKykraqmtaion5uWoKOerKS+pqGqmJWckaKbko+hqKKTnZeSmJSytbatmJ6kpKKLkpKmnKWrnJappaadm6KppqajqaGSrZ+Xo56Xl5ieno+wqZScp6KOan5pnKd4iXN+mo51emWHe72+wLpukoNxlIZfcmpaXpqJYWSHjpVrYICVY22cdmKUa3+alZRlXmBjcZuKaHKMfYaVZ2p+cXR5fXxiW3d0gWhQXG6EfXuLalhseYJySUpvhXBNdE1FV11mYUxbWGdjXk9bbXZqclJPREVOO0hJPE0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNURGVUVLT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdJUl9JJ1NgVjQpUF5MKDM+W08nPzI+qKCoocGjmrS6tqOspa6nqLWyrMissLOstaO+sbKmoKOpnaObmpmsp66kpbWqpZuYlaKbpq2pv6ipppaUm5WgmpOYpamnkZ6Qj5icsLK/rJunnqeiiZORqpuopJubrKCjmpujp6yin6qimrCblaaflpSdn52XsKWZoqiZnJGenKOkmaejmpyam5qQloJobnxxdpGXlJGEibSpjYaYlY6KjJeXh5SVioOSk5GJjZGUmZOYl5qgopublKCdjoJ6pIVranyQfIB0iYqBcYJ4eXZ2ioB7iWpzgXSDdWR3fXZrcHptYGNccGhNWVllal9XWXB6bm5mU09GUzlPWk5STygrOkpCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlMxMFReOis9OF1LLDwtQLKgs6G/oqSxsregqaWyp6WwtarJq62xprWmwKi0oJ6lpZyklpWgq6eso6O3rKCZlpagl62qpsGfrKSWkpyXnpiTlKKfnqKnkpGZqKeyw6+aq52rno+Wlqmeq5ydoK2YoZudoqWvpqGkqJ+tmJemnZqaoJ6enLCgnaKnlpiTmZSgopajn5egjpaUi4qNjpetj3uVm4KSgYmpqIWBmJaKhI6fiHuEkIaFmZCHhomVjpuXjZCYnqOWmpORnY1+jWais66FiYR2eo+KfXZ5em9neZCBgIlrdYF5iHJodH95dYOIgmt0Y3lmYGlkY2Rmalhre3BqalxSTFBEX1VGQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXV1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVF1RMDVNWzE3RTRcRzU8LECzoLmvvq2rrrKyoKqmsq2irLOwxbCqrKOzr72ktJygp6KhnZmXqKappqSms7WelZSemZmvpq6+oKujkZGempmUkZWhnJepnYWeqayis8i0oKqkq5aWmJqnnqmcoKSrlJ6fnqCqrqmmo6uirZufoKGapZ6cn52vpJmfqJOYl52SpZqYqZ6al2aDknxlfo6aj2N4jWxoa3qQo6trZZqYfmeFimVlaWh6jaGOa2iMl5Gid2tqi5ijn5hzbG56hI2GeVhlXYWBXmuKioF2W2hzd3eRgIeCbniCeIBzbXmEc3aIiY+De2qFWF5rdGRdc4hpa3xxbGNdUU5XSWRYQEo0PkY3P0ZENzE8PT9BQzs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtJLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvq7Owq6Wora6wpq6usL2xqaikrbCxn62XoKSeoZqZpqucrKOmqKmzrp6Vo5Cir6a2uaWuo4+OmqGZk5KaoJmZpZZ7payiqLPDuKWip6+fnpWeo5+knKSqqJKeoZ6gqq+qq6OqoKibpp+ooayVoZulsKSYnKuWoZ6bk6WYnquZnn6+g4hytHKFnoataHi5xLhxkqGje6aYmXOqgnzLwMC7cYuih4OffJWYiJ7AvYKWnZ6NncHBe4F6kYyawr99a6Wxb4yBb8p6f5t4kYOOgHZ5gX95cXp/h293hYyTeW12kmJmX3hjX2WBYl50aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXlxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPkhbTCojQ1AvI0ZbM1BZL1VBQjsvOJajuMO1sK/AqamUo6+psK+tprK1r6umpqaxq5+rmJuioJybqqeinauipamlpLSknaOTpq6suLSnr6KSkZmdpZKRoKGXnJ+dh6arpKutv8CxoaqvqpeSn56imaKkqqOToKGena2uqaymo6OmoKWlna6pkaSbqa2qnJ2qnKyilpillqGjmJx/zpR5eqWCeZWWm1+tj16Op4ChoHynlZt0q4OAr15kjal6p4eFoHSXkoizY4KrhqGOjbNqhK50fJaHuGGCrVmjzW6PdXvbe3+ZcX6IknV/ZXuHdnZrfYhufYWQkn5tgY5gcWtwZmBfeGRbcWhqY2ZgUlRSV11KT0M1QUhFRDg+NjtAP0E7PThAPj4/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLS1KMCc7XDpMLSFQQEY0LjGtwsDAtbSwt5iekaSqqa20qqWyrKyspKymsKqgp5uappicorCfoJ+op6OmoZ+wrJuelqaurbGrqKyglJKboKWTj56ll56oo56upKuwqL/Gs6ipsa6Wk52dopegqaqflaGenZ2ur6eqqZunpqOhq5Kts5amo6uqnqOnpqGwoZKap5qhm5SUkZegcIWMl3WEqIdxsHydcqx+oZ+BpY+ed6uCfa1/nHKtfquHhp92mJJ6fJd+qoiijJGLnX6re4iTj6CAeq1WnMR6j2+SwX2BlW11cIxtZnZlhm9hd25yb4mKkZCDbZGPZW9zdW9gZm1kX25paW5mY1dUXGFaUlJDOElJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PldKLT0nPjEpM1ZARiEcRzpDMS4rr9TGx7K0n52jjqOjoq2utq6osaepqqiuq6unoqOdmaKVn6arn6Kln6ioop+esKyYm5aop6+tqKepnpeVmqSikpShrZudpqOurKOstam5zbKtpq6sl5WcnaKZn66snZahmZ6fqbGpqambq6mjoqubr7GiqKyuppmmq6qqsaOTl6OlmpSShaRqpHWJeql0erJxgqWJmYxwiKCah6RfYFKrhH+ugpt1roKnhoafepiWhXtmgKOJpJmGgaN9qX6AlIeuXnyoVZ2ikoF6op+Ae8OvxYxzr7OzuXFiqa/CdGiNjJiPgW2akm9ueHd3bmxmZWRxcGZ7aWNcV19pWFhUTExRTENDQUI7Q0FAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYWFgX15dXF1bU0lCNjc5OTY3NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzY2KjFQS0wjIEE5RDQsJ8LJ1dbAoZmrqKGvop+wtbCuqayjqKaqq6uppKagm6WfnaWnpqOcrJqiq6Gkn6+inpuTqqS2sK6gqZudlpWnpJGboaifoKacsKajqLGstsiytaqsqpWSnZ2imZ+ls52aoZScn6arq6OumqyooqGqorOtoqqzsqKbqqivr7ajk5akp5ibkXyqbJ6Eh3WreXywboKki4mglpWflYHSuLS4yYCBsl5flKmDpIeHoHqYlZl4qslzmaOVqKmQkpuMfpuJmsbGd2WhgqVzgZ+Ogn2vXm+1Y7F1S6OGbadHgpNkj5Cekntwl5J+cHp0fHptXGZqcnFmgWleYVhjbVxeWUlNTUtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00T1RRHRw7PEYyLCSopMHGua2osq6spaKdsrmsqqGlm6imqqypp6CmpZiqo5+uq52moKyan6mlnae1n6KXk6irtrKsm6acoJaRpq2RmZyno6Cqp66hoqapsLTCsrOqraiUiZidpZuio6+ll6GVmZylpauar52tqKaerKO3rKGxubCdm6+ns7SzpZWYqKSboI6CnU54moF/n3qEo3yCpISGpp6cnpOEuHx8ebmCfszFwrZ4mqCQi59+mpaXinWel4qkmaSofrCFnISehKx9mZRhpWyjcI+FkIF9l4NyrGCkc3GAmmC8fVJVdY6Ro5Z7fZKRiXV5coR+cFtsbndyaoFuWmNfaG5iZF1LTFFUQUhHRkk6OUs+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUyOlBbVBwbNj9ILC0gjIeZqaykq7mrr6CboayztKafoJWlrq6uqaadpqaao6ehsq6hqaayoJmopJSitaKjlZehqbW5pJujnqOTkKKxmZ6cp6ahoq+unKOnorWxw7Gtqq2qkYeRnKedo6SdpZeemJmZpaOomq6hraWmmK+lvK2it7eunZ61srmys6eZnrCipJ6Gj9G1w7d5h46FkZOPgKZ4lKJ3jKCShKWCi3GrhoS0bnJpmaOclYmffJiZhoePcq6CpZuijaaLk52JlJCbbXCyXKVzk3qcbJl/e5l9bqlhonFxf59ic7K4aHiPk6aYfYuMkot4fHiNgWxod2l4c25/dFxkZG5tZWhgSlpXWDxHR0BVM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVlZUUU9RW1UlITJBSCQpJZJzjIquv7+7u7Wel6ikrbahopmVo6mnrqmrmaWhn6WgoLWnoqmnsKOUq6OOpK2jnZCamqq0tKSdpp2pkpWXrqCgnqeknKectZmfqaO2q8Kwqaupoo2Ej5yioaajlpmanJibmKWkppirp62ipZutp76slb6wrZ+jsLO6rLSnm6mypaiYeqiQfXywd4qBpKWInG2yb6GHrXyhj4OolpmArImEroWflKigopaFn4CZlYB7kn2rgJ2aloqqeJ2gj4mTkoB5r12jgXymp2SdgHyXdGuuXaVrcYWZXWBbjKBulZGnmYKUjZaLenmBln9qbH5ifXRuf3lgZmVxb2hnaENZYFs9SlMyVThCQkM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pYU1BPTkk3MDUyLiosQVRWVlZVVFVVVVVUVFVUU1RXV1dYVlVVUUhGSUojKCi8kpqEqcbDtsG0n5utoK64paSOm6SjoK+vqp+jnp2tmJ65oKKroK+qmq2hkKqppJaJmpCusaymn6ibrZiYj62ioZ6lopqlnK2Yn6imtqi/r6WppJ+MgI6bmqCmnpKUmZqUmpqlo6OZqKuro6Sfqai+pJfDrKqjoqyzuqyvp6G0sKmrmXavfpCLnIWHfbqtiphksIxlla19oI+DppWagayKhLCFpZmkoaKQhKBbbGqBs2B/rXt7goGxbGdumZeMiLFbfbRbpINryKJln4F7vFl2tVqyfVKvgHqsWIChbZeOqJqKl5CVlnp4jZx9ZHN9YYN4c4B8YWlmcG1mZWVPVWNbQVRePUkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTUpHQzU1My4vQFVZWFdYV1dYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsre9u7TBs6Ocraaltqihi5mgn52zs6meop+dtJigs6iqq56wrZ6rm5WuqaKOiJuOr6yopqOoma6TmY+pmqGepZ+ao6OlmZ+iqbKovK+lqJ6dj3yLm5WhoJmQkZqbkZmXqJ6hmKitp6Wlo6Wpu5+gxqelqaKrtLatrqegva6trZaBqZKjr46bgIakl5iPgYC4w7qDjpyThaeXnIKsioKviKabmqWqkX7VvcKqYqO/vXx+o4KD17q4tYWUk4Oevb6EaqOBb6uEbp1/erKxx4Nqq7C9rXh3or67dICVjaacj5qQlZx5gZCaeWJ9emOMZ3iBe2BrZWtqYlBiW1NqXEBUYUJNKTw6NC8eHyQeJTIgHSQoMDQ5NjY3ODs+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1JQz88QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVtLSxv7myvbOina6mpbOmnYyYpb+qt7Goob+mprGbnrGcuaiera+lp5WUr6yXjIOaka+mo6yhpZyqoZiLo5KmnqecmqGoopmeoKutqbmuqKSbl5N7h5mRppuTj5GYmI+Yk6mZn5ipqKCqpqGjq7ueqcWjoK+jq7O1q7CqobyosLCadHWqpLeGZYmfcGesj4qPbW93pJCZn4F1rpmVcJCMcZWno5uYrqRybW1tZYp3bm2CmXGAeWlxaWeJlpWYcWhphYZncIZkXoljanBZXWd+d6ZgYnGOkm9mZICNko6il5eYkJWefIeOlHVlhndojGp4fnlkbGNmbGJLZFhKa1k6UGVFUSdLOSsjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16olK2zqrq5srOqqaKunqSyqZiSvbHDyL21qZ7Aq6yjoKarn7qjpK2srKaOlq2qj4yFlZetn6Wqop+jo6CRjKWTp5momZajqqCWnKWlp6+6q6yam5OSe4SXjaWXjZGQmJSNmJWnlJ6XqKKasKaeoq26oLHCqKS0pqyxsquurKi5pK+4loqhqKW2nYmWopiGqZqQlJ2TqrOZm6KroLKWoqCeoKKcoKShlaumjJKTjIeSnJyUkJmTmJCOlYaBpJqXlY2Lk5KKj4aEfmeLgHSDdnSIjHGnbXyVkZSTgYGPj4+OnZSglZeVoIKHk4xwaI92b4p3dnx6aWxkZG9jVWBZQGlaR2JgTlkqRT0rJiI3NDAuHxwhJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlVRSkVEPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqW1uK+uorCkrZ+gtbGRjqvFvMS6t6qhpZ2bpp2wqKO2p52ptKankZiso4uIiY+cp5aspKGap56ek5Wjl6maqJmUp6GkkJqnmaG1uqirmJqQjXyBlIyhlIqUkZWQj5OXpY+emaifnLajnaetuKiwwq6juKevr7Ctqqq0uqKvvZmSpqOmtqOSnaaejamfjZKfo6yvmqGisKivl6SgnKSqnp2dnJernJKZoZuTkJaqmY2YmJaQlp6RiKCdlZSFkoyQjJSLgX5mjId1h3Z5iINznGqHkZSUkYp9jJaSkpiToZKclaCDhpeGeXGVcniJf3F7fmpuZF9waWBbYFltYlBgZFBaOkdGRT0zPT03LiomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlxeXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iVpKejsLOsrqOpp62gqLWqkI+cpbO6rquroaKZep2isKSlsamWm7imo5SZqZyOhoqJm6KQrp6klqigoZKXmZuui6qWj6iZqIyYqI+eubakpZibjYl5gZOMmpOKlZGUkI2SlqKMnZ6onp+4pH+EsLajsbB0pL+ksqB4eqCrs7yVdq6kn4qAqn5kXGJ2n46knYOXfm6Ts5yjp62romWeoJNzeZmWcICYqJdsf6KniWWcpZuQl5iWi5GbkYWdmpCVgpKHjo6SiYV4a5CHdodxfIaBgGFpiIuVk4tbdpWRZ2iPjnJ6pJiYZXiYhoF3l2mDiYJueX9rcGVfdW9ra2hcZmNiYm9SWz5NTk5SRz1AVEI5MS8eHyY0OjMxNjY3ODw7PkBBQkZIQkdGSUtMVFVVWVxfaGZnV1FKPERHOzhVUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclaajobCxrKuppamto6etpJKWq7WvsaWaqqarl3OLnK+fqKunk5a4oKCPnKOdkX6IiJqejauao5Wnop6Ol5KehXWtj4immqiRlqOIm7q0qKCZmIuJdXaTjpaTipORkJSMj5OgjpqfppmcspaAjJy1nrWNko+9qKF+p6J6o6+4gY6Op5+Ei4WPsamvjImWopp5gYushpydoqepqIeVhph3pZt6h5uBl6aCgXucsXqKhZ+XmZSYloGQlpaEmZpjeYeQhI6PkouDbnGQiHqBcYCBhn+GdIeFlpJ4lmiTdKCadHyZg5+bhph+kYmBgphqjYyEanh7cXBnZHduaWxqW2VqaWVyW15IU0xRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+PkBESUBJRUpLR1JYWlhbYWFoZllRSDlFTDs+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZijn6aurquorKCosKenqqWZlK7GvbChlqeotZ6Pg5yrnKeioI2Qvp6ZjZ+aoJB9hY6Zl4irnaKVoKGSjZSJhoCRp42Gopyjk5adhp+5sqedmpOPhXB1kIqVkIqUj4+bi4+Rn5GWn6SWnqyIn7SJtJqui8qHq66Jt4WNsIOxr4SpjaeYjZ18qI9ye3ebjqaWaJWkebSLn56mqJKZwoF/q4iYoXGegJqkfZeFlbGBoXygk5+PmJeAjpObiZiSi3yFk4aNlZOJg21zkYaAe3KGgYV9hXSFgpeBj8VmgKmHj6JqnoKfmIGZgIqLg4iYb42ShGd3dHt2Z2h1cGdna15ibmxmbFhoR1xRTDJFNDZNYGM2JjQ8REdEOjY0NjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASmRZXWNmaGdiYmJiY2NgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLmxqqummpSgo6Sqopalqbajr3+gp5ylnp2JlL2Zk42gkZ2QeYOWlpGHq5mbmpqhhY+Md5ucj5+QiJ6km5WYl4aiuK2lmZuNjX9ibZCLk5CNj4yMl4uQkZ+Pk5+hmaGofqGnh62eoJauj5+dnZGGgaCNq6+HpI2qmoyafqN2gJiTa4GrdU2reIeNnZGbqKeBqqt9g6F7eqdpnn+Sa2eXhpe2iJ59bWBjWIOXf4x7ZGeLc5l9eZZsXXyXbl9TcYRcYGx5g2BZZYJ9hIGYcaeqa4OjbnKlcJ+DnWdkn2xabIh6ZVlfgn5hV1BvdmVudHJqam9eam9sa2hXaU9dV0U5QTRHQ15rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deX2J2YE1EOk1PTVRiXFxmZmlpYmJkYmRkYmFiYGNkY2FiaWtkYmRkZ2RiZ2VhY2iYlp2guaGqo6askqK2vKuuopmXoKGlrKygna61o6iRoJ+gppyZjpi0mZCLnoyVi3WBlJGNiqaWlZeenn6ThYaspIebkIqYqJeZmpGHpbCmopWZiImAaW6Ih4uOjomLjZKLkJKijJOeoJyipX+TgY+joZSgd5yWkKeDoaeAhqquhaV5i32Emn2icHOTh5Z7nox5bYebjJmQm6iaj4edfIKic3amZp5+d6RfmHp8knOibpi3tLp0koeBgLaoZIHGuHtwlbeMcYCbpGNzrKtgfWqds35ufYeDjoKLl3GAo2xzpHOeg36jXp2Zs5Zve5ees3RyW56ygmlib3R1cWhuWWtsc3JlXGleYktEPUQ1UUFZcTI8UkZfSlM9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltaWGBgfGRIQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7mZrJyToI6luLWuraCbopyjo6Wtm5qxrayTl6CYoKSampSeq5uLiJJ4i4VwgJaNio+gkJOUnJZ9kYmOqKGHmI+KkaKTm5qMi6iopJ6PloeEfmt7hn59j42Di5CQiY+UoIKWnaCdoJ+LiXecmKKMoHKii4ipiJynkZeoq3+ujH16oJl6o5N4gHOXiIycfZafhpuNmZumhqNkoXyJlpCbjWyeaJqNbpqZen+Kp31yZ3Oqg52Cc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF6ndnWJin+eaJp1h5OSmI5/nm6ZkGummVyofne7an2pWo6EXbNnXG5xeXdqaFtwanl5Yl9mWGJBUEVON1ZCUm00SlpaX05aREAxNTE7OzdIPzpDR1Q/WVJZXT5EYl1WYFFhZH1pRUI5TltdWGRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZGNpaGdraZWciaq2m6iJY5WcrLqysKydppycp5+erpqdsKirnZeimaGfmZaWoKOZhomNaYiAcXuXiIuWloSSlZeOeYqElqOdiZSPhYudkZybiY+oo6Cai5GKgIBpgYZ4f5aMe4iNjoePlpp/k6KfoKKTmHJon4qgj4xwkoyCqYiZn6OpoKh9sK2koriXdqOzoqN/iJR4nXqrmn6ijp2bl4iXcqF8hY2vtX1rmpGheH6YtKOjq6iEmHuafJyZfnOqWl1ve5eLeJ5iTX97e4VjepdCTZ9ZompyfI5tgYmEmXWbeYeJsbN/f5qSpnR/nW1xfJRvmXJpo12VdkhlY2BzcH19bWRfa2l3fGRkYVJeVl1UVkBZRVFnRFJXW2JYX0lEPUI4QEI6SUU4TERXQVZRW1ZERmFcWmBLYG1+ckVDPFVfYlplalZnaGxuYmZmXmFhXF1eYWhiX2VkdmxeZWdmbGRlbGhoa2mTnYGxrpmEU1+hp7S6s7OpmqKLm6mcnKmToaukoaiPnp2cmpmVmKGdloeHiXeFgW55lYWQmot9kZOVh3KAiZKgnHKRkICImJSfmoSOqJyalYqLinyDbIWFcYGhjHiFjYiHkpmVfJKkoJ+jiK6GfbWEj56de6aWeqmClp2Qi6Gefadod21+mXOgc3F8nYWYb5OCrn2jg6aemoGjcF6pZ3WjY2+lYZzTkHx6mXhyc2OihY9+onKijnVrj7OLYIKYinOqsqi8f3eDbX+/pqq0XptvfnGXb4FzonJdo2d0pmFopm2b05h7g5tud3mXa5t6dpdybKmlZ19leXB/hGpmZmNudnhoYGNTW2VRUWJJV0lUX1dTW2VqXGVRRUNLTEpLQkpEOFA/UE1XU1hPUlFgZWVpUmR4eXdJRkVjXWRZaGpUaWhqb2NqZ2BjYFxdXV9oYmFoZXxkXmRnZGtkam1naGxomJt/sKxUXEt+qbCytbCzo5yYhZimoKCjjaSooJipiZmXmJOZk5Kgl46HhXtwfYRofY+Dk5qBd5GNjolwf4aPk5Jsl5N8iJCRo5WDjqqalJKKhYl5g3aHgG6Bn4Z3gJKGiJmil3mToqSan4mzoaK2i3qsp6SupXCpgJqQhYGckn2kgKKZhphynoSirK6Jl4uAjKSNloOuopR2tba1yaFzlIqAn2Gel6lteZWHn5p1oYd3oH2QloqBb0xmopJwmohzpHt5dGGDgmx+oGxyZGCccn90l2l7abO1tMamc5h+e51qm5urdYKabXR3l2maeXSYcVBFfLNeanZreIdmamdidHVxblZeVFloUFJoSVVMWFJWXWdrblZnV01KQUpNSkhKTkFRSlBlY2ltZXRyc354e251iXt7VFBPbV1oW2tpUmpoaWxnbGZjZV9cXFxeaWJkaGt7X11kZ2NqZm9sZWlsZaKcia+nhWY/lKGzq6+vtaKikICXqKKipIylp52cpYKZl5aNl5CQm5KOiIN5anmGZYOMfpageXWPiIyBaYSFkoOMhZ2NeoyKlKWSg5epl4yRi4CJeoB9inhwkKGGeYGVh4mWoJZ/lKWonJaWhGdueJxsomR8caV3nJhwZ6eBl4x7pXqgloOXcp92gImUlo+5bpCKomJ9maKViG5yaatqdaBsbqZgm2mLkGiWh5qVdaKAfZpfi4WMdW+IYmihZZ5/aZt1cGRmiIJucqJaX1tkoW5eiYxve39zcmSlbniiZGenaJhzi5huoW9TiI9voF5kp1SLXVOYbW1za3GBbXBoa3hza29SWFdXZllTbUlYT1xIWGloc2pZa1ZRUkVWXExYUmFVaGped3V6fHB8fHKCe39ydo2AhHZeUXNhZ2JwZ1BqaGhrbG5nZGdfXV5dYGtiaml2dV1cY2hjampzbGZrbWOdpZimemV0bYunrqWqsLGmn4uAlqqcnqWMoqGaoqKAlZiTjZqPi5eQjop7h3GAiGiLi3yXmnN0in2Qe2WDh5WKipWZgnyIhZamj4GirJCFkIqBin2AgI9zaY+lhH2GlI2ImKCOiJKqp56JpniWnH6liZaMspiekIOvl5+leJaIeql0pY+Emm6looyShIyDvG58pa+ChoWGk5acoHylenGolKCWZ55+b6xjloqVkneobKmigYl2h4J3q5GmiGuRsGt2s4ypbIuGbm2fnpKVYX+ri6p2gH+Np593n32FpJWdoGmah3asZ56tjLZzd76MpJNZg6aNq2F1cnNve3RxYmp+bmhsU1ZbVWFhXWtNXVJdSV1sbXZgW3FZW2BaZ3Nlbm9yY3F0YHd7fnlyeYNzg36Be3uMgYKAdmJ4ZGNuc2RSbGdob2xyaWZpYV9eXGJrYmxsem9cXGJpYmxqd21nbG5ilaaqnIGAnqSWqaqeqKeuo5mJgpeqmZ6kiZqlnamdhIuaj4WckYWSjYyNdIZ6iINvjYR9lpN0dIZykoJtf4ySh4aUj317gYSXpI1/paWOgY2JhJR1goeSb2yKqICCi5SOiZyfiY2Tq6OgkIB1lZeIfoF5lK6jf4GbcY+GeJCMhYB7cqeMcX19epeWm4SOeHt+fYiUlZOKdpCZn6CDen2JbIyFW3l5cnlxaG5+kolxf3SBj5STcYWDgWWNf1+BgIx3dXOUdW96b26HbYSGX3dpeI5mgYKGjqqcfnR9l2qJiG+AdnyFdm1sZ4xzeHuXd4Rbalh4j2htd3Jxb3d4b11shm5pZ1ZaYFdcZGtkVWFVXlFfcHd5a2p2ZWpqanV8cXJ0c2FvdWJze4F4dXmCdX+Af4B4i4WDfXttf2xkeW5eV25naHVreGppaWRcYFpjamVscHVuWltia2RsbHltaGxvYY6Vuaimi6GimqakmaSdq6Kgg4OXq5GdoImappqomIKBm4t+lpSHjomIjXKCfI99fo+EepeOdHKDcJWFe32Si4aGkIV4foCGmKKMe6ehi4WPj4SVgoaOl3dyhKmFjZKckIienoiMm6igoKuDiY6Vmn5+iZatqI+Sp5B4cJ6Rg3uTb36phXB9lXFqb3yBn4t/ko6MaG1dg4uMnJuejnOVi4hxdGuCdnOAWXJuhpCBfX6LaV1pY3qFg4iAX2l4e5t8g4yDdoGGg2l5i4drYXFzg3dgc4yCiZCnlYZmjY+DbnaLg3CFjXlvZWZjeYJ6lVpcaWZudlt6eXd0bXNygmZcbYprbGJZWV5aWWtxW15gWV5dZnN9e3Nvc2Nra2l7fHF7d3RkbXRobHx+dXl8e3p5f4B/b4aKhHt9c355c39pVFxxaWx1b3Vna2dkXWFYa2hranFybVdbZW5sZ3N6b2hqbWCMjKqwoZCjoZqfnpiemamjoX2Dl6uMn5SHm6KQpZV/e5eEfJKZiIiGhopyfYCLdoWLgYSWinFvgHKYhoR+koSDhoqBeoCDipqej4KmoId4jpeIlYuLnZeEg3qsgZCXmZSKnp2HiKGroKKio4yIk5uco5mWqqGnpqCSm4iXj3x5j46EqH5/kpGSk5ywpZqUnZCNspOYhKaMjJWbn4mQm4KJkYprfI52d2WChpCKfImdhIeLj4eIgISDkHd8enWaoomHi5+LhpV/foyBgHZxdIaFgHiIh4qRppGEho6Ig42QjHyHiomPgXZrgYN7eZlpcmhgc4pwfXp3dm93dIFdXm+HaG5fX1pcXVNncVVjW1thbGh0e3xybnBka2pof3tteH9xaW9wbGaBe3KBgHeAfX+Eem2CjIZ8enh8fnqDeE5kdmtzbXB6ZGtlYmJgW3RmcGZycWxVXWx0bWh5enFnaWtljYidup+WoqGYlZmYlJikoJ17f5mqjZ6NhZ+cip6WfHmUgnuOmYmGhISGbXiBgHKAh36Ik4Rta355l4aEg5B+gIaEhn2Hg42anJKHqp6DcoqPhZKSi52RfY16qYONkpeVjpyWhoabp6Cimp2Gg5KamZmQmqagpp2dkJeBkot3fYiOhaV7fI+QkYaYqqGdk5yPjaqOkoCejImTmp6Cjpd+h46Cb3iFcXRgf4OPhnSLl4CDj4KGhH6FhJRueXV1k6KLjYabhYWOdICKfX1yc3uJhHt5jI6Ek6ePhoSPgoOKiop2hYeIi3xua31/e21oa2xnXnl+Z3x7dnR1dXt3XGBwfW51YGNaXF5RZm1TZVpdYWtpdnl+cGtsZGtpZ4CAbHOAbGx0b3huhHluhoB2goB9hXZxgo2Ifnt6fH97gopgaXtrdWhpgmRqY2BpW2N1aG9idW1sVGJxeWVwenpyZWptbYuKn7iaoaSfk5KWl4uan56denedpZCbiYaklIuYmXl6jYV8iZGDjIKBgm17f3hygIV9ipB8a2h8gJeIgYiOfH6GhId8j4GPmpuRiKecf3CLiouSh6ChioWMfKeRh4+Sl5OWkneNo6Ghnpaaf4GQmpmTjJujoaSal5Gbf46FeYCEj4ehgH6MjY98l6SgoJKZkI+mjZCCm5GJkpebfpKSfoeOgXV0gnB2YH2AjYVxipV8iIxyjX6ChYWOaHhyeYyZkpCAmH6Ii3KCh3x9cXp8jIV6e5KNg5alk4uGkXyFhoeFdYKDiIh6ZXF6f3l6cGxqZl59cmh8dXVzfHKAal5gdHZweGRjWV5eUmtoVGRYXmFnanZ4gXFma2NsaGV/gGptfmhvcWt9d4Z6a4uBcoGBfYF0doKNhn58en+BfX+PanKDbnNpYYdobGJfcVV0b21uYHhobVdqdHZidXp7cWJqb3qJjZ+ykqWlnY6QmI+GnaCanHx1o6CNln+MooqImpZ4e4aHfoOJfoiCgH9wf3t0dYKFfomQeGdjfIWXioKKjXh9gIyDeZaAlZeVjJagmn1vi4GQk4amm4eMiYOllYSSipWXkpF2kZ6hoZiUmHp/jpiXjpabnaSemZOUnHqQhoN4hZeNnn6Bio6Mc5einqGSmI6PooyMg5aYg5KWmX6YjXyIjYF2cX1temSAfIqFcIaTf5CCbIeCgX+JhGV1b3yHk5iNfZR4jIl8gId9fHKAeYqHeYWRiouYopaChIx3iISDgnZ7gYmFdWB3d310fXdma2RgfmlqdnN0dH1xfGNjYXNudXNtYVlgXltsZFJiV19gaGt1eYZwY2pjbWZofINsaHRobG9of3yCeG2QhnGAgoJ/dHyDjIF/fnqCg358kG11iXR0bWWKbGphY3VWg2lxbmB4ZmxianZwZnl7eXFgcmyGhZCdrpimqJ6OjZeHhqCTl5h8d6mciph5l5yLi5iQeXyAi318g3uAgoB4c3h6c32AhH+Ii4BkXnyKlYd+hId0fX6Kf32YhJaTloyjoZd+cod7k5GKp4+MjoqSoJGDkY+Ul5GKgY+YoJqSkJJ0gI2SlImdnZ6nmJiNlZd0jo+KbIaYkJl6h4iQiW+XnZqjk5WKjZ+MhoKSnH+SkpWGmYh7iomBenF5anVse36Lfm2FkYKUd3CCg31+i4Bkcmp8gZeYhX+OdJGJg3mHfnZ4gX6HgX2EjoWNlKSQeYWDdImHfYBzdICHg21henR6cXxvYW5jZHthbm92cnd3c3RidmBvbHVub11bXl1eal5PXVdiYWhtc3qJa19qZWpjaHeIbWZsaGptaIB8endukIdzgIOEfXSBhol6gn16gYR9fY5yeYt5eG5sh2toX2lyY4docW9mdmdtbGF6aGp8enhwYXdti4GZmqqgpKmdioqRhoqeipWXfXatmIyWfZ6TkZaTiHd+e4p8e4B2d3+AcHRzem+FfYGAin58YFx+j5GGf4OEc3qAhnqPkYeRkZuSpJuUgX2AfI2KkqSJjYqNl5qNhZGYk5WOiYmMk52TkIyNboSQj5GJnpmioZeWiZeSb4qahWeGmo+UeomFkIpwlpqUoZKSiIuZjIKAkZ58ko+Si5mOe4qEh3RzdWtxbnV8i3RuhpCNkXF0gHuBgoh8ZXFteX6alH2FiXSRi4F0iXlvgX6Bh32FjYqFjZaojXuIfX6LhXd9cG+AhYNjaHdzdXB6Yl5wYWp0XnBqenh4bHJwZXldbWxzbXNYWl5fYWpaUFdYZGNncXF/h2ZdaWhmYmdxjm5kaWdlamiAend0bo6Fc4CBgnt1goiFeIR8d4OFeoCJd3+LfHtyeYNqa19waHR/a3FubXFnb2xle2Jtf3l2cWx3d4p/o5iiqKGnm4eMioGPnYaTnHSAqZSRjIagjJWTkH90e3aFeHh/cnN7hWtyb3ltiXaAgIZucVtZfpGNiICAgHZ1gH9/oIaPipGcl6CTl3eJfoCMiJyeio+GkpeVhIiUmY+Wi4uNjo2dio6QhG6Ji4+RipyWoZuYlYWYiGuGpINnhp2KkX+LhIuBd5OYkZ6RkIiJlY5/fo+XfJGNj42aknyKf4Jvdm9rbW9we4Vpc4OOl4pxd4B0goiCeWZ0b3aCmo98iYV6lZJ6d4l0cIl8h417i4eEiY+co4h8hHeCi4B4eG5qgIKAXXJycXBweFpecWFval5vaXx5cG1tam12YHBva3JtWVhhYWJuWFFTWWVmY3VwhIJiXWttZGJma5JtYGdmX2hrgXVycnCLgHR/goB4doCLgHmFf3eHhnaDhXyHjIB7dop/anFjfGKGfG9wbHRqaG9sdndfcX55e3R1dICCf6WVmq2fp5aFjYN/l5WDj591ip+TkoWKmoyVjYt6cnh0gnByhXNxdYhsb211bYh3g31/bW5VUYGrlIeCeIB2coJ5gqCBkYGTkpebkZp4kXqDjJKkmpOOiZWYkoSGlpmMk4uJj4+InoWQinxzi4WIj4icmZ+blpSAlH9php2IaIehiJKEkYOJcYORl4+ajY+Mi4+Nd3uSkHqOi4yRlox8iHyAa3ZqbWtrbHp+YXl+jpWBdnqBd4OMfHlndGx0h5aMf4iGe5SRcXqFcHiNe4uNe4l+g42Rnp6FfH14got9dnBpa4GCeF93b21rcXJVXnBicWBfbW55cGdwZmdzdWhwa2F3ZV1WZWBgclNQTlxlZF14cIh8X1xocmJiZWaSal9oZFtncH5wa3Fzin12fIWAdHV/jHl7hYB4iINzhoV+jIyDe3mVd2ZyaoNgh35vb2t6YGptdH90X3R9eIZ4dHOFfHmhkJqxnKaOg4p/g5qIgIuef4qZk46EiJeNjo6EdnR2c4Bwb4VzcHGDb2ppdm2Cbn18bXVzUk6C38mS1pN8cHSDdYOfgpJ3lJCYm4+Ye5NyhpCfoZOTkIqSm5SGfpaViI2NiJGNiJyAjoF4eox+iIyKnJudm5WTeY13aIqSiGyJpIWSiJeDhmOMkZiOlIqWjI2Ki3F7lIl7joiKkpGJeYV7fmx7ZXJvamt5eVuAeY+OgHp+fn+Gjnp6aHNrc4qPiYGFhX2WjGx+f2+BjX+NiH6Ee4OQlpqbi3x3eIOQeXNtZnB/g2xodG9naHNsU15vZXBZX2txeGZramJmeHNvcGNfd2BgVmtfXnZQTkxgZmNdeXGJdFxbZXZgYWVljmNhZmFYaXNzbmtxdot8dHqGgXV2fotzf4Z/e4l/comHgZGKiHx+mHVlc258ZYh/b3BsgFpsbnl5c2B2enuNdnJ3ind5n4ybr5ugkIKFd4iVf32JnIeFn5GOhYyXhJOOh4F1d3B5cW6Eb21ufnJkZHhwfG16fWpobGOkmsHcru+hc2t1g3WEoYWRbpWPlJ+Um4GRcYaLo5eJjpWKkJ2Wg4CVkIWJj4CSioqXf4d7dX+JeIaEjZuamJmOkHaLd2+Hiox+i6SFkomdhYVei5SXio6JjouKhIlse5eCfYiFiZCPhnaFfX1rfWN4dWlteHNXiHqRhoV6fn+AhYx+eWVzan+JjomCg4CMl4ZsgnZuiZGDkYV/gnqAkZaUmZB0dHiIjXV0cWd1eYJhc2xvYWh1ZlJgcWdrVV5tc3lgcmNfaH1xcm1aYnJhYlduWlx3TU1MY2ZhXnZzim1bXGR5XmBkZoRfY2NeWGpya25rcneLfXN3hIF3d3yIcYOEfX6Ie3SLiIiWhox+fpdyZ3VxeW2Me290cIFYcXp2eXFkd3mGjGl2gIlygJ2Imaico5KEfXCMlHh5i52EhaGNjnyVjH+Zh4R7c3dwc2pvgWtpbHx0XmB4dntwdXtnYGV869q1ycPciHNsc4B2iZqIjWmXj46clJKBiHGGiaCOhIuVio2YlHyNk4iDiY97kYuGkIJ/dniDhHKHgpKblpSYhox2h39xhoOKh5qig5SMnoOJYYOVjoaJhomNh4CHaX2Uf32DhImOjYJxhn5/cXdndnJpc3drWox9koGFfICDgISKgnZidGyIgY+Kgn6Ak5F9boJseYeQh5OEfYF+gZKUkZeJbnJ6jIZ1bHFrcniAX3JoblxqdWBRZXJpZlNfb3Z0X29gXWiCcXJpV2doY2lYbVdbdUxKTGVmXmJyc4VoW1xleV5eZGd6YWRfXFlrbmVuanR3in5zc4F+enZ6h3OFg3x/h3d2ioaPmIKNgnuSdGt3dXl5k3VveHp9WHmFcYBvZ3h3koJkdoaFcYqWhZmhm6KKhnNvkotyd46cfYqaiIl7n3+DmX+BeXJzbm9kcn5pZmx3d1tfeXt6cXF/aWFnYX/Vto6QpnhucXd7cZKQjIdqmI2Im5GLhnpoiIuZhoGSkYaHmI18jY2BgYqNfJCMfoqFenV7gnpxhoCVmY6TlIKJdYSHd4SAi5Odn4aWj59+iGF/k4eEiISJjX9/gmZ9kYB+f4KLj5B+bYJ8gnRrbXZ0c3Z1a2ONgY5/hX58hH+EiH9wX3NxhXyPjYJ8f5KJenGDZnuEi4eNhHyFfoGVj5GThG5weYx/dW1uamt6fWJnaWlYa3VaUmlyaWJQYnJ4bGFlXVpqg21zYltnX2RsX25UWm9OSE9mZFxnbnGAbFpbY3JfXGNsd2RlXVxabGtibWpzdoZ/cW9/fHx0eIV4hYJ8gIh1eYmBkpZ8iYZ2iYFveHl7hJNvbnyBd16Df3SBbWl6c5RzZ3KIfXKSkYSan5ughod2dpR/bXaTl32HkIOKjZl8i5p2fndxb2xqYXR8Z2JpdXpaX3h8em1xfmVjaGhXnY9ecXKWvMSEdnGUiJB+cpaLhpuSjIdyaomPloB7lIyBhJuMfIqGfXyJjH+UiHWKhnZ2fYFxdYaBnpSFlI+Dg3KAiHWFfIqZnZiHlI6dgIhmfZOCf4WDiYlygX1mfot7eX5/h4uOfGmAfIN2Zm94eHN2c2xqjYWKgYp/eIKAhYN/a15yeHp9jYqGfIKPgX5ygWl5hIiMhoV5hH2BmI2QjH1ubXuJfXd0bmhnfHZjW3BiV25yU1Nuc2hhTWZ0eGVgXVxYboBvc1llYV5qbWBwT1lrUURTZ2Baa25tfG5aW15sY1pib3dkZ1xdYGxpY2xpc3aBg3Fufnx/dHWDeoOCfIKFdn6IgZaReIOKdIGIcnl4fo2Qb258gXFpgXl6fm1se3WVa2p3hHRslI6GnpigmYWIbn2Mdmp4mI5+gYqClZeJeY6Wb3pzcGxqZGBzemhgZXF6WmFyfXlncXphZWWPsbJ3SmJapNnQlnJ7kIqQd32Ui4SZkYyFbmyGk5F6eZKGgYSYinyHf3h4iYqEloBwjIhxdH16aXmFg6WQhJONg39vf4N3hHmGnJmUi5OQlYWHcHuSgn2Cg4mDboF3aICFeHJ/f4OKhntlfX6EdWNwcn9oeHBvdZiNhoKKfHZ4gIR5gWtccX5ygYiFiX6GiXuJcoFucYWHj4WFc4R6gpmNjYR4bm9+hIB3emVoanxwX1h2WlhwbE5XcXNnYEpsdnRgXVtbWXR9cm9XZ11manBgb05XaFE/WWZeWm9rZ3lxWlpZa2VZY3F5X2hcXmVtaGVraXF3f4dvbH9+gHVvgnuAgX6Df3aBhYiXinGCjXF7hnx5eYSTjHVqen9sb350f31vcnt7lG9ugX94ZpOLg6GZnJKChmeHg3BoepWIfX6EgZiJgXyNjGl4cmtsZl9hbnhtX2JveFxkbIN6YXF2X2Vl1Oq+ijI6PouOgHF4hYiOjXaDlox+ko2Mf21shY2Mdn2Pf4WClYh8gnhudoeEg5d3b4iFa3V7dGZ5goOni4KPi4R9boB0doR6h52RjJCSk4yKhn57koZ3f4SNg2x/cmiAfnhtfHuBioN3YnmEgXFkcWh+bXRxdIGbi4B/hX5zdX2Ac4FwW21/dXmLg4t7h4B8iHh6cWyJhJCEi3KCeoCXi4t/dG5rd4CAdXVcaWh3cFhWe1NacGRMW3JyZVtJcHhvXFpaWV11fnRoWWJbZ2VuY2lMV2ZRPV5lXF11ZV90cFpZVG9kWWRxeVpoXmBnbWdpbGlwd32ObGmChH55boB8fIF/gnp1goCNk4VwgItud36Ae3uIkol/aHt+anR7coZ7c3d9f4x5eIR9fGuMjYSbnZaMgYBsjn5raH6NjHp+f4OUgX59iohrdXFnaGNbYmdybmBhbHNhaHCJemJzdF5jZJugj25cNVmvtXRpgIh8koZ1hZaFc4+KiXZwbIWDh3V5iXiJfJOHen5zZ3aJfn6Yb3GGfmh2eW1leYiEpIeAh42Jfm5+dX+BfYyZiIKUkpmIioSJfI+IcHt9hHtofmxqgHt6aXp2goeAcmB3gX5xZHJmdYJtdXuElJGBfIF/bnd5fHR/bVhvgHd1jIKGeIh2gol6eHNuioGQgYZzf31/k4mIem5uam6CgnVuXWdlc3FRWnpOXG9cT1xzcGRVS3N4aVdZWVphcYB0YF1dYGZkaGlmTlpoTkBhZFtgdWFcdG1YV1N0YVpkb3JXal5iaGtnbWxpcHd8kmxphIl8fHB+fnuBf4J6d4B/iouDcXuHb3F3hH97iY2Pg2p+e253eXeKd314gIKHf4N+fnpthYyImKONhIN7dox5a2yEiJB4fXuBkX9/foqDcHJwY2ZeWWdfb3BgYGdwZmpviXRhdG9bYWRqdnt/vpymo8i4cYWDcpJ8eIaTgnORjIdycm+De4N0dYd0iHeTiHl5cWN3h3qAk2lyhHZmd3VjanyDh56Bf3+Oj31yf3OEeYCSkYN4lo6VjoeCiHuIiGt4eX51Z3pobH95c2l6doCDfWhgd4d9amt0Z3uAaXaAi5CUfnp9fnB7dnt0fmJWd35zc4qEgn2DcYeKd3hxcISCjX9+eX59do6Gg3ZpcWltiIJycF1oYnJuSmR1TF5uVVRac25iUU9zeGBSWFhcYW+Cc1thXGhlZWNrZFFbcElEY2FaY3BeXXdoVVZVd15bZW5oVmteYWpnZW9vaHB2epJuaYiMeH1ye355goGBfHZ9g4iGg3B3g3Jud4OCfYmLk39wgHx4eXqBjHSDeH+BgYKEeoB1b36Ki5ueiH2FeneHe2d0hYuQen5/e4iFhHaPgGdvbl9kXFhlWW1yYGBgcGxraIluYHNpWV5kbYB3qdqpx4aHsnGJd2+MdXuGjoB6k4l/dXR0fneAcHF/bYR0lIV4dGtgeoJ5iI9mcYNvZ3ZuW219gJCUf4F5kpN+eXtsh3aBkYyEdJaKkY2GhYV7f4RsdXZ/bWd2ZW17dW1qd3Z/f3xgYniFeWh0dWJ9e2d0ho6NlXt0gHVxf3p8bX9ZVnR+cHWFh3+BeWyJhnR5bHWAg4R+e315e3OLgXxzZ3RlbouEbXNbal91ZEhubkxaYVdWVnhtYlBSdHZXUFVYXmFxhG9cYGNtZGReb2JUXXJHQmZfXWZoXVp6YlFVXHVbW2drYVZqX2BuZWZrcWhwdXiOdGuOjXV+dnh9d4GDgXtzfYOIh4NvcX90cXV/hYGJjYp7d394g3x8hod4h3x9gX6EgHt+c3Z5jI6gjYl6iXZ1g3lefYWYjHmGg3SFhoR3iXtibm1cYltbYVZqc2NgW2dub2aHcWFxZldcY2t/fMrOh7mham1timxxhHF8hIl+e5GFeXlzeXV1e2psdWOEdZKBdm9mXn2CeouJZXKCa2pxY1hteoabiIKCdJiVeH98bYhxgoqMiHKYjpCHhIuDe3h9cXFwfWZocWJteHFqa3F4fXx6XGR5gHdpdXhmgXZndIeLjpV8cYdqbn2BeW58XVhyf210gYt8gm9vin9xdmh3f4GAgXd9cXt1h3x6cmZzYW6MgmxyWGtfd1tJbmtNVVReVFV7a2FPVHVyUFFUVl5idIVpXGBramZjWW5hWGJwR0FoXGBmX11Ve11PVWRwWltqaF1XaGBfcmVqaHJncHJ3hnhulYp0f3p3fniDh391cn+GhY2CcHB7eHd1eoaFhoyFenx/dYt+fYaEhId/fn59h398eHZ5eJGToH+MfYttdoB5Y4OGloVzkYpvhYWBeoN0Y25rWl9bXV1UZ3NlYFlkcnJmgXNia2VXW2Bpf3i+rnugt21ic4Zoc3txeYKFe32Mf3d4cnZve3Zlam5gh3WOgHJpYl5/eHmLhGZxfmhqa1pWb3eKo4GEf3KblHKBeXSCboGCkoh0lYiMh4OIhX14dHJuaHlgam1gbXZqZ2preXd6d1tnfXx4ZXJ9bYR0ZXWFjYaWf2+LZmp6g3VtdGJcb3xrdX2MfIFmdYd9bnFodX94fn9zfWx7e4F6eHBmbGJuiX5tbVZrYHdVSmprT1FOaE1ZfGhiTlV1akxQVFVeZnWDZl1gcGhnYVdpXVtraEpEalphZFdZVXlZTlZtalldbGVcWmVjXnRlbGRxZ3JvdYF4cJmFdn9+d398hYd9dXOCiICVgm5zeXt6c3OFhoiIg3iBfXaPf3yEio6EgoR7fouDe3d8d3eanZd6ioKGaXd9fGyDhJOAco+CcIWCfoF/b2ZsZ1hdW1xbVGRwZF9XYnJ1aXVvZWViV1xcaH9wb3KAc4lkZHh+aXR1c3KChHiAhHl3dHVua3pxYmdrZ4Z0jYNtZl5ffXB7iX5pbXdmaWRVV3Jvjad8hHx2l5F0fHN8em58e5GFd5l9h4WChoN9dHBybGd0XGxoXmx0ZGdmaXpve3JZZ4B2dGdwgHeBdWJ3hYp8lIBui2pteoFxZnNlYG16Z3N4inx+YnaDdmprcXR7cXp5dH1mfn9/eXduZGZiboZ8bWtWamJwU0tpak9LTnBHXntmYU1VdGNKTlNXYWp2fmVcZ3NpZWBWY1dicF1MS2tYY2JVVVVzVkxYdWRaX2thXFpjZV93Zm1icGlzbnJ/dHSagXd/gHd/f4aEenx1goR+l4VucnR8enRxhIWPgYB5i3V0kX98gZWOgIWEfX6Mhnt+gHZ7o6WKeYiGhGt1fHt1g4KMem+Fc3mEfYGDdW5qaGVWXVtaWlNibmRbWGFyemlobGhfYldfW2qAaWtvgGdrYGh5eGpzdHRuhIF6f311dW56aGp5al9lbmiBdo+DZmVYYndpfod7b2lvZ2ZdVVhvaI+pd4F6fJCOeXVwf3BydXmOf3iVdYaCf4WHdWpydmdobltsZF1tc19nYWp4aHttWm2CcnNqb4B+eXdhd4SEd4+Ecohxb3l/cmNxaVxweGRxdIh8eGJzgHBnanhzcmx4d3V4ZIN7f3h2cGRjY258fWtsVWliZlNLbGhPR1JrRWF4Z2FNU3FcSk1UWWVrd3tlXm1xaWRdVmBWbm5XS1NoV2ZeWE5VbFRKXHlfW19rXV1bY2VgemhsYW9vdW5veHV6mH13gIF6gICHhXp5eoN+gZOEcXR0f3l2dISIkH2AfJBrc5WAe4KfhX6HfYB/hoKAint2hKyff3qIiINrcoJ6doF/gXVuhm58f3OJgGpvbWRkWF9aWVpVYmpnW1pedIFpXm1rXGFWXFxsgWVxdH1paVxrdnZndHdybYV7fX15dXJseWhpeGZdZHNoeneSgGJiVGVwZ4KFd3dmaGpgV1ZZZ2OPqG9+d4CLjnpwcX5oeG95jHt3j3KEfX5/hm5kdnNkaGhca2Jdb29bZ19tdWR6aF10gG9xa3F7fXV1YXSFinqHh4B/d3J1f3VhcG1acnRicXKFfHVlcoBsYWx6b2ppe3l2cmaFdnt6dXFlYWVtc35pbFRpXl1US3NjUEdWYUdidmdhS1RvV0pMV1hna3Z6ZGVucWZjWlddWXZlVUpcY1doWFlJV2VRSGJ4Wl1fbFteXGFkXn9pamBvdHhub252g5d5coGAfH+Ii4V9dXWGeYeMfXN1dYJ5enqCi459foSJaXOWgXqKnX1+hXqBen98hohzcY+ujHt7h499ZXKIenR9fHZyb4Vse35sj3picG9iZV1lVllZVmNma2BdXHKEaFhvbVpeV1pcbHticHd2bWJabHNzZ3V1cGyEeX6AeXdubnRlaXRlW2d1ZnZ2kXleXVJmZmuDgnR9YmNpXFRYXWJjkKVoeHSChZB4bW96aHhte4R7dYlzgHh8eH9oZXZtYGZgXmpfXXNrWWVdb29iemVbd3trbm5vd3hzdGRyg5J+h4KIenZvcn1zYnhkW29xYnFxgnxzZ3KAZF5udmlkZ3l7dW5vgnV0fXNxYl9mbm99ZGpTaFhZVE13X1FKWVhIYnVkYUlUbVNKTFpXaWxxe2JsbHNjYVlZW2F2W1NMY11YaVNXSFlhTkdpdVheYW1bW19iYl2FaGhhbnh5bG9qdoGQeG2CfoCBkoeDgXZ0iXSMhnNxd3WCd3x9foyPgH6TfnB3lYN8mZJ5gIB4eX5/dIiDc3CZont6f4mUeGR1iHlzeHVsdG9+bHl8cJFyXnBvYGdibFRbWldoY21mXFxxiWVTcW1aWlhYYGx2Y2l1amleWW1zcWxzc3NqhXx+f3x2bm5sZGlxY1tqcmR0do5zW1dTZWFygH9ygl1iY11TWmBbY5KfZXJxhYSRdGxrem1vcHt8fHGBd39yenl5ZGV1aF1iWmBnW152aFdiXXBoYXdgW3t2aWlybndzcnRocIGUgoZ+hHZyanB9bWZ3V1xrbmJxc4F6c2dvfltgb3FiX2pxfmxsdX5zcXhrcGFcZWxsemFnU2dVV1JQdVtSUFlSSGN0YmBHVWpQSVBaVWtra3xlbW9xYVtaWFlscFdTT2ZXV2lTVEZaXE9IcnVYX2NtY1hgYGFdi2pjZG15eGtvaXV5hntrg31/hJl8goR5fYhuj4Zxb3d6fXSCgnyKjoKCl3R3gpOFgZ+JdYCAgXN/gnGHgnVvopd0e4aLhntleItvbntvZnhwemxzdnKMa150bmFnZWtSXVtVZ2FsbFpccIxkT25tXFZYVWdqdGdidGVlXVludG5wdXV5a4d8f3yIdo9zZGRrbmFcbm1jc3iHa1pUVmNkeH19cYVcY19jVFpgWWOVlWNucIOFinNqaHtvZnN3c3xsenR1b3l+dV5mcmNbXlZhZFlhdGVVX2BtZGFxXV1+b2hpc3FzcHR1am2EkoGIe4VxcmZufXByb1RbZmtmcXSBd3NjbHZVYnFqW19vZn1mbXd9c3Nzam1gWmRqandeZlRkVVZQVG1XUVdTUEhkc19hRlhpTkhXVFZtaGR8aWt4a2JXXFVbdGRTUldoUVlmVFNIWlpQTXh3W19lbGlZYmBeXo9uYmZseXVub2h2dn9/bIN/fYaXe3+HgYp+a5OIcmd0gHt1gIJ8iI5/i5NyfIqRhYefhnt/hoxzgYZzfYN2bqWMc4GNi3Z3bXqMYGV8cGZ6c3lsbXF2gmdke2xjZmdoU19eVWdfbG9bXm6NaE5pbF9UVlNvZ3NsZnhkZFxYcHRscnp3cm2Ie392nHp5a2FlbG1eYG9qZXB4fmdaVlhgbHh8e3CDX2JeZ1ZYX1dkm4hia3GBh313a2t4bVx3cWx7anZzbm97gHJYam5fWV1VYmNYZHFiU15haGJibFpgfWtma3N1bm13dmtohYt+iHqIbXFlcH1tcm1jWWFpaW90gXRzX2lsU2VxZFRibmJ6Y3F3e3ZrcG1rX1hhZ2h0XGVWYVZTTlhlUk9cT09IZXBdY0ZZaU1JX0tYbWRfeGhufmRgVF5UXXVcVFNgZk5dYVRTSlxZUFl1dl1fZm1oWGNhW16OcGNnandxc25ndnR6g3KBgnmHjX58iYeOem6QinRsc4J0f3+HhIaRhJWPeX6Mj4eRm4SAfIyEcoCBc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY2NjY2NjY6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjYyMjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJOpa+tra2trqSfoKCgoKOAY2dnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1M0GptrS0tLS1qKOkpKSkp3xcX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmZmZmZKPkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho+QkJCQkJGPj4+Qj4+Pi4iIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQj5CQkIuOkZGJh46KkJKTkIqRjI6Ph4+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIuLjIyMjIyMjIyMjIyMjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOh4qKho2GiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI+Gi4uGjoaLj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCQj4mIjYaMiYmPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhoiHhoiGiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2JjYqLjImOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dXZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaGhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRUA+Ojs+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Ozw6Njg7PD49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VzcXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk4OTpOPzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYGBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0+Pj07RnlfOz09PTw8PDw7Ozo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMS0lJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0REPz49PUBJSENYeW9DPkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRkVOQDpAZX5+eHJ3bz45PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fX5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QTkw+QTw8PT8+QkM/P0FBQUJATXtmQGuHhISDgnpwPzk4ODo7PT8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQz9VdXlxgYGCgnyEgHJCPT0/PT0+Q0Q/Ozw9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQFV1dIF/fIODfIWFaEFBQENAQD9AQD49PD1BRUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFATHNzf399g4WGhodfPkNDRUA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtNSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFZneBg4SFhoeHiYRLREVEQ1d1homKflhHSEpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdYdIKEhoSChYiIjWNAQlV0h4mHh4aHgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTEpbhIaHg4GDhoiJfVdshIeGhoaHh4eHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJS0lJR0hJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSWWHh4aBg4WAgYKDhIWFhISFhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpKbIeGg4CDhICBg4ODhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5AOzk5OT09Pjw8PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlphYGAfoCChISEg4OEhomKi4yLiomKi4yJVDs4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3NTg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDRXaFf4CBg4ODg4ODhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo5Ojo6PDg5ODk3Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3JydHR1d3l7e3t8fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7QjlIgoOAg4SFhISEhIaJioqIh4iIiIqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw8OTs8ODo6Ozo5OTk8Pzw9QUJESUpNS0pLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/PFeGg4KDhYaFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQUI+QEJAQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQEA/P0E9Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHFxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCYIeDg4WGhYWEhomJiIiGhoaHiImKi4uKioqLiotePkRHSUtKSUZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREVFQUZFRkVGRkRAQj89QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBEREVjiIODhYWGhoaIiYmIh4aGhoeJioqLjI2MjIuKiohXSExNTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkA/QT9CQ0hISmCGgoOFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpPTU5MTE1LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDs8PTo/QD5AQENGSkpQaIODhYSFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpIR0VKSURKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VucXV2d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af39/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo8OD0+Oz1BPj9ARUlLTVZzg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMi4uLi15RUVBNTk1LSkdGQ0dKR0xKR0tPTEtKSk1NTE9QTkhJS0xPUVFQUU9PSklKSkxKTEZHSEdGR0lGRUVCQEJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FITE1RV3mFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdVUlJUUk9MS0pFRUZLT05PV1ZRUE9RU1JNU1RPTVNMUFNVV1JTUVBMS01NTUtOR0dKRkZISkRERUVCRENjcHV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JDRlZORk9RUVVZfIaDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7OlFTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tHSElIRUZJSElISWpydnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/gICAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQUVCQ0dFREVMWFJNVFZWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD5AVlVZXGRgVllicl5dVl1aVkVRWVpbWV9UWWdSVVZYVVRWVE9PTUpMSklJTE1LT01Tb3N2eHl4d3p6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUlZWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lIWVhZXF1ZWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af4CAgICAf39/gIB/gHh5fVlOS0lJSUZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxYU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpbWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllabnJ0d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVVNUXlpYV1dXemtYWlxcXlNQUFBJTk9XVlhaWmRxc3Z2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JRUU5LUlRSTU9ZUU1OUVNVVU1RU1JQTkxMSENJSFJUVVpcbXJ2dnVzc3d7ent7e317fX19fn19fX59fn9/f3+Af399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVZRTElMSWFsknRQUVNOUVJRUltSU1JRUlVVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkNDQ0NCP0RQQkRAQz5CSEdWQEhOTUddaVBIRk9GREVGSEdIQkNIR0hKR0NCQURAT1BNUmRzdXZ1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZWJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPj46Oz5APz8/PmtRS2FFRkhJRUI/R0xOR01RVUlCRT8+PD08PT0/PT9BQ0I/Pjw9Qj5KTUZVbnV1dXN0dnh7fHp9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9enh6fHx4d3hkQkBAQT06QkNBQURCXF1Pe05PT05LTE1PT1FNS0xXTUhHQEI8OTc3NTk5PTs7Ozg5ODk/O0FIP1x0dXV2dXZ3eXx8fH18fH19fn58fX19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5gZWBdXnF2a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSUVFRkRNUlBhV1JYUVBTU1JVW09PUVZQTUpDRj46OjY0ODY5Nzk6MzY2Nzk2PEI9ZnR1dnd3eXl7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUxUVFNRUVVPTFJTVFdYVFRYUUxYWVpWWFhWWFldV1dYaHNrXVZgdGthYV9dZGBfXllVUE1PTkxJR0pLSUhGQ1FQU1pXVFRNUVNZU1xlVU9TVFJOS0lIQz9BOTk4ODk3ODg0NzU3ODU4OEduc3V4eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk5OTEpGUFBVWVNUTkpPT1VTVFxWUlVTUk5NTElISEY/Pz06Nzg3NjU5OTY3NjY1V3FxdHd5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0pHT1BPT01SSk9QUFBOTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUVBOTk1QTlRSUFJMSUxLT1FQUVJTVFFST0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHR1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUJGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+M0A+am9hUlJRQEZUUVBRUFFOUU9QT0xKTExPUE5OUFFRTlFPSkxNTUtHRUVEQjs9PDw5PUc2Njc2RG5xdXd6fHt8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkM4RU5TXWdTUVNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01JTUxJTEtMS0dGRkVEPEFBPjtARTs8ODlUcXN1eXt7e318fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT89PUFAQj0+RUhHREZGSUdLSkBGQUFARkhFSk9IUVJhXFFQUk5TT09PTExPTUtNTE1PTltWS01RT0hKSENJSkxMS0ZGRkQ/QkM+PEJGP0I/QWRxdHd7ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPzs/QUBAPkFESUVDSEdJR0lFQkI/PjxDQkFHSURNT2FlUU1PTldLTE1LTE1NTUxLTk5TZE1KTFJJSUlFQUhKTE1OS0dJRkJBQkA/RUZFSERLb3B3enl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUFBIS0U/Qj05OTk6P0I/PEFCQkFEREdLRkRJSUdHSENDP0I/P0BBPkNFQ0tOUVRMSklNVEZJSUpMSktMSUlMTU9QUlBLR0NMR0NDSkpMTU9OSUpJR0NDQ0RJSk1MSVpzbXh5eHp7e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FqcWhlcUhLQ0ZISEdKS0lKTERHQj0+PTo6OjtBQj89QkJDQ0hGSkxKRUlJRkdHQ0M7QUBCPkBAQ0VDSU1QR0hLRkhLREhJS01ISkxISEpMS01dUklIRE5HQkVLS05NUE5LTUpLRkdHSk1OUU5MY25pd3Z3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRvRktDRkVHREVFRkVHQ0NAPjw9Ojs6OkBEQD5CQ0VFSUZKSkxGSUlHRkZEQjtCQ0M+QENDQ0VHTE5IS05IREhFSUxOTUdJTEdFRklJTE5LSkhFT0lDR01MTk1QTU5OTUxJSElPUlFSTlJmZ2Zyb3N4dXt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSUNFRkVCQ0JFQERCPj8+Ojs7PTo9P0NBP0FDRkdKR0lJTEhHR0dGRUNAPUVFQj5BRENDRUdISUdNUElGRkdLTk9LRkhKRkVERElJSEtJR0hQS0RKTUxQTk9OT09OSkpITVJVVFJPV2RhYW1ncHJvc3l6Z2VoaGNpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0JBQkQ9QkE+QT06Oj0/Oj4+QEI/QEJFR0pGSkdJR0ZGRkVEQkFBRkZDQkJCREVER0dIRkxRTElPSkpMS0lHSEVGRURDSUhIS0pIS1JNQ09PTlFQT09OT09LS0tQVVdWVVRYYF5daWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Fya2tzTUZGRUhCQkFERDxBQUBDPDg5PT46Pz0/Qj9AQERGSEVIRkZHRkZFRENFQ0RJRkNGRUJFR0VFRkdFSk1LSFFNSktISElFRklIRUNJSUpLTUtQU05EUVNRUVJOT01OUE1MTlNXVldYVlheW11kYGhiamlna19lZWdjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEJCQkZFPEBDQkQ8Nzo9Pjs+OkBCPj8/Q0VGREZEREdFQ0VDREVGRkpFRUlHQ0dIRkhGRUNGSkpHTUpMS0lKTEZJSEtIRUtLTE1OT1JUT0lTVVRRVFBRTU5RTk1RV1pWWllWWl5aWGFgYGBfaGVjYGRlaGdqaWhqZmhubGxubXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3JzeU1ISEdJREFDSEU8QEVDRT04Oj4+PDw8QUI8Pz5BQkZDRUJCSERDREVGRkdHSUZHS0hDSEhHSUdGREhLSUdLSE1LSktMSExKTUtJTkxPTk9SVVZPS1VWVFFUUVJMT1FQT1RZWllcWllcX19eYGNeXGFja2JgZGdocoVoZ2lmam1ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0lLSEpFQkVHRTxAR0REQDk8PkA/Pj9DQjxAPkFBRkNFRENIREZER0ZISEZISElLSkVKSEhLSEZGTEhISEpHTExMTExJTUtNTk1PTFBQUVVWV09KVlZVU1NSUUxPUlJRVltbXV5bXF5gX2FgYmRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dxdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3b3ZJSkxJTEdCRURFPEBGRERCOz8/QUBAQERBQEI/QUNIQkVERkhFSUVGRUlIRklISkxISEpKSUxKRkpLSElKSkdLS01NSkpNTE5PTk9MT1BSVVhWTU5UVlVTUlFQTU5UU1JXW15eX11dYGBhYWFgYmRlYmNoYmRpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXRzcHN2dHV1d3Z1dXRlcXNrcHFqcnZvd0pNTEtNR0RDQUQ8P0VFRUM9QUFDQkJDRkJDREFBRUdDSEdIR0ZKRkNHSkdHSkZJTEhJSk1LTUxHS0lITEtOUUtSUUxTTUtOTk9QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhX2BiX2BlYWFjaW5oYmloaG14dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnJxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHREFARD4+REVGQ0BDQUVEREZDQ0VHQ0JJRUJISkpISUtGREtKR0hJSUlLR0pKT0tOTElMSEpNS1pmSmRcS2xSSE9OX25VbHNbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZcbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPz1ERUZEQ0RCRUVER0JGRkdDREpERUpMTEpMTUdHTUpISkpIS0pJS0pOTE1NTExJTE1MW3NiZHBebGxVTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xwdWdwTUpyeXZrYmBrZWVteG1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QkI/PUJGR0JGQ0VERUVEQ0hIR0RFS0dHTE1NSk1MRkpOSElLSklMSkpKS01NTk1NTUtOTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtb3ZcWWxRXG1tWnFta29teHh0c2lwXGBzbHFqVXV5eHBjXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEVFRUJCQj0/P0ZHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5HTE5JTEtJSk1JS0pKS09QTk5NTE5NTFxoZHVdbHFXbE5PUW1VWmtea2x2YWxkdFRlY05tWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2hhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHdJTUdJREVFQ0FCPEJAQkZER0ZMSEVDQ0hLSEhGSkxMRk1LTFJSTEdNTUhOSklITkhKSklITk9OTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210Xm5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZ2Jiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dEhLSElCRUVFQUA+Q0NCR0NISU1JRkNGSkxJR0ZKTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTE1NTElLS0tTa2JaaV5famNyclpfWWpvX2VlVWtfY1thYlFgbGhdalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdzSEhGSURFREZBQEFFRERHQkhKTEhGREdLTElFRkpPTElPSUxbUUpGSEhLTUlISklLS0lISkdLS0tLR0hKSkxMTEtJS0xOVFtcVFBUTVBPTk9PVlFPT1FPT1FKSk9QUWRxaVRZV1tbXFVZW11YXVxcY2ZhYWZiY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUM/Q0dERUdDSUtMSEZER0tMSERHSVBLTE9LTFdNSUVFSElKSElLSExKSEZISEpHR0lFRkxISUtOTElPXFdeT1xbYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXWJYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0eHl5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJESUVHR0ZLSktIRUVKSkpHRUhIUEpMTUpNU0lIRUFIRkpJS0tJTEpIRkVKSEVGR0VFSkdDSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5fXF5TW15jX1pdYGNgWV9iW2BeW1RYWFpfXmRiYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHZyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUlERktLS0VGSElOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlFRERFQUZKREBKS0lPW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1FbX2FhXV5jYWBiYmJjY2VaUllWVVxbXmNgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGQ0dFQkVHSEZHSElGR0pHSEZIS0lMRENLSk5NTExISkpISkc/R0ZOSktLTUtLS0lHSEREQERBSElBP0lKR09dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5QUF1fYWNjY2NiXGRjYmRjZlhRVVRTXFhbYV9eX2FhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUJASUZDRktJRkZHSEdHSkZGRklMSk5FQ0tKTE5KTElLSkhJR0JISFFNS0tPTUtLSUhHRUQ/RUJISEFBR0ZEVF1ZXlhfWV9bXVVYWFBdXVFLSldeWF5bXVZaYFJRX19iYmBgYmJgY2JiZGRiWE9RUVJbU1xeXV5eX19fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIQ1JLRkhISEVGS0pNUEVHSUlLTkxMSUxLSUlHREhLUU9NTFBMTUtLSElDRUFFQ0hHQkFGRUJWVUVcVF5TVl9YTlRVTlpbTUpLVWBhW19YX15hXU9ZYlxgYF9iY2JdYmJXX19UUE9QUVhSXVxcXV5fYGFmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElSY1BEV19JR0dIREZNSlBQRkpJSktOTEtLTEtKSkdFSk1RUU5PUE1OTE5IS0FEQUNERkRDQURFQUxIQ0xMUE9PTEZNRkdJSkhHTExNT1FJTE9QUFNQTFFTUlVaWVdZWFhkVk9TVFBQT05QVVRcWVlbXl5hYWVmY2hja21xc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01eTEdIWU1HSEpIR05MUVFJTEpLS05OVU5PS0tMR0dLUFNTTlBPTk9OT0hLRWBFRF9MRGZjRE1bSF5cc21PTVZtWUxDUGBVbFdnSl1YVl5ETFFVTE1UVlFSVFhXVFhVVFxUUGZaaGhkWVRrVFdWVVtcXGBgYWJiYmBnaWdubGhyenx9foGEhISEg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1RJS0dgVEdKT0pJT01SUUtNS0xPUlVST09KTE5HSE1RW1lPUFBOT1BPSUpQf1FJfFlZcnNYUG1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVpfVlVXf2p0dXVfYXZfWGJcXGZbX2FhYWJeYGJnbXBsYHB3dHiBgYKDhIJ/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0lMRlJWTEtPSUtSWFdRTk9PTVFUTk9RUEtMT0dNUFNbWlRRUk9QUFBKSFp4XVR4ZGhZUlRRdmd0bHBibmZrUXJPTXdtanJwc3JxcnBvcIBdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3NzfH1vfnlvf3JgYGBiYVphYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tISlBPTU1KTlZeWVVMUVNOWVlMU1NSTkxQSVFSVFlXV1FUUFBQUUtHZnhsY3hxbVpKTFV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclFoem1panp6fWx4en9wZ29YdnZqdnVwgGFzaH1pbHh8b19fX2NiW15iZGdpamRnYmNkbGxwcHN0c3NzeXFyeGJsdWdyeXtzc3V5foFzdnpufH15eHJuTkpTdE5DQkVQUElLS0pMUE9PT01QWmBaWEtUV1BhXlJWUVlTTVBJU1RVWFdXUFVQT05SSktyb3V1cXVxZGhhVm5McXBeRmh5V3ZUS2h4fXhgeXtzbmFebW9kUmdydW5teXB3bHZzdHFsbVxzfnprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZWVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21LS1tWSEdFR1JQSkxNS0xRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlVXbE9ubHtzYWpnf3ZVS1draH1sbWx4YFtwenteYHpzY3JveHFoZHxpcntdVEtsX3Z1a2l1e3ttfnhrfHBdXl5iW15iZGVnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3Nya2hsbXJ8a21oa3t0bW1rbU9HSktISkhIUlFMTlBNTFRTUk9TU1dSVlRQV1pWVlRUVGFgUU9OS1RTU1FWVk9OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWFFOUFVUWFhYW1tVU1NXW1dYV1pQU1VXV1hRXVhWXVVTT1hSV1dXWFpgW2dyXltcW11eX2NaX2NkZWZkY2NiWWNjZmZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLS0xNS0pUUk1RUVBMVlVUUFRVWFVZVVJaXVZVVFdVWVhQT0xOV1RRTlVTTlBNTFFQS0pRUktRTUtLT1JUUlFRU1NJSE1OT1FSUVFRVFZSWFdcV1NTUFFVVVZUWlFOU1JXVVRZVlRZVVNSVVNUVVhZV15aX2FdXFtaXFxgY1xdYmNkZ2VkZGFZYGFjYWJpaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRjZmhQSktLTk9MTVRRT1RRUU1YV1VUVVdXV1pWVFxgVldWWVVYVFFQS09YU1BOVVBNUk5LU1BNT1VUTlFOTU5RU1BUUVNUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdXV1lbU09TVVdVVFlVV1lUUlJXVVVXXFlaYF1WWV9dXl1cXWFhXltiYmNoZmVkYlhgYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl1dYmhrYWdmaGZkYGJjYVBLTUxQUUxPVFBQU1FPUVpZWFdYWlpYWVZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBRTk1RUVBSWFRSUU9NT1NVTldSVFVVT05OUVNVVVRUUlRYVlpdXFpWVlFSV1hWW1tWUFNWVVVWWFRXV1RSUlhWVVpfWl5gXlZeXV5gXFxgYF9fWmJiZGhoZWRiWWJgYl5fZmRjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9VXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTFBTUlVaVVRQUExQV1ZRV1NTU1hNT1BSVFhVVVVTVVlYW15dXFtWUk9VVlZbW1dRU1dVVlhVU1haVFNRWVdWXF5bX19gVWFcYGFeYGJfXGBdY2FjZ2lkZWBaY2BhX19lZV9gY1taXFtcWlpZWVdcWVxbYF5fW15eYWBfYlxZYFpRTk9OVlFQVVNQVVRTUFdcXFxYXlxfV1xeanF3eYBjXFtWVlhSTk9XU05RUVBSVFJMUVRTWVpXVU9STlNYVlRTVFJSWk9RU1NWW1ZWV1RWWlhdXlxcXlZTTlRWVlxcVlFUVlZYWVJTWVxUUlJcWFpdXl1hYWBXYltjYl5hY19cYmFiX2RnaWRmXltkYGFgYWNlX2JfWVpeW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQWl1eXVtgXGBVXF1panJ9c2xoXFVZV1FPUltTUlFUUlRVVEtSVlVbWVpTT1NSVlZVU09WUlNaUlRVVFhcV1hYU1hcWF5dWVteVFVOVldXXltYUVRVWFhYVFZYW1RTVl1ZXV1hXmNjXllgW2ViX2RkXl5jY2FdZWZpZGZdXmRhYGFiY2RfYl5YWl9bXFtYWFhYV1taXGBdW1xcW1haW15WXlldUE9PUlpQWlVVV1ZUVFReXmBeXmJcYFVdXmJreXRsfWxaVVpVUVFTXFRUVFVUVllXTFJaVl1bXFJPVVNYVlZTUFhSU1dTV1ZWW11YW1lVWl5XX15ZXFpSV1JZWFlfWllTVFZaWVpWV1lcVlRaXVxeYGFgZWRdXl1dZWFiZmReX2RjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWldWXVpdXltaW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9gYWFgY11gVV1eYmVldYF6aFhZWlRWU1ZcWFdXVlZXXVhQVVxZXl1dVFNYUlhWU1JUWFJTVlRYWFhdXlhdW1VeX1hfX1hcVlJZVVlaWmFZXFVXV1paWlhZWlpYVl1eX15jYmJlZV1iXGBmYmVmZF9gZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWltcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWVFxUVldZV1ZcYGFiY2FkX19WW2BkYV96dW9oWlxaVlhVV1taWVtaWFlgV1BVXltgYVxUVVhQVVZVU1ZWUlNVV1paXF9eWl9cVl9fWl1eWV5WU1lYWVpdYlpeVldaW1tbWltZW1lZXl9gYGRjZGVlYmRaYmZjZ2ZlXmFjYGNeY2NpZGRnX2deYmJjYWFgXl9YVFpaWltbWFtYWFxbWltXV1pYV1xbXGBdVl1dU1BWWldWWlVYVVhXWF1fYmFkYWRhXllZYWRiYGxmaF5cXVtXWFhZXFxcX1tZW2JWVFdeXWFjXFNWWFBWVlZWVlZTVlRYXFxfYGBdYV1XYF5bXlxbXlhWWFhbW19gXF9YWF1cXV1eXFpcWFtfYV5gZGNkZmZmYlljZWVoZ2ReY2FgZWNdZmlkZWhfZ15jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJNUldZVldaWVtcWVdZXmBiYWVhZGFdXlliY2JfYWBhX1xcXVhXW1tdXV9fXFpdY1hZWF1gY2RfUlhZUFhXWFhYV1ZXVl1dXmBhYV9iXllhXV1eWV1eWVhWV1tcYF9dX1lZXl1eXmFdW1pZXF9iX2JkZGVmZ2diWmRmZ2lnY19jXmFmZFpoaWNmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWVdaW1pZV1hWVVtdXV1gYGJieEtXV1xZV11cXF1aV1xdX2BiZGJiYV1gWGNkYmBjYWNeXFxcWFdbXV9dYF9dW2BkXFxYWmNlY2FSXFlPWFdZW1pZV1paYF1gYmJgYWNfXGJdX11bX15ZWVVYXV1fYF9fW1peXmBiY1xbV1tdYGJiY2VkZ2ZlZ2RcZWZoaWZjYWJcY2dgXGlpYmhpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldXWFBYWl1hY2Zmcmt/SllXXVpaX11cXlxZXVxeX2FjYmFhXWJbYmRhX2NiYl1cW1pXWGpxYFxgX11cYWNfXllZY2VkYVRfWlFZV1xdXFtaW1tjYGNiY2BiZGFgY15gXF5fX1pYVltfXVxhYV9dW2BhYmViX11TXF9gY2RkZmVnZmVmZV5lZmhoZ2RkYFtmZ15haGhiaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7enp6e3x8fHx7fHt6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2d3d2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7enp7fX19fXx9fHp6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb3Bwen59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYiNsbW0tLS0uFEmKysrKiKL29LS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb296gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMi5G7wL/AwL/ESRQbGxsbEI7v5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSDgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dXZ3d3d3d3d4eXl5eXl6eG9wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYCBgYGBgIF3c3Nzc3NzfYWEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl2dnZ6e3h7eHd2eHt4enl5fXp5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7enp6enp5enx9fX19fX17enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHp7fXp8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8e3p9eXx6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3d3p7eXx6e3p3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6fXx8fXt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl7eHt6eXt4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKEhIKDgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBgIKDgYKFhYWFhoaHhoWGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4KDhISCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Qko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChYSDg4OBg4SFhISFhYSDgoSFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgI2MgYGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgoGCgYCDlpaDgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICCg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAgoOCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoGChISCf319fIeamIaEgoSCgX+AgoGCgoGChIKBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODhIWDgYGDg4uIhX58fH1+f5mahoSFhISEgoGAgYKDgoKEhIOCgoGBhIWEg4ODgoKDhISDg4ODg4WFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEg4ODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4CGmpGGfIJ/gop+kJqDgYKBgYKCgYCCgoKCgYKDg4KBgYKDhYODg4ODg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhIWFhIODhIOEg4KGlJSSlJKPjYuHhISDg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/foWdnoWDi4CAhYCBiYGBg4GBgYGChIOBgYKBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgpmhh4SFiId/f36BhIOEgoODg4KAgICCgoKCgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSCkJyDgICBgX5+fX2EhYWEhYJ/fX19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOGi4GAf4OLgX19fIOHhoOAfn9+fn9/f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODgn9/hYeEgX9+gYWBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOAf4KFgoKEgoGAgH9/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISDgX+AhISDgYGBgYKCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiYuLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5GOioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OCgYOEg4OCgoKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhIGChIODg4OCgoKDgX59fX5+fn5+fX1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4aJiIODhIOFhISFhYaIh4aFg4KCg4WHhoeGhoOCgoOEgoODhIKBgoGBgYODhIOEkZKRjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaFgIKEg4ODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYODhIWFhYODhYSEhISEhIWEgoKDgYSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/goCAgoODg4ODgoJ/fX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4SAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fYCCg4OCg4KDgn19fn6AgIGAfn19fX1+fXx6enp/goKAf39/f35/f4B+fYB/f4CAgX+AgIF/f4CAgX59fX+AgX9/foCAgH+AgICAf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn1+foCAf31/fn1+f4KDg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6eXqAgH5+f39+fnx+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXt/fn5/f39+fX5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+f318fH2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2Af4CBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19e3p6eXl5eYCCgoKEg4CCg4F/gYCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fn18ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYOCg4OCg4OCgoKCg4OCgpKQi4iJh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoaHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOFhIODhIOFhISIko6MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYB/gIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYWFg4OCgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYKEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+fn6Agnx8f3+CgIKAfnx7ioJ9gH9+gYCAgYKBgoCBgYGAf4uTj4yLjY6NiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhYaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJGMjI2NjoqFhoaFhISFg4OCgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYyNjo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6Eko2MjI+Ni4qGhIWEhIODg4OCgoKDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+Af36Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIqPjIyLjYuKiISEhIODg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+AgIGBgH99gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBgoGFhoWFh4aHhoGEkY6Mi4qLh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fHt+fnt8e3x8fHx9fH18fnx9fHt7e3x5e3x7e317fX5+f4CAg4eJiYmLiYuJhYiRjYuIiYeFhYOCgoOEhIOCgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX5+fX18fX19fX1+fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6ChYiHiIqLi4uJjZGOjYmIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImOkI2LiIiFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx+f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI6NioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEg4CAgICCgX+AgYOBfn6Af35+gH59fn6AgH+Bfn+Af39/f398f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8e3x8e3t7fHt8fHx9fIqKiIiFhYWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foB/fX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHp8e3x+iYaGhYWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh1dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goR/g4KCgoOChIKBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4CDgX+Ag4J/f4B/gX+Af3x7e3p8e3yCgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fH9+f4B8f399fYGAgH59fYB/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/goCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+f3+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5+f4CAgIB/gYKBgH9+f4F+f4CCgoCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf39/fn+AfX19fX+AgIB/f4B/fIB/f4GAgYCAf3yAf31+fn9/fX5+gIGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEg4KChIKBgYKBgIKBgIF/fn5+foB+fX58f4CAgH+AgX98gH6AgH+BgIB/fYB/fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh4e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cnmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn2AgIGAf4CBgHyAf4B+f4GAf39+gX9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36BhIKCg4WFgoJ+fnx7e3x8eXd8eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXJweHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH9/f31+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+foCBf4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gICAgIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+BgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8e3uHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDgH+CgYSDg4SBgYOAgoOBgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9/gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIOBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgH+CgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9f3p5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYKCgIGAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgoGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChYaEgoODg4SBhISAg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhYSFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fXyBfXp8fH19fHp7fn5+gH9/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgISFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fX19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SDgoKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYJ/fXx8e3x8gH19foB+fn1/fnx8fX19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f39/fH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KEg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODgoGEg4GDg4SDhISEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5+f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSBf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhIOEhYWDh4aGhIWEhIWEhYSEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgX2BdYF5g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOBhIOAf319fn1+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEg4WEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhIWFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHOCg3+Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW14bHB5bHV9f399foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gYB/fH99fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoaGhoWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhYaHhoWFhYWHhoiFhYaFh4eFhoSGhomIhYSJioiGhIaGhYWDhYaFhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhoeHiIaEhoWHhoaFhIWFhIWFhomKh4WFhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWDhoaGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fXt8fH1/fnx8fn2Af31/gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhoaFhYaEhYaGh4eFh4aJiIaGh4eIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWFhYOGhoWGhYWGhoWEhIWFg4SHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fX9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhIaFhoeFhYaGhYSDhISDg4eDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYeFhIOEg4OEh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e359e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDhIODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXx7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOGhYOCgoKAg4WCg36BgYF/g4F/fn5/fX98fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYB8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYeEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFh4aHhIaGhoaFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OEh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWGgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4WEhIaGh4iHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOEhYWDhYWBgIODf35/gH9/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5enp8eXp6e3t7fHp7e3t7fX59fYB9fXx8fYB/fXyGg4aGhoaGg4SDhoKFgYGAf3+AgH5/gIJ8fn9/foCAgYKChIWDgoGChIGAg4KBgISFhIKBf4CCg4OEhYWHhoWEhoeFh4aGgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhIODhIOFhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9fYN9fn59fX57fnt7enl7enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIWFhIGDgoOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf31/gnx/fn19fHx8e3t6enp6eXt6enp5eXp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8rKysvLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTT0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzQ0dDQ0NDQ0dHR0dHR0c3Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19vb29vb29vb29vb29vb2NbX19fX19fX1tbW1tbW09LT09PT09TU1NTU1NbW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNloSGhoaGhoeHh4eHh4Ky4t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSPjIyMjIyMjIyMjIyMiaK/vL29vb29vb29vb28v9LS0tLS0tLT09PS09PT3OPi4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzm5QU1NTU1NUVFRUVFNMoPPr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWlVWVlZWVlZWVlZWVlJ8rqqqqqqqqqqqqqqqqLDS0tLS0tLS0tLS0tLS0eDs6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzM5xVFhXV1dYWFhYWFhXUKHx6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSlnl9ZWlpaWlpaWlpaWlpWgK+rq6urq6urq6urq6qx0dLS0tLS0tLS0tLS0tHf6+rq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183OeF5hYGBgYGFhYWFgYFqk7ufn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqqNoZGVlZWVlZWVlZGRkYYayr6+vr6+vr6+vr6+uttLS0tPS0tLS0tLS0tLS3+np6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcfFxcXFxcXFxcXFxcXEy9DPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs/Oz87Oz8/NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMzMzMvP09PS0tLS0tLS0tLT09LU1NTV1dXV1dXW1dbW1tjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Pz8/Pz8/Pz8/Pz9PPz87MzczP09LSzs3P0s7Ozs7Ozs7Q1NLPztHV1NPOztPTz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfX1tfX19fX1tbW1tbW1dXW1dbW1tbW1tbW19bW1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7Pypal0dOtg4OVz9KkodDOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Pz5yqna3Lmrq4mbWzn6Gp0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD9BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MuUiJqevKKMgI3FnpiVnMjQzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RvciZm6ygiKzWupmhnbCy08/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9KXlKKxqK2bprKZlq+zqtXQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9Ozm8SawaKdlaeQmoSdk6TV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDRzo2QnsSntKuff6CphZmk1dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0cvaqJmwztrBnIC8raaYr9bR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk3OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49Pjw7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmOpZqgp5Ghn6CZqJaYm7vV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU0Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2Lirocq7oaannrekq6Oew6CrpJzR09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT056QjbbZp4+PrNjCj4281dLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHSusTV0tW/v9bS1cXE1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tXU0tLS1NXT09PU1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFSElCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0hOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWkpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKSioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5qbm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZybm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2enp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1tcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVVYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKkqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqaepqKOnppmcpKaioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnrKmkn6Kgoqahpq6mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Nec19oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+qqqyoqKuwqaiqqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2r7Owq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbWh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLG0tba8vL68vL7Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGwsO5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWVkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQ0REOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbWhxeG95amlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsPEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcndzeWZnXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPDwcS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamddam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjIycfFycfIx7/Fx8TEx8jK08/SzLy4trS4uMG+vrq9ury6vKytp6q7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsLJwcrKyMbMys3FxsXDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW90Yl1iVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHCw7+/vsTLyMrLx73U08fIzcjDyMnJxcXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWdkamVham1ub15ZXFZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O5uLm7vcHHwcTNv5DLxsXEwcTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t73Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZ2NbWlpcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tri0tLW/u73Aub66urTAuLW4s666u7a/0Z+IwM67v8G8u8S+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u766tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb2+y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xY2BiYmdqZ2ZpZWldVlZUWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQUBDPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTk5KYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS1sbC1t7W7wbi+ub+8vLe0t7Ctt7a4xMuMhZvIvbvDtbrHuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaGioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVraFhYTktLS1JJTEhDOT04PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v768sq2vrLGwt7y3u73BxLm3ubiwurS5vMm6g4WGtcS+x7e5uK23tbi6tLizu8XGy8G8xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe5sb2+u8S2uKWHgIt7jpzFo3yDhbHLxs/CwLiutbW8vri6sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bnhjZ2JbY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6ujsLjJ07a6vrzGtKJ4ZXJlVWBmh419h4eqzs7RzMrEtbrAw8i/vrW/wb/Gxr/LxsO/wbzAw8zKx8XGwLm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYGFOSE0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ8QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbO/y8jbvr29vIFqdmBndl5XVlxzgImLqMzIzMvNysbCxMvOwry5vbm5wMO/yMbEwcG/xcDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tby1xpBxwdPAtH1bTG9hUHx/dWJWYH6GkanGwsfLyMHDwcDJysLAu7qwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrKvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem1zeHNncF1bXlxZUUVEQ01JQUU9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u9KXcoO1wptYVFaNYlJkgISFbUlyhpe0wr2/xsC5wLy+xcS9vbmysK64t7/Dx8PEvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbS3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbmlbX2BZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc+Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucLXmH9yi652Uk9smVpSVVqalHdMbo6itLi4uMK6s7u3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2ZdWlRKPD8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnD1Z2JfXiVYE5qjXVdUV1surV1VFePuLWysbe+ubK1sry5vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnFsX2NhW11PSEE+PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wMqfiYF9gFhYko9ncWB3cnqXd25rX4u9s7C2urW0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJtY11mWFxdUk5NQT5JQkFKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLnFq5WJjHhMZqDDfYabkF1/eWx1eYmxurWxtLWytK+su7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWzu7eWk6CKTWiSk3ZveXJoaWt2gXd4pby4srSzsLGtsLm4try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yqr6Oko6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7K3pp2ok1iAcHNtZGtfWVdYW2JfbIGbubKts6+urK62trK0ta+qpJ6bnJyeqKieoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moq6ufpqKbo5yVkIyPj5CTkJeVlpifnp6amKaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HUE1MQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpaypsMCxs3x4dnJ0ZVdWT0lJS05PT1xrcKa1qrK0rqqrr7Cys66lnpKYlI+YoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqqxo6WonqCclZOQj5GQmJCWlZiXn5ibmZqjmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUpIR09STkpORzxFQD0yPzc1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoabHxKZhZmlyYFJPSnBVVkpPSkxUXl2Bt6+vs7Wqp6yropyZlI6RlpeZmZygoqKcnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWalpuXl5ihnpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeXlgYlJVYElJSktTVElSUEw5P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZ6cu7x9b2lqYVRKV3Cci3pZTEZHTlRUaK6ysLC4rKahnJ2alJeampCOkZWRjI6OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrG0qrKvopmcnZ6hmZubmpiZm5SWm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVtTWllNUUpPT1VMU0xBNz5CNjg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySnKKbnqmrln1rXVRNTVydxMupb1lMRUNHTWGYsK2sr6efnqKgl5GTm6CcmZeSk5+coaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuK2ytKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCepKGgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUlVIRlVWSkJMRz1LSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpmem6Gho4pvX1VSUVVpwOPStJ2Hb1lKRVSRmJ2rqqmkn5+ZkpKTmJiWlpWMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp6CZp6Cfn6eopaSfnaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQldOSkdNR0NGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqco6J3WVJRVFZog8DMs5ixyLCUipi5xaKpramqpZ+enqGinZ+dmpyclJOVlJ6emJSFnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq7wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGw7zDvLezqbOtqrO0r7Ouqq+jnauntrGtorCmoaOvsa2wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cWtrdXJwaFdbUUVUSERKUEg/RUE0Rkg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+fmqGdaFBLUFFpgZy1uqeHs+Db1tvayLSup6OjoaCepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DDvsfGwrfDycnCwca+urS6urS7t7C1sqq6sq67t7+7uqq3rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtkaG94amRaW0ZLTEVEU0xEQkU3Oj87NTQ5OTc4Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hop2clV1MR05YfpPAuKSQmNXk29HEtKafmpybnp6Zl5eXkoyOl5eTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXGzNHS1c7Tyb3Av8O7xsXIxdLUzdPQ09PMysLGxsfKyM6/yNHMx8XHxcG8w8G+v761vrOuv7/Cw8fEx8Suv7iyuLzDwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJRENANTU1ODpCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo5+cnpZhSkpOZoq619O/r8DUy7muqKKfnZ+amJaUkpSWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1tjS183Gx8nMw8XKz8rT19HX0tXW09PIzMfMzcnSzc7TzcXIycrBxsvHyMnGv8Ozs8jEy8rLz8bKv76/vcHHxMzMyMm/w7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkA8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEE/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaCkdV1nbY282Nza1su6sqqjnZ2doaWgnZqUlJWUiXx3cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NbW1tLWzdTW19TT0dPU1NPP0cPQ09bY1dbSy8nO0cvGzdLK0tbW2dXX09bYztLKz9HMztDM0s+/yMfKw8zMzM7PxcbHtr/Kv9HNy8/Gyci/w8PIzszP0M/NysfNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZXJiXVJcSUpHQUVIST47QTg9NDU4NTs4Njo8QD47Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpZ+jrIp/k7PS1draz7yuqJuVmKCcm6Gin5ucmZWJd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXX19fT1s/V1NrU1M7P1dTU0dHM0c3U19bT1dDP0tPRydPRyNDY19jR2NLX2dXWzM/Pys3Sy87QwMbCx8XOzdHR0cjMzcDKzMXTzsvOyMTKx8bIzMrT09HVz9LM08G5xbGlqLWup5uorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52mrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqihpZyAlJbH2NPWwq2moZiVl5mbnaCemZ2dk31xZWNjX19hX19hYF9gYF9gZm5wcG5rb3J3d5zMwdLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cbR1MrR1NXWztLQ2NjY18vIzsTJz8zKzMDJv8fJzc7Py9DNzszOz8jL0NDKzsrCycfJzMrL0dLM09HRz9DKvci5sK67uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVdFO0A9MzM8PTg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcCwqaytqad/bIGU09bNsJublpWXm56en52UlpiUiGteXl5hZGJgYGFhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8fOzc3UzM7TzcvX1tDM0dTLzNDS08rO0dXS1dXKwMnBxczCyMnCzMPFyMrKz8rNzNDN08vGyM/NyMfLxcbBxcrMzc/RxtDOzc3Mz8XHwbi5vcPDvcO5s7K+sbvDxLWqmKWimZaRlZWSi5SNmpGUlI+PlIKJhXlwcWttZ2BgcGhYWGhWTEZMSVBQQjtDPjs2Nzo4OTo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCta+0qKCqaG99p9nQqpWOjZiWkZOSkZaWlpCLfGVhYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0sjLzs3G0dLQzszUysfLzs/Hx8/Sy9DPxbrEv8bJvcLHyc7FwsjAx83IxMzKy8/IxMTQyMbCxsjEvsDHzMzLzsLLy8jHy9DExci7x8PJyMLPwb28v7DByce5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3b3Rka2BeZnBhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68us3NxtDV1dna29jQyc/P0dPIwra7u62lol9veLnQq5COjpeQh4SEhIJ+hYV/c2BbXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMrJyMrIwcXMxsjLzcnEwsvJwcLM0MXLyL+5wbvGx76/xs/Lw7/Du8nHyLvIxsXKwL3Cy8bFxL7GvLzAw8XMxcW7wMrCxcfSxcHJv8rJxsjG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Glm6Ogm5R7dnN0ZmlaYW5sWltYUkRMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76yspFfcoC+sJCLk5eHe4GFhoB2eHVycF9bW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKxtrqysrOyscK8vLy6uMHBwsW+vbm9v7nEysXGwr3GwLi7xMm/wsm7t7u6xcO/vMHNw8a9vbXBvcO6vca7wrqzvMXEwcK2v7a1vb+7zMO8tbrIur++y8TBxsLGycbIxtDGwszHssfJw87NwcXDwL2zt7Cyp6ioubClrbCqrayUeXZ3amRnYGhvY1ZeWUpGSkZISkFFQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0crKysfNzc7RyNDG1dTW183Kz8XJxcfBucW9q6+DY3WPtZKMiYuFeYGHh4B+hHx0dGNbXF1eYGBiY2FiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tbe0s7O0vLa9sbewta+yu8K8wcS8v7q1s7q+wLjHubS7tsHCvLi9xsHDu7Wusra6v7TEt7u1q7i9vcC9sbq2r7a6s8W8t667v7W3tMW8vsPFwMPFxsjLxcDGxrvIy7/PysfDxsLDt8O9vba5vse/rLW6tbe2jnl0eGZnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMrIysnKxM/N0s/NxcfBxcC+urjJtqqwgWtymZyNhomKe3l+hoZ3eIJ9dGleXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5oZmpubnJ8pMe/uLi1sKusp56iqqeeq62zramsqbSvt7Cyqa6mrLK8urbDubq6sau1ubu0wrqwwLG+vLu2u8e5wratqqiwscC2uL2wsKeys7W7vKuutaWuta67srCpubCtu667uLvAwL25wr/Hw8XBvMbCyMu4xcfFv8bDw7rExsK7xsnMy7O5wry7s4hzdnZraWFibGhZV1dbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxc/HzcHDxr/ExMPDysLJyr6/vMC6srS0w66proZrZIqSiI6QfHh+ioV6e4SBd25eXVxdXV9gX19kY2JjY2JgX15bW1paXVpaWlpcZG5vaGdnaWtucoGtubC1rqalp6eaoKWhmpylq66kqKKsqqyqr6Omn6qttbaxvbmvt6+prri0tLy4tLyvt7m1srvBssCupamiq7GytKi9qquoq6yttLOmqK6hpK+psqanqK6mqLessbK3urq7sry9vr7Ev7XCwcfIt7/AxLfEwr+7v8TCvsTIzMq/vsTAwKmHc3RyamldYW9kV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcu+u8m2vcO+usq3wcPBtLW7tbCutLutqKeIYG2Ng4iLgHt+gH54dH98c3dlX11cXF5fYF5fY2NhYmBgX15dXFpYWltbWVhaXF9ma2ZlZ2Vpa29yhaqlrKWgnKKllJ6lm5iRoaOqpKKfpaWnpa2gnZylpqyyr7a3p7CrqKq0q7S6sba1rra5sa+6urG2pKCkn6axqKuouaqkp6iop7KtoKemn5ukpqyen6ekoKCxra2ssrSytLC1vLa7wcGyur7DwbK5ucOzwL2/tbi7vb68wsfEwsO+wMSgg3hwa2FmX2tvYFRZXkhOZ09UR0VKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItbW9uLrAur21oJ6VnaGmurars7O7s8TPycvCxri3x8HMv7jJt7vFuLPEuLS+wKu1u7GrpK6yrJ+hi2GAh4aGgXx5dXRvbWtqanFpXmBdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+Inamgl5abopaco5mWjZ6ho6ebn5+jpaKonpuim5+rsKyxtqOpqqqsrKS0ua23sKyzta6yta6wqp+dn6SisqWmqbitoqamn6isq5mfoJ6ZnZ+lmpqjnJudr6mrp6qrrK2xsrivuLm7sLa8vLqrs7O5s720trGxtbS/tr3AvcPBu7u9l4N7c2tfZV5kZFhUV11JV1xLUEdJSUZBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8TDz765x7i3vreywbSxu7uruLmwoZ2oqqaWnYVmgoWGf3hybnBua2JeYmZmXV1eXV1dXF1fYWFiY2NiYV9cW1taWllYWFdXWFhYWFpeYmRkZWZmaGlrco2nnZSVlZuYm6KXlpGco6KonZudpaaippygoJuYrq6trrKgpaKurKeitbGysqyor7KnurOmtaCinpujoq2joqq1qqKjpp2mpqOWmZ6XmZqdoJqXnpycm6yhq6ejpKatq7O0qrWws6uyubSvqa+ysrO3s66prK6yuLC6trq9v7ezsZSFeXVlXmVeW1lWU1pVS1tRS0lFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7KdpaOYpbHCtba9rbS4wszIxsDFtsG/x863wMS9s7m5sr+2sbi6rLG0rZ2Yo6iekZp6aYGDhH94b3F0cWlmZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2opyUlJCVl5egl5mVmKGeoZyWoaKppJ+fqZ2cmqunr7Cqm6OkuKqhoK6otqqmp62wpLewpLegopuZmaqmoZqsuLCioaScop+fk5ShlJWWm5iXlpeclZ+pnamjoZ2jqqqwrqi0q6qnrbOwpauusrGwsK6vpqensq6xtLC8tLm3rqOUgXl1ZF5hVllXU1JUS01eTE9LR0dMTEU8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uL2unaeoo6q7wL3Aua60uMHMx8XCw73Ft8jMssHCwa68u7W7vLW4ua+vr6ebmJ+nko+KcnqAfHdxaWxydHBpaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNjYmNiY2RmaoGWk5WMkpSUm5mdl5ecoJyglqGgpqWkpqefnZ+moKqvpp+ipLeooaGiqLSipailsKWwrau0nqCdlZWqoaKUrbGxn6KjnZ6Ym5OLoZSRk5iYk5eXmJedppunoaKZo6Wlq6SlsKelo6urraaorq+uq6iqqbOlpqyvtLGvvLWxr66gknp2cmRhXFpdWE5MUkhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDc4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G4rJ6lp623u7zBxbqxubXEycnAw8bGx7bGxLPCv8Wrt7e9tr27urWyq6ulmJedoYqHcXuHfnZuY2FmaWhmZ2pnam1gXVxbWlpaWlxdXFtcXl9cWllbWllaW1dVWFdUVFZVU1RSVWBgX2BhX2BhY2RpgZSTiZGPlJOUnZWWl6SZoJecoKWiraakpKOjopyqq6WZn6WxqqChnaWrnaeinq2sqamtrKGiopWYo5uckKupsJufop+el5mTip6RjZKTlpCYmJOcoaKdpKChlaCipKabo6uloqSqpKuupa2yqaalpqa0pqmorbO1tLm6r6msnotycG9gW1dWVVJHUU9IWltPUkpUS1NMRUZJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1yb2xvsTJrLG4wbW7wLu0s6ippJSYmZqHfnCHg3t0aWlqbGdqa21ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXV5fX19iZG2OkISRh5CRj5qTlZOcm6Ocm6CoqauorKeopaSZpa6klJmlr6mfm5mboJ6umZurs6Clpp+io6GVk5uWlpKpqq2anJ+hoJqUkIyZjouQjJKNlpWQnqGgo5ybo5WboaOhl6Koo6Koq6Crr6Ott6Wjo6Ksraqoq6+zt7O+tbOrr5iEdHNoW1hYUlVRRVhMUVtYTVROUExQUUlOSUI8Pz9BPzw2NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraiztq6pp6+um6morLe2rLzKu7a/rMvGxbjBzs/Is8S7t7vDyLGtuL+3vL26srOjp56UlZaUhXhzgHZ3bm1obW5tcGdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXVxeX2Bkfo2Bi3+MkIqSjZeRl5mioJugrKqmrqyor6Somp+soJWWpKinnZeQj5qerpaYqKqZn52UpaCekpCSkZOVp6ulmpmZnp6VjYyLk4aIjYOQi5GVkaCeoaOXlZ+VmqGinpSbpaWnqKigsbCmsbynn6OstKuup7C1sLm1wLGtsauQfXJzYlZTVk5SSUZWUFJRTExXTUpMTlJHTUpBQ0ZEQz5ANjU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ymsbeqpqKwq52qp6mysaW2xrS5urPKxbm6wcvQy7G2uLy+wcOxsLK3rbSzurKxoaGam5aVkoF+dmtnbG5xbnFqcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY2HkIqXiZSUmJuZnqmboKqmpaudqJmhpZuTj5+jm5eXhYSSm6OPlKOdlpaWiKKbm5OLjoqQmqSnnJWVl5uRkYeUjouBi41/kIqSkpKgmp+ilZOYmJWippmNmaSmqKahn7SyqLK3oZyit6yqraSysqa1vLasq7GjiXhzbV1OUVFMT0NNTk5QS0ZOTkpKTk1RSU1KQUdMSEdDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLaxpaejqaWgqKWks6qissO1tbKzxsa3usPKzMazrLq9tLfAr62psJ6mrbmuq52YmZuUkoV6gW1fX2ZycHZxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFlYW11hb3N2cYWIgoiAkYSPi5SRlJ6hj5uco6GjmKWXopyVjYeYmoxzjYN+jZeWhpGZkJSOjnuZj5yMgol/ipifo56Qk5iWhY2ClH5+dImOeZCHk4+QnZqZmpGVkJ2OoqOOiZqgoaSkm6K0r6yvrJ+YpbimprGhsa6csLyqqa+qmYJ3c2NWTVJPUE1DU05MUU1CUFFISU5STUhKSkNKTEZLSzw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3i3oaO0qaalqKOmpaamprOnprTBuLC0sMnEt7nBzsW+s6y6wautw62ooqaSnaa1q6GcjpSVkY58dn1lV1ZfZ2ZpZ2huY2poZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVV1lbXWlscm1/hXx0TlhykIOXho6dl4uUkJ+YnZWUlpWPlomAk4lfO1dvfIuUiYCMkYyQhoZzioWWgXmBeoWUnZSDlY6RkIOGfZN4cW+FjX2JgZGNj5eamJOKj4mch5+Yh4iWnpqhoJenr6mtqKiflq2zoqaumayrmKi0oqmto5N9cm5gW05TUlZMRFRKUE1MRk5PSUVMUU1LT0pJTU9GSUk8NzU5OTk5OTo3Ojs6Pj44Oj09Nzo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6mno6mwqKe0wbmxtbDHwrezvc+/ua+utcKnqsWpo52Yg5SbrqCYlYSTjoqGe3J0XFFMUlVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbXBpe4J0UEJAf5WRkX2JlI2Eio2bjZaViZKIhpWGeYh/YEpRbniKkYR9hI2KhX9/bn5/lHd1dXeEjZlwUY2IioZ7fniUdmh3hoh+ioiVio2RkpaLhIqIlISajIKEkpuWnp2UpKOoqaWknpuwqqGkpJGmqpaiqpyipqiJdG1nXltIUVFSTUlVTVNJTEtPSUhGSk5MTVRLUVBPRklDPDc2ODo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7abo6edn6Kvoaeopaeor62qtby2uLezwbu2p7nIuLaoqLW2qrK8pp6Vjn+Jk6eVlIl9jYOBfHZvbVhNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4eBfIWMk4GSmYuPe4aPgHZ/eHNudXB0jY6Ben6Kq4V5emh2e45wcm14gYuNknh6gHuBdnJykndndYSEhIR7lYmIioyLgH+Ei4x/lIN8gZCYlZyVkZ+dqZ6foJ2gqaWfnZiNp6SToZ+Wnp6kgHJoYFxcSlZPUkdKWFJPSkxNUkpKSkxQSUxRTFJUTEVIQTw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTk0Nzc5NTY3NjI1MjU3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumaOimJyftKmvqaWtrLCxqr20sru4trq0sZ+3urKqnZ2sqaiyr6GakY6UgY6bjZB+doV4e3VvbmhYS0hISEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedYN9eWd3jZeYjY99aHmBdniAiY99hJiSgXGHj3x3e29rfq19c5CLf3uGkoF9f3RmdnyGbG9oc3yJjIiAbHlxfXBtdY9xaXGAfo5wQ4uEgoOFf3d3eouFfox7dX6Oko+YipKam6OWmZ2anZ6inZaNiqWbj56XjpaYj3ZubWViWldXVFFKU1VUT1BOUFZLTktOT0pRTkhOT0tFQzw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegnpagpq+srquoqbCvsau8uKy7vrmzrKebsKesm4+WnKWppKCXmY+EknqIjYqKdnF9bnRwaWxpV0tGR0VBQENESUxMTVFSUFFTVVRUVVZXV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWN8eG98eYiQen2Lhm9tjJJ5dHhqaoCCcZaRi4F+loBJk5huaHd+gmxpY2x5hZCShmtzbHxucnuGaW1wf3ONiYSGen1+e3ZvdHOFgnmBeHB8joyKlIOWl5iakJOWl5mXnpeMg4mfkYuSjYaQln5taG1ubldVV1RSUVlPUlRUU1hVTU5ITktNTktDSE5HRT87OTk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5man6WtsKKsqqi1r66stL+rvMK/pqKZlaSXnY2Ei5ShoZiYkZOLc456gIWLhnVvdWxwbGRralhORUZDQDw+PkFGRkdLS0tNUFJSUlRVVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplf3Btf3qLiXaBiIZ0bJqSdHN8amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3GAfGdxcXtuk42Pe3N9fHFwbnVtgn94eXVqeYmCiIqElpOSkIuNkZSUj5eOgHmIl4iGioaAkId2ampuZ2RXUVpXWVlbTVBVVllYTklIRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsLDU3NzU0NzhpTzg7NW6SiJqRmZakqK6esp+muq+rsrDCsbvDx5qWj5SZi42FeYSQmJSNkIyPhnGHgnSHjIV5cHNxbm9kcGZfVEZJQz88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7Ogcnx4bH1tcoOBhYF6hIaGeXKhlXR4gXN1lIc1cZ2onY6hoYSihXZwhnyHfHOMrY2JgGdmYmpucm1wg3Vpb1h1cI6akndsf3t9bXFtcIB6c3ZuY3aEfoaAhZCRiouJkYuRjIuPg3V4i4+AfoOAfo96cXBva19aXF1bWVhgX1JOW1pYV0xISkZKRz9DQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGTiJaRnqSnnq+VpbWqrrGuwbK7wcaWkIyUkICIfW6BkJKJg4qHj4V1goRslYiHe3V4eGx3bndjaV5JUEc+QDc0NDk7Ozw9PkBCRUhMTExMTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx+hYN/jH52opl5foaBhZmEm5xhhqqfnYuDkI56d4h+iYiNc4qXj4R6XWRxdHp7d4psZ2pieW+Fj4J6boF3dIR6cHR6d2tuaV53h32HfIiHj4CLkpeDjYWNh31xhH+EfHV3e32JdW9yc2VmX1tbXVNbZl5XUVVYW1VHSktFS0c/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVyPTIzMzMxRX5XND05XIx4ioCUjJKdnZ+mkaCroLGor8CxusW6lo6RlId6hXZrf4yRgn2KhI6MeIOBc6GEi319gX9wgH56Z3ZrUldMQEUyMTEzNjc2ODg6PD5CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHF8j4x6fYmHfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSRqIeAmJiKnHNtfIGGh32OaGdoeH5uhYeChXGEhUdrgHdyeXZobWtfd32DiX+IhYx6lZ6biouIkX96dYt2fHdtb3d+f3NycWpaXVxbY2NYZmVcVVBQVllQRExLRk5JQ0ZDQ0FAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiYnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWIkY+WmJKXoZ2soaa4r7O8s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jVktCNjAuLzIzMTMzNjY4Oj0/QEJFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgYSChZGTfoWJkYGalYKgoZeVm5qlrZOau7Gnu8fDqIqMoaWPlImBkXtyhJ6fkZx/doWFio+IkGpob4OAdY2HhItxhoJ3h4B7doV9bnZ1Z4CUj4aJiIiIh6GroZaKjph/e4KJenpvZ2t4fnh9cWpjXVpaXWlcYWZfWU9LTldSUUlQSkROR0NLRENARERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+LWy4zMTBPg180PztudXBmeIN7gIyAgZGPi5ubpJyhrKarr7CXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46DgIGLi4KJjYN/iX9scGpdQkE0LS0vLy4vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhKTEtLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyNoZ6ZhJOFgo+in5SZkoSKhY+YkZZscHWJi4KWjI2Pdo+EcWyFgYqWkoOFiHKJoZaHk4mPj5altambjZWig4eThH1/a2prfIB/gHJhXGJeWWZqXGtrXldLR09TUU5NTEZJUENETkZCQ0VHQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCCcHWHcXaShn6YlpqUn5+cp6CqlpOYnmdlpJp+hJKReYCSiJCSfYqFmJKRgoCAi42JhZCGhIiFeHh/Z01SPi8uLiwvLi0vMDAwMjEyNTU3Oz9DRk5QUlRQUVJTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6imopmhl6KVnJ+onqmrn6isqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4SUkoWcoZqamaeRkYiVopqad3p+lJiSoZKXl4GUnnt2lZKrs4mNl6B9lJ6cjpOWmaSiprawnZGZqIiXkI6BiGxzc3x+enBnYFtfXmFmY2BnZ1xRRUpLUE9JSkxGRk1DSExGRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdWBufWF3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYeYjXiCjYqOjHuKho+QjoGCgImMioSShYKGiIGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSU1PUVlthpB3lYujp6q0vbilrqysp6i0rLC3srKtu7GzvpyzxKy7ycu4xL+4paOwsqytq6SLlpiFpqagopeBppmNoqqopIeFk6ShoKqhpKmOnLGLlaOnt7uboKOwk6Odo56RpKKrr62ztaKVpauImomSipZ6e36EfWZfZ1tkYV1jY15mZl5bT0NJSFRPRkhMRkpHRUZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gZSFiIKbg5KQjZLayJ2Wc1aXiI+InI98hoyOiol6iIKHkY6DhYCLhYaHkoaChImGh4eHcW5hQEU2NDwyLzExMC0sKy0xLy00P0RBTVVRUlNVVVdVTltQR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcfDq7PGtqyzwLO5vra/tMG2u7ukuMaptsnHtr65tKijtK2xsZyakpqfiaevq6SVdp+kl6GrsbOYlqqtqK62u7K6rK+1orGssbW8t7WutaCnqKOom6mwrbK6uLinm7epjaWOkZOgh3mBgnRYYGNVZWFgYl9gZV9aVUpERUxVUUhKSkRJR0VBQEBLREFNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFtaUWNkV3p1cYKUfYWGk3aFfoCNe7+7o7yCtJSTjZuPhIiPkomJeYaAjJOMh4WBjn+BiY6GgIaIhYqHkXp4bl1WQEVNPDY6NDZBQjc2NTAvNkNIQ1FbT1FVV1VcV1BfVUlLSkFAP0dLRkVEOz5AN0Q3P0JKSkVHV1RQXo+lraOxtMO2uMHMyba8xb2zs8C3uMK1v7C4dLK0prrFpLDGubGzsbSopLW2qrGgopabopKlsa6mraynpJigrLO6oqmyurW7vsy/xcW9vbPCt7q4v7e6t7msrbCmsaqtvrC9u8LCrJm6qJSuj5iYq4l+gXppVmFgV2lkaGRWWmNZVlRJR0dMUUdDSElBSEQ+P0JCS0BATUM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlFMQUxSV1RZVVp3anB/j4SBjoVuenJ5iGK4oZmjiZWTlpOTk42Ql5KHh3uGgY2VioCEgIl6fIuHhnyKgoGKg5V9d3l1ZU9cZEdFTDpRZGFbXlNGPztIUERaZFFRWVhZZ1pUYGBNU09FQT9JSkhFRkFAQz1FNkI+SEdLTFNaVF2Tr7i1urnJwLu9ycy7vcC8t7W8u7e+tbqyxmB1s6Wxmp6rvaqlqKuqo6KytaGrp56Vlp+Zn66lp6elnqSUoqews6eysry2wb3TycrTxsLFzMLKw8C+vb+8vLe0sLm3t8O6xr3DybCeuaqirI+lqLeJgX5xXmFhXFZhXmdlUlhhVlJVSUVFTktBPkdEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUVFJQUFFSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdaGxscZCNhZBzbHNyc4jVwLWZoI2VmJmRjpeRlpaOhod9hoOMlot/g3+CeHqLg4d7i3mBioKXf3R9emtlcHVZXVxQZWViYGVkXVtYV1xNZG1VUm1tXm9fWGdlVVlUSkRBS0tIRkhISEhCSTlEP0hLVFRWXFpbkrnAub23xsC7ucrLura6tri5s7i1tK62tplkdaierXBeoqycmKGjm6Seq6WUn5+QlI6WmJeon6Wfn5qZg6SdrKSqsK23sL251NHP18/JzNLMz87Kx8C/wsq9wb3CwMXExsq/yM+0pLuwtbCbrLm9mn54a1xfXFldYVliYlFbYFNRS0NCRUZFPEBFPkJIQkBDPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpX3CXkpGUbmxvdXWIs6yhoZ+LmZyZjIyVkZuShYqKfoiHjJCLiXyBhHN7iYOGfIl0goqGlX9ze3hsbXV7aHJlaWxpZmppaGBmaWhtWm10l62kvIiHZ1tvaF1aWVRISk5QSktRTFRRSUxBSkdLUF9fYmZpYZi3x7C5s7u+trLEx7awubGwu6yzsaeqt6yNtqeem6eaT5udjI6glpGmmKWVipOTiZCJj5CSnpuhmJuVloeemaabrK+or6eztNTU1dbSy8/T1c7Tz83FwsrQv8rJy8nSyM3NwtDSuLDEvMS6pra7xKKBbWJbXF1YYFdZZVlQXFdOUUNCSEVCSDtBRD5BSD8/Qjc7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ5PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVdzkJCYg2hxb3l5g6CqnqaXjZubl4uNlZGajn2Ji4WOioqLkIh8hIJwf4eBhnuHcoOSi499cXh1bHF4fnF7bXhzbGiAcG1jaW1weWl3fX7Lv8Lfp21jeG5jW2FgSlBSVU5ZXlBdXU5RTlRRVVRcbm53gnKWrristKewtqutvcCxq7WmpbinrK6hrLSjjrGumpiYjJGUkYSOm4GNppGciYOLhIqJhIuDlJWYl5SbkZyXmZmenquspKehrKzO0tXRzczS09TQ1NHOyMPU0cjN0tPT183S0cXS1sbAzsfIw6m/uNCdeG1kXGFcVl9SXVpOT1NQTkg+QUZCQkU8QEI/RUU+Pz86PT09PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYaFindtd3B9foChnp6hi42Zk5OMi5OPloR5hZCQjYuKiJGHf4J7cn6Agod6hXWFk5GJf292c2xzfHt2fHOBd3FqgHJyaW9xenlye77Lmn6MsYN2coR2aGFqXUNaWltWZmRYZWtUWF1cYGNdY3h7f4uBmaqkpKGgoammqrG5qqa0o6KtoqOtoqexn4mmmpSSkYqSjoiCk4lrlaKNmISBhX6Rg4OTlqyLlY2VmY6FkpCdl6ewoaCgpKSox83PyMLL0NPR1NLO083G1tPN1NjW1tjV19XJ1NrNydfW0cqtxMPLiXFuYl9fV1NZUltPSkdJSUpAOzo7RUJEPEJEPkhCP0JCOzs5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3lygomBnZWdlIWLlomPioiOh49/d4SUmYuNiIiLiX6DeHN7fYOHd4B7h5GXgYNud3BtdX92eH1zhXx5bId2dG99doR1eXudtYw8QYrGpX6NfGllVklDZWNmY2hqZG95W19maGtuaW6Ag4mRi52foJ2Ql5ifo6OmsqSks6CipZ6hqaCisZyGnpKSkpCLjouGg4+EfpybjI2ChIV6lH6CqZWjjJKKmJKLfZeKmpGrs5iam6ecp73Dxri2xs3S0NLQzNLLydTP0dXa19fY1NnYzdjbzsna2tLWv8zMtHZ1bWNcWVJVUFlWRUZKSUVFPTo3OkBBQzpHRUBFQ0FEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzU0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYXFxc4aNfJeRnYt+h5KCiYaFioKHfHiFlpeIj4OHhod6hHlxenuEhnV6hY6NnXqMcHxvcHp/cnyBcYOHgG6OenV3fXyCdX98h4iwdFipwraMkoFwbmI9XmhycHFwbnh3gmVpb3J1eHJ7i4eOlJKblqCWh4yTm6Cbn6qfoa2copqZn6Wen6yZi5qMkZKNhX2Ih4OFi46gmZOIg4d+bZl5hJiGiJOMjpWMhnubiJOPrquUlZeemKautr2orb3Gy8jJy8vPycTSytTW2NfY19Tb19PZ29bQ29rR1sjVzJV4emhnWllPUlNdSEJFSUk+QT49Nzo9Pzs+SD1AQUFBREE+Pjo4N0RCNzU1NDc5LjU2NjQzNTU0MjMyMzY0NjU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJma3aAiHGRkJuAeYCOfoOCgoV/hHx8hJeOh4t+hoeAd4J5bnt7hoF0epKejaF2j3WCdHWBfXSAhG+BkIFvkoR0fIGFenaGe4m3xqTCybeBlZuPeHBlTmVjgnqBd4aikIt5eXd7g398hHZtlJaUlY+XkIOJj5aal5emnJigl5+TkpejnZqrlpGRi42Sg4yFiYiBhZCRnpyZiYWLgYaXe4iIn5eQiY2Ki4J8oYiQi7yhmJOXmZyopqWunqe1vsDAucfJzc7FzcrR1tXU2dXX29TX2drb19va2djO28aFeXhlaGNfU1ZWVU1LRE1DOz09PDk6PD45PkE2Pj9APD8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTU1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0hQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6inx+gH+AfYV6foKRiYSFeoWIe3V9dG58fYZ+dH+SnZGfg5J8hn14jn14iopugpqAdJiFfoGJhXx+kHqPqY+Qw6C7jJyjnH2JhH2JcoyKfnOmmpyZlIV7j5CJhGhHcaGknYyLkJKFiIuRkpWPnZqTlZGXjYyVn52UoZSSjo6Qi36Qj46LhIiSlpqfn4mLlJGdkYKLf6aZiIWOgoaEgKSGiou4mJ2RlJahp6Cdnp2jrra6tau/xcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19y3d3d2aWlkVl9aU09OSERMQj09Pjk5Ozo5OTw9NkA+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYGPinFyeIp7e399f3yIenx7i4eCfnWDhnlzenNtgX6EfXeGm6CanpSSgIuHf5iHgJySboeohXqgi3yQjoOIhJx+mpGKjaOin5Cjrp+LkYuFi4GShldyrYufrJyPg5ibkJCOXIOikYKMn5OVjIaIjJKTjJSVlJCMj4qIlpudj5WWkYuSlIaAi4mSjYqKnZaZo6OGk52VoIuKiI6ckIOIj4CDh4WkhYuQs5ickpSXoaGemZKbnaexuKylvMHHzcfGz8zPzM/Xz9HUrtbV2NrZ2trX1tnZnm57c2ZlW1xXUlZXQ0BJRD4/Pjo0OTo7Nzo7OjM7Oz89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bWJ+koNubXeLeHl+eoF9hnx7doaEgHNwhYJ7dnZ1dISDhX1+kqajnqWilomdkJSWi4qol3KKso2DppGEmZOEmYyilqCZk4manaGSqK+fkZSQjo6IlYtujbeEmsTIsp2ipZucmJaRspBjpM3IlY6Gh4mQko6Nk5SKhYqKhpaam4+QlJOHlZiEgI+LmYiNkKqXl6SjiJmelZuJj4eXl4uFj4yBf4aPpIiNk6iZl5OWmKGYn5mTnZuisrSlo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoFxfmdiXV1cTklUWUFCR0Q7QT04Mzc7PDo4PTY0OTo8OjgyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ2gY59fG1+iHh6fnqCgoN+dnaAgnxsbot/enx4eHyEh4p+iqOzp6Oqs6GWp5+lo5aVrqKDkLiVkrKZjKGhjKSbr6OknZiQp5anmayvpJeUlpWQi5iZlqDAjqPJuaubo6atmJGbnbKdhYWoopyYhYmJjpWNi5OPiIGGh4mTmJWMi5SThpSYhoSRkJx0kZiylpeloYicmpOQipGKl5uJipaOhn2MmJ6JkJCcmpmTmJeflKCdlZ6boLGuoqS3vrTFx8S9w8O/xs3KydKmzs3T0tDW2NPQ2LpxeHVcX1RfVU9ISk5EQkNFNT46Nzc6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER05bXFlKZmA7SISLentuhYZ6fIR4gYWBfnB4fH59b3KNen2BfHiGi4mGhJKnu6yosr2vpK2ys6ijorCsipq0naK4pJWtpJeprbempKOfmamXqaOvsKmZmJyUlZGXoJiau7uuyqFqtrirsJSZnqOrk5e9o16qsoKJio2Uh5F8jo59g4aOkJSUiIeTloyQlY2LjJeYkpyZtJeWq52LnJSSjZGSjJmbipGekIuJlZ+hjZSNmJmckpuYnpShoJScnKWvqKGks7irwsjEtbq9u8XHx8LRoMbJzc3E19bRy9Shb3lnW1lTXlBPRUM+PENBQjg/ODc1P0Y8PDU8MzUzNTU0NTRCMzk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojk2Pj00N1RLQ1VRSjc8OklBRUA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEdiYGJwSkCLin+Bc4aHfYKIdYOKgn9tfX18f3B3h3eNgYd7jY+MhoyZqsLAr73Gu7OzwLy0rauztounsq2tvaqbu6Sorbm4q6amoaKjo6ivsrGqnZykmJuXl56ipqWSpLquqcC8ra2yuaakp36IhpytvbCDjIyLkIOPg5GPeoGIkI2NnIiHj5eNi5WXlJGal52omrGakaycjpqPko6VkZCWl46RoJGJlJujrJSWj5ScnZOgnZuYoKGUmp6npqSipLCzp8HGw6+wurbFxMK/zabHxMfDvNXRzcTKh3JyYFpZXlpMSkJMQEZHPkE/Qjs6ND5BPD01PTY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNCNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGVHYGlnWl1ck4yMiHuHi4aDjHWGkYqBb357gX9xfoF6lXqSlJSYkJOVp7PGyb/CzMHDuce8uq+rubqXsra6ssCupcCkq6+7vKqtq6OjnqeqrrSwqpugqpuhm5WfsLSni6O6urbBvKyonLOlpKmUhY6pxMSkgouPh4iEhpWUjXqDjZGPkaGMjJSSj4iXoJiTmZWYpqCunYyqnI6Wj5KRlZWNkJWRj6GUhpefoLKelJqUn6GYpJ+aoJuglJiepaOmpqSvrqW/xMKuqLe1ycO+ts+yxL/EvLPRycjCtXN3a1tXW2lRTEhETEpLSkFBPUNEPDVBRDs6Mz04QjMzMjI2MkEwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmZaTmVcZlRjapmNl4qMiJKQhol5hpSQgXKAfI1/eIeCgZB6jaGWqJqamLq9x8jJwdLJysLNvMGzrbu+p7q/vrzEt6zBqayzu76qsKmkpaOrrbOttrWgn66epaKYo7O9qZuovcGjt7ewq5Oxrausl4eaqaelkYKMk6WViYF2ipJ6hY2SkJ6fk4+Ui4+NlKOZl5yVlaOeqZ+RpZqMj4+PlZaIfI+VkpKjmpWgopy1pZCel6SjoqWenaaYnpWXm6SjqKeisqyovMDDr6Wyt8zAua/Es7u/writwsPCwJhseGBXVlpaSktNSkZEREhCQkFETDo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Ol46ekomKf4mgk4R4hX+Vf3+QiIqQgJahma6mo5jCvsfDx8XTzc7Ny7vCt7C5vLO8y7zDwbW2u62zv7m8rq+ooKintq2tqbK3mp6soqehnau3uKmksL/Esb65s6eqtbSurpeWpayooJGOkrHFp5WOfZGVfYiRmZCqmZiTk4+TlZOlnpOdmZSho6KcmJ+Yi4yPj56IWpCWl5KWpJllmKOesqSWoZasrKqnm56ml5iWmJWgo6iln7arqbm7w7Sls7XLwLiqtqyyu7iuqLi6vbiCa21ZVlRUTUVKU05LP0JIRURIR0c5NUZNOz43PUBKLjMyMDI1QjU1UFZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz1AQkZCcUZpSVJlYkxGpZSclqGXqZaNkYOHppOIgoeCnISDlZCQk46aop+vvq6hxrzFxMbGzs7O0sq+u7axuru7vs+2xL24uLeysbWzuLOrppyrq7mqqKevr5ejrqSnpKS1wLCrrLS/w7rAurOnubW4s6+Vpa2urqWLk5WhjXTBmn6XmYWPlpqMsZWbmpWTk5qZpaOVoJuWmqmdnKGgmYqMj5adYEqWnJqVmqWWVJawn66cn6SUr66rpZqgpZSTmJiOnJ+mopm0qaqzvLu7qrCyx7+5pqysrbGxo6GysrSkb2xlW1lOT0tFT1BQUTtISkhHSUNDPjpLVT9BOj1FTTA3NTQ0OkIzNE5XTzxKS05VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqXmaCiqK+ZkZeHi6eWjomThZ+HhJ2Xjp2hmqOktci0qca6wsPHysjHzM3Gvruzrrm4wMHMtce6wbi1urCvr7O0pqObqrS0qaimrayapK2lpKisur+oq7a3vsG/vrmzssSyub2so661rLmmiJyYppt2v6CFmZ2Ok5mai6+XoZycl5Wbn6Gpn6igmZqqmaGnnpiQjZGdg252kqKalZ2inpCusqKqlKiql6qto6OfpaiSkpmciJScop6Xsaepq7q2vbOyrb65t6Cjp6ilp5ycrampjGJkX15RSkxGSE5JVUw9TUROSktCQ0Q8UVU9QUFCRE8xOD03Nz9CNzVVWE4/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlJgTVVIf2VeSEWrlZyhn7uvmZSfi5Orm5GSk4mrjYein4yjrZSjo7bGvbTBusLCx8jFws3Iwb25sq+5tMDCyrXFscG8tLqqqK2ssKKjmKq0u6Wppqyqnaivp6Oqqr68p628tLi9x7y3tbfBsb7AtKm1t6u/pY+jmJGioLyfiZqgmZeeno+3n6mcpaObnKGaqKWzoZueppyoqp6ZlY+Um4uXiYylopSdop6gtK+lpJOvq5mrq52dpKOokZWVoIOPnp6blamkoaG0tLq1rai1srOenKOlmpeVmaqhnnZeW19dSkhGR01RSU1FRkdCUkxKQkVHQFZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgWRUNDktMTpnXEZDQ5xwYkdFp5ekn57DrZuXpZiZqZyWmpqPqpaVp6aVra2Zoau2xMK7vrfBwsDHxL7Nxru9ubKvuLO/wsi1v6+7tri2pqSqq62goJqrqsSipairpp6rr6yhqKi/t6atvrG4tse2tbm4v7K/wbe0s7SvvqOXo5aUnJSuoJGioqWjo5+QvaSpnairnZ2gm6afvaKYo5+iqauhnZeNlZ6TnoePhY2TnqShnbWspZuVsaeZr6efmqmeoI2YlJ6DjaCam5OlpJqYq7G1saqlqq2snJigoJKOkJaonpRnYlhgXU5IR0pOS0hFRElBPlBIQDxHSUhbUk9LPUhPVTRCRjk+SEc1Q2FbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E6blJGPEt4ZWJXTKKao5yexayhn6yena6gk6OflqWgpqmrl7axo6qztcTEvb+2v8K7yMK+ysi2uLW1sLOzt8HGtr6wuLS4tZ+mrKqrnZ2epaTBpaCqrZ+kqayvoqanvbWlsby5t7bDsrO3ub+yxMC4uK6ztbWjnaWVkpShrqCZop2pqKujmsKtqZ6srZubnpmmob2inaWYq6uspqGZjZmfkp+Jj1d/lp+moaC4qqaTmLWjn7KhoJuulp6OmJSdgY6fl5WOoqSVkKausqupoaKlpZWVnZiLj5GTpJ6JYGRZY2BLSEpKTkZFQUZKPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SEA1SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JIRTY9dWVcS06en6GZnsOopaK0opyyqJOrpKCkn62prJ27sKistbHIxcHCs8LDvMbDvMTKvK+wtq2wtK+/xLS5sbC5tKyZqLCpqZqdpaGnwq2brLGcqaOtsKmkp722pre7va+3w62zssLAssezurestLauqqKmlpWVpKyin5+aqKuwr6+7sqagqaiZmZiToqS4oKGkk6+vrKWnn5KhnpWej5CNlZ2ao5+ns6amjJizm6Oump6brZCek5aTmX+RoZaPjZ+hk4umrLClpqGcoJ6SkpqThYuSjZyef2BlWmdlSklMSlJCQ0BJRzs7Rz85OU9NVV5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtOPjtCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0n6OfnKDDqKSqsqGjtKqVs6ynoqSyrK6pu7KssLS0xsDEw7XAxL3JxLXAyMG0q7Wor7isv8S0t66strmlmauxq6qXn6aXrbu0m6iwm62frbSyp6q5sqi6s7eyucCqt7HDvbTGp76vrbe1qaisoZeXkqaloqOYmKWvuK6ytbagn6ikmZWVk6Sgt6OkppavsrKnq6ahnpuam5aYqJ+gmKKer7KipoyXrpikq5eZnqSRm42TlpmElZ6UjI+cnpSLqamqoaegmZ6VjI6ZkIGFlYmUn3hjaFxqak1QTU5UPUNBTkM6Okk/NzdST11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlwaFZDV0aMeWZDO6SjnaGmv6aor6+hqbSrnbmwq6OqtLaxsLm3sLe4uMS9w8e9vMTBxsC4wMbAuqm2pKy7rMDCt7eprLG6opWtsK2ylqWnkaq5qaCnsJ2qoK+0s6qptratu6yzs7q3rLiww7q+v6bDq7C3rqmrq6aemJmroqKgkZihsa+zq7C5mpypoJmWkpemobeppaOjsLG0q7Koq5+boKCbnqWdopedo7Owmp+Pk6WaoKmalKKelZiJk5eSlZack4iQm5mUjqiopp+jm5ebk4eOmYt9jJaFj5tqaGxgbG5XUFFaVEFDRVRAOztIQTc6WFBkXlBWV0RZXl1NTFJOXktKPlpjXk5IUE5bVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPSonKz1ccD0+MS4xZVtkQDE2NDdnWWBGKD84bH1oW1Y7iXtjQz2nn5yiqb2hq7Cqo7G4qqW1s6ygrbW8rrO4vLq9trbAwr/IxLnEwcDAuMS9wLevtqert7G7vr+0qK6xtp6Xq62orZenqI6nu5+krbOeq6KwsLOrqba0tb2tr7G1rLC0scG6xbervK+xuKytqqOxpp6lqaCkl5CZoLOqs6qqs5qdp5ualY6gpqS0rqeira2usaezrbKqpJyfqKOelaGZm6i1qZeZkZKemZ6gnpCrnpeXhZSXipyYm5OKjZaXmpempaKgnZaVl5OAj5SFe46Sg4yWZWxyZ29xXkZZZlZEQ01YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYVUxNTA9YFZeOClDM1lUXGdLNox6ZkxApJqgpKy2pK2ppa6utqqvtbqnprC3xbext77BwrS0usW+zMW5wsC5vrnDt8C5srSrqbq2urm9tKmtsLWYmKesqqubq6uOq72dq66xo6ugsK2zrq22srm3qq6usqi1r7O7vcqyqra1sbSvrqehs6CbqK2gpZWWm5qyo62gpq+XoaSampKOo6Wns6mhprKsqralrrG1r6SZna2nmpifmZmrt6KXk5COl5yhl5aTq56bkn+Sl4ydnJqWkImUkp6ZpaKhoJiWkZOVeouPhXuMioOLkmpteG11e2BFYWpZSUhZWj17SkZENkFiVGlbTVxgSlxdWlJTUmJhTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ19RXC4qQi9KR1BbSDNjWVRLRJmXoLGosaqtpqSvrrWpt7S5pKyzt8q6tLq6v760s7fDwMzIvMO8tr2/v7e/vLG9rae6uLe2wbaqrLG3lJemrquno7CqlK+7pKyxsqeoo7G0sLGwtbG4s6muq7Knt6+1tMPFtqm1tqywramoo7agoKexoKSUnJqVsZ6nnKCqjqmjnpuWmKampbinorG0rKeyp62wtqykmaCsqJucnZuUqbiclI6OipicopePl6WgnZSCkZWPnJyYlpSHlo+Xmqeco6CSlpCQlXaEkId7hYGEjIttcHd1e35cS2VsXEtOY1w+YntHSThHZ1dmXE1eYk1YWVdUWFRpXU9PSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0diTFYlLUIuPUVMUTwzcmtKQ0ORmaWupa2uq6eksLKzqrext6CrtbnJuK7Bu8K3srG1wsLOxcDBvbS8v7+6vryyxKepuLC2tr+8rqqzspyfp7GtpqWvpZ2ytayrsbGtqai0uqyzsrWstK2qrKisqbitsbDHv7ilurCpra2lqK2wpqSkr6SpnJ6cm6+Zo6Oio5GsnqOgoKKqpqa5pay1taSqq6isr7auo52jqKqboJqakqSzmY6JjYeQoqCUjZOcn5ORhI2Skp2amZWTh5eSlZmnm5+ejJKRjpB3fo2FfXx8h4mIcHNxfn19XFNkb15OWWZcRkSWW0c7Tm1YYltMX2JOVldWV1RYZ15RUkxjWltUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZUhKKzpJPzNCSVMsPo9rPEdIj5yqq6KpsaSppbO0srS1srKhq628zLquwLvHsbSstMLC0cXGvsCyvcDCvL+3u8SnrLess7i7v6+qsa2go6etqqiksKOqsaqvrLCvsK+rs7untrCyqbKpq6alo626rKqxwrm1rLqoqKitqqixpamko66qqKKfnKOslaWemJ6ZrJ2ip6mirKajray4sbKgqaKgq6+xrJ2fp6epmaOYmY+gp5iGhI6Ki56fjouMlZuOjYWGj5SfnJWXlIaWk5OXpJucnIuSkI2Jfn6HhXx3foeFhnRycYh1a19ZYG5jUXNxXEs7hHxGPld0WGBaTmNcTlVWVVdRXGJeU09OaFhXV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSmdERjg8QjA1RUtYMUCUWj5MRZWYraihqrOcqqqwta24ta6rpaqqvcm8sb63wq+xrLPEw87Ow76/s8DCw7rAs8jDq663rbK4v76yra2rpKeqsKmnqLGmtK6qsK6tsbC0rbS7pLeyq6yup6ugop6vt6qqrbq2pba1o6qnrKyqraGpp6aysqSmpqGhrJaqoZWaoKaepKKqpa2in6ext62uo6Wim6qrramcoaWkpJigmpWPmJyTgYKPiIWcn4uKjYuYjY+KgouXo5qRkJqLk5KRk6KZm5mKjouKfIaAgYN6dICEgX1zdoujiHhqXmBuZ1dlh2NOP2eTTEVieVdiWFJlVE1WVVVUT1xdYVVLTWlXVVdJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEMrOkpPXjREhj5IRkSXkrClo6qxmKuqrbartrGrpayqqbzAwLi4s7u1pbKwxMnL0b/Bu7i/v8G5wbnAxK2xtbGzur+9srCurauqqLaqpq6vqrmvqLGxr7Kttqq3t6aztauspKmrnKOes7OoqKS0tKC2raCqqKuprKegq6ypubapqqqqoqmgrJySqaGdoKSjpqOqnpynta6opqqio5ilpqeqnKKko5+ZmJ+Qjo+YjX6HjIaEnp2Gg4qJjY2PjIKFlKKZjYyZkJGRj5KflpiWi4qDf3SGgX9/eXSDf3p3foCHnY9vcWdncXhcYHOIa09emVZIbXhVZFZSYk9NVVRVUE9YW2JVSFBpVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD5DLD5MVF8vSmo2T0Q7lo6woaarrpqspa2vs7Wvq6Wwqqm6vrzAsa64raG2r8nHyNHAvry6vMK9usPAvr+usbKxtby6wbGxsquzqKS1qaWts7K5sKOttrGws7qrua+prbWrqp6prJ+ioLWtqKGfr7KitKqeqKeqpKqhoqytqL2vrK6toqiooKyZkLChmKKgp6eeqJuZqrCpo5+toqGToqOjp5iaqaWYl5mdjoqHlIh9jYaEhKSWhIGCioaNjJCDg5OgloeQnJCSkI2RnJSXj4qGhXh0gX98dXh5gHt0c3pogIajdWleZWuBdWeIi31TWHBeSnhzU2RTUV5NTVJZZk5MVllkWEZTaVJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMZzo0OF89YWQ/RjFDUFtbKkhNOVVBNJGPsqCkpqykp6Ssp7SysaqksaiquL7BvK+ouaqmrrDJx8nRw7y/vri+v7zJu8C4sK+0sbq7t8Cys7usuKyitKenrLK2ubOnqLy1rra9sL2mrKy1q62cqa+jn6SrqqecnqqypLOomqqnqqSpnaOpp6m9q7Svrp2ppKCunJuzo5WknKWln6SbmqmrpZ6bqqGbkpyhpZ2Yl6mokpiak5CKgo+Ffo+Cf4iej4V+fYuGkI2PhH+SmpOFk6GMk5GLkZqRlYaJfn9ye3l9fGh3fHp1cHB9aIV4hIhkYWhjcoV6bWZ4XV5WQld6bVRhUFJYS0tOcXVdSFpbZ1lFVWZQRD5KTkRDQTlIR0tTP2phSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZjQko3R1NgVSo9OkRYPyqPlLGZn6CppaWhq6W3srKmqbGnrLjBvbWwo7msqKixw8nJzcG2vb+1t7+5yLbDtbOxtbG9t7m9ta25tb6tobOnqquwtbi0q5+9vKmzwLO7oK+ztamrnq2wo5ykqKqjnpylsKawoJ+rqaiiqpukqKCtu6eusK6gq6Okrp6eraaXn5uho5yfnJqjqqOamqSklpeUn6KWm5emq4uekZCRjIKKgICPgHualY2Ie36LhY6Ni4qDkZeQhpSjiZGRh5CZj5OAiHx5bH12eHhje3pxcHFyeGiAdGqDZ2RoYW5zjm1haXBgcEFceGxVXk9RUUpKTVRZV01dXmxXRFhgT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MUJoWTEzUz1lX0RMNktXZU8pOzJPWT0jk5msmZ+Yp6Sjn6ikuK+uo6+wqqu4wrqzrp+4r6uotLvIy8i/t8K+r7S9t8S2w7GuubGzwLS6vbepubi9q6S0qKmqsK65saqbu72ksMC1taGutrWmpqexs6CepKanoaWZn6yoqZ6gqq+noaaYo6igsLifo7GuoKuhrKScpqepmpqbn6OVnZ2anqmml5ugqJKZk5mek5mWoamQmomOkIZ9h3+Cjn18oY2MiHiCi4SJi4uFh5KZjomVnoiQlYKLl4yRfIV7c3B9cXN0YHl4aW9xcG9pfnFjemxpZWNgZoZ/X1pza3JMTH5oWFpNUExKSFBSUElOXF9uU0RYW1JnT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj4vWVg1KJedppmdlq2goKGkobersaSztKqoucW2s66gt6yurbC1xsjBt7/BubC0vLe/u76vq72vtL+wvMK4qbu6t6eotaioq7Css7Cnmr63pa28trCesLewqKWnr7GboKSgpKShl5yvpqGeoqevoqCik6Sko7ewoaaxqp6so6+YnKqlqZ6Ymp6lk5udmp2mqpqcnKWWlZeVnY6Ul6OooZCJi4+EeoV+hIp6jpeKjYZ4gYaDiIuNhY2Tl4yOlpiKj5Z+hpeLj3mAe3Byd29vdF95d2RsbGtpaINtZXJqa2VoXGNzf19abHZpWkh9XVtYT09KSEhSVUYyOl9ebFBEWFZZZU1JSUVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRHQWZbSFREVV1oRS47MWBULDKWo6GXlZypnaWho6G3qq+gurmmrL3Fs7Cvo7WvrK6vtMTEvbO/urews7m4uri6rq2/s7S4r7/BuKy9urSmorOrqKmzq66xo5zBtqaptrWqnrK7qaamqLCsmaKnnKSmlJihsqWZnqSpqZyioJOln6S5qKSnraaepaGok5+poaGgmZudoJKbnJegoqubm5mhlZKVlpqNlJOjp6SPiIqOhXmEfIWFfJyNiYqGeICDh4eHkYWVkpKMkJWUjY6Ue4OXjop3fntsdHJsbHNheHVoaGpnZW+EZ2hoZGZpal9oYmlmWmV6Y2FSc1RbW1NMSUdJT1NAIStqXmpMQ1ZVXmBLSUhFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEIzQ0RnW0tXR1VgaEIzNzhjTicynqSjko6kppyenp6ktaynqrq3qKzDwbewrKK0raevr7fAwL2xwbexrrG2tri3tayqvLOvsrG9wLeuvLyxpZ+2rKaltKmrrqCgw6upprCzq6y0up2oqqqxppidqp6npZGZpq2imZ6kqqGbop2XoJyntqWvqq6goZ2doZWgpp+hoJmbmpySmp6Vpp6to5iXnpWUjpSYjI+YmqefkYiJioh4hXeCgoKch4uCiXt+hIeGhJCElZWPj4+RkZGNknuDlY2Gc359Znhva2psZ3Vza2NnZGN0f2FkZWZlaWpjaXBZXlhdbGRhTWhXWmBWSUdIS01SWD85YGxpR0JVU1xbSUhGRkEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKywwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XXlOMj5IaVpMWkpWYmZBOjNBZUglNZukoJGMrqCZmKCWpbSxorG+t6Gxxry5sLGjtqurrqm5vby7rcCyr66ttq+zuLOnq7mwrq60tru2r7i9raaetaugobClq6+fpcOhs6Wvsa+3rbWdra+srqOZnKeqpZ+Vm6iloJmlo6mdmqCclJudrLCluaetoqGamp6ZnqOapZ2WnpiblJqhkqiVrKmblJyckoyVmY6UlJiopo2NiomPe4J0goGKmIWHfImIhISJjIiShJSckpKPkJGWjpB/gI2Ngm+Bf2Z5bWhramdxcmtcaGNhcn9gZGdqbWxnamhmbFxsbXVxYVRiaGNlWUlGTE1PWFFQVWFlgVRAVlNZVEZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OjYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSWRCJzSTopuPjrGdm5OhmqmysJ+4wLahtMK8vbmxpravqa6lt7m3uKy7r62qq7eqtLitpbO1sa6psba2sbK1uqipn7apnp+qoqqtnKrBma6lr7C2taysnrGtr6qjm5yjrKiclZynpJ2aqaOllpqgnZGbo6uqqbqfpqSgmJqanqGPa6KVmJxxgpacpIB2kauonpaWoJGJl5mAl4ufj3iFk4yDbWl+d4NwbIaKhn2EioZvXWRgZ4SXhmuLkJSSdXeLhH6Dj39mh4BodWlmV1xpdG5OUGpkZnGCZl5kZm5saV5eX4mQhYdoT0tEOEVUZ15KR1BQVVVLR1Ngb3RlRVtRVVBGR0ZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNk9rW05cS1tmYj5HMVBiPCsvjaSZh5Wxm5yToJuqraujvcWvqbfDuL28rae2sKarpLi0srOxua2qp6y0prC1o6e3trWop6y2s660rbOiqZ+0q56ipZynqJquvZWnpq+zt62tpKiuqqumoZ6coKinnJehpqacnKennpOfoJmQnqeqo7Svo6KjnJaYmJejiKGPkpqHoYeUnqF/pX+nq56Tk5yTiYRyeIyOg4egdoiMaZeIZn1zeKBviIeDfox8f6Ggn5l/e4iedIiOdpuKbIeBg21oZWN6bHFiVIZtY21pmHFYanBuhldeaVtraluIcG15codph4RaXkZOPkZeTUZSVldRUVJXVGdeTFlLUlJQRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFWYDcvKIyml4SdrJ2ZmZ2fq6qoqr/Dr7K6vbfAvqqkt7GqrKazta6vs7arqaWxraW1s5ystba0paeos7Gtsqivn6qhs6mfpKOaoqOdr7aVpKamtrymrKepqqynpqKgmaCnpJmZpqOkmZykqpeUopyUk6KlpqC2pKOgo5iVk5iUnIiukJiUiamLl6OchbGApK2elJqelXmC1Kh/h5TAm8d5eLGlt5dkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyWsauweGhrWLGub2VpvJK8bmh6bXGP2H5TamO2sn+AcZR1mqGqkFdPV2FPVk5GVFtYUVBTi1xXW1BAXEVRTkRGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW1w0MSGOppOBp6qfl52dpa2yqbHCvbK1wLW3vsKrprStramor7Sqr7azqKemtaWnuK6csrG1qqWkp7KurbGmqp6npLKkoaGfl5ygoLCtlZ6jn7S5oqmooa2upKKem5qiqaCYm6ihn5ieqKeRnKeblJ2hpqKgsKOen6OWlpKYkpmFsGtqio2qfmeEloetZXGenZWappVxrqGkfne6fGuhj3axX2q0W6WAZZyRYGaBemZ/anhqqWW+cmemjHaxanyxeHSSk2NtbadtW4SgRWlnh5ZFdZxgfWZ7o6eCWV+Lq2mAlHh6aqc3Sq9bV1RsY1pLT1dfXFdWO06IT1dWL0lUU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzEbkqKVgq2npZ+jpKqxt620vb6wt8WyuLrCp6mwrK+pqbGupLC6sKSkrrOjqbmpnrOzsKOloKqtsKyvpqefo6KxnKOcmJWYnJ2up5eboZ+0sqGqm6GtraCempegoqqdmZ6koZyaoaekkJ2jmpegn6ufpaagmp+hlZWRlpGahbWbtXiFqZm1mXeHs5u3f5OWl6mVfmuBpnqBhYeSlJJ3q2dqsVuse46HlHSIcI6GgH+IkJd4g4KLl4yDoI+FsHZ3n3Framx8i06kWEhjY5l+Y2imYHlydVKThl5QqW1jcX2GgGKdLlGibltUa2dgTEtcZFhcWkI+sHhXWEEjTWhGQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzIsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZ1c3SjlhVTUwHJaflIizpqairqmns6yqu7bCsLzCrbi3waqsra6vpq6yqaGvvKqhp7Wto6u1pKazs6ejop2nqrKosKelnqCfsJegmpWWl5ifrqOamqSotK6hqY+pqKmbnpWYoKWpmp+do5+coKOlo5WbnpianaKqnKWam5uioJaTkZOTnYPVk5m5cLDCfsaGfNaUm7t8mpalkI2bjKR6jYejgqWCeqx5j51Vr3uJfp9quVq5d4aDfaaCk3yYeqp5jZ2Pe7FujoR0kLuFb5RPr6fFilGgemNgqmJzcodsl4dfU7W0yIaAiXxjpDNCnXZdUWpoZFBAWGZaZGFKSE1sS1pTT1lmWkNDP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDk7REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKC4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS1xQX2ZUN0c6YVE4MiWcoZOYsaiopbOqpbSopby3wbC6wLG1tbyztqexsaOxs6afr7aom6i6rqKvsaCztLCgpJ6ep6mwqbSppZydnquYmZiXl5aXoquempeorbCoo5+OrKKnlp6XnKGmopiioaKhmqKip5ueoJ6VmZqmoJynlZubn6CYkJKVkZ2Ism5otXGriHCOpnK0c3K2e5qYpI2Pm42ifpCgpX6wdoOR0tF1W658hn+kb5uqpmuGhX2tfZeZj3uxc5OdjnizZZZ0hZ5unmaUUsiLWsJcn3liX61gd3OGYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2VYQU9qX2xpUFVGSTk9V1JbV1hIQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJOVF9lUDVHPWFNNjIvop2RpK+spKq7raa0pai2u7yyu7+3trS7u7OltbSisrKjoKyvpJimuq6ksbCctLipoKadoaqlsqisqqWanZqpn5aVmJmTk6OpoJeTpquwpaKWkqyfpZKUoZylp6CVm6anoZqjn62aoJ6ekJabop6cpZSclZminpWYlpKbhax7d6h2o4+Lh6lvrYqDqIOZmaKKkpmLon6SmImuhX+Cs1xys1KufoOCpH9x1313hH6PnYaZmnevhoqRnId3tGGaZZqCgZVsklqwWEuadZh5ZmCtXnd3h2eYiGpdr3eVno94bDV5yK6yX0JUb15nYEVPa19wbVZVTS9lY2lTWVE7QURATDo1PzkxPTwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Njw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo4OJ+dlKC4sJi0wa2osqeqsrq4tLi/uriztr21pbi0oLWtn6Cpq5+Vp7asqLCxq620pJupoKCoorWnpqqjmZ6VpaKUlJyZk5ajppuTkKesr6WhlZipn6KPkaKaqaahlZqmqZ6dpJ6snaCdoI2UnpueoJiYm5WXoaCUmJGnnYapfX2leaGPkIOqcK2MgqeGlqChipeXiKOBkIeUqnyAi515b7FaqIOCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfYKUbJJcq1tak3+Rf2hnqmRze4FrmIdxXaxaiaCOa25lT0pDoVxaTXRdYmZNWmFfc3RfSlU1SpqSWUhFPUhGQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzFVX2JMN0ZJX0MxPjihnJmZvqyYtMKuq62pprSwuLG1v7q6s7G3vKq7taCxpZ6lp6eek6qxqa+qtayqrqGYoaCmpKS6oqOroZebkaKglZSfmpSZn6CQjYypsK+mnZeap6afjZKkmKirqJSXqqifn6CjraOgnaGNlKGYn6CSnJeclZ2hlZePq5uPrm1ytHSpjHeKpnO0eXSzgJKko5KcjImkh452uG+Me4uia2u2WqGGZZeXaaCip22UcrR0k5h/smqGkoita3WzYZ1mom6GkmqXXK1gTaF8h5FSc6NseX9+bpiGb1yvVjycd2ZUb24uW6dPYlNrZWJsWmJcYHF8Y1NZUD4+bW8zQkJAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzwwMDAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV9hTDVGTV44MUI5pZqbnbuinLLArq2rq6e3qbivtcC1vLGvubirwbeqq6Gcp6SinZKrqqe1o7Korqqhl5yooKSruZ2jrZyWmY+lo5aNnaGcmZ2fkZOVq7avp5mUm6ypl4yTppqlraSSl6uypKCeqKuwmaGij5iil6CblpuXoZOcqZyUkauZh9SSmrt0scSAw4Z91ZacuHiIkZeMl4mMp4d5o7Z1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiAim6aiHBtjaR0vV13fVthebxqWlZbaXleaWBkZmJteG9ZW1lDQUByP0NGKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTdAOaaZnqK8opexw7Ctqaqssae4r7bEsbuzrruwrsGyrKWjnqShnJuQqqSqsqS1p62kn5aaqpmmrLmdo66ZlaGQpqCTjZyjnpiempCWkq+5sKuVl6Onp5SRlqWdpK2ekaCoq6Ccn6mksp6ipI6moZShmZyXlqSYj7CgkpWqnoWQmbWAkZGNuJV4gpObtXdubG5zbnmPhI6Jc57Bu7yZeoGyqHCAdJG5g3yGhouHjXuKho2XfKS7ub2cdXmzo3R2l3V0sHWYnmaGaY22dHJwd7aMXoB6fYlng3lteWKLrHB1hX9YW6dqRGRaVGZfY11iUGdmcW11Qk1QTEQ7Wkw+SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQUtOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0xUX0cnU2JWOCpPXV09KztWVic9OzymnaChv6aWs8O0rKqnrKupu66wxq+1tK+4p7W4raqjoqafoJ2Zk6ykraqmtaion5uWoKOerKS+pqGqmJWckaKbko+hqKKTnpeSmJSytbatmJ2kpKKLkpKmnKWrnJappaadm6Kpp6ajqKCRrJ6Xo56Xl5idno+wqZScp6KOan5pnKd4iXN+mo51emWHe72+wLpukoNxlIZfcmpaXZqJYWSHjpVrYICVY22bdmKUa3+alZRlXmBjcZuJaHKMfYaUZmp+cXR5fXxiW3d0gWhQXG6EfXuLalhseYJySUpvhXBNdE1FV1xmYUxbV2ZjXk9abXZqclJPREVOO0hJPE0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdJUl9JJ1NgVjQpUF5MKDM+W08nPzI+qJ+oocGjmrS6tqOspa6nqLWyrMissLSstaO+sbKnoKOpnaObmpmsp66kpbWqpZuYlaKbpq2pv6ipppaUm5WgmpOYpamokZ6Qj5icsLK/rJunnaehiZORqpuppJybrKCjmpujp6yin6qhma+alaaflpSdn52XsKWZoqiZnJGenKOkmaejmpyam5qQloJobnxxdpGXlJGEibSpjYWYlY6KjJiXh5SVioOSkpCJjZGUmZOYl5qgoZqblKCdjoJ6pIVsaXyQfIB0iYqBcYJ4eXZ2ioB7iWpzgXSDdWR3fXZrcHptYGNbb2hNWFhlal9XWXB6b25mU09GUzlPWk5STygrOkpCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlMxMFReOis9OF1LLDwtQLKgs6G/oqSxsregqaWzp6WwtarJq62xprWmwKi0oZ6lpZyklpWgq6eso6O3rKCZlpagl62qpsGfrKSWkpyXnpiTlKKfnqOnkpGZqKeyw6+Zq52rno+Wlqmeq5yeoK2YoZudoqWvpqGkp56smJemnZmaoZ6enLCgnaKnlpiTmZSgopajn5egjpaUi4qNj5atj3uVm4KSgYmpqIWAmJaKhI6fiHuEkIaFmZCHhomVjpuXjZCYnqOWmZKQnY1+jWWhs66FiYR2eo+KfXZ5em9neZCBgIlrdYF5iHJodH96doOIgmt0Y3hmX2hkY2Rmalhre3FqalxSTFBEX1VGQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXV1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVF1RMDVNWzE3RTRcRzU8LEC0oLmvvq2rrrKyoKqmsq2irLOwxbCqrKOzr72ktJygp6KhnZmXqKappqSms7WelZSemZmvpq6+oKujkZGempmUkZWhnJepnYWeqayis8i0n6mkqpaWmJqnnqmcoKSrlJ6fnqCqrqmloqqhrJufoKCYpZ6cnpyvpJmfqJOYl52SpZqYqZ6al2aDknxlfo6aj2N4jWxoa3qQo6trZJmYfmeFimVlaWh6jaGOa2eMl5Gid2tqi5iin5hzbG56hI2FeVhlXYWBXmuKioF2W2hzd3eRgIeCbniCeIBzbXmEdHeIiY+De2iEWF1qc2Rdc4hpanxxbGNdUU5XSWRYQEo0PkY3P0ZENzE8PT9BQzs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtJLzdaTzYpRVkvRE8xWUM7Py49pZ+6vLmvq7Owq6Wora6wp66usL2xqaikrbCxoK2XoKSeoZqZpqucrKOmqKmzrp6Vo5Cir6a2uaWuo4+OmqGZk5KaoJmZppZ7payiqLPDuKWip6+fnpWeo5+knKSqqJKeoZ6gqq+pqqKpn6ebpp+noKyVoZulsKSYnKuWoZ6bk6WYnquZnn6+g4hytHKFnoataHi5xLhxkqGje6aYmXOqgnzLwMC7cYuih4OefJWYiJ7AvYKWnZ2NnMHBe4F6kYyawr99a6Wxb4yBb8p6f5t4kYOOgHZ5gX95cXp/h3B4hYyTeWx1kWJlXnhkX2WBYl50aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPkhbTCojQ1AvI0ZbM1BZL1VBQjsvOJajuMO1sK/AqamUo6+psK+tprK1r6umpqaxq6CrmJuioJybqqeinauipamlpLSknaOTpq6suLSnr6KSkZmdpZKRoKGYnKCdh6arpKutv8CxoaquqpaSn52imaKkqqOToKGenayuqaulo6KloKSlnK2pkaSbqK6qnJ2qnKyilpellqGjmJx/zpR5eqWCepWWm1+tj16Op4ChoHynlZt0q4OAr15kjal6p4eFn3SXkoizY4KrhqCNjbJqhK50fJaHuGGCrVmjzW6PdXvbe3+ZcX6IknV/ZXuIdnZrfYhufoWQkn5sgI1fcGpvZmBfeGRccWhqY2ZgUlRSV11KT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzcxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLS5KMCc7XDpMLSFQQEY0LjGtwsDAtbSwt5iekaSqqa20q6ayrK2spKymsKqgp5uappicorCfoJ+op6OmoZ+wrJuelqaurbGrqKyglJKbn6WTj56ll52oo56upKuwqL/Gs6ipsa6Wk5ycopegqaqflaGenZ2ur6eqqJumpqOgqpKts5amo6uqnqOnpqGwoZKap5qhm5SUkZegcIWMl3WEqIdxsHydcqx+oZ+BpY+ed6uCfa1/nHKtfquHhp92mJJ6fJd+qoihi5GLnH6re4iSjqCAeq1WnMR6j2+SwX2BlW11cIxtZnZlhm9hd25yboiKkY+DbZCOZG5zdW9gZm1kX25paW5mY1dUXGFaUlJDOElJQEQ8PjxARURDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PldKLTwoPTEpM1ZARiEcRzpDMS4rr9TGx7K0n52jjqOjoq2utq+psKepqqiuq6unoqOdmaKVn6arn6Kln6ioop+esK2Ym5aop6+tqKepnpeVmqSikpShrZudp6OurKOstam5zbKtpq6sl5WbnKKZn66snZahmZ6fqbGpqaiaqqijoaubr7GiqKyuppmmq6qqsaOTl6OlmpSShaRqpHWJeql0erJxgqWJmIxwiKCah6RfYFKrhH+ugpt1roKnhoafepiWhXtmgKOJpJiGgaN9qX6AlIauXnyoVZ2ikoF6op+Ae8OvxYxzr7OzuXFiqa/CdWiMi5ePgWyZkW5teHd3bmxmZWRxcGZ7aWNcV19pWFhUTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dbAoZmrqKGvop+wtbCvqayjqKaqq6uppKagm6WfnaWnpqOcrJqiq6Gkn6+jnpuTqqS2sK6gqZudl5WnpJGboqifoKacsKajqLGstsiytaqsqpWRnJ2imZ+ls52aoZScn6arq6KtmauooaGporOtoqqzsqKbqqivr7ajk5akp5ibkXyqbJ6Eh3WreXywboKki4iflpWflYHSt7S4yYCBsl5flKmDpIeHoHqYlZl4qslzmaOUp6mQkpuMfpqJmsbGd2WhgqVzgZ+Ogn2vXm+1Y7F1S6OGbadHgpNjjo+dkntwlpF9b3p0fHptXGZqcnFmgWleYVhjbVxeWUlNTUtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOT1BNRkxKVkYqTDAvPi00T1RRHRw7PEYyLCSopMHGua2osq6spaKdsrmsqqGmm6imqqypp6CmpZiqo5+uq52moKyan6mlnae1n6KXk6irtrKsm6acoJWQpq2RmJumoqCqp66ho6epsLTCsrOqraiUiZedpZuio6+ll6GVmZylpauarpysp6Weq6O3rKGxubCdm6+ns7SzpZWYqKSboI6CnU54moF/n3qEo3yCpISGpp6cnpOEuHt8ebmCfszFwrZ4mqCQi59+mpaXinWel4qkmKOofrCFnISeg6x9mZRhpWyjcI+FkIF9l4NyrGCkc3GAmmC8fVJVdY+Ro5Z7fZGQiHN6coR+cFtsbndyaoFuWmNfaG5iZF1LTFFUQUhIRkk6OUs+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUyOlBbVBwbNj9ILC0gjIeZqaykq7mrr6CboayztKafoJWlrq6uqaadpqaao6ehsq6hqaayoJmopJSitaKjlZehqbW5pJujnaOTkKKxmZ2bpqShoq+tnaSoorWxw7Gtqq2qkYeRnKedo6SdpZeemJmZpaOoma2hrKSll6+lvK2it7eunZ61srmys6eZnrCipJ6Gj9G1w7d5h46FkZOPgKZ4lKJ3jKCShKWCi3GrhoS0bnJpmaOclYmffJiZhoePcq6CpZuijaaLk52JlJCabXCyXKVzk3qcbJl/e5l9bqlhonFxf59ic7K4aHiPk6WYfYuLkYp3fHiNgWxod2l4c25/dFxkZG5tZWhgSlpXWDxHR0BUM0BGPjwqKDYzLjAxMykmNDo7PD0/QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZJzjIquv7+7u7Wel6ikrbaho5mVo6mnrqmrmaWhn6WgoLWnoqmnsKOUq6OOpK2jnZCamqq0tKSdppypkpSXrqCfnaWjnKectZqgqqO2q8Kwqaupoo2Ej5yioaajlpmanJibmKWkppiqpqyhpJusp76slb6wrZ+jsLO6rLSnm6mypaiYeqiQfXywd4qApKWInG2yb6CHrXyhj4OolpmArImEroWflKigopaFn4CZlYB7kn2rgJ2aloqqeJ2gj4iTkoB5r12jgXymp2SdgHyXdGuvXaVrcYWZXWBbjKBulZGmmYKTi5WKeXmCln9qbH5ifXRuf3lgZmVxb2hnaENZYFs9SlQyVDhCQkM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pYU1BPTkk3MDUyLiosQVRWVlZUVFVVVVVUVFVUU1NWV1dYVlVVUUhGSUojKCi8kpqEqcbDtsG0n5utoK64paSOm6SjoK+uqZ+jnp2tmJ65oKKroK+qmq2hkKqppJaJmpCusKymn6ibrZiYj62ioZ6loZqlnK2Yn6imtqi/r6WppJ+MgI6bm6CmnpKUmZqUmpqko6OZqKuroqOeqai+pJfDrKqjoqyzuqyvp6G0sKmrmXavfpCKnIWHfLqtiZhksIxlla19oI+Dp5aagayKhLCFpZmkoaKQhKBbbGqBs2B/rXt7goGxbGdumZeLiLFbfbRbpINryKJln4F7vFl2tVqyfVKvgHqsWIChbZeOqJqJlo+UlXl3jZt9Y3J9YYN4c4B8YWlmcG1mZWVPVWNbQVRePUkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTUpHQzU1My4vQFVZWFdYV1dYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsre9u7TBs6Ocraaltqmhi5mgn52zsqieop+dtJigs6iqq56wrZ6sm5WuqaKOiJuOr62opqOoma6Tmo+pmqGepZ+Zo6OlmZ6iqbKou6+lqJ6dj3yLm5ahoJqQkZqbkZmXp56hmKitpqSkoqSpu56gxqelqaKrtLatrqegva6trZaBqZKjro6bgIakl5iPgYC4w7qDjpyThKeXnIKsioKviKabmqWqkX7VvcKqYqO/vXx+o4KD17q4tYWTkoKevb6EaqOBb6uEbpx/erKxx4Nqq7C9rXh3or67dICVjaabjpmPlZt4gI+ZeWJ8emOMZ3iBe2BrZWtqYlBiW1NqXEBUYUJNKTw6NC8eHyQeJTIgHSQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1JQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVtLSxv7myvbOina6mprOmnoyYpb+qt7CnoL+mprGbnrGcuaiera+lp5WUr6yXjIOaka+mo6yhpZyqoJiLo5KmnqecmqGoopmeoKutqbmuqKSbl5N7h5mSppuTj5GYmI+Yk6iZn5ipqJ+ppqGiqrueqcWjoK+jq7O1q7CqobyosLCadHWqpLeFZYmfb2esj4qPbW93pJCZn4F1r5mVcJCMcZWno5uYrqRybW1tZYp3bm2CmXGAeWlwaWeJlZWXcWhphYZncIZkXoljanBZXWd+d6ZgYnGOkm9mZICNko6il5aXj5Sde4aNk3RlhndojGp4fnlkbGNmbGJLZFhKa1k6UGVFUSdLOSsjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16olK2zqrq5srOqqaKun6SzqpiSvbHDyL21qZ7Aq6yjoKarn7qjpK2srKaOlq2qj4yFlZetn6Wqop+kpKCRjKWTp5momZajqqCWnKWmp6+5q6yam5OSe4SXjaaYjpGQmJSNl5WnlJ6XqKKar6adoqy5n7DBqKSzpqyxsquurKi5pK+4loqhqKW2nImWoZeGqZqQlJ2TqrOZm6OsobOXoqCeoKKcoKShlaumjJKTjIeSnJyUkJmTmJCOlYWApJqXlY2Lk5KKj4aEfWeLgHSDdnSHjHGnbXyVkZSTgYGPj4+OnZOglZaVn4GGk4twZ452b4p3dnx6aWxkZG9jVWBZQGlaR2JgTlkqRT0rJiI3NDAuHxwhJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlVRSkVDPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqW1uK+uorCkraChtrGQjqvEu8S6t6qhpZ2bpp2wqKO2p52ptKankZiso4uIiY+cp5aspKGap56fk5Wjl6maqJmUp6GkkJqnmaG1uqirmJqQjXyBlIyhlIqUkZWQj5OXpY+emaifm7Wjnaart6iuwq6jt6avr7Ctqqq0uqKvvZmSpqOmtaKRnaaejamfjZKfo6yvmqGjsamwmKShnKSqnp2dnJernJKZoZuTkJaqmY2YmJaQlp6RiKCdlJSFkoyQjJSLgH5mjId1h3Z5iINznGqHkZSUkYp9jJaSkpiSoJGblZ+ChpeFeHGUcniJf3F7fmpuZF9waWBbYFltYlBgZFBaOkdGRT0zPT03LiomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlxeXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iVpKejsLOsrqOpp62gqLWqkZCco7K6rquroaKZep2isKSlsamWm7imo5SZqZyOhoqJm6KQrp6klqigoZKXmZyui6qWj6iZqIyYqI+eubakpZibjYl5gZSMm5OKlZGUkI2RlqGMnZ6onp63o3+Dr7WisK90pL6jsqB4eqCrs7yVdq6kn4qAqn5kW2F2n46knYOXfm6Ts5yjqK6ro2WeoJNzeZmWcICYqJdsf6KniWWcpZuQl5iWi5GbkIWdmpCUgpKHjo6SiYV3a4+HdodxfIaBgGFpiIuVk4tbdpWRZ2iPjXF6o5eWZHiYhoB2l2iDiYJueX9rcGVfdm9ra2hcZmNiYm9SWz5NTk5SRz1AVEI5MS4eHyY0OjMxNjY3ODw7PkBBQkZIQkdGSUtMVFVVWVxfaGZnV1FKPERHPDlWUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuppamto6etpZKWqrSusaWZqaarlnOLnK+fqKunk5a4oKCPnKSdkX6IiJqejauapJWnop6Ol5KehXWukImmmqiRlqOIm7q0qKCZmIuJdXaTjpaTipORkJSMj5KfjZqfppmbspaAjJu1nbSMko+9p6F+p6J6o6+4gY6Op5+Ei4WPsKmvjImWopl5gYushpydoqiqqIiVhph3pZt6h5uBl6aCgXucsXqKhZ+XmZSYloGQlpaEmZpieYeQhI6PkouDbnGQiHqBcYCBhn+GdIeFlpJ4lmiTdKCadHyZg56bhZh+kYmBgpdpjYyEanh7cXBnZHdtaWxqW2VqaWVyW15IU0xRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1JYWlhbYWFoZllRSDlESzw+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZijn6aurquorKCosKenqqWZlK3GvLChlaWotJ2Pg5yrm6eioI2Qvp6ZjZ+aoJB9hY6Zl4irnaOWoKGSjZSJhoCRqI6Hopyjk5adhp+5sqedmpOPhXB1kIqVkIqUj4+bi4+RnpGWn6OVnayIn7SJtJqui8qIq66Jt4WNsIOxr4SpjaeYjZ18qI9ye3ebjqaWaJWkebSLn56nqZKZwoF/q4iYoXGegJqkfZeFlbGBoXygk5+PmJeAjpObiZiSi3yFk4aNlZOJg21zkYWAe3KGgYV9hXSFgpeBj8VmgKmHj6JqnoKfmIGZgIqLg4iYb42ShGd3dHt2Z2h1cGZna15ibmxmbFhmRlxQTDJFNDZNYGM2JjQ8REdEOjY0NjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASmRYXWNmaGdiYmJiY2NgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLmxqqummpSfoqSqopWjqbair3+gppylnp2JlL2Zk42gkZ2QeYOWlpGHq5mcm5qhhY+Md5ucj6CRiJ6km5WYl4aiuK2lmZuNjX9ibZCLk5CNj4yMl4uQkZ6Ok5+gmKGofqGnh62doJauj5+dnZGGgaCNq7CHpI2qmoyafqN2gJiTa4GrdE2reIeNnZGbqaiCqqt9g6F7eqdpnn+Sa2eXhpe2iJ59bWBjWIOXf4x7ZGeLc5l9eZZsXXyXbl9TcYVcYGx5g2BZZYJ9hIGYcaeqa4OjbnKlcJ+DnWdkn2xabIh6ZVlfgn5hV1BvdmVtdHFqam9eam9sa2hXaE5dV0U5QTRHQ15rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deX2J2YE1EOk1PTVRiXFtmZmlpYmJkYWRkYmFiYGJkY2FiaWtkYmRkZ2RiZ2VhY2iYlp2guaGqo6askqK2vKuuopmXn6GlrKyfnK20oqeRoJ+fppyZjpi0mZCLnoyVi3WBlJGNiqaWlpienn+ThYaspIeckYqYqJeZmpGHpbCmopWZiImAaW6Ih4uOjomLjZKLkJGhjJOen5uipX+TgY+joZSgd5yWkKeDoaeAhqquhaV5i32Emn2icHOTh5Z7nox5bYebjJmQm6mbj4edfIKic3amZp5+d6RfmHp8knOibpi3tLp0koeBgLaoZIHGuHtwlbeMcYCbpGN0rKtgfWqds35ufYeDjoKLl3GAo2xzpHOeg36jXp2Zs5Zve5ees3RyW56ygmlib3N1cWhvWWtscnJlXGhdYktEPUQ1UUFZcTI8UkZfSlM9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltaWGBgfGRJQzhMV1VWYmFaZWZra2JiZWFkY2BhYmBjY19gY2tuY2NkZGhkYmdmY2holJaVo7mZrJyToI6luLWuraCaopyjo6Ssm5qxrKuSl6CYoKSampSeq5uLiJJ4i4VwgJaNio+gkJOUnZd9kYmOqKGHmI+KkqOTm5qMi6iopJ6PloeEfmt7hn59j42Di5CQiY+Tn4KXnqCdoJ+LiXecmKKMoHKii4ipiJynkZeorH+ujH16oJl6o5N4gHOXiIycfZafhpuNmZumhqNkoXyJlpCbjWyeaJqNbpqZen+Kp31yZ3Oqg52Cc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF6ndnWJin+eaJp1h5OSmI5/nm6ZkGummVyofne7an2pWo6EXbNnXG1xeHdraVtwaXh4Yl5lV2JBUERPN1ZCUm00SlpaX05aREAxNTE7OzdIPzpDSFU/WFJZXT5EYl1WYFFhZH1pRUI5TlteWWRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZGNpaGdraZWciaq2m6iJY5WcrLqysKydppubp5+drZqdsKernZeimaGfmZaWoKOZhomNaYiAcXuXiIuWloSSlZiPeoqElqOdiZWQhoudkZybiY+oo6Cai5GKgIBpgYZ4f5aMe4iNjoeOlZp+lKOfoKKTmHJon4qgj4xwkoyCqYiZn6Opoah9sK2koriXdqOzoqN/iJR4nXqrmn6ijp2bl4iXcqF8hY2vtX1rmpGheH6YtKOjq6iEmHuafJyZfnOqWl1ve5eLeJ5iTX97e4VjephCTZ9ZompyfI5tgYmEmXWbeYeJsbN/f5qSpnR/nW1xfJRvmXJpo12VdkhlY2BzcHx9bmVga2h2e2JjYFFeVlxUVkBZRVFnRFJXW2JYX0lEPUI4QEI6SUU4TEVYQVZRW1ZERmFcWmBLYG1+ckVDPFVfYlplalZnaGxuYmZmXmFhXF1eYGhiX2VjdmxeZWdmbGRlbGhoa2mTnYGxrpmEU1+hp7S6s7OpmqKLm6mcm6iSoaujoKeOnp2cmpmVmKGdloeHiXeFgW55lYWQmot9kZKWiHKAiZKgnHKRkIGImJSfmoSOqJyalYqLinyEbISFcYGhjHiFjYiHkpiUfJOkoJ6jiK6GfbWEj56de6aWeqmClp2Qi6Gefadod21+mXOgc3F8nYWYb5OCrn2jg6aemoGjcF6pZ3WjY2+lYZzTkHx6mXhyc2OihY9+onKijnVrj7OLYIKYinOqsqi8f3eDbX+/pqq0XptvfnGXb4FzonJdo2d0pmFopm2b05h6gptud3mXa5t6dpdybKmlZ19keXB+hGtnZmNtdndmX2FSW2VRUWJJV0lUX1dTW2VqXGVRRUNLTEpLQkpEOFBAUU5XU1hPUlFgZWVpUmR4eXdJRkVjXWVaaGpTaWhqb2NqZ2BiX1xdXV9oYmFoZXtkXmRnZGtkamxmaGxomJt/sKxUXEt+qbCytbCzo5yYhZimoKCijaSon5eoiZmXmJOZk5Kgl42IhXtwfYRofY+Dk5qBd5GNjolwf4aPkpJsl5N8iJCRo5WDjqqalJKKhYl5hHaHgG6Bn4Z3gJKGiJmhlnmToqOaoImzoaK2i3qsp6SupXCpgJqQhYGckn2kgKKZhphynoSirK6Jl4uAjKSNloOuopR2tba1yaF0lIqAn2Gel6lteJaGn5p1oYd3oH2QloqBb0xmopJwmohzpHt5dGGDgmx+oGxyZGCccn90l2l7abO1tMamc5h+e51qm5qrdIKabXN3l2maeXSYcVBFfLNeanVqeIdmamdidHRwbVVdU1loUFJoSVVMWFJWXWdrblZnV01KQUpNSkhKTkFRSlBlY2ltZXRyc354e251iXt7VFBPbV1oW2tpUmpoaWxnbGZjZV9cXFxeaWJkaGt7X11kZ2NqZm5tZWlsZaKcia+nhWY/lKKzq6+vtaKikICXqKKho4ukpp2cpYGal5aNl5CQm5KNiIN5anmGZYOMfpageXWPiIyBaYSFkoOMhZ2NeoyKlKWSgpepl4yRi4CJeoB9i3lwkKGGeYCUh4mWn5R/lKWnnJaWhGdueJxsomR8caV3nJhwZ6eBl4x7pXqgloOXcp92gImUlo+5bpCKomJ9maKViG5yaaprdaBsbqZgm2mLkGiWh5qVdaKAfZpfi4WMdW+IYmihZZ5/aZt1cGRmiIJucqJaX1tkoW5eiYxve39zcmSlbniiZGenaJhyi5huoW9SiI9voF5kp1SLXVOYbW1yanGBbHBoa3hza29RV1ZWZllTbUlYT1xIWGloc2pZa1ZRUkVWXExYUmFVaGped3V6fHB8fHKCe39ydo2AhHZeUXNhZ2JwZ1BqaGhrbG5nZGdfXV1dYGpiaml2dV1cY2hjamlybGZrbWOdpZimemV0bYunrqWqsLGmn4uAlqqcnqSMoaGaoaGAlZiTjZqPi5eQjYp7hnGAiGiLi3yXmnN0in2Qe2WDh5WKipWZgnyIhZamj4Giq5CFkIqBin2AgI5zaY+lhH2Fk42ImJ+Nh5Kqpp6JpniWnH6liZaMspiekIOvl5+leJaIeql0pY+Emm6looyShIyDvG58pa+ChoWGk5acoH2menGolKCWZ55+b6tiloqVkneobKmigYl2h4J3q5GmiGuRsGt2s4ypbIuGbm2fnpKVYX6ri6p2gH+Np593n32FpJWdoGmah3WrZp6tjLZzd76MpJNZg6aNq2F1cXNve3RwYmp+bmhsUlVaVWBhXWtNXVJdSV1sbXZgW3FZW2BaZ3Nlbm9yY3F0YHd7fnlyeYNzg36Be3uMgYKAdmJ4ZGNuc2RSbGdob2xyaWZpYV9eXGFqYmxsem9cXGJpYm1pd21nbG5ilaaqnIGAnqSWqaqeqKeuo5mJgpeqmZ2jiZqlnKidhIuaj4WckYWSjYuNdIV6iINvjYR9lpN0dIZykoJtf4uSh4aTj317gYSXpI1/paWNgI2JhJR1g4eSb2yKqICCi5ONiJyeiYyTqqOgkIB1lZeIfoF5lK6jf4GbcY+GeJCMhYB7cqeMcX19epeWm4SOeHt+fYiUlZOKdpCZn6GEe32Ja4yFW3l5cnlwaG59kYlxf3SBj5STcYWDgWWNf1+BgIx3dXOUdW96b26HbYSGX3doeI5mgYKGjqqcfnR9l2qJiG9/dXyEdW1sZoxzeHuXd4Rbalh4j2htd3Fwb3d3b11shm1pZ1ZZX1dcZGtkVWFVXlFfcHd5a2p3ZWpqanV8cXF0c2FvdWJze4F4dXmCdX+Af4B4i4WDfXttf2xkeW5eV25naHVreGppaWRcYFpjaWVscHVuWltia2Rra3ltaGxvYY6Vuqmni6GimqakmaSdq6Kgg4OXq5GdoImappqomIKBm4t+lpSHjomIjXKCfI99fo+EepeOdHKDcJWFe32Si4aGkIV4foCGmKKMe6ehi4WPj4SVgoaOl3dyhKmFjZKcj4ienoeLmqegoKuDiY6Vmn5+iZatqI+Sp5B4cJ6Rg3uTb36phXB9lXFqb3yBn4t/ko6MaG1dg4uMnJufj3OVi4hxdGuCdnN/WXJuho+BfX6LaV1pY3qFg4iAX2l4e5t8g4yDdoGGg2l5i4drYXFzg3dgc4yCiZCnlYZmjY+DbnaLg2+EjHhuZGZjeYJ6lVpcaWZudlt6eXd0bXNygmZcbYpra2JZWV1aWGtxW15gWV5dZnN9e3NvdGNqaml7fHF6d3RkbXRobHx+dXl8e3p5f4B/b4aKhHt9c355c39pVFxxaWx2cHVna2dkXWFZamhranFybVdbZW5sZ3N5bmhqbWCMjKuxopCjoZqfnpiemamjoX2Dl6uMn5SHm6KQpJR/e5eEfJKZiImGhopyfYCLdoWLgYSWinFvgHKYhoR+koOEhoqBeoCDipqej4KmoId4jZeIlYuLnJeFg3qsgZCXmZOJnp2HiKGqn6Kio4yIk5uco5mWqqGnpqCSm4iXj3x5j46EqH5/kpGSk5ywpZqUnZCOspOYhKaMjJWboImQm4KJkYprfI52d2WChpCKfImdhIeLj4eIgISDkHd8enWaoomHi5+LhpV/foyBgHZxdIaFgHiIh4qRppGEho6Ig42QjHyGioeOgHVrgYN7eZlpcmhgc4pwfXp2dW93dIFcXm+HaG5fXlpbXFNncVVjW1thbGh0e3xybnBjamlof3tteH5xaG9wbGaBe3KBgHeAfX+Ee22CjIZ8enh8fnqDeE5kdmpzbnB7ZWtlYmJgW3NmcGZycWxVXWx0bWl5enBnaWtljYidup+WoqGYlZmYlJikoJ17f5mqjZ2NhZ+cip6WfHiUgnuOmYmGg4SGbXiBgHKAh36Ik4RtbH56l4aEg5B+gIaEhn2Hg4yanJKHqp6CcYqPhZKRi5yRfY16qYONkpeVjpuWhoabpqCimp2Gg5KZmZiQmqafpp2dkJeBkot3fYiOhaV7fI+QkYaYqaGck5yPjaqOkoCejYmTmp+Dj5d/h46Cb3iFcXRgfoOPhXSLl4CDjoKGhH6FhJRueXV1k6KLjYabhYWOdICKfX1yc3uJhHt5jI6Ek6ePhoSPgoOKiYl1hIeIintuan1/e21oa2xnXnl+Z3x7dnN1dXp2XGBwfW10YGJaXF5RZm1TZVpdYWtpdnl+cGtsY2tqZ4CAa3KAbGt0b3huhHluhoB2goB9hXZygo2Ifnt6fH97gopgaXtrdWhpg2VqY2BpW2N1aG9idW1sVGJxeWRwenpyZWptbYuKn7iaoaSfk5KWl4uan56denedpZCbiYaklIuYmXl5jYV8iZGDjIKBgm18f3hygIV9ipB9a2h9gZeIgYiOfH6GhId8j4CPmpqRiKecf3CLiouShqChioWMfKeRh4+Sl5OWkneNo6ChnZaaf4GQmZiTjJqioaOal5Gbf46FeYCEj4ehgH6MjY98l6SgoJKZkI+mjZCBm5GJk5ibfpKSfoeOgXV0gnB2YH2AjYVxipV8h4txjH6ChYWOaHhyeYyZkpCAmH6Ii3KCh3x9cXp8jIV7e5KNg5alk4uGkXyFhoeEdYGChod5ZHF6fnh5cGxqZl59cmh8dXVzfHN/al5gc3Zwd2RjWV5eUmpoVGRYXmFnanZ4gXFma2NsaGV/gGptfmhvcGp9d4V6a4uBcoGBfYF0doKNhn58en+BfX+PanKDbnNpYYhpbGJfcVV0b21uYHhobVdqdHZidXp7cWJrb3qJjZ+zkqWlnY6QmI+GnaCanHx1o6CNln+MooqImpZ4e4aHfoOJfoiCgH9wf3t0dYKFfomQeGdjfYaXioKKjXh9gIyDeZaAlJaVjZafmn1vi4GQk4alm4eMiYOllYSSipWXkpF2kZ2hoZiUmHp/jpiWjpaanKSemZOUm3qQhoN4hZeNnn6Bio6Mc5einaCSmI6PooyMg5eYg5OWmn+YjXyIjYF2cX1temSAfIqFcIaSf5CCa4eCgX+JhGV1b3yHk5iNfZR4jIl8gId9fHKAeYqHeYWRiouYopaChIx3iISCgXZ6gIiEdF93d3xzfXdma2RgfmlqdnNzdH1we2NjYHNtdXJtYVlgXltsZFJiV19gaGt1eYZwY2pjbGZofINraHRobG9of3yBeW2QhnGAgoJ/dHyDjIF/fnqCg358kG11iXR0bWWKbGphY3VWg2lxbmB4ZmxianZwZnl7eXFgcmyGhZCdrpimqJ6OjZeHhp+Tl5h8d6mciph5l5yLi5iQeHuAi318g3uAgoB4c3h6c32AhH+IioBkXn2LlYd+hId0fX6Kf32YhJaTloyioJd+cod7k5GKpo+MjoqSoJGDkY+Ul5GKgY+YoJqSkJJ0gI2Rk4mcnZ6mmJiNlZd0jo+KbIaYkJl6h4iQiW+XnZmik5SKjJ+MhoKSnH+TkpWHmYh7iYmBenF5anVse32LfW2FkYKTd2+Bg31+i4Bkcmp8gZeYhX+OdJGJg3mHfnZ4gX6HgX2EjoWNlKSQeYWDdImHfX9ydH+GgmxgenR5cHtvYW5iZHthbm92cnd3c3Nhdl9ua3Vub11bXl1eal1PXVdiYWhtc3qJa19qZWpjaHeHbWZsaGpsZ4B8endvkIdzgIOEfXSBhol6gn16gYR9fY5yeYt5eG5sh2toX2lyY4docW9mdmdtbGF6aGp8enhwYXdti4GZmqqgpKmdioqRhoqeipWXfXatmIyWfZ6TkZaTiHd9e4p8e4B2d3+AcHRzem+FfYGAiX17YVx+j5GGf4OEc3qAhnqPkYeRkZySpJuUgX2AfI2KkqSIjYqNl5qNhZGYk5WOiYmMk52TkIyNboSQjpGInpmhoJeWiZaSb4qahWeGmo+UeomFkIpwlpqToZKSiIuZjIKAkZ59kpCTjJmPe4mEh3RzdWtxbnV7inRuhpCNkXF0gHuBgoh8ZXFteX6alH2FiXSRi4F0iXlvgX6Bh32FjYqFjZaojXuIfX6LhXd9cG5/hIJiZ3dzdG56Yl5vYGp0XnBqenh4bHJwZXhdbWxzbXNYWl5fYWpaT1dYZGNncXF/h2ZdaWhmYmdxjW5kaWdlaWiAend1b46Fc4CBgnt1goiFeIR8d4OFeoCJd3+LfHtyeYNqa19waHR/a3FubXFnb2xle2Jtf3l2cWx3d4p/o5iiqKGnm4eMioGPnIaTnHSAqpSRjIagjJWTkH90e3aEd3h/cnN7hWtyb3ltiXaAgIZtcFtZfpGNiICAgHZ1gH9/oIaPipGcl6CTl3eJfoCMiJydiY+GkpeWhIiUmY+Wi4uNjo2dio6QhG6Ji4+RipyWoJuYlYWYiGuGpINnhp2KkX+LhIuBd5OYkZ2RkIiJlY5/fo+YfJGNj42akn2Kf4Jvdm9rbW9weoVpc4OOl4lwd4B0goiCeWZ0b3aBmo98iYV6lZJ6d4l0cIp8h417i4eEiY+co4h8hHeCi4B4eG5pf4F/XHFycW9vd1pecGBval5vaXx6cG1tam12YHBvanFtWVhhYWJtV1FTWWVmY3VwhIJiXWttZGJma5JtYGZmX2drgXVxcnCLgHR/goB4doCLgHmFf3eHhnaDhXyHjIB7dop/anFjfGOGfG9wbHRqaG9sdndfcX55e3R1dH+Cf6WVmq2fp5aFjYN/l5WDj551ip+TkoWKmoyVjYt6cnd0gnByhXNxdYhsb211bYh3g31/bG1VUYGrlIeCeIB2coJ5gqCBkYGTkpibkZp4kXqCjJKkmpOOiJWYkoOGlpmMk4uJj4+InoWQin1zi4WIj4icmZ6blpSAlH9php2IaIehiJKEkYOJcYORl46ajo+Mi4+Nd3uSkHuOjI2Rlo18iHyAa3ZqbWtrbHp+YXl9jpWBdnqBd4OMfHlndWx1h5aMf4iGe5SRcXqFcHiNe4uNe4l+g42Rnp6FfH14got9dnBoa4CBd152b21rcHJVXW5icWBfbW55cGdwZmdzdWhwa2F3ZV1WZWBgclNQTltmZV14cIh8X1xocmJiZWaRaV9oZFtncH5va3Fzin12fYWAdHV/jHl7hYB4iINzhoV+jIyDe3mVeGZyaoNgh35vb2t6YGludH90X3R9eIZ4dHKFfHmhkJqxnKaOg4p/g5qIgIuefoqZko6EiJeNjo6EdnR2c4Bwb4VzcHGDb2ppdm2Cbn18bXVzUk6C38mS1pN8cHSDdYOggpJ3lJCYm4+Ye5NyhZCfoZOTkIqSm5OFfpaViI2NiJGNiJyAjoF4eox+iIyJm5ucmpWTeY13aIqSiGyJpIWTiJeDhmOMkZiOlImWi42Ki3F7lIl7jYiKk5GKeoV7fmx7ZXJvamt5eVuAeY+NgHp9fn+Gjnp6aHRrdIuQioKGhX2WjGx+f2+BjX+NiH6EeoOQlpqbi3x3eIOPeHJsZXB/gmtodG9naHNsU15uZHBZX2txeGZramJmeHNvcGNfd2BgVmtfXnZQTkxgZmNdeXGKdFxbZXZgYWVljmNhZmFYaXNzbmtxdot8dHmGgXV2fotzf4Z/eol/comHgZGKiHx+mHZlc258ZYh/b3BsgFpsbnl5c2B2enuNdnJ3ind5n4ybr5ugkIKFd4iVf32JnIaEn5COhYyXhJOOh4F1d3B5cW6Eb21ufnJkZHhwfG16fWpobGOkmsHcru+hc2t1g3WEoYWRbpWPlJ+Um4GRcIWLo5eJjpWKkJ2VgoCVkIWJj4CSioqXf4d7dX+JeIaEjZual5mOkHaLd2+Iiox+i6SFkomdhYVei5SXio6IjouKhIlse5eCfYiFiZGPhnaFfX1rfWN4dWlteHNXiHqRhoR5fn+AhYx+eWZ0aoCKj4qDg4CMl4ZsgnZuiZGDkYV/gnqAkZaUmZB0dHiHjXVzcGZ0eYFhc2xvYWh1ZlJgcGdrVV5tc3lgcmNfaH1xcm1aYnJhYlduWlx3TU1MY2ZhXnZzim1bXGR5XmBkZoRfY2NeWGpya25rcneLfXN3hIF4d3yIcYOEfX6Ie3SLiIiVhox+fpdzaHVxeWyMe250cIFYcXp2eXFkd3mGjGl2gIlygJ2Imaico5KEfXCMlHh5i52EhKCNjnyVjH+Zh4R7c3dwc2pvgWtpbHx0XmB4dntwdXtnYGV869q1ycPciHNsc4B2iZqIjWmXj46clJKBiHCFiKCOhIuVioyYk3yNkoiDiY97kYuGkIJ/dniDhHKHgpKblpOYhox2h39xhoOKh5qig5SMnoOJYYOVjoaJhYmMh4CHaX2Uf32DhImOjoJxhn5/cXdndnJpc3drWox9koGEfH+DgISKgnZidGyJgpCLgn9/k5F9boJseYeQh5OEfYF+gZKUkZeJbnJ6jIZ1bHBqcXd/XnNoblxqdWBSZHFoZlNfb3Z0X29gXWiCcXJpV2doY2lYbVdbdUxKTGVmXmJyc4VoW1xleV5eZGd6YWRfXFlrbmVuanR3in5zc4F+enZ6h3OFg3x/h3d2ioWPmIGNgnuTdmx3dXl5k3VueHp9WHmGcYBvZ3h3koJkdoaFcYqWhZmhm6KKhnNvkotyd46cfYmZiIl7n3+DmX+BeXJzbm9kcn5pZmx3d1tfeHp6cXF/aWFnYX/Vto6QpnhucXd7cZKQjIdqmI2Im5GLhntoh4uZhoGSkYaHl418jYyAgImNfJCMfoqFenV7gnpxhYCUmI6Sk4GJdYSHd4SAi5Sdn4aWj59+iGF/k4eEh4OJjX9/gmZ9kYB+f4KMj5B/bYJ8gnRrbXZ0c3Z1a2ONgY5/hH58hH+EiH9wYHNxhnyPjYJ8f5KJenGDZnuEi4eNhHyFfoGVj5GThG5weYx+dW1uaWp5fGFnaWlYa3VaUmlyaWJQYnJ4bGFlXVpqg21zYltnX2RsX25UWm9OSE9mZFxnbnGAa1pbY3JfXGNsd2RlXVxabGtibWpzdoZ/cW9/fHx0eIV4hYJ8gIh1eYmBkpV8iIZ2iIFweHl7hJNvbXuBd16Df3SBbWl6c5RzZ3KIfXKSkYSan5ughod2dpR/bXaTl32HkIOKjZl8i5p2fndxb2xqYXR8Z2JpdXpaX3h8eW1xfmVjaGhXnY9ecXKWvMSEdnGUiJB+cpaLhpuSjIdyaoiPloB7lIyBhJuMfIqGfHuJjH+UiHWKhnZ2fYFxdYWBnZOFlI+Dg3KAiHWFfIqZnZiHlI6dgIhmfZOCf4WDiYlxgX1mfot7eX5/h4uOfWmAfIN2Zm94eHN2c2xqjYWKgYl/eIGAhYN/a19yeXt+jYqGfIKPgX5ygWl5hIiMhoV5hH2BmI2QjH1ubXuJfXd0bmdme3ViW3BiV25yU1Nuc2hhTWZ0eGVgXVxYboBvc1llYV5qbWBwT1lrUURTZ2Baa25tfG5aW15sY1pib3dkZ1xdYGxpY2xpc3aBg3Fufnx/dHWDeoOCfIKFdn6IgZaQeIOKdIGIcnl4fo2Qb297gXFpgXl6fm1se3WVa2p3hHRslI6GnpigmYWIbn2Mdmp4mI5+gYqClZeJeY6Wb3pzcGxqZGBzemhgZXF6WmFyfXlncXphZWWPsbJ3SmJapNnQlnJ7kIqQd36UioSZkYyFbmuFkpF6eZKGgISYinyHf3h4iYqEloBwjIhxdH16aXmFg6SQhJOMg35vf4N3hHmGnJmVi5OQlIWHcHuSgn2Cg4iDboF3aICFeHJ/f4OKh3xlfX6EdWNwcn9oeHBvdZiMhYKKfHZ4gIR5gWtccX5zgYiFiX6GiXuJcoFucYWHj4WFc4R6gpmNjYR4bm9+hH92emRnaXtvXlh2WlhwbE5XcXNnYEpsdnRgXVtbWXR9cm9XZ11manBgb05XaFE/WWZeWm9qZ3pxWlpZa2VZY3F5X2hcXmVtaGVraXF3f4dvbH9+gHVvgnuAgX+Df3aBhYiXinGCjXF7hnx5eYSTjHVqen9sb351f31vcnt7lG9ugX94ZpOLg6GZnJKChmeHg3BnepWIfX6EgZiJgXyNjGl4cmtsZl9hbnhtX2JveFxkbIN6YXF2X2Vl1Oq+ijI6PouOgHF4hYiOjXaDlox+ko2Mf21shY2Mdn2Pf4WBlYh8gnhudoeEg5d3b4iFbHV7dGZ5goOmi4KPi4N9boB1d4R6h52RjJGSk4yLhn57koZ3f4SMg2t/cmiAfnhtfHyCioR3YnmEgXFkcWh+bXRxdIGbi4B+hX5zdX2Ac4FvW21/dXiLg4t7h4B8iHh6cWyJhJCEi3KCeoCXi4t/dG1rd4CAdXVcaGd2b1hWe1JZb2RMWnJyZVtJcHhvXFpaWV11fnRoWWJbZ2VuY2lMV2ZRPV5lXF11ZWB1cFpZVG9kWWRxeVpoXmBnbWdpbGlwd32ObGmChH55boB8fIF/gnp1goGNk4VwgItud36Ae3uIkol/aHt9anR7coZ7c3d9f4x5eIR9fGuMjYSbnZaMgYBsjX5raH6NjHp+f4OUgX59iohrdXFnaGNbYmdybmBha3NhaHCJemJzdF5jZJugj25cNVmvtXRpgIh8koZ1hZaFc4+KiXZwbIWDh3V5iXiJfJOHen5zZ3aJfn6YcHGGfmh2eW1leYiEpIaAh42Jfm5+doCBfYyaiIKUkZiJi4SJfI+IcHt9hHtofmxqgHt6aXp2gYeAcmB3gX5xZHJmdYJtdXuElJGBfIF/bnd5fHR/bVhwgHd1jIKGeIh2gol6eHNuioGQgYZzf31/k4mIem5tam6CgnVuXWdkcnBRWnpNWm9cTltycGRVS3N4aVdZWVphcYB0YF1dYGZkaGlmTlpoTkBhZFtgdWFddW1YV1N0YVpkb3JXal1haGtnbWxpcHd8kmxphIl8fHB+fnuBf4J6d4B/iouDcXuHb3F3hH97iY2Pg2p+e213eHaKd314gIKHf4N+fnpthYyImKONhIN7dYt5a2yEiJB4fXuBkX9/foqDcHJxY2ZeWWdfb3BgYGdwZmpviXRhdG9bYWRqdnt/vpymo8i4cYWDcpJ8eIaTgnORjIdycm+De4N0dYd0iHeTiHl5cWN3h3qAk2lyhHZnd3VjanyCh52Bf3+Oj31yf3SFeoCSkYN5lo6Vj4iCiHuIiGt4eX51Z3pobH95c2l6doCDfWhgd4d9ampzZ3uAaXaAi5CUfnp9fnB7dnt0fmJWd31yc4qEgn2DcYeKd3hxcISCjX9+eX59do6Gg3ZpcWltiIJycF1nYXFtSmV1S11uVVNZc25iUU9zeGBSWFhcYW+Cc1thXGhlZWNrZFFbcElEY2FaY3BeXXhoVVZVd15bZW5oVmteYWpnZW9vaHB2epJuaYiMeH1ye355goGBfHZ9g4iGg3B3g3Jud4OCfYmLk39wgHt4eXqBjHSDeH+BgYKEeoB1b36Ki5ueiH2FeneGe2d0hYuQen5/e4iFhHaPgGdvbl9kXFhlWW1yYGBgcGxraIluYHNpWV5kbYB3qdqpx4aHsnGJd2+MdXuGjoB6k4l/dXR1fneAcHF/bYR0lIZ4dWtgeoJ5iY9mcYRwZ3ZuW218gJCTf4B5kZJ9eXttiHeBkoyEdJaKkY6HhYV7f4RsdXZ/bWd2ZW17dW1qd3Z/f3xgYniFeWh0dWJ9e2d0ho6MlXt0gHVxf3p8bX9ZVnR/cHWFh3+BeWyJhnR5bHWAg4R+e315e3OLgXxzZ3RlbouEbXNbal50ZEdtbUxaYVdWVXhtYlBSdHZXUFVYXmFxhG9cYGNtZGReb2JUXXJHQmZfXWZoXVt7YlFVXHVbWmdrYVZqX2BuZWZrcWhwdXiOdGuOjXV+dnh9d4GDgXtzfYOIh4NvcX90cXV/hYGJjYp7d394g3t8hYd4h3x9gX6EgHt+c3Z5jI6gjYl6iXZ0g3lefYWYjHmGg3SFhoR3iXtibm1cYltbYVZqc2NgW2dub2aHcWFxZldcY2t/fMrOh7mham1timxxhHF8hIl+e5GFeXlzeXV1fGpsdWOEdZKCd29mXn2CeouJZnKCa2pxY1hteoWbiIGBc5eUd398bolygouMiHKYjpGJhYuDe3h9cXFwfWZocWJteHFqa3F4fXx6XGR5gHdpdXhlgnZndIeLjZR8cYdqbn2BeW58XVhyf250gYt8gm9vin9xdmh3f4GAgXd9cXt1h3x6cmZzYW6MgmxyWGpddltIbWpNVVReVFV7a2FPVHVyUFFUVl5idIVpXGBramZjWW5hWGJwR0FoXGBmXl1We11PVWRwWltqaF1XaGBfcmVqaHJncHJ3hnhulYp0f3p3fniDh391cn+GhY2CcHB7eHd1eoaFhoyFenx/dIt+fYaEhId/fn59h398eHZ5eJGToH+MfYttdYB5Y4OGloVzkYpvhYWBeoN0Y25qWV9bXV1UZ3NlYFlkcXJmgXNia2VXW2Bpf3i+rnugt21ic4Zoc3txeYKFe32Mf3d4cnZve3Zlam5gh3WOgXNqYl5/eHmLhGdxfmhra1pWb3eJo4GEf3GZk3GAeXWDboGDkohzlYiNiISJhX14dHJuaHlgam1gbXZqZ2preXd6d1tnfXx4ZXJ9bYR0ZXWFjIWVf2+LZmp6g3VtdGJccH1sdX2MfIFmdYd9bnFodX94fn9zfWx7e4F6eHFmbGJuiX5tblZqX3ZVSmlqT1FOaE1ZfGhiTlV1akxQVFVeZnWDZl1gcGhnYVdpXVtraEpEalphZFdZVXlZTlZtalldbGVcWWVjXnRlbGRxZ3JvdYF4cJmFdn9+d398hYd9dXOCiICVgm5zeXt6c3OFhoiIg3iBfXWPfnyEio6EgoR7fouDe3d8d3eanZd6ioKGaXZ9fGyDhJJ/co+CcIWCfoF/b2ZsZ1ddW1xbVGRwZF9XYnJ1aXVwZWViV1xcaH9wb3KAc4lkZHh+aXR1c3KChHiAhHl3dHVta3pxYmdrZ4Z0jYNuZl1ffXB7iX5pbXhmaWRVV3JvjaZ8g3t2lpB0fHN9e258fJGFd5l8iIaDhoN9dHBybGd0XGxoXmx0ZGdmaXpve3JZZ4B2dGdwgHeBdWJ3hYp8lIBui2pteoFxZnNlYW57Z3N4inx+YnaDdmprcXV7cXp6dH1mfn9/eXduZGZiboV8bWpWaWFvUkpoak9LTnBHXntmYU1VdGNKTlNXYWp2fmVcZ3NpZWBWY1dicF1MS2tYY2FVVFVzVkxYdWRaX2thXFpjZV93Zm1icGlzbnJ/dXSagXd/gHd/f4aEenx1goR+l4VucnR8enRxhIWPgYB6i3V0kH98gZWOgIWEfX6Mhnt+gHZ7o6WKeYiGhGt1fHp1g4GLeW+Fc3mEfYGDdW5qaGVWXVtaWlNibmRbWGFze2lobWlgYldfW2qAaWtvgGdrYGh5eGpzdHRuhIF6f311dW56aGp5al9lbmiBdo+EZ2VYYndpfod7b2lwZ2ZdVVhvZ46od4F6fJCOeXVwf3BzdnqPgHiVdYaDgIWIdmpydmdobltsZF1tc19nYWp4aHttWm2CcnNqb4B+eXdhd4SEd4+Ecohxb3l/cWNwaFxweGRxdIh8eGNzgHBnanl0cmx4d3Z4ZIN7f3h2cGRjY258fGtrVWhhZVNKa2dPR1JrRWF4Z2FNU3FcSk1UWWVrd3tlX21xaWRdVmBWbm5XS1NoV2VeWE5VbFRKXHlfW19rXV1bY2VgemhrYW9vdW5veHV6mH13gIF6gICHhXp5eoN+gZOEcXR0f3l2dISIkH2AfJBrc5WAe4KfhX6HfYB/hoKAint2hKyff3qIiINrcoF5dYB/gXRuhm58f3OJgGpvbWRkWF9aWVpVYmpnW1pedYJpXm1sXGFWXFxsgWVxdH1paVxrdnVndHdybYV7fX15dXJseWhpeGZdZXNoeneSgWNjVGVwZ4KFd3dnaWpgV1ZZZ2OPp25+d4CLjnpwcX1oem96jXx3j3KEfX9/hm5kdXNkaGhca2Jdb29bZ19tdWR6aF10gG9xa3F7fXV1YXSFinqHh4B/d3J1f3VhcG1acnRicXKFfHVlcoBsYWx7b2ppe3l2cmaFdnt6dXFkYWVtc35pbFRoXlxUS3JiUEZWYUdidmdhS1RvV0pMV1hna3Z6ZGVucWZjWlddWXZlVUpcY1dnWFlJV2VRSGJ4Wl1fbFteXGFkXn9pal9udHhub252g5d5coGAfH+Ii4V9dXWGeYeMfXN1dYJ5enqCi459foSJaXOWgXqKnX1+hXqBen98hohzcY+ujHt7h499ZXGHeXN8e3Vyb4Vse35sj3picG9iZV1lVllZVmNma2BdXHOFaFhwblpeV1pcbHticHd2bWJabHNzZ3R1cGyEeX6AeXdubnRlaXRlW2h1ZnZ2kXpfXVJmZmuDgnR9YmNpXFRYXWJjj6VoeHSChZB4bW96aHhufIV7dYlzgHh8eH9oZXZtYGZgXmpfXXNrWWVdb29iemVbd3trbm5vd3hzdGRyg5J+h4KIenZvcn1zYndkW29xYnFxgnxzZ3KAZV5udmlkZ3l7dW5vgnV0fXNxYl9mbm99ZGlTZ1hYVE13X1FKWVhIYnVkYUlUbVNKTFpXaWxye2JsbHNjYVlZW2F2W1NMY11YaVNXSFlhTkdpdVheYW1bW19iYl2FaGdhbnh5bG9qdoGQeG2CfoCBkoeDgXZ0iXSMhnNxd3WCd3x9foyPgH6TfnB3lYN8mZJ5gIB4eX5/dIiDc3CZont6f4mUeGR1iHhzd3VsdG9+bHl8cJFyXnBvYGdibFRbWldoY21mXFxxiWVTcm5bWlhYYGx2Y2l1amleWW1zcWxzc3NqhXx+f3x2bm5sZGlxY1trcmR0do5zW1dTZWFygH9ygl1iY15TWmBbY5GeZXJxhYSRdGxrem1vcHt8fHGBd39zenp6ZGV1aF1iWmBnW152aFdiXXBoYXdgW3t2aWlybndzcnRocIGUgoZ+hHZyanB9bWZ3V1xrbmJxc4F6c2dvfltgcHFhX2pxfmxsdX5zcXhrcGFcZWxsemFnU2ZUV1FPdVtRT1lSSGN0YmBGVWpQSVBaVWtra3xlbW9xYVtaWFlscFdTT2ZXV2hTVEZaXE9IcnRYX2NtY1hgYGFdi2pjZG15eGtvaXV5hntrg31/hJl8goR5fYhuj4Zxb3d6fXSCgnyKjoKCl3R3gpOFgZ+JdYCAgXN/gnGHgnVvopd0e4aLhntld4pubnpuZnhwemtzdnKMa150bmFnZWtSXVtVZ2FsbFpccIxkT29uXVZYVWdqdGdidGVlXVludG1wdXV5a4d8f3yIdo9zZGRrbmFcbm1jc3iHa1pUVmNkeH19cYVcY19jVFpgWWOVlWNucIOFinNqaHtvZnN3c3xsenR1b3p+dV5mcmNbXlZhZFlhdGVVX2BtZGFxXV1+b2hpc3FzcHR1am2EkoGIe4VxcmZufXByb1NbZmtmcXSBd3NjbHZVYnJrWl9vZn1mbXd9c3Nzam1gWmRqandeZlRkVFVQVG1XUVZTUEhkc19hRVhpTkhXVFZtaGR8aWt4a2JXXFVbdGRTUldoUVllVFNIWlpQTXh2Wl9lbGlZYmBeXo9uYWZseXVub2h2dn9/bIN/fYaXe3+HgYp+a5OIcmd0gHt1gIJ8iI5/i5NyfIqRhYefhnt/hoxzgYZzfYN2bqWMc4GNi3Z3bXqMYGR7cGZ6c3hsbXF2gmdke2xjZmdoU19eVWdfbG9bXm6NaE5pbWBUVlNvZ3NsZnhkZFxYcHRscXp4cm2Ie392nHp5a2FlbG1eYG9qZXF4fmdaVlhgbHh8e3CDX2JeZ1dYX1dkm4hia3GBh313a2t4bVx3cWx7anZzbm97gHJYam5fWV1VYmNYZHFiU15haGJibFpgfWtma3N1bm13dmtohYt+iHqIbXFlcH1tcm1jWWFpaW90gXRzX2lsU2VxZFVibmJ6Y3F3e3ZrcG1qX1hhZ2h0XGVVYVVSTlhlUk9cT09IZXBdY0ZZaU1JX0tYbWRfeGhufmRgVF5UXXVcVFNgZk5dYVRTSlxZUFl1dV1fZW1oWGNhW16OcWJnandxc25ndnR6g3KBgnmHjX58iYeOem6QinRsc4J0f3+HhIaRhJWPeX6Mj4eRm4SAfIyEcoCBc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX5+fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY2NjY2NjY6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkpOTk5KTk5KSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjYyMjY2NjY2NjY2NjY+Pjo6OjY6MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJFtZmdnZ2dnfYWEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJOpa+tra2trqSfoKCgoKVeKi8vLzAsSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMkWdfYGBgX155g4KCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1M0GptrS0tLS1qKOkpKSkqlYVHBwcHBc6g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn1+fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRjo2NjY2NjY+QkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho+QkJCQkJGQj5CQj4+PiIKDg4KCgoWKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GSkpKSko2QkpGJh46KkJKTkIqQi4uQiY+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIuLjIyMjIyMjIyMjIyNjo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOh4iFiYuGiJCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI+GioaHh4WHj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCQj4mIjoiEhoiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhoeHhYiDio+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2JjYqKjomOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj4+Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dXZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaGhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRUA+Ojs+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozw8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Oz06Nzo8PD49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VzcXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk4OTtLOzk6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIGAgYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj48PT0+Pj06TXpSOj09PTw8PDw7Ozo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMS0lJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NEQT8+PUBIR0Beemk9PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKS0tMS0lLSkpIVnBvcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRURIPztAY3x7dXN4bDk5PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHFycnJ0dXZ6e319fX5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QTkw+QTw8PT8+QkM/P0FBQUJARXNiP2uFhISEgXlsOzk4ODo7PT8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISkpKTEpGRmdwb3FxdHZ1d3t8fX18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQz9NdHptgICDgXuDfnBAPT0/Pj0+Q0Q/PDw9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbW9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENFQE5zdYB+e4ODfISEaEFBQENAQD9AQD49PD1BRUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFASXJzf359hIWFhYZdPkNDRUA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUdGRkpOTktKSUdHSEtNSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVEZnaAhIWFhYeHiYJKREVEQ1d1homKflhHSEpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkdZeYKFh4SBhomJjGFAQlV0h4mHh4aHgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTExghIeIg4GDh4iJe1dshIeGhoaHh4eHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJS0lJR0hJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSWSHh4WBg4WAgYGDhIaFhISFhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpKbIeGgn+Dg4GBg4ODhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5AOzk5OT09Pjw8PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlphYGAfoCChISEg4OEhomKi4yLiomKi4yJVDs4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3NTg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDRXWFf4CBg4ODg4ODhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo5Ojo6PDg5ODk3Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1JXa3JydHR1d3l7e3t8fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7QjlHgYOAg4SFhISEhIaJioqIh4iIiIqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw8OTs8ODo6Ozo5OTk8Pzw9QUJESUpNS0pMTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/PFaGg4KDhYaFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQUI+QEJAQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQEA/P0E9Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHFxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BCYIeDg4WGhYWEhomJiIiGhoaHiImKi4uKioqLiotePkRHSUtKSUZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREVFQUZFRkVGRkRAQj89QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBEREVkiIODhYWGhoaIiYmIh4aGhoeJioqLjI2MjIuKiohXSExNTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkBAQT9CQ0hISmCGgoOFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpPTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDk4PDs8PTo/QD5AQENGSkpQaIODhYSFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpIR0VKSURKSEdMSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VucXV2d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af39/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AOTo8OD0+Oz1BPj9ARUlLTVZzg4OEhIWFhoeIiIiIiIeGiIiIiImJjIyLjIyMi4uLi15RUVBNTk1LSkdGQ0dKR0xKR0tPTEtKSk1NTE9QTkhJS0xPUVFQUU9PSklKSkxKTEZHSEdGR0lGRUVCQEJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FITE1RV3mFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdVUlJUUk9MS0pFRUZLT05PV1ZRUE9RU1JNU1RPTVNMUFNVV1JTUVBMS01NTUtOR0dKRkZISkRERUVCRENjcHV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JDRlZORk9RUVVZfIaDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7OlFTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tHSElIRUZJSElISWpydnl5enl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/gICAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQUVCQ0dFREVMWFJNVFZWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD5AVlVZXGRgVllicl5dVl1aVkVRWVpbWV9UWWdSVVZYVVRWVE9PTUpMSklJTE1LT01UcHR2eHl4d3p6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1NYWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUlZWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lIWVhZXF1ZWFlXUlFNUFFNTU9TUVFVUmJ0c3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af4CAgICAf39/gIB/gHh5fVlOS0lJSUZCREBBOlBRUVdYUFBPUVNUVFhYWVpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxYU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpbWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllab3N0d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJSVVNWVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVVNUXlpYV1dXemtYWlxcXlNQUFBJTk9XVlhaWmRxdHZ2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JRUU5LUlRSTU9ZUU1OUVNVVU1RU1JQTkxMSENJSFJUVVpcbXJ2dnVzc3d7ent7e317fX19fn19fX59fn9/f3+AgH99fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVVRTElMSWFsknRQUVNOUVJRUltSU1JRUlVVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkNDQ0NCP0RQQkRAQz5CSEdWQEhOTUddaVBIRk9GREVGSEdIQkNIR0hKR0NCQURAT1BNUmRzdXZ1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZWJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPj46Oz5AQD8/PmtRS2FFRkhJRUI/R0xNR01RVUlCRT8+PD08PT0/PT9BQ0I/Pjw9Qj5KTUZVbnV1dXN0dnh7fHp9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9enh6fHx4d3hkQkBAQT06QkNBQURCXF1Pe05PT05LTE1PT1FMS0xXTkhHQEI8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXV2dXZ3eXx8fH18fH19fn58fX19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5gZWBdXnF2a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSUVFRkRNUlBhV1JYUVBTU1JVW09PUVZQTUlDRj46OjY0ODY5Nzk6MzY2Nzk2PEI9ZnR1dnd3eXl7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUxUVFNRUVVPTFJTVFdYVFRYUkxYWVpWWFhWWFldV1dYaHNrXVZgdGthYV9dZGBfXllVUE1PTkxJR0pLSUhGQ1FQU1pXVFRNUVNZU1xlVU9TVFFOTElIQz9BOTk4ODk3ODg0NzU3ODU4OEducnV4eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk5OTEpGUFBVWVNUTkpPT1RTVFxWUlVTUk5NTElISEY/Pz06Nzg3NjU5OTY3NjY1V3FxdHd5ent8fX59fnx9fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0pHUFBPT01SSk9QUFBOTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUVBOTk1QTlRSUFJMSUxLT1FQUVJTVFFST0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+M0A+am9hUlJRQEZUUVBRUFFOUU9QT0xKTExPUE5OUFFRTlFPSkxNTUtHRUVEQjs9PDw5PUc2Njc3RG5xdXd6fHt8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkM4RU5TXWdTUVNBR1VQT1FRUE1NTkxKTEtMTk9PUU1PT01JTUxJTEtMS0dGRkVEPEFBPjtARTs8ODlUcXN1eHt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT88PUFAQj0+RUhHREZGSUdLSkBGQUFARkhFSk9IUVJhXFFQUk5TT09QTExPTEpNTE1PTltWS01RT0hKSENJSkxMS0ZGRkQ/QkM+PEJGP0I/QWRxdHd6ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPjs+QUBAPkFESUVDSEdJR0lFQkI/PjxDQkFHSURNT2FlUU1PTldLTE5LTE1MTExLTk5TZE1KTFJJSUlFQUhKTE1OS0dJRkJBQkA/RUZFSERLb3B3enl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc291dGxwcHJvb29ydnZyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9HS0U/Qj05OTk6P0I/PEFCQkFEREdLRkRJSUdHSENDP0I/P0BBPkNFQ0tOUVRMSklNVEZJSUpMSkpLSUlMTU9QUlBLR0NMR0NDSkpMTU9NSUpJR0NDQ0RJSk1MSVpzbXh5eHp7e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG1zdXtzdHhyb25xbnZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FqcWhlcUhLQ0ZISEdKS0lKTERHQj0+PTo6OjtBQj89QkJDQ0hGSkxKRUlJRkdHQ0M7QUBCPkBAQ0VDSU1PR0hLRkhLREhJS01ISkxISEpMS01dUklIRE5HQkVLS05NUE5LTUpLRkdHSk1OUU5MY25pd3Z3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRvRktDRkVHREVFRkVHQ0NAPjw9Ojs6OkBEQD5CQ0VFSUZKSkxGSUlHRkZDQjtCQ0M+QENDQ0VHTE5IS05IREhFSU1OTUdJTEdFRklJTE5LSkhFT0lDR01NTk1QTk9PTUxJSElPUlFSTlJmZ2Zyb3N4dXt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSUNFRkVCQ0JFQERCPj8+Ojs7PTs9P0NBP0FDRkdKR0pJTEhHR0dGRUNAPUVFQj5BRENDRUdISUdNUElGRkdLTk9LRkhKRkVERElJSEtJRkhQS0RKTUxQTk9OT1BOSkpITVJVVFJPV2RhYW1ncHJvc3l6Z2VoaGNpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0JBQkQ9QkE+QT06Oj0/Oz4+QEI/QEJFR0pGSUdJR0ZGRkVEQkFBRkZDQkJCREVER0dIRkxRTElPSkpMS0lHSEVGRURDSUhIS0pHS1JNQ09PTlFQT09OT09LS0tQVVdWVVNYYF5daWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Fya2tzTUZGRUhCQkFERDxBQUBDPDg5PT46Pz0/Qj9AQERGSEVIRkZHRkZFQ0NFQ0RJRkNGRUJFR0VFRkdFSk1LSFFNSktISElFRklIRUNJSUpLTUtQU05EUVNRUVJOT01OUE1MTlNXVldYVlheW11kYGhiamlna19kZWZjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEJCQkZFPEBDQkQ8Nzo9Pjs+OkBCPj8/Q0VGREZEREdFQ0VDREVGRkpFRUlHQ0dIRkhGRUNGSkpHTUpMS0hKTEZJSEtIRUtLTE1OT1JUT0lTVVRRVFBRTU5RTk1RV1pWWllWWl5aWGFgYGBfaGVjYGRlZ2dqaWhqZmhubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3JzeU1ISEdJREFDSEU8QEVDRT04Oj4+PDw8QUI9Pz5BQkZDRUJCSENDREVGRkdHSUZHS0hDSEhHSUdGREhLSUdLSE1LSktMSExKTUtJTkxPTk9SVVZPS1VWVFFUUVJMT1FQT1RZWllcWllcX19eYGNeXGFja2JgZGdocoVoZ2lmam1ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0lLSEpFQkVHRTxAR0REQDk8PkA/Pj9DQjxAPkFBRkNFRUNIREZER0ZISEZISElLSkVKSEhLSEZGTEhISEpITExMTExJTUtNTk1PTFBQUVVWV09KVlZVU1NSUUxPUlJRVltbXV5bXF5gX2FgYmRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3b3ZJSkxJTEdCRURFPEBGRERCOz8/QUBAQERBQEI/QUNIQkVFRkdFSUVGRUlIRklISkxISEpKSUxKRkpLSElKSkdLS01NSkpNTE5PTk9MT1BSVVhWTU5UVlVTUlFQTU5UU1JXW15eX11dYGBhYWFgYmRlYmNoYmRpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXRzcHN2dHV1d3Z1dXRlcXNrcHFqcnZvd0pNTEtNR0RDQUQ8P0VFRUM9QUFDQkJDRUFDREFBRUdDSEdIR0ZKRkNHSkdHSkZJTEhJSk1LTUxHS0lITEtOUUtSUUxTTUtOTk9QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhX2BiX2BlYWFjaW5oYmloaG14dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnJxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHREFARD4+REVGQ0BDQUVEREZDQ0VHQ0JJRUJISklISEtGREtKR0hJSUlLR0pKT0tOTElMSEpNS1pmSmRcS2xSSE9OX25VbHNbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZcbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPz1ERUZEQ0RCRUVERkJGRkdDREpERUpMTEpMTUdHTUpISkpIS0pJS0pOTE1NTExJTE1MW3NiZHBebGxVTU5mc11nZXFsbnRncGlfYVlubmJwcGJrampnb3F0ZXRub1xwdWdwTUpyeXZrYmBrZWVteG1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QkI/PUJGR0JGQ0VERUVEQ0hIR0RFS0dHTE1NSk1MRkpOSElLSklMSkpKS01NTk1NTUtOTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtb3ZcWWxRXG1tWnFta29teHh0c2lwXGBzbHFqVXV5eHBjXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEVFRUJCQj0/P0ZHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5HTE5JTEtJSk1JS0pKS09QTk5NTE5NTFxoZHVdbHFXbE5PUW1VWmtea2x2YWxkdFRlY05tWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2dhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHdJTUdJREVFQ0FCPEJAQkZER0ZLR0VDQ0hLSEhGSkxMRk5LTFJSTEdNTUhOSklITkhKSklITk9OTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210Xm5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dEhLSElCRUVFQUA+Q0NCR0NISU1JRkNGSkxJR0ZKTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTE1NTElLS0tTa2JaaV5famNyclpfWWpvX2VlVWtfY1thYlFgbWhcalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdzSEhGSURFREZBQEFFRERHQkhKTEdGREdLTElFRkpPTElPSUxbUUpGSEhLTUlISklLS0lISkdLS0tLR0hKSkxMTEtJS0xOVFtcVFBUTVBPTk9PVlFPT1FPT1FKSk5QUWRxaVRZV1tbXFVZW11YXVxcY2ZhYWZiY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUM/Q0dERUdDSUtMSEZER0tMSERHSVBLTE9LTFdNSUVFSElKSElLSExKSEZISEpHR0lFRkxISUtOTElPXFdeT1xbYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXWJYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0eHl5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJESUVHR0ZLSktIRUVKSkpHRUhIUEpMTUpNU0lIRUFIRkpJS0tJTEpIRkVKSEVGR0VFSkdDSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5fXF5TW15jX1pdYGNgWV9iW2BeW1RYWFpfXmRiYmFjZWlla3Jwb3Bwbm93h4aFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUlERktLS0VGSElOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlFRERFQUZKREBKS0lPW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1FbX2FhXV5jYWBiYmJjY2VaUllWVVxbXmNgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGQ0dFQkVHSEZHSElGR0pHSEZIS0lMRENLSk1NTExISkpISkc/R0ZOSktLTUtLS0lHSEREQERBSElBP0hJR09dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5QUF1fYWNjY2NiXGRjYmRjZlhRVVRTXFhbYV9eX2FhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUJASUZDRktJRkZHSEdHSkZGRklMSk5FQ0tKTE5KTElLSkhJR0JISFFNS0tPTUtLSUhHRUQ/RUJISEFBRkVEVF1ZXlhfWV9bXVVYWFBdXVFLSldeWF5bXVZaYFJRX19iYmBgYmJgY2JiZGRiWE9RUlJbU1xeXV5eX19fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eIh4WDgHx4XFNLQkFHRkRHTVJIQ1JLRkhISEVGS0pNUEVHSUlLTkxMSUxLSUlHREhLUU9NTFBMTEtLSElDRUFFQ0hHQkFGRUJWVUVcVF1TVl9YTlRVTlpbTUpLVWBhW19YX15hXU9ZYlxgYF9iY2JdYmJXX19UUE9QUVhSXVxcXV5fYGFmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElSY1BEV19JR0dIREZNSlBQRkpJSktOTEtLTEtKSkdFSk1RUU5PT01OTE5IS0FEQUNERkRDQURFQUxIQ0xMUE9PTEZNRkdJSkhHTExNT1FJTE9QUFNQTFFTUlVaWVdZWFhkVk9TVFBQT05QVVRcWVlbXl5hYWVmY2hja21xc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01eTEdIWU1ISEpIR05MUVFJTEpLS05OVU5PS0tMR0dLUFNTT1BPTk9OT0hLRWBFRF9MRGZjRE1bSF5cc21PTVZtWUxDUF9VbFdnSl1YVl5ETFFVTE1UVlFSVFhXVFhVVFxUUGZaaGhkWVRrVFdWVVtcXGBgYWJiYmBmaWdubGhyenx9foGEhISDg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1RJS0dgVEhKT0pJT01SUUtNS0xPUlVST09KTE5HSE1RW1lPUFBOT1BQSktQf1FJfFlZcnNYUG1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVpfVlVXf2p0dXVfYXZfWGJcXGZbX2FhYWJeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0lMRlJWTEtPSUtSWFdRTk9PTVFUTk9RUEtMT0dNUFNbWlRRUk9QUFBLSFp4XVR4ZGhZUlRRdmd0bHBibmZrUXJPTXdtanJwc3JxcnBvcIBdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3NzfH1vfnlvf3JfYGBiYVphYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tISlBPTU1KTlZeWVVMUVNOWVlMU1NSTkxQSVFSVFlXV1BUUFBQUUtHZnhsY3hxbVpKTFV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclFoem1panp6fWx4en9wZ29YdnZqdnVwgGFzaH1pbHh8b19fX2NiW15iZGdpamRnYmNkbGxwcHN0c3NzeXFyeGJsdGdyeXtzc3V5foFzdXpufH15eHJuTkpTdE5DQkVQUElLS0pMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBJU1RVWFdXUFVQT05SSkxyb3V1cXVxZGhhVm5McXBeRmh5V3ZUS2h4fXhgeXtzbmFebW9kUmdydW5teXB3bHZzdHFsbVxzfnprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZWVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21LS1tWSEdFR1JQSkxNS0xRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlVXbE9ubHtzYWpnf3ZVS1draH1sbWx4YFtwenteYHpzY3JveHFoZHxpcntdVEtsX3Z1a2l1e3ttfnhrfHBdXl5iW15iZGVnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3Nya2hsbXJ8a21oa3t0bW1rbU9HSktISkhIUlFMTlBNTFNTUk9TU1dSVlRQV1pWVlRUVGFgUU9OS1RTU1FWVk9OTE1PUEpIUU5QVUxLS1NUU1JUUFZVUVFOUVFYWFFOUFVUWFhYW1tVU1NXW1dYV1pQU1VXV1hRXVhWXVVTT1hSV1dXWFpgW2dyXltcW11eX2NaX2NjZWZkY2NiWWNjZmZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLS0xNS0pUUk1RUVBMVlZUUFRVWFVZVVJaXVZVVFdVWVhQT0xOV1RRTlVTTlBNTFFQS0pRUUtRTUtLT1JUUlFRU1NJSE1OT1FSUVFRVFZSWFdcV1NTUFJVVVZUWlFOU1JXVVRZVlRZVVNSVVNUVVhZV15aX2FdXFtaXFxgY1xdYmNkZ2VkZGFZYGFjYWJpaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRjZmhQSktLTk9MTVRRT1RRUU1YV1VUVVdXV1pWVFxgVldWWVVYVFFQS09YU1BOVVBNUk5LU1BNTlVUTlFOTU5RU1BUUVNUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdXV1lbU09TVVdVVFlVV1lUUlJXVVVXXFlaYF1WWV9dXl1cXWBhXltiYmNoZmVkYlhgYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl1dY2hrYWdmaGZkYGJjYVBLTUxQUUxPVFBQU1FPUVpZWFdYWlpYWFZdamRWWFlaV1ZUVFBLT1ZUUE9UUFBRTk1RUU9SWFRSUU9NT1NVTldSVFVVT05OUVNVVVRUUlRYVlpdXFpWVlFSV1hWW1tWUFNWVVVWWFRXV1RSUlhWVVpfWl5gXlZeXV5gXVxgYF9fWmJiZGhoZWRiWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9VXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTFBTUlVaVVRQUExQV1ZRV1JTU1hNT1BSVFhVVVVTVVlYW15dXFtWUk9VV1ZbW1dQU1dVVlhVU1haVFNRWVdWXF5bX19gVWFcYGFeYGJfXGBdY2FjaGllZmBaY2BhX19lZV9gY1taXFtcWlpZWVdcWVxbYF5fW15eYWBfYlxZYFpRTk9OVlFQVVNQVVRTUFdcXFxYXlxfV1xeanF3eYBjXFtWVlhSTk9XU05RUVBSVFJMUVRTWVpXVU9STlNYVlRSVFJSWk9RU1NWW1ZWV1RWWlhdXlxcXlZTTlRWVlxcVlFUVlZYWVJTWVxUUlJcWFpdXl1hYWBXYltjYl5hY19cYmFiX2RnaWRoXlxkYGFgYWNlX2JfWVpeW1xbWVhZV1daW1phXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQWl1eXVtgXGBVXF1panJ9c2xoXFVZV1FPUltTUlFUUlRVVEtSVlVbWVpTT1NSVlZVU05WUlNaUlRVVFhcV1hYU1hcWF5dWVteVFVOVldXXltYUVRVWFhYVFZYW1RTVl1ZXV1hXmNjXllgW2ViX2RkXl5jY2FdZWZpZWdeXWRhYGFiY2RfYl5YWl9bXFtYWFhYV1taXGBdW1tcW1haW15WXlldUE9PUlpQWlVVV1ZUVFReXmBeXmJcYFVdXmJreXRsfWxaVVpVUVFTXFRUVFVUVllXTFJaVl1bXFJPVVNYVlZTUFdSU1dTV1VWW11YW1lVWl5XX15ZXFpSV1JZWFlfWlpTVFZaWVpWV1lcVlRaXVxeYGFgZWRdXl1dZWFiZmReX2RjYFxnZGhlZWJfZGFfYWBiYl9gXldYXlpcXFpZWldWXVpdXltaW1xbV1lcXVZYV11TT1BXWVBdVVZZV1dVWF9gYWFgY11gVV1eYmVldYF6aFhZWlRWU1ZcWFdXVlZXXVhQVVxZXl1dVFNYUlhWU1JUWFJTVlRYWFhdXlhdW1VeX1hfX1hcVlJZVVlaWmFYXFVXV1paWlhZWlpYVl1eX15jYmJlZV1iXGBmYmVmZF9gZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWltcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWVFxUVldZV1ZcYGFiY2FkX19WW2BkYV96dW9oWlxaVlhVV1taWVtZWFlgV1BVXltgYVxUVVhQVVZVU1ZWUlNVV1paXF9eWl9cVl9fWl1eWV5WU1lYWVpdYlleVldaW1tbWltZW1lZXl9gYGRjZGVlYmRaYWZjZ2ZlXmFjYGNeY2NpZGRnX2deYmJjYWFgXl9YVFpaWltbWFtYWFxbWltXV1pYV1xbXGBdVl1dU1BWWldWWlVZVVhXWF5gYmFkYWRhXllZYWRiYGxmaF5cXVtXWFhZXFxcX1tZW2JWVFdeXWFjXFNWWVBWVlZWVlZTVlRYXVxfYGBdYV1XYF5bXlxbXlhWWFhbW19gW15YWF1cXV1eXFpcWFtfYV5gZGNkZmZmYlljZWVoZ2ReY2FgZWNdZmlkZWhfZl5jYmNhYWBfX1tYWVtZWlpYWVhXW1taW1dYWlRZXVxaYFxVXmJNUldZVldaWVtcWVdZXmBiYWRhZGFdXllhY2JfYWBhX1xcXVhXW1tdXV9fXFpdY1hZWF1gZGRfUlhZUFhWWFhYV1ZXVl1eXmBhYV9iXllhXV1eWV1eWVhWV1tcYF9dX1lZXl1eXmFdW1pZXF9iX2JkZGVmZ2diWmVnZ2lnY19jXmFmZFpoaWNmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWVdaW1pZV1hWVVtdXV1gYGJieEtXV1xYV11cXF1aV1xdX2BiZGJiYV1gWGJjYmBjYWNeXF1cWFdbXV9dYF9dW2BkXFxYWmJlY2FSXFlPWFdZW1pZV1pZYF5hYmJgYWNfXGJdX11bX15ZWVVYXV1fYF9fW1peXmBiY1xbV1tdYGJiY2VkZ2ZlZ2RcZmhoaWZjYWJcY2dgXGlpYmhpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldXWFBYWl1hY2Zmcmt/SllXXVpaX11cXlxYXVxeX2FjYmFhXWJbYmRhX2NiYl1cW1pXWGpxYFxgX11cYWNfXllZY2VkYVRfWlFZV1xdXFtaW1tkYWNiY2BiZGFgY15gXF5fX1pYVltfXVxhYV9dW2BhYmViX11TXF9gY2RkZmVnZmVmZV9mZ2loZ2RkYFtmZ15haGhiaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnV1dXV1dXV2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7enp6e3x8fHx8fHt7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dXR1dXV1dHV2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7enp7fX19fXx8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHjF1NLS0tLUk3t9fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYiNsbW0tLS0uFEmKysrKiVikoyMjY2OiX5/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19eNXn5OTk5OeZe39/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMi5G7wL/AwL/ESRQbGxsbFF2Wj4+QkJCLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSDgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12fn9/f39/f3l3d3d3d3d4eXl5enp7eG5vb29wcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYCBgYGBgIF3cnNzc3NyeX19fX5+fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ0dHR0dHd0dnd6e3h7eHd2eHt4e3p5fXl4eHl4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7enp6enp5enx9fX19fX18e3t7e3t8fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHt9ent9e3d3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8fHx8fX58d3h4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3d3p8ent9fnx4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6fXx8fHx+e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl7eHp6eXx4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgYCAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKEhIKDgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBgIKDgYKFhYaFhoaHhoaGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4KDhISCgYGBgoSFiIeHh4aGiIeHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Qko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KDhISDg4OBg4SFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoKBgY+IgYGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9/gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgoGDgoCEmZGCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAgoOCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCg4SCf359fYiblYWEgoSCgX+AgoGCgoGChIOBgYGBgoOCgoKDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODhIWDgYGDgomIhX58fH1+gZqYhISFhISEgoGAgYKDgoKEhIOCgoGBhIWEg4ODgoKDhISDg4ODg4WFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj42MioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB/f4CDl5GGfYF+gol+kpiCgoKBgYKCgYCCgoKCgoKDg4KCgYKDhYODg4ODg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSTlJKPjYuHhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf39/f4ObnoWEin+AhH+CiYKBg4GBgYGChIOBgYKBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgZiih4WEiYZ+fn6Bg4OEgoODg4KAgICCgoKDgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSBkJ2EgICBgX19fX2FhYWEhYJ/fX19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOGjoKAf4WMgX19fYOHhoOAfn9+fn9/f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODgX+AhoaDgH9/gYaBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEhIOAf4OGg4KDgoGAgH9/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eJiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEgoCBhYSDgYKBgYKCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiouLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5GOioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4ODgoOEg4OCgoKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhIKChIODg4OCgoKDgX59fX5+fn5+fX1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4aJiIODhIOFhISFhYaIh4aFg4KCg4WHhoeGhoOCgoOEgoODhIKBgoGBgYODhIOEkZKRjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaFgIKEg4ODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYODhIWFhYODhYSEhISEhIWEgoKDgYSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/gYCAgoODg4ODgoJ/fX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4SAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fYCCg4OCg4ODgn19fn6AgIGAfn19fX1+fXx6enp/goKAf39/f35/f4B+fYB/f4CAgX+AgIF/f4CAgX59fX+AgX9/foCAgH+AgICBf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn1+fn+Af31/fn1+gIKDg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6eXqAgH5+f39+fnx+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXt/fn5/f39+fX5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+f318fH2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2Af4CBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f4B/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19e3p6eXl5eYCCgoKEg4CCgoF/gYCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYGBgYCAgYCCgn+BgIF/gIB/gICAfn9/fn18ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYOCg4OCg4OCgoKCg4OCgpKQi4iJh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoeHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOFhIODhIOEhISIko6MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYCAgICAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYaFg4OCgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYKEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+fn6Agnx8f3+CgIKAfnx7ioJ9gH9+gYCAgYKBgoCBgYGAf4uTj4yLjY6NiIeHhYWEhIOCgoGCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6Ck5GMjI2NjoqFhoaFhISFg4OCgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKDhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYuNjo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f319fHx9fn18fX19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6EkoyMi46Ni4qGhIWEhISDg4OCgoKDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+Af36Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIqPjIyLjYuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+AgIGBgH99gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fnt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBg4GFhoWFhoaHhoGEkY6Mi4qLh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fHt+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7e317fX5+f4CAg4eJiYmKiIuJhYiRjouIiYeFhYOCgoOEhIOCgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX5+fX18fX19fX1+fH17fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4uJjJCOjYmIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fn18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImNj42LiIiFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAf4CAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI2MioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoWFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICDgX+AgYOBfn6AgH1+gH59fn6AgH+Bfn+Af35/f398f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8e3x8e3t7fHt8fHx9fImKiIiFhYWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x9iYWGhYWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh1dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fXx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCGgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWDg4OEhIODhIKBgH+Af4CBfn19fn9+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/foB/fn17ent6fHt6goR/g4KCgoKCg4GBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GDgX+Ag4J/f4B/gX+Af3x7e3p8e3yBgH+Cf3+BgIKCgYF/fn+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6Afn5/f39+fX98fn5+gX+Bf39+f4B/gIODg4F/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fH99f4B8f399fYGAgH59fYB/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgYSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/goCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSBhISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5+f4CAgIB/gYKAgH9+f4F+f4CCgoCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf39/fn+AfX19fX+AgIB/f39/fIB/f4GAgYCAf3yAf31+fn9/fX5+gIGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEg4KChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgX97gH6AgH+BgYB/fYB/fn5/f319fX6AgYGAfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh4e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cnmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf4CBgHyAf4B+f4GAf39+gX9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36BhIKCg4WFgoJ+fnx7e3x8eXd8eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXJweHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH9/f31+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYF/goF9foF+foCBf4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+BgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8e3uHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDgH+CgYSDg4SBgYOAgoOBgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9+gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIOBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgH+CgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9f3p5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYKCgIGAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChYaEgoODg4SBhISAg4CBg4KCgoKCgIKAf4GAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7fHp6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB+gYCBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fXyBfnp8fH19fHp7fn5+gH9/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgISFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODhIOEg4CCg4KEg4KCfoOCgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgoKCg4OCg4GCgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx9fX19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KEg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDhISEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5+f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OGgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSAf4GDf35+fH5+fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhIOEhYWDh4aGhISFhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOFgX2BdYF5g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYKBhIOAf319fn1+gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEg4WEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhIWFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHOCg3+Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW14bHB5bHV9f399foGAgX2Af32Af4B/fX18fH19fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gYB/fH99fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYSFhYWEgoaGhoWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f359f4GAfn6BgoCAgoSHhoODhoSFhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJioiGhIaGhYWDhYaFhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhoeHiIaEhoWHhoaFhIWFhIWFhomKh4aEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYSGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWDhoaGhoWEhoeGhISFhoKEhIKEg4OFg4OCfYB/e3t8fnt8fH1/fnx8fn2Af31+gH5+gH99fXyAfX5/fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWFhYOGhoWGhYWGhoWEg4WFgoSHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fH9+fX1+fnx9fH98fn58fYGAfXx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhIaFhoeFhYaGhYSDhIOCg4eDhIGChISDgYCAgHt7fn58fHx9fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoWGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4aGiIWGhYeFhIOEg4ODh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHh4eIhoaEhoWDhIODg4OGgYN+goKDgIOCf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiIqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWEg4WFhoaGhoaFhoaHh4eHhYOGhYKBgoKAg4WCg36BgYF/g4F/fn5/fX98fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWCgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIiIeHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWGhoeGhoWGhoeGhoaEg4SFgoGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiIeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFh4aHhIaGhoWFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15ent7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OEh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIWFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWGgoKDg39+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+gIKCfX5/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBhIWEhIaGh4iHhYWIhomHhYSEhIKFg4SGgoOFhIWGhIeGhYWFhoOEhYSFhoWGhIOEhYWDhYWBgIODf35/gH9/gIN/e4B9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5ent8eXp6e3t7fHp7e3t7fX59fYB9fXx8fYB/fXyGg4aGhoaGg4SDhYKFgYGAf3+AgH5/gIF8fn9/foCAgYKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYWHhoWEhoeFh4WFgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhIODhIOFhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9fYN8fn59fX57fnt7enl6enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIWFhIGDgoOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf31/gnx/f319fHx8e3t6enp6eXt6enp5eXp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRks9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTU09TU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8rKy8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19vb29vb29vb29vb29vb2dfX19fX19fY19bX19bX2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSPjIyMjIyMjIyMjIyMiqC6uLi4uLi4uLi4uLi5sIqKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uzr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWlVWVlZWVlZWVlZWVlJ5p6Ojo6Ojo6Ojo6OjpZVTUlNTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzR0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSlnl9ZWlpaWlpaWlpaWlpXfKikpKSkpKSkpKSkpKaXV1dXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183N0NLS0tLS0tLS0dHR0dDc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqqNoZGVlZWVlZWVlZGRkYYOsqampqampqampqamrnGJhYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc7Ozs7Ozs7Ozc3Nzc3Nzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs/Oz87Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMzMzMvO0tLS0tLS0tLS0tLS0tDNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7Q1NLPz87Q09DO0tTV1NDPz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfX1tfX19fX1tbW1tbW1dbW1tbW1tbW1tbW19fW2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7Pypal0c/SuY++1JyChIrGz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Pz5yqnazVwJSwnLGWuLmvodLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD9BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MuUiJqczqOgi5HDk31+r7DSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQjo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RvciZmbuah5261NLNnp7D0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9KXlKC+mZCfoNLTwKCg0M/Q0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9Ozm8SbvqmvkaG516+iqdTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDRzo2Qoaygmq2bqdijobrU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0cvaqJugmqbFmKLRnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk3OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49PTs7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmOpZqfr56cm5utx5+h0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU0Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2Lirocq7oaannM+mq6SexbSkptbS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT056QjbbWy5KQp9e5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHSusTV0dTLvdXS0cLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tXU0tLS09XT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs5ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUVDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpjbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tba2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZAQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5qbm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZybm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1tcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVVYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKkqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKaioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq6mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Necl9oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+qqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2r7Owq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKirrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19hbWh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLG0tba8vL68vL7Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGwsO5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbWhxeG55amlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsPEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcndzeGZnXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8rGxMPDwcS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamddam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIycjIycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytp6q7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHHwcrKyMbMys3FxsXDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW9zYl1iVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHCw7+/vsTLyMrLyLu6yMfJzcjDyMnJxcXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWdkamVham1ub15ZXFZWTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsK5u8O5uLm7vcHHwcTIxsfJw8XEwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZmNaWlpcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tri0tLW/u73Aub66urTAuLW3sq66vLbH1LnLvsG7v8G8u8S+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5iH1xY2BiYmdqZ2ZpZWldVlZUWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS1sbC1t7W7wbi+ub+8vLe0t6+ut7W308CY1Lu/vLvDtbrHuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVraFhYTktLS1JJTEhDOT04PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v728sq2vrLGwt7y3u73BxLm3t7a1ubm5utK0jLjDwsK+x7e5uK23tbi6tLizu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4d8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSvsLi7sr2+u8S2tbi2uMDAxbvNqISVwsvJxs/CwLiutbW8vri6sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bnhjZ2JbY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz4/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6ujsbm9vrK6vrzFuLG4uLbDub/DxJ+Ei7nKzM7RzMrEtbrAw8i/vrW/wb/Gxr/LxsO/wbzAw8zKx8XGwLm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYGFOSE0/RUA/REM8Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS8wr3NxL27xL+5sZWKjnqIla2XhYyuxsnIzMvNysbCxMvOwry5vbm5wMO/yMbEwcG/xcDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eoh6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE/P0FCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tby2urzGyNvCtb+8sIxqcXFYYmZ4iYqNqMHGwsfLyMHDwcDJysLAu7qwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Bem1zeHNncF1bXlxZUUVEQ01JQUU9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7vL260rLByba0knR5aGJ+aVtaXHCKj6m7wb2+xsC5wLy+xcS9vbmysK64t7/Dx8PEvL2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbmlbX2BZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucHAt9C2psa2jmdSbm5Pc4t/d15ZfpKxube4t8K6s7u3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2VdWlRKPD8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7bJtJaxoWdYVYtwU116goeATWiYtbaysre+ubK1sry5vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnFsXmJgW11PSEE+PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27xrKTnoVYU2ecZlJXV5Kpflhap8O5s7C2urW0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJtY1xmWFxdUk5NQT5JQkFKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqvrbyzuLq3u8+5mJNyUmWOfGZUYm2lvYZjU3aeu7axtLWytK+su7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEJGTkY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6trm7tbWztbnHvqCSZFKLmXJ6eYtygpJ1cHVtosG4s7SzsLGtsLm4try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Oko6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSZnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7KywL6snFZelMSVgZiSZnV1doB+fa+/uLGss6+urK62trK0ta+qpJ6bnJyeqKieoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moqqufpqKbo5yVkIyPj5CTkJeVlpifnp6amKaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HT01MQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpayqp73JtaRWZIWTfml0bGdjZmt1cXCQrrOzqrK0rqqrr7Cys66lnpKYlI+YoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpamxo6WonqCclZOQj5GQmJCWlZiXn5ibmZqjmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUpIR05STkpORzxFQD0yPzc1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpop+0z8CsXXh1eHRkaVlQT1NSV1dgd4apta6vs7WqpqyropyZlI6RlpeZmZygoqKcnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWalpuXl5ihnpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeXlgYlJVYElJSktTVElSUEw5P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpeepZ6eqc3NmW96dnRjU01USFBJUE1MVWRniLWwsLC4rKahnJ2alJeampCOkZWRjI6OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrC0qbGvopmcnZ6hmZubmpiZm5SWm5aZnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVtTWllNUUpOTlRMU0xBNz5CNjg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySnKKbnqTKsGhqa3NiUlNVhXVqU09KSlFWWWOnr62sr6efnqKgl5GTm6CcmZeSk5+coaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuKyytKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCeo6GgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUlVIRlVWSkJMRz1LSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGdnpqZkpmem6GhrJh4bmtgVExYeqqwoGxSSEVHTFFWjauqqqmkn5+ZkpKTmJiWlpWMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8tr2zs7WirKKpqLKpq6inqJqZnpqqp5+Zp6Cfn6eopaSfnaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQldOSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpqcpKCfiG1gVVBRW6Ld4MONcFtLREBEYZawramqpZ+enqGinZ+dmpyclJOVlJ6emJSFnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGw7zDu7ezqbOtqrO0r7Ouqq6jnauntrKsorCmoaOvsa2wpKWvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cWtrdXJwaFdbUUVUSERJT0g+RUE0Rkg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYmp+gmp+flHNiV1NUWW2z3Mawq6yMbVVbgaywpqOjoaCepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvsfGwrfDycnCwca+urS6urS7t7C1sqq6sq67t7+6uqq3rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH15cWtkaG94amRaW0ZLTEVEU0xEQkU3Oj87NTQ5OTc4Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBsrK4p6Ghq6qhnJ6hoZ2bnYlfU1FVWW6HtcWzlJ7YyqyjsKygmZybnp6Zl5eXkoyOl5eTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdLTzdPQ09PMysLFxsbKyM6/yNHMx8XHxcG8w8G+v761vrOtv7/Cw8fEx8SuvriyuLzDwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB4dHNlYmdyb2ZeWllDTkxDRVBJRENANTU1ODpCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwaikqKytqqCdo5+cnZt8U0pPUmeDoraypYmtzLuxrKOenJ+amJaUkpSWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rS19HX0tTW09PIzMfMzcnSzc7TzcXIycrBxsvHyMnGv8Ozs8jEy8rLzsXKv76/vcHHxMzMyMm/w7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnR2aGNndmlkVldRRE1GQElRQj1CPDoyMkA8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaGlcU5FTVV3k8XKrpyjsaminJ2coKSgnZqUlJWUiXx3cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dPU1NPP0cPQ09bY1dbSy8nO0cvGzdHJ0tXW2dXX09bYztLJz9HMztDM0s+/yMfKw8zMzM7PxcbHtr/Kv9HNy8/Fyci/w8PIzszP0M/NysfNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2b2NgZXJiXVJcSUpHQUVIST47QTg9NDU4NTs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpZ+hrHhNSU5ehLfb1bitqpqUl5+bm6Chn5ucmZWJd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M7P1dTU0dHM0M7T19bT1dDP0tPRydPRx9DY19jR2NLX2dXWzM/Pyc3Sy87QwMbCx8XOzdHR0cjLzcDKzMXTzszOyMTJxsbIzMrT09HVz9LM08G5xbGlqLWup5qorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUk0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52mrreoq7fX1NXZ2dHO0L+8zMm2vq6mqqiio7OLW2VtibfXxq+mn5eVl5manaCcmZydk31xZWNjX19hX19hYF9gYF9gZm1wcG5rb3J3d5vMwNLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cbR1MrQ1NXWztLQ2NjY18vIzsTJz8zKzMDJv8fJzc7Py9DNzsvOzsfL0NDKzsrCycbJzMrL0dLM09HRz9DKvci5sK67uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIenVvcG5rYWRucGFXXFpJRkZETVdFO0A9MzM8PTg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcCwqaytqaOzm3iKp87Us5ublZOXm56enpyUlpiViGteXl5hZGJgYGFhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dTLzNDR08rO0dXS1dXKv8nBxczCyMnCzMPFyMrKz8rNzNDN08vGyM/MyMfLxMbBxcrMzc/RxtDOzc3Mz8XHwLi5vcPDvcO5s7K+sbvDxLWqmKWimZaRlZWSi5SNmpGUlI+PlIKJhXlwcmttZ2BgcGhYWGhWTEZMSVBQQjtDPjs2Nzo4OTo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcTCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCta+0qKCro4iNkrjUrJSNjZiVkJSSkZaWlpCLfGVhYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0sjLzs3G0dLPzszUysfLzs/Hx8/Sy9DPxbrEv8bJvcLHyc7FwsjAx83IxMzKy8/IxMTQyMbCxsjEvsDHzMzLzsLLy8jHzNDExce7x8PJyMLPwb28v7DByce5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3b3Rka2BeZnBhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68us3NxtDV1dna29jQyc/P0dPIwra7u62jtZJogIjErpCNjpePhoOEhIJ+hYV/c2BbXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMrJyMrIwcXMxsjLzcnEwsvJwcLL0MTLyL+5wbvGx76/xs/Lw7/Du8nHyLvIxsXKwL3Cy8bFxL7FvLzAw8XMxcW7wMrCxcfSxMDIv8rJxsjG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6Glm6Ogm5R7dnN0ZmlaYW5sWltYUkRMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1w76xr7mCYn6Pto+KkpeHeoCFhoB2eHVycF9bW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKwtrqysrOyscK8vLy6uMHBwcS+vbm9v7nEysXGwr3GwLi7xMm/wsm7t7u6xcO/vMHNw8a9vbXBvcO6vca7wrqzvMXEwcK2v7W1vb+7zMO8tbrIur++y8PBxcLGycbIxtDGwszHssfJw87NwcXDwL2zt7Cyp6ioubClrbCqrayUeXZ3amRnYGhvY1ZeWUpGSkZISkFFQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8XCxMjO0crKysfNzc7RyNDG1dTW183Kz8XJxcfBucW9q6yub2V2j5OLiIqFeYCGhoB+hHx0dGNbXF1eYGBiY2FiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tbe0s7O0urS9sbewta+yu8K8wcS8v7q1s7q+wLjHubS7tsHCvLi9xsHDu7Wusra6v7TEt7u1q7i9vb+9sbq2r7a6s8W8t667v7W3tMW8vsPFwMPFxsjLxcDGxrvHy7/PysfDxsLDt8O9vba5vse/rLW6tbe2jnl0eGZnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzcjFyM3M0MzNyMrIysnKxM/N0s/NxcfBxcC+ubjJtqqvo2VpdYyPhoiJe3h+hoZ3eIJ9dGleXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5oZmpubnJ8pMe/uLi1sKusp56iqqeeq62zramrqbSutrCyqa6mrLK8urbDubq6sau1ubu0wrqwwLG+vLu2u8e5wratqqiwscC2uL2vsKeys7S7vKuttaauta+7srCpubCtu667uLvAv725wr/Hw8XBvMbBx8u4xcfFv8bDw7rExsK7xsnMy7O5wry7s4hzdnZraWFibGhZV1dbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxc/HzcHDxr/ExMPDysHJyr7AvMG6srS1xK+qr5thbH+RiI6Pe3h+ioZ6e4SBd25eXVxdXV9gXl9kY2JjY2JgX11bW1paXVpaWlpcZG5vaGZnaWtucoGtubC1rqalp6eaoKSgmpylq66jp6KrqqyqsKOmn6qttbaxvbmvt6+prre0tLy4tLyvt7m1srvBssCupamiq7Gys6i9qquoq6yttLOmqK2hpK+psqanqK6lqLessbK3urq7sry9v77Ev7XCwMfIt7/AxLfEwr+7v8TCvsTIzMq/vsPAwKmHc3RyamldYW9kV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcu+u8m2vcO+ucq3wcPBtLa8trGvtbyuqKmXZW+Ig4iLgHt+gH54dH98c3dlX11cXF5fYF5fY2NhYmBgX15dXFpYWltbWVhaXF9ma2ZlZ2Vpa29yhaqlrKWgnKKllJ6km5iSoaOqpKKfpaWnpa2gnZukpqyyr7a3p7CrqKq0qrS6sba1rra5sa+6urG2pKCkn6axp6uouaqkp6iop7KtoKemn5ukpqyen6ekoKCxra2ssrSytLC1vLa7wcGyur7DwbK5ucOzwL2/tbi7vb68wsfEwsO+wMSgg3hwa2FmX2tvYFRZXkhOZ09UR0VKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItbW9uLrAur21oJ6VnaGmurars7O7s8TPycvCxri3x8HMv7jJt7vFuLPEt7O/wKy2vLKspa+0raCilGx4hYaGgXx5dXNvbWtqaXFpXmBdXFxcXl9fYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+Inamgl5aboZabopiWjZ6ho6ebn5+jpaKonpuim5+rsKyxtqOpqqmsrKS0ua23sKyzta6yta6wqp+dn6SisqSmqbitoqamn6isqpmfoJ6ZnZ+lmpqjnJudr6mrp6qrrK2wsrivuLm7sLa7u7qrs7O5s720trGxtbS/tr3AvcPBu7u9l4N7c2tfZV5kZFhUV11JV1xLUEdJSUZBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8TDz765x7i3vreywbSxu7usurqxop6pq6eXnZBxf4WGf3hybnBua2JeYmZmXF1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRlZWZmaGlrco2nnZSVlZuYm6KWlpGcoqKonZudpaaippygoJqYrq6trrKgpaKtq6ehtbGysqyor7KnurOmtaCinpujoq2joqm1qqKjpp2mpqOWmJ6XmZqdoJqXnZycm6yhq6ejpKatq7OzqrSwsqqyubSvqa+ysrO3s66prK6yuLC6trm9v7ezsZSFeXVlXmVeW1lWU1pVS1tRS0lFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7KdpaOYpbHCtba9rbS4wszIxsDFtsG/x863wMS9s7m5sr+2sbi6rbK1r5+ao6qhkpmNeX+DhH94b3F0cWhmZGhlY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2opyUlJCVl5egl5mVmKCeoZyWoaKppJ+eqZyamqunr7Cqm6OkuKmgn66otqqmp62wpLewpLegopuZmaqmoJqsuLCioaScop+fk5WhlJWWm5iXlpeclZ+pnamjoZ2jqqqwrai0q6qmrbKwpaqusrGwr66vpqensq6xtK+8tLm3rqOUgXl1ZF5hVllXU1JUS01eTE9LR0dMTEU8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uL2unaeno6q7wL3Aua60uMHMx8XCw73Ft8jMssHCwa28u7W7vLW5ubCwsaqcmaGplZCJjIGAfHdxaWxydHBoaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbYmNiYmNiY2RmaoGWk5WMkpSUm5mdlpacoJyglqGgpqWkpqefnJ+moKqvpp+ipLeooaGiqLSipailsKWwrau0nqCdlZWqoaGUrbGxn6KjnZ6Ym5OLoZSRk5iYkpeXmJedppunoaKZo6Wlq6SlsKelo6urraaorq+uq6iqqbOlpqyvtLGuvLWxr66gknp2cmRhXFpdWE5MUkhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G4rJ6lp623u7zBxbqxubXEycnAw8bGx7bGxLPCv8Wrt7e9tr27u7azra2omZifo4uIc4mIfnZuY2FmaWhmaGpnam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZVUlRSVWBgX2BhX2BhY2RpgZSTiZGPlJOUnZSVl6SZoJecoKWhraakpKOjopyqq6WZn6WxqqCgnaWrnaeinq2sqamtrKGiopWYo5uckKupsJufop+el5mTip6RjZKTlpCYmJOcoaKdpKChlaChpKabo6uloqSqpKuupa2yqaalpqa0pqmorbO1tLm6r6msnotycG9gW1dWVVJHUU9IWltPUklUS1NMRUZJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCrsq2dqKevubmzwMi6tcCvxcjMusHKzMi1ybyxvcTJrLG4wrW8wby0tausppWZm5uHf3KIg3t0aWlqbGdqa21ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXV5eX19iZG2OkISRh5CRj5mTlZOcm6Ocm6CoqauorKeopaOYpK6klJmlr6mfm5mboJ6umZurs6Clpp+io6GVk5uWlpKpqa2anJ+hoJqUkIyZjoyQjJKNlpWQnqGgo5ybo5WboaOhl6Goo6Koq6Crr6Ott6Wjo6Ksraqoq6+yt7K9tbOrr5iEc3NoW1hYUlVRRVhMUVtYTVROUExQUUlOSUI8Pz9BPzw2NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraiztq6pp6+um6morLe2rLzKu7a/rMvGxbjBzs/Is8S6t7vDyLGsuL+3vL67tLenqqCWlpiVhXl0gHZ3bm1obW5tcGdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVTU05QUVlaWlpdXFxeX2Bkfo2Bi3+MkIqSjZeRl5mioJugq6qmrqyor6Oomp+soZWWpKinnZeQj5qerpaYqKqZn52UpaCekpCSkZOVp6qlmpmZnp6VjYyLk4aIjYOQi5GVkaCeoaOXlZ+VmqGinpSbpaWnqKigsbCmsbynn6OstKuup7C1sLm1wLGtsauQfXFyYlZTVk5SSUZWUFJRTExXTUpMTlJHTUpBQ0ZEQz5ANjU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ymsbeqpqKwq52qp6mysaW2xrS5urPKxbm6wcvQy7G2t7y+wcOxsLK4rbS0u7S2paSdnJeWkoF+dmtnbG5xbnFqcGtkZWdlXlpZWllaWlpaWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY2HkIqXiZSUmJuZnqmboKqmpaudp5mgpZuTj5+jm5eXhYSSm6OPlKOdlpaWiKKbm5OLjoqQmqSnnJWVl5yRkYeUjouBi41/kIqSkpKgmp+ilZOYmJWippmMmaSmqKahn7SyqLK3oZyit6yqraSysqW1vLWrq7GjiXhybV1OUVFMT0NNTk5QS0ZOTkpKTk1RSU1KQUdMSEdDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyODc2Ojk5OTk4NDk4OEE3d7anpLaxpaejqaWgqKWks6qissO1tbKzxsa3usPKzMazrLm9tLfAr62psZ6mrrqwsKGbm52Vk4Z6gm1fX2ZycHZxaW5pZWdoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFlYW11hb3N2cYWIgoiAkYSPi5SRlJ6hj5uco6GjmKWWopuVjYeYmoxzjYN+jZeWhpGZkJSOjnuZj5yMgol/ipifop6Qk5iWhY2ClH5+dImOeZCHk4+QnZqZmpGVkJ2OoqOOiZqgoaOjm6K0r6yvrJ+YpbimprGhsa6csLuqqa+qmYJ2cmJVTVJPUE1DU05MUU1CUFFISU5STUhKSkNKTEZLSzw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMTc2NDc4OTo6NjU6ODdBN3i3oaO0qaalqKOmpaamprOnprTBuK+0sMnEt7nBzsW+s6y6wautw62ooqeSnaa3rqWikJaXk499d31lV1ZfZ2ZpZ2huY2poZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVV1lbXWlscm1/hXx0TlhykIOXho2cl4uUkJ+YnZWUlpSOlomAk4lfO1dvfIuUiYCMkYyQhoZzioWWgXmBeoWUnZSDlo6RkIOGfZN4cW+FjX2JgZGNj5eamJOKj4mch5+Yh4iWnpqhoJenr6mtqKiflq2zoqaumayrmKe0oqmto5N+cm1fW05TUlZMRFRKUE1MRk5PSUVMUU1LT0pJTU9GSUk8NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6mno6mwqKe0wbmwtbDHwrezvc+/ua+utcKnqsWpo52Zg5ScsaSdmoiUkIyHfHN1XVFMUlVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbXBpe4J0UEJAf5WRkX2JlI2Eio2bjZaViZKIhZWGeYh/YEpRbniKkYR9hI2KhX9/bn5/lHd1dXeEjZlwUY2IioZ7fniUdmh3hoh+ioiVio2RkpaLhIqIlISajIKEkpqWnpyUpKOoqaWknpuwqqGkpJGmqpahqZyipqiJdWxlXltIUVFSTUlVTVNJTEtPSUhGSk5MTVRLUVBPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7aboqedn6Kvoaeopaeor62qtby2uLezwbu2p7nIuLaoqLW2qrK8pp6Wjn+KlKmXmI1/joSEfXdxblhNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4eBfIWMk4GSmYuPe4aPgHZ/eHNudXB0jY6Ben6Kq4V5emh2e45wcm14gYuNknh6gHuAdnJykndndYSEhIR7lYmIioyLgH+Ei4x/lIN7gZCYlZyVkZ+dqZ6foJ2gqaWfnZiNp6SToJ+Wnp6kgHJoYFxcSlZPUkdKWFJPSkxNUkpKSkxQSExRTFJUTEVIQTw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc5NTY3NTI1MjU3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumKOhmJyftKmvqaWtrLCxqr20sru4trq0sZ+3urKqnZ2sqaiyr6GakY6UgY6cj5SBeIh6fXdwcGlYS0hISEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedYN9eWd3jZeYjY99aHmBdniAiY99hJiSgXKHj3x3e29rfq19c5CLf3uGkoF9f3RmdnyGbG9oc3yJjIiAbHlxfXBtdY9xaXGAfo5wQ4uEgoOFf3d3eouFfYx7dX6Oko+YipKam6OWmZ2anZ6inZaNiqWbj56XjpaYj3ZubWViWldXVFFKU1VUT1BOUFZLTktOT0pRTkhOT0tFQzw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegn5agpq+srquoqbCvsau8uKy7vrmzrKebsKesm4+WnKWppKCXmY+FknqJj4yNeHJ/b3ZxbG5rWEtGR0VBQENESUxMTVFSUFFTVVRUVVZWV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOT1FUWF5lcHJtiKeqwH51eWN8eG98eYiQen2Lhm9tjJJ5dHhqaoCCcZaRi4F+loBJk5huaHd+gmxpY2x5hZCShmtzbHxucnuGaW1wf3ONiYSGen1+e3ZvdHOFgnmBeHB8joyKlIOWl5iakJOVlpmXnpeMg4mfkYuSjYaQln5taG1ubldVV1RSUVlPUlRUU1hVTU5ITkpNTkpDSE5HRT86ODk7OTk6Pjw5PDs6Oj0+Ojg6Ozk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5manqWtsKKsqqi1r66stL+qu8K/pqKZlaSXnY2Ei5ShoZiYkZOLc456gIaNiHZwdm1xbWZsa1lORUZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplf3Btf3qLiXaBiIZ0bJqRdHN8amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3GAfGdxcXtuk42Pe3N9fHFwbnVtgn53eXVqeYmCiImDlpOSkIuNkZSUj5eOgHmIl4iGioaAkId2ampuZ2RXUVpXWVlbTVBVVllYTklIRUpKSEZCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsKzU3NzU0NzhpTzg7NW6SiJqRmZakqK6esp+muq+rsrDCsbvDx5qWjpSZi42FeYSQmJSNkIyPhnGHgnSHjYh7cXNxb3BmcWdfVEZJQz88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7Ogcnx4bH1tcoOBhYF6hIaGeXKglXN4gHN1lIc1cZ2onY6hoYSihXZwhnyHfHOMrY2JgGdmYmpucm1wg3Vpb1h1cI6akndsf3t9bXFtcIB6c3VuY3aDfoaAhZCRiouJkYuRjIuPg3V4i4+AfoOAfo96cXBva19aXF1bWVhgXlJOW1pYV0xISkVKRz9DQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSh5aRnqSnnq+VpbWqrrGuwbK7wcaWj4yUkICIfW6BkJKJg4qHj4V1goRslYiJfHV4eG13bndkaV5JUEc+QDc0NDg7Ozw9PkBCRUhMTExNTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx+hYN/jH52opl5foaBhZmEm5xhhqqfnYuDkI56d4h+iYiNc4qXj4R6XWRxdHp7d4psZ2pieW+Fj4J6boF3dIR6cHN6d2tuaV53h32HfIiHj4CLkpeDjYWNh31xhH+EfHV3e32JdW9yc2VmX1tbXVNbZl5XUVVYW1VHSkpES0c/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XIx4in+UjJKdnZ+mkaCroLGor8CxusW6lo6RlId6hXZrf4yRgn2KhI6MeIOAc6GEi319gX9wgX56aHZrUldMQEUyMTEyNjc2ODg6PD5CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHF8j4x6fYmHfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSRqIeAmJiKnHNtfIGGh32OaGdoeH5uhYeChXGEhUdrgHdxeXZobWtfdn2DiX+IhYx6lZ6biouIkX96dYt2fHdtb3d+f3NycWpaXVxbY2NYZmVbVU9QVllQRExLRk5JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWIkY+Wl5KXoZ2soaa4r7O8s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeJfnOEeF9jVktCNjAuLzIzMTIzNjY4Oj0/P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgYSChZGTfoWJkYGalYKgoZeVm5qlrZOau7Gnu8fDqIqMoaWPlImBkXtyhJ6fkZx/doWFio+IkGpob4OAdY2GhItxhoJ3h4B7doV9bnZ1Z4CUj4aJiIiIh6GroZaJjph/e4GJenpvZ2t4fnh9cWpjXVpaXWlcYWZfWU9LTldSUUlQSkROR0NLRENBRENBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudXBmeIN7gIyAgZCPi5qapJyhrKarr7CXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46DgIGLi4KJjYN/in9scGpdQkE0LS0vLy4vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyNoZ6ZhJOFgo+in5SZkoSKhY+YkZZscHWJi4GWjI2Pdo+EcWyFgYqWkoOFiHKJoZaHk4mPj5altambjZWig4eThH1/a2prfIB/gHJhXGJeWWZqXGtrXldLR09TUU5NTEZJUENETkZCQ0VHQj45OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCCcHWHcXaShn6XlpqUn5+cp6CqlpOYnmdlpJp+hJKReYCSiJCSfYqFmJKRgoCAi42JhZCHhIiFeHh/Z01SPi8uLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVJTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6imopmhl6KVnJ+onqmrn6isqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4SUkoacoZqamaeRkYiVopqad3p+lJeRoZKXl4GUnnt2lZKrs4mNl6B9lJ6cjpOWmaSiprawnZGZqIiXkI6BiGxzc3x+enBnYFtfXmFmY2BnZ1xRRUpLUE9JSkxGRk1DSExGRkNCR0RAOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBwdWBufWF3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYeYjXiCjYqOjHuKho+QjoGDgImLioSShYOGiIGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSU1PUVlthpB3lYujp6q0vbilrqysp6i0rLC3srKtu7GzvpyzxKy7ycu4xL+4paOwsqytq6SLlpiFpqagopeBppmNoqqopIeFk6OhoKqgpKmOnLGLlaOnt7uboKOwk6Odo56RpKKrr62ztaKVpaqImomSipV6e36EfWZfZ1tkYV1jY15mZl5bT0NJSFRPRkhMRkpHRUZIQUtGQ0ZGQTo4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoR2gZSFiIKbg5KQjZLayJ2Wc1aXiI+InI98hoyOiol6iIKHkY6DhYCLhYaHkoaChImGh4eHcW5hQEU2NDwyLzExMC0sKy0xLy00P0RBTVVRUlNVVVdVTltQR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcfDq7PFtqyzwLO5vra/tMG2u7ukuMaptsnHtr65tKijtK2xsZyakpqfiaevqqSVdp+kl6GrsbOYlqqtqK61u7K6rK+1orGssbW8t7WutaCnqKOom6mwrbK6uLinm7epjaWOkZOgh3mBgnRYYGNVZWFgYl9gZV9aVUpERUxVUUhKSkRJR0VBQEBLREFNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFtaUWNkV3p1cYKUfYWGk3aFfoCNe7+7o7yCtJSTjZuPhIiPkomJeYaAjJOMh4WBjn+BiY6Gf4aIhYqHkXp4bl1WQEVNPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcV1BfVUlLSkFAP0dLRkVEOz5AN0Q3P0JKSkVHV1RQXo+lraOxtMO2uMHMyba7xL2zs8C3uMK1v7C4dLK0prrFpLDGubGzsbSopLW2qrGgopabopKlsa2lraynpJigrLO6oqmyurW7vsy/xcW9vbPCt7q4v7e6t7msrbCmsaqtvrC9u8LCrJm6qJSuj5iYqol+gXtqVmFgV2lkaGRWWmNZVlRJR0dMUUdDSElBSEQ+P0JCS0BATEM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlFMQUxSV1RZVVp3anB/j4SBjoVuenJ5iGK4oZmjiZWTlpOTk42Ql5KHh3uGgY2VioCEgIl6fIuHhnyKgoGKg5V9d3l1ZU9cZEdFTDpRZGFbXlNGPjtIUERaZFFRWVhZZ1pUYGBNU09FQT9JSkhFRkFAQz1FNkI+SEdLTFNaVF2Tr7i1urnJwLu9ycy7vcC7t7W8u7e+tbqyxmB1s6Wxmp6rvaqlqKuqo6KytaGrp56Vlp6Yn66lp6elnqSUoqews6eysry2wb3TycrTxsLFzMLKw8C+vb+7vLe0sLm3t8O6xr3DybCeuaqirI+lqLeJgX5xXmFgXFZhXmdlUlhhVlJVSUVFTktBPkdEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUU1FQT1FSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdaGxscZCNhZBzbHNyc4jVwLWZoI2VmJmRjpeRlpaOhod9hoOMlot/g3+CeHqLg4d7i3mBioKXf3R9emtlcHVZXVxQZWViYGVkXVtYV1xNZG1VUm1tXm9fWGdlVVlUSkRBS0tIRkhISEhCSTlEP0hLVFRWXFpbkrnAub23xsC7ucrLura6tri5s7i1tK62tplkdaierXBeoqycmKGim6Seq6WUn5+QlI+WmJeon6WfnpqZg6SdrKSqsK23sL251NDP18/JzNLMz87Kx7+/wsq9wb3CwMXExcq/yM+0pLuwtbCbrLm9mn54a1xfW1hdYFliYlFbYFNRS0NCRUZFPEBFPkJIQkBDPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MS8wMDY6NDc3QElPSjstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpX3CXkpGUbmxvdXWIs6yhoZ+LmZyZjIyVkZuShYqKfoiHjJCLiXyBhHN7iYOGfIl0goqGlX9ze3hsbXV7aHJlaWxpZmppaGBmaWhtWm10l62kvIiHZ1tvaF1aWVRISk5QSktRTFRRSUxBSkdLUF9fYmZpYZi3x7C5s7u+trLEx7awubGwu6yzsaeqt6yNtqeem6eaTpudjI6glpGmmKWVipOTiZCJj5CSnpuhmJuUloeemaabrK+or6eztNTU1NbRy8/T1c7Tz8zFwsrQv8rJy8nSyM3NwtDSuLDEvMS6pra7xKKBbWJbW11XX1dZZVlQXFdOUUNCSEVCSDtBRD5BSD8/Qjc7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ4PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZVdzkJCYg2hxb3l5g6CqnqaXjZubl4uNlZGajn2Ji4WOioqLkIh8hIJwf4eBhnuHcoOSi499cXh1bHF4fnF7bXhzbGiAcG1jaW1weWl3fX7Lv8Lfp21jeG5jW2FgSlBSVU5ZXlBdXU5RTlRRVVRcbm53gnKWrristKewtqutvcCxq7WmpbinrK6hrLSjjrGumpiYjJGUkYSOm4GNppGciYOLhIqJhIuDlJWYl5SbkJyXmZmenquspKehrKzO0tXRzczS09TQ1NHOyMPU0cjO0tPT183S0cXS1sbAzsfIw6m/uNCdeG1kXGFcVV5RXVpOT1NQTkg+QUZCQkU8QEI/RUU+Pz86PT09PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT41OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYaFindtd3B9foChnp6hi42Zk5OMi5OPloR5hZCQjYuKiJGHf4J7cn6Agod6hXWFk5GJf292c2xzfHx2fHOBd3FqgHJyaW9xenlye77Lmn6MsYN2coR2aGFqXUNaWltWZmRYZWtUWF1cYGNdY3h7f4uBmaqkpKGgoammqrG5qqa0o6KtoqOtoqexn4mmmpSSkYqSjoiCk4lrlaKNmISBhX6Rg4OTlqyLlY2VmY6FkpCdl6ewoaCgpKSoyM3Px8HL0NPR1NPO083G1tPN1NjW1tjV19XJ1NrNydfW0cqtxMPLiXFuYl9fV1JYUltPSkdJSUpAOzo7RUJEPEJEPkhCP0JCOzs5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNTs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX1oc3lygomBnZWdlIWLlomPioiOh49/d4SUmYuNiIiLiX6DeHN7fYOHd4B7h5GXgYNud3BtdX92eH1zhXx5bId2dG99doR1eXudtYw8QYrGpX6NfGllVklDZWNmY2hqZG95W19maGtuaW6Ag4mRi52foJ2Ql5ifo6OmsqSks6CipZ6hqaCisZyGnpKSkpCLjouGg4+EfpybjI2ChIV6lH6CqZWjjJKKl5KLfZeKmpGrs5iam6ecp73Dxri2xs3S0NLQy9LLydTP0dXa19fY1NnYzdjbzsna2tLWv8zMtHZ1bWNcWVJVUFlVRUZKSUVFPTo3OUBBQzpHRUBFQ0FEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUVk9RSkFKRj8xKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYXFxc4aNfJeRnYt+h5KCiYaFioKHfHiFlpeIj4OHhod6hHlxenuEhnV6hY6NnXqMcHxvcHp/cXyBcYOHgG6OenV3fXyCdX98h4iwdFipwraMkoFwbmI9XmhycHFwbnh3gmVpb3J1eHJ7i4eOlJKblqCWh4yTm6Cbn6qfoa2copqZn6Wen6yZi5qMkZKNhX2Ih4OFi46gmZOIg4d+bZl5hJiGiJOMjpSMhXubiJOPrqqUlZeemKautbyorb3Gy8jJy8vPyMTSytTW2NfY19Tb19PZ29bP29rR1sjVzJV4emhnWllPUlNdSEJFSUk+QT49Nzo9Pzs+SD1AQUFBREE+Pjo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJma3aAiHGRkJuAeYCOfoOCgoV/hHx8hJeOh4t+hoeAd4J5bnt7hoF0epKejaF2j3WCdHWBfXSAhG+BkIFvkoR0fIGFenaGe4m3xqTCybeBlZuPeHBlTmVjgnqBd4aikIt5eXd7g398hHZtlJaUlY+XkIOJj5aal5emnJigl5+TkpejnZmrlpGRi42Sg4yFiIiBhZCRnpyZiYWLgYWXe4iIn5eQiY2Ki4J8oYiQi7yhmJOXmZyopqWunqe1vsDAucfJzc7FzcrR1tXU2dXX29TX2drb19va2djO28aFeXhlaGNfUlZWVU1LRE1DOz09PDk6PD45PkE2Pj9APD8+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0hQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6inx+gH+AfYV6foKRiYSFeoWIe3V9dG58fYZ+dH+SnZGfg5J8hn14jn15iopugpqAdJiFfoGJhXx+kHqPqY+Qw6C7jJyjnH2JhH2JcoyKfnOmmpyZlIV7j5CJhGhHcaGknYyLkJKFiIuRk5WPnZqTlZGXjYyVn52UoZSSjo6Qi36Qj46LhIiSlpqfn4mMlJGdkIKLf6aZiIWOgoaEgKSGiou4mJ2RlJahp6Cdnp2jrra6tau/xcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19y3d3d2aWlkVl9aU09OSERMQj09Pjk5Ojo5OTw9NkA+Pjw9OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYCOinFyeIp7e399f3yIenx7i4eCfnWDhnlzenNtgX6EfXeGm6CanpSSgIuHf5iHgJySboeohXqgi3yQjoOIhJx+mpGKjaOin5Cjrp+LkYuFi4GShldyrYufrJyPg5ibj5COW4OikYKMn5OVjIaIjJKTjJSVlJCMj4qIlpudj5WWkYuSlIaAi4mSjYqKnZaZo6KGk52VoIuKiI6ckIOIj4CDh4WkhYuQs5ickpSXoaGemZKbnaexuKylvMHHzcfGz8zPzM/Xz9HUrtbV2NrZ2trX1tnZnm57c2ZlW1xXUlZXQ0BJRD4/Pjo0ODo7Nzo7OjM7Oz89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bGJ+koNubXeLeHl+eoF9hnx7doaEgHNwhYJ7dnZ1dISDhX1+kqajnqWilomdkJSWi4qol3KKso2DppGEmZOEmYyilqCZk4manaGSqK+fkZSQjo6IlYtujbeEmsTIsp2ipZucmJaRspBjpM3IlY6Gh4mQko2Nk5SKhYqKhpaam4+QlJOHlZiEgI+LmYiNkKqXl6SjiJmelpuJj4eXl4uFj4yBf4aPpIiNk6iZl5OWmKGYn5mTnZuisrSlo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoFxfmdiXV1cTklUWUFCR0Q7QT04Mzc7PDo4PTY0OTo8OjgyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ2gY99fG1+iHh6fnqCgoN+dnaAgnxsbot/enx4eHyEh4p+iqOzp6Oqs6GWp5+lo5aVrqGDkLiVkrKZjKGhjKSbr6OknZiQp5anmayvpJeUlpWQi5iZlqDAjqPJuaubo6atmJGbnbKdhYWoopyYhYmJjpWMi5OPiIGGh4mTmJWMi5SThpSYhoSRkJx0kZiylpekoYicmpOQipGKl5uJipaOhn2MmJ6JkJCcmpmTmJeflKCdlZ6boLGuoqS3vrTFx8S9w8O/xs3KydKmzs3T0tDW2NPQ2LpxeHVcX1RfVU9ISk5EQkNFNT46Nzc6Pzs8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER05bXFlKZmA7SISLentuhYZ6fIR4gYWBfnB4fH59b3KNen2BfHiGi4mGhJKnu6yosr2vpK2ys6ijorCsipq1naK4pJWtpJeprbempKOfmamXqaOvsKmZmJyUlZGXoJiau7uuyqFqtrirsJSYnqOrk5e9o16qsoKJio2Uh5F8jo59g4aOkJSUiIeTloyQlY2LjJeYkpyZtJeWq52LnJSSjpGSjJmbipGekIuJlZ+hjZSNmJmckpuYnpShoJScnKWvqKGks7irwsjEtbq9u8XHx8LRoMbJzc3E19bRy9Shb3lnW1lTXlBORUM+PENBQTg/ODc1P0Y8PDU8MzUzNTU0NTRCMzk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEdiYGJwSkCLin+Bc4aHfYKIdYOKgn9tfX18f3B3h3eNgYd7jY+MhoyZqsLAr73Gu7OzwLyzrKuztounsq2tvaqbu6Sorbm4q6amoaKjo6ivsrGqnZykmJuXl56ipqWSpLquqcC8ra2yuaakqH6IhpytvbCCjIyLkIOPg5GPeoGHkI2NnIiHj5eNi5WXlJGal52omrGakaycjpqPko6VkJCWl46RoJGJlJujrJSWj5ScnZOgnZuYoKGUmp6npqSipLCzp8HGw6+wurbFxMK/zabHxMfDvNXRzcTKh3JyYFpZXlpMSkJLQEZHPkE/Qjs6ND5BPD01PTY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdFP0NGXGVHYGlnWl1ck4yMiHuHi4aDjHWGkYqBb357gX9xfoF6lXqSlJSYkJOVp7PGyb/CzMHDuce8uq+rubqXsra6ssCupcCkq6+7vKqtq6OjnqeqrrSwqpugqpuhm5WfsLSni6O6urbBvKyonLKlpKiUhY6pxMSkgouPh4iEhpWUjXqDjZGPkaGMjJSRjomXn5iTmZWYpqCunYyqnI6Wj5KRlZWOkJWRj6GUhpefoLKelJqUn6GYpJ+aoJuglJiepaOmpqSvrqW/xMKuqLe1ycO+ts+yxL/EvLPRycjCtXN3a1tXW2lRTEhDTEpLSkFBPUNEPDVBRDs6Mz04QjMzMjI2MkEwNUlFTT5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmZaTmVcZlRjapmNl4qMiJKQhol5hpSQgXKAe41/eIeCgZB6jaGWqJqamLq9x8jJwdLJysLMvMGyrbu+p7q/vrzEt6zBqayzu76qsKmkpaOrrbOttrWgn66epaKYo7O9qZuovcGjt7ewq5OxrKusl4eaqaelkYKMk6WViYF2ipF6hY2SkJ6fk4+Ui4+NlKOZl5yVlaOeqZ+RpZqMj4+PlZaIfI+VkpKjmpWgopy1pZCel6SjoqWenaaYnpWXm6SjqKeisqyovMDDr6Wyt8zAua/Es7u+writwsPCwJhseGBXVlpaSktNSkZEREhCQkFETDo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Ol46ekomKf4mgk4R4hX+Vf3+QiIqQgJahma6mo5jCvsfDx8XTzc7Ny7vBt7C5vLO8y7zDwbW2u62zv7m8rq+ooKintq2tqbK3mp6soqehnau3uKmksL/Esb65s6eqtbOtrpeWpayooJGOkrHFp5WOfZGUfYiRmZCqmZiTk4+SlZOlnZOdmZSho6KcmJ+Yi4yPj56IWpCWl5KWpJllmKOesqSWoZasrKqnm56ml5iWmJWgo6iln7arqbm7w7Sls7XLwLiqtqyyuriuqLe6vbiCa21ZVlRUTUVKU05LP0FIRURIR0c5NUZNOz43PUBKLjMyMDI1QjU1UFZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz1AQkZCcUZpSVJlYkxGpZSclqGXqZaNkYOHppOIgoeCnIODlZCQk46aop+vvq6hxrzFxMbGzs7O0sq+u7axuru7vs+2xL24uLeysbWzuLOrppyrq7mqqKevr5ejrqSnpKS1wLCrrLS/w7rAurOnubW4s6+Wpa2urqWLk5WhjXTBmn2WmYWPlpqMsZWbmpWSk5mZpaOVn5uWmqmdnKGgmYqMj5adYEqWnJqVmqWWVJawn66cn6SUr66rpZqgpZSTmJiOnJ+mopm0qaqzvLu7qrCyx7+5pqyrrbGxo6GxsrSkb2xlW1lOT0tFT1BQUTtHSkhHSUNDPjpLVT9BOj1FTTA3NTQ0OkIzNE5XTzxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqXmaCiqK+ZkZeHi6eWjomShZ+HhJ2Xjp2hmqOktci0qca6wsPHysjHzM3Gvruzrrm4wMHMtce6wbi1urCvr7O0pqObqrS0qammrayapK2lpKisur+oq7a3vsG/vrmzssSyub2so661rLmmiJuYppt2v5+EmZ2Ok5mai6+XoZyblpWbn6Gpn6egmZqqmaGnnpiQjZGdg252kqKalZ2inpCusqKqlKiql6qto6OfpaiSkpmciJScop6Xsaepq7q2vbOyrb65t6Cjp6ilp5ybrKmpjGJkX15RSkxGSE5JVUw9TUROSktCQ0Q8UVU9QUFCRE8xOD03Nz9CNzVVWE4/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLlJgTVVIf2VeSEWrlZyhn7qvmZSfi5Orm5GSk4mrjYein4yjrZSjo7bGvbTBusLBxsjFws3Iwb25sq+4tMDCyrXFscG8tLqqqK2ssKKjmKq0u6Wopquqnaivp6Oqqr68p628tLi9x7y3tbfBsb7AtKm1t6u/pY+imJGioLyfiZqgmZeeno+3n6mcpaKbnKGaqKWzoZudpZyoqp6ZlY+Um4qWiYykopSdop6gtK+lpJOvq5mrqp2dpKOokZWVn4OPnp6blamkoaG0tLq1rai1srOenKKlmpeVmKqhnnZeW19dSkhFRk1RSU1FRkdCUkxKQkVHQFZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUM/NT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTpnXEZDQ5xwYkdFp5ekn57DrZuXpZiZqZyWmpqPqpaVp6aVra2Zoau2xMK7vrfAwsDHxL7Nxru9ubKvuLO/wsi1v6+7tri2pqSqq62goJqrqsSipKirpp6rr6yhqKi/t6atvrG4tse2tbm4v7K/wbe0s7SvvqOXo5aUnJSuoJGioqWjo5+QvaSpnairnZ2gm6afvaKYo56iqauhnZaNlZ6TnoePhI2TnqSgnbWspZuVsaeZrqaemamdn42YlJ6DjaCam5OlpJqYq7G1saqlqq2snJigoJKOkJaonpRnYlhgXU5IR0pOS0hFRElBPlBIQDxHSUhbUk9LPUhPVTRCRjk+SEc1Q2FbS0NOUlVXVlFYVFJVSEA4UVFQTTpHQDRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E6blJGPEt4ZWJWTKKao5yexayhn6yena6gk6OflqWfpqmrl7axo6qztcTEvb+2v8K7yMK+ysi2uLW1sLOzt8HGtr6wuLS4tZ+mrKqrnZ2epaTBpJ+prZ+kqayvoqanvbWlsby5t7bDsrO3ub+yxMC4uK6ztbWjnaWVkpShrqCZop2pqKujmsKtqZ6srZubnpmmob2hnaSYq6uspqGZjZqfkp6Jjld/lp+moaC4qqaTmLWjn7Ggn5qulp6OmJSdgY6fl5WOoqSVkKausqupoaKlpZWVnZiLj5GTpJ6JYGRZY2BLSEpKTkVFQUZKPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JIRTY9dWVcS06en6GZnsOopaK0opyyqJOrpKCjn62prJ27sKistbHIxcHCs8LDvMbDvMTKvK+wtq2wtK+/xLS5sbC5tKyZqLCpqZqdpaGnwqybrLCcqaOtsKmkp722pre7va+3w62zssLAssezurestLauqqKmlpWVpKyin5+aqKuwr6+7sqagqaiZmZiToqS4oKGkk6+vrKWnnpKhnpSej5CNlZ2aop6ns6amjJizm6Oump2brZCek5WTmX+RoZaPjZ+hk4umrLClpqGcoJ6SkpqThYuSjZyef2BlWmdlSklMSlJCQ0BJRzs7Rz85OU9NVV5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0n6OfnKDDqKSqsqGjtKqVs6ynoqSyrK6pu7KssLS0xsDEw7W/xL3JxLXAyMG0q7Wor7isv8Ozt66strmlmauxq6qXn6aXrbu0m6ewm62frbSyp6q5sqi6s7eyucCqt7HDvbTGp76vrbe1qairoZeXkqaloqKYmKWvuK6ytbagn6ikmZWVk6Sgt6KkpZavsbKnqqahnpuampaXqJ+fmKGer7KipoyXrpikqpeZnqSQmo2Tl5mElZ6UjI+cnpSLqamqoaegmZ6VjI6ZkIGFlYmUn3hjaFxqak1QTU5UPUNBTkM6Okk/NzdST11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlwaFZDV0aMeWZDO6SjnaGmv6aor6+hqbSrnbmwq6OqtLaxsLm3sLe4uMS9w8e9vMTBxsC4wMbAuqm2pKy7rMDCt7eprLG6opWtsK2ylqWnkaq5qaCmsJ2qoK+0s6qptratu6yzs7q3rLiww7q+v6bDq7C3rqmrq6eemJmroqKgkZihsa+zq7C5mpypoJmWkpemobeppaOisLG0q7Koq5+boKCbnaWcoZedo7Owmp+Pk6Wan6ialKKdlJeJk5eSlZack4iQm5mUjqiopp+jm5ebk4eOmYt9jJaFj5tqaGxgbG5XUFFaVEFDRVRAOztIQTc6WFBkXlBWV0RZXl1NTFJOXktKPlpjXk5IUE5bVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPSonKz1ccD0+MS4wZFpkQDE2NDdnWWBGKD84bH1oW1Y7iXtjQz2nn5yiqb2hq7Cro7G4qqW1s6ygrbW8rrO4vLq9trbAwr/IxLnEwb+/uMS9wLevtqert7G7vr+0qK6xtp6Xq62orZenqI6nu5+krLOeq6KwsLOrqbW0tb2tr7G1rLC0scG6xbervK+xuKytqqOxpp6kqZ+kl5CZn7Oqs6qqs5qdp5ualY6gpqS0rqehrK2usaezrbGqpJyfqKOelaGZm6i1qZeZkZKemZ2fnZCqnZaXhJSXipyYm5OKjZaXmpempaKgnZaVl5OAj5SFe46Sg4yWZWxyZ29xXkZZZlZEQ01YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYVUxNTA9YFZeOClDM1lUXGdLNox6ZkxApJqgpKy2pK2ppa6utqqvtbqnprC3xbextr7BwrS0usW+zMW5wsC5vrnDt8C5srSrqbq2urm9tKmtsLWYmKerqqubq6uOq72dq66xo6ugsK2zrq22srm3qq6usqi1r7O7vcqyqra1sbSvrqehs6CbqK2gpZWVmpqyo62gpq+XoaSampKOoqWnsqmhprKsqralrrG1r6SZna2nmpifmZmrt6KXk5COl5yhl5aTq56akn+Sl4ydnJmVkImUkp6ZpaKhoJiWkZOVeouPhXuMioOLkmpteG11e2FFYGpZSUhZWj17SkZENkFiVGlbTVxgSltdWlJTUmJhTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ19RXC4qQi9KR1BbSDNjWVRLRJmXoLGosaqtpqSvrrWpt7S5pKyzt8q6tLq6v760s7fDwMzIvMO8tr2/v7e/vLG9rae6uLe2wbaqrLG3lJemrquno7CqlK+7pKyxsqeoo7G0sLGwtbG4sqmuq7Knt6+1tMPFtqm1tqywramoo7agoKexoKSUm5mVsZ6nnKCqjqmjnpuWmKalpbenorG0rKeyp62wtqykmaCsqJucnZuUqbiclI6OipicopePl6WfnZSCkZWPnJuXlZSHlo+Xmqeco6CSlpCQlXaEkId7hYGEjIttcHd0e35cS2VsXEtOY1w+YntHSThHZ1dmXE1eYk1YWVdUWFRpXU9PSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0diTFYlLUIuPUVMUTwzcmtKQ0OQmaWupa2uq6eksLKzqrext6CrtbnJuK7Au8O3srG1wsLOxcDBvbS8v7+6vryyxKepuLC2tr+8rqqzspygp7CtpqWvpZ2ytayrsbGtqai0uqy0srWstKyqrKisqbitsbDHv7ilurCpra2lqK2wpqSkr6OpnJ6cm6+Zo6Oio5GsnqOgoKKqpaa5pay1taSqq6isr7auo52jqKqboJqakqSzmY6JjYeQoqCUjZOcn5ORhI2Skp2amJSTh5eSlZmnm5+ejJKRjpB2fo2FfXx8h4mIcHNxfXx9XFNkbl5OWWZcRkSWW0c7Tm1YYltMX2JOVldWV1RYZ15RUkxjWltUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZUhKKzpJPzNCSVMsPo9rPEdIj5yqq6KpsaSppbO0srS1srKhq629zLquwLvHsbSstMLC0cXGvsCyvcDCvL+3u8SnrLess7i7v6+qsa2go6etqqiksKOqsaqvrLCvsK+rs7umtrGyqbKpq6alo626rKqxwrm1rLqoqKitqqixpamkoq6qqKKfnKOslaWemJ6ZrJ2ip6mirKajray4sbKgqaKgq6+xrJ2fp6epmaOYmY+gp5iGhI6Ki56fjouMlZuOjYWGj5SfnJWXlIaWk5OXpJucnIuSkI2Jfn6HhXx3foeFhnRycYh1a19ZYG5jUXNxXEs7hHxGPld0WGBaTmNcTlVWVVdRXGJeU09OaFhXV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyozNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSmdERjg8QjA1RUtYMUCUWj5MRZWYraihqrOcqqqwta24ta6rpaqqvcm8sb23wq+xrLPEw87Ow76/s8DCw7rAs8jDq663rbK4v76yra2rpKepsKmnqLGmtK6qsK6tsbC0rbS7pLizrKyup6ugop6vt6qqrbq2pba1o6qnrKuqraGopqaxsqSmpqGhrJaqoZWaoKaepKKqpa2in6ext62uo6Wim6qrramcoaWkpJigmpWPmJyTgYKPiIWcn4uKjYuYjY+KgouXo5qRkJqLk5KRk6KZm5mKjouKfIaAgYN6dICEgX1zdoujh3hqXmBuZldlh2NOP2eTTEVieVdiWFJlVE1WVVVUT1xdYVVLTWlXVVdJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqNDk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEMrOkpPXjREhj5IRkSXkrClo6qxmKuqrbartrGrpayqqbzAwLi4s7u1pbKwxMnL0b/Bu7i/v8G5wbnAxK2xtbGzur+9srCuraurqLaqpq2vqrmvqLGxr7Kttqq3t6a0t6uspKmqnKOes7OoqKS0tKC2raCqqKuoq6egq6uoubapqqqqoqmgrJySqaGdoKSjpqOqnpynta6opqqio5ilpqeqnKKko5+ZmJ+Qjo+YjX6HjIaEnp2Gg4qJjY2PjIKFlKKZjYyZkJGRj5KflpiWi4qDf3SGgX9/eXSDf3p3foCHnY9vcWdncHhcYHOIa09emVZIbXhVZFZSYk9NVVRVUE9YW2JVSFBpVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD9DLD5MVF8vSmo2T0Q7lo6woaarrpqspa2vs7Wvq6Wwqqm6vrzAsK64raG2r8nHyNDAvry6vMK9usPAvr+usbKxtby6wbGxsquzqKS1qaWts7O5sKOttrGws7qrua+prbasqp6prJ+ioLWtp6Gfr7KitKqeqKeqo6qhoqytqL2vrK6toqiooKyZkLChmKKgp6eeqJuZqrCpo5+toqGToqKjp5iaqaWYl5mdjoqHlId9jYaEhKSWhIGCioaNjJCDg5OgloeQnJCTkI2RnJSXjoqGhXh0gX98dXh5gHp0c3lof4ajdWleZWuBdGeIi31TWHBeSnhzU2RTUV5NTVJZZk5MVllkWEZTaVJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS02KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMZzozOF89YWQ/RjFDUFtbKkhNOVVBNJGPsqCkpqykp6Ssp7SysaqksaiquL7BvK+nuaqmrrDJx8jRw7y/vri+v7zJu8C4sK+0sbq7t8Cys7usuKyitKenrLK2ubOnqLy1rra9sL2mrKy1q62cqa+jn6SrqqecnqqypLOomqqnqaOpnaOpp6m9q7Svrp2ppKCunJuzo5WknKWln6SbmqmrpZ6bqqGbkpuhpJ2Yl6mokpiak5CKgo+Ffo6Cf4iej4V+fYuGkI2PhH+SmpOFk6GMlJKLkZqRlYaJfoBye3l9fGh3fHp0cHB8Z4R4hIhkYWdjcYV6bWZ4XV5WQld6bVRhUFJYS0tOcXVdSFpbZ1lFVWZQRD5KTkRDQTlIR0tTP2piSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZjQUo3R1NgVSo9OkRXPiqPlLGZn6CppaWhq6W3srKmqbGnrLjBvbWwo7mtqKixw8nJzcG2vb+1t7+5yLbDtbOxtbG9t7m9ta25tb6tobOnqquwtbi0q5+9vKmzwLO7oK+ztamrnq2wo5ykqKqjnpyksKawoJ+rqaeiqpukqKCtu6eusK6gq6Okrp6eraaXn5uho5yfnJqjqqOamqSklpaUn6GWm5emq4uekZCRi4KKgH+OgHualY2Ie36LhY6Ni4qDkZeQhpSjiZKSh5CZj5OAiHx5bH12eHhje3txcHByd2d/c2qDZ2RnYG1zjm1haXBgcEFceGxVXk9RUUpKTVRZV01dXmxXRFhgT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNS4uPS0qSz4qHTQ5JicuMzQuMCsvMyYsOiQ0MUJoWTEzUz1lX0RMNktWZE8pOzJPWD0jk5msmZ+Yp6Sjn6ikuK+uo6+wqqu4wrqzrZ+4r6uotLrIy8i/t8K+r7S9t8S2w7GuubGzwLS6vbepubi9q6S0qKmqsK65saqbu72ksMC1taGutrWmpqexs6CepKanoaWZnqyoqZ6gqq6noKaYo6ifsLifo7GuoKuhrKScpqepmpqbn6OVnZ2anqmml5ugqJKYk5iek5mWoamQmYmOj4Z9h36Cjn18oY2MiHiCi4SJi4uFh5KZjomVnoiRlYKLl4yRfIV7c3B9cXN0YHl4aW5wcG5ofXFjemxpZWNfZYV/X1pza3JMTH5oWFpNUExKSFBSUElOXF9uU0RXWlJnT0hMRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTYqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj4vWFc1KJedppmdlq2goKGkobersaSztKqoucS1s66ft6yurbC1xsjAt7/BubC0vLe/u76vq72vtL+wvMK4qbu6t6eotaioq7Css7Cnmr63pa28trCesLewqKWnr7GboKSgpKShlpuvpqGeoqevoaCik6Skorevoaaxqp6so6+YnKqlqZ6Ymp6lk5udmp2mqpqcnKWWlZeUnI6Tl6OooZCIi4+FeoR+hIp6jpeKjYZ4gYaDiIuNhY2Tl4yOlpiKj5Z+hpeLj3mAenByd29vdF95d2RsbGtpaIJtZXJqa2RoW2Jzf19abHZpWkh9XVtYT09KSEhSVUYyOl9ebFBDV1ZZZU1ISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRHQWZbSFRDVF1oRS47MV9TLDKWo6GXlZypnaWho6G3qq+gurmmrL3Es7CvorSvrK6vtMTEvLO/urews7m4uri6rq2/s7S4r7/BuKy9urSmorOrqKmzq66xo5zBtqaptrWqnrK7qaamqLCsmaKnnKSmlJihsqWZnqSpqZyioJOln6S5qKSnraaepaGok5+poaGgmZudoJKbnJegoqubm5mhlZKUlpqNk5Ojp6SPiIqOhXmEfISFfJyNiYqGeICDh4eHkYWVkpKMkJWUjY6Ue4OXjop3fntsdHJsbHNheHVoZ2lnZW6EZ2hoZGZoal9nYmlmWmV6Y2FSc1RbW1NMSUdJT1NAIStqXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBLPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTcsMTE5NSwmLjUtODA1NzZgdEIzQ0RnW0tXR1VgaEIzNzhiTicynqSjko6kppyenp6ktaynqrq3qKzDwLewrKK0raevr7fAwL2xwbexrrG2tri3tayqvLOvsrG9wLeuu7uxpZ+2rKaltKmrrqCgw6upprCzq6y0up2oqqqxppidqp6npJGZpq2imZ2kqqGbop2XoJyntqWvqq6goZ2doZWgpp+hoJmbmpySmp6Vpp6to5iXnpWUjZSXjI+YmqefkYiKiod4hXeCgoKch4uCiXt+hIeGhJCElZWPj4+RkZGNknuDlY2Gc359Znhva2psZ3Vza2JnZGN0f2JkZWZlaWpjaHBZXlhdbGRhTWhXWmBWSUdIS01SWD85YGxpR0JVU1xbSEhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QT0tNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNAZEclNZukoJGMrqCZmKCWpbSxorG+t6Gxxru5sLGitqurrqm4vby7rcCyr66ttq+zuLOnq7mwrq60tru2r7i9rKaetaugobClq6+fpcOhs6Wvsa+3rbWdra+srqOZnKeqpZ+Vm6iln5mko6mcmp+clJudrLCluaetoqGamp6ZnqOapZ2WnpiblJqhkqiVrKmblJyckoyVmY6UlJiopo2NiomOe4J0goGKmIWHfImIhISJjIiShJSckpKPkJGWjpB/gI2Ngm+Bf2Z5bWhramdxcmtcaGRicn9gZGdqbWxnamhmbFxsbXVxYVRiaGNlWUlGTE1PWFFQVWFlgVRAVlNZVEZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OjYjMyopNi41NTQ2NVp8XTE5S2pbTVtLWGRkQEExSWRCJzSTopuPjrGdm5Ohmqmyr5+4wLagtMG7vbmxpbavqa6lt7m3uKy7r62qq7eqtLitpbO1sa6psba2sbK1uqepn7apnp+qoqqtnKrBma6lr7C2taysnrGtr6qjm5yjrKiclZynpJ2aqaOllZqgnZGbo6uqqbqfpqSgmJqanqGPa6KVmJxxgpacpIB2kauonpaWoJGJl5mAl4ufj3iFk4yDbWl+d4NwbIaKhn2EioZvXWRgZ4SXhmuLkJSSdXeLhH6Dj39mh4BodWlmV1xpdG5OUGpkZnGCZl5kZm5saV5dX4mQhYdoT0tEOEVUZ15KR1BQVVVLR1Ngb3RlRVtRVVBGR0ZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNk9rW05cS1tmYj5HMU9iPCsvjaSZh5Wxm5yToJuqraujvcWvqbfCuL29rae2sKarpLe0srOxua2qp6y0prC1o6e3trWop6y2s660rbOiqZ+0q56ipZynqJquvZWnpq+zt62tpKiuqqumoZ6coKinnJehpqacm6ennZKeoJmQnqeqo7Svo6KjnJaYmJejiKGPkpqHoYeUnqF/pX+nq56Tk5yTiIRyeIyOg4egdoiMaZeIZn1zeKBviIeDfox8f6Ggn5l/e4iedIiOdpuKbIeBg21oZWN6bHFiVIZtY21pmHFYanBuhldeaVtraluIcG15codph4RaXkZOPkZeTUZSVldRUVJXVGdeTFlLUlJQRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN1MjVSa1tOXExcZ189SzFWYDcvKIyml4SdrJ2ZmZ2fq6qoqr/Dr7K5vLfAv6qkt7GqrKazta6vs7arqaWxraW1s5ystba0paeos7Gtsqivnqqhs6mfpKOaoqOdr7aVpKamtrymrKepqqynpqKgmaCnpJmZpqOkmZykqZaTopyUk6KlpqC2pKOgo5iVk5iUnIiukJiUiamLl6OchbGApK2elJqelXmC1Kh/h5TAm8d5eLGlt5dkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyXsauweGhrWLGub2VpvJK8bmh6bXGP2H5TamO2sn6AcZR1mqGqkFdPV2FPVk5GVFtYUVBTi1xXW1BAXEVRTkRGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzIxVGtcT1tNXmdcPkwxW1w0MSGOpZOBp6qfl52dpa2yqbHCvbK1v7W3vsKrprStramor7Sqr7azqKemtaWnuK6csrG1qqWkp7KurbGmqp6npLKkoaGfl5ygoLCtlZ6jn7S5oqmooa2upKKem5qiqaCYm6ihn5iep6eRnKeblJ2hpqKgsKOen6OWlpKYkpmFsGtqio2qfmeEloetZXGenZWappVxrqGkfne6fGuhj3axX2q0W6WAZZyRYGaBemZ/anhqqWW+cmemjHaxanyxeHSSk2NtbadtW4SgRWlnh5ZFdZxgfWZ7o6eCWV+Lq2mAlHh6aqc3Sq9bV1RsY1pLT1dfXFdWO06IT1dWL0lUU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV9ZMzEbkqGVgqynpZ+jpKqxt620vb6wt8WyuLrCp6iwrK+pqbGupLC6r6SkrrOjqbmpnrOzsKOloKqtsKyvpqifo6KxnKOcmJWYnJ2up5eboZ+0sqGqm6GtraCempegoqqdmZ6koZyaoaekkJ2jmpegn6ufpaagmp+hlZWRlpGahbWbtXiFqZm1mXeHs5u3f5OWl6mVfmuBpnqBhYeSlJJ3q2dqsVuse46HlHSIcI6GgH+IkJd4g4KLl4yDoI+FsHZ3n3Framx8i06kWEhjY5l+Y2imYHlydVKThl5QqW1jcX2GgGKdLlGibltUa2dgTEtcZFhcWkI+sHhXWEEjTWhGQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SjlhVTUwHJaflIizpqairqmns6yqu7bCsLzCrbi3waqsra6vpq6yqaGvu6qhp7Wto6u1pKazs6ejoZ2nqrKosKilnqCfsJegmpWVl5mfrqOamqSotK6hqY+pqKmbnpWYoKWpmp+do5+coKKlo5WbnpianaKqnKWam5uioJaTkZOTnYPVk5m5cLDCfsaGfNaUm7t8mpalkI2bjKR6jYaigaWCeqx5j51Vr3uJfp9quVq5d4aDfaaCk3yYeqp5jZ2Pe7FtjoR0kLuFb5RPr6fFilGgemNgqmJzcoZsl4dfU7W0yIaAiXxjpDNCnXZdUWloZFBAWGZaZGFKSE1sS1pTT1lmWkNDP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDk7REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS1xQX2ZUN0c6YVA3MiWcoZOYsaiopbOqpbSopby3wbC6wLG1tbyztqexsaOxs6afr7aom6i6rqKvsaCztLCgo56ep6mwqbSppZydnquYmZiXl5aXoquempeorbCoo5+OrKKnlp6XnKGmopiioaKhmqKip5ueoJ6VmZqmoJynlZubn6CYkJKVkZ2Ism5otXGriHCOpnK0c3K2e5qYpI2Pm42ifo+fpH6wdoOR0tF1W658hX+kb5uqpmuGhX2tfZeZj3uxc5OdjnizZZZ0hZ5unmaUUsiLWsJcn3liX61gdnOGYpeIXlnKnW+/gXVNS7VTVcZkVFFqY2VYQU9qX2xpUFVGSTk9V1JbV1hIQz9KPDI/OzU9PDQ2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJOVF9lUDVHPWFNNjIuop2RpK+spKq7raa0pai2u7yyu7+3trS7u7OltLSisrKjoKyvpJimuq6ksbCctLipoKWdoaqlsaisqqWanZqpn5aVmJmTk6OpoJeTpquwpaKWkqyfpZKUoZykp6CVm6anopqjn62aoJ6ekJabop6cpZSclZminpWYlpKbhax7d6h2o4+Lh6lvrYqDqIOZmaKKkpmLon6Sl4euhX+Cs1xys1KufYKCpH9x1313hH6PnYaZmnevhoqRnId3tGGaZZqCgZVsklqwWEuadZh5ZmCtXnd3h2eYiGpdr3eVno94bDV5yK6yX0JUb11oYEVPa19xbVZVTS9lY2lTWVE7QURATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Njw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo3N5+dlKC4sJizwa2osqeqsrq4tLi/uriztr21pbi0oLWtn6Cpq5+Vp7asqLCxq620pJupn5+oobWnpqqjmZ6VpaKUlJyZk5ajppuTkKesr6WhlZipn6KPkaKaqaahlZqmqZ6dpJ6snaCdoI2UnpueoJiYm5WXoaCUmJGnnYapfX2leaGPkIOqcK2MgqeGlqChipeXiKOBkIeUqnyAi515b7FaqIOCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfYKUbJJcq1tak3+Rf2hnqmNye4FrmIdxXaxaiaCOa25lT0pDoVxaTXRdY2ZNWmFfc3RfSlU1SpqSWUhFPUhGQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzFVX2JMN0ZJX0MxPTehnJmZvqyYtMKuq62pprSwuLG1v7q6s7G3vKm7taCxpZ6lp6eek6qxqa+qtayqrqGYoaCmpKS5oqOroZebkaKglZSem5SZoKCQjYypsK+mnZeap6afjZKkmKirqJSXqqifn6CjraOgnaGNlKGYn6CSnJeclZ2hlZePq5uPrm1ytHSpjHeKpnO0eXSzgJKko5KcjImkh451uG+Me4uia2u2WqGGZZeXaaCip22UcrR0k5h/smqGkoita3WzYZ1mom6GkmqXXK1gTaF8h5FSc6NseX9+bpiGb1yvVjycd2ZUb24uW6dPYlJrZWJsWmJcYHF8Y1NZUD4+bW8zQkJAP0w5ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzwwMDAvNzUsKyw0MjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV9hTDVGTV45MUE4pZqbnbuinLLArq2rq6e3qbivtcC1vLGvubirwbeqq6Gcp6SinZKrqqe1o7Korqqhl5yooKSruZ2jrZyWmY+lo5aNnaGbmZ2fkZOVq7avp5mUm6ypl4yTppqlraSSl6uzpKCeqKuwmaGij5iil6CblpuXoZOcqZyUkauZh9SSmrt0scSAw4Z91ZacuHiIkZeMl4mMp4d5orZ1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiAim2aiHBtjaR0vV13fVthebxqWlZbaXleaWBkZmJteG9ZW1lDQUByP0NGKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTZAOaaZnqK8opexwrCtqaqssae4r7bEsbqyrruwrsGyrKWjnqShnJuQqqSqsqS1p62kn5aaqpmmrLmdo66ZlaGQpqCTjZyjnpiempCWkq+5sKuVl6Onp5SRlqWdpK2ekaGoq6Ccn6mksp6ipI6moZShmZyXlqSYj7CgkpWqnoWQmbWAkZGNuJV4gpObtXdubG5zbnmPhI6Jcp7Bu7yZeoGyqHCAdJG5g3yGhouHjXuKho2XfKS7ub2cdXmzo3R2l3V0sHWYnmaGaY22dHJwd7aMXn95fYlng3lteWKLrHB1hX9YW6dqRGRaVGZfY11iUGdmcW11Qk1QTEQ7Wkw/SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JXOCpPXV09KztWVic9OjymnaChv6WWs8K0rKqnrKupu66wxq+1tK+4p7W4raqjoqafoJ2Zk6ylraqmtaion5uWoKOerKS+pqGqmJWckaKbko+hqKGTnpeSmJSytbatmJ2kpKKLkpKmnKWrnJappaadm6Kpp6ajqKCRrJ6Xo56Xl5idno+wqZScp6KOan5pnKd4iXN+mo51emWHe72+wLpukYJxlIVfcmpaXZqJYWSHjpVrYH+VY22bdmKUa3+alZRlXmBjcZuJaHKMfYaUZmp+cXN5fXxiW3d0gWhQXG6DfHuKalhseYJySUpvhXBNdE1FV1xmYUxbV2ZjXk9abXZqclJPREVOO0hJPE0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4wOzouMC03Nj01JiIvKjIsJTs4LTdJUl9JJ1NfVjQpUF5MKDM+W08nPzI+qJ+oocGjmrS6tqOspa6nqLWyrMissLOstaO+sbKmoKOpnaObmpmsp66kpbWqpJuYlaKbpq2pv6ipppaUm5WgmpOYpamokZ6Qj5icsLK/rJunnaehiZORqpuopJybrKCjmpujp6yin6qhma+alaaflpSdn52XsKWZoqiZnJGenKOkmaejmpyampqQloJobnxxdpCXlJGEirSpjYWYlY6KjJiXh5OVioOSkpCJjZGUmZOYl5qgoZqblKCdjoJ6pIVsaXyQfIB0iYqBcYJ4eXZ2ioB7iWpzgXSDdWR3fXZrcHptYGNbb2hNWFhlal9XWXB6b25mU09GUzlPWk5STygrO0pCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8OjszODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlQxMFReOis9OF1LLDwtQLKgs6G/oqSxsbegqaWzp6WwtarJq62xprWmwKi0oZ6lpZyklpWgq6eso6O3rKCZlpagl62qpsGfrKSWkpyXnpiTlKKenqOnkpGZqKeyw6+Zq52rno+Wlqmeq5yeoK2YoZudoqWvpqGkp56smJemnZmaoZ6enLCgnaKnlpiTmZSgopajn5egjpaUi4qNjpatj3uUm4KRgYqpqIWAmJaKhI6fiHuDkIaFmZCHhomVjpuXjZCYnqOWmZKQnY1+jWWhs66EiYR2eo+KfXZ5em9neZCBgIlrdYF5iHJodH96doOIgmt0Y3hmX2hkY2Rmalhre3FqalxSTFBEX1VGQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVVZWWFpcX2FjYV9eXV1eXVhWSktMQklPTVJKOzw6Nzg2LzI5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LEC0oLmvvq2rrbGyoKqmsq2irLOwxbCqrKOyr7yktJygp6KhnZmXqKappqSls7WelZSemZmvpq6+oKujkZGempmUkZWhnJepnYWeqayis8ezn6mkqpaWmJqnnqmcoKSrlJ6fnqCqrqmloqqhrJufoKCYpZ6cnpyvpJmfqJOYl52SpZqYqZ6al2aDknxlfo6aj2N4jGxoanqQo6trZJmYfmeFimVlaWh6jaGOa2eMl5Gid2tqi5iin5hzbG56hI2FeVhlXYWBXmuKioF2W2hzd3eRgIeCbniCeIBzbXmEdHeIiY+De2iEWF1qc2Rdc4hpanxxbGNdUU5XSWRYQEozPUY3P0ZENzE8PT9BQzs7REdISElMTlBSUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtJLjZaTzYpRVkvRE8xWUM7Py49pZ+6vLmvq7Owq6Wora6wp66usL2xqaikrbCwn62XoKSeoZqZpqucrKOmqKmzrp6Vo5Cir6a2uaWuo4+OmqGZk5KaoJmZppZ7payiqLPDuKWip6+fnpWeo5+knKSqqJKeoZ6gqq+pqqKpn6ebpp+noKyVoZulsKSYnKuWoZ6bk6WYnquZnn6+g4hytHKFnYataHe5xLhxkqGje6aYmXOqgnzLwMC7cYqih4OefJWYiJ7AvYKWnZ2NnMHBe4F6kYyawr99a6Wxb4yBb8p6f5t4kYOOgHZ5gX95cXp/h3B4hYyTeWx1kWJlXnhkX2WBYl50aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BPz89NjQ2ODI3NiomJSMpKiYuKyopMTAfOSojPkhbTCojQ1AvI0ZbM1BZL1VBQjsvOJajuMO0sK+/qamUo6+psK+tprK2r6qmpqaxq6CrmJuioJybqqeinauipamlpLSknaOTpq6suLSnr6KSkZmdpZKRn6GYm6Cdh6arpKutv8CxoaquqpeSn52imaKkqqOToKGenayuqaulo6KloKSlnK2pkaSbqK6qnJ2qnKyilpellqGjmJx/zpR5eqWBeZWWm1+tj12Op4ChoHynlZt0q4KAr15kjKl6p4eFn3SXkoizY4KrhqCNjbJqhK50fJaHuGGCrVmjzW6PdXvbe3+ZcX6IknV/ZXuIdnZrfYhufoWQkn5sgI1fcGpvZmBfeGRbcWhqY2ZgUlRSV11KT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDpMLSFQQEY0LjGtwsDAtbSwt5iekaSqqa20q6ayra2spKymsKqgp5uappicorCfoJ+op6OmoZ+wrJuelqaurbGrqKyglJKbn6WTj56ll52oo56upKuwqL/Gs6ipsa6Wk52dopegqaqflaGenZ2ur6eqqJumpqOgqpKss5amoqqqnqOnpqGwoZKap5qhm5SUkZegcIWMl3WEqIdxsHydcqx+oZ+BpY+ed6uCfa1/nHKtfquHhp92mJJ6fJd+qoihi5GLnH6re4iSjqCAeq1WnMR6j2+SwX2BlW11cIxtZnZlhm9hd25yboiKkY+DbZCOZG5zdW9gZm1kX25paW5mY1dTXGBaUlJDOElJQEQ8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLTwnPTEpM1ZARiEcRztDMS0rr9TGx7K0n52jjqOjoq2utq+psaepqqiuq6unoqOdmaKVn6arn6Kln6ioop+esK2Ym5aop6+tqKepnpeVmqSikpShrZudp6OurKOstam5zbKtpq6sl5WcnaKZn66snZahmZ6fqbGpqaiaqqijoaubr7GiqKuuppmmq6qqsaOTl6OlmpSShaRqpHWJeql0erJxgqWJmIxwh6Cah6RfYFKrhH+ugpt1roGmhoafepiWhXtmgKOJpJiGgaN9qX6AlIauXnyoVZ2ikoF6o5+Ae8OvxYxzr7OzuXFiqa/CdWiMi5ePgWyZkW5teHd3bmxmZWRxcGZ7aWNdVl9pWFhUTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dbAoZmrqKGvop+wtbCvqa2jqKeqq6uppKagm6WfnaWnpqScrJqiq6Gkn6+jnpuTqqS2sK6gqZudl5WnpJGboaifoKacsKajqLGstsiytaqsqpWSnZ2imZ+ls52aoZScn6arq6KtmauooaGporKtoqqysqGbqqivr7ajk5akp5ibkXyqbJ6Eh3WreXywboKki4iflpWelYHSt7S4yYCBsl5flKmDpIiHoHqYlZl4qslzmaOUp6mQkpuMfpqJmsbGd2WhgqVzgqCOgn2vXm+1Y7F1S6OGbadHgpNjjo+dkntwlpF9b3p0fHptXGZqcnFmgWleYVhjbVxeWUlNTUtFREFCPkE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00T1RRHRw7PEYyLCSopMHGua2osq6spaKdsrmsqqGmm6imq6ypp6CmpZiqo5+uq52moKyan6mlnae1n6KXk6irtrKsm6acoJWQpq2RmZyno6Cqp66ho6epr7TCsrOqraiUiZedpZuio6+ll6GVmZylpauarpysp6Weq6O3rKCxuLCdm6+ns7SzpZWYqKSboI6CnU54moF/n3qEo3yCpISGpp6cnpOEuHt8ebmCfszFwrZ4mqCQi59+mpaXinWel4qkmKOofrCFm4SehKx9mZRhpWyjcI+FkIF9l4NyrGCkc3GAmmC8fVJVdI6Ro5Z7fZGQiHN6coR+cFtsbndyaoFuWmNfaG5iZF1LTFFUQUhIRkk6OUs+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUVlhZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1VGPEUyOlBbVBwbNj9ILC0gjIeZqaykq7mrr6CboayztKafoJWlr66uqaadpqaao6ehsq6hqaayoJmopJSitaKjlZehqbW5pJujnaOTkKKxmZ6cp6Whoq+tnaSoorWxw7Gtqq2qkYaRnKedo6SdpZeemJmZpaOoma2hrKSll66lu6yht7eunZ62s7mxs6eZnrCipJ6Gj9G1w7d5h46FkZOPgKZ4lKJ3jKCShKWCi3GrhoS0bnJpmaOclYmffJiZhoePcq6CpZuijaaLk5yIk5CabXCyXKVzk3qcbJl/e5l9bqlhonFxf59ic7K4aHePk6WYfYuLkYp3fHiNgWxod2l4c25/dFxkZG1tZWhgSlpXWDxHR0BUM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eX19dWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQpJZJzjIquv7+8u7Wel6ikrbaho5mVo6mnrqmrmaWhn6WgoLWnoqmnsKOUq6OOpK2jnZCamqq0tKSdppypkpSXrqCgnqaknaectZqgqqO1q8Kwqaupoo2Ej5yioaajlpmanJibmKWkppiqpqyhpJuspr2slL2wrZ+jsLO6rLSnm6mypaiYeqiQfXywd4qBpKWInG2yb6CHrXyhj4OolpmArIiEroWflKigopaFn4CZlYB7kn2rgJ2aloqqeJ2fjoiTkoB5r12jgXymp2SdgHyXdGuuXaVrcYWZXWBbjKBtlJCmmYKTi5WKeXmCln9qbH5ifXRuf3lfZmVxbmdnaENZYFs9SlQyVDhCQkM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pYU1BPTkk3MDUyLiosQVRWVlZUVFVVVVVUVFVUU1NWV1dYVlVVUUhGSUojKCi8kpqEqcbDtsG0n5utoK64paSOm6SjoK+uqZ+jnp2tmJ65oKKroK+qmq2hkKqppJaJmpCusaymn6ibrZiYj62ioZ6loZqlnK2Yn6imtqi/r6WppJ+MgI6bm6CmnpKUmZqUmpqko6OZp6qroqOeqai+pJfDrKqjoquzuqyvp6G0sKmrmXavfpCKnIWHfLqtiZhksIxlla19oI+Dp5aagayKhLCFpZmkoaKQhKBbbGqBs2B/rXt7goGxbGdumZeLiLFbfbRbpINryKJln4F7vFl2tVqyfVKvgHqsWIChbZeOqJqJlo+UlXl3jZt9Y3J9YYN4c398YGlmcG1mZWVPVWNcQVRePUkoPjk9NCEiLCUfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYGJeX1xbWFVQTUpHQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsre9u7TBs6Ocraaltqmhi5mgn52zsqieop+dtJigs6iqq56wrZ2sm5SuqaKOiJuOr62opqOoma6Tmo+pmqGepZ+Zo6OlmZ6iqbKou6+lqJ6dj3yLmpahoJqQkZqbkZmXp56gmKespqSkoqSpu56gxqelqaKrtLatrqegva6trZaBqZKjro6bgIakl5iPgYC4w7qDjpyThKeXnIKsioKviKabmqWqkX7VvcKqYqO/vXx+o4KD17q4tYWTkoKevb6EaqOBb6uEbpx/erKxx4Nqq7C9rXh3or67dICVjaabjpmPlZt4gI+ZeWJ8emOMZ3iBe2BrZWtqYlBiW1NpXEBUYUJNKTw6NC8eHyQeJTIgHSQoMDQ5NjY3ODs+QUNGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1JQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWryVtLSxv7myvbOina6mprOmnoyYpb+qt7CnoL+mprGbnrGcuaiera6lp5SUr6yXjIOaka+mo6yhpZyqoJiLo5KmnqecmqGoopmeoKutqbmuqKSbl5N7h5mRppuTj5GYmI+Yk6iZn5eoqJ+ppqGiqrueqcWjoK+jq7O1q7CqobyosLCadHWqpLeFZYmfb2esj4qPbW93pJCZn4F1r5mVcJCMcZWno5uYrqRybW1tZYp3bm2CmXGAeWlwaWeJlZWXcWhphYZncIZkXoljanBZXWd+d6ZgYnGOkm9mZICNko6il5aXj5Sde4aNk3RlhndojGp4fnhkbGNmbGJLZFhKa1k6UGVFUSdLOSsjHCAbIywpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16olK2zqbq5srOqqaKun6SzqpiSvbHDyL21qZ7Aq6yjoKarn7qjpK2srKWNlq2qj4yFlZetn6Wqop+kpKCRjKWTp5momZajqqCWnKWmp6+5q6yam5OSe4SXjaaXjZGQmJSNl5WnlJ6Xp6Kar6adoqy5n7DBqKSzpqyxsauurKi5pK+4loqhqKW2nImWoZeGqZqQlJ2TqrOZm6OsobOXoqCeoKKcoKShlaumjJKTjIeSnJyUkJmTmJCOlYWApJqXlY2Lk5KKj4aEfWeLgHSDdnSHjHGnbXyVkZSTgYGPj4+OnZOglZaVn4GGk4twZ452b4p3dnx5aWtkZG9jVWBZQGlaR2JgTlkqRT0rJiI3NDAuHxwhJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlVRSkVDPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqS1uK6uorCkraChtrGQjqvEu8S6t6qhpZ2bpp2wqKO2p52ptKankZeso4uIiY+cp5aspKGap56fk5Wjl6maqJmUp6GkkJqnmaG1uqirmJqQjHuBlIyhlIqUkZWQj5OXpY+emaiem7Wjnaart6iuwq6jt6avr7Ctqqq0uqKvvZmSpqOmtaKRnaaejamfjZKfo6yvmqGjsamwmKShnKSqnp2dnJernJKZoZuTkJaqmY2YmJaQlp6RiKCdlJSFkoyQjJSLgH5mjId1h3Z5iINznGqHkZSUkYp9jJaSkpiSoJGblZ+ChpeFeHGUcniJf3F7fmluZF9waWBbX1ltYlBgZFBaOkdGRT0zPT03LiomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iVpKejsLOsrqOpp62gqLWqkZCco7K6rquroaKZep2isKSlsamWm7imo5SZqZyOhoqJm6KQrp6klqigoZKXmZyui6qWj6iZqIyYqI+eubakpZibjYh5gZOMm5OKlZGUkI2RlqGMnZ2nnZ64o3+Dr7WisK90pL6jsqB4eqCrs7yVdq6kn4qAqn5kW2F2n46knYOXfm6Ts5yjqK6ro2WeoJNzeZmWcICYqJdsf6KniWWcpZuQl5iWi5GbkIWdmpCUgpKHjo6SiYV3a4+HdodxfIaBgGFpiIuVk4tbdpWRZ2iPjXF6o5eWZHiYhoB2l2iDiYJueH5qcGVfdW9ra2hcZWNiYm9SWz5NTk5SRz1AVEI5MS4eHyY0OjMxNjY3ODw7PkBBQkZIQkdGSUtMVFVVWVxfaGZnV1FKPERHPDlWUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuppamto6etpZKWqrSusaWZqaarlnOLnK+fqKunk5a4n6CPnKOdkX6IiJqejauapJWnop6Ol5KehXWukImmmqiRl6OIm7q0qKCZmIuJdXaTjpaTipORkJSMj5KfjZqfppibspaAjJu1nbSMko+9p6F+p6J6o6+4gY6Op5+Ei4WPsKmvjImWopl5gYushpydoqiqqIiVhph3pZt6h5uBl6aCgXucsXqKhZ+XmZSYloGQlpaEmZpieYeQhI2PkouDbnGPiHqBcYCBhn+GdIeFlpJ4lmiTdKCadHyZg56bhZh+kYmBgpdpjYyEa3h6cHBnZHdtaWxqW2RqaWVyW15IU0xRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1JYWlhbYWFoZllRSDlESzw+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZijn6aurquorKCosKenqqWZlK3GvLChlaWotJ2Pg5yrm6eioI2Qvp6ZjZ+aoJB9hY6Zl4irnaOWoKGSjZOJhoCRqI6Hopyjk5eehp+5sqedmpOPhXB1kIqVkIqUj4+bi4+RnpGWn6OVnayIn7SJtJqui8qIq66Jt4WNsIOxr4SpjaeYjZ18qI9ye3ebjqaWaJWkebSLn56nqZKZwoF/q4iYoXGegJqkfZeFlbGBoXygk5+PmJeAjpObiZiSi3yFk4aNlZOJg21zkYWAe3KGgYV9hXSFgpeBj8VmgKmHj6JqnoKfmIGZgIqLg4iYb42ShGd3dHt2Z2h1cGZna15ibmxmbFhmRlxQTDJFNDZNYGM2JjQ8REdEOjYzNjU4Ozg+PT0+Qkw/TklKS0NQWl1cV2JeamxcUUU9S01ASmRYXWNmaGdiYmJiY2NgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLixqqummpSfoqSqopWjqbair3+gppylnp2JlL2Zk42gkZ2QeYOWlpGHq5mcm5qhhY+Md5ucj6CRiJ6km5WZmIaiuK2lmZuNjX9ibZCLk5CNj4yMl4uQkZ6Ok5+gmKGofqGnh62doJauj5+dnZGGgaCNq6+HpI2qmoyafqJ1gJiTa4GrdE2reIeNnZGbqaiCqqt9g6F7eqdpnn+Sa2eXhpe2iJ59bWBjWIOXf4x7ZGeLc5l9eZZrXXyXbl9TcYVcYGx5g2BZZYJ9hIGYcaeqa4OjbnKlcJ+DnWdkn2xabIh6ZVlfgn5hV1BvdmVtdHFqam9eam9sa2hXaE5dV0U5QTRHQ15rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSlxdX1deX2J2YE1EOk1PTVRiXFtmZmlpYmJkYWRkYmFiYGJkY2FiaWtkYmRkZ2RiZ2VhY2iYlp2guaGqo6askqG2vKuuopmXn6GlrKyfnK20oqeRoJ+fppyZjpi0mZCLnoyVi3WBlJGNiqaWlpienn+ThYaspIeckYqYqZiZmpKHpbCmopWZiImAaW6Ih4uOjomLjZKLkJGhjJOen5uipX+TgY+joZSgd5yWkKeDoaeAhqquhaV5i32Emn2icHKSh5Z7nox5bYebjJmQm6mbj4edfIKic3amZp5+d6RfmHp8knOibpi3tLp0koeBgLaoZIHGuHtwlbaMcYCbpGN0rKtgfWqds35ufYeDjoKLl3GAo2xzpHOeg36jXp2Zs5Zve5ees3RyW56ygmlib3N1cWhvWWtscnJlXGhdYktEPUQ1UUFZcTI8UkZfSlM9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltaWGBgfGRJQzhMV1VWYmFaZWZra2JiZWFkY2BhYmBjY19gY2tuY2NkZGhkYmdmY2holJaVo7mZrJyToI6luLWuraCaopyjo6Ssm5qxrKuSl6CYoKSampSeq5uLiJJ4i4VwgJaNio+gkJOUnZd9kYmOqKGHmI+KkqOTm5qMi6inpJ6PloeEfmt7hn59j42Di5CQiY+Tn4KWnKCdoJ+LiXecmKKMoHKii4ipiJynkZeorH+ujH16oJl5o5N4gHOXiIycfZafhpuNmZumhqNkoXyJlpCbjWyeaJqNbpqZen+Kp31yZ3Oqg52Cc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF6ndnWJin+eaJp1h5OSmI5/nm6ZkGummVyofne7an2pWo6EXbNnXG1xeHdraVtwaXh4Yl5lV2JBUERPN1ZCUm00SlpaX05aREAxNTE7OzdIPzpDSFU/WFJZXT5EYl1WYFFhZH1pRUI5TlteWWRmWGZnbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZGNpaGdraZWciaq2m6iJY5WcrLqysKydppubp5+drZqdsKernZeimaGfmZaWoKOZhomNaYiAcXuXiIuWloSSlZiPeoqElqOdiZWPhoudkZybiY+ooqCai5GKgIBpgYZ4f5aMe4iNjoeOlZp+k6GeoKKTmHJon4qgj4xwkoyCqYiZn6Opoah9sK2koriXdqOzoqN/iJR4nXqrmn6ijp2bl4iXcqF8hY2vtX1rmpGheH6YtKOjq6iEmHuafJyZfnOqWl1ve5eLeJ5iTH97e4VjephCTZ9ZompyfI5tgYmEmXWbeYeJsbN/f5qSpnR/nW1xfJRvmXJpo12VdkhlY2BzcHx9bmVga2h2e2JjYFFeVlxUVkBZRVFnRFJXW2JYX0lEPUI4QEI6SUU4TEVYQVZRW1ZERmFcWmBLYG1+ckVDPFVeYlplalZnaGxuYmZmXmFhXF1eYGhiX2VjdmxeZWdmbGRlbGhoa2mTnYGxrpmEU16hp7S6s7OpmqKLm6mcm6iSoaujoKeOnp2cmpmVmKGdloeHiXeFgW55lYWQmot9kZOWiHKAiZKgnHKRkIGImJSfmoSOqJyalYqLinyEbISFcYGhjHiFjYiHkpiUfJKjoJ6jiK6GfbWEj56de6aWeqmClp2Qi6Gefadod21+mXOgc3F8nYWYb5OCrn2jg6aemoGjcF6pZ3WjY2+lYZzTj3x6mXhyc2OihY9+onKijnVrj7OLYIKYinOqsqe8f3eDbX+/pqq0XptvfnGXb4FzonJdo2d0pmFopm2b05h6gptud3mXa5t6dpdybKmlZ19keXB+hGtnZmNtdndmX2FSW2VRUWFJV0lUX1dTW2VqW2VRRUNLTEpLQkpEOFBAUU5XU1hPUlFgZWVpUmR4eXdJRkVjXWVaaGpTaWhqb2NqZ2BiX1xdXV9oYmFoZXtkXmRnZGtkamxmaGxomJt/sKxUXEt+qa+ytbCzo5yYhZimoKCijaSon5eoiZmXmJOZk5Kgl42IhXtwfYRofY+Dk5qBeJGNjolwf4aPkpJsl5N8iZGSo5WDjqqalJKKhYl5hHaHgG6Bn4Z3gJKGiJmhlnmToqOaoImzoaK2i3qsp6SupXCpgJqQhYGckn2kgKKZhphxnoSirK6Jl4uAjKSNloOuopR2tba1yaF0lIqAn2Gel6lteJaGn5p1oYd3oH2QloqBb0xmopJwmohzpHt5dGGDgmx+oGxyZGCccn90l2l7abO1tMamc5h+e51qm5qrdIKabXN3l2maeXSYcVBFfLNeanVqeIdmamdidHRwbVVdU1loUFJoSVVMWFJWXWdrblZnV01KQUpNSkhKTkFRSlBlY2ltZXRyc354e251iXt7VFFPbF5oW2tpUmpoaWxnbGZjZV9cXFxeaWJkaGt7X11kZ2NqZm5tZWlsZaKcia+nhWY/lKGzq6+vtaKikICXqKKho4ukpp2cpYGal5aNl5CQm5KNiIN5anmGZYOMfpageXWPiIyBaYSFkoOMhZ2NeoyKlaWSgpepl4yRi4CJeoB9i3lwkKGGeYCUh4mWn5R/lKWnnJaWhGdueJxsomR8caV3nJhwZ6eBl4x7pXqgloOWcp92gImUlo+5bpCKomJ9maKViG5yaaprdaBsbqZgm2mLkGiWh5qVdaKAfZpfi4WMdW+IYmihZZ5/aZt1cGRmiIJucqJaX1tkoW5eiYxve39zcmSlbniiZGenaJhyi5huoW9SiI9voF5kp1SLXVOYbW1yanGBbHBoa3hza29RV1ZWZllTbUlYT1xIWGloc2pZa1ZRUkVWXExYUmFVaGped3V6fHB8fHKCe39ydo2Ag3ZeUXNhZ2JwZ1BqaGhrbG5nZGdfXV1dYGpiaml2dV1cY2hjamlybGZrbWOdpZimemV0bYunrqWqsLGmn4uAlqqcnqSMoaGaoaGAlZiTjZqPi5eQjYp7hnGAiGiLi3yXmnN1iX2Qe2WDh5WKipWZgnyIhpamkIGiq5CFkIqBin2AgI5zaY+lhH2Fk42ImJ+Nh5Kqpp6JpniWnH6liZaMspiekIOvl5+leJaIeql0pY+Emm6looyShIyDvG58pa+ChoWGk5acoH2menGolKCWZ55+b6tiloqVkneobKmigYl2h4J3q5GmiGuRsGt2s4ypbIuGbm2fnpKVYX6ri6p2gH+Np593n32FpJWdoGmah3WrZp6tjLZzd76MpJNZg6aNq2F1cXNve3RwYmp+bmhsUlVaVWBhXWtNXVJdSV1sbXZgW3FZW2BaZ3Nlbm9yY3F0YHd6fnlyeYNzg36Be3uMgYKAdmJ4ZGNuc2RSbGdob2xyaWZpYV9eXGFqYmxsem9cXGJpYm1pd21nbG5ilaaqnIGAnqSWqaqeqKeuo5mJgpeqmZ2jiZqlnKidhIuaj4WckYWSjYuNdIV6iINvjYR9lpN0dYZykYNtf4uSh4aTj317gYWXpY1/paWNgI2JhJR1g4eSb2yKqICCi5SOiZyeiYyTqqOgkIB1lZeIfoF5lK6jf4GbcY+GeJCMhYB7cqeMcX19epeWm4SOeHt+fYiUlZOKdpCZn6GEe32Ja4yFW3l5cnlwaG59kYlxf3SBj5STcYWDgWWNf1+BgIx3dXOUdW96b26HbYSGX3doeI5mgYKGjqqcfnR9l2qJiG9/dXyEdW1sZoxzeHuXd4Rbalh4j2htd3Fwb3d3b11shm1pZ1ZZX1dcZGtkVWFVXlFfcHd5a2p3ZWpqanV8cXF0c2FvdWJze4F4dXmCdX+Af4B4i4WCfXtuf2xkeW5eV25naHVreGppaWRcYFpjaWVscHVuWltia2Rra3ltaGxvYY6Vuqmni6GimqakmaSdq6Kgg4OXq5GdoImappqomIKBm4t+lpSHjomIjXKCfI99fo+EepeOdHOEcJWFe32Si4aGkIV4foCGmaOMe6ehi4WPj4SVgoaOl3dyhKmFjZKckIienoeLmqegoKuDiY6Vmn5+iZatqI+Sp5B4cJ6Rg3uTb36phXB9lXFqb3yBn4t/ko6MaG1dg4uMnJufjnOVi4hxdGuCdnN/WHJuho+BfX6LaV1pY3qFg4iAX2l4e5t8g4yDdoGGg2l5i4drYXFzg3dgc4yCiZCnlYZmjY+DbnaLg2+EjHhuZGZjeYJ6lVpcaWZudlt6eXd0bXNygmZcbYpra2JZWV1aWGtxW15gWV5dZnN9e3NvdGNqaml7fHF6d3RkbXRobHx+dXl8e3p5f4B/b4aKhHt9dH55cn9oVFxxaWx2cHVna2dkXWFZamhranFybVdbZW5sZ3N5bmhqbWCMjKuxopCjoZqfnpiemamjoX2Dl6uMn5SHm6KQpJR/e5eEfJKZiImGhopyfYCLdoWLgYSWinJvgHKYhoR+koOEhoqBeoCDipufj4KmoId4jZeIlYuLnJeFg3qsgZCXmZSKnp2HiKGqn6Kio4yIk5uco5mWqqGnpqCSm4iXj3x4j46EqH5/kpGSk5ywpZqUnZCOspOYhKaMjJWboImQm4KIkYprfI52d2WChpCKfImdhIeLj4eIgISDkHd8enWaoomHi5+LhpV/foyBgHZxdIaFgHiIh4qRppGEho6Ig42QjHyGioeOgHVrgYN7eZlpcmhgc4pwfXp2dW93dIFcXm+HaG5fXlpbXFNncVVjW1thbGh0e3xybnBjamlof3tteH5xaG9wbGaAe3KBgHeAfX+Ee22CjIV8enh8fXqDeE5kdmpzbnB7ZWtlYmJgW3NmcGZycWxVXWx0bWl5enBnaWtljYidup+WoqGYlZmYlJikoJ17f5mqjZ2NhZ+cip2WfHiUgnuOmYmGg4SGbXiBgHKAh32Ik4Rta356l4aEg5B+gIaEhn2Hg42bnZKHqp6CcYqPhZKRi5yRfY16qYONkpeVjpuWhoabpqCimp2Gg5KZmZiQmqafpp2dkJeBkot3fYiOhaV7fI6QkYaYqaGck5yPjaqOkoCejYiTmp+Dj5d+ho6Cb3iFcXRgfoOPhXSLl4CDjoKGhH6FhJRueXV1k6KLjYabhYWOdICKfX1yc3uJhHt5jI6Ek6ePhoSPgoOKiYl1hIeIintuan1/e21oa2xnXnl+Z3x7dnN1dXp2XGBwfW10YGJaXF5RZm1TZVpdYWtpdXl+cGtsY2tqZ4B/a3KAbGt0bnhuhHluhoB2goB9hXZxgo2HfXt6fH97gotgaXtrdWhpg2VqY2BpW2N1aG9idW1sVGJxeWRwenpyZWptbYuKn7iaoaSfk5KWl4uan56denedpZCbiYaklIqYmXh6jYV8iZGDjIKBgm18f3hygIV9ipB9a2h9gZeIgYiOfH6GhId8j4CPm5uRiKecf3CLiouShqChioWMfKeRh4+Sl5OWkneNo6ChnZaaf4GQmZiTjJqioaOal5Gbf46FeYCEj4ehgH6MjI98l6SgoJKZkI+mjZCBm5GJk5ibfpKSfoeOgXV0gnB2YH2AjYVxipV8h4txjH6ChYWOaHhyeYyZkpCAmH6Ii3KCh3x9cXp8jIV6e5KNg5alk4uGkXyFhoeEdYGChod5ZHF6fnh5cGxqZl59cmh7dXVzfHN/al5gc3Zwd2RjWV5eUmpoVGRYXmFnanZ4gXFma2NsaGV/gGptfWducGp9d4V6a4uBcoGBfYF0doKNhn58en+BfX+PanKDbnNpYYhpbGJfcVV0b21uYHhobVdqdHZidXp7cWJrb3qJjZ+zkqWlnY6QmI+GnaCanHx1o6CNln+MooqImpZ4e4aHfoOJfoiCgH9wf3t0dYKFfomQeGdjfYaXioKKjXh9gIyDeZaAlZeVjZafmn1vi4GQk4alm4eMiYOllYSSipWXkpF2kZ2hoZiUmHp/jpiWjpaanKSemZOUm3qQhoN4hZeNnn6Bio2Mc5einaCSmI6PooyMg5eYg5OWmn+YjXyIjYF2cX1temSAfIqFcIaSf5CCa4eCgX+JhGV1b3yHk5iNfZR4jIl8gId9fHKAeIqHeYWRiouYopaChIx3iISCgXZ6gIiEdF93d3xzfXdma2RgfmlqdnJzdH1we2NjYHNtdXJtYVlgXltsZFJiV19gaGt1eYZwY2pjbGZofINraHRobG9of3yBeG2PhnGAgoJ/dHyDjIF/fnqCg358kG11iXR0bWWKbGphY3VWg2lxbmB4ZmxianZwZnl7eXFgcmyGhZCdrpimqJ6OjZeHhp+Tl5h8d6mciph5l5yLi5iPeHuAi318g3uAgoB4c3h6c32AhH+IioBkXn2LlYd+hId0fX6Kf32YhJaUloyioJd+cod7k5GKpo+MjoqSoJGDkY+Ul5GKgY+YoJqSkJJ0gI2Rk4mcnZ6mmJiNlZd0jo+KbIaYkJl6h4iQiW+XnZmik5SKjJ+MhoKSnH+TkpWHmYh7iYmBenF5anVse32LfW2FkYKTd2+Bg31+i4Bkcmp8gZeYhX+OdJGJg3mHfnZ4gX6HgX2EjoWNlKSQeYWDdImHfX9ydH+GgmxgenR5cHtvYW5iZHthbm51cnd3c3Nhdl9ua3Vub11bXl1eal1PXVdiYWhtc3qJa19qZWpjaHeHbWVsaGlsZ4B8endvj4dzgIOEfXSBhol6gn16gYR9fY5yeYt5eG5sh2toX2lxY4docW9ldmdtbGF6aGp8enhwYXdti4GZmqqgpKmdioqRhoqeipWXfXatmIyWfZ6TkZaUiHZ9e4p8e4B2d3+AcHRzem+FfYGAiX58YVx+j5GGf4OEc3qAhnqPkYeRkZuSpJuUgX2AfI2KkqSIjYqNl5qNhZGYk5WOiYmMk52TkIyNboSQjpGInpmhoJeWiZaSb4qahWeGmo+UeomFkIpwlpqToZKSiIuZjIKAkZ59ko+TjJmOe4mEh3RzdWtxbnV7inRuhpCNkXF0gHuBgoh8ZXFteX6alH2FiXSRi4F0iXlvgX+Bh32FjYqFjZaojXuIfX6LhXd9cG5/hIJiZ3dzdG56Yl5vYGp0XnBpenh4bHJwZXhdbWxzbXNYWl5fYWpaT1dYZGNncXF/h2VdaWhmYmdxjW5kaWdkaWiAend1b46Ec4CBgnt1goiFeIR8d4OFeoCJd3+LfHtyeYNqa19waHR/a3FubXFnb2xle2Jtf3l2cWx3d4p/opiiqKGnm4eMioGPnIaTnHSAqpSRjIagjJWTkH9ze3aEd3h/cnN7hWtyb3ltiXaAgIZucFtZfpGNiICAgHZ1gH9/oIaPipGcl6CTlneJfoCMiJydiY+GkpeWhIiUmY+Wi4uNjo2dio6QhG6Ji4+RipyWoJuYlYWYiGuGpINnhp2KkX+LhIuBd5OYkZ2RkIiJlY5/fo+YfJGNj42akn2Kf4Jvdm9rbW9weoVpc4OOl4lwd4B0goiCeWZ0b3aCmo98iYV6lZJ6d4l0cIp8h417i4eEiY+co4h8hHeCi4B4eG5pf4F/XHFycW9vd1pecGBval5vaXx5cG1tam12YHBvanFtWVhhYWJtV1FTWWVmY3VwhIJiXWttZGJma5JtYGZmX2drgXVxcnCLgHR/goB4doCLgHmFf3eHhnaDhXyHjIB7dop/anFjfGKGfG9wbHRqaG9sdndfcX55e3R1dH+CfqWVmq2fp5aFjYN/l5WDj550ip+TkoWKmoyVjot6cnd0gnByhXNxdYhsb211bYh3g31/bW5VUYGrlIeCeIB2coJ5gqCBkYGTkpibkZl4kXqCjJKkmpOOiJWYkoOGlpmMk4uJj4+InoWQin1zi4WIj4icmZ6blpSAlH9php2IaIehiJKEkYOJcYORl46ajo+Mi4+Nd3uSkHqOi42Rlo18iHyAa3ZqbWtrbHp+YXl9jpWBdnqBd4OMfHlndWx1h5aMf4iGe5SRcXqFcHiNe4uNe4l+g42Rnp6FfH14got9dnBoa4CBd152b21rcHJVXW5icWBfbW15cGdwZmdzdWhwa2F3ZV1WZWBgclNQTltmZF14cIh8XlxocmJiZWaRaV9nZFpocH5va3Fzin12fYWAdHV/jHl7hoB4iINzhoV+jIyDe3mVeGZyaoNgh35vb2t6YGltdH90X3R8eIZ4c3KFfHmhkJqxnKaOg4p/g5qIgIudfoqZko6EiJeNjo6EdnN2c4Bwb4VzcHGDb2ppdm2Cbn18bXRzUk6C38mS1pN8cHSDdYOggpJ3lJCYm4+Ye5NyhZCfoZOTkIqSm5OFfpaViI2NiJGNiJyAjoF4eox+iIyJm5ucmpWTeY13aIqSiGyJpIWSiJeDhmOMkZiOlImWi42Ki3F7lIl7jYiKk5GJeoV7fmx7ZXJvamt5eVuAeY+NgHp9fn+Gjnp6aHRrdIuQioKGhX2WjGx+f2+BjX+NiH6EeoOQlpqbi3x3eIOPeHJsZXB/gmtodG9naHNsU15uZHBZX2tweGZramJmeHNvcGNfd2BgVmtfXXZPTUtgZmNdeXGKdFxbZXVgYWVljmNhZmFYaXNzbmtxdot8dHmGgXV2fotzf4Z/e4l/comHgZGKiHx+mHZlc258ZYh/b3BrgFlrbnl5c2B2enuNdnJ3ind5n4ybr5ugkIKFd4iVfnyJnIeEn5COhYyXhJOOh4F1d3B5cW6Eb21ufnJkZHhwfG16fGpobGOkmsHcru+hc2t1g3WEoYWRbpWPlJ+Um4GRcIWLo5eJjpWKkJ2VgoCVkIWJj4CSioqXf4d7dX+JeIaEjZual5mOkHaLd2+Iiox9i6SFkomdhYZei5SXio6IjouKhIlse5eCfYiFiZGPhnaFfX1rfWN4dWlteHNXiHqRhoR5fn+AhYx+eWZ0aoCKj4qDg4CMl4ZrgXZuiZKDkYV/gnqAkZaUmZB0dHiHjXVzcGZ0eYFhc2xvYWh1ZlJgcGdrVV5tc3lgcmNfaH1xcm1aYnJhYlduWlx3TU1MY2ZhXnZzim1bXGR4XmBkZoRfY2NeWGpya25rcneLfXN3hIF4d3yIcYOEfX6Ie3SLiIiVhox+fpdzaHVxeWyMe250cIFYcHp2eXFkd3mGjGl2gIlygJ2Imaico5KEfXCMlHh5ip2DhKCNjnyVjH+Zh4R7c3dwc2pvgWtpbHx0XmB4dntwdHpnYGV869q1ycPciHNsc4B2ipqIjWmXj46clJKBiHCFiKCOhIuVioyYk3yNkoiDiY97kYuGkIJ/dniDhHKHgpKblpOYhox2h39whoOKh5qig5SMnoOJYYOVjoaJhYmMh4CHaX2Uf32DhImOjYJxhn5/cXdndnJpc3drWox9koGEfH+DgISKgnZidGyJgpCLgn9/k5F9boJseYeQh5OFfYF+gZKUkZeJbnJ6jIZ1bHBqcXd/XnNoblxqdWBSZHFoZlNfb3Z0X29gXWiCcXJpV2doY2lYbVdbdUxKS2VmXmJyc4VoW1xleV5eZGd6YWRfXFlrbmVuanR3in5zc4F+enZ6h3OFgnx/h3d2ioWPmIGNgnuTdmx3dXl5k3VueHp9WHmGcYBvZ3h3koJkdoaFcYqWhZmhm6KKhnNvkotydo6bfYmZiIl7n3+DmX+BeXJzbm9kcn5pZmx3d1tfeHp6cXF/aWFnYX/Vto6QpnhucXd7cZKQjIdqmI2Im5GLhntoh4uZhoGSkYaHl418jYyAgImNfJCMfoqFenV7gnpxhYCUmI6Sk4GJdYSHd4SAi5Sdn4aWj59/iGF/k4eEh4OJjX9/gmZ9kX9+f4KMj5B+bYJ8gnRrbXZ0c3Z1a2ONgY5/hH58hH+EiH9wYHNxhnyPjYJ8f5KJenGDZnuEi4eNhHyFfoGVj5GThG5weYx+dW1uaWp5fGFnaWlYa3VaUmlyaWJQYnJ4bGFlXVpqg21zYltnX2RsX25UWm9OSE5mZFxnbnGAa1pbY3JfXGNsd2RlXVxabGtibWpzdoZ/cW9/fHx0eIV4hYJ8gIh1eYmBkpV8iIZ2iIFweHl7hJNvbXuBd16Df3SBbWl6c5RzZ3KIfXKSkYSan5ughod2dpR/bXaTl32HkIOKjZl8i5p2fndxb2xqYXR8Z2JpdXpaX3h8eW1xfmVjaGhXnY9ecXKWvMSEdXGUiJB+cpaLhpuSjIdyaoiPloB7lIyBhJuMfIqGfHuJjH+UiHWKhnZ2fYFxdYWBnZOFlI+Dg3GAiHWFfIqZnZiHlI6dgIhmfZOCf4WDiYlxgX1mfot7eX5/h4uPfWmAfIN2Zm94eHN2c2xqjYWKgYl/eIGAhYN/a19yeXt+jYqGfIKPgX5ygWl5hIiMhoV5hH2BmI2QjH1ubXuJfXd0bmdme3ViW3BiV25yU1Nuc2hhTWZ0eGVgXVxYboBvc1llYV5qbWBwT1lrUURTZ2Baa25tfG5ZW15sY1pib3dkZltdYGxpY2xpc3aBg3Fufnx/dHWDeoOCfIGFdn6IgZaQeIOKdIGIcnl4fo2Qb297gXFpgXh6fm1se3WVa2p3hHRslI6GnpigmYWIbn2Mdml4mI5+gIqClZeJeY6Wb3pzcGxqZGBzemhfZXF6WmByfXlncXphZWWPsbJ3SmJapNnQlnJ7kIqQd32UioSZkYyFbmuFkpF6eZKGgISYinyHf3h4iYqEloBwjIhxdH16aXmFg6SQhJOMg35vf4N3hHmGnJmVi5OQlIWIcHuSgn2Cg4iDboF3aICFeHJ/f4OKh3xlfX6EdWNwcn9oeHBvdZiMhYKKfHZ4gIR5gWtccX9zgYiFiX6GiXuJcoFucYWHj4WFc4R6gpmNjYR4bm9+hH92emRnaXtvXlh2WlhwbE5XcXNnYEpsdnRgXVtbWXR9cm9XZ11manBgb05XaFE/WWZeWm9qZ3pxWlpZa2VZY3F5X2hcXmVtaGVraXF3f4dvbH9+gHVvgnuAgX6Cf3aBhYiXinGCjXF7hnx5eYSTjHVqen9sb350f31vcnt7lG9ugX94ZpOLg6GZnJKChWeHg3BnepaIfX6EgZiJgXyNjGl4cmtsZl9hbnhtX2JveFxkbIN6YXF2X2Vl1Oq+ijI6PouOgHF4hYiOjXaDlox+ko2Mf21shY2Mdn2Pf4WBlYh8gnhudoeEg5d3boiFbHV7dGZ5goOmi4KPi4N9boB1d4R6h52RjJGSk4yLhn97koZ3f4SNg2t/cmiAfnhtfHuBioN3YnmEgXFkcWh+bXRxdIGbi4B+hX5zdX2Ac4FvW21/dXiLg4t7h4B8iHh6cWyJhJCEi3KCeoCXi4t/dG1rd4CAdXVcaGd2b1hWe1JZb2RMWnJyZVtJcHhvXFpaWV11fnRoWWJbZ2VuY2lNV2ZRPV5lXF11ZWB1cFpZVG9kWWRxeVpoXmBnbWdqa2lwd32ObGmChH55boB8fIF/gnp1goGNk4VwgItud36Ae3uIkol/aHt9anR7coZ7c3d9f4x5eIR9fGuMjYSbnZaMgIBsjX5raH6NjHp+f4OUgX59iohrdXFnaGJbYmdybmBha3NhaHCJemJzdF5jZJugj25cNVmvtXRpgIh8koZ1hZaFc4+KiXZwbIWDh3V5iXiJfJOHen5zZ3aJfn6Yb3GGfmh2eW1leYiEpIaAh42Jfm5+doCBfYyaiIKUkZiJi4SJfI+IcHt9hHtofmxqgHt6aXp2gYeAcmB3gX5xZHJmdYJtdXuElJGBfIF/bnd5fHR+bFhwgHd1jIKGeIh2gol6eHNuioGQgYZzf31/k4mIem5tam6CgnVuXGdkcnBRWnpNWm9cTltycGRVS3N4aVdZWVphcYB0YF1dYGZkaGllTlpoTkBhZFtgdWFddW1YV1N0YVpkb3JXal1haGtnbWxpcHd8kmxphIl8fHB+fnuBf4J6d4B/iYuDcXuHb3F3hH97iY2Pg2p+e213eHaKd314gIKHf4N+fnpthYyImKONhIN7dYt5a2yEiJB4fXuBkX9/foqDcHJxY2ZeWWZfb3BgYGdwZmpviXRhdG9bYWRqdnt/vpymo8i4cYWDcpJ8eIaTgnORjIdycm+De4N0dYd0iHeTiHl5cWN3h3qAk2lyhHZnd3VjanyCh52Bf3+Oj31yf3SFeoCSkYN5lo6Vj4iCiHuIiGt4eX51Z3pobH95c2l6doCDfWhgd4d9ampzZ3uAaXaAi5CUfnp9fnB7dnt0fmJWd31yc4qEgn2DcYeKd3hxcISCjX9+eX59do6Gg3ZpcWltiIJyb11nYXFtSmV1S11uVVNZc25iUU9zeGBSWFhcYW+Cc1thXGhlZWNrY1BbcElEY2FaY3BeXXdoVVZVd15bZW5oVmteYWpnZW9vaHB2epJuaYiMeH1ye355goGBfHZ9g4iFg3B3g3Jud4OCfYmLk39wgHt4eXqBjHSDeH+BgYKEeoB1b36Ki5ueiH2FeneGe2d0hYuQen5/e4iFg3aPgGdvbl9kXFhlWW1yYGBgcGxraIluYHNpWV5kbYB3qdqpx4aHsnGJd2+MdXuGjoB6k4l/dXR1fneAcHF/bYR0lIZ4dWtgeoJ5iI9mcoRwZ3ZuW218gJCTf4B5kZJ9eXttiHeBkoyEdJaKkY6HhYV7f4RsdXZ/bWd2ZW17dW1qd3Z/f3xgYniFeWh0dWJ9e2d0ho6MlXt0gHVxf3p8bX9ZVnR/cHWFh3+BeWyJhnR5bHWAhIR+e315e3OLgXxzZ3RlbouEbXNaaV50ZEdtbUxaYVdWVXhtYlBSdHZXUFVYXmFxhG9cYGNtZGReb2JUXXJHQmZfXWZoXVt7YlFVXHVbWmdrYVZqX2BuZWZrcWhwdXiOdGuOjXV+dnh9d4GDgXtzfYOIh4NvcX90cXV/hYGJjYp7d394g3t8hYd4h3x9gX6EgHt+c3Z5jI6gjYl6iXZ0g3lefYWYjHmGg3SFhoR3iXtibm1cYltbYVZpc2NgW2dub2aHcWFxZldcY2t/fMrOh7mham1timxxhHF8hIl+e5GFeXlzeXV1fGpsdWOEdZKCd29mXn2CeouJZnKCa2pxY1hteoWbiIGBc5eUd398bolygouMiHKYjpGJhYuDe3h9cXFwfWZocWJteHFqa3F4fXx6XGR5gHdpdXhlgnZndIeLjZR8cYdqbn2BeW58XVhyf250gYt8gm9vin9xdmh3f4GAgXd9cXt1h3x6cmZzYW6MgmtyV2pddltIbWpNVVReVFV7a2FPVHVyUFFUVl5idIVpXGBramZjWW5hWGJwR0FoXGBmXl1We11PVWRwWltqaF1XaGBfcmVqZ3JncHJ3hnhulYp0f3p3fniDh391cn+GhY2CcHB7eHd1eoaFhoyFenx/dIt+fYaEhId/fn59h398eHZ5eJGToH+MfIttdYB5Y4OGloVzkYpvhYWBeoN0Y25qWV9bXV1UZ3NlYFlkcXJmgXNia2VXW2Bpf3i+rnugt21ic4Zoc3txeYKFe32Mf3d4cnZve3Zlam5gh3WOgXNqYl5/eHmLhGdxfmhqa1pWb3eJo4GEf3GZk3GAeXWDboGDkohzlYiNiISJhX14dHJuaHlgam1gbXZqZ2preXd6dlpnfXx4ZXJ9bYR0ZXWFjIWVf2+LZmp6g3VtdWJccH1sdX2MfIFmdYd9bnFodX94fn9zfWx7e4F6eHFmbGJuiX5sbVZpX3ZVSmlqT1FOaE1ZfGhiTlV1akxQVFVeZnWDZl1gcGhnYVdpXVtraEpEalphZFdZVXlZTlZtalldbGVcWWVjXnRlbGRxZ3JvdYF4cJmFdn9+d398hYd9dXOCiICVgm5zeXt6c3OFhoiIg3iBfXWPfnyEio6EgoR7fouDe3d8d3eanZd6ioKGaXZ9fGyDhJJ/co+CcIWCfoF/b2ZsZ1ddW1xbVGRwZF9XYnJ1aXVwZWViV1xcaH9wb3KAc4lkZHh+aXN1c3KChHiAhHl3dHVta3pxYmdrZ4Z0jYNuZl1ffXB7iX5pbXhmaWRVV3JvjaZ8g3t2lpB0fHN9e258fJGGd5l8iIaDhoN9dHBybGd0XGxoXmx0ZGdmaXpve3JZZ4B2dGdwgHeBdWJ3hYp8lIBui2pteoFxZnNlYW56Z3N4inx+YnaDdmprcXV7cXp5dH1mfn9/eXduZGZiboV8bWpVaWFvUkpoak9LTnBHXntmYU1VdGNKTlNXYWp2fmVcZ3NpZWBWY1dicF1MS2tYY2FVVFVzVkxYdWRaX2thXFpjZV92Zm1icGlzbnJ/dXSagXd/gHd/f4aEenx1goR+l4VucnR8enRxhIWPgYB5i3V0kH98gZWOgIWEfX6Mhnt+gHZ7o6WKeYiGhGt1fHp1g4GLeW+Fc3mEfYGDdW5qaGVWXVtaWlNibmRbWGFze2lobWlgYldfW2qAaWtvgGdrYGh5eGpzc3RuhIF6f311dW56aGp5al9lbmiBdpCFZ2VYYndpfod7b2lwZ2ZdVVhvZ46od4F6fJCOeXVwf3BzdnqPgHiVdYaDgIWIdmpydmdobltsZF1tc19nYWp4aHttW22CcnNqb4B+eXdhd4SEd4+Ecohxb3l/cWNwaFxweGRxdIh8eWJzgHBnanl0cmx4d3Z4ZIN7f3h2cGRjY258fWtrVWhhZVNKa2dPR1FrRWB4Z2FNU3FcSk1UWWVrd3plX21xaWRdVmBWbm5XS1NoV2VeWE1Va1RKXHlfW19rXV1bY2VgeWhrYW9vdW5veHV6mH13gIF6gICHhXp4eYN+gZOEcXR0f3l2dISIkH2AfJBrc5WAe4KfhX6HfYB/hoKAint2hKyff3qIiINrcoF5dYB/gXRuhm58f3OJgGpvbWRkWF9aWVpVYmpnW1pedYJpXm1sXGFWXFxsgWVxdH1paVxrdnVndHdybIV7fX15dXJseWhpeGZdZXJoeneTgWNjVGVwZ4KFd3dmaGpgV1ZZZ2OPp25+d4CLjnpwcX1oem96jXx3j3KEfX9/hm5kdXNkaGhca2Jdb29bZ19tdWR6aF10gG9xa3F7fXV1YXSFinqHh4B/d3J1f3VhcG1acnRicXKFfHRlcoBsYWx7b2ppe3l2cmaFdnt6dXFkYWVtc35pbFRoXlxUS3JiUEZWYUdidmdhS1RvV0pMV1hna3Z6ZGVucWZjWlddWXZlVUpcY1dnWFlIV2VQSGJ4Wl1fbFteXGFjXn9pal9udHhub252g5d5coGAfH+Ii4V+dXWFeIeMfXN1dYJ5enqCi459foSJaXOWgXqKnX1+hXqBen98hohzcY+ujHt7h499ZXGHeXN8e3VyboZse35sj3picG9iZV1lVllZVmNma2BdXHOFaFhwblpeV1pcbHticHd2bWJabHNzZ3R1cGyEeX6AeXdubnRlaXRlW2d0ZnZ2knpfXVJlZmuDgnR9YmNpXFRYXWJjj6VoeHSChZB4bW96aHhufIV7dYlzgHh8eH9oZXZtYGZgXmpfXXNrWWVdb29iemVcd3trbm5vd3hzdGRyg5J+h4KIenZvcn1zYndkW29wYnFxgXxzZ3KAZF5udmlkZ3l7dW5vgnV0fXNxYl9mbm99ZGlTZ1hYVE13X1FKWVhIYnVkYUlUbVNKTFpWaWxye2JsbHNjYVlZW2F2W1NMY11YaVNXR1lgTkdpdVheYW1bW19iYl2FaGdhbnh5bG9qdoGQeG2CfoCBkoeDgXZ0iXSMhnNxd3WCd3x9foyPgH6TfnB3lYN8mZJ5gIB4eX5/dIiDc3CZont6f4mUeGR1iHhzd3Vrc25+bHl8cJFyXnBvYGdibFRbWldoY21mXFxxiWVTcm5bWlhYYGx2Y2l1amleWW1zcWxzc3NphXx+f3x2bm5sZGlxY1trcmR0do5zW1dTZWFygH9ygl1iY11TWmBbY5GeZXJxhYSRdGxrem1vcHt8fHGBd39zenp6ZGV1aF1iWmBnW152aFdiXXBoYXdgW3t2aWlybndzcnRocIGUgoZ+hHZyanB9bWZ3V1xrbmJxc4F6c2ZvfltgcHFhX2pxfmxsdX5zcXhrcGFcZWxsemFnU2ZUV1FPdVtRT1hRSGN0YmBGVWpQSVBaVWpra3xlbW5xYVtaWFlscFdTT2ZXV2hTVEZaXE5IcnRYX2NtY1hgYGJdi2pjZG15eGtvaXV5hntrg31/hJl8goR5fIdtj4Zxb3d6fXSCgnyKjoKCl3R3gpOFgZ+JdYCAgXN/gnGHgnVvopd0e4aLhntld4pubnpuZndwemtzdnKMa150bmFnZWtSXVtVZ2FsbFpccIxkT29uXVZYVWdqdGdidGVlXVludG1wdXV4aoZ8f3yIdo9zZGRrbmFcbm1jc3iHa1pUVmNkeH19cYVcY19jVFpgWWOVlWNucIOFinNqaHtvZnN3c3xsenR1b3p+dV5mcmNbXlZhZFlhdGVVX2BtZGFxXV1+b2hpc3FzcHR1am2EkoGIe4VxcmZufXByb1NbZmtmcXSAdnNjbHZVYnJrWl5vZn1mbXd9c3Nzam1gWmRqandeZlRkVFVQVG1XUVZTT0dkc19hRVhpTkhXVFZtaGR8aWt3a2JXXFVbdGRTUldoUVllVFNIWlpQTXh2Wl9lbGlZYmBeXo5uYWZseXVub2h2dn9/bIN/fYaXe3+HgYl+a5OIcmd0gHt1gIJ8iI5/i5NyfIqRhYefhnt/hoxzgYZzfYN2bqWMc4GNi3Z3bXqMYGR7cGZ5cnhsbXF2gmdke2xjZmdoU19eVWdfbG9bXm6NaE5pbWBUVlNvZ3NsZnhkZFxYcHRscXp4cmyIe392nHp5a2FlbG1eYG9qZXF5fmdaVlhgbHh8e3CDX2JeZ1dYX1dkm4hia3GBh313a2t4bVx3cWx7anZzbm97gHJYam5fWV1VYmNYZHFiU15haGJibFpgfWtma3N1bm13dmtohYt+iHqIbXFlcH1tcm1jWWFpaW90gXRzXmlsU2VxZFVibmJ6Y3F3e3ZrcG1qX1hhZ2h0XGVVYVVSTlhlUk9cT09IZHBdY0ZZaU1JX0tYbWRfeGhufWRgVF5UXXVcVFNgZk5dYVRTSlxZUFl1dV1fZW1oWGNhW16NcGNnandxc25ndnR6g3KBgnmHjX58iYeOeW6QinRsc4J0f3+HhIaRhJWPeX6Mj4eRm4SAfIyEcoCBc3R3cW6Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY6Ojo2Ojo6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjYyMjYyOjo6Ojo6Ojo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA+LjExMTEvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJOpa+tra2usWFARERERENYaGdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMjy0aHR0dHBpohYKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1M0GptrS0tLS4WTA1NTU1NE1hX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYiIiIiIh46QkJCQkJCMh4eHh4eHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho+QkJCQkJGJhYaGhoaFh4mIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46RkpGJh46KkJKTkIqRj4yOhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIuLjIyMjI6Ojo6Ojo6NjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOh4qIiI2IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI+GioWGj4mMj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCQj4mHh4iMiI6Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhoiHhoyIj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2JjoyLjYyOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo+Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f35/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dXZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaGhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRUA+Ojs+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozk5Ojg4Oz05Nzk7Oz49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VzcXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw6Nzk6Ojk4OTk5ODg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PT0/QD48TUw5PD09PTw8PDw7Ozo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0REQT49PkBBPz5qb0I9P0NFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRkRAPDw9QERERW15STY6PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/P0FBQUJBQEFYQD5beHx7eXlTNzo4ODo7PT8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0E/RnhYY4SEhIOCe187Pj0/Pj0+Q0Q/Ozw9Pj89PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx8fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENEQT9KdHiAgYKBe4OBaD9BQENAQD9AQD49PD1BRUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3t8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFBQExzfIB7goN+hYVZPkNDRUA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUZGRkpOTktKSUdHSEtNSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVFSnB9f32DhYaGh2hBRUVEQ1d1homKflhHSEpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkhNcn+DhISChYeIilVBQVV0h4mHh4aHgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRklLS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMTExngISGg4CEiImMcE5thIeGhoaHh4eHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJS0lJR0hJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3BzcnR2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xMSlOAhYaCgIKEhoeDgIaFhISFhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRERCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISkpKXYWFhICChYCCgoOEhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5AOzk5OT09Pjw8PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUlghoSBfoCChIOCgoOEhomKi4yLiomKi4yJVDs4NjU2NzY2NjQ1NzczNDY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3NTc5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3t7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDQl6EgICAgoODg4ODhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo5Ojo6PDg5ODk3Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1FXa3JydHR1d3l7e3t8fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo8aoaBgoOEhISEhIaJioqIh4iIiIqKjIqJiYx6Pjo4ODs8PT45Ojo7ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw8OTs8ODo6Ozo5OTk8Pzw9QUJESUpNS0pLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6Ojs/PkV6hIGChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQEI+QEJAQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQEA/P0E9Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHFxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz09P0BDUIGDg4SFhIWEhomJiIiGhoaHiImKi4uKioqLiotePkRHSUtKSUZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREVFQUZFRkVGRkRAQj48QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QUBDREZWg4KDhYWGhoaIiYmIh4aGhoeJioqLjI2MjIuKiohXR0xNTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkBAQT9CQkdHSlmEgoOFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDk4PDs8PTo/QD5AQENGSUlQYIKDhYSFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpIR0VKSURKSEdMSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VucXV2d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af39/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AOTo8OD0+Oz1BPj9BREdKTFZyg4SEhISFhoeIiIiIiIeGiIiIiImJjIyLjIyMi4uLi15RUVBNTk1LSkdGQ0dKR0xKR0tPTEtKSk1NTE9QTkhJS0xPUVFQUU9PSklKSkxKTEZHSEdGR0lGRUVCQEJCXG9yd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FHS0xQV3mFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdVUlJUUk9MS0pFRUZLT05PV1ZRUE9RU1JNU1RPTVNMUFNVV1JTUVBMS01NTUtOR0dKRkZISkRERUVCRENjcHV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CP0JDRlZORk1PUFRZfIaDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7OlFTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tHSElIRUZJSElISWpydnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQUVCQ0dFREVMWFJNVFVWWFt8hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD5AVlVZXGRgVllicl5dVl1aVkVRWVpbWV9UWWdSVVZYVFRWU09PTUpMSklJTE1LT01Tb3N2eHl4d3p6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Af39+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1NXWlpcXHiFhIWFhYWGh4eHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUlZWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSUZCREBBOlBRUVdYUFBPUVNUVFdYWFpbboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxYU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpbWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllabnJ0d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJRVVNVVFdfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVVNUXlpYV1dXemtYWlxcXlNQUFBJTk9XVlhbWmRxc3Z2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gIB/f3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JRUU5LUlRSTU9ZUU1OUVNVVU1RU1JQTkxMSENJSFJTVFpcbXJ2dnVzc3d7ent7e317fX19fn19fX59fn9/f3+Af399fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVVRTElMSWFsknRQUVNOUVJRUltSU1JRUlVVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkNDQ0NCP0RQQkRAQz5CSEdWQEhOTUddaVBIRk9GREVGSEdIQkNIR0hKR0NCQURAT1BNU2RzdXZ1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZWJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtscnZ7e3h5dXJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPj46Oz5APz8/PmtRS2FFRkhJRUI/R0xNR01RVUlCRT8+PD08PT0/PT9BQ0I/Pjw9Qj5KTUZVbnV1dXN0dnh7fHp9fHx9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9enh6fHx4d3hkQkBAQT06QkNBQURCXF1Pe05PT05LTE1PT1FMS0xXTUhHQEI8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXV2dXZ3eXx8fH18fH19fn58fX19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlRWWFNSWVROWVpbV1ldXl5gZWBdXnF2a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSUVFRkRNUlBhV1JYUVBTU1JVW09PUVZQTUlDRj46OjY0ODY5Nzk6MzY2Nzk2PEI9ZnR1dnd3eXl7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUxUVFNRUVVPTFJTVFdYVFRYUUxYWVpWWFhWWFldV1dYaHNrXVZgdGthYV9dZGBfXllVUE1PTkxJR0pLSUhGQ1FQU1pXVFRNUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU4OEducnV4eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFhWVlNUVk9PVVZYWFlTVVRMS1RVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk5OTEpGUFBVWVNUTkpOT1RTVFxWUlVTUk5NTElISEY/Pz06Nzg3NjU5OTY3NjY1V3FxdHd5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVVRXVFJYWFlZWVJVT0pHUFBPT01SSk9QUFBOTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUVBOTk1QTlRSUFJMSUxLT1FQUVJTVFFST0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVdVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+M0A+am9hUlJRQEZUUVBRUFFOUU9QT0xKTExPUE5OUFFRTlFPSkxNTUtHRUVEQjs9PDw5PUc2Njc2RG5xdXd6fHt8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkM4RU5TXWZSUVNBR1VQT1FRUE1NTk1LTEtMTk9PUU1PT01JTUxJTEtMS0dGRkVEPEFBPjtARTs8ODlUcXN1eHt6e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QD88PUFAQj0+RUhHREZGSUdLSkBGQUFARkhFSk9IUFFhXFFQUk5TT09QTExPTUtNTE1PTltWS01RT0hKSENJSkxMS0ZGRkQ/QkM+PEJHP0I/QWRxdHd6ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPjs+QUBAPkFESUVDSEdJR0lFQkI/PjxDQkFHSURNT2FlUExOTldLTE5LTE1NTUxLTk5TZE1KTFJJSUlFQUhKTE1OS0dJRkJBQkA/RUZFSERLb3B3enl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9HS0U/Qj05OTk6P0I/PEFCQkFEREdLRkRJSUdHSENDP0I/P0BBPkNFQ0tOUVRLSkhNVEZJSUpMSktMSUlMTU9QUlBLR0NMR0NDSkpMTU9OSUpJR0NDQ0RJSk1MSVpzbXh5eHp7e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FqcWhlcUhLQ0ZISEdKS0lKTERHQj0+PTo6OjtBQj89QkJDQ0hGSkxKRUlJRkdHQ0M7QUBCPkBAQ0VDSU1PR0hLR0hLREhJS01ISkxISEpMS01dUklIRE5HQkVLS05NUE5LTUpLRkdHSk1OUU5MY25pd3Z3e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRvRktDRkVHREVFRkVHQ0NAPjw9Ojs6OkBEQD5CQ0VFSUZKSkxGSUlHRkZEQjtCQ0M+QENDQ0VGS01IS05IREhFSUxOTUdJTEdFRklJTE5LSkhFT0lDR01NTk1QTk9PTUxJSElPUlFSTlJmZ2Zyb3N4dXt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSUNFRkVCQ0JFQERCPj8+Ojs7PTs9P0NBP0FDRkdKR0lJTEhHR0dGRUNAPURFQj5BRENDRUdISUdNUElGRkdLTk9LRkhKRkVERElJSEtJRkhQS0RKTUxQTk9OT1BOSkpITVJVVFJPV2RhYW1ncHJvc3l6Z2VoaGNpbGdxbGZsbWdpa2xzbHB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0JBQkQ9QkE+QT06Oj0/Oz4+QEI/QEJFR0pGSkdJR0ZGRkVEQkFBRkZDQkJCREVER0dIRkxQTElPSkpMS0lHSEVGRURDSUhIS0pHS1JNQ09PTlFQT09OT09LS0tQVVdWVVRYYF5daWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Fya2tzTUZGRUhCQkFERDxBQUBDPDg5PT46Pz0/Qj9AQERGSEVIRkZHRkZFQ0NFQkRJRkNGRUJFR0VFRkdFSU1LSFFNSktISElFRklIRUNJSUpLTUtQU05EUVNRUVJOT01OUE1MTlNXVldYVlheW11kYGhiamlna19kZWZjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEJCQkZFPEBDQkQ8Nzo9Pjs+OkBCPj8/Q0VGREZEREdFQ0VDREVGRkpFRUlHQ0dIRkhGRUNGSkpHTUpMS0lKTEZJSEtIRUtLTE1OT1JUT0lTVVRRVFBRTU5RTk1RV1pWWllWWl5aWGFgYGBfaGVjYGRlZ2dqaWhqZmhubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3JzeU1ISEdJREFDSEU8QEVDRT04Oj4+PDw8QUI8Pz5BQkZDRUJCSENDREVGRkdHSUZHS0hDSEhHSUdGREhLSUdLSE1LSktMSExKTUtJTkxPTk9SVVZPS1VWVFFUUVJMT1FQT1RZWllcWllbX19eYGNeXGFja2JgZGdocoVoZ2lmam1ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0lLSEpFQkVHRTxAR0REQDk8PkA/Pj9DQjxAPkFBRkNFRUNIREZER0ZISEZISElLSkVKSEhLSEZGTEhISEpITExMTExJTUtNTU1PTFBQUVVWV09KVlZVU1NSUUxPUlJRVlpbXV5bXF5gYGFgYWRdZGBlZmBlaGpjc3NmamhnbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3b3dJSkxJTEdCRURFPEBGRERCOz8/QUBAQERBQEI/QUNIQkVFRkdFSUVGRUlIRklISkxISEpKSUxKRkpLSElKSkdLS01NSkpNTE5OTk9MT1BSVVdWTU5UVlVTUlFQTU5UU1JXW15eX11dYGBhYWFgYmRlYmNoYmRpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXRzcHN2dHV1d3Z1dXRlcXNrcHFqcnZvd0pMTEtNR0RDQUQ8P0VFRUM9QUFDQkJDRUFDREFBRUdDSEdIR0ZKRkNHSkdHSkZJTEhJSk1LTUxHS0lITEtOUUtSUUxTTUtOTk9QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhX2BiX2BlYWFjaW5oYmloaG14dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnJxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHREFARD4+REVGQ0BDQUVEREZDQ0VHQ0JJRUJISklISEtGREtKR0hJSUlLR0pKT0tOTElMSEpNS1pmSmRcS2xSSE5OX25VbHNbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZcbHRgbGpUX3d2aWpnaWZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPz1ERUZEQ0RCRUVERkJGRkdDREpFRUpMTEpMTUdHTUpISkpIS0pJS0pOTE1NTExJTE1MW3NiZHBebGxVTU5mc11nZXFsbnRncGlfYVlubWJwcGJrampnb3F0ZXRub1xwdWdwTUpyeXZrYmBrZWVteG1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QkI/PUJFRkJGQ0VERUVEQ0hIR0RFS0dHTE1NSk1MRkpOSElLSklLSkpKS01NTk1NTUtOTU1bcm9vbnBwbGtNUFFsV05pYnRycGFtb3ZcWWxQW21tWnFta29teHh0c2lwXGBzbHFqVXV5eHBjXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEVFRUJCQj0/P0VHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5HTE5JTEtISU1JS0pKS09QTk5NTE5NTFxoZHVdbHFXbE5PUW1VWmtea2x2YWxkdFRlY05sWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2dhZGl0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJREVFQ0FCPEJAQkZDR0ZLR0VDQ0hLSEhGSkxMRk5LTFJSTEdNTUhOSkdITkhKSklITk9OTkxKTk1KWnNwcG9xcW1sT1FSbllxa2dvb3Fxb210Xm5YYXRfbm9wb3Fyb251c3R0altddGN3eHJqbnpoYWFjZmJiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dEhLSElCRUVFQUA+Q0NBRUNISU1JRkNGSkxJR0ZKTUtGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTE1NTElLS0tTa2JaaV5famNyclpfWWpvX2VlVWtfY1thYlFgbWhcalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSURFREZBQEFFRENGQkhKTEdGQ0ZLTElFRkpPTElPSUxbUUpGSEhLTUlISklLS0lISkdLS0tLR0hKSkxMTEtJS0xOVFtcVFBUTVBPTk9PVlFPT1FPT1FKSk5QUWRxaVRZV1tbXFVZW11YXVxcY2ZhYWZiY2VfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUM/Q0dERUdDSUtMSEZER0pMSERHSVBLTE9LTFdNSUVFSElKSElLSExKSEZISEpHR0lFRkxISUtOTElPXFdeT1xbYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXWJYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJESUVHR0ZLSktIRUVKSkpHRUhIUEpMTUpNU0lIRUFIRkpJS0tJTEpIRkVKSEVGR0VFSkdDSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5fXF5TW15jX1pdYGNgWV9iW2BeW1RYWFpfXmRiYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUlERktLS0VGSElOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlFRERFQkZKREBKS0lPW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1FbX2FhXl5jYWBiYmJjY2VaUllWVVxbXmNgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGQ0dFQkVHSEZHSElGR0pHSEZIS0lMRENLSk1NTExISkpISkc/R0ZOSktLTUtLS0lHSEREQERBSElBP0hJR09dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5QUF1fYWNkY2NiXGRjYmRjZlhRVVRTXFhbYV9eX2FhX2Rsa21qamxudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUJASUZDRktJRkZHSEdHSkZGRklMSk5FQ0tKTE5KTElLSkhJR0JISFFNS0tPTUtLSUhHRUQ/RUJISEFBRkZEVF1ZXlhfWV9bXVVYWFBdXVFLSldeWF5bXVZaYFJRX19hYmFgYmJgY2JiZGRiWE9RUlJbU1xeXV5eX19fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIQ1JLRkhISEVGS0pNUEVHSUlLTkxMSUxLSUlHREhLUU9NTFBMTEtLSElDRUFFQ0hHQkFGRUJWVUVcVF1TVl9YTlRVTlpbTUpLVWBhW19YX15hXU9ZYlxgYF9iY2JdYmJXX19UUE9QUVhSXVxcXV5fYGFmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElSY1BEV19JR0dIREZNSlBQRkpJSktOTEtLTEtKSkdFSk1RUU5PT01OTE5IS0FEQUNERkRDQURFQUxIQ0xMUE9PTEZNRkdJSkhHTExNT1FJTE9QUFNQTFFTUlVaWVdZWFhkVk9TVFBQT05QVVRcWVlbXl5hYWVmY2hja21xc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01eTEdIWU1HSEpIR05MUVFJTEpLS05OVU5PS0tMR0dLUFNTTlBPTk9OT0hLRWBFRF9MRGZjRE1bSF5cc21PTVZtWUxDUF9VbFdnSl1YVl5ETFFVTE1UVlFSVFhXVFhVVFxUUGZaaGhkWVRrVFdWVVtcXGBgYWJiYmBnaWdubGhyenx9foGEhISEg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1RJS0dgVEhKT0pJT01SUUtNS0xPUlVST09KTE1HSE1RW1lPUFBOT1BQSktQf1FJfFlZcnNYUG1IcW5vYVZQcXFzUENrc21xc3BTb19bblhdVlxYVWtoVV1WY1pgWVpfVlVXf2p0dXVfYXZfWGJcXGZbX2FhYWJeYGJnbXBsYHB3dHiBgYKDhIJ/fX6Adnh6bHZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0lMRlJWTEtPSUtSWFdRTk9PTVFUTk9RUEtLTkdNUFNbWlRRUk9QUFBLSFp4XVR4ZGhZUlRRdmd0bHBibmZrUXJPTXdtanJwc3JxcnBvcIBdZXp1eHFxenF+c31rdX1iUmh8ZXNzb3NzfH1vfnlvf3JfYGBiYVphYGdrbmtibGZnbXd+gYCDfnt4d4B0dnppcn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tISlBPTU1KTlZeWVVMUVNOWVlMU1NSTkxQSVFSVFlXV1FUUFBQUUtHZnhsY3hxbVpKTFV5cHVtdWJudlBkZUpmdnFtd2+AamZ4eGlXclFoem1panp6fWx4en9wZ29YdnZqdnVwgGFzaH1pbHh8b19fX2NiW15iZGdpamRnYmNkbGxwcHN0c3NzeXFyeGJsdGdyeXtzc3V5foFzdXpufH15eHJuTkpSdE5DQkVQUElLS0pMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBJU1RVWFdXUFVQT05SSkxyb3V1cXVxZGhhVm5McXBeRmh5V3ZUS2h4fXhgeXtzbmFebW9kUmdydW5teXB3bHZzdHFsbVxzfnprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZWVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21LS1pWSEdFR1JQSkxNS0xRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTklUVFZXWVdPU05OTlFIUm1IaXdLYGR2dlVXbE9ubHtzYWpnf3ZVS1draH1sbWx4YFtwenteYHpzY3JveHFoZHxpcntdVEtsX3Z1a2l1e3ttfnhrfHBdXl5iW15iZGVnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3Nya2hsbXJ8a21oa3t0bW1rbU9HSktISkhIUlFMTlBNTFNTUk9TU1dSVlRQV1pWVlRUVGFgUU9OS1RTU1FWVk9OTE1PUEpIUU5QVUxLS1NUUlJUUFZVUVFOUVFYWFFOUFVUWFhYW1tVU1NXW1dYV1pQU1VXV1hRXVhWXVVTT1hSV1dXWFpgW2dyXltcW11eX2NaX2NjZWZkY2NiWmNjZmZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUUlLS0xNS0pUUk1RUVBMVlVUUFRVWFVZVVJaXVZVVFdVWVhQT0xOV1RRTlVTTlBNTFFQS0pRUktRTUtLT1FUUlFRU1NJSE1OT1FSUVFRVFZSWFdcV1NTUFFVVVZUWlFOU1JXVVRZVlRZVVNSVVNUVVhZV15aX2FdXFtaXFxgY1xdYmJkZ2VkZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRjZmhQSktLTk9MTVRRT1RRUU1YV1VUVVdXV1pWVFxgVldWWVVYVFFQS09YU1BOVVBNUk5LU1BNTlVUTlFOTU5RU1BUUVNUVU5LTU9RVFRSUlFWV1VZWltZU1VSVFdXV1lbU09TVVdVVFlVVllUUlJXVVVXXFlaYF1WWV9dXl1cXWBhXltiYmNoZmVkYlhgYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl1dY2hrYWdmaGZkYGJjYVBLTUxQUUxPVFBQU1FPUVpZWFdYWlpYWVZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBRTk1RUU9SWFRSUU9NT1NVTldSVFVVT05OUVNVVVRUUlRYVlpdXFpWVlFSV1hWW1xWUFNWVVVWWFRXV1RSUlhWVVpfWl5gXlZeXV5gXVxgYF9fWmJiZGhoZWRiWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9VXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTFBTUlVaVVRQUExQV1ZRV1NTU1hNT1BSVFhVVVVTVVlYW15dXFtWUk9VVlZbW1dRU1dVVlhVU1haVFNRWVdWXF5bX19gVWFcYGFeYGJfXGBdY2FjZ2lkZWBaY2BhX19lZV9gY1taXFtcWlpZWVdcWVxbYF5fW15eYWBfYlxZYFpRTk9OVlFQVVNQVVRTUFdcXFxYXlxfV1xeanB3eX9jXFtWVlhSTk9XU05RUVBSVFJMUVRTWVpXVU9STlNXVlRSVFJSWk9RU1NWW1ZWV1RWWlhdXlxcXlZTTlRWVltbVlFUVlZYWVJTWVxUUlJcWFpdXl1hYWBXYltjYl5hY19cYmFiX2RnaWRmXlxkYGFgYWNkX2JfWVpeW1xbWVhZV1daW1phXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQWl1eXVtgXGBVXF1oanJ9cmxoXFVZV1FPUltTUlFUUlRVVEtSVlVbWVpTT1NSVlVVU05WUlNaUlRVVFhcV1hYU1hcWF5dWVteVFVOVldXXlpXUVRVWFhYVFZYW1RTVl1ZXV1hXmNjXllgW2ViX2RkXl5jY2FdZWZpZGZdXmRhYGFiY2RfYl5YWl9bXFtYWFhYV1taXGBdW1tcW1haW15WXlldUE9PUlpQWlVVV1ZUVFReXmBeXmJcYFVdXmJreXRsfWxaVVpVUVFTXFRUVFVUVllXTFJaVl1bXFJPVVNYVlVTUFdSU1dTV1VWW11YW1lVWl5XX15ZXFpSV1JZWFlfWllTVFZaWVpWV1lcVlRaXVxeYGFgZWRdXl1dZWFiZmReX2RjYFxnZGhlZGJfZGFfYWBiYl9gXldYXlpcXFpZWldWXVpdXltaW1xbV1lcXVZYV11TT1BXWVBdVVZZV1dVWF9gYWFgY11gVV1eYmVldYF6aFhZWlRWU1ZcWFdXVlZXXVhQVVxZXl1dVFNYUlhWU1JUWFJTVlRYWFhdXlhdW1VeX1hfX1hcVlJZVVlaWmFYXFVXV1paWlhZWVpYVl1eX15jYmJlZV1iXGBmYmVmZF9gZGJiW2ZjaGVjZmFmX19hYWFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOU1pWVFxUVldZV1ZcYGFiY2FkX19WW2BkYV96dW9oWlxaVlhVV1taWVtZWFlgV1BVXltgYVxUVVhQVVZVU1ZWUlNVV1paXF9eWl9cVl9fWl1eWV5WU1lYWVpdYlleVldaW1tbWlpZW1lZXl9gYGRjZGVlYmRaYmZjZ2ZlXmFjYGNeY2NpZGRnX2deYmJjYWFgXl9YVFpaWltbWFtYWFxbWltXV1pYV1xbXGBdVl1dU1BWWlZWWlVYVVhXWF5gYmFkYWRhXllZYWRiYGxmaF5cXVtXWFhZXFxcX1tZW2JWVFdeXWFjXFNWWFBWVlZWVlZTVVRYXVxfYGBdYF1XYF5bXlxbXlhWWFhbW19fW19YWF1cXV1eXFpcWFtfYV5gZGNkZmZmYlljZWVoZ2ReY2FgZWNdZmlkZWhfZ15jYmNhYWBfX1tYWVtZWlpYWVhXW1xaW1dYWlRZXVxaYFxVXmJNUldZVldaWVtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX1xcXVhXW1tdXV9fXFpdY1hZWF1gY2RfUlhZUFhWV1hYV1ZXVl1dXmBhYV9iXllhXV1eWV1eWVhWV1tcYF5cX1laXl1eXmFdW1pZXF9iX2JkZGVmZ2diWmRmZ2lnY19jXmFmZFpoaWNmaWNlXmJiY2FgYF9dXVpXW1lZWFhaWVdaW1pZV1hWVVtdXV1gYGJieEtXV1xYV11cXF1aV1xdX2BiZGJiYV1gWGJjYmBjYWNeXFxcWFdbXV9dYF9dW2BkXFxYWmNlY2FSXFlPWFdZW1pZV1paYF1gYmJgYWNfXGJdX11bX15ZWVVYXV1fX15fW1peXmBiY1xbV1tdYGJiY2VkZ2ZlZ2RcZWZoaWZjYWJcY2dgXGlpYmhpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldXWFBYWl1hY2Zmcmt/SllXXVpaX11cXlxZXVteX2FjYmFhXWJbYmRhX2NiYl1cW1pXWGpxYFxgX11cYWNfXllZY2VkYVRfWlFZV1xdXFtaW1tjYGNiY2BiZGFgY15gXF5fX1pYVltfXVxhYV9dW2BhYmViXlxTXF9gY2RkZmVnZmVmZV5lZmhoZ2RkYFtmZ15haGhiaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7enp6e3t7fHt7e3t6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7enp7e3x7e3t7e3p6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYiNsbW0tLSztZWHiYmJiYaz1tLS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMi5G7wL+/v7/BmoqMjIyMiL/p5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh4eHh4eHd3d3d3d3d4eXl5enl5d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYCBgYGAgIF+fHx8fH18gYSEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnV1dXh2dnZ6e3h7eHd2eHt3eXp6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7enp6enp5enp7e3t7e3t6enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHt8enl8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8fH19eXt6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3d3p8fHx6fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6fXx8fXp8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl7eHp7eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4uJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKEhIKDgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBgIKDgYKFhYWFhoaHhoWGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4KDhYSCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Qko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDg4OBg4SFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGBgoSBgoGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiIeEgYKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgoGIkYKCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoKCgoSCgoOCgouYh4WEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GBgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoSFhIOBf358iJuLg4SFhISEgoGAgYKDgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAg42Ffnx+f39/mY+BgoKBgYKCgYCCgoKCgYKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYuHhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4CDlop9gH+Cin+NjYGBg4GBgYGChIOBgYKBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgIKajYKLgoKDgH+Eg4OEgoODg4KAgICCgoKDgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSFg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSCgpiMhIWHh31/foCGhYWEhYJ/fX19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSEhoWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYSDkoiBgYCEf39+fYWHhoOAfn9+fn9/f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgYKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhISGg4GAhIyCfn19gYaBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4SEg4OCgIGFhIOCgH5+gH9/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eIiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4aFg4OFhISEg4GAg4WDgoOCgYGCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiouLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5GOioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4ODgIGFhISCgoKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYOChISDhIOCgoKDgX59fX5+fn5+fX1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4eJiIODhIOFhISFhYaIh4aFg4KCg4WHhoeGhoOCgoOEgoODhIKBgoGBgYODhIOEkZKRjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaGgoKDg4ODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYODhIWFhYODhYSEhISEhIWEgoKDgYSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgIB/goCAgYODg4ODgoJ/fX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4SAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGi5ORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fYCCg4OCg4KDgn19fn6AgIGAfn19fX1+fXx6enp/goKAf39/f35/f4B+fYB/f4CAgX+AgIF/f4CAgX59fX+AgX9/foCAgH+AgICAf4CCf4CCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn1+foCAf31/fn1+gYODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6eXqAgH5+f35+fnx+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f39+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fX6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXt/fn5/f39+fX5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAfn2Af39+fn5/f35+f318fH2Fk5KOjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCgoGBgoCBg4ODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2Af4CBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISEg4ODhIKCgoKCgX5+fX19fn6AfX19fX19fX19e3p6eXl5eYCCgoKEg4CCg4F/gYCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhYaGhoWGhYGBg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYSEhYOCg4OCg4OCgoKCg4OCgpKQi4iJh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAf4CBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYaGh4eGh4eIhoaHh4eGh4V+fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko6MiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYCAgIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhIOFhH59fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fICCg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiImHhYaFg4OCgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgIKAfn19fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYKEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5+fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+fn6Agnx8f3+CgIKAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uTj4yLjY6NiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaHhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJGMjI2NjoqFhoaFhISFg4OCgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKDhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYuNjo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6Eko2Mi46Ni4qGhIWEhIODg4OCgoKDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+Af36Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIqPjIyLjYuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+AgIGBgH99gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fXt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBg4GFhoWFhoaHhoGEkY6Mi4qLh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fHt+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7e317fX5+f4CAg4eJiYmLiYuJhYiRjYuIiYeFhYOCgoOEhIOCgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gH9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX5+fX18fX19fX1+fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6ChYiHiIqLi4uJjJCOjYmIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImNj42LiIiFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx+f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI2MioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYOBfn6AgH1+gH59fn6AgH+Bfn+Af39/f398f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9e319fXx8e3x8e3t7fHt8fHx9fImKiIiFhYWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x9iYWGhYWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen59eXh1dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCGgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXV1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goR/g4KCgoOCg4GBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dXR6hISBhISDhIWFhoSDg4WEgoODgoCBf39/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4CDgX+Ag4J/f4B/gX+Af3x7e3p8e3yBgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fH99f4B8f399fYGAgH59fYB/foKBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgYSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/goCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx8fX1+fXp+fX14fn9/fHx8fn5+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSBhISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDg4N/f359fn5+f4CAgIB/gYKBgH9+f4F+f4CCgoCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWEg4ODg4OCgYKDgoGDgn+Bf39/fn+AfX19fX+AgIB/f4B/fIB/f4GAgYCAf3yAf31+fn9/fX5+gIGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnB4eXJ4hYWFhYOEg4KChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgX97gH6AgH+BgYB/fYB/fn5/f319fX6AgYGAfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fHt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf4CBgHyAf4B+f4GAf399gH9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36BhIKCg4WFgoJ+fnx7e3x8eXd7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXJweHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH9/f31+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYF/goF9foF+foCBf4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+BgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCg4KAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jn53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIKCgX+BgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8e3uHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICBgoF/gIGCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDgH+CgYSDg4SBgYOAgoOBgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9+gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX94d3Z5eXl8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIOBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgH+CgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9f3p5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYKCgIGAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+foCBgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChYaEgoODg4SBhISAg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fXyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgISFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISBhIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f39/fH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KEg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDhISEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSAf4GDf35+fH59fX+BgH9+fHx/f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOEhIKEg4aAgoWFiomEhIOEhYWDh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgX2BdYF5g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYKBhIOAf319fn19gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEg4WEgYOEhYOEhYOKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHOCg3+Dg32BfX5+fX6Cg4J8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26Ah3ltfXJzdnN2bW14bHB5bHV9f399foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gYB/fH99fIB+gIB+foCAgYB+fn9+foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoaGhoWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJioiFhIaGhYWDhYaFhoaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomJh4aEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhIeGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWDhoaGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fXt8fH1/fnx8fn2Af31/gH5+gH99fXyAfX5+fn5+fnx8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhIaEhYaGh4eFh4aJiIaGh4eIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWFhYOGhoWGhYWGhoWEg4WFg4SHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fH9+fX1+fnx9fH98fn58fYGAfHx8fXx8fH56e3t8foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhIaFhoeFhYaGhYSDhISDg4eDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYeFhIOEg4OEh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1/fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDhIODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOGhYKBgoKAg4WCg36BgYF/g4F/fn5/fX98fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeIhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWGhoeGhoWGhoaFhoaEg4SFgoGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKFhYaFh4aHhIaGhoaFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OEh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEgoWFhoaGhoaEhYaGhYWGgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOEhYWDhYWBgIODf35/gH9/gIN/fIB9fX+CfYCBfn6Bfn5+fX1/e398e3p5enp5enp8eXp6e3t7fHp7e3t7fX59fYB9fXx8fYB/fXyGg4aGhoaGg4SDhoKFgYGAf3+AgH5/gIJ8fn9/foCAgYKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYWHhoWEhoeFh4WFgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhIODhIOFhIB/goJ/fX5/fn5/hH57f3x8gIF9gYB9fYN9fn59fX57fnt7enl7enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIWFhIGDgoOChIODgH+AgX59fX5+fH6Dfnx+fHyBgH6Cf31/gnx/fn19fHx8e3t6enp6eXt6enp5eXp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYOCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgYCFg4F/foB/fnx9fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRkw9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXU1NTU1NTT0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19vb29vb29vb29vb29vb2dfX19fX19fY19bX19fW09LT09PT09TU1NTU1NbW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNhG1wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubSPjIyMjIyMjIyMjIyMiqC6uLi4uLi4uLi4uLi3vdLS0tLS0tLT09PS09PT3OLh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo4Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzk4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6ScWlVWVlZWVlZWVlZWVlJ5p6Ojo6Ojo6Ojo6OjoavS0tLS0tLS0tLS0tLS0d/q6uvr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzc5SKzExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSlnl9ZWlpaWlpaWlpaWlpXfKikpKSkpKSkpKSkpKOs0tLS0tLS0tLS0tLS0tHe6urq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183PXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampqqNoZGVlZWVlZWVlZGRkYYOsqampqampqampqamosNLS0tPS0tLS0tLS0tLR3unp6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcXCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs/Oz8/Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRzczMzMzMzMzMzMzMzMvO0tLS0tLS0tLS0tLS0tLU1NTV1dXV1dXW1dbW1tjZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7Q1NLPzs/T08/O0NTSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tfX1tfX19fX1tbW1tbW1dbW1tbW1tbW1tbW19fW1dbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7Pypal0c/PopfK0saSq9HOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Pz5yqnazXqKCroM6ZrZqz0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD9BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0MuUiJqdwpyVkKGzlYadnc7Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/RvciZm6udn6eZtMDJl5nG0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/Pz9KXlKDDoqCMoMXTkZigztDQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9Ozm8SY2pfFyZTYrKO/ndXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDRzo2QoLaglJWhu82IlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0cvaqJ2Ln6+znaXQ26KZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2Ojs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49PTs7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmOpZqjkKKaopyckaiYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6ODo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2Lirocq7oaannb6eqaCinqmiqZzQ09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTc6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT056QjbbZro6RpdSakY6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHSusTV0tXBvdbT07jI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3Njs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tXU0tLS1NXT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2tnZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODc5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs6ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29va29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUZDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2dra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vb29zc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra2tra29vb29vb29vb29zc3Nzb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpkbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj08PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tbW2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmYmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz8/QDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJmampmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCQkZKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkZCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5qbm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnJycnJycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdnJydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJydnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJUlhZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBFTUlTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVUYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcVGBNSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqaifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKlqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKaioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq6mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKamqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Necl9oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moaKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+qqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKClqKynpqWlo6OnpJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdwfXlmW1tgX1pcVlxoZG9jbmlpYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2r7Owq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKeso6ekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloaGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh4eGNbUllUX19ibGh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLa0urGqrrSxsLG0tba8vb68vL3Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKlp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqTlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGw8O5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsKe8vL7FxMbJx8XGu8TBxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzszMx8HDx8fIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWMh5KLmJiVmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbGhxeG95aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkJBPUBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsbAxcfLyNTLysfGv7u7vsS+xcjGxsTEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkomVkZeVlJmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnh6e3Zua2lndVpmcndzeGZmXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8nGw8PEwsS+t77Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamddam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjHycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytp6q7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHGwcvLx8bMyc3FxsXDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW5zYlxiVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHDxL+/vsTLyMrLyLy7yMfJzcjDyMnJxcXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cnBmZWdkamViam1ubl5YXFZVTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsG5u8O6uLm8vsHGwca6ucnJw8XEwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZmNaWVlcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub26urS/uLW3sq+7vLfAt73Cv8G7v8G8u8W+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u766tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5h31xY2BiYmdqZ2ZpZWldVlVTWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS1sbC1t7W7wbi+uL+8vbe1t7CuuLa5v7vAv7fBvLvDtrrIuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVraFhYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v728sq2vrLGwt7y2u7zAxLm3t7e1urm6u8C+w8C6xMK+x7i5uK23tbi6tLizu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72/u8S3tri2t7+/xLzC0srGx8rJxs/CwbiutbW8vri6sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bndjZ2JcY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz0/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6ujsLm9vrO8vrzFuLK4ub3HycrCzdnIy8nIzM7RzMrEtbrAw8i/vrW/wb/Gxr/LxsO/wbzAw8zKx8XGwLm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2NeYWFOSE0/RUA/REM8Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ8QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS8w7y6ur68xL+3vb+9x8zGxtfHq9TFxMrIzMzNysbCw8vOwry5vbq5wMO/yMbEwcG/xcDKycPDxMO5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE+PkFCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy2ur3BvLu/tr/Bv7y+usDKwsbTwJTCw7/FwsfLyMHDwMDJysLAu7uwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrKvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem1zeHNncF1bXlxZUUVEQ01JQUU9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u726w7u3vLa5wbq6uLi1xMHEybmMnby5wb2/x8C5wLy+xcS9vrmysK64t7/Dx8PEvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbmlcX2BZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucHAt725uMC2tcCztbKyqq6mt7mvi4+vtri4uMK6tLu3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6esr6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2VdWlVKPD8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8Ojs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7e6trbRwLLAt7CdkIx+d4qOn4yMpbWzsre+ubO1sry5vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnJsXmJgW11PSEE+PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27vLi50sywv6yhgGx9bWBnaXqKjqW3s7C2urW0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJuY1xmWFxdUk5NQT5JQkBKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqurLyyuLm3u7+8vtXFsqmBeH5fbIdqY15hepGpvbaxtLaytK+tu7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEJGTUY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6tbm7tbWztbu8v8LNvaCAZFqEXVaFiox8YVuQr8a5tLSzsLGtsLm4try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Ojo6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSYnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PDw6OkA9PDw7QD5CQEE/Pjk1ODs8RkJDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7KyurjIxbOHY1lrllxXZHiJi3lKgrfGubKts7CvrK62trK0ta+qpJ6bnJyeqKieoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moqquepaObo5yVkIyPj5CTkJaVlpifnp6amaaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HT01MQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpa2qqLWvy8emc1ddhI9XVmFmsqV2UGi3vrazqrK0rqqrr7Cys66lnpKYlI+YoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqmxo6WonqCclZOQj5GQmJCWlZiWn5ibmZujmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUlIR05STkpORztFQD0yPzc1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0FEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJeXlqGorK62t7q5ure3u66ooKGpoqCtqMLGmWJaf4p2ZWR6da+jdmZfd5uvtK6vs7Wqp62so5yZlI6RlpeYmZygoqKcnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWZlpuXl5ignpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeHlgYlJVX0hJSUtTVElSUEw5P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5KcnqSorq2sq6uvqq+pnpefpZ6epaS9w5VWaJuXdIuZiW+MfnV9eXqiqrOxsLC4raehnJ2alJeampCOkZWRjI6OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrC0qbGvopmcnZ6hmZubmpiZm5SWm5aYnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVtTWllNUUpOTlVMUkxBNz5CNjg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKRnJihnaqip6Cep6Gln5ySnKKbn6GhwsiRUXOltICEhnhpcHF7g3h/qKmwrq6ssKegn6Kgl5GUm6CcmZeSk5+coaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuKyxtKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCepKGfnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUVVIRlVWSkJMRz1LSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk5+ZqJ2un6eenKGenpqakpmenKKin8fNj1R2iopzb2pgW11cXmVhbo2gqqiqrKqln5+ZkpKTmJiWlpWMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpqqinqJqZnpqqp5+ZpqCfn6eopaSenaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQlZNSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJmqoLGit6Swpp+enZ2XmJWZnpuco6DG0ZNhfHp5aGBXTElLTlBPUVxrg6qvrqmqpqCenqGinZ+dmpyclJOVlJ6emJSFnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGw7zDu7ezqbOtqrO0r7Ouqq6jnauntrGsoq+moaOvsa2wpKSvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cWtrdXJwaFdbUUVUSERJT0g+RUE0RUg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PDw7Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqCgnJyYm5+gm5+gxMiHcXh2Z1ZSUm5XV05NREdhjayupqOjoqCepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DDvsfGwrfDycnCwMa+urS6urS7t7C2sqq6sq67t766uqq3rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtkaG94amVaW0ZLTEVEU0xEQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBs7K4p6Ghq6qhnJ6hop6bmrOda2xwaFVQXHymlXlSTWeUrqygmZybnp6Zl5eXkoyOl5eTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdLTzdPQ09PMysLFxsfKyM6/yNHMx8XHxcG8w8C+vr61vrOtv7/CwsbEx8SuvriyuLzEwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJRENANTU1ODpCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT88QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwailqKytqqCdo5+cnZmslXJtY1dOUmi009OkjaSzrqSfnZ+amJaUkpSWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rS19HX0tTW09PIzMfNzcnSzc7TzMXHycrBxsvGyMjFv8Ozs8jEy8rKzsXKv76/vcHHxMzMyMm/w7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkA8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbO3rK6jnqOinaCkrJh6ZlhTUlh309e/sq+nnZydoKSgnZqUlJWUiXx3cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dPU1NPP0cPQ09bY1dbSy8nO0cvGzdHJ0tXW2dXX09bYztLKz9HMztDM0s+/x8bKw8zMy87PxcbHtr/Kv9HMy8/Fyce/w8PIzszP0M/NysfNuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZXJiXVJcSUpHQUVIST47QDg9NDU4NTs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXBxbG1qKGkpaCiq7WPZ1pUVVZok7mupJqVmKCcmqChn5ucmZWJd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M7P1dTU0dHM0M7T19bT1dDP0tPRydPRx9DY19jR2NLX2dXWzM/Pys3Sy87Pv8XCx8XOzdHQ0cjLzcDKzMXTzsvOyMTJxsbIzMrT09HVz9LM08G5xbGlqLWup5qorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUU0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52mrreoq7fX1NXZ2dHO0MC8zMm2vq6mqqihpLG0f1VQU1Jlk62mn5iWmJqbnaCdmZydk31xZWNjX19hX19hYF9gYF9gZm1wcG5rb3J3d5vMwNLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cbR1MrQ1NXWztLQ2NjY18vIzcTJz8zKy7/Jv8fJzc7Py9DNzsvOzsfLz9DKzsrCycbJzMrL0dLM09HRz8/Kvci5sK67uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVdFO0A8MzM8PTg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj09P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taykrK6+tLDA2NLX2tzWzs3Kw9LPwcCxqqytqqWxqW1NSk5YkqCblZSXnJ6fn52UlpiUiWteXl5hZGJgYGBhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dTLzNDR08rO0dXS1dXKwMrBxczCyMnCzMPFyMrKzsrNzNDN08vFyM/MyMfKxMbAxcrLzc/RxtDOzc3Mz8XHwLi5vcPDvcO5s7K+sbvDxLWqmKWimZaRlZWSi5SNmpGUlI+PlIKJhXhwcWttZ2BgcGhYWGhWTEZMSVBQQjtEPjs2Nzo4OTo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzY/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcXCwb+7tbKxx8K4y9XV2drb2MzMz8jW1cTCtbC1qKGrqq1hSERRi5uNjJiVkJSSkZaWlpCLfGViYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0sjLzs3G0dLPzszUysfLzs/Hx8/Sy9DPxbrEvsbJvcLHyc7EwsjAx83Hw8vKy8/Hw8TQyMbBxcfEvsDHy8vLzsLKy8jHzNDExce7x8PIyMLPwb28v7DByce5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3bnRka2BeZnBhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL68us3NxtDV1dna29jQyc/P0dPIwre8vK6ls6ezZElLgpiOjZaPhoOEhIJ+hYV/c2BcXl5eYF5gY2RjX11dXl9gYF9bWlxga3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+ycbCw8DDyMrJyMrIwcXMxsjLzcnEwsvJwcLL0MTLyL+5wbvFx72/xs/Lw7/Du8nGyLvIxsTKv73Cy8bFxL7FvLy/w8TLxcS8wMnCxcfSxMDIv8rJxsfG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6GlmqOgm5R7dnN0ZmlaYW5sWltYUkRMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8y8/RzMfCw8bNzs7M1c/V2djZz8vSzc3OyMG1xL+zsberuXVXeZaMk5eGeoCFhoB2eHVycF9aW11gYGJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKwtrqysrOyscK8vLy6uMHBwcW/vbm9v7nEysXGwr3GwLi7xMm/wsm7t7u6xcO+vMHNw8a9vbXBvcO6vMa7wrmzvMXEwsK2v7W1vb+6y8O8tbrIur+9y8PBxcLFyMbIxtDGwszHssfJw87NwcXDwL2yt7Cyp6ioubClrbCrrayUeXZ3amRnYGhvY1ZeWUpGSkZISkFFQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8bDxMjO0crKysfNzc7RyNDG1dTW183Kz8XJxcfBuse+ra6yrrCGeJGNiouFeICGhoB+hHx0dGNbXF1eYGBiY2FiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tbe0s7O0urW+srewta+yu8K8wcS8v7q1s7q+wLjHubS7tsDCvLi9xsHDu7Wusra6vrTEt7u1q7i9vb+9sLq2r7a6ssW8tq67v7S2tMW9vsLFwMPFxsjLxcDGxrvHy7/PysfDxsLDtsO9vba5vse/rLW6tbe2jnh0eGZnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzsjFyM3M0MzNyMrIysnKxM/N0s/NxcfBxcHAu7nLuK2wsa+Xf4+QhomKe3h+hoZ3eIJ9dGleXV1dX2BfYGRhXmRlY19fXFteXF1eWltbXV9scG1oZmptbnJ8pMe/uLi1sKusp56iqqeeq62zramrqbSttrGyqa6mrLK8urbDubq6sau1ubu0wrqwv7G9vLu2vMe5wratqqiwsb+1t7yvsKeys7S7vKuttaWutq66sbCquLCtu667uLvAv725wr/Hw8XBvMbBx8u4xcfFv8bDw7nExsK7xsnMy7O5wry6sohydnZraWFibGhZWFdbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bFztLLw8XBxc/HzcHDxr/FxcPDysLJyr/AvcK7tLa2xbGrsK6qfHaTiI+QfHh+ioV6e4SBd29eXVxdXV9gXl9kY2JjY2JgX11bW1paXVpaWlpcZW5vaGZnaWtucoGtubC1rqalp6eaoKSgmpylq66jp6KrqqyqsKOmn6qttLaxvbmvt6+orre0tLy4s7yvuLm0sbzBscCupaiiq7Gys6e8qquoq6yttLOlqK2hpK+psqWnqK2lqLessLK3urq7sbu9vr7Ev7XCwMfIt7/AxLfEwr+7v8TCvsTIzMq/vsPAwKmGcnRyamldYW9kV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdDPzMPIurrLwcu+u8q3vsS/u8q4wcTCtri+t7Kwtr6wqqqqnW6Dg4iLgHt+gH54dH98c3dmX11cXV5fYF5fY2NhYmBgX15dXFpYWltbWVhaXF9ma2ZlZ2Vpa29yhaqlrKagnKGllJ2km5iSoaOqo6KfpaWopq6gnZukpauyr7a3p7Csp6q0qrS6sba1rra5sa+6ubG3pJ+jn6axp6uouaqkp6eop7KtoKemn5ukpqyen6ekoKCxra2ssrSytLC1vLa7wcGyur7DwbK5ucKzwL2/tbi7vb68wsfEwsO/v8Sgg3dwa2FmX2tvYFRZXkhOZ09USEVKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3Nzg2NjY7Ojo7OTs7PDg1OTw6Pj5AO43ItbW9uLrAur21oJ6VnaGmurars7O7s8TPycvCxri3x8HMv7jKuLzGubTFuLTAwq64vrSup7G3saOjpo90hoaGgXx5dXRvbWtqanFpXmBdXFxcXmBfYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+Inamgl5WaoZabopiWjZ6hoqabn5+jpaKonpuim56qsK2xtaKpqqmrq6S0ua23sKyzta6yta6wqp+dnqOisqSmqbitoqamn6isqpmfoJ6ZnZ+lmpqjnJudr6mrp6qrrK2wsrivuLm7sLa7u7qrs7O5s720trGxtbS/tr3AvcPBuru9l4N6cmtfZV5kZFhUV11JV1xLUEdJSUZBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfGz8jIwMa7u8TDz765yLm5v7izwrWyvb2uvLy0pKGrrquZoJ+Kf4aGf3hybnBua2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRlZWZmaGlrco2onZSUlJuYm6GWlpGcoaKonZudpaaippygoJqYra6trrKgpaKtq6ahtLCxsayor7KnurOmtqGinpujoa2joam1qqKjpp2lpqOWmJ6XmZqdoJqXnZycm6yhq6ajpKatq7OzqrSwsqqyubSvqa+ysrO3s66prK6yuLC6trm9v7eysZSFeXVlXmVeW1lWU1pVS1xRTElFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7OdpaOYpbHCtba9rbS4wszIxsDFt8LAx863wMS+tLq6s8C3s7q8r7W3saGdp62jl52Yi3+EhH94b3F0cWlmZGhlY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFdWV2FkZWNkZWRkaGp2opyUlI+Ulpefl5mUmJ+eoZyWoaGoo5+eqZyamqunr7Crm6Ojt6qgn66otqmmp62wpLewpLefopuYmKqmoZqsuLCioaScoqCgk5WhlJWWm5iXlpeclZ+pnamjoZ2jqqqwrqi0q6qmrbKwpaqusrGwr66vpqensq6xtK+8tLq3rqOUgXl1ZF5hVllXU1JUS01eTFBLR0dMTEU8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunaeno6q7wL3Aua60uMHMx8XCw73GuMjMssHDwq69vLa8vba6u7OztKyenKSsl5SNkYWAfXdxaWxydHBpaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbY2NjYmNiY2RmaoGWk5WLkZSTm5mclpaboJyflaCfpqWkpqefnJ+moKqvpp+io7aooKGiqLShpailsKWwray1nqCdlZSpoaKUrbGxn6KjnZ2Ym5OLoZSRk5iYkpeXmJedppunoaKZo6Wlq6SlsKelo6urraaorq+uq6iqqbOlpqyvtLGuvLWxr6+gknp2cmRhXFpdWE5MUkhSYU1XUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6lp623u7zBxbqxubXEycnAw8bGyLbGxLPCwMasuLi+t768vbi2sLCrnJujpo+NdouHf3VuY2JmaWhmaGpnam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFZVUlVSVWBgX2BhX2BhY2RpgZOTiJCOlJKTnJSVlqOZoJacoKWhraakpKKjopyqq6WZnqWxqaCgnaWrnqehnq2tqamuraGhopSXo5uckKupsJufop+el5mTip6RjZKTlpCYmJOcoaKdpKChlaChpKabo6uloqSqpKuupa2yqaalpqa0pqmorbO1tLm6r6qsnotycG9gW1dWVlJHUE9IWlxPUklUS1NMRUZJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2Ojg2OTg5ODk7OUA5e7W0rbS7sq+rsa2dqKevubmzwMi6tcCvxsnNu8HKzMi1yr2xvsTKrrK5w7e9wr63t66wqZmeoJ+KhXWIg3t0aWlpbGdqbG1ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXl5eX19iZG2Oj4SRh5CRjpmTlJKcmqKcm6CnqKqoqqaopaOYpK6klJmlr6mfm5mboJ6umZuqs5+lpp+io6GUk5uWlpKpqa2anJ+hoJqUkIyZjouQjJKNlpWQnqGgo5ybopWboKKgmKKoo6Koq6Crr6Sut6WjpKKsraqoq6+yt7K9tbOrr5iEc3NoW1hYU1VRRVhMUVtZTVVOUExQUUlOSUI8Pz9BPzw2NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zrqiztq6pp6+tm6morLe2rLvKu7a/rMzHxrnBzs/ItMW8t7vEybKuucG4vsC9trmqrqSanJ6aiX93f3Z3bm1obW5tcGhnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVUU05QUVlaWlpdXFxeX2Bkfo2Bi3+MkIqSjZeRl5mioJufqqmmrqqnr6OnmZ+soJWWpKinnZeQj5qerpaXp6qZn52UpaGekpCTkpOVp6qlmpmZnZ2WjYyMlIaIjYOQi5KVkaCeoKOXlZ+VmqCinZObpaWnqKigsbCmsbynoKOstKuup7C1sLm1wLGtsauRfXFyYlZTVk5SSUZWUFJSTExYTUpMTlJHTUpBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s62msbeqpqKwq52qp6mysaS2xrS5urPLxrq7wsvQy7G4uLy+wcSysbO5rra2vba5p6ihop6emIWGeWpnbG5xbnFqcGtkZmdlXlpZWllaWlpbWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY2HkIqXiZSUl5uZnaian6mlpKqdp5igpZuSj56impeWhYSSmqOPk6KclpaWiKKampOLjouQmqSnnJWVl5uQkoeUjoyBi41/kIqSkpKhmp+ilZSYmJWipZmMmaSmqKahn7SyqLK3oZ2it6yqraSysqW1u7Wrq7GjiXhybV1OUVFMT0NNTk5QS0ZOTkpKTk1RSU1KQUdMSEdDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyNzc2Ojk5OTk4NDk4OEE3d7anpLawpKejqaWgqaWks6qissO1tbKzxsa3usPKzMazrbu+tbjBsK6qsp+osL2ysqSfoKWdm4t/inBeX2ZycHZxaW5pZWhoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFlYW11hb3N2cYWIgoiAkYSOipSRk52gj5qboqGjmKSWoZuVjYeYmoxzjYJ9jZeWhZCZkJSOjnuZjpyMgoqAiZifop6Qk5iWhI6Ck35+dImOeZCHk5CQnZqZmpCVkJ2OoqOOiZqgoaOjm6K0r6yvrJ+ZpbimprGhsa6csLuqqa+qmYJ2cmJVTVJPUE1DU05MUU1CUFFISU5TTUhKSkNKTEZLSzw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMTc2NDc4OTo6NjU6ODdBN3i3oqO0qKWmqKOmpaamprOnpbTBuK+0sMnEt7nBzsW+s627wqyuxK6po6iTn6i5sKillZyem5aCfYRnV1ZfZ2ZpZ2huY2ppZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkhOU1NTVFVVV1lbXWlscm1/hXx0Tlhyj4KXho2cl4uTkJ+XnZWUlpSOlol/k4lfO1dve4uUiYCLkoyQhoZzioSWgXmCeoWUnZSDlo6Qj4OGfZJ4cm+FjX2JgZGNj5eZmJOKj4mch56Xh4iWnpqhoJenr6mtqKiel62zoqaumayrmKe0oqmto5N+cm1fW05TUlZMRFRKUE1MRk5PSUZMUU1LT0pJTVBGSUk8NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6mnoqmwqKe0wbmwtbDHwrezvc+/ua+vtsOoq8aqpJ6ahJWdtKafnoyal5SNgXh7XlBMUlVZWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbXBpe4J0UEJBf5WRkX2JlIyEio2ajZWVipKIhZWGeIh/YEpRbniKkYR9hI2JhX9/bn5/lHd1dXeEjZlwUY2Iiod8fniTdmh3hoh+ioiVio2QkZaLhIqIlISajIGEkpqWnpyUpKOoqaWknpuwqqGkpJGmqpahqZyipqiJdWxlXltIUVFSTUlVTVNJTEtPSUhHS05MTVRLUVFPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7aboqedn6Guoaeopaeor62qtry2uLezwru2qLrIuLaoqLW2qrO+qJ+Wj4CLlauZmpCDlIqKg312dFpNS01OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4eBfIWMkoGSmYuPe4aPgHV/eHNudXB0jY2BeX2KqoV5emh2e45wcm14gYuMknh6gHuAdnJykndodYSEhIR7lYmIioyKgH+Ei4x/lIN7gI+YlZyVkZ+dqZ6foJ2gqaWfnZiNp6SToJ+Wnp6kgHJnYFxcSlZPUUdKWFJPSk1NUkpKSk1QSExRTFJUTEVIQTw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc5NTY3NTI1MjU3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumKOhmJyftKmvqaWtrLCxqr20sru4tru1sqC3urKqnZ2sqaizsKKbko+VgY+ekZaEe41/gnx2dW5aS0hISEdFSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedYN9eWd3jZeYjo99Z3mBdniAiY98hJiSgXKHj3x2e29rfq18c5CKf3uGkoF9f3RmdnyGbG9oc3yJjIeAbHlxfXBtdY9xaXGAfo5wQ4uEgoOFf3d3eouFfYt6dX6Oko+YipKam6OWmZ2anZ6inZaNiqWbj56XjpaYj3ZubGViWldXVFFKU1VUT1BOUFZLTktOT0pRTkhOT0tFQzw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegn5agpq+srquoqbCvsau8uKy7vrmzraibsKesm4+WnKWppaGYmpCGk3qKkY6PenWCcnp2cHFvWktGR0VBQENESUxMTVFSUFFTVVRUVVZXV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWJ7eG58eYiQeXyLhW9tjJF4c3hqaoCCcpaRi4F9loBJk5huaHd+gmxpY2x5hZCShmtzbHxucnuGaW1wf3ONiYSGen1+e3ZvdHOFgnmBd3B8joyKlIOWl5iakJOVlpmXnpeMg4mfkYuSjYaQln5taG1ubldVV1RSUVlPUlRUU1hVTU5ITkpNTktDSE5HRT86ODk7OTk6Pjw5PDs6Oj0+Ojg6Ozk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNDU2NzQ4NUhBODk1d5mRm5manqWtsKKsqqi1r66stL+rvMK/pqKalaSXnY2Ei5ShoZmZkZSLdI56gYeOinhzeW91cGpubltORUZDQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplfnBtf3qLiXaBiIZ0bJqRdHN7amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3GAfGdxcXtuk42Pe3N9fHFwbnVtgn53eXRpeYmCiImDlpOSkIuNkZSUj5eOgHmIl4iGioaAkId2ampuZ2RXUVpXWVlbTVBVVllYTklIRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsKzU3NzU0NzhpTzg7NW6SiJqRmZakqK6esp+muq6rsrDCsbvDx5uWj5WZi42FeYSQmJSNkIyPhnGHgnSIjol8c3VycXFocmphVEZJQz88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7OgcXx4bX1scoOBhYF6hIaGeXKglXR4gHN1lIc1cZ2onY6hoYSihXZwhnyHfHOMrY2JgGhmYmlucm1wg3Vpb1h1cI6akndsf3t9bXFtcIB6c3ZtYnaEf4aAhZCRiouKkouRjIuPg3V4i4+AfoOAfo96cXBva15aXF1bWVhgXlJOW1pYV0xISkVKRz9DQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSh5aRnqSnnq+VpbWprbGuwbK7wcaXkIyUkICIfW6BkJKJg4qHj4V1goRslomKfXd5eW54cHhmal5JUEc+QDc0NDg7Ozw9PkBCRUlMTExNTlBRU1VVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx9hYN/jH52opl5foaBhZmEm5xhhqqfnYqCkI56d4h+iYiOc4qXj4N7XGRxdHp7d4psZ2pieW+Fj4J6boF3dIR6cHR5d2tuaV13h32HfIiHj4CLk5eDjYWNhn1xhH+EfHV3e32JdW9yc2VmX1taXVNbZl5XUVVYW1VHSkpES0c/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XI14in+UjJKdnZ+mkaCroLGor8CxusW6lo6RlId6hXZrf4yRgn2KhI6MeIOAc6GFjH5+gn9wgH56aXdrUldMQEUyMTEyNjc2ODg6PD9CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHF8j4x6fImGfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSRqIeAmJiKnHNsfIGGh32OaGdoeH5uhYaChXGEhUdrgHdyeXZobWtfdn2DiH+IhYx6lZ6ciouIkX97dYt2fHdtb3d+f3JycWtaXFxbY2NYZmVbVU9QVllQRExLRk5JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWIkY+Wl5KXoZ2soaa4r7O9s5eNkouYi310cH+Jkn59jIKSlH2Gfoakh4h/goiFeIeIfnOEeF9jVktCNjAuLzIzMTIzNjY4Oj0/P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/OTQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgYSChZGTfoWJkYGalYKhoZeVm5qlrZOau7Gnu8fDqIuMoaWPlImBkXtyhJ6fkZx/doWFio+HkGlob4OAdIyGhItxhoJ3h4B7doV9bnZ1Z4CUj4aJiIeIh6GropaJjph/e4KJenpvZ2t4fnh9cWpjXVpaXWlcYWZfWU9LTldSUUlQS0ROR0NLRENBRENBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudXBneIN7gIyAgZCPi5qapJyhrKarr7CXkZGEoZSEeHd/jJR8f5KGkpV/ioCSm46DgIGLi4KJjYN/in9scGpdQ0E0LS0vLy4vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyNoZ6ZhJOFgo+in5SZkoSKhY+YkZZscHWJi4GVjI2Pdo+EcWyFgYqWkoOFiHKJoZaGk4qPj5altambjZWig4eThH5/a2prfIB/gHJgXGJeWWZqXGtrXldLR09TUU5NTEZJUERETkZCQ0VHQj45OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5oWXCDcHWHcXaShn6XlpqUn5+cp6CqlpOYnmdlpJp+hJKReYCSiJCSfYqFmJKRgoCAi42JhZCHhIiFeHh/Z01SPi8uLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVJTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6imopmhl6KVnJ+onqmrn6isqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4SUkoacoZqamaeRkYiVopqad3p+lJeRoZKWl4GUnnt2lZKrs4mNl6B9lJ6cjpOWmaSiprawnZGZqIiXkI6BiGxzc3x+em9nX1tfXmFmY2BnZ1xRRUpLUE9JSkxGRk1DSExGRkNCR0RAOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBxdWBufWJ3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYeYjXiCjYqOjHuKho+QjoGDgImLioSShYOGiIGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1HR0BBQDg2NjI8OTtGSEdJSU1PUVlthpB3lYujp6q0vbilrqysp6i0rLG3srKtu7GzvpyzxKy7ycu4xL+4paOwsqytq6SLlpiFpqagopeBppmNoqqopIeFk6OgoKqgpKmOnLGLlaOnt7uboKOwk6Odo56RpKKrr62ztaKVpauJmoqTipV6e36EfWZfZ1tkYV1jY15mZl5bT0NJSFRPRkhMRktIRUZIQUtGQ0ZGQTo4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNYanBYeoV2gZSFiIKbg5KQjZLayJ2Wc1aXiI+InI98hoyOiol6iIKHkY6DhYCLhYaHkoaChImGh4eHcW5hQEU2NDwyLzExMC0sKy0xLy00P0RBTVVRUlRVVVdVTVtQR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcfDq7PFtqyzwLO4vra/tMG2u7ukuMaptsnHtr65tKijtK2xsZyakpqfiaevqqSVdp+kl6GrsbOYlqmtqK61u7K6rK+1orGssbW8t7WutaCnp6Oom6mwrbK6uLinnLepjaWPkpOghnmCgnRYYGNVZWFgYl9gZV9aVUpERUxVUUlKSkRKSEVBQEBLREFNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFtaUWNkV3p1cYKUfYWGk3aGfoCNe7+7o7yCtJSTjZuPhIiPkomJeYaAjJOMh4WBjn+BiY6Gf4WIhYqHkXp5bl1WQEVNPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcV09fVUlLSkFAP0dLRkVEOz5AN0Q3P0JKSkVHV1RQXo+lraOxtMO2uMHMyba7xL2ztMG3uMK1v7C3dLG0prrFpLDGubGzsbSopLW2qrGgopabopKlsa2lraynpJigrLK6oqiyubW7vsy/xcW9vbPCt7q4v7e6t7mtrbGmsaqtvrC9u8LCrJm7qJWtj5iYqol+gnppV2FgV2lkaGRWWmNZVlRJR0dMUUdESUpBSEQ+P0JCS0BATEM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlFMQUxSV1RaVlp3anB/j4SBjoVuenN4iGK4oZqjiZWUlpOUk42Ql5KHh3uGgY2VioCEgYp6fIuHhn2KgoGLhJV9eHl1ZU9cZEdFTDpRZGFbXlNGPjtIUERaZFFRWVhaZ1pUYGFNU09FQT9JSkhFRkFAQz1FNkI+SEdLTVNaVF6Ur7i1urnJwLu9ycy7vcC7t7W8u7e+tbqyxmB1sqWxmp6rvqqlqKuqo6KytaGrp56Vlp6Yn66lp6aln6SToqews6iysry2wb3TycnTxsLFzMLKw8C+vb+7vLe0sLm3t8O6xr7DybCeuqqirI+lqLaJgX5xXmFgXFZhXmdlUlhhVlJVSUVFTktAPkdEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3MzUyNj84QD5HS1JUVFJQT1FSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdZ21scZCNhZBzbXNyc4jVwLWZoI2VmZqRjpeRlpaOhod9hoOMlot/g3+DeHuLhId7i3mBioKXf3R9emtlcHZZXVxQZWViYGVkXVtYV1xNZG1VUm1uX29fWGdlVVlUSkRBS0tIRkhISEhCSTlEP0hLVFRWXVpck7nAub23xsC7ucrLu7e6tri5s7i1ta62tplkdamerXBeoq2cmKGim6Seq6WUn5+QlI+WmJeon6WfnpqZg6SdrKSqsK23sLy41NDO1s/JzNLMz87Kx8C/wsq9wb3CwMXExsq/yc+0pLuxtbCbrLm9mn54alxfW1hdYFliYlFbYFNRS0NCRUZFPEBFPkJIQkBDPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpYG+XkpGUbmxvdHWHs6yhoZ+LmZyZjY2VkZuShYqKfoiHjJCMiXyBg3N7ioOFfIp0goqGlX9ze3hsbXV8aXNlaWxpZmpqaWBmaWhtWm10l62kvIeHZ1tvaF1aWVRISk5QSktRTFRRSExBSkdLUF9fYmdqYpe3x7C5s7u+trLEx7awubGwu6yzsaert6yNtqeenKeaTpuejY6glpGmmKWVipOTiJGJj5CSnpuhmJuVloeemaaarK+or6ezs9PU1NbRy8/T1c7Tz8zGw8rQv8rJy8nSyM3Nw9HSuLDEvcS6pre7xKKAbWJbW1xXX1dZZVlQXFdOUUNCSEVCSDtBRD5BSD8/Qjc7RD5ASD00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ5PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZldzkJCZg2hxb3l5g6CqnqaXjZubmIuNlZGajn2Ji4WOioqLkIh8hIJwf4eBhnuHcoOSi499cXh1bHB4f3J7bnhzbGmAcG1jaW1weWl3fX7Lv8Lfp21jeG9kW2FgSlBSVU5ZXlBdXU5QTlRRVVRcbm53g3KWrristKiwtqutvcCxq7WmpbinrK6grLSkj7Gum5iYjJGUkYSPm4GNppGciYOLhIqJhIqDlJWYl5SbkZuXmZmenquspKehrKzO0tXRzczS09TQ1NHOyMPU0cjO0tPT1s3S0cXS1sbAzsjIw6m/uNCdeGxkXGFcVV5RXVpOT1NQTkg+QUZCQkU8QEI/RUU+Pz86PT09PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYeGi3dtd3B9foChnp6hi42Zk5OMjJOQloV5hpCQjYuKiJGHf4J7cn6Agod6hXaFk5GJf292c2xzfHx3fHOCeHFrgHJyaW9xenlye77Lmn6MsYN2coV3aGFqXUNaWltXZmRYZWtUWF1cYGNdY3h7f4uBmaqkpKKgoammqrG5q6a0o6KtoqOtoaexn4mmm5WTkYqSjoiClIlrlaKNmYSBhn6Rg4OTlqyLlY2VmY6FkpCdl6ewoqCgpKSox83Px8HL0NPR1NLO083G1tPN1NjW1tjV19XJ1NrNydfW0cqtxMPMinFtYl9eV1JYUltPSkdJSUpAOzo7RUJEPEJEPkhCP0JCOzs5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX5pc3lygomBnZWelIWLlomOioiOiI+AeIOUmYuNiIiLiX6DeHN7fYSHd4B7h5GXgYNud3BtdX92eH10hnx5bId2dW99doR1eXudtYw8QYrGpX6NfGplV0lDZWNmY2hqZG95W19maGtuaW6AhIiRjJ6foJ6Rl5ifo6OmsqSls6CipZ6hqJ+isZyHn5KSk5GLjouGg4+EfpybjI2ChIV6lH6CqpWjjJKKmJKLfZeKmpGrs5eam6ecp73Dxbm2xc3S0NHPy9LLydTP0dXa19fY1NnYzdjbzsna2tLWv8zNtXZ1bWNcWFFVUFlVRUZKSUVFPTo3OkBBQzpHRUBFQ0FEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYnFxc4aNfJeRnYt+h5KCiYaFioKIfXmFl5eIj4OHhod6hHlxenuEhnZ6ho6NnXqMcHxvcHp/cnuAcYSHgG6OenV3fXyCdX98h4mwdFmpwraMkoFwbmM9XmhycHFwbnh3gmVpb3J1eHJ7i4eOk5KblqCWiIyTm6Cbn6qfoa2copqZn6Wen6yZjJqMkZKOhX2Ih4OFi46gmZOIg4d+bZl5hJmGiJOMjZWMhnubiJOPrquUlZeemKautbyorb3Gy8jJy8vPycPRytTW2NfY19Xb19Pa29bQ29rR1snVzJR3eWdnWllPUlNdSEJFSUk+QT49Nzo9Pzs+SD1AQkFBREE+Pzo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJma3aAiHGRkJuAeYCOfoOCgoR+hHx9hJiOh4x+hoeAd4J5bnt7h4J0epKejaF2j3WCdHWBfXSAhG+CkIJvkoR0fIGFenaHfIm4xqXDybeBlZuPeHBlTmVjgnqBd4aikIt5eXd7hH98hHZtlJaUlY+YkYOJj5aal5emnJigl5+TkpejnZmrlpGRi42Sg4yFiYiBhpCRnpyZiYWLgYWXe4iJn5eQiY2Ki4J8oYiQi7yhmJOXmZyopqWunqe1vsDAucfJzc7FzcrR1tXU2dXX29TX2drb19va2djO28eFeXdlaGNfU1ZWVU1LRE5EOz09PDk6PD45PkE2Pj9APUA+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0hQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZWFdW2h0enlsiY2Sd3Z6inx+gH9/fIV7foKRioWGeoWIe3V9dW19fYZ+dH+SnpGfg5J8hn14j355i4pvg5uAdJmGfYGJhXx+kXuQqY6Qw6C8jJyjnH2JhH2JcoyLf3OmmpyZlIV7j5GJhGlHcaGknYyLkJKFiIuRk5WPnZqTlZGXjYyVn52UoZSSjo6Qi36Qj46LhIiSlpqfn4mMlJGdkIKMf6aZiIWOgoaEgKSGiou4mJ2RlJahp6Cdnp2jrra6tau/xcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u3d3d2aWlkVl5aU09OSERMQj09Pjk5Ozo5OTw9NkA+Pj09OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYGOinFzeIp7e399f3uIe317i4eDfnWEhnlzenRtgX6EfXeGm6GbnpSSgIuHf5iHgJySboiphXqgi3yQjoOIhJx+mpGJjaOin5Cjrp+LkYuFi4GShldyrYufrJyPhJickJCOXIOikYKNn5OVjIeIjJKTjJSVlJCMj4qIlpudj5WWkYuTlIaAi4mSjYqKnZaZo6KGk52VoIqKiI6ckIOIj4CDh4WkhYuQs5ickpSXoaGemZKbnaexuKylvMHHzcfGz8zPzM/Xz9HUrtbV2NrZ2trX1tnZnm57c2ZlW1xXUlVXQ0BJRD8/Pjo0OTo7Nzo7OjM7PD89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bGJ+koNvbXeLeHp/e4F9hnx7doaFgHNwhYJ7dnd2dISDhX1/kqain6ailomdkJSXioqnl3KKso2Ep5KEmZOEmoyjlqCYk4mbnaGSqK+fkZSQjo6IlYtujbeEmsTIsp2ipZudmJaRspBkpM3IlY6Gh4mQko2Nk5SKhYqKhpaam4+QlJOHlZiEgI+LmYiOkKqXl6SjiJmelpqJj4aXl4uFj4yBf4aPpYiNk6iZl5OWmKGYn5mTnZuisrSlo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoFxfWdiXV1cTklUWUFCR0Q7QT04Mzc7PDo4PTY0OTo8OjcyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgUZ2gY99fG1+iHh6fnuCgoN/dnaAg3xtbot/enx4eHyEh4p+i6Ozp6Oqs6GWp5+lpJaVrqKDkbiVkbOajKGhjKSbsKOknZiRp5anmayvpJeUlpWQi5iZl6HAjqPJuauco6atmZKbnbKdhYWoopyYhYmJjpWMi5OPiIGGh4mTmJWMi5SThpWYhoSRkJx1kZiylpekoYidmpOQipCKl5uJipaOhn2MmJ6JkJCcmpmTmJeflKCdlZ6boLGuoqS3vrTFx8S9w8O/xs3KydKmzs3T0tHW2NPQ2LpxeHRbX1RfVU9ISk5EQkNFNT46Nzc6Pzw8Nz00MjY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER05bXFlKZmA7SISLenpuhYZ6fIR5gYaBfnB4fH59b3KNen2BfHiGi4mGhJKnu6yosr2vpK2zs6ijobCsipq1naK4pZWtpJeprbinpKOfmqmXqaOvsKmZmJyUlZGXoJiau7uuyqFqtrirsJSZn6Osk5e9o16qsoOKio2Uh5F8jo59g4aOj5SViIiTloyQlo2LjJeYk52ZtJeWq52LnJSSjpGSjJibipGekIuJlZ+hjZSNmJmckpuYnpShoJScnKWvqKGks7irwsjEtbq9u8XHx8LRoMbJzc3F19bRy9Shb3lnW1lTXVBPRUM+PENBQjg/ODc1P0c9PDY8MzUzNDU0NTRCMzk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEdiYGJwSkCLin+Bc4aHfYKIdYOKgn9tfH19f3B3h3eOgod7jY+MhoyZqsLAr73Gu7O0wLy0rauztoyosq2tvaubu6Sorbm4q6amoqKkoqmvsrGqnZykmJuYl56ipqWSpLqvqcC8ra2yuaakqH6IhpytvLCDjIyLkIOPg5GOeoGHkI2NnImIj5eNi5WWlJGal52omrGakaycjpqPko6VkJCWl46RoJGJlJujrJSWj5ScnZOgnZuYoKGUmp6npqSio7Czp8HGw6+wurbFxMK/zabHxMfDvNXRzcXKh3JxYFpYXlpMSkJLQEZHPkE/Qjs6ND5BPT01PDY+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdEP0NGXGVHYGlnWl1ck4yMiHuHjIeDjHWGkYqBb357gX9xfoF7lXqSlJSYkJOVp7PGyb/CzMLDuce8u6+rubuXsre6ssCupcCkq6+7vKqtq6OjnqerrrSwqZugqpuhm5afsLWni6O6u7bBvKyonLKlpKiUhY6pxMOkgouPh4iEhpWUjXqEjZGPkaKMjJSRjomXn5iTmZWYpqCunYyqnI6Wj5KRlZWNkJWRj6GUhpefoLKelJqUn6GYpJ+aoJuglJiepaOmpqSvrqW/xMOuqLe2ycO+ts+yxL/EvLPRycjCtXN3a1tWWmhRTEhDTEtLSkFBPUNEPDVBRDs7Mz04QjMzMjI2M0EwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmVZTmVcZlRjapmNl4qMiJOQhol5hpSQgXKAfI1/eIeCgpB6jqGWqJqamLq+x8jJwdLJysLNvcKzrbu+p7q/vbvDt6zBqayzu76qsKqkpaSsrrOttrWgn66fpaKYo7O9qZuovcGkt7ewq5OxrKusl4eaqaelkYKMk6WViYF2ipF6hY2SkJ6fk4+Ui4+NlKOZlpyUlKOeqp+RpZqMj4+PlZaIfI+VkpKjmpWgopy1pZCel6SjoqWenaaYnpaXm6SjqaeisqyovMDEr6Wyt8zAua/Es7u+writwsPCwJhreGBXVlpaSktNSkZEREhCQkFETDo0REg5OzQ8N0UuMTIzNTJCMjZTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Ol46ekomKf4mgk4R4hX+Vf3+QiIqQgJahma6mpJjCvcfDx8XTzc7Ny7zCt7C5vLS8y7zDwba2u62zv7m8rq+ooKmotq2uqbK3mp6soqehnqu3uKqlsL/Fsb25s6eqtbOtrpeWpayooJGOkrLFp5WOfZKVfYiSmZCqmZiTk4+SlZOlnpKdmZSho6KcmJ+Yi4yPj56IWpCWl5KWpJllmKOes6WWoZasrKqnm56ml5iWmJWgpKiln7arqbm7w7Sls7XLwLiqtqyyuriuqLi6vbiCam1ZVlNUTUVKUk5LP0FIRURIR0c5NUZNOz44PUBKLjMyMDI1QjU1UFdOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz1AQkZCcEVpSVJlYkxGpZScl6KXqZaNkYOHppOIgoeCnIODlZCQlI+aop+vvq+hxrzFxMbGzs7O0sq+u7axuru8v8+1w724uLeysbWzuLOrppyrrLmqqaevr5ejrqSnpKW1wLCrrLS/w7rAurOnubW4s6+Wpa2urqSLk5WhjXTBmn2XmYSPlpqMsZWbmpWSk5mZpaOUoJuXmqmcnKGgmYqNkJacYEqWnJqVmqWWVJawn6+cnqSUr66rpZqgpZSTmZiOnKCnopm0qaqzvLu7qrCyx7+5pqyrrbGxo6GxsrSkb2xkW1lOT0tFT1BRUTtHSkhHSUNDPjpLVT9BOj1FTTA3NTQ0OkIzNE5XTzxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqXmaCiqK+ZkZeHi6eWjoiThZ+HhJ2Xjp2hm6Oktci1qca6wsPHysjIzM3Gvruzrrm4wcHNtce6wbi1urCur7O0pqSbqrS1qqmmrayapK2lpKisur+oq7a3vsK/vrmzssSyub2so661rLmmiJuXppt2v5+EmZ2Ok5mai66XoZyblpWbn6GpnqefmZqqmaGnnpiQjZGdg252kqKalZ2inpCusqKqlKiql6qto6OfpaiSkpmciJScop2Wsaepq7q2vbOyrb65t6Cjp6ilp5ybrKmpjGFkYF5RSkxGSE1JVkw9TUROSktCQ0Q8UVY9QUFCRE8xOD03Nz9CNzVVWE4/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLVJgTVVIf2VeSEWrlZyhn7uvmZSfi5Orm5GSk4mrjYein4ykrZSjo7bGvrTAusLCx8jFws3Iwb25sq+4tMDCyrXFssG8tLqqqK2tsKOjmKq0u6appquqnamup6Oqq768qK28tLi+x7y3trjBsb7BtKm1t6u+pY+imJKioLyfiZqgmZeeno+3n6mcpaKbnKGaqKWzoZudppyoqp6ZlY+Um4uXiYykopSdop6gta+lpJKvq5mrqp2dpKOokZWVn4OPnp6blamkoaG0tLq1rai1srOenKKlmpeVmKqhnnZfW19dSkhFRk1RSE1FRkdCUkxJQkVHQVZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUNANT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTlnXEZDQ5xwYkdFp5ekn57DrZuXpZiZqZyWm5uPqpaVp6aVrayZoqu2xMK8vrfBwsDHxL7Nxru9ubKwuLO/wsi1v7C8tri2pqSrrK2hoZqqqsWipKmrpp6sr6uiqai/t6atvrG4tse2tbm4wLO/wre1s7SvvqOXo5aUnJSuoJCho6Wjo5+QvaSpnqirnZ2gm6afvaKZo5+iqauhnZaNlZ6TnoePhI2Tn6SgnrWspZuVsaeZrqaemamdn42YlJ6EjaCam5OlpJqYq7G1saulqq2snJigoJKOkJWonpRnYlhgXU5IR0pOS0hFRElBPlBIQDxHSUhbUk9LPUhPVTRCRjk+SEc1Q2FbS0NOUlVXVlFYVFJVSUA4UlFQTTpHQTRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE0NkA5Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E6blJGPEt4ZWJWTKKao5yexayhn6yena6gkqOflqWfpqqsl7axo6qztsTEvb+1v8K7yMK+ysi2uLW0sLOzt8HFtr6xuLW4tZ+mrKqsnZ2epaTBpJ+qraCkqa2voqaovbWlsby5trbEsrS4ur+zxMG4uK6ztbWjnaWVkpShrqCZop6oqKujmsKtqZ6srZubnpmmob6hnaSYq6uspqKZjZqfkp+Jjld/lp+moaC4qqaTmLWjn7Ggn5qulp6OmJOdgY6fl5WOoqOWkKausqupoaKlpZWVnZiLj5GSpJ6JYGNZY2BLSEpKTkVFQUZKPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JHRTY9dWVcS06en6GZnsOopaK0opyyqJOrpaCjn62prJ27sKistrHIxcHCssLDvcbDvMTKvK+wtq2wtK+/xLS5sbC5tKyZqLCpqpqdpaGowaybrLCcqqOusamkqL22pre7vq+3xK20s8PAs8e0u7estLatqqKmlpWVpKyin5+aqKuwr6+7sqagqaiamZiToqS5oKGkk6+vrKWnn5KhnpWej5CNlZ6aop6ntKamjJizm6Oump2brZCek5WTmX+RoZaPjZ+hk4umrLClpqGcoJ6SkpqThYuRjZyef2BlWmdlSklMSlJCQ0BJRzs7Rz85OU9NVV5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0n6OfnKDDqaSqsqGjtKqWs6ynoqSyrK6pu7GtsLW0xsDEw7XAxL3JxLXAyMG0q7Wor7isv8Ozt66strmlmauyq6qYn6aXrbu0m6ewm62grrSyp6u5sqe6s7iyucCqt7LEvrXGqL+vrbe1qaesoZeXkqaloqKYmKWvuK6ytbagn6ikmpWVk6Sgt6KkpZavsbKnqqain5uam5aXqJ+gmKGer7KipoyXrpikqpeZnqSQmo2Tl5mFlZ6UjI+cnZOLqamqoaegmZ6VjI6Zj4GFlYiUn3hiaFxqak1QTU5UPUNBTkM6Okk/NzdST11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlwaFZDV0aMeWZDO6OjnaGmv6eor6+hqbWrnbqxq6OqtLaxsLm3sLe4uMS9w8e9vMTBxsC4wMbAuam2pKy7rMDCt7eqrLG6opWtsa2ylqWnkaq5qZ+msJ2roLC0s6qqtratu6yzs7m3rLiww7u+v6bDq7C3rqmrq6aemJmroqKhkZehsa+zrLC5mpypoJmWkpemobeppaOisLG0q7OorJ+boKCbnaWdopedo7Owmp+Pk6Wan6ialKKdlJeJk5aSlZack4iQmpmUjqiopp+jm5ebk4aOmIt9jJaFjppqaGxgbG5XUFFaVEFDRVRAOztIQTc6WFBkXlBWV0VZX11NTFJOXktKPlpjXk5IUE9cVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPSonKz1ccD0+MS4wZFpkQDE2NDdnWWBGKD84bH1nW1Y7iXtjQz2nn52iqb2iq7Cro7G4qqW2tKygrbW9rrO4u7q9trbAwr/IxLnEwsDAuMS9wbevtaert7G7vr+0qa6xtp6Xq66orpemqI6nu5+krLOerKKxsLOsqra0tb2usLG1rLC1ssG7xberva+xuKytqqOxpp6lqZ+kmJCZn7Oqs6uqs5qdp5ualY6gpqW0rqehra2usae0rbKqpJyfqKOelaKZm6i1qZeZkZKemZ2fnZCqnZaXhJSWip2ZnJOKjZaXmpempaKgnZaVl5N/j5SFe46Sg4uWZWxyZ29xXkZZZlZEQ01YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYFUxNTA9YFZeOClDM1lUXGdLNox6ZkxApJqhpKy2pK2qpq+ut6qvtbqnp7G3xbext73BwrW0usW+zMW5wsC6vrnEt8C5srSrqbq2u7m+tKmtsLWYmKesqqybq6uPq72dq66yo6ufsK20rq22srm4qq6vsqi1r7S8vcqzqra1sbSwr6ehs6CbqK2gppaWmpqyo62gpa+XoaSampKOo6Wns6mhprOsqbWlr7G1r6SZna2nmpifmpmrt6KXk5GOl5yhl5aUq56akn+Sl4ydnJmWkImUkp6ZpaKhoJiWkZOVeoqPhXuMioOLkmpteG11e2FFYGpZSUhZWj17SkZENkFiVGlbTVxhSltdWlJSUmJhTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ19RXC4qQi9KR1BbSDNjWVVLRJmXobGosaqtpqSvrrapt7S5pKy0t8m7tLq6v7+0s7fDwMzIvMO8t72/v7e/vLG9rae6ube2wraqrLG3lJemrquoo7CqlK+6o6yxs6eoo7K0sbGwtbG4tKquq7Knt6+2tMTGtqm2tqywramno7agoKexoaSUnJmVsZ6nnKCqjqijnpyWmKampbinorK1rKexp66wtqykmaCsqJucnpyUqbiclI6OipibopePmKWfnZSCkZWPnJuXlpWIlo+Xmqeco6CSlpCQlXaEkId7hYGEjIttcHd0e35cS2VsXEtOY1w+YntHSThHZ1dmXExeYk1YWVdUV1RpXU9PSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0diTFYlLUItPUVMUTwzcmtJQ0OQmaWupa2uq6elsbO0qrext6CrtbnJua7Au8K4s7G1wsLOxcDBvbS9v7+6vryyxKepubC2tr+8rquzspygp7GtpqWvpZ6ytauqsbKtqqm0u620srWstK2qrKitqbmtsrHIwLilurCpra2lqK6wpqWjr6SpnJ6cm6+Zo6Oio5GsnqOgoKKqpqa5pay1tqWqq6itr7auo52jqaqboJqakqSzmY6JjYeQoaCUjJScn5ORhI2Skp2amJWTh5eSlZmnm5+ejJKRjpB2fY6FfHx8h4mIcHNxfXx9XFNkbl5OWWZcRkSWW0c7Tm1YYltMYGJOVldWV1RZZ11RUkxjWltUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZUhKKztIPzNCSFMsPpBrO0dIj5yqq6KpsaSppbO0sbS1srKhrK69zLquwLrHsbSttMLC0cXGvsCyvcDCvL+3u8SnrLess7i7wK+rsa2go6etqqiksKSrsqqvrLCvsK6rs7yntrGyqbKpq6alo626rKqxw7q2rbupqKitqqmzpamko66qqKKfnaSslaWemJ6ZrJ2iqKqirKajray4sbKhqaKgrK+xrJ2fp6ipmaSZmY+gp5iGhI6Ki56fjoqMlZuOjYWGj5SfnJWXlIaWk5OXpJucnIqSkI2Jfn2HhXx3foeFhnNycYh1a19ZYG5jUXNxXEs7hHxGP1d0WGFaTmNbTlZWVVdRXGJfU09OaFhXV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyoyNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSmdERjg8QjA1RUtYMUCVWj5MRZWYraihqrOcqqqwtq24ta6rpauqvcm7sL23wq+xrLPEw87Pw7++s7/Cw7rAs8jDq663rbK4v76yra2rpKeqsKmnqLGmtK+qsK6tsrG0rLS7pLizrKyup6ugo56wt6uqrbu3pbe2pKqnrKyrrqGpp6axsqSnpqKirJaqoZSboKaepKKrpa2in6ext62uo6aim6qrramcoqWkpJmgmpaPmJyTgoKPiIWcn4uKjouYjY+KgouXo5qRkJqMk5KRk6KZm5qKjouKfIWAgYN6dICEgX1zdoujh3hqXmBuZldlh2NOP2eTTEVieVdiWVJlVE1WVVZUT1xdYVVLTWlXVldJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqMzk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEIrOkpPXjREhj5IRkSXkrClo6qxmKuqrbastrGrpayqqbzAwLi4s7u1prKvxMnL0b/Buri/v8K5wbnAxK2xtbGzur+9srCuraurp7aqpq2vqrmwqLGyrrKtt6q3t6a0t6uspKmqnKOes7OoqKS0taC3rqCqqKuprKigq6ypubapqqmqo6mgrJySqqGdoKSjpqOqnpynta6opqqjo5ilp6eqnKOko6CamKCRjo+YjX+HjIeDnZ2GhIqKjY2PjIOFlKKZjYyZkJGRj5KflpiWi4qDf3SGgH5/eHSDf3p3foGInY9vcWdncXhcYHOIa09emVZIbXhVZFZRY09NVVRVUE9YW2JVSFBpVVZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzk3KjQ6PSstMzMxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD5DLD5MVF8vSmk1T0Q7lo6woaarrpqrpaywtLWvq6awqqm6vrvAsK65rqG3r8nHyNDBvr27vMK9usPAvr+usrKxtby6wbGxsquzqKS0qKWts7K5sKOttrGwsruruq+prbasqp6qrJ+joLatqKGfr7KitKqeqKeqo6qhoqytqL2vrK6toqiooKyZkLCimKKgp6eep5uZqrGpo6CtoqGUo6Ojp5iaqaWYmJiejoqHlIh9jYaEg6OWhIGBi4aOjJCDg5OgloiQnJCTkI2RnJSXjoqGhXh0gX98dXh5gHp0c3lof4akdWleZGuBdGeIjH1TWHBeS3hzU2VTUV5NTVJZZk5MVllkWEZTaVJRP0NOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLi01KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMZzo0OF89YWQ/RjFDUFtbK0hNOVVBNJGPsqCkp6ykp6Osp7WzsaulsaiquL7AvK+nuaqmr7DJx8jRw7y/vrm+v7zJu8G4sK+0sbq7t8Cys7usuKyitKenrLK2ubOnqLy1rra+sL2mrKy1q62cqa+koKWtq6ecnqqypLOom6unqaOpnaSpqKm9rLSvrp2ppKCunJuzo5WknKWln6Sbm6mrpp+bqqKbk5yhpZ6Yl6mpkpialJCKgo+Ffo6Cf4edj4V+fYuGkI2PhH+TmpOFkqGMlJGLkZqRlYaJfn9ye3p+fGh4fHp1cHB8Z4R4hIhkYWdicoV6bWd4XV1WQVd6bVRhUFJYS0xOcXVdSFpbZ1lFVWZQRD5KTkRDQTlIR0tTP2phSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMSYvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZjQUo3R1NgVSo9OURXPiqPlLGZn6CppqWgqqW4s7OmqbGnrbjBvbWvoritqKiwwsnJzMG2vcC1t7+5yLXDtbOxtbG9t7m9ta25tr+tobOnq6uwtbi1q5+9vKmzwbS8oK+ztaqrn62wo5ylqKqjnpuksKawoJ+rqaihqZykqKGtu6iusK6gq6Okrp6fraaXn5uho5ygnJqkqqObm6WllpeVn6KWm5emrIyekZGRi4KKgICOgHuZlIyIe36LhY6Ni4qDkpiRhpOiiZKSh5CZj5OAiHx5bH52eXhje3txcHByd2iAc2qDZ2VnYG1zjWxhaW9gb0BbeGtVXk9RUUpKTVRZV01dXmxXRFhgT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNzg7MigwOS8sNC8uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MUJoWTEzUz1lX0RMNktWZE8qOzJOWD0jk5msmaCYp6Sjn6ekuLCvpK+wqqu4wrqzrZ+4r6uotLrIy8i/t8K+sLS9t8S2w7GuubGzwLS6vbepubi9q6S0qKmqsK65saqbu72ksMG1tqGutrWmp6exs6CepKanoaWZn6yoqZ6gqq+noKaYo6mgsbmfo7GuoKuhrKScpqepmpqbn6OVnZ2bnqmml5ygqJKZlJiek5mWoaqRmoiOj4Z9h3+Cjn18oIyMiHiCi4SJi4uFh5Kaj4iVnoiRlYKMl4yRfIV7c3B9cXR0YHl4aW5wcG5ofXFje21pZWNfZYV+X1pza3JMTH5oWFpOUExKSFBSUElOXF9uU0RXWlJoT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLzo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj4wWFY1KJedppmdlqygoKGkorirsqW0tKqpucS1s62ft62urbC1xsjBt7/CubG0vLa/u76vq72vtL+wvMK4qbu6t6eotamoq7Cts7Cnmr63pa28t7KfsLewqKWnr7GboaSgpKShl5uvpqGeo6ivoaChk6Skorewoaaxqp6so6+YnKqlqZ6Ymp6lk5udm56nq5qdnaWWlpiUnY6Tl6KoopCIi4+FeoR+hIt6jpeKjYZ4gYeDiIuNhY2TmI2OlpiKj5d+hpeLj3mBenByd29vdF95d2RsbGtpaIJtZXJra2VoWmJzf15abHZpWkh9XVtYT09KSEhSVUYyOl9ebFBDV1ZZZUxISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRHQmdbSFRDVF1oRS47MV9ULDKWo6GXlZ2pnqaho6G4qq+hu7mmrL3Es6+uorWvra2vtMTEvbO/urexs7m4uri6rq2/s7S4r7/BuKy9urSmorOrqKqzq66yo5zBtqWpt7ernrK7qaalqK+rmaKnnKWmlJihsqWZnqSqqZyhoJSln6S5qKSnraaepaGok5+poqGhmZudoJKbnZegoqucm5mhlZOVlpuOk5Ojp6SPiIqOhnmEfIWFfJyNiYqGeICDh4eHkYWVk5KMkJWTjY6Ue4KXjop3fntsdXJtbHNieXVoZ2lnZW6EZ2doZGZoal9mYmlmWmV6Y2BSc1RbW1NMSUdJT1NAIStqXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTctMTE5NSwmLjUtODA1NzZgdEIzQ0RoW0tXR1VgaEIzNzhiTScynqSjko6lppyenp6kta2oqrq3qKzDwLevrKG1rqevr7fBwL2ywbexrrK2tbi3tayqvLOvsrG9wLeuvLyxpZ+2rKamtKmrrqGgw6ypp7G0rKy0up2oqquxpZieqp6opZGZpq2imZ2kqqGbop2XoJ2ntqawqq6goZ2doZWgpp+ioJmbmpySmp6Vpp6topiXnpWUjpWYjI+YmqegkIeKioh4hXeCgoKch4uCiXt+hIiGhJCElpWPj5CRkJGNk3uDlY2Gcn59Z3lwa2psZ3Vza2JnZGN0f2FkZWZlaWpjaG9ZXlhdbGRhTWhXW2BWSUdIS0xSWD45YGxpR0JVU11bSUhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKywwQSpKSy4vKiszNzIyKDU3JCs3LjcyNzg1XHlOMj5IaVpMWkpWYmZBOjNAZUclNZukoJGMrqCamKCXpbSyo7K+t6Gxxbu5sLGitqurr6m5vr28rcCyr66utq+zuLKnq7mxrq60tru2sLi9raaetaugobGlq6+fpcShs6Wvsq+3rbWdra+srqKZnaeqpZ+Vm6imoJmko6mcmp+clZydrbCmuqitoqGamp6Zn6SapZ2WnpiblJqhkqiWramblJ2ck4yVmY6UlJinp42NiomOe4J0goGKmIWHfImIhISKjIiShZOck5KPkJGWjpB/gI2Ng2+Bf2Z5bmhramdxcmtcaGNicn9gZGdqbWxnamdkbFxsbXZxYVRiaGNlWklGTE1PWFFQVWFlgVRAVlNZVUZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE6S2pbTVtLWGRkQEExSWRDJzSTopuPj7Gdm5ShmqmysJ+5wLagtMG7vbmxpbavqa6lt7m4ua27r62qq7eqtLmtpbK1sa6psbe2sbO1uqipn7apnp+qoqqtnKrCma+lr7G2taysnrGtr6qim52krKiclZynpJ2ZqaOllZqgnZGco6uqqbufpqSgmJqanqKPa6KVmJxxg5acpIB2kauonpaWoZGJl5mAl4qfj3iFk42DbWl+d4NwbIaKhn2EioZvXWRgZ4SXhmuLkJSSdXeLhH+DkH9miIBodmlmWF1pdG5OUGpkZnGCZl5kZm5saV5dXomQhYhoT0tEOEVUZ15KSFBQVVVLSFNgb3RlRVtRVVBGR0ZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNU9rW05cS1tmYj5HMU9iPCsvjaSZh5Wxm52ToJyqraujvcWvqbfCuL29rae2sKarpLi0s7Sxua2qp6y0prC1oqe4trWop6y2s660rbOiqZ+0q56ipJynqJquvZWop7C0uK2tpKiuqqumop+coainnJehpqacm6ennZKeoJmQnqiqo7Wwo6KjnJaYmJikiaGPkpqHoYiUnqF/pX+nrJ6Uk52TiINyeI2Og4egdYiNaZeIZn1zeKBviIeDfox8f6Ggn5l/e4eedIiOdpuKbIiCg21pZWR7bXJiVIZtY21pmHFYanBuhldeaVtraluIcG15codph4RaXkZOPkZeTUVSVlZRUFJXVGdeTFlLUlJQRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN0MTVSa1tOXExcZ189SzFVYDcvKIyml4SdrJ2ZmZ2fq6qoqr/Dr7K5vLfAv6qkt7GqrKazta6vs7arqaWxraW1s5ustba0paeos7Gtsqivn6qhs6mgpKSaoqSdsLeVpaantr2mrKepqqynpqKgmaCopJmZpqOlmZylqZaTopyUk6OmpqC2pKOgo5iVk5iTnIiukJiUiamLmKSchrGApK2elJqflXmC1Kh/h5TAm8Z4d7Glt5dkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyWsauweWhsWLGub2VpvJK8bmh6bXGP2H5TamO2sn6AcZR1mqGqkFdPWGFPVk5GVFtYUVBTi1xXW1BAXEVRTkRGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzExVGtcT1tNXmdcPkwxWlw0MSGOppOBp6qfl52dpa2yqbHCvbK1v7W4v8KrprStramor7Sqr7azqKemtqWnuK+csrK1qqWkp7KvrrGmqp6npLKkoqKfl5ygn7GulZ+joLS6oqmooa2upaKdm5qiqqCYm6ihn5idqKiRnKealJ6ip6OgsKOen6OWlpKYkpmFsGtqio2qfmeFloetZXGenZWap5ZxrqGkfne6fGuhj3axX2q0W6WAZZyRYGaBemZ/aXhqqWW+cmemjHaxanyxeHWSlGNtbaduXISgRWlnh5ZFdZxgfWZ7o6eCWV+Lq2mAknh6aqg4Sq9bV1RtY1tMT1hfXFdWO06IT1dWL0lUU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV5ZMzEbkqKVgqynpZ+jpKqxt620vb6wt8WyuLrCp6iwrK+pqbGvpLG6sKSkr7OjqbmpnrOysKOloKqtsKyvpqifo6KxnaSdmJWYm52vqJecop+0s6Grm6GtraCempego6qdmZ6koZyZoaekkJ2jm5ihn6yfpaagmp+hlZWRlpGahrWbtXiFqZm1mXeHs5u3f5OWl6uVfmuBpnqBhYaRlJJ3q2dqsVuse46HlHSIcI6GgX+IkJd4g4KLl4yDoI+FsHZ3n3Framx8i0+lWEhjY5l+Y2imYHlxdVKThl5QqW1jcX2GgGGdL1KibltUa2dgTEtcY1hcWkI+sHhXWEEjTWhGQ0RBQEExOT44OTo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJBQUQ8RkQ7MDIwMjtGLDAuODQwLC4oLzIsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SjhhVTUwHJeglIizpqairqmos6yqu7bCsLzCrbi3waqsra+up66zqqKvvKqhp7Wto6u1pKWys6ijoZ2nqrKosKimnqCgsJagmpaWl5qgr6ObmqSota6hqY+pp6manZaYoKWpm5+do5+coKKlo5WbnpiZnaKqm6WanJqioJaTkZOTnYTVk5m5cbDCf8aGfNaUnLt8m5amkI2cjKR6jYaigaWCeqx5j51Wr3uJfp9quVq5d4aDfaaCk3yYeqp5jp2Qe7FujoR0kLuFbpVQr6fFilGgemNgqmJzcoZsl4dfU7W0yIWAiXxjpDNCnXVdUGpoZFBAWGZaZGFKSE1rSlpTT1lmWkNDP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbS1xQX2ZUN0c6YVA3MiWcopOZsaiopbOqpbSnpLy3wbG6wLK2tLyztqeysaOxs6agr7Wom6i6rqKvsaCytLGhpJ6eqKmwqbSppZyenqyXmZmXl5aYoqyem5eprbCoo5+OrKKnlp2YnKGmopiioaOhmqKip5ueoJ6VmZqloJynlZubn6CYkJKVkJ2Ism5otXGriHCOpnK0dHO2e5uYpI2PnI2ifo+fpH6wdYOR0tF1W658hX+kb5uqpmuGhX2tfZeZj3uxc5Odj3izZZZ0hZ5unmaUUsmLWsJcn3liX61fdnOGYpeIXlnKnW+/gHVNS7VTVcZkVFFqY2ZYQU9qX2xpUFVGSTg9V1JbVllJQz9KPDI/OzU9PDU2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRT5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1Qcmg5J1dpXEJOVF9lUDVHPWFNNjIuop2Rpa+spKq7rKa1pae2u7yyu7+4t7W7u7SmtbSisrKjoKyvpJimuq6ksbCctLiqoKWdoaqlsqisqqWanZupn5aVmJmSk6OqoZeTp6uwpaKWkqyfpZKUoZykp6CVm6enopqjn62aoJ6ekJWboZ2cpZWdlZminpWZlpKbhax7d6h2o4+Lh6lvrYqDp4SamaKKkpmLon6Sl4euhX+Cs1xys1KufYKCpH9x1313hH6PnYaZmnevhoqRnIh3tGGaZZqCgZVskluwV0uadZh5ZmCtXnZ3h2eYiGpdr3eVn494bDV5yK6yX0JUb11nYEVQbGBxbVZVTS5lYmhTWVA7QkRATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo3N6CdlKC4sJizwayosqeqsrq4tLm+ubiztr22pri0oLWtoKCpq5+Vp7asqLCxq620pJupn6CoorWnpqqkmZ6VpaKUlJyakpajppuUkKetr6WhlZipn6KPkaKaqaahlZqmqZ6dpJ6snaCdoI2UnpueoZiZnJaXoaCUmJGmnYapfX2leaGPkIOqcK2MgaaGlqCiipeXiKOBkIeUqnt/i515b7FaqIOCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfYKUbZNcq1xbk3+Rf2hnqmNye4BqmIZxXataiaCPa25lT0pDoVxaTXRdYmZNWmFfcnRfSlU1SpqSWEhFPUhGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzFVX2JMN0ZJX0MxPTeinJqav6yYtMKuq62oprSwuLG2v7m6s7G4vaq7taCxpZ+mp6eek6qxqa+qta2qr6GYoaCmpKS6oqOsoZebkaOglZWfm5WZoKCQjoypsK+mnZeaqKafjZKkmKirqJWYqaifn6CjraOgnaGNlKCYn6CSnJeclZ2hlZaPq5uPrm5ytHSpjHeKpnO0eXS0gZOlo5KcjImkh451uG+Me4uia2u2WqGGZZeXaaCip22UcrR0k5h/smqGkoita3WzYZ1mom6GkmuXXK1gTqF8h5FSc6NseX9+bpiGcFyvVjycd2ZUb24uW6dPYlJrZWJsWmJcYHB8Y1NZUT4+bW8yQkJAP006ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKywzMjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV9hTDVGTV45MUE4pZqbnbuinLLArq2rq6e3qbivtcG1vbGvurmswbaqq6Gdp6SinZKrqqe1o7Korqqhl5yooKWruZ2jrZyWmZClo5aOnqGcmZ6fkZOVq7avp5mUm6ypl4yUppqlraOSl6uypKCeqKuwmaGij5ihl6CblpuXoZOcqZ2UkKqZh9OTmrt0scSAw4Z91ZabuHmJkpmMl4mMp4d5orZ1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6J+jHSHq32+bnO8dLKDdXiAim2aiHFtjaR0vV13fVthebxqWlZbaXleaWFkZmJteW9ZW1lDQUByP0NGKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTZAOaaZnqK8opexwrCtqaqssae4r7fFsbuyrrywrsGyrKWjn6ShnJuQqqSqsqS1p62kn5aaqpmmrLmdo66ZlaGQpqCTjZyjnpiempCWk6+5sKuVl6Onp5SQlqWdpK2ekaCoq6Cbn6mksp6ipI2moZShmpuXlqSYj7CgkpWpn4WQmbWAkZGNuJV4gpObtXdubG9zbnmPhI6Jc57Bu7yZeoGyqHCAdJG5g3yGhouHjXuKho2XfKS7ub2cdXmzo3R2l3V0sHWYnmaGaY22dHJxd7aMXn95fYhng3lteWKLrHB0hX9YW6dqRGRZVGZfY11jUWdncW11Qk1QTUQ7Wkw/SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc+NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2FXOCpPXV09KztWVic9OjymnaChv6aWs8K0q6qorKupu66xxq+1tK64p7W5ramjo6efoJ2Yk6ykraqmtaion5uWoKOerKW+p6GqmJWckaKbko+hqKGTnpeSmJSytbasmJ2kpKKLkpKmnKWrnJappaacmaCop6ajqKCRrJ6Xo56Xlpidno+wqZOcp6KOan5pnKd4iXN+m451emWHe76/wLpukoJxlYVfcmpaXZqJYWSHjpVrYH+VY22cdmKUa4CalZRlXl9jcZuJaHKMfIaUZmp+cXR5fn1iW3h0gWhQXG6DfHuKalhseYFySUpvhXBOc01FV1xmYUxbV2ZjXk9abXZqclJPREVNPEhJPE0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4xOzouLy03Nj01JiIvKjIsJTs4LTdJUl9JJ1NfVjQpUF5MKDM+W08nPzI+qJ+oocGkmrS6tqOspq6nqLWyrMissLOstqS+srOmoKSqnaObmZmsp66kpbWqpJuYlaKbpq2pv6ipppaUm5agmpOYpamnkZ6Qj5icsLK+rJunnaeiiZORqpuopJubrKCkmpqip6yin6mhma+alaaflpSdn52XsaWZoqiZnJGenKOkmaejmp2ampqQloJobn1xdpGXlJGDibSpjYWYlY6KjJiWh5OVioOTk5CIjZGUmZOZl5qgoZqblJ+bjYJ6pIVsaXuQfYB1iYuCcoJ4eXZ2ioB7iWpzgXSDdWR3fXZrcHptYGNbb2dMWFllal9XWXB6b25mU09GUjlPWk5STygrO0pCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8Ojs0ODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlQxMFReOis9OF1LLDwtQLKgs6G/oqSxsbegqaazp6WwtarJq62yprWmwKi0oZ6lppyllZWgq6eso6O3rKCZlpagl62qpsGfrKSWkpyXnpiUlKKenqOokpCZqKeyw6+aq52qno+Xlqmeq5ydoK2YoZucoqWvpqGkp56smJemnZmaoZ6enLChnaKnlZiTmZSgopajn5ihjpaUi4qNj5etj3uVm4KRgImpqIWAmJaKhI6fiHuDkIaFmpGHhomVjpuXjpCYnqOWmZKQnI1+jWWhs66EiYR3e5CKfXd5em9neZCBgIlrdYF5iHJpc395dYOHgmt0Y3hmX2hkY2Rmalhre3Bqa1xTTFBEX1VGQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVFZWWFpcX2FjYV9dXV1eXVhWSktMQklPTVJKOzw6Nzg2LzM5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LEC0oLmvvqyrrbGyoKqmsq2irLOwxrCrraSzr7yktJygp6KhnZmXqKappqSls7WelZSemZmvpq6+oKyjkZGempmUkpahnJepnYWdqayitMezn6mkqpaWmJqnnqmcoKSrlJ6fnqCqrqimo6uhrJufoKCYpJ6cn5ywpJmfqJOYl52SpZqYqZ+bl2aDknxlfo+aj2N4jGxoanqQo6trZJmXfmeFimVlaWh6jaGOa2iMl5Gid2tqi5iin5hzbG56hIyGeVhlXYWCXmyLioJ2W2hzd3eRgIeCbniCeH9zbXmEc3eIiI6De2mFWF1qc2Rdc4hpa3xxbWNdUU5XSWRYQEozPUY3P0ZENzE8PT9BQzs7REdISElMTk9SUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtJLjZaTzYpRVkvRE8xWUI7Py49pZ+6vLmvq7Owq6Wora6wp66tsL2xqqilrbCwn62YoKSeopqap6ycrKOmqKmzrp6Vo5Cir6a2uaWuo4+OmqGZk5KboJiZppZ7payiqLPDt6Wip6+fnpWeo5+knKSqqJKeoZ6gqq+qqqOqn6ebpp+noKyWoZylsaSXnKuWoZ6bk6WXnquZnn6+g4hytHKFnoWtaHe5xLhxkqGje6aYmHOqgnzLwMC7cYqjh4KefJaYiJ7AvYKWnZ2NnMHAe4F6kYyawr99a6Wyb4yBb8p6f5t3kYOOgHZ5gX95cXuAhnB4hYyTeWx2kWJlXnhkX2WBYl50aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYV9eXl5eX19fXVxTTVBHVU5BQD89NjQ2ODI2NiomJSMpKiYuKyopMTAfOSojPkhbTCojQ1AvI0ZbM1BZL1VBQjsvOJajuMO0sK+/qamUo6+psK+tprK1r6qmp6Wxq5+rmJuioJybqqeinauipamlpLSknaOTpq6suLSnr6KSkZmdpZKRoKGXm6Cdh6aqpKutv7+xoamuqZeSn56imaKkqqOToKGenayuqKymo6KloKSlnK2okaSbqa2qnJ6qna2ilpellqGjmJ1/zpR5eqWBepaWm1+tj12OqICgoXynlZp0q4OAr15kjKl6qIeFn3SXkoizY4KrhqCNjbNqhK50fJaHuGGCrVmjzW6QdXvbe3+ZcX6IknV/ZXuIdnZsfYdufYWQkX5sgY1fcGpvZmBfeGRccWhqY2ZgUlRTV15KT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDpMLSFQQEY0LjGtwsDAtbSwt5iekaOqqa20q6ayra2spKymsKqgp5uappicoq+foZ+op6OmoZ+wrJuelqaurbCrqKyglJKbn6WTj56ll52oo56upKuwqL/Gs6ipsa6Wkp6copehqqqflaGenZytrqeqqJumpaOhqpKss5aloqqqnqSopqGxopOap5qgmpSUkZegcIWMmHWEqIdxsHydcqx9oJ+BpY+ed6uCfa1/nHKtfquHhp92mJJ7fJd+qoihjJGLnH6re4iSjqCAeq1WnMR6j2+SwX2BlW11cIxtZndlhm9hd25yboiKkY+DbZCOZG5zdW9gZm1kX29oam5mY1dTXGBaUlJDOUlJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkyNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLTwoPTEpM1ZARiEcRztDMS0rr9TGx7K0n52jjqOioq2utq+psaepq6iuq6umoqOdmqOWn6arn6KmoKioop+esKyYm5eoqK+sqKepnpeVmqSikpShrZudp6OurKOstam5zbKtpq6slpWcnaKZn66snZahmZ6eqbCoqaiaqqijoqubr7GiqKyvppqnrKqqsqOTl6OlmpSRhKRqpHWJeql1erJxgqWJmIxwh5+ah6RfYFKrhH+ugpt1roKnhoafepmXhXtmgKOJpJmGgaN9qX+BlIauXnyoVZ2ikoF6o5+Ae8OvxYxzr7SzuXFiqa/CdWiMjJeOgWyZkW5teHd3bmtmZGRxcGZ7aWNdVl9pWFhUTExRTENDQUI7Q0FAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dbAoZmrqKGvop+wtbCvqq2jqKeqq6uppKagm6WfnaanpqSdrJqiq6Gkn6+inpuTqqS2sK6gqZudl5WnpJGboaifoKacsKajqLGstsiytamsqpWRnJ2imaCltJ2aoZScn6aqq6KtmaunoaGqorOtoqqzsqKcq6mvr7eklJajp5ibknyqbJ6Eh3WreXywboKki4iflpWelYHSt7S4yYCBsl5flKmDpIeHoHqYlZl4qslzmaOUqKmQk5qMfpqJmsbGd2WhgqVzgZ+Ogn2vXm+1Y7F1S6OGbadHgpNkjo+ckntwlpF9b3p0fHptW2VqcnFmgWleYVhjbVxeWUlMTEtFREJCPUE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00TlRRHRw7PEYyLCSopMHGua2ps66spaKdsrmsqqGmm6imq6yppqCmpZiqo5+urJ2moayan6mlnae1oKOYk6irtrKsm6acoJaRpq2RmZyno6Cqpq6ho6epsLTCsbKqraiUiZidpZuipK6ll6GVmZylpaqarpyspqWerKO3rKCyubCenK+ns7S0ppWYqKSboI6CnU54moF/n3qEo3yCpISGpp6cnpSEuHt8ebmCf8zGw7Z3m6GQi59+mpaXiXafl4qkmKSofrCFnISehKx9mZRhpWyjcI+FkIF9l4RyrGCkcnGAmmC8fVJVdY6Ro5Z7fJKPiHN6coR9cFxsbndyaoFuWmNfaG5iZF1MTFFTQUhHRkk5OUs+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUV1lZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1RGPEUyOlBbVBwbNj9HLC0gjIeZqaykq7mrr6CboayztKafoZWmr66uqaadpqaao6ehsq6iqaeyoJmopJSitaOklpeiqrW5pJyjnaOTkKKxmZ6cpqWhoq+tnaSoorWxw7Gtqq2qkYeRnKedo6ScpZeemJmZpaOoma2hrKSlmK+lu6yht7eunp61srmytKiZnrCipJ6Gj9G1w7d5h46FkZOPgKZ4lKJ3i6CShaWCi3GrhoW0bnJpmaOclYmffJeZhoeQc66CpZuijaaLk5yIlJCabXCyXKVzk3qcbJl/e5l+bqlhonFxf59ic7K4aHePk6SYfYqLkYp3fHiNgWxod2l4c25/dFxkZG1tZWhgSlpXWDxIRj9UM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWlpaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCMpJZJyjYquv7+8u7Wel6ikrbahopmVo6mnrqmrmaWhn6WhoLWnoqmnsKOUq6OOpK2kn5Camqq0tKSdppypkpSXrqCgnqaknKectZqgqqO1q8KvqaupooyEj5yioKajlZmanJibmKajppiqpqyhpJutpr2slb6wrZ+jsLO6rLWonKmypamYeqeRfXywd4qApKWInG2yb6CHrXuhj4OolZqArImFroWglKihopeFn4CZlYB7kn6rgJ2aloureJ2gj4iTkn95r12jgXymp2SegHyXdGuuXaVrcYWZXWBbjKBtlJClmIGTjJWKeXmBln5qbH1ifXRtf3lfZmVwbmdnaEJZX1s9SlMyVDhCQkM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pXU1BPTkk3MDUyLiosQVRWVlZUVFVVVVVUVFVUU1NWV1dYVlZVUUhGSUojKCi8kpqEqcbDtsG0n5qtoK64paOOm6SjoK+uqZ+jnp2tmJ65oKKroK+qmq2gkKqppZaJmpCusKymoKibrZiZj62ioZ2loZmknK2Yn6iltqi/rqSpo5+MgI6bm5+mnpKUmZqUmZmko6OZp6qroqOeqai+pJfDrKujoqyzuqyvqKK0sKqrmXavfpCKnIWHfLqtiZhksIxlla19oY+Dp5abga2KhLCFppmkoaKQhKBbbGqBs2B/rXt7goCybGdumZeLiLFbfbRbpINryKJln4F7vFl2tVqyfVKvgHqsWIChbZeOp5qJlo+UlXp4jZt8Y3N8YYN4c398YGlmcG1mZWVPVWNcQVRePUgoPjk9NCEhLSQfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTkpHQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsbe9u7TBs6Ocraaltqmgi5mgn52zsaieop+dtJigs6iqq56wrZ6rmpSuqKKOiJuOr6ypp6Ooma+Tmo+pmqGepZ6Zo6KlmZ+jqbKovK+lqJ6djnyLmpahoJmQkZqbkZiWqJ6gmKespqSkoqSpu56gxqelqaKrtLatr6igva+urpeBqZKjro6bgIakl5iQgYC4w7qDjp2ThKeYnYKsioKviaabmqWqkX7VvcKqYqO/vXx+o4KD17q3tYWTkoKevb6EaqOBb6uEbp1/erKxx4Nrq7C9rHh3or67dICVjaWbjpmPlZt4gJCZeWJ8emOMZ3iBe2BrZWtqYlBiW1NpXEBUYEJMKTw6NS8fHyQeJTIgHSQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVtLSxv7qyvbOina6mpbOmnYyYpb+ptrCnob+mprGbnrGcuaifra6lp5STr6yXjIOaka6mo6yipZyqoJiLo5OmnqebmqCoopmeoKysqbitp6Oal5N7h5mSppuTj5GYmI+Xk6iZn5eoqJ+ppqGiq7ueqcWjoK+jq7O1q7Gror2psLCbdHaqpLaFZYmfb2esj4qPbW93pJCaoIF1sJqWcJCNcpano5uYrqRybW1sZYp4bm2CmXGAemlwaWaJlpWYcWhphYZncIZkXYpjaW9ZXWd+eKZgYnKPkm9mZICNk46hl5aXj5ScfIaOlHRlhndnjGp4fnhkbGNmbGJLZFhKa1k6UGREUCdKOisjHCAaIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola20qru6srOqqaKunqSzqpiSvbHDyL60qZ6/q6yjoKarn7qjpK2sraWNlq2qkIyFlZetn6Wqop+kpKCRi6WSp5mpmZajqqCWnKWmp6+5qquam5OSe4SXjqaXjpGQmJSNl5Smk56Xp6KasKadoqy5oLDCqKSzpqyxsquvram6pbC5l4uhqaW2nImWoZeGqZqQlJ2TqrOZm6OsobOXo6GeoaKcoKShlaumjJKTjIeSnJyUkJmTmJCOlYR/pJqXlY6Lk5KKj4aEfmeLgHSDdnSHjHGnbXyVkpSTgYGPj4+OnJOglJaUn4GGk4twZ452bol3dXx5aWtkZG9jVWBZQGlaR2JgTlgrRT0rJiE2NDAvHxwhJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlRRSkVDPjk9QEFTWFtcWVdYWFhYWFlYWFpaW1xeX19gXl5eX19gYGBfWVlgpZapqaW2uK6uorClrZ+gtrGQjqrEu8W6t6mhpZ2bpZ2wqKO2p52ptaankZiso4uIiY+cp5aspKKaqJ6fk5Wjl6iaqZmUpqGkkJqnmaG0uaeqmJqQjHuBlIyhlIqUkZWQj5KXpI6emaiem7Wjnaast6ivwq6jt6avr7Ctqqu1u6KxvpqSpqSmtaKRnaaejamfjZKfo6ywm6GksqmwmaWhnaSrnp6dnJernJKZopuUkJaqmY2YmJaQlp6Rh6CdlZSFkoyQjZWLgX5mjYd1h3Z5iIR0nGqHkZWVkop9jJaSkpeSoJGalJ6DhpaFeHGUcniJfnF7fmluZF9waWBbX1ltYlBgZE9ZOUdGRT0yPD04LyomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iVpKejsbSsrqOpp62gqLWqkI+co7K7rqqroaKZepyisKSlsamWm7imo5SYqZyOhoqJm6KQrp+kl6igoZKXmZuui6qWj6iZqIyYqI6euLajpZibjYh5gZOMm5OKlZGUkI2RlqGLnZ2nnZ64o3+Dr7WisK90pL6jsqB4eqGss72Wd66loIqAqn5kW2F2n46knYOXfm6Ts5yjqK+ro2WfoJR0epqWcICYqJdsfqKoimWdpZuQl5iWi5KbkISdmpCUg5KHjo6SiYV3a5CIdodxfIaBgGFpiYuVk4xbdpWRZ2iPjXJ5opaXZXeXhoB2l2iCiYJueX5qcGVfdm9ra2hbZWNhYW9SWj1NTU5SRj1AVEI5MS8eHyY0OjMwNjY3ODw7PkBBQkZIQkdGSUtMVFVVWV1gaGdnWFFJPERHPDlWUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuppamto6etpZKWqrSusaWZqaaql3OLnK+fqKunk5a4n6CPnKSekH6IiJuejayapJWoop6Ol5GehXSuj4ilmqiRlqOIm7mzp6CZmYuJdXaTjZaTipORkJSMj5OfjZqepZibspaAjJu1nbSMko+9p6F+p6J6pLC5gY6Op5+Ei4WPsKmvjImWopl5gYushpydoqiqqIiVh5l3pZt6h5uBl6aCgXucsnqKhp+XmZSYloGQlpaEmZpjeYeQhI2PkouDbnGQiHqBcYCBhn+GdIeFlpJ4lmiTdKCadHyZgp2ahZh9kYmBgphpjIyEanh6cHBnZHhuaWxqW2RpaWVyW11IVExRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1JYWlhbYWFoZllRSDlESzw+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZijn6aurquorKCosKenqqWZlK3GvK+glaWotJ2Pg5yrm6eioI2Qvp6ZjZ+aoZB8hY6Zl4isnaOWoaGSjpSJhoCRqI6Hopyjk5adhp65saedmpOPhXB1kImUkIqUj4+bi46RnpGVnqOVnayIn7SJtJqui8qIq6+Jt4WNsIOxr4SpjaeYjZ18qI9ye3ebjqaWaJWkebSLn56mqJOZwoJ/q4iYoXGegJqlfZeFlbGBoXygk5+PmJeAjpObiZiSi3yFk4aNlJOJg21zkoaAe3KGgYR9hXWGgpiBj8VmgKmHj6JqnYGel4CZgIqLg4iYb42ShGd3dHt2Z2h1cGdoa15ibmxma1hnR1xRTDJFNDZNYWM3JjQ8REdEOjYzNjU4Ozg+PTw+Qkw/TklKS0NQWl1cV2JeamxcUUU9S01ASmRYXWNnaGdiYmJiY2NgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLmxqqunmpSfoqSqopWkqbair3+gppylnp2JlLyZk42gkZ2PeYOWlpGIq5mcm5qihY+Md5ucjqCRiJ6km5WYl4aiuKylmZuNjX9ibZCLk5CNj4yMl4uPkZ+Okp6gmaGofqGnh62doJaukKCenZGGgqCNrK+HpI2qmoyafqJ1gJiTa4GrdE2reIeNnZKbqKiCqqt+hKF7eqdpnn+SbGeXhpe1iJ59bWBjWIOXf4x7ZGeLc5l9eZZrXXyXbl9TcYVcYGx5g2BZZYJ+hIGYcaeqa4OjbnKlcJ+CnGdknmxabIh6ZVlfgn5hV1BvdmVtdHFqam5eam9sa2hXaE5dWEU5QDRHRF5rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSltdX1deX2J2YE1FOk1PTVRiXFtmZ2lpYmJkYWRkYmFiYGJkY2FiaWtkYmRkZ2RiZ2VhY2iYlp2guaCqo6askaG2vKuvopmXn6GlrKufnK20oqeRoJ+fppuZjZi0mZCLnoyVi3WBlJGMiqaWlpifnn+ThYaso4eckYqYqZiZmpGHpbCmopWZiImAaW6Ih4uOjomLjJGLj5GhjJOdn5uipX+TgY+joZSgd5yWkKeDoqiAhqqthaV5i32Emn2icHKSh5Z7nox5bYebi5mRnKmbj4edfIKic3amZp5+d6RemHt9knOibpi3tLpzkoeBgLaoZIHGuHtwlbaMcYCbpGN0rKtgfWqds35ufYeDj4KLl3GAo2xzpHOegn2jXpyZs5Zve5ees3RyW56ygmlib3N1cWhuWGtscnJkXGhdYUtEPUQ1UUFacTI8UkZfSlM9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltZWGBgfGRJQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7mZq5yToI6luLatrqCaopyjo6Srm5qxrKuSl6CYoKSZmpSeq5uLiJF4i4VwgJaNiY+hkJOUnZd9kYqOqKCHmI+KkqKTm5qMiqinpJ6PloeEfmt7hn59j42Di4+PiY6Tn4KWnKCdoJ+LiXecmKKNoHKii4ipiJynkZipq3+ujH16oJl5o5N4gHOXiIycfZafhpuOmZynh6NkoX2JlpCbjGyeaJqNbpqZen+Kp31yZ3Oqg52Cc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF6ndnaJioCdaJp1h5OSmI5/nm2ZkGqmmVyofne7an2pWo6EXbNnXG5xeHdraVtwanl4YV5kVmFBUEVPN1ZCUm40SlpZXk5aREAxNTE7OzdIPzpDR1U/WFJYXT5EYl1WYFFhY31qRUI5TlteWWRmWGZnbW1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZGNpaGdraZWciaq2m6iJY5WcrLqysKydppubp5+drJmdsKernZeimaGfmZaWoKOZhomNaYiAcXuXiIuWl4SSlZiPeoqElqOciZWQhoudkZybiI+oop+ajJGKgIBpgYZ5f5aMe4iNjoeOlZp/k6GeoKKTmHJon4qgj4xwkoyCqYiZoKSqoah9sK2koriXdqOzoqN/iJR4nXqqmn6ij56cmImYcqF9hY2wtX1rmpGheH6YtKOjq6iEmHuafJyafnOqWl1ve5eLeJ5iTH97e4VkephCTZ9ZompyfI5ugYqEmXWbeYeJsbN/fpqSpnR+nW1xfJRvmXJpo12VdkhlY2BzcH19bmZfa2h2e2JjX1BdVlxUVkBZRVFnRVJWXGFYX0lEPUI4QEE6SUU4TEVYQVZRWlZERmFcWmBLYG19ckVDPFVeYlplalZoaG1vYmZmXmFgXF1eYGhiX2VjdmxeZWdmbGRlbGhoa2mUnYGxrpmEU1+hp7S6s7OpmqKLm6mcnKeSoKujoKePnp2cmpmVmKGdloeHiXeFgW55lYWQmot9kZOWiHKAiZKgm3KSkIGImZSfmoSOqJuZlYuKinyDbISFcYGhjHiFjYiHkZeUfJKjoJ6jiK6GfbWEj56de6aWeqmClp6Ri6Kdfadod21+mXOgc3F8nYWYb5OCrn2jg6efm4GkcF6paHWjY2+lYZzTj3x6mXhyc2OihY9+onKijnVrj7OLYIKYinOqsqe8f3eDbX+/pqq0XpxvfnKXb4FzonJdo2d0pmBopmya05h6gptud3mXa5t5dpdybKmlZ19keXB/g2tnZmNudndmX2FRWmVQUWFIV0lUX1dTW2RqW2VRRkNLTEpLQkpEOFBAUE1YU1hPUlFgZWVpUmR4eXdKRkVjXWVaaGpTaWhqb2NqZmBjX1xdXV9oYmFoZXtkXmRnZGtkamxmaGxomJt/sKxUXEt+qa+ytbCzo5yYhJemoKCjjKSnn5eoiZmXmJOZk5Ggl42IhXtwfYRofY+Ck5qBd5GOjolwf4aPk5JsmJR8iZGSo5WDjqqak5KLhYl5g3aHgG6BnoZ3gJKFh5ihlnmToqOaoImzoaK2i3qsp6SupXCpgJuRhoGcknykgKKZhphxnoSira6Jl4uAjKSNloOuopR2tba1yaF0lIuCnmGdl6lteZWHn5p1oYd3oH2QloqBb0xmo5JwmohzpXt5dGKDgmx+oGxyZGCccn90l2p7abO1tMamc5h+ep1qm5qrdIKabXN3l2mZeXSYcVBEfbNeanVqeIdma2didHRwbVZdU1hnT1JoSVVMWFJWXWdrblZnV01KQUpNSkhKTkFRSlBkY2ltZXRyc354e251iXt7VFFObF5oW2tpUmpoaWxnbWZjZV9cXFxfaWJkaGt7X11kZ2NqZm5tZWlsZaKcia+nhWY/lKGyrK+vtaKij3+Wp6Kho4ukppybpYGal5aNl5CPm5KNiIN5anmGZYOMfpafeXWPiIyBaYSFkoOMhZ2NeoyKlaWSgpepl4yRi4CJeX98i3lwj6CGeYGUhoiWn5R/lKWnnJaWhGdueJxsomR8caV4nJhwaKeCmIx8pXqgloOWcp92gImUlY+5bpCKomJ9maKWiW5yaaprdaBtb6Zgm2mLkGmWh5qVdaKAfZpfi4WMdW+IYmihZZ5/aZt1cGRniIJuc6JaX1tkoW5diYxve39zcmSlbniiZGanaJhyi5huoW9SiI9uoF5kp1SLXVSYbW1yanGBbXBoa3hza29RWFZVZVlTbUlYT1xIWGloc2pZa1ZRUkVWXExYUmFVaGped3V6fHB8fHKCe39zdo2Ag3ZeUXNhZ2JwZ1BqaGhrbG9oZGdfXV1dYGpiaml2dV1cY2hjamlybGZrbWOdpZmmemV0bYunrqWqsbGmn4t/lqqcnaSLoaGZoaGAlZiTjZqPi5eQjYp7hnGAiGiLinyXmnN0iX2Qe2WDh5WKiZaZgnyIhpamkIGiq5CFkIqBin1/f45zaY+lhH2Fk4yHmJ+Nh5Kqpp6JpniWnH6liZaMspmekYOvl5+leZeIeal0pY+Emm6looyShIyDvG59pa+ChoaHlJedoH2menGolKCWZ55+b6xjloqVkneobKmigYl2h4J3q5GmiGuRsGt2s4ypbIuGbm6fnpGVYn+ri6p3gH+Np593n32FpJWdoGmah3WrZp6tjLZzdr6MpJNZg6aNq2F1cXNve3RxYmp+bmhsU1ZaVWBgXGpMXFJdSV5sbXZgW3FZW2BaZ3Nlbm9xY3F0YHd6fnlyeYNyg36Be3uMgYKAdmJ4ZGNuc2RSbGdob21yaWZpYV9eXGFqYmxsem9cXGJpYW1pd21nbG5ilaaqnYGAnqSWqqqeqKeuo5mIgZaqmZ2jiZqknKidhIuaj4WckYWSjYuNdIV6iINvjYR9l5NzdYZykYNtf4uShoaUj317goWXpY1/paWNgI2JhJR1goeSb2yLqICCi5ONiJyeiYyTqqOgkIB0lJeIfoF5lK+kf4KccY+GeZKMhIB7cqeMcX19epeWm4SNeHt+foiUlZOKd5GZoKGEe32Ja4yFW3l5c3lwaW5+kolxf3SBj5STcYWDgmWNf1+BgIx4dnSUdW97b26JboSGX3dpeI5mgoKGjqqcfnR9l2qJiG9/dXyEdW1sZoxzd3uXd4Rbalh5j2hud3Fwb3d4b11shm1pZ1ZaX1dcZGtkVWFVXlFfcHd5a2p3ZWpqanV8cHF0c2FvdWJze4F4dXqBdX+Af4F5i4WCfXttf2xkeW5eV25naHVreGppaWRcYFpjaWVscHVuWltia2Rra3ltaGxvYY6Vuqmni6Gim6akmaSdq6Kgg4OWqpGdoIiZppqomIOBm4t+lpSHjoqIjXKCfI99fo+EepeOdHKEcJWFe32Si4aGkIV4foCGmKOMe6ehi4WPj4SVgoaOl3dxhKqFjZGcj4eenoeLmqigoKuDiY6Vm39+ipetqJCTp5B4cZ6Tg3uTb36phXB9lXFqb3yBn4t/ko6MaG1dg4yMnJyfjnOVi4hxdGuCdnSAWXJuhpCBfX6LaV1pY3qFg4iAX2l4e5x8g42DdoGHg2l5jIhrYnFzg3dfco2CiZCnlYZmjY+DbneLg2+EjHhuZGZjeYJ6lVpcaWZudlt6eHd0bXNygmZcbYpra2JaWV1ZWGtxW15gWV5dZnN9e3NvdGNqaml7fHJ6d3RkbXRobHt+dXp8e3l5f4B/cIaKhHt9c355cn9oVFxxaWx2cHVna2dkXWFZamhranFybVdbZW5sZ3J5b2hqbWCMjKuxoZCjoZqfnpiemamjoX2ClquMnpSHmqGQpJR/e5iEfJKZiIiGhopyfYCLdoWLgYSWinJvgHKYhoR+koOEhoqBeoCEi5qfj4KmoId4jZeIlYuLnJeFg3qsgZCXmZOJnp2HiKGrn6Kio4uIk5udo5mWqqKop6GTnImYkHx5j46EqH5/kpGSk5yxpZqUnZCOspOYhKaMjJacoImRm4KJkoprfI52d2WChpCKfImdhIeLj4eIgIWEkHd8e3Wbo4mIi5+LhpV/fo2CgXZxdIaFf3iJh4qRppGEho6Ig4yQi3uGiYeOgHVrgYN7eZlpcmhgdIpwfXp2dW93dIFdXW+HaG5fX1pbXFJncVVjW1thbGh0e3xybnBkamlof3tteH5waG9vbGaAe3KBgHd/fX+Ee22DjIZ8enh8fnqDeE5kdmpzbnF7ZWtlYmJgW3NmcGZycWxVXWx0bWh4enBnaWtljYieup+WoqGYlZmYlJikoJ17f5ipjZ6MhZ+cip2WfHiUgnuOmYmGg4SGbXiBgHKAh36Ik4Rta356l4eEg5B+gIaEhn2Hg42bnZGGqZ6CcYqPhZKRi5yRfY16qYOMkZeVjpuWhoabpqCimp2Gg5KamZiQmqagpp6ekJaBkot3fYiOhKV7fI+QkIWYqqCck5yPjaqOkoCejYmUmp+Djpd+ho6Cb3iGcXVhfoSPhnSLl4CCjoKGhH6FhJRueXZ1lKOMjoabhYWOdYCLfX1zc3yJhHt5jI+Ek6ePhoSPgoOKiYl1hYaHiXtuan1/e21oa2xnXnl+Z3x7dnR1dXp3XGBwfW10YGNaW15RZm1TZVpdYWppdXl+cGxsY2pqZ4B/a3J/a2pzbnhuhHluhoB2goB9hXZxgo2Ifnt6fIB7gotgaXtrdWhpg2VqY2BpW2N1aG9idW1rVGJxeWVveXpyZWptbYuKn7iaoaSfk5GWl4uan56de3ecpZCbiYaklIqYmXh5jYV8iZGDjIKCgmx7f3hygIV9ipB8a2h9gpeJgYiOfH6GhId8j4CPm5uQh6acf3CLiouShqChioWMfKePho6Sl5OWkneNo6ChnZaaf4GQmZiTjJqioaOamJGbfo6FeoGEjoegf36MjI58l6SgoJKZkI+mjZCBm5GJk5ecfpKRfYaNgHV0gXB2YH2AjoZxipV8h4pxjH6ChYWOaHhyeY2ZkpCAl36Ii3OCiH19cnp8jIV7epGNg5alk4uFkXyFhoeFdYGChYZ5ZHF6fnh5cGxpZl59c2h8dXVzfHJ/al5gdHZwd2RjWF1eUmpoVGRYXmBnanZ4gXFma2NsZ2V/gGptfWdtcGp9d4Z6a4uBcoGBfYF0doKNhn98eoCBfX+PaXKDbnRpYohpbGJfcVV0b21uYHhobFdqdHZidXp7cWJrb3mJjZ+zkqWlnY6QmI+GnaCanHx1o5+Nl3+MoYqImpZ4e4aHfoOJfoiCgX9wfnp0dYKFfomQd2djfYaXi4KKjXh9gI2DeZaAlZeVjZWfmn1vi4GQk4alm4eMiYOlk4ORipaXkpF2kZ2hoZiUmHp/jpeWjpaanKSdmZOUm3qQhoR5hZaNnX2Bio2LcpeinqCSmI6PooyMg5eYg5OWmn+XjHuIjIB2cX1temOAfIuFcIaTf4+Ba4eCgX+JhGZ2b32Ik5mOfpR4jIl9gIh9fHKAeYqGeoSRiouYopaBg4x3iISCgXZ7gIeDdF93d3xzfXdma2NgfmlqdnN0dX1xfGNjYXNudXJtYVlfXVprZFJiV19gaGt1eYZwYmpjbGZofINraHRobG9of3yBeG2PhnGAgoJ/dHyDjIGAfnqCg358kG11iXR0bWWKbGpiY3VWg2lwbmB4Z2xhanZwZnl7eXFfcWyFhZCdrpinqJ6OjZeHhZ+Tlph9dqibiZh5lpyLjJiPeHuAi318g3uAgoF4c3h5c32Ag3+IioBkXn2LlYh+hYh0fX6Kf36YhJaTloyjoJd+cYd7k5CKpo+MjoqSn5CCkI+Ul5GKgY+YoJqSkJJ0gI2Rk4mcnZ6mmJiOlZZ0jo+LbYaYj5l6h4iQiW+XnZqik5SKjJ+MhoKSnH+TkpaHmYh7iYmBeXF5anVse3+Lfm2FkYKTd2+Cg31+i4Blc2p9gZeYhX+OdJGJhHqIfnZ4gX6HgX2DjYWNlKSQeYWCdImHfX9ydH+FgWxgenR5cHxvYW5iZHthbm92c3d3c3NhdmBva3Vub11bXl1dal1PXVdiYWhtc3qJa19pZWpjaHeIbWZsaGlsZ4B8endvj4dzgIOEfXSBhol6g316gYR9fY5yeYt5eG5sh2toX2lyY4docW9ldmdtbGF6aGt8e3hwYXdti4GZmqqhpKmeioqRhoqeipWXfXasl4yWfJ6TkZaUiHZ9e4p8e4B2d3+Ab3Rzem+FfYGAiX58YVx+j5GGgISEc3qAhnqPkYeRkZuSpJqTgX2AfI2JkaOIjYqNl5mMhZGYk5WOiYmMk52TkIyNboSQjpGInpmhoJeWiZeRb4qahWeGmY6UeomFkIpwlpqToZKSiIuZjIKAkZ59ko+TjJqPe4qEhnNzdWtxbnV8i3RuhpCNkXF0gHyBgoh8ZXFten6blH6FiXSRi4F0iXpvgX+CiH2FjIqFjZaojXuIfX6LhXd+cG5+g4FiZ3dzdG56Yl1vYGp0XnBqenh4bHJwZXldbWxzbXNYWl1fYWpaT1dXZGNmcXF/iGVdaWhnYmdxjW5kaWdkaWiAend1b46Ec4GBg3t1goiFeIV8d4OFeoCKd3+Le3tyeYNqa19waHN/a3FubXFnb2tle2Juf3l2cGt2d4l/o5iiqKGnm4iMioGPnIaTnHSAqZSRjYagjJWTkH9ze3aEd3h/cnN7hWtyb3ltiXZ/gIZucVtZfpKNiICBgXZ1gH9/oIaPipGcl6CTlneJfoCMh5ydiY+GkpeVg4iUmY+Wi4uNjo2dio6QhG6Ji4+RipyWoJuYlYaYiGuFpIRnh52KkX6LhIuBd5OYkZ2RkIiJlY5/fo+YfJGNkI6akn2LgIJudm9rbW9we4Zpc4OOl4pxd4B0goiCeWd0b3aCm499ioV6lZJ6d4p1cYp8h417i4aEiY+co4h8hHaBi4B4eG5qf4B+XHFycW9veFpdb2Bval5vaXx6cG1tam13YHBvanFtWVhgYWFtV1FTWWVmYnVwhIJiXWttZGNma5JtYGZmX2drgXVxcnCLgHR/goB4doCLgHmGf3eHhnaDhXyGjIB7dop/anFifGKFfG9wbHRqaG5sdndfcX55e3R1c3+CfqWVmq2fp5aFjIN+lpSDj550iZ+TkoWKmoyVjYt6cnd0gm9yhXNxdYhsbmx1bYh3g31/bW5VUYGrlIeCeYB2coJ5gqCCkYGSkZebkZl3kHqCi5GjmpOOiJWYkYOGlpmLk4uIj4+InoWQinxzi4WIj4icmZ6blpSAlH9php2JaIegiJKEkYOJcYORl4+ajY+Mi4+Nd3uSkHuOjI2Sl418iHyAa3ZpbWtsbHp/Ynl9jpWBdnqBd4OMfHlodW11iJaMf4mGe5SRcnqFcXiOe4uNe4l+g42Rn56FfX14gYt9d3Boa4CAd153b21rcXJWXW5hcWFfbW55cGdwZmZ0dWhxa2F3ZV1WZWBgclNQTltlZF14cIh8XlxocWJiZWaRaV9nZFtocH5va3Fzin12fYWBdHV/jHl7hoB4iINzhoV+jIyEfHmVeGZxaoNfh35vb2t6YGltdH90X3R8eIZ3c3OFfHmhkJqxnKWOgop/gpmIgIudfoqYko6EiJeOjo6EdnR2c4Bwb4VzcHGDb2ppdW2Cbn18bXVzUk6C38mS1pN8b3SDdYOfgpF2lJCYm4+Ye5NyhZCfoZOTkImSm5OFfZWVh4yNh5KNiZx/joF4eox/iIyKm5ucmpWTeY13aYmSiG2JpIWTiJiDhmOMkZiNlImWi42Ji3B6lYl8jomKkpGJeoV8fm18ZXJva2t5eVuAeY+OgXp+fn+Gjnp6aHRsdYyQioOGhX2WjGx+f2+BjH+NiH6Ee4ORlpubi3x3eIOPeHNsZXB/gmtpdG9naHNtU15uZHBaX2txeGZra2JneHNvcWNfd2BgVmtfXnZPTUtgZmNdeXGKdFxbZXZgYWVljmNgZmJYaXJzbWtxdot8dHmGgnV2fotzf4Z/e4l/comHgZGKiH1+mXZlc259ZYh/b3BrgFprbnl5c2B2enuNdnJ3ind5n4ybr5ugkIKFeIiUfnyJnIeEnpCOhYyXhJOOh4F0d3B5cG6Eb21ufnJjZHhwfG56fGpobGOkmsHcru+hc2t1g3WEoYSRbpWPlJ+UmoGRcIWLo5eJjpWKkJ2Vg4CUj4SIj4CSioqXfod7dX+JeIaFjpual5mOj3WKd3CHiYx+jKWFk4qdhYZei5SXiY6IjouKhIlsfJeCfYiFiZGPhnaFfn5rfWN4dGlteHNXiHqRh4V5fn+AhYx+eWZ0a4GLj4uEg4CMl4ZsgnZuiZGDkYV/gnuBkZeTmZB0dHiHjHVzcWZ0eYFhc21vYWh1ZlJgcGdrVV5tc3lgcmNgaX1xcm5aYnJhYlduWlx3TU1MY2ZhXnZzim1bXGR4XmBkZoRfY2NeWWlya25rcneLfXN3hIF4d3yIcYOEfX2Ie3SLiIiVh4x/f5hzaHVxeW2Me250cIBXcHl2eXFkdniGjGl2gIpygJ2Imaeco5KEfHCMlHh5ip2DhJ+NjnyVjYCZh4R7cndwc2pvgWtpbHx0XmB4dntwdHpnYGV869q1ycPciHNsc4B2ipqIjGmXj46clJKBiHCFiKCOhIqVioyXk3yNkoiCiI96kYuGj4KAd3iDhHKHgpOblpOYhox1h39xhoKKiJqjhJWNn4SJYYOVj4WIhomMh4CHaH2Uf32DhImOjYJxhn5/cndndnJoc3drWox9koKFfICDgISKgnZidG2KgpGMg39/k5F9boJseYeQh5OEfYJ+gZOUkZeJbnJ6jIV0bHBqcXd/XnNoblxpdV9SZHFoZlNfb3Z0X29gXWiCcXJqV2doY2lYbVdbdUxKTGVmXmJyc4VoW1xleV5eZGd6YWRfXVlrbmVuanR3in5zcoF+enZ6h3OFg3x/h3d2ioWPmIKNgnuTdmx3dnl4k3VueHp9WHmFcYBvZ3h2kYJkdoaFcYqWhpmhm6KKhnNvkotydo6bfYmZiIl7n3+EmX+BeHF0bm9kcn5oZmx3d1tfeHt6cXF/aWFnYX/Vto6QpnhucXd7cZKQjIZqmI2Im5GLhntoh4uZhoGSkIaGl417jIyAgImNe5CNfomFenV7g3txhoCVmY6Sk4GJdYSHd4SAi5OeoIeWkJ9+iGF/k4eDh4OJjX9/gmZ9kYB+f4KMj5B+bYN8gnRrbXd1c3Z1a2ONgY5/hX58hH+EiH9wYHNyhnyQjoN9f5KJenGDZnuEi4eNhHyFf4GUj5GThG5weYx+dGxuaWp5fGFnaWlYa3VaUmlyaWJQYnJ4bGJlXlpqg25zYltnX2RtX25UWm9OSE5mZFxnbnGAa1pbY3NfXGNsd2RlXV1abGxibWpzdoZ/cW9/fHx0eIV4hYN8gId1eYmBkpV8iYZ2iYFweHl7hJNvbXuAdl6Df3SBbWl6c5RzZ3KIfXKSkYSan5ughoZ1dZR+bXaTl32HkIOKjZl8jJp2fnZxb2xqYXR8Z2JpdXlaYHd7eW1xfmVjaGhXnY9ecXKWvMSEdnGUiI99cZaLhpuSjIdyaoiPloB7lIyBhJqMfIqFfHuJi3+UiHWJhnZ3fYFydYaBnpSFlI+Dg3KAiXWFfIqZnpmHlY6cgIhmfZOCfoSDiYlygX1mfox8eX9/h4uPfWmAfYN2Zm95eHN2c2xrjoWKgYp/eIKAhYN/a19yeXt+jouGfIKPgX5ygWl5hIiMhoV5hH2CmIyQjH1ubXuJfXZzbmdme3ViW3BiV25xU1Nuc2hhTmZ0eGVgXl1Zb4Bvc1llYV5qbmBwT1lrUURTZ2Baa25tfG5ZW15tY1pib3dkZ1xdYGtpY2xqc3aBg3Btf3x/dHWDeoOCfIKFdn6IgZaQeISLdIGIcnl5fo2Qb297gHFpgXh6fm1se3WVa2p4hHRsk42Fn5igmYSIbn2Mdmp4mI5+gImClJeJeY+Wb3pzcGxpZGBzemhfZXF6WmByfHlncXphZWWPsbJ3SmJapNnQlnF7kIqPd32TioSYkYyFbmuFkpJ6eZKGgYSYinyGf3h3iYqEloBvi4hxdX56anmFg6WQhJKMg39vf4N2hHmGm5mVjJSRlISIcHuSgnyCg4iDboF3aICEeHJ/gIOKh3xlfX6EdmNwc4BoeHBvdZmNhoOKfHZ4gIR5gWtccX9zgomGin6GiXuJcoFucYWHj4WFc4V6gpmNjYR4bm9+hH92eWRnaXtwXlh2WlhwbE5XcXNnYEtsdnRgXVxaWXR9c29XZ11manFgb05XaFI/WWZeWm9qZ3pxWlpZa2VaY3F5X2hcXmVsaGVraXF3f4dubH9+gHVvgnuAgn6Cf3aBhYiXinGCjXF7hnx6eYSTjHVqen9rb350f31vcnt6k3BvgX94Z5KLg6GZnJKChWaGg29neZWIfX6EgZiJgXyNjGl4cmtrZl9hb3ltX2JveFxka4J6YXF2X2Vl1Oq9izI6PouOf3F4hYiOjXaClYx+ko2Mf21shYyLdX2Pf4WBlYh8gnhudoeEg5d3boiFbHV7dGZ5goOni4KOi4R9boB1d4V6h52RjZGSk4yLhn97koZ3f4OMgmt/cmiAfnhtfHyBioN3YXmEgXFkcWh+bXVxdYGbi4B/hYBzdX6Bc4FvXG5/dXmLg4t7h4B8iHh6cWyJhJCEi3KDeoCWi4p/dG1rd4CAdHRcaGd2b1hWe1JZcGRMWnJyZVtJcHhvXFtbWV10fnRoWWJbZ2VuY2lNV2ZRPV5lXF11ZmB1cFpZVG9kWWRxeVpoXV9mbWdpa2lwd32ObGmChH55boB8fIF/gnp1goGNk4RwgItud32Ae3uIkol/aHt9anN7coZ7c3d+f4x6eIR9fGuMjYSbnZaMgIBsjX1raH6Ni3p+foOTgn59iohrdXFnaGJbYmdzb19ha3NgaHCIemJzdF5jZJugj25cNVqvtXRpgIh8koZ2hZWFc46KiXZwbIWChnR5iXiJfJOIen5yZ3WJfn6Yb3GGfmh2eW5meYeEpIeAhoyJfm5/doCCfo2aiIKUkZiJi4SJfI+IcHt9hHtofmxrgHt6aXp2gYeAcmB3gX5xZHJmdIJtdXuGlZGBfIKBb3d6fXV+bFlwgHd1jIKGeIh2gol6eHNuioGQgYZzf31/k4iJem5tam6CgXRtXGdkcnBRWnpNW29cT1xyb2RVS3N4aVdZWlphcYB0YF1dYGZkaGlmTlpoTUBgY1tgdmFddW1YV1N0YVpkb3JXal5iaGtnbWxpcHd8kmxphIl8fHB+fnuBf4J6d4B/iouDcXuIb3F3g397iY2Pg2p+e213eHaKd314gIKHf4N+fnpthIyImKONhIN6dYt4a2yDh5B4fXqBkYCAfoqDcHJxY2ZeWWZfb29fYGdwZmpviXRhdG9bYWRqdnuAv5ympMi4cYWDcpJ8eIaSgnOQi4dxcm+DeoJzdYd0iHeUiHl5cGN3h3qAk2lyhHZnd3VjanyCiJ2Bf3+Oj31zgHSFeoGSkIN5lo6Vj4iCiHuIiGt4eX50Z3pobH95c2l6doCDfWhgd4d9amt0Z3qAaXaBjJGUfnp+fnB8d3x0fmJWeH5zc4qEgn2DcYeKd3hxcISCjX9+eX59do6Fg3ZpcWltiIFwb11nYXFtSmV1S11tVVRac25iUU9zeGBSWFhdYW+Cc1thXGhlZWNrZFFbcElDY2BbY3BeXXhoVVZVd15bZW5oVmteYWlnZW5uaHB2epJuaYiMeH1ye355goGBfHZ9g4iGg3B3hHJtd4OCfYmLk39wgHt3eXqBjHSDeH+BgYKEeoB1b36Ki5ueiH2FeneFe2d0hYyPeX5/e4iFg3aPgGdwbl9kW1hlWW1yYWBgcGxraIluYXRpWV5kboB3qdqqx4aHsnGJd2+MdXuGjX96kol/dHN0fnd/b3F/bYR0lIZ4dWtgeoJ5iY9mcYRwZ3ZuW218gJCTf4B5kZJ9eHtuiHeBko2FdJaKkY6HhYV7f4RsdHZ+bWd2ZW17dW1qd3Z/f3xhYniFeWh1dWJ9e2d1ho6NlXt0gHZxgHt9bX9ZV3V/cHWFh3+BeWyJhnR5bHWAhIR+e315e3OLgX1zZ3RlbouDa3NaaV50ZEdtbUxaYVdWVndtYlBSdHZXUFZYXmFxhG9cYGNtZGReb2NVXnJGQmVfXWZoXVt6YlFVXHVbWmdrYVZqX2BuZWZrcWhwdXiOdGuOjXV+dnh9d4GDgXtzfYOIh4NvcoB0cXV+hYGJjYp7d393g3t8hYd4h3x9gX6EgHt+c3Z5jI6gjYl6iXZ0g3hefYWYi3iGg3SFhoR3iXtibm1bYVpbYVZpc2NgW2dub2aHcWFxZldcY2t/fMrOh7mham1timxxhHF8g4l+epCEeXhzeXV1fGpsdWOEdZKCd29mXn2CeouKZXKCa2pxY1hteoWbiIKBc5aTdn58b4pxgouNiHKYjpGJhYuDe3h9cXFvfGZocWJteHFqa3F4fXx6XWV5gHdpdnhmgndndIeMjpR7cYdqb36AeW58XVlzf250gYt8gm9vin9xdmh3f4GAgXd9cXt1h316cmZzYW6LgWpyV2pedltIbWpNVlReU1V7a2FPVHVyUFFUV15idIVpXWBramZjWW5hWWRwR0BnXGBmX1xVel1PVWRwWltqaF1XaGBecmZrZ3FncHJ3hnhulYp0f3p3fniDh391cn+GhY6DcHB7eHZ1eoaFhoyFenx/dIt+fYaEhId/fn59h398eHZ5eJGTn3+MfIttdX94ZIKGlYVzkYpvhYWBeoN0Y25qWV9aXV1UZ3JkYFhkcXJmgXNia2VXW2Bqf3i+rnugtm5ic4Zoc3txeYGEen2Lfnd3cnZve3Zlam5gh3WOgXNqYl5/eHmLhGZxf2hra1pWb3eJo4GEf3GZknGAeXaEboGDk4lzlYiNiISJhX14dHJuaHhgam1gbXZqZ2preXd6dlpnfXx4ZXJ+boR0ZXWFjYaWfm+MZ2t6g3VtdGJdcX1sdX2Me4FmdYd9bnFodX94fn9zfWx7e4J7eG9lbGJuiX1rbVZpX3ZVSmlqT1FOaE1Ye2hhTlV1akxQVFVfZnWDZl5gcGhnYVdpXVxsaEpEallhZFdZVHhZTlZtallda2RcWWVjXnRmbGRxZ3JvdYF4cJmFdn9+d398hYd9dXOCiICVg25zeXt6c3KFhoiIg3iBfXWPfnyEio6EgoR7fouDe3d8d3eanZd6ioKGaXZ9e2yDhJJ/cY6BcIWCfoF/cGZsZ1ddWlxbU2RwZF5XYnJ1aXVwZWViV1xcaX9wb3KAc4lkZHh+aXR1dHKBg3eAg3l2c3Vta3pxYmdrZ4Z0jYNuZl1ffXB7iX9pbXhnamRVV3JvjaZ8hHt2lpB0fHN9fG58fJKGd5l8iIaDhoN9dHBxbGd0XGxoXmx0ZGdmaXpve3JZZ4B2dWhwgHiCdmJ3hYt8lIBujGpte4JxZnNlYW56Z3N4inx+YnaDdmprcXV7cXp6dH1mfn+AeXduY2ZiboZ8bGpVaWJvUkpoak9LTm9HXntmYU1VdGNKTlNXYWp2fmVdZ3NpZWBWY1djcF1MS2pYY2FVVFRzVkxYdWRaXmtgXFpjZV92Z21icGlzbnJ/dXSagXd/gHd/f4aEenx0goR+l4VucnR8enRxhIWPgYB5i3V0kH98gZWOgIWEfX6Mhnt+gHZ7o6WKeYiGhGt1fHp1g4GLem6Ec3mEfYGDdW5qaGVWXVtaWlNibWRbWGFze2lobWlgYldfW2qAaWtwgGdrYGh5eGpzdHRuhIB6f3x1dW56aGp5al9lbmiBdpCEZ2VYYndqfod7b2lwZ2ZdVVhvZ46od4F6fJGOeXVwf3BzdnqPgHiVdYaDgIWIdmpxdWdobltsZF1tcl9nYWp4aHttW26CcnRqb4B+eXhhd4WEeI+Fc4hyb3mAcmNxaVxxeGRydIl8eWJzgHBnanl0cWx4eHV4ZIN7f3l3cWRkY258fWtrVWhhZVJKa2dPR1FrRWF4Z2FNU3JdSk1UWmVrdnplX21xaWRdVmBWbm5XS1NoV2VeWE5VbFRKXHlfW19rXV1bY2VgeWhsYG9vdW5veHV6mH13gIF6gICHhnp4eYJ+gZOEcXR0f3l2dISIkX2AfJBrc5WAe4KfhX6HfYB/hoKAint2hKuff3qIiINrcoF5dYB/gXRuhm58gHOKgGpvbWRkWF9aWVpUYWpnW1pedIJpXm1sXGFWXFxsgWVxdH1paVxrdnVnc3ZybYV7fXx4dXJseWdpeGZdZXJoeneTgWNjVGVwZ4KFd3dnaGpgV1ZZZ2OPp25+d4CLj3twcX5oem96jXx3j3KEfX9/hm5kdXJkaGhca2Fcb29cZ19tdWR6aF10gG9ya3F7fXV2YnSFi3uIh4GAeHJ1f3VhcG1bcnRjcXOFfXVlcoBsYWx7b2ppe3p1cmaFdnt7dnFlYmVtc35pbFRnXVxUS3JiUEZWYUdid2dhS1RvV0pMWFhna3V6ZGVucWZkWlddWHZmVUpcY1dnWFlJV2VQSGJ4Wl1fbFteXGFjXn5pal9udHhub252g5d5coGAfH+JjIZ+dXWGeYeMfXN1dYJ5enqCjI59foSJaXOWgXqKnX1+hXqBen98hohzcY+tjHt7h499ZXGHeXN8e3VyboVse35sj3picG9iZV1lVllZVmNma19dXHKFaFhwblteV1pcbHticHd2bWJabHNzZ3R1cGyEeH5/eHdubnRkaXRlW2d0ZnZ2knlfXVJmZmqDgnR+YmNpXFRYXmJjj6RoeHSDhpF4bW97aXhufIV7dYlzgHh8eH9oZHZsYGZgXmpfXHNrWWVdb29iemVbd3xrbm5vd3hzdGRzg5J+h4OJe3Zwcn5zYnhkXHBwYnFygn10Z3KAZV5udmlkZnl8dW5vgnV0fXRyYl9mbm99ZGlTZ1hXU013X1FKWVhIYnVkYUlUbVNKTVpXaWxxe2JsbHNjYlpaW2F3XFNMY11YaVNXSFlgTUZpdVheYGxbW19iYlyEaWdhbnh5bG9qdoGQeG2DfoCBk4iEgXZziHSMhnNxd3WCd3x9foyQgH6TfnB3lYN8mZJ5gIB4en6AdIiDdHCZont6f4mUeGR1h3hzeHVrc25+a3h8cJFyXnBvYGdibFRbWldoY21mXFtxiWVTcm5bWlhYYGx2Y2l1amleWW1zcGxzc3NphHx+fnt2b25sZGlxY1trcmR0do5zW1dTZWFygH9ygl1iY11TWmBcY5GfZXFxhYSRdGxse25vcHt8fHGBd39zenp6Y2V1aF1iWmBnW152aFdiXW9oYXdgW3t2aWpybndzcnVocYKVg4Z9g3ZzanF9bmZ3WF1sbmNyc4F6dGdvfltgcHFhX2pxfWxsdX5zcXhrcGFcZWxsemFnU2ZUVlFQdVtRT1hRSGN0YmBGVWtQSVBaVWtranxlbW5xYFtaWFlscVdTT2ZXV2hTVEZZXE5IcnVYX2NtY1hgYGFdi2pjZG15eGtvaXV5hntrg31/hJp8goR5fIduj4Zxb3d6fXSCgnyLj4KCl3R3gpOFgZ+JdYGAgXR/gnGHgnVvopdze4aLhntld4pubXpuZndwemtzdnKMa150bmFnZWtSXVtWZ2Fsa1pccIxkT29uXVZYVWdqdGdidGVlXVltdG1vdXR4aoZ8f3uHdo9zZGRrbmFdbm1jc3iHa1pUVmNkeH19cYZdY19jVFpgWWKVlWNucIOFinRraHxwZnN3c3xsenR1b3p+dV5lcmNbXlZhZFhhdGVVX2BtZGFxXV1+cGhpc3FzcHR2a22Ek4GIeoRxc2dvfnFzb1RcZ2tmcXSBd3NjbHZVYnJrWl5vZn1lbXd9c3Nza21gWmRqandeZlRkVFVQVG1XUVZTT0dkc19hRVhpT0hXVFZtaGR8aWt3amFXXVVbdGRTUldoUVllVFNIWlpQTXh2Wl9lbGlZYmBeXo5uYWZreXVub2h2dn9/bIOAfYeXe4CHgYl+a5OIcmd0gHt1gIJ9iI5/i5NyfIqRhYefhnt/hoxzgYZzfoJ2bqWMcoGNi3Z3bXqMYGR7cGZ4cnhsbXF2gmdke2xjZmdoU19eVWdfbG5bXm2NaE5pbWBUVlNvZ3NsZnhkZFxYb3NscXp3cmyHe392m3p5a2FlbG1eYG9qZXF5fmdaVlhgbHh8e3CEX2JeZ1dYX1dkm4hia3CBh314bGt5blx3cWx7anZzbm97gHJYaW1eWV1VYmNXZHBjU15haGFibFpgfmtma3N1bm13dmxphYx/iXmHbXFmcX1uc25jWmFpaW90gnRzX2lsU2VxZFVibmJ6Y3F3e3ZrcG1rYFlhZ2h0XGVVYVVSTlhlUk9cT09IZHBdY0ZZaU1JX0tYbWRfeGhufWNfVF9UXXVcVFNgZk5dYVRTSlxZUFl0dV1fZWxoWGNhW16NcWNnanhxc25ndnR6g3KCg3qIjn58iYeNeW6QinRsc4J0f3+HhYaShJWPeX6Mj4eRm4SAfIyFc4CBc3R4cm+Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjY2NjY2NjY6Ojo2Ojo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjYyMjYyOjo6Ojo6Njo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREJOpa+tra2usWFAREREREU4Li8vLy8rSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1M0GptrS0tLS4WTA1NTU1NyccHR0dHRg6g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt9fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmJiZmpKPkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFho+QkJCQkJGJhYWFhYWFhIODg4KCgoSKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQj5CQkIuOkZGJh46KkJKTkIqRjY2Ph4+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6NjIuLjIyMjI6Ojo6Ojo6Ojo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fH19fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCOh4mHh4yHipCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI+GioeGjoaMj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCQj4mHiIeMiImPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhoeHhoiGiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX5+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2JjYqKjImOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo+Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomHgoeNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYWEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f39/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/fn9/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z5fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjI2MjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dHZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaWhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3l2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0dHR3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRUA+Ojw+PjxFRD4/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycnR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5OTs7OkA7Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTU1NTk9OTk1LS05OTk1OTkxUbnBwcnR1c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo7Ozg5Ojg3Ojw5Nzg7Oz49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VzcXN4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw5Nzk6OTk4ODo6Nzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PDw+Pz08PTs6PD09PTw8PDw7Ozo7PD49Pj9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcXF1dXR1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NDQD48PT9BQD88Oz49PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXt7e31+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRUQ/PTs8QD88O0tHODg6PDk9PUA9Ojw7Ozw7ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHFycnJ0dXZ6e319fH5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/P0FBQUJBQD08PTs+Pjk3ZGw7ODo4ODo7PT8/PDs7PDs6Ozs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fX18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBe05JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0FAP0BAPT1GSUpreU08Pj0/PT0+Q0Q/Ozw9PkA9PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fH1+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF9UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRUNEQkBAQ1tBUXR9gX17XD9AQENAQD9AQD49PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAP0BBP0BDRkVDQkJDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwb3FwcnV0d3p8e3x8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFBQkBBb2N/hIWCg35pP0JDRUA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdERUZGRkpOTktKSUdHSEtMSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGAgICBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QEVGQ0p2gIKBhHuAhXREREVEQ1d1homKflhHSUpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSklJUXaBfICEgYOIcERDQVV0h4mHh4aHgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0NERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMS0pVeIF+goSGhoeDVU5shIeGhoaHh4eHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJS0lJR0hJR0lJSUpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3V2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0xLSlh9g4SEgYOHh4h9f4aFhISGhoaHh4aKdUlJRkI/P0A/Pz48PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRURCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcnRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISUlLUXaEhoR+gYWDg4SEhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5AOzk5OT09Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSUxIcYaFgX6Bg4KDgoOEhomKi4uLiomKi4yJVDs4NjU2NzY2NjQ1NzczNDY4Ojg3NjU2NTY3Njc3ODo3Nzc4OTs3Njg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVDREt7hoSBgoODg4ODhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo6Ojo6PDg5ODk3Nzc3OTo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1FXa3JydHR1d3p7e3t8fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc7Qjo9TX6EgoOEhISEhIaJioqIh4iIiYqKjIqJiYx6Pjo4ODs8PT45Ojo7ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw7OTs8ODo6Ozs5OTk8Pzw8QUJESUpNS0pLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDs4OTk4OTo6OTs/P0FKfYOChIWFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQEI+QEJAQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQEA+P0E8Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHFxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Oz08PkBEQ1WCg4SFhIWEhomJiIiGhoaHiImKi4uLioqLiotePkRHSUtJSUZHSERGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREVFQUZFRkRGRkRAQj49QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enl6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz89QT9CQ0dFaISDhYWGhoaIiIiIh4aGhoeJioqLjI2MjIuKiohXR0xMTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGR0dFS0lLSUtLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0dnd6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5ODw+Ozw7PkBAQT9CQkZGS0p1hIOFhYeIiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUlISkZER0hISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDk4PDs8PTo/QD5AQENESEhQW3+EhYSFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpJR0VKSERKSEdLSkhKR0dHS0xOTExISElKTVBOT05NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VucXV2d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHR0I/OD9AOTo8OD0+Oz1BPj9BQ0ZISlRxg4SEhIWFhoeIiIiIiIeGiIiIiImJjIyLjIyLi4uLi15SUlBNTk1LSkdGQ0dKR0xKR0tPTEtKSk1NTE9QTkhJS0xPUVBQUU9PSklKSkxKTEZHSEdGR0lGRUVCQEJCXHByd3h5enl5eXp6e3x+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgIB/f39VRUNFRUdHRUQ7P0E7PTw5QD4+QEJHR0FGSUlOVHiFg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pFRUZLT05PV1ZRUE9RU1JOU1RPTVNMUFNVVlJTUlBMS01NTUtOR0dKRkZISkRERUVCRENjcXV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRUdHR0dIRj5AQj0/PT1CP0JDRlZORUxOTVFWe4aEhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7O1FTUmB1XVVWVFZZWVNZWFJaZlBVV1pdUlRXUVBOUlBQUFFLTEtHSElIRUZJSElISWpzdnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQEVCQ0dFREVMWFJNU1RTVlh8hoWHhoWGh4iIh4iIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD9AVlVZXGRgVllicl5dV11aVkVRWVpcWV9UWWdSVVZYVFRWU09PTUpMSklJTE1LT01Tb3R2eHl4d3p5ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Afn9+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1NXWVhaWXiFhIWFhYWGh4iHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUldWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSUZCREBBOlBRUVdYUFBPUVNUVFdYWFlaboGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKf2ZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpbWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllab3N1d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJRVVJVU1dfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVFNUXlpYV1dXemtYWlxcXlNQUFBJTk9XVlhbWmRxdHZ2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gICAf3+Afn56eHd2c3V7f3+AgHRrfn5rcnleXFZVU1JPS0ZDREFNXoNsVlJTTk9RT1FVUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYmHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JQUU5LUlRRTU9ZUU1OUVNVVU1RU1JQTkxMSENJSFJTVFpdbXJ2dnVzc3d7ent7e317fX19fn19fX59fn9/f39/gH99fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVVRTElMSWFsknRQUVNOUVJRUltSU1JRUlVVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkNDQ0NCP0RQQ0NAQz5CSEdWQEhOTUddaVFIRk9GREVGSEdIQkNIR0hKR0RCQUNAT1BNUmR0dXZ1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZWJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtsc3Z6e3h5dXJuc3RzeXh+foOAg4KCgIKAgoGBa0xHPj46Oz5APz8+PmpQS2FFRkhJRUI/R0xNR01RVUlCRT8+PD08PT0/PT9BQ0I/Pzw9Qj5KTUZVb3V1dnN0dnh7fHp9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9enh6fHx4d3hkQkBAQT06QkNBQUNBW1xPe05PT05LTE1PT1FMS0xXTUhHQEI8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXV2dXZ3eXx8fH18fH19fX58fn19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlNWWFNSWVROWVpbV1lcX19gZWBdXnF3a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSUVFRkNMUU9hV1JYUVBTU1JVW09PUVZQTUlDRj46OjY0ODY5Nzk6MzY1Nzk1PEI9ZnR0dnd3eXl7fX18fHt8fX1+fnt+fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtUVFNQUVVPTFJTVFdZVFRYUUxYWVlWWFhWWFldV1dYaHNrXVZgdGthYV9dZGBfXllVUE1PTkxJR0pLSUhGQ1BPU1pXVFRNUVNZU1xlVU9TVFJOTElIQz9BOjk4ODk3ODg0NzU3ODU4OUducnV4eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFdWVlNUVk9PVVZYWFlTVVRMS1RVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk5OTEpGUFBVWVNUTkpOT1RTVFxWUlVTU09NTElISEY/Pz06Nzg3NjU5OTY3NjY1V3FxdHd6ent8fX59fnx9fXx9fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwb2ZlZGNcXlJUWlZXVFNWVFJYWFlZWVJVT0pHUFBPT01SSk9QUFBOTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUVBOTk1QTlRSUFJMSUxLT1FQUVJTVFFTT0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+M0A+am9hUlJRQEZUUU9QUFFOUU9QT0xKTExPUE5OUFFRTlBPSk1NTUtHRUVEQjs9PTw5PUc2Njc3RG5xdXd6e3t8fH18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkM4RU5TXWdTUVNBR1VQT1JRUE1NTkxKTEtMTk9PUU1PT01JTUxJTEtMS0dGRkVEPEFBPjtARTs8ODlUcXN1eXt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa25xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT89PUFAQj0+RUhGREZGSUdLSkBGQUFARkhFSk9IUVJhXFFQUk5TT09QTExPTUtNTE1PTltWS01RT0hKSENJSkxMS0ZGRkU/Q0M+PUJHP0I+QWRxdHd7ent7fHt6end8d3l9fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPzs/QUBAPkFESUVDSEdJR0lFQkI/PjxDQkFHSURNT2FlUE1PTldLTE5LTE1NTExLTk5TZE1KTFJISUpGQUlKTE1OS0dJRkJBQkA/RUZFSERMb3B3enp5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTExJTVBNUE9HS0U/Qj05OTk6P0I/PEFCQkFEREdLRkRJSUdHSENDP0I/P0BBPkNFQ0tOUVRLSklNVEZJSUpMSktLSUpMTU9QUlBLR0NMSERDSkpMTU9NSUpJR0NDQ0RJSk1MSVpzbXh5eHp7e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhlcUhLQ0ZHR0dKS0lKTERHQj0+PTo6OjtBQj89QkJDQ0hGSkxKRUlJRkdHQ0M7QUBCPkBAQ0VDSU1PR0hLRkhLREhJS01ISkxISUpMSk1dUklIRE5HQkVLS05NUE5LTUpLRkdHSk1OUU5MY25pd3Z2e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRwRktDRkVGREVFRkVHQ0NAPjw9Ojs6OkBEQD5CQ0VFSUZKSkxGSUlHRkZDQjtCQ0M+QENDQ0VHTE5IS05IREhFSUxOTUdJTEdGRklJTE5LSkhFT0lDR01NTk1QTk9PTUxJSElPU1FSTlJmZ2Zyb3N4dXt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSUNFRURCQ0JFQERCPj8+Ojs7PTs9P0NBP0FDRkdKR0pJTEhHR0dGRUNAPUVFQj5BRENDRUdJSUdNUElGRkdLTk9LRkhJRkVERElJSEtJRkhQS0RKTUxQTk9OT1BOSkpJTVJVVVJPV2RhYW1ncHJvc3l6Z2VoaGNpbGdxbGZsbWdpa2xzbXB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0FBQkQ8QkE+QT06Oj0/Oz4/QEI/QEJFR0pGSUdJR0ZGRkVEQ0FBRkZDQkJCREVFR0dIRkxQTElPSkpMS0lHSEVGRURDSUhIS0pHS1JNQ09PTlFQT09OT09LS0tQVVdWVVNYX15daWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Bya2tzTUZHRUdCQkFERDxBQUBDPDg5PT46Pz0/Qj9AQERGSEVIRkZIRkVFQ0NFQkNJRkNHRUFFR0VGRkdFSk1LSFFNSktISElFRkhIRUNJSUpLTUtQU05EUlNRUVJOT05OUE1MTlNXVldYVlhdWl1kYGhiamlna19kZWZjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEJCQkZFPEBDQkQ8Nzo9Pjs+OkBCPj8/Q0VGREZEREdFQ0VDREVGRkpFRUlHQkdIRkdGRUNGSkpHTUtMS0hKTEZJSEpIRUtLTExOT1NUT0lUVVRRVFBRTU5RTk1RV1pWWllXWl1aWGFgYGBfaGVjYGRlZ2dqaGhqZmhubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3NzeU1ISEdJREJDSEU8QEVCRDw4Oj4+PDw9QkI9Pz5BQkZDRUJCSENDREVGRkdHSUZHSkhDSUhHSUdGREhLSUdLSU1LSktMSExKTUtJTkxOTk9SVVZPTFZWVFFUUVJMT1FQT1RZWllcWlpcX19eYGNeXGFja2JgZGdocoVoZ2lmam5ucG9uc3FqdHV4cnNzdHJucHF2cnF0cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0lLSEpFQkVHRTxAR0REQDk8PkA/Pj9DQjxAPkFBRkNFRENIREZERkZISEZIR0lLSkVKSEhLSEZGTEhISEpITUxMTExJTUtNTk1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXV5gYGFgYmVdZGBlZ2BlaGpjc3NmamhnbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBd3V1dXd2dXdzZ3Rya3Fya3J3b3dJSkxJS0dCRURFPEBGRERCOz8/QUBAQERBQEI/QUNIQkVERkdFSUVGRUlIRklISkxISEpKSUtKRkpLSElKSkdLS01NSkpNTE1OTk9MT1BSVVdWTU5UVlVTUlFQTU5UU1JXW15eX11eYGBhYWFgY2RlYmNpY2Rpamd2i2xraWhtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXRzcHN3dHV1d3Z1dXVlcXNrcHFqcnZwd0pNTExNR0NDQUQ8P0VFRUM9QUFDQkJDRUFDREFBRUdDSEdIR0ZKRkRHSkdHSkZJTEhJSk1KTUxHS0lIS0tOUUtSUUxTTUtOTU5QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhX2BiX2BlYmFjaW5pY2loaG14dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnJxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHRUFARD4+REVGQz9DQUVDREZDQ0VHQ0JJRUJISklISEtGREtKR0hKSElLR0pKTktOTElMSEpNS1pmSmRcS2xSSE9NX25VbHNbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZcbHRgbGtVX3d2aWpoaGZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPz1ERUZDQ0NCRUVERkJGRkdEREpFRUpMTEpMTUdHTUpISktHS0pJSkpOTE1NTExJTE1MW3NiZHBebGxVTU5mc15nZnFsbnRncGlfYVlubWJwcGJrampnb3F0ZXRub1xvdWdwTUtyeXZrYmFrZWVseG1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QUI/PUJFR0JGQ0VERUVEQ0hIR0RFS0hHS01NSk1MRkpOSEpLSklLSkpKS01NTk1NTUtOTU1bcm9vbnBwbGtOUFFsWE5pYnRycGFtb3ZcWWxQW21tWnFta29teHh0c2lwXGBzbHFqVXV5eG9jXmtmYmdwcGppb3BwcnNwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEZFRUJBQj0/P0VHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5HTE5JTUtISU1JS0pKS05PTk5NTE5NTFxoZHVdbHFXbE5QUW5VWmtea2x2YWxkdFRlY05sWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2hhZGl0eWtvbnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJRUVEQ0FCPEJAQkZDR0ZLR0VDQ0hLSEhGSkxLRk1LTFJSTEdNTUhOSkhITkhKSklITk9OTkxKTU1KWnNwcG9xcW1sT1FTb1lxa2dvb3Fxb210Xm5YYXRfbm9wb3Fyb291c3R0altedGN3eHJqbnpoYWFjZmFiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9udHN2dEhLSEpDRUVFQEA+Q0NBRkNISk1JRkNGSkxJR0ZLTUxGT0pLV1JLR0tKSk5JSEpMSUtKSUhKTE1NTElLS0tTa2JaaV5famNyclpfWmpvYGVlVWtfY1thYlFgbWhcalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbnBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW52cXJ1dHdySEhGSkRFREZBQEFFRENHQkhKTEdGQ0ZLTElFRkpPTElPSUxbUUpGSEhLTUlISklLS0lISUdLS0tLR0hKSkxMTEtJS0xOVFtdVFBVTVFQTk9PVVJQT1FPT1FKSk5QUWRxaVRZV1tbXFVZW11YXVxcY2ZhYWZiY2ZfX2ZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXp5eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUM/Q0dERUdDSUtMSEZER0pMSERHSVBLTE9LTFdNSUZFSElKSElLSExKSEZISEpHR0lFRktISUtOTElPXFdeT1xcYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXWJYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJESUVHR0ZLSktIRUVKSkpGRUhIUEpMTUpNUklIRUFIRkpJS0tJTEpIRkVKSEVGR0VFSkdCSk1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5fXF5TW15jX1pdYGNgWV9iW2BeW1RZWFpfXmRiYmFjZmlla3Jwb3Bwbm53hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUlERktLS0VGSUlOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlFRERFQkZKREBKS0pPW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1FbX2FhXV5jYWBiYmJjY2VaUlhWVlxbXmNgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXh5f359eXV5dnZybnp3dnhYUUpGQ0dFQkVHSEZHSElGR0pHSEZIS0lMRERKSk1NTExISkpISkc/R0ZOS0tLTUtLS0lHSEREQERBSElBP0lKR1BdYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RUV1fYWNjY2NiXGRjYmRjZlhRVlVTXFhbYV9eX2FhX2Rsa21qa2xudn51gXp8hIWFhYWFhYaGhYaFhYaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUJASUZDRktJRkZHSUdHSkZGRklMSk5FREpKTE5KTElLSklJR0JISFFNS0tPTEtLSUhHRUQ/RUJISEFBR0ZEVF1ZXlhfWF9bXVVYWFBdXVFLSldeWF5bXVZaYVJSX19iYmBgYmJgY2JiZGRiWE9SUVNcU1xeXV5eX19gZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIRFJLRkhISERGS0pNUEVHSUpLTkxMSUxLSUlHREhLUU9NTFBMTEtLSElDRUFFQ0hHQkFGRUJWVUVcVF1TVmBYTlRVTlpbTUpLVWBhW19YX15iXU9ZYlxgYF9iY2JdYmJXX19UUE9QUVlTXlxcXV1eYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElSY1FEV19JR0dIREZNSlBQRkpJSktOTExLTUtKSkdFSk5RUU5PT01OTU5IS0FEQUNERkRDQURFQUxIQ0xMUE9PTUZNRkZISkhHTExNT1BJTE9QUFNQTFFTUlVaWVdZWFhkVk9TVFBQT05RVVRcWVlbXVxhYWVmY2hka2xxc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01eTUdIWU1ISEpIR01MUVFJTEpLS05NVU5PS0tMR0dLUFNTTlBPTk9PT0hMRmBFRF9MRGZjRE1bSF5cc21PTVZtWUxDUF9VbFdnSl1XVV5ETFFVTE1TVlFSVFhXVFhVVFxUUGZaaGhkWVRrVFhXVVtcW2BgYWJiYmBnaWdubGhyenx9foGEhISDg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1RKS0dgVEhKT0pJT01SUUtNS0xPUlVST09KTE1HSE1RW1lPUFBOT1BQSktRf1FJfFlZcnNXUG1IcW5vYVZQcXF0T0Jrc25xdHBTb19bblhdVlxYVWtoVV1WY1lgWVpfVlVXf2p0dXVfYXZfWWNcXGZbX2FhYWJeYGJnbXBsYHB3dHiBgYKDhIJ/fX6Adnh6bXZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0pMRlJWTExPSEtSWFdRTk9PTFFUTk9RUEtLTkdNUFNbWlRRUk9QUFBLSFp4XVR4ZGhZUlNQdmd0bHBibmZrUnJPTHdtanJwc3JxcnBvcIBdZnp1eHFxenF+cn1rdX1iUmh8ZXNzb3NzfH1wfnlvf3JfYGBiYlthYGhrbmtibGZnbXd+gYCDfnt4d4B0dnpocn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tIS1FPTU5KTlZeWVVMUVNOWVlMU1NSTkxQSVFSVFlXV1FUUFBRUktHZ3hsY3hxbVpLTFR5cHVtdWJudlBkZUlldnFtd2+AamZ4eGlYclJpe21panp6fmx4en9wZ29YdnZqdnVwgGFzaH1pbHh8b19fX2NiXF9kZWZpamRnYmNkbGxwcHN0c3NzeXFyeGJsdGdyeXtzc3V5foFzdXpufH15eHJuTkpSdE5DQkVQUEhLTEpMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBKU1RVWFdXUFVQT05TSktyb3V1cXVxZGhhVm5McXBeR2h5V3ZUS2h5fXhgeXtzbmFebW9kU2dydW5teXB3bHZzdHFsbVxzfnprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkamhoZWVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21MS1pWSEdFR1JQS0xOS0xRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTkpUVFZXWVdPU09OTlFJUm1IaXdLYGR2dVVXbE9ubHtyYWpnf3ZVS1draH1sbWx4YFtwentfYHpzY3JveHFoZHxpcntdVEtsX3Z1a2l1e3ttfnhrfHBdXl5iW15iZGVoZmVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3Nya2htbXJ8a21oa3t0bW1rbU9HSktISkhIUlFNT1BNTFNTUk9TUldSVlRQV1pWVlRUVGFgUU9OS1RTU1FWVk9PTU5PUEpIUU5QVUxLS1JTUlJUUFZVUVFPUlJYWFFOUFVUWFhYW1tVU1NXW1dYV1pQU1VXV1hRXVhWXVVTT1hSVldXWFpgW2dyXltcW11dX2NaX2NjZWdlY2NiWmNjZ2ZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUElLS0xNS0pUUk1SUVBMVlZUUFRVWFVaVVJaXVZVVFdVWVhQT0xOV1VRTlVTTlBOTFFQS0lRUUtRTUtLT1FUUlFRU1NJSU1OT1FSUVFRVFZSWFdcV1NTUFJVVVZUWlFOU1JXVVRZVlRZVVNSVVNUVVhYV15aX2FdXFtaXV1gY1xdYmJkZ2VlZWJZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRkZmhRSktLTk9MTVRRT1RRUU1YV1VUVlhXV1pWVFxgVldWWVVYVFFQS09YVFFOVVBOUU5LU1BNTlVTTlJOTU5RU1BUUVNUVU5MTk9RVFRSUlFWV1VZWltZU1VSVFhXV1lbU09TVVdVVFlVVllUUlJXVVZYXFlbYF1WWV9dXl1cXWBhXltiYmNoZmVlYlhgYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl5dY2hrYWhmaGZkYGJkYlBLTUxQUUxPVFBQVFFPUVpZWFdZWlpYWVZdamRWWFlaV1ZUVE9LT1dVUE9UUFBRTk1RUU9SWFNSUU9NT1NVTldRVFVVT05OUVNVVVRUUlRYVlpdXFpWVlFSV1hWW1xWUFNWVVVWWVRXV1RSUlhWVltfWl5gX1ZfXV5gXFxgYF9fWmJiZGhoZWViWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9VXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNOTlJQUlJPTFBTUlVaVVRQUExQV1VRVlJTU1hNT1BRVFhVVVVTVVlYW15dXFtWUk9VVlZbW1dRU1dVVlhVU1haVFNRWVdXXV9bX19gVmJcYGFeYGJfXGBdY2FjZ2llZ2FaY2BhX19lZV9gY1taXFtcWlpZWVdcWVxbYF5fW15eYWBfY1xZYFpRTk9OVlFQVVNQVVRTUFdcXFxZXlxfV1xeanB3eX9jXFtWVllSTk9XU05RUlFTVFJMUVRTWVtXVU9STlNYVlNSVFJSWk9RU1NWW1ZWVlRWWlhdXlxcXlZTTlRWVltcVlFUVlZYWVJTWVxUUlJcWFpdXl1hYWBXYltjYl5hY19cYmFiX2RnaWRoXlxlYGFgYWNkX2JfWVpfW1xbWVhZV1daW1phXV1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQWl1eXVxgXGBVXF1oanJ9cmxoXFVZV1FPUltTUlFUU1VVVEtSVlVaWlpTT1NSVVVVU05WUlNaUlRVVFhdV1hYU1hcWF5dWVteVVVOVldXXlpXUVVVWFhYVFZYW1RSVl1ZXV1hXmNjX1lgW2ViX2RkXl5jY2FeZWZpZWdeXWRhYWFiY2RfYl5YW19bXFtYWFhYV1taW2BdW1tcW1haW15WXlldUE9PUlpQW1VVV1ZUVFReXmBfXmJcYFVdXmJreXRsfWxaVVpWUVFUXFRUVFVVVllXTFJaVlxaXFJQVVNXVVVTT1dSU1dTV1ZWW11YW1lVWl5YX15ZXFpSV1JZWFlgWllTVVZaWVpWV1lcVVRaXVxeYGFgZWRdXl1dZWFiZmReX2RjYFxnZGhmZWJfZGFfYWFiYl9gXldYXlpcXFpZWldWXVpdXltaW1xbV1lcXVZYV11TT1BXWVBdVVZZV1dVWF9gYWFgY11gVV1eYmVldoJ7aFhZWlRWVFZcWFdXVlZXXVhPVVxZXl1dVFNYUldVU1JTWFJTVlRZWFhdXlhdW1VeX1hfX1hcVlFZVVlaWmFYXFVWV1paWlhZWVpYVl1eX15jYmJlZV1iXGBmYmVmZF9gZGJiW2ZiaGZjZmFmX19hYmFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOU1pXVFxVVldZV1ZcYGFiY2FjX19WW2BkYV96dW9oWlxaVlhWWFtaWVxaWFlgVk9UXVtgYVxVVVlQVFZUUlZWUlNVV1tbXF9eWl9cVl9fWl1eWV5WU1lYWlldYlleVldaW1tbWlpZW1lZX19gYGRjZGVlYmRaYmZjZ2ZlXmFjYGNeY2NpZWRnX2deYmJjYWFgXl9YVFpaWltbWFxYWFxbWltXV1pYV1xbXGBdVl1dU09WWlZWWlZZVVhXWF5gYmFkYWRhXllZYWRiYGtmaF5cXVtXV1laXFxcX1tZW2JWU1deXWFjXFNWWVBWVVVVVlZTVlRYXV1fYGBdYV1XYF5bXlxbXlhWWFhbWl9fW19YWF1cXV1dW1pcWFpfYV5gZGNkZmZmYlljZmVoZ2ReY2FfZWNdZmlkZWlfZ15jYmNhYWBfX1tYWVtZWlpYWlhXW1taW1dYWlRZXVxaYFxVXmJNUldZVldaWVtcWVdZXmBiYWVhZGFdXlliY2JfYWBhX11dXVhXW1tdXV9fXFpdY1hZWF1gY2RfUllZUFdWV1hYV1ZXVl1dXmBhYV9iXllhXV1eWV1eWVhVV1tbYF5dX1lZXl1eXmBbWlpZW19hX2JkZGVmZ2diWmRmZ2lnY19jXmBmZVpoaWNmaWNmX2JiY2FgYF9dXVpXW1lZWFhaWVdaW1pZV1hWVVtdXV1gYGJieEtXV1xZV11cXF1aV1xdX2BiZGJjYV1gWGJjYmBjYWNeXF1cWFdbXV9dYF9dW2BkXFxYWmNlY2FSXFlPWFZZW1pZV1paYF5hYmJgYWNfXGJdX11bX15ZWVRYXV1fX15fW1peXmBiYlxcV1tdYGJiY2VkZ2ZlZ2RcZWZoaWZjYWJcY2dgXGlpYmhpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldWWFBYWl1hY2Zmcmt/SllXXVtaX11cXlxZXVteX2FjYmFhXWJbYmRhX2NiYl1cW1pXWGpxYFxgX11cYWNfXllZY2VkYlRfWlFZV1xdXFtaW1tjYGNiY2BiZGFgY15gXF5fX1pYVltfXVxhYV9dW2BhYmViXlxTXF9gY2RkZmVnZmVmZV9mZmhoZ2RkYFtmZ15haGhiaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7enp6e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2d3d2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t7e3t7enp7e3x7e3t7e3t6ent7e3x8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb3Bwen59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYiNsbW0tLSztZWHiYmJiYqMjY2Njo6OiX9/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb296gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMi5G7wL+/v7/BmoqMjIyMjI6Qj4+QkJCLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDg4SCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dXZ3d3d3d3d4eXl5enl6eG9vb29wcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fYGBgYGBgIF+fHx8fHx8fX19fX5+fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl3dnZ6e3h7eHd2eHt3enp6fnl4eHl4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7enp6enp5enp7e3t7e3t7e3t7e3t7fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d5fHt8fHp9end3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3d8e3x9eX15d3h4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3d3p8fHx6e3p3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp6fHx9fHt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl7eHp6eXt5eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdlZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgoKCgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwipCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4mDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyPi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yJh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiMi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiIaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6MiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KSkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKEhIKCgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWDhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4KBg4OBgIKDgYKFhYWFhoaHhoWGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4KDg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+PkJKRjIqHgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SDg4KDhYOCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46QkY+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgoKDhIOCgoODg4KChISDg4OCg4SFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZOSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYOCgoGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiYeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGBgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5+f4CBgYGCgYCBgoKCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAgoOCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgoGCgoSCgoOEgoOFhYaEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GCgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYGDgoOFhYODg4SCiI6DhYSFhISEgoGAgYKDgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4WFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5OSj42MioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgIGBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAgYOCgYCBgX+KmYWBgoKBgYKCgYCCgoOCgoKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYGCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYuHhISDg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4CAgIOBgH9+e4GYjICBg4GAgYGChIOBgYGBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgYCBiYN+fn+CfY+VgoOEgoODg4KAgICCgoKCgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4WEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSEg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoGBgYGAgICAgIB/gIGAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSCgYOPg4GBf4qEg5KFhYSEhYJ/fX19f4KEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYSFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyLiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEhIODg4OEhYSChZKCioaFgoF+goaHhoOBfn9+fn9/f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgoKDg4ODg4KDgoGBgoODg4KAgYGBgYCAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIOHkoKGhId+fn9/hYWBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaHhoaGhYSDhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDg4SEhIWEg4KCg4OEg4eNgYF/h4J+fn6AgH9/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eIiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aHh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4eFg4OFhIOEhISBgIGLhYB/gIGCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiouLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5GOioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4eEhIWEg4OFg4GAg4OCgoKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SEgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYWCgIKDg4OCgoKDgX59fX5+fn5+fX1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4eJiISDhIOFhISFhYaIiIaFg4KChIWHhoeGhoSCgoOEgoODhIKBgYGBgYODhIOEkZKRjo+Oi4eFhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeJi4qGhIaEgoaHg3+BhIODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYKDhIWFhYODhYSEhISEhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDg4SFg4KDgYKDg4SFhIeSkY+Nj4yKhYSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgYCAgoB/gYOEg4ODgoJ/fX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4OAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGjJORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn9+fX6DhIOCg4ODgn19fn+AgIGAfn19fX1+fXx6enp/goKAf39/f35/f4B+fYB/f4CAgX+AgIF/f3+BgX99fX+AgX9/fn+AgH+AgICBf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn1+foCAf31/fn1+f4ODg4KCgYF/fX1+foCAgH9+fX19fHt7e3p6enqAgH9+f35+fn1+f35/gH9+f3+Af4CAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fn6Af4B/foF/f4CBhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXt/fn5/f39+fX5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+f318fH2Fk5KNjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCg4GBgoCBgoODgYGBgYCAfX19fn5+f359fX19fXx8fHt6enl5eX2Af4CBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgYF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISEgoKDhIKCgoKCgX9+fX19fn6AfX19fX19fX18e3p5eXl5eYCCgoKEg4CCg4GAgoCBgYGDgoODgYGCgIGAf4CBg4KEgoCAgYGBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGh4WFhYGBg4ODgoKAfX19fX19fn59fX19fX18fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICBgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aGh4iHh4eGf32BgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYWEhYOCg4OCg4OCgoKCg4OCgpKQi4iJh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1/fn+Bf4CCgYWFhYeGh4eGh4eIhoeHh4aHh4Z/fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZeEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko6LiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgICAgIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhISFhH99fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fH+Cg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX99f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4uKioyJiImHhYaFg4OCgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KCgYOBf319fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYOBf4KCgIODhISEhISChIOEhYKEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5/fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+fn6Agnx8f3+BgIGAfn17ioJ9gH9+gYCAgYKBgoCAgIGAf4uTj4yLjY6NiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfXx9e319fXx9fHx9gH+AgH6Afn6Bk5GMjI2NjoqFhoaFhISFg4OCgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt8fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYuNjo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f319fHx9fn18fH19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6EkoyMi46Ni4qGhIWEhISDg4OCgoKDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIqPjIyLjYuKiISEhIOEhIODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+AgIGBgH99gH9/fn9+fn5/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fXt/fnt7e3x8fH18fHt7e3x8enp9en6CfoGDhIKBgoGFhoWFhoaHhoKEkY6Mi4qLh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/fn5/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fHt+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7fH16fX5+f4CAg4eJiYmKiIuJhYiRjYuIiYeFhYOCgoOEhIOCgoKBgYKBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gX9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CBgH58enx9fX59fX5+jIZ9fX57e4OCfX5+fX18fX19fX1+fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4uJjJCOjYmIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn9/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+fn1+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImNj42LiIiFhISCgYKCgoKCgoGCgoKCgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx+f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI2MioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYOBfn6AgH5+gH59fn6AgH+Bfn+Af39/f398f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIB9fH19fXx8e3x8e3t7fHt8fHx9fImKiIiFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAf4CBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x+iYWGhYaHhYSFhIKCgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen19eXh1dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCBgYCAgIKBfn6Af4GAf4CAgH9+fX19fXx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCHgoSEhYSEhIWDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXR1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19fn9+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/foB/fn17ent6fHt6goR/g4KCgoKCg4GBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dnR6hISBhISDhIWFhoSDg4WEgoODgoCBf4B/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4CDgX+Ag4J/f4B/gX+Af3x7fHp8e3yBgH+Cf3+BgIKCgYF/fn+BgH6BgoKDgYGDg4KDgoSCgYGBgIGCgH6AgH9/fX5+fX19fn1+e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4GAgIF/f4B+gHx9fX6Afn5/f39+fX98fn5+gX+Bf39+f4B/gIODg4F/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fX99f4B8f399fYGAgH59fYB/foGBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx9fX1+fXp+fX14fn9/fHx8fn1+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSBhISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3d2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDhIN/f359fn5+f4B/gIB/gYKBgH9+f4F+f4CCgoCBhIKEhYaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWDg4ODg4OCgYKDgoGDgn+Bf39/fn+AfX19fX+AgIB/f39/fIB/f4GAgYCAf32Af31+fn9/fX5+gIGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32DgXx8ent7e3p7d3Z4dXJzdnF4eXJ4hYWFhYOEg4KChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgX98gH6AgH+BgIB/fYB/fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fXt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf4CBgHyAf4B+f4GAf399gH9+f39/fX18gICAgYB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36BhIKCg4WFgoJ+fX17e3x8eXd7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp6enhzd3VxcXJweHdxe4WGhIWDhYKBg4OBgYGBgoCBgICBgH5/fn+AfXx+fYCAgoGAgIGBfX6Af35/gX+Af3+BgH+Af31+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+foCBf4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgYGBgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9+gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnqBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt9fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoKAgYGBgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiXx8fnt7fnl6e3p7jX53d3l8fHt9fHx8fHt9fH19fX18fXx+fn5/f358e3x9e319e3l6e3p5eHN0dW5zcXB4cnV6hYaDg4KDgoCAgIGCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBhIOAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICAgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoB/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af35/f4CAgH+AgH+AgYGAgICAgIGAgYGBgoGAgYCAgH9/gH5/fX59fn57fXx9fHx8eHh1eHh5e3x8fXt8fHx8fX5/f39/fn19foB/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDgH+CgYWDg4SBgYOAgoOCgYCAgYKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9+gICAgICAf4CAgH+AgICAgICAf4CBgYCAgICAgYGAgoKCgoCCgYGBgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fX18fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent6eXRxdW53cHV6cnZ5hYWCg4KDg4KDhISAgIKBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAgIGBgYGAg4F+gIOCf35/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9gHp5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoKGg4ODgoKEgYSDgYKAgIKBg4GCgoGCgX6BgICCgYKBgYKCgIGAgICCgoGEgH6Bg4J/f4CDgoCBfoCCg4KAgYGBgoKDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+fn+BgYCAgIGBgYSEgH2Af39/f357e3t6e3pzcHhyeXR2eHR3e4SCg4KDg4SChIODgYKChIaEgoODgoSBhISBg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGDg4OEgYKEgoOCgoGCgoOBg4SDhISEhYSFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3p7fHp6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOFhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYKBgICChIODgoGCgoGDgoKDg4SDg4SAgoSDhIOBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fXyBfnp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChYWEhIOCg4SEgISFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fX19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKGhoWEhIODhISChIWFgoKDg4SCg4KDgoOBfoCAgoKDgoODg4SCgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4OEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fX19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f39/fH2BgYKCg4OGg4SDhoSBg4iHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoODgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOBgoOEhYOCgoODgoGEg4GDg4SDhISEhYSEhIWFhYWEg4OEf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gYCAf4CEhIODhIWDhIOFf3+CiouFhISDgoSFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoODhYKBhISFhYaEgoCDh4SDhIOFhIWFhIGEg4OGgoOCg4GCgoSDgoODhYODhYWEhYWHh4aHhYSEhYSAf4GDf35+fH59fX+BgH9+fHx+f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOFhIKEg4aAgoWFiomEhIOEhYWDh4aGhISEhIWEhYSEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgX2BdYF6g39/f3+EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYKBhIOBf35+fn19gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIaEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIODhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4ZzcHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHOCg36Dg32BfX5+fX6Cg4F8f4B9f4B+fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOGg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26AiHltfXJzdnN2bW14bHB5bHV9f399foGAgX1/fn2Af4B/fX18fH19fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4aFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndnd3pucHWCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gX9/fH99fIF+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBf4B+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLiYWEhoeHhYSFhYWEgoWFhIWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBf4GBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSFhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJioiFhIaGhYWDhYWEhYaGhoaFg3iLeXKIentwcIWFeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fX1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhoeHiIaEhoWHhoaFhIWFhYWFhomJh4aEhoWGhoWGhoSGhoaGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SGhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH5+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWHhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhYaGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaGhYaGhYOChYWGhYWDhYOEhIWEhYWEhYWDhoeGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fnt8fH1/fnx8fn2Af31+gH5+gH99fXyAfX5+fn5+fnx9fX57fHx/fHt7fX+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhIaEhYaGh4eFh4aJiIaGiIeIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhoOGhoWGhYSGhoWEhIWFg4WHhYOCgoWDhIF+gIB8e31+e3x7fX59e3x+fX5+fH9+fX1+fn19fH98fn58fYGAfHx8fXx8fH56e3t9foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaIh4mIhoaIh4iKiIWHiIWGh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhYaFhoeFhYaGhYSDhISDhIeDhIGChISDgYCAgXt7fn18fHx9fXx8fH19fH18fn18fX18fHx8fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoWGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhoaHhIKEg4SGhYaFhISEhISFhoaGhoaFh4WFh4WFhYeFhIOEg4ODh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGh4eGhoeHhYeGiIiHhoWHh4iGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWEg4WFhoaGhoaFhoaHhoeHhYOGhYOBg4KAg4WCg36BgYF/g4F/fn5/fn98fH1/fXt9fXx9enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHioeEh4WGhoiGhYeEhoeJhoaIiIeHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhISDhYWHhoeGhoWGhoaFhoaEg4SFgoGCgYCDg4KCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoSFhYWFhYODgYOBgIKBhYKAgH9/fXx7gYSFhYaEhYSDh4iGhoaFhIaJhoKGhIaGhoWFh4WHiIiGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKGhYaFh4aHhIaGhoaFhoODg4WBgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15ent7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OEhoWEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEg4aFhoaGhoaEhYaGhYWFgoKDg39+gICAgX+DgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBg4WEhIaGh4iHhYWIhomHhYSEhIKFg4SGgoOFhIWGhIeGhYWFhoOEhYSFhoWGhIOFhIWDhYWBgYODf35/gH9/gIN/e4B9fX+CfYCBfX6Bfn19fX1/e398e3p5enp5enp8eXp6ent7fHp7e3t8fX59fYB9fXx8fYB/fXyGg4aGhoaGhIWDhYKFgYGAf3+AgH5/gIJ9fn9/foCAgYKChISDgoGChIGAg4KBgISFhYKBf4CCg4OEhYaIhoWEhoeFh4WFgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhIODhIOFhICAgoJ/fX1/fn5/hH57f3x8gIF9gYB9fYN8fn59fX57fnt7enl7enl6ent5enp6e3t8ent8fHt9fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gXx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIWFhIGDgoOChIODgH+AgX59fH5+fH6Dfnx+fHyBgH6Cf31/gnx/fn19fHx8e3t6enp6eXt6enp5eXp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYSCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgoCFg4F/foB/fnx8fn18foN9e318fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRkw9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1dTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8rKysvLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dTV1NXU1NTU1dTU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzQ0dDQ0NDQ0dHR0dHR0c3Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX2Nzd3d3d3d3d3d3d3d3d3Nvc29vb29zb29vb29vb2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNloSGhoaGhoeHh4eHh4Ky4t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubN4c3Nzc3Nzc3Nzc3Nzc3qCgYGBgYGBgYGBgYGBg4uKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzm5QU1NTU1NUVFRUVFNMoPPr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6WZMikrKysrKysrKysrKyk1RUNDQ0RDQ0NEQ0NDQ0ZTU1NTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8Nzs/Qz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzM5xVFhXV1dYWFhYWFhXUKHx6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmmzgvMDAwMDAwMDAwMDAvO0lISEhISEhISEhISEdKV1dXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183OeF5hYGBgYGFhYWFgYFqk7ufn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampq6BFPT4+Pj4+Pj4+Pj4+PUhVVFRUVFVUVFRUVVVUVmBiYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI+Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcfFxcXFxcXFxcXFxcXEy9DPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Pzs/Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRysrKysrKysrJycnJycnKy8vLy8vLy8vLy8vMzMvNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Pz8/Pz8/Pz8/Pz9PPz87MzczP09LSzs3P0s7Ozs7Ozs7Ozs/Rzs7S1M/OztPTz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tjX19fX19fY19bX19fX1tfX19fX19fX19fX2NjX2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7OztHBp9HSqKDQz9GkodDOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OztKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Oz8/RnY/FtJ6jp9avn6Gp0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD9BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz8/Tuq+quJ+ak53AnpiVnMjQzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/P05+xnaiaoZy0mJyinbCy08/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/P0cCciZ6fm5atuYaelq+zqtXQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9SjooGgmJuBoJZ4m4Sdk6TV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NHEn4F7moWfqIiceZ+phZmk1dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DVq6+8wNN2tLCmnIq9raaYr9bR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2Ojs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49PTs7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmHf4WglaaXl52lp5aYm7vV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocbT09WcmMKiq6Sb0J+rpJzR09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDS0dLXqIfOxpCNt9fCj4281dLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0s/F1NTHw9XR1cXE1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLT1NLS1NXT09PU1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs6ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUZDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWl4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIJ3dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpkbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tbW2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5ubm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZycm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVUYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcU19NSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKlqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKaioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq2mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Necl9oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmloYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloKGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbGh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLazurGqrrSxsLG0tba8vb68vL3Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqTlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGw8O5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsae8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbGhxeG95aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcndzeGZnXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8nGw8PEwsS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamddam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjHycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytp6q7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHGwcvLx8bMyc3FxsbDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldW5zYlxiVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHDxL+/vsTLyMrLyLy7yMfJzcjDyMnJxsXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cm9mZWdkamRham1ubl5YXFZVTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXCxsK+xsG5u8O6uLm8vsHGwca6ucnJw8XEwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZmNaWVlcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub26urS/uLW4s6+7vLfAt73Cv8G7v8G8u8W+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u766tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5h31xY2BiYmdqZ2ZpZWldVlVTWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W6wbi+uL+8vbe1t7CuuLa5v7vAv7fBvLvDtrrIuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZGZvaWVraFhYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v728sq2vrLGwt7y2u7zAxLm3t7e1urm6u8C9w8C6xMK+x7i5uK23tbi6tLezu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD48Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72/u8S3tri2t7+/xLzCxcXHx8rJxs/CwbiutbW8vri7sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bndjZ2JcY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz0/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6qjsLm9vrO8vrzFuLK4ub3HycrDx8jGxsnIzM7RzMrEtbrAw8i/v7W/wb/Gxr/LxsO/wbzAw8zKx8XGwbm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2NeYWFOSE0/RUA/REM8Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ8QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS8w7y6ur68xL+3vb+9x8zGx8nGxr/ExMrIzMzNysbCw8vOwry5vbq5wMO/yMbEwcG/xcDKycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE+PkFCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy2ur3BvLu/tr/Bv7y/usDLwsfIwL+8vL/FwsfLyMHDwMDJysLAu7uwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrKvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem1zeHNncF1bXlxZUUVEQ01JQUU9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPT4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u726w7u3vbe5wLu6uLi1xcHCw7u4s7S6wb2/x8C5wLy+xcS9vrmysK64t7/Dx8PEvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbmlcX2BZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucHAt725uLm2tb+ztLK4sbvBwMO4wLCvtbi4uMK6tLu3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6esr6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2VdWlVKPD8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7e6t7a2srTAtrK0uLO6wMHCvtjAtLG0sre+ubO1sry5vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnJsXmJgW11PSEE+PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27vLi2uraxwLq3ubi5u8HBw9DStMi0tLC2urW0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJuY1xmWFxdUk5NQT5JQkBKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7KttrqurLyyuLm3u7+9ub7AtL+7vLq4vsK8wsnVyZfOxLSytLaytK+tu7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEJGTUY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6tbm7tbWztbu8wLu+wLS/ubm6sbvFvMHLzcKOp8m5tLSzsLGtsLm4try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Ojo6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSYnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw7OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7Kyurq3t7i4u7SvtKywr6ScsLa3jYm1urKts7CvrK62trK0ta+qpJ6bnJyeqKieoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moqquepaObo5yVkIyPj5CTkJeVlpifnp6amaaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HT01MQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpayqqLWysa+9yrKmqK2Vi412cH+En4yFobe0q7K0rqqrr7Cys66lnpKYlI+YoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqmxo6WonqCclZOQj5GQmJCWlZiWn5ibmZujmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUlIR05STkpORztFQD0yPzc1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJiXlqGorK62t7q5ure3u66ooKGpoaCtq6qlvdSrop2cgGyBdGFjZXKDipu3ta+vs7Wqp62so5yZlI6RlpeZmZygoqKcnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWZlpuXl5ignpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeHlgYlJVX0hJSUtTVElSUEw5P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5OcnqSorq2sq6uvqq+pnpeepZ2epaakn8DPqZJ8d4Fea5F1b2VfbpCgvrSxsbC4raehnJ2alJeampCOkZWRjI6OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrC0qbGvopmcnZ6hmZubmpiZm5SWm5aYnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVtTWllNUUpOTlVMUkxBNz5CNjg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKSnJihnaqip6Cep6Gln5ySnKKbn6Gjn57Cx5l4Y2GKXFeCi5CIbFKJqcOzra2ssKegn6Kgl5GUm6CcmZeSk5+coaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuKyxtKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCepKGfnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUVVIRlVWSkJMRz1LSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk56ZqJ2un6eenKGdnpqakpmenKGioJ+nybmIYVp2l1pYYW2Qj35OdLTGs6eqrKqln5+ZkpKTmJiWlpWMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp5+ZpqCfn6eopaSenaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQlZNSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJqqoLGit6Swpp+enZ2XmJWZnpuco5+drtGqc1lkjIlYW29pt612WlmgurOurqmrpqCenqGinZ+dmpyclJOVlJ6emJSFnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGw7zDvLezqbOtqrO0r7Ouqq6jnauntrGsoq+moaOvsa2wpKSvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cWtrdXJwaFdbUUVUSERJT0g+RUE0RUg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqChnZyYm5+gm6CfnazOnmBfiId3eIWHdZ6NcnJzlLCup6SkoqCepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DDvsfGwrfDycnCwMW+ubS5urS7t7C1sqq6sa67t766uqq3rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSZkZydn6Sep5+en6KdmJmUmJSIhH16cWtkaG94amVaW0ZLTEVEU0xEQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pj1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBs7K4p6Ghq6qinZ6hop6cm56tyZhWb5+ZeZKcf2t6eo2msqqgmp2cn56al5iXkoyPl5eTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdLTzNPQ09PMysLFxsfKx86/yNHMx8XGxMG7w8C+vr61vbOtv7/CwsbEx8SuvriyuLzEwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4yQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJRENANTU1ODpCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT88QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJuirJ2frqalsarFxszOzb+wwailqKytqqGdo5+cnZqmt8yRVHmgpHp7bmZvkamxrKSfnaCbmJeUk5SWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rS19HX0tTW09PIzMfNzcnSzM7TzMXHycrBxcvGyMjFvsKys8jEy8rKzsXKv76/vcHHxMzMyMm/w7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkA8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbS4rK6jnqSjn6CkqsPOilh6hoRuaHGQrq+lnZ2doaWhnpqVlJaUin13cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dPU1NLP0cPQ09bY1dbSy8nO0cvGzdHJ0tXW2dXX09bYztLKz9HMztDM0s+/x8bKw8zMy87PxcbHtsDKv9HMy8/Fyce/w8LIzszP0M/NysjOuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZXJiXVJcSUpHQUVIST47QDg9NDU4NTs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXCxbG2qKKlpqGiq7XPz49ke31vbpStrZyVmKCcm6Gin5ydmpaKd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M7P1dTU0dHM0M7T19bT1dDP0tPRydPRx9DY19jR2NLX2dXWzM/Pyc3Ry87Pv8XCx8XOzdHQ0cjLzMDKy8XTzsvOyMTJxsbIzMrT09HVz9LM0sG5xbGlqLWup5qorKWdsqiws6ysk4+TjoiKj4OPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUU0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vraqqq52mrrioq7fX1NXZ2dHO0MC8zMm3v6+nq6mjpLG00ceMb3ZxhKmsoZiWmJqbnaGdmpyek31xZWNiX19hYF9hYF9gYF9gZm1wcG5rb3J3d5vMwNLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cbR1MrQ1NXWztLQ2NjY18vIzcPIzszKy7/Jv8fIzc7Py9DNzsvOzsfLz9DKzsrCycbJzMrL0dLM09HRz9DKvci5sK67uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVdFO0A8MzM8PTg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1taylra6+tLDA2NLX2tzWz83LxNPQwsGxqq2uq6WyscShbWxukKGclZOXnJ6fn52UlpiUiWteXl5hZGJgYGBhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dTLzNDR08rO0dXS1dXKv8rBxczCyMnCzMPFyMrKzsrNzNDN08vFyM/MyMfKxMbAxcrLzc/RxtDOzc3Mz8XHwLe5vcPDvcO5s7K+sbvDxLWqmKWimZaRlZWSi5SNmpGUlI+PlIKJhXhwcWttZ2BgcWhZWGhWTEZMSVBQQjtEPjs2Nzo4OTo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/Ozw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcXDwb+7tbKxx8K4y9XV2drb2MzNz8jW1cXDt7C1qaKtrLi8oW9tjpqNjJeVkJSSkZaWlpCMfGViYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0sjLzs3G0dLPzszUysfLzs/Hx8/Sy9DPxbrEvsbJvcLHyc7EwcfAx83Hw8vKy8/Hw8TQyMbBxcfEvsDHy8vLzsLKy8jHzNDExce7x8PIyMLPwb28v7DByce5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3bnRka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL69us3NxtDV1dna29jQys/Q0tTJxLi8vK6ltqq+uqF3iZaOjZaPhoOEhIJ+hYV/dGBcXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+ycbCw8DDx8rJyMrIwcXMxsjLzcnEwsvJwcLL0MTLyL+5wbvFx72/xs/Lw7/Du8nGyLvIxsTKv73Cy8bFxL7FvLy/w8TLxcS8wMnCxcfSxMDIv8rJxsfG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6GlmqOgm5R7dnN0ZmlaYW5tWltYUkRMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8y8/RzMfCw8fNzs7M1c/V2djZ0MzTzs7QysO2xL+0srqvvraIfZWMk5eGeoCFhoB2eHVycV9aW11gYGJkZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKwtrqysrOyscK8vLy6uMDBwcW+vbm9v7nEysXGwr3GwLi7xMm/wsm7t7u6xcO+vMHNw8a+vrXBvcO6vMa7wrmzvMXEwsK2v7W1vb+6y8O8tbrIur+9y8PBxcLFyMbIxtDGwszHssfJw87NwcXDwL2yt7Cyp6ioubClrbCrrayUeXZ3amRnYGhvY1ZeWUpGSkZISkFFQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8bDxMjO0svKysfNzs/SydDG1dTW187M0MbLx8nEvMi/rrC2tLevgoyNiouFeICGhoB+hHx0dWRcXF1eYGBiY2FiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tbe0srO0urW+sbewta+yu8K8wcS8v7q1s7q+wLjHubS7tsDCvLi9xsHDu7Wusra6vrTEt7u1q7i9vb+9sLq2r7a6ssW8tq67v7S2tMW9vsLFwMPFxsjLxcDGxrvIy7/PysfDxsLDtsO9vba5vse/rLW6tbe2jnh0eGZnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzsjGyc7M0MzOyMrJy8nKxM/N0s/PxsnEycTCvrvMuq6yt7Syq4yQhomJe3h+hoZ3eIJ9dGheXV1dX2BfYGRhXmRlY19fXFteXF1eWltbXV9scG5oZmpubnJ8pMe/uLi1sKusp56iqqeeq62zramrqbSttrCyqa6mrLK8urbDubq6sau1ubu0wrqwv7G9vLu2vMe5wratqqiwsb+1t7yvsKeys7S7vKuttaWutq66sbCquLCtu667uLvAv725wr/Hw8XBvMbByMu4xcfFv8bDw7nExsK7xsnMy7O5wry6sohydnZraWFibGhZWFdbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bGztLLw8bCxdDHzsLExsDFxcPDysLJy8HCv8W+t7m5x7OvtLavraaRiY+RfHh+ioV6e4SBd29eXVxdXV9gXl9kY2JjY2JgX11bW1paXVpaWlpcZG5vaGZnaWtucoGtubC1rqalp6eaoKSgmpylq66jp6KrqqyqsKSmn6qttbaxvbmvt6+orre0tLy4tLyvuLm0sbzBscCupaiiq7Gys6e8qquoq6yttLOlqK2hpK6psqWnqK2lqLessLK3urq7sbu9vr7Ev7XBwMfIt7/AxLfEwr+7v8TCvsTIzMq/vsPAwKmGcnRyamldYW9kV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdHQzcTIurrMwsy/vMq3vsS/u8u4wsTDt7rAurWzucK1sbKzp6mTg4mNgXx+gH54dH98c3dmX11cXV5fYF5fY2NhYmBgX11dXFpYWltbWVhaXF9ma2ZlZ2Voa29yhaqlrKagnKGllJ2km5iSoaOqo6KfpaWnpayfnZukpqyyr7a3p7Csp6q0qrS6sba1rba5sa+6ubG3pJ+kn6axp6uouaqkp6iop7KtoKemn5ukpayen6ekn6Cxra2ssrSytLC1vLa7wcGyur7DwbK5ucKzwL2/tbi7vb68wsfEwsO/v8Sgg3dwa2FmX2tvYFRZXkhOZ09UR0VKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItbW9uLrAur21oJ6UnaGmurars7O7s8TQycvDx7m4ycLNwLnLuLzGubXGubXAw7C6wbeyq7S7tqqsrqWbhIeHgX16dXRvbWtqanFpXmBdXFxcXmBfYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+Inamgl5WaoZabopiWjZ6hoqabn5+jpaGnnpuim5+qsK2xtaKpqqmrq6S0ua23sKyyta6yta6wqp+dnqOisqSmqbitoqamn6isqpmfoJ6ZnZ+lmpqjnJudr6mrp6qrrK2wsrivuLm7sLa7u7qrs7O5s720trGxtbS/tr3AvcPBuru9l4N6cmtfZV5kZFhUV11JV1xLUEdJSUZBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfG0MjIwce8vMXEz7+6yLm5wLm0w7ayvb6wvr+4qKSwtLGhqKmeiIaHgHhzbnBua2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrco2onZSUlJuYm6GWlpGcoaKonZudpaahpZygoJqYra6trrKgpaKtq6ahtLCxsayor7KnurOmtqGinpujoa2joam1qqKjpp2lpqOWmJ6XmZqdn5qXnZ2cnKyhq6ajpKatq7OzqrSwsqqyubSvqa+ysrO3s66prK6yuLC6trm9v7eysZSFeXVlXmVeW1lWU1pVS1xRTElFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7OdpaOYpbHCtba9rbS4ws3Ix8DGt8HAyM+4wsW+tLu7tMC4tLu9sbe6taWhrLOqoKeklHyEhIB5cHJ0cWlmZGhlY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhYWFhWV2FkZWNkZWRkaGp2opyUlI+Ulpefl5mUmJ+eoZyWoaGoo5+eqZyamqqmr7Crm6Ojt6qgn66otqmmp62wo7ewpLefopuYmKqmoZqsuLCioaScoqCgk5WhlJWWm5iXlpeclZ+pnamjoZ2jqqqwrqi0q6qmrbKwpaqusrGwsK6vpqensq6xtK+8tLq3rqOUgXl1ZF5hVllXU1JUS01eTFBLR0dMTEU8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunaeno6q7wL3Aua60uMLNycbDxL7GuMnMs8LDwq+9vbe9vre7vLW1t7Gioaqznp6Wm4aAfHhyam1ydHBpaGVkZmJcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbY2NiYmNiY2RmaoGWk5WLkZSTm5mclpaboJyflaCfpqWkpqeenJ+ln6qvpp+io7aooKGiqLShpaekr6Wwray1nqCdlZSpoaKUrLGxnqKjnZ2Ym5OLoZSRk5eYkpeXmJadppumoaKZo6Wlq6SlsKelo6urraaorq+uq6iqqbOlpquvtLGuvLWxr6+gknp2cmRhXFpdWE5MUkhSYU1XUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6kp623u7zBxbqxubXFysvBxMfHyLfGxbTDwMesuLm/uL+9vrm4srSvoKCqrZaWf5GHf3VuZGJnaWhmaGpnam1gXVxbWlpaWlxdXFtcXl9cWllbWVlZW1dVWFdUVFdWU1RSVWBgX2BhX2BhY2RpgZOTiJCOlJKTnJSVlqOZoJacoKWhraWko6KjoZuqq6WZnqWxqaCgnaWrnqehnqytqaiuraKhopSXo5uckKqosJufop+el5mTip6RjZKTlZCYmJOboaKcpKChlaChpKabo6uloqSqpKuupa2yqaalpqa0pqmorbO1tLm6r6qsnotycG9gW1dWVlJHUU9IWlxPUklUS1NMRUdJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo8PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2Ojg2OTg5ODk7OUA5e7W0rbS7sq+rsa2dp6evubmzwMi6tcCvxsnNu8LLzMi2yr6yv8XKrrO6xLi+w7+5ubC0r56jqKeUjn2LhHx1aWlpbGdqbG1ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXV5eX19iZG2Oj4SRh5CRjpmTlJKcmqKcm6CnqKqoqqaopaOYpK6klJmlr6mfm5mboJ6vmZuqs5+lpp+jo6GUk5uWlpKoqayanJ+hoJqUkIyZjoyQjJKNlpWQnqGgo5ybopWboKKgmKKoo6Koq6Crr6Sut6WjpKKsraqoq66yt7K9tbOrr5iEc3NoW1hYUlVSRVhMUVtZTVVOUExQUUlOSUI8Pz9BPzw2NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zrqiztq6pp6+tm6morLe2rLzKu7a/rMzHxrnCz8/HtMW8uLzEyrKuusK5v8G/uLussqmfoqailIp9gXd4b25obW5tcGhnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVUU05QUVlaWlpdXFxeX2Bkfo2Bi3+MkIqSjZeRl5mioJufqqmmrqqnr6OnmZ+soJWWpKinnZeQj5qerpaXp6qZn5yUpaGekpCTkpOVp6qkmpmZnZ2WjYyMlIaJjYOQi5KVkaCeoKOXlZ+VmqCinZObpaWnqKigsbCmsbynoKOstKuup7C0sLm1wLGtsauRfXFyYlZUVk5SSUdWUVJSTExYTUpMTlJHTUtBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s62msbeqpqKwq52qp6mysaS2xrS5urPLxrq7wsvQyrK4ub2/wsWzsrS6r7e3v7i7qqynqqamoZCSf2tnbW5ybnFqcGtkZmdlXlpZWllaWlpbWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY2HkIqXiZSUl5uZnaian6mlpKqdp5igpZuSj56impeWhYSSmqOPk6KclZaVh6KampOLjouQmqOmm5WVl5uQkoeUjoyBi42AkIqSkpKhmp+ilZSYmJWipZmMmKSmqKahn7SyqLK3oZ2it6yqraSysqa1u7Wrq7GjiXhybV1OUVFMT0NNTk5QS0ZOTkpKTk1RSU1KQUdMSEdDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyNzc2Ojk5OTk4NDk4OEE3d7anpLawpKejqaWgqaWks6qissO1tbKzx8a4u8TKzca0rbu+trnBsa+rs5+psb60taejpaymppWKl3ZfYGdzcXZxaW5pZWhoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFlYW11hb3N2cYWIgoiAkYSOipSRk52gj5qboqGjmKSWoZuVjYeYmoxzjYJ9jZeWhZCZkJOOjnuZjpyMgoqAiZifop6Qk5iWhI6Ck35+dImOepCHk5CQnZqZmpCVkJ2OoqOOiZqgoaOjm6K0r6yvrJ+ZpbimprChsK6csLuqqa+qmYJ2cmJVTVJPUE1DU05MUU1CUFFISU5TTUhKSkNKTEZLSzw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMTc2NDc4OTo6NjU6ODdBN3i3oqO0qKWmqKOmpaamprOnpbTBuK+0sMrFuLrBz8a+s627wq2vxa+qpKmToKm6sqqomaClpKGMh5JsV1dfaGdpZ2huY2ppZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkhOU1NTVFVVV1lbXWlscm1/hXx0Tlhyj4KXho2cl4uTkJ+XnZWUlpSOlol/k4lfO1dve4uUiYCLkoyPhYZzioSWgXmCeoWUnZSDlo6Qj4OGfZJ4cm+FjX6JgZGNj5eZmJOKj4mch56Xh4iWnpqhoJenr6mtqKiel62zoqatmKyrmKe0oqmto5N+cm1fW05TUlZMRFRKUE1MRk5PSUZMUU1LT0pJTVBGSUk8NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6mnoqmwqKe0wbmwtbDIw7i0vs/Aua+vtsOorMerpZ+ahJeetaihoJCfnZyYjIOIY1FNUlZaWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbXBpe4J0UEJBf5WRkX2JlIyEio2ajZWVipKIhZWGeIh/YEpRbniKkYR9hI2JhX9/bn5/lHd1dXeEjZlwUY2Iiod8fniTdmh3hoh+ioiVio2QkZaLhIqIlISajIGEkpuWnpyUpKOoqaWknpuwqqGkpJClqpahqZyipqiJdWxlXltIUVFSTUlVTVNJTEtPSUhHS05MTVRLUVFPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7aboqedn6Guoaeopaeor62qtry2uLezwry3qLrJubaoqba3q7O+qKCYkIGMlqybnJKGmZCSjIeAgF9NTE5OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4eBfIWMkoGSmYuPe4aPgHV/eHNudXB0jY2BeX2KqoV5emh2e45wcm14gYuMknh6gHuAdnNykndndYSEhIR7lYmIioyKgH+Ei4x/lIN7gI+YlZyVkZ+dqZ6foJ2gqaWfnZiMp6SToJ+Wnp6kgHJnYFxcSlZPUkdLWFJPSk1NUkpKSk1QSExRTFJUTEVIQTw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc5NTY3NTI1MjU3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumKOhmJyftKmvqaWtrLCxqr20sru4tru1sqC3u7OrnZ6tqqq0sKOck5CWg5CfkpiGfpKEioN+fnhgS0lJSEdGSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FRU1ZedYN9eWd3jZeYjo99Z3mBdniAiY98hJiSgXKHj3x2e29rfq18c5CKf3uGkoF9f3RmdnyGbG9oc3yJjIeAbHlxfXBtdY9xaXGAfo5wQ4uEgoOFf3d3eouFfYt6dX6Oko+YipKam6OWmZ2anZ6inZaNiqWbj56XjpaYj3ZubGViWldXVFFKU1VUT1BOUVZLTktOT0pRTkhOT0tFQzw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppegn5agpq+srquoqbCvsau8uKy7vrmzraibsaetnJCWnaaqpaKZm5GGk3uLko+RfHeGdoB8eHl4YEtGR0ZBQENESUxMTVFSUFFTVVRUVVZXV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF1lcHJtiKeqwH51eWJ7eG58eYiQeXyLhW9tjJF4c3hqaoCCcpaRi4F9loBJk5huaHd+gmxpY2x5hZCShmtzbHxucnuGaW1wf3ONiYSGen1+e3ZvdHOFgnmBd3B8joyKlIOWl5iakJOVlpmXnpeMg4mfkYuSjYaQln5taG1ubldVV1RSUVlPUlVVU1hVTU5ITkpNTktDSE5HRT86ODk7OTk6Pjw5PDs6Oj0+Ojg6Ozk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5manqWtsKKsqqi1r66stL+rvMK/pqKalaWYno6FjJaiopmZkpWNdI97goiOi3l1e3F6dHB0dmFPRUdEQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplfnBtf3qLiXaBiIZ0bJqRdHN7amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3F/fGdxcXtuk42Pe3N9fHFwbnVtgn53eXRpeYmCiImDlpOSkIuNkZSUj5eOgHmIl4iGioaAkId2ampuZ2RXUVpXWVlbTVBVVllZTklIRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsKzU3NzU0NzhpTzg7NW6SiJqRmZakqK6esp+muq6rsrDCsbvDx5uWj5WZi42GeoWRmZWOkY2RiHKIg3aJjop9dHVzdXRsdm5lVUZJRD88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PT1FWTEFJUUlir7OgcXx4bX1scoOBhYF6hIaGeXKglXR4gHN1lIc1cZ2onY6hoYSihXZwhnyHfHOMrY2JgGhmYmlucm1wgnVpb1h1cI6akndsf3t9bXFtcIB6c3ZtYnaEf4aAhZCRiouKkouRjIuPg3V4i4+AfoOAfo96cXBva2BbXF1bWVhgX1NOW1pZWExISkVKRz9DQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSh5aRnqSnnq+VpbWprbGuwbK7wcaXkIyUkIGJfW6CkZKJhIuIj4d2g4VtlomLfnh5enB6cntpbV5KUEc+QDc0NDg7Ozw9PkBCRUlMTExNTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx9hYN/jH52opl5foaBhZmEm5xhhqqfnYqCkI56d4h+iYiOc4qXj4N7XGRxdHp7d4psZ2pieW+Fj4J6boF3dIR6cHR5d2tuaV13h32HfIiHj4CLk5eDjYWNhn1xhH+EfHV3e32JdW9yc2VnX1taXVNbZl5XUVVZXFZHSkpES0c/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XI14in+UjJKdnZ+mkaCroLGor8CxusW6lo6RlIh6hXZrgIySg36LhI+NeYOBdKKFjH5+goBygoB8a3hrU1dMQEUyMTEyNjc2ODg6PD9CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHF8j4x6fImGfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSRqIeAmJiKnHNsfIGGh32OaGdoeH5uhYaChXGEhUdrgHdyeXZobWtfdn2DiH+IhYx6lZ6ciouIkX97dYt2fHdtb3d+f3JycWtbXVxbY2NYZ2VcVVBQV1lQRExLRk5JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWIkY+Wl5KXoZ2soaa4r7O9s5eNkouYi310cH+Jk399jIOTlX2GfoaliImAg4iGeYiLf3WGeF9jVktCNjAuLzIzMTIzNjY4Oj0/P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/OTQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgYSChZGTfoWJkYGalYKhoZeVm5qlrZOau7Gnu8fDqIuMoaWPlImBkHtyg52fkZx+doWFio+HkGlob4OAdIyGhItxhoJ3h4B7doV9bnZ1Z4CUj4aJiIeIh6GropaJjph/e4KJenpvZ2t4fnh9cWpjXVpaXWlcYWZfWk9MTlhSUUlQS0ROR0NLRENBRENBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudXBneIN7gIyAgZCPi5qapJyhrKarr7CXkZGEoZSEeHd/jJR9f5KGk5Z/ioCSm46EgYKMi4KKjoSAin9scGpdQ0E0LS0vLy4vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyMoZ6YhJKFgo+hn5OYkoSKhY+YkZZscHWJi4GVjI2Pdo+EcWyFgYqWkoOFiHKJoZaGk4qPj5altambjZWig4eThH5/a2prfH9/gHJgXGNeWWZqXGxrXlhLSE9TUU5NTEZJUERETkZCQ0VHQj45OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5oWXCDcHWHcXaShn6XlpqUn5+cp6CqlpOYnmdlpJp+hJKSeoCRiZGSfYqFmZKRg4CAi42JhpGHhYiFeHh/Z01SPi8uLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVJTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6imopmhl6KVnJ+onqmrn6isqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqamaeRkYiVopqad3p+lJeRoZKWl4GUnnt2lZKrs4mNl6B9lJ6cjpOWmaSiprawnZGZqIiXkI6BiGxzc3x+em9nX1tgXmFmY2BnZ1xSRUtLUE9JSkxGRk1DSExGRkNCR0RAOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBxdWBufWJ3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYeYjXiCjYuOjXuKho+QjoKDgImMioWThYOGiIGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1HR0FBQDg2NjI8OTtGSEdJSU1PUVlthpB3lYujp6q1vbilrqysp6i0rLG3srKtu7GzvpyzxKy7ycu4xL+4paOwsqytqqOLlpiFpqagopeCppmNoqqopIeFk6OgoKqgpKmOnLGLlaOnt7uboKOwk6Odo56RpKKrr62ztaKVpauJmoqTipV6e36EfWZfZ1tkYV1jY15mZl9bT0RKSFRPRkhMRktIRUZIQUtGQ0ZGQTo4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNYanBYeoV2gZSFiIKbg5KQjZLayJ2Wc1aXiI+InI98hoyPi4p6iIKHkY6DhYCLhYWIkoaChImGh4eHcW5hQEU2NDwyLzExMC0sKy0xLy00P0RBTVVRUlRVVVdVTVtQR0dEPD4+RkhDREA3Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcjEq7PFtqyzwLO4vra/tMG2u7ukuMaptsnHtr65tKijtK2xsZuZkpqfiKevqqSUdp+kl6GrsbOYlqmtqK61u7K6rK+1orGssbW8t7WutaCnp6Oom6mwrbK6uLinnLepjaWPkpOghnmBgnRYYGNVZWFhYl9gZl9bVEpERUxWUUlKSkRKSEVBQEBLREFNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFtaUWNkV3p1cYKUfYWGk3aGfoCNe7+7o7yCtJSTjZuPhIiPk4mJeYeAjJOMh4WBjn+BiY+Gf4WIhYqHkXp5bl1WQEVOPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcV09fVUlLSkFAP0dLRkVDOz5AN0Q3P0JKSkVHV1RQXo+lraOxtMO2uMHMyra7xL2ztMG3uMK1v7C3dLG0prrFpLDGubGzsbSopLW2qrGgopabopGlsa2lraunpJigrLO6oqiyubW7vsy/xcW9vbPCt7q4v7e6t7mtrbGmsaqtvrC9u8LCrJm7qJWtj5iYqol+gXtpVmFgV2lkaWRWW2NZVlRJSEdMUUdESUpBSEQ+P0JCS0BATEM5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlFMQUxSV1RaVlp3anB/j4SBjoVuenN4iGK4oZqjiZWUlpOUk42Ql5KHh3uHgY2VioCEgYp6fIuHhn2KgoGLhJV9eHp1ZU9cZEdFTDpRZGFbXlNGPjtIUERaZFFRWVhaZ1pUYGFNU09FQT9JSkhFRkFAQz1FNkI+SEdLTVNaVF6Ur7i1urnJwLu9ysy7vcC7t7W8u7e+tbqyxmB1sqWxmp6rvqqlqKuqpKKytaGrp56Vlp6Yn66lp6aln6SToqews6iysry2wb3TycnTxsLFzMLKw8C+vb+7vLe0sLm3t8O6xr7DybCeuqqirI+lqLaJgX1xXmFgXFZhXmdlUlhhVlJWSUVGTUtAPkhEPUtCPUJAPUY9O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUVFJQT1FSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdZ21scZCNhZBzbHNyc4jVwLWZoI2VmZqRjpeRlpaOhod9h4ONlot/g3+DeHuLhId7i3mBioKXf3R9emxlcHZZXVxQZWViYGVkXVtYV1xNZG1VUm1uX29fWGdlVVlUSkRBS0tIRkhISEhCSTlEP0hLVFRWXVpck7nAub23xsG7ucrLu7e6tri5s7i1ta62tplkdamerXBeoq2cmKGim6Seq6WUn5+QlI+WmJeon6WfnpqZg6SdrKSqsK23sLy41NDO1s/JzNLMz87Kx8C/wsq9wb3CwMXExsq/yc+0pLuxtbCbrLm9mn54alxfW1hdYFliYlFbYFNRS0NCRUZFPEBGPkJJQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpYG+XkpGUbmxvdHWHs6yhoZ+LmZyZjY2VkZuShYqKf4iHjJCMiXyBg3N7ioOFfIp0goqGlX9ze3lsbXV8aXNlaWxpZmpqaWBmaWhtWm10l62kvIeHZ1tvaF1aWVRISk5QSktRTFRRSExBSkdLUF9fYmdqYpe3x7C5s7u+trHEx7awubGwu6yzsaert6yNtqeenKeaTpuejY6glpGnmKWVipOTiJGJj5GRnZuhmJuVloeemaaarK+or6ezs9PU1NbRy8/T1M7Tz8zGw8rQv8rJy8nSyM3Nw9HSuK/EvMS6pre7xKKAbWJbW1xXX1dZZVlQXFdOUUNCSUVDSTtBRD5BSD8/QTc7RD5AST00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ5PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZldzkJCZg2hxb3l5g6CqnqaXjZubmIuNlZGajn2JjIWOioqLkIh8hIJwf4eBhnuHcoOSi49+cXl1bHB4f3J7bnhzbGmAcG1jaW1weWl3fX7Lv8Lfp21jeG9kW2FgSlBSVU5ZXlBdXU5QTlRRVVRcbm53g3KWrristKiwtqutvcGxq7WmpbinrK6hrLSkj7Gum5iYjJGUkYSPm4GNp5GciYOLhIqJhIqDk5WYl5SbkZuYmZmenquspKehrKzO0tXRzczS09PQ1NHOyMPU0cjO0tPT1s3S0cXS1sbBz8jIw6m/uNCdeGxkXGFcVV5RXVpPT1RQTkg+QUdCQ0Y8QUI/RkU+QD86PT09PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzI0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYeGi3dtd3B9foChnp6hi42Zk5OMjJOQloV5hZCQjouKiJGHf4J7cn6Agod6hXaFk5GJgHB3c2xzfHx3fHOCeHFrgHJyaW9xenlze77Lmn6MsYN2coV3aGFqXUNaWltXZmRYZWtUWF1cYGNdY3h7f4uBmaqkpKKgoainqrG5q6a0o6KtoqOuoqexn4mmm5WTkYqSjoiClIlrlaKNmYSBhn6Rg4OTl62LlY2VmY6FkpCdl6ewoqCgpKSox83Px8HL0NPR1NLO083G1tPN1NjW1tjV19XJ1NrNytjW0cqtxMPMinFtYl9eV1JYUltQSkdKSUpAOzo7RUNEPENEPkhDP0NCOzs5PDlHQzQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX5pc3lygomBnZWelIWLlomOioiOiI+AeIOUmYuNiIiLiX6DeHN7fYSHd4B7h5GXgYRveHBtdX92eH10hnx5bId2dW59doR1eXudtYw8QYrGpX6NfGplV0lDZWNmY2hqZG95W19maGtuaW6AhIiRjJ6foJ6Rl5ifpKSmsqSls6CipZ6hqaCisZyHn5KSk5GLjouGg4+EfpycjI2ChIV6lH6CqpWjjJKKmJKLfZeKmpGrs5iam6ecp73Dxbm2xc3R0NHPy9LLydTP0dXa19fY1NnYzdjbzsna2tLWv8zNtXZ1bWNcWFJVUFlVRkZKSUVFPTo3OkBBQjpHRUBFREJEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYnFxc4aNfJeRnYt+h5KCiYaFioOIfXmFl5eJj4OHhod6hHlxenuEhnZ6ho6NnXqMcH1vcHp/cnuAcYSHgG6OenV3fXyCdX98h4mwdFmqwreNkoFwbmM9XmhycHFwbnh3gmVpb3J1eHJ7i4eOk5KblqCWiIyTm6Cbn6qfoa2copqan6afn6yZjJqMkZOOhX2Ih4OFi46gmZOIg4d+bZl5hJmGiJOMjpWMhnubiJOPrqqUlZeemKautbyorb3Gy8jJy8vPyMPRytTW2NfY19Xb19Pa29bQ2trR1sjVzJR3eWdmWllPUlNdSEJFSUk+QT49ODo9Pzs+SD1AQkFBREE+Pzo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJma3aAiHGRkJuAeYCOfoOCgoV/hHx9hJiOh4t+hoeAd4J5bnt7h4J0epKejaF2j3aDdHWBfXSAhG+CkIJvkoR1fIGFenaHfIm4xqXDyriClpyPeHBlTmVjgnqBd4aikIt5eXd7hH98hHZtlJaUlY+YkYOJj5eal5emnJigl5+TkpejnZmrlpGRi46Sg4yFiYiBhpCRnpyZiYWLgYWXe4iJn5eQiY6Ki4J8oYiQi7yhmJOXmZyopqWtnqe1vsC/uMfJzc7FzcrR1tXU2dXX29TX2drb19va2djO28eFeXdlZ2NeUlZWVU1LRE5EOz09PDk6PD45PkE3Pj9APUA+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0hQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZmFdW2h0enlsiY2Sd3Z6inx+gH+AfYV7foKRioWGeoWIe3V9dW19fYZ+dH+SnpGfg5J8hn14j355i4pvg5uAdJmGfYKKhXx+kXuQqY6Qw6C9jJyknH6KhH2JcoyLf3OmmpyZlIV7j5GJhGlHcaGknYyLkJKFiIuRk5WPnZuTlJGXjYyVn52UoZSSjo6QjH6Qj46LhIiSlpqfn4mMlJGdkIKMf6aZiIWOg4aEgKSGiou4mJ2RlJaip6CdnZ2jrra6tKu/xcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u3d3d2aWljVV5aU09OSERMQj09Pjk5Ozo5OTw9NkA+Pj09OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYGOinFzeIp7e399gHyIe317i4eDfnWEhnlzenRtgX6EfXeGm6GbnpSSgIyHf5iHgJySboiphXqgi3yRj4OJhJx+mpGJjaOin5Ckr6CLkYuGi4GShldyrYufrJyPhJickJCOXIOikYKNn5OVjIeIjJKTjJSVlZCMj4qIlpudj5WWkYuTlIaAi4mSjYqKnZeZo6KGk52VoIqKiI6ckIOIj4CDh4WkhYuQs5ickpSXoaGemZKbnaexuKykvMHHzcfGz8zPzM/Xz9HUrtbV2NrZ2trX1tnZnm57c2VlW1tWUlVXQ0BJRD8/Pjo0OTo7Nzo7OjM8PD89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bGJ+koNvbXeLeHp/e4F9hnx7doaFgHNwhYJ7dnd2dISDhX1/kqain6ail4qdkJSXioqnl3KKso2Ep5KEmZSFmoyjlqCYk4mbnqKTqbCgkZWQjo6IlYtujbeEmsTIsp2ipZudmJaRspBkpM3IlY6Gh4mQko6Nk5SKhYqKhpaam4+QlJOHlZiEf4+LmYiOkKqXl6SjiJmelpqJj4aXmIqFj42Cf4aPpYiNk6mal5OXmaGYn5mTnJqisrSlo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoFxfWZhXFxdTklUWUFCR0Q7QT44Mzc7PDo4PTY0Ojo8OjcyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgkd2gY99fG1+iHh6fnuCgoN/dnaAg3xtbot/enx4eHyEh4p+i6Ozp6Oqs6KXp5+lpJaVrqKDkbiVkbOajaGhjKWbsKOknZiRp5aomayvpJiVlpWQi5iZl6HAjqPJuauco6atmZKbnbKdhYWoopyYhYmJjpWNi5OPiIGGh4mTmJWMi5SThpWYhoSRkJx1kZiylpekoYidmpOQipCKl5uJi5aOh32MmJ6JkJCcmpmTmJiflKCdlJ6boLGuoqS3vrTFx8S9w8O/xs3KydKmzs3T0tHW2NPQ2LpxeHRbX1RfVU9ISk5EQkNFNT46Nzc6Pzw8Nz00MzY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER05bXFlKZmA7SISLenpuhYZ6fIR5gYaBfnB4fH59b3KNen6CfHiGi4mGhJKnu6yosr2vpa2zs6ijobCsipq1naK4pZWtpJeprbinpaOfmqmXqaOvsKqamZyUlZGXoJiau7uuyqFqtrirsJSZn6Osk5e9o16qsoOKio2Uh5B8jo59g4aOj5SViIiTloyQlo2LjZeYk52ZtJeVq52LnJSSjpGSjJmbipKekIuJlZ+hjZSNmJqdkpyYnpShoJScnaWvqKGls7irwsjEtbq9u8XHx8LRoMbJzc3F19bRy9Shb3lnW1lSXVBPRUM+PENBQjg/ODg1P0c9PDY8MzUzNDU0NTRCMzk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEdiYGJwSj+Lin+Bc4aHfYKJdYOKgn9tfH19f3B3h3eOgod7jY+MhoyZqsLAr73Gu7O0wLy0rauztoyos62tvaubu6Sorbm4q6emoqKkoqmvsrGrnZykmJuYl56ipqWSpLqvqcC8ra2yuaWlqH6IhpytvLCDjIyLkIOOg5GPeoGHkI2NnImIj5eNi5WWlJGal52omrGakaycjpqPko6VkJCWl46RoJGJlJukrJSWj5ScnZOhnZuYoKGUmp6npqSipLCzp8HGw6+wurbFxMK/zabHxMfDvNXRzcXKh3JxYFpYXlpMSkJLQEZHPkE/Qjs6NT5BPT01PDY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdEP0NGXGVHYGlnWl1ck4yMiHuHjIeDjHWGkYqBb357gX9xfoF7lXqSlJSYkJOVp7PGyb/CzMLDuce8u6+rubuYs7e6ssCupcGkq7C8vauuq6OjnqerrrSwqpygqpyhm5afsLWni6O6u7bBvKypnLKlpKmUhY6pxMOkgouPh4iEhpWUjXqEjZGPkaKMjJSRjomXn5iTmZWYpqCunYyqnI6Wj5KRlZWNkJWRj6GUhpefoLKelJqUn6CYpJ+aoJuglJiepaOmpqSvrqXAxMOuqLe2ycO+ts+yxL/EvLPRycjCtXN3a1tWWmhRTEhDTEtLSkFBPUNEPDVBRDs7Mz04QjMzMjI2MkEwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmVZTmVcZlRjapmNl4qMiJOQhol5h5SQgXKAfI1/eIeCgpB6jqGWqJqamLq+x8jJwdLJysLNvcKzrby+qLq/vbvDt6zCqayzvL6qsKqkpaSsrrOttrWgn6+fpaKYo7O9qZuovcGktrewrJOxraytl4eaqaelkYKMk6WViYF2ipF6hY2SkJ6fk4+Ui4+NlKOZlpyUlKOeqp+RpZqMj4+PlZaIfI+VkpKjmpWfoZy1pZCel6WjoqWenaaYnpaXm6SjqaeisqyovMDEr6Wyt8zAua/Es7u+writwsPCwJhreGBXVlpaSktNSkZEREhDQkFETDo0REg5OzQ8N0UuMTIzNTJCMjVTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Ol46ekomKf4qgk4R4hX+Vf3+QiIqQgJahma6mpJjCvcfDx8XTzc7Ny7zCt7C5vLS9y7zDwba3vK2zwLq8rq+ooKmotq2uqbK3m56toqehnqu3uKqlsL/Fsb25tKiqtbSur5eWpayooJGOkrLFp5WOfZKVfYiSmZCqmZiTk4+SlZOlnpKdmZSho6KcmJ+Yi4yPj56IWpCWl5KXpZllmKOfs6WWoZasrKqnm56ml5iWmJWgpKiln7arqrq7w7Sls7XLwLiqtqyyuriuqLi6vbiCam1ZVlNUTUVKUk5LP0FIRURISEg5NUZNOz44PUBKLjMyMDI1QzU1T1ZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz1AQkZCcEVpSVJlYkxGpZScl6KXqZaNkIOHppOIgoeCnIODlZCQlI+aop+vvq+hxrzFxMbGzs7O0sq+u7axuru7vs+1w724ubeysbWzuLOrppyrrLmqqaevr5ijr6SnpKW1wLCrrLS/w7rAurSoubW5s6+Wpa2urqSLk5WhjXTBmn2XmYSPlpqMsZWbmpWSk5mZpaOUoJuXmqmcnKGgmYqNkJacYEqWnJqVmqWWVZewn6+cnqSUr66spZqgpZSTmZiOnKCnopm0qaqzvLu7qrCyx7+5pqyrrbGxo6GxsrSkb2xkW1lOT0tFT1BRUTtISklHSUNDPjpLVT9BOj1FTTA3NTQ0OkI0NE1XTzxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqXmaCiqK+ZkZiHi6iWjoiThZ+HhJ2Xjp2hm6Oktci1qca6wsPHysnIzM3Gvruzrrm5wcHMtce6wbm1urCvr7O1p6SbqrS1qqmmrayapK6lpKisur+oq7a3vsK/vrm0s8Syub2so6+1rLmmiJuXppt2v5+EmZ2Ok5mai66XoZyblpWbn6GpnqefmZqqmaGnnpiQjZGdg252kqKalZ2inpCusqKqlKiql6qupKSfpaiSkpmciJScop2Wsaepq7q2vbOyrb65t6Cjp6ilp5ybrKmpjGFkYF5RSkxGSE1JVkw9TUVOS0xCQ0Q8UVY9QUFCRE8xOD03Nz9CNzVVWE4/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLVJgTVVIf2VeSEWrlZyhn7uvmZSfjJOrm5GSk4mrjYein4ykrZSjo7bGvrTAusLCx8jFws3Iwb65sq+4tMDCyrXFssG8tLqqqa2tsKOjmKq0u6appquqnamvp6Oqq768qK29tLi+x7y3trjBsr7BtKm1t6u+pY+imJKin7yfiZqgmZeeno+3n6mcpaKbnKGaqKWzoZudppyoqp6ZlY+Um4uXiYykopSdop6hta+lpJOvq5mrqp2dpKOokZWVn4OPnp6blamkoaG0tLq1rai1srOenKKlmpeVmKqhnnZfW19dSkhFRk1RSU1FRkdDU0xKQkVHQVZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKREBKSk5POUNANT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTlnXEZDQ5xwYkdFp5ekn57DrZuXpZiaqZyWm5uPqpaVp6aVrayZoqu2xMK8vrfBwsDHw7/Nxru9ubKwuLO/wsi1v7C8tri2pqSrrK2hoZqqqsWipKmrpp6sr6uiqai/uKetvrG4tse2tbm4wLK/wre1s7SvvqOXo5aUm5SuoJCho6Wjo5+QvaSpnqirnZ2gm6afvaKZo5+iqauhnZaNlZ6TnoePhI2Tn6SgnrWspZuVsaeZrqaemamdn42YlJ6EjaCam5OlpJqYq7G1saulqq2snJigoJKOkJWonpRnYlhgXU5IR0pOS0hFRElAPlFJQTxHSUhbUk9LPUhPVTRCRjk+SEc1Q2FbS0NOUlVXVlFYVFJVSUA4UlFQTTpHQTRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE0NkA5Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E6blJGPEt4ZWJWTKKao5yexayhn6yenq6gkqOflqWfpqqsl7axo6qztsTEvb+1v8K7yMK+yse1uLW0sLOzt8HFtr6xuLW4tZ+mrKqsnZ2epaTBpJ+qraCkqa2voqaovbWlsb25trbEsrS4ur+zxMG4uK6ztbWjnaWVkZShrqCZop6oqKujmsKtqZ6srZubnpmmoL6hnaSYq6uspqKZjZqfkp+Jjld/lp+moaC4qqaTmLWjn7Ggn5qulp6OmJOdgY6fl5WOoqOWkKausqupoaKlpZWVnZiLj5GSpJ6JYGNZY2BLSEpKTkVFQUZKPj1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JHRTY9dWVcS06en6GZnsOopaK0op2yqJOrpaCjn62prJ27sKistrHIxcHCssLDvcbDvMTJvK+wtq2wtK+/xLS5sbC6tKyZqLCpqpqdpaGowaybrLCcqqOusamkqL22p7e7vq+3xK20s8PAs8e0u7estLatqqKmlpWUpKyin5+aqKuwr6+7sqagqaiamZiToqS5oKGkk6+vrKWnn5KhnpWej5CNlZ6aop6ntKamjJizm6Oump2brZCek5WTmX+RoZaPjZ+hk4umrLClpqGcoJ6SkpqThYuRjZyef2BlWmdlSklMSlJCQ0BJRzs7Rz85OU9NVV5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0n6OgnKDDqaSqs6GktKqWs6ynoqSyrK6pu7GtsLW0xsDEw7XAxL3JxLW/yMK0q7Wor7isv8Ozt66st7qlmauyq6qYn6aXrbu0m6ewm62grrSyp6u5s6i6tLiyucCqt7LEvrXGqL+vrbe1qaesoZeXkaaloqKYmKWvuK6ytbagn6ikmpWVk6Sgt6KkpZavsbKnqqain5uam5aXqJ+gmKGer7KipoyXrpikqpeZnqSQmo2Tl5mFlZ6UjI+cnZOLqamqoaegmZ6VjI6Zj4GFlYiUn3hiaFxqak1QTU5UPUNBTkM6Okk/NzdST11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlwaFZDV0aMeWZDO6SknaKmv6eor7ChqbWrnbqxq6OqtLaxsLm3sLe4uMS9w8e9vMTBxsC4wMXAuqm2pKy7rMDCt7eqrLK7opWtsa2ylqWnkaq5qZ+msJ2roLC0s6qptratvK2zs7m3rLiww7u+v6bDq7C3rqmrq6eemJmroaKhkZehsa+zrLC5mpypoJmWkpemobeppaOisLG0q7OorJ+boKCbnaWdopedo7Owmp+Pk6Wan6ialKKdlJeJk5aSlZack4iQmpmUjqiopp+jm5ebk4aOmIt9jJaFjppqaGxgbG5XUFFaVEFDRFRAOztIQTc6WFBkXlBWV0VZX11NTFJOXktKPlpjXk5IUE9cVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPSonKz1ccD0+MS4wZFpkQDE2NDdnWWBGKD84bH1nW1Y7iXtjQz2on52iqr2iq7Cro7G4qqW2tKygrbW9rrO4u7q9trbAwr/IxLnEwsDAuMS9wbevtaert7G7vr+0qa6xt5+Xq66orpemqI6nu5+krLOerKKxsLOsqra0tb6usLG1rLC1ssG7xberva+xuKytqqOxpp6lqp+kmJCZn7Oqs6uqs5qdp5ualY6gpqW0rqehra2usae0rbKqpJyfqKOelaKZm6i1qZeZkZKemZ2fnZCqnZaXhJSWip2ZnJOKjZaXmpempaKgnZaVl5N/j5SFe46SgoyWZWxyZ29xXkZZZlZEQ01YRFo5SEI2Pl1RaFxOWV1HW15dTk1SWGRKSkNcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYFUxNTA9YFZeOClDM1lUXGdLNox6ZkxApJqhpKy2pa2qpq+ut6qvtbuop7G3xbext73BwrW0usW+zMa5wsC6vrnDt8C5srSrqbq2u7m+tKmtsLWYmKesqqybq6uPq76erK6yo6ufsK2zrq62srm4qq6vsqi1r7S8vcqzqra1sbSwr6iis6CbqK2gppaWmpqyoq2gpa+XoaSampKOo6aos6mhprOsqralr7G1r6SZna2nmpifmpmrt6KXk5GOl5yhl5aUq56akn+Sl4ydnJmWkImUkp6ZpaKhoJiWkpOVeYqPhXuMioOKkmpteG11e2FFYGpZSUhaWj17SkZENkFiVGlbTVxhSltdWlJSUmJhTEtFXmBgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ19RXC4qQi9KR1BbSDNjWVVLRJmXobGosaqtpqSvrrapt7W6pKy0t8m7tLq6v7+0s7fDwMzIvMO8t72/v7e/vLG9rae6ube2wraqrLG3lJemrquoo7CqlK+7pK2xs6eoo7K0sbKxtbG4s6muq7Knt6+2tMTGtqm2tqywraqppLagoKexoaSUnJmVsZ6nnKCqjqmjnpyWmKampbino7K1rKiyp66xtqylmaCsqJucnpyUqbiclI6OipibopePmKWgnJSCkZWPnZuXlpWIlo+Xmqeco6CSlpGQlXWEkId7hYGEjIttcHd0e35cS2VsXEtOY1w/YntHSThHZ1dmXExeYk1YWVdUV1RpXU9PSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0diTFYlLUItPUVMUTwzcmtJQ0OQmaWupa2vq6ilsbO0q7eyt6CrtbnJua7Au8K4s7G1wsPOxcDBvbS9v7+6vryyxKepubC2tr+8rquzspygp7GtpqWvpZ6ytayrsbKtqqm0u6y1s7WttKyqrKitqbmtsrHIwLilurCpra2lqa6wpqWjr6SpnJ6cm6+ao6Oio5GsnqOgoKKqpqa5pKy1tqWrrKitr7auo56jqaqboJqakqSzmY6JjYeQoaCUjJScn5KRg42Skp2amJWTh5eSlZmnm5+ejJKRjZB2fY6FfHx8h4mIcHNxfXx9XFNkbl5OWWZcRkSWW0c7Tm1YYltMYGJOVldWV1RZZ11RUkxjWltUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZUhKKztIPzNCSFMsPpBrO0dIj5yqq6KqsaSppbO0sbW1srKiq669zLquwLrHsbSttMLC0cXGvsCyvcDCvL+3u8SnrLess7i7wK+rsa2go6etqqiksKSrsqqvrLCvsK6rs7ynt7GyqbOrrKalo626rKqxw7q2rbupqKitqqmzpamko66qqKKfnaStlaWemJ6ZrJ2iqKqiraakrau4srKhqaKgrK+xrJ6gp6ipmaSZmY+gp5iGhI6Ki56fjoqMlZuOjYSGj5SfnJWXlIaWk5OXpJucnIuTkY2Jfn6HhXx3foeFhnNycYh1a19ZYG5jUXNxXEs7hHxGP1d0WGFaTmNbTlZWVVdRXGJfU09OZ1hXV0tHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyoyNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSmdERjg8QjA1RUtYMUCVWj5MRZWYraiiq7Ocqqqwtq25tq+rpquqvcm7sL23wq+xrLPEw87Pw7+/tMDCw7rAs8jDq663rbK4v76yra2rpKeqsKmnqLGmtK+qsK6tsrG0rLS8pLizrayuqKygo56wt6uqrbu3pbe2pKqnrKyrrqGpp6axsqSnpqKirJeqoZWboKaepKKrpa2jn6exuK6uo6aim6qrrqmdoqWkpJmgmpaPmJyTgoKPiIWcn4uKjouYjY+KgouXo5qRkJqMk5KRk6KZm5mKj4uLfIaBgYN6dICEgX1zdoujh3hqXmBuZldlh2NOP2eTTEVieVdiWVJlVE1WVVZUT1xdYVVLTWhWVldJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqMzk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEIrOkpPXjREhj5IRkSXkrClo6uxmKuqrbastrKspqyqqbzAwLi4s7u1prKvxMnL0r/Bu7nAv8K5wbnAxK2xtbGzur+9srCuraurp7aqpq2vqrmwqLGyrrKtt6q3t6e0t6uspKqrnKOes7OoqKS0taC3rqCqqKuprKigq6ypubapqqmqo6qgrZySqqGdoKSipqOqnp2ntK+opqqio5ilp6eqnKOko6CamKCRjo+YjX+HjIeDnZ2GhIqKjY2Pi4KFlKKajYyZkJGRj5KflpiWjIuEf3SHgX5/eHSDf3p3foGInY9vcWdncXhcYXOIa09emVZIbXhVZFZRY09NVVRVUE9YW2JVSFBpVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzo3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD5DLD5MVF8vSmk1T0Q7lo6xoaarrpqspa2wtLWvq6awqqm6vrvAsK65rqG3r8nHyNHAvr27vMK9usPAvr+usrKxtby6wbGxsquzqKS0qKWts7O5sKOut7Kwsruruq+qrrasqp6qrJ+joLatqKGfr7OitaqeqKeqo6qhoqytqL2vrK6toqiooKyZkLCimKKgp6iep5uZqrGqo6CtoqGUo6Ojp5iaqaWYmJiejoqHlIh9jYaEhKSWhIGBi4aOjJCDg5OgloiQnJCTkI2RnJSXjoqGhnh0gX98dXh5gHp0c3lof4akdWleZGuBdGeIjH1TWHBeSnhzU2VTUV5NTVJaZk5MVllkWEZTaVJRP0NOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS01KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMZzo0OF89YWQ/RjFDUFtbKkhNOVVBNJCPsqGkpqykp6Stp7WzsaulsaiquL7AvK+nuaqmr7DJx8jRw7y/vrm+v7zJu8G4sLC0sbq7t8Cys7usuKyitKenrLK2ubOoqL22rra+sL2nray1rK2cqa+koKWtq6ecnquzpbSom6unqaOpnaSpqKm9rLSvrp2qpKCunJuzo5WknKWln6Sbm6mrpp+bqqKbk5yhpZ6Yl6mpkpialJCKgo+Ffo+DgIiej4V+fYuGkI2PhH+TmpOFkqGMlJGLkZqRlYaJfn9ye3p+fGh4fHp1cHB8Z4R4hIhkYWdicoV6bWd4XV1VQFd6bVRhUFJYS0xOcnVdSFpbZ1lFVWZQRD5KTkRDQTlIR0tTP2phSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMScvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZjQUo3R1NgVSo9OURXPiqPlLKZoKCppqWhq6W4s7OmqbGnrbjBvbWvoritqKiwwsnJzMG2vcC1t7+5yLXDtbOytbK8t7m9ta25tr+tobOnq6uwtbi1rJ++vaqzwbS8oa+ztaqrn62wo5ylqKqjnpulsaewoJ+rqaihqZykqKGtu6iusa6gq6Okrp6fraaXn5uho5ygnJqkqqObm6WklpeVn6KWm5emrIyekZGRi4KKgICOgXualI2Ie36LhY6Ni4qDkpiRhpOiiZKSh5CZj5OAiHx5bH52eXhje3txcHByd2iAc2qDZ2VnYG1zjWxhaW9gbz5aeGtVXk9RUUpJTVRZV01dXmxXRFhgT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNjg7MigwOS8sNC8uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MUJoWTEzUz1lX0RMNktWZE8qOzJOWD0jk5mtmqCYp6Sjn6ikuLCvpK+wqqu4wrqzrZ+4r6uotLrIy8i/t8K+sLS9t8S2w7GuubKzv7S6vbepubi9q6S0qKmqsa66saucvL2lsMG1tqKvt7Wmp6exs6CepKWnoaWZn6yoqZ6gqq+noKaYo6mgsbmfo7GvoayhrKScpqepmpqbn6SVnZ2bnqqnmJygqZOZlJiek5mWoaqRmoiOj4Z9h3+Cjn18oYyNiHiCi4SJi4uFh5Kaj4iVnoiRlYKMl4yRfIV7c3B9cXR0YHl4aW5wcG5ofXFje21pZWNfZYV+X1pza3JLS39oWFpOUExKSFBSUElOXF9uU0RYWlJoT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLjo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM9ZmQyNE0/ZV1GTz1SWmdIKj4wWFY1KJeep5qdlqygoKGkorirsqW0tKqpucS1s62ft62urbC1xsjBt7/CubG0vLa/u76vq72ws76xvMK4qbu6t6eotamoq7Gts7Gom763pq28t7KfsbiwqKWnr7GboaSgpKShl5yvp6Gfo6ivoaChk6Skorewoaaxq5+so6+YnKqlqZ6Xmp6lk5udm56nrJudnaaXlpiUnY6Tl6KoopCIi4+FeoR+hIt6jpaJjYZ4gYeDiIuNhY2TmI2OlpiKj5d+hpeLj3mBenByd29vdF95d2RsbGtpaIJtZXJra2VoWmJzf15abHZqWkh9XVtYT09KSEhSVUYyOl9ebFBEWFZZZUxISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRHQmdbSFRDVF1oRS47MV9ULDKWo6KYlZ2pnqaho6G4qq+hu7mmrL3Es6+uorWvra2vtMTEvbO/urexs7m4uri6rq2/s7S4r7/BuKy9urSmorOrqKqzq66yo53Ctqapt7ern7K7qaalqK+rmaKnnKWmlJihs6aZnqWqqZyhoJSln6S5qKSnraaepaGok5+poqGhmZudoZKbnZego6ycm5qilpOVlpuOk5Ojp6SPiIqOhnmEfIWGfZyNiYqGeICDh4eHkYWVk5KMkJWTjY6Ue4KXjop3fntsdXJtbHNieXVoZ2lnZW6EZ2doZGZoal9mYmlmWmZ7Y2FSc1RbW1NMSUdJT1NAIStqXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTctMTE5NSwmLjUtODA1NzZgdEIzQ0RoW0tXR1VgaEIzNzhiTScynqSkko6lppyenp6kta2oqrq3qKzDwLevrKG1rqeur7fBwL2ywbexr7K2tbi3tayqvLSvsrG9wLeuvLyxpZ+2rKamtamrr6GgxKyqp7G0q6y0up6oqquxpZidqp6opZGZpq6jmJ6kqqGbop2XoJ2ntqavqq6hoZ2doZWgpp+ioJmbmpySmp6Vpp6uo5iXn5aUjpWYjI+YmqegkIeKioh4hXeCgoKch4uCiXt+hIiGhJCElpWPj5CRkJGNk3uDlY2Gcn59Z3lwa2psZ3Vza2JnZGJ0f2JkZWZlaWpjZ29ZXlhdbWRhTWhXW2BWSUdIS0xSWD45YGxpR0JVU1xbSUhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNBZEclNZykoJGMrqCamKCXpbSyo7K+t6Gxxbu5sLGjtqyrrqm5vr28rcCyr6+utq+zubKnq7mxr66ztru2sLm+rKWetaugobGlq6+fpcShs6Wvsq+3rbWera+srqKZnaeqpZ+Vm6imoJmko6mcmp+clZydrbCmuaetoqGamp6Zn6SapZ2WnpiblJqhkqiWramblJ2ck4yVmY6UlJinp42NiomOe4F0goKKmIWHfImIhISKjIiShZOck5KPkJGWjpB/gI2Ng2+Bf2Z5bmhramdxcmtcaGNhcn9gZGdqbmxmamdkbFxsbXZxYVRiaGNlWklGTE1PWFFQVWFlgVRAVlNZVUZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE6S2pbTVtLWGRjQEExSWRCJzSTopyPj7Gdm5ShmqmysJ+5wLagtMG7vbmxprawqa6lt7m4ua27r62rq7eqtLmtpbK1sa+psbe2sbO2u6epn7apnZ+qo6qtnarCma+lr7G2taysnrGtr6qim52krKiclZynpJ6aqaOllZqgnZGco6uqqbqfpqSgmJqanqKPa6KVmJxxg5acpIB2kauonpaWoZGJl5mAl4qfj3iFk42DbWl+d4RybIaKhn2EioZvXWRgZ4SXhmuLkJSSdXeLhH+DkH9miIBodmlmWF1pdG5OUGpjZnGCZl5kZm5saV5dXomQhYhoT0tEOEVUZ15KSFBQVVVLSFNgb3RlRVtRVVBGR0ZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNU9rW05cS1tmYj5HMU9iPCsvjaSah5Wxm52ToJyqraujvcWvqbfCuL28rae2saarpLi0s7Sxua6qp6y0pbC1oqe4trWop6y2s660rrOiqZ+0q56ipZynqJuuvZWop7C0uK2upKiuqqumop+coainnJehpqacnKennZKeoJmQnqiqo7Svo6KjnJaYmJikiaGPkpqHoYiUnqF/pX+nrJ+Uk52TiINyeI2Og4egdYiNaZeJZn5zeaBviIeDfox8f6GgoJl/e4eedIiOdpuKbIiCg21pZWR7bXJiVIZtY21pmHFYaXBuhlddaVtraluIcG15codph4RaXkZOPkZeTUVSVlZRUFJXVGdeTFlLUlJQRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN0MTVSa1tOXExbZ189SzFVYDcvKI2ml4SdrJ2ZmZ2fq6qoqr/Dr7K5vLfAv6qkt7GqrKazta6vs7arqaWxraW1s5ustba0pqeos7Gtsqiunqqhs6mgpKSaoqSdsLeVpaantr2mrKepqqynpqKgmaCopJmZpqOlmZylqZaTopyUk6OmpqG2pKOgo5iVk5iTnIiukJiUiamLmKOchrGApK6elZuflXmC1Kh/h5TAm8Z4d7Glt5ZkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyWsauweWhsWLGub2VpvJK8bmh6bXCP2H5Ta2K2sn6AcZR1mqGqkFdPWGFPVk5GVFtYUVBTi1xXW1BAXEVRTkRGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzExVGtcT1tNXmdcPkwxWlw0MSGOppOBp6qfl52dpa2yqbHCvbK1v7W4v8KrprStramor7Sqr7a0qKimtqWoua+csrK2qqWkp7KvrrGmq56npLKkoqGfl5yhoLGulZ+joLS6oqqooa2upaKdm5qiqqCYm6ihn5ieqKeRnKealJ6ip6OgsKOen6OWlpKYkpmFsGtqio2qfmeFloetZXGfnpWap5ZxrqGkfne6fGuhj3axX2q0W6WAZZyRYGaBemaAaXhqqWW+cmemjHaxanyxeHWSlGNtbaduXISgRWlnh5ZFdZxgfWZ7o6aCWV+Lq2mAknh6aqg4Sq9bV1RtY1pMT1hfXFdWO06IT1dWL0lUU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV5ZMzEbkqKVgqynpZ+jpKqxt620vb6wt8WyuLrDp6mwrK+pqbGvpLG6sKSlr7OjqbmpnrOysKOloKqtsKyvpqifo6KxnKOdmJWYnZ2vqJecop+0s6Grm6GtraCempego6qdmZ6koZyaoaekkJ2jm5ihoKyfpqagmp+hlZWRlpGahrWbtXiFqZm1mXeHs5u3f5SXl6uWfmuBpnqBhYaRlJJ3q2dqsVuse46HlHSIcI6GgICIkJd4g4KLl4yDoI+FsHZ3n3Framx8i0+lWEhjY5l+Y2ilX3lxdVKSh15QqW1jcX2GgGGdL1KibltUa2dgTEtcY1hcWkI+sHhXWEEjTWhGQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJBQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzIsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SjhhVTUwHJeglIizpqairqmos6yqu7bCsLzCrbi3wqusra+up66zqqKvvKuip7Wto6u2paWys6ijoZ2nqrKosKimnqCgsJagmpaWl5qgr6ObmqSota6hqY+pqKqbnZaYoKapm5+do5+coKOlo5Wbn5ianqOrm6WanJqioJaTkZOTnYTVk5m5cbDCf8aGfNaUnLt8m5enkI2cjKR6jYaigaWCeqx5j51Wr3uJfp9quVq5d4aDfaaCk3yYeqp5jp2Qe7FujoR0kLuFbpVQr6fFilGgemNgqmJzcoZsl4dfU7W0yIWAiXxjpDNCnXVdUGpoZFBAWGZaZGFKSE1rSlpTT1lmWkNDP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQi4wMDQ4MystKC4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbSltQX2ZUN0c6YVA3MiWcopOZsaippbOqpbSopLy3wbG6wLK2tb20tqiysaOxs6agr7apm6i6rqOwsqGytLGhpJ6ep6mxqbSppZyenqyXmZmXl5aYoqyem5eprbCoo5+OrKKol52YnKGnopiioaOhm6Kip5ueoJ6VmZumoZynlZubn6CYkJKVkJ2Ism5otXGriHCOpnK0dHO2e5uZpo2PnI2ifo+fpH6wdYOR0tF1W658hX+kb5uqpmuGhX2tfZeZj3uxc5Odj3izZZZ0hZ5unmaUUsmLWsJcn3liX61fdnOGYpeIXlnKnW+/gHVNS7VTVcZkVFFqY2ZYQU9qX2xpUFVGSTg9V1JbVllJQz9KPDI/OzU9PDU2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1Qcmg5J1dpXEFOVF9lUDVHPWFNNjIuop2RpbCtpaq7rae1pae2u7yyu7+4t7W7u7SmtbSisrKjoKywpZinuq6ksrGdtLiqoKWdoaqksqisqqWanZupn5aVmJmSk6OqoZeTp6uwpaKWkqyfppOUoZylp6CVm6enopqjn66aoZ6ekJacop6cpZWdlZminpWZlpKbhax7d6h2o4+Lh6lvrYqDp4OamqOKkpmLon6Sl4euhX+Cs1xys1KufYKCpH9x1313hH6PnYaZmnevhoqRnIh3tGGaZZqCgZVskluwV0uadZh5ZmCtXnZ3h2eYiGpdr3eVn494bDV5yK6yX0JUb11nYEVQbGBxbVZVTS5lYmhTWVA7QkRATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzAzMzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo3N6CdlKC4sZizwa2osqeqsrq4tLm+ubiztr62pri0oLWtoKCprKCVp7asqLGyq620pJupn6CoorWnpqqkmZ6VpaKUlJyakpajppuUkKetr6WhlZipn6KPkaKaqaahlZqmqZ2dpJ6tnaGcoI2Un5ueoZiZnJaXoaCUmJGmnYapfX2leaGPkIOqcK2MgaaGlqGiipeWiKOBkIeUqnt/i515b7FaqIOCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfYKUbZNcq1xbk3+Rf2hnqmNye4BqmIZxXataiaCPa25lT0pDoVxaTXRdYmZNWmFfcnRfSlU1SpqSWEhFPUhGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzFUX2JMN0ZJX0MxPTeinJqav6yYtMKuq62oprSwuLG2v7m6s7G4vKq7taCxpZ+mp6eflKqxqbCqtq2qr6GYoaCmpKS6oqOroZebkaOglZWfm5WZoKCQjoypsK+mnZebp6afjZKkmKisqJWYqaien6CkraOhnqGOlaGYn6CSnJeclZ2hlZaPq5uPrm5ytHSpjHeKpnO0eXS0gZOlo5OcjImkh451uG+Me4uia2u2WqGGZZeXaaCip22UcrR0k5h/smqGkoita3WzYZ1mom6GkmuXXK1gTqF8h5FSc6NseX9+bpiGcFyvVjycd2ZUb24uW6dPYlJrZWJsWmJcYHB8Y1NZUT4+bW8yQkJAP006ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKywzMjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV45MUE4pZqbnbuinLLArq2rq6e3qbivtcG1vbKwurirwbaqq6Gdp6SinZKrq6e2o7Oorqqhl5yooKWruZ2jrZyWmZClo5aOnqGbmZ6fkZOVq7avp5mUm6ypl4yUppqlraORl6uypKCeqKuwmaGikJmil6CblpuXoZOcqZ2UkKqZh9OTmrt0scSAw4Z91ZabuHmJkZiNl4mMp4d5orZ1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6J+jHSHq32+bnO8dLKDdXiAim2aiHFtjaR0vV13fVthebxqWlZbaXleaWFkZmJteW9ZW1lDQUByP0NGKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTZAOaean6K8opixwrCtqaqssai5r7fFsryzr7ywrsGyraajn6ShnZyRqqWqsqS1p62koJaaqpmmrLmdo66ZlaGQpqCTjZyjn5mfmpCWk6+5sKuVl6Onp5SQlqWdpK2fkaCoq5+cn6mksp6ipI6nopShmpyXlqSYj7CgkpWpn4WQmbaAkZKNuJV4gpObtXdubG5zb3mPhI6Jc57Bu7yZeoGyqHCAdJG5g3yGhouHjXuKho2XfKS7ub2cdXmzo3V2l3V0sHWYnmaGaY22dHJxd7aMXn95fYhng3lteWKLrHB0hX9YW6dqRGRZVGZfY11jUWZmcW11Qk1QTUQ7Wkw/SjM8MCA4PjsuMz1BOTk/PTs8QzZCU1laWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc+NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JXOCpPXV09KztWVic9OjymnaGhv6aWs8K0q6qorauqu6+xxrC2tK+4p7W5rqukoqefoJ2ZlKykraqmtaion5yWoKOerKW+p6Gql5WckaKbko+hqKKUnpeSmJSytbatmJ2kpKKLkpKmnKWrnZappaacm6Kpp6ajqKGSrJ6Xop6Xl5idno+wqZOcp6KPa35pnKh5iXN+m451emWHe76/wLpukoJxlYVfcmpaXZqJYWSHjpVrYH+VY22cdmKUa4CalZRlXl9jcZuJaHONfIaUZmp+cXR5fn1iW3h0gWhQXG6DfHuKalhseYFySUpvhXBOc01FV1xmYUxbV2ZjXk9abXZqclJPREVNPEhJPE0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4xOzouMC03Nj01JiIvKjIsJTs4LTdJUl9JJ1NfVjQpUF5MKDM+W08nPzI+qJ+oocGkmrS6tqOspq6nqLWyrMitsbSttqS+sbOnoaSqnaOcmpqsp66kpbWqpJuYlqKbpq2pv6ippZWUm5agmpOYpamokp+Qj5icsLK/rJunnaeiiZORqpuopJycrJ+jmpujp6yin6qimq6blaaglpWdn52XsaWZoqiZnJGenKOlmqejmp2ampqQloJobn1xdpGXlJGDibSpjYWYlY6KjJiXh5OVioOTk5CIjZGUmZOZl5qgoZqblKCcjoJ6pIVsaXuQfYB1iYuCcoJ4eXZ1ioB7iWpzgXSDdWR3fXZrcHptYGNbb2dMWFllal9XWXB6b25mU09GUjlPWk5STygrO0pCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8Ojs0ODksMjs4MTApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlQxMFReOis9OF1LLDwtQLKgs6K/oqSxsbegqaazp6WwtarJrK6yprWmwKi0oZ6lppyllpagq6eso6O3rKCZl5agl62qpsGfrKSWkpyXnpiUlKKenqOokpCZqKeyw7Caq52qno+Xlqmeq5yeoa2YoZudoqWvpaGkqJ6rmJemnZmaoZ6enLChnaKnlZiUmZSho5akn5ihjpaUi4qNj5etj3uVm4KRgImpqIWAmJaKhI6fiHuDkIaFmpGHhomVjpuXjpCYnqOWmZKQnY1+jWWhs66EiYR3e5CKfXd5em9neZCBgIlrdYF5iHJpc395dYOHgmt0Y3hmX2hkY2Rmalhre3Bqa1xTTFBEX1VGQD8+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVFZWWFpcX2FjYV9dXV1eXVhWSktMQklPTVJKOzw6Nzg2LzM5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LEC0oLmvvqyrrbGyoKqmsq2irLOwxrGsraSzr7yktJygp6KhnZmXqKappqSls7WelZWdmZmvpq6+oKyjkpKempmUkpahnJepnYWdqayitMezn6mkqpaWmJqnnqmcoKWrlJ+fnaCqrqiko6uhrJufn6CYpZ6cn5ywpJmfqJOYmJ2SpZqZqZ+bl2aDknxlfo+aj2N4jGxoanqQo6trZJmXfmeFimVlaWh6jaGOa2iMl5Gid2tqi5iin5hzbG56hIyGeVhlXYWCXmyLioJ2W2hzd3eRgIeCbniCeH9zbXmEc3eIiI6De2mFWF1qc2Rdc4hpa3xxbWNdUU5XSWRYQEozPUY3P0ZENzE8PT9BQzs7REdISElMTk9SUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtJLjZaTzYpRVkvRE8xWUI7Py49pZ+6vLmvq7Owq6Wora6wp66tsL2yq6ilrbCwn62YoKSeopqap6ycrKOmqKmzrp6Wo5Cir6a2uaWuo5CPmqGZk5KboJiZppZ7payiqLTDuKWip6+fnpWeo56jnaSqqJKfoZ6gqq+pqaOqnqebpp6noKyWoZylsaSYnKuWoZ+bk6WYn6uZnn6+g4hytHKFnoWtaHe5xLhxkqGje6aYmHOqgnzLwMC7cYqjh4KefJaYiJ7AvYKWnZ2NnMHAe4F6kYyawr99a6Wyb4yBb8p6f5t3kYOOgHZ5gX95cXuAhnB4hYyTeWx2kWJlXnhkX2WBYl50aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BQD89NjQ2ODI2NiomJSMpKiYuKyopMTAfOSojPkhbTCojQ1AvI0ZbM1BZL1VBQjsvOJajuMO0sK+/qamUo6+psK+tprK2sKump6Wxq6CrmJuioJybqqeinauipamlpbSknqOTpq6suLSnr6OSkpmdpZKRoKGXm6Cdh6arpKutv8CxoamuqZeSn56imaOkqqOToKGenayup6umo6Gln6SknK2pkaSbqa2qnJ2rna2il5iml6KkmJ1/zpR5eqWBepaWm1+tj12OqICgoXynlZp0q4KAr15kjKl6qIeFn3SXkoizY4KrhqCNjbNqhK5zfJaHuGGCrVmjzW6QdXvbe3+ZcX6IknV/ZXuIdnZsfYdufYWQkX5sgI1fcGpvZmBfeGRccWhqY2ZgUlRTV15KT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU0NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7WzpMLSFQQEY0LjGtwsDAtbSwt5iekaOqqa20q6ayra2spKymsKqhp5uappicoq+foZ+op6OmoZ+wrJuelqaurbCrqKyglJKbn6WTkJ+ll52oo56upKuwqL/Gs6ipsa6Wkp6copehqqqflaGenZytrqapqJumpqOgqpKss5aloqqqnqSnp6KxopObp5uhm5WUkZegcIWMmHWEqIdxsHydcqx9oJ+BpY+ed6uCfa1/nHKtfquHhp92mJJ7fJd+qoihi5GLnH6reoiSjqCAeq1WnMR6j2+SwX2BlW11cIxtZndlhm9hd25yboiKkY+DbI+OZG1zdW9gZm1kX29oam5mY1dTXGBaUlJDOUlJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkyNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLTwoPTEpM1ZARiEcRztDMS0rr9TGx7K0n52jjqOioq2utq+psaepq6iuq6umoqOdmqOWn6arn6KmoKioop+esKyYm5eoqK+sqKepnpeVmqOikpShrZudp6OurKOstam5zbKtpq6slpWcnaKZn66snZahmZ6eqbCnqamaqqijoaubr7GiqKyvppmmq6qrsqSTmKSmm5WShaRqpHWJeql1erJxgqWJmIxwh5+ah6RfYFKrhH+ugpt1roKnhoafepmXhXtmgKOJpJiGgaN9qX+BlIauXnyoVZ2ikoF6o5+Ae8OvxYxzr7SzuXFiqa/CdGiMjJeOgWyYkW5seHh3bmtmZGRxcGZ7aWNcVl9pWFhUTExRTENDQUI7Q0FAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dbAoZmrqKGvop+wtbCvqa2jqKeqq6uppKafm6WfnaanpqSdrJqiq6Gkn6+inpuTqqS2sK6gqZudl5Wmo5CaoqifoKacsKajqLGstsiytamsqpWRnJ2imaCltJ2aoZScn6aqqqKtmaqooaGporOtoqqzsqKcqqiwsLellJekqJmdknyqbJ6Eh3WreXywboKki4iflpWelYHSt7S4yYCBsl5flKmDpIeHoHqYlZl4qslzmaOUqKmQk5qMfpqJmsbGd2WhgqVzgZ+Ogn2vXm+1Y7F1S6OGbadHgpNkjo+ckntvlZB9bnl0fHptW2VqcnFmgWpeYVhjbVxeWUlMTEtFREJCPUE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00TlRRHRw7PEYyLCSopMHGua2ps66spaKdsrmsqqGmm6imq6yppqCmpJiro5+urJ2moayan6mlnae1oKOYk6irtrKsm6acoJaQpq2Smpyno6Cqpq2ho6epsLTCsbKqraiUiZidpZuipK6ll6GVmZylpamZrpysp6Weq6O3rKCyubCenK+otLS0ppaYqaSboY+CnU54moF/n3qEo3yCpISGpp6cnpSEuHt8ebmCf8zGw7Z3m6GQi59+mpaXiXafl4qkmKSofrCFm4SehKx9mZRhpWyjcI+FkIF9l4RyrGCkcnGAmmC8fVJVdY6Ro5Z7fJGOh3J5coN9cFxsbndyaoFvWmNfaG5iZF1MTFFTQUhHRkk5OUs+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUV1lZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1RGPEUyOlBbVBwbNj9HLC0gjIeZqaykq7mrr6CboayztKafoZWmr66uqaadpaWao6ehsq6iqaeyoJmopJSitaOklpeiqrW5pJyjnaOTkKGymZ6bpqWhoq6snKSoorWxw7Gtqq2qkYeRnKedo6ScpZeemJmZpaOnmK2hrKSll66lu6yht7eunp61s7mytKiZn7GipZ+Hj9G1w7d5h46FkZOPgKZ4lKJ3i6CShaWCi3GrhoW0bnJpmaOclYmffJeZhoeQc66CpZuijaaLk5yIlJCabXCyXKVzk3qcbJl/e5l+bqlhonFxf59ic7K4aHePk6SYfYqLkIh2e3iNgWxod2l4c26AdV1kZG1tZWhgSlpXWDxIRj9UM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCMpJZJyjYquv7+8u7Wel6ikrbahopmVo6mnrqmrmaWhnqahoLWnoqmnsKOUq6OOpK2knpGamqq0tKSdppypkpSXrqCgnqaknKectJmhqqO1q8KvqaupooyEj5yioKajlZmanJibmKajpZeppqyhpJuspr2slb6wrZ+jsLS7rLWonaqzpamZe6iRfXywd4qBpKWInG2yb6CHrXuhj4OolpmArImFroWglKihopeFn4CZlYB7kn6rgJ2alouqeJ2gj4iTkn95r12jgXymp2SegHyXdGuuXaVrcYWZXWBbjKBtlJClmIGTi5OJeHmBln5qbH1ifXRtgHpgZ2VwbmdnaEJZX1s9SlMyVDhCQkM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pXU1BPTkk3MDUyLiosQVRWVlZUVFVVVVVUVFVUU1NWV1dYVlVWUUhGSUojKCi8kpqEqcbDtsG0n5qtoK64paOOm6SjoK+uqZ+jnp2tmJ65oKKroK+qmq2gkKqppZaJmpCusKymoKibrZiZj62ioZ2loZqlnK2YoKiltqi/rqSpo5+LgI2bm5+mnpKUmZmTmpqko6OYp6qqoqOeqai+pJfDrKujoqyzu6ywqKK1saqsmXavfpCKnIWHfbqtiZhksIxlla19oY+Dp5abga2KhLCFppmjoaKRhaBbbGqBs2B/rXt7goCybGdumZeLiLFbfbRbpINryKJln4F7vFl2tVqyfVKvgHqsWIChbZeOp5qKlo+TlHl4jZt8Y3N8YYN4c4B8YWlmcG1mZWVPVWNcQVRePUgoPjk9NCEhLCQfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTkpHQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsbe9u7TBs6Ocraaltqmgi5mgn52zsaieop+dtJigs6iqq56wrZ6rmpSuqKKOiJuOr6ypp6Ooma+Tmo+pmqGepZ+apKOlmZ6jqbKovK+lqJ6djnyKmpahoJmQkZmakZmXqJ6fl6espaSkoqSpu56gxqelqaKstbeur6igva+urpeBqZKjro6bgIakl5iQgYC4w7qDjp2ThKeYnYKsioKviaecmqWrkX7VvcKqYqO/vXx+o4KD17q3tYWTkoKevb6EaqOBb6uEbp1/erKxx4Nrq7C9rHh3or67dICVjaWbj5mOlJp3gJCZeWJ8emOMZ3iBe2BrZWtqYVBiW1NpXEBUYEJMKTw6NS8fHyQeJTIgHSQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVtLSxv7qyvbOina6mpbOmnYyYpb+ptrCnob+mprGbnrGcuaifra6lp5STr6yXjIOaka6mo6yipZyqoJiLo5OmnqecmqGoopmeoKysqbitp6Oal5N7h5iSppuTj5GYl46YlKiZnpaop56ppqGiq7ueqcWjoK+jq7S1q7GrorypsLCbdHaqpLaFZYmfcGesj4qPbW93pJCaoIF1sJqWcJCNcpaoo5uYrqRybG1sZYp4bm2CmXGAemlwaWaJlpWXcWhphYZncIZkXYpjaW9ZXWd+eKZgYnKPkm9mZICNk46hl5aXjpSbe4aOlHRlhndnjGp4fnhkbGNmbGJLZVdKa1k6UGREUCdKOisjHCAaIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola20qru6srOqqaKunqSzqpiSvbHDx720qZ6/q6yjoKarn7qjpK2sraWNla2qkIyFlZetn6Wqop+kpKCRi6WSp5mpmZajqqCWnKWmp6+5qquam5OSe4OVjaaXjpGRl5OMl5Wmk52Wp6GZsKadoqy5oLDCqKSzpqyxsquvram6pbC5l4uhqaW2nYmWopiGqZqQlJ2TqrOZm6OsobSXo6GeoaKdoaShlaunjJKTjIeSnJyUkJmTmJCOlYR/pJqXlY6Lk5KKj4aEfmeLgHSDdnSHjHGnbXyVkpSTgYGPj4+OnJOflJaUnoCGk4twZ452bol3dXx5aWtkZG9jVWBYQGlaR2JgTlgrRT0rJiE2NDAvHxwhJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlRRSkVDPjk9QEFTWFtcWVdYWFhYWFlYWFpaW1xeX19gXl5eX19gYGBfWVlgpZapqaW2uK6uorClrZ+gtrGQjqrEu8S5t6mhpZ2bpZ2wqKO2p52ptaankJeso4uIiY+cp5aspKKaqJ6fk5Wjl6iaqZmUp6GkkJqnmaG0uaeqmJqQjXuAk4yhlIqUkZWPjpKXpI6dmKeem7Wjnaast6ivwq6jt6ewr7Guqqu1u6KxvpqSpqSmtaKSnaaejamfjZKfo6ywm6GksqqxmaWhnaSqnp6dnJesnZKaopuUkJaqmY2YmJaQlp6Rh6CdlZSFkoyQjZWLgX5mjYd1h3Z5iIR0nGqHkZWVkop9jJaSkpeRoJGblZ6ChpaFeHGUcniJfnF7fmluZF9waWBbX1ltYlBgZE9ZOUdGRT0yPD04LyomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iVpKejsbSsrqOpp62gqLWqkI+co7K6raqroaKZepyisKSlsamWm7imo5OXqZyOhoqJm6KQrp+kl6igoZKXmZuui6qWkKiZqIyYqI6euLajpZibjYl5gJKMm5OKlZGTj4yRlqGLnJynnZ63o3+Dr7WisK90pL6jsqB4e6Gss72Wd66loIqAqn5kXGJ2n46knYOXfm6Ts5yjqK+rpGWfoJR0epqXcYCZqZhsgKOoimWcpZuQl5iWi5KbkISdmpCUg5KHjo6SiYV3a5CIdodxfIaBgGFpiYuVk4xbdpWRZ2iPjHF6o5eWZHeXhoB2l2iCiYJueX5qcGVfdm9ra2dcZWNhYW9SWj1NTU5SRj1AVEI5MS8eHyY0OjMwNjY3ODw7PkBBQkZIQkdGSUtMVFVVWV1gaGdnWFFJPERHPDlWUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuppamtpKetpZKWqrSusaWZqaaql3OLna+fqKunk5a4oKCOm6SekH6IiJqejayapJWoop6Ol5GehXSukImmmqiRlqOIm7mzp6CYmYuJdXaSjZaTipORkJOLj5OfjZmepZibspaAjJu1nbSMko+9p6F+p6J7pLC5go6Pp5+Ei4WPsamvjImWopl5gYushpydoqirqYiVh5l3pZt6h5yBl6eCgXudsnqKhp+XmZSYloGQlpaEmZpjeYeQhI2PkouDbnGQiHqBcYCBhn+GdIeFlpJ4lmiTdKCadHuZgp6ahJh9kYmBgphpjIyEanh6cHBnZHdtaWxqXGRpaWVyW1xIVExRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1JYWlhbYWFoZllRSDlESzw+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZijn6aurquorKCosKenqqWZlK3FvK+glaWotJ2Pg52rnKaioI2Qvp6ZjZ+aoZB8hY6ZmIisnaOWoaGSjpSJhoCRqI6Hopyjk5adhp65saedmpOPhXB1kImUkIqUj46bi46RnZCVnqOUnayIn7SJtJqui8qIq6+Jt4WNsIOysIWpjqeYjZ18qI9ye3ebjqaWaJWkebSLn5+nqZOZwoJ/q4iYoXGegJqlfZeFlbKAoX2gk5+PmJeAjpObiZiSi3yFk4aNlJOJg21zkoaAe3KGgYR9hXWGgpiBj8VmgKmHj6JqnYGel4CZgIqLg4iYb42ShGd3dHt2Z2h1cGdoa15ibmxmbFhmRlxRTDJFNDZNYWM3JjQ8REdEOjYzNjU4Ozg+PT0+Qkw/TklKS0NQWl1cV2JeamxcUUU9S01ASmRYXWNnaGdiYmJiY2NgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLmxqqunmpSeoqSqopWkqbair3+gppylnp2JlL2Zk42gkZ2PeYOWlpGIq5mcm5qihY+Md5ucjqCRiJ6km5WYl4aiuKylmZuNjX9ibY+Lk5CNj4yMl4uPkZ6Nkp6gmKCofqGnh62doJaukKCenZGGgqCNrLGIpI6rmoyafqJ1gJiTa4GrdE2reIeNnZKbqamCqqt+hKF7eqdpnn+SbGeXhpi2iZ5+bmBjWIOXf4x7ZGeLc5l9eZZrXXyXbl9TcYVcYGx5g2BZZYJ+hIGYcaeqa4OjbnKlcJ+CnGdknmxabIh6ZVlfgn5hV1BvdmVtdHFqam5eam9sa2hXZ05dWEU5QDRHRF5rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSltdX1deX2J2YE1FOk1PTVRiXFtmZ2lpYmJkYWRkYmFiYGJkY2FiamtkYmRkZ2RiZ2VhY2iYlp2guaCqo6askaG2vKuvopmWn6Clq6ufnK20oqeRoJ+fppuZjZi0mZCLnoyVi3WBlJGNiqaWlpifnn+ThYaso4eckYqYqZiZmpGHpbCmopWZiImAaW6Ih4uOjomLjJGLj5Ggi5Kdn5uhpX+TgY+joZSgd5yWkKeDoqiAhquvhqV6i32Emn2icHKSh5Z7nox5bYebi5mRnKmcj4edfIKic3amZp5+d6RemHt9k3Oibpi3tLpzkoeBgLaoZIHGuHtwlbaMcYCbpGN0rKtgfWqds35ufYeDj4KLl3GAo2xzpHOegn2jXpyZs5Zve5ees3RyW56ygmlib3N1cWhuWGtrcnJkW2hdYkxEPUQ1UUFacTI8UkZfSlM9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltZWGBgfGRJQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7mZq5yToI6luLatrqCaoZuio6Srm5qxrKuSl6CYoKSZmpSeq5uLiJJ4i4VwgJaNio+hkJOUnZd9kYqOqKCHmI+KkqKTm5qMiqinpJ6PloeEfmt7h359j42Di4+PiY6TnoGVm5+coJ+LiXecmKKNoHKii4ipiJynkZeprICujH16oJl5o5N4gHOXiIycfZafhpuOmZynh6NkoX2JlpCbjGyeaJqNbpqZe4CKp31yZ3Oqg52Cc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF6ndnaJioCdaJp1h5OSmI5/nm2ZkGqmmVyofne7an2pWo6EXbNnXG5xeHdraVtwaXd4YV9mV2JCUEVPN1ZCUm40SlpZXk5aREAxNTE7OzdIPzpDR1U/WFJYXT5EYl1WYFFhY31qRUI5TlteWWRmWGZnbW1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZGNpaGdraZWciaq2m6iJY5WcrLqysKydppuap5+drJmdsKernZeimaGfmZaWoKOZhomNaYiAcXuXiIyWl4SSlJiPeoqElqOciZWQhoudkZybiI+oop+ajJGKgIBpgYZ5f5aMe4iNjoeOlZl+kqGeoKKTmHJon4qgj4xwkoyCqYiZoKSpoql9sK2koriXdqOzoqN/iJR4nXqrmn6ij56cmImYcqF9hY2wtX1rmpGheH6YtKOjq6iEmHuafJyafnOqWl1ve5eLeJ5iTH97e4VkephCTZ9ZompyfI5ugYqEmXabeYeJsbN/fpqSpnR+nW1xfJRvmXJpo12VdkhlY2BzcH19bmZfa2h1e2JjYFFeV1xUVkBZRVFnRVJWXGFYX0lEPUI4QEE6SUU4TEVYQVZRWlZERmFcWmBLYG19ckVDPFVeYlplalZoaG1vYmZmXmFgXF1eYGhiX2VkdmxeZWdmbGRlbGhoa2mUnYGxrpmEU1+hp7S6s7OpmqKLmqmbnKeSoKujoKePnp2cmpmVmKGdloeHiXeFgW55lYWQmot9kZOWiHKAiZKgm3KSkIGImZSfmoSOqJuZlYqKinyEbISFcYGhjHiFjYiHkZeTe5Gin56jiK6GfbWEj56de6aWeqmClp6Ri6Kefqdod21+mXOgc3F8nYWYb5OCrn2jg6efm4GkcF6paHWjY2+lYZzTj3x6mXhyc2OihY9+onKijnVrj7OLYIKYinOqsqe8f3eDbX+/pqq0XpxvfnKXb4FzonJepGd0pmBopmya05h6gptud3mXa5t5dpdybKmlZ19keXB/hGtnZmNtdXdmX2FSW2ZQUWFIV0lUX1dTW2RqW2VRRkNLTEpLQkpFOFBAUE1YU1hPUlFgZWVpUmR4eXdKRkVjXWVaaGpTaWhqb2NqZmBjX1xdXV9oYmFoZXxkXmRnZGtkamxmaGxomJt/sKxUXEt+qa+ytbCzo5yYhJemoKCjjKSnn5eoiZmXmJOZk5Ggl46IhXtwfYRofY+Dk5qBd5GOj4lwf4ePk5JsmJR8iZGSo5WDjqqak5KKhYl5hHeIgG6BnoZ3gJKFh5iglnmToqOaoImzoaK2i3qsp6SupXCpgJuRhoGdk32kgKKZhphxnoSira6Jl4uAjKSNlYOvopR2tba1yaJ0lIuCnmGdl6lteZWHn5p1oYd3oH2QloqBb0xmo5JwmohzpXt5dGKDgmx+oGxyZGCccn90l2t7arS1tMamc5h+epxqmpqrdIGabXN3l2mZeXSYcVBEfbNeanVqeIdma2didHRwbVZdU1loT1JoSVVMWFJWXGdrblVnV01KQUpNSkhKTkFRSlBkY2ltZXRyc354e251iXt7VFFPbV5oW2tpUmpoaWxnbWZjZV9cXFxfaWJkaGt7X11kZ2NqZm5tZWlsZaKcia+nhWY/lKGyrK+vtaKij3+Wp6Kho4ukppybpYGal5aNl5CPm5OOiIN5anmGZYOMfpafeXWPiIyCaYSFkoOMhZ2NeoyKlaWSgpepl4yRi4CJeoB9i3lwj6CGeYGUhoiVnpV/k6WnnJaWhGdueJxsomR8caV4nJhwaKeCmI18pXqgloOWcp92gImUlY+5bpCKomJ9maKWiW5zaqtrdaBtb6Zgm2mLkGmWh5qVdaKAfZpfi4WMdW+IYmihZZ5/aZt1cGRniIJuc6JaX1tkoW5diYxwe390cmSlbniiZGanaJdyi5huoW9SiI9uoF5kp1SLXVSYbW1yanGBbXBoa3hza29RWFZWZllTbUlYT1xIWGhoc2pZa1ZRUkVWXExYUmFVaGped3V6fHB8fHKCe39zdo2Ag3ZeUXNhZ2JxZ1BraGhrbG9oZGdfXV1dYGpiaWl2dV1cY2hjamlybGZrbWOdpZmmemV0bYunrqWqsbGmn4t/lqqcnaSLoaGZoaGAlZiTjZqPi5eQjot7hnGAiGiLinyXmnN0iX2QfGWDh5WKiZaZgnyIhpamkIGiq5CFkIqBin2AgI5zaY+lhH2Fk4yHl5+Oh5Kqpp6JpniWnH6liZaMspmekYOvl5+leZeJeql0po+Emm6looyShIyDvG59pa+Ch4aHlJedoX2me3KolKCWZ55+b6xjloqVkneobKmigYl2h4J3q5GmiGuRsGt2s4ypbIuGbm6fnpGVYn+ri6p3gH+Op593n32FpJWdoGmah3WsZp6tjLZzdr6MpJNZg6aNq2F1cXNve3RxYmp+bmhsU1ZaVmFgXGpMXFJdSV1sbXZgW3FZW2BaZ3Nlbm9xY3F0YHd6fnlyeYNyg36Be3uMgYKAdmJ5ZGRuc2RSbGdnb21yaWZpYV9eXGFqYmxsem9cXGJpYW1pd21nbG5ilaaqnYGAnqSWqqqeqKeuo5mIgZaqmZ2jiZqknKidhIuaj4WckYWSjYyMdIV6iINvjYR9l5NzdYZykYNuf4uShoaUj317goWXpY1/paWNgI2JhJR1g4eSb2yLqICCi5ONiJueiIuTqqOgkIB0lJeIfoF5lK+kf4KccY+GeZKMhYB7cqeMcX19epeWm4SNeHt+foiUlZOLd5GZoKGEe36Ja4yFW3l5c3lwaW5+kolxf3SBj5STcYWDgmWNf1+BgIx4dnSUdW97b26JboSGX3dpeI5mgoOGj6qcf3R9l2qJiG9/dXyEdW1sZoxzd3uXd4Rbalh5j2hud3Jxb3d4b11shm1pZ1ZaX1dcZGtkVWFVXlFfb3d5a2p3ZWpqanV8cHF0c2FvdWJze4F4dXqBdX+Af4F5i4WCfXttf2xkeW5eV25naHVreGppaWRcYFpjaWVscXVuWltia2Rra3ltaGxvYY6Vuqmni6Gim6akmaSdq6Kgg4OWqpGdoIiZppqomIOBm4t+lpSHjoqJjHKCfI99fo+EepeOdHKEcJWGe32Si4aGkIV4foCGmKOMe6ehi4WPj4SVgoaOmHdxhKqFjZGcj4eenYaKmqigoKuDiY6Vm39+ipetqJCTp5B4cZ6Tg3uTcH+phnB9lXFqb3yBn4t/ko6LaG5dhIyMnJygj3OVjIhxdGuCdnSAWXJuhpCBfX6LaV1pY3qFg4iAX2l4e5x8g42DdoGHg2l5jIhrYnFzg3dfco2CipColodnjY+DbneLgm+Di3duZGZjeYJ6lVpcaWZudlt6eHd0bXNygmZcbYpra2JaWV1ZWGtxW15gWV5dZnJ9enRvdGNqaml7fHJ6d3RkbXRobHt+dXp8e3l5f4B/cIaKhHt9c356cn9oVFxyaWx2cHVna2dkXWFZamhranFybVdbZW5sZ3J5b2hqbWCMjKuxoZCjoZqfnpiemamjoX2ClquMnpSHmqGQpJR/e5iEfJKZiIiGhopyfYCLdoWLgYSWinJvgHKZh4R+koOEhoqBeoCEi5qfj4KmoId4jZeIlYuLnJeEg3qsgZCXmZOJnZyGh6Grn6Kio4uIk5udo5mWqqKop6GTnImYkHx5j4+FqH5+kpGSk5yxpZqUnZCNsZKYhKaMjJacoIqRnIOJkoprfI52d2WChpCKfImdhIeLj4eIgIWEkHd8e3Wbo4mIi5+LhpV/fo2CgXZxdIaFf3iJiIuRp5GEh46Ig4yQi3uFiYeNgHVrgYN7eZlpcmhgdIpwfXp3dm92c4FdXW+HZ25fX1pbXFJncVVjW1thbGh0e3xybnBkamlof3tteH5waG9wbGaAe3KBgHd/fX+Ee22DjIZ8enh8fnqDeE5kdmpzbnF7ZWtlYmJgW3NmcGZycWxVXWx0bWh4enBnaWtljYieup+WoqGYlZmYlJikoJ17f5ipjZ6MhZ+cip2WfHiUgnuOmYmGg4SHbXiBgHKAh32Hk4Rta356l4eEg5B+gIaEhn2Hg42bnZGGqZ6CcYqPhZKRi5yRfY16qYONkZeVjpyWhYWbpqCimp2GhJOamZmQmaagpp6ekJeCk4t4fYiPhaZ8fI+QkYWYqqCck5yPjaqNkYCejYmUmp+Dj5h/h46DcHiGcXRhfoSPhnWMmICCjoKGhH6FhJVueXZ1lKOMjoabhYWOdYCLfX1zc3yJhHt5jY+Fk6iQh4SPgoOKiYl1hIaHiXtuan1/e21oa2xnXnl+Z3x7dnR1dXp3XGBwfW11YGNaW15RZm1TZVpdYWtpdXp+cGttY2tpZ4B/a3J/a2pzbnhug3luhoB2goB9hXZygo2Hfnt6fIB7gotgaXtrdWhpg2VqY2BpW2N1aG9idW1rVGJxeWVveXpyZWptbYuKn7iaoaSfk5GWl4uan56de3ecpZCbiYaklIqYmXh5jYV8iZGDjIKCgmx7f3hygIR8iZB8a2h9gpeJgYiOfH6GhId8j4CPm5uQh6acf3CLioyShqChioWMfKeRiI+SlpOWknaMo6ChnZaaf4KRmpmTjZqioqSbmJGcf4+GeoGFj4ihgH6MjY98l6SgoJKZkJCmjI+BnJKKk5ecfpOTfoeOgXZ0gnB2YH2AjodyipZ8h4pxjH6ChYaPaHhyeY2Zk5CAmH+JjHOCiH19cnp8jIV7e5KOhJemlIyGkXyFhoeFdIGChoZ5ZHF6fnh5cGxqZl59c2h8dXVzfHN/al5gdHZwd2RjWF1eUmpoVGRYXmFoanZ4gXFma2NsaGV/gGptfWdtcGp9d4V6a4uBcoGBfYF0doKMhn98eoCBfX+PanKDbnRpYohpbGJfcVV0b21uYHhobFdqdHZidXp7cWJrb3mJjZ+zkqWlnY6QmI+GnaCanHx1o5+Nl3+MoYqImpV4e4aHfoOJfoiCgX9wfnp0dYKEfYiQd2djfYaXi4KKjXh9gI2DeZaAlZeVjZWfmn1vi4GQk4alm4eMiYOmlYSSipWXkpF2kJ2hoZiUmHqAj5iXj5eanaSemZOUnHuRh4R4hpeOnn6Cio6Mc5einqCSmI6PooyLg5iZhJOWmn+YjXyJjYF3cn5ue2SAfIuGcIaTgI+Ba4eDgYCJhWZ2b32Ik5mOfpR5jIl9gIh9fHKAeYqGeoWSioyZo5eDhIx3iISCgXZ6gIeEdF93d3xzfXdma2NgfmlqdnN0dX1xfGNjYXNudXJtYVlfXVprZFJiV19gaWx1eYZwY2pjbGZofINraHRobG9of3yBeG2PhnGAgoJ/dHyDjIGAfnqCg358kG11iXR0bWWKbGphY3VWg2lwbmB4Z2xhanZwZnl7eXFfcWyFhZCdrpinqJ6OjZeHhZ+Tlph9dqibiZh5lpyLjJiPeHuAi318g3uAgoF4c3h5c32Ag3+IioBkXn2LlYh+hYh0fX6Kf36YhJaTloyjoJd+cYd7k5GKpo+MjoqSoJGDkY+Tl5CKgI6XoJuSkJJ0gY6SlImdnZ6nmZiOlZh1j5CLbYaZkJl7h4iQiW+XnZqik5SKjZ6MhoGTnX+TkpaHmol8ioqBenJ6a3Vse3+Lfm6FkoOTd2+ChH5+i4Blc2p9gZeYhYCOdJGJhHqIfnZ4gX6HgX2EjoaNlaWReYWCdImHfX9ydH+GgmxgenR5cHxvYW5iZHthbm92c3d3c3NhdmBvbHVub11bXl1dal1PXVdiYWhtc3qJa19qZWpjaHeIbWZsaGlsZ4B8endvj4dzgIOEfXSBhol6g316gYR9fY5yeYt5eG5sh2toX2pyY4docW9ldmdtbGF6aGt8e3hwYXdti4GZmqqhpKmeioqRhoqeipWXfXasl4yWfJ6TkZaUiHZ9e4p8e4B2d3+Ab3Rzem+FfYGAiX58YVx+j5GGgISEc3qAhnqPkYeRkZuSpJqTgXyBfI2KkqOIjYqNl5qNhZGYk5WOiIiLkp2UkY2NboSQj5GJnpmioZeXiZeScIubhWeHmo+UeomFkIpwlpqToZKSiIuZjIJ/kZ59ko+TjJqPe4qFh3RzdmtxbnV8i3RuhpGOknF0gHyCgoh8ZXFten6blH6FinWRi4F0iXpvgX+CiH2FjYqGjpaqjnuIfX6LhXd9cG5/hIJiZ3dzdG56Yl5wYWp0XnBqenh4bHJwZXldbWxzbXNYWl1fYWpaT1dXZGNmcXF/iGVdaWhnYmdxjW5kaWdlaWeAend1b46Ec4GBg3x1goiFeIV8d4OFeoCKd3+Le3tyeYNqal9xaXN/a3FubXFnb2tle2Juf3l2cGt2d4l/o5iiqKGnm4iMioGPnIaTnHSAqZSRjYagjJWTkH9ze3aFd3h/cnN7hWtyb3ltiXZ/gIZucVtZfpKNiICBgXZ1gH9/oIaPipGcl6CTlneJfoCMiJydiY+GkpeWhYiUmI+Wi4uMjYydi4+RhG6Ji4+RipyWoZyYloaYiWyGpYVnh56KkX6MhIyBd5OYkZ2RkIiJlI1+fpCYfJGNkI6akn2LgINvdnBsbW9we4Zpc4OOmIpwd4B1gomDeWdzb3aCm499ioV7lZJ6d4p1cYp8h417i4eFio+cpIl8hHaBi4B3eG1pf4F/XHFycW9veFpecGFval5vaXx6cG1tam13YHBva3FtWVhgYWFtV1FTWWVmYnVwhIJiXWttZGNma5JtYGZmX2drgXRxcnCLgHR/goB5doCLgHmGf3eHhnaDhXuHjIB7dop/anFjfWOFfG9wbHRqaG5sdndfcX55e3R1c3+CfqWVmq2fp5aFjIN+lpSDj550iZ+TkoWKmoyVjYt6cnd0gnByhXNxdYhsbmx1bYh3g31/bW5VUYGrlIeCeYB2coJ5gqCCkYGSkZebkZl3kHqCjJKkmpOOiJWYkoOGlpiLk4uIjo+InoWRi31zi4WIj4icmZ+blpWAlIBph56JaIehiJKEkYSKcYORl4+ajo+Mi4+Nd3uTkHuOi42Sl418iHyBa3dqbmtsbXp/Ynl+jpaBdnqBd4ONfHpodW11iJaMf4mHe5SRcnqFcXiOe4uNe4l+hI6Rn5+GfX14gYt9d3Boa4CBd153b21rcXJVXm9icWFfbW55cGdwZmZ0dWhxbGF3ZV1WZWBgclNQTltlZFx4cIh8XlxpcWJiZWaRaV9nZFtnb35va3Fzin12fYWAdXZ/jHl7hoB4iINzhoV+jIyEfHmVeGZxa4Rgh35vb2t6YGltdH90X3R8eIZ3c3OFfHmhkJqxnKWOgop/gpmIgIudfoqYko6EiJeOjo6EdnR2c4Bwb4VzcHGDb2ppdW2Cbn18bXVzUk6C38mS1pN8b3SDdYOfgpF2lJCYm4+Ye5NyhZCfoZOTkImSm5OFfZWVh4yNh5KNiZx/joF4eox/iIyKnJucm5aUeo53aYqTiW2JpIWTiJiDhmOMkZiNlImWi42Ji3B6lYl8jomLk5GKeoV8f218ZXNva2x6eVyAeY+OgHt9fn+Gjnt6aXVrdIyQioOGhn2WjWx/f3CBjYCOiX6Ee4ORlpubi313eIKQeXNsZW9+gmtpdG9naHNtU15uZHBaX2tyeWdra2JneHNvcWRfd2BhVmtfXnZPTUtgZWNceXGKdFxbZXVgYWVljmNgZmJYaXJzbWtxdot8dHmGgnZ3fotzf4Z/e4l/comHgZGKiH1+mXZlc259ZYh/b3BrgFprbnl5c2B2enuNdnJ3ind5n4ybr5ugkIKFeIiUfnyJnIeEnpCOhYyXhJOOh4F0d3B5cG6Eb21ufnJjZHhwfG56fGpobGOkmsHcru+ic2t1g3WEoYWRbpWPlJ+UmoGRcIWLo5eJjpWKkJ2Vg4CUj4SIj4CSioqXfod7dX+JeIaFjpual5mPkHaLd3CIiox+jKWFk4qdhYZei5SXiY6IjouKhIlsfJeCfYiFipGPhnaFfn5rfWN4dGpveHNYiHqRh4V6f3+AhYx+emZ0aoGLj4uEhICMmIZsgndviZKDkYV/gnuBkZeTmZF1dHiGjXZzcWZ0eIFhc21vYWh1ZlJgcGdrVV5tdHphcmNgaX1xcm5bY3JhY1duWlx3TU1MY2VhXXZzim1bXGR4XmBkZoRfY2NeWWlya25rcneLfXN3hIF4eHyJcYOEfX2Ie3SLiIiVh4x/f5hzaHVxeW2Me250cIBXcHl2eXFkdniGjGl2gIpygJ2Imaeco5KEfHCMlHh5ip2DhJ+NjnyVjYCZh4R7cndwc2pvgWtpbHx0XmB4dntwdHpnYGV869q1ycPciXNsc4B2ipqIjWmXj46clJKBiHCFiKCOhIqVioyXk3yNkoiCiI96kYuGj4KAd3iDhHKHgpOblpSYho12h39xhoOKiJujhJWNn4SJYYOVj4WIhomMh4CHaH2Uf32ChYmOjoJxhn5/cndndnJpdHdsWox9koKFfYCDgISKgnZidW2KgpGMg3+Ak5J+boNteoiRiJOFfYJ+gZOUkZeJb3J6jIZ1bHBqcXd/XnNoblxpdV9SZHFoZlNfb3d1YG9gXWiCcXJqV2dpY2lYbVdbdUxKTGVmXmFyc4VoW1xleV5eZGd6YWRfXVlrbmVuanR3in5zcoF+e3Z6h3SFg3x/h3d2ioWPmIKNgnuTdmx3dnl4k3VueHp9WHmFcYBvZ3h2kYJkdoaFcYqWhpmhm6KKhnNvkotydo6bfYmZiIl7n3+EmX+BeHF0bm9kcn5oZmx3d1tfeHt6cXF/aWFnYX/Vto6Rp3hucXd7cZKQjYdqmI2Im5GLhntoh4uZhoGSkIaGl417jIyAgImNe5CNfomFenV7g3txhoCVmY6SlIKJdYSIeISAjJWeoIeWkKB/iGF/k4eDh4OJjX9/gmZ9kYB+f4KMj5B/bYN8gnRrbXd1dHd2a2ONgY5/hH98hH+FiH5wYHRyhn2QjoN9gJKKenGEZ3uFjIiNhHyFf4GVkJGThW9weYt/dG1uaWp4fGFnaWlYa3VaUmlyaWJQYnJ5bWJlXlpqg25zYlxnX2VtX25UWm9OSE5mZFxmbnKAa1pbY3NfXGNsd2RlXV1abGxibWpzdoaAcW9/fH10eIZ4hYN8gId1eYmBkpV8iYZ2iYFweHl7hJNvbXuAdl6Df3SBbWl6c5RzZ3KIfXKSkYSan5ughoZ1dZR+bXaTl32HkIOKjZl8jJp2fnZxb2xqYXR8Z2JpdXlaYHd7eW1xfmVjaGhXnY9fcnOXvMSEdnGUiJB+cpaLhpuSjIdyaoiPloB7lIyBhJqMfIqFfHuJi3+UiHWJhnZ3fYFydYaBnpSFlI+Dg3KAinaFfIqanpmHlY+dgYlmfZOCfoSDiYlygX1mfox8eX9/h4uPfWmAfYN2Zm95eHN3c2xrjoWKgYqAeIKBhYN/a19zeXt+jouGfIKQgX5zgml6hImMhoV5hH2CmY6RjH5ubXuIfXZzbmdme3ViW3BiV25xU1Nuc2hhTmZ0eWZgXl1Zb4Bvc1llYl1qbmBwT1lrUURTZ2Baam5tfG5ZW15tY1pib3dkZ1xdYGtpY2xqc3aBg3Btf3x/dHWDeoOCfIGFdn6IgZaQeISLdIGIcnl5fo2Qb297gHFpgXh6fm1se3WVa2p4hHRsk42Fn5igmYSIbn2Mdmp4l45+gImClJeJeY+Wb3pzcGxpZGBzemhfZXF6WmByfHlncXphZWWPsbJ3S2JapdrQlnF7kIqQeH2TioSYkYyFbmuFkpF6eZKGgYSYinyGf3h3iYqEloBvi4hxdX56anmFg6WQhJONg39vf4R3hHmHnZqVjJSRlYWIcHuSgnyCg4iDboF3aICEeHJ/gIOKh3xlfX+EdWNwc4BpeXBvdZmNhoOKfHZ4gIV6gWpccn9zgomGin6HinuJcoJucoWIj4aGc4R6gpqOjoR4bm9+hH92eWRnaXtwXlh2WlhwbE5XcXNnYEtsdnVhXlxaWXR9c29XZ11manJgb05XaFI/WWZeWnBraHpxW1pZa2VaY3F5X2hcXmVsaGVraXF3f4hvbH9+gHVvgnuAgn+Cf3aBhYiXinGCjXF7hnx6eYSTjHVqen9rb350f31vcnt6k3BvgX94Z5KLg6GZnJKChWaGg29neZWIfX6EgZiJgXyNjGl4cmtrZl9gb3ltX2JveFxka4J6YXF2X2Vl1Oq9izI6PouOf3F4hYiOjXaDlox+ko2Mf21shY2MdXyPf4WBlYh8gnhudoeEg5d3boiFbHV7dGZ5goOni4KOi4R+boB1d4V6iJ6RjZGTk46Lh397koZ3foOMgmt/cmiAfnhtfHyBioN3YXmEgnJkcWh+bnVxdYKbi4B/hYBzdX6Bc4FvXG5/dXmLhIt7h4F9iXl7cm2JhJGFjHOCeoCXjIt/dG1rd4CAdHRcaGd2b1dWe1JZcGRMWnJyZVtJcXhvXFtbWV10fnRoWWJbZ2ZuY2lNV2ZRPV5lXF11ZV90b1pZVG9kWWRxeVpoXV9mbWdpa2lwd32ObWmChH55boB8fIF/gnp1goGNk4RwgItud32Ae3uIk4l/aHt9anN7coZ7c3d+f4x6eIR9fGyMjYSbnZaMgIBsjX1raH6Ni3p+foOTgn59iohrdXFnaGJbYmdzb19ha3NgaHCIemJzdF5jZJugj25cNVqvtXRpgIh8koZ1hZaGc46KiXZwbIWDh3V5iXiJfJOIen5yZ3WJfn6Yb3GGfmh2eW5meYeEpIeAhoyJfm5/doCCfo2aiIOVkpmKi4WJfI+IcHp9hHtofmxqgHt6anp3goeAcmB2gX9yZHJndoJtdXuGlZGBfIKBb3d6fHV/bVlwgHd1jIOHeIh2g4l7eXRvioGRgoZzf35/lImJem9uam6CgXRuXWdkcnBQWnpNW29cT1xyb2RVS3N4aVdZWVphcYB0YF1dYGdkaGlmTlpoTUBgY1tgdmFcdGxYV1N0YVpkb3JXal5iaGtnbWxocHd8k2xohIp8fHB/fnuBf4J6d4B/iouDcXuIb3F3g397io2Pg2p+e213eHaKd3x4gIKHf4N+fnpthIyImKONhIN6dYt4a2yDh5B4fXqBkYCAfoqDcHJxY2ZeWWZfb29fYGdwZmpviXRhdG9bYWRqdnuAv5ympMi4cYWDcpJ8eIaTg3OQi4dxcm+De4N0dId0iHeUiHl5cGN3h3qAk2lyhHZnd3VjanyCiJ2Bf3+Oj31zgHSFeoGSkIN6l4+WkIiCiHuIiGt4eX50Z3poa395c2l6doCDfWhgd4d+a2p0aHuAaXaBjJGUfnp+fnB8dnx0f2JWeH5zc4uFgn2EcYeKeHlxcYSDjoB/en59do+Gg3ZpcWltiIFxb11nYXFtSWR1S11tVVRac25iUU90eGFSWFhdYW+Cc1thXWhlZWRrZFFbcElDY2BbY3BeXHZnVVZVd15bZW5oVmteYWlnZW5uaHB3epNtaYiMeX1ye355goGBfHZ9g4iGg3B3hHJtd4KCfoqMk39wgHt3eXqBi3SDeH+BgYKEeoB1b36Ki5ueiH2FeneFe2d0hYyPeX5/e4iFg3aPgGdwbl9kXFhlWW1yYWBgcGxraIluYXRpWV5kboB3qdqqx4aHsnGJd2+MdXuGjoB6kol/dHN0fneAcHF/bYR0lIZ4dWtgeoJ5iY9mcYRwZ3ZuW218gJCTf4B5kZN+eXxuiHeCkoyFdZeLko+HhYZ7f4RsdHZ+bWd2ZG17dW1pd3Z/f3xhYniFemh1dWJ9e2d1ho6NlXt0gHZxgHt9bYBaV3V/cHaFiH+Bem2JhnR6bHaBhIV/fH55fHSLgn5zaHRlbouDbHNaaV50ZEdtbUtaYVdWVndtYlBSdHZYUFZYXmFxhG9cYGNtZGReb2NVXnJGQmVfXWZoXVt6YlFVXHVbWmdrYVZqX2BuZWZrcWhwdniOdGuOjXV+dnh+d4GDgXtzfYOIh4NvcoB0cXV+hYKJjop7d4B4g3t8hYd4h3x9gX6EgHt+c3Z5jI6gjYl6iXZ0g3hefYWYi3iGg3SFhoR3iXpibm1cYltbYVZpc2NgW2dub2aHcWFxZlddY2x/fMrOh7mham1timxxhHF8g4l+e5GEeXhzeXV1e2psdmOEdZKCd29mXn2CeouKZXKCa2pxY1hteoWbiIKBc5eUeH99b4pyhIuMiHOYj5GJhouDe3l9cHBvfGZocWJteHFqa3F4fXx6XWV5gHdpdnhmgndndIeMjpR9codqb36BeW59XVlzf251gYt8gm9wioBxd2l4gIKAgnd+c3t1h317c2dzYW6LgWtyWGpedltHbWpMVlReU1V7a2FPVHVyUFFUV15idIVpXWBsamZjWW5hWWRwR0BnXGBmXl1We15PVWRwWltqaF1XaGBecmZrZ3FncHN3hnhulYp0f3p4fnmDh4B1cn+GhY6DcHB7eHZ1eoaFh4yGenx/dIt+fYaEhId/fn59h398eHZ4eJGTn3+MfIttdX94ZIKGlYVzkYpvhYWBeoN0Y25qWV9bXF1UZ3JkYFhkcXJmgXNia2VXW2Bqf3e+rnugtm5ic4Zoc3txeYGEe36Mfnd3cnZve3Zlam9gh3WOgXNqYl5/eHmLhGZxf2hra1pWb3eJo4GEf3GZk3KBeXaEb4KDkYh0lomNiIWJhX14dHFuaHhfamxfbXZqZ2preXd6dlpnfXx4ZXJ+boR0ZXWFjYaWf3CMZ2t6hHVudWJdcX1sdX2MfIJmdod9bnFpdn95f4Bzfm17fIJ7eXFmbGJtiX1sbldqX3ZVSmlqTlFOaE1Ye2hhTlV2a0xRVFVfZnWDZl5hcWhnYldpXVxsaEpEallhZFdZVXlZTVZtallda2RcWWVjXnRmbGRxZ3JwdYF4cJmFdn9+d398hYd9dXOCiICVg25zeXt6c3KFh4mIg3mBfnWPfnyEio6EgoR7fouDe3Z7d3eanZd6ioKGaXZ9e2yDhJJ/cY6BcIWCfoF/cGZsZ1hdW1xbU2RwZF5XYnJ1aXVwZWViV1xcaIBwb3KAc4lkZHh+aXR1c3KBg3eAhHl2c3Vua3pxYmdrZ4Z0jYNuZl1ffXB7iX9pbXlnamRVV3JvjaZ8hHt2lpF0fXN9e299fJGGeJp9iIaDhoN9dW9xbGd0XGxnXmx0ZGdlaXpve3JZZ4B2dWhwgXiCdmJ3hYt8lIFvjGpte4JxZ3NmYW56Z3N4i3x+YneDd2pscnZ7cXt6dH5nf3+AeXdvZGZiboV8bGtWaWJvUkpoak9LTm9HXntmYU1VdGNKTlNXYWp2fmVdZ3NpZmBWY1djcF1MS2pYY2FVVFVzVkxYdWRaXmtgXFpjZV92Z21icGlzb3J/dXSZgnd/gHd/f4aFen10goR+l4Vuc3R8enRxhIWPgYB6i3Z0kH98gZWOgIWEfX6Mhnt+gHZ7o6WKeYiGhGt1fHp1g4GLem6Ec3mEfYGDdW5qaGVWXVtaWlNibWRbWGFze2lobWlgYldfW2qAamtwgGdrYGh5eGpzdHNtg4B6f3x1dW56aGp5al9lbmiBdpCEZ2VYYndqfod7b2pwZ2ZdVVhvZ46od4F6fJGOeXZxf3B0d3qQgXmWdYaDgIWIdmpxdWdnbltsY11tcl9nYWp4aHttW26CcnRqb4F+endhd4WEeI+Fc4hyb3mAcmNxaVxxeGRydIl8eWN0gHFoanp1cm15eHZ5ZIR8f3l3cWRkY258fWtrVWhhZVJKbGdPR1FrRWF4Z2FNU3FdSk1UWmVrdnplX21xaWRdVmBWbm5XS1NoV2VeWE5VbFRKXHlfW19rXV1bY2VgeWhsYG9vdW5weHV6mH13gIF6gICHhnp4eYJ+gZOEcnV0f3l2dISIkX2AfJBrc5WAe4KfhX6HfYB/hoKAint2hKuff3qIiINrcoF5dYB/gXRuhm58gHOKgGpvbWRkWF9aWVpUYWpnW1pedIJpXm1sXGFXXFxsgWVydH1paVxrdnVnc3ZxbIR7fXx4dXJseWdpeGZdZXNoeneTgWNjVGVwZ4KFd3dnaWpgV1ZZZ2OPp29+d4CLjntxcn5oenB7jn14kHKEfX9/hm5kdXJkZ2dcamFcb29cZ19tdWR6aF10gG9ya3J8fnV2YnSFi3uIh4GAeHJ1f3VhcG1bcnRjcXOFfHVlc4BtYW17cGtqe3l2c2aGdnt7dnFlYmVtcn5qbFRoXVxUS3JiUEZWYUdid2dhS1RvV0pMWFhna3V6ZGVucWZkWlddWHZlVEpcYldnWFlJV2VQSGJ4Wl1fbFteXGFjXn5pal9udHhtcG52g5d5coGAfH+JjIZ+dXWGeYeMfXR2dYJ5enqCjI59foSJaXOWgXqKnX1+hXqBen98hohzcY+tjHt7h499ZXGHeXN8e3VyboVse35sj3picG9iZV1lVllZV2Nma19dXHKFaFhwblteWFpcbHtjcHd2bWJabHNzZ3R1b2yDeH6AeHdubnRkaXRlW2d1ZnZ2knlfXVJmZmqDgnR+YmRpXFRYXmJjj6RoeHSDhpB5bnB7aXlufIZ8dopzgXh8eH9oZHZsYGZfXmleXHNrWWVdb29iemVbd3xrbm5veHlzdWRzg5J+h4OJe3Zwcn5zYnhkXHBwYnFygn10Z3KAZV5ud2llaHp8dW5vgnV0fXRyYl9mbm59ZWlUZ1hXU013X1FKWVhIYnVkYUlUbVNKTVpXaWxxe2JsbHNjYlpaW2F3XFNMZF1YaVNXSFlgTUZpdVheYGxbW19iYlyEaWdhbnh5bG9qdoGQeG2DfoCBk4iEgXZziHSMhnRyd3aCd3x9foyQgH6TfnB3lYN8mZJ5gIB4en6AdIiDdHCZont6f4mUeGR1h3hzeHVrc25+a3h8cJFyXnBvYGdibFRaWldoY21mXFtxiWVTcm5bWlhYYGx2Y2l1amleWW1zcGxzc3NphHx/gHx2b25sZGlxY1trcmR1do5zW1dTZWFygH9ygl1iY11TWmBcY5GfZXJxhYSRdGxse25wcXt9fXKBeIBzenp6Y2V1aF1iWWBnWl52aFdiXW9oYXdgW3t2aWpybnhzcnVocYKVg4d+hHZzanF9bmZ3WF1sbmNyc4F6dGdvfltgcHJiYGtyfm1tdX9zcXhrcGFcZWxsemFnVGZUVlFQdVtRT1hRSGN0YmBGVWtQSVBaVWtranxlbW5xYltaWFlscVdSUGdXV2hTVEZZXE5IcnVYX2NtY1hgYGFdi2pjZG15eGtwaXV5hntrg31/hJp8goR5fIduj4Zxbnd6fXSCgnyLj4KCl3R3gpOFgZ+JdYGAgXR/gnGHgnVvopdze4aLhntld4pubXpuZndwemtzdnKMa150bmFnZWtSXVtVZ2Fsa1pccIxkT29uXVZYVWdpdGhidGVlXVltdG1vdXR4aoZ8f3yIdo9zZGRrbmFcbm1jc3iHa1pUVmNkeH19cYZdY19jVFpgWWOVlWNucIOFinRraHxwZnR4dX1tenV2b3p+dV5lcmNbXVZhY1hhdGVVX2BtZGFxXV1+cGhpc3F0cHV2a22Ek4GJe4Vxc2dvfnFzb1RcZ2tmcXSBd3NjbXZWYnJsW19wZ35mbXd+c3Nza21gWmRqandfZ1RkVFVQVG1XUVZTT0dkc19hRVhpT0hXVFZtaGR8aWt3a2JXXVVbdGRTUldpUllmVFNIWlpQTXh2Wl9lbGlZYmBeXo5uYWZreXVub2l2dn9/bIOAfYeXe4CHgYl+a5OIcmd0gHt1gIJ9iI5/i5NyfIqRhYefhnt/hoxzgYZzfoJ2bqWMcoGNi3Z3bXqMYGR7cGZ4cnhsbXF2gmdke2xjZmdoU19eVWdfbG5bXm2NaE5pbWBUVlNuZ3RrZXhkZFxYb3NscXp3cmyHe4B3nHp5a2FlbG1eYG9qZXF5fmdaVlhgbHh8e3CEX2JeZ1ZYX1dkm4hia3GBh314bGt5blx3c217anZ0b297gHJYaW1eWFxVYWJXZHBjU15haGFibFpgfmtma3N2b213d2xphYx/iXuIbXFmcX1uc25jWmFpaW90gnRzXmltU2VxZVVjb2N7ZHJ3fHdrcG1rYFlhZ2h0XWVWYVVSTlhlUk9cT09IZHBdY0ZZaU1JX0tYbWRfeGhufWRgVV9UXXVcVFNgZ09dYVVTSlxZUFl0dV1fZWxoWGNhW16NcWNnanhxc25odnR6g3KCg3qIjn58iYeNeW6QinRsc4J0f3+HhYaShJWPeX6Mj4eRm4SAfIyFc4CBc3R4cm+Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjIyMjIyMjY2NjY2Njo6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkpOTk5KTk5KSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjIyMjIyNjY2OjY6Ojo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJFtZmdnZ2dnfYWEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREFSzNrY2NjY3Itpbm5ubm9qZmdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMkWdfYGBgX155g4KCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1MkbY6ufn5+fri2JnZ2dnaGNfX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRjo2NjY2NjY+QkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFhpOUlJSUlJWNiYqKiomKiYiIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GSkpKSko2RkpGJh46KkJKSk4+Ojo2RiI+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ni4uLi4uMjI2NjY2NjY2NjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fH19fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCQh4mHhomFiJCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI2Eh4aFhYWHj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCRiYOFhYeEhoiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yOiIeGhoiDio+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjZCOjYyLjomOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoeNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYSEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuKioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f35/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjI2MjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dHZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaWhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3l2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0dHR3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycnR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA6Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnh5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo6Ozg5Ojg3Ojw5Nzg7Oz49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VzcXN4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw5Nzk6Ojk4OTo6Nzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXNydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYGBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PDw+Pz08PTs6PD09PTw8PDw7Ozo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXV1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/QkNDQD48PT9APz89Oz49PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXp7e31+f35+fn5+f39/f39/f3+Af4CAgICAgIGBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRUQ/PTs8QD46Ozo6OTc6PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fH5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgXZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/P0FBQUJBQD08PTs+PTo6Ojw6ODo4ODo7PT8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBe05JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0A/Pz9APT9APz0+QUA9Pj0/PT0+Q0Q/Ozw9PkA9PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRUNEQT9AQEA/PUBAPENjREBAQENAQD9AQD49PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkJDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAQUA+Oj49Pjw8R3tbPkNDRUA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUZGRkpOTktKSUdHSEtMSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREZIREA+PDs+QERFREBBRkJRZW5weXFFREREQ1d1homKflhHSEpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkhJR1VlYX6FhYWAelRBQVV0h4mHh4aHgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMS0tKXnqAg4OBfIN+Y05shIeGhoaHh4eHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJS0lJR0hJR0lJSUpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3V2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0tLS0tkf4F+g4F9hIJ7gIaFhISGhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkBBQ0NDQEFCRURCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhISUhLS2Z/fn2ChIOBgoSEhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5AOzk5OT09Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp8e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQENHSEtHaoCCgoKDgoKDgoOEhomKi4yLiomKi4yJVDs4NjU2NzY2NjU1NzYzNDY4Ojg3NjU2NTY3Nzc3ODo3Nzc4OTs3Njg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PUVCREVmgoKCgYODg4OChYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo6Ozo6PDg5ODk3Nzc3OTo5ODg3ODU4ODtBPT4+QkE/QUtMT1FQUU9PT1FXa3JydHR1d3p7e3t8fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc6QTo9Q1OBg4OEhISEhIaJioqIh4iIiIqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw7OTs8ODo6Ozo5OTk8Pzw9QUJESUpNS0pLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTk5OTo/PkE/WYSDhIWFhYaHiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQUI+QEJAQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQEA+P0E8Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHFxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PTo7Ozw7PT9DQkBnhYSFhIWEhomJiIiGhoaHiImKi4uKioqLiotePkRHSUtKSUZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREZFQUZFRkRGRkRAQj49QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4/Pz88QD5BQEVCTn6DhIWGhoaIiIiIh4aGhoeJioqLjI2MjIuKiohXR0xMTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGSEdFS0lLSUtLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5Nzw+Ozw7PkA/QT5BQERESENqhYKFhYeIiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUpIS0dFR0hISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDs8PTo/QD4/P0JDRkVMV36DhISFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpJSEZKSkVKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VucXV2d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af39/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo7ODw9Oz1BPT5AQkRGR1FvhIOEhIWFhoeIiIiIiIeGiIiIiIiJjIyLjIyLi4uLi15SUlBNTk1LSkdGQ0dKR0xKR0tPTEtKSk1NTE9QTkhJS0xPUVFQUU9PSklKSkxKTEZHSEdGR0lGRUVCQEJCXHByd3h5enl5eXp6e3x+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgIB/f39VRUNFRUdHRUQ7P0E7PTw5Pz09QEJHRkBFR0VKUXeGg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pFRUZLT05PV1ZRUE9RU1JOU1RPTVNMUFNVV1JTUlBMS01NTUtOR0dKRkZISkRERUVCRENjcXV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CPkJCRlZNREtMSU5SeoaDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7O1FTUmB1XVVWVFZZWVNZWFJaZlBVV1pdUlRXUVBOUlBQUFFLTEtHSElIRUZJSUlISWpzdnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQEVCQ0ZFREVMWFJMUlJQU1V6hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD9AVlVZXGRgVllicl5dV11aVkVRWVpcWV9UWWdSVVZYVFRWU09PTUpMSklJTE1LT01Tb3R2eHl4d3p6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Afn9+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1JWWFZYV3eFhIWFhYWGh4iHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUldWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eXh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0lJSUZCREBBOlBRUVdYUFBPUVNUU1ZXV1dZbYGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpbWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllab3N1d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWltSU1FPUlJRVVJVU1ZfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVFNUXlpYV1dXemtYWlxcXlNQUFBJTk9XVlhbWmRxdHZ2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gICAf3+Afn56eHd2c3V7f3+AgHRrfn5rcnleXFZVU1JPS0ZDREFNXoNsVlJTTk9RT1FWUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JRUU5LUlRRTU9ZUU1OUVNVVU1RU1JQTkxMSENJSFJTVFpdbXJ2dnVzc3d7ent7e317fX19fn19fX59fn9/f39/gH99fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVVRTElMSWFsknRQUVNOUVJRUltSU1JRUlVVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkNDQ0NCP0RQQ0NAQz5CSEdWQElOTUddaVFIRk9GREVGSEdIQkNIR0hKR0RCQUNAT1BNUmR0dXZ1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZWJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtsc3Z6e3h5dXJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPj46Oz5APz8+PmtRS2FFRkhJRUI/SE1NR01RVUpCRT8+PD08PT0/PT9BQ0I/Pzw9Qj5KTUZVb3V1dnN0dnh6fHp9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9enh6fHx4d3hkQkBAQT06QkNBQUNCXF1Pe05PT05LTE1PT1BMS0xXTklHQEI8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXV2dXZ3eXx8fH18fH19fn58fn19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlNWWFNSWVROWVpbV1lcX19gZWBdXnF3a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSUVFRkNNUlBhV1JYUVBTU1JVW09PUVZQTUlDRj46OTY1ODY5Nzk6MzY1Nzk1PEI9ZnR1dnd3eXl7fX18fHt8fX1+fnt+fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtUVFNQUVVPTFJTVFdYVFRYUUxXWVlWWFhWWFldV1dYaHNrXVZgdGthYV9dZGBfXllVUE1PTkxJR0pLSUhGQ1FQU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU5OEducnV4eHp7e31+fX18e318fn5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFdWVlNUVk9PVVZYWFlTVVRMS1NVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk5OTEpGUFBVWVNUTkpOT1RTVFxWUlVTU09NTElISEY/Pz06Nzg3NjU5OTY3NjY1V3FxdHd6ent8fX59fnx9fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVFNWVFJYWFlZWVJVT0pHT1BPT01SSk9QUFBOTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUVBOTk1QTlRSUFJMSUxLT1FQUVJTVFFTT0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+M0A+am9hUlJRQEZUUU9QUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PTw5PUc2Njc2RG5xdXd6fHt8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkM4RU5TXWdTUVNBR1VQT1JRUE1NTkxKTEtMTk9PUU1PT01ITEtJS0tMS0dGRkVEPEFBPjtARTs8ODlUcXN1eXt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT49PUFAQj0+RUhGREZGSUdLSkBGQUFARkhFSk9IUVJhXFFQUk5TT09QTExPTUtNTE1PTltWS01RT0dJSERJSkxMS0ZGRkQ/Q0M+PUJHP0I+QWRxdHd7ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPzs+QUBAPkFESUVDSEdJR0lFQkI/PjxDQkFHSURNT2FlUE1PTldLTE5LTE1NTExLTk5TZE5KTFJJSUlFQUlKTE1OS0dJRkJBQkA/RUZFSERMb3B3enp5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9HS0U/Qj05OTk6P0I/PEFCQkFEREdLRkRJSUdHSENDP0I/P0BBPkRFQ0tOUVRLSklNVEZJSUpMSktLSUpMTU9QUlBLR0NMR0NDSkpMTU9OSUpJR0NDQ0RJSk1MSVpzbXh5eHp7e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhlcUhLQ0ZISEdKS0lKTERHQj0+PTo6OjtBQj89QkJDQ0hGSkxKRUlJRkdHQ0M7QUBCPkBAQ0VDSU1PR0hLRkhLREhJS01ISkxISUpMSk1dUklIRE5HQkVLS05NUE5LTUpLRkdHSk1OUU5MY25pd3Z2e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRwRktDRkVHREVFRkVHQ0NAPTw9Ojs6OkBEQD5CQ0VFSUZKSkxGSUlHRkZDQjtCQ0M+QENDQ0VHTE5IS05IREhFSUxOTUdJTEdGRklJTE5LSkhFT0lDR01NTk1QTk9PTUxJSElPU1FSTlJmZ2Zyb3N4dXt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSUNFRkVCQkFFQERCPj8+Ojs7PTs9P0NBP0FDRkdKR0pJTEhHR0dGRUM/PUVFQj5BQ0NDRUdISUdNUElGRkdLTk9LRkhJRkVERElJSEtJRkhQS0RKTUxQTk9OT1BOSkpITVJVVVJPV2RhYW1ncHJvc3l6Z2VoaGNpbGdxbGZsbWdpa2xzbXB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0FAQUQ8QkE+QT06Oj0/Oz4/QEI/QEJFR0pGSkdJR0ZGRkVEQ0FBRkZDQkJCREVFR0dIRkxQTElPSkpMS0lGSEVGRURDSUhIS0pHS1JNQ09PTlFQT09OT09LS0tQVVdWVVRZYF9daWFtaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Bya2tzTUZHRUdBQkBDRDxBQUBDPDg5PT46Pz0/Qj9AQERGSEVIRkZIRkVFQ0NEQkRJRkNHRUFFR0VGRkdFSk1LSFFNSktISElFRkhIRUNJSUpLTUtQU05EUlNRUVJOT05OUE1MTlNXVldYVlheW11kYGhiamlna19kZWZjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEJCQkVFPEBDQkQ8Nzo9Pjs+OkBCPj8/Q0VGREZEREdFQ0VDREVGRkpFRUlHQkdIRkdGRUNGSkpHTUtMS0hKS0ZJSEpIRUtLTExOT1JUT0lUVVRRVFBRTU5RTk1RV1pWWllXWl5bWGFgYGBfaGVjYGRlZ2dqaGhqZmhubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3NzeU1ISEdJREJDSEU8QEVCRDw4Oj4+PDw9QkI8Pz5BQkZDRUJCSENDREVGRkdHSUZHS0hDSUhHSUdGREhLSUdLSU1LSktMSExKTUtJTkxOTk9SVVZPTFZWVFFUUlJMT1FQT1RZWllcWlpcX19eYGNeXGFja2JgZGdocoVoZ2pmam5ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0lLSEpFQkVHRTxAR0REQDk8PkA/Pj9DQjxAPkFBRkNFRENIREZERkZISEZIR0lLSkVKSEhLSEZGTEhISEpITUxMTExJTUtNTk1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXV5gYGFgYmVdZGBmZ2BlaGpjc3NmamhnbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBd3V1dXd2dXdzZ3Rya3Fya3J3b3dJSkxJS0dCRURFPEBGRERCOz8/QUBAQERBQEI/QUNIQkVERkhFSUVGRUlIRklISkxISEpKSUtKRkpLSElKSkdLS01NSkpNTE1OTk9MT1BSVVdWTk5UVlVTUlFQTU5UU1JXW15eX11eYGBhYWFgY2RlYmRpY2Rpamd2i2xraWhtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXRzcHN3dHV1d3Z1dXVlcXNrcHFqcnZwd0pMTExNR0NDQUQ8P0VFRUM9QUFDQkJDRUFDREFBRUdDR0dHRkVKRkRHSkdHSkZJTEhJSk1LTUxHS0lIS0tOUUtSUUxTTUtOTU5QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhX2BiX2BmYmFjaW5pY2loaG14dm1oaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnJxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHRUFARD4+REVGQz9DQUVDREZDQ0VHQ0JIRUJISUlISEtGREtKR0hKSElLR0pKTktOTElMSEpNS1pmSmRcS2xSSE9NX25VbHNbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZcbHRgbGtVX3d2aWpoaGZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPz1ERUZEQ0NCRUVERkJGRkdEREtFRUpMTEpMTUdHTkpISktHS0pJS0tOTE1NTExJTE1MW3NiZHBebGxVTU5lc15nZnFsbnRncGlfYVlubWJwcGJrampnb3F0ZXRub1xwdWdxTUtyeXZrYmFrZWVseG1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dHRibXVrcHBscnJxektMSUlHRUQ/QUI/PUJFR0JGQ0VERUVEQkhIR0RFS0hHS01NSk1MRkpOSEpLSklLSkpJSkxNTk1NTUtOTU1bcm9vbnBwbGtOUFFsWE1pYnRycGFtb3ZcWWxQW21tWnFta29teHh0c2lwXGBzbHFqVXV5eG9jXmtmYmdwcGppb3BwcnNwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEVFRUJBQj0/QEVHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5HTE5JTUtISk1JS0lKSk5PTk5NTE5NTFxoZHVdbHFXbE5PUW5VWmtea2x2YWxkdFRlY05sWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2hhZGl0eWtvbnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJRUVEQ0FCPEJAQkZDR0ZLR0VDQ0hLSEhGSkxLRk1LTFJSTEdNTUhOSklITkhKSkhITk9OTkxKTU1KWnNwcG9xcW1sT1FTb1lza2dvb3Fxb210Xm5YYXRfbm9wb3Fyb291c3R0altddGN3eHJqbnpoYWFjZmFiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dElLSEpDRUVFQEA+Q0NBRkNISU1IRkNGSkxJR0ZLTUxGT0pLV1JLR0tKSk5JSUpMSUtKSUhKTE1NTElLS0tTa2JaaV5famNyclpfWmtvYGVlVWtfY1thYlFgbWhcalxuaWlkW3BmZHBdWlxrW21xY3BzbGRnY2RnYGBrbnBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW52cXJ1dHdySUhGSkRFREZBQEFFRENHQkhKTEdGREdLTElFRkpOS0lPSUxbUUpGSEhLTUlISkpLS0lISkdLS0tLR0hKSkxMTEtJS0xOVFtdVFBVTVFQTk9PVVJQT1FPT1FKSk5QUWRxaVRZV1tbXFVZW11YXVxcY2ZhYWZiY2ZfXmZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNIQ0VHRkZBRUM/Q0dERUdDSUtMSEZER0tMSERHSFBLTE9LTFdNSUZFSElKSElLSExKSUZISEpHR0lFRktISUtOTElPXFdeT1xcYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXWFYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUFDREJESUVHR0ZLSktIRUVKSkpHRUhIUEpMTUpNUklIRUFIRkpJS0tJTEpJR0VKSEVGR0VFSkdCSU1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5fXF5TW15jX1pdYGNfWV9iW2BeW1RZWFpfXmRiYmFjZmlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JREJCQ0ZHRUdHSUpKSUlERktLS0ZGSUlOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlFRERFQkZKRD9JS0hOW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1FbX2FhXV5jYWBiYmJjY2VaUlhWVlxbXmNgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGQ0dFQkVHSEZHSElGR0pHSEZIS0lMRERKSk1NTExISkpISkc/R0ZOSktLTUtLS0lHSEREQERBSElBPkhJRk9dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RUV1fYWNjY2NiXGRjYmRjZlhRVlVTXFhbYV9eX2FhX2Rsa21qa2xudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUJASUZDRktJRkZHSUdHSkZGRklMSk5FREpKTE5KTElLSkhJR0JISFFNS0tPTUtLSUhIRUQ/RUJISEFARkVEVF1ZXlhfWF9bXVVYWFBdXVFLSldeWF5bXVZaYVJSX19iYmBgYmJgY2JiZGRiWE9SUlNcU1xeXV5eX19gZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIRFJLRkhISERGS0lNUEVHSUpLTkxMSUxLSUlHREhLUU9NTFBMTEtLSUlERUFFQ0hGQUBGRUJWVUVcVF5TVmBYTlRVTlpbTUpLVWBhW19YX15iXU9ZYlxgYF9iY2JdYmJXX19UUE9RUllTXlxcXV5fYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElSY1FEV19JR0dIREZNSlBQRkpJSktOTExLTUtKSkdFSU5RUU5PT01OTU5IS0FEQUNERkRCQURFQUxIQ0xMUE9PTUZNRkZISkhHTExNT1BJTE9QUFNQTFFTUlVaWVdZWFhkVk9TVFBQT05RVVRcWVlbXl5hYWVmY2hka2xxc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01eTUdIWU1HSEpIR05MUVFJTEpLS05NVU5PS0tMR0dLT1NTTlBPTk9PT0hLRmBFRF9MRGZjRE1bSF5cc21PTVZtWUxDUF9VbFdnSl1XVV5ETFFVTE1TVlFSVFhXVFhVVFxUUGZaaGhkWVRrVFhXVVtcXGBgYWJiYmBnaWdubGhyenx9foGEhISDg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1RKS0dgVEdKT0pJT01SUUtNS0xPUlVST09KTE1HSE1RW1lPUFBOT1BQSktRf1FJfFlZcnNXUG1IcW5vYVZQcXF0T0Jrc25xdHBTb19bblhdVlxYVWtoVV1WY1lgWVpfVlVXf2l0dXVfYXZfWWJcXGZbX2FhYWJeYGJnbXBsYHB3dHiBgYKDg4J/fX6Adnh6bXZ+dHh+gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0pMRlJWTExPSExSWFdRTk9PTVFUTk9RUEtLTkdNUFNbWlRRUk9QUFFLSVp4XVR4ZGhZUlNQdmd0bHBibmZrUnJOTHdtanJwc3JxcnBvcIBdZnp1eHFxenF+cn1rdX1iUmd8ZXNzb3NzfH1wfnlvf3JfYGBiYlthYGhrbmtibGZnbXd+gYCDfnt4d4B0dnpocn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tIS1FPTU5KTldeWVVMUVNOWVlMU1NSTkxPSVFSVFlXV1FUUFBRU0xIZ3hsY3hxbVpLTFR5cHVtdWJudlBkZUlldnFtd2+AamZ4eGlXclJpe21panp6fWx4en9wZ29YdXVqdnVwgGFzaH1pbHh8b19fX2NiXF9kZWZpamRnYmNkbGxwcHN0c3NzeXFyeGJsdGdyeXtzc3V5foFzdnpufH15eHJuTkpSdE5DQkVQUElLTEpMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBKU1RVWFdXUFVQT05TSktyb3V1cXVxZGhhVm5McXBeR2h5V3ZUS2h4fXhgeXtzbmFebW9kU2dydW5teXB3bHZzdHFsbVxzfXprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZWVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21MS1pWSEdFR1JQS0xOS0xRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTkpUVFZXWVdPU09PTlFJUm1IaXdLYGR2dVVXbE5ubHtyYWpnf3ZVS1draH1sbWx4YFtwentfYHpzY3JveHFoZHxpcntdVEtsX3Z1a2l1e3ttfnhrfHBdXl5iW15iZGVnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3Nya2htbXJ8a21oa3t0bW1rbU9HSktISkhIUlFNT1BNTFNTUk9TUldSVlRQV1pWVlRUVGFgUU9OS1RTU1FWVk9PTU5PUUpIUU5QVUxLS1JTUlJST1ZVUVFPUlJYWFFOUFVUWFhYW1tVU1NXW1dYV1pQU1VXV1hRXVhWXVVTT1hSVldXWFpgW2dyXltcW11dX2NaX2NjZWZkY2NiWmNjZ2ZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUElLS0xNS0pUUk1SUVBMVlVUUFRVWFVaVVJaXVZVVFdVWVhQT0xOV1RQTlVTTlBOTFFQS0pRUUtRTUpLT1FUUlFRU1JJSU1OT1FSUVFRVFZSWFdcV1NTUVFVVVZUWlFOU1FXVVRZVlRZVVNSVVNUVVhZWF5aX2FdXFtaXV1gY1xdYmJkZ2VkZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRjZmhRSktLTk9MTVRRT1RRUU1YV1VUVlhXV1pWVFxgVldWWVVYVFFQS09YU1BOVVFOUk5MU1BNTlVTTlFOTU5RU1BUUVNUVE5MTk9RVFRSUlFWV1VZWltZU1VSVFhXV1lbU09TVFdVVFlVVllUUlJXVVZYXFpbYF1WWV9dXl1cXWBhXltiYmNoZmVkYlhgYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl5dY2hrYWhmaGZkYGJkYlBLTUxQUUxPVFBQVFFPUVpZWFdZWlpYWVZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBRTk1RUU9SWFNRUU9NT1NVTldRVFRVT05OUVRVVVRUUlRYVlpdXFpWVlFSV1hWW1xWUFNVVVVWWVRXV1RSUlhWVltfW15gX1ZfXV5gXFxgYF9fWmJiZGhoZWRiWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9VXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTVBTUlVaVVNQUExQV1VRVlJTU1hNT1BRVFhVVVVTVVlYW15dXFtWUk9VVlVbW1ZRU1ZVVlhVU1haVFNRWVdXXF9bYF9gVmJcYGFeYGJfXGBdY2FjZ2llZmBaY2BhX19lZV9gY1taXFtcWlpZWVdcWVxbYF5gW15eYWBfY1xZYFpRTk9OVlFQVVNQVVRTUFdcXFxZXlxfV1xeanB3eYBjXFtWVllSTk9XU05RUVBSVFJMUVRTWVtXVU9STlNYVVNSVFJSWk9RU1NWW1ZWVlRWWlhdXlxcXlZTTlRWVltbVVFTVFZYWFJTWVxUUlJcWFpdXl1hYWBXYltjYl5hY19cYmFiX2RnaWRnXlxlYGFgYWNkX2JfWVpfW1xbWVhZV1daW1phXV1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQWl1eXVxgXGBVXF1oanJ9c2xoXFVZV1FPUltTUlFUUlRVVEtSVlVaWlpTT1NRVVVVU05WUlNaUlRVVFhdV1hYU1hcWF5dWVpdVVVOVlZXXlpYUVRUWFhYU1ZZXFRSVl1ZXV1hXmNjX1lgW2ViX2RkXl5jY2FeZWZpZWZdXmRhYWFiY2RfYl5YW19bXFtYWFhYV1taW2BdW1tcW1haW15WXlldUE9PUlpQW1VVV1ZUVFReXmBfXmJcYFVdXmJreXVtfWxaVVpWUVFUXFRUVFVUVllXTFJaVlxaXFJQVVNXVVVTT1dSU1dTV1VWW11YW1lVWl5YX15ZXFlSV1JZWFlfWVlTVVVaWVlVV1lcVVRaXVxeYGFgZWRdXl1dZWFiZmReX2RjYFxnZGhmZGJfZGFfYWBiYl9gXldZXlpcXFpZWldWXVpdXltaW1xbV1lcXVZYV11TT1BXWVBdVVZZV1dVWF9gYWFgY11gVV1eYmVldoJ7aFhZWlRWVFZcWFdXVlZXXVhPVVxZXl1dVFNYUldVU1JTWFJTVlRYWFhdXlhdW1VeX1hfX1hcVlFZVVlaWmFYXFVXV1paWlhZWlpXVl1eX15jYmJlZV1iXGBmYmVmZF9gZGJhW2ZjaGZjZmFmX19hYmFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOU1pXVFxVVldZV1ZcYGFhY2FjX19WW2BkYV96dW9oWlxaVlhWWFtaWVtZWFlgVk9UXVtgYVxVVVlQVFZUUlZWUlNVV1tbXF9eWl9cVl9fWl1eWV5WU1lYWVpdYlleVldaW1tbW1tZWlhZX19gYGRjZGVlYmRaYmZjZ2ZlXmFiYGNeY2NpZWRnX2deYmJjYWFgXl9YVFpaWltbWFxYWFxbWltXV1pYV1xbXGBdVl1dU09WWlZWWlZZVVhXWF5gYmFkYWRhXllZYWRiYGtmaF5cXVtXV1laXFxcX1tZW2JWU1deXWFjXFNWWVBWVVVVVlZTVVRYXV1fYGBdYV1XYF5bXlxbXlhWWFhbWl9fW19YWFxcXV1eW1pcV1pfYV5gZWRkZmZmYlljZmVoZ2ReY2BfZWNdZmlkZWhfZ15jYmNhYWBfX1tYWVtZWlpYWlhXW1xaW1dYWlRZXVxaYFxVXmJNUldZVldaWVtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX1xcXVhXW1tdXV9fXFpdY1hZWF1fY2RfUllZUFdWV1hXV1ZXVl1dXmFiYV9iXllhXV1eWV1eWVhVV1tbYF5cX1lZXV1eXmBcWlpZW19iX2JlZGVmZ2diWmRmZ2lnY19jXmBmZVppaWNmaWNmX2JiY2FgYF9dXVpYW1lZWFhaWVdaW1pZV1hWVVtdXV1gYGJieEtXV1xZV11cXF1aV1xdX2BiZGJjYV1gWGJjYmBjYWNeXFxdWFdbXV9dYF9dW2BkXFxYWmJlY2FSXFlPWFZZWllZV1paYF5hYmNgYWNfXGJdX11bX15ZWVRYXV1fX15fW1peXmBiYlxcV1tdYGJiY2VkZ2ZlZ2RcZWZoaWZjYWJcY2dgXGlpY2hpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldXWFBYWl1hY2Zmcmt/SllXXVtaX11cXlxZXVteX2JjYmFhXWJbYmRhX2NiYl1cW1tYWGpxYFxgX11cYWNfXllZY2VkYlRfWlFZV1xdXFtaW1tjYGNjY2BiZGFgY15gXF5fX1pYVltfXVxhYV9dW2BhYmViXlxTXF9gY2RkZmVnZmVmZV9mZmhoZ2RkYFtmZ15haGhiaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnV1dXV1dXV2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7e3t7e3p6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dXR1dXV1dHV2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t8e3t7e3x7enp7enp6enp6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHjF1NLS0tLUk3t9fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqHc3FycnJxb6nBvr6+vr7K09LS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19eNXn5OTk5OeZe39/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjIlyb29vb29sstDMzMzMzNvm5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12fn9/f39/gHl3d3d3d3d4eXl5enl6eG9vb29wcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHp6enp5eXl/g4KCgoKChISEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ0dHR0dHd1dnd6e3h7eHd2dnh4eXl5fXl4eHl4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3t7e3p5eXl5eXp6enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d3fHt7fHt9e3d3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3l+fHx9fX58d3h4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3e359fXx9fnx4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4e3x8fHt+e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXd4enp6eXx4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdlZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyPi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiMi4iKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiIaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35/f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKEhIKCgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWDhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBg4OBgIKDgYKFhYWFhoaHhoWGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqHgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SEg4KDhYOCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Qko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgoKDhIOCgoODg4KChISDg4OCg4SFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKCgoGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGBgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5+f4CBgYGCgYCCgoGCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAgoOCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgYGCgoSCgoOEgoOEhYaEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKRkZGOjYyHhYODg4GCgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoOFhYODg4SDhIODhISFhISEgoGAgYKDgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj42MioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgIGBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAgIKBgX+BgYCAgoGCgoKBgYKCgYCCgoKCgYKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYGCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJOSlJKPjYuHhISDg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4CAf4B/gIGAgH+HgoGBg4GAgYGChIOBgYGBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgYCAg4KCg4KBgpKMgoOEgoODg4KAgICCgoKCgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOEg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSCgYKGhoOCgX5/kZmGhYSEhYJ/fX19foKEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSEhoWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOCg4WIgn59fn2FnIyGhoOBfn9+fn5+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgoKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODiYqAgH6Fin+Tj4SBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaHhoaGhYSDhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4OEg4KKioOIgoOFgISEgH9/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eIiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aHh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4eFg4OFhIODg46JhoaLg3+AgIGCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiouLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQj5GOioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4eEhIWEg4OEkIeBgoKCgoKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SEgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYWIg4KCgoOCgoKDgX59fn5+fn5+fXx+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4eJiIODhIOFhISFhYaIh4aFg4KCg4WHhoeGhoSCgoOEgoODhIKBgYGBgYODhIOEkZKRjo+Oi4eEhoaDgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYeIi4qGhIaEgoaHgoGChIODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYKDhIWFhYODhYSEhISEhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+NkIyJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgYCAgoB+f4SEg4ODgoKAfX1/gICBf31+fn18fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4OAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGjJORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAgIGDgn9+fn5+fX2AhISCg4ODgX59fn+AgIGAfn19fX1+fXx6enp/goKBf39/f35/f4B+fYB/f4CAgX+AgIF/f3+BgX59fX+AgX9/foCAgH+AgICBf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn1+foCAf31/fn1+gIODg4KCgYF/fX1+foCAgH9+fX19fHt7e3p6enqAgIB+f35+fn1+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fn6Af4B/foF+foCChIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXuAgH9/f39+fX5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+f318fH2Fk5KNjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCg4GBgoCBg4SEgYGBgYCAfX19fn5+f359fX19fXx8fHt6enl5eX2BgICBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgoF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISDgoODg4KCgoKCgX5+fX19fn6AfX19fX19fX18e3p5eXl5eYCCgoKEg4CCg4GAgoCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGhoWFhoGAg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aGh4iHhoeHgH2AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYWEhYOCg4OCg4OCgoKCg4OCgpKQi4iIh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAf4CBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoaHh4aHh4Z/fX18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZeEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko6LiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgYCAgIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhISGhX99fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fH+Cg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4uKioyJiImHhYaFg4OCgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgYOBf319fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYKEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYKDgoOCgoGBgIB/gX5/fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+f36Agnx8f3+BgIKAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uTj4yLjY6NiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJGMjI2Oj4qFhoaFhISFg4OCgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYuNjo6Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f319fHx9fn18fX19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6Eko2Mi46Ni4qGhIWEhIODg4OCgoKDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+f399fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9e3p7e3uAhoWChIOCf4B+f4KCgn9/goJ/gIqPjIyLjYuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+AgIGBgH99gH9/fn9+fn9/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fXt/fnt7e3x8fH18e3t7e318enp9en6CfoGDhIKBgoGFhoWFhoaHhoKEkY6Mi4qLh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/fn5/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fHt+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7e317fX5+f4CAg4eJiYmLiYuJhYiRjouIiYeFhYOCgoOEhIODgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gX9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CBgH58enx9fX59fX5+jIZ9fX57e4OCfX5+fX18fX19fX1+fH18fXx9fX58fn19fX18e3t7fHt8fHt6e3t6enp7fn6ChYiHiIqLi4uJjJCOjYmIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImNj42LiIiFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx+f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI2MioqGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjYqLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYOBfn6AgH5+gH59fn6AgH+Bfn+Af39/f398f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIF9fH19fXx8e3x8e3t7fHt8fHx9fImKiIiFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x+iYWGhYaHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen19eXh1dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCGgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXR1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goR/g4KCgoOChIKBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dnR6hISBhISDhIWFhoSDg4WEgoODgoCBfn9/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4CDgX+Ag4J/f4B/gX+Af3x7e3p8e3yBgH+Cf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4KAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fX99f4B8f399fYGAgH59fYB/foGBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGEgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/goCAgYGAgYGCg4KBgX+Ag4B+goKEgICCgYKChIJ+e3t8fHx9fX1+fXp+fX14fn9/fHx8fn1+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDhIN/f359fn5+f4B/gIB/gYKBgH9+f4F+f4CCgoCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWDg4ODg4OCgYKDgoGDgn+Bf39/fn+AfX19fX+AgIB/f4B/fIB/f4GAgYCAf3yAf31+fn9/fX5+gIGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnF4eXJ4hYWFhYOEg4KChIKBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgX97gH6AgH+BgYB/fYB/fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fXt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYaFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf4CBgHyAf4B+f4GAf399gH9+f39+fX18gICAgYB+f35+fn18fn9+f358fYB/fn1+gIJ/foCAf36BhIKCg4WFgoJ+fXx7e3x8eXd7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp6enhzd3VxcXJweHdxe4WGhYWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAf4GBfX6Af35/gX+Af3+BgH+Af31+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+foCBf4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/f4CAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9+gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnqBk416fH18e315e3p6eHmBgXh5fHx8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoGAgYGCgYKBgYCAgIGAfn5/f4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9/fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiXx8fnt7fnl6e3p7jX53d3l8fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eHN0dW5zcXB4cnV6hYaDg4KDgoCAgIGCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBhIOAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICAgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYF/gICAgIGAgYGBgYGAgYCAgH9/gH5/fX59fn57fXx9fHx8d3h1eHh5e3x8fXt8fHx8fX5/f39/fn19foB/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgYKDgH+CgYWDg4SBgYOBgoKBgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9+gICAgICAf4CAgH+AgICAgICAf4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX94d3Z5eXp8fX18fHt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXRxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIKBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf31/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9gHp5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoKGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYKCgICAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+fn+BgYCAgIGBgYSEgH2Af39/f357e3p6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChIaEgoODg4SBhISAg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhIOEhYSFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3p7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fXyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChIWEhIOCg4SEgISFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fX19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4SEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fX19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoODgYOCf4KEg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDhISEhYSEhIWFhYWEg4OEf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoODhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OGgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSAf4GDf35+fH59fX+BgH9+fHx+f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOFhIKEg4aAgoWFiomEhIOEhYWDh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOFgX2BdYF5g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYKBhIOAf35+fn19gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIaEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8f3OCg3+Dg32BfX5+fX6Cg4F8f4B9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOGg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26AiHltfXJzdnN2bW14bHB5bHV9f399foGAgX1/fn2Af4B/fX18fH19fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4aFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gX9/fH99fIF+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoWFhIWGhoWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJioiFhIaGhYWDhYWEhYaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomJh4aEhoWGhoWGhoSGhoeGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhYaGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWDhoeGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fXt8fH1/fnx8fn2Af31+gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhIaEhYaGh4eFh4aJiIaGh4eIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhoOGhoWGhYWGhoWEg4WFg4WHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fH9+fX1+fXx9fH98fn58fYGAfXx8fXx8fH56e3t9foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhYaFhoeFhYaGhYSDhISDhIeDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX18fHx9fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhoaHhIKEg4SGhYeFhISDhISFhoaGhoaFh4WFh4WGhYeFhIOEg4OEh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1/fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGh4eGhoeHhYeGiIiHhoWHh4eGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWFhIWFhoaGhoaFhoaHhoeHhYOGhYOBg4KAg4WCg36BgYF/g4F/fn5/fX98fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeJhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhYSDhYWHhoeGhoWGhoaFhoaEg4WFgoGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiIeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKGhYaFh4aHhIaGhoaFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgn5+foB5en2Ag4OEh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEg4aFhoaGhoaEhYaGhYWGgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX5/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYOEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOFhIWDhYWBgYODfn5/gH9/gIN/fIB9fX+CfYCBfn6Bfn19fX1/e398e3p5enp5enp8eXp6e3t7fHp7e3t7fX59fYF9fXx8fYB/fXyGg4aGhoaGhISChYKFgYGAf3+AgH5/gIJ9fn9/foCAgYKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYaIhoWEhoeFh4WFgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhISDhIOFhICAgoJ+fX1/fn5/hH57f3x8gIF9gYB9fYN9fn59fX57fnt7enl7enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SEg4KGgoOAgYB+fn+AfX9/gXx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoOChIODgH+AgX59fH5+fH6Dfnx+fHyBgH6Cf31/gnx/fn19fHx8e3t6enp6eXt6enp5eXp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoSCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYSCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgoCFg4F/foB/fnx8fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRkw9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1dTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dTV1NXU1NTU1dTU1NTU1dXU0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8rKy8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX2Nzd3d3d3d3d3d3d3d3d3Nvc29vb29zb29vb29za09LT09PT09TU1NTU1NbW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubN4c3Nzc3Nzc3Nzc3Nzc3qCgYGBgYGBgYGBgYGAj9LS0tLS0tLT09PS09PT3OPi4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo4Nz5DPzg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uzr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6WZMikrKysrKysrKysrKyk1RUNDQ0RDQ0NEQ0NDP1zT09LS0tLS0tLS0tLS0eDs6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8NztAQz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzR0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmmzgvMDAwMDAwMDAwMDAvO0lISEhISEhISEhISENg0tPS0tLS0tLS0tLS0tHf6+rq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs/QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183N0NLS0tLS0tLS0dHR0dDc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampq6BFPT4+Pj4+Pj4+Pj4+PUhVVFRUVFVUVFRUVVVRatLT0tLS0tLS0tLS0tLS3+np6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI/Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc7Ozs7Ozs7Ozc3Nzc3Nzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Pz87Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRysrKysrKysrJycnJycnKy8vLy8vLy8vLy8vMzMzT1NTV1dXV1dXW1dbW1tjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7Ozs/Rzs7Q0s7P0tTV1NDPz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tjX19fX19fY19bX19fX1tfX19fX19fX19fX2NjX1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7OztHBp9HRuKDQ0ZyChIrGz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Pz8/RnY/Es5aYurqVuLmvodLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD9BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz8/Tuq+qvJ+jqLLRkn1+r7DSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/P05+xm7/Hh5q01dPNnp7D0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/P0cCciZq92qOYtdTTwKCg0M/Q0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9SjooGbwNehmLTT06+iqdTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NHEn4F7lqvYoZi009OjobrU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DVq6+8wM+T06GZtdTNnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2Ojs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49PTs7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmHf4WepNmimbXXw5+g0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocbT09WcmL/XoZqz2bKkptbS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDS0dLXqIfL1rGDxda5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0s/F1NHQw9TR0sLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLT1NLS0tXT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVLPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs6ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUZDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWh4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIN2dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpkbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXdwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tbW2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEJEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5ubm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZycm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXl1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVUYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcU19NSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKlqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKaioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq2mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Necl9oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmloYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t66pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloKGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbGh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLazurGqrrSxsLG0tba8vb68vL3Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqTlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGw8O5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsae8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzszLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbGhxeG95aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkJAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcndzeGZnXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQUNCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8nOyMHEwcfKysbKxczIzcbIxb/DwMvNz8nGw8PEwsS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamhdam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjHycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytp6q7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHGwcvLx8bMyc3FxsbDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldG5zYlxiVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHDxL+/vsTLyMrLyLy7yMfJzcjDyMnJxsXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu6vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cm9mZWdkamRham1ubl5YXFZVTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXCxsK+xsG5u8O6uLm8vsHGwca6ucnJw8XEwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZmNaWVlcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub26urS/uLW4s6+7vLfAt73Cv8G7v8G8u8W+u8HEwL6+ubzBwcu+vcnEwMDKwLHBv7u4u766tbezuLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5h31xY2BiYmdqZmZpZWldVlVTWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTk2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W6wbi+uL+8vbe1t7CuuLa5v7vAv7fBvLvDtrrIuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVrZ1hYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw5Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v728sq2vrLGwt7y2u7zAxLm3t7e1urm6u8C9w8C6xMK+x7i5uK23tbi6tLezu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD08Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72/u8S3tri2t7+/xLzCxcXHx8rJxs/CwbiutbW8vri7sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bndjZ2JcY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz0/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6qjsLm9vrO8vrzFuLK4ub3HycrDx8jGxsnIzM7RzMrEtbrAw8i/v7W/wL/Gxr/LxsO/wbzAw8zKx8XGwbm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYWFOSE0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS8w7y6ur68xL+3vb+9x8zGx8nGxr/ExMrIzMzNysbCw8vOwry5vbq5wMO/yMbEwcG/xcDKycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE+PkFCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy2ur3BvLu/tr/Bv7y/usDLwsfIwL+8vL/FwsfLyMHDwMDJysLAu7uwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrKvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem1zeHNncF1bXlxZUUVEQ01JQUU9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u726w7u3vbe5wLu6uLi1xcHCw7u5s7S6wb2/xsC5wLy+xcS9vrmysK64t7/Dx8PEvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbmlcX2BZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucHAt725uLm2tb+ztLK4sbvBwMO3t62wtbi4uMK6tLu3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6esr6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2VcWlVKPD8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8Ojs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7e6t7a2srTAtrK0uLO6wMHDubezsrK0sri+ubO1sry5vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnJsXmJgW11PSEE+PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27vLi2uraxwLq3ubi5u8HBxMO7u7a0tLC2urW0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJuY1xmWFxdUk5NQT5JQkBKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7GttrqurLyyuLm3u7+9ub7AtL+7vLq4vsK8wsrIvsC4uLaytLaytK+tu7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0tq+qsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEJGTUY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm9tbK4tLm6tbm7tbWztbu8wLu+wLS/ubm6sbrDvMLKxb+7vr+5tLSzsLGtsLm4try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Ojo6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSYnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PDw7OkA9PDw7Pz5CQEE/Pjk1ODs8RkJDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7Kyurq3t7W1vLOvtKu2urjAxMG6u7+9t7Kts7CvrK62trK0ta+qpJ6bnJyeqKieoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moqquepaObo5yVkIyPj5CTkJeVlpifnp6amaaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HT01MQk9RQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODs/QEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpayqqLWysbCur7KnprCkr661wbq1udXHtbO0q7K0rqqrr7Cys66lnpKYlI+YoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqmxo6WonqCclZOQj5GQmJCWlZiWn5ibmZujmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUlIR05STkpORztFQD0yPzc1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0FEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJiXlqGorK62t7q5ure3u66ooKGpoaCtq6qmqaSppKWupaystLy3rLnZs7utta+vs7Wqp62so5yZlI6RlpeZmZygoqKcnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWZlpuXl5ignpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeHlgYlJVX0hJSUtTVElSUEw5P0I2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5OcnqSorq2sq6uvqq+pnpeepZ2epaakoaKfpqCir6usrbWyt6a11JnBt7KxsbC4raehnJ2alJeampCOkZWRjI6OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrC0qbGvopmcnZ6hmZubmpiZm5SWm5aYnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVtTWllNUUpOTlVMUkxBNz5CNjg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKSnJihnaqip6Cep6Gln5ySnKKbn6Gjn52gn6Kgoq+vrLCxqqiqssmWpsiwrq2ssKegn6Kgl5GUm6CcmZeSk5+coaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuKyxtKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCepKGfnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUVVIRlVWSkJMRz1LSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk56ZqJ2unqeenKGenpqakpmenKGioKCdoaSunZ+prKOel4V7jJGxlIi1r6iqrKqloJ6ZkpKTmJiWlpWMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp5+ZpqCfn6eopaSenaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQlZNSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJqqoLGit6Owpp+enZ2XmJWZnpuco5+fnaOmzqObpaCJdoNzYmhrfYeDobOurqmrp6CenqGinZ+dmpyclJOVlJ6emJSFnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGw7zDvLezqbOtqrO0r7Ouqq6jnauntrGsoq+moaOvsa2wpKSvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cmtrdXJwaFdbUUVUSERJT0g+RUE0RUg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PDw7Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnp+hnZyYm5+gm6Cfn5eisNGrlI6IgWJxjmxiXWB4oLGvp6Sko6CepaumnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DDvsfGwrfDycnCwMW+ubS5urS7t7C1sqq6sa67t766uqq3rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSakZydn6Sep5+en6KdmJmUmJSIhH16cmtkaG94amVaW0ZLTEVEU0xEQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBs7K4p6Ghq6qinZ6hop6cm6CSnLrOooZuY4dfV4eIj4+csKqhmp2cn5+Zl5iYkoyPl5eTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdLTzNPQ09PMysLFxsfKx86/yNHMx8XGxMG7w8C+vr61vbOtv7/CwsbEx8SuvriyuLzEwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJRENANTU1ODpCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJujrJ2frqalsarFxszOzb+wwailqKytqqGdo5+cnZqpk5nGwpVrXGqXW1Rxm7CzraSfnaCbmJeUk5SWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rS19HX0tTW09PIzMfNzcnSzM7TzMXHycrBxcvGyMjFvsKys8jEy8rKzsXKv76/vcHHxMzMyMm/w7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi4B6cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkA8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbS4rK6jn6Sjn6CkrJqfz7SBWlx9kWuQrq6lnZ2doaWhnpqVlJaUin13cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dPU1NLP0cPQ09bY1dbSy8nO0cvGzdHJ0tXW2dXX09bYztLKz9HMztDM0s+/x8bKw8zMy87PxcbHtsDKv9HMy8/Fyce/w8LIzszP0M/NysjOuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZXJiXVJcSUpHQUVIST47QDg9NDU4NTs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXCxbG2qKKlpqGiq7WlpdKoalp1laOtrZyVmKCcm6Gin5ydmpaKd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M7P1dTU0dHM0M7T19bT1dDP0tPRydPRx9DY19jR2NLX2dXWzM/Pyc3Ry87Pv8XCx8XOzdHQ0cjLzMDKy8XTzsvOyMTJxsbIzMrT09HVz9LM0sG5xbGlqLWup5qorKWdsqiws6ysk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx8enFzdG1hY2ltX1ZQX0pKQ0ZDUU0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vrqqqq52mrrioq7fX1NXZ2dHO0MC8zMm3v6+nq6mjpLG1sa/NoVpkn62ropmWmJqbnaGdmpyek35yZWNiX19hYF9hYF9gYF9gZm1wcG5rb3J3d5vMwNLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cbR1MrQ1NXWztLQ2NjY18vIzcPIzszKy7/Jv8fIzc7Py9DNzsvOzsfKz9DKzsrCycbJzMrL0dLM09HRz9DKvci5sK67uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIenZvcG9rYWRucGFXXFpJRkZETVdFO0A8MzM8PTg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj09P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKefuLa1ta2lra6+tLDA2NLX2tzWz83LxNPQwsGxqq2uq6Wysba+zJdakKKclpOXnJ6fn52UlpiUiWteXl5hZGJgYGFhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dTLzNDR08rO0dXS1dXKwMrBxczCyMnCzMPFx8rKzsrNzNDN08vFyM/MyMfKxMbAxcrLzc/RxtDOzc3Mz8XHwLe4vcPDvcO5s7K+sbvDxLWqmKWimZaRlZWSi5SNmpGUlI+PlIKJhXhwcWttZ2BgcWhYWGhWTEZMSVBQQjtEPjs2Nzo4OTo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzY/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcXDwb+7tbKxx8K4y9XW2drb2MzNz8jW1cXDt7G1qqOtrLi3yc2XiJqOjZiVkJSSkZaWlpCMfGZiYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0sjLzs3G0dLPzszUysfLzs/Hx8/Sy9DPxbrEvsbJvcLHyc7EwcfAx83Hw8vKy8/Hw8PQyMbBxcfEvsDHy8vLzsLKy8jHzNDExce7x8PIyMLPwb28v7DByce5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3bnRka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL69us3Nx9DV1dna29jQys/Q0tTJxLm9vq+nt6q9uc7JoZSOjpePhoOEhIJ+hYV/dGBcXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+yMbCw8DDx8rJyMrIwcXMxsjLzcnEwsvJwcLL0MTLyL+5wbvFx72/xs/Lw7/Du8nGyLvIxsTKwL3By8bFxL7FvLy/w8TLxcS8wMnCxcfSxMDIv8rJxsfG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6GlmqOgm5R7dnN0ZmlaYW5tWltYUkRMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8y8/RzMfCw8fNz8/M1dDW2djZ0MzTzs/QysO3xsC1tbuwv7bSs5GMk5iHeoCFhoB2eHVycV9aW11gYGJkZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKwtrqysrOyscK8vLy6uMDBwcW+vbm9v7nEysXGwr3GwLi7xMm/wsm7t7u6xcO+vMHNw8a+vrXBvcO6vMa7wrmzvMXEwcK2v7W1vb+6y8O8tbrIur+9y8PBxcLFyMbIxtDGwszHssfJw87NwcXDwL2yt7Cyp6ioubClrbCrrayUeXZ3amRnYGhvY1ZeWUpGSkZISkFFQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8bDxMjO0svKysfNzs/SydHG1tTW2M7M0MfMyMrEvcnBsbS5trm0u5ONiouFeYCGhoB+hHx0dWRcXF1eYGBiY2FiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tLe0srO0urW+sbewta+yu8K8wcS8v7q1s7q+wLjHubS7tsDCvLi9xsHDu7Wusra6vrTEt7u1q7i9vb+9sLq2r7a6ssW8tq67v7S2tMW9vsPFwMPFxsjLxcDGxrvIy7/PysfDxsLDtsO9vba5vse/rLW6tbe2jnh0eGZnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzsjGyc7M0MzOyMvJy8rLxdHO09DPx8nFycTDv7zPvLK3u7i1tJuOh4mJe3l+hoZ3eIJ9dGheXV1dX2BfYGRhXmRlY19fXFteXF1eWltbXV9scG1oZmptbnJ8pMe/uLi1sKusp56iqqeeq6yzramrqbSttrCyqa6mrLK8urbDubq6sau1ubu0wrqwv7G9vLu2vMe5wratqqiwsb+1t7yvsKexs7S7vKuttaWutq66sbCquLCtu667uLu/v725wr/Hw8XBvMbByMu4xcfFv8bDw7nExsK7xsnMy7O5wry6sohydnZraWFibGhZWFdbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bGztLMw8bCxdDHzsLEx8DGxsTEy8LKy8HDwMa/uLq6ybazubqzsamRiY+QfHl+ioZ6e4WBd29eXVxdXV9gXl9kY2JjY2JgX11bW1paXVpaWlpcZG5vaGZnaWtucoGtubC1rqalp6eaoKSgmpylq66jp6KrqqyqsKSmn6qttbaxvbmvt6+orre0tLy4tLyvuLm0sbzBscCupaiiq7Gys6e8qquoq6yttLOlqK2hpK6psqWnqK2lqLessLK3ubq7sbu9vr7Ev7XBwMfIt7/AxLfEwr+7v8TCvsTIzMq/vsPAwKmGcnRyamldYW9kV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxdHQzcTIurrMwszAvMq4v8XAu8u5wsXEuLvBu7e1u8O2s7W2qa2Ug4mNgXx+gH54dH98c3dmX11cXV5fYF5fY2NhYmBgX15dXFpYWltbWVhaXF9ma2ZlZ2Voa29yhaqlrKagnKGllJ2km5iSoaOqo6KfpaWnpayfnZukpqyyr7a3p7Csp6q0qrS6sba1rba5sa+6ubG3pJ+jn6axp6uouaqkp6iop7KtoKemn5ukpayen6ekn6Cxra2ssrSytLC1vLa7wcGyur7DwbK5ucKzwL2/tbi7vb68wsfEwsO/v8Sgg3dwa2FmX2tvYFVZXkhOZ09UR0VKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3Nzg2NjY7Ojo7OTs7PDg1OTw6Pj5AO43ItbW9uLrAur21oJ6UnaGmurars7O7s8TQycvDx7m4ycLNwLnLubzHu7XHurXCxLG7w7mzrba9uKyvsamehIeHgn16dnRvbWtqanFpXmBdXFxcXmBfYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+Inamgl5WaoZabopiWjZ6hoqabn5+jpaGnnpuim5+qsK2xtaKpqqmrq6S0ua23sKyyta6yta6wqp+dnqOisqSmqbitoqamn6isqpmfoJ6ZnZ+lmpqjnJudr6mrp6qrrK2wsrivuLm7sLa7u7qrs7O5s720trGxtbS/tr3AvcPBuru9l4N6cmtfZV5kZFhUWF1JV1xLUEdJSUZBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfG0MjJwce8vMXEz7+7ybq6wbq0xLezvr+xv8G5qqaxtrOkrK2jiYaHgHlzbnBua2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrco2onZSUlJuYm6GWlpGcoaKonZudpaahpZygoJqYra6trrKgpaKtq6ahtLCxsayor7KnurOmtqGinpujoa2joam1qqKjpp2lpqOWmJ6XmZqdn5qXnZ2cnKyhq6ajpKatq7OzqrSwsqqyubSvqa+ysrO3s66prK6yuLC6trm9v7eysZSFeXVlXmVeW1lWU1pVS1tRTElFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7OdpaOYpbHCtba9rbS4ws3Ix8HGuMLByM+4wsa/tby8tcG5tby+s7i8t6ajrbato6uoln2EhYB5cHJ0cWlmZGhlY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhYWFhWV2FkZWNkZWRkaGp2opyUlI+Ulpefl5mUmJ+eoZyWoaGoo5+eqZyamqqmr7Crm6Ojt6qgn66otqmmp62wo7ewpLefopuYmKqmoZqsuLCioaScoqCgk5WhlJWWm5iXlpeclZ+pnamjoZ2jqqqwrqi0q6qmrbKwpaqusrGwsK6vpqensq6xtK+8tLq3rqOUgXl1ZF5hVllXU1JUS01eTFBLR0dMTEU8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunaeno6q7wL3Aua60uMLNycbDxL7HucnNtMPEw7C+vri+v7i9vbe3ubOko623oaKan4eAfXlyam1ydHBoaGVkZ2JcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1ZbY2NiYmNiY2RmaoGWk5WLkZSTm5mclpaboJyflaCfpqWkpqeenJ+ln6qvpp+io7aooKGiqLShpaekr6Wwray1nqCdlZSpoaKUrLGxnqKjnZ2Ym5OLoZSRk5eYkpeXmJadppumoaKZo6Wlq6SlsKelo6urraaorq+uq6iqqbOlpquvtLGuvLWxr6+gknp2cmRhXFpdWE5MUkhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G3rJ6kp623u7zBxbqxubXFysvBxMfHyLfHxbTEwciuubrAusC+v7u5tLayoqOtsZmbg5SIgHdvZGJnaWhmaGpnam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFdWU1RSVWBgX2BhX2BhY2RpgZOTiJCOlJKTnJSVlqOZoJacoKWhraWko6KjoZuqq6WZnqWxqaCgnaWrnqehnqytqaiuraKhopSXo5uckKqosJufop+el5mTip6RjZKTlZCYmJOboaKcpKChlaChpKabo6uloqSqpKuupa2yqaalpqa0pqmorbO1tLm6r6qsnotycG9gW1dWVlJHUU9IWlxPUklUS1NMRUdJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg2OTg5ODk7OUA5e7W0rbS7sq+rsa2dp6evubmzwMi6tcCvxsnNu8LLzci3y7+zwMbLr7S7xbm/xcG6u7O2saCmq6mXkoGMhHx1ampqbGhqbG1ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXl5eX19iZG2Oj4SRh5CRjpmTlJKcmqKcm6CnqKqoqqaopaOYpK6klJmlr6mfm5mboJ6vmZuqs5+lpp+jo6GUk5uWlpKpqq2anJ+hoJqUkIyZjouQjJKNlpWQnqGgo5ybopWboKKgmKKoo6Koq6Crr6Sut6WjpKKsraqoq66yt7K9tbOrr5iDc3NoW1hYUlVSRVhMUVtZTVVOUExQUUlOSUI8Pz9BPzw2NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zrqiztq6pp6+tm6morLe2rLzKu7a/rMzHxrnCz9DItca9ub7Fy7Ovu8O6wMLAur6vtKuhpamml4+AgXd4b25pbm5ucGhnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVUU05QUVlaWlpdXFxeX2Bkfo2Bi3+MkIqSjZeRl5mioJufqqmmrqqnr6OnmZ+soJWWpKinnZeQj5qerpaXp6qZn5yUpaGekpCTkpOVp6ulmpmZnZ2WjYyMlIaIjYOQi5KVkaCeoKOXlZ+VmqCinZObpaWnqKigsbCmsbynoKOstKqup7C0sLm1wLGtsauQfXFyYlZUVk5SSUdWUVJSTExYTUpMTlJHTUtBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjEtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s62msbeqpqKwq52qp6mysaS2xrS5urPLxrq7wsvRzLO4ur7AxMa0srW7sLi5wbq9ra+prKiqpZWYgmtnbW5yb3FrcGtkZmdlXlpZWllaWlpbWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY2HkIqYiZSUl5uZnaian6mlpKqdp5igpZuSj56impeWhYSSmqOPk6KclZaVh6KampOLjouQmqSnnJWVl5uQkoeUjoyBi42AkIqSkpKhmp+ilZSYmJWipZmMmKSmqKahoLSyp7O3oZ2it6ypraSysqa1u7Wrq7GjiHhxbF1OUVFMT0NNTk5QS0ZOTkpKTk1RSU1KQUdLSEdDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKiktLzEyNzc2Ojk5OTk4NDk4OEE3d7anpLawpKejqaWgqaWks6qissO1tbKzx8a4u8TKzce1r7u/t7rDsrGstKGqssC2t6mmp6+pqpmQn3lfYGdzcXZxam5pZWhoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFlYW11hb3N2cYWIgoiAkYOOipSRk52gj5qboqGjmKSWoZuVjYeYmoxzjYJ9jZeWhZCZkJOOjnuZjpyMgoqAiZifop6Qk5iWhI6Ck35+dImOepCHk5CQnZqZmpCVkJ2OoqOOiZqgoaOjm6K0r6yvrJ+ZpbimpbChsK6csLuqqa+qmYF2cmJVTVJPUE1DU05MUU1CUFFISU5TTUhKSkNKTEZLSzw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMTc2NDc4OTo6NjU6ODdBN3i3oqO0qKWmqKOmpaamprOnpbTBuK+0sMrFuLrBz8a/tK68w66wxrCrpaqUoau8tKyrm6Oop6WRjppvV1dgaGdpaGluY2ppZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVV1lbXWlscm1/hXx0Tlhyj4KXho2cl4uTkJ+XnZWUlpSOlol/k4lfO1dve4uUiYCLkoyPhYZzioSWgXmCeoWUnZSDlo6Qj4OGfZJ4cm+FjX6JgZGNj5eZmJOKj4mch56Xh4iWnpqhoJenr6mtqKiel62zoqatmKyrmKe0oqmto5J9cm1fW05TUlZMRFRKUE1MRk5PSUZMUU1LT0pJTVBGSUk8NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKCsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6mnoqmwqKe0wbmwtbDIw7i0vs/AurCwt8SqrcispaCbhZift6qjo5KhoJ+ckYmQZlFNUlZaWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbXBpe4J0UEJBf5WRkX2JlIyEio2ajZWVipKIhZWGeIh/YEpRbniKkYR9hI2JhX9/bn5/lHd1dXeEjZlwUY2Iiod8fniTdmh3hYd+ioiVio2QkZaLhIqIlISajIGEkpuWnpyUpKOoqaWknpuwqqGkpJClqpahqZyipqiIdGxlXltIUVFSTUlVTVNJTEtPSUhHSk5MTVRLUVFPRkhDPDc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykqKiw0ODMzOTc5Ojk5Ojo6Oj85d7aboqedn6Guoaeopaeor62qtry2uLezwry3qLrJubaoqba3rLS/qaCZkYGNl66dnpWJm5KUj4uFhmJNTE5OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4eBfIWMkoGSmYuPe4aPgHV/eHNudXB0jY2BeX2KqoV5emh2e45wcm14gYuMknh6gHuAdnNykndndYSEhIR7lYmIioyKgH+Ei4x/lIN7gI+YlZyVkZ+dqZ6foJ2gqaWfnZiMp6SToJ+Wnp6kf3JnYFxcSlZPUkdLWFJPSk1NUkpKSk1QSExRTFJUTUVIQTw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTk0Nzc5NTY3NTI1MjU3Mi8yLiwvLzIwMC8tKygoKS4xMzcyMTk4Nzk4Nzc1Ojw7N3aumKOhmJyftKmvqaWtrLCxqr20sru4tru1sqC3u7OrnZ6tqqqzsKOck5CXhJKhlJqIgJSGi4WBgn1iS0lJSEdGSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FSU1ZedYN9eWd3jZeYjo99Z3mBdniAiY98hJiSgXKHj3x2e29rfq18c5CKf3uGkoF9f3RmdnyGbG9oc3yJjIeAbHlxfXBtdY9xaHGAfo5wQ4qEgoOFf3d3eouFfYt6dX6Oko+YipKam6OWmZyanZ6inZaNiqWbj56XjpaYj3ZubGViWldXVFFKU1VUT1BOUVZLTktOT0pRTkhOT0tGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppefn5agpq+srqunqbGvsau8uKy7vrmzraibsaetnJCWnaaqpaKZm5GHlH2Mk5CSfXmHeIJ+e3t8YktGR0ZBQENESUxMTVFSUFFTVVRUVVZXV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWJ7eG58eYiQeXyLhW9tjJF4c3hqaoCCcpaRi4F9loBJkphuaHh+gmxpY2x5hZCShmtzbHxucnuGaG1wf3ONiYSFen1+e3ZvdHOFgnmBd3B8joyKlIOWl5iakJOVlpmXnpeMg4mfkYuSjYaQln5taG1ubldVV1RSUVlPUlVVU1hVTU5ITkpNTktDSE5HRUA6ODk7OTk6Pjw5PDs6Oj0+Ojg6Ozk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNDU2NzQ4NUhBODk1d5mRm5manqWtsKKsqqi1r66stL+rvMK/pqKalaWYno6FjJaiopmZkpWNdZB9g4mPjHp2fHJ7dnJ2eWRPRUdEQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplfnBtf3qLiXaBiIZ0bJqRdHN7amudj015hZKJhI5nMXaGc2x+foN0ZmV0foSEhYBmaWx1a3B/fGdwcHtuk42Oe3N9fHFwbnVtgn53eXRpeYmCiImDlpOSkIuNkZSUj5eOgHmIl4iGioaAkId2ampuZ2RXUVpXWVlbTVBVVllZTklIRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsKzU3NzU0NzhpTzg7NW6SiJmRmpakqK6esp+muq6rsrDCsbvDx5uWj5WZi42GeoWRmZWOkY2RiHOIhHeKj4t+dXZ0dnVtd3FnVUZJRD88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7OgcXx4bX1scoOBhYF6hIaGeXKglXR4gHN1lIc1cZ2onY6hoYSihHZwhnyHfHOMrY2JgGhmYmlucm1wg3Vpb1h1cI6aknZsf3t9bXFtcIB6c3ZtYnaEf4aAhZCRiouKkouRjIuPg3V4i4+AfoOBfo96cXBva15aXF1bWVhgX1NOW1pZWExISkVKRz9DQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnqSnnq+VpbWprbGuwbK7wcaXkIyUkIGJfW6CkZKJhIuIj4d2g4Vul4qMf3l6e3F7c3xqbl5KUEc+QDc0NDg7Ozw9PkBCRUlMTExNTlBRU1VVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx9hYN/jH52opl5foaBhZmEm5xhhqqfnYqCkI16doh+iYiOc4qXj4N7XGRxdHp7d4psZ2lheW+Fj4J6boF3dIR6cHR5d2tuaV13h32HfIiHj4CLk5eDjYWNh31xhH+EfHV3e32JdW9yc2VmX1taXVNbZl5XUVVYXFZHSkpES0c/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XI14ioCUjJKdnZ+mkaCroLGor8CxusW6lo6RlIh6hXZrgIySg36LhI+NeYOCdKKGjX9/goFzg4B8a3lsU1dMQEUyMTEyNjc2ODg6PD9CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHF8j4x6fImGfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSRqIeAmJiKnHNsfIGGh32OaGZneH5uhYaChXGEhUdrgHdyeXZobWtfdn2DiH+IhYx6lZ6ciouIkX97dYt2fHdtb3d+f3JycWpaXFxbY2NYZ2VcVVBQV1lQRExLRk5JQ0ZDQ0FAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY3NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6FdHx+ioWIkY+WmJKXoJ2soaa4r7O9s5eNkouYi310cH+Jk399jIOTlX2Gf4eliImBg4iGeYiLf3WGeV9jVktCNjAuLzIzMTIzNjY4Oj0/P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/OTQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgYSChZGTfoWJkYGalYKhoZeVm5qlrZOau7Gnu8fDqIuMoaWOk4mBkHtyg52fkZx+doWFio+HkGlob4OAdIyGhItxhoJ3h4B7doV9bnZ1Z4CUj4aJiIeIh6GropaJjph/e4KJenpvZ2t4fXh8cWljXVpZXWlcYWZfWk9MTlhSUUlQS0ROR0NLRENBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudXBneIN7gIyAgZCPi5qapJyhrKarr7CXkZGEoZSEeHeAjZR9f5KGk5Z/ioCSm46EgYKMi4KKjoSAioBscGpdQ0E0LS0vLy4vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyMoZ6YhJKFgo+hn5OYkoSKhY+YkZZscHWJi4GVjI2Pdo+EcWyFgYqWkoOFiHKJoZaGk4qPj5altambjZWig4eThH5/a2prfH5+f3FfXGJeWWZqXGxrXlhLSE9TUU5NTEZJUENETkZCQ0VHQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5oWXCDcHWHcXaShn6XlpqUn5+cp6CqlpOYnmdlpJp+hZOSeoCRiZGSfYqFmZKRg4CAi42JhpGHhIiFeHh/Z01SPi8uLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVJTUU5QSUVEPjs8OkNGPz48ODUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6imopmhl6KVnJ+onqmrn6isqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqamaeRkYiVopqad3p+lJeRoZKWl4GUnnt2lZKrs4mNl6B9lJ6cjpOWmaSiprawnZGZqIiXkI6BiGxzc3t9em9mXltfXmBmY2BnZ1xSRUtLUE9JSkxGRk1DR01GRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBxdWBufWJ3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYeYjXiCjYuOjXuKho+QjoKDgImMioWThYOGiIGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1HR0FBQDg2NjI8OTtGSEdJSU1PUVlthpB3lYujp6q1vbilrqysp6i0rLG3srKtu7GzvpyzxKy7ycu4xL+4paOwsqytqqOLlpiFpqagopeCppmNoqqopIeFk6OgoKqgpKmOnLGLlaOnt7uboKOwk6Odo56RpKKrr62ztaKVpaqJmoqTipV6e36DfGVfZltkYF1iY15mZl9bT0RKSFRPRkhMRktIRUZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNYanBYeoV2gZSFiIKbg5KQjZLayJ2Wc1aXiI+InI98hoyPi4p6iIKHkY6DhYCLhYWIkoaChImGh4eHcW5hQEU2NDwyLzExMC0sKy0xLy00P0RBTVVRUlRVVVdVTVtQR0dEPD4+RkhDREA3Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcjEq7PFtqyzwLO4vra/tMG2u7ukuMaptsnHtr65tKijtK2wsZuZkpqfiKevqqSUdp+kl6GrsbOYlqmtqK61u7K6rK+1orGssbW8t7WutaCnp6Oom6mwrbK6uLinnLepjaWPkpOghnmBgXNXYGJUZWBgYl9fZV9bVEpERUxWUUlKSkRKSEVBQEBLREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFtaUWNkV3p1cYKUfYWGk3aGf4CNe7+7o7yCtJSTjpuPhIiPk4mJeYeAjJOMh4WBjn+BiY+Gf4WIhYqHkXp5bl1WQEVOPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcV09fVUlLSkFAP0dLRkVDOz5AN0Q3P0JKSkVHV1RQXo+lraOxtMO2uMHMyra7xL2ztMG3uMK1v7C3dLG0prrFpLDGubGzsbSopLW2qrGgopabopGlsa2lraunpJigrLO6oqiyubW7vsy/xcW9vbPCt7q4v7e6t7mtrbGmsaqtvrC9u8LCrJm7qJWtj5iYqol+gHlpVmFfV2ljaWRVW2NZVlRJSEdMUUdESUpBSEQ+P0JCS0BATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlFMQUxSV1RaVlp3anB/j4SBjoVuenN4iGK4oZqjiZWUlpOUk42Ql5KHh3uHgY2VioCEgYp6fIuHhn2KgoGLhJV9eHp1ZU9cZEdFTDpRZGFbXlNGPjtIUERaZFFRWVhaZ1pUYGFNU09FQT9JSkhFRkFAQz1FNkI+SEdLTVNaVF6Ur7i1urnJwLu9ysy7vcC7t7W8vLe+tbqyxmB1sqWxmp6rvqqlqKuqpKKytaCrqJ6Vlp6Yn66lp6aln6SToqews6iysry2wb3TycnTxsLFzMLKw8C+vb+7vLe0sLm3t8O6xr7DybCeuqqirI+lqLaJgH1wXmBgXFZgXWdlUlhhVlJWSUVGTktAPkhEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3MzUyNj84QD5HS1JUVFJQT1FSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdZ21scZCNhZBzbHNyc4jVwLWZoI2VmZqRjpeRlpaOhod9h4ONlot/g3+DeHuLhId7i3mBioKXf3R9emxlcHZZXVxQZWViYGVkXVtYV1xNZG1VUm1uX29fWGdlVVlUSkRBS0tIRkhISEhCSTlEP0hLVFRWXVpck7nAub23xsC7ucrLu7e6tri5s7i1ta62tplkdamerXBeoq2cmKGim6Seq6WUn5+QlI+WmJeon6WfnpqZg6SdrKSqsK23sLy41NDO1s/JzNLMz87Kx8C/wsq9wb3CwMXExsq/yc+0pLuxtbCbrLm9mn54alxfW1hdYFhhYlFbYFNRS0NCRUZFPEBGPkJJQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpYG+XkpGUbmxvdHWHs6yhoZ+LmZyZjY2VkZuShYqKf4iHjJCMiXyBg3N7ioOFe4p0goqGlX9ze3lsbXV8aXNlaWxpZmpqaWBmaWhtWm10l62kvIeHZ1tvaF1aWVRISk5QSktRTFRRSExBSkdLUF9fYmdqYpe3x7C5s7u+trHEx7awubGwu6yzsaert6yNtqeenKeaTpuejY6glpGnmKWVipOTiJGJj5GRnZuhmJuVloeemaaarK+or6ezs9PU1NbRy8/T1M7Tz8zGw8rQv8rJy8nSyM3Nw9HSuK/EvMS6pre7xKKAbWJbW1xYX1dYZFlPXFdOUUNCSUVDSTtBRD5BSD8/Qjg7RD5AST00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ5PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZldzkJCZg2hxb3l5g6CqnqaXjZubmIuNlZGajn2JjIWOioqLkIh8hIJwf4eBhnuHcoOSi49+cXl1bHB4f3J7bnhzbGmAcG1jaW1weWl3fX7Lv8Lfp21jeG9kW2FgSlBSVU5ZXlBdXU5QTlRRVVRcbm53g3KWrristKiwtqutvcGxq7WmpbmnrK6hrLSkj7Gum5iYjJGUkYSPm4GNp5GciYOLhIqJhIqDk5WYl5SbkZuYmZmenquspKehrKzO0tXRzczS09PQ1NHOyMPU0cjO0tPT1s3S0cXS1sbBz8jIw6m/uNCcd21kW2BcVV5RXVpPT1RQTkg+QUdCQ0Y8QUI/RkU+QD86PT09PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM1OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYeGi3dtd3B9foChnp6hi42Zk5OMjJOQloV5hZCQjouKiJGHf4J7cn6Agod6hXaFk5GJgHB3c2xzfHx3fHOCeHFrgHJyaW9xenlze77Lmn6MsYN2coV3aGFqXUNaWltXZmRYZWtUWF1dYGNeY3h7f4uBmaqkpKKgoainqrG5q6a0o6KuoqSuoqexn4mmm5WTkYqSjoiClIlrlaKNmYSBhn6Rg4OTl62LlY2VmY6FkpCdl6ewoqCgpKSox83Px8HL0NPR1NLO083G1tPN1NjW1tjV19XJ1NrNytjW0cqtxMPMiXFuYV5dV1JYUltPSkdKSUpAOzo7RUNEPENEPkhDP0NCOzs5PDlHQzQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX5pc3lygomBnZWelIWLlomOioiOiI+AeIOUmYuNiIiLiX6DeHN7fYOHd4B7h5GXgYRveHBtdX92eH10hnx5bId2dW59doR1eXudtYw8QYrGpX6NfGplV0lDZWNmY2hqZG95W19maGtuaW6AhIiRjJ6foJ6Rl5ifpKSmsqSls6CipZ6hqaCisZyHn5KSk5GLjouGg4+EfpycjI2ChIV6lH6CqpWjjJKKmJKLfZeKmpGrs5iam6ecp73Dxbm2xc3R0NHPy9LLydTP0dXa19fY1NnYzdjbzsna2tLWv8zNtHV0bWNbV1FUUFhVRUZKSUVFPTo3OkBBQjpHRUBFREJEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYnFxc4aNfJeRnYt+h5KCiYaFioOIfXmFl5eJj4OHhYd6hHlxenuEhnV6ho6NnXqMcH1vcHp/cnuAcYSHgG6OenV3fXyCdX98h4mwdFmqwreNkoFwbmM9XmhycHFwbnh3gmVpb3J1eHJ7i4eOk5KblqCWiIyTm6Cbn6qfoa2copqan6afn6yZjJqMkZOOhX2Ih4OFi46gmZOIg4d+bZl5hJmGiJOMjpWMhnubiJOPrqqUlZeemKautbyorb3Gy8jJy8vPyMPRytTW2NfY19Xb19PZ29bP29rR1sjVzJN2eGdmWVhPUlNcR0JFSUk+QT49ODo9Pzs+SD1AQkFBREE+Pzo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJma3aAiHGRkJuAeYCOfoOCgoV/hHx9hJiOh4t+hoeAd4J5bnt7h4J0epKejaF2j3aDdHWBfXSAhG+CkIJvkoR1fIGFenaHfIm4xqXDyriClpyPeHBlTmVjgnqBd4aikIt5eXd7g398hHZtlJaUlY+YkYOJj5eal5emnJigl5+TkpejnZmrlpGRi46Sg4yFiYiBhpCRnpyZiYWLgYWXe4iJn5eQiY6Ki4J8oYiQi7yhmJOXmZyopqWtnqe1vsC/uMfJzc7FzcrR1tXU2dXX29TX2drb19va2djO3MaFeHdlZ2NeU1ZWVExLRE1EOz09PDk6PD45PkE3Pj9APUA+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0hQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZmFdW2h0enlsiY2Sd3Z6inx+gH+AfYV7foKRioWGeoWIe3V9dW19fYZ+dH+SnpGfg5J8hn14j355i4pvg5uAdJmGfYKKhXx+kXuQqY6Qw6C9jJyknH6KhH2JcoyLf3OmmpyZlIV7j5GJhGlHcaGknYyLkJKFiIuRk5WPnZuTlJGXjYyVn52UoZSSjo6QjH6Qj46LhIiSlpqfn4mMlJGdkIKMf6aZiIWOg4aEgKSGiou4mJ2RlJaip6CdnZ2jrra6tKu/xcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u3d3Z1aWhkVV9aUk9OSENMQz09Pjk5Ozo5OTw9NkA+Pj09OTo6OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVVhmbW1taYGOinFzeIp7e399gHyIe317i4eDfnWDhnpzenRtgX6EfXeGm6GbnpSSgIyHf5iHgJySboiphXqgi3yRj4OJhJx+mpGJjaOin5Ckr6CLkYuGi4GShldyrYufrJyPg5ickJCOXIOikYKNn5OVjIeIjJKTjJSVlZCMj4qIlpudj5WWkYuTlIaAi4mSjYqKnZeZo6KGk52VoIqKiI6ckIOIj4CDh4WkhYuQs5ickpSXoaGemZKbnaexuKykvMHHzcfGz8zPzM/Xz9HUrtbV2NrY2trX1tnZnW16cmVlW1tWUlVWQ0BJRD8/Pjo0OTo7Nzo7OjM8PD89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjxAO0JRS0tTWVBUY2J4bGJ+koNvbXeLeHp/e4F9hnx7doaFgHNwhYJ7dXd2dISDhX1/kqain6ail4qdkJSXioqnl3KKso2Ep5KEmZSFmoyjlqCYk4mbnqKTqbCgkZWQjo6IlYtujbeEmsTIspyipZudmJaRspBkpM3IlY6Gh4mQko6Nk5SKhYqKhpaam4+QlJOHlZiEf4+LmYiOkKqXl6SjiJmelZqJj4aXmIqFj42Cf4aPpYiNk6mal5OXmaGYn5mTnJqisrSlo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoBwfGVgW1xcTUlTWEFCR0Q7QT44Mzc7PDo4PTY0Ojo8OjcyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgkd2gY99fG1+iHh6fnuCgoN/dnaAg3xtbot/enx4eHyEh4p+i6Ozp6Oqs6KXp5+lpJaVrqKDkbiVkbOajaGhjKWbsKOknZiRp5aomayvpJiVlpWQi5iZl6HAjqPJuaubo6atmZKbnbKdhYWoopyYhYmJjpWNi5OPiIGGh4mTmJWMi5SThpWYhoSRkJx1kZiylpekoYidmpKPipCKl5uJi5aOh32MmJ6JkJCcmpqTmJiflKCdlJ6boLGuoqS3vrTFx8S9w8O/xs3KydKmzs3T0tHW2NPQ2Lpwd3NaXlNeVE9ISU1FQkNENT46Nzc6Pzw8Nz00MzY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER05bXFlKZmA7SISLenpuhYZ6fIR5gYaBfnB4fH59b3KNen6CfHiGi4mGhJKnu6yosr2vpa2zs6ijobCsipq1naK4pZWtpJeprbinpaOfmqmXqaOvsKqamZyUlZGXoJiau7uuyqFqtrirsJSZn6Osk5e9o16qsoOKio2Uh5B8jo59g4aOj5SViIiTloyQlo2LjZeYk52ZtJeVq52LnJSSjpGSjJmbipKekIuJlZ+hjZSNmJqdkpyYnpShoJScnaWvqKGls7irwsjEtbq9u8XHx8LRoMbJzc3E19bRy9OgbnhmWlhRXFBORUM+PENBQjg/ODg1P0c9PDY8MzUzNDU0NTRCMzk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEdiYGJwSj+Lin6Bc4aHfYKJdYOKgn9tfH19f3B3h3eOgod7jY+MhoyZqsLAr73Gu7O0wLy0rauztoyos62tvaubu6Sorbm4q6emoqKkoqmvsrGrnZykmJuYl56ipqWSpLqvqcC8ra2yuaWlqH6IhpytvLCDjIyLkIOOg5GOeoGHkI2NnImIj5eNi5WWlJGal52omrGakaycjpqPko6VkJCWl46RoJGJlJukrJSWj5ScnZOhnZuYn6GUmp6npqSipLCzp8HGw6+wurbFxMK/zabHxMfDvNbRzcTKhnJwX1lXXVlMSkFLQEZHPkE/Qjs6NT5BPT01PDY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdEP0NGXGVHYGlnWl1ck4yLiHuHjIeDjHWGkYqBb357gX9xfoF7lXqSlJSYkJOVp7PGyb/CzMLDuce8u6+rubuYs7e6ssCupcGkq7C8vauuq6OjnqerrrSwqpygqpyhm5afsLWni6O6u7bBvKypnLKlpKmUhY6pxMOkgouPh4iEhpWUjXqEjZGPkaKMjJSSj4mXn5iTmZWYpqCunYyqnI6Wj5KRlZWNkJWRj6GUhpefoLKelJqUn6CYpJ+aoJuglJiepaOmpqSvrqXAxMOuqLe1ycK+ts+yxL/EvLPRycjCtHJ2allWWWhQTEhCTEtLSkFBPUNEPDVBRDs7Mz04QjMzMjI2MkEwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmVZTmVcZlRjapmNl4qMiJOQhol5h5SQgXKAfI1/eIeCgpB6jqGWqJqamLq9x8jJwdLJysLNvcKzrby+qLq/vbvDt6zCqayzvL6qsKqkpaSsrrOttrWgn6+fpaKYo7O9qZuovcGktrewrJOxraytl4eaqaelkYKMk6WViYF2ipF6hY2SkJ6fk4+UjI+NlaOZlpyUlKOeqp+RpZqMj4+PlZaIfI+VkpKjmpWfoZy1pZCel6WjoqWenaaYnpaXm6SjqaeisqyovMDEr6Wyt8y/ua/Es7u+writwsPCwJdqd2BWVVpZSUpMSUZEREhDQkFETDo0REg5OzQ8N0UuMTIzNTJCMjVTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Ol46ekomKf4qgk4R4hX+Vf3+QiIqQgJahma6mpJjCvcfDx8XTzc7Ny7zCt7C5vLS9y7zDwba3vK2zwLq8rq+ooKmotq2uqbK3m56toqehnqu3uKqlsL/Fsb25tKiqtbSur5eWpayooJGOkrLFp5WOfZKVfYiSmZCqmZiTk4+TlpOlnpKdmZSho6KcmJ+Yi4yPj56IWpCWl5KXpZllmKOfs6WWoZasrKmnm56ml5iWl5WgpKiln7arqrq7w7Sls7XLwLiqtqyyu7muqLi6vbiBaWxYVVNTTURKUk1LP0FIRURISEg5NUVNOz44PUBKLjMyMDI1QzU1T1ZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz1AQkZCcEVpSVJlYkxGpZSbl6KXqZaNkIOHppOIgoeCnIODlZCQlI+aop+vvq+hxrzExMbGzs7O0sq+u7axuru7vs+1w724ubeysbWzuLOrppyrrLmqqaevr5ijr6SnpKW1wLCsrLS/w7rAurSoubW5s6+Wpa2urqSLk5WhjXTBmn2XmYSPlpqMsZWbmpWSk5qapaOUoJuXmqmcnKGgmYqNkJacYEqWnJqVmqWWVZewn6+cnqSUr66rpZqgpZSTmJiNnKCnopm0qaqzu7u7qrCyx7+5pqyrrbKyo6GysrSkbmtjWlhNT0pET09QUTtIS0lHSUNDPjpLVD9BOj1FTTA3NTQ0OkI0NE1XTzxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqXmaCiqK+ZkZiHi6iWjoiThZ+HhJ2Xjp2hm6Oktci1qca5wsPHysnIzM3Gvruzrrm5wcHMtce6wbm1urCvr7O1p6SbqrS1qqmmrayapK6lpKisur+orLa3vsK/vrm0s8Syub2so6+1rLmmiJuXppt2v5+EmZ2Ok5mai66XoZycl5WboKGonqefmZqqmaGnnpiQjZGdg252kqKalZ2inpCusqKqlKiql6qto6OfpKiRkZmbh5Scop6Wsaepq7m2vbOyrr65t6Cjp6ilppycrampi2BjXl5QSUtGR01JVkw9TUVOS0xCQ0Q8UVY9QUFCRE8xOD03Nz9CNzVUV04/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLVJgTVVIf2VeSEWrlZuhn7uvmZSfjJOrm5GSk4mrjYein4ykrZSjo7bGvrTAusLCx8jFws3Iwb65sq+4tMDCyrXFssG8tbqqqa2tsKOjmKq0u6appquqnamvp6Oqq768qK29tLi+x7y3trjBsr7BtKm1t6u+pY+imJKin7yfiZqgmZeeno+3n6mcpaKbnKGaqKSzoZudppyoqZ6ZlY+Um4uXiYykopSdop6hta+lpJOvq5mrqp2do6OokJSUn4KPnp6blamkoaGztLq1rai1srOenKKlmpeVmaqhnnVeWl1cSUdFRk1QSE1FR0dDU0xKQkVHQVZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKRUBKSk5POUNANT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTlmXEZDQ5xwYkdFp5ekn57DrZuXpZiaqZyWm5uPqpaVp6aVrayZoqu2xMK8vrfBwsDHw7/Nxru9ubKwuLO/wsi1v7C8t7m3paSrrK2hoZqqqsWipKmrpp6sr6uiqai/uKetvrG4tse2tbm4wLK/wre1s7SvvqOXo5aUm5SuoJCho6Wjo5+QvaSpnqirnZ2gm6WfvaKZo5+iqauhnZaNlZ6TnoePhI2Tn6SgnrWspZuVsaeZr6admaqcn42YlJ6EjaCam5KlpJqYq7G1saqlqq2snJigoJKOkJWonpRmYFhfXE5IR0pOS0hFRElBPlFJQTxHSUhbUk9LPUhPVTRCRjk+SEc1Q2FbS0NOUlVXVlFYVFJVSUA4UlFQTTpHQTRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE0NkA5Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E6bVJGPEt4ZWJWTKKao5yexayhn6yenq6gkqOflqWfpqqsl7axo6qztsTEvb+1v8K7yMK+yse1uLW0sLOzt8HFtr6xuLW4tJ+mrKqsnZ2epaTBpJ+qraCkqa2voqaovbWlsb25trbEsrS4ur+zxMG4uK6ztbWjnaWVkZShrqCZop6oqKujmsKtqZ6srZubnZmmoL2hnaSYq6uspqKZjZqfkp+Jjld/lp+loaC4qqaTmLWjn7Ggnpqulp2NmJOdgY6fl5WOoqOWkKausqupoaGlpZWVnZiLj5GSpJ6JX2JYYl9LSEpKTkVFQUdLPj1KQjk5SkpOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JHRTY9dWVcS06en6GZnsOopaK0op2yqJOrpaCjn62prJ27sKistrHIxcHCssLDvcbDvMTJvK+wtq2wtK+/xLS5sbC5tKyZqLCpqpqdpaGowaybrLCcqqOusamkqL22p7e7vq+3xK20s8PAs8e0u7ers7atqqKmlpWUpKyin5+aqKuwr6+7sqagqaiZmZeToqS4oKGkk6+vrKWnn5KhnpWej5CNlZ6aop6ntKamjJizm6OumZ2brJCek5WTmX+RoZWPjZ+hk4umrK+lpqGcoJ6SkpqThYuRjZydf19kWmZkSklMSlJCQ0BJSDs7Rz85OU9NVV5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0n6OgnKDDqaSrs6GktKqWs6ynoqSyrK6pu7GtsLW0xsDEw7XAxL3JxLW/yMK0q7Wor7isv8Ozt66strmlmKqyq6qYn6aXrbu0m6ewm62grrSyp6u5s6i6tLiyucCqt7LEvrXGqL+vrba1qaesoZeXkaaloqKYmKWvuK6ytbagn6ikmpWVk6Sgt6KkpZavsbKnqqain5uam5aXqJ+gmKGer7KipoyXrpikqpeZnqSRmoyTl5mFlZ6UjI+cnZOLqKmqoaegmJ6VjI6Zj4GFlYiUnndiZ1xqaUxPTU5UPUNBTkM6Okk/NzdST11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlwaFZDV0aMeWZDO6SjnaKmv6eor7ChqbWrnbqxq6OqtLaxsLm3sLe4uMS9w8e9vMTBxsC4wMXAuqm2pKy7rMDCt7eprLG6oZStsa2ylqWnkaq5qZ+msJ2roLC0s6qptratvK2zs7m3rLiww7u+v6bDq7C3rqmrq6eemJmroaKhkZehsa+zrLC5mpypoJmWkpemobappaOisLG0q7OorJ+boKCbnaWcopedo7Owmp+Pk6Wan6iak6KelJeIk5aSlZack4iQmpmUjqiopp+jm5ebk4aOmIt9jJaFjZlpZ2tgbG1XUFFaVEFCRVRAOztIQTc6WFBkXlBWV0VZX11NTFJOXktKPlpjXk5IUE9cVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPSonKz1ccD0+MS4wZFpkQDE2NDdnWWBGKD84bH1nW1Y7iXtjQz2on52iqr2iq7Cro7G4qqW2tKygrbW9rrO4u7q9trbAwr/IxLnEwsDAuMS9wbevtaert7G7vr60qK6xtp6Wq66orpemqI6nu5+krLOerKKxsLOsqra0tb6usLG1rLC1ssG7xberva+xuKytqqOxpp6lqp+kmJCZn7Oqs6uqs5qdp5ualY6gpqW0rqehra2usae0rbKqpJyfqKOelaGZm6i1qZaZkZKemZ2fnY+rnpaXhJSWip2YnJOJjZaXmpempaKgnZWVl5N/j5SFe46SgouVZGtxZ29xXkZZZlZEQk1YRFo5SEI2PlxRaFxOWV1HW15dTk1SWGRKSkNcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYFUxNTA9YFZeOClDM1lUXGdLNox6ZkxApJqhpKy2pa2qpq+ut6qvtbunprG3xbext73BwrW0usS+zMa5wsC6vrnDt8C5sbSrqbq2u7m+tKmtsLWYmKesqqybq6uPq76erK6yo6ufsK2zrq62srm4qq6usai1r7S8vcqzqra1sbSwr6ehs6CbqK2gppaWmpqyoq2gpa+XoaSampKOo6aos6mhprOsqralr7G1r6SZna2nmpifmpmrt6KXk5GOl5yhl5aUq56akn+Sl4ydnJmWkIqUkp6ZpaKhoJiWkZOVeYqPhXuMioKJkWptd211e2FFYGtZSUhaWj17SkZENkFiVGlbTVxhSltdWlJSUmJhTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ19RXC4qQi9KR1BbSDNjWVVLRJmXobGosaqtpqSvrrapt7W6pKy0t8m7tLq6v7+0s7fDwMzIvMO8t76+v7e+vLG8rae6ube2wraqrLC3lJanrquoo7CqlK+7pK2xs6eoo7K0sbKxtbG4s6muq7Knt6+2tMTGtqm2tqywramno7agoKexoaSUnJmVsZ6nnKCqjqminpuWmKampbino7K1rKiyp66xtqylmaCsqJucnpyUqbiclI6OipibopePmKWgnJSCkZWPnZuXlpWIlo+Ymqeco6CSlpGQlXWEkId7hIGDi4psb3Z0e35cS2VtXEtOY1w/YntHSThHZ1dlXExeYk1YWVdUV1RpXU9PSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0diTFYlLUItPUVMUTwzcmtJQ0OQmaWupa2vq6ilsbO0q7eyt6CrtbnJua7Au8K4s7G1wsPOxcDBvbS9v7+6vryyxKepubC2tr+8rquysZugp7GtpqWvpZ2ytayrsbKtqqm0u6y1s7WttKyqq6isqbmtsrHIwLilurCpra2lqK6wpqWjr6SpnJ2cm6+ao6Oio5GsnqOgn6Kqpqa5pKy1tqWrrKitr7auo56jqaqboJqakqSzmY6JjYeQoaCUjJScn5KRg42Skp2al5WTh5eSlZmnm5+ejJKRjZB2fY6FfHt7homIcHJxfXx9XFNkb15OWWZcRkSWW0c7Tm1YYltMYGJOVlZVV1RZZ11RUkxjWlpUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM7NipIZUhKKztIPzNCSFMsPpBrO0dIj5yqq6KqsaSppbO0sbW1srKiq669zLquwLrHsbSttMLD0cXGvsCzvsHCu763u8SnrLess7i8wK+rsayfo6etqqiksKSqsqqvrLCvsK6rs7ynt7GyqbOpq6Wlo626rKqyw7q2rbupqKitqaiypamko66qqKKenKOtlaWemJ6ZrJ2ip6miraakrau4srKhqaKgrK+xrJ6gp6ipmaSZmY+gppeGhI6Ki56fjoqMlZuOjYSGkJSfnJSXlIaWlJOXpJucnIqSkI2Jfn6HhXx3foWEhXJxcIh1a19aYG5jUXNxXEs7hHxGP1d0WGFaTmNbTlZWVVdRXGJfU09OZ1hXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyoyNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSmdERjg8QjA1RUtYMUCVWj5MRZWYraiiq7Ocqqqwtq25tq+rpquqvcm7sL23wq+xrLPEw87Pw7+/tMDCw7q/s8jDq663rbK4v76yra2rpKeqsKmnqLGltK6qsK6tsrG0rLS8pbizrayup6ufo56wt6uqrbu3pbe2pKqnrKuqraGpp6axsqSnpaGhrJeqoZWboKaepKKqpK2jn6exuK6uo6aim6qrrqmdoqWkpJmgmpaPmJySgYKPiIWcn4uKjouYjY+KgouXo5uRkJqLk5KRk6OZm5qKjouLfIaBgYN6dH+CgHxydYukh3hqXmBuZldlh2NOP2eTTEVieVdiWVJlVE1WVVVUT1xdYVVLTWhWVVdJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqMzk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEIrOkpPXjREhj5IRkSXkrClo6uxmKuqrbastrKspqyqqbzAwLi4s7u1prKvxMnL0b/Bu7m/vsG4wbnAxK2xtbGzur+9srCtrKqrp7aqpq2vqrmwqLGyrrKtt6q3t6e0t6uspKmqnKOes7OoqKS0taC3rqCqqKuoq6egq6ypubapqqmpoqqgrZuSqqGdoKSipqOqnp2ntK+opqqio5ilp6eqnKOko6CamKCRjo+YjX6HjIeDnZ2GhIqKjY2Pi4KFlKKajYyZkJKRj5OflpiWjIuDf3SHgX5/eHSCfnl2foCHnY9vcWdncXhcYXOIa09emVZIbXhVZFZRY09NVVRUUE9YW2JVSFBpVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzo3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD5DLD5MVF8vSmk1T0Q7lo6xoaarrpqspa2wtLWwrKawqqm6vrvAsK65rqG3r8jHyNHAvr27vMK9usPAvr+usrKxtby7wbGxsquzqKS0qKWts7O5saOut7Kwsruruq+qrrasqp6qrJ+joLatqKGfsLOitaqeqKeqo6qhoqytqL2vrK6soqiooKyZkLCimKKgp6eep5uZqrGqo6CtoqGUo6Ojp5iaqaWYmJiejoqHlId9jIaEg6OWhIGBi4aNjJCDg5OgloiQnJCTkI2RnJSXj4qFhnh0gX98dXh5f3pzc3lnf4akdWleZGuAdGeIjH1TWHBeSnhzU2VTUV5NTVJaZk5MVllkWEZTaVJRP0NOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS01KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMZzo0OF89YWQ/RjFDUFtbKkhNOVVBNJCPsqGkpqykp6Stp7WzsaulsKequL7AvK+nuaqmr7DJx8jRwry/vrm+v7zJusC4sK+0sbq7t8Cys7usuKyitKenrLK2ubOoqL22rra+sL2nray1rK2cqa+koKWtq6ecnquzpbSom6unqaOpnqSpqKm9rLSvrZ2qpKGunJuzo5WknKWln6Sbmqmrpp+bqqKbk5yhpZ6Yl6mpkpialJCKgo+Ffo6CgIedj4V+fYuHkI2PhH+TmpOFkqGMlJGLkZuSlYeJfn9ye3p+fGh4fHp0b3B7Z4R4hIhkYWdhcYR6bWd4XV1VQFd6bVRhUFJYS0xOcnVdSFpbZ1lFVWZQRD5KTkRDQTlIR0tTP2phSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMScvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZjQUo3R1NgVSo9OURXPiqPlLKaoKCppqWhq6W4s7OmqrGnrbjBvbWvoritqKiwwsnJzMG2vcC1t7+5yLXCtbOytbK8t7m9ta25tr+tobOnq6uwtbi1rJ++vaqzwbS8oa+ztaqrn62wo5ylqKqjnpulsaewoJ+rqaihqZykqKGtu6iusK2gq6Okr5+fraaXn5uho5yfnJqkqqObm6WklpeVn6KWm5emrIyekZGRi4KKgICOgHuZk42IfH6Lho+Ni4qDkpiRhpOiiZKSh5Caj5OAiHx5bH52eXhje3pxb29xdmeAc2qDZ2RnX2xyjWxhaW9gbz5aeGtVXk9RUUpJTVRZV01dXmxXRFhgT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNjg7MigwOS8sNC8uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MUFoWTEzUz1lX0RMNktWZE8qOzJOWD0jk5mtmqCYp6Sjn6ikuLCvo6+wqqu4wbmzrZ+4r6uotLrIy8i/tsK+sLS9t8S2w7GuubKzv7S7vrepubi9q6S0qKmqsa66saucvL2lsMG1tqKvt7Wmp6exs6CepKWnoaWZn6yoqZ6gqq+noKaYo6mgsbmfo7CvoayhraScpqepmpqbn6SVnJ2anqmml5ygqZOZlJiek5mWoaqRmoiOj4Z9h36CjX18oIyMiHiCi4SJi4uFh5Oaj4iVnoiRlYKMl4yRfYV7c3B9cXR0YHl4aG5wcG5ofXFje21pZWJeZIV+X1pyanFLSn9oWFpOUExKSFBSUElOXF9uU0RYWlJoT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLjo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM8ZmQyNE0/ZV1GTz1RWmdIKj4wWFY1KJeep5qdlqygoKGkorirsqW0tKqpucO1s62ft62urbC1xsjBt77BubG0vLa/u76vqr2ws76xvMK5qbu6t6eotamoq7Gts7Gom764pq28t7KfsbiwqKWnr7GboaSgpKSgl5uvp6Gfo6ivoaChlKSkorewoaawq5+so6+YnKqlqZ6Xmp6lk5udmp2mq5qdnaaXlpiUnY6Tl6KoopCIi4+FeoR+hIp6jpaJjYZ4gYeDiIuNhY2TmI2OlpiKj5d+hpeLj3mBenByd29vdF95d2RrbGtoZ4JtZXJra2VoWWFzf15aa3VpWUd9XVtYT09KSEhSVUYyOl9ebFBEWFZZZUxISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRHQmdbSFRDVF1oRS47MV9ULDKWo6KYlZ2pnqWho6G4qrChu7mmrL3Es7CuorWvra2vtMTEvbO+urexs7m4uri6rq2/s7S4r7/BuKy9urSmorOrqKqzrK6yo53Ctqapt7ern7K7qaalqK+rmaKnnKWmlJihsqaZnqWpqZyhoJSln6S5qKSnraaepaGok5+poqGhmZudoZKbnZegoqucm5qilpOVlpuOk5Ojp6SPiIqOhnmEfIWGfZyMiYqGeICDh4iIkYWVk5KMkJWTjY6Ue4KXjot3fntsdXJtbHNieXVoZ2lnZW2EZ2doZGZoaV5mYmlmWmV6YmBRc1RbW1NMSUdJT1NAIStqXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTctMTE5NSwmLjUtODA1NzZgdEIzQ0RoW0tXR1VgaEIzNzhiTScynqSkko6lppyenp6kta2oqrq3p6zDwLevrKG1rqeur7fBwL2xwbewr7K2tbi3tayqvLSvsrG9wLeuvLyxpZ+2rKamtaqrr6GgxKyqp7G0q6y0up6oqauxpZieqp6opZKapq6jmJ6lqqGbop2XoJ2ntqavqq6hoZ2doZWgpp+ioJmbmpySmp6Vpp6topiXn5aUjpWYjI+YmqegkIeKioh4hXeCgoKch4qCiXt+hIiGhJCElpWPj5CRkJGNknuDlY6Gc399Z3lwa2psZ3Vza2JnZGJ0f2FkZWZlaWliZ29ZXlhdbWRgTWhXW2BWSUdIS0xSWD45YGxpR0JVU11bSUhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETj1CPDAqPEA7QTwtNUIzNz0rKiwwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNBZEclNZykoJGMrqCamKCXpbSyo7K+t6Gxxbu5sLGjtqyrrqm5vry7rcCyr6+utq+zubKnq7mxr66ztru2sLm+rKWetaugobGlq6+fpcShs6WvsrC3rbWerK6srqKZnaeqpZ+VnKemoJmko6mcmqCclZyerbCmuaetoqGamp6YnqOapZ2WnpiblJqhkqiWramblJ2ck4yVmY6UlJinp42NiomOe4F0goKKmIWHfImIhISKjIiShZOckpKPkJGWjpB/gY2Ng2+Bf2Z5bmhramdxcmtbaGNhcn9gZGdqbmtmamZkbFxsbXZxYVRiaGNlWklGTE1PWFFQVWFlgVRAVlNZVUZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OzYjMyopNi41NTQ2NVp8XTE6S2pbTVtLWGRjQEExSWRCJzSTopyPjrGdm5ShmqmysJ+5wLagtMG7vbmxprawqa6lt7m3uKy7r62rq7eqtLmtpbK1sa+psbe2sbO2u6epn7apnZ+qo6qtnarCma+lr7G2taysnrGtr6qim52krKmclZynpJ6aqaOllZqgnZGco6uqqbqfpqSgmJqanaGPa6KVmJxxg5acpIB2kauonpaWoZGJl5mAl4qfj3iFk42DbWl+d4RybIaKhn2EioZvXWRgZ4SXhmuLkJSSdXeLhH+DkIBmiIBodmlmWF1pdG5OUGpjZnGCZl5kZm5raV1dXomQhYhoT0tEOEVUZ15KSFBQVVVLSFNgb3RlRVtRVVBGR0ZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNU9rW05cS1tmYj5HMU9iPCsvjaSah5Wxm52ToJyqraujvcWvqbfCuL28rae2saarpLi0srOwua6qp6y0pbC1oqe4trWop6y2s660rrOiqZ+0q56ipZynqJuuvZWop7C0uK2upKitqqumoZ+coaionJehpqacnKeonZKeoJiQn6iqo7Svo6KjnJaYmJejiKGPkpqGoYiUnqF/pX+nrJ6Uk52TiINyeIyOg4egdYiNaZeJZn5zeaBviIeDfox8f6Ggn5l/e4eedIiOdpuKbIeCg25pZWR7bXJiVIZtY21pmHFYaXBuhlddaVtralqIcG15codph4RaXkZOPkZeTUVSVlZRUFJXVGddTFlLUlJQRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN0MTVSa1tOXExbZ189SzFVYDcvKI2ml4SdrJ2ZmZ2fq6qoqr/Dr7K5vLfAv6qkt7GqrKazta6vs7arqaWxraW1s5ustba0pqeos7Gtsqiunqqhs6mgpKSaoqSdsLeVpaant72mrKepqqunpqKgmaCopJqZp6OkmZylqpaTo5yUlKSmpqG2pKOgo5iVk5iTnIiukJiViamLmKOchrGApK2elJqflXmC1Kh/h5TAm8Z4d7Glt5ZkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyXsauweWhsWLGub2VpvJK8bmh6bXCP2H5Ta2K2sn6AcZR1mqGqkFdPWGFPVk5GVFtYUVBSi1xXW1BAXEVRTkRGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzExVGtcT1tNXmdcPkwxWlw0MSGOppOBp6qfl52dpa2yqbHCvbK1v7W4v8KrprStramor7Sqr7a0qKimtqWoua+csrK2qqWkp7KvrrGmq56npLKkoqGfl5yhoLGulZ+joLS6oqqooKytpKKdm5qiqqCYm6mgn5ieqKiRnKeblJ6ip6OhsKOen6OWlpKYkpmFsGtqi42qfmeFloetZXGenZWap5ZxrqGkfne6fGuhj3axX2q0W6WAZZyRYGaBemZ/aXhqqWW+cmemjHaxanyxeHWSlGNtbaduXISgRWlnh5ZFdZxgfWZ7o6aCWV+Lq2mAknh6aqg4Sq9bV1RtY1pMT1hfXFdWO06IT1ZWL0lUU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV5ZMzEbkqKVgq2npZ6jpKqxt620vb6wt8WyuLrDp6mwrK+pqbGvpLG6sKSlr7OjqbmpnrOysKOloaqtsKyvpqifo6KxnKOdmJWYnZ6vqJecop+0s6Gqm6GsrJ+empego6qdmZ6loZyaoaekkJ2jm5ihoKyfpqagmp+hlZWRlpGahrWbtXmFqZm1mXeHs5u3f5OWl6uWfmuBpnqBhYaRlJJ3q2dqsVuse46HlHSIcI6GgX+IkJd4g4KLl4yDoI+FsHZ3n3Framx8i0+lWEhjY5l+Y2ilX3lxdVKSh15QqW1jcX2GgGGdL1KibltUa2dgTEtcY1hcWkI+sHdXWEEjTWhGQ0RBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzIsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SjhhVTUwHJeflIizpqahrqmos6yqu7bCsLzCrbi3wqusra+up66zqqKvvKuip7Wto6u2paWys6ijoZ2nqrKosKimnqCgsJagmpaWl5qgr6ObmqSota6hqY+pp6mbnZaYoKapm5+do5+coKOlo5Wbn5ianqOrm6WanJqioJaTkZOTnYTVk5m5cbDCf8aGfNaUnLt8m5amkI2cjKR6jYaigaWCeqx5j51Wr3uJfp9quVq5d4aDfaaCk3yYeqp5jp2Qe7FtjoR0kLuFbpVQr6fFilGgemNgqmJzcoZsl4dfU7W0yIWAiXxjpDNCnXVdUGpoZFBAWGZZZGFKSE1rSlpTT1lmWkNDP0U/MDw8NTk7NzQ8PDg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQi4wMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlcSltQX2ZUN0c6YVA3MiWcopOZsaippbOqpbSnpLy3wbG6wLK2tb20tqeysaOxs6agr7apm6i6rqOwsqGytLGhpJ6ep6mxqbSppZyenqyXmZmXl5aYoqyem5eprbCoo5+OrKKnlp2YnKGmopiioaOhm6Kip5ueoJ6VmZumoZymlJubn6CYkJKVkJ2Ism5otXGriHCOpnK0dHO2e5uYpY2PnI2ifo+fpH6wdYOR0tF1W658hX+kb5uqpmuGhX2tfZeZj3uxc5Odj3izZZZ0hZ5unmaUUsmLWsJcn3liX61fdnOGYpeIXlnKnW+/gHVNS7VTVcZkVFFqY2VYQU9qX2xpUFVGSTk9V1JbVllIQj9KPDI/OzU9PDU2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRT5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1Qcmg5J1dpXEFOVF9lUDVHPWFNNjIuop2Rpa+spam6rKa1pae2u7yyu7+4t7W7u7SmtbSisrKjoKywpZinuq6ksrGdtLiqoKWdoaqksqisqqWanZupn5aVmJmSk6OqoZiTp6uwpaKWkqyfpZKUoZykp6CVm6enopqjn66aoZ6ekJacop6cpZSdlZminpWZlpKbhax7d6h2o4+Lh6lvrYqDp4SamaKKkpmLon6Rl4euhX+Cs1xys1KufYKCpH9x1313hH6PnYaZmnevhoqRnIh3tGGaZZqCgZVskluwV0uadZh5ZmCtXnZ3h2eYiGpdr3eVn494bDV5yK6yX0JUb11nYEVQbF9wbVZVTS5lYmhTWVA7QURATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo3N6CdlKC4sZizwayosqeqsrq4tLm+ubiztr62pri0oLWtoKCprKCVp7asqLGxq620pJupn6CoorWnpqqkmZ6VpaKUlJyakpajp5uUkKetr6WhlZipn6KPkaKaqaahlZqmqZ2dpJ6tnaGcoI2Un5ueoJiYnJaXoaCUmJGmnYapfX2leaGPkIOqcK2MgaaGlqCiipeWiKOBkIeUqnt/i515b7FaqIOCiKB5dNh/dod0p4GOm42SpHyWkJ+Ee7JenGSgfYKUbZNcq1xbk3+Rf2hnqmNye4BqmIZxXataiaCPa25lT0pDoVxaTXRdYmZNWmFfcnRfSlU1SpqSWEhFPUhGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPFBlZUEmVWZbPzFUX2JMN0ZJX0MxPTeinJqav6yYs8Kuq62oprSwuLG2v7m6s7K4vKq7taCxpZ+mp6eflKqxqbCqtq2qr6GYoaCmpKS6oqOroZebkaOglZWfm5WYoKCQjoypsK+mnZebp6afjZKkmKisqJWYqaien6CkraOhnqGOlaGYn6CSnJeclZ2hlZaPq5uPrm5ytHSpjHeKpnO0eXS0gZOlo5OcjImkh451uG+Me4uia2u2WqGGZZeXaaCip22UcrR0k5h/smqGkoita3WzYZ1mom6GkmuXXK1gTqF8h5FSc6NseX9+bpiGcFyvVjycd2ZUb24uW6dPYlJrZWJsWmJcYHB8Y1NZUT4+bW8yQkJAP005ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKywzMjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV45MUE4pZqbnbuinLG/rq2rq6e3qbivtcG1vbKwu7irwbaqq6Gdp6SinZKrq6e2o7Oorqqhl5yooKWruZ2jrZyWmZClo5aOnqGcmJ6fkZSVq7avp5mUm6ypl4yUppqlraORl6uypKCeqKuwmaGikJmil6CblpuXoZOcqZ2UkKqZh9OTmrt0scSAw4Z91ZabuHmJkZiNl4mMp4d5orZ1fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6J+jHSHq32+bnO8dLKDdXiAim2aiHFtjaR0vV13fVthebxqWlZbaXpeaWFkZmJteW9ZW1lDQUByP0NHKjVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw8OjA4TFhhRidUY1g8L1ReYEs1O0xbLTZAOaeZn6K8opexwrCtqaqssai5r7fFsbuzr7ywrsGyraajn6ShnZyRqqWqsqS1p62koJaaq5mnrLmdo66ZlaGQpqCTjZyjnpiempCWk6+5sKuVl6Onp5SQlqWdpK2fkaCoq5+cn6mksp6ipI6nopShmpyXlaSYj7CgkpWpn4WQmbaAkZGNuJV4gpObtXdubG5zb3mPhI6Jc57Bu7yZeoGyqHCAdJG5g3yGhouHjXuKho2XfKS7ub2cdXmzo3R2l3V0sHWYnmaGaY22dHJwd7aMXn95fYhng3lteWKLrHB0hX9YW6dpRGRZVGZfY11jUWZmcW11Qk1QTUQ7Wkw/SjM8MCA4PjsuMz1BOTk/PTs8QzZCU1laWltbWlteYGJgXVNHR0g0RElUQUtOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JXOCpPXV09KztWVic9OjymnaGhv6aWs8K0q6qorauqu6+xxq+1tK+4p7W5rqukoqefoJ2ZlKykrqqmtqion5yWoKOdrKS+p6Gql5WckaKbko+hqKGTnpeSmJSytbasmJ2kpKKLkpKmnKWrnZappaacm6Kpp6ajqKGSrJ6Xop6Xl5idno+wqZOcp6KPa35pnKh5iXN+m451emWHe76/wLpukoJxlYVfcmpaXZqJYWSHjpVrYH+VY22cdmKUa4CalZRlXl9jcZuJaHKMfIaUZmp+cXR5fn1iW3h0gWhQXG6DfHuKalhseYFySUpvhXBOc01EVlxmYUxbV2ZjXk9abXZqclJPREVNPEhJPE0/MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4xOzouLy03Nj01JiIvKjIsJTs4LTdJUl9JJ1NfVjQpUF5MKDM+W08nPzI+qJ+oocGkmrS6tqOspq6nqLWyrMissLSttqS+sbOnoaSqnaOcmpqsp66kpbWqpJuYlaKbpq2pvqiopZWUm5agmpOYpamnkZ6Qj5icsLK+rJunnaeiiZORqpuopJycrJ+jmpujp6yin6qimq6blaaglpWdn52XsaWZoqiZnJGenKOlmqejmp2ampqQloJobn1xdpGXlJGDibSpjYWYlY6KjJiWh5OVioOTk5CIjZGUmZOZl5qgoZqblJ+bjYJ6pIVsaXuQfYB1iYuCcoJ4eXZ1ioB7iWpzgXSDdWR3fXZrcHpsX2Jbb2dMWFllal9XWXB6b21mU09GUjlPWk5STygrO0pCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8Ojs0ODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlQxMFReOis9OF1LLDwtQLKgs6K/oqOxsbegqaazp6WwtarJq62yprWmwKi0oZ6lppyllpagq6eso6S3rKCZl5agl62qpsGfq6SWkpyXnpiUlKKenqOokpCZqKeyw6+aq52qno+Xlqmeq5yeoa2YoZudoqWvpaGkqJ6rmJemnZmaoZ6enLChnaKnlZiUmZSho5akn5ihjpaUi4qNj5etj3uVm4KRgImpqIWAmJaKhI6fiHuDkIaFmpGHhomVjpuXjpCYnqOWmZKQnI1+jWWhs66EiYR3e4+Kfnd5em9neZCBgIlrdYF5iHJpc395dYOHgWp0Y3hmX2hkY2Rmalhre3Fqa1xTTFBEX1VGQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVFZWWFpcX2FjYV9eXV1eXVhWSktMQklPTVJKOzw6Nzg2LzM5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LECzoLmvvqyrrbGyoKqmsq2irLOwxrCrraSzr7yktJygp6KhnZmXqKappqSms7WelZWdmZmwpq6+oKuikZGempmUkpahnJepnYWdqayitMezn6mkqpaWmJqnnqmcoKWrlJ+fnaCqrqiko6uhrJufn6CYpZ6cn5ywpJmfqJOYmZ2SpZqZqZ+bl2aDknxlfo+aj2N4jGxoanqQo6trZJmXfmeFimVlaWh6jaGOa2iMl5Gid2tqi5iin5hzbG56hIyGeVhlXYWCXmyLioJ2W2hzd3eRgIeCbniCeH9zbXmEc3eIiI6De2mFWF1qc2Rdc4hpa3xxbWNdUU5XSWRYQEo0PUY3P0ZENzE8PT9BQzs7REdISElMTk9SUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtJLjZaTzYpRVkvRE8xWUI7Py49pZ+6vLmvrLKwq6Wora6wp66tsL2xqqilrbCwn62YoKSeopqap6ycrKOmqKmzrp6Wo5CjsKa2uaWuo4+PmqGZk5KboJiZppZ7payiqLPDt6Wip6+fnpWeo56jnaSqqJKfoZ6gqq+pqaOqnqebpp6noKyWoZylsaSYnKuWoZ+bk6WYn6uZnn6+g4hytHKFnoWtaHe5xLhxkqGje6aYmHOqgnzLwMC7cYqjh4KefJaYiJ7AvYKWnZ2NnMHAe4F6kYyawr99a6Wyb4yBb8p6f5t3kYOOgHZ5gX95cXuAhnB4hYyTeWx1kWJlXnhkX2WBYl50aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BQD89NjQ2ODI2NiomJSMpKiYuKyopMTAfOSojPkhbTCojQ1AvI0ZbM1BZL1VBQjsvOJaiuMO0sK+/qamUo6+psK+tprK1r6ump6Wxq6CrmJuioJybqqeinauipamlpbSknqOTpq6suLSnr6KSkZmdpZKRoKGXm6Cdh6arpKutv7+xoamuqZeSn56imaOkqqOToKGenayup6umo6Gln6SknK2pkaSbqa2qnJ2rna2il5iml6KkmJ1/zpR5eqWBepaWm1+tj12OqICgoXynlZp0q4OAr15kjKl6qIeFn3SXkoizY4KrhqCNjbNqhK5zfJaHuGGCrVmjzW6QdXvbe3+ZcX6IknV/ZXuIdnZsfYdufYWQkX1rgI1fcGpvZmBfeGRccWhqY2ZgUlRTV15KT0Q1QUhFRDg+NjtAP0E7PThAPj4/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDpMLSFQQEY0LjGtwb+/tLSwt5iekaOqqa20q6ayra2spKymsKqhp5uappicoq+foZ+op6OmoZ+wrJuelqaurbCrqKyglJKbn6WTkJ+kl52no56upKuwqL/Gs6ipsa6Wkp6copehqqqflaGenZyurqapqJumpqOgqpKss5aloqqqnqSnp6KxopObp5uhm5WUkZegcIWMmHWEqIdxsHydcqx9oJ+BpY+ed6uCfa1/nHKtfquHhp92mJJ7fJd+qoihi5GLnH2reoiSjqCAeq1WnMR6j2+SwX2BlW11cIxtZndlhm9hd25yboiKkY+DbI+OZG1zdW9gZm1kX29oam5mY1dTXGBaUlJDOElJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkyNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLTwoPTEpM1ZARiEcRztDMS0rr9PFxrKzoJ2jjqOioq2utq+psaepq6iuq6umoqOdmqOWn6arn6KmoKmoop+esKyYm5eoqK+sqKepnpeVmqOikpShrJqdpqOvrKOstam5zbKtpq6slpWcnaKZn66snZahmZ6eqrGnqamaqqijoaqar7GiqKyvppmmq6qrsqSTmKSmm5WShaRqpHWJeql1erJxgqWJmIxwh5+ah6RfYFKrhH+ugpt1roKnhoafepmXhXtmgKOJpJiGgaN9qX6BlIauXnyoVZ2ikoF6o5+AfMOvxYxzr7SzuXFiqa/CdGiMjJeOgWyYkW5seHh3bmtmZGRxcGZ7aWNcVl9pWFhUTExRTENDQUI7Q0FAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dXAoZmrqKGvop+wtbCvqa2jqKeqq6uppKafm6WfnaanpqSdrJqjrKGkn6+inZuTqqS2sK6gqZucl5Wmo5CaoqefoKacsaajqLGstsiytamsqpWRnJ2imaCltJ2aoZScn6erqaKtmaqooaGpobOtoqqzsqKcqqiwsLellJekqJmdknyqbJ6Eh3WreXywboKki4iflpWelYHSt7S4yYCBsl5flKmDpIeHoHqYlZl4qslzmaOUp6iQkpqMfpqJmsbGd2WhgqVzgZ+Ogn2vXm+1Y7F1S6OGbadHgpNkjo+ckntvlZB9bnl0fHptW2VqcnFmgWpeYVhjbVxeWUlMTEtFREJCPUE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXF1cWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00TlRRHRw7PEYyLCSopMDGua2psq6spaKdsrmsqqGmm6imq6yppqCmpJiro5+urJ2moayan6mlnae1n6KXk6irtrKsm6acoJaQpa2SmpymoqCqpq2ho6epsLTCsbKqraiUiZidpZuipK+ml6GVmZylpamZrpyrpqSeq6O2rKCxubCenK+otLS0ppaYqaSboY+CnU54moF/n3qEo3yCpISGpp6cnpSEuHt8ebmCf8zGw7Z3m6GQi59+mpaXiXafl4qkmKSnfq+Em4OehKx9mZRhpWyjcI+FkIF9l4RyrGCkcnGAmmC8fVJVdY6Ro5Z7fJGOh3J5coN9cFxsbndyaoBuWmNfaG5iZF1MTFFTQUhHRkk5OUs+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUV1lZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1RGPEUyOlBbVBwbNj9HLC0gjIeZqaykq7mrr6CboayztKafoZWmr66uqaadpaWao6ehsq6iqaeyoJmppJSitaKjlZeiqrW5pJyjnaOTkKGymZ6bpqSgoq+tnKSoorWxw7Gtqq2qkYeRnKedo6SdpZeemJmZpaOnmK2hrKKkl66lu6yht7eunp61s7mytKiZn7GipZ+Hj9G1w7d5h46FkZOPgKZ4lKJ3i6CShaWCi3GrhoW0bnJpmaOclYmffJeZhoeQc66CpZuijKaKk5yIlJCabXCyXKVzk3qcbJl/e5l+bqlhonFxf59ic7K4aHePk6SYfYqLkIh2e3iNgWxod2l4c25+dFxkZG1tZWhgSlpXWDxIRj9UM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCMpJZJyjYqtv7+8u7Wel6ikrbahopmVo6mnrqmrmaWhnqahoLWnoqmnsKOUq6OOpK2jnZCamqq0tKSdppypkpSXrqCgnqajnKectZmhqqO1q8KvqaupooyEj5yioKajlpqanJibmKajpZeppqygo5uspr2slL6wrZ+jsLS7rLWonaqzpamZe6iRfXywd4qBpKWInG2yb6CHrXuhj4OolpmArImFroWglKihopeFn4CZlYB7kn6rgJ2Zloqqd52gj4iTkn95r12jgXymp2SegHyXdGuuXaVrcYWZXWBbjKBtlJClmIKTi5OJeHmBln5qbH1ifXRtf3lgZ2VwbmdnaEJZX1s9SlMyVDhCQkM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pXU1BPTkk3MDUyLiosQVRWVlZUVFVVVVVUVFVUU1NWV1dYVlVWUUhGSUojKCi8kpqEqcbDtsG0n5qtoK64paOOm6SjoK+uqZ+jnp2tmJ65oKKroK+qmq6hkaqppZaJmo+usKymoKibrZiZj62ioZ2loZmknK2Xn6iltqi/rqSpo5+LgI6bm5+mnpKUmZqUmpqko6OYp6qqoaOeqai+pZfDrKujoqyzu6yvqKK1saqsmXavfpCKnIWHfbqtiZhksIxlla19oY+Dp5abga2KhLCFppmjoaKRhaBbbGqBs2B/rXt7goCxbGdtmZeLiLFbfbRbpINryKJln4F7vFl2tVqyfVKvgHqsWIChbZeOp5mJlY+TlHl3jJt8Y3N8YYN4c398YWlmcG1mZWVPVWNcQVRePUgoPjk9NCEhLCQfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYF9gYWJfX1xbWFVQTkpHQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+0sbe9u7TBs6Ocraaltqmgi5mgn52zsaieop+dtJigs6iqq56wrZ6sm5WuqKKOiJuOr6yop6Ooma6Tmo+pmqGepZ6Zo6KlmJ6iqbKovK+lqJ6djnyLm5ahoJmQkpqbkZmXqJ6fl6espaSkoqSpu56gxqelqaKstbeur6ihva+urpeBqZKjro6bgIakl5iQgYC4w7qDjp2ThKeYnYKsioKviaecmqWrkX7VvcKqYqO/vXx+o4KD17q3tYWTkoKevb6EaqOBb6uEbp1/erKxx4Nrq7C9rHh3or67dICVjaWajZmOlJp3f4+ZeGF8eWOMZ3iBe2BrZWtqYVBiW1NpXEBUYEJMKTw6NS8fHyQeJTIgHSQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVtLSxv7qyvbOina6mpbOmnYyYpb+ptrCnob+mprGbnrGcuaifra6lp5WUr6yXjIOaka6mo6yhpZyqoJiKo5OmnqebmqCoopidoKysqbitp6Oal5N7iJmSppuTj5GYmI+YlKiZnpaop56ppqGiq7ueqcWjoK+jq7S1q7Gror2qsLCcdHaqpLeFZYmfcGesj4qPbW93pJCaoIF1sJqWcJCNcpaoo5uYrqRybG1sZYp4bm2CmXGAemlwaWaJlpWXcWhphYZncIZkXYpjaW9ZXWd+eKZgYnKPkm9mZICNk46hlpWWjpSbeoWNk3RkhndnjGp4fnhkbGNmbGJLZVdKa1k6UGREUCdKOisjHCAaIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola20qbq5srOqqaKunqSzqpiSvbHDx720qZ6/q6yjoKarn7qjpK2sraWOlq2qkIyFlZetn6Wqop+ko6CRi6WSp5mpmZajqqCWnKWmp6+5qquam5OSe4SWjqaXjpGRmJONl5Wmk52Wp6GZsKadoqy5oLDCqKSzpqyxsquvram6pbC5l4uhqaW1nImWopiGqZqQlJ2TqrOZm6OsobSXo6GeoaKcoaShlaynjJKTjIeSnJyUkJmTmJCOlYR/pJqXlY6Lk5KKj4aEfmeLgHSDdnSHjHGnbXyVkpSTgYGPj4+OnJKflJWUnoCFkotwZ452bol3dXx5aWtkZG9jVWBYQGlaR2JgTlgrRT0rJiE2NDAvHxwhJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlRRSkVDPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqS1t66uorCkrZ+gtrGQjqrEu8S5t6mhpZ2bpZ2wqKO2p52ptaankZiso4uIiY+cp5aso6GaqJ6ek5Wjl6iaqZmUpqGjj5qnmaG0uaeqmJqQjXyBlIyhlIqVkZWQj5KXpI6dmKeem7Wjnaast6ivwq6jt6ewr7Guqqu1u6KxvpmSpqSmtaKSnaaejamfjZKfo6ywm6GksqqxmaWhnaSrnp6dnJesnpKaopuUkJaqmY2YmJaQlp6Rh6CdlZSFkoyQjZWLgX5mjYd1h3Z5iIR0nGqHkZWVkop9jJaSkpeRoJGalJ6ChpaFeHGUcniJfnF7fmluZF9waWBbX1ltYlBgZE9ZOUdGRT0yPD04LyomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5eVpKejsLOsrqOpp62gqLWqkI+co7K6raqroaKZepyisKSlsamWm7imo5SYqZyOhoqJm6KQrp6klqigoZKXmZuui6qWj6iZqIyYqI6euLajpZibjYl5gZSMm5OKlZGUkI2RlqGLnJynnZ64o3+Dr7WisK90pL6jsqB4e6GstL2Wd66loIqAqX5kXGJ2n46knYOXfm6UtJyjqK+spGWfoJR0epqXcYCZqZhsgKOoimWcpZuQl5iWi5KbkISdmpCUg5KHjo6SiYV3a5CIdodxfIaBgGFpiYuVk4xbdpWRZ2iPjHF5opaWZHeXhoB2l2iCiYJueX5qcGVfdm9ra2dcZWNhYW9SWj1NTU5SRj1AVEI5MS8eHyY0OjMwNjY3ODw7PkBBQkZIQkdHSUtMVFVVWV1gaGdnWFFJPERHPDlWUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuppamtpKetpJKWqrSusaWZqaaql3OLna+fqKunk5a4oKCPnKSekH6IiJqejauapJWnop6Ol5GehXSuj4ilmqiRlqOIm7mzp6CZmYuJdXaTjZaTipORkJSMj5OfjZmepZibspaAjJu1nbSMko+9p6F+p6J7pLC5go6Pp5+Ei4WPsamvjImWopl5gYushpydoqirqYiVh5l3pZt6h5yBl6eCgXudsnqKhp+XmZSYloGQlpaEmZpjeYeQhI2PkouDbnGQiHqBcYCBhn+GdIeFlpJ4lmiTdKCadHuZgp2ahJh9kYiBgphpjIyEanh6cHBnZHdtaWxqXGRpaWVyW1xIVExRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1JYWlhbYWFoZllRSDlESzw+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZijn6aurquorKCosKenqqWZlK3FvK+glaWntJ2Pg5yrnKaioI2Qvp6ZjZ+aoZB8hY6ZmIisnaOWoaGSjZSJhoCRqI6Hopyjk5adhp65saedmpOPhXB1kImUkIqUj46bi46RnZCVnqOUnauHn7SJtJqui8qIq6+Jt4WNsIOysIWpjqeYjZ18qI9ye3ebjqaWaJWkebSLn5+nqZOZwoJ/q4iYoXGegJqlfZeFlbKAoX2gk5+PmJeAjpObiZiSi3yFk4aNlJOJg21zkoaAe3KGgYR9hXWGgpiBj8VmgKmHj6JqnYGel4CZgIqLg4iYb42ShGd3dHt2Z2h1cGdoa15ibmxmbFhmRlxRTDJFNDZNYWM3JjQ8REdEOjYzNjU4Ozg+PT0+Qkw/TklKS0NQWl1cV2JeamxcUUU9S01ASmRYXWNnaGdiYmJiY2NgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLmxqaummpSeoqSqopWkqbWir3+gppylnp2JlL2Zk42gkZ2PeYOWlpGIq5mcm5qihY+Md5ucjqCRiJ6km5WYl4aiuKylmZuNjX9ibY+Lk5CNj4yMl4uPkZ6Nkp6gmKCnfqGnh62doJaukKCenZGGgqCNrLGIpI6rmoyafqJ1gJiTa4GrdE2reIeNnZKbqamCqqt+hKF7eqdpnn+SbGeXhpi2iZ5+bmBjWIOXf4x7ZGeLc5l9eZZrXXyXbl9TcYVcYGx5g2BZZYJ+hIGYcaeqa4OjbnKlcJ+CnGdknmxabIh6ZVlfgn5hV1BvdmVtdHFqam5eam9sa2hXZ05dWEU5QDRHRF5rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSltdX1deX2J2YE1FOk1PTVRiXFtmZ2lpYmJkYWRkYmFiYGNkY2FiamtkYmRkZ2RiZ2VhY2iYlp2guaCqo6askaG2vKuuopmWn6Clq6ufnK20oaeRoJ+fppuZjZi0mZCLnoyVi3WBlJGNiqaWlpifnn6ThYaso4eckYqYqZiZmpGHpbCmopWZiImAaW6Ih4uOjomLjJGLj5Ggi5Kdn5uhpX+TgY+joZSgd5yWkKeDoqiAhquvhqV6i32Emn2icHKSh5Z7nox5bYebi5mRnKmcj4edfIKic3amZp5+d6RemHt9k3Oibpi3tLpzk4eBgLaoZIHGuHtwlbaMcYCbpGN0rKtgfWqds35ufYeDj4KLl3GAo2xzpHOegn2jXpyZs5Zve5ees3RyW56ygmlib3N1cWhuWGtrcnJkW2ddYUtEPUQ1UUFacTI8UkZfSlM9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltZWGBge2RJQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVo7mZq5yToI6luLWtraCaoZuio6Srm5qxrKqSl6CYoKSZmpSeq5uLiJJ4i4VwgJaNio+hkJOUnZd9kYqOqKCHmI+KkqKTm5qMiqinpJ6PloeEfmt7h359j42Di4+PiY6TnoGVm5+coJ+LiXecmKKNoHKii4ipiJynkZeprICujH16oJl5o5N4gHOXiIycfZafhpuOmZynh6NkoX2JlpCbjGyeaJqNbpqZe4CKp31yZ3Oqg52Cc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF6ndnaJioCdaJp1h5OSmI5/nm2ZkGqmmVyofne7an2pWo6EXbNnXG5xeHdraVtwaXd4YV5kVmFBUEVPN1ZCUm40SlpZXk5aREAxNTE7OzdIPzpDR1U/WFJYXT5EYl1WYFFhY3xpRUI5TlteWWRmWGZnbW1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZGNpaGdraZWciaq2m6iJY5WcrLqysKudpZuap5+drJmdsKeqnZaimaGfmZaWoKOZhomNaYiAcXuXiIyWloSSlJiPeoqElqOciZWPhoudkZybiI+oop+ajJGKgIBpgYZ5f5aMe4iNjoeOlZl+kqGeoKKTmHJon4qgj4xwkoyCqYiZoKSpoql9sK2koriXdqOzoqN/iJR4nXqrmn6ij56cmImYcqF9hY2wtX1rmpGheH6YtKOjq6iEmHuafJyafnOqWl1ve5eLeJ5iTH97e4VkephCTZ9ZompyfI5ugYqEmXabeYeJsbN/fpqSpnR+nW1xfJRvmXJpo12VdkhlY2BzcH19bmZfa2h1e2JjX1BdVlxUVkBZRVFnRVJWXGFYX0lEPUI4QEE6SUU4TEVYQVZRWlZERmFcWmBLYG19cUVDPFVeYlplalZoaG1vYmZmXmFgXF1eYGhiX2VkdmxeZWdmbGRlbGhoa2mUnYGxrpmEU1+hp7S6s7OomqKLmqmbnKeSoKujoKeOnp2cmpmVmKGdloeHiXeFgW55lYWQmot9kZOWiHKAiZKgm3KSkIGImZSfmoSOqJuZlYuKinyEbISFcYGhjHiFjYiHkZeTe5Gin56jiK6GfbWEj56de6aWeqmClp6Ri6Kefqdod21+mXOgc3F8nYWYb5OCrn2jg6efm4GkcF6paHWjY2+lYZzTj3x6mXhyc2OihY9+onKijnVrj7OLYIKYinOqsqe8f3eDbX+/pqq0XpxvfnKXb4FzonJepGd0pmBopmya05h6gptudnmXa5t5dpdybKmlZ19keXB/hGtnZmNtdXdmX2FRWmVQUWFIV0lUX1dTW2RqW2VRRkNLTEpLQkpFOFBAUE1YU1hPUlFgZWVpUmR4eXdJRkVjXWVaaGpTaWhqb2NqZmBjX1xdXV9pYmFoZXxkXmRnZGtkamxmaGxomJt/sKxUXEt+qa+ytbCyo5yYhJemoKCjjKSnn5eoiZmXmJOZk5Ggl46IhXtwfYRofY+Dk5qBd5GOj4lwf4ePk5JsmJR8iZGSo5WDjqqak5KLhYl5hHeIgG6BnoZ3gJKFh5iglXmSoqOZoImzoaK2i3qsp6SupXCpgJuRhoGdk32kgKKZhphxnoSira6Jl4uAjKSNlYOvopV2tba2yaJ0lIuCnmGel6lteZWGoJt1oYd3oH2QloqBb0xmo5JwmohzpXt5dGKDgmx+oGxyZGCccn90l2t7arS1tMamc5h+epxqmpqrdIGabHN3l2mZeXSXcVBEfbNeanVqeIdma2didHRwbVVcUlhnT1JoSVVMWFJVXGdrblVnV01KQUpNSkhKTkFRSlBkY2ltZXRyc354e251iXt7VFFPbV5oW2tpUmpoaWxnbWZjZV9cXFxfaWJkaGt7X11kZ2NqZm5tZWlsZaKciK+nhWY/lKGzrK+vtaKij3+Wp6Kho4ukppybpYGal5aNl5CPm5OOiIN5anmGZYOMfpafeXWPiIyCaYSFkoOMhZ2NeoyKlaWSgpepl4yRi4CJeoB9i3lwj6CGeYGUhoiVnpR+k6WnnJaWhGdueJxsomR8caV4nJhwaKeCmI18pHqgloOWcp92gImUlY+5bpCKomJ9maKWiW5zaqtrdaBtb6Zgm2mLkGmWh5qVdaKAfZpfi4WMdW+IYmihZZ5/aZt1cGRniIJucqJaX1tjoW5diYxwe390cmSlbniiZGanaJdyi5huoW9SiI9uoF5kp1SLXVSYbW1yanGBbXBoa3hza29RVlVVZVlTbUlYT1xIWGhoc2pZa1ZQUkVWXExYUmFVaGped3V6fHB8fHKCe39zdo2Ag3ZeUXNhZ2JxZ1BraGhrbG9oZGdfXV1dYGpiaWl2dV1cY2hjamlybGZrbWOdpZmmemV0bYunrqWqsLGmn4t/lqqcnaSLoaGZoaGAlZiTjZqPi5eQjot7hnGAiGiLinyXmnN0iX2QfGWDh5WKiZaZgnyIhZamkIGiq5CFkIqBin2AgI5zaY+lhH2Fk4yHl5+NhpGppp2JpniWnH6liZaMspmekYOvl5+leZeJeql0po+Emm6looyShIyDvG59pa+Ch4aHlJedoX2me3KolKCWZ55+b6xjloqVkneobKmigYl2h4J3q5GmiGuRsGt2s4ypbIuGb2+gnpGUYX+ri6p3gX+Op593n32FpJWdoGmah3WsZp6tjLZzdr6Mo5NZg6aNq2B1cXNve3VwYmp+bmhsU1VZVWBgXGpMXFFcSV1sbXZgW3FYW19aZ3Nlbm9xY3F0YHd6fnlyeYNyg36Be3uMgYKAdmJ5ZGRuc2RSbGdnb2xyaWZpYV9eXGFqYmxsem9cXGJpYW1pd21nbG5ilaaqnIGAnqSWqqqeqKeuo5iIgZaqmZ2jiZqknKidhIuaj4WckYWSjYyMdIV6iINvjYR9l5NzdYZykYNuf4uShoaUj317goWXpY1/paWNgI2JhJR1g4eSb2yLqICCi5ONiJueiIuSqqKgkIB0lJeIfoF5lK+kf4GccY+GeZKMhYB7cqeMcX19epeWm4SNeHt+foiUlZOLd5GZoKGEe36Ja4yFW3l5c3lwaW5+kopyf3SBj5STcYWDgmWNf1+BgIx3dnSUdW97b2+JboSGXndpeI5mgoOGj6qcf3R9l2qJiG9/dXyEdW1sZoxzd3uXd4Raald5j2htd3Jxb3d4b11shm1pZ1ZZXldcZGtkVWFUXlFfb3d5a2p3ZWpqanV8cHF0c2FvdWJze4F4dXmBdX+Af4F5i4WCfXttf2xkeW5eV25naHVreGppaWRcYFpjaWVscXVuWltia2Rsa3ltaGxvYY6Vuamni6Gim6akmaSdq6Kfg4OWqpGdoIiZppqomIOBm4t+lpSHjoqJjHKCfI99fo+EepeOdHKEcJWGe32Si4aGkIV4foCGmKOMe6ehi4WPj4SVgoaOmHdxhKqFjZGcj4eenYaKmqifoKqDiY6Vm39+ipetqJCTp5B4cZ6Tg3uTcH+phnB9lXFqb3yBn4t/ko6LaG5dhIyMnJygj3OWjIhxdGuCdnSAWXJuhpGCfn6LaV1pY3qFg4iAX2l4e5x8g42DdoGHg2l5jIhrYnFyg3dfco2CipColodnjY+DbneLgm+Di3duZGZjeYJ6lVpbaWZtdlt6eHd0bXNygmZcbYpra2JZWF1ZWGtxW15gWV5dZXJ9enNvdGNqaml7fHJ6d3RkbXRobHt+dXp8e3l5f4B/cIaKhHt9c356cn9oVFxyaWx2cHVna2dkXWFZamhranFybVdbZW1sZ3J5b2hqbWCMjKqxoZCjoZqfnpiemaiioX2ClquMnpSHmqGQpJR/e5iEfJKZiIiGhopyfYCLdoWLgYSWinJvgHKZh4R+koOEhoqBeoCEi5qfj4KmoId4jZeIlYuLnJeEg3qsgZCXmZOJnZyGh6Gqn6Gio4uIk5udo5mWqqKop6GTnImYkHx5j4+FqH5+kpGSk5yxpZqUnZCNsZKYhKaMjJacoIqRnIOJkoprfI52d2WChpCKfYmdhIeLj4eIgIWEkHd8e3Wbo4mIi5+LhpV/fo2CgXZxdIaFf3iJiIuRp5GEh46Ig4yQi3uFiYeNf3VqgYN7eZlpcWhgc4pwfXp3dm92c4FcXm+HZ25fXllaXFJncVVjW1thbGh0e3xybnBjamlof3tteH5waG9wbGaAe3KBgHd/fX+Ee22DjIZ8enh8fnqDeE5kdmpzbnF7ZWtlYmJgW3NmcGZycWxVXWx0bWh4enBnaWtljYieup+WoqGYlZmYlJikoJ16f5ipjZ6MhZ+cip2WfHiUgnuOmYmGg4SHbXiBgHKAh36Ik4RtbH56l4eEg5B+gIaEhn2Hg42bnZGGqZ6CcYqPhZKRi5yRfY16qYONkZeVjpyWhYWbpp+imp2Gg5KamZmQmaagpp6ekJeCk4t4fYiPhaZ8fI+QkYWYqqCck5yPjaqNkYCejYmUm6CDj5d/h46DcHiGcXRhfoSPhnWMmICDj4KGhH6FhJVueXZ1k6OMjoabhYWOdYCMfn1yc3yJhHt5jY+Fk6iQh4SPgoOJiYh1hIaGiXptan1/em1oa2xmXnl+Z3x7dnR1dXp3XGBwfW11YGNaW15RZm1TZVpdYWtpdXp+cGxsY2pqZ4B/a3J/a2pzbnhug3luhoB2goB9hXZygo2Hfnt6fH97gotgaXtrdWhpg2VqY2BpW2N1aG9idW1rVGJxeWVveXpyZWptbYuKn7iaoaSfkpGWl4uan56denecpZCbiYaklIqYmXh5jYV8iZGDjIKCgmx7f3hygIV9ipB8a2h9gpeJgYiOfH6GhId8j4CPm5uQh6acf3CLioyShqChioWMfKeQh4+SlpOWknaMo6ChnZaaf4GQmpmTjZqioqSbmJGcf4+GeoGFj4ihgH6MjY98l6SgoJKZkJCmjI+BnJKKlJicfpOTfoeOgXZ0gnB2YH2AjodyipZ8iIxxjH6ChYWPaXhyeY2Zk5CAmH+JjHOCiH19cXp8jIV7e5KOhJemlIyGkXyEhYaEdICBhYV4ZHF6fnh5cGtqZl59c2h8dXVzfHN/al5gdHZwd2RjWF1eUmpoVGRYXmFoanZ4gXFma2NsZ2V/gGptfWdtcGp9d4V6a4uBcoGBfYF0doKMhn98eoCBfX+PanKDbnRpYohpbGJfcVV0b21uYHhobFdqdHZjdHp6cWJrb3mJjZ+zkqWlnI6QmI+GnKCam3t1o5+Nl3+MoYqImpV4e4aHfoOJfoiCgX9wfnp0dYKFfomQd2djfYaXi4KKjXh9gI2DeZaAlZeVjZWfmn1vi4GQk4alm4eMiYOmlYSSipWXkpF2kJ2hoZiUmHp/jpiXj5eanaSemZOUnHuRh4R4hpeOnn6Cio6Mc5einqCSmI6PooyLg5iZhJOWmn+YjXyJjYF3cn5ue2SAfIuGcIaTgJCCa4eDgYCJhWZ2b32Ik5mOfpR5jIl9gIh9fHKAeYuGeoWSioyZo5eDhIx3h4OCgXV5f4aDc153d3xzfXdma2NgfmlqdnN0dX1xfGNjYXNudXJtYVlfXVprZFJiV19gaWx1eYZwYmpjbGZofINraHRobG9of3yBeG2PhnGAgoJ/dHyDjIGAfnqCg358kG11iXR0bWWKbGpiY3VWg2lwbmB4Z2xhanZwZXh7eXBfcWyFhZCdrpimqJ6NjZeHhZ+Slpd8dqibiZh5lpyLjJiPeHuAi318g3uAgoF4c3h5c32Ag3+IioBkXn2LlYh+hYh0fX6Kf36YhJaTloyjoJd+cYd7k5GKpo+MjoqSoJGDkY+Tl5CKgI6XoJqSkJJ0gI2SlImdnZ6nmZiOlZh1j5CLbYaZkJp7h4iQiW+XnZqik5WKjZ6MhoGTnYCTk5aHmol8ioqBenJ6a3VsfH+Lfm6FkoOUeG+ChH5+i4Blc2p9gZeYhYCOdJGJhHqIfnZ4gX6HgX2EjoaNlaWReYWCdIiGfH9yc3+FgWxfeXR4cHtuYW5iZHthbm92c3d3c3NhdmBvbHVub11bXl1dal1PXVdiYWhtc3qJa19pZWpjaHeIbWZsaGlsZ4B8endvj4dzgIOEfXSBhol6g316gYR9fI5yeYt5eG5sh2toX2lyY4docW9ldmdtbGF6aGp8e3dwYXdti4GZmqqgpKidioqRhoqdipSXfHasl4yWfJ6TkZaUiHZ9e4p8e4B2d3+Ab3Rzem+FfYGAiX58YVx+j5GGgISEc3qAhnqPkYeRkZuSpJqTgXyBfI2KkqOIjYqNl5qNhZGYk5WOiIiLkp2TkIyNboSQj5GJnpmioZeXiZeScIubhWeHmo+Ue4mFkIpwlpqUoZKSiIuZjIJ/kZ99ko+TjJqPe4qFh3RzdmtxbnZ8i3RuhpGOknF0gHyBgoh8ZXFten6blH6FinWRi4F0iHlugH6BiH2FjYqGjpaqjnuIfX6KhXd9b25/g4FiZ3dzdG56YV1vYGp0XnBqenh4bHJwZXldbWxzbXNYWl1fYWpaT1dXZGNmcXF/iGVdaWhnYmdxjW5kaWdlaWeAend1b46Ec4GBg3x1goiFeIV8d4OFeoCKd3+Le3tyeYNqa19waHN/a3FubXFnb2tle2Juf3l3cGt2d4l/o5iiqKGmm4iMioGPnIaSm3SAqZSRjYagjJWTkH9ze3aFd3h/cnN7hWtyb3ltiXZ/gIZucVtZfpKNiICBgXZ1gH9/oIaPipGcl6CTlneJfoCMiJydiY+GkpeWhYiUmI+Wi4uMjYydio6QhG6Ji4+RipyWoZyYloaYiWyGpYVnh56Lkn+MhIyBd5OYkZ2RkIiJlI1+fpCZfJGNkI6akn2LgINvdnBsbW9we4Zpc4OOmIpwd4B1gomDeWdzb3aCm499ioV7lZJ6d4l0cIp8h417i4eFio+cpIl8hHaBin93d21qf4B/XHFycW9vd1ldb2Bval5vaXx6cG1tam13YHBva3FtWVhgYWFtV1FTWWVmYnVwhIJiXWttZGNma5JtYGZmX2drgXRxcnCLgHR/goB5doCLgHmGf3eHhnaDhXuHjIB7dop/anFifGKFfG9wbHRqaG5sdndfcX54e3R1c3+CfqWVmq2fp5aFjIN+lpSCjp50ip+TkoWKmoyVjYt6cnd0gnByhXNxdYhsbmx1bYh3g31/bW5VUYGrlIeCeYB2coJ5gqCCkYGSkZebkZl3kHqCjJKkmpOOiJSYkoOGlpiLk4uIjo+InoSQinxzi4WIj4icmZ+blpWAlIBph56JaIehiJOFkYSKcYORl4+ajo+Mi4+Nd3uTkXuOi42Sl418iHyBa3dqbmtsbXp/Ynl+jpaBdnqBd4ONfXpodW11iJaMf4mHe5SRcnuFcHeNe4uNe4l+hI6Rn5+GfX14gYp8dm9oa3+Ad153b21rcHJVXW5hcWFfbW55cGdwZmZzdWhxbGF3ZV1WZWBgclNQTltlZFx4cIh8XlxocWJiZWaRaV9nZFtnb35va3Fzin12fYWAdXZ/jHl7hoB4iINzhoV+jIyEfHmVeGZxaoNfh35vb2t6YGltdH90X3N8eIZ3c3OFfHmhkJqxnKWOgop/gpmIf4qcfoqYko6EiJeOjo6EdnR2c4Bwb4VzcHGDb2ppdW2Cbn18bXVzUk6C38mS1pN8b3SDdYOfgpF2lJCYm4+Ye5NyhZCfoZOTkImSm5OFfZWVh4yNh5KNiZx/joF4eox/iIyKnJucm5aUeo53aYqTiW2JpYaTiZiDhmOMkZiNlImWi42Ji3B6lYl8jomLk5GKeoV8f218ZXNva2x6eVyAeY+OgHt9fn+Gjnt6aXVrdIyQioOGhn2WjWx/gHCCjYCOiX6Ee4ORlpubjH13eIKPeHJrZW59gWtpdG9naHNsU15vZHBaX2xyd2Zra2JneHNvcWRfd2BhVmtfXnVPTUtgZWNceXGKdFxbZXZgYWVljmNgZmJYaXJzbWtxdot8dHmGgnZ3fotzf4Z+eol/comHgZGKiH1+mXZlc258ZYd/bnBrgFprbnh5cmB2enuNdnJ2inZ5n4ybr5ugkIKFeIiUfnuInIaEnpCOhYyXhJOOh4F0d3B5cG6Eb21ufnJjZHhwfG56fGpobGOkmsHcru+ic2t1g3WEoYSRbpWPlJ+UmoGRcIWLo5eJjpWKkJ2Vg4CUj4SIj4CSioqXfod7dX+JeIaFjpual5mPkHaLd3CIiox+jKWFkoqdhYZei5SXiY6IjouKhIlsfJeCfYiGipGPhnaFfn5rfWN4dGpveHNYiHqRh4V6f3+AhYx+emZ0aoGLj4uEhICMmIZsgndviZKDkYV/gnuBkZeUm5F1dHiGjHVycGVzd4Bgc2xvYWh1ZlJgcGdrVV9udHlhcmNgaX1xcm5bY3JhY1duWlx3TExMY2VhXXZzim1bXGR4XmBkZoRfY2NeWWlya25rcneLfXN3hIF4eHyJcYOEfH2Ie3SLiYiVhox/f5hzaHVxeWyLe250cIBXcHl2eXFkdniGjGh2gIlxgJ2Imaeco5KEfHCMlHd4iZyDhJ+NjnyVjYCZh4R7cndwc2pvgWtpbHx0XmB4dntwdHpnYGV869q1ycPciXNsc4B2ipqIjGmXj46clJKBiHCFiKCOhIqVioyXk3yNkoiCiI96kYuGj4KAd3iDhHKHgpOblpSYho12h39xhoOKiJqkhJWNn4SJYYOVj4WIhomMh4CHaH2Uf32ChYmOj4Jxhn9/cndndnJpdHdsWox9koKFfYCDgISKgnZidW2KgpGMg3+Ak5J+boNteoiRiJOFfYJ+gZOUkZiKb3J6jIV0a29pcHZ+XnNoblxpdV9SZHFoZlNfcHZ0YG9gXWiCcXJqV2dpY2lYbVdbdExKTGVmXmFyc4VoW1xleV5eZGd6YWRfXVlrbmVuanR3in5zcoF+e3Z6h3SFg3x/h3d2ioWPmIGNgnuTdmx3dnl4knVud3p9WHmFcX9uZnh2kYJkdoaFcYqWhpmhm6KKhnNvkotydo2afImZiIl7n3+EmX+BeHF0bm9kcn5oZmx3d1tfeHt6cXF/aWFnYX/Vto6RpnhucXd7cZKQjIZqmI2Im5GLhntoh4uZhoGSkIaGl417jIyAgImNe5CNfomFenV7g3txhoCVmY6SlIKJdYSIeIWBjJWeoIeWkKB/iGF/k4eDh4OJjX9/gmZ9kYB+f4KMj5B/bYN8gnRrbXd1dHd2a2ONgY5/hH98hH+FiH9wYHRyhn2QjoN9gJKKenGEZ3uFjIiNhHyFf4GVkJKUhW9weYt/dGxtaWp3emFnaWlYa3VaUmlyaWJQYnJ4bGJlXlpqg25zYlxnX2VtX25UWm9OR05mZFxmbnKAa1pbY3NfXGNsd2RlXV1abGxibWpzdoaAcW9/fH10eIZ4hYN8gIh2eImBkpV7iYZ2iYFveHl7g5JvbXuAdl6Df3OBbWh6c5RzZ3OHfHKSkYSan5ughoZ1dZR+bXWSln2HkIOKjZl8jJp2fnZxb2xqYXR8Z2JpdXlaYHd7eW1xfmVjaGhXnY9fcnOXvMSEdnGUiI99cZaLhpuSjIdyaoiPloB7lIyBhJqMfIqFfHuJi3+UiHWJhnZ3fYFydYaBnpSFlI+Dg3KAinaGfYuanpqHlY+dgYlmfZOCfoSDiYlygX1mfox8eX9/h4uPfWmAfYN2Zm95eHN3c2xrjoWKgYqAeIKBhYSBa19zeXt+jouGfIKQgX5zgml6hImMhoV5hH2CmY2RjX5ubXuIfXZ0bmZle3RiW3BiV25xU1NtcmhhTmZ0eGZgXl1Zb4Bvc1llYl1qbmBwT1lrUURTZ2Baam5tfG5ZW15tY1pib3dkZ1xdYGtpY2xqc3aBg3Btf3x/dHWDeoOCfIGFdn6IgZaQeISLdIGIcnl5fo2Qb297gHFpgXh6fm1se3WVa2p4hHRrk42Fn5igmYSIbn2Mdml3l45+gImClJeJeY+Wb3pzcGxpZGBzemhfZXF6WmByfHlncXphZWWPsbJ3S2JapdnQlnF7kIqPd32TioSYkYyFbmuFkpF6eZKGgYSYinyGf3h3iYqEloBvi4hxdX56anmFg6WQhJONg39vf4R3hXqHnZqVjJSRlYWIcHuSgnyCg4iDboF3aICEeHJ/gIOKh3xlfX6EdmNwc4BpeXBvdZmNhoOKfHZ4gIV6g2tccn9zgomGin6HinuJcoJucoWIj4aGc4R6gpqNjoV5bm9+hH92emRmaHtvXlh2WlhwbE5XcXNmYEtsd3RhXVxaWXR9c29XZ11manJgb05XaFI/WGZeWnBraHpxW1pZa2VaY3F5X2hcXmVsaGVraXF3f4hvbH9+gHVvgnuAgn+Cf3aBhYiXiXGCjXF7hnx6eYOTjHVqeX5rb350f31vcnt6k3BvgX54Z5KLg6GZnJGChWaGg29neZWIfX6EgZiJgXyNjGh4cmtsZl9gb3ltX2JveFxka4J6YXF2X2Vl1Oq9izI6PouOf3F4hYiOjXaClYx+ko2Mf21shY2MdXyPf4WBlYh8gnhudoeEg5d3boiFbHV7dGZ5goOni4KOi4R+boB2eIV7iJ6SjZGTk46Lh397koZ3foOMgmt/cmiAfnhtfHyCioN3YXmEgXFkcWh+bnVxdYKbi4B/hYBzdX6Bc4FvXG5/dXmLhIt7iIF9iXh6cm2JhJGFjHOCeoCXjIuAdW1rdoCAdXRbZ2d1bldWe1JZcGRLWnJyZVtJcHhvXFtbWV10fnRoWWJbZ2ZvZGpNV2ZRPl5lXF11ZWB1cFpZVG5kWWRxeVpoXV9mbWdpa2lwd32ObWmChH55boB8fIF/gnp1goGNk4RwgItud32Ae3uHkol/aHt9anN7coV6c3d+fox6eIR9fGuMjYSbnZaMgYBsjX1raH6Ni3p+foOTgn59iohrdXFnaGJbYmdzb19ha3NgaHCIemJzdF5jZJugj25cNVqvtXRpgIh8koZ1hZWFc46KiXZwbIWDh3V5iXiJfJOIen5yZ3WJfn6Yb3GGfmh2eW5meYeEpIeAhoyJfm5/d4GCfo6biIOVkpmKi4WJfI+IcHp9hHtofmxqgHt6anp3goeAcmB3gX5xZHJndoJtdXuGlZGBfIKBb3d6fHV/bVlwgHd1jYOHeIh2g4l6eHNvi4GRgodzf35/lImKe29uam2BgXRtXGZkcnBQWnpNW29cT1tyb2RVS3N4aVdZWVphcYB0YF1dYGdkaWlmTlloTUBgY1tgdWFddWxYV1N0YVpkb3JXal5iaGtnbWxocHd8k2xohIp8fHB/fnuBf4J6d4B/iouDcXuIb3F3g397iYyPg2p+e213eHaKd3x4gIGHf4N+fnpthIyImKONhIN6dYt4a2yDh5B4fXqBkYCAfoqDcHJwY2ZeWWZfb29fYGdwZmpviXRhdG9bYWRqdnuAv5ympMi4cYWDcpJ8eIaSgnOQi4dxcm+De4N0dId0iHeUiHl5cGN3h3qAk2lyhHZnd3VjanyCiJ2Bf3+Oj31zgHWGeoGTkYR6l4+WkIiCiHuIiGt4eX50Z3poa395c2l6doCDfWhgd4d9amp0aHuAaXaBjJGUfnp+fnB8dnx0f2JWeH5zc4uFgn2EcYeKd3hxcYSDjoB/en59do+GhHdqcWlsh4Fxb1xmYXFtSWR1S11tVVNZcm5iUU90eGFSWFhdYW+Cc1thXWhlZWRrZFBbcElDY2BbY3BeXXdoVVZVdl1bZW5oVmteYWlnZW5uaHB3epNtaYiMeX1ye355goGBfHV8g4iGg3B3hHJtd4KCfomLk39wgHt3eXqBi3SDeH6BgYKEeoB1b36Ki5ueiH2FeneFe2d0hYyPeX5/e4iFg3aPf2dvbl9kXFhlWW1yYWBgcGxraIluYXRpWV5kboB3qdqqx4aHsnGJd2+MdXuGjX96kol/dHN0fneAcHF/bYR0lIZ4dWtgeoJ5iY9mcYRwZ3ZuW218gJCTf4B5kZN+eXxuiXeCko2FdZeLko+HhYZ7f4RsdHZ+bWd2ZG17dW1pd3Z/f3xhYniGemh1dWJ9e2d1ho6NlXt0gHZxgHt9bYBaV3V/cHaFiH+Aem2JhnR5bHaBhIV/fH55fHSLgn50aHRlboqDbHNZaF5zZEdtbUtaYVdWVXdtYlBSdHZYUFZYXmFxhG9cYGNtZGReb2NUXXJGQmVfXWZnXVt7YlFVXHVbW2drYVZqX2BuZWZrcWhwdniOdGuOjXV+dnh+d4GDgXtzfYOIh4NvcoB0cXV+hYGJjYp7d4B4g3t8hYd4h3x9gX6EgHt+c3Z5jI6gjYl6iXZ0g3hefYWYi3iGg3SFhoR3iXpibmxbYltbYVZpc2NgW2dub2aHcWFxZlddY2x/fMrOh7mham1timxxhHF8g4l+epCEeXhzeXV1e2psdmOEdZKCd29mXn2CeouKZXKCa2pxY1hteoWbiIKBc5eUeH99b4lyhIuNiXOYj5GJhouDe3l9cHBvfGZocWJteHFqa3F4fXx6XWV5gHhpdnhmgndndIeMjpR9codqb36BeW99Xllzf251gYt8gm9wioBxd2l4gIKAgnh+c3t1h317c2dzYW6LgWtxV2lddltHbWpMVlReU1V7a2FPVHVyUFFUV15idIVpXWBsamZjWm9hWGNwR0BnXGBlXlxWe15OVmVwWVtqaF1XaGBecmZrZ3FncHN3hnhulYp0f3p4fnmDh4B1cX+GhY6DcHB7eHZ1eoaFh4yGenx/dIt+fYaEhId/fn59h398eHZ4eJGTn3+MfYttdX94ZIKGlYVzkYpvhYWBeoN0Y25qWV9bXF1UZ3JkYFhkcXJmgXNia2VXW2Bqf3e+rnugtm5ic4Zoc3txeYGEen2Lfnd3cnZve3Zlam9gh3WOgXNqYl5/eHmLhGZxf2hra1pWb3eJo4GEf3GZk3KBeXaEb4KDk4l0loqOiIWJhX14dHFuaHhfamxfbXZqZ2preXd6dlpnfXx4ZXN+boR0ZXWFjYaWf3CMZ2t6hHVudWJdcX1sdX2Me4Jmdod9bnFpdn95f4Bzfm17fIJ7eXFmbGJtiX1sbVVpX3ZVSmlqTlFOaE1Ye2hhTlV2a0xRVFVfZnWDZl5gcWhnYldpXVxraEpEallhZFZZVXlZTVZtallda2RcWWVjXnRmbGRxZ3JwdYF4cJmFdn9+d398hYd9dXKCiICVg25zeXt6c3KFh4mIg3mBfnWPfnyEio6EgoN6fouDe3Z7d3eanZd6iYKGaXZ9e2yDhJJ/cY6BcIWCfoF/cGZsZ1hdW1xbU2RwZF5XYnJ1aXVwZWViV1xcaIBwb3KAc4lkZHh+aXR1c3KBg3eAg3l2c3Vua3pxYmdrZ4Z0jYNuZl1ffXB7iX9pbXlnamRVV3JvjaZ8hHt2lpF0fXN9e299fJKHeJp9iIaDhoN9dW9xbGd0XGxnXmx0ZGdlaXpve3JZaIF3dWhwgXiCdmJ3hYt8lIFvjGpte4JxZ3NmYW56Z3N4i3x+YneDd2pscnZ7cXt6dH5nf3+AeXdvZGZiboV7bGpVaGJvUkpoak9LTm9HXXtmYU1VdGNKTlNXYWp2fmVdZ3NpZmBWY1dicF1MS2pYY2FVVFVzVkxYdWRZXmtgXFpjZV92Z21icGlzb3J+dXSZgnd/gHd/f4aFenx0goR+l4VucnR8enRxhIWPgYB6i3Z0kH98gZWOgIWEfH6Mhnt+gHZ7o6WKeYiFhGt1fHp1g4CLem6Ec3mEfYGDdW5qaGVWXVtaWlNibWRbWGFze2lobWlgYldfW2qAamtwgGdrYGh5eGpzdHNtg4B6f3x1dW56aGp5al9lbmiBdpCEZ2VYYndqfod7b2pwZ2ZdVFhvZ46od4F6fJGOenZxf3B0d3qQgXmWdIWDgIWIdmpxdWdnbltsY11tcl9nYWp4aHxtW26CcnRqb4F+endhd4WEeI+Fc4hyb3mAcmNxaVxxeGRydIl8eWN0gHFoanp1cm15eHZ5ZIR8f3l3cWRkY258fGpqVGhhZVNKa2dPR1FrRWB4ZmFNU3FdSk1UWmVrdntlX21xaWRdVmBWbm5XS1NoV2VeWE1VbFRKXHlfW15rXV1bY2VgeWhsYG9vdW5wd3V6mH13gIF6gICHhnp4eYJ+gZOEcXR0f3l2dISIkX2AfJBrc5WAe4KfhX6HfYB/hoKAint2hKuff3qIh4NrcoF5dYB+gHRuhm58gHOKgGpvbWRkWF9aWVpUYWpnW1pedIJpXm1sXGFXXFxsgWVydH1paVxrdnVnc3ZxbIR7fXx4dXJseWdpeGZdZXNneneTgWNjVGVwZ4KFd3dnaWpgV1ZZZ2OPp25+d4CLjntxcn5oenB7jn14kHGEfX9/hm5kdXJkZ2dcamFcb29cZ19tdWR6aF10gG9ya3J8fnV2YnSFi3uIh4GAeHJ1f3VhcG1bcnRjcXOFfHVlc4BtYW17cGtqe3l2c2aGdnt7dnFlYmVtc31pa1NnXVxUS3FiUEZWYUdidmZhS1RvV0pMWFhna3V6ZGVucWZkWlddWHZlVEpcYldnV1lIV2VQSGJ4Wl1fbFteXGFjXn5pal9udHhtcG52g5d5coGAfH+JjIZ+dXWGeYeMfHR1dYJ5enqCjI59foSJaXOWgXqKnX1+hXqBen98hohzcY+tjHt7h499ZHGHeXN8enVyb4Vse35sj3picG9iZV1lVllZV2Nma19dXHKFaFhwblteWFpcbHtjcHd2bWJabHNzZ3R1b2yDeH5/eHdubnRkaXRlW2d1ZnZ2knlfXVJmZmqDgnR+YmRpXFRXXWJjj6RoeHSDhpF5bXB7aXlufIZ8dolzgHh8eH9oZHZsYGZfXmleXHNrWWVdb29iemVbd3xrbm5veHlzdWRzg5J+h4OJe3dwcn5zYnhkXHBwYnFygn10Z3KAZV5ud2llaHp8dW5vgnV0fXRyYl9mbm58ZGhTZ1hXU0x2X1BKWVhIYnRjYUlUbVNKTVpXaWxxe2JtbHNjYlpaW2F3XFNMY11YaVNXR1lgTUZpdVheYGxbW19iYlyEaWdhbnh5bG9qdoGQeG2DfoCBk4iEgXZziHSMhnRydnWCd3x9foyQgH6TfnB3lYN8mZJ5gIB4en6AdIiDdHCYoHp7f4mUeGN1h3hzd3RrdG9+a3h8cJFyXnBvYGdibFRaWldoY21mXFtxiWVTcm5bWlhYYGx2Y2l1amleWW1zcGxzc3NphHx+fnt2b25sZGlxY1trcmR0do5zW1dTZWFygH9ygl1iY11TWmBcY5GfZXFxhYSRdGxse25wcXt9fXGBeIBzenp6Y2V1aF1iWWBnWl52aFdiXW9oYXdgW3t2aWpybnhzcnVocYKVg4d+hHZzanF9bmZ3WF1sbmNyc4F6dGdvfltgcHJiYGtyfm1tdX9zcXhrcGFcZWxseWBmUmVUVlFPdFpRT1hRSGNzYmBGVWtQSVBaVWtra3xlbW9xYltaWFlscVdSUGZXVmhTVEZaXE5IcXRYX2NtY1hgYGFdi2pjZG15eGtwaXV5hntrg31/hJp8goR5fIduj4dyb3Z6fXSBgnyLj4KCl3R4gZOFgZ+JdYGAgXR/gnGHgnVvoZZze4aLhnpld4pubXpuZnhwemtzdnKMa150bmFnZWtSXVtVZ2Fsa1pccIxkT29uXVZYVWdpdGhidGVlXVltdG1vdXR4aoZ8f3uHdo9zZGRrbmFcbm1jc3iHa1pUVmNkeH19cYZdY19jU1pfWWKVlWNucIOFinRraHxwZnR4dX1senV2b3p+dV5lcmNbXVZhY1hhdGVVX2BtZGFxXV1+cGhpc3F0cHV2a22Ek4GJe4Vxc2dwfnFzb1RcZ2tmcXSBd3NjbXZWYnJsW19wZ35mbXd+c3Nza21gWmRqanZeZlNjVFVQU2xWUFZTT0dkcl9hRVhpT0hXVFZtaGR8aWt4a2JXXVVbdGRTUldoUVhlVFNIWlpQTXd2Wl9lbGlZYmBeXo5uYWZreXVub2l2dn9/bIOAfYeXe4CHgYl+a5OIcmd0gHt1f4J9iI5/i5NyfIqRhYefhnt/hoxzgYZzfoJ2bqSLcoGNi3Z3bHqMYGR7cGZ6c3hsbXF2gmdke2xjZmdoU19eVWdfbG5bXm2NaE5pbWBUVlNuZ3RrZXhkZFxYb3NscXp3cmyHe392m3p5a2FlbG1eYG9qZXB5fmdaVlhgbHh8e3CEX2JeZ1ZYX1djm4hia3CBh314bGt5blx3c217aXV0b297gHJYaW1eWFxVYWJXZHBjU15haGFibFpgfmtma3N2b213d2xphYx/iXuIbXJncX1uc25kWmFpaW90gnRzXmltU2VxZVVjb2N7ZHJ3fHdrcG1rYFlhZ2h0XGRVYFVSTldkUk5bT09HZG9dYkZZaU1JX0tYbWRgeGlufmRgVV9UXXVcVFNgZk5dYVVTSlxZUFl0dV1fZWxoWGNhW16NcWNnanhxc25odnR6g3KCg3qIjn58iYeNeW6QinVsc4J0f3+HhYaShJWPeX2Mj4eRm4SAfIyFc4CBc3R4cm+Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjIyMjIyMjY2NjY2Njo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjIyMjIyNjY2OjY6Ojo+Pj46Ojo2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA+LjExMTEvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREFSzNrY2NjY3Itpbm5ubnFJLDAwLy8sSYWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMjy0aHR0dHBpohYKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1MkbY6ufn5+fri2JnZ2dnbDwYHBwdHRg7g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt9fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYiIiIiIh42QkJCQkJCMh4eHh4iHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFhpOUlJSUlJWNiYqKiomKhoKCgoKCgoSKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l7ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46SkpGJh46KkJKSk4+Ojo6OhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ni4uLi4uMjI2NjY2NjY2Njo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fH19fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCQh4qJiY6IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI2Eio2IkImLj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCRiYKIjIiPh42Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yOiIiMiI2Gj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX5+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjZCOjI2LjYuOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomHgoeNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYWEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f35/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z5fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjI2MjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ0dHZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaWhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3l2d3h4ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw+PjxFRD4/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXV4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5OTs7OkA6Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTU1NTk9OTk1LS05OTk1OTkxUbnBwcnR1c3Fyd3l5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo6Ozg5Ojg3Ojw5Nzg7Oz49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VzcXN4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw5Nzk6Ojk4OTo6Nzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PTw+Pz08PTs6PD09PTw8PDw7PDo7PD49Pj9AQUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcXF1dXV1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NDQD48PT9APz89Oz49PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBwcXNzdHR1eXt7e31+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRUQ/PTs8QD46Ozo6OTc6PDk9PUA9Ojw7Ozw7ODo7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHFycnJ0dXZ6e319fX5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/P0FBQUJBQD08PTs+PTo6Ojw6ODo4ODo7PT8/PDs7PDs6Ozs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBe05JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0A/Pz9APT8/Pjw+QD89PT0/Pj0+Q0Q/Ozw9PkA9PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0hFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbHBwcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF9UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENEQT9AQEA/PUA+PD0/P0BAQENAQD9AQD49PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkJDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAQUA+Oj48Pz08Oj08QEJCRUA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdERUZGRkpOTktKSUdHSEtMSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGAgICBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QERFRD88QURFQ0A9SERBREREQ1d1homKflhHSEpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhGSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQUNGSkhJRkhISkhGQUBfaERCQVV0h4mHh4aHgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMS0pLTEtMSFRfaHF7V05shIeGhoaHh4eHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJS0lJR0hJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3V2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0tLS0xMYFhnf4SGhH55f4aFhISGhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRURCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhHSUhLTE9teYOEg3+AgYSEhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5AOzk5OT09Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp8e3x8fn9+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQEJGSEtIUHWCgYCCgoKDg4OEhomKi4uLiomKi4yJVDs4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Nzc3ODo3Nzc4OTs3Njg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PERCREVNdoF/gYKDg4KDhYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo6Ojo6PDg5ODk3Nzc3OTo6ODg3ODU4ODtBPT4+QkE/QUtMT1FQUU9PUFFXa3JydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc6QTk8RE54goKDg4SEhIaJioqIh4eIiYqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw8Ojs8ODo6Ozo5OTk8Pzw9QUJESUpNS0pLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTk5OTo+PUBAT3+Cg4SEhoaHiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQUI+QEJAQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQEA+P0E8Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHFxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PDo7Ozw7PT5BQT9ig4OFhIWEhomJiIeGhoaHiImKi4uKioqLiotePkRHSUtKSUZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREZFQUZFRkRGRkRAQj49QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4+Pz88QD5BQERBTX+DhIWGhoaIiYiIh4aGhoeJioqLjI2MjIuKiohXR0xMTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGSEdFS0lLSUtLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0dnd6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5Nzw+Ozw6PT8/QT1AQERDR0JqhYKFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUpIS0dFR0hISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDs7PDk+QD4/P0FCRURLVn6DhISFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpJSEZKSkVKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VucXV2d3l7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHR0I/OD9AODo7ODw9Oz1BPT4/QURFRk5uhIOEhIWFhoeIiIiIiIeGiIiIiIiJjIyLjIyLi4uLi15SUlBNTk1LSkdGQ0dKR0xKR0tPTEtKSk1NTE9QTkhJS0xPUVFQUU9PSklKSkxKTEZHSEdFR0lGRUVCQEJCXHByd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgIB/f39VRUNFRUdHRUQ7P0E7PTw5Pz0+QEJHRj9ERkRITXWGg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pFRUZLT05PV1ZRUE9RU1JOU1RPTVNMUFNVV1JTUlBMS01NTUtOR0dKRkZISkRERUVCRENjcXV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CPkJDRlZNQ0pLSExPeYaDhYWEhIeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7O1FTUmB1XVVWVFZZWVNZWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tHSElIRUZJSUlISWpzdnl5enl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQEVCQ0ZFREVMWFJMUVFQUlN6hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uGbFtkVTpYWFhTUD9AVlVZXGRgVllicl5dV11aVkVRWVpcWV9UWWdSVVZYVFRWU09PTUpMSklJTE1LT01Tb3R2eHl4d3p6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Afn9+fn5WSkpJSEdGRERCQT9ITUlNUEtJS1BUU1JWV1ZXVnaFhIWFhYWGh4iHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLeW5wWFpbWlJTUldWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eXh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlNS0pJSUZCREBBOlBRUVdYUFBPUVNUU1dXV1hYbYGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpbWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllab3N1d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNPT01LSkVDP0A7UFBaWltTU1FPUlJRVVJVU1ZfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVFNUXlpYV1dXemtYWlxcXlNQUFBJTk9XVlhbWmRxdHZ2dHR2eHl5e3t8fH19fn99fn1+fX1+f39/gICAf3+Afn56eHd2c3V7f3+AgHRrfn5rcnleXFZVU1JPS0ZDREFNXoNsVlJTTk9RT1FWUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JQUU5LUlRRTU9ZUU1OUVNVVU1RU1JQTkxMSENJSFJTVFpdbXJ2dnVzc3d7ent7e317fX19fn19fX59fn9/f39/gH99fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVVRTElMSWFsknRQUVNOUVJRUltSU1JRUlVVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkNDQ0NCP0RQQ0RAQz5CSEdWQElOTUddaVFIRk9GREVGSEdIQkNIR0hKR0RCQUNATlBNUmR0dXZ1c3R1enx6e3t7fH19fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZWJcWFNRUFVSc1dlW09PTkxRU1FVWVNVUVFUUk9WYGtsc3Z6e3h5dXJuc3RzeXh+foOAg4KCgIKAgoGBa0xHPj46Oz5APz8+PmpQSmFFRkhJRUI/SE1NR01RVUpCRT8+PD08PT0/PT9BQ0I/Pzw9Qj5KTUZVb3V2dnN0dnh7fHt9e3x9fX19fH59fXx+fn9/f4B/f39/e3l3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpQUU5LTFFSUVRWVFdRUVdWUFhbYl1hZ21tbG9raGBucmptbHF1e3p9enh6fHx4d3hkQkBAQT06QkNCQUNBW1xOe05PT05LTE1PT1BMS0xXTklHQEI8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXZ2dXZ3eXx8fH18fHx9fn58fX19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlNWWFNSWVROWVpbV1lcX19gZWBdXnF3a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSUVFRkNMUU9hV1JYUVBTU1JVW09PUVZQTUlDRj46OTY1ODY5Nzk6MzY1Nzk1PEI9ZnR1d3h3eXl7fX18fHt8fX1+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtUVFNQUVVPTFJTVFdYVFRYUUxXWVlWWFhWWFldV1dYaHNrXVZgdGthYV9dZGBfXllVUE1PTkxJR0pLSUhGQ1BPU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU5OEducnV4eXp7e31+fX18e318fX5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFdWVlNUVk9PVVZXWFlTVVRMS1NVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk5OTEpGUFBVWVNUTkpOT1RTVFxWUlVTU09NTElISEY/Pz06Nzg3NjU5OTY3NjY1V3FxdHh5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVFNWVFJYWFlZWVJVT0pHT1BPT01SSk9QUFBOTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUVBOTk1QTlRSUFJMSUxLT1FQUVJTVFFTT0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+M0A+am9hUlJRQEZUUU9QUFFOUU9QT0xKTExPUE5OUFFRTlBPSk1NTUtHRUVEQjs9PTw5PUc2Njc3RG5xdXd6fHt8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkM4RU5TXWdTUVNBR1VQT1JRUE1NTkxKTEtMTk9PUU1PT01ITEtJS0tMS0dGRkVEPEFBPjtARTs8ODlUcXN1eXt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT49PUFAQj0+RUhGREZGSUdKSkBGQUFARkhFSk9IUVJhXFFQUk5TT09QTExPTUtNTE1PTltWS01RT0dJSERJSkxMS0ZGRkQ/Q0M+PUJHP0I+QWRxdHd7ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPzs+QUBAPkFESUVDSEdJR0lFQkI/PjxDQkFHSURNT2FlUE1PTldLTE5LTE1NTExLTk5TZE5KTFJJSUlFQUhKTE1OS0dJRkJCQkA/RUZFSERMb3B3enp5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTE1JTVBNUE9HS0U/Qj05OTk6P0I/PEFCQUFEREdLRkRJSUdHSENDP0I/P0BBPkNFQ0tOUVRLSklNVEZJSUpMSktLSUpMTU9QUlBLR0NMR0NDSkpMTU9NSUpJR0NDQ0RJSk1MSVpzbnh5eHp7e3l8dnJwdXJ0eXl2eGpxb2psbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhlcUhLQ0ZISEdKS0lKTERHQj0+PTo6OjtBQj89QkJDQ0hGSkxKRUlJRkdHQ0M7QUBCPkBAQ0VDSU1PR0hLRkhLREhJS01ISkxISUpMSk1dUklIRE5HQkVLS05NUE5LTUpLRkdHSk1OUU5MY25qd3Z2e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRwRktDRkVHREVFRkVHQ0NAPTw9Ojs6OkBEQD5CQ0VFSUZKSkxGSUlHRkZDQjtCQ0M+QENDQ0RHTE5IS05IREhFSUxOTUdJTEdGRklJTE5LSkhFT0lDR01NTk1QTk9PTUxJSElPU1FSTlJmZ2Zyb3N4dXt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSUNFRkVCQkFFQERCPj8+Ojs7PTs9P0NBP0FDRkdKR0pJTEhHR0dGRUM/PUVFQj5BQ0NDREdJSUdNUElGRkdLTk9LRkhJRkVERElJSEtJRkhQS0RKTUxQTk9OT1BOSkpITVJVVVJPV2RhYW1ncXJvc3l6Z2VoaGNpbGdxbGZsbWdpa2xzbXB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVHQ0FAQUQ8QkE+QT06Oj0/Oz4/QEI/QEJFR0pGSkdJR0ZGRkVEQ0FBRkZDQkJCREVFR0dIRkxQTElPSkpMS0lGSEVGRURDSUhIS0pHS1JNQ09PTlFQT09OT09LS0tQVVdWVVNZYF9daWFuaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Bya2tzTUZHRUdBQkBDRDxBQUBDPDg6PT46Pz0/Qj9AQERGSEVIRkZIRkVFQ0NEQkRJRkNHRUFFR0VGRkdFSk1LSFFNSktISElFRkhIRUNJSUpLTUtQU05EUlNRUVJOT05OUE1MTlNXVldYVlheWl1kYGhiamlna19kZWZjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEJCQkVFPEBDQkQ8Nzo9Pjo+OkBCPj8/Q0VGREZEREdFQ0VDREVGRkpFRUlHQkdIRkdGRUNGSkpHTUtMS0hKS0ZJSEpIRUtLTExOT1JUT0lUVVRRVFBRTU5RTk1RV1pWWllXWl5aWGFgYGBfaGVjYGRlZ2dqaGhqZmhubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3NzeU1ISEdJREFDSEU8QEVCRDw4Oj4+PTw8QkI8QD5BQkZDRUJCSENDREVGRkdHSUZHS0hDSUhHSUdGREhLSUdLSU1LSktMSExKTUtJTkxOTk9SVVZPTFZWVFFUUlJMT1FQT1RZWllcWlpcX19eYGNeXGFja2JgZGdocoVoZ2pmam5ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0lLSEpFQkRHRTxAR0REQDk8PkA/Pj9DQjxAPkJBRkNFRENIREZERkZISEZIR0lLSkVKSEhLSEZGTEhISEpITUxMTExJTUtNTk1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXV5gYGFgYWVdZGBmZ2BlaGpjc3NmamhnbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBd3V1dXd2dXdzZ3Rya3Fya3J3b3dJSktJS0dCRERFPEBGRERCOz8/QUBAQERBQEI/QUNIQkVERkhFSUVGRUlIRklISkxISEpKSUtKRkpLSElKSkdLS01MSkpNTE1OTk9MT1BSVVdWTU5UVlVTUlFQTU5UU1JXW15eX1xeYGBhYWFgY2RlYmRpY2Rpamd2i2xraWhtb3NxcHFwcHJ5d3J1dXRzbW1zc21xc290dXRzcHN3dHV1d3Z1dXVlcXNrcHFqcnZwd0pMS0tMR0NDQUQ8P0VFRUM9QUFDQkJDRUFDREFBRUdDR0dIRkVJRkNHSkdHSkZJTEhJSk1LTUxHS0lIS0tOUUtSUUxTTUtOTU5QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhX2BiX2BmYmFjaW5pY2loaG14dm1oaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnJxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHRUFARD4+REVGQz9DQUVDREZDQ0VHQ0JIRUJISUlISEtGREtKR0hKSElLR0pKTktOS0lMSEpNS1pmSmRcS2xSSE9NX25VbHNbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZcbHRgbGtVX3d2aWpoaGZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPz1ERUZEQ0NCRUVERkJGRkdEREtEREpMTEpMTUdHTklISktHS0pJS0tOTE1MTExJTExMW3NiZHBebGxVTU5lcl1nZnFsbnRncGlfYVlubWJwcGJrampnb3F0ZXRub1xvdWdxTUtyeXZrYmFrZWVseG1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QUI/PUJFR0JGQ0VERUVEQkhIR0RFS0hHS01NSk1MRkpOSEpLSklLSkpJSkxNTk1NTUtOTU1bcm9vbnBwbGtOUFFsWE5pYnRycGFtb3ZcWWxQW21tWnFta29teHh0c2lwXGBzbHFqVXV5eG9jXmtmYmdwcGppb3Bwc3NwcXBwcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEZFRUJBQj0/P0VHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5HTE5JTUtISk1JS0lKSk5PTk5NTE5NTFxoZHVdbHFXbE5PUW5VWmtea2x2YWxkdFRlY05sWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2hhY2l0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJRUVEQ0FCPEJAQkZDR0ZLR0VDQ0hLSEhGSkxLRk1LTFJSTEdNTUhOSklITkhKSkhITk9OTkxKTU1KWnNwcG9xcW1sT1FTb1lza2dvb3Fxb210Xm5YYXRfbm9wb3Fyb291c3R0altddGN3eHJqbnpoYWFjZmFiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dEhLSEpDRUVFQEA+Q0NBRkNISU1IRkNGSkxJR0ZLTUxGT0pLV1JLR0tKSk5JSUpMSUtKSUhLTU1NTElLS0tTa2JaaV5famNyclpfWmtvYGVlVWtfY1thYlFgbWhcalxuaWlkWm9lZHBdWlxrW21xY3BzbGRnY2RnYGBrbnBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSURFREZBQEFFRENHQkhKTEdGREdLTElFRkpOS0lPSUxbUUpGSEhLTUlISkpLS0lISkdMS0tLR0hKSkxMTEtJS0xOVFtdVFBVTVFQTk9PVVJQT1FPT1FKSk5QUWRxaVRZVltbXFVZW11YXVxcY2ZhYWZiY2ZfXmZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUM/Q0dERUdDSUtMSEZER0tMSERHSFBLTE9LTFdNSUZFSElKSElLSExKSUZISEpHR0lFRktISUtOTElPXFdeT1xcYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXWJYW2RkVlZYXFlaWFxWWVxeY19kYWFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0eHl5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJESUVHR0ZLSktIRUZKSkpGRUhIUEpMTUpNUklIRUFIRkpJS0tJTEpJR0VKSEVGR0VFSkdCSU1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5fXF5TW15jX1pdYGNfWV9iW2BeW1RZWFpfXmRiYmFjZmlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHZyeXZ4cnF4dnR2YVNKSk1JREJCQ0ZHRUdHSUpKSUlER0tKS0ZGSUlOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlFRERFQkZKRD9JS0hOW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1FbX2FhXV5jYWBiYmJjY2VaUlhWVlxbXmNgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGQ0dFQkVHSEZHSElGR0pHSEZIS0lLRERKSk1NTExISkpISkc/R0ZOSktLTUtLS0lHSEVEQERBSElBPkhJRk9dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RUV1fYWNjY2NiXGRjYmRjZlhRVlVTXFhbYV9eX2FhX2Rsa21qa2xudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUJASUZDRktJRkZHSUdHSkZGRklMSk5FREpKTE5KTElLSkhJR0JISFFNS0tPTUtLSUhIRUQ/RUJISEFARkVDVF1ZXlhfWF9bXVVYWFBdXVFLSlZeWF5bXVZaYVJSX19iYmBgYmJgY2JiZGRiWE9SUlNcU1xeXV5eX19gZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIRFJLRkhISERGS0lNUEVHSUpLTkxMSUxLSUlHREhLUU9NTFBMTEtLSUlDRUFFQ0hGQUFGREFWVUVcVF5TVmBYTlRVTlpbTUpLVGBhW19YX15iXU9ZYlxgYF9iY2JdYmJXX19UUE9RUllTXlxcXV5fYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElSY1FEV19JR0dIREZNSlBQRklJSktOTExLTUtKSkdFSU5RUU5PT01OTU5IS0FEQUNERkRCQUNEQExIQkxMUE9PTUZNRkZISUhHTExNT1BJTE9QUFNQTFFTUlVaWVdZWFhkVk9TVFBQT05RVVRcWVlbXl5hYWVmY2hka2xxc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01eTUdIWU1HSEpIR05MUVFJS0pLS05NVU5PS0tMR0dLT1NTT1BPTk9PT0hLRmBFRF9MRGZjQ0xbSF5bc21PTVZtWUxDUF9UbFdnSl1XVV5ETVFVTE1TVlFSVFhXVFhVVFxUUGZaaGhkWVRrVFhXVVtcXGBgYWJiYmBnaWdubGhyenx9foGEhISEg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7S0lFRkZIRUVLT1RKS0dgVEdKT0pJT01SUUtNS0xPUlVST09KTE1HSE1RW1lPUFBOT1BQSktRf1FJfFlZcnNXUG1IcW5vYVZQcXF0T0Jrc25xdHBTb19bblhdVlxYVWtoVV1WY1lgWVpfVlVXf2l0dXVfYXZfWWJcXGZbX2FhYWJeYGJnbXBsYHB3dHiBgYKDhIJ/fX6Adnh6bXZ+dHh+gHx+gIGChHyAg3p/gX9+d3dNSUVITU1CRExMR0pMRlJWTExPSExSWFdRTk9PTFFUTk9RUEtLTkdNUFNbWlRRUk9QUFFLSVp4XVR4ZGhZUlNQdmd0bHBibmZrUnJOTHdtanJwc3JxcnBvcIBdZnp1eHFxenF+cn1rdX1iUmd8ZXNzb3NzfH1wfnlvf3JfYGBiYlthYGhrbmtibGZnbXd+gYCDfnt4d4B0dnpocn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tISlFPTU5KTldeWVVMUVNOWVlMU1NSTkxPSVFSVFlXV1FUUFBRU0xIZ3hsY3hxbVpLTFR5cHVtdWJudlBkZUlldnFtd2+AamZ4eGlYclJpe21panp6fWx4en9wZ29YdXVqdnVwgGFzaH1pbHh8b19fX2NiXF9kZWZpamRnYmNkbGxwcHN0c3NzeXFyeGJsdGdyeXtzcnV5foFzdnpufH15eHJuTUpSdE5DQkVQUElLTEpMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBKU1RVWFdXUFVQT05TSktyb3V1cXVxZGhhVm5McXBeR2h5V3ZUS2h4fXhgeXtzbmFebW9kU2dydW5teXB3bHZzdHFsbVxzfXprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZWVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21LS1pWSEdFR1JQS0xOS0xRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTkpUVFZXWVdPU09PTlFJUm1IaXdLYGR2dVVXbE5ubHtyYWpnf3ZVS1draH1sbWx4YFtwentfYHpzY3JveHFoZHxpcntdVEtsX3Z1a2l1e3ttfnhrfHBdXl5iW15iZGVnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3NybGhtbXJ8a21oa3t0bW1rbU9HSktISkhIUlFNT1BNTFNTUk9TUldSVlRQV1pWVlRUVGFgUU9OS1RTU1FWVk9PTU5PUUpIUU5QVUxLS1JTUlJST1ZVUVFPUlJYWFFOUFVUWFhYW1tVU1NXW1dYV1tPUlRXV1hRXVhWXVVTT1hSVldXWFpgW2dyXltbW11dX2NaX2NjZWZkY2NiWmNjZ2ZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUElLS0xNS0pUUk1SUVBMVlVUUFRVWFVaVVJaXVZVVFdVWVhQT0xOV1RQTlVTTlBOTFFQS0pRUUtRTUpLT1FUUlFRU1JJSU1OT1FSUVFRVFZSWFdcV1NTUVFVVVZUWlFOU1FXVVRZVlRZVVNSVVNUVVhZWF5aX2FdXFtaXV1gY1xdYmNkZ2VkZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRkZmhRSktLTk9MTVRRT1RRUU1YV1VUVlhXV1pWVFxgVldWWVVYVFFQS09YU1BOVVFOUk5MU1BNTlVTTlFOTU5RU1BUUVNUVE5MTk9RVFRSUlFWV1VZWltZU1VSVFhXV1lbU09TVFdVVFlVVllUUlJXVVZYXFpbYF1WWV9dXl1cXWBhXltiYmNoZmVkYlhgYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl5dY2hrYWhmaGZkYGJkYlBLTUxQUUxPVFBQVFFPUVpZWFdZWlpYWVZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBRTk1RUU9SWFNRUU9NT1NVTldRVFRVT05OUVRVVVRUUlRYVlpdXFpWVlFSV1hWW1xWUFNVVVVWWFRXV1RSUlhWVltfW15gX1ZfXV5gXFxgYF9fWmJiZGhoZWRiWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9VXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTVBTUlVaVVNQUExQV1VRVlJTU1hNT1BRVFhVVVVTVVlYW15dXFtWUk9VVlVbW1ZRU1ZVVlhUU1haVFNRWVdXXV9bYF9gVmJcYGFdYGJfXGBdY2FjaGllZmBaY2BhX19lZV9gY1taXFtcWlpZWVdcWlxbYF5gW15eYWBfY1xZYFpRTk9OVlFQVVNQVVRTUFdcXFxZXlxfV1xeanB3eYBjXFtWVllSTk9XU05RUVBSVFJMUVRTWVtXVU9STlNYVVNSVFJSWk9RU1NWW1VWVlRWWlhdXlxcXlZTTlRWVltbVVFTVFZYWFJTWVxUUlJcWFpdXl1hYWBXYltjYl5hY19cYmFiX2RnaWRnXlxlYGFgYWNkX2JfWVpfW1xbWFhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQWl1eXVxgXGBVXF1oanJ9c2xoXFVZV1FPUltTUlFUUlRVVEtSVlVaWlpTT1NRVVVVU05VUVJaUlRVVFhdV1hYU1hcWF5dWVpdVVVOVlZXXlpYUVVUWFhYU1ZZXFRSVl1ZXV1hXmNjX1lgW2ViX2RkXl5jY2FeZWZpZWZdXmRhYWFiY2RfYl5YW19bXFtYWFhYV1taW2BdW1tcW1haW15WXlldUE9PUlpQW1VVV1ZUVFReXmBfXmJcYFVdXmJreXVtfWxaVVpWUVFUXFRUVFVUVllXTFJaVlxaXFJQVVNXVVVTT1dRU1dTV1VWW11YW1lVWl5YX15ZXFlSV1JZWFlfWVlTVVVaWVlVV1lcVVRaXVxeYGFgZWRdXl1dZWFiZmReX2RjYFxnZGhmZGJfZGFfYWBiYl9gXldZXlpcXFpZWVdWXVpdXltaW1xbV1lcXVZYV11TT1BXWVBdVVZZV1dVWF9gYWFgY11gVV1eYmVldoJ7aFhZWlRWVFZcWFdXVlZXXVhPVVxZXl1dVFNYUldVU1JTWFJTVlRYWFhdXlhdW1VeX1hfX1hcVlFZVVlaWmFYXFVWV1paWlhZWlpXVl1eX15jYmJlZV1iXGBmYmVmZF9gZGJhW2ZiaGZjZmFmX19hYmFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOU1pXVFxVVldZV1ZcYGFhY2FjX19WW2BkYV96dW9oWlxaVlhWWFtaWVtZWFlgVk9UXVtgYVxVVVlQVFZUUlZWUlRVV1tbXF9eWl9cVl9fWl1eWV5WU1lYWVpdYVleVldaW1pbW1tZWlhZX19gYGRjZGVlYmRaYmZjZ2ZlXmFiYGNeY2NpZWRnX2deYmJjYWFgXl9YVFpaWltbWFxYWFxbWltXV1pYV1xbXGBdVl1dU09WWlZWWlZZVVhXWF5gYmFkYWRhXllZYWRiYGtmaF5cXVtXV1laXFxcX1tZW2JWU1deXWFjXFNWWVBWVVVVVlZTVlRYXV1fYGBdYV1XYF5bXlxbXlhWWFhbWl9fWl5YWFxcXV1eW1pcV1pfYV5gZWRkZmZmYlljZmVoZ2ReY2BfZWNdZmlkZWhfZ15jYmNhYWBfX1tYWVtZWlpYWlhXW1taW1dYWlRZXVxaYFxVXmJNUldZVldaWVtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX11dXVhXW1tdXV9fXFpdY1hZV1xgY2RfUllZUFdWV1hXVlZXVl1dXmFiYV9iXllhXV1eWV1eWVhVV1tbYF5cX1lZXV1eXmBcWlpZW19hX2JlZGVmZ2diWmRmZ2lnY19jXmBmZVppaWNmaWNmX2JiY2FgYF9dXVpYW1lZWFhaWVdaW1pZV1hWVVtdXV1gYGJieEtXV1xZV11cXF1aV1xdX2BiZGJjYV1gWGJjYmBjYWNeXF1cWFdbXV9dYF9dW2BkXFxXWmJlY2FSXFlPWFZZW1lZV1paYF5hYmNgYWNfXGJdX11bX15ZWVRYXV1fX15fW1peXmBiYlxcV1tdYGJiY2VkZ2ZlZ2RdZWZoaWZjYWJcY2dgXGlpY2hpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldWWFBYWl1hY2Zmcmt/SllXXVtaX11cXlxZXVteX2JjYmFhXWJbYmRhX2NiYl1cW1pXWGpxYFxgX11cYWNfXVhZY2VkYlRfWlFZV1xdXFtZW1tjYGNjY2BiZGFgY15gXF5fX1pYVltfXVxhYV9dW2BhYmViXlxTXF9gY2RkZmVnZmVmZV9mZmhoZ2RkYFtmZ15haGhiaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t8e3t7e3x7enp7enp6ent7e3t7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqHc3FycnJxb6nBvr6+vsGiioyMjIyNiX5/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjIlyb29vb29sstDMzMzM0KqNkJCQkJKLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDg4SDgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh4eHh4eHd3d3d3d3d4eXl5enp6d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHp6enp6eXl/g4KCgoKDgHx8fX19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnV1dXh2dnZ6e3h7eHd2dnh5eHl6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3t7e3p5eXl5eXp7e3t7fHx7fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d3fHt7fHl8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3l+e3l7eHx6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3e357eXt3fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4e3t5fHh8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXd4enl5eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdlZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx9fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwipCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4mDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyPi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqMiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiIaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODg4KCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKDgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4SBgYKEhIKCgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWDhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4KBg4OBgIKDgYKFhYWFhoaHhoWGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODhIOCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqHgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SEg4KDhYOCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Qko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOBgoODg4KChISDg4OCgoSFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZOSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGCgoGBgYKCgoGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5+f4CBgYGCgYCCgoGCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAgoOCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgYGCgoSCgoOEgoOEhYaEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GCgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgoGDgoOFhYODg4SDhIODhISFhISEgoGAgYKDgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4WFhISDg4KCgYKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5OSj4yMioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgIGBgIGBgH+AgYGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAgIKBgYCBgYCAgoGCgoKBgYKCgYCCgoKCgoKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYGCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYuHhISDg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4CAf4B/gIGAgH+BgYGBg4GAgYGChIOBgYGBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgYCAg4KCg4KBgoKDg4OEgoODg4KAgICCgoKCgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEhIOEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOEg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoGBgoGAgICAgIB/gIGAgISDhYWEhYWFhYSFhYOEhIWDg4SFhIKCgoOCgoSCgYKGhYOFg4OEhIWGhYSEhYJ/fX19foKEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSEhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgYCAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOCg4SFhYaFhoaHjYeHhoOBfn9+fn5+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgoKDg4ODg4KDgoGBgoODg4KAgYGBgYCAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODg4WFhYSDgYeZjIWBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaHhoaGhYSDhIWFhoSFhYaGh4eHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4OEg4OChYaCgH5+fo+Jf39/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eIiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aHh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4eFg4OFhIODg4OKhn+BgIWBgICCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiouLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQjpGOioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4eEhIWEg4OFhI+ChYOCgoKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGg4KBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYSFkYOEg4OCgoKDgX59fn5+fn5+fXx+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4eJiISDhIOFhISFhYaIh4aFg4KChIWHhoeGhoOCgoOEgoOEhIKBgoGBgYODhIOEkZKRjo+Oi4eFhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYaIi4qGhIaEgoaGgYOQhIODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYODhIWFhYODhYSEhISEhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDg4SFg4KDgYKDg4SFhIiSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgYCAgX99gIaDg4ODgoKAfX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4OAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGjJORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn9+fHyAg4OCg4ODgX59fn+AgIGAfn19fX1+fXx6enp/goKBf39/f35/f4B+fYB/f4CAgX+AgIF/f3+BgX59fX+AgX9/foCAgH+AgICBf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn1+foCAf31/fn1+f4ODg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6enqAgIB/f35+fnx+f35/gH9+f3+Af4GAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fn6Af4B/foF+foCChIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXuAgH9/f39+fX5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+f318fH2Fk5KNjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCg4GBgn+Bg4SEgYGBgYCAfn19fn5+f359fX19fXx8fHt6enl5eX2BgICBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgoF/f39/gIB/f4B/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISDgYKDg4KCgoKCgX9+fX19fn6AfX19fX19fX18e3p5eXl5eYCCgoKEg4CCg4GAgoCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYGBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhYSCgoGBgoKDg4ODg4KDg4KCgYCAgIGBgYGAf39/f4CAgIB/gIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGhoWFhYCAg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgIGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aGh4iHhoeGf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBhIaIjIWDgoKBhIKEg4KDhYWEhYOCg4OCg4OCgoKCg4OCgpKQi4iIh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1/fn+Bf4CCgYWFhYeGh4eGh4iIhoaHh4aHh4d/fH18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZeEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko6LiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgICAgIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhISGhYB9fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fH+Cg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX99f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4uKioyJiImHhYaFg4OCgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISEhYSGhIOEg4KBgYOBf319fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYOBf4KCgIODhISEhISChIOEhYKEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgoKDhYODhIWFhYODg4SCgYKDgoOCgoGBgIB/gX5/fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+f36Agnx8f3+BgIKAfn17ioJ9gH9+gYCAgYKBgoCAgIGAf4uTj4uLjY6NiIeHhYWEhIOCgoGCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhYaGhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfXx9e319fXx9fHx9gH+AgH6Afn6Bk5GMjIyNj4qFhoaFhISFg4ODgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+f4uQjYuMjo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgYCBgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f319fHx9fn18fX19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/foyEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6EkYyMi46Ni4qGhIaEhIODg4OCg4KDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+f399fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9e3p7e3uAhoWChIOCf4B+f4KCgn9/goJ/gIuPjIyLjIuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+AgIGBgH99gH9/fn9+fn9/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fXt/fnt7e3x8fH18e3t7e318enp9en6CfoGDhIKBgoGFhoWFhoaHhoKEkY6Mi4qKh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/fn5/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fHt+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7e317fX5+f4CAg4eJiYmLiYuJhYiRjYuIiYeFhYOCgoOEhIODgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gX9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CBgH58enx9fX59fX5+jIZ9fX57e4OCfX5+fX18fX19fX1+fH18fXx9fX58fn19fX18e3t7fHt8fHt6e3t6enp7fn6ChYiHiIqLi4uJjJCNjImIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/g4OEh4mKiImNj4yKiIiFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4iCf36CkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI2MiYmGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn6Ag4CJjImLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYOBfn6AgH5+gH59fn6AgH+Bfn+Af39/f398f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIF9fHx9fXx8e3x8e3t7fHt8fHx9fImJh4iFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x+iYWGhIWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen19eXh1dICAgoKCg4KDhYOEg4KDhISEhISEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCGgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXR1fYKDgoODg4OFhIWDg4OEhIODhIKBgH+Af4CBfn19fn9+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIF/gH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/foB/fn17ent6fHt6goSAg4KCgoOChIKBgYCAgoGAgIKBg4GBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dnR6hISBhISDhIWFhoSDg4WEgoODgoCBfn9/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GEgX+Ag4J/f4B/gX+Af3x7e3p8e3yBgH+Bf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWFhISChIOBg4KAgIF+f4B+gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fX99f4B8f399fYGAgH59fYB/foGBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/goCAgYGAgYGCg4KBgX9/g4B+goKEgICCgYKChIJ+e3t8fHx9fX1+fXp+fX14fn9/fHx8fn1+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3d2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDhIN/f359fn5+f4B/gIB/gYKBgH9+f4F+f4CCgoCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWDg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX+AgIB/f4B/fIB/f4GAgYCAf3yAf31+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnF4eXJ4hYWFhYOEg4KCg4KBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgX98gH6AgH+BgIB/fYB/fn5/f319fX6AgYKBfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fXt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYaFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf4CBgHyAf4B+f4GAf399gH9+f39/fX18gICAgYB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36BhIKCg4WFgoJ+fX17e3x8eXd7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXJweHdxe4WGhYWDhYKBg4OBgYGBgoCBgICBgH5/fn+AfXx+fYCAgoGAf4GBfX6Af35/gX+Af3+BgH+Af31+fH1/gICAgH9/f39+fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+foCBf4B/gIKAgIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgYCAgH59gH+Af4GCgn+Cgn+AgX5/gYF/gICAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnqBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fX1+fn59fHp8fHt9fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoKAgYGCgYKBgYCBgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+Agn+AgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jX53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358e3x9e319e3l5e3p5eHN0dW5zcXB4cnV6hYaDg4KDgoCAgIGCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBhIOAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGBgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHyHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICAgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4GEhICBgX6BgoB/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4GAgH+AgH+AgYF/gICAgIGAgIGBgYGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXt8fHx8fX5/f39/fn19foB/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgYKDgH+CgYWDg4SBgYOBgoKBgYCAgYKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9+gICAgICAf4CAgH+AgICAgICAf4CBgYCAgICAgYGAgoOCgoGCgYGCgYB/f4B/gId+fnx6fXx7fX54d3Z5eXp8fX18fXt8fX19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIKBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf31/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9gHp5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoKGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYKCgIGAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBgoKDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+fn+BgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChIaEgoODg4SBhISAg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgoOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGDg4OEgYKEgoOCgoGCgoOBg4SDhISEhYSFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7fHp6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4SDg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fXyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChIWEhIOCg4SEgISFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODhIOEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fX19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4OHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoOBfoCAgoKDgoODg4SCgYKCg4OCg4GCgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4SEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fX19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2BgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoODgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOAgoSEhYOCgoODgoGEg4GDg4SDhISEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gYCAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoODhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSAf4GDf35+fH59fX+BgH9+fHx+f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOFhIKEg4aAgoWFiomEhIOEhYWDh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEhHyDhHuBhHd5g4F9hH5+cnWDgoF2foOFgX2BdYF6g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYKBhIOAf35+fn19gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIaEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHOCg3+Dg32BfX5+fX6Cg4F8f4B9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOGg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26AiHltfXJzdnN2bW14bHB5bHV9f399foGAgX1/fn2Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4aFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHWCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gX9/fH99fIF+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLiYWEhoeHhYOFhYWEgoWFhIWGhYWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJioiFhIaGhYWDhYWEhYaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhYWFhomJh4aEhoWGhoWGhoSGhoeGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSDgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhYaGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYOEhIWEhYWEhYWDhoeGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fXt8fH1/fnx8fn2Af31+gH5+gH99fXyAfX5+fn5+fnx8fX57fHx/fHt7fX+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhIaEhYaGh4eFh4aJiIaGh4eIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhoOGhoWGhYWGhoWEhIWFgoWHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fH9+fX1+fXx9fH98fn58fYGAfHx8fXx8fH56e3t9foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhIaFhoeFhYaGhYSDhIOChIeDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX18fHx9fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eIhoaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYeFhIOEg4ODh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHh4eGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4ODgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWFhIWFhoaGhoaFhoaHhoeHhYOGhYOBg4KAg4WCg36BgYF/g4F/fn5/fn58fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeJhoaIiIeHhoeIhoSHhoaHhYWHg4SFhIeGhoeFhYSDhYWHhoeGhoWGhoaFhoaEg4WFgoGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhYaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKGhYaFh4aHhIaGhoaFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18f35+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OEhoWEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEg4aFhoaGhoaEhYaGhYWGgoKChH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXyAfn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+gIKCfX5/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBhIWEhIaGh4iHhYWIhomHhYOEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOFhIWDhYWBgYODfn5/gH9/gIN/e4B9fX+CfYCBfn6Bfn1+fX1/e398e3p5enp5enp8eXp6e3t7fHp7e3t8fX59fYF9fXx8fYB/fXyGg4aGhoaFg4SChYKFgYGAf3+AgH5/gIF8fn9/foCAgYKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYaIhoWEhoeFh4WFgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhISDhIOFhICAgoJ+fX1/fn5/hH57f3x8gIF9gYB9fYN8fn59fX57fnt7enl7enl6ent5enp6e3t8ent8fHt9fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoOFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoOChIODgH+AgX59fH5+fH6Dfnx+fHyBgH6Cf31/gnx/fn19fHx8e3t6enp6eXt6enp5eXp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoOCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYSCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgoCFg4F/foB/fnx8fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRkw9ODc2NTk5OTw+OT88RDk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTU09TU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1dTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dTV1dXV1dXV1dXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX19zd3d3d3d3d3d3d3d3d2tbX19fX19fX1tbW1tbX2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNhG1wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubR7c3Nzc3Nzc3Nzc3NzcJTAvL29vb29vb29vb2+tIqKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzk4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6WaNCkrKysrKysrKysrKyRksKmqqqqqqqqqqqqqrJtTUlNTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8NztAQz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzc5SKzExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmnj0uMDAwMDAwMDAwMDAqaLKrq6urq6urq6urq66dWFdXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs+QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183PXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampq6NLPD4+Pj4+Pj4+Pj4+OXG0r6+vr6+vr6+vr6+xoWJhYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI/Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcXCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Pzs7Oz8/NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRysnKysrKysrJycnJycnN09PS0tLS0tLS0tLT09HNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7Ozs/RztDU0s/O0NTSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tjX19fX19fY19bX19fX1tXW1dbW1tbW1tbW19bW2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7OztHBp9PIlKjS0MaTq9LOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Pz8/RnY/AnKubsNCZrZmz0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD5BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz8/Tuq+rtZWHnJ7Fk4adnc7Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/P05+xm7++yJiZxr3JlpnG0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/P0cCciZq905SWn87RkZigztDQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9SjooGbxLKfwpvaraO/ndXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NHEn4F7lq3Qi5Oex8uIlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DVq6+8wM+UytulmbPQ26KZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49PTs7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmHf4Wgm5GnmaCtkKiYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU0Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocbT09Wcm6WmpKigr6eiqZzQ09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDS0dLXqIjMnZGOutWakY6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0s/F1NO5x9bT07jI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLT1NLS1dTT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Njc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs6ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUZDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWh4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIN2dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urm5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpkbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXhwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tbW2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5ubm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZycm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ybm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVUYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcU19NSFFJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKlqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKWioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq2mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Necl9oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmloYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqaeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloKGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbGh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLazurGqrrSxsLG0tLa8vL68vL3Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqTlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGw8O5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsae8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbGhxeG95aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2hndVpmcndzeGZnXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8nGw8PEwsS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamhdam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjHycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytpqm7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHGwcvLx8bMyc3FxsbDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldG5zYlxiVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHDxL+/vsTLyMrLyLy7yMfJzcjDyMnJxsXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu7vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cm9mZWdjamRham1ubl5YXFZVTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXCxsK+xsG5u8O6uLm8vsHGwca6ucnJw8XEwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZmNaWVlcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub26urS/uLW3s6+7vLfAt73Cv8G7v8G8u8W+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5h31xY2BiYmdqZmZpZWldVlVTWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W6wbi+uL+8vbe1t7CuuLa5v7vAv7fBvLvDtrrIuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVrZ1hYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v728sq2vrLGwt7y2u7zAxLm3t7e1urm6u8C9w8C6xMK+x7i5uK23tbi6tLezu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD08Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72/u8S3tri2t7+/xLzCxcXHx8rJxs/CwbiutbW8vri7sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bndjZ2JcY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz0/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6qjsLm9vrO8vrzFuLK4ub3HycrDx8jGxsnIzM7RzMrEtbrAw8i/v7W/wL/Gxr/LxsO/wbzAw8zKx8XGwbm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYWFOSE0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS8w7y6ur68xL+3vb+9x8zGx8nGxr/ExMrIzMzNysbCw8vOwry5vbq5wMO/yMbEwcG/xcDKycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE+PkFCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy2ur3BvLu/tr/Bv7y/usDLwsfIwL+8vL/FwsfLyMHDwMDJysLAu7uwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem1zeHNncF1bXlxZUUVEQ01JQUU9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u726w7u3vbe5wLu6uLi1xcHCw7u5s7S6wb2/xsC5wLy+xcS9vrmysK64t7/Dx8PEvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbmlcX2BZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucHAt725uLm2tb+ztLK4sbvBwMO3t62wtbi4uMK6tLu3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2VcWlVKPD8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7e6t7a2srTAtrK0uLO6wMHDubezsrK0sri+ubO1sry5vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnJsXmJgW11PSEE+PUhDRk1DQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27vLi2uraxwLq3ubi5u8HBxMO7u7a0tLC2urW0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJuY1xmWFxdUk5NQT5JQkBKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7GttrqurLyyuLm3u7+9ub7AtL+7vLq4vsK8wsrIvsC4uLaytLaytK+tu7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEJGTUY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6tbm7tbWztbu8wLu+wLS/ubm6sbrDvMLKxb+7v7+5tLSzsLGtsLm4try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Ojo6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSYnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6sr7Kyurq3t7W1vLOvtKu2urjAxMG7tby9t7Kts7CvrK62trK0ta+qpJ6bnJyeqKieoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moqquepaObo5yVkIyPj5CTkJeVlpifnp6amaaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HT01MQk9RQD47PjQ5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpayqqLWysbCur7KnprCkr661wbq1t7K3trO0q7K0rqqrr7Cys66lnpKYlI+YoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqmxo6WonqCclZOQj5GQmJCWlZiWn5ibmZujmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUlIR05STkpORztFQD0yPzc1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJiXlqGorK62t7q5ure3u66ooKGpoaCtq6qmqaSppKWupaystLy3rbOxr7Guta+vs7Wqp62so5uZlI6RlpeZmZygoqKcnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWZlpuXl5ignpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeHlgYlJVX0hJSUtTVElSUEw5PkI2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5OcnqSorq2sq6uvqq+pnpeepZ2epaakoaKfpqCir6usrbWytqavs6upqrSxsbC4raehnJ2alJeampCOkZWRjI6OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrC0qbGvopmcnZ6hmZubmpiZm5SWm5aYnKShoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVtTWllNUUpOTlVMUkxBNz1CNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT43NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKSnJihnaqip6Cep6Gln5ySnKKbn6Gjn52goKOgoq+vrK+xrLaorrGwqKaxrq2ssKefnqKgl5GUm6CcmZeSk5+coaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuKyxtKSgnaWfrKGhoqCgmpiWlqCbm5ikoaCepKGfnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUVVIRlVWSkJMRz1LSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuNk56ZqJ2unqeenKGdnpqakpmenKGioKCdoqCfnp+pq6esqaq0rKusysCkq6iqrKqloJ6ZkpKTmJiWlpWMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7WirKKpqLKpq6inqJqZnpqqp5+ZpqCfn6eopaSenaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQlZNSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJqqoLGit6Owpp+enZ2XmJWZnpuco5+fnaSem52cpaKko6KqsKymqNS0payvrqmrp5+enqGinZ6dmpyclJOVlJ6dmJSFnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64s7vGw7zDvLezqbOtqrO0r7Ouqq6jnauntrGsoq+loKOvsa2wpKSvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cmtrdXJwaFdbUUVUSERJT0g+RUE0RUg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqChnZyYm5+gm6Cfn5eknZWbm5+bnpyfpaaloKPItLKup6Sko6CepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DDvsfGwrfDycnCwMW+ubS5urS7t7C1sqq6sa67t766uqq3rauquLq0vK6uuaOmo56mpaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSakZydn6Sep5+en6KdmJmUmJSIhH16cmtkaG94amRaW0ZLTEVEU0xEQkU3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWWmpaUm6SmnaGqp6KrrLy8v8PBs7K4p6Ghq6qinZ6hop6cm6CSoJ+SmZ+ZkpqYn5mPiaKxs6igmp2cn56al5iXkoyPlpeTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdLTzNPQ09PMysLFxsfKx86/yNHMx8XGxMG7w8C+vr61vbOtv7/CwsbEx8SuvriyuLzEwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJRENANTU1ODpCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJujrJ2frqalsarFxszOzb+wwailqKytqqGdo5+cnZqpk5qgmr6jko6WjIKLmqmwqqOfnaCbmJeUk5SWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rS19HX0tTV09PIzMfNzcnSzM7TzMXHycrBxcvGyMjFvsKys8jEy8rKzsXKv76/vMHHxMzMyMm/w7+tr7OonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi396cnV2Z2NndmlkVldRRE1GQElRQj1CPDoyMkA8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbS4rK6jn6Sjn6CkrJuWp6/LrIyNkYuZr6+mnZ2doaWhnpuVlJaUin13cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dPU1NLP0cPQ09bY1dbSy8nO0cvGzdHJ0tXW2dXX09bYztLKz9HMztDM0s+/x8bKw8zMy87PxcbHtsDKv9HMy8/Fyce/w8PIzszP0M/NysjOuLe7qJ+lq6eemJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZXJiXVJcSUpGQUVIST47QDg9NDU4NTs4Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSimqmmoqarmqOwsamotdDU19rSx8bLtLXCxbG2qKKlpqGiq7Wnmq/ExqWGhqCvrJyVmKCcm6Gin5ydmpWKd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M7P1dTU0dHM0M7T19bT1dDP0tPRydPRx9DY19jR2NLX2dXWzM/Pyc3Ry87Pv8XCx8XOzdHQ0cjLzMDKy8XTzsvOyMTJxsbIzMrT09HVz9LM0sG5xbGlqLWup5qorKWdsqiws6ysk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx7enFzdG1hY2ltX1ZQX0pKQkZDUU0/PD41NDo9NTI4NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vrqqqq52mrrioq7fX1NXZ2dHO0MC8zMm3v6+nq6mjpLG1sqO3y7ublKqroZiWmJqbnaCemZyek35xZWNiX19hX19hYF9gYF9gZm1wcG5rb3J3d5vMwNLV09jY1tnR0tLXz9POy9LN1dTSys/M09bS0dbNz9XV0cbR1MrQ1NXWztLQ2NjY18vIzcPIzszKy7/Jv8fIzc7Py9DNzsvOzsfKz9DKzsrCycbJzMrL0dLM09HRz9DKvci5sK67uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIeXZvcG5rYWRucGFXXFpJRkZETVdFO0A8MzM8PTg3ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKeeuLa1ta2lra6+tLDA2NLX2tzWz83LxNPQwsGxqq2uq6Wysbiqu86vo56clpOXnJ6fn52Ul5iUiWteXl5hZGJgYGFhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dTLzNDR08rO0dXS1dXKwMnBxczCyMnCzMPFyMrKzsrNzNDN08vFyM/MyMfKxMbAxcrLzc/RxtDOzc3Mz8XHwLe4vcPDvcO5s7K+sbvDxLWqmKWimZaRlZWSi5SNmpGUlI+PlIKJhXhwcWttZ2BgcWhYWGhWTEZMSVBQQjtEPjs2Nzo4OTo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcXDwb+7tbKxx8K4y9XW2drb2MzNz8jW1cXDt7G1qqOtrLi5r7/KoZeOjZiVkJOSkZaWlpCMfGZiYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0sjLzs3G0dLPzszUysfLzs/Hx8/Sy9DPxbrEvsbJvcLHyc7EwcfAx83Hw8vKy8/Hw8PQyMbBxcfEvsDHy8vLzsLKy8jHzNDExce7x8PIyMLPwb28v7DByce5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3bnRka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WysazJzcrIxL69us3Nx9DV1dna29jQys/Q0tTJxLm9vq+nt6q9uLfDrJKOjpePhoOEhIJ+hYV/dGBcXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+yMbCw8DDx8rJyMrIwcXMxsjLzcnEwsvJwcLL0MTLyL+5wbvFx72/xs/Lw7/Du8nGyLvIxsTKwL3By8bFxL7FvLy/w8TLxcS8wMnCxcfSxMDIv8rJxsfG0MPDxsOvxMvHw8q3v7y6tKmspKWYn5iso6GlmqOgm5R7dnN0ZmlaYW5tWltYUURMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8y8/RzMfCw8fNz8/M1dDW2djZ0MzTzs/QysO3xsC1tbuwv7a4sJGMk5iHeoCFhoB2eHVycV9aW11gYGJkZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKwtrqysrOyscK8vLy6uMDBwcW+vbm9v7nEysXGwr3GwLi7xMm/wsm7t7u6xcO+vMHNw8a+vrXBvcO6vMa7wrmzvMXEwcK2v7W1vb+6y8O8tbrIur+9y8PBxcLFyMbIxtDGwszHssfJw87NwcXDwL2yt7Cyp6ioubClrbCrrayUeXZ3amRnYGhvY1ZeWUpFSkZISkFFQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8bCxMjO0svKysfNzs/SydHG1tTW2M7M0MfMyMrEvcnBsbS5trm0rpGNiouFeYCGhoB+hHx0dWRcXF1eYGBiY2FiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tLe0srO0urW9sbewta+yu8K8wcS8v7q1s7q+wLjHubS7tsDCvLi9xsHDu7Wusra6vrTEt7u1q7i9vb+9sLq2r7a6ssW8tq67v7S2tMW9vsPFwMPFxsjLxcDGxrvIy7/PysfDxsLDtsO9vba5vse/rLW6tbe2jnh0eGZnZWJrbl5WXmBGS0hISkZCREFFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzsjGyc7M0MzOyMvJy8rLxdHO09DPx8nFycTDv7zPvLK3u7i2tZuOh4mJe3l+hoZ3eIJ9dGheXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5oZmpubnJ8pMe/uLi1sKusp56iqqeeq6yzramrqbSttrCyqa6mrLK8urbDubq6sau1ubu0wrqwv7G9vLu2vMe5wratqqiwsb+1t7yvsKexs7S7vKuttaWutq66sbCquLCtu667uLu/v725wr/Hw8XBvMbByMu4xcfFv8bDw7nExsK7xsnMy7O5wry6sohydnZraWFibGhZV1dbQUxLTElFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bGztLLw8bCxdDHzsLEx8DGxsTEy8LKy8LDwMa/ubu6ybazuru0s6qRiY+QfHl+ioZ6e4WBd29eXVxdXV9gXl9kY2JjY2JgX11bW1paXVpaWlpcZG5vaGZnaWtucoGtubC1rqalp6eaoKSgmpylq66jp6KrqqyqsKSmn6qttbaxvbmvt6+orre0tLy4tLyvuLm0sbzBscCupaiiq7Gys6e8qquoq6yttLOlqK2hpK6psqWnqK2lqLessLK3ubq7sbu9vr7Ev7XBwMfIt7/AxLfEwr+7v8TCvsTIzMq/vsPAwKmGcnRyamldYW9kV1ZYUEhZUlNLRkZFPj5AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3usSwtrCbmZWcmKqpsLGztb2vxdHQzcTIurrMwszAvMq4v8XAu8u5wsXEubvCvLi2vMS3tLe5rLCVg4mNgXx+gH54dH98c3dmX11cXV5fYF5fY2NhYmBgX15dXFpYWltbWVhaXF9ma2ZlZ2Voa29yhaqlrKagnKGllJ2km5iSoaOqo6KfpaWnpayfnZukpqyyr7a3p7Csp6q0qrS6sba1rba5sa+6ubG3pJ+kn6axp6uouaqkp6iop7KtoKemn5ukpayen6ekn6Cxra2ssrSytLC1vLa7wcGyur7DwbK5usKzwL2/tbi7vb68wsfEwsO/v8Sgg3dwa2FmX2tvYFVZXkhOZ09UR0VKRjw9QD06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43ItbW9uLrBu721oJ6UnaGmurars7O7s8TQycvDx7m4ycLNwLnLubzHu7XHurXCxbG8xLq1rre+uq+xtK2hhIeHgn16dnRvbWtqanFpXmBdXFxcXmBfYWNiYGBgYF1cW1xcWFlYWFhWWFteX2RjYmVnZ2dqbW+Inamgl5WaoZabopiWjZ6hoqabn5+jpaGnnpuim5+qsK2xtaKpqqmrq6S0ua23sKyyta6yta6wqp+dnqOisqSmqbitoqamn6isqpmfoJ6ZnZ+lmpqjnJudr6mrp6qrrK2wsrivuLm7sLa7u7qrsrK5sr20trGxtbS/tr3AvcPBuru9l4N6cmtfZV5kZFhUWF1JV1xLUEdJSUZBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfG0MjJwce8vMXEz7+7ybq6wbq0xLezwMCywMK7q6izuLWmr7CmioaIgHlzbnBua2JeYmZmXF1eXV1dXF1fYGFiY2NiYV9cW1taWllYWFdXV1hYWFpeYmRkZWZmaGlrco2onZSUlJuYm6GWlpGcoaKonZudpaahpZygoJqYra6trrKgpaKtq6ahtLCxsayor7KnurOmtqGinpujoa2joam1qqKjpp2lpqOWmJ6XmZqdn5qXnZycnKyhq6ajpKatq7OzqrSwsqqyubSvqa+ysrK3s66prK6yuLC6trm9v7eysZSFeXVlXmVeW1lWU1pVS1tRTElFSEtJQj0/QUFAQToyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9t72/tr68v7KdpaOYpbHCtba9rbS4ws3Ix8HGuMLByM+4wsa/tby8tsK5tb2/tLm9uaikr7mvpa+smX2EhYB5cHJ0cWhlZGhlY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhYWFhWV2FkZWNkZWRkaGp2opyUlI+Ulpefl5mUmJ+eoZyWoaGoo5+eqZyamqqmr7Crm6Ojt6qgn66otqmmp62wo7ewpLefopuYmKqmoZqsuLCioaScoqCgk5WhlJWWm5iXlpeclZ+pnamjoZ2jqqqwrqi0q6qmrbKwpaqusrGvsK6vpqensq6xtK+8tLq3rqOUgXl1ZF5hVllXU1JUS01eTFBLR0dMTEU8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uL2unaeno6q7wL3Aua60uMLNycbDxL7HucnNtMPEw7C+v7i/wLm+v7i4u7Wlpa65pKafooiAfXlyam1ydHBoaGVkZ2JcXFpZWlxcXF1eXVxbXF5cW1xZW1taWFZXV1ZXWFdXV1VbY2NiYmNiY2RmaoGWk5WLkZSTm5mclpaboJyflaCfpqWkpqeenJ+ln6qvpp+io7aooKGiqLShpaekr6Wwray1nqCdlZSpoaKUrLGxnqKjnZ2Ym5OLoZSRk5eYkpeXmJadppumoaKZo6Wlq6SlsKelo6urraaorq+uq6iqqbOlpquvtLGuvLWxr6+gknp2cmRhXFpdWE5MUkhSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7G4rJ6kp623u7zBxbqxubXFysvBxMfHyLfHxbTEwciuubrBu8G/wLy6tri0pKWvs5ufh5eIgHdvZGJnaWlmZ2lnam1gXVxbWlpaWlxdXFtcXl9cWllbWVlaW1dVWFdUVFdWU1RSVWBgX2BhX2BhY2RpgZOTiJCOlJKTnJSVlqOZoJacoKWhraWko6KjoZuqq6WZnqWxqaCgnaWrnqehnqytqaiuraKhopSXo5uckKuosJufop+el5mTip6RjZKTlZCYmJOboaKcpKChlaChpKabo6uloqSqpKuupa2xqaalpqa0pqmorbO1tLm6r6qsnotycG9gW1dWVVFGUU9IWlxPUklUS1NMRUdJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCssq2dp6evubmzwMi6tcCvxsnNu8LLzci3y7+zwMbLr7S8xrrAxcK8vbW4s6OorqyaloSNg3x1ampqbGhqbG1ram1lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXV5eX19iZG2Oj4SRhpCRjpmTlJKcmqKcm6CnqKqoqqaopaOYpK6klJmlr6mfm5mboJ6vmZuqs5+lpp+jo6GUk5uWlpKoqq2anJ+hoJqUkIyZjouQjJKMlpSQnqGgo5ybopWboKKgmKKoo6Koq6Crr6Stt6WjpKKsraqoq66yt7K9tbOrr5iDc3NoW1hYUlVSRVhMUVtZTVVOUExQUUlOSUI8Pz9BPzw2NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zrqiztq6pqK+tm6morLe2rLzKu7a/rMzHxrnCz9DItca9ub7Fy7Svu8O7wcPCvL+xtq2kqKypm5ODgXd4b25pbm5ucGhnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVUU05QUVlaWlpdXFxeX2Bkfo2Bi36MkIqSjZeRl5mioJufqqmmrqqnr6OnmZ+soJWWpKinnZeQj5qerpaXp6qZn5yUpaGekpCTkpOVp6ulmpmZnZ2WjYyMlIaIjYOQi5KUkKCeoKOXlZ+VmqCinZObpaWnqKigsbCmsLynn6OstKqup7C0sLm1wLGtsauQfXFyYlZUVk5SSUdWUVJSTExYTUpMTlJHTUtBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s62msbeqpqKwq52qp6mysaS2xrS5urPLxrq7wsvRzLO4ur7AxMa1s7a8sbm6wry/r7GrrqutqJmehWtnbW5yb3FrcGtkZmdlXlpZWllaWlpbWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY2HkIqYiZSUl5uZnaian6mlpKqdp5igpZuSj56impeWhYSSmqOPk6KclZaVh6KampOLjouQmaSonJWVl5uQkoeUjoyBi42AkIqSkpGhmp+ilZSYmJWipZmMmKSmqKahoLSyp7K3oZ2it6ypraSysqa1u7Wrq7GjiHhxbF1OUFFMT0NNTk5QS0ZOTkpKTk1RSU1KQUdLSEdDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyNzc2Ojk5OTk4NDk4OEE3d7anpLawpKejqaWgqaWks6qissO1tbKzx8a4u8TKzce1r7u/t7rDsrGttaGrtMG4uayoqbGsrJyTo3teYGdzcXZxam5pZWhoal9YWFhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTU1LTFNXV1ZYWFlYW11hb3N2cYWIgoiAkYOOipSRk52gj5qboqGjmKSWoZuVjYeYmoxzjYJ9jZeWhZCZkJOOjnuZjpyMgop/ipifop6Qk5iWhI6Ck35+dImOepCGkpCQnZqZmpCVkJ2OoqOOiZqgoaOjm6K0r6yvrJ+ZpbimpbChsK6csLuqqa+qmYF2cmJVTVJPUE1DU05MUU1CUFFISU5TTUhKSkNKTEZLSjw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMTc2NDc4OTo6NjU6ODdBN3e3oqO0qKWmqKOmpaamprOnpbTBuK+0sMrFuLrBz8a/tK68w66wxrCspqqUoqy9tq6unaWqqqiTkZ5wV1dgaGdpaGluY2ppZ2JcWFdYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVV1lbXWlscm1/hXx0Tlhyj4KXho2cl4uTkJ+XnZWUlpSOlol/k4lfO1dve4uUiYCLkoyPhYZzioSWgXmCeoWTnZSDlo6Qj4OGfZJ4cm+FjX6JgJCNj5eZmJOKj4mch56Xh4iWnpqhoJenr6mtqKeel62zoqatmKyrmKe0oqmto5J9cm1fW05TUlZMRFRKUE1MRk5PSUVMUU1LT0pJTVBGSUk8NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl5t6CjraGmpqqgp6mnoqmwqKe0wbmwtbDIw7i0vs/AurCwt8SprcispqGchZmguKulppSjoqGflIyTZ1FNUlZaWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbW9pe4J0UEJBf5WRkX2JlIyEio2ajZWVipKIhZWGeIh/YEpRbniKkYR9hI2JhX9/bn5/lHd1dXeEjZlwUY2Iiod8fniTdmh3hYh+ioiVio2QkZaLhIqIlISajIGEkpuWnpyUpKOoqaWjnpuwqqGkpJClqpahqZyipqiIdGxlXltIUVFSTUlVTVNJTEtPSUhGS05MTVRLUVFPRkhCPDc2OTo4Ojs7ODo7OD4/OTk+PTg7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85d7aboqedn6Guoaeopaeor62qtry2uLezwry3qLrJubaoqba3rLW/qqGakYKOmK+eoJeLnZSWko+IimNNTE5OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4eBfIWMkoGSmYuPe4aPgHV/eHNudXB0jY2BeX2KqoV5emh2e45wcm14gYqMknh6gHuAdnNykndndYSEhIR6lYmIioyKgH+Ei4x/lIN7gI+YlZyVkZ+dqZ6foJ2gqaWfnZiMp6SToJ+Wnp6kf3FnYFxcSlZPUkdLWFJPSk1NUkpKSk1QSExRTFJUTUVIQTw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc5NTY3NTI1MjU3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw7N3aumKOhmJyftKmvqaWtrLCxqr20sru4tru1sqC3u7OrnZ6tqqu0sqSdlZGXhJKilZuKgZWHjYiEhYFkS0lJSEdGSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FSU1ZedYN9eWd3jZeYjo99Z3mBdniAiY98hJiSgXKHj3x2e29rfq18c5CKf3uGkoF9f3RmdnyFbG9oc3yJjIeAbHlxfXBtdY9xaHGAfY5wQ4qEgoOFfnd3eouFfYt6dX6Oko+YipKam6OWmZ2anZ6inZaNiqWbj56XjpaYj3ZtbGViWldXVFFKU1VUT1BOUVZLTktOT0pRTkhOT0tGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppefn5agpq+srquoqbGvsau8uKy7vrmzraibsaetnJCWnaerpqOanJKHlH2NlJGTf3qIeIOAfX5/ZEpGR0ZBQENESUxMTVFSUFFTVVRUVVZXV1dYV1hZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWJ7eG58eYiQeXyLhW9tjJF4c3hqaoCCcpaRi4F9loBJkphuaHh+gWxpY2x5hZCShmtzbHxucnuGaG1wfnONiISFen1+e3ZvdHOFgnmBd3B8joyKk4OWl5iakJOVlpmXnpeMg4mfkYqSjYaQln5taG1ubldVV1RSUVlPUlVVU1hVTU5ITkpNTktDSE5HRUA6ODk7OTk6Pjw5PDs6Oj0+Ojg6Ozk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5manqWtsKKsqqi1r66stL+rvMK/pqKalaWYno6FjJaio5mak5aOdZB9hIqQjnx3fXN8d3R3e2ZORUdEQDw+PkFGRkdLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganNDmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplfnBtf3qLiXaBiIZ0bJqRdHN7amudj015hZKJhI5nMXaGc2x+fYN0ZmV0foSDhYBmaWx1a3B/fGdwcHtuko2Oe3N9fHFwbnVtgn53eXRpeYmCiImDlpOSkIuNkZSUj5eOgHmIl4iGiYaAkId1aWluZ2RXUVpXWVlbTVBVVllZTklIRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsKzU3NzU0NzhpTzg7NW6SiJmRmpakqK6esp+muq6rsrDCsbvDx5uWj5WZi42GeoWRmZWPkY2SiXOIhHeKj4x/dnd1d3ZveHNpVEZJRD88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7OgcXx4bX1scoOBhYF6hIaGeXKglXR4gHN1lIc1cZ2onY6hoYSihHZwhnyGfHOMrY2IgGhmYmlucm1wg3Vpb1h1b46aknZsf3t8bXFtcH96c3ZtYnaEf4aAhZCRiouKkouRjIuPg3V4i4+AfoOBfo95cG9ual5aXF1bWVhgX1NOW1pZWExISkVKRz9DQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnnq+VpbWprbGuwbK7wcaXkIyUkIGJfW6CkZKJhIuIkId2g4Vul4qMf3l6e3F7dHxrb15KUEc+QDc0NDg7Ozw9PkBCRUlMTExNTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bXeIiHx9hYN/jH52opl5foaBhJmEm5xhhqqfnYqCkI16doh+iYiNc4qXj4N7XGRxdHp7d4psZ2lheG+Fj4J6boF3dIR6cHN5d2tuaV13h32HfIiHj4CLk5eDjYWNh31xhH+EfHV3e32JdW5xcmVmX1taXVNbZl5XUVVYXFZHSktETEc/RkBEQz5BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XIx4ioCUjJGdnZ+mkaCroLGor8CxusW6lo6RlIh6hXZrgIySg36LhJCOeYOCdKKGjX9/goFzg4F9bHpsU1dMQEUyMTEyNjc2ODg6PD9CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHF8j4x6fImGfpeHdqGZiIePkpSljaypSIaur6+LgYCTioKLgYSRqIeAmJiKnHNsfIGGh32OaGdneH5uhYaChXGEhUdrgHdxeXZobWtfdn2DiH+IhYx6lZ6ciouIkX97dYt2fHdtb3d+f3JxcGpaXFxbY2NYZ2VcVVBQV1lQRExMRk9JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWIkY+WmJKXoJ2soaa4r7O9s5eNkouYi310cH+Jk399jIOTlX2Gf4eliImBg4iGeYiLf3WGeV9jVktCNjAuLzIzMTIzNjY4Oj0/P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgYSChZGTfoWJkYGalYKhoZeVm5qlrZOau7Gnu8fDqIuMoaWOk4mBkHtyg52fkZx+doWFio+HkGlob4OAdIyGhItxhoJ3h4B7doV9bnZ1Z4CUj4aJiIeIh6GropaJjph/e4KJenpvZ2t4fXh8cWljXVpZXWlcYGZfWk9MTlhSUUlQS0ROR0NLRENBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NDU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudXBneIN7gIyAgZCPi5qapJyhrKarr7CXkZGEoZSEeHeAjJR9f5KGk5Z/ioCSm46EgYKMi4KKjoSAioBscGpdQ0E0LS0vLy4vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTVFRSUE9IREI8ODcvOUQ+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKCSo6qlo6yTqLaiqMHDrseveLqUmnyMoZ6YhJKFgo+hn5OYkoSKhY+YkZZscHWJi4GVjI2Pdo+EcWyFgYqWkoOFiHKJoZaGk4qPj5altambjZWig4eThH5/a2prfH5+gHFfXGJeWWZqXGtrXlhLSE9TUU5NTEZJUERETkZCQ0VHQj45OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCDcHWHcXaRhn6XlpqUn5+cp6CqlpOYnmdlpJp+hZOReYCRiZGSfYqFmZKRg4CAi42JhpGHhIiFeHh/Z01SPi8uLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVJTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6imopmhl6KVnJ+onqmrn6isqaq1l6u/q7bIyLfJ0c++m6Bwaaupn4STkoWcoZqamaeRkYiVopqad3p+lJeRoZKWl4GUnnt2lZKrs4mNl6B9lJ6cjpOWmaSiprawnZGZqIiXkI6BiGxzc3t9em9mXltfXmBmY2BnZlxSRUtLUE9JSkxGRk1DR01GRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1MzY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjJBQGlhXlBxdWBufWF3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYeYjXiCjYuOjXuKho+QjoKDgImMioWThYOGiIGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1GR0FBQDg2NjI8OTtGSEdJSU1PUVlthpB3lYujp6q1vbilrqysp6i0rLG3srKtu7GzvpyzxKy7ycu4xL+4paOwsqytqqOLlpiFpqagopeCppmNoqqopIeFk6OgoKqgpKmOnLGLlaOnt7uboKOwk6Odo56RpKKrr62ztaKVpaqJmoqTipV6e36DfGVfZltkYF1iY15mZl9bT0RKSFRPRkhMRktHRUZIQUtGQ0ZGQTo4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNYanBYeoV2gZSFiIKbg5KQjZPayJ2Wc1aXiI+InI98hoyPiop6iIKHkY6DhYCLhYWIkoaChImGh4eHcW5hQEU2NDwyLzExMC0sKy0xLy00P0RBTVVRUlRVVVdVTVtQR0dEPD4+RkhDREA3Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcjEq7PFtqyzwLO4vra/tMG2u7ukuMaptsnHtr65tKijtK2wsZuZkpqfiKevqqSUdp+kl6GrsbOYlqmtqK61u7K6rK+1orGssbW8t7WutaCnp6Oom6mwrbK6uLinnLepjaWPkpOghnmBgXNXYGJUZWBgYl9fZV9bVElERUxWUUlKSkRKSEVBQEBLREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFtaUWJkV3p1cYGUfYSGk3aGfoCMe7+7o7yCtJSTjpuPhIiPk4mJeYeAjJOMh4WBjn+BiY+Gf4WIhYqHkXp5bl1WQEVOPDY6NDZBQjc2NC8vNkNIQ1FbT1FVV1VcV09fVUlLSkFAP0dLRkVDOz5AN0Q3P0JKSkVHV1RQXo+lraOxtMO2uMHMyra7xL2ztMG3uMK1v7C3dLG0prrFpLDGubGzsbSopLW2qrGgopabopGlsa2lraunpJigrLO6oqiyubW7vsy/xcW9vbPCt7q4v7e6t7mtrbGmsaqtvrC9u8LCrJm7qJWtj5iYqol+gHppVmFfV2ljaWRVW2NZVlRJSEdMUUdESUpBSEQ+P0JCS0BATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlFMQUxSV1RZVlp3anB/j4SBjoVuenJ4h2K4oZqjiZWUlpOUk42Ql5KHh3uHgY2VioCEgYp6fIuHhn2KgoGLhJV9eHp1ZU9cZEdFTDpRZGFbXlNGPjtIUERaZFFRWVhaZ1pUYGFNU09FQT9JSkhFRkFAQz1FNkI+SEdLTVNaVF6Ur7i1urnJwLu9ysy7vcC7uLW8vLe+tbqyxmB1sqWxmp6rvqqlqKuqpKKytaCrqJ6Vlp6Yn66lp6aln6SToqews6iysry2wb3TycnTxsLFzMLKw8C+vb+7vLe0sLm3t8O6xr7DybCeuqqirI+lqLaJgH1vXWBfXFVgXWhlUlhhVlJWSUVGTUtAPkhEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUVFJQT1FSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBJTVBSTFFdZ21scZCNhZBzbHNyc4jVwLWZoI2VmZqRjpeRlpaOhod9h4ONlot/g3+DeHuLhId7i3mBioKXf3R9emxlcHZZXVxQZWViYGVkXVtYV1xNZG1VUm1uX29fWGdlVVlUSkRBS0tIRkhISEhCSTlEP0hLVFRWXVpck7nAub23xsC7ucrLu7e6tri5s7i1ta62tplkdamerXBeoq2cmKGim6Seq6WUn5+QlI+WmJeon6WfnpqZg6SdrKSqsK23sLy41NDO1s/JzNLMz87Kx8C/wsq9wb3CwMXExsq/yc+0pLuxtbCbrLm9mn13aVteWlhbX1hhYlFbYFNRS0NCRUZFPEBGPkJJQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjstJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREZLT0RSXFlpYG+XkpGUbmxvdHWHs6yhoZ+LmZyZjY2VkZuShYqKf4iHjJCMiXyBg3N7ioOFe4p0goqGlX9ze3lsbXV8aXNlaWxpZmppaWBmaWhtWm10l62kvIeHZ1tvaF1aWVRISk5QSktRTFRRSExBSkdLUF9fYmdqYpe3x7C5s7u+trHEx7awubGwu6yzsaert6yNtqeenKeaTpqejY6glpGnmKWVipOTiJGJj5GRnZuhmJuVloeemaaarK+or6ezs9PU1NbRy8/T1M7Tz8zGw8rQv8rJy8nSyM3Nw9HSuK/EvMS6pre7xKJ/bGFaW1xXX1dYZFlPXFdOUUNCSUVDSTtBRD5BSD8/Qjg7RD5AST00NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ4PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZldzkJCZg2hxb3l5g6CqnqaXjZubmIuNlZGajn2JjIWOioqLkIh8hIJwf4eBhnuHcoORi49+cXl1bHB4f3J7bnhzbGmAcG1jaW1weWl3fX7Lv8Lfp21jeG9kW2FgSlBSVU5ZXlBdXU5QTlRRVVRcbm53g3KWrristKiwtqutvcGxq7WmpbmnrK6hrLSkj7Gum5iYjJGUkYSPm4GNp5GciYOLhIqJhIqDk5WYl5SbkZuYmZmenquspKehrKzO0tXRzczS09PQ1NHOyMPU0cjO0tPT1s3S0cXS1sbBz8jIw6m/uNCcd2xjW2BbVV5RXFpPT1RQTkg+QUdCQ0Y8QUI/RkU+QD86PT09PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYeGi3dtd3B9foChnp6hi42Zk5OMjJOQloV5hZCQjouKiJGHf4J7cn6Agod6hXaFk5GJgHB3c2xzfHx3fHOCeHFrgHJyaW9xenlze77Lmn6MsYN2coV3aGFqXUNaWltXZmRYZWtUWF1dYGNeY3h7f4uBmaqkpKKgoainqrG5q6a0o6KuoqSuoqexn4mmm5WTkYqSj4iClIlrlaKNmYSBhn6Rg4OTl62LlY2VmY6FkpCdl6ewoqCgpKSox83Px8HL0NPR1NLO083G1tPM1NjW1tjV19XJ1NrNytjW0cqtxMPMiXBtYF5dVlJXUVtPSkdKSUpAOzo7RUNEPENEPkhDP0NCOzs5PDlHQzQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX5pc3lygomBnZWelIWLlomOioiOiI+AeIOUmYuNiIiLiX6DeHN7fYOHd4B7h5GXgYRveHBtdX92eH10hnx5bId2dW59doR1eXudtYw8QYrGpX6NfGplV0lDZWNmY2hqZG95W19maGtuaW6AhIiRjJ6foJ6Rl5ifpKSmsqSls6CipZ6hqaCisZyHn5KSk5GLjouGg4+EfpycjI2ChIV6lH6CqpWjjJKKmJKLfZeKmpGrs5iam6ecp73Dxbm2xc3R0NHPy9LLydTO0dXa19fY1NnYzdjbzsna2tLWv8zNtHV0bGJbWFFTUFhVRUZKSUVFPTo3OkBBQjpHRUBFREJEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8xKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYnFxc4aNfJeRnYt+h5KCiYaFioOIfXmFl5eJj4OHhod6hHlxenuEhnV6ho6NnXqMcH1vcHp/cnuAcYSHgG6OenV3fXyCdX98h4mwdFmqwreNkoFwbmM9XmhycHFwbnh3gmVpb3J1eHJ7i4eOk5KblqCWiIyTm6Cbn6qfoaycopqan6afn6yZjJqMkZKOhX2Ih4OFi46gmZOIg4d+bZl5hJmGiJOMjpWMhnubiJOPrqqUlZeemKautbyorb3Gy8jJy8vPycPSytTW2NfY19Tb19PZ29bP29rR1sjVzJN2eGZlWVhOUVJcR0JFSUk+QT49ODo9Pzs+SD1AQkFBREE+Pzo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1N0VCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJma3aAiHGRkJuAeYCOfoOCgoV/hHx9hJiOh4t+hoeAd4J5bnt7hoJ0epKejaF2j3aDdHWBfXSAhG+CkIJvkoR1fIGFenaHfIm4xqXDyriClpyPeHBlTmVjgnqBd4aikIt5eXd7g398hHZtlJaUlY+YkYOJj5eal5emnJigl5+TkpejnZmrlpGRi46Sg4yFiYiBhpCRnpyZiYWLgYWXe4iJn5eQiY2Ki4J8oYiQi7yhmJOXmZyopaWtnqe1vsC/uMfJzc7FzcrR1tXU2dXX29TX2drb19va2djO3MaFeHZkZmJdUlZVVExLRE1EOz09PDk6PD45PkE3Pj9APUA+PDk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozo6N0hQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZmFdW2h0enlsiY2Sd3Z6inx+gH+AfYV7foKRioWGeoWIe3V9dW19fYZ+dH+SnZGfg5J8hn14j355i4pvg5uAdJmGfYKKhXx+kXuQqY6Qw6C9jJuknH6KhH2JcoyLf3OmmpyZlIV7j5GJhGlHcaGknYyLkJKFiIuRk5WPnZuTlJGXjYyVn52UoZSSjo6QjH6Qj46LhIiSlpqfn4mMlJGdkIKMf6aZiIWOg4WEgKSGiou4mJ2RlJahpqCdnZ2jrra6tKu/xcrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u3d3Z1aGdjVF5ZUk9OSENMQz09Pjk5Ozo5OTw9NkA+Pj09OTo6OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT88RFJTUlheVVhmbW1taYGOinFzeIp7e399gHyIe317i4eDfnWDhnpzenRtgX6EfXeGm6GbnpSSgIyHf5iHgJySboiphXqgi3yRjoOJhJx+mpGJjaOin5Ckr6CLkYuGi4GShldyrYufrJyPg5ickJCOW4OikYKNn5OVjIaIjJKTjJSVlZCMj4qIlpudj5WWkYuTlIaAi4mSjYqKnZeZo6KGk52VoIqKiI6ckIOIj4CDh4WkhYuQs5ickpSXoaGemZKbnaexuKykvMHHzcfGz8zPzM/Xz9HUrtbV2NrY2trX1tnZnW16cmRkWlpWUVVWQ0BJRD8/Pjo0OTo7Nzo7OjM8PD89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J4bGJ+koNvbXeLeHp/e4F9hnx7doaFgHNwhYJ7dXd2dISDhX1/kqain6ail4qdkJSXioqnl3KKso2Ep5KEmZSFmoyjlqCYk4mbnqKTqbCgkZWQjo6IlYtujbeEmsTIspyipZudmJaRsZBkpM3IlY6Gh4mQko6Nk5SKhYqKhpaam4+QlJOHlZiEf4+LmYiOkKqXl6SiiJmelZqJj4aXmIqFj42Bf4aPpYiNk6ial5OXmaGYn5mTnJqisrSlo7zBvsfFxcnIycLK08zN1KjS0dbW1tja1NPazoBwfGVgW1xcTUlTWEFCR0Q7QT44Mzc7PDo4PTY0Ojo8OjcyPzk5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgkd2gY99fG1+iHh6fnuCgoN/dnaAg3xtbot/enx4eHyEh4p+i6Ozp6Oqs6KXp5+lpJaVrqKDkbiVkbOajKGhjKWbsKOknZiRp5aomayvpJiVlpWQi5iZl6HAjqPJuaubo6atmZKbnbKdhYWoopyYhYmJjpWNi5OPiIGGh4mTmJWMi5SThpWYhoSRkJx1kZiylpakoYedmpKPipCKl5uJi5aOh32MmJ6JkJCcmpmTmJefk6CdlJ6boLGuoqS3vrTFx8S9w8O/xs3KydKmzs3T0tHW2NPQ2Lpwd3NaXlNeVE9ISU1FQkNENT46Nzc6Pzw8Nz00MzY2OTc3ND01OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER05bXFlKZmA7SISLenpuhYZ6fIR5gYaBfnB4fH59b3KNen6CfHiGi4mGhJKnu6yosr2vpa2zs6ijobCsipq1naK4pZWtpJeprbinpaOfmqmXqaOusKqamZyUlZGXn5eau7uuyqFqtrirsJSZn6Osk5e9o16qsoOKio2Uh5B8jo59g4aOj5SViIiSloyQlY2LjZaYk52ZtJeVq52KnJSSjpGSjJmbipKekIuJlZ+hjZSNmJqdkpyYnpShoJScnaWvqKGls7irwsjEtbq9u8XHx8LRoMbJzc3F19bRy9OgbnhmWlhRXFBORUM+PENBQjg/ODg1P0c9PDY8MzUzNDU0NTRCMzk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEdiYGJwSj+Lin6Bc4aHfYKJdYOKgn9tfH19f3B3h3eOgod7jY+MhoyZqsLAr73Gu7O0wLy0rauztoyos62tvaubu6Sorbm4q6emoqKkoqmvsrGrnZykmJuYl56ipqWSpLqvqcC8ra2yuaWkqH6IhpytvLCDjIyLkIOOg5GPeoGHkI2NnImIj5eNi5WWlJGal52omrGakaycjpqPko6VkJCWl46RoJGJlJukrJSWj5ScnZOhnZuYn6GUmp6npqSipLCzp8HGw6+wurbFxMK/zabHxMfDvNbRzcTKhnJwX1lXXVlMSkFLQEZHPkE/Qjs6NT5BPT01PDY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdEP0NGXGVHYGlnWl1ck4yLiHuHjIeDjHWGkYqBb357gX9xfoF7lXqSlJSYkJOVp7PGyb/CzMLDuce8u6+rubuYs7e6ssCupcGkq7C8vauuq6OjnqerrrSwqpygqpyhm5afsLWni6O6urbBvKypnLKlpKiUhY6pxMOkgouPh4iEhpWUjXqDjZGPkaKMjJSSjomXn5iTmZWYpqCunYyqnI6Wj5KRlZWNkJWRj6GUhpefoLKelJqUn6CYpJ+aoJuglJiepaOmpqSvrqXAxMOuqLe1ycK+ts+yxL/EvLPRysjCtHJ2allWWWhQTEhCTEtLSkFBPUNEPDVBRDs7Mz04QjMzMjI2MkEwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmVZTmVcZlRjapmNl4qMiJOQhol5h5SQgXKAfI1/eIeCgpB6jqGWqJqamLq9x8jJwdLJysLNvcKzrby+qLq/vbvDt6zCqayzvL6qsKqkpaSsrrOttrWgn6+fpaKYo7O9qZuovcGktrewrJOxraytl4eaqaelkYKMk6WViYF2ipF5hY2SkJ6fk4+UjI+NlKOZlpyUlKOeqp+RpZqMj4+PlZaIfI+VkpKimpWfoZy1pZCel6WjoqWenaaYnpaXm6SjqaeisqyovMDEr6Wyt8y/ua/Es7u+wbiswsPCwJdqd2BWVVpZSUpMSUZEREhDQkFETDo0REg5OzQ8N0UuMTIzNTJCMjVTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5qSF9YYVpkZFaej52Ol46ekomKf4qgk4R4hX+Vf3+QiIqQgJahma6mpJjCvcfDx8XTzc7Ny7zCt7C5vLS9y7zDwba3vK2zv7q8rq+ooKmotq2uqbK3m56toqehnqu3uKqlr7/Fsb25tKiqtbSur5eWpayooJGOkrLFp5WOfZKVfYeRmZCqmZiTk4+SlpOlnpKdmZSho6KcmJ+Yi4yPj56IWpCWl5KXpJllmKOfs6WWoZasrKmnm56ml5iWl5WgpKiln7arqrq7w7Sls7XLwLiqtqyyu7muqLi6vbiBaWxYVVNTTURKUk1LP0FIRURISEg5NUVNOz44PUBKLjMyMDI1QzU1T1ZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz1AQkZCcEVpSVJlYkxGpZSbl6KXqZaNkIOHppOIgoeCnIODlZCQlI+aop+vvq+hxrzExMbGzs7O0sq+u7axuru7vs+1w724ubeysbWzuLOrppyrrLmqqaivr5ijr6SnpKW1wLCsrLS+w7rAurSoubW5s6+Wpa2urqSLk5WhjXTBmn2XmYSOlpqMsZWbmpWSkpqapaOUoJuXmqmcnKGgmYqNkJacYEqWnJqVmqWWVZewn6+cnqSUr66rpZqgpZSTmJiNnKCnopm0qaqzu7u7qrCyx7+5pqurrbKyo6GysrSkbmtjWlhNT0pET09QUTtIS0lHSUNDPjpLVD9BOj1FTTA3NTQ0OkI0NE1XTzxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqXmaCiqK+ZkZiHi6iWjoiThZ+HhJ2Xjp2hm6Oktci1qca5wsPHysnIzM3Gvrqzrrm5wcHMtce6wbm1urCvr7O1p6SbqrS1qqmmrayapK6lpKisur+orLa3vsK/vrm0s8Syub2so6+1rLmmiJuXppt2v5+EmZ2Ok5mai66XoZycl5SaoKGonqefmZqqmaGnnpiQjZGdg252kqOalZ2inZCusqKqlKiql6qto6OfpKiRkZmbh5Scop6Wsaepq7m2vbOyrr65t6Cjp6ilppybrampi2BjXl5QSUtGR01JVkw9TUVOS0xCQ0Q8UVY9QUFCRE8xOD03Nz9CNzVUV04/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLVJgTVVIf2VeSEWrlZuhn7uvmZSfjJOrm5GSk4mrjYain4ykrZSjo7bGvrTAusLCx8jFws3Iwb65sq+4tMHCyrXFssG8tbqqqa2tsKOjmKq0u6appquqnamvp6Oqq768qK29tLi+x7y3trjBsr7BtKm1t6u+pY+il5Kin7yfiZqgmZeeno+3n6mcpaKbnKGaqKSzoZudppyoqZ6ZlY+Um4uXiYykoZSdop2gta+lpJOvq5mrqp2do6OokJSUn4KPnp6blamkoaGztLq1rai1srOenKKlmpeUmaqhnnVeWl1cSUdFRkxQSE1FR0dDU0xKQkVHQVZSREg9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKRUBKSk5POUNANT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTlmXEZDQ5xwYkdFp5ekn57DrZuXpZiaqZyWm5uPqpaVp6aVrayZoqu2xMK8vrfBwsDHw7/Nxru9ubKwuLO/w8i1v7C8t7m3paSrrK2hoZqqqsWipKmrpp6sr6uiqai/uKetvrG4tse2tbm4wLK/wre1s7SvvqOXo5aUm5SuoJCho6Wjo5+QvaSpnqirnZ2gm6WfvaKZo5+iqauhnZaNlZ6TnoePhI2Tn6SgnrWspZuVsaeZr6admaqcn42YlJ6EjaCam5KlpJqYq7G1saqlqq2snJigoJKOkJWonpRmYFhfXE5IR0pNS0hFRElBPlFJQTxHSUhbUk9LPUhPVTRCRjk+SEc1Q2FaS0NOUlVXVlFYVFJVSUA4UlFQTTpHQTRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE0NkA5Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E6bVJGPEt4ZWFWS6Kao5yexayhn6yenq6gkqOflqWfpqqsl7axo6qztsTEvb+1v8K7yMK+yse1uLW0sLO0t8HFtr6xuLW4tJ+mrKqsnZ2epaTBpJ+qraCkqa2voqaovbWlsb25trbEsrS4ur+zxMG4uK6ztbWjnaWVkZShrqCZop6oqKujmsKsqZ6srZubnZmmoL2hnaSYq6uspqKZjZqfkp+Jjld/lp+loaC4qqaTmLWjn7Ggnpqulp2NmJOdgY6fl5WOoqOWkKausqupoaGlpZWVnZiLj5GSpJ6JX2JYYl9LSEpKTkVFQUdLPj1KQjk5SkpOXVFRST1MVlw5Rkk9RE1JOEhiW0xDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JHRTY9dWVcS06en6GZnsOopaK0op2yp5OrpaCjn62prJ27sKistrHIxcHCssLDvcbDvMTJvK+wtq2wtK++xLS5sbC5tKyZqLCpqpqdpaGowaybrLCcqqOusamkqL22p7e7vq+3xK20s8PAs8e0u7ers7atqqKmlpWUpKyin5+aqKuwr6+7sqagqaiZmZeToqS4oKGjk6+vrKWnn5KhnpWej5CNlZ6aop6ns6amjJizm6OumZ2brJCek5WTmX+RoZWPjZ+hk4umrK+lpqGcoJ6SkpqThYuRjZydf19kWmZkSklLSlJCQ0BJSDs7Rz85OU9NVV5SU0o+T15dPUhQQkxMSTlOY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDM1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0n6OgnKDDqaSqs6GktKqWs6ynoqSyrK6pu7GtsLW0xsDEw7XAxL3JxLW/yMG0q7WosLisv8Ozt66strmlmKqyq6qYn6aXrbu0m6ewm62grrSyp6u5s6i6tLiyucCqt7LEvrXGqL+vrba1qaesoZeXkaaloqKYmKWvuK6ytbagn6ikmpWVk6Sgt6KkpZavsbKnqqainpqam5aXqJ+gmKGerrKipoyXrpikqpeZnqSRmoyTl5mFlZ6UjI+cnZOLqKmqoaegmJ6VjI6Zj4GFlYiUnndiZ1xqaU1PTU5UPUNBTkM6Okk/NzdST11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMi0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlwaFZDV0aMeWZDO6SjnaKmv6eor7ChqbWrnbqxq6OqtLaxsLm3sLe4uMS9w8e9vMTBxsC4wMXAuam2pKy7rcDCt7eprLG6oZStsa2ylqWnkaq5qZ+msJ2roLC0s6qptratvK2zs7m3rLmww7u+v6bDq7C3rqmrq6eemJmroaKhkZehsa+zrLC5mpypoJmWkpemobappaOisLG0rLOorJ+boKCbnaWcopedo7Owmp+Pk6Wan6iak6KelJeIk5aSlZack4iQmpmUjqiopp+jm5ebk4aOmIt9jJaFjZlpZ2tgbG1XUFFaVUFCRVRAOztIQTc6WFBkXlBWV0VZX11NTFJOXktKPlpjXk5IUE9cVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS4tLiwxPSonKz1ccD0+MS4wZFpkQDE2NDdnWWBGKD84bH1nW1Y7iXtjQz2on52iqr2iq7Cro7G4qqW2tKygrbW9rrO4u7q9trbAwr/IxLnEwsDAuMS9wbevtaert7G8vr60qK6xtp6Wq62orpemqI6nu5+krLOerKKxsLOsqra0tb6usLG1rLC0ssG7xberva+xuKytqqOxpp6lqp+kmJCZn7Oqs6uqs5qdp5ualY6gpqW0rqehra2usae0rbKqpJyfqKOelaGZm6i1qZaZkZGdmZ2fnY+rnpaXhJSWip2YnJOJjZaXmpempaKgnZWVl5N/j5SFe46SgouVZGtxZ29xXkZZZlZEQk1YRFo5SEI2PlxRaFxOWV1HW15dTk1SWGRKSkNcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYFUxNTA9YFZeOClDM1lUXGdLNox6ZkxApJqhpKy2pa2qpq+ut6qvtbunprG3xbext73BwrW0usS+zMa5wsC5vrnDt8C5sbSsqbq2urm+tKmtsLWYmKerqqybq6uPq76erK6yo6ufsK2zrq62srm4qq6usai1r7S8vcqzqra1sbSvrqehs6CbqK2gppaWmpqyoq2gpa+XoaSampKOo6aos6mhprOsqralr7G1r6SZna2nmpifmpmrt6KXk5GOl5yhl5aUq56akn+Sl4ydnJmWkImUkp6ZpaKhoJiWkZOVeYqPhXuMioKJkWptd211e2BFYGtZSUhaWj17SkZENkFiVGlbTVxhSltdWlJSUmJhTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUYFVgLzUoQ19RXC4rQi9KR1BbSDNjWVVLRJmXobGosaqtpqSvrrapt7W6pKy0t8m7tLq6v7+0s7fDwMzIvMO8tr2/v7e+vLG8raa6ube2wraqrLC3lJanrquoo7CqlK+7pK2xs6eoo7K0sbKxtbG4s6muq7Knt6+2tMTGtqm2tqywramno7agoKexoaSUnJmVsZ6nnKCqjqminpuWmKampbino7K1rKiyp66xtqylmaCsqJucnpyUqbiclI6OipibopePmKWgnJSCkJSPnJuXlpWIlpCYmqeco6CSlpGQlXWEkId7hIGDi4psb3Z0e35cS2VtXEpOY1w/YntHSThHZ1dlXExeYk1YWVdUV1RpXU9PSGFdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5IZjI3J0diTFYlLUItPUVMUTwzcmtJQ0OQmaWupa2vq6ilsbO0q7eyt6CrtbnJua7Au8K4s7G1wsPOxcDBvbS9v7+6vryyxKepua+2tr+8rqqysZugp7GtpqWvpZ2ytayrsbKtqqm0u6y1s7WttKyqq6isqbmtsrHIwLilurCprKylqK6wpqWjr6SpnJ2cm6+ao6Oio5GsnqOgn6Kqpqa5pKy1tqWrrKitr7auo56jqaqboJqakqSzmY6JjYeQoaCUjJScn5KRg42Skpyal5WTh5eSlZmnm5+ejJKRjZB2fY6FfHt7homIcHJxfXx8XFNkbl5OWWZcRkSWW0c7Tm1YYltMYGJOVlZVV1RZZ11RUkxjWlpUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8sMSgpKywtKiY1Ki8mMCkzODoxJiozQmM6NipIZUhKKzpIPzNCSFMsPpBrO0dIj5yqq6KqsaSppbO0sbW1srKiq669zLquwLrHsbSttMLD0cXGvsCyvsHCu763u8SnrLersre7v6+rsayfo6etqqiksKSqsqqvrLCvsK6rs7ynt7GyqbOpq6Wlo626rKqyw7q2rbupqaesqaiypamko66qqKKenKOtlaWemJ6ZrJ2ip6miraakrau4srKhqaKgrK+xrJ6gp6ipmaSZmY+gppeGhI6Ki56fjoqMlZuOjYSGj5SfnJSXlIaWlJOXpJucnIqSkI2Jfn6HhXx3foWEhXJxcIh1a19aYG5iUXNxXEs7hHxFP1d0WGFaTmNbTlZWVVdRXGJfU09OZ1hXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyoyNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTxdSjAuSmdERjg8QjA1RUtYMUCVWj5MRZWYraiiq7Ocqqqwtq25tq+rpquqvcm7sL23wq+xrLPEw87Pw76/tMDCw7q/s8jDq663rbK4vr6yrK2rpKeqsKmnqLGltK6qsK6tsrG0rLS8pLezrKyup6ufo56wt6uqrbu3pbe2pKmnq6uqraGpp6axsqSnpaGhrJeqoZWboKaepKKrpK2jn6exuK6uo6aim6qrrqmdoqWkpJmgmpaPmJySgYKPiIWcn4uKjouYjY+KgouXo5uRkJqLk5KRk6OZm5qKjouLfIaBgYN6dH+CgHxydYukh3hqXmBuZldlh2NOP2eTTEVieVdiWVJlVE1WVVVUT1xdYVVLTWhWVVdJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqMzk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2V1ouMEpnQUE8PEIrOkpPXjREhj5IRkSXkrClo6uxmKuqrbastrKspqyqqbzAwLi4s7u1prKvxMnL0b/Au7m/vsG4wbnAxK2xtbGzur+9srCtrKqrp7aqpq2vqrmwqLGyrrKtt6q3t6e0t6uspKmqnKOes7OoqKS0taC3rqCqqKqoq6egq6ypubapqqmpoqqgrZySqqGdoKSipqOqnp2ntK+opqqio5ilp6eqnKOko6CamKCRjo+YjX6HjIeDnZ2Gg4qKjY2Pi4KFlKKajYyZkJGRj5OflpiWjIuDf3SHgX5/eHSCfnl2foCHnY9vcWdncHdcYXOIa09emVZIbXhVZFZRY09NVVRUUE9YW2JVSFBpVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzo3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD5DLD5MVF8vSmk1T0Q7lo6xoaarrpqspa2wtLWwrKawqqm6vrvAsK65rqG3r8jHyNHAvr27vMK9usPAvr+usrKxtby6wbGxsquzqKS1qKWts7O5saOut7Kwsruruq+qrrasqp6qrJ+joLatqKGfsLOitaqeqKepo6qhoqytqL2vrK6soqion6yZkLChmKKgp6eep5uZqrGqo6CtoqGUo6Ojp5iaqaWYmJiejoqHlId9jIaEg6OWhIGAi4aNi5CDg5OgloiQnJCTkI2RnJSXj4qFhnh0gX98dXh5f3pzc3lnf4akdWleZGqAdGeIjH1TWHBeSndzU2RUUV5NTVJaZk5MVllkWEZTaVJRP0NOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS01KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMZzo0OF89YWQ/RjFDUFtbKkhNOVVBNJCPsqGkpqykp6Stp7WzsaulsKequL7AvK+nuaqmr7DJx8jRwry/vrm+v7zJusC4sK+0sbq7t8Cys7qsuKyitKenrLK2ubOoqL22rra+sL2nray1rK2cqa+koKWtq6ecnquzpbSomqqnqaOpnqSpqKm9rLSvrZ2qpKCunJuzo5WknKWln6Sbmqmrpp+bqqKbk5yhpZ6Yl6mpkpialJCKgo+Ffo6CgIedj4V+fYuHkI2PhH+TmpOFkqGMlJGLkZuSlYeJfn9ye3p+fGh4fHp0b3B7Z4R4hIhkYWdhcYR6bWd4XV1VQFZ6bFRiUFFYS0xOcnVdSFpbZ1lFVWZQRD5KTkRDQTlIR0tTP2piSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMScvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZjQUo3R1NgVSo9OURXPiqPlLKaoKCppqWhq6W4s7OmqrGnrbjBvbWvoritqKiwwsnJzMG2vcC1t7+5yLXCtbOytbK8t7m9ta25tb+toLOnq6uwtbi1rJ++vaqzwbS8oa+ztaqrn62wo5ylqKqjnpulsaewoJ+rqaehqZykqKGtu6iusK2gq6Okr56fraaXn5uho5yfnJqkqqObm6WklpeVn6KWm5emrIyekZGRi4KKgICOgHuZk42Ie36Lho+Ni4qDkpiRhpOiiZKSh5Caj5OAiHx5bH52eXhje3pxb29xdmeAc2qDZ2RnX2xyjWxhaW9gbz5aeGtVXk9QUUpJTVRZV01dXmxXRFhgT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNjg7MigwOS8sNC8uPS0qSz4qHTQ5JicuMzQuMCsvNCYsOiQ0MUFoWTEzUz1lX0RMNktWZE8qOzJOWD0jk5mtmqCYp6Sjn6ikuLCvo6+wqqu4wbmzrZ+4r6uotLrIy8i/tsK+sLS9t8S2w7GuubKzv7S6vbeoube9qqO0qKmqsa66saqcvL2lsMG1tqKvt7Wmp6exs6CepKWnoaWZn6yoqZ6gqq6moKaYo6mgsbmfo7CvoayhraScpqapmpqbn6SVnJ2anqmml5ygqZOZlJiek5mWoaqRmoiOj4Z9h36CjX18oIyMiHiCi4SJi4uFh5Oaj4iVnoiRlYKMl4yRfYV7c3B9cXR0YHl4aG5wcG5ofXFje21pZWJeZIV+X1pyanFLSn5oWFpOUExKSFBSUElPXF9uU0RYWlJoT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLjo7ODMmMjwwLDg1QiopLUMqLDQ7Tk5AOzczLS4rLTcqKjwlNTM8ZmQyNE0/ZV1GTz1RWmdIKj4vWFY1KJeep5qdlqygoKGkorirsqW0tKqpucO1s62ft62urbC1xsjBt77BubG0vLa/u76vqr2ws76wvMK5qLu6t6antaioq7Gts7Gom763pq28t7KfsbiwqKWnr7GboaSgpKSgl5uvp6Gfo6ivoZ+ilKSkorewoaawq5+so6+YnKqkqJ6Xmp6lk5udmp2mq5qdnaaXlpiUnY6Tl6KoopCIi4+FeoR+hIp6jpaJjYZ4gYeDh4uNhY2TmI2OlpiKj5d+hpeLj3mBenByd29vdF95d2RrbGtoZ4JtZXJra2VoWWFzf15aa3VpWUd8XVtYT05KSEhSVUYyOl5ebFBEWFZZZUxISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRHQmdbSFRDVF1oRS47MV5TLDKWo6KYlZ2pnqaho6G4qrChu7mmrL3Es7CuorWvra2vtMTEvbO+urexs7m4uri6rq2/s7S4r7/Bt6y9urSlorOrqKqzrK6yo53Ctqapt7ern7K7qaalqK+rmaOnnKWmlJihs6aZnqWpqZuhoJSln6S5qKSnraaepaGok5+poaGhmZudoZKbnZegoqucm5qilpOVlpuOk5Ojp6SPiIqOhnmEfIWGfZyMiYqGeICDh4iHkYWVk5KMkJWTjY6Ue4KXjot3fntsdXJtbHNieXVoZ2lnZW2EZ2doZGZoaV5mYmlmWmV6YmBRc1RbW1NLSUdJT1NAIStpXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTctMTE5NSwmLjUtODA1NzZgdEIzQ0RoW0tXR1VgaEIzNzdhTScynqSkko6lppyenp6kta2oqrq3p6zDwLevrKG1rqeur7fBwL2xwbewr7K2tbi3tayqvLSvsrC9wLeuvLyxpJ+2rKamtamrr6GgxKyqp7G0q6y0up6oqauxpZidqp6opZKapq6jmJ2kqqGbop2XoJ2ntqavqa2hoZ6doZWgpp+ioJmbmpySmp6Vpp6topiXn5aUjpWYjI+YmqegkIeKioh4hXeCgoKch4qCiXt+hIiGhJCElpWPj5CRkJGNknuDlY6Gc399Z3lwa2psZ3Vza2JnZGJ0f2FkZWZlaWliZ29ZXlhdbGNgTWdXWmBWSUdIS0xSWD45YGxpR0JVU1xbSUhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKywwQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNAY0YlNZykoJGMrqCamKCXpbSyo7K+t6Gxxbu5sLGjtqyrrqm5vry7rcCyr6+utq+zubKnq7mxr66ztru2sLm+rKWetaugobGlq6+fpcWhs6WvsrC3rbWerK6srqKZnaeqpZ+VnKemoJmko6mcmqCclZyerbCmuaeuoqGamp6YnqOapZ2WnpiblJqhkqiWramblJ2ck4yVmY6UlJinp42NiomOe4F0goKKmIWHfImIhISKjIiShZOckpKPkJGWjpB/gY2Ng2+Bf2Z5bmhramdxcmtbaGNhcn9gZGdqbmtmamZkbFxsbXZxYFNiaGNlWklGTE1PWFFQVWFlgVRAVlNZVUZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OjUjMyopNi41NTQ2NVp8XTE6S2pbTVtLWGRjQEExSGNCJzSTopyPjrGdm5ShmqmysJ+5wLags8G7vbmxprawqa6lt7m3uKy7r62rq7eqtLmtpbK1sa+psba2sbO2u6epn7apnZ+qo6qtnavDma+lr7G2taysnrGtr6qim52krKmclZynpJ2ZqaOllZqgnZGco6uqqbqep6Sgl5qanaGPa6KVmJxxg5acpIB2kauonpaWoZGJl5mAl4qfj3iFk42DbWl+d4RybIaKhn2EioZvXWRgZ4SXhmuLkJSSdXeLhH+DkIBmiIBodmlmWF1pdG5OUGpjZnGCZl5kZm5raV1dXomQhYhoT0tDN0RUZ11KSFBQVVVLSFNgb3RlRVtRVVBGR0ZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNU9rW05cS1tmYj5HMU9hPCsvjaSah5Wxm52ToJyqraujvcWvqbfCuL28rae2saarpLi0srOwua6qp6y0pbC1oqe4trWop6y2s660rrOiqZ+0q56ipZynqJuvvpWop7C0uK2upKitqqumoZ+coaionJehpqacm6eonZKeoJiQn6iqo7Svo6KjnJaYmJejiKGPkpqGoYiUnqF/pX+nrJ6Uk52TiINyeIyOg4egdYiNaZeJZn5zeaBviIeDfox8f6Ggn5l/e4eedIiOdpuKbIeCg25pZWR7bXJiVIZtY21pmHFYaXBuhlddaVtralqIcG15codoh4RZXkZNPkZeTUVSVlZRUFJXVGddTFlLUlJPRUdHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STkvMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN0MTVSa1tOXExbZ189SzFVXzcwKI2ml4SdrJ2ZmZ2fq6qoqr/DrrK6vLfAv6qkt7GqrKazta6vs7arqaWxraW1s5ustba0pqeos7Gtsqiunqqhs6mgpKSaoqSdsLeVpaant72mrKepqqunpqKgmaCopJqZp6OkmZylqpaTo5yUlKSmpqG2pKOgpJiVk5iTnIiukJiViamLmKOchrGApK2elJqflXmC1Kh/h5TAm8Z4d7Glt5ZkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyXsauweWhsWLGub2VpvJK8bmh6bXCP2H5Ta2K2sn6AcZR1mqGqkFZOV2FPVk5GVFtYUVBSi1xXW1BAXEVRTkRGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzExVGtcT1tNXmdcPkwxWlw0MSGOppOBp6qfl52dpa2yqbHCvbK1v7W4v8KrprStramor7Sqr7a0qKimtqWoua+csrK2qqWkp7KvrbGmq56npLKkoqGfl5yhoLGulZ+joLS6oqqooKytpKKdm5qiqqCYm6mgn5idqKiRnKeblJ6ip6OhsKOen6OWlpKYkpmFsGtqi42qfmeFloetZXGenZWap5ZxrqGkfne6fGuhj3axX2q0W6WAZZyQYGaBemZ/aXhqqWW+cmemjHaxanyxeHWSlGNtbaduXISgRWlnh5ZFdZxgfWZ7o6aCWV+Lq2mAknh6aqg4Sq9bV1NsY1pMT1hfXFdWO06IT1ZWL0lUU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLi41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV5YMzEbkqKVgq2npZ6jpKqxt620vb6wtsWyuLrDp6mwrK+pqbGvpLG6sKSlr7OjqbmpnrOysKOloaqtsKyvpqifo6KxnKOdmJWYnZ6wqJecoqC0s6Gqm6GsrJ+empego6qdmZ6loZ2aoaekkJ2jm5ihoKyfpaagmqChlZWRlpGahrWbtXmFqZm1mXeHs5u3f5OWl6uWfmuBpnqBhYaRlJJ3q2dqsVuse46HlHSIcI6GgH+IkJd4g4KLl4yDoI+FsHZ3n3Framx8i0+lWEhjY5l+Y2ilX3lxdVKSh15QqW1jcX2GgGGdL1KibltTa2dfTEtcY1hcWkI+sHdXWEEjTWhGQkRBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJAQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SjlhVTUwHJaflIizpqahrqmos6yqu7bCsLzCrbi3wqusra+up66zqqKvvKuip7Wto6u2paWys6ijoZ2nqrKosKimnqCgsJagmpaWl5qgr6ObmqSota6hqI+pp6mbnZaYoKapm5+do5+coKOlo5Wbn5ianqOrm6WanJqioJaTkZOTnYTVk5m5cbDCf8aGfNaUnLt8m5amkI2cjKR6jYaigaWCeqx5j51Vr3uJfp9quVq5d4WDfaaCk3yYeqp5jp2Qe7FtjoR0kLuFbpVQr6fFilGgemNgqmJzcoZsl4dfU7W0yIWAiXxjpDNCnXVdUGpoZFBAWGZZZGFKSE1rSlpTT1lmWkNDP0U/MDw8NTk7NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbSltQX2ZUN0c6YVA3MiWcopKYsaippbOqpbSnpLy3wbG6wLK2tb20tqeysaOxs6agr7apm6i6rqOwsqGytLGhpJ6ep6mxqbSppZyenqyXmZmXl5aYoqyem5eprbCoo56OrKKnlp2YnKGmopiioaOhm6Kip5ueoJ6VmZumoZymlJubn6CYkJKVkJ2Ism5otXGriHCOpnK0dHO2e5uYpY2PnI2ifo+fpH6wdYOR0tF1W658hX+kbpuqpmuGhX2tfZeZj3uxc5Odj3izZZZ0hZ5unmaUUsmLWsJcn3liX61fdnOGYpeIXlnKnW+/gHVNS7VTVcZkVFFqY2VYQU9qX2xpUFVGSTk9V1JbVllIQj9KPDI/OzU9PDU2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEFOVF9lUDVHPWFNNjIuop2Rpa+spam6rKa1pae2u7yyu7+4t7W7u7SmtbSisrKjoKywpZinuq6ksrGdtLiqoKWdoaqksqisqqSanZupn5aVmJmSk6OqoZiTp6uwpaGWkqyfpZKUoZykp6CVm6enopqjn66aoZ6ekJacop6cpZSdlZminpWZlpKbhax7d6h2o4+Lh6lvrYqDp4SamaKKkpmLon6Rl4euhX+Cs1xys1KufYKCo35x1313hH6PnYaZmnevhoqRnIh3tGGaZZqCgZVskluwV0uadZh5ZmCtXnZ3h2eYiGpdr3eVn494bDV5yK6yX0JUb11nYEVQbF9wbVZVTS5lYmhTWVA7QURATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0NgSTo3N6Cdk6C4sZizwayosqeqsrq4tLm+ubiztr62pri0oLWtoKCprKCVp7asqLGxq620pJupn6CoorWnpqqjmZ6VpaKUlJyakpajppuUkKetr6WglJipn6KPkaKaqaahlZqmqZ2dpJ6tnaGcoI2Un5ueoJiYnJaXoaCUmJGmnYapfX2leaGPkIOqcK2MgaaGlqCiipeWiKOBkIeUqnuAi515b7FaqIOCiKB4dNh/dod0p4GOm42SpHyVkJ+Ee7JenGSgfYKUbZNcq1xbk3+Rf2hnqmNye4BqmIZxXataiaCPa25lT0pDoVxaTXRdYmZNWmFfcnRfSlU1SpqSWEhFPUhGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPE9lZEEmVWZbPzFUX2JMN0ZJX0MxPTeinJmZv6yYs8Kuq62oprSwuLG2v7m6s7K4vKq7taCxpZ+mp6eflKqxqbCqtq2qr6GYoaCmpKS6oqOroZebkaOglZWfm5WYoKCQjoupsK+mnZaap6afjZKkmKisqJWYqaien6CkraOhnqGOlaGYn6CSnJeclZ2hlZaPq5uPrm5ytHSpjHeKpnO0eXS0gZOlo5OcjImkh451uG6Le4uia2u2WqGGZZeXaKCip22UcrR0k5h/smqFkoitanW0YZ1mom6GkmuXXK1gTqF8h5FSc6NseX9+bpiGcFyvVjycd2ZUb24uW6dPYlJrZWJsWmJcYHB8Y1NZUT4+bW8yQkJAP005ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKywzMjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV45MUE4pZqcnbqinLG/rq2rq6e3qbivtcG1vbKwu7irwbaqq6Gdp6SinZKrq6e2o7Oorqqhl5yooKWruZ2jrZyWmZClo5aOnqGcmJ6fkZOVq7avppmTm6ypl4yUppqlraORl6uypKCeqKuwmaGikJmil6CblpuXoZOcqZ2UkKqZh9OTmrt0scSAw4Z+1ZabuHmJkZiNl4mMp4d5orZ0fXd2woKasmCDunnAfHW4YrWBjIepfZaBrKlxe391vIinoGmdYaaOr6J+jHSHq32+bnO8dLKDdXiAim2aiHFtjaR0vV13fVthebxqWlZbaXpeaWFkZmJteW9ZW1lDQUByP0NHKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw7OjA4TFhhRidUY1g8L1ReYEs1O0xbLTZAOaeZn6K8opexwq+tqaqssai5r7fFsbuzr7ywrsGyraajn6ShnZyRqqWqsqS1p62koJaaq5mnrLmdo62ZlaGQpqCTjZyjnpiempCWkq+5sKuVl6Onp5SQlqWdpK2fkaCoq5+cn6mksp6ipI6nopShmpuXlaSYj7CgkpWpn4WQmbaAkZGNuJV4gpObtXdubG5zb3mPhI6Jcp7Bu7yZeoGyqHCAdJG5g3uGhoqGjXuKho2XfKS7ub2cdXmzo3R2l3V0sHWYnmaGaY22dHJwd7aMXn95fYhng3lteWKLrHB0hX9YW6dpRGRZVGZfY11jUWZmcW11Qk1PTEQ7Wkw/SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JXOCpPXV09KztWVic9OjymnaGhv6aWs8Kzq6qorKuqu6+xxq+1tK+4p7W5rqukoqefoJ2ZlKykrqqmtqion5yWoKOdrKS+p6Gql5WckaKbko+hqKGTnpeSmJSytbasmJ6jpKKLkpKmnKWrnZappaacmqGpp6ajqKGSrJ6Xop6Xlpidno+wqZOcp6KPa35pnKh5iHN+m451emWHe76/wLpukoJxlIVfcmpaXZqJYWSHjpVrYH+UY22bdmKUa4CalZRlXl9icZqJaHKMfIaUZmp+cXR5fn1iW3h0gWhQXG6DfHuKalhseYFySUpvhXBOc01EVlxmYUxbV2ZjXk9abXZqclJPREVNPEhJPEw+MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNURGVUVKT0hGUElJSDs4PTUxOi4xOzouLy03Nj01JiIvKjIsJTs4LTdJUl9JJ1NfVjQpUF5MKDM+W08nPzI+qJ+oocGkmrS5tqOspq6nqLWyrMissLSttqS+sbOnoaSqnaOcmpqsp66kpbWqpJuYlaKbpq2pvqiopZWUm5agmpOYpamnkZ6Qj5icsLK+rJunnaeiiZORqpuopJycrJ+jmpujp6yhn6qimq6blaaglpSdn52XsaWZoqiZnJGenKOlmqejmp2ampqQloJobn1xdpGXk5CDibSpjYWYlY6KjJiWh5OViYOTk5CIjZGUmZOZl5qgoZqblJ+bjYJ6pIVsaXuQfYB1iYuCcoJ4eXZ1ioB7iWpzgXSDdWR3fXZrcHpsX2Jbb2dMWFllal9XWXB6b21mU09GUjlPWk5STygrO0pCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8Ojs0ODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlQxMFReOis9OF1LLDwtQLKgs6K/oqOxsbegqaazp6WwtarJq62yprWmwKi0oZ6lppyllpagq6eto6S3rKCZl5agl62qpsGfq6SWkpyXnpiUlKKenqOokpCZqKeyw6+Zq5yqno+Xlqmeq5yeoa2YoZudoqWvpaGkqJ6rmJemnZmaoZ6enLChnaKnlZiUmZSho5akn5ihjpaUi4qOj5etj3uVm4KRgImpqIWAmJaKhI6fiHuDkIWFmpGGhYmVjpuXjpCYnqOWmZKQnI1+jWWhs66EiYR3e4+Kfnd5em9neZCBgIlrdYF5iHJpc395dYOHgWp0Y3hmX2hkY2Rmalhre3Fqa1xTTFBEX1VGQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVFZWWFpcX2FjYV9eXV1eXVhWSktMQklPTVJKOzw6Nzg2LzM5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LECzoLmvvqyrrbGyoKqmsq2irLOwxrCrraSzr7yktJygp6KhnZmXqKappqSms7WelJWdmZmwpq6+oKuikZGempmUkpahnJepnYWdqayitMezn6mkqpaWmJqnnqmcoKWrlJ+fnaCqrqiko6uhrJufn6CYpJ6cn5ywpJmfqJOYmZ2SpZqZqZ+bl2aDknxlfo+aj2N4jGxoanqQo6trZJmXfmeFimVlaWh6jaGOameMl5Gid2tqi5iinphya256hIyGeVhlXYWCXmyLioJ2W2hzd3eRgIeCbniCeH9zbXmEc3eIiI6De2mFWF1qc2Rdc4hpa3xxbWNdUU5XSWRYQEozPUY3P0ZENzE8PT9BQzs7REdISElMTk9SUlRXW15gYWFgXV1dXV5fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtJLjZaTzYpRVkvRE8xWUI7Py49pZ+6vLmvrLKwq6Wora6wp66tsL2xqqilrbCwn62YoKSeopqap6ycrKOmqKmzrp6Wo5CjsKa2uaWuo4+PmqGZk5KboJiZppZ7payiqLPDt6Wip6+fnpWeo56jnaSqqJKfoZ6gqq+pqaOqnqebpp6noKyWoZylsaSYnKuWoZ+bk6WYn6uZnn6+g4hytHKFnoWtaHe5xLhxkqGje6aYmHOqgnzLwMC7cYqjh4KefJaYiJ7AvYKWnZ2MnMHAe4F6kYyawr99a6Wyb4yBb8p6f5t3kYOOgHZ5gX95cXuAhnB4hYyTeWx1kWJlXnhjXmWBYl50aG1kYlhMVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYF9eXl5eX19fXVxTTVBHVU5BQD89NjQ2ODI2NiomJSMpKiYuKyopMTAfOSojPkhbTCojQ1AvI0ZbM1BZL1VBQjsvOJaiuMO0sK+/qamUo6+psK+tprK1r6qmp6Wxq6CrmJuioJybqqeinauipailpbSknqOTpq6suLSnr6KSkZmdpZKRoKGXm6Cdh6aqpKutv7+xoamuqZeSn56imaOkqqOToKGenayup6umo6Gln6SknK2okaSbqa2qnJ2rna2il5iml6KkmJ1/zpR5eqWBepaWm1+tj12OqICgoXynlZp0q4KAr15kjKl6qIeFn3SXkoizY4KrhqCNjbNqhK5zfJaHuGGCrVmjzW6QdXvbe3+ZcX6IknV/ZXuIdnZsfYdufYWQkX1rgI1fcGpvZmBfeGRbcWhqY2ZgUlRTV15KT0M1QUhFRDg+NjtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVpXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDpMLSFQQEY0LjGtwb+/tLSwt5iekaOqqa20q6ayrayspKymsKqhp5uappicoq+foZ+op6OloZ+wrJuelqaurbCrqKyglJKbn6WTkJ+kl52no56to6uwqL/Gs6ipsa6Wkp6copehqqqflaGenZyurqapqJulpaOhqpKss5aloqqqnqSnp6KxopObp5uhm5WUkZegcIWMmHWEqIdxsHydcqx9oJ+BpY+ed6uCfa1/nHKtfquHhp92mJJ7fJd+qoihi5GLnH2reoiSj59/eq1WnMR6j2+SwX2BlW11cIxtZndlhm9hd25yboiKkY+DbI+OZG1zdW9gZm1kX29oam5mY1dTXGBaUlJDOElJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLTwoPTEpM1ZARiEcRztDMS0rr9PFxrKzoJ2jjqOioq2utq+psaeoqqiuq6umoqOdmqOVn6arn6KmoKmoo5+esK2Ym5aop6+sqKepnpeVmqOikpShrJqdpqOvrKOstam5zbKtpq6slpWcnaKZn66snZahmZ6eqrGnqamaqaejoaqar7GiqKyvppmmq6qrsqSTmKSmm5WShaRqpHWJeql1erJxgqWJmIxwh5+ah6RfYFKrhH+ugpt1roKnhoafepmXhXtmgKOJpJiGgaN9qX6BlIauXnuoVZ2ikoF6o5+AfMOvxYxzr7SzuXFiqa/CdGiMjJeOgWyYkW5seHh3bmtmZGRxcGZ7aWNcVl9pWFhUTExRTENDQUI7Q0FAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgKCciKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dXAoZmrqKGvop+wtbCvqa2jqKeqq6uppKafm6WfnaanpqSdrJqirKGjn6+jnpuTqqS2sK6gqZucl5Wmo5CaoqefoKabsaajqLGstsiytamsqpWRnJ2imaCltJ2aoZScn6erqaKtmaqnoaGpobOtoqqzsqKcqqiwsLellJekqJmdknyqbJ6Eh3WreXywboKki4iflpWelYHSt7S4yYCBsl5flKmDpIeHoHqYlZl4qslzmaOUp6iQkpqMfpqJmsbGd2WhgqVzgZ+Ogn2vXm+1Y7F1S6OGbadHgpNkjo+ckntvlZB9bnl0fHptW2VqcnFmgWpeYVhjbVxeWUlMTEtFREJCPUE8Qj9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00TlRRHRw7PEYyLCSopMDGua2psq6spaKdsrmsqqGmm6imqqyppqCmpJiro5+uq52moayanqmlnaa1n6KXk6irtrKsm6acoJaQpa2SmpymoqCqpq2hoqepsLTCsbKqraiUiZidpZuipK+ml6GVmZylpamZrpyspqWdq6O2rKCxubCenK+otLS0ppaYqaSboY+CnU54moF/n3qEo3yCpISGpp6cnpSEuHt8ebmCf8zGw7Z3m6GQi59+mpaXiXafl4qkmKSnfq+Em4OehKx9mZRhpWyjcI+FkIF9l4RyrGCkcnGAmmC8fVJVdY6Ro5Z7fJGOh3J5coN9cFxsbndyaoBuWmNfaG5iZF1MTFFTQUhHRkk5OUs+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUV1lZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1RGPEUyOlBbVBwbNj9HLC0gjIeZqaykq7mrr6CboayztKafoZWlr66uqaadpaWao6egsq6iqaeyoJmppJSjtaOjlZeiqrW5pJyjnaOTkKGymZ6bpqSgoq+tnKOoorWxw7Gtqq2qkYeRnKedo6SdpZeemJmZpaOnmK2hrKOll66lu6yht7eunp61s7mytKiZn7GipZ+Hj9G1w7d5h46FkZOPgKZ4lKJ3i6CShaWCi3GrhoW0bnJpmaOclYmffJeZhoeQc66CpZuijKaKk5yIlJCabXCyXKVzk3qcbJl/e5l+bqlhonFxf59ic7K4aHePk6SYfYqLkIh2e3iNgWxod2l4c25+dFxkZG1tZWhgSlpXWDxIRj9UM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCMpJZJyjYqtv7+8u7Wel6ikrbaho5mVo6mnrqmrmaWhnqahoLWnoqmnsKOUq6OPpK2jnZCamqq0tKSdppypkpSXrqCgnqajnKectZmgqqO1q8KvqaupooyEj5yioKajlpqanJibmKajpZeppqyhpJuspr2slL6wrZ+jsLS7rLWonaqzpamZe6iRfXywd4qBpKWInG2yb6CHrXuhj4OolpmArImFroWglKihopeFn4CZlYB7kn6rgJ2Zloqqd52gj4iTkn95r12jgXymp2SegHyXdGuuXaVrcYWZXWBbjKBtlJClmIKTi5OJeHmBln5qbH1ifXRtf3lfZ2Vwb2dnaEJZX1s9SlMyVDhCQkM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pYU1BPTkk3MDUyLiosQVRWVlZUVFVVVVVUVFVUU1NWV1dYVlVWUUhGSUojKCi8kpqEqcbDtsG0n5qtoK64paOOmqSjoK+uqZ+jnp2tmJ65oKKroK+qmq6hkaqppZaJmo+usKymoKibrZiZj62ioZ2loZmknK2Xn6iltqi/rqSpo5+LgI6bm5+mnpKUmZqUmpqko6OYp6qqoaKeqai9pJfDrKujoqyzu6yvqKK1saqsmXavfpCKnIWHfbqtiZhksIxlla19oY+Dp5abgayKhLCFppmjoaKRhaBbbGqBs2B/rXt6goCxbGdtmZeLiLFafbRbpINryKJln4F7vFl2tVqyfVKvgHqsWIChbZeOp5mJlY+TlHl3jJt8Y3N8YYN4c398YGlmcG1mZWVPVWNcQVRePUgoPjk9NCEhLCQfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTUpHQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+0sbe9u7TBs6Ocraaltqmgi5mgn52zsaieop+dtJigs6iqq56wrZ6sm5WuqKKOiJuOr6yop6Ooma6Tmo+pmqGepZ6Zo6KlmJ6iqbKovK+lqJ6djnyLm5ahoJmQkpqbkZmXqJ6fl6espaOkoqSpup6gxqelqaGstbeur6ihva+urpeBqZKjro6bgIakl5iQgIC4w7qDjp2ThKeYnYKsioKviaecmqWrkX7VvcKqYqS/vX1+o4KD17q3tYWTkoKevb6EaqOBb6uEbp1/erKxx4Nrq7C9rHh3or67dICVjaWajZmOlJp3f4+ZeGF8eWOMZ3iBe2BrZWppYlBiW1NpXEBUYEJMKTw6NS8fHyQeJTIgHSQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVtLSxv7qyvbOina6mpbOmnYyYpb+ptrCnob+mprGbnrGcuaifra6lp5WUr6yXjIOaka6mo6yhpZyqoJiKo5OmnqebmqCoopidoKysqbitp6Oal5N7iJmSppuTj5GYmI+YlKiZnpaop56ppqGiq7qeqcWjobCkq7S1q7Gror2qsLCcdHaqpLeFZYmfcGesj4qPbm93pJCaoIF1sJqWcJCNcpaoo5uYrqRybG1sZYp4bm2CmXGAemlwaWaJlZWXcWhphYZncIZkXYpjaW9ZXWd+eKZgYnKPkm9mZICNk46hlpWWjpSbeoWNk3RkhndnjGp4fnhkbGNlbGJLZVdKa1k6UGREUCdKOisjHCAaIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola20qbq5srOqqaKunqSzqpiSvbHDx720qZ6/q6yjoKarn7qjpK2sraWOlq2qkIyFlZetn6Wqop+ko6CRi6WSp5mpmZajqqCWnKWmp6+5qquam5OSe4SWjqaXjpGRmJSNl5Wmk52Wp6KZr6adoqy5n7DCqKS0pqyxsquvram6pbC5l4uhqaW1nImWopiGqZqQlJ2SqrOZm6OsobSXo6GeoaKcoaShlaynjJKTjIeSnJyUkJmTmJCOlYR/pJqXlY2LkpKKj4aEfmeLgHSDdnSHjHGnbXyVkpSTgYGPj4+OnJKflJWUnoCFkotwZ452bol3dXx5aWtkZG9jVWBYQGlaR2JgTlgrRT0rJiE2NDAvHxwhJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlRRSkVDPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqS1t66uorCkrZ+gtrGQjqrEu8S5t6mhpZ2bpZ2wqKO2p52ptaankZiso4uIiY+cp5aso6GaqJ6ek5Wjl6iaqZmUpqGjj5qnmaG0uaeqmJqQjXyBlIyhlIqVkZWQj5KXpI6dmKeem7Wjnaart6ivwq+kuKewr7Guqqu1u6KxvpmSpqSmtaKSnaaejaifjJGfo6ywmqGksqqxmaWhnaSrnp6dnJesnpKaopuUkJaqmY2YmJaQlp6Rh6CdlZSFkoyPjZWLgX5mjYd1h3Z5iIR0nGqHkZWVkol9jJaSkpeRoJGalJ6ChpaFeHGUcniJfnF7fmluZF5waWBbX1ltYlBgZE9ZOUdGRT0yPD04LyomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5eVpKejsLOsrqOpp62gqLWqkI+co7K6raqroaKZepyisKSlsamWm7imo5SYqZyOhoqJm6KQrp6klqigoZKXmZuui6qWj6iZqIyYqI6euLajpZibjYl5gZSMm5OKlZGTkI2RlqGLnJynnZ63o3+Dr7WisLB0pL+ksqB4e6GstL2Wd66loIqAqX5kXGJ2n46jnYOWfm6UtJyjqK+spGWfoJR0epqXcICZqZhsgKOoimWcpZyQl5iWi5KbkISdmpCUg5KHjo6SiYV3a5CIdodxfIaBgGFpiYuVk4xbdpWRZ2iPjHF5opaWZHeXhoB2l2iCiYJueX5qcGVfdW9ra2dcZWNhYW9SWj1NTU5SRj1AVEI5MS8eHyY0OjMwNjY3ODw7PkBBQkZIQkdGSUtMVFVVWV1gaGdnWFFJPERHPDlWUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuppamtpKetpJKWqrSusaWZqaaql3OLna+fqKunk5a4n6CPnKSekH6IiJqejauapJWnop6Ol5GehXSuj4ilmqiRlqOIm7mzp6CZmYuJdXeTjZaTipORkJSMj5OfjZmepZibspaAjJu1nbSNko+9p6F+p6J7pLC5go6Pp5+Ei4WPsamvjImWopl5gIushpydoqirqYiVh5l3pZt6h5yBl6eCgXudsnqKhqCXmZSYloGQlpaEmZpjeYeQhI2PkouDbnGQiHqBcYCBhn+GdIeFlpJ4lmiTdKCadHuZgp2ahJh9kYiBgphpjIyEanh6cHBnZHhtaWxqXGRpaWVyW1xIVExRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1JYWlhbYWFoZllRSDlFTDs+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZijn6aurquorKCosKenqqWZlK3FvK+glaWntJ2Pg5yrnKaioI2Qvp6ZjZ+aoZB8hY6ZmIisnaOWoaGSjZSJhoCRqI6Hopyjk5adhp65saedmpOPhXB1kImUkIqUj46bi46RnZCVnqOUnauHn7SJtJqui8qIq6+Jt4WNsIOysIWpjqeYjZ18qI9ye3ebjqWWZ5SkebSMn5+nqZOZwoJ/q4iYoXGegJqlfZeFlbKAoX2gk5+PmJeAjpObiZiSi3yFk4aNlJOJg21zkoaAe3KGgYR9hXWGgpiBj8VmgKmHj6JqnYGel4CZgIqMg4iYb42ShGd3dHt2Z2h1cGdoa15ibmxmbFhmRlxRTDJFNDZNYGM3JjQ8REdEOjYzNjU4Ozg+PT0+Qkw/TklKS0NQWl1cV2JeamxcUUU9S01ASmRYXWNmaGdiYmJiY2NgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXop+wqKmopaugpLmxqaummpSeoqSqopWkqbWir3+gppylnp2JlLyZk42gkZ2PeYOWlpGIq5mcm5qihY+Md5ucjqCRiJ6km5WYl4aiuKylmZuNjX9ibY+Lk5CNj4yMl4uPkZ6Nkp6gmKCnfqGnh62doJaukKCenZGGgqCNrLGIpI6rmoyafqJ1gJiTa4GqdEyqeIeNnZKbqamCqqt+hKF7eqdpnn+SbGeXhpi2iZ5+bmBjWIOXf4x7ZGeLc5l9eZZrXXyXbl9TcYVcYGx5g2BZZYJ+hIGYcaeqa4OjbnKlcJ+CnGdknmxabIh6ZVlfgn5hV1BvdmVtdHFqam5eam9sa2hXZ05dWEU5QDRHRF5rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSTE1CSltdX1deX2J2YE1FOk1PTVRiXFtmZmlpYmJkYWRkYmFiYGJkY2FiamtkYmRkZ2RiZ2VhY2iYlp2guaCqo6askaG2vKuuopmWn6Clq6ufnK20oaeRoJ+fppuZjZi0mZCLnoyVi3WBlJGNiqaWlpifnn6ThYaso4eckYqYqZiZmpGHpbCmopWZiImAaW6Ih4uOjomLjJGLj5Ggi5Kdn5uhpX+TgY+joZSgd5yWkKeDoqiAhquvhqV6i32Emn2icHKSh5Z7nYx5bYebi5mRnKmcj4edfIKic3amZp5+d6RemHt9k3Oibpi3tLpzkoiBgLaoZIHGuHtwlbaMcYCbpGN0rKtgfWqds35ufYeDj4KLl3GAo2xzpHOegn2jXpyZs5Zve5ees3RyW56ygmlib3N1cWhuWGtrcnJkW2ddYUtEPUQ1UUFacDI8UkZfSlM9PDM5NTo6NkQ7O0BJUD9UTU5RQEVfXltZWGBge2RJQzhMV1VWYmFaZmZra2JiZWFkY2BhYmBkY19gY2tuY2NkZGhkYmdmY2holJaVo7mZq5yToI6luLWtraCaoZuio6Srm5qxrKqSl6CYoKSZmpSeq5uLiJF4i4VwgJaNio+hkJOUnZd9kYqOqKCHmI+KkqKTm5qMiqinpJ6PloeEfmt7h359j42Di4+PiY6TnoGVm5+coJ+LiXecmKKNoHKii4ipiJynkZeprICujH16oJl5o5N4gHOXiIucfZWfhpuOmZynh6NkoX2JlpCbjGyeaJqNbpqZe4CKp31yZ3Oqg52Cc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF6ndnaJioCdaJp1h5OSmI5/nm2ZkGqmmVyofne7an2pWo6EXbNnW25xeHdraVtwaXd4YV5kVmFBUEVPN1ZCUm00SlpZXk5aREAxNTE7OzdIPzpDR1U/WFJYXT5EYl1WYFFhZHxpRUI5TlteWWRmWGZnbm1iYmVfYWFfX2BgZWNeYmRucWBkZWVrZGNpaGdraZWciaq2m6iJY5WcrLqysKudpZuap5+drJmdsKeqnZaimaGfmZaWoKOZhomNaYiAcXuXiIyWloSSlJiPeoqElqOciZWPhoudkZybiI+oop+ajJGKgIBpgYZ5f5aMe4iNjoeOlZl+kqGeoKKTmHJon4qgj4xwkoyCqYiZoKSpoql9sK2koriXdqOzoqN/iJR4nHqqmX+ij56cmImYcqF9hY2wtX1rmpGheH6YtKOjq6iEmHuafJyafnOqWl1ve5eLeJ5iTH97e4VkephCTZ9ZompyfI5ugYqEmXabeYeJsbN/fpqSpnR+nW1xfJRvmXJpo12VdkhlY2BzcHx9bmZfa2h1e2JjX1BdVlxUVkBZRVFnRVJWXGFYX0lEPUI4QEE6SUU4TEVYQVZRWlZERmFcWmBLYG19cUVDPFVeYlplalZnaG1vYmZmXmFgXF1eYGhiX2VkdmxeZWdmbGRlbGhoa2mUnYGxrpmEU1+hp7S6s7OomqKLmqmbnKeSoKujoKeOnp2cmpmVmKGdloeHiXeFgW55lYWQmot9kZOWiHKAiZKgm3KSkIGImZSfmoSOqJuZlYuKinyEbISFcYGhjHiFjYiHkZeTe5Gin56jiK6GfbWEj56de6aWeqmClp6Ri6Kefqdod21+mXOgc3F8nYaZb5KCrXyjg6efm4GkcF6paHWjY2+lYZzTj3x6mXhyc2OihY9+onKijnVrj7OLYIKYinOqsqe8f3eDbX+/pqq0XpxvfnKXb4FzonJepGd0pmBopmya05h6gptudnmXa5t5dpdybKmlZ19keXB/hGtnZmNtdXdmX2FRWmVQUWFIV0lUX1dTW2RqW2VRRUNLTEpLQkpFOFBAUE1YU1hPUlFgZWVpUmR4eXdJRkVjXWVaaGpTaWhqb2NqZmBjX1xdXV9oYmFoZXxkXmRnZGtkamxmaGxomJt/sKxUXEt+qa+ytbCyo5yYhJemoKCjjKSnn5eoiZmXmJOZk5Ggl46IhXtwfYRofY+Dk5qBd5GOj4lwf4ePk5JsmJR8iZGSo5WDjqmak5KLhYl5g3aIgG6BnoZ3gJKFh5iglXmSoqOZoImzoaK2i3qsp6SupXCpgJuRhoGdk32kgKKZhphxnoSira6Jl4t/jKSNlYOvopV2tba1yaJ0lIuCnmGel6lteZWGoJt1oYd3oH2QloqBb0xmo5JwmohzpXt5dGKDgmx+oGxyZGCccn90l2t7arS1tMamc5h+epxqmpqrdIGabHN3l2mZeXSXcVBEfbNeaXVqeIdma2dic3RwbVVcUlhnT1JoSVVMWFJVXGdrblVnV01KQUpNSkhKTkFRSlBkY2ltZXRyc354e251iXp7VFFPbV5oW2tpUmpoaWxnbWZjZV9cXFxfaWJkaGt7X11kZ2NqZm5tZWlsZaKciK+nhWY/lKGzrK+vtaKij3+Wp6Kho4ukppybpYGal5aNl5CPm5OOiIN5anmGZYOMfpafeXWPiIyCaYSFkoOMhZ2NeoyKlaWSgpeol4yRi4CJeoB9i3lwj6CGeYGUhoiVnpR+k6WnnJaWhGdueJxsomR8caV4nJhwaKeCmI18pHqgloOWcp92gImUlY+5bY+KomJ9maKWiW5zaqtrdaBtb6Zgm2mLkGmWh5qVdaKAfZpfi4WMdW+IYmihZZ5/aZt1cGRniIJucqJaX1tjoW5diYxwe390cmSlbniiZGanaJdyi5huoW9SiI9uoF5kp1SLXVSYbW1yanGBbXBoa3hza29RVlVVZVlTbUlYT1xIWGhoc2pZa1ZQUkVWXExYUmFVaGped3V6fHB8fHKCe39zdo2Ag3ZeUXNhZmJxZ1BraGhrbG9oZGdfXV1dYGpiaWl2dV1cY2hjamlybGZrbWOdpZmmemV0bYunrqWqsLGmn4t/lqqcnaSLoaGZoaGAlZiTjZqPi5eQjot7hnGAiGiLinyXmnN0iX2QfGWCh5WKiZaZgnyIhZamkIGhq5CFkIqBin2AgI5zaY+lhH2Fk4yHl5+NhpGppp2JpniWnH6liZaMspmekYOvl5+leZeJeql0po+Emm6looyShIyDvG18pa+Ch4aHlJedoX2me3KolKCWZ55+b6xjloqVkneobKmigYl2h4J3q5GmiGuRsGt2s4ypbIuGb2+gnpGUYX+ri6p3gX+Op593n32FpJWdoGmah3WsZp6tjLZzdr6Mo5NZg6aNq2B1cXNve3VwYmp+bmdsU1VZVWBgXGpMXFFcSV1sbXZgW3FYW19aZ3Nlbm9xY3F0YHd6fnlyeYNyg36Be3uMgYKAdmJ5ZGNuc2RSbGdnb2xyaWZpYV9eXGFqYmxsem9cXGJpYW1pd21nbG5ilaaqnIGAnqSWqqqeqKeuo5iIgZaqmZ2jiZqknKidhIuaj4WckYWSjYyMdIV6iINvjYR9l5NzdYZykYNuf4uShoaUj317goWXpY1/paWNgI2JhJR1goeSb2yLqICCi5ONiJueiIuSqqKgkIB0lJeIfoF5lK+kf4GccY+GeZKMhYB7cqeMcX19epeWm4SNeHt9fYiUlZOLd5GZoKGEe36Ja4yFW3l5c3lwaW5+kopyf3SBj5STcYWDgmWNf1+BgIx3dnSUdW97b2+JboSGXndpeI5mgoOGj6qcf3R9l2qJiG9/dXyEdW1sZoxzd3uXd4Raald5j2htd3Jxb3d4b11shm1pZ1ZZXldcZGtkVWFUXlFfb3d5a2p3ZWpqanV8cHF0c2FvdWJze4F4dXmBdX+Af4B5i4WCfXttf2xkeW5eV25naHVreGppaWRcYFpjaWVscXVuWltia2Rsa3ltaGxvYY6Vuamni6Gim6akmaSdq6Kfg4OWqpGdoIiZppqomIKBm4t+lpSHjoqJjHKCfI99fo+EepeOdHKEcJWGe32Si4aGkIV4foCGmKOMe6egi4WPj4SVgoaOmHdxhKqFjZGcj4eenYaKmqifoKqDiY6Vm39+ipetqJCTp5B4cZ6Tg3uTcH+phnB9lXFqb3yBn4t/kY6LaG5dhIyMnJygj3OWjIhxdGuCdnSAWXJuhpGCfn6LaV1pY3qFg4iAX2l4e5x8g42DdoGHg2l5jIhrYnFyg3dfco2CipColodnjY+DbneLgm+Di3duZGZjeYJ6lVpbaWZtdlt6eHd0bXNygmZcbYpra2JZWF1ZWGtxW15gWV5dZXJ9enNvdGNqaml7fHJ6d3RkbXRobHt+dXp8e3l5f4B+b4WJhHt9c355cn9oVFxyaWx2cHVna2dkXWFZamhranFybVdbZW1sZ3J5b2hqbWCMjKqxoZCjoZqfnpiemaiioX2ClquMnpSHmqGQpJR/e5iEfJKZiIiGhopyfYCLdoWLgYSWinJvgHKYh4N+koOEhoqBeoCDi5qfj4KmoIZ4jZeIlYuLnJeEg3qsgZCXmZOJnZyGh6Gqn6Gio4uIk5udo5mWqqKop6GTnImYkHx5j4+FqH5+kpGSk5yxpZqUnY+NsZKYhKaMjJacoIqRnIOJkoprfI52d2WChpCKfYmdhIeLj4eIgIWEkHd8e3Wbo4mIi5+LhpV/fo2CgXZxdIaFf3iJiIuRp5GEh46Ig4yQi3uFiYeNf3VqgYN7eZlpcWhgc4pwfXp3dm92c4FcXm+HZ25fXllaXFJncVVjW1thbGh0e3xybnBjamlof3tteH5waG9wbGaAe3KBgHd/fX+Ee22DjIZ8enh8fnqDeE5kdmpzbnF7ZWtlYmJgW3NmcGZycWxVXWx0bWh4enBnaWtljYieup+WoqGYlZmYlJikoJ16f5ipjZ6MhZ+cip2WfHiUgnuOmYmGg4SHbXiBgHKAh36Ik4Rta356l4eEg5B+gIaEhn2Hg42bnZGGqZ6CcoqPhZKRi5yRfY16qYONkZeVjpyWhYWbpp+imp2Gg5KamZmQmaagpp6ekJeCk4t4fYiPhaZ8fI+QkYWYqaCck5yOjamNkYCejYmUm6CDj5d/h46DcHiGcXRhfoSPhnWMmICDj4KGhH6FhJVueXZ1k6OMjYabhYWOdYGMfn1yc3yJhHt5jY+Fk6iQh4SPgoOJiYh1hIaGiXptan1/em1oa2xmXnl+Z3x7dnR1dXp3XGBwfW10YGNaW15RZm1TZVpdYWpodXp+cGxsY2pqZ4B/a3J/a2pzbnhug3luhoB2goB9hXZygo2Hfnt6fH97gotgaXtrdWhpg2VqY2BpW2N1aG9idW1rVGJxeWVveXpyZWptbYuKn7iaoaSfkpGWl4uan56denecpZCbiYaklIqYmXh5jYV8iZGDjIKCgmx7f3hygIV9ipB8a2h9gpeJgYiOfH6GhId8j4CPm5uQh6acf2+LioyShqChioWMfKeQh4+SlpOWknaMo6ChnZaaf4GQmpmTjZqioqSbmJGcf4+GeoGFj4ihgH6MjY98l6SgoJKZj5CmjI+Bm5KJlJicfpOTfoeOgXZ0gnB2YH2AjodyipZ8iIxxjH6ChYWPaXhyeY2Zk5CAmH+JjHODiX19cXp8jIV7e5KOhJemlIyGkXyEhYaEdICBhYV4ZHF6fnh5cGtqZl59c2d8dXZzfHN/al5gdHZwd2RjWF1eUmpoVGVYXmBnaXZ4gXFma2NsZ2V/gGptfWdtcGp9d4V6a4uBcoGBfYF0doKMhn98eoCBfX+PanKDbnRpYohpbGJfcVV0b21uYHhobFdqdHZjdHp6cWJrb3mJjZ+zkqWlnI6QmI+GnKCam3t1o5+Nl3+MoYqImpV4e4aHfoOJfoiCgX9wfnp0dYKFfomQd2djfYaXi4KKjXh9gI2DeZaAlZeVjZWfmn1vi4GQk4alm4eMiYOmlYSSipWXkpF2kJ2hoZiUmHp/jpiXj5eanaSemZOUnHuRh4R4hpeOnn6Cio6Mc5einaCSmI2PoYyLg5eYg5OWmn+YjXyJjYF3cn5ue2SAfIuGcIaTgJCCa4eDgYCJhWZ2b32Ik5mNfpR5jIl9gYl9fHKAeYuGeoWSi4yZo5eDhIx3h4OCgXV6f4aDc153d3xzfXdma2NgfmlqdnNzdX1xfGNjYXNudXJtYVlfXVprZFJiV19gaGt0eYZwYmpjbGZofIJraHRobG9of3yBeWyPhXGAgoJ/dHyDjIGAfnqCg358kG11iXR0bWWKbGpiY3VWg2lwbmB4Z2xhanZwZXh7eXBfcWyFhZCdrpimqJ6NjZeHhZ+Slpd8dqibiZh5lpyLjJiPeHuAi318g3uAgoF4c3h5c32Ag3+IioBkXn2LlYh+hYd0fX6Kf36XhJaTloyjoJd+cYd7k5GKpo+MjoqSoJGDkY+Tl5CKgI6XoJqSkJJ0gI2SlImdnZ6nmZiOlZh1j5CLbYaZkJp7h4iQiW+XnZmhk5WKjJ6MhoGTnH+Tk5aHmol8ioqBenJ6a3VsfH+Lfm6FkoOUeG+ChH5+i4Blc2p9gZeYhYCOdJGJhHmIfnZ4gX6HgX2EjoaNlaWReYWCdIiGfH9xc36FgWxfeXR4cHtuYW5iZHthbW92cnd3c3NhdmBvbHVub11bXl1dal1PXFdiYWhtc3qJa19pZWpjaHeHbWZsaGlsZ4B8endukIhzgIOEfXSBhop6g316gYR9fI5yeYt5eG5sh2toX2lyY4docW9ldmdtbGF6aGp8e3dwYXdti4GZmqqgpKidioqRhoqdipSXfHasl4yWfJ6TkZaUiHZ9e4p8e4B2d3+Ab3Rzem+FfYGAiX58YVx+j5GGf4SEc3qAhnqPkYaRkZuSpJqTgXyBfI2KkqOIjYqNl5qNhZGYk5WOiIiLkp2TkIyNboSQj5GJnpmioZeXiZeScIubhWeHmo+Ue4mFkIpwlpqToJGRiIqZjIJ/kp99ko+TjJqPe4qFh3RzdmtxbnZ8i3RuhpGOknF0gHyBgoh8ZXFten6blH6FinWRi4J1iXpvgX+BiH2FjYqGjpaqjnuIfX6KhXd9b21+g4FiZ3dzdG56YV1vYGp0XnBqenl4bHJwZXldbWxzbXNYWl1fYWpaT1dXZGNmcXF/h2VdaWhnYmdxjW5kaWdlaWeAend1bo6Fc4GBg3x1goiFeIV8d4OFeoCKd3+Le3tyeYNqa19waHN/a3FubXFnb2tle2Juf3l3cGt2d4l/o5iiqKGmm4iMioGPnIaSm3SAqZSRjYagjJWTkH9ze3aFd3h/cnN7hWtyb3ltiXZ/gIZucVtZfpKNiICBgXZ1gH9/oIaPipGcl6CTlneJfoCMiJydiY+GkpeWhYiUmI+Wi4uMjYydio6QhG6Ji4+RipyWoZyYloaYiWyGpYVnh56Lkn+MhIyBd5OYkZ2QkIiJlI1+fpCZfJGNkI6akn2LgINvdnBsbW9we4Zpc4OOmIpwd4B1gomDeWdzb3aCm499ioV7lZJ7d4p1cYt8ho17i4eFio+cpYl8hHaBin93d2xpfoB/XHFycW9vd1ldb2Bval5vanx6cG1tam13YHBva3FtWVhgYWFtV1BTWWVmYnVvhIJhXWttZGJma5JtYGZmX2drgXRxcm+LgHR/goB5doCLgHmGf3eHhnaDhXuHjIB7dop/anFifGKFfG9wbHRqaG5sdndfcX54e3R1c3+CfqWVmq2fp5aFjIN+lpSCjp50ip+TkoWKmoyVjYt6cnd0gnByhXNxdYhsbmx1bYh3g31/bW5VUYGrlIeCeIB2coJ5gqCCkYGSkZebkZh3kXqCjJKkmpOOiJSYkoOGlpiLk4uIjo+InoSQin1zi4WIj4icmZ+blpWAlIBph56JaIehiJOFkYSKcYORl4+ajY+Mi4+Nd3uTkXuOi42Slo18iHyBa3dqbmtsbXp/Ynl+jpaBdnqBd4ONfXpodW11iJeMgImHe5SRcnuGcXiOe4uNe4l+hI6Rn5+GfX14gYp8dm9oan+Ad153b21rcHJVXW5hcWFfbG55cGdwZmZzdWhxbGF3ZV1WZWBgcVNQTltlZFx4cIh7XlxocWJiZWWRaV9nZFtnb35va3Fzin12fIWAdXZ/jHl7hoB4iINzhoV+jIyEfHmVeGZxaoNfh35vb2t6YGltdH90X3N8eIZ3c3OFfHmhkJqxnKWOgop/gpmIf4qcfoqYko6EiJeOjo6EdnR2c4Bwb4VzcHGDb2ppdW2Cbn18bXVzUk6C38mS1pN8b3SDdYOfgpF2lJCYm4+Ye5NyhZCfoZOTkImSm5OFfZWVh4yNh5KNiZx/joF4eox/iIyKnJucm5aUeo53aYqTiW2JpYaTiZiDhmOMkZiNlImVi4yJi3B6lYl8jomLk5GKeoV8f218ZXNva2x6eVyAeY+OgHt9fn+Gjnt6aXVrdIyQioOGhn2WjWx/gHCBjYCOiX6Ee4ORlpubjH13eIKPeHJrZW59gWppdG5naHNsU15vZHBaX2xyd2Zra2JneHNvcWNfd2BhVWtfXnVPTUtgZWNceXGKdFxbZXVgYWVkjmNgZmJYaXJzbWtxdot8dHmGgnZ3fotzf4Z+eol/comHgZGKiH1+mXZlc258ZYd/bnBrgFprbnh5cmB2enuNdnJ2inZ5n4ybr5ugkIKFeIiUfnuInIaEnpCOhYyXhJOOh4F0d3B5cG6Eb21ufnJjZHhwfG56fGpobGOkmsHcru+ic2t1g3WEoYSRbpWPlJ+TmoGRcIWLo5eJjpWKkJ2Vg4CUj4SIj4CSioqXfod7dX+JeIaFjpual5mPkHaLd3CIiox+jKWFkoqdhYZei5SXiY6IjYqKhIlsfJeCfYiGipGPhnaFfn5rfWN4dGpveHNYiHqRh4V6f3+AhYx+emZ0aoGLj4uEhICMmIZsgndviZKDkYV/gnuBkZeUm5F1dHiGjHVycGVzd4Bgc21vYWh1ZlJgcGdrVV9udHlhcmNgaX1xcm5bY3JhY1ZuWlx3TExMY2VhXXZzim1bXGR4XmBkZYRfY2NeWWlya25rcneLfXN3hIF4eHyJcYOEfH2Ie3SLiIiVhox/f5hzaHVxeWyLe250cIBXcHl2eXFkdniGjGh2gIlxgJ2Imaeco5KEfHCMlHd4iZyDhJ+NjnyVjH+Zh4R7cndwc2pvgWtpbHx0XmB4dntwdHpnYGV869q1ycPciXNsc4B2ipqIjGmXj46ck5GBiHCFiKCOhIqVioyXk3yNkoiCiI96kYuGj4KAd3iDhHKHgpOblpSYho12h39xhoOKiJqkhJWNn4SJYYOVj4WIhYiMhoCHaH2Uf32ChYmOj4Jxhn9/cndndnJpdHdsWox9koKFfYCDgISKgnZidW2KgpGMg3+Ak5J+boNteoiRiJOFfYJ+gZOUkZiKb3J6jIV0a29pcHZ+XXNoblxpdV9SZHFoZlNfcHZ0YG9gXGiCcXJqV2dpY2lYbVdbdExKTGVmXmFyc4VpW1xleV5eZGd6YGRfXVlrbmVuanR3in5zcoF+e3Z6iHSFg3x/h3Z2ioWPmIGNgnuTdmx3dnl4knVud3p9WHmFcX9uZnh2kYJkdoaFcYqWhpmhm6KKhnNvkotydo2afImZiIl7n3+DmX+BeHF0bm9kcn5oZmx3d1tfeHt6cXF/aWFnYX/Vto6RpnhucXd7cZKQjIZqmI2Im5CKhXtoh4uZhoGSkIaGl417jIyAgImNe5CNfomFenV7g3txhoCVmY6SlIKJdYSIeIWBjJWeoIeWkKB/iGF/k4eDh4OIjH9/gmZ9kYB+f4KMj5B/bYN8gnRrbXd1dHd2a2ONgY5/hH98hH+FiH9wYHRyhn2QjoN9gJKKenGEZ3uFjIiNhHyFf4GVkJKUhW9weYt/dGxtaWp3emFnamlYa3VaUmlyaWJQYnJ4bGJlXlpqg25zYlxnX2VtX25UWm9OR05mZFxmbnKAa1pbY3NfXGNrdmRlXV1abGxibWpzdoaAcW9/fH10eIZ4hYN8gIh2eImBkpV7iYZ2iYFveHl7g5JvbXuAdl6Df3OBbWh6c5RzZ3OHfHKSkYSan5ughoZ1dZR+bXWSln2HkIOKjZl8jJp2fnZxb2xqYXR8Z2JpdXlaYHd7eW1xfmVjaGhXnY9fcnOXvMSEdnGUiI99cZaLhpuSi4dyaoiPloB7lIyBhJqMfIqFfHuJi3+UiHWJhnZ3fYFydYaBnpSFlI+Dg3KAinaGfYuanpqHlY+dgYlmfZOCfoSCiIlxgX1mfox8eX9/h4uPfWmAfYN2Zm95eHN3c2xrjoWKgYqAeIKBhYSBa19zeXt+jouGfIKQgX5zgml6hImMhoV5hH2CmY2RjX5ubXuIfXZ0bmZle3RiW3BiV25xU1NtcmhhTmZ0eGZgXlxZb4Bvc1llYl1qbmBwT1lrUURTZ2Baam5tfG5ZW11tY1picHZkZ1xdYGtpY2xqc3aBg3Btf3x/dHWDeoOCfIGFdn6IgZaQeISLdIGIcnl5fo2Qb297gHFpgXh6fm1se3WVa2p4hHRrk42Fn5igmYSIbn2Mdml3l45+gImClJeJeY+Vb3pzcGxpZGBzemhfZXF6WmByfHlncXphZWWPsbJ3S2JapdnQlnF7kIqPd32TioSYkIuFbmuFkpF6eZKGgYSYinyGf3h3iYqEloBvi4hxdX56anmFg6WQhJONg39vf4R3hXqHnZqVjJSRlYWIcHuSgnyCgoiDboB3aICEeHJ/gIOKh3xlfX6EdmNwc4BpeHBvdZmNhoOKfHZ4gIV6g2tccn9zgomHin6HinuJcoJucoWIj4aGc4R6gpqNjoV5bm9+hH92emRmaHtvXlh2WldwbE5XcXNmYEtsd3RhXVtaWXR9c29XZ11manJgb05XaFI/WGZeWnBraHpxW1pYa2VaY3B5X2hcXmVsaGVraXF3f4hvbH9+gHVvgnp/gn+Cf3aBhIiXiXGCjXF7hnx6eYOTjHVqeX5rb350f31vcnt6k3BvgX54Z5KLg6GZnJGChWaGg29neZWIfX6EgZiJgXyNjGh4cmtsZl9gb3ltX2JveFxka4J6YXF2X2Vl1Oq9izI6PouOf3F4hYeNjXWClYx+kYyLf21shYyMdXyPf4WBlYh8gnhudoeEg5d3boiFbHV7dGZ5goOni4KOi4R+boB2eIV7iJ6SjZGTk46Lh397koZ3foOMgmt/cmiAfnhtfHyCioN3YXmEgXFkcWh+bnVxdYKbi4B/hYBzdX6Bc4FvXG5/dXmLhIt7h4F9iHl7cm2JhJGFjHOCeoCXjIyAdW1rdoCAdXRbZ2d1bldWe1JZcGRLWnJyZVtJcHhvXFtbWV10fnRoWWJbZ2ZvZGpNV2ZRPl1lXF11ZWB1cFpZVG5kWWRxeVpoXV9mbWdpa2lwd32ObWmChH55boB8fIF/gnp1gYGNk4RwgItud32Ae3uHkol/aHp9anN7coV6c3d+fox6eIR9fGuMjYSbnZaMgYBsjX1raH6Ni3p+foOTgn59iohrdXFnaGJbYmdzb19ha3NgaHCIemJzdF5jZJugj25cNVqvtXRpgIh8koZ1hZWFc46KiXZwbIWDh3V5iXiJfJOHeX5yZ3WJfn6Yb3GGfmh2eW5meYeEpIeAhoyJfm5/d4GCfo6biIOVkpmKi4WJfI+IcHp9hHtofmxqgHt6anp3goeAcmB3gX5xZHJndoJtdXuGlZGBfIKBb3d6fHV/bVlwgHd1jYOHeIh2g4l7eXRvi4GRgoZzf35/lImKe29uam2BgXRtXGZkcnBQWnpNW29cT1tyb2RVS3N4aVdZWVphcIB0YF1dYGdkaWlmTlloTUBgY1tgdWFddWxYV1N0YVpkb3JXal5iaGtnbWxocHd8k2xohIp8fHB/fnuBf4J6d4B/iouDcXuIb3F3g397iYyPg2p9e213eHaKd3x4gIGHf4N+fnpthIyImKONhIN6dYt4a2yDh5B4fXqBkX9/foqDcHJwY2ZeWWZfb29fYGdwZmpviXRhdG9bYWRqdnuAv5ympMi4cYWDcpJ8d4aSgnOQi4dxcm+De4N0dId0iHeUiHl5cGN3h3qAk2lyhHZnd3VjanyCiJ2Bf3+Oj31zgHWGeoGTkYR6l4+WkIiCiXuIiGt4eX50Z3poa395c2l6doCDfWhgd4d9amp0aHuAaXaBjJGUfnp+fnB8dnx0f2JWeH5zc4uFgn2EcYeJeHlxcYSDjoB/en59do+GhHdqcWlsh4Fxb1xmYXFtSWR1S11tVVNZcm5iUU90eGFSWFhdYXCCc1thXWhlZWRrZFBbcElDY2BbY3BeXXdoVVZVdl1bZW5oVmteYWlnZW5uaHB3epNtaYiMeX1ye355goGBfHV8g4iGg3B3hHJtd4KCfomLk39wgHt3eXqBi3SDeH6BgYKEeoB1b36Ki5ueiH2FeneFe2d0hYyPeX5/e4iFg3aPf2dvbl9kXFhlWW1yYWBgcGxraIluYXRpWV5kboB3qdqqx4aHsnGJd2+MdHqFjX96kol/dHN0fneAcHF/bYR0lIV4dWtgeoJ5iY9mcYRwZ3ZuW218gJCTf4B5kZN+eXxuiXeCko2FdZeLko+HhYV7f4RsdHZ+bWd2ZG17dW1pd3Z/f3xhYniGemh1dWJ9e2d1ho6NlXt0gHZxgHt9bYBaV3V/cHaFiH+Aem2JhnR6bHaBhIV/fH55fHSLgn50aHRlboqDbHNZaF5zZEdtbUtaYVdWVXdtYlBSdHZYUFZYXmFxhG9cYGNtZGReb2NUXXJGQmVfXWZnXVt7YlFVXHVbW2drYVZqX2BuZWZrcWhwdniOdGuOjXV+dnh+doGDgXtzfYOIh4NvcoB0cXV+hYGJjYp7d393g3t8hYd4h3x9gX6EgHt+c3Z5jI6gjYl6iXZ0g3hefYWYi3iGg3SFhoR3iXpibmxbYltbYVZpc2NgW2dub2aHcWFxZlddY2x/fMrOh7mham1timxxg3F7g4l+epCEeXhzeXV1e2psdmOEdZKCdm9mXn2CeouKZXKCa2pxY1hteoWbiIKBc5eUeH99b4lyhIuNiXOYj5GJhouDe3l9cHBvfGZocWJteHFqa3F4fXx6XWV5gHhpdnhmgndndIeMjpR9codqb36BeW99Xllzf251gYt8gm9wioBxd2l4gIKAgnd+c3t1h317c2dzYW6LgWtxV2lddltHbWpMVlReU1V7a2FPVHVyUFFUV15idIVpXWBsamZjWm9hWGNwR0BnXGBlXlxWe15OVmVwWVtqaF1XaGBecmZrZ3FncHN3hnhulYp0f3p4fnmCh4B1cX+GhY6DcHB7eHZ1eoaFh4yFenx/dIt+fYaEhId/fn59h398eHZ4eJGTn3+MfYttdX94ZIKGlYVzkYpvhYWBeoN0Y25qWV9bXF1UZ3JkYFhkcXJmgXNia2VXW2Bqf3e+rnugtm5ic4Zoc3txeIGEen2Lfnd3cnZve3Zlam9gh3WOgHNqYl5/eHmLhGZxf2hra1pWb3eJo4GEf3GZk3KBeXaEb4KDk4l0loqOiIWJhX14dHFuaHhfamxfbXZqZ2preXd6dlpnfXx4ZXN+boR0ZXWFjYaWf3CMZ2t6hHVudWJdcX1sdX2Me4Jmdod9bnFpdn95f4Bzfm17fIJ7eHFmbGJtiX1sbVVpX3ZVSmlqTlFOaE1Ye2hhTlV2a0xRVFVfZnWDZl5gcWhnYldpXVxraEpEallhZFZZVXlZTVZtallda2RcWWVjXnRmbGRxZ3JwdYF4cJmFdn9+d398hYd9dXKCiICVg25zeXt6c3KFh4mIg3mBfXWPfnyEio6EgoN6fouDe3Z7d3eanZd6iYKGaXZ9e2yDhJJ/cY6BcIWCfoF/cGZsZ1hdW1xbU2RwZF5XYnJ1aXVwZWViV1xcaIBwb3KAc4lkZHh+aXR1c3KBg3eAg3h2c3Vua3pxYmdrZ4Z0jYNuZl1ffXB7iX9pbXlnamRVV3JvjaZ8hHt2lpF0fXN9e299fJKHeJp9iIeDhoN9dW9xbGd0XGxnXmx0ZGdlaXpve3JZZ4F3dWhwgXiCdmJ3hYt8lIFvjGpte4JxZ3NmYW56Z3N4i3x+YneDd2pscnZ7cXt6dH5nf3+AeXdvZGZibYV7bGpVaGJvUkpoak9LTm9HXXtmYU1VdGNKTlNXYWp2fmVdZ3NpZmBWY1dicF1MS2pYY2FVVFVzVkxYdWRZXmtgXFpjZV92Z21icGlzb3J+dXSZgnd/gHd/f4aFenx0goR+l4VucnR8enRxhIWPgYB6i3V0kH98gZWOgIWEfH2Mhnt+gHZ7o6WKeYiFhGt1fHp1g4CLem6Ec3mEfIGDdW5qaGVWXVtaWlNibWRbWGFze2lobWlgYldfW2qAamtvgGdrYGh5eGpzdHNtg4B6f3x1dG16aGp5al9lbmiBdpCEaGVYYndqfod7b2pwZ2ZdVFhvZ46od4F6fJCOenZxf3B0d3qQgXmWdYaDgIWIdmpxdWdnbltsY11tcl9nYWp4aHttW26CcnRqb4F+endhd4WEeI+Fc4hyb3mAcmNxaVxxeGRydIl8eWN0gHFoanp1cm15eHZ5ZIR8f3l3cWRkY258fGpqVGhhZVNKa2dPR1FrRWB4ZmFNU3JdSk1UWmVrdnplXm1xaWRdVmBWbm5XS1NoV2VeWE1VbFRKXHlfW15rXV1bY2VgeWhsYG9vdW5wd3V6mH12f4F5gICHhnp4eYJ+gZOEcXR0f3l2dISIkX2AfJBrc5WAe4KfhX6HfYB+hoKAint2hKuff3qIh4NrcoF5dYB+gHRuhm58f3OKgGpvbWRkWF9aWVpUYWpnW1pedIJpXm1sXGFXXFxsgWVydH1paVxrdnVnc3ZxbIR7fXx4dXJseWdpeGZdZXNneneTgWNjVGVwZ4KFd3dnaWpgV1ZZZ2OPp25+d4CLjntxcn5oenB7jn14kHKEfn9/hm5kdXJkZ2dcamFcb29cZ19tdWR6aF10gG9ya3J8fnV2YnSFi3uIh4GAeHJ1f3VhcG1bcnRjcXOFfHVlc4BtYW17cGtqe3l2c2aGdnt7dnFlYmVtcn1pa1NnXVxUS3FiUEZWYUdidmZhS1RvV0pMWFhna3V6ZGVucWZkWlddWHZlVEpcYldnV1lIV2VQSGJ4Wl1fbFteXGFjXn5pal9udHhtcG52g5d5coGAfH+JjIZ+dXWGeYeMfHR1dYJ5enqCjI59foSJaXOWgXqKnX1+hXqBen98hohzcY+tjHt7h499ZHGHeXN8enVyboVse35sj3picG9iZV1lVllZV2Nma19dXHKFaFhwblteWFpcbHtjcHd1bGJZbHNzZ3R1b2yDeH5/eHZtbnRkaXRlW2d1ZnZ2knlfXVJmZmqDgnR+YmRpXFRXXWJjj6RoeHSDhpF5bXB7aXlufIZ8dopzgXl8eH9oZHZsYGZfXmleXHNrWWVdb29iemVbd3xrbm5veHlzdWRzg5J+h4OJe3dvcn5zYnhkXHBwYnFygn10Z3KAZV5ud2llaHp8dW5vgnV0fXRyYl9mbm58ZGhTZ1hXU0x2X1BKWVhIYnRjYUlUbVNKTVpXaWxxe2JtbHNjYlpaW2F3XFNMY11YaVNXR1lgTUZpdVheYGxbW19iYlyEaWdhbnh5bG9qdoGQeG2Dfn+Bk4iEgXZziHSMhnRydnWCd3x9foyQgH6TfnB3lYN8mZJ5gIB4en6AdIiDdHCYoHp7f4mUeGN1h3hzd3Rrc25+a3h8cJFyXnBvYGdibFRaWldoY21mXFtxiWVTcm5bWlhYYGx2Y2l1amleWW1zcGxzc3NphHx+fnt2bm5sZGlxY1trcmR0do5zW1dTZWFygH9ygl1iY11TWmBcY5GfZXFxhYSRdGxse25wcXt9fXOBd4Bzenp6ZGV1aF1iWWBnWl52aFdiXW9oYXdgW3t2aWpybnhzcnVocYKVg4d+hHZzanF9bmZ3WF1sbmNyc4F6dGdvfltgcHJiYGtyfm1tdX9zcXhrcGFcZWxseWBmUmVUVlFPdFpRT1hRSGNzYmBGVWpQSVBaVWtra3xmbm9xYltaWFlscVdSUGZXVmhTVEZaXE5IcXRYX2NtY1hgYGFdi2pjZG15eGtwaXV5hntrg31/hJp8goR5fIduj4dyb3Z6fXSBgnyLj4KCl3R4gZOFgZ+JdYGAgXR/gnGHgnVvoZZze4aLhnpld4pubXpuZndwemtzdnKMa150bmFnZWtSXVtVZ2Fsa1pccIxkT29uXVZYVWdpdGhidGVkXFhtdG1vdXR4aoZ8f3uHdo9zY2RrbmFcbm1jc3iHa1pUVmNkeH19cYZdY19jU1pfWWKVlWNucIOFinRraHxwZnR4dX1tenV2cHp/dl9lcmNbXVZhY1hhdGVVX2BtZGFxXV1+cGhpc3F0cHV2a22Ek4GJe4Vxc2dwfnFzb1RcZ2tmcXSBd3NjbXZWYnJsW19wZ35mbXd+c3Nza21gWmRqaXZeZlNjVFVQU2xWUFZTT0dkcl9hRVhpTkhXVFZtaGR8aWt4a2JXXVVbdGRTUldoUVhlVFNIWlpQTXd2Wl9lbGlZYmBeXo5uYWZreXVub2l2dn9/bIN/fYeXe4CHgYl+a5OIcmd0gHt1f4J9iI5/i5NyfIqRhYefhnt/hoxzgYZzfYJ2bqSLcoGNi3Z3bHqMYGR7cGZ4cnhsbXF2gmdke2xjZmdoU19eVWdfbG5bXm2NaE5pbWBUVlNuZ3RrZXhkZFxYb3NscXp3cmyHe392m3p4a2FlbG1eYG9qZXB5fmdaVlhgbHh8e3CEX2JeZ1ZYX1djm4hia3CBh314bGt5blx3c217anZ0b3B8gHNYaW1eWFxVYWJXZHBjU15haGFibFpgfmtma3N2b213d2xphYx/iXuIbXJncX1uc25kWmFpaW90gnRzXmltU2VxZVVjb2N7ZHJ3fHdrcG1rYFlhZmd0XGRVYFVSTldkUk5bT09HZG9dYkZZaU1JX0tYbWRgeGlufmRgVV9UXXVcVFNgZk5dYVVTSlxZUFl0dV1fZWxoWGNhW16NcWNnanhxc25odnR6g3KCgnqIjn58iYeNeW6QinVsc4J0f3+HhYaShJWPeX2Mj4eRm4SAfIyFc4CBc3R4cm+Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjIyMjIyMjY2NjY2NjY6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjIyMjIyMjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREFSzNrY2NjY2rCdoKCgoKOAY2dnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1MkbY6ufn5+fptqCjpKSkp3xcX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmJiZmZKPkJCQkJCMh4eHh4eHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFhpKUlJSUlJSQj4+Pj4+Pi4iIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l6ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQj5CQkIuOkZGJh46KkJKSk4+OjI6Oh4+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ni4qLi4uMjIyMjIyMjIyMjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCQh4mLhoyGiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI2EiouGjoWMj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCRiYKHjYaMiYmPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yOiIaHhoiGiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjZCOjIqLjImOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f35/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ1dHZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaGhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo6Ozg5Ojg3Ojw5Nzg7Oz49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VzcXN4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw5Nzk6Ojk4ODo6Nzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PDw+Pz08PTs6PD09PTw8PDw7Ozo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXV1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NDQD48PT9APz89Oz49PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXp7e31+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRUQ/PTs8QD46Ozo6OTc6PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fX5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/P0FBQUJBQD08PTs+PTo6Ojw6ODk4ODo7PT8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0A/Pz9APT9APjw+QD89PT0/PT0+Q0Q/Ozw9PkA9PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENEQT9AQEA/PUA+PD0/P0BAQENAQD9AQD49PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAQUA+Oj48Pz08Oj49P0JCRUA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUZGRkpOTktKSUdHSEtMSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QERFRD88QUNEQj8+QT9BREVEQ1d1homKflhHSEpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkhJR0hISUdHQ0RFQ0RDQVV0h4mHh4aHgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMS0pLTEpLSUhGRUdOR09shIeGhoaHh4eHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pj9ERkhERUdJS0lJR0hJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3R2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0tLS0tOTEtNTEhJT3BwgIaFhISFhoaHh4aKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRURCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5ent7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhHSUlLTE9RVE9YbHN6gYWEhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5AOzk5OT09Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQEJGSEtIS1RwZXyDhIOCgoOEhomKi4uLiomKi4yJVDs4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Nzc3ODo3Nzc4OTs3Njg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHZ5e3x7fH1+fn5/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PERCREZEXXx/goKCgoKChYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2NzY5OTc2Njc2NTo6Ozo6PDg5ODk3Nzc3OTo6ODg3ODU4ODtBPT4+QkE/QUtMT1FQUU9PT1FXa3JydHR1d3l7e3t8fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc6QTk8RD9mg4KDg4SEhIaJioqIh4iIiIqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjs5Ozs8Ozw8Ojs8ODo6Ozo5OTk8Pzw9QUJESUpNS0pLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTk5OTo+PT9ARHeDg4SEhoaHiYiHhoaGiImIiYuMi4mKioxsPDs+QUNFRUFBQUI+QEJAQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQEA+P0E8Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHFxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PDo7Ozw7PT5BQD5ihYOEg4WEhomJiIeGhoaHiImKi4uKioqLiotePkRGSUtKSUZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREZFQUZFRkRGRkRAQj49QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6Pjo8Oz4+Pj87Pz1AP0M/S36DhIWGhoaIiYiIh4aGhoeJioqLjI2MjIuKiohXR0xMTUtOSklLSElKSklFQ0RGR0ZEQ0VGREJISUtIR0dGSEdFS0lLSUtLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0d3d6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5Nzw+Ozw6PT8+QDw/P0NCRUBohIKFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUpIS0dFR0hISUVFSEZGRUxMTUlKR0dISUpOTU5MTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbHB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDs7PDk9Pz0+PkBBRENJVH6DhYSFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExLTEpJSEZKSkVKSEdLSkhKR0dHS0xOTExISElKTVBOUE5NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VucXV2d3l7eHh6enx8fX5+f39+fn1+fX5+fn5/f36Af39/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo7ODw9Oj0/PD0+QEJERU1thIOEhISFhoeIiIiIiIeGiIiIiIiJjIyLjIyMi4uLi15SUlBNTk1LSkdGQ0dKR0xKR0tPTEtKSk1NTE9QTkhJS0xPUVFQUU9PSklKSkxKTEZHSEdFR0lGRUVCQEJCXHByd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw5Pz09P0FFRT5DRUNHTHWGg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pFRUZLT05PV1ZRUE9RU1JOU1RPTVNMUFNVV1JTUlBMSk1NTUtOR0dKRkZISkRERUVCRENjcXV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PT1CPkFBRVVMQklKR0tNeYaDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7O1FTUmB1XVVWVFZZWVNZWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tHSElIRUZJSUlISWpzdnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQEVCQ0ZFRERLV1FLUFBPUFF5hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD9AVlVZXGRgVllicl5dV11aVkVRWVpcWV9UWWdSVVZYVFRWU09PTUpMSklJTE1LT01Tb3R2eHl4d3p6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Afn9+fn5WSkpJSEdGRERCQT9ITUlNUEtJSk9TUlFVVlZWVHWFhIWFhYWGh4iHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUldWVFpadYNZVX2QYVxYXV5XSVZdXVtbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eXh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlNS0pJSUZCREBBOlBRUVdYUFBPUVNTUlZXV1dXbIGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpbWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllab3N1d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNPT01LSkVDP0A7UFBaWlpSU1FPUlJRVVJVU1ZedXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVFNUXlpYV1dXemtYWlxcXlNQUFBJTk9XVlhbWmRxdHZ2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gICAf3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FWUlNSUlRjZHaAgoKDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JRUU5LUlRRTU9ZUU1OUVNVVU1RU1JQTkxMSENJSFJTVFpdbXJ2dnVzc3d7ent7e317fX19fn19fX59fn9/f39/gH99fX5+f39/f4B+e3Zzd31+fmR1fWlxdF9kXV5bWVVRTElMSWFsknRQUVNOUVJQU1tSU1JRUlVVYnN7fH+AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkNDQ0NCP0RQQ0RAQz5CSEdWQElOTUddaVFIRk9GREVGSEdIQkNIR0hKR0RCQUNATlBNUmR0dXZ1c3R1enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZWJcWFNRUFVSc1dlW09PTkxRUlBVWVNVUVFUUk9WYGtsc3Z6e3h5dXJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPj46Oz5APz8+PmpQSmFFRkhJRUI/SE1NR01RVUpCRT8+PD08PT0/PT9BQ0I/Pzw9Qj5KTUZVb3V2dnN0dnh6fHp9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpQUU5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmltbHF1e3p9enh6fHx4d3hkQkBAQT06QkNBQUNBW1xOe05PT05LTE1PT1BMS0xXTklHQEI8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXZ2dXZ3eXx8fH18fHx8fn18fX19fX9/f39/fn9/f314dXd6e3p2eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PUF5cWklHUFJRT01QUU5RUlNWWFNSWVROWVpbV1lcX15fZWBdXnF3a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSEVFRkNMUU9hV1JYUVBTU1JVW09PUVZQTUlDRj46OTY1ODY5Nzk6MzY1Nzk1PEI9ZnR1d3h3eXl7fX18fHt8fX1+fnt9fn19f39/fn5+fn9/e3d1eX18eXh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtUVFNQUVVPTFJTVFdYVFRYUUxXWVlWWFhWWFldV1hYaHNrXVZgdGthYV9dZGBfXllVUE1PTUxJR0pLSUhGQ1BPU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU5OEducnV4eXp7e31+fX18e318fX5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFdWVlNUVk9PVVZXWFlTVVRMS1NVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk1NTEpGUFBVWVNUTkpOT1RTVFxWUlVTU09NTElISEY/Pz06Nzg3NjU5OTY3NjY1V3FxdHd5ent8fX59fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVFNWVFJYWFlZWVJVT0pHT1BPT01SSk9QT09OTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUE9OTk1QTlRSUFJMSUxLT1FQUVJTVFFTT0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdVUVNGRUFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+M0A+am9hUlJRQEdUUU9QUFFOUU9QT0xKTExPUE5NUFFRTlBPSkxNTUtHRUVEQjs9PTw5PUc2Njc2RG5xdXd6fHt8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkM4RU5TXWdTUVNBR1VQUFJRUE1NTkxKTEtMTk9QUUxOTk1ITEtJS0tMS0dGRkVEPEFBPjtARTs8ODlUcXN1eXt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT49PUFAQj0+RUhGREZGSUdKSkBGQUFARkhFSk9IUVJhXFFQUk5TT09PTExPTUtNTE1PTltWSk1RT0dJSERJSkxMS0ZGRkQ/Q0M+PUJHP0I+QWRxdHd7ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPzs+QUBAPkFESUVDSEdJR0lFQkI/PjxDQkFHSURNT2FlUE1PTldLTE5LS01NTExLTk5TZE1KTFJJSUlFQUhKTE1OS0dJRkJCQkA/RUZFSERMb3B3enp5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTExJTVBNUE9HS0U/Qj05OTk6P0I/PEFCQUFEREdLRkRJSUdHSENDP0I/P0BBPUNFQ0tOUVRLSklNVEZJSUpMSktLSUpMTU9QUlBLR0NMR0NDSkpMTU9OSUpJR0NDQ0RJSk1MSVpzbnh5eHp7e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhlcUhLQ0ZHR0dKS0lKTERHQj0+PTo6OjtBQj89QkJDQ0hGSkxKRUlJRkdHQ0M7QUBCPkA/QkVDSU1PR0hLRkhLREhJS01ISkxISUpMSk1dUklIRE5HQkVLS05NUE5LTUpLRkdHSk1OUU5MY25qd3Z2e3h7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGRwRktDRkVGREVFRkVHQ0NAPTw9Ojs6OkBEQT9CQ0VFSUZKSkxGSUlHRkZEQjtCQ0M+P0JDQ0RHTE5IS05IREhESUxOTUdJTEdGRklJTE5LSkhFT0lDR01NTk1QTk9PTUxJSElPU1FSTlJmZ2Zyb3N4dXt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1lX3BHSUNFRUVCQkFFQERCPj8+Ojs7PTs9P0NCP0FDRkdKR0pJTEhHR0dGRUM/PUVFQj5BQ0JDRUdISUdNUElGRkZLTk9LRkhJRkVERElJSEtJRkhQS0RKTUxQTk9OT1BOSkpITVJVVVJPV2RhYW1ncXJvc3l6Z2VoaGNpbGdxbGZsbWdpa2xzbXB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HREVHQ0FAQUQ8QkE+QT06Oj0/Oz4/QEI/QEJFR0pGSkdJR0ZGRkRDQkFBRkZDQkJCREVFR0dIRkxQTElPSkpMS0lGSEVGRURDSUhIS0pHS1JNQ09PTlFQT09OT09LS0tQVVdWVVRZYF9daWFuaW5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Bya2tzTUZHRUdBQkBDRDxBQUBDPDg6PT46Pz0/Qj9AQERGSEVIRkZIRkVFQ0NFQkRJRkNHRUFFR0VGRkdFSk1LSFFNSktISElFRkhIRUNJSUpLTUtQU05EUlNRUVJOT05OUE1MTlNXVldYVlheWl1kYGhiamlna19kZWZjZ2dna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEJCQkVFPEBDQkQ8Nzo9Pjo+OkBCPj8/Q0VGREZEREdFQ0VDREVGRkpFRUlHQkdIRkdGRUNGSkpHTUtMS0hKS0ZJSEpIRUtLTExOT1JUT0lUVVRRVFBRTU5RTk1RV1pWWllXWl5aWGFgYGBfaGVjYGRlZ2dqaWhqZmhubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3NzeU1ISEdJREFDSEU8QEVCRDw4Oj4+PTw8QkI8QD5BQkZDRUJCR0NDREVGRkdHSUZHS0hDSUhHSUdGREhLSUdLSE1LSktMSExKTUtJTkxOTk9SVVZPTFZWVFFUUlJMT1FQT1RZWllcWlpcX19eYGNeXGFja2JgZGdocoVoZ2pmam5ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0hLSEpFQkRHRTxAR0REQDk8PkA/Pj9DQjxAPkFBRkNFRENIREZERkZISEZIR0lLSkVKSEhKSEZGTEhISEpHTExMTExJTUtNTk1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXV5gYGFgYWVdZGBmZ2BlaGpjc3NmamhnbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3b3dJSktJS0dCRERFPEBGRERCOz8/QUBAQERBQEI/QUNIQkVERkdFSUVGRUlIRklISkxISEpKSUtKRkpLSElKSkdLS01MSkpNTE1OTk9MT1BSVVdWTU5UVlVTUlFQTU5UU1JXW15eX1xeYGBhYWFgY2RlYmRpY2Rpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXRzcHN3dHV1d3Z1dXRlcXNrcHFqcnZwd0pMS0tMR0NDQUQ8P0VFRUM9QUFDQkJDRUFDREFBRUdDR0dHRkVJRkNHSkdHSkZJTEhJSk1LTUxHS0lIS0tOUUtSUUxTTUtOTU5QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhX2BiX2BmYmFjaW5oY2loaG14dmxoaW1vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2cnJxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHRUFARD4+REVGQz9DQUVDREZDQ0VHQ0JJRUJISUlHSEpGREtKR0hKSElLR0pKTktOS0lMSEpNS1pmSmRcS2xSSE9NX25VbHNbcXBid2NSUGJ2dWh1Y2F2YFhucWJkdmluemZcbHRgbGtVX3d2aWpoaGZnbG1qbW9qbW5zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVxcXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPz1ERUZEQ0NCRUVERkJGRkdDREtEREpMS0lLTEdHTkpISktHS0pJSkpOTE1MTExJTUxMW3NiZHBebGxVTU5lcl1nZXFsbnRncGlfYVlubWJwcGJrampnb3F0ZXRub1xwdWdxTUtyeXZrYWFrZWVseG1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QUI/PUJFR0JGQ0VERUVEQkhIR0RFS0dHS01NSk1MRkpOSEpLSklLSkpJSkxNTk1NTUtOTU1bcm9vbnBwbGtNUFFsWE5pYnRycGFtb3ZcWWxQW21tWnFta29teHh0c2lwXGBzbHFqVXV5eG9jXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SUtHSEZFRUJBQj0/P0VHQkdESUVFREJGSUhIRUdLSkdNTU5LTU5HTE5JTUtISk1JS0lKSk5PTk5NTE5NTFxoZHVdbHFXbE5PUW5VWmtea2x2YWxkdFRlY05sWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2hhY2l0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZITUdJRUVEQ0FCPEJAQkZDR0ZLR0VDQ0hLSEhGSUxLRk1LTFJSTEdNTUhOSklITkhKSkhITk9OTkxKTU1KWnNwcG9xcW1sT1FTb1lza2dvb3Fxb210Xm5YYXRfbm9wb3Fyb291c3R0altddGN3eHJqbnpoYWFjZmFiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dElLSEpDRUVFQEA+Q0NBRkNISU1IRkNGSkxJR0ZKTUxGT0pLV1JLR0tKSk5JSUpMSUtKSUhLTU1NTElLS0tTa2JaaV5famNyclpfWWtvYGVlVWtfY1thYlFgbWhcalxuaWlkWm9lZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySUhGSURFREZBQEFFRENHQkhKTEdGREdLTElFRkpOS0lPSUxbUUpGSEhLTUlISkpLS0lISkdMS0tLR0hKSkxMTEtJS0xOVFtdVFBVTVFQTk9PVVJQT1FPT1FKSk9QUWRxaVRZVltbXFVZW11YXVxcY2ZhYWZiY2ZfXmZrbWhtdHhydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNIQ0VHRkZBRUM/Q0dERUdDSUtMSEZER0tMSERHSFBLTE9LTFdNSUZFSElKSElLSExKSUZISEpHR0lFRktISUtOTElPXFdeT1xcYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXWJYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJESUVHR0ZLSktIRUZKSkpGREhIUEpMTUpNUklIRUFIRkpJS0tJTEpJR0VKSEVGR0VFSkdCSU1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5fXF5TW15jX1pdYGNfWV9iW2BeW1RZWFpfXmRiYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3Z5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUlER0tKSkRFSUlOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlFQ0RFQkZKRD9JS0hOW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1FbX2FhXV5jYWBiYWJjY2VaUlhWVlxbXmNgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGQ0dFQkVHSEZHSElGR0pHSEZIS0lLRERKSk1NTExISkpISkc/R0ZOSktLTUtLS0lHSEREQERBSElBPkhJRk9dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RUV1fYWNjY2NiXGRiYWRjZlhRVlVTXFhbYV9eX2FhX2Rsa21qa2xudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUJASUZDRktJRkZHSUdHSkZGRklMSk5FREpKTE5KTElLSkhJR0JISFFNS0tPTUtLSUhIRUQ/RUJISEFARkVDVF1ZXlhfWF9bXVVYWFBdXVFLSlZeWF5bXVZaYVJSX19iYmBgYmJgY2JhZGRiWE9SUlNcU1xeXV5eX19gZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIRFJLRkhISERGS0lNUEVHSUpLTkxMSUxLSUlHREhLUU9NTFBMTEtLSUlERUFFQ0hGQUFGREFWVUVcVF5TVmBYTlRVTlpbTUpLVGBhW19YX15iXU9ZYlxgYF9iY2JdYmJXX19UUE9RUllTXlxcXV5fYGFmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElSY1FEV19JR0dIREZNSlBQRklJSktOTExLTUtKSkdFSU5RUU5PT01OTU5IS0FEQUNERkRCQUNEQExIQkxMUE9PTUZNRkZISUhHTExNT1BJTE9QUFNQTFFTUlVaWVdZWFhkVk9TVFBQT05RVVRcWVlbXl5hYWVmY2hka2xxc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01eTUdIWU1HSEpIR01MUVFJS0pLS05NVU5PS0tMR0dLT1NTTlBPTk9PT0hLRmBFRF9MRGZjQ0xbSF5bc21PTlZtWUxDUF9UbFdnSl1XVV5ETFFVTE1TVlFSVFhXVFhVVFxUUGZaaGhkWVRrVFhXVVtcXGBgYWJiYmBnaWdubGhyenx9foGEhISEg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7S0lFRkZIRUVLT1RKS0dgVEhKT0pJT01SUUtNS0xPUlVST09KTE1HSE1RW1lPUFBOT1BQSUtRf1FJfFlZcnNXUG1IcW5vYVZScnF0T0Jrc25xdHBTb19bblhdVlxYVWtoVV1WY1lgWVpfVlVXf2l0dXVfYXZgWWJcXGZbX2FhYWJeYGJnbXBsYHB3dHiBgYKDhIJ/fX6Adnh6bXZ+dHh+gHx+gIGChHyAg3p/gX9+d3dNSUVITU1CRExMR0pMRlJWTExPSEtSWFdRTk9PTVFUTk9RUEtLTkdNUFNbWlRRUk9QUFFLSVp4XVR4ZGhZUlNQdmd0bHBibmdrUXJPTHdtanJwc3JxcnBvcIBdZnp1eHFxenF+cn1rdX1iUmd8ZXNzb3NzfH1vfnlvf3JfYGBiYlthYGhrbmtibGZnbXd+gYCDfnt4d4B0dnpocn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tISlFPTU5KTlZeWVVMUVNOWVlMU1NSTkxPSVFSVFlXV1FUUFBRU0xIZ3hsY3hxbVpLTFR5cHVtdWJvd1FkZElldnFtd2+AamZ4eGlXclJpe21panp6fWx4en9wZ29YdXVqdnVwgGFzaHxpbHh8b19fX2NiXF9kZWZpamRnYmNkbGxwcHN0c3NzeXFyeGJsdGdyeXtzcnV5foFzdnpufH15eHJuTUpSdE5DQkVQUElLTEpMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBKU1RVWFdXUFVQT05TSktyb3V1cXVxZGhhVm5McXBeR2h5V3ZUS2h4fXhgeXtzbmFebW9kU2dydW5teXB3bHZzdHFsbVxzfXprbXl8bHVtfGtwdnV4Xl9fYl5dX2VkaWdoZWVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21LS1pWSEdFR1JQS0xOS0xRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTkpUVFZXWVdPU09PTlFJUm1IaXdLYGR2dVVXbE5ubHtyYWpnf3VUS1draH1sbWx4YFtwentfYHpzY3JveHFoZHxpcntdVEtsX3Z1a2l1e3ttfnhrfHBdXl5iW15iZGVnZWVlYlpjY2lra3JzcndnbWloZGdgYWxhZ3NybGhtbXJ8a21oa3t0bW1rbU9HSktISkhIUlFNT1BNTFNTUk9TUldSVlRQV1pWVlRUVGFgUU9OS1RTU1FWVk9PTU5PUUpIUU5QVUxLS1JTUlJST1ZVUVFPUlJYWFBOUFVUWFhYW1tVU1NXW1dYV1tPUlRXV1hRXVhWXVVTT1hSVldXWFpgW2dyXltbW11dX2NaX2NjZWZkY2NiWmNjZ2ZmbW5tdWZmZ2NgZl9dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUElLS0xNS0pUUk1SUVBMVlVUUFRVWFVaVVJaXVZVVFdVWVhQT0xOV1RQTlVTTlBOTFFQS0pRUUtRTUpLT1FUUlBRU1JJSU1OT1FSUFBRVFZSWFdcV1NTUVFVVVZUWlFOUlFXVVRZVlRZVVNRVVNUVVhZWF5aX2FdXFpaXV1gY1xdYmJkZ2VkZGFZYGFjYWJoaGluY2FkXl9jXVpkXGJtYV5mZmdtc2RpaGtrZWRjZmhRSktLTk9MTVRRT1RRUU1YV1VUVlhXV1pWVFxgVldVWVVYVFFQS09YU1BOVVFOUk5MU1BNTlVTTlFOTU5RU1BUUFJUVE5MTk9RVFRRUVFWV1VZWltZU1VSVFhXV1lbU09SVFdVVFlVVllVUVFXVVZYXFpbYF1WWV9dXl1cXWBhXltiYmNoZmVkYlhgYGJdYGhlZmRhXl9dXV5aWl9aX2dgXl5dY2hrYWhmaGZkYGJkYlBLTUxQUUxPVFBQVFFPUVpZWFdZWlpYWVZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBRTk1RUU9SWFNRUU9NT1NVTldRVFRVT05OUVRVVVJSUlRYVlpdXFpWVlFSV1hWW1xWUFNVVVVWWFNXV1RSUVhWVltfW15gX1ZfXV5gXFxgYF9fWmJiZGhoZWRiWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXVxfYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9VXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NVlNNTlJPUVJPTVBTUlVaVVNQUExQV1VRVlJTUlhNT1BRVFhVVFRTVVlYW15dXFtWUk9VVlVbW1ZRU1ZVVlhUU1haVFNRWVdXXV9bYF9gVmJcYGFdYGJfXGBdY2BjZ2llZmBaY2BhX19lZV9gY1taXFtcWlpZWVdcWlxbYF5gW15eYWBfY1xZYFpRTk9OVlFQVVNQVVRTUFdcXFxZXlxfV1xeanB3eYBjXFtWVllSTk9XU05RUVBSVFJMUVRTWVtXVU9STlNYVVNSVFJSWk9RU1NWW1ZWVlRWWlhdXlxcXlZTTlRWVltbVVFUVFZYWFJTWVxUUlJcWFpdXl1hYWBXYltjYl5hY19cYmFiX2RnaWRnXlxlYGFgYWNkX2JfWVpfW1xbWFhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQWl1eXVxgXGBVXF1oanJ9c2xoXFVZV1FPUltTUlFUUlRVVEtSVlVaWlpTT1NRVVVVU05VUVJaUlRVVFhdV1hYU1hcWF5dWVpdVFVOVlZXXlpYUVRUWFhYU1ZZXFRSVl1ZXV1hXmNjX1lgW2ViX2RkXl5jY2FeZWZpZWZdXmRhYWFiY2RfYl5YW19bXFtYWFhYV1taW2BdW1tcW1haW15WXlldUE9PUlpQW1VVV1ZUVFReXmBfXmJcYFVdXmJreXVtfWxaVVpWUVFUXFRUVFVUVllXTFJaVlxaXFJQVVNXVVVTT1dRU1dTV1VWW11YW1lVWl5YX15ZXFlSV1JZWFlfWVlSVFVaWVlVV1lcVVRaXVxeYGFgZWRdXl1dZWFiZmReX2RjYFxnZGhmZGJfZGFfYWBiYl9gXldZXlpcXFpZWVdWXVpdXltaW1xbV1lcXVZYV11TT1BXWVBdVVZZV1dVWF9gYWFgY11gVV1eYmVldoJ7aFhZWlRWVFZcWFdXVlZXXVhPVVxZXl1dVFNYUldVU1JTV1FTVlRYWFhdXlhdW1VeX1hfX1hcVlFZVVlaWmFYW1RWV1paWlhZWVpXVl1eX15jYmJlZV1iXGBmYmVmZF9gZGJhW2ZjaGZjZmFmX19hYmFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOU1pXVFxVVldZV1ZcYGFhY2FjX19WW2BkYV96dW9oWlxaVlhWWFtaWVtZWFlgVk9UXVtgYVxVVVlQVFZUUlZVUVNVV1tbXF9eWl9cVl9fWl1eWV5WU1lYWVpdYVldVVZaW1pbWlpZWlhZX19gYGRjZGVlYmRaYmZjZ2ZlXmFiYGNeY2NpZWRnX2deYmJjYWFgXl9YVFpaWltbWFxYWFxbWltXV1pYV1xbXGBdVl1dU09WWlZWWlZZVVhXWF5gYmFkYWRhXllZYWRiYGtmaF5cXVtXV1laXFxcX1tZW2JWU1deXWFjXFNWWVBWVVVVVlVTVVRYXV1fYGBdYV1XYF5bXlxbXlhWWFhbWl9fWl5XWFxcXV1dW1pcV1pfYV5gZWRkZmZmYlljZmVoZ2ReY2BfZWNdZmlkZWhfZ15jYmNhYWBfX1tYWVtZWlpYWlhXW1xaW1dYWlRZXVxaYFxVXmJNUldZVldaWVtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX11dXVhXW1tdXV9fXFpdY1hZV1xgY2RfUllZUFdWV1hXVlZXVl1dXmFiYV9iXllhXV1eWV1eWVhVV1tbYF5cX1lZXV1eXmBcWlpZW19iX2JlZGVmZ2diWmRmZ2lnY19jXmBmZVppaWNmaWNmX2JiY2FgYF9dXVpYW1lZWFhaWVdaW1pZV1hWVVtdXV1gYGJieEtXV1xZV11cXF1aV1xdX2BiZGJjYV1gWGJjYmBjYWNeXF1cWFdbXV9dYF9dW2BkXFxXWmJlY2FSXFlPWFZZW1lZV1paYF5hYmNgYWNfXGJdX11bX15ZWVRYXV1fX15fW1peXmBiYlxcV1tdYGJiY2VkZ2ZlZ2RdZWZoaWZjYWJcY2dgXGlpY2hpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldXWFBYWl1hY2Zmcmt/SllXXVtaX11cXlxZXVteX2JjYmFhXWJbYmRhX2NiYl1cW1pXWGlxYFxgX11cYWNfXVhZY2VkYlRfWlFZV1xdXFtZW1tjYGNjY2BiZGFgY15gXF5fX1pYVltfXVxhYV9dW2BhYmViXlxTXF9gY2RkZmVnZmVmZV9mZmhoZ2RkYFtmZ15haGhiaGhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhXXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3x8fHx7fHt6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2d3d2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t8e3t7e3t8fX19fXx9fHp6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb3Bwen59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqHc3FycnJydD4oKysrKiKL29LS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb296gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjIlyb29vb29yMhcbGxsbEI7v5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dXZ3d3d3d3d4eXl5eXl6eG9wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHp6enp6enp1c3Nzc3NzfYWEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl3dnZ6e3h7eHd2dnh5enl6fnl5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3t7e3x9fX19fX17enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d3fHt6fHp9e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3l+e3l9eX16eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3e358eXx6e3p3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4e3x8fXt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXd4ent6eXt4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f359foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKCgIGBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4OBgYKEhIKDgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBgoOBgIKDgYKFhYWFhoaHhoWGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SEg4KDhYOCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Qko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDg4OBg4SFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSj46QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKCgoGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5+f4CBgYGCgYCCgoGCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgYGCgoSCgoOEgoOEhYaEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GCgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoOFhYODg4SDhIODhISFhISEgoGAgYKDgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5OSj4yMioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAgIKBgX+BgYCAgoGCgoKBgYKCgYCCgoKCgYKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJOSlJKPjYuHhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4CAf4B/gIGAgH+BgYGBg4GAgYGChIOBgYGBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgYCAg4KCg4KBgoKDg4OEgoODg4KAgICCgoKDgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOEg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SEhIKCgoOCgoSCgYKGhYOFg4OEhISFhYSEhYJ/fX19foKEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSEhoWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4ODg4OEhYOCg4SFhYaFhoaFhYeHhoOAfn9+fn5+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgoKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODg4WFhYWHh4aHh4WBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaHhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4OEg4OChIWEhYeHhYeDgH9/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eIiIaHhoeHhoaFhIOEhYaFhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4eFg4OFhIODg4KFhIOEgoGBgYGCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiouLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISDhYWEhYWGhISEhYWFhoWGhYOJlJOQjpGOioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4aEhIWEg4OFg4iIg4GBgYKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYSDio2CgoKCgoKDgX59fn5+fn5+fX1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4eJiIODhIOFhISFhYaIh4aFg4KCg4WHhoeGhoOCgoOEgoODhIKBgoGBgYODhIOEkZKRjo+Oi4eEhoaEgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYaIi4qGhIaEgoaGgoCHhoODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYODhIWFhYODhYSEhISEhIWEgoKDgYSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWCgYCAgX99foODg4ODgoKAfX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4OAf4CAgYOCgICAgICBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGjJORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn9+fHx/g4OCg4KDgX19fn+AgIGAfn19fX1+fXx6enp/goKBf39/f35/f4B+fYB/f4CAgX+AgIF/f3+BgX59fX+AgX9/foCAgH+AgICBf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIB/fH19fn1+foCAfn1+fXx9foKDg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6eXqAgIB+f35+fnx+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fn6Af4B/foB+fX+BhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXuAgH9/f39+fX5/foCAf35/f4CAgoB/fH5+f35+fXx/f4B/fn9/f4B/f35/foCAf36Af39+fn5/f35+f318fH2Fk5KNjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCg4GBgX6AgoODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2BgICBgYF/f4B/f4F/gICAgYGCgoB+gH5/fn5+foGAgoF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISDgYODg4KCgoKCgX5+fX19fn6AfX19fX19fX18e3p6eXl5eYCCgoKEg4CCg4GAgoCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGhoWFhoGAg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aGh4eHhoeHf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYWEhYOCg4OCg4OCgoKCg4OCgpKQi4iIh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYeGh4eGh4eIhoaHh4aHiId/fH18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZeEg4OEhJSTgIGBf39/fn6Fi4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko6LiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgICAgIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhISGhYB9fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fH+Cg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4uKioyJiImHhYaFg4OCgYGCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCgoODgoOCgoWGhISFhYSGhIOEg4KBgYOBf319fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYKEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYODgoOCgoGBgIB/gX5/fX59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+f36Agnx8f3+BgIKAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uTj4uLjY2NiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6Bk5GMjI2Nj4qFhoaFhISFg4ODgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gIGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fH6AgIGAf39+fX19fX57fH1/f3+AfX9+f4uQjYyMjo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB+gH5+f31/gIB/gIB/f319fHx9fn18fX19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6EkYyLi46Ni4qGhIWEhIODg4OCg4KDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+f399fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9e3p7e3uAhoWChIOCf4B+f4KCgn9/goJ/gIuPjIqKjIuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39+f3+AgIGBgH99gH9/fn9+fn9/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fXt/fnt7e3x8fH18e3t7e318enp9en6CfoGDhIKBgoGFhoWFhoaHhoKEkY6MioiKh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/fn5/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fHx+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7e317fX5+f4CAg4eJiYmLiYuJhYiRjYuIiIaFhYOCgoOEhIODgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gX9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX19fX18fX19fX1+fH18fXx9fX58fn19fX18e3t7fHt8fHt6e3t6enp7fn6ChYiHiIqLi4uJjJCNjImIhoWEgoKCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImNj4yKiIiFhISCgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx+f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX1+fX5/fX19e3x9fnx8e3x9enp5eXl5e3t+foCBg4eEiI2MiYmGhYSEg4KBgoKCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH1+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjImLh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYGCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2fYCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYOBfn6AgH1+gH59fn6AgH+Bfn+Af39/f398f39/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIF9fHx9fXx8e3x8e3t7fHt8fHx9fImJh4iFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBgoJ/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHp8e3x+iYWGhIWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen19eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fnx+fn19gYR/gH9+f4GBf31/f319fn1+fn1+fHt8enx7eoCGgoSEhYSEg4WDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXR1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAgoGAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf35/f4B/fn17ent6fHt6goSAgoKCgoOChIKBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXp8cHd1dnd5dnR6hISBhISDhIWFhoSDg4WEgoODgoCBfn9/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GEgX+Ag4J/f4B/gX+Af3x7e3p8e3yBgH+Bf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5eXtxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4KAgIF+f4B+f3x9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgICAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fX99f4B8f399fYGAgH59fYB/foGBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh5enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/goCAgYGAgYGCg4KBgX9/g4B+goKEgICCgYKChIJ+e3t8fHx9fX1+fXp+fX14fn9/fHx8fn1+gYCBgYCAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDhIN/f359fn5+f4B/gIB/gYKBgH9+f4F+f4CCgoCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWDg4ODg4OCgYKDgoGDgn+Bf35/fn+AfX19fX+AgIB/f4B/fIB/f4GAgYCAf3yAf31+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgIB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnF3eXJ4hYWFhYOEg4KCg4KBgYKBgIKBgIF/fn5+foB+fX58foCAgH+AgX97gH6AgH+BgYB/fYB/fn5/f319fX6AgYKAfn9+fn59fX5/fn9+fH+Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fXt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYaFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf3+BgHyAf4B+f4GAf399gH9+f39+fX18gICAgYB+f35+fn18fn9+f358fYB/fn1+gIJ/foCAf36BhIKCg4WFgoJ+fnx7e3x8eXd7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXJweHdxe4WGhYWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAf4GBfX6Af35/gX+Af3+BgH+Af31+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYaEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYJ/goF9foF+foCBf4B/gIKAgIB+fH58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/gICAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoKAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jX53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIGCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBhIOAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359foB+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICAgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4GEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+AgH+AgYF/gICAgIGAgYGBgoGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDgH+CgYWDg4SBgYOAgoOBgYCAgIKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CCgH9+gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX54d3Z5eXl8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIKBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf31/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9gHp5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoKGg4ODgoKEgYSDgYKAgIKBhIGCgoGCgX6BgICCgYKBgYKCgICAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4KEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+fn+BgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChIaEgoODg4SBhISAg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoOGhISDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fXyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChIWEhIOCg4SEgISFg4KCgoODgYOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e32AfX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4OHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4SEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KEg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDhISEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX5/f39/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSAf4GDf35+fH59fX+BgH9+fHx+f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOFhIKEg4aAgoWFi4mEhIOEhYWDh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgX2BdYF5g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYKBhIOAf35+fn19gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIaEgYOEhYOEhYOKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKEdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8f3OCg3+Dg32BfX5+fX6Cg4F8f4B9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOGg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnp5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26AiHltfXJzdnN2bW14bHB5bHV9f399foGAgX1/fn2Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4aFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gX9/fH99fIF+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLioWEhoeHhYOFhYWEgoWFhIWGhoWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJioiFhIaGhYWDhYWEhYaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomJh4aEhoWGhoWGhoSGhoeGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKBgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhYaGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWDhoeGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fXt8fH1/fnx8fn2Af31+gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhIaEhYaGh4eFh4aJiIaGh4eIiYiFhYiFhoeGh4aHhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhoOGhoWGhYWGhoWEg4WFgoWHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fH9+fX1+fXx9fH98fn58fYGAfXx8fXx8fH56e3t9foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhYaFhoeFhYaGhYSDhIOChIeDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX18fHx9fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhISEhISFhoaGhoaFh4WFh4WGhYeFhIOEg4ODh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1/fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoiGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4OCgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWFg4WFhoaGhoaFhoaHhoeHhYOGhYOBg4KAg4WCg36BgYF/g4F/fn5/fX98fH1/fXt9fXx+enl6eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGhoiGhYeEhoeJhoaIh4eHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhYSDhYWHhYeGhoWGhoaFhoaEg4WFgoGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15eXp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoSFhYWFhYODgYOBgIKBhYJ/gH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKGhYaFh4aHhIaGhoaFhoODg4WAgIGAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18fn5+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OEh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEg4aFhoaFhoaEhYaGhYWGgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXx/fn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYOEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOFhIWDhYWBgYODfn5/gH9/gIN/fIB9fX+CfYCBfn6Bfn19fX1/e398e3p5enp5enp8eXp6e3t7fHp7e3t7fX59fYB9fXx8fYB/fXyGg4aGhoaFg4SChYKFgYGAf3+AgH5/gIJ8fn9/foCAgYKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYaIhoWEhoeFh4WFgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhISDhIOFhICAgoJ+fX1/fn5/hH57f3x8gIF9gYB9fYN9fn59fX57fnt7enl7enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoSFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoOChIODgH+AgX59fH5+fH6Dfnx+fHyBgH6Cf31/gnx/fn19fHx8e3t6enp6eXt6enp5eXp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoOCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhYSCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgoCFg4F/foB/fnx8fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRkw9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1dTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8rKysvLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dTV1dXV1dXV1dXU1NTU1NTT0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzQ0dDQ0NDQ0dHR0dHR0c3Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX2Nzd3d3d3d3d3d3d3d3d2tbX19fX19fX1tbW1tbW09LT09PT09TU1NTU1NbW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNloSGhoaGhoeHh4eHh4Ky4t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubN4c3Nzc3Nzc3Nzc3NzcJTAvL29vb29vb29vb28v9LS0tLS0tLT09PS09PT3OPi4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzm5QU1NTU1NUVFRUVFNMoPPr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6WZMikrKysrKysrKysrKyRksKmqqqqqqqqqqqqqqLDS0tLS0tLS0tLS0tLS0eDs6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8NztAQz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzM5xVFhXV1dYWFhYWFhXUKHx6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmmzgvMDAwMDAwMDAwMDAqaLKrq6urq6urq6urq6qx0dLS0tLS0tLS0tLS0tHf6+rq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs+QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183OeF5hYGBgYGFhYWFgYFqk7ufn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampq6BFPT4+Pj4+Pj4+Pj4+OXG0r6+vr6+vr6+vr6+uttLS0tPS0tLS0tLS0tLS3+np6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI/Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcfFxcXFxcXFxcXFxcXEy9DPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs/Oz8/NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRysrKysrKysrJycnJycnN09PS0tLS0tLS0tLT0tLV1NTV1dXV1dXW1dbW1tjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Pz8/Pz8/Pz8/Pz9PPz87MzczP09LSzs3P0s7Ozs7Ozs7Ozs/RztHU1NPOztPTz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tjX19fX19fY19bX19fX1tXW1dbW1tbW1tXW1tbW1dXW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7OztHBp9Stg4OVz9KkodDOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Oz8/RnZC5nLy4mbWzn6Gp0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD5BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz8/Tuq+srKaOgI3Gn5iVnMjQzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PTo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/P05+xnqihiazWupihnbCy08/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/P0cCciZ2kqqybpbKZlq+zqtXQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8QkA+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9SjooGeraSclaiQmoWdk6TV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDs6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NHEn4F7lq2ns6uff5+phZmk1dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DVq6+8wM+UyNnBnIC8raaYr9bR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ozs5PT49PTs7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmHf4Wgl4+gn5+YqJaYm7vV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU0Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocbT09Wcm6ylq6Kfw6CrpJzR09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDS0dLXqIfPqY6OrdjCj4271dLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0s/F1NS/v9XS1cXE1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6PD0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLT1NLS1NXT09PU1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTY5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTg0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs6ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ozg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUZDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjs8OTs7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4Nzg0Oz88Pz05PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg3Nzc2NDY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWh4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIN2dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg1NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urq5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpkbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXhwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tbW2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5ubm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZycm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqam5ubm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVUYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcU19NSFJJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKlqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKWioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq2mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Necl9oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmloYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqaeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloKGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbGh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLazurGqrrSxsLG0tLa8vL68vL3Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqTlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGw8O5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsae8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzszLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbGhxeG95aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2hndVpmcndzeGZnXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8nOyMHEwcfKysbKxczIzcbIxb/DwMvNz8nGw8PEwsS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamhdam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjHycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytpqm7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHGwcvLx8bMyc3FxsbDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldG5zYlxiVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHDxL+/vsTLyMrLyLy7yMfJzcjDyMnJxsXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu7vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cm9mZWdjamRham1ubl5YXFZVTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXCxsK+xsG5u8O6uLm8vsHGwca6ucnJw8XEwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZmNaWVlcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/u72/ub26urS/uLW3s6+7vLfAt73Cv8G7v8G8u8W+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5h31xY2BiYmdqZmZpZWldVlVTWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W6wbi+uL+8vbe1t7CuuLa5v7vAv7fBvLvDtrrIuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVrZ1hYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v728sq2vrLGwt7y2u7zAxLm3t7e1urm6u8C9w8C6xMK+x7i5uK23tbi6tLezu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD08Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72/u8S3tri2t7+/xLzCxcXHx8rJxs/CwbiutbW8vri7sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bndjZ2JcY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz0/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6qjsLm9vrO8vrzFuLK4ub3HycrDx8jGxsnIzM7RzMrFtbrAw8i/v7W/wL/Gxr/LxsO/wbzAw8zKx8XGwbm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYWFOSE0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS8w7y6ur68xL+3vb+9x8zGx8nGxr/ExMrIzMzNy8bCw8vOwry5vbq5wMO/yMbEwcG/xcDKycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE+PkFCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy2ur3BvLu/tr/Bv7y/usDLwsfIwL+8vL/FwsfLyMHDwMDJysLAu7uwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem1zeHNncF1bXl1ZUUVEQ01JQUU9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u726w7u3vbe5wLu6uLi1xcHDw7u5s7S6wb2/x8C5wLy+xcS9vrmysK64t7/Dx8PEvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbmlcX19ZU1BBRUlHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucHAt725uLm2tb+ztLK4sbvBwMO3t62wtbi4uMK6tLu3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2VcWlVKPD8/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7e6t7a2srTAtrK0uLO6wMHDubeysrK0sre+urO1sry6vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnJsXmJgW11PSEE/PUhDRk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27vLi2uraxwLq3ubi5u8HBxMO7u7a0tLC2ura0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJuY1xmWFxdUk5NQT9KQkBKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7GttrqurLyyuLm3u7+9ub7AtL+7vLq4vsK8wsrHvsC4ubaytLaztK+su7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEJGTUY4NjY1OjY6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm9tbK4tLm6tbm7tbWztbu8wLu+wLS/ubm6sbrDvMLKxb+7v7+5tLSzsbGusLm5try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Ojo6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSYnqSjoaWqrK2iqaqppKmtrqW0sa6xrauprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEhASFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby3wMG+vLy8ua6tr7Kyurq3t7W1vLSvtKu2urjAxMG7try9uLKts7CvrK63trO0ta+qpJ6bnJyeqKifoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moqquepaKbo5yVkIyPj4+TkJaVlpifnp6amaaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HT0xMQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpayqqLWysbCur7KnprCkr661wbq1t7K3trK0q7K0rqqrr7Cys66lnpKYlI+ZoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqqxo6WnnqCclZOQj5GQmJCWlZiXn5ibmZujmZeUlpqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUlIR05STkpORztEQD0yPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJiXlqGorK62t7q5ure3u66ooKGpoaCtq6qmqaSpo6SupaystLy3rLKxr7Gtta+vs7Wqp62so5yZlI6SlpeZmZygo6KbnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6musqulqqqgmpiYmJWTlpqTlZWZlpqXl5ignpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeHlgYlJVX0hJSUtTVElSUEw4PkI2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5OcnqOorq2sq6uvqq+pn5eepZ6epaakoKKfpqCirqusrbWytqavtKupqrSxsLC4raehnJ2alJiampGOkZWRjI+OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GusrG0qbGvopmcnZ6hmZubmpiZm5SVm5aZnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVtTWllNUUpOTlVMUkxBNz5CNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT83NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKSnJihnaqip6Cep6Gln5ySnKKbn6Gjnp2gn6Ogoq+vrK+xrLanrbGtpqawrq2ssKign6Kgl5GUnKGcmZiSk5+doqSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezuKyxtKOgnaWgrKGhoqCgmpiWlZ+bm5ikoaCepKGgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUVVIRlVWSkJNRz1KSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuOk56ZqJ2unqeenKGdnpqakpmenKKioKCdop+fnp+prKesqaq0q6utq6Wlq6iqrKqloJ6ZkpKUmJmXlpaMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7Whq6KpqLKpqqinqJqZnZqqp5+Zp6Cfn6eopaSenaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQlZNSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJqqoLGit6OwpqCenZ2XmJaZnpucpJ+fnaSdmp2cpaKko6Kqr6ynqaOgoayurqqrp6CenqKjnp+empyclJOVlJ6emJSGnpqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64tLvGxLzCu7ezqbKtqrO0r7Ouqq6jnauntrGsoq+loKOvsa2wpKSvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeGgXt0cmtrdXJwaFdbUUVUSERJT0g+RUEzRUg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqChnZyYm5+gm6Cfn5elnZWbm5+anpyepaannaCgq7Gup6Sko6CepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvcfGwrfDycjCwMW+ubS5urW7t7C1sqq6sa67t766uqq3rauquLq0vK6uuaOmo56npaKjqaaam5+Ymp2nqqegoaGkmJSjlpSakZydn6Sep5+en6KdmJmUmJSIhH16cmtkaG94amVaW0ZKTEREU0xEQkQ3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWVmpaUm6SmnaGqp6KrrLy8v8PBs7K4p6Ghq6qinZ6hop6cm6CSn5+Qlp+ZkpqWnZuZo6Gvs6mhmp2dn5+al5iXkoyPlpeTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczIydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdLTzNPQ09PMysLFxsbKx86/ydDLxsTGxMG7w8G+vr61vbOtv7/Cw8bEx8Suv7iyuLzEwcG6vLy1rqenrqigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJREJANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJujrJ6frqalsarFxszOzb+wwqmlqK2tqqGdo5+cnZqpk5mhkI6gk42UkpeZpLGxq6SgnaCbmZeUk5SWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1dfS183Gx8nMw8XKz8rT19HX0tTV09PIzMfNzcnSzM7TzcTHycrBxcvGyMjFvsKzs8jEy8rKzsXKv76/vMHHxMzMyMnAw7+tsLOonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi396cnV1Z2NndmlkVldRRE1GQElRQj1CPDoyM0A8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbS4rK6jnqSjn6CkrJuWqZaMlo2MjZemsK6lnZ6doaWhnpuVlJaUin13cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dPU1NPP0sPQ09bX1dbSy8nO0cvGzdLK0tXW2dXX09bYztLJztHMztDM0s+/x8bKw8zMy87PxcbHtsDKv9LNy8/Fyci/w8PIzszP0M/MysjOuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8d3N2b2NgZXJiXVJcSUpGQUVIST47QDg9NDU4NTo3Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSim6mmoqarmqOwsamotdDU19rSx8bLtLbCxbK2qaKlpqGiq7WnmrGgmJ2MkKatq5yVmKGdm6Gin5ydm5WKd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M/P1dTU0dLM0c7T19bT1dDP0tPRydPRyNDY19jR19LX2dXWzM7Pyc3Ry87Pv8XCx8XOzdHQ0cjLzMDKy8XUzsvOyMTJxsbIzMrT09HVz9LM0sG5xbKlqLWup5qorKWdsqiws6ysk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx7enFzdG1hY2ltX1ZQX0pKQkZDUU0/PD40NDo9NTI3NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqaCvrqqqrJ6mrrioq7fY1NXZ2dHO0MC8zMm3wK+nq6mjpLG2s6O2qqzDp6mpoZiWmJqbnaGemp2elH5yZWNiX19hYF9hYF9gYF9gZm1wcG5rb3J3d5vMwNLV09jY1tnR0tLXz9POy9PN1dTSys/M09bS0dbNz9XV0cbR1MrR1NXWztLQ2NjY18vIzcPJzszJy7/Iv8jJzc7Py9DNzsvOz8fLz9DKzsrCycbJzMrL0dLM09LRz9DKvci5sK27uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIeXZvcG5rYWRucGFXXFpJRkZETFdFO0A8MzM8PTg2ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj09P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufo6eeuLa1ta2lra6+tLHA2dLX2tzXz83LxNPQwsKyq62urKazsrmrsrzGoqGclpSXm56fn52UlpeViWxeXl5hZGJgYGFhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dTLzNDR08rO0dXS1dXKwMrBxczCyMnCzMPFyMrKzsrNzNDN08vFyM/MyMfKxMfAxcnLzdDRxtDOzc3Mz8XHwLe5vcPDvcO5srO+sbzExLWqmKWimZaRlZaSi5SNmpGUlI+PlIKJhXhwcWtuaGBgcWhZWGhWTUdMSVBQQjtEPjs2Nzo4OTo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzY/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcXDwb+7tbKxx8O5y9XW2drb2M3N0MnW1sXEuLK2qqSurLm5sbLErJaNjZiWkJOSkZaWlpCMfGViYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0cjLzs3G0dLPzszUysfLzs/Hx8/Sy9DPxrrEvsbJvcLHyc7EwsfAx83Hw8vKy8/Hw8PPyMbBxcjDvsDHy8vMzsLKy8jHy9DExce7x8PIyMLPwL28v7HByse6vaqxsqelnaKdmJCakKSZl5mRlZiJj4J3bnRkbGBeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WzsazJzcrIxL69us3Nx9DV1tna29jQytDQ0tTKxbq+vrCot6u+ubizpZGOjpaQhoOEhIJ+hYV/dGBbXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+yMbCw8DDx8rJyMrHwcXMxsjLzcnEwsvJwsLL0MTLyL+5wbvFx72/xs/Lw7/Du8nGyLvIxsTKwL3By8bFxL7FvLy/w8TLxcW8wMnCxcfSxcDIv8rKxsjG0MPDxsOvxMvHxMq3v7y6tKmspaWYn5iso6GlmqOgm5R7dnN0ZmpbYW5tWltYUURMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8y8/RzMfCw8fNz8/N1tDW2djZ0M3Uzs/Qy8S4xsG2tbyxwLa6rZGMk5eHe4CFhoB2eHVycF9aW11gYWJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKxtrqysrOyscK8vLu5uMDBwcW+vbm9v7nEysXGwr3GwLi7xMm/wsm7t7u6xcO+vMHNwsa+vrXBvcO6vMa7wrmzvMXDwsK2v7W1vr+6y8O8tbrIur+9y8TBxcLGyMbIxtDGwszIssfKw87NwcXDwL2zt7CzqKioubGlrbCrrayUeXZ3amVoYGhvY1ZeWUpFSkZIS0FGQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8bCxMjO0svKysfNzs/SydHH1tXW2M7M0MjNyMrFvsrBsrW6t7q2r5GNiouFeYCGhoB+hHx0dWRcXF1eYGBiY2JiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tLe0s7KzurW9sbewta+yu8K8wcS8v7u1s7u+wLjHubS7tsDCvLi9xsHDvLWusra6vrTFt7u1q7i8vcC9sLq2r7a6ssW8tq+7v7S2tMW9vsPFwMPFxsjLxsDGxrvIy7/PysfDxsLDt8O+vba5vse/rLW6tbe2jnh0eGdnZWJrbl5WXmBGS0hISkZCQ0FFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzsjGyc7M0M3OycvJy8rLxtHP09HPyMrGysbEwL3PvbO4vbm3tpuOh4mJe3l+hoZ3eIJ9dGheXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5oZmpubnJ8pMe/uLi1sKusp56iqqeeq6yzramrqbOttrCyqa6mrLK8urbDubq6sau1ubu0wrqwv7G9vbu2vMi5w7etqqiwssC2uLyvsKexs7S7vKuttaautq66sbCqua+tu667uLu/v725wr/Hw8XBvMbByMu4xcfFv8fEw7rExsK7xsnMy7O5wry6sohydnZraWFibGhZWFdbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj05QT0/QD88Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bGztLMxMbBxdDIz8PEx8HGxsXFzMPKzMLEwcfAury7yre0u721tauRiZCQfHl+ioV6e4SBd25eXV1dXV9gX19kYmJjY2JgX15bW1paXVpaWVpdZW5vaGZnaWtucoGtubC1rqalp6eaoKSgmpylq66jp6KrqqyqsKOmn6qttbaxvbmvt6+orri0tLy4s7yvuLm1srzBssGupamiq7Gys6i8qquoq6yttLSmqK6hpK+psqWnqK6lqLessLK3ubq7sby9vr7Ev7XBwcfIt7/AxbfEwr+7v8TDvsTIzMq/vsPAwKmGcnRyamldYW9kV1ZYUEhaUlNLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3usSwtrCbmZWcmKqpsLGztb2vxtHQzcTIu7vMw8zAvcq4v8XAvMy6w8bFurzDvbm3vcW4tbi7rrKVg4mNgXt+gH54dH98c3dmX11cXF5fYF5fY2NhYmBgX15dXFpYWVtbWVhaXF9ma2ZlZ2Voa29yhaqlrKagnKGllJ6km5eRoaOqo6KfpaWnpaygnZukpqyyr7a3p7Csp6q0q7S5sLa0rba5srC6ubG3pJ+jn6axp6uouaqkp6eop7KtoKemn5ukpqyen6ekn6Cxra2ssrSytLC1vLa7wcGyur7DwbK5usKzwL2/tbi7vb68wsfEwsO/v8Sgg3dwa2FmX2tvYFVZX0hOaE9USEVKRjw9QD06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3Nzg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBu761oJ6VnqGmurars7O7s8XQyczDx7m4ycLOwbrLub3Iu7fHu7bDxrO9xbu2r7i/u7CytrCihIeHgn15dnRvbWtqanFpX2BdXFxdX2BfYWNiYGBgYF1cW1xcWFlYWFhWWFtdXmRjYmVnZ2dqbW+Inamgl5WaoZabopiVjZ6hoqabn5+jpaGnnpuim5+qsK2xtaKpqqmrrKS1uK23r6yzta6zta6wqp+dnqOisqSmqbitoqamn6isq5mfoJ6ZnZ+lmpmjnJudr6mrp6qrrK2wsrivuLm7sLa7u7qrsrK5sr20trGxtbS/tb3AvcPBuru9l4N6cmtfZV5kZFhUWF5JV11LUEdJSkZBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZukpsCyr7astLfG0MnJwce8vMXF0MC8yrq6wru1xbi1wMGzwcO7rKm0ubensLOpi4aIgHlzbnBua2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taW1lYV1dXV1hYWFteYmRkZWZmaGlrco2onZSUlJuYm6GWlpCcoaGonZudpaahpZygoJqYra6trrKgpaKtq6ehtbCxsayor7OnurOmtqGinpujoa2joam1qqKjpp2lpqOWmJ6XmZqdn5mXnZycm6yhq6ajpKatq7OzqrSwsqqyubSvqa+ysrK3s66prK6xt7C6trm9v7eysZSFeXVlX2VeW1lWU1pVS1tRTElFSEtJQj0/QUFAQDoyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr69v7OdpaOYpbHCtba9rbS4w83JyMHGuMLByNC5w8fAtry9tsO6tr/Atbq+uqmmsLqwp7Gvm32FhYB5cHF0cWhmZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFhWV2FkZWNkZWRkaGp2opyUlI+Ulpefl5mUmJ+eoZyWoaGoo5+eqZ2bmqqmr7Crm6Ojt6qgn66otqmmp62wpLewpLegopuYmKqmoZqsuLCioaScoZ+gk5WhlJaWm5iXlpeclJ+pnamjoZ2jqqqwrqi0q6qmrbKwpaqusrGvsK6vpqensq6xtK+8tLm3rqOUgXl1ZF5hVllXU1JUS01eTFBLR0dMS0U8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunqeno6q7wL3Aua60uMLNyMfExb7HusrNtcTFxbG/v7nAwbm/wLm5vLenprC7paigpImBfnhyamxydHBpaGVkZ2JcXFpZWlxcXF1eXVxbXF5cW1xZW1xaWFZXV1ZXWFdXV1VbY2NiYmNiY2RmaoGWk5WLkZSTm5mclpaboJyflaCfpqWkpqefnJ+kn6qvpp+io7aooKGiqLOhpaekr6Wxray1nqCdlZSpoaKUrLGxnqKinZ6Ym5OLoZSRk5eYkpeXmJadppumoaKZo6Wlq6SlsKelo6urraWorq+uq6iqqbOlpquvtLGuvLWxr6+gknp2cmRhXFtdWE5MUUdSYU1XUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7K3rJ6kp623u7zBxbqxubXFysvBxMfHybjIxrXFwsmvurzCu8LAwb27t7m1paaxtZ2hiZiIgHdvZGJnaWhmaGpnam1gXVxbWlpZWlxdXFtcXl9cWllbWVlaW1dVWFdUVFdVU1RSVWBgX2BhX2BhY2RpgZSTiZGOlJKTnJSVlqOZoJacoKWhraWkpKKjoZuqqqWZnqWxqaCgnKSqnaehnqytqaiuraKhopSXo5ucj6upsJufop6el5iTip6SjZKTlY+YmJKboaKcpKChlaChpKabo6uloqSqo6uupK6xqaalpqa0pqmorbO1tLm6r6qsnotycG9gW1dWVVFGUU9IWlxPUkpUS1NMRUdJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw3Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2Ojg1OTg5ODk7OUA5e7W0rbS7srCssq2dp6evubmzwMi6tcCvxsnOu8LLzcm3y7+0wMfMsLa9x7vBx8O9vra5tKSqr66cmYeOg3x1aWpqbWhqbG5ra21lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXl5fX19iZG2Oj4SRho+Rj5mTlJKcmqKcm6CnqKqoqqaopaOYpK6klJmlr6mfm5iboJ6umZuqs5+lpp+jo6GUk5uWlpKoqq2anKChoJqUkIyZjouQjJKMlpSQnqGgo5ybopWboKKgmKKoo6Koq6Crr6Stt6Wjo6Ksraqoq6+zuLK9tbOrr5iEc3NoW1lZUlVSRllMUFxZTVROUExQUklOSUI8Pz9BPzw2NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj01Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zrqiztq6pqK+tm6morLe2rLzKu7a/rMzHxrnCz9DJtca+ur7Gy7WxvcS8wsTDvcCyuK6lqq6qnZeGgXd4b25pbm5ucWdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVUU05QUVlaWlpdXVxeX2Bkfo2Bi3+LkIqSjZeRl5mioJufqqmmraqnr6OnmZ+soJWWpKinnZeQj5qerpaXp6qZn52UpaGekpCSkpOVp6ulmpmanZ2WjYyMlIaIjYOQi5KUkKCeoKOXlZ+VmqCinpObpaWnqKigsbCmsLynoKOstKuup7C0sLm1wLGtsauQfXFyYlZUVU5SSUdWUVNSTExYTUpMTlJHTUtBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s62msbeqpqKwq52qp6mysaS2xrS5urPLxrq8w8vRzLO5ur7AxMe2tLe9srq7w73BsLOtsK2vqpuiiGtobm9yb3FrcGtkZmdlXlpZWllaWlpbWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen91iY6HkImYiZSUl5uZnaibn6qlpKqdp5igpZuSj56impeWhYSSmqOPk6KclZaVh6KampOLjouQmaSnnJWVl5uQkoeUjoyBi42AkIqSkpGhmp+hlZSYmJWipZmMmaSmqKahoLSyp7K3oZ2it6yqraSysqa1vLWrq7GjiHhybV1OUFFMT0NNTk5QS0ZOTkpKTk1RSU1KQUdLSEhDPjg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyNzc2Ojk5OTk4NDk4OEE3d7anpLawpKekqaWgqaWks6qissO1tbKzx8e4u8TKzce1r7y/uLzEs7OutqKstMO5uq2pq7Ourp6Wp31eYGdzcXZxam5pZmhoal9YWVhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTk1LTFNXV1ZYWFlYW11hb3N2cYWIgoeAkYOOipSRk52gj5qcoqGjmKSWoZuVjYeYmoxzjYJ9jZeWhZCZkJOOjnuZjpyMgoqAipifop6Qk5iWhI6Ck35+dImOepCGkpCQnZqZmpCVkJ2OoqOOiZqgoaSjm6K0r6yvrJ+YpbmmpbChsK6csLuqqa+qmYF2cmNWTVJPUE1DU05MUU1DUFBISU5TTUhKSkRKTEZLSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI0ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3e3oqO0qKWlqKOmpaamprOnpbTBuK+0sMrGubrCz8e/ta+9w6+xx7Ktp6uVpK6/t7Cvn6asrKqVlKJyV1ZfaGdpaGluY2poZ2JcWFhYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkhOU1NTVFVVV1lbXWlscm1/hXx0Tlhyj4KXho2cl4uTkJ+XnZWUlpSOlol/k4lfO1dve4uUiX+LkYyPhYZzioSWgXmCeoWTnZSDlY6Rj4OGfZN4cm+FjX6JgJCNj5eZmJOKj4mciJ6Xh4iWnpqhoJenr6mtqaifl620oqatmKyrmKe0oqmto5J9cm1fW05TUlZMRFRKUE1MRk9PSUVMUU1LUEpJTVBGSUg9NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl4t6CjrqGmpqqgp6mnoqmwqKe0wbqxtbDJw7m0v8/AurGxuMSrrsmup6Odhpqiuaymp5WlpKOglo6WaVFNUlZaWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbW9pe4J0UEJAf5WRkX2JlIyEio2bjZaVipKIhpWGeIh/YEpRbniKkoR8hIyJhH9/bn5/lHd1dniEjZlwUY2Iiod8fniUdmh3hYh+ioiVio2QkpaLhIqIlISajIGEkpuWnpyUpKOoqaWjnpuwq6GkpJCmqpahqpyipqiIdGxlXltIUVFSTUlVTVNJTExQSUhGS05MTVRLUVFPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTc7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjExNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85draco6edn6Guoaeopaeor62qtry2uLezwry3qLrJubepqre4rbbAqqKbkoOPmbGfoZmMn5aYlJGKjGVNTE5OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4aBe4WMkoGSmYuPe4aPgHV/eHNudXB0jY6BeX2KqoV5emh2e45wcm14gYqMknh6gHuAdnNykndndYSEhIR6lYmIioyLgH+Ei4x/lIN7gI+YlZyVkZ+dqZ6foJ6gqaWfnZiMp6SToKCWnZ6kf3FnYFxcSlZPUUdLWFJPSk1NUkpKSk1QSExRTFJUTUVIQTw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc5NTY3NTI1MjU3Mi8yLiwuLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw8N3aumKOhmJyes6mvqaWsrLCxqr20sry4trq1sqC3u7OrnZ+tq6y1s6WdlpKYhpOjlpyLgpeJj4mGhoNmSklKSUdGSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFlYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FSU1ZedYN9eWd3jZeYjo99Z3mBdnh/iY98hJiSgXKHj3x2e29rfq18c5CKf3uGkoF9f3RmdnyFbG9oc3yJjIeAbHlxfXBtdY9xaHGAfY5wQ4qEgoOFfnd3eouFfYt6dX6Oko+YipKam6OWmZ2bnZ6inZaNiqSbj52XjpaYj3ZtbGViWlhYVFFKU1VUT1BOUVZLTktOT0pRT0lPT0tGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppefnpagpq+srquoqbGvsay8uKy7vrmzraibsaitnJCXnqesp6SbnZOIln6OlZGVgHyKeoWAf3+BZUpHSEZCQENESUxMTVFSUFFTVVRUVVZXV1dYV1lZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWJ7eG98eYiPeXyLhW9tjJF4c3hqan+CcpaRi4F9lYBKkphuaHd+gWxpY2x5hZCShmtzbHxucnuGaG1wfnONiIOFen1+e3ZvdHSFgnmBd3B8joyKk4OWl5iakJOWl5mXnpeMg4mfkYqSjIaQln5taG1ubldVV1RRUVpPU1VVVFhVTU5ITUpNTktDSU5HRUA6ODk7OTk6Pjw5PDs6Oj0+Ojg6Ozk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5manqStr6Ksqqi1r66stL+rvMK/pqOalaWYno6FjJaipJuak5ePdpF+hYuRj3x4fnR9eHV3fGZPRUdEQDw+PkFGR0dLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganJBmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplfnBtf3qLiHWBiIZ0bJqRdHN7amudjkx5hJKJhI5nMXaGc2x+fYN0ZmV0foSEhYBmaWx1a3B/fGdwcHtuko2Oe3N9fHFwbnVtgn53eXRpeYmCiImDlpOSkIuNkZSVj5eOgHmIl4iGiYZ/kId1aWluZ2RXUVlXWFlbTVBVVlpZTklJRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsKzU3NzU0NzhpTzg7NW6SiJmRmpakqK2esp+muq6rsrDDsrvDx5uXj5SZi46GeoWRmpaPko6SiXSKhHeLj4x/dnd2eXdveHNpVUZJRD88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7OgcXx4bX1tcYOBhYF5hIaGeXKglXR4gHN1lIc1cZ2onY6hoYSihHZwhnyHfHOMrY2IgGhmYmlucm1wg3Vpb1h1b46akXZsf3p8bXFtcH96c3VtYnaEf4aAhZCRiouKkouRjIuPg3V4i4+AfoKAfY95cG9ual5aXF1bWVhgX1NOW1tZWExISkZKRz9DQUJHP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnnq+VpbWprbGuwbO7wcaXkIyUkIGJfW6CkZOKhIuIkIh2hIVvmIqMf3l7e3J8dHxrb15KUEc+QDc0NTg7Ozw9PkBCRUlMTExNTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHaIiHx9hYN/jH52opl5foaAhJmFm5xhhqqfnYqCkI16dol+iYiOc4qXj4N7XGRxdHp7d4psZ2lheG+Fj4J6boF3c4R6cHN5d2tuaV13h32HfIiHj4CLk5eDjYaNhn1xhH+EfHV3e32IdG5xcmVmXltaXVNbZl5XUVVZXVZHS0tFTEc/RkBEQz9BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XIx3iX+UjJGdnZ+mkaCroLGpr8Cyu8a6lo+RlIh6hnZrgIySg36LhZCOeYSCdaKGjX9/goBzg4F9bHlsU1hMQUUzMTEyNjY2ODg6PD9CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJLaYSIe4l5e3F8j4x7fImGfpeHdqGZiIePkpSljaypSIetsK+KgICTioKLgoSRqYeAmJiKnHNsfIGGh32OaGdneH5uhYaBhXGEhkdrgHdxeXZobWtfd32DiH+IhYx6lZ6ciouJkX97dYt2fHdtb3d+fnJxcGpbXFxbY2JYZ2VcVVBRWFpRRExMR09JREZDQ0FAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY3NTY3Njg7REZMTU1MQzcrIiYnKykrKysvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWHkY+WmJKXoZ2soaa4r7O9tJeNkouYi310cH+Kk39+jYOUlX2Gf4eliImBg4iGeYmLgHWGeV9jV0xDNjAuLzIzMTIzNjY4Oj0/P0JFR0hKTE5RVFRVVFRWVVNRT0dDPzgwLCOHWz4/OTQuXZZwc6NVRklLTU5QV2BZcFpcX2qNk4eVgISChZGTfoWJkYGaloKgoZiVm5qlrZOZu7Gnu8fDp4qMoaWOk4mBkHxyhJ6fkZ1+doWFi4+HkGlob4OAdIyGhItxhoJ3h397doV9bnZ1Z4GVj4aJiIiJiKKro5aJjpiAe4KJenpvZ2t4fXh8cWljXVpZXWlcYWZfWk9MTlhTUUlRS0ROR0NLRENBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudnBneIN7gIyAgZCPi5uapJyhrKarr7CXkpGEoZSEeHeAjZR9f5KGk5Z+ioGSnI6EgYKMi4KKjoSAi4BtcGpeQ0E0LS0vLy8vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTVFRSUE9IREI8ODcvOUM+PDw2My5sk5dNUEhJS0tLTlZgY39nZ251nZuPmpOTi42OmoiTj52LoKGSo6mlo6yTqLaiqMHDrsiveLqUmnyMoZ6YhJOFgo+hn5OZkoSKhY+YkZZscHWJi4GVjI2Pdo+EcWyFgYqWkoOFiHKJoZeHk4mPj5eltqmbjZWig4eThH5/a2prfX5+f3FfW2JeWWZqXGxrX1hLSE9TUU5NTEZJUURETkZCQ0VHQj45OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCDcHWHcXaRhn6XlpqUn5+bp6CqlpOYnmhmpJp+hZOSeoGSiZKSfYuFmZKRg4CBi42JhpGHhIiFeHh/aE5SPi8vLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVJTUU5QSUVEPjs8OkNGPz48ODUyPD9SNUhISExMTU5SXm+KfHOCfaCdm6emopmhl6KVnJ+onqmrn6isqaq1l6u/q7bIybfJ0c++m6Bwaaupn4STkoWcoZqamqeRkYiVopqad3p+lJeRoZKWl4GUnnt2lZKrs4mNl6B9lZ6cjpOWmqSjp7awnZKaqIiXkI6BiGxzc3x9em5mXltfXmFnZGBnZ1xSRUtLUU9JSk1GRk1DSE1GRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1NDY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjNBQGliXlBxdWBufWF3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYiYjXmCjYuOjXyKhpCQj4KDgImMiYWThYOGiYGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1GSEBBQDg2NjI8OTtGSEdJSU1PUVlthpB3lYujp6q1vbilrqysqKm1rLG3srKtu7GzvpyzxKy7ycu4xL+3paOwsqytqqOLlpiFpqagopiCppmNoqqopIeFk6OgoKqgpKmOnLGLlaOnt7ucoaOwk6Odo56RpKKrsK2ztaKVpqqJmoqTipV6e36DfGVeZlpjYF1iY15mZ19bT0RKSFRPRklMRktHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjU0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNYanBYeoV2gZSFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyPi4p7iIOHkY+DhYGMhoWIkoaChImGh4eHcW5hQEU2NDwzLzExMC0sKy0xLy00P0RBTlZRUlRVVVdVTVxRR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcfEq7PFtq20wLO4vra/tMG2u7ukuMaptsnHtr65tKijtK2wsZuZkpqfiaevqqSVd5+kl6GrsbOYlqmtqK61u7K6rK+1orGssrW8uLSutaCoqKOom6mwrbO6uLionLipjaWPkpOgh3mBgXNYX2JVZGBgYl9fZmBbVUpERUxWUUlKS0VKSEVBQEBLREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFxaUWJkV3p1cYGVfYSGk3aGfoCNe7+7o7yCtJSTjpuPhIiPk4qJeoeBjJONh4WBjoCBio+GgIaIhYqHkXp5bl1XQEVOPDY6NDZBQjc2NC8vNkNIQ1FcT1FVV1VdV1BfVUlLSkFAP0dLRkZEOz5AN0Q3P0JKSkVHV1RQXo+krqSytMO2uMHMyra7xL2ztMG3uMK1v7C4dLG0prrFpLDGubGzsrSopLa2qrGgopabopKlsa2lraynpJigrLO6oqiyubW7vsy/xcW9vbPCt7q3v7i6uLqtrbGmsaquvrC9vMPDrJm7qJWuj5iZq4l+gHpoVWBfVmhjaWRWW2NZVlRJSEdMUUdESUpBSUQ+P0JCS0BATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1RZVlp3anB/j4SBjoVve3J4iGK5oZmjiZWUlpOUlI6Ql5KHh3uHgo6WioGEgYp7fIuIhnyKgoGLhJV9eHp1Zk9cZEdFTDpRZGBbXlNGPztIUERaY1FRWVlaZ1pUYGFNU09FQT9JSkhFRkFAQz1FNkI/SEdLTVNaVF6Ur7i1u7nJwLu9ys28vcG8uLa8vLe+tbqzxmF1sqWxmp6rvqqlqKuqpKKytaCrqJ6Vlp6Yn66lp6eln6SToqews6iysry2wb3TycnTxsLFzMLKxMC+vsC8vLi0sLm3t8O6xr7EybCeuquirI+lqbeJgHxvXV9fXVVfXWhlU1lhVlJWSUVGTktBPkhFPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUVFJQT1FSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBKTVBSTFFdaG1scY+NhpBzbHJydIjVwLWaoI2VmZmRjpeSlpaOhoh9h4ONlot/g4CDeXuLhId7i3mBioKXf3R9emtlcHZZXVxQZWViYGVkXVtYWFxNZG1VUm1uX29fWGdlVVlVS0RCS0tIRkhISEhCSTlEQEhLVFRWXVpck7nAub64xsG7ucrLu7e6trm5tLi1ta62t5lkdamerXBeoq2cmKGim6Seq6WUn5+QlI6WmJeonqafn5qZg6SdrKSqsa23sLy41NDO1s/JzNLMz87Kx8C/wsq+wb3CwMXExsrAyc+0pLyxtbCcrLm9mn12aVteWlhbXlhiYlFbYFNRS0NCRkdFPEBGP0JJQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjsuJioqKC0uMCxATSsvNTRtiUkwSIl0Pz5CREBDREdLT0RSXFppYG+XkpGUbmxvdHWHs6yhoZ+LmZyZjY2VkZuShYqKf4iHjJCMiXyBhHN7ioOFe4p0gYqHlX90e3lsbXV8aXNlaWxoZmppaWBmaWltWm10l62kvYiHZ1tvaF5aWVRIS09QSktRTFRRSExBSkdLUF9fYmdqYpe3x7C6tLu+trHFx7awubGxu62zsairuK2NtqienKeaTpqejI+glpGnmKWVipOTiZGJj5GSnZuhmJuVloeemaaarLCor6ezs9PU1NbRy8/T1M7Tz8zGw8rQv8rJy8nSyM3Ow9DSuLDEvcS6pre7xKJ/bGFaW1xXXlZYZFlPXFdOUUNCSUVDSTxBRD5CSD9AQjg7RD5AST01NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ4PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZldzkJGZg2hyb3l5g6GqnqaXjJubmIuOlZGajn2Ji4WOioqLkIh8hIJwf4eBhnuHcoOSi49+cXl1bHB4f3J7bnhzbGmAcG1jaW5weWl3fX7Lv8Pfp25jeG9kW2FgS1BSVU5ZX1BeXU5RTlRRVVRcbm53g3KWrristaiwtqutvcGyq7WmpbmorK+hrLSkj7Gum5iYjJGUkYSPm4GNp5GciYOLhIqJhIuDlJWXl5SbkJyYmZmenquspKeirKzO0tXRzczS09PQ1NHOyMPU0cjO0tPT183S0cXS1sbBz8jIw6m/uNCcd2xjW2BbVV5RXFpPT1RQTkg+QUdCQ0Y9QUI/RkU+QD86PT09PEpCNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYeGi3dsd3B9foCgnp6hjI2Zk5SLjJOPloV5hZCQjouKiJGHf4J7cn6Agod6hXaFk5GJgG93c2xzfXx3fHOCeHFrgHJyaXByenlze77Lmn+NsoR2coV3aWFqXUNaWltXZmRYZWtUWF1dYGNeY3h7f4uBmaqkpKKgoammqrG5q6a0o6KuoqSuoqexn4mmm5WTkYqSj4iClIlrlaKNmYSBhn6Rg4OTl6yLlY6Vmo6GkpGdl6ewoqChpaSoyM3Px8LL0NPR1NLO083G1tPN1NjW1tjV19XK1NrNytjW0cutxMPMiXBtYF5dVlJXUlpPSkdKSUpAOzo7RUJEPUNEPkhDP0NCOzw5PDpHQzQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX5pc3lygoqAnZWelIWLlomPiomOiI+AeISUmYuNiIiLiX6DeHN8fYSHd4B7h5GXgYRveHFtdX92eH10hnx5bId2dW59doV2eXudtYw8QYvGpX6NfWplV0lDZWNmY2hqZG95W19maGtuaW6BhImRjJ6foJ6Rl5mgo6SmsqSls6CipZ+hqaGisZyHn5KSk5GLjouHhI+EfpycjI2ChIV6lH+DqpajjJKLmJOLfZeKmpGqs5ibnKecpr3Dxbm2xc3R0NLQy9LLydTP0dXa19fY1NnYzdjbzsna2tLWv8zNtHV0bGJbV1FTUFhVRUZKSUVFPTo3OkBCQzpIRUBFREJEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8yKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYnFxdIaNfZeRnox+h5KDiYaFioKIfXiFl5eJj4OHhod6hHlxe3uFhnV6ho6OnXqNcH1wcHqAcnuBcoSHgG6OenV3fX2CdX98h4mwdFmqwreNkoJxbmM9XmhycHFwbnh3gmVpb3J2eHJ7jIePk5KblqCWiIyTnJ+bn6ugoaycopqaoKafn6yZjJqNkZOOhX2IiIOFi46gmZOIg4d+bJl5hJmHiJOMjpWMhnubiJOPrquUlZefmKautbyprb3Gy8jJy8vPycTSytTX2NfY19Tb19PZ29bP29rS1snVzJN1eGZlWFdOUVJcR0JFSUk+QT49ODo+QDw+SD1AQkFBRUE+Pzo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJmbHaAiHGRkJuAeYCOfoOBgoV/hHx9hJiOh4t+hoeBd4N5bnt7h4J0epKejqF2j3aDdHWBfnSAhG+BkIJvkoV1fIGFenaHfIm4xqXDyriClpyPeHBmTmVjgnuBd4aikIt5end7hIB8hHVtlJaVlpCYkYOJj5eal5emnZiglp+TkpejnpqrlpGRi46Tg4yFiYmBhpCRnpyZiYWLgYaXe4iJn5eQiY6Ki4J8oYmQi7yhmJOXmpyopqWtnqe1vsC/uMbJzc7FzcrR1tXU2dXX29TX2drb19va2djO28aDdnZkZmFdUlVVVE1LRE1EOz08PDk6PD85PUE3Pj9APT8+PTk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozk6N0hQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZmFdXGl0enlsiY2Sd3Z6inx+gH+AfoV7foKRioWGeoWIfHZ+dW19fYd+dH+SnpGfg5J8h354j355i4pvg5uBdJmGfYKKhXx+kXuQqY+Qw6C9jJuknH6KhH2Jc4yLf3OmmpyYlIV7j5GJhGlHcaGknoyMkZKFiIuQkpWPnZuTlJGXjYyVn52UoZWSjo6RjH+Qj46LhImTlpqfn4mMlJKdkYOMf6aZiIWOg4aEgKWGiou4mJ2RlZahpqCdnZ2jrra6tKvAxsrQyMfNz9PS0tjS1dfA19jZ29ja2tnZ19u2dnV0Z2ZiVF1ZUk9PSENMQz09Pjk5Ozo5OTw9NkA+Pz09OTo6OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV088TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT88RFJTUlhfVlhmbW1taYGOinFzeIp7e4B8f3yIe318i4eDfnWEhnpzenNtgX6FfneGm6GbnpSSgIyIf5iHgJySboiphXugjHyRjoOJhJx+m5GKjaOin5Gkr6CLkYuGi4GThldyrYufq5uQg5mckI+OW4OikYKNn5OUjIaIjJKSjJSVlZCMj4qIlpudj5WXkoyTlIaAi4mTjoqKnZeZo6KGk52WoIuKiY6dkIOIj4CDh4WlhYuQs5ickpSXoaCemZKbnaexuKykvcLHzcjGz8zQzM7Xz9HUrtbV2NrY2trX1tnanWx5cWNjWlpWUVVXQ0BJRD8/Pjo0OTo7Nzo7OjM8PD89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J4bGJ+kYNvbXeLeHp/e4F9h3x8d4aFgHNwhYJ7dXd2dIWDhX1/kqain6ail4qdkJSXi4qol3KKso2EqJKEmZSFmoyjlqCYk4mbnqKTqbCgkZWRjo6IloxvjbeEmsTIspyippycmJaRsZBkpM3HlY6Gh4mQko2Nk5WKhYqKhpaZm4+QlJOHlpiEgI+LmYiOkKqXl6SiiJmelpqJj4eYmIqFj42Bf4ePpYiNk6ial5SWmKGYn5mTnJqisrSlo7zBvsfGxcnIycLK08zN1KjS0dbW1tja1NPazn9ve2RgW1xbTUlTWUJBR0Q7Qj44Mzc8PDo4PjY0Ojo8OjcyPzo5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgkd2gY59fG1+iHh6fnuCgoN/d3aBg3xtbot/e314eHyFh4p+i6Kzp6Ors6KXp5+lpJaVrqKDkbiVkrOajKKhjKWbsKOknZiRp5aomayvpJiVlpWQi5ial6HAjqPJuKuco6atmJKbnbKdhYaoopyYhYmJjpWMi5OPiIGGh4mTmJWMi5STh5WZhoSRkJx1kZizlpeloYedmpOPi5CKl5uJi5aOhn2MmJ6JkJCcm5qTmJefk6CdlJ6boLGuoqS3vrTFx8S9w8PAxs3KydOmzszT0tHW2NPQ2LpvdnJZXlNeVE5ISU1FQkNENT46Nzc6Pzw8Nz00MjY2OTc3ND41OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER01aXFlKZmA7SISLenpuhYZ6fIR4gYaBfnB4fH59b3KNen6CfHiGi4mGhJKmu62osr2wpa2zs6ijobCsipq1naO4pZWtpZeprbinpKOfmqmYqqSusKqamZyUlZGXoJiau7uuyqFqt7irsJSZn6Osk5e+o16qsoOKio2Uh5B8jo59g4aOj5SViIiTloyQlo2LjZaYk52ZtJeWq52KnJSSjpGSjJmbipKekIuJlp+hjZSNmJqdkpyYnpShoJScnaWvqKGls7iswsjEtrq9vMXHx8LRoMbJzc3F19bRy9OfbXdlWVdQXFBORUM+PENBQjhAODg1P0c9PTY8MzUzNDU0NTRCNDk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEhiYGJwSkCLin6Ac4aHfYKIdYOKgn9ufXx9f3B3h3eOgod8jY+MhoyZqsLAr73Gu7O0wL20rauztoyos62tvaubu6Worbq4q6emoqKko6mvsrGrnZykmZuYl5+ipqaSpLqvqcC8ra6yuaWkqH6IhpytvbCCi4yLkIOOg5GPeoGIkI2NnImIj5eNi5WWlJGal52omrGakaycjpqPko6VkJCWmI+SoZGJlJukrJSWj5ScnZOhnZuYn6GUmp6npqSipLCzp8HGw6+wurfFxMO/zabHxMfEvdbQzcTKhXFwX1lXXFhMSkFLQUZHP0FAQzs6ND5BPT01PTY+MzQzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU83OUdEP0NGXGVGYGlnWl1ck4yMiXuHjIeDjHWHkYqBb357gn9xfoF7lXqSlJSYkJOWp7PGyb/CzMLDuce9u6+rubuYs7e6ssCupcGkq7C8vaquq6OjnqerrrSwqpygqpyhnJafsLWojKO6urbBvKypnbOlpKiUhY6pxMOkgouPh4iEhpWUjXmDjZGPkaGMjJSSjomXn5iTmZWYpqCvnYyrnI2Wj5KRlZWOkJWSj6GUhpefoLKelJmToKCYpJ+aoJuglJiepaSmpqSvrqbAxMOuqLe2ycO+ts+yxL/EvLPRysjCtHJ2alpVWWdQTEhCTEtMSkFBPkREPDVBRTs7Mz04QjMzMjI2M0EwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmVaTWVcZlRia5mNloqMiJOQhol5h5SQgXKAe41/eIeCgpB6jaGWqJqambq9x8jJwdLJysLNvcKzrby+qLvAvbvDt6zBqayzvL6qsKqkpaSsrrOttrWgn6+fpaKYo7O9qZuovcGktriwrJSyrKysl4eaqaalkYKMk6WWioF1ipJ5hY6SkJ6gk4+TjI+NlKOZlpyVlaOeqp+RpZqMj4+PlZaIfI+Wk5KjmpWfoZy1pZCelqWjoqWenaaYnpWXm6SjqaeisqyovMDDr6Wzt8y/ua/Es7u+wbiswsPCwJdqd19WVVlYSkpMSUZEREhDQ0FETDo0REk6OzQ8OEUuMTIzNTJCMjVTSE48SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5pSF9YYlpjY1aej5yOl46ekomKf4qgk4R4hX+Wf3+QiIqRgJahma6npJjCvcfDx8XTzc7Ny7zCt7C6vLS9y7zDwba3vK2zv7q9rq+ooKmotq2uqbK3m56to6ihnqu3uKqlsL/Fsr66tKirtrSurpeWpayon5GNkrLFp5aOfJKVfIeSmY+qmZiTk4+SlZOknZOdmZSho6KcmJ+Yi4yPj56IWpCWl5KXpJllmKOfsqWVoZarq6mnm5+ml5iWmJWhpKiln7arqrq7w7SltLXLwLiqtquyu7iuqLi6vbiAaGtYVVNTTUVJUk1LP0FIRUVISEg5NUVNOz44PUBKLjMyMDI1QzU1T1ZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz5AQkZCcEVqSVJlYUxGpZScl6KXqZaMkYOIppOIgoeCnISDlZCQlI+aop+vvq+hx7zExMfGzs7O0sq+u7axuru8vs+1w724ubezsbWzuLOrp5yrrLmqqaevr5ijr6WnpKW1wLGsrLS/w7rAurSoura5tK+Wpa2urqSLk5ShjXTCmn2XmYSOl5mMsZWbmpWSkpmZpaOVoJuXmqmdm6GgmYqNkJacYEqWnJqVmqWWVZewoK+cn6SUrq6rpZqgpZSTmJiNnKCnopq0qaqzu7u7qrGyx8C5pqyrrbKyo6GysrSkbWtjWldNT0pET09QUjtHS0lHSUNDPjpLVT9BOj1FTTA3NTM0OkI0NE1XTzxKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqWmaCiqLCZkZeHi6iWjoiThaCIhJ2Xj52hm6Oltcm1qca6wsPIysnIzM3Gv7uzrrm5wcHMtce6wbm1urCvr7O1p6SbqrS1qqmmrayapK6lpKisu7+orLa3v8G/vrm0s8Syub6to6+1rLmmiJuXppt2v5+EmZ2Ok5qajK6XoZycl5SboKGonqifmZqqmqGnnpiQjZGdg252kqKalZ2inZGusqOqlKiql6qto6OfpKiRkZmch5Sdop6Wsaepq7m2vbKyrr65tqCjp6ilppybrampi2BjX15PSktGR01KVkw9TUVOS0xCQ0Q8UVY9QUFCRE8xOD03Nz9CNzVVWE8/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLVJgTVVIfmVeSEWrlZuhn7uvmZWfjJOrnJGSk4mrjYahnoyjrZSjpLbGvrTAusLCx8nFws7Iwr65sq+5tcHCyrXFssG8tbqqqK2tsKOjmKq0u6appquqnamvp6Oqq728qK29tbi+x7y3trjBsr7BtKq1t6u+pZCjmJKioL2fiZqgmZeeno+3n6mcpaKbnKGaqKSzoJudppyoqp6YlY+Um4uXiYykopSdop2gta+lpJOvq5mqqp2do6OokJSUn4KPnp6clamkoaGztLq0rai1srOenKOlmpeVmKqhnnVdWl5cSUdFRk1RSU1FR0dCU0xKQkVHQVZTQ0g9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKRUBKSk5POUNANT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgWRUNDktMTlmXEZDQ51wYkdFp5ekn57DrZyXpZiaqpyWm5uPqpaVp6aVrayYoqu2xMK8vrfBwsDHxL/Nxru9ubKwubO/w8i1v7C8trm2pqSrrK2hoZqqq8WipKmrpp6sr6uiqam+uKetv7K4t8e2tbm4wLPAwri1s7SvvqOXo5eUnJSun5Cio6Wjo5+QvaSpnqisnZ2hm6WevaGZo5+iqayhnZeNlZ6TnoePhI2Tn6SgnrWspZyVsaeZrqadmamdn42YlJ6DjqCam5KlpJqYq7G1saqlqq6sm5igoJKPkJWonpRlX1dgXE5IR0pOTEhFRElBPlFJQTxHSUhcUk9LPUhPVTRCRjk+SEc1Q2FbS0JOUlVXVlFYVFJVSUA4UlFQTTpHQTRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE0NkA5Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5bVJGPEt4ZWFWS6Kao5yexayhnqyfnq6gk6OflqSgpqmsmLaxoqqztsXEvb+1v8K7yMK/yse1uLW0sbO0t8HFtr6xuLW5tJ+nrKqsnZ6epaTBpZ+qrqClqa2voqaovbWmsb25t7bEs7S4ur+0xMG5ua6ztbWjnaWVkpShrqCZop6oqKujmsKsqZ6srpubnpmmoL2hnaSYq6yspqKajZqfk56Jjld/lp+loaC4qqaTmLWjnrGgn5qulp2NmJOcgY6fl5WOoqSWkKatsqqpoqKlpZWVnZiLj5GSpJ6JX2JYYl9LSEpKTkZFQUdLPz1KQjk5SkpOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JHRTY9dWVcS02en6GZnsSopaK0op2zqJOrpaCjn6yprJ27sKistrHHxcHCssLDvcbEvcTJvK+wtq2wtK+/xLS5sbC5tKyZqLGpqpqdpaGnwq2brLGcqqOusamkqL22p7e7vq+3xK20s8PAtMe0u7istLatqqKmlpWVpKyin6Cbp6uwr6+7sqagqamZmZiToqO4oKGjkq+wrKWnn5KhnpWekJCNlZ6aop6ns6amjJizm6Ktmp2brJCdk5WSmX+RoZaPjZ+hlIumq6+kpqKcoJ6RkZqThYuRjZudf19kWmZkSkhMSlNCQ0BJSDs7Rj85OU9NVV5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDI1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0n6OgnKDDqaSqs6KktaqWs62noaSyrK6pu7KtsbW0xsDEw7XAxL7JxLW/yMK0q7WosLmsv8Szt66strmlmKqyq6qYn6aXrbu0m6iwm62grrSyp6u5s6i6tLmzucCqt7LEvrXHqL+vrra1qaesoZiXkqaloqKYmKWvuK6ytbagn6ikmpWVlKSgt6KlpZavsrKnqqainpqam5aYqJ+gmKGerrKipo2Xrpikq5aZnqOQmoySlpiFlZ6UjI+cnZSLqKmqoaehmJ6Vi46Zj4GFlIiTnndiZ1xqaU1PTk5UPkNBTkM7Okk/NzdST11fUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMS0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlvaFVDV0aMeWZDO6SjnaKmv6enr7GhqbarnrqxrKOrtLaxsLm3sLe4uMS9w8e9vcTCxsC4wMXAuqm2pKy7rcHCt7eprLG6opStsa2ylqSnkaq5qp+msZ2roLC0s6qptratva20s7m4rbmxw7u/v6bEq7G3r6mrq6efmJmroaKhkZiisa+zrLC5mpypoJqXk5inoLappqOisbG0rLOorJ+boKCbnqWcopedo7Owmp+Qk6Wan6iZlKKdlJeIk5aSlZack4iQmpmUjqmopp+jnJebkoWOmYt9i5WEjZlpZ2tgbG1XUFFbVUFCRVRAPDtJQTc6WFBkXlBXV0VZX15NTFJOXktKPlpjXk5IUE9cVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI2MS0tLiwxPSonKz1ccD0+MS4wZFpkQDE2NDdnWWBGKD84bH1nW1Y7iXtjQz2on52iqr2iqrCspLK4qqa2taygrbW9r7O4u7q+t7bAwr/IxLnFwsC/uMS9wbevtaert7K8vr60qK6xtp6Wq66orpemqI6nu5+lrLOfrKKxsLOsqra0tb6usLG1rLC0s8G7xresvbCxuKytqqOypp6lqp+kl5GaoLOqs6uqs5qdp5yalY6hpqS0rqihra6usai0rbKqpJyfqKSelaKZm6i1qZaZkpKdmZ2fnZCrnZaXhJSWip2YnJOKjZaXmpempaOfnZaVl5J/j5SFe42SgouVZGtxZ29xXkZZZlZEQk1YRFo5SEI2PlxRaFxPWV1HW15dT01SWGRKSkNcYl9QS01OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYFUxNTA9YFZeOClDM1lVXGdLNox6ZkxApJqhpa23pa2qpq+ut6qvtbunprG3xbextr3BwrW1usS+zMa5w8C5vrnDuMC5srSrqbq2urm+tKqtsLWYmKesqqybq6uPq76erK6yo6ugsa2zrq62srm4qq6vsai1r7W8vcqzqre1sbSvrqehtKCbqK2gppaWmpqyoq2gpq+XoaSampOOo6Wos6mhprOsq7alr7K1r6SZnaynmpifmpmrt6OXk5GOl5yhl5aUqp2akX+Sl4ydnJmWkIqUk56ZpaKioJiWkpOVeouPhXuMioKKkWptd211e2FFYGtZSUhaWj17SkZENkFiVGlbTVxhS1xdWlJSUmJgTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUX1RfLzUoQ19RXC4rQi9KR1BbRzNjWVRLRJmXobGpsqqtpqSvrrapt7W6pKy0t8m7tLu6v7+0s7fDwMzIvMO8tr2/v7e/vLG9rae6ube2wrarrLG3lJanrquoo7CqlK+7pK2xs6eoo7K0sbKxtbG4tKmvrLKnt6+3tMTGt6m2tqywramoo7agoKexoaSUnJmVsZ6nnKCqjqmjnpuWmKampbino7K1rKiyp66xtqylmaCsqJucnpyUqbiclI6OipibopePmKWgnJOCkJSPnJuXlpWIlpCYmqecpKCSlpGQlXaEj4d7hIGDi4psb3Z0e35cS2VtXEpOZFw/YntHSThHZ1dlXExeY01YWVdVV1RpXU9PSGBdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5HZjI3J0diTFYlLUIuPUVMUTwzcmtJQ0ORmqWvpa6vq6ilsbO0q7eyuKGrtbnJua3Bu8K4s7G1wsLOxcDBvbS9v7+6vryyxKepubC2tr+8rquzsZygp7GtpqavpZ2yta2rsbKsqai1u6y1s7WttK2qrKisqbmusrHIwLmlurCprKylqK6xpqWjr6SpnJ2cm6+ao6Ojo5Gtn6SgoKKrpqe5pKy1tqWrrKmtsLauop6jqaqboJubkqS0mY6JjYeQoaCUjJScn5KQg42Skpyal5WTh5eTlZmnm5+ejJKRjZB2fY2FfHt8homIcHJxfXx9XFNkbl5OWWdcRkSWW0c7Tm1YYltMYGJOVldWV1RYZ11RUkxjWVtUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8rMSgpKywtKiY1Ki8mMCkzODoxJiozQmM6NipIZUhKKzpIPjNCSFMsPpBrO0dIj5yqq6KqsaWppbO1srW2srKhq669zLqtwLrHsbSttMLD0sXGvsCyvsDCu763u8SnrLessre8wK+rsaygo6etqqiksKOqsqqwrLCvsK6rs7ynt7GyqbOqq6Wlo626raqyw7q2rbupqaesqaiypqqko66qqKKenKOtlaWemJ6ZrJ2ip6miraakrau4srKhqqKgrK+xrJ6gp6epmaOZmY+gppeGhI6Ki56gjoqMlZqOjYSFj5SfnJSXlIaWlJOXpJycnIqSkI2Jf36HhXx2foWEhXJxcIh1a19ZYG5iUXNxXEs7hHxGP1d0WGFaTmRbTlZWVVdRXGFeU09OZ1hXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyoyNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTtcSjAuSmdERjg7QjA1RUtYMUCVWT1MRZWYraiiq7Ocqqqwt624tq+rpqurvcm8sL22wq+xrLPEw87Pw76/tMDCw7q/s8jDq663rbK4vr6yra2rpKeqsKinqLGltK6rsa+tsrG0rLS8pLizrayvqKufo56wt6uqrbu3pbe2pKmnq6uqrqGpp6axsqSnpaGhrJeqoZWboKaepaKrpK2jn6exuK6uo6ajm6qrrqmdoqWkpJifm5aPmJySgYKPiIWcn4uKjouYjY6JgouXopuRkJqLk5KRk6OZm5qKjouLfYaBgYN6c3+CgHxydYukh3hrXmBuZldlh2NOP2eTTEVieVdiWVJlVE1WVVZUT1xdYVVLTmhWVldJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqMzk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2VlouMEpnQUE8PEIrOkpPXjREhj1HRkSXk7Gmo6yxmKuqrbastrKspqyqqbzAwLe4sru1prKvxMnL0b/Au7m/vsG5wbnAxK2xtbGzusC+srCurKqrqLaqpq6vqrmwqLKyr7Ott6q3t6e0t6uspamqnKSetLOpqKS0taC3rqCqqKqoq6egq6ypubWpqqmpoqqgrZyTqqGdoKWipqOqn52ntK+opqqjo5ilp6eqnKKko6CZmKCRjo+YjX6HjIeDnZ2Gg4qKjo2Oi4KFlKKajYyZkJKRj5Ofl5mWjIqDf3SGgX9/eHSCfnl2foCHnY9vcmdncHdcYXOIa09emVZIbXhVZFZRY09NVlRVUE9YW2JVSE9pVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzo3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSYvMlFiMDI/Zj1OWD5DLD5MVF8vSmk1T0Q8lo6xoqarr5qspa2wtLWwrKawqqi6vrvAsK65rqG2sMjHyNHAvr27u8G9usLAvr+usrKxtby7wrGxs6uzqaS1qKWts7O5saOuuLKwsrururCqrrarqp+qrJ+joLatqaGfsLOitaqeqKepo6qhoqytqL2vrK6toqiooKyZkLChmKKgp6eeqJuZqrGqo6CuoqGUo6OjqJiaqKWYl5iej4qHlYh9jYaEhKOWhIGBi4aNi5CDg5OfloiRnJCTkI2RnJSXj4qGhnd0gX98dXh5f3lzc3lnf4akdmlfZWuAdGeIjH1TWG9eSnhzU2RUUV5NTVJaZk5MVllkWEdSaFJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS01KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMZzo0OF89YWQ/RjFDUFtbKkhNOVVANJGQs6Glp6ykp6Stp7WzsqulsaequL7AvK+nuaqmr7HJx8jRw7y/vri9vrzIusG4sK+0sbq7uMCysrqsuKyitKenrLK2ubOoqL22rra+sL2nrqy1rK2cqa+joKWtq6icnquzpbSom6qnqaOpnqOpqKm9rLSwrp2qpKGunJuzo5aknKWln6Wcm6mrpp+cq6Kck5yipZ6Yl6ipkpialJCKgo+Ffo+DgIidj4V+fYuHkI2Pg3+TmpOFk6KMlJGLkZuSlYeJfn9ye3p+fGh4fHl0b3B7Z4R4hIlkYWdhcoR6bWd4XV5UP1d7bVRiUFFYS0xOcnVdSFpbZ1lFVWVQRD5KT0RDQTlIR0tTP2piSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMScvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZjQko3R1NgVSo9OURXPSqQlbKaoKCqpqWhq6W4s7OmqbGmrLjBvbWvoritqKiwwsnJzMG2vcC0t7+6yLXCtbOytbK8t7m9ta25tb+toLOnq6uwtbi1rJ++vaqzwbS8oa+ztaqsn62wo5ymqaqknpulsaewoJ+rqaehqZykqKGtvKiusa6hq6Okr5+fraaXn5uho5yfnJqkq6Ocm6WllpeVoKOXm5elrIyekZGRi4KKgICOgHuZlI2Ie32Lho+Ni4mEkpiQhpSjiZKSh5CakJOBiX15a352eXhjfHpwb29xdmeAc2qEaGVnX2xzjWxhaW9gbz1aeWtVXk9QUUpJTVRaV01dXmxXRFdfT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNjg7MigwOS8sNC8uPS0qSz4pHTQ5JicuMzQuMCsvNCYsOiQ0MUFoWTEzUz5lX0RMNktWZE8qOzFOVz0jlJmtmqGYqKWjn6ikuLCvpK+wqau4wbmzrZ+5r6uotLrIy8i/tsK+r7S9t8S2w7KuubKzv7S6vbeoubi9qqO0qKmqsa66saqcvL2lsMG1tqKvtrWnpqews5+epKaooqWZn6yoqZ6gq66moKaYo6igsbmfo7GvoayhraScp6apmpqbn6SVnZ2bnqqnl5yhqpOZlJmfk5mWoamRmomOkIZ8h36CjX18oIyNiHiCi4SJi4uFh5Oaj4mVnoiRlYKMl42RfYV8c3B9cXR0YHp4aG1vcG5ofXFje21pZWJdZYV+X1pzanFKSX9pWFpOUExKSFBSUUlPXF9uU0RYWlJoT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLjo7ODMmMjwwLDg1QiopLUIqLDQ7Tk5AOzczLS4rLTcqKjwlNTM8ZmQyNE0/ZV1GTz1RWmdIKj4vV1U1KJeep5qdl62hoaGkoriqsaW0tKmoucS1s62ft62urbC0xsjAtr7BubC0vLa+u76vq72ws76wvMO5qLu6t6entaioq7Gts7GonL+4pq28t7KfsbewqKWnr7GboaSgpaWgl5uwp6Gfo6ivoZ+hlKSkorewoaaxq5+so6+YnKqkqZ+Xmp6lk5udm56nq5qcnqaXlpiWno6Tl6KoopCJi4+GeoR+hIp6jpaJjYZ4gYeDh4uNhY2TmI2PlpmKj5d+hpiMj3qBenByd29vdF95d2Rra2toZ4JtZXJra2RoWGFzf15abHVpWUV9XVtYT09LSEhSVUcyOl5ebFBEV1VZZU1ISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRIQmdbSFRDVF1oRS47MV5RLDKWpKOYlp2qnqaho6G4qa6hu7ilrL3Es7CuorWvra2vtMTEvbO+urews7m4uri6rq2/s7S4r7/Bt6u9urSlorOrqKqzrK6yo53Dt6apt7ern7O7qqemqK+rmaKnnKSnlJihs6aanqWpqZyhoJSln6S5qaSnraaepaGok5+poaGhmZudoZKbnZeho6ycnJqilpOVlpuOk5Ojp6SQiIqOhnmEfIWGfZyNiYqGeICDh4iHkYWVk5KMkZWUjo6Ue4KXj4t3f3xsdXJtbHNieXRoZmlnZW2EZ2doZGZoaV5lYmlmWWV6YmBQc1RbW1NLSUdJT1NAIStpXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTctMTE5NSwmLjUtODA1NzZgdEIzQ0RoW0tXR1VgaEIzNzdhTCcyn6Slk4+lp5yenp6kta2nqrq3p6zDwLevrKK1rqeur7fBwL2xwbewrrK2tbm4tayqvLSvsrG9wLeuvLyxpJ+2rKamtaqrr6Ggxayqp7G1rKy0up6oqauxpZidqp6opZKapq6jmZ6kqqGboZyYoJ2ntqavqq6hoZ6doZWgpp+ioJmcmpyTmp6Vpp+uo5iXn5aVjpWYjI+YmqigkIeKioh4hXeCgoKch4qCiHt/hIiGhJCElpWPj5CRkJGMk3uDlY6Gc399Z3lwa2tsZ3Vza2FnZGJzf2FkZWZlaWliZm9aXlhdbGNhTWdXW2BWSUdIS01SWD85YGxpR0JVU1xbSUhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKywvQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNAYkYlNZ2koZKMrqCamaCXpbSyo7K+t6Gxxru6sLCjtqyrrqm5vr27rcCyr6+utq6zubOnq7mxr66ztru2r7m+rKaetaugobGlq7CgpsWhs6aws7C3rbWerK6srqKZnaeqpp+VnKemoJmlo6mcmp+clZ2erbCmuaeuoqGamp6Zn6OapZ2Xn5iclZqhk6mXraiblJ6dlI2Vmo6VlJinp42NiomOe4F0goKLmIWGfImIhISKjIiShZOckpGQkJGXj5B/gY2Ng3CCf2d5bmhramdxcmtbaGNhcn9gZGdrbmtmamZkbFxtbXZxYVNiaGNlWklHTE1PWVFQVmFlgVRAVlJaVEZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuNDw7SzYvLissLTI0OjUjMyopNi41NTQ2NVp8XTE6S2pbTVtLWGRjQEExSGJCJzSUo5yPj7Gdm5Shm6mzsJ+5wLahtMK7vbmxprawqa6luLq4uKy7sK2rq7eqtbmtpbK1sa+psba2sbO2u6epoLapnZ+qo6qunavEma+msLG3taysnrGtr6qim52krKmclZynpJ6ZqqOllZqgnZKco6uqqbqep6Sgl5qanqGPa6OWmZ1xg5ecpYF2kqyonpWXopKKmJmAl4qfj3iFk42DbWl+d4RybIaKhn2EioZvXWRgZ4SXhmuLkJSSdXiLhH+DkIBniIBodmlmWF1pdG5OUGpjZnGCZl5kZm9raV1cXomQhYhoT0tDOEVUZ11KSFBQVVZMSFNhcHRlRltRVVBGR0ZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNU9rW05cS1tmYj5HMU5hPCsvjqSaiJWxm52ToJyrrqujvcWvqbfCuL68rae2saarpLi0s7Owua6qp6y0pbG1oqe4trWop622s660rrSiqZ+0q56jpZ2nqJuwv5Wop7G0ua2upKitqqumoZ+coaionJehpqacnKeonZOeoJmRn6iqo7Svo6KjnJaYmZejiKGPkpqIoYiVn6J/pYCorZ+UlJ6UiYRyeIyOg4igdYiNaZeJZn5zeaBvh4eDfox8f6Ggn5l/e4eedIiOdpuKbIeCg25pZWR7bXJiVIZtY21pmHFYaXBuhlddaVtralqIcG15codoh4RZXkZNPkZeTUVSVlZRUFJXVGdeTFpMUlJQRUZHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STovMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN0MTVSa1tOXExbZ189SzFUXjcvKI2nmISdrJ2ZmZ2fq6qoqr/Dr7K6vLjBv6qkt7GqrKa0ta6vs7arqaWxraW2s5ustba0pqeos7Gtsqiunquhs6mgpKWboqWesbiVpqent76mrKepqqunpqKgmaGopJqZp6OlmZylqpaTo5yVlKSmpqG2pKOgpJiVlJiUnIiukJiViqqMmKOdhrGBpa6elZugl3qC1Kh/h5TAm8Z4d7Glt5ZkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyXsauxeWhsWLGub2VpvJK8bmh6bXCP2H5Ta2K2sn6AcZR1mqGqkFZOWGFPVk5GVVxYUVBSi1xXW1BAXERQTkNGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzExVGtcT1tNXmdcPkwxWls0MSGPp5SBp6qfl52epa2yqbHCvbK1wLW4v8KrprStramosLWqsLa0qKimtaWoua+csrK2qqWkp7KvrrGmq56npLKkoqGgl5yioLKvlp+kobW6oqqooKytpKKdm5qjqqCYm6mhn5ieqKiRnKeblJ6ip6OhsKOen6OWl5OYkpmFr2tqi46qf2iFloetZnGfnpabqJdxrqGkfne6fGyhj3axX2q0W6WAZZyQYGaBemZ/aXhqqWW+cmemjHaxanyxeHWRlGNtbaduXISgRWlnh5ZFdZxgfWZ7o6aCWV+Lq2h/kXh6aqg4Sq9bWFRtY1pMT1hfXFdWO06IUFdWL0lTU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLy41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV5YMzEbkqKVg62npZ+jpauyuK20vb6wt8WyuLvDp6mwrLCpqrGvpLG6sKWlr7OjqrmpnrOysKOloaqtsKyvpqifo6KxnKOdmZaZnZ6wqZicoqC1s6Gqm6GsrJ+empego6qdmZ6loZ2aoaikkJ2jm5ihoKyfpaagmqChlpWRl5GahrWbtXmGqpq2mXeHs5u3f5SXmKyXf2uBpnqBhYeRlJJ3q2dqsVuse46HlHSIcI6GgH+IkJd4g4KKl4yDoI+FsHZ3n3Fra218i0+lWEhjY5l+Y2ilX3lxdVKSh15QqW5jcXyGgGGdL1KibltUa2dgTEtcZFhcWkI+sHdXWEEjTWlGQkRBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJBQUQ8RkQ7MDIwMTtGLTAuODQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SjlhVDUwHJeglImzpqahrqmos6yqu7bCsLzDrbm3wqutra+vp6+zqqKvvKuiqLWto6y2paWys6ijop2nqrOpsKimnqCgsJagmpaWl5ugsKObmqSota+hqI+pp6qbnZaYoKapmp+do6CcoKOlpJabnpianqOrm6WanJqioJaTkZOTnYTVk5m5cbHCf8aHfdaUnLt9nJeoko+djaR7jYaigaWCeqx5j51Wr3uJfp9quVq5d4WEfaaClHyZeqp5jp2Qe7FtjoR0kLuGb5VQr6fFilGgemNgqmJzcodsl4dfUrW0yIV/iXxjpDNCnXVcUGpoZFBAWGZZZGFKSE1rSltTT1lmWkNDP0U/MDw8NTk8NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbSltQX2ZUN0g6YVA3MiWco5OZsaippbOqpbSnpLy3wbC6wLK3tb20tqiysaSys6agr7apm6i6rqOwsqGytLGhpJ6eqKmxqbSppZyenqyXmZmYmJaZoqyem5eprrGpo56OrKKnlp2YnKGnopiioaKhm6KjqJyfoZ6VmZunoZymlJubn6CYkJKVkJ2Ism5otXGriHCOp3O0dXS2e5yZpo6QnY2jfo+eo36wdYOR0tJ1XK58hX+kbpuqpmqGhX2tfZiZkHuxc5Odj3mzZZZ0hZ5un2aUUsmLWsJcn3liX61fdnOGYpeIXlnKnW/AgHRNS7VTVcZkVVFqY2VYQU9qX2xpUFVGSTk9V1JbVllIQj9KPDI/OzU9PDU2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEFOVF9lUDVHPWFNNjIuo56Rpa+tpam6rKa1pae2u7yyu7+4t7W8vLSmtbWjsrKjoKywpZinuq6ksrGdtLiqoKWdoaqlsqisqqWanZupn5aVmZmTlKSqoZiTp6uxpqGWkqyfpZKUoZylp6CVm6anopujoK6aoZ6ekJaco5+cpZSdlZminpWZlpKbhax8eKh2o4+Lh6lwrouEqISamqOLk5qLon2Sl4euhH+Cs1xyslOvfYKCo35x1313hH6PnYaZmnevhoqRnIh3tGGaZZqCgZVskluwV0uadZh5ZmCtXnZ3h2eYiGpdr3eVn494bDV5yK6zX0NUb15nYEVQbF9wbVZVTS5lY2hSWVA7QURATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0JgSTo3N6CdlJ+3sZmzwayosqeqsrq4tLm+ubizt762prm1obWtoKCprKCVp7asqLGxq620pJupoKCoorWnpqqkmZ6VpaKUlJyZkpWkp5uUkKetsKWglJipn6KPkaKaqaahlZqmqZ6dpJ+tnaGdoI6Vn5yfoJiYnJaXoaCUmJGmnYepfn+meaGPkISqcK2NgqeGl6GiipiXiKOBkIaUqnp/i515cLFaqIOCiKB4dNh/dod0p4GOm42SpHyVkJ+Ee7JenGSgfYKVbpNcq1xbk3+Rf2hnqmNye4BqmIZxXqtaiaCPa25lT0pDoVxaTXRdYmZNWmFfcnRfSlU2SpqRWEhFPUdFQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPE9lZEEmVWZbPzFUX2JMN0ZIX0MxPTeinZmYvq2Ys8Kuq62oprSwuLG1v7m6s7K5vKq7tqGypZ+mp6eflKqxqbCqtq2qr6GYoqCmpKS6o6OsoZebkaOglZWempSYoaGQjoypsLCmnZaap6afjZKkmKisqJWYqaifn6CkrqOhnqGOlaGZn6CSnJeclZ2hlZaPq5uPrm5ytHSpjHeLpnS0enW0gpSmpJSdjYmkh451uG6Le4uia2u2WqGGZZeXaKCip22UcrRzk5l/s2qFkoitanW0YZ1mom6GkmuXXK1gTqF8h5FSc6NseX9+bpiGcFyvVjycd2ZUb24uW6dPYlJrZWJsWmJcYHB8Y1NaUT4/bG8yQkJAPk06ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKywzMjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUE4pZqbnLqjnLG/rq2rq6e3qbivtcG1vbKxu7irwreqrKGdp6SinZKrq6e2o7Oorqqhl52ooKWruJ2jrZyWmZClo5aOnaCbmJ6gkZOVq7awppmTm6ypl4yUppqlraORl6uypKCeqKywmaGjkJmil6CblpuXoZOcqZ2UkKqZh9SUmrt1scSAxId+1pecuHmKkpmOmIqMp4d5orZ1fXd2woKasmGDunnAfHW4YrWBjIepfZaCrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiBim2aiHFtjaR0vV13fVthebxqWlZbaXleaWFkZmJteW9YW1lDQUBxP0NHKzRIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw7OjA4TFhhRidUY1g8L1ReYEs1PExcLTZAOaean6G7o5ixw6+tqaqssai5r7fFsbuzr7ywrsGyraajn6SinJyRqqWqsqS1p62kn5aaq5mnrbido66ZlaGQpqCTjp2jnpifmpGWk6+5sKuVl6Onp5SQlqWdpK2fkaCoq5+bn6mksp6jpY6nopWimpyXlaSZkLCgkpWqn4WQmbaAkpKNuJZ4g5ObtndubG90b3mPhI6Jcp7Bu7yZeoGyqHCAdJG5g3yGhoqHjXuKho2XfaS7ub2cdXmzo3R2l3V0sHWYnmaGaY22dHJxd7aMXn95fYlng3lteWKLrHB1hX9YW6dpRGRZVGZfY11jUWdmcW11Qk1PTEQ7Wkw/SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JXOCpPXV09KztWVic9OjymnaGhv6eWs8Kzq6qorKuqu6+xxq+1tLC4p7W5rqukoqefoJ2ZlKykrqqmtqion5yWoaSerKW+p6Gql5WckaKbkpCiqKKTnpeSmJSytbasmJ6jpKKLk5KmnKarnZappaacmaCop6ejqaGSrJ6Xop6XlpidnpCwqZScp6KPa39qnKl5iXR/m492e2aHe76/wLpvkoNxlIVfcmpaXZqJYWSHjpVrYH+UY22cdmKUa4CalZRlXmBjcZqJaHKMfIaUZmp+cXR5fn1iW3h0gWhQXG6DfHuKalhseYFySUpvhXBOc01EVlxmYExaV2ZjX09abXZqclJPREVNPEhJPEw+MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNUNGVUVKT0hGUElJSDs4PTUxOi4xOzouLy03Nj01JiIvKjIsJTs4LTdJUl9JJ1NfVjQpUF5MKDM+XE8nPzI+qJ+oocKkmrS5tqOspq6nqLWyrMissLSttqS+sbOnoaSqnaOcmpqsp66kpbWqpJuYlaKcp62pvqippZWUm5agmpOZpqmokZ+Qj5icsLK+rJunnaeiiZOSqZuopJycrJ+jmpqip6yin6qimq6blaagl5Wdn52YsaWZoqiZnZKfnaSmm6ikm52anJuRl4Jobn1yd5GXlJCEibSqjYWYlY6KjJiWh5SViYOTk5CJjZGUmZOZl5qfoZqblJ+bjYJ6pIVsaXuRfYB1iYuCcoJ4eXZ1ioB7iWpzgnSDdWR3fXZrcHpsX2Jbb2dNWFlmal9XWXB6b21mU09GUjlQWk5STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8Ojs0ODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlQxMFReOis9OF1LLDwtQLKgs6K/oqOxsbegqaazp6WwtarJq62yprWmwKi0oZ6lppyllpagq6eto6S3rKCZl5agmK2qpsGfrKSWkpyXn5iUlaKfnqOok5GZqKiyw6+Zq5yqno+Wlqmeq5yeoa2YoZucoaWvpqGkqJ6smZemnZmaoZ6enbChnaKnlpmUmpSho5ekoJmhjpeVi4uOkJiuj3yVm4KRgYmpqIaAl5aKhI6fiHuEkYaFmpGHhoqVjpuXjpCYnqOWmZKQnI1/jWWhs66EiYR3e5CKfnd5em9neZCBgIlrdYF5iHJpdH95dYOHgWp0Y3dlX2hkY2Rmalhre3Fqa1xTTFBEX1VGQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVFZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzM5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LECzoLmvv62rrbGyoKqmsq2irLOwxrCrraSzr7yktJygqKOhnpmXqKappqSms7WelZWempqwpq6+oayikZGempqUkpainJepnYWdqqyjtMezn6mkqpaWmJqnnqmcoKWrlJ+fnJ+qrqilo6uhrJufn6GYpJ6cn52wpJmfqZSZmZ6TppuZqp+cl2aEk31lf4+bkGN5jGxoanqQo6trZJmXfmeFimVlaWh6jaKOa2iMl5Gid2tqi5min5hzbG56hIyGeVhlXYWCXmyLioJ3XGdzd3eRgIeCb3iCeH9zbXmEc3eIiI6De2mFWF1qc2Rdc4hpa3xxbWNdUU5XSWRYQEozPUY3P0ZENzE8PT9BQzs7REdISElMTk9SUlRXW15gYWFgXV1dXV1fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtKLjZaTzYpRVkvRE8xWUI7Py49pZ+6vbqvrLOwq6Wora6wpq6usL2xqqilrrCwn62YoKSeopqap6ycrKOmqKmzrp6WpJCjsKa2uaWuo4+PmqKak5KboJmZppZ7payiqLTDt6Wip6+fnZWeo56jnaSqqJKfoJ2fqq+pqqOqnqebpp6noKyWoZylsaSXnayWop+blKaZoKyZn369hIlztHOFn4ataHe5xLhxkqGje6aYmHOqgnzLwMC6cYujh4OefZaYiJ7AvYKWnZ2NnMHBfIF6kYyawsB9a6Wyb42Bb8p6f5t3kYOOgHd5gYB5cXuAhnB4hYuTeWx1kWJlXndjX2WAYl50aG1kYlhLVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYV9eXl5eX19fXVxTTVBHVU5BQD89NjQ2ODI2NiomJSMpKiYuKyopMTAfOSojPklbTCojQ1AvI0ZbM1BZL1VBQjsvOJaiucO0sK+/qamUo6+psK+tprK2r6qmp6axq6CrmJujoJybqqeinauipailpbSknqOTpq6suLSnr6KSkZmdppORoKGYm6CeiKarpKutv7+xoamvqZaSn56imaOkqqOToKGdnKyuqKumo6Kln6SlnK2pkaSbqa6qnJ6rna6jl5iml6KkmJ1/zpR6e6WCepaXm1+tj12OqIChoX2nlZt0q4OAr15kjKp7qIeFoHSXk4izY4KrhqCNjbNqhK90fJaHuGGCrlmjzW6Qdnvbe3+ZcX6IknV/ZXuIdnZsfodufYWQkX1rgIxfcGpvZmBfeGRbcWhqY2ZgUlRTV15KT0M1QUhFRDg+NTtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVtXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDpMLSFQQEY0LjGswcC/tLSwt5iekaOqqa21rKayrayspKymsKqhp5yappicoq+foZ+op6OmoZ+wrJuelqaurbCrqKyglJKbn6WTkJ+ll52oo56to6qwqL/Fs6ipsa6Wk56copehqqqflaGenJutrqapqJumpqOgqpKss5aloqqqnqSnp6KyopObp5uhm5WUkZegcYaMmHaFqIdxsXydcax9oKCBpY+eeKuCfq1/nXKtf6yHhp92mJJ7fJd+qoihi5GLnH2reoiSj59/eq1WnMR7kHCTwX2BlW11cIxtZndlhm9hd25yboiKkI+DbI+OZG1zdW9gZm1kX29pam5mY1dTXGBaUlJDOUlJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLTwoPTEpM1ZARiEcRztDMS0rr9PGx7Kzn52jj6Oioq2vt6+psaeoqqiuq6unoqSdmqOWn6aroKKmoKioo5+esK2Ym5aop6+sqKepnpeVmqSikpShrZqdp6OvrKKstam5zLGtpq6rlpWcnaKZn66snZahmZ2dqbGnqaibqqijoaqbr7GiqKuuppqnq6urs6STmKSmm5WShaRqpHWKeql1e7JxgqWKmIxwiKCbh6RfYVKrhYCug5x1roKohoafepmXhntmgKOKpJiGgaN9qX+BlIauXnuoVZ2ikoF6o5+AfMSwxYxzr7SzuXJiqa/CdWiMi5eOgWyYkG5seHh3bmtmZGRxcWZ7aWNcVl9pWFhUTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgJychKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dbAoZmrqKGvop+wtbCwqa2jqKeqq6uopKagm6WfnaanpqSdrJqirKGjn6+jnpuTqqS1sK6gqZuclpWnpJGboqifoKacsKWiqLGstsextamsqZWRnZ2imaCltJ2aoZSbnqerqaKtmquooaGporOtoqqzsqKcq6mwsLillJekqJmdknyqbJ6EiHareXywboKki4mflpWeloHSuLS4yYGCsl9hlKmDpYiHoHqYlpp5qsl0mqOUp6iQkpqMfpqJmsbGd2WhgqVzgZ+Ogn2vXm+1Y7F1S6OGbadHg5Nkjo+ckXtvlZB9bnl0fHptW2VqcnFmgGpeYVhjbVxeWUlMTEpFREJBPUE8QT9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00TlRRHRw7PEYyLCSopMDGua2psq6tpaKds7msq6Gmm6imqqyppqCmpZiqo5+urJ2moa2an6mlnae1oKOYlKirtrKsm6acoJaQpq2Smpyno6Cqp66ho6epsLPBsbKpraiUiZidpZuipK+ml6GVl5ulpamZrpyrpqSeq6O2rKGxubCenLCotLS1ppaZqaSboY+CnU54moKAn3qEo3yCpISGpp+cn5SEuHx8ermCf8zGw7Z3m6KRi59+mZeXinafl4qkmKSnfq+Fm4OehKx9mZRhpWyjcI+FkIF9loRyrGCkc3GAmmG8fVJVdY6RopZ7fJGOh3J5coN9cFxsbndyaoBuWmNfaG5iZF1MTFFTQUhHRkg6Oks+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUV1lZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1RGPEUyOlBbVBwbNj9HLC0gjIeZqaykq7mrr6CboqyztaafoZWlr66uqKeepaWapKehsq6iqaezoJqppJSjtaOjlZehqbW5pJyjnaOTkKKymZ6bpqWhoq+tnKSoorWxwrCtqq2qkYeRnKedo6SdpZeemJiYpaOnmK2hrKKkl6+lu6yit7aunp62s7qztaman7GipZ+Hj9G1w7d6h46FkZOPgKZ4lKJ3jKGShaWDi3Krh4a0bnJpmaSdlYqffZeZh4eQc66CpZuijKaKk5yIlJCabXCyXKVzk3qcbJl/e5l+bqlhonJyfp9ic7K4aHePk6SXfYqLkIh2e3iNgWxod2l4c25+dFxkZG1tZWhgSlpXWDxIRj9TM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCMpJZJyjYquv7+8u7Wel6ikrraio5mVo6mnramqmaWin6ahoLWnoqmnsaSUq6OPpK2knZCamqq0tKSdppypkpSXr6CgnqajnKectZmgqqO1qsKvqaupooyEj5yioaajlpqanJial6WjpZepp6ygo5uspr2slb6wrZ+jsbS7rbapnau0pamZe6iRfXyweIuApKWInG2yb6GHrXyij4Ool5qBrImGrYWglKigo5eFn4GZloF7kn6rgZ2Zloqqd52gj4iTkn95r12jgXymp2SegHyXdGuuXaVscoWZXWBbjKBtlJClmIKTi5OJeHmBln5qbH1ifXRtf3lfZ2VwbmdnaEJZX1o9SlMyUzhBQUM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pYU1BPTkk4MTUyLiosQVRWVlZUVFVVVVVUVFVUU1NWV1dYVlZVUUhGSUojKCi8kpuEqcbDtsG0n5qtoK65pqOOmqOjoK+uqZ+jnp2tmZ65oKOroK+qmq6hkaqppZaJmo+tsKynoKibrZiZj62ioZ2loZmknK2Xn6iltqi+rqSpo5+MgI6bm6CmnpKUmZqTmZmlo6KYp6qqoaOeqai9pJfDraujoqyzu62wqaO1saqsmXavfpCKnIWHfbqtiZhksIxllq19oY+Dp5ecgq2LhbCGp5qkoqKRhaBcbGuCs2B/rXt7goCxbGZumZeLiLFafbRcpINryKJmn4F7u1l2tVqyfVOvgXqsWIChbZeOp5mIlY6TlHl3jJt9Y3N8YoN4dIB8YWpmcG1mZWVPVWNcQVRePUgoPjk9NCEhLCQfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTUpHQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsbe9u7TBs6Ocraalt6mgi5mgn52ysaieop+dtZigs6iqq56wrZ6snJWuqKKOiJuOr6ypp6Ooma6Tmo+pmqGepZ6Zo6KlmJ6iqLGou66kqJ6dj32Lm5ahoJmQkZqbkpmXqJ6fl6espaSkoqSpup+gxqemqaGstbeusKmhvrCurpeBqZKjro6bgIakl5iQgIC4w7qDjp2ThKiZnYOsi4Oviqicm6arkX7VvcKqYqS/vX1/o4KD17q3tYSUkoKevb6EaqOBb6uEbp1/erKxx4Nrq7C9rXl4or67dICVjaWajZmOlJp3f4+ZeWJ8emSMZ3mBe2BrZWtqYVBiW1NpXEBUYEJMKTw6NC8fHyQeJTIgHSQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVtLSxv7qyvbOina6nprOmnYyXpb+ptq+nob+mprKbnrGduaifra+lp5WUr6yXjIOaka6mo6yhpZyqoJiKo5OmnqebmqCoopidoKusqbisp6Oal5N7iJmSppuTj5GYmI+Xk6iYnpaop56opqGiq7qeqcWjobCkq7S1q7Kso76qsLCcdHaqpLeFZYmfcGeskIqPbm53pY+aoIF2sZuXcZGOcpeppJuYr6RybG1tZot4b26DmXGAemlwaWeJlpWXcWhphYZncIZkXYpjaW9aXWd+eKZgYnKPknBmZICNko6hlpWXjpObeoWNk3RkhndojGp4fnlkbGNmbGJLZVdKa1k6UGREUCdKOSsjHCAaIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola20qbq5srOqqaKun6SzqpmSvbHDx7y0qZ6/q6yjoKeroLqjpK2srKaOlq2qkIyFlZetn6aqop+ko6CRi6WSp5mpmZajqaCWnKWlpq65qqyZmpOSe4SXjqaXjpGRmJSNl5Smk52Wp6KZr6adoqy5oLDCqKW0p6yxsquvrqq8prC5l4uhqaW1nImWopiGqZuQlJ2SqrSZm6OsorSYpKKfoqOdoqWilqynjJKTjYeTnZ2VkJmTmJCOlYR/pJqXlY6Lk5KKj4aEfmeMgXSDd3SHjHGnbX2Wk5SUgYGPj46OnJKelJWTnoCFk4twaI92b4p3dnx5aWxlZG9jVWFYQGlaR2JgTlgrRT0rJiE2NDAvHxwhJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlRRSkVDPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqS1t66uorClraCht7GRjqrEvMO5tqmhpJ2bpZ2wqKS3p52ptKWnkZiso4uIiY+cp5atpKGaqJ6ek5Wjl6iaqZmUpqCjj5qnmKC0uaeqmJqQjXyBlYyhlIuVkZWQj5KXpI6dmKeem7Wjnaart6ivwq+kuKewr7Guq6y2vKOxvpmSpqSmtaKSnaaejamfjZKfoq2xmqGksquymqainqWrn5+enZetnpOaopyUkJermY2YmJaQlp6Rh6CelJSFk4yPjZWLgX9mjYh1iHd6iYR0nGqIkpaVkol9jJaRkZeRn5Cak52ChpeFeHGUcnmJf3F7fmpuZF9waWBcX1ltYlBgZE9YOUZGRT0yPD04LyomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iWpKijsLOsrqOpp62gqLWqkI+bo7K5raqroaKZepyisaSmsamWm7ilopSYqZyOhoqJm6KQr56klqigoZKXmZuui6qWj6iYp4yYqI6duLWjpZibjYl5gpSMm5OKlZGTkI2RlqGLnJynnZ63o3+Dr7WjsLB1pL+ksqB4eqKttb6Xd66loIqAqX5kXGJ2n46knoOWfm2UtJyjqK+spWagoZR0epuYcIGZqplsgKOpimWcpZyRl5iWi5KbkISdm5CUg5OHjo6SiYV4a5CIdodxfIaBgWFpiYyVk4xbdpWRZ2iPjXF5oZaVZHiYhYB2l2iDiYJueX9qcGVfdm9ra2dcZWNhYW9SWT1NTU5SRj1AVEI5MS8eHyY0OjMwNjY3ODw7PkBBQkZIQkdHSUtMVFVVWV1gaGZnWFFJPERHPDlVUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuqpamupKetpZKWqrSusKWZqaWql3OLna+fqKunlJa5n6CPnKSekX6IiJqejayapJWnop6Ol5GehXWuj4ilmqiRlqOIm7mzp6CYmIuJdXeTjZaTipORkJSMj5OfjZmepZibspaAjJu1nbSNko+9p6F+p6N7pbG6g46Pp5+Ei4WPsamvjImWopp5gIushpyeo6mrqYmWh5l3ppx7iJyBmKeDgXuds3uKhqCYmZWYloGQlpaDmZpieYiRhI6PkouEbnGQiHqCcYGBhoCHdIeFl5N4lmiTdKCadHuZgpyahJh+kYiBgphpjIyEa3h7cXBnZHhuaWxqXGRpaWVyW1xIU0xRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1JYWlhbYWFpZllRSDlETDw+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZikn6aurquoraCpsaenqaWZlK3FvK+glKWntJ2Pg5yrnKaioI2Qvp6ZjZ+aoZF9ho+Yl4isnaOWoaGSjZSJhoCRqI6Hopyjk5adhp65saedmpOPhXB1kImUkIqUj46bi46RnZCVnqOUnauHn7SJtJqui8qIq6+Kt4WNsISzsYWpjqeYjZ18qI9ye3ecjqaWaJWkebSMoKCoqpOZwoKAq4mZoXKegJulfZeFlbOBoX2hk5+PmJeAjpSciZiSi3yFk4aNlZOKhG50koaAe3OHgYR9hXWGg5iBj8VmgKmHj6JqnYGel4CZgIqLg4iYb42ShGd3dHt2Z2h1cGdoa15jbmxmbFhlRl1RTDJFNDZNYGM3JjM8RUdEOjYzNjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASWRYXWNmaGdiYmJiY2NgX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXo6CwqamopqygpbmxqaummpSeoqSpoZSjqbWir3+gppylnp2JlL2ak42gkp2QeYOWlZGIq5mcm5qihY+Md5ucjqCRiJ6jm5aYl4aiuKylmZuNjX9ibY+Lk5CNj4yMl4uPkZ6Nkp6gmKCnfqGnh62doJaukKCenZGHgqCNrbGIpI6rmoyafqJ2gJmUa4GrdU2reIeNnZKcqqmCqqt+hKF8e6dqnoCTbGeXhpi3iZ5+bmBjWIOXf4x7ZGeLc5l9eZdsXXyXbmBTcYVcYG16hGBZZYJ+hYGZcaira4OjbnKlcJ+CnGdknmxabIh6ZVlfgn5hV1BvdmVtdHFqam9eam9sa2hXZ05dWEU5QDRHRF5rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSS01CSltdX1deX2N1YE1FOk1OTVRiXFtmZmlpYmJkYWRkYmFiYGJkY2FiamtkYmRkZ2RiZ2VhY2iYl56guaGqpKaskqK2vauuopmWn6Clq6ufnK20oaeRoJ+fppuZjpm0mZCLnoyVi3WBlJGNiqaWlpifnn6ThYaspIeckYqYqJiZmZGHpa+mopWZiImAaW6Ih4uOjomLjZGLj5Ggi5Kdn5uhpX+TgY+joZSgd5yWkKeDo6mAhqyvh6V6i32Emn2icHOTh5V7nox5bYecjJqSnaqcj4edfYOidHemZ55+d6VemHt9k3Oibpi3tLpzkoiBgLaoZIHGuHxwlbaMcYCbo2N0rKthfmqds35ufoiDj4OMmHGAo2xzpHOegn6jXpyZs5Zve5ees3RyW56ygmlib3N1cWlvWGtrcnJkW2ddYUxEPUQ1UUFacDI8UkdfSlI9PDM5NTo6NkM8O0BJUD9UTk5RQEVfXltZWGBge2RJQzhMV1VWY2FaZmZra2JiZWFkY2BhYmBkY19gY2tuY2NkZGhkYmdmY2holJaVo7mZq5yToI6luLWtraCaoZuio6SsmpqxrKuSl6CYoKSZmpSerJuLiZF4i4VxgJaNio+hkJOUnZd9kYmOqKCHmI+KkqKTm5qMiqinpJ6PloeEfmt7h359j42Di5CQiY6TnoGVm5+coJ+LiXecmKKNoHKhjImpiZ2okZiqrYCujH16oJl5o5N4gHOXiIycfZWfh5yOmp2niKNkoX6KlpCbjW2eaJuOb5qZe4CKp31yaHSqg52Cc6pnlJpdm4V2hZ1oqmqBuGZcqXCBnGGVjF+ndneKioCdaJp1h5OSmI5/nm2ZkGqmmVyofne7an2pWo6EXbNnW25xeHdraVtwaXd4YV5lVmFCUEVPN1ZCUm40SlpaXk5aREAxNTE7OzdIPzpDSFU/WVNYXT5EYl1WYFFhY3xpRUI5TltdWGRmWGZmbm1iYmVfYWFfX2BgZWNeYmRvcWBkZWVrZGNpaGdraZadiaq2nKiJY5WcrLuysKudpZuap5+drJmdsKeqnZaimaGfmZaWoKOZhomNaYiAcnuXh4yWloSSlJiPeoqElqSdiZWQhoudkZybiI+ooZ+ajJGKgIBpgYZ5f5aMe4iNjoiOlZl+kqGeoKKTmHJon4qgj4xwkoyCqYmaoaWqo6p+sK2koriXdqOzoqN/iJR4nXqqmX+ij56dmImYcqF9h42wtX1smpGheH6ZtaOjq6iEmXyafJyafnOqWl1ve5eLeJ5iTX97e4VkephCTZ9ZompzfI5vgoqEmXabeYeJsbN/fpqSpnR+nW1xfJRvmXJpo12VdkhlY2BzcHx9bmZfbGh1e2JjX1BdVlxUVkBZRVFnRVJWXGFYXklEPUI4P0E6SEU4TEVYQVdSWlZFRmFcWmBLYG19cUVDPFVeYlplalZnaG1vYmZmXmFgXF1eYGhiX2VkdmxeZWdmbGRlbGhoa2mUnYGxrpqEU16hp7S6s7OomqKLmqmbm6eSoKujoKePnp2cmpmVmKGdloeHiXeFgW55lYSQm4t9kZOWiHKAiZKhm3KSkIGImJSfmoSOqJuZlYuKinyDbISFcYGhjHiFjYiHkZeTe5Gin56jiK6GfbWEj56de6aWeqmCl56RjKOgfqdod21+mXOgc3F8nYWYb5OCrXyjhKefm4KkcF6paHajZHCmYZzTj3x7mXhyc2OihpB+onKij3Vrj7OLYIKYinSqsqi8f3eDbn+/pqq0Xpxvf3KXcIJzonJepGd0pmBopmya05h6gptudnmXa5t5dpdybKmlZ19keXB/g2xoZmRtdXdmX2FSWmVQUWFIV0lUX1dTW2RqW2RQRUNLTEpLQUpEOFBAUE1YU1hPU1FgZWVpU2R4eXdJRkVjXWVaaGlTaWhqb2NqZmBjX1xdXV9oYmFoZXxkXmRnZGtkamxmaGxomJt/saxUXUt+qa+ytbCyo5yYhJemoKCijKSnn5epiZmXmJOZk5Kgl46HhntwfYRofI+Dk5qCd5GOj4pwgIaPk5JsmJR8iJGSo5WDjqmak5KKhYl5hHaIgG6Bn4Z3gJKFh5iglXmSoqOZoImzoaK2i3qsp6SupXCpgJuRhoGelH2kgaKahphxnoSira6Jl4t/jKSNlYOvo5V3tba2yaJzlIuCn2Cel6lteZaHoJt1oYd3oH6QlouBb0xmo5Jxm4hzpXt6dWKDgm1+oGxyZGCcc390l2t7arS2tMamc5h+epxqmpqrdIGabHN3l2mZeXSXcVBEfbNeanZreIdma2Zic3RwbVVcUlhnT1JoSVVMWFJVXGdrblVnV01KQUpNS0hLTkFRSlBkY2ptZXVzc354e251iXp7VVFPbV5oXGtpUmpoaWxnbWdjZV9cXFxfaWJkaGt7X11kZ2NqZm5sZWltZaKdibCohWVAlKGzrK+vtaKij3+Wp6Kho4ukppybpoKal5aNl5CQm5KOiIN5a3mGZYOMf5efeXWPiIyCaoWFkoSLhZ2NeoyKlaWSgpeol4yRi4CJeoB9i3lwj6CGeYGUhoiVnpR+k6WnnJaWhGdueJxsomR8cqV4nJhwaKeCmY59pXuhl4OWcp92gImUlY+5bY+KomJ9maOXiW5za6trdaBtb6Zgm2mLkGmWh5uVdaKBfppgi4aNdW+IYmihZp5/apt1cGRniIJvcqJbX1tkoW5eiYxxfIB0cmSlbniiZGanaJdyi5dtoW9SiI9uoF5kp1SLXVSYbW1ya3GBbXBoa3hza29RVlVVZVlTbUlYT1xIWGhoc2pZa1ZRUkVWXE1YU2FVaGped3V7fHB9fHKCe39zd46AhHdeUXNhZ2JwZ1BraGhrbG9oZGdfXV1dYGpiaml2dV1cY2hjamlybGZrbWOdpZmmemV0bYunrqWqsLGmn4t/lqqcnaSLoaGaoaGAlZiTjZqPi5eQjop8hnGAiGiLinyXmnN1iX2QfGWDh5WKiZWagnyIhpamj4Chq5CFkIqBin2AgI5zaY+lhH2Fk4yHl5+NhpGppp2JpniWnH6liZaMspmekYSvl5+leZiJe6l1p5CEmm6looyShIyDvG18pa+Ch4aHlZedon6me3KolKCWaJ9+b6xjloqWk3iobaqjgYl1iIJ3q5GmiGuSsWx3s4ypbIuGb2+gnpKVYn+rjKp3gYCOp593n32FpJWdoGiah3WrZp6tjLZzdr6Mo5NZg6aNq2F1cnRve3VwYmp+bmdsU1VZVWBgXGtMXFJcSV1sbXZgW3FYW19aZ3Nlbm9xY3F0YHd6fnlyeYNyg36Be3uNgYKAd2J5ZGNuc2RSbGdnb21yaWdpYV9eXGFqYmxse29cXGJpYm1pd21nbG5ilqarnYGAnqSWqaqeqKeuo5mIgZapmZ2jiZqknKidhIuaj4WckYWSjYyMdIV6iINvjYV+l5NzdYZykYNuf4uSh4aUkH17goWXpI1/paWNgI2JhJR1goeTb2yLqICCi5ONiJueiIuSqqKgkIB0lJeIfoF5lK+kf4KccY+GeZKNhoB7cqiNcX19epeWm4SNeHt9fYiUlZOLd5GZoaKFfH+Ja4yFXHp5c3pxaW9+k4pxgHSCj5STcYaEgmWNf1+BgYx4d3SUdXB6b2+Jb4WGX3dpeI5ngoOGj6qcf3R9l2qJiG9+dXyDdW1sZoxzeHuXd4Raald5j2lud3Jxb3d4b11rhW1pZ1ZZXlZcZGtkVWFVXlFfb3d5a2p3ZWpqanV8cHF0c2FvdWJze4F4dXmCdX+Af4B5i4WCfnxugG1keW5eV25naXVreGppaWRcYFpjaWVscXVuWltia2Rsa3ltaGxvYY6Vuqmni6Gim6akmaSdq6Kgg4OWqpGdoImZppqomIOBm4t+lpSHjoqJjHKCfI58fo+Ee5eOdHKEcJWGfH2Si4aGj4Z5foCGmKOMe6egioWPj4SVg4aOmHdxhKqFjZGcj4eenYaKmqifoKqDiY6Vm39+ipetqJCTqJF4cZ+ThHyUcH+qh3B9lXFqb3yBn4t/kY6LaG5dhI2NnJ2gkHOXjIhxdGuDdnSAWXJvh5GCfn+Mal1pZHuFhIiAYGl4e5x8g42DdoKHhGl6jIlsYnFzg3dfc42DipGolodnjY+DbneLgm+Di3dtZGVjeYJ6lVpbaWZtdlt7eXd0bXNyg2ZcbYpra2JZWF1ZWGtxW15gWV5dZXJ+e3NvdGNqaml7fHJ6d3RkbXRobHt/dXp9e3l5f4B/cIaJhHt9c356cn9oVFxyaWx2cHVna2dkXWFZamhranFybVdbZW1sZ3J5b2hqbWCMjKuxoZCjoZqfnpiemaijoX2ClquMn5SHmqGQpJV/e5iEfJKZiYiGhopyfYCLdoWLgoSWinJvgHKYh4R+k4ODhoqCeoCEipqfj4KmoIZ4jpeIlYuLnJeEg3qsgZCXmZOJnZyGh6Gqn6Gio4uIk5udo5mWq6Kop6GTnImZkH16kJCGqX9/kpGSk5yxpZqUnY+NsZKYhKaNjZadoYqRnYOJkopsfY53d2aDhpGLfImehYeLj4iIgYWEkXd8e3WbpIqIi6CMh5Z/gI2DgXdxdYaFf3mJiIuRp5GEh46Ig4yQi3qFiYeNf3VqgIN8eZlpcWhgc4pwfXt3dm93dIFdXm+HZ25fXllaXFJncVVjW1thbGh0e3xybnBjamlof3tteH5waG9wbGaAe3KCgHd/fX+Ee22DjIZ8enl8fXqDeE5kdmpzbnF7ZWtlYmJgW3NmcGZycWxVXWx0bWh4enBnaWtljYieup+Wo6GYlZmYlJikoJ17f5ipjZ2MhZ+cip2WfHiUgnuOmYmGg4SHbXiAf3KAh36Ik4Rta356l4eEg5B+gIaEh3yHg42bnZGGqZ6DcoqPhpKSi5yRfI17qYONkZeVjpuWhYWbpp+imp2Gg5KamZmQmaahpp6ekJeCk4x4fYmPhad8fY+QkYWYqaCck5yOjamNkoCejYmUm6CEj5h/iI+EcHmGcnVhf4SQh3aMmIGDj4KGhH6GhJVuenZ1lKSMjoabhoaQdYGMfn5zc3yJhXt5jY+FlKiQh4SPgoOJiYh0g4aGiXptanx/e21oa2xnXnl+Z3x8dnR2dXp3XGBwfW10YGNaW11QZm1TZVpdYWpodXp+cGxsY2pqZ4B/a3J/a2p0bnduhHluhoB2goB9hXdyg42Hfnx7fIB7gotgaXtrdmhpg2VqY2BpXGN1Z29idW1rVGJxeWVveXpyZWptbYuKn7iaoaSfk5KWl4uan56cenecpZCbiYakk4qYmXl5jYV8iZGDjIKCgmx7f3hygIV9ipB8a2h9gpeJgYiOfH6GhId9j4CPm5uQiKacf3CLi4yShqChioWMfKeQh46RlpKVkneMo6ChnZaaf4GQmpmTjZqjoqSbmJKcgJCHe4GFj4iigX6NjZB8l6SgoJKZkJCljI+BnJGJlJicf5OTf4iPgnZ1gnF3YX6BjodzipZ9iIxxjH6ChYaPaHhyeY2ak5GAmH+JjHODiX19cnp8jIV7e5KOhJemlI2GkXyEhYaEdICBhYV4ZHF6fnh5cGtqZl59c2d8dXZzfHJ/al5gdHZwd2RjWF1eUmpoVGVYXmBnaXZ4gXFma2NsZ2V/gWptfWducGp9d4V6a4uBcoGBfoF1doKNhn98eoCBfX+PanKDbnRpYohpbGJfcVZ0b2xuYHhobFdqdHZjdHp6cWJrb3mJjZ+zkqWmnY6QmI+GnKCam3x1o5+Nl3+MoYqImpZ3e4aHfoOJfoiCgX9wfnp0dYKFfomQd2djfYaXioKKjXh9gI2DeZaAlZeVjZWfmn1vi4GRk4Wlm4eMiYOmlYSRipWXkpF2kZ2hoZiUmHp/jpiXj5eanaWempSVnXuSiIV5h5eOn3+Cio6Nc5einaCSmI6PoYyMg5eYg5OWmn+Zjn2KjoJ3cn5ue2SAfIuGcYeTgJGCa4eDgYCKhWZ2b32IlJqOfpR5jYt9gol+fHKAeYuGeoWSi4yZo5eDhIx3h4OCgXV6f4aDc153d3xzfXdma2NgfmlqdnNzdX1xfGNjYXNudXJtYVlfXVprZFJiV19gaGt0eYZxYmpjbGZofIJraHRobG9of3yBeWyPhXGAg4N/dHyDjYGAfnqCg358kG11iXR0bWaKbGpiY3VWg2lwbWB5Z2xhanZwZXh7eXBfcWyFhZCdr5inqZ6OjZeHhZ+TlZd8d6ibiZh5lpyLjJmQeHuAi318g3uAgoF4c3h5c32Ag3+IioBkXn2LlYh+hYd0fX+Kf36YhJaTloyjoJd+cod7k5GKpo+MjoqSoJGDkI+Tl5CKgY+YoJqSkJJ0gI6SlIqdnZ6nmZiOlZh1kJGLbYeZkJt7iImQiW+XnZmik5WKjJ2LhoGTnX+Tk5aImop8i4qCenJ6a3ZtfH+Mf26Fk4OUeG+ChH5+i4Flc2p9gpiYhYCOdJKKhXqJf3d5gX6HgX2EjoaNlaWReYWCdIiGfH9xc36FgWxgenR5cHtuYW5iZHthbW92cnd3c3NhdmBvbHVub1xaXl1dal1PXFdiYWhtc3qJa19pZWpjaHeHbWZsaGlsZ4B8endukIhzgIOEfXSBhol6g316gYR9fI5yeYt5eG5sh2toX2lyYodocW9mdmdtbGF6aGp8e3dwYXdti4GZmquhpKmeiouRhomeipSWfHasl4yWfJ6TkZaUiHZ9e4p8e4B2d3+Ab3Rzem+FfYGAiX58YVx+j5GGf4SEc3qAhnqPkYeRkZuSpJuTgX2BfI2KkqOJjYqNlpqMhZCXkpWOiYiMkp2Tj4yNboSQjpGJnpmioZiXipeTcIubhmeImo+UeoqFkYtwlpqToZGSh4mYjIJ/kp99ko+TjJmPfIuGiHRzdmtxb3Z9i3VvhpGOk3J0gHyCgol9ZXFten+blX6FiXSSjIJ1intwgn+CiH2FjYqGjpaqjnuIfX6KhXd9b21+g4FiZ3dzdG56YV5vYGp0XnBqenl4bHJwZXldbWxzbXNYWl1fYWpaT1dXZGNmcXF/h2VdaWhnYmdxjW5jaGhlaWeAend1b46Fc4GBg3x1gomFeIV8eISGeoCJd3+Le3tzeYNqa19waHR/a3FvbXFnb2tle2Juf3p3cGt3d4l/o5mjqKGnm4iMioGPnYaSmnSAqZSRjYagjJWTkIBze3aFd3h/cnN7hWtyb3ltiXZ/gIZucVtZfpKNiICBgXZ1gX9/oIaPipGcl6CTlneJfoCMiJydio+GkpeWhYiUmI6WjIuNjoydio6RhG6Ki4+RipyWoZyZloaZiWyHpYVoiJ6Kkn+MhIyBeJOYkZ2RkIeIlI1/fpCZfJGNkI6akn2LgYRwdnBsbm9xfIdqc4OPmYpxeIB1gomDemdzb3aCm5B9iYV6lZN7eIp1cYt8h457i4eFio+cpYl8hHeBin93d2xpfoB/XHFycW9vd1leb2Bval5vanx6cG1tam13YHBva3FtWVhgYWFtV1BTWWVmYnVvhIJiXWttZGNma5JtYGZmX2dqgXVycm+LgHR/goB5doCLgHmFfneHhnaDhXuHjIB7d4p/anFifGKFfG9wbHVqaG5sdndfcX55e3R1c3+CfqWWm62fp5aFjIN+l5WDjp10ip+TkoWKmoyVjox6cnd0gnByhXNxdYhsbmx0bId2g31/bW5VUYGrlIeCeIB2coN5gqCCkYGSkZebkZl3kXqCjJKkmpOOiJSYkoSFlpiLk4uJjo+HnYSRi31zi4WIj4icmZ+bl5WBlYBqiJ+JaIihiJOFkoSKcYORl4+ajY+Lio6Nd3uTkXuOi42Sl418iX2BbHdqb2xsbXt/Ynp+j5aBd3qBeIONfXpodW11iJeMgImGfJWRcnuGcXiOe4uOe4l+hI6Rn5+GfX14gYp8dm9nan+Ad153b21rcHJVXW5hcWFfbG55cGdwZmd0dWhxbGF3ZV1VZWBgcVJQTltlZF14b4h7XlxocWJiZWWRaV9oZVtnb31va3Fzin12fYWAdXZ/jHl7hoB4h4NzhoV+jIyEfHqVeGdxaoNgh35vb2t7YGltdH90X3R8eIZ4c3OFfHmhkJqxnaaOgop/gpmJf4qcfoqYko6EiJeOjo6Ed3R2c4Bwb4VzcHGDb2ppdW2Cbn18bXVzUk6C38mS1pN8cHSDdYOfgpF2lJCYm4+Ye5NyhZCfoZOTkImSm5OFfZWVh4yNh5KNiJx/joF4e4x/iIyKnJycm5aUeo54aYuUim6KpYaUiZeDhmOMkZiNlImWi4yJi3B6lYl8jomLlJKKeoZ9f218ZXNwa217elyBeZCOgXt+f4CGj3t6aXVrdIyQioOHhn6XjW1/gHCCjoCOiX6Ee4ORlpubjH13eIKPeHJsZW59gWppdG9naHNsU11vZHBaX2xyd2Zra2NneHNvcGNfd2BhVWtfXnVPTktgZmJceHCKdFxbZXZgYWRkjmNgZmJYaXNzbWtxdot8dHmGgnZ3fotzf4Z/eol/cYmHgZGKiH1+mXZlc258ZYd/bm9rgFprbnl5cmB2enuNdnJ2inZ6n4ycr5ugkIKFeIiUfnuInIeEnpCOhYyXhJOOh4F1d3B5cG6Eb21ufnJjZHhwfG56fGpobGKkmsHcru+ic2x1g3WEoYSRbpWPlJ+TmoCRcIWLo5eJjpWKkJ2Vg4CUj4WIj4CSioqXfod7dn+JeIaFjpubl5mPkHaLeHCJi41/jaaGk4udhYZei5SXiY6IjYqKhIlsfJeCfYiGipKQhnaGfn5sfWR4dWpvenRYiHqRh4Z6f3+Aho1/emZ0a4GLj4uEhIGNmIZtg3dviZODkoV/gnuBkZeUm5F1dHiHjHRycGVzd4Bgc21vYWh0ZlJgcGdrVV9udHlhc2NgaX1xcm5bY3JhY1ZuWlx3TU1MY2ZhXXZzim1bXGR4XmBkZoRfY2NeWGlya25rcneLfXN3hIF4eHyJcYOEfX2Ie3SLiIiVhox/f5hzaHVxeWyLe250cIBXcHl2eXFkdnmGjGh2gIlxgJ2ImaicopKEfHCMlHd4iZyDhJ+NjnyVjH+aiIR8c3dwc2pvgWtpbHx0XmB4dntwdHpnYGV869q1ycPciXNsdIB2ipqIjGmXj46bk5GBiHCFiKCOhYuVioyXk3yNkoiCiI96kYuGj4KAd3iDhHKHgpOblpSYho12iIByh4SLiZykhZaOn4SJYYOVj4WIhYiMhoCHaH2Uf32ChYqOj4Jyh3+AcndodnJpdHhtWox9koKGfYCDgYSLg3ZidW2KgpGMg4CAk5J+b4NteoiRiJSFfYJ+gZOUkZiKb3J6jIV0a29pcHZ+XXNoblxpdF9RZHFoZlNfcHZ0YHBgXWiCcXJqV2dpY2lXbVdbdExKTGVmXmFyc4VpW1xleV5eZGd6YGRfXVlrbmVuanR3in5zcoF/e3Z6iHSFg3x/h3Z2ioWPmIGNgnuTdmx3dnl5k3Vud3p9WHmFcYBuZ3h2kYJkdoaFcYqWhpqhm6GKhnNvkotxdo2afYmZiIl7n3+DmX+CeXF0bm9kcn5oZmx3d1tfeHp6cXF/aWFnYX/Vto6RpnhucXd7cZKQjIZqmI2ImpCKhXpoh4uZhoGSkYaGl417jIyAgImNe5CNfomFenV7g3xxhoCVmY6TlIKJdoSIeIWCjZWfoYiXkaB/iGF/k4eDh4OIjH9/gmZ9kYB+f4OMj5F/bYN9g3VsbXd1dHd2bGONgY5/hX98hICFiYBxYHRyhn2QjoN9gJKKenKFZ3uFjIiNhXyFf4GVkJKUhW9weYt/dGxtaWl3emFnamlYa3RZUmhyaWJQYnJ4bGJlXlpqg25zYlxnX2VtX29UWm9OSE5mZFxmbnKAa1pbY3NfXGNrdmRlXV1abGxibWpzdoaAcW9/fH10eIZ4hYN8gIh2eImBkpV7iYZ2iYFveHl7g5JvbXuAdl6Df3SBbWh6c5RzZ3OHfHKSkoSan5ufhod1dZR+bXWSln2HkIOKjZl8jJp2fnZxb2xqYXR8Z2JpdXpaYHd7eW1xfmVkaGhXnY9fcnOXvMSEdnGUiI99cZaLhpuSi4dyaoiPloB7lYyBhJqMfIqFfHuJi3+UiHWJhnZ3foFydYaBnpSFlI+EhHKBineHfoubn5qIlY+dgYlmfZOCfoSCiIlxgX1mfox8eX9/h4yPfWmBfoR2Z3B5eHN3dGxrjoWKgYqAeYKBhYSBbF9zeXt+jouGfIKQgX9zgmp6hYmNh4V5hH2CmY6RjX5ubXuJfXZ0bmZle3RiW3BiV25xU1NtcmhhTmZ0eGZgXl1Zb4Bvc1llYl1qbmBwT1lrUURTZ2Baam5tfG5ZW11tY1picHZjZlxdYGtpY2xqc3aBg3BtfnyAdHWDeoOCfIGFdn6IgZaQeISKdIGIcnl5fo2Qb297gHFpgXh6fm1se3WVa2p4hHRrk42Gn5mgmYSIbn2Mdml3l45+gYqClJeJeY+Vb3p0cWxpZGBzemhfZXF6WmFyfHlncXlgZWWPsbJ3S2JapdnQlnF7kIqPd32TioSYkIuFbmuFkpF6eZKHgYSYinyGf3h3iYqEloBvi4hxdX57anmFg6WQhJONhH9wgIR4hnuInZuWjZWRlYWIcHuSgnyBgoiDboB3aICEeHJ/gIOKiHxlfn+EdmRxc4BpeXFvdZmNhoOLfXd5gYV6g2tccn9zgomHin6HinuJc4JvcoWIkIaGc4V6gpqNjoV5bm9+hH92emRmaHtvXlh2Wlhwa05XcXJmYEtsd3RhXlxbWnV9cm9XZ11manFgb05XaFI/WGZeWm9rZ3pxW1pYa2VaY3B5XmdcXmVsZ2VraXF3f4hvbH9+gHVvgnuAgn+Cf3aBhYiXiXGCjXF7hnx6eYSTjHVqeX5rb350f31vcnt6k29ugX54Z5KLg6GZnJGChWaGg29neZWIfX6EgpiJgXyOjWl4c2trZl9hb3ltX2JveFxka4J6YXF2X2Vl1Oq9izI6PouOf3F4hYeNjXWClox+ko2Mfm1shYyMdXyPf4WBlYh8gnhudoeEg5d3boiFbHV7dWZ5goOni4KPi4R+boF2eYZ8iJ+SjZGTlI6Lh397koZ3foOMgmt/cmiAfnhtfHyCi4N4YnqFgnJkcml+bnVxdYKbi4B/hYBzdn6Bc4JwXG5/dXmLhIt7iIF+iXl7cm2JhJGFjHODeoCXjIyAdW5rdoCAdXNbZ2d1bldWe1JZb2RMWnJyZVtJcHhvXFtbWV10fnRoWWJbZ2VvZGpNV2ZRPV1lXF11ZWB1cFpZVW5jWWRxeVpoXV9nbWdpa2lwd32ObWmChH55boB8fYF/gnl0gYGNk4RwgYtud36Ae3uIkol/aHp9anN7coV6c3Z9fox6eIR9fGuMjYSbnpaMgYBsjX1raH6Ni3p+foOTgn59iohrdnJnaGJbYmdzb19ha3NgaHCIeWJzdF5jZJugj25cNVqvtXRpgIh8koZ1hZWFc46KiXZvbIWDh3V5iXiJfJOHeX5yZ3WJfn6Yb3GGfmh2eW5meYeEpIeAh42Kfm+Ad4KDf46biIOVkpmKi4WJfI+IcHp9hHtofmxqgHt6anp3goiBcmB3gX5yZHJndoJtdXuGlZGBfIKBb3d6fHV/bVlwgHd1jYOHeIh2g4l7eXRvi4GRgoZzgH5/lImKe29uam2BgXRtXGZkcnBQWnpNW25bT1tyb2RVS3N4aVdZWVphcIB0YF1dYWdkaWlmTlloTUBgY1tgdWFddWxYV1N0YVpkb3JXal5iaGpnbWxocHd8k2xohIp8fHB+fnuBgIF6dn9/iouDcXyHb3F3g397iYyPg2p9e213eHaKdnx4f4KHf4N+fXpthYyImaONhIN7dYt4a2yEh5B4fnuCkYCAfouDcHNxY2ZeWWZfb29fYGdwZmpuiHRhdG9bYWRqdnuAv5ympMi4cYSCcpJ8d4aSgnOQi4dycm+De4N0dId0iHeUiHl5cGN3h3qAk2lyhHZnd3VjanyCiJ2BgH+Oj35zgHWHe4KTkYR6l4+WkIiCiXuIiGt4eX50Z3poa395c2l6doCDfWhgeIh9a2t0aHyAaXaBjJGUfnp/f3F8dnx0f2JWeH5zc4uFgn2EcYeKeHlxcYSDjoB/en9+d4+GhHdqcWlsh4Fxb1xmYXFtSWR1S11sVFNZcm5iUU90eGFSWFhdYXCCc1thXGllZWRrZFBbcElEY2BbY3BeXXdoVVdWdl1bZW5oVmteYWlnZW5uaHB2epNtaYiNeH1ye355goGBe3V8g4iGg3B3hHJtd4KCfomLk39wgHt3eXqBjHSCeH6BgYKEeYB1b36Ki5ueiH2FeneFe2d0hYuQeX5/e4iGhHaPgGdwbl9kXFhlWW1yYWBgcGxraIhuYXRpWV5kboB3qdqpx4aHsnGId2+MdHuFjX96kol/dHN0fneAcHF/bYR0lIV4dWtgeoJ5iY9mcYRwZ3ZuW219gJCTf4B5kZN+eXxuineCk42FdZeLko+HhYV7f4RsdHZ+bGd2ZG17dm1pd3d/f3xhYniGeml1dWN+e2d1ho6NlXt0gXdxgHt9boBaV3V/cHaFiH+Aem2JhnR6bHaBhIV/fH56fXSLgX50aHRlbouDbHNZaF5zZEdtbUtaYFdWVXdtYlBSdHZYUFZYXmFxhG9cYGNtZWReb2NUXHJHQmZfXWZnXVt7YlFWXHRbW2drYVZqX2BuZWZrcGdwdniOdGuOjXV+dnh+d4GEgXtzfYOIh4NvcoB0cXV+hYKJjYp7d394g3t8hod3h3x9gX6EgHt+cnV5jI2gjIl5iXV0g3hefYWXi3iGg3OFhoR3iXtibm1cYltbYVZpc2NgW2ducGaHcWFxZlddY2t/fMrOh7mham1timxxg3F8g4l+epCEeXhzeXV1e2psdmOEdZKCdm9mXn2CeouKZXKCa2pxY1hteoWbiIKBc5eUeH99b4pyhIuNiXOYj5GJhouDe3l9cHBvfGZocWJteHFqa3F4fX16XWV6gHhqdnhmg3dndIeMjpR9cohqb36BeW99XVlzf251gYt8gm9wioBxd2l4gIKAgnh+c3x1h317c2dzYW6LgWtxV2lddltHbWpMVlVdU1V7a2FPVHVyUFFUV15idIVpXWBsamZjWm9hWGJwSEFnXGBlXlxWe15OVWVwWVtqaF1XaGBecmVrZ3BncXN3hnhulYt0f3p4fnmDiH91cn+GhY6DcHB7eHd2eYaGh4yGenx/dIt+fYaEg4d+fn59h398eHV4eJGTn3+MfIptdX94ZIOGlYVzkYpvhYWBeoN0ZG5qWV9bXF1UZ3JkYFlkcXJngHJia2VXW2Bqf3e+rnugtm5hc4Voc3txeIGEen2Lfnd3cnZve3Zlam9hh3WOgHNqYl5/eHmLhGZxf2hra1pWb3eJo4GFf3GZk3KBeneEb4KDk4l0loqOiIWJhX14dHFuaHlfamxgbXZqZ2preXd6dlpnfXx5ZnN+bYV0ZXWFjYaWf3CMZ2t7hHVudWJdcX1sdX2Me4Jndod+bnFpdn95f4Bzfm17fIJ7eXFmbGJuiX1sbVZpX3ZVSmlqTlFOZ0xYe2hhTlV1a0xRVFVfZnWDZl5gcWhnYldqXVxraEpEallhZFZZVXlZTVZtallda2RcWWVjXnRlbWRwZnJwdYF4cZmGdn9+d398hYd9dXOCiICVgm5zeXt6c3OFh4mJg3iBfXWPfnyEio2DgYR7fouDe3Z7d3eanZh6iYKGaXZ9e2yDg5J/co6BcIWCf4J/cGdsZ1hdW1xbU2RwZF5XYnJ1anVvZWViV1xcaH9wb3KAc4lkZHl9aXN1c3KBg3eAg3h2cnVua3pxYmdrZ4Z0jYNuZl1ffXB7iX9pbXlnamRVV3JvjaZ8hHt2lpF1fXR+fG99fJKHeJp9iIeDhoN9dW9xbGd0XGxnXmx0ZGdlaXpve3JZaIF3dWhwgXiCdmJ3hYt8lIFvjGtte4JxZ3RmYW56Z3N4i3x+Y3eEd2pscnZ7cXt6dH9nf3+AeXdvZGZiboV7bGpVaGFvUkpoak9LTm9HXXpmYU1VdGRKT1NXYWp2fmVdZ3NpZmBWZFdicF1MS2pYY2FVVFVzVkxYdWRZXmtgXFpjZV92Z21ib2l0b3J+dHSagnd/gHeAf4aEen11goR+l4VucnR8enVxhIWPgYB6i3V0kH98gZWNgIWEfX2Mhnp9gHZ7o6WKeYiFhGt1fHp1g4GLem6Ec3mEfYKDdm9qaWVWXVtaWlNibWRbWGFze2pobWlgYldfW2qAamtvgGdrYGh5eGpyc3Ntg4B6f3x1dG16aGp5al9lbmiBdpCEaGVYYndqfod7b2pwZ2ZdVFhvZ46od4F6fJCOenZxgHF0d3qQgXmWdYaDgIWIdmpxdWdnbltsY11tcl9nYWp4aHtsW26Dc3RqcIF+endhd4WFeZCGdIhyb3mAcmNxaV1xeGVydIl8eWN0gHFoanp1cm15eHZ5ZIR8f3l3cWRkY258fGpqVGhhZVNKa2dPR1FqRWB3ZmFNU3JdSk1UWmVrdnplXm1xaWRdVmFVbm5XS1NoV2ZeWE1VbFRKXHlfW15rXV1aY2VgeWhsYG9vdm5wd3V6mH53f4F5gICHhnp5eoN+gZOEcXR0f3l2dIWIkX2AfJBrc5WBe4Kfhn6HfYB+hoKAint2hKuff3qHh4NrcoF5dYB+gXRuhm58gHOKgGpwbmRkWF9aWVpUYWpnW1pfdYJpXm1sXGFXXFxsgWVydH1paVxrdnVnc3ZxbIR7fXx4dXJseWdpeGZdZXNoeneTgWNjVGVwaIKFeHhnaWphV1ZZZ2OPp25+d4CLjntxcn9penB7jn14kHKEfn9/hm5kdXJkZ2dcamFcb29cZ19tdGV6aF10gG9ya3J8fnV2YnSFi3yJiIGAeHJ1f3VhcG1bcnRjcXOFfHVlc4BtYW17cGtqe3l2c2aGdnt7dnFlYmVtcn1pa1NnXlxUS3FiUEZVYEdidmZhS1RvWEpNWFhna3V6ZGVucWZkWldeWHdlVEpcYldoWFlIV2VQSGJ4Wl1fbFpeXGFjXn5pal9udHhtcG52g5d6coGAfH+JjIZ9dXWGeYeMfHR1dYJ5enqCjI59foSJaXOWgXqKnX5+hXqBen98hohzcY+tjHt7ho99ZHGHeXN8enVyb4Zse35sj3pjcG9iZV1lVllZV2Nma19dXXOFaFhxblteWFpcbHtjcHd1bGJZbHNzZ3R1b2yDeH5/eHZtbnRkaXRlW2d1ZnZ2knlfXVJmZmuDgnR+YmRqXFRXXWJjj6RoeHSDhpF5bnF8aXpufIZ8dopzgXl8eH9oZHZsYGZfXmleXHNrWWVdb29iemVcd3xrbm5weHl0dWRzg5J/iISJe3dvcn5zYnhkXHFxYnFygn10Z3KAZV5ud2llaHp8dW5vgnV0fXRyYl9mbm58ZGhTZ1hYVE12X1BKWVdIYnRjYUlUbVNKTVpXaWxxe2JtbHNjYlpaW2F3XFNMY11YaVNXR1lgTUdpdVheYGxbW19iYlyEaWdhbnh5bW9qdoGQeW2Df4CBk4iEgXZ0iHSMhnRydnWCd3x9foyQgH6TfnB3loN8mZN5gIB4en6AdIiDdHCZoXp6f4mUd2N1h3hzd3RrdG9+a3h8cJFzXnBuYGdibFRaWldoY21mW1xxiWVTcm5bWlhYYGx2Y2l1amleWW1zcGxzc3NphHx+fnt2bm5sZGlxY1trcmR1do5zW1dTZWFygH9ygl1iY11TWmBcY5GfZXFxhYSSdWxse29wcXt9fXOBd4Bzenp6ZGV1aF1iWWBnWl52aFdiXXBoYXdhW3x2aWpyb3h0c3VocYKVg4d/hXZzanF9bmZ3WF1sbmNydIF6dGdwfltgcHJiYGtyfm1tdX9zcnhrcWFcZWxtemBmUmVUV1FQdVtRT1hRSGNzYWBHVmtRSVBaVWtra3xmbm9xYltaWFlscVdSUGZXVmhTVEZaXE5IcXRYX2NsYlhgYGFdi2pjZG15eGxwaXV5h3trg31/hJp8g4R5fIduj4dyb3Z6fXSCgnyLj4OCl3R4gpSFgZ+JdYGAgXR/gnGHgnVvoZZze4aLhnpld4pubXpuZnhwemtzdnONa151bmFnZWtSXVtVZ2Fsa1pccYxkT29uXVZYVWdqdGhidGVkXFhtdG1vdXR4aoZ8f3uHdo9zY2RrbmFcbm1jc3iHa1pUVmNkeH19cYZdZF9jVFpfWWKVlWNucIOFinRraXxwZnR4dX1tenV2cHp/dl9lcmNbXVZhY1hhdGVVX2BtZGFxXV1+cGhpdHF0cXV2a22Ek4GJfIZxc2dwfnFzb1RcZ2tmcnWBd3RjbXZWYnJsW19wZ35mbXd+c3Rza25hWmRqandeZVNjVFVQVGxWUFZSUEdkcl9hRlhpT0lYVFZtaGR8aWt4a2JXXVVbdGRTUldoUVhmVFNIWlpQTXd2Wl9la2lZYWBeXo5uYWZreXVub2l2doB/bIOAfYeYe4CHgYl+a5OIcmd0gHt1gIN9iY9/i5NyfIqRhYefh3t/hox0gYZzfYJ2bqSLcoGNi3Z3bHqMYGR7cGZ5c3hsbXF3g2dkfG1jZmdoU19eVWdfbG5bXm6NaE5pbWBUVlNuZ3RrZXhkZFxYb3NscXp3cmyHe392m3p5a2FlbG1eYG9qZXF5fmdaVlhgbHh8e3CEX2NfZ1ZYX1djm4hia3CBh314bGx6blx3c217anZ0b3B8gHNYaW1eWFxVYWJXZHBjU15iaWFibFphfmxmbHR2b213d2xphYx/iXyJbXJncX1uc25jW2FpaXB0gnRzXmltU2VxZVVjb2N7ZHJ3fHdscG1rYFlhZmd0XGRVYFVSTldkUk9bTk9IZG9cYkdZaU1KX0tYbWRgeGlufmRgVV9UXXVcVFNgZk5dYVVTSlxZUFl0dV1fZWtoWGJhW16NcWNnanhxc25odnR6hHKCg3qIjn58iYeNeW6QinVsc4J0f3+IhYeRhJWPeX2Mj4eRm4WAfIyFc4CBc3R4cm+Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjIyMjIyMjY2NjY2NjY6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkpOTk5KTk5KSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjIyMjIyMjY2NjY2NjY+Pjo6OjY6MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJFtZmdnZ2dnfYWEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREFSzNrY2NjY2rCdoKCgoKVeKi8vLzAsSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMkWdfYGBgX155g4KCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1MkbY6ufn5+fptqCjpKSkqlYVHBwcHBc6g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRjo2NjY2NjY+QkJCQkJCMh4eHh4eGiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYaFhYWFhpOUlJSUlJSQj4+Pj4+PiIKDg4KCgoWKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l6ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GSkpKSko2RkpGJh46KkJKSk4+Ni4qQiY+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ni4qLi4uMjIyMjIyMjIyNjo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCQh4iFiYqGiJCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI2EiYaGh4WHj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCRiYKHjoiEhYiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yOiIaHhoiEipCPjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjZCOjIqKjoqOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgIGAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f39/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn5+f35/f39+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX1/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX1/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYWEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX5/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhYWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh8e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f35/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ1dHZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaWhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6e3x+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5OTs7OkA7Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo6Ozg5Ojg3Ojw5Nzg7Oz49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VzcXN4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw5Nzk6Ojk4ODo6Nzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PDw+Pz08PTs6PD09PTw8PDw7Ozo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXV1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NDQD48PT9APz89Oz49PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXt7e31+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRUQ/PTs8QD46Ozo6OTc6PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fX5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/P0FBQUJBQD08PTs+PTo6Ojw6ODk4ODo7PT8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRUhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ2d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0A/Pz9APT9APjw+QD89PT0/Pj0+Q0Q/Ozw9PkA9PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRUNEQT9AQEA/PUA+PD0/P0BAQENAQD9AQD49PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkJDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAQUA+Oz48Pz08Oj49P0JCRUA/QE5hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUZGRkpOTUtKSUdHSEtMSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QERFRD88QUNEQj89QT9BREVFQ1d1homKflhHSUpMTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFub3BxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkhJR0hISUdHQkRGRERDQVZ0h4mHh4aIgldJTE1MTU1MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTEtMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMS0pLTUpLSUhGRkdGRVBshIeGhoaHh4iHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pz9ERkhERUdJS0lJR0hJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3R2eHl7e3t8fH1/f319fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0tLS0tNTEtNTUlGSlZsgYaFhIWGhoaHiIaKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRURBQ0ZISUhISEtNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhHSUlLTE9OTlFOUV5ygYWDhIWFhoeIiIiJiYyOZkJCPjg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5BOzk5OT09Pjs7PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn9+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OzxDQEJGSEtITEtPVWd7hISDgoOEhomKi4uLiomKi4yJVDs4NjU2NzY2NjU1NzYzNDY4Ojg3NjU2NTY3Nzc3ODo3Nzc4Ojs3Njg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+f35/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PERCREZGRWZ6g4SCgoOChYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2Nzc5OTc2Njc2NTo6Ojo6PDg5ODk5ODc3Ojo5ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PUFFXa3JydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc6QTk8REBRf4ODg4SEhIaJioqIh4iIiIqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjw6PDs8Ozw7OTo8ODo6Ozo5OTk8Pzw9QUJESUpNS0pLTFdvcnR1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTk5OTo+PT9ARHaDg4SEhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUFBQUI+QENBQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQUA/P0E8Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo8PDo7Ozw7PT5BQD5ihYOEg4WEhomJiIeGhoaHiImKi4uLioqLiotePkRHSUtKSUZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREZFQUZFRkRGRkRAQj89QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6PTo8Oz4+Pj87Pz1AP0M/Sn6DhIWGhoaIiYiIh4aGhoeJioqLjI2MjIuKiodXR0xMTUtOSUlLSElKSklFQ0RGR0ZEQ0VGREJISUxHR0dGSEdFS0pMSUtLSkNGQ0NEQkFBQ0JEQ0NERENBPTw+QGhwc3R0dnd6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5Nzw+Ozw6Pj8+QD0/P0JCRT9ohIKFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUpIS0ZER0hISUVFSEZGRUxMTUlKR0dISUpOTU9NTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbXB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDo7PDo+Pz0+PkBBRENJU36DhISFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExMTEpJSEZKSURKSEdLSkhKR0dHS01OTExISElKTVBOT05NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1VvcXZ2eHp7eHh6enx8fn5+f39+fn1+fX5+fn5/f36Af39/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo7Nzw9Ojw/PD0+QEJERE1thIOEhIWFhoeIiIiIiIeGiIiIiIiJjIyLjIyMi4uLi15SUlBNTk1LSkdHQ0hKR0xKRktPTEtKSk1NTE9QTkhJS0xPUVFQUU9PSklKSkxKTEZHSEdGR0lGRUVCQEJCXHByd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7QEE7PTw4Pz09PkBFRT5DRUNHS3WGg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pFRkZLT05PV1ZRUE9RU1JOU1RPTVNMUFNVV1JTUlBMSk1NTUtOR0dKRkZJSkRERUVCRENjcXV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PTxBP0FBRVVMQklKR0pMeYaDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7O1FTUmB1XVVWVFZZWVNZWFJaZlBVV1pdUlRXUVBOUlBQUFFLTEtHSEpIRUZJSUlISWpzdnl5enl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQEVBQ0ZEQ0RLVlBLUFBOUFB5hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uGbFtkVTpYWFhTUD9AVlVZXGRgVllicl5dV11aVkVRWVpcWV9UWWdSVVZYVFRWU09PTUpMSklJTE1LT01Tb3R2eHl4d3p6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Afn9+fn5WSkpJSEdGRERCQT9ITElNUEtJSk9TUlFVVlVWVHWFhIWFhYWGh4iHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUldWVFpadYNZVX2QYVxYXV5XSVZeXltbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eXh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0pJSUZCREBBOk9RUVdYUFBQUVJTUlZXV1dXbIGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpaWFxoYkdPWmlnXVtcXV1XUk5TUFBRVlZWVllab3N1d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWlpSU1FPUVJRVVJVU1ZedXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVVNUXlpYV1dXemtYWlxcXlRRUVBJTk9XVlhbWmRxdHZ2dHR2eHl5e3t8fX19fn99fn1+fX1+f39/f4CAf3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTTk9RT1FWUlNSUlRjZHaAg4KDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JQUU5LUlVSTU9ZUU1OUVNVVU1RU1JQT01MSENJR1JTVFpdbXJ2dnV0dHd7ent7e317fX19fn19fX59fn9/f39/gH99fX5+f39/f4B+e3Zzd31+fmR1fWlxdGBkXV5bWVVRTElMSWFsknRQUVNOUVJQU1tSU1JRUlVVYnN7fH6AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkJCQ0NCP0RQQ0RAQz5CSEdWQElOTUddaVFIRk9GREVGSEdIQkNIR0hLR0RCQUNATlBNUmR0dXZ1c3R2enx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZWJcWFNRUFVSc1dlW09PTkxRUlBVWVNVUVFUUk9WYGtsc3Z6e3h5dXJuc3RzeXh+foOAg4OCgYKAgoGBa0xHPj46Oj5APz8+PmpQSmFFRkhJRUI/SE1NR01RVUpCRT8+PD08PT0/PT9BQ0NAPzw9Qj5JTUZVb3V1dnN0dnh7fHp9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpPUE5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmltbHF1e3p9e3h6fHx4d3hkQkBAQTw6QkNBQUNBW1xOe05PT05LTE1PT1BMS0xXT0lHQUE8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXZ3dXZ3eXx8fH18fHx9fn18fX19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PT15cWklHT1FRT01QUU5RUlNWWFNSWVROWVpbV1lcX15fZWBdXnF3a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSEVFRkNMUU9hV1JYUVBTU1JVW09PUVdQTUpERj46OTY1ODY5Nzk6MzY1Nzk1PEI9ZnR1d3h3eXl7fX18fHt8fX1+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtTVFNQUVVPTFJTVFdYU1RYUUxYWVlWWFhWWFldV1hYaHNrXVZgdGthYV9dZGBfXllVUE1PTUxJR0pLSUhGQ1BPU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk5ODk3ODg0NzU3ODU5OUducnV5eXp7e319fX18e318fX5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFdWVlNUVk9PVVZXWFlTVVRMS1NVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk1NTEpGUFBVWVNUT0pOT1VTVFxWUlVTU09NTElISEY/Pz06Nzg3NjU5OTY3NTY1V3FxdHh6ent8fX19fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVFNWVFJYWFlZWVJVT0pHT1BPT01SSk9QT09OTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUE9OTk1QTlRSUFJMSUxLT1FQUVJTVFFTT0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdVUVNGRkFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+NEA+am9hUlJRQEdUUU9QUFFOUU9QT0xKTExPUE5OUFFRTlBPSkxNTUtHRUVEQjs9PTw5PUc2Njc2RG5xdXd6fHt8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkM4RE1TXWdTUVNBR1VQT1FRUE1NTkxKTEtMTk9PUUxOTk1JTUxJS0tMS0dGRkVEPEFBPjtARTs8ODlUcnN1eXt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT49PUFAQj0+RUhGREZGSUdKSkBGQUFARkdESU9IUVJhXFFQUk9TTk9PTExPTUtNTE1PTltWS01RT0hKSENJSkxMS0ZGRkU/QkM+PUJHP0I/QGRydXd7ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPzs+QUBAPkFESUVDSEdJR0lFQkI/PjxDQUBHSURNT2JlUE1PTVdLTE5LS01NTExLTk5TZE1KTFJJSUlFQklKTE1OSkdJR0JBQkA/RUZFSERMb3B2enl5e3t6e3p3dHh0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTExJTVBNUE9IS0U/Qj05OTk6P0I/PEFCQUFEREdLRkRJSUdHSENDP0I/P0BAPUNFRExNUVRMSklNVEZJSUpMSUpLSUpMTU9QUlBLR0NMR0NDS0pMTk9OSUpJR0NDQ0RJSk1MSVpzbnh5eHp7e3l8dnJwdXJ0eXl2eGpxb2psbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhlcUhLQ0ZHSEdKS0lKTERHQj0+PTo6OjtBQj89QkJDQ0hFSkxKRUlJRkdHQ0Q7QUBCPkA/QkVESU1PR0hKR0hLREhJS01ISkxISUpMSk1dUklIRE5HQkVMS05OUU5MTUpLRkdHSk1OUk5NY25qd3Z3e3l7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGVwRktDRkVGREVFRkVHQ0NAPTw9Ojs6O0FEQT9CQ0VFSUZKSkxGSUlHRkZDQjtCQ0M+P0NDQ0RGTE5ISk5IREhESUxOTUhJTEdGRklJTE5LSkhFT0lDR05NUE5QTk9PTUtJSElPU1FSTlNnZ2Zyb3N4dnt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXd2WFZ1dWtvdHJrb3ZsaG1mX3BHSkNFRURCQkFFQERCPj8+Ojs7PTs9P0RCP0FDRkdLRkpJTEhHR0dGRUM/PURFQj5BQ0JDRUdISUdNUElGRkZLTk9LRkhJRkVERUlJSEtJRkhQS0RKTU1RTk9OT1BOSkpJTVJVVVJQWGVhYW1ncXJvcnl6Z2VoaGNpbGZxbGZsbWdpa2xzbXB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVGQkFAQUQ8QkE+QT06Oj0/Oz4/QUI/QEJFR0tGSkdJR0ZGRkVEQ0FBRkZDQkJCREVFR0dIRkxQTElPSkpMS0lGSEVGRURDSUhIS0pHS1JNQ09PTlFPT09OT09LS0tQVVdWVlRZYF9daWFuam5ocnNiZWZmZGloZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dXZ2dnd2d3Z2dHd1a3N1bnV0c3Bya2tzTUdHRUdBQUBDRDxBQUBDPDg6PT46Pz1AQkBAQERGSEVIRkZIRkVFRENEQkRJRkNHRUFFR0VGRkdFSk1LSFFNSktISElFRkhIRUNJSUpLTUtQU05EUlNRUVJOT05PUE1MTlNXVldZVlheWl1kYGhjamlna19kZWZjaGhna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEFBQkVFPEBDQkQ8Nzo9Pjs+O0FCPj8/Q0VGREZEREdFQ0VDREZGRkpFRUlHQkdIRkdGRUNGSkpHTUtMS0hKS0ZJSEpIRUtLTExOT1JUT0lUVVRRVFBRTU5RTk1RV1pWWllXWl5aWGFgYGBeaGVjYGRlZ2dqaGhqZ2hubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3NzeU1ISEdJREFDR0U8QEVCRDw4Oj4+Pjw8QkI9QD5BQkZDRUJCR0NDREVGR0dHSUZHS0hDSUhHSUdGREhLSUdLSE1LSktMSExKTUtJTkxOTk9SVVZPTFZWVFFUUlJMT1FQT1VZWllcWlpcX19eYGNeXGJkbGNgZGdocoVoZ2pmam5ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0lLSEpFQkRHRT1BR0REQDk8PkA/Pj9DQjxAPkFBRkNFRENIREZERkZISEZIR0lLSkVKSEhKSEZGTEhISEpHTExMTExJTUtNTk1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXV5gYGFgYmVeZGBmaGBlaGpkc3NmamhmbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3cHdJSktJS0dCRURFPEFGRERCOz8/QUBAQURBQEI+QUNIQkVERkdFSUVGRUlIRklISkxISEpKSUtKRkpLSElKSUdLS01MSkpNS01OTk9MT1BSVVdWTU5UVlVTUlFQTU5UU1JXW15eX11eYGBhYWJgY2RlYmRpY2Rpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXVzcHN3dHV1d3Z1dXRlcXNrcHFqcnZwd0pMS0tMR0NDQUU8P0VFRUM9QUFDQkJDRUJDREFBRUdDR0ZIRkVJRkNHSkdHSkZJTEhJSk1KTEtHS0lIS0tOUUtSUUxTTUpOTU5QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmFjXmBmYmFjaW5oY2loaG14dm1oaW5vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2c3FxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHRUFARD49REVGQz9DQUVEREZDQkVHQ0NJRUJISklHSEpGREtKR0hKSUlLR0pKT0tNS0lMSEpNS1pmSmRcS2xSR05OX25VbHNbcXBid2NSUGJ2dWh1Y2F2YVhucWJkdmluemZcbHVgbGtVYHh2aWpoaGZnbG1qbW9qbW9zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVycXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPzxERUZEQ0NDRUVERkJGRkdEREpEREpMS0lLTEdHTklISktHS0pJS0pOTExMTExJTUxMW3NiZHBebGxVTE5lcl1nZXFsbnRncGlfYVlubWJwcGJrampnb3F0ZXRublxwdmdxTktyeXZrYWFrZWVseG1rdmxub3NycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QUE/PUJFRkJFQ0VERUVEQkhIR0RFS0hHS01NSUxMRkpOSEpLSklLSkpKS01NTk1NTUtOTU1bcnBvbnBwbGtNUFFsWE5pYnRycGFtb3ZcWWxQW21tWnFta29teHh0c2lwXWBzbHFqVXV5eG9jXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHSEZFRUJBQj0/P0VHQkdESUVFREJGSUhIREdLSkdNTE5KTE1HTE5JTUtISk1JSkpKSk5PTk5NTE5NTFxoZHVdbHFXbE5PUW1VWmtea2x2YWxkdFRlY05sWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2hhY2l0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJRUVEQ0FCPEJAQkZDR0ZLR0VDQ0hLSEhGSUxLRk1LS1FRTEhNTUhOSklITkdKSkhITk9NTkxKTU1KWnRwcG9xcW1sT1FSbllza2dvb3Fxb210Xm5YYXRfbm9wb3Fyb291c3R0altedGN3eHJqbnpoYWFjZmFiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dElLSEpDRUVFQEA+Q0NBRkNISU1IRkNGSkxJR0ZLTUxGT0pLV1JLR0tKSk5JSUpMSUtKSUlLTU1NTElLS0tTa2JaaV5famNyclpfWWtvYGVlVWtfZFthYlFgbWhcalxuaWlkWm9lZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySUhGSURFREZBQEFFRENHQkhKTEdGREdLTElFRkpPTElPSkxbUUpGSEhLTUlISkpLS0lISkdMS0tLR0hKSkxMTEtJS0xOVFtdVFBVTVFQTk9PVVJQUFFPT1FKSk5QUWRxaVRZVltbXFVZW11YXVxcY2ZhYWZiY2ZfXmZrbWhtdHhydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNIQ0VHRkZBRUM/Q0dERUdDSUtMSEZER0tMSERHSVFLTE9LTFdNSUZFSElKSElLSExKSUZISEpISEhFRkxISUtOTElPXFdeT1xcYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXGJYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJESUVHR0ZLSktIRUVKSkpGRUhIUEpMTUpNUklIRUFIRkpJS0tJTEpJR0VKSEVGR0RFSkdCSU1KS1RfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5fXF5TW15kX1pdYGNfWV9iW2BeW1VZWFpfXmRiYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3V5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUlERktKSkVGSUlOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlFRERFQUVJRD9JS0hOW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1FbX2JhXV5jYWBiYmJjY2VaUllWV11bXmNgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGREdFQkVHSEZHSElGR0pHSEZIS0lLRERKSk1NTExISkpISkc/R0ZOSktLTUtLS0lHSEREQERAR0hBPkhJRk9dYVpbZF1fVFFSWF1cXFxfWktXXExSXFlJTV5RUV1fYmNjY2NiXGRjYmRjZVhSV1VUXVlbYV9eX2FhX2Rsa21qa2xudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktJRkdHSUdHSkZGRklMSk5FQ0pKTE5KTElLSklJR0JISFFNS0tPTUtLSUhIRUQ/RUJISEFARkVDVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVZaYVJSX19iYmBgYmJgY2JiZGRiWFBSUlNcVFxdXl5eX19gZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIRFJLRkhISERGS0lNUEVHSUpLTkxMSUxLSklHREhLUU9NTFBMTEtLSUpERUFFQ0hGQUFGREFWVUVcVF5TVl9YTlRVTlpbTUpLVGBhW19YX15iXU9YYlxgYF9iY2JdYmJXX19UUVBRUllTXlxcXV5fYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElTY1FFV19JR0dIREZNSlBQRklJSktOTExLTUtKSkdFSU5RUU5PT01OTU5ITEJEQUNDRkRCQUNEQExIQkxMUE9OTEZNRkZISUhHTExNT1BJTE9QUFNQTFFUUlVaWFdZV1hkVk9TVFBRT09RVVRcWVlbXl5hYWVmY2hkbG1xc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01eTUhIWU1HSEpIR01MUVFJS0pLS05NVU5PS0tMR0dLUFRTTlBPTk9PT0hLRmBFRF5MRGZjQ0xbSF5bc21PTVZtWUxDUF9UbFdnSl1XVV5ETFFVTE1TVlFSVFhWVFhVVFxUUGZaaGhlWlRrVFhXVVtcXGBgYWJiYmBnaWdubGhyenx9foGEhISDg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1RKS0dgVEdKT0pJT01SUUtNS0xPUlVST1BKTE5HSE1RW1lPUFBOT1BQSktRf1FJfFlZcnNXUG1IcW5vYVZQcXF0T0Jrc25xdHBTb19bblhdVlxYVWtoVV1WY1lgWVpfVlVXf2l0dXVfYXZfWWJcXGZbX2FhYWJeYGNnbXBsYHB3dHiBgYKDhIJ/fX6Adnh6bXZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0pMRlJWTEtPSExSWFdRTk9PTVFUTk9RUEtMT0dNUFNbWlRRUk9QUFFLSVp4XVR4ZGhYUVNQdmd0bHBibmZrUnJPTHdtanJwc3JxcnBvcIBdZnp1eHFxenF+cn1rdX1hUmh8ZXNzb3NzfH1wfnhvf3JfYGBiYlthYWhrbmtibGZnbXd+gYCDfnt4d4B0dnpocn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tISlFPTU5KTlZeWVVMUVNOWVlMU1NSTkxQSVFSVFlXV1FUUFBRU0xIZ3hsY3hxbVpKTFR5cHVtdWJudlBkZElldnFtd2+AamZ4eGlYclJpe21panp6fWx4en9wZ25YdXVqdnVwgGFzaH1pbHh8b19fX2NiXF5kZWZpamVnYmNkbGxwcHN0c3NzeXFyeGJsdGdyeXtzc3V5foFzdnpufH15eHJuTUpSdE5DQkVQUUlLTEpMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBKU1RVWFdXT1VQT05TSktyb3V1cXVxY2hhVm5McXBeR2h5V3ZUS2h4fXhgeXtzbmFdbW9kU2dydW5teXB3bHZzdHFsbVxzfXprbXl8bHVufGxxdnV4Xl9fYl5dX2VlaWdoZmVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21LS1pWSEdFR1JRS01OTExRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTkpUVFZXWVdPU09PTlFJUm1IaXdLYGR2dVVXbE5ubHtyYWpnf3VUS1draH1sbWx4X1pwentfYHpzY3JveHFoZHxpcntdVEtsX3Z1bGp2fHttfnlrfHBdXl5iW15iZGVnZmZlY1tjY2lra3JzcndnbWloZGdgYWxhZ3NybGhtbXJ8a21oa3t0bW1rbU9HSktISkhIUlFNT1BNTFNTUk9TU1hSV1RQV1pWVlRUVGFgUU9OS1RTU1FWVk9PTU5PUUpIUU5QVUxLS1JTUlJST1ZVUVFPUlJYWFFOUFVUWFhYW1tVUVJXW1dYV1tPUlRXV1hRXVhWXVVTT1hSV1dYWVpgXGdyX1tbWl1dX2NaX2NjZWdkZGRjWmRiZ2ZmbW5tdWZmZ2NgZl5eZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUElLS0xNS0pUUk5SUVBMVlZUUFRVWFVaVlJbXVZVVFdVWVhPT0xOV1RQTlVTTlBOTFFQS0pSUUtRTUpKT1FUUlBRU1JJSU1PUFFSUVFRVFVRWFdcV1NSUVFVVVZUWlFOUlJXVVNZVlRZVVNRVVNVVVlZWF5aX2FdXFtaXV1gY1xdYmNkZmRlZWJZYGFjYWJoaGpuY2FkXl9jXVpjXGJtYV5mZmdtc2RpaGtrZWRjZmhRSktLTk9MTVRRT1RRUU1YV1VUVlhXV1pWVFxgVldWWVVYVFFQS09YU1BOVVBOUU5MU1BNTlVTTlFOTU5RU1BUUFJUVE5MTk9SVFRSUlFWVlNYWltZU1VSVFhXV1lbU09TVFdVVFlVVllVUVFXVVZYXFpcYF1XWV9dXl1cXWBhXltiYmNnZmVlYlhgYGJdYGhlZ2VhXl9dXV5aWl9aX2dgXl5dY2hrYWhmaGZkYGJkYlBLTUxQUUxPVFBQVFFPUVpZWFdZWlpYWFZdamRWWFlaV1ZUVE9LT1ZUUE9UUFBRTk1RUU9RWFRRUU9NT1NVTldRVFRVT05OUVRVVVRUUlRXVVpdXFpWVlFSV1hWW1xWUFNVVVVWWFNXV1RSUVhWVltfW19gX1ZfXV5gXFxgYF9fWmJjZGhnZWViWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9VXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1OV1NNTVJPUVJPTVBTUVVaVVRQUExQV1VRVlJUU1hNT1BSVVhVVVVTVVhXW15dXFtWUk9VVlZbW1ZRU1ZVVlhUU1daU1NRWVdXXV9bYF9gVmJcYGFdYGJfXGBdY2FjZ2llZmBaY2BhX19lZV9gY1taXFtcWlpZWVdcWlxbYF5gW15eYWBfY1xZYFpRTk9OVlFQVVNQVVRTUFdcXFxZXlxfV1xeanB3eYBjXFtWVllSTlBXU05RUVBSVFJMUVRTWVtXVU9STlNYVlNSVFJSWk9RU1NWW1VWVlRXWlhdXlxcXlZTTlRWVltbVVFUVFZXWFJTWFtTUlJcWFpdXl1hYWBXYltjYl5hY19cYmFiX2RnaWVnXVxlYGFgYWNkX2JfWVpfW1xbWVhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQW11eXVxgXGBWXF1oanJ9c2xoXFVZV1FPUltTUlFUUlRVVEtSVlVaWlpTT1NRVVVVU05VUVJaUlRVVFhdV1hYU1hcWF5dWVpdVFVOVlZXXlpYUVRVWFhYU1ZYW1NSVl1ZXV1hXmNjX1lgW2ViX2RkXl5jY2FeZWZpZWZeXmRhYWFiY2RfYl5YW19bXFtYWFhYV1taW2BdW1tcW1haW15WXlldUE9PUlpQWlVWV1ZUVFReXmBfXmJcYFVdXmJreXVtfWxaVVpWUVFUXFRUVFVUVllXTFJaVlxaXFJQVVNXVVVTT1dRU1dTV1VWW15YW1lVWl5YX15ZXFlSV1JZWFhfWVlSVFVaWVlVV1lbVVRaXV1eYWJgZWRdXl1dZWFiZmReX2RjYFxnZWhmZGJgZWFfYWFiYl9gXldZXlpcXFpZWVdWXVpdXltaW1xbV1lcXVZYV11TT1BXWVBdVVZZV1dVWF9gYWFgY11gVV1eYmVldoJ7aFhZWlRWVFZcV1dXVlZXXVhPVVxZXl1dVFNYU1dVU1JTV1FTVlRYWFheXlhdW1VeX1hfX1hcVlFZVVlaWmFYW1RWV1paWlhZWVpXVl1fYF9kY2JlZV5iXGBmYmRmZF9gZGJhW2ZjaGZkZmFmX19hYmFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWVFxVV1dZV1ZcYGFhY2FjX19WW2BkYV96dW9oWlxaVlhWWFtaWVtZWFlgVk9UXVtgYVxVVVlQVFZUUlZVUVNVV1tbXV9fWl9cVl9fWl1eWV5WU1lYWVlcYVldVVZaW1pbWlpZWlhZX19gYGRjZGVlY2RaYmZjZ2ZlXmFiYGNdYmNpZWRoX2deYmJjYWFgXl9YVFpaWltbWFxYWFxbWltXV1pYV1xbXGBdVl1dU09WWlZWWlZZVlhXWF5gYmFkYWRhXllZYWRiYGtmaF5cXVtXV1laXFxcX1tZW2JWU1deXWFjXFNWWVBWVVVVVlVTVlRYXV1fYGBdYV1XYF5bXlxbXlhWWFhbWl9fWl5XWFxcXV1dW1pcV1pfYV5gZWRkZmZnY1ljZmVoZ2ReY2BfZWNdZmlkZWlfZ15jYmNhYWBfX1tYWVtZWllYWlhXW1taW1dYWlRaXVxbYFxVXmJNUldZVldaWVtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX1xdXVhXW1tdXV9fXFpdY1hZWF1gY2RfUlhZUFdWV1hXVlZXVl1dXmFiYV9iXllhXV1eWV1eWVhVV1tbYF5cX1lZXl1eXmBcWlpZW19iX2JlZGVmZ2hjWmVmZ2lnY19jXmBmZVppaWNmaWNmX2JiY2FgYF9dXVpYW1lZWFhaWVdaW1pZV1lWVVtdXV1gYGJieEtXV1xZV11cXF1aV1xdX2BiZGJjYV1gWGJjYmBjYWNeXF1cWFdbXV9dYF9dW2BkXFxYWmJlY2FSXFlPWFZZW1lZV1paYF5hYmNgYWNfXGJdX11bX15ZWVRYXV1fX15fW1peXmBiYlxcV1tdYGJiY2VkZ2ZmZ2VdZWdoaWZjYWJcY2dgXGlpY2hpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldXWFBYWl1hY2Zmcmt/SllXXVtaX11cXlxZXVteX2JjYmFhXWJbYmRiYGNiYl1cW1pXWGlxYFxgX11cYWNfXllZY2VkYlRfWlFZV1xdXFtZW1tjYGNjY2BiZGFgY15gXF5fX1pYVltfXVxhYV9dW2BhYmViXlxTXF9gY2RkZmVnZ2ZmZmBmZ2hoZ2RkYFtmZ15haGhjaWhmY2BiYGNiX19fXV1bWltZWFhYVlpWXFpaVlZVTFhYXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnV1dXV1dXV2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3x8fHx8fHt7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dXR1dXV1dHV2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t8e3t7e3t8fX19fXx8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHjF1NLS0tLUk3t9fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqHc3FycnJydD4oKysrKiVikoyMjY2OiX5/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19eNXn5OTk5OeZe39/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjIlyb29vb29yMhcbGxsbFF2Wj4+QkJCLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12fn9/f39/gHl3d3d3d3d4eXl5eXl7eG5vb3BwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHp6enp6enp1c3Nzc3NyeX19fX5+fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ0dHR0dHd1dnd6e3h7eHd2dnh5e3p5fXl5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3t7e3x9fX19fX18e3t7e3t8fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d3fHx9ent9e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3l+fHx9fH18eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3e358eHt9fHx4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4e3x8fHt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgX+AgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXd4enp6eHt4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgoKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCBgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgoKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx9fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLioqLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhYKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhYSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhoaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKiouPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKCgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4OBgYKEhIKDgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBgoOBgIKDgYKFhYWFhoaHhoWGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgoODg4SEg4KDhYOCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Qko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDg4OBg4SFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKCgoGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiYeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5/f4CBgYGCgYCCgoGCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgYGCgoSCgoOEgoOEhYaEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GCgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYGDgoOFhYODg4SDhIODhISFhISEgoGAgYKDgoOEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5OSj4yMioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB/f4GAgIKBgX+BgYCAgoGCgoKBgYKCgYCCgoKCgoKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJOSlJKPjYuHhISDg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf39/f4CAf4B/gIGAgH+BgYGBg4GAgYGChIOBgYGBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICBgYCAg4KCg4KBgoKDg4OEgoODg4KAgICCgoKCgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOEg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SFhIKCgoODgoSCgYKGhYSFhIOEhISGhYSEhYJ/fX19foKEg4ODg4ODg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSGhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyLiIWGhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4SDg4OEhYOCg4SFhYaFhoaFhoeHhoOBfn9+fn5+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgoKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODg4WFhYWHh4WFh4WBf39/f39/f36AgISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGh4aGhYSDhIWFhoSFhYaGh4eHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4OEg4OCg4WEhYeHhYSCgH9/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiImIhoaHiIiJiYmIh4aHh4eIiIaHhoeHhoaFhIOEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4eFg4OFhIODg4KDhYSEhYSBgIGCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiouLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISEhYWEhYWGhISEhYWFhoWGhYOJlJOQjpGOioaFhoWDgYGBgYKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4eEhIWEg4OEhIWFg4OCgYKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4ODgoOFiYqJh4WHhYSFhYSEhoaDgoKCgoKDgX59fn5+fn5+fX1+fX19g4eJioqHh4WGh4eHh4iHiImHiIaIh4eJiISDhIOFhISFhYeIiIaFg4KCg4WHhoeGhoOCgoOEgoOEhIKBgoGBgYODhIOEkZKRjo+Oi4eEhoaDgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgoKEhIOChYaIi4qGhYaEgoaGgoCDg4ODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYKDhIWFhYODhYSEhISFhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+NkI2JhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWDgYCAgX9+fYKDg4ODgoKAfX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4OAf4CAgoKCgICAgIGBgYGCgYGChIODhYSCgoSDgoKBgoSDhYWGjJORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn9+fHx/g4OCg4KDgX19fn+AgIGAfn19fX1+fXx6enp/goKAf39/f35/f4B+fYB/f4CAgX+AgIGAf3+Bgn59fX+AgX9/fn+AgH+AgICBf4CCgICCgoGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoODg4SFgIF/fH19fn19foCAfn1+fnx9foKDg4KCgYF/fX1+foCAgH9+fX19fHt7e3p6eXqAgH9+f35+fnx+f35/gH9+f3+Af4CAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fn6AgIB/f4B+fX+BhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXt/f35/f39+fX5/f4CAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/f4B/f35/foCAf36Af39+fn5/f35+f318fH2Fk5KNjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgoGDhIWDhICBgICBgIGAgYKCg4GBgX6AgoODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2Af4CBgYF/f4GAf4F/gICAgYGCgoB+gH5/fn5/foGAgoF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISDgYODg4KCgoGCgX5+fX19fn6AfX19fX19fX18e3p6eXl5eYCCgoKEg4CCg4GAgoCBgYGDgoKDgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhYSCgoGBgoKDg4ODg4KDgoKCgYCAgIGBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGhoWFhoGAg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgIGBgIF/gIGAf36Ok4yHiIeIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4eHhoeHf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIKDf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBhIaIjIWDgoKBhIKEg4KDhYWEhYOCg4OCg4OCgoKCg4OCgpKQi4iJh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1/fn+Bf4CCgYWFhYaGh4eGh4eIhoeHh4aHh4d/fH18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZeEg4OEhJSTgIGBf39/fn6Ei4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko6LiYiIiYeHh4WGhYSFhIKCgoKDg4ODg4OCgYGBgICAgIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhISGhX98fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fH+Cg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX99f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4yKioyJiYmHhYaFg4OCgYKCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCg4ODgoOCgoWGhISFhYSGhIOEg4KCgYOBf319fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBgIKCgIODhISEhISChIOEhYKEkZGOi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgoKDhYOEhYWFhYODg4SCgYODgoOCgoGBgIB/gX9/fn59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fICBgX2Gj4F+fYJ+f36Agnx8f3+BgIKAfn17ioJ9gH9+gYCAgYKBgoCBgIGAf4uTj4yLjY6NiIeIhoWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f39/gHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIGBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJGLjI2Nj4qFhoaFhISFg4OCgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fYCAgHh+gXd7gIF/gYKCgoKEhoeGhn6IlYp+gYGAgIB/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fX6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYuNjo2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f35/gIB/gIB/f318fHx9fn18fX19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gXx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6EkoyMi46Ni4qGhIaEhISDg4OCg4KDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+f399fH59fn19fHt8fHx6fHp9fn+AhIOCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9e3p7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIqPjIqKjIuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+AgIGBgH99gH9/fn9+fn9/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fXt/fnt7e3x8fH18e3t7e318enp9en6Cf4GDhIKBgoGFhoWFhoaHhYKEkY6MiomKh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/fn5/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fHx+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7e317fX5+f4CAg4eJiYmKiYqJhYiRjYuIiIaFhYOCgoOEhIODgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gX9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CBgH58enx9fX59fX5+jIZ9fX57e4OCfX19fX18fXx9fX1+fH18fXx9fX58fn19fX18e3t7fHt8fHt6e3t6enp7fn6DhYiHiIqLi4qJjJCNjImIhoWEg4KCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImNj4yKiIiFhISDgYKCgoKDgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx+f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX1+fX5/fX19e3x9fnx8e3x9enp5eXp5e3t+foCBg4eEiI2MiYmGhYSEg4KCgoOCgoKBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjImKh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYSBfn6AgH5+gH59fn6AgH+Bfn+Af39/gH99fn9/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIF9fHx9fXx8e3x8e3t7fHt8fHx9fImJh4eFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x+iYWGhIWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen19eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfn6Af4GAf4CAgH9+fX19fn1+fn19gYR/gH9+f4GBf32Af319f31+fn1+fHt8enx7eoCFgoSEhYSEhIWDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXR1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAg4GAf4B+gIF+gIGAgH9+fn5+fn5/fn6FhYGBgH+Ag4F/foGAf36Af4B/fn17ent6fHt6goOAgoKCgoOCg4KBgYCAgoGAgIKBg4GBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dnR6hISBhISDhIWFhoSDg4WEgoODgoCBfn9/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDg4GAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GEgX+Ag4F/f4B/gX+Af3x7fHp8e3yBgH+Bf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn1+e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4KAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgIGAgICAgIGAgYKDgYF/gISAfYGDhICAgX+BgYKBfXp7e3x8fX99f4B8f39+fYGAgH59fYB/foGBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/goCAgYGAgYGCg4KBgX9/g4B+goKEgICCgYKChIJ+e3t8fHx9fX1+fXp+fX55fn9/fHx8fn1+gYCBgYGAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf3+BgoKBgYOCg4OFgn99fX18e3x8eXp7en55fHl4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDhIN/f359fn5+f4B/gIB/gYKBgH9+gIF+f4CCgoCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhYWDg4ODg4OCgYKDgoGDgn+BgH9/fn+AfX19fX+AgIB/f4B/fIB/f4GAgYCAf3yAf35+fn9/fX5+gYKCgn5/fn1+fn5+f3+Af32AgYB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3t7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32DgXx8ent7e3p7d3Z4dXJzdnF3eXJ4hYWFhYOEhIKCg4KBgYKBgIOBgIB/fn5+foB+fX58foCAgH+AgX97gH6AgH+BgIB/fYB/fn5/f319fX6AgYGBfn9+fn59fX5/fn9+fH6Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fXt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf3+CgHyAf4B+f4GAf399gH9+f39/fX18gICAgIB/f35+fn18fn9+f358fYB/fn1+gIJ/foCAf36BhIKCg4WFgoJ+fX17e3x8eXd7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fn19fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNweHdxe4WHhYWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAf4GBfX6Af35/gX+Af3+BgH+Af35+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYeEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYF/goF9foF+fn+Bf4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYV+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xcHd0c3yFhoOEgoOCgYKBgoKCgYKBgYGCgYCAgICAgH59gH+Af4GCgn+Cgn+AgX5/gYF/gICAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgIGBgYGCgYCAf39/fn1/fnuBk416fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoKAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+Agn+AgICAf3+AgH9/fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiXx8fnt7fnl6e3p7jX53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l5e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIGCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBhIOAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359f4B+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3t9e3p8fHuHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdnaFhYOEg4KCgICAgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4KEhICBgX6BgoB/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4CAgH+Af3+AgYF/gICAgIGAgYGBgoGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDgH+CgYWDg4SBgYOAgoKBgYCAgYKDgoCCgoSDf4GAfoKDgICBgICAf4CAf4GBgIJ/f4CCgH9+gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoOCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX54d3Z5eXp8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIKBhoODg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAgIGBgYGAg4F+gIOCf31/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXt/fXp9gHp5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoKGg4ODgoKEgYSDgYKAgIKBg4GCgoGCgX6BgICCgYKBgYKCgICAgYCBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBgoKDgoGBg4KChIGAgYOBgYKEg4OEhIODhIODgoGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+fn+BgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChIaEgoODgoSBhISAg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4GCgoGDg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3p7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoKFhYWDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4SDg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfnp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dX2Hh4OChIWDg4SFhICChIWEhIOCg4SEgISFg4KCgoODgoOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODhIOEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e31/fX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z3f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4SEhISEhIWEg4OEhYSFhIOCgoB9gYJ/fXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f39/fH2AgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoODgYOCf4KEg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODgoGEg4GDg4SDhISEhYSEhIWFhYWEg4OEf32BhH99fXx8fHx/gX5+fn9/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoSFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYWFhYSBf4KEf35+fH59fX+BgH9+fHx+f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOFhIKEg4aAgoWFiomEhIOEhYWDh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOFgX2BdYF6g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4R7hYOBhIOAf35+fn19gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIaEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHOBg3+Dg32BfX5+fX6Cg4F8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26AiHltfXJzdnN2bW14bHB5bHV9f399foGAgX1/fn2Af4B/fX18fH19fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHWCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gX9/fH99fIF+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4eIhoeEhoaLioWEhoeHhYSFhYWEgoWFhYWGhoWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgoSHhoODhoSFhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJioiFhIaGhYWDhYWEhYaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgYF+fn99fXt9e3x9fX9/fX1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhoeHiIaEhoWGhoaFhIWFhIWFhomJh4aEhoWGhoWGhoSGhoeGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SGhoWGhIaEg4SEhoSDgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIOCgX1/fnt8e357fHx9f359fH59gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWGhoWFhYWHhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhIaGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWEhoeGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fnt8fH1/fnx8fn2Afn1+gH5+gH99fXyAfX5/fn5+f3x8fX57fHx/fHt7foCIh4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhIiFhoeGh4aIhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhoSGhoWGhYWGhoWFg4WFgoWHhYOCgoWDhIF+gIB8e31+e3x7fX59e3x+fX5+fH9+fX1+fn19fH98fn58fYGAfXx8fXx8fH56e3t9foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaIh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhIaFhoeFhYaGhYSDhIOChIeDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX18fHx9fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoWGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhYSDhISFhoaGhoaGh4aGiIWGhoaFhIKDgoODh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1+fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHh4eGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYeHh4eIhoaEhoWDgoKCgoOGgYN+goKDgIOCf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiIqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWFhIWFhoaGhoeFhoaHh4eHhYSGhYOBgYGAg4WCg36BgYF/g4F/fn5/fn58fH1/fXt9fXx9enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWCgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WGh4iGhYeEhoeJhoaIh4eHhoeIhoSGhoaHhoWHg4SFhIaGhoiFhYSDhYWHhYeGh4WGhoeGhoaEg4SFgoCBgICDg4OCfYGBgH6DgX5/f4F8f3x9fX59e359fH15enp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoWFhYWFhYODgYOBgIGBhYKAgH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4aHiIiGhYiHiYeGhoeFhIaFhYeFhIeDhIWEiIaGh4WFhIKGhYaFh4aHhIaGhoWFhoODg4WBgIGAgISAg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15ent7fHt8e3t6e319fH18fn5+e3t7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OEh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEg4aFhoaGhoaEhYaGhYWGgoKDhH9+gICAgX+DgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXx/fn18fH1/fnx7iIWFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBhIWEhIaGh4iHhYWIhomHhYOEhIKFg4SGgoSFhIWGhIeGhYWFhoOEhYSFhoWGhIOEhYWDhYWBgYODf35/gH9/f4N/e4B9fX+CfYCBfX6Bfn19fX1/e398e3p5enp5enp8eXp6e3t7fXp7e3t7fX59fYB9fXx8fYB/fXyGg4aGhoaGg4SChYKFgYGAf3+AgH5/gIJ8fn9/foCAgYKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYaIhoWEhoeFh4WFgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhISDhIOFhICAgoJ/fX1/fn6Ag357f3x8gIF9gYB9fYN8fn59fX57fnt7enl7enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn+BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoSFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoOChIODgH+AgX59fH5+fH+DfXx+fHyBgH6Cf31/gnx/fn19fXx8e3t6enp6eXt6enp6enp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoOCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhoSCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhIWCgoKDhYSCgYGBgoCFg4F/foB/fnx8fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRkw9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1dTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dTV1dXV1dXV1dXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8rKy8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX2Nzd3d3d3d3d3d3d3d3e29fY19jX19fY19bX19bX2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubN4c3Nzc3Nzc3Nzc3NzcJK7uLi4uLi4uLi4uLi5sIqKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uzr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6WZMikrKysrKysrKysrKiVhqaSko6Ojo6Ojo6OjpZVTUlNTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8NztAQz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzR0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmmzgvMDAwMDAwMDAwMDArZaqlpaWkpKSkpKSkpKaXV1dXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs+QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183N0NLS0tLS0tLS0dHR0dDc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampq6BFPT4+Pj4+Pj4+Pj4+OW6vqampqampqampqamrnGJhYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI/Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc7Ozs7Ozs7Ozc3Nzc3Nzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Oz87Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRysrKysrKysrJycnJycnM0tHR0tLS0tLS0tLS0tDNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7Ozs/Rzs7Q09DO0tTV1NDPz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tjX19fX19fY19bX19fX1tbW1tbW1tbW1tbW19fW2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7OztHBp9HSuY++1JyChIrGz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Oz8/RnY/DwpSwnLGWuLmvodLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD5BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz8/Tuq+qvqSgi5HDk31+r7DSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/P05+xm7ibh5261NLNnp7D0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/P0cCciZuwm5CfoNLTwKCg0M/Q0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9SjooGeqquvkaG516+iqdTQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NHEn4F7mZaimq2bqdijobrU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DVq6+8wNGFlabFmKLRnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ozs5PT49PTs7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmHf4WfoJ+cm5utx5+h0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU0Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocbT09WcmMOnq6SexbSkptbS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDS0dLXqIfNzZKQp9e5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0s/F1NTLvdXS0cLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6PD0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLT1NLS09XT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk6PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTg0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs6ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ozg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUZDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODc2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY3Nzg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWh4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIN2dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Nzc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urq5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpkbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXhwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tbW2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5ubm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZycm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqam5ubm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVUYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcU19NSFFJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKlqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGVjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKWioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsaGJiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq2mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Necl9oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmloYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqaeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloKGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbGh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLazurGqrrSxsLG0tLa8vL68vL3Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqTlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGw8O5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsae8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbGhxeG95aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2hndVpmcndzeGZnXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8nGw8PEwsS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamhdam9teHdjYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjHycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytpqm7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWl0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHGwcvLx8bMyc3FxsbDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlldG5zYlxiVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHDxL+/vsTLyMrLyLy7yMfJzcjDyMnJxsXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu7vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cm9mZWdjamRham1ubl5YXFZVTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsG5u8O6uLm8vsHGwca6ucnJw8XEwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZmNaWVlcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/ur3Aub26urS/uLW3s6+7vLfAt73Cv8G7v8G8u8W+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5h31xY2BiYmdqZmZpZWldVlVTWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W6wbi+uL+8vbe1t7CuuLa5v7vAv7fBvLvDtrrIuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVrZ1hYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v728sq2vrLGwt7y2u7zAxLm3t7e1urm6u8C9w8C6xMK+x7i5uK23tbi6tLezu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD08Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72/u8S3tri2t7+/xLzCxcXHx8rJxs/CwbiutbW8vri7sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bndjZ2FcY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz0/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6qjsLm9vrO8vrzFuLK4ub3HycrDx8jGxsnIzM7RzMrEtbrAw8i/v7W/wL/Gxr/LxsO/wbzAw8zKx8XGwbm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYGFOSE0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS8w7y6ur68xL+3vb+9x8zGx8nGxr/ExMrIzMzNy8bCw8vOwry5vbq5wMO/yMbEwcG/xcDKycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE+PkFCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy2ur3BvLu/tr/Bv7y/usDLwsfIwL+8vL/FwsfLyMHDwMDJysLAu7uwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem1zeHNncF1bXlxZUUVEQ01JQUQ9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u726w7u3vbe5wLu6uLi1xcHDw7u5s7S6wb2/x8C5wLy+xcS9vrmysK64t7/Dx8PEvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbmlcX19ZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucHAt725uLm2tb+ztLK4sbvBwMO3t62wtbi4uMK6tLu3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2VdW1RKPD4/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7e6t7a2srTAtrK0uLO6wMHDubizsrK0sre+urO1sry6vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnJsXmJgW11OSEE/PUhDRk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27vLi2uraxwLq3ubi5u8HBxMS7u7a0tLC2ura0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJuY1xmWFxdUk5NQT5KQkBKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7GttrqurLyyuLm3u7+9ub7AtL+7vLq4vsK8wsrIvsC4ubaytLaztK+su7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEFGTUY4NjY1OjY6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm9tbK4tLm6tbm7tbWztbu8wLu+wLS/ubm6sbrDvMLKxb+7v7+5tLSzsbGusLm5try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Ojo6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSYnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEg/SFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6tr7Kyurq3t7W1vLSvtKu2urjAxMG7tby9uLKts7CvrK62trK0tK+qpJ6bnJyeqKifoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moqquepaKbo5yVkIyPj4+TkJeVlpifnp6amaaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HT01MQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpayqqLWysbCur7Knpq+jr661wbq1t7K3trK0q7K0rqqrr7Cys62lnpKYlI+ZoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqmwo6WnnqCclZOQj5GQmJCWlZiXn5ibmZujmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUlIR05STkpORztEQD0yPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJiXlqGorK62t7q5ure3u66ooKGpoaCtq6qmqaSpo6SupaystLy3rLKxr7Gtta+vs7Wqp62so5yZlI6RlpeZmZygo6KbnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWZlpuXl5ignpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeHlgYlJVX0hJSUtTVElSUEw4PkI2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5OcnqOorq2sq6uvqq+pn5eepZ6epaakoKKfpqCirqusrbWytqavtKupqrSxsLC4raehnJ2alJibmpGOkZWRjI+OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GtsbG0qbGvopmcnZ6hmZubmpiZm5SWm5aYnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVtTWllNUUpOTlVMUkxBNz5CNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT83NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKSnJihnaqip6Cep6Gln5ySnKKbn6Gjnp2gn6Ogoq+urK+xrLanrbGtpqawrq2ssKegn6Kgl5GUnKGcmZeSk5+doqSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezt6yxtKOgnaWgrKGhoqCgmpiWlp+bm5ikoaCepKGgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUVVIRlVWSkJNRz1KSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuOk56ZqJ2unqeenKGdnpqZkpmenKKioKCdop+fnp+pq6esqaq0q6utq6Wlq6iqrKqln56ZkpKUmJmWlpaMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7Whq6KpqLKpq6inqJqZnpqqpp+Zp6Cfn6eopaSenaqiop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQlZNSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJqqoLGit6OwpqCenZ2XmJaZnpucpJ+fnaSdmp2cpKKko6Kqr6ynqaOgoayurqqrpqCenqGjnp6em52clJOVlJ6emJSGnpqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64tLvFw7zCu7ezqbKtqrO0r7Ouqq6jnauntrGsoq+loKOvsa2wpKSvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cmtrdXJwaFdbUUVUSERJT0g+RUEzRUg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqChnZyYm5+gm6Cfn5elnZWbm5+anpyepaannaCgq7Gup6Sko6CepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvcfGwrfDycjCwMW+ubS5urW7t7C1sqq6sq67tr66uqq3rauquLq0vK6tuKOlop6npaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSakZydn6Sep5+en6KdmJmUmJSIhH16cmtkaG94amVaW0ZKTEREU0xEQkQ3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWVmpaUm6SmnaGqp6KrrLy8v8PBs7K4p6Ghq6qinZ6hop6cm6CSn5+Qlp+ZkpqWnZuZo6Gvs6mhmp2dn5+al5iXkoyPlpeTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczIydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdLTzNPQ09PMysLFxsbKx86/ydDLxsTGxMG7w8G+vr61vbOtv7/Cw8bEx8SuvriyuLzEwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJREJANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJujrJ6frqalsarFxszOzb+wwqmlqK2tqqGdo5+cnZqpk5mhkI6gk42UkpeZpLGxq6SgnaCbmZeUk5SWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19HX0tTV09PIzMfNzcnSzM7TzcTHycrBxcvGyMjFvsKzs8fEy8rKzsXKv76/vMHHxMzMyMm/w7+tsLOonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi396cnV1Z2NndmlkVldRRE1GQElRQj1CPDoyM0A8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbS4rK6jn6Sjn6CkrJuWqZaNl42MjZemsK6lnZ6doaWhnpuVlJaUin13cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dPU1NPP0sPQ09bX1dbSy8nO0cvGzdLK0tXW2dXX09bYztLJztHMztDM0s+/x8bKw8zMy87PxcbHtr/Jv9LNy8/Fyci/w8LIzszP0M/MysfNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8d3N2b2NgZXJiXVJcSUpGQUVIST47QDg9NDU4NTo3Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSim6mmoqarmqOwsamotdDU19rSx8bLtLbCxrK2qaKlpqGiq7WnmrGhlZSMkKatq5yVmKGdm6Gin5ydm5WKd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M/P1dTU0dLM0c7T19bT1dDP0tPRydPRyNDY19jR19LX2dXWzM7Pyc3Ry87Pv8XCx8XOzdHQ0cjLzMDKy8XTzsvOyMTJxsbIzMrT09HVz9LM0sG5xbGlqLWup5qorKWdsqiws6ysk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx7enFzdG1hY2ltX1ZQX0pKQkZDUU0/PD40NDo9NTI3NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqaCvrqqqrJ6mrrioq7fY1NXZ2dHO0MC8zMm3wK+nq6mjpLG2s6O2qaiooaqpoZiWmJqbnaGemp2elH5yZWNiX19hYF9hYF9gYF9gZm1wcG5rb3J3d5vMwNLV09jY1tnR0tLXz9POy9PN1dTSys/M09bS0dbNz9XV0cbR1MrR1NXWztLQ2NjY18vIzcPJzszJy7/Iv8jJzc3Py9DNzsvOz8fLz9DKzsrCycbJzMrL0dLM09HQz8/Kvci5sK27uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIeXZvcG5rYWRucGFXXFpJRkZETFdFO0A8MzM8PTg2ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappueo6eeuLa1ta2lra6+tLHA2dLX2tzWz83Lw9PQwsKyq62urKazsbirss65q5+clpSXm56fn52UlpeViWxeXl5hZGJgYGBhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dTLzNDR08rO0dXS1dXKwMrBxczCyMnCzMPFyMrKzsrMzM/N08vFyM/MyMfKxMbAxcnLzdDRxtDOzc3Mz8XHwLe5vcPDvcO5srO+sbzExLWqmKWhmZaRlZWSi5SNm5GUlI+PlIKJhXhwcWtuaGBgcWhZWGhWTUdMSVBQQjtEPjs2Nzo4OTo1Nj09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcXDwb+7tbKxx8O5y9XW2drb2MzMz8nW1sXEuLK2qqSurLm5sLbVoZWOjZiWkJOSkZaWlpCMfGViYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0sjLzs3G0dLPzszUysfLzs/Hx8/Sy9DPxbrEvsbJvcLGyM7EwsfAx83Hw8vJy8/Hw8PPyMbBxsfDvsDHy8vMzsLKy8jHy9DExce7x8PIyMLPwL28v7DByse6vaqxsqelnaKcmJCbkKSZl5mRlZiJj4J3bnRkbGBeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WzsazJzcrIxL69us3NxtDV1dna29jQytDQ0tTKxbq+vrCot6u+urfBrpGOjpaQhoOEhIJ+hYV/dGBbXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+yMbCw8DDx8rJyMrIwcXMxsjLzcnEwsvJwsLL0MTLyL+5wbvFx72/xs/Kw7/Du8nGyLrHxsTKwL3By8bFw73FvLy/w8TLxcW8wMnCxcfSxcDIv8rKxsjG0MPDxsOvxMvHxMq3v7y6tKmspaWYn5iso6GlmqOgm5R7dnN0ZmpbYW5tWltYUURMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8fNz87N1dDW2djZ0M3Uzs/Qy8S4xsG2tbyxwLe6sJGMk5eHe4CFhoB2eHVycF9aW11gYWJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKxtrqysrOyscK8vLu5uMDBwcW+vbm9v7nEysXGwr3GwLi7xMm/wsm7t7u6xcO+vMHNwsa+vrXAvcO6vMa7wrmzvMXDwsK2v7W1vr+6y8O8tbrIur+9y8PBxcLGyMbIxtDGwszIssfKw87NwcXCv72yt7Czp6ioubGlrbCrrayUeXZ3amVoYGhvY1ZeWUpFSkZIS0FGQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8bCxMjO0svKysfNzs/SydHG1tXW2M7M0MjNyMrFvsrBsrW6t7u2sJGNiouFeYCGhoB+hHx0dWRcXF1eYGBiY2JiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tLe0s7KzurW9sbewta+yu8K8wcS8v7u1srq+wLjHubS7tsDCvLe9xsDDvLWusra6vrPEt7u1q7i8vcC9sLq1r7a6ssW8tq+7v7S2tMW8vsPFwMPFxsjLxsDGxrvIy7/PysfDxsHDt8O+vba5vsa/rLW6tbe2jnh0eGdnZWJrbl5WXmBGS0hISkZCQ0FFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzsjGyc7M0M3OycvJzMrLxtHP09HPyMvGysbEwL3PvbO5vbm4t5yOh4mJe3l+hoZ3eIJ9dGheXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5oZmpubnJ8pMe/ubi1sKysp56iqqeeq6yzramrqbOutrCyqa6mrLK8urbDubq6saq1ubu0wrqwv7G9vbu1u8e5wretqqiwscC1uLyvsKexs7S7vKuttaWutq66sbCqua+tu667uLu/v725wr/Hw8XBvMbByMu4xcfFv8fDw7rExsK7xcnMy7O5wry6sohydnZraWFibGhZWFdbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj05QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bGz9LMxMbBxdDIz8LEx8HGxsXFzMTLzMLEwcjBury7yre0vL22tauRiZCQfHl+ioV6e4SBd25eXV1dXV9gX19kY2JjY2JgX15bW1paXVpaWVpdZW5vaGZnaWtucoGtubC1rqalp6eaoKSgmpylq66jp6KrqqyqsKOmn6qttbaxvbmvuK+orri0tLy4s7yvt7m1sbvBscGupaiirLGys6e8qquoq6yttLSmqK6hpK+psqWnqK6lqLessLK3ubq7sby9vr7Ev7XBwcfIt7/AxbfEwr+7v8TDvsTIzMq/vsPAwKmGcnRyamldYW9kV1ZYUEhaUlNLRkZFPj9AOTc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3usSwtrCbmZWcmKqpsLGztb2vxtHQzcTIu7vMw8zAvMq5wMbAvMy6w8fFur3Evrq3vca5trm7rrKVg4mNgXt+gH54dH98c3dmX11cXF5fYF5fY2NhYmBgX15dXFpYWltbWVhaXF9ma2ZlZ2Voa29yhaqlrKagnKGllJ6km5eRoaOqo6KfpaWnpaygnZukpqyyr7a3p7Csp6q0q7S5sLa0rLa4sbC6ubG3pJ+jn6exp6uouaqkpqeop7KtoKemn5ukpqyen6ekn6Cxra2ssrSytLC1vLa7wcGyur7DwbK5usKzwL2/tbi7vb68wsfEwsO/v8Sgg3dwa2FlX2tvYFVZX0hOaE9UR0VKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc3NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBu761oJ6VnqGmurars7O7s8XQyczDx7m4ycLOwbrLub3Iu7fIu7fExrO+xby3sLnAu7Gzt7CihIeHgn15dnRvbWtqanFpX2BdXFxdX2BfYWNiYGBgYF1cW1xcWFlYWFhWWFtdXmRjYmVnZ2dqbW+Inamgl5WaoZabopiVjZ6hoqabn5+jpaGnnpuim5+qsK2xtaKpqqmrrKS1uK23r6yytK6yta6wqp+dnqOisqSlqbitoaamn6isq5mfoJ6ZnZ+lmpmjnJudr6mrp6qrrK2wsrivuLm7sLa7u7qrsrK5sr20trGxtbS/tr3AvcPBuru9l4N6cmtfZV5kZFhUWF5JV11LUEdJSkZBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZukpsCyr7astLfG0MnJwce8vMXF0MC8yru7wbu2xbi1wcGzwsS8raq1ureosbOpi4aIgHlzbnBua2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taW1lYWFdXV1hYWFteYmRkZWZmaGlrco2onZSUlJuYm6GWlpCcoaGonZudpaahpZygoJqYra6trrKgpaKtq6ehtbCxsaynrrKnurOmtqGinpqjoq2ioam1qqKjpp2lpqOWmJ6XmZqdn5mXnZycm6yhq6ajpKatq7OzqrSwsqqyubSvqa+ysrK3s66prK6yuLC6trm9v7eysZSFeXVlXmVeW1lWU1pVS1tRTElFSEtJQj0/QUFAQDoyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr69v7OdpaOYpbHCtba9rbS4w83JyMHGuMLByNC6w8bAtry9tsO6tr/Btbu/u6qmsbuxqLKvm32FhYB5cHF0cWhmZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFhWV2FkZWNkZWRkaGp2opyUlI+Ulpefl5mUmJ+eoZyWoaGoo5+eqJybmqqmr7Crm6Ojt6qgn66otqmmpqywo7ewpLegopuYmKqmoZusuK+ioaScoZ+gk5WhlJaWm5iXlpeclJ+pnamjoZ2jqqqwrqi0q6qmrbKwpaqusrGvsK6vpqensq6xtK+8tLm3rqOUgXl1ZF5hVllXU1JUS01eTFBLR0dMS0U8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunqeno6q7wL3Aua60uMLNyMfExb7HusrNtcTFxbG/wLnAwbrAwLm6vbeoqLG7pqmipYmBfnhyamxydHBpaGVkZ2JcXFpZWlxcXF1eXVxbXF5cW1xZW1xaWFZXV1ZXWFdXV1VbY2NiYmNiY2RmaoGWk5WLkZSTm5mclpaboJyflaCfpqWkpqefnJ+kn6qvpp+io7aooKGiqLOhpaekr6Wwray1nqCdlZSpoaGUrLGwnqKinZ6Ym5OLoZSRk5eYkpeXmJadppumoaKZo6Wlq6SlsKelo6urraWorq+uq6iqqbOlpquvtLGuvLWxr6+gknp2cmRhXFpdWE5MUUdSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7K3rJ6kp623u7zBxbqxubXFysvBxMfHybjIxrXFwsmvurzCvMPAwb28t7q2pqeytp6iipmIgHdvZGJnaWhmaGpnam1gXVxbWlpZWlxdXFtcXl9cWllbWVlaW1dVWFdUVFdVU1RSVWBgX2BhX2BhY2RpgZSTiZGOlJKTnJSVlqOZoJacoKWhraWkpKKjoZuqqqWZnqWxqaCgnaSqnaehnqysqaitraKhoZSXo5uckKupsJufop6el5iTip6SjZKTlY+YmJKboaKcpKChlaChpKabo6uloqSqo6uupK6xqaalpqa0pqmorbO1tLm6r6qsnotycG9gW1dWVVFGUU9IWlxPUklUS1NMRUdJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw3Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5NTc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCssq2dp6evubmzwMi6tcCvxsnOu8LLzcm3y7+0wMfMsLa9yLvCx8S9v7e6taWrsK6dmoeOg3x1aWpqbWhqbG5ra21lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXl5eX19iZG2Oj4SRho+Rj5mTlJKcmqKcm6CnqKqoqqaopKOYpK6klJmlr6mfm5iaoJ6umZuqs5+lpp+jo6GUk5uWlZKoqa2anKChoJqUkIyZjouQjJKMlpSQnaGgo5ybopWboKKgl6Koo6Koq6Crr6Stt6Wjo6Ksramoq6+zuLK9tbOrr5iDcnJoW1hZU1VSRVlMUFxZTVROUExQUklOSUI8Pz9BPz02NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MDE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zrqiztq6pqK+tm6morLe2rLzKu7a/rMzHxrnCz9DJtca+ur7Gy7WxvcW9w8bEvcGzua+mq6+rnpeGgXd4b25pbm5ucWdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVUU05QUVlaWlpdXFxeX2Bkfo2Bi3+LkIqSjZeRl5mioJufqqmmraqnr6KnmZ+soJWWpKinnZePjpmdrpaXp6qZn52UpaGekpCSkpKVp6qkmZmanZ2WjYyLlIaIjYOQi5KUkKCeoKOXlZ+VmqCinpObpaWnqKigsbCmsLynoKOstKutp7C0sLm1wLGtsauQfXByYlZUVU5SSUdWUVNSTExYTUpMTlJHTUtBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY3NjEzMjEtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s62msbeqpqKwq52qp6mysaS2xrS5urPLxrq8w8vRzLO5ur7AxMe2tLe9s7u8xL7CsbSusa6xrJyiiGtobm9yb3FrcGtkZmdlXlpZWllaWlpbWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen91iY6HkImYiZSUl5uZnaibn6qlpKqcp5igpZuSj56impeWhIORmqOPk6KclZaVh6KampOLjoqPmaOnnJWVl5uQkoeUjoyBi42AkIqSkpGhmp+hlZOYmJWipZmMmaSmqKahoLSyp7K3oZ2it6yqraSysqa1vLWrq7GjiHhybV1OUFFMT0NOTk5QS0ZOTkpKTk1RSU1KQUdLSEhDPjg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKiktLzEyNzc2Ojk5OTk4NDk4OEE3d7anpLawpKekqaWgqaWks6qissO1tbKzx8e4u8TKzce1r7y/uLzEs7OutqKttcS6u6+qrLSvr6CXqH1eYGdzcXZxam5pZmhoal9YWVhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTk1LTFNXV1ZYWFlYW11hb3N2cYWIgoeAkYOOipSRk52gjpqcoqGjmKSWoZuVjYeYmoxzjYJ9jZaWhZCZkJOOjnuZjpyMgop/iZifop6Qk5iWhI6Ck35+dImOepCGkpCQnZqZmpCVj52OoqOOiZqgoaSjm6K0r6yvrJ+YpbmmpbChsK6csLuqqa+qmYF2cmJWTFFPUE1DU05MUU1DUFBISU5TTUhKSkRKTEVKSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI0ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3e3oqO0qKWlqKOmpaamprOnpbTAuLC0sMrGubrCz8e/ta+9w6+xx7Ktp6yVpK6/uLGwn6etrauWlaJyV1ZfaGdpaGluY2poZ2JcWFhYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVV1lbXWlscm1/hXx0Tlhyj4KXho2cl4qTkJ+XnZWUlpSOlol/k4lfO1dve4uTiX+LkYyPhYZzioSWgXmCeoWTnZSDlY6Qj4KGfZJ4cW+FjX6JgJCNj5eZmJOKj4iciJ6Xh4iWnpqhoJenr6itqaifl620oqatmKyrmKe0oqmto5J9cW1fWk5TUVZMRFRKUE1MRk9PSUVMUU1LUEpJTVBGSUg9NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKCsrLTM4NTQ3Nzk8Ojc5Ozg2QTl4t6CjrqGmpqqgp6mnoqmwqKe0wbmxtbDJw7m0v8/AurGxuMSrrsmup6Oehpuiuq2nqJampaShl4+WaVFNUlZaWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbW9pe4J0UEJAf5WRkX2JlIyEio2bjZaVipKIhpWGeYh/YEpRbniKkYR8hIyJhH9/bn5/lHd1dniEjZlwUY2IioZ7fniUdmd3hYh+ioiVio2QkpaLg4mHlISajIGEkpuWnpyUpKOnqaWjnpuwq6GkpJCmqpahqpyipqiIdGtlXVtIUVFTTElVTVNJTExQSUhGS05MTVRLUVFPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTc7PDY7OzQ3ODs3Nzc1MzQ0Njk2LzMvLjEyNTIyMS8sJykqKiw0ODMzOTc5Ojk5Ojo6Oj85draco6edn6Guoaeopaeor6yqtry2uLazwry3qLrJubepqre4rbbAqqKbk4OPmbKfopqNoJaZlJGLjGVNTE5OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4aBe4WMkoGSmYuPe4aPf3V/eHNudXB0jY2BeX2JqoV5emh2e45wcm14gYqMknh6gHuAdnNykndndYSEhIR6lYmIioyLgH+Eiox/lIN7gI+YlJuVkZ+dqJ6foJ6gqaWfnZiMp6SToKCWnZ6kf3FnYFxcSlZPUUdLWFJPSk1NUkpKSk1QSExRTFJUTUVIQTw3Nzs5OT49Ojs8OThAPzo6Pj03PT03OTk0Nzc5NTY3NTI1MjU3Mi8yLiwvLzIwMC8tKygoKS4xMjcyMTk4Nzk4Nzc1Ojw8N3aumKOhmJyes6mvqaWsrLCxqr20sry4trq1sqC3u7OrnZ+tq6y1s6WelpKYhpSklp2Mg5eJj4mGhoNmSklKSUdGSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFlYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FSU1ZedYN9eWd3jZeYjo99Z3mBdnh/iY98hJiSgXKHj3x2e29rfq18c5CKf3uGkoB9f3RmdnyFbG9oc3yJjIeAbHlxfXBtdY9xaHGAfY5wQ4qEgoOFfnd3eouFfYt6dX6Oko+YipKam6OXmZ2bnZ6inZaNiqSbj52XjpaYjnVta2VhWVdYVFFKUlVUT1BOUVZLTktOT0pRT0lPT0tGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppefnpagpq+srqunqbCvsay8uKy7vrmzraibsaitnJCXnqesp6SbnZOIln6OlZKVgHyKeoWAf3+BZUpHSEZCQENESUxMTVFSUFFTVVRUVVZXV1dYV1lZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWJ7eG98eYiPeXyLhW9tjJF4c3hqan+CcpaRi4F9ln9JkphuaHd+gWxpY2x5hZCShmtzbHxucnuGaG1wfnONiIOFen1+e3ZvdHSFgnmBd3B8joyKk4OWl5iakJOWl5mXnpeMg4mfkYqSjIaQln1saG1ubVdVV1RRUVlPU1VVVFhVTU5ITUpNTktDSU5HRUA6ODk7OTk6Pjw5PDs6Oj0+Ojg6Ozk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5manqStr6Ktqqi1r66stL+rvMK/pqOalaWYno6FjJaipJualJePdpF+hYuQj3x4fnR9eHV3fGZPRUdEQDw+PkFGR0dLS0tNUFNSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganJBmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplfnBtf3qLiHWBiIZ0bJmRdHN7amudjkx5hJKJhI5nMXaGc2x+fYN0ZmV0foSEhYBmaWx1a3B/fGdwcHtuko2Oe3N9fHFwbnVtgn53eXRpeYmCiImDlpOSkIuNkZSVj5eOgHmIl4iGiYZ/kId1aWluZ2NXUVlXWFlbTVBVVlpZTklJRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYsKzU3NzU0NzhpTzg7NW6SiJmRmpakqK2esp6muq6rsrDCsrvDx5uXj5SZi46GeoWRmpaPko6SiXSKhHeLj4x/dnd1eHZveHNpVUZJRD88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7OgcXx4bX1tcYOBhYF5hIaGeXKglHR4gHN1lIc1cZ2onY6hoYSihHZwhnyHfHOMrY2IgGhmYmlucm1wg3Vpb1h1b46akXZsf3p8bXFtcH96c3VtYnaEf4aAhZCRiouKkouRjIuPg3V4i4+AfoKAfY94cG5ual5aW11bWVhgX1NOW1tZWExISkZKRz9DQUJHP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnnq+VpbSorbGuwbO6wcaXkIyUkIGJfW6CkZOKhIuIkIh2hIVvmIqMf3l7e3F7dHxrb15KUEc+QDc0NTg7Ozw9PkBCRUhMTExNTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHaIiHx9hYN/jH52opl5foaAhJmFm5xhhqqfnYuCkI16dol+iYiOc4qXj4N7XGRxdHp7d4psZ2lheG+Fj4J6boF3c4R6cHN5d2tuaV13h32HfIiHj4CLk5eDjYaNhn1xhH+EfHV3e32IdG1xcmRlXlpaXVNbZl5YUVVZXVZHS0tFTEc/RkBEQz9BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XIx3iX+UjJGdnZ+mkaCqn7Cpr8Cxu8a6lo+RlIh6hnZrgIySg36LhZCNeYSCdaKGjX5+goBzg4F9bHlsU1hMQUUzMTEyNjY2ODg6PD9CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5e3F8j4x7fImGfpeHdqGZiIePkpSljaypSIatr6+KgICTioKLgoSRqIeAmJiKnHNsfIGGh32OaGdneH5uhYaBhXGEhkdrgHdxeXZobWtfd32DiH+IhYx6lZ6ciouJkX97dYt2fHdtb3d+fXFxcGpaW1taY2JXZ2VcVVBRWFpRRExMR09JQ0ZDQ0FAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWHkY+WmJKXoJ2soaa4r7O9tJeNkouYi310cH+Kk39+jYOUlX2Gf4elh4mAg4iGeYmLgHWFeV9jVkxDNjAuLzIyMTIzNjY4Oj0/P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgISChZGTfoWJkYGaloKgoZiVm5qlrZOZu7Gnu8fDp4qMoaWOk4mBkHtyg56fkZx+doWFi4+HkGlob4OAdIyGhItxhoJ3h397doV9bnZ1Z4GUj4aJiIiJiKKro5aJjpiAe4KJenpvZ2t4fXd8cWljXFlZXGhcYWZfWk9MTlhTUUlQS0ROR0NKRENBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudnBneIN7gIyAgZCPi5qapJyhrKarr7CXkpGEoZSEeHeAjZR9f5KGk5Z+ioGSm46EgYKMi4KKjoSAioBtcGpeQ0E0LS0vLy8vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTVFRSUE9IREI8ODcvOUM+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKGSo6mlo6yTqLaip8HCrsiveLqUmnyMoZ6YhJOFgo+hnpOZkoSKhY+YkZZscHWJi4GVjI2Pdo+EcWyFgYqWkoOFiHKJoZeHk4mPj5eltqmbjZWig4eThH5/a2psfX59f3FfW2JeWWZqXGxrX1hLSE9TUU5NTEZJUURETkZCQ0VHQj45OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCDcHWHcXaRhn6XlpqUn5+bp6CqlpOYnmhmpJp+hZOSeoGSiZKSfYuFmZKRg4GBi46JhpGHhIiFeHh/aE5SPi8vLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6emopmhl6KVnJ+onqmrn6isqaq1l6u/q7bIybfI0c++m6Bwaaupn4STkoWcoJqamaeRkYiVopqad3p+lJeRoZKWl4GUnnt2lZKrs4mNl6B9lZ6cjpOWmqSjp7awnZGZqIiXkI6BiGxzc3t8eW5mXltfXmFnY19nZ1xSRUtLUU9JSk1GRk1DSExGRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1NDY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjNBQGliXlBxdWBufWF3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYiYjXmCjYuOjXyKho+QjoGDgImMiYWThYKGiYGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1GSEBBQDg2NjI8OTtGSEdJSU1PUVlthpB3lYujp6q1vbilrqysqKm1rLG3srKtu7GzvpyzxKy7ycu4w7+3paOwsqytqqOLlpiFpaagopiCppmNoqqopIeFk6OgoKqgpKmOnLGLlaOnt7ucoaOwk6Odo56RpKKrsK2ztaKVpqqJmoqTipV6e36De2VeZlpjYF1iYl5mZ19bT0RKSFRPRkhMRktHRkZIQUtGQ0ZGQTo4Nz08ODg6OTc0NjU4PDU0PDc2OjU0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gZSFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyPi4p7iIOHkY6DhYGMhoWIkoaChImGh4eHcW5hQEU2NDwzLzExMC0sKy0xLy00P0RBTlZRUlRVVVdVTVxRR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcfEq7PFtq20wLO4vra/tMG2u7ukuMaptsnHtr65tKijtK2wsZuZkpqfiaevqqSVd5+kl6GrsbOYlqmtqK61u7K6rK+1orGssrW8uLSutaCoqKOom6mwrbO6uLionLipjaWPkpOgh3mBgHJXX2JVZGBgYV5fZmBbVUpERUxWUUlKSkVKSEVBQEBLREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFxaUWNkV3p1cYGVfYSGk3aGfoCNe7+7o7yCtJSTjpuPhIiPk4qJeoeBjJONh4WBjoCBio+GgIaIhYqHkXp5bl1XQEVOPDY6NDZBQjc2NC8vNkNIQ1FcT1FVV1VdV09fVUlLSkFAP0dLRkZEOz5AN0Q3P0JKSkVHV1RQXo+kraSytMO2uMHMyra7xL2ztMG3uMK1v7C4dLG0prrFpLDGubGzsrSopLa2qrGgopabopKlsa2lraynpJigrLO6oqiyubW7vsy/xcW9vbPCt7q3v7i6uLqtrbGmsaquvrC9vMPDrJm7qJWuj5iZq4l+gHloVWFfVmhjaGRWW2NZVlRKSEdMUUdESUpBSUQ+P0JCS0BATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1RZVlp3anB/j4SBjoVve3J4iGK5oZmjiZWUlpOUlI6Ql5KHh3uHgY6WioGEgYp6fIuIhnyKgoGLhJV9eHp1Zk9cZEdFTDpRZGBbXlNGPztIUERaY1FRWVlaZ1pTYGFNU09FQT9JSkhFRkFAQz1FNkI/SEdLTVNaVF6Ur7i1u7nJwLu9ys28vMG8uLa8u7e+tbqzxmF1sqWxmp6rvqqlqKuqpKKytaCrp56Vlp6Yn66lp6eln6SToqews6iysry2wb3TycnTxsLFzMLKxMC+vr+8vLi0sLm3t8O6xr7EybCeuquirI+lqbeJgHxuXV9eXFVfXWhlU1hhVlNWSUVGTktBPkhEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUVFJQT1FSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBKTVBSTFFdaG1scY+NhpBzbHJydIjVwLWaoI2VmZmRjpeSlpaOhoh9h4ONlop+gn+DeXuLhId7i3mBioKXf3R9emtlcHZZXVxQZWViYGVkXVtYWFxNZG1VUm1uX29fWGdlVVlUS0RCS0pIRkhISEhCSTlEQEhLVFRWXVpck7nAub64xsG7ucrLu7a6tri5tLi1ta62t5lkdamerXBeoq2cmKGim6Seq6WUn5+QlI6WmJeonqafn5qZg6OdrKSqsa23sLy41NDO1s/JzNLMz87Kx8C/wsq9wb3CwMXExsrAyc+0pLyxtbCcrLm9mn12aVtdWVdbX1hiYlFbYVRSTENCRkdFPEBGP0JJQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjsuJioqKC0uMCxATSsvNTRtiUkwSIl0Pz5CREBDREdLT0RSXFppYG+XkpGUbmxvdHWHs6yhoZ+LmZyZjY2VkZuShYqKf4iHjJCLiXyBhHN7ioOFe4p0gYqHlX90e3lsbXV8aXNlaWxoZmppaWBmaWltWm10l62kvYiHZ1tvaF1aWVRIS09QSktQS1RRSExBSkZLUF9fYmdqYpe3x7C6tLu+trHFx7awubGxu62zsairuK2NtqienKeaTpqejI+glpGnmKWVipOTiJGJj5GSnZuhmJuVloeemaaarLCor6ezs9PU1NbRy8/T1M7Tz8zGw8rQv8rJy8nSyM3Ow9DSuLDEvcS6pre7xKJ/bGFaW1tWXlZYZFlPXFhPUUNCSUVDSTxBRD5CSD9AQjg7RD5AST01NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ4PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZldzkJGZg2hyb3l5g6GqnqaXjJubmIuOlZGajn2Ji4WOioqLkIh8hIJwf4eBhnuHcoOSi49+cXl1bHB4f3J7bnhzbGmAcG1jaW5weWl3fX7Lv8Pfp25jeG5kW2FgS1BSVU5ZXlBeXU5RTlRRVVRcbm53g3KWrristaiwtqutvcGyq7WmpbmnrK+hrLSkj7Gum5iYjJGUkYSPm4GNp5GciYOLhIqJhIuDlJWXl5SbkJyYmZmenquspKeirKzO0tXRzczS09PQ1NHOyMPU0cjO0tPT183S0cXS1sbBz8jIw6m/uNCcd2xjW2BbVF5RXFpPT1NQT0k+QUdCQ0Y9QUI/RkU+QD86PT09PEpCNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYeGi3dsd3B9foCgnp6hjI2Zk5SLjJOPloV5hZCQjouKiJGHf4J7cn6Agod6hXaFk5GJgG93c2xzfXx3fHOCeHFrgHJyaXByenlye77Lmn+NsoR2coV3aWFpXURaWltXZmRYZWtUWF1dYGNeY3h7f4uBmaqkpKKgoammqrG5q6a0o6KuoqSuoqexn4mmm5WTkYqSj4iClIlrlaKNmYSBhn6Rg4OTl6yLlY6Vmo6FkpCdl6ewoqChpaSoyM3Px8LL0NPR1NLO083G1tPN1NjW1tjV19XK1NrNytjW0cutxMPLiHBtYF5dVlJXUlpPSkdKSkpAOzo7RUJEPUNEPkhDP0NCOzw5PDpHQzQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX5pc3lygoqAnZWelIWLlomPiomOiI+AeISUmYuNiIiLiX6DeHN8fYSHd4B7h5GXgYRveHFtdX92eH10hnx5bId2dW59doV1eXudtYw8QYvGpX6NfWplV0lDZWNmY2hqZG95W19maGtuaW6BhImRjJ6foJ6Rl5mgo6SmsqSlsqCipZ+iqaGisZyHn5KSk5GLjouHhI+EfpycjI2ChIV6lH+CqpajjJKLmJOLfZeKmpGqs5ibnKecpr3Dxbm2xc3R0NLQy9LLydTO0dXa19fY1NnYzdjbzsna2tLWv8zNtHVzbGJbV1FTUFhVRUZKSUZGPTo3OkBCQzpIRUBFREJEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8yKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYnFxdIaNfZeRnot+h5KCiYaFioKIfXiFl5eJj4OHhod6hHlxe3uFhnV6ho6OnXqNcH1wcHqAcnuBcoSHgG6OenV3fX2CdX98h4mwdFmqwreNkoFwbmM9XmhycXFwbnd3gmVpb3J2eHJ7jIePk5KblqCWiIyTnJ+bn6ugoaycopqaoKafn6yZjJqNkZOOhX2IiIOFi46gmZOIg4d+bJl5hJmHiJOMjpWMhnubiJOOraqUlZefmKautbyorb3Gy8jJy8vPycTSytTX2NfY19Tb19PZ29bP29rS1snVzJN1d2ZlWFdOUVJcR0JFSUk+Qj49ODo+QDw+SD1AQkFCRUE+Pzo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJmbHaAiHGRkJuAeYCOfoKBgoV/hHx9hJiOh4t+hoeBd4N5bnt7h4J0epKejqF2j3aDdHWBfnSAhG+BkIJvkoV1fIGFenaHfIm4xqXDyriClpyPeHBmTmVjgnuCd4WhkIt5end7hIB8hHVtlJaVlpCYkYOJj5eal5emnZigl5+TkpejnpqrlpGRi42Tg4yFiYmBhpCRnpyZiIWLgYWXeoiJn5eQiY6Ki4J8oYmQi7ygmJOXmpyopqWtnqe1vsC/uMbJzc7FzcrR1tXU2dXX29TX2drb19va2djO28aDdnZkZmFdUlVVVE1LRE1EOz08PDk6PD85PUE3Pj9APUA+PTk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozk6N0hQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZmFdXGl0enlsiY2Sd3Z6i3x+gH+AfoV7foKRioWGeoWIfHZ+dW18fYd+dH+SnZGfg5J8h354j355i4pvg5uBdJmGfYKKhXx+kXuQqY+Qw6C9jJuknH6KhH2Jc4yLf3OmmpyYlIV7j5GJhGlHcaGknoyMkZKFiIuQkpWPnZuTlJGXjYyVn52UoZWTjo6QjH+Qj46LhImTlpmfn4iMlJGdkIKMf6aZiIWOg4aEgKWGiou4l52RlJahpqCdnZ2jrra6tKvAxsrQyMfNz9PS0tjS1dfA19jZ29ja2tnZ19u2dnV0Z2ZiVF1ZUk9PSENMQz09Pjk5Ozo5OTw9NkA+Pj09OTo6OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV088TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT88RFJTUlhfVlhmbW1taYGOinFzeYp7e4B8f3yIe318i4eDfnWEhnpzenNtgX6FfneGm6GbnpSSgIyIf5iHgJySboiphXugjHyRjoOJhJx+m5GKjaOin5Gkr6CLkYuGi4GThldyrYufq5uQg5mckI+OW4OikYKNn5OUjIaIjJKSjJSVlZCMj4qIlpudj5WWkoyTlIaAi4mTjoqKnZeYo6KGk52VoIuKiY6dkIOIj4CDh4WlhYuQspickpSXoaCemZKbnaexuKykvcLHzcjGz8zQzM7Xz9HUrtbV2NrY2trX1tnanWx5cWNjWlpWUVVXQ0BJRD8/Pjo0OTo7Nzo7OjM8PD89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J4bGJ+kYNvbniLeHp/e4F9h3x8d4aFgHNwhYJ7dXd2dIWDhX1/kqain6ail4qdkJSXi4qol3KKso2EqJKEmZSFmoyjlqCYk4mbnqKTqbCgkZWRjo6IloxvjbeEmsTIspyippycmJaRsZBkpM3HlY6Gh4mQko2Nk5WKhYqKhpaZm4+QlJOHlZiEgI+LmYiOkKqXl6SjiJmelpqIj4eXmIqFj42Bf4ePpYiNk6iZl5OWmKGYn5mTnJqisrSlo7zBvsfGxcnIycLK08zN1KjS0dbW1tja1NPazn9ve2RgW1xbTUlTWUJBR0Q7Qj44Mzc8PDo4PjY0Ojo8OjcyPzo5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgkd2gY59fG1+iHh6fnuCgoN/d3aBg3xtbot/e314eHyEh4p+i6Kzp6Ors6KXp5+lpJaVrqKDkbiVkrOajKKhjKWbsKOknZiRp5aomayvpJiVlpWQi5ial6HAjqPJuKuco6atmJKbnbKdhYaoopyYhYmJjpWMi5OPiIGGh4mTmJWMi5STh5SYhoSRkJx1kZmylZakoYecmZKQi5CKl5uJi5aOhn2MmJ6JkJCcmpqTmJefk6CdlJ6boLGuoqS3vrTFx8S9w8PAxs3KydOmzszT0tHW2NPQ2LpvdnJZXlNeVE5ISU1FQkNENT46Nzc6Pzw8Nz00MjY2OTc3ND41OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER01aXFlKZmA7SISLenpuhYZ6fIR4gYaBfnB4fH59b3KNen6CfHiGi4mGhJKmu6yosb2wpa2zs6ijorCsipq1naO4pZWtpZeprbinpKOfmqmYqqSusKqamZyUlZGXoJiau7uuyqFqtrirsJSZn6Osk5e+o16qsoOKio2Uh5B8jo59g4aOj5SViIiTloyQlY2LjZaYk52ZtJaVq52KnJSSjpGSjJibipKekIuJlp+hjZSNmJmdkpuYnpShoJScnaWvqKGls7iswsjEtrq9vMXHx8LRoMbJzc3F19bRy9OfbXdlWVdQXFBORUM+PENBQjhAODg1P0c9PTY8MzUzNDU0NTRCNDk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEhiYGJwSkCLin6Ac4aHfYKIdYOKgn9ufXx9f3B3h3eOgod8jY+MhoyZqcLAr73Gu7O0wL20rauztoyosq2tvaubu6Worbm4q6amoqKko6mvsrGqnZykmZuYl5+ipqWSpLqvqcC8ra6yuaWkqH6IhpytvbCCi4yLkIOOg5GPeoGIkI2NnImIj5eNi5WWlJGal52omrGakaycjpqPko6VkJCWmI+SoZGJlJukrJSWj5OcnZOgnZuYn6GUmp6npqSio7CypsHGw6+wurfFxMO/zabHxMfEvdbQzcTKhXBvXllXXFhMSkFLQUZHP0FAQzs6ND5BPT01PTY+MzQzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU43OUdEP0NGXGVGYGlnWl1ck4yMiXuHjIeDjHWHkYqBb357gn9xfoF7lXqSlJSYkJOWp7PGyb/CzMLDuce9u6+rubuYs7e6ssCupcGkq6+8vaquq6OjnqerrrWwqpygq5yhnJafr7Wni6O6urbBvKypnbOlpKiUhY6pxMOkgouPh4iEhpWUjXmDjZGPkaGMjJSSjomXn5iTmZWYpqCvnIyrnI2Wj5KRlZWOkJWSj6GUhpefoLKelJmTn6CYpJ6an5uglJiepaSmpqSvraXAxMOuqLe2ycO+ts+yxL/EvLPRysjCtHF1aVlVWWdQTEhCTEtMSkFBPkREPDVBRTs7Mz04QjMzMjI2M0EwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmVaTWVcZlRia5mNloqMiJOQhol5h5SQgXKAe41/eIeCgpB6jaGWqJmambq9x8jJwdLJy8LNvcKzrby+qLq/vbvDt6zBqayzvL6qsKqkpaSsrrOttrWhn6+fpaKYo7O9qpuovcGktrivrJSyrKysl4eaqaalkYKMk6WWioF1ipJ5hY6SkJ6gk4+TjI+NlKOZlpyVlaOeqp6RpZqMj4+PlZaIfI+Wk5KjmpWfoZy1pZCelqSjoaWdnaaYnZWXmqSjqaeisqyou8DDr6Wzt8y/ua/Es7u+wbiswsPCwJdqdl5VVFlYSkpMSUZEREhDQ0FETDo0REk6OzQ8OEUuMTIzNTJCMjZTSE88SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5pSF9YYlpjY1aej5yOl46ekomKf4qgk4R4hX+Wf3+QiIqRgJahma6npJjCvcfDx8XTzs7Ny7zCt7C6vLS9y7zDwba3vK2zv7q9rq+ooKmotq2uqbK3mp6to6ehnau3uKqlsL/Esr25tKirtrSurpeWpayon5GNkrLFp5aOfJKVfIeSmY+qmZiTk4+SlZOknZOdmZSho6KcmJ+Yi4yPj56IWpCWl5KXpJllmKOfsqWVoZWrq6mmm56mlpiWmJSgpKiln7arqbm7w7SltLXLwLiqtquyu7iuqLi6vbiAaGtXVFJTTUVJUk1LP0FIRUVISEg5NUVNOz44PUBKLjMyMDI1QzU1T1ZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz5AQkZCcEVqSVJlYUxGpZScl6KXqZaMkYOIppOIgoeCnISDlZCQlI+aop6vvq+hxrzExMfGz8/O0sq/u7axuru7vs+1w724ubezsbWzuLOrp5yrrLmqqaevsJijr6Wno6W1wLCsrLS/w7rAurSnura5tK+Wpa2urqSLk5ShjXTCmn2XmYSOl5mMsZWbmpWSkpmZpaOVoJuXmqmdm6CgmYqNkJacYEqWnJqVmqWWVZewoK+cn6SUrq2qpJqgpZOTmJiNnKCnopq0qKqzu7u7qrGyx8C5pqyrrbKyo6GysrSkbWpiWVdNT0pET09QUjtHS0lHSUNDPjpLVT9BOj1FTTA3NTM0OkI0NE1XTztKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqWmaCiqK+ZkZeHi6iWjoiThaCIhJ2Xj52hmqOktcm1qcW5wsPIysnIzc3Gv7uzrrm5wcHMtce6wbm1urCvr7O1p6SbqrS1qqmmrayapK6lpKisu7+orLa3v8G/vrmzssSyub6to6+1rLmmiJuXppt2v5+EmZ2Ok5qajK6XoZycl5SboKGonqifmpqqmqGnnpiQjZGdg252kqKalZ2inZGusqOqlKiql6mto6KepKeRkZmch5Sdop6Wsaapq7m2vbKyrr65tqCjp6ilppybrampi2BiXl1OSktGR01KVkw9TUVOS0xCQ0Q8UVY9QUFCRE8xOD03Nz9CNzVVWE8/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLVJgTVVIfmVeSEWrlZuin7uvmZSfjJOrm5GSk4mrjYahnoyjrZSjo7bGvrTAucLCx8nFws7Iwr65sq+5tcHCyrXGssK8tbqqqK2tsKOjmKq0u6appquqnamvp6Oqq727qK29tbi+x7y3trjCsr7BtKq1t6u+pY+jmJKioLyfiZqgmZefno+3n6mcpaKbnKGaqKSzoJudppyoqp6YlY+Um4uWiYykoZSdop2gta+lpJKvq5mqqpyco6KokJSUn4KPnp6clamkoaGztLq0rai1srOenKOlmpeVmKqhnnVdWl1bSEdFRkxRSU1FR0dCU0xKQkVHQVZTQ0g9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKRUBKSk5POUNANT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTlmXEZDQ51wYkdFp5ejn57DrZyXpZiaqpyWmpqPqpaVp6aVrayYoqu2w8O8vrbBwsDHxL/Nxru9ubKwubO/w8i1v7C8t7m2pqSrrK2hoZmqqsSipKmspp6sr6uiqam+uKetv7K4t8e2tbm4wLPAwri1s7SvvqOXo5eUnJSun5Cio6Wjo6CQvaSpnqirnZ2hm6WevaGZo5+iqayhnZeNlZ6TnoePhI2Tn6SgnrWspZuVsKaZr6WcmaicnoyYlJ6DjqCam5KlpJqXq7G1saqlqq6sm5igoJKPkJWonpRlX1dfW01IR0pOTEhFRElBPlFJQTxHSUhcUk9LPUhPVTRCRjk+SEc1Q2FbS0JOUlVXVlFYVFJVSUA4UlFQTTpHQTRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5bVJGPEt4ZWFWS6Kao5yexayhnqyfnq6gkqOflqSgpqmsmLaxoqqztsXEvb+1wMK7yMK/yse1uLW0sbO0t8HFtr6xuLW5tJ+nrKqsnZ6epaTBpZ+qraCkqa2voaaovbWmsb25t7bEsrS4ur+0xMG5ua6ztbWjnaWVkpShrqCZop6pqKyjmsKsqZ6srpubnpmmoL2hnaSYq6yspqKajZqfkp6Jjld/lp+loaC4qqeTmLSinrGfnpmulZ2NmJOcgY6fl5WOoaOVkKWtsqqpoqKlpZWVnZiLj5GSpJ6JX2JYYl9LR0pKTkZFQUdLPz1KQjk5SkpOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JHRTY9dWVcS02enqGZn8SopaK0op2zp5OrpaCjn6yprJ27sKistrHHxcHCssPDvcbEvcTJvK+wtq2wtK+/xLS5sbC6tKyZqLGpqpqdpaGnwq2brLGbqqOusKmlqby2p7e7vq+3xK2zs8PAtMe0u7istLatqqKmlpWVpKyin6Cbp6qwr6+7sqagqamZmZiToqO4oKGjkq+wrKWnn5KhnpWej5CNlZ6bop6ns6amjJeym6KtmZyarI+dkpWSmX+RoZaPjZ+gk4umq6+kpqKcoJ6RkZqThYuRjZudf19jWWZkSUhMSlNCQ0BJSDs7Rj85OU9NVV5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDI1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0nqOfnKDDqaSqs6KktaqWs6ynoaSyrK6pu7KtsbW0xsDEwrTAxL7JxLW/yMK0q7WosLmsv8Szt66ttrilmKqyq6qYn6aXrbu0m6iwmqygrbSyqKu5sqi6tLmzuMCqt7LEvbXHqL+vrra1qaesoZiXkqaloqKYmKWuuK6ytbagn6ikmpWVlKSgt6KlpZavsrKnqqainpqam5WXqJ+gmKGerrKipoyXrZikq5aYnaKPmoySlpiFlZ6UjI+bnZOKqKmqoaehmJ6Vi46Zj4GFlIiTnndiZ1tqaUxPTk5UPkNBTkM7Okk/NzdST11fUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMS0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlvaFVDV0aMeWZDO6OjnaGmv6enr7GhqbarnrqxrKOrtLaxsLm3sLe4uMS9w8e9vcTCxsC4wMXAuqm2pKy7rcHCt7eqrbK6opStsa2ylqSnkaq5qp+msJyroK+0s6uptratvK20s7m3rLixw7u/v6bEq7G3r6irq6eemJmroaKhkZihsa+zrLC5mpypoJqXk5inoLappqOisbG0rLOorJ+coKCbnqWcopedo7Owmp+Qk6SZn6iZk6Gdk5aIk5aSlZack4iQmpiUjqmopp+jnJebkoWOmYt9i5WEjZlpZ2tgbG1XUFFbVUFCRVRAPDtJQTc6WFBkXlBXV0VZX15NTFJOXktKPlpjXk5IUE9cVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS0tLiwxPSonKz1ccD0+MS4wZFpkQDE2NDdnWWBGKD84bH1nW1Y7iXtjQz2nn52iqb2iqrCspLK4qqa2tKygrbW9r7O4u7q+t7bAwr/JxLnEwsC/uMS9wbevtaert7K8vr+0qa6xtp6Wq66orpemqI6nu5+lrLOeq6KxsLOsqba0tb6usbK1rLC0s8G7xresvbCxuKysqqOypp6lqqCkl5Gan7Oqs6urs5qdp5yalY6hpqS0rqihra6usai0rbKqpJyfqKSelaKZm6i1qZaZkpKdmZ2fnZCqnJWWhJSWip2YnJOKjZaWmpampaOfnZaVl5J/j5SFe42SgouVZGtxZm9xXkZZZ1ZEQk1YRFo5SEI2PlxRaFxPWV1HW15dT01SWGRKSkNcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYFUxNTA9YFZeOClDM1lVXGdLNox6ZkxApJqhpa23payqpq+ut6qvtbunprG3xbextr3Bw7W1usS+zMa5w8C5vrnDuMC5srSrqbq2urm+tKqtsLWXmKesqaybq6uOq76erK6yo6ugsa2zrq62srm4qq6usai1r7W8vcqzqre1sbSvrqahtKCbqK2gppaWm5qyoq2gpq+XoaSampOOo6Wos6qhprOtqralr7K1r6SZnaynmpifmpmrt6OXk5COl5ygl5aTqp6akX+Sl4ydm5iVkIqUkp6ZpKKioJiWkpOVeouPhXuMioKKkWptd211e2FGYWtZSUhaWj17SkZENkFiVGlbTVxhS1xdWlJSUmJgTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUX1RfLzUoQ19RXC4rQi9KR1BbRzNjWVRLRJmXobGpsqqspqSvrrapt7W6pKy0t8m7tLu6v7+0s7fDwMzIvMO8tr2+v7e/vLG8rae6ube2wrarrLG3lJamrquoo7CplK+7pK2xs6eoo7K0sbKxtbG4tKmvrLKnt6+3tMTGt6m2tqywramno7agoKexoaSVnJqVsZ6nnKCqjqmjnpuWmKampbioo7K1rKiyp66xtaylmaCsqJucnpyUqbiclI6OipebopePl6SgnJOCkJSPnJuXlpWIlo+XmqecpKCRlpGQlXaEj4d7hIGDi4psb3Z0e35cTGZtXEpOZFw/YntHSThHZ1dmXExeYk1YWVdVV1RpXU9PSGBdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5HZjI3J0diTFYlLUIuPUVMUTwzcmtJQ0ORmaWvpa6vq6ilsbO0q7eyuKGrtbnJua3Bu8K4s7G1wsLOxcDBvbS9v7+6vryyw6epubC2tr+8rquysZugp7GtpqavpZ2yta2rsbKsqai1u6y1s7WttK2qrKisqbmusrHIwLmlurCprKylqK6xpqWjr6SpnJ6dm6+ao6Ojo5Gtn6OgoKKrpqe5pay1t6WrrKmtsLauop6jqaqboJubkqS0mY6KjYeQoaCUjJScn5KQg42Skpyal5WUh5eSlZmmm5+ejJKRjZB2fY2FfHt8hoiIcHJxfXx9XFNkb15OWWdcRkSWW0c7Tm1YYltMYGJOVldWV1RYZ11RUkxjWVtUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8rMSgpKywtKiY1Ki8mMCkzODoxJiozQmM6NipIZUhKKzpIPjNCSFMsPpBrO0dIj5yqq6KqsaSppbO1srW2srKhq669zLqtwLrHsbSttMHD0cXGvsCyvsDCu763u8SmrLessre8wK+rsayfo6etqaiksKOqsqqwrLCvsK6rs7ynt7GyqbOqq6Wlo626raqyw7q2rbupqaesqaexpaqko66qqKKfnKOtlaWemJ6ZrJ2ip6miraakray4srKiqqKgrK+xrJ6gp6epmaOZmY+gppeGhI6Ki56gjoqMlZqOjYSFj5SfnJSXlYaWk5OXpJucnIqSkI2Jf36HhXx2foWDhXJxcIh1a19aYG5iUXNxXEs7hHxGP1h1WGBaTmRbTlZWVVdRXGFeU09OZ1hXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyoyNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTtcSjAuSmdERjg7QjA1RUtYMUCVWT1MRZWYraiiq7Ocqqqwt624tq+rpqurvcm8sL22wq+xq7PDw87Pw76/tMDCw7q/s8fDqq63rbK4vr6yra2qpKeqsKinqLGltK6rsa+tsrG0rLS8pLizrayvqKufo56wt6uqrbu3pbe2pKmnq6uqraGpp6axsqSnpaGhrJeqoZWboKaepaKrpK2jn6exuK6upKajm6qrrqmdoqWkpJifm5aPmJySgYKQiYScn4uKjouYjY6JgouXopuQkJuLk5KRk6KZm5mKjouLfYaBgYN6c3+CgHxydYukh3hrX2BuZldlh2NOP2eTTEVieVdiWFJlVE1WVVZUT1xdYVVLTmhWVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqMzk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2VlouMEpnQUE8PEIrOkpPXjREhj1HRkSXk7Cmo6uxmKuqrbastrKspqyqqbzAwLe4sru1pbKvw8nL0b/Au7m/vsG5wbnAxKyxtbGzusC+srGurKqrqLappq6vqrmwqLKyr7Ott6q3t6e0t6uspamqnKOes7OpqKS0taC3rqCqqKqoq6egq6ypubWqqqmpoqqgrZyTqqGdoKWipqOqn52ntK+pp6ujo5ilp6eqnKKko6CZmKCRjo+YjX6HjYeEnZ2Gg4mJjo2Oi4KFlKKajY2akJGRj5Kfl5iWjIqDf3SGgX9/eHSCfnl2fYCHnY9vcmdmcHdcYXOIa09emVZIbnlVZFZRY09NVlRVUE9YW2JVSE9pVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzo3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD5DLD5MVF8vSmk1T0Q8lo6xoqarr5qspq2wtLWwrKawqqi6vrvAsK25rqG2r8jHyNHAvr27u8G9usLAvr+usrKytby7wrGxs6qzqaS0qKWts7O5sKOuuLKwsrururCqrrasqp+qrJ+joLatqaGfsLOitaqeqKepo6qhoqytqL2vrK6toqiooKyZkLChmKKgp6eeqJuZqrGqo6CuoqGUo6Ojp5iaqKWYl5iej4qHlIh9jYaEhKOWhIGBi4aNi5CDg5OfloiRnJCTkY2RnJSXj4qGhnd0gX98dXh5f3lzcnhmf4akdmlfZGqAdGeIjH1TWG9eSnhzU2RTUV5NTVJaZk5MVllkWEdSaFJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS01KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMZzo0OF89YWQ/RjFDUFtbKkhNOVVANJGQs6Glp62kp6Stp7WzsqulsaequL7Au6+nuaqmr7HJx8jRw7y/vri9vrzIusG4sK+0sbq7uMCysrqsuKyitKenrLK3urOoqL22rra+sL2nrqy1rK2cqa+joKWtq6icnquzpbSom6qnqaOonaOpqKm9rLSwrp2qpKCunJuzo5aknKWln6Wcm6mrpp+cq6Kck5yipZ6Yl6ipkpialJCKgo+Ffo+DgIidj4V+fYuHkI2Pg3+TmpOFk6GMlZGLkZuSlYeJfn9ye3p+fGh4fHl0b297ZoR4hIlkYWdhcoR6bWd4XV5UP1d7bVRiUFFYS0xOcnVdSFpbZ1lFVWVQRD5KT0RDQTlIR0tTP2piSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMScvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZiQUo3R1NgVSo9OURXPSqQlbKaoKCqpqWhrKW4s7OmqbGmrLjBvbWvoritqKiwwsnJzMG2vcC0t7+6yLXCtbOytbK9uLm9ta25tb6toLOnq6uwtri1rJ++vaqzwbS8oa+ztaqsn62wo5ymqaqknpulsaewoJ+rqaehqZykqKGtvKiusa6hq6Okrp6fraaXn5uho5yfnJqkq6Ocm6WllpeVoKOXm5elrIyekZGRi4KKgICOgHuZlIyIe32Lho+Ni4mEkpiQhpSjiZOSh5GakJOBiH15a352eXhjfHpwb29xdmd/c2mEaGVnX2xzjWxhaW9gbz1aeWtVXk5QUUpJTVRaV01dXmxXRFdfT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNjg7MigwOS8sNC8uPS0qSz4pHTQ5JicuMzQuMCsvNCYsOiQ0MUFoWTE0Uz1lX0RMNktWZE8qOzFOVz0jlJmtmqGYqKWkoKikuLCvpK+wqau4wbmyrZ+5r6uotLrIy8i/tsK+r7S9t8S2w7KuubKzwLS6vbeoubi9qqO0qKmqsa+5saucvL2lsMG1tqKvtrWnpqews5+epKaooqWZn6yoqZ6gqq6moKaYo6igsbmfo7GvoayhrKScp6apmpqbn6SVnZ2bnqqnl5yhqpOZlJmfk5mWoamRmomOkIZ8h36CjX18oIyNiHiCi4SJi4uFh5OajomVnoiRlYKLlo2RfIV8c3B9cXR0YHp4aG1vb21ofXFie21pZWJdZYV+X1pzanFKSX9pWFpNUExKSFBSUUlPXF9uU0RYWlJoT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLjo7ODMmMjwwLDg1QiopLUIqLDQ7Tk5AOzczLS4rLTcqKjwlNTM8ZmQyNE0/ZV1GTz1RWmdIKj4vV1U1KJeep5qdl62hoaGlorirsqW0tKmoucS1sq2ft62urbC0xsjAtr7BubC0vLa+u76vq72wtL+wvMO5qLu6t6entaioq7GttLGonL+4pq28t7KfsbewqKWnr7GboaSgpaWgl5uwp6Gfo6ivoZ+hk6Skorewoaaxq5+so6+YnKqkqZ+Xmp6lk5udm56nq5qcnqaXlpiWno6Tl6KoopCJi4+GeoR+hIp6j5aJjYZ4gYeDh4uNhY2TmI2PlpmKj5d+hpeMj3mBenByd29vdF95d2Rra2pnZ4JsZXJra2RoWGFzf15abHVpWUV9XVtYT09LSEhSVUcyOl5ebFBEV1VZZU1ISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRIQmZbSFRDVF1oRS47MV5RLDKWpKOYlp2qnqaho6G4qrChu7ilrL3Esq+uorWvra2vtMTEvbO+urews7m4uri6rq2/s7S5rr/Bt6u9urSlorOrqKqzrK6ypJ3Dt6apt7ern7K8qqemqK+rmaOnnKWmlJihs6aanqWpqZyhn5Sln6S5qaSnraaepaGok5+poaGhmZudoZKbnZeho6ycnJujlpOVlpuOk5Ojp6SQiIqOhnmEfIWGfZyNiYqGeICDh4iHkYWVk5KMkZWUjY6Ue4OXj4p3f3xsdXJtbHNieXRoZmlmY22EZmdoZGZoaV5lYmlmWmV6YmBQc1RbW1NLSUdJT1NAIStpXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTctMTE5NSwmLjUtODA1NzZgdEIzQ0RoW0tXR1VgaEIzNzdhTCcyn6Slk4+mp5yfnp6ktq2oqrq3p6zDwLavrKK1rqeur7fBwL2xwbewrrK2tbm4tayqvLSvsrG9wLeuvLyxpJ+2rKamtaqrr6Ggxayqp7G1rKy1up6oqauxpZidqp6npZKZpa6jmZ6kqqGboZyYoJ2ntqavqa6hoZ2doZWgpp+ioJmcmpyTmp6Vpp+uo5iYn5aVjpWYjI+YmqegkIeKioh4hXeCgoKch4qCiXt+hYiGhJCElpWPj5CRkJGNknuDlY6Fc399Z3lwa2tsZ3Vza2FnY2Jzf2FjZWZlaWliZW9ZXlhcbGNhTGdXW2BWSUdIS01SWD45YGxpR0JVU1xbSUhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKiwvQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNAYkYlNZ2koZKNrqGamaCXpbSyo7K+t6Gxxru5sLCjtqyrrqm5vr27rcCyr6+utq6zubKnq7mxr66ztru2r7m+rKaetaugobKlq7CfpsWhs6aws7C3rrWera6srqKZnaeqpZ6Vm6emoJmlo6mcmp+clZ2erbCmuKeuoqGamp6YnqOapZ2Xn5iclZqhk6mXramclZ6dlI2Vmo6VlJinp42MiomOe4F0goKLmIWGfImIhIWKjIiShZOckpGQkJGXj5B/gY2Ogm+Cf2d5bmhramdxcmtbaGNhcn9gZGdqbmtlaWVjbFxsbHVxYVNiaGNlWklHTE1PWVFQVWFlgVRAVlJaVEZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuNDw7SzYvLissLTI0OjUjMyopNi41NTQ2NVp8XTE6S2pbTVtLWGRjQEExSGJCJzSUo5yPj7GdnJShm6mzsJ+5wLagtMK7vbmxprawqa6luLq4uKy7sK2rq7eqtbmtpLK1sa+psba2sbO2u6epoLapnZ+qo6qunazEma+msLG3tq2snrGtr6qim52krKmblZynpJ6ZqqOllZqgnZKco6uqqLmep6Sgl5qanaGPa6OWmZ1xg5ecpYF2kqypn5aXopKKmJmAl4qfjniFko2DbWl+d4RxbIaKhn2EioZvXWRgZ4SXhmuLkJSSdXiLhH+DkH9miIBodmlmWF1pdG5OUGpjZnGDZl1kZm5raF1bXYmQhYdoT0tDOEVUZ15KSFBQVVZLSFJhcHRlRltRVVBGR0ZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNU9rW05bS1tmYj5HMU5hPCsvjqSaiJaym52UoZyqrqujvcWvqbfCuL68rae2saarpLi0s7Owua6qp6y0pbG1oqe4trWop622s660rrSiqZ+0q56jpZ2nqJuwv5Wop7G0ua2upKitqqumoZ+coainm5ihpaacnKeonZOeoJmRn6iqo7Ovo6KjnJaYmJejiKGPkpqIoYiVn6J/pYCorZ+UlJ6UiYRyeIyOg4igdYeNaZeJZn5zeKBvh4eEfox8f6Ggn5l/e4eedIiOdpuKbIeCg21oZGR7bXJiVIZtY21pmHFYaXBuhlddaFpralqIcGx5codoh4RZXkZNPkZeTUVSVlZRUFJXVGdeTFpMUlJQRUZHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STovMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN0MTVSa1tOW0xbZ189SzFUXjcvKI2nmISdrJ2amp2fq6qoqr/Dr7K6vLfBv6qkt7GqrKa0ta6vs7arqaWxraW2s5ustba0pqeos7Gtsqiunquhs6mgpKWboqWesbiVpqent76mrKepqqunpqKgmaGoo5mZp6OlmZylqpaTo5yVlKSmpqG2pKOgpJiVk5iTnIiukJiViqqMmaOdhrGBpa6flZuhl3qC1Kh/h5TAm8Z4d7Glt5ZkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyXsauxeWhsWLGub2VpvJK8bmh6bXGP2H1Sa2K2sn1/cJR1mqGqkFZOWGFPVk5GVVxYUFBTi1tXW1BAXERQTkNGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzExVGtcT1tNXWdcPkwxWls0MSGPp5SBqKqfmJ2epa2yqbHCvbK1wLW4v8KrprStramosLWqsLa0qKimtaWoua6csrK2qqWkp7KvrrGmq56npLKkoqGgl5yioLKvlp+kobW6o6qooa2tpKKdm5qjqaCYnKmgn5ieqKiRnKeblJ6ip6OhsKOen6OWlpKYkpmFr2tqi46qf2iFloetZnGfnpWbqZdxrqGkfne6fGugj3axX2q0W6WAZZyQYGaBemZ/aXhqqWW+cmemjHaxanyxeHWRlGNtbaduXISgRWlnh5ZFdZxgfWZ7o6aBWF+Lq2h9j3h6aqg4Sq9bWFRtY1pLT1hfXFZWO06HUFdWL0lTU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLy41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV5YMzEbkqKVg62npp+jpKuyuK20vb6wt8WyuLvDp6mwrLCpqrGvpLG6sKWlr7OjqrmpnbKysKOloaqtsKyvpqifo6KxnKOdmZaZnZ6wqZicoqC1s6Grm6GtrJ+empego6mdmZ6loJ2aoaikkJ2jm5ehoKyfpaagmqChlpWRlpGahrWbtXmGqZq2mXeHs5u3f5SXmKyXf2uBpnqBhYaRlJJ3q2dqsVuse46HlHSJcI+GgH+IkJd4g4KKl4yDoI+FsHZ3n3Fra218i0+lWEhjY5l+Y2ilX3lxdVKShl1QqW5jcHuFgGGdL1KibltUa2dgTEtcZFhcWkI+sHdXWEEjTWlGQkRBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJBQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SjlhVDUwHJeglImzpqahrqmos6yqu7bCsLzDrbm3wqutra+vp6+zqqKvvKuiqLatpKy1pKWys6ijop2nqrOpsKimnqCgsJagmpaWl5ugsKScm6Sota+hqI+pp6qbnZaYoKapm5+do6CcoKOlpJabn5ianqOrm6WanJqioJeTkpOTnYTVk5m5cbHCf8aHfdaUnLt9nJeoko+djaR7jYaigaWCeat5j51Wr3uJfp9quVq5d4WEfaaClHyZeqp5jp2Qe7FtjoR0kLuGb5VQr6fFilGgemNgqmJzcodrlodeUrW0yIV+iHxjpDNCnXZdUWpoZFBAWGZZZGFKR0xqSlpTT1lmWkNDP0U/MDw8NTk8NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbSltQX2ZUN0g6YVA3MiWco5OZsaippbOqpbSnpLy3wbC6wLK3tb20tqiysaSys6agr7apm6i6rqSwsaGytLGhpJ6eqKmxqbSppZyenqyXmZmYmJaYo66fnJeorrGpo56OrKKnlp2YnKGnopiioaKhm6KjqJyfoZ6VmZunoZymlJubn6GYkJKVkJ2Ism5otXKsiHCOp3O0dXS2e5yZpo6QnY2jfo+eo36wdYKQ0tJ1XK58hX+kbpuqpmqGhX2tfZiZkHuxc5Odj3mzZZZ0hZ5un2aUUsmLWsJcn3liX61fdnOGYZaIXVnKnW/AgHRNS7VTVcZkVlJqY2VYQU9qX2xpUFVGSDk9V1JbVllIQj9KPDI/OzU9PDU2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEFOVF9lUDVHPWFNNjIuo56Rpa+tpam6rKa1pae2u7yyu7+4t7W8vLSmtbWjsrKjoKywpZinu66lsrGdtLiqoKWdoaqlsqisqqWanZupn5aVmZmTlKSropiTp6uxpqGWkqyfpZKUoZylp6CVm6anopujoK6aoZ6ekJaco5+cpZSdlZmjn5aZlpObhax8eKh3o4+Lh6lwrouEqISamqOLk5qLon2Sl4euhH+Bs1xyslOvfYKCo35x1313hH6PnYaZmnevhoqRnIh3tGGaZZqCgZVskluwV0uadZh5ZmCtXnZ3h2eXiGpdr3eVn493bDV5yK6zYERVb15nYEVQbF9wbVZVTS5lY2hSWVA7QURATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0JgSTo3N6CdlKC3sZmzwa2osqeqsrq4tLm+ubizt762prm1obWtoKCprKCVqLasqLGyq620pJupoKCoorWnpqqkmZ6VpaKUlJ2akpakqJyUkKetsKWglJipn6KPkaKaqaahlZqmqZ6dpJ+tnaGdoI6Un5yfoJiYnJaXoqCUmJGnnoepfn+meaGPkISqcK2NgqeGl6GiipiXiKOBkIaUqnp/i515cLFaqIOCiKB4dNh/dod0p4GOm42SpHyVkJ+Ee7JenGSgfYKVbpNcq1xbk3+Rf2hnqmNye4BqmIZxXataiaCPa25kT0pDoVxbTXRdYmZNWmFfcnRfSlU1SpqRWEhFPUhGQU0zNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPE9lZEEmVWZbPzFUX2JMN0ZIX0MxPTeinZqavq2Ys8Guq62oprSwuLG1v7m6s7K5vKq7tqGypZ+mp6efk6uyqbCqtq2qr6GYoqCmpKS6o6OsoZebkaOglZWfm5WZoaGRjoypsLCmnZaap6afjZKkmKisqJWYqaifn6CkrqOhnqGOlaGZn6CSnJeclp6hlpePrJyPrm5ytHSpjHeLpnS0enW0gpSmpJOdjYmkh451uG6Le4uia2u2WqGGZZeXaKCip22UcrRzk5l/s2qFkoitanW0YZ1mom6GkmuXXK1gTqF8h5FSc6NseX9+bpiGb1yvVjycd2VUb24uW6dPYlJrZWJsWWJcYHB8Y1NZUT4/bG8yQkJAP006ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKywzMjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUE4pZqcnrqjnLG/rq2rq6e3qbivtcG1vbKxu7irwreqrKGdp6SinZKrq6i2o7Oorqqhl52ooKWruJ2jrZyWmZClo5aOnqGcmZ6fkZOVq7awppmTm6ypl4yUppqlraORl6uypKCeqKywmaGjkJmhl6CblpuXoZSdqZ2UkKuZh9SUmrt1scSAxId+1pecuHmKkpmOmIqMp4d5orZ1fXd2woKasmGDunnAfHW4YrWBjIepfZaCrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiBim2aiHBtjaR0vV13fVthebxqWlZbaXleaWBkZmJteW9YW1lDQUBxP0NHKzVIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw7OjA4TFhhRidUY1g8L1ReYEs1PExbLTZAOaean6K8o5eww6+tqaqssai5r7fFsbuzr7ywrsGyraajn6SinJyRqqWqsqS1p62kn5aaq5mnrbido66ZlaGQpqCTjp2kn5mfmpCWk6+5sauVl6Onp5SQlqWdpK2fkaCoq5+cn6mksp6ipY6moZWhmpyXlaSZkLCgkpWqn4WQmbaAkpKNuJZ4g5ObtndubG90b3mPhI6Jcp7Au7yae4GyqHCAdJG5g3yGhoqHjXuKho2XfaS7ub2cdXmzo3R2l3V0sHWYnmaGaY22dHJxd7aMXn95fYlng3lseWKLrHB0hX5YW6dpRGRZVGZfY11jUWdmcW11Qk1PTEQ7Wkw/SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JXOCpPXV09KztWVic9OjymnaGhv6aVssKzq6qorKuqu6+xxq+1tLC4p7W5rqukoqefoJ2ZlKykrqqmtqion5yWoaSerKW+p6Gql5WckaKbkpCiqKKTnpeSmJSytbasmJ6jpKKLk5KmnKarnZappaacm6Gpp6ejqaGRrJ6Xop6Xlpidno+wqZScp6KPa39qnKl5iXR/m492e2aHe76/wLpvkoNxlIVfcmpaXpuJYWOHjpVrYH+UY22cdmKUa4CalZRlXmBjcZqJaHKMfIaUZmp+cHR4fn1iW3h0gWhQXG6EfHyKalhseYFySUpvhXBOck1EVlxmYExaV2ZjX09abXZqclJPREVNPEhJPEw+MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNUNGVUVKT0hGUElJSDs4PTUxOi4xOzouLy03Nj01JiIvKjIsJTs4LTdJUl9JJ1NfVjQpUF5MKDM+XE8nPzI+qJ+oocGkmbS5tqOspq6nqLWyrMissLSttqS+sbOnoaSqnaOcmpqsp66kpbWqpJuYlaKcp62pvqippZWUm5agmpOZpqmokZ+Qj5icsLK+rJunnaeiiZOSqZuopJycrJ+jmpyjp62in6qimq6blKagl5Wdn52YsaWZoqiZnZKfnaSmm6ikm52anJuRl4Jobn1yd5GXlJCEibSqjYWYlY+KjJiWh5SViYOTk5CJjZGUmZOZl5qfoZqblJ+bjYJ6pIVsaXuQfYB1iYuCcoJ4eXZ2ioB8iWpzgnSDdWR3fXZrb3lsX2Jbb2dNWFlmal9XWXB6b21mU09GUjlQWk5STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8Ojs0ODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlQxMFReOis9OF1LLDwtQLKgs6K/oqOwsbegqaazp6WwtarJq62yprWmwKi0oZ6lppyllpagq6eto6S3rKCZl5agmK2qpsGfrKSWkpyXn5iUlaKfnqOok5CYqKiyw6+Zq5yqno+Wlqmeq5yeoa2YoZudoqWvpqGkqJ6smJalnZmaoZ6enbChnaKnlpmUmpSho5ekoJmhjpeVi4uOkJiuj3yVm4KRgYmpqIWAmJaLhI6fiHuEkYaFmpGHhoqVjpuXjpCYnqOWmZKQnI1/jWWhs66EiYR3e5CKfnd5em9neZGBgYlrdYF5iHJoc395dYOGgWp0YnhlX2hkY2Rmalhre3Fqa1xTTFBEX1VGQD8/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVFZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzM5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LECzoLmvvq2qrbGyoKqmsq2irLOwxbCrraSzr7yktJygqKOhnpmXqKappqSms7WelZWempqwpq6+oayikZGempqUkpainJepnYSdqaujtMezn6mkqpaWmJqnnqmcoKWrlJ+fnZ+qrqilo6uhq5qen6GYpJ6cn52wpJmfqZSZmZ6TppuZqp+cl2aEk31lf4+bkGN5jGxoanqQo6tqZZqYfmiFimVlaWh6jaKOa2iMl5Gid2tqi5min5hzbG56hIyGeVhlXYWBXmyLioJ3XGdzd3eSgIiCb3iCeH9zbXmEc3aIh42CemiEWF1qc2Rdc4hpa3xxbWNdUU5XSWRYQEozPUY3P0ZENzE8PT9BQzs7REdISElMTk9SUlRXW15gYWFgXV1dXV1fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtKLjZaTzYpRVkvRE8xWUI7Py49pJ66vbmvq7Owq6Wora6wpq6usL2xqqilrrCwn62YoKSeopqap6ycrKOmqKmzrp6WpJCjsKa2uaWuo4+PmqKak5KboJmZppZ7pKuiqLTDt6Whp6+fnZWeo56jnaSqqJKfoZ6gqq+pqqOqnqabpZ6noKyWoZylsaSXnayWop+blKaZoKyZn369hIlztHOFn4ataHe5xLhxkqGjeqaYmXSqgXzLwMC6cYujh4OefZaYiJ7AvYKWnZ2NnMHBfIF6kYyawsB9aqWyb42Bb8p6f5t4koSPgHd5gYB5cXuAhnB3hYuSeGx1kWJlXndjX2WAYl50aG1kYlhLVklRWkhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9fYV9eXl5eX19fXVxTTVBHVU5BQD89NjQ2ODI2NiomJSMpKiYuKyopMTAfOSojPklbTCojQ1AvI0ZbM1BZL1VBQjsvOJWiucO0r6+/qamUo6+psK+tprK2r6qmp6axq6CrmJujoJybqqeinauipailpbSknqOTpq6tuLSnr6KSkZmdppORoKGYm6CeiKarpKutv7+xoamvqZaSn56imaOkqqOToKGenayuqKulo6Gkn6SlnK2pkaSbqa6qnJ6rna6jl5iml6KkmJ1/zpR6e6WCepaXm1+tj12OqIChoXynlZt1q4OAr15kjKp7qIeFoHSXk4izY4KrhqCNjbNqhK90fJaHuGGCrVmjzW6Qdnvbe3+ZcX6Ik3Z/ZXuIdnZsfodtfYWPkH1rgIxfcGpvZmBfeGRbcWhqZGZgUlRTV15KT0M1QUhFRDg+NTtAP0E7PThAPj8/QkRERklKTE5QUk9TXF5fX15dXV9gYF9fXVtXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7WzpMLSFQQEY0LjGswcC/tLSwt5iekaOqqa21rKayrayspKymsKqhp5yappicoq+foZ+op6OmoZ+wrJuelqaurbGrqKyglJKbn6WTkJ+ll52oo56to6qwqL/Fs6ipsa6Wk56copehqqqflaGenZytrqapqJulpaOhqpKss5aloqqqnqSnp6KyopObp5yhnJaVkZehcoWMmHaFqIdxsXydcax9oKCBpY+eeKuCfq1/nXKtf6yHhp92mJJ7fJd+qoiijJGLnH2reoiSj59/eq1WnMR7kHCTwX2BlW11cIxtZndlhm9hd25yboiJj46DbI+NY21zdW9gZm1kX29pam5mY1dTXGBaUlJDOUlJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLTwoPTEpM1ZARiEcRztDMS0rr9PGx7Kzn52jj6Oioq2vt6+psaeoqqiuq6unoqSdmqOVn6aroKKmoKioo5+esK2Ym5aop6+tqKepnpeVmqSikpShrZqdp6OvrKKstam5zLGtpq6rlpWcnaKZn66snZahmZ6eqbGnqKibqqejoqqar7GiqKuuppqnq6urs6STmKSnnJaThaRrpHWKeql1e7JxgqWKmIxwiKCbh6RfYVKrhYCug5x1roKohoafepmXhntmgKOKpJiGgaN9qX+BlIauXnuoVZ2ikoF6o5+AfMSwxYxzr7SzuXJiqa/CdWiLi5aNgGuXkG1reHh3bmtmZGRxcWZ7aWNcVl9pWFhUTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgJychKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dbAoZmrqKGvop+wtLCwqa2jqKeqq6uopKagm6WfnaanpqSdrJqirKGjn6+jnpuTqqS1sK+hqZuclpWnpJGboqifoKacsKWiqLGstsextamsqZWRnZ2imaCls52aoZScnqeqqqKtmqunoKGporKsoaqzsqKcq6mwsLillJelqZqdk32qbZ+EiHareXywboKki4mflpWeloHSuLS4yYGCsl9hlKmDpYiHoHqYlpp5qsl0mqOUqKmQkpqMfpqJmsbGd2WhgqVzgZ+Ogn2vXm+1Y7F1S6OGbadHg5Nkjo+bkXtvlI98bXl0fHptW2VqcnFmgGleYVhjbVxeWUlMTEpFREJBPUE8QT9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00TlRRHRw7PEYyLCSopMDGua2psq6tpaKds7msq6Gmm6imqqyppqCmpZiro5+vrJ2moa2an6mlnae1oKOYlKirtrOsm6acoJaQpq2Smpyno6Cqp66ho6epsLPBsbKpraiUiZidpZuipK+ml6KVmJylpamZrpyspqWdq6O2rKGxubCenLCotLS1ppaZqaWcoZCDnk53moKAn3qEo3yCpISGpp+cn5SEuHx8ermCf8zGw7Z3m6KRi59+mZeXinafl4qkmKSofq+Fm4OehKx9mZRhpWyjcI+FkIF9loRyrGCkc3GAmmG8fVJVdY2RoZV6fJCOh3J5coR+b1tsbndyaoFuWmNfaG5iZF1MTFFTQUhHRkg6Oks+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUV1lZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1RGPEUyOlBbVBwbNj9HLC0gjIeZqaykq7mrr6CboqyztaafoZWmr66uqKeepaWapKehs66iqaezoJqppJSjtaOjlZehqbW5pJyjnaOTkKKymZ6bpqWhoq+tnKSoorWxwrCtqq2qkYeRnKedo6ScpZeemJiZpaOnmK2hrKOkl66lu6yit7aunp62s7qztaman7GjpqCIkNK1w7d6h46FkZOPgKZ4lKJ3jKGShaWDi3Krh4a0bnJpmaSdlYmffZeZh4eQc66CpZujjaaKk5yIlJCabXCyXKVzk3qcbJl/e5l+bqlhonJyfp9ic7K4aHeOkqSXfImKj4h1e3iNgWxod2l4c25/dFxkZG1tZmhgSlpXWDxIRj9TM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCMpJZJyjYquv7+8u7Wel6ikrraiopmVo6qnramqmaWin6ahoLWnoqmnsaSUq6OPpK2knZCamqq0tKSdpZypkpSXr6CgnqajnKectZmgqqO1qsKvqaupooyEj5yioaajlZqanJiamKajpZepp6ugpJuspryslb2wrZ+jsbS7rbapnau0pqqafKiRfXyweIuApKWInG2yb6GHrXyij4Ool5qBrImGrYWglKigo5eFn4GZloF7kn6rgZ2Zlourd52gj4iTkn95r12jgXymp2SegHyXdGuuXaVscoWZXWBbjKBtlI+kl4GSipOId3mBln5qbH5ifXRtf3lfZ2Vwb2hnaEJZX1o9SlMyUzhBQUM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pYU1BPTkk4MTUyLiosQVRWVlZUVFVVVVVUVFVUU1NWV1dYVlVWUUhGSUojKCi8kpuEqcbDt8G0n5qtoK65pqOOmqOkoK+uqZ+jnp2tmJ65oKKroK+qmq6hkaqppZaKm5CusaynoKibrZiZj62ioZ6loZmknK2Xn6iltqi+rqSpo5+MgI6bm6CmnpKUmZuUmZmlo6KYp6qqoaKeqKi8pJfDraujoq20vK2wqaO1saqtmnevfpGLnIWHfbqtiZhksIxllq59oZCEp5ecgq2LhbCGp5qkoqKRhaBcbGuCs2B/rXx7goCybGZumZeLiLFafbRbpINryKJmn4F7u1l2tVqyfVOvgXqsWIChbZeNppmIlY6Sk3h3jJt8Y3N8YoN3dIB8YWpmcG1mZWVPVWNcQVRdPUgoPjk9NCEhLCQfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTUpHQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsbe+u7TBs6Ocraalt6mgi5mgn52ysaieop+dtZigs6iqq56wrZ6snJWuqKKOiZuOr6ypp6Ooma6Tmo+pmqGdpJ6Zo6KlmJ6iqLGou66kqJ6dj32Lm5ahoJmQkZqckZmXqJ6fl6espKOkoqSpup6gxqemqaGstreusKmhvrCvr5eCqpKjr46bgIakl5iQgIC4w7qEj52ThaiZnYOsi4Oviqicm6arkX7VvcKqYqS/vX1/o4KD17q3tYSUkoKevb6EaqOBb6uEbp1/erKxx4Nrq7C9rHl4or67dICVjKSajZmOk5l3f4+ZeWJ8eWSMZniBe2BrZWtqYlBiW1NpXEBUYEJMKTw6NC8fHyQeJTIgHCQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVtLSxwLqyvbOina6nprOmnYyXpb+ptq+nob+mprGbnrGcuaifra+lp5WUr6yXjIOaka6mo6yhpZyqoJiKo5OmnaebmqCoopidoKusqbisp6Oal5N7iJmSppuTj5CYmY6Xk6iYnpaop56opqCiqrqeqcWjobCkrLS2rLKso76rsbGcdXaqpbeFZYmfcGeskIqPbm53pZCboIJ2sZuXcZGOcpeppJuYr6RybG1tZot4b22DmXGAemlwaWeJlpWXcWhphYZncYZkXYpjaW9aXWd+eKZgYnKQknBmZICNko2glpWXjpOaeoWNk3RkhndnjGp4fnlkbGNmbGJLZVdKa1k6UGREUCdKOSsjHCAaIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola20qbq6srSqqaKun6SzqpmSvbHDx7y0qZ6/q6yjoKeroLqjpK2sraaOlq2qkIyFlZetn6aqop+ko6CRi6WSppmpmZajqaCWnKWlpq65qqyZmpOSe4SXjqaXjpGQl5SNl5Smk52Wp6KZr6Wdoqu5n7DBqKW0p62xs6yvrqq8p7G6mIyiqaa2nImWopiGqZuQlJ2SqrSanKStorSYpKKfoqOdoqWilqynjJKTjYeTnZ2VkJmTmJCOlYR/pJqXlY6Lk5KKkIeEfmeMgXSDd3SHjHGnbX2Wk5SUgYGPj46Nm5KelJWTnYCFkotwaI92b4l3dnx5aWxlZG9kVWFYQGlaR2JfTVgrRT0rJiE2NDAvHxwgJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlRRSkVDPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqS1t6+uorClraCht7GRjqrEvMO5tqmhpJ2bpZ2wqKS3p52ptaeokZiso4uIiY+cp5atpKGaqJ6ek5Wkl6iaqZmUpqCjj5qnmKC0uaeqmJqQjXyBlYyhlIuVkZWQj5KXpI6dmKeemrSjnKart6ivwq+kuKewsLKuq6y2vKOyv5qTp6SmtaKSnaaejamfjZKfoq2xm6Kks6uymqainqWrn5+enZetnpOaopyUkJermY2YmJaQlp6Rh6CelJSFk4yPjZWMgX9mjYh1iHd6iYR0nGqIkpaVkol9jJaRkJaRn5Cak52BhpaFeHGUcnmJf3F7fmpuZF9waWBcX1ltYlBgYk9YOUZGRT0yPD04LyomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iWpKijsLOsrqOpp62gqLWqkI+bo7K5raqroaKZepyhsKSmsaiWm7imo5SYqZyOhoqJm6KQr56klqigoZKXmZyui6qWj6iYp4yYqI6duLWjpZibjYl5gpSMm5OKlZGTkI2RlqGLnJynnZ23on+DrrWisLB1pL+ks6F5e6Kttb6XeK+moYqAqn9kXGJ2n46knoOWfm2UtZ2kqbCspWagoZR0epuYcIGZqplsf6SpimWcpZyRl5iWi5KbkISdm5CUg5OHjo6SioV4a5CIdodxfIaBgWFpiYyVk4xbdpWRZ2eOjHJ5oZaVZHiXhYB2l2iCiYJueX9qcGVfdm9ra2dcZWNhYW1RWT1NTU5SRj1AVEI5MS8eHyY0OjMwNjY3ODw7PkBBQkZIQkdHSUtMVFVVWV1gaGZnWFFJPERHPDlVUltgYWJgXmBfYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuqpamupKetpZKWqrSusKWZqaWql3OLnK+gqKunk5a5oKCPnKSekX6IiJqejayapJWnop6Ol5KehXWuj4ilmqiRlqOIm7mzp6CYmIuJdXeTjZaTipOQkJSMj5KfjZmepZibsZWAjJu1nbSMko+9qKJ+p6N7pbG6g46PqJ+EjIaPsamvjImWopp5gIushp2eo6mrqYmWh5l3ppx7iJyBmKeDgXuds3uKhqCYmZSYloGQlpaDmZpieYiRhI2PkouEbnGQiHqCcYGBhoCHdIeFl5N4lmiTdKCac3uZgpyZhJh+kYiBgphpjIyEanh7cXBnZXhuaWxqXGRpaWVxWlxHU0xRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1JYWlhbYWFpZllRSDlETDw+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZikn6aurquoraCpsaenqqWZlK3FvK+glKWntJ2Pg5ysnKeioI2Qvp6ZjZ+aoZF9ho+Yl4isnaOWoaGSjZSJhoCRqI6Hopyjk5adhp65saedmpKOhXB1kImVkIqUj46bi42QnZCVnqOUnauHn7SJtJqui8qIq6+Kt4WNsISzsYWpjqmZjZ18qI9ye3ecjqaWaJWkebSMoaCoqpOZwoKAq4mZoXKegJulfZeFlbOBoX2hk5+PmJiAjpSciZiSi3yFlIaNlZOKhG50koaAe3OHgYR9hXWGg5iBj8VmgKmHj6JqnYGel4CZgIqLg4iYb42ShGd3dHt2Z2h1cGdoa15ibmxmbFdkRl1RTDJFNDZNYGM3JjM8RUdEOjYzNjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASWRYXWNmaGdiYmJiY2NfX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXo6CwqamopqygpbmxqqummpSeoqSpoZSjqbWir3+gp52lnp2JlL2ak42gkp2QeYOWlZGIq5mcm5qihY+MdpubjqCRiJ6jm5aYl4aiuKylmZuMjH9ibY+Lk5CNj4uMl4uOkJ6Nkp6gmKCnfqGnh62doJaukKCenZGHgqCNrbGIpI6sm4yafqJ2gJmUa4GrdU2reIeNnZOcqqmCqqt+hKF8e6dqnoCTbGeXhpi3iZ5+bmBjWIOXf417ZGeLc5l9eZdsXHyXbmBTcYVcYG16hGBZZYJ+hYGZcaira4OjbnKlcJ+CnGdknmxabIh6ZVlfgn5hV1BvdmVudHFqam9daW9sa2hXZk1dWEU5QTRHQ15rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSS01CSltdX1deX2N1YE1FOk1OTVRiXFtmZmlpYmJkYmRkYmFiYGJkY2FiamtkYmRkZ2RiZ2VhY2iYl56guaGqpKaskqK2vauvopmWn6Clq6ufnK20oaeRoJ+gp5yZjpm0mZCLnoyVi3WBlJGNiqaWlpifnn6ThYWso4eckYqYqJiZmZGHpa+mopWZh4mAaW6IiIuOjomKjZGLjpGgi5Kdn5qhpX+TgY+joZSgd5yWkKeDo6mAhqywh6V6jH6Emn2icHOTh5V7nox5bYeci5qSnKqcj4edfYOidHemZ55+d6VemHt9k3Oibpi3tLpzk4iBgLaoZIHGuHxxlbaMcYCbo2N0rKthfmqds35ufoiDj4OMmHGAo2xzpHOegn6jXpyZs5Zve5ees3RyW56ygmlicHR1cWhvWGprcnJlW2ZcYUxEPUQ1UUFZcDI8UkdfSlI9PDM5NTo6NkM8O0BJUD9UTk5RQEVfXltZWGBge2RJQzhMV1VWY2FaZmZra2JiZWFkY2BhYmBkY19gY2tuY2NkZGhkYmdmY2holJaVo7mZq5yToI6luLatraCaoZuio6SsmpqxrKuSl6CZoaSZmpSerJuLiZF4i4VxgJaNio+hkJOUnZd9kYmOqKCGmI+KkqKTm5qMiqinpJ6PloeEfmt7h399j42Di5CQiY6TnoGVm5+boJ+LiXecmKKNoHKhjImpiZ2okZiqrYCujH56oJl5o5N4gHOXiIycfZWfh5uOmp2oiKNkoX6KlpCbjW2eaJuOb5qZe4CKp31yaHSqg56Dc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF+ndneKioCdaJp1h5OSmI1/nm2ZkGqmmVyofne7an2pWo6EXbNnXG5xeHdraVtwaXd4YV5kVmFCUEVPN1ZCUm00SlpaXk5aREAxNTE7OzdIPzpDSFU/WVNYXT5EYl1WYFFhY3xpRUI5TltdWGRmWGZmbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZGNpaGdraZadiaq2nKiJY5WcrLuysKydpZuap5+drJmdsKeqnZejmqKfmZaWoKOZhomNaYiAcnuXh4yWloSSlJiPeoqElqSciZWQhoudkZybiI+ooZ+ai5CKgIBpgYZ5f5eMe4iNjoeOlZl+kqGeoKGTmHJon4qgj4xwkoyCqYmaoaWqo6p+sK2koriXdqOzoqN/iJR4nXqqmX+ij5+dmYmYcqF9h42wtX1smpGheH6ZtaOjq6iEmXyafJyaf3SqWl1ve5eMeJ5iTX97e4VkephCTZ9ZompzfI5vgoqEmXabeYeJsbN/fpqSpnR+nW1xfJRvmXJpo12VdkhlY2BzcH19bmVfa2d1e2JjX1BdVlxUVkBZRVBmRFJWXGFYXklEPUI4P0E6SEU4TEVYQVdSWlZFRmFcWmBLYG19cUVDPFVeYlplalZnaG1vYmZmXmFgXF1eYGhiX2VkdmxeZWdmbGRlbGhoa2mUnYGxrpqEU1+hp7S6s7OpmqKLmqmbm6eSoKujoKePnp2dmpmVmKGdloeHiXeFgW55lYSQm4t9kZOWiHKAiZKhm3KSkIGImJSfmoSOqJuZlYqKinyDbISFcYKhjHiEjIiHkZeTe5Gin56jiK6GfbWEj56de6aWeqmCl56RjKOgf6doeG5+mXOgc3F8nYWYb5OCrXyjhKefm4OkcF6paHajZHCmYZzTj3x7mXhyc2OihpB+onKjkHZrkLOLYIKYinSqsqi8f3eDbn+/pqq0Xpxvf3KXcIJzonJepGd0pmBopmya05h6gptudnmXa5t5dpdybKmlZ19keXF/hGxoZmNtdXdmX2FRWmVQUWFIVklUX1dTW2RqW2RQRUNLTEpLQUpEOFBAUE1YU1hPU1FgZWVpU2R4eXdJRkVjXWVaaGlTaWhqbmNqZmBjX1xdXV9oYmFoZXxkXmRnZGtkamxmaGxomJt/saxUXUt/qrCytbCzopyYhJemoKCijKSnn5epiZmYmJSZk5Kgl42HhXtwfYRofI+Dk5qCd5GOj4pwgIaPk5JsmJR8iJGSo5WDjamZk5KKhIl5g3aIgG6Bn4Z3gJKFh5iglXmRoaKZn4mzoaK2i3qsp6SupXCpgJuRhoGelH2kgaKahphxnoSira6Jl4t/jKSNlYOvo5V3tba2yaJzlIyDn2Cel6lteZaHoJt1oYd3oH6QlouBb01mo5JxmohzpXt6dWKDgm1+oGxyZGCcc390l2t7arS2tMamc5h+epxqmpqrdIGabHN3l2mZeXSXcVBEfbNeanVreIZma2Zic3RwbVVbUlhnT1JnSVVMWFJVXGdrblVnV01KQUpNS0dKTkFRSlBkY2ptZXVzc354e251iXp7VVFPbV5oXGtpUmpoaWxnbWdjZV9cXFxfaWJkaGt7X11kZ2NqZm5tZWlsZaKdibCohWVAlKKyrK+vtaGij3+Wp6Gho4ukppybpoKZl5eOl5CQm5KNh4N5a3mGZYOMf5afeXWPiIyCaoWFkoSLhZ2NeoyKlaWSgpeolouRi4CJeoB9i3lwj6CFeYGUhoiVnpR+kqOmm5WWg2dueJxsomR8cqV4nJhwaKeCmY59pXuhl4OWcp92gImUlY+5bY+KomJ9maOXiW5za6trdaBub6Zgm2mLkGmWh5uVdaKBfppgi4aNdW+IYmihZp5/apt1cGRniIJvcqJbX1tkoW5eiIxxfIB0cmSlbniiZGanaJdyi5dtoW9SiI9uoF5kp1SLXVSYbW1ya3GBbXBoa3dzam9RVlVVZVlTbElYT1xIWGhocmpZa1ZQUkVWXE1YU2FVaGped3V7fHB9fHKCe39zd46AhHdeUXNhZ2JwZ1BraGhrbG9oZGdfXV1dYGpiaml2dV1cY2hjamlybGZrbWOdpZmmemV0bYunrqWpsLGmn4p/lqmcnaOLoaGaoaGAlZmUjpqPi5eQjYl7hnGAiGiLinyXmnN0iX2QfGWDh5WKiZWagnyIhpamj4Chqo+FkIqBin2AgI5zaY+lhH2Fk4yHl5+NhpCopZyJpniWm36liZaMspmekYSvl5+leZiJe6l1p5CEmm6looyShIyDvG18pa+Ch4aHlZedon6me3KolaGWaJ9+b6xjloqWk3iobaqjgYl1iIJ3q5GmiGuSsWx3s4ypbIuGb2+gnpKVYn+rjKp3gYCOp593n32FpJWdoGiah3WrZp6tjLZzdr6Mo5NZg6aNq2F1cnRve3VwYmp9bmdtU1RYVGBgXGtMXFJcSV1sbXZfW3FYW19aZ3NlbW9xY3F0YHd6fnlyeYNyg36Be3uNgYKAd2J5ZGNuc2RSbGdnb21yaWZpYV9eXGFqYmxse29cXGJpYm1pd21nbG5ilqarnYGAnqSWqqqeqKeto5mIgZapmZ2iiZqknKidhIyakIackYWSjYyMdIV6iINvjYV9lpJzdIZykYNuf4uSh4aUkH17goWXpI1/paSNgI6JhJR1goeTbmyLqICCi5ONiJqdiIuSqqKgj4B0lJeIfoF5lK+kf4KccY+GeZKNhoB7cqiNcn19epeWm4SNeHt9fYiUlZOLd5GZoaKFe3+KbIyGXHp5c3pxaW9+k4pxgHSCj5STcYaEgmWNf1+BgYx4dnOUdXB6b2+Jb4WGX3dpeI5mgoOGj6qcf3R9lmqJiG9+dXyDdW1sZoxzeHuXd4Raald5j2lud3Jxb3d4b11rhW5pZ1ZZXlZcZGpjVWBVXlFfb3d5a2p3ZWpqanV8cHF0c2FvdWJze4F4dXmCdX+Af4B5i4WCfnxugG1keW5eV25naHVreGppaWRcYFpjaWVscXVuWltia2Rsa3ltaGxvYY6Vuqmni6Gim6ekmaSdq6Kgg4OWqpCdn4iZppqomIOBnIt+lpSHjoqJjHKCfI58fo+EepaOdHKDcJWGfH2Si4aGj4Z5foCGmKOMe6afioWPj4SVg4aOmHdxhKqFjZGcj4ednIaKmqifoKqDiY2Vm39+ipetqJCTqJF4cZ+ThHyUcH+qh3F+lXFqb3yBn4t/kY6LaG5dhI2NnJ2gkHOXjIlydWyDdnSAWXJvh5GCfn+Mal1pZHuFhIiAYGl4e5x8hI2DdoKHhGl6jIlsYnFzg3dfc42DipGolodnjY6DbneLgm+Di3dtZGVjeYJ6lVpbaWZtdlt7eXd0bnNyg2ZcbYlra2JZWFxZWGpxWl5gWV5dZXJ9enRvdGNqaml7fHJ6dnRkbXRobHt/dXp9e3l5f4B/cIaJhHt9c356cn9oVFxyaWx2cHVna2dkXWFZamhranFybVdbZW1sZ3J5b2hqbWCMjKuxoZCjoZqfn5iemaiioX2ClquMn5OGmqGQpJV/e5iFfJKZiYiGhopyfICLdoWLgoSViXJvgHOYhoR+k4ODhoqCeoCEipqfj4Gln4Z3jpeIlYuLnJeEg3qsgZCXmZOJnJuGh6Gqn6Gio4uIk5udo5mWq6Kop6GTnImZkH56kJCGqX+Ak5GSk5yxpZqUnY+NsZKYhKaNjZadoYqRnYSJk4tsfY53d2aDhpGLfYmehYeLj4iIgYWEkXd8enWbpIqHi6CMh5Z/gI2DgXdxdYaEf3iJiIuRp5GEh46Hg4yQi3qFiYeNf3VqgIN8eZlpcWhgc4pwfXt3dm93dIFdXm+GZ25fXllaXFNncFVjW1thbGhze3tybnBjamlof3tteH5waHBwbGaAe3KCgHd/fX+Ee22DjIZ8enl8fXqDeE5kdmpzbnF7ZGtlYmJgW3NmcGZycWxVXWx0bWh4enBnaWtljYieup+Wo6GYlZmYlJikoJ16fpepjZ2MhZ+cip2WfHiUg3uOmYmGg4SGbXiAf3KAh36IkoNta356l4eEg5B+gIaEh3yHg42bnZGGqZ6CcoqPhpKSi5yRfI17qYONkZeVjpqVhoWbpp+imp2Gg5KamZmQmaahpp6ekJeCk4x4fYmQhqd8fY+QkYaYqaCck5yOjamNkoCejYqUm6CEj5iAiI+EcXmGcnVhf4SQh3aMmYGDj4KGhX+GhJVvenZ1lKSMjYabhoaQdYGMfn5zc3yJhXt5jY+FlKiQh4WPgYKJiYh0g4aGiXltanx/e21oa2xmXnl/aHx8dnR2dHp3XGBwfW50YGNaW15RZmxTZFpdYWpodXl+cGxsY2pqZ4B/a3J/a2t0bnduhHluhoB2goB9hXdyg42Hfnx7fIB7gotgaXtrdWhqg2RqY2BpXGN1Z29idW1rVGJxeWVveXpyZWptbYuKn7iaoaSfk5KWl4uan56cenecpJCbiYakk4qYmXh5jIV7iZGDjIKCgmx7f3hygIV9ipB8a2h9gpeJgYiOfH6FhId8j4CPm5uQiKabf3CLi4yShqChioWMfKeQh46RlpKUkXeMo6ChnZaaf4GQmpmTjZqjoqSbmJKcgJCHe4GFkImhgX6NjY98l6SgoJKZkJCljI+BnJKKlJmdf5OTf4iPgnZ1gnF3YX6BjodzipZ9iIxxjH6ChYaPanlyeo6ak5GAmH+JjHODiX19cnp8jYZ8e5OOhJemlI2GkHyEhYaEdICBhYV4ZHB6fnh5cGtqZl59c2h8dXVzfHJ/al5gdHZwd2RjWF1eUmpoVGVYXmBnaXZ4gXFma2NsZ2V/gGptfWdtcGp9d4V6a4uBcoGBfoF1doKNhn98eoCBfX+PanKDbnRpYohobGJfcVZ0b2xtYHhobFdqc3ZjdHp6cWJrb3mJjZ+zkqWmnY6QmI+GnKCam3t1o56Nl3+MoYqImpZ3eoWHfoOJfoiCgX9wfnp0dYKFfomQd2djfYaXioKKjXh9gI2DeZaAlZeVjZWfmn1vi4GRk4Wlm4eMiYOmlYSRipWWkZB1kZ2hoZiUl3l/jpiXj5eanaWempSVnXuSiIV5h5iPn3+Cio6Mc5einaCSmI6PoYyMg5iYhJSXm3+Zjn2KjoJ4cn5ue2SAfIuGcYeTgJGCa4eDgYCKhWd3cH2IlJqOfpR5jYt9gol+fHKAeYuGeoWSi4yZo5eDhIx3h4OCgXV6f4aDc152d3xzfXZma2NgfmprdnNzdX1we2NjYXNudXJtYVlfXVprZFJiV19gaGt0eYZxYmpjbGZofIJraHRobG9of3yBeWyPhXGAg4N/dHyDjYGAfnqCg358kG11iXR0bWaKbGpiY3VWg2lwbWB5Z2xhanZxZXh7eXBfcWyFhZCdr5inqZ6OjZeHhZ+TlZd8dqiaiZh5lpyLjJmQeHuAi318g3uAgoF4c3h5c32Ag3+IioBkXn2LlId/hYd0fX6Kf36YhJaTloyjoJd+cod7k5GKpo+MjoqSoJGDkI+Tl5CKgI+YoJqSkJF0gI6SlIqdnZ6nmZiOlZd1kJGLbYeakZt8iImQiW+XnZmik5WKjJ2LhoGTnYCUk5aHmYl8i4qCe3F6a3ZtfH+Mf26Fk4OUeG+ChH5+i4FmdGp9gpiYhYCOdZKKhXqJf3d5gX6HgX2Ej4aNlaWReYWCdIiGfH9xc36FgWtgeXR5cHxuYW5iZHtibm92c3h3cnNhdmBvbHVub1xaXl1dal1PXFdiYWhtc3qJa19pZWpjaHeHbWZsaGlsZ4B8endukIhzgIOEfXSBhol6g316gYR9fI5yeYt4eG1sh2toX2lyYodocW9mdmdtbGF6aGp8e3dwYXdtioGZmquhpKmeiouRhomeipSWfHasl4yWfJ6TkZaUiHZ+e4p8e4B2d3+Ab3Rzem+FfYGAiX58YVx+j5KGf4SEcnqAhnqPkYeRkZuSpJuTgX2BfI2KkqOJjYqNlpqMhZCXkpWNiIiMkp2Tj4yNboSQj5GJnpmioZiXipeTcIubhmeIm5CVe4qFkIpwlpqToZGSiIqYjIJ/kp9+k5CTi5mPfIuGiHRzdWtxb3Z9i3VvhpGOk3J0gHyCgol9ZXJuen+blX6FinWSjIJ1intwgn+Ch32GjYuFjpaqjnuIfX6KhHd9bm1+g4FhZndzdG56YV5vYGp0Xm9qenl5bHJwZXldbWxzbXNYWl1fYWpaT1dXZGNmcXF/h2VdaWhnYmdxjW5jaGhlaWeAend1b46Fc4GBg3x1gomFeIV8eISGeoCJd3+Le3pyeYNqa19waHR/a3FvbXFnb2tle2Juf3p3cGt3d4l/o5mjqKGnm4iMioGPnYaSmnR/qJORjYagjJWTkIBzfHaFeHh/cnN7hWtyb3ltiXZ/gIZucVtZfpKNiICBgXZ1gX9/oIaPipGcl6CTlneJfoCMiJydio+GkpeWhYiUmI6Wi4qNjoydio6RhG2Ji4+RipyWoZyZloaZiWyHpYVniJ+Lk4CNhIyBeJOYkZ2RkImJlI1/fpCZfZKOkI2akn2LgYRwdnBsbm9xfIdqc4OPmIpxeIB1gomDemd0cHeCm5B9ioV7lZN7eIp1cot8h457i4eFio+cpYl8hHeBin93d2xpfoB/W3FycW9vdlleb2Bval5vanx6cW5tam13YHBva3FtWVhgYWFtV1BTWWVmYnVvhIJiXWttZGNla5JtYGZmX2dqgXVycm+LgHR/goB5doCLgHmFfneHhnaDhXuHi397dop/anFifGKFfG9wbHVqaG5sd3hfcX55e3N1c3+CfqWWm62fp5eFjIN+lpWDjp10iZ6TkoWKmoyVjox6cnh0gnByhXNxdYhsbmx0bId2g31/bW5VUYGrlIeCeIB2coN5gqCCkIGSkZebkZl3kXqCjJKkmpOOiJSYkoSFlpiLk4uJjo+HnYSRi31yi4WIj4icmZ+bl5WBlYBqiJ+JaIiiiZSFkoSKcYORl4+ajY+Mi4+Nd3uTkXuPjI2Sl4x8iX2BbHdqb2tsbXt/Ynp+j5eBd3qBeIONfXpodW12iZeMgImHfJWRcnuGcXiOe4uOe4l/hI6Rn5+GfX14gYp8dm9nan+Ad112bm1rcHJVXW5hcWFfbG55cGhwZmdzdWhxbGF3ZV1VZWBgcVNQTltlZF14b4h7XlxocWJiZWWRaV9oZVtnb31va3Fzin12fYWAdXZ/jHl7hoB4h4NzhoV+jIyEfHmVeGdxaoNgh35vb2t7YGltdIB0X3R8eIZ3c3OFfHmhkJqxnKaPg4p/gpmJf4qcfoqYko6EiJeOjo6Ed3R2c4Bwb4VzcHGDb2ppdW2Cbn18bXVzUk6C38mS1pN8cHSDdYOfgpF2lJCYm5CZe5NyhZCfoZOTkImSm5OFfZWVh4yNh5KNiJx/joF4e4x/iIyKnJycm5aUeo54aYuUim6KpYaUiZiEhmOMkZiNlImWi4yJi3B6lYl8j4mLk5KKeoZ9f218ZXNwa217elyBepCPgXt+f4CGj3t6aXVrdIyQioOHhn6XjG1/gHCCjoCOiX6Fe4SRlpubjH13eIKPeHJrZW59gWpnc25naHNsU11vZHBaX2xyd2Zsa2JneHNwcGRfd2BhVWtfXnRPTUtfZmNceHCKdFxbZXZgYWRkjmNgZmJYaXNzbWtxdot8dHmGgnZ3fotzf4Z/eol/cYmHgZCKiHx+mXZlc258ZYd/bnBrgFprbnl6cmB2enuNdnJ2inZ6n4ycr5ugkYOFeIiVfnuInIaEnpCOhYyXhJOOh4F1d3B5cG6Eb21ufnJjZHdwfG56fGpobGKkmsHcru+ic2x1g3WEoYSRbpWPlJ+Um4CRcIWLo5eJjpWKkJ2Vg4CUj4WIj4CSioqXfod7dn+JeIaFjpubl5mPkHaLeHCJi41/jaaGk4uehoZei5SXiY6IjYqKhIlsfJeCfoqHipGQhnaGfn5sfWR4dWpvenRYiHuSh4Z6f3+Aho1/emZ0aoGLkIuEhIGNmIZtg3dviZODkoZ/hHuCkpeUmpF1dHiHjHRycGVzd4BgcmxvYWh0ZlJgcGdrVV9udHlhcmNgaX5xcm5bY3JhY1ZuWlx3TExLY2ZhXXZzim1bXGR4XmBkZoRfY2NeWGlya25rcneLfXN3hIF4eHyJcYOEfH2Ie3SLiIeVhYx/f5hzaHVxeWyLe250cIBXcHl2eXFkdnmGjGh2gIlxgJ2Imaico5OFfXGMk3h4iZyDhJ+MjnyVjH+aiIR8c3dwc2pvgWtpbHx0XmB3dntwdHpnYGV869q1ycPciXNsdIB2ipqIjGmXj46clZKBiHCFiKCOhYuVioyXk3yNkoeCiI96kYuGj4KAd3iDhHKHgpOblpSYho12iIByh4SLiZykhZaOoISKYYOVj4WIhYiMhoCHaH2Uf32EhYqOj4Jyh3+AcndodnJpdHhtWo19k4OGfYCDgYSLg3ZidW2KgpGMhICAk5J+b4NteoiRiJSFfYJ/gpOUkpiJb3J6jIV0a29pcHZ/XXFnblxpdF9RZHFoZlNfcHZ0YHBgXWiDcXNqV2dpY2lXbVdbdExKS2VmXmFyc4VpW1xleV5eZGd6YGRfXVlrbmVuanR3in5zcoF/e3Z6iHOFg3x/h3Z2ioWPmIGNgnuTdmx3dnl5k3Vud3p9WHmFcYBuZ3h2kYJkdoaFcYqWhpqhm6GKhnNvkotxdo2afImZiIl7n3+DmX+CeXF0bm9kcn5oZmx2dltfeHt6cXF/aWFnYX/Vto6RpnhucXd7cZKQjIZqmI2ImpCLhXpoh4uZhoGSkYaGl4x7jIyAgImNe5CNfomFenV7g3xxhoCVmY6TlIKJdoSIeIWCjZWfoYiXkaGAiWF/lIeEh4OIjH9/gmZ9kYB+gYSMj5B+bYN9g3VsbXd1dHd2bGOOgo+AhX98hICFiX9wYHRyhn2QjoN9f5KKenKFZ3uFjIiNhXyFgIGVkJGThW9weYt+dGxtaWl3emFnamlYa3RZUmhyaWJQYnJ4bGJlXlpqhG50YlxnX2VtX29UWm5NR05mZFxmbnKAa1pbY3NfXGNrdmRlXV1abGxibWpzdoaAcW9/fH10eIZ4hYN8gId1eImBkpV7iYZ2iYFveHl7g5JvbXuAdl6Df3SBbGh6c5RzZ3OHfHKSkoSan5ufhod1dZN+bXWSln2HkIOKjZl8jJp2fnZxb2xqYXR8Z2Jpc3laYHd7eW1xfmVkaGhXnY9fcnOXvMSEdnGUiI99cZaLhpuSi4dyaoiPloB7lYyBhJqLe4qGfHuJi3+UiHWJhnZ3foFydYaBnpSFlI+EhHKBineHfoubn5qIlY+egYlmfpOCf4WCiIlxgX1mfox8eYCAiIyPfWmBfoR2Z3B5eHN3dGxrjoaLgoqAeYKBhYSBbF9zeXt+jouHfIKQgX9zgmp6hYmNh4V5hX6CmY6RjX5ubXuJfXZ0bmZle3RiW3BiV25xU1NtcmhhTmZ0eGZgXl1Zb4Fvc1plYl1qbmBwT1lqUURTZmBaam5tfG5ZW11tY1picHZjZlxdYGtpY2xqc3aBg3Btfnx/dHWDeoOCfIGFdn6IgZaQeISKdIGIcnl5fo2Qb297gHFpgXh6fm1se3WVa2p4hHRrk42Gn5mgmYSIbn2LdWl3l45+gYqClJeJeY+Vb3p0cWtpZGBzemhgZXB5WmByfHlncXlhZWWPsbJ3S2JapdnQlnF7kIqPd32TioSYkIuFbmuFkpJ6eZKHgYSYiXuGf3d3iYqEloBwi4hxdX57anmFg6WQhJONhH9wgIR4hnuInZuWjZWSloaIcXuTg32CgoiCbYB3aICEeHKAgYOKiHxlfn+EdmRxc4BpeXFvdZmOhoOLfXd5gYV6g2tccn9zgomHin6HinuJc4JvcoWIkIaGc4V7gpqNjoV5bm9+hH92emRmaHtvXlh2Wlhwa05XcXJmYEtsd3RhXlxbWnV+c3BYZ11manJgb05XZ1I/WGZeWm9rZ3pxW1pYa2VZY3B5XmdcXmVsZ2VraXF3f4hvbH9+gHVvgnt/gn+Cf3aBhImXiXGCjXF7hnx6eYSTjHVqeX5rb350f3xvcnt6k29ugX54Z5KLg6GZnJGChWaGg29neZWIfX6EgpiJgXyOjWl4c2trZl9hb3ltX2JveFxka4J5YXF2X2Vl1Oq9izI6PouOf3F4hYeNjXWClox+ko2Lfm1rhIyMdXyPf4WBlIh8gndudoeEg5d3b4iFbHV7dWZ5goOni4KPi4R+boF2eYV8iZ+SjpKTlI6Mh397koZ3foOMgmp/cmiAfnhufH2Ci4R3YnqFgnJkcml+bnVydYKcjIGAhYB0dn6Ac4JvXG5/dXmLhIt8iIF+iXl7cm2KhZGFjHODeoCXjIuAdW5rdoCAdXRbZ2d1bldWe1JZb2RMWnJyZVtJcHhvXFtbWV10fnRoWWJbZ2ZvZGpNV2ZRPV1lXF11ZWB1cFpZVG5jWWRweFloXV9nbWdpa2lwd32ObWmChH95boB8fYF/gXp1goCNk4RwgYtud36Ae3uIkol/aHp9anN7coV6c3Z9fox5eIR9fGuMjYSbnpaMgYBsjX1raH6Ni3p9foOTgn59iohrdnJnaGJbYmdzb19ha3NgaHCIeWJzdF5jZJugj25cNVqvtXRpgIh8kYZ1hZWFc46KiXZvbISChnR5iXiJfJKHeX5yZ3aJfn6Yb3GHf2l2eW5meYeEpIeAh42Kfm+Ad4KDf4+biYSWk5mKjIWJfI+IcHp9hHtofmxqgHt6ant3goiBcmB3gX5yZHJndoNudXuGlpKCfYKBb3d6fHV/bVlwgHd1jYOHeIh2g4l7eXRvi4KRgoZzgH5/lImKfG9uaW2BgXRtXGZkcnBQWnpNW25bT1tyb2RVS3N4aVdZWVphcIB0YF1dYWdkaWlmTlloTUBgY1tgdWFddWxYV1N0YVpkbnFWal5iaGpnbWxocHd8k2xohIp9fXB+fnuBgIF6d39/iouDcXyHb3F3g397iYyPg2p9e213eHaKdnx4f4KGf4N+fXpthYyImaONhIN7dYt4a2yEh5B4fXqCkYCAfouDcHNxY2ZeWWZfb29fYGdwZmpuiHRhdG9bYWRqdnuAv5ympMi4cYSCcpJ7d4WSgnOQi4dycm+De4N0dId0iHeTiHl5cGN3h3qAk2lyhHZnd3VjanyCiJ2BgH+Oj35zgHWHe4KUkoV6mI+WkIiCiXuIiGt4eX50Z3poa395dGl6d4CDfWhgeIh9a2t0aHyBanaBjJGVf3t+f3F8dnx0f2JWeH5zdIuFg32EcYeKeHlxcYWEjoB/en9+d4+GhHdqcWlsh4Fxb1xmYXFtSWR1S11sVFNZcm5iUU90eGFSWFhdYXCCc1thXGllZWRrZFBbcElEY2BbY3BeXXdoVVdWdl1bZW1nVWteYWlnZW5uaHB2epNtaYiNeX1ye355goGBfHZ9g4iGg3B3hHJtd4KCfomLk39wgHt3eHqAjHSCeH6BgYKEeYB1b36Ki5ueiH2FeneFe2d0hYuQeX5/e4iGhHaPgGdwbl9kXFhlWW1yYWBgcGxraIhuYXRpWV9kboB3qdqpx4aHsnGId2+MdHqFjX95kol/dHN0fXd/b3F/bYV0k4V4dGtgeoJ5iY9mcoRwZ3VuW219gJCTf4B4kZN+eXxuiniDk46GdpiMk5CIhoZ7f4RsdHZ+bGd2ZG17dm1qd3d/f3xhYniGeml1dWN+fGd1h4+Nlnx1gXdxgHt9boBaV3V/cHaFiH+Bem2JhnR6bHaBhIV/fH56fXSMgn50aHRlboqDbHNZaF5zZEdtbUtaYFdWVXdtYlBSdHZYUFZYXmFxhG9cYGNtZWReb2NUXHJHQmZfXWZnXVt7YlFWXHRbW2drYVVqX2BuZWZrcWhwdniOdGuOjXV/dnh+d4GEgXt0fYOIh4NvcoB0cXV+hYKJjYp7d394g3t8hYd3h3x9gX6EgHt+cnV5jI2gjIl5iXV0g3hefYWXi3iGg3OFhoR3iXtibm1cYltbYVZpc2NgW2ducGaHcWFxZlddY2t/fMrOh7mham1timxxg3F7g4l+epCEeXhzeHV0e2psdmOEdZGCdm9mX32CeouKZXKCa2pxY1hteoWbiIKBc5eUeH99b4pzhYyOiXSZkJKJhouDfHl9cHBvfGZocWJteHFqbHF4fX16XWV6gHhqdnhmg3dndYiMjpV9cohqb36BeW99XVlzf251gYx8gm9wioBxd2l4gYKBgnh+c3x1h317c2dzYW6LgWtxV2lddltHbWpMVlVdU1V7a2FPVHVyUFFUV15idIVpXWBsamZjWm9hWGJwSEFnXGBlXlxWe15OVWVwWVtqaF1XaGBecmVqaHJocHN3hnhulYt0f3p4fnmDiH91cn+GhY6CcHB7eHd2eYaGh4yGenx/dIt9fYaEg4d+fn59h398eHV4eJGTn3+MfIptdYB4ZIOGlYVzkYpvhYWBeoN0ZG5qWV9bXF1UZ3JkYFlkcXJngHJia2VXW2Bqf3i+rnuft25hc4Voc3pxeIGEen2Lfnd3cnZve3Zlam9hh3WOgHNqYl5+eHmLhGZxf2hra1pWb3eJo4GFf3GZk3KBeneEb4OElIp1l4qOiYWJhX14dHFuaHhfamxgbXZqZ2pseXd6dlpnfXx5ZnN+bYV0ZXWGjYaWgHCMZ2t7hHVudWJdcX1sdX2MfIJndod+bnFpdn95f4B0fm17fIJ7eXFmbGJuiX1sbVZpX3ZVSmlqTlFOZ0xYe2hhTlV1a0xRVFVfZnWDZl5gcWhnYldqXVxraEpEallhZFZZVXlZTVZtallda2RcWWVjXnRlbWRxZ3JwdYF4cZmGdn9+d398hYd9dXOCiICVgm5zeXt6c3OFh4mJg3iBfXWPfnyEio2DgYR7fouDe3Z7d3eanZh6iYKGaXZ8e2yDg5J/co6BcIWCf4J/cGdsZ1hdW1xbU2RwZF5XYnJ1anVvZWVjV1xbaH9wb3KAc4lkZHl9aXN1c3KBg3eAg3h2cnVua3pxYWdrZ4ZzjYNtZl1ffXB7iX9pbXhnamRVV3JvjaZ8hHt2lpF0fXR+fG9+fZOHeJp9iYeDh4N9dXBxbGd0XGxnXmx0ZGdlaXpve3JZaIF3dWhwgXiCdmJ3hot8lYFvjGtte4JxZ3RmYW56Z3N4i3x/YneEd2pscnV8cnt7dH9ogH+AeXdvZGZibYV7bGpVaGFvUkpoak9LTm9HXXpmYU1VdGRKT1NXYWp2fmZdZ3NpZmBWZFdicFxMS2pXY2FVVFVzVkxYdWRZXmtgXFpjZV92Z21icGl0b3J+dHSZgnd/gHiAf4aEen11goR/l4VucnR8enVxhIWPgYB6i3VzkH98gZWNgIWEfX2Mhnp9gHZ7o6WKeYiFhGt0e3p1goCLem6Ec3mEfYKDdm9qaWVWXVtaWlNibmRbWGFze2pobWlgYlhfWml/aWtvgGdsYGh5eGpyc3Ntg4B6f3x1dG16aGp5al9lbmiBdo+EZ2VYYndqfod7b2pwZ2ZdVFhvZ46nd4F6fJCOeXZxgHF1eHuRgXqXdoeDgIWIdmpydWdnbltsY11tcl9nYWp4aHtsW26Dc3RqcIF+enhhd4aFeZCFdIlycHqBc2RyaV1xeGVydIl8eWN0gHFnanl1c215eHZ5ZYR8f3l3cWRkY217fGpqVGdhZVNKa2dPR1FqRWB3ZmFNU3JdSk1UWmVrd3xmXm1xaWRdVmFVbm5WSlNnV2ZeWE1VbFRKW3heW15rXV1aY2VgeWhsYW9vdm5wd3V6mH53f4F5gICHhnp5eoN+gZOEcXR0f3l2dIWIkX2AfJBrcpWAe4KfhX6HfYB+hoKAint2hKuef3qHh4NrcoF5dYB+gHRuhm58gHOKgGpwbmRkWF9aWVpUYmpnW1pfdYJpXm1sXGFXXFxrgWVydH1paVxrdnVnc3ZxbIR7fXx4dXJseWdpeGZdZHNoeneSgWNjVGVwaIKFeHhnaWphV1ZZZ2OOp29+d4CLjntxcn9pe3F8jn14kHOFfn9/hm5kdXJkZ2dcamFcb29cZ19tdGV6aF10gG9ya3F8fnV2YnWGjHuIiIGAeXN1gHZicW5bcnRjcXOFfHVlc4BtYW17cGtqfHp2c2eHdnt6dnFlYmRtcn1pa1NnXVxUS3FiUEZVYEdidmZhS1NvWEpNWFhna3V7ZWVucWZkWldeWHdlVEpcYldoWFlIV2VQSGF3Wl1fbFpeXGFjXn5pamBvdHhtcG52g5d6coCAfH+JjIZ9dXWGeIeMfHR1dYJ5enqCjI59foSJaXOWgXqKnX5+hXqBen98hohzcY+tjHt7ho99ZXGHeXN8enVyb4Zse35sj3pjcG9iZV1lVllZV2Nma19dXXOFaFhxblteWFpcbHticHd1bGFZbHNzZ3R1b2yDeH5/eHZtbnRkaXRlW2d1ZnZ2kXpfXVJmZmuDgnR+YmRqXFRXXWJjj6VoeHSDhpF5bnF8anpvfYd9dop0gnl8eH9oZHZsYGZfXmleXHNrWWVdb29iemVcd3xrbm5weHl0dWVzhJN/iIOJfHdwc390Y3hlXHFxYnFygn10Z3KAZV9ud2plaHp9dW9wg3Z0fXRyYl9mbW58ZGhTZ1dYU012X1BKWVdIYnRjYUlUbVNKTVpXaWxxfGNtbHNjYlpaW2F3XFNLY11YaVNXR1lgTUdpdFheYGxbW19iYlyEaWhhbnh5bW9qdoGQeW2DfoCBk4iEgXZ0iXSMhnRydnaCeH19foyQgH6TfnB3lYN8mJJ5gIB4en6AdIiDdHCZoXp6f4mUd2N0hnhzd3RrdG5+a3h8cJFzXnBuYGdibFRaWldoY21mW1xxiWVTcm5bWlhXYGx2Y2l1amleWW1zcGtzc3NphHx+fnt2bm5sZGlxY1tqcmR0do5zW1dTZWFygH9ygl1iY11TWmBcY5GfZXFxhYSSdWxse29wcnx+fXOCeIBzenp6ZGV1Z11iWWBnWl52aFdiXXBoYXdhW3x2aWpyb3h0c3VpcYKWhId/hXd0a3F+b2d4WF1sbmNydIF6dGdwflxgcHJiYGtyf21udn9zcnhrcWFcZWxsemBmUmVTVlFPdVtRT1hRSGNzYWBHVmpQSVBaVWtra3xlbm9xYltaWFlscVdSUGZWVmhTVEZaXE5IcXRYX2NsYlhgYGFdi2pjZG16eGxwaXV5h3trg31/hJp8g4R5fIdtj4dyb3Z6fHSCgnyLj4OCl3R4gZOFgZ6JdYGAgXR/gnGHgnVvoZZzeoaLhnpkdolubXpuZnhwemtzdnONa151bmFnZWtSXVtVZ2Fsa1pccYxkT29uXVZYVWdpc2hidGVkXFhtdGxvdXR4aoZ8f3uHdo9zY2RrbmFcbm1jc3iHa1pUVmNkeH19cYZdZF9jVFpfWWKVlWNucIOFinRraXxwZ3V4dX1te3V2cHp/dl9mcmNbXVZhY1hhdGVVX2BtZGFxXV1+cGhpdHF0cXV3a22FlIKJfIZyc2dwfnJ0cFRcZ2tmcnWBd3RjbXZWY3JsW19wZ35mbnh+dHRza25hWmRpandeZVNjVFVQU2xWUFZSUEdkcl9hRlhpTklYVFZtaGR8aWt4a2JXXVVbdGRTUldoUVhmVFNIWlpQTXd2Wl9la2lZYWBeXo5uYmZreXVub2l2doB/bIOAfYeYe4CHgYl+a5OIcmd0gHt1gIN9iY9/i5NyfIqRhYefhnt/hoxzgYZzfYJ2bqSLcoCNi3Z3bHmLYGR7cGZ5c3hsbXF3g2dkfG1jZmdoU19eVWdfbG5bXm6NaE5pbWBUVlNvZ3NrZXhkZFxYb3NscXp3cmyHe392m3p5a2FlbG1eYG9qZXB4fmdaVlhgbHh8e3CEX2NfZ1ZYX1djm4hia3CBh314bGx6bl14c258a3Z0b3B8gHNYam5eWFxVYWJXZHBjU15iaWFibFphfmxmbHR2b213d2xphoyAinuJbnJmcn5udG5kW2FpaXB0gXRzXmltU2VxZVZjb2R8ZHN4fXdscG1rYFlhZmd0XGRVYFVSTldkUk9bTk9IZG9cYkdZaU1KX0tYbWRgeGlufmRgVV9UXXVcU1JgZk5dYVVTSlxZUFl0dV1fZWtoWGJhW16NcWNnanhxc25odnR6hHKCg3qIjn58iYeNeW6QinVsc4J0f3+IhYeRhJWPeX2MjoeRm4SAfIyFc3+Bc3R4cm+Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjIyMjIyMjY6Ojo2Ojo6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjIyMjIyNjo6Ojo6Ojo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA+LjExMTEvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREFSzNrY2NjY3W09RERERENYaGdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMjy0aHR0dHBpohYKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1MkbY6ufn5+ftZy41NTU1NE1hX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYiIiIiIh42QkJCQkJCMh4eHh4eHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYWFhYWFhpOUlJSUlJWKhYWFhYWFh4mIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l6ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46SkpGJh46KkJKSk4+Oj4yOhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ni4qLi4uMi42Ojo6Ojo6NjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCQh4mIiI2IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI2EiIWGj4mMj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCRiYOGh4iMiI6Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yOiIeIhoyIj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjZCOjYyLjYyOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gIGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f39/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYSEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaFhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f35/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ1dHZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaWhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6e3x+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo6Ozg5Ojg3Ojw5Nzg7Oz49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VzcXN4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw5Nzk6Ojk4ODo6Nzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PDw+Pz08PTs6PD09PTw8PDw7Ozo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXV1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NDQD48PT9APz89Oz49PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXt7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRUQ/PTs8QD46Ozo6OTc6PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fX5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/P0FBQUJBQD08PTs+PTo6Ojw6ODk4ODo7PT8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0A/Pz9APT9APjw+QD89PT0/Pj0+Q0Q/Ozw9PkA9PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRUNEQT9AQEA/PUA+PD0/P0BAQENAQD9AQD49PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAQUA+Oz48Pz08Oj49P0JCRUA/QE5hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUZGRkpOTktKSUdHSEtMSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x7e3x+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QERFRD88QUNEQj8+QT9BREVEQ1d1homKflhHSUpMTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFub3BxcnZ2eXt7e3p9fX5+fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkhJR0hISUdGQkRGRERDQVV0h4mHh4aIgldJTE1MTU1MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMS0pLTUpLSEhGRkdGRVBshIeGhoaHh4iHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pz9ERkhERUdJS0lJR0hJR0lJSUpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3R2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0tLS0tNTEtNTElGSlZsgYaFhISGhoaHiIaKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRURCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhHSUlLTE9OTlFOUV5ygYWDhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5BOzk5OT09Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn9+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OzxDQEJGSEtITEtNVGd7hISDgoOEhomKi4uLiomKi4yJVDs4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Nzc3ODo3Nzc4Ojs3Njg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+f35/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PERCREZFSmJ4hISCgoOChYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2Nzc5OTc2Njc2NTo6Ozo6PDg5ODk5ODc3Ojo6ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PUFFXa3JydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc6QTk8RD9dhIODg4SEhIaJioqIh4iIiIqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjw6PDs8Ozw7OTo8ODo6Ozo5OTk8Pzw9QUJESUpMS0pLTFdvcnR1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTk5OTo+PT8/RHeCg4SEhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUJBQUI+QENBQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQUA/P0E8Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo7PDo6Ojw7PT5APz1hhYKEg4WEhomJiIeGhoaHiImKi4uKioqLiotePkRHSUtKSkZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREVFQUZFRkRGRkRAQj49QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6PTo8Oj09Pj47Pjw/PkI/Sn6DhIWGhoaIiYiIh4aGhoeJioqLjI2MjIuKiodXR0xMTUtOSUlLSElKSklFQ0RGR0ZEQ0VGREJISUtHSEdGR0dFS0pMSUtLSkNGQ0NEQkFBQ0JEQ0NERENBPTw+QGhwc3R0dnd6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/f4CAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5Nzs+Ozw6PT8+Pzw/PkJBRD5ohIKFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUpIS0ZER0hISUVFSEZGRUxMTUlKR0dISUpOTU9NTE5LSEdHR0VFQ0ZGRkZERUhIRkNBP0BMbXB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDo7PDo9Pzw9PT9AQ0JIU36DhISFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExMTEpISEZKSURKSEdLSkhKR0dHS0xOTExISElKTVBOT05NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1VvcXV2eHp7eHh6enx8fX5+f39+fn1+fX5+fn5/f36Af39/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo7Nzw9Ojw/PDw9P0JDQ0xthIOEhIWFhoeIiIiIiIeGiIiIiIiJjIyLjIyMi4uLi15SUlBNTk1LSkdGQ0hKR0xKR0tPTEtKSk1NTE9QTkhJS0xPUVFQUU9PSklKSkxKTEZHSEdGR0lGRUVCQEJCXHByd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw4Pz09PkBFRD1CRENGSnWGg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pFRkZLT05PV1ZRUE9RU1JOU1RPTVNMUFNVV1JTUlBMSk1NTUtOR0dKRkZJSkRERUVCRENjcXV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PTxBP0FBRFRLQkhJRklLeIaDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7O1FTUmB1XVVWVFZZWVNZWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tHSEpIRUZJSUlISWpzdnl5enl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQEVBQ0ZEQ0RLVlBKT09OUFB5hoWHhoWGh4iIh4iIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD9AVlVZXGRgVllicl5dV11aVkVRWVtcWV9UWWdSVVZYVFRWU09PTUtMSklJTE1LT01Tb3R2eHl4d3l5ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Afn9+fn5WSkpJSEdGRERCQT9ITElNUEtJSk9TUVBUVlVWVHWFhIWFhYWGh4iHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUldWVFpadYNZVX2QYVxYXV5XSVZeXltbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eXh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0pJSUZCREBBOk9RUVdYUFBQUVJTUlZXV1dXbIGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpaWFxoYkdPWmlnXFtcXV1XUk5TUFBRVlZWVllab3N1d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWlpSU1FPUVJRVVJVU1ZedXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVVNUXlpYV1dXemtYWlxcXlRRUVBJTk9XVlhbWmRxdHZ2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gICAf3+Afn56eHd2c3V7f3+AgHRrfn5rcXleW1ZVU1JPS0ZDREFNXoNsVlJTT09RT1FWUVNSUlRjZHaAg4KDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JRUU5LUlVSTU9ZUU1OUVNVVU1RU1JQT01MSENJR1JTVFpdbXJ2dnV0dHd7enp7e317fX19fn19fX59fn9/f39/gH99fX5+f39/f4B+e3Zzd31+fmR1fWlxdGBkXV5bWVVRTElMSWFsknRQUVNNUVJQU1tSU1JRUlVVYnN7fH6AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkJCQ0NBP0RQQ0RAQz5CSEdWQElOTUddaVFIRk9GREVGSEdIQkNIR0hLR0RCQUNATlBNUmR0dXZ1c3R2eXx6e3t7fH19fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmhlZWJcWFNRUFVSc1dlW09PTkxRUlBVWVNVUVFUUk9WYGtsc3Z6e3h5dXJuc3RzeXh+foOAg4OCgYKAgoGBa0xHPj46Oj5APz4+PmpQSmFFRkhJRUI/SE1NR01RVUpCRT8+PD08PT0/PT9BQ0NAPzw9Qj5JTUZVb3V1dnN0dnh6fHp9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpPUE5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG9raGBucmltbHF1e3p9e3h6fHx4d3hkQkBAQTw6QkNBQUNBW1xOe05PT05LTE1PT1BMS0xXTkhHQUE8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXV3dXZ3eXx8fH18fHx8fn18fX19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PT15cWklHT1FRT01QUU5RUlNWWFNSWVROWVpbV1lcX15fZWBdXnF3a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSEVFRkNMUU9hV1JYUVBTU1JVW09PUVdQTUpERj46OTY1ODc5Nzk6MzY1Nzk1PEI9ZnR1d3h3eXl7fX18fHt8fX1+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtTVFNQUVVPTFJTVFdYU1RYUUxYWVlWWFhWWFldV1hYaHNrXVZgdGthYV9dZGBfXllVUE1PTUxJR0pLSUhGQ1BPU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU5OUducnV5eXp7e319fX18e318fX5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFdWVlNUVk9PVVZXWFlTVVRMS1NVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk1NTEpGUFBVWVNUT0pOT1VTVFxWUlVTU09NTElISEY/Pj06Nzg3NjU5OTY3NTY1V3FxdHh6ent8fX19fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVFNWVFJYWFlZWVJVT0lHT1BPT01SSk9QT09OTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUE9OTk1QTlRSUFJMSUxLT1JQUVJTVFFTT0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdVUVNGRkFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I9M0A+am9hUlJRQEdUUU9QUFFOUU9QT0xKTExPUE5NUFFRTlBPSkxNTUtHRUVDQjs9PTw5PUc2Njc2RG5xdXd6fHt8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZWWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkI4RE1TXWdTUVNBR1VQT1FRUE1NTkxKTEtMTk9PUUxOTk1JTUxJS0tMS0dGRkVEPEFBPjtARTs8ODlUcnN1eXt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT49PUFAQj0+RUhGREZGSUdKSkBGQUFARUdESU9IUVJhXFFQUk9TTk9PTExPTUtNTE1PTltWS01RT0hKSENJSkxMS0ZGRkU/QkM+PUJHP0I/QGRydXd7ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPzs+QUBAPkFESUVDSEdJR0lFQkI/PjxCQUBHSURNT2JlUE1PTVdLTE5LS01NTExLTk5TZE1KTFJJSUlFQklKTE1OSkdJRkJCQkA/RUZFSERMb3B2enl5e3t6fHp3dHh0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTExJTVBNUE9IS0U/Qj05OTk6P0I/PEFCQUFEREdLRkRJSUdHSENDP0I+Pz9APkNFRExNUVRMSklNVEZJSUpMSUpLSUpMTU9QUlBLR0NLR0NDS0pMTk9OSUpJR0NDQ0RJSk1MSVpzbnh5eHp7e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhlcUhKQ0ZHSEdKS0lKTERHQjw+PTo6OjtBQj89QkJDQ0hFSkxKRUlJRkdIQ0M7QUBCPkA/QkVESU1PR0hKR0hLREhJS01ISkxISUpMSk1dUkhJRE5HQkVMS05OUU5MTUpLRkdHSk1OUk5NY25qd3Z3e3l7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGVwRkpDRkVGREVFRkVHQ0NAPTw9Ojs6O0FEQT9CQ0VFSUZKSkxGSUlHRkZEQjpBQ0M+P0NDQ0RHS01ISk5IREhESUxOTUhJTEdGRklJTE5LSUhFT0lDR05NUE5QTk9PTUtJSElPU1FSTlNnZ2Zyb3N4dnt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1mX3BHSkNFRURCQkFFQERCPj8+Ozs7PTs9P0RCP0FDRkdKRkpJTEhHR0dGRUM/PURFQj5BQ0JDRUdISUdNUElGRkZLTk9LRkhJRkVDRElJSEtJR0hQS0RKTU1RTk9OT1BOSkpJTVJVVVJQWGVhYW1mcHJvcnl6Z2VoaGNpbGZxbGZsbWdpa2xzbXB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRURGQkFAQUQ8QkE+QT06Oj0/Oz4/QUI/QEJFR0pGSkdJR0ZGRkVEQ0FBRUZDQkJCREVFR0dIRkxQTElPSkpMS0lGSEVGRUNDSEhIS0pHS1JNQ09PTlFPT09OT09LS0tQVVdWVlRZYF9daWBtam5ocnNiZWZmZGhoZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Bya2tzTUdHRUdBQUBDRDxBQUBDPDg6PT46Pz1AQkBAQERGSEVIRkZIRkVFRENEQkRJRkNHRUFFR0VGRkdFSk1LSFFNSktISElFRkhIRUNJSUpLTUtQU05EUlNRUVJOT01PUE1MTlNXVldZVlheWl1kYGhjamlna19kZWZjaGdna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEFBQkVFPEBDQkQ8Nzo9Pjs+O0FCPj8/Q0VGREZEREdFQ0VDREZGRkpFRUlHQkdIRkdGRUNGSkpHTUtMS0hKS0ZJSEpIRUtLTExOT1JUT0hUVVRRVFBRTU5RTk1RV1pWWllXWl5aWGFgYGBeaGVjYGRlZ2dqaGhqZ2hubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3NzeU1ISEdJREFDR0U8QEVCRDw4Oj4+Pjw8QkM9QD5BQkZDRUNDR0RDREVGR0dHSUZHS0hDSUhHSUdGREhLSUdLSE1LSktMSEtKTUtJTkxOTk9SVVZPTFZWVFFUUlJMT1FQT1RZWllcWlpcX19dYGNeXGJkbGNgZGdocoVoZ2pmam5ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0lLSEpGQkRHRT1BR0REQDk8PkA/Pj9DQjxAPkFBRkNFRENIREZERkZISEZIR0lLSkVKSEhKSEZGTEhISEpHTExMTExJTUpNTk1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXV5gYGFgYmVeZGBmaGBlaGpkc3NmamhnbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3cHdJSkxJS0dCRURFPEFGRERCOz8/QUBAQURBQEI+QUNIQkVERkdFSUVGRUlIRklISkxISEpKSUtKRkpLSElKSkdLS01MSklMS01OTk9MT1BSVVdWTU5UVlVTUlFQTU5UU1JXW15eX11eYGBhYWJgY2RlYmRpY2Rpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXVzcHN3dHV1d3Z1dXRlcXNrcHFqcnZwd0pMS0tMR0NDQUU8P0VFRUM9QUFDQkJDRUFDREFBRUdDR0dIRkVJRkNHSkdHSkVJTEhJSk1LTUxHS0lIS0tOUUtSUUxTTUpNTU5QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmFjXmBmYmFjaW5oY2loaG14dm1oaW5vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2c3FxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHREFARD49REVGQz9DQUVEREZDQkVHQ0NJRUJISklHSEpGREtKR0hKSElLR0pKTktOTElMSEpNS1pmSmRcS2xSR05NX25VbHNbcXBid2NSUGJ2dWh1Y2F2YVhucWJkdmluemZcbHVgbGtVX3d2aWpoaGZnbG1qbW9qbW9zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVycXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPzxERUZEQ0NDRUVERkJFRkdEREpEREpMS0lLTEdHTkpISktHS0pJS0pOTE1NTExJTUxMW3NiZHBebGxVTE5lcl1nZXFsbnRncGlfYVlubWJwcGJrampnb3F0ZXRublxwdmdwTktxeXZrYWFrZWVseG1rdmxub3NycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QUE/PUJFRkJFQ0VERUVEQ0hIR0RFS0hHS01NSkxMRkpOSEpLSklLSkpJS01NTk1NTUtOTU1bcnBvbnBwbGtNUFFsWE5pYnRycGFtb3ZcWWxQW21tWnFta29teHh0c2lwXWBzbHFqVXV5eG9jXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHR0ZFRUJBQj0/P0VHQkdESUVFREJGSUhIREdLSkdNTE5KTE1HTE5JTUtISk1JSkpKSk5PTk5NTE5NTFxoZHVdbHFXbE5PUW1VWmtea2x2YWxkdFRlY05sWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2hhY2l0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJRUVEQ0FCPEJAQkZDR0ZLR0VDQ0hLSEhGSUxLRk1LS1JSTEhNTUhOSklITkdKSkhITk9NTkxKTk1KWnRwcG9xcW1sT1FSbllza2dvb3Fxb210Xm5YYXRfbm9wb3Fyb291c3R0altedGN3eHJqbnpoYWFjZmFiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dElLSEpDRUVFQEA+Q0NBRkNISU1IRkNGSkxJR0ZLTUxGT0pLV1JLR0tKSk5JSUpMSUtKSUlLTE1NTElLS0tTa2JZaV5famNyclpfWWpvX2VlVWtfZFthYlFgbWhcalxuaWlkW29lZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSURFREZBQEFFRENHQkhKTEdGREdLTElFRkpPTElPSkxbUUpGSEhLTUlISkpLS0lISkdLS0tLR0hLSkxLTEpJS0xOVFtdVFBVTVFPTk9PVVJQUFFPT1FKSk5QUWRxaVRZVltbXFVZW11YXVxcY2ZhYWZiY2ZfXmZrbWhtdHhydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNHQ0VHRkZBRUM/Q0dERUdDSUtMSEZER0tMSERHSVBLTE9LTFdNSUZFSElKSElLSExKSUZISEpISEhFRkxISEpOS0hPXFdeT1xcYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXGFYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUFDREJESUVHR0ZLSktIRUVKSkpGREdIUEpMTUpNUklIRUFIRkpJS0tJTEpJR0VKSEVGR0VFSkdCSU1JSlRfWWBYYGFbYFVYWVReXlpfUllcUF5cWU5fXF5TW15kXlpdYGNfWV9iW2BeW1VZWFpfXmRjYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3V5enp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUlERktKSkVFSElOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlGQ0RFQkZKRD9JS0lOW2NZXl5hX1JUU1dfYFxdWV5RWVxNVl9XS1FZW1FbX2JhXV5jYWBiYmJjY2VaUllWV11bXmRgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGREdFQkVHSEZHSElGR0pHSEZIS0lLRENLSk1NTExISkpISkc/R0ZOSktLTUtLS0lHSUVFQERBSElBPkhJRk9dYVpbZF1fVFFSWF1cXFxfW0tXXExSXFlJTV5RUV1fYmNjY2NiXGRjYmRjZVhSVlVUXVlbYV9eX2FhX2Rsa21qa2xudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRktJRkdHSUdHSkZGRklMSk5FQ0tKTE5KTElLSklJR0JISFFNS0tPTUtLSUhIRkU/RUJISEFARkVDVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVZaYVJSX19iYmBgYmJfY2JiZGRiWFBSUlNcVFxdXV5eX19gZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIRFJLRkhISERGS0lNUEVHSUpLTkxMSUxLSklHREhLUU9NTFBNTEtLSUpERUFFQ0hGQUFGREFWVUVcVF5TVl9YTlRVTlpbTUpLVGBhW19YX15iXU9YYlxgYF9iY2FdYmJXX19UUVBRUllTXlxbXV5fYGFmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElTY1FFV19JR0dIREZNSlBQRklJSktOTExLTUtKSkdFSU5RUU5PUE1OTU5ITEJEQUNDRkRDQUNEQExIQ0xMUE9OTEZNRkZISUhHTExNT1BJTE9QUFNQTFFUUlVaWFdZV1djVk9TVFBRT09RVVRcWVlbXl5hYWVmY2hkbG1xc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES01eTUhIWU1HSEpIR01MUVFJS0pLS05NVU5PS0tMR0dLUFRTTlBQTk9PT0hLRmBFRF5MRGZjQ0xbSF5cc21PTVZtWUxDT19UbFdnSl1XVV5ETFFVTE1TVlFSVFhWVFhUVFxUUGZaaGhlWlRrVFhXVVtcXGBgYWJiYmBnaWdubGhyenx9foGEhISEg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLT1RKS0dgVEhKT0pJT01SUUtNS0xPUlVST1BKTE5HSE1RW1lPUFBOT1BQSktRf1FJfFlZcnNXUG1HcW5vYVZQcXF0T0Jqc25xdHBTb19bblhdVlxYVWtoVV1WY1lgWVpeVVVXf2l0dXVfYXZfWWJcXGZbX2FhYWJeYGNnbW9sYHB3dHiBgYKDhIJ/fX6Adnh6bXZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0pMRlJWTEtPSExSWFdRTk9PTVFUTk9RUEtMT0dNUFNbWlRRUk9QUFBLSVp4XVR4ZGhYUlNQdmZ0bHBibmZrUnJOTHdtanJwc3JxcnBvcIBdZXp1eHFxenF+cn1rdX1hUmh8ZXNzb3NzfH1wfnhvf3JgYGBiYlthYWhsbmtibGZnbXd+gYCDfnt4d4B0dnpocn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tISlFPTU5KTlZeWVVMUVNOWVlMU1JSTkxQSVFSVFlXV1FUUFBRUktIZ3hsY3hxbVpKTFR5cHVtdWJudlBkZEhldnFtd2+AamZ4eGlXclFoem1panp6fWx4en9waG5YdXVqdnVwgGFzaH1pbHh8b19fX2NiXF9kZWdqamVnYmNkbGxwcHN0c3NzeXFyeGJsdGdyeXtzc3V5foFzdnpufH15eHJuTUpSdE5DQkVQUUhLTEpMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBKU1RVWFdXUFVQT05TSktyb3V1cXVxY2hhVm5McXBeR2h5V3ZUS2h4fXdgeXtzbmFdbW9kU2dydW5teXB3bHZzdHFsbVxzfnprbXl8bHVufGxxdnV4Xl9fYl9dX2VlaWdoZmVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21LS1pWSEdFR1JRS01OTExRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTkpUVFZXWVdPU09PTlFJUm1IaXdLYGR2dVVXbE5ubHtyYWpnf3VUS1drZ3xsbWx4X1pwentfYHpzY3JveHFoZHxpcntdVEtrX3Z1bGp2fHttfnlrfHBdXl5iW19iZGVnZmZlY1tjY2lra3JzcndnbWloZGdgYWxhZ3NybGdsbXJ8a21oa3t0bW1rbU9HSktISkhIUlFNT1BNTFNTUk9TUlhSV1RQV1pWVlRUVGFgUU9OS1RTU1FWVk9PTU5PUUpIUU1PVUxLS1JTUlJST1ZVUVFPUlJYWFBOUFVUV1hYW1tVUVJXW1dYV1tPUlRXV1hRXVhWXFVUT1hSV1dYWVpgXGdyX1tbWl1dX2NaX2NjZWdkZGRjWmRiZ2ZmbW5tdWZmZ2NgZl5eZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUElLS0xNS0pUUk5SUVBMVlVUUFRVWFVaVlJbXVZVVFdVWVhPT0xOV1RQTlVTTlBOTFFQS0lRUUtRTUpKT1FUUlBRU1JJSU1PUFFSUFBQVFVSWFdcV1NSUFFVVVVTWlFOUlFXVVNZVlRYVFNRVFNVVVlZWF5aX2FdXFpaXFxgY1xeYmJkZ2VlZWJZYGFjYWJoaGpuY2FkXl9jXVpjXGJtYV5mZmdtc2RpaGtrZWRjZmhRSktLTk9MTVRRT1RRUU1YV1VUVlhXV1pWU1xgVldWWVVYVFFQS09YU1BOVVBOUU5MU1BNTlVTTlFOTU5RU1BUUFJUVE5MTk9SVFRRUVFVV1VZWltaU1VSVFhXVllcU09TVFdVVFlVVlhUUlFXVVZYXFpcYF1XWV9dXl1cXWBhXltiY2NoZ2ZlYlhgYGJdYGhlZ2VhXl9dXV5aWl9aX2dgXl5dY2hrYWhmaGZkYGJkYlBLTUxQUUxPVFBQVFFPUVpZWFdZWlpYWVZdamRWWFlaV1ZTVE9LT1ZUUE9UUFBRTk1SUU9RWFRRUU9NT1JUTldRVFRVT05OUVRVVVJSUlRYVlpdXFpWVlFSV1hVW1tWUFNVVVVWWFNXV1RSUVhWVltfW19gX1ZfXV5gXFxgYF9fWmJjZWloZWViWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9WXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1OV1NNTVJPUVJPTVBTUlVaVVRQUExQV1VRVlJTUlhNT1BSVVhVVFRTVFlYW15dXFtWUk9VVlVbW1ZRU1ZUVlhUU1haU1JRWVdXXV9bYF9gVmJcYGFdYGJfXGBdY2FjaGllZmBaY2BhX19lZV9gY1taXFtcWlpZWVdcWlxbYF5gW15eYWBfY1xZYFpRTk9OVlFQVVNQVVRTUFdcXFxZXlxfV1xeanB3eYBjXFtWVllSTlBXU05RUVBSVFJMUVRTWVtXVU9STlNYVlNSVFJSWk9RU1NWW1ZWVlNWWlhdXlxcXlZTTlRWVltbVVFUVFVXWFJTWVxUUlJcWFpdXl1hYWBXYltjYl5hY19cYmFiX2RnaWVnXVxlYGFgYWNkX2JfWVpfW1xbWFhZV1daWlphXF1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQW11eXVxgXGBVXFxoanJ9c2xoXFVZV1FPUltTUlFUUlRVVEtSVlVaWlpTT1NRVVVVU05VUVJaUlRVVFhdV1hYU1hcWF5dWVpdVVVOVlZXXlpYUVRUV1hYU1ZZXFRSVl1ZXV1hXmNjX1lgW2ViX2RkXl5jY2FeZWZpZWZeXmRhYWFiY2RfYl5YW19bXFtYWFhYV1taW2BdW1tcW1haW15WXlldUE9PUlpQWlVWV1ZUVFReXmBfXmJcYFVdXmJreXVtfWxaVVpWUVFUXFRUVFVUVllXTFJaVlxaXFJQVVNXVVVTT1dRU1hTV1VWW15YW1lVWl5YX15ZXFlSV1JZWFlfWVlSVFVZWVlVV1lcVVRaXV1eYWJgZWRdXl1dZWFiZmReX2RjYFxnZWhmZGJgZWFfYWFiYl9gXldZXlpcXFpZWVdWXVpdXltaW1xbV1lcXVZYV11TT1BXWVBdVVZZV1dVWF9gYWFgY11gVV1eYmVldoJ7aFhZWlRWVFZcWFdXVlZXXVhPVVxZXl1dVFNYU1dVVFJTV1FTVlRYWFheXlhdW1VdX1hfX1hcVlFZVFlaWmFYW1RWV1paWlhZWVpXVl1fYF9kY2JlZV5iXGBmYmRmZF9gZGJhW2ZjaGZkZmFmX19hYmFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWVFxVV1dZV1ZcYGFhY2FjX19WW2BkYV96dW9oWlxaVlhWWFtaWVtZWFlgVk9UXVtgYVxVVVlQVFZVUlZVUVNVV1tbXF9fWl9cVl9fWV1eWV5WU1lXWVlcYVldVVZaW1pbWlpZWlhZX19gYGRjZGVlY2RaYmZjZ2ZlXmFiYGNdYmNpZWRoX2deYmJjYWFgXl9YVFpaWltbWFxYWFxbWltXV1pYV1xbXGBdVl1dU09WWlZWWlZZVlhXWF5gYmFkYWRhXllZYWRiYGtmaF5cXVtXV1laXFxcX1tZW2JWU1deXWFjXFNWWVBWVVVVVlVTVVRYXV1fYGBdYV1XYV5bXlxbXlhWWFdbWl9fWl5XWFxcXF1dW1pcV1pfYV5gZGRkZmZnY1ljZmVoZ2ReY2BfZWNdZmlkZWlfZ15jYmNhYWBfX1tYWVtZWllYWlhXW1taW1dYWlRaXVxbYFxVXmJNUldZVldaWVtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX11dXVhXW1tdXV9fXFpdY1hZWF1gY2RfUlhZUFdVV1hXVlZXVl1dXmFiYV9iXllhXV1eWVxeWVhVVltbYF5cX1lZXl1eXmBcWlpZW19iX2JlZGVmZ2hjWmVmZ2lnY19jXmBmZVppaWNmaWNmX2JiY2FgYF9dXVpYW1lZWFhaWVdaW1pZV1lWVVtdXV1gYGJieEtXV1xZV11cXF1aV1xdX2BiZGJjYV1gWGJjYmBjYWNeXF1cWFdbXV9dYF9dW2BkXFxYWmJlY2FSXFlPWFZZW1lZV1paYF5hYmNgYWNfXGJdX11bXl5ZWVRYXVxfX15fW1peXmBiYlxcV1tdYGJiY2VkZ2ZmZ2VdZWdoaWZjYWJcY2dgXGlpY2hpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldXWFBYWl1hY2Zmcmt/SllXXVtaX11cXlxZXVteX2JjYmFhXWJbYmRiYGNiYl1cW1pXWGlxYFxgX11cYWNfXllZY2VkYlRfWlFZV1xdXFtZW1tjYGNjY2BiZGFgY15gXF5eX1pYVlteXFxhYV9dW2BhYmZiXlxTXF9gY2RkZmVnZ2ZmZmBmZ2hoZ2RkYFtmZ15haGhjaWhmY2BiYGNiX19fXV1bWltZWFhYVlpXXFtaVlZVTFhYXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7fHt7e3t6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t8e3t7e3x7fHx7e3t7e3p6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqHc3FycnJycYOKiYmJiYaz1tLS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjIlyb29vb29uhY2MjIyMiL/p5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh4eHh4eHd3d3d3d3d4eXl5enl5d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHp6enp6eXp7fXx8fHx7gYSEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnV1dXh2dnZ6e3h7eHd2dnh5eXp6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3t7e3t6enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d3fHx9enl8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3l+fH19eXt6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3e358fHx6fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4e3x8fXp8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXd4enp7eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYGBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLioqLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eDhYKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4eNiYiJhYSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhoaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhYOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKiouPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKCgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4OBgYKEhIKDgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBgoOBgIKDgYKFhYWFhoaHhoWGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SEg4KDhYOCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46Qko+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDg4OBg4SFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKCgoGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5+f4CBgYGCgYCCgoGCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgYGCgoSCgoOEgoOEhYaEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GCgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYGDgoOFhYODg4SDhIODhISFhISEgoGAgYKDgoOEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5OSj4yMioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAgIKBgX+BgYCAgoGCgoKBgYKCgYCCgoKCgoKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJOSlJKPjYuHhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAfn5/f4CAf4B/gIGAgH+BgYGBg4GAgYGChIOBgYGBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgYCAg4KCg4KBgoKDg4OEgoODg4KAgICCgoKCgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOEg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SFhYKBgoOCgoSCgYKGhYOFg4OEhISGhYSEhYJ/fX19foKEg4ODg4ODg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSEhYWFhYSGhoWGhoWFhYWEhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyLiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4SDg4OEhYOCg4SFhYaFhoaFhoeHhoOBfn9+fn5+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgoKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODg4WFhYWHh4WFh4WBf39/f39/f36AgISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGh4aGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDg4SEhIWEg4KCg4OEg4OCg4WEhYeHhYSCgH9/f39/gH9/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eIiIaHhoeHhoaFhIOEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4eFg4OFhIODg4KEhISEhYSBgIGCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiouLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISEhYWEhYWGhISEhYWFhoWGhYOJlJOQjpGOioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4eEhIWEg4OFg4WDg4OCgYKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYSDhoWDgoKCgoKDgX59fn5+fn5+fX1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4eJiISDhIOFhISFhYaIh4aFg4KCg4WHhoeGhoOCgoOEgoOEhIKBgYGBgYODhIOEkZKRjo+Ni4eEhoaDgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgoKEhIOChYaIi4qGhIaEgoaGgoCFhIODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYODhIWFhYODhYSEhISEhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+NkI2JhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWDgYCAgX9+fYKDg4ODgoKAfX1/gICBf31+fn18fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4OAf4CAgYOCgICAgIGBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGjJORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn9+fHx/g4OCg4KDgX19fn+AgIGAfn19fX1+fXx6enp/goKAf39/f35/f4B+fYB/f4CAgX+AgIF/f3+BgX59fX+AgX9/fn+AgH+AgICBf4CCgICCgoGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoODg4SFgIF/fH19fn19foCAfn1+fXt9foKDg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6eXqAgH9+f35+fn1+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fn6Af4B/foB9fX+BhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXt/f35/f39+fX5/f4CAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/f4B/f35/foCAf36Af39+fn5/f35+f318fH2Fk5KNjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgoGDhISDhICBgICBgIGAgYKCg4GAgX+AgoODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2Af4CBgYF/f4GAf4F/gICAgYGCgoB+gH5/fn5/foGAgoF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISDgYODg4KCgoGCgX5+fX19fn6AfX19fX19fX18e3p6eXl5eYCCgoKEg4CBg4GAgoCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhYSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGhoWFhoGAg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIeIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4eHhoeHf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYWEhYOCg4OCg4OCgoKCg4OCgpKQi4iIh4iHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYaGh4eGh4eIhoeHh4aHh4d/fH18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZeEg4OEhJSTgIGBf39/fn6Ei4B/gICEhpCJhYSCgoGFhYuDgYOFhYaGhIOFhYOEhIODhIOEhISIko6LiYiIiYeHh4WGhYSFhIKCgoKDg4ODg4OCgYGBgICAgIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhISGhX98fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fH+Cg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4uKioyJiYmHhYaFg4OCgYKCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCg4SDgoOCgoWGhISFhYSGhIOEg4KBgYOBf319fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYKEkZGNi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgoKDhYODhYWFhYODg4SCgYODgoOCgoGAgIB/gX5/fn59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+f36Agnx8f3+BgIKAfn17ioJ9gH9+gYCAgYKBgoCAgIGAf4uTj4uLjY6NiIeHhYWEhIOCgoGCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIGBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfXx9e319fX19fHx9gH+AgH6Afn6BlJGLjI2Nj4qFhoaFhISFg4OCgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKDhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt8fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dhn9+fX6AgIGAf39+fX19fX57e31/f3+AfX9+gIyRjYuMjY2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f35/gIB/gIB/f319fHx9fn18fX19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1+f399foB+fn6EkoyLi46Ni4qGhIWEhIODg4OCg4KDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+AhIOCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoSChIOCf4B+f4KBgn9/goJ/gIqPjIqKjIuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+AgIGBgH99gH9/fn9+fn9/f3yCfn59fX17e319fHp8fH6AgoGAgIB8fH18fHx8fH18fXt/fnt7e3x8fH18e3t7e3x8enp9en6Cf4GDhIKBgoGFhoWFhoaHhYKEkY6MiomKh4iFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/fn5/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn5+fnx8fHx8fHx+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7e317fX5+f4CAg4eJiYmKiYqJhYiRjYuIiIaFhYOCgoOEhIODgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gX9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX19fX18fXx9fX1+fH18fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6ChYiHiIqLi4qJjJCNjImIhoWEg4KCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImNj4yKiIiFhISDgYKCgoKCgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx+f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX1+fX5/fX19e3x9fnx8e3x9enp5eXp5e3t+foCBg4eEiI2MiYmGhYSEg4KCgoOCgoGBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fn18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjImKh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYSBfn6AgH1+gH59fn6AgH+Bfn+Af39/gH99fn9/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIF9fHx9fXx8e3x8e3t7fHt8fHx9fImJh4eFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x+iYWGhIWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen19eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfX6Af4GAf4CAgH9+fX19fn1+fn19gYR/gH9+f4GBf32Af319f31+fn1+fHt8enx7eoCFgoOEhYSEhIWDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXR1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAg4F/f4B+gIF+gIGAgH9+fn5+fn5/fn6FhYCBgH+Ag4F/foGAf36Af4B/fn17ent6fHt6goN/goKCgoOCg4KBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dnR6hISBhISDhIWFhoSDg4WEgoODgoCBfn9/f4B9fX1+gH1+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GEgX+Ag4F/f4B/gX+Af3x7e3p8e3yBgH+Bf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4KAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgIGAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fX99f4B8f39+fYGAgH59fYB/foGBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGCg4KBgX9/g4B+goKEgICCgYKChIF+e3t8fHx9fX1+fXp+fX55fn9/fHx8fn1+gYCBgYGAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55fHl4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDhIN/f359fn5+f4B/gIB/gYKBgH9+f4F+f4CCgoCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhYWDg4ODg4OCgYKDgoGDgn+BgH9/fn+AfX19fX+AgIB/f4B/fIB/f4GAgYCAf3yAf35+fn9/fX5+gIGCgn5/fn1+fn5+f3+Af32AgYB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnF3eXJ4hYWFhYOEhIKCg4KBgYKBgIOBgIB/fn5+foB+fX58foCAgH+AgX97gH6AgH+BgYB/fYB/fn5/f319fX6AgYGBfn9+fn59fX1/fn9+fH6Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fXt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf3+CgHyAf4B+f4GAf399gH9+f39+fX18gICAgIB+f35+fn18fn9+f358fYB/fn1+gIJ/foCAf36Bg4KCg4WFgoJ+fnx7e3x8eXd7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNweHdxe4WGhYWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAf4GBfX6Af35/gX+Af3+BgH+Af35+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYeEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYF/goF9foF+fn+Bf4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYR+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/gICAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBkox6fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoKAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jX53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIGCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359f4B+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICAgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4GEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4GAgH+AgH+AgYF/gICAgIGAgYGBgoGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYODgH+CgYWDg4SBgYOAgoOBgYCAgYKDgoCCgoWDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CBgH9+gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoKCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX54d3Z5eXl8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIKBhoODg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAgIGBgYGAg4F+gIOCf31/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9gHp5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBg4GCgoGCgX6BgICCgYKBgYOBgICAgYCBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4OEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+fn+BgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChIaEgoODg4SBhISAg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoKFhISDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dH2Hh4OChIWDg4SFhICChIWEhIOCg4SEgISFg4KCgoODgoOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e31/fX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3V2f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgYKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4SEhISEhIWEg4OEhYSFhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfHyAgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KEg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDhISEhYSEhIWFhYWEg4ODf32BhH99fXx8fHx/gX59fn9/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYWEhYSBf4GDf35+fH59fX+BgH9+fHx+f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOFhIKEg4aAgoWFi4mEhIOEhYWDh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgX2BdYF5g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOAhIOAf35+fn19gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIaEgYOEhYOEhYOKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8f3OCg3+Dg32BfX5+fX6Cg4F8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26AiHltfXJzdnN2bW14bHB5bHV9f399foGAgX2Af32Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gX9/fH99fIF+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4eIhoeEhoaLioWEhoeHhYOFhYWEgoWFhYWGhoWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJioiFhIaGhYWDhYWEhYaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomJh4aEhoWGhoWGhoSGhoeGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKCgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhYaGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWEhoeGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fXt8fH1/fnx8fn1/f31+gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhIiFhoeGh4aIhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhoSGhoWGhYSGhoWEg4WFgoWHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fH9+fX1+fn19fH98fn58fYGAfXx8fXx8fH56e3t9foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhIaFhoeFhYaGhYSDhIOChIeDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX18fHx9fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhYSDhISFhoaGhoaGh4WFh4WGhoaFhIOEg4ODh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1/fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoeGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4OCgoOGgYN+goKDgIODf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWFg4WFhoaGhoeFh4aHhoeHhYSGhYOBg4KAg4WCg36BgYF/g4F/fn5/fn98fH1/fXt9fXx9enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WHh4iGhYeEhoeJhoaIh4eHhoeIhoSGhoaHhoWHg4SFhIaGhoeFhYSDhYWHhYeGh4WGhoaFhoaEg4WFgoGCgYCDg4OCfYGBgH6DgX5/f4F8f3x9fX59e359fH15enp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoWFhYWFhYODgYOBgIKBhYKAgH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYaFhIeDhIWEiIaGh4WFhIKGhYaFh4aHhIaGhoaFhoODg4WAgIGAgISAg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18fn5+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OEh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEg4aFhoaGhoaEhYaGhYWGgoKDhH9+gICAgX+DgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXx/fn18fH1/fnx7iIWFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYOEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOFhIWDhYWBgYODf35/gH9/f4N/fIB9fX+CfYCBfn6Bfn19fX1/e398e3p5enp5enp8eXp6e3t7fXp7e3t7fX59fYB9fXx8fYB/fXyGg4aGhoaGg4SChYKFgYGAf3+AgH5/gIJ8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYaIhoaFhYeFh4WFgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhISDhIOFhICAgoJ/fX1/fn6Ag357f3x8gIF9gYB9fYN8fn59fX57fnt7enl7enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn6BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoSFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoOChIODgH+AgX59fH5+fH+DfXx+fHyBgH6Cf31/gnx/fn19fXx8e3t6enp6eXt6enp6enp6e3x5e317fH9/f4GAfX59fX1/gICAhoSEhYSFgoOCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhoSCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhYWCgoKDhYSCgYGBgoCFg4F/foB/fnx8fn18foN9e358fYF/gIN9fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRkw9ODc2NTk5OTw+OT88RDo7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojs4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1dTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dTV1dXV1dXV1dXU1NTU1NTT0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2tjW19fX19fX19jX19fX2Nzd3d3d3d3d3d3d3d3e29fY19jX19fY19bX19fW09LT09PT09TU1NTU1NbW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNhG1wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKioemuri4uLi4uLi4uLi4ubN4c3Nzc3Nzc3Nzc3NzcJK7uLi4uLi4uLi4uLi3vdLS0tLS0tLT09PS09PT3OLh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzk4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NPg6ejo6Ojo6Ojo6Ojo6WZMikrKysrKysrKysrKiVhqaSko6Ojo6Ojo6OjoavS0tLS0tLS0tLS0tLS0d/q6uvr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8NztAQz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzc5SKzExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXU4WopKSkpKSkpKSkpKSmmzgvMDAwMDAwMDAwMDArZaqlpaWkpKSkpKSkpKOs0tLS0tLS0tLS0tLS0tHe6urq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs+QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183PXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYl6MrKmpqampqampqampq6BFPT4+Pj4+Pj4+Pj4+OW6vqampqampqampqamosNLS0tPS0tLS0tLS0tLR3unp6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI/Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcXCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs7Ozs/Oz8/NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLz9HR0tLS0tLS0tLS0tLRysrKysrKysrJycnJycnM0tHR0tLS0tLS0tLS0tLU1NTV1dXV1dXW1dbW1tjZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7Ozs/Rzs/T08/O0NTSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW1tbW1tbW1tbW1tbW1tjX19fX19fY19bX19fX1tbW1tbW1tbW1tbW19fW1dbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7OztHBp9LPoZbL0caTq9LOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7Oz8/RnY/FqqCrn86ZrZmz0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD5BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/Pz8/Tuq+rsZ+Vj6G0lYednc7Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz8/P05+xnqedn6eZtL/JlpnG0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/P0cCciZu1pKCLn8PSkZigztDQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8QkA+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/Pz9SjooGbxZnFyZTYrKO/ndXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDs6OT9APTw9PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NHEn4F7l5+ilZWhu82IlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw7Ozg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DVq6+8wNN5m7CznaXQ26KZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ozs5PT49PTs7PTxAQ0I/Pj47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cmHf4WigqObop2ckaiYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU0Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocbT09WcmrKgqaCinqmiqZzQ09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QUNCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDS0dLXqIjPsI2RpdSakY6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDk9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHR0s/F1NXAvdbU07jI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6PD0/Ojs5Ojw9QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0tLT1NLS1NXT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PD47Ojg6Oz8/P0JCQT5BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oz1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTo8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs6ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0+P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88P0I/Ojg3NzY9Pz9APUBAPz89PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PS0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT49PD9APzw1Njc2PD4/PjxAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUE/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUZDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QENAQ0NAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6Ozw+Oz09Oz48Ojs4OTo4OUFBQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjs5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89Oz89Ojk5Ojw5O0VDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjtEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw8RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3NzY4NThAPkA7PDk8Ozw+Ojo7OTo7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4Ojg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODc2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzc2NjY4Nzg0Oz87Pj05PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg3Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWh4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4Njc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIN2dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njc1NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NjY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg2MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc4NjM3Njc6NjY2NTk+Pzo8Pzs/OTs6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT08Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzg3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3ODk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NjY2Nzg4Ojw7PT46Ozo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVES1BOPDk4ODY1NTM5NTY2NzY4Nzk+Oj0+Ojw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTU0Nzc1Njc5PTo9Pjs9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE0NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNDczNzg1NzY2Oj0/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urq5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTg8OzY6NTY1MzQ2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpkbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTU4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXhwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tbW2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY2NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6enqCgoKCgn6ChoKCfnpuamZqam5ubm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXlpaXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnJycnJ2enp2dnZ2fnpyampucnZycm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaXl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5KUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cmpubm5ubmZiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+uLa0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqam5ubmpuYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL6zr66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yPj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4eIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVUYlFEVE07Pzo8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcU19NSFFJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODo6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKlqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGRjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKWioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsZ2JiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq2mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Necl9oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmloYl5QUUA/Ozo4Ojg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqaeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloKGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbGh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLazurGqrrSxsLG0tLa8vL68vL3Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqTlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2l0ZGlkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGw8O5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsae8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzszMx8HDx8fIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbGhxeG95aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEy9DLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2hndVpmcndzeGZmXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsXJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8nGw8PEwsS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamhdam9teHdiYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjHycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytpqm7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWh0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHGwcvLx8bMyc3FxsbDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlkdG5zYlxiVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHDxL+/vsTLyMrLyLy7yMfJzcjDyMnJxsXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu7vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cm9mZWdjamRham1ubl5YXFZVTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsG5u8O6uLm8vsHGwca6ucnJw8XEwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWViYWJjY2piZmNaWVlcWVFORT07ODo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/ur2/ub26urS/uLW3s6+7vLfAt73Cv8G7v8G8u8W+u8HEwL6+uLzBwcu+vcnEwMHKv7HCv7u4u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5h31xY2BiYmdqZmZpZWldVlVTWU9TS0U4PzY6Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W6wbi+uL+8vbe1t7CuuLa5v7vAv7fBu7vDtrrIuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVrZ1hYTktLS1JJTEhDOT44PTs2Ojs6Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v728sq2vrLGwt7y2u7zAxLm3t7e1urm6u8C9w8C6xMK+x7i5uK23tbi6tLezu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD08Nzs7Ojc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72/u8S3tri2t7+/xLzCxcXHx8rJxs/CwbiutbW8vri7sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bndjZ2FcY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz0/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6qjsLm9vrO8vrzFuLK4ub3HycrDx8jGxsnIzM7RzMrEtbrAw8i/v7W/wL/Gxr/LxsO/wbzAw8zKx8XGwbm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYGFOSE0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS8w7y6ur68xL+3vb+9x8zGx8nGxr/ExMrIzMzNy8bCw8vOwry5vrq5wMO/yMbEwcG/xcDKycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE+PkFCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbu2ucS4tLy2ur3BvLu+tr/Bv7y/usDLwsfIwL+8vMDFwsfLyMHDwMDJy8LAu7uwtLy9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem1zeHNncF1aXlxZUUVEQ01JQUQ9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u726w7u3vbe5wLu6uLi1xcHDw7u5s7S6wb2/x8C5wLy+xcS9vrmysK64t7/Dx8PEvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KmoqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbmlbX19ZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsrS0tLa4ucHAt725uLm2tb+ztLK4sbvBwMO3t62wtbi4uMK6tLu3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bnFgX2VdW1RKPD4/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7e6t7a2srTAtrK0uLO6wMHDubeysrK0sre+urO1sry6vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnJsXmJgW11OSEE/PUhDRk1EPzc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27vLi2uraxwLq3ubi5u8HBxMO7u7a0tLC2ura0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOxprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qq+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJuY1xmWFxdUk5NQT5KQkBKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7GttrqurLyyuLm3u7+9ub7AtL+7vLq4vsK8wsrHvsC4ubaytLaztK+su7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11balRdXE9NSERGTEFGTUY4NjY1OjU6PTg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6tbm7tbWztbu8wLu+wLS/ubm6sbrDvMLKxb67v7+5tLSzsbGusLm5try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Ojo6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSYnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEg/SFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6tr7Kyurq3t7W1vLSvtKu2urjAxMG7try9uLKts7CvrK63trK0tK+qpJ6cnJyeqKifoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6qoqquepaObo5yVkIyPj5CTkJaVlpifnp6amaaXk4+Slp2ioKWjpqSnoKKko6GhrKuksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUWhUUE5HT01MQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpayqqLWysbCur7Knpq+jr661wbq1t7K3trK0q7K0rqqrr7Cys62lnpKYlI+ZoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqmwo6WnnqCclZOQj5GRmJCWlZiWn5ibmZujmZeUlZqdoJ2nqKWgo6Oho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUlIR05STkpORztEQD0yPzc0OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJiXlqGorK62t7q5ure3u66ooKGpoaCtq6qmqaSpo6SupaystLy3rLKxr7Gtta+vs7Wqp62so5yZlI6RlpeZmZygo6KbnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqJ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWZlpqXl5ignpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeHpgYlJVX0hJSUtTVElSUEw4PkI2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5OcnqOorq2sq6uvqq+pn5eepZ6epaakoKKfpqCirqusrbWytqavtKupqrSxsLC4raehnJ2alJibmpGOkZWRjI+OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GtsbG0qbGvopmcnZ6hmJubmpiZm5SVmpaYnKWhoJqjoZqdmZ+kop6gn6KmnZulpqWkpKijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dXZzaIJsZVxTWllNUUpOTlVMUkxBNz5CNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT83NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKSnJihnaqip6Cep6Gln5ySnKKbn6Gjnp2gn6Ogoq+urK+xrLanrbGtpqawrq2ssKegn6Kgl5GUnKGcmZiSk5+doqSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCoq6iytbezt6yxtKOgnaWgrKGhoqCgmpiWlZ+bm5ikoaCepKGgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XW1aUmBIUVVIRlVWSkJNRz1KSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuOk56ZqJ2unqeenKGdnpqZkpmenKKioKCdop+fnp+pq6esqaq0q6utq6Wlq6iqrKqln56ZkpKUmJmWlpaMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7Whq6KpqLKpq6inqJqZnZqqpp+Zp6Cfn6eopaSenaqiop6bn6igpaetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KYnJukn6CboJyjiYWEfnZxbWl3bWhtXFhbQlZNSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERBREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJqqoLGit6OwpqCenZ2XmJaZnpucpJ+fnaSdmp2cpKKko6Kqr6ynqaOgoayurqqrpqCenqGjnp6em52clJOVlJ6emJSGnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusr6exrbHCtrjCxsDIysDKv7C5ub25wr64tLvFw7zCu7ezqbKtqrO1r7Ouqq6jnauntrGsoq+loKOvsa2wpKSvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6KhpJ6mmZuipJ6fm5ubnIeFgXt0cWtrdXJwaFdcUUVUSERJT0g+RUEzRUg5NTs9Njs8Pzw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DP0FDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqChnZyYm5+gm6Cfn5elnZWbm5+anpyfpaannaCgq7Gup6Sko6CepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwcDFyM3QyMvDsre1vrK+xbu+zM3FzMzM0se+v8DCvcfGwrfDycjCwMW+ubS5urW6t7C1sqq6sa67tr67uqq3rauquLq0vK6tuKKlop6npaKjqaaam5+Ymp2nqqegoaGkmJSjlpSZkZydn6SeqJ+en6KdmJmUmJSIhH16cmtkaW94amVaW0ZKTEREU0xEQkQ3Oj87NTQ5OTc5PT48PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo9QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWVmpaUm6SmnaGqp6KrrLy8v8PBs7K4p6Ghq6qinZ6hop6cm6CSn5+Qlp+ZkpqWnZuZo6Gvs6mhmp2dn5+al5iXkoyPlpeTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczIydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdLTzNPQ09PMysLFxsbKx86/ydDLxsTGxMG7w8C+vr61vbOtvr/Cw8bEx8SuvriyuLzEwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJREJANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJujrJ6frqalsarFxszOzb+wwqmlqK2tqqGdo5+cnZqpk5mhkI6gk42UkpeZpLGxq6SgnaCbmZeUk5SWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19HX0tTV09PIzMfNzcnSzM7TzcTHycrBxcvGyMjFvsKzs8fEy8rKzsXKv76/vMHHxMzMyMm/w7+tsLOonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi396cnV1Z2JndmlkVldRRE1GQElRQj1CPDoyM0A8RDw3OTxCPTw9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbS4rK6jn6Sjn6CkrJuWqZaNl42MjZemsK6lnZ6doaWhnpuVlJaUinx3cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0dfW1tLWzdTW19TT0dPU1NLP0cPQ09bX1dbSy8nO0cvGzdLK0tXW2dXX09bYztLJztHMz9DM0s+/x8bKw8zMy87PxcbHtr/Jv9LMy8/Fyci/w8LIzszP0M/MysfNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8d3N2b2NgZXJiXVJcSUpGQUVIST47QDg9NDU4NTo3Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSim6mmoqarmqOwsamotdDU19rSx8bLtLbCxrK2qaKlpqGiq7WnmrGhlpWMkKatq5yVmKGdm6Gin5ydm5WKd2ljYV9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M/P1dTU0dHM0c7T19bT1dDP0tPRydPRyNDY19jR19LX2dXWzM7Pyc3Ry87Pv8XCx8XOzdDQ0cjLzMDKy8XTzsvOyMTJxsbIzMrT09HVz9LM0sG5xbGlqLWup5qorKWdsqiws6ysk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx7enFzdG1hY2ltX1ZQX0pKQkZDUU0/PD40NDo9NTI3NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vrqqqrJ6mrrioq7fY1NXZ2dHO0MC8zMm3wK+nq6mjpLG2s6S2qp+doaqpoZiWmJqbnaGemp2elH5yZWNiX19hX19hYF9gYF9gZm1wcG5rb3J3d5vMwNLV09jY1tnR0tLXz9POy9PN1dTRys/M09bS0dbN0NXV0cbR1MrR1NXWztLQ2NjY18vIzcPIzszJy7/Iv8jJzc3PytDNzsvOzsfKz9DKzsrCycbJzMrM0dLM09HQz8/Kvci5sK27uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIeXZvcG5rYmVucGFXXFpJRkZETFdFO0A8MzQ8PTg2ODU1Oz5APDk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj09P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKeeuLa1ta2lra6+tLHA2dLX2tzWz83Lw9PQwsKyq62urKazsbirsbapo5+clpSXm56fn52UlpeViWxeXl5hZGJgYGFhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O1MvNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dPLzNDR08rO0dXS1dXKwMnBxczCyMnCzMLFyMnKzsrMzM/N08vFx8/Mx8fKxMbAxcnLzdDRxs/Ozc3Mz8XHwLe5vcPDvcO5srO+sbzExLWqmKWhmZaRlZWSi5SNmpGUlI+PlIKJhXhwcWtuaGBgcWhYWGhWTUdMSVBQQjtEPjs2Nzo4OTo1Nz09QDs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzY/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcXDwb+7tbKxx8O5y9XW2drb2M3Mz8nW1sXEuLK2qqSurbi7wcXJoZeOjZiWkJOSkZaWlpCMfGViYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxcnJxsa/w8bPzsfFx83K0cjLzs3G0dLPzszUysfLzs/Hx8/Sy9DPxbrEvsbJvMLGyM7EwsfAxs3Hw8vJy8/Hw8PPyMbBxsfDvsDHy8vLzsLKy8jHy8/Exce7x8PIyMLPwL28v7DByse6vaqxsqelnaKcmJCbkKSZl5mRlZiJj4J3bnRkbGBeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WzsazJzcrIxL69us3NxtDV1dna29jQytDQ0tTKxbq+vrCot6rF3dbHsZGOjpaQhoOEhIJ+hYV/dGBbXl5eYF5gY2RjX11dXl9gYF9bWlxga3Jyb29rbG9vfbjRyMnKz8vNxLrAw7u7urq+yMbCw8DDx8rJyMrHwcXMxsjLzcnEwsvJwsLL0MTLyL+5wbrFx72/xs/Kw7/DusnHyLrHxsTKwL3By8bFw73FvLy/w8TLxMS8v8nCxcfRxcDIv8rKxsjG0MPDxsOvxMvHxMq3v7y6tKmspaWYn5iso6GlmqOgm5R7dnN0ZmpbYW5tWltYUURMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8fNz87N1dDW2djZ0M3Uzs/Qy8S4xsG2tbyv2MN1fZKMk5eHe4CFhoB2eHVycF9aW11gYWJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsKxtrqysrOyscK8vLu5uMDBwcW+vbm9v7nEysXGwr3GwLi7xMm/wsm7t7q6xcK+vMHNwsa+vbXAvcO6vMa7wrmzvMXDwsK2v7W1vr+6y8O8tbrIur+9y8PBxcLGyMbIxtDGwszIssfKw87NwcXCv72yt7Czp6ioubGlrbCrrayUeXZ3amVoYGhvY1ZeWUpFSkZIS0FGQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8bCxMjO0svKysfNzs/SydHG1tXW2M7M0MjNyMrFvsrBsrW6utNwVo6OiouFeYCGhoB+hHx0dWRcXF1eYGBiY2JiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusG4rrCwp6qtrKe4tLe0s7KzurW9sbewta+yu8K8wcS8v7u1srq+wLjHuLS7tcDCvLe9xsDDu7Susra6vrPEt7u1q7i8vcC9sLq1r7a6ssW8tq67v7S2tMW8vsPFwMPFxsjLxsDGxrvIy7/PysfDxsHDt8O+vba5vsa/rLW6tbe2jnh0eGdnZWJrbl5WXmBGS0hISkZCQ0FFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzsjGyc7M0M3OycvJzMrLxtHP09HPyMvGysbEwL3PvbO5vb25WH+ShomJe3l+hoZ3eIJ9dGheXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG1oZmptbnJ8pMe/ubi1sKysp56iqqeeq6yzramrqbOttrCyqa6mrLK8urbDubq6saq1ubu0wrqwv7C9vLu1u8e5wratqqiwscC1uLyvsKexs7S7vKuttaWutq66sbCqua+tu667uLu/v725wr/Hw8XBvMbByMu4xcfFv8fDw7rExsK7xcnMy7O5wry6sohydnZraWFibGhZWFdbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD88Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bGz9LMxMbBxdDIz8LEx8HGxsXFzMTLzMLEwcjBury7yre0vL23rXeTiY+QfHl+ioV6e4SBd25eXV1dXV9gX19kY2JjY2JgX15bW1paXVpaWlpdZG5vaGZnaWtucoGtubC1rqalp6eaoKSgmpylq66jp6KrqayqsKOmn6qttbaxvbmvuK+orri0tLy4s7yut7m0sbvBscGupamirLGys6e8qquoq6yttLSmqK6hpK6psqWnqK6lqLessLK3ubq7sby9vr7Ev7XBwcfIt7/AxbfEwr+7v8TDvsTIzMq/vsPAwKmGcnRyamldYW9kV1ZYUEhaUlNLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3usSwtrCbmZWcmKqpsLGztb2vxtHQzcTIu7vMw8zAvMq5wMbAvMy6w8fFur3Evrq3vca5trm7r7KShImNgXt+gH54dH98c3dmX11cXF5fYF5fY2NhYmBgX15dXFpYWVtbWVhaXF9ma2ZlZ2Voa29yhaqlrKagnKGllJ6km5eRoaOqo6KfpaWnpKyfnZukpqyyr7a3p7Csp6q0q7S5sLa0rLa4sa+6ubG3pJ+jn6exp6uouaqkpqeop7KtoKemnpukpqyen6ekn6Cxra2ssrSytLC1vLa7wcGyur7DwbK5usKzwL2/tbi7vb68wsfEwsO+v8Ogg3dwa2FlX2tvYFVZX0hOaE9USEVKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3Nzg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBu761oJ6VnqGmurars7O7s8XQyczDx7m4ycLOwbrLub3Iu7fIu7fExrO+xby3sLnAu7Gzt7CjhYeHgn15dnRvbWtqanFpX2BdXFxdX2BfYWNiYGBgYF1cW1xcWFlYWFhWWFtdXmRjYmVnZ2dqbW+Inamgl5WaoZabopiVjZ6hoqabn5+jpaGnnpqim5+qsK2xtaKpqqmrrKS1uK23r6yytK6ytK6wqp+dnqOisqSlqbitoaamn6isq5mfoJ6ZnZ+lmpmjnJudr6mrp6qrrK2wsrivuLm7sLa7u7qrsrK5sr20trGxtbS/tb3AvcPBurq9l4N6cmtfZV5kZFhUWF5JV11LUEdJSkZBPD8/QDs/PDA0NTM2Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZukpsCyr7astLfG0MnJwce8vMXF0MC8yru7wbu2xbi1wcGzwsS8raq1ureosbOpi4aIgHlzbnBua2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taW1lYV1dXV1hYWFteYmRkZWZmaGlrco2onZSUlJuYm6GWlpCcoaGonZucpaahpJufoJqYra6trrKgpaKtq6ehtbCxsaynrrKnubOmtaGinpqjoq2ioam1qqKjpp2lpqOWmJ6XmJqdn5mXnZycm6yhq6ajpKatq7OzqrSwsqqyubSvqa+ysrK3s62prK6xt7C6trm9v7aysZSFeXVlXmVeW1lWU1pVS1tRTElFSEtJQj0/QUFAQDoyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr69v7OdpaOYpbHCtba9rbS4w83JyMHGuMLByNC6w8bAtry9tsO6tr/Btbu/u6qmsbuxqLKvm32FhYB5cHF0cWhmZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFhWV2FkZWNkZWRkaGp2opyUlI+Ulpefl5mUmJ+eoZyWoaGoo5+dqJyamqqmr7Crm6Ojt6qgn66otqmmpqywo7ewo7agopuYmKqmoZusuK+ioaScoZ+gk5WhlJaWm5iXlpeclJ+pnamjoZ2jqqqwrqi0q6qmrbKwpaqusrGvsK6up6ensq6xtK+8tLm2rqOUgXl1ZF5hVllXU1JUS01eTFBLR0dMS0U8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunqeno6q7wL3Aua60uMLNyMfExb7HusrNtcTFxbG/wLnAwbrAwLm6vbeoqLG7pqmipYmBfnhyamxydHBpaGVkZ2JcXFpZWlxcXF1eXVxbXF5cW1xZW1xaWFZXV1ZXWFdXV1VbY2NiYmNiY2RmaoGWk5WLkZSTm5mclpaboJyflaCfpqWkpaaenJ+kn6qvpp+io7aooKGiqLOhpaekr6WwrKu0nqCdlZSpoaGUrLGwnqKinZ6Ym5OLoZSRk5eYkpeXmJadppumoaKZo6Wlq6SlsKelo6urraWorq+uq6iqqrOlpquvtLGuvLWxr6+gknp2cmRhXFpdWE5MUUdSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7K3rJ6kp623u7zBxbqxubXFysvBxMfHybjIxrXFwsmvurzCvMPAwb28t7q2pqeytp6iipmHgHdvZGJnaWhmaGpnam1gXVxbWlpZWlxdXFtcXl9cWllbWVlaW1dVWFdUVFdVU1RSVWBgX2BhX2BhY2RpgZSTiZGOlJKTnJSVlqOZoJacoKWhraWjo6KjoZuqqqWZnqWxqaCgnaSqnaehnqysqaitrKKhoZSXo5uckKupsJufop6el5iTip6SjZKTlY+YmJKboaKcpKChlaChpKabo6uloqSqo6uupK6xqaalpqa0pqmorbO1tLm6r6qsnotycG9gW1dWVVFGUU9IWlxPUklUS1NMRUdJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw3Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2Ojg1OTg5ODo7OUA5e7W0rbS7srCssq2dp6evubmzwMi6tcCvxsnOu8LLzcm3y7+0wMfMsLa9yLvCx8S9v7e6taWrsK6dmoeOg3x1aWpqbWhqbG5ra21lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXl5fX19iZG2Oj4SRho+Rj5mTlJKcmqKcm6CnqKqnqqWopKOYpK6klJmlr6mfm5iaoJ6umZuqs5+lpp6io6CUk5uWlZKoqa2anKChoJqUkIyZjouQjJKMlpSQnaGgo5ybopWboKKgl6Koo6Koq6Crr6Stt6Wjo6Ksramoq6+zuLK9tbOrr5iDcnJoW1hZU1VSRVlMUFxZTVRPUExQUklOSUI8Pz9BPz02NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zrqiztq6pqK+tm6morLe2rLzKu7a/rMzHxrnCz9DJtca+ur7Gy7WxvcW9w8bEvcGzua+mq6+rnpeGgXd4b25pbm5ucWdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVUU05QUVlaWlpdXFxeX2Bkfo2Bi3+LkIqSjZeRl5mioJufqqmmraqmr6KnmZ+soJWWpKinnZePjpmdrpaXp6qZn52TpaCdkZCSkpKVp6qkmZmanZ2WjYyLlIaIjYOQi5KUkKCeoKOXlZ+VmqCinZObpaWnqKigsbCmsLynoKOstKutp7C0sLm1wLGtsauQfXByYlZUVU5SSUdWUVNSTExYTUpMTlJHTUtBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s62msbeqpqKwq52qp6mysaS2xrS5urPLxrq8w8vRzLO5ur7AxMe2tLe9s7u8xL7CsbSusa6xrJyiiGtobm9yb3FrcGtkZmdlXlpZWllaWlpbWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen91iY6HkImYiZSUl5uZnaibn6qkpKqcp5igpZuSj56impeWhIORmqOPk6KclZWWh6GampOLjoqPmaOnnJWVl5uQkoeUjoyBi42AkIqSkpGhmp+hlZOYmJWipZiMmaSmqKahoLSyp7K3oZ2it6yqraSysqa1vLWsq7GjiHhybV1OUFFMT0NOTk5QS0ZOTktKTk1RSU1KQUdLSEhDPjg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyNzc2Ojk5OTk4NDk4OEE3d7anpLawpKekqaWgqaWks6qissO1tbKzx8e4u8TKzce1r7y/uLzEs7OutqKttcS6u6+qrLSvr6CXqH1eYGdzcXZxam5pZmhoal9YWVhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTk1LTFNXV1ZYWFlYW11hb3N2cYWIgoeAkYOOipSRk52gjpqboqCjmKSWoZuVjYeYmoxzjYJ9jZaWhZCZkJONjnqYjpyMgop/iZifop6Qk5iWhI6Ck35+dImOepCGkpCQnZqZmpCVj52OoqOOiZqgoaSjm6K0r6yvrJ+YpbmmpbChsK6csLuqqa+qmYF2cmJWTFFPUE1DU05MUU1DUFBISU5TTUhKSkRKTEVKSz03NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI0ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3e3oqO0qKWlqKOmpaamprOnpbTAuLC0sMrGubrCz8e/ta+9w6+xx7Ktp6yVpK6/uLGwn6etrauWlaJyV1ZfaGdpaGluY2poZ2JcWFhYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkhOU1NTVFVVV1lbXWlscm1/hXx0Tlhyj4KXho2cl4qTkJ6XnJWUlpSOlol/k4lfO1dve4uTiX+LkYyPhYZyioSWgXmCeoWTnZSDlY6Qj4KGfZJ4cW+FjX6JgJCNj5eZmJOKj4iciJ6Xh4eWnpqhoJenr6itqaifl620oqatmKyrmKe0oqmto5J9cW1fWk5TUVZMRFRKUE1MRk9PSkZMUU1LUEpJTVBGSUg9NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl4t6CjrqGmpqqgp6mnoqmwqKe0wbmxtbDJw7m0v8/AurGxuMSrrsmup6Oehpuiuq2nqJampaShl4+WaVFNUlZaWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbW9pe4J0UEJAf5WRkX2JlIyEio2ajJaVipKIhpWGeYh/YEpRbniKkYR8hIyJhH9/bn5/lHd1dniEjZlwUY2IioZ7fniUdmd3hYh+ioiVio2QkpaLg4mHlISajIGEkpuWnpyUpKOnqaWjnpuwq6GkpJCmqpahqpyipqiIdGtlXVtIUVFTTElVTVNJTExQSUhGS09MTVRLUVFPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTc7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjExNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85draco6edn6Guoaeopaeor6yqtry2uLazwry3qLrJubepqre4rbbAqqKbk4OPmbKfopqNoJaZlJCKjGRNTE5OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4aBe4WMkoGSmYuPe4aPf3V/eHNudXB0jY2BeX2JqoV5emh2e45wcm14gIqMknh6gHuAdnNykndndYSEhIR6lYmIioyLgH+Eiox/lIN7gI+YlJuVkZ+dqJ6foJ6gqaWfnZiMp6SToKCWnZ6kf3FnYFxcSlZPUUdLWFJPSkxNUkpKSk1QSExRTFJUTUVIQTw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc5NTY3NTI1MjU3Mi8yLiwuLzIwMC8tKygoKS4xMjYyMTk4Nzk4Nzc2Ojw8N3aumKOhmJyes6mvqaWsrLCxqr20sry4trq1sqC3u7OrnZ+tq6y1s6WelpKYhpSklp2Mg5eJj4mFhYJkS0lKSUdGSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFhYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FSU1ZedYN9eWd3jZeYjo99Z3mBdnh/iY98hJiSgXKHj3x2e29rfq18c5CKf3uGkoB9f3RmdnyFbG9oc3yJjIeAbHlxfXBtdY9xaHGAfY5wQ4qEgoOFfnd3eouFfYt6dX6Oko+YipKam6OXmZ2bnZ6inZaNiqSbj52XjpaYjnVta2VhWVdYVFFKUlVUT1BOUVZLTktOT0pRT0lPT0tGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppefnpagpq+srqunqbCvsay8uKy7vrmzraibsaitnJCXnqesp6SbnZOIln6OlZKVgHyKeoWAfn5/YkpHSEZCQENESUxMTVFSUFFTVVRUVVZXV1dYV1lZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWJ7eG98eYiPeXyLhW9tjJF4c3hqan+CcpaRi4F9ln9JkphuaHd+gWxpY2x5hZCShmtzbHxucnuGaG1wfnONiIOFen1+e3ZvdHSFgnmBd3B8joyKk4OWl5iakJOWl5mXnpeMg4mfkYqSjIaQln1saG1ubVdVV1RRUVlPU1VUVFhVTU5ITUpNTktDSU5HRUA6ODk7OTk6Pjw5PDs6Oj0+Ojg6Ozk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5manqStr6Ktqqi1r66stL+rvMK/pqOalaWYno6FjJaipJualJePdpF+hYuQj3x4fnR9eHR3eWRPRUdEQDw+PkFGR0dLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganJBmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplfnBtf3qLiHWBiIZ0bJmRdHN7amudjkx5hJKJhI5nMXaGc2x+fYN0ZmV0foSEhYBmaWx1a3B/fGdwcHtuko2Oe3N9fHFwbnVtgn53eXRpeYmCiImDlpOSkIuNkZSVj5eOgHmIl4iGiYZ/kId1aWluZ2NXUVlXWFlbTVBVVlpZTklJRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYtKzU3NzU0NzhpTzg7NW6SiJmRmpakqK2esp6muq6rsrDCsrvDx5uXj5SZi46GeoWRmpaPko6SiXSKhHeLj4x/dnd1eHZveHJoVUZJRD88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7OgcXx4bX1tcYOBhYF5hIaGeXKglHR4gHN1lIc1cZ2onY6hoYSihHZwhnyHfHOMrY2IgGhmYmlucm1wg3Vpb1h1b46akXZsf3p8bXFtcH96c3VtYnaEf4aAhZCRiouJkYuRjIuPg3V4i4+AfoKAfY94cG5ual5aW11bWVhgX1NOW1pZWExISkZKRz9DQUJHP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnnq+VpbSorbGuwbO6wcaXkIyUkIGJfW6CkZOKhIuIkIh2hIVvmIqMf3l7e3F7dHxrb19KUEc+QDc0NTg7Ozw9PkBCRUlMTExNTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHaIiHx9hYN/jH52opl5foaAhJmFm5xhhqqfnYuCkI16dol+iYiOc4qXj4N7XGRxdHp7d4psZ2lheG+Fj4J6boF3c4R6cHN5d2tuaV13h32HfIiHj4CLk5eDjYaNhn1xhH+EfHV3e32IdG1xcmRlXlpaXVNbZl5YUVVZXFZHS0tFTEc/RkBEQz9BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XIx3iX+UjJGdnZ+mkaCqn7Cpr8Cxu8a6lo+RlIh6hnZrgIySg36LhZCNeYSCdaKGjX5+goBzg4F9a3psU1hMQUUzMTEyNjY2ODg6PD9CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSJe4l5e3F8j4x7fImGfpeHdqGZiIePkpSljaypSIatr6+KgICTioKLgoSRqIeAmJiKnHNsfIGGh32OaGdneH5uhYaBhXGEhkdrgHdxeXZobWtfd32DiH+IhYx6lZ6ciouJkX97dYt2fHdtb3d+fXFxcGpaW1taY2JXZ2VcVVBRWFpRRExMR09JQ0ZDQ0FAQ0E9OTg4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY3NTY3Njg7REZMTU1MQzcrIiYnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWHkY+WmJKXoJ2soaa4r7O9tJeNkouYi310cH+Kk39+jYOUlX2Gf4elh4mAg4iGeYmLgHWFeV9jVkxDNjAuLzIyMTIzNjY4Oj0/P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgISChZGTfoWJkYGaloKgoZiVm5qlrZOZu7Gnu8fDp4qMoaWOk4mBkHtyg56fkZx+doWFi4+HkGlob4OAdIyGhItxhoJ3h397doV9bnZ1Z4GUj4aJiIiJiKKro5aJjpiAe4KJenpvZ2t4fXd8cWljXFlZXGhcYWZfWk9MTlhTUUlQS0ROR0NKRENBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudnBneIN7gIyAgZCPi5qapJyhrKarr7CXkpGEoZSEeHeAjZR9f5KGk5Z+ioGSm46EgYKMi4KKjoSAioBtcGpeQ0E0LS0vLy8vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTU1RSUE9IREI8ODcvOUM+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKGSo6mlo6yTqLaip8HCrsiveLqUmnyMoZ6YhJOFgo+hnpOZkoSKhY+YkJZscHWJi4GVjI2Pdo+EcWyFgYqWkoOFiHKJoZeHk4mPj5eltqmbjZWig4eThH5/a2psfX59f3FfW2JeWWZqXGxrX1hLSFBTUU5NTEZJUURETkZCQ0VHQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCDcHWHcXaRhn6XlpqUn5+bp6CqlpOYnmhmpJp+hZOSeoGSiZKSfYuFmZKRg4GBi46JhpGHhIiFeHh/aE5SPi8vLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6emopmhl6KVnJ+onqmrn6isqaq1l6u/q7bIybfI0c++m6Bwaaupn4STkoWcoJqamaeRkYiVoZmad3p+lJeRoZKWl4GUnnt2lZKrs4mNl6B9lZ6cjpOWmqSjp7awnZGZqIiXkI6BiGxzc3t8eW5mXltfXmFnY19nZ1xSRUtLUU9JSk1GRk1DSExGRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1NDY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjNBQGliXlBxdWBufWF3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYiYjXmCjYuOjXyKho+QjoGDgImMiYWThYKGiYGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1GSEBBQDg2NjI8OTtGSEdJSU1PUVlthpB3lYujp6q1vbilrqysqKm1rLG3srKtu7GzvpyzxKy7ycu4w7+3paOwsqytqqOLlpiFpaagopiCppmNoqqnpIeFk6OgoKqgpKmOnLGLlaOnt7ucoaOwk6Odo56RpKKrsK2ztaKVpqqJmoqTipV6e36De2VeZlpjYF1iYl5mZ19bT0RJSFRPRkhMRktHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjU0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gZSFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyPi4p7iIOHkY6DhYGMhoWIkoaChImGh4eHcW5hQEU2NDwzLzExMC0sKy0xLy00P0RBTlZRUlNVVVdVTVxRR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcfEq7PFtq20wLO4vra/tMG2u7ukuMaptsnHtr65tKijtK2wsZuZkpqfiaevqqSVd5+kl6GrsbOYlqmtqK61u7K6rK+1orGssrW8uLSutaCoqKOom6mwrbO6uLionLipjaWPkpOgh3mBgHJXX2JVZGBgYV5fZmBbVUpERUxWUUlKSkVKSEVBQEBLREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFxaUWNkV3p1cYGVfYSGk3aGfoCNe7+7o7yCtJSTjpuPhIiPk4qJeoeBjJONh4WBjoCBio+GgIaIhYqHkXp5bl1XQEVOPDY6NDZBQjc2NC8vNkNIQ1FcT1FVWFVcV09fVUlLSkFAP0dLRkZEOz5AN0Q3P0JKSkVHV1RQXo+kraSytMO2uMHMyra7xL2ztMG3uMK1v7C4dLG0prrFpLDGubGzsrSopLa2qrGgopabopKlsa2lraynpJigrLO6oqiyubW7vsy/xcW9vbPCt7q3v7i6uLqtrbGmsaquvrC9vMPDrJm7qJWuj5iZq4l+gHloVWFfVmhjaGRWW2NZVlRKR0dMUkdESUpBSUQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1RZVlp3anB/j4SBjoVve3J4iGK5oZmjiZWUlpOUlI6Ql5KHh3uHgY6WioGEgYp6fIuIhnyKgoGLhJV9eHp1Zk9cZEdFTDpRZGBbXlNGPztIUERaY1FRWVlaZ1pTYGFNU09FQT9JSkhFRkFAQz1FNkI/SEdLTVNaVF6Ur7i1u7nJwLu9ys28vMG8uLa8u7e+tbqzxmF1sqWxmp6rvqqlqKuqpKKytaCrp56Vlp6Yn66lp6eln6SToqews6iysry2wb3TycnTxsLFzMLKxMC+vr+8vLi0sLm3t8O6xr7EybCeuquirI+lqbeJgHxuXF5eXFVfXWdmU1lhVlJWSUVGTktBPkhEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUVFJQT1FSUUpBOS8sLCwqKygoLC0sL1A+KC40OIB9PDJLiHE5PkNLRUBKTVBSTFFdaG1scY+NhpBzbHJydIjVwLWaoI2VmZmRjpeSlpaOhoh9h4ONlop+gn+DeXuLhId7i3mBioKXf3R9emxlcHZZXVxQZWViYGVkXVtYWFxNZG1VUm1uX29fWGdlVVlUS0RCS0tIRkhISEhCSTlEQEhLVFRWXVpck7nAub64xsG7ucrLu7a6tri5tLi1ta62t5lkdamerXBeoq2cmKGim6Seq6WUn5+QlI6WmJeonqafn5qZg6OdrKSqsa23sLy41NDO1s/JzNLMz87Kx8C/wsq9wb3CwMXExsrAyc+0pLyxtbCcrLm9mn12aVtcWVdbX1hhYlFcYVRSTENCRkdFPEBGPkJJQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjsuJioqKC0uMCxATSsvNTRtiUkwSIl0Pz5CREBDREdLT0RSXFppYG+XkpGUbmxvdHWHs6yhoZ+LmZyZjY2VkZuShYqKf4iHjJCLiXyBhHN7ioOFe4p0gYqHlX90e3lsbXV8aXNlaWxoZmppaGBmaWltWm10l62kvYiHZ1tvaF1aWVRIS09QSktQS1RRSExBSkZLUF9fYmdqYpe3x7C6tLu+trHFx7awubGxu62zsairuK2NtqienKeaTpqejI+glpGnmKWVipOTiJGJj5GSnZuhmJuVloeemaaarLCor6ezs9PU1NbRy8/T1M7Tz8zGw8rQv8rJy8nSyM3Ow9DSuLDEvcS6pre7xKJ/a2FaWltWXlZZY1lQXVhPUkNCSUVDSTtBRD5CSD9AQjg7RD5AST01NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ4PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZldzkJGZg2hyb3l5g6GqnqaXjJubmIuOlZGajn2Ji4WOioqLkIh8hIJwf4eBhnuHcoOSi49+cXl1bHB4f3J7bnhzbGmAcG1jaW5weWl3fX7Lv8Pfp25jeG5kW2FgS1BSVU5ZXlBeXU5RTlRRVVRcbm53g3KWrristaiwtqutvcGyq7WmpbmnrK+hrLSkj7Gum5iYjJGUkYSPm4GNp5GciYOLhIqJhIuDlJWXl5SbkJyYmZmenquspKeirKzO0tXRzczS09PQ1NHOyMPU0cjO0tPT183S0cXS1sbBz8jIw6m/uNCcdmtiWl9bVF5RXFlPUFRQTkk+QUdCQ0Y9QUI/RkU+QD86PT08PEpCNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYeGi3dsd3B9foCgnp6hjI2Zk5SLjJOPloV5hZCQjouKiJGHf4J7cn6Agod6hXaFk5GJgG93c2xzfXx3fHOCeHFrgHJyaXByenlye77Lmn+NsoR2coV3aWFpXURaWltXZmRYZWtUWF1dYGNeY3h7f4uBmaqkpKKgoammqrG5q6a0o6KuoqSuoqexn4mmm5WTkYqSj4iClIlrlaKNmYSBhn6Rg4OTl6yLlY6Vmo6FkpCdl6ewoqChpaSoyM3Px8LL0NPR1NLO083G1tPN1NjW1tjV19XK1NrNytjW0cutxMPLiG9sX1xcVlJXUlpPSkdJSkpAOzo7RUJEPUNEPkhDP0NCOzw5PDpHQzQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX5pc3lygoqAnZWelIWLlomPiomOiI+AeISUmYuNiIiLiX6DeHN8fYSHd4B7h5GXgYRveHFtdX92eH10hnx5bId2dG59doV1eXudtYw8QYvGpX6NfWplV0lDZWNmY2hqZG95W19maGtuaW6BhImRjJ6foJ6Rl5mgo6SmsqSlsqCipZ+iqaGisZyHn5KSk5GLj4uHhI+EfpycjI2ChIV6lH+CqpajjJKLmJOLfZeKmpGqs5ibnKecpr3Dxbm2xc3R0NLQy9LLydTO0dXa19fY1NnYzdjbzsna2tLWv8zNtHVza2FaV1BTUFhVRUdKSUZFPTo3OkBCQzpIRUBFREJEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8yKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9DPjw5UUVDSlRsbm9wYnFxdIaNfZeRnot+h5KCiYaFioKIfXiFl5eJj4OHhod6hHlxe3uFhnV6ho6OnXqNcH1wcHqAcnuBcoSHgG6OenV3fX2CdX98h4mwdFmqwreNkoFwbmM9XmhycHFwbnd3gmVpb3J2eHJ7jIePk5KblqCWiIyTnJ+bn6ugoaycopqaoKafn6yZjJqNkZOOhX2Ih4OFi46gmZOIg4d+bJl5hJmHiJOMjpWMhnubiJOOraqUlZefmKautbyorb3Hy8jJy8vPycTSytTX2NfY19Tb19PZ29bP29rS1snVzJN1d2VkWFdOUVJbR0NGSUg+Qj49ODo+QDw+SD1AQkFBRUE+Pzo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8Qjw6OUQ/Q0dSa19tZGJmbHaAiHGRkJuAeYCOfoKBgoV/hHx9hJiOh4x/hoeBd4N5bnt7h4J0epKejqF2j3aDdHWBfnSAhG+BkIJvkoV1fIGFenaHfIm4xqXDyriClpyPeHBmTmVjgnqCd4WhkIt5end7hIB8hHVtlJaVlpCYkYOJj5eal5emnZigl5+TkpejnpqrlpGRi42Tg4yFiYmBho+RnpyZiIWLgYWXeoiJn5eQiY6Ki4J8oYmQi7ygmJOXmpyopqWtnqe1v7+/uMbJzc7FzcrR1tXU2dXX29TX2drb19va2djO28aDdnZkZmFdUlVUVE1LRE1DOz08PDk6PD85PUE3Pj9APT8+PTk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NjdISD1ESkU3OTI1O0g+Ozk6N0hQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZmFdXGl0enlsiY2Sd3Z6i3x+gH+AfoV7foKRioWGe4WIfHV+dW18fYd+dH+SnZGfg5J8h354j355i4pvg5uBdJmGfYKKhXx+kXuQqY+Qw6C9jJuknH6KhX2Jc4yLf3OmmpyYlIV7j5GJhGlHcaGknoyMkZKFiIuQkpWPnZuTlJGXjYyVn52UoZWTjo6QjH+Qj46LhImSlpmfn4iMlJGdkIKMf6aZiIWOg4aEgKWGiou4l52RlJahpqCdnZ2jrra5tKvAxsrQyMfNz9PS0tjS1dfA19jZ29ja2tnZ19u2dnV0Z2ZiVF1ZUk5OSENMQz09Pjk5Ozo5OTw9NkA+Pz09OTo6OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV088TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT88RFJTUlhfVlhmbW1taYGOinFzeYp7e4B8f3yIe318i4eDfnWEhnpzenNtgX6FfneGm6GbnpSSgIyIf5iHgJySboiphXugjHyRjoOJhJx+m5GKjaOin5Gkr6CLkYuFi4GThldyrYufq5uQg5mckI+OW4OikYKNn5OUjIaIjJKSjJSVlZCMj4qIlpudj5WWkoyTlIaAjImSjoqKnZeYo6KGk52VoIuKiY6dkIOIj4CDh4WlhYuQspickpSXoaCemZKbnaeyuKylvcLHzcjGz8zQzM7Xz9HUrtbV2NrY2trX1tnanWx5cWNjWlpVUVVWQ0BJQz8/Pjo0ODo7Nzo7OjM8PD89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J4bGJ+kYNvbniLeHp/e4F9h3x8d4aFgHNwhYJ7dXd2dIWDhX1/kqain6ail4qdkJSXi4qol3KKso2EqJKEmZSFmoyjlqCYk4mbnqKTqbCgkZWRjo6IloxvjbeEmsTIspyippycmJaRsZBkpM3HlY6Gh4mQko2Nk5WKhYqKhpaZm4+QlJOHlZiEgI+LmYiOkKuXl6SjiJmelpqIj4eXmIqFj42Bf4ePpYiNk6iZl5OWmKGYn5mTnJqisrSlo7zBvsfGxcnIycLK08zN1KjS0dbW1tja1NPazn9ve2RgW1tbTUhTWUJBR0Q7Qj44Mzc7PDo5PjY0Ojo8OjcyPzo5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgkd2gY59fG1+iHh6fnuCgoN/d3aBg3xtb4t/e314eHyEh4p+i6Kzp6Ors6KXp5+lpJaVrqKDkbiVkrOajKGhjKWbsKOknZiRp5aomayvpJiVlpWQi5ial6HAjqPJuKuco6atmJKbnbKdhYaoopyYhYmJjpWMi5OPiIGGh4mTmJWMi5STh5SYhoSRkJx1kZmylZakoYecmZKQi5CKl5uJi5aOhn2MmJ6JkJCcmpqTmJefk6CdlJ6boLGuoqO3vrTFx8S9w8PAxs3KydOmzszT0tHW2NPQ2LpvdnJZXlNdVE5HSU1EQUNENT46Nzc6Pzw8Nz00MjY2OTc3ND41OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER01aXFlKZmA7SISLenpuhYZ6fIR4gYaBfnB4fH59b3ONen6CfHiGi4mGhJKmu6yosb2wpa2zs6ijorCsipq1naO4pZWtpZeprbinpKOfmqmYqqSusKqamZ2UlpGXoJiau7uuyqFqtrirsJSZn6Osk5e+o16qsoOKio2Uh5B8jo59g4aOj5SViIiTloyQlY2LjZaYk52ZtJaVq52KnJSRjpGSjJibipKekIuJlp+hjZSNmJmdkpuYnpShoJScnaWvqKGks7iswsjEtrq9vMXHx8LRoMbJzc3F19bRy9OfbXdlWVdQW09ORUM+PEJBQjhAODg1P0c9PDU8MzUzNDU0NTRCNDk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEhiYGJwSkCLin6Ac4aHfYKIdYOKgn9ufXx9f3B3h3eOgod8jY+MhoyZqcLAr73Gu7O0wL20rauztoyosq6tvqubu6Wnrbm4q6amoqKko6mvsrGqnZylmZuYl5+ipqWSpLqvqcC8ra6yuaWkqH6IhpytvbCCi4yLkIOOg5GPeoGIkI2NnImIj5eNi5WWlJGal52omrGakaycjpqPko6VkJCWl4+RoJGJlJukrJSWj5OcnZOgnZuYn6GUmp6npqSio7CypsHGw6+wurfFxMO/zabHxMfEvdbQzcTKhXBvXllXXFhMSkFLQUZHP0FAQzs6ND5BPT01PTY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU43OUdEP0NGXGVGYGlnWl1ck4yMiXuHjIeDjHWHkYqBb357gn9xfoF7lXqSlJSYkJOWp7PGyb/BzMLDuce9u6+rubuYs7e6ssGupcCkq6+8vaquq6OjnqerrrWwqpygq5yhnJafr7Wni6O6urbBvKypnbOlpKiUhY6pxMOkgouPh4iEhpWUjXmDjZGPkaGMjJSSjomXn5iTmZWXpqCvnIyrnI2Wj5GRlZWOkZWSj6CUhpefoLKelJmTn6CYpJ6an5uglJiepaSmpqSvraXAxMOuqLe2ycO+ts+yxL/EvLPRysjCtHF1aVlVWWdRTEhCTEtMSkFBPkREPDVBRTs7Mz04QjMzMjI2MkEwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmVaTWVcZlRia5mNloqMiJOQhol5h5SQgXKAe41/eIeCgpB6jaGWqJmambq9x8jJwdLJy8LMvcKzrby+qLrAvrvEt6zBqayzvL6qsKqkpaSsrrOttrWhn6+fpaKYo7O9qpuovcGktrivrJSyrKysl4eaqaalkYKMk6WWioF1ipJ5hY6SkJ6gk4+TjI+NlKOZlpyVlKOeqp6RpZqMj4+PlZaIfI+Vk5KjmpWfopy1pZCelqSjoaWdnaaYnZWXmqSjqaeisqyou8DDr6Wzt8y/ua/Es7u+wbiswsPCwJdqdl5VVFlYSkpMSUZEREhDQ0FETDo0REk6OzQ8OEUuMTIyNDJCMjZTSE88SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5pSF9YYlpjY1aej5yOl46ekomKf4qgk4R4hX+Wf36QiIqRgJahma6npJjCvcfDx8XTzs7Ny7zCt7C6vLS9y7zDwra3vK2zv7q9rq+ooKmotq2uqbK3mp6to6ehnau3uKqlsL/Esr25tKirtrSurpeWpayon5GNkrLFp5aOfJKVfIeSmY+qmZiTk4+SlZOknZOdmZOho6KcmJ+Yi4yPjp2IWpCXl5KXpJllmKKfs6WVoZWrq6mmm56mlpiWmJSgpKiln7arqbm7w7SltLXLwLiqtquyu7iuqLi6vbiAaGtXVFJTTUVJUk1LP0FIRUVJSEg5NUVNOz44PUBKLjMyMDI1QzU1T1ZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz5AQkZCcEVqSVJlYUxGpZScl6KXqZaMkYOIppOIgoeCnISDlZCQlI+aop6vvq+hxrzExMbGzs/O0sq/u7axuru7vs+2xL24ubezsbWzuLOrp5yrrLmqqaevsJijr6Wno6W1wLCsrLS/w7rAurSnura5tK+Wpa2vrqSLk5ShjXTCmn2XmYSOl5mMsZWbmpWSkpmZpaOVoJuXmqmdm6CgmYqNj5WcYEqWnJqUmqWWVJavn6+cn6SUrq2qpJqgpZOTmJiNnKCnopq0qKqzu7u7qrGyx8C5pqyrrbKyo6GysrSkbWpiWVdNT0pET09QUjtHS0lHSUNDPjpLVT9BOj1FTTA3NTQ0OkI0NE1XTztKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqWmaCiqK+ZkZeHi6iWjoiThaCHhJ2Xj52hmqOktcm1qcW5wsPIysnIzc3Gv7uzrrm5wcHMtce6wbm1urCvr7O1p6SbqrS0qqmmrayapK6lpKisu7+orLa3v8G/vrmzssSyub6to6+1rLmmiJuXppt2v5+EmZ2Ok5qajK6XoZycl5SboKGonqifmZqqmqGnnpiQjZGdg252kqKalZ2inZGusqOqlKiql6mto6KepKeRkZmch5Sdop6Wsaapq7m2vbKyrr65tqCjp6ilppybrampi2BiXl1OSktGR01KVkw9TUVOS0xCQ0Q8UVY9QUFCRE8xOD03Nj9CNzVVWE8/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLVJgTVVIfmVeSEWrlZuin7uvmZSgjJOrm5GSk4mrjYahnoyjrZSjo7bGvrTAucLCx8nFws3Iwr65sq+5tMDCyrXGssK8tbqqqK2tsKOjmKq0u6appquqnamvp6Oqq727qK29tbi+x7y3trjCsr7Btaq1t6u+pY+jmJKioLyfiZqgmZefno+3n6mcpaKbnKGaqKSzoJudppyoqp6YlY+Um4uWiYykoZSdop2gtK+lpJKvq5mqqpyco6KokJSUn4KPnp6blamkoaGztLq0rai1srOenKOlmpeVmKqhnnVdWl1bSEdFRkxRSU1FR0dCU0xKQkVHQVZTQ0g9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKRUBKSk5POUNANT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgWRUNDktMTlmXEZDQ51wYkdFp5ejn57DrZyXpZiaqpyWmpqPqpaVp6aVrayYoqu2w8O8vrbBwsDHxL/Nxru9ubKwubO/wse1v7C8t7m2pqSrq62goZmqqsSipKmspp6sr6uiqam+uKetv7K4t8e2tbm4wLPAwri1s7SvvqOXo5eUnJSun5Cio6Wjo6CQvaWpnamrnZ2hm6WevaGZo5+iqayhnZeNlZ6TnoePhI2Tn6SgnrWsppyVsKaZr6WcmaicnoyYlJ6DjqCZm5KlpJqXq7G1saqlqq6sm5igoJKPkJWonpRlX1dfW01IR0pOTEhFRElBPlFJQTxHSUlcUk9LPUhPVTRCRjk+SEc1Q2FbS0JOUlVXVlFYVFJVSUA4UlFQTTpHQTRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5bVJGPEt4ZWFWS6Kao5yexayhnqyfnq6gkqOflqSgpqmsmLaxoqqztsXEvb+1wMK7yMK+yse1uLW0sbO0t8HFtr6xuLW5tJ+nrKqsnZ6epaTBpZ+qraCkqa2voaaovbWmsb25t7bEsrS4ur+0xMG5ua+ztbWjnaWVkpShrqCZop6pqKyjmsKsqZ6srpubnpmmoL2hnaSYq6yspqKajZqfkp6Jjld/lp+loaC4qqeTmLSinrGfnpmulZ2NmJOcgY6fl5WNoaOVkKWtsqqpoqKlpZWVnZiLj5GSpJ6JX2JYYl9LR0pKTkZFQUdLPz1KQjk5SktOXlFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JHRTY9dWVcS02enqGZn8SopaG0op2zp5OrpaCjn6yprJ27sKistrHHxcHCssPDvcbEvMTJvK+wtq2wtK++xLS5sbC6tKyZqLGpqpqdpaGnwq2brLGbqqOusKmlqby2p7e7vq+3xK2zs8PAtMe0u7istLatqqKmlpWVpKyin6Cbp6qwr6+7saagqamamZiToqO4oKGjkq+wrKWnn5KhnpWej5CNlZ6bop6ntKemjJeym6KtmZyarI+dkpWSmX+RoJWOjZ+gk4umq6+kpqKcoJ6RkZqThYuRjZudf19jWWZkSUhMSlNCQ0BJSDs7Rj85OU9OVl5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDI1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0nqOfnKDDqaSqs6KktaqWs6ynoaSyrK6pu7KtsbW0xsDEwrTAxL7JxLW/yMG0q7Wor7isv8Ozt66ttrilmKqyq6uYn6aXrbu0m6iwmqygrbSyqKu5sqi6tLmzuMCqt7LEvbXHqL+vrra1qaesoZiXkqaloqKYmKWuuK6ytbagn6mkmpWWlKSgt6KlpZavsrKnqqainpqam5WXqJ+gmKGer7KipoyXrZikq5aYnaKPmoySlpiFlZ6Ti5CbnZOKqKmqoaehmJ6Vi46Zj4GFlIiTnndiZ1tqaUxPTk5UPkNBTkM6Okk/NzdST11fUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMS0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlvaFVDV0aMeWZDO6OjnaGmv6enr7GiqbarnrqxrKOrtLaxsLm3sLe4uMS9w8e9vcTCxsC4wMbAuam2pKy7rcDBt7eqrbK6opStsa2ylqSnkaq5qp+msJyroK+0s6uptratvK20s7m3rLixw7u/v6bEq7G3r6irq6eemJmroaKhkZihsa+zrLC5mpupoJqXk5inoLappqOisbG0rLOorJ+coKCbnqWcopedo7Ovm5+Qk6SZn6iZk6Gdk5aIk5aSlZackoiQmpiUjqmopp+jnJebkoWOmYt9i5WEjZlpZ2tgbG1XUFFbVUFCRVRAOztJQTc6WFBkXlBXV0VZX15NTFJOXktKPlljXk5IUE9cVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS0tLiwxPSonKz1ccD0+MS4wZFpkQDE2NDdnWWBGKD84bH1nW1Y7iXtjQz2nn52iqb2iqrCspLK5qqa2tKygrbW9r7O4u7q+t7bAwr/JxLnEwsC/t8O9wLeutaert7G7vb60qa6xtp6Wq66nrpemqI6nu5+lrLOeq6KxsLOsqba0tb6usbK1rLC0s8G7xresvbCxuKysqqOypp6lqqCkl5Gan7Oqs6urs5qdp5yalY6hpqS0rqihra6usai0rbKqpJyfqKSelaKZm6i1qZeZkpKdmZ2fnZCqnJWWhJSWip2Ym5OKjZaWmpampaOfnZaVl5J/j5SFe42SgouVZGtxZm9xXkZZZ1ZEQk1YRFo5SEI2Pl1RaFxPWV1HW15dT01SWGRKSkJcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYFUxNTA9YFZeOClDM1lVXGdLNox6ZkxApJqhpa23payqpq+ut6qvtbunprG3xbextr3Bw7W1usS+zMa5w8C5vrnDuMC4srSrqbq2urm+tKmtsLWXmKesqaybq6uOq76erK6yo6ugsa6zrq21srm4qq6usai1r7W7vMqzqre1sbSvrqahtKCbqK2gppaWm5qyo62gpq+XoaSampOOo6Wos6qhprOtqrWlr7K1r6SZnaynmpifmpmrt6OXk5COl5ygl5aTqp6akX+Sl4ydm5iVkIqUkp6ZpaKioJiWkpOVeouPhXuMioKKkWptd211e2FGYWtZSUdaWj17SkZENkFiVGlbTVxhS1xdWlJSUmJgTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUX1RfLzUoQ19RXC4rQi9KR1BbRzNjWVRLRJmXobGpsqqspqSvrrapt7W6pKy0t8m7tLu6v7+0s7fDwMzIvMO8tr2+v7e+vLG8rae6ube1wraqrbG3lJamrquoo7CplK+7pK2xs6eoo7K1sbGwtbG4tKmvrLKnt6+3tMTGt6m2tqywramno7agoKexoaSVnJqVsZ6nnKCqjqmjnpuWmKampbioo7K1rKixp66xtaylmaCsqJucnpyUqbiclI6OipebopePl6SgnJOCkJSPnJuXlpWIlpCYmqecpKCRlpGQlXaEj4d7hIGDi4psb3Z0e35cTGZtXEpOY1w+YntHSThHZ1dmXExeYk1YWVdVV1RpXU9PSGBdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5HZjI3J0diTFYlLUIuPUVMUTwzcmtJQ0ORmaWvpa6vq6ilsbO0q7eyuKGrtbnJua3Bu8K4s7G1wsLOxcDBvbS9v766vryyw6epubC1tb+8rqyysZugp7GtpqavpZ2yta2rsbKsqai1u6y0srWttK2qrKisqbitsrDIwLmlurCprKylqK6xpqWjr6SpnJ6dm7Cao6Ojo5Gtn6SgoKKrpqe5pay2tqWrrKmtsLauop6jqaqboJubkqS0mY6KjYeQoaCUjJScn5KQg42Skpyal5WUh5eSlZmnm5+ejJKRjZB2fY2FfHt8hYiIcHJxfXx9XFNkb15OWGZcRkSWW0c7Tm1YYltMYGJOVldWV1RYZ11RUkxjWVtUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8rMSgpKywtKiY1Ki8mMCkzODoxJiozQmM6NipIZUhKKzpIPjNCSFMsPpBrO0dIj5yqq6KqsaSppbO1srW2srKhq669zLqtwLrHsbSttMHD0cXGvsCyvsDCu763u8SmrLarsre7wK+rsayfo6etqaiksKOqsqqwrLCvsK6rs72ntrCyqbOqq6Wlo626raqyw7q2rbupqaesqaexpaqko66qqKKfnKOtlaWemJ6ZrJ2ip6miraakrau4s7KiqqKgrK+xrJ6gp6epmaOZmY+gppeGhI6Ki56gjoqMlZqOjYSFj5SfnJSXlYaWlJOXpJucnIqSkI2Jf36HhXx2foWDhXJxcIh1a19aYG5iUXJwXEs7hHxGP1h1WGBaTmRbTlZWVVdRXGFeU09OZ1hXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyoyNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTtcSjAuSmdERjg7QjA1RUtYMUCVWT1MRZWYraiiq7Ocqqqwt624tq+rpqurvcm8sL22wq+xq7PDw87Pw76/tMDBw7m/s8fDqq62rbK4vr6yra2qpKeqsKinqLGltK6rsa+usrG0rLS8pLezrKyvqKufo56wt6uqrbq3pbe2pKqnq6qqraGpp6axsqSnpaGhrJeqoZWboKaepaKrpK2jn6exuK6upKajm6qrrqmdoqWkpJifm5aPmJySgYKQiYScn4uKjouYjY6JgouXopuQkJuMk5KRk6OZm5mKjouLfYaBgYN6c3+Cf3xydYukh3hrX2BuZldkhmNOP2eTTEVieVdiWFJlVE1WVVZUT1xdYVVLTmhWVlZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqMzk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2VlouMEpnQUE8PEIrOkpPXjREhj1HRkSXk7Cmo6uxmKuqrbastrKspqyqqbzAwLe4sru1pbKvw8nL0b/Au7m/vsG4wbnAxKyxtLGzur+9srCurKqrqLappq6vqrmwqLKyr7Ott6q4uKa0tquspamqnKOes7OpqKS0tKC3rqCqqKqoq6egq6ypubWqqqmpoqqgrZuSqqGdoKWipqOqn52ntK+pp6ujo5ilp6eqnKKko6CZmKCRjo+YjX6HjYeEnZ2Gg4mJjo2Oi4KFlKKajY2akZKRj5Ofl5iWjIqDf3SGgX+AeHSCfnh2fYCHnY9vcmdmcHdcYHKHak9emVZIbnlVZFZRY09NVlRVUE9YW2JVSE9pVFZTR1BZVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzo3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD5DLD5MVF8vSmk1T0Q8lo6xoqarr5qspa2wtLWwrKawqqi6vrvAsK25rqG2r8jHyNHAvr27u8G9usK/vr+tsbGxtby7wrGxs6qzqaS0qKWts7O5sKOuuLKws7usurCqrrasqp+qrJ+joLatqaGfsLOitaqeqKepo6qhoqytqL2vrK6toqion6yZkLChmKKhqKifqJyZqrGqo6CuoqGUo6Ojp5iaqKWYl5iej4qHlIh9jYaEhKOWhIGBioaOjJCDg5OfloiRnJCTkY2RnJSXj4qGhnd0gX98dXh5f3lycnhmf4akdmlfZGmAdGaIi3xTWG9eSnhzU2RTUV5NTVJaZk5NVllkWEdSaFJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS01KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMZzo0OF89YWQ/RjFDUFtbKkhNOVVANJGQs6Glp62kp6Stp7WzsqulsaequL7Au6+nuaqmr7HJx8jRw7y/vri9vrzIusC3r6+zsbm7uMCysrqsuKyitKeorLK2ubOoqL22rre+sL6nray1rK2cqa+joKWtq6icnquzpbSomqunqaOonaOpqKm+q7Swrp2qpKGvnJuzo5aknKWmoKWcm6mrpp+cq6Kck5yipZ6Yl6ipkpialJCKgo+Ffo+DgIidj4V+fYuHkY2Pg3+TmpOFk6GMlJGLkZuSlYeJfn9ye3p+fGh4fHlzbm97ZoR4hIlkYWdgcoR6bGZ4XV5UP1d7bVRiUFFYS0xOcnVdSFpbZ1lFVWVQRD5KT0RDQTlIR0tTP2piSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMScvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZiQUo3R1NgVSo9OURXPSqQlbKaoKCqpqWhq6W4s7OmqbGmrLjBvbWvoritqKiwwsnJzMG2vcC0t7+6yLXCtLKytLG8uLm9ta25tb6toLOnq6uwtri1rJ++vaqzwbS8oa+ztaqsn62wo5ymqaqknpulsKewoJ+rqaehqZykqKGtvKiusa6hq6Okr56fraaXn5uhpJ2fnJqkq6Ocm6WllpeVoKOXm5elrIyekZGRi4KKgICOgHuZlIyIe32Lho+Ni4mEkpiQhpSjiZOSh5GakJOBiH15a352eXhjfHpwbm9xdmd/c2mEaGVnXmxzjWxgaW9gbz1aeWxVXk5QUUpJTVRaV01dXmxXRFdfT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNjg7MigwOS8sNC8uPS0qSz4pHTQ5JicuMzQuMCsvNCYsOiQ0MUFoWTE0Uz1lX0RMNktWZE8qOzFOVz0jlJmtmqGYqKWkoKikuLCvpK+wqau4wbmyrZ+5r6uotLrIy8i/tsK+r7S9t8S2wrGtubGzwLS6vbeoubi9qqO0qKmqsa65saucvL2lsMG2t6KvtrWnpqews5+epKaooqWZn6yoqZ6gq66moKaYo6igsbmfo7GvoayhraScp6apmpqbn6WWnZ2bnqqnl5yhqpOZlJmfk5mWoamRmomOkIZ8h36CjX18oIyNiHiCi4SJi4uFh5OajomVnoiRlYKLlo2RfIV8c3B9cXR0YHp4aG1vb21ofXFie21pZWJcZIR+XllzanFKSX9pWFpNUExKSFBSUUlPXV9uU0RYWlJoT0hLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLjo7ODMmMjwwLDg1QiopLUIqLDQ7Tk5AOzczLS4rLTcqKjwlNTM8ZmQyNE0/ZV1GTz1RWmdIKj4vV1U1KJeep5qdl62hoaGlobirsqW0tKmoucS1sq2ft62urbC0xsjAtr7BubC0vLa+u76vqr2wtL+wvMO5qLu6t6entamorLGttLGonL+4pq69t7KfsbewqaWnr7GboaSgpaWgl5uwp6Geo6ivoZ+hk6Skorewoaaxq5+so6+YnKqkqZ+Xmp6llJudm56nq5qcnqaXlpiWno6Tl6KoopCJi4+GeoR+hIp6j5aJjYZ4gYeDh4uNhY2TmI2PlpmKj5d+hpeMj3mBenByd29vdF95d2Rqa2pnZ4JsZXJra2RnV2Fyf15Za3VpWUV9XltYT09LSEhSVUcyOl9ebVBEV1VZZU1ISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRIQmZbSFRDVF1oRS47MV5RLDKWpKOYlp2qnqaho6G4qrChu7ilrL3Esq+uorWvra2vtMTEvbO+urews7m4uri6ra2/s7S4rr/Bt6u9urSlorOrqKqzrK6ypJ3Dt6aquLesn7K8qqelqK+rmaOnnKWmlJihs6aZnqWpqZyhn5Sln6S5qKSnraaepaGpk5+poaGhmZueoZObnZeho6ycnJujlpOVlpuOk5Ojp6SQiIqOhnmEfIWGfZyNiYqGeICDh4iHkYWUk5KMkZWUjY6Ue4OXj4p3f3xsdXJtbHNieXRnZmlmY22EZmdoZGZnaF1kYmllWmV6YmBQc1RbW1NLSUdJT1NAICpqXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTctMTE5NSwmLjUtODA1NzZgdEIzQ0RoW0tXR1VgaEIzNzdhTCcyn6Slk4+mp5yfnp6ktq2oqrq3p6zDwLavrKK1rqevr7fBwL2xwbewrrK2tbm4tayqvLOvsrG9wLeuvLyxpJ+2rKamtaqrr6GgxayqqLK1rK21up6oqquxpZidqp6npZKZpa2jmJ2kqqGboZyXoJ2ntqWvqq2hoZ6dopWgpp+ioJmcm5yTmp6Vpp+uo5iYn5aVjpWYjI+YmqegkIeKioh4hXeCgoKch4qCiHt+hYiGhJCElpWPj5CRkJGNknuDlY6Fc399Z3lwbGtsZ3Vza2FnY2Jzf2FjZWZlaGhhZW5ZXVhcbGNhTGdXW2BWSUdIS01SWD45YGxpSEJVU1xbSUhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKywvQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNAYkYlNZ2koZKNrqGamaCXpbSyo7K+t6Gxxry5sLCjtqyrr6m5vr27rcCyr6+utq6zubKnq7mxr66ztru2r7m+rKWetaugorKlq7CfpsWhs6aws7C3rrWerK+srqKZnaeqpZ6Vm6emoJmlo6mcmp+blZ2drbCmuaeuoqGamp6Zn6OapZ2Xn5iblZqhk6qXramclZ6dlI2Vmo6VlJinp42MiomOe4F0goKLmIWGfIiIhIWKjIiShZSckpGQkJGXj5B/gY2Ogm+Cf2d5bmhsamdxcmtbaGNhcn9gZGdqbmtlaWVjbFxsbHVwYVNiaGNlWklHTE1PWVFQVWFlgVRAVlJaVEZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuNDw7SzYvLissLTI0OjUjMyopNi41NTQ2NVp8XTE6S2pbTVtLWGRjQEExSGJCJzSUo5yPj7GdnJShm6mzsJ+4wLagtMK7vbmxprawqa6luLq4uKy7sK2rq7eqtbmtpLK1sa+psba2sbO2u6epoLaqnqCqo6qunazEma+msLG3tq2snrGtr6qim52krKmblZympJ2aqqOllpqgnJKco6uqqbqepqSgl5qanqGPa6OWmZ1xg5ecpYF2kqypn5aXopKKmJmAl4qfjniFko2DbWl+d4RxbIaKhn2EioZvXWRgZ4SYhmuLkJSSdXiLhH+DkH9miIBodmlmWFxpdG5OUGpjZnGDZl1kZm5raF1bXYmQhYdoTktDOEVUZ15KSFBQVVZLSFJhcHRlRltRVVBGR0ZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNU9rW05bS1tmYj5HMU5hPCsvjqSaiJaym52UoZyqrqyjvcWvqbfCuL68rae3saarpLi0s7Owua6qp6y0pbG1oqe4trWop622s660rrSiqZ+0q56jpZ2nqJuwv5Wop7G0ua2upKitq6uloZ+coainm5ihpaacnKeonZOeoJmQn6iqo7Svo6KjnJaYmZejiKGPkpqIoYiVn6J/pYCorZ+UlJ6UiYRyeIyOg4igdYeNaZeJZn5zeKBvh4eEfox8f6Ggn5l/fIiedIiOdpuKbIeCg21oZGR7bXJiVIZtY21pmHFYaXBuhlddaFpralqIcGx5codoh4RZXkZOPkZeTUVSVlZRUFJXVGdeTFpMUlJQRUZHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STovMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN0MTVSa1tOW0xbZ189SzFUXjcvKI2nmISdrJ2amp2fq6qoqr7DrrK6vLfBv6qkuLGqrKazta6vs7arqaWxraW2s5ustba0pqeos7Gtsqiunquhs6qgpaWboqWesbiVpqent76mrKepqqynpaGfmaGoo5mZp6OkmJylqpaTo5yUk6SmpqG2pKOfo5iVlJiUnIiukJiViqqMmaOdhrGBpa6flZuhl3qC1Kh/h5TAm8Z4d7Glt5ZkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyXsauxeWhsWLGub2VpvJK8bmh6bXGP2H1Sa2K2sn1/cJR1mqGqkFZOWGFPVk5GVVxYUFBTi1tXW1BAXERQTkNGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQkUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzExVGtcT1tNXWdcPkwxWls0MSGPp5SBqKqfmJ2epa2yqrDCvbK1wLW4v8KrprSurqmosLWqr7a0qKimtaWoua6csrK2qqWkp7KvrrGmq56npbOloqKgl5yioLKvlp+kobW6o6qooa2tpKKdmpqjqaCYnKmgn5eeqKiRnKeblJ6ip6OhsKOen6OWl5OYkpmFr2tqi46qf2iFloetZnGfnpWbqZdxrqGkfne6fGugj3axX2q0W6WAZZyQYGaBemZ/aXhqqWW+cmemjHaxanyxeHWRlGNtbaduXISgRWlnh5ZFdZxgfWZ7o6aBWF+Lq2h9j3h6aqg4Sq9bWFRtY1pLT1hfXFZWO06HUFdWL0lTU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLy41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV5YMzEbkqKVg62npp+jpauyuK20vb6wt8WyuLvDp6mwrLCpqrGvpLC6sKWlr7OjqrmpnbKysKOloaqtsKyvpqigo6KxnKSemZaZnZ6wqZicoqC1s6Grm6GtrZ+dmZeho6mdmZ6loJyZoaekkJ2jmpehoKyfpqagmp+hlpWRl5GahrWbtXmGqZq2mXeHs5u3f5SXmKyXf2uBpnqBhYaRlJJ3q2dqsVuse46HlHSJcI6GgH+IkJd4g4KKl4yDoI+FsHZ3n3Fra218i0+lWEhjY5l+Y2ilX3lxdVKShl1QqW5jcHuFgGGdL1KibltUa2dgTEtcZFhcWkI+sHdXWEEjTWlGQkRBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJBQUQ8RkQ7MDIwMTtGLDAuODQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SjlhVDUwHJeglImzpqahrqmos6yqu7bCsLzDrbm3wqutra+vqK+zqqKvvKuiqLatpKy1pKWys6ijop2nqrOpsKimn6CgsJegm5aWl5ugsKScm6Sota+hqI+pp6qbnZaYoaapmp+do6CcoKOlo5abnpianqOrnKaanJqioJaTkpSTnYTVk5m5cbHCf8aHfdaUnLt9nJeoko6djaR7jYaigaWCeat5j51Wr3uJfp9quVq5d4aEfaaClHyZeqp5jp2Qe7FtjoR0kLuGb5VQr6fFilGgemNgqmJzcoZrlodeUrW0yIV+iHxjpDNCnXVdUGpoZFBAWGZZZGFKR0xqSlpTT1lmWkNDP0U/MDw8NTk8NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQi4vMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbSltQX2ZUN0g6YVA3MiWco5OZsaippbOqpbWopLy3wbC6wLK3tb20tqiysaSys6egr7apm6i6rqSwsaGytLGhpJ6eqKmxqbSpppyen6yYmZmYmJaYo66fnJeorbGpo56PrKKnlZ2XnKGmoZiioaKhm6KiqJyfoJ6UmZunoZynlZubn6CYkJKVkJ2Ism5otXKsiHCPp3K0dXS2e5yZpo6QnY2jfo+eo36wdYKQ0tJ1XK58hX+kbpuqpmqGhX2tfZiZkHuxc5Odj3mzZZZ0hZ5un2aUUsmLWsJcn3liX61fdnOFYZaIXVnKnW/AgHRNS7VTVcZkVVFqY2VYQU9qX2xpUFVGSDk9V1JbVllIQj9KPDI/OzU9PDU2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEFOVF9lUDVHPWFNNjIuo56Rpa+tpam7raa1pae2u7yyu7+4t7W8vLSmtbWjs7KjoKywpZinu66lsrGdtLiqoKWdoaqlsqisqqWanZuqn5aWmZmTlKSropiTpquxpqGVkqufpZKUoZylp6CVm6anopujn66aoJ6ekJaco5+dpZSdlZminpWZlpObhax8eKh3o4+Lh6pwrouEqISamqOLk5qLon2Sl4euhH+Bs1xyslOvfYKCo35x1313hH6PnYaZmnevhoqRnIh3tGGaZZqCgZVskluwV0uadZh5ZmCtXnZ2hmeXiGpdr3eVn493bDV5yK6zX0NUb15nYEVQbF9wbVZVTS5lY2hSWVA7QURATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0JgSTo3N6CdlKC3sZmzwa2osqeqsrq4tLm+ubizt762prm1obauoKCprJ+VqLasqLGyq620pJupoKCoorWnpqqkmp6WpaKUlJ2akpakqJyUkKetsKWglJmon6KPkaKaqaahlZqmqZ6dpJ+tnaCdoI2Un5yfoZmYnJaXoaCUmJGnnoepfn+meaGPkISqcK2Ng6eGl6GjipiXiKOBkIaUqnp/i515cLFaqIOCiKB4dNh/dod0p4GOm42SpHyVkJ+Ee7JenGSgfYKVbpNcq1xbk3+Rf2hnqmNye4BqmIZxXataiaCPa25kT0pDoVxaTXRdYmZNWmFfcnRfSlU1SpqRWEhFPUdFQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPE9lZEEmVWZbPzFUX2JMN0ZIX0MxPTeinZqavq2Ys8Guq6yoprSwuLG1v7m6s7K5vKq7tqGypZ+mp6eek6uyqbCqtq2qr6GYoqCmpKS6o6OsoZeckqOglpWfm5WZoaGRjoypsLCmnZaap6afjZKkmKirqJWYqaifn6CkraOgnqGOlaGZoKCSnJeclZ2hlZePrJyPrm5ytHSpjHeLpnS0enW0gpSnpJOdjYmkh451uG6Le4uia2u2WqGGZZeXaKCip22UcrRzk5l/s2qFkoitanW0YZ1mom6GkmuXXK1gTqF8h5FSc6NseX9+bpiGb1yvVjycd2VUb24uW6dPYlJrZWJsWWJcYHB8Y1NZUT4/bG8yQkJAPk06ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKywzMjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUE4pZqcnrqjnLHArq6rq6e3qbivtcG1vbKxu7iswreqrKGdp6SinZKrq6i2o7Oorqqhl52ooKWruJ2jrpyWmZCmo5eOnqGcmZ6fkZOVq7awppiTm6yployTppqlraORl6uypKCeqKywmKGikJmhl6CblpuXoZOcqZ2UkKuZh9SUmrt1scSAxId+1pecuHmKkpmOmIqMp4d5orZ1fXd2woKasmGDunnAfHW4YrWBjIepfZaCrKlxe391vIinoGmdYaaOr6F+jHSHq32+bnO8dLKDdXiBim2aiHBtjaR0vV13fVthebxqWlZbaXleaWBkZmJteW9YW1lDQUBxP0NHKzRIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw7OjA4TFhhRidUY1g8L1ReYEs1PExbLTZAOaean6K8o5eww6+tqqqssai5r7fFsbuzr7ywrsGyraajn6SinJyRq6WqsqW1p62kn5aaq5mnrbido66ZlaGQpqCTjp2jn5mfmpCWk6+5sauVlqOnppSQlqWdpK2fkaCoq5+cn6mksp2ipI6moZWhmZuWlaSZkLCgkpWqn4WQmbaAkpKNuJZ4g5ObtndubG90b3mPhI6Jcp7Au7yae4GyqHCAdJG5g3yGhoqHjXuLho2XfaS7ub2cdXmzo3R2l3V0sHWYnmaGaY22dHJxd7aMXn95fYhng3lseWKLrHB0hX5YW6dpRGRZVGZfY11jUWdmcW11Qk1PTEQ7Wkw+SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JXOCpPXV09KztWVic9OjymnaGhv6aVssKzq6qorKuqu6+xxq+1tLC4p7W5rqukoqefoJ2ZlK2lrqqntqion5yWoaSerKW+p6Gql5WckaKbkpCiqKKTnpeSmJSytbasmJ2jpKKLk5KmnKarnZappaacm6Gpp6eiqKCRrJ6Xop6Xlpidno+wqZScp6KPa39qnKl5iXR/m492e2aIe72+wLpvkoNxlIVfcmpaXpuJYWOHj5ZsYH+UY22cdmKVa4CalZRlXmBjcZqJaHKMfIaUZmp+cHR4fn1iW3h0gWhQXG6EfHyLaldseoFySUpvhXBOck1EVlxmYExaV2ZjX09abXZqclJPRERNPEhJPEw+MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNUNGVUVKT0hGUElJSDs4PTUxOi4xOzouLy03Nj01JiIvKjIsJTs4LTdJUl9JJ1NfVjQpUF5MKDM+XE8nPzI+qJ+oocGkmbS5tqOspq6nqLWyrMissLSttqS+srOooaSqnqOcmpqsp66kpbWqpJuYlaKcp62pvqippZWUm5agmpOZpqmokZ+Qj5icsLK+rJqmnaeiiZOSqZuopJycrJ+jmpyjp62in6mhma6blKagl5Sen52YsaWZoqiZnZKfnaSmm6ikm52anJuRl4Jobn1yd5GXlJCEibSqjYWYlY+KjJiXiJSViYOTk5CJjZKUmZOZl5qfoZqblJ+bjYJ6pIVsaXuQfYB1iYuCcoJ4eXZ2ioB8iWpzgXSDdWR3fXZrb3lsX2Jbb2dNWFlmal9XWXB6b21mU09GUzlQWk5STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8Ojs0ODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlQxMFReOis9OF1LLDwtQLKgs6K/oqOwsbegqqazp6WwtarJq62yprWmwKm0oZ+lppyllpahq6eto6S3rKCZl5agmK2qpsGfrKSWkpyXn5iUlaOfnqOok5CYqKiyw6+Zqpyqno+Wlqmeq5yeoa2YoZudoqWvpqGkp56smJalnZmZoZ6enbChnaKnlpmUmpSho5ekoJmhjpeVi4uOkJiuj3yVm4KRgYmpqIWAmJaLhI6fiHuEkYaFmpGHhoqVj5uXjpCYnqOWmZKQnI1/jWWhs66EiYR3e5CKfnd5em9neZGBgYlrdYF5iHJoc395dYOGgWp0YnhlX2hkY2Rmalhre3Fqa1xTTFBEX1VGQD4/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVFZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzM5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LECzoLmvvq2qrbGyoKqmsq2irLOwxbCrraSzr7yktJyhqKOhnpqXqKappqSms7WelZWempqwpq6+oayikZGempqUkpainJepnYSdqaujtMezn6mjqpaWmJqnnqmcoKWrlJ+fnZ+qrqikoqugq5qen6GYpJ6cn52wpJmfqZSZmZ6TppuZqp+cl2aEk31lf4+bkGN5jGxoanqQo6tqZZqYfmeFi2VlaWh6jaKOa2iMmJGjeGtqi5mjn5hzbG56hIyGeVhlXYWBXmyLioJ3XGdzd3eSgIiCb3eCeH9zbXmEc3aIh42CemiEWF1qc2Rdc4hpa3xxbWNdUU5WSWRYQEkzPUY3P0ZENzE8PT9BQzs7REdISElMTk9SUlRXW15gYWFgXV1dXV1fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtKLjZaTzYpRVkvRE8xWUI7Py49pJ66vbmvq7Owq6Wora6wpq6usL2xqqilrrCwoK2XoaSeopqap6ycraSmqKmzrp6WpJCjsKa2uaWuo4+PmqKak5KboJmZppZ7pKuiqLTDt6Whpq+enZWeo56jnaSqqJKfoZ6gqq+qqaKqnqabpZ6noKuWoZylsaSXnayWop+blKaZoKyZn369hIlztHOFn4ataHe5xLhxkqGjeqaYmXSrgn3LwMC6cYujh4OefZaYiJ7AvYKWnZ2NnMHBfIF6kYyawsB9aqWyb42Bb8p6f5t4koSPgHZ5gYB5cXuAhnB3hYuSeGx1kWJlXndjX2WAYl50aG1kYlhLVUlRWUhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9gYV9eXl5eX19fXVxTTVBHVU5BQD89NjQ2ODI2NiomJSMpKiYuKyopMTAfOSojPklbTCojQ1AvI0ZbM1BZL1VBQjsvOJWiucO0r6+/qamUo7CpsK+tprK2r6qmp6axq6CrmJujoJybqqeinayjpailpbSknqOTpq6tuLSnr6KSkZmdppORoKGYm6CeiKarpKutv7+xoKivqZaRn52imaOkqqOToKGenayuqKqlo6Gkn6OknK2pkaSbqa6qnJ6rna6jl5iml6KkmJ1/zpR6e6WCepaXm1+tj12OqIChoXynlZt1q4OBr15kjKp7qIeFoHSXk4izY4KrhqCNjbNqhK90fJaHuGGCrVmjzW6Qdnvbe3+ZcX6Ik3Z/ZXuIdXZsfodtfYWPkH1rgIxfcGpvZmBfeGRbcWhqZGZgUlRTV15KT0M1QUhFRDg+NTtAP0E7PThAPj8/QkRERklKTE5QUk9TXF9fX15dXV9gYF9fXVtXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDpMLSFQQEY0LjGswcC/tLSwt5iekaOqqa21rKayrayspKymsKqhp5yappicoq+foZ+op6OmoZ+wrJuelqaurbGrqKyglJKbn6WTkJ+ll52oo56to6qwqL/Fsqepsa2Wkp6copehqqqflaGenZytrqapqJulpaKgqpKss5aloqqqnqSnp6KyopObp5yhnJaVkZehcoaMmHaGqIdxsXydcax9oKCBpY+eeKuCfq1/nXKtf6yHhp92mJJ7fJd+qoiijJGLnH2reoiSj59/eq1WnMR7kHCTwX2BlW11cIxtZndlhm9heG5yboiJj46DbI+NY21zdW9gZm1kX29pam5mY1dTXGBaUlJDOUlJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLTwoPTEpM1ZARiEcRztDMS0rr9PGx7Kzn52jj6Oioq2vt6+psaeoqqiuq6unoqSdmqOVn6aroKKmoKioo5+esK2Ym5aop6+tqKepnpeVmqSikpShrZqdp6OvrKKstam5zLGspq2rlpScnaKZn66snZahmZ6eqbGnqKibqqejoaqar7GiqKuuppqnq6urs6STmKSnnJaThaRrpHWKeql1e7JxgqWKmIxwiKCbh6RfYVKrhYCug5x1roKohoafepmXhntmgKOKpJiGgaN9qX+BlIauXnuoVZ2ikoF7o5+AfMSwxYxzr7SzuXJiqa/CdWiLi5aNgGuXkG1reHh3bmtmZGRxcWZ7aWNcVl9pWFhUTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgJychKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dbAoZmrqKGvop+wtLCwqa2jp6eqq6uopKagm6WfnaanpqSdrJqirKGjn6+jnpuTqqS1sK+hqZuclpWnpJGboqifoKacsKWiqLGstsextKirqZWRnZ2imaCls52aoZScnqeqqqKtmqqmoKGporKsoaqzsqKcq6mxsLillJelqZqdk32qbZ+EiHareXywboKki4mflpWeloHSuLS4yYGCsl9hlKmDpYiHoHqYlpp5qsl0mqOUqKmQkpqMfpqJmsbGd2WhgqVzgZ+Ogn2vX2+1Y7F1S6OGbadHg5Nkjo+bkXtvlI98bXl0fHptW2VqcnFmgGleYVhjbVxeWUlMTEpFREJBPUE8QT9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00TlRRHRw7PEYyLCSopMDGua2psq6tpqKds7msq6Glm6imqqyppqCmpZiro5+vrJ2moa2an6mlnae1oKOYlKirtrOsnKacoJaQpq2Smpyno6Cqp66ho6epsLPBsbKprKeUiZidpZuipK+ml6KVmJylpamZrpyrpaSdq6O2rKGxubCenLCotLS1ppaZqaWcoZCDnk53moKAn3qEo3yCpISGpp+cn5SEuHx8ermCf8zGw7Z3m6KRi59+mZeXinafl4qkmKSofq+Fm4OehKx9mZRhpWyjcI+FkIF9loRyrGCkc3GAmmG8fVJVdY2RoZV6fJCOh3J5coR+b1tsbndyaoFuWmNfaG5iZF1MTFFTQUhHRkg6Oks+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUV1lZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1RGPEUyOlBbVBwbNj9HLC0gjIeZqaykq7mrr6CboqyztaafoZWlr66uqKeepaWapKehs66iqaezoJqppJSjtaOjlZehqbW5pJyjnaOTkKKymZ6bpqWhoq+tnKSoorWxw7CtqaypkYaRnKedo6ScpZeemJiZpaOnmK2hq6Kkl66lu6yit7aunp62tLqztaiaoLGjpqCIkNK1w7d6h46FkZOPgKZ4lKJ3jKGShaWDi3Krh4a0bnJpmaSdlYmffZeZh4eQc66CpZujjaaKk5yIlJCabXCyXKVzk3qcbJl/e5l+bqlhonJyfp9ic7K4aHeOkqSXfImKj4h1e3iNgWxod2l4c25/dFxkZG1tZmhgSlpXWDxIRj9TM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCMpJZJyjYquv7+8u7Wel6ikrraiopmVo6qnramqmaWin6agoLWmoqmnsaSUq6OPpK2knZCamqq0tKSdpZypkpSXr6CgnqajnKectZmgqqO1qsKvqKqooYyEj5yioaajlZqanJiamKajpZepp6ugo5uspryslb2wrZ+jsbW7rbapnqu0pqqafKiRfXyweIuApKWInG2yb6GHrXyij4Ool5qBrImGrYWglKigo5eFn4GZloF7kn6rgZ2Zlourd52gj4iTkn95r12jgXymp2SegHyXdWquXaVscoWZXWBbjKBtlI+kl4GSipOId3mBln5pbH5ifXRtf3lfZ2Vwb2dnaEJZX1o9SlMyUzhBQUM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pYU1BPTkk4MTUyLiosQVRWVlZVVFVVVVVUVFVUU1NWV1dYVlVWUUhGSUojKCi8kpuEqcbDt8G0n5qtoK65pqOOmqOkoK+uqZ+jnp2tmJ65oKOrobCqmq6hkaqppZaKmpCtsaynoKibrZiZj62ioZ6loZmknK2Xn6iltqi+rqSpo5+MgI6bm6CmnpKUmZuUmZmlo6KYp6uqoaKeqKe8pJfDraujoq20vK2wqaO2sautmnevfpGLnIWHfLqtiZhksIxllq59oZCEp5ecgq2LhbCGp5qkoqKRhaBcbGuCs2B/rXx7goGybGZumZeLiLFafbRbpINryKJmn4F8u1l2tVqyfVOvgXqsWIChbZeNppiIlI2Sk3h3jJt9Y3N8YoN3dIB8YWpmb21mZWVPVWNcQVRdPUgoPjk9NCEhLCQfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTUpHQzU1My4vQFVZWFdYV1dYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsbe+u7TBs6Ocraalt6mgi5mgn52ysaieop+dtZigs6iqq56wrZ6snJWuqKKOiZuOr6ypp6Oomq6Tmo+pmqGdpZ+Zo6KlmJ6iqLGou66kqJ6dj32Lm5ahoJmQkZqckZmXqJ6fl6etpaOkoqSpup6gxqemqaGstreusKmhv7CwsJiCqpKjr46bgIakl5iQgIC4w7qEj52ThaiZnYOsi4Oviqicm6arkX7VvcKqYqS/vX1/o4KD17q3tYSUkoKevb6EaqOBb6uEbp1/erKxx4Nrq7G9rHl4or67dICVjKSZjZiNk5l3f4+ZeWJ8eWSMZniBe2BrZWpqYlBiW1NpXEBUYEJMKTw6NC8fHyQeJTIgHCQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVtLSxwLmyvbOina6nprOmnYyXpb+ptq+nob+mprGbnrGcuaifrq+lp5WUr6yXjIOaka6mo6yhpZyqoJiKo5OmnaebmqCoopidoKusqbisp6Oal5N7iJmSppuTj5CYmY6Xk6iYnpaoqJ6opqCiqrqeqcWjobCkrLS2rLKso7+rsrKcdXaqpbeFZYqgcGeskIqPbm53pZCboIJ2sZuXcJGOcpeppJuYr6RybG1tZot4b22DmXGBemlwaWeJlpWXcWhphYZncYZkXYpjaW9aXWd+eKZgYnKQk3BmZICNko2glZWXjZKaeoWNk3RkhndnjGp4fnlkbGNmbGJKZVdKa1k6UGREUCdKOSsjHCAaIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola20qbq5srSqqaKun6SzqpmSvbHDx7y0qZ6/q6yjoKeroLqjpK6sraaOlq2qkIyFlZatn6aqop+ko6CRi6WSppmpmZajqaCWnKWlpq65qqyZmpOSe4SXjqaXjpGQl5SNl5Smk52Wp6KZr6Wdoqu5n7DBqKW0p62xs6ywrqq8p7G7mIyiqaa2nImXo5iGqZuQlJ2SqrSanKStorSYpKOfoqOeoqWilqynjJKTjYeTnZ2VkJmTmJCNlYR/pJqXlY6Lk5KKkIeEfmeMgXSDd3SHjHGnbX2Wk5SUgYGPj46Nm5Gdk5STnYCFkotwaI92b4l3dnx5aWxlZG9jVWFYQGlaR2JfTVgrRT0rJiE2NDAvHxwgJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlRRSkVDPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqS1t6+uorClraCgtrGRjqrEvMO5tqmhpJ2bpZ2wqKS3p52ptaeokZiso4uIiY+cp5atpKGaqJ6fk5Wkl6iaqZmUpqCjj5qnmKC0uaeqmJqQjXyBlYyhlIuVkZWQj5KXpI6dmKiemrSjnKart6ivwq+kuKewsLKvq6y2vaOywJqTp6SmtaKSnaefjamfjZKfoq2xm6Kks6uzmqajnqasoJ+enZetnpOaopyUkJermY2YmZeQlp6Rh6CelJSGk4yPjZWMgX9mjYh1iHd6iYR0nGqIkpaVkol9jJaRkJaQnpCZkp2BhpaFeHGUcnmJf3F7fmpvZF9waWBcX1ltYlBgYk9YOUZGRT0yPD04LyomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iWpKijsLOsrqOpp62gqLWqkI+bo7K5raqroaKZepyhsKSmsamXnLimo5SYqZyOhoqJm6KQr56klqigoZKXmZyui6uWj6iZp4yYqI6duLWjpZibjYl5gpSMm5OKlZGTkI2RlqGLnJ2nnJ23on+DrrWisLB1pL+ks6F5e6Kttb+XeLCmoYqAqn9kXGJ3oI6knoOWfm2UtZ2kqbCspWagoZR0epuYcIGZqplsf6SpimWcpZyRl5iXi5KbkISdm5CUg5OHjo6SioV4a5CIdodxfIaBgWFpiYyVk4xbdpWRZ2eOjHF5oZWVZHiXhYB2l2iCiYJueX9rcGVfdm9ra2dcZWNhYW1RWT1NTU5SRj1AVEI5MS8eHyY0OjMwNjY3ODw7PkBBQkZIQkdHSUtMVFVVWV1gaGZnWFFJPERHPDlVUltgYWJgXl9fYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuqpamuo6etpZKVqrSusKWZqaWql3OLnK+gqKunlJe5oKCPnKSekX6IiJqejayapJWnop6Ol5KehXWuj4immqiRlqOIm7mzp6CYmIuJdXeTjZaTipOQkJSMj5OfjZmepZibsZWAjJu1nbSMko+9qKJ+p6N7pbG6g46PqJ+EjIaPsamvjIqWopp5gIushp2eo6mrqYmWh5p3ppx7iJyBmKeDgXuds3uKhqCYmZSYloGQlpaDmZpieYiRhI6PkouEbnGQiHqCcYGBhoCHdIiFl5N4lmiTdKCac3uZgpyZhJh+kYiBgphpjIyEanh7cXBnZXhuaWxqXGRpaWRxWlxHU0tRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1JYWlhbYWFpZllRSDlETDw+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZikn6aurquoraCpsaenqqWZk6zEvK+glKWntJ2Pg5ysnKeioI2Qvp6ZjZ+aoZF9ho+Yl4isnaOWoaGSjZSJhoCRqI6Hopyjk5adhp65saedmpKOhXB1kImVkIqUj46bi46RnpCVnqOUnauHn7SJtJqui8qIq6+Kt4WNsISzsoapjqmZjZ18qI9ye3ecjqaWaJWkebSMoaCoqpOZwoKAq4mZoXKegJulfZeFlbOBoX2hk5+PmJiAjpSciZiSi3yFlIaNlZOKhG50koaAe3OHgYR9hXWGg5iBj8VmgKmHj6JqnYGel4CZgIqMg4iYb42ShGd3dHt2Z2h1cGdoa15ibmxmaldkRVxQTDJFNDZNYGM3JjM8RUdEOjYzNjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASWRYXWNmaGdiYmJiY2NfX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXo6CwqamopqygpbmxqqummpSeoaSpoZSjqbWir3+gp52lnp2JlL2ak42gkp2QeYOWlZGIq5mcm5qihY+MdpubjqCRiJ6jm5aYl4aiuKylmZuMjH9ibY+Lk5CNj4uMl4uPkZ6Nkp6gmKCnfqGnh62doJaukKCenZGHgqGNrbKIpI6sm4yafqJ2gJmUa4GrdU2reIeNnZOcqqmCqqt+hKF8e6dqnoCTbGeXhpi3iZ5+bmBjWIOXf417ZGeLc5l9eZdsXHyXbmBTcYVcYG16hGBZZYJ+hYGZcaira4OjbnKlb5+CnGdknmxabIh6ZVlfgn5hV1BvdmVudHFqam9daW9samdXZk1cV0U5QTRHQ15rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSS01CSltdX1deX2N1YE1FOk1OTVRiXFtmZmlpYmJkYmRkYmFiYGJkY2FiamtkYmRkZ2RiZ2VhY2iYl56guaGqpKaskqK2vauvopmWnqClq6ufnK20oaeRoJ+gp5yZjpm0mZCLnoyVi3WBlJGNiqaWlpien36ThYWso4eckYqYqJiZmZGHpa+mopWZh4mAaW6IiIuOjomKjZGLj5Ghi5Kdn5qhpX+TgY+joZSgd5yWkKeDo6mAhqywh6V6jH6Emn2icHOTh5V7nox5bYecjJqSnKqcj4edfYOidHemZ55+d6VemHt9k3Oibpi3tLpzk4iBgLaoZIHGuHxxlbaMcYCbo2N0rKthfmqds35ufoiDj4OMmHGAo2xyo3Kegn6jXpyZs5Zve5ees3RyW56ygmlicHR1cWhvWGprcXBkW2ZcYUtEPUQ1UUFZcDI8UkdfSlI9PDM5NTo6NkM8O0BJUD9UTk5RQEVfXltZWGBge2RJQzhMV1VWY2FaZmZra2JiZWFkY2BhYmBkY19gY2tuY2NkZGhkYmdmY2holJaVo7mZq5yToI6luLatraCaoZuio6SsmpqxrKuSl6CZoaWZmpSerJuLiZF4i4VxgJaNio+hkJOUnZd9kYqOqKCGmI+KkqKTm5qMiqinpJ6PloeEfmt7h399j42Di5CQiY6Tn4GVm5+boJ+LiXecmKKNoHKhjImpiZ2okZiqroGujH56oJl5o5N4gHOXiIycfZWfh5uOmp2oiKNkoX6KlpCbjW2eaJuOb5qZe4CKp31yaHSqg56Dc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF+ndneKioCdaJp1h5OSmI1+nm2ZkGqmmVyofne7an2pWo6EXbNnXG5xeHdraVtwaXd3YV5jVmFBUEVPN1ZCUm00SlpaXk5aREAxNTE7OzdIPzpDSFU/WVNYXT5EYl1WYFFhY3xpRUI5TltdWGRmWGZmbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZGNpaGdraZadiaq2nKiJY5WcrLuysKydpZuap5+drJmdsKeqnZejmqKgmZaWoKOZhomNaYiAcnuXh4yWloSSlJiPeouElqSciZWQhoudkZybiI+ooZ+ai5CKgIBpgYZ5f5eMe4iNjoeOlZl9kqGeoKGTmHJon4qgj4xwko2DqYmaoaWqo6p+sK2koriXdqOzoqN/iJR4nXqqmX+ij5+dmYmYcqF9h42wtX1smpGheH6ZtaOjq6iEmXyafJyaf3SqWl1ve5eMeJ5iTX97e4VkephCTZ9ZompzfI5vgoqEmXabeYeJsbN/fpqSpnR+nW1xfJRvmXJpo12VdkhlY2BzcH19bmVfa2d1emJiXk9dVlxUVkBZRVBmRFJWXGFYXklEPUI4P0E6SEU4TEVYQVdSWlZFRmFcWmBLYG19cUVDPFVeYlplalZnaG1vYmZmXmFgXF1eYGhiX2VkdmxeZWdmbGRlbGhobGmUnYGxrpqEU1+hp7S6s7OpmqKLmqmbm6eSoKujoKePnp2dmpmVmKGdloeHiXeFgW55lYSQm4t9kZOWiHKBiZKhm3KSkIGImJSfmoSOqJuZlYqKinyDbISFcYKhjHiEjIiGkZiUe5Gin56jiK6GfbWEj56de6aWeqmCl56RjKOgf6doeG5+mXOgc3F8nYWYb5OCrXykhKefm4OkcF6paHajZHCmYZ3Tj3x7mXhyc2OihpB+onKjkHZrkLOLYIKYinSqsqi8f3eDbn+/pqq0Xpxvf3KXcIJzonJepGd0pmBopmya05h6gptudnmXa5t5dpdybKmlZ19keXF/hGxoZmNtdXZmXmBRWmVQUWFIVklUX1dTW2RqW2VQRUNLTEpLQUpEOFBAUE1YU1hPU1FgZWVpU2R4eXdJRkVjXWVaaGlTaWhqbmNqZmBjX1xdXV9oYmFoZXxkXmRnZGtkamxmaGxomJt/saxUXUt/qrCytbCzopyYhJemoKCijKSnn5aoiZmYmZSZk5Kgl46IhXtwfYRofI+Dk5qCd5GOj4pwgIaPk5JsmJR8iJGSo5WDjamZk5KKhIl5g3aIgG6Bn4Z3gJGFh5iglXmSoaOZn4mzoaK2i3qsp6SupXCpgJuRhoGelH6lgaOahphxnoSjra+Jl4t/jKSNlYOvo5V3tba2yaJzlIyDn2Cel6lteZaHoJt1oYd4oH6QlouBb01mo5JxmohzpXt6dWKDgm1+oGxyZGCcc390l2t7arS2tMamc5h9eZxqmpqrdIGabHN3l2mZeXSXcVBEfbNeanVreIZma2Zic3RvbFVbUlhnT1JnSVVMWFJVXGdrblVnV01KQUpNS0dKTkFRSlBkY2ptZXVzc354e251iXp7VFFObV5oXGtpUmpoaWxnbWdjZV9cXFxfaWJkaGt7X11kZ2NqZm5tZWlsZaKdibCohWVAlKKyrK+vtaGij3+Wp6Gho4ukppybpYKZl5eOl5CQm5OOiIN5a3mGZYOMf5afeXWPiIyCaoWFkoSLhZ2NeoyKlaWSgpeolouRi4CJeoB9i3lwj6CFeYGUhoiVnpR+k6Smm5WWg2dueJxsomR8cqV4nJhwaKeCmY59pXuhl4OWcp92gYmUlY+5bY+KomJ9maOXiW5za6trdaBub6Zgm2mLkGmWh5uVdaKBfppgi4aNdW+IYmihZp5/apt1cGRniIJvcqJbX1tkoW5eiIxxfIB0cmSlbniiY2anZ5dyi5dtoW9SiI9uoF5kp1SLXVSYbW1ya3GBbXBoa3dzam5RVlVVZVlTbElYT1xIWGhocmpZa1ZQUkVWXE1YU2FVaGped3V7fHB9fHKCe39zd46Ag3deUXNhZ2JwZ1BraGhrbG9oZGdfXV1dYGpiaml2dV1cY2hjamlybGZrbWOdpZmmemV0bYunrqWpsLGln4t/lqmcnaOLoaGaoaKAlZmTjpqPi5eQjop7hnGAiGiLinyXmnN0iX2QfGWDh5WKiZWagnyIhpamj4Chqo+FkIqBin2AgI5zaY+lhH2FkoyHl5+NhpGppZ2JpniWm36liZaMspmekYSvl5+leZiKe6l1qJCEmm6looyShIyDvG18pa+Ch4aHlZedon6mfHKolaGWaJ9+b6xjloqWk3iobaqjgYl1iIJ3q5GmiGuSsWx3s4ypbIuGb2+gnpKVYn+rjKp3gYCOp593n32FpJWdoGiah3WrZp6tjLZzdr6Mo5NZg6aNq2F1cnRve3VwYmp9bmdsUlRYVGBgXGtMXFJcSV1sbXZfW3FYW19aZ3NlbW9xY3F0YHd6fnlyeYNyg36Be3uNgYKAdmJ5ZGNuc2RSbGdnb21yaWZpYV9eXGFqYmxse29cXGJpYm1pd21nbG5ilqarnYGAnqSWqqqeqKeto5iIgZapmZ2iiZqknKichIyaj4ackYWSjYyMdIV6iINvjYV+l5NzdIZykYNuf4uSh4aUkH17goWXpI1/paSNgI6JhJR1goeTbmyLqICCi5ONiJueiIuSqqKgj4B0lJeIfoF4lK+kf4KccY+GeZOOhoF7c6mNcn19epeWm4SNeHt9fYiUlZOLd5GZoaKFe3+KbIyGXHp5c3pxaW9+k4pxgHSCj5STcYaEgmWNf1+BgYx4dnOUdXB6b2+Jb4WGX3dpeI5mgoOGj6qcf3R9lmmJiG9+dXyDdW1sZoxzeHuXd4Raald5j2lud3Jxb3d4b11rhW5oZ1ZZXlZcZGpjVWBVXlFfb3d5a2p3ZWpqanV8cHF0c2FvdWJze4F4dXmCdX+Af4F5i4WCfXttgG1keW5eV25naHVreGppaWRcYFpjaWVscXVuWltia2Rsa3ltaGxvYY6Vuqmni6Gim6ekmaSdq6Gfg4OWqpCdn4iZppqomIKBnIt+lpSHjoqJjHKCfI58fo+Ee5eOdHKDcJWGfH2Si4aGj4Z5foCGmKOMe6afioWPj4SVg4aOmHdxhKqFjZGcj4eenYaKmqigoKuDiY2Vm39+ipetqJCTqJF4cZ+ThX2UcH+rh3F+lXFqb3yBn4t/kY6LaG5dhI2NnJ2gkHOXjYlydWyDdnSAWXJvh5GCfn+Mal1pZHuFhIiAYGl4e5x8hI2DdoKHhGl6jIlsYnFzg3dfc42DipGolodnjY6CbHaKgm6Di3dtZGVjeoJ6lVpbaWZtdlt7eXd0bnNyg2ZcbYlra2JZWFxZWGpxWl5gWV5dZXJ9enRvdGNqaml7fHJ6dnRkbXRobHt/dXp9e3l5f4B/cIaJg3t9c356cn9oVFxyaWx2cHVna2dkXWFZamhranFybVdbZW1sZ3J5b2hqbWCMjKuxoZCjoZqfn5iemaihoH2ClquMn5OGmqGRpJV/e5iFfJKZiYiGhopyfICLdoWLgoSWinJvgHOYhoR+k4ODhoqCeoCEipqfj4Gln4Z3jpeIlYuLnJeEg3qsgZCXmJOJnZyGh6Gqn6Kio4uIk5udo5mWq6Kop6GTnImZkX56kJCGqX+Ak5GSk5yxpZqUnY+NsZKYhKaOjZadoYqRnYSJk4tsfY53d2aDhpGLfYmehYeLj4iIgYWEkXd8e3WbpIqHi6CMh5Z/gI2DgXdxdYaEf3iJiIuRp5GEh46HgouPinqFiYeNf3VqgIN8eZlpcWhgc4pwfXt3dm93dIFdXm+GZ25fXllaXFNncFVjW1thbGh0e3tybnBjamlof3tteH5waHBwbGaAe3KCgHd/fX+Ee22DjIV8enl8fnqDeE5kdmpzbnF7ZGtlYmJgW3NmcGZycWxVXWx0bWh4enBnaWtljYieup+Xo6GYlZmYlJikoJx6fpepjZ2MhZ+cip2WfHmVg3uOmYmGg4SGbXiAf3KAh36Ik4Rta356l4eEg5B+gIaEh3yHg42bnZKGqZ6CcoqPhpKSi5yRfI17qYONkZeVjpuWhYWbpp+imp2Gg5KamZmQmaahpp6ekJeCk4x4fYmQhqd8fY+QkYaYqqGck5yOjamNkoCejYmUm6CEj5iAiI+EcXmGcnVhf4SQh3aMmYGDj4KGhX+GhJVuenZ1lKSMjYabhoaQdYGMfn5zc3yJhXt5jY+FlKiQh4SPgYKJiIh0goaGiHltanx/e21oa2xmXnl/aHx7dnR2dXt3XGBwfW50YGNaW15RZmxTZFpdYGpodHl+cGxsY2pqZ4B/a3J/a2t0bnduhHluhoB2goB9hXdyg42Hfnt7fIB7gotgaXtrdWhqg2RqY2BpXGN1Z29idW1sVGJxeWVveXpyZWptbYuKn7iaoqSfk5KWl4uan56cenecpJCbiYakk4qYmXl6jYV7ipGDjIKCgmx7f3hygIV9ipB8a2h9gpeJgYiOfH6FhId8j4CPm5uQiKabf3CLi4yShqChioWMfKeQh46RlpKWkneMo6ChnZaaf4GQmpiTjZqjoqSbmJKcgJCHe4GGkYmhgX6NjY98l6SgoJKZkI+ljI+BnJKKlJmdf5OTf4iPgnZ1gnF3YX6BjoZzipZ9iIxxjH6ChYaPaHhyeo6ak5GAmH+JjHODiX19cnp8jYZ8e5OOhJemlI2GkHuEhYaEc3+AhIV4ZHB6fnh5cGtqZl5+c2l8dXVzfHOAal5gdHZwd2RjWF1eUmloU2RYXl9naXV4gXFma2NsZ2V/gGptfWdtcGp9d4V6a4uBcoGBfoF1doKNhn98eoCBfX+PanKDbnRpYohobGJfcVZ0b2xtYHhobFdqdHZjdHp6cWJrb3mJjZ+zkqWmnY6QmI+GnKCam3t1o56Nl3+MoYqImpZ4fIaHfoSKfoiCgX9wfnp0dYKFfomQd2djfYaXioKKjXh9gI2DeZaAlZeVjZafmn1vi4GRk4Wlm4eMiYOmlYSRipWXkpF2kZ2hoZiUl3l/jpiXjpaanaWempSVnXuSiIV5h5iPn3+Cio6Mc5einqCSmI6PoYyMg5iYhJSXmn+Zjn2KjoJ4cn5ue2SAfIuGcYeTgJGCa4eDgYCKhWZ2cH2IlJqOfpR5jYt9gol+fHKAeYuGeoWSi4yZo5eChIt2h4OBgHR4f4aCc152d3xzfXZma2Rgfmprd3NzdX1xfGNjYXNudXJtYVlfXVprY1JiV19fZ2p0eYVwYmpjbGZofIJraHRobG9of3yBeWyPhXGAg4N/dHyDjYGAfnqCg358kG11iXR0bWaKbGpiY3VWg2lwbWB5Z2xhanZwZXh7eXBfcWyFhZCdr5inqZ6OjZeHhZ+TlZd8dqiaiZh5lpyLjJmQeHyBi319hHuAgoF4c3h5c32Ag3+IioBkXn2LlId/hYd0fX6Kf36YhJaTloyjoJd+cod7k5GKpo+MjoqSoJGDkI+Tl5GKgY+YoJqSkJF0gI6SlImdnZ6nmZiOlZd1kJGLbYiakZt8iImQiW+XnZqikpWKjJ2LhoGTnYCUk5aImop9i4qCe3F6a3ZtfH+Mf26Fk4OUeG+ChH5+i4Flc2p9gpiYhYCOdZKKhXqJf3d5gX6HgX2Ej4aNlaWReYWCdIiGe35xcn6EgWtgeXR5cHxuYW5iZXtibm92c3h3c3RhdmBvbHVub1xaXl1daV1PXFdiYGdscnqIal9pZWpjaHeHbWZsaGlsZ4B8endukIhzgIOEfXSBhol6g316gYR9fI5yeYt4eG1sh2toX2lyYodocW9ldmdtbGF6aGp8e3dwYXdtioGZmquhpameiouRhomeipSWfHasl4yWfJ6TkZaUiHZ+e4p8fIB2d3+Ab3Rzem+FfYGAiX58YVx+j5KGf4SEcnqAhnqPkYeRkZuSpJuTgX2BfI2KkqOJjYqNlpqMhZCXkpWNiIiMkp2Tj4yNboSQj5GJnpmioZiXipeTcIubhmeJm5CVe4qFkIpwlpqUoZGRiIqYjIJ/kp9+k5CUjZqQfIuGiHRzdWtxb3Z9jHVvhpGOk3J0gHyCgol9ZXJuen+blX6FinWSjIJ1intwgn+Ch32GjYuFjpaqjnuIfX6KhHZ8bmx9goBhZndzdG56YV5vYGt0XnBqe3l5bHJwZXlebmxzbXNYWl1fYWlaT1ZXZGJncHF/h2VdaWhnYmdxjW5jaGhlaWeAend1b46Fc4GBg3x1gomFeIV8eISGeoCJd3+Le3pyeYNqa19waHR/a3FubXFnb2tle2Juf3p3cGt3d4l/o5mjqKGnm4iMioGPnYaSmnR/qJORjYagjJWTkIBzfHaFeHmAcnN7hWtyb3ltiXZ/gIZucVtZfpKNiICBgXZ1gX9/oIaPipGcl6CTlneJfoCMiJydio+GkpeWhYiUmI6Wi4qNjoydio6RhG2Ji4+RipyWoZyZloaZiWyHpYVniJ+Mk4CNhIyBeJOYkp2RkIiJlI1/fpCZfZKOkY6bk32LgYRwdnBsbm9xfIdqc4OPmIpxeIB1gomDemd0cHeCm5B9ioV7lZN7eIp1cot8h457i4eFio+cpYl8hHaBiX53d2xofX9+W3FycW9vdlleb2Bwal5vanx6cW5tam13YHBva3FtWVhgYWFsV1BSWWVlYnVvhIFhXWttZGNla5JtYGZmX2dqgXVycm+LgHR/goB5doCLgHmFfneHhnaDhXuHi397dop/anFifGKFfG9wbHVqaG5sdndfcX55e3N1c3+CfqWWm62fp5eFjIN+lpWDjp10iZ6TkoaKmoyVjox6cnh0gnByhXRxdYhsbmx0bId2g31/bW5VUYGrlIeCeIB2coN5gqCCkIGTkpibkZl3kXqCjJKkmpOOiJSYkoSFlpiLk4uJjo+HnYSRi31yi4WIj4icmZ+bl5WBlYBqiJ+JaIiiiZSFkoSKcYORl4+ajY+Mi46Nd3uTkXuPjI6TmI18iX2BbHdqb2tsbXuAYnp+j5eBd3qBeIONfXpodW12iZeMgImHfJWRcnuGcXiOe4uOe4l/hI6Rn5+GfXx3gYp8dm9naX5/dl12bm1rcHJVXW5icmFfbW55cGhwZmdzdWhwbGF3ZV1VZWBgcFNQTltlZF14b4h7XlxocWJiZWWRaV9oZVtnb35va3Fzin12fYWAdXZ/jHl7hoB4h4NzhoV+jIyEfHmVeGdyaoNgh35vb2t7YGltdH90X3R8eIZ3c3OFfHmhkJqxnKaPg4p/gpmJf4qcfoqYko6EiJeOjo6Ed3R3c4BwcIVzcHGDb2ppdW2Cbn18bXVzUk6C38mS1pN8cHSDdYOfgpF2lJCYm5CZe5NyhZCfoZOTkImSm5OFfZWVh4yNh5KNiJx/joF4e4x/iIyKnJycm5aUeo54aYuUim6KpYaUiZiEhmOMkZiNlImWi4yJi3B6lYp8jomLk5KKeoZ9f218ZXNwa217elyBepCPgXt+f4CGj3t6aXVrdIyQioOHhn6XjG1/gHCCjoCOiX6Fe4SRlpucjH13eIKOd3JrZG58gGlnc25naHNsU11vZHBaX2xxd2dra2JneHNwcGRgeGBhVWtfXnRPTUpfZmJceHCJdFxbZXVgYWRkjmNgZmJYaXN0bmxxdot8dHmGgnZ3fotzf4Z/eol/cYmHgZCKiHx+mXZlc259ZYd/bnBrgFlrbnl6cmB2enuNdnJ2inZ6n4ycr5ugkYOFeIiVfnuInIaEnpCOhYyXhJOOh4F1d3B5cW+Eb21ufnJjZHdwfG56fGpobGKkmsHcru+ic2x1g3WEoYSRbpWPlJ+Um4CRcIWLo5eJjpWKkJ2Vg4CUj4WIj4CSioqXfod7dn+JeIaFjpyal5mPkHaLeHCJi45/jaaGk4uehoZei5SXiY6IjYqKhIlsfJeDfomGipGQhnaGfn5sfWR4dWpvenRYiHuSh4Z6f3+Aho1/emZ0aoGLkIuEhIGNmIZtg3dviZODkoZ/hHuCkpeUmpF1dHiHi3RycGRydn9fcmxvYWh0ZlJgcGdrVV5uc3lhcmNgaX5xcm5bY3JhY1ZuWlx3TExLY2ZhXXZyiW1bXGR4XmBkZoRfY2NeWGlya25rcneLfXN3hIF4eHyJcYOEfH2Ie3SLiIeVhYx/f5hzaHVyeW2Le250cIBXcHp2eXFkdnmGjGh2gIlxgJ2Imaico5OFfXGMk3h4iZyDhJ+MjnyWjYCaiIR8c3dwc2pvgWxqbXx0XmB3dntwdHpnYGV869q1ycPciXNsdIB2ipqIjGmXj46clZKBiHCFiKCOhYuVioyXk3yNkoeCiI96kYuGj4KAd3iDhHKHgpOblpOYho12iIByh4SMiZykhZaOoISKYYOVj4WIhYiMhoCHaH2UgH6DhYqOj4Jyh3+AcndodnJpdHhtWo19k4OGfYCDgYSLg3ZidW2KgpGMhICAk5J+b4NteoiRiJSFfYJ/gpOUkpiJbnF5i4R0am9pb3Z+XXJobVxpdF9RZHFoZlNfcXZ0YHBgXWiDcXNqWGdpY2lXbVdbdExKS2VmXmFyc4VpW1xleV5eZGd6YGRfXVlrbmVuanR3in5zcoF/e3Z6iHOFg3x/h3Z2ioWPmIGNgnuTdmx3dnl4k3Vud3p9WHmFcYBuZ3h2kYJkdoaFcYqWhpqhm6GKhnNvkotxdo2afImZiIl8n3+EmX+CeXJ0bm9kcn5pZmx3d1tfeHt6cXF/aWFnYX/Vto6RpnhucXd7cZKQjIZqmI2ImpCLhXpoh4uZhoGSkIaGl417jIyAgImNe5CNfomFenV7g3xxhoCVmY6SlIKJdoSIeIaDjZWgoYiXkaGAiWF/lIeEh4OIjH9/gmZ9kYB/gIOMj5B+bYN9g3VsbXd1dHd2a2OOgo+AhX98hICFiX9wYHRyhn2QjoN9f5KKenKFZ3uFjIiNhXyFgIGVkJGThW5veIt+dGxtaGl3emBnaWlYa3RZUmhyaWJQYnJ4bWJlXlpqhG50YlxoYGVtX29UWm5NR05mZFxmbnGAa1pbY3NfXGNrdmRlXV1abGxibGpzdoaAcW9/fH10eIZ4hYN8gId1eImBkpV7iYZ2iYFveHl7hJNvbXuAdl6Df3SBbGh6c5RzZ3OHfHKSkoSan5ufhod1dZN+bXWSln2HkIOKjZp8jJp2fnZxb2xqYXR8Z2JpdXlaYHd7eW1xfmVkaGhXnY9fcnOXvMSEdnGUiI99cZaLhpuSi4dyaoiPloB7lYuBhJqMfIqFfHuJi3+UiHWJhnZ3foFydYaBnpSFlI+Eg3KBineGfoybn5qIlY+egYlmfpOCf4WCiIlxgX1mfox8eX+AiIyPfWmBfoR2Z3B5eHN3dGxrjoaLgoqAeYKBhYSBbF9zeXt+jouHfIKQgX9zgmp6hYmNh4V5hX6CmY6RjX5ubXqIfHVzbWVle3NhW3BiV25xU1NtcmhhTmd1eGZgXl1Zb4Fvc1plYl5qbmBwT1lqUURTZmBaam5tfG5ZW11tY1picHZjZlxdYGtpY2xqc3aBg3Btfnx/dHWDeoOCfIGFdn6IgZaQeISKdIGIcnl5fo2Qb297gHFpgXh6fm1se3WVa2p4hHRrk42Gn5mgmYSHbn2LdWl3l45+gYqClJeKeY+Vb3p0cWxqZGBzemhgZXF6WmByfHlncXlhZWWPsbJ3S2JapdnQlnF7kIqPd32TioSYkIuFbmuFkpJ6eZKGgYSYinyGf3d3iYqEloBwi4hxdX57anmFg6WQhJONhH9wgIR4hnuInpuWjZWSloWIcHuTgn2CgoiCbYB3aICFeXKAgYOKiHxlfn+EdmRxc4BpeXFwdZmOhoOLfXd5gYV6g2tccn9zgomHin6HinuJc4JvcoWIkIaGc4V7gpqNjoV5bm59g351eWNlaHtuXlh2Wldwa05XcXJmYEtsd3RhXlxbWnV+c3BYZ15na3Jgb05XZ1I/WGZeWm9rZ3lxW1pYa2VZY3B5XmdcXmVsZ2ZraXF3f4hvbH9+gHVvgnt/gn+Cf3aBhImXiXGCjXF7hnx6eYSTjHVqeX5rb350f3xvcnt6k29ugX54Z5KLg6GZnJGChWeGg29neZWIfX6EgpiKgXyOjWl4c2trZl9hb3ltX2JveFxka4J5YXF2X2Vl1Oq9izI6PouOf3F4hYeNjXWClox+ko2Lfm1rhIyMdXyPf4WBlIh8gndudoeEg5d3b4iFbHV7dWZ5goOmi4KPi4R+boF2eIV8iZ+SjpKTlI6Mh397koZ3foOMgmp/cmiAfnlufHyCi4R3YnqFgnJkcml+bnZydYKcjIGAhYB0dn6Ac4JvXG6AdXmLhIt8iIF+iXl7cm2KhZGFjHODeoCXjIuAdW1qdoB/dHNbZ2d1bldWe1JZb2RMWnJyZVtJcXhvXFtbWV11fnRoWWJbaGZvZGpNV2VQPV1lXF11ZWB1b1pZVG5jWWNxeVpoXWBnbWdpa2lwd32ObWmChH95boB8fYF/gXp1goCNk4RwgYtud36Ae3uIkol/aHp9anN7coV6c3Z9fox5eIR9fGuMjYSbnpaMgYBsjX1raH6Ni3p9foOTgn59iohrdnFnaGJbYmdzb19ha3NgaHCIeWJzdF5jZJugj25cNVqvtXRpgIh8kYZ1hZWFc46KiXZvbISChnR5iXiJfJKHeX5yZ3aJfn6Yb3GHf2l2eW5meYeEpIaAh42Kfm+Ad4KDf4+biYSWk5mKjIWJfJCIcHp9hHtofmxqgHt6ant3goiBcmB3gX5yZHJndoNudXyGlpKCfYKBb3d6fHV/bVlxgXd1jYOHeIh2hIl7eXRvi4KRgoZzgH5/lImKfG9uaW2BgXRtW2VkcW9QWnpNW25bT1tyb2RVS3N4aVdZWlphcYB0YF1dYGdkaWlmTllnTUBgY1tgdWBddWxYV1N0YFpkb3JXal5iaGpnbWxocHd8k2xohIp9fXB+fnuBgIF6d39/iouDcXyHb3F3g397iYyPg2l9e213eHaKdnx4f4KGf4N+fXpthYyImaONhIN7dYt4a2yEh5B4fXqCkYCAfouDcHJxY2ZeWWZfb29fYGdwZmpuiHRhdG9bYWRqdnuAv5ympMi4cYSCcpJ7d4WSgnOQi4dycm+De4N0dId0iHeTiHl5cGN3h3qAk2lyhHZnd3VjanyCh52BgH+Oj35zgHWHe4KUkoV6mI+WkIiCiXuJiWt4eX50Z3poa395dGl6d4CDfWhgeIh9a2t0aHyBanaCjJGVf3t+f3F8dnx0f2JWeH5zdIuFg32EcYeKeHlxcYWEjoB/en9+do+GhHdqcWlsh4Fxb1xmYHFsSWR1S11sVFNZcm5iUU90eGFSWFhdYXCCc1thXGllZWRrZFBbcElDY2BbY29dXXdoVVdWdl1bZW5oVmteYWpnZW5uaHB2epNtaYiNeX1ye355goGBfHZ9g4iGg3B3hHJtd4KCfomLk39wgHt3eHqAjHSCeH6BgYKEeYB1b36Ki5ueiH2FeneFe2h0hYuQeX5/e4iGhHaPgGdwbl9kXFhlWW1yYWBgcGxraIhuYXRpWV9kboB3qdqpx4aHsnGId2+MdHqFjX95kol/dHN0fXd/b3F/bYV0k4V4dGtgeoJ5iY9mcoRwZ3VuW219gJCTf4B4kZN+eXxuiniDk46GdpiMk5CIhoZ8f4VsdHV+bGd2ZG17dm1qd3d/f3xhYniGeml1dWN+fGh1h4+Nlnx1gXdxgHt9boBaV3V/cHaFiH+Bem2JhnR6bHaChIV/fH56fXSMgn50aHRlboqDbHNaaF1zZEdtbUtaYFdWVXdtYlBSdHZYUFZYXmFyhG9cYGNtZWReb2NUXHFGQmVeXWVnXVt7YlFWXHRbWmdrYFZqX2BvZmZrcWhwdniOdGuOjXZ/dnh+d4GEgXt0fYOIh4NvcoB0cXV+hYKJjYp6dn94g3t8hYd3h3x9gX6EgHt+cnV5jI2gjIl5iXZ0g3hefYWXi3iGg3OFhoR3iXpibm1cYltbYVZpc2NgW2ducGaHcWFxZlddY2t/fMrOh7mham1timxxg3F7g4l+epCEeXhzeHV0e2psdmOEdZGCdm9mX32CeouKZXKCa2pxY1hseoWbiIKBc5eUeH99b4pzhIyOiXSZkJKJhouDe3l9cXBvfGZocWJteHFqbHF4fX16XWV6gHhqdnhmg3dodYmMjpV9cohqb36BeW99XVlzf251gYx8gm9wioBxd2l4gYKBgnh+c3x1h317c2dzYW6LgGtxV2lcdltHbWpMVlVdU1V7a2FPVHVyUFFUV15jdIVpXWBsamZjWm9hWGJvR0FnXGBlXVxWe15OVWVwWVtqaF1XZ2BecmVqaHJocHN3hnhulYt0f3p4fnmDiH91cn+GhY6CcHB7eHd2eYaGh4yGeXt/dIt9fYaEg4d+fn59h398eHV4eJGTn3+MfIptdYB4ZIOGlYVzkYpvhYWBeoN0ZG5qWV9bXF1UZ3JkYFlkcXJngHJia2VXW2Bqf3i+rnuft25hc4Voc3pxeIGEen2Lfnd3cnZve3Zlam9hh3WOgHNqYl5+eHmLhGZxf2hra1pWb3eIooCEf3GZk3KBenaEb4OElIp1l4qOiYWJhX14dHFuaHhfamxgbXZqZ2pseXd6dlpnfXx5ZnN+bYV1ZXWHjYaWgHCMZ2t7hHVudWJdcX1sdX2MfIJndod+bnFpdoB5f4B0fm17fIJ7eXFmbGJuiX1sbFVpX3ZVSmlqTlFOZ0xYe2hhTlV1a0xRVFVfZ3aDZl5gcWhnYldqXVxrZ0pEalliY1ZZVXlZTVZtallda2RcWWVjXnRlbWRxZ3JwdYF4cZmGdn9+d398hYd9dXOCiICVgm5zeXt6c3OFh4mJg3iBfXWPfnyEio2DgYR7fouDe3Z7d3eanZh6iYKGaXZ8e2yDg5J/co6BcIWCf4J/cGdsZ1hdW1xbU2RwZF5XYnJ1anVvZWVjV1xbaH9wb3KAc4lkZHl9aXN1c3KBg3eAg3h2cnVtanpxYWdrZ4ZzjYNtZl1ffXB7iX9pbXhnamRVV3JvjKZ8hHt2lpF0fXR+fG9+fZOIeJt9iYeEh4N9dXBxbGd0XGxnXmx0ZGdlaXpve3JZaIF3dWhwgXiCd2J3hot8lYFvjGpte4JxZ3RmYW56aHN4i3x/Y3eEd2pscnV8cnt7dH9ogH+AeXdvZGZibYV7bGpVaGFvUkpoak9LTm9HXXpmYU1VdGRKT1NXYWt3fmZdZ3NpZmBWZFdicFxLS2pXY2FVVFVzVkxYdWRZXmtgW1pjZV92Z21icGl0b3J+dHSZgnd/gHiAf4aEen11goR/l4VucnR8enVxhIWPgYB6i3VzkH98gZWNgIWEfX2Mhnp9gHd7o6WKeYiFhGt0e3p1goCLem6Ec3mEfYKDdm9qaWVWXVtaWlNibmRbWGFze2pobWlgYlhfWml/aWtvgGdsYGh5eGpyc3Ntg4B6f3x1dG16aGp5al9lbmiBdo+EZ2VYYndqfod7b2pwZ2ZdVFhvZ42ndoB6fJCOenZxgHF1eHuRgXqXdoeDgIaIdmpydWdnbltsZF1tcl9nYWp4aHtsW26Dc3RqcIF+enhhd4aFeZGFdIlycHqBc2RyaV1xeGVydIl8eWN0gHFnanl1c215eHZ5ZYV8f3l3cWRkY217fGpqVGdhZVNKa2dPR1FqRWB3ZmFNU3JdSk1VWmVseHxmX25xaWRdVmFVbm5WSlNnV2VdWE1Va1RKW3lfW19rXV1aYmVgeWhsYW9vdm5wd3V6mH53f4F5gICHhnp5eoN+gZODcXR0fnp2dIWIkX2AfJBrcpWAe4KfhX6HfYB+hoKAint3hKuef3qHh4NrcoF5dYB+gHRuhm58gHOKgGpwbmRkWF9aWVpUYmpnW1pfdYJpXm1sXGFXXFxrgWVydH1paVxrdnVnc3ZxbIR7fXx4dXJseWdpeGZdZHNoeneSgWNjVGVwaIKFeHhnaWphV1ZZZ2OOp29+d4CLjntxcn9pe3F8jn14kHOFfoCAhm5kdXJkZ2dcamFdb29cZ19tdGV6aF10gG9ya3F8fnV2YnSGjHuJiIGBeXN1gHZicW5bcnRjcXOFfHVlc4BtYW17cGtqfHp2dGeHdnt6dnFlYmRtcn1pa1NnXVxUS3FiUEZVYEdidmZhS1NvWEpNWFhoa3Z7ZWVucWZkWldeWHdlVEpcYldnV1lIV2RQSGJ4Wl1fbFpeXGFjXn5pamBvdHhtcG52g5d6coCAfH+JjIZ9dXWGeIeMfHN1dYF5enqCjI59foSJaXOWgXqKnX5+hXqBen98holzcY+tjHt7ho99ZHGHeXN8enVyb4Zse35sj3pjcG9iZV1lVllZV2Nma19dXXOFaFhxblteWFpcbHticHd1bGFZbHNzZ3R1b2yDeH5/eHZtbnRkaHRlW2d1ZnZ2kXpfXVJmZmuDgnR+YmRqXFRXXWJjjqRpeHODhpF5bnF8anpvfYd9dop0gnl9eYBpZHZsYGZfXmlfXXRrWWVdb29iemVcd3xrbm5weHl0dWVzhJOAiIOJe3dwc390Y3hlXHFxYnFygn10Z3KAZV9ud2plaHp9dW9wg3Z0fXRyYl9mbW58ZGhTZ1dYU012X1BKWVdIYnRjYUlUbVNKTVpXamxyfGNtbXNjYlpaW2F3XFNLY11XaFNWRlhgTUdpdVheYGxbW19iYlyEaWhhbnh5bW9qdoGQeW2DfoCBk4iEgXZ0iXSMhnRxdnaBeH19foyQgH6TfnB3lYN8mJJ5gIB4en6AdIiEdHGZoXp6f4mUd2N1h3hzd3RrdG5+a3h8cJFzXnBuYGdibFRaWldoY21mW1xxiWVTcm5bWlhXYGx2Y2l1amleWW1zcGtzc3NphHx+fnp2bm5sZGlxY1tqcmR0do5zW1dTZWFygH9ygl1iY11TWmBcY5GfZXFxhYSSdWxse29wcnx+fXOCeIF0e3p7ZGV1Z11iWWBnW152aFdiXXBoYXdhW3x2aWpyb3h0c3VpcYKWhId/hXd0a3F+b2d4WF1sbmNydIF6dGdwflxgcHJiYGtzf21udn9zcXhrcWFcZWxsemBmUmVTVlFPdVtRT1hRSGNzYWBHVmpQSVBaVmtra31mbm9xYltaWFlscVdSUGZWVmhTVEVZW05IcnVYX2NsYlhgYGFdi2pjZG16eGxwaXV5h3trg31/hJp8g4R5fIdtj4dybnZ6fHSCgnyLj4OCl3R4gZOFgZ6JdYGAgXR/gnGIg3ZwoZZzeoaLhnpld4pubXpuZnhwemtzdnONa151bmFnZWtSXVtVZ2Fsa1pccYxkT29uXVZYVWdpc2hidGVkXFhtdGxvdXR4aoZ8f3uHdo9zY2RrbmFcbm1jc3iHa1pUVmNkeH19cYZdZF9jVFpfWWKVlWNtcIOFinRraXxwZ3V4dX1te3V2cHt/dl9mcmNbXVZhY1hhdWVVX2BtZGFxXV1+cGhpdHF0cXV3a22FlIKJfYdyc2dwf3J0cFRcZ2tmcnWBd3RjbXZWY3JsW19wZ35mbnh+c3Rza25hWmRpandeZVNjVFVQU2xWUFZSUEdkcl9hRlhpTklYVFduaWV9aWx4a2JXXVVbdGRTUldoUVhmVFNHWVlPTXh2W19la2lZYWBeXo5uYmZreXVub2l2doB/bIOAfYeYe4CHgYl+a5OIcmZ0gHt1gIN9iY9/i5NyfIqRhYefhnt/hoxzgYZzfoJ2bqSLcoCNi3Z3bHqMYGR7cGZ5c3hsbXF3g2dkfG1jZmdoU19eVWdfbG5bXm6NaE5pbWBUVlNvZ3NrZXhkZFxYb3NscXp3cmyHe392m3p5a2FlbG1eYG9qZXB4fmdaVlhgbHh8e3CEX2NfZ1ZYX1djm4hia3CBh314bGx6bl14c258a3Z0b3B8gXNYam5eWFxVYWJXZHBjU15iaWFibFphfmxmbHR2b213d2xpho2AinuJbnJmcn5udG5kW2FpaXB0gXRzXmltU2VxZVZjb2R8ZHN4fXdscG1rYFlhZmd0XGRVYFVSTldkUk9bTk9IZG9cYkdZaU1KX0tZbWRgeWlufmRgVV9UXXVcU1JgZk5cYFVSSVtYUFl0dV1fZWtoWGJhW16NcWNnanhxc25odnR7hHKCg3qIjn58iYeNeW6QiXRrc4F0f3+IhYeRhJWPeX2MjoeRm4SAfIyFc3+Bc3R4cm+Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2Njo6Ojo6NjIyMjIyMjY6Ojo2Ojo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6Ojo6Ojo6Ojo2MjIyMjIyNjo6Ojo6Njo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmaFxDREREREFSzNrY2NjY3W09REREREU4Li8vLy8rSIWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19hUjQ1NTU1MkbY6ufn5+ftZy41NTU1NyccHR0dHRg6g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmJiZmZKPkJCQkJCMh4eHh4eHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmIhYWFhYWFhpOUlJWVlJWKhYWFhYWFhIODg4KCgoSKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l6ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQj5CQkIuOkZGJh46KkJKSk4+OjY2Oh4+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2Njo2Njo6Ojo6Ni4uLi4uMi42Ojo6Ojo6Ojo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJCQh4iHh4uGiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkI2EiIaGjoWMj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCRiYOFhoeMiYmPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yOiYaGhoiGiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjZCOjYuKjImOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gIGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f39/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn5+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX1/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f39/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX1/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYWEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX5/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhYWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh8e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f35/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ1dHZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaWhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fX59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent9fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5OTs7OkA7Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fyd3l5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo6Ozg5Ojg3Ojw5Nzg7Oz49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VzcXN4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw5Nzk6Ojk4ODo6Nzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PTw+Pz08PTs6PD09PTw8PDw7Ozo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXV1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NDQD48PT9APz89Oz49PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXp7e31+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRUQ/PTs8QD46Ozo6OTc6PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fX5/fn59fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQD08PTs+PTo6Ojw6ODk4ODo7PUA/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRUhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0A/Pj9APT8/Pjw+QD89PT0/PT0+Q0Q/Ozw9PkA9PT9BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENEQT9AQEA/PUA+PD0/P0BAQENAQD9AQD49PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkJDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAQUA+Oz48Pz08Oj49P0JCRUA/P05hX0pAQ0VJSUlJTE1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUZGRkpOTUtKSUdHSEtMSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x7e3x+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QERFRD88QUNEQj8+QT9BREREQ1d1homKflhHSEpMTE5PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFub3BxcnZ2eXt7e3p9fX5+fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkhJR0hISUdGQkRGRERDQVV0h4mHh4aIgldJTE1MTU1MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMS0pLTUpLSEhGRkdGRVBshIeGhoaHh4iHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pz9ERkhERUdJS0lJR0hJR0lJSUpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3R2eHl7e3t8fH1+fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0tLS0tNTEtNTElGSlZsgYaFhISGhoaHiIaKdUlJRkI/P0A/Pz48PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRURCQ0ZISUhISExNS0dJSk1NTk1KSktLSkxNU2xvcnRzc3d5ent7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f4B+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhHSUhLTE9OTlFOUV5ygYWDhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5BOzk5OT09Pjs7PUFDRUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn9+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQEJGSEtITEtOVGd7hISDgoOEhomKi4uLiomKi4yJVDs4NjU2NzY2NjQ2NzYzNDY4Ojg3NjU2NTY3Nzc3ODo3Nzc4Ojs3Njg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUE9SVGVwcXN0dHd5e3x7fH1+f35/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PERCREZDQ1Z4hISCgoOChYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2Nzc5OTc2Njc2NTo6Ozo6PDg5ODk5ODc3Ojo6ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PUFFXa3JydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc6QTk8R1JgfISDg4SEhIaJioqIh4iIiYqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7PD06Pjw6PDs8Ozw8Ojo8ODo6Ozs5OTk8Pzw9QUJESUpNS0pLTFdvcnR1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTk5OTo+PT5Pd4GCg4SEhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUJBQUI+QENBQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQUA/P0E8Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQkFHSk5PTElHSzo4Ojs5Ojo7PDo6Ojw7PT5APk59goOEg4WEhomJiIeGhoaHiImKi4uKioqLiotePkRHSUtKSkZHR0RGSEdFQ0FAQ0VDQkBCQ0I/QERIRUNFREVFQUZFRkRGRkRAQj49QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp7fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6PTo8Oj09Pj47Pjw/PkI/TH6DhIWGhoaIiYiIh4aGhoeJioqLjI2MjIuKiodXR0xMTUtOSUlLSElKSklGRERGR0ZEQ0VGREJISUtHSEdGR0dFS0pMSUtLSkNGQ0NEQkFBQ0JEQ0NERENBPTw+QGhwc3R0dnd6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5Nzs+Ozw6PT8+Pzw/PkJBRD5ng4KFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUpIS0dFR0hISUVFSEZGRUxMTUlKR0dISUpOTU9NTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbXB0dXZ4eXl5fHx8fX1+fn9/fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDo7PDo9Pzw9PT9AQ0JIU36DhISFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExMTEpJSEZKSkVKSEdLSkhKR0dHS0xOTExISElKTVBOT05MT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1VvcXV2eHp7eHh6enx8fX5+f39+fn1+fX5+fn5/f36Af39/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo7Nzw9Ojw/PDw9P0JDQ0xthIOEhIWFhoeIiIiIiIeGiIiIiIiJjIyLjIyLi4uLi15SUlBNTk1LSkdGQ0hKR0xKR0tPTEtKSkxNTE9QTkhJS0xPUVBQUU9PSklKSkxKTEZHSEdGR0lGRUVCQEJCXHByd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgIB+f39VRUNFRUdHRUQ7P0E7PTw4Pz09PkBFRD1CRENGSnSGg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pFRkZLT05PV1ZRUE9RU1JNU1RPTVNMUFNVV1JTUlBMS01NTUtOR0dKRkZJSkRERUVCRENjcXV5eXp6ent6e3p7fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PTxBP0FBRFRLQkhJRklLeIaDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7O1FTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tHSEpIRUZJSUlISWpzdnl5enl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQEVBQ0ZEQ0RLVlBKT09OUFF5hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD9AVlVZXGRgVllicl5dVl1aVkVRWVpcWV9UWWdSVVZYVFRWU09PTUtMSklJTE1LT01Tb3R2eHl4d3l6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Afn9+fn5WSkpJSEdGRERCQT9ITElNUEtJSk9TUVBUVlVXVXaFhIWFhYWGh4iHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUldWVFpadYNZVX2QYVxYXV5XSVZeXltbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eXh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0pJSUZCREBBOk9RUVdYUFBQUVJTUlZXV1hYbYGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpaWFxoYkdPWmlnXVtcXV1XU05TUFBRVlZWVllab3N1d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWlpSU1FPUVJRVVJVU1ZfdXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVVNUXlpYV1dXemtYWlxcXlNQUFBJTk9XVlhbWmRxdHZ2dHR2eHl5e3t8fH19fn99fn1+fX1+f39/f4CAf3+Afn56eHd2c3V7f3+AgHRrfn5rcXleW1ZVU1JPS0ZDREFNXoNsVlJTT09RT1FWUVNSUlRjZHaAg4KDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JRUU5LUlVSTU9ZUU1OUVNVVU1RU1JQTkxMSENJR1JTVFpdbXJ2dnV0dHd7enp7e317fX19fn19fX59fn9/f39/gH99fX5+f39/f4B+e3Zzd31+fmR1fWlxdGBkXV5bWVVRTElMSWFsknRQUVNNUVJQU1tSU1JRUlVVYnN7fH6AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkJCQ0NBP0RQQ0NAQz5CSEdWQElOTUddaVFIRk9GREVGSEdIQkNIR0hKR0RCQUNATlBNUmR0dXZ1c3R2eXx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmhlZWJcWFNRUFVSc1dlW09PTkxRUlBVWVNVUVFUUk9WYGtsc3Z6e3h5dHJuc3RzeXh+foOAg4OCgYKAgoGBa0xHPj46Oj5APz4+PmpQS2FFRkhJRUI/SE1NR01RVUpCRT8+PD08PT0/PT9BQ0I/Pzw9Qj5JTUZVb3V1dnR0dnh6fHp9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpPUE5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG5qaGBucmltbHF1e3p9e3h6fHx4d3hkQkBAQTw6QkNBQUNBW1xPe05PT05LTE1PT1BMS0xXTkhHQUE8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXZ2dXZ3eXx8fH18fHx9fn18fX19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PT15cWklHT1FRT01QUU5RUlNWWFNSWVROWVpbV1lcX15fZV9dXnF3a15gZ2t3b29sam9ubmxmYllHRkZIQkFGSEVFRkNMUU9hV1JYUVBTU1JVW09PUVdQTUpERj46OTY1ODc5Nzk6MzY1Nzk1PEI9ZnR1d3h3enl7fX18fHt8fX1+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtTVFNQUVVPTFJTVFdYU1RYUUxYWVlWWFhWWFldV1hYaHNrXVZgdGthYV9dZGBfXllVUE1PTUxJR0pLSUhGQ1BPU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU5OUducnV5eXp7e319fX18e318fX5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFdWVlNUVk9PVVZXWFlTVVRMS1NVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk1NTEpGUFBVWVNUT0pOT1VTVFxWUlVTU09NTElISEY/Pj06Nzg3NjU5OTY3NTY1V3FxdHh6ent8fX19fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVFNWVFJYV1lZWVJVT0lHT1BPT01SSk9QT09OTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUE9OTk1QTlRSUFJMSUxLT1JQUVJTVFFTT0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdWUVNGRkFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I9M0A+am9hUlJRQEdUUU9QUFFOUU9QT0xKTExPUE5NUFFRTlBPSkxNTUtHRUVDQjs9PTw5PUc2Njc2RG5xdXd6e3t8fH18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZVWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkI4RE1TXWdTUVNBR1VQT1FRUE1NTkxKTEtMTk9PUUxOTk1JTUxJS0tMS0dGRkVEPEFBPjtARTs8ODlUcnN1eXt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT49PUBAQj0+RUhGREZGSUdKSkBGQUFARUdESU9IUVJhXFFQUk9TTk9PTExPTUtNTE1PTltWS01RT0hKSENJSkxMS0ZGRkU/QkM+PUJHP0I/QGRydXd7ent7fHt6end8d3l9fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPzs+QUBAPkFESUVDSEdJR0lFQkI/PjxCQUBHSkVNT2JlUE1PTVdLTE5LS01NTExLTk5TZE1KTFJJSUlFQklKTE1OSkdJRkJCQkA/RUZFSERMb3B2enl5ent6fHp3dHh0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTExJTVBNUE9IS0U/Qj05OTk6P0I/PEFCQUFEREdLRkRJSUdHSENDP0I+Pz9APkNFRExNUVRMSklNVEZJSUpMSUpLSUpMTU9QUVBLR0NLR0NDS0pMTk9OSUpJR0NDQ0RJSk1MSVpzbnh5eHp6e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhlcUhKQ0ZHSEdKS0lKTERHQjw+PTo6OjtBQj89QkJDQ0hFSkxKRUlJRkdIQ0M7QUBCPkA/QkRESU1PR0hKR0hLREhJS01ISkxISUpMSk1dUkhJRE5HQkVMS05OUU5LTUpLRkdHSk1OUk5NY25qd3Z3e3l7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGVwRkpDRkVGREVFRkVHQ0NAPTw9Ojs6O0FEQD9CQ0VFSUZKSkxGSUlHRkZEQjpBQ0M+P0NDQ0RHS05ISk5IREhFSUxOTUhJTEdGRklJTE5LSUhFT0lDR05NUE5QTk5PTUtJSElPU1FSTlNnZ2Zyb3N4dnt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1mX3BHSkNFRURCQkFFQERCPj8+Ozs7PTs9P0RCP0FDRkdLR0pJTEhHR0dGRUM/PURFQj5BQ0JDRUdISUdNUElGRkdLTk9LRkhJRkVDRElJSEtJR0hQS0RKTU1RTk9OT1BOSkpJTVJVVVJQWGVhYW1mcHJvcnl6Z2VoaGNpbGZxbGZsbWdpa2xzbXB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRURGQkFAQUQ8QkE+QT06Oj0/Oz4/QUI/QEJFR0pGSUdJR0ZGRkRDQkFBRUZDQkJCREVFR0dIRkxQTElPSkpMS0lGSEVGRUNDSEhIS0pHS1JNQ09PTlFPT09OT09LS0tQVVdWVlRZYF9daWBtaW5ocnNiZWZmZGhoZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dXZ2dnd2d3Z2dHd1a3N1bnV0c3Bya2tzTUdHRUdBQUBDRDxBQUBDPDg6PT46Pz1AQkBAQERGSEVIRkZIRkVFRENFQkRJRkNHRUFFR0VGRkdFSk1LSFFNSktISElFRkhIRUNJSUpLTUtQU05EUlNRUVJOT01PUE1MTlNXVldZVlheWl1kYGhjamlna19kZWZjaGdna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEFBQkVFPEBDQkQ8Nzo9Pjs+O0FCPj8/Q0VGREZEREdFQ0VDREZGRkpFRUlHQkdIRkdGRUNGSkpHTUtMS0hKS0ZJSEpIREtLTExOT1JUT0hUVVRRVFBRTU5RTk1RV1pWWllXWl5aWGFgYGBeaGVjYGRlZ2dqaGhqZ2hubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3NzeU1ISEdJQ0FDR0U8QEVCRDw4Oj4+Pjw8QkI9QD5BQkZDRUNDR0RDRERGR0dHSUZISkhDSUhHSUdGREhLSUZLSE1LSktLSEtKTUtJTkxOTk9SVVZPTFZWVFFUUlJMT1FQT1RZWllcWlpcX19dX2NeXGJkbGNgZGdocoVoZ2pmam5ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0lLSEpFQkRHRT1BR0REQDk8PkA/Pj9DQjxAPkFBR0NFRENIREVERkZISEZIR0lLSkVKSEhKSEZGTEhISEpHTExMTExJTUpNTk1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXV5gYGFgYmZdZGBmaGBlaGpkc3NmamhmbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3cHdJSkxJS0dCRURFPEFGRERCOz8/QUBAQERBQEI+QUNIQkVERkdFSEVGRUlIRklISkxISEpKSUtKRkpLSElKSkdLS01MSUlMS01OTk9MT1BSVVdWTU5UVlVTUlFQTU5UU1JXW15eX11eYGBhYWJgY2RlYWRpY2Rpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXVzcHN3dHV1d3Z1dXRlcXNrcHFqcnZwd0pMS0tMR0NDQUU8P0VFRUM9QUFDQkJDRUFDREFBRUdDSEZIRkVJRkNHSkdHSkZJTEhJSk1LTUxHS0lIS0tOUUtSUUxTTUpNTU5QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmFjXmBmY2FiZ25pY2loaG14dm1oaW5vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2c3FxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHREFARD49REVGQz9DQUVEREZDQkVHQ0NJRkJISklHSEpGREtKR0hKSUlLR0pKTktOTElMSEpNS1pmSmRcS2xSR05NX25VbHNbcXBid2NSUGJ2dWh1Y2F2YVhucWJkdmluemZcbHVgbGtWYHd1aGpoaGZnbG1qbW9qbW9zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVycXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPzxERUZEQ0NDRUVERkJFRkdEREtFRUpMS0lLTEdHTklISktHS0pJSkpOTE1NTExJTUxMW3NiZHBebGxVTE5lcl1nZXFsbnRncGlfYVlubWJwcGJrampnb3F0ZXRublxwdmdwTkxyeXZrYWFrZWVseG1rdmxub3NycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QUE/PUJFRkJGQ0VERUVEQ0hIR0RES0hHS01NSkxMRkpPSEpLSklMSkpJSk1NTk1NTUtOTU1bcnBvbnBwbGtNT1BtWE5pYnRycGFtb3ZcWWxQW21tWnFta29teHh0c2lwXWBzbHFqVXV5eG9jXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHR0VFRUJBQj0/P0VHQkdESEVFREJGSUhIRUdLSkdNTE5KTE1HTE5JTUtISk1JSklKSk5PTk5NTE5NTFxoZHVdbHFXbE1PUW5VWmtea2x2YWxkdFRlY05sWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2hhY2l0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJRUVEQ0FCPEJAQkZDR0ZLR0VDQ0hLSEhGSUxLRk1LS1JSTEhNTUlOSklITkdKSkhJTk9NTkxKTU1KWnRwcG9xcW1sT1FSbllza2dvb3Fxb210Xm5YYXRfbm9wb3Fyb291c3R0alpedGN3eHJqbnpoYWFjZmFiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dElLSEpDRERFQEA+Q0NBRkNISU1IRkNGSkxJR0ZKTUxGT0pKV1JLR0tKSk5JSUpMSUtKSUlLTE1NTElLS0tTa2JZaV5famNyclpfWWpvX2VlVWtfZFthYlFgbWhcalxuaWlkW29lZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSkRFQ0ZBQEFFRENGQkhKTEdGREdLTElFRkpPTElPSkxbUUpGSEhLTUlISkpLS0lISUdLS0tLR0hLSkxLTEpJS0xOVFtdVFBVTVFPTk9PVVJQUFFPT1FKSk5QUWRxaVRZVltbXFVZWl1YXVxcY2ZhYWZiY2ZfXmZrbWhtdHhydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNHQ0VHRkZARUM/Q0dERUdDSUtMSEZER0tMSERHSVBLTE9LTFdNSUZFSElKSElLSExKSUZISEpISEhFRkxISEpOS0hPXFdeT1xcYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXGFYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTUJDREJESUVHR0ZLSktIRUVKSkpGREdIUEpMTUpNUklIRUFIRkpJS0tJTEpJR0VKSEVGR0VFSkdCSU1JSlRfWWBYYGFbYFVYWVRdXlpfUllcUF5cWU5fXF5TW15kXlpdYGNfWV9iW2BeW1VZWFpfXmNjYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3V5eXp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRUNCQ0ZHRUdHSUpKSUhERktKSkVFSElOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlGQ0RFQkZKRD9JS0hOW2NZXl5hX1JUU1dfX1xdWV5RWVxNVl9XS1FZW1FbX2JhXV5jYWBiYmJjY2VaUllWV11aXmRgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGREdFQkVHSEZHSElGR0pHSEZIS0lLRENLSk1NTExISkpISkc/R0ZOS0tLTUtLS0lHSUVFQERBSElBPkhJRk9dYVpbZF1fVFFSWF1cXFxfW0tXXExSXFlJTV5RUV1fYmNjY2NiXGRjYmRjZVhSV1VUXVlbYV9eX2FhX2Rsa21qa2xudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRUtJRkdHSUdHSkZGRklMSk5FQ0tKTE5KTElLSklJR0JISFFNS0tPTUtLSUhIRkU/RUJISEFARkVDVF1ZXlhfWV9bXVVYWFBdXVFLSlZeWF5bXVZaYVJSX19iYmBgYmJfY2JiZGRiWFBSUlNcVFxdXV5eX19fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHR0RGTVJIRFJLRkhISERGS0lNUEVHSUpLTkxMSUxLSklHREhLUU9NTFBNTEtLSUpERUFFQ0hGQUFGREFWVUVcVF5TVl9YTlRVTlpbTUpLVGBhW19YX15iXU9ZYlxgYF9iY2FdYmJXYF9UUVBRUllTXlxbXV5fYGFmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZIRElTY1FFV19JR0dIREZNSlBQRklJSktOTExLTUtKSkdFSU5RUU5PUE1OTU5JTEJEQUNDRkRDQUNEQExIQ0xMUE9OTEZNRkZISUhHTExNT1BJTE9QUFNQTFFTUlVaWFdZV1djVk5SVFBRUE9RVVRcWVlbXl5hYWVmY2hkbG1xc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES05eTUhIWU1HSEpIR01MUVFJS0pLS05NVU5PS0tMR0dLUFRTTlBQTk9PT0hMRmBFRF5MRGZjQ0xbSF5cc21PTVZtWUxDT19UbFdnSl1XVV5ETVFVTE1TVlFSVFhWVFhUVFxUT2VaaGhlWlVrVFhXVVtcXGBgYWJiYmBnaWdubGhyenx9foGEhISDg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLUFRKS0dgVEhKT0pJT01SUUtNS0xPUlVST1BKTE5HSE1RW1lPUFBOUFFQSktRf1FJfFlZcnNXUG1HcW5vYVZQcXF0T0Jqc25xdHBTb19bblhdVlxYVWtoVV1WY1lgWVpeVVVXf2l0dXVfYXZfWWJcXGZbX2FhYWJeYGNnbW9sYHB3dHiBgYKDhIJ/fX6Adnh6bXZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0pMRlJWTEtPSExSWFdRTk9PTFFUTk9RUEtMT0dNUFNbWlRRUk9QUFBLSVp4XVR4ZGhYUlNQdmZ0bHBibmZrUnJOTHdtanJwc3JxcnBvb4BdZXp1eHFxenF+cn1rdX1hUmh8ZXNzb3NzfH1wfnhvf3JgYGBiYlthYWhsbmtibGZnbXd+gYCDfnt4d4B0dnpocn5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FFTU1IS0tISlFPTU5KTlZeWVVMUVNOWVlMU1JSTkxQSVFSVFlXV1BUUFBRUktIZ3hsY3hxbVpKTFR5cHVtdWJudlBkZEhldnFtd2+AamZ4eGlXclFoem1panp6fWx4en9waG5YdXVqdnVwgGFzaH1pbHh8b19fX2NiXF9kZWdqamVoYmNkbGxwcHN0c3NzeXFyeGJsdGdyeXtzc3V5foFzdnpufH15eHJuTUpSdE5DQkVQUUhLTEpMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBKU1RVWFdXUFVQT05SSktyb3V1cXVxY2hgVW5LcXBeR2h5V3ZUS2h4fXdgeXtzbmFdbW9kU2dydW5teXB3bHZzdHFsbVxzfnprbXl8bHVufGxxdnV4Xl9fYl9dX2VkaWdoZmVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21LS1pWSEdFR1JRS01OTExRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTkpUVFZXWVdPU09PTlFJUm1IaXdLYGR2dlRWbE5ubHtyYWpnf3VUS1ZrZ3xsbWx4X1pwentfYHpzY3JveHFoZHxpcntdVEtrX3Z1bGp2fHttfnlrfHBdXl5iW19iZGVnZmZlY1tjY2lra3JzcndnbWloZGdgYWxhZ3NybGdsbXJ8a21oa3t0bW1rbU9HSktISkhIUlFNT1BMTFNTUk9TUlhSV1RQV1pWVlRUVGFgUU9OS1RTU1FWVk9PTU5PUUpIUU1PVUxLS1JTUlFST1ZVUVFPUlJYWFBNT1VUV1hYW1tVUVJXW1dYV1tPUlRXV1hRXVhWXFVUT1hSV1dYWVpgXGdyX1tbW11dX2NaX2NjZWdkZGRjWmRiZ2ZmbW5tdWZmZ2NgZl5dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUElLS0xNS0pUUk5SUVBMVlZUUFRVWFVaVlJbXVZVVFdVWVhPT0xOV1RQTlVTTlBOTFFQS0lRUUtRTUpKT1FUUVBRU1JKSE1PUFFSUFBQVFZSWFdcV1NSUFFVVVVTWlFOUlFXVVNZVlRYVFNRVFNVVVlZWF5aX2FdXFtaXFxgY1xdYmNkZ2VlZWJZYGFjYWJoaGpuY2FkXl9jXVpjXGJtYV5mZmdtc2RpaGtrZWRjZmhRSktLTk9MTVRRT1RRUk1YV1VUVlhXV1pWU1xgVldWWVVYVFFQS09YU1BOVVBOUU5MU1BNTlVTTlFOTU5RU1BUUFJUVE5LTU9SVFRRUVFVV1VZWltaU1VSVFhXVllcU09TVFdVVFlVVlhUUlFXVVZYXFpcYF1XWV9dXl1cXWBhXltiYmNoZ2ZlYlhgYGJdYGhlZ2VhXl9dXV5aWl9aX2dgXl5dY2hrYWhmaGZkYGJkYlBLTUxQUUxPVFBQVFFPUVpZWFdZWlpYWVZdamRWWFlaV1ZTVE9LT1ZUUE9UUFBRTk1SUU9RWFRRUU9NT1JUTldRU1RVT05OUVRWVVJTUlRYVlpdXFpWVlFSV1hVW1tWUFNVVVVWWFNXV1RSUVhWVltfW15gX1ZfXV5gXVxgX19fWmJjZWhoZWViWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNVUU9WXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1OV1NNTVJPUVJPTVBTUVVaVVRQUExQV1VRVlJTUlhNT1BSVVhVVFRTVFlYW15dXFtWUk9VVlVbW1ZRU1ZUVlhUU1haU1JRWVdXXV9bYGBgVmJcYGFdYGJfXGBdY2FjaGllZmBaY2BhX19lZV9gY1taXFtcWlpZWVdcWlxbYF5gW15eYWBfY1xZYFpRTk9OVlFQVVNQVVRTUFdcXFxZXlxfV1xeanB3eYBjXFtWVllSTlBXU05RUVBSVFJMUVRTWVtXVU9STlNYVVNRVFFSWU9RU1NWW1VWVlNWWlhdXlxcXlZTTlRWVltbVVFUVFVXWFJTWVxUUlJcWFpdXl1iYWBXYltjYl5hY19cYmFiX2RnaWVnXVxkYGFgYWNkX2JfWVpfW1xbWFhZV1daWlphXV1bXVxcWl1gV1tbWlBPT09ZUFVVU1JYU1RQW11eXVxgXGBVXFxoanJ9c2xoXFVZV1FPUltTUlFUUlRVVEtSVlVaWlpTT1NRVVVUUk5VUVJaUlRVVFhdV1hYU1hcWF5dWVpdVVVOVlZXXlpYUVRUV1hYU1ZZXFRSVl1ZXV1hXmNjX1lgW2ViX2RkXl5jY2FeZWZpZWZeXmRhYWFiY2RfYl5YW19bXFtYWFhYV1taW2BdW1tcW1haW15WXlldUE9PUlpQWlVWV1ZUVFReXmBfXmJdYFVdXmJreXVtfWxaVVpWUVFUXFRUVFVUVllXTFJaVlxaXFJQVVNXVVVST1dRU1dTV1VWW15YW1lVWl5YX15ZXFlSV1JZWFlfWVlSVFVZWVlVV1lcVVRaXV1eYWJgZWRdXl1dZWFiZmReX2RjYFxnZWhmZGJgZWFfYWFiYl9gXldZXlpcXFpZWVdWXVpdXltaW1xbV1lcXVZYV11TT1BXWVFdVVZZV1dVWF9gYWFgY11gVV1eYmVldoJ7aFhZWlRWVFZcWFdXVlZXXVhPVVxZXl1dVFNYU1dVVFJTV1FTVlRYWFheXlhdW1VdX1hfX1hcVlFZVFlaWmFYW1RWWFtZWlhZWVpXVl1fYF9kY2JlZV5iXGBmYmRmZF9gZGJhW2ZjaGZkZmFmX19hYmFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOVFpXVFxVV1dZV1ZcYGFhY2FjX19WW2BkYV96dW9oWlxaVlhWWFtaWVtZWFlgVk9UXVtgYVxVVVlQVFZUUlZVUVNVV1tbXF9fWl9cVl9fWV1eWV5WU1lXWVlcYlldVVZaXFpbWlpZWlhZX19gYGRjZGVlY2RaYmZjZ2ZlXmFiYGNdYmNpZWRoX2deYmJjYWFgXl9YVFpaWltbWFxYWFxbWltXV1pYV1xbXGBdVl1dU09WWlZWWlZZVlhXWF1fYmFkYWRhXllZYWRiYGtmaF5cXVtXV1laXFxcX1tZW2JWU1deXWFjXFNWWVBWVVVVVlVTVVRYXV1fYGBdYV1XYV5bXlxbXlhWWFdbWl9fW15XWFxcXF1dW1pcV1pfYV5gZWRkZmZnY1ljZmVoZ2ReY2BfZWNdZmlkZWlfZ15jYmNhYWBfX1tYWVtZWllYWlhXW1taW1dYWlRaXVxbYFxVXmJNUldZVldaWVtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX11dXVhXW1tdXV9fXFpdY1hZWF1gY2RfUlhZUFdVV1hXVlZXVl1dXmFiYV9iXllhXV1eWVxdWVhVVltbYF5cX1lZXl1eXmBcWlpZW19iX2JlZGVmZ2hjWmVmZ2lnY19jXmBmZVppaWNmaWNmX2JiY2FgYF9dXVpYW1lZWFhaWVdaW1pZV1lWVVtdXV1gYGJieEtXV1xZV11cXF1aV1xdX2BiZGJjYV1gWGJjYmBjYWNeXF1cWFdbXF9dYF9dW2BkXFxYWmJlY2FSXFlPWFZZW1lZV1paYF5hYmNgYWNfXGJdX11bXl1ZWVRYXVxfX15fW1peXmBiYltbV1tdYGJiY2VkZ2ZmZ2VdZWdoaWZjYWJcY2dgXGlpY2hpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldXWFBYWl1hY2Zmcmt/SllXXVtaX11cXlxZXVteX2JjYmFhXWJbYmRiYGNiYl1cW1pXWGpxYFxgX11cYWNfXllZY2VkYlRfWlFZV1xdXFtZW1tjYGNjY2BiZGFgY15gXF5eXlpYVVteXFxhYV9dW2BhYmZiXltTXF9gY2RkZmVnZ2ZmZmBmZ2hoZ2RkYFtmZ15haGhjaWhmY2BiYGNiX19fXV1bWltZWFhYVlpXXFtaVlZVTFhYXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIh4mHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2d3d2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5e3t7e3t7e3t8e3t7e3x7fHx7e3t7e3t6ent7e3x8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb3Bwen59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT1r2GiYmJiYqHc3FycnJycYOKiYmJiYqMjY2Njo6OiX9/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb296gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OToyomMjIyMjIlyb29vb29uhY2MjIyMjI6Qj4+QkJCLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dXZ3d3d3d3d4eXl5enl6eG9wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4SBfHx8fHx8fHp6enp5eXl7fXx8fHx8fH19fX5+fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl3dnZ6e3h7eHd2dnh5enp6fnl5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3d3fHx9fHp9e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3d3l+fH19eX16eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p8eXd3e359fHx6e3p3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt5enp4e319fHt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgX+AgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXd4enp6ent4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgoKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYKBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICBgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgoKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoKAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx9fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLioqLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhYKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhYSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dHd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4iKhoaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKiouPj42Lh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKCgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4OBgYKEhIKDgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBgoOBgIKDgYKFhYWFhoaHhoWGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqHgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SEg4KDhYOCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46QkY+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDg4OBg4SFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYOCgoGCgYKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiYeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5+f4CBgYGCgYCBgoGCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgYGCgoSCgoOEgoOEhYWEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKRkZGOjYyHhYODg4GCgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgoCDgoOFhYODg4SDhIODhISFhISEgoGAgYKDgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYWFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj42MioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAgIKBgYCBgYCAgoGCgoKBgYKCgYCCgoKCgoKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJOSlJKPjYuHhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4CAf4B/gIGAgH+BgYGBg4GAgYGChIOBgYGBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgYCAg4KCg4KBgoKDg4OEgoODg4KAgICCgoKCgoKCg4ODgoODhIKCgoODg4KDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOEg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYSDhIWDg4SFhIKCgoOCgoSCgYKGhYOFg4OEhISGhYSEhYJ/fX19foKEg4ODg4ODg4ODhISEg4KEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSGhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyLiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4SDg4OEhYOCg4SFhYaFhoaFhoeHhoOBfn9+fn5+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhoaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgoKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODg4WFhYWHh4WFh4WBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaHh4aGhYSDhIWFhoSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gIGAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4OEg4OChIWEhYeHhYSCgH9/f39/gH9/f4B/f4WFhoeIiIeHh4eIiIiHiIiIhoaHiIiJiYmIh4aHh4eIiIaHhoeHhoeFhIOEhYaGhYWFhoaGh4eFhoeGh4aHh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4eFg4OFhIODg4KEhISEhYSBgIGCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiouLioqIiIeIiIiHh4iHh4iGh4aEg4OFh4eHhoWFhISEhYWEhYWGhISEhYWFhoWGhYOJlJOQjpGOioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4eEhIWEg4OFg4WEg4OCgYKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiYqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYSEhYSDgoKCgoKDgX59fn5+fn5+fXx+fX19g4eJioqHh4WGh4eHh4iHiImHiIaIh4eJiISDhIOFhISFhYaIh4aFg4KChIWHhoeGhoSCgoOEgoOEhYKBgoGBgYODhIOEkZKRjo+Ni4eEhoaDgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYaIi4qGhYaEgoaFgYSFg4ODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYKDhIWFhYODhYSEhISFhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFhoeIh4aAgYGFg4OEhYSHiIWDgYCAgX+BjIaDg4ODgoKAfX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4OAf4CAgYOCgICAgIGBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGjJORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn9+fH+Hg4OCg4KDgX19fn+AgIGAfn19fX1+fXx6enp/goKAf39/f35/f4B+fYB/f4CAgX+AgIF/f3+BgX99fX+AgX9/fn+AgH+AgICBf4CCgICCgoGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIF/fH19fn19foCAfn1+fXt9foGDg4KCgYF/fX1+foCAgH9+fX19fHt7e3p6eXqAgH9+f35+fn1+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fn6Af4B/foB9fX+BhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXt/f35/f39+fX5/f4CAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/f4B/f35/foCAf36Af39+fn5/f35+f318fH2FkpKNjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgH9/foCBhIOCgoGDhISDhICBgICBgIGAgYKCg4GAgX+AgoODgYGBgYCAfX19fn5+f359fX19fXx8fHt6enl5eX2Af4CBgYF/f4GAf4F/gICAgYGCgoB+gH5/fn5+foGAgoF/f39/gIB/f39/gYB+f3+Afn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISDgYODg4KCgoGCgX5+fX19fn6AfX19fX19fX18e3p5eXl5eYCCgoKFg4CCg4GAgoCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDgoKCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGhoWFhoGAg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIeIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4eHhoeHf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYWEhYOCg4OCg4OCgoKCg4OCgpKQi4iIh4iHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CBgH9/fn1/fn+Bf4CCgYWFhYaGh4eGh4eIhoeHh4aHh4d/fH18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZaEg4OEhJSTgIGBf39/fn6Ei4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko6LiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgICAgIGAgICAf39/f4CAgICAgIGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhISGhX98fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fH+Cg4GCgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX99f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4uKioyJiYmHhYaFg4OCgYKCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCg4SDgoOCgoWGhISFhYSGhIOEg4KBgYOBf319fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBgIKCgIODhISEhISChIOEhYKEkZGNi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgoKDhYODhYWFhYODg4SCgYODgoOCgoGAgIB/gX5+fn59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+f36Agnx8f3+BgIKAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uTj4uLjY6NiIiHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f39/gHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIGBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fX19fHx9gH+AgH6Afn6ClJGLjI2Nj4qFhoaFhISFg4ODgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fYCAgHh+gXd7gIF/gYKCgoKDhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt8fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dh399fH6AgIGAf39+fX19fX57e31/f3+AfX9+gIyRjYuMjY2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f35/gIB/gIB/f319fHx9fn18fX19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1+f399foB+fn6EkoyMi46Mi4qGhIaEhIODg4OCg4KDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+AhIOCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9fHp7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIqPjIqKjIuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+AgIGBgH99gH9/fn9+fn9/f3yCfn59fX17e319fHp8fH6AgoB/gIB8fH18fHx8fH18fXt/fnt7e3x8fH18e3t7e3x8enp9en6Cf4GDhIKBgoGFhoWFhoaHhYKEkY6MiomKh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/fn5/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn1/fnx8fHx8fHx+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7e317fX5+f4CAg4eJiYmKiYqJhYiRjYuHiIaFhYOCgoOEhIODgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gX9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX19fX18fXx9fX1+fH17fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6DhYiHiIqLi4qJjJCNjIiIhoWEg4KCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImNj4yKiIiFhISDgYKCgoKDgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKBgICBg4KAf4F/fX6Afnx/f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX5+fX5/fX19e3x9fnx8e3x9enp5eXp5e3t+foCBg4eEiI2MiYmGhYSEg4KCgoKCgoKBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoWFhIKBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+fn1+foB/fX19fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjImKh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYSBfn6AgH1+gH59fn6AgH+Bfn+Af39/gH99fn9/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIF9fHx9fXx8e3x8e3t7fHt8fHx9fImJh4eFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x+iYWGhIWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen19eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfX6Af4GAf4CAgH9+fX19fn1+fn19gYR/gH9+f4GBf32Af319fn1+fn1+fHt8enx7eoCFgoOEhYSEhIWDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX1+fnt7en6Jh354cnl9f3F6eHt4eXR1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAg4F/f4B+gIF+gIF/gH9+fn5+fn5/fn6FhYCBgH+Ag4F/foGAf36AfoB/fn17ent6fHt6goN/goKCgoOCg4KBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dnR6hISBhISDhIWFhoSDg4WEgoODgoCBfn9/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GEgX+Ag4F/f4B/gX+Af3x7e3p8e3yBgH+Bf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4KAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4F/f4GBgIKBgYGAgIGAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fX99f4B8f39+fYGAgH59fYB/foGBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGCg4KBgX9/g4B+goKEgICCgYKChIF+e3t8fHx9fX1+fXp+fX55fn9/fHx8fn1+gYCBgYGAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55fHl4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDhIN/f359fn5+f4B/gIB/gYKBgH9+f4F+f4CCgoCBhIKEhYaDgH59fHx8fHp5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhYWDg4ODg4OCgYKDgoGDgn+BgH9/fn+AfX19fX+AgIB/f39/fIB/f4GAgYCAf32Af35+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgYB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnF3eXJ4hYWFhYOEhIKCg4KBgYKBgIOBgIB/fn5+foB+fX58foCAgH+AgX97gH6AgH+BgYB/fYB/fn5/f319fX6AgYGBfn9+fn59fX1/fn9+fH6Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fXt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgH99fn5/gH18fn1/gIGAf3+CgHyAf4B+f4GAf399gH9+f39+fX18gICAgIB+f35+fn18fn9+f358fYB/fn1+gIJ/foCAf36Bg4KCg4WFgoJ+fX17e3x8eXd7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNweHdxe4WGhYWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAf4GBfX6Af35/gX+Af3+BgH+Af31+fH1/gICAgH9/f39+fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYeEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYF/goF9foF+fn+Bf4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYR+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGCgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/gICAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBkox6fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoKAgYGCgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiXx8fnt7fnl6e3p7jX53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIGCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359f4B+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3t9e3p8fHuHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICAgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4GEhICBgX6BgoB/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4GAgH+AgH+AgYF/gICAgIGAgYGBgoGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDgH+CgYWDg4SBgYOBgoKCgYCAgIKDgoCCgoWDf4GAfoKDgICBgICAf4CAf4GBgIJ/f4CBgH9+gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoKCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX54d3Z5eXl8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIKBhoOEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf31/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXt/fXp9gHp5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBg4GCgoGCgX6BgICCgYKCgYKBgICAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4OEhIODhIODgoGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+fn+BgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChIaEgoODg4SBhISAg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgoOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3p7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoKFhISDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dH2Hh4OChIWDg4SFhICChIWEhIOCg4SEgISFg4KCgoODgoOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e31/fX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3V2f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgoKCg4OCg4GBgYGDgn+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4SEhISEhISEg4OEhYSEhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfHyAgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgYOCf4KDg4ODgoOAgoWDg4ODhIODhIOAgoSEhYOCgoODg4GEg4GDg4SDhISEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX59fn9/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYKBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSBf4GDf359fH59fX+BgH9+fHx+f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOFhIKEg4aAgoWFi4mEhIOEhYWDh4aGhISEhIWEhYSEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgX2BdYF6g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOAhIOAf319fn19gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIaEgYOEhYOEhYOKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8f3OCg3+Dg32BfX5+fX6Cg4F8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26AiHltfXJzdnN2bW14bHB5bHV9f399foGAgX2Af32Af4B/fX18fH19fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gX9/fH99fIF+gIB+foCAgYB+fn9+foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4eIhoeEhoaLiYWEhoeHhYOFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+g3SIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJioiFhIaGhYWDhYWEhYaGhoaFg3iLeXKIentwcIWFeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhoeHiIaEhoWHhoaFhIWFhIWFhomJh4aEhoWGhoWGhoSGhoeGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SGhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIOCgX1/fnt8e357fHx9f359fH5+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWHhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhYaGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaGhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWEhoeGhoWEhoeGhISEhYOFhIKEg4OFg4OCfYB/e3t8fnt8fH1/fnx8fn2Af31+gH5+gH99fXyAfX5+fn5+fnx8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhIiFhoeGh4aIhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhoSGhoWGhYSGhoWEg4SEg4WHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fH9+fX1+fn19fH98fn58fYGAfHx8fXx8fH56e3t9foiHgoWIh4eGhoaGhISGhoeGiIaEhYSGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHhoWHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhIaFhoeFhYaGhYSChIOChIeDhIGChISDgYCAgHt7fn58fHx9fXx8fH19fH18fn18fX18fHx9fXx+fXt8gX99fH18fXx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhYeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhYSDhISFhoaGhoaGh4WFh4WGhYaFhIKEg4ODh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1/fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4aIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoeGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4OCgoOGgYN+goKDgIODf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWFg4WFhoaGhoeFh4aHhoeHhYSFhYOBg4KAg4WCg36BgYF/g4F/f35/fn98fH1/fXt9fXx9enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhYWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHioeEh4WGhoiGhYeEhoeJhoaIiIeHhoeIhoSGhoaHhYWHg4SFhIaGhoeFhYSDhYWHhYeGh4WGhoaFhoaEg4SFgYGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15enp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYeEhoWFhYWFhYODgYOBgIKBhYKAgH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4aHiImGhYiHiIeGhoeFhIaFhYaFhIeDhIWEiIaGh4WFhIKGhYaFh4aHhIaGhoaFhoODg4SAf4GAgIOAg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18fn5+fHt7fX59fIiGhYaGhoWFhYSFhYSDgoGAgoGAgICDgX5+foB5en2Ag4OEh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIaFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEg4aFhoaGhoaEhYaGhYWGgoKDg39+gICAgX+DgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXx/fn18fH1/fnx7iIWFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYOEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOFhIWDhYWBgYODf35/gH9/f4N/e4B9fX+CfYCBfX6Bfn1+fX1/e398e3p5enp5enp8eXp6e3t7fXp7e3t8fX59fYF9fXx8fYB/fXyGg4aGhoaGg4SChYKFgYGAf3+AgH5/gIJ8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYaIhoaFhYeFh4WFgoOCgoOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhISDhIOFhICAgoJ/fX1/fn6Ag357f3x8gIF9gYB9fYN8fn59fX57fnt7enl7enl6ent5enp6e3t8ent8fHt+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn6BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoSFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoODhIODgH+AgX59fH5+fH+DfXx+fHyBgH6Cf31/gnx/f319fHx8e3t6enp6eXt6enp6enp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoOCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhoSCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhYWCgoKDhYSCgYGBgoCFg4F/foB/fnx8fn18foN9e358fYF/gIN9fYCBf35/fXx7fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzs8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRkw9ODc2NTk5OTw+OT88RDk7PDc5PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTU09TU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojs4ODo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTg6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8rKysvLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXU1dTU1NTU1NXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzQ0dDQ0NDQ0dHR0dHR0c3Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2trZ2dnZ2dnZ2tra2trZ2drb29vb29vb2tvc29vb29zb29vb29vb29vb29vb2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNloSGhoaGhoeHh4eHh4Ky4t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKiomSmZiYmJiYmJiYmJiYmJeMi4qKioqKioqKioqKi4aBgoGBgYGBgYGBgYGBg4uKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzm5QU1NTU1NUVFRUVFNMoPPr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NRYmxra2tra2tra2tra2tpVVNTU1NTU1NTU1NTU1RLQ0NEQ0NEQ0NERENDQ0ZTU1NTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8NztAQz42Ojc+Pjs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzM5xVFhXV1dYWFhYWFhXUKHx6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXVmVwb29vb29vb29vb29vbVlXV1dXV1dXV1dXV1dYUEdISEhISEhISEhISEdKV1dXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs+QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183OeF5hYGBgYGFhYWFgYFqk7ufn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYmFveHd3d3d3d3d3d3d3d3VjYmJiYmJiYmJiYmJiYlxTVFRUVVVVVVVVVVVUVmBiYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI/Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcfFxcXFxcXFxcXFxcXEy9DPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs/Ozs/Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLzc7Ozs7Ozs7Ozs7Ozs7NzMzMzMzMzMzMzMvLy8zMy8vLy8vLzMzLy8zMzMvNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Pz8/Pz8/Pz8/Pz9PPz87MzczP09LSzs3P0s7Ozs7Ozs7R1NTTz87S1M/OztPTz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW19fX19fX1tfX19fX1tfX19fX19fX1tbW1tbW1tfX19fX19fX19fX2NjX2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7RsIKDk83SqKDQz9GkodDOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7PyZu6uJuwt56jp9avn6Gp0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD5BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0cOij3+JxZ6ak53AnpiVnMjQzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz9G/noqo076YoZy0mJyinbCy08/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/RuqStnKG0mZatuYaelq+zqtXQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/P0cCgnpOpkJuBoJZ4m4Sdk6TV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDSprCun4CfqIiceZ+phZmk1dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0cnXxJyCuK+mnIq9raaYr9bR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49PTs7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cWNnqCfmaeXl52lp5aYm7vV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU0Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocnBoa2hoMGiq6Sb0J+rpJzR09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT1auNj6nYxZCNt9fCj4281dLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHUwb7V0tTHw9bS1cXE1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExBPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0dTV0tLS1NXT09PU1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NTU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs6ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUZDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4ODg0Oz88Pzw5PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWh4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIN2dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5PDw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq5uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4Nzk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urq5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpkbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXhwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1ODg3OTc7OTo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tbW2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWnqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5OT03NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUE/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0FEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0NAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo8Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo6OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45ODs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5ubm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZycm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pz86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkA/PUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojs9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw5Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5OTs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ubm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWQi5OTkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NDM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yPj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QEI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi42Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEf4J/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojs6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVUYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcU19NSFFJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKlqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGRjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKWioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsZ2JiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq2mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Necl9oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tgX1pcVlxoZG9jbmloYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqaeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5BRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloKGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbGh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc3Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLazurGqrrSxsLG0tLa8vL68vL3Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqTlpSUmJOQmp2YiouHgIB8gnhhXllTYWhgZnNvc2lzY2lkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGw8O5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubVtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsae8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQkREOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpSRmZeeoZWYmpKXlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbGhxeG95aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsa/xcfLyNTLysjGv7u7vsS+xcjGxsTEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi3u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZyYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2hndVpmcndzeGZmXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDs9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOyMHEwcfKysbKxczIzcbIxb/DwMvNz8nGw8PEwsS+uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamhdam9teHdiYmBgXlhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjHycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytpqm7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWh0bXhsXWRbVWBZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD49P0E/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExcnFzdDOx8zJwsHGwcvLx8bMyc3FxsbDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlkdG5zYlxiVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHDw7+/vsTLyMrLyLy7yMfJzcjDyMnJxsXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu7vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cm9mZWdjamRham1ubl5YXFZVTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsG5u8O6uLm8vsHGwca6ucnJw8XEwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZmNaWVlcWVFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/ur3Aub26urS/uLW3s6+7vLfAt73Cv8G7v8G8u8W+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5h31xY2BiYmdqZmZpZWldVlVTWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W6wbi+uL+8vbe1t7CuuLa5v7vAv7fBvLvDtrrIuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVrZ1hYTktLS1JJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v728sq2vrLGwt7y2u7zAxLm3t7e1urm6u8C9w8C6xMK+x7i5uK23tbi6tLezu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby6urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25wZ3Brc2VibV9cVEhLSkRKQkNHPzk7OD08Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72/u8S3tri2t7+/xLzCxcXHx8rJxs/CwbiutbW8vri7sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/CusDCv7y2t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bndjZ2FcY1FLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz0/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6qjsLm9vrO8vrzFuLK4ub3HycrDx8jGxsnIzM7RzMrEtbrAw8i/v7W/wL/Gxr/LxsO/wbzAw8zKx8XGwbm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYGFOSE0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv66zvbS4wbGwsbS8w7y6ur68xL+3vb+9x8zGx8nGxr/ExMrIzMzNy8bCw8vOwry5vbq5wMO/yMbEwcG/xcDKycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13e19wY1tdX15TST5DRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9Pz5BQUE+PkFCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tLy2ur3BvLu/tr/Bv7y/usDLwsfIwL+8vL/FwsfLyMHDwMDJysLAu7uwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem1zeHNncF1aXlxZUUVEQ01JQUQ9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u726w7u3vbe5wLu6uLi1xcHDw7u5s7S6wb2/x8C5wLy+xcS9vrmysK64t7/Dx8PEvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbWhcX19ZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucHAt725uLm2tb+ztLK4sbvBwMO3t62wtbi4uMK6tLu3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bXBgXmVdW1RKPD4/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7e6t7a2srTAtrK0uLO6wMHDubeysrK0sre+urO1sry6vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnJsXmJgW11OSEE/PUhDRk1EPzc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZKYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27vLi2uraxwLq3ubi5u8HBxMO7u7a0tLC2ura0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3tvdXJtY1xmWFxdUk5NQT5KQkBKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7GttrqurLyyuLm3u7+9ub7AtL+7vLq4vsK8wsrHvsC4ubaytLaztK+su7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0trCqsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXVpa11aalRdXE9NSERGTEFGTUY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6tbm7tbWztbu8wLu+wLS/ubm6sbrDvMLKxb+7v7+5tLSzsbGusLm5try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Ojo6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSYnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEg/SFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6tr7Kyurq3t7W1vLSvtKu2urjAxMG7tby9uLKts7CvrK62trK0tK+qpJ6cnJyeqKifoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moqquepaObo5yUkIyOj5CTkJeVlpifnp6amaaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUGhUUE5HT01MQk9RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AuLSnpayqqLWysbCur7Knpq+jr661wbq1t7K3trK0q7K0rqqrr7Cys62lnpKYlI+ZoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqmwo6WnnqCclZOPj5GQmJCWlZiXn5ibmZujmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUlIR05STkpORztEQD0yPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJiXlqGorK62t7q5ure3u66ooKGpoaCtq6qmqaSpo6SupaystLy3rLKxr7Gtta+vs7Wqp62so5yZlI6RlpeZmZygo6KbnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWZlpqXl5ignpycl5uhmp6ao6eln6GioqOdm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeHpgYlJVX0hJSUtTVElSUEw4PkI2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5OcnqOorq2sq6uvqq+pn5eepZ6epaakoKKfpqCirqusrbWytqavtKupqrSxsLC4raehnJ2alJibmpGOkZWRjI+OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu5qKarp6urqaysp6Cgo7GtsbG0qbGvopmcnZ6hmJubmpiZm5SVmpaYnKWhoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dnZzaIJsZVtTWllNUUpOTlVMUkxBNz5CNzg9NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT83NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKSnJihnaqip6Cep6Gln5ySnKKbn6Gjnp2gn6Ogoq+urK+xrLanrbGtpqawrq2ssKegn6Kgl5GUnKGcmZiSk5+doqSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCnq6iytbezt6yxtKOgnaWfq6GhoqCfmpiWlZ+bm5ikoaCeo6GgnpqcpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUVVIRlVWSkJNRz1KSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuOk56ZqJ2unqeenKGdnpqZkpmenKKioKCdop+fnp+pq6esqaq0q6utq6Wlq6iqrKqln56ZkpKUmJmWlpaMiIuOlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7Whq6KpqLGpqqinp5qZnZqqpp+Zp6Cfn6eopaSenaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl3bWhtXFhbQlZNSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJqqoLGit6OwpqCenZ2XmJaZnpucpJ+fnaSdmp2cpKKko6Kqr6ynqaOgoayurqqrpqCenqGjnp6em52clJOVlJ6emJSGnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusrqexrbHCtrjCxsDIysDKv7C5ub25wr24s7vFw7zCu7ezqbKtqrO0r7Ouqa6jnauntrGsoq+loKOvsa2wpKSvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpZ6mmZuipJ6fm5ubnIeFgXt0cmtrdXJwZ1dcUUVUSERJT0g+RUEzRUg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqChnZyYm5+gm6Cfn5elnZWbm5+anpyepaannaCgq7Gup6Sko6CepaulnpeclJGZnZiUjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMvM0se+v8DCvcfGwrfDycjCwMW+ubS5urW6t7C1sqq6sa67tr67uqq3rKqquLq0u66tuKOlop6npaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSakZydn6Sep5+en6KdmJmUmJSIhH16cmtkaW94amVaW0ZKTEREU0xEQkQ3Oj87NTQ5OTc4Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWVmpaUm6SmnaGqp6KrrLy8v8PBs7K4p6Ghq6qinZ6hop6cm6CSn5+Qlp+ZkpqWnZuZo6Gvs6mhmp2dn5+al5iXkoyPlpeTjo2Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczHydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdHTzNPP09PMysLFxsbKx86/yNDLxsTGxMC7w8C+vr61vbOtvr/Cw8bEx8OtvriyuLzEwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJREJANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJujrJ6frqalsarFxszOzb+wwqmlqK2tqqGdo5+cnZqpk5mhkI6gk42UkpeZpLGxq6SgnaCbmZeUk5SWkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKz8rT19HX0tTV09PIzMfNzcnSzM3TzcTHycnAxsvGyMjFvsKzs8fEy8rKzsXJv72/vMHHxMzMyMm/w7+tsLOonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi396cnV1Z2JndmlkVldRRE1GQElRQj1CPDoyM0A8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+To5iWn56dpK6bn7CrqKyxyc3U18/Gu8esrbS4rK6jn6Sjn6CkrJuWqZaNl42MjZemsK6lnZ6doaWhnpuVlJaUin13cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dLU1NLP0cPQ09bX1dbSy8nO0MvGzdLJ0tXW2dXX09bYztLJztHMztDL0s+/x8bJw8vLy87PxcbHtr/Jv9LMy8/Fyce/w8LHzszQ0M/MysfNuLe7qJ+lq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8d3N2b2NgZXJiXVJcSUpGQUVIST47QDg9NDU4NTo3Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSim6mmoqarmqOwsamotdDU19rSx8bLtLbCxrK2qaKlpqGiq7WnmrGhlpWMkKatq5yVmKGdm6Gin5ydm5WKd2ljYF9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M7P1dTU0dHM0c7T19bT1dDP0tPRydPRx9DY19jR19LX2dXWzM7PyczRy87Qv8XBx8XNzNDQ0cjLzMDKy8XTzsvOyMTJxsbIy8rT09DVz9LM0sG5xbGlqLWup5qorKWdsqiws6ysk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx7enFzdG1hY2ltX1ZQX0pKQkZDUU0/PD40NDo9NTI3NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vrqqqrJ6mrrioq7fY1NXZ2dHO0MC8zMm3wK+nq6mjpLG2s6O2qp+doaqpoZiWmJqbnaGemp2elH5yZWNiX19hX19hYF9gYF9gZm1wcG5rb3J3d5vMwNLV09jY1tnR0tLXz9POy9PN1dTRys/M09bS0dbN0NXV0cXR1MrQ1NXWztLQ2NjY18vIzcPIzszKy7/Jv8fIzc3PytDNzsvOzsfKz9DKzsrCyMbJzMrL0dLM09HQz8/Kvci5sK27uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIeXZvcG5rYmVucGFXXFpJRkZETFdFO0A8MzM8PTg2ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD4+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKeeuLa1ta2lra6+tLHA2dLX2tzWz83Lw9PQwsKyq62urKazsbirs7epo5+clpSXm56fn52UlpeViWxeXl5hZGJgYGFhYGBhXl9fXl1ibXJvb3N0dnZ5pL7L1dHW1NPY1s7O08vNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dPLy8/R08nO0dXS1dXKwMnBxczCyMnCzMLFyMnKzsrMzM/N08vFx8/Mx8fKxMbAxcnLzc/Qxs/Ozc3Mz8XHwLe5vcLDvcO5srO+sLvDxLWpmKWhmZaRlZWSi5SNmpGUlI+PlIKJhXhwcWttaGBgcWhYWGhWTUdMSVBQQjtEPjs2Nzo4OTo1Nz09QTs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcXDwb+7tbKxx8O5y9XW2drb2M3Mz8nW1sXEuLK2qqSurLm5sbLAoZeOjZiWkJOSkZaWlpCMfGViYmJgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxMnJxsa/w8XOzsfFx83K0cjLzs3G0dLPzszUysfKzc7Hx8/Sy9DPxbrEvsbJvMLGyM7EwsfAxs3Hw8vJy8/Hw8PPyMbBxsfDvsDHy8vLzsLKy8jHy8/Exce7x8LIyMLPwL28v7DByse6vaqwsqelnaKcmJCbkKSZl5mRlZiJj4J3bnRka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NT08NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WzsazJzcrIxL69us3NxtDV1dna29jQytDQ0tTKxbq+vrCot6u+ubmzpZKOjpaQhoOEhIJ+hYV/dGBbXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLq/w7u7urm+yMbCw8DDx8rJyMrHwcXLxsjLzcnEwsrJwcLL0MTLyL+5wbrFx72/xs/Kw7/DusnHyLrHxsTKwL3By8bFw73FvLy/w8TLxMS8v8nCxcfRxcDIv8rJxsfG0MPDxsOvxMvHxMq3v7y6tKmspaWYn5iso6GlmqOgm5R7dnJ0ZmlaYW5tWltYUURMRkJHRExERlNANTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8ys/RzMfCw8fNz87N1dDW2djZ0M3Uzs/Qy8S4xsG2tbyxwLe6rZGMk5eHe4CFhoB2eHVycF9aW11gYWJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsGwtrqysrSyscG8u7u5uMDBwcW+vbm9v7nEysXGwr3GwLe7xMm/wsm7t7q6xcK+vMHNwsa+vbXAvcO6vMa7wrmzvMXDwsK2v7W1vr+6y8O8tbrIur+9y8PBxcLFyMXIxdDGwszHssbJw87NwcXCv72yt7Czp6ioubGlrbCrrayUeXZ3amVoYGhvY1ZeWUpFSkZIS0FGQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8bCxMjO0svKysfNzs/SydHG1tXW2M7M0MjNyMrFvsrBsrW6t7u2sJGNiouFeYCGhoB+hHx0dWRcXF1eYGBiY2JiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusC4rbCwp6qtrKe4tLa0s7KzurW9sbewtK6yu8K8wcS8v7q1srq+wLjHuLS7tcDCvLe9xsDDu7Susra6vrPEt7u1q7i8vcC9sLq1r7a6ssW8tq67v7S2tMW8vsPFv8PExcfLxcDGxrvHy7/PycfDxsHDt8O+vba5vsa/rLW6tbe2jnh0eGZnZWJrbl5WXmBGS0hISkZCQ0FFRT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pauzsby8sa2foJmUlJiXnqujr6qnpMbLzsjGyc7M0M3OycvJzMrLxtHP09HPyMvGysbEwL3PvbO5vbm4t5yOh4mJe3l+hoZ3eIJ9dGheXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5oZmpubnJ8pMe/ubi1sKusp56iqqeeq6yzramrqbOttrCyqK6mrLK8urbDubq5sKu1ubu0wrqwv7C9vLu1u8e5wratqqiwscC1uLyvsKexs7S7vKuttaWutq66sbCqua+tu667uLu/v725wr/GwsXAvMbByMu4xcfFv8fDw7rExsK7xcnMy7O5wry6sohydnZraWFibGhZV1dbQUxLTUlFQUM/RkE6OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bGz9LMxMbBxdDIz8LEx8HGxsXFzMTLzMLEwcjBury7yre0vL22tauRiZCQfHl+ioV6e4SBd25eXV1dXV9gX19kY2JjY2JgX11bW1paXVpaWlpdZG5vaGZnaWtucoGtubC1rqalp6eaoKSgmpylq62jp6KrqayqsKOmn6qttbaxvbmvt6+orri0tLy4s7yut7m0sbvBscGupamirLGys6e8qquoq6yttLSmqK6hpK6psqWnqK6lqLessLK3ubq7sby9vr7Ev7XBwcfIt7/AxbfEwr+7v8TDvsTIzMq/vsPAwKmGcnRyamldYW9kV1ZYUEhaUlNLRkZFPj9AOTc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3usSwtrCbmZWcmKqpsLGztb2vxtHQzcTIu7vMw8zAvMq5wMbAvMy6w8fFur3Evrq3vca5trm7rrKVg4mNgXt+gH54dH98c3dmX11cXF5fYF5fY2NhYmBgX15dXFpYWVtbWVhaXF9ma2ZlZ2Voa29yhaqlrKagnKGllJ6km5eRoaOqo6KfpaWnpKyfnZukpqyyr7a3p7Csp6q0q7S5sLa0rLa4sa+6ubG3pJ+jn6exp6uouaqkpqeop7KtoKemnpukpqyen6ekn6Cxra2ssrSys7C1vLa7wcGyur7DwbK5usKzwL2/tbi7vb68wsfEwsO+v8Ogg3dwa2FlX2tvYFVZX0hOaE9UR0VKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBu761oJ6UnaGmurars7O7s8XQyczDx7m4ycLOwbrLub3Iu7fIu7fExrO+xby3sLnAu7Gzt7CihIeHgn15dnRvbWtqanFpX2BdXFxdX2BfYWNiYGBgYF1bW1tcWFlYWFhWWFtdXmRjYmVnZ2dqbW+Inamgl5WaoZabopiVjZ6hoqabn5+jpaGnnpqim5+qsK2xtaKpqqmrrKS1uK23r6yytK6ytK6wqp+dnqOisqSlqbitoaamn6isq5mfoJ6ZnZ+lmpmjnJudr6mrp6qrrK2wsrivuLm7sLa7u7qrsrK5sr20trGxtbS/tb3AvcPBurq9l4J6cmtfZV5kZFhUWF5JV11LUEdJSkZBPD8/QDs/PDA0NTM1Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfG0MnJwce8vMXF0MC8yru7wbu2xbi1wcGzwsS8raq1ureosbOpi4aIgHlzbnBua2JeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taW1lYV1dXV1hYWFteYmRkZWZmaGlrco2onZSUlJuYm6GWlpCcoaGonZucpaahpJufoJqYra6trrKgpaKtq6ehtbCxsaynrrKnubOmtaGinpqjoq2ioam1qqKjpp2lpqOWmJ6XmJqdn5mXnZycm6yhq6ajpKatq7KzqrSwsqqyubSvqa+ysrK3s62prK6xt7C6trm9v7aysZSEeXVlXmVeW1lWU1pVS1tRTElFSEtJQj0/QUFAQDoyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr69v7OdpaOYpbHCtba9rbS4w83JyMHGuMLByNC6w8bAtry9tsO6tr/Btbu/u6qmsbuxqLKvm32FhYB5cHF0cWhmZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFhWV2FkZWNkZWRkaGp2opyUlI+Ulpefl5mUmJ+eoZyWoaGoo5+dqJyamqqmr7Crm6Ojt6qgn66otqmmpqywo7ewo7agopuYmKqmoZusuK+ioaScoZ+gk5WhlJaWm5iXlpeclJ+pnamjoZ2jqqqwrai0q6qmrbKwpaqusrGvsK6up6ensq6xtK+8tLm2rqOUgXl1ZF5hVllXU1JUS01eTFBLR0dMS0U8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunaeno6q7wL3Aua60uMLNyMfExb7HusrNtcTFxbG/wLnAwbrAwLm6vbeoqLG7pqmipYmBfnhyamxydHBpaGVkZ2JcXFpZWlxcXF1eXVxbXF5cW1xZW1xaWFZXV1ZXWFdXV1VbY2NiYmNiY2RmaoGWk5WLkZSTm5mclpaboJyflaCfpqWkpaaenJ+kn6qvpp+io7aooKGiqLOhpaekr6WwrKu0nqCdlZSpoaGUrLGwnqKinZ6Ym5OLoZSRk5eYkpeXmJadppumoaKZo6Wkq6SlsKelo6urraWorq+uq6iqqrOlpquvtLGuvLWxr6+gknp2cmRhXFpdWE5MUUdSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzs4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7K3rJ6kp623u7zBxbqxubXFysvBxMfHybjIxrXFwsmvurzCvMPAwb28t7q2pqeytp6iipmIgHdvZGJnaWhmaGpnam1gXVxbWlpZWlxdXFtcXl9cWllbWVlaW1dVWFdUVFdVU1RSVWBgX2BhX2BhY2RpgZSTiZGOlJKTnJSVlqOZoJacoKWhraWjo6KjoZuqqqWZnqWxqaCgnaSqnaehnqysqaitrKKhoZSXo5uckKupsJufop6el5iTip6SjZKTlY+YmJKboaKcpKChlaCho6Wbo6uloqSqo6uupK2xqaalpqa0pqmorbO1tLm6r6qsnotycG9gW1dWVVFGUU9IWlxPUklUS1NMRUdJQzg7Oz08ODY2Nzo5Ozo5NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg1OTg5ODk7OUA5e7W0rbS7srCssq2dp6evubmzwMi6tcCvxsnOu8LLzcm3y7+0wMfMsLa9yLvCx8S9v7e6taWrsK6dmoeOg3x1aWpqbWhqbG5ra21lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXl5eX19iZG2Oj4SRho+RjpmTlJKcmqKcm6CnqKqnqqWopKOYpK6klJmlr6mfm5iaoJ6umZuqs5+lpp6io6CUk5uWlZKoqa2anKChoJqUkIyZjouQjJKMlpSQnaGgo5ybopWboKKgl6Koo6Koq6Crr6Stt6Wjo6Ksramoq6+zuLK9tbOrr5iDcnJoW1hZU1VSRVlMUFxZTVROUExQUklOSUI8Pz9BPzw2NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zraiztq6pqK+tm6morLe2rLzKu7a/rMzHxrnCz9DJtca+ur7Gy7WxvcW9w8bEvcGzua+mq6+rnpeGgXd4b25pbm5ucWdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVUU05QUVlaWlpdXFxeX2Bkfo2Bi3+LkIqSjZeRl5mioJufqqmmraqmr6KnmZ+soJWWpKinnZePjpmdrpaXp6qZn52TpaCdkZCSkpKVp6qkmZmanZ2WjYyLlIaIjYOQi5KUkKCeoKOXlZ+VmqCinZObpaWnqKigsbCmsbynn6OstKutp7C0sLi1wLGtsauQfXByYlZUVU5SSUdWUVNSTExYTUpMTlJHTUtBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojk4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s6ymsbeqpqKwq52qp6mysaS2xrS5urPLxrq8w8vRzLO5ur7AxMe2tLe9s7u8xL7CsbSusa6xrJyiiGtobm9yb3FrcGtkZmdlXlpZWllaWlpbWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1haWVlZXFxdYWqAen92iY6HkImYiZSUl5uZnaibn6qkpKqcp5igpZuSj56impeWhIORmqOPk6KclZWWh6GampOLjoqPmaOnnJWVl5uQkoeUjoyBi42AkIqSkpGhmp+hlZOYmJWipZiMmaSmqKahoLSyp7K3oZ2it6yqraSysqa1vLWrq7GjiHhybV1OUFFMT0NOTk5QS0ZOTktKTk1RSE1KQUdLSEhDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyNzc2Ojk5OTk4NDk4OEE3d7anpLawpKekqaWgqaWks6qissO1tbKzx8e4u8TKzce1r7y/uLzEs7OutqKttcS6u6+qrLSvr6CXqH1eYGdzcXZxam5pZmhoal9YWVhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTk1LTFNXV1ZYWFlYW11hb3N2cISIgoeAkYOOipSRk52gjpqboqCjmKSWoZuVjYeYmoxzjYJ9jZaWhZCZkJONjnqYjpyMgop/iZifop6Qk5iWhI6Ck35+c4mNepCGkpCQnZqZmpCVj52OoqOOiZqgoaSjm6K0r6yvrJ+YpbmmpbChsK6csLuqqa+qmYF2cmJWTFFPUE1DU05MUU1DUFBISU5TTUhKSkRKTEVLSzw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI0ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3e3oaO0qKWlqKOmpaamprOnpbTAuLC0sMrGubrCz8e/ta+9w6+xx7Ktp6yVpK6/uLGwn6etrauWlaJyV1ZfaGdpaGluY2poZ2JcWFhYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVV1lbXWlscm1/hXx0Tlhyj4KXho2cl4qTkJ6XnJWUlpSOlol/k4lfO1dve4uTiX+LkYyPhYZyioSWgXmCeoWTnZSDlY6Qj4KGfZJ4cW+FjH2JgJCNj5eZmJOKj4iciJ6Xh4eWnpqhoJenr6itqaielq20oqatmKyrmKezoamto5J9cW1fWk5TUVZMRFRKUE1MRk9PSUVMUU1LT0pJTVBGSUg9NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl4t6CjrqGmpqqgp6mnoqmwqKe0wbmxtbDJw7m0v8/AurGxuMSrrsmup6Oehpuiuq2nqJampaShl4+WaVFNUlZaWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbW9peoJ0UEJAf5WRkX2JlIyEio2ajJaVipKIhpWGeYh/YEpRbniKkYR8hIyJhH9/bn5/lHd1dniEjZlwUY2IioZ7fniUdmd3hYd+iYiVio2QkpaLg4mHlISajIGEkpuWnpyUpKOnqaWjnpuxq6GkpJCmqpahqZyipqiIdGtlXVtIUVFTTElVTVNJTExQSUdGS05MTVRLUVFPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTc7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjExNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85dracoqedn6Guoaeopaeor6yqtry2uLazwry3qLrJubepqre4rbbAqqKbk4OPmbKfopqNoJaZlJGLjGVNTE5OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4aBe4WMkoGSmYuPe4aPf3V/eHNudXB0jY2BeX2JqoV5emh2e45wcm14gIqMknh6gHuAdnJykndndYSEhIR6lYmIioyLgH+Diox/k4N7gI+YlJuVkZ+dqJ6foJ6gqaWfnZiMp6SToJ+VnZ6kf3FnYFxcSlZPUUdLWFJPSkxNUkpKSk1QSExRTFJUTUVIQTw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc5NTY3NTI1MjU3Mi8yLiwuLzIwMC8tKygoKS4xMjYyMTk4Nzk4Nzc1Ojw8N3aumKOhmJyes6mvqaWsrLCxqr20sry4trq1sqC3u7OrnZ+tq6y1s6WelpKYhpSklp2Mg5eJj4mGhoNmSklKSUdGSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFlYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FSU1ZedYN9eWd3jZeYjo99Z3mBdnh/iY98hJiSgXKHj3x2e29rfq18c5CKf3uGkoB9f3RmdnyFbG9oc3yJjIeAbHlxfXBtdY9xaHGAfY5wQ4qEgoOFfnd3eouFfYt6dX6Oko+YipKam6OXmZ2bnZ6inZaNiqSbj52XjpaYjnVta2VhWVdYVFFKUlVUT1BOUVZLTktOT0pRT0lOT0tGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppefnpagpq+srqunqbCvsay8uKy7vrmzraibsaitnJCXnqesp6SbnZOIln6OlZKVgHyKeoWAf3+BZUpHSEZCQENESUxMTVFSUFFTVVRUVVZXV1dYV1lZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWJ7eG98eYiPeXyLhW9tjJF4c3hqan+CcpaRi4F9ln9JkphuaHd+gmxpY2x5hZCShmtzbHxucnuGaG1wfnONiIOFen1+e3ZvdHOFgnmBd3B8joyKk4OWl5iakJOWl5mXnpeMg4mfkYqSjIaQln1saG1ubVdVV1RRUVlPU1VUVFhVTU5ITUpNTktDSU5HRT86ODk7OTk6Pjw5PDs6Oj0+Ojg6Ozk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5manqStr6Ktqqi1r66stL+rvMK/pqOalaWYno6FjJaipJualJePdpF+hYuQj3x4fnR9eHV3fGZPRUdEQDw+PkFGR0dLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganJBmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplfnBtf3qLiHWBiIZ0bJmRdHN7amudjkx5hJKJhI5nMXaGc2x+fYN0ZmV0foSEhYBmaWx1a3B/fGdwcHtuko2Oe3N9fHFwbnVtgn53eXRpeYmCiImDlpOSkIuNkZSVj5eOgHmIl4iGiYZ/kId1aWluZ2NXUVlXWFlbTVBVVlpZTklJRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKispLCwrKykoKycpLCwyMjYtKzU3NzU0NzhpTzg7NW6SiJmRmpakqK2esp6muq6rsrDCsrvDx5uXj5SZi46GeoWRmpaPko6SiXSKhHeLj4x/dnd1eHZveHNpVUZJRD88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7OgcXx4bX1tcYOBhYF5hIaGeXKglHR4gHN1lIc1cZ2onY6hoYSihHZwhnyGe3OMrY2IgGhmYmltcW1vg3Vpb1h1b46akXZsf3p8bXFtcH96c3VtYnaEf4aAhZCRiouJkYuRjIuPg3V4i4+AfoKAfY94cG5ual5aW11bWVhgX1NOW1pZWExISkZKRz9DQUJHP0NEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnnq+VpbSorbGuwbO6wcaXkIyUkIGJfW6CkZOKhIuIkIh2hIVvmIqMf3l7e3F7dHxrb15KUEc+QDc0NTg7Ozw9PkBCRUlMTExNTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz+Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHaIiHx9hYN/jH52opl5foaAhJmFm5xhhqqfnYuCkI16dol+iYeOc4qXj4N7XGRxdHp7d4psZ2lheW+Fj4J6boF3c4R6cHN5d2tuaV13h32HfIiHj4CLk5eDjYaNhn1xhH+EfHV3e32IdG1xcmRlXlpaXVNbZl5YUVVZXFZHS0tFTEc/RkBEQz9BQT06OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XIx3iX+UjJGdnZ+mkaCqn7Cpr8Cxu8a6lo+RlIh6hnZrgIySg36LhZCNeYSCdaKGjX5+goBzg4F9bHlsU1hMQUUzMTEyNjY2ODg6PD9CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5e3F8j4x7fImGfpeHdqGZiIePkpSljaypSIatr6+KgICTioKLgoSRqIeAmJiKnHNsfIGGh32OaGdneH5thYaBhXGEhkdrgHdxeXZobWtfd32DiH+IhYx6lZ6ciouJkX97dYt2fHdtb3d+fXFxcGpaW1taY2JXZ2VcVVBRWFpRRExMR09JQ0ZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1ODU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWHkY+WmJKXoJ2soaa4r7O9tJeNkouYi310cH+Kk39+jYOUlX2Gf4elh4mAg4iGeYmLgHWFeV9jVkxDNjAuLzIyMTIzNjY4Oj0/P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgISChZGTfoWJkYGaloKgoZiVm5qlrZOZu7Gnu8fDp4qMoaWOk4mBkHtyg56fkZx+doWFi4+HkGlob4OAdIyGhItxhoJ3h397doV9bnZ1Z4GUj4aJiIeJiKGro5aJjpiAe4KJenpvZ2t4fXd8cWljXFlZXGhcYWZfWk9MTlhTUUlQS0ROR0NKRENBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODY1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudnBneIN7gIyAgZCPi5qapJyhrKarr7CXkpGEoZSEeHeAjZR9f5KGk5Z+ioGSm46EgYKMi4KKjoSAioBtcGpeQ0E0LS0vLy8vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTU1RSUE9IREI8ODcvOUM+PDw2My5sk5dNUEhJS0tLTlZgY39nZ211nZuPmpOTi42OmoiTj52LoKGSo6mlo6yTqLaip8HCrsiveLqUmnyMoZ6YhJOEgo+hnpOZkoSKhY+YkJZscHWJi4GVjI2Pdo+EcWyFgYqWkoOFiHKJoZeHk4mPkJeltqmbjZWig4eThH5/a2psfX59f3FfW2JeWWZqXGxrX1hLSFBTUU5NTEZJUURETkZCQ0VHQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5nWXCDcHWHcXaRhn6XlpqUn5+bp6CqlpOYnmhmpJp+hZOSeoGSiZKSfYuFmZKRg4GBi46JhpGHhIiFeHh/aE5SPi8vLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVFTUU5QSUVEPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6emopmhl6KVnJ+onqmrn6isqaq1l6u/q7bIybfI0c++m6BwaaupnoSTkYWcoJqamaeRkYiVoZmad3p+lJiRoZKWl4GUnnt2lZKrs4mNl6B9lZ6cjpOWmqSjp7awnZGZqIiXkI6BiGxzc3t8eW5mXltfXmFnY19nZ1xSRUtLUU9JSk1GRk1DSExGRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1NDY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjNBQGliXlBxdWBufWF3jn18lI6Oip+Sl56WnKqYnqpCRH2HiYiYjXmCjYuOjXyKho+QjoGDgImMiYWThYKGiYGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJTVVNOU0xFRUA8Pj1GSEBBQDg2NjI8OTtGSEdJSU1PUVlthpB3lYujp6q1vbilrqysqKm1rLG3srKtu7GzvpyzxKy7ycu4w7+3paOwsqytqqOKlpiFpaagopiCppmNoqqnpIeFk6OgoKqhpKmOnLGLlaOnt7ucoaOwk6Odo56RpKKrsK6ztaKVpqqJmoqSipV6e36De2VeZlpjYF1iYl5mZ19bT0RJSFRPRkhMRktHRkZIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjQ0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gZSFiIKbg5KRjJLayJ2Wc1aXiI+InI98hoyPi4p7iIOHkY6DhYGMhoWIkoaChImGh4eHcW5hQEU2NDwzLzExMC0sKy0xLy00P0RBTlZRUlNVVVdVTVxRR0dEPD4+RkhDREA4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcfEq7PFtq20wLO4vra/tMG2u7ukuMaptsnHtr65tKijtK2wsZuZkpqfiaevqqSVd5+kl6GrsbOYlqmtqK61u7K6rK+1orGssrW8uLWutaCoqKOom6mwrbO6uLionLipjaWPkpOghnmBgHJXX2JVZGBgYV5fZmBbVUpERUxWUUlKSkVKSEVBQEBLREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFxaUWNkV3p1cYGVfYSGk3aGfoCNe7+7o7yCtJSTjpuPhIiPk4qJeoeBjJONh4WBjoCBio+GgIaIhYqHkXp5bl1XQEVOPDY6NDZBQjc2NC8vNkNIQ1FcT1FVWFVcV09fVUlLSkFAPkdLRkZEOz5AN0Q3P0JKSkVHV1RQXo+kraSytMO2uMHMyra7xL2ztMG3uMK1v7C4dLG0prrFpLDGubGzsrSopLa2qrGgopabopKlsa2lraynpJigrLO6oqiyubW7vsy/xcW9vbPCt7q4v7i6uLqtrbGmsaquvrC9vMLDrJm7qJWuj5iYq4l+gHloVWFfVmhjaGRWW2NZVlRKR0dMUkdESUpBSUQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo5NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1RZVlp3anB/j4SBjoVve3J4iGK5oZmjiZWUlpOUlI6Ql5KHh3uHgY6WioGEgYp6fIuIhnyKgoGLhJV9eHp1ZU9cZEdFTDpRZGBbXlNGPztIUERaY1FRWVlaZ1pTYGFNU09FQT9JSkhFRkFAQzxENkI/SEdLTVNaVF6Ur7i1u7nJwLu9ys28vMG8uLa8u7e+tbqzxmF1sqWxmp6rvqqlqKuqpKKytaCrp56Vlp6Yn66lp6elnqOToqews6ixsry2wb3TycnTxsLFzMLKw8G+vr+8vLi0sLm3t8O6xr7EybCeuquirI+lqbeJgHxuXF5eXFVfXWdmU1lhVlJWSUVGTktBPkhEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUVFJQT1FSUUpBOS8sLCwqKygoLC0rL1A+KC40OIB9PDJLiHE5PkNLRUBKTVBSTFFdaG1scY+NhpBzbHJydIjVwLWaoI2VmZmRjpeSlpaOhoh9h4ONlop+gn+DeXuLhId7i3mBioKXf3R9emtlcHZZXVxQZWViYGVkXVtYWFxNZG1VUm1uX29fWGdlVVlUSkRCS0tIRkhISEhCSTlEQEhLVFRWXVpck7nAub64xsG7ucrLu7a6tri5tLi1ta62t5lkdamerXBeoq2cmKGim6Seq6WUn5+QlI6WmJeonqafn5qZg6OdrKSqsKy3sLy41NDO1s/JzNLMz87Kx8DAwsq9wb3CwMXExsrAyc+0pLyxtbCcrLm9mn12aVtcWVdbX1hhYlFcYVRSTENCRkdFPEBGPkJJQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjsuJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREdLT0RSXFppYG+XkpGUbmxvdHWHs6yhoZ+LmZyZjY2VkZuShYqKf4iHjJCLiXyBhHN7ioOFe4p0gYqHlX90e3lsbXV8aXNlaWxoZmppaGBmaWltWm10l62kvYiHZ1tvaF1aWVRIS09QSktQTFNRSExBSkZLUF9fYmdqYpe3x7C6tLu+trHFx7awubGxu62zsairuK2NtqienKeaTpqejI+glpGnmKWVipOTiJGJj5GSnZuhmJuUloeemaaarK+or6ezs9TU1NbRy8/T1M7Tz8zFwsrQv8rJy8nSyM3Ow9DSuLDEvcS6pre7xKJ/a2FaWltWXlZZY1lQXVhPUkNCSUVDSTtBRD5CSD9AQjg7RD5AST01NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ4PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZldzkJGZg2hyb3l5g6GqnqaXjJubmIuOlZGajn2Ji4WOioqLkIh8hIJwf4eBhnuHcoOSi49+cXl1bHB4f3J7bnhzbGmAcG1jaW5weWl3fX7Lv8Pfp25jeG5kW2FgSlBSVU5ZXlBdXU1RTlRRVVRcbm53g3KWrristaiwtqutvcGyq7WmpbmnrK+hrLSkj7Gum5iYjJGUkYSPm4GNp5GciYOLhIqJhIuDlJWXl5SbkJuYmZmenauspKeirKzO0tXRzcvS09PQ1NHOyMPU0cjO0tPT183S0cXS1sbBz8jIw6m/uNCcdmtiWl9bVF5RXFlPUFRQTkk+QUdCQ0Y9QUI/RkU+QD86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYeGi3dsd3B9foCgnp6hjI2Zk5SLjJOPloV5hZCQjouKiJGHf4J7cn6Agod6hXaFk5GJgG93c2xzfXx3fHOCeHFrgHJyaXByenlye77Lmn+NsoR2coV3aWFpXUNaWltXZmRYZWtUWF1dYGNeY3h7f4uBmaqkpKKgoammqrG5q6a0o6KuoqSuoqexn4mmm5WTkYqSj4iClIlrlaKNmYSBhn6Rg4OTl6yLlY6Vmo6FkpCdl6ewoqCgpaSoyM3Px8LL0dPR1NLO083G1tPN1NjW1tjV19XK1NrNytjW0cutxMPLiG9sX1xcVlJXUlpPSkdJSkpAOzo7RUJEPUNEPkhDP0NCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXCAdX5pc3lygoqAnZWelIWLlomPiomOiI+AeISUmYuNiIiLiX6DeHN8fYSHd4B7h5GXgYRveHFtdX92eH10hnx5bId2dG59doV1eXudtYw8QYvGpX6NfWplV0lDZWNmY2hqZG95W19maGtuaW6Bg4mRjJ6foJ6Rl5mgo6SmsqSlsqCipZ+iqaGisZyHn5KSk5GLj4uHhI+EfpycjI2ChIV6lH+CqpajjJKLmJOLfZeKmpGqs5ianKecpr3Dxbi2xc3R0NLQy9LLydTO0dXa19fY1NnYzdjbzsna2tLWv8zNtHVza2FaV1BTUFhVRUdKSUZFPTo3OkBCQzpIRUBFREJEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8yKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9CPjw5UUVDSlRsbm9wYnFxdIaNfZeRnot+h5KCiYaFioKIfXiFl5eJj4OHhod6hHlxe3uFhnV6ho6OnXqNcH1wcHqAcnuBcoSHgG6OenV3fX2CdX98h4mwdFmqwreNkoFwbmM9XmhycHFwbnd3gmVpb3J2eHJ6i4ePk5KblqCWiIyTnJ+bn6ugoaycopqaoKafn6yZjJqNkZOOhX2Ih4OFi46gmZOIg4d+bJl5hJmGiJOMjpWMhnubiJOOraqUlZefmKautbyorb3Hy8jJy8vPycTSytTX2NfY19Tb19PZ29bP29rS1snVzJN1d2VkWFdOUVJbR0NGSUg+Qj49ODo+QDw+SD1AQkFBRUE+Pzo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8QTw6OUQ/Q0dSa19tZGJmbHaAiHGRkJuAeYCOfoKBgoV/hHx9hJiOh4x/hoeBd4N5bnt7h4J0epKejqF2j3aDdHWBfnSAhG+BkIJvkoV1fIGFenaHfIm4xqXDyriClpyPeHBlTmVjgnqCd4WhkIt5end7hIB8hHZtlJaVlpCYkYOJj5eal5emnZigl5+TkpejnpqrlpGRi42Tg4yFiYmBho+RnpyZiIWLgYWXeoiJn5ePiY6Ki4J8oYmQiruhmJOXmpyopqWtnqe1v7+/uMbJzc7FzcnR1dXU2dXX29TX2drb19va2djO28aDdnZkZmFdUlVUVE1LRE1DOz08PDk6PD85PUE3Pj9APT8+PTk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozk6N0hQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZmFdXGl0enlsiY2Sd3Z6i3x+gH+AfoV7foKRioWGeoWIfHV+dW18fYd+dH+SnZGfg5J8h354j355i4pvg5uBdJmGfYKKhXx+kXuQqY+Qw6C9jJuknH2JhX2Jc4yLf3OmmpyYlIV7j5GJhGlHcaGknoyMkZKFiIuQkpWPnZuTlJGXjYyVn52UoZWTjo6QjH+Qj46LhImSlpmfn4iMlJGdkIKMf6aZiIWOg4aEgKSGiou3l52RlJahpqCdnZ2jrra5tKvAxsrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u2dnV0Z2ZiVF1ZUk5OSENMQz09Pjk5Ozo5OTw9NkA+Pz09OTo6OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDlEV088TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT88RFJTUlhfVlhmbW1taYGOinFzeYp7e4B8f3yIe318i4eCfnWDhnpzenNtgX6FfneGm6GbnpSSgIyIf5iHgJySboiphXugjHyRjoOJhJx+m5GKjaOin5Gkr6CLkYuFi4GThldyrYufq5uQg5mckI+OW4OikYKNn5OUjIaIjJKSjJSVlZCMj4qIlpudj5WWkoyTlIaAi4mSjoqKnZeYo6KGk52VoIuKiY6ckIOIj4CDh4WkhIuQspickpSXoaCemZKbnaeyuKylvcLHzcjGz8vPzM7Xz9HUrtbV2NrY2trX1tnanWx5cWNjWlpVUVVWQ0BJQz8/Pjo0ODo7Nzo7OjM8PD89Pjc7OToxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEE5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozk4OjtAO0JRS0tTWVBUY2J4bGJ+kYNvbniLeHp/e4F9h3x8d4aFgHNwhYJ7dXd2dIWDhX1/kqain6ail4qdkJSXi4qol3KKso2EqJKEmZSFmoyjlqCYk4mbnqKTqbCgkZWRjo6IloxvjbeEmsTIspyippycmJaRsZBkpM3HlY6Gh4mQko2Nk5WKhYqKhpaZm4+QlJOHlZiEgI+LmYiOkKuXl6SjiJmelpqIj4eXl4qFj42Bf4ePpYiNk6ial5OWmKGYn5mTnJqisrSlo7zBvsfGxcjIycLK08zN1KjS0dbW1tja1NPazn9ve2RgW1tbTUhTWUJBR0Q7Qj44Mzc7PDo5PjY0Ojo8OjcyPzo5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIUldTUkJjgkd2gY59fG1+iHh6fnuCgoN/d3aAg3xtbot/e314eHyEh4p+i6Kzp6Ors6KXp5+lpJaVrqKDkbiVkrOajKGhjKWbsKOknZiRp5aomayvpJiVlpWQi5ial6HAjqPJuKuco6atmJKbnbKdhYaoo5yYhYmJjpWMi5OPiIGGh4mTmJWMi5STh5SYhoSRkJx1kZmylZakoYecmZKQi5CKl5uJi5aOhn2MmJ6JkJCbmpqTmJefk6CdlJ6boLGuoqO3vrTFx8S9w8PAxs3KydOmzszT0tHW2NPQ2LpvdnJZXlNdVE5HSU1EQUNENT46Nzc6Pzw8Nz00MjY2OTc3ND41OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODU2Nz06SkZER01aXFlKZmA7SISLenpuhYZ6fIR4gYaBfnB4fH59b3ONen6CfHiGi4mGhJKmu6yosb2wpa2zs6ijorCsipq1naO4pZWtpZeprbinpKOfmqmYqqSusKqamZyUlpGXoJiau7uuyqFqtrirsJSZn6Osk5e+o16qsoOKio2Uh5B8jo59g4aOj5SViIiTloyQlY2LjZaYk52ZtJaVq52KnJSRjpGSjJmbipKekIuJlp+hjJSNl5mdkpuYnpShoJScnaWuqKGks7iswsjEtbq9vMXHx8LRoMbJzc3F19bRy9OfbXdlWVdQW09ORUM+PEJBQjhAODg1P0c9PDU8MzUzNDU0NTRCNDk6Qk06QjtBSEI7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEhiYGJwSkCLin6Ac4aHfYKIdYOKgn9ufXx9f3B3h3eOgod8jY+MhoyZqcLAr73Gu7O0wL20rauztoyosq6uvaubu6Wnrbm4q6amoqKko6mvsrGqnZykmZuYl5+ipqWSpLqvqcC8ra6yuaWkqH6IhpytvbCCi4yLkIOOg5GPeoGIkI2NnImIj5eNi5WWlJGal52omrGakaycjpqPko6VkJCWl4+RoJGJlJukrJSWj5OcnZOgnZuYn6GUmp6npqSio7CypsHGw6+wurfFxMO/zabHxMfEvdbQzcTKhXBvXllXXFhMSkFLQEVHPkFAQzs6NT5BPT01PTY+MzMzMjQyQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg7NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QUE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU43OUdEP0NGXGVGYGlnWl1ck4yMiXuHjIeDjHWHkYqBb357gn9xfoF7lXqSlJSYkJOWp7PGyb/BzMLDuce9u6+rubuYs7e6ssCupcCkq6+8vaquq6OjnqerrrWwqpygq5yhnJafr7Wni6O6urbBvKypnbOlpKiUhY2qw8OkgouPh4iEhpWUjXmDjZGPkaGMjJSSjomXn5iTmZWXpqCvnIyrnI2Wj5GRlZWNkZWSj6CUhpefoLKelJmTn6CYpJ6an5uglJiepaOmpqSvraXAxMOuqLe2ycO+ts+yxL/EvLPRysjCtHF1aVlVWWdRTEhCTEtLSkFCPUNEPDVBRTs7Mz04QjMzMjI2MkEwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmVaTWVcZlRia5mNloqMiJOQhol5h5SQgXKAe41/eIeCgpB6jaGWqJmambq9x8jJwdLJy8LMvcKzrby+qLrAvbvEt6zBqayzvL6qsKqkpaSsrrOttrWhn6+fpaKYo7O9qpuovcGktrivrJSyrKysl4aaqaalkYKMk6WWioF1ipJ5hY6SkJ6gk4+TjI+NlKOZlpyVlKOeqp6RpZqMj4+PlZaIfI+Vk5KjmpWfopy1pZCelqSjoaWdnaaYnZWXmqSjqaeisqyou8DDr6Wzt8y/ua/Es7u+wbiswsPCwJdqdl5VVFlYSkpMSUZEREhDQ0FETDo0REk6OzQ8OEUuMTIyNDJCMjZTSE88SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5pSF9YYlpjY1aej5yOl46ekomKf4qgk4R4hX+Wf36QiIqRgJahma6npJjCvcfDx8XTzs7Ny7zCt7C6vLS9y7vDwra3vK2zv7q9rq+ooKmotq2uqbK3mp6to6ehnau3uKqlsL/Esr25tKirtrSurpeWpayon5GNkrLFp5aOfJKVfIeSmY+qmZiTk4+SlZOknZOdmZOho6KcmJ+Yi4yPjp2IWpCXl5KXpJllmKKfs6WVoZWrq6mmm56mlpiWmJSho6ilnrarqbm7w7SltLXLwLiqtquyu7iuqLi6vbiAaGtXVFJTTUVJUkxLP0FIRUVIR0c5NUZNOz43PUBKLjMyMDI1QzU1T1ZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz00RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz5AQkZCcEVqSVJlYUxGpZScl6KXqZaMkYOIppOIgoeCnISDlZCQlI+aop6vvq+hxrzExMbGzs/O0sq+u7axuru7vs+1w724ubezsbWzuLOrp5yrrLmqqaevsJijr6Wno6W1wLCsrLS/w7rAurSnura5tK+Wpa2urqSLk5ShjXTCmn2XmYSOl5mMsZWbmpWSkpmZpaOVoJuXmqmdm6CgmYqNj5WcYEqWnJqUmqWWVJavn6+cn6SUrq2qpJqgpZOTmJiNnJ+nopm0qKqzu7u7qrGyx8C5pqyrrbKyo6GysrSkbWpiWVdNT0pET09QUjtIS0lHSUNDPjpLVT9BOj1FTTA3NTQ0OkI0NE1XTztKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NEVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqWmaCiqK+ZkZeHi6iWjoiThaCHhJ2Xj52hmqOktcm1qcW5wsPIysjIzM3Gv7uzrrm5wcHMtce6wbm1urCvr7O1p6SbqrS0qqmmrayapK6lpKisu7+orLa3v8G/vrmzssSyub6to6+1rLmmiJuXppt2v5+EmZ2Ok5qajK6XoZycl5SboKGonqifmZqqmqGnnpiQjZGdg252kqKalZ2inZGusqOqlKiql6mto6KepKeRkZmch5Sdop6Wsaapq7m2vbKyrr65tqCjp6ilppybrampi2BiXl1OSktGR01KVkw9TUVOS0xCQ0Q8UVY9QUFCRE8xOD03Nj9CNzVVWE8/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLVJgTVVIfmVeSEWrlZuin7uvmZSfjJOrm5GSk4mrjYahnoyjrZSjo7bGvrTAucLCx8nFws3Iwb65sq+5tMDCybXGssK8tbqqqK2tsKOjmKq0u6appquqnamvp6Oqq727qK29tbi+x7y3trjCsr7Btaq1tqu+pY+jmJKioLyfiZqgmZefno+3n6mcpaKbnKGaqKSzoJudppyoqp6YlY+Um4uWiYykoZSdop2gtK+lpJKvq5mqqpyco6KokJSUn4KPnp6blamkoaGztLq0rai1srOenKOlmpeVmKqhnnVdWl1bSEdFRkxQSU1FR0dCU0xKQkVHQVdTQ0g9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKRUBKSk5POUNANT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTlmXEZDQ51wYkdFp5ejn57DrZyXpZiZqZyWmpqPqpaVp6aVrayYoqu2w8O8vrbBwsDHxL/Nxru9ubKwubO/wse1v7C8t7m2pqSrq62goZmqqsSipKmrpp6sr6uiqam+uKetv7K4t8e2tbm4wLLAwre1s7SvvaOXo5eUnJSun5Cio6Wjo6CQvaWpnamrnJyhm6WevaGZo5+iqauhnZeNlZ6TnoePhI2Tn6SgnrWsppyVsKaZr6WcmaicnoyYlJ6DjqCZm5KlpJqXq7G1saqlqq6sm5igoJKPkJWonpRlX1dfW01IR0lOTEhFRElBPlFJQTxHSUlcUk9LPUhPVTRCRjk+SEc1Q2FbS0JOUlVXVlFYVFJVSUA4UlFQTTpHQTRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1Nj85Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5bVJGPEt4ZWFWS6Kao5yexayhnqyfna6gkqOflqSgpqmsmLaxoqqztsXEvb+1wMK7yMK+yse1uLW0sbO0t8HFtr6xuLW5tJ+nrKqsnZ6epaTBpZ+praCkqa2voaaovbWmsb25t7bEsrS4ur+0xMG4ua6ztbWjnaWVkpShrqCZop6pqKyjmsKsqZ6srpubnpmmoL2hnaSYq6uspqGajZqfkp6Jjld/lp+loaC4qqeTmLSinrGfnpmulZ2NmJOcgY6fl5WNoaOVkKWtsqqpoqKlpZWVnZiLj5GSpJ6JX2JYYl9LR0pKTkZFQUdLPz1KQjk5SktOXVFRST1MVlw5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSUs/SD81SE1YU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1prV3JHRTY9dWVcS02enqGZn8SopaG0op2zp5OrpaCjn6yprJ27sKistrHHxcHCssPDvcbEvMTJvK+wtq2wtK++xLS5sbC6tKyZqLGpqpqdpaGnwa2brLGbqqOusKmlqby2p7e7vq+3xK2zs8PAtMe0u7ess7atqqKmlpWVpKyin6Cbp6qwr6+7saagqaiamZiToqO4oKGjkrCvrKWmn5KhnpWej5CNlZ6bop6ntKemjJeym6KtmZyarI+dkpWSmX+RoJWOjZ+gk4umq6+kpqKcoJ6RkZqThYuRjZudf19jWWZkSUhMSVNBQ0BJSDs7Rj85OU9OVl5SU0o+T15dPUhQQkxMSTlNY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDI1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXmVxQDg7SJZ3ZUE0nqOfnKDDqaSqs6KktaqWs6ynoaSyrK6pu7KtsbW0xsDEwrTAxL7JxLW/yMG0q7Wor7isv8Ozt66ttrilmKqyq6uYn6aXrbu0m6iwmqygrbSyqKu5sqi6tLmzuMCqt7LEvbXGqL+vrba1qaesoZiXkqaloqKYmKWuuK6ytbagn6mkmpSWlKSgt6KlpZavsbKnq6ainpqam5WXqJ+gmKGer7KipoyXrZikq5aYnaKPmoySlpiFlZ6Ti5CbnZOKqKmqoaehmJ6Vi46Zj4GFlIiTnndiZ1tqaUxPTU5UPUJBTkM6Okk/NzdST11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMS0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNUlvaFVDV0aMeWZDO6OjnaGmv6enr7GiqbWrnrqxrKOrtLaxsLm3sLe4uMS9w8e9vcTCxsC4wMbAuam2pKy7rcDBt7eqrbK6opStsa2ylqSnkaq5qp+msJyroK+0s6uptratvK20s7m3rLixw7u/v6bDq7C2rqirq6eemJmroaKhkZihsa+zrLC5mpupn5qXk5inoLappqOisLG0rLOnrJ+coKCbnqWcopedo7Ovm5+Qk6SZn6iZk6Gdk5aIk5aSlZackoiQmpiUjqmopp+jnJebkoWOmYt9i5WEjZlpZ2tgbG1XUFFbVUFCRVRAOztJQTc6WFBkXlBXV0VZX15NTFJOXktKPlljXk5IUE9cVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURGQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS0tLiwxPSonKz1ccD0+MS4wZFpkQDE2NDdnWWBGKD84bH1nW1Y7iXtjQz2nn52iqb2iqrCspLK5qqa2tKygrbW9r7O4u7q+t7bAwr/JxLnEwsC/t8O9wLeutaert7G7vb60qa6xtp6Wq66nrpemqI6nu5+krLOeq6KxsLOsqba0tb6usbK1rLC0s8G6xbesvbCxt6usqqOypp6lqqCkl5Gan7Oqs6urs5qdp5yalY6hpqS0rqihra6usai0rbKqpJyfqKSelaKZm6i1qZeZkpKdmZ2fnZCqnJWWhJSWip2Ym5OKjZaWmpampaOfnZaVl5J/j5SFe42SgouVZGtxZm9xXkZZZ1ZEQk1YRFo5SEI2Pl1RaFxOWl1HW15dT01SWGRKSkJcYl9QTE1OWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtGREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYFUxNTA9YFZeOClDM1lVXGdLNox6ZkxApJqhpa23payqpq+ut6qvtbunprG3xbextr3Bw7W1usS+zMa5w8C5vrnDuMC4srSrqbq2urm+tKmtsLWXmKesqaybq6uOq76eq62yo6ugsa6zrq21srm4qq6usai1r7W7vMqzqre1sbSvrqahtKCbqK2gppaWm5qyo62gpq+XoaSampOOo6Wns6qhprOtqrWlr7K1r6SZnaynmpifmpmrt6OXk5COl5ygl5aTqp6akX+Sl4ydm5iVkIqUkp6ZpKKioJiWkpOVeouPhXuMioKKkWptd2x1emFGYWtZSUdaWj17SkZENkFiVGlbTVxhS1xdWlJSUmJgTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NikoOS4kOks1LiJUX1RfLzUoQ19RXC4rQi9KR1BbRzNjWVRLRJmXobGpsqqspqSvrrapt7W6pKy0t8m7tLu6v7+0s7fDwMzIvMO8tr2+v7e+vLG8rae6ube1wraqrbG3lJamrquoo7CplK+7pK2xs6eoo7K1sbGwtbG4tKmvrLKnt6+3tMTGt6m2tqywramno7agoKeyoaSVnJqVsZ6nnKCqjqmjnpuWmKampbioo7K1rKixp66xtaylmaCsqJucnpyUqbiblI6OipebopePl6SgnJOCkJSPnJuXlpWIlo+XmqecpKCRlpGQlXaEj4d7hIGDi4psb3Z0e35cTGZtXEpOY1w+YntHSThHZ1dmXExeYk1YWVdVV1RpXU9PSGBdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5HZjI3J0diTFYlLUIuPUVMUTwzcmtJQ0ORmaWvpa6vq6ilsbO0q7eyuKGrtbnJua3Bu8K4s7G1wsLOxcDBvbS9v766vryyw6epubC1tb+8rqyysZugp7GtpqavpZ2yta2qsbGsqai1u6y0srWttK2qrKisqbitsrDIwLmlurCprKylqK6xpqWjr6SpnJ6dm6+ao6Ojo5GtnqOgoKKrpqa5pay2tqWrrKmtsLauop6jqaqboJubkqOzmY6KjYeQoaCUjJScn5KQg42Skpyal5WUh5eSlZmnm5+ejJKRjZB2fY2FfHt8hYiIcHJxfXx9XFNkb15OWGZcRkSWW0c7Tm1YYltMYGJOVldWV1RYZ11RUkxjWVtUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8rMSgpKywtKiY1Ki8mMCkzODoxJiozQmM6NipIZUhKKzpIPjNCSFMsPpBrO0dIj5yqq6KqsaSppbO1srW2srKhq669zLqtwLrHsbSttMHD0cXGvsCyvsDCu763u8SmrLarsre7wK+rsayfo6etqaiksKOqsqqwq7CvsK6rs72ntrCyqbOqq6Wlo626raqyw7q2rbupqaesqaexpaqlo66qqKKfnKOtlaWemJ6ZrJ2ip6miraakrau4s7KiqqKgrK+xrJ6gp6epmaOZmY+gppeGhI6Ki56gjoqMlZqOjYSFj5SfnJSXlYaWlJOXpJucnIqSkI2Jf36HhXx2foWDhHJxcIh1a19aYG5iUXJwXEs7hHxGP1h1WGBaTmRbTlZWVVdRXGFeU09OZ1hXVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyoyNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTtcSjAuSmdERjg7QjA1RUtYMUCVWT1MRZWYraiiq7Ocqqqwt624tq+rpqurvcm8sL22wq+xq7PDw87Pw76/tMDBw7m/s8fDqq62rbK4vr6yra2qpKeqsKinqLGltK6qsa6usrG0rLS8pLezrKyvqKufo56wt6uqrbq3pbe2pKqnq6qqraGpp6eysqSnpaGhrJeqoZWboKaepaKrpK2in6exuK6upKajm6qrrqmdoqWkpJifm5aPmJySgYKQiYScn4uKjouYjY6JgouXopuQkJuMk5KRk6OZm5mKjouLfYaBgYN6c3+Cf3xydYukh3hrX2BuZldkhmNOP2eTTEVieVdiWFJlVE1WVVZUT1xdYVVLTmhWVVZJSkhJT0JHSVNRWW9BTVhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqMzk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2VlouMEpnQUE8PEIrOkpPXjREhj1HRkSXk7Cmo6uxmKuqrbastrKspqyqqbzAwLe4sru1pbKvw8nL0b/Au7m/vsG4wbnAxKyxtLGzur+9srCurKqrqLappq6vqrmwqLKyr7Ktt6q4uKaztquspamqnKOes7OpqKS0tKC3rqCqqKqoq6egq6ypuraqqqmpoqqgrZuSqqGdoKWipqOqn52ntK+pp6ujo5ilp6eqnKKko6CZmKCRjo+YjX6HjYeEnZ2Gg4mJjo2Oi4KFlKKajY2akZKRj5Ofl5iWjIqDf3SGgX+AeHSCfnh2fYCHnY9vcmdmcHdcYHKHak9emVZIbXlUZFZRY09NVlRVUE9YW2JVSE9pVFZTR09YVUk+SUhPUVB4TE1WPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzo3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMlFiMDI/Zj1OWD5DLD5MVF8vSmk1T0Q8lo6xoqarr5qspa2wtLWwrKawqqi6vrvAsK25rqG2r8jHyNHAvr27u8G9usK/vr+tsbGxtby7wrGxs6qzqaS0qKWts7O5sKOuuLKws7usurCprbarqp+qrJ+joLatqaGfsLOitaqeqKepo6qhoq2tqL2vrK6toqion6yZkLChmKKhqKifqJuZqrGqo6CuoqGUo6Ojp5iaqKWYl5iej4qHlIh9jYaEhKOWhIGBioWOi5CDg5OfloiRnJCTkI2RnJSXj4qGhnd0gX98dXh5f3lycnhmf4akdmlfZGmAdGaIi3xTWG9eSnhzU2RTUV9NTVJaZk5NVllkWEdSaFFRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS01KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBMZzo0OF89YWQ/RjFDUFtbKkhNOVVANJGQs6Glpq2kp6Stp7WzsqulsaequL7Au6+nuaqmr7HJx8jRw7y/vri9vrzIusC3r6+zsbm7uMCysrqsuKyitKeorLK2ubOoqL22rre+sL6nray1q62cqa+joKWtq6icnquzpbSomqqnqaOonaOpqKm+q7Swrp2qpKGvnJuzo5aknKWmoKWcm6mrpp+cq6Kck5yipZ6Yl6ipkpialJCKgo+Ffo+DgIidj4V+fYuHkI2Og3+TmpOFk6GMlJGLkZuSlYeJfn9ye3p+fGh4fHlzbm97ZoR4hIlkYWdgcoR6bGZ4XV5UP1d7bFRhUFFZS0xOcnVdSFpbZ1lFVWVQRD5KTkRDQTlIR0tTP2piSlE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMScvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZiQUo3R1NgVSo9OURXPSqQlbKaoKCqpqWhq6W4s7OmqbGmrLjBvbWvoritqKiwwsnJzMG2vcC0t7+6yLXCtLKytLG8uLm9ta25tb6toLOnq6uwtri1rJ+/vaqzwbS8oa+ytaqsn62wo5ymqaqknpulsKewoJ+rqaehqZylqaGtvKiusa6hq6Okr56fraaXn5qhpJ2fnJqkq6Ocm6WllpeVoKOXm5elrIyekZGRi4KKgICOgHuZlIyIe36LhY+Ni4mEkpiQhpSjiZOSh5GakJOBiH15a352eXhjfHpwbm9xdmd/c2mEaGVnXmxzjWxgaW9gbz1aeGxVXU5QUktJTVRaV01dXmxXRFdfT15QSE1ERjs3SEVLTzxyaEtLOUFFOzs9PTs7PUo0OUI8MztHPDQ/MTgtNjg7MigwOS8sNC8uPS0qSz4pHTQ5JicuMzQuMCsvNCYsOiQ0MUFoWTE0Uz1lX0RMNktWZE8qOzFOVz0jlJmtmqCYqKWkoKikuLCvpK+wqau4wbmyrZ+5r6uotLrIy8i/tsK+r7S9t8S2wrGtubGzwLS6vbeoubi9qqO0qKmqsa65saucvL2lsMG2t6KvtrWnpqews5+epKaooqWZn6yoqZ6gqq6moKaYpKmgsbmfo7GvoayhraScp6apmpqbn6WWnZ2bnqqnl5yhqpOZlJmfk5mWoamRmomOkIZ8h36CjX18oIyNiHiCi4SJi4uFh5OajomVnoiRlYKLl42RfYV8c3B9cXR0YHp4aG1vb21ofXFie21pZWJcZIR+XllzanFKSX5pWFlNUExKSFBSUUlPXV9uU0RYWlJoTkdLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLjo7ODMmMjwwLDg1QiopLUIqLDQ7Tk5AOzczLS4rLTcqKjwlNTM8ZmQyNE0/ZV1GTz1RWmdIKj4vV1U1KJeep5qdl66hoaGlobirsqW0tKmoucS1sq2ft62urbC0xsjAtr7BubC0vLa+u76vqr2wtL+wvMO5qLu6t6entamorLGttLGom7+3pq69t7KfsbewqaWnr7GboaSgpaWgl5uwp6Geo6ivoZ+hk6Wlo7ewoaaxq5+so6+YnKqkqZ+Xmp6llJudm56nq5qcnqaXlpiWno6Tl6KoopCJi4+GeoR+hIp6j5aJjYZ4gYeDh4uNhY2TmI2PlpmKj5d+hpeMj3mCenByd29vdF95d2Rqa2pnZ4JsZXJra2RnV2Fyf15Za3VpWUV9XltYT09LSEhSVUcyOl9ebVBEV1VZZUxISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRIQmZbSFRDVF1oRS47MV5RLDKWpKOYlp2rnqaho6G4qrChu7ilrL3Esq+uorWvra2vtMTEvbO+urews7m4uri6ra2/s7S4rr/Bt6u9urSlorOrqKqzrK6yo53Dt6aquLesn7K7qqelqK+rmaOnnKWmlJihs6aZnqSpqZyhn5SmoKS5qKSnraaepaGpk5+poaGhmZueoZObnZeho6ycnJujlpOVlpuOk5Ojp6SQiIqOhnmEfIWGfZyNiYqGeICDh4iHkYWVk5KMkZWUjY6Ue4OXj4p3f3xsdXJtbHNieXRnZmlmY22EZmdoZGZnaF1kYmllWmV6YmBQclRbW1JLSkdJT1NAICpqXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1OPy4rLTctMTE5NSwmLjUtODA1NzZgdEIzQ0RoW0tXR1VgaEIzNzdhTCcyn6Slk4+mp5yfnp6ktq2oqrq3p6vDwLavrKK1rqevr7fBwL2xwLaxrrK2tbm4tayqvLOvsrC9wLeuvLywpJ+2rKamtaqrr6GhxaypqLK1rKy0uZ2oqquxpZidqp6npZKZpa2jmJ2kqqGboZyYoZ6nt6avqq2hoZ6dopWgpp+ioJmcm5yUmp6Vpp+uo5iYn5aVjpWYjI+YmqegkIeKioh4hXeCgoKch4qCiHt+hYiGhJCDlpWPj5CRkJGNknuDlY6Fc399Z3lwbGtsZ3Vza2FnY2Jzf2FjZWZlaGhhZW5ZXVhcbGNhTGdXWmBWSUdIS01SWD45YGxpSEJVU1xbSEhGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKywvQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNAYkYlNZ2koZKMrqGamaCXpbSyo7K+t6Gxxbu5sLCjtqyrrqm5vr27rcCyrq+utq6zubKnq7mwr660tru2r7m+rKadtaugobKlq7CfpsWhs6awsrG3rbSdrK+srqKZnaeqpZ6Vm6emoJmlo6icmp6blZ2drbCmuaeuoqGamp6Zn6OapZ2Xn5iblpuhk6qXramclZ6dlI2Vmo6VlJinp42MiomOe4F0goKLmIWGfIiIhIWKjIiShZSckpGQkJGXj5B/gY2Ogm+Cf2d5bmlramdxcmtbaGNhcX9gZGdqbmtlaWVjbFxsbHVwYVNiaGNlWklGTE1PWVFQVWFlgVRAVlJaVEZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OjUjMyopNi41NTQ2NVp8XTE6S2pbTVtLWGRjQEExSGJCJzSUo5yPj7GdnJWhm6mzsJ+4wLagtMG7vbmxprawqa6luLq4uKy7r6yrq7eqtbmtpLO1sa+psba2sbO2u6epoLaqnp+qo6qunazEma+msLG3tqyrnrCtr6qim52krKmblZympJ2aqqOklpqgnJKco6yrqbqepqSgl5qanqGPa6OWmZ1xg5idpYF2kqypn5aXopKKmJmAl4qfjniFko2DbWl+d4RxbIaKhn2EioZvXWRgZ4SYhmuLkJSSdXiLhH+DkH9miIBodmlmV1xpdG5OUGpjZXGDZl1kZm5raF1bXYmQhYdoTktDOEVUZ15KSFBQVVZLSFJhcHRlRltRVVBGR0ZDPjE7PTY9NjwzZlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyNzZYgWwxNU9rW05bS1tmYj5HMU5hPCsvjqSaiJaym52UoZyqrqyjvcWvqbfCuL68rae3saarpLi0s7Owua2pp6y0pbG1oqe4trWop622s660rrSiqZ+0q56jpZ2nqJuwv5Wop7C1ua2to6isq6uloZ+coainm5ihpaacnKeonZOen5mQn6irpLSvo6KjnJaYmZejiKGPkpuIoYiVn6KApYCorZ+UlJ6UiYRyeIyOg4igdYeNaZeJZn5zeKBvh4eEfox8f6Ggn5l/fIefdIiOdpuKbIeCg21oZGR7bXJiVIZtY21pmHFYaW9uhlddaFpralqIcGx5codoh4RZXkZOPkZeTUVSVlZRUFJXVGdeTFpMUlJQRUZHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STovMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN0MTVSa1tOW0xbZ189SzFUXjcvKI2nmISerJ2amp2fq6qoqr7Dr7K5vLfBv6qkt7GqrKazta6vs7arqaWxraW2s5ustba1paaps7Gtsqiunqqhs6mgpKWboqWesbiVpqent72mrKapqaynpaGfmaGoo5mZp6OkmJylqpaUopyUk6Smp6G2pKOfo5iVlJiUnIiukJiViqqMmaOdhrGBpa6flZuhl3qC1Kh/h5TAm8Z4d7Glt5ZkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyXsauxeWhsWLGubmVpvJK8bmh5bXGP2H1Sa2K2sn1+cJR1mqGqkFZOV2FPVk5GVVxYUFBTi1tXW1BAXERQTkNGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQUUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzExVGtcT1tNXWdcPkwxWls0MSGPp5SBqKqfmJ2epa2yqrDCvbK1wLW3v8KrprSuramosLWqr7a0qKimtaWoua6csrK2qqWkp7KvrrGmq56npbKloqKgl5yioLKvlp+kobW6o6mooKytpKKdmpqjqaCYnKmgn5eeqKiRnKeblJ6ip6OhsKOen6OWl5OYkpmFr2tqjI6qf2iFloetZnGfnpWbqZdxrqGkfne6fGugj3axX2q0W6WAZZyQYGaBemZ/aXhqqWW+cmemjHaxanyxeHWRlGNtbaduXISgRWlnh5ZFdZxgfWZ7o6aBWF+Lq2h9j3h6aqg4Sq9bWFRsY1pLT1hfXFZWO06HUFdWL0lTU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLy41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpNNV5YMzEbkqKVg62npp+jpauyuK20vb6wt8WyuLrDp6mwrLCpqrGvpLG6sKSlr7OjqrmpnbKysKOkoKqtsKyvpqifo6KxnKSemZaZnZ6wqZicoqC1s6Gqm6GtrZ+dmZeho6mdmZ6loJyZoaikj5yimpehoKyfpqagmp+hlpWRl5GahrWbtXmHqZq2mXeHs5u3f5SXmKyXf2uBpnqBhYaRlJJ3q2dqsVuse46HlHSJcI6GgH+IkJd4g4KKl4yDoI+FsHZ3n3Fra218i0+lWEhjY5l+Y2ilX3lxdVKShl1QqW5jcHqFgGGdL1KibltUa2dgTEtcZFhcWkI+sHdXWEEjTWlGQkRBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJBQUQ8RkQ7MDIwMTtFLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SjlhVDUwHJeglImzpqahrqmos6yqu7fCsLzDrbm2wqusra+vqK+zqqKvvKuiqLatpKy1pKWys6ijop2nqrOpsKimn6CgsJegm5aWl5ugsKScm6Sota+hqI6pp6qbnZaYoaapmp+do6CcoKOlo5abnpianqOrnKaanJqioJeTkZOTnYTVk5m5cbHCf8aHfdaUnLt9nJeoko+djaR7jYaigaWCeat5j51Wr3uJfp9quVq5d4aEfaaClHyZeqp5jp2Qe7FtjoR0kLuGb5VQr6fFilGgemNgqmJzcoZrlodeUrW0yIV+iHxjpDNCnXVdUGpoZFBAWGZZZGFKR0xqSlpTT1lmWkNDP0U/MDw8NTk8NzQ8Ozg9OjxDOkY6Oz42OkBDOzZAT0xIPDk7REhDQkNEPEVGODEyMTFEQi4wMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbSltQX2ZUN0g6YVA3MiWco5OZsaippbOqpbWopLy4wbC6wLK3tL20tqiysaSys6egr7apm6i6rqSwsaGytLGhpJ6eqKmxqbSpppyen6yYmZmYmJaYo66fnJeorbGpo56PrKKnlZ2XnKGmoZiioaKhm6KiqJyfoJ6VmZunoZynlZuan6GYkJKVkJ2Ism5otXKsiHCPp3K0dXS2e5yZpo6QnY2jfo+eo36wdYKQ0tJ1XK58hX+kbpuqpmqGhX2tfZiZkHuxc5Odj3mzZZZ0hZ5un2aUUsmLWsJcn3liX61fdnOFYZaIXVnKnW/AgHRNS7VTVcZkVVFqY2VYQU9qX2xpUFVGSDk9V1JbVllIQj9KPDI/OzU9PDU2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEFOVF9lUDVHPWFNNjIuo56Rpa+tpam7raa1pai2u7yzu7+4t7W8vLSmtbWjs7KkoKywpZinu66lsrGdtLiqoKWdoaqlsqisqqWanZuqn5aWmZmTlKSropiTpquxpqGVkqufpZKUoZylp6CVm6anopujn66aoJ6ekJaco5+dpZSdlZmjnpWZlpObhax8eKh3o4+Lh6pwrouFqISamqOLk5qLon2Sl4euhH+Bs1xyslOvfYKCo35x1313hH6PnYaZmnevhoqRnIh3tGGaZZqCgZVskluwV0uadZh5ZmCtXnZ2hmeXiGpdr3eVn493bDV5yK6zX0NUb15nYEVQbF9wbVZVTS5lY2hSWVA7QURATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDM3Njc9UGtlPiZWZ1xAPVZfY042R0JgSTo3N6CdlKC3sZmzwa2osqeqsrq3tbm+ubizt761prm1obatoKCprJ+VqLasqLGyq620pJupoKCoorWnpqqkmp6WpaGUlJ2akpakqJyUkKetsKWglJmon6KPkaKaqaahlZqmqZ6dpJ+tnaCdoI2Un5yfoZmYnJWWoqCUmJGmnYapfn+meaGPkISqcK2Ng6eGl6GjipiXiKOBkIaUqnp/i515cLFaqIOCiKB4dNh/dod0p4GOm42SpHyVkJ+Ee7JenGSgfYKVbpNcq1xbk3+Rf2hnqmNye4BqmIZxXataiaCPa25kT0pDoVxaTXRdYmZNWmFfcnRfSlU1SpqRWEhFPUdFQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjAwMjE1NCsqMDUvNywmMjEoJCQ2NjcxPE9lZEEmVWZbPzFUX2JMN0ZIX0MxPTeinZqavq2Ys8Guq6yop7WxuLG1v7m6s7K5vKq7tqGypZ+mp6eek6uyqbCqtq2qr6GYoqCmpKS6o6OsoZeckqOglpWfm5WZoaGRjoypsLCmnZaap6afjZKkmKirqJWYqaifn6CkraOgnqGOlaGZoKCSnJeblZ6hlpePq5yPrm5ytHSpjHeLpnS0enW0gpSnpJOdjYmkh451uG6Le4uia2u2WqGGZZeXaKCip22UcrRzk5l/s2qFkoitanW0YZ1mom6GkmuXXK1gTqF8h5FSc6NseX9+bpiGb1yvVjycd2VUb24uW6dPYlJrZWJsWWJcYHB8Y1NZUT4/bG8yQkJAPk06ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKywzMjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUE4pZqcnrqjnLHArq6rq6i3qrivtcG1vbKxu7iswreqrKGcp6SinZKrq6i2o7Oorqqhl52ooKWruJ2jrpyWmZCmo5eOnqGcmZ6fkZOVq7awppiTm6yployTppqlraORl6uypKCeqKywmKGikJmhl6CblpuXoZOdqZ2UkKuZh9OUmrt1scSAxId+1pecuHmKkpmOmIqMp4d5orZ1fXd2woKasmGDunnAfHW4YrWBjIepfZaCrKlxe391vIinoGmdYaaOr6F9jHSHq32+bnO8dLKDdXiBim2aiHBtjaR0vV13fVthebxqWlZbaXleaWBkZmJteG9YW1lDQUBxP0NHKzRIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw7OjA4TFhhRidUY1g8L1ReYEs1PExcLTZAOaean6K8o5eww6+tqqqtsai5r7fFsbuzr7ywrsGyraajn6SinJyRq6WqsqW1p62kn5aaq5mnrbido66ZlaGRpqCTjp2jn5mfmpCWk6+5sauVlqOnppSQlqWdpK2fkaCoq6Ccn6mksp2ipI6moZWhmZuWlaSZkLCgkpWqn4WQmbaAkpKNuJZ4g5ObtndubG90b3mPhI6Jcp7Au7yae4GyqHCBdJG5g3yGhouGjHuKh4yXfaS7ub2cdXmzo3R1l3V0sHWYnmaGaY22dHJxd7aMXn95fYhng3lseWKLrHB0hX5YW6dpRGRZVGZfY11jUWdmcW11Qk1PTEQ7Wkw+SjM8MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQktOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JXOCpPXV09KztWVic9OjymnaGhv6aVssKzq6qorKuqu6+xxq+1tLC4qLW5rqukoqefoJ2ZlK2lrqqntqion5yWoaSerKW+p6Gql5WckaKbkpCiqKKTnpeSmJSytbasmJ2jpKKLk5KmnKarnZappaadm6Gpp6eiqKCRrJ6Xop6Xlpidno+wqZScp6KPa39qnKl5iXR/m492e2aIe72+wLpvkoNxlIVfcmpaXpuJYWOHj5ZsYH+UY22cdmKVbICZlZRlXmBjcZqJaHKMe4aUZmp+cHR4fn1iW3h0gWhQXG6EfHyKaldseoFySUpvhXBOck1EVlxmYExaV2ZjX09abXZqclJPRERNPEhJPEw+MiwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNUNGVUVKT0hGUElJSDs4PTUxOi4xOzouLy03Nj01JiIvKjIsJTs4LTdJUl5JJ1NfVjQpUF5MKDM+XE8nPzI+qJ+oocGkmbS5tqOspq6nqLWyrMissLSttqS+srOooaSqnqOcmpqsp66kpbWqpJuYlaKcp62pvqippZWUm5agmpOZpqmokZ+Qj5icsLK+rJqmnaeiiZOSqZuopJycrKCjmpyjp62in6mhma6blKagl5Sen52YsaWZoqiZnZKfnaSmm6ikm52anJuRl4Jobn1yd5GXlJCEibSqjYWYlY+KjJiXiJSViYOTk5CJjZKUmZOZl5qfoZqblJ+bjYF5pIVsaXuQfYB1iYuCcoJ4eXZ2in98iWpzgXSDdWR3fXZrb3lsX2Jbb2dNWFlmal9XWXB6b21mU09GUzlQWk5STygrOktCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8Ojs0ODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSidSXlQxMFReOis9OF1LLDwtQLKgs6K/oqOwsbegqqazp6awtarJq62yprWmwKm0oZ+lppyllpWhq6eto6S3rKCZl5agmK2qpsGfrKSWkpyXn5iUlaOfnqOok5CYqKiyw6+Zqpyqno+Wlqmeq5yeoa2YoZudoqWvpqGkp56smJalnZmZoZ6enbChnaKnlpmUmpSho5ekn5mhjpiVi4uOkJiuj3yVm4KRgYmpqIWAmJaLhI6fiHuEkYWFmpGHhoqVj5uXjpCYnqOWmZKQnI1+jWWhs66EiYR3e5CKfnd5em9neZGAgYhqdYF5iHJoc395dYOGgWp0YnhlX2hkY2Rmalhre3Fqa1xTTFBEX1VGQD4/LDRARjs0NTs+QTs8Pz4+SE5OT1BTVFZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzM5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LECzoLmvvq2qrbGyoKqmsq2jrLOwxbCrraSzr7yktJyhqKOhnpqXqKappqSms7WflZWempqwpq6+oayikZGempqUkpainJepnYSdqaujtMezn6mjqpaWmJqnnqmcoKWslJ+fnZ+qrqikoqugq5qen6GYpJ6cn52wpJmfqZSZmZ6TppuZqp+cl2aFk31lf4+bkGN5jGxoanqQo6tqZZqYfmeFi2VlaWh6jaKOa2iMmJGid2tqi5mjn5hza216hIyGeVhlXYWBXmyLioJ3XGdzd3eSgIiBbneCeH9zbXmEc3aIh42CemiEWF1qc2Rdc4hpanxxbWNdUU5WSWRYQEkzPUY3P0ZENzE8PT9BQzs7REdISElMTk9SUlRXW15gYWFgXV1dXV1fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9BSVtKLjZaTzYpRVkvRE8xWUI7Py49pJ66vbmvq7Owq6Wora6wp66usL2xqqilrrCwoK2XoaSeopqapqycraSmqKmzrp6WpJCjsKa2uaWuo4+PmqKak5KboJmZppZ7pKuiqLTDt6Whpq+enZWeo56jnaSqqZKfoZ6gqq+qqaKqnqabpZ6noKuWoZylsaSXnayWop+blKaZoKyZn369hIlztHOFn4ataHe5xLhxkqGjeqaYmXSrgn3LwMC6cYujh4OefZaYiJ7AvYKWnZ2NnMHBe4F6kYyawsB9aqWyb42Bb8p6f5t4koSPgHZ5gYB5cXuAhnB3hYuSeGx1kWJlXndjX2WAYl50aG1kYlhLVUlRWUhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9gYV9eXl5eX19fXVxTTVBHVU5BQD89NjQ2ODI2NiomJSMpKiYuKyopMTAfOSojPklbTCojQ1AvI0ZbM1BZL1VBQjsvOJWiucO0r6+/qamUo7CqsK+uprK1r6qmp6axq6CrmJujoJybqqeinayjpailpbSknqOTpq6tuLSnr6KSkZmdppORoKGYm6CeiKarpKutv7+xoKivqZaRn52imaOkqqOToaGenayuqKqlo6Gkn6OknK2pkaSbqa6qnJ6rna6jl5iml6KkmJ5/zpR6e6WCepaXm1+tj12OqIChoXynlZt1q4OBr15kjKp7qIeFoHSXk4izY4KrhqCNjbNqhK90fJaHuGGCrVmjzW6Qdnvbe3+ZcX6Ik3Z/ZXuIdXZsfodtfYWPkH1rgIxfcGpvZmBfeGRbcWhqZGZgUlRTV15KT0M1QUhFRDg+NTtAP0E7PThAPj8/QkRERklKTE5QUk9TXF9fX15dXV9gYF9fXVtXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc6U0wrLC1KMCc7WzpMLSFQQEY0LjGswcC/tLSwt5iekaOqqa21q6ayrayspKymsKqhp5yappicoq+foZ+op6OmoZ+wrJuelqaurbGrqKyglJKbn6WTkJ+ll52oo56to6qwqL/Fsqepsa2Wkp6copehqqqflaGenZytrqapqJulpaKgqpKss5aloqqqnqSnp6KyopObp5yhnJaVkZehcoaMmHaGqIdxsXydcax9oKCBpY+eeKuCfq1/nXKtf6yHhp92mJJ7fJd+qoiijJGLnH2reoiSj59/eq1WnMR7kHCSwX2BlW11cIxtZndlhm9heG5yboiJj46DbI+NY21zdW9gZm1kX29pam5mY1dTXGBaUlJDOElJQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkxNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLTwoPTEpM1ZARiEcRztDMS0rr9PGx7Kzn52jj6Oioq2vt6+psaeoqqiuq6unoqSdmqOVn6aroKKmoKioo5+esK2Ym5aop6+tqKepnpeVmqSikpShrZudp6OvrKKstam5zLGspq2rlpScnaKZn66snZahmZ6eqbGnqKibqqejoaqar7GiqKuuppqnq6urs6STmKSnnJaThaRrpHWKeql1e7JxgqWKmIxwiKCbh6RfYVKrhYCug5x1roKohoafepmXhntmgKOKpJiGgaN9qX+BlIauXnuoVZ2ikoF7o5+AfMSwxYxzr7SzuXJiqa/CdGiLi5aNgGuXkG1reHh3bmtmZGRxcWZ7aWNcVl9pWFhUTExRTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYGFgX15dXF1bU0lCNjc5OTY2NCwmJCIgJychKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8LJ1dbAoZmrqKGvop+wtLCwqa2jp6eqq6uopKagm6WfnaanpqSdrJqirKGjn6+jnpuTqqS1sK+hqZuclpWnpJGboqifn6acsKWiqLGstsextKirqZWRnZ2hmaCls52aoZScnqeqqqKtmqqmoKGporKsoaqzsqKcq6mxsLillJelqpqdk32qbZ+DiHareXywboKki4mflpWeloHSuLS4yYGCsl9hlKmDpYiHoHqYlpp5qsl0mqOUqKmQkpqMfpqJmsbGd2WhgqVzgZ+Ogn2vX2+1Y7F1S6OGbadHg5Nkjo+bkXtvlI98bXl0fHptW2VqcnFmgGleYVhjbVxeWUlMTEpFREJBPUE8QT9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9fXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00TlRRHRw7PEYyLCSopMDGua2psq6tpqKcsrmsq6Glm6imqqyppqCmpZiro5+vrJ2moa2an6mlnae1oKOYlKirtrOsnKacoJaQpq2Smpyno6Cqp66ho6epsLPBsbKprKeUiZidpZuipK+ml6KVmJylpamZrpyrpaSdq6O2rKGxubCenLCotLS1ppaZqqacoZCDnk53moKAnnqEo3yCpISGpp+cn5SEuHx8ermCf8zGw7Z3m6KRi59+mZeXinafl4qkmKSnfq+Fm4OehKx9mZRhpWyjcI+FkIF9loRyrGCkc3GAmmG8fVJVdY2RoZV6fJCOh3J5coR+b1tsbndyaoFuWmNfaG5iZF1MTFFTQUhHRkg6Oks+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUV1lZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1RGPEUyOlBbVBwbNj9HLC0gjIeZqaykq7mrr6CboqyztaafoZWlr66uqKeepaWapKehs66iqaezoJqppJSjtaOjlZehqbW5pJyjnaOTkKKymZ6bpqWgoq+tnKSoorWxw7CtqaypkYaRnKedo6ScpZeemJiZpaOnmK2hq6Kkl66lu6yit7aunp62tLqztaiaoLGkpqCIkNK1w7d5h46FkZOPgKZ4lKJ3jKGShaWDi3Krh4a0bnJpmaSdlYmffZeZh4eQc66CpZujjaaKk5yIlJCabXCyXKVzk3qcbJl/e5l+bqlhonJyfqBic7K4aHeOkqSXfImKj4h1e3iNgWxod2l4c25/dFxkZG1tZmhgSlpXWDxIRj9TM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYF9dWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCMpJZJyjYquv7+8u7Wel6ikrraiopmVo6qnramqmaWin6agoLWmoqmnsaSUq6OPpK2knZCamqq0tKSdpZypkpSXr6CgnqajnKectZmgqqO1qsKvqKqooYyEj5yioaajlZqanJiamKajpZepp6ugo5uspryslb2wrZ+jsbW7rbapnau0pquafKiRfXyweIuApKWInG2yb6GHrXyij4Ool5qBrImGrYWglKigo5eFn4GZloF7kn6rgZ2Zlourd52gj4iTkn95r12jgXymp2SegHyXdWquXaVscoWZXWBbjKBtlI+kl4GSipOId3mBln5pbH5ifXRtf3lfZ2Vwb2dnaEJZX1o9SlMyUzhBQUM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pYU1BPTkk4MTUyLiosQVRWVlZUVFVVVVVUVFVUU1NWV1dYVlVWUUhGSUojKCi8kpuEqcbDt8G0n5qtoK65pqOOmqOkoK+uqZ+jnp2tmJ65oKOrobCqmq6hkaqppZaKmpCtsaynoKibrZiZj62ioZ2loZmknK2Xn6iltqi+rqSpo5+Lf46bm6CmnpKUmZuUmZmlo6KYp6uqoaKeqKe8pJfDraujoq20vK2wqaO2sautmnevfpGLnIaHfLqtiZhksIxllq59oZCEp5ecgq2LhbCGqJqkoqKRhaBcbGuCs2B/rXx7goGybGZumZeLiLFafbRbpINryKJmn4F8u1l2tVqyfVOvgXqsWIChbZeNppiIlI2Sk3h3jJt8Y3N8YoN3dIB8YWlmb21mZWZPVWNcQVRdPUgoPjk9NCEhLCQfMi4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYWJeX1xbWFVQTUpHQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsbe+u7TBs6Ocraalt6mgi5mgn52ysaieop+dtZigs6iqq56wrZ6snJWuqKKOiZuOr6ypp6Oomq6Tmo+pmqGdpZ+Zo6KlmJ6iqLGou66kqJ6djnyLmpahoJmQkZqckZmXqJ6fl6etpaOkoqSpup6gxqemqaGstreusKmhv7CwsJiCqpKjr46bgIakl5iQgIC4w7qEj52ThaiZnYOsi4OviqmdmqarkX7VvcKqYqS/vX1/o4KD17q3tYSUkoKevb6EaqOBb6uEbp1/erKxx4Nrq7G9rHl4or67dICVjKSZjZiNk5l3f4+ZeWJ8eWSMZniBe2BrZWpqYlBiW1NpXEBUYEJMKTw6NC8fHyQeJTIgHCQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVtLSxwLmyvbOina6nprOmnYyXpb+ptq+nob+mprGbnrGcuaifrq+lp5WUr6yXjIOaka6mo6yhpZyqoJiKo5OmnaebmqCoopidoKusqbisp6Oal5J7h5mRppuSj5CYmY6Xk6iYnpaoqJ6opqCiqrqeqcWjobCkrLS1rLKso7+rsrKcdXaqpbeGZYqgcGeskIqPbm53pZCboIJ2sZuXcJGOcpeqpJuZr6RybG1tZot4b22DmXGAemlwaWeJlpWXcWhphYZncYZkXYpjaW9aXWd+eKZgYnKQknBmZICNko2glZWXjZKaeoWNk3RkhndnjGp4fnlkbGNmbGJKZFdJalk6UGREUCdKOSsjHCAaIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1pcYF9hXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola20qbq5srSqqaKun6SzqpmSvbHDx7y0qZ6/q6yjoKeroLqjpK6sraaOlq2qkIyFlZatn6aqop+ko6CRi6WSppmpmZajqaCWnKWlpq65qqyZmpOSe4SXjaaXjZGQl5SNl5Smk52Wp6KZr6Wdoqu5n7DBqKW0p62xs6ywrqq8p7G7mIyiqaa1nImXo5iGqZuQlJ2SqrSanKStorSYpKOfoqOeo6Wil6ynjJKTjYeTnZ2VkJmTmJCNlYR/pJqXlY6Lk5KKkIeEfmeMgXSDd3SHjHGnbX2Wk5SUgYGPj46Nm5Gdk5STnYCFkotwaI92b4l3dXx5aWtkZG9jVWFYQGlaR2JfTVgrRT0rJiE2NDAvHxwgJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5fYWNdXlRRSkVDPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqS1t6+uorClraCgtrGRjqrEvMO5tqmhpJ2bpZ2wqKS3p52ptaeokZiso4uIiY+cp5atpKGaqJ6fk5Wkl6iaqZmUpqCjj5qnmKC0uaeqmJqQjHuBlIyhlIqVkZWQj5KXpI6dmKiemrSjnKart6ivwq+kuKewsLKvq6y2vaOywJqTp6SmtaKSnaefjamfjZKfoq2xm6Kks6uzmqajnqasoJ+enZitnpOaopyUkJermY2YmZeQlp6Rh6CelJSGk4yPjZWMgX9mjYh1iHd6iYR0nGqIkpaVkol9jJaRkJaQnpCZkp2BhpaFeHGUcnmJf3F7fmpuZF9waWBcX1ltYlBgYk9YOUZGRT0yPD04LyomKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGBpYGVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iWpKijsLOsrqOpp62gqLWqkI+bo7K5raqroaKZepyhsKSmsamXnLimo5SYqZyOhoqJm6KQr56klqigoZKXmZyui6uWj6iZp4yYqI6duLWjpZibjYh5gpOMm5OJlZGTkI2RlqGLnJ2nnJ23on+DrrWisLB1pL+ks6B5e6Kttb+XeLCmoYqAqn9kXGJ3oI6knoOWfm2UtZ2kqbCspWagoZR0epuZcIGZqplsf6SpimWcpZyRl5iXi5KbkISdm5CUg5OHjo6SioV4a5CIdodxfIaBgWFpiYyVk4xbdpWRZ2eOjHF5oZWVZHiXhYB2l2iCiYJueX9rcGRfdm9ra2dbZWNhYW1RWT1NTU5SRj1AVEI5MS8eHyY0OjMwNjY3ODw7PkBBQkZIQkdGSUtMVFVVWV1gaGZnWFFJPERHPDlVUltgYWJgXl9fYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuqpamuo6etpZKVqrSusKWZqaWql3OLnK+gqKunlJe5oKCPnKSekX6IiJqejayapJWnop6Ol5KehXWuj4immqiRlqOIm7mzp6CYmIuJdHaSjZaTiZOQkJSMj5OfjZmepZibsZWAjJu1nbSMko+9qKJ+p6N7pbG6g46PqJ+EjIaPsamvjIqWopp5gIushp2eo6mrqYmWh5p3pZx7iJyBmKeDgXuds3uKhqCYmZSYloGQlpaDmZpieYiRhI2PkouEbnGQiHqCcYGBhoCHdIiFl5N4lmiTdKCac3uZgpuZhJh+kYiBgphpjIyEanh7cXBmZXhuaWxqW2RpaWRxWlxHU0tRQEU1LVlUVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1JYWlhbYWFpZllRSDlETDw+YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZikn6aurquoraCpsaenqqWZk6zEvK+glKWntJ2Pg5yrnKeioI2Qvp6ZjZ+aoZF9ho+Yl4isnaOWoaGSjZSJhoCRqI6Hopyjk5adhp65saedmpKOhXB1j4mVkIqUj46bi46RnpCVnqOUnauHn7SJtJqui8qIq6+Kt4WNsISzsoapjqmZjZ18qI9ye3ecjqaWaJWkebSMoaCoqpOZwoKAq4mZoXKegJulfZeFlbOBoX2hk5+PmJiAjpSciZiSi3yFlIaNlZOKhG50koaAe3OHgYR9hXWGg5iBj8VmgKmHj6JqnYGdl4CZgIqMg4iYb42ShGd3dHt2Z2h1cGdoa15ibmxmaldkRVxQTDJFNDZNYGM3JjM8RUdEOjYzNjU4Ozg+PT0+Qkw/TklKTENQWl1cV2JeamxcUUU9S01ASWRYXWNmaGdiYmJiY2NfX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXo6CwqamopqygpbmxqaummpSeoaSpoZSjqbWir3+gpp2lnp2JlL2ak42gkp2QeYOWlZGIq5mcm5qihY+MdpubjqCRiJ6jm5aYl4aiuKylmZuMjH5ibY+Lk5CMj4uMl4uPkZ6Nkp6gmKCnfqGnh62doJaukKCenZGHgqGNrbKIpI6sm4yafqJ2gJmUa4GrdU2reIeNnZOcqqmCqqt+hKF8e6dqnoCTbGeXhpi3iZ5+bmBjWIOXf417ZGeLc5l9eZdsXHyXbmBTcYVcYG16hGBZZYJ+hYGZcaiqa4OjbnKlb5+Bm2dknmxabIh6ZVlfgn5hV1BvdmVudHFqam9daW9samdXZk1cV0U4QTRHQ15rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSS01CSltdX1deXmN1YE1FOk1OTVRiXFtmZmlpYmJkYmRkYmFiYGJkY2FiamtkYmRkZ2RiZ2VhY2iYl56guaGqpKaskqK2vauvopmWnqClq6ufnK20oaeRoJ+gp5yZjpm0mZCLnoyVi3WBlJGNiqaWlpien36ThYWso4eckYqYqJiZmZGHpa+mopWZh4mAaW6IiIuOjomKjZGLj5Ghi5Kdn5qhpX+TgY+joZSgd5yWkKeDo6mAhqywh6V6jH6Emn2icHOTh5V7nox5bYeci5qSnKqcj4edfYOidHemZ55+d6VemHt9k3Oibpi3tLpzk4iBgLaoZIHGuHxxlbaMcYCbo2N0rKthfmqds35ufoiDj4OMmHGAo2xyo3Kegn2jXpyZs5Vve5ees3RyW56ygmlicHR1cWhvWGprcXBkW2ZcYUtDPUQ1UUFZcDI8UkdfSlI9PDM5NTo6NkM8O0BJUD9UTk5RQEVfXltZV2Bge2RJQzhMV1VWY2FaZmZra2JiZWFkY2BhYmBjY19gY2tuY2NkZGhkYmdmY2holJaVo7mZq5yToI6luLWtraCaoZuio6SsmpqxrKuSl6CZoaWZmpSerJuLiZF4i4VxgJaNio+hkJOUnZd9kYqOqKCGmI+KkqKTm5qMiqinpJ6PloeEfmt7hn99j42Di5CQiY6Tn4GVm5+boJ+LiXecmKKNoHKhjImpiZ2okZiqroGujH56oJl5o5N4gHOXiIycfZWfh5uOmp2oiKNkoX6KlpCbjW2eaJuOb5qZe4CKp31yaHSqg56Dc6pnlJpdm4V2hJ1oqmqBuGZcqXCBnGGVjF+ndneKioCdaJp1h5OSmI1+nmyYj2qmmVyofne7an2pWo6EXbNnXG5xeHdraVtwaXd3YV5jVmFBUEVON1ZCUm00SlpaXk5aREAxNTE7OzdIPzpDSFU/WVNYXT5EYl1WYFFhZHxpRUI5TltdWGRmWGZmbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZGNpaGdraZWdiaq2nKiJY5WcrLuysKydpZuap5+drJmdsKeqnZejmqKfmZaWoKOZhomNaYiAcnuXh4yWloSSlJiPeouElqSciZWQhoudkZybiI+ooZ+ai5CKgIBpgYZ5f5aMe4iNjoeOlZl9kqGeoKGTmHJon4qgj4xwko2CqYmaoaWqoqp+sK2koriXdqOzoqN/iJR4nXqqmX+ij5+dmYmYcqF9h42wtX1smpGheH6ZtaOjq6iEmXyafJyaf3SqWl1ve5eMeJ5iTX97e4VkephCTZ9ZompzfI5vgoqEmXabeYeJsbN/fpqSpnN9nW1wfJRvmXJpo12VdkhlY2BzcH19bmVfa2d1emJiXk9dVlxUVkBZRVBmRFJWXGFYXklEPUI4P0I6SEU4TEVYQVdSWlZFRmFcWmBLYG19cUVDPFVeYlplalZnaG1vYmZmXmFgXF1eYGhiX2VjdmxeZWdmbGRlbGhobGmUnYGxrpqEVF+hp7S6s7OpmqKLmqmbm6eSoKujoKePnp2dmpmVmKGdloeHiXeFgW55lYSQm4t9kZOWiHKBiZKhm3KSkIGImJSfmoSOqJuZlYqKinyDbISFcYKhjHeEjIiGkZiUe5Gin56jiK6GfbWEj56de6aWeqmCl56RjKOgf6doeG5+mXOgc3F8nYWYb5OCrXykhKefm4KkcF6paHajZHCmYZzTj3x7mXhyc2OihpB+onKjkHZrkLOLYIKYinSqsqi8f3eDbn+/pqq0Xpxvf3KXcIJzonJepGd0pmBopmyb05h5gZpudnmXa5t5dpdybKmlZ19keXF/hGxoZmNtdXZmXmBRWmVQUWFIVklUX1dTW2RqW2VQRUNLTEpLQUpEOFBAUE1YU1hPU1FgZWVqU2R4eXdJRkVjXWVaaGlTaWhqbmNqZmBjX1xdXV9oYmFoZXxkXmRnZGtkamxmaGxomJt/saxUXUt/qrCytbCzopyYhJemoKCijKSnn5aoiZmYmZSZk5Kgl46IhXtwfYRofI+Dk5qCd5GOj4pwgIaPk5JsmJR8iJGSo5WDjamZk5KKhYl5g3aIgG6Bn4Z3gJGFh5ihlXiSoaOZn4mzoaK2i3qsp6SupXCpgJuRhoGelH6lgaOahphxnoSira+Jl4t/jKSNlYOvo5V3tba2yaJzlIyDn2Gdl6lteZaHoJt1oYd3oH6QlouBb01mo5JxmohzpXt6dWKDgm1+oGxyZGCcc390l2t7arS2tMamc5h9eZxqmpmrc4GabHN3l2mZeXSXcVBEfbNeanVreIZma2Zic3RvbFVbUlhnT1FnSVVMWFJVXGdrblVnV01KQUlNSkdKTkFRSlBkY2ptZXVzc354e250iXp7VFFObV5oXGtpUmpoaWxnbWdjZV9cXFxfaWJkaGt7X11kZ2NqZm5tZWlsZaKdibCohWU/lKKyrK+vtaGij3+Wp6Gho4ukppybpYKZl5eOl5CQm5OOiIN5a3mGZYOMf5afeXWPiIyCaoWFkoSLhZ2NeoyKlaWSgpeolouRi4CIeoB9i3lwkKCFeYGUhoiVnpR+k6Smm5aWg2dueJxsomR8cqV4nJhwaKeCmY59pXuhl4OWcp92gYmUlY+5bY+KomJ9maOXiW5za6trdaBub6Zhm2mLkGmWh5uVdaKBfppgi4aNdW+IYmihZp5/apt1cGRniIJvcqJbX1tkoW5eiIxxfIB0cmSlbniiY2anZ5dxi5dtoW9SiI9uoF5kp1SLXVSYbW1ya3GBbXBoa3dzam5RVlVVZVlTbElYTltIV2hocmpZa1ZQUkVWXE1YU2FVaGped3V7fHB9fHKCe39zd42Ag3deUXNhZ2JwZ1BraGhrbG9oZGdfXV1dYGpiaml2dV1cY2hjamlybGZrbWOdpZmmemV0bYunrqWpsLGln4t/lqmcnaOLoaGaoaKAlZmTjpqPi5eQjop7hnGAiGiLinyXmnN0iX2QfGWDh5WKiZWagnyIhpamj4Chqo+FkIqBiX2AgI5zaY+lg32FkoyHl56Nh5GppZ2JpniWm36liZaMspmekYSvl5+leZiKe6l1qJCEmm6looyShIyDvG18pa+Ch4WHlZeeon6mfHKolaGWaJ9+b6xjloqWk3iobaqjgYl1iIJ3q5GmiGuSsWx3s4ypbIuGb2+gnpKVYn+rjKp3gYCOp593n32FpJWdoGeZh3WsZp6tjLZzdr6Mo5NZg6aNq2F1cnRve3VwYmp9bmdsUlRYVGBgXGtMW1FbSV1sbXZfW3FZW19aZ3NkbW9xY3F0YHd6fnlyeYNzg36Be3uMgYKAdmJ5ZGNuc2RSbGdnb21yaWZpYV9eXGFqYmxse29cXGJpYm1pd21nbG5ilqarnYGAnqSWqqqeqKeto5iIgZapmZ2iiZqknKichIyaj4ackYWSjYyMdIV6iINvjYV+l5NzdIZykYNuf4uSh4aUkH17goWXpI1/paSNgI6JhJR1goeTbmyLqICCi5ONiJueiIuSqqKgj4B0lJeIfoF4lK+kf4KccY+GeZOOhoF7c6mNcn19epeWm4SNeHt9fYiUlZOLd5GZoaKFe3+KbIyGXHp5c3pxaW5+k4pxgHSCj5STcYaEgmWNf1+BgYx4dnOUdXB6b2+Jb4WGX3dpeI5mgoOGj6qcf3R9lmmJiG9+dXuCdG1sZoxzd3uXd4Raald5j2lud3Jxb3d4b11rhW5oZ1ZZXlZcZGpjVWBUXVFeb3d5a2p3ZGlqanV8cHF0c2FvdWJze4F4dXmCdX+Af4F5i4WCfXttgG1keW5eV25naHVreGppaWRcYFpjaWVscXVuWltia2Rsa3ltaGxvYY6Vuqmni6Gim6ekmaSdq6Gfg4OWqpCdn4iZppqomIKBnIt+lpSHjoqJjHKCfI58fo+Ee5eOdHKDcJWGfH2Si4aGj4Z5foCGmKOMe6afioWPj4SVgoaOmHdxhKqFjZGcj4eenYaLm6efoKuDiY2Vm39+ipetqJCTqJF4cZ+ThX2UcH+rh3F+lXFqb3yBn4t/kY6LaG5dhI2NnJ2gkHOXjYlydWyDdnSAWXJvh5GCfn+Mal1pZHuFhIiAYGl4e5x8hI2DdoKHhGl6jIlsYnFzg3dfc42DipGolodnjY6CbHaKgm6CindtZGVjeYJ6lVpbaWZtdlt7eXd0bnNyg2ZcbYlra2JZWFxZWGpxWl5gWV1dZHJ9enRvdGJqaml7fHF6dnRkbXRobHt/dXp9e3l6gIB/b4aJg3t9c356cn9oVFxyaWx2cHVna2dkXWFZamhranFybVdbZW1sZ3J5b2hqbWCMjKuxoZCjoZqfn5iemaihoH2ClquMn5OGmqGRpJV/e5iFfJKZiYiGhopyfICLdoWLgoSWinJvgHOYhoR+k4ODhoqCeoCEipqfj4Gln4Z3jpeIlYqLnJeEg3msgZCXmJOJnZyGh6GqnqKio4uIk5udo5mWq6Kop6GTnImZkX56kJCGqX+Ak5GSk5yxpZqUnY+NsZKYhKaNjZadoYqRnYSJk4tsfY53d2aChpGLfYmehYeLj4iIgYWEkXd8e3WbpIqHi6CMh5Z/gI2DgXdxdYaEf3iJiIuRp5GEh46HgouPinqDiIaMf3VqgIN8eZlpcWhgc4pwfXt3dm93dIFdXm+GZ25fXllaXFNncFVjW1tgbGd0e3tybm9jamlof3tteH5waHBwbGaAe3KCgHd/fX+Ee22DjIV8enl8fnqDeE5kdmpzbnF7ZGtlYmJgW3NmcGZycWxVXWx0bWh4enBnaWtljYieup+XoqGYlZmYlJikoJx6fpepjZ2MhZ+cip2WfHmVg3uOmYmGg4SGbXiAf3KAh36Ik4Rta356l4eEg5B+gIaEh3yHg4yanJKGqZ2CcoqPhZKRi5yRfI16qYONkZeVjpuWhYWbpp+imp2Gg5KamZmQmaahpp6ekJeCk414fYmQhqd8fY+QkYaYqqGck5yOjamNkoCejYmVm6CEj5iAiI+EcXmGcnVhf4SQh3aMmYGDj4KGhX+GhJVuenZ1lKSMjYabhoaQdYGMfn5zc3yJhXt5jY+FlKiQh4SPgYKJiIh0goWGiHltanx/e21oa2xmXnl/Z3x7dnR2dXt3XGBwfW50YGNaW15RZmxTZFpdYGpodHl+cGxsY2pqZ4B/a3J/a2t0bnduhHluhoB2goB9hXdxgo2Hfnt7fIB7gotgaXtrdWhqg2RqY2BpXGN1Z29idW1sVGJxeWVveXpyZWptbYuKn7iaoaSfk5KWl4uan56cenecpJCbiYakk4qYmXl6jYV7ipGDjIKCgmx7f3hygIV9ipB8a2h9gpeJgYiOfH6FhId8j4COm5uQh6abf3CKiouShqChioWMfKeQh46RlpKWkneMo6ChnZaaf4GQmpiTjZqjoqSbmJKcgJCHe4GGkYmhgX6NjY98l6SgoJKZkI+ljI+BnJKKlZmdf5OTf4iPg3V1gnF3YX2BjoZzipZ9iIxxjH6ChYaPaHhyeo6ak5GAmH+JjHODiX19cnp8jYZ8e5OOhJemlI2GkHuEhYaEc3+AhIV3ZHB6fnh5cGtqZl5+c2h8dXVzfHOAal5gdHZwd2RjWF1eUmloU2RYXmBnaXV4gXFma2NsZ2V/gGptfWdtcGp9d4V6a4uBcoGBfoF1doKNhn98eoCBfX+PanKDbnRpYohobGJfcVZ0b2xtYHhobFdqc3ZjdHp6cWJrb3mJjZ+zkqWmnY6QmI+GnKCam3t1o56Nl3+MoYqImpZ4fIaHfoSKfoiCgX9wfnp0dYKFfomQd2djfYaXioKKjXh9gI2DeZaAlZeVjJWemn1vi4GQk4Wlm4eMiYOmlYSRipWXkpF2kZ2hoZiUl3l/jpiXjpaanaWempSVnXuSiYV5h5iPn3+Cio6Mc5einqCSmI6PoYyMg5iYhJSXmn+Zjn2KjoJ3cn5ue2SAfIuGcYeTgJGCa4eDgYCKhWZ2cH2IlJqOfpR5jYt9gol+fHKAeYuGeoWSi4yZo5eChIt2h4OBgHR4f4aCc152d3xzfXZma2Rgfmlqd3NzdX1xfGNjYXNudXJtYVlfXVprY1JiV19fZ2p0eYVwYmpjbGZofIJraHRobG9of3yBeGyPhXGAg4N/dHyDjIGAfnqCg358kG11iXR0bWaKbGphY3VWg2lwbWB5Z2xhanZwZXh7eXBfcWyFhZCdr5inqZ6OjZeHhZ+TlZd8dqiaiZh5lpyLjJmQeHyBi319hHuAgoB4c3h5c32Ag3+IioBkXn2LlId/hYd0fX6Kf36YhJaTloyjoJd+cYZ7k5GKpo+MjoqSoJGDkI+Tl5GKgY+YoJqSkJF0gI6SlImdnZ6nmZiOlZd1kJGLbYiakZt8iImQiW+XnZqikpWKjJ2LhoGTnYCUlJaImop9i4qCe3F6a3Zte3+Mf26Fk4OUeG+ChH5+i4Flc2p9gpiYhYCOdZKKhXqJf3d5gX6HgX2Ej4aNlaWReYWCdIiGe35xcn6EgWtgeXR5cHxuYG1iZXtibm92c3h3c3RhdmBvbHVub1xaXl1daV1PXFdiYGdscnqIa19pZGpjaHeHbWZsaGlsZ4B8endukIhzgIOEfXSBhol6g316gYR9fI5yeYt4eG1sh2toX2lxYodocW9ldmdtbGF6aGp8e3dwYXdtioGZmquhpKmeiouRhomeipSWfHasl4yWfJ6TkZaUiHZ+e4p8fIB2d3+AcHRzem+FfYGAiX58YVx+j5KGf4SEcnqAhnqPkYeRkZuRpJqTgX2AfI2KkqOJjYqNlpqMhZCXkpWNiIiMkp2Tj4yNboSQj5GJnpmioZiXipeTcIychmeJm5CVe4qFkIpwlpqUoZGRiIqYjIJ/kp99k5GUjZqQfIuGiHRzdWtxb3V9i3VvhpGOk3J0gHyCgol9ZXJuen+blX6FinWSjIJ1intwgn+Ch32GjYuFjpaqjnuIfX6KhHZ8bmx9goBhZndzdG56YV5vYGt0XnBqenl5bHJwZXlebmxzbXNYWl1fYWlaT1ZXZGJlcHF/h2VdaWhnYmdxjW5jaGhlaWeAend1b46Fc4GBg3x1gomFeIV8eISGeoCJd3+Le3pyeYNra19vaHR/a3FubXFnb2tle2Ftf3p3cGt3d4l/o5mjqKGmm4iMioGPnYaSmnR/qJORjYagjJWTkIBzfHaFeHmAcnN6hmxyb3ltiXZ/gIZucVtZfpKNiICBgXZ1gX9/oIaPipGbl6CSlneJfoCMiJydio+GkpeWhYiUmI6Wi4qNjoydio6RhG2Ji4+RipyWoZyZloaZiWyHpoVniJ+Mk4CNhIyBeJOYkp2RkIiJlI1/fpCZfZKOkY6bk32LgYRwdnBsbm9wfIZpc4OPmIpxeIB1gomDemd0cHeCm5B9ioV7lZN7eIp1cot8h457i4eFio+cpYl8hHaBiX53d2xofX9+W3FycW9vdlleb2Bwal5vanx6cW5tam13YHBva3FtWVhgYWFsV1BSWWVlYXRvhIFhXGttZGNla5JtYGZmX2dqgXVycm+LgHR/goB5doCLgHmFfneHhnaDhXuHi397dop/anFjfGKFfG9wbHVqaG5sd3dfcX55e3N1c3+CfqWVm62fp5aFjIN+lpWDjp10iZ6TkoaKmoyVjox6cnh0gnByhXRxdYhsb2x0bId2g31/bW5VUYGrlIeCeIB2coN5gqCCkIGSkpibkZh3kHqCjJKkmpOOiJSYkoSFlpiLk4uJjo+HnYSRi31yi4WIj4icmZ+bl5WBlYBqiJ+KaIiiiZSFkoSKcYORl4+ajY+Mi46Nd3uTkXuQjI6TmI18iX2BbHdqb2tsbXuAYnp+j5eBd3qBeIONfXpodW12iZeMgImHfJWRcnuGcXiOe4uOe4l/hI6Rn5+GfXx3gYp8dm9naX5/dl12bm1rcHJVXW5icmFfbW55cGhwZmdzdWhwbGF3ZV1VZWBgcVNQTltlY1x3b4h7XlxocWJiZWWRaV9oZVtnb35va3Fzin12fYWAdXZ/jHl7hoB4h4NzhoV+jIyEfHmVeGZya4Ngh35vb2p7YGltdIB0XnN8eIZ3c3OFfHigkJuxnaaOgop/gpmJf4qcfoqYko6Eh5eOjo6Ed3R3c4BwcIVzcHGDb2ppdW2Cbn18bXVzUk6C38mS1pN8cHSDdYOfgpF2lJCYm4+Ye5NyhZCfoZOTkImSm5OFfZWVh4yNh5KNiJx/joF4e4x/iIyKnJycm5aUeo54aYuUim6KpYaUiZiEhmOMkZiNlImWi4yJi3B6lYp8j4mLk5KKeod9f218ZXNva217elyBeZCPgXt+f4CGj3t6aXVrdIyQioOHhn6XjG1/gHCCjoCOiX6Fe4SRlpucjH13eIKOd3JrZG58gGlnc25naHNsU11vZHBaX2xxd2dra2JneHNwcGRgeGBgVWtfXnRPTUtfZmJbd3CJdFxbZXVgYWRkjmNgZmJYaXN0bmtxdot8dHmGgnZ3fotzf4Z/eol/cYmHgZCKiHx+mXZlc258ZYd+bm9rf1lrbnl6cmB2enuNdnJ2inZ5n4ycr5ugkIKFeIiVfnuInIaEnpCOhYyXhJOOh4F1d295cW+Db21ufnJjZHdwfG56fGpobGKkmsHcru+ic2x1g3WEoYSRbpWPlJ+TmoCRcIWLo5eJjpWKkJ2Wg4CUj4WIj4CSioqXf4d7dn+JeIaFjpyal5mPkHaLeHCJi45/jaaHlIuehoZei5SXiY6IjYqKhIlsfJeDfomGipGQhnaHfn5sfWR4dWpveXRYiHuSh4Z6f3+Aho1/emd0aoGLkIuEhIGNmIZtg3dviZODkoZ/hHuCkpeUmpF1dHiHi3RycGRydn9fcmxvYWh0ZlJgcGdrVV9uc3lhcmNgaX5xcm5bY3JhYlZuWlx3TExLY2ZgXXVyiW1bXGR5XmBkZoRfY2NeWGlya25rcneLfXN3hIF4eHyJcYOEfH2Ie3SLiIeVhYx/f5hzaHVyeW2Lem5zcIBXcHp2eXFkdnmGjGh2gIlxgJ2HmaicopKEfXGMk3h4iZyDhJ+MjnyWjYCaiIR8c3Zwc2pvgWxqbXx0XmB3dntwdHpnYGV869q1ycPciXNsdIB2ipqIjGmXj46bk5GBiHCFiKCOhYuVioyXk3uNkoeCiJB6kYuGj4KAd3iDhHKHgpKblpOYho12iIByh4SMiZykhZaOoISKYYOVj4WIhYiMhoCHaH2UgH6DhYqOj4Jyh3+AcndodnJpdHhtWox9k4OGfYCDgYSLg3didW2KgpGMg4CAk5J+b4NteoiRiJSFfYJ/gpOUkpiJbnF5i4R0am9pb3Z+XXJobVxpdF9RZHFoZlNfcXZ0YHBgXWiDcXJqV2dpY2hXbVdbdExKS2VmXmFxc4VpW1xleV5eZGd6YGRfXVlrbmVuanN3in1zcoF/e3Z6iHOFg3x/h3Z2ioWPmIGNgnuTdmx3dnl4k3Rud3p9WHmFcYBuZ3h2kYJkdoaFcYqXhpqhm6GKhnNvkotxdo2afImZiIl8n3+EmX+CeXJzbm9kcn5pZmx3d1tfeHt6cXF/aWFnYX/Vto6RpnhucXd7cZKQjIZqmI2ImpCKhXpoh4qZh4GSkIaGl418jIyAgImNe5CNfYmFenV7g3xxhoCVmY6SlIKJdoSIeIaDjZWgoYiYkaGAiWF/lIeEh4OIjH9/gmZ9kYB/gIOMj5B+bYN9g3VsbXd1dHd2a2OOgo+AhX98hICFiX9wYHRyhn2QjoN9f5KKenKFZ3uFjIiNhXyFgIGVkJGThW5veIt+dGxtaGl3emBnaWlYa3RZUmhyaWJQYnJ4bWJlXlpqhG50YlxoYGVtX29UWm5NR05mZFtmbXGAa1pbY3NfXGNrdmRlXV1abGxibGpzdoZ/cW9/fH10eIZ4hYN8gId1eImBkpV7iYZ2iYFveHl7hJJvbXqAdl6Df3SBbGh6c5RzZ3OHfHKSkoSan5ufhod1dZN+bXWSln2HkIOKjZp8jJp2fnZxb2xqYXR8Z2JpdXlaYHd7eW1xfmVkaGhXnY9fcnOXvMSEdnGUiI99cZaLhpuSi4dyaoiOloB7lYuBhJqLfIqFfHuJi3+UiHWJhnZ3foFydYaBnZOFlI+Eg3KBineGfoybn5uIlY+egYlmfpOCf4WCiIlxgX1mfox8eX+AiIyPfWmBfoR2Z3B5eHN3dGxrjoaLgouAeYKBhYSBbF9zeXt+jouGfIKQgX9zgmp6hYmNh4V5hX6CmY6RjX5ubXqIfHVzbWVle3NhW3BiV25xU1NtcmhhTmd1eGZgXl1Zb4Fvc1plYl5qbmBwT1lqUURTZmBZam1tfG5ZW11tY1picHZjZlxdYGtpY2xqc3aBg3Ftfnx/dHWDeoOCfIGFdn6IgZaQeISKdIGIcnh5fo2Qb296gHFpgXh6fm1se3WVa2p4hHRrk42Gn5mgmYSHbn2LdWl3l45+gYqClJeKeY+Vb3p0cWtqZGBzemhfZXF6WmByfHlncXlhZWWPsbJ3S2JapdnQlnF7kIqPd32TioSYkIuFbmuFkpJ6eZKGgYSYinyGf3d3iYqEloBvi4hxdX57anmFg6SQhJONhH9wgIR4hnuInpuXjZWSloWIcHuTgn2CgoiCbYB2aICFeXKAgYOKiHxlfn+FdmRxc4BpeXFwdZmOhoOLfXd5gYV6g2tccn9zgomHin6HinuJc4JvcoWIkIaGc4V7gpqNjoV5bm59g351eWNlaHtuXlh2Wldwa05XcXJmYEtsd3RhXlxbWnV+c3BYZ11nanJgb05XZ1I/WGZeWm9qZ3lxWlpYa2VZY3B5XmdcXmVsZ2ZraXF3f4dubH9+gHVwgnt/gn+Cf3aBhImXiXGCjXF7hnx6eYOTjHVqeX5rb350f3xvcnt6k29ugX54Z5KLgqGZnJGChWeGg29neZWIfX6EgpiKgXyNjWl4c2trZl9hb3ltX2JveFxka4J5YXF2X2Vl1Oq9izI6PouOf3F4hYeNjXWClox+ko2Lfm1rhIyMdXyPf4WBlIh8gndudoeEg5d3boiFbHV7dWZ5goOmi4KPi4R+boF2eIV8iZ+Sj5KTlI6Mh397koZ3foOMgmp/cWiAfnlufHyCi4R3YnqFgnJkcml+bnVydYKcjIGAhYB0dn6Ac4JvXG6AdXmLhIt8iIF+iXl7cm2KhZGFjHODeoCXi4uAdW1qdoB/dHNbZ2d1bldWe1JZb2RMWnJyZVtJcXhvXFtbWV11f3VpWWJbaGZvZGpNV2VQPV1lXF11ZWB0b1pZVG5jWWNxeVpoXWBnbWdpa2lwd32ObGmChH95boB8fIF/gXp1goCNk4RwgYtud36Ae3uIkol/aHp9anN7coV6c3Z9fox5eIR9fGuMjYObnpaMgYBsjH1raH6Ni3p9foOUgn59iohrdnFnaGJbYmdyb2Bha3NgaHCIeWJzdF5jZJugj25cNVqvtXRpgIh8kYZ1hZWFc46KiXZvbISCh3R5iXiJfJKHeX5yZ3aJfn6Yb3GHf2l2eW5meYeEpIaAh4yKfm+Ad4KDgI+ciYSWk5mKjIWJfJCIcHp9hHtofmxqgHt6ant3goiBcmB3gX5yZHJndoNudXyGlpKCfYKBb3d6fHV/bVlwgHd1jYOHeIh2g4l7eXRvi4KRgoZzgH5/lImKfG9uaW2BgXRtW2VkcW9QWnpNW25bT1tyb2RVS3N4aVdZWlphcYF1YV5dYGdkaWlmTllnTUBgY1tgdWBddWxXV1N0YFpkb3JXal5iaGpnbWxocHd8kmtohIp9fG9+fnuBgIF6d39/iouDcXyHb3F3g397iYyPg2l9e213eHaKdnx4f4KGf4N+fXpthIyImaONhIN7dYt4a2yEh5B4fXqCkYCAfouDcHJxY2ZeWWZfcHBfYGdwZmpuiHRhdG9bYWRqdnuAv5ympMi4cYSCcpJ7d4WSgnOQi4dycm+De4NzdIZ0iHeTiHl5cGN3h3qAk2lyhHZnd3VjanyCh52BgH+Oj35zgHWHe4KVkoV7mI+WkIiCiXuJiWt4eX50Z3poa395dGl6d4CDfWhgeIh9a2t0aHyBaXaCjJGVf3t+f3F8dnx0f2JWeH5zdIuFgn2EcYeKeHlxcYWEjoB/en9+do+Gg3dqcWhsh4Fxb1xmYHFsSWR1S11sVFNZcm5iUU90eGFSWFhdYXCDdFxhXGllZWRrZFBbcElDY2BbY29dXXhnVFdWdl1bZW5oVmteYWpnZW5uaHB2epJtaYiMeX1ye355goGBfHZ9g4iGg3B3hHJtd4KCfomLk39wgHt3eHqAjHSCeH6BgYKEeYB1b36Ki5ueiH2FeneFe2d0hYuQeX5/e4iGhHaPgGdwbl9kXFhlWW1zYWBgcGxraIhuYXRpWV9kboB3qdqpx4aHsnGId2+MdHqFjX95kol/dHN0fXd/b3F/bYV0k4V4dGtgeoJ5iY9mcoRwZ3VuW219gJCTf4B4kZN+eXxuiniDk42Gd5iMk5CIhoV8f4VsdHZ+bGd2ZG17dm1qd3d/f3xhYniGeml1dWN+fGh1h4+Nlnx1gXdxgHt9boBaV3V/cHaFiH+BeW2JhnR6bHaChIV/fH56fXSMgn10aHRlboqDbHNaaF1zZEdtbUtaYFdWVXdtYlBSdHZYUFZYXmByhG9dYGNtZWReb2NUXHFGQmVeXWVnXVt6YlFWXHRbWmdrYFZqX2BvZmZrcWhwdniOdGqOjXV+dnh9d4GEgXt0fYOIh4NvcoB0cXV+hYKJjYp6dn94g3t8hYd3h3x9gX6EgHt+cnV5jI2gjIl5iXZ0gnhefYWXi3iGg3OFhoR3iXpibm1cYltbYVZpc2NgW2ducGaHcWFxZlddY2t/fMrOh7mham1timxxg3F7g4l+epCEeXhzeHV0e2psdmOEdZGCdm9mX32CeoyKZXKCa2pxY1hseoWbiIKBcpaUd399b4pzhY2OinSZkJKJhouDe3l9cHBvfGZocWFteHFqbHF4fX16XWV6gHhqdnhmg3dodIiMjpV9cohqb36BeW99XVlzf250gYt8gm9vioBxd2l4gYKBgnh+c3x1h317c2dzYW6LgGtxV2lcdltHbWpMVlVdU1V7a2FPVHVyUFFUV15jdYZpXWBsamZjWm9hWGJvR0FnXGBlXVxWe11OVWVwWVtqaF1XZ2BecmVqaHJncHN3hnhulYt0f3p4fnmDiH91cn+GhY6CcHB7eHd2eYaFh4yGeXt/dIt9fYaEg4d+fn59h398eHV4eJGTn3+MfIptdX94ZIOGlYVzkYpvhYWBeoN0ZG5qWV9bXF1UZ3NlYFhjcXJngHJia2VXW2Bqf3i+rnuft25hc4Voc3pxeIGEen2Lfnd3cnZve3Zlam9hh3WOgHNqYl5+eHmLhGZxf2hra1pWb3eIooCEf3GZk3KBenaEb4OElIp1l4qOiYWJhX14dHFuaHhfamxgbXZqZ2preXd6dlpnfXx5ZnN+bYV1ZXWGjYaXgHCMZ2t7hHVudWJdcX1sdX2Me4JndYd+bnFpdoB5f4B0fm17fIJ7eHFmbGFtiX1sbFVpX3ZVSmlqTlFOZ0xYe2hhTlV1a0xRVFVfZ3aEZ15hcWhnYldqXVxrZ0pEalliY1ZZVXlZTVZtallda2RcWWRiXnRlbWRxZ3JwdYB3cJmGdn9+d398hYd9dXOCiICVgm5zeXt6c3KEh4mIg3iBfXWPfnyEio2DgYR7fouDe3Z7d3eanZh6iYKGaXZ8e2yDg5J/co6BcIWCf4J/cGdsZ1hdW1xbU2RwZF5XYnJ1anVvZWVjV1xbaH9wb3KAc4lkZHl9aXN1c3KBg3eAg3h2cnVtanpxYWdrZ4ZzjYNtZl1ffXB7iX9pbXhnamRVV3JvjKZ8hHt2lpF0fXR+fG9+fZOIeJt9iYeDh4N9dXBxbGd0XGxnXmx0ZGdlaXpve3JZZ4F3dWhwgXiCd2J3hot8lYJvjGpte4JxZ3RmYW56aHN4int+YnaEd2pscnV8cnt7dH9ogH+AeXdvZGZibYV7bGpVaGFvUkpoak9LTm9HXXpmYU1VdGRKT1NXYWt3f2ZdZ3RpZmBWZFdicFxLS2pXY2FVVFVzVkxYdWRZXmtgW1pjZF92Z21icGl0b3J+dHSZgnd+gHiAf4aEen11goR/l4VucnR8enVxhIWPgYB6i3VzkH98gZWNgIWEfX2Mhnp9gHd7o6WKeYiFhGt0e3p1goCLem6Ec3mEfYKDdm9qaWVWXVtaWlNibmRbWGFze2pobWlgYlhfWml/aWtvgGdsYGh5eGpyc3Ntg4B6f3x1dG16aGp5al9lbmiBdo+EZ2VYYndqf4d7b2pwZ2ZdVFhvZ42ndoB6fJCOenZxgHF1eHuSgnqXdoaEgIaIdmpydWdnbltsY11tcl9nYWp4aHtsW26DcnRqcIF+enhhd4aFeZCFdIlycHqBcmNyaV1xeGVydIh8eWN0gHFnanl1c215eXZ5ZYV8f3l3cWRkY217fGpqVGdhZVNJa2ZPR1FqRWB3ZmFNU3JdSk1VWWVseHxmX25xamVdVmFVbm5WSlNnV2VdWE1Va1RKW3lfW19rXV1aYmVfeWhsYW9vdm5wd3V6mH52f4F5gICHhnp5eoN+gZODcXR0fnp2dISIkX2AfJBrcpWAe4KfhX6HfYB+hoKAint3hKuef3qHh4NrcoF5dYB+gHRuhm58gHOKgGpwbmRkWF9aWVpUYmpnW1pfdYJpXm1sXGFXXFxrgWVydH1paVxrdnVnc3ZxbIR7fXx4dXFseWdpeGZdZHNoeneSgWNjVGVwaIKFeHhnaWphV1ZZZ2OOp29+d4CLjntxcn9pe3F8jn14kHOFfoCAhm5kdXJkZ2dcamFdb29bZ15tdGV6aF10gG9ya3F8fnV2YnSGjHuJiIGBeXN1gHZicW5bcnRjcXOFfHVlc4BtYW17cGtqfHp2dGeHdnt7dnFlYmRtcn1pa1NnXVxUS3FiUEZVYEdidmZhS1NvWEpNWFhoa3Z7ZWVucWdkWldeWHdlVEpcYldnV1lIV2RQSGJ4Wl1fbFpeXGJjXX5pamBvdHhtcG52g5d6coCAfH+JjIZ9dXWGeIeMfHN1dYF5enqBjI58foSJaXOWgXqKnX5+hXqBen98holzcY+tjHt7ho99ZHGHeXN8enVyboZse35sj3pjcG9iZV1lVllZV2Nma19dXHOFaFhxblteWFpcbHticHd1bGFZbHNzZ3R1b2yDeH5/eHZtbnNkaHRlW2d1ZnZ2kXpfXVJmZ2uDgnR+YmRqXFRXXWJjjqRpeHODhpF5bnF8anpvfoh9dop0gnl9eYBpZHZsYGZfXmlfXXRrWWVcb29iemVcd3xrbm5weHl0dWVzhJOAiIOJe3dwc390Y3hlXHFxYnFygnx0Z3KAZV9ud2plaHp9dW9wg3Z0fXNyYl9mbW58ZGhTZ1dYU012XlBJWVdIYnRjYUlUbVNKTVpXamxyfGNtbXNjYlpaW2F3XFNLY11XaFNWRlhgTUdpdVheYGxbW19hYlyEaWhhbnh5bW9qdoGQeW2CfoCBk4iEgXZ0iXSMhnRxdnaBeH19foyQf36TfnB3lYN8mJJ5gIB4en6AdIiEdHGZoXp6f4mUd2N1h3hzd3RrdG9+a3h8cJFzXnBuYGdibFRaWldoY21mXFxxiWVTcm5bWlhXYGx2Y2l1amleWW1zcGtzc3NphHx+fnp2bm1rZGlxY1tqcmR0do5zW1dTZWFygH9ygl1iY11TWmBcY5GfZXFxhYSSdWxse29wcnx9fXOCeIF0e3p6ZGV1Z11iWWBnW152aFdiXXBoYXdhW3x2aWpyb3h0c3VpcYKWhId/hXd0a3F+b2d4WF1sbmNyc4B6c2dwflxgcHJiYGtzf21udn9zcXhrcGFcZWxsemBmUmVTVlFPdVpRT1hRSGNzYWBHVmpQSVBaVmtra31mbm9yYltaWFlscVdSUGZWVmhTVEVZW05IcXRYX2NsYlhgYGFdi2pjZG16eGxwaXV5h3trg31/hJp8g4R5fIdtj4dybnZ6fHSCgnyLj4KCl3R4gZOFgZ6JdYGAgXR/gnGIg3ZwoZZzeoaLhnpld4pubXpuZnhwemtzdnONa151bmFnZWtSXVtVZ2Fsa1pccYxkT29uXVZYVWdpc2hidGVkXFhtdGxvdXR4aoZ8f3uHdo9yY2RrbmFcbm1jc3iHa1pUVmNkeH19cYZdZF9jVFpfWWKVlWNtcIOFinRraXxwZ3V5dX1te3V2cHt/dV9mcmNbXVZhY1hhdGVVX2BtZGFxXV1+cGhpdHF0cXV3a22FlIKJfYdyc2dwf3J0cFRcZ2tmcnSAdnNjbXZWY3JsW19wZ35mbnh+c3Rzam1hWmRpandeZVNjVFVQU2xWUFZSUEdkcl9hRlhpTklYVFduaWV9aWx4bGJXXVVbdGRTUldoUVhmVFNHWVlPTXd2Wl9la2lZYWBeXY5uYmZreXVub2l2doB/bIOAfYeYe4CHgYl+a5OIcmZ0gHt1gIN9iY5/i5NyfIqRhYefhnt/hoxzgYZzfoJ2bqSLcoCNi3Z3bHqMYGR7cGZ5c3hsbXF3g2dkfG1jZmdoU19eVWdfbG5bXm6NaE5pbWBUVlNvZ3NrZXhkZFxYb3NscXp3cmyHe392m3p5a2FlbG1eYG9qZXB4fmdaVlhgbHh8e3CEX2NfZ1ZYX1djm4hia3CBh314bGx6bl14c218a3Z0b3B8gXNYam5eWFxVYWJXZHBjU15iaWFibFphfmxmbHR2b213d2xpho2AinuJbnJmcn5udG5kW2FpaXB0gXRzXmltU2VxZVZjb2R8ZHN4fXdscG1rYFlhZmd0XGRVYFVSTldkUU9bTk9IZG9cYkdZaU1KX0tZbWRgeWlufmVgVV9UXXVcU1JgZk5cYFVSSVtYUFl0dV1fZWtoWGJgW16NcWNnanhxc25odnR7hHKCg3qIjn58iYeNeW6QiXRrc4F0f3+IhYeRhJWPeX2MjoeRm4SAfIyFc3+Bc3R4cm+Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn59fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2NjY2NjY2OjY2NjY2NjY2NjY2Njo6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkpOTk5KTk5KSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6NjYyMjIyMjI2NjY2NjY2NjY2Ojo6Ojo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJFtZmdnZ2dnfYWEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmY4C+u7u7u72zbWZnZ2dnZ21ubm5ubm9qZmdnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMkWdfYGBgX155g4KCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19bfsjExMTExrtnXl9fX19fZWdnZ2dnaGNfX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRjo2NjY2NjY+QkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmMkpGRkZGRkImIiYmJiYmJioqKioqKiYiIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l6ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GSkpKSko2RkpGJh46KkJKTjoiOjo2RiI+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2NjoyLi4uLi4uLjY2Njo6Ojo2NjY2NjY2NjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJGKho2HhomFiJCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkYqEiYaFhYWHj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCQj42FhIeEhoiPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhYiGhoiDio+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2JjYyLjomOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX5/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhISEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj4+OjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f35/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fn59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/fn5/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/f39/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX1+fn59fn9/fn9/f39/gIB/f3+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ1dHZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaGhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3h2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZRUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6enx+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT05PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01MT1JOWXBwcnd4d3d0c3R3enx+fX5+fn5+fn5+fn9/gICAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/Ozg5ODs7OkA7Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo6Ozg5Ojg3Ojw5Nzg7Oz49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VzcXN4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs7P0BBQkA9PDk8PTw5Nzk6Ojk4ODo6Nzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4CAgICAgIF/gIF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PDw+Pz08PTs6PD09PTw8PDw7Ozo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXV1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/Q0NDQD48PT9APz89Oz49PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXp7e31+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRUQ/PTs8QD46Ozo6OTc6PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fX5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/P0FBQUJBQD08PTs+PTo6Ojw6ODk4ODo7PT8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ1d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0A/Pz9APT9APjw+QD89PT0/PT0+Q0Q/Ozw9PkA9PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbG9wcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENEQT9AQEA/PUA+PD0/P0BAQENAQD9AQD49PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkNDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8e3x8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAQUA+Oz48Pz08Oj49P0JCRUA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUZGRkpOTktKSUdHSEtMSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFEZW9wcXF0dnV4e3x7e3x+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QERFRD87QUNEQj8+QT9BREVEQ1d1homKflhHSEpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+BgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSkhJR0hISUdGQkRGRERDQVV0h4mHh4aIgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJzd3d6e3t6e319fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tMS0pLTUpLSEhGRkdGRVBshIeGhoaHh4iHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pz9ERkhERUdJS0lJR0hJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3R2eHl7e3t8fH1+f319fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0tLS0tNTEtNTElGSlZsgYaFhISGhoaHiIaKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRURCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5ent7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhHSUlLTE9OTlFOUV5ygYWDhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs7PD5BOzk5OT09Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn9+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQEJGSEtITEtOVGd7hISDgoOEhomKi4uLiomKi4yJVDs4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Nzc3ODo3Nzc4Ojs3Njg5OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+f35/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PERCREZGRFZ4hISCgoOChYmKiomJioqKiouJiYqBSDY3NjQ2ODg3NDU3ODQ2Nzc5OTc2Njc2NTo6Ozo6PDg5ODk5ODc3Ojo6ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PT1FXa3JydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc6QTk8RD9QfYSDg4SEhIaJioqIh4iIiIqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojk5Ozo5PT09Pzs7Oz06Pjw6PDs8Ozw8Ojo8ODo6Ozo5OTk8Pzw9QUJESUpNS0pLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzo7PDo4OTk4OTk5OTo+PT8/Q3aEg4SEhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUJBQUI+QENBQD89Pj5APz4/QD9APT0/Qj9BQT9BPz1AQUA/P0E8Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4Ojs5Ojo7PDo6Ojw7PT5APz1hhYOEg4WEhomJiIeGhoaHiImKi4uKioqLiotePkRHSUtKSkZHR0RGSEdFQ0BAQ0VDQkBCQ0I/QERIRUNFREVFQUZFRkRGRkRAQj49QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc6PTo8Oj09Pj47Pjw/PkI/Sn6DhIWGhoaIiYiIh4aGhoeJioqLjI2MjIuKiodXR0xMTUtOSUlLSElKSklFQ0RGR0ZEQ0VGREJISUtHSEdGR0dFS0pMSUtLSkNGQ0NEQkFBQ0JEQ0NERENBPTw+QGhwc3R0dnd6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAgH+AgH9PQT49P0RMS0BCQkE5Nzs+Ozw6PT8+Pzw/PkJBRD5ohIKFhYeHiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUpIS0ZER0hISUVFSEZGRUxMTUlKR0dISUpOTU9NTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbXB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDo7PDo9Pzw9PT9AQ0JIU36DhISFhoaHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExMTEpJSEZKSURKSEdLSkhKR0dHS0xOTExISElKTVBOT05MT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VvcHV3eHp7eHh6enx8fX5+f39+fn1+fX5+fn5/f36Af39/f3+Af4CAgICAgICAgICAf39/VERBQUJHSEI/OD9AODo7Nzw9Ojw/PDw9P0JDQ0xthIOEhIWFhoeIiIiIiIeGiIiIiIiJjIyLjIyMi4uLi15SUlBNTk1LSkdGQ0hKR0xKR0tPTEtKSkxNTE9QTkhJS0xPUVFQUU9PSklKSkxKTEZHSEdGR0lGRUVCQEJCXHByd3h5enl5eXp6e3t+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw4Pz09PkBFRD1CRENGSnWGg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0pFRkZLT05PV1ZRUE9RU1JNU1RPTVNMUFNVV1JTUlBMSk1NTUtOR0dKRkZISkRERUVCRENjcXV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PTxBP0FBRFRLQkhJRklLeIaDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEo7O1FTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUVBOUlBQUFFLS0tHSEpIRUZJSUlISWpzdnl5enl6e3t8ent8fXx9gH59fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHR0ZFPz9BQEVBQ0ZEQ0RLVlBKT09OUFB5hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUD9AVlVZXGRgVllicl5dVl1aVkVRWVpcWV9UWWdSVVZYVFRWU09PTUtMSklJTE1LT01Tb3R2eHl4d3l6ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Afn9+fn5WSkpJSEdGRERCQT9ITElNUEtJSk9TUVBUVlVWVHWFhIWFhYWGh4iHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUldWVFpadYNZVX2QYVxYXV5XSVZeXltbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmFzc3Z3d3Z4eXh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0pJSUZCREBBOk9RUVdYUFBQUVJTUlZXV1dXbIGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpaWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllab3N1d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWlpSU1FPUVJRVVJVU1ZedXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVVNUXlpYV1dXemtYWlxcXlNQUFBJTk9XVlhbWmRxdHZ2dHR2eHl5e3t8fH19fn99fX1+fX1+f39/gICAf3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTT09RT1FWUVNSUlRjZHaAg4KDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JRUU5LUlVSTU9ZUU1OUVNVVU1RU1JQTkxLR0NJR1JTVFpdbXJ2dnV0dHd7enp7e317fX19fn19fX59fn9/f39/gH99fX5+f39/f4B+e3Zzd31+fmR1fWlxdGBkXV5bWVVRTElMSWFsknRQUVNNUVJQU1tSU1JRUlVVYnN7fH6AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkJCQ0NBP0RQQ0NAQz5CSEdWQEhOTUddaVFIRk9GREVGSEdIQkNIR0hKR0NCQUNATlBNUmR0dXZ1c3R2eXx6e3t7fHx9fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmhlZWJcWFNRUFVSc1dlW09PTkxRUlBVWVNVUVFUUk9WYGtsc3Z6e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPj46Oj5APz4+PmpQS2FFRkhJRUI/SExNR01RVUpCRT8+PD08PT0/PT9BQ0I/Pjw9Qj5JTUZVb3V1dnN0dnh6fHp9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpPUE5LTFFSUVRVVVdRUVdWUFhbYl1hZ21tbG5qaGBucmltbHF1e3p9e3h6fHx4d3hkQkBAQTw6QkNBQUNBW1xPe05PT05LTE1PT1BMS0xXTkhHQUE8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXV2dXZ3eXx8fH18fHx8fn18fX19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PT15cWklHT1FRT01QUU5RUlNWWFNSWVROWVpbV1lcX15fZV9dXnF3a15gZ2t3b29sam9tbmxmYllHRkZIQkFGSEVFRkNMUU9hV1JYUVBTU1JVW09PUVdQTUlERj45OTY1ODc5Nzk6MzY1Nzk1PEI9ZnR1d3h3enl7fX18fHt8fX1+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtTVFNQUVVPTFJTVFdYU1RYUUxYWVlWWFhWWFldV1hYaHNrXVZgdGthYV9dZGBfXllVUE1PTUxJR0pLSUhGQ1BPU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU5OUducnV5eXp7e319fX18e318fX5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFdWVlNUVk9PVVZXWFlTVVRMS1NVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1RbZkpMUFJST01NTk1NTEpGUFBVWVNUT0pOT1VTVFxWUlVTU09NTElISEY/Pj06Nzg3NjU5OTY3NTY1V3FxdHh6ent8fX19fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVFNWVFJYV1lZWVJVT0lHT1BPT01SSk9QT09OTk9UTE1JUFBTVFUyPFhNSUFRPWNgUVNRUE5QUE9OTk1QTlRSUFJMSUxLT1JQUVJTVFFTT0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdWUVNGRkFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I9M0A+am9hUlJRQEdUUU9QUFFOUU9QT0xKTExPUE5NUFFRTlBPSkxNTUtHRUVDQjs9PTw5PUc2Njc2RG5xdXd6e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZVWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkI4RE1TXWdTUVNBR1VQT1FRUE1NTkxKTEtMTk9PUUxOTk1JTUxJS0tMS0dGRkVEPEFBPjtARTs8ODlUcnN1eXt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT49PUFAQj0+RUhGREZGSUdKSkBGQUFARUdESU9IUVJhXFFQUk9TTk9PTExPTUtNTE1PTltWS01RT0hKSENJSkxMS0ZGRkU/QkM+PUJHP0I/QGRydXd7ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTTktIQ0U9OTg3OT9CPzs+QUBAPkFESUVDSEdJR0lFQkI/PjxCQUBHSkVNT2JlUE1PTVdLTE5LS01NTExLTk5TZE1KTFJJSUlFQklKTE1OSkdJRkJCQkA/RUZFSERMb3B2enl5e3t6fHp3c3h0eHx8eXpucXJtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTExJTVBNUE9HS0U/Qj05OTk6P0I/PEFCQUFEREdLRkRJSUdHSENDP0I+Pz9APUNFRExNUVRMSklNVEZJSUpMSUpLSUlMTU9QUVBLR0NLR0NDS0pMTk9OSUpJR0NDQ0RJSk1MSVpzbnh5eHp6e3l8dnJwdXJ0eXl2eGpxbmpsbG50dG1zdXtzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FpcWhlcUhKQ0ZHSEdKS0lKTERHQjw+PTo6OjtBQj89QkJDQ0hFSkxKRUlJRkdIQ0M7QUBCPkA/QkRESU1PR0hKR0hLREhJS01ISkxISUpMSk1dUkhJRE5HQkVMS05OUU5LTUpLRkdHSk1OUk5NY25qd3Z3e3l7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByeXRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWp0aGVwRkpDRkVGREVFRkVHQ0NAPTw9Ojs6O0FEQD9CQ0VFSUZKSkxGSUlHRkZEQjpBQ0M+P0NDQ0RHS01ISk5IREhFSUxOTUhJTEdGRklJTE5LSUhFT0lDR05NUE5QTk5PTUtJSElPU1FSTlNnZ2Zyb3N4dnt6fGxoam9la3Btc3FmbWxoaWtsdG1wdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1mX3BHSkNFRURCQkFFQERCPj8+Ozs7PTs9P0RCP0FDRkdKRkpJTEhHR0dGRUM/PURFQj5BQ0JDRUdISUdNUElGRUZLTk9LRkhJRkVDRElJSEtJR0hQS0RKTU1RTk9OT1BOSkpJTVJVVVJQWGVhYW1mcHJvcnl6Z2VoaGNpbGZxbGZsbWdpa2xzbXB2dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRURGQkFAQUQ8QkE+QT06Oj0/Oz4/QUI/QEJFR0pGSkdJR0ZGRkRDQkFBRUZDQkJCREVFR0dIRkxQTEhOSUpMS0lGSEVGRUNDSEhIS0pHS1JNQ09PTlFPT09OT09LS0tQVVdWVlRZYF9daWBtaW5ocnNiZWZmZGhoZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Bya2tzTUdHRUdBQUBDRDxBQUBDPDg6PT46Pz1AQkBAQERGSEVIRkZIRkVFRENFQkRJRkNHRUFFR0VGRkdFSU1LSFFMSktISElFRkhIRUNJSUpLTUtQU05EUlNRUVJOT01PUE1MTlNXVldZVlheWl1kYGhjamlna19kZWZjaGdna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEFBQkVFPEBDQkQ8Nzo9Pjs+O0FCPj8/Q0VGREZEREdFQ0VDREZGRkpFRUlHQkdIRkdGRUNGSkpHTUpMS0hKS0ZJSEpIRUtLTExOT1JUT0hUVVRRVFBRTU5RTk1RV1pWWllXWl5aWGFgYGBeaGVjYGRlZ2dqaGhqZ2hubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3NzeU1ISEdIQ0FDR0U8QEVCRDw4Oj4+Pjw8QkI9QD5BQkZDRUNDR0NDRERGR0dHSUZHS0hDSUhHSUdGREhLSUZLSE1LSktLSEtKTUtJTkxOTk9SVVZPTFZWVFFUUlJMT1FQT1RZWllcWlpcX19dX2NeXGJkbGNgZGdocoVoZ2pmam5ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1S0lKSEpFQkRHRT1BR0REQDk8PkA/Pj9DQjxAPkFBRkNFRENIREVERkZHSEZIR0lLSkVKSEhKSEZGTEhISEpHTEtMTExJTUpNTk1PTFBQUVVWV09LVlZVU1NSUUxPUlJRVltbXV5bXV5gYGFgYmZdZGBmZ2BlaGpkc3NmamhnbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXd0Z3Rya3Fya3J3cHdJSktJS0dCRURFPEFGRERCOz8/QUBAQERBQEI+QUNIQkVERkdFSEVGRUlIRklISkxISEpKSUtKRkpLSElKSkdLSkxMSUlMS01OTk9MT1BSVVdWTU5UVlVTUlFQTU5UU1JXW15eX11eYGBhYWJgY2RlYWRpYmRpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXVzcHN3dHV1d3Z1dXRlcXNrcHFqcnZwd0pMTEtMR0NDQUU8P0VFREM9QUFDQkJDRUFDREFBRUdDR0dIRkVJRkNHSkdHSkZJTEhJSk1LTUxHS0lIS0tOUUtSUExTTUpNTU5QUFBUT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmFjXmBmY2FiZ25oYmloaG14dm1oaW5vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2c3FxdXZ1c3d5d3V0dWNtdGtvcGpxdHB3TE1MTExHREFARD49REVGQz9DQUVEREZDQkVHQ0JIRkJISklHSEpGREtKR0hKSElLR0pKTktOTElMSEpNS1pmSmRbS2xSR05NX25VbHNbcXBid2NSUGJ2dWh1Y2F2YVhucWJkdmluemZcbHVgbGtWYHd1aGpnaGZnbG1qbW9qbW9zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVycXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcXlLTkpLSkZCP0BCPzxEREZEQ0NCRUVERkJFRkdEREpFRUpMS0lLTEdHTkpISktHS0pJSkpOTE1NTExJTUxMW3NiZHBebGxVTE5lcl1nZXFsbnRncGlfYVlubWJwcGJraWpnb3F0ZXRublxwdmdwTkxyeXZrYWFrZWVseG1rdmxub3NycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3h2dXRibXVrcHBscnJxektMSUlHRUQ/QUE/PUJFRkJFQ0VERUVEQ0hIR0RES0hHS01NSkxMRkpOSEpLSklMSkpJSk1NTk1NTUtOTU1bcnBvbnBwa2pMT1BtWE5pYnRycGFtb3ZcWWxQW21tWnFta29teHh0c2lwXWBzbHFqVXV5eG9jXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHR0VFRUJBQj0/P0VHQkdESEVFREJGSUhIRUdLSkdNTE5KTE1HTE5JTUtISk1JSklKSk5PTk5NTE5NTFxoZHVdbHFWa01PUW5VWmtea2x2YWxkdFRlY05sWWxcdHBraWx4and1aHBdX3NraFdiY3d8b2NgZ2hhY2l0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Rxc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUdJRUVEQ0FCPEJAQkZDR0ZLR0VDQ0hLSEhGSUxLRk1LS1JSTEhNTUlOSklITkdKSkhJTk9NTkxKTU1KWnRwcG9xcWxrT1FSbllza2dvb3Fxb210Xm5YYXRfbm9wb3Fyb291c3R0alpedGN3eHJqbnpoYWFjZmFiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dElLSEpDRERFQEA+Q0NBRkNISU1IRkNGSkxJR0ZKTUxGT0pKV1JLR0tKSk5JSUpMSUtKSUlLTE1NTElLS0tTa2JZaV5famNyclpfWWpvX2VlVWtfY1thYVFgbWhcalxuaWlkW29lZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSkRFQ0ZBQEFFRENGQkhKTEdGQ0ZLTElFRkpPTElPSkxbUUpGSEhLTUlISkpLS0lISUdLS0tLR0hLSkxLTEpJS0xOVFtdVFBVTVFPTk9PVlFPUFFOT1FKSk5QUWRxaVRZVltbXFVZWl1YXVxcY2ZhYWZiY2ZfXmZrbWhtdHhydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNHQ0VHRkZARUM+Q0dERUdDSUtMR0ZER0pMSERHSVBLTE9LTFdNSUZFSElKSElLSExKSUZISEpISEhFRkxJSEpOS0hPXFdeT1xcYF5PWFlTXFxiXk1YWk1YYVJLWWFaU2BkXGFYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydE9CQ0RMTEFDREFESUVHR0ZLSktHRUVKSkpGREdIUEpMTUpNUklIRUFIRkpJS0tJTEpJR0VKSEVGR0VFSkdCSUxJSlRfWWBYYGFbYFVYWVRdXlpfUllcUF5cWU5fXF5TW15kXlpdYGNfWV9iW2BeW1VZWFpfXmNjYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3V5enp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1IRENCQ0ZHRUdHSUpKSUhERktLS0VFSElOSk5MSExOR0hGPkdHTElLS0pLS0lHRUlGQ0RFQkZKRD9JSkhOWmJZXl5hX1JUU1dfX1xdWV5RWVxNVl9XS1FZW1FbX2JhXV5jYWBiYmJjY2VaUllWV11aXmRgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhYUUpGREdFQkVHSEZHSElGR0pHSEZIS0lLRENLSk1NTExISkpISkc/R0ZOSktLTUtLS0lHSUVFQERBSElBPkhJRk9dYFpbZF1fVFFSWF1cXFxfW0tXXExSXFlJTV5RUV1fYmNjY2NiXGRjYmRjZVhSV1VUXVlbYV9eX2FhX2Rsa21qa2xudn51gXp8hIWFhYWFhYaGhYaFhoaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRUtJRkdHSUdHSkZGRklMSk5FQ0tKTE5KTElLSklJR0JISFFNS0tPTUtLSUhIRkU/RUJISEFARkVDU11ZXlhfWV9bXVVYWE9cXFFLSlZeWF5bXVZaYVJSX19iYmBgYmJfY2JiZGRiWFBSUlNcVFxdXV5eX19fZGhnbGpubnB7e3x+e4CCg4SFhYWFhYWEhIWDhISHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHR0RGTVJIRFJLRkhISERGS0lNUEVHSUpLTkxMSUxLSklHREhLUU9NTFBNTEtLSUpERUFFQ0hGQUFGQ0FVVUVcVF5TVl9YTlRVTVlaTEpLVGBhW19YX15iXU9ZYlxgYF9iY2FdYmFXYF9UUVBRUllTXlxbXV1eYGJmZmVsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZIRElTY1FFV19JR0dIREZNSlBQRklISktOTExLTUtKSkdFSk5RUU5OUE1OTU5JTEJEQUNDRkNCQENEQExIQ0xMUE9OTEZNRkZISUdGTEtNT1BJTE9QUFNQTFFTUlVaWFdZV1djVk5SVFBRUE9RVVRcWVlbXVxhYWVmY2hkbG1xc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES05eTUhIWU1HSEpIR01MUVFJS0pLS05NVU5PS0tMR0dLUFNTTlBQTk9PT0hMRmBFRF5MRGZiQ0xaSF5cc21PTVZtWEtDT19Ua1ZnSV1XVV5ETFFVTE1TVlFSVFhWVFhUVFxUT2VaaGhlWlVrVFhXVVtcW2BgYWJiYmBnaWdubGhyenx9foGEhISEg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVLUFRKS0dgVEhKT0pJT01SUUtNS0xPUlVST1BKTE5HSE1RW1lPUFBOUFFQSktRf1FJfFlZcnNXUG1HcW5vYVZQcXF0T0Jqc25xc3BTb19bblhdVlxYVWtoVV1WY1lgWVpeVVVXf2l0dXVfYXZfWGJcXGZbX2FhYWJeYGNnbW9sYHB3dHiBgYKDhIJ/fX6Adnh6bXZ+dHh9gHx+gIGChHyAg3p/gX9+d3dNSUVITU1CRExMR0pMRlJWTEtPSExSWFdRTk9PTVFUTk9RUEtMT0dNUFNbWlRRUk9QUFBLSVp4XVR4ZGhYUlNQdmZ0bHBibmZrUnJOTHdtanJwc3JxcnBvb4BdZXp1eHFxenF+cn1rdX1hUmh8ZXNzb3NzfH1vfnhvf3JgYGBiYlthYWhsbmtibGZnbXd+gYCDfnt4d4B0dnpocn5udHx+d3h7foCDeHyBdXx/fHxzc01LRmBdR0FFTU1IS0tISlBPTU5KTlZeWVVMUVNOWVlMU1JSTkxQSVFSVFlXV1FUUFBQUktIZ3hsY3hxbVpKS1R5cHVtdWJudlBkZEhldnFtd2+AamZ4eGlXclFoem1panp6fWx4en9waG5YdXVqdnVwgGFzaH1pbHh8b19fX2NiXF9kZWdqamVnYmNkbGxwcHN0c3NzeXFyeGJsdGdyeXtzc3V5foFzdnpufH15eHJuTUlSdE5DQkVQUUhLTEpMUU9PT01QWmBaWEtUV1BhXlJWUVlTTVBKU1RVWFdXUFVQT05TSktyb3V1cXVxY2hgVm5LcXBeR2h5V3ZUS2h4fXdgeXtzbmFdbW9kU2dydW5teXB3bHZzdHFsbVxzfnprbXl8bHVufGxxdnV4Xl9fYl9dX2VlaWdoZmVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21LS1pWSEdFR1JRS01OTExRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTkpUVFZXWVdPU09PTlJJUm1IaXdLYGR2dlRWbE5ubHtyYWpnf3VUS1drZ3xsbWx4X1pwentfYHpzY3JveHFoZHxpcntdVEtrX3Z1bGp2fHttfnlrfHBdXl5iW19iZGVnZmVlY1tjY2lra3JzcndnbWloZGdgYWxhZ3NybGdsbXJ8a21oa3t0bW1rbU9HSktISkhIUlFNT1BMTFNTUk9TUlhSV1RQV1pWVlRUVGFgUU9OS1RTU1FWVk9PTU5PUUpIUU1PVUxLS1JTUlFST1ZVUVFPUlJYWFBNT1VUV1hYW1tVUVJXW1dYV1tPUlRXV1hRXVhWXFVUT1hSV1dYWVpgXGdyX1tbWl1dX2NaX2NjZWdkZGRjWmRiZ2ZmbW5tdWZmZ2NgZl5dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUElLS0xNS0pUUk5SUVBMVlVUUFRVWFVaVlJbXVZVVFdVWVhPT0xOV1RQTlVTTlBOTFFQS0lRUUtRTUpKT1FUUVBRU1JKSE1PUFFSUFBQVFVSWFdcV1NSUFFVVVVTWlFOUlFXVVNZVlRYVFNRVFNVVVlZWF5aX2FdXFpaXFxgY1xeYmJkZ2VlZWJZYGFjYWJoaGpuY2FkXl9jXVpjXGJtYV5mZmdtc2RpaGtrZWRjZmhRSktLTk9MTVRRT1RRUk1YV1VUVlhXV1pWU1xgVldWWVVYVFFQS09YU1BOVVBOUU5MU1BNTlVTTlFOTU5RU09UUFJUVE5LTU9SVFRRUVFVV1VZWltZUlVSVFhXVllcU09TVFdVVFlVVlhUUlFXVVZYXFpcYF1XWV9dXl1cXWBhXltiY2NoZ2ZlYlhgYGJdYGhlZ2VhXl9dXV5aWl9aX2dgXl5dY2hrYWhmaGZkYGJkYlBLTUxQUUxPVFBQVFFPUVpZWFdZWlpYWVZdamRWWFlaV1ZTVE9LT1ZUUE9UUFBRTk1SUU9RWFRRUU9NT1JUTVdRU1RVT05OUVRWVVJSUlRYVlpdXFpWVlFSV1hVW1tWUFNVVVVWWFNXV1RSUVhWVltfW19gX1ZfXV5gXVxgX19fWmJjZWloZWViWWJgYl5eZmRjYGJdXFxcXFlaW1hbYVteXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNVUU9WXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NV1NNTVJPUVJPTVBTUlVaVVRQUExQV1VQVlJTUlhNT1BSVVhVVFRTVFlYW15dXFtWUk9VVlVbWlZRU1ZUVlhUU1haU1JRWVdXXV9bYGBgVmJcYGFdYGJfXGBdY2FjaGllZmBaY2BhX19lZV9gY1taXFtcWlpZWVdcWlxbYF5gW15eYWBfY1xZYFpRTk9OVlFQVVNQVVRTUFdcXFxZXlxfV1xeanB3eYBjXFtWVllSTlBXU05RUVBSVFJMUlRTWVtXVU9STlNYVVNRVFFRWU9RU1NWW1ZWVlNWWlhdXlxcXlZTTlRWVltbVVFUVFVXWFJTWVxUUlJcWFpdXl1iYWBXYltjYl5hY19cYmFiX2RnaWVnXVxkYGFgYWNkX2JfWVpfW1xbWFhZV1daWlphXV1bXVxcWl1gV1tbWlBPT09ZUFVVU1JYUlRQW11eXVxgXGBVXFxoanJ9c2xoXFVZV1FPUltTUlFUUlRVVEtRVlVaWlpTT1NRVVVUUk5VUVJaUlRVVFhdV1hYU1hcWF5dWVpdVVVOVlZXXlpXUVRUV1hYU1ZZXFRSVl1ZXV1hXmNjX1lgW2ViX2RkXl5jY2FeZWZpZWZeXmRhYWFiY2RfYl5YW19bXFtYWFhYV1taW2BdW1tcW1haW15WXlldUE9PUlpQWlVWV1ZUVFReXmBfXmJcYFVdXmJreXVtfWxaVVpWUVFUXFRUVFVUVllXTFJaVlxaXFJQVVNXVVVST1dRU1dTV1VWW15YW1lVWl5YX15ZXFlSV1JZWFlfWVlSVFVZWVlVV1lcVVRaXV1eYWJgZWRdXl1dZWFiZmReX2RjYFxnZWhmZGJgZWFfYWFiYl9gXldZXlpcXFpZWVdWXVpdXltaW1xbV1lcXVZYV11TT1BXWVFcVVZZV1dVWF9gYWFgY11gVV1eYmVldoJ7aFhZWlRWVFZcWFdXVlZXXVhPVVxZXl1dVFNYUlZVU1FSV1FTVlRYWFheXlhdW1VdX1hfX1hcVlFYVFlaWmFYW1RWWFtZWldYWVpXVl1eYF9kY2JlZV5iXGBmYmRmZF9gZGJhW2ZjaGZkZmFmX19hYmFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1laWl1fXVRZXVVOVFpWVFxVV1dZV1ZcYGFiY2FjX19WW2BkYV96dW9oWlxaVlhWWFtaWVtZWFlgVk9UXVtgYVxVVVlQVFZUUlVVUVNVV1tbXF9fWl9cVl9fWV1eWV1WUlhXWVlcYlldVVZaXFpbWlpZWlhZX19gYGRjZGVlY2RaYmZjZ2ZlXmFiYGNdYmNpZWRoX2deYmJjYWFgXl9YVFpaWltbWFxYWFxbWltXV1pYV1xbXGBdVl1dU09WWlZWWlZZVlhXWF1fYmFkYWRhXllZYWRiYGtmaF5cXVtXV1laXFxcX1tZW2JWU1deXWFjXFNWWVBWVVVVVVVTVVRYXV1fYGBdYV1XYV5bXlxbXlhVWFdbWl9fW15XWFxcXF1dW1pcV1pfYV5gZGRkZmZnY1ljZmVoZ2ReY2BfZWNdZmlkZWlfZ15jYmNhYWBfX1tYWVtZWllYWlhXW1taW1dYWlRaXVxbYFxVXmJNUldZVldaWVtcWVdZXmBiYWVhZGFdXllhY2JfYWBhX11dXVhXW1tdXV9fXFpdY1hZWF1gY2RfUlhZUFdVV1hXVlZXVl1dXmFiYV9iXllhXV1eWVxdWVhVVltbYF5cX1lZXl1eXmBcWlpZW19iX2JlZGVmZ2hjWmVmZ2lnY19jXmFmZVppaWNmaWNmX2JiY2FgYF9dXVpXW1lZWFhaWVdaW1pZV1hWVVtdXV1gYGJheEtXV1xZV11cXF1aV1xdX2BiZGJjYV1gWGJjYmBjYWNeXF1cWFdbXF9dYF9dW2BkXFxYWmJlY2FSXFlPWFZZW1lZV1laYF5hYmNgYWNfXGJdX11bXl1ZWVRYXVxfX15fW1peXmBiYltbV1tdYGJiY2VkZ2ZmZ2VdZWdoaWZjYWJbY2dgXGlpY2hpZmVgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldWWFBYWl1hY2Zmcmt/SllXXVtaX11cXlxYXVteX2JjYmFhXWJbYmRiYGNiYl1cW1pXWGpxYFxgX11cYWNfXllZY2VkYlRfWlFZV1xdXFtZW1tjYGNjY2BiZGFgY15gXF5eXlpYVVteXFxhYV9dW2BhYmZiXltTXF9gY2RkZmVnZ2ZmZmBmZ2hoZ2RkYFtlZ15haGhjaWhmY2BiYGNiX19fXV1bWltZWFhYVlpXXFtaVlZVTFhYXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhomHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnV1dXV1dXV2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXp7e3p6e3p6enp6enp6ent7e3t6enp6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dXR1dXV1dHV2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5enp6e3t6enp6enp6enp7e3p7enp6enp6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHjF1NLS0tLUk3t9fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT08/ExcXFxcXH0tTU1NPT08S+vr6+vr7K09LS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19eNXn5OTk5OeZe39/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OTl4NTU1NTU1Nbj5eXl5eTl0svMzczNzNvm5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12fn9/f39/gHl3d3d3d3d4eXp6enp6eG9vb3BwcHBycnJycnJyd3p5eXp6en6Dg4ODg4ODgoKDg4OCg4SEhISEg4OCgoKCgoKChISEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ0dHR0dHd1dnd6e3h7eHd2eXx6enp5fXl5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXp6enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3Z6fHl9fXt9e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3dnp+e319fX58eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3eHl9fXt9fnx4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt4enp6fHx8fHt+e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl7eHp6eXx4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eHl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm95eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fHx8fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLiouLh4eHhIOCgYGBgYGBgYKBgoKBgYGBgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhIKBgYGBgYGBgoGCgoGBgICBgoGBgYKBgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgoKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgYGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYGBgYGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fHx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhYaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiYaHiYyLi4qGhoOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+KiImKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KTkIuKiouPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKCgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4OBgYKEhIKDgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBgoOBgIKDgYKFhYWFhoaHhoWGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqIgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoGDg4KCgYODg4SEg4KDhYOCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46QkY+LiYeCgoKCgoKBgYGBgoKCgoGBgIGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDg4OBg4SFhISFhYSDg4SFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiYeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKCgoGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiYeEgoKCgoKCgoGBgIGCgoKCgoKCgYGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4iHhYSCgX5+gICAfn5+f4CBgYGCgYCCgoGCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgYGCgoSCgoOEgoOEhYWEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GCgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIODg4WDgYCDgoOFhYODg4SDhIODhISFhISEgoGAgYKDgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5OSj4yMioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAgIKBgX+BgYCAgoGCgoKBgYKCgYCCgoKCgoKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYKCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJOSlJKPjYuHhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4aGhoWGg4ODg4GAgoKCgYKAf35/f4CAf4B/gIGAgH+BgYGBg4GAgYGChIOBgYGBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgYCAg4KCg4KBgoKDg4OEgoODg4KAgICCgoKDgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOEg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SFhIKCgoOCgoSCgYKGhYOFg4OEhISGhYSEhYJ/fX19foKEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSEhoWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyKiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgICAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4SDg4OEhYOCg4SFhYaFhoaFhoeHhoOBfn9+fn5+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgoKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODg4WFhYWHh4WFh4WBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaHhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDgoSEhIWEg4KCg4OEg4OCg4WEhYeHhYSCgH9/f39/gH9/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eIiIaHhoeHhoaFhIOEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4eFg4OFhIODg4KEhISEhYSBgIGCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiYuLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISEhYWEhYWGhISEhYWFhoWGhYOJlJOQjpGOioaFhoWDgYGBgoKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4KDhImKh4eEhIWEg4OFg4WEg4OCgYKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoSIiIeIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCgoOFiYqJh4WHhYSFhYSDhYSDgoKCgoKDgX59fn5+fn5+fX1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4eJiISDhIOFhISFhYaIh4aFg4KCg4WHhoeGhoOCgoOEgoODhIKBgoGBgYODg4OEkZKRjo+Ni4eEhoaDgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYaIi4qGhIaEgoaGgoCDg4ODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYODhIWFhYODhYSEhISEhIWEgoKDgYSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OEhYSHiIWDgYCAgX9+fYKDg4ODgoKAfX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOAgoGCgoKBg4OAf4CAgYOCgICAgIGBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGjJORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn9+fHx/g4OCg4KDgX19fn+AgIGAfn19fX1+fXx6enp/goKAf39/f35/f4B+fYB/f4CAgX+AgIF/f3+BgX59fX+AgX9/fn+AgH+AgICBf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIF/fH19fn19foCAfn1+fXt9foKDg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6eXqAgH9+f35+fnx+f35/gH9+f3+Af4GAf359fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fn6Af4B/foB9fX+BhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXt/f35/f39+fX5/f4CAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/f4B/f35/foCAf36Af39+fn5/f35+f318fH2FkpKNjIuKiImIhISEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgIB/foCBhIOCgYGDhISDhICBgICBgIGAgYKCg4GAgX+AgoODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2Af4CBgYF/f4GAf4F/gICAgYGCgoB+gH5/fn5+foGAgoF/f39/gIB/f39/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISDgYODg4KCgoGCgX5+fX19fn6AfX19fX19fX18e3p6eXl5eYCCgoKEg4CCg4GAgoCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/f4CAgICAgIGBf359fn5/f39+g4aHh4iChYSFg4SFhIWGhoaGhoWFhoGAg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OCgoKCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIeIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/gH9/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aHh4eHhoeHf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIODf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYWEhYOCg4OCg4OCgoKCg4OCgpKQi4iIh4iHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CAgH9/fn1+fn+Bf4CCgYWFhYaGh4eGh4eIhoeHh4aHh4d/fH18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZeEg4OEhJSTgIGBf39/fn6Ei4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko6LiYiIiYeHh4WGhYSFhIKBgoKDg4ODg4OCgYGBgICAgIGAgICAf39/f4CAgICAgYGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhISGhX98fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fH+Cg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4uKioyJiYmHhYaFg4OCgYKCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCg4SDgoOCgoWGhISFhYSGhIOEg4KBgYOBf319fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yBenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYKEkZGNi4yMjoqJiYWFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYODgoOCgoGAgIB/gX5/fn59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+f36Agnx8f3+BgIKAfnx7ioJ9gH9+gYCAgYKBgoCAgIGAf4uTj4uLjY6NiIeHhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIGBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7enp8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fXx9fHx9gH+AgH6Afn6ClJGLjI2Nj4qFhoaFhISFg4ODgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKDhoeGhn6IlYp+gYGAf4B/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dh399fH6AgIGAf39+fX19fX57e31/f3+AfX9+gIyRjYuMjY2Nh4SGhoWEhISDg4OCg4ODg4KBgYGBgYCAgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KDhoaFf3+FgX5/gIB/gH5+f35/gIB/gIB/f319fHx9fn18fX19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/fouEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1+f399foB+fn6EkoyLi46Mi4qGhIaEhIODg4OCg4KDgoOCgYGBgYGBgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B6fX18fn+AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx8gYN+jH58e3t9fn1+fn17e3t9e3p7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIqPjIqKjIuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf31/f31+f39/foB/f39/f3+AgIGBgH99gH9/fn9+fn9/f3yCfn59fX17e319fHp8fH6AgoF/gIB8fH18fHx8fH18fXt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBgoGFhoWFhoaHhYKEkY6MiomKh4eFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/fn5/gH9/f39/f3+AgYKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn1/fnx8fHx8fHx+fnt8e3x8fHx9fH18fnx9fHx7enx5e3x7e317fX5+f4CAg4eJiYmKiYqJhYiRjYuHiIaFhYOCgoOEhIODgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gX9/f39/gIB/fn5+fX+AgH9/f3+Af4CDgoB/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX19fX18fXx9fX1+fH17fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6ChYiHiIqLi4qJjJCNjIiIhoWEg4KCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn5/gH+AgIB/fn9+gIF/f4B/gIGAgoSEgYCAgYGAgX+AgYKBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEh4mKiImNj4yKiIiFhISDgYKCgoKDgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eHx6f3KBfXt7fHx8fn59fYGBf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx+f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX1+fX5/fX19e3x9fnx8e3x9enp5eXp5e3t+foCBg4eEiI2MiYmGhYSEg4KCgoKCgoKBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4f4KAgYKCgICBgIGBgICBgoKCgoaFhIGBgYGBg4F/gIKEgX9+gYB9foF+fX5/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn2Ag4CJjImKh4WFhYSDg4KCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYSBfn6AgH1+gH59fn6AgH+Bfn+Af39/gH99fn9/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIF9fHx9fXx8e3x8e3t7fHt8fHx9fImJh4eFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dnd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6AgX98fn59fX17fH58fXx8fHt8e3x+iYWGhIWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen19eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfX6Af4GAf4CAgH9+fX19fn1+fn19gYR/gH9+f4GBf32Af319fn1+fn1+fHt8enx7eoCFgoOEhYSEhIWDgoKBgYKBgICCgoOCgoOEg4SDg4KBgYKBgYOAfoCBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXR1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAg4F/f4B+gIF+gIGAgH9+fn5+fn1/fn6FhYCBgH+Ag4F/foGAf36AfoB/fn17ent6fHt6goN/goKCgoOCg4KBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgn9+gIF/fn1+fn5+fX59fXp7fIWEe3tzeXt8cHd1dnd5dnR6hISBhISDhIWFhoSDg4WEgoODgoCBfn9/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GEgX+Ag4F/f4B/gX+Af3x7e3p8e3yBgH+Bf3+BgIKCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4KAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgIGAgIB/gIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fX99f4B8f39+fYGAgH59fYB/foGBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGCg4KBgX9/g4B+goKEgICCgYKChIF+e3t8fHx9fX1+fXp+fX55fn9/fHx8fn1+gYCBgYGAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFg4OCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+f359fYB/gIGBgX9+fH5/fn5/gYJ/gYGCg4eFgX9/fn6Af4CBgICAgIKCgYCAfoCCf36BgoKBgYOCg4OFgn99fX18e3x8eXp7en55fHl4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoKCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+gH+BgIGAf359f39+fn+BgH2AgIGDhIN/f359fn5+f4B/gIB/gYKBgH9+f4F+f4CCgoCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e358e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWDg4ODg4OCgYKDgoGDgn+BgH9/fn+AfX19fX+AgIB/f4B/fIB/f4GAgYCAf3yAf35+fn9/fX5+gYGCgn5/fn1+fn5+f3+Af32AgYB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foV9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnF3eXJ4hYWFhYOEhIKCg4KBgYKBgIOBgIB/fn5+foB+fX58foCAgH+AgX97gH6AgH+BgYB/fYB/fn5/f319fX6AgYGBfn9+fn59fX1/fn9+fH6Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fXt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYGAgIB9fn5/gH18fn1/gIGAf3+BgHyAf4B+f4GAf399gH9+f39+fX18gICAgIB+f35+fn18fn9+f358fYB/fn1+gIJ/foCAf36Bg4KCg4WFgoJ+fnx7e3x8eXd7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNweHdxe4WGhYWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAf4GAfX6Af35/gX+Af3+BgH+Af31+fH1/gICAgH9/f35/fXx+f39/f319f39+fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYeEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYF/goF9foF+fn+Bf4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYR+dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgYGBgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/gICAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/gIB/f39/gH+AgICAgH+AgYCBgYGCgYCAf39/fn1/fnuBkox6fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWGg4OCg4KAgYCCgoGAgYGBgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH9+fX6Afn2AgIB/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5+fIGGiXx8fnt7fnl6e3p7jX53d3l7fHt9fHx8fHt9fH19fX18fXx+fn5/f358enx9e319e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIGCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359f4B+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICAgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4GEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4GAgH+AgH+AgYF/gICAgIGAgYGBgoGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4ODg4KBgYKDgH+CgYWDg4SBgYOAgoOBgYCAgIKDgoCCgoWDf4GAfoKDgICBgICAf4CAf4GBgIKAf4CBgH9+gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoKCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX54d3Z5eXl8fXx8fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KChISAgIKBhoKEg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf31/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9gHp5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBg4GCgoGCgX6BgICCgYKBgYOBgICAgICBgoGEgH6Bg4F/f4CDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4OEhIODhIODgYGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+fn+BgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChIaEgoODg4SBhISAg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoKFhISDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYOBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gIB/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dH2Hh4OChIWDg4SFhICChIWEhIOCg4SEgISFg4KCgoODgoOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e31/fX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3V2f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgYKCg4OCg4GBgYGDgX+ChISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4SEhISEhIWEg4OEhYSEhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfHyAgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYGFhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgoOBf4KEg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SDhISEhYSEhIWFhYWEg4ODf32BhIB9fXx8fHx/gX59fn9/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYGBhISFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSBf4GDf359fH59fX+BgH9+fHx+f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOFhIKEg4aAgoWFi4mEhIOEhYWDh4aGhISEhIWEhISEg4SDgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgX2BdYF5g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOAhIOAf319fn19gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIaEgYOEhYOEhYOKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKDdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8f3OCg3+Dg32BfX1+fX6Cg4F8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnl5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26AiHltfXJzdnN2bW14bHB5bHV9f359foGAgX2Afn2Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gX9/fH99fIF+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9+goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4eIhoeEhoaLioWEhoeHhYOFhYWEgoWFhYWGhoWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhYaHhoWFhYWGhoiFhYaFh4eFhoSGhomIhYSJioiFhIaGhYWDhYWEhYaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x1cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomJh4aEhoWGhoWGhYSGhoeGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SFhoWGhIaEg4SEhoSEgYODhISFhIWEhYSGg4aHhYaEhIWHhoSEhYaEhX13hYOEhIKCgX1/fnt8e357fHx9f359fH59gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhYaGh4eGhYeIiIiIhoSHhYaGiIaFiIeIhYeGhoiFhYaHhYaGhYOChYWGhYWDhYSEhIWEhYWEhYWEhoeGhoWEhoeGhISEhYOFhIKEg4OFg4OCfYB/e3t8fXt8fH1/fnx8fn1/f31+gH5+gH99fXyAfX5+fn5+f3x8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhIiFhoeGh4aIhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhoSGhoWGhYSGhoWEg4SEg4WHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fH9+fX1+fn19fH98fn58fYGAfHx8fXx8fH56e3t9foiHgoWIh4eGhoaGhISGhoeGiIaDhISGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaHh4mIhoaIh4iKiIWHiIWHh4WHhoeGh4WIiIeHhYaGh4WGhoWBhISFhoWFhISEg4SFhYaGhoWGhIaFhoeFhYaGhYSChIOChIeDhIGChISDgYCAgHt7fn18fHx9fXx8fH19fH18fn18fX18fHx9fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaDhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhYSDhISFhoaGhoaGh4WFh4WGhYaFhIKEg4ODh4GDgIKDg4KCgn+Ae31+fXt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1/fXx6ent7fHyIh4KGhoaGh4aGhYOFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4aIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoeGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYaHhoaHhoaEhoWDg4OCgoOGgYN+goKDgIODf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWEhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWFg4WFhoaGhoeFh4aHhoeHhYSFhYOBg4KAg4WCg36BgYF/g4F/f35/fn98fH1/fXt9fXx9enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WHhoiGhYeEhoeJhoaIh4eHhoeIhoSGhoaHhoWHg4SFhIaGhoeFhYSDhYWHhYeGh4WGhoaFhoaEg4SFgYGCgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15enp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoWFhYWFhYODgYOBgIKBhYKAgH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYaFhIeDhIWEiIaGh4WFhIKGhYaFh4aHhIaGhoaFhoODg4WAf4GAgISAg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18fn5+fHt7fX59fIeGhYaGhoWFhYSFhYSDgoGAgoGAgICDgX5+foB5en2Ag4OEh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIWFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEg4aFhoaGhoaEhYaGhYWGgoKDhH9+gICAgX+DgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx6e3t7fH19fXx/fn18fH1/fnx7h4WFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBg4SEhIaGh4iHhYWIhomHhYOEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOFhIWDhYWBgYODf35/gH9/f4N/fIB9fX+CfYCBfn6Bfn19fX1/e398e3p5enp5enp8eXp6e3t7fXp7e3t7fX59fYB9fXx8fYB/fXyGg4aGhoaGg4SChYKFgYGAf3+AgH5/gIJ8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYaIhoWEhYeFh4WFgoOCgYOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhISDhIOFhICAgoJ/fX1/fn6Ag357f3x8gIF9gYB9fYN8fn59fX57fnt7enl7enl6ent5enp6e3t8ent8e3t+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn6BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeFhISGhoSFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoODhIODgH+AgX59fH5+fH+DfXx+fHyBgH6Cf31/gnx/fn19fHx8e3t6enp6eXt6enp6enp6e3x5e317fH5/f4GAfX59fX1/gICAhoSEhYSFgoOCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhoSCg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhYWCgoKDhYSCgYGBgoCFg4F/foB/fnx8fn18foN9e358fYF/gIN+fYCBf35/fXx7fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzo8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRkw9ODc2NTk5OTw+OT88RDo7PDg6PD47OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojs4OTo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTc6OTo6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXU1dTU1NTU1NXU1NTU1NTT0tPU1NTU1NTU1NTV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8rKy8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2trZ2dnZ2dnZ2tra2trZ2drb29vb29vb2tvc29vb29zb29vb29vb29vb29va09LT09PT09TU1NTU1NXW1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szMz9DPz8/Pz8/Pz8/Pz8/W3t3d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKiomSmZiYmJiYmJiYmJiYmJeMi4qKioqKioqKioqKi4aBgoGBgYGBgYGBgYF/j9PS0tLS0tLT09PS09PS3ePi4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzNDS0tLS0tLS0tLS0tLR3uzr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NRYmxra2tra2tra2tra2tpVVNTU1NTU1NTU1NTU1RLQ0NEQ0NEQ0NERENDP13S09LS0tLS0tLS0tLS0ODs6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8NztAQz42Ojc+Pzs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzMzR0tLS0tLS0tLS0tLS0d3q6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXVmVwb29vb29vb29vb29vbVlXV1dXV1dXV1dXV1dYUEdISEhISEhISEhISERg0dPS0tLS0tLS0tLS0tDf6+rq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs+QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183N0NLS0tLS0tLS0dHR0dDc6Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYmFveHd3d3d3d3d3d3d3d3VjYmJiYmJiYmJiYmJiYlxTVFRUVVVVVVVVVVVRa9LT0tLS0tLS0tLS0tLS3unp6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI/Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzc7Ozs7Ozs7Ozc3Nzc3Nzs/Pz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs/Ozs7Oz87NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLzc7Ozs7Ozs7Ozs7Ozs7NzMzMzMzMzMzMzMvLy8zMy8vLy8vLzMzLy8zMy83U1NTV1dXV1dXW1dbW1tjY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3Nzc3Nzc3Nzc3NzdHNzc3NzczP09LSzs3P0s7Ozs7Ozs7R1NTTz87R0s7P0tTV1NDPz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW19fX19fX1tfX19fX1tfX19fX19fX1tbW1tbW1tfX19fX19fX19fX2NjX1tbW1tbX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7RsIOEk87TuJ7P0ZyChIrGz87Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7PyZu7uJ2vt5eZubqVuLmvodLOzs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD5BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0cOij4CJyZ2jqLLRkn1+r7HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz9G/noqn0NPChpq11dPNnp7E0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/RuqSsnJ7R1qOYtNTTwKCg0NDQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/P0cCgnpOlt9iimbXU1bCiqdXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTo6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDSpq+um6bZopm11NWkobnU0dHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0cnXxJig2aKattTOnp/J0tHR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ozw5PT49PTs7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cWNnqCdqNqjmrXXw5+h0tHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocnBoa2hoL/Yopu02bKkptbS0tLS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT1auNj6nV1rKExta5g7/V0tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj47PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHUwb3V0tLRxNXR0cLT0tLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExAPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0dTV0tLS09XT09PV0tLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTk0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs6ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUZDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODY2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4Nzg0Oz88Pz05PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWh4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIN2dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8ODw6NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NjY2Nzg4Oj07PD46PDo6PT05PDw9PD09PDs9REhEQ0E8PDw8Pj5AOzg8ODE1OkFGRVeutbW1tre4uLm4uLi4uLe4ubq6uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4ODk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODU2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urq5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTk3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpkbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTU4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXhwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1Nzg3OTc7Ojo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tbW2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWoqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5Oj43NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUI/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ozs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0BEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0JAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo7Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo7OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5ubm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZycm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pj86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkBAPUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojw9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw6Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc6Ojs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ubm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi46PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Njw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWPi5STkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NTM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yPj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVMT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QUI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4eIhYSIiImEgIJ/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojw6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTdCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQjH+HjYyLi4eSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVUYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjU2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOko6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcU19NSFFJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKlqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGRjW11ZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKWioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsZ2JiWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq2mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2Necl9oX2NTUVlUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tfXlpcVlxoZG9jbmloYl5QUEA/Ozo4OTg8OzYyNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraulqaSlqqeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiXnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta25hX2RgUE9BQDs7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTs7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloKGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbGh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc4Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLazurGqrrSxsLG0tLa8vL68vL3Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqTlpSUmJOQmp2YiouHgIB8gnhhXllUYWhgZnNvc2l0Y2lkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGw8O5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubVtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsae8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDs+QkRFPj49QENDQ0REOzo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+1s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpORmZeeoZWYmpKYlJWRlJqYk4+TnZaSi5F+enx/dGtrbmRvbGhxeG95aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkJAPUBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDLxsbAxcfLyNTLysjGv7u7vsS+xcjGxsPEw7i0wLe0vcHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi4u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZuYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcndzeGZmXWRbUlhJRj87Nzg4NzYxNjk3NTQzMzM2NDY7ODo8Oz08OD0+PDo7PDo9Ozs+PkRBQUNCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCKi4yOkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8nOycHEwcfKysbKxczIzcbIxb/DwMvNz8nGw8PEwsS9uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpamhdam9teHdiYmBgXVhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM1Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjHycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytpqm7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JhZ3VnaWh0bXhsXWRbVV9ZTEhENjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD89P0I/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHGwcvKyMbMyc3FxsXDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlkdG5zYlxiVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsXHyMbSycHDw7+/vsTLyMrLyLy7yMfJzcjDyMnJxcXDwsHCx8fJysfMyMfIzcbLz8W3wMDAwLu7vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cm9mZWdjamRham1ubl5YXFZVTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsG5u8O6uLm8vsHGwca6ucnJw8XEwMTBwsHEwcO+vsLAwMHCy8PGzMvFyNHCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZmJaWVlcWFFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozs6Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/ur3Aub26urS/uLW3s6+7vLfAt77Cv8G7v8C8u8W+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKeho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5h31xY2BiYmdqZmZpZWldVVVTWU9TS0U4PzY7Ojc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo8PUA/PkA9PT9CPjxAQUNDQT9DPTo2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W6wbi+uL+8vbe1t7CuuLa5v7vAwLfBvLvDtrrIuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaGioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZGZvaWVrZ1hYTktLSlJJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw5Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7a8scK2tLyxtLa4s7q9v728sq2vrLGwt7y2vLzAxLm3t7e2urm6u8C9w8C6xMK+x7i5uK23tbi6tLezu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby7urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25wZ3Brc2VibF9bVEhLSkRKQkNHPzk7OD08Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pz09OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72/u8S3tri2t8C/xLzCxcXHx8rJxs/CwbiutrW8vri7sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/Cur/Bv722t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bndjZ2FbYlBLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDs+PDk+OTk9Pjs/PkM8Pz5APz0/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLmvsry8sLe7tru8q6ujsLm9vrO8vrzFuLK4ub3HycrDx8jGxsnIzM7RzMrEtbrAw8i/v7W/wL/Gxr/LxsO/wbzAw8zKx8XGwbm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYWFNSE0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ8QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv62zvbS4wbGwsbS8w7y6ur68xL+3vb+9x8zGx8nGxr/ExMrIzMzNy8bCw8vOwry5vbq5wMO/yMbEwcG/xcDKycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13e19wY1tdX15TST5CRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9QD5BQUE+PkFCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq2ucS4tby2ur3BvLu/tr/Bv7y/usDLwsfIwL+8vL/FwsfLyMHDwMDJysLAu7uwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem1zeHNncF1aXlxZUUVEQ01JQUQ9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I7Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u726w7u3vbe5wLu6uLi1xcHDw7u5s7S6wb2/x8C5wLy+xcS9vrmysK64t7/Dx8PEvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KmoqWqrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHZsdXpwbWhcX19ZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyYmpiYlZmdmZ2fm52bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucHAt725uLm2tb+ztLK4sbvBwMO3t62wtbi4uMK6tLu3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpzdnZ3bXBgXmVdW1RKPD4/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7e6t7a2srTAtrK0uLO6wMHDubeysrK0sre+urO1sry6vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxdHd0dnFsXmJgW11OSEE/PUhDRk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZOYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27vLi2uraxwLq3ubi5u8HBxMO7u7a0tLC2ura0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFybq9vraxp6SeoamxrrW5trKxq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce393b3xvdXJtY1xmWFxdUk5NQT5KQkBKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47NjY6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7GttrqurLyyuLm3u7+9ub7AtL+7vLq4vsK8wsrHvsC4ubaytLaztK+su7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assq6zqaapqq6popqXl5GcmpijnqKir6ekrKapmpqemqGnp6anqa+2squ0tq+qsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cnZzbXRpa11balRdXE9NSERGTEFGTUY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48PDw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm9tbK4tLm6tbm7tbWztbu8wLu+wLS/ubm6sbrDvMLKxb+7v7+5s7SzsbGusLm5try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Ojo6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSYnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEg/SFFETUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4Oz0+Ozw8Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKknqCfp6Coqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby4wMG+vLy8ua6tr7Kyurq3t7W1vLSvtKu2urjAxMG7tby9uLKts7CvrK63trK0ta+qpJ6bnJyeqKifoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moqquepaObo5yVkIyPj5CTkJaVlpifnp6amaaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHiDfHZ/eWJ3bG5cUGhUUE5HT0xMQ09RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PTs5Oz07PDw9PjxAPT88ODtAQEE/Pz85NDk8N0FDQkQ9QEOOqqSjoqGinaulpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AubWnpayqqLWysbCur7Knpq+jr661wbq1t7K3trK0q7K0rqqrr7CytK6lnpKYlI+ZoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqmwo6WnnqCclZOQj5GQmJCWlZiXn5ibmZujmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn18gHV1fW1re2RoVVFjTUlIR05STUpNRztEQDwyPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJiXlqGorK62t7q5ure3u66ooKGpoaCtq6qmqaSpo6SupaystLy3rLKxr7Gtta+vs7Wqp62so5yZlI6RlpeZmZ2go6KbnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusqulqqqgmpiYmJWTlpqTlZWZlZqXl5ignpycl5uhm56ao6eln6GioqOcm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeHpgYlJVX0hJSUtTVElSUEw5PkE2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5OcnqOorq2sq6uvqq+pn5eepZ6epaakoKKfpqCirqusrbWytqavtKupqrSxsLC4raehnJ6alJibmpGOkZaRjI+OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu6qKarp6urqaysp6Cgo7GtsbG0qbGvopmcnZ6hmZubmpiZm5SVmpaYnKShoJqjoZqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dnZzaIJsZVxTWllNUUpOT1RMUkxBNz5CNjg8NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT83NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+VmZKSnJihnaqip6Cep6Gkn5ySnKKbn6Gjnp2gn6Ogoq+urK+xrLanrbGtpqawrq2ssKegn6Kgl5GUnKGcmZiSk5+doaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr23vrCssa6tqaq0sbCnq6iytbezt6yxtKOgnaWgrKGhoqCfmpiWlZ+bm5ikoaCeo6GgnpucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XW1aUmBIUVVIRlVWSkJNRz1KSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo+NzU4PT0/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuOk56ZqJ2unqeenKGdnpqakpienKKioKCdop+fnp+pq6esqaq0q6utq6WlqqirrKqln56ZkpKUmJmWlpaMiIuPlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t72zs7Whq6KpqLKpqqinp5qZnpmppqCZp6Cfn6eopaSenaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQlZNSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg1ODw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJqqoLGit6OwpqCenZ2XmZaZnpucpJ+fnaSdmp2cpKKko6Kqr6ynqaOgoayvrqqrp6Cen6Kjnp+em52clJSVlZ6emJSGnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusrqexrbHCtrjCxsDIysDKv7C5ub25wr24s7vFw7zCu7ezqbKtqrO0r7Ouqa6jnauntrGsoq+loKOvsa2wpKSvo6GgmqGmoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmZuipJ6fm5ubnIeGgXt0cmtrdXJwaFdcUUVUSERJUEg+RUE0RUg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqCinJ+psqu7sr+rr6ylnqChnZyYm5+gm6Cfn5elnZWbm5+anp2fpaannaCgrLGvp6Sko6Gfpqymn5eclJGZnZmVjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMvM0se+v8DCvcfGwrfDycjCwMW9ubO5urS7t7C1sqq6sa67tr66uqq3rKqquLq0u66tuKOlop6npaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSakZydn6Sep5+en6KdmJmUmJSIhH56cmtkaW94amVaW0ZKTEREU0xEQkQ3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWVmpaUm6SmnaGqp6KrrLy8v8PBs7K4p6Ghq6qinZ6hop6cm6CSn5+Qlp+ZkpqWnZuZo6Gvs6mhm52dn5+al5iYk42PlpeTjo2QjIKDgndzcW5wj6atrrS5xbvNx8u/wszOzczIydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdLTzNPP09PMysLFxsbKx86/yNDLxsXGxMC7wsC+vr61vbOtvr/Cw8bExsOtvriyuLzDwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJREJANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTs7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJujrJ6frqalsarFxszOzb+wwqmlqK2tqqGdo5+cnZqpk5mhkI6gk42UkpeZpLGxq6SgnaCcmZeVk5SXkZCPjIeEg4iHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1dfS183Gx8nMw8XKz8rT19HX0tXV09PIzMfNzcnSzM3TzcTHycnAxcvHyMjFvsKzs8fEy8rKzsXJv72/vMHGxMzMyMm/w7+tr7KonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi397cnV2Z2Jod2lkVldRRE1GQElRQj1CPDoyM0A8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE6OT44Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+Uo5iWn56dpK+boLCrqKyxyc3U18/Gu8esrbS4rK6jn6Sjn6CkrJuWqZaNl42MjZemsK6lnZ6doaWinpuWlZaUin13cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dPU1NLP0cPQ09bX1dbSy8nO0MvGzdLK0tXW2dXX09bYztLJztHMztDL0s+/x8bJwsvLy87PxcbHtr/Kv9LMy8/Fyce/w8LIzszP0M7MysfNuLe7qJ+mq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZXJiXVJcSUpGQUVIST47QDg9NDU4NTo3Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSim6mmoqasmqSwsamotdDU19rSx8bLtLbCxrK2qaKlpqGiq7WnmrGhlpWMkKatq5yVmaGdm6Gin52em5aKeGlkYV9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M/P1dTU0dHM0c7T19bT1dDP0tPRydPRyNDY19jR19LX2dXWzM7PyczRy87Qv8XBxsXOzNDQ0cjLzMDKy8XTzsvOx8PJxsbIy8rU09DUz9LM0sG5xbGlqLWup5qorKWdsqiws6ysk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx7enFzdG1hY2ltX1ZQX0pKQkZDUU0/PD40NDo9NTI3NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs5PDc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vrquqq52mrrioq7fY1NXZ2dHO0MC8zMm3wK+nq6mjpLG2s6O2qp+doaqpoZiWmJqbnaGemp2elH5yZmNjX19hYF9hYF9gYF9gZm1wcG5rb3J2d5vMwNLV09jY1tnR0tLXz9POy9PN1dTRys/M09bS0dbN0NXV0cbR1MrR1NXWztLQ2NjY18vIzsPIzsvKzL/Jv8fIzc3PytDNzsvOz8fKz9DKzsrByMbJzMrL0dLM09HRz8/Kvce5sK27uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIeXZvcG9rYmVucGFXXFpJRkZETFdFO0A8MzM8PTg2ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD0+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKeeuLa1ta2lra6+tbHA2dPX2tzWz83Lw9PQwsKyq62urKazsrmrs7epo5+clpSXnJ6fn56VlpiVimxfX15hZGJgYGFhYGBhXl9fXl1ibXJvb3N0dXZ5pL7L1dHW1NPY1s7O08vNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dTLzM/R08rN0dXS1dXKwMnBxczCyMnCzMLFx8rKzsrMzNDN08vFx8/Mx8fKxMbAxcnLzc/Qxs/Ozc3Mz8XHwLe5vcLDvcO5srO+sLvDxLaqmKWhmZaRlZWSi5SNmpGUlI+PlIKJhXhwcmttaGBgcWhYWGhWTUdMSVBQQjtEPjs2Nzo4OTo1Nj09QTw6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs7Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcXDwb+7tbKxx8O5y9XW2drb2MzNz8nW1sXEuLK2qqSurbm5sbLAoZeOjZiWkJSSkZaXlpGMfWZiY2JgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxMnJxsa/w8XOzsfFx83K0cjLzs3G0dLPzszUysfKzc7Hxs/Sy9DPxbrEvsbJvMLGyM7EwsfAxs3Hw8vJy8/Hw8PPyMbBxsfDv8DHy8vLzsLKy8jHzNDExce6x8PIyMLPwL28v7DByse6vaqxsqelnaKcmJCbkKSZl5mRlZiJj4J3bnRka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NTw8NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5Oz49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WzsazJzcrIxL69us3NxtDV1dna29jQytDQ0tTKxbq+vrCpt6u/urmzpZKOjpaQhoOEhIJ+hYWAdGBbXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLq/w7u7urm+yMbCw8DDx8rJyMrHwcXLxsjLzcnEwcnJwcHL0MTLyL+5wbrFx72/xc7Kw7/DusnHyLrHxsTKwL3By8bFw73FvLy/w8TLxMS7v8nCxcfSxcHIvsrJxsfG0MPDxsOvxMvHxMq3v7y6tKmspaWYn5iso6GlmqOgm5R7dnJ0ZmlaYW5tWltYUURMRkJHRExDRlI/NTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8y9DRzMfCw8fNz87N1dDW2djZ0MzUzs/Qy8S4xsG2tbyxwLa6rJGMk5eHe4CFhoB2eHVzcV9aW11gYWJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsGwtrqysrSyscG8u7u5uMDBwcW+vbm9v7nEysXGwr3GwLe7xMm/wsm7t7q6xcK+vMHNwsa+vbXAvcO6vMa7wrmzvMXDwsK2v7a1vr+6y8K8tbrIur+9y8PBxcLFyMXIxdDGwszHssbJw87NwcXCv72yt7Czp6ioubGlrbCrrayUeXZ3amVoYGhvY1ZeWUpFSkZIS0FFQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTs8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8bCxMjO0svKysfNzc/SydHG1tXW2M/M0MjNyMrFvcrBsrW6t7u2r5GNioyFeYCGhoB+hHx0dWRcXF1eYGBiY2JiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusC4rbCwp6qtrKe4tLa0s7KzurW9sbewtK6yu8K8wcS8v7q1srq+wLjHuLO7tcDCvLe9xsDDu7Wusra6vrPEt7q1q7i8vcC9sLq2r7a6ssW8tq67v7S2tMW8vsLFv8PExcfLxcDGxrvHy8DPycfDxsHDt8O+vra5vsa/rLW6tbe2jnh0eGZnZWJrbl5WXmBGS0hISkZCQ0FERT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pquzsby8sa2foJmUlJiXnqujr6qnpMbLzsjGyc7M0M3OycvJzMrLxtHP09HPx8rGysXEwLzPvbO5vbm4t5uOh4mKe3l+h4Z3eIF9dGheXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG1oZmpubnJ8pMe/ubi1sKusp56iqqeeq6yzramrqbOttrCyqK6mrLK8urbDubq5sKu1ubu0wrmvv7C9vLu1u8e5wratqqiwscC1uLyvsKexs7S7vKuttaWutq66sbCqua+tu627uLu/v725wr/GwsXAvMbByMu4xcfFv8fDw7rExsK7xcnMy7O5wry6sohydnZraWFibGhZV1dbQUxLTUlFQUM/RkE7OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6OTs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bGz9LMxMbCxdDIz8PEx8HGxsXFzMPKzMPEwcfAury7yre0u721tauRiZCQfHl+ioZ6e4SBeG5eXV1dXV9gX19kY2JjY2JgX15bW1paXVpaWlpdZG1vaGdnaWtucoGtubC1rqalp6eaoKSgmpylq62jp6KrqayqsKOmn6qttbaxvbmvt6+orri0tLu3s7yut7m0sbvBscGupaiiq7Gys6e8qquoq6yttLSmqK6hpK+psqWnqK6lqLessLK3ubq7sby9vr7Ev7XBwcfIt7/AxbfEwsC7v8TDvsTIzMq/vsPAwKmGcnNyamldYW9kV1ZYUEhaUlNLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3usSwtrCbmZWcmKqpsLGztb2vxtHQzcTIu7vMw8zAvcq5wMXAvMy6w8fFur3Evrq3vcW4tri7rrGVg4mNgXt+gH94dH98c3dmX11dXF5fYF5fY2NhYmBgX15dXFpYWVtbWVhaXF9ma2ZlZ2Voa29yhaqlrKagnKGllJ6jm5eRoaOqo6KfpaWnpa2fnZukpauyr7a3p7Csp6q0q7S5sLa0rLa4sa+6ubG3pJ+jn6axp6unuaqkpqeop7KtoKemnpqkpqyen6ekn6Cxra2ssbOys7C1vLa7wcGyur7DwbG5ucKzwL2/tbi7vb68wsbEwsO+v8Ogg3dwa2FlX2tvYFVZX0hOaE9UR0VKRjw9QD06Ozs4MjU1MzY5Ojg7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3Nzg2NjY7Ojo7OTs7PDg1OTw6Pj5AO43Itba9uLrBu761oJ6UnaGmurars7O7s8XQyczDx7m4ycLOwbrLub3Iu7bHu7fExrO+xby3sLm/u7Cztq+ihIeHgn15dnRwbWtqanFpX2BdXFxdX2BfYWNiYGBgYF1cW1xcWFlYWFhWWFtdXmRjYmVnZ2dqbW+Inamgl5WaoZabopiVjZ6hoqabn5+jpaGnnpqim5+qsKyxtaKpqqmrrKS1uK23r6yytK6zta6xqp+dnqOisqSlqbitoaamn6isq5mfoJ6ZnZ+lmpmjnJudr6mrp6qrrK2wsriuuLm7sLa7u7qrs7K5sr20trGxtbS/tb2/vcLBurq9l4N6cmtfZV5kZFhUWF5JV11LUEdJSkZBPD8/QDs/PDA0NTM1Ojs5Ojg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfG0MnJwce8vMXF0MG8yru7wbu1xbi1wcGzwsS8raq1ubensbKpi4aIgHlzbnBua2NeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taW1lYWFdXV1hYWFteYmRkZWZmaGlrco2onZSUlJuXm6GWlpCcoaGonZucpaahpJufoJqYra2tr7KgpaKtq6ehtbCxsaynrrKnubOmtqGinpqjoa2ioam1qqKjpp2lpqOWmJ6XmJudn5mXnZycm6yhq6aio6Wtq7KzqrSwsqqyubSvqa+ysrK3s62prK6xt7C6tbm9vrazsZSEeXVlXmVeW1lWU1pVTFxRTEpFSEtJQj0/QUFAQDoyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr69v7OdpaOYpbHCtba9rbW4w83JyMHGuMLByNC6w8bAtry9tsO6tr/Btbu/u6qmsbqxp7Gvmn2FhYB5cHF0cWhlZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFhWV2FkZWNkZWRkaGp2opyUlI+Vl5efl5mUmJ+eoZyWoaGoo5+dqJybmqqmrrCrm6Ojt6qgn66otqmmpqywo7ewo7agopuYmKumoZusuK+ioaScoZ+gk5WhlJaWm5iXlpeclJ+pnamjoZyjqqqwrai0q6qmrbKwpaqusrGvsK6vpqensq6xtK+7s7m3raOUgXl1ZF5hVllXU1JUS01eTFBMR0hMS0U8QD48Qjw7NzY1MzQ5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLS5wrG+uLyunaeno6q7wL3Aua60uMLNyMfExb7HusrNtcTFxLG/v7nAwbrAwLm6vbeoqLG7pqihpImBfnhyamxydHBpaGVkZ2JcXFpZWlxcXF1eXVxbXF5cW1xaW1xaWFZXV1ZXWFdXV1VbY2NiYmNiY2RmaoGWk5WLkpSTm5iclpaboJyflaCfpqWkpaaenJ+kn6qvpp+io7aooKGiqLOhpaekr6WwrKu0nqCdlZSpoaGUrLGwnqKjnZ6Ym5OLoZSRk5eYkpeXmJadppumoaKZpKSkq6OlsKelo6urraWorq6uq6ipqbOlpquvtLGuu7Wwr66fknl2cmVhXFpdWE5MUUdSYU1WUE9KTU9FQkQ/OT02OTo3NjQ1OTk7OTg4Nzw4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7K3rJ6kpq23u7zBxbqxubbFysvBxMfHybjIxrXFwsiuurzCvMLAwb28t7q2pqeytZ6iipiHgHdvZGJnaWhmaGpnam1gXVxbWlpZWlxdXFtcXl9cWllbWVlZW1dVWFdUVFdVU1RSVWBgX2BhX2BhY2RpgZSTiZGOk5KTnJSVlqOZoJacoKWhraWjo6KjoZuqqqWZnqWxqaCgnaSqnaehnaysqaitraKhopSXopqcj6upsJufop+el5iTip6SjZKSlY+YmJOboaKcpKChlaCho6Sao6uloqSqo6uupa2xqaalpqa1pqmorbO1tLm6r6msnotycG9gW1dWVVFGUU9IWlxPUkpUS1NMRUdJQzg7Oz08ODY2Njo5Ozo6NzY5Nzc6Ozo9PD02Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2OTg2OTg5ODo7OUA5e7W0rbS7srCssq2dp6evubmzv8i6tsCvxsnOvMLLzcm3y8C0wMfMsLa9x7vBx8O9v7e6taSqr66dmYeOg3x1aWpqbWhqbG5ra21lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXl9fX19iZG2Oj4SRho+RjpmTlJKcmqKcm6CnqKqnqqWopKKYpK6klJmlr6mfm5iaoJ6umZupsp+kpp+jpKCUk5uWlZGpqa2anKChoJqUkIyZjouQjJKMlpSQnaGgopybopWboKKgl6Goo6Koq6Crr6Stt6Wio6Ksramoq6+zuLK9tbOrr5iDcnJoW1lZU1VSRVlMUVxZTVROUExRUklOSUI8Pz9BPz02NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MS0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zrqiztq6op6+tm6morLe2rLvKu7a/rMzHxrnCz9DJtca+ur7GzLWxvcS8wsXDvcGzua+lqq+rnpeGgXd4b25pbm5ucWdnaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVUU05QUVlaWlpdXFxeX2Bkfo2Bi3+LkIqSjZeRlpmioJufqqmmraqmr6KnmZ+soJSVpKinnZePjpmdrpaXpqmYnpyTpaGekZCSkpKVp6qkmZmanZ2WjoyLlIaIjYOQipGUkKCdoKOXlZ+VmqChnZKbpaWnqKigsbCmsbymn6OstKutp7C0sLm1v7GtsauQfHByYlZUVU5SSUdWUVJSTExYTUpMTlJHTUtBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojo4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s62msbeqpaKwq52qp6mysKS2xrS5urPLxrq8w8vRzLO5ur7Axce2tLe8srq7xL7CsbOtsK6wrJyiiGtobW9yb3FrcGtkZmdlXlpZWllaWlpbWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY2HkImYiZSTmJqYnaibn6qkpKqcp5mgpZuSj56impeWhIORmqOPk6KclZWWh6KampOLjoqPmaOnnJWVl5uQkoeUjoyBi42AkIqRkpGgmZ+hlZOYmJShpJiMmaSmqKahoLSyp7K3oJyit6yqraSysqa1vLWrq7GjiHhybV1OUFFMT0NOTk5QTEZOTktKTk5RSE1KQUdLSEhDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKyktLzEyNzc2Ojk5OTk4NDk4OEE3d7anpLawpKejqaWgqaWks6qissO1tbKzx8e4u8TKzce1r7y/uLzEs7OutqKstcS6u6+qrLSvr6CXqH1eYGdzcXZxam5pZmhoal9YWVhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTk1LTFNXV1ZYWFlYW11hb3N2cISIgoeAkYOOipSQk52gjpqboqCjmKSWoZuVjIeYmoxzjYJ9jJaWhZCZkJONjnqZj5yMgol/iZifop6Qk5iWhI6Ck35+dImOepCGkpCQnJqZmZCVj52NoqKNiZqgoaSjm6K0r6yvrJ+YpbmmpbChsa6csLuqqa+qmYF2cmJWTFFPUE1DU05MUU1DUFBISE1TTUhKSkRKTEVKSjw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMjc2NDc4OTo6NjU6ODdBN3e3oqO0qKWlqKOmpaalprOnpbTBuLC0sMrGubrCz8e/ta+9w6+xx7Ktp6yVo62/uLGwoKitrKqWlaJyV1ZgaGdpaGluY2poZ2JcWFhYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUU1NSkhOU1NTVFVVV1lbXWlscmx/hXx0Tlhyj4KXho2cl4qTkJ6XnJWUlpSOloh/k4lfO1dve4qTiX+LkYyPhYZyioSWgXmCeoWTnZSDlY6Qj4KGfZJ4cW+FjX6JgJCNj5eZmJOKj4ich56XhoeWnpqhoJenr6itqaielq20oqatmayrmKezoamto5J8cW1fWk5TUVZMRFRKUE1NRk9PSkVMUU1LT0pJTU9GSUg9NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NTQ3Nzk8Ojc5Ozg2QTl4t6CiraGmpqmgp6inoqmwqKe0wrmxtbDJw7m0v8/AurGxuMSrrsmup6KdhZqiuq2nqJampaOgl4+WaVBOUlZaWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JNS0hGSE5RUU1QUlRWWFpgbW9peoJ0UEJAf5WRkX2JlIyEio2ajJaVipKIhpWFeIh/YEpRbniKkYR8hIyJhH5/bn5/lHd1dniEjZlwUY2IioZ7fniUdmd3hYh+ioiVio2QkZaLg4mHlISai4GEkpuWnpyUpKOnqaWjnpuxq6GkpJGmqpahqZyipqiHc2tlXVtIUVFTTUlVTVNJTExQSUdGSk5MTVRLUVFPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTc7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjExNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85dracoqadn6Guoaeopaanr6yqtry2uLazwry3qLvJubepqre4rbbAqqKbkoKPmbKfopqNoJaYlJGLjGVNTE5OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4aBe4WMkoCRmYuPe4aPf3V/eHNudXB0jY2BeX2JqoR5emh2e45wcm14gIqMknh6gHuAdnJyknhndYSEhIR6lYmIioyKgH+Diox/k4N6gI+YlJuVkZ+dqJ6fn52gqaWfnZiNqKSToJ+Vnp6kf3FmYFxcSlZPUUdLWFJPSk1NU0pKSkxQSExRTFJUTUVIQTw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc5NTY3NTI1MjU3Mi8yLiwvLzIwMC8tKygoKS4xMjYyMTk4Nzk4Nzc1Ojw8N3aumKOhmJyes6mvqaWsq7Cxqr20sry4tru1s6C4u7OrnZ+tq6y1s6WelpGYhpSklp2Mg5eJj4mGhoNmSklKSUdGSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFlYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FSU1ZedYN9eWd3jZeYjo99Z3mAdnh/iY98hJiSgXKHj3x2e29rfq18c5CKf3uGkoB9f3RmdnyFbG9oc3yJjIeAbHlxfXBtdY9yaHGAfY5wQ4qEgoOEf3d3eoqEfYt6dH6Oko+YipKam6OXmZ2anZ6inZaNi6Wbj52XjpaYjnVta2VhWVdYVFFKU1ZUT1BPUVdLTktPT0pRT0lPT0tGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppefnpagprCsrqunqbCvsay8uKy7vrm0rqmbsaitnJCXnqesp6SbnZOHln2OlZKVgHyKeoWAf3+BZUpHSEZCQENESUxMTVFSUFFTVVRUVVZXV1dYWFlZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWJ7d298eYiPeXyLhW9tjJF4c3hqan+CcpaRi4F9ln9JkphuaHd+gmxpY2x5hZCShmtzbHxucnuFaW1wfnONiIOFen1+enZvdHSFgXmBd3B8joyKk4OWl5iakJOWl5mXnpeMg4mfkoqSjYaQln1saG1ubVdVV1RSUVlPU1VVVFlWTU5ITktOTktDSU5HRT86ODk7OTk6Pjw5PDs6Oj0+Ojg6Ozk/ODY4NzI3NTc1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5manqStr6Ktqqi1r66stL+rvMK/pqOalaWYn46FjJaipJublJaPdpF9hIuQj3x4fnR9eHV3fGZPRUdEQDw+PkFGR0dLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganJBmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplfm9tf3qLiHWBiIZ0bJmRdHN8amudjkx5hJKJhI5nMXaGc2x+fYN0ZmV0foSEhYBmaWx1a3B/e2dwcHtuko2Oe3N9fXFwbnVtgn53eXRqeYmCiImDlpOSkIuNkZSVj5eOgHmIl4iGiYZ/kId1aWluZ2NXUVlXWFlcTlBWV1pZT0lJRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKisqLCwrKykoKycpLCwyMjYtKzU3NzU0NzhpTzg7NW6SiJmRmpakqK2esp6muq6rsrDCsrvDx5uXj5SZi46GeoWRmpaPko6SinOJhHeLj4x/dnd1eHZveHNpVUZJRD88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7OgcXx4bX1scYOBhYF5g4aGeXKglHR4gHN1lIc1cZ2onY6hoYSihHZwhnuGe3OMrY2IgGhmYmltcW1vgnVpb1h1b46akXZsf3t8bXJucH96c3VtYnaEf4aAhZCRiouKkouRjIuPg3Z5i4+AfoOAfY54cG5ual5aW11bWVhhYFNPXFtZWExISkZKRz9DQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnnq+VpbSorbCuwbO6wcaXkIyUkIGJfW6CkZOKhIuJkIh3hIVumIqMf3l7e3F7dHxrb15KUEc+QDc0NTg7Ozw9PkBCRUlMTExNTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz6Sg6muX0dMTU5QTDdDTVJTREqGdoB8fHZ+bHeHh3x9hYJ/jH52opl5foaAhJmFm5xhhqqfnYuCkI16doh+iYeOc4qXj4N7XGRxdHp7d4ptZ2lheW+Fj4J6boF3c4R6cXN5d2tuaV13h32HfIiHj4CLk5eDjYaNh31xhYCEfHV3e3yHdG1xcmRlXlpaXVNbZ15YUVZZXVdHS0tFTEc/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDAwNDY0NTY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XIx3iX+UjJGdnZ+mkaCqn7Cpr8Cxu8W6lo+RlIh6hnZrgIySg36LhZCNeYSCdKKFjX9/g4Fzg4F9bHlsU1hMQUUzMTEyNjc2ODg6PD9CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHJ8j4t6fIiGfpeHdqGZiIePkpSljaypSIatr6+KgICTioGLgYSRqIeAmJiKnHNsfIGGh32OaGdneH5thYaBhXGEhUdrgHhxeXZobWtfd32DiH+IhYx6lZ6ciouJkoB7dYt2fHhtb3d+fXFxcGpaXFtaY2NXZ2ZcVlBRWFpRRExMR09JREZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWHkY+WmJKXoJ2soKe5r7O9tJeNkouYi310cX+Kk39+jYOUlX2Hf4alh4mAg4iGeYmKgHWFeV9jVkxDNjAuLzIzMTMzNjY4Oj0/P0JFR0hKTE5RVFRVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZZwc6NVRklLTU5QV2BZcFpcXmqNk4eVgISChZGTfoWJkYCaloKgoZiVm5qlrZOZu7Gnu8jEp4qMoaSOk4mAkHtyg56fkZx+doWFi4+HkGlob4OAdIyGhItxhoJ2h4B7doV9bnZ1Z4GUj4aJiYiJiKKro5aJj5iAe4KKe3pvZ2t4fXd8cWljXFlZXGldYWdgWk9MTlhTUklRS0ROR0NLRENBRERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudnBneIN7gIyAgZGPi5qapJyhrKarr7CXkpGEoZSEeHeAjZR9f5KGk5Z/i4GSm46EgYKMjIKKjoWAioBtcGpeQ0E0LS0vLy8vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTU1RSUE9IREI8ODcvOUM+PDw2My5sk5dNUEhKS0xLTlZgY39nZ211nZuPmpOTi46PmoiTj52LoKGSo6mlo6yTqLaip8HCrsiveLqUmnyMoZ6ZhJKEgo+hnpOZkoSKhY+YkJZscHWJi4GVjI2Pdo+EcWyFgYqXkoOFiHKJoZeHk4qPkJeltqmbjZaig4eThX6Aa2prfX59f3FfW2JeWWZqXGxsX1hLSE9TUU5OTEZJUURETkZCQ0VHQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5oWXCDcHWHcXaRhn6XlpqUn5+bp6CqlpOYnmhmpJp9hZOSeoGSiZKSfYuFmZKRg4CBi46JhpKIhImFeHh/aE5SPi8vLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVFTUU5QSUVFPjs8OkNGPz48NzUyPD9SNUhISExMTU5SXm+KfHOBfaCdm6emopmhl6KVnJ+onqmrn6isqaq1l6u+q7bIybfI0c++m6Bwaaqon4STkYWcoJqamaeRkYiVoZmad3p+lJiRoZKWl4GUnnt2lZKrs4mNl6B9lZ6cjpOWmqSjp7awnpGaqIiXkI6CiWxzc3t8eW5mXltfX2FnY2BnZ11SRUtLUU9KSk1GRk1DSE1GRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1NDY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjNBQGliX1BxdWBufWF3jn18lI6Oip+Sl56VnKqYnqpCRH2HiYiYjXmCjYuOjXyKhpCRj4KDgYmMioWThYKGiYGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJUVVNOU0xFRUA8Pj1GSEBBQDg2NjI8OTtGSEdJSk5PUVlthpB3lYujp6q1vbilrqysqKm1rLG3srKtu7Gzvpyzw6y7ycu4w7+3paOwsqysqqOKlpiFpaagopiCppmNoqqnpIeFk6OgoKqhpKmOnLCLlaSnuLucoaOwk6Odo56RpKKssK2ztqOVpquJmoqTi5V6e36De2VeZlpjYF1iY15mZ2BbT0RJSFRPRkhMRktHRkdIQUtGQ0ZGQTs4Nz08ODg6OTc0NjU4PDU0PDc2OjU0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gpOFiIKcg5KRjJLayJ2Wc1aXiI+InI98hoyPi4p7iYOHkY+DhYGMhoWIkoaChImGh4eHcW5hQEU2NDwzLzExMC0sKy0xLy00P0RBTlZRUlNVVVdVTVxRR0dEPD4+RkhDREE4Ozw1Qzs9RktJR0hST1BXgZOghK6js6qywcfEq7PFtq20wLO4vra/tcG2u7ukuMaptsnHtr65tKijtK2wsJuZkpqfiaevqqSVd5+kl6GrsbOYlqmtqK61u7K6rK+1orGssrW8uLWutaCnqKOom6mwrrO6uLmonLiqjaWPkpSghnqBgHJXX2JVZGBgYV9fZmBcVUpERUxWUklKS0VKSEVBQEBLREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NDk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFxaUWNkV3p1cYGUfYSGk3aGfoCNe7+7o7yCtJSTjpuPhIiPk4qJeoeBjJONiIWCjoCBiY+Gf4aIhYqHkXp5b11XQEVOPDY6NDZBQjc2NC8vN0NIQ1FcT1FVWFVcV09fVUlLSkFAPkdLRkZEOz5AN0Q3P0JKSkVHV1RQXo+kraSytMO2uMHMyre8xL2ztMG3uMK1v7C4dLG0prrFpLDGubGzsrSopLa2qrCgopabopKlsa2lraynpJigrLO6oqmyubW7vsy/xcW9vbPCuLq4v7i7uLqtrbGmsaquvrG9vMPDrZm7qZWuj5iZq4l+gHloVWFgV2ljaWVWW2RaV1VKR0dMUkhESUtBSUQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81Nzo6NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1RZVlp3anB/j4SBjoRve3J4iGK5oZqjiZWUlpOUlI6Ql5KHh3yHgY6WioGEgYp6fIuIhnyKgoGLhJV9eHp1ZlBcZEdFTDpRZGBbXlNGPztIUEVbY1FRWVlaZ1pTYGFNU09FQT9JSkhFRkFAQzxENkI/SEdLTVRaVF6Ur7i1u7nJwLu9ys28vcG8uLa8u7e+tbqyxmF1sqWxmp6rvqqlqKuqpKKztaCrp56Vlp6Yn66lp6elnqOUoqews6eysry2wb3TycnTxsLFzMLKw8G+vr+8vLi1sLm3t8O6xr7EybGeuquirI+mqbeKgHxvXV5eXFVgXWhmU1liV1NXSUVGT0tAPkhEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUVFJQUFFSUUpBOS8sLCwqKygoLC0rL1A+KC40OIB9PDJLiHE5PkNLRUBKTVBSTFFdaG1scZCNhpBzbHJyc4jVwLaaoI2VmZmRjpeSlpaOhoh9h4ONlop/g4CCeXuLhId7i3mBioKXf3R9emxmcHZZXVxQZWViYGVkXVtYWFxOZG1VUm1uX29fWGdlVVlUSkRCS0tIRkhISEhCSTlEQEhLVFRWXVpbk7nAub64xsG7ucrLu7a6tri5tLi1ta63t5lkdamerXBeoq2cmKGim6Seq6WUn5+QlI6WmJionqafn5qZg6OdrKSqsKy3sLy41NDO1s/JzNLMz87Kx8DAwsq9wb3BwcXExsrAyc+0pLyxtbCcrLm9mn13aVtdWVdbX1hhYlFcYVRSTENCRkhGPEBGPkJJQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjsuJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREdLT0RSXFppYHCXk5GUbmxvdHWHs6yhoZ+LmZyZjY2VkZuShYqKf4mHjJCMiXyBg3N7ioOFe4p0gYqHlX90e3lsbXV8aXNlaWxoZmppaGBmaWltWm50l62kvYiHZ1tvaF1aWVRIS09QSktQTFNRSExBSkZLUF9fYmdqYpi4x7C6tLu+trHFx7awubGxu62zsqisuK2NtqienKeaTpqejI+glpGnmKWVipOTiJGJkJGSnZuhmJuVloeemaaarK+or6ezs9TU1NbRy8/T1M7Tz8zFwsrQv8rJy8nSyM3Ow9DSuLDEvcS6pre7xaJ+bGFaWltWXlZZZFpQXVhPUkNCSEZESjtBRD5CSD9AQjg7RD5AST01NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ4PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZldzkJGZgmhycHl5g6GqnqaXjJubmIuOlZGajn2Ji4aOi4uLkIh8hYJwf4eChnuHcoOSjI9+cXl1bHF4f3J7bnhzbGmAcG1jaW5weWl4fX7Lv8Pfp25jeG5kW2FgS1BSVU5ZXlBdXU1RTlRRVVRcbm53g3KXrristaiwtqutvcGyq7WmpbmnrK+irLSkj7Gum5iYjJGUkYSPm4GNp5KciYOLhIqJhIuElJWXl5SbkJyYmZmenauspKeirKzO0tXRzcvS09PQ1NHOyMPU0cjO0tPT1s3S0cXS1sbBz8jIw6m/uNCcdmtiWl9bVV5RXFpQUFVRT0k+QUdCQ0Y9QUI/RkU+QD86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYeGi3dsd3B9foCgnp6hjI2Zk5SLjJOPloV5hZCRj4yKiJGHf4N7cn6Agod6hXaFk5GJgG93c2xzfXx3fHOCeHFrgHJyaXByenlye77Lm3+NsoR2coV3aWFpXURaWltXZmRYZWtUWF1dYWNeY3h7f4yCmaqkpKKgoammqrG5q6a0o6KuoqSuo6eyoImmm5WTkYqSj4iClIlrlaONmYSBhn6Rg4OUl62LlY6Vmo6FkpCdl6evoaCgpaSoyM3Px8LL0dPR1NLO083G1tPN1NjW1tjV19XK1drNytjW0cutxMPMh29rYF1cVlJXUltQSkhKSktAOzo7RUJEPUNEPkhDP0NCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXGAdn5pc3lygoqAnZWelIWLlomPiomOiI+AeISUmYuNiYiLiX+EeXN7fYOHd4B7h5GXgYRveHFudn92eH10hnx5bId2dW59doR1eXyeto08QYvGpX6NfWplV0lDZWNmY2hqZG95W19maGxuaW6Bg4mSjJ6foJ6Rl5mgo6SmsqSlsqCipZ+iqaKjspyHn5KSk5GLj4uHhI+EfpycjI2ChIV6lH+CqpajjJKLmJOLfZeKmpGqs5ianKecpr3Dxbi2xc3R0NLQy9LLydTO0dXa19fY1NnYzdjbzsna2tLWv8zNtHRza2FaV1BTUFhVRUdLSkZGPjo3OkBCQzpHRUBFREJEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzU0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8yKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9CPjw5UUVDSlRsbm9wYnFxdIaNfZeRnot/h5KDiYaFioKIfXiFl5eJj4OHhod7hXlxe3uEhnZ7ho6OnnqNcH1wcHqAcnuBcoSHgG6OenV3fX2DdYB9h4mwdFmqwreNkoFwbmM9XmhycXFwbnd3gmZpb3J2eXJ6i4ePlJKblqCWiIyTnJ+bn6ugoaycopqaoKafoKyajJqNkZOOhX2Ih4OFi46gmZSIg4d+bJl6hJmHiJOMjpWMhnubiJOPrquTlZefmKautbyorb3Hy8jJy8vPycTSytTX2NfY19Tb19Pa29bQ2trS1snVzJN1d2ZlWFdOUVJcR0NGSUk/Qj49ODo+QDw+ST1AQkFBRUE+Pzo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYFY+LDRMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8QTw6OUQ+Q0dSa19tZGJmbHaAiHGRkJuAeYCOfoOBgoV/hHx9hJiOh4x/hoeBd4N5b3t7h4J0epKejqF2kHaDdHWBfnSAhG+BkIJvkoV1fYKFeneHfIm4xqXDyriClpyPeHBmTmVjgnqCd4WhkYt5eXd7hIB8hHZtlJaVlpCYkYOJj5eal5emnZigl5+Tk5ijnpuslpGRi42Tg4yFiYmBho+RnpyaiIWMgYaXe4iJn5ePiY6Li4J8oIiQirygmJOXmpyopqWtnqe1v7+/uMfJzc7FzcnR1dXU2dXX29TX2drb19va2djO28aDdnZkZmFdUlVVVE1LRE5EOz09PTk6PD85PkE3Pj9APT8+PTk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozk7N0lQXFpSVVhLOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZmFdXGl0enlsiY2Sd3Z6inx+gH+AfoZ7foKRioWGeoWIfHZ+dW59fYd+dH+SnpGgg5J8hn54j355i4pvg5uBdJmHfoKKhXx+kXuQqY+Qw6C9jJuknH6KhX2Jc4yLgHOmmpyYlIV7j5GJhGlHcKGknoyMkZKFiIuRk5WPnZuTlJGXjYyWn52UoZWTjo6RjH6Qj46LhImSlpmfn4iMlJGdkYOMf6aZiIWOg4aEgKSFiou3l52RlJahpqCdnZ2jrra5tKvAxsrQyMfMz9PS0tjS1dfA19jZ29ja2tnZ19u3dXV0Z2ZiVF1ZUk9OSERMQz49Pzk5Ozo6Ojw+NkE+Pz09OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDpEV048TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVlhmbW1taYGOinFzeIp7e4B8f3yIe318i4eCfnWDhnpzenRtgX6EfneFm6GbnpSTgIyIf5iHgJySboiphXuhjH2RjoOJhZ1/m5GKjaOin5Gkr6CLkYuFi4GThldyrYufq5yQg5mckJCOW4KikYKNn5OVjIeIjJKSjJSVlZCMj4qIlpydj5aXkoyTlIaAjImSjoqKnZeYo6OGk52VoIuKiY6ckIOJj4CDh4WkhIuQspickpSXoaCemZKbnaeyuKylvcLHzcjGz8vPzM7Xz9HUrtbV2NrY2trX1tnanWx5cWNjWlpVUVVXQ0BJRD8/Pzo0OTo7Nzo8OzQ8PD89Pjc7OjoxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozg4OzxAO0JRS0tTWVBUY2J5bWJ+kYNvbniLeXp/e4F9h3x8d4aFgHNwhYJ7dXd2dIWChH1/kqain6ail4qdkJSXi4qol3KKs42EqJKEmZSFmo2jlqCYk4mbnqKTqbCfkZWRjo6IloxvjbeEmsTIsp2ipp2cmJaRspBkpM3HlY6Gh4mQko2Nk5WKhYqKhpaanI+RlZOHlZiEgJCMmYiOkKuXl6SjiJmelZqJj4eYl4qFj42Bf4ePpIiNk6ial5OWmKGYn5mTnJuisrSlo73BvsfGxcjIycLK08zN1KjS0dbW1tja1NPazn9ve2RgW1tbTEhUWkJCSEQ8Qj44Mzc8PDo5PjY0Ojo8OjcyPzo5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIU1dTUkJjgkd2gY59fG1+iHl7fnuCgoN/d3eAg3xtbot/e314eHyFh4p+iqKzp6Oqs6KXp6ClpJaVrqKDkbiVkrOajaKhjKWcsKOknZmRp5aomayvpJiVlpWQi5ial6HAjqPJuKuco6aumJKbnbKdhYaoopyYhYmJjpWMi5OPiIGGh4mTmJWMjJSTh5SYhoSSkJx1kZmylpeloYecmZKPi5GKl5uJi5eOhn6MmJ6JkJCbmpqTmJeflKCdlJ6boLGuoqS4vrTFx8S9w8PAxs3KydOmzs3U0tDW2NPQ2LpvdnJZXlNdVU5HSU5FQUNFNT87Nzc6Pzw8Nz00MzY2OTc3ND41OzU8TDw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODQ2Nz06SkZER05aXFlKZmA7SYSLenpuhYZ6fYR4gYaBfnB4fX59b3ONen6CfHmGi4mGhJKmu6yosb2vpa2zs6mkorCsipq1naO5ppWtpZaqrbinpKOgmqmYqqSusKqamZyUlpGXoJiau7uuyqFqt7irsJWZnqOsk5e+o16qsoOKio2Uh5F8jo59g4aOkJSViIiTloyQlY2LjZeYk52ZtJeVq52KnJSRjpGSjJmbi5OekIuKlp+hjJSNl5mdkpuYnpShoJScnaWuqKGktLirwsjEtbq9vMXHx8LRocbKzc3F19bRy9SfbXdlWVdRXFBORUM/PUNCQjhAODg1P0c9PDY8MzUzNDU0NTRCNDk6Qk06QjtBSEM7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEhiYGJwSUCLin6Bc4aHfYKIdYOKgn9ufXx9f3B3h3eOgod8jY+MhoyZqcHAr73Gu7O0wL21rauztouosq6uvqubu6Worbm5q6emoqKko6qvsrGqnpykmZuYmJ+jpqWSpLqvqcC8ra6yuaWkqH6Ih5ytvbCCi4yLkIOOg5GPeoGIkI2NnImIj5eNjJWXlJGal52om7GakaycjpqPko6UkJCWl4+RoJGJlZujrJSWj5ScnZKgnZuYn6GUmp6mpaSio7CypsHGw6+wurfFxMO/zabHxMfEvdbRzcXKhXBvXllXXFlMSkJLQUZIP0FAQzs6NT5BPj01PTc+MzMzMjQxQTE3QEJOPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg6NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QkE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU43OUdEP0NGXGVGYGlnWl1dk4yMiXuHjIeDjHWHkYqBb357gn9xfoF6lXqSlJSYkJOWp7PGyb/BzMLDuce9u6+ruruYs7e6ssCupcCkq7C7vaquq6OjnqerrrWwqpygq5yhnJafsLWnjKO7u7bBvKypnbOlpKiUhY6qxMOkgouPh4iEhpWUjXqDjZGPkaGMjJSSjomXn5iTmZWXpqCvnIyrnI2Wj5GRlZWOkZWSj6CUh5efobOelJmTn6CXpJ6an5uglJiepaOmpqSvraXAxMOuqLe2ycO+ts+yxL/EvLPRysjCtHF1aVlVWWdRTEhDTUtMSkFCPkRFPDVBRTw7Mz04QjMzMjI2M0EwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmVaTWVcZVRiapmNloqMiJOQhol5h5SQgXKAe41/eIeCgpB5jaGWqJmambq9x8jJwdLJysLNvcKzrby+qLrAvbvEt6zBqayzvL+qsKqkpaSsrrOttrWhoLCfpaKZo7S9qpypvcKktrevrJSyrKysl4eaqqalkYKMk6WWioF1ipJ5hY6SkJ6gk4+Ti4+NlKOZl5yVlKOeqp6RpZqMj4+PlZaIfI+Vk5KjmpWgopy1pZCelqSjoaWdnaWYnZWXm6Sjqaeisqyou8DDr6Wzt8zAua/Es7u+wrmtwsPCwJdpdl5VVFlYSkpMSUZERElEQ0JETDo0REk6OzQ9OEYuMTIyNDJCMjZTSE88SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5pSF9YYVpjY1aej52Ol46ekomKf4qgk4R4hX+Vf3+QiIqRgJahma6npJjCvcfDx8XTzs7Ny7zCuLC6vLS9y7vDwra3vK2zv7m9rq+ooKmotq6tqbK3m5+toqehnqu3uKqlr7/Fsr26s6irtrSurpeWpaynn5GNkrLFp5aOfJKVfIeSmY+qmZiTk4+SlZOlnZOdmZOho6KcmJ+Yi4yPjp2IWpCXl5KXpJllmKKfsqWVoZWqq6mmmp6ml5iWmJSgo6ilnrarqbm7w7SltLbLwLiqtquyu7iuqLi6vbd/aGtXVFJTTUVKUk1LP0JIRUVJSEc5NkZNOz43PkFLLjMyMDI1QzU1T1ZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz40RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz5AQkZCcEVqSVJlYUxGpZScl6KXqZaMkYOIppOIgoeCnISDlZCQlI+aop6vvq+hxrzExMbGzs7O0sq/u7ayu7u7vs+1xL65ubezsbWzuLOrp5yrrLmqqKevsJikr6SnpKW1wLGsrLS/w7rAurSoura5tK+Wpa2vrqSLk5ShjXTCmn2XmoSOl5mMsZWbmpWSkpmZpaOVoJqWmqmdm6CgmYqNj5WcYEqWnJqUmqWWVJavn6+cnqOUrq2qpJmgpZOTmJiNm5+nopm0qKqzu7u7qrCyyMC5pqyrrbKyo6GysrSkbWtjWVdNT0pET1BQUjtIS0lISkNEPjpLVT9BOj1FTTA3NTQ0OkI0NE1XTztKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NUVBOkE/PkhANSpCNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqXmaCiqK+ZkZeHi6iWjoiThaCHhJ2Xj52gmqOktcm1qcW5wsTIysnIzM3Hv7uzrrm5wcHMtci6wrm1urCvr7O1pqObqrS1qqmmrayapa6lpKisur+orLa4v8LAvrmzs8Wyub6tpK+1rLmmiJuXppt2v5+EmZ6Ok5qajK6XoZybl5San6GpnqifmZqqmqGnnpiQjZGdg252kqKalZ2inZGusqOrlKepl6qso6KepKeSkZmch5Scop2Wsaapq7m2vbKyrr65t6Cjp6ilppybrampi19iXl1PSktGR01KVk09TkZPS01CREQ8UVY9QUFCRE8xOD03Nj9CNzVVWE8/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLVJgTVVIfmVeSEWrlZuin7uvmZSgjJOrm5GSk4mrjYahnoyjrJSjpLbGvrTAucLCx8nFws3Iwr65sq+6tcHCyrXGssK8tbqqqK2tsKKjmKq0u6appquqnamvp6Oqq727qK29tbi+x7y3trnCsr/Btaq2t6y+pY+jmJKioL2fiZqhmZefno+3n6mcpqKbnKGaqKSzoJudppyoqp6YlZCUm4uWiYykoZSdop2gtK+lpZKvqpmqqZycoqKokJSUn4KPnp6blamkoaGztLq0rai2srOenaOlm5eUmKqhnnVcWl1cSEdFRkxQSU5FR0hDU0xKQkVHQVdTQ0g9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKRUBKSk5POURANT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyc7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTlmXEZDQ51wYkdFp5ekn57DrZyXpZiaqpyWmpqPqpaVp6aVrayZoqu2xMO8vrbBwsDHxL/Mxbu9ubKwubO/wse1v7C8t7m2pqSrq62goZmqqsSipKmrpp6sr6uiqam+t6etv7K5t8e2tbm5wLPAw7i2s7SwvaOXo5eUnJSuoJCio6Wjo6CQvaWpnamrnJyhm6WevaKZo5+iqayhnZeOlp6TnoePhI2Tn6SgnrWsppyVsKaZrqWcmaicn4yYlJ6DjqCZm5KlpJqYq7G1saqlqq6sm5igoJKOkJWonpRlX1dfW01IR0lOTEhGRElBPlFJQTxHSUlcUk9LPUlPVTVCRjk+SEc1Q2FbS0JOUlVXVlFYVFJVSUA4UlFQTTpHQTRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1NT85Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5bVFGPEt4ZWFWS6Kao5yexayhn6yfnq6gkqOflqSgpqmsmLaxo6qztsXEvb+1wMK7yMK+yce2uLW0sbO0t8HFtr6xuLW5tJ+mrKqsnZ6epaTBpZ+praCkqa2voqaovLWmsb25t7bEsrS4u8C0xcK5ua+ztbWjnaWVkpShrqCZop6pqKyjmsKsqZ6srpubnpmmoL2hnaSYq6uspqGajZqfkp6Jjld/lp+loaC4qqaTmLSinrCfnZmulZ2NmJOcgY6fl5WNoaOWkKWtsaupoqKlpZWVnZiLjpGSpJ6IXmFYYl9LR0pKTkZFQUdLPz1KQjk5SktOXVFRST1MV1w5Rkk9RE1JOEhiXExDTFBTWVlWV09aXklBPVdRSkw/SD81SExYU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1trV3FHRTY9dWVcS02enqGZn8SopqG0op2zqJOrpaCjn6yprJ27sKistrHHxcHCssPDvcbDvMTJvK+wtq2wta++xLS5srC6tKyZqLGpqpqdpaGnwa2brLGbqqOusKmkqLy2p7e7vrC3xK2zs8PAtMi0vListLatqqKmlpWVpKyin6Cbp6uwr6+7saagqaiamZiToqO4oKGjkrCwrKWmn5OinpWej5CNlZ6bop6ntKemjJeym6KtmZyarI+dk5WSmX+RoJWOjZ+glIulq6+lpqKcoJ6RkpqThYqRjZudfl9kWWZkSUhMSVNBQ0BJSDs7Rj85OU9OVl5SU0o/UF5dPUhQQkxMSTlOY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDI1LS80QDErJ1Z0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXWVwQDg7SJZ3ZUE0nqOfnKDDqaSqs6KktaqWs6ynoaSyrK6pu7KtsbW0xsDEwrTAxL7JxLW/x8G0q7WosLmsv8OzuK+ttrmlmKqyq6uYn6aXrbu0m6iwmqygrbSyp6u5sqi6tLmzucCqt7LEvrbHqMCvrre1qaesoZiXkqaloqKYmaWvuK6ytbagn6mkmpSWlKSgt6KlpZawsrKnq6ain5qam5WXqJ+gmKGer7Kipo2WrZikqpaXnaKPmoySlpiFlZ6Ti5CbnZOKqKiqoqahmJ6Vi46Zj4GFlIiTnndhZ1tqaUxPTU5UPUNBTkM6Okk/NzdST11eUlZRQVdgXEJKU0hWS0g6VWRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMS0vLjw2LSNCcWdzazIzLzFbYlozMzgwNnBbYkgwNElvZ1VDV0aMeWZDO6OjnaGmv6eor7GiqrWrnrqxrKOrtLaxsLm3sLe4uMW9w8e9vcTCxsC4wMXAuam2pKy7rcDBt7eqrbK6opStsa2ylqSnkaq5qp+msJyroK+0s6uptbatvK20s7m3rLixw7vAwKfEq7G3r6mrq6eemJmroaKhkZihsa+zrLC5mpupn5qXk5inoLeppqOisbG0rLOoraCcoKCbnqWcopedo7Ovm5+Qk6SZn6eZk6Gdk5eIk5aSlZackoiQmpiUjqiopp+inJebkoWOmYt9i5WEjZloZmtgbG1XUFFbVUFCRVRAOztJQTc6WFBkXlBXV0VZX15OTVJOXktKPlljXk5IUE9cVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURFQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS0tLiwxPSonKz1ccD0+MS4wZFpkQDE2NDdnWWBGKD84bH1nW1Y7iXtjQz2nn52iqr2iqrCspLK5qqa2tayhrbW9r7O4u7q+t7fAwr/JxLnEw8C/t8O8wLautaert7G7vb60qa6xtp6Wq66nrpemqI6nu5+krLOeq6KxsLOsqbW0tb2usbK1rLC0s8G7xresvbCxuKytqqOypp6lqqCkl5Can7Oqs6urs5qdp5yblo6hpqW0rqihra6usai0rbKqpJyfqKSelaKZm6i1qZeZkZGdmZ2fnY+qnJWXhJSWip2Ym5OKjZaWmpampaOgnZaVl5N/j5SFe42SgouUZGpxZm9xXkZZZ1ZEQ01XRFo5SEI2Pl1RaFxOWl1HW15eT05SWGRKSkJcYl9QTE1PWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtHREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19fYFUxNTA9YFZeOCpDM1lVXGdLNox6ZkxApJqhpa23payqpq+ut6qvtryop7G3xrextr3Bw7W1usS+zMa5w8C5vrnDt8C4srSsqbq2urm+tKmtsLWXmKesqaybq6uOq76dq62xo6ugsa2zrq21sri4qq6vsai1r7W7vMqzqre2sbSvrqahtKCbqa2gppaWm5qyo66hpq+XoaSampOOo6aos6qip7Otq7alr7G1r6OZnaynmpefm5mrt6KXk5COmJyhl5aTqp2akn+Rl4ydm5iWkIqUkp6ZpKKioJiWkpOVeouPhXuMioKKkWptd2x0e2FGYWtZSUdaWj17SkZENkFiVGlbTVxiS1xdW1JTUmJgTEtFX2BgUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NigoOS4kOks1LiJVX1RfLzUoQ19RXC4qQS9KR1BbRzNjWVVLRJmXobKpsqqspqSvrraquLa6pay0t8q7tLu6v7+1s7fDwMzIvMO8tb2/v7e+vLG8rae6ube1wraqrbC3lJanrqupo7CplK+6pKyxs6eoo7K0sbKwtLG3s6mvrLKnt6+3tMTGt6m2t6yxramno7agoKiyoaWVnJqVsp6onKCqjqmjnpuWmKampbioo7K1rKiyqK6xtaukmaCrqJucnpyUqbiclI6OipebopePl6Sfm5SCkJWPnJuXlpWIlo+XmqecpKCRlpGQlXaEj4d7hIGDi4psb3Z0e35cTGZtXEtOY1w+YntHSThHZ1dmXExeY01ZWVdVWFRpXU9PSGBdX1BKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5HZTI3J0diTFYlLUEuPUVMUTwzcmtJQ0ORmaWvpa2vq6ilsbO0q7iyuKGstbnJua3Bu8K4s7G1wsLOxb/BvbO8v766vryyw6ipubC1tb+8rquysZugp7GtpqavpZ2yta2qsbGsqai1u620srSts62qrKisqbitsrDIwbmlurGpra2lqK6xpqWkr6SpnJ6dm7Cao6Ojo5Gtn6SgoKKrpqe6pay2tqarrKmtsLWuo56jqKqboJubkqOzmY+JjYaQoZ+UjJSbnpGRg42Skpyal5WUh5eSlZmnnKCejJORjpB3fY6FfHt8hYiIcHJxfXx8XFNkb15OWGZcRkSWW0c7Tm1YYlxNYGJOVldWV1RYZ11RUkxjWVtUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8rMSgpKywtKiY1Ki8mMCkzODoxJiozQmM6NipIZUhKKzpHPjNCSFMsPpBrO0dIj5yqrKKqsaSppbS1srW2srKirK69zLqtwLrHsbSttMHD0cXGvsCyvsDCu763u8SnrLassre8wK+rsayfo6etqamlsKOqsqqwq6+usK6rs7yntrCyqbKpq6Wlo626raqyw7q2rbupqaisqaexpaqlo6+qqKKfnKOtlaWemJ6ZrJ2ip6miraakrqy4s7KiqqOgq6+wrJ2fpqepmaSZmY+fppiHhI6Ji52gjoqMlZqNjYSFj5SfnJSXlYaWlJOXpJydnIuSkY6Jfn6HhXx2foWDhHJxcId0bF9aYW5iUXJwXEs8hXxGP1h1WGFaTmRcTlZWVVdRXGFeU09OZ1hWVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyoyNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTtcSjAuSmdERjg8Qi80RUtYMkCVWT1MRZaYramiq7Ocqqqxt625t6+spqurvcm8sL22wq+xrLPDw87Pw76/s8DBw7m/s8fDq6+3rbK4v76xrK2rpKeqsKioqbGltK6qsa6tsbG0rLS8pLezrKyuqKugo56wt6uqrbq3pbe2pKqnrKuqraGpp6eysqSnpqGhrJeqoZWboKaepaKqpK2joKexuK6upKajm6qsramcoaSjpJigm5aPl5yTgoOPiIWboIuKjouXjY6JgouXo5uQkJuMk5KRk6Oam5qKj4uLfIaBgYN6c3+Cf3xydYukh3hrX2BtZVdkhmNOP2eTTEVieVdiWVJlVU5WVVZUT1xdYVVLTmhWVVZJSkhJT0JHSVNRWW9BTlhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqMzk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2VlouMEpnQUE8PEIrOkpPXjREhz1HRkSXk7Cmo6uxmKuqrrast7OspqyqqbzAwLe4sry1prKww8nL0b/Auri/vsG5wbnAxKyxtLGzusC+srCurKurqLaqp66vqrmwqLKxrrKtt6q4uKa0tquspKmqnaSes7OpqKS0tKC3rqCqqKqoq6egq6ypuraqq6qqoqqgrZuSqqGdoKWipqOqn52ota+ppqujpJmlqKepm6Kjo5+ZmaCQjY+YjX6HjIeDnZ2Gg4mJjYyOi4KFlaKajY2akJKRj5Ofl5mWjIuDf3WHgX+AeHSCfnh2fYCHnY9vcWdmb3dcYHKHak9emVZIbnlVZVdRY1BNVlRVUE9YWmJVSE9pVFZTR09YVUk+SUhPUVB4TE5XPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzo3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMVBiMDI/Zj1OWD5DLD5MVF8wSmk1T0Q8l4+xoqasr5qspq2wtLWwrKawqqm6vrvAsK25rqG2sMnHyNHAvry6u8G9usK/vr+tsbGxtby7wbGxs6qzqaS0qaaus7O5saOuuLKws7usu7Cprbasqp6qq5+joLauqaGfsLOitqqeqKeqo6qhoq2tqL2vrK6toqiooKyZkLChmKKhp6ifqJuaq7Gqo6CuoqGUoqSjp5iaqKWYl5iej4qHlIh9jYaEhKOWhIGBioWOi5CDg5OfloiRnJCTkI2RnJSXj4qGhnh0gn98dXh5f3lycnhmf4akdmlfZGmAdGaIi3xSWHBfSnhzU2RUUV9NTVNaZk5MVllkWEdSaFJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS01KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBLZzo0OF89YWQ/RjFDUFtbKkhMOVVANJKQs6Glp62kp6Stp7WzsqulsaequL7Au6+nuaqmr7HJx8jRw7y/vri9vrzIusC3r6+zsbm7uMCzsrqsuKyitKeorbO3urOoqL62r7e+sL+nray1q62cqa+joKWtrKicnquzpbSomqqnqaOonaOpqKm+q7Swrp2qpKGvnJuzo5aknKWmoKWbm6qspqCcq6Kck5yipp2Yl6ipkpialJCKgo+Ffo+DgIidj4V+fYuHkI2Pg3+TmpOFk6GMlJGLkZuSlYeJf4Bye3p+fGl4fHlzbm97ZoR3hYpkYWdfcoR6bGZ4XV5UP1d7bFRhUFFZTExOcnVdSFpbZ1lFVWVPQz5KTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMScvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2pJMTRYPWZiQUo3R1NgVSo9OUNWPSqQlbKaoKGqpqWiq6W4s7SmqrGmrLjBvbWvormtqKiwwsrJzMG2vcC0t7+6yLTCtLKxtLG8uLm9ta24tb6sobOnq6yxtri1rJ+/vaqzwrS9oa+ytaqsn62wo5ymqaqknpulsaewoJ+rqaehqZylqaGtvKiusa6hq6Okr5+fraaYn5uhpJ2gnZukq6Obm6WllpeVoKOXm5alrIyekZGRi4KKgICOgXuZlIyIe36Lho+Ni4mEkpiQhpSjiZOSh5GakZOAiX15bH52eXhjfHpwbm9xdmd/cmqEZ2VnXWxzjWxgaHBgbz1beGxVXU5QUktKTVRaV01cXmxXRFdfT15PSE1ERjs3SEVLTzxyaEtLOUFFOzs9Pjs7PUo0OUI8MztHPDQ/MTgtNjg7MigwOS8sNC8uPS0qSz4pHTQ5JicuMzQuMCsvNCYsOiQ0MUFoWTE0Uz1lX0RMNktWZE8qOzFOVz0jlJqtmqCYqKSkoKikuLCvpK+wqau4wbmyrZ+5r6uotLrIy8i+tsK+r7S9t8S2wrGtuLGzwLS7vbeoube9qqO0qKmrsq+6saucvb6msMG2t6KutrWnpqews6CepaaooqWZn62oqp6gqq6moKaYpKmgsbmfo7GvoayhraWcp6epmpqbn6WWnZ2bn6unl52hqpOalJmflJmWoamRmomOkIZ8h36CjX18oIyNiHiCi4SJi4uFh5OajomVnoiRlYKLl46RfYV8c3B+cnR0YHp4aG1vb21ofXFje21pZWFcZIR+XllzanJJSH5pWFlNUExLSFBSUUlPXF9uU0RYWlJnTkdLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLjo7ODMmMjwwLDg1QiopLUIqLDQ7Tk5AOzczLS4rLTcqKjwlNTM8ZmQyNE0/ZV1GTz1RWmdIKj0vV1Q1KJefp5qdl66hoaGlobersqa0tKqoucS0sq2gt62urbC1xsjAtr7BubC0vLe+u72vqr2wtL+wvcO5qbu6t6entamorLKttLGonL+4pq69uLOfsbewqaWnr7GboaShpaWgl5uvpqGeo6ivoZ+hk6Wlo7ewoaaxq5+so6+YnKqlqZ+Xmp6mlJudm56orJqdn6aXl5iWno6Tl6KoopCJi4+GeoR+hIt6j5eJjYZ4gYeDh4uNhY2TmI2PlpmKj5d+hpeNj3mBenByd3BwdF95d2Rqa2pnZ4JsZXJqa2RnV2Fyf15Za3VpWEV9XltYT09LSEhSVUcyOV5ebVBEV1VZZUxISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRIQmZbSFRDVF1oRS46MV1RLDKXpKOYlp2rnqaho6G4qrChu7ilrL3Esq+uorWwrK2vtcTEvbO+urews7m4uri6rq2/s7S4r7/BuKu9urSlorOrqau0ra6zpJ7Et6equLesn7K7qqelqK+rmaOnnKSmlJihsqWZnqSpqZyhn5SmoKS5qKSnraaepaGok6CpoaGhmZueoZOcnZeho6ycnJujlpOWlpyOlJOjp6SQiYqOhnmEfIWGfZ2NiYqGeICDh4iIkYWUk5KMkZWUjY6Ue4OXkIt3f3xtdXNtbXRieXRoZmlmY22EZmdoZGZnaF1kYmllWmV6YmBQclRbW1JLSkhJT1NAICppXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1PPy4rLTctMTE5NSwmLjUtODA1NzZgdEIzQ0RoW0tXR1VgaEIzNzdgTCcyn6Slk4+mp5yfnp6ktq2oqrq3p6zDwLavrKK1rqevr7fBwL2xwbexrrK2tbm4tayqvLOvsrG9wLeuvLywpZ+2rKantaqrr6GhxayqqLK1ray0uZ2oqquxpZidqp+npZKZpa2imJ2kqqGboZyYoZ6nt6avqq2hoZ6dopWhpp+ioJmcmp2Um56Vpp+uo5mYn5aVj5WZjI+YmqegkIeKioh4hXeCgoKdh4qCiHt/hYiGhZCElpWPj5CRkJGNknuDlY+Fc39+Z3lwbGtsZ3VzamFmY2Fzf2FkZWZkaGhhZW5ZXVhcbGNhTWdXWmBWSUhJS01SWD45YGxpSEJVU1xaSUdGRUEuPD85QTg5UkdANzpCMDM3PTc2OTM6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKywvQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNAYUUlNZ2loZKNrqGamaCXpbSyo7K+t6Gxxbu5sLGjt6urrqm5vr27rcCyrq+utq+zubKnq7mwr660tru2r7m+raaetaugobKmq7CgpsWhs6awsrG3rbSdrK+srqKZnairpp+Vm6emoJmlo6mdmp+blZ2drbGmuqiuoqGam56Zn6SapZ2Xn5iblpqhlKqXramclZ6dlI2Vmo6VlJinp42MiomOe4F0goKLmIWGfIiIhIWKjIiThZSck5KQkJGXj5B/gY2Og2+Cf2d5bmlsamdxcmtaaGNhcX9gZGdqbmtlaWVjbFxsbHVxYlNiaWNlWklHTE1PWVFQVWFlgVRAVlJaVUZHRkVALzw9Nz82PEZOYTg6PzI0OUAzNzgyOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OjUjMyopNi41NTQ2NVp8XTE6TGpbTVtLWGRjQEExR2BBJzSUo5yPj7GdnJWhm6mzsJ+4wLagtMG7vbmxprawqa6luLq4uK27sK2rq7eqtbmtpLO1sa+psba2sbO2u6epoLaqnp+ro6qunazEma+msLG3tqyrnrCtr6qim52kramblZ2npJ2aqqOllpqgnJKco6yrqbuepqSgl5qanqGPa6OWmZ1xg5idpYB2kqypn5aXopKKmJmAl4qfjniFko2CbGl+d4RxbIaKhn2Ei4ZvXWRhZ4SYhmyLkJSSdXmLhH+DkH9miIFodmpmWFxpdG5NT2liZXCDZl1kZm5raF1bXImQhIhoT0tEOEZUZ15KSFFQVVZLSFJhcHRlRltRVVBGR0ZDPjE7PTY9Njw0Zlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyODZYgWwxNU9rXE5bS1tmYj5HMU5fOysuj6SbiJaxm52UoZyqrqyjvcWvqbfCuL68rae3saarpLi0s7Swua6pp6y0prG1oqe4trWop622s660rrSiqp+0q56jpp2nqZywv5Wop7C1ua2to6isq6uloZ+coaiom5iipqacnKeonZOen5mQn6irpLWwo6KjnJaYmZijiKGPkpqHoYiVn6KApYCorZ+UlJ6UiYRyeI2Og4igdYeMaZaIZn5zeKBvh4eEfox8f6GgoJmAfIefdIiOdpuKa4eCg25pZWR7bXJiVIZtZG1pmHFYaW9thlddaFpralqIcGt5codoh4RZXkZOPkZeTUZSVlZRUFJXVGdeTVpMUlJQRUZHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STovMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN0MTVSa1tPW0xbZ189SzFUXTcvKI6nmISerJ2amp2fq6qoqr7Dr7K5vLfBv6qkt7GqrKa0ta6vs7erqaWyraW2s5ustba1paaps7GtsqivnqqhsqmgpaWcoqWesbiVpqent72mrKapqaynpaGfmaGopJqZp6OkmJylqpeUopyUk6Smp6G3paOfo5iVlJiUnYiukJiViqqMmaSdhrGBpa6flZuhl3qC1KiAh5TAm8Z4d7Glt5dkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gmyXsauxeWlsWLGub2ZqvJO8bmd5bXGP2H5Sa2K2sn1+cJV1mqGqkFZOV2FPVk5HVlxYUFBTi1xXW1BBXERQTkNGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQUUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzExVGtcT1tNXWdcPkwxWVo0MSGPp5SBqKqfmJ2epa2yqrDCvbK1wLW3v8KrprSuramosLWqsLa0qKimtqaoua6csrK2qqWkp7KvrrGnq56npbKloqKgmJyiobKvlp+kobW6o6mooKytpKKdmpqjqaCYm6mgn5eeqKiRnaeblJ6ip6OhsKOen6OWl5OYkpmFr2tqjI6qf2iFloetZnGfnpWbqZdxrqGkf3e6fGugj3axX2q0W6WAZZyQYGaBemZ/aXhrqmW+c2emjHaxanyxeHWSlGNtbaduXISgRWlniJZFdZxffWZ7o6eCWV+Lq2h8jHd7aqg4Sq9bWFRsY1pLT1lgXFZWO06IUFdWMElTU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLy41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpONV1XMzEbkqOWg62npp+jpauyuK20vb6wt8WyuLrDp6mwrLCpqrGvpLG7saWlr7OjqrmpnbKysKOkoKqtsKyvp6igo6OxnKSemZeZnp+wqZicoqC1s6Gqm6GtrZ+dmpeho6mdmZ6loJyZoaekkJ2impehoKyfpqagmp+hlpWRl5GbhrWbtXmHqZq2mXiItJu3f5SXmKyXf2uBpnuBhYaRlJJ3q2dqsVuse46HlHSJcI6GgX+IkZd4g4OLl4yDoI+FsHZ3n3Jra218i0+lWEhkZJl+Y2imX3hxdFKShl1QqW5jcHqFgGGdL1OibltUa2dgTEtdZFhcWkI+sHdXWEEjTWlFQkRBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJBQUQ8RkQ7MDIwMTtFLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SjlgVDUwHJeglYm0pqehramos6yqu7fCsLzDrbm2wqutra+vqK+zqqKwvKuiqLato6y1pKWys6ijop2oq7OpsKimn6CgsJegm5eWl5uhsaWcm6Sotq+hqI6pp6qbnZaYoKapm5+dpKCcoKOlo5abnpianqOrnKaanJqioJeTkZSTnYTVk5m5cbHCf8aHfdaUnLt9nJeoko+djaR7jYahgKWCeat5j51Wr3uJfp9quVq5d4eEfaaDlHyZe6l5jp2Qe7FtjoR1kLyGb5VQr6fFilGgemNgqmFzcoZrlodeUrW0yIV+iXxjpDRDnXVdUGpoZFBAWGdZZGFKSE1qSlpTT1lmWkNEP0U/MDw8NTk8NzQ8PDg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQi4wMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbSltQX2ZUN0g6YVA3MiWco5OZsqippbOqpbWopLy4wbC6wLK3tL20tqiysaSytKegr7apm6m7rqOxsqGytLGhpJ6eqKqxqbSppp2en6yYmZmYmJeZpK6fnJeorbGpo56Oq6KnlZ2Ym6GnoZiioqOhm6KiqJyeoJ6VmZunoZynlZuan6GYkJKVkJ2Ism5otXKsiHCPp3K0dnS2e5yapo6QnY2jfo+eo32wdYKQ0tJ1XK58hX+kbpuqpmuHhX2tfZiZkHuxc5Odj3mzZZZ0hZ5vn2aUUsmLWsJcn3liX61fdnOFYZaIXVnKnW+/fnJNS7VTVcZkVVFqY2VYQU9rX2xpUFVGSDk9V1JbV1hIQj9KPDI/OzU9PDU2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEFOVF9lUDVHPWFNNjIuo56RprCtpam7raa1pae2u7yzu7+4uLW8vLSmtbWjs7KjoKywpZiou66lsrGctLiqoKWdoaqlsqisqqWanZupn5aWmpqTlaWropiTpquxpqGVkqyfpZKUoZylp6CVm6anopujoK6aoJ6dkJabo5+dppSdlZmjnpWZlpKbhax8eKh3o4+Lh6pwrYyFqISam6OLk5uLon6Rl4euhH+Bs1xyslOvfYKCo35x1313hX6PnoeZmnevhoqRnIh3tGGaZZuCgpVskluwV0uadZh5ZmCtXnZ2hmeXiGpdr3aVno93azV5yK6zX0NUb15nYEVQbF9wbVZVTS5lY2hSWVE7QUNATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDQ3Njc9UGtlPiZWZ1xAPVZfY042R0JgSTo3N6CdlKG3sZmzwa2osqeqs7q3tbm/urizt762pri1obauoKCprJ+VqbarqbKyq620pJupoKCoorWnpqqkmZ6VpaGUlJ2ak5elqJyUkKetsKWglJmon6KPkaKaqaWhlZqmqZ6dpJ+tnKCdn42UnpyfoZmYnJWWoqCUmJGnnYepfn+meaGPkISqcK2Ng6eGl6Gji5iXiKOBkIaUqnp/i515cLFaqIOCiKB4dNh/dod0qIKPm42SpHyWkJ+Ee7JenGSgfoKVbpNdq1xbk3+Rf2hnqmNye4BqmIZxXataiaCPa21kT0pDoVxaTXRdYmZNWmFfcnRfSlU1SpqRWEhFPUdFQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjEwMjE1NCsqMDUvNywmMjEoJCU2NjcxPE9lZEEmVWZbPzFUX2JMN0ZIX0MxPTeinZqav62Ys8Kuq6yop7WxuLG1v7q7s7K4vKq7tqGypZ+mqKifk6yxqbCrt62qr6GYoqCmpaS6o6OsoZeckqOglpWfm5WaoqGRjoypsLCmnZaap6afjZKkmKerqJaYqaifoKGkrqOgnqGOlaGZoKCSnJeblZ6hlpaPrJyPrm5ytHSpjHeLpnS0enW0gpSnpJSdjYmkh451uG+Le4uia2u2WqGGZZeXaKCip22UcrR0k5l/s2qGkoitanW0YZ1mom+HkmuYXa1gTqF8h5FSc6NseX9+bpiGb1yvVjycd2VUb24uW6dPYlJrZWJsWmJcYHB8Y1NZUT4/bG8yQkJAPk06ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKywzMjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4vVV5hTDVGTV44MUE4pZqcnrqkm7HArq6rq6i3qrivtcG1vbKxu7iswreqrKGdp6SinZKsq6i2pLSorqqhl52ooKWruJ2jrZyWmZCmo5eOnqGcmZ+fkZSVq7awppiTm6yployUppqlraOSmKuzpKCeqKywmKGikJmhl6CblpuXoZOdqZ2UkKuZh9SUmrt1scSAxId+1pecuHmKkpmOmIqMp4d5orZ1fXd2wYOasmGDunnAfHW4YrWBjIepfZWCrKlxe391vIinoGmdYaaPr6J+jXWHq32+bnO8dLKDdXiBim2aiHBtjaR0vV13fVthebxqWlZbaXleaWFjZmJteG9YW1lDQUBxP0NHKzRIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw7OjA4TFhhRidUY1g8L1ReYEs1PExcLTY/Oaean6K8o5eww6+tqqqtsai5r7fFsbuzr7ywrsKyraajn6WinZyRq6Wqs6W1p62koJaaq5mnrbmdo66YlaGRpqCTjp2jnpmfmpCWk6+5sauVlqOnppSQlqWdpK2fkaGorKCcn6mksp2ipI6moZWhmpyXlaSZkLCgkpWqnoWQmbaAkpKNuJZ5g5ObtndubG90b3mPhI6Jcp7Au7yae4GyqHCBdJG5g3yGhouGjXuKh4yXfaS7ub2cdXmzo3R1l3V0sHWZnmaHao22dHNxd7aMXoB5fYhng3lsemKLrHB0hX5XW6dpRGRZVGZfY11jUWdmcW11Qk1PTEQ7Wkw+SjI7MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQUtOR0VPRj9HPDc+NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JXOCpPXV09KztWVic9OjymnaGhv6aVssKzq6qorauqu6+xxq+1tLC5qLW5rqukoqefoJ2ZlK2lrquntqion5yWoaSerKW+p6Gql5WckaKbkpCiqKKUn5eSmJSytbasl52jo6KLkpKmnKarnZappaacm6GqpqaiqKGRrJ6Xop6XlpidnpCwqZScp6KPa39qnap6iXR/nI92e2aIe72+wLpvkoNxlIVfcmpaXpuKYWSHj5ZsYH+VY22cdmKVbICZlZRmXmBjcZuJaHKMfIaUZmp+cXR4f35jXHh1gWhQXG6EfHyKaldseoJySUpvhXBOcU1EVlxmYExaV2ZjX09bbXVqcVJPRERNPEhIPEw/MSwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNUNGVUVLT0hGUElJSDs4PTUxOi4xOzouLy03Nj01JiIvKjIsJTs4LTdJUl5JJ1NfVjQpUF5MKDM+XE8nPzI+qJ+posGkmrO5tqOspq+mqLayrMissLSttqS+srOnoaSqnaOcmpqsp66kpbaqpZuYlqKcp62pvqippZWUm5agmpOZpqmokp+Qj5icsLK+q5qmnaeiiZORqZuppJycrKCjmpujp6yin6mhma6blKagl5Sdn52YsaWZoqiZnZKfnaSmm6ikm56bnJuRl4Job35xd5GXlJCEibSqjYWYlY+KjJmXiJSViYOTk5GJjpKUmJSZl5qfoZqblJ+bjYF6pIVranyRfYF1iouDcoJ4enZ2i398iWpzgXSDdWR3fXZrb3hsX2Jbb2dNWFlmal9XWW95bm1mU09GUzlQWk5STycqO0tCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1NHS05ER1BMT0k8Ojs0ODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSSdSXlQxMFReOis9OF1LLDwtQLKgs6K/oqOwsbegqqazp6WwtarJq62yp7amwai1oZ+lppyllpWhrKetpKS3rKCZl5ehmK2qpsGfrKSWkpyXn5iUlaOenaOok5CYqKiywq+Zqpyqno+Vlqmeqpyeoa2YoZudoqWvpqGjp56smJalnZmaoZ6enbChnaKnlpmUmpWipJikoJmij5iVi4uOkJiukHyVnIKRgYmpqIWAmJeLhI+giHuEkYWFmpGHhoqVj5uXjpGYnqOWmZKQnI1+jWWhs66FioR3e5CLfnh5enBneZGBgYhrdYF5iHJoc395dYOGgWp0YnhlX2hkY2Rmallre3BqalxTTFBEX1VGQD4+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVFZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzM5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LECyn7mvvq2rrbGyoKqmsq2jrLOwxbCrrqSzr7yltZyhqKOhnpmXqaeqpqWms7aflZWempqwpq6/oayikZGempqUkpainZepnYSdqaujtMezn6mjqpaVl5qnnqmcoKWslJ+fnZ+qrqikoqqhq5qen6GYpZ+cn52wpJmfqZSZmZ6Sppyaqp+cmGaFk31lf4+bkGN6jW1oanqQo6tqZZqYfmeFi2VlaWh6jaKOa2iMmJGid2tqi5mjn5hzbG56hIyGeVhlXYaCXmyLi4N3XGh0d3eSgIeBb3eCeH9zbXmEc3aIh42CemiEWF1qc2Rdc4lpanxybWNdUU5WSmRYQEkzPUY4P0ZENzE8PT9BQzs7REdISElMTk9SUlRXW15gYWFgXV1dXV1fXVpVT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9CSVtKLjZaTzYpRVkvRE8xWUI7Py49pJ66vLmvq7Kwq6Wora+xp66usL2xqqmlrrCxoK2XoaSeopqapqydraSmqKqzrp6WpJCjsKa3uaWuo4+PmqKak5KboJmZppZ7pKuiqLTDt6Shpq6enZSeo5+knaSqqZKfoJ6gqq+pqaKpnqabpZ6noKyXopylsaWYnayWop+bk6eZoayaoH+9hIlztHOFn4ataHe5xLhxkqGjeqaZmXSrgn3LwMC6cYujh4OefZaYiJ7AvYKWnZ2NnMHBfIF6kYyawsB9aqWycI6Cb8p6gJt4koOOgHZ5gYB5cXuAhnB4hIqSeGx1kWJlXndjX2WBYl10aG1kYlhLVUlRWUhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9gYV9eXl5eX19fXlxTTVBHVU5BQD89NjQ2ODI2NiomJSMpKiYuKyopMTAfOSojPklbTCojQ1AvI0ZbM1BZL1VBQjsvOJWhucO0r6+/qamUo7CqsK+uprK1r6ump6axq6CrmJujoJybqqejnqyjpamlpbSknqOUpq6tuLSnr6KSkZmdppORoKKYnKCeiKarpKutv7+woKiuqJaRn52imaOkqqOToaGdnayuqKqlo6Kkn6OknK2pkqSbqa6qnJ6rna6jl5inmKOkmZ5/zpR6e6WCepaXm1+tj12OqIChoXynlZt1q4OBr15kjKp7qIeFoHSXk4izY4KrhqCNjbNqhK90fJaHuGGCrVmjzW6Rdnvbe3+ZcX6IknV/ZXuIdnZsfodtfYSOkH1rgIxfcGpvZmBfeGRbcWhqY2ZgUlRTV15KT0M0QUhFRDg+NTtAP0E7PThAPj8/QkRERklKTE5QUk9TXF9fX15dXV9gYF9eXltXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDpMLSFQQEY0LjGswcDAtLSwt5iekaSqqa21q6ayrKyspaymsKqhp5yappicoq+foZ+op6OmoZ+xrJyelaaurbGrqKyglJKbn6WTkJ+ll52opJ6to6qwqL/Fsqepsa2Wkp6copehqqqflaGenZytrqapqJulpaKgqpKss5aloquqnqSop6OyopSbqJyhnJaVkZehcoaMmHaGqIdxsHydcax9oKCCpY+eeKuCfq1/nXKtf6yHhp92mJJ7fJd/qoiijJGMnH2reoiTj59/eq1WnMR7kHCTwX2BlW11cIxtZndlh25heG5yboeJj46CbI6NY25zdW9gZm1kX29pam5mY1hTXGBaUlJDOElIQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkyNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLTwoPTEpM1ZARiEcRztDMS4rr9PGx7Kzn52jj6Ojoq6vt6+psaeoqqmuq6ynoqSdmqOVn6aroKKmoKioo5+esK2Ym5aop6+tqKepnpeVmqSikpShrpqdp6OurKKstam5zLGspq2rlpScnaKZn66snZahmZ6eqbGoqKibqqajoaqar7GiqKyvppqnrKurs6STmaWnnJaThaRrpHWKeql1e7JxgqWKmItxiKCbh6RfYVKrhYCug5x1roKohoafepmXhntmgKOKpJiGgqN9qX+BlIauXnuoVZ2ikoJ7o5+AfMSwxYxzr7SzuXJiqa/CdGiLi5WNgGuWj21seHd3bmtmZWRxcWZ8aWNdVl9pWFhUTExQTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYWFgX15dXF1bU0lCNjc5OTY2NCwmJCIgJychKy0iJC4hMy0mQERXSCxHKzU2KjFQS0wjIEE5RDQsJ8HJ1tbAoZmrqKGvop+xtLCvqayjp6erq6uppaagm6WfnaanpqSdrJqirKGkoK+jnpuTqqS1sK+hqZuclpWnpJGboqifn6acsKWiqLGstsextKmrqZWRnZ2hmaCls52aoZScnqeqqqKtmqqmoKGporKsoaqzsqGcq6qxsbmmlJilqZqdk32qbZ+EiHareXywboKki4iflpWeloHSuLS4yYGCsl9glKmDpYiHoHqYlpp5qsl0mqOUqKmQkpqMfpqJmsbGd2WhgqV0gqCOgn2vX2+1Y7F1S6OHbadHg5NkjY+ckHpulI58bnl0fHptW2ZqcnFngWleYVhjbVxeWUlMTEpFREJCPUE8QT9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9gXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDAvPi00T1RRHRw7PEYyLSSnpMDHua2psq6tpaOcs7msq6Glm6imq6yppqCmpZiro5+vrJ2moa2an6mlnae2oKOYlKirtrOsnKacoJaQpq2Smpyno6Cqpq2goqapsLPBsbKprKeTiZedpZuipK+ml6KVmJylpamZrpyrpaSdq6O2rKGxubCenLCotbW2p5aZqqacoZCDnk53moKAn3uEo3yCpIOGpp+cn5SEuHx9ermDgM3Gw7Z4m6KSi59+mZeXinafl4qkmKSofq+FnIOehKx9mZRhpWyjcZCFkIF9loRyrGCkc3GAmmG8fVJVdY2RoZR6e4+NhnJ5c4R+b1tsbndzaoFuWmRfaG5iZF1LS1FTQUdHRkg6Oks+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUV1lZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1RGPEUyOlBbVBwbNj9HLC0hi4eZqaykq7mrr6Ccoa2ztKafoZWlr66uqaeepaWapKehs66iqaezoJqppJSjtaOjlpehqbW5pJujnaOTkKKymZ6bpqWgoq+sm6OnorWxw7CtqaypkYeQnKedo6ScpZeemJiZpaOomK2hq6Kkl66lu6yit7aunp62tLqztqmaoLKjpqCIkNK1w7d6h46GkZOPgKZ3lKJ3jKGShaWDjHKriIa0bnNqmqSdloqffZeZh4eQc66CpZujjaaKk52IlJCabXCyXKVzk3qcbJl/e5l+bqlhonJzfp9ic7K4aHeOkqOWe4mJjod1e3iNgWxod2h4c26AdF1kZG1tZmhgSllXVzxHRj9TM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZUUU9RW1UlITJBSCQqJZJyjYqtv7+8u7Wel6ikrraiopmVo6qorqmrmaWin6agoLWmoqmnsaSUq6OPpK2knpGamqq0tKSdpZypkpSXr6CgnqajnKecs5ifqaO1qsKvqKqooYyDj52ioaajlZqanJiamKajpZepp6ugo5uspryslb2wrZ+jsrW7rbepnqy1pquafKiSfXyweIuApKWInG2xb6CHrXyij4Ool5qCrIqGrYahlaiho5iGn4GZloF7kn6rgZ2Zlourd52gj4iTkn96r12jgX2mp2WegHyXdWquXaVscoaZXWBbjKBtlI+jloCRiZKIeHmBln5pbH5ifXRtgHlgZ2Vwb2dnaEJYX1o9SlMyUzhBQUM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pYU1BPTkk4MTUyLiosQVRWVlZVVFVVVVVUVFVUU1NWV1dYVlVWUUhGSUokKSm8kpqEqcbDt8G0n5utoK65pqOOmqOkoK+uqZ+jnp2tmJ65oKOrobCqmq6hkaqppZeKmpCusa2noKibrZiZj62ioZ2loZmlnK2Xn6iltqi+rqSpo5+Lf46bmqCmnpKTmZqTmpmlo6KYp6uqoaKeqKi8pJfDrKujoq20u62wqaO2sayumnevf5CKnIaHfLqtiZhksIxklq59oZCEp5ecgq2MhrCHqJqkoqOShaBcbGuCs2B/rXx7goGybGdumZeLh7FafbVcpINryKJmn4F8u1l2tVqyfVOvgXqsWIChbZaNpZiIlI2Sk3l3jJt8Y3N8YoN3dIB8YWlmb25mZWZPVGJbQVNdPUgoPjk9NCEhLSQfMS4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYGBgYWJfX1xbWFVQTkpHQzU1My4vQFVZWFdYV1hYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsbe+u7TCs6Ocraelt6mgi5mgn52ysaieop+dtZigs6iqq56wrZ6snJWvqaOOiZuOr6ypp6Oomq6Tmo+pmqGdpZ+ZpKKlmJ6iqLGou66kqJ6djnyLm5ahoJmPkZmbkZmXqJ6fl6etpaSkoqSoup+gxqemqaGstreusKmhv7CwsJiCqpOjro6bgIakl5iQgYC4w7qEj52UhaiZnoOsjISviqmdmqarkn/WvcKqYqS/vX1/o4KD17u4tYSUkoKevb6Ea6OCcKuFb51/erKxx4Nrq7G9rHl4or67dICUjKOZjZiNk5l3f4+ZeWJ8eWSMZniBe2BrZWpqYlBiW1JpXD9TYEJMKTw6NC8fHyQeJTIgHSQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1JQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVtLSywLqyvrOina+nprOnnYyXpb+ptq+nob+mprGbnrGcuaifrq+lp5WUr6yXjIOaka6mo6yhpZyqoJiKo5OmnaebmqCoopidoKysqbitp6Oal5J7h5mRp5uTjo+XmI+Yk6mYnpaoqJ6opqCiqrqeqcWjobCkrLS1rLKso7+rs7KddXaqpLaFZYqgcGeskIqPbm53pZCboYJ2spyYcZGOcpeqpJuZsKVybW1tZot4b22DmnGBempxaWeJlpWXcmlphYdncYdkXotjaW9aXWd+eKZgYnKQknBmZICMkY6flZWXjZKaeoWNk3RkhndnjGp4fnlkbGNlbGJKZFdJalk5T2NETydKOSsjHCAbIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1tcYGBhXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola20qbq6srOrqaKun6S0qpmSvbHDx7y0qZ6/q6yjoKeroLqjpK6sraaOlq2qkIyFlZetn6arop+kpKCSi6WSppmpmpajqaCVnKWlpq65qquZmpOSe4SXjaaXjZGQl5SOl5Wmk52Wp6KZr6Wdoau5n7DBqKW0p62xs6ywrqq8p7K7mIyjqaW1nImXo5iHqZuQlJ2SqrSanKSuorWZpaOgo6Seo6Wil6ynjZOTjYeTnZ2VkJmTmJGPlYV/pJqXlo6MlJOKkIiFf2iMgXSDd3SHjHGnbX2Wk5SUgYGPj46Om5Gek5STnYCFk4twaI92b4l3dXx5aWtlY29jVWFYP2haR2FeTVcrRT0rJiE2NDAuHxwgJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1VWWV5gYWJdXlVRS0VDPjk9QEFTWFtcWVdYWFhYWFlYWFpbW1xeX19gXl5eX19gYGBfWVlgpZapqqS1uK6vorClrqCht7GRjqrEvMO5tqmhpJ2bpZ2wqKS3p52ptaeokZiso4yIio+cp5atpKGaqJ6fk5akl6iaqZmUpqCjj5qnmKC0uaeqmJqQjXuBlYuhlIqVkZWQj5KXpI6emKeemrSjnKart6ivwq+kuKewsLKvq6y2vaOywJqTp6WmtKKSnaefjqmgjZKfoq2xm6Kls6uzmqajn6esoJ+enZitnpOaopyUkJermY2ZmpeQl5+Rh6CelZSGlI2QjpaNgn9mjoh1iHd6iYR0nGqIkpaVkol9jJaRkpaQnpCZkp2BhpeFeHGUcnmJf3F7fmpuZF5waWBcX1hsYk9fYk5YOUZGRD0yPD03LiolKykmHSY0MDY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGFpYWVWUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iWpKijsLSsr6Oqp66gqLaqkY+bo7K5raqroaKZepyhsKSmsamXnLimo5SYqZyOhoqJnKOQr5+klqmgoZOXmZyui6uWj6iZp4yYqI6duLWjpZebjYl5gpOMm5OKlZGTkI6RlqGLnJ2nnZ23on+DrrWisLB1pL+ks6B5e6Kttb+Xd6+moYqAqn5kXGJ3oI+knoOWfm2UtZ2lqbGtpmagopV1e5yZcIGZqpltgKSpimWcpZyRmJmXjJOckYSdm5CVhJSIj4+Ti4Z5bJGIdodxfIaBgWFpiYyVk4xbdpWQZmiOjHF5oZWVZHiXhYB2l2iCiYJueX9rcGVgdm9ra2hbZGNhYGxQWT1NTU1SRj0/U0I5MC8eHyY0OjMwNjY3ODw7PkBBQkZIQkdHSUtMVFVVWV1fZ2dnWFFKPERIPDlWUltgYWJgXl9fYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuqpqmuo6etpZKVqrSusKWZqaWqlnSLnK+gqKunlJe5oKCPnKSekX6IiZuejqyapJWoop6Ol5KehXWuj4immqiRlqOIm7mzp5+YmIuJdXeSjZeTiZOQkJOMj5KfjZmepZibsZWAjJu1nbSMko+9p6J+p6N7pbG6g46PqaCEjIWPsaqvjIqWo5p5gYushp2fo6mrqomWiJt3pZx7iJyBmKeEgnues3uKhqCYmZWYl4KRl5aEmppieYiShY6Qk4uEbnKRiHqCcYGBhoCHdIiGl5N4lmiTdKCadHuZgpuZhJh+kYiBgphpjIyEanh7cXBnZXhtaWxqW2NpaGRwWltIU0tQQEU1LVlTVDYpITA5PT42NDM1Njg7Oj0+Pj9ESUBJRUpLR1NYW1hbYWFpZllRSDlFTDw/YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZikoKaurquoraCpsaanqqWZk6zEvK+glKWntJ2Qg52snaeioI2Qvp6ZjZ+aoZF9ho6Yl4isnaOWoaGSjZSJhoCRqI6GoZyjk5adhp65saedmpKOhXB1j4mVkIqUj46bi46RnZCVnqOUnauHn7SJtJqui8qIq6+Kt4WNsISzsYapj6qajZ18qI9ye3ecjqaWaJWkebSMoaCoqpSawoOBq4mZoXKegJulfpeGlrKBoX2hk5+PmJiAj5SbiZmSi3yFlIeNlpSKhW50k4aAe3OHgoR9hXWGg5iCj8VmgKmHj6JqnYGdl4CZgIqMg4iYb42ShGd3dHt2Z2l2cGdoa15ibmxmaldkRlxRTDJFNDZNYGM3JjM8RUdEOjYzNjU4Ozg+PT0+Qkw/TklKTENRWl1cV2JeamxbUUU9S01ASWRYXWNmaGdiYmJiY2NfX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXoqCwqamopqygpbmxqaummpSeoaSpoZSjqbaisH+gp52lnp2JlL2ak42gkp2QeYOWlpGIq5mcm5qihY+MdpubjqCRh52jm5aYl4aiuKylmZuMjH5ibY+Lk5CMkIyMl4uPkZ6Nkp6gmKGnfqGnh62doJaukKCenZGHgqGNrbKJpI+snIyafqJ2gJmUa4KrdU2reIeNnZOcqqmCqqt/haJ8e6dqnoCTbGeXhpi3iZ5+bmBjWIOYf418ZGeMc5l9eZdsXX2Yb2FUcoZdYG16hGBZZYJ+hYGZcqiqa4OjbnKlb5+Bm2dknmxabIl7ZVlfgn5hV1BvdmVvdHFqam9daW9samdXZk1cV0U4QTRHQ15rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSS01CSlxdX1deXmN1X01EOk1OTVRiXFxmZmlpYmJkYmRkYmFiYGJkY2FiamtkYmRkZ2RiZ2VhY2iYl52huaGqpKaskqK2vKuvopmWnqClq6ufnK20oqiSoKChp5yZjpi0mZCLnoyVi3WBlJKNiqaWlpien36ThYWso4eckYqYqJeZmpGHpa+mopWZh4mAaW6IiIuOjomLjJGLj5GhipKdn5qhpH+TgY+joZSgd5yWkKeDo6mAh6yvh6V6jX+Emn2icHOTh5V7nox5bYeci5qSnaqcj4edfoSidHemZ55+d6VfmHt9k3Oibpi3tLp0k4iCgLaoZIHGuHxxlbaMcoGbpGR0rKthfmqds35ufomEj4OMmHGAo2xyo3Kegn2jXpyZs5VwfJees3RyW56ygmlicXR1cWhvWGprcXBkW2dcYUtDPUQ1UUFZcTI8U0dfSlI9PDM5NTo6NkM8O0BJUD9UTk5RQERfXltaV2Bge2RJQzdMV1VWY2FaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVpLmZq5yToI6luLatrqCaoZuio6SsmpqxrKuTl6GZoaWampSerJuLiZF4i4VxgJaNiZChkJOUnZd9kYqOqKCGmI6JkaKTm5qMi6inpJ6PloeEfmt7hn99j42Di5CQiY6Tn4GVm5+coJ+LiXecmKKNoHKhjImpiZ2okpmqroGujX56oJl5o5N4gHOXh4ycfZWfh5uOmp2oiKNkoX6Ml5CbjW2eaJuOb5qZe4CKp31yaHSrg56Dc6pnlJpdm4V2hJ1oqmqAuWZcqXCBnGGVjF+ndneKi4CdaJp1h5OSmI1+nmyYj2qmmVyofne7an2pWo6EXbNnW25yeHdraVtwaXd3YV5kVmFBUERONlZCUm00SlpaXk5aREAxNTE7OzdIPzpDSFU/WVNYXT5EYl1WYFFhZHxpRkI5TltdWGVmWGZmbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZadiaq2nKiJY5WcrLuysKydpZuap5+drJmdsKernpejmqKgmZaWoKSZhomNaYiAcnuXiIuWloSSlZiPeouElqSciZWPhoqdkpybiI+ooZ+ai5CKgIBpgYZ5f5aMe4iNjoeOlZl9kqGen6GTmHJon4qgj4xwko2CqYmaoaWroqp/sa6koriXd6OzoqN/iJR4nXqqmX+ij5+dmYmYcqF+iI6wtX1smpGheH6ZtaOjq6iEmXybfZybf3SqWl1ve5eLeJ5iTX97e4ZlephCTZ9ZompzfY9vgoqEmXabeYeJsbN/fpqSpnN9nW1wfJRvmXJpo12VdkhlY190cXx9bmVfa2d1emJjX1BdV1xTVkBZRVFnRFJWXGFYXklEPUI4P0E6SEU4TEVYQVdSWlZFRmJcWmBLYG19cUVDPFZeYlplalZnaG1vYmZmXmFgXF1eYGhiX2VjdmxeZWdmbGRlbGhpbGmUnoGxrpqEU1+hp7S6s7OomqKLmqmbm6eSoKujoKiPnp6dmpmVmKCdloeHiXeFgW54lYWQm4t9kZOWiHKBiZKhm3KSkICImJSfmoSOqJuZlYqKinyDbISFcYKhjHiFjIiHkZiUepGjn56jiK6GfbWEj56de6aWeqmCl5+RjKOff6dpeG5+mXSgc3F8nYWYb5OCrXykhKefm4OkcF6paHajZHCmYZzTj3x7mXhyc2OihpF+onKjkHZrkLOMYIOYinSqsqi8f3eEb3+/pqq0Xpxvf3KXcIJ0o3JepGd0pmBopmyb05h5gZpudnmXa5t5dpdybKmlZ19leXF/hGxoZmNtdXZmXmFRWmVQUWFIVklUX1dTW2VqW2VQRUNLTEpLQUpEOFBAUU5YU1hPU1FgZWVqU2R4eXdKR0VkXWVaaGlTaWhqbmNqZmBjX1xdXV9pYmFoZXxkXmRnZGtkamxmaG1omJt/sKxUXUt+qq+xtLCzopyYhJemoKCijKSnn5epipmYmZSak5KgmI6IhXtwfYNofY+Ck5qBd5GOj4pwgIaPk5JsmJN8iJGSo5WDjqmZk5KKhYl5g3aIgG6Bn4Z3gJGFh5ihlniSoaOZn4mzoaK2i3qsp6SupXGpgJuRhoKflX6lgaObhphxnoSira6Jl4t/jKSNlYOvo5V3tba2yaJ0lI2Dn2Cdl6lteZaHoJt1oYd3oH6Rl4uBb01mo5Nym4l0pXt6dWKEg25+oW1yZGCcc390mGt7arS2tMamc5h9eZxqmpmrc4CabHN3l2mZeXSYcVBEfbNeanZreIdma2Zic3RvbFVbUlloT1FoSVVMWFJVXGdrblVnV01KQUpNS0hKTkFRSlBlY2ptZXVzc354e250iXp7VVFObV5oXGtpUmpoaWxnbWZjZV9cXFxfaWJkaGt7X11kZ2NqZm5tZWltZaKdibCohWVAlKKyq6+vtaGij3+Wp6Gho4ukpp2cpoKZl5eOl5CQm5OOiIN5a3mGZYOMf5efeXWPiIyCaoWFkoSLhZ2NeoyKlaWSgpeolouRi4CIeoB9i3lwj6CFeYGUhoiVnpR+k6Smm5WWg2dueJxsomR8cqV4nJhwaKeDmo59pXuil4OWcp92gImUlY+5bpCKomJ9maOXiW5za6trdaBucKdhm2qLkGmWh5uVdaKBfppgi4aNdW+IYmihZp5/apt1cWVniYJvc6JbX1tkoW5eiY1xfIB0cmSlbniiY2anZ5dxi5dtoW9SiI9uoF5kp1SLXVSYbW1ya3GBbXBoa3dzam5RVlVVZVhTbElYTltIV2hoc2pZa1ZQUkVWXE1YUmFVaGped3V7fHB9fHKCe39zd42Ag3deUXNhZ2JwZ1BraGhrbG9oZGdfXV1dYGpiaml2dV1cY2hjamlybGZrbWOdpZmmemV0bYynrqWpsLGln4t/lqmcnaOLoaGaoqKAlZmTjpqQi5eRjop7hnGAiGiLinyXmnN1iX2QfGWDh5WKiZWagnyIhpamj4Chqo+FkIqBiX2AgI5zaY+mg32FkoyHl5+NhpGppZ2JpniWm36liZaMspmekYSvl5+lepiJe6l1qJCEmm6looyShIyDvG18pa+Ch4WHlZieon6mfHOolaGWaZ9/cKxjloqWk3iobaqjgYl2iYN3q5GmiGuSsWx3s42pbIuGb2+gnpKVYn+rjKp4gYCOp593n32FpJadoGiZh3WsZp6tjLZzdr6MpJNZg6aNq2F1cnRve3VwYmp9bmdsUlRYVGBgXGtMXFFbSV1sbXZfW3FYW19aZ3Nlbm9xY3F0YHd6fnlyeYNzg36Be3uMgYKAdmJ5ZGNuc2RSbGdnb21yaWZpYV9eXGFqYmxsem9cXGJpYm1pd21nbG9ilqarnYGAn6WWqqqep6eto5iIgZapmZ2iiZqknKidhIyaj4ackYWSjYyMdIV6iINvjYV+l5N0dYZykYNuf4uSh4aUj3x7gYWXpI1/paSNgI6JhJR1goeTbmyLqICCi5ONiJueiIuSqqKgkIB0lJeIfoF5lK+kf4KdcY+GeZOOh4F7c6mNcX19epiWm4SNeHt9fYeTlZOLd5KaoaKEe3+LbY2GXHp5c3txaW5+k4pygHSCj5STcYaEg2aNf1+CgYx4d3SVdnB6b3CJboWGX3dpeI5ngoOGj6qcf3R9lmmJiG99dXuCdGxsZoxzeHuXd4Rba1d5j2lud3Jxb3d4b11rhW5pZ1ZZXlZcZWpjVWBUXVFeb3d5a2p2ZGlqanV8cHF0c2FvdGJ0e4F4dXmCdX+Af4F5i4WCfntugG1keW5eV25naHVreGppamRcYFpjaWVscXVuWltia2Rsa3ltaGxvYY6Vuqmni6Gjm6akmaSdq6Gfg4OWqpGdn4iZppqomYOBnIt+lpSHjoqJjHKCfI58fo+Ee5eOdHOEcJWGfH2Si4aGj4V4foCGmKOMe6afioWPj4SVgoaOmHdxhKqFjZGcj4eenYeLmqefoKuDiY2Vm39+ipetqJCTqJF5cZ+UhX2VcICrh3F+lXFqb3yBn4t/kY2KZ21dhI2OnZ6gkHOXjYpzdWyDd3SBWXJvh5GCfn+Mal1pZHuFhImAYGl5fJx8hI2Ed4KIhWp6jYlsYnFzg3dgdI2DipGolodnjY6CbHaKgW6CindtY2VjeYN6lVpcaWdudlt7eXd0bXNyg2ZcbYpra2JZWFxZWGtxW15gWV1dZXJ9enRvdGJqamp7fHF6dnRkbXRobXt+dXp9e3l6gIB/b4aJg3t9c396c39oVFxyaWx2cHVnbGdkXWFZamhranFybVdbZW1sZ3J5b2hqbWCMjKuyopCjoZqenpidmaihoH2ClquMn5OGmqKRpZV/e5iFfJKZiYiGhopyfYCKdoSLgoSWinJvgHOYhoR+k4ODhoqCeoCDipqfj4GloIZ4jpeIlYqLnJeEg3msgZCXmJOJnZyGh6GqnqKipIuHk5udo5qWq6KoqKKTnYmZkX56kZCGqoB/k5GSk5yxpZqUno6MsJGYhKaOjpadoYqRnYSKk4tsfY93eGaChpGLfYmehIiMj4iIgYWEkXh8e3WcpIqIjKCMh5aAgI6DgXdxdYaFgHmJiIuRp5GEh46HgouPinqDiIaMf3RqgYN8eZlpcmhgdIpxfnt3dm92dIFdXm+HZ25fXllaXFNncVVjW1tgbGd0e3tybm9jampof3tteH5waG9va2aAe3KCgHd/fX+Fe22DjIV8enl8fXqEeE5kdmpzbnF7ZWxlYmJgW3NmcGZycW1VXWx0bWh4enBnaWtljYieu5+Xo6GYlZmYlJikoJx6fpepjZ2MhZ+ci56XfXiVg3uOmYmHg4SGbXiAf3KAh36Ik4RtbH56l4eEg5B+gIaEh3yHg4yanZKGqZ2CcoqPhZKRi52RfI17qYONkZeVjpuWhYWbpp+imp6Gg5KamZmQmaahpp6ekJeClI15foqQhqd8fY+QkYaYqqGckpyOjamNkYCejoqVnKCEj5iAiJCEcHmHcnVhf4SQiHeMmYGEj4GGhX+GhJVuenZ1lKSMjYechoaPdYKMfn5zc3yKhXx6jo+FlKiQh4SPgYKJh4dzgoWGiHltan1/e21oa2xnXnl/Z317dnV2dXt3XGBwfW50YGNaW11RZmxTZFpdYGpodXl+cGxsY2tqZ4B/a3J/a2t0bndthHluhoB2goB9hXdxgo2Hfnt7fYB7gotgaXtrdWhqg2VqY2BpXGN1Z29idW1sVGJxeWVveXpyZWptbYuKn7iaoqSfk5KWl4uan56cenebpJCbiYaklIuYmnl6joV8ipGDjIKCgmx7f3hygIV9ipB9a2h9gpeJgYiOfH6FhId8j4GPm5uQiKabf2+KiouShqChioWMfKiQh46RlpKWkneMo6ChnZabgIGQmpiTjZqjoqSbmJKcf5CIe4KGkImhgX6NjY98l6SgoJGZkI+ljI+BnJKKlJmdf5OTf4iQg3V1gnF3YX6BjohzipZ9iYxxjX+DhoePaHhyeo6ak5GBmYCJjHODiX1+cnp8jYZ8e5OOhJemlIyGkHuEhYWCc3+AhIV4ZHB6f3h5cGxqZl5+c2h8dXZ0fHOAal5gdHdwd2RjWF1eUmloVGRYXmBnaXV5gXFmamNsZ2V/gGptfWdtcGp9d4Z6a4uBcoGBfoF1doKNhn98e4CBfX+PanKDbnRpYohpbGJfcVZ0b2xtYHhobVdqc3ZjdHp6cWJrb3mJjZ+zkqWmnY6QmI+FnKGam3x1o5+Nl3+MoYqIm5Z4fIaHfoSKfoiCgH9wfnt0dYKFfomQd2djfYaXioKKjXh9gIyDeZaAlZeVjZWemX1vi4GQk4Wlm4eMiYOmlYSSipWXkpF2kZ2hoZiUmHp/j5iXjpaanaWempSVnXuSiYV6iJiPn3+Ci46Mc5einqCRl46OoYyMg5iYhJSXmn+Zjn2KjoJ4cn5ue2SBfYuHcYeUgJGCa4eDgoCLhmZ2cH2IlJqOfpV5jYt9gol+fXKAeYuHe4aSi4yZpJeChIx2h4OAf3R4f4aCc152d31zfXZmbGVhf2lqd3N0dX1xfGNkYXNudXJtYVlfXVprY1JiV19fZ2p0eYVwYmpia2ZofIJraHRobG5of3yCeWyPhXGAg4N/dHyDjIGAfnqCg358kG11iXR0bWaKbGphY3VWg2lwbmB4Z2xhanZwZnh7eXFfcWyFhZCdr5inqZ6OjZeHhZ+TlZd8d6ibiph5lpyLjJmQeXyBjH19g3uAg4B4c3h5c32Ag3+Ii4BkXn2LlYd/hYh0fX6Jf36YhJaUloyjoJZ+cYZ7k5GKpo+MjoqSoJGDkI+Tl5GKgY+XoJqSkJJ0gI6SlImdnZ6nmZmOlZd1kZKMbYiakZt7iImQiW+XnZqikZSKi52LhoGTnYCUlJaImop9i4qCe3F6a3ZtfH+Mf26Fk4OVeHCChH5/jIFlc2p9gpiYhYCPdZKKhXqJf3d4gX6Hgn6Fj4eNlaWReYWCdIiGe35xcn6EgWtgeXR5cHxuYW5jZXtibm92c3h3dHRhd2BvbHVucF1aXl1daV1PXFdiYGdscnqIa19pZGljaHeHbWZsaGlsZ4B8endukIhzgIOFfXSBhol6g316gYR9fI5yeYt4eG5siGtoX2lxYodocW9ldmdtbGF6aGp8e3hwYXdti4GZmquhpamei4uRhomdi5SWfHasmIyWfJ6TkZeUiXd+e4p9fIB2eH+AcHRzem+FfYGAiX58YVx+j5GHgISEcnp/hnqPkYeRkZuSpJqTgXyBfI2KkqSJjYqNlpqMhZCXkpWNiIiMkp2Tj4yNboSQj5GJnpmioZiYipeTcIychmiJm5CVe4mFkIpwlpqUoZCQiIqYjIJ/kp99k5GUjZqQfIuGiXVzdWtxbnV9i3VvhpGOknJ0gHyCgop+ZXJuen+blX6FinWSjIJ1intwgn+CiH6GjouGjparjnuIfX6KhHZ8bmx+goBhZndzdG56Yl5vYWt0XnBqenl5bXRxZXpebmxzbXNZWV1fYGlaT1ZXZGJlcHF/h2VdaWhmYmdxjW5jaGhlaWiBend1b46Fc4GCg3x2g4mFeIV8eISGeoCJd3+Le3tzeYRra19vaHR/a3FvbXFnb2tle2Ftf3l3cGx3d4l/o5mjqKGnm4iLioGOnIaSmnR/qJSSjYagjJaUkYF0fHaFeHh/cnN6hmxyb3htiXaAgIducVtZfpKNiICBgXZ1gH9/oIaPipKcl6CSlneJfoCMiJyeio+GkpeWhYiTmI6Wi4qNjoydio6RhG2Ji4+RipyWoZyZloaZiWyIpoVoiZ+Mk4CNhYyBeJOYkp2Qj4iIk41/fpCZfZKOkY6bk32LgYVwdnBsbm9xfIdqc4OPmYtyeIB1gomEemd0cHeCm5B9ioV7lZN7eIp1cot8h458jIiFio+cpYl8hHaBiX53d2xofX9+W3FycW9vd1pecGBwa15vanx6cW5tam13YHBva3FuWVhgYGBsV1BTWWVlYXRvhIJhXWtsZGJma5JuYGZmX2dqgXVycm+LgHR/g4F5doGLgHmGf3iHhnaDhXuHi398d4t/anFjfGKFfG9wbHRqaG5sd3dfcX55e3R1c3+CfqWVm62fp5eFjIN+lpWDjp10iZ6TkoaLmoyWjox6cnh0gnByhHRxdYhsb2x0bId2g31/bW5VUYGrlIeCeIB2coJ5gaCCkIGSkpiakZh3kHqCjJKjmpOOiJSYkoSFlpiLk4uJjo+InYSRi31yi4WIj4icmp+bl5aBlYBqiZ+KaYmiiZSFkoSKcYORl4+ajI6Li46Nd3uTkXuQjI6TmI18iX6CbHdqb2xsbXuAYnp+kJeCd3qCeIONfXpodW12iJeMgImHfJWScnyGcniOe4yOfIp/hY6Rn6CGfXx3gYp8dm9naX5/dl12bm1rcHJVXW5icmFfbW55cGhwZmd0dmlxbGF3Zl1VZWBfcVNQTltlY1x3b4h7XlxocGFiZWaRal9nZFtnb35vbHFzin12fIaBdXZ/jHl8hoB4h4NzhoV+jIyEfHqVeGdya4Ngh35vb2t7YGltdIB0XnN8eIZ4dHOFfHmhkJqxnKWPg4p/gpmIf4mbfoqYko6EiJiOj4+Ed3R3c4BwcIV0cHGDb2ppdW2Cbn18bXVzUk6C38mS1pN8b3SDdYOfgpF2lJCYm4+Ye5NyhZCfoZOTkImSm5OFfZWVh4yNh5KNiZx/joF4e41/iIyJnJycm5aUeo54aYuUim6KpYaUiZiEhmOMkZiNlImWi4yJi3B6lYp8j4mLk5KKeod9f218ZXNva217elyBepCQgXt+f4CGj3t6aXVrdIyQi4OHhn6XjW2AgHCCjoCOiX6FfISRlpucjH13eIKOd3JrZG58gGlnc25naXNsU11uZHBZX2xxd2dra2JneXRwcGRgeGFgVWtfXnRPTUtfZmJbd3CJdFxbZHVgYmVljmNgZmJYaXNzbWtxdot8dHmHgnZ3fotzgId/eol/comHgZCKiH1+mXZlc258ZYd+bm9rf1lsbnl6cmB2enuNdnJ2iXZ5n4ycr5ugkIKEeIeUfnuIm4aEnpCOhYyXhJOPiIF1d3B5cW+DcG1ufnJjZHdwfG56fGpobGKkmsHcru+ic2x2g3WEoYSRbpWPlZ+TmoCRcIWLo5eJjpWKkJ2Wg4CUj4WIj4CSioqXf4d7dn+KeIaFjZubl5mQkHaLeHCJi45/jaaGk4uehoZei5SXiY6IjYqKhIlsfJeDfomGipGQhnaHfn5sfWR4dWpvenRYiXuSiIZ6f3+Aho1/emd0aoGKj4uEhIGNmIdtg3dwiZKDkoaAhHyBkpeUm5F1dHiHi3Ryb2Rydn9fcmxvYWh0ZlJgcGdrVV9uc3lhcmNgaX5xc25bY3NiY1ZuWlx3TExLY2ZgXXVyiW1bXGR4XmBkZYRfY2NeWGlya25rcneLfXN3hIF5eHyJcYOFfX2Ie3SLiYeVho1/fphzZ3VxeW2Lem5zcIBXcXp2eXFkdnmGjGh2gIlxgJ2Imaico5KEfXCLk3d4iZuDhJ+MjnyWjX+aiIV8c3dwc2pvgWxqbXx0XmB3dntwdHpnYGV869q1ycPciXNsdIF2ipqIjGmXj4+blJKBiHCFiKCNhYuVioyXk3uNkoeCiI96kYuGj4KAd3iDhHKHgpKblpOYh4x2iIByh4SMiZykhZaOoISKYYOVj4WIhYiMhoCHaH2UgH6DhYqOj4Jyh3+AcndodnJpdXhtWo19k4OGfYCDgYSLg3didW2KgpGMg3+AlJN/cINteoiRiJSGfYN/gZOUkZiJbnF5i4R0am9pb3V+XXJobVxpdF9RZHFoZlNfcXZ0YHBgXWiEcXNqV2dpZGlYbVdbdExKS2VmXmFxc4VpW1xleF1eZGd6YGRfXVlrbmVuanN3in5zc4J/e3Z6iHOFhHx/h3Z2ioaPmIGNgnuTdmx3dnl4k3Rud3p8WHmGcYBuZ3h2kYJkdoaFcIqXhpqhm6KKhnNukYpydo2afImZiIl8n3+Emn+CeXJzbm9kcn5pZmx3d1tfeHt6cXF/aWFnYX/Vto6RpnhucXd7cJKQjIZqmI2ImpCLhXpoh4uZhoGSkIaGl418jIyAgImNe5CNfomFenV7g3xxhoCVmY2SlIKJdoSIeIaDjZWgoYiXkaGAiWF/lIeEh4OIjH9/gmZ9kYB/gIOMj5B+bYN9g3VsbXd1dHh2a2OOgo+BhX98hICFiX9wYHRyhn2QjoN9gJKKe3KFZ3uFjImOhX2GgIGVkJGUhW5veIt+dGxtaGh3eV9naWlYa3RZUmhyaWJQYnJ4bWJlXlpqhG50Y1xoYGVtX29UWm5NR05mZFtmbXGAa1pbYnJfXGNsdmRlXV1abGxibGpzdoZ/cW9/fH10eIZ4hYN9gId1eImBkpV8iYZ2iYFveHl6hJJvbXqAdl6Df3SBbGh6c5RzZ3KHfHGSkoSan5ugh4Z1dZN+bXWSlX2HkIOKjZp9jJp2fndyb2xqYXR8Z2JpdXlaYHd7eW1xfmVkaGhXnY9fcnOXvMSEdXGUiI99cZaLhpuSi4dyaYiOlYB7lYuBhJqLfIqFfHuJi3+UiHWJhnZ3foFydYWBnZSFlI+EhHKBineGfoybn5qIlY+egYlmfpOCf4WCiIhxgX1mfox8eX+AiIyPfWmBfoR2Z3B5eHR4dGxqj4aLgouAeYKBhYSBbF9zeXt+jouGfIOQgn9zg2p6hYmNiIZ5hX6CmY6RjX5ubXqIfHVzbWZlenNhW3BiV25xU1NtcmhhTmd1eGZgXl1Zb4FvdFpmYl5rbmBwT1lqUURTZmBZam1tfG5ZW11sYlpib3ZkZ1xdYGtpY2tqc3aBg3Fuf3yAdHWDeoODfYGFdn6IgZaQeISKdIGIcnh5fo2Qb296gHFpgXh6fm1se3WVamp3hHNsk42Gn5mfmYWHbn2LdWl3lo1+gYqClJeKepCWb3t0cWtqZGBze2hgZXF6WmByfHlncXlgZWWPsbJ3S2JapdnQlnF6kIqPd32TioSYkIuFbmuFkZF6eZKGgYSYinyGf3d3iYqEloBvi4hxdX57anmFg6SQg5ONhIBwgIR4hnuInpuWjZWRloWIcHuTgn2CgoiCbYF2aICFeHKAgYOKiHxlfn+FdmRxc4BpeXFwdZmOhoOKfXd5gYV6g2tccn9zgomGin6HinyJc4JucoaIkYeHdIZ7gpqNjoV5bm59g351eWNlZ3puXVh2Wldwa05XcXJmYEtsd3RhXlxbWnV+c3BYZ15nanJgb05XZ1I/WGZeWm9qZ3lxW1pYamVZY3B4X2dcXmVsZ2ZraXF3f4dvbH9+gHVwgnuAgn+Cf3aBhIiXiXGCjXF7hnx6eYSUjHVqeX5rb350f3xvcnt6k29ugX54Z5KLgqGZnJGChWaGgm9neZSIfX6EgpiKgXyOjWh4c2trZl9hb3htX2JveFxka4J5YXF1X2Vl1Oq9izI6PouOf3F5hYeNjXWClox+ko2Lfm1rhIyMdX2Pf4WBlIh8gndudoeEg5d3boiFbHV7dWZ5goOmi4KOi4R+boF2eIV8iZ+Sj5KTlI6Mh397koZ3foOMgmt/cWiAfnlufHyCi4R3YnqFgnJkcml+bnVydYKcjIGAhoB0dn+BdIJwXG6AdXmMhIt8iIF+iXl7cm2KhZKFjXSDeoCYjIuAdW1qdoB/dHNbZ2d1bldWfFNZb2RMWnJyZVtJcXhvXFtbWV11f3VpWmJbaGZvZGpNV2VQPV1lXF11ZWB0b1pZVW5jWWRxeVpoXWBnbWdpa2lwd32ObGmChH95boB8fYF/gnp1goGNk4RwgYtueH6Ae3uIk4l/aHp9anN7coZ6c3Z9fox5eIR9fGuLjYObnpaLgYBsjH1qaH6Ni3p9foOUgn59iohrdXFnaGJbYmdybl9ha3NgaHCIeWJzc15jZJugj25dNlqvtXRpgIh8kYZ1hZWFc46KiXZvbISChnR5iXiJfJKHeX5yZ3aJfn6Yb3GHf2l2eW5meYeEpIeAh4yKf2+Ad4KDgI+ciYSWk5mKjIWJfJCIcHp9hHtofmxqgHt6ant3goiBcmB3gX5yZHJndoNudXyGlpKCfYOBcHh6fHWAbVlwgHd1jYOHeIh2hIl8eXRvi4KSgodzgH5/lImKfG9uaW2BgXRtW2VkcW9QWnpOW25bT1tyb2RVS3N4aVdZWlphcYF1YV5dYGdkaWlmTllnTUBgY1tgdWBddWxXV1N0YFpkb3JXal5iaGtnbWxpcHd8kmtohIp9fG9+fnuBgIF6d4B/iouDcXyHb3J4g397iYyPg2l9e213eHaLdnx4f4KGf4N+fXpthIuHmKOMhIN7dYp4amyDh5B4fXqCkYCAfouDcHJwY2ZeWWdfcG9fYGdwZmpuiXRhdG9bYWRqdXqAv5ympMi4cYSCcpJ7d4WSgnOQi4dycm+De4NzdId0iHeTiHl5cGN3h3qAk2lyhHdnd3VjanyCh52BgH+Oj35zgHWHe4KVkoV7mI+WkIiCiXuJiWt4eX50Z3poa395dGl6d4CDfWhgeIh9a2t0aHyBaXaCjJKVf3x/gHF8d3x0gGNWeH5zdIuFgn2EcoiKeXlycYWDj4CAen9+d5CGhHdqcWhsh4Fxb1xmYHFsSWR1S11sVFNZcm5iUU90eGFSWFhdYXCCdF1iXGllZWRrZFBbcElDY2BbY29dXXhnVFdWdl5bZm5oVmteYWpnZW5uaXB3epJtaYiMeX1ye355goGBfHZ9g4iGg3B3hHJud4KCfoiLk39wgHt4eXqBjHSCeH+BgYKEeoB1b36Ki5ueh32FeXeFemd0hYuQeX5/e4iFhHeQgGdwbl9kXFhlWWxyYWBgcGxraIluYHNoWV5jbn93qdqpx4aHsnGId2+MdHqFjX95kol/dHN0fXd/cHF/bYR0k4V4dGtgeoJ5iY9mcoRwaHVuW219gJCTf4B4kZN+eXxuiniDk42Gd5iMk5CIhoV8f4VsdHZ+bGd2ZG17dm1qd3d/f3xhYniGeml1dWN+fGh1h4+Nln12gXdxgHt9boFaV3V/cHaFiH+Aem2Kh3V5bHaChIV/fX56fXSMgn50aHRlboqDbHJZaF1zZEZtbUtaYFdWVXdtYlBSdHZYUFZYXmByhHBeYWNtZWReb2NUXHFGQmVeXWVnXVt6YlFWXHRbW2drYFZqX2BvZmZrcGhwdniOdGuOjXV/dnh9d4GEgXt0fYOIh4NvcoB0cXV+hYGJjYp6dn94g3t8hod3h3x9gX2EgHt+cnV5i42gjIh5iHZ0gnhefYWXi3iGg3SFhoR4intibmxbYltbYVZpc2JgW2ducGaHcmFxZVdcYmt/fMrOh7mham1timxxg3F7g4l+epCEeXhzeHV0e2psdmOEdZGCdm9mX32CeoyKZXKCa2pxY1hseoWbiIKBcpaVd399b4pzhY2OinSZkJKJhouDe3l9cHBvfGZncWFteHFqbHF4fX16XWV6gHhqdnhmg3dodIiMjpZ+c4lrb36CeW99Xllzf250gYt8gm9wioByd2l4gYKBg3h/c3t1iH17c2dzYW6LgGtwVmlcdltHbWpNVlVdU1V7a2FPVHVyUFFUV15jdYZpXWBsamZjWm9hWGJvR0FnXGBlXlxWe11OVWVwWVtqaF1XZ2BfcmZrZ3FncHN3hnhulYt0f3p4fnmDiH91cn+HhY6DcHB8eHd2eoWFh4yGeXt/dIt9fYaEg4d/fn59hn58eXV4d5GTn36LfIptdX94Y4KGlYZzkYpvhYWBe4R1Y25qWV9bXF1UZ3NkYFhjcXJngHJia2RWWl9qf3i+rnuft25hc4Voc3pxeIGFen2Lfnd3cnZve3Zlam9hh3WOgHNqYl5+eXmLhGZxf2hra1pWb3eJo4GFf3CZk3KBenaEb4OElIp1l4qOiYWJhX14dHFuaHhfamxgbXZqZ2pseXd6dlpnfXx5ZnN+bYV1ZXWGjoaXgHGNaGt7hHVudmNdcX1sdX2Me4Jndoh+b3Jpd4B6gIF0fm17fIN7eHFmbGFtiX1rbFVpX3ZVSmlqTlJOZ0xYe2hhTlV1a0xQVFVfZ3aEZ15hcWhnYlhpXVxrZ0pEalliY1ZZVXlZTVZtallda2RcWWRiXnRmbGRxZ3JwdYF3cZmGdn9+d398hYd9dXOCiICVg25zeXt6dHOEhomJg3iBfXWPfnyFio2DgoR7foqDe3d8d3eanJd6iIKGaXZ8e2yDg5KAco6BcYaCf4OAcGZsZ1hdW1xbU2RwZF5XYnJ1aXVvZWViV1tbaH9wb3KAc4lkZHl9aXN1c3KBg3eAg3h2cnVtanpxYWdrZ4ZzjYNtZl1ffXB7iX9pbXhnamRVV3JvjKZ8hHt2lpF0fXR+fG9+fZOIeJt9iYeDh4N9dXBxbGd0XGxnXmx0ZGdmaXpve3JZZ4F3dWhwgXiCd2J3hot8lYJvjWtue4NyZ3RmYW56aHN4i3t+Y3eEd2tscnV8cnt7dX9of4CAeXdvZGZibYV7bGpVaGFvUkpoak9LTm9HXnpmYU1VdGRKT1NXYWt3f2ZdZ3RpZmBXZFdicFxLS2pXY2FVVFVyVktYdWRaX2tgW1pjZF92Z21icGl0b3J/dXSZgnd/gHiAf4aEenx1goR+l4VucnR8enVxhIWPgYB6i3ZzkH98gZWNgIWEfX2Mhnp+gHd7o6WKeYeFg2t0e3p1goCLem6Ec3mEfYKDdm9qaWVWXVtaWlNibmRbWGFze2pobWlgYlheWml/aWtwgGdsYGh5eGpyc3Ntg4B6f3x1dG16Z2l5al9lbmiBdo+EZ2VYYndqfod7b2pwZ2ZdVFhvZ42ndoB6fJCOenZxgHF1eHyTgnqXdoaEgIaIdmpydWdnbltsZF1tcl9oYWp5aHtsW26DcnRqcIF+enhhd4aFeZCFdIlycHqBc2Nyal1xeGVydIh8eWN0gXFnanl1c215eHZ5ZYR8gHl3cWRkY217fGpqVGdhZVNKa2ZPR1FqRWF4ZmFNU3JdSk5VWWVseHxmX25xamVdVmFVbm5WSlNnV2VdWE1Va1RJW3lfW19qXV1aYmVfeWhsYW9vdm5weHV6mH53f4F5gICHhnp4eYN+gZODcXR0fnp2dISIkX2BfJFrcpWAe4OfhX6HfYB+hoKAint3hKuef3qHh4JqcoB5dYB+gXRuhm59gHOKgGpwbmRkWV9aWVpUYmpnW1pfdYJpXm1sXGFXW1trgWVxdH1paVxrdnVnc3ZxbIR7fXx4dXJseWZpd2ZdZHNoeneSgWNjVGVwaIKFeHhnaWphV1ZZZ2OOp29+d4CLjntxcn9pe3F9j354kHOFfoCAhm5kdnJkZ2dcamFdb29baF9tdWV6aF10gG9ya3J8fnV2YnWGjHuJiIGBeXN1gHZicW5bcnRjcXOFfHVlc4BtYW17cGtqfHp2dGeHd3t6dnFlYmRtcn1palNnXVxUS3FiUEZWYEdjdmZhS1NvWEtNWFhoa3Z7ZWVucWdkW1ddWHdlVEpcYldnV1lIV2RPR2F4Wl1fbFpeXGJjXn5pamBvdHhtcG92g5h6coCAfH+JjIZ9dXWFeYeMfHN1dYF5enqBjI58foWJaXOWgXqKnH5+hXqBe399holzcY+ti3t7ho98ZXGHeXN8enVyboVse35sj3pjcG9iZV5lVllZV2Nma19dXHOFaFhxblteWFpba3picHd2bGFZbHNzZ3R1b2yDeH5/eHZtbnNkaHRlW2d1ZnZ2kXpfXVJmZ2uDgnR+YmRqXFRXXWJjjqRpeHODhpF5bnF8anpvf4l+dop0gnl9eYBpZHZtYGZfXmlfXXRrWWZdb29iemVcd3xrbm9weHl0dWVzhJOAiIOJe3dwc350Y3hlXHFxYnFygnx0Z3OBZV9ud2plaHp9dW9wg3Z0fXNyYl9mbW58ZGhTZldYU012XlBJWVdIYnRjYUlUbVNKTlpXamxyfGNtbXNjYlpaW2F3XFNLY11XaFNWRlhfTUZpdVheYGxbW19hYl2EaWhhbnh5bXBrdoGQeW2CfoCBk4iEgXZ0iHSMhnRxdnaBeH19foyQf36UfnB3lYN9mZJ5gIB4en1/dIiEdHGZoHp6foeUd2N0h3hyd3RrdG9+a3h8cJFzXnBvYGdibFRaWldoY21mXFxxiWVTcm5bWVhXX2t2ZGl1amldWW1zcGtzc3NphHx+fnp2bm1rZGlwY1tqcmR0do5zW1ZTZWFygH9ygl1iY11TWmBcY5GfZXFxhYSSdWxse29wcn1/fnOCeIF0e3p6ZGV1Z11iWWBnW152aFdiXXBpYXdhW3x2aWpyb3h0c3VpcYKWhId/hXd0a3F+b2d4WF1sbmNyc4B6dGdwflxgcHJiYGtzf21udn9zcXhrcGFcZWxsemBmUmVUV1FPdVpRT1hRSGNzYWBHVmpRSVFaVmtra31mbm9yYltaWFlscVdSUGZWVmhTVEVZW05IcXRYX2NsYlhgYGBdi2pjZG16eGxwaXV5h3trg32AhJp8g4R5fIhuj4dybnZ6fHSCgnyLj4KDmHR4gZOFgZ6JdYGAgnR/gnGIg3ZwoZZzeYWKhnpkdopubnpuZnhweWtydnONa151b2FnZWtSXVtVZ2Fsa1pccYxkT29uXFZXVGZpc2hidGVkXFhudGxvdXR4aoZ8f3uHdo9zY2RrbmBcbm1jc3iHa1pUVmNkeH19cYZdZF9jVFpfWWKVlWNtcIOFinRraXxwZ3V5dn5te3V2cHt/dV9mc2NbXVZhY1hhdGVVX2BtZGFxXV1+cGhpdHF0cXV3a22FlIKJfYdyc2dwf3J0cFRcZ2tmcnSAdnRjbXdWY3JsW19wZ35mbnh+c3Rzam1hWmRpandeZVNjVFVQU2xWUFZTUEdkcl9hRlhpT0lYVFduaWV9amx4bGJXXVVbdGRTUldoUVhmVFNHWVlPTXd2Wl9la2lZYWBdXo5uYmZreXZub2l2doB/bIOAfYeYe4CHgIl/a5OIcmZ0gHt1gIN9iY5/jJNyfIqRhIefhnt/ho10gYZzfoN2bqSLcoCMinZ2bHmLYGR7cGZ5c3hsbXJ3g2dkfG1jZmdoU19eVWdfa29bXm6NaE5pbWBVVlNuZnNrZXhlZFxYb3NscXp3cmyHe392m3p5a2FlbG1eYG9qZXF4fmdaVlhgbHh8e3CEX2NeZ1ZYX1djm4hia3CBh314bGx6bl14dG58a3Z0b3B8gXNYam5fWVxVYWJXZHBiU19iaWJibFphfmxmbHR2b213d2xpho2AinuJbnJmcn5udG5kW2FpaXB0gXRzX2ltU2VxZVZjb2R8ZHN4fXdscG1rYFlhZmd0XGRVYFVSTldkUU9bTk9IZG9cYkdZaU1KX0tZbWRgeWlufmVgVV9UXXVcU1JgZk5cYFVSSVtYUFl0dV1fZWtoWGJgWl6NcWNnanhxc25odnR7hHKCg3qIjn58iYiNeW6QiXRrc4F0f3+IhYeRhJaPeX2Mj4eRm4SAfI2Fc4CBc3R5c2+Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn5+fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpKSkpKSkpKSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2NjY2NjY2OjY2NjY2NjY2NjY2Njo6Pj4+Pjo6NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySk5OTk5OTk5OSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6NjYyMjIyMjI2NjY2NjY2NjY2Ojo6Ojo+Pj46Ojo2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJA+LjExMTEvb4eEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmY4C+u7u7u72zbWZnZ2dnZ21ubm5ub3JKLDAwLy8sSYWDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMjy0aHR0dHBpohYKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19bfsjExMTExrtnXl9fX19fZWdnZ2doaz0aHR0cHBg7g4GBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uRiYiIiIiIh42QkJCQkJCMh4eHh4eHiZKTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmMkpGRkZGRkImIiYmJiYmKioqKioqKhoODg4KCgoSKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l6ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GTk5OTk46SkpGJh46KkJKTj4iNjo6OhYqRkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2NjoyLi4uLi4uLjY2Njo6Ojo2NjY2NjY2Njo6NjY2NjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJGKho6JiY6IiZCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkYqEi42JkImLj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCQj42IjIiPh42Pj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhomMiI2Gj4+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2JjY2LjYuOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX1/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYWEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH9/gH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f4B/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaGhoWGhYSEhIWFhoaFhYWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj5COjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f35/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fX59f35/f35+fn9+f31+f39+fn59f39/gICAgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/f35/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/gH9/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX5+fn59fn9/fn9/f39/gIB/gH+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f39+f4CAgIB/f4CBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ1dHZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/f35+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaWhnbWdqZ2hlaGdjY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOT09UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5/f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3l2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4CAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZSUVFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6e3x+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT09PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1NTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgH+BbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT05MT1JOWXBwcnd4d3d0dHR3enx+fX5+fn5+fn5+fn9/gIGAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PUE5QT1BgcHByeHh2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+Af4CAgXNQUE5OUE1KS1BSUE5RQ0RCQUZRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQkFAQkE/Oz48Pj8/PDg5OTs7OkA6Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fyd3h5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgYJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo6Ozg4Ojg3Ojw5Nzg7Oz49Ozs6ODpAQEJCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF1c3VzcXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs8P0BBQkA9PDk8PTw5Nzk6Ojk4OTo6Nzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU5KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4B/gICAgIF/gIF/gYGBgFZMTlBQTlJRUFBRUU44PT89PDo9PkFAQT8+PkA/Pj07PDw+Pz08PTs6PD09PTw8PDw7PDo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXV1c3V4eXl8fX5+fn5+fn5/gH9+gICAf39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFCPz0/Q0NDQD48PT9APz89Oz49PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRUQ/PTs8QD46Ozo6OTc6PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUFAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fX5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/P0FBQUJBQD08PTs+Pjo6Ojw6ODk4ODo7PUA/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRkhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ2d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUA7QkNCQ0A/Pz9APT9APjw+QD89PT0/PT0+Q0Q/Ozw9PkA9PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbHBwcHF0dXZ5fHx9fHx+fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FCRENEQT9AQEA/PUA+PD0/P0BAQENAQD9AQD49PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkJDQEJEREJERUFCPkFCQkFCQD89QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8fHx8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAQUA+Oz48Pz08Oj49P0JCRUA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdFRUZGRkpOTUtKSUdHSEtMSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFFZW9wcXF0dnV4e3x7fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QERFRD88QUNEQj8+QT9BREVEQ1d1homKflhHSEpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFub3BxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+AgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSUhJR0hISUdGQkRGRERDQVV0h4mHh4aIgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDR0pKS0xMTEtMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e359fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gYCAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tLS0pLTUpLSEhGRkdGRVBshIeGhoaHh4iHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pz9ERkdERUdJS0lJR0hJR0lJSUpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3R2eHl7e3t8fH1/fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0tLS0tNTEtNTElGSlZsgYaFhISGhoaHiIaKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRURCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhHSUhLTE9OTlFOUV5ygYWEhIWFhoeIiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs8PD5BOzk5OT09Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQEJGSEtITEtOVGd7hISDgoOEhomKi4yLiomKi4yJVDo4NjU2NzY2NjQ2NzYzNDY4Ojg3NjU2NTY3Nzc3ODo3Nzg4Ojs3Njg4OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+f35/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIRUJANTc4OD06PURCREZGRFZ4hISCgoOChomKiomJioqKiouJioqBSDY3NjQ2ODg3NDU3ODQ2Nzc5OTc3Njc2NTo6Ozo6PDg5OTk5ODc3Ojo6ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PUFFXa3FydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEFAPDo1Nzk4OTc6QTk8RD9QfYSDg4SEhIaJioqIh4iIiYqKjIqJiYx6Pjo4ODs8PT45Ojs8ODk7OTo7Ojo5Ozo6Pj09Pzs7PD06Pjw6PDs8PD08Ojo8ODo6Ozo5OTk8Pzw9QUJESUlMS0pLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzs7PDo4OTk4OTk5OTo+PT8/Q3aEg4SFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUJBQUI+QENBQD89Pj5APz8/QD9APT0/Qj9BQT9BPz1BQUA/P0E8Pjw7Ojs6OTs/PTs7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQkFHSk5PTElHSzo4Ojs5Ojo8PDo6Ojw7PT5APz1hhYOEhIWEhomJiIeGhoaHiImKi4uKioqLiYtePkRHSUtKSkZHR0RGSEdFQ0FAQ0VDQ0BCQ0I/QERIRUNFREVFQUZFRkRGRkRAQj49QD49P0A+Pz8/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc5PTo8Oz49Pj47Pjw/P0M+Sn6DhIWGhoaIiYiIh4aGhoeJioqLjI2MjIuKiodXR0xMTUtOSUlLSElKSklGRERGR0ZEQ0ZHRUJISUtHSEdGR0dFS0pMSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0dnd6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAf3+AgH9PQT49P0RMS0BCQkE5Nzs+Ozw6PT8+Pzw/PkJBRT9ohIKFhYeIiImJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUpIS0dFR0hISUVFSUdGRUxMTUlKR0dISUpOTU9NTE5LSEdHR0VFQ0ZGRkZERUhIRkNBP0BMbXB0dXZ4eXl5fHx8fX1+fn9+fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDo7PDo9Pzw9PT9AQ0JIU36DhISFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExMTElISEZKSkVKSEdLSklKSEhHS0xOTExISElKTVBOT05NT0tJR0lKSElESUhIRkZHR0lHQ0JBQ1VvcXV3eHp7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af4B/f3+Af4CAgICAgICAgICAf39/VERBQUJHR0I/OD9AODo7Nzw9Ojw/PD0+QEJDQ0xthIOEhIWFhoeIiIiIiIeGiIiIiImJjIyLjIyMi4uLi15SUlBNTk1LSkdGQ0hLR0xKRktPTEtKSkxNTE9QTkhJS0xPUVFQUU9PSklKSk1LTEZHSEdGR0lGRUVCQEJCXHByd3h5enl5eXt6e3x+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgH9/f39VRUNFRUdHRUQ7P0E7PTw4Pz09PkBFRD5CRENGSnSGg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0tFRkZLT05PV1ZRUE9SU1JNU1RPTVNMUFNVV1JTUlBMSk1NTUxOR0dKRkZISkRERUVCRENjcXV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRUdHR0dIRj5AQj0/PTxBP0FBRFRLQkhJRklLeIaDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEs7O1FTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUVBOUlBQUVFLS0tHSEpIRUZJSUlISWpzdnl5enl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHRkZFPz9BQEVBQ0ZEQ0RLVlBKUFBOUFB5hoWHhoWGh4iIiIiIiIiIiIiIiIiIlJyMioqMfWGKi4uHbFtkVTpYWFhTUT9AVlVZXGRgVllicl5dVl1aVkVRWVpcWV9UWWdSVVZYVFRWU09PTUtMSklJTE1LT01UcHR2eHl4eHp5ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Afn9+fn5WSkpJSEdGRERCQT9ITElNUEtJSk9TUlFUVlVWVHWFhIWFhYWGh4iHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUldWVFpadYNZVX2QYVxYXV5XSVZeXltbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmJ0c3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0pJSUZCREBBOk9RUVdYUFBQUVJTUlZXV1dXbIGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpaWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllab3N0d3Z2dHd4eHt7fH19fX5/fn59fn19fX9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWlpSU1FPUVJRVVJVU1ZedXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVVNUXlpYV1dXemtYWlxcXlNQUE9JTk9XVlhaWmRxdHd2dHR2eHl5e3t8fX19fn99fX1+fX1+f39/f4CAf3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTT09RT1FWUVNSUlRjZHaAg4KDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JRUU5LUlVSTU9ZUU1OUVNVVU1RU1JQTkxLSENJR1JTVFldbXJ2d3V0dHd7enp7e318fX19fn19fX59fn9/f3+AgH99fX5+fn9/gIB+e3Zzd31+fmR1fWlxdGBkXV1bWVVRTEhMSWFsknRQUVNNUVJQU1tSU1JRUlVVYnN7fH6AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkJCQ0NBP0RQQ0NAQz5CSEdWQEhOTUddaVFIR09GREVGSEdIQkNIR0hKR0RBQUNATlBNUmR0dXZ1dHR2eXx7e3t7fX19fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxSUlBVWVNVUVFUUk9WYGtsc3Z6e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPj46Oj5APz4+PmpQS2FFRkhJRUI/R0xNR01RVUpCRT8+PD08PT0/PT9BQ0I/Pjw9Qj5JTUZVb3V1dnN0dnh7fHt9e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpPUE5LTFFSUVRWVVdRUVdWUFhbYl1hZ21tbG5qaGBucmltbHF1e3p9e3h6fHx4d3hkQkBAQTw6QkNBQUNBW1xPe05PT05LTE1PT1BMS0xXTklHQUE8OTc3NTk5PTs7Ozg5ODk/O0JHPlx0dXZ2dXZ3eXx8fH18fH19fn18fX19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PT15cWklHT1FRT01QUU5RUlRWWFNSWVROWVpbV1lcX15fZV9dXnF3a15gZ2t3b29sam9tbmxmYllHRkZIQkFGSEVFRkNMUU9hV1JYUVBTU1JVW09PUVZQTUlERj45OTY1ODc5Nzk6MzY1Nzk1PEI9ZnR1d3h3enl7fX18fHt8fX5+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtTVFNQUVVPTFJTVFdYU1RYUUxYWVlWWFhWWFldV1hYaHNrXVZgdGthYV9dZGBfXllVUE1PTkxJR0pLSUhGQ1BPU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU5OUducnV5eXp7e319fX18e318fX5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFdWVlNUVk9PVVZXWFlTVVRMS1NVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1NbZkpMUFJST01NTk1NTEpGUFBVWVNUT0pOT1VTVFxWUlVTUk5NTElISEY/Pj06Nzg3NjU5OTY3NjY1WHFxdHh6ent8fX19fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVFNWVFJYV1lZWVJVT0lHT1BPT01SSk9QT09OTk9UTE1JUFBTVFUyPFhNSUBRPWNgUVNRUE1QUE9OTk1QTlRSUFJMSUxLT1JQUVJSVFFST0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdWUVNGRkFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+NEA+am9hUlJRQEdUUU9QUFFOUU9QT0xKTExQUE5NUFFRTlFPSkxNTUtHRUVDQjs9PTw5PUc2Njc2RW5xdXd6e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZVWVlWUVFRT0A+Oz0/QEJBQ0BCRURBQEdIR0hGRkhKTUxER0NPUkM4RE1TXWdTUVNBR1VQT1FRUE1NTkxKTEtMTk9PUUxPTk1JTEtJS0tMS0dGRkVEPEFBPjtARTs8ODlUcnN1eXt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT89PUFAQj09RUhGREZGSUdKSkBGQUFARkdESU9IUVJhXFFQUk9TTk9PTExPTUtNTE1PTltWS01RT0dJSENJS0xMS0ZGRkU/QkM+PUJHP0I/QGRydXd7ent7fHt6end8eHl+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPzs+QUBAPkFFSkVDSEdJR0lFQkI/PjxCQEBHSkVNT2JlUE1PTVdLTE5LTE1NTExLTk5TZE1KTFJJSUlGQkpLTE1OSkdJRkJCQkA/RUZFSERMb3B2enl5e3t6fHp3c3h1eHx8eXpucXFtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTExJTVBNUE9IS0U/Qj05OTo6P0I/PEFCQUFERUdLRkRJSUdHSENDP0I+P0BAPUNFRExNUVRMSklNVEZJSUpMSUpLSUlMTU9QUVBLR0NLSENDS0tMTk9OSUpJR0NDQ0RJSk1MSVpzbnh5eHp6e3l8dnJwdXJ0eXl2eGpxb2tsbG50dG1zdntzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FqcWhlcUhLQ0ZHSEdKS0lKTERHQjw+PTo6OjtBQj89QkJDQ0hFSkxKRUlJRkdIQ0M7QUBCPkA/QkRESU1PR0hKR0hLREhJS01ISkxISUpMSk1dUkhJRE5HQkVMTE5OUE5LTUpLRkdHSk1OUk5NY25qd3Z3e3l7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByenRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0aGVwRkpDRkVGREVFRkVHQ0NAPTw9Ojs6O0FEQD9CQ0VFSUZKSkxGSUlHRkZEQjpBQ0M+P0NDQ0VHS01ISk5IREhFSUxOTUhJTEdGRklJTE5LSUhFT0lDR05NT01QTk5PTUtJSElPU1FSTlNnZ2Zyb3N4dnt6fGxoam9la3Btc3FmbWxoaWtsdG1vdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1mX3BHSkNFRURCQkFFQERCPj8+Ozs7Pjs9P0RCP0FDRkdLR0pJTEhHR0dGRUM/PURFQj5BQ0JDRUdISUdNUElFRkdLTk9LRkhJRkVDRElKSEtJR0hQS0RKTkxRTk9OT1BPSkpJTVJVVVJQWGVhYW1mcHJvcnl6Z2VoaGNpbGZxbGZsbWdpa2xzbXB3dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRURGQkFAQUQ8QkE+QT06Oj0/Oz4/QUI/QEJFR0pGSkdJR0ZGRkRDQkFBRUZDQkJCREVFR0dIRkxQTEhOSkpMS0lGSEVGRUNDSElIS0pHS1JOQ09PTlFQT09OT1BLS0tQVVdWVlRZYF9daWBuaW5ocnNiZWZmZGhoZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Fza2tzTUdHRUZBQkBERTxBQUBDPDg6PT46QD1AQ0BAQURGSUVIRkZIRkVFRENFQkRJRkNHRUFFR0VGRkdFSU1LSFFNSktISElFRkhIRUNJSUlLTUtQU05EUlNSUVNOUE1PUE1MTlNXVlhZVlheWl1kYGljamlna19kZWZjaGdna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEJCQkVFPEBDQkQ8Nzo+Pjs+O0FCPj8/Q0VHREZEREdFQ0VDREZGRkpFRUlHQkdIRkdGRUNGSkpHTUtMS0hKS0ZJSEpIRUtLTExOT1JUT0hUVVRRVFBSTU5RT01RV1pWWllXWl5aWGFgYWBeaGVjYGRlZ2dqaGhqZ2hubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3NzeU5ISEdJREJDSEU9QEVCRD04Oj4+PTw8QkI9QD5BQkZDRUNDR0NDRERGR0dHSUZISkhDSUhHSUdGREhLSUdLSE1LSktMSEtKTUtJTkxPTk9SVVZPTFZWVFFUUlJMT1FQT1RaWllcWlpcX19dX2NfXGJkbGNgZGdocoVoZ2pmam5ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1TElKSEpGQkRHRT1BR0REQDo8PkA/Pj9DQjxAPkFBR0NFRENIREVERkZHSEZIR0lLSkVKSEhKSEZGTEhISEpHTEtMTExJTUpNTk1PTFBQUlVWV09LVlZVU1NSUUxPUlJRVltbXV5bXV5gYGFgYmZdZGBmZ2BlaWpkc3NmamhmbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXdzZ3Rya3Fya3J3cHdKSktJS0dCRURFPEFGRERCOz8/QUBAQURBQEI+QUNIQkVERkdFSEVGRUlIRklISkxISEpKSUtKRkpLSElLSkdLS0xMSUlNS01OTk9MT1FSVVdWTU5UVlVTUlFQTU5UU1JXW15eX11eYGBhYmJgZGRlYmRpYmRpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXVzcHN3dHV1d3Z1dXVmcXNrcHFqcnZwd0pMTEtMR0NDQUU8QEVFREM9QUFDQkJDRUFDREFBRUdDR0dIRkVJRkNHSkdHSkZJTEhJSk1KTUxHS0lITEtOUUtSUExSTEpNTU5QUFBVT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmFjX2FmY2FiaG5oYmloaG14dm1oaW5vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2c3FxdXZ1c3d5d3V0dWNtdGtvcGpxdHF3TE1MTExHREFARD4+REVGQz9DQUVEREZDQkVHQ0JIRkJISklHSEpGREtKR0hKSElLR0pKTktOTElMSEpNSlpmSmRbSmxSR05NX25VbHNbcXBid2NSUGJ2dWh1Y2F2YVhucWJkdmltemZcbHRgbGtWYHd2aWpnaGZnbG1qbW9qbW9zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVycXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcnlMTkpLSkZCP0BCPzxEREZEQ0NDRUVERkJFRkdEREpFRUpMS0lLTEdHTklISktHS0pJSkpOTE1NTExJTU1MW3NiZHBdbGxVTE5lcl1nZXFsbnRncGlfYVlubWJwcGJrampnb3F0ZXRub1xwdmdwT0xyeXZrYWFrZWVseG1rdmxucHNycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3l2dHRibXVrcHBscnJye0tMSUhHRUQ/QUE/PUJFRkJFQ0VERUVEQ0hIR0RES0hHS01NSkxMRkpPSEpLSklLSkpJSk1NTk1NTUtOTU5bcnBvbnBwa2pMT1BtWE5pYnRycGFtb3ZcWWxQW21tWnFta3BseHh0c2lwXGBzbHFrVXV5eG9jXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHR0VFREJBQj0/P0VHQkdESEVFREJGSUhIRUdLSkdNTE5KTE1HTE5JTUtISU1JSklKSk5PTk5NTE5NTFxoZHVdbHFWa01PUW5VWmtea2x2YWxkdFRlY05sWWxcdG9samx4and1aHBdX3NraFdiY3d8b2NgZ2hhY2l0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Ryc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUZJRUVEQ0FCPEJAQkZDR0ZLR0VDQ0hLSEhGSUxLRk1LS1JSTEhNTUlOSklHTUdKSkhJTk9NTkxKTU1KWnRwcG9xcWxrT1FSbllza2dvb3Fxb210Xm5YYXRfbm9wb3Fzb291c3R0alpedGN3eHJqbnpoYWFjZmFiam10dXBzdXZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdG9uc3N2dElLSEpDRERFQEA+Q0NBRkNISU1IRkNGSkxJR0ZKTUxGT0pKV1JLR0xLS05JSUpMSUtKSUlLTE1NTElLS0pTa2JZaV5famNyclpfWWpvX2VlVWtfY1thYVFgbWhcalxuaWpkW29lZHBdWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW52cXJ1dHdySEhGSkRFQ0ZBQEFFRENGQkhKTEdGQ0ZLTElFRkpPTElPSkxbUUpGSElMTUlISkpLS0lISUdLS0tLR0hKSUtLTEpJS0xOVFtdVFBVTVFPTk9PVlFPUFFOT1FKSk5QUWRxaVRZVltbXFVZWl1YXVxcY2ZhYWZiY2ZfXmZrbWhtdHlydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNIQ0VHRkZARUM/Q0dERkdDSUtMR0ZER0pMSERHSVBLTE9LTFdNSUZFSEpKSElLSExKSUdISEpISEhFRktISEpOS0hPXFdeT1xcYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXGFYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydFBCQ0RMTUFDQ0JESUVHR0ZLSktIRUVKSkpGRUhIUEpMTUpNUklIRUFIRkpJS0tJTEpJR0ZKSEVGR0VFSkZCSUxJSlNfWWBYYGFbYFVYWlRdXlpfUllcUF5cWU5fXF5TW15kXlpdYGNfWV9iW2BeW1VZWVpfXmNjYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3V5enp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRENBQ0ZHRUdHSUpKSUlERktLS0VGSUlOSk5MSExOR0hGPkhHTElLS0pLS0lHRUlGQ0RFQkZKRD9JS0hOWmJZXl5hX1JUU1dfX1xdWV5RWVxNVl9XS1FZW1FbX2JhXV5jYWBiYWJjY2VaUlpXV11aXWRgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhZUUpGREdFQkRISEZHSElGR0pHSEZIS0lLRERKSk1NTExISkpISkdAR0ZOS0tLTUtLS0lHSUVFQERBSElBPkhJRk9dYFpbZF1fVFFSWF1cXFxfW0tXXExSXFlJTV5RUV1fYmNjY2NiXGRiYWRjZlhSV1VUXFhbYV9eX2FhX2Rsa21qa2xudn51gXp8hIWFhYWFhYaGhoaFhYaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUNASUZDRUtJRkdHSUdHSkdGRklMSk5FQ0pKTE5KTElLS0lJR0NISFFNS0tPTUtLSUhIRkU/RUJISEFARkVDU11ZXlhfWF9bXVVYWE9dXFFLSlZeWF5bXVZaYVJSX19iYmBgYmJfY2JhZGRhWFBSUlNcU1xdXV5eX19fZGlnbGtubnB7e3x+e4CCg4SFhYWFhYWEhIWDhIWHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIRFJLRkhISERGS0lNUEVHSUpLTkxMSkxMSklHREhLUU9NTFBNTUtMSUpERUFFQ0hGQUFGQ0FVVUVcVF5TV2BYTlRVTVlaTEpLVGBhW19YX15iXU9ZYlxgYF9iY2FdYmFXYF9VUVBRUllTXlxbXV1eYGJmZmZsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZIRElTY1FFV19JR0dIREZNSlBQRklJSktOTExLTUxKSkdFSk5RUU5OUE1OTU5JTEJFQUNDRkNCQENEP0xHQ0xMUE9PTUZNRkZISUdGTEtNT1BJTE9QUFNQTFFUU1VaWFdZV1djVk5SVFBRUE9RVlRcWVlbXVxhYWVmZGhkbG1xc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES05eTUhIWU1HSEpIR01MUVFJS0pLS05NVU5PS0tMR0dLUFNTTlBQTk9PT0lMRmFFRF5MRGZiQ0xaR15cc21PTVZuWUtDUF9Ua1ZnSl1YVV5ETFFVTE1TVlFSVFhWVFhUVFxUT2VaaGhlWlVrVFhXVVtcW2BgYWJiY2FnaWdubGhzenx9foGEhISDg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVMUFRKS0dgVEhKT0pJT01SUUtNS0xPUlVST1BKTE5HSE1RW1lPUFBOUFFQSktRf1FJfFlZcnNXUG1HcW5vYVZQcXF0T0Jrc21xc3BTb19bblhdVlxYVWtoVV1WY1lgWVpeVVVXf2l0dXVgYXZfWWJcXGZbX2FhYWJfYWNnbW9tYHB3dHiBgYKDhIJ/fX6Adnh6bXZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0pMRlJWTEtPSExSWFdRTk9PTVFUTk9RUExMT0dNUFNbWlRRUk9QUFFMSVp4XVR4ZGhYUlNQdmZ0bHBibmZrUnJOTHdtanJwc3JxcnBvb4BdZXp1eHFxenF+cn1rdX1hUmh8ZXNzcHNzfH1wfnhvf3JgYGBiYltiYWhsbmtibGZnbXd+gYCDfnt4d4B0dnppcX5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FETU1IS0tIS1BPTU5KTlZeWVVMUVNOWVlMU1NTTkxQSVFSVFlXV1BUUFBQU0xIZ3hsY3hxbVpKS1R5cHVtdWJudlBkZEhldnFtd2+AamZ4eGlXclFoem1panp6fmx4en9waG5YdXVqdnVxgWFzaH1pbHh8b19fX2NiXF9jZWdqamVnYmNkbG1wcHN0c3NzeXFyeGJtdGdyeXtzc3V5foFzdnpufH15eHJuTUpSdE5DQkVQUUhLTEpMUU9PT01QWmBaWEtTV1BhXlJWUVlTTVBKU1RWWFdXT1VQT05SS0xyb3V1cXVxY2hgVW5LcXBeR2h5V3ZUS2h4fXdgeXtzbmFdbW9kU2dydW5teXB3a3VzdHFsbVxzfnprbXl8bHVufGtxd3V4Xl9fYl9eYGVkaWdoZmVeYmJpaWlqa25va3FubWpwYWNmY293eG9tcHN5f25xcGp7enRyb21LS1pWSEdFR1JRS01OTExRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTkpUVFdXWVdPU09PTlJJUm1IaXdLYGR2dlRWbE5ubHtyYWpnf3VUS1drZ3xsbWx4X1pwentfYHpzY3JveHFnY3xpcntdVEtsX3Z1bGp2fHtuf3lsfHBdXl5iW19jZWVnZmVlY1tjY2lra3JzcndnbWloZGdgYWxhZ3NybGdsbXJ8a21oa3t0bW1rbU9HSktISkhIUlFNT1BMTFNTUk9TUlhSV1RQV1pWVlRUVGFgUU9OS1RTU1FWVk9PTU5PUUtIUU5QVUxLS1JTUlFST1ZVUVFPUlJYWFBNT1VUV1hYW1tVUVJXW1dYV1tPUlRXV1hRXVhWXFVUT1hSV1dYWVpgXGhzX1xbW11dX2NaX2RkZWdkZGRjWmRiZ2ZmbW5tdWZmZ2NgZl5dZ2BkbGhmZ2tocHpoZ2drdWpoZ2lsUElLS0xNS0pUUk5SUVBMVlZUUFRVWFVaVVJaXVVVVFdVWVhPT0xOV1RQTlVTTlBOTFFQS0lRUUtRTUpKT1FUUVBRU1JKSE1PUFFSUFBQVFVSWFdcV1NTUFFVVVZTWlFOUlJXVFJYVVNYVFNRVVNVVVlZWF5aX2FdXFtaXFxgY1xeYmNkZ2VlZWNaYGFkYWJoaGpuY2FkXl9jXVpjXGJtYV5mZmdtc2RpaGtrZWRjZ2hRSktLTk9MTVRRT1RRUk1YV1VUVlhXV1pWU1xgVldWWVVYVFFQS09YU1BOVVBOUU9MU1BNT1VTTlFOTU5RU1BUUFFUVE5LTU9SVFRRUVFVV1VZWltZUlVSVFhXVllcU09TVFdUU1lUVlhUUlFXVlZYXFpcYF1XWV9dXl1cXWFhXltiY2NoZ2ZkY1hgYGJeYGhlZ2VhXl9dXV5aWl9aX2dgXl5dY2hrYWhmaGZkYGJkYlBLTUxQUUxQVVBQVFFPUVpZWFdZWlpYWFZdamRWWFlaV1ZTVE9LT1ZUUE9UUFBRT01SUU9SWFRRUU9NT1JUTVdRU1RVT05OUVRWVVJSUlRYVlpdXFpWVlFSV1hVW1tWUFNVVVVVWFNXWFRSUVhWVltfW15gX1ZfXV5gXVxgX19fWmNjZWhoZWViWWJgYl5fZmRjYGJdXFxcXFlaW1hbYVteXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9WXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NV1NNTVJPUlNPTVBTUlVbVVRQUExQV1VQVlFSUlhNT1BSVVhVVFRTVFlYW15dXFtWUk9VV1VbWlZRU1ZUVVdVU1haU1JRWldXXV9bYGBgVmJcYGFdYGJfXGBdY2FjaGllZ2FaY2BhX19lZV9gY1taXFtcWlpZWVdcWlxaYF5fW15eYWBfY1xZYFpRTk9OVlFQVVNQVVVTUFdcXFxZXl1fV1xeanB3eYBjXFtWVllSTlBXU05RUVBSVFJMUlRUWVtXVU9STlNYVVNRUlBSWk9RU1RWW1ZWVlNWWlhdXlxcXlZTTlRWVltbVVFUVVVXWFJTWVtTUlJcWFpeX11iYWBXYltjYl5hY19cYmFiX2RnaWVnXlxkYGFgYWNkX2JfWVpfW1xbWFhZV1daWlphXV1bXVxcWl1gV1tbWlBPT09ZUFVVU1JXUlRQW11eXVxgXGBVXFxoanJ9c2xoXFVZV1FPU1tTUlFTUlVVVUtSV1ZaWlpTT1NRVVVUUk1UUFJaUlRVVFhdV1hYU1hcWF5dWVpdVVVOVlZXXlpXUVRVV1hYU1ZZW1RSVl1ZXV5hXmNjX1lgW2ViX2RkXl5jY2FeZWZpZWdfXmRhYWFiY2RfYl5YW19bXFtYWFhYV1taW2BdW1tcW1haW15WXlldUE9PUltQWlVWV1ZTVFReXmBfXmJcYFVdXmJreXVtfWxaVVpWUVFUXFRUVFZUVllXTFJaVlxbXFJQVVNXVVVST1ZQU1hTV1VWW15YW1lVWl5YX15ZXFlSV1JZWFlfWVlSVFVZWVlVV1lbVVRaXV1eYWJgZWRdXl1dZWFiZmReX2RjYFxnZWhmZWJgZWFfYWFiYl9gXlZZXlpcXFpZWVdWXVpdXltaW1xbV1lcXVZYV11TT1BXWVFdVVdZV1dVWF9gYWFgY11gVV1eYmVldoJ7aFhZWlRWVFZcWFdXVldXXVhPVVxZXl1dVFNYUlZVU1FSV1FTVlRYWFheXlhdW1VdX1hfX1hcVlFYVFpaWmFYW1RWV1pZWldYWVlXVl1eYF9kY2JmZV5iXGBmYmRmZF9gZGJhW2ZjaGZkZmFmX19iYmFhYF9eVlVdWltcW1lcWVldW1tbWFhZW1paWl1fXVRZXVVOVFpWVFxVV1dZV1ZcYGFiY2FjX19WW2BkYV96dW9oWlxaVlhWWFtaWVtZWFlgVk9VXVtgYVxVVVlQVFZUUlVVUVRVV1tbXF9fWl9cVl9fWV1eWV1WUlhXWllcYlldVVZaW1pbWlpYWlhZX19gYGRjZGVlY2RaYmZjZ2ZlXmFiYGNdYmNpZWRnYGheYmJjYWFgXl9ZVFtaWltbWFxYWFxbWltXV1pYWFxbXGBdVl1dU09WWlZWWlZZVlhXWF5gYmFkYWRhXllZYWRiYGtmaF5cXVtXWFlaXFxcX1taW2JWU1deXWFjXFNWWVBWVVVVVVVTVVRYXV1fYGBdYV1XYV5bXlxbXlhVWFdbWl9fW15XWFxcXF1dW1pcV1pfYV5gZGRlZmZnY1ljZmVoZ2ReY2BfZWNdZmlkZWlgZ15jYmNhYWBfX1xYWVtZWllZWlhXW1taW1dYWlRaXVxbYFxVXmJNUldaV1daWVtcWFdZXmBiYWRhZGFdXllhY2JfYWBhX1xdXVhXW1tdXV9fXFpdY1hZWF1gY2RfUlhZUFdVV1hXVlZXVl1dXmFiYV9iXllhXV1eWV1dWVhVVltbYF5dX1lZXl1eXmBcWlpZW19iX2NmZGZnZmhjWmVmZ2lnY19jXmFmZVppaWNmamRmX2JiY2FgYF9dXVpXW1lZWFhaWVdaW1pZV1hWVVxdXV1gYGJieEtXV1xZV11cXF1aV1xdX2BiZGJjYV1gWGJjYmBjYWNeXF1cWFdbXV9dYF9dW2BkXFxYWmJlY2FSXFlPWFZZW1lZV1laYF5hYmNgYWNfXGJdX11bXl1ZWVRYXVxfX15fW1peXmBiYltbV1tdYGJiZGZkZ2ZmaGVdZWdoaWZjYWJbY2dgXGlpY2hqZ2VgYmFjYV9gX11dXFlcWVhXWFlZV1xbWldWWFBYWl1hY2Zmcmt/SllXXVtaX11cXlxZXVteX2JjYmFhXWJbYmRiYGNiYl1dW1pXWGpxYFxgX11cYWNfXllZY2VkYlRfWlFZV1xdXFtZW1tjYGNjY2BiZGFgY15gXF5eXlpYVVteXFxhYV9dW2BhYmZiXltTXF9gY2RkZmVnZmZnZl9mZ2hoZ2RkYFtlZ15haGhjaGlnZGBiYGNiX19fXV1bWltZWFhYVlpWXFtaVlZVTFhYXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIh4mHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXp7e3p6e3p6enp6enp6ent7e3t6ent7e3t7e3t8fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnV2dnZ2dXZ2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5enp6e3t6enp6enp6enp7e3p7enp6ent7e3t7fHx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4ODgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHaIi4uLi4uLgX19fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT08/ExcXFxcXH0tTU1NPT08S+vr6+vsKiioyMjIyNiX5/f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19doyQj4+Pj5CDfn9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OTl4NTU1NTU1Nbj5eXl5eTl0svMzczN0KqNkJCQkJKLf39/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12eHh4eHh4eHd3d3d3d3d4eXl6enl5d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4ODgoKDg4OCg4SEhISEg4OCgoODg4KDgHx8fX19fX18fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnV1dXh2dnZ6e3h7eHd2eHx6eXl6fnx5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXp7e3t7fHx7fHx8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3Z6fXl7e3l8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3dnp+enl7eHt6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3eHl8enx3fHl4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt4enp6fXx6fHh8eHh4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoGAgICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl7eXl6eXl4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eXl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl5eXl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm94eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoKBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3x8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx9fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLioqLh4eHhIOCgYGBgYGBgYKBgoKBgYGAgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eEhYKBgYGBgYGBgoGCgoGBgYCBgoGBgYKCgoKCgYCAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4iNiYiJhoSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGAgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgYKCgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgoGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEg4OCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDhIKCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYCBgoGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKDgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqMiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGBgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fXx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1/gIGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiLi4mKhoaDgoKCgYGBgoGCgYKBgYGBgoOCgYCBgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiIaHiYyLi4qGhYOCgoKBgYGCgoOCgoKBgIGBgoKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f39+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+Kh4iKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39/f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoOEg4KCh5KTkIuKiouPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGBgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKCgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4OBgYKEhIKDgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoGCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKChIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhISEhYWDg4KBgoOBgIKDgYOFhYWFhoaHhoaGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhIWFhIWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqHgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgoKCgoGBgoKBgX+AgYOCgICAf4CCgoKDg4KCgYODg4SEg4KDhYOCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOkI6QkY+LiYeCgoKCgoKBgYGBgoKCgoGBgYGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDg4OCg4SFhISFhYSDgoSFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiIeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICBgYCAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGCgoGAgYOCgoGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiIeEgoKCgoKCgoGBgIGCgoKCgoKCgoGBgYGBgYGBgICAgYGAgoSDg4KDgoKCgYKDg4iHh4eHhYSCgX5+gICAfn5+f4CBgYGCgYCCgoGCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkZCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYmHhYSDgYKEhIOBgYGCgoOCgoOEgoOEhYWEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKRkZGOjYyHhYODg4GCgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIOEhISDgoGDgoOFhYODg4SDhIODhYSFhISEgYGAgYKDgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgoKCgoSEhYSFhYaFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5OSj4yMioWEhIODgYKCg4KCgoKBgYGCg4KBgoKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAgIKBgYCBgYCAgoGCgoKBgYKCgYCBgoKCgoKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYGCg4ODg4SFhIWFhIOEhYWGhYWFhISEhIOEhIWFhYWFhIODhIOEg4KGlJSSlJKPjYuHhISDg4KBgoODgoKDg4GBgoKCgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGh4eGhoWGg4ODg4GAgoKCgYKAf35/f4CAf4B/gIGAgH+BgYGBg4GAgYGChIOBgYGBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhYWCg4KDgoKDg4OBgICAgICAgYCAg4KCg4GBgoKDg4OEgoODg4KAgICCgoKDgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoOEg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SFhYKBgoOCgoSCgYKGhYSEg4OEhISGhYSEhYJ/fX19foKEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSEhYWFhYSFhoWGhYWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyLiIWFhYWCgoGBgoODg4OCg4KBgYKDg4ODgoKBgIGAgICAgYCAgH+AgICAhYWFhYWGh4eGhYWFhISFhYSEhISEg4SDg4OEhYOCg4SFhYaFhoaFhoeHhoOBfn9+fn5+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhYWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgoKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODg4WFhYWHh4WFh4WBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaGhoaGhYSDhIWFhYSFhYaGh4eHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDg4SEhIWEg4KCg4OEg4OChIWEhYeHhYSCgH9/f39/gH9/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eIiIaHhoeIhoeFhIOEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf3+AgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4eFg4OFhIODg4KEhISEhYSBgIGCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiouLiomIiIeIiIiHh4iHh4iGh4aEg4OFh4eHhoWFhISEhYWEhYWGhISEhYWFhoWGhYOJlJOQjpGOioaFhoWDgYGBgYKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4ODhImKh4eEhIWEg4OEg4WEg4OCgYKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGh4SDgoWIiIiHh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCg4OFiYqJh4WHhYSFhYSDhYSDgoKCgoKDgX59fn5+fn5+fX1+fX19g4eJioqHh4WGh4eHh4iHh4mGiIaIh4eJiISDhIOFhISFhYaIh4aFg4KChIWHhoeGhoOCgoOEgoOEhIKBgYGBgYODhIOEkZKRjo+Ni4eEhoaDgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf3+AgIB/hYaGhYaGhoeHiIeGgYKEhIODhYaIi4qGhYaEgoaGgoCDg4ODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYODhIWFhYODhYSEhISFhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDhISFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICEhIWEhYWFh4eHh4aAgYGFg4OFhYSHiIWDgYCAgX9+fYKDg4ODgoKAfX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOBgoGCgoKBg4OAf4CAgYOCgICAgIGBgYGCgYGChIODhYSCgoSDgoKBgoSDhYWGjJORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDg39+fn9+fHx/g4OCg4KDgX59fn+AgIGAfn19fX1+fXx6enp/goKAf39/f35/gIB+fYB/f4CAgX+AgIGAf3+BgX99fX+AgX9/fn+AgH+AgICBf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIF/fH19fn19foCAfn1+fXx9foKDg4KCgYF/fX1+foCAgH9+fX19fHt7e3p6eXqAgH9+f35+fnx+f35/gH9+f3+Af4CAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEhIKCgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fn6Af4B/foB9fX+BhIOCgYB/f359fn5/gICAfn19fX17e3x6enl5eXt/f35/f39+fX5/f4CAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/f4B/f39/foCAf36Af39+fn5/f35+f318fH2FkpKNjIuKiImIhIWEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgH9/foCBhIOCgYGDhISDhICBgYCBgIGAgYKCg4GAgX+AgoODgYGBgYCAfn19fn5+f359fX19fXx8fHt6eXl5eX2Af4CBgYF/f4GAf4F/gICAgYGCgoB+gH5/fn5+foGBgoF/f39/gIB/f4B/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioiHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f39/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISDgYOCg4KCgoGCgX9+fX19fn6AfX19fX19fX18e3p6eXl5eYCCgoOFg4CBg4GAgoCBgYGDgoKDgYGCf4GAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgIGBgYGAf39/f4CAgIB/gIGBf359fn5/f39+g4aHh4iChoSFhISFhIWGhYaGhoWFhoGAg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIODhIWCgYSDgoKDhYaCg4SDgYKCg4OBg4KCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgIGBgIF/gIGAf36Ok4yHiIeIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/f39/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aGh4eHhoeHf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIKDf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYWEhYOCg4OCg4OCgoKCg4OCgpKQi4iIh4iHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CBgH9/fn1/fn+Bf4CCgYWFhYaGh4eGh4eIhoeHh4aGiId/fH18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZeEg4OEhJSTgIGBf39/fn6Ei4B/gICEhpCJhYSBgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOEhISIko6LiYiIioeIh4WGhYSFhIKBgoKDg4ODg4OCgYGBgICAgIGAgIB/f39/f4CAgICAgIGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhISGhX98fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fH+Cg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SDgYONiX99f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4uKioyKiYqHhYaFg4OCgYKCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCg4SDgoOCgoWGhISFhYSGhIOEg4KBgYOBf319fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yAenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYKEkZGNi4yMjoqJiYaFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgoKDhYOEhYWFhYODg4SCgYODgoOCgoGAgIB/gX5/fn59fHx8fHx8fHx8fHx8fHx9fHx8fn6Kgnt6e3p4ent7fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+f36Agnx8gH+CgIGAfn17ioJ9gH9+gYCAgYKBgoCAgIGAf4uTj4uLjY6MiIeIhYWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIGBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7e3p8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfX19e319fX19fHx9gH+AgH6Afn6Ck5GLjIyNj4qFhoaFhISFg4ODgoODg4OCgoGBgYGAgICBgICAgICAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKDhoeGhn6IlYp+gYGAgIB/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dh399fH6AgIGAf39+fX19fX57fH1/f3+AfX9+gIyRjYuNjo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgICBgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KEhoaFf3+FgX5/gIB/gH5+f31/gIB/gIB/f319fHx9fn18fX19fX19fH58fXx7fXx8ent6fH19f4aEgoCAgX1+fX5/foyEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fX1/f399foB+fn6EkoyMi46Ni4qGhIaEhIODg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B7fn18fn6AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx7fHp9fn+Ag4OCf35/fH18fXx9gYN+jH58e3t9fn1+fn17e3t9e3p7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIqPjIqKjIuKiISEhIOEg4ODgoKCgoKCgoKBgYGAgoGBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf35/f31+f39/foB/f39/f3+AgIGBgH99gH9/fn9+fn9/f3yCfn59fX17e319fHp8fH6AgoF/gIB8fH18fHx8fH18fXt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBgoGFhoWFhoaHhoKEkI6MiomKhoeFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/fn5/gH9/f39/f3+AgoKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn1/fnx8fHx8fHx+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7e317fX5+f4CAg4eJiYmKiYuJhYiQjYuIiIaFhYOCgoOEhIODgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gX9/f39/gIB/fn5+fX+AgH9/f3+Af4CDg4B/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX19fX18fXx9fX1+fH17fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6ChYiHiIuLi4qJjJCNjImHhoWEg4KCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn9/gH+AgIB/fn9+gIF/f4CAgIGAgoSDgYCAgYGAgX+AgYGBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIOEiImKiImNj4yKh4iFhISDgYKCgoKDgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eXx6f3KBfXt7fHx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX1+fX5/fX19e3x9fnx8e3x9enp5eXp5e3t+foGBg4eEiI2MiomFhYSEg4KCgoKCgoKBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4foKAgYKCgICBgIGBgICBgoKCgoaFhIGBgYGBg4F/gIKEgX9+gYB9foF+fX9/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn2Ag3+IjImKh4WFhYSDgoKCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYSBfn6AgH1+gH59fn6AgH+Bfn+Af39/gH99fn9/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIF9fHx9fXx8e3x8e3t7fHt8fHx9fIiJh4eFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57enp8fHt2e3R3f352cnt+fnt4dXd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6BgX98fn59fX17fH58fXx8fHt8e3x9iIaGhIWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen19eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfX6Af4GAf4CAgH9+fX19fn1+fn19gYR/gH9+f4GBf32Af319fn1+fn1+fHt8enx7eoCFgoOEhYSEhIWDgoKBgYKBgICCgoOCgoOEg4SDg4KCgYKBgYOAf4CBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXR1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAg4F/f4B+gIF+gIGAgH9+fn5+fn1/fn6FhYCBgH+Ag4F/foGAf36AfoB/fn17ent6fHt6goN/goKCgoOCg4KBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgoB+gIF/fn1+fn5+fX59fXp7fIWEe3tyeXt8cHd1dnd5dnR6hISBhISDhIWFhoSDg4WEgoODgoCBf4B/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GEgX+Ag4F/f4B/gX+Af3x7e3p8e3yBgH+Bf3+BgYGCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKEhIKEhYWGhISChIOBg4KAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+BgH9+f4B/gIODg4B/f4GBgIKBgYGAgIGAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fX99f4B8f39+fYGAgH59fYB/foGBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn59f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGCg4KBgX9/g4B+goKEgICCgYKChIJ+e3t8fHx9fX1+fXp+fX55fn9/fHx8fn1+gYCBgYGAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYSChISFhIOCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+fn19fYB/gIGBgX9+fH6Afn9/gYJ/gYGCg4eFgYB/fn6Af4CBgICAgIGCgYCAfoCCf3+BgoKBgYOCg4OFgn99fX18e3x8eXp7en55fHl4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3d2c3SGhISFg4KDhISDg4KCg4GCgoGAgYF8gIB+gH1+fX5/gICAf35/f3x+f3+BgIGAf359f39+fn+BgH2AgIGDhIN/f359fn5+f4B/gIB/gYKBgH9+gIF+f4CCgoCBhIKEhYaDgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWDg4ODgoOCgYKDgoGDgn+BgH9/fn+AfX19fH+AgIB/f39/fIB/f4GAgYCAf32Af35+fn9/fX5+gYKCgn5/fn1+fn5+f3+Af32AgYB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foZ9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnF4eXJ4hYWFhYOEhIKCg4KBgYKBgIOBgIB/fn5+foB+fX58f4CAgH+AgX97gH6AgH+BgIB/fYB/fn5/f319fX6AgYKBfn9+fn59fX1/fn9+fH6Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fXt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgoCAgIB9fn5/gH18fn1/gIGAf3+BgHyAf4B+f4GAf399gH9+f39+fX18gICAgIB+f35+fn18fn9/f358fYB/fn1+gIJ/foCAf36Bg4KChIWFgoJ+fX17e3x8end7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNweHdxe4WGhYWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAf4GAfX6Af35/gX+Af3+BgH+Af31+fH1/gICAgH9/f39+fXx+f39/f319f399fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eXt6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYeEhYOEgoGDgoKCgYGCgYKBgYGAf4B/f399fX9+f4CBgYF/goF9foF+fn+Af4B/gIKAgIB+fX58f3+BgYCAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYR9dHx9enp6enx5eXp6hoV3eXx8fHx8fXx8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoGBgYCAgICAgH59gH+Af4GCgn+Cgn+AgX5/gYB/gICAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/f4B/f39/gH+AgICAgH+AgYGBgYGCgYCAf39/fn1/fnqBkot6fH18e315e3p6eHmBgXh5e3x8fXx8fHx8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWHg4OCg4KAgYCCgoGAgYGBgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+Agn+AgICAf3+AgH9/fX6Afn2AgH9/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiHx8fnt7fnl6e3p7jX53d3l7fHt9fHx8fHt9fH18fX18fXx+fn5/f358enx9e319e3l6e3p5eHN0dW5zcXB4cnV6hYaDg4KDgoCAgIGCgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359f4B+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICAgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4GEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af35/f4CAgH+AgH+AgYGAgICAgIGAgYGBgoGAgYCAgH9/gH5/fX59fn57fXx9fHx8d3h1eHh5e3x8fXt8fHx8fX5/f39/fn19foB/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgYODgH+CgYWDg4SBgYOBgoKBgYCAgIKDgoCCgoWDf4CAfoKDgYCBgICAf4CAf4GBgIKAf4CCgH9+gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoKCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX54d3Z5eXl8fXx8fHt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIKBhoODg4GChICEg4KCgICCgoSBgYKChIJ/gIB/gYOCgYCBgYCAf4GBgYGAg4F+gIOCf31/goGAgIB+gYCBf4CAgYGBgYCAgIKBgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9gHp5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBg4GCgoGCgX6BgICCgYKCgYKBgIGAgICBgoGEgH6Bg4J/foCDgoCBfoCCg4KAgYGBg4KDgoGBg4KChIGAgYOBgYKEg4OEhIODhIODgoGBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+fn+BgYCAgIGBgYOEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChIaEgoODg4SBhISAg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX9/gYSEgYN/goKBg4KCgoGEg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7fHp6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoKFhISDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYKBgICChIODgoGCgoGDgoKDg4ODg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gH9/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH92dH2Hh4OChIWDg4SFhICChIWEhIOCg4SEgISFg4KCgoODgoOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBgoGAgYOFhIOCg4CCgoOCg4ODg4OEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e31/fX9/fHx6fH59fX19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3V2f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoOBfoCAgoKDgoODg4SCgYKCg4OCg4GCgYGDgX+BhISDg4KEf4KEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4SEhISEhIWEg4OEhYSEhIOBgoB9gYKAfXx8e3x8gH19foB+fn1/fnx8fX19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfHyBgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYKEhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgoOBf4GDg4ODgoOAgoWDg4ODhIODhIOBgoSEhYOCgoODg4GEg4GDg4SEhISFhYSEhIWFhYWEg4ODf32BhH99fXx8fHx/gX59fn9/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYGBg4SFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSBf4GDf35+fH59fX+BgH9+fHx+f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOFhIKEg4aAgoWFiomEhIOEhYWDh4aGhISEhIWEhYSEg4SEgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOEgX2BdYF6g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4N7hYOAhIOBf359fn19goOBfXt/fX6Afn17fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIaEgYOEhYOEhoSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKEdXNxg4Z0cHVyc3SDdnt9dYF/goOBgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHOCg3+Dg32BfX1+fX6Cg4F8f4F9f4B9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFg4KFhoSFhYODg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnp5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26AiHltfXJzdnN2bW14bHB5bHV9f359foGAgX2Afn2Af4B/fX18fH19fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIeEg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gYB/fH99fIF+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBf4B+fn+BgH9/goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeFhoaLioWEhoeHhYSFhYWEgoWFhYWGhYWGhYZxdXByc29zenl+g3SIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIGBgIGBgH1/f4F+gH59foGAfn6BgoCAgYSHhoODhoSEhYaHhoWFhYWGhoiFhIaFh4aFhoSGhomIhYSJioiFhIaGhYWDhYWEhYaGhoaFg3iLeXKIentwcIWFeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x0cG96bHN8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWGhoaFhIWFhYWFhomJh4WEhoWGhoWGhoSGhoeGhoWGh4eHhoaEhoWGh4iHhYeGhoOGhoWFg4SGhoWGhIaEg4SEhoSEgYSDhISFhIWEhYSGg4aHhYaEhIWHhoSEhYWEhX13hYSEhIOCgX1/fnt8e357fHx9f359fH5+gIB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHh4WFhYWGhoeIhoSGhYaGhYWDhYWGhYSGhoaGhYWGhIWGhoaGhYaGh4eGhYeIiIiIhoSHhYaHiIaFiIeIhYeGhoiFhYaHhYaGhYSDhYWGhYWDhISEhIWEhYWEhYWEhoeGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fXt8fH1/fnx8fn2Af31+gH5+gH99fXyAfX5+fn5+fnx8fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhIiFhoeHh4aIhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhoSGhoWGhYSGhoWEg4WFgoWHhYOCgoWDhIF+gIB8e31+e3x7fX59fHx+fX5+fH9+fX1+fn19fH98fn58fYGAfHx8fXx8fH56e3t9foiHgoWIh4eGhoaGhISGhoeGiIaDhYSHhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaIh4mIhoaIh4iKiIWHiIWHh4aHhoeGh4WIiIeHhYaGh4WHh4WBhISFhoWFhISEg4SFhYaGhoWGhIeGhoeFhYaGhYSDhIOChIeDhIGChISDgYCAgHt7fn58fHx9fXx8fH19fH18fn18fX18fHx9fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhYeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhYSDhISFhoaGhoaGh4aGiIWGhYaFhIKDgoODh4GDgIKDg4KCgn+Ae31+fnt8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1/fXx6ent7fHyIh4KGhoaGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4eIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoeGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYeHh4eIhoaEhoWDg4KCgoOGgYN+goKDgIODf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWFhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiYqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWFg4WFhoaGhoeFh4aHh4eHhYSFhYOBgoGAg4WCg36BgYF/g4F+f35/fn98fH1/fXt9fXx9enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhYWEhIOEgoCDgYWCgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHioeEh4WHhoiGhYeEhoeJhoaIiIeHhoeIhoSGhoaHhoWHg4SFhIaGhoeFhYSDhYWHhYeGh4WGhoeGhoaEg4SFgYCBgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15enp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoWFhYWFhYODgYOBgIGBhYKAgH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4WHiImGhYiHiYeGhoeFhIaFhYaFhIeDhIWEiIaGh4WFhIKGhYaFh4aHhIaGhoWFhoODg4SAf4GAgISAg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl6enl6fX15enp7fHt8e3t6e319fH18fn5+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4OFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4aIiIWFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEg4aFhoaGhoaEhYaHhYWGgoKDg39+gICAgX+DgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXx/fn18fH1/fnx7iIWFhoaGhoSFhIWDhYKBgICAgYB+gIKCfX1/f3t/f4KDg4WGhYSDg4aDgYOEgoCFh4WCg4GBg4SEhIWGh4iHhYWIhomHhYOEhIKFg4SGgoOFhYWGhIeGhYWFhoOEhYSFhoWGhIOFhYaDhYWBgYODf35/gH9+f4N/e4B9fX+CfYCBfn6Bfn19fX1/e398e3p5enp5enp8eXp6ent7fHp7e3t8fX59fYF9fXx8fYB/fXyGg4aGhoaFg4SDhYKFgYGAf3+AgH5/gIF8fn9/foCAgoKChIWDgoGChIGAg4KBgISFhYKBf4CCg4OEhYaIhoWEhYeFh4WFgoOCgYOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhISDhIOFhICAgoJ/fX1/fn6AhH57f3x8gIF9gYB9fYN8fn59fX57fnt7enl6enl6ent5enp6e3t8ent8e3t9fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gXx9f39+fn6BgYKEg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeGhISGhoSFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoOChIODgH+AgX59fH5+fH+DfXx+fHyBgH6Cf31/gnx/fn18fHx8e3t6enp6eXt6enp6enp6e3x5e318fH5/f4GAfX59fX1/gICAhoSEhYSFgoOCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhoSDg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WEhYWCgoKDhYSCgYGBgoCFg4F/foB/fnx8fn18foN9e358fYF/gIN+fYCBf35/fXx8fH17e3p6enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYDKysrKysrKysrKysrLy8vLy8vLy8vLy8zMzMzNzc3Nzc3Nzc3NzczMzMvLy8vLy8vLy8vLy8vLzMvLy8vLy8vLy8vLy8vMzMzMzM3Nzc7Oz8/Pz9DQ0NHR0dLS0tLS0tLT09PT0tLS0tLS0tPT09TU1NTU09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tLS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1dXV1NTU1NTT09PT09PT09PT09TU09PU1NTU1NTU1NTU09PT09PS0tLS0tPT09TU1NTU1NPT09LS0tLS0tLR0dHR0dPHhnNlYFtLWWdVTUZIQD03Nzg5Nzw8PDo8Oz42Oj04PDs6OTg3ODs7Oj87PTs8PD47P0E/QkJBQ0RFREE+PTw7QENDQUBDQ0FBR0hHSUtSwtXS09PT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXVysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMy8vLy8vLy8vLy8vLzMzMy8vLy8vLy8vLy8vLzMzMzc3Nzc3Oz8/P0NDQ0NHR0tLS0tLS09PT09PT09PT09PS09PT09TU1NTU1NTU09PT09PT09PT09PT09PT1NTU1NTU1NTT09PT09LS0tLS0tLT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1NTU1NPT09PT09PT09PU1NPT09TU1NTU1NTU1NPT09PS0tLS0tPT09PU1NTU1NTU09PT09PS0tLS0tLR0dHSzIxyZ2BcTVllUktHSz87Mzc4Ozg5Pj05PDpBOjs9Nzo8PDo6Nzg6Oz0/Oz88PTw/Pj9BPUFBPkNDREJAQT46Oz9DREFDRERCQklHSEhJTr7V0tPT09TU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1crKy8vKysrKysrKy8vLy8vLy8vLy8vLy8zMzMzMzM3Nzc3Nzc3NzMzMzMzMy8vLy8vMzMzMzMzMzMzLy8zMzMzLy8vLzMzMzc3Nzc3Ozs/P0NDQ0NDR0dLS0tLS09PT09PT09PU09PT09PT09TU1NXV1dTU1NTT09PU1NPT09PT09PT1NTU1NTU1NTU1NPT09PS0tLS0tLS0tPT09PT1NTV1dXV1dXV1dXV1dXV1tbV1dXV1dTU1NTT09PT09PT09PU1NTU09TU1NTU1NTU1NTT09PT0tLS0tLT09PU1NTU1NTU1NTU09PT09PT0tLS0tHR0s+Sd2hfXk9XZ01LRkw9ODc2NTk5OTw+OT88RDk7PDg6PD07OTc5Ojw9QDs+PT47PD48PT5BQD5EQ0NDP0E9Ojs9QkNFQ0NEQT9FSEpJSky61dPT09TU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1dXLy8vLy8vLy8rKysvLy8vLy8vLy8zLy8vMzMzMzMzNzc3Nzc3Nzc3MzMzMzMzMzMzMzMzMzMzMzczMzMzMzMzMzMzMzMzMzc3Nzc3Ozs/Pz9DQ0NDQ0dHS0tPT09PT09PT09TU1NTT1NTU1NTU1NTV1dXU1NTU1NPU1NTU09PT09TU1NTU1dTU1NTV1dTU09PT09LS0tLS0tLS09PT09TU1dXV1dbW1dXV1dXV1tbW1tXV1dXV1NTU1NTT09PT09PT1NTU1NTU1NTU1NTU1NTU09PT09LS0tLT09PU1NTU1dXV1dTU1NTT09PT09PT0tLS0dHRmn5nYWJOVWpKSElLPzw6OTM3Njc3PTs+OT06Ojo4OTo7Ozg4Ojs7PD46PT09Ojw/PD0/QkA/Q0RDRD5APT08QENEQ0JEQkQ+REhJSUtMttfT09TU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vLy8vLy8vLy8vLy8zMzMzMzMzMzMzNzc3Nzc3Nzc3Nzc3MzMzMzMzMzMzMzMzNzc3NzczMzMzMzMzMzMzMzc3Nzc3Ozs7Pz8/Q0NDQ0NHS0tLT09PT09PT1NTU1NTU1NTU1NTU1NTV1dXV1NTU1NPT1NTU1NTU1NTU1NTU1dXV1NXV1dXV1NTU09PT09PS0tLT09PT09PU1NXV1dbW1tXV1dbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1NTU1NTU1NXU1NTU1NTT09PT09PT09PU1NTU1dXV1dXV1dTU1NTU09PT09PS0tLR0p+DaV9kU1hsSEhIS0A9Nzg0NzY6Oj87RDw8OTw8OTc6OTs6Ojs8Ojo7OT49Pjk9QDs/QUFCP0JCQUM9Pz8+PEBCRUNDQkBBO0ZJR01MSbLY09TU1NTU1NXV1dXV1dXV1dXW1tbW1tbV1dXW1svLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzM3Nzc3Nzc3Nzc3Ozc3NzczMzMzMzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc3Mzc3Nzs7Ozs7Pz8/P0NDQ0NHS0tLS09PT09PT09TU1NTU1NTU1NTU1NTV1NXV1dTU1NTU1NTU1NTU1NTV1NTU1dXV1dXV1dXV1dTU1NTU1NPT09PT09PT09PU1NXV1dbW1tbW1tbW1tbW1tbW1tbV1dXV1dTU1NTU1NTU1NTU1NTV1NTU1NXV1dXU1NTU1NTT09PT09PT1NTU1dXV1dXV1dXU1NTU1NTT09PT09LS0tSjiGxfZlJWakdIR0lBPjM2Njo7PDhDPEJBPjxBPDg5Ojw6Ojw8PDk8PTo7PD09PD89QD9AQT9AQUBCPD4+PzxCQ0NDRkBBQT1ISklOTUeu2NPU1NTV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbMzMvLy8vLy8vLy8vLy8vLy8vMzMzNzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ozs3Nzc3Nzc3Nzc3Nzs7Ozs7Oz8/P0NDQ0NHR0dLS0tPT09PT09TU1NTU1NTU1NTU1NTU1NTV1dXV1dTU1NTU1NTU1NTU1dXV1dXV1NXV1dXV1dXU1NTU1NTU09PT09TU1NTU1NXV1dbW1tbW1tbW1tbW1tbX19bW1tXV1dXV1dXV1dXV1dTU1NTU1dXV1dXV1dXU1NTU1NTU09PT09PT1NTU1NXV1dXV1dXV1dXV1NTU1NPT09PT0tLWroprY2VSWGhMSkdJQjg0OTQ6Ozo5QDk/Q0VAPDw5OTk9Oj07PDw6PTw7OTw9Ozs/PUA9PT5AQD9CQT5APD05QERDQkFBQj48SEpLTU5IqNnU1NXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbWzMzR09PT09PT09PT09PT087Ky8vLzMzMzMzMzMzMzM3Nzc3Nzc7Ozs3Nzc3Nzc/Pz8/Pz8/Pz8/Pz9DQ0dHR0dHR0dHR0dHS0tHV2djY2NnZ2dra2tvb29vZ2dnZ2dna2tra2tra2trZ2dnZ2dnZ2tra2trZ2drb29vb29vb2tvc29zb2dfX19fX19fX1tbW1tbX2tra2tra2tra2trb3NzX1dXV1dXV1dXV1dXW1tbX1tbW1tbV1dXV1dXV1dXV1dTU1dXV1dXV1dXU1NTU1NTU1NTU09PU1NTU1NXV1dXW1dXV1dXV1dTU1NTT09PT09PS1bqKa2hoUlhlSUlMT0A5OTo0O0E8Nz05QUM+QD89ODo6Ozk9Oz4/Ojs8PDo7PDo7Pj1APT8/P0FAQUE/QTw8Oz5BRENBREA9PElJSk1ORqPa09TV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tbW1szNhG1wcHBwcHBwcHBwcGqn493d3t7e3t7e3t7e3t3S0NDQ0NDQ0NDQ0NDQ0ci5ubm5ubm5ubm5ubq6t6WkpKSkpKSkpKSkpKSnhmBjY2NjY2NjY2NkZGRlhIuKioqKioqKioqKiomSmZiYmJiYmJiYmJiYmJeMi4qKioqKioqKioqKiKC/vL29vb29vb29vb2+tIqKioqKioqKioqKiouHvebh4uLi4uLi4uLj4+Pi2NfX1tbW1tbW1tbV1dXV1dXV1dXV1dbW1dXV1dXV1dTU1NTU1NTU1NTV1dXV1dXW1dXV1dXV1dXV1NTU1NTT09PT09XDkXFrak5TYkxMVk48Ojo3Nz5DPjg+Oj8/QTw/QDc7Ojs7PTs+Pjo7PD48Oz07PT8+QDw/Pz1AQEBBPj88PjxAQUVCQkZAQD9HSEpLT0ae2tXV1dXV1dXW1tbW1tbW1tbW1tbW19fX19fX19fMzk4mKysrKysrKysrKysiivTr6+rq6urq6urq6uvp1dLS0tLS0tLS0tLS0tTEqaqqqqqqqqqqqqqqq6aGhIWFhYWFhYWFhYWFik4MEhISEhISEhISEhIRE0pUU1NTU1NTU1NTU1NRYmxra2tra2tra2tra2tpVVNTU1NTU1NTU1NTU056r6qqqqqqqqqqqqqqrJtTUlNTU1NTU1NTU1NTS6ry6+vr6+vr6+vr6+vr6dnX19fX1tbW1tbW1tbW1dXV1dXV1dbW1tbV1dXV1dXV1dXV1dTU1NTV1dXV1dXW1tXV1dXV1dXV1dXU1NTU1NTU1NPUy5h2bGlKTl9NUlVNPjw8NztAQz42Ojc9Pzs9Qj85PDk9Ozw6PD07PTs9Ozs9PD0+PT07QT08QUBBQT08Pzw7QEJDQURFPUFAQ0ZLS09GmNzV1dXV1dbW1tbW1tbW1tbW1tfX19fX19fX19fXzc5SKzExMTExMTExMTExJ43z6enp6enp6enq6unq6dXS0tLS0tLS0tLS0tLUxaqrq6urq6urq6urq6yoiIeHh4eHh4eHh4eHh41SEhgYGBgYGBgYGBgYFxpOWVdXV1dXV1dXV1dXVmVwb29vb29vb29vb29vbVlXV1dXV1dXV1dXV1dTfrCsq6urq6urq6urq66dWFdXV1dXV1dXV1dXV0+r8erq6urq6urq6urq6unZ19jX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dXV1dXV1dXU1NTU1NTU1NGcenFpSlRdT1JVTkQ+Pzs+QEA4Ojs4PDs7PD86Ozs4Ozk5Ozw7Ojw5Ozs8Ozo9PT0+PUE/Pj8/Pj08PT88PEFBQ0FERTw+QEVGSktNRpPc1dXV1tbW1tbW1tbW1tbW1tfX19fX19fX19fX183PXDk9PT09PT09PT09PTWT8Ofn5+fn5+fn5+fn5+bV0dLS0tLS0tLS0tLS08Wtrq6urq6urq6urq6vq46NjY2NjY2NjY2NjY2SXSInJycnJycoKCgoKCcpWmNiYWJhYmJiYmJiYmFveHd3d3d3d3d3d3d3d3VjYmJiYmJiYmJiYmJiXoWyr6+vr6+vr6+vr6+xoWJhYmJiYmJiYmJiYmJbr+/p6enp6enp6enp6enn2djY2NjY19fX19fX19fX19fX19bW1tfX19fW1tbW1tbV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbV1dXV1dXU1NTU1NTWo3txZElbYE5OVU9AQT89REI/Oz06OTs6PT07PDs6OTg5OTs8Ozw8Ojo7PDo7QD08PTxAQTxBQTs7PEA/PD1CP0RDQ0U8PkJERkpMTEWN3NXV1tbW1tbW1tbW1tbX19fX19fX19fY2NjY2NjNzcXCw8PDw8PDw8PDw8PCydDPz8/Pz8/Pz9DQ0NDQz87Ozs7Ozs/Ozs7Oz8/NzMzMzMzMzMzMzMzMzMvJycrKysrKysrKysrKysfCw8PExMTExcXFxsbGxsvMy8zLzMzNzMzMzMzLzc7Ozs7Ozs7Ozs7Ozs7NzMzMzMzMzMzMzMvLy8vP09PS0tLS0tLS0tLT09HNzc3Nzc3Nzc3Nzc3NzdTY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NfX19fX19fX1tfX19fX19bW1tbW1tbW1tXV1dXV1dXV1dbV1dbW1tbW1tbW1tXV1dXV1dTU1NTU169/cF5GXmJQUVdOR0ZDQ0lBPz07PDo8OEBCPD04Ojo4OTg7Pzs8PDs7PDw8PD87PD46Pj44PkI8Pj1BPjw+QkBERUNAPD5APkNJSUtEh9zV1tbW1tbW1tbW1tbX19fX19fX19jY2NjY2NjYzs3P0NDPz8/Pz8/P0NTQ0M7MzczP09LSzs3P0s7Ozs7Ozs7R1NTTztDU0s/O0NTSz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NDR0dHR0dHS09PU1NTU1dXV1tbW1tfW1tbX1tfX19fX19fX19bW19fX19fX1tfX19fX1tfX19fX19fX1tbW1tbW1dXW1dbW1tbW1tbW19bW2NjY2NjZ2dnZ2dnZ2dnY19jY2NjY2NjY2NnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjX19fX19jY19fX1tbW1tbW1tbW1tbW1tbW1dbW1dbW1tbW1tbW1tbW1tXV1dXV1NTV1di4gm9XSl9jUlFaS0hBQTxCPT07Oj4+PD4/PT0/Nzk6OTk3OD48PD47Ozw7PDs/PT0+OTs7OT0+P0A+QD07OkI/QkNCPz0+QD5CRUdKQoDc1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2M7Ozs7Ozs7Nzc3Nzsqfys3Nzc3QuYOEi8fTwJrLz87Ozs7RsIOEk8/JlKjS0MaTq9LOzs7Ozs7Ozs7Ozs7Oz8/Pz8/P0NDQ0NDQ0NDR0dHR0tLT09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXW1tbV1dXV1dbW1tbV1dXV1dXV1NTU1NXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NfX19fX1tbW1tbW1tbW1tbW1tXV1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXYwIBuVU9gY1dZW0xMQ0A9PTs9Ojw+Qj5CQ0A8Ojg5ODo6Ojc7Pz4/PDw7PDo5Pzw8PTg5PD9BPj09PUFAPTtBQkBCQz47QD9BQUlHSkF629bW1tbW1tbX19fX19fX19jY2NjY2NnZ2djY2dnOzs7Ozs7Ozs7OzdKpj63Rzs7Ozpu3tqSiwJOerNPOzs7PyZu6uJ2snqubsNCZrZmz0s7Ozs7Ozs7Ozs7Pz8/Pz8/Pz9DQ0NHR0dHR0dHS0tLT09TU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tXV1dbW1tbW1tXV1dXV1dXU1dXV1dXV1dXW1tbW1tbW1tbW1tfX19fX19jX19fY2NjY2NjY2djY2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2dnY2NjZ2NjY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV18h/b1pTYWVeXVxPSkQ9QD8+Ozc6Pjk/RD5BOTg3ODk7Ozw4OT89PTw9PD47OkE7OTs5OzxDQDw7PT5AQT49QkQ/QkM9PT8+Pz5ISUg/ddrW1tbX19fX19fX19fX2NjY2NjZ2dnZ2dnZ2dnZzs7Ozs7Ozs7Ozs/Inrym0tDQzsqgl36Cw6abr6fUz8/P0cOij3+KwpSHnJ7Fk4adnc7Pzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dLS0tPT09TU1dXV1dXV1dXV1dXV1dbV1dXV1dXV1tbW1tbW1tbV1dXV1dXW1tbV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2NjZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2djY2NjY2NnZ2dnZ2dnY2NjY2NfX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dbV1dXV1dfNiHNdWGloXl9gT0lGOkFAPj88PDo2P0JAQzo2NDc6Ozo8Ojk+PD49PTs/PTxBPjw8Ojw8PTw6PEA9QEI+PkFCPUNDPT0+Oz9BRUtIQHDZ1tbX19fX19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2c/Pz8/Pz87Ozs7SrKWnqdXAvNLHnY+ey9PJipmq1M/Pz9G/noqo0NS7yJiZxr3JlpnG0M/Pz8/Pz8/Pz8/Pz8/Pz8/Q0NDQ0dHS0tLS09PT1NTU1dXV1dXV1dbW1tbW1dbW1tbW1tbV1tbW1tbW1tbW1dXV1dXV1dXW1dXV1dXV1dXV1dXW1tbW1tbW1tfX19fX19fX19fX19jY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnY2NjY19fX19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXW0JB1W1tqaWFeXVNOSTxDQEE+QD46OEZBP0M6NzQ5Ojo5Ozs4Oz0/Pj49QT08P0A9Pjw8PDw8Oj1AQD8/PT5CQD9AQkA8QD0+QUVLRz9r19fX19fX19fX2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnPz8/Pz8/Pz8/QzJ2Nl6zQmpfKxZ6ynpbN1q2ZqtTPz8/RuqWtnJ7S0ZSWn87RkZigztDQ0M/Pz8/Pz8/Pz8/Pz8/P0NDQ0dHS0tLT09PT1NTU1NXV1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX19fX19fY19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tKUcl5ea2tqZV1PTEc/RENDQDo9OzxCPD49OTY0Ojk5Ojo5Nzs/QDs8PUA8PEE+PD07PTw/PDo8Q0A+PTs9QD5CPkBBPkA9QD9GSUQ/ZtXX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2traz8/Pz8/Pz8/P07GigJuvyaCjv8qcpYynrdiqmarUz8/P0cCgn5OlvLOfwpvaraO/ndXQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1NXV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dbW1tXW1tbW1tbV1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2djY2NjY2NfX19fX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbSk3BgXnBoZmVaUUhHQkVDQEA3Ojo8Pjo8OTc2NTk6Njo8Ozc8QEA8Ojo9Oj0/Pj08OUA8PDo6OT9APj08PUBBQz9APz5BOz9ARkpCP2LS2NfX2NjY2NjY2NjY2dnZ2dnZ2tra29vb29vb28/Pz8/Pz8/P0M6fkGyclteqo9PSrqa1mJ/Vqpmq1M/Q0NDSpq+um6fQi5Oex8uIlZ7I0tHR0NDQ0dHQ0NDQ0NDQ0NDQ0NHR0tLT09PT1NTU1dXV1dbW1tbX19bW1tbW1tbW1tbX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfW1tfX19jY2NfX19fX2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX1tbW1tbW1tbW1tbW1tbX19fX19fW1tbW1tbX0pNuYFxxZGdkWlVKQENGQ0FCODs/PD07PDw4NTU4OTY4Ozo5PDo+Pzw9PTk8Pz49Ojo+OTw6Ojg+Pzw9PTw+QEFDQT48PDpCRERKRkJd0NnX19jY2NjY2NjY2dnZ2dna2trb29vb29vb29vPz8/Pz8/Pz9G9n8O31pfA09HQ0srSzZeb1KqZq9XRz9DQ0cnXxJih0NqlmbPQ26KZtdXR0dHR0dHR0dHR0NDR0dHR0dHR0tLT09PU1NTV1dXV1tbW1tfX19fX19bW1tbW1tfX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW19fX19fY2NjY2NjY2NjY2NjY2djZ2dnZ2dnZ2dnZ2dnZ2drZ2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NfX19fX19fX19fW1tfX1tbX19fX19fX19fX19bW19GRbF1cb2doYl1PRkBISUdFQDw8Pj48PT48NzU2Ojk2OTs6Ojs4QD86PDw5PD49Ozs6Pzk/Ojs5PT49PTs7PTxAQ0I/Pz47Q0ZGR0hEWc3a2NjY2NjZ2dnZ2dnZ2dna2trb29vb29vb29vb0NDQz8/Pz8/Pz5V+e6WS1KKa08ySl6ObodirmavV0pem1cWNnqCeoJKnmaCtkKiYnrvV0dHR0dHR0dHR0dHR0dHR0tLS0tLS09PU1NTV1dXV1tbW19fX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tbX19bW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tnZ2dnZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2tnZ2dnZ2dnZ2djY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19fX19fX1tfPjGRWXnBrXGBgTkVITUlJT0M+OkI9PUBCOzU1Nzw6Nzo7Ojo7OT09OTo6OT0+Pz07OT47PDo8Ozk+PD47PD0+QENCPz5BPEFDR0ZGRVXJ29jY2NnZ2dnZ2dnZ2dra2tvb29vb29zc3Nzc3NDQ0NDQ0M/Pz9DR1aeZrcmjqL7KnbGdo7XZqZup2LirocnBoa2ho6WmpKigr6eiqZzQ09LS0tLS0tLS0tLR0dHS0tLT0tPT09PU1NTV1dbW1tbX19fX19fX19fX19fX19fX19fX19bW1tbW1tfX19fX19fW1tbW1tbW1tbX19fW1tbW1tbW1tbX19fX2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2djY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fX19fX19fX19fY2NfX19fX19fYzYZdV2JvZE9dVEtIRlNRS0xAPj1EPD9DRj01NTc7OTY6Ozo8PTo7Pzo6OTg6PT0/Pjs/Oz49Ojs5Pjs9PD0+QURCQD8+PzxAQUVHRURSxdvY2dnZ2dnZ2dnZ2tra2tvb29vb3Nzc3Nzc3NzQ0NDQ0NDQ0NDQ0NO5gL3Tm5bP1LWLkZ/T1LyBu9TOlKDT1auNj6rWnJGOutWakY6+1tLS0tLS0tLS0tLS0tLS0tLT09PT09PU1NXV1dbW1tfX19fX19fY2NjY19fX19fX19fX19fX19fW1tbX19fX19fW1tbW1tbW1tbW19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2tnZ2tra2tra2tra29ra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2NfX2ct+WlVqaltMX01KTEpVTEZCPD0/R0ZIS0g9NjU3Ojk3OTo7Ojw9OT45OTo4Oz0+PkE+PTk8PDo9Pj46PTk5Oj9FQUA+PT8/QkBHRURFUMHc2dnZ2dnZ2dna2trb29vb29vb3Nzc3Nzc3dzc0NDQ0NDQ0NDQ0NDQ0cHR0crI0tDUxLjS0tHSwtLQ08fM0tHUwb7V09O5x9bT07jI1dLS0tLS09PT09PT09LS0tPT09PU1NTU1NXV1dbW1tfX19fX19fX2NjY2NjX19fX2NfX19fX19fX19fX19fX19fX1tbW1tbW1tbW1tfX1tbW1tbW1tbW19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29va2tra2tra2dnZ2dna2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2djY2NjX19fX19fY2NjY2NjY2NjY2NjY19rHd1xSZ2laTlpOTFBRV0VKPz89P0FFTExAPjc3NTs4ODk5Ojs8Pjw+ODo6OTs+P0A9Pj46NTo6Oz0/Ojs5Ojw+QkJAPz8/P0FCR0RDRE683dnZ2dnZ2dna2tvb29vb29vb3Nzc3Nzc3d3d3dDR0dDQ0NDQ0NDQ0NDS0NDR0dDQ0dPU0dHR0dPR0dHS0tHR0dTV0tLS1dTT09PW1NLS0tPT09PT09PT09PT09PT09PU1NTU1dXV1dbW1tfX19fX2NjY2NjY2NjY2NfX19jY19fX19fX19fX19fX19fX19fX1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tvb2tra2tra2trZ2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2trZ2tra29ra2trZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjbwXNYVWlrU0xSTlBSWVRGSTw+Qz9BQkVKPj43ODY5Nzc4OTk7Oz0/QDw9ODk7Ozs/Pjw8OTU6PT47OTk7PD8/P0JCQT1BPUBBQkZCQkJLtd7Z2dra2tra2tvb29vb29vc3Nzc3Nzd3d3d3d3R0dHR0dHR0dHR0dDQ0NDQ0NDQ0dHR0dHR0dHR0dHR0dHS0tLS0tLS0tPT09PT09PT09PT09PT09TU1NPT1NTU1NTU1NXV1dXV1dXW1tbX19fX2NjY2NjY2NjY2NjY19fY2NjX19fX19fX19fX19fX19fX19fX19fW1tbX19fX1tbW1tbW1tbX19fX19jY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NnZ2dnZ2dnZ2NjY2NjY3LxvVFRsbExLUkpUUlVLRkQ6PkdEREFERjw/ODk6OTU5OTo3PD07PkA9PTc5Ojs5Pjs5OTY2Oj1AQT47PDk6Pj9DQT4/Qj0+QkNFQkFCSrDe2dra2tvb29vb29vb29vc3Nzc3Nzd3d3d3d3d0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0tLS0tLS0tLS0tLS0tLS0tPT09PT09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1tbW1tbW19fX19jY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19fW1tbW1tfW19fX19jY2NjY2NjZ2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djZ2dnZ2dnZ2dnZ2dnZ2dnY2Ny2a1NbcGtLVVdSXFFXSEQ+PEJKRT1ISj89PDc4ODo1OTg5Njs+PD1APDw1OTk8Oj87OTg0ODw9PUFBPD47Ojw+QD89PkE9PUNGR0I/Qkmq39ra29vb29vb29vb3Nzc3Nzc3N3d3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHS0M/U0M7P0tLT0tLS0tLS0tLS0tPT09TU1NTU1NPU1NTU1NTU1NTU1NTU1NTV1dXV1dXV1dbW1tbW19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19jY2NfX19fX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2dnZ2dra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dndsGRTYXJfT1pUV19RUkdCPUVJTEFBTEQ/Pzs6ODg5Mzg2ODY5Pj0+Pz06Njo7Pjs9PTo5Njg6PTtAQDxAPz0/P0I+PD48PEJFR0lCPkNJpODa29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3t7S0tLS0tLS0tLS0dHR0dHR0dPT0bm7zLqbnLrQyNPT0tLS09PT09PT09PU1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fX19jY2NjY2NjY2NjZ2dra2tra2tra2tra2tra2tra2tra2tra29va2tra29va2tvb2tra2tra2tra2tra2trb29vb29va2tra2tra2tra2tra2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ3qpfVWBuW1VZUVpeT0xHQ0ZNSUZEREo7QUE7PDg4NjQ4Njk4Nzw/QT89Ojc8Pz48Pz87OjY4OD09QEE9QD5BQD1AOjs6Pj1BRUdJQkBDR57h29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e0tLS0tLS0tLS0tLS0tLS0tO+wMqaoKKViJGeqpOpz9TT09PT09PT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fY2NjY2NnZ2dnZ2dnZ2dnZ2djY2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjZ2dna2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29ra2tra2tra2tra2tvb29vb29va29vb29vb29va2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2d6iXFVeblheXU5aUFROQ0NMSUlJRkpEPEJBPDs4NzY3OTc3OTk9P0E/PDo5QD88PkI/Ojg3NzY9Pz9APUBBPz88PTs7OD48P0VJSEE/Q0aX4dvb29zc3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3tPT09PT0tLS0tLS0tLS0tTIlZyum5m1iX2TjIKBhMTV09PT09PT09PU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tfX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tvb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tnZ2dndmlpYYW5ZYVdPV01QRUJETElNS0ZJRT5CRDk4ODY3OTc1Njk4PT1BPjo4OT4+PD9APzw1Njc2PD4/PjtAQEA/Pj4/Pjs/PkFCRkdCQENIkeLb29zc3Nzc3d3d3d3d3d3d3d7e3t7e3t7f39/U09PT09PT09PT09LS0tLTz6h+kayPko6MhoCIiYSQo8rU09PT09PU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY19jY2NjY2NjY2NjY2NjX19fX19fX19fX19fY2NjY2NjY2NjY2NnZ2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2tra29vb29ra2tra2tra2tna3JJaWWNuWlpSVV5QTDxAR05IUklIRT47SEY4OTc1Nzg3NTg5ODs+Pj07ODlBPj1AP0E+NzU5Njs+QUI/P0BAQkI/Pj8+QUBEQUZIQj9FSozi3Nzc3Nzc3d3d3d3d3d3e3t7e3t7f39/f39/f1NTU09PT09PT09PT09PWtaWaiIuQhYCFi4iBg4qLf4bC1tTU1NTU1NTV1dXV1dXV1dXV1dXW1tbW1tbW1tbX19fX19fX19fX2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fY2NjY2NjY2NjY2dnZ2dna2dra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29ra2tra2trb29vb29vb29vb29vb29vb29vb29vb2tra2tra2tra29vb29vb29vb29vb2tra29uIWltnalxYTFpfVkg6TEhMSkpDRUZDQExINzo3Njc4ODU4Nzg5PDw7Ozk4QD89Pj8/PDY3PDQ3P0JCQUBAPz8/QT09P0A+QEBGRT09REuI4tzc3Nzd3d3d3d7e3t7e3t7e3t/f39/f39/f39TU1NTU1NPT09PT09PUxZKCg4WGfYGCfXx5foGCg36k29bU1NTU1NTV1dXV1dXV1tbV1tbW1tbW1tfX19fX19fX19fX19fX19jY2NjY2NjZ2dnZ2dnZ2dna2tnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tra29vb29vb29vb29vc3Nzc3Nvb29vb29vb29vb29vb2tra2tra29vb29zb29zb29vb29vb29vb29vb29vb29va2tvb29vb29vb29vb29vb29vb2tvZgFpebWhaU0ldW1hKRE1ISlNMR0ZBQD9KQjg7NjY5OTc1ODY4Ozo7Ojw5OD09O0A9Ozo2NTw3Oz1CQEFBPD49QEE9PEA/Pz5CREU+PERLg+Lc3d3d3d3d3t7e3t7e3t7f39/f39/f39/f39/V1dTU1NTU1NPT09PT2LKEkKh9g3l2hIh/e3d5gn5+i67A1dTU1NXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dna2trZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2tra2tra2trb2tra2tvb29vb29vb29vc3Nzc3Nzc29vb29vb29vb29vb29va2trb29vb29zc3Nzc3Nvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc1nlcWmxmWFJPYFFSQUhHSkZYTEZAQENDSz87Ozc4ODc2NTc2ODo5PDw6PTs/PTs9Pjw7ODg8OT0/QkFCQzw8P0FCPj1BQkNCREVDQDtDTH3h3d3d3d3e3t7e3t7e39/f39/f39/f39/g4ODg1dXV1NXU1NTU1NPU0ruen3WKeXuIgICChYGDcnOAhYOMrNfV1NXV1dXW1tbW1tbW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NnZ2dna2tra2trZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra29vb29ra2trb3Nzc3Nzc29zc3Nzc3Nzc3Nzb29vb29vb29vb29rb29vb29vb29zc3Nzc3Nzc3Nvb29zc3Nzc3Nvb29vb29vb29vb29vc3Nzc3Nzc3Nvb29vb3dByXV9wZVdLUGNPS0JHQ0pIS0ZBPEE9SFBBOjo3Nzg3Njc4Nzw6OD09PD47QD88Pz07Ojs5Ojk8QEJAQkNAPUFAPz1AQkNDQUBAP0A7RU144N3d3d7e3t/f39/f39/f39/f3+Dg4ODg4ODg4NXV1dXV1dXV1NXU18h4i4V8goh6g4SBfoKCc2l0hYuGkJ3U1tXU1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dna2tra2tra2tra2tvb2tvb3Nzc3Nzc3Nvc3Nzc3Nzc3Nzc29zb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb297KalxjcWVST1heSz9HTElPS0VAPkFCP0lPPjk6NzY7NzY6Ozc7Ojg6PDw+Oz09Oz48Ojs4OTo4OUFCQkFAQDtAQj06PkFCQz8+PT4/PUZOdN/e3t7e3t7f39/f39/f4ODg4ODg4ODg4ODg4OHV1dXV1dXV1dXV1s6dhpl+f5OTin+CgXx9gnNxm4mAgoOJwNnat7TQ19bW1tbX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tnZ2dnZ2dra2tra2tra2trZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tra2tra2tra2tra29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NvfwGNaW21gVlBTU0pETEhNSEk8PkFEQ0ZORDw8OTc5OjY4Ozk3PDk4OTw9OzlAPjpBPzw3NTc7ODpAQUVBPz45PUI/Oz1CQkI6Pj07PT5GTnHe3t7e3t/f39/f39/g4ODg4ODg4ODg4OHh4eHh1tbW1tbW1tbV1tjLioCHhYOXjHh7e3lvfYF1a3ebdHZ7eInHxpiMrdjZ19fX19fX19fY2NjY2NjY2NjY2NjY2NjY2dnZ2drZ2dna2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tra29vb3Nzc3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29zb29vb3Nzc3Nzc3Nzd3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3Nzc3Nzc4LdjV1lrYlJNVVFMSktGS0ZDQD5CQT9FTT4+PTg5OTo3OTo3NT03Nzo+PDs7Qjw5Pz05NjY4PTk6QEJGQD49PEBCREA9QD9DO0A9PD4/Rk9t3N/e3t/f3+Dg4ODg4ODg4ODg4OHh4eHh4eHh4dbW1tbW1tbW1tfVrYZ6d32rn3l4entzdH+Dfm9xe3l6c3t2k4qFgImkzdnY19fX2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dna2tna2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dra2tra2tra2tra29vb29vc3Nzc3N3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc29vb29vc3Nzb3Nzc3Nzc3N3d3d3d3d3d3dzc3Nzc3Nzd3d3c3Nzc3Nzc3N3d3d3d3d3d3d3d3dzc3OGtYVtebGJSTVZMTUdLS0RGQkI7QT08RUxDQT44Ojk6Nzc5NjY6NTs+QDs9Oz89PD89Ojk5Ojw5PEVDRkA/PkBDQkQ9OT0/QT1CPz1APkdPadvf3t/f3+Dg4ODg4ODh4eHh4eHh4eHh4eHi4uLW1tbW1tbW1tfQmH+Qh4N9eoN2e3Vzenl6kKqmd3JyfoeHh4CAfoKEhJHJzNnX19jY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra29va2tra2tra2tra2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djZ2dnZ2dnZ2djY2NnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vb3Nzc3N3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzb29vb3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3dzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3NzhpV9UYm1iUE9TSUhHRkpJSUJBPkJCPEVFREA+ODo4Ozc3Ojc4ODY+Pz07PDk9PDo+PTs6Njc7NjpEQUY+Pz8/PkNBPzs9PT47REM/PjxIT2fZ4N/f3+Dg4ODg4eHh4eHh4eHh4eLi4uLi4uLi1tbW1tbW19jYyH52doN+fnR2eIaCenl1d5yhu6GEgoCAfoeKinx/gYaMnKjO2NjY2NjY2NjY2djY2NjZ2djY2NjY2dnZ2dra2tra2trb29rb29rb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3d3d3d3c35pbT2drXFBRUElDT0pLR0xHSkJAP0FHREBBPDg8ODg1ODk3Njc3QEA/Ozw5Pj04PTw8Ojc4PTk/RENGPkE/QkBDPzw6Pj0/PkVEPz07S1Fj1+Hf4ODg4ODh4eHh4eHh4uLi4uLi4uLi4uLj49bW1tbW19XB3LRueHJze3B6eXaFiIR7eH2AgZiljH98fnuRhZaLhoGDgY6Rvd3Z2NjY2NjZ2dnZ2dnZ2dnZ2dnY2dnZ2dna2tra2trb29va2tva2tra2trb29ra2tra2tnZ2dnZ2dnZ2dnZ2dna2trZ2dnZ2dra2tra2tnZ2dnZ2dna2tra2tra2tra2tra2tra2trb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t3d3d6NWFdobllQUUtISlNJTUhNSUtBQz9DRkJBRDo6PDg2NDg4NzY2Nj8+Pjo8OTw7Oj09PDw4Ozw7RERERT4/PkI+Qj84PT8/Q0NCQEE+O0xUY9Xh3+Dg4OHh4eHh4eLi4uLi4uLi4uLi4uPj4+PW1tbW1teslLZ6eHJvd5V7dHuLgHh1bn6Fg3t/hYhyfH2bnI6JioJ+g32Hk5rH1NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2trb29vb29vb29vb2tra2tra2tra2tra2tnZ2dnZ2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2trb2tra2tra2tra2trb29vc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d7Zf1lgaGxcUUtHR09LTk5PTURGQkg/Q0hEREA6Ozs4NzU3Nzc4NThAPkA7PDk8Ozw+Ojk7OTk7OUZERUI8QD4/PEBDOz5AP0A/Qj8+OjtKVWPV4eDg4eHh4eHi4uLi4uLi4uLi4uPj4+Pj4+Pj1tbX19vKhYR3cXJubniVhHt4hH95dnB4c3eLkY6CdnN9ioaId3d1d4ODfIiIk8Pb2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dra2trb2tvb29vb29vb29vb29rb2tra2tra2tra2tra2tnZ2dnZ2dna2tra2tra2tra2trb2tra2tra2tra2tra2trb29vb29ra2trb29vb29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f0nVZaGlqVk5KSE1OR01EUElGSD9FPUZMREM+Ozs8OTc3OTY2OTU4Pj4/PTs8QDs9PDo3Ozc5OThHREVCPUE9Qj8+QDw/QUE/QEJAPjs8S1Ri1OLg4eHh4eLi4uLi4uLi4+Pj4+Pj4+Pj4+Pj49fX19fEknuJf29sbnV2foSBg4qGfnVybWVtiIaKjoR7c4OHint4e4OPj4GEioqxztrZ2dnZ2dnZ2dna2tra2tra2tra2trb29vb29zc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tra2tra2tvb29va2tra2tra2tvb2tvb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3t7e3t3d3d3d3d3d3d3d3dzc3Nzc3Nzc3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f3t7e4clsW2pqalNOR0dOT0VIRk1JSUA7RD5ISUA9PDo6Ojg2ODo3Nzk0OD08PT07ODw8PDw4Njc4OTo6RUJFQT9APEI/Q0M+PkNEQUBAP0A8PUtRYdPj4OHh4uLi4uLi4uPj4+Pj4+Pj4+Pj4+Pj5OTX19fZqXaFfnx3bHB3eXh8jH2KhYB3anN0d3p9bot7fnl6foR/gIGDfnh8foeGlrbT2tnZ2dra2tra2tra2tra2tra2tvb29vb3Nzc3Nzc3Nvb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra29ra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/e3uO9amFpa2lRTkZNTEtKWE1OR0FAQE9BQz9AOzw4OTk5Njg2NjY4NDs+PD07OTY6Ojk6OTU4OTg5OkJERj8+Pj5AQEBCPzxBQD88Pj9BOT5KT17S4+Hh4eLi4uLi4+Pj4+Pj4+Pj4+Pj4+Tk5OTk19fX2sqKhIB5c29tcXN1d4CUeHaAfHWHhXd1cnWgmXp7d3Z5doR0bWxue3iAmouTu9za2tra2tra2trb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc29vb29vb2tra2tra2tra2tra2tra2tra2tra29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f397js2lpbmloUFBPTExPUk9LU0Y/RURERD48PDg7ODc5OTU2ODc2NzM6Pjs+PTc6Pjk5OTk2Ojo4NzxDRUc/Pzs/PkA9PkE9Oz0+OUFAQDhBTlFc0OTh4eLi4uLj4+Pj4+Pj4+Pj4+Pk5OTk5OTk5NjY2NjauY6AenZ1bmpveHCBfWt0cnZ3hIV5h4d5lY55eXp1d3pza298gHx2fYh8gLLe2tra2tvb29vb29vb29vc3Nzc3Nzc3Nzc3dzc3Nzc3Nzc3Nzb29vb29rb29vb29ra2tra2tra2tra29va29vb29vb29vb29zc3Nzb29vb29vb29vb29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3t7e3t7e3d7e3t3d3t7e3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f4ODg4ODg4N/f39/f4qpqa2hrZFNQT0ZQVFJOSFJLPkREQ0I7Ozk6Ojg2Nzg1NjY4Nzg0Oz88Pz05PDw3Ozo6Nzo6Nzo9Q0JDPUE+Pzw5PT5BQDs8PDtFQD47Q05TXNDk4eLi4uLj4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTY2NjZ1p5vdntveHh2cG50d3BwdHBzb36Jc3qGhY2EenNtcoB6hn1vg5OBdnx9g4a13drb29vc29vc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29ra2tra2tvb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/g4ODg4ODg4ODg4ODg4N/f3+KgbWhma2ZVVlJHUFFOS0xMRUJIRUc9OD08Ojo3Nzg2Nzc2NTY3NDg+PD09Ojg6OD46Ozc4Nzc6Oj5DRDtDQj49OD1AQUM/Pjw+RTw+PUJNUF/S4+Hi4uLj4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk2NjY3MB2doCCfnp4eHBsdXlya399bHNvdGdoaYB/aWh4c2d+iYl4cIKGe3d9foWKvd3b3Nzc3Nzc3Nzc3Nzc3Nzc3d3c3Nzc3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODflGttZm5mU1NJUFlUTEhGTkZGRUJGPTs+PDs5Nzc4NTc5NjQ1NzU4PDs9Pjo6OztAOTs7ODc6OTlAQkE8QUE/Pzk/QEJFQ0FAQEM7Oz1ES01g1uTi4uLi4+Pj4+Pj4+Pk5OTk5OTk5OTk5OTk5NnZ2tmYc3uqhJaCcnR1dn14aGx8d2h4d25rcHR5gIN2dHyBhIJ9c3CAin94gn95g8je3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3N3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f4N/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODh24tubWdzY1lRTVVbV0hDSUZOS0dCRD8/Qjo7OjY2NzU2NzY0ODc2Ozw7Pj86PDk8Qjg3OTo6Ojk6QUFCQUJDQEE+PT9CQ0NEQUJGOTg9REpOYtjk4uLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXZ2drcqHGCtXiRfnNsem6EgXaCfWtoan+DeHZ8dX2FhXRmcHl9d316gIqFe318foC03tzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3dzd3d3d3dzc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3Nzd3d3d3d3d3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e397e3t7e39/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4ODg4ODg4tiFb3FrdWFWT1VVXE9ETUY+SkdKRUQ8P0I6PDk4Njg0NTY3NDc2NDk7Ozw7OD47PEE4ODo9OD04Oj09QEBAP0FCP0A+QENCQ0FBRTc2O0RMTmPa5OLi4+Pj4+Pj5OTk5OTk5OTk5OTk5OTk5OXl29ra3Z5sbnNxhY1ybXBuf391hH5rcnZ2enN4gXhzb3VwbWt2fHmFiIB/f392coODsd/c3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eDg4eHh4eHh4eHh4OLXhW1xb3ZeUldTWlpRSkhDQFFAQkQ8OT9BOjw5NzU3NDU2NjQ3NTY9PDo9PTk+OjxAODo6PDY7OTs+PUJCQjtBQkBDQEBEREM8PUA3OjxFS01l3OPi4uPj4+Pj5OTk5OTk5OTk5OTk5OXl5eXl5dPOxsB+cWxveHt2b3VuanNzbZKGeG50dG5vdIZ/b2twboJ0bXZyfY2DdnF/d3mKgabf3Nzc3d3d3d3d3d3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3dzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi1oZucG1xYFJZUFdfWUpMTElSP0Q9OTtCRjs6OTc0NTY1NzU0NjY2Pj07Pz45PTk7Pjg9Ozo0ODtAQENCQ0FCRkE/Q0BBQkREOz0+OTs8QkxNZODl4+Pk5OTj4+Tk5OTk5OTk5OTk5eXl5eXl5eW5t7Woc3JscHd6dHd4bXFydXd/hHRyc2xsa3F8bnBudGuBf3GAd32Eg355gHNygYqg2d3c3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7d3d3d3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4eHh49WHcWxqbF5YWlVXYFZWUE9QTD1BOjs8RkE4Ojg3MzY1Njk2NTg1Nz89Oz8+OT04Ozw5PTs7NTo9Q0JCPENDREREQUE/PkJDQzw9Pjg5PENLS2PN0dnh1sjY4+Tk5OTk5OTk5OTk5eXl5eXl5eXltbW2q3J5cm59f3Z1d2hqaGlwb3Zta2tnZWZxdG15gG5teXd2iHhxa2podXV5dHV/wd/c3d3d3d3d3d3e3t7e3d3d3d7d3d3d3d3d3d3d3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHi4uHh4ePVhnFwY2lhV1NZV19MUk9STUtAPjg5O0E+ODc5NjQ3Njc6NjY2NDk+Pzo8Pzo/OTo6Nzo9PDk5PEFBPTtBQ0VDRkA+Pj5BRUQ+QEE3OD5GSEpesrW4wbm1u8jg5eXl5OTl5OXl5+fn5+fm5ebm5ra2tbWOfX5weoR1cnZnYmNlbGtyb2ZpbHZtd4Z9hXlsbHd4a3ZwfH14c3V5fHd2h7ng3d3d3d3d3d7e3t7e3t7d3t7e3t7d3d3d3d3d3t7e3t7d3t7e3t7e3t3d3d3d3d3d3d7e3t7e3t7e3t7d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4eHj1Yd1bl5uY1pUU1hXS1NLSk1SR0E4Ozs+PDk4NzU2NTY2OTY4NjY5Pzw6PT07Pzo7Ozk8PDs5Oj4+Pjs8PUFEQkNBQEBBP0JDPDw9Nzs+REVKXrG1tLW2t7e2y9rJ3uXl3eDi3tXU1tPU4OPg39+2treuh3t/bnmNenJ1bWNobGxtaXR4enF5enqIh4N6aWh9cWRvcXyGgX55e318e4an2t7d3d3d3d7e3t7e3t7e3t7e3t7e3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eLi4uLi4uLi4uLi4uHh49aGdmxhb19dV1lcWlJQSEpXTEVHPUA9Ozs9OTY0NjU1NTg2NzY3OD87OT09PDw5OTw6Pjw6OTg+Qjs7Pj5AREBDRUFAQD0/QDw9PTU5PEJHRl2xtbW2uLm5ubq9uMPT0r3BwcC6u7y6u8TMxb/Dt7e3hGl1gX1ndYd5Z3Vxa2t5eHB3fH15bWl3e3h3bml1j4FwbHl4d3d9gXuGgnmAoNze3d3d3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODh4OHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4ePXhXJrZ3RhW1hYX15TVVVRVUpMRj9JRDs5PTY2NDc3NTc4Nzc3ODk8PDo+PDg8Oj0+OTs8OTs5P0E8PT9DP0FARUJCQTw9Q0A6Pjw1NDlER0dasbW1tre5ubm5ubm3ubm4uLm5urq6urm5urm6u7e3uX9ucHN6b3B/eXNuc3Vsc3Z4cXFwb2tvcX6Bc2mHhIF9dHOHdW11hYmBgHJ2hafd3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uHj14lxa2xyW1dXXWBUUVVUUFJPSkNATUE9Ozk2NTM0NjQ2ODc3Nzk6Pjs8Pjs5PDo8PDk8PTw7PT0+PUNEREBDQkE/QD48PkE8OD06NjY6QkpIWLG1tLa2uLm5uLi5uLe3uLi5urq5ubi4uLi6uru3uKx7cnhxf3ZzfnBsbXpyZ29sbW50cHt3d3Jyd3pvhpJ2f3x8enZ5fH9zfYdyda3T393d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4eHh4eDg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi49eHb2pxalVWV2FbT1FSUE5XSURESUo/Ojk6NzUzNDk1NzY2Nzg4Ojw7PD46PDo6PTw5Ozw9Oz09PDs9REdEQ0E8PDw8Pj5AOzg8ODE1OkFGRVautbW1tre4uLm4uLi4uLe4ubq6uLi3t7i4ubq7t7mqcnB4d3x7e4J3aG5xam9qY2lyf21zcn54dHFsanaAeX2AgH91doB1a4qLgHaR1d/d3d7e39/f3t/f3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f4N/e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHi4uLi4uLi4uLi4uLi4uLi4uLi4uPYhm1sdGVWUFxnWE1YU1JRWUVDS1BOOzk4ODc1NTM5NTY2NzY4ODk+OT0+OTw5OTw7Njg5OTo8QEA9PkBGQEJCQDo+PEE9Pzs7OzYxNjxCR0RQqLa1tba2tre4t7i4uLi4uLm6ubi4t7e3t7e5ure2tIlyd3h9iXxwem99c2hqbGdnbHRscXd0cWx2c3Fxd3FyfHl4g3Z7d2mLkYp9kM7f3d7e3tvY2drZ297f39/e3+De39/f3Nvc3N3e3uDg3+Dg4ODf3t7e39jS397f397e3t/f3t7f3t/f3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f4ODf4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eLi4eLi4uLi4uLi4uLi4uLj4+Lj4+Li4uPj4+Pi4uLi4+Lk14NoZ3VkVlVkZVdKWllXW1Q9RU1LSD04NzU3NjQzOTQ0Nzc1Njc5PTo9Pjw9PDk7PDk5Oj45PD4/PkFBQ0FFRUQ+OzxBPjw5PDs3Mzc+REhFSqG2tbW1tbW2tre4uLi4t7e4uLi3tra2tra3uLm2traLfXpsbHp/cGx5dm5qaGdlcXp4b2lvb3B1c21zd4Fnb32CgYNyf3lqcHJ6f6ng393Zy8a/vL2/vsLN0tDW3tnc4NfQzcPCw8PH1dfT2dzX1NjX0MfExce9vM/Kz87Y3djO3N3c2t3T0dze39/e397e3t7e4N/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eLi4uLi4uLf4uPi4eLg4d7W29/Sw8rJx9Hb3OLk4eHg2dre1sbExcTN2trf5OHi4trX3st9aWZxYVleZWFNTFRLUlpMO0hNSEZBPTc2NjUzNDY2NDg3NjU2OTw7Pj46Pjk5PDk3OTs7Oj49PEBAQ0RCR0ZCQT08Q0A9OTw7Nzc3P0RGRkaZtrS1tbW2tra4uLi4uLi3uLi3s7W2t7a3t7i5tba3opdxb29waW50dnFmZWNrbmdvcm1mZ2tygWVvdnyAeGRzj39zaHFyaWVlbm+w39HFv7u5ubm5ubq6uru6vc3Gw8e/urq6uru7u8HCvcHFvby/vry7urq5ubq6ubm6w8XDucDDwby/ube/z8/U3tjc3t/g3tLa4N/f4ODg39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eDg4ODg4ODg4ODh4eHh4uLi4eDh4uLi4uHa2t3RwsPCu8XT1uDdydPDrrnAsaqrq6uwtLbJ0sXRxLG4v7Srq6usr7S0vMzE1c60tLureGxtbWBdYl9ZS1NVVFFQREBRTUhEPzo3ODU3MzE1NjQ5ODQ2Njo8Oz08ODw5Njo6ODg5NzU8PDw/QEFAQkRDQkE8PkI/Pz09PTc1OD5DRUNAj7a0tLW1t7i4uLi4uLm5uLe1sautr7Oxs7OztLS0tqaei2tue3ZxeXhnY2hfcXdha25vaG99b25ja2lseHdsa4Z+bHB6dm1scG95sca8uru7urm5ubq6urq6urq6urq6urq6urq7u7q7u7y7urq6ubq7u7q6urq6urq6ubi3t7i4t7e2tbW1tbi3u8e+w8XHzcS4wMnH0tzZ2d/e3uDf39/f4ODh4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh3Nji4uLi4eHh4OHg3tfGxtHQztTe3tPO0t/SuLi8sq2trKysrrG+ua63rKipqamqq6urqqqqq6ysuKyqqqqrq6urra6urq6urryzrayrpHlub21fXl1dVE1SU1xUSkE/UElIPjg5NjgzNzMwNTczNzg1NzY2Ojw/PDg5Ozo6Ojg5OjY1OTs8Pj9EP0NFQkNCP0BAQT9APjw3ODc6QUVEP4W4tLS1tbe4uLm5uLi3t7SurKuqqq2urq6vsLGzs7WjcG5ucm1wg311aWFlaGZkY2Rxc21td25naW1tZXBzb29zcXN8h4F6dX11n7u6uru7urq5ubm6urq6urq6ubq6urq5uLm5ubm6urq6u7q5ubm5ubq6ubm6ubm4uLi3t7e4uLe3t7a2tbW2tra1tbW1tba1t7e3t7rBvrzGycrb3+Dg3tvd3d7h4tDW4uHg4ODg4ODg4ODg4ODg4OHg4OHi0768zNjd3OLg0dnbxL23sLCxsa+zu7uzsLS9s66urq2tra2sq6qqqqmpqKmpqampqqurqqqqqamoqampqampqaqqqqytrq6urq6urq6sraR4aWJxZmFZWlZRUk5cU0Y9QlJEQTc8OzY5NTY1NDU2NTg3NTY1Nzg7Pjw7OTk5Ojg3Nzk3Njg8Oz47RD8/Q0BBREE+P0M9Pjw+Ojo3Nz9DRj54srCztLW2t7i3trKurq2sq6uqqaqtraysrq+xs7S1t4xucnRqaIB5ZmpmZWxdaG5waGxxYmNmcoJ+dmhobGpueoaBhXx4cXF5gK+6ubq6urm5uLm5ubm5ubm5ubm5ubm4uLe3t7e3uLm5ubm5uLe3t7i5ubi4uLi3t7a2tre3t7e3tra2trW0tLW1tbW2trW1tre3t7e3t7e3tre4v8bP0MS+v8DE19e8ydra4OHg4ODh4eDg4ODh4eDb3t7Uzby3tre6wMDJxLfIvrKwsLCwr7Cvrq6ur7Cwr66urq6uraytrKurq6qpqampqampqampqKmpqKmpqampqKmpqKmpqqqrraytra2ur66trK2heWpkbWdiXFhRUFFLVEpCOklRP0E3PDk0OjU2NTQ1NTY4ODY4Njs6OTw9PTs6ODY2ODg6ODY3Pj09PT5BQUVCQkNBQUBBOj09Pz05Ojc9QUc8bKqmqKutsLGwrqupqKqrq6mpqamrrKytra2usLO0tbilgIdvaWdzdGZrcG1qZGxvcm5rbWNrcHyJhG5qbHx4Y3uKfnNqc25rcY+7ubm5ubm5ubi4ubm5ubm5ubq5uLi3t7e3t7e3t7i5ubi4uLe2tra3t7e3t7a2t7a2tra3tra2tbW1tba1tLS0tbW1tra2tra3t7e3t7i4uLe2t7a2uLm4uLe3uL6+uLq9vcfb4OHg2Nnd4eHg3dfKwcPCurm5uLe4uLi3tbS0tLKysbGxsLCvr6+vr6+vr6+vr66ura2srKyrq6yqqqmoqKmppqepqaehpaipqamoop+hoZyip6inqausrK2ur7Cwrq2unXhwbGphY2BZUU1RTFJGQzlNUEU+ODs3Mjc5Njc0NDM1Nzg3OTc7Ojo9PTw6Ojk3NDo5ODY1OD8/QEI9RENDQ0FDQEJBQDtAP0A/PDw6O0NIPWOopaWlpqioqKenp6ipqqmoqKipqqqsra6wsLCztLW1taWYdn5xZmt4cW9tZmVsaGNsZ2ZpaX11bWlvfXZ5hWZod294b3Fvcninu7m5ubm5ubm4uLm6ubm5ubm5ubi3t7W1tba2tre3t7e3t7a2tbW2tre2tbW1tra3t7e2tbS0tLS0tLS1tLS0tLW1tba2tra2t7e3t7e3t7a2tre2tre3uLe2t7i4t7i4uLi4wMXTyry8w83PyMC9urm5ubq6ubi4uLi4t7W0tLSzs7KysrGwr6+vr66urq+vr6+uraysrKurrKysq6ehoJ6gn5udoaGdlpmkpKaon5mZmZmanZ+gn56fpKqtrq+ura2srJl1cGlrY2FeXVVOU0tSREQ4TktHQTo4NTI2OTY1NDczNzc3ODk3OTo7PT0+ODg4NzU6OTk1OD9AQEFEPkZBQkNAQkNCQT88QEJCQD0+OjpERj5cpqWmpqampqanqKenqKioqKenqaurrKytra2ttLS0tbekc311bnONf3JmanFjaW1jaGZobG51aV9jZ3VzdnpuZ3Bwcn56cYihu7m5ubm6urq6urm2s7a1uLm2trW1tra1tbW1tbW3tra3tra2tbW2tbW1tbS0tLa2t7e3tbS0s7O0tLW1tLS0tbW1tra2tra2t7e3uLe3tra2trW2tbW2tra2tra2tra3tra3uLi3uri4uLi3uLi5ubm5urq6urm4t7e3t7W1tLS0s7OysrKxsbCwr66urq6urq+vra2srKuppaSmpqScmZubmpmampmXl5eXl5aZm5iZmJmZm52en5+dnJ6gpKWko6OioqKQdG5jcGFeXltUU1RIVEo/PFFCRkM7ODYzNzo1NTQ4Mzg5OTc4OTc7OTs9Ozc6NzU2OTk4NTg+Pz9ART5CPz9DPzxBQUI/PT9EQT8+PTk9Q0Y/VaSlpqanqKeoqamop6ioqKioqKiqrKuqqaipq7W1tba5o3eKcXKHhnd0cGh5a2JjYWVsaW5zal9jZWNjZWprYmRqbHaXjX6ovbm3tre5u7u6uLWxrKurqq6wrKyrq62tq6uvsLGvr7CytbW2t7W1trW1tbW1tbW2trSvr7O0tLSvra6vsrW0tbW1tbW2t7e3t7e3t7e3t7e3t7Owsra1tLa2tre3tra2tbW1tra3t7e5uLi4t7e3uLi4ubq6urq5uLi3t7e1tbS0tLS0tLS0s7OysbCvr6+vr66vr62oo6KgnJqampqZmZqbm5qampqbmpmZmZiXl5aYmZmZmpycnZ+foJ+goKChoaCgoJ+fi3RuaXRdYGZeUlRLRFRJPUVTSEVCOzo0NDY5NDQ1NzM4ODg3ODk5Ojs7Pz04OjkzNTg5NjM5PT5AP0A6QEJCQkA/QEJCPz0+QUFCPz06PkVDQFGjpqWlp6inqauqqKaoqKipp6ioqKinp6ioqaq1tbe3t7KZtH99kIx1Z2lqbGZjYGNoZW94cGlicXx5cGpmZmRma3NqhYystrKwra2ttLeysLCtrKuqqaiop6ipqampqKinqKipqaeoqqurra2sqqytraysrq6traunpaSnqqyopKOkpamwsbGztbW2t7i3t7W1tre4t7e3t7Kppaasq6ivtLa1s7W3t7a1tbW2tra3t7e3t7a2t7e3t7m6urq5uLi3t7Wxs7S0tLKxsK6sq6yurrCxsK2rqqmqqKijnJqZmJmYmJiYmZmZmZmZmpqZm5ubnJybmZeYmpqcnJydnJ2foKGhoqKioKGgoKCfnop1amtuWVxhVktPREdVRz5PV0hEPTw4MzQ0ODQ1NDgyODk4ODk6Ojw5OUA8Njk6MzY3OTE0PD8/QEBBOkNGRUJBREJDQTo7P0FCQz9APUBEQ0BPo6empaemqKqqqqakpqenqKioqKimpqaoq6uttba3t7e4rbJ1cHuDdmBiaWtiZWZhZGdmfYh5bHKAfXFvcXhjbW5xZo+srKurq6ysra6urK2trKyqp6WmpaWlpqioqKiopaeoqKioqKeoqampp6Wko6KioqOioKKioaKhoKChoaKjpKOjpaWlqLC0s7OzsKuqqaqztLa3trGopaOioaGipKiqqairs7Sxrq6xs7W2tra3uLi3t7e3t7e3t7a2uLe0sa6ppqerrKmnpqWkpKSkpKWoqaajoJ+enZycm5uampmZmJeXmZmZmJiZmpqampqampqbm5mYmpydnZ2dnZucoKGgoaOjoqCgoKCfnp2FdGtsaFdYU0pHTUVITUdAU1dGRz09OTM2Mzc0NTU3Mzg6Ojo6OTw9OjpBPDY9ODM3ODgzNztAPz9AQDpCRUNAQkRDQT87PEBDQkNBQDxBQ0A9TqKnpqanp6mqq6mkpaWlpaaoqKippqanqKmpqrW2tre3t7izc2h7c2JnamtpaWJhZGloXV1tfHJma3J/fHR8bm1zc36gqamrq6uqq62trKusq6mpqKWjpKampqWmp6eqqaamp6enqKinp6iop6WjpKKhoaGhn56en5+fn56foKGho6Wko6OkpKSmp6enpqWkpaampqeqraumpKKhoaChpKWlpaenpaeoqKalpaivtLa3trW1tra1tbOwrKupqa6rqKWlpqampaSkpaWlpqWkpKSkpaKhoaGgnp2bm5ucm5qamZiXmJiYmJiZmpmZmZmYmZmZmZqZmZydnJycnJybnJ+fn6ChoaKgoKCfnZ2cgHNrbmReU0pITUZETEtFRFFTQ0c9PDgzNjI4NDY0NjQ4OTg6Ozk7Pjw5PTs5PTczNTk2NTY8QD0/QD88P0JDPkJCQj89Pj5CQ0FFQD86PkVAO0+jpqWkpqeoqaelpKWlpKWnp6eoqKanp6alpqa1tba2trW2uYptcW1vfHxxZ2pmYGFsYFROW2hqbm9tgYJ9cWdxdn6aqKeoqqmpqqurrKqqqqimpaWkoqOlpqalpaWmqaqppqWjpKWmpqSjo6KioqKgoJ+fnp6cnJycnJ2dnJ2en6CioaKjo6KhoqKkpaSioqOjpKSjpKSko6Ggn6GipKanp6ipqaelpaSipKSlqK2wsKyrqqusqqmnpaWmpaWlpaalpqioqailpaWkpKSlpKOjpKOioaGhoqKgnp2cnJubm5qZmJiYmJmam5mXl5eWlpeXmJiZmpqcm5qampubm5ucnJ6goKGgnp6enpycm356bnJiXlNNSlBFRk5NQkBPRT5JOz01MzYzODM2Njc1Ojs4OTs5Oj49Ozo5Oj43NjY5NjU2PkI+PkE/PT5DQT5DQ0BAO0BAQkJCRUA+Oz5FPzxQoKSjpKOjo6SkoqSlpaSlpqamp6empqalpqaltLW1tbS0tbiBaHx9ZXOCemxwdWFfY1ROT1FbaGxpbGxxbW5xbnScoqSnqKioqauqqqqqqaempaSjo6OjpKSlpqalp6ytqaShnp2eo6Shnp6foKCenJ2dnJycmpqam5ucnJubm5ydnp6foKChoJ+goaOioKGjpKSjoqSlpaWkop+go6SkpKapqainpaGdnJ+jpaipqainqKioqaempaWkpKSlpqampqampqenpaWko6Ojo6KioqGhoqKhoqOkop+enZ2cmpubmpqZmJeXmJaWlZSUlJWVl5iYmpubnJuampqam5ucm5ucnp+fnpucnJyam5p/fnF0YFtUTUdNSEZMSj8/TkM8QDs8NDM4Mzc0NzY3ODs9ODo6OTk7PTs7ODk9Nzc4OTU4OD9APT9BPjs9RD89REA/PzpAQUE/QUVAPjw8Qz88Tp2ioaKioKCipaSkpKWlpqenp6empqampaampbW1tbS0tLS3jHalsXdmc3Jvc2xjZGlYT1JRT09dgG1kYFptkZGSoqKjpaampqenqKiop6alpaSjoqGhoaKjpaempqesrKemoJ2cm6Ghnpuamp2cmZiam5qampmZmZubm5uampqampucnZ6goaCfnp+hoJ6foqOko6Omp6inqKWioKGhoaGkpaWlpKCcmZmbnqOmpqampqanpqempaOlpKWlpqiop6enpaWlpaWkpKOjo6KhoqKioqKhoaKjo6Kgn56enZybnJubmZaUlJSTk5OTk5SUlJWWl5qam5ubm5qZmZqanJ2dnZ2dnZuampqamZqXf3dvc11aTkhKTkdFRklERU5APD09PDQ1OzQ2NDY1Njc5Ozg5OTg5OTw7PDc6Ozc4ODg1ODg/Qj9BQTw+P0A8PEJAQT49QT4/Pz1CQUA6OkA8PE+doqGfoJ+dn6OkpKSlpqeoqKenp6ampqampqW1tLS0tLS0tbSXtqd1Znh2Y2xjY2VjW1JTU1JNXqCMeFhodpajnp6hoaOjo6OjpKSlpqalpKSioaGko6OjoqOlpqWmpqenpp+bmpuioJmWlpWam5mXl5iYmpqYmJqampqbm5qZmZmenZ2goqOjo6KkpKWinqGhoaKjpaampaSjoaCgn5+hoZ+goJ2amJeZmpygpKOjpKWmp6alpaOjpKSkpKWnp6ampqampaWmpKOjo6SjoqKjpKGfoKGhoKGgoaCfn56dnZyamJeVk5KSkpKSkpOTkpOUlZaZmpqbm5qampqbnZ6enp2cnJybm5qamZmZlH10bHReWk9IRUdGQkVORT9GOzo+Pzs0Njo2OTM2NDY4ODo4OTc4ODo8Ozw5Ozs6OjY3ODk5Pj9APjw9QD5AOjlAQT89QT8/QUE+QUE/Ojk9PjpQnaCfnZucnJufoqOlpaWlp6iop6ampqanpqantLS0tLOysrGwsK2rkHiGj36bmn93Yl1TUlFRTGKgootaiKCgn52YmZycnZ2eoaGgpKenpqWkoqGjp6alpaKipaampaanpqagm5mboaCXk5OSl5qcmpeXl5iampmampqam5qYmJmaoKCgoKGfoaKipKamop6gn5+goaOko6Khn56enpyanZuZmpqZmJeZnqChoaKioqKkpaWmpKSkpKKioqKkpaWlpaWlpaalpaOko6KioqGgoKGgnp+fn5+fnp+foJ+cm5qZl5WUlJSTkZCRkpKSkpKSk5SVl5iZmpmZmpqam5+fnp2cnJycmpmZmpiXl5F8cmdxXl1QRj9BRD9KT0JCRjhDRT4+OTg7Nzc0ODQ1OTo6Ozk3OTo8Ozo8PT48PDo2NzY5OD4/QT47Pz49PDg6PkFAQUI/P0FCQERBPjo4PkE8U5ycm5uampycnaGio6KjoqSmp6alpaampqSjo7KysK2rp6amp6alpqiln6iop6qnoXmEXFFST0xcnKCAYpmgnp2clZOVlpeZmp2dnqGmpqampKOioqanp6ajpaampaWmp6amop2cnqGfl5GRkJSXm52YlpaWmJuZmpqampqZl5iam6Ghn56fnpybnJ6goJ6dn56fn6Cio6SjoqCfnp2ZlpeXl5iYmZubnqKioqKioqGio6WlpKOio6SioaGhoqOkpKSko6SkpKSioqKhoqGgn5+gnp2enp2dnZ2dnp6em5mYl5WTk5SUk5KQj5GSkZKSkZKTlJaXl5iYmZqampyenZ2dnJubmpiYmpmXlZaNempmamBiTkY+P0A9SkVAQ0A7QEE8Ojs5Ojc2NTg0Njc4OT04ODs6Oz87Ojs8Ojk6Nzc2ODs7Oz08Ojo8PTw3Oz5DQkRDPz1BQ0BEQT88OkBCO1eZmJqamZmam5ucnp2foqKhoqSlpKSlpqSioJ6op6alpqWlpaemp6ampqakpaanqKehqXJOUU1KVJahenKanJyenJeVlJWWmJiXl5qeoqKhoqOkpKOjpaalpaanpqSlpqalpaOgoKGhn5mSkI+WmpmenJaXl5eZm5ycnJqamZeZm5uen52cnZyZmZqcnZydnp6fn5+hoaCgoaKgn56bl5WVlZeanZ6fn6GhoqKio6OhoaCgoJ2cnaGioqOkpKOioaSlpKOko6SjoqKioqKhoKGfn52cnZ2cnJ2dnJ2enpqXlpaVlJOTkpKSkpCRkpKSkpGSlJWWl5iYmJiam5ycnJycnJ2cm5mYmZiWlJWXi3hsY2RiZFFHQT1DO0tIRDo7Ozw+OTo6OTo3Mzc5NTo4ODg8OTg7OT09Ozo7Ojk8PDc2NDc/PDo9Ozw/Pjw7ODxBQ0FDQkI+P0JAQkFAOj9APztZmZiampqam5ubm5ydoKGhoaGhoqKioqKhn5+dpKWmpqenpaWmp6ampqWkpKalpKSkpaaGUFJQT0+PmHB6mpubnJ6cnJycm5ubmZiYm56dnp6foKOkoqGhoqKio6SkpaalpKOjoaGhnpyalZOUmJuam56amJiYmJqcnpyam5iWmZybnJycnJydmpqbnJ2dnp6dnp6fn52cnJyhoaCblpWVlZacoKGgn5+hoKKjoqOhnZuZlpaWlpicnqCip6ikoaCgoqOjoqKioKCgoJ+fn5+gnp2cm5ucnZydnJmanJuWk5KSkpKUk5KSkpKSkpOSkpKRkpSVlpeYmJiYmZqcm5qbm5ucnJqZmJiXlZWWl4d3ZGdoZGJNQ0U8RDlJSkU5Ojs9PTo6ODg6NjQ3OTU8OTY4OTc5PDs7PDo6PDs6PDw4Nzg3Pj07Pj46Qj86Ojo/QURCQ0FBQD9EQUFAPjpAPj06W5qYmZqbmpubm5uen6CgoaKioKCgn5+enp2dnKWkpaanpqWlpqakoqKio6Oko6Kjo6KnllRYVVJOZ21rgZ6am5udn6Cgn56enp6dnJ2dnJ6enp+goaCfn6CgoKGio6Ojo6OjoqGgnpuZmZiZmZmamZienpiYmZmam5qWlZeWlZicnJ2cm52dnpybnJ2cnZ6bmJqeoaGdm5udoKKhmpWVlpaZoKKgnZueoKGjop+em5eXlJKSlJeYmZ2goqenpaGgn56goaGioaCfnp2cnJubnJubmpqZmpydnJmXmZaVk5GQkJCPkZKSkpKSkZKTk5OTk5OTlJWWlpeXl5manJubnJucnJqamZeXlpaVlZSEcmZsYmRbREJMPT84RktCPEA+Pj05Ozk6PTg1ODg2Ozg1Njo4PDw7Ozw8Ozk8Oj09OTU4Nzw5PD88OkE/Ojo6QEBDQkRBQ0A/Q0FAPj08QD09Ol+al5mamJeYmpycn5+foaGhoJ+fn56foKCenZ2lpKSko6OioqOjoZ+foaGipKOio6SiradXXl1UV19ua42dmpqbnJ6dm5ucnZ+enZycnJydnZ+goKChoaGgoKGgoKGioaGioZ+enJqampqbnJqZmpuZnJ6ZlpaWl5eTjo6QlJabnJuam5udn52cnJycnJ6dlpSZnJ+in5ycnZ+hoJuXl5mZmpycnJubnZ6fnZqXlpaWlJOTlJiampqfoKGmpqWgn56fnqChoaCenJubnJybm5ybm5qZmJmZmZmXl5iVlJKQkJCQj5CSkpKSkZGTk5aYl5STkpSVlJWWlZaZmZmam52cnJyampmXlpaWlpaQgG9vZV5gV0BKSDg/N0lFP0VBPD07Ojo7Ozs3NTs4Njs3NDY6Oj47Oj0+Pj07Ozs+Ozo4Ojk5NkBBPTo8PTo7OT9BQ0JERUM+P0FBPz8+Pj89PDtgl5WXl5aVl5mbnqGhoKGioqCenp6enqCgn52bpaWjpKSioKCfoJ+dnZ+hoqOjo6OkobCjXWVkYGFua4GenJubm5ubmZianJ2enJubm5ycnJ6ipKGeoKGhoqKhoKCgoaGgn5+enJqZmpubm5ybmp2dm5manJiXlZWWkY6Nj5KYnZycm5ycnqCdnJucnJyempWVm56foZ+dnJyenp2cmpqampqampqbm5qXl5aTkpWVlpWTlZaam5qanZ6foqWjnp6fn5+en5+enZ6fnZycm5qcmpqbmpiZmJiYmJiYlZSTkZCRkJCQkZKTk5CRk5SYmZiVk5SVlZWWlZaXmZmXmZqenpyamJiXl5aWl5eYjX1ubV9lVlRFSzw3PjdSRUM+QkE4Ozw7OTg6ODY7Nzc6Njc5Oj0+Ojw8PT49PD06Pz06ODw9OTtAPj4/PT45OTs/QkNAQ0VDPT9DQj5AQD5APTw8YZWSlJWWlpeanJ6goKCgoaCgnp6enp6gn56em6WlpKOioJ+fnp2dm5mbnJydnp+gn56rmGNpbW5pZm2enZybm5ybmpmZmZqam5ucm5uam5ygo6SgnZ6en6CgoKCgn6ChoKCfnpuamZqam5ubm5ufnpyZmJqamJiYmJKOj5OXnJ2bnJ2cnJycnZycnp6dnpqVl5ygoaGfnp2eoJ+cnJuampqbmpqYmpmVk5OTkpOWl5eVlJiYmZucnJydoJ+gnp6enp+fn56en6KjpKKgnp6cm5qampuZmJmZmJeXlpWUlJORkZCQkZKTk5OSkpOUmJmYlpWUlZaWlpaWl5iYmJiXmZqamZeXl5aXlpeWl4l4dmddX1dURUU5OTs8WT5AOEI/OTs7Pjk4Ozg6Ozc5OjU4OTs9PDk9Oz0+PD0+Oz8/Ozk+PDw+Pz5AQUE9ODc7QkNFP0FFQz1AREJBQEQ7Oz47PGKWk5SUlpWUlpiYmZubnJycnZ2cnJ2en56dnJqkpKSkoJ+enpybm5qZmJiYmZucnZ6cpolla3R4bVuFop2dnJydnJqbmpqampydnZ2bmpuboKKinpucnZybnJ2enp2dnZ2fnpyampucnZycm5ycnp6cm5qanZqam5yVkZOXm52dnJ2fnZycnJycnZ6fnp+cl5idn6GhoJ6cn6CfnJubm5qbmpmZmZmZl5WWlZaYl5eXlpaYmZuenp2dn6GhoJ+fnp6fn5+dn5+hoqKhoZ+fn5yZm5qcnZuampmXlpaYl5eXlpWTkpGTlJSTlJSUlJaZmJaVlZeZmJeYl5eXl5eYl5iXl5eXlpaYl5eVl5eDeHZfW11eUT1GOjk4P1VDQTtDQzo8Pj86Ojk3Ozg4ODc0ODk8Ozw4Ozs8PTo9Pjo/QT06PTw+PkBAPUBBPjk2PERDRUBBRUU9PkVERD9COzo8OTpkl5SVlZaUlJSUlJWXmJiamZqcnJydnp6dnZybo6Oko6CenJuamZqZmJiYmZiam5ubm6WJa3F2em9lmp+enp2dnJybnZ6dnJ2enp2dnJydm5ygoJuampubmpudnJqampucnJuZmZycnJ2dnZ2dnZ2dnpybmp+fm5ydm5mZmZudnZ2dn52dn5+dnJydn5+fn5uanZ+goJ+dnJ6gnpubm5ubm5yampuamZudnJqZmJeYmJiYmp2foKCgoJ+hoaGgoJ+en5+fnp6foaKhoJ+enp+enJqam5ubmpqZlpaXmZmYmJiWlJOUlJWVk5OVlZSVlpWVlZSYmZuamZaWl5WWmJiWl5OUlJGRk4yRkJOWfXhqYWJiXFA8QDw2OENWSERCOjg7Oj47Nzc5Nj06OTk2NDc6Ozw9OTo6Oz87PT08QD47Oz46PT89PkBBP0A8NztBQ0U/P0REPj9EREM+Qj07PDs6Z5aTk5OTk5OTlJSVlpeWl5aWl5mbm5ybm5uamaOjoqCfnpuamJeYl5eXmJmYmZybm5qkgGpqb3lzcZegnp2dnJydnp6enp+enp2cnJydnp2bnJuampqam5ubmZiYmpqamZmZmJqdm5ydnZ2dnJ2cnZ2cm5qdn5ucnJubnJubnZ2dnJydnp2enZydnZ2cnJ2dm5uenp6dnZybnpubnJycnJydnJubmpmbmpmYmZmYmpmZmpyfn5+jpaKfoaKioaGfnqCgn5+fnqCioaGhn5+fn52ZmpudnZqZmJWWl5aVlZaTkpOUk5STkJCSk5GUkY+OkJGOlZabmJWYlJmXlJiRjJCPk5yTkoyFjIeDhndxZ2pkW1xRQT44NkJHYEJFR0A+Ozw7Ojg4NjU8ODo4MzQ6Njk9PTk5Ojw9Ozw6PD48Oj5AOj5APjw/QD8+PDg6Q0FEPz5CRD8+Q0VCPUJAPDw8OmeYk5KSk5OSk5SVlJWXl5aWlZaXmZmZmpqampqkoqCfn52bmpmYmJiXl5iZmJmcnZ2cqH1nZXN7enOJop+enp2dnp6enZ2enZ6enp2dnZ6cm5ybmpubm5ucm5iYmJmZmJiZmZmbnZycnZ6enp6enp6dnZybm52bnJybnJ2dnZ2dnJ2dnp+fn52cnZ2dm5qbnJmZnJ2dnZ2dm5uanJ2dnJycnp2dnZybmZeVlZeXmJqam5ubnZ6foqOhoKGhnJucm5ubnZqcmZycn6CfnZiZmZmUkpKUl5SPj4+OkYyNiYuQi4mLjpGRj4mQmJiQkoyNi5KQj5iYoqiqpqWlrKOmoZqep6eyqKKVo6Cfl39wcWlsXFtcTUY8NzdHR1g+SE5URjk+Ojg5ODc1PTk4NzMzOTY6Pjw6Nzo8Ozo6Ojo8PDs/PjtAQD47PT5BPDw2N0A+QkA+QUY+PEFEQT1DQj49PDlmmJSTk5OTkpOUlZOVl5iYmJaXl5iZmZqampqaoqGfnp2cm5mYmJiYmJiYmZmZm5ybnKx/am16f3lxh6Genp2cnZ6enp6enp6dnp2dnZ6enJubnJubm5ubm5uZmJiYmJiYmJmZnJ2dnJyenp6enp+fnp6dnp6dnJydnJ2dnZ6fnZ2fn56goJ+enZ2dnZybnJ2em5qbm52enZ6dm5ubnJ2cnp2cnZqYl5SRjo+QkJGVmJSWlJiZmpudmJuYlY2Mjo6TkpKRj4mQjpGRjo+Ki42NjYiIi4+Lg42NkY+MkI2Qk5WVnJihoJySn6SipKmam5eanKOprb3Bwbq8uL26ucC8ubq3uru7tL2zwbV/bnVmZ1peWUxJRTo7TElTPFZSSUM6QTo7Ozc3NTo6OjgyNTY4Oz08OTk7Ozw6Nzo4Ojw6PT85PD8+PDw9QTs5NTg8O0A/QT9EPTxBQkA8REM9PT06YZOTkZCUlJOTk5OTlJeYlpeZmJmYmZqbmpqamp+gnp+fnJqZmpqampmYl5iZmZmZmZmphXB1e4B3b4mhnp6enp6fn56en56fn56dnp6fnp2dnJ2cm5ubm5ubmpiYmJiZmZiam52cnJ2dnp2dnp6goJ+enZ6hoJ6dnp2enZ6fn56en6CenZ6enJydnZ2cm5qYnJuVmJqamJiYmJmSjJCXlKCXk4+MjYqKiImMiJORh5CPjYqKkJCLjoqMi4+IiImJjpGOjYaFiYaKhoWLiI+SkJCNkJKXlpKamJ2TlJ6kpqaqq7Gsr6+rpquqsbm5tbS0rqyvtMDIxcXBvsbDxMTDurW+t7a0s7C2tb6qcHRyXGZfXV1JRj8/RUtMVklcTEQ/PUI6Qzk5Nzc7OTk3MTc5ODo+ODg6PDw7OTc5Ojs9Oj4/OT5BPDs+PD46OTY5PDpBPkNBQT08QkBAPkJEPj8+OVyHhIOHi42KiYaFgYqMkZOVmJiHlZaWkpiampmenZ+gn52ampubm5ycm5iWmJmXl5ibqo56dXZ7f3mCoJ+fnp+goKCfn5+foKCfnp2dnp+enp2dnJqbm5ubm5uYmJiXl5iZm5ucnJydnp6enpybm52dnZycoaGfnZ6dnZ2dnp2dnJiWlpaYlZWSlpmWk5GKjI+PjI+NkIuLj4+WiYiEi5GZjn2Fi42PjYyHioyQm4yRj4+Lio6TjIyNjIiSi4yFiYyPhouIh42KhYyEj4qXkJOYmpWbnKOqoaKknKKrsbe0ubWxs62vsrKlp7O6sbq6vLa3tsDDw729vLa/urq8wbW4wL60r66mqa+3mm58Z1tjWl1fSEU+QUtJU1hZXkFGOTk9OUY/Pzo3Ozs7NjM6Nzo5Pjg6Ojw9OTk4Ozk7PDo+PTtAQDs8QjxAOjg0Nzw7Qj9BQj4+O0NEREBDQz0+PjlhmZWLkYWNj5aSiHl9e3+Fi4OKgoqJhmuAeJCLlpqRnZ2UlJGTlpeampiWk42Sk5KQm5uIdndzcX1/cpGgnZubm5yenZ2eoKGgm5uWlpucmpybnJuYmZqYmJmampqWi5CTlpmYlZiYlpucl5WSkY2SkZCUk5KXm5mYm5ePjpCLjo2Ch4uLi4qLiI2RjIeHhoqIiZGKh4yEhYqNi4qNhI+UkIyDkJOUmZWPi5STkZWRlpWOj5GMlI2Oj4qIj4ePhoeJiYmNiomJioWNh46JmJKUmpuXmKChp6Cko5qqqbO2sbWwqKmiqK6tn6qvsK21ubi8wr/BxLixtbCutrOwuL68ury+urOzp7G3wpB1gGNiXlpXUk1IRkVQSVlXX1tDUDpCQz1HRj84Nzo6NzU1OTc8OTw5ODo9Pjo6Nzs7Pjs7PTs9P0E7Pz48Pzo4NTM3OkFBQEI+PjpDREM/QUM7PT45Z6mloqKZn6CippeUiI2CiIJ1h4iKiIp7e3Z7enmPeoiSfn18en6CkYWBgH1zfH99fISHfnRweHZzfHaBj4iIiYeIioyMkZicl4iOhIuNi4iNkI+Pi5GPi4yOj5CQjouFhYeLjIyHiIuOi4eMhYaBjYuGiop/iYqGiJiRiIOIg4KFfIuLjIaJi4iKkIyIi42PjI+Wh4mLio6NjY2Wk5OdnJyalpycm56bmpuYnZeTkZWWkJKRi4+LlpSMjYqDi4SEiYyQkIqOio2LipGJjZOTk5SVk5KcmZ6Xn6CfpaKvsamupKSfmKStpqa4t6ysu729wsPAv7+vpa2wsLS3uLO0uLa0ta6stK+4tLaBeXpjZmBeVlBRQUVLT0lcXl9UR0dCS0xCREA9ODg7OTU3Nzk3Ozc9PDk9Pj05Ozg6O0A8Oj06PkJBOD88Oj84NjQyOTtCQD9CPj04QUI/PkBEO0A+N2CloJqXnaGaoaCPl5efl5WCjaCfo6GdmpKOjIxycXBvdnFucG1ucHZub29waHBxcHR+c3FycXd7cnl2d3Jyd3Z6e3l8fXt/iIGEi3+PkYaNi4uGiouLiYaEgYaCgIKJkYOAg4x/ho+LiYWAh32AgZKQhoSEho2DhIyPj4+IjY+Hi4iRkJWRjpCKk5eOj5WYp6SfnZWYlpaln5udq6aqt7W4srGnr6qnpqGfmp2WkpWVkYqPjImTjZuVjYuLhoaJjJWQkJCLmZKVlZSbkJiTlIyNkYyWl5WilZ6mqauno6OqsJucpp+mq6G0vb6zs7+5u7u6uby9rqiusa6wuLyztLGxqrCpqLGxsqild3J0X2hhYFRWUUlKSFZNXl5eVExKRVFKRUdDPTo5OTc0ODY4Mzg4PTo9PD47OTs4Ojs/PDw+OT9DPzg7Ojg8Nzc2Mzc5RT4/Qz89N0BAQT0/RDw+PThUj4yGh4eUjJWZl5yWmZaNlZyWlZydoKCdmpiWeHFubXJ4cXFsbnJwa3FvcG1yc3t1dnd5fnVxeHZ0d3tybn98gX15eH1/eYOGg4WCg5CLkIuLi46Pi4mJhYKBfX9zfYiAfpyQhIWFiYuPinp9fYaOjYqGjZSRi5CXj5SXkpihlp6XlZunpp+goKawq6GjpbW0sqqmqq+isba5vcK7ucO+vLi9uLWxrLCspZuSk5mfm5SPk5WOmp2doJqfn5edo6qsoZ+em62hp6qwqaampJiRkZWUo6SirKSss7Szs6i3tru4sLKvra2yt7a6srW6s7e5u7i8urayr6yxsbKztLOxsa2us7Gzs6yhl3Zxc19jXlJRVE1PSUdYT1pcZFROR1VPRURKRD44Ojg3NTg4ODU5Nzo6PTw/Ojg8ODk5PTs9PTpCPj84Ozo5Ojk4NjI1N0I+P0RAQDY+P0I/PEM8PT46Tn98go6MjJOTl5eaj5SWjZaRkZSXk5qanqGdnHJvcnFxcXFxcG5zcW91dHJxdneAdXd8eYV+d3t8eX1/fICJiYmDfXp/h4GIiYGAgIGGiIGGi4aIhYSIiImEgIJ/enx8fX6SkH+IeIGFi4qDhIWKj4yNkZmdlJSUoJqan6Ktsa2ppKWtr6ysrLWuvrmtrqm1sLexq7G2rK+9wsLAvrq8trKutraxtK66u7OurKepp6unoqmtoKmooq+wuLSxvLq6urK0ta+8tLezt7e7t7mtrbCprLW5sbeytLe2sLu7vLu6ury1vLi0wbWsqqqrtLG3uLm1trSzsKymrrCqq7Cxq6yusLKxtK6qo5N4dnJlZ1tMUlBGTUhTV1JlXmdUUExcUUhMUkNBOTk3OTU4ODY2Ozc5Ojw6Pjk4Ozo6Ojw8Pj08RD45Njs7ODg+OTUxNTZCRkREP0A3Pj5DPjpBP0BAO0t/gomXmJSdlpabmIuSlo6XkZGVl5SZl5+bmZx8dHV2dXl1c3RudnJzdHV2d319gX56gXyDfoJ/fYB/hIKFj52RiYF/go+Xjo6HgoCBiIuFfoqQi3+HjYyLioeSioeGjZGTkZGEh319g4iMjouOiomQj46PlJSYkZWbmp2dqK6yr6+1tLOtsrW4sLy1tbGqsKqztbS7t7SztrS1r7i4t62noqassLCvtre3vrW5vLOysa61u7C0r6+yu7axuMC9tLS0s7izvLq2tLrAvbm6ubq+ubm5vrWysa+yr6q1tLGzsbSzrri4tb+vpKaoo6ussa+zrq6wsKytq6qroqKmqKKnrauqpaynoqeYeHlxZmVZT09NSVJNV0xPX15cTlVUYlFEVE07Pzk8ODk1Nzc1Nzk1Ojo6OTs4Ojw8Oj08Pj4/P0I9ODY6Ojk6QDs1MjY2QUZDQz4/Nz49Q0I5P0I/PjtLjpGTmJmVmZGTopiTkpKLk4uOkI+Vl5ablZSbhoJ9enh2dHRzdH53end2gIKDhouMhISFioaQiYeRk5aRjZaalY+IjI+emJaVkpCTl5qamJCdoJ2Tl5qgmZ2bo6CVkJugpKOak42IiIuJkZGOkY6LmJqPj4yUmpecnJufnKSstLm6vK+2tLi0tLK3uLmzq6+qqKy1srK1rrGrrqa3s7OxpaGotbCvrayrtbqyu7q6tLK3ur67ubG4sLmtqLK4u66ttLS3tbu2trm5vLe0r7G0t7a5s7e1pq2pq6ior6yprq2up6KxtLG0q6aop6Cjq66oqq6orLKwr6+pqKGeoaGjpqOgopqlo56ol3J3bmdiVUtUT09KQ1BLX2JYWlFcU19MSFFJQUA5Ojg2Njc3NTg5NDs5Ozk8Nzs+Ojg8PD0/QkBBPTs2OTk5Oj87NjM3OD5GQkJAQjk+PUBDPkBGQj44R5OWkZWTkpSQkZ+ZnZmVkI+Sko6Mk5aWko6RlZGSkIaBeXJzdXuBhI6HhZGTkpicnJiVkJWYo5yaoaeqqZ+clpeVnaKioZyZnpmlqKyvramnqqmop6GlqKirqamvoZufoaOjoJqfoJyUjZiUmKCgoaSem5qkp6Spq66spaOoq6+xtK6qrK6zr6ystLO0ua6urayqrLKwsK2wqKqmsrS0uK6qtrqwr6qurLC3s7i0t7W0u7y4tbWxtauyrKiys7uvrbGytLa1sbG0s7OvrKuvs7a0sayutKqqpqWnrauoqKupqqifqbOwqqeppaOio7CtqaatpairrayppaSioKWipaOYmZyVnqKippdudWVnZFZPWEtLSktTVHBiWWRXX1tcUlpQTEM8ODk6Njk4NzQ3NzQ4Ojw6PDg6PTk3PDw7PkM/QT47OTo5Ojs+PTg0NThBREVEQkM5PjtAPkI/R0Q+N0KSm5SVlZaVj46Wl5qZlZGKk5SSjo+SkYqKiY2Ul5qTjYmCho6VkZSfmpuin5+jnqGhn5ijpKelpaapqa2rqaKmpKilpKGfnqOjra2srairrq6qqqukoaKlqaenqaijopybm6SgpaijoJidmZ+hoqmnoKKirqyrqqetrqilpKmpqammo6iqqaekp66wr7Ovq7Crqq+yr7Czua+rqLCxrrCyubO0r62vtbCss7GurLW1tLSzs7CvrKyqrKusr7G0s7CwrrCwsKyqrauqq6alrrCysKumqbCvqaOkqaunqKaopquwq6mvqaaoqaalo6iwraqpqKKpo6WnpKGhoKKloZ2el5aYlJugpKmUbnNeamlfVVpOUk5QT1JkXGRjW1xZXFBZT0tAPDs5Ojc6ODczNTMzODo9OTo4OTo5Oj08PEBEPkA9OTo8PDw+Oz45NTo8QkFFQUNBOT47P0BEQENCQDdAkZ6YlJeZlpGHi5SSl5GIg4mLk4+OkI2Hh4SFlZmWmJeZlpqeop2anKKkoaCdn5qfoKGgpqGgoKCjo6KlqKmrramqpqOmpaCloKaopqWnqKapqKOnppmcpKWioaChoaCcmJmfoKGkpKKenpagm5qioqChn6CiqKCcn6GloaCmo6KfpKGspp6foaGkrKqnrKivq6e0sa6ur7WyrKqwq6mtrbWwrq6srreup6yqpKivsq+sq7Kvqqqpq6utqa6urrGxraqtqaunp6uoqauinaapqKilqKisqKilpKWop6iopqmsr6+oq6mhoqKlo6Opq6ymqKWjqKKhoKSdnZ+hoZ2bnZ+amZWcnKOqlG9zZm5yZF1dUFVPV09eZGRsZ2JhWlpSVE9NQTo9Ojo4Ozk1MTYzMjg4Ozk5OTk7OTk8Oz0/Qz5APTk7Ojs8QD0+PDk5PEFBRUFGQTo9Oz9BQUJBRUI4PYqWlJOYmpaPiISNjpGSjIiIiI+JiZCRjoqKiJubmZygpaKlnqKjoZqeoZyanZ6bnKOop6ugoKOYoJ2XnKGjo6WjoqKkrKilqaCepqmnq6mkn6Kgoqahpq2mpp2fn5+fn5manJyhoKGkn6GbnZqcoJ6hn56eoKOZlpqYo6KipJ+ZnKGhoqCbmp6goaSgnaejqrGorqusqaSqqquorKalrKqws6+rq6mwq6appaWoq6ynpqevq6Wnq6upq6irqqqrrailqKOmpaesqayoopykoaOmo6qpqKano6SnqKanqKepqKupoaKoo5yepqWjqKino6WlpqmgpJ6inpeYnZ+doqKlnpiUlZ6go5d1d2t2d2FfXFVZUVVWW2NecmBoX2NTUVhUSD48PTg7OTo4NTM3MzM0Nzo4OT05Ozo5PDxBQEM9PT44Ozw9PEA/Qz86ODo+P0NAREE6Oz48QD9DQ0VDOTyCmJmenZ2alZKKiZGRl5GQh4SJgoGNj4+Sj42cnZ+hpKmlqaeorK2moqKfmKSmo6Stsa6yp6asm56em5qjp6Cfo5+foq+rqqyoqKuwqaipqKGfoKeprbCyr6yjoqahqaWepKOipqClpKKlo56doJ6fpaKinp+imJWemp6fpKGblZigoZ2enJudnZuZmZWen6Oonp2iqKGaoaOmoqSoqaqoq7CxqKWlp6eopKWpqaqnoqWmqKadnqWloqClpaOlpqCjpaOjpaelqamqpKekpqKmp6SrqaenpKGlqKynpqWlo6OopJWdo5+bnaCjqaeopqGjo6mooKiioJyVkZqfoKGmopuXkpCamqCVfHdvfXlmW1tfXlpcVlxoZG9jbWloYl5QUEA/Ozo4OTg8OzYzNDMzMzc5OTs8OTs7OT49QkBAPTs9ODw9QD08PENBPjo4PT9EP0M+Ojk/PEI/P0FEQjk6gJ6kp6Kem5+gmY+ZnaCWloqGj4iEi4qTl5SRo6Wnqq6trLOys7S4t62pqqevtLKxqq6usbKusa2lq7OssbGpq6+rq6y2sLSwq7GysaOfoqqpp663trS0trOvrKuuq7awqbKxra6npp6io6ObnZyXoqiloZ+eo5ueoZqWnaScm5aZoqefoJ+joJuUlpmWl5qfoJmVnqKZmJ2dpZ2gpKeqqaiqraylqaSlqaeqqaqsp6SkpKOimZmhnpqaoaCfpaWYnqSmpKqooqelpaGqp6mnp6ejqKWmpaGkqKesoqekoaalpaOVl52Ym5mVo6elpaSfnZ2lo6Kqo5+amZiWnJyaoaGakJOTl5ibjX93cnZ4aWJbX15cYllgZG5ta21hX2RgUE9BQDw7OTs4Ojk2MTQzNjQ3Nzc6PTo8Ozk9PUI/Pj89PDo/OTo7PD5CRUA9OTtAQT5DPDs5PzlAQEBAQkM7OXuao6OcoJ2dop2Zn6KioJibmJaYkpSQm5qWl7S0rrW4s7S4tre0uLm3tbm4ub28uKqLnLK4vLS9urW7uru4s7q/uLe5u7G3r6iusq2inJ+qsri8vL27ur+0r7GztbS3t6+1tLWysKikop+gl5Wal6SqpqahpKOkq6WlmKGko52goaKooaOgpaGck5mYmJmco56cmpudl5uZlqWam5+hqKmpqKuvr66pqKmrrKytq6irp6WjoJyfo6Ojn6Cipammmpyip6Spn6GjoqKgpaanpqSooJ+ipKGjoqiop6OloKGopqalo5mbmJuTj6GknqKfmJiVoJuhpaCfm5udnJuamZugmo2YmZiTkYaAdnh5eGNbUllUX19hbGh1a3BnaWliWVNMQDw6Ozg5Nzk3NTU2Mjg1Njc4Ojw7Ozs7QD4/QD0+Pjk6PDk2Nz47QkZCPDg7P0NDRDw+OT43PkFCP0ZDOzhwkpqblJ6bm52Vl52doqajopaXnpaXl6GblJi+t7G4uba3t7i7l5S2vbu9vcDFtaK7mKC3v7+6wcm0nbu2sra/xcGooLazurGqrrSxsLG0tLa8vL68vL3Guri3ur20r7Wxsbq4t7Kzsqqmpp+YpKSnqKSupKurtbWus6CnqqynqqmlpqCnoKGmoZOWmJ2foqSjnZ6coaChnZekmpmdoKaqqqqtrq2tsLGrrK2sqamrrqimpaalpqSkpqaeo6eppKGcoKKjpqCio5+jpJ2foqWgpJyboZ6fo6GhpaSlqaOkpaKkp6ehn52elpOcoJiZko+MjJeWn5uWnJqdnJqSlpSUmJOQmp2YiouHgIB8gnhhXVlTYWhgZnNvc2l0Y2lkYltMSz46ODg5ODg5NzM0NTI1NDY2OTw8Oz08P0E/QEA9Pj44OTs4Njc/OUJFQzw7PD5DREM9QDs9Nz1DQ0BFQjw3Z4yRk4qalZiblZWYm6Knq6aVl5iQlZmhnpeXvrWztLu6ubi5woeYt6u4u8DCxbOjw6e4s72/tMTHvbS7uL62wMTErqCworW2tb2+wcPGw8O5vb/AwL2/xL28ur2+tKeqmLHAvbi1ucCzr6+qqqitp6ekr6eqtLyxtLWor7Gwr6yqoqajrJ+fpquXmqifpaWfoJydoKuwsKyiq5yYm6Cor7Kys6uorre1sq2tqaalqKulpaStqaShn6Cnnp6mqKmmnp+anqGlpqmcnaObl6KmmpuanZ+cmqGcmZ2eoKijn6GfnaWioKOioZSZmpmTj4qLhI2Qk5uPjpiVm5eYkJORkomNl5iYk4uKi32AgIVwYGFeXmpiYm53dXZubFtiUVVcTUc7PDk3OTc5Ojc0NDQxNDM3Njg8Ozs8PEBAPUA/Pj8+Ojo5Ojc6Pz5FRUU8PT1AQkJCQUI7PDhAQ0NARD87NV+MjIaFlouUlZeYl5ifpqellpWWkZebn5ual7mxtrO5vLy5urWqsryxvsG0vMe5uLuuv6fGw7/KxsnIxcXJvMLHx7+xsae8vL7FxMbJx8XGu8TAxcbAua+9vMC+vrOrqoyzu760tbfCuq2vsLWqq6aqo62kp7G2q7WyrbOtqK6vp6awr7Ktqq+zpKu1qaeopKCgnqmyuL61tbWqqaausre4t7apq7i8ubexr66noqOop6SfqKOfnqCZoZydoqSnp6GelJuaoKGlnqChnpajnZSQlpiboZqflpORlpSin5qenJudoZ6kn56VnJiPkpOPjImTkJefiZCWkZuUmJGRlZaDjJWXlpKLjIh8f4N/amZoYWtsZm51cXJ1cWZeX1xSSUU/Ojo6Nzg0ODw3NjU0MjMzNjU3PDo7PDs9QD4/QD48PTk5OTs6PDw+QkRFPj49QENDQ0REOjo4QUJCQUNAOTJbk4iEjZGKi5GRlZCSmp2fnJOSmJSdnZqXmpW2sbm1tb6+tri1uLO8vMTEusPHwb+0s8XFxr/CzcfLzsvLx8HDxsfIysXExcO7vLzBxcHFxb/DwsbFwLGTvrq/w8K2trqptLO0qauzu7uxn5uxr6ykrK60p6qpqKqtrKmlpZ6pr6uyu7q4u7e5t7O5uLOurLO0qrC1ub3Bur6+vL60urm4u7qysbS8u7q7s7Oyp6Smq6uioaCdmpudmpyXmpuenJygnZaclpuZnZ6io52UnJCNiY6OkZ6bnJWNh5KLmJiWmpybmJybnp6cmp6UjpiYmpORmZeeoZWYmpKXlJSRlJqYk4+TnZaSi5F+enx/dGtsbmNvbGhxd255aWlhXGdhUUZEQTw5OTc2NDQ6ODQ2NTMzMjY1Nj05OTs7PT47Pj49Oz05OTs7Oz89QUNBQkFAPEBDQ0NFQjs4OUQ/P0BCPzsyV5uQkZCQh4WSjo2IjZCTlZGPjZSUm5STlpqRs7e4uLi+u7C1sri2tbbAw8G+w8LAvru+u7u8xMzEzNDKxsbAxcfLyNTLysjGv7u7vsS+xcjGxsPEw7i0wLe0vMHCucK3t7/Au66lrre8t62co7ewpq20tayupaWjqKSgoKWZqrOyvsG+urm6uLW0srG0tLO6wL7Av769u7u9vsDCt7a3tru7sru+ubi4u7a3tKyoqamrpqijnpOampyYkZKZl5GRmJqXnpiWk5acm5+elJOJiX6GiIuWlJiZkYmVkZeWlZmbmpaYl5idnpyhmJWZmZuYl5ybn56jnJ6WmJeTl5yZmZyUlp2UlpOJdnl6e3Zua2lndVpmcndzeGVmXWRbUlhJRj87Nzg4NzYxNjk3NDQzMzM2NDY7ODo8Oz08OD0+PDo7PDo9Ozs+PkRBQURCQEBBQkNDREM9OTlCQD8/QD89MkyWmpaSk4yKmJCLi4yNkpKKiIaNkJiKj5CUl7O7tba/vb2xtrjBvby0uL/Bsbi3vsHFvbu8wsbJv8jOycHEwcfKysbKxczIzcbIxb/DwMvNz8nGw8PEwsS9uL7Bw8DEvsHPz87Gq6+2tLWroKe0s66ruLWzq6mjoq2prKatn6y1tL/Cvrm4vbawrausr7W0ur7Fv7u8urO5u7i5ubWtsLS9u7G/vLiytrmzubu0ra2orKyqqaeXnpualY2MmJSTi5WWlJyZl5WWmZKYn5mQiop+iYqKkY6Vl5OUn5mWkJSZmJmWmJOUm6GeoZiYmp2ZmZaenpibopqdnJuYmpuZlpeXlpyZlJyYfoB4eXV1ZWVpaWddaW9teHdiYmBgXVhXRkU4Ojg6OTc5NDQ5NzY2NTEyMzM0Ozo9Pzs9PTo6PTs8Pjo7Pz48QkBDQkJFQj0/Q0NDQ0RFQDk6QkFBQj5CQTVCkJeUlZmSj5qQjpKRjZSVi4qHjI2UiImPkpq2u7S8xsHEwr3BxcLAtLO9v6ywr7rDysPCvs3IxbfByMW/wcLIy8rCwsTJzM3Pz8zDx8bIyMjHycfFycfIx7/Fx8TEx8jK0s/SzLy4trS4uMG+vrq9ury6vKytpqm7urm3wLK1uLLAxrq3t8Gzsa2tqau1s7u2w7a2vbWxt762s7e4sLW2v7uwvbq0q7CxsbO8urOzrqutq62xnaOjoJqQjpiXlZCclpaYlpWSnJmTm5+clpGUjpWQiYyQlZOUm56YmZKSnJedlJmSk5aZmJ2VnJ6do5yVnZ+TnKKcnKCfnaOemJSVl5ebmpmgkH99cXRxb2JgZ3VnaWl0bXhsXWRbVV9ZTEhDNjw5OTg4OjUzOjY2NDQxMzUyNTs6PD47Ozw9PDs8PTw7PD89P0I/RUFCQ0M+QEFARUVERUE7Nz5DQkI+Q0I4O4+akZaalJKUjZCUlI6VlI6Pi4yJk4uIkJObt8C6xsXEw8zCwcS9vrWvt7uvr7O6wMfFxMHMy8W2ucDCwsTHytHLwsPExsnFzdDOx8zJwsHGwcvKyMbMyc3FxsXDxsXJzdDNz8zHxMDDwsnNx8XBxMfBu760sbCwwb6/wca/vri3w8K6urbAvrWyrKmvsri+tMC0tLi0t7nEua+8vrm+v8K/tbq2q6qsrq+wt768trSura2utaSlqKimmpycnZyeopydmZOQkp2VmKCdmJiVmZmZl46MlH2QkJefmZmYk5GToI6Nko+VjpCUlaKdnKSem56elpyjoKGipKOkop6amZubnJ2enIN9cnx4cGdgamp2bGlkdG5zYlxiVFdUU01HOjc7OTk3Nzo3NDg3ODQ1MjM0MjU7Ojk+Oj08Pz04Oz05OTk9PEBBQEVCQUJBQT9AP0RFREVAPDo+QkNCQENBOjSAoZeUmZiVkImUk5aTiZGMlJGOiJaKi5CXnMXLw8O8wMPHwbm9vbu4tre3rrK3uLzAwsDCx8bHurzAwsTHyMbSycHDw7+/vsTLyMrLyLy7yMfJzcjDyMnJxcXDwsHCx8fIysfMyMfIzcbMz8W3wMDAwLu7vbWzs7+/ub/DucC3u8G8uri7ub27srCvsKy5wri9ube1t7q9xb24xsjCwcLGwr28tamurrCwr7O6t7m2sK+tr7OppquprqannqSlo6OjoqCblZiekZecl5GRlZeZlZmRlJiSlYyYo5qcnp2FiZ+TfJKWlZKUlJennaCipJ+en56foaGkoqKjoaOinJ2fnqOhppl5enl/cm9mZWdjamRham1ubl5YXFZVTlBKRjk5Ozk3Njc3NjM3ODk1NjEzNTI3PDs8QDs/PDw6ODo8OTk4Pj1APz9GP0JBQz89QT5ARENDQTw5PENBQ0RBQDozbKKdlZedlo+PmJiZmIiSjZGVkI+Vjo6TlpbKy7u5urnBu7q3vsG8vLu5sa61uri4u8S6vsC+vru8wMXBxsK+xsG5u8O6uLm8vsHGwca6ucnJw8XEwMTBwsHEwcO+vcLAwMHCy8PGzMvFyNDCsL69uLq7vL63tLC5vrO8vrG5tbi7tryztbm2uba5t7GtusG6vMG/t77Ev8bDw8fHwrvAwr/Cv7iys7O1tLGut7S3tbSxrK2xp6Wlp7CtqJ+nq6ajqKWmpqCgn5SYmZSRkZWUl5OYl5qhnZ6hnKGdoaWglpSbkZeXmJqTnpmZqaSlpKWdoqCanqCkoqOcoqGjoJ6cnp6ppaiVfXuDeG5mYWRiYWJjY2piZmJaWVlcWFFORT07OTo7Nzc5OTY0OTk6NTMxNDUyNzo7OkA9Pzw8OTc3Ozo5Ojw+QD8+RDxCQURAPz49QkRCQkI+OjlCP0FCPT44NVmfnJiTmZaRlZiYmpeQkZCQk5GTlJKSkpSUxce4tbq5wrm5vMPFwri7ubGxtry6tbnAu7u5tre0tLW/ur2/ub26urS/uLW3s6+7vLfAt77Cv8G7v8C8u8W+u8HEwL6+uLzBwcu+vcnEwMDKwLHBv7u4u765tbe0uLy0vbi1tLCzvLG3tri/tr25vb65t7q+u7/Axb29y8PGw8TAw762ubq2v7i7v7y4trOyq7CwsrWzs66sq6emnqeurauiqKumpqqjp6iqo5+Ym52bmpicnJiXnJuhpZ2anqGhoKGmoJqbnJiboJ+dnJ+coKiho6SknaKfmqKgop+el6Shop+dmpieqKWhi3x5h31xY2BiYmdqZmZpZWldVVVTWU9TS0U4PzY7Ozc3OTs2NTo7PDYzMTM0MTc7OTg/PT47PDs3Njk5ODo7PUA/PkA9PT9CPjxAQUNDQT9DPTk2PEBBQDw9ODdJlJibj5OUkZWYlZGWkpWRkJGUlZSTkpKYlcHCwLq8ub62uL7EwMKxvbqytLO4vLW3vMC8vbS0sbC1t7W6wbi+uL+8vbe1t7CuuLa5v7vAwLfBvLvDtrrIuLa5u725ura7xcXKvbnFwL+8wb64xr3BwLzFuLa3tLi2tru7uLa0t7q1tLi8vbm/ucPAwLu5vLu+vcjEvcfEw7rAvb62sra4srm0usLCureysaysq62yr7Kur6ijpJ6rrKyqpKakpKiqoqemraihoaGmn6Oiop6bnKKfoKOdnJuhn6KgpKCem5eZn6GdnZ6eoaWkoaKioZ6ho5yinqCZnZijn52eoJqZoKKmnYR6g4B4cG1lZWZvaWVrZ1hYTktLSlJJTEhDOT44PTs2Ojs5Njc8ODk4NjA0MzE3OTk7Pz0+Ojw6ODg5PDg6Ozs7PD1BPj09Q0E8P0NDREA/Pzw6Nz5CREE/QDg4P4mYmoyMkI+Tl5WMkpCakpGXmJaUlJKQmpTDvsbBwby8uLi6v7e8scK2tLyxtLa4s7q9v728sq2vrLGwt7y2u7zAxLm3t7e2urm6u8C9w8C6xMK+x7i5uK23tbi6tLezu8XGy8G7xsDAv728v8nDxMW+xri1srK9uLi4vrq6uby7urS3u7q5v7zEwL+5uri/ubvFxr3Fw8Kyur27sa+2uLO3s7q+wLm2rLGrrqmqqa2qqq6mpKWnrq2ppaOio6GkpaWmoqato6Klo5+ho6Gcmpyhn6CloaCenZygnaWgnpeVmZ2fn52gn6KmpaCknpybn6Ofn5mcmZ2epJyWnKOcnqGcppZ+f4Z8a25wZ3Brc2VibF9bVEhLSkRKQkNHPzk7OD08Nzs7OTc4Ozc8PDYyNzUxNjk8PD08QTs8Ojs6OT45Ojs9PUA+RD89PkRAPz9BRkQ/Pzw9OTc/QUNCQEI5Ojl3nJiLh4uQkpOWjY+TmpOQnZiSkY6QjpiSvbfHvsO+vbu+vL22uri9ure9s7OwuLi1uby8wLeqraSusLe7s72+u8S3tri2t8C/xLzCxcXHx8rJxs/CwbivtbW8vri7sr7ExMrFwcnDwr+/vr3HzMfHxMe9tbW2wb26u7/Cur/Bv722t729vcHBwL+8ube8wru3v8W7wr++tbe8vK+vt7awtLO6ubq7r6mtq62rrKaqoqeuqKWqra2vp6Sgn6ajnqKjqKOjq6Oiop6dm5ublJaZnJyfpZ6fnpmYnpejoJyXmZqZmqOjop6jo6egpqCbnaCjnp2WoJmcoKCblJegn6WcmKKQgYaBcWVsaW50bndjZ2FbYlBLVEhFRUNHQzw7OTg9Ojc6PTo4OTs3PD01MzY1MDY4OTo8O0A9PDo+PDk+OTk9Pjs/PkM8Pz5APz0/P0ZEQEE/Pjo3P0BDQz9BPTo4ZqGYj4uNlZKVlY6PlpmVl5uVjoyMjY+bk7m2wbS/vLm8w8C+wLq1trKywLivsry8sLe7tru8q6qjsLm9vrO8vrzFuLK4ub3HycrDx8jGxsnIzM7RzMrFtbrAw8i/v7W/wL/Gxr/LxsO/wbzAw8zKx8XGwbm9vMS/wL/CyL3Hx8XFvLrEv7vBv7rAvLu7wMS9t7nCub69t7S2uLqur7WxsLCytre0t6yurKqsrKuoq6Gms6qlra+trKippaOkp5+io6Onoaeiop6cnZyamYyQlpeZnaKZnpuVkp2UoaCdmZ6fmJimpqKfoqKmoqeloqCko6GbnaCbnKKfl5WVnp6kmpafiYGDgXRvbGx0a2xuX2JeYWFNSE0/RUA/REM7Ozo6Ozo4Ozw6OTw+OTo+NDQ1NTE5OTo5PDtAPD89PTw4PDs6PDs7Pz5DPkI+QD89Pz9FRUJBQj87Nj9CRUQ9QUE6OlmfmJOSlZqVmpOQlpeclZuZlpSVkZKTnZm2uLaxuru6vsG5uca7trWypb69tLbBv62zvbS4wbGwsbS8w7y6ur68xL+3vb+9x8zGx8nGxr/ExMrIzMzNy8bCw8vOwry5vbq5wMO/yMbEwcG/xcDKycPDw8O5w769ub+8wsbCyc7Hxr66xr26v7m3wLm5vsDCvrW0vLi2u7CvsrK1r7Cvrqyus7CzsrirsbKxqrCrq6yrrLatqKyusqarrKmpoaWgpaakrKSmoaChnqGgnaCMlJeTm5+mmZ6emZOYnZ+gnp2eopuYp62ooqSgoKKqpqmhqKGlm6CgnZ2jn5SYmKKdp6Gfm4J7eod6bW13e19wY1tdX15TST5CRUlCQz5DOz42OTo7Ozs7Ozs7PT05PTU2NjIxODo5Ozs6QTs/PDw+Nzs8Ozw9PTw9QD5BQUE+PkFCQUVDQkRAPDY+Q0RFPkJEPztTmZuZmJ6dmqCalpyZn5KdlZ2boJWWlJqYur20sLu8wcTCv8XGura5sqO7vbS3xLuwtbq1ucS4tLy2ur3BvLu/tr/Bv7y/usDLwsfIwL+8vL/FwsfLyMHDwMDJysLAu7uwtLu9wMXGxcW/wMK/y8fCwMjAusK7urO6usG+wMrOysS9tby8ub+5ubW1s7/Avre0s7S4rbeqr7CwsrGvq6+nr7ausrG5rra2uLSzsLGttrS6sa6srranrLKsraSjoaenqLKrqqWkp6elpaCml5ujn6SmraKeo6KanaWiop+foaWenrC0sKSlnp+kqaevp6mgq6CiopqipJ2anqGmp6+psZWCe32Cem1zeHNncF1aXlxZUUVEQ01JQUQ9Rzo6NTk7Ojw8Ojs7Oz0/Oj01NDUxMjc4ODs8O0I8Pz46OzY6PTo7Pj0/QD87QUFBPj4/QkBBQkJFPjo1OkFCST9AQkA7TJqdnZ6fnZienZmampySoJWbnp+blZGRlsW+urbDvMbCvr/Ixbe1uLe2ubu0r7e2srWzt7m8u7a7u726w7u3vbe5wLu6uLi1xcHDw7u5s7S6wb2/x8C5wLy+xcS9vrmysK64t7/Dx8PEvb2/v8PDvr/HvLy/tLSutbW8vr/OzcvCt7K4uLi9ubuxtrLIwLu2tLGwt6yzqbCtrbO3r6uuqrG1r7Gvt7O6usC/tre2sru6wLWyrbO3rLC6r7KloqWrrK+5s7KosK+xr6qiqKGkraitrLOun6inpqWmq6Sknqaqo6ayuLOrpZyfp6anrquqpbClpaWbpKOYn6exrLW4sLKOhHl/fHdsdXpwbWhcX19ZU1BBRUhHS0BEQ0g8PTY7OTk8Ozo6Ozo9Pzw9NTU2MTM2OTg8QT5AOz1AOzs5PD04Oj08QD46Oj49Pj09PkBCQkJBRD03NDU9REc9Q0I/PEWUnqCgoJyXmpiYlZmdmZ2fmp2bnJaRj5LDwMK9wrzEvLy7xbu3s7e2tru7s6CWtayvsbS0tLa4ucHAt725uLm2tb+ztLK4sbvBwMO3t62wtbi4uMK6tLu3u77Au7u8rq+us7K5wcLEw768v7u6uLbBwrW/urWur62wvcC5z8rJw7GvtbS0vbq+ubq7ysO7uravsL2xuK+ys7C3vbaur66wt7CsrLK2vbzEwrq9t7bAv8G3tbC2srGzurGxr6err6u2v7e1qbqztbmxp6uop7ausrG1uaisrK+qr7CqqKessayytr20saykqKuoqKusq6i2qaaonqadmKOuvLG7wbSmiYF8gnpydnZ3bXBgXmVdW1RKPD4/RkY9RkNDOTo1Ozk5Pjw8Ojo8Pj4+Pjg4MzE1Nzg5Pj9BPzs6Pz08Oz09OTs8OTs6Nzs+PT1DQT8/QUJEQkE8ODU4PUNGPUREPzw/iZ2en52Xl5WUk5aZnpubmpuYlJ2Uio6Owb7Dwr6+vrm2usCxtbGzt7fCtbOrrbOoqa61r620trnDv7e6t7a2srTAtrK0uLO6wMHDubeysrK0sre+urO1sry6vLa6vrK0tLSwuL7DxsTAvb+5s6+yvLquu7Szpquorbq+uMvCv76sq7Cvs7q3ub67wMXBu7y3sLXEtb+0uLu0u8PCs7a2sbisqaWrsr23v7+7u7exvL28trGvq6uprbOvsLCrsLSpuMC2sqm0tbC3tq2spqu7s660uMKwsbG1sbK1saywsri4ubi+tLGzrqyxramvrqqyuK6trainoZ6ptr+4ur+wlol9gHxxc3d0dnFsXmJgW11OSEE/PUhDRk1EQDc3NTs6OT48PDk4PT47PT86ODMyNTc2OD8/Qj86OD4+PTw5PDk7Ozo8Ozs6PEA+QkI9QEE/QkI/PDs3OjxBRD5CQz8+QYqgm6GdlJiVlZOYmpyWm5WalY2bj4SIhru0vb+7vLm3s7y8rLOytLS2wLXAr7Kzqqqxt62pubO3wL27vLi2uraxwLq3ubi5u8HBxMO7u7a0tLC2ura0sqy8ubi1uMG6uLOxrLe8wcfDv7m6ta6lrLOwprCtqJ6gn6WttrXCt7a0pairqLC2s7K6tbu7u7W4trC1xLK+vL+8ubrFyLq9vraxp6SeoamxrrW4trKwq7S3trGopp6gmaWmpKynq6y2qa+6sa2kpq2lq7GrrKmtuLawsrjBtrGxtbGvu7ayt7W1sry1urKwsbKutLKqrq2nuLWyta2uqqiosrq9wLa0qY6Ce392b3tvdXJtYlxmWFxdUk5NQT5KQkBKSUA2NjU7Nzg+Ojs4Nz4+PDs/OjkzMjc1NzU8PD48PDg+Pjw8OTk5Ozs7Pjs7OTw+P0E9PEJAPz9CQD47Njc6QERBQ0E/QUKJoJ2loJSWmJiVnqCcl5uYmZGMmYmDhoS1r7S7u7S1sLG2uq6wtLOvtbq1urC1s7GttrqurLyyuLm3u7+9ub7AtL+7vLq4vsK8wsrHvsC4ubaytLaztK+su7q4trnAw7aurqqytry9ubaysa2tn6Snp52jpp2WmZman6muuayrq5+lqKSrrq6nr6yvsbGtsa6usLmwtLy+uLm4x8W8vLu4qaKcmJufp6assa6yqaapqq6popqXl5GcmpijnqKir6ekrKaompqemqGnp6anqa+2squ0tq+qsK+xqbm2sbWxrqy3s7avrquuq7S1ra+rq7GtsbKoraurs7W3ur2wq6GLeoJ5cXZzbXRpa11balRcXE9NSERGTEFGTUY4NjY1OjU6Pjg7OTc8PTo7PTo5MjM2Nzc3Pjs9Pjo6Pz48Ozw6Ojs5Oz47PTk8Pj1CPDtAP0A/QT8+OjU1OkBFQkRBQEJBiJ+ipqGYm56dmqWpmJudmpmUjJmHhoeGrq2uuLmxsqiur7iyq7CwqrK1ubm+tbK4tLm6tbm7tbWztbu8wLu+wLS/ubm6sbrDvMLKxb+7v7+5s7SzsbGusLm5try4u7+ysrKusa65r6qrrayjqKGdnZ6XmKGVkpWXkJifqK6ko6Sgoqeio6mpoaanpaqtp6ynqKesq6yyu7SztLm6trK2ramgmpaWm52fq6yrr6Ojo6GpoJuTjo+Qk5KSmZaanaSloJ+ep5iVkpSYnqSjoaWqrK2iqaqppKmtrqW0sa6xraqprq+wraWmqqSos66trKmmpqmrpqqnq7Ksr7Oxq6mWgX+Bd3J4aHRzbmRUYGNXXFFOTEg/SFFDTUM9ODg3NTo3PD46Ozw4OTw7Ozw7ODI0ODk3ODs7PDs4PD0+Oz08Ojk8Ojs9PTw6OkA9PDw7QD5CQEE/Pjk1ODs8RkFDRD9BQYijpqKjnqCfp5+oqpufm5yZmI6Xi42PjKqpqLGvsK2lp6ayr6mmq6CvsLu1vby3wMG+vLy8ua6tr7Kyurq3t7W1vLSvtKu2urjAxMG7tby9uLKts7CvrK63trK0tK+qpJ6bnJyeqKifoKipn6GnlpuXl4+dk4+Qlo6Xm6SooKCioqKlpZ2jo6CepaCkrKSmqKSio6OrrLOuqa6urqeqraisoZyamJmYm6moqquepaKbo5yUkIyOj5CTkJaVlpifnp6amKaXk4+Slp2ioKWjpqSnoKKko6Ghq6uksq2qrKyno6yuraufoaKkpK+srKmmo6KqpKqqpKmrpqmsq6agiHmDfHZ/eWJ2bG5cUGhUUE5HT0xMQ09RQD47PjM5OjU7OT07Ojk9OTk8Ozw8OzkzNjk5Njo7Pz06ODs6Pjw6PDs5Oz07PDw9PjxAPT88ODtAQEE/Pz45NDk8N0FDQkQ9QEOOqqSjoqGinaqkpqimoZ6dmZ2PmJWTkJWnpKGmqKmlpKChp6uhnKKbp6u1sry9wMLCwL7AubWnpayqqLWysbCur7Knpq+jr661wbq1t7K3trK0q7K0rqqrr7CytK6lnpKYlI+ZoJ+ioJykpZ+eqJSblpeMl5GNkJeTmJ2iqp+fn6Cjpaicn6ChnKKfo6innKehoKSfrKisrKCpq6agpKimrKOdnp2Zl5qrpqmwo6WnnqCclZOPj5GQmJCWlZiXn5ibmZujmZeUlZqdoJ2nqKWgo6Kho56doKmqpa6upqipoaKqrqqnoaCio6msq6eppqShqaKlqaalpKKmpKijkn19gHV1fW1re2RoVVFjTUlIR05STUpNRztEQDwyPzg1OTs+Ozk5Ozg6PDs7Ozk5NDg7ODc7Oz48Ojk8Oj07Ozw9OTw8PD49PUE+QEJAPTc6P0FCQEA/ODU1PDpAQ0BEPkFGlq6koqWeo6KpqKipqqWmnp2imJiZmZWbop6bnqOioKOgoZqgmJiXlqGorK62t7q5ure3u66ooKGpoaCtq6qmqaSpo6SupaystLy3rLKxr7Gtta+vs7Wqp62so5yZlI6RlpeZmZ2go6KbnaWemqSXl5eWkJKRkZOal5ugpKqeoaGepqeqop+gp5+dn6SnqZ6jpp+qnaqtqq6nqLClo6Smp6ymoaShm5ier6iusaqlqqqgmpiYmJWTlpqTlZWZlZqXl5ignpycl5uhmp6aoqeln6GioqOcm6Gmp6aoraOppZ6kp6mkpaWhpaSsrKmmq6eioKSjpKenoaCgpaKmoIl7gH12eHxkeHlgYlJVX0hJSUtTVElSUEw5PkE2Nz02NTs6PDw5Ozs4Ojw9Ojs4NjU3OjY5Pj0+PDk5PTk9PTw+PTs7PDo+PTw/Pz9APT03Oj5AQEA/Pzg2NT08PkFCRkBAR6CupKaroaOqrK6tp6ypqKCipp6bm56aoJyalZmfn5uen56WlJOXk5OcnqOorq2sq6uvqq+pn5eepZ6epaakoKKfpqCirqusrbWytqavtKupqrSxsLC4raehnJ6alJiampGOkpaRjI+OlJminJejmZqXmJmUmZiWnZufpaapoKajnqeurqumorGjmqSmpqqioaqiqaSosquxsqu6qKarp6urqaysp6Cgo7GtsrC0qbGvopmcnZ6hmJubmpiZm5SVmpaYnKShoJqjoJqcmZ+kop6gn6KmnZulpqWkpaijp6OepqOinqaloqWlqKykpq2noJ2dn56gpaGenqWgppmBe4F8dnZzaIJsZVtTWllNUUpOT1RMUkxBNz5CNjg8NzY6PDw9Ojw5ODo7PDo7OTc2Oj01OTw7QD03ODs3PTs9PT06Ozw4Pj09QD5BPj4+ODg8P0BAPT83NTg9Pj1BQEZAQUihqqCrq6GkqquwramtqaelpaWkoKGfnqWXl5SYmZ6YnJ2blo+UmZKSnJihnaqipqCep6Gkn5ySnKKbn6Gjnp2gn6Ogoq+urK+xrLanrbGtpqawrq2ssKefn6Ogl5GUnKGcmpiSk5+doaSbnpuWn5qfl5uinqWhnqSfpKitraisqKSstLe2sKe0rKKtraOvpaSmoamorrWzsr22vrCssa6tqaq0sbCnq6iytbezt6yxtKOgnaWfq6GhoqCfmpiVlZ+bm5ikoaCdo6GgnpucpaCfnZyhqJ+fp6meoaOkoKagnqehn5ymo5+ipaOooKmrpZ+dnZudmqainpyjnqeQgYJ/fHh1aXd1XWxaUmBIUVVIRlVWSkJNRz1KSDhFPDY3Oz49PDo8OTg6Ojs6PDk2Njo8Nzs+PT8+OTc9OT47PEA8OkA6OkA/O0A+QUA9PDk3Oj5APzo/NzU4PT4/QUBEQEJGnKueqamipamprqimqqWmp6aoqqGlpKOmkpOVmJacmpqcmpWTmZuOk56ZqJ2unqeem6GdnpqakpienKKioKCdop+fnp+pq6esqaq0q6utq6WlqqirrKqloJ+akpKUmJmWlpaMiIuPlZ2dnZ2elp6apqCgqKWxqqeuo6uttrC0srGutri9wLqttbSwt7CutKmmpKWsqbmztbvDvMPBtrq2q6+xube8r7OwtcG8t7yysrShq6KpqLGpqqinp5qYnZmppqCZp6CfnqenpaSenaqhop6bn6igpKetmZ+jnp6nnqCmnpycoqGbo6KhnZympaWkn6KZnJukn6CboJyjiYWEfnZxbWl2bWhtXFhbQlZNSkdNR0JGTTw+TD00PDk2Oj0/PDs6Ojg4PDk6Ozs8NTQ6PDg5Pj4/Pjg4Pzk8Oz0/Oz1BPTo/PjxAPj8+Pz08Njs/QT07Pzg2Nzw8QERCREFCQ5WqoKapo6mqqKmjoamgpqinrK6lqaWpqpSSl5mUmpqanJiYmZyamJqqoLGit6OwpqCenZ2XmZaZnpucpJ+fnaSdmp2cpKKko6Kqr6ynqaOgoayvrqqrp6Cfn6Kjnp+em52blJSVlZ6emJSGnZqhm6ukq7KwubKysbKxur28vLm2uMO+v8K/trq6wMS5vbusrqexrbHCtrjCxsDIysDKv7C5ub25wr24s7vFw7zCurazqbKtqrK0r7Ouqa6jnaumtbGsoq+loKKvsa2wpKSvo6GgmqGnoaSqqpmdoJmao6CmqKGcnqKemaSenpiYo6OhpJ6mmZuipJ6fm5ubnIeFgXt0cmtrdXJwaFdbUUVUSERJUEg+RUE0RUg5NTs9Njs8Pjw8Ojo4OTw4OTs4Ojo4Ozw3Oz49Pj02OEA5Ozs9QDw9QDk3PD07Pj0+PUI+Pjc6QUA+PD45NTg9Oz1DQEFDQkGRqqGlqqelqqimn6KnnKasp7Gyq62jqayVkpWalJecoqGbnqChnJ+psqu7sr+rr6ylnqChnZyYm5+gm6Cfn5eknZWbm56anpyfpaannaCgrLGvp6Sko6Gfpqynn5eclZKanZmVjIqGiIZ5bYigpKKrrLS8tsO+vrO7wcPCxcC/wsbGxcPIwsDFyM3QyMvDsre1vrK+xbu+zM3FzMvL0sa+v8DCvcfGwrfDycjCwMW9ubO5urS7t7C1sqq6sa66tr66uqq3rKqquLq0u66tuKOmop6npaKjqaaZm5+Ymp2nqqegoaGkmJSjlpSakZydn6Sep5+en6KdmJmUmJSIhH16cmtkaW94amVaW0ZKTEREU0xEQkQ3Oj87NTQ5OTc5Pj87PDs7OD48Njo9OTw9OTw9Ojs9Pj4+NztBOj45PT45PT44Nzs6Ojs/Pz1CPj83OkFAPTw9ODY2PDo8QT9BQUE+kqugp66ooqulpKKipaGlqquwsq2upKmmlJWVmpaUm6SmnaGqp6KrrLy8v8PBs7K4p6Ghq6qinZ6hop6cm6CSn5+Qlp+ZkpqWnZuZo6Gvs6mhm52dn5+al5iYk42PlpeUj42Qi4KDgndzcW5wj6atrrS5xbvNx8u/wszOzczIydHMzczHycXGzNDS1c7Tyb3Av8O7xsXIxdHTzNPP0tPMysLFxsbKx86/yNDLxsTGxMC7wsC+vr61vbOtvr/CwsbExsOtvrixuLzDwcG6vLy1rqenraigoqmlmpagmpmdqKupo6SknpePm4uQmYmVmJugn6OdnZeempOTi5WPhYB5dHNlYmdyb2ZeWllDTkxDRVBJREJANTU1ODlCPTY4OkE+Ozs+PDk+PTc6PTk6PDg8PDw7Pz8+PD0+Qzw7OkA9Ojs6Ojg4ODk7QT48QD8+ODtBQTw7Pjc4Njo8PkI+Q0FAPpOvn6ivpqiro6KloKampKuoq62qrqKqo5Kcl5ebmJujrJ6frqalsarFxszOzb+wwqmlqK2tqqGdo5+cnZqpk5mhkI6gk42UkpeZpLGxq6SgnaCcmZeVk5SXkpCPjIeEhImHg4CBgYB5cnJvbHmktrq5vsvB09LTyM3O0dPR0tHQ0dHNzs7Qxc7U1djS183Gx8nMw8XKzsrT19HX0tTV09PIzMbMzcnSzM3TzcTGycnAxcvHyMjFvsKzs8fEy8rKzsXJv72+vMHHxMzMyMnAw7+tr7KonqKqo5qTnpyYnqaprKSlppaXipWFkZSHkpKSmZualpiQm5WQjIaRi397cnV2Z2Jod2lkVldRRE1GQElRQj1CPDoyM0A8RDw3OTxCPTs9Pzs7Pj05Oj48Oz44Ojk5Oj86Pj1APkA8Pjs+Ozk9PTw5Njo6Pj08PEA/Pjk6QEE7OT45Ojo6Oz4+PEE/QT6QrKKiqaanqKSfop2qqKOso6OnpqyiqZ+Uo5iWn56dpK+boLCrqKyxyc3U18/Gu8esrbS4rK6jn6SjnqCkrJuWqZaNl42MjZemsK6lnZ6doaWinpuWlZaUin13cGtlYmhxb3F7hYqAdnBucXRwhbPCvsXR0NfW1tLWzdTW19TT0dPU1NLP0cPQ09bX1dbSy8nO0MvGzdHJ0dXW2dXX0tbYztLJztHMztDL0s++xsbJwsvLy87PxcbGtr/JvtLMy8/Fyce+wsLHzszP0M7MysfNuLe7qJ+mq6efmJ6jnp2qpa2pqKiSlYiQhIyRho2MiJOVmZCWjJiSj4aHjIR8eHN2cGNgZXJiXVJcSUpGQUVIST47QDg9NDU4NTo3Njo8QD07Pjw7OUA7OTo8Ozs8Nz09Ozo+Oz08Pjw/Ojo8Ozs5Oz89OTU7PD48PD0/Pz46O0BCOzk/OTg7PT0+PzxBQEQ8hqugnKegp6Oim6CbqaSlqaCfoaGmn6ifmKSim6mmoqasmqSwsamotdDU19rSx8bLtLbCxrK2qaKlpqGiq7WnmrGhlpWMkKatq5yVmKGdm6Gin52em5aKeGlkYV9fX19eX2BeYmx1c3Fwb2xycXWSxMfG1NXW19fT1s/V1NrU1M/P1dTU0dHM0c7T19bT1dDP0tPRydPQx9DY19jQ19LX2dXVzM7PyczRy87Pv8XBxsXOzNDQ0cjLy7/Jy8XTzcvOx8PJxsbIy8rU09DUz9LM0sG5xbGlqLWup5qorKWdsqiws6ysk4+TjoiLjoOPi4SQjpmNk4+Zj4+ChYx7enFzdG1hY2ltX1ZQX0pKQkZDUU0/PD40NDo9NTI3NTU8PEA8Ozw6OTpAOjg7Oj46PTg+Ojo8QD08OTs9Pzk6Pz07PTw9PTo2PD0/QD08PT0+OjxAQjs6PTc0Oj48Pz89RkFEPYKknKClnaWlo5mcnaSeo6OfnZ+doJqnnpyhqZ+vrquqq52mrrioq7fY1NXZ2dHO0MC8zMm3wK+nq6mjpLG2s6O2qp+doaqpoZiWmJqbnaGemZ2elH5yZmNjX19hYF9hYF9gYF9gZm1wcG5rb3J3d5vMwNLV09jY1tnR0tLXz9POy9PN1dTRys/M09bS0dbN0NXV0cXR1MrQ1NXVzdHQ2NfX18vIzsPIzszJzL/IvsfIzc3PytDNzsvOzsfKz8/KzsrByMbJzMnL0dLM09HRz8/Kvce5sK27uLWqtrCtqLits7+7sZqPn5SRjo2IjpCFkY2ZjJGRlY6RgIWIeXZvcG9rYmVucGFXXFpJRkZETFdFO0A8MzM8PTg2ODU1Oz5APTk8PDg8Pjk8QDtAOj04Pjk4Oj88PTg7PkI6Oj08OkE9PTw6Nj08P0A9PDs9Pjg7QEE9Ojw4ODs+PD0+OkVCRT6Bn5mlp6Cfo6eam5+cl56eoZqdmpyappufpKeeuLa1ta2lra6+tbHA2dLX2tzWz83Lw9PQwsKyq62urKazsbirs7epo5+clpSXm56fn56VlpiVimxfX15hZGJgYGBhYGBhXl9fXl1ibXJvb3N0dXZ5pL7L1dHW1NPY1s7O08vNzsXOytLSz8bOzc3UzM7TzcrX1dDM0dPKy9DR08nN0dXS1dXKwMnBxczCx8nCzMLFx8rKzsrMzM/N08vFx8/Mx8fKxMbAxcnLzM/Qxs/Ozc3Mz8XHwLe5vcLDvcO5srO+sLvDxLaqmKWhmZaRlZWSi5SNmpGUlI+PlIKJhXhwcmttaGBgcWhYWGhWTUdMSVBQQjtEPjs2Nzo4OTo1Nz09QDs6PD05PD05PT06Pjo8ODs9OTtAPD47Pj5BPDk9Pj1CPTs3NzU/PDw/PDw7PDw4O0FAPDo8OTs6Ozw9QTpFQUU+hJ6bqK2epKSqnJ6fmJKXm5+am56ZmaKVoamppcXDwb+7tbKxx8K5y9XW2drb2MzNz8nW1sXEuLK2qqOurbi5sbLAoZeOjZiWkJSSkZaXlpGMfWZiY2JgXV5hY2JgX2BgYWFgX11bXWdycXFyc3FtcnmkxtPPy9DP1NXJxMnJxsa/w8XOzsfFx83K0cjLzs3G0dLPzszUysfKzc7Hxs/Sy9DPxbrEvsbJvMLGyM7EwsfAxs3Hw8vJys/Hw8PPyMbBxsfDv8DGy8vLzsLKy8jHzNDExce6x8PIyMLPwL28v7DByse5vaqwsqelnaKcmJCbkKOZl5mRlZiJj4J3bnRka2BeZnFhW1dgR0hIR0lNVEc/Sj02NDM1NTw8NDg9PT06Oz08OTo7OT89OTw7PDg6PDo6QD1APD09Pjw6Qz48Pz04ODk6QD4/Pjw7Ozs7ODo+Pzw7Ojc5PD49Oz49RkFDPYOgm6qupa6qq5qdoJeUjpedmpmgmpqcm6WzsazJzcrIxL69us3NxtDV1dna29jQytDQ0tTKxbq+vrCot6q+ubmzpZKOjpaQhoOEhIJ+hYWAdGBbXl5eYF5gY2RjX11dXl9gYF9bWlxha3Jyb29rbG9vfbjRyMnKz8vNxLq/w7u7urm+yMbCw8DDx8rJyMrHwcXLxsjLzcnEwcnJwcHL0MTLyL+5wbrFx72/xc7Kwr/DusnHyLrHxcTKv73By8bFw77FvLy/wsTLxMS7v8nCxcfSxcHIvsrJxsfG0MPDxsOvxMvHw8q3v7y6tKmspaWYn5iso6ClmqOgm5R7dnJ0ZmlaYW5tWltYUURMRkJHRExDRlI/NTQzMzQ/PDM6PDw7OTw8PDg7PTtBPTo8Ojs3Oz05Oz07PTs6OD4+PEI+Oz88OTk7Pz07QD48Ozk5OTk6Oz06PDo2OTw+PDs+O0NCRD5/pZypsqm0rrCdnp6YnImUm5man6Kfmp2ov7i8y9DSzMfCw8fNz87N1dDW2djZ0MzUzs/Qy8S4xsG2tbyxwLa6rJGMk5eHe4CFhoB2eHVzcV9aW11gYWJjZGRlZGBcXF1dX15gW1laXGJvcm9raWxwb3OPxrzJxczAxsGwtrqysrSyscG8u7u5uMDBwcW+vbm9v7nEysXFwr3GwLe7xMm/wsm7t7q6xcO+vMHNwsa+vbXAvcO6vMa6wrmzu8XDwsK2v7a1vr+6y8K8tbrIur+9y8PBxcLFyMXIxdDGwszHssbJw87NwMXCv72yt7Czp6ioubGlrbCrrayUeXZ3amVoYGhvY1ZeWUpFSkZIS0FFQkVJQDk6NjQ4ODUzOzo7PDk8PDs5Ozk6QD46Ojw6Nzo7Nzo7Oz88OjxAPUA/PT8/Oz07O0A8Pj4+Ojk5ODk3ODo8PDw7OTo8Pjs7PjpAQEU+fqygrLWqt7SyoZ6fl5qNlJaan52mop2et8bCxMjO0svKysfNzc/SydHG1tXW2M/M0MjNyMrFvcrBsrW6t7q2r5GNioyFeYCGhoB+hHx0dWRcXF1eYGBiY2JiZWViXV1bXF5cXl1aW11daHNxbWdnbnByeZ29zMDDusC4rbCwp6qtrKe4tLa0s7KzurW9sbewtK6yu8K7wcS8v7q1srq+wLjHuLO7tcDCvLe9xsDDu7Svsra6vrPEtrq1rLi8vcC9sLm2rra6ssW8tq67v7S2tMW8vsLFv8PExcfLxcDGxrvHy8DPycfDxsHDt8O+vra5vsa/rLW6tbe2jnh0eGZnZWJrbl5WXmBGS0hISkZCQ0FERT88OjU2NTYzMzs6Oz06Ozs6Oz44PEE9PDo7ODc5OTk7PDo+Ozk+Pz1APz5CQD1AOjo+Oz89PTk6Ojo4NTY7PT48PDo7OT49OT86PEBAPIi3pquzsby8sa2foJmUlJiXnqujr6qnpMbLzsjGyc7M0M3OycvJy8rLxtHP09HPx8rGysXEwLzPvbO5vbm4t5uOh4mKe3l+hoZ3eIF9dGheXV1dX2BfYGRhXmNlY19fXFteXF1eWltbXV9scG5oZmpubnJ8pMe/ubi1sKusp56iqqeeq6yzramrqbOttrCyqK6nrLK7urbCubq5sKu1ubu0wrmvv7C9vLu1u8e5wratqqiwscC1uLyvsKexs7S7vKuttaWutq66sbCqua+tu627uLu/v725wr/GwsXAvMbBx8u4xcfFv8fDw7rExsK7xcnMy7O5wry6sohydnZraWFibGhZV1dbQUxLTUlFQUM/RkE7OTo5OTU4NTQ6Ojk7PD07Ojs+ODtAPD05Ojc5Pjk7PDo4Ozs6Pj45QT0/QD87Pjo7PDo9PDw4OTg5NzY4PDw9Ozw6Ojs+PTs/Ozs+QDyKwKuouLe5w62zqZ2ZlJaZoZymsLWxt6bGz9LMxMbCxdDIz8PEx8HGxsXFzMPKzMPEwcfAuru7yre0u721tauRiZCQfHl+ioV6e4SBeG5eXV1dXV9gX19kY2JjY2JgX15bW1paXVpaWlpdZG5vaGZnaWtucoGtubC1rqalp6eaoKSgmpylq62jp6KrqayqsKOmn6qttLaxvbmvt6+orri0tLu3s7yut7m0sbvBscGupKiiq7Gys6e8qquoq6yttLOlqK2gpK+psqWnqK6lp7assLK3ubq7sby9vr7Ev7XBwMfIt7/AxLfEwsC7v8TDvsTIzMq/vsPAwKmGcnNyamldYW9kV1ZYUEhaUlNLRkZFPj9AOjc4OTc3NjQzNzo5OTo8Ozs8PDc7PTs7Ozw4OT44PTs8Njo9Oz89N0E+P0A/Ojw8Oj05Ojs6Nzc3ODg3OTw7PDs5Ozo8OTc5Pjw+P0E7jMKvrry3ucSwtrCbmZWcmKqpsLGztb2vxtHQzcTIu7vMw8zAvcq5wMXAvMy6w8bFurzEvbm2vMW4tri7rrGVg4mNgXt+gH94dH98c3dmX11cXF5fYF5fY2NhYmBgX15dXFpYWVtbWVhaXF9ma2ZlZ2Voa29yhaqlrKagnKGllJ6jm5eRoaOqo6KfpKSnpKyfnZukpauyr7a3p7Csp6q0q7S5sLa0rLa4sa+6ubC3pJ+jn6axp6unuaqkpqeop7KtoKemnpqkpqyen6ekn6CwrKyssbOys7C1vLa7wcGyur7DwbG5ucKzwL2/tbi7vb68wsbEwsO+v8Ogg3dwbGFlX2tvYFVZX0hOaE9UR0VKRjw9Pz06Ozs4MjU1MzY5OTk7OTo6PDo3PD88PDs8ODg8OTw6Ozc4Ojo8OTg+Oj89OTg8Ojs9Ojc2NzY3ODg2NjY7Ojo7OTo7PDg1OTw6Pj5AO43Itba9uLrBu761oJ6UnaGmurars7O7s8XQyczDx7m4ycLOwbrLub3Iu7bHu7fDxrO+xbu2r7i/u7Cztq+ihIeHgn15dnRwbWtqanFpX2BdXFxdX2BfYWNiYGBgYF1cW1xcWFlYWFhWWFtdXmRjYmVnZ2dqbW+Inamgl5WaoZabopiVjZ6hoqabnp+jpaCnnpqim5+qsKyxtaKpqqmrrKS1uK22r6yytK6yta6wqp+dnqOisqSlqbitoaamn6isq5mfn52ZnZ+lmpmjnJudr6irp6qrrK2wsriuuLm6sLa7u7qrs7K5sr20trGxtbS/tb2/vcLBurq9l4N6cmtfZV5kZFhUWF5JV11LUEdJSkZBPD8/QDs/PDA0NTM2Ojs5Ozg5OTw8Nz4/Oz07Ozg4PDg5ODw3ODo7Ozo7Pzo9Ozc4PDo9PDc0Nzc2NzU3NDY2Ozc5Ojs6ODo5ODo7OTo8PzuJyba4vru3wcHBtKSkmZqkpsCyr7astLfG0MnJwce8vMXF0MG8yru7wbu1xbi1wcGzwsO7rKm0ubensbKpi4aIgHlzbnBua2NeYmZmXV1eXV1dXF1fYGFiY2NiYV9cW1taW1lYWFdXV1hYWFteYmRkZWZmaGlrco2onZSUlJuXm6GWlpCcoaGonZucpaWgpJufoJqYra2tr7KgpaKtq6ahtbCxsaynrrKnubKmtqCinpqjoa2ioam1qqKjpp2lpqOWmJ2XmJudn5mXnZycm6yhq6aio6Wtq7KzqrSwsqqyuLOuqa+ysrK3s62prK6xt7C6tbm9vrazsZSEeXVlXmVeW1lWU1pVTFxRTEpFSEtJQj0/QUFAQDoyNDUyNDk5ODk7OTo9PDY9Pzs8Pjs3Ozs3Nzc+Njo+Ozo4Oj07PD06Ozw6PTs4Nzk3NDY1NTQ2Nzg1Ojo4Ojk5PDg3Ojg5PkA6gci9uL2/tr69v7OdpaOYpbHCtba9rbW4w83JyMHGuMLByNC6w8bAtry9tsO6tr/Btbu/uqqmsLqxp7Gvmn2FhYB5cHF0cWhlZGllY1xcW1tdXVxbXmBhXl9fYF5cW1pcWllYVldXVlhXWFhWV2FkZWNkZWRkaGp2opyUlI+Vl5efl5mUmJ+doZuWoKGoo5+dqJybmqqmrrCrm6Ojtqmgn66otammpqywo7avo7agopuYmKumoZusuK+ioaOcoZ+gk5WhlJaWm5iXlpeclZ+onamjoZyjqqqwraezq6qmrLKwpaqusrGvsK6vpqensq6xtK+7s7m3raOUgXl1ZF5hVllXU1JUS01eTFBMR0hMS0U8QD48Qjw7NzU1MzM5ODg5OTo5Pjo4Pj47PTw8Nz49Njc2PTc7PTs5Nzk7Ozw+OTk6Ozo4Njc2NTQ1MzEwNDU2Nzk6ODo5Ojo3Ojs5OT1AOnbAvLW5wrG+uLyunaeno6q7wL3Aua60uMLNyMfExb7HusrNtcTFxLG/v7nAwbq/v7m5vLenprC7pqihpImBfnhyamxydHBpaGVkZ2JcXFpZWlxcXF1eXVxbXF5cW1xZW1xaWFZXV1ZXWFdXV1VbY2NiYmNiY2RmaoGWk5WLkpSTm5iclpaboJyflaCfpaSjpaaenJ+kn6qvpp+ipLWnoKGip7OhpaekrqSwrKu0nqCdlJSpoaGUrLGwnqKjnZ6Ym5OLoZSRk5eYkpeXmJadppumoaKZpKSkq6SksKaloqqrrKWorq6uq6ipqbOlpquus7Guu7Wwr66fknl2cmVhXFpdWE5MUUdSYU1WUE9KTU9FQkQ/OT02OTo3NTQ1OTk7OTg4Nzw4OT0+Oz47PDY5Ojc7Njs3Ozs6ODU6Ozo7OzY8Ozg4NDY4NjMzMjEuLzI1NTY7Ojg7Nzg3Njw7Ojs7QTh4u7uxtb2wu7K3rJ6kpq23u7zBxbqxubbFysvBxMfHybjIxrXFwsiuurzCvMLAwb28t7q2paextZ2iipiIgHdvZGJnaWhmaGpnam1gXVxbWlpZWlxdXFtcXl9cWllbWVlZW1dVWFdUVFdVU1RTVWBgX2BhX2BhY2RpgZSTiZGOk5KTnJSVlqSZoJacn6ShrKWjo6KjoZuqqqWZnqWwqZ+fnKSqnaehnaurqaitraKhoZSXopqcj6qosJufop+el5iTip6SjZKSlY+YmJOboKKcpKChlaCho6SboqqkoqSqoqutpa2xqaalpqa1pqqorbO1tLm6r6msnotycG9gW1dWVVJGUU9IWlxPUkpUS1NMRUdJQzg7Oz08ODY2Njo5Ozo6NzY5Nzc6Ozo9PDw2Ozw4PjU5ODo4ODY1OTo7PDk3Pzw5Njc4NDUyMTIxLi4xNDI2Ojg2Ojg1OTg5ODo7OUA5e7W0rbS7srCssq2dp6evubmzv8i6tsCvxsnOvMLLzcm3y8C0wMfMsLW8x7vBx8O9vra6taSqr66dmYeOg3x1aWpqbWhqbG5ra21lXVxcW1tcWlhaXVtbXmBgXFhYWllYV1hXVFZWVVRVVVJTT1FZXVxdXl9fX19iZG2Oj4SRho+RjpmTlJKcmqKcm6CnqKqnqqWopKKYpK6klJmlr6mfm5iaoJ6umZupsp+kpp+jo6CUk5uWlZGoqayanKChoJqUkIyZjouQjJKMlpSQnaGgopybopWboKKgl6GooqKoq6Crr6Stt6Wio6Ksramoq6+zuLK9tbOrr5iDcnJoW1hZU1VSRVlMUVxZTVROUExRUklOSUI8Pz9BPz02NTc5OTw8OTg3Ojc5Ojs8PT47Nzs7Oj02Nzo7ODk3Njk4OTo2Oj05OTU3NzU3MTE0MC0rLzQzNDk4ODo6ODo6NzQ4PTg/OX6zrqiztq6op6+tm6morLe2rLvKu7a/rMzHxrnCz9DJtca+ur7Gy7SwvcS8wsTDvMCyua+lqq+rnpeGgXd4b25pbm5ucWdoaWdkXVpbW1tbXFtZWltcXF5fX1xYWFlYV1hXVlVUU1VWVVVUU05PUVlaWlpdXFxeX2Bkfo2Bi3+LkIqSjZeRlpmioJufqqqmraqmr6KnmZ+soJSVpKinnZePjpmdrpaXpqmYnpyTpaCdkZCSkpKVp6qkmZmZnZ2WjoyLk4aIjYOQipGUkKCdoKOXlZ+VmqChnZKbpaWnqKigsbCmsbymn6Ostautp7C0sLm1v7GtsauQfHByYlZUVU5SSUdWUFNSTExYTUpMTlJHTUtBQ0ZEQz5ANzU4ODk7OTo3Ojo3PD06O0A+Ojk7OTo/NzU5Ojo4NzY5NTg3Nzk7ODU1NzY2NjEzMjAtKi4xMDI4Nzc7OTk7ODk0ODs4QDh/s62msbeqpaKwq52qp6mysKS2xrS5urPLxrq8w8vRzLS5ur7AxMe1tLa8srq7w77BsLOtsK6wq5uiiGtobW9yb3FrcGtkZmdlXlpZWllaWlpbWlpaXFxdXFpYWFhZWVdYV1VVVFJTVVNWVVJOTk5SV1hZWVlZXFxdYWqAen92iY2HkImYiZSTmJqYnaibn6qkpKucppigpZuSj56impeWhIORmqOPk6KclZWWh6GampOLjoqPmaOnnJWVl5uQkoeUjoyAi42AkIqRkpGgmZ+hlZOYmJShpJiMmaSmp6agn7Syp7K3oJyit6yqraSysqa1vLWrq7GjiHhybV1OUFFMT0ROTk5QTEZOTktKTk5RSE1KQUdLSEhDPTg1ODg4OTo7Njk6Njg7OTk+PDg6Pjk7Pzg3ODk6ODg2ODU3Njg4OTc0NTc3ODIwMzAxKiktLzEyNzc2Ojk5OTk4NDk4OEE3d7anpLawpKejqaWgqaWks6qissO1tbKzx8e4u8TKzce1r7y/uLzEs7KutqKstcO6uq6qq7Svr5+Xp31eYGdzcXZxam5pZmhoal9YWVhYWFlZWVpaWVtbXFxZWFhXWVlYVVZSU1JQUVRRU1VRTk1LTFNXV1ZYWFlYW11hb3N2cISIgoeAkYOOipSQk52hjpqboqCil6SWoZuVjIeYmoxzjYJ9jJaWhZCZkJONjnqZjpuLgol/iZifop6Qk5iWhI6Bk35+c4mOepCGkpCQnJqZmZCVj52NoqKNiZqgoaOjm6K0r6yvrJ+YpbimpbChsa6csLuqqa+qmYF2cmJWTFFPUE1DU05MUU1DUFBISU5TTUhKSkRKTEVKSjw3NDk4ODg7OzY5Ozc6PDk6Ojs3OT85PkA3OTo8ODk3NjQ0NDU4NzQzMTI1ODUvMDEwMikoLC0xMjc2NDg4OTo6NjU6ODdBN3e3oqO0qKWlqKOmpaalprOnpbTBuLC0sMrGubrCz8e/tK+9w6+xx7Ktp6yVo62/t7Cvn6esrKqWlKJyV1ZgaGdpaGluY2poZ2JcWFhYWFhZWVlZWVlaW1tbWVlZVldXV1NUUE5QTk9PUFNUUk1NSkhOU1NTVFVVV1lbXWlscmx/hXx0Tlhyj4KXho2cl4qTkJ6XnJWUlZOOloh/k4lfO1dve4qTiX+LkYyPhYZyioSWgXiCeoWTnZSDlY6Rj4KGfJJ4cW+FjX6JgJCNj5eZmJOKj4ich56XhoeWnpqgoJenr6itqaielq20oqatmayrmKezoamto5J8cW1fWk5TUVZMRFRKUE1NRk9PSkVMUU1LT0pJTU9GSUg9NzU5OTk5OTo3Ojs6Pj44Oj09Njo/OD4/NTg5Ozc5Njc1MzMzNzYwLi0vMzQ0MTEwLy8oKSsrLTM4NDQ4Nzk8Ojc5Ozg2QTl4t6CiraGmpqmgp6inoqmwqKe0wrmxtbDJw7m0v8/AurGxuMSrrsmup6KdhZqiuq2mp5WlpKOglo6WaVBNUlZaWlddXmJnY19ZV1dXWFhYWVpZWFlYWVpaWllYWFZXV1VTUk5MS0hHYlxNT1JOS0hGSE5RUU1QUlRWWFpgbW9peoJ0UEJAf5WRkX2JlIyEio2ajJaVipKHhZWFeIh/YEpRbniKkYR8hIyJhH5/bn5/k3d1dniEjZlwUY2Iiod7fniUdmd3hYh+ioiVio2QkZaLg4mHlISai4GEkpuWnpyUpKOnqaWjnpuxq6GkpJGmqpahqZyipqiHc2tlXVtIUVFTTUlVTVNJTExQSUdGS05MTVRLUVFPRklDPDc2OTo4Ojs7ODo7OD4/OTk+PTc7PDY7OzQ3ODs2Nzc1MzQ0Njk2LzMvLjExNTIyMS8sJykrKiw0ODMzOTc5Ojk5Ojo6Oj85dracoqadn6Guoaeopaanr6yqtry2uLazwry3qLvJubepqre4rbbAqqKbkoKPmbGfoZmMn5aYlJGKjGVNTE5OT0xNUVdbXFpYWlVVVlZWV1lZWFhZWFhZWVlaWFhWVldVU1BNSkVAQJtrc3NJTUtERERJTk9oWU5RU1RVWm6DdHd+amldVY+JlIl0f4aAe4WMkoCRmYuPe4aPf3V/eHNudXB0jY2BeX2JqoR5emh2e45wcm14gIqMknh6gHuAdnJxknhndYSDhIR6lYmIioyKgH+Diox/k4N6gI+YlJuVkZ+dqJ6fn52gqaWfnZiNqKSToJ+Vnp6kf3FmYFxcSlZPUUdLWFJPSk1NU0pKSk1QSExRTFJUTUVIQTw3ODs5OT49Ojs8OThAPzo6Pj03PT03OTkzNzc5NTY3NTI1MjU3Mi8yLiwuLzIwMC8tKygoKS4xMjYyMTk4Nzk4Nzc2Ojw8N3aumKOhmJyetKmvqaWsq7Cxqr20sry4tru1s6C4u7OrnZ+tq6y1s6WelpGYhpOklpyMgpaIj4mGhoNmSklKSUdGSEhQVFRUV1dTVFVVVVZXV1dYWFhYWFlYWVlXV1VWVVNQS0Y+OTNOPH6eTUhKREA9QURqlH5MT1FSU1ZedYN9eWd3jZeYjo99Z3mAdnh/iY98hJiSgXKGj3t2em9rfq18c5CKf3uGkoB9f3RmdnyFbG9nc3yJjIeAbHlxfXBtdY9yaHGAfY5wQ4qEgoOEf3d3eoqEfYt6dH6Oko+YipKbm6OXmZ2anZ6inZaNi6Wbj52XjpaYjnVta2VhWVdYVFFKU1ZUT1BPUVdLTktPT0pRT0lPT0tGRDw7Nzk7Ojo/PTk8Ojk5Pz87ODw9Nzw5OTk5MjY2ODU2NjMzNjIxMjI0LiwsLS4uLTAtKyonJyouMTM2Mi84NzY5NjY1Mjc5OTV5ppefnpagprCsrqunqbCvsay8uKy7vrm0rqmbsaitnJCXnqesp6SbnZOHln2OlZGUgHuKeoSAfn6AZUpHSEZCQENESUxMTVFSUFFTVVRUVVZXV1dYV1lZWVlZWVlWVlRTUUtENzhmNzA/qGlOSEM9OzpEioV6WkpOUFFUWF5lcHJtiKeqwH51eWJ7d298eYiPeXyLhW9tjJF4c3hqan+CcpaRi4F9ln9JkphuaHd+gmxpY2x5hZCShmtzbHxucnuFaW1wfnOMiIOFen1+enZvdHSFgXmBd3B8joyKk4OWl5iakJOWl5mXnpeMg4mfkoqSjYaQln1saG1ubVdVV1RSUVlPU1VVVFlWTU5ITktOTktDSU5HRT86ODk7OTk6Pjw5PDs6Oj0+Ojg6PDk/ODY4NzI3NTY1NTQxNDQyLzAyNCorKiotListKigqKCcsLTEyNTAsNTU2NzQ4NUhBODk1d5mRm5manqStsKKtqqi1r66stL+rvMK/pqOalaWYn46FjJaipJublJaPdpF9hIuQj3x4fnR9d3R3fGZPRUdEQDw+PkFGR0dLS0tNUFJSUlRUVFRWVldXWFlaWVlaV1ZUU1BMRTFAmjMganJBmW87PDk1PICChl9JTU9PUldaUllcYKeIYpppdHplfm9tf3qLiHWBiIZ0bJmRc3N8amudjkx5hJKJhI5nMXaGc2x+fYN0ZmV0foSEhYBmaWx1a3B/e2dwcHtuko2Oe3N9fXFwbnVtgn53eXRqeYmCiImDlpOSkIuNkZSVj5eOgHmIl4iGiYZ/kId1aWluZ2NXUVlXWFlcTlBWV1pZT0lJRUpKSEdCQUZEQ0c9OTk4Ozk6OTw6OTs6OjpAPDk6PDk4Pjc4NzcxNTI0NDUzMzY0NTAzMS4qKisqLCwrKykoKycpLCwyMjYtKzU3NzU0NzhpTzg7NW6SiJmRmpakqK6esp6muq6rsrDCsrvDx5uXj5SZi46GeoWRmpaPko6SinOJhHeLj4x/dnd1eHZveHNpVUZJRD88Ozk6P0BBRERFR0pMT1FRUVFSU1RVVlZYWlpZWFZVVFNQS0U4MC9cYLNHOVhQOzk0NDGWuotITE1PUFFWTEFJUUlir7OgcXx4bX1scYOBhYF5g4aGeXGflHN4gHN1lIc1cZ2onY6hoYSihHZwhnuGe3OMrY2IgGhmYmltcW1vgnVpb1h1b42akXZsf3t8bXJucH96c3VtYnaEf4aAhpGRiouKkouRjIuPg3Z5i4+AfoOAfY54cG5ual5aW11bWVhhYFNPXFtZWExISkZKRz9DQUJHPkNEPTs5Nz07Ojs7OTo5OTs6Pzw4OD06ODs2NjY1MTEyMTM1MzQ3NTUzMS4vLCwrKSopKSoqKikoKikrLzNETTIxNjY2NDM8dlI3PTdikoGSiJaRnaSnnq+VpbSorbCuwbO6wcaXkIyUkIGJfW6CkZOKhIuJkIh3hIVul4qMf3l7e3F7dHxrb15KUEc+QDc0NTg7Ozw9PkBCRUlMTExNTlBRUlVVVldYWVhWVVRTUExFPDUqnUtbQC1nSTk0Lz6Sg6muX0hMTU5QTDdDTVJTREqGdoB8fHZ+bHeHh3x9hYJ/jH51oZl5foaAhJmFm5xhhqqfnYuCkI16doh+iYeOc4qXj4N7XGRxdHp7d4ptZ2lheW6Fj4J6boF3c4R6cXN5d2tuaV13h32HfIiIj4CLk5eDjYaNh31xhYCEfHV3e3yHdG1xcmRlXlpaXVNbZ15YUVZZXVdHS0tFTEc/RkBEQz5BQT07OTc8Ozs9PDo6OTk7Oz0+Nzk+OTk4Njc1NDI0NDEwNDY0NjY1NC0sKSsoJycnJigoKSkoKCsrKy8wMFVxPDIzMzMxRX5XND05XIx3iX+UjJGdnZ+mkaCqn7Cpr8Cxu8W6lo+RlIh6hnZrgIySg36LhZCNeYSCdKKFjX9/g4Bzg4F9bHlsU1hMQUUzMTEyNjc2ODg6PD9CRUdGR0pLTU9QUVNUVVdWVlZUU1BNRkA6Mj0gI5ZjjFs1MzExaT9Hb0lGSUxNT1JMS1RdWVJKaYSIe4l5fHJ8j4t6fIiGfpeHd6GZiIaPkpSljaypSIatr6+KgICTioGLgYSRqIeAmJiKnHNsfIGGh32OaGdneH5thYaBhXGEhUdrgHhxeXZobWtfd32DiH+IhYx6lZ6ciouJkn97dYt2fHhtb3d+fXFxcGpaXFtaY2NXZ2ZdVlBRWFpRRExMR09JREZDQ0FAQ0E9OTc4Ojo6Ozs6ODg4Ojo/PjY7Pjc1OTU3NzMzNDQyMzY2NTY3Njg7REZMTU1MQzcrIiUnKykrKywvMDArbnUyMjQyMEyBXDU9PF6EdHx+ioWHkY+WmJKXoJ2soKe5r7O9tJeNkouYi310cX+Kk39+jYOUlX2Hf4alh4mAg4iGeYiKgHWFeV9jVkxDNjAuLzIzMTIzNjY4Oj0/P0JFR0hKTE5RU1RVVFRWVVNRT0dDPzgwLCOHWz4/ODQuXZVwc6NVRklLTU5QV2BZcFpcXmqNk4eVgISChZGTfoWIkICaloKgoJeVm5qlrZOZu7Gnu8jDp4qMoaSOk4mAkHtyg56fkZx+doWFi4+HkGlob4OAdIyGhItxh4J2h4B7doV9bnZ1Z4GUj4aJiYiJiKKro5aJj5iAe4KKe3pvZ2t5fnd7cGljXFlZXGldYWdgW1BNTllTUklRS0ROR0NLREJARERBPDo4Nz08Ojw6ODg3Nzg6PT04PD02ODc1NjYyMzQ0NTU3Njg2NzxCQj88ODo+Q1FeZVxHMicmLCwtLS4xKD+MWy4zMTBPg180PztudnBneIN7gIyAgZGPi5qapJyhrKarr7CXkpGEoZSEeHeAjZR9f5KGk5Z/i4GSm46EgIKMi4KJjoWAioBtcGpeQ0E0LS0vLy8vMDIyMzQ3Nzk7PT9CREhKT1FSU1JTU1RSUE9IREI8ODcvOUM+PDw2My5sk5dNUUlJS0xLTlZgY39nZ211nZuPmpOTi46PmoiTj52LoKGSo6mko6yTqLaip8HCrseveLqUmnyMoZ6ZhJKEgo+hnpOZkoSKhY+YkJVsb3WJi4GVjI2Pd5CEcWyFgYqXkoOFiHKJoZeHk4qPkJeltqmbjZaig4eThX6Aa2prfX59f3FfW2JeWWZqXGxsX1lMSFBTUU5OTUdJUURETkZBQ0VHQj46OTc9PDo7Ojk4Nzc2Nzs6Nj06Nzg1NDU2MzQ1NTY2NjY4NTU2MzEwLiosLCkoKS46UGFcQCwoLSsrMCwncog3MjQwT4RiM0A8dW5oWXCDcHWHcXaRhn6XlpqUn5+bp6CqlpOYnmhmpJp+hZSSeoCRiZKSfYuFmZKRg4CBi46JhpKIhImFeHh/aE5SPi8vLiwvLi0vMDAwMjEyNDU3Oz9DRk5QUlRQUVFTUU5QSUVFPjs8OkNGPz48NzUyPEBSNUhISExMTU5SXm+KfHOBfaCdm6emopmhl6KVnJ+onqmrn6isqaq1l6u+q7bIybfI0c++m6Bwaaqon4STkYWcoJqamaeRkYiVoZmad3p+lJiRoZKXl4GUnnt2lZKrs4mNl6B9lZ6cjpOWmqSjp7awnpGaqIiXkI6CiWxzc3x8eW5mXltfX2FnY2BnZ11SRUtLUU9KSk1HR01DSE1GRkNCR0RBOjg1PDw4OTk5NzU2NTg+NzU9ODQ3NDU3NTQ1NDY5NTg6NjE2ODYzLzAuLSosLy4tJyMqO1hiQigqLDEtKEuXXjA2M1GFZjNBQGliX1BxdWBufWF3jn18lI6Oip+Sl56VnKqYnqpCRH2HiYiZjnmCjYuOjXyKhpCRj4KDgYmMioWThYKGiYGAh3dfYlA0NjAtMS8sLjAwLi8uLjAwMTU+QUFNUVJTUFJUVVNOU0xFRUA8Pj1GSEBBQDg2NjI8OTxGSEdJSk5PUVlthpB3lYujp6q1vbilrqysqKm0rLC3srKtu7Gzvpyzw6y7ycu4w7+3paOwsqysqqOKlpiFpaagopiCppmNoqqnpIeFk6OgoKqhpKmOnLCLlaSnuLucoaOwk6Odo56RpKKssK2ztaOVpquJmoqTi5V6e36De2VeZlpjYF1iY15mZ2BbUERKSFRPRkhMR0tIRkdIQUtGQ0ZGQTo4Nz08ODg6OTc0NjU4PDU0PDc2OjU0NjQ0NzM5PDM4PDIwMjU1MS8xLi0qKi8sLSooKiYlNVhYLywwLCwwhIE4NzFQhWg1QUNbWFRMaWNXanBYeoV2gpOFiIKcg5KRjJLayJ2Wc1aXiI+InI99hoyPi4p7iYOHkY6DhYGMhoWIkoaChImGh4eHcW5hQEU2NDwzLzExMC0sKy0xLy00P0RBTlZRUlNVVVdVTVxRR0dEPD4+RkhDREA4Ozw1Qzs9RktKR0hST1BXgZOghK6js6qywcfEq7PFtq2zwLO4vra/tcG2u7ukuMaptsnHtr65tKijtK2wsJuZkpqfiaevqqSVd5+kl6GrsbKYlqmtqK61u7K6rK+1orGssrW8uLWutaCnqKOom6mwrrO6t7monLiqjaWPkpSghnqBgHJYX2JVZGBgYV9fZmBcVUpERUxWUklKS0VLSEVBQEBLREJNRjw4Njc7PDk3Ojk4NjU1NTcxMTw4ODk1NDY2NTk3Pj0zODkxLjAxMjExMzAsKiwuLCsrKyooJyopRVowMCovK2iSTzYwUodqNkFFV1FKTFxaUWNkV3p1cYGUfYSGk3aGfoCNe7+7o7yCtJSTjpuPhIiPk4qJeoeBjJONiIWCjoCBiY+Gf4aIhYqHkXp5b11XQEVOPDY6NDZBQjc2NC8vN0NIQ1FcT1FVWFVcV09fVUlLSkFAPkdLRkZEOz5AN0Q3P0JKS0VGV1RQXo+kraSytMO2uMHMyre8xL2ztMK4uMK1v7C4dLG0prrFpLDGubGzsrSopLa2qrCgopabopKlsa2lraynpJigrLO5oaixubW7vsy/xcW9vLPCuLq4v7i7uLqtrbGmsaquvrG9vMLCrZm7qZWuj5iZq4l+gHloVWFfVmhjaWVWW2RaV1VKSEdNUkhESUtBSUQ+P0JCTEBATUQ5OTY2OTo/Njo5OTY2MjQ2LzE5NTk5MzY0NjI3Oz0/NjoxLi81ODo6NjUwKigsLS0tLCwqKCgrKyhFUy8qMDBKj2s1MlCHbTY/RlJMQUxSV1RZVlp3anB/j4SBjoRve3J4iGK5oZqjiZWUlpOUk42Pl5KHh3uHgY2VioGEgYp6fIuIhnyKgoGLhJV9eHp1ZlBcZEdFTDpRZGBbXlNGPztIUEVbY1FRWVlaZ1pTYGFNU09FQT9JSkhFRkFAQzxENkI/SEdKTFRaVF6Ur7i1u7nJwLu9ys28vcG8uLa8vLe+tbqyxmB1sqWxmp6rvqqlqKuqpKKztaCrp56Vlp6Yn66lp6elnqOUoqews6eysry2wb3TycnTxsLFzMLKw8G+vr+8vbi1sLm3t8O6xr7EybGeuquirI+mqbeKgHxvXF5eXFVgXWhmU1liV1NXSkZGTktBPkhEPUtCPUJAPUY+O0hANzk2Mzc5PjQ4OTo1NzA0NS8yNjM4OTM3NDUyNj84QD5HS1JUVFJQUFFSUUpBOS8sLCwqKygoLC0rL1A+KC40OIB9PDJLiHE5PkNLRUBKTVBSTFFdaG1scZCNhpBzbHJyc4jVwLaaoI2VmZmRj5eSlpaOhoh9h4OMlop/goCCeXuLhId7i3mBioKXf3R9emxmcHZZXVxQZWViYGVkXVtYWFxOZG1VUm1uX29fWGdlVVlUSkRCS0tIRkhISEhCSTlEQEhLVFRWXVpbk7nAub64xsG7ucrLu7e6tri5tLi1ta63t5lkdamerXBeoq2dmKGim6Seq6WUn5+QlI6WmJionqafn5qZg6OdrKSqsKy3sLy41NDO1s/Jy9HMz87Kx8DAwsq+wb3BwcXExsrAyc+0pLyxtbCcrLm9mn13aVtcWVdbX1hhYlFcYVRSTERCRkhGPEBGPkJJQkBEPTpFPj1KPzQ3NTM1Oz00Njg5NzcwMjIvMjQxNjk3NzU1NTVEM0VMTT41MTAwMDY6NDc3QElPSjsuJioqKC0uLyxATSsvNTRtiUkwSIl0Pz5CREBDREdLT0RSXFppYHCXk5GUbmxvdHWHs6yhoZ+LmZyZjY2WkZuShYqKf4mGjJCMiXyBg3N7ioOFe4p0gYqHlX90e3lsbXV8aXNlaWxoZmppaGBmaWltWm50l62kvYiHZ1tvaF1aWVRIS09QSktQTFNRSExBSkZLUF9fYmdqYpi4x7C6tLu+trHFx7awubGxu62zsqisuK2NtqienKeaTpuejY+glpGnmKWVipOTiJGJkJGSnZuhmJuVloeemaaarK+or6ezs9TU1NbRy8/T1M7Tz8zFwsrQv8rJy8nSyM3Ow9DSuLDEvcS6pre7xaJ+bGFZWltWXlZZZFpQXVhPUkNDSUZESjtBRD5CSD9AQjg7RD5AST01NjY1NTs6Njg3NjU0LzEwMTQ2Mjc4ODc1MzY3QzVCOD8tMCwxMzQ4PTk3LC4sMTtGTD0pLCguMDAwN0s/LTQ2VIhXMESHd0M7Qj5FQkFDSk0/VVlTZldzkJGZgmhycHl5g6GqnqaXjJubmIuOlZGajn2Ji4aOioqLkIh8hYJwf4eChnuHcoOSi49+cXl1bHF4f3J7bnhzbGmAcG1jaW5weWl4fX7Lv8Pfp25jeG5kW2FgS1BSVU5ZXlBdXU1RTlRRVVRcbm53g3KXrristaiwtqutvcGyq7WmpbmnrK+irLSkj7Gum5iYjJGUkoWPm4GNp5KciYOLhIqJhIuElJWXl5SbkJyYmZmenauspKeirKzO0tXRzcvS09PQ1NHOyMPU0cjO0tPT1s3S0cXS1sbBz8jIw6m/uNCcdmtiWl9bVV5RXFpQUFVRT0k+QUdCQ0Y9QUI/RkU+QD86PT08PEpBNDU0NjU8ODg4NjY0NDEyLzAzNTI2NzY4NTMzOz08RT1AMTErLzM0OT81OTAxMDIyLTJFTzMpLzMuMzI9TjI0OEN9XzJBhnREOj09ST5AQ0ZIPFZSTU9bdYeGi3dsd3B9foCgnp6hjI2Zk5SLjJOPloV5hZCRj4yKiJGHf4N7cn6Agod6hXaFk5GJgG93c2xzfHx3fHOCeHFrgHJyaXByenlye77Lm3+NsoR2coV3aWFpXURaWltXZmRYZWtUWF1dYWNeY3h7f4yCmaqkpKKgoammqrK6q6a0o6KuoqSuo6eyoImmm5WTkYqSj4mClIlrlaONmYSBhn6Rg4OUl62LlY6Vmo6FkpCdl6evoaCgpaSoyM3Px8LL0NPR1NLO083G1tPN1NjW1tjV19XK1drNytjW0cutxMPMh29rX11cVlJXUltQSkhKSktAOzo8RUNFPUNEPkhDP0NCOzw5PDpHQjQ2NTQ0PDU2ODc1NDMyNTAvMjU0Njc0NTU0NDw+PUU/QTYyLy0xNjs9MDgxLzI1NC8tLjtSMDE3LzUzMkVEMjg+bmI1PYF0TTk5QEk8QUQ/QTtQTEZLWXGAdn5pc3lygoqAnZWelIWLlomPiomOiI+AeISUmYuNiYiLiX+EeXN7fYOHd4B7h5GXgYRveHFudYB2eH10hnx5bId2dW59doR1eXyeto08QYvGpX6NfWplV0lDZWNmY2hqZG95W19maGtuaW6Bg4mSjJ6foJ6Rl5mgo6Sns6WksqCipZ+iqaKjspyHn5KSk5GLj4uHhI+EfpycjI2ChIV6lH+CqpajjJKLmJOLfZeKmpGqs5ianKecpr3Dxbi2xc3R0NLQy9LLydTO0dXa19fY1NnYzdjbzsna2tLWv8zNtHRzamFZVlBTUFhVRUdLSkZGPjo3OkBCQzpHRUBFREJEQTs/Ozs3REM3NTY1NTswNjg5NDQzMzQxMDE0NTU4NzQ0NDQ5QD5EQkM8MzMuNkZUV09RSkFKRj8yKiguQlQyOTI1NC83Szc1PGBiQTxzdlY4N0FIOj9CPjw5UUVDSlRsbm9wYnFxdIaNfZeRnot/h5KDiYaFioKIfXiFl5eJj4OIhod7hXlxe3uEhXV6hY6NnnqNcH1wcHqAcnuBcoSHgG6OenV3fX2DdYB9h4mwdFmqwreNkoFwbmM9XmhycXFwbnd3gmZpb3J1eXJ6i4ePlJKblqCWiIyTnJ+bn6ugoaycopqaoKafoKyajJqNkZOOhX2IiIOFi46gmZSIg4d+bJl6hJmHiJOMjpWMhnubiJOPrquTlZeemKautbyorb3Gy8jJy8vPycPSytTX2NfY19Tb19PZ29bP29rS1snVzJJ0d2VkWFdOUVJcR0NGSUk/Qj49ODo+QDs+ST1AQkFCRUE+Pzo4N0RCNzU1NDc5LjU2NjQzNTUzMjMyMzY0NzU1MzQ1OEVCRENFQjU2PEZOU01bbmZjbnNrYFY+LDVMRzg2NTQzM0JGND1XX2hMdXheODs/Rjw8QTw6OUQ+Q0dSa19tZGJmbHaAiHGRkJuAeYCOfoOBgoV/hHx9hJiOh4x/hoeBd4N5b3t7h4J0epKejqF2kHaDdHWBfnSAhG+BkIJvkoV1fYKFeneHfIm4xqXDyriClpyPeHBmTmVjgnqCd4WhkYt5eXd7hIB8hHZtlJaVlpCYkYOJj5eal5emnZigl5+Tk5ijnpuslpGQi46Tg4yFiYmChpCRnpyaiIWMgYaYe4iJn5ePiY6Li4J8oIiQirygmJOXmZyopqWtnqe1v7+/uMfJzc7EzcrR1dXU2dXX29TX2drb19va2djO28aCdXVjZWFdUlVVVE1LRE5EOz09PDk6PD85PkE2Pj9APT8+PTk4NjdDQTY0NTU9ODA2NjU1NDc3NDU2MTM4NTQ1NjQ1NTdISD1ESkU3OTI1O0g+Ozk7N0lQXFpSVVhMOVQ+Ozk1MzI3STg9TllNSHh4ZDU9PkM9PEA6Njo+PkBFUV9ZZmFdXGl0enlsiY2Sd3Z6inx+gH+AfoZ7foKRioWGeoWIfHZ+dW19fYd+dH+SnpGgg5J8hn54j355i4pvg5uBdJmHfoKKhXx+kXuQqY+Qw6C9jZyknH6KhX2Jc4yLgHOmmpyYlIV7j5GJhGlHcKGknoyMkZKFiIuRk5WPnZuTlJGXjYyWn52UoZWSjo6RjH6Qj46LhImSlpmfn4iMlJGdkIOMf6aZiIWOg4aEgKSFiou3l52RlJWhpqCdnZ2jrra5tKvAxsrQx8fMz9PS0tjS1dfA19jZ29ja2tnZ19y2dHRzZmZiVF1ZUk9OSERMQz49Pjk5Ozo6Ojw9NkE+Pz09OTo7OzM3REA4Mzc4PjcwNjg4MzU3PDM3ODA0OTc2NzU1NTQ2RlA1RE5JODkzOEFLPTszQ0BJPDpEV088TVRITj85NjMzMz5DO1tYPjVZeXBaPDxBPD0+ODU4OT89RFJTUlheVlhmbW1taYGOinFzeIp7e4B8f3yIe318i4eCfnWDhnpzenRtgX6FfneGm6GbnpSTgIyIf5iHgJySboiphXuhjH2RjoOJhZ1/m5GKjaOin5Gkr6CLkYuFi4GThldyrYufq5yQg5mckJCOW4KikYKNn5OVjIeIjJKSjJSVlZCMj4qIlpydj5aXkoyTlIaAjImSjouKnZeYo6OGk52VoIqKiI6ckIOJj4CDh4WkhIuQspickpSXoaCemZKbnaeyuKylvcLHzcfGz8vPzM7W0NHUrdbV2NrY2trX1tnZnGt4cGNjWVlVUVVXQ0BJRD8/Pzo0ODo7Nzo8OzQ8PD89Pjc7OjoxOkc9OjI3PUA1MDY3NzI1NT82NTs1NTg1ODo1NzczNUhSN0dPSzk5ND1FSkI+MUZDTEI5ODpHWEA1SFdJNjYyMjM6RUNlWD8mX3lpX3o+Pjk8Ozg4OzxAO0JRS0tTWVBUY2J5bWJ+kYNvbniLeXp/e4F9h3x8d4aFgHNwhYJ7dXd2dISChX1/kqain6ail4qdkJSXi4qol3KKs42EqJKEmZSFmo2jlqCYk4mbnqKTqbCfkZWRjo6IloxvjbeEmsTIsp2ipp2cmJaRspBkpM3HlY6Gh4mQko2Nk5WKhYqKhpaanI+RlZOHlZiEgJCMmYmOkKuXl6SjiJmelZqJj4eXl4qFj42Bf4ePpIiNk6ial5OWmKGYnpmTnJuisrSlo73BvsfFxcjIycLK0s3N1KjS0dbW1tja1NPazn9uemRfW1pbTEhUWkJCSEQ7Qj44Mzc8PDo5PjY0Ojo8OjcyPzo5MjlJOj42N0JDMzI6OTYyNjQ+PTQ7PjY5NDk7NTc5NDRLUTxKUUs5QTdCR0lANjRKRUxGPjs4OEVUQTc+XDg2MjE0OjtFYFhBRmF0aExjWj41Ozo6NTs6PTpFTUZIU1dTUkJjgkd2gY59fG1+iHl7fnuCgoN/d3eAg3xtbot/e314eHyEh4p+i6Kzp6Oqs6KXp6ClpJaVrqKDkbiVkrOajaKhjKWcsKOknZmRp5apmqyvpJiVlpWQi5ial6HAjqPJuKuco6aumJKbnbKdhYaoopyYhYmJjpWMi5OPiIGGh4mTmJWMjJSTh5SYhoSSkJx1kpmzlpeloYecmZKPipGKl5uJi5eOhn6MmJ6JkJCbmpqTmJefk6CdlJ6boLGuoqS4vrTFx8S9w8PAxs3KydKmzs3U0tDW2NPQ2LludXFZXVJdVU5HSU5FQUNFNT47Nzc6Pzw8Nz00MzY2OTc3ND41OzU8Szw+OzxCQTc1PDs0Mjc3P0A2P0A3ODQ5ODc7PDU1T01EUFJMOEA9RUFHQTU6SkVORUQ6NkFAQlM+OURPMzIzNTc1PXZcPFJcdGlaTV1TPD04ODQ2Nz06SkZER05aXFlKZmA7SYSLenpuhYZ6fYR4gYaBfnB4fX59b3ONen6CfHiGi4mGhJKmu6yosb2vpa2zs6mkorCsipq1naO5ppWtpZaqrbinpKOgmqmYqqSusKqamZyUlpGXoJiau7uuyqFqt7irsJWZnqOsk5e+o16qsoOKio2Uh5F8jo59g4aOkJSViIiTloyQlY2LjZeZk52ZtJeVq52KnJSRjZCSjJmbi5OekIuKlp+hjJSNl5mdkpuYnpShoJScnaWuqKGktLiswsjFtbq9vMXHyMLRoMbKzc3F19bRy9SebHZkWVdQW1BORUM/PUNCQjhAODg1P0c9PDY8MzUzNDU0NTRCNDk6Qkw6QjtBSEM7OkA8NzQ2PEI5P0BCODc0Ojo2Pjw0N1RLQ1VRSjc8OklBREA0QUpITkJBPzZEQTxKTkQvVD0yNTQ6RUpcWEpaUW1ncHBEaWBLSTY3NTc6PkpAQ0lQZEhiYGJwSUCLin6Bc4aHfYKIdYOKgn9ufX19f3B3h3eOgod8jY+MhoyZqsLAr73Gu7O0wL21rauztoyosq6tvaubu6Worbm5q6emoqKko6qvsrGqnpykmZuYmJ+jpqWSo7qvqb+8ra6yuaWlqH6Ih5ytvbCDjIyLkIOOg5GPeoGIkI2OnIiIj5eNi5WXlJGalp2omrGakaycjpqPko6UkJCWl4+SoJKJlZujrJSWj5ScnZKgnZuYn6CTmp6mpaSio7CypsHGw7Cwu7fFw8O/zabHxMfEvdbRzcXKhW9vXllXXFlMSkJLQUZIP0FAQzs6NT5BPj41PDc9MzMzMjQxQTE3QEJNPkdAQ05DQT1DPTs4NkNDNUJJQjo4Nzg6NUI+NzlWS0RXT0Y4PTRLQEM+NEVLSE4+QkE2QkI/QlNFNThQMTQ1Ozw4O0Q+OUxqal07V1JkS2daVU43OUdEP0NGXGVGYGlnWl1dk4yMiXuHjIeDjHWHkYqBb357gn9xfoF6lXqSlJSYkJOWp7PGyb/BzMLDuce9u6+ruruYs7e6ssCupsCkq7C7vaquq6OjnqerrrWwqZugqpyhnJafsLWnjKO7urbBvKypnbSlpamUhY6qxMOkgouPh4iEhpWUjXqDjZGPkaGMjJSSjomXn5iTmZWXpqCvnIyrnI2Wj5GRlZWOkZWSkKGUh5efobOelJmTn6CXpJ6an5uflJiepaOmpqSvraXAxMOuqLe2ycO9ts+yxL/EvLPRysjCtHB1aVlVWWdQS0hDTUtMSkFCPkRFPDVBRTw7Mz05QjMzMjI2M0EwNUlFTj5JQEhSQEg+Q0A7Pj1GQTVBVUA7OTk4PDdFPjg+VkpDV09HOD80TEBCOzVKS0NMP0I/PEJGPUFITDkrRzwzNjc0NjRBPzdPYU9hRS89PjZrbGpgQDpIPj9FQmVaTWVcZVRiapmNloqLiJOQhol5h5SQgXKAe41/eIeCgpB5jaGWqJmambq9x8jJwdLJysLNvcKzrby+p7rAvbvEt6zBqayzvL+qsKqkpaSsrrOttrWgoK+fpaKZo7S9qZypvcKjtrevrJSyrKytl4eaqqalkYKMk6WWioF1ipJ5hY6SkJ2fk4+Ui4+NlKOZl5yUlKOeqp6RpZqMj4+PlZaIfI+Wk5Ojm5Wgopy1pZCelqSjoaWdnaWYnZWXm6Sjqaeisqyou8DEr6Wzt8y/ua/Es7u+wrmtwsPCwJdodV5WVFhYSUpMSUZERElEQ0JETDo0REk6OzQ9OEUuMTIyNDJCMjZTSE88SkJKUUVLQ0RFOkVMQjw3RVY9Oz04OT88ST86RVVJQVdRRzdBOks6Qjc5Sk1CSUBDPjxERzxCQ089MjBIMzY2MTcwPUI6PWpqSks1UVMzU3BwZE47RD1ARj5pSF9YYVpjY1aej52Ol46ekomKf4qgk4R4hX+Vf3+QiIqRgJahma2npJjCvcfDx8XTzs7Ny7zCuLC6vLS9y7vDwra2vK2zv7m9rq+ooKmotq6tqbK3mp6toqehnqu3uKqlr7/Fsb26s6irt7Svr5eWpayooJGOk7LFp5aOfJKVfIeSmY+pmJeTk4+SlZOlnZOdmZOho6KcmJ+Yi4yPjp2IWpCXl5KXpJllmKKfsqWVoZWqq6mmmp6ml5iWmJSgo6ilnrarqbm7w7SltLbLwLiqtquyu7iuqLi6vbd/Z2pXVFJTTUVKUk1LP0JIRUVJSEc5NkZNOz43PkFKLjMyMDI1QzU1T1ZOPExGS1JMT0hHST5JUT86OElTOzs/Nzk+RExCQEhTS0BXUEY6QT9HNkE3O0hNQ0U7Qz40RkU6QkFCRzkvOkEzNjAzPkdEOTQ9dGRNRztFKzpmfGdWOz5AQkZCcEVqSVJlYUxGpZScl6KXqZaMkYOIppOIgoeCnISDlZCQlI+aop6vvq+hxrzExMbGzs7O0sq/u7ayu7u7vs+1xL65ubezsbWzuLOrp5yrrLmqqKevr5ikr6SnpKW1wLCsrLS/w7nAurSoure5tLCWpa2vrqSLk5WhjXTCmn2XmoSOl5mMsJWampWSkpmZpaOVoJqWmqmdm6CgmYqNj5WcYEqWnJuVmqWWVJavn6+cnqOUrq2qpJmgpZOTmJiNm5+nopm0qKqzu7u7q7CyyL+4pqyrrbKyo6GysrSkbWpiWVdNT0pET1BQUjtIS0lISkNEPjpLVT9BOj1FTTA3NTQ0OkI0NE1XTztKS09VTlFKUEhISk9CPD5NUjs+PTg6PENSPkRIUklCV05JQEJBRjM+NThKS0NBPUM7NUVBOkE/PkhANStDNTIsPmNdZzozNXRkZUBSNyYjM31oVzs6QkNAPVFFV1NzYldGSKqXmaCiqK+ZkZeHi6iWjoiThaCHhJ2Xj52gm6OktMm1qcW5wsTIysnIzM3Hv7uzrrm5wcHMtci6wrm1urCvr7O1pqObqrS1qqmmrayapa6lpKisur+orLa3v8LAvrmzs8Wzur6tpK+1rLmmiJuYppt2v5+EmZ6Ok5qajK6XoZybl5San6ConqifmZqqmqGnnpiQjZGdg252kqKalZ2inZGusqOrlKepl6qso6KepKeSkZmch5Scop2Wsaapq7m2vbKyrr65tqCjp6ilppybrampi19iXl1PSktGR01KVk09TkZPS01CREQ8UVY9QUFCRE8xOD03Nj9CNzVVWE8/SE5RWVNQUVVLUUpKRUFFTVE/Pz04PTtHUjxFRFFCR1lNS0FIREU6OjM5S0lCPkNCOTlDPjxAPjs7RzctMj4tMYJoTnpcLzBraGA8PUJCODZ6Zlc7Oj0uLVJgTVVIfmVeSEWrlZuhn7uvmZSgjJOrnJGSk4mrjYahnoyjrJSjpLbGvrTAucLCx8nFws3Iwr65sq+6tcHCybXGssK8tbqqqK2tsKKjmKq0u6appquqnamvp6Oqq727qKy9tbi+x7y3trnCs7/Btaq2t6y+pY+jmJKioL2fiZqhmZefno+3n6mcpaKbnKGaqKSzoJudppyoqp6YlZCUm4uWiYykoZSdop2gtK+lpZKvqpmqqZycoqKokJSUn4KPnp6blamkoaGztLq0rai2srKenaOlm5eUmKqhnnVcWV1cSEdFRkxQSU5FR0hDU0xKQkVHQVdTQ0g9QUdRMTtCNzpCRjc5XFlLQUxQVFVTTVdSTlVKRUBKSk5POURANT08TlFDPz9QP0VaTUpBS0RHQDUzPUlHPz1FQTk3QTs8QDw8M0A8Lyg7KkiRQjpTSjAsW29XNzE8Kh1CgGRUNDktMTlmXEZDQ51wYkdFp5ejn57DrZyXpZiaqpyXm5qPqpaVp6aVrayZoqu2xMO8vrbBwsDHw7/Mxbu9ubKwubO/wse1v7C8t7m2paSrq62goZmqqsSipKmrpZ6sr6uiqam+t6etv7K5t8e2tbm5wLPAw7i2s7SwvaOXo5eUnJSun5Cio6Wjo6CQvaWpnamrnJyhm6WevaKZo5+iqayhnZeOlp6TnoePhI2Tn6SgnrWsppyVsKaZrqWcmaicn4yYlJ6DjqCZm5KlpJqYq7G1saqlqq2snJigoJKOkJWonpRlX1dfXE1IR0lOTEhGRElCPlFJQTxHSUlcUk9LPUlPVTVCRjk+R0c1Q2FaS0JOUlVXVlFYVFJVSUA4UlFQTTpHQTRDSFFTSUM7Qz5HVktDQE8+SzwwNjtHRj47RkE1NT85Oj85OzE1RDAtLC9Ndlw0S1o1LE1uVzwtPSkeI3piUTVDS1E5bVFGPEt4ZWFWS6Kao5yexayhn6yfnq6gk6OflqWgpqmsmLaxo6qztsXEvb+1wMK7yMG+yce2uLW0sbO0t8HFtr6xuLW4tJ+mrKqsnZ6epaTBpZ+prZ+kqq2voqaovLWmsb25t7bEsrS4u8C0xcK5ua+ztbWjnaWVkpShrp+Zop6pqKyjmsKsqZ6srpubnpmloL2hnaSYq6uspqGajZqfkp6Jjld/lp+loaC4qqaTmLSinrCfnZmtlZ2OmJOcgY6fl5WNoaOWkKWtsaupoaKlpJWVnZiKjpGSpJ6IXmFYYl9LSEpKTkZFQUdLPz5LQjo5SktOXVFRST1MV1w5Rkk9RE1IOEhiW0tDTFBTWVlWV09aXklBPVdRSkw/SD81SExYU0hBOkBBRFBIPz5RPks3MDk5RkU7OEc/LjY+Nzg+NzcvMT85MSUxUVVtW0pPMTA9Z1dEMTc9LSt3YFM2U1trV3FHRTY9dWVcS02enqGZn8SopqG0op2zqJSrpaCkn62prJ27sKistrHHxcHCssPDvcbDvMTJvK+wtq2wtK++w7S5srC6tKyZqLGpqpqdpaGnwa2brLCbqqOusamkqLy2p7e7vrC3xK2zs8PAtMi0vListLatqqKmlpWVo6yhn6Cbp6uwr6+7saagqaiamZiToqO4oKGjkrCwrKWmn5OinpWej5CNlZ6bop6ntKemjJeym6KtmZyaq4+dkpWSmX+RoJWOjZ+glIulq6+lpqGcoJ2RkZqThYqRjZudfl9kWWZlSUhMSVNBQ0BJSDs7Rz85OU9OVl5SU0o/UF5dPUhQQkxMSTlOY1xMRUxSVFlbU1VPXGJIQT9aUUFIQUtCN0ZFTEtNPztCSEROQj07TkBBMy85N0NCOTdGOys2PDQ2PDI1LS80QDErJlZ0U2VPPzEwNGJbTTIzPjA8dl1eP1tUXWVwQDg7SJZ3ZUE0nqOfm6DDqaSqs6KktaqWs62noqSyrK6pu7KtsbW0xsDEwrTAxL3JxLW/x8G0q7Wor7isv8OzuK+ttrmlmKqyq6uYn6aXrbu0m6iwmq2grbSyp6u5sqi6tLmzucCqt7LEvrbHqMCvrre1qaesoZiXkqaloqKYmaWvuK6ytbagn6mkmpSWlKSgt6KlpZawsrKnq6ain5qam5WXqJ+gmKGer7Kipo2WrZikqpaXnKKPmoySlpiFlZ6Ti5CbnZOKqKiqoqagmZ2Vi46Zj4GFlIiTnndhZ1tqaUxPTU5UPUNBTkM7OklANzdST11eUlZRQVdgXEJKU0hWS0g6VGRcTkZPTltXW1JQUVhdR0FCW1BCRz5OQzlIR0hPUD8/Q0lCTEI8MklBOTQxNzdCPjs3RTcrNjkxNDgwMS0vLjw2LSNCcWdzazIzLzFbYloyMzgwNnBbYkgwNElvZ1VDV0aMeWZDO6OjnaGmwKeor7GiqrWrnrqxrKSrtLaxsLm3sLe4uMW9w8e9vcTCxb+4wMXAuam2pKy7rcDBt7eqrbG6oZOtsa2ylqSnkaq5qp+msZyroK+0s6uptbatvK20s7m3rLixw7vAwKfEq7G3r6mrq6eemJmroaKhkZihsa+zrLC5mpupn5qXk5inoLappqOisbG0rLOoraCcoKCbnqWcopedo7Ovm5+Qk6SZn6eZk6Gdk5eIk5aSlZackoiQmpiUjqiopp+im5ibkoWNmYp9i5WEjZloZmtgbG1XUFFbVUFCRVRAPDtJQTg6WFBkXlBXV0VZX15OTVJOXktKPlljXk9IUE9cVVlQS1RXWkk/RFhQREY/TkA9SUdHUVBCPURFQk0/OjFEPzc3NTQ3Pz05NUU0Kzc1LzI1MS0tLiwxPSonKz1ccD0+MS4wZFpjPzE2NDdnWWBGKD84bH1nW1Y7iXtjQz6nn52iqr2iqrCspLK5qqa2tayhrbW9r7O4u7u+t7bAwr/JxLnEw7+/t8O8wLautaart7G7vb60qa6xtp6Wq66nrpemqI6nu5+krLOerKKxsLOsqbW0tb2usbK1rLC0s8G7xresvbCxuKytqqOypp6lqqCkl5Can7Oqs6urs5qdp5yblo6hpqS0rqihra6usai0rbOqpJyfqKSelaKZm6i1qZeZkZGdmZ2fnY+pnJWXhJSWip2Ym5OKjZaWmpampaOgnJaVlpJ/j5SFeo6SgouUZGpxZm9xXkZZZ1ZEQ01XRFs5SEM2Pl1RaFxOWl1HW15eT05SWGRKSkJcYl9RTE1PWFdYUEpWVldMPUVVSkVEQU1AQUZISFFQQTtHREZLPTg3Qj02ODcxOT48NjVEMCs4MC8wNS8qLC8tKj0sLCUyKyo1SzEvJ19eX1QxNTA9YFZeOCpDM1lVXGdLNox6ZkxApJqhpa23pKyqpq+ut6qvtryop7G3xrextr3Bw7W1usS+zMa5w8C5vrnDt8C4sbOrqbq2urm+tKmtsLWXmKesqaybq6uOq76dq62xo6ugsa2zrq21sri4qq6vsai1r7W7vMqzqre2sbSvrqahtKCbqa2gppaWm5qyo66hpq+XoaSampOOo6aos6qip7Otq7alr7K2r6OZnaynmpefm5mrt6KXk5COmJygl5aSqZ2akn+Rl4ycm5iWkIqUkp6ZpKGioJiWkpKVeouPhXqMioKKkWptd2x0e2FGYWtZSUdaWj17SkZENkFiVGlbTVxiS1xdW1JTUmJgTEtFX2BfUUxJUFdWVU9HV1ZVTjpJVklIP0NLP0VESEhRTkE/SEhIRTw3PT46NzU2MDk/ODY2QiwtOCwvMDQsKCwvLSo3NigoOS4kOks1LiJVX1RfLzUoQ19RXC4qQS9KR1BbRzNjWVVLRJmXobKpsqqtpqSvrraquLa6pay0t8q7tLu6v7+1s7fDwMzIvMO8tr2/v7e+u7C7raa5uba1wraqrbC3lJanrqupo7CplK+6pKyxs6eoo7K0sbKwtLG3s6mvrLKnt6+3tMTGt6m2t6yxramno7agoKiyoaWVnJqVsp6onKCqjqmjnpuWmKampbioo7K1rKiyqK6ytqukmaCrqJucnpyUqbiclI6OipeboZePlqSfm5SCkJSPnJqXlpWIlo+XmqecpJ+Rl5GQlXaDj4d7hIGDi4psb3Z0e35cTGZtW0tOY1w+YntHSThHZ1dmXExeY01ZWVdVWFRpXU9PSGBcXlBKSFFWVVJLSFdVVk04TVpORUBGSz9IQkNLU00/P0xPSEA7Oj47NjswNDE8PTQ1OD8pMDcpMS4yKSksLC0rLTkkMDQyJTlCNy4jQU5HZTI3J0diTFYlLEEuPUVMUTwzcmtJQ0ORmaWvpa6vq6ilsbO0q7iyuKGstbnJua7Bu8O4s7G1wsLOxcDBvbS9v766vryyw6eouLC1tb+8rquysZugp7GtpqavpZ2yta2qsbGsqai1u620srSts62qrKisqbitsrDIwbmlurGpra2lqK6xpqWkr6SpnJ6dm7Cao6Ojo5Gtn6SgoKKrpqe6pay2tqarrKmtsbauo56jqKqboJubkqOzmY+JjYaQoZ+UjJObnpGRg4ySkpyZl5WUh5eSlZmnm6CejJORjpB3fY2FfHt8hoiIcHJxfXx8XFNkb11OWGVcRkSWW0c7Tm1YYlxNYGJOVldWV1RYZ11RUkxjWVpUS0dPVFNOR0lWU1xOO1BeSUJESEpBRT8/S1NPPjpOTUM8PD45OjU9KzMyPTYyNDk6KDQ1KS8rMSgpKywtKiY1Ki8mMCkzODoxJiozQmM6NipIZUhKKjpHPjNCSFMsPpBrO0dIj5yqrKOqsaSppbS1srW2srKirK69zLquwLrHsbSttMLD0cXGvsCyvsDCu763u8Smq7arsra8wK+rsayfo6etqamlsKOqsqqvrLCvsK6stL2ntrCyqbKpq6Wlo626raqyw7q2rbupqaisqaexpaqlo6+qqKKfnKOtlaWemJ6ZrJ2ip6miraakrqy4s7KiqqOgq6+xrJ6fpqepmaSZmY+fppiHhI6Ji52gjoqLlJqNjYSFj5SenJSXlYaWlJOXpJydm4uSkI6Jfn6HhXx2foWDhHJxcId0bF9aYG1hUXJwXEs8hXxGP1h0WGFaTmRcTlZWVVdRXGFeU09OZ1hWVktHTE5SSEVJVlJdYzxQXUQ8RkhIQkc/PUpQTDo+T0o9OT89Mjo3OyoyNT4xMDQ4NSg1LyosLjMwOyksLCclMjM0JCwyLTg2MCkoMTtcSjAuSmdFRjY7Qi80RUtYMkCVWT1MRZaYramiq7Ocqqqxt625t6+spqurvcm8sL22wq+xq7PDw87Pw7+/tMDBw7m/s8fDqq62rbK4v76xrK2rpKeqsKioqbGltK6qsa6usrG0rrW9pLezrKyuqKugo56wt6uqrbq3pbe2pKqnrKuqraGpp6eysqSnpqGhrJeqoZWboKaepaKqpK2joKexuK6upKajm6qsraqdoqSjpJigm5aPl5yTgoOPiIWboIuJjYqXjY6JgouXopqQkJuMk5KRk6Oam5qJj4uLfIaAgYN6c3+Cf3xydYukh3hrX2BsZVdkhmNOP2eTTEVieVdjWVJlVU5WVVZUT1xdYVVLTWhWVVZJSkhJT0JHSVNRWW9BTlhAOkpHRkVHPj5FUUg4Q0tFODdDNzI6OjoqMzk/Li80NjMpNCsqLCsuIzQuLSsmKCs3OSomNis8LTIsJjA2VlkuMEpnQUE7O0IrOkpPXjREhz1HRkSXk7Cmo6uxmKuqrrast7OspqyqqbzAwLe4sry1prKww8nL0cDAu7m/vsG5wbnAw6yxtLGzusC+srCurKurqLaqp66vqrmwqLKyr7Ott6u5uKa0t6uspKmqnaSes7OpqKS0tKC3rqCqqKqoq6egq6ypubaqqqqqoqqgrZySqqGdoKWipqOqn52ota+ppqujpJmlqKeqnKKjo5+ZmaCQjY+YjX6HjIeDnZ2Gg4iJjYyOi4KFlaGZjY2akJKRj5Ofl5mWjIuDf3WHgX9/eHSCfnh2fYCHnY9vcWdmb3dcX3KIak9emVZIbnlVZVdRY1BNVlRVUE9YWmJVSE9pVFVTR09YVUk+SUhPUVB4TE5XPTxLRD9AQTxAQ1VDOUFLPTU7RTEzOzo3KjQ6PSstMzQxKjgqKisqLCkpKC8qJiklMzssJDIpMjAyMSUvMVBhMDI/Zj1OWD9DLD5MVF8wSmk1T0Q8l4+xoqasr5qspq2wtLWwrKawqqm6vru/sK25rqK2r8nHyNHAvr27u8G9usO/vr+tsbGxtby7wbGws6qzqaS0qaWus7O5saOuuLKxs7uru7Cqrrarqp6qq5+joLauqaGfsLKhtqqeqKeqo6qhoq2tqL6wrK6toqiooKyZkLChmKKgp6ifqJuaq7Gqo6CuoqGUoqSjp5iaqKWYl5iej4qHlIh9jYaEhKOWhIGBioWNi5CDg5OfloeRnZCTkI2RnJSXj4qGhnh1gn98dXh5f3lycXdmfoakdmlfY2mAdGaIjHxSWHBfS3hzU2RUUV9NTVNaZk5MVllkWEdSaFJRP0JOUWFROklITFNJcVFMUzs8ST87PD07QEBXPDw/SDczQ0IxNTo5My01OjopLTMxLS01KSgrLSw0MiMyKScsJS47LiYxLjAtMTQlLDBLZzo0OF89YWQ/RjFDUFtbKkhMOVVANJKQs6Glp62kp6Stp7WzsqulsKeqt73Au6+nuaqmrrDJx8jRw7y/vri9vrzIusC3r6+zsbq6t8CysrqsuKyitKeorbO3urOoqL62r7e+sL+nray1q62cqa+jn6StrKicnqqypLSom6unqaOonaOpqKm+rLSwrp2qpKCunJuzopWkm6SmoKWbm6qspqCcq6Kck5yipp2Yl6ipkpialJCKgo+Ffo+DgIidj4V+fYuGkI2Pg3+TmpKFk6KMlJGLkZuSlYeJf4Bye3p+fGl4fHlzbm56ZoN3hYpkYWZfcYN5bGZ4XV5UP1d7bVRiUFFZTExOcnVdSFpbZ1lFVWVPQz5KTkRDQTlIR0tTP2phSVE4PUg8PDw+Ojw/VDY6P0M0NUg+Mjs1OTAyNzw1KC41Ly0xMScvPktIMCUaOTAlLCwwOS8sLCs2JzE3Iy0wR2lJMjRYPWZiQUo3R1NgVSo9OUNWPSqQlbKaoKGqpqWiq6W4s7SmqrGmrLfBvbWvormsp6ewwsrJzMG2vcC0t7+6yLTCtLKxtLG9t7m9ta24tb6sobOnq6yxtri1rJ+/vaqzwbS8oa+ztaqsn62wo5ylqaqknpyksKWwoJ+rqaehqZylqaGtvKiusa6hq6Okrp6fraaXn5uhpJ2gnZukq6Obm6WllpeVoKOXm5alrIyekZGRi4KKgICOgXuZlIyIe36LhY6Ni4mEkpeQhpSjipOSh5GakZOAiX15bH52eXhjfHpwbm5wdWZ/cmqEaGRmXWtyjGxgaHBgbz1beWxVXk5QUktKTVRaV01cXmxXRFdfT15PSE1ERjs3SEVLTzxyaEtLOUFFOzs9Pjs7PUo0OUI8MztHPDQ/MTgtNjg7MigwOS8sNC8uPS0qSz4pHTQ5JicuMzQuMCsvNCYsOiQ0MUFnWTE0Uz1lX0RMNktWZE8qOzFOVz0jlJqtmqCYqKSkoKikuLCvpK+vqau4wbmyrZ+5r6uotLrIy8i+tsK+r7S9t8S2wrGtuLGywLS7vbeoube9qqO0qKmrsq+6saucvb6msMG2t6KvtrWnpqews5+epaaooqaZn6yoqZ6hqq6moKaYpKmgsbmfpLGvoayhrKScp6eomZqbn6WWnZ2bn6unl52hqpOalJmflJmWoamRmomOkIZ8h36CjX18oIyNiHiCi4SJi4uFh5OajomVn4mRlYKLl46RfYV8c3B+cnR0YHp4aG1ubm1nfXFje21pZGBbZIR+XllzanJJSX9pWFpNUExLSFBSUUlPXF9uU0RYWlJnTkdLRUY1NkhCTEk1WmVKQDZFQjk6Pj0+OjpDNTk+OjNARjwyQDIzLjo7ODMmMjwwLDg1QiopLUIqLDQ7Tk5AOzczLS4rLTcqKjwlNTM8ZWMyNE0/ZV1GTz1RWmdIKj0vV1Q1KJefp5qdl66hoaGlobersqa0tKmoucO0sq2guK2urbC1xsjAtr7BubC0vLe+u72vqr2wtL+xvcO5qbu6t6entamorLKutLGonL+4pq69uLOgsbewqKWnr7GboaSgpaWgl5yvpqGeo6ivoZ+hlKWloriwoaaxq5+so6+YnKqlqJ6Xmp6llJudm56orJqdn6aXl5iWno6Tl6KoopCJi4+GeoR+hIt6j5eJjYZ4gYaDh4uNhY2TmI2OlpmKj5d+hpeNj3mBenByd3BwdF95d2Rra2pnZoJsZXJqa2RnV2Byf15Za3VpWEV+XlpYT09LSEhSVUcyOV5ebVBEV1VZZUxISkVFMDdGP0tCNklKSDs2Rjk0OT49PDk4QDg7ODo3QEk+ODw0LTM8PDc1KDU+MSw7QTEoKzY8IzhSPSoxMTM+RDUsLSc0Mis7KzEzOWNsODRIQmZbSFRDVF1oRS46MV1RLDKXpKOYlp2rnqaho6G4qrChu7ilrL3Dsq+uorWwrK2vtcXEvbO+urews7m4uri6rq2/s7W4r7/BuKu9urSlorOrqau0ra6zpJ7DtqequLesoLO8qqelqK+rmaKnnKSmlJihsqWZnqSpqZyhn5SmoKS5qKSnraaepaGok6CpoaGgmZueoZOcnZeho6ycnJujlpOWlpyOlJOjp6SQiYqOhnmEfIWGfZ2NiYqGeICEh4eIkYWUk5KMkJWUjY6Ue4OXkIt3f3xtdXNtbXRieHRoZmlmY22DZmdoZGZnaF1kYWhlWmV6YmBQc1RbW1NLSkhJT1NAICppXmpMQ1ZVXmBLSEdFQy46QjxGPDZLUEQ4OkQzNTc9PTg5NT86OzQ+OEBMPT45Myk4Pjw6OSo2QDMuRTQoKyw+MC1PPy4rLTctMTE5NSwmLjUtODA1NzZgc0IzQ0RoW0tXR1VgaEIzNzdgTCcyn6Slk4+mp5yfnp6ktq2oqrq3p6zDwLavrKK2rqevr7fAwLyxwbexrrK2tbm4tayqvLOvsrG9v7euvLywpZ+2rKantaqrr6GhxayqqLK1rK20up2nqauxpZedqp+npZKZpa2imJ2kqqGboZyYoZ6nt6Wwq62hoZ6doZWhpp+ioJmcmpyUm56Vpp+uo5mYn5aVj5WZjI+YmqegkIeKioh4hXeCgoKdh4qCiHt/hYiFhZCElpWPj5CRkJGNknuDlY+Fc39+Z3lwbGtsZ3Vza2FmY2FzfmFkZWZkaGhiZW5ZXVhcbGNhTGdXWmBWSUdJS01SWD45YGxpSEJVU1xaSUdGRUEuPD85QTg5UkZANzpCMDM3PTc2OTI6PDk3OjlETT1CPDAqPEA7QTwtNUIzNz0rKywvQSpKSy4vKiszNzIyKDU3JCs3LjcyNjg1XHlOMj5IaVpMWkpWYmZBOjNAYUUlNZ2loZKMr6GamaCXpbSyo7K+t6Gxxbu5sLGjt6urrqm5vby7rcCyrq+utq+zubKnq7mwr660tru2r7m+raaetaugobKmq7CgpsWhs6awsrG3rbSdq66srqKZnairpp+Vm6emoJmlo6mdmp+blZ2drbGluqiuoqGam56Zn6SapZ2Xn5iclpqhlKqXraqclZ6dlI2Vmo6VlJinp42MiomOe4F0goKLmIWGfIiIhIWKjIiShZSck5KQkJGXj5B/gY2Og2+Cf2d5bmlsamdxcmtaaGNhcX9gZGdqbWpkaGVjbFxsbHVxYlNiaWNlWklHTE1PWVFQVWFlgVRAVlJaVEZHRkVALzw9Nz82PEVNYTg6PzI0OUAzNzgxOD83PTg+RkpARDkyLT1BPUE9MDVAOUAxLSsuMzw7SzYvLissLTI0OjUjMyopNi41NTQ2NVp8XTE6TGpbTVtLWGRjQEExR2BBJzSUo52Pj7KdnJWhm6mzsJ+4wLagtMG7vbmxprawqa6luLm3t627sK2rq7eqtbmtpLO1sa+psba2sbO2u6epoLaqnp+ro6qunazEma+nsLK4tayrnrCtr6qim52kramblZ2npJ2aqqOllpqgnJKco6yrqbuepqSgl5qanaGPa6OWmZ1xg5idpYB2kqypnpeYopOKmJmAl4qfjniFko2CbGl+d4RxbIaKhn2Ei4ZvXWRhZ4SYhmyLkJSSdXiLhH+DkH9miIFodmpmWFxpdG5NT2liZXCDZV1kZm5qZ1xbXImQhIhoT0tEOEZUZ15KSFFQVVZLSFJhcHRlRltRVVBFR0ZDPjE7PTY9Njw0Zlw1Ojw3NTtENDg2MDpCNz86PkZMQ0IzNDM9QEBAPTI4QEU9MSwsMDg+RzcwMS4qLiovNjY4LCMxJzIxNDoyODZYgWwxNU9rXE5bS1tmYj5HMU5fOysuj6SbiJaym52UoZyqrqyjvcWvqbfCuL68rae3saarpLi0srOxua6pp6y0prG1oqe4trWop622s660rrSiqp+0q56jpp2nqZywv5WoqLG1ua2tpKisqquloZ+coaiom5iipqacnKeonZOen5mQn6irpLWwo6KjnJaYmZejiKGPkpqHoYiVn6KApYCorZ+VlJ6UiYRyeI2Og4igdYeMaZaIZn5zeKBvh4eEfox8f6GgoJmAfIefdIiOdpuKa4eCg25pZWR7bXJiVIZtZG1pmHFYaW9thlZdaFpraVmHcGt5codoh4RZXkZOPkZeTUZTVlZRUFJXVGdeTVpMUlJQRUZHPjw0OT05PDc7MDw8Nzk5OjY9RjU4NjA8Qjs8OT1GUUc9LjU8O0A9QD41OUdBODIqLzE8STovMDEuKi8oLTQ1ODMlJjIxMTU+MTw4WIN0MTVSa1tPW0xbZ189SzFUXTcvKI6nmISerZ2amZ2fq6qoqr7DrrK5vLfBv6qkt7GqrKazta+vs7erqaWyraW2tJustba1paaps7KtsqivnqqhsqmgpKWcoqWesbiVpqiot76mraapqaynpaGfmaGopJqZp6OkmJylqpeUopyUk6Smp6G3paOfo5iVk5iUnYiukJiViqqMmaSdhrGBpa+glZuhl3qC1KiAh5TAm8Z4d7Glt5dkgMCcv3mEhHmPg3yQkJHKcZa8nMV7cranupB7gWyXsauxeWlsWLGub2ZqvJO8bmd5bXGO2H1SamK2snx+cJV1mqGqkFZOV2FPVk1GVlxYUFBTi1xXW1BBXERQTkRGSTw8NTc9Ozo5Oi49Ozg3ODs5PkY2Ojc0PkA+Njk/RVJJOi41PjtCPD9BODpKPjUyKjIyQUUvLjMyLisvKS0vMTg2LSAvNDE2QTE9OleDdzExVGtcT1tNXWdcPkwxWVo0MSGPp5SBqKqfmJ2epa2yqrDCvbK1wLW3v8KrprSuramor7SqsLa0qKimtqaoua+csrK2qqWkp7KvrrGnq56npbKloqKgmJyiobKvlp+kobW6o6qooKytpKGdm5qjqaCYm6mgn5eeqKiRnaeblJ6ip6OhsKOen6OWlpOYkpmFr2tqjI6qf2iFloetZnKgn5abqZdxrqGkf3e6fGugj3axX2q0W6WAZZyQYGaBemZ/aXhrqmW+c2emjHaxanyxeHWSlGNtbaduXISgRWlniJZFdZxffWZ7o6aBWF6Kq2d8jHd7aqg4Sq9bWFRsY1pLT1lgXFZWO06IUFdWMElTU0pDRUY9PzQ2Pzs4OjkwPTg5OTk6PTxEODs6Nj1BQDY8QEhRRzkwNzxBQz5ARDhARz0xMy0zM0UzLy41My8rLyguMC46Ni8nJDIwM0IvPTtVgnYyLVZqXE9ZTF9nWTpONV1XMzEbkqOWg62npZ+jpauyuK20vb6wt8WyuLrDp6mwrLCpqrGvpLG7saWlr7OjqrmpnbOzsaOkoKqtsKyvp6igo6OxnKSemZaZnZ6wqZico6C1s6GrmqGsrJ+dmpego6mdmZ6loJyZoaekkJ2im5ehoKyfpqagmp+hlZSRl5GbhrWbtXmHqZq2mXiHtJu3f5WYmKyXf2uBpnuBhYaRlJJ3q2dqsVuse46HlHSJcI6GgX+IkZd4g4OLl4yDoI+FsHZ3n3Jra218i0+lWEhkZJl+Y2imX3hxdFKShl1PqW1ib3qFgGGdL1OibltUa2dgTEtdZFhcWkI+sHdXWEEjTWlFQkRBQEExOT44ODo4NDs6OTw5OkE6RTo6OzY6Q0I4PT9LTkg6NTpBRkJBQUQ8RkQ7MDIwMTtFLDAuOTQwLC4oLzMsPjgzMR8vMi1EMTw8U31uMytYalxPWE1fZlc3SzlgVDUwHJeglYm0p6ehramos6yqu7fCsLzCrbm2wqutra+vqK+zqqKwvKuiqLato6y1pKWztKijop2oqrKosKimn6CgsJegm5aWl5uhsaWcm6Wptq+hqI6pp6mbnZaYoKapm5+dpKCcoKOlo5abnpianqOrnKaanJqioJaTkZOTnYTVk5m5cbHCf8aHfdaUnLt9nJeoko+djaR7jYahgKWCeat5j51Wr3uJfp9quVq5d4eEfaaDlHyZe6l5jp2Qe7FtjoR1kLyGb5VQr6fFilGgemNgqmFzcoZrlodeUrW0yIV+iXxjpDRDnXVdUWloZFBAWGdZY2FKSE1qSlpTT1lmWkNEP0U/MDw8NTk7NzQ8PDg9OjxDOkY6Oz42OkBDOzZAT0xIPDo8REhDQkNEPEVGODEyMTFEQi4wMDQ4MystKS4zMjM5NzEjJTUqPjM9PVF3ajYqWWlbSltQX2ZUN0g6YVA3MiWco5OZsqippbOqpbWopLy4wbC6wLK3tL20tqeysaSytKegr7apm6m7rqOxsqGytLGhpJ6eqKmwqbSppp2en6yYmZmYmJaYo66gnJeprrGpo56OrKKnlZ2Xm6GnoZiioqOhm6KiqJyeoJ6VmZunoZynlJuan6GYkJKVkJ2Ism5otXKsiHCPp3K0dnS2e5yapo6QnY2jfo+eo32wdYKQ0tJ1XK58hX+kbpuqpmuHhX2tfZiZkHuxc5Odj3mzZZZ0hZ5un2aUUsmLWsJcn3liX61fdnOEYZaIXVnKnW+/fnJNS7VTVcZkVVFqY2VYQU9rX2xoUFVGSDk9V1JbV1hIQj9KPDI/OzU9PDU2Pjs3Pjw9QztHOTtANzs+RDsuQ1JKRz4/PElKRkNFRD5JSToxNzQ2QD4vLjI0MjUyLSkuMjYsNzQyJh82MDs1Oj1QcWg5J1dpXEJNVF9lUDVHPWFNNjIuo56RprCtpam7raa0pae2u7yzu764uLW8vLSmtbWjs7KjoKywpZiou66lsrGctLiqoKWdoaqlsqisqqWanZupn5aWmZmTlKWropiUp6uxpqGVkqyfpZKUoZylp6CVm6anopujoK6aoJ6dkJabo5+cpZSdlZmjnpWZlpKbhax8eKh3o4+Lh6pwrYyFqISam6OLk5uLon6Rl4euhH+Bs1xyslOvfYKCo35x1313hX6PnoeZmnevhoqRnIh3tGGaZZuBgZVskluwV0uadZh5ZmGtXnZ2hWaXiGpdr3aVno93azV5yK6zYERVb11nYEVQbF9wbVZVTS5lY2hSWVE7QUNATDo1PzkxPjwxNj85OEA9OkM6Rzs8Pzo+PkU5LUVVSkVAQzpNS0pCSEc+R0s5Nzw0Njo+LzA0MzMzLjIuLjE4Ki4zMiUhMDQ3Njc9UGtlPiZWZ1xAPFVfY042R0JgSTo3N6CdlKG3sZmzwa2osqeqs7q3tbm+urizt762pri1obauoKCprJ+VqbarqbKyq620pJupoKCoorWnpqqkmZ6VpaGUlJ2akpalqJyUkaitsKWglJmonqKPkaKaqaWhlZqmqZ6dpJ+tnKCdn42UnpyfoZmYm5WWoqCUmJGnnYepfn+meaGPkISqcK2Ng6eGl6Gji5iXiKOBkIaUqnp/i515cLFaqIOCiKB4dNh/dod0qIKPm42SpHyWkJ+Ee7JenGSgfYKVbpNdq1xbk3+Rf2hnqmNyeoBqmIZxXataiaCPa21kT0pDoVxbTXRdYmZNWmFfcnRgSlU1SpqRWEhFPUdFQUwzNUE4Ljs+MDVBNzhAPDY9PEY/Ojw2Pz1CNy5IVkpFQEg2S0lOQElLQEVOOjpANC47PjEwMjE1NCsqMDUvNywmMjEoJCU2NjcxPE9lZEEmVWZbPzBUX2JMN0ZIX0MxPTeinZqav62Ys8Kuq6yop7WxuLG1vrq7s7K5vKq7tqGypZ+mqKifk6yxqbCrt62qr6GYoqCmpaS5o6OsoZeckqOglpWfm5WZoqGRjoyqsLCmnZaap6afjJKkmKerqJaYqaifoKGkrqOgnqGOlaGZoKCSnJeblZ6hlpaPrJyPrm5ytHSpjHeLpnS0enW0gpSnpJSdjYmkh451uG+Le4uia2u2WqGGZZeXaKCip22UcrR0k5l/s2qGkoitanW0YZ1mom+GkmuYXa1gTqF8h5FSc6NseX59bpiGb1yvVjycd2VUb24uW6dPY1JrZWJsWmJcYHF8Y1NZUT4/bG8yQkJAPk06ITdANi47QDM3QzU4Pz8zOzxDREJKRk1JRjYySlRLRUJKNklKUD9IT0NGUD08RTUwOzswMTAvNzUsKywzMjYvIzAwLCwdMjg5LzlOYGVEJ1VkWT4uVV5iTDVGTV44MUE4pZqcnrqkm7HArq2rq6i3qrivtcC1vbKxu7iswreqrKGdp6SinZKsq6i2pLSorqqhl52ooKWruJ2jrZyWmZCmo5eOnqGcmZ+gkZSVrLawppiTm6yployUppmlraOSl6uzpKCeqKywmKGikJmhl6CblpuXoJSdqZ2UkKuZh9SUmrt1scSAxId+1pecuHmKkpmOmIqMp4d5orZ1fXd2wYOasmGDunnAfHW4YrWBjIepfZWCrKlxe391vIinoGmdYaaOr6J+jXWHq32+bnO8dLKDdXiAiW2aiHBtjaR0vV13fVthebxqWlZcanpeaWFjZmJueW9YW1lDQUBxP0NHKzRIIic7PzEwPD83OkI5OT1DNDxATlpeYGBfX19aUFBSS0VGSjRITFJASk5FRk9CPEU4ND05MDIwLjg3LSouLzE4MCItMSwzHiw7OjA4TFhhRidUY1g8L1NdYEs1PExbLTY/Oaean6K8o5eww6+tqautsai5r7fEsbuzr7ywrsKyraajn6WinZyRq6Wqs6W1p62koJaaq5mnrLido66YlaGRpqCTjp2jnpmfmpCWk7C5sauVlqOnp5SQlqWdpK2fkaGorKCcn6mksp2ipI6moZWhmZuWlaOZkLCgkpWqnoWQmbaAkpKNuJZ5g5ObtndubG90b3mPhI6Jcp7Au7yae4GyqHCBdJG5g3yGhouGjXuKh4yXfaS7ub2cdXmzo3R1l3V0sHWZnmaHao22dHNxd7aLXoB5fIhng3lsemKLrHB0hX5XW6dpRGRaVGZfY11iUGdmcW51Qk1PTEQ7Wkw+SjI7MCA4PjsuMz1BOTk/PTs8QzZCVFlaWltbWlteYGJgXVNHR0g0RElUQUtOR0VPRj9HPDc/NzA3MC85Oi4sLy0qOC8lJjIoNCQoPjcvN0tUX0cnU2JXOCpPXV09KztWVic9OjymnaGhv6aVssKzrKqorauqu6+wxq+1tLC4p7W5rqukoqefoJ2ZlK2lrquntqion5yWoaSerKS9p6Gql5WckaKbkpCiqKKUn5eSmJSytbasl52jo6KLkpKmm6WrnJappaacm6GqpqaiqKGRrJ6Xop6Xlpedno+wqZScp6KPa39qnap6iXR/nI92e2aIe72+wLpvkoNxlIVfcmpaXpuKYWOHj5ZsYH+VY22cdmKVbICZlZRmXmBjcZuJaHKMfIaUZmp+cXR4f35jXHh1gWhQXG6EfHyKalhseoJxSEpvhXBOcU1EVlxmYUxbV2ZjXk9bbXVrclJPRERNPEhIPEw/MSwyQT84LzU/Qzw5O0A7PUM+UlZWV1laW1tcXWBhYWFgXFVHNUNGVEVKT0hGUElJSDs4PTUxOi4xOzouLy03Nj01JiIvKjIsJTs4LTdJUl5JJ1NfVjQpUF5MKDM+XE8nPzI+qJ+posGkmrO5tqOspq+mqLayrMissLSttqS+srOnoaSqnaOcmpqsp66kpbaqpZuYlqKcp62pvqippZWUm5agmpOZpqmokp+Qj5icsLK+q5qmnaeiiZORqZuopJycrKCjmpujp6yin6mhma6blKaglpSdn52XsaWZoqiZnZKfnaWmm6ikm56bnJuSl4Job35xd5GXlJCEibSqjYWYlY+KjJmXiJSViYOTk5GJjpKUmJSZl5qfoZqblJ+bjYF6pIVranyRfYF1iouDcoJ3eXZ2i398iWpzgXSEdGN2fXZrb3hsX2Jbb2dNWFlmal9XWW96b25mU09GUjlQWk5STycqO0tCNjM1PUBBOTpDPjxFTlNTVFZXWFpaXF1gYmJhX15eW1RLQ1JHS05ER1BMT0k8Ojs0ODksMjs4MjApNklSTzgiKSsvMiM0Oyo3Rk9bSSdSXlQxMFReOis9OF1LLDwtQLKgs6K/oqOwsbegqqazp6WwtarIq62zp7amwai1oZ+lppyllpWhrKetpKS3rKCZl5ahmK2qpcGfrKSWkpyXn5iUlaOenaOok5CYqKiywq+Zqpyqno+Vlqmeqpyeoa2ZoZudoqWvpqGjp56smJalnZmaoZ6enbChnaKnlpmUmZSipJikoJmij5iVjIuOkJiukHyVnIKRgYmpqIWAmJeLhI+giHuEkYWFmpGHhoqVj5uXjpGYnqOWmZKQnI1+jWWhs66FioR3e5CLfnh5em9meZGBgYhrdYF5iXFoc395dYOGgGpzYndlX2hlY2Rmallre3FqalxSS1BEX1VGQD4+LDRARjs0NTs+QTs8Pz4+SE5OT1BTVFZWWFpcX2FjYV9eXl1eXVhWSktMQklPTVJKOzw6Nzg2LzM5NjQuKCYkLTEuLikrKjclKzwoNkNNTEQvVFxRMDVNWzE3RTRcRzU8LECyn7mvvq2rrbGyoKqmsq2jrLOwxbCrrqSzr7yltZyhqKOhnpmXqaeqpqWms7aflZWempqwpq6+oayikZGempqUkpahm5epnYSdqaujtMezn6mjqpaVl5qnnqicoKSslJ+fnZ+qrqikoqqhq5qen6CYpZ+cnp2wpJmfqZSamZ6Sppyaqp+cmGaFlH1lf4+bkGN6jW1oanqQo6tqZZqYfmeFi2VlaWh6jaKOa2iMmJGid2tqi5mjn5hzbG16hIyGeVhlXYaCXmyLi4N3XGh0d3eSgIeBb3iCeIBybXiEc3aIh46DemiEWF1qdGRdc4hoanxxbWNdUU1XSmRYQEkzPUY4P0ZENzE8PT9BQzs7REdISElMTk9SUlRXW15gYWFgXV1dXV1fXlpUT0RIT0tTTj0+PT02NTM1NTU0KiYmJSwqJS4rKyc2KiQ7Jy9CSVtKLjZaTzYpRVkvRE8xWUI7Py49pJ66vLmvq7Kwq6Wora+xp66usL2xqqmlrrCxoK2XoaSeopqapqydraSmqKq0rp6WpJCjsKa3uaWuo4+PmqKak5KboJiYppZ7pKuiqLTDt6Shpq6enZSeo5+jnaSqqZOfoJ6gqq+pqaKpnqabpZ6noKyXoZulsaWYnayWo5+bk6eZoKyan3+9hIp0tHOFn4ataHe5xLhxkqGjeqaZmXSrgn3LwMC6cYujh4OefZaYiJ7AvYKWnZ2NnMHBfIF6kYyawsB9aqWycI6Cb8p6gJt4koOOgHd5gYB5cHt/hnB4hIqSeGx1kWFlXnhkX2WBYl10aG1kYlhMVUlRWUhPRDJJRT9EQj4vPD8+QEE6OERDQkNFSElLTU5QU1ZZXl9gYV9eXl5eX19fXlxTTVBHVU5BPz89NjQ2ODI2NiomJSMpKiYuKyopMTAfOSojPklbTCojQ1AvI0ZbM1BZL1VBQjsvOJWhucO0r6+/qamUo7CqsK+uprK1r6qnp6axq6CrmJujoJybqqejnqyjpamlpbSknqOUpq6suLSnr6KSkZmdppORoKGXm6CeiKarpKutv7+woKiuqJaRn52imaKkqqSUoaGdnayuqKqloqKkn6OknK2pkqSaqK6qnJ6rna6jl5inmKOkmZ5/zpR6e6WCepaXm1+tj12OqIChoXynlZt1q4OBr15kjKp7qIeFoHSXk4izY4KrhqCNjbNqhK90fJaHuGGCrVmjzW6Rdnvbe3+ZcX6IknZ/ZXuIdXZrfYdtfYSOkH5rgIxecGpwZ2BfeGRbcWhqY2VgUlRTV15KT0M0QUhFRDg+NTtAP0E7PThAPj8/QkRERklKTE5QUk9TXF9fX15dXV9gYF9eXltXT1VKPT8+PDU1NzgxNjQoJyQhJywmJi8oJiszHTYwJDc7U0wrLC1KMCc7XDpMLSFQQEY0LjGswcDAtLSwt5iekaSqqa21q6ayrKyspa2msKqhp5yappicoq+foZ+op6OmoZ+xrJyflaaurbGrqKyglJKbn6WTkJ+ll52opJ6to6qwqL/Fsqepsa2Wkp6copehqqqflaGenZytrqapp5umpaKgqpKss5aloquqnqSop6OyopObqZyinJaVkZehcoaMmHaGqIdxsHydcax9oKCCpY+eeKuCfq1/nXKtf6yHhp92mJJ7fJd/qoiijJGMnH2reoiTj59/eq1WnMR7kHCTwX2BlW11cIxtZndlh25heG5yboeJj46CbI6NY25zdW9gZm1kX29pam5mY1hTXGBaUlJDOElIQEM8PjxARkRDRUE9PDw8PkBAQUJFRkdFQENJU1dZWlxdXl5cXl9hX15eXVtaUkM+OzkyNDc4NDUyJiMfHCAxJyAxJx8nNB41LSY3PVdKLT0oPjEpM1ZARiEcRztDMS4rr9PGx7KzoJ2jj6Ojoq6vt6+psaeoqqmuq6ynoqSdmqOVn6aroKKmoKioo5+esKyYm5aop6+tqKepnpeVmqSikpShrpqdp6OurKKstam5zLGspq2rlpScnaKZn66snZahmZ6eqbGnqKiaqqajoaqarrGiqKuvppqnrKurs6STmaWnnJaThaRrpHWKeql1e7JxgqWKmItxiKCbh6RfYVKrhYCug5x1roKohoafepmXhntmgKOKpJiGgqN9qX+BlIauXnuoVZ2ikoJ7o5+AfMSwxYxzr7SzuXJiqa/CdGiLi5WNgGuWj21seHd3bmtmZWRxcWZ8aWNdVl9pWFhUTExQTENDQUI7Q0BAQkk8PTo5Ojw9Pj4/QT04NjtETFBSVFZYW15eXVxeYWFgX15dXF1bU0lCNjc5OjY2NCwmJCIgJychKy0iJC4hMy0mQERXSCxHKzY2KjFQS0wjIEE5RDQsJ8HJ1tbAoJmrqKGvop+xtLCvqayjp6erq6uppaagm6WfnaanpqSdrJqirKGkoK+jnpuTqqS1sK+hqZuclpWnpJGboqifn6acsKWiqLGstsextKmrqZWRnZ2hmaCls52aoZScnqeqqqKsmaqmoKGpobKtoamysqGcq6qxsLimlJimqpqdk32qbZ+EiHareXywboKki4iflpWeloHSuLS4yYGCsl9glKmDpYiHoHqYlpp5qsl0mqOUqKmQkpqMfpqJmsbGd2WhgqV0gqCOgn2vX2+1Y7F1S6OHbadHg5NkjY+ckHpulI58bnl0fHptW2ZqcnFngWleYVdjbVxeWUlMTEpFREJCPUE8QT9KOzc5Nzk5Ojs7OzMuNjxBRklMTU9RU1daW1tbXV5fXl9gXlxcXFxcWE1CNzU3ODUvKSglJiUkJiksNUZOUFBNRkxKVkYqTDEvPS00T1RRHRw7PEYyLCSnpMDHua2psq6tpaOcs7msq6Glm6imq6yppqCmpZiro5+vrJ2moa2an6mlnae1oKSYlKirtrOsnKacoJaQpq2Smpyno6Cqpq2go6epsLPBsbKprKeTiZedpZuipK+ml6KVmJylpamZrZyrpaSdq6O2q6CxuLCenLCotbW2p5aZqqacoZCDnk53moKAn3uEo3yCpIOGpp+cn5SEuHx9ermDgM3Gw7Z4m6KSi59+mZeXinafl4qkmKSofq+FnIOeg6x9mZRhpWyjcZCFkIF9loRyrGCkc3GAmmG8fVJVdY2RoZR6e4+NhnJ5c4V/cFtsbndzaoFuWmReZ25iZF1LS1FTQUdHRkg6Oks+QjEwODg1Njg3Ny0qNT09P0JER0lMTlBUV1lZWltcX19eXV9fXFpaWllVU09IQDc3Mi4sKi4rKicmP1FUVldXV1lYWFdVT1RGPEUyOlBbUxwbNj9HLC0gi4eZqaukq7mrr6Ccoa2ztKafoZWlr66uqaeepaWapKehs66iqaezoJqppJSjtaOjlpehqbW5pJujnaOTkKKymZ6bpqWgoq+snKSoorWxw7CtqaypkYeQnKedo6ScpZeemJiZpaOomKyhq6Kkl66kuqyhtraunp62tLqztqmaoLKkpqCIkNK1w7d6h46GkZOPgKZ3lKJ3jKGShaWDjHKriIa0bnNqmqSdloqffZeZh4eQc66CpZujjaaKk52IlJCabXCyXKVzk3qcbJl/e5l+bqlhonJzfp9ic7K4aHeOkqOWe4mJjod1e3iOgmxod2h4c26AdF1kY21tZmhgSllXVzxHRj9TM0BGPjwqKDYzLjAxMykmNDo7PD0+QENFSUtOUFJUVldXWV1fX15eYGBdWltaWFVSUlFGOjIyMzAvKysoQFFSVFVUU1RWV1dYWFdVVVZVUU9RW1UlITJBSCMqJZJyjYqtv7+8u7Wel6ikrraiopmVo6qorqmrmaWin6agoLWmoqmnsaSUq6OPpK2knpGamqq0tKSdpZypkpSXr6CgnqajnKecs5mgqqO1qsKvqKqooYyDj52ioaajlZqanJiamKajpZeppqugo5uspryslL2wrZ+jsbW7rbepnqu1p6uafKiSfXyweIuApKWInG2xb6CHrXyij4Ool5qCrIqGrYahlaiho5iGn4GZloF7kn6rgZ2Zlourd52gj4iTkn96r12jgX2mp2WegHyXdWquXaVscoaZXWBbjKBtlI+jloCRiZKIeHmBl39qbH5ifXRtgHlgaGVvb2hnaEJYX1o9SlMyUzhBQUM3JCQzKycnMywgLzY2NzQzNjpAQ0ZJS01OUVNTU1ZaXV9hYGFhYV5dW1pXU1BPTkk4MTUyLiosQVRWVlZVVFVVVVVUVFVUU1NWV1dYVlVVUUhGSUojKCi8kpqEqcbDt8G0n5utoK65pqOOmqOkoK+uqZ+jnp2tmJ65oKOrobCqmq6hkaqppZeKmpCtsa2noKibrZiZj62ioZ2loZmknK2Xn6iltqi+rqSpo5+Lf46bmqCmnpKUmZqTmpmko6KYp6qqoKKep6e8pJfCrKujoq20u62wqaO2sqyumnevf5CKnIWHfLqtiZhksIxklq59oZCEp5ecgq2MhbCHqJqkoqOShaBcbGuCs2B/rXx7goGybGdumZeLh7FafbVcpINryKJmn4F7u1l2tVqyfVOvgXqsWIChbZaNpZiHlI2Rknl3jJx9Y3N8YoN3dIB8YWpmb25mZWZPVGJbQVNdPUgoPjk9NCEhLCQfMS4gKjEvMDQ1Nzk6PEFDRkhKTE5QUFJUV1peYF9gYWJeX1xbWFVQTUpHQzU1My4vQFVZWFdYV1dYV1dYV1ZXV1dXWFdXWFlaWltcWFdXR0I70p+zsbe+u7TCs6Ocraelt6mgi5mgn52ysaieop+dtZigs6iqq56wrZ6snJWvqaOOiZuOrqypp6Oomq6Tmo+pmqGdpJ+Zo6KlmJ6iqLGou66kqJ6djnyLm5ahoJmQkpqbkZmXqJ6fl6espKOkoqOoup6fxqemqaGstreusaqhv7GwsJiCqpOjro6bgIakl5iQgIC4w7qEj52UhaiZnoOsjISviqmdm6arkn/VvcKqYqS/vX1/o4KD17u4tYSUkoKevb6Ea6OCcKuEb52AerKxx4Nrq7G9rHl4or67dICUjKOZjJiNkpl3f4+ZeWJ8eWSMZniBe2BrZWpqYlBiW1JpXD9TYEJMKTw6NC8fHyQeJTIgHSQoMDQ5NjY3ODs+QURGR0pLTU5OUVRXXWFcX19hXmBbXFlUUU1IQz48QT81PVNZWVhZWVpZWlpZWFdXWFlaWllZWFlbW11dXFpWWFRXWruVtLSywLqyvrOina6npbOnnYyXpb+ptq+nob+mprGbnrGcuaifrq+lp5WUr6yXjIOaka6mo6yhpZyqoJiKo5OmnaabmqCoopidoKysqbitp6Oal5J7h5mRp5uTj5CXmI+Yk6mYnpaop56opqChqrqdqMWjobCkrLS1rLKso7+rs7KddXaqpLaFZYmfcGeskIqPbm53pZCboYJ2spyYcZGOcperpJuZr6VybW1tZot4b22DmnGBempxaWeJlpWXcmlphYdncYdkXotjanBaXWd+eKZgYnKQknBmZICMkY6flJSWjZKaeoSNk3RkhndnjGp4fnlkbGNlbGJKZFdJalk5T2NETydKOSsjHCAbIiwpGBsYLTIuNTo0NTc6PD9BQkRFSEtMTU9RU1ZcV1tcYGBhXV1bVFBMSEQ9OkFCN01YWVpZWVpZWFhZWFdXVldZXV5eXVxcXF1eXV5dW1tVV16ola20qbq6srOrqaKun6OzqpiSvbHDx7y0qZ6/q6yjoKeroLqjpK6sraaOlq2qkIyFlZatn6arop+kpKCSi6WSppmpmpaiqaCVnKWlpq65qquZmpOSe4SXjaaXjZGQl5SOl5Wmk52WpqGZrqWcoau4nrDBqKW0p62xs6ywrqq8p7K8mIyjqaW1nImWopiHqZuPlJ2SqrSanKSuorWZpaSgo6SfpKailqynjZOTjYeTnZ2VkJmTmJGPlYV/pJqXlo6MlJOKkIiFf2iMgXWDd3WHjHGnbX2Wk5SUgYGPj46Om5CdkpOSnX+Fk4xwaI92b4l3dXx5aWtlY29jVWFYP2haR2JfTlcrRT0rJiE2NDAuHxwgJTIoKjc5OTQ2OTs+P0FCREZKS0tNUFBRV1RWWV5gYWJdXlVQS0VDPjk9QEFTWFtcWVdYWFhYWFlYWFpaW1xeX19gXl5eX19gYGBfWVlgpZapqqS1uK6vorClrqCgt7GQjqrEvMO5tqmhpJ2bpZ2wqKS3p52ptaeokZiso4yIio+cp5atpKGaqJ6fk5akl6iaqJmTpaCjj5qnmKC0uaeqmJqQjXuBlYuhlIqVkZWQj5KXpI6dmKeemrOinKWqtqeuwa+kuKewsLKvrK22vqSzwZqTp6WmtKKSnaaejqmgjJKfoq2xm6Kls6uzmqajn6esoKCenpitnpOaopyUkJermY2ZmpeQl5+Rh6CdlZSGlI2QjpaNgn9mjoh2iHd6iIR0nGqIkpaVkol9jJaRkpaQnY6Ykp2BhZeGenGUcnmJf3F7fmpuZF5waWBcX1hsYk9fY09YOUZGRD0yPD03LiolKykmHSY0MTY2NTg6PT0/QUFDSEpHSktMTVNTU1VaYGFpYWVVUEpBQ0I7OUVNVlteXltaXFtbW1xdXV9eXV5fYGFhYmFhYWBiYmJkYlxbY5iWpKijsLSsr6Oqp66gp7WqkY+bo7K5raqroaKZepyhsKSmsamXnLimo5SYqZyOhoqJnKKQr5+klqmgoZOXmZyui6qWjqeYp4yYqI6duLWjpZebjYl5gpOMm5OKlZGTkI6RlqGLnJ2mnJ22on6DrrSisK91pL+ks6B5e6OttcCYeLCmoYqAqn5kXGJ2n4+knoOWfm2UtZ2lqbGtpmagopV1e5yZcYGZqpltgKSpimWcpZyRmJmXjJOckYWdm5CVhJSIj4+Ti4Z5bJGIdohyfIaBgWFpiYyVk4xbdpWQZmiOi3F4n5WUZHeXhoF3l2iCiYJueX9rcGVgdm9ra2hbZGNhYW1RWT1NTU1SRj0/U0I5MC8eHyY0OjMwNjY3ODw7PkBBQkZIQkdGSUtMVFVVWV1fZ2dnV1FJPERIPDlWUltgYWJgXl9fYGFhX1xdX19fYWFiY2RhYmFhZWRjaGReXWaclqajobCxrKuqpqmuo6etpZKVqrSusKWZqaWqlnOLnK+gqKunlJe5oKCPnKSekX6IiZqejayapJWoop6Ol5KehXWuj4ilmaiRlqOImrizp5+YmIuJdHeSjZeTiZOQkJOMj5KfjJmepJibsJSAjJu1nbSMko+9p6J+p6N7pbK7hI6QqaCEjIWPsaqvjImWo5p5gIushp2fo6mrqomWiJt3pZx7iJyBmKeEgnues3uKhqCYmZWYl4GRl5aEmppieYiShY6Qk4uEbnKRiHqCcoGBhoCHdIiGl5N4lmiTdKCadHuZgZuYhJh+kImBgpdpjIyEanh7cXBnZXhtaWxqW2NpaGRxWltIU0tQQEU1LVlTVDYpITA5PT43NDM1Njg7Oj0+Pj9ESUBJRUpLR1NYW1hbYWFpZllRSDlFTDw/YlZeYmRlZGBhYWBiYl9dYGFhYmJiY2ZnY2JhYGVkY2djYWFonZikoKaurquoraCpsaanqqWZk6zEvK+glKWns5yPg52snaeioI2Qvp6ZjZ+aoZF9ho6Yl4isnaOWoaGSjZSJhoCRqI6GoZyjk5adhZ64saidmpKPhXB1kImVkIqTj46bi46RnZCVnqKUnaqGn7SJtJqui8qIq6+Kt4WNsISzs4epj6qajZ17qI9ye3ecjqaWaJWkebSMoaCoqpSawoKBq4mZoXKegJulfpeGlrKBoX2hk5+PmJiAj5SbiZmSi32GlIeNlpSKhW50k4aAe3OHgoR9hXWGg5iCj8VmgKmHj6JpnYGdloCZgIqLg4iYb42ShGd3dHx3Z2l2cGdoa15ibmxmaldkRlxRTDJFNDZNYGM3JjM8RUdEOjYzNjU4Ozg+PT0+Qkw/TklKTENRWl1cV2JeamxbUUU9S01ASmRYXWNmaGdiYmJiY2NfX2JhYmNjY2RpaWNiYmJlY2FmY2JiaZWXoqCwqamopqygpbmxqaummpSeoaSpoZSjqLWhr3+gp52lnp2JlL2ak42gkp2QeYOWlpGIq5mcm5qihY+Md5ucjqCRh52jm5aYl4WhuK2lmZuMjH5ibY+Lk4+Mj4yMl4uPkZ6Nkp6fl6CmfaGnh62doJaukKCenZGHgqGNrrOJpI+snIyafaJ1gJmUa4KrdU2reIeNnZOcqqmCqqt/haJ8e6dqnoCTbGeXhpi3iZ5+bmBjWIOYf418ZGeMc5l+ephsXX2Yb2FUcoddYG16hGBZZYJ+hYGZcqiqa4OjbnKlb5+BmmdknmxabIl7ZVlfgn5hV1BwdmVvdHFqam9daW9samdXZk1cV0U4QTRGQ15rNCtJQ1FNTj04NDg1OTs2QDs7PkJPPlFSS01CSlxdX1deXmN1X01EOk1PTlRiXFxmZmlpYmJkYmRkYmFiYGJkY2FiamtkYmRkZ2RiZ2VhY2iYl52huaGqpKaskqK2vKquopmWnqClq6ufnK20oaeRoKChp5yZjpi0mZCLnoyVi3WBlJGNiqaWlpien36ThYaspIeckYqYqJeZmpGHpK+mopWZh4mAaW6IiIuOjYmKjZGLj5GhipKcnpqho3+TgY+joZSgd5yWkKeDo6mAh6yxiKV6jX+EmnyicHKTh5V7nox5bYebi5qSnaqcj4edfoSidHemZ55+d6VfmHt9k3Oibpi3tLp0k4iCgLaoZIHFuXxxlbaMcoGbpGR1rKthfmqds35ufomEj4OMmHGAo2tyo3KegXyjXpyZs5VwfJees3RyW56yg2picXR1cWhvWGprcXBkW2dcYUtDPUQ2UUFZcTI8U0dfSlI9PDM5NTo5NkM8O0BJUD9UTk5RQEVfXltZV2Bge2RJQzdMV1VWY2FaZmZra2JiZWFkY2BhYmBkZF9gY2tuY2NkZGhkYmdmY2holJaVpLmZq5yToI6luLWsraCaoZuio6SsmpqxrKuTmKGZoaWampSerJuLiZF4i4VxgJWMiZChkJOUnZd9kYqOqKCHmI6JkaKTm5qMiqinpJ6PloeEfmp6hn59j42Dio+QiY6Tn4GUnJ6bn56LiXecmKKNoHKhjImpiZ2okpmrroKujX56oJl5o5N4gHOXh4ycfZSehpuOmp2oiKNkoX6Ml5CbjW2eaJuOb5qZe4CKp31yaHSrg56Dc6pnlJpdm4V3hZ5oqmqAuWZcqXCBnGGVjF+ndneKi4CdaJp1h5OSmI19nmyYj2qmmVyofne7an2pWo6EXbNnW25yeHdraVtwaXd3YV5kVmFBUERON1VCUW00SlpaXk5aREAxNTE8OzdIPzpDSFU/WVNYXT5EYl1WYFFhZHxpRkI5TltdWWVmWGZmbm1iYmVfYWFfX2BgZWNeYmRvcV9kZWVrZWNpaGdraZadiaq2nKiJY5WcrLuxr6udpZuap5+drJmdsKernpejmqKgmZaWoKSZhomNaYiAcnqWiIuWloSSlJiPeouElqSciZWPhoqdkpybiI+oop+ai5CKgIBpgIV5f5aLeoiNjoeOlZl9kqGdn6GSl3Jon4qgj4xwko2CqYmaoaWqo6t/sK6koriXdqOzoqN/iJR4nXqpmH+ij5+dmYmYcqB9iI6wtX1smpGheH6ZtaOjq6iEmXybfZybf3SqWl1ve5eMeZ5jTX97e4ZlephCTZ9ZompzfY9vgoqEmXabeYeJsbN/fZmSpnN9nW1wfJRvmXJpo12VdkhlY190cXx9bmVfa2d1emJjX1BdV1xTVkBZRVBnRFJWXGFYXklEPUI4P0I6SUU3TEVYQVdSW1ZFRmJcWmBLYG19cUVDPFZeYlplalZnaG1vYmZmXmFgXF1eYGhiX2VjdmxeZWdmbGRlbGhpbGmUnoGwrpqEU1+hp7S6srKomqKLmqmbm6eSoKujoKiPnp6dmpmVmKCdloeHiXeFgW54lISPm4t9kZOWiHKBiZKhm3KSkICImJSfmoSOqJyalYqKinyDbISFcYKhi3eEjIiHkZiUepGin52ih62GfbWEj56de6aWeqmCl5+RjKShgKdpeG5+mXOgc3F8nYWYb5OCrHujhKefm4OkcF+paHajZHCmYZzTj3x7mXhyc2OihpF+onKjkHZrkLOMYIOYi3Wrs6i8f3eEb3+/pqq0Xpxvf3KXcIJ0o3JepGd0pmBopmua05h5gZpudnmXa5t5dpdybKmlZ19leXF/hGxoZmNtdXZmX2FRWmVQUWFIVklUX1dTW2VqW2VQRUNLTElLQktFOFBAUU5YU1hPU1FgZWRpU2R4eXdKR0VkXWVaaGlTaWhqbmNqZmBjX1xdXV9oYmFoZXxkXmRnZGtkamxnaG1omJt/sKxUXUt+qq+xtLCyopyYhJemoKCijKSnn5epipmYmZSak5KgmI6HhXtwfYNofI+Ck5qBd5GOj4pwgIaPk5FrmJN8iJGSo5WCjaiZk5KKhYl5g3aIgG6Bn4Z3f5GFhpeglXiRoKKZn4izoaK2i3qsp6SupXGpgJuRhoKflX6lgaObhphxnoSira+Kl4t/jKSNlYOvo5V3tba2yqJ0lI2Dn2Cdl6lteZaHoJt1oYd3oH6Rl4uBb01mo5Nxm4l0pXt6dWKEg25+oG1yZGCcc390mGt7arS2tMamc5h9eZxqmpmrc4CabHN3l2mZeXSYcVBEfbNeaXZreIZma2Zic3RvbFVbUlloT1FnSVVMWFJVXGdrblVnV01KQUlNS0hKTkFRSlBlY2ptZXVzc395e250iXp7VVFObV5oW2tpUmpoaWxnbWZjZV9cXFxfaWJkaGt7X11kZ2NqZm5sZWltZaKdiK+nhWVAlKKyq6+vtaGij3+Wp6Gho4ukpp2cpoKZl5eOl5CQm5OOiIN5a3mGZYOMf5egeXWPiIyCaoWFkoSLhZ2NeoyKlaWSgpeoloyRi4CIeoB9i3lwj6CFeYCUhoiVnpR+kqSmm5WWhGZueJxsomR8cqV4nJhwaKeDmo59pXuil4OWcp92gYmUlo+5bpCKomJ9mqOXiW50a6trdaBucKdhm2qLkGmWh5uVdaKBfppgi4aNdW+IYmihZp5/apt1cWVniYJvc6JbX1tkoW5eiY1xfIB0cmSlbniiY2anZ5dxipdtoW9SiI9uoF5kp1SLXVSYbW1za3GBbXBoa3dzam5RVlVVZVhSbElYT1tIV2hoc2pZa1ZQUkVWXExYUmFVaGped3V7fHB9fHKDe39zd42Ag3deUXNhZ2JwZ1BraGhrbG9oZGdfXV1dYGpiaml2dV1cY2hjamlybGZrbWOdppmme2V0bYynrqWpsLGln4t/lamcnaOLoaGaoqKAlZmTjpqQi5eRjop7hnGAiGiKinyXm3N1iX2QfGWDh5WKiZWagnyIhpamkIChqo+EkIqBiX2AgI5zaY+mg32FkoyHl5+NhpGopZyIpniVm36liZaMspmekYSvl5+lepiJe6l1qJGEmm6looyShIyDvG18pa+Ch4WHlZieo36mfHOolaGWaZ9/cKxjloqWk3iobaqjgYl2iYN3q5GmiGuSsWx3s42pbIuGb2+gnpKVYn+rjKp4gYCOp593n32FpJadoGeZhnSrZp6tjLZzdr6MpJNZg6aNq2F2cnRve3VwYmp+bmdsUlRYVGBgXGpMXFFbSF1sbXZfW3FYW19aZ3Nlbm9xY3F0YHd6fnlyeYNzhH6Be3uMgYKAdmJ5ZGNuc2RSbGdnb21yaWZpYV9eXGFqYmxsem9cXGJpYm1pd21nbG9ilqaqnYGAn6WWqqqep6eto5iIgZapmZ2iiZqknKidhIyaj4ackYWSjYyMdIV6iINvjIR+l5N0dYZykYNuf4uShoWUj3x7gYWXpI1/pKSNgI2JhJR1goeTbmyLqICCipONiJudiIqSqaKfj390k5eIfoF5lK+kf4KdcY+GeZOOhoF7c6mNcX19epeWm4WOeHt9fYaTlZOLd5KaoaOFfH+LbY2GXHp5c3txaW5+k4pygHSCj5STcYaEg2aNf1+CgYx4d3SVdnB6b3CJboWGX3dpeI5ngoOGj6qcf3R9lmmJiG99dXuCdGxsZoxzeHuXd4Rba1d5j2lud3Jyb3d4b1xrhW5pZlZZXlZcZWpjVWBUXVBeb3d5a2p2ZGlqanV7cHF0c2FvdGJ0e4F4dXqCdX+Af4F5i4WCfntugG1keW5eV25oaHVreGppamRcYFpjaWVscXVuWltia2Rsa3ltaGxvYI6Uuamni6Gjm6akmaSdq6Gfg4OWqZGdn4iZppqomYOBnIt+lpSHjoqJjXKCfI58fo6Ee5eOdHOEcJWGfH2Si4aGj4V4foCGmKOMe6afioSPj4SVgoaOmHdxhKqFjZGbjoednYaKmqafoKuDiI2Um39+ipetqJCTqJF5cZ+UhXyVcICsh3F+lXFqcH2Bn4t/kY2KZ21dhIyOnZ6hkXSXjopzdWyDd3SBWXJvh5GCfn+Mal1pZHuFhImAYGl5fJx8hI2Ed4KIhWp6jYlsYnFzg3dgdI2DipGolodnjY6CbHaKgW2CinZtY2VjeYN6lVpcaWdudlt7eXd1bnNyg2ZbbIlra2JZWFxZWGtxW15fWV1cZXJ9enRvdGJqaml7e3F6dnRkbXRobXt+dXp9e3l6gIB/b4aJg3t9c396c39oVFxyaWx2b3VnbGdkXWFZamhranFybVdbZW1sZ3J5b2hqbWCMjKuxopCjoZqenpidmaihoH2ClquMn5OGmqKRpZV/e5iFfJKZiYiHh4pxfYCKdoSLgYSWinJvgHOYh4R+k4ODhoqCeoCDipqfj4Gln4Z3jpeIlYqLnJeEg3msgZCXmJOJnZyFh6CpnqGio4uHkpudo5qWq6KoqKKTnYmZkX56kZCGqn9/k5GSk52yppqUno6MsJGYhKeOjpadoouSnYWKk4tsfY93eGaChpGLfYmehIiMj4iIgYWEkXh8e3WcpIqIjKCMh5aAgI6DgXdxdYaFgHmKiIuRp5GEh46HgouPinmDiIWMf3RqgYN8eZlpcmhhc4pxfnt3d3B3dIFdXW6GaG5fXllaXFNncVVjW1pga2d0e3tybm9jampofntseH5waG9va2aAe3KCgHd/fX+Ee22DjIV8enl8fXqEeU9kd2tzbnB6ZWxlYmJgW3NmcGZycW1VXWx0bWh4enBnaWtljYieu5+Xo6GYlZmYlJikoJx6fpepjZ2MhZ+ci56XfXiVg3uOmYmGg4SGbXiAf3KAh36Ik4Rta356l4eEg5B+gIaEh3yHgoyanZKGqZ2CcoqPhZKRi52RfI17qYONkZaUjZuVhYWapZ+imp6Gg5KamZmQmaagpp6ekJeClI15foqQhqd8fY+QkYaYqqGdk52OjaiMkYCfjoqVnKGEkJmAiI+EcHmHcnVhf4SQiHeMmYGEj4GGhX+GhJVuenZ1lKSMjoechoaQdoKNfn50c3yKhXx6jo+FlKiQh4SPgYKJiIhzgoWFiHltan1/e21oa2xnXnl/Z317dnV2dXt3XF9wfW10YGNaW15QZmxTZFpdYGpodHl+cGxsY2tqZ4B/a3J/a2t0bndthHluhoB2goB9hXZxgo2Hfnt7fYB7gotgaXxrdWhpg2VqY2BpXGN1Z29idW1sVGJxeWVveXpyZWptbYuKn7iaoqSfk5KWl4uan56cenebpJCbiYaklIuYmnl6jYZ8ipKDjIKCgm17fndygIV9ipB9a2h9gZeJgYiOfH6FhId8j4GPm5uQiKabf3CLiouShqChioWMfKiQh46RlZGUkXeMo6ChnZabgIGQmpiTjZqioqSbmJKcf5CIe4KGkYmjgX6NjY98mKSgoJKakI+li4+BnJKKlJmdgJSUf4iPgnV1gnF3YX6BjohzipZ9iYxxjX+DhoePaHhyeo6alJGBmYCKjXSEin5/c3t8jYZ8e5OOhJemlIyGkHuEhYaDc36AhIV4ZHB6f3d5cGxqZl59c2h8dXZ0fHOAal5gdHdwd2RjWF1eUmlnVGRYXmBnaXV4gXBma2NsZ2V/gWptfWdtcGp8d4Z6a4uBcoGBfoF1doKNhn98e4CBfX+PanKEbnRpYohpbGJfcVZ0b2xtYHhobVdqc3ZjdHp6cWJrb3mJjZ+zkqWmnY6QmI+FnKGam3x1op6Nl3+MoYqIm5Z4fIaIfoSKfoiCgX9wf3pzdYKFfomQd2djfYaXioKKjXh9gIyDeZaAlZeVjZWemX1vi4GQk4Wlm4eMiYOmlISRiZSVkZB1kZ2hoZiUmHp/j5iXjpaanaWempSVnXuSiYV6iJmPoH+Ci46Mc5ijnqCSmI6OoIuLg5iYhJSXm4Caj32JjoJ3cn5ue2SAfYuHcYeUgJGCa4eDgoCLhmZ2cH2IlJqOf5V5jot+gol+fXOBeYuHe4aSi4yZpJeDhIt2h4OBgHN4f4aCc152d31yfXZmbGVgf2lqd3N0dX1xfGNkYXNvdXJtYVlfXVpqY1JiV19fZ2p0eIZwYmpia2ZofIJraHRobG9of3yBeWyPhXGAg4N/dHyDjIGAfnqCg358kG11iXR0bWaKbGpiY3VWg2lwbmB4Z2xhanZwZnh7eXFfcWyFhZCdr5inqZ6OjZeHhZ+TlZd8dqebiph5l5yLjJmQeXyBjH19g3uAgoB4c3h5c32Ag3+Ii4BkXn2LlYd/hYh0fX6Jf36YhJaUloyjoJZ+cYZ7k5GKpo+MjoqSoJCCj46TlpCKgI+XoJqSkJJzgI6SlImdnZ6nmZmOlZd1kZKMbYiakpx8iImQiW+YnZqikpWKi52LhoGTnYCUlJeIm4p9ioqCe3F6a3ZtfH+Mf26Fk4OVeHCChH5/jIFlc2p9gpiYhoGPdZKLhnuJf3d6gn+Ign6Fj4eNlaWReYWCdIiGe35xcn6EgGtgeXR5cHtuYW5jZXtibm92c3h3dHRhd2BvbHVucF1aXl1daV1PXFdiYGdscnqIal9pZGljaHeHbWZsaGlsZ4B8enduj4hzgIOFfXSBhol6g316gYR9fI5yeYt5eG5sh2toX2lyYodocW9ldmdtbGF6aGp8e3hwYXdti4GZmauhpamei4uRhomdi5SWfHasmIyWfJ+TkZeUiXd+e4p8fIB2eH+Ab3Nzem+FfICAiX58YFt+j5GHgISEcnp/hnqPkYeRkZuSpJqTgXyBfI2KkqSJjYqNlpqMhI+XkZSNiIiMkp2TkIyNboSQj5GJnpmioZiYipeTcIychmiKm5GWe4mFkIpwlpqUoZGRiIqYjIJ/kp99k5GUjZqQfIuGiHVzdWtxbnV9i3VvhpGOknJ0gHyCgop+Z3Nuen+blX6GinaSjYN1intxg4CDiX6GjouGjparjnuIfH6KhHZ8bmx9goBhZndzdG56YV5vYWt0XnBqenl5bXRxZXpebmxzbXNZWV1fYGlaT1ZXZGJlcHB+h2VdaWhmYmdwjW5jaGhlaGeAend0b46Fc4GCg3x2g4mFeIV8eISGeoCJd3+LfHtzeYNqal9waHR/a3FvbXFnb2tle2Ftf3l3cGx3d4l/o5ijqKGnm4iLioGOnIaSmnR/qJSRjYehjZaUkYF0fHaFeHh/cnN6hWxxb3hsiXZ/gIZucVtZfpKNiICBgXZ1gH9/oIaPipKcl6CSlneJfoCMiJydio+GkpeWhYiTmI6Wi4qNjoydio6Rg22Ji4+RipyWoZyZloaZiWyIpoVoiaCMk4CNhYyBeJSYkp2RkIiIk41/fpCZfZKOkY+bk32LgYVwdnBsbm9wfIZqc4OPmYtyeIB1gomDemh1cHeCm5B9ioZ7lpN8eIp2cox9iI98jIiFio+cpYl8hHaBin53d2tofn9+W3FycW9vd1pecGFwa15vanx6cW5tam13YHBva3FuWVhgYGBsV1BSWWVlYXRvhIFhXWtsZGJma5JuYGZmX2ZqgXVxcm+LgHR/g4F5doGLgHmGf3iHhnaDhXuGi4B7d4t/anBjfGKFfG9wbHRqaG5sd3dfcX55e3R1c3+CfqWVm62fp5eFjIN+lpWDjp10iZ6TkoWLm4yWjox6cnh0gnByhHRxdYhsbmx0bId2gn1/bW5VUYGrlIeCeIB2coJ5gqCCkIGSkpiakZh3kHqCjJKjmpOOiJSYkoOFlZiKkouJjo+InYSRi31yioWIj4icmZ6bl5aBlYBpiZ+KaYmjipSGkoSKcYORmI+ajY+Li46Nd3uTkXuQjI6Tl459iX6CbHdqb2xsbXuAYnp+kJeCd3uCeIONfXppdm12iJeMgImIfZWSc3uGcnmPfIyPfIp/hY6Rn6CHfXx3gYp8dm9naX5/dl12bm1rcHJVXW5icmFfbW55cGhwZmd0dmlxbGF3Zl1VZWBfcVNQTVtlY1x3b4h7XlxocGFiZWaRal9nZFtnb31vbHFziX12fIaBdXZ/jHl8hoB4h4NzhoV+jIyEfHqVeGdxaoNgh35vb2t7YGltdIB0XnN8eIZ4dHOFfHmhkJqxnKWPg4p/gpmIf4mbfomYko6EiJiOj4+Ed3R3c4Bwb4R0cHGDb2ppdW2Cbnx8bXRzUk6C38mS1pN8b3SDdYOfgpF2lJCYm4+Ye5NyhY+doZOTkImSmpOFfZWVh4yNh5KNiZx/joF4e41/iIyJnJycm5aUe453aYyUim6LpoeVipiEhmOMkZiOlImWi4yJi3B6lYp8jomLlJKLe4d9gG18ZXNva217eluBepCQgXt+f4CGj3t6aXVrdIyQi4OHhn6XjW2AgHCCjoCOiX6FfISRlpucjH13eIKOd3FrZG58gGlnc25naXNsU15vZXBZX2xxd2dra2JneXRwcGRgeGFgVWtfXXRPTUtfZWJbd3CJc1xbZHVgYmVljmNgZmJYaXNzbWtxdot8c3mGgnZ3fotzgId/eol/comHgZCJiX1+mXZlc258ZYd+bm9rf1lsbnl6cmB2enuNdnJ2iXZ5n4ycr5ugkIKEeIeUfnuIm4aEnZCOhYyXhJOPiIF1d3B5cW+EcG1tfnJjZHdwfG15fGpobGOkmsHcru+ic2x2g3WEoYSQbpWPlZ+TmoCRcIWKoZaJjpWKkJyVgoCUj4WIj4CSioqXf4d7dn+KeIaFjZubl5mQkHeMd3CKi46AjaeHlIuehoZei5SXio6IjYqKhIlsfJeDfomGi5OQh3eHf39sfWR4dWpvenRYiXuSiIZ7f3+Aho1/emd0aoGKj4uEhIGNmIdtg3dwiZKDkoaAhHyBkpeUm5F1dHiHi3RycGRydn9fcmxvYWh0ZlJgcWdrVV9uc3lhcmNgaX5xc25bY3NhY1ZuWlt2TExLYmVgXXVyiW1bXGR4XmBkZYRfY2NeWGlya25rcneLfXN2hIF4eHyJcYOFfX2Ie3SLiIeVhYx/f5hzaHVxeW2Lem5zcIBXcXp2eXFkdnmGjGh2gIlxgJ2Imaico5KEfXCLk3d4iZuDhJ+NjnyWjX+aiIV8c3dwc2pvgWxqbHx0XmB3dntwdHpnYGV869q1ycPciXNsdIF2iZmIjGiXj4+blJKBiHCFiJ+NhYuVioyXk3uMkoeCiI96kYuGj4KAd3iDhHKHgpKblpOYh412iH9xiIWMip2lhpeOoISKYYSVj4aIhYiMhoCHaH2UgH6DhYuPj4NyiICAcndodnJpdXdsWo19k4OGfoGEgYSLg3didW2KgpGMg3+AlJN/cINteoiRiJSGfYN/gZOUkZiKbnF5i4V0am9pb3V+XXJobVxpdF9SZHFpZlNfcXZ0YHBgXWiEcXNqV2dpZGlXbVdbc0tJS2RlXWFxcoVpW1xleF1eZGd6YGRfXVlrbmVuanN3in5zc4F+e3Z6iHOFhHx/h3Z2iYWPmIGMgnyUdmx3dnl4k3Rud3p8WHmGcYBuZ3h2kYJkdoaFcIqXhpqhm6KKhnNukYpydo2afYqZiIl8n3+Emn+CeXJzbm9kcn5pZmx3d1tfeHp6cXF/aWFnYX/Vto6RpnhucXd7cJKQjIVpmI2ImpCLhXpoh4uZhoGSkIaGl417jIyAgImNe5CNfomFenV7g3xxhoCVmY2SlIKJdoWIeYaDjpagoomYkqGAiWF/lIeEh4OIjH9/gmZ9kYB/gIOOkJF/boR+hHVsbXd1dHh2a2OOgo+Bhn99hYCFiX9wYHRyhn2QjoN9gJKKe3KFZ3uFjImOhX2GgIGVkJGUhW5veIt+dGxtaGl4emBnaWlYa3VZUmlyaWJRYnJ4bWJlXlpqhG50YlxoYGVtXm5UWm1NR05lY1tmbXB/a1lbYnJfXGNsdmRlXV1abGxibGpzdoZ/cW9/fH10eIZ4hYN9gId1eImAkpV8iYZ3iYFveHl6hJJvbXqAdl6Df3SBbGh6c5RzZ3KHfHGSkoSan5ugh4Z1dZN+bXWSlX2Hj4SKjZp9jJp2fndyb2xqYXR8Z2JpdXlaYHd7eW1wfmVkaGhXnY9fcnOXvMSEdXGUiI99cZaLhpuSi4dyaYiOlYB7lYuBhJqLe4qGfHqJi3+UiHWJhnZ3foFydYWBnZSFlI+EhHOBineHf4ycoJyJlo+egYlmfZOCf4WCiIhxgX1mfox8eX+AiY2QfmqBfoV2ZnB5eHR4dGxqj4aLgouBeYOBhYSBbF9zeXt+jouGfIOQgn9zg2p6hYmNiIZ5hX6CmY6RjX5ubXqIfHVzbWZle3RiW3BiV25xU1Nuc2hhTmd1eGZgXl1Zb4FvdFpmYl5rbmBwUFlqUURSZmBZam1se25ZW11sYlpib3ZkZ1xdYGtpY2tqc3aBgnBufnyAdHWDeoODfYGFdn2IgZaQeISLdYGIcnh5fo2Qb296gHFpgXh6fm1se3WVa2p3hHNsk42Gn5mfmYWHbn2LdWl3lo1+gImDlZeKepCWb3t0cWtqZGBzemhfZXF6WmFyfHlncHlhZWSPsbJ3S2JapdnQlnF6kIqPd3yTioSYkIuFbmuFkZF6eZKGgYSYiXuGf3d3iYqEloBvi4hxdX57anmFg6WQg5ONhIBwgIV4hnyJn5yYjpaSloWIcHuTgn2CgoiCbYF2aICFeXKAgYWLiH1mfn+FdmRxc4BpeXBwdZmOhoOLfXd5gYR6g2tccn9zgomGin6HinyJc4JucoaIkYeHdIZ7gpqNjoV5bm59g351eWNmaHtvXlh2WldwbE5XcXNnYEtsd3RhXlxbWnV+c3BYZ15nanFgb05XZ1E+WGVdWW5qZ3lwWlpYamVZY3B4X2dcXmVsZ2ZraXF3f4dubH9+gHVwgnuAgn+Cf3aBhIiXiXGCjXF7hnx6eYSUjHVqeX5rb350f3xvcnt6k29vgX54Z5KLgqGZnJGChWaGgm9neZSIfX6EgpiJgXyOjWh4c2trZl9gb3htX2JveFxka4J6YHF1X2Vl1Oq9izI6PouOf3F5hYeNjHWClox+ko2Lfm1rhIyMdX2Pf4SBlIh7gndtdYaEg5d3boiFbHV7dWZ5gYOmi4KPi4R+boF2eYZ9iaCTj5OUlY6Mh397koZ4f4OMgmt/cWiAfnlufHyDi4R4YnqFgnJlcml/bnVydYKcjIGAhoB0dn+BdIJwW26AdXmMhIt8iIF+iXl7cm2KhZKFjXSDeoCYjIuAdW5qdoB/dHNbZ2d1bldWfFNZb2RLWnJyZVtJcXhvXFtbWV11f3RpWmJbaGZvY2pNV2VQPV1lXFx1ZWB0b1pYVG5jWWRxeVpoXWBnbWdpa2lwd32ObGmChH95boB8fYKAgnp1goCNk4RwgItueH6Ae3uIk4p/aHp9anN7coZ6c3Z9fox5eIR9fGuLjYObnpaLgYBsjH1qaH6Ni3p9foOUgn59iohrdXFnaGJbYmZybl9ha3NgaHCIeWJzc15jZJugj25dNlqvtXRpgIh8kYZ1hZWFc46KiXZva4SCh3R5iXiIfJKHeX5yZnWIfn6Yb3GHf2l2eW5meYeEpIaAh4yKf2+AeIKEgJCcioWXk5qKjIWJfJCIcXt9hHtofmxqgHt6ant3g4iBc2B4gn9yZXNndoNudXyGlpKCfYOBcHh6fHWAbVhwgHd1jYOHeIh2hIl8eXRvi4KSgodzgH5/lImKfG9uaW2BgXRtW2VkcW9QWnpOW29bTltyb2RVS3N4aVdZWlphcYF1YV5dYGdkaWlmTllnTUBgY1tgdWBddWxXV1N0YFpkb3JXal1iaGtnbWxocHd8kmtohIp9fG9+fnyCgIF6d4B/iouDcXyHb3J4g397iYyPg2p9e212eHaKdnx4f4KGf4N+fXpthIuHmKOMhIN7dYp4amyDh5B4fXqCkYCAfouDcHJwY2ZeWWZfcG9fYGdvZmpuiXRhdG9bYWRqdXqAv5ympMi4cYWCcpJ7d4WSgnOQi4dycm+DeoNzdId0h3eTh3h5cGJ2h3qAk2lyhHdnd3VjanyCh52BgH+Oj35zgXWHfIOWk4Z7mZCXkIiCiXuJiWt4eX50Z3poa395c2l6d4GEfmhgeIl+bGt0aHyBaXaCjJKVf3x/gHF8d3x0gGJWeH5zdIuFgn2EcoiKeXlycYWDj4CAen9+d4+GhHdqcWhsh4Fxb1xmYHFsSWR1S11tVVNZc25iUU90eGFSWFhdYXCDc1xiXGllZWRrZFFbcElDY2BbY29dXXhnVFZVdl5bZW5oVmtdYGpnZW5uaHB3epJtaYiMeX1ye355goGBfHZ9g4iGg293hHJud4KCfoiLk39wgHx3eHqBjHSCeH+BgYKEeoB1b36Ki5ueh32FeXeFemd0hYuQeX5/e4iFhHeQgGdwbl9kXFhkWWxyYWBgcGxraIluYHNoWV5jbn93qdqpx4aHsnGId2+MdHqFjX95kol/dHNzfXZ/b3F/bYRzk4V4dGtgeYJ5iY9mcoRwaHVuW219f5CSf4B4kZN+eXxviniElI6Hd5mNk5CIhoV8gIVtdHV+bGZ2ZG17dm5rd3eAgH1hY3mHeml2dmN+fGh1h4+Nln12gXdxgHt9boFaV3V/cHaFiH+Aem2Kh3V5bHaChIV/fX56fXSMgn50aHRlboqDbHJZaF1zZEZtbUtaYVdWVXhtYlBSdHZYUFZYXmByhG9dYWNtZWReb2NUXHFGQmVeXWVnXVt6YlFVW3RbWmdrYFZqXmBvZmZrcWhwdniOdGuOjXV/dnh+d4GEgXt0fYOIh4NvcoB0cXV+hYGJjYt7d4B4gnt8hYd3h3x9gX2EgHt+cnV5i42gjIh5iHZ0gnhefYWXi3iFg3SFhoR4intibmxbYltbYFZpc2JgW2dub2aHcmFxZVdcYmt/fMrOh7mham1tiWtxg3F7g4l+epCEeXhzeHR0e2psdWKDdZGBdm5mX32CeoyKZXKCa2pxY1hseoSbiIGBcpaVd399cItzhY2PinSakJKJhouDe3l+cXBvfGRncGFteHFrbXF4fn56XWZ7gXhqdnlmg3dodIiMjpZ+c4lrb36CeW99Xll0gG10gYt8gm9wioByd2l4gYKBg3h/c3t1iH17c2dyYW6LgGtwVmlcdltHbWpNVlVdU1V7a2FPVHVyUFFUV15jdYVpXWBsamZjWm9hWGJvR0FnXGBlXlxWe11OVWRvWVpqaF1XZ2BfcmZqaHJncHN3hnhulYt0f3p3fnqDiH91cn+HhY6CcHB8eHZ2eoWFh4yGent/dIp9fYaEg4d/fn59hn58eXV4d5GTn36LfIptdX94Y4KGlYZzkYpvhYWBe4R1Y25qWV9aXF1UZ3NkYFhkcXJngHJia2RWWl9qf3i+rnuftm1hc4Rnc3pxeIGFen2Lfnd3cnVve3Zlam5ghnWOgHNpYV5+eXmLhGZxf2hra1pWb3eJooCEf3CZk3KBeneFcIWFlYt2mIuOiYWJhX15dHJvaHhfaWxgbXZraGtreXh7d1tnfn15ZnN+bYV1ZXWGjoaXgHGNaGt7hHVudmNdcn5sdX2Me4Jndoh+b3Jpd4B6gIF0fm17fIN7eHFmbGFtiX1rbFVpX3ZVSmlqTlJOZ0xYfGhhTlV1a0xQVFVfZ3aDZ15hcWhnYlhpXVxrZ0pEalliY1ZZVXlZTVZtaVlda2RcWWRiXnRmbGRxZ3JwdYF3cJmGdn9+d399hYd9dXOCiICUgm5zeXt6dHOEhomJg3mBfnWOfnyEio2DgoR7foqDe3d8d3eanJd6iIKGaXZ8e2yDg5J/co6BcYaCf4OAcGZsZlddW1xaU2RwZF5XYnJ1aXVvZWViV1tbaH9wb3KAc4lkZHl8aHN1c3KBg3eAgnh2cnVtanpxYWdrZoZzjYNtZl1ffXB7iX9pbXhnamRVV3JvjKV8hHt2lpF0fXR+fXB/fpSIeZt+iYeDh4N9dXBxbGd0W2tnXmx0ZGhmaXpvfHJaaIF3dWlxgXiCd2J3hot8lYJwjWtue4NyZ3RmYW97Z3N4inx+Y3eEd2tscnZ8cnx7dX9of4CAeXdvZGZibYV7bGpVaGFvUkpoaU9LTm9HXnpmYU1VdGRKT1NXYWt3f2ZdZ3RpZmBXZFdicFxLS2pXY2FVVFVyVktYdWRZXmtgW1pjZF92Zm1icGl0b3J/dXSZgnd/gHd/f4aEen11goR+l4VtcnR8enVxhIWPgYB6i3ZzkH98gZWNgIWEfX2Mhnp+gXd7o6WKeYeFg2t0e3p1goCLeW6Ec3mEfYKDdm9qaGVWXVtaWVNibmRbWGFze2pobGlgYlheWml/aWtwgGdsYGd5d2lyc3Nsg4B5fnt1dG16Z2l5al9lbmiAdo+EZmVYYndqf4d7b2pwZ2ZdVFhvZ42ndoB6fJCOenZxgHF1eHyTg3uXdoaEgIaIdmpydWdnbltsZF1tcl9oYWp5aHxtW26Dc3VrcIF+enhhd4aFeZGGdIlycXqBc2Nyal1weGVydIh8eWN0gXFnanp1c216eXZ5ZYR8gHl3cWRkY217fGpqVGdhZVNKa2ZPR1FqRWF4ZmFNU3JdSk5VWWVseHtmX25xamRdVmFVbm5WSlNnV2VdWE1Va1RJW3heW19rXV1aYmVfeWhsYW9vdm5weHV6mH53f4F5gICHhnp5eoN+gZODcXR0f3p3dISIkX2BfJFrcpWAe4KfhX6HfYB+hoKAiXt3hKuef3qHh4JqcoB5dYB+gHRuhm59gHOKgGpvbWRkWV9aWVlUYmpnW1pfdYJpXm1sXGFXW1trgWVxdH1paVxqdnRmc3Zxa4N6fXx4dXJseWZpd2ZdZHJneXeSgGJiVGVwaIKFeHhnaWphV1ZZZ2KOp29+d4CLjntxcn9pe3F9j395kXOFfoCAhm5kdnJkZ2dcamFdb29baF9tdWV7aF51gW9ya3J8fnV2YnWGjHuJiIKBeXN2gHZicW5bcnRjcXKFfHVlc4BtYW17cWtqfHt2c2eHd3t6dnFlYmRtcn1palNnXVxUS3FhUEZWYEdjdmZhS1NvWEtNWFhoa3Z7ZWVucWdkWlhdWHdlVEpcYldnV1lIV2RPR2F4Wl1fbFteXGFjXn5pamBvdHhtcG92g5h6coCAfH+JjIZ9dnaGeIeMfHN1dYJ5e3qCjI58foWJaXOWgXqKnH5+hXqBe399holzcY+ti3t7ho98ZXGHeXN8enVyboVse35sj3pjcG9iZV1lVllZVmNma19dXHOFaFhwblpeWFpba3picHd2bGFZbHJyZnR1b2uDd35/eHZtbnNkaHRlW2d0ZXV2kXleXFJmZ2uDgnR+YmRqXFRXXWFijqRpeHODhpF5bnF8anpvf4l+d4t0gnl9eYBpZHZtYGZfXmlfXXRrWWZdb29jemVceH1sb29weHl0dWVzhJOAh4SKfHhwc350Y3hlXHFxYnFygXx0Z3OBZV9ud2plaHt9dW9wg3Z0fXNyYl9mbW58ZGhTZldYU012XlBJWVdIYnRjYUlTbFNKTlpXamxyfGRtbXNjYVpaW2F3XFNLY11XaFNWRlhfTUZpdVheYGxbW15hYl2EaWhhbnh5bXBrdoCQeW2CfoCBk4iEgXZ0iXSMhnRxdnWCeH19foyQf36UfnB3lYN9mZJ5gIB4en1/dIiEdHCZoHp6foeUd2N0h3hyd3RrdG9+a3h8cJFzXnBvYGdibFRaWldoY21mXFxxiWVTcW5bWlhXX2t2ZGl1amleWWxyb2tzc3JohHx+f3t2bm1rZGlwY1trcmR0do5zWlZUZWFygH9ygl1iY11TWWBbY5CfZXFxhYSSdWxse29wcn1/fnOCeIF0e3p6ZGV1Z11iWWBnW152aFdiXXBpYXhhXHx2amtyb3h0c3VpcYKWhIeAhXd0a3J+b2d4WF1sbmNyc4B6dGdwflxgcXNjYWtzgG1udn9zcnhrcGFcZWxsemBmUmVUV1FPdVpQT1hRSGNzYWBGVWpRSlFaVmtra31mbm9yYltaWFlscVdSUGZWVmhTVEVZW05IcXRYX2NsYlhgYGBdi2pjZG16eGxwaXV5h3trg32AhJp8g4R5fIhuj4dybnZ6fXSCgnyLj4KDmHR4gZOFgZ6JdYGAgnR/gnGIg3ZwoZZzeYWKhnpkdopubnpuZnhweWtydnONa150bmFnZWtSXVtVZ2Fsa1pccYxkT29tXFZXVGZpc2hidGVkXFhtdGxvdXR4aoV8f3uHdo9zY2RrbmBcbW1jc3iHa1lUVmNkeH19cYZdZF9jVFpfWGKVlWNtcIOFinRraXxwZ3V5dn5te3V2cHt/dV9mc2NbXVZhY1hhdGVVX2BtZGFxXV1+cGhpdHF0cXV3a22FlIKJfYdyc2hwf3F0cFRcZ2tmcXSAdnNjbXdWY3NsXGBwaH9nbnh+c3Nzam1hWmRpandeZVNjVFVQU2xWUFZTUEdkcl9gRVdpT0lYVFduaWV9aWx4bGJXXVVbdGRTUldoUVhmVFNHWVlPTXd1Wl9la2lZYWBdXo5uYmZreXZub2l1doB/bIOAfYeYe4CHgIl/a5OIcmZ0gHt1gIN9iY9/jJNyfIqRhIefhnt/ho10gYZzfoJ2bqSLcoCMinZ2bHmLYGR7cGZ5c3hsbXJ3g2dke2xiZmdoU19eVWdfa29bXm6NaE1pbGBVVlNuZnNrZXhlZFxYb3NrcXp3cmuHen92nHp5a2FlbG1eYG5qZXF4fmdZVlhgbHh8e3CEX2NeZ1ZYX1djm4hia3CBh314bGx6bl14c259a3Z0b3B8gXNYam5fWVxVYWJXZHBiU19iaWJibFphfmxmbHR2b213d2xpho2AinyJbnJncX5udG5kW2FpaW90gHRyX2ltU2VyZVZkcGR8ZXN4fXdrcG1rYFlhZmd0XGRVYFVSTldkUU5bTk9IZG9cYkZZaU1KX0tZbWRgeWlufmVgVV9UXXVcU1JgZk5cYFVSSVtYUFl0dV1fZWtoWGJgWl6NcWNnanhxc25odnN7g3KCg3qIjn58iYeNeW6QiXRrc4F0f3+IhYeShJaPeX2Mj4eRm4SAfI2Fc4CBc3R4c2+Tk5OTk5OTk5OTkpKSkpKSkpKSkpKSk5OTkpKSkpKSkpKSkpKSkZGRkJCPj4+Pj4+Ojo6Pj46OjY2Njo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjYyMjI2NjY2Njo6Ojo6OjY6OjY2Ojo6Oj4+Pjo2NjY2Oj4+Pj4+PjoKAfnp6fX5+fX1/fn5+fn5+fn5+fn+Af4CAgIGAgIB/gIGBgYOHjI6Ojo6NjY2NjY2NjY2NjZKSkpOTkpKSkpKSkpKSkpGRkZGSkpKSkpKSkpKSkpKSkpKSkpGRkZCQkI+Pjo6Ojo6NjY6Ojo2NjY2Njo6Njo6OjY2NjY2Njo6Ojo6Ojo6NjYyMjY2MjIyNjY2Njo6Ojo6NjY2NjY2Njo6Ojo6OjY2NjY2Ojo6Ojo+Ogn99ent8fn59fX59fn5+fn5+fn5+f4B/gICAgICAgH+BgYCBg4aMjY6NjY2NjY2NjIyMjIyMkpGRkZGRkZGSkpKSkpKSkZKSkpKSk5KSkpKRkZGRkZKSkpGRkZGQkJCQj4+Ojo6OjY2NjY2NjY2NjY2OjY2NjY2NjY2NjY2NjY6Ojo6Ojo2NjIyMjIyMjIyNjY2NjY2NjY2NjY2NjY2Njo6Ojo2NjY2NjY2NjY6Ojo6Cf3x6fHx9fn19fn19fX59fn5+fn5+gH9/gICBgYGAf4CAgICDhouOjo2NjY2NjIyMjIyMjIySkZCQkJCQkJKSkpKSkZGSkpKSkpKSkpGRkZGRkZGRkJCQkJGRkZCQkJCPj46Pjo6Ojo6NjYyMjIyMjI2NjY2NjY2NjY2NjY2Njo6Ojo6OjY2MjIyMjIyMjIyMjY2NjY2NjY2NjY2NjY2Njo6NjY2MjIyNjY2Njo6OjoN/fHp8e31+fH1+fXx9fn59fn5+fn5/f3+BgYGAgICAgYCAgIOGi42NjY2NjIyMjIyMjIyMjJTO2tjY2NjamoGEhISEiF0tMDAwMC1GoaGhoaGhoJqZmpqampqKg4SEhIOEd2VnZmZmY4C+u7u7u72zbWZnZ2dnZZChoKCgoKOAY2dnZ2dmb4SDg4ODg4OLjIyMjIyMjY2NjYyMjY2NjY2NjY2NjIyMjIyNjY2NjY2OhX19e3t6fX58fH59fX1+fX1+fn5+fn9/f4GBgYCAgICBgICAgoWKjI2MjIyMjIyMjIyMjIyMlNvp5+fn5+qcfoKCgoKGUxgdHR0dGTekpKSkpKSjnJycnJycnImBgoKBgYJyXV9fX19bfsjExMTExrtnXl9fX19dkKWjpKSkp3xcX19fX15qgoGBgYGAgYqLi4yMjIyMjIyMjIyMjIyMjY2NjY2MjIyMjIyMjY2NjY2GfH16e3p8fXt8fn19fX59fX5+fn5/f3+AgYCBgYGAgIGBgYGChYqNjYyMjIyMjIyMjIuLi4uSl5iYmJiZmZKPkJCQkJCMh4eHh4eHiZOTkpKSkpKRkZGRkZGRj46Ojo2NjYuJiYmJiYmMkpGRkZGRkImIiYmJiYmOj5CQj4+Pi4iIiIiIiImKioqKioqKi4uLi4uLi4uLjIyLi4yMjIyMjI2NjIyMjIyMjIyMjY2Njoh8f3l6ent8e319fX18fX19fX5+fn9/f4CBgYGBgYGAgYCAgYKFioyMjIyMjIyMjIuLi4uLi5GQj5CQkIuOkZGJh46KkJKTj4iNjI6PiI+RkZGRkJCQkJCPj4+Pj4+Ojo6Njo6Ojo2NjoyLi4uLi4uLjY2Njo6Ojo2MjIyMjIyMjY2MjIyMjIuLi4uLiouLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyNjY2NiX59eHh5fH18fX19fHx9fX59fn5+f3+AgICBgYGBgYCBgIGCgoSKjIyMjIyMjIyLi4uLi4qLkJCRkZGPhI6QkIaKj4WNkJGKh46Lh42HipCQkJCQkJCQkI+Pj4+Ojo6NjY2NjYyMjIyMjIyMjIyMjIyMjIyMjI2NjIyMjIyMjIyMi4uLi4uLi4uLi4qKiouLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjI2Lfnx3dnh7fXx7fX18fH19fn5+fn5/f4CAgIGBgYGBgIGAgIGChIqMjIyMjIuLi4uLioqKioqQkJCQkIqFjoiOhoaPiY2QkYqEjIuGj4aMj4+Pj4+Qj5CPj4+Ojo6OjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uLi4uLi4uLi4qKioqKi4qKi4qKi4uKioqKi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIt+e3d2eHt8fHx9fX19fX1+fn5/fn9/f3+AgIGAgYGAgYCBgYGEiYyMi4uLi4uLioqKioqKipCQkJCPhYOMjpCOiYyJjZCQj42HjYaMiYmPj4+Pj4+Pj4+Pjo6OjY2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKioqKioqLi4uKioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMin18dnZ4fHx7fH19fH19fn5+fn5+fn9/f4CAgYCBgYGBgIGAgYSJi4yLi4uLi4qKiomJiYmJkJCQkJCMhoyJjoeFjYmOi4yLhYeHhoiGiY+Pjo+Pj4+Pjo6OjY2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKioqKioqKioqKi4uLioqKioqKioqLi4uLi4uLjIyMjIyMi4uMjIyKf353eHp7enp8fHx8fX1+fn5+fn9+fn9/gICAgICBgICAgYCBhIqMi4uLioqKioqJiYmJiYmPj4+Pj5CMjouPjIqPjI6MjY2JjYqLjImOj46Ojo6Ojo6Ojo6NjYyMjIyLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4uLi4uLi4uLjIiAfXh5enp6e318e3t9fn5+fn5/f35+f39/gICBgICAgIGBgIGEiouLioqKioqJiYmJiYmIiI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Oj46Oj46Ojo6Ojo6Ojo2NjYyMjIyLi4uLi4uLi4uLjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLi4uLioqKi4uLh4B8eHp6eXt8fHt8fH1+fn5+fn9/fn9/f39/gIB/gYGAgIB/gYSJi4qKioqJiYmJiYmJiIiIj4+Pj4+Pj4+Pj46Pj4+Oj4+Ojo6Ojo6Ojo6OjY2NjY2NjY2MjIyMjIuLi4uLi4uLi4uLi4uLi4uLjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKiYmKioqKioqKioqKioqKioqKioqKi4uHgHt5eXh6fHx6e3t9fX5+fn5+f39+f39/f39/f3+BgYCAgH+BhIiLiomJiYmJiYmJiIiIiIiOjo6Ojo6Pj46MjI+Sj5COjo6Ojo6NjY2NjY2NjY2NjIyMjIyMjIuLi4uLioqKioqLi4uLi4uLi4uLi4uMjIyMjIyMjIyLi4uLi4qKioqKioqKioqKiomKiomJiYqKioqKioqJiYmJioqKioqKioqKioqKioqKioqKi4aBe3h5eHp8ent7fH19fn5+fn5/f35/f39+fn9/f4CAgYCAgIGEiIqJiYmJiYmJiIiIiIeHh46Ojo6Ojo6Ojo+MkJOQkI+Ojo6NjY2NjY2NjYyMjIyMjIyMjIuLi4uLi4qKioqKioqKi4uLi4uLi4uLi4uLi4uMjIyLi4uLi4uLioqKioqKioqKiYmJiYmJiYmJiYmKioqKiomJiYmJiYmJiYqKioqKiomJioqKioqKhYB6eHl5fHt6ent8fH1+fn1+fn9/fX9/f35/f39/gICBgICAgYSIiomJiYiIiIiIiIeHh4eHjY2Ojo6Ojo6Pj4+PjoyNkI2NjY2NjY2MjIyMjIyMjIyMi4uLi4uLioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYmJiYmJiYmKioqJiYmJiYmJiYmJiYmKioqJiYmJiYmJioqFf3l6eXh7e3p7fHx7fn5+fX5+f39+f35/fn+Af3+AgICBgYCChIeKiYmIiIiIh4eHh4eHh4eNjY2Njo6Oi42Nj5WPiYyPjYyNjYyMjIyMjIyMjIuLi4uLi4uLi4qKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYR+eXt5ent7eXt9fHt+fn59fn1+f35/fn9+f3+AgICAf4CAgICEh4mIiIiHh4eHh4eHh4aGhoyNjY2NjY+MjImKj42IjJGPjY2NjIyMjIyMjIyLi4uLi4uKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4uLi4uLi4uKioqJiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJg355e3p8e3p7fX17fH9+fn5+fX5/fn9+f3+Af4CAgH+AgH9/f4OGiIiHh4eHh4aGhoaGhoaGjIyMjIyLiYyKiIeJhoyOjJCMjZGOjIyMi4uLi4uLi4uLi4qKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLioqKioqKiomJiYmJiYmJiImJiYmJiYmJiYmJiYmJiYmJiYmIiImJiYmJiYmJiYmJiYiIiIiIiYmCf3h7e3t6enx9fHx9f39+fn19fn9/f39/f4F/gIB/gICAgICAg4aIh4eHhoaGhoaGhoaGhoWMjIyMi4yOjoyKioeEiIuKjIuNjo+Li4uLi4uLi4uLi4uLioqKiomJiYmKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiomJiYmJiYiIiIiIiIiIiImJiYmJiYmJiYmJiIiIiIiIiYmIiIiIiIiIiIiIiIiIiIJ/eHp7enp6e3x8fX1+f35+fX1+f39/fn+AgICAf3+Af4CAgYCDhYiHh4aGhoaGhoaFhYWFhYyMjI2NjJCSjI2Ii4mJi4uLi4mLjIqMi4uLi4uLioqLi4qKiomJiYmJiYmJiYqKioqKioqKioqKioqKioqKioqKioqKiYqJioqJiYmJiYmIiIiIiIiIiIiIiImJiYmJiYmJiYmIiIiIiIiIiIiIiIiIiIiIiIiIiIiHgXx4e3x5enp8fHx9fX9/fn59fX9/f39+fn+Af4B/f3+Af4CAgIKEh4eGhoaGhYWFhYWFhYWFjIyNkY+PjZGJjIaJjIuIiImMiYeNjo+NioqKioqKioqKiomJiYmJiYmJiYmJioqKioqKioqKioqKioqJioqKioqKiYmJiYmJiYmJiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4WAenl9e3t7enx8fHx9f39+fn19f39/f35+f4B/gH9/f4B/gH+AgoSHhoaGhYWFhYWFhYWFhISLi46PjoyLj4iHiYmMjYWFjo2KiYyNi46KioqKiomJiYmJiYmJiYmJiYmJiYmJiYmKioqKioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHiIiIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHhoaHh4eHhH55eX16enp7fXt8fX5+f35+fX1/f39/fX5/f3+Af39/f39/f4CChIaFhoWFhYWFhYWFhISEhIuLjI6MjI2Lh4mIiomGgoiNjoiKi5GTj4uJiYmJiYmJiYmJiYmIiYmJiYmJiYmJiYmKioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIeHh4eHh4eIiIiIiIiIiIiIh4eHh4eHhoaGh4aGhoaGhoaGh4eDfXp5e3p5enx8e31+fn5/fn59fn9/fn9+fn+AgICAf35/f39/gIKEhoWFhYWFhYSEhISEhISEioqOjYmIiIqKh4iHiomIioiIh4qGi5GPiomJiYmJiYiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIiIiIiIiIiIiHh4iIh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGh4J8eXl6eXp7e3t7fX5+fn5+fn59gH9/f39/f4CAgH9/fn9/gICAgoSGhYWFhISEhISEhISEhISKi5CPiYmJi4qHh4WHiYuKiYSLjYmOjYqJiYmJiIiIiIiIiIiIiIiIiYmJiYmJiYmJiYmJiYmJiYmJiIiIiImJiYmJiYiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGgXt4enp4e3x7e3x+fn9+fn5+fX1/f39/f3+Af4B/f39/f3+Af4CChIaFhYSEhISEhISEhISEhI+Qj4+IiYuIhoeIiYuLjIuJioqNio6Oj4iJiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoaAe3h5eXh4enp8fX1+f35+fn59fn9/f39/gIB/gICAf39/gIB/gYKDhoiGiIaDhISEhIODg4ODkpKOioeKi4qLh4uNiYqJi4iHiouIio+SioiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWGhn96eXh4eHl5eXx9fn5/fn5/fn1+f35/f3+Af39/f4CAgH+AgH+BgoOHjo+PjoiHhIWFhoaFhYWSkI6KiYmIiImKioiIh4aKjIiHiYmOkJGNh4iIiIiIiIiIiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4eHh4eHh4eHh4aGh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYWFhYWGf3l4d3d3eXp5e3x9fn9+f35+fn5+f35+fn+Af4CAgICAf3+Af4GBg4eOjo6Ojo6Mjo2OjY2MjZCQjomHhoiJiYeIiouIiYyJiYaKjY6PkYuIiIiIiIeHh4eIiIiIiIiHh4eHh4iIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhYZ+eXd5d3d6eXl8e31/fn5/fn5+fn5+fn9+f39/fn+Af39/f39+gIGEiI6Ojo6Ojo6Ojo6Ojo2NkJGOi42JjIiIiYaHiYaIioiHi4yLjpCQiIeIiYmJiIeHh4iIiYmIh4eHh4iIiYiIiIiIh4iIiIiHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoWFhoaFhYaFhoWGhYSEhIWFhoaFhIWFhX55d3l2eHl4e3x7fn5+fn5+fn5+fn5+f39+f39+f39/f35/f3+AgYOGjY2Ojo6OjY6NjY6OjY2Qj42Ni46KhoiKhISLiYeDhYSDi4mLj42JjI6QkI+NjYyLjY6Pj42NjI2Nj4+Pjo6MjYyMjY2KiYiHiImHh4aHh4eHh4aGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoeHiYqKiIeJi4yNjo2LiImLi42OjYyJiImMgHl3d3Z6eXh7e3t9fn5+fn5+fn5+fn5/f39+fn5/f4B/f4B/f4CBg4aMjY2NjY2NjY2Qj4+Pj46NjI6KiYuMjIeFiY2Lh4aIh4aHh4uNjo6Pj4+Pjo+Pj4+Pj4+Pj4+Pj4+Ojo+Pj4+Pj4+Pj4+Oj46Oj46Mi4uJh4eHh4aIhoaGhoaGhoaGhoeLiYeHiIiLjY2Mi4yLjY2Ojo+Ojo6Pj46Ojo6Ojo6Ojo6Njo6NjY2AeHZ4eHp4enx6fH5+fn5+fn5+fn5+f39/fn59fn9/f39/gH9/gIGDhoyMjIyMjY+QkpOTk5KSjYyMjIqHioyKh4eJiYWCiouIiYWJjpCNjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjI2NjI2LiYaHh4eHiYqLjY6NjYyNjY6OjY2OjY2NjY2NjY2NjY2NjY2OjIyNj5COjY2MjIyLi313dXd5enp7e3p+fn5+fn5+f35+fn5/f39+fn1+f39/gICAf3+AgYOFj5KRkJGSk5OTk5OTkpKLi4uLiomMiouLiYuKhoeOjYiIjI6OjIuMjIyNj46Njo6Ojo2NjY2MjY2NjIyMjIyMjIyMjY2NjYyMjI2NjYyMjI2NjIyNjIyMi4yMi4yMjI2MjIyMjIyMjIyMjIyLi4uLi4yNjY6Sk5OSkpSRkJOVlZSTk5COjo6Oe3Z2d3h6ent7e31+fn5+fn5/fn5+fn5/f35+fn9/f39/gIB/f4CBgoSNkpKTkpOSkpOTkZKSkoqJioyJi4qJjIuKioiHiYqKi4mKjY2Mj46Nj5KUlJOUlJOTkpGSkI+Ojo2NjY2Pko+OkZGOjIuKioqLi4qKi5CPjoyMjIqKioqKioqKiouKioqKi4yLi4uMjIyKiouLi46RkpOTk5SUk5STk5SUlJOTk5KSkpKSk5F6dXZ2eHt7e3p6fX5+fn5+fn5+fn5+fX5/fn5+f35/f3+Af39/gIGChIuRkZGRkZKSkpGRkpGRiYmIiIqMiYiJiYuJhoSJhoyKh4ySkpKTk5OUlZWWlZWUk5OUlJSUk5SUlJSVlZWVlZWUlJOTkY+QkZKQjoyRlZWVk5KSjo+QjYqKi4qKi42OjY6RkpCRkpKSkpGRkpKSk5OTk5OTk5OTk5OTkpOSkpKSkpKSkpKSj3h1d3l6e3t7ent9fX19fn5/f35+fX5+fn5+f39/f39/f4B/f3+AgYKEi5GQkJCSkpKRkZGRkZGIiIiIi4uJg4eLi4yMiIeHjYyNkpSSkpOTlJWWlpaVlZSSkpOTlJSUlJWVlZaXlpaWlpWUk5SUlJSVlJSUk5OVlZWUk5KTk5OTkJGSkZGSk5OTk5KSkpOSkpKSkpKSkpKSkpKSk5OTk5SUk5OSkpOTkpKSkpGRkZGPdnJ3enp7e3t8fX59fX1+fn9+fn9+fn5+fn6Af39/f3+Af3+Af4CBgoSKkJCRkZGRkZCQkJCQkIeHh4eIiIiFi4+KjI6Njo+OkJWUk5OTk5SUlZWVlJSVk5KSk5KTlZSUlZaWlpaWlpaWlpSTk5OTk5OUlJOSk5SVlZSTkpKSkpOTk5OTk5OTk5KSkpKSkpKSkpGSkpGRkZGRkZKTlJSUlJSTkpGRkZGRkZGRkZGRkYx0c3d6ent7e3x9fX1+fX5+f35+fn5+fn5+fn9/f39/fn9/f39/f4GDhIqQkJGRkJCQj4+Pj4+Ph4iKi4yNjYuOj42Mjo6RkpGSk5OSkpKSk5SUlJKSk5OTk5OSkpOUk5OTk5WVlZWUlZWUk5OTk5KSk5OUk5KTlJSUk5KSkpKSk5OTkpKSkpKRkZKSkpKSkpKSkpKSkZKRkZGSkpOTlJSUk5OSkZGRkZGQkJCQkZCRinN0dnp8fHp7fXx9fX59f35/f35+fn9+f31+f39+fn59f39/gH+AgYKDipCQkZGQj5CPjo+Pjo+Oj4+Pj4+Pj4+PkI2OjpCRkpKSkpKRkpKTk5OTkpGSkpKRkZKSk5OSk5OSk5STk5OTlJOSk5OTk5OTk5OSk5OTkpKSkpKSkpKSkpGRkZGSkZCRkZGRkpKRkZGRkpGRkZGRkpKSkpKSkpKSkpKRkJCQkJCQkJCQkJGGc3V2e3x8e3x9fX1+fn1/f35/fn5/gH9+fX5/fX5/fn5/f3+Af3+BgYGKkI+PkI+Pj4+Pj4+Pj4+Oj46Oj4+Pj5CQiI2PkJGRkpKSkpOTk5OTkpKSk5KSkZGRkZKSk5KTkpGRkpKSkZKSkpKSkpKTk5KRkZKTkpGRkpKSkpKRkJCQkJGRkZGQkJGSkZGRkZGSkZGRkZGRkZGSkpKSkpKSkZCRkZCPj4+Pj4+Pj4+PkX9ydHh8fHx7fHx9fX5+fn9+fn5/f3+AgH99fn5+f39+f39/f4CAf4GBgYqPj4+Pjo6Ojo+Pj46Ojo6Ojo+PkI+Pj4+GjpCQkJCRkZGRkZGRkZGQkJCQkZGRkZGRkZGRkZGQkJCRkZCQkJGRkZGRkZGRkJCQkZGQkJGRkZGRkI+PkJCQkJGRkJCQkJCRkJCQkJCQkZCQkJCQkJCQkZCQkJCPj4+Pjo+Pj46Ojo+Pj4+PeHJ2eXx9fHp9fH19fn5+f35+f39/f4CAf39/f35/f35/f39/gIB/gYGAio6Ojo6NjY2Ojo6Ojo6NjY2Oj4+Pj4+PjoiQkZCPj4+QkJCQkJCQkI+PkJCQj4+Pj5CQkJCQkJCPj4+PkI+PkJCQkJCQj4+Oj4+QkI+PkJCQkJCPjo+QkJCPj4+Pj4+PkJCQkI+PkI+Qj4+PkI+PkJCQkI+OkI+Pj46OjoyMjY2NjIqDiYhzc3Z4fX58eX18fX1+fn5/fX5/fn9/gH9/f4B/f39/f4CAgH+AgH+BgYCJjY2Ojo6Ojo6OjY2OjoyNjY6Ojo6Ojo2NiJCRkI6Njo6Ojo6Ojo6Pjo6Ojo6Ojo6Pjo6Ojo6Ojo6OjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Pj46Oj4+Pj4+Pj4+Pjo+PjY2MjYyNjoyLi4mJiYiFhYSDgoKEgnR5fXp4dXJrZWltb2xmZmdncHNzd3l9fnl6e3x9fX5+fn59fn9/fn9/f39/gIB/gH+AgIGAgIB/f4CBgImNjY2NjY2MjYyMjIyMi4uLjYyMjIyMjIyGj5GRjIyMjIyMjIyMjIyMjIyMjIyNjY2MjIyMjYyMjY2MjIyNjY2NjYyMjI2MiomKi4uJh4KAh4iEgXt6gH57fXx8fXlzcnJycnV1cG1ramppZ2NkYV9bXF1eWFVXWFlTS0VJSkpLTE1PT0tgdHR3eX19eHp5e3x8fX5+fn1+f39+f35/f4CAgH+AgICBgYCAgICAgIGAf4OEhYSFiIuLjYyMjIuLi4yGiYqKioqKh4OOkJGNiouLi4uMiYmKioqKiouLi4eDi4qIiYmGhYWEhIeJiYWCg397fHl6e3pzcHFxcW1samdsbWdlZmVmZGNlZGVkZWVlZWRkZGNhYV5dXFpYWFdUUFFSU1JTTU1KSUZESEpHR0hHR0xOSWdzdXh5fXp4d3l8fHx8fn5+fn9/fn9/f35+f4CAgIB/gICBgICAgICBgYFnXmBjYWNucX17ent/fXd8fHZ4ent4eHpvcHt4eXt8e3h3e394dXd0dHZ1dHZ3dXFycW5wcnBnaGtsbm9tamlpaGhlZWRkZF9gYWJgYF5dWVhaWltdXV9gX2BfX19gYmFeXl5eWVldXF1bV1dWUlRSU1NOUUpISUZERUhMTEhGR0lLSklNbXJ0eHp7end3eXt6e3x+fn1+f39+f35/fn5+gIGAf3+AgIGAgICAgICCgWdYW1pZXFtcY1xaXF5ga3FtcHBvbm5vbmtpbmxrbG9qaWtraWpraWdmZ2dnaWhnbWdqZ2hlaGdiY2JhYmBgXVhbW1dYV1RWUVBUU1NNSkxLTExOTk9UWFhXVVVUUlBQTU1QT05LTE1QUU9MTEpHSUlHSEhJSEhIR0ZHSEpKSEhISUlISVZwc3V5ent5dnZ5enp7fH59fX5/f35/fn5+f3+AgX9+f4B/gICAgICAgIGBbFtYVlZWWVlaWVlYVVZoamxubmxra2poaGloZGVkYlxiZl9fYGNfXF9dYF1eWl5dWVleYmFeXlpZX1xYV1NOTUxLS0tMSUtNTktKS0tMSktQTEtLRkdHSUlGR0lISUZFSEdGRkVERUVEREVJSUlHSEdIRkZLTUtJSUlIR0hLTU1LTExMVXFzdnl6e3l2d3h3ent8fn1+fn9/f39+f3+AgIGAfn5/f4GAf4CAgIB/gYJoUlRVVlNVV1lZWVdXV1tbYWNfXlxbWFZWWVZSVFJRUVVUU1NTUE1KTU5QUk9NUFFRUVFSVlZSUFFUUFBOTk9MSk1MS0xKSktLRklJSkxJR0pISUlFR0dGRkVFSElKR0ZHRkZHR0hKR0dISEpMSkpLSUlISktLSkhKS0pISUtMTU9QUEtUdHR1eHp6eHZ2d3d6e3x+fX5+fn5/f35+fn+AgYB/f3+AgYB/gICAgH+AgmlQUlRXVVRWWVdYWFpbVFRTUlBRU1FRUU9OTlBQUU9MTlBPTk5NTEtNTk5QTU9QUFJRUE5OT09PTk9PUFFPTk5PTk5QTk1NS0lISEpJSUlJR0ZHR0dJSkhJSEhJSEhHSEdISElISUxLSklISkpJSkpIR0pMS0pJSUhKSktMTk1OTU9RTFVzcnN3enl3dnR2eHp7fX19fn5+fn9+fn5+gICBgICAf4GBgH+AgICAgICBbE9PTlRZVVVdW1lXV1hOTUpKSUZKT0xKSkdJSk1NS0pMTUpHSUlJSktMRkRGSktLS0hKTExMT01MTE5PT09NTk9MTk5OUFBPTE1MTk1MTEpJSEdJSElISElJS0xLS0pJS0pJSklJSUlJR0dKSUdJSUpKTk1OTEhJSklJSk1PT01LT1JOWXBwcnd4d3d0dHR3enx+fX5+fn5+fn5+fn9/gIGAgICAgYCAf39/gICAgIFvS0pNTlFOTlVXVlZSU0lFQ0VFUkREQT5CP0RAQD5CREFAQURHRkVIRUJBQEBDQ0RFQUNFSEtPS0lJSkhHSklKSUlLSkxQTk1MTU1MTU1NTElIREZGR0ZGRklKSUlLSkhMSklKSkpJSEhKS0tIRkdJSklLTU5OSktPTUxLTU1PT05QT1BgcG9yd3h2dHJzdXd6fX19fn5+fn9+fn1/gICAgICAf4CAgIB/f3+AgICAgXNQUE5OUE1KS1BSUE5RQ0RCQUVRRT1DPT9FSDk6Oz0/PTxBRkA+Ojw+PjxFRD0/RUE/QEFAREVHR0dHQkRERUZFR0dHR0pHSEpLR0NER0pHQ0RFQUFDR0hHSEdISktKSElMS0lISktLTU5MTUxMSkpMS0lLTU9PUFNRT1BQTk9QUlFNUGdwb3N2dXRycXR4eX19fX1+fn5+f4B+foCAgH9/gIB/f4CAgH+Af4B/gICCdlRVUVFQT0xNUFBOT09BQUFAQkE/Oz48Pj8/PDg5ODs7OkA6Oz48Ozs8PEhMPT1BQT9CQz1BRERGQkZGREdJSEM/QEBAQUFCQUE/Pjw9PkFAQD8+P0BFR0dHSUtMTk1OTUxNTUpLTVBVU05MTlFOTk1OTE1NTk9OTk1LS05OTk1OTkxUbnBwcnR0c3Fydnl5fX19fn1+fn5/gH5+gICAgICAgH9/gICAgH9/gH+BgIJ4UVFSVFJTUVNTUVFST0BAPT4/PD8+QEE/PT45Ozo6Ozg4Ojg3Ojw5Nzg7Oz49Ozs6ODpAQEFCP0E/Q0ZEQkNDPzs+PkBDQ0E/Pj9BPkBAQj9APD9CQEFDRUVFSktQT1BPTU1OTExMT1JRUFJOTExPTUtOT0xMTEtMS0tKS0tKTU1LS1xxcXF0c3VzcXR4eHp9fn1+fn5+f39/fn5/gIGAgH+Af4CAgICAf4CAf4CAgXxSTU9RUFFSUlRSU1NOPDs8Ozs8P0BBQkA9PDk8PTw5Nzk6Ojk4ODo6Nzg6OTo7Ozg3ODk7Ojg8Oz1AQUA9Ozs+PD09QEJDQT9BQkE9Pj09Oz0/Q0RCQD9BREJFR0pKSkpKTE1MTExNTExOVVNLTE1USVBKSU1KSUpLS0pJSEdKS0lKZnJxc3RzdXJydnl5e31+fn5+fX9+f39/f36AgICAf4B/gICAgIF/gYF/gYCBgFZMTlBQTlJRUFBRUU44PT88PDo9PkFAQT8+PkA/Pj07PDw+Pz08PTs6PD09PTw8PDw7PDo7PD49Pj8/QUA+P0E/QEBBQEBAPT8/PTw6Oz09PD9AQUJCQUBCREZGRkdGR0dISUtMTExLTEtKS0lKSk1MTEpMS0lISUxMSklJSElLR01tcHF1dXV1c3V4eXl8fX5+fn5+fn5/gH9+gIB/f39/gH+AgYCAgYCBgICBgYCCYUtPT05OT1BPT1BQTzo8Pjw9Oz8+PkFBPz0/QkNDQD48PT9APz89Oz49PkNFPz9APTs9PT08Ozo9PkFBPz5AQD9BPz89PD48PTs7PD0+QUA/QD5AQ0NEQkRFSEVFR0hISEdGSUpJSUlJSUhKSkpKTEtKSklJSEhKSktMS0lLSkpIVnBvcXNzdHR1eXp7e3x+f35+fn5+f39/f39/f3+Af4CAgICAf4GBgICAgIGBgIJtTFBRTk9QTk5PUFBPPjw8PT4/P0A+QEA/Pz9DRUQ/PTs8QD46Ozo6OTc6PDk9PUA9Ojw7Ozw7ODk7Pz49PD07PEA9PTw8Pjs9PD0+QUBCQUBAP0JEQ0RFRkZGQ0VHSElJSEhJS0tMTUpKSUpNTUpLSktJSEhISEpJSktKSk5MSUlfcHBycnJ0dXZ6e319fX5/fn5+fn5/f35/f36AgIB/gICAgICAgYGAgICAgIGAgnZNTk5NTk5MTE5QT0w+QTw8PT8+QkM/PkFBQUJBQD08PTs+PTo6Ojw6ODk4ODo7PT8/PDs7PDs6Ojs+Pz89PDg6Pjw9Pj89Oz4/QEJDQkJDQ0FCQkFCQkRCQkRCRENGSUdGRUhJSUtNSklKSktMSkpJSkVESUlGRkhISUpKTEpGRmdwb3FxdHZ2d3t8fH18fn59fX1+fn9/foB+fn+AgH+AgICAgICBgYCAgICAgICBek5JS0tMTExFSUxOTTw/PDw9PkBAQUE7QkNCQ0A/Pz9APT8/Pjw+QD89PT0/PT0+Q0Q/Ozw9PkA9PT5BQ0A8OTtBPz4+QT07P0JAQkNCQENDQUNBPT0+QD0/QUFBQENFRUBAQ0JDR0dFRENGRUZGR0VEQEFHR0ZDRkRHSEpHQz5IbHBwcHF0dXZ5fHx9fHx/fn1+fn5+fn5+f36Af3+AgICAgICAgIGAf4CAf4CBgIF+UUhLTU1NS0pLTE9RQD8+PkFBQEBBR0FDRENEQT9AQEA/PUA+PD0/P0BAQENAQD9AQD49PD1ARUFCQkZIQz08QERDQUE/Pj1AQT4+Pj88PkBER0VAPkBBP0BDRkVDQkJDQEJEREJERUFCPkFCQkFCQEA9QUJDRENDQUNFR0E/PVZwcHFwcnV1d3p8fHx8fX9+fX19fX1+fX5+fn9/foB/f4CAgICAgYCAgIB/gIGAgX5SSEtNTUxLS05OUlVEQkBDQ0FBQkBCQ0BAQUFAQUA+Oz48Pz08Oj49P0JCREA/P05hX0pAQ0VJSUlJTU1LRUNGR0hFR0VFRUREQ0E/QD4+QkZKSkdERUdGRkpOTktKSUdHSEtMSkdHQ0REREVEQUJCQ0BDREVEREVERUZDQkFFZW9wcXF0dnV4e3x6fHx+f319fX19fn59f4B/f39/f39+gIGBf4CBgICAgH+AgICAfVJJSUpKSEpKTE9SU0dGRUdIREdIREA+PDs+QERFRD88QUNEQj89QT9BREVEQ1d1homKflhHSEpMTE1PT0xIR0hHSElJSEhHR0hIRUNFRUVFRkhKSkZFR0lKTU9PTU1LSktKTU5LSUhHSElIR0ZFRkZGREZIR0VFSEhGSEdIRlFubnBxcnZ2eXt7e3p9fX5/fX19fX1+fn1/f39/fn5/gH+AgYGAgICAgICAf4GBgIB8UEhHSElGR0lKTU5OSkxJSUpLTE5KRkNBQkNGSUhJR0hISUdGQkRGRERDQVV0h4mHh4aIgldJTE1MTU5MSkdHR0dER0dHR0ZIRkhFQ0RERkVEREhIQ0NDRkpKS0xMTExMTElKS0pKSUlJSEpISEdISUhHR0hGRkZISklJSUlIXW9vcXJ0d3d6e3t6e359fn59fX19fX5+fYB/f39+fn+BgIGAgYCAgICAgIB/gICAgHxNR0ZIRkVGR0dKS0pMTUxLTU5NT0tJSEhKS0tLS0pLTUpLSEhGRkdGRVBshIeGhoaHh4eHfFBLTEtIR0ZGREVDQ0BBQ0NDQ0ZGRUJAPj5AQUFAQkQ/Pz9ERkdERUdJS0lJR0hJR0lJSkpJSEZKSkpKSUpJSkpKRklMTEpKS0tmb3Bzc3R2eHl7e3t8fH1/fn19fX19fn59f39/f35/f4CAgICAgYCAgIGAgICAgICAfU9GRkdGR0hHRUZHR01NTUtMS0lHQ0NDRElLS0tLS0tNTEtNTElGSlVsgYaFhISGhoaHiIaKdUlJRkI/P0A/Pz88PDw+Ojo8QUFAPjw5OTg8PD07Pjs5Oz9BQkFBQ0NDQEFCRURCQ0ZISUhISExNTEdJSk1NTk1KSktLSkxNU2xvcXRzc3d5e3t7fH19fn9+fX19fX1+fn5/foB/fn9/gICBgIGBgICAgYCAgIB/f39+UUZFRkdJSUdEQ0VGTk1MSklIRT85Oj5ARUhHSUhLTE9OTlFOUV5ygYWEhIWFhoeHiIiJiYyOZkJCPTg4Ojo5ODc4ODk2NDc5Ozw6ODU2Nzc4OTc4NzY4OTs8PD5BOzk5OT09Pjs7PUFERUhKTUxMR0lIT1JRUFBOTE1NT1Fdb3BydHN1eHp7e3x8fn5+f359fX59fX5+f39/gH9/f4CAgICAgYCAgICAgICAgIB/f39RR0ZHSEpIRkVGR0hMTEpJSUdDQjU2OjxDQEJGSEtITEtOVGd7hISDgoOEhomKi4uLiomKi4yJVDs4NjU2NzY2NjQ1NzYzNDY4Ojg3NjU2NTY3Nzc3ODo3Nzg4Ojs3Njg4OTg5ODc2OjxAR0ZJRklGRUZPU1JTU1JPUFBSVGVwcXN0dHd5e3x7fH1+f35/fn19fX19f39/f3+Afn+AgICAgICBgICAgICAgICAgH9/flJISEhJS0lHSUpJSkpLREVIREJANTc4OD06PERCREZGRFZ4hISCgoODhYmKiomJioqKiouJioqBSDY3NjQ2ODg3NDU3ODQ2Nzc5OTc3Njc2NTo6Ozo6PDg5OTk5ODc3Ojo6ODg3ODU4OTtBPT4+QkE/QUtMT1FQUU9PUFFXa3FydHR1d3p7e3t9fX5/fn9+fX19fX5/f4B+fn9/f4CAgH9/gICAgICAgH+AgICAf39+VEhHSUlMTUtKS0tMSUg/QEE/PDo1Nzk4OTc6QTk8RD9QfYSDg4SEhIaJioqIh4iIiIqKjIqJiY16Pjo4ODs8PT45Ojs8ODk7OTo7Ojo5Ozo6Pj09Pzs7Oz06Pjw6PDs8PD07Ojo8ODo6Ozo5OTk8Pzw9QUJESUpMS0pLTFdvcnN1dHZ4e3t7fHt9f39+f359fX19fn9/f35/f39/f3+Bf4CAgICAgICAf4CAgH+Af35URkVGSUxOTkxKSk1CPzs7PDo4OTk4OTk5OTo+PT8/Q3aEg4SFhYaIiYiHhoaGiImIiYuMi4mKioxsPDs+QkNFRUJBQUI+QENBQD89Pj5APz8/QD9APT0/Qj9BQT9BPz1BQUA/P0E8Pjw7Ojs6OTs/PTo7PT1BQUNBQkNBWHBxdHR0dnl7e3x9e31/fn9/fn19fX5+f35+fn9+f4B/f4CAgIB/gIGAf39/gICAf39/flJFQ0FHSk5PTElHSzo4OTs5Ojo8PDo6Ojw7PT5APz1hhYOEhIWFhomJiIeGhoaHiImKi4uKioqLiYtePkRHSUtKSkZHR0RGSEdFQ0BAQ0VDQ0FCQ0I/QERIRUNFREVFQUZFRkRGRkRAQj49QD49P0A+Pj4/Pj8+Pjo7PTxgcXJ0dHV3enp6fX19fn5+f39+fX19fX5/fn5+fn5/gH9/gICAgICAgICAf4CAgIB/f4B+UERAPUNIT01HRkJEOTc5PTo8Oz49Pj47Pjw/P0M+Sn6DhIWGhoaIiYiIh4aGhoeJioqLjI2MjIuKiodXR0xMTUtOSUlLSElKSklFQ0RGR0ZEQ0ZHRUJISUtHSEdGR0dFS0pMSUpLSkNGQ0NEQkFBQ0JEQ0NERENBPTs9QGhwc3R0dnd6eHt8fH19fn5/f359fX1+fn9+fn59fn+Af3+AgH9/gICAgICAgICAf3+AgH9PQT49P0RMS0BCQkE5Nzs+Ozw6PT8+Pzw/PkJBRT9ohIKFhYeHiIiJiIiHhoaGiIiIiYqMjYyMi4uKjH9QTVBNS05LSkxJSUpIS0ZER0hISUVFSUdGRUxMTUlKR0dISUpOTU9NTE5LSEZHR0VFQ0ZGRkZERUhIRkNBP0BMbXB0dXZ4eXl5fHx8fX1+fn9/fn19fX1/f35+fn5+f39/f39/f3+AgICAgIB/gICAgICAf1FBPz4/RkdHPTxAQDg3PDo7PDo9Pzw9PT9AQ0JIU36DhISFhoeHiIiIiIiIh4eIiIiJioyNjIyMjIuKjXFNUU9NTExMTElISEZKSURKSEdLSklKSEhHS0xOTExISElKTVBOT05NT0tJR0lKSElESUhIRkZHR0lGQ0JBQ1VvcXV3eHl7eHl6enx8fX5+f39+fn1+fX5+fn5/f36Af39/f3+Af4CAgICAgICAgICAf39/VERBQUJHR0I/OD9AODo7Nzw9Ojw/PD09QEJDRExthIOEhIWFhoeIiIiIiIeGiIiIiIiJjIyLjIyMi4uLi15SUlBNTk1LSkdGQ0hKR0xKR0tPTEtLSkxNTE9QTkhJS0xPUVFQUU9PSklKSk1LTEZHSEdGR0lGRUVCQEJCXHByd3h5enl5eXt6e3x+fn5/fn59fX19fn9+fn9+f4CAgIB/f39/gICAgICAgICAgIB+f39VRUNFRUdHRUQ7P0E7PTw4Pz09PkBFRD5DRENGSnWGg4ODhISGiIiIiIiIh4eIiIiIiIqLi4uMjIyMi4uNfFdWUlJUUk9MS0tFRkZLT05PV1ZRUE9SU1JNU1RPTVNMUFNVV1JTUlBMSk1NTUxOR0dKRkZISkRERUVCRENjcXV5eXp6ent6e3p6fH59fX9+fX19fXx9fn5/gH9/gICAf39/f3+BgYCAf39/gIB/f39/f1VGRkdHR0dIRj5AQj0/PTxBP0FBRFRLQkhJRklMeYaDhYWEhYeIiIiIiIiIiIiIiIiJiouKioyMjIyOi4uLZ1ZWa2FFUlFRUEs7OlFTUmB1XVVWVFZZWVJYWFJaZlBVV1pdUlRXUVBOUlBQUVFLS0tHSEpIRUZJSUlISWpzdnl5enl6e3t8ent8fXx9f359fX19fX1+f39/f3+AgIB/f39/f4CAgIB/f3+AgH9/f35+VEhKSUlHRkZFPz9BQEVBQ0ZEQ0RLVlBKUFBOT1B5hoWHhoWGh4iIiIiIiIiIiIiIiImIlJyMioqMfWGKi4uHbFtkVTpYWFhTUT5AVlVZXGRgVllicl5dVl1aVkVRWVpcWV9UWWdSVVZYVFRWU09PTUtMSklJTE1LT01UcHR2eHl4d3l5ent6e3x9fH5/fn1+fX19fn1/f39+f4CAgH9/f3+AgICAgH9/gH+Afn9+fn5WSkpJSEdGRERCQT9ITElNUEtJSk9TUlFUVlVWVHWFhIWFhYWGh4iHiIiIiIiIiIiIiImcnaCPiY5nO36MiYqLem5wWFpbWlJTUlZWVFpadYNZVX2QYVxYXV5XSVZeXltbX1lIWVhZXF1YWFlXUlFNUFFNTU9TUVFVUmJ0c3Z3d3Z4eHh6e3t8fX19f39+fX59fX1+fn9/gH9/gIB/f3+Af3+AgICAf39/gIB/gHh5fVlOS0pJSUZCREBBOk9RUVdYUFBQUVJTUlZXV1dXbIGCg4WEhYaHh4eHh4iIiIiIiIiIiJaanJeIioFuhomIh4OKfmZZWVxZU1ZUV1JRV1ZjloBRZXJYWldfaFBgZlpaWFxoYkdPWmlnXFtcXV1XU05TUFBRVlZWVllab3N0d3Z2dHd4eHt7fH19fX5/fn59fn18fn9/f3+Af39/gH+AgH9/gICBgYB/gH1yfX9/b3R8XVNQT01LSkVDP0A7UFBaWlpSU1FPUVJRVVJVU1ZedXiAhYSEhYaGhoaHh4eHiIiIh4eIh4ORjomJiIaFiIiGfYB7XFBWWFRSVFJRUUxPTUtmeVpdVFlVVl1aTFRaVVNUXlpZV1dXemtYWlxcXlNQUE9JTk9XVlhaWmVxdHd2dHR2eHl5e3t8fX19fn99fn1+fX1+f39/f4CAf3+Afn56eHd2c3V7f3+AgHRrfn5rcnleW1ZVU1JPS0ZDREFNXoNsVlJTT09RT1FWUVNSUlRjZHaAg4KDhISEhIWFhISDhoaGhoeIhn6JiYiHhoOHh4d5bXFWSUtOTktNS0hKREZIRUM+U2NVf1JRUU5LUlVSTU9ZUk5PUVNVVU1RU1JQTkxLSENJR1JTVFldbXJ2d3V0dHd7enp7e317fX19fn19fX59fn9/f39/gH99fX5+f39/gIB+e3Zzd31+fmR1fWlxdGBkXV1bWVVRTEhMSWFsknRQUVNNUVJQU1tSU1JRUlVVYnN7fH6AgYKBgX99e3uAf4OChYaHgoaGhoGEgYaFhnVfXUtDPkJCQ0NBP0RQQ0NAQz5CSEdWQEhOTUddaVFIRk9GRUZGSEdIQkNIR0hKR0RBQUNATlBNUmR0dXZ1dHR2eXx7ent7fH19fHt+fX19fn5/f3+AgIB/f3x8fX+Af39/f4CBgH12dHt/bWh8Z25xZmllZGJcWFNRUFVSc1dlW09PTkxRUlBVWVNVUVFUUk9WYGtsc3Z6e3h5dHJuc3RzeXh+foOAg4OCgIKAgoGBa0xHPj46Oj5APz4+PmpQS2FFRkhJRUI/R0xNR01RVUpCRT8/PT08PT0/PT9BQ0I/Pjw9Qj5JTUZVb3V1dnN0dnh7fHp8e3x9fX19fH59fXx+fn9/f4B/f39/enl3eHd2dnh7foB+fXt4dnx1YXhnbHBqbGppZmBbUVFaXFleSUpPUE5LTFFSUVRWVVdRUVdWUFhbYl1hZ21tbG5qaGBucmltbHF1e3p9e3h6fHx4d3hkQkBAQTw6QkNBQUNBW1xPe05PT05LTE1PT1BMS0xXTklHQUE8OTc3NTk5PTs7Ozg5ODk/O0FHPlx0dXV2dXZ3eXx8fH18fH18fn18fX19fX9/f39/fn9/f314dXd6e3p3eXh1d3t8eXh1eXdjcWhpcG1ubW1oZl5PT15cWklHT1FRT01QUU5RUlRWWFNSWVROWVpbV1lcX15fZV9dXnF3a15gZ2t3b29sam9tbmxmYllHRkZIQkFGSEVFRkNMUU9hV1JYUVBTU1JVW09PUVZQTUlERj45OTY1ODY5Nzk6MzY1Nzk1PEI9ZnR1d3h3enl7fX18fHt8fX1+fnt9fn19f39/fn5+fn9/e3d1eX18enh8fHx8dHd2d3Z1d2tuaWhxbm9vb2prYFVXXlpXTUtTVFNQUVVPTFJTVFdYU1RYUUxYWVlWWFhWWFldV1hYaHNrXVZgdGthYV9dZGBfXllVUE1PTkxJR0pLSUhFQ1BPU1pXVFROUVNZU1xlVU9TVFFOS0lIQz9BOTk4ODk3ODg0NzU3ODU5OUducnV5eXp7e319fX18e319fX5+en1+fH1/f359fn59f358dHR1e3hycW9vbnR4cXJzeHZ1cWZkZ3JucHBxbm1kXV9fWVdPUFdWVlNUVk9PVVZXWFlTVVRMS1NVVVVVV1BUVVdUVVJdbl5STllgW1ZZO0RVV1NbZkpMUFJST01NTk1NTEpFUFBVWVNUT0pOT1VTU1xWUlVTUk5NTElISEY/Pz06Nzg3NjU5OTY3NjY1WHFxdHh6ent8fX19fnx8fXx+fX15fX18fn5+fXx8fX1+fXxydnF4eHJ1dXFxbnBwb3B1dnRuamRkanBwcXJwbmZlZGNcXlJUWlZXVFNWVFJYV1lZWVJVT0lHT1BPT01SSk9QT09OTk9UTE1JUFBTVFUyPFhNSUBRPWNgUVNRUE1QUE9OTUxQTlRSUFJMSUxLT1JQUVJSVFFST0xNS0xMSENCQT06OTg3NjtCNDU2NjtlcHJ2eHl7fHx9fnx9fH19fX18e3h8ent9fX58e3l9fH18e3B1b3d1cHV0b3N2cHFxcHV1dmNqZ2VXaHRycnFuaWlocFZWVFVYVVZVUldWVVpZWFdWUVNGRkFGR0dIRkpESEpIR0VITEhLSUdMTVBNRy9FX1I+NEA+am9hUlJRQEdUUE9QT1FOUU9QT0xKTExPUE5NUFFRTlFPSkxNTUtHRUVDQjs9PTw5PUc2Njc2RW5xdXd6e3t8fX18enx8fX5+fXt5dnh3eXl8fXp6dn17fHp6b3Fud3JwdnFtcHNwb3Bzc3N0ZmdgaFpXa3JzcmxtbWtuYmVQU1RSU1VPV1ZVWVlWUVFRT0A+Oz0/QEJBQz9CRURBQEdIR0hGRkhKTUxER0NPUkM4RU1TXWdTUVNBR1VPT1FQUE1NTkxKTEtMTk9PUUxPTk1JTEtJS0tMS0dGRkVEPEFBPjtARTs8ODlUcnN1eXt7e3x8fHt5fHp6fn58e3V0dXJ2dnp6eHpyfHt8eXltcW94cnF1bm5xcm9vb3Rzc3J1dGtnZ15lam1wa29xbWltY0xPTk1RU0xUVVRXV1VMTEtIPTk4Nzs/QT88PUFAQj09RUhGREZGSUdKSkBGQUFARkdESU9IUVJhXFFQUk9TT09PTE1PTUtNTE1PTltWS01RT0dJSENJS0xMS0ZGRkU/QkQ+PUJHP0I/QGRydXd7ent7fHt6end8d3l+fnt7cXN0cHJzd3R4eHN6e3l2d2xxb3ZxdHRsb3Fybm5vc3ZydHNycmtsZW5zaG1ubWxtbGprSUxISE9RSlFTUVRTT0tIQ0U9OTg3OT9CPzs+QUBAPkFFSkVDSEdJR0lFQkI/PjxCQUBHSkVNT2JlUE1PTVZLTE5LTE1NTExLTk5TZE1KTFJJSUlGQkpLTE1OSkdJRkJCQkA/RUZFSERMb3B2enl5ent6fHp3c3h0eHx8eXpucXFtbm9ycnZyc3h8eHZ2bXBtc3B1dGxwcHJvb29ydnVyVlZucWdseYRqbXFybm5qaG9ISkNHTExJTVBNUE9IS0U/Qj05OTo6P0I/PEFCQUFERUdLRkRJSUdHSENDP0I+P0BBPUNFRExNUVRMSklNVEZJSUpMSUpLSUlMTU9QUlBLR0NLSENDS0pMTk9OSUpJR0RDQ0RJSk1MSVpzbnh5eHp6e3l8dnJwdXJ0eXl2eGpxb2tsbG50dG1zdntzdHhyb25xb3ZzbnBvcnBvcHN0eWpOYGdzanR8eWdvc3FqcWhlcUhLQ0ZHSEdKS0lKTERHQjw+PTo6OjtBQj89QkJDQ0hFSkxKRUlJRkdIQ0M7QUBCPkA/QkRESU1PR0hKR0hLREhJS01ISkxISUpMSk1dUkhJRE5HQkVMS05OUE5LTUpLRkdHSk1OUk5NY25qd3Z3e3l7en1xbWxza3B0dHR1aHBtamlra3RwbnR0eXByenRvcnFvd3NvcXB0cnBydXR5a05WbXVscXt2aW5vaWt0aGVwRkpDRkVGREVFRkVHQ0NAPTw9Ojs6O0FEQD9CQ0VFSUZKSkxGSUlHRkZEQjpBQ0M+P0NDQ0VHS01ISk5IREhFSUxOTUhJTEdGRklJTE5LSUhFT0lDR05NT01QTk5PTUtJSElPU1FSTlNnZ2Zyb3N4dnt6fGxoam9la3Btc3FnbmxoaWtsdG1vdXR3cW94dG90c3J2c3BxcnRzcnR1dXZ2WFZ1dWtvdHJrb3ZsaG1mX3BHSkNFRURCQkFFQERCPj8+Ozs7Pjs9P0NCP0FDRkdKR0pJTEhHR0dGRUM/PURFQj5BQ0JDRUdISUdNUElFRkdLTk9LRkhJRkVDRElJSEtJR0hQS0RKTkxQTk9OT1BPSkpJTVJVVVJPWGVhYW1mcHJvcnl6Z2VoaGNpbGZxbGZsbWdpa2xzbXB3dXRwbnZyb3Nyc3V0cXNzdXRzdXZ2dnl2dXR2bGt1dW1ydnFsbmxlck1HRUVGQkFAQUQ8QkE+QT06Oj0/Oz4/QUI/QEJFR0pGSkdJR0ZGRkRDQkFBRUZDQkJCREVFR0dIRkxQTEhOSkpMS0lGSEVGRUNDSEhIS0pHS1JOQ09PTlFQT09OT1BLS0tQVVdWVVRZYF9daWFuaW5ocnNiZWZmZGhoZm5pZm1taGtrbXJpcXZ1c3Ftdm5vcXJzd3Nyc3R1dnZ2dnd2d3Z2dHd1a3N1bnV0c3Fza2tzTUdHRUdBQkBERTxBQUBDPDg6PT46QD1AQ0BAQURGSUVIRkZIRkVFRENFQkRJRkNHRUFFR0VGRkdFSU1LSFFNSktISElFRkhIRUNJSUlLTUtQU05EUlNSUVNOUE1PUE1MTlNXVlhZV1leW11kYGljamlna19kZWZjaGdna2dna21rbWxwcWd0dHVyc252b3FwcnR4cXNzdXZ1gpF5dnZ0eHV1d3hub3VvcnN1cXFpcHpNR0dHSEJCQkVFPEBDQkQ8Nzo+Pjs+O0BCPj8/Q0VHREZEREdFQ0VDREZGRkpFRUlHQkdIRkdGRUNGSkpHTUpMS0hKS0ZJSEpIRUtLTExOT1JUT0hUVVRRVFBSTU5ST01RV1pWWllXW15aWGFgYGBeaGVjYGRlZ2dqaGhqZ2hubGxvbXFwaXV1eHJycHVwcHBydXZwdXN1dnV7fn14dnR3dnZ2d3BsdXBtc3Vub3NzeU1ISEdJREJDSEU9QEVCRD04Oj4+PTw8QkI9QD5BQkZDRUNDR0NDRERGR0dHSUZIS0hDSUhHSUdGREhLSUdKSE1LSktMSEtKTUtJTkxPTk9SVVZPTFZWVFFUUlJMT1FQT1RaWllcWlpdYF9dX2NfXGJkbGNgZGdocoVoZ2pmam5ucG9uc3FqdHV4cnNzdHJucHF2cnF1cnV1c355jn11dXZ2dnZ4cml1cWtydGxxd3F1TElKSEpGQkRHRT1BR0REQDo8PkA/Pj9DQjxAPkFBRkNFRERHREVERkZISEZIR0lLSkVKSEhLSEVGTEhISEpHTEtMTExJTUpNTk1PTFBQUlVWV09LVlZVU1NSUUxPUlJRVltbXV5bXV5gX2FgYmZdZGBmaGBlaWpkc3NmamhnbHBycW9zc25zd3dwdXZ0c21vcnVvcnNwdXJ2cnSBdnV1dXd2dXdzZ3Rya3Fya3J3cHdKSktJS0dCRURFPEFGRERCOz8/QUBAQURBQEI+QUNIQkVERkdFSERGRUlIRklISk1ISEpKSUxKRUpLSElKSkdLSkxMSUlNS01OTk9MT1FSVVdWTU5UVlVTUlFQTU5UU1JXW15eX11eYGBhYWJgZGRlYmRpYmRpamd2i2xraWdtb3NxcHFwcHJ5d3J1dXRzbW1zc21xcm90dXVzcHN3dHV1d3Z1dXVmcXNrcHFqcnZwd0pMTEtMR0NDQUU8QEVFREM9QUFDQkJDRUFDREFBRUdDR0dIRkVJRUNHSUdHSkZJTEhJSk1LTUxGS0lIS0tOUUtSUExSTEpNTU5QUFBVT1dYWFtOU1FXXFpTVlBOVFVUVFhaX2JiX2RhXmFjX2FmY2FiaG5oYmloaG14dm1oaW5vc3JwcXJycnZ0c3Vzc3Nua3NxbXByb3R2c3FxdXZ1c3d5d3V0dWNtdGtvcGpxdHF3TE1LTExHREFARD4+REVGQz9DQUVEREZDQkVHQ0JIRkJISUlHSEpGREtKR0hKSElLR0pKTktOTElMSEtMSlpmSmRbSmxSR05NX25VbHNbcXBid2NSUGJ2dWh1Y2F2YVhucWJkdmltemZcbHRgbGtWYHd2aWpnaGZnbG1qbW9qbW9zcnBycnFyc3Jzc3J0cm5sdG9ucHFxdXVycXN0dnZ1dXl3dXR0YGt0a3Bwa3FzcnlMTkpKSkZCP0BDPzxEREZEQ0NDRUVERkJFRkdEREpFRUlLS0lLTEdHTkpISktHS0pJSkpOTE1NTExJTU1MW3NiZG9dbGxVTE5lcl1nZXFsbnRncGlfYVlubWJwcGJrampnb3F0ZXRub1xwdmdwT0xyeXZrYWFrZWVseG1rdmxub3NycHJxcHFycXJycnRybW1zbm5vcHJ1dHFzc3R1dXV0d3l2dHRibXVrcHBscnJye0tMSUhHRUQ/QUE/PUJFRkJFQ0VERUVEQkhIR0RES0hHS01NSkxMRkpOSEpLSklLSkpJSk1NTk1NTUtOTU1bcnBvbnBwa2pMT1BtWE5pYnRycGFtb3ZcWWxQW21tWnFta3BseHh0c2lwXWBzbHFrVXV5eG9jXmtmYmdwcGppb3Bwc3NwcXBxcXJycXFycnRsbXJtbW5vcnV0cXRydHV1dHV1enZ1dGVudWtwb2xzcnJ5SktHR0VFREJBQj0/P0VHQkdESEVFREJGSUhIRUdLSkdNTE5KTE1HTE5JTUtISU1JSklKSk5PTk5NTE5NTFxoZHVdbHFWa01PUW5VWmtea2x2YWxkdFRlY05sWWxcdG9samx4and1aG9dYHNraFdiY3d8b2NgZ2hhY2l0eWtubnFzc3BxcHFwcnFwcHBydWttcW1tbW9xc3Ryc3J0dnZzd3Z6dnV0aG91bHNvbXNydHZJTUZJRUVEQ0FCPEJAQkZDR0ZLR0VDQ0hKSEhGSUxLRk1LS1JSTEhNTUlOSklHTUdKSkhJTk9NTkxKTU1KWnRwcG9xcWxqT1FSbllza2dvb3Fxb210Xm5YYXRfbm9wb3Fzb291c3R0altedGN3eHJqbnpoYWFjZmFiam10dXBzdHZzcXBwcW9ydHt/fn13bGtxbmxtbnByc3F0dHN1dXR4eHl5dHVrb3VtdXBuc3N2dElLSEpDRERFQEA9Q0NBRkNISU1IRkNGSkxJR0ZKTUxGT0pKV1JLR0tKSk5JSElLSUtKSUlLTE1NTElLS0pTa2JZaV5eaWJyclpfWWpvX2VlVWtfY1thYVFgbWhcalxuaWpkW29lZHBcWlxrW21xY3BzbGRnY2RnYGBrbXBwb3R5cnVxb3BxbnmFiIeHhoWAdnNua21tb25xcnR0cnR1dXZ5eHhzdW5xdW53cXJ1dHdySEhGSkRFQ0ZBQEFFRENGQkhKTEdGQ0ZLTElFRkpPTElPSkxbUUpGSEhLTUlISklLS0lISUdLS0tLR0hKSUtLTEpJSkxNU1tdVFBVTVFPTk9PVlFPUFFOT1FKSk5QUWRxaVRZVltbXFVZW11YXVxcY2ZhYWZiY2ZfXmZrbWhtdHhydHJvcHB0hoeGhoaFhYaHg3pwbW1sa3FzdHRydHZ0dXl5eHV2cXJ1b3ZydHN1dXNIQ0VHRkZARUM/Q0dERkdDSUtMR0ZER0pMSERHSVBLTE9LTFdNSUZFR0lKSElKSExKSUdISEpISEhFRUtISEpOS0hPXFZdT11cYF5PWFlTXFxiXk1ZWk1YYVJLWWFaU2BkXGFYW2RkVlZYXFlaWFxWWVxeY19kYGFfZWhrZ210dHFxdHBxcoGGhoaFhoWFhYaGhoR9cmtpb3Jzc3N0d3l5eHl4d3h0cXhyeHNxcnVydFBCQ0RMTUFDQ0JESUVHR0ZLSktHRUVKSkpGRUhIUEpMTUpNUklIRUFIRkpJS0tJTEpJR0ZKSEVGR0VFSkZCSUxJSlRfWV9YYGFbYFVYWlRdXlpfUllcUF5cWU5fXF5TW15kXlpdYGNfWV9iW2BeW1VZWVpfXmNjYmFjZWlla3Jwb3Bwbm93hoaFhYaCe4CFhYaGhYaFf3VxcHJyc3V5enp5eXh4eHdyeXZ4cnF4dnR2YVNKSk1JRENBQ0ZHRUdHSUpKSUlERktLS0VGSUlOSk5MSExOR0hGPkhHTElLS0pLS0lHRUlGRERFQkZKRD9JS0hOWmJZXl5hX1JUU1dfX1xdWV5RWVxNVl9XS1FZW1FbX2JhXV5jYWBiYWJjY2VaUlpXV11aXWRgX19jZWJob21tbGxsbHWFf4SDeXV8hIWFhYaGhYWGhoN9d3JydHd5eXl5f359eXV5dnZybnp3dnhZUUpGQ0dFQkRISEZHSElGR0pHSEZIS0lLRERKSk1NTExISkpISUdAR0ZOSktLTUtLS0lHSUVFQERBSElBPkhJRk9dYFpbZF1fVFFSWF1cXFxfW0tXXExSXFlJTV5RUV1fYmNjY2NiXGRiYWRjZlhSV1VUXFhbYV9eX2FhX2Rsa21qa2xudn51gXp8hIWFhYWFhYaGhoaFhYaGgnpyc3V1e4WHh4eGhYSBfnhwend2eFxSTUJASUZDRUtJRkdHSUdHSkZGRklMSk5FQ0pKTE5KTElLS0lJR0NISFFNS0tPTUtLSUhIRkVARUJISEFARkVDU11ZXlhfWF9bXVVYWFBdXFFLSlZeWF5bXVZaYVJSX19iYmBgYmJfY2JhZGRhWFBSUlNcU1xdXV5eX19fZGlnbGtubnB7e3x+e4CCg4SFhYWFhYWEhIWDhIWHh4FzcneFh4eHh4eHh4eHh4WDgHx4XFNLQkFHRkRHTVJIRFJLRkhISERGS0lNUEVHSUpLTkxMSkxMSklHREhLUU9NTFBNTUtMSUpERUFFQ0hGQUFGQ0FVVUVcVF5TVmBYTlRVTVlaTEpLVGBhW19YX15iXU9ZYlxgYF5iY2FdYmFXYF9VUVBRUllTXlxbXV1eYGJmZmZsZm9vd3x7gHt9f4CEhISEhIWFhYODhYKDgoWFhnpvgYaGhoeHiIeGhoaFhYSFg35JTkZERkZHRElTY1FFV19JR0dIREZNSlBQRklJSktOTExLTUxKSkdFSk5RUU5OUE1OTE5JTEJFQUNDRkNCQENEP0xHQ0xMT09PTUZNRkZISUdGTEtNT1BJTE9QUFNQTFFUU1VZWFdZV1djVk5SVFBRUE9RVlRcWVlbXVxhYWVmZGhkbG1xc3N6eX97en+EhISEhISEhIKEgH57gYOBfXuFhIaGh4eHhYWFhISEgoGAfUtJRUVHRkdES05eTUhIWU1HSEpIR01MUVFJS0pLS05NVU5PS0tMR0dLUFNTTlBQTk9PT0lMRmFFRF5MRGZiQ0xaR15cc21PTFZuWUtDT19Ua1ZnSV1XVV5ETFFVTE1TVlFTVFhWVFhUVFxUT2VaaGhlWlVrVFhXVVtcW2BgYWJiY2FnaWdubGhyen19foGDhISEg4ODgX19enJ7gXp7f4KAg4SEhYWBhIWBg4N/fnp7TElFRkZIRUVMUFRKS0dgVEhKT0pJT01SUUtNS0xPUlVST1BKTE5HSU1RW1lPUFBOUFFQSktRf1FJfFlZcnNXUG1HcW5vYVZRcXF0T0Jqc25xc3BTb19bblhdVlxYVWtoVV1WY1lgWVpeVVVXf2l0dXVgYXZfWWJcXGZbX2FhYWJfYWNnbW9tYHB3dHiBgYKDg4J/fX6Adnh6bXZ+dHh9gHx+gIGChHyAg3p/gX9+d3dOSUVITU1CRExMR0pMRlJWTEtPSExSWFdRTk9PTVFUTk9RUExMT0hOUFNbWlRRUk9QUFFMSVp4XVR4ZGhYUlNQdmZ0bHBibmZrUnJOTHdtanJwc3JxcnBvb4BdZXp1eHFxenF+cn1rdX1hUmh8ZXNzcHNzfH1wfnhvf3JgYGBiYltiYWhsbmtibGZnbXd+gYCDfnt4d4B0dnppcX5udHx+d3h7foCDeHyBdXx/fHxzc05LRmBdR0FETU1IS0tIS1BPTU5KTlZeWVVMUVNOWVlMU1NTTkxQSVJSVFlXV1FUUFBQUkxIZ3hsY3hxbVpKS1R5cHVtdWJudlBkZEhldnFtd2+AamZ4eGlXclFoem1panp6fWx4en9waG5YdXVqdnVxgWFzaH1pbHh8b19fX2NiXF9kZWdqamVnYmNkbGxwcHN0c3NzeXFyeGJtdGdyeXtzc3V5foFzdnpufH15eHJuTUpSdE5DQkVQUUhLTEpMUU9PT01QWWBaWEtUV1BhXlJWUVlTTVBKU1RWWFdXUFVQT05SSkxyb3V1cXVxY2hgVm5LcXBeR2h5V3ZUS2h4fXdgeXtzbWBdbW9kU2dydW5teXB3a3VzdHFsbVxzfnprbXl8bHVufGtxd3V4Xl9fYl9eYGVkaWdoZmVeYmJpaWlqa25va3FubWpwYWNmZG93eG9tcHN5f25xcGp7enRyb21LS1pWSEdFR1JRSk1OTExRUVBQUFFXXFlVTlZZVWZYUlJZXlRNTkpUVFdXWVdPU09PTlFJUm1IaXdLYGR2dlRWbE5ubHtyYWpnf3VUS1ZrZ3xsbWx3XlpwentfYHpzY3JveHFnY3xpcntdVEtsX3Z1bGp2fHtuf3lsfHBdXl5iW19jZWVnZmVlY1tjY2lra3JzcndnbWloZGdgYWxhZ3Nya2dsbXJ8a21oa3t0bW1rbU9HSktISkhIUlFNT1BMTFNTUk9TUlhSV1RQV1pWVlRUVGFgUU9OS1RTU1FWVk9PTU5PUUtIUU5QVUxLS1JTUlFST1ZVUVFPUlJYWFBNT1VUV1hYWlpUUVJXW1dXV1tPUlRXV1hRXVhWXFVUT1hSV1hYWVpgXGhzX1xbWVxdX2NaX2RkZWdkZGNiWmRiZ2ZmbW5tdWZmZ2NgZl5dZ2BkbGdlZ2tocHpoZ2drdWpoaGlsUElLS0xNS0pUUk5SUVBMVlVUUFRVWFVaVlJbXVZVVFdVWVhPT0xOV1RQTlVTTlBOTFFQS0lRUUtRTUpKT1FUUVBRU1JKSE1PUFFRUFBQU1VSWFdcV1JSUFFVVVZTWlFOUlJXVFNYVVNYVFNRVVRVVllZWF5aX2FdXFtaXFxgY1xeYmNkZ2VlZWNaYGFkYWJoaGpuY2FkXl9jXVpjXGJtYV5mZmdtc2RpaGtrZWRjZmhRSktLTk9MTVRRT1RRUk1YV1VUVlhXV1pWU1xgVldWWVVYVFFQS09YU1BOVVBNUU9MU1BNT1VTTlFOTU5RU1BUUFFUVE5LTU9SVFRRUVFVVlNYWltZUlVSVFhXVllcU09TVFdUU1lUVlhUUlFXVlZYXFpcYF1WWV9dXl1cXWFhXltiY2NoZ2ZkY1hgYGJeYGhlZ2VhXl9dXV5aWl9aX2dgXl5dY2hrYWhmaGZkYGJkYlBLTUxQUUxQVVBQVFFPUVpZWFdZW1pYWVZdamRWWFlaV1ZTVE9LT1ZUUE9UUFBRT01SUU9SWFRRUU9NT1JUTVdRU1RVT01OUVRWVVJSUlRXVVpdXFpWVlFSV1hVW1tWUFNVVVRVWFNXWFRSUVhWVltfW19gX1ZfXV5gXVxgX19fWmNjZWhoZWViWWJgYl5fZmRjYGJdXFxcXFlaW1hbYlxeXV1fYl9fYmRkYmRfX2BcUE1OTlJRTVJTUFNUUU9WXFpaV1tbXFlaW2RxbWhkX1tZVlZYUk1NV1NNTVJPUlJPTFBTUlVbVVRQUExPV1VQVlJTUlhNT1BSVVhVVFRSVFhYW15dXFtWUk9VV1VbWlZRU1ZUVVdVU1haU1JRWldXXV9bYGBgVmJcYGFdYGJfXGBdY2FjaGllZ2FaY2BhX19lZV9gY1taXFtcWlpZWVdcWlxaYF5gW15eYWBfY1xZYFpRTk9OVlFQVVNQVVVTUFdcXFxZXlxfV1xeanB3eYBjXFtWVllSTlBXU05RUVBSVFJMUlRUWVtXVU9STlJXVVJSVFFSWU9RU1RWW1ZWVlNWWlhdXlxcXlZTTlRWVltbVVFUVVVXWFJTWVtTUlJcWFpeX11iYWBXYltjYl5hY15cYmFiX2RnaWVnXlxkYGFgYWNkX2JfWlpeW1xbWFhZV1daWlphXV1bXVxcWl1gV1tbWlBPT09ZUFVVU1JYUlRQW11eXVxgXGBVXFxoanJ9c2xoXFVZV1FPU1tTUlFTUlVVVUtSV1ZaWlpTT1NRVVVUUk5WUVJaUlRVVFhdV1hYU1dcWF5dWVpdVVVOVlZXXlpXUVRVV1hYU1ZZW1RSVl1ZXV5hXmNjX1lgW2ViX2RkXl5jY2FeZWZpZWdfXmRhYWFiY2RfYl5YW19bXFtYWFhYV1taW2BdW1tcW1haW15WXlldUE9PUltQWlVWV1ZUVFReXmBfXmJcYFVdXmJreXVtfmxbVVpWUVFUXFRUVFVUVllXTFJaVlxbXFJQVVNXVVVST1dRU1dTV1VWW15YW1lVWl5YX15ZXFlSV1JZWVlfWVlSVFVZWVlVV1lbVVRaXV1eYWJgZWRdXl1dZWFiZmReXmRjYFxnZWhmZWJgZWFfYWFiYl9gXldZXlpcXFpZWVdWXVpdXltaW1xbV1lcXVZYV11TT1BXWVFdVVdZV1dVWF9gYWFgY11gVV1eYmVldoJ7aVlZWlRWVFZcWFdXVldXXVhPVVxZXl1dVFNYUlZVU1FTV1FTVlRYWFheXlhdW1ZdX1hfX1hcVlFYVFpaWmFYW1RWV1pZWldYWVlXVl1fYF9kY2JmZV5iXGBmYmRmZF9gZGJhW2ZjaGZkZmFmX19hYmFhYF9eVlVdWVtcW1lcWVldW1tbWFhZW1paWl1fXVRZXVVOVFpWVFxVV1dZV1ZcYGFiY2FjX19WW2BkYV96dXBpWlxaVlhWWFtaWVtZWFlgVk9VXVtgYVxUVVlQVFZUUlVVUVNVV1tbXF9fWl9cVl9fWV1eWV1WUlhXWllcYVldVVZaW1pbWlpYWlhZX19gYGRjZGVlY2RaYmZjZ2ZlXmFiYGNdYmNpZWRnYGheYmJjYWFgXl9ZVFtaWltbWFxYWFxbWltXV1pYWFxbXGBdVl1dU09WWlZWWlZZVlhXWF5gYmFkYWRhXllZYWRiYGtmaF9dXVtXWFlaXFxcX1taW2JWU1deXWFjXFNWWVBWVVVVVVVTVVRYXV1fYGBdYV1XYV5bXlxbXlhVWFdbWl9fWl5XWFxcXF1dW1pcV1pfYV5gZGRlZmZnY1ljZmVoZ2ReY2BfZWNdZmlkZWlgZ15jYmNhYWBfX1xYWVpZWllYWlhXW1taW1dYWlRaXVxbYFxVXmJNUldaV1daWVtcWFdZXmBiYWVhZGFdXllhY2JfYWBhX1xdXVhYXFtdXV9fXFpdY1hZWF1gY2RfUlhZUFdVV1dXVlZXVl1dXmFiYV9iXllhXV1eWV1dWVhVVltbYF5cX1lZXl1eXmBcWlpZW19iX2NmZGZnZmhjWmVmZ2lnY19jXmFmZVppaWNmaWNmX2JiY2FgYF9dXVpXW1lZWFhaWVdaW1pZV1lWVVtdXV1gYGJieEtXV1xZV11cXF1aV1xdX2BiZGJjYV1gWGJjYmBjYWNeXF1cWFhcXF9dYF9dW2BkXFxYWmJlY2FSXFlPWFZYWVhZV1laYF5hYmNgYWNfXGJdX11bXl1ZWVRYXVxfX15fW1peXmBiYltbV1tdYGJiZGZkZ2ZmaGVdZWdoaWZjYWJbY2dgXGlpY2hpZmVgYmJjYV9gX11dXFlcWVhXWFlZV1xbWldWWFBYWl1hY2Zmcmt/SllXXVtaX11cXlxZXVteX2JjYmFhXWJbYmRiYGNiYl1dW1pXWGpxYFxgX11cYWNfXllZY2VkYVRfWlFZV1tcW1tZW1tjYGNjY2BiZGFgY15gXF5eXllYVVteXFxhYV9dW2BhYmZiXltTXF9gY2RkZmVnZmZnZl9mZ2hoZ2RkYFtlZ15haGhjaWhmY2BiYWNiX19fXV1bWltZWFhYVlpWXFtaVlZWTVhYXGdpa2h1eIF2dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6e3p6ent7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHt7e3t8fHx8fHx8fHx8e3t7fHx8fHx7e3t7e3t7fYmIhoqHhYKBgoOCg4OCgoKCgoKCgoKCgoGAgYCBgICAgYCBgYGAfnx8fHx8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3h4eHh5eXl6enp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t6e3t7e3t7fHx8fHx8fHx8fHx7e3t7e3t7e3t7e3x7e3t7e3t7fHx8fHt7e3t7e3t8iYmHiYaFgoGCgoGCgoKCgYKCgoKCgoKBgYGAgICAgICAgIGBgYB9fHx8e3x8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnZ3dnd3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eHh5eXl5eXl5eXl5eXp7e3p6e3p6enp6enp6e3x8fHx7fHt6enp6ent7fHx8fHx8fHx8fHx7e3t7e3t7fHx8e3t7e3t7e3t7fHx8fHx7fHt7e3uHiYiJhYSDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICAgYKBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2d3d2d3d3d3d3d3d3d3d3d3h4eHh4eHh4eHh4eHh4eHh4eHl5eXl5eXl5eXl5enp6e3t6enp6enp6enp7fX19fXx9fHp6enp6e3t8fHx8fHx8fHx8fHx8fHx8e3x8fHx8e3t7e3t7e3x8fHx8fHt7e3t7e4aJiYiFhYOBgoKCg4OCgoKCgoKCgoKBgYGAgICAgICAgIGBgYCAfnx8fHx8fHx8fHx9fX18fHVwb29vb3Bwen59fX19fYSMi4uLi454KSkqKiopKz0/Pj4+Pj5tgH5+f397pdfT09PT08/ExcXFxcXH0tTU1NPT2FolKysrKiKL29LS0tLWun1+f39/f359fHx8fHx8fHx8fHx8fHx8fHx7fHx8fHx8fHx8fHt7e3t7hIuHh4aHgoGDg4GCgoKCgoKCgoKCgoGBgYCAgICAgICAgYCBgIB+fHx8fHx8fHx9fXx8fH19dXBub29vb296gH9/f39+hpCPj4+Pk3kZGhoaGhocMTMzMzMzMmqCf4CAgHut6eTk5OTl4NTU1NTU1Nbj5eXl5eXrVBMbGxsbEI/v5eXl5enHfX5/f39/f319fXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e3uCjYeIh4eDgoSCgYKCgoKCgoOCgoKCgYGBgICAgICAgICAgICAgH58fHx8fHx8fXx8fH19fX12dXV1dXV1dXZ3d3d3d3d4eXl6enl6d29wcHBwcHBycnJycnJyd3p5eXp6en6Dg4ODg4ODgoKDg4OCg4SEhISEg4R3c3Nzc3NyfIWEhISEhYJ8fX19fX19fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx7e4CMhomHh4SDhIKCgoKCgYKCg4KCgoGBgYGBgYCAf4CAgICAgICAfnx8fHx8fHx8fX19fX19fXZ2dnZ2dnl3dnZ6e3h7eHd2eXx6enl5fXl5eXh4eHh5eXl5enp5eXl5enp6eXh4eXl5eXl5eXl5eXl5eXl5eXl5eXx9fX19fX17enp6enp6e3x8fHx9fX19fX19fX18fH19fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8f4uHi4qIhIODgoKCg4KBgoKDgoKCgYGBgYGAgIGAf4CAgH+AgYF+fX18fHx8fHx9fX19fX19d3d3dnZ3fXh3d316eH14d3Z6fXp6e3l8e3h3d3d3eHh4eHh5eXl5eXp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fHx8fHx8fHx7e3x8fHx8fHx8fHx+iomMjImFg4SEgoKDgoGCgoKCgoKBgYGBgYCAgICAgICAf4CAgH19fXx8fH19fX19fX19fX13d3d3d3p9eHt4fHx3e3h3dnp+enl9eHx6eHh4eHh4eHh4eHh5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fX19fXx9fX19fX19fX19fX19fHx8fHx8fHt7fHx8fHx8fHx8fH2Kio2NioWDg4OCgoKCgYGCgoKBgoGBgYKBgIGBgICAgIB/gIGAfXx9fX18fX19fX19fX19fXd3d3d3fX55d3d4e3p7eHd3eHl9eXx6e3p3eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt8fHx8fHx8fHx8fHx8fH19fX18fH18fH18fHx8fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8foqJjo2JhISEg4KDgoKBgYKBgoKCgYGBgoGAgYKAgICAgH+BgIB8fH19fX18fX19fX19fn5+d3d3d3d5fHl7eHx9eXt4enp6fHx8fXt9e3h4eHh4eHh4eXl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHt7fHx7fHx8fHx8fHx8fXx8fX19fX19fXx8fHx8fHx8fXx9fX19fXx8fHx8fHx8fHx8fHx8fHx8fHx/iIeNioeFhoaDg4ODgoGBgoGCgoGBgYGCgYCAgoF/gICAf4CAgHx8fX19fX19fX19fX5+fn53d3d3d3Z4eHl3eXp4enh5eXl7eXp6eXt4eHh5eXh4eHh5eXl5enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX18fH18fH19fX19fH19fX19fHx8fHx8fHx8fHx8fX+HiIyIhoeHhIKDhISCgYKBgYKCgoGBgYKBgIGBgYGAgIB/gIGAfHx9fX19fX19fX1+fn5+fnd3d3d3d3d3d3d3eHh4eHh4eHh4eHl5eHl5eXl5eXl5eXl6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fHx8fX19fHx8gIeIi4eHiYaDg4SDg4KBgYGCgoGBgYKCgYGBgIGBgYCAgICBgX97fH19fX19fX19fn5+fn5+d3d3d3d3d3d4eHd4dnl5eHh4eHh5eXl5eXl5eXl5eXl5enp6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx7fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fHx8fH19fXx9fXyBhoqKiYmIhIOFhISCgoGBgYGCgYGCgoGBgYCAgYGAgIGAgIGBf3x8fX19fX1+fn5+fn5+f394eHd4eHh4eHZxZGpeam15eXl4eXl5eXl5eXl5enp6enp6enp6enp7e3t8e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIGFiYqJioeEhYWEg4KCgYGBgoKBgYKBgYGBgYCBgYCAgYCBgIF+fH1+fn5+fn5+fn5+fn9/f3h4eHh4eHh5bWRiZV9fXm94eXl5eXl5eXl5eXp6enp6enp6enp6e3t7e3t7fHx8fHx8fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx9fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goWKiomJhISGhYSDg4KBgYKCgoGBgoGBgYKBgIGBgICAgICBgH58fX5+fn5+fn5+fn9/f39/eHh4eHh4eW5kZWdlZGJeZnh5eXl5enp6enp6enp6enp6enp6e3t7e3t7e3x8fHx8fHt8fHt7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyChouJiIqEhYaEg4OEgoGBgYGCgYKCgYGBgYCAgYGBgIB/gIGBf3x8fn5+fn5+fn9/f39/f394eHh4eHl3Z2VkZWZkZWFfaXl6enp6enp6enp6enp6ent7e3t7e3t7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHt8fHx8fHx8fHx9fX19fX19fX19fX19fXx9fX19fX19fX19fX19fX19fX19fX19fX19fIKGi4eJh4SEhoSDg4WBgYGBgYKCgYGBgYKBgICAgYGAgYCAgYF+fHx/f35/f39/f39/f39/gHl5eXl5eWtlYWJlZWFlZV5ieHdze3p6enp6enp6enp6e3t7e3t7e3t7e3t7fHt7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fH18fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19g4aLhoiFhYaEgoOEhIKBgYGBgoKBgYKBgYGAgYGBgYGAgIGBgn98fH9/f39/f39/f3+AgICAeXl5eXl0Y2NlZGNmY2doZGZsZF5ze3p6enp6enp6enp6ent7e3t7e3t8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn6DhouGhoaGhYODg4SDgYGBgYGCgoGBgYKBgYCAgYGBgYCAgYGBfnx8f39/f39/gICAgICAgIB5eXl6d2RhY2diYmRdW2VfYV1eYGFoeHp6enp6enp6enp6e3t7e3t7fHx8e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+foSFi4eGhoaGhIODg4KBgYGBgoKCgYKBgoGAgIGBgYGAgYGBgYF+fX1/gH+AgICAgICAgICAgHl5eW9vYmJiZF5jZ19dYWFgXF9kYlttfHp6enp6enp6enp7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7fHx7e3x7fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5/hIiLhoSHhoaEhIODgoGBgYGCgYGBgYKCgYCAgYGBgYGBgYGBgX5+fYCAgICAgICAgICAgICBeXpwXWJlZGJkXmZnZ2BZYmJhY2VfXF1ze3t6enp7e3t7e3t8fHx8fHx8fHt7e3t7e3t7e3t7e3t7fHx8fHx8e3x8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fn19fn5+fn5+fn5+fn5+foCFjIqEhYaGhYODg4SCgYGBgYKBgYGBgoKCgYCBgYGCgICAgIGBf35+gICAgICAgICAgIGBgYF5emxiZGdjYmdmYWBgZGFiZWRjZGNeXGJ1fHt7e3t7e3t7e3x8fHx7e3x8fHx7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn9/gYeMiYWGhoeFg4SDgoGBgYGBgYKBgoKCg4KBgIGBgYKBgYGCgoF/f36AgICAgICAgIGBgYGBgXp7dGdnZmZkZGZmYF5fYWNlaGRlXmJkYHR8e3t7e3t7fHx8fHx8fHx8fHt7fHt8fHt7e3t7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f3+CiYqIhoaIhoWDhIOCgYGBgYGBgoGBgoKCgoGAgYGBgoKBgYKCgX9/f4GBgYGAgYGBgYGBgYGBenptaGNjZ2ZnZWdmZmdiZWRlYmdbYmVgdnx8e3t8fHx8fHx8fHx8e3t8fHx8e3x8fHt7fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+f39/f39/f39/f4SJioiGiYeFhYSEg4KBgYGBgYGCgYKCgYGBgYGBgYKBgoGBgICBgH9/gYGBgYGBgYGBgYGBgYF7emlpZGNqZmFgZmVjY2NnaWRjYmBiZGJ0fXx8fHx8fHt8fHx8fHx8e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f39+fn9/f39/f39/f3+AhIqMiIeJhoSFhYOCgYGBgYGBgYKBgoGBgYGBgYGBgoKBgYGBgYGAgH+BgYGBgYGBgYGBgYGBgXZzZWRnY2RmZWJlZmdkZmhmZWNgYGNkYHF9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fXx8fX18fHx9fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/fn5+f35+f39/f39/f3+AgICFioyJiIqJhoaDgoKCgYGBgYGBgoGBgoGBgYGBgIGBgYGBgYGCgX+Af35/foCCgoKCgoKCgoKCc3NnZWRkZWlqaGZnZ2NhZmZlZmdmZWVjdX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX19fX19fH19fX19fX1+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gICAgICAgIWLioqJioeHhoSCgoGBgYGBgYKCgYKBgYGBgIGBgoKBgYGBgYGAf4B+dHRzdX1/goCAfn5/gYB0cmdkZWNmaWppZWNlY2BmZGRnZ2JiZWFwfXx8fHx8fHx8fHx8fHx8fHx9fX18fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f39/f39/f4CAgICAgIB/houLioqLh4eHhIOCgYGBgYGBgYKBgoKBgYGAgYKCgYCBgYGBgoCAgH5zc3NzdHV4dXV0dHV2dXVwZmNmZWhoaWdoZ2VmZWJfZGVmY2BiZ3d8fHx8fX19fX18fHx8fH19fX19fX19fXx9fXx8fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39/f39/gIB/f3+AgICAgICAgICHjIyIi4qHh4eDhYKBgYGBgYGBgoGCgoGBgYCBgoGBgYKCgoKCgICAfnNzc3Nzc3NzdHR0dHNzdW9jY2FnZWhoZ2pmZGVnZmhmY2JlYl5ieX18e3t8fX19fX18fHx9fX19fX19e3x9fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn9/fn5+fn5+fn5/f39/f4CAgH9/gICBgICAgICAgYCAf4CAgYGAgIeLi4eNiYiJhYSFgYGBgYGBgYKCgYKCgYGBgIGCgoGBgYKBgoKBgIB+dHNzc3Nzc3Nzc3Nzc3N1cmdlZWRlamhoZ2ZpaGdjZWViZGNoZGd7eHVzc3R2dnl4dnR0dHZ3d3d2dHR0dXV4d3h4d3d6e3x9fXx9fn5+fn5+fn5+fn5+fn5+fn5+fn5/f39/f39/f35/f39/gH9+fHt7fX58eXl2dnZ5fHx6end2d3l7fXt4hIyMioyHh4iEhYSBgYGBgYGBgoGBgoGBgYGBgYKCgYGBgoGBgoGAgH51c3Nzc3Nzc3Nzc3Nzc3VzaGVnaGVrbGhqZ2lqZ2dnZmRkYmVkbnV0dHNzdHNzc3Nzc3Nzc3Nzc3NzdHNzc3Nzc3Nzc3N0dHV1c3V3eHl7fn59fn98f39/f39/f39/f314fH5+fXx4dXZ3eXd4dnRzc3N0dXRzc3Nzc3NzdHNzc3R0c3R0dHODjI2KiYeIhoOGg4GBgYGBgYGBgYGCgYGAgYGDgoKBgYCBgYGBgICAf3VzdHRzc3Nzc3Nyc3NzdnZpY2hqaGpsZWZpbGhgZmVkY2BkZGZ0dXV1dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRzdHRzc3Nzc3R2dnV1d3V4fH9+fX9+fHp4dXN0dXV1dHNzc3Nzc3N0dHR0dHR0dHR1dXR0dHV1dHR1dXR1dXV1dIaMjYuIhoeEhIWCgYGBgYGBgYGCgoGAgYCBgYKCgoGBgIGBgYGAgIB/dnNzc3Nzc3Nzc3Nzc3N2dnNnZ2pmaGdmaGhmZGlnY2NnZWVmcHZ1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dHR1dHR0dHR0dHRzdHR0dnV1d3Z0c3R0dHR0dHR0dXV1dXV0dXV1dXV1dXV0dHNzc3N0dHNzdHR0dHR1dXR1iY6MjIqHh4SEhYKBgYGBgYGBgYKCgoGBgICAgoKCgoGBgYGBgYCAgH93c3Nzc3NycnJyc3NzcnZ2dW5kXWNnZWlraGVoZ2dqamlnZXB2dXV1dXV0dHRzdHR0dHR0dHV1dXV1dXV0dHV1dHR1dXV1dXV1dXV1dXR0dHV1dXV1dXV0dHV0dHV1dXV1dXV1dXV1dXV1dXV1dXV0dHNzc3Nzc3N0dHNzc3Nzc3R0dHR0dHWKjoyMiYaGhIeFgoGBgYGBgYGBgoKBgYGAgYGCgYKBgYGBgYKBgICAf3hzc3Nzc3JycnJyc3NzdnZ3d2liaGhnamtpaGZkZGVmaWhwdXR0dHRzc3JxcnJ0dXV0dHR0dHR0c3NycXFxcXNzdHR0dHR0dHR0dHV0cnJyc3R0dHR0dXV1dXV1dXR0dXR0dHR0dHR0dHR0dHR0c3Nzc3Nzc3Nzc3Nzc3N0dHN0dHR0dHR0dYuOjImGhYWFh4SCgYGBgYGBgYGBgoKCgYGAgIKCgoGBgYGBgYGBgIB/eXNzc3NycXJycnJzc3N3d3d3bGpoZGhpa3Z6a2VmZWhnbXJzdHN0c3JwcHBxcnN0dXR0c3NycnNycXBvb29vcHFzc3NycnJyc3R0dHNxcHFyc3R0dHR0dHRzc3Rzc3NzdHR0dHRzdHR0dHR0dHRzdHR0c3NycnFxcnJzc3Nyc3NzdHR0dHN2jZCMh4eFhYSEgoGCgoGBgYGBgYGCgoKBgYGAgYGCgoGBgYKBgYGAf395c3NycnFxcnJycnNzc3d3d3dzc2pnaWloeX99cW51bG5wcXJycnFxcG9wcXFxc3Rzc3NycXFwcG5ubm1ubW5ubnBxcnJycnJycnJzcXBvb3BxcnJzc3JxcnJycnJycnJycnJzc3Jzc3Nzc3Nzc3Nzc3Jxb29ubm9vcXJzc3Jyc3NycnNzcnaPj4uHhoWFhYOCgoKBgYGBgYGBgYGBgoGBgYGCgoKBgoGCgoGCgX9/f3hxcHBwcXFycnJyc3Nzd3d2dnd2cnF0c252f352c3hwcHBycnJycXFwcHFxcXFyc3Nzc3FwcXBvb25ubm5ub25vcHBxcXFxcXBwcXJwb25vcHFxcXFxcHBxcXFxcXJycnJycnJycnFxcnFxcnJycnFwb29ubm1ubW5vcXJycnJycnJyc3JxeI+OjYaDg4aEgoOCgoGCgYGBgYKBgYGCgYGBgYKCgoKCgoKBgYKBf4B/d29wb3BxcnJyc3Nzc3J2dnZ2dnZ3dnZ1c3l/fnd3d29wcXFxcXFxcHBwcXJxcnJzc3JycXBwb29wb29vb29vb29wb3Bvb29vcHBxb29vcHBwcHBvcG9wcHFycXFxcnJycnFxcXFxcXFxcHBwcHBxb29ubm5tbW5tbm9wcXFxcXFxcXFxcXB7j42NhoODhYOCgoKCgYKBgYGBgoGCgYGCgoGCg4KBg4KBgYGAgYF/f392bm9wcHBxcXFxcXBwcHZ2dnZ2dXR0c3NxfYB9fX9zb3BxcXFwcHBwcXFwcHBxcnJxcXFwb3Bvb3Bwb29wcG9vb29vb29vb3BxcXBub3Bwb29wb29wcnJycnFxcXBxcnFwcXFxcHBwcHBwcHBwb29ubm1ubm5ubm9ub3BwcHFxcXFxcXFxcIKRjoqEhIOFhIOCgoGBgoKBgYKBgYGBgYGCgoKCgoKCgYGBgYCBgX9/gHVvb29wcXFxcXBwcHBwdnZ2dXRzcnJycnGAgoCBeXBwcHBvcHBwcHFxcXFwcXFxcXFxcG9vcHBwcHBwb3BxcHBvb29wb29vcXFwcG9wcG9vb25vcHFxcHBwb3Bvb3BwcHBwcHBwcHBvb29vb29vbm5tbW1ubm5ub25vb3BvcHBwcHBwcHBwiZCMiISDhIaDg4KCgYGCgoKCgYGBgYCAgYGBgoKBgYGBgYGBgIGBgH+AdG5vb3BxcXFwcG9vcG92dnVzcnFxcXFxcICDg39ycHBwcHBwcHBwcHFxcHBxcXFxcXBwcHBwcHBwcHFwcHBwcHBwcHBvcHBxcXBwcHFxb29vbm9wcHBvb29vcHBvb3BwcHBwcHBwcHBvb29vbm5ubm5ubW5ubm1ubm9wcG9vb29vb3BzcXWPj4yJg4KFh4ODgoKBgoGCgoKBgYKBgYCBgoGBgYGBgYCAgYGAgYGAf4B0b29vbm9vb29vb29vb3Z1dHNxcXFxcXJygIKCgXRxcXFxcXFxcXFxcXFxcXFxcXBxcXFxcHFwcXBxcXFwcHBwcHFxcXBxcHBwcXBwcHBwcHBwcHBwcHBwcHFxcXBxcHBwcHFwcHFxcHFxcXFxcXJxcnFwcnRycnR0dHR1dnRzdHR0dXd3gpCPi4iDgoaHhISCg4GBgYKCgoGBgoGBgYKBgYGBgYGAgICBgYCBgYB/gHVvb29vb29vb25vb29vdXRzcnJycnJycnKDg4OCdnFycnFxcXJxcnJxcXJycnFxcXFxcnFxcXJycXFycXFxcXFxcXFxcXFwcXFxcXFxcnNzcnJyc3V1dHR0dHR0dHV2d3d3d3d3eHh4eHd3eHh4d3Z3dnV2dnZ2d3h6e3x7e3t6enp6enyGkI2LiIODiIeHhYODgoGCgYKBgYGBgYKCgoGBgYGAgYCAgYGAgIGBgH+Ad3FxcXFxcG5ucG9wcG92dHV1c3Nzc3NzdYiDgoN5cnNzcnJyc3Jyc3NycnJycnN0cnJzcnNzc3Nzc3Nyc3N0dHV1dXV1dHV3eHd3d3d4eHh3eHh4eXl5eXl4eHl5eXp6e3t7e3t6enp5eXh3d3d1dnV2dnd5enp7fn5+fX1+fn5/f35+gIyQi4qHg4WIi4iEg4SDgYGCgYGBgoGBgoKCgoKAgYGBgYCBgYGAgIGAf4B8enp5eXx5eHh2dXZ2dHl2d3h3d3Z3dnZ6f3x+fnx2dnd3dnV4enh4eHh3d3d2eHx5eXx6eXl8e3l5eXh4eXl6enl5eXh4enp5eXh4eHh3dnd3eHh3eHh5eXp7e3p8fH1+fX9/f359e3t7e3p5enl5e3t/foB/fn5/fn19fX5+f35+fn6AjpCNioeEhoqLiIaGhIOBgoKBgYGCgYGCgoKCgoCBgoKBgYGCgYCBgIF/f4B/fn19fX9/f318e3t7eXh4eHh5eXl4eXh5eXl4enp6enp6e3t7fH1+fHt7ent8e318e3t7e3t7enl4eXh4ent6enp5eXp8fHt6enx8fHp6ent9fXx+fn+AgoGAgYKAgH9/gYGBgIB/f35+fn5/fX1+f4CAf35+f39+fn9/f39/gH+Af4OQjoyHhoWIi4yIh4aFg4GCgYGBgYKBgoKCgoKBgYKDgoGBgYGBgIGBgIB/goOCgoGBgX99f39/f4F6enh4d3h4eHh5eHh5enp5e358enx9fXt8fX19fHx8fnx9fn5+fn59fX9/f3x8fYGDgYCAf318fXx9fXt9fXx8fH19fX1+gYGChISDgoB/gYGBgH9/f4B/f39/f39+fn9/f39/f35+f3+Af39/gICAf4CAgICAhJCPi4eGhoiMi4iKhoaDgoKCgYGBgoGCgYKBgYGBgoOCgYCAgYGAgIGBgH+ChIKCgICAgH9+fn+AgH9/fn18fX19fYB/fX+Af35/gH9/fn9/gIGBgICAf3+BgICAf4CBgn9/f4CAf35+f39+f39/fn5+f39/gYB/f4CBgYCAgYOEgoGCgoGCgH+AgYCBgYGAgH+BgICAf39/gICAgYGBgIGBgYCAgICBgoGBgYCAgYGFjo6MiIaHiYyLi4qGhYOCgoKBgYGCgoOCgoKBgIGBgYKCgICBgYCAgYGAf4KFg4KBgYCAf39+fn+AfX5+fn19fX5/fn9/f35+fn+AgYCAgICAfn9/fn+Af3+AgH9/f35/f35+fn59fn9+fn9/f35/gIGBgoKDg4KCg4KBgYKDg4OCgYGBgYKBgoKCgYKBgoGBgYGBgoKCgYGCgYKCgoGBgoKBgYKCgoKCgYGBgoKCgoaPkY+Kh4iKjY6NiYaFgoKCgoKBgYKCg4KCgoGBgYGBgYF/gIGBgYCBgIF/gYWEg4KCgoGCgYCAgIB8fHx7fH18fH9+fn9+fn5+f35+f39/f39/f35+foB+fn5+fn9/f39+f39+fn5/gIB/gIB/f39/f3+BgYGCgoCAgYKDg4SDg4ODgoKCgoKCgoKCgoKCgoGCgoKDg4OCg4ODgoKCgYKCgoODg4ODgoKCgoODg4KCh5KSkIuKi4uPj42Kh4SCgoKCgYGBgoKDgoKBgYGBgIGBgICAgYGBgIGAgYCAg4SDg4OEg4ODgoKCgXx9fHx9gn1+f4GCiIGCgoSCgYGDg4GBgYKCgYKBgYCAf39/gICAf3+AgX9/f39/gYCAgICAgH9/f3+AgICAgH9/gYODhYSEg4SDgoKCg4OCgoOCgoODg4ODg4SDg4KEhYWDg4SEgoKDhIOCg4ODg4OCgoODgoCKlJOPioqMjpCPjYuGg4KCgoKBgYGBgoOCgYGBgIGBgoGBgICBgYGAgYCAgH+BgoODg4SEhIOCgoKCfXx8fn6AgYOAg4OChIaFhoaFhIWFg4ODg4OBgYKEhIKCgoeDgoKAgoGBgoKCg4KCg4KDgoODgoGAgIKCgYOCgYKCg4OEhYWEg4OChISEhIOEhISDg4OEg4ODg4OEg4SDhIWEhISDg4ODgoKCgoKCgoKBgYKCgo+UlI+Njo6RkY6KiISCgoKCgYGBgYGCg4GBgIGBgYGBgYCBgIGBgYCBgICAgIKChIKDhIOCg4ODgoJ9fX2AgH+AgoGDg4ODhIaEhIOEhYWDg4GBgoOBgIKDgYKFhYWFhoaHhoaGhoeHh4aGhoeHhoaEgoGCg4SDg4ODg4ODhISFhYWDhYSFhISEg4KBg4OCg4SEg4KCg4SCg4ODg4OCgoKCgoKCg4OEhIOFhYWFhoaIk5OTkI+Pj5KRjIqHgoKCgoKBgYGBgYKDgoKBgIGBgYGBgICAgYGBgICAgICAhISEgYKCgoGBgoKBgX+AgYOBgICAf4CCgoKDg4KCgYODg4SDg4KDhYOCgYGBgoSFh4eHh4aGh4eHiIiHh4eIiIiFhIOBgIGBgoKCg4GCg4SEhYSDg4OEg4OEhIOBgYGCg4OEhISDg4ODg4OEhIODgoSDg4ODhIWFhoeHh4eIiIiJiY6TkpKOj46QkY+LiYeCgoKCgoKBgYGBgoKCgoGBgYGBgYGAgICAgYGAgIGAgICDg4KCgYKCgYGAf4CBhYWFhoOCgYB+fn+BgoSCgYKDhIOCg4ODg4KChISDhIOCg4SFhISFhYSDgoSFhYKEhIWFg4KBgH9/gIB/gIGEg4OEhYWEgoKCgoOCg4OFhIKDhISEhYaGhoaGhoWFhoeHhYaIh4aHiIeGhoaIiIeGhYaGhoeIkZKSkI6QjpCRjImHhYGBgoKCgoGBgYGBgoOBgYGBgYGBgICAgICCgICAgICAgISEg4KBgoGAgYGAgYKIh4aHhYSCgH99fX6AgH+AgYGBgYGBgoGAgYKCgoGCgoKBgYGCgYKCg4GBgICAf4GAgH+AgH9+gIGBgYKCg4OEg4OEg4OCgoGBgoODg4SEg4SEhIOFhYaFh4eIh4eHh4eHh4eGhoaGh4WFhYaGhIWEhIWEhYaSk5GOjo+OkI6JiYeEgoKCgoKCgoGBgIGCgoKCgoKCgoGBgYGAgYGBgICAgYGAgoSDg4KDgoGCgYKDg4iHh4eHhYSCgX5+gICAfn5+f4CBgYGCgYCCgoGCgH+AgIB+gIKBgIGCg4OAf39/gICAf4CAgICDg4KDg4ODgoOBgYKCgoOCgYKCgoOCgoSDhISDg4SEhYWFhYaGhoaFhISEhYWEhIWFhYSEhISDhISEhISEipSTkpCQj46NiIaFhIOBgYKCgoKCgYGAgYKCgoKBgoKBgYCBgYCBgYGAgICAgYGAg4OCgoOCgoKBgoOCiImJiYiHhYSDgYKEhIOBgYGCgoOCgoOEgoOEhYWEgoSCgX+AgoGBgoGChIOBgYGBgoOCgoGDg4SDg4SEg4OCg4KDg4ODg4KCgoKCgoGDhISEhYSFhYWFhIWEhIWFhYWDg4OEhISEhYWFhISEhISEg4ODg4OOlZKQkZGOjYyHhYODg4GCgoKCgoKBgYCBgoOCgYCCgYGBgICAgIGBgYCAgICBgICDhYSEhIODg4SDhIOGh4mIhoWDhIOEg4WDgYGDgoOFhYODg4SDhIODhYSFhISEgYGAgYKDgoKEg4OCgoGBhIWEg4ODgoKDhISDg4ODg4SFhISDg4KCgYKCgoSEhYSFhYWFhYODhYWFhYaFhoWEhIWEhYWGhYWFhIWEhISDhIODhJGUk5KSj4yMioWEhIODgYKCg4KCgoKBgYGCg4KBgYKBgYGBgICBgIGBgH+AgIGAgYaGhoaGhoaHh4aGhYSDhYaCgIGBgYGHgoB+f4GAgIKBgYCBgYCAgoGCgoKBgoKCgYCCgoKCgoKDg4GCgYKDhYODg4KDg4OEgoKEhIOEhIWEg4OCgoKCgYGCg4ODg4SFhYWFhIOEhYWGhYWEhISEhIOEhIWFhYWFhIODhIOEg4KGlJOSlJKPjYuHhISEg4KBgoODgoKDg4GBgoKBgoKCgYGCgYGBgYCAgYGAgICAgICAhYWFhYaGhoaGhoWGg4ODg4GAgoKCgYKAf35/f4CAf4B/gIGAgH+BgYGBg4CAgYGChIOBgYGBgYKBgYKDgoODgoOCgoKCg4OBg4SDg4ODg4OEhIKCgoKDgoKDg4ODhIWEhISEg4OEhIODg4OEhIODg4ODg4SDg4ODg4KDg4KDgouUk5KTkY2NioaDg4OEgoGCg4ODg4ODgoGBgoGCgoKCgoKBgYGBgICBgYCAf4CAgICDhISFhYSFhYWEhIWCg4KDgoKDg4OBgICAgICAgYCAg4KCg4GBgoKDg4OEgoODg4KAgICCgoKDgoKDg4ODgoODhIKCgoODgoKDg4KCg4KDg4WEg4ODg4SDg4SEhISEhYWEhIWEg4SEg4OEhISEhISEg4SEhYSDg4SEhIODgoKDkJSSkpKPi4yIhoSEg4OBgYKDg4ODg4OCgYGCgoKCgoKDgoCBgoGAgICAgIB/gICAgISDhYWEhYWFhYSFhYOEhIWDg4SFhIKCgoOCgoSCgYKGhYOEg4OEhISGhYSEhYJ/fX19foKEg4ODg4OEg4ODhISEg4OEhISEg4SEhIOEg4OFhoWFhYSFhYWFhYSFhoWGhoWFhYWFhYWFhYWGhoWGhoaFhoaGh4aFhYWFg4SEhIeTk5KRkoyLiIWGhYWCgoGBgoODg4OCg4KBgYKDg4OCgoKBgIGAgICAgICAgH+AgICAhYWGhYWGh4eGhYWFhISFhYSEhISEg4SDg4OEhYOCg4SFhYaFhoaFhoeHhoOBfn9+fn5+f4OEg4OEhISEhISEhISEhISFhYWEhYSGhYWGhYaGhoWGhYWHhYWGhYaGhoaFhIWFhYWFhIWGhoaHhoaGhoaHh4iIiIaFhYaEhYWGjZSTkpGQi4qHhoeGhIGCgoKDg4ODg4KDgoGBgoODg4KAgYGBgICAgICAgICAf4CAgICHh4eGhoeHiIeHhoaEg4ODhIODg4OEg4ODg4OEhIODg4WFhYWHh4WFh4WBf39/f39/f35/gISFhIWGhoaFhYWFhoaHhoaFhoWFhoeHh4iHh4eGhoaHh4eGhoaHhoaGhYSDhIWFhYSFhYaGhoeHhoaGhoeHh4eIiIeGhoaHh4eRk5KQkZCLiIiFhoSDgoKBgoODg4ODgoKDgoKCgoOCgYCBgICBgICAgIGAgIB/gICAf4aHiIeHh4eIiYmIiIODgoKDg4SEhIWEg4KCg4OEg4OCg4WEhYeIhYOCgH9/f39/gIB/f4B/f4WFhoeIiIeHh4eIh4iHiIiIhoaHiIiJiYmIh4aHh4eIiIaHhoeIhoaFhIOEhYaGhYWFhoaGh4eFhoeGh4aGh4eHh4eHh4eFh5OTkY+RkIuHhoWGhIKCgYGCg4ODg4ODgoKCgoGCg4KCgIGBgYCAgICAgICAf4CAgYB/hoiIiIiHh4iJiYmIg4KCg4ODhIWHh4eFg4OFhIODg4KEhISEhYSBgIGCgYGBgYB/gH9/fnt6gIaIiIqKiYmIiImJiYmKi4qIiIiJiYuLioqIiIeIiIiHh4iIh4iGh4aEg4OFh4eHhoWFhISEhYWEhYWGhISEhYWFhoWGhYOJlJOQjpGOioaFhoWDgYGBgYKDg4ODgoKCgoKCgoKCgYGBgYGBgYCAgICAgIB/gICBgH+GiYiIiYeIiImJiIiEgoKDg4ODhImKh4eEhYWEg4OFg4WEg4OCgYKCgoKCgH9+fH19fX9+fHt8g4eJi4uKioqIiIqJiImLiomJiImIioqJi4mHhoaGh4WGiIiJiIeGhoSDgoSIiIiIh4WCgoGDg4KDg4SCgoKDgoGEg4SDgY6TkpCPj4uIhYSGhIKBgYGBgoODg4OCgoKCgoKCgoGBgYGBgIGAgICAgICAgH+AgIGAf4WIh4eHhoeIiIiHh4SCg4OCg4OFiYqJh4WHhYSFhYSDhYSDgoKCgoKDgX59fn5+fn5+fX1+fX19g4eJioqHh4WGh4eHh4iHh4mHiIaIh4eJiISDhIOFhISFhYaIh4aFg4KCg4WHhoeGhoOCgoOEgoOEhIKBgYGBgYODhIOEkZKRjo+Ni4eEhoaDgoGAgYGDg4ODg4KCgoKCgoKCgYGBgIGBgYCAgIB/gIGAf39/gIB/hYaGhYaGhoeHiIeGgYKEhIOChYaIi4qGhYaEgoaGgoCDg4ODg4OCgoF9fH1/gH9+fn59fH19fHp8hIaHhoSDgYODhIWFhYODhYSEhISEhIWEgoKDgoSEgYKDg4WGhYSCgYGCgoODhYOEhIWEhIaDg4SFg4KDgYKDg4SFhIeSkY+Nj4yJhoSFhIWCgYCBgYODg4ODgoKCgoKCgoKBgYGBgYGAgICAf4CAgYB/gICAgICDhIWEhYWFh4eHh4aAgYGFg4OFhYSHiIWDgYCAgX9+fYKDg4ODgoKAfX1/gICBf31+fn19fX16enp+g4SEgoGBgIGBgoKBf36BgYGCgYOBgoGCgoKBg4OAf4CAgYOCgICAgIGBgYGCgYGChIODhYSCg4SDgoKBgoSDhYWGjJORjo+Pi4iFhYOChIGBgYGBgoODg4KCgoKCgoKCgoGBgYCBgYCBgH9/gIGBgICAgH+AgIKCg4OChIOEhYWGhn+BfoCBgICAf4GDgn9+fn5+fHx/g4OCg4KDgX19fn+AgIGAfn19fX1+fXx6enp/goKAf39/f35/f4B+fYB/f4CAgX+AgIF/f3+BgX59fX+AgX9/fn+AgH+AgICBf4CCgICCgYGCgYGAgYGBgYKEg4aPkpCOj42Kh4eGg4OCgYGBgYGCg4ODgoKCgoKCgoOCgYGCgYGBgICAgH+AgICAgICAf39/gYKDhIGCgoOCg4SFgIF/fH19fn19foCAfn1+fnt9foKDg4KCgYF/fX1+f4CAgH9+fX19fHt7e3p6eXqAgH9+f35+fnx+f35/gH9+f3+Af4GAf35+fn9/fn18fn+Af35+f3+Af39/f4B/f4B+f4CBf4B+f39/gH9/f4B/hZKSj46Pi4uHiYWEg4KBgYGBgYKDg4ODg4OCgoKDg4KAgYKBgYGAgICAf3+AgIB/gIF/f36BgYSEgYKBg4OCg4OBgH98fn5/fn6Af4B/foB9fX+BhIOCgYB/f359fn5/gICAfn19fXx7e3x6enl5eXt/f35/f39+fX5/f4CAf35/f4CAgoB/fH5+f35+fXx/f4B/fn5/f4B/f39/foCAf36Af39+fn5/f35+f318fH2FkpKNjIuKiImIhIWEgoKCgYGBgoOCgoODgoODg4ODgYCBgYGBgYCAf39/f4CAgICAgH9/foCBhIOCgYGDhISDhICBgYCBgIGAgYKCg4GAgX6AgoODgYGBgYCAfX19fn5+f359fX19fXx8fHt6eXl5eX2Af4CBgYF/f4GAf4F/gICAgYGCgoB+gH5/fn5+foGAgoF/f39/gIB/f4B/gYB+f4CAfn9/fn+Af31+fX17fIaTkYyLioeHioiGhoSDgoGBgYGCg4ODg4OCg4OCgoKBgICBgYGAgH9/f4B/gICAgICAgH9+fn+BgYGAgISGh4aHgoSDhYOBg4ODhYSEhISDgYODg4KCgoGCgX5+fX19fn6AfX19fX19fX18e3p6eXl5eYCCgoKEg4CBg4GAgoCBgYGDgoODgYGCgIGAf4CBg4GEgoCAgYCBgYCAgYCCgn+BgIF/gIB/gICAfn9/fnx8ipOQiomIiIiJiIaGhoSCgoGBgoKDg4ODg4KDg4KCgYCAgICBgYGAf39/gICAgICAgIGBf359fn5/f39+g4aHh4iChoSFg4SFhIWGhoaGhoWFhoGAg4ODgoKAfX19fX19fn59fX19fX19fX18e3l5eXl4fIKDhIWCgYSDgoKDhYaCg4SDgYKCg4OBg4KCgYKFg4iFgoGBgYKCgYGBgYSDgoOCgoKCgYGBgIF/gIGAf36Ok4yHiIaIh4aGhYaGhIKDgoGCgoODg4ODg4OCgYGBgH+AgYCBgYB/f39/gICAgH+AgYB/fn19fX5+f36Ag4SHiISGhoaFhoaHh4aGh4eHhoeHf32AgIGCgX59fX19fX19fX19fX18fH5+fnx7eXh3eHl5gIKDf4ONhIOEhISXl4ODhIF9foGCgoGCgYKBg4aIjIWDgoKBhIKEg4KDhYWEhYOCg4OCg4OCgoKCg4OCgpKQi4iIh4mHhoaEhoWEhISCgYKCg4ODg4ODgoGBgYCAgICBgIGBgH9/fn+AgYCAf4CBgH9/fn1/fn+Bf4CCgYWFhYaGh4eGh4eIhoeHh4aHh4d/fH18fX9+fX19fX19fX19fX19fXx7iJKCe3x6fIZ5eHl8gYF+iZeEg4OEhJSTgIGBf39/fn6Ei4B/gICEhpCJhYSCgoGFhYuDgYKFhYaGhIOFhYOEhIODhIOFhISIko6LiYiIiYeIh4WGhYSFhIKBgoKDg4ODg4OCgYGBgICAgICAgIB/f39/f4CAgICAgIGBf39/f4CAgIGBgYGBg4OGh4aGh4aGiIeGhoaFhISGhX98fHx8fX18fH19fX19fX19fX18fH+RlZaDe3qElHx4eXp7fH+Cg4GBgIOCgH58fn57iJF8fI6Wf31/f4KGioWDg4SCgYONiX9+f4OEhYWDhYaFhIWFg4SFhYaEhI6Rj4uKioyKiYqHhYaFg4OCgYKCgoKDhIODgoGBgICBgICAgYGAgIB/f3+AgIB/gICAgX5+f4GBgoKCg4SDgoOCgoWGhISFhYSGhIOEg4KBgYOBf319fHx9fXx8fH18fH18fX19fHx8e4uRl4x6e3yAenp6e3x5eX19foB/gH98e3t+fn2ClZF/hIh+fH5/goR8fIGChIKAf4eDfYKBf4KCgIODhISEhISChIOEhYKEkZGNi4yMjoqJiYaFhYODgoKBgoODgoKDg4KCgYGAgIGAgICAgICAgH+Af3+Af357gICBenyAgYKDhYODhYWFhYODg4SCgYODgoOCgoGAgIB/gX5/fn59fHx8fHx8fHx8fHx8fHx9fXx8fn6Kgnt6e3p4ent6fH17fn1+f319fX18fH+BgX2Gj4F+fYJ+f36Agnx8f3+BgIKAfn17ioJ9gH9+gYCAgYKBgoCAgIGAf4uTj4uLjY6NiIeIhoWEhIOCgoKCg4OCgoODgYGBgICAgICAgH9+fXx7fHx9f3+AgHx6gYF4e4CCgYOFhIOFhIaGhISAhpSIgIKBgYGBgH9/f39/fn5+gHx8fHx8fHx8fHx8fHx9fHx8fHx8fHl7e3t4eHl7e3p8gX+Afn+BfH5+f399gIKCgICAgX+CkYF/f4CAfoB+fn9+gIGBfXx9e319fXx9fHx9gH+AgH6Afn6BlJGLjIyNj4qGhoaFhISFg4ODgoODg4OCgoGBgYGAgICBgICAf4CAf39/fXt6fICAgHh+gXd7gIF/gYKCgoKDhoeGhn6IlYp+gYGAgIB/foB+f39/fn+Bfnx7e3x8fHx8fHx8fH59fHt9fHx8e3x8fHp6eXt8en2Fg4J/gYF+f35/gH6FgoF+gH9+foCFhoKAfn6Dh399fH6AgIGAf39+fX19fX16fH1/f3+AfX9+gIyRjYyNjo2Nh4SGhoWEhIODg4OCg4ODg4KBgYGBgICBgYGAgYGBgYGAgH9/f397en9/e3mAd3p/f31+f3+Af4KEhoaFf3+FgX5/gIB/gH5+f35/gIB/gIB/f318fHx9fn18fX19fX19fH58fXx7fXx8ent6e319f4aEgoCAgX1+fX5/fYuEgYZ+fXx8f36CgX99fX19gHx7fXx+gYSDgYB+fn5+fXx+f399foB+fn6EkoyMi46Ni4qGhIaEhIODg4OCg4KDgoOCgYGBgYGAgYGBgYB/fXx8fH1+f39/f397e399d352eH59fH18fX5+gYGCg4B7fn18fn6AgH6Af35/fn+AgH+AgH9/fn9+fn5+fn1+fn99fH59fn19fHt8fHx6e3p9fn+Ag4OCf35/fH18fXx9gYN+jH58e3t9fn1+fn17e3t9e3p7e3uAhoSChIOCf4B+f4KCgn9/goJ/gIqPi4qKjIuKiISEhYOEg4ODgoKCgoKCgoKBgYGAgoKBgYKCf3+AgIB/fn18fH5/fn55fX52e3Z4fXx8fHt9fX6BgICAf35/f31+fn9/foB/f39/f3+AgIGBgH99gH9/fn9+fn9/f3yCfn59fX17e319fHp8fH6AgoF/gIB8fH18fHx8fH18fXt/fnt7e3x8fH18e3t7e3x8enp9en6CfoGDhIKBgoGFhoWFhoaHhoKEkI2LiomKhoeFgoOEhISEg4KCgYGCgoKBgoGBgYGBgoGBgoKAgYKBgYCAgH9+e3x+fnx6fnh5dnd8fHx7e318f4GAf35/foB/f35/f35/gH9/f39/f3+AgoKAfn6BgIB/f39/f39+fYN8fH19fH99fX19e3x+fn9+fn1/fnx8fHx8fHx+fnt8e3x8fHx9fH18fnx9fHx7e3x5e3x7e317fX5+f4CAg4eJiYmKiYuJhYiQjIqIiIaFhYOCgoOEhIODgoKBgYGBgYKBgYGBgYKCgoGCgoCAgX98e3p6eXt9enx+fnl8eXh4dHx8fHt8fHx+gX9/f39/gIB/fn5+fX+AgH9/f3+Af4CDg4B/gIGAgIB/f4CAgH58enx9fX59fX5+jIZ9fX57e4OCfX19fX18fXx9fX1+fH17fXx9fX58fn19fX18e3t6fHt8fHt6e3t6enp7fn6ChYiHh4uLi4qJjJCNjImHhoWEg4KCgoODg4OBgYGBgYGBgYGBgYGCgoOCgYKBgIGBf3+Af356eHl5en5+e3l6eH5zfHx8e3x8fH5+fn9/gH+AgIB/fn9+gIF/f4B/gIGAgoSDgYCAgYGAgX+AgYGBf39+f31+gH57foGRjHx9f4qAjYx+fn19fX59fX59fHx8fX18fXx9fX1+fX1+fnx7e3t8fH18e3p7fHl6eXh5e35/hIKEiImKiImNj4yKh4iFhISDgYKCgoKDgoGCgoKBgYGCgYKCgoGCgoKBgoKAgYGAfoCAf39+e3p5e319eXx6f3KBfXt7fHx8fn59fYGCf4GBgX9/gH+AgX9/gIGCgYGFg4SCgYGCgYKCgICBg4KAf4F/fX6Afnx/f4iCf36DkISEg4F/fn18jYd9fX59fHx/fnx9fXx9fX1+fX5/fX19e3x9fnx8e3x9enp5eXp5e3t+foCBg4eEiI2MiYmFhYSEg4KCgoKCgoKBgYGCgoKBgoKCgoKCgoKCgoGCgn+AgIB+f39/fn5/ent5fX16enp9cX6Cent8fX19fXp4foKAgYKCgICBgIGBgICBgoKCgoaFhIGBgYGBg4F/gIKEgX9+gYB9foF+fX9/gIB9fn+EgH5+f31+fX2KhX1+f31+foB/fX19fH5+fn99f4B9fX18fX9/fHx7fH17e3t6enp7e3x9fn2Ag3+IjImJh4WFhYSDgoKCgoKCgYGBgoKBgoKCgoKCgoGBgoKBgYKCf4CAgH9/f39+fn59eXp6fXx5d3t0e4d8dHd9fn17e3Z2foCBg4KBgYKCgoKBgYGDg4OChYaEgoCAgICCgX+AgYSBfn6AgH1+gH19fn6AgH6Bfn+Af39/gH99fn9/f3+Afn9/gH58fX18fn5+foF/gH2CgHx9gIF9fHx9fXx8e3x8e3t7fHt8fHx9fIiJh4eFhoWFhISDgYKBg4KAgIGCg4KCgoOCgoKCgoGCgoGBg4J/gIGAf39/fn5+fn57e3p8fHt2e3R3f352cnt+fnt4dXd8gIGCgoKBgoODg4OCgoSDhIOFhoOCgX9/gIOAgICAg4F+foCAfX+AfX1+foCAf4J/gYGAgICBf31/f3+AgIGAgIB/fnx9fX19fn59g32AfoKAfX6BgX98fn59fX17fH58fXx8fHt8e3x9iIWGhIWHhYSFhIKBgoGDgYCAgoKDgoKCg4ODg4KBgYGBgYGCgH6AgYB/fn5+fn5+fn56e3p9goN9dXF6fHpxen19eXh0dICAgoKCg4KDhYOEg4KDhISEhIWEgYGAgH6Agn9+f36Bf35/f4B9foB9fX1+gH9/gYCCgYCAgIKBfX6Af4GAf4CAgH9+fX19fn1+fn19gYR/gH9+f4GBf32Af319fn1+fn1+fHt8enx7eoCFgoOEhYSEhIWDgoKBgYKBgICCgoOCgoOEg4SDg4KCgYKBgYOAf4CBf35+fn5+fX5+fnt7en6Jh354cnl9f3F6eHt4eXR1fYKDgoODg4OFhIWEg4OEhIODhIKBgH+Af4CBfn19foB+fn5/gH19f3x9fX6Af4CAgIKAgIGAg4F/f4B+gIF+gIGAgH9+fn5+fn1/fn6FhYCBgH+Ag4F/foGAf36AfoB/fn17ent6fHt6goN/goKCgoOCg4KBgYCAgoGAgIKBg4KBg4SDhIKEgoGBgoGCgoB+gIF/fn1+fn5+fX59fXp7fIWEe3tyeXt8cHd1dnd5dnR6hISBhISDhIWFhoSDg4WEgoODgoCBf4B/f4B9fX1+f31+f39/fn1+fH19foF/gIB/gIB/gIGDgoGAf36AgH+AgYCBgH9/f39/f4CAgIGCgoKBf4GEgX+Ag4F/f4B/gX+Af3x7e3p8e3yBgH+Bf3+BgYGCgYF/f3+BgH6BgoKDgYGDg4KEgoSCgYGBgIGCgH6AgH9/fX5+fX19fn19e3t6gH94fHZ5enxxdHh3dnh1cnmFhYKFhIKEhYWGhISChIOBg4KAgIF+f4B/gHx9fX6AfX5/f39+fX98fn5+gX+Bf39+f4B/gIODg4B/f4GBgIKBgYGAgIGAgICAgIGAgYKDgYF/gISBfYGDhICAgX+BgYKBfXp7e3x8fX99f4B8f399fYGAgH59fYB/foGBgYKBgIKCgoKBg4KCgYB/gYKAfn9/fn99fX1+fX19fX19ent7fHZ9eXh6enJ1eXl2d3dzdYaFg4WFgoSEhYSEhIKDgoGDgX+AgX5/gH6AfX19fn9+f4B+fn99f3x/f3+BgIF/f3x+gH6AgYKDgYCAgoOEgoGAgYB/gYCAgYGAgYGCg4KBgX9/g4B+goKEgICCgYKChIJ+e3t8fHx9fX1+fXp+fX15fn9/fHx8fn1+gYCBgYGAgoGBgYGDgoGBf4CAgoB9fn19f319fX59fH19fX16e3p8dnx6d3t4cnZ5e3Z2dnN0hoSEhYWBhISFhIOCgYOBgYOBgIGBfX+BfoF9fX1/f39/gH5+fn19fYB/gIGBgX9+fH6Afn9/gYJ/gYGCg4eFgYB/fn6Af4CBgICAgIGCgYCAfoCCf3+BgoKBgYOCg4OFgn99fX18e3x8eXp7en55e3l4f357e3t+fX1/f4F/gH6BgICAgoOCgYF/gIGBf31+fH1+fX19fX18fn58fXx5e3x4enx3endzeHd6c3Z2c3SGhISFg4KDhISDgoGCg4GCgoGAgYF8gH9+gH1+fX5/gICAf35/fnx+f3+BgIGAf359f39+fn+BgH2AgIGDhIN/f359fn5+f4B/gIB/gYKBgH9+f4F+f4CCgoCBhIKEhIaEgH59fHx8fHp5dnl5enl2eXZ+fHt7e359e399gH99fX9/f3+BgoGBgX5/gYF+fX18fX19fX19fXx+jYF8fXl7e3p5fHd4eHR1dXhyd3d0doaEhIWDg4ODgoOCgYKDgoGDgn+BgH9/fn+Afn19fH+AgIB/f4B/fIB/f4GAgYCAf3yAf35+fn9/fX5+gIGCgn5/fn1+fn5+f3+Af32AgYB+fn5/gX5+gIKBf4GDgoOEh4SAgH58fXx8e3x1eXl4eHh5d3t8e3p7foZ9fn1/ent+fn59foGAgIGAfX6BgH59fXx9fX19fX18e32Dgnx8ent7e3p7d3Z4dXJzdnF3eXJ4hYWFhYOEhIKCg4KBgYKBgIOBgIB/fn5+foB+fX58f4CAgH+AgX97gH6AgH+BgYB/fYB/fn5/f319fX6AgYKBfn9+fn59fX1/fn9+fH6Af35+fn+Cfn6AgIF/gYOCg4OGhICBfnx9fHx7fHh3e3h1eXd3eXx6e3t9kod9fH13en1+fn19f35+gH98foB/fn19fH19fX19fXt8ent9enp4e3x6ent4dHh1cXJ0cHh4cXmEhYWFg4SDgoODgoGBgoKAgYCAgIB9fn5/gH18fn1/gIGAf3+BgHyAf4B+f4GAf399gH9+f39+fX18gICAgIB+f35+fn18fn9+f358fYB/fn1+gIJ/foCAf36Bg4KCg4WFgoJ+fX17e3x8eXd7eXd4d3d4e3t6e3yFin17end6fH19fHx9fX1/fnx9fn59fXx8fX5+fX18fHt6enx7e3p5enp7enhzd3VxcXNweHdxe4WGhYWDhYKBg4OBgYGBgoCBgICBgH5/fn9/fXx+fYCAgoGAf4GAfX6Af35/gX+Af3+BgH+Af31+fH1/gICAgH9/f35/fnx+f39/f319f399fn6CgYF/gIB/foGDgoKEg4SCgn5+fHx6fHt7eHp6d3N2d3h5e3p7eXp/fnt7d3p8fXx8fH59fH19fH19fXx8fX19fX99fXx9e3l7fHx8enp6enp6eHN2dXBwcm93dnJ7hYeEhYOEgoGDgoKCgYGCgYKAgYGAf4B/f399fX9+f4CBgYF/goF9foF+fn+Af4B/gIKAgIB+fX58f3+BgICAf4B/f4B+fX5+f4B/f39/gH9/f4J/gH9/gIB/gYGAgISBgoKAf39+f3x9fn56fYR9dHx9enp6enx5eXp6hoV3eXx8fHx8fXt8fHx8fX19fHx9fX19fn19fX16eX18fH16enp6enp5c3V1b29xb3d0c3yFhoOEgoOCgYKBgoKCgYKBgoCBgYCAgICAgH59gH+Af4GCgn+CgX+AgX5/gYB/gICAgn+Bf319f35/f4KAgICAgIB/gIB+fn1/gH9/f4B/f39/gH+AgICAgH+AgIGBgYGCgYCAf39/fn1/fnqBkYt6fH18e315e3p6eHmBgXh5e3x8fXx8e3x8fHx9fX18fH18fn1+fn59fHp8fHt8fXt5enp6eXlzdXVvb3Fwd3N0fYWHg4OCg4KAgYCCgoGAgYGBgYKBgYCAgIGAfn6Af4GAgYKCgIKCgICCfoCBgX9/gX+BgIF/fH6Af3+AgoCAgICAf3+AgH5/fX6Afn2AgH9/f3+AgICAgYCAf4CAgYCBgYKCgICAf39/fX5/fIGGiHx8fnt7fnl6e3p7jX53d3l7fHt9fHx8fHt9fH18fX18fXx+fn5/f358enx9e319e3l6e3p5eXN0dW5zcXB4cnV6hYaDg4KDgoCAgIGBgX+CgYKBgoGBgYKAgYF/fn9/gYGCgYKBg4OAgYJ/gYGBf4CAgIB/gX99f4F/gICBgICAf4B+gICAf359f4B+fn+Af39/gH9/gICBf4CBgH+BgIGCgoKAgICAgIB9foB9gIOCe35+e3x9e3p8fHuHeXh4eXx8fH17fHx9fX18fH19fn19fX5+f3+Af317fH18fHx7enl7e3l5c3J1bnZycHhxdXaFhYOEg4KCgICAgoF/gIKCgoKDgYGDgoCCgYB/gICCgoKBg4GEhICBgX6BgoF/gICAgH+Cf36AgYCCgICAgIB/gH+AgIB/fn2Af39/f4GAgH+AgH+AgYF/gICAgIGAgYGBgoGAgYCAgH9/gH5/fX59fn57fXx9e3x8d3h1eHh5e3x8fXx8fHx8fX5/f39/fn19fn9/gIGAf3x9fHx9e3p7eXp8eHpzcnVud3FxenF2d4WFg4SDg4KBgYKDgH+CgYWDg4SBgYOBgoKCgYB/gIKDgoCCgoWDf4CAfoKDgICBgICAf4CAf4GBgIKAf4CBgH9+gICAgICAf4CAgH+AgICAgIB/f4CBgYCAgICAgYGAgoKCgoCCgYGCgYB/f4B/gId+fnx6fXx7fX54d3Z5eXl8fX18fXt8fH19fn5/gIGAfn1+gICAgoGAfH59fX58d3t6ent5eXNxdW53cHV6cXZ5hYWCg4KDg4KDhISAgIKBhoODg4GChICEg4KCgH+CgoSBgYKChIJ/gIB/gYOCgYGBgYCAf4GBgYGAg4F+gIOCf31/goGAgIB+gYCBf4CAgYGBgYCAgIKCgYKBgYCBgYGBgoOCgoOBg4OCgYCBgH+AhH19fXx/fXp9gHp5dnp4eXt7fH19e3x9fX19fn+AgYGAgH+AgICDg4B9f35+fn15eXt6enp5c3J1b3dxd3lzd3uFgoKDgoOEgoOEg4CAgoOGg4ODgoKEgYSDgYKAgIKBg4GCgoGCgX6BgICCgYKBgYOBgICAgICBgoGEgH6Bg4F+f4CDgoCBfoCCg4KAgYGBgoKDgoGBg4KChIGAgYOBgYKEg4OEhIODhIODgYKBgYCCf4B/fYB8enx/e3t3fHl5eXt6fX59fHx8fH1+fn+BgYCAgIGBgYSEgH2Af39/f357e3t6e3p0cHhyeXR2eHR3e4SCg4KDg4SChIODgYKChIaEgoODgoSBhISAg4CBg4KCgoKCgIKAfoGAgIKBgoGCgoKBgIGBgYOCgoOAfoGDgX5/gYSEgYN/goKBg4KCgoGDg4OEgYKEgoOCgoGCgoOBg4SDhISEhISFg4SCgYOCgoOBgYGAgH58fIB8fHh8eXp5enx9f3x7fHx9fX18fICAgICAgYGBgYKBfoGAgICAf3t7e3p6enVweHd5dnV8dXZ8gICDgoODg4OEhISAgoKFhISDg4KDhIGEhYKCgYKDg4GCgoKAgYB9gICBgYKDgoKCgoGAgYKCg4KCg4B/gYOBf4CChIODgoGCgoGDgoKDg4SDg4SAgoSDg4OBgX+Bg4KDhYKEhISEhISDhISChIOEhIKBgoGBgHt+gX59eXx6enp9fHyBfXp8fH19fHp7fn5+gH9/gYGAgICAgIGBgIB/fX18fH18dnJ2eHh2dH52dX2Hh4OChIWDg4SFhICChIWEhIOCg4SEgISFg4KCgoODgoOCgoCCgH2AgIGCg4KCgoKEgoGCgoOEgoKBgICBg4F/gYOFhIOCg4CCgoOCg4ODhIOEg4CCg4KEg4KCfoOBgoSEgoODhISEhIOEhIOEg4WEg4ODgoKAe4CBf3x8fXp6e31/fX9/fHx6fH59fH19fn5/f39/gICAgH9+foCBgICAfnx9fX5/fn18e3h2f3Z2f4SHg4KDhYODhIaEgYKFhoWEhIODhISChIWFgoKDg4SCg4KDgoKBfoCAgoKDgoODg4SCgYKCg4OCg4GBgYGDgX6BhISDg4KEf4GEg4ODgoSDg4SCgIOEg4SDg4KCg4KChIOCg4SEhISEhIWEg4OEhYSEhIOBgoB9gYJ/fXx8e3x8gH19foB+fn1/fnx8fH19fn5/fn+BgYGBgH99fX6BgYB+fn19fX59fX5+f3+AfHyAgYKCg4OGg4SDhoSBgoiHhYSDg4SEhYKEhYWDg4SDhIODgoOCg4F+gYGDg4SCg4OEhIOCg4KEg4ODgoKDgoOBf4GEg4ODgoN/gYWDg4ODhIODhIOAgoSEhYOCgoODg4GEg4GDg4SDhISEhYSEhIWFhYWEg4ODf32BhH99fXx8fHx/gX59fn9/fX99e3x9fX19fX5+f4CBgIGBgH59fH6Cf39+fn5+fX1/f39/gICAf4CEhIODhIWDhIOFf36CiouFhISDgoOFgYaGhoOEhISEhIODg4OEgn+BgYODhYSFhIWEg4KEhISFhIODgoSDhYGBg4SFhYaEgoCDh4SDg4OFhIWFhIGEg4OHgoOCg4GCgYSDgoODhYODhYWEhYWHh4aHhYSEhYSBf4GDf35+fH59fX+BgH9+fHx+f358enx9fX19fX5+fn9/gIGBf319fIB/gH5+fn5+f3+AgYGBgYKAgYWFhIOFhIKEg4aAgoWFi4mEhIOEhYWDh4aGhISEhIWEhISEg4SEgYKDg4OEhIaEhYSDg4SEg3yDhHuBhHd5g4F9hH5+cnWDgoF2foOFgX2BdYF5g39/gH6EhIKDg4KBg4SDg4SFg4SFhoSFhn2EeXx+f4R7hYOAhIOAf359fn19gYOBfXt/fX6Afn18fHx9fX19fH19f4B/gYJ/fX18f4GBgICAgH+BgYGCgYKDg4KChoSEhIaEgYOEhYOEhYSKiIWFhYOFhYSGhoaDhISFhYWEhYWEhIWCgoOEhYWFhoSFhIOEhYWCaICFanx7cXF8gXOGc3R0fYKEdXNxg4Z0cHVyc3SDdnt9dYF/goOAgnZ5hYCDgIR/hYSChYWCaHpyc3N8gHOBg3+Dg32BfX1+fX6Cg4F8f4F9foB9fXx8fHx9fHx8fn1+gH+BgX99fX2AgYKBgYGBgIGBgYKBgoKCgoSHhIWEhYSBgoSGhoOFg4aIhoaFg4aGh4eGh4OFhYaFhIKFhoSFhYOCg4SEhoaGhIaEg4SFhn1xe4FweXZ+g3+CbnlwdXN8dnp5hXKEg3B2eHF2dHR1cnN0dml/gG5yb3R2bnVsd217c26AiHltfXJzdnN2bW14bHB5bHV9f359foGAgX2Afn2Af4B/fX18fHx9fH1+f32Af4CAfnx/foCBgoCBgICAgYCAgIKDgoOEhYiGhoCChYODhIeGg4WFhYaHh4SDhoeIiYaHhIWGiIiFg4WGhYWEhIOFhIKFhoaFhoWEhoWHdnB0e3BydX+HhYNtdW92b3x1coR5eYd4cXR3bndod3pucHaCcoN+b3p5eW1vbnpvb213fXiGcHF6cHJ0ZoF1fm57eXNveX+Af319gX9/fH99fIB+gIB+foCAgYB+fn9/foF/gH9+fYB9f4CBgIB+fn+BgH9/goOCgoSFh4eEfoeEg4OFh4aEhoWFhoaIhISGh4iIhoeEhoaLiYWEhoeHhYOFhYWEgoWFhYWGhoWGhYZxdXByc29zenl+hHSIdHV+iHZugnKEhnluanJ/cW1zd3x/dXR8hH54cXV3bnl1enF2eHV6eYRxam95eHBreXN6b3p3dnZwgYB/fn5/f356fn19f31/f359gIGDg4CCg4GBhIKBgIGBgH1/f4F+f35+f4GAfn6BgoCAgYSHhoODhoSEhYaHhoWFhYWGhoiFhIaFh4aFhoSGhomIhYSJioiFhIaGhYWDhYWEhYaGhoaFg3iLeXKIentwcIWEeIV4eWtzfnl7a3KDh4N6fG17eXl0fYB2bm+AgG90fHV3cXl9fW1+dW+DhYZ6gHJye3x0cG96a3N8bneCgIF+fn99fXt9e3x9fX9/fn1/f4KCf4GDgYGDgYB/gICAfn9+f31/fn1/gH58fYGAfn6Ag4iFhoOFhYWFhoeFhYWFhYeHiIaEhoWHhoaFhIWFhIWFhomJh4aEhoWGhoWGhoSGhoeGhoWGh4eHhoaEhoWGh4iHhYeGhoOHhoWFg4SGhoWGhIaEg4SEhoSEgYSDhISFhIWEhYSGg4aHhYaEhIWHhoSEhYWEhX13hYOEhIOCgX1/fnt8e357fHx9f359fH5+gYB9f4F/f4GAfn5+gH5+f35+fX99fX5/fHt8f358fH+BiYaFhIaGhoWHhoWFhYWGhoeIhoSGhYaGhYWDhIWGhYSGhoaGhYWGhIWGhoaGhYaGh4eGhYeIiIiIhoSHhYaHiIaFiIeIhYeGhoiFhYaGhYaGhYOChYWGhYWDhISEhIWEhYWEhYWEhoeGhoWEhoeGhISFhoOFhIKEg4OFg4OCfYB/e3t8fXt8fH1/fnx8fn2Af31+gH5+gH99fXyAfX5+fn5+f3x9fX57fHx/fHt7fn+Ih4SEiIaGhoeGhYWEhoaGhoiHhIWGh4aFhIODhIaFhIeFhYaFhYaEhYaGh4eFh4aJiIaGiIeIiYiFhIiFhoeGh4aIhoeFh4eGh4WFhoeFh4aFgoOFhoaEhIOEhIOEhoSFhYWGhoSGhoWGhYSGhoWEg4WFgoWHhYOCgoWDhIF+gIB8e319e3x7fX59fHx+fX5+fH9+fX1+fn19fH98fn58fYGAfHx8fXx8fH56e3t9foiHgoWIh4eGhoaGhISGhoeGiIaDhISGhoSFh4OEhYSFh4SFhoaFhoSGhoeHhoaIh4mIhoaIh4iKiIWHiIWHh4aHhoeGh4WIiIeHhYaGh4WHh4WBhISFhoWFhISEg4SFhYaGhoWGhIeGhoeFhYaGhYSDhIOChIeDhIGChISDgYCAgHt7fn17fHx9fXx8fH19fH18fn18fX18fHx9fXx+fXt8gX99fH18fnx8fHp6fHx9iIeChoiHhoeGhoaEhYaFhoaGhYOFhIaFhIiJg4GEg4SGhIaGhoaGhIeHiIiHh4eIioiGh4iHiImIhYiHhYeGhoeHh4WHhoiIh4eFh4eHhYaHhIKEg4SGhYeFhYSDhISFhoaGhoaGh4WFh4WGhYaFhIKDgoODh4GDgIKDg4KCgn+Ae3x+fnx8fH59fH19fH17fHx8fHx8fXt7e318e358e3x/fX18fX1/fXx6ent7fHyIh4KGhoaGh4aGhYSFhoWFhYWEg4WChoSDiId/enqChYaEhoaFh4aEh4eJiIiHhoiKh4aHh4aIiYeFiIeGiIeGhoeHhYeGiIiHhoWHhoeGhoeDg4SEg4aGh4WFhISEhYaGhoaGhYeHhoaHhoaEhoWDg4KCgoOGgYN+goKDgIODf398f35+fHx9f318fX18fXp7e3p7fHx8e3t7fnt7fXt7e358fHx8fX5/fXt6fHp8fYmHg4aFhoWGhoWFhIWFhYWFhIOBhYGGhIKEhHyAhn+ChYWGhYWGhYSHh4iIiIaFiIqHhYeGh4eIh4WIhYaHiIaGh4eGh4aIiIeFhoeGh4WFh4OEhoWEhoaHhoWFg4WFhoaGhoeFh4aHhoeHhYSFhYOBgoGAg4WCg36BgYF/g4F+f35/fX98fH1/fXt9fXx9enp7eXt8fXt7e3t+fHx8fHp7fXx8fHx+fYF8e3t7e3x7iYeEhoSGhIaGhYSFhoWEhIOEgoCDgYWDgYJ/eoSMe4CEhYeGhoaFhIeIh4aHhYWHiYeEh4WHhoiGhYeEhoeIhoaIiIeHhoeIhoSGhoaHhoWHg4SFhIaGhoeFhYSDhYWHhYeGh4WGhoaFhoaEg4SFgYCBgYCDg4OCfYGBgH6DgX5/f4B8f3x9fX59e359fH15enp5e319enp7e318fXx8ent9fHx9fH5+gHx7e3x+fXyIh4WGhYaEhoWFhYWFhYODgYOBgIKBhYKAgH9/fXx7gYSFhoaEhYSDh4eGhoaFhIaJhoKGhIaGhoWFh4aHiImGhYiHiYeGhoeFhIaFhYaFhYeDhIWEiIaGh4WFhIKGhYaFh4aHhIaGhoWFhoODg4WAf4GAgIOBg4B8gYB+foKAfYB/gXx/fH1+fX57fn18fHl5enl6fX15enp7fHt8e3t6e319fH18fn5+fHt7fX59fIiGhYaGhoSFhYSFhYSDgoKAgoGAgICDgX5+foB5en2Ag4SFh4WEg4OHhoOEhYSChYiFgoSDg4WFhYWHh4eIiIWFiIeJh4aFhoWDhoSFh4OEhoSEhYSHhoWGhYaEg4aFhoaGhoaEhYaHhYWGgoKDhH9+gICAgYCDgHuBf31+gn5+gH6Afn99fX59f3t/fXt6eXp6eXp8fXl6ent7enx7e3t7fH19fXx/fn18fH1/fnx7iIWFhoaGhoSFhIWDhYKBgICAgYB+f4KCfX1/f3t/f4KDg4WGhYSDgoaDgYOEgoCFh4WCg4GBg4SEhIaGh4eHhYWIhomHhoSEhIKFg4SGgoOFhISGhIeGhYWFhoOEhYSFhoWGhIOFhYaDhYWBgYODf35/gH9/gIN/fIB9fX+CfYCBfn6Bfn19fX1/e398e3p5enp5enp8eXp6e3t7fXp7e3t8fX59fYB9fXx8fYB/fXyGg4aGhoaFg4SChYKFgYGAf3+AgH5/gIJ8fn9/foCAgoKCg4SDgoGChIGAg4KBgISFhYKBf4CCg4OEhYaIhoWEhYeFh4WFgoOCgYOCgoWBg4WEhYaEhoaHhoaFgoSEg4SGhYWDhISDhIOFhICAgoJ/fX1/fn6AhH57f3x8gIF9gYB9fYN8fn59fX57fnt7enl6enl6ent5enp6e3t8ent8fHx+fn1/gXx9fHx9f4B+gIaEhYWEh4SDg4KGgoOAgYB+fn+AfX9/gnx9f39+fn6BgYKDg4KBgYKCf4CBgoCAgoWEgoB/gIGCgYOFhYeGhISGhoSFg4WBgoGBgoGCg4GChISEhYWGh4eGhYSDg4ODhIaFhIGDgoOChIODgH+AgX59fH5+fH+DfXx+fHyBgH6Cf31/gnx/fn18fHx8e3t6eXp6eXt6enp6enp6e3x5e318fH9/f4GAfX59fX1/gICAhoSEhYSFgoOCgoSCgoCBgH59fn9+fn6AfX2Af35+foGBgoODgoSHgYF+gICBf3+ChIOBf35/gIJ/goWEhoSDg4WFgoSBg4CBgIGBgYKBgIGEg4OGhYWHh4WFhYWCgoKDhYSCgYGBgoCFg4F/foB/fnx8fn18foN9e357fYF/gIN+fYCBf35/fXx8fH17e3p5enl5e3l6enl6ent7e3p7fXx8f3+BgoB+gH+AgH+AgYAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMxMTAyZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmNkYTBiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbwpAQCAtMCwwICsxLDQ2OSBAQAorNSAzMiAwCis1IDMyIDAKKzMzNyAxIDAKKzMyMiAxIDIxMzMzCisyNzkgMSA0MjY2NgorMjgwIDEgNjQwMDAKKzI4MyAxIDg1MzMzCiszMTcgMSAxMDY2NjYKKzMxOCAxIDEyODAwMAorMzIxIDEgMTQ5MzMzCiszMTMgMSAxNzA2NjYKKzMxMiAxIDE5MjAwMAorMzE3IDEgMjEzMzMzCiszMzAgMSAyMzQ2NjYKKzM1MCAxIDI1NjAwMAorMzU1IDEgMjc3MzMzCiszMzMgMSAyOTg2NjYKKzMyNSAxIDMyMDAwMAorMzc2IDEgMzQxMzMzCiszMzUgMSAzNjI2NjYKKzM1MSAxIDM4NDAwMAorMzUwIDEgNDA1MzMzCiszMzkgMSA0MjY2NjYKKzMyOSAxIDQ0ODAwMAorMzUwIDEgNDY5MzMzCiszMzAgMSA0OTA2NjYKKzM1OSAxIDUxMjAwMAorMzE2IDEgNTMzMzMzCiszNDUgMSA1NTQ2NjYKKzM1NyAxIDU3NjAwMAorMzI1IDEgNTk3MzMzCiszMzYgMSA2MTg2NjYKKzMzOSAxIDY0MDAwMAorMzEyIDEgNjYxMzMzCiszNTAgMSA2ODI2NjYKKzMzOCAxIDcwNDAwMAorMzUzIDEgNzI1MzMzCiszNDAgMSA3NDY2NjYKKzMzMiAxIDc2ODAwMAorMzQwIDEgNzg5MzMzCiszMzkgMSA4MTA2NjYKKzMzMyAxIDgzMjAwMAorMzMzIDEgODUzMzMzCiszNDUgMSA4NzQ2NjYKKzM0MCAxIDg5NjAwMAorMzQzIDEgOTE3MzMzCiszMzUgMSA5Mzg2NjYKKzMzOSAxIDk2MDAwMAorMzQyIDEgOTgxMzMzCiszNDggMSAxMDAyNjY2CiszNTAgMSAxMDI0MDAwCiszNTEgMSAxMDQ1MzMzCiszNDIgMSAxMDY2NjY2CiszNjYgMSAxMDg4MDAwCiszNDAgMSAxMTA5MzMzCiszNTQgMSAxMTMwNjY2CiszNDAgMSAxMTUyMDAwCiszMzQgMSAxMTczMzMzCiszMzggMSAxMTk0NjY2CiszNDAgMSAxMjE2MDAwCiszNTEgMSAxMjM3MzMzCiszNDYgMSAxMjU4NjY2CiszMzEgMSAxMjgwMDAwCiszMjEgMSAxMzAxMzMzCiszNDMgMSAxMzIyNjY2CiszNDIgMSAxMzQ0MDAwCiszNDUgMSAxMzY1MzMzCiszMjYgMSAxMzg2NjY2CiszNDIgMSAxNDA4MDAwCiszNTYgMSAxNDI5MzMzCiszNTEgMSAxNDUwNjY2CiszNDMgMSAxNDcyMDAwCiszNDcgMSAxNDkzMzMzCiszNDkgMSAxNTE0NjY2CiszNTAgMSAxNTM2MDAwCiszMzAgMSAxNTU3MzMzCiszNDEgMSAxNTc4NjY2CiszNDAgMSAxNjAwMDAwCiszMzAgMSAxNjIxMzMzCiszNDAgMSAxNjQyNjY2CiszMzUgMSAxNjY0MDAwCiszNDQgMSAxNjg1MzMzCiszNTkgMSAxNzA2NjY2CiszMzcgMSAxNzI4MDAwCiszNDYgMSAxNzQ5MzMzCiszMzAgMSAxNzcwNjY2CiszNTEgMSAxNzkyMDAwCiszNTUgMSAxODEzMzMzCiszNTIgMSAxODM0NjY2CiszMjUgMSAxODU2MDAwCiszNDIgMSAxODc3MzMzCiszMjcgMSAxODk4NjY2CiszNDkgMSAxOTIwMDAwCiszMjYgMSAxOTQxMzMzCiszMzcgMSAxOTYyNjY2CiszNzggMSAxOTg0MDAwCiszMjEgMSAyMDA1MzMzCiszMTkgMSAyMDI2NjY2CiszNDYgMSAyMDQ4MDAwCiszNTIgMSAyMDY5MzMzCiszNDkgMSAyMDkwNjY2CiszMzEgMSAyMTEyMDAwCiszMzAgMSAyMTMzMzMzCiszMjkgMSAyMTU0NjY2CiszMzMgMSAyMTc2MDAwCiszNjcgMSAyMTk3MzMzCiszNjIgMSAyMjE4NjY2CiszMzcgMSAyMjQwMDAwCiszMzcgMSAyMjYxMzMzCiszNjAgMSAyMjgyNjY2CiszMzMgMSAyMzA0MDAwCiszMTcgMSAyMzI1MzMzCiszNDQgMSAyMzQ2NjY2CiszMzUgMSAyMzY4MDAwCiszMzcgMSAyMzg5MzMzCiszNDkgMSAyNDEwNjY2CiszMzYgMSAyNDMyMDAwCiszNDggMSAyNDUzMzMzCiszNDkgMSAyNDc0NjY2CiszNDIgMSAyNDk2MDAwCiszNTkgMSAyNTE3MzMzCiszNDAgMSAyNTM4NjY2CiszNDAgMSAyNTYwMDAwCiszNDggMSAyNTgxMzMzCiszMzQgMSAyNjAyNjY2CiszMjggMSAyNjI0MDAwCiszNDEgMSAyNjQ1MzMzCiszMzkgMSAyNjY2NjY2CiszMzcgMSAyNjg4MDAwCiszNTAgMSAyNzA5MzMzCiszMjYgMSAyNzMwNjY2CiszNjAgMSAyNzUyMDAwCiszNDQgMSAyNzczMzMzCiszNDAgMSAyNzk0NjY2CiszNDMgMSAyODE2MDAwCiszNjEgMSAyODM3MzMzCiszMjkgMSAyODU4NjY2CiszNDUgMSAyODgwMDAwCiszNDUgMSAyOTAxMzMzCiszMzAgMSAyOTIyNjY2CiszNDIgMSAyOTQ0MDAwCiszNDQgMSAyOTY1MzMzCiszMzAgMSAyOTg2NjY2CiszMjkgMSAzMDA4MDAwCiszMzUgMSAzMDI5MzMzCiszNjYgMSAzMDUwNjY2CiszMjggMSAzMDcyMDAwCiszNDkgMSAzMDkzMzMzCiszMzkgMSAzMTE0NjY2CiszNDAgMSAzMTM2MDAwCiszMzUgMSAzMTU3MzMzCiszMjcgMSAzMTc4NjY2CiszNDggMSAzMjAwMDAwCiszMzkgMSAzMjIxMzMzCiszMzQgMSAzMjQyNjY2CiszNTAgMSAzMjY0MDAwCiszMjUgMSAzMjg1MzMzCiszNjEgMSAzMzA2NjY2CiszMzggMSAzMzI4MDAwCiszNTAgMSAzMzQ5MzMzCiszNTMgMSAzMzcwNjY2CiszMjcgMSAzMzkyMDAwCiszNDYgMSAzNDEzMzMzCiszNDggMSAzNDM0NjY2CiszMzkgMSAzNDU2MDAwCiszNDIgMSAzNDc3MzMzCiszMzQgMSAzNDk4NjY2CiszNTAgMSAzNTIwMDAwCiszNTQgMSAzNTQxMzMzCiszNjMgMSAzNTYyNjY2CiszMjIgMSAzNTg0MDAwCiszMzcgMSAzNjA1MzMzCiszNTUgMSAzNjI2NjY2CiszMjkgMSAzNjQ4MDAwCiszMjQgMSAzNjY5MzMzCiszMzggMSAzNjkwNjY2CiszNTYgMSAzNzEyMDAwCiszMzAgMSAzNzMzMzMzCiszMjEgMSAzNzU0NjY2CiszMzcgMSAzNzc2MDAwCiszNDUgMSAzNzk3MzMzCiszMzUgMSAzODE4NjY2CiszNDggMSAzODQwMDAwCiszNDIgMSAzODYxMzMzCiszNDggMSAzODgyNjY2CiszMzUgMSAzOTA0MDAwCiszNDQgMSAzOTI1MzMzCiszNTcgMSAzOTQ2NjY2CiszNjggMSAzOTY4MDAwCiszMjQgMSAzOTg5MzMzCiszNDMgMSA0MDEwNjY2CiszNDEgMSA0MDMyMDAwCiszMjkgMSA0MDUzMzMzCiszNTYgMSA0MDc0NjY2CiszMTcgMSA0MDk2MDAwCiszNTEgMSA0MTE3MzMzCiszNDAgMSA0MTM4NjY2CiszNDAgMSA0MTYwMDAwCiszMzIgMSA0MTgxMzMzCiszNTUgMSA0MjAyNjY2CiszNTcgMSA0MjI0MDAwCiszMjcgMSA0MjQ1MzMzCiszMzggMSA0MjY2NjY2CiszMjMgMSA0Mjg4MDAwCiszNDYgMSA0MzA5MzMzCiszNTIgMSA0MzMwNjY2CiszNDcgMSA0MzUyMDAwCiszNDMgMSA0MzczMzMzCiszMTEgMSA0Mzk0NjY2CiszMzggMSA0NDE2MDAwCiszNjUgMSA0NDM3MzMzCiszNDkgMSA0NDU4NjY2CiszMjcgMSA0NDgwMDAwCiszNTUgMSA0NTAxMzMzCiszMTkgMSA0NTIyNjY2CiszNDkgMSA0NTQ0MDAwCiszNTEgMSA0NTY1MzMzCiszMzcgMSA0NTg2NjY2CiszNDAgMSA0NjA4MDAwCiszNDkgMSA0NjI5MzMzCiszMTYgMSA0NjUwNjY2CiszNDQgMSA0NjcyMDAwCiszMzQgMSA0NjkzMzMzCiszNDQgMSA0NzE0NjY2CiszNDcgMSA0NzM2MDAwCiszNDggMSA0NzU3MzMzCiszMzQgMSA0Nzc4NjY2CiszMzggMSA0ODAwMDAwCiszMzEgMSA0ODIxMzMzCiszNDQgMSA0ODQyNjY2CiszNDIgMSA0ODY0MDAwCiszMzYgMSA0ODg1MzMzCiszMjYgMSA0OTA2NjY2CiszNjQgMSA0OTI4MDAwCiszNTAgMSA0OTQ5MzMzCiszNTAgMSA0OTcwNjY2CiszNjMgMSA0OTkyMDAwCiszNTggMSA1MDEzMzMzCiszMDUgMSA1MDM0NjY2CiszNDQgMSA1MDU2MDAwCiszNDYgMSA1MDc3MzMzCiszNDIgMSA1MDk4NjY2CiszMzAgMSA1MTIwMDAwCiszMTggMSA1MTQxMzMzCiszNjEgMSA1MTYyNjY2CiszNTQgMSA1MTg0MDAwCiszMTMgMSA1MjA1MzMzCiszMzAgMSA1MjI2NjY2CiszNTAgMSA1MjQ4MDAwCiszNDcgMSA1MjY5MzMzCiszNDYgMSA1MjkwNjY2CiszNTcgMSA1MzEyMDAwCiszMjUgMSA1MzMzMzMzCiszMzUgMSA1MzU0NjY2CiszMzEgMSA1Mzc2MDAwCiszNjYgMSA1Mzk3MzMzCiszMjkgMSA1NDE4NjY2CiszNDkgMSA1NDQwMDAwCiszNzEgMSA1NDYxMzMzCiszMjYgMSA1NDgyNjY2CiszMzMgMSA1NTA0MDAwCiszMTkgMSA1NTI1MzMzCiszMjcgMSA1NTQ2NjY2CiszNTMgMSA1NTY4MDAwCiszNTYgMSA1NTg5MzMzCiszNDggMSA1NjEwNjY2CiszMzggMSA1NjMyMDAwCiszMzEgMSA1NjUzMzMzCiszNDEgMSA1Njc0NjY2CiszNjIgMSA1Njk2MDAwCiszMjYgMSA1NzE3MzMzCiszNTkgMSA1NzM4NjY2CiszMTUgMSA1NzYwMDAwCiszNzYgMSA1NzgxMzMzCiszNDMgMSA1ODAyNjY2CiszNTQgMSA1ODI0MDAwCiszNTMgMSA1ODQ1MzMzCiszNDQgMSA1ODY2NjY2CiszMzQgMSA1ODg4MDAwCiszNDUgMSA1OTA5MzMzCiszNTUgMSA1OTMwNjY2CiszMjIgMSA1OTUyMDAwCiszMzQgMSA1OTczMzMzCiszNTMgMSA1OTk0NjY2CiszMzggMSA2MDE2MDAwCiszNTEgMSA2MDM3MzMzCiszMzQgMSA2MDU4NjY2CiszMzkgMSA2MDgwMDAwCiszNDUgMSA2MTAxMzMzCiszNDcgMSA2MTIyNjY2CiszNTUgMSA2MTQ0MDAwCiszMTIgMSA2MTY1MzMzCiszNTIgMSA2MTg2NjY2CiszNTQgMSA2MjA4MDAwCiszMTggMSA2MjI5MzMzCiszNDQgMSA2MjUwNjY2CiszNjMgMSA2MjcyMDAwCiszMjEgMSA2MjkzMzMzCiszMzkgMSA2MzE0NjY2CiszNTYgMSA2MzM2MDAwCiszMzQgMSA2MzU3MzMzCiszNTQgMSA2Mzc4NjY2CiszMjUgMSA2NDAwMDAwCiszMjEgMSA2NDIxMzMzCiszNDEgMSA2NDQyNjY2CiszMzcgMSA2NDY0MDAwCiszNTEgMSA2NDg1MzMzCiszNDMgMSA2NTA2NjY2CiszNDEgMSA2NTI4MDAwCiszNDQgMSA2NTQ5MzMzCiszNDEgMSA2NTcwNjY2CiszNjQgMSA2NTkyMDAwCiszMTkgMSA2NjEzMzMzCiszNDggMSA2NjM0NjY2CiszMzIgMSA2NjU2MDAwCiszMzMgMSA2Njc3MzMzCiszNDMgMSA2Njk4NjY2CiszNDggMSA2NzIwMDAwCiszNDcgMSA2NzQxMzMzCiszNTAgMSA2NzYyNjY2CiszNDIgMSA2Nzg0MDAwCiszNDEgMSA2ODA1MzMzCiszMjYgMSA2ODI2NjY2CiszNTEgMSA2ODQ4MDAwCiszMjkgMSA2ODY5MzMzCiszMjMgMSA2ODkwNjY2CiszNTAgMSA2OTEyMDAwCiszNjEgMSA2OTMzMzMzCiszMjYgMSA2OTU0NjY2CiszNDUgMSA2OTc2MDAwCiszNDUgMSA2OTk3MzMzCiszMTEgMSA3MDE4NjY2CiszNDkgMSA3MDQwMDAwCiszNTggMSA3MDYxMzMzCiszNTIgMSA3MDgyNjY2CiszNDcgMSA3MTA0MDAwCiszNjQgMSA3MTI1MzMzCiszMjggMSA3MTQ2NjY2CiszMTggMSA3MTY4MDAwCiszNTEgMSA3MTg5MzMzCiszNDAgMSA3MjEwNjY2CiszNDEgMSA3MjMyMDAwCiszNTUgMSA3MjUzMzMzCiszMzYgMSA3Mjc0NjY2CiszNTIgMSA3Mjk2MDAwCiszNDEgMSA3MzE3MzMzCiszMzQgMSA3MzM4NjY2CiszNDggMSA3MzYwMDAwCiszNDIgMSA3MzgxMzMzCiszMzUgMSA3NDAyNjY2CiszNDIgMSA3NDI0MDAwCiszNTkgMSA3NDQ1MzMzCiszNDkgMSA3NDY2NjY2CiszMjkgMSA3NDg4MDAwCiszNTYgMSA3NTA5MzMzCisyOTIgMSA3NTMwNjY2CiszMTYgMSA3NTUyMDAwCiszMTggMSA3NTczMzMzCiszMjAgMSA3NTk0NjY2CiszNDIgMSA3NjE2MDAwCisyODUgMSA3NjM3MzMzCiszMjYgMSA3NjU4NjY2CiszNTIgMSA3NjgwMDAwCiszOTIgMSA3NzAxMzMzCiszNjQgMSA3NzIyNjY2CiszODQgMSA3NzQ0MDAwCiszMzQgMSA3NzY1MzMzCiszMTcgMSA3Nzg2NjY2CiszMjYgMSA3ODA4MDAwCiszNzMgMSA3ODI5MzMzCiszNTQgMSA3ODUwNjY2CiszMjkgMSA3ODcyMDAwCiszNDcgMSA3ODkzMzMzCiszNTMgMSA3OTE0NjY2CiszMzggMSA3OTM2MDAwCiszMTcgMSA3OTU3MzMzCiszNTQgMSA3OTc4NjY2CiszNDUgMSA4MDAwMDAwCiszNTAgMSA4MDIxMzMzCiszNTEgMSA4MDQyNjY2CiszMzIgMSA4MDY0MDAwCiszNTggMSA4MDg1MzMzCiszMTUgMSA4MTA2NjY2CiszMzYgMSA4MTI4MDAwCiszNTggMSA4MTQ5MzMzCiszNDMgMSA4MTcwNjY2CiszMTkgMSA4MTkyMDAwCiszNzAgMSA4MjEzMzMzCiszNDQgMSA4MjM0NjY2CiszNjEgMSA4MjU2MDAwCiszNDMgMSA4Mjc3MzMzCiszMzcgMSA4Mjk4NjY2CiszNTQgMSA4MzIwMDAwCiszMzIgMSA4MzQxMzMzCiszNDggMSA4MzYyNjY2CiszMjggMSA4Mzg0MDAwCiszNDUgMSA4NDA1MzMzCiszNDAgMSA4NDI2NjY2CiszNDYgMSA4NDQ4MDAwCiszNDEgMSA4NDY5MzMzCiszNDQgMSA4NDkwNjY2CiszNDIgMSA4NTEyMDAwCiszNDEgMSA4NTMzMzMzCiszNDUgMSA4NTU0NjY2CiszMzcgMSA4NTc2MDAwCiszMzUgMSA4NTk3MzMzCiszMzUgMSA4NjE4NjY2CiszNDAgMSA4NjQwMDAwCiszNDUgMSA4NjYxMzMzCiszNDEgMSA4NjgyNjY2CiszNDIgMSA4NzA0MDAwCiszMzggMSA4NzI1MzMzCiszNDMgMSA4NzQ2NjY2CiszMzYgMSA4NzY4MDAwCiszMzggMSA4Nzg5MzMzCiszNTMgMSA4ODEwNjY2CiszMzkgMSA4ODMyMDAwCiszMjkgMSA4ODUzMzMzCiszNDkgMSA4ODc0NjY2CiszMjMgMSA4ODk2MDAwCiszNTEgMSA4OTE3MzMzCiszNTkgMSA4OTM4NjY2CiszNTcgMSA4OTYwMDAwCiszNDEgMSA4OTgxMzMzCiszMzMgMSA5MDAyNjY2CiszMzUgMSA5MDI0MDAwCiszMjggMSA5MDQ1MzMzCiszNDcgMSA5MDY2NjY2CiszNDMgMSA5MDg4MDAwCiszNjkgMSA5MTA5MzMzCiszMzEgMSA5MTMwNjY2CiszNDQgMSA5MTUyMDAwCiszMzAgMSA5MTczMzMzCiszNDYgMSA5MTk0NjY2CiszMzcgMSA5MjE2MDAwCiszNDEgMSA5MjM3MzMzCiszMzggMSA5MjU4NjY2CiszMjkgMSA5MjgwMDAwCiszNjAgMSA5MzAxMzMzCiszMzYgMSA5MzIyNjY2CiszNDEgMSA5MzQ0MDAwCiszNDEgMSA5MzY1MzMzCiszNDUgMSA5Mzg2NjY2CiszNTEgMSA5NDA4MDAwCiszNDkgMSA5NDI5MzMzCiszMzYgMSA5NDUwNjY2CiszMjYgMSA5NDcyMDAwCiszNDkgMSA5NDkzMzMzCiszNDMgMSA5NTE0NjY2CiszNTcgMSA5NTM2MDAwCiszNDIgMSA5NTU3MzMzCiszMjUgMSA5NTc4NjY2CiszNDYgMSA5NjAwMDAwCiszMjYgMSA5NjIxMzMzCis0MDIgMSA5NjQyNjY2CiszMzEgMSA5NjY0MDAwCiszMzkgMSA5Njg1MzMzCiszNzEgMSA5NzA2NjY2CiszMTQgMSA5NzI4MDAwCiszMTAgMSA5NzQ5MzMzCiszNjQgMSA5NzcwNjY2CiszMzggMSA5NzkyMDAwCiszMzkgMSA5ODEzMzMzCiszMzcgMSA5ODM0NjY2CiszNTUgMSA5ODU2MDAwCiszNTEgMSA5ODc3MzMzCiszMzIgMSA5ODk4NjY2CiszMTYgMSA5OTIwMDAwCis0NzQgMSA5OTQxMzMzCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODJhZjIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpAQCAtMCwwICsxLDQ0MyBAQAorNSAzMiAwCis1IDMyIDAKKzMzNyAxIDAKKzMyMiAxIDIxMzMzCisyNzkgMSA0MjY2NgorNTYzIDEgNjQwMDAKKzYzNSAxIDEwNjY2NgorNjM0IDEgMTQ5MzMzCis2MjkgMSAxOTIwMDAKKzY4MCAxIDIzNDY2NgorNjg4IDEgMjc3MzMzCisxMDM2IDEgMzIwMDAwCisxMDQwIDEgMzg0MDAwCisxMDA5IDEgNDQ4MDAwCisxMDIwIDEgNTEyMDAwCisxMzU3IDEgNTc2MDAwCisxMzUzIDEgNjYxMzMzCisxMzUxIDEgNzQ2NjY2CisxMzUxIDEgODMyMDAwCiszNDMgMSA5MTczMzMKKzMzNSAxIDkzODY2NgorMzM5IDEgOTYwMDAwCiszNDIgMSA5ODEzMzMKKzM0OCAxIDEwMDI2NjYKKzM1MCAxIDEwMjQwMDAKKzM1MSAxIDEwNDUzMzMKKzM0MiAxIDEwNjY2NjYKKzM2NiAxIDEwODgwMDAKKzM0MCAxIDExMDkzMzMKKzM1NCAxIDExMzA2NjYKKzM0MCAxIDExNTIwMDAKKzMzNCAxIDExNzMzMzMKKzMzOCAxIDExOTQ2NjYKKzM0MCAxIDEyMTYwMDAKKzM1MSAxIDEyMzczMzMKKzM0NiAxIDEyNTg2NjYKKzMzMSAxIDEyODAwMDAKKzMyMSAxIDEzMDEzMzMKKzM0MyAxIDEzMjI2NjYKKzM0MiAxIDEzNDQwMDAKKzM0NSAxIDEzNjUzMzMKKzMyNiAxIDEzODY2NjYKKzM0MiAxIDE0MDgwMDAKKzM1NiAxIDE0MjkzMzMKKzM1MSAxIDE0NTA2NjYKKzM0MyAxIDE0NzIwMDAKKzM0NyAxIDE0OTMzMzMKKzM0OSAxIDE1MTQ2NjYKKzM1MCAxIDE1MzYwMDAKKzMzMCAxIDE1NTczMzMKKzM0MSAxIDE1Nzg2NjYKKzM0MCAxIDE2MDAwMDAKKzMzMCAxIDE2MjEzMzMKKzM0MCAxIDE2NDI2NjYKKzMzNSAxIDE2NjQwMDAKKzM0NCAxIDE2ODUzMzMKKzM1OSAxIDE3MDY2NjYKKzMzNyAxIDE3MjgwMDAKKzM0NiAxIDE3NDkzMzMKKzMzMCAxIDE3NzA2NjYKKzM1MSAxIDE3OTIwMDAKKzM1NSAxIDE4MTMzMzMKKzM1MiAxIDE4MzQ2NjYKKzMyNSAxIDE4NTYwMDAKKzM0MiAxIDE4NzczMzMKKzMyNyAxIDE4OTg2NjYKKzM0OSAxIDE5MjAwMDAKKzMyNiAxIDE5NDEzMzMKKzMzNyAxIDE5NjI2NjYKKzM3OCAxIDE5ODQwMDAKKzMyMSAxIDIwMDUzMzMKKzMxOSAxIDIwMjY2NjYKKzM0NiAxIDIwNDgwMDAKKzM1MiAxIDIwNjkzMzMKKzM0OSAxIDIwOTA2NjYKKzMzMSAxIDIxMTIwMDAKKzMzMCAxIDIxMzMzMzMKKzMyOSAxIDIxNTQ2NjYKKzMzMyAxIDIxNzYwMDAKKzM2NyAxIDIxOTczMzMKKzM2MiAxIDIyMTg2NjYKKzMzNyAxIDIyNDAwMDAKKzMzNyAxIDIyNjEzMzMKKzM2MCAxIDIyODI2NjYKKzMzMyAxIDIzMDQwMDAKKzMxNyAxIDIzMjUzMzMKKzM0NCAxIDIzNDY2NjYKKzMzNSAxIDIzNjgwMDAKKzMzNyAxIDIzODkzMzMKKzM0OSAxIDI0MTA2NjYKKzMzNiAxIDI0MzIwMDAKKzM0OCAxIDI0NTMzMzMKKzM0OSAxIDI0NzQ2NjYKKzM0MiAxIDI0OTYwMDAKKzM1OSAxIDI1MTczMzMKKzM0MCAxIDI1Mzg2NjYKKzM0MCAxIDI1NjAwMDAKKzM0OCAxIDI1ODEzMzMKKzMzNCAxIDI2MDI2NjYKKzMyOCAxIDI2MjQwMDAKKzM0MSAxIDI2NDUzMzMKKzMzOSAxIDI2NjY2NjYKKzMzNyAxIDI2ODgwMDAKKzM1MCAxIDI3MDkzMzMKKzMyNiAxIDI3MzA2NjYKKzM2MCAxIDI3NTIwMDAKKzM0NCAxIDI3NzMzMzMKKzM0MCAxIDI3OTQ2NjYKKzM0MyAxIDI4MTYwMDAKKzM2MSAxIDI4MzczMzMKKzMyOSAxIDI4NTg2NjYKKzM0NSAxIDI4ODAwMDAKKzM0NSAxIDI5MDEzMzMKKzMzMCAxIDI5MjI2NjYKKzM0MiAxIDI5NDQwMDAKKzM0NCAxIDI5NjUzMzMKKzMzMCAxIDI5ODY2NjYKKzMyOSAxIDMwMDgwMDAKKzMzNSAxIDMwMjkzMzMKKzM2NiAxIDMwNTA2NjYKKzMyOCAxIDMwNzIwMDAKKzM0OSAxIDMwOTMzMzMKKzMzOSAxIDMxMTQ2NjYKKzM0MCAxIDMxMzYwMDAKKzMzNSAxIDMxNTczMzMKKzMyNyAxIDMxNzg2NjYKKzM0OCAxIDMyMDAwMDAKKzMzOSAxIDMyMjEzMzMKKzMzNCAxIDMyNDI2NjYKKzM1MCAxIDMyNjQwMDAKKzMyNSAxIDMyODUzMzMKKzM2MSAxIDMzMDY2NjYKKzMzOCAxIDMzMjgwMDAKKzM1MCAxIDMzNDkzMzMKKzM1MyAxIDMzNzA2NjYKKzMyNyAxIDMzOTIwMDAKKzM0NiAxIDM0MTMzMzMKKzM0OCAxIDM0MzQ2NjYKKzMzOSAxIDM0NTYwMDAKKzM0MiAxIDM0NzczMzMKKzMzNCAxIDM0OTg2NjYKKzM1MCAxIDM1MjAwMDAKKzM1NCAxIDM1NDEzMzMKKzM2MyAxIDM1NjI2NjYKKzMyMiAxIDM1ODQwMDAKKzMzNyAxIDM2MDUzMzMKKzM1NSAxIDM2MjY2NjYKKzMyOSAxIDM2NDgwMDAKKzMyNCAxIDM2NjkzMzMKKzMzOCAxIDM2OTA2NjYKKzM1NiAxIDM3MTIwMDAKKzMzMCAxIDM3MzMzMzMKKzMyMSAxIDM3NTQ2NjYKKzMzNyAxIDM3NzYwMDAKKzM0NSAxIDM3OTczMzMKKzMzNSAxIDM4MTg2NjYKKzM0OCAxIDM4NDAwMDAKKzM0MiAxIDM4NjEzMzMKKzM0OCAxIDM4ODI2NjYKKzMzNSAxIDM5MDQwMDAKKzM0NCAxIDM5MjUzMzMKKzM1NyAxIDM5NDY2NjYKKzM2OCAxIDM5NjgwMDAKKzMyNCAxIDM5ODkzMzMKKzM0MyAxIDQwMTA2NjYKKzM0MSAxIDQwMzIwMDAKKzMyOSAxIDQwNTMzMzMKKzM1NiAxIDQwNzQ2NjYKKzMxNyAxIDQwOTYwMDAKKzM1MSAxIDQxMTczMzMKKzM0MCAxIDQxMzg2NjYKKzM0MCAxIDQxNjAwMDAKKzMzMiAxIDQxODEzMzMKKzM1NSAxIDQyMDI2NjYKKzM1NyAxIDQyMjQwMDAKKzMyNyAxIDQyNDUzMzMKKzMzOCAxIDQyNjY2NjYKKzMyMyAxIDQyODgwMDAKKzM0NiAxIDQzMDkzMzMKKzM1MiAxIDQzMzA2NjYKKzM0NyAxIDQzNTIwMDAKKzM0MyAxIDQzNzMzMzMKKzMxMSAxIDQzOTQ2NjYKKzMzOCAxIDQ0MTYwMDAKKzM2NSAxIDQ0MzczMzMKKzM0OSAxIDQ0NTg2NjYKKzMyNyAxIDQ0ODAwMDAKKzM1NSAxIDQ1MDEzMzMKKzMxOSAxIDQ1MjI2NjYKKzM0OSAxIDQ1NDQwMDAKKzM1MSAxIDQ1NjUzMzMKKzMzNyAxIDQ1ODY2NjYKKzM0MCAxIDQ2MDgwMDAKKzM0OSAxIDQ2MjkzMzMKKzMxNiAxIDQ2NTA2NjYKKzM0NCAxIDQ2NzIwMDAKKzMzNCAxIDQ2OTMzMzMKKzM0NCAxIDQ3MTQ2NjYKKzM0NyAxIDQ3MzYwMDAKKzM0OCAxIDQ3NTczMzMKKzMzNCAxIDQ3Nzg2NjYKKzMzOCAxIDQ4MDAwMDAKKzMzMSAxIDQ4MjEzMzMKKzM0NCAxIDQ4NDI2NjYKKzM0MiAxIDQ4NjQwMDAKKzMzNiAxIDQ4ODUzMzMKKzMyNiAxIDQ5MDY2NjYKKzM2NCAxIDQ5MjgwMDAKKzM1MCAxIDQ5NDkzMzMKKzM1MCAxIDQ5NzA2NjYKKzM2MyAxIDQ5OTIwMDAKKzM1OCAxIDUwMTMzMzMKKzMwNSAxIDUwMzQ2NjYKKzM0NCAxIDUwNTYwMDAKKzM0NiAxIDUwNzczMzMKKzM0MiAxIDUwOTg2NjYKKzMzMCAxIDUxMjAwMDAKKzMxOCAxIDUxNDEzMzMKKzM2MSAxIDUxNjI2NjYKKzM1NCAxIDUxODQwMDAKKzMxMyAxIDUyMDUzMzMKKzMzMCAxIDUyMjY2NjYKKzM1MCAxIDUyNDgwMDAKKzM0NyAxIDUyNjkzMzMKKzM0NiAxIDUyOTA2NjYKKzM1NyAxIDUzMTIwMDAKKzMyNSAxIDUzMzMzMzMKKzMzNSAxIDUzNTQ2NjYKKzMzMSAxIDUzNzYwMDAKKzM2NiAxIDUzOTczMzMKKzMyOSAxIDU0MTg2NjYKKzM0OSAxIDU0NDAwMDAKKzM3MSAxIDU0NjEzMzMKKzMyNiAxIDU0ODI2NjYKKzMzMyAxIDU1MDQwMDAKKzMxOSAxIDU1MjUzMzMKKzMyNyAxIDU1NDY2NjYKKzM1MyAxIDU1NjgwMDAKKzM1NiAxIDU1ODkzMzMKKzM0OCAxIDU2MTA2NjYKKzMzOCAxIDU2MzIwMDAKKzMzMSAxIDU2NTMzMzMKKzM0MSAxIDU2NzQ2NjYKKzM2MiAxIDU2OTYwMDAKKzMyNiAxIDU3MTczMzMKKzM1OSAxIDU3Mzg2NjYKKzMxNSAxIDU3NjAwMDAKKzM3NiAxIDU3ODEzMzMKKzM0MyAxIDU4MDI2NjYKKzM1NCAxIDU4MjQwMDAKKzM1MyAxIDU4NDUzMzMKKzM0NCAxIDU4NjY2NjYKKzMzNCAxIDU4ODgwMDAKKzM0NSAxIDU5MDkzMzMKKzM1NSAxIDU5MzA2NjYKKzMyMiAxIDU5NTIwMDAKKzMzNCAxIDU5NzMzMzMKKzM1MyAxIDU5OTQ2NjYKKzMzOCAxIDYwMTYwMDAKKzM1MSAxIDYwMzczMzMKKzMzNCAxIDYwNTg2NjYKKzMzOSAxIDYwODAwMDAKKzM0NSAxIDYxMDEzMzMKKzM0NyAxIDYxMjI2NjYKKzM1NSAxIDYxNDQwMDAKKzMxMiAxIDYxNjUzMzMKKzM1MiAxIDYxODY2NjYKKzM1NCAxIDYyMDgwMDAKKzMxOCAxIDYyMjkzMzMKKzM0NCAxIDYyNTA2NjYKKzM2MyAxIDYyNzIwMDAKKzMyMSAxIDYyOTMzMzMKKzMzOSAxIDYzMTQ2NjYKKzM1NiAxIDYzMzYwMDAKKzMzNCAxIDYzNTczMzMKKzM1NCAxIDYzNzg2NjYKKzMyNSAxIDY0MDAwMDAKKzMyMSAxIDY0MjEzMzMKKzM0MSAxIDY0NDI2NjYKKzMzNyAxIDY0NjQwMDAKKzM1MSAxIDY0ODUzMzMKKzM0MyAxIDY1MDY2NjYKKzM0MSAxIDY1MjgwMDAKKzM0NCAxIDY1NDkzMzMKKzM0MSAxIDY1NzA2NjYKKzM2NCAxIDY1OTIwMDAKKzMxOSAxIDY2MTMzMzMKKzM0OCAxIDY2MzQ2NjYKKzMzMiAxIDY2NTYwMDAKKzMzMyAxIDY2NzczMzMKKzM0MyAxIDY2OTg2NjYKKzM0OCAxIDY3MjAwMDAKKzM0NyAxIDY3NDEzMzMKKzM1MCAxIDY3NjI2NjYKKzM0MiAxIDY3ODQwMDAKKzM0MSAxIDY4MDUzMzMKKzMyNiAxIDY4MjY2NjYKKzM1MSAxIDY4NDgwMDAKKzMyOSAxIDY4NjkzMzMKKzMyMyAxIDY4OTA2NjYKKzM1MCAxIDY5MTIwMDAKKzM2MSAxIDY5MzMzMzMKKzMyNiAxIDY5NTQ2NjYKKzM0NSAxIDY5NzYwMDAKKzM0NSAxIDY5OTczMzMKKzMxMSAxIDcwMTg2NjYKKzM0OSAxIDcwNDAwMDAKKzM1OCAxIDcwNjEzMzMKKzM1MiAxIDcwODI2NjYKKzM0NyAxIDcxMDQwMDAKKzM2NCAxIDcxMjUzMzMKKzMyOCAxIDcxNDY2NjYKKzMxOCAxIDcxNjgwMDAKKzM1MSAxIDcxODkzMzMKKzM0MCAxIDcyMTA2NjYKKzM0MSAxIDcyMzIwMDAKKzM1NSAxIDcyNTMzMzMKKzMzNiAxIDcyNzQ2NjYKKzM1MiAxIDcyOTYwMDAKKzM0MSAxIDczMTczMzMKKzMzNCAxIDczMzg2NjYKKzM0OCAxIDczNjAwMDAKKzM0MiAxIDczODEzMzMKKzMzNSAxIDc0MDI2NjYKKzM0MiAxIDc0MjQwMDAKKzM1OSAxIDc0NDUzMzMKKzM0OSAxIDc0NjY2NjYKKzMyOSAxIDc0ODgwMDAKKzM1NiAxIDc1MDkzMzMKKzI5MiAxIDc1MzA2NjYKKzMxNiAxIDc1NTIwMDAKKzMxOCAxIDc1NzMzMzMKKzMyMCAxIDc1OTQ2NjYKKzM0MiAxIDc2MTYwMDAKKzI4NSAxIDc2MzczMzMKKzMyNiAxIDc2NTg2NjYKKzM1MiAxIDc2ODAwMDAKKzM5MiAxIDc3MDEzMzMKKzM2NCAxIDc3MjI2NjYKKzM4NCAxIDc3NDQwMDAKKzMzNCAxIDc3NjUzMzMKKzMxNyAxIDc3ODY2NjYKKzMyNiAxIDc4MDgwMDAKKzM3MyAxIDc4MjkzMzMKKzM1NCAxIDc4NTA2NjYKKzMyOSAxIDc4NzIwMDAKKzM0NyAxIDc4OTMzMzMKKzM1MyAxIDc5MTQ2NjYKKzMzOCAxIDc5MzYwMDAKKzMxNyAxIDc5NTczMzMKKzM1NCAxIDc5Nzg2NjYKKzM0NSAxIDgwMDAwMDAKKzM1MCAxIDgwMjEzMzMKKzM1MSAxIDgwNDI2NjYKKzMzMiAxIDgwNjQwMDAKKzM1OCAxIDgwODUzMzMKKzMxNSAxIDgxMDY2NjYKKzMzNiAxIDgxMjgwMDAKKzM1OCAxIDgxNDkzMzMKKzM0MyAxIDgxNzA2NjYKKzMxOSAxIDgxOTIwMDAKKzM3MCAxIDgyMTMzMzMKKzM0NCAxIDgyMzQ2NjYKKzM2MSAxIDgyNTYwMDAKKzM0MyAxIDgyNzczMzMKKzMzNyAxIDgyOTg2NjYKKzM1NCAxIDgzMjAwMDAKKzMzMiAxIDgzNDEzMzMKKzM0OCAxIDgzNjI2NjYKKzMyOCAxIDgzODQwMDAKKzM0NSAxIDg0MDUzMzMKKzM0MCAxIDg0MjY2NjYKKzM0NiAxIDg0NDgwMDAKKzM0MSAxIDg0NjkzMzMKKzM0NCAxIDg0OTA2NjYKKzM0MiAxIDg1MTIwMDAKKzM0MSAxIDg1MzMzMzMKKzM0NSAxIDg1NTQ2NjYKKzMzNyAxIDg1NzYwMDAKKzMzNSAxIDg1OTczMzMKKzMzNSAxIDg2MTg2NjYKKzM0MCAxIDg2NDAwMDAKKzM0NSAxIDg2NjEzMzMKKzM0MSAxIDg2ODI2NjYKKzM0MiAxIDg3MDQwMDAKKzMzOCAxIDg3MjUzMzMKKzM0MyAxIDg3NDY2NjYKKzMzNiAxIDg3NjgwMDAKKzMzOCAxIDg3ODkzMzMKKzM1MyAxIDg4MTA2NjYKKzMzOSAxIDg4MzIwMDAKKzMyOSAxIDg4NTMzMzMKKzM0OSAxIDg4NzQ2NjYKKzMyMyAxIDg4OTYwMDAKKzM1MSAxIDg5MTczMzMKKzM1OSAxIDg5Mzg2NjYKKzM1NyAxIDg5NjAwMDAKKzM0MSAxIDg5ODEzMzMKKzMzMyAxIDkwMDI2NjYKKzMzNSAxIDkwMjQwMDAKKzMyOCAxIDkwNDUzMzMKKzM0NyAxIDkwNjY2NjYKKzM0MyAxIDkwODgwMDAKKzM2OSAxIDkxMDkzMzMKKzMzMSAxIDkxMzA2NjYKKzM0NCAxIDkxNTIwMDAKKzMzMCAxIDkxNzMzMzMKKzM0NiAxIDkxOTQ2NjYKKzMzNyAxIDkyMTYwMDAKKzM0MSAxIDkyMzczMzMKKzMzOCAxIDkyNTg2NjYKKzMyOSAxIDkyODAwMDAKKzM2MCAxIDkzMDEzMzMKKzMzNiAxIDkzMjI2NjYKKzM0MSAxIDkzNDQwMDAKKzM0MSAxIDkzNjUzMzMKKzM0NSAxIDkzODY2NjYKKzM1MSAxIDk0MDgwMDAKKzM0OSAxIDk0MjkzMzMKKzMzNiAxIDk0NTA2NjYKKzMyNiAxIDk0NzIwMDAKKzM0OSAxIDk0OTMzMzMKKzM0MyAxIDk1MTQ2NjYKKzM1NyAxIDk1MzYwMDAKKzM0MiAxIDk1NTczMzMKKzMyNSAxIDk1Nzg2NjYKKzM0NiAxIDk2MDAwMDAKKzMyNiAxIDk2MjEzMzMKKzQwMiAxIDk2NDI2NjYKKzMzMSAxIDk2NjQwMDAKKzMzOSAxIDk2ODUzMzMKKzM3MSAxIDk3MDY2NjYKKzMxNCAxIDk3MjgwMDAKKzMxMCAxIDk3NDkzMzMKKzM2NCAxIDk3NzA2NjYKKzMzOCAxIDk3OTIwMDAKKzMzOSAxIDk4MTMzMzMKKzMzNyAxIDk4MzQ2NjYKKzM1NSAxIDk4NTYwMDAKKzM1MSAxIDk4NzczMzMKKzMzMiAxIDk4OTg2NjYKKzMxNiAxIDk5MjAwMDAKKzQ3NCAxIDk5NDEzMzMKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YiBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDgyNTkzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhNjFkNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5pbmZvCkBAIC0wLDAgKzEsNDk0IEBACis0MSAxIDAKKzQxIDEgMjAwMDAKKzQxIDEgNDAwMDAKKzQxIDEgNjAwMDAKKzQxIDEgODAwMDAKKzQxIDEgMTAwMDAwCis0MSAxIDEyMDAwMAorNDEgMSAxNDAwMDAKKzQxIDEgMTYwMDAwCis0MSAxIDE4MDAwMAorNDEgMSAyMDAwMDAKKzQxIDEgMjIwMDAwCis0MSAxIDI0MDAwMAorNDEgMSAyNjAwMDAKKzQxIDEgMjgwMDAwCis0MSAxIDMwMDAwMAorNDEgMSAzMjAwMDAKKzQxIDEgMzQwMDAwCis0MSAxIDM2MDAwMAorNDEgMSAzODAwMDAKKzQxIDEgNDAwMDAwCis0MSAxIDQyMDAwMAorNDEgMSA0NDAwMDAKKzQxIDEgNDYwMDAwCis0MSAxIDQ4MDAwMAorNDEgMSA1MDAwMDAKKzQxIDEgNTIwMDAwCis0MSAxIDU0MDAwMAorNDEgMSA1NjAwMDAKKzQxIDEgNTgwMDAwCis0MSAxIDYwMDAwMAorNDEgMSA2MjAwMDAKKzQxIDEgNjQwMDAwCis0MSAxIDY2MDAwMAorNDEgMSA2ODAwMDAKKzQxIDEgNzAwMDAwCis0MSAxIDcyMDAwMAorNDEgMSA3NDAwMDAKKzQxIDEgNzYwMDAwCis0MSAxIDc4MDAwMAorNDEgMSA4MDAwMDAKKzQxIDEgODIwMDAwCis0MSAxIDg0MDAwMAorNDEgMSA4NjAwMDAKKzQxIDEgODgwMDAwCis0MSAxIDkwMDAwMAorNDEgMSA5MjAwMDAKKzQxIDEgOTQwMDAwCis0MSAxIDk2MDAwMAorNDEgMSA5ODAwMDAKKzQxIDEgMTAwMDAwMAorNDEgMSAxMDIwMDAwCis0MSAxIDEwNDAwMDAKKzQxIDEgMTA2MDAwMAorNDEgMSAxMDgwMDAwCis0MSAxIDExMDAwMDAKKzQxIDEgMTEyMDAwMAorNDEgMSAxMTQwMDAwCis0MSAxIDExNjAwMDAKKzQxIDEgMTE4MDAwMAorNDEgMSAxMjAwMDAwCis0MSAxIDEyMjAwMDAKKzQxIDEgMTI0MDAwMAorNDEgMSAxMjYwMDAwCis0MSAxIDEyODAwMDAKKzQxIDEgMTMwMDAwMAorNDEgMSAxMzIwMDAwCis0MSAxIDEzNDAwMDAKKzQxIDEgMTM2MDAwMAorNDEgMSAxMzgwMDAwCis0MSAxIDE0MDAwMDAKKzQxIDEgMTQyMDAwMAorNDEgMSAxNDQwMDAwCis0MSAxIDE0NjAwMDAKKzQxIDEgMTQ4MDAwMAorNDEgMSAxNTAwMDAwCis0MSAxIDE1MjAwMDAKKzQxIDEgMTU0MDAwMAorNDEgMSAxNTYwMDAwCis0MSAxIDE1ODAwMDAKKzQxIDEgMTYwMDAwMAorNDEgMSAxNjIwMDAwCis0MSAxIDE2NDAwMDAKKzQxIDEgMTY2MDAwMAorNDEgMSAxNjgwMDAwCis0MSAxIDE3MDAwMDAKKzQxIDEgMTcyMDAwMAorNDEgMSAxNzQwMDAwCis0MSAxIDE3NjAwMDAKKzQxIDEgMTc4MDAwMAorNDEgMSAxODAwMDAwCis0MSAxIDE4MjAwMDAKKzQxIDEgMTg0MDAwMAorNDEgMSAxODYwMDAwCis0MSAxIDE4ODAwMDAKKzQxIDEgMTkwMDAwMAorNDEgMSAxOTIwMDAwCis0MSAxIDE5NDAwMDAKKzQxIDEgMTk2MDAwMAorNDEgMSAxOTgwMDAwCis0MSAxIDIwMDAwMDAKKzQxIDEgMjAyMDAwMAorNDEgMSAyMDQwMDAwCis0MSAxIDIwNjAwMDAKKzQxIDEgMjA4MDAwMAorNDEgMSAyMTAwMDAwCis0MSAxIDIxMjAwMDAKKzQxIDEgMjE0MDAwMAorNDEgMSAyMTYwMDAwCis0MSAxIDIxODAwMDAKKzQxIDEgMjIwMDAwMAorNDEgMSAyMjIwMDAwCis0MSAxIDIyNDAwMDAKKzQxIDEgMjI2MDAwMAorNDEgMSAyMjgwMDAwCis0MSAxIDIzMDAwMDAKKzQxIDEgMjMyMDAwMAorNDEgMSAyMzQwMDAwCis0MSAxIDIzNjAwMDAKKzQxIDEgMjM4MDAwMAorNDEgMSAyNDAwMDAwCis0MSAxIDI0MjAwMDAKKzQxIDEgMjQ0MDAwMAorNDEgMSAyNDYwMDAwCis0MSAxIDI0ODAwMDAKKzQxIDEgMjUwMDAwMAorNDEgMSAyNTIwMDAwCis0MSAxIDI1NDAwMDAKKzQxIDEgMjU2MDAwMAorNDEgMSAyNTgwMDAwCis0MSAxIDI2MDAwMDAKKzQxIDEgMjYyMDAwMAorNDEgMSAyNjQwMDAwCis0MSAxIDI2NjAwMDAKKzQxIDEgMjY4MDAwMAorNDEgMSAyNzAwMDAwCis0MSAxIDI3MjAwMDAKKzQxIDEgMjc0MDAwMAorNDEgMSAyNzYwMDAwCis0MSAxIDI3ODAwMDAKKzQxIDEgMjgwMDAwMAorNDEgMSAyODIwMDAwCis0MSAxIDI4NDAwMDAKKzQxIDEgMjg2MDAwMAorNDEgMSAyODgwMDAwCis0MSAxIDI5MDAwMDAKKzQxIDEgMjkyMDAwMAorNDEgMSAyOTQwMDAwCis0MSAxIDI5NjAwMDAKKzQxIDEgMjk4MDAwMAorNDEgMSAzMDAwMDAwCis0MSAxIDMwMjAwMDAKKzQxIDEgMzA0MDAwMAorNDEgMSAzMDYwMDAwCis0MSAxIDMwODAwMDAKKzQxIDEgMzEwMDAwMAorNDEgMSAzMTIwMDAwCis0MSAxIDMxNDAwMDAKKzQxIDEgMzE2MDAwMAorNDEgMSAzMTgwMDAwCis0MSAxIDMyMDAwMDAKKzQxIDEgMzIyMDAwMAorNDEgMSAzMjQwMDAwCis0MSAxIDMyNjAwMDAKKzQxIDEgMzI4MDAwMAorNDEgMSAzMzAwMDAwCis0MSAxIDMzMjAwMDAKKzQxIDEgMzM0MDAwMAorNDEgMSAzMzYwMDAwCis0MSAxIDMzODAwMDAKKzQxIDEgMzQwMDAwMAorNDEgMSAzNDIwMDAwCis0MSAxIDM0NDAwMDAKKzQxIDEgMzQ2MDAwMAorNDEgMSAzNDgwMDAwCis0MSAxIDM1MDAwMDAKKzQxIDEgMzUyMDAwMAorNDEgMSAzNTQwMDAwCis0MSAxIDM1NjAwMDAKKzQxIDEgMzU4MDAwMAorNDEgMSAzNjAwMDAwCis0MSAxIDM2MjAwMDAKKzQxIDEgMzY0MDAwMAorNDEgMSAzNjYwMDAwCis0MSAxIDM2ODAwMDAKKzQxIDEgMzcwMDAwMAorNDEgMSAzNzIwMDAwCis0MSAxIDM3NDAwMDAKKzQxIDEgMzc2MDAwMAorNDEgMSAzNzgwMDAwCis0MSAxIDM4MDAwMDAKKzQxIDEgMzgyMDAwMAorNDEgMSAzODQwMDAwCis0MSAxIDM4NjAwMDAKKzQxIDEgMzg4MDAwMAorNDEgMSAzOTAwMDAwCis0MSAxIDM5MjAwMDAKKzQxIDEgMzk0MDAwMAorNDEgMSAzOTYwMDAwCis0MSAxIDM5ODAwMDAKKzQxIDEgNDAwMDAwMAorNDEgMSA0MDIwMDAwCis0MSAxIDQwNDAwMDAKKzQxIDEgNDA2MDAwMAorNDEgMSA0MDgwMDAwCis0MSAxIDQxMDAwMDAKKzQxIDEgNDEyMDAwMAorNDEgMSA0MTQwMDAwCis0MSAxIDQxNjAwMDAKKzQxIDEgNDE4MDAwMAorNDEgMSA0MjAwMDAwCis0MSAxIDQyMjAwMDAKKzQxIDEgNDI0MDAwMAorNDEgMSA0MjYwMDAwCis0MSAxIDQyODAwMDAKKzQxIDEgNDMwMDAwMAorNDEgMSA0MzIwMDAwCis0MSAxIDQzNDAwMDAKKzQxIDEgNDM2MDAwMAorNDEgMSA0MzgwMDAwCis0MSAxIDQ0MDAwMDAKKzQxIDEgNDQyMDAwMAorNDEgMSA0NDQwMDAwCis0MSAxIDQ0NjAwMDAKKzQxIDEgNDQ4MDAwMAorNDEgMSA0NTAwMDAwCis0MSAxIDQ1MjAwMDAKKzQxIDEgNDU0MDAwMAorNDEgMSA0NTYwMDAwCis0MSAxIDQ1ODAwMDAKKzQxIDEgNDYwMDAwMAorNDEgMSA0NjIwMDAwCis0MSAxIDQ2NDAwMDAKKzQxIDEgNDY2MDAwMAorNDEgMSA0NjgwMDAwCis0MSAxIDQ3MDAwMDAKKzQxIDEgNDcyMDAwMAorNDEgMSA0NzQwMDAwCis0MSAxIDQ3NjAwMDAKKzQxIDEgNDc4MDAwMAorNDEgMSA0ODAwMDAwCis0MSAxIDQ4MjAwMDAKKzQxIDEgNDg0MDAwMAorNDEgMSA0ODYwMDAwCis0MSAxIDQ4ODAwMDAKKzQxIDEgNDkwMDAwMAorNDEgMSA0OTIwMDAwCis0MSAxIDQ5NDAwMDAKKzQxIDEgNDk2MDAwMAorNDEgMSA0OTgwMDAwCis0MSAxIDUwMDAwMDAKKzQxIDEgNTAyMDAwMAorNDEgMSA1MDQwMDAwCis0MSAxIDUwNjAwMDAKKzQxIDEgNTA4MDAwMAorNDEgMSA1MTAwMDAwCis0MSAxIDUxMjAwMDAKKzQxIDEgNTE0MDAwMAorNDEgMSA1MTYwMDAwCis0MSAxIDUxODAwMDAKKzQxIDEgNTIwMDAwMAorNDEgMSA1MjIwMDAwCis0MSAxIDUyNDAwMDAKKzQxIDEgNTI2MDAwMAorNDEgMSA1MjgwMDAwCis0MSAxIDUzMDAwMDAKKzQxIDEgNTMyMDAwMAorNDEgMSA1MzQwMDAwCis0MSAxIDUzNjAwMDAKKzQxIDEgNTM4MDAwMAorNDEgMSA1NDAwMDAwCis0MSAxIDU0MjAwMDAKKzQxIDEgNTQ0MDAwMAorNDEgMSA1NDYwMDAwCis0MSAxIDU0ODAwMDAKKzQxIDEgNTUwMDAwMAorNDEgMSA1NTIwMDAwCis0MSAxIDU1NDAwMDAKKzQxIDEgNTU2MDAwMAorNDEgMSA1NTgwMDAwCis0MSAxIDU2MDAwMDAKKzQxIDEgNTYyMDAwMAorNDEgMSA1NjQwMDAwCis0MSAxIDU2NjAwMDAKKzQxIDEgNTY4MDAwMAorNDEgMSA1NzAwMDAwCis0MSAxIDU3MjAwMDAKKzQxIDEgNTc0MDAwMAorNDEgMSA1NzYwMDAwCis0MSAxIDU3ODAwMDAKKzQxIDEgNTgwMDAwMAorNDEgMSA1ODIwMDAwCis0MSAxIDU4NDAwMDAKKzQxIDEgNTg2MDAwMAorNDEgMSA1ODgwMDAwCis0MSAxIDU5MDAwMDAKKzQxIDEgNTkyMDAwMAorNDEgMSA1OTQwMDAwCis0MSAxIDU5NjAwMDAKKzQxIDEgNTk4MDAwMAorNDEgMSA2MDAwMDAwCis0MSAxIDYwMjAwMDAKKzQxIDEgNjA0MDAwMAorNDEgMSA2MDYwMDAwCis0MSAxIDYwODAwMDAKKzQxIDEgNjEwMDAwMAorNDEgMSA2MTIwMDAwCis0MSAxIDYxNDAwMDAKKzQxIDEgNjE2MDAwMAorNDEgMSA2MTgwMDAwCis0MSAxIDYyMDAwMDAKKzQxIDEgNjIyMDAwMAorNDEgMSA2MjQwMDAwCis0MSAxIDYyNjAwMDAKKzQxIDEgNjI4MDAwMAorNDEgMSA2MzAwMDAwCis0MSAxIDYzMjAwMDAKKzQxIDEgNjM0MDAwMAorNDEgMSA2MzYwMDAwCis0MSAxIDYzODAwMDAKKzQxIDEgNjQwMDAwMAorNDEgMSA2NDIwMDAwCis0MSAxIDY0NDAwMDAKKzQxIDEgNjQ2MDAwMAorNDEgMSA2NDgwMDAwCis0MSAxIDY1MDAwMDAKKzQxIDEgNjUyMDAwMAorNDEgMSA2NTQwMDAwCis0MSAxIDY1NjAwMDAKKzQxIDEgNjU4MDAwMAorNDEgMSA2NjAwMDAwCis0MSAxIDY2MjAwMDAKKzQxIDEgNjY0MDAwMAorNDEgMSA2NjYwMDAwCis0MSAxIDY2ODAwMDAKKzQxIDEgNjcwMDAwMAorNDEgMSA2NzIwMDAwCis0MSAxIDY3NDAwMDAKKzQxIDEgNjc2MDAwMAorNDEgMSA2NzgwMDAwCis0MSAxIDY4MDAwMDAKKzQxIDEgNjgyMDAwMAorNDEgMSA2ODQwMDAwCis0MSAxIDY4NjAwMDAKKzQxIDEgNjg4MDAwMAorNDEgMSA2OTAwMDAwCis0MSAxIDY5MjAwMDAKKzQxIDEgNjk0MDAwMAorNDEgMSA2OTYwMDAwCis0MSAxIDY5ODAwMDAKKzQxIDEgNzAwMDAwMAorNDEgMSA3MDIwMDAwCis0MSAxIDcwNDAwMDAKKzQxIDEgNzA2MDAwMAorNDEgMSA3MDgwMDAwCis0MSAxIDcxMDAwMDAKKzQxIDEgNzEyMDAwMAorNDEgMSA3MTQwMDAwCis0MSAxIDcxNjAwMDAKKzQxIDEgNzE4MDAwMAorNDEgMSA3MjAwMDAwCis0MSAxIDcyMjAwMDAKKzQxIDEgNzI0MDAwMAorNDEgMSA3MjYwMDAwCis0MSAxIDcyODAwMDAKKzQxIDEgNzMwMDAwMAorNDEgMSA3MzIwMDAwCis0MSAxIDczNDAwMDAKKzQxIDEgNzM2MDAwMAorNDEgMSA3MzgwMDAwCis0MSAxIDc0MDAwMDAKKzQxIDEgNzQyMDAwMAorNDEgMSA3NDQwMDAwCis0MSAxIDc0NjAwMDAKKzQxIDEgNzQ4MDAwMAorNDEgMSA3NTAwMDAwCis0MSAxIDc1MjAwMDAKKzQxIDEgNzU0MDAwMAorNDEgMSA3NTYwMDAwCis0MSAxIDc1ODAwMDAKKzQxIDEgNzYwMDAwMAorNDEgMSA3NjIwMDAwCis0MSAxIDc2NDAwMDAKKzQxIDEgNzY2MDAwMAorNDEgMSA3NjgwMDAwCis0MSAxIDc3MDAwMDAKKzQxIDEgNzcyMDAwMAorNDEgMSA3NzQwMDAwCis0MSAxIDc3NjAwMDAKKzQxIDEgNzc4MDAwMAorNDEgMSA3ODAwMDAwCis0MSAxIDc4MjAwMDAKKzQxIDEgNzg0MDAwMAorNDEgMSA3ODYwMDAwCis0MSAxIDc4ODAwMDAKKzQxIDEgNzkwMDAwMAorNDEgMSA3OTIwMDAwCis0MSAxIDc5NDAwMDAKKzQxIDEgNzk2MDAwMAorNDEgMSA3OTgwMDAwCis0MSAxIDgwMDAwMDAKKzQxIDEgODAyMDAwMAorNDEgMSA4MDQwMDAwCis0MSAxIDgwNjAwMDAKKzQxIDEgODA4MDAwMAorNDEgMSA4MTAwMDAwCis0MSAxIDgxMjAwMDAKKzQxIDEgODE0MDAwMAorNDEgMSA4MTYwMDAwCis0MSAxIDgxODAwMDAKKzQxIDEgODIwMDAwMAorNDEgMSA4MjIwMDAwCis0MSAxIDgyNDAwMDAKKzQxIDEgODI2MDAwMAorNDEgMSA4MjgwMDAwCis0MSAxIDgzMDAwMDAKKzQxIDEgODMyMDAwMAorNDEgMSA4MzQwMDAwCis0MSAxIDgzNjAwMDAKKzQxIDEgODM4MDAwMAorNDEgMSA4NDAwMDAwCis0MSAxIDg0MjAwMDAKKzQxIDEgODQ0MDAwMAorNDEgMSA4NDYwMDAwCis0MSAxIDg0ODAwMDAKKzQxIDEgODUwMDAwMAorNDEgMSA4NTIwMDAwCis0MSAxIDg1NDAwMDAKKzQxIDEgODU2MDAwMAorNDEgMSA4NTgwMDAwCis0MSAxIDg2MDAwMDAKKzQxIDEgODYyMDAwMAorNDEgMSA4NjQwMDAwCis0MSAxIDg2NjAwMDAKKzQxIDEgODY4MDAwMAorNDEgMSA4NzAwMDAwCis0MSAxIDg3MjAwMDAKKzQxIDEgODc0MDAwMAorNDEgMSA4NzYwMDAwCis0MSAxIDg3ODAwMDAKKzQxIDEgODgwMDAwMAorNDEgMSA4ODIwMDAwCis0MSAxIDg4NDAwMDAKKzQxIDEgODg2MDAwMAorNDEgMSA4ODgwMDAwCis0MSAxIDg5MDAwMDAKKzQxIDEgODkyMDAwMAorNDEgMSA4OTQwMDAwCis0MSAxIDg5NjAwMDAKKzQxIDEgODk4MDAwMAorNDEgMSA5MDAwMDAwCis0MSAxIDkwMjAwMDAKKzQxIDEgOTA0MDAwMAorNDEgMSA5MDYwMDAwCis0MSAxIDkwODAwMDAKKzQxIDEgOTEwMDAwMAorNDEgMSA5MTIwMDAwCis0MSAxIDkxNDAwMDAKKzQxIDEgOTE2MDAwMAorNDEgMSA5MTgwMDAwCis0MSAxIDkyMDAwMDAKKzQxIDEgOTIyMDAwMAorNDEgMSA5MjQwMDAwCis0MSAxIDkyNjAwMDAKKzQxIDEgOTI4MDAwMAorNDEgMSA5MzAwMDAwCis0MSAxIDkzMjAwMDAKKzQxIDEgOTM0MDAwMAorNDEgMSA5MzYwMDAwCis0MSAxIDkzODAwMDAKKzQxIDEgOTQwMDAwMAorNDEgMSA5NDIwMDAwCis0MSAxIDk0NDAwMDAKKzQxIDEgOTQ2MDAwMAorNDEgMSA5NDgwMDAwCis0MSAxIDk1MDAwMDAKKzQxIDEgOTUyMDAwMAorNDEgMSA5NTQwMDAwCis0MSAxIDk1NjAwMDAKKzQxIDEgOTU4MDAwMAorNDEgMSA5NjAwMDAwCis0MSAxIDk2MjAwMDAKKzQxIDEgOTY0MDAwMAorNDEgMSA5NjYwMDAwCis0MSAxIDk2ODAwMDAKKzQxIDEgOTcwMDAwMAorNDEgMSA5NzIwMDAwCis0MSAxIDk3NDAwMDAKKzQxIDEgOTc2MDAwMAorNDEgMSA5NzgwMDAwCis0MSAxIDk4MDAwMDAKKzQxIDEgOTgyMDAwMAorNDEgMSA5ODQwMDAwCis0MSAxIDk4NjAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoel9tdWx0aV9mcmFtZS5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6X211bHRpX2ZyYW1lLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQyMDAwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoel9tdWx0aV9mcmFtZS5pbmZvCkBAIC0wLDAgKzEsNDYwIEBACis0MSAxIDAKKzQxIDEgMjAwMDAKKzgyIDEgNDAwMDAKKzgyIDEgODAwMDAKKzgyIDEgMTIwMDAwCis4MiAxIDE2MDAwMAorODIgMSAyMDAwMDAKKzgyIDEgMjQwMDAwCis4MiAxIDI4MDAwMAorODIgMSAzMjAwMDAKKzgyIDEgMzYwMDAwCisxMjMgMSA0MDAwMDAKKzEyMyAxIDQ2MDAwMAorMTIzIDEgNTIwMDAwCisxMjMgMSA1ODAwMDAKKzEyMyAxIDY0MDAwMAorMTY0IDEgNzAwMDAwCisxNjQgMSA3ODAwMDAKKzE2NCAxIDg2MDAwMAorMTY0IDEgOTQwMDAwCisxNjQgMSAxMDIwMDAwCis0MSAxIDExMDAwMDAKKzQxIDEgMTEyMDAwMAorNDEgMSAxMTQwMDAwCis0MSAxIDExNjAwMDAKKzQxIDEgMTE4MDAwMAorNDEgMSAxMjAwMDAwCis0MSAxIDEyMjAwMDAKKzQxIDEgMTI0MDAwMAorNDEgMSAxMjYwMDAwCis0MSAxIDEyODAwMDAKKzQxIDEgMTMwMDAwMAorNDEgMSAxMzIwMDAwCis0MSAxIDEzNDAwMDAKKzQxIDEgMTM2MDAwMAorNDEgMSAxMzgwMDAwCis0MSAxIDE0MDAwMDAKKzQxIDEgMTQyMDAwMAorNDEgMSAxNDQwMDAwCis0MSAxIDE0NjAwMDAKKzQxIDEgMTQ4MDAwMAorNDEgMSAxNTAwMDAwCis0MSAxIDE1MjAwMDAKKzQxIDEgMTU0MDAwMAorNDEgMSAxNTYwMDAwCis0MSAxIDE1ODAwMDAKKzQxIDEgMTYwMDAwMAorNDEgMSAxNjIwMDAwCis0MSAxIDE2NDAwMDAKKzQxIDEgMTY2MDAwMAorNDEgMSAxNjgwMDAwCis0MSAxIDE3MDAwMDAKKzQxIDEgMTcyMDAwMAorNDEgMSAxNzQwMDAwCis0MSAxIDE3NjAwMDAKKzQxIDEgMTc4MDAwMAorNDEgMSAxODAwMDAwCis0MSAxIDE4MjAwMDAKKzQxIDEgMTg0MDAwMAorNDEgMSAxODYwMDAwCis0MSAxIDE4ODAwMDAKKzQxIDEgMTkwMDAwMAorNDEgMSAxOTIwMDAwCis0MSAxIDE5NDAwMDAKKzQxIDEgMTk2MDAwMAorNDEgMSAxOTgwMDAwCis0MSAxIDIwMDAwMDAKKzQxIDEgMjAyMDAwMAorNDEgMSAyMDQwMDAwCis0MSAxIDIwNjAwMDAKKzQxIDEgMjA4MDAwMAorNDEgMSAyMTAwMDAwCis0MSAxIDIxMjAwMDAKKzQxIDEgMjE0MDAwMAorNDEgMSAyMTYwMDAwCis0MSAxIDIxODAwMDAKKzQxIDEgMjIwMDAwMAorNDEgMSAyMjIwMDAwCis0MSAxIDIyNDAwMDAKKzQxIDEgMjI2MDAwMAorNDEgMSAyMjgwMDAwCis0MSAxIDIzMDAwMDAKKzQxIDEgMjMyMDAwMAorNDEgMSAyMzQwMDAwCis0MSAxIDIzNjAwMDAKKzQxIDEgMjM4MDAwMAorNDEgMSAyNDAwMDAwCis0MSAxIDI0MjAwMDAKKzQxIDEgMjQ0MDAwMAorNDEgMSAyNDYwMDAwCis0MSAxIDI0ODAwMDAKKzQxIDEgMjUwMDAwMAorNDEgMSAyNTIwMDAwCis0MSAxIDI1NDAwMDAKKzQxIDEgMjU2MDAwMAorNDEgMSAyNTgwMDAwCis0MSAxIDI2MDAwMDAKKzQxIDEgMjYyMDAwMAorNDEgMSAyNjQwMDAwCis0MSAxIDI2NjAwMDAKKzQxIDEgMjY4MDAwMAorNDEgMSAyNzAwMDAwCis0MSAxIDI3MjAwMDAKKzQxIDEgMjc0MDAwMAorNDEgMSAyNzYwMDAwCis0MSAxIDI3ODAwMDAKKzQxIDEgMjgwMDAwMAorNDEgMSAyODIwMDAwCis0MSAxIDI4NDAwMDAKKzQxIDEgMjg2MDAwMAorNDEgMSAyODgwMDAwCis0MSAxIDI5MDAwMDAKKzQxIDEgMjkyMDAwMAorNDEgMSAyOTQwMDAwCis0MSAxIDI5NjAwMDAKKzQxIDEgMjk4MDAwMAorNDEgMSAzMDAwMDAwCis0MSAxIDMwMjAwMDAKKzQxIDEgMzA0MDAwMAorNDEgMSAzMDYwMDAwCis0MSAxIDMwODAwMDAKKzQxIDEgMzEwMDAwMAorNDEgMSAzMTIwMDAwCis0MSAxIDMxNDAwMDAKKzQxIDEgMzE2MDAwMAorNDEgMSAzMTgwMDAwCis0MSAxIDMyMDAwMDAKKzQxIDEgMzIyMDAwMAorNDEgMSAzMjQwMDAwCis0MSAxIDMyNjAwMDAKKzQxIDEgMzI4MDAwMAorNDEgMSAzMzAwMDAwCis0MSAxIDMzMjAwMDAKKzQxIDEgMzM0MDAwMAorNDEgMSAzMzYwMDAwCis0MSAxIDMzODAwMDAKKzQxIDEgMzQwMDAwMAorNDEgMSAzNDIwMDAwCis0MSAxIDM0NDAwMDAKKzQxIDEgMzQ2MDAwMAorNDEgMSAzNDgwMDAwCis0MSAxIDM1MDAwMDAKKzQxIDEgMzUyMDAwMAorNDEgMSAzNTQwMDAwCis0MSAxIDM1NjAwMDAKKzQxIDEgMzU4MDAwMAorNDEgMSAzNjAwMDAwCis0MSAxIDM2MjAwMDAKKzQxIDEgMzY0MDAwMAorNDEgMSAzNjYwMDAwCis0MSAxIDM2ODAwMDAKKzQxIDEgMzcwMDAwMAorNDEgMSAzNzIwMDAwCis0MSAxIDM3NDAwMDAKKzQxIDEgMzc2MDAwMAorNDEgMSAzNzgwMDAwCis0MSAxIDM4MDAwMDAKKzQxIDEgMzgyMDAwMAorNDEgMSAzODQwMDAwCis0MSAxIDM4NjAwMDAKKzQxIDEgMzg4MDAwMAorNDEgMSAzOTAwMDAwCis0MSAxIDM5MjAwMDAKKzQxIDEgMzk0MDAwMAorNDEgMSAzOTYwMDAwCis0MSAxIDM5ODAwMDAKKzQxIDEgNDAwMDAwMAorNDEgMSA0MDIwMDAwCis0MSAxIDQwNDAwMDAKKzQxIDEgNDA2MDAwMAorNDEgMSA0MDgwMDAwCis0MSAxIDQxMDAwMDAKKzQxIDEgNDEyMDAwMAorNDEgMSA0MTQwMDAwCis0MSAxIDQxNjAwMDAKKzQxIDEgNDE4MDAwMAorNDEgMSA0MjAwMDAwCis0MSAxIDQyMjAwMDAKKzQxIDEgNDI0MDAwMAorNDEgMSA0MjYwMDAwCis0MSAxIDQyODAwMDAKKzQxIDEgNDMwMDAwMAorNDEgMSA0MzIwMDAwCis0MSAxIDQzNDAwMDAKKzQxIDEgNDM2MDAwMAorNDEgMSA0MzgwMDAwCis0MSAxIDQ0MDAwMDAKKzQxIDEgNDQyMDAwMAorNDEgMSA0NDQwMDAwCis0MSAxIDQ0NjAwMDAKKzQxIDEgNDQ4MDAwMAorNDEgMSA0NTAwMDAwCis0MSAxIDQ1MjAwMDAKKzQxIDEgNDU0MDAwMAorNDEgMSA0NTYwMDAwCis0MSAxIDQ1ODAwMDAKKzQxIDEgNDYwMDAwMAorNDEgMSA0NjIwMDAwCis0MSAxIDQ2NDAwMDAKKzQxIDEgNDY2MDAwMAorNDEgMSA0NjgwMDAwCis0MSAxIDQ3MDAwMDAKKzQxIDEgNDcyMDAwMAorNDEgMSA0NzQwMDAwCis0MSAxIDQ3NjAwMDAKKzQxIDEgNDc4MDAwMAorNDEgMSA0ODAwMDAwCis0MSAxIDQ4MjAwMDAKKzQxIDEgNDg0MDAwMAorNDEgMSA0ODYwMDAwCis0MSAxIDQ4ODAwMDAKKzQxIDEgNDkwMDAwMAorNDEgMSA0OTIwMDAwCis0MSAxIDQ5NDAwMDAKKzQxIDEgNDk2MDAwMAorNDEgMSA0OTgwMDAwCis0MSAxIDUwMDAwMDAKKzQxIDEgNTAyMDAwMAorNDEgMSA1MDQwMDAwCis0MSAxIDUwNjAwMDAKKzQxIDEgNTA4MDAwMAorNDEgMSA1MTAwMDAwCis0MSAxIDUxMjAwMDAKKzQxIDEgNTE0MDAwMAorNDEgMSA1MTYwMDAwCis0MSAxIDUxODAwMDAKKzQxIDEgNTIwMDAwMAorNDEgMSA1MjIwMDAwCis0MSAxIDUyNDAwMDAKKzQxIDEgNTI2MDAwMAorNDEgMSA1MjgwMDAwCis0MSAxIDUzMDAwMDAKKzQxIDEgNTMyMDAwMAorNDEgMSA1MzQwMDAwCis0MSAxIDUzNjAwMDAKKzQxIDEgNTM4MDAwMAorNDEgMSA1NDAwMDAwCis0MSAxIDU0MjAwMDAKKzQxIDEgNTQ0MDAwMAorNDEgMSA1NDYwMDAwCis0MSAxIDU0ODAwMDAKKzQxIDEgNTUwMDAwMAorNDEgMSA1NTIwMDAwCis0MSAxIDU1NDAwMDAKKzQxIDEgNTU2MDAwMAorNDEgMSA1NTgwMDAwCis0MSAxIDU2MDAwMDAKKzQxIDEgNTYyMDAwMAorNDEgMSA1NjQwMDAwCis0MSAxIDU2NjAwMDAKKzQxIDEgNTY4MDAwMAorNDEgMSA1NzAwMDAwCis0MSAxIDU3MjAwMDAKKzQxIDEgNTc0MDAwMAorNDEgMSA1NzYwMDAwCis0MSAxIDU3ODAwMDAKKzQxIDEgNTgwMDAwMAorNDEgMSA1ODIwMDAwCis0MSAxIDU4NDAwMDAKKzQxIDEgNTg2MDAwMAorNDEgMSA1ODgwMDAwCis0MSAxIDU5MDAwMDAKKzQxIDEgNTkyMDAwMAorNDEgMSA1OTQwMDAwCis0MSAxIDU5NjAwMDAKKzQxIDEgNTk4MDAwMAorNDEgMSA2MDAwMDAwCis0MSAxIDYwMjAwMDAKKzQxIDEgNjA0MDAwMAorNDEgMSA2MDYwMDAwCis0MSAxIDYwODAwMDAKKzQxIDEgNjEwMDAwMAorNDEgMSA2MTIwMDAwCis0MSAxIDYxNDAwMDAKKzQxIDEgNjE2MDAwMAorNDEgMSA2MTgwMDAwCis0MSAxIDYyMDAwMDAKKzQxIDEgNjIyMDAwMAorNDEgMSA2MjQwMDAwCis0MSAxIDYyNjAwMDAKKzQxIDEgNjI4MDAwMAorNDEgMSA2MzAwMDAwCis0MSAxIDYzMjAwMDAKKzQxIDEgNjM0MDAwMAorNDEgMSA2MzYwMDAwCis0MSAxIDYzODAwMDAKKzQxIDEgNjQwMDAwMAorNDEgMSA2NDIwMDAwCis0MSAxIDY0NDAwMDAKKzQxIDEgNjQ2MDAwMAorNDEgMSA2NDgwMDAwCis0MSAxIDY1MDAwMDAKKzQxIDEgNjUyMDAwMAorNDEgMSA2NTQwMDAwCis0MSAxIDY1NjAwMDAKKzQxIDEgNjU4MDAwMAorNDEgMSA2NjAwMDAwCis0MSAxIDY2MjAwMDAKKzQxIDEgNjY0MDAwMAorNDEgMSA2NjYwMDAwCis0MSAxIDY2ODAwMDAKKzQxIDEgNjcwMDAwMAorNDEgMSA2NzIwMDAwCis0MSAxIDY3NDAwMDAKKzQxIDEgNjc2MDAwMAorNDEgMSA2NzgwMDAwCis0MSAxIDY4MDAwMDAKKzQxIDEgNjgyMDAwMAorNDEgMSA2ODQwMDAwCis0MSAxIDY4NjAwMDAKKzQxIDEgNjg4MDAwMAorNDEgMSA2OTAwMDAwCis0MSAxIDY5MjAwMDAKKzQxIDEgNjk0MDAwMAorNDEgMSA2OTYwMDAwCis0MSAxIDY5ODAwMDAKKzQxIDEgNzAwMDAwMAorNDEgMSA3MDIwMDAwCis0MSAxIDcwNDAwMDAKKzQxIDEgNzA2MDAwMAorNDEgMSA3MDgwMDAwCis0MSAxIDcxMDAwMDAKKzQxIDEgNzEyMDAwMAorNDEgMSA3MTQwMDAwCis0MSAxIDcxNjAwMDAKKzQxIDEgNzE4MDAwMAorNDEgMSA3MjAwMDAwCis0MSAxIDcyMjAwMDAKKzQxIDEgNzI0MDAwMAorNDEgMSA3MjYwMDAwCis0MSAxIDcyODAwMDAKKzQxIDEgNzMwMDAwMAorNDEgMSA3MzIwMDAwCis0MSAxIDczNDAwMDAKKzQxIDEgNzM2MDAwMAorNDEgMSA3MzgwMDAwCis0MSAxIDc0MDAwMDAKKzQxIDEgNzQyMDAwMAorNDEgMSA3NDQwMDAwCis0MSAxIDc0NjAwMDAKKzQxIDEgNzQ4MDAwMAorNDEgMSA3NTAwMDAwCis0MSAxIDc1MjAwMDAKKzQxIDEgNzU0MDAwMAorNDEgMSA3NTYwMDAwCis0MSAxIDc1ODAwMDAKKzQxIDEgNzYwMDAwMAorNDEgMSA3NjIwMDAwCis0MSAxIDc2NDAwMDAKKzQxIDEgNzY2MDAwMAorNDEgMSA3NjgwMDAwCis0MSAxIDc3MDAwMDAKKzQxIDEgNzcyMDAwMAorNDEgMSA3NzQwMDAwCis0MSAxIDc3NjAwMDAKKzQxIDEgNzc4MDAwMAorNDEgMSA3ODAwMDAwCis0MSAxIDc4MjAwMDAKKzQxIDEgNzg0MDAwMAorNDEgMSA3ODYwMDAwCis0MSAxIDc4ODAwMDAKKzQxIDEgNzkwMDAwMAorNDEgMSA3OTIwMDAwCis0MSAxIDc5NDAwMDAKKzQxIDEgNzk2MDAwMAorNDEgMSA3OTgwMDAwCis0MSAxIDgwMDAwMDAKKzQxIDEgODAyMDAwMAorNDEgMSA4MDQwMDAwCis0MSAxIDgwNjAwMDAKKzQxIDEgODA4MDAwMAorNDEgMSA4MTAwMDAwCis0MSAxIDgxMjAwMDAKKzQxIDEgODE0MDAwMAorNDEgMSA4MTYwMDAwCis0MSAxIDgxODAwMDAKKzQxIDEgODIwMDAwMAorNDEgMSA4MjIwMDAwCis0MSAxIDgyNDAwMDAKKzQxIDEgODI2MDAwMAorNDEgMSA4MjgwMDAwCis0MSAxIDgzMDAwMDAKKzQxIDEgODMyMDAwMAorNDEgMSA4MzQwMDAwCis0MSAxIDgzNjAwMDAKKzQxIDEgODM4MDAwMAorNDEgMSA4NDAwMDAwCis0MSAxIDg0MjAwMDAKKzQxIDEgODQ0MDAwMAorNDEgMSA4NDYwMDAwCis0MSAxIDg0ODAwMDAKKzQxIDEgODUwMDAwMAorNDEgMSA4NTIwMDAwCis0MSAxIDg1NDAwMDAKKzQxIDEgODU2MDAwMAorNDEgMSA4NTgwMDAwCis0MSAxIDg2MDAwMDAKKzQxIDEgODYyMDAwMAorNDEgMSA4NjQwMDAwCis0MSAxIDg2NjAwMDAKKzQxIDEgODY4MDAwMAorNDEgMSA4NzAwMDAwCis0MSAxIDg3MjAwMDAKKzQxIDEgODc0MDAwMAorNDEgMSA4NzYwMDAwCis0MSAxIDg3ODAwMDAKKzQxIDEgODgwMDAwMAorNDEgMSA4ODIwMDAwCis0MSAxIDg4NDAwMDAKKzQxIDEgODg2MDAwMAorNDEgMSA4ODgwMDAwCis0MSAxIDg5MDAwMDAKKzQxIDEgODkyMDAwMAorNDEgMSA4OTQwMDAwCis0MSAxIDg5NjAwMDAKKzQxIDEgODk4MDAwMAorNDEgMSA5MDAwMDAwCis0MSAxIDkwMjAwMDAKKzQxIDEgOTA0MDAwMAorNDEgMSA5MDYwMDAwCis0MSAxIDkwODAwMDAKKzQxIDEgOTEwMDAwMAorNDEgMSA5MTIwMDAwCis0MSAxIDkxNDAwMDAKKzQxIDEgOTE2MDAwMAorNDEgMSA5MTgwMDAwCis0MSAxIDkyMDAwMDAKKzQxIDEgOTIyMDAwMAorNDEgMSA5MjQwMDAwCis0MSAxIDkyNjAwMDAKKzQxIDEgOTI4MDAwMAorNDEgMSA5MzAwMDAwCis0MSAxIDkzMjAwMDAKKzQxIDEgOTM0MDAwMAorNDEgMSA5MzYwMDAwCis0MSAxIDkzODAwMDAKKzQxIDEgOTQwMDAwMAorNDEgMSA5NDIwMDAwCis0MSAxIDk0NDAwMDAKKzQxIDEgOTQ2MDAwMAorNDEgMSA5NDgwMDAwCis0MSAxIDk1MDAwMDAKKzQxIDEgOTUyMDAwMAorNDEgMSA5NTQwMDAwCis0MSAxIDk1NjAwMDAKKzQxIDEgOTU4MDAwMAorNDEgMSA5NjAwMDAwCis0MSAxIDk2MjAwMDAKKzQxIDEgOTY0MDAwMAorNDEgMSA5NjYwMDAwCis0MSAxIDk2ODAwMDAKKzQxIDEgOTcwMDAwMAorNDEgMSA5NzIwMDAwCis0MSAxIDk3NDAwMDAKKzQxIDEgOTc2MDAwMAorNDEgMSA5NzgwMDAwCis0MSAxIDk4MDAwMDAKKzQxIDEgOTgyMDAwMAorNDEgMSA5ODQwMDAwCis0MSAxIDk4NjAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV8xNzZfMTQ0LmF2MSBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV8xNzZfMTQ0LmF2MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDY3YWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzE3Nl8xNDQuYXYxCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV8xNzZfMTQ0LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfMTc2XzE0NC5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNTExNjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfMTc2XzE0NC5pbmZvCkBAIC0wLDAgKzEsMzAwIEBACis2MDI3IDEgMAorNjg3OSAwIDMzMDAwCis1IDAgNjYwMDAKKzUzMiAwIDEwMDAwMAorNSAwIDEzMzAwMAorMjQ1OCAwIDE2NjAwMAorNSAwIDIwMDAwMAorNDc1IDAgMjMzMDAwCis1IDAgMjY2MDAwCisxMjYyIDAgMzAwMDAwCis1IDAgMzMzMDAwCis1NTQgMCAzNjYwMDAKKzI3IDAgNDAwMDAwCis2OTcxIDAgNDMzMDAwCis1IDAgNDY2MDAwCis2MDEgMCA1MDAwMDAKKzUgMCA1MzMwMDAKKzMyNzYgMCA1NjYwMDAKKzUgMCA2MDAwMDAKKzY1OCAwIDYzMzAwMAorNSAwIDY2NjAwMAorMTY4MCAwIDcwMDAwMAorNSAwIDczMzAwMAorNjEwIDAgNzY2MDAwCisyNCAwIDgwMDAwMAorNjcyOCAwIDgzMzAwMAorNSAwIDg2NjAwMAorNzY0IDAgOTAwMDAwCis1IDAgOTMzMDAwCisyNjU2IDAgOTY2MDAwCis1IDAgMTAwMDAwMAorNDYyIDAgMTAzMzAwMAorNSAwIDEwNjYwMDAKKzE0NTkgMCAxMTAwMDAwCis1IDAgMTEzMzAwMAorNjA4IDAgMTE2NjAwMAorMjQgMCAxMjAwMDAwCis3MDM4IDAgMTIzMzAwMAorNSAwIDEyNjYwMDAKKzcyMSAwIDEzMDAwMDAKKzUgMCAxMzMzMDAwCiszMTAyIDAgMTM2NjAwMAorNSAwIDE0MDAwMDAKKzc1MiAwIDE0MzMwMDAKKzUgMCAxNDY2MDAwCisxODE1IDAgMTUwMDAwMAorNSAwIDE1MzMwMDAKKzc1NSAwIDE1NjYwMDAKKzI1IDAgMTYwMDAwMAorNzY1NyAwIDE2MzMwMDAKKzUgMCAxNjY2MDAwCis4NTIgMCAxNzAwMDAwCis1IDAgMTczMzAwMAorMzUzNyAwIDE3NjYwMDAKKzUgMCAxODAwMDAwCis2NzMgMCAxODMzMDAwCis1IDAgMTg2NjAwMAorMTc3NCAwIDE5MDAwMDAKKzUgMCAxOTMzMDAwCis1NTQgMCAxOTY2MDAwCisyNCAwIDIwMDAwMDAKKzgwMjggMCAyMDMzMDAwCis1IDAgMjA2NjAwMAorNzE1IDAgMjEwMDAwMAorNSAwIDIxMzMwMDAKKzMzOTUgMCAyMTY2MDAwCis1IDAgMjIwMDAwMAorNzM2IDAgMjIzMzAwMAorNSAwIDIyNjYwMDAKKzE3NTkgMCAyMzAwMDAwCis1IDAgMjMzMzAwMAorNjA1IDAgMjM2NjAwMAorMjMgMCAyNDAwMDAwCis3NjUxIDAgMjQzMzAwMAorNSAwIDI0NjYwMDAKKzYxOSAwIDI1MDAwMDAKKzUgMCAyNTMzMDAwCisyNzg4IDAgMjU2NjAwMAorNSAwIDI2MDAwMDAKKzU1NiAwIDI2MzMwMDAKKzUgMCAyNjY2MDAwCisxMzM1IDAgMjcwMDAwMAorNSAwIDI3MzMwMDAKKzUyMSAwIDI3NjYwMDAKKzI0IDAgMjgwMDAwMAorMjI3NCAwIDI4MzMwMDAKKzY3NiAwIDI4NjYwMDAKKzI1IDAgMjkwMDAwMAorNjIyNCAwIDI5MzMwMDAKKzU3OTggMCAyOTY2MDAwCis1IDAgMzAwMDAwMAorNDQ4IDAgMzAzMzAwMAorNSAwIDMwNjYwMDAKKzE5NTAgMCAzMTAwMDAwCis1IDAgMzEzMzAwMAorMzg2IDAgMzE2NjAwMAorNSAwIDMyMDAwMDAKKzEyMTggMCAzMjMzMDAwCis1IDAgMzI2NjAwMAorMTMxNiAwIDMzMDAwMDAKKzUgMCAzMzMzMDAwCis1ODAgMCAzMzY2MDAwCisyNiAwIDM0MDAwMDAKKzY2NzMgMCAzNDMzMDAwCis1IDAgMzQ2NjAwMAorNDczIDAgMzUwMDAwMAorNSAwIDM1MzMwMDAKKzI0NjcgMCAzNTY2MDAwCis1IDAgMzYwMDAwMAorNDI5IDAgMzYzMzAwMAorNSAwIDM2NjYwMDAKKzE0MjAgMCAzNzAwMDAwCis1IDAgMzczMzAwMAorNTgzIDAgMzc2NjAwMAorMjkgMCAzODAwMDAwCis4NDkyIDAgMzgzMzAwMAorNSAwIDM4NjYwMDAKKzcyMCAwIDM5MDAwMDAKKzUgMCAzOTMzMDAwCiszNjM1IDAgMzk2NjAwMAorNSAwIDQwMDAwMDAKKzYyMSAwIDQwMzMwMDAKKzUgMCA0MDY2MDAwCisxOTY5IDAgNDEwMDAwMAorNSAwIDQxMzMwMDAKKzQ5IDAgNDE2NjAwMAorMjUgMCA0MjAwMDAwCis3NDE2IDAgNDIzMzAwMAorNSAwIDQyNjYwMDAKKzk0NyAwIDQzMDAwMDAKKzUgMCA0MzMzMDAwCiszNzEzIDAgNDM2NjAwMAorNSAwIDQ0MDAwMDAKKzcxNCAwIDQ0MzMwMDAKKzUgMCA0NDY2MDAwCisyMDAzIDAgNDUwMDAwMAorNSAwIDQ1MzMwMDAKKzc1MCAwIDQ1NjYwMDAKKzI1IDAgNDYwMDAwMAorODQ3MCAwIDQ2MzMwMDAKKzUgMCA0NjY2MDAwCis3MzcgMCA0NzAwMDAwCis1IDAgNDczMzAwMAorNDA5NCAwIDQ3NjYwMDAKKzUgMCA0ODAwMDAwCisxMDE5IDAgNDgzMzAwMAorNSAwIDQ4NjYwMDAKKzIxNjAgMCA0OTAwMDAwCis1IDAgNDkzMzAwMAorODI4IDAgNDk2NjAwMAorMjQgMCA1MDAwMDAwCis5MjgyIDAgNTAzMzAwMAorNSAwIDUwNjYwMDAKKzY1NSAwIDUxMDAwMDAKKzUgMCA1MTMzMDAwCiszNDkxIDAgNTE2NjAwMAorNSAwIDUyMDAwMDAKKzY1MSAwIDUyMzMwMDAKKzUgMCA1MjY2MDAwCisxOTA2IDAgNTMwMDAwMAorNSAwIDUzMzMwMDAKKzY2MiAwIDUzNjYwMDAKKzI0IDAgNTQwMDAwMAorOTcyNCAwIDU0MzMwMDAKKzUgMCA1NDY2MDAwCis2MTcgMCA1NTAwMDAwCis1IDAgNTUzMzAwMAorMzE0NSAwIDU1NjYwMDAKKzUgMCA1NjAwMDAwCis1NzggMCA1NjMzMDAwCis1IDAgNTY2NjAwMAorMTU5MiAwIDU3MDAwMDAKKzUgMCA1NzMzMDAwCis1NjkgMCA1NzY2MDAwCisyNSAwIDU4MDAwMDAKKzEwMDE1IDAgNTgzMzAwMAorNSAwIDU4NjYwMDAKKzYwOSAwIDU5MDAwMDAKKzUgMCA1OTMzMDAwCiszNjE4IDAgNTk2NjAwMAorNSAwIDYwMDAwMDAKKzczNCAwIDYwMzMwMDAKKzUgMCA2MDY2MDAwCisxNzQ4IDAgNjEwMDAwMAorNSAwIDYxMzMwMDAKKzU1MCAwIDYxNjYwMDAKKzI0IDAgNjIwMDAwMAorODgwNiAwIDYyMzMwMDAKKzUgMCA2MjY2MDAwCis0OTggMCA2MzAwMDAwCis1IDAgNjMzMzAwMAorMjkxMyAwIDYzNjYwMDAKKzUgMCA2NDAwMDAwCis1OTcgMCA2NDMzMDAwCis1IDAgNjQ2NjAwMAorMTIzNSAwIDY1MDAwMDAKKzUgMCA2NTMzMDAwCiszNjIgMCA2NTY2MDAwCisyNCAwIDY2MDAwMDAKKzY1OTIgMCA2NjMzMDAwCis1IDAgNjY2NjAwMAorNDY4IDAgNjcwMDAwMAorNSAwIDY3MzMwMDAKKzE5MjAgMCA2NzY2MDAwCis1IDAgNjgwMDAwMAorNDE5IDAgNjgzMzAwMAorNSAwIDY4NjYwMDAKKzg0MyAwIDY5MDAwMDAKKzUgMCA2OTMzMDAwCisyMzcgMCA2OTY2MDAwCisyNCAwIDcwMDAwMDAKKzI2ODcgMCA3MDMzMDAwCis1IDAgNzA2NjAwMAorMzk5IDAgNzEwMDAwMAorNSAwIDcxMzMwMDAKKzIwMCAwIDcxNjYwMDAKKzE0MyAwIDcyMDAwMDAKKzI1IDAgNzIzMzAwMAorMTI2MDMgMCA3MjY2MDAwCisxMTM5IDAgNzMwMDAwMAorNSAwIDczMzMwMDAKKzU2IDAgNzM2NjAwMAorNSAwIDc0MDAwMDAKKzI3MyAwIDc0MzMwMDAKKzUgMCA3NDY2MDAwCis0OCAwIDc1MDAwMDAKKzUgMCA3NTMzMDAwCisxMDIgMCA3NTY2MDAwCis1IDAgNzYwMDAwMAorMzkgMCA3NjMzMDAwCisyNCAwIDc2NjYwMDAKKzM2MzUgMCA3NzAwMDAwCis1IDAgNzczMzAwMAorNDYgMCA3NzY2MDAwCis1IDAgNzgwMDAwMAorNjQ3IDAgNzgzMzAwMAorNSAwIDc4NjYwMDAKKzYxIDAgNzkwMDAwMAorNSAwIDc5MzMwMDAKKzgyNCAwIDc5NjYwMDAKKzUgMCA4MDAwMDAwCis2OTEgMCA4MDMzMDAwCisyNyAwIDgwNjYwMDAKKzQ1NzMgMCA4MTAwMDAwCis1IDAgODEzMzAwMAorNDczIDAgODE2NjAwMAorNSAwIDgyMDAwMDAKKzE2MzcgMCA4MjMzMDAwCis1IDAgODI2NjAwMAorNDUxIDAgODMwMDAwMAorNSAwIDgzMzMwMDAKKzk2OSAwIDgzNjYwMDAKKzUgMCA4NDAwMDAwCisyMzQgMCA4NDMzMDAwCisyNCAwIDg0NjYwMDAKKzMzNjEgMCA4NTAwMDAwCis1IDAgODUzMzAwMAorMTY4IDAgODU2NjAwMAorNSAwIDg2MDAwMDAKKzY2MiAwIDg2MzMwMDAKKzUgMCA4NjY2MDAwCisxMjkgMCA4NzAwMDAwCis1IDAgODczMzAwMAorNDQzIDAgODc2NjAwMAorNSAwIDg4MDAwMDAKKzE4MyAwIDg4MzMwMDAKKzIzIDAgODg2NjAwMAorMjc2OSAwIDg5MDAwMDAKKzUgMCA4OTMzMDAwCisxODIgMCA4OTY2MDAwCis1IDAgOTAwMDAwMAorODkwIDAgOTAzMzAwMAorNSAwIDkwNjYwMDAKKzE3MSAwIDkxMDAwMDAKKzUgMCA5MTMzMDAwCis1OTkgMCA5MTY2MDAwCis1IDAgOTIwMDAwMAorMjM2IDAgOTIzMzAwMAorMjMgMCA5MjY2MDAwCisyMzE2IDAgOTMwMDAwMAorNSAwIDkzMzMwMDAKKzMzMyAwIDkzNjYwMDAKKzUgMCA5NDAwMDAwCis3NTkgMCA5NDMzMDAwCis1IDAgOTQ2NjAwMAorMjEwIDAgOTUwMDAwMAorNSAwIDk1MzMwMDAKKzMyNCAwIDk1NjYwMDAKKzUgMCA5NjAwMDAwCis5OCAwIDk2MzMwMDAKKzIzIDAgOTY2NjAwMAorMTEwNyAwIDk3MDAwMDAKKzUgMCA5NzMzMDAwCis0MiAwIDk3NjYwMDAKKzUgMCA5ODAwMDAwCisxNDUgMCA5ODMzMDAwCis1IDAgOTg2NjAwMAorMTA5IDAgOTkwMDAwMAorODkgMCA5OTMzMDAwCisyNCAwIDk5NjYwMDAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfNjQwXzM2MC5hdjEgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfNjQwXzM2MC5hdjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI5YmFjZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV82NDBfMzYwLmF2MQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfNjQwXzM2MC5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzY0MF8zNjAuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2E3ODMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzY0MF8zNjAuaW5mbwpAQCAtMCwwICsxLDE2NyBAQAorMTI1NzEgMSAwCis5ODgxIDAgMzMwMDAKKzUgMCA2NjAwMAorNTQ0IDAgMTAwMDAwCis1IDAgMTMzMDAwCisyNjQyIDAgMTY2MDAwCis1IDAgMjAwMDAwCis1MzEgMCAyMzMwMDAKKzUgMCAyNjYwMDAKKzEzNTkgMCAzMDAwMDAKKzUgMCAzMzMwMDAKKzU1MSAwIDM2NjAwMAorMjggMCA0MDAwMDAKKzEwNzkxIDAgNDMzMDAwCis1IDAgNDY2MDAwCis2NTUgMCA1MDAwMDAKKzUgMCA1MzMwMDAKKzM3NjkgMCA1NjYwMDAKKzUgMCA2MDAwMDAKKzcxMSAwIDYzMzAwMAorNSAwIDY2NjAwMAorMjAwNCAwIDcwMDAwMAorNSAwIDczMzAwMAorNjU3IDAgNzY2MDAwCisyNiAwIDgwMDAwMAorODk2OSAwIDgzMzAwMAorNSAwIDg2NjAwMAorNjMwIDAgOTAwMDAwCis1IDAgOTMzMDAwCisyNzg3IDAgOTY2MDAwCis1IDAgMTAwMDAwMAorNDA0IDAgMTAzMzAwMAorNSAwIDEwNjYwMDAKKzE1MTggMCAxMTAwMDAwCis1IDAgMTEzMzAwMAorNDkzIDAgMTE2NjAwMAorMjYgMCAxMjAwMDAwCis5OTAwIDAgMTIzMzAwMAorNSAwIDEyNjYwMDAKKzYyMCAwIDEzMDAwMDAKKzUgMCAxMzMzMDAwCiszMDcyIDAgMTM2NjAwMAorNSAwIDE0MDAwMDAKKzY2OCAwIDE0MzMwMDAKKzUgMCAxNDY2MDAwCisxODIxIDAgMTUwMDAwMAorNSAwIDE1MzMwMDAKKzY4MiAwIDE1NjYwMDAKKzI2IDAgMTYwMDAwMAorOTU2MCAwIDE2MzMwMDAKKzUgMCAxNjY2MDAwCis2NjcgMCAxNzAwMDAwCis1IDAgMTczMzAwMAorMzI0OSAwIDE3NjYwMDAKKzUgMCAxODAwMDAwCis1ODkgMCAxODMzMDAwCis1IDAgMTg2NjAwMAorMTgxNiAwIDE5MDAwMDAKKzUgMCAxOTMzMDAwCis1NDggMCAxOTY2MDAwCisyNiAwIDIwMDAwMDAKKzk5MTYgMCAyMDMzMDAwCis1IDAgMjA2NjAwMAorNjI4IDAgMjEwMDAwMAorNSAwIDIxMzMwMDAKKzMwMzQgMCAyMTY2MDAwCis1IDAgMjIwMDAwMAorNTkwIDAgMjIzMzAwMAorNSAwIDIyNjYwMDAKKzE1ODEgMCAyMzAwMDAwCis1IDAgMjMzMzAwMAorNTI0IDAgMjM2NjAwMAorMjYgMCAyNDAwMDAwCis4MTgyIDAgMjQzMzAwMAorNSAwIDI0NjYwMDAKKzU1MiAwIDI1MDAwMDAKKzUgMCAyNTMzMDAwCisyNDEyIDAgMjU2NjAwMAorNSAwIDI2MDAwMDAKKzQ4OSAwIDI2MzMwMDAKKzUgMCAyNjY2MDAwCisxMjI3IDAgMjcwMDAwMAorNSAwIDI3MzMwMDAKKzQzMiAwIDI3NjYwMDAKKzI2IDAgMjgwMDAwMAorMjAxNyAwIDI4MzMwMDAKKzUxNiAwIDI4NjYwMDAKKzI2IDAgMjkwMDAwMAorMTY2MTkgMCAyOTMzMDAwCis2NzEwIDAgMjk2NjAwMAorNSAwIDMwMDAwMDAKKzQyNSAwIDMwMzMwMDAKKzUgMCAzMDY2MDAwCisxOTY0IDAgMzEwMDAwMAorNSAwIDMxMzMwMDAKKzM4NiAwIDMxNjYwMDAKKzUgMCAzMjAwMDAwCisxMTI5IDAgMzIzMzAwMAorNSAwIDMyNjYwMDAKKzExNTYgMCAzMzAwMDAwCis1IDAgMzMzMzAwMAorNDg2IDAgMzM2NjAwMAorMjggMCAzNDAwMDAwCisxMDMwNCAwIDM0MzMwMDAKKzUgMCAzNDY2MDAwCis0MTIgMCAzNTAwMDAwCis1IDAgMzUzMzAwMAorMjYwOCAwIDM1NjYwMDAKKzUgMCAzNjAwMDAwCiszOTcgMCAzNjMzMDAwCis1IDAgMzY2NjAwMAorMTUxNCAwIDM3MDAwMDAKKzUgMCAzNzMzMDAwCis1MzMgMCAzNzY2MDAwCisyNiAwIDM4MDAwMDAKKzExNjk4IDAgMzgzMzAwMAorNSAwIDM4NjYwMDAKKzU0MiAwIDM5MDAwMDAKKzUgMCAzOTMzMDAwCiszMzM0IDAgMzk2NjAwMAorNSAwIDQwMDAwMDAKKzU0NyAwIDQwMzMwMDAKKzUgMCA0MDY2MDAwCisxODA5IDAgNDEwMDAwMAorNSAwIDQxMzMwMDAKKzU1IDAgNDE2NjAwMAorMjYgMCA0MjAwMDAwCis5NDk2IDAgNDIzMzAwMAorNSAwIDQyNjYwMDAKKzY1OCAwIDQzMDAwMDAKKzUgMCA0MzMzMDAwCiszMjMyIDAgNDM2NjAwMAorNSAwIDQ0MDAwMDAKKzYwMCAwIDQ0MzMwMDAKKzUgMCA0NDY2MDAwCisxNzY2IDAgNDUwMDAwMAorNSAwIDQ1MzMwMDAKKzU1MCAwIDQ1NjYwMDAKKzI1IDAgNDYwMDAwMAorOTk1MSAwIDQ2MzMwMDAKKzUgMCA0NjY2MDAwCis2MjQgMCA0NzAwMDAwCis1IDAgNDczMzAwMAorMzYxNyAwIDQ3NjYwMDAKKzUgMCA0ODAwMDAwCis2NDQgMCA0ODMzMDAwCis1IDAgNDg2NjAwMAorMTg0MSAwIDQ5MDAwMDAKKzUgMCA0OTMzMDAwCis2NDkgMCA0OTY2MDAwCisyNSAwIDUwMDAwMDAKKzk5MDEgMCA1MDMzMDAwCis1IDAgNTA2NjAwMAorNTE1IDAgNTEwMDAwMAorNSAwIDUxMzMwMDAKKzI4MTQgMCA1MTY2MDAwCis1IDAgNTIwMDAwMAorNTExIDAgNTIzMzAwMAorNSAwIDUyNjYwMDAKKzE1MjEgMCA1MzAwMDAwCis1IDAgNTMzMzAwMAorNTA5IDAgNTM2NjAwMAorMjYgMCA1NDAwMDAwCisxMDU3OSAwIDU0MzMwMDAKKzUgMCA1NDY2MDAwCis1NzUgMCA1NTAwMDAwCis1IDAgNTUzMzAwMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaDI2NCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaDI2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTFlNzVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5oMjY0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDU2MzA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5pbmZvCkBAIC0wLDAgKzEsNjIgQEAKKzI4IDMyIDAKKzEwIDMyIDAKKzQ3ODAgMSAzMzMzMworOTYwIDAgMTAwMDAwCis0ODAgMCA2NjY2NgorMjQ2IDAgNTAwMDAKKzI2NCAwIDgzMzMzCisxMTYwIDAgMTY2NjY2Cis0MDQgMCAxMzMzMzMKKzIzNyAwIDExNjY2NgorMTkzIDAgMTUwMDAwCis5MzYgMCAyMzMzMzMKKzM4NCAwIDIwMDAwMAorMTk5IDAgMTgzMzMzCisyNzUgMCAyMTY2NjYKKzEwODYgMCAzMDAwMDAKKzUyMCAwIDI2NjY2NgorMzAxIDAgMjUwMDAwCisyNzAgMCAyODMzMzMKKzEyMzIgMCAzNjY2NjYKKzU1OSAwIDMzMzMzMworMjg3IDAgMzE2NjY2CisyNzQgMCAzNTAwMDAKKzEwODQgMCA0MzMzMzMKKzQ4NSAwIDQwMDAwMAorMzA3IDAgMzgzMzMzCisyODQgMCA0MTY2NjYKKzEwNTIgMCA1MDAwMDAKKzUwNCAwIDQ2NjY2NgorMjk4IDAgNDUwMDAwCiszMjcgMCA0ODMzMzMKKzExODkgMCA1NjY2NjYKKzM1OCAwIDUzMzMzMworMTcyIDAgNTE2NjY2CisxODUgMCA1NTAwMDAKKzExMTUgMCA2MzMzMzMKKzQ2MyAwIDYwMDAwMAorMjE4IDAgNTgzMzMzCisyNTUgMCA2MTY2NjYKKzExNTUgMCA3MDAwMDAKKzYyMiAwIDY2NjY2NgorMzU2IDAgNjUwMDAwCiszNDEgMCA2ODMzMzMKKzEyNDAgMCA3NjY2NjYKKzYxMCAwIDczMzMzMworMzQxIDAgNzE2NjY2CiszODAgMCA3NTAwMDAKKzEzMjYgMCA4MzMzMzMKKzYyMCAwIDgwMDAwMAorMzk2IDAgNzgzMzMzCiszNTMgMCA4MTY2NjYKKzExOTYgMCA5MDAwMDAKKzYyMyAwIDg2NjY2NgorMzc1IDAgODUwMDAwCiszNjIgMCA4ODMzMzMKKzExOTIgMCA5NjY2NjYKKzY1NCAwIDkzMzMzMworMzU5IDAgOTE2NjY2CiszNTIgMCA5NTAwMDAKKzgyOCAwIDEwMTY2NjYKKzQzNiAwIDk4MzMzMworNDAxIDAgMTAwMDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5oMjY0IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5oMjY0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOGM2OGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmgyNjQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZjNiOWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmluZm8KQEAgLTAsMCArMSwyNDIgQEAKKzI5IDMyIDAKKzkgMzIgMAorMzg0NjkgMSA2NjY2NgorMzI3MCAwIDIwMDAwMAorNDQzIDAgMTMzMzMzCisyNDYgMCAxMDAwMDAKKzIxNCAwIDE2NjY2NgorMjI4MCAwIDMwMDAwMAorMzY4IDAgMjMzMzMzCisyMzggMCAyNjY2NjYKKzY4OCAwIDQzMzMzMworMjg3IDAgMzY2NjY2CisyMzQgMCAzMzMzMzMKKzE3MiAwIDQwMDAwMAorMTM2MyAwIDU2NjY2NgorMjczIDAgNTAwMDAwCisxNjYgMCA0NjY2NjYKKzE4MiAwIDUzMzMzMworMzczMSAwIDcwMDAwMAorMzQ5IDAgNjMzMzMzCisyMTYgMCA2MDAwMDAKKzIyOSAwIDY2NjY2NgorNjA2MSAwIDgzMzMzMworNDA4IDAgNzY2NjY2CisyNzEgMCA3MzMzMzMKKzI0MSAwIDgwMDAwMAorNzAwNCAwIDk2NjY2NgorNDQyIDAgOTAwMDAwCisyNjEgMCA4NjY2NjYKKzIyOSAwIDkzMzMzMworNzM1NCAwIDExMDAwMDAKKzQwNCAwIDEwMzMzMzMKKzI2NCAwIDEwMDAwMDAKKzE5OCAwIDEwNjY2NjYKKzQ1NDIgMCAxMjMzMzMzCisyODYgMCAxMTY2NjY2CisyMDUgMCAxMTMzMzMzCisxMzEgMCAxMjAwMDAwCiszMzI5IDAgMTMzMzMzMworMjE2IDAgMTI2NjY2NgorMTM2IDAgMTMwMDAwMAorMjM1MyAwIDEzNjY2NjYKKzk4NiAwIDE0MDAwMDAKKzgwOCAwIDE0MzMzMzMKKzMxOCAwIDE0NjY2NjYKKzYyIDAgMTUwMDAwMAorNTU2NDkgMSAxNTMzMzMzCisxNjA2IDAgMTU2NjY2NgorMjkzNSAwIDE2MDAwMDAKKzM1NjQgMCAxNjMzMzMzCiszMzI0IDAgMTY2NjY2NgorNDU0MyAwIDE3MDAwMDAKKzE3NDAgMCAxNzMzMzMzCisyNzM3IDAgMTc2NjY2NgorMjc2MiAwIDE4MDAwMDAKKzMxODUgMCAxODMzMzMzCiszMjM4IDAgMTg2NjY2NgorMzM5NSAwIDE5MDAwMDAKKzM0MjEgMCAxOTMzMzMzCiszNDgyIDAgMTk2NjY2NgorMzM3MCAwIDIwMDAwMDAKKzM2NTYgMCAyMDMzMzMzCiszNTA5IDAgMjA2NjY2NgorMzY4NCAwIDIxMDAwMDAKKzM3MzIgMCAyMTMzMzMzCiszMzY2IDAgMjE2NjY2NgorMzM3NCAwIDIyMDAwMDAKKzMyMDIgMCAyMjMzMzMzCiszNDQ5IDAgMjI2NjY2NgorMzM2MCAwIDIzMDAwMDAKKzMzNzIgMCAyMzMzMzMzCiszNDYwIDAgMjM2NjY2NgorMzUxMSAwIDI0MDAwMDAKKzM0NzEgMCAyNDMzMzMzCiszMzMwIDAgMjQ2NjY2NgorMzM3NyAwIDI1MDAwMDAKKzM3NDQgMCAyNTMzMzMzCiszNjY3IDAgMjU2NjY2NgorMzg2NyAwIDI2MDAwMDAKKzM3NzYgMCAyNjMzMzMzCiszMzI5IDAgMjY2NjY2NgorMzg3NiAwIDI3MDAwMDAKKzMzODUgMCAyNzMzMzMzCiszNTY2IDAgMjc2NjY2NgorMzMwMSAwIDI4MDAwMDAKKzM1NzAgMCAyODMzMzMzCiszMTMyIDAgMjg2NjY2NgorMzQ4NyAwIDI5MDAwMDAKKzMyNzAgMCAyOTMzMzMzCiszNDcyIDAgMjk2NjY2NgorMzQ4NyAwIDMwMDAwMDAKKzM1MDMgMCAzMDMzMzMzCiszNDQzIDAgMzA2NjY2NgorMzUyOCAwIDMxMDAwMDAKKzMyNTggMCAzMTMzMzMzCiszNzA3IDAgMzE2NjY2NgorMzEyMCAwIDMyMDAwMDAKKzMzNDcgMCAzMjMzMzMzCiszMzcyIDAgMzI2NjY2NgorMzE2MSAwIDMzMDAwMDAKKzMzOTMgMCAzMzMzMzMzCiszMzk5IDAgMzM2NjY2NgorMjkwNSAwIDM0MDAwMDAKKzM1NDMgMCAzNDMzMzMzCiszMTAzIDAgMzQ2NjY2NgorMzA5OSAwIDM1MDAwMDAKKzM0NTcgMCAzNTMzMzMzCiszMTkxIDAgMzU2NjY2NgorMzI5MCAwIDM2MDAwMDAKKzMzMTIgMCAzNjMzMzMzCisyOTU1IDAgMzY2NjY2NgorMzM0MSAwIDM3MDAwMDAKKzMxMDIgMCAzNzMzMzMzCiszMTg2IDAgMzc2NjY2NgorMzE4MCAwIDM4MDAwMDAKKzI4MzkgMCAzODMzMzMzCiszMDg5IDAgMzg2NjY2NgorMzExMCAwIDM5MDAwMDAKKzMxNjUgMCAzOTMzMzMzCisyNjg0IDAgMzk2NjY2NgorMzA4MiAwIDQwMDAwMDAKKzI2OTQgMCA0MDMzMzMzCiszMDUxIDAgNDA2NjY2NgorMzAwMiAwIDQxMDAwMDAKKzI5MjkgMCA0MTMzMzMzCisyNjc2IDAgNDE2NjY2NgorMjQxMSAwIDQyMDAwMDAKKzI4NzQgMCA0MjMzMzMzCisyNTcyIDAgNDI2NjY2NgorMjQyMCAwIDQzMDAwMDAKKzI1MDAgMCA0MzMzMzMzCisyMTM3IDAgNDM2NjY2NgorMjM0NCAwIDQ0MDAwMDAKKzIwMjggMCA0NDMzMzMzCisxNzU0IDAgNDQ2NjY2NgorMTYyNyAwIDQ1MDAwMDAKKzEzNzUgMCA0NTMzMzMzCisxMDY5IDAgNDU2NjY2NgorODAxIDAgNDYwMDAwMAorMjE2ODkgMSA0NjMzMzMzCisyNjEgMCA0NzMzMzMzCis3NiAwIDQ2NjY2NjYKKzQ1IDAgNDcwMDAwMAorMzM0IDAgNDgwMDAwMAorNjEgMCA0NzY2NjY2CisxNTc3IDAgNDkzMzMzMworMjgwIDAgNDg2NjY2NgorNzIgMCA0ODMzMzMzCis0NzkgMCA0OTAwMDAwCisyMTgxIDAgNTA2NjY2NgorOTE5IDAgNTAwMDAwMAorMzQ5IDAgNDk2NjY2NgorNTM0IDAgNTAzMzMzMworNDg2MCAwIDUxNjY2NjYKKzc1OSAwIDUxMDAwMDAKKzY3NyAwIDUxMzMzMzMKKzMxMDEgMCA1MzAwMDAwCis0OTggMCA1MjMzMzMzCiszMjcgMCA1MjAwMDAwCisyMTMgMCA1MjY2NjY2CisxNjQwIDAgNTQzMzMzMworMjU5IDAgNTM2NjY2NgorMTYyIDAgNTMzMzMzMworMTQ4IDAgNTQwMDAwMAorMjEzMCAwIDU1NjY2NjYKKzM5NyAwIDU1MDAwMDAKKzE5MSAwIDU0NjY2NjYKKzE4MCAwIDU1MzMzMzMKKzE3NTcgMCA1NzAwMDAwCiszMzggMCA1NjMzMzMzCisxOTQgMCA1NjAwMDAwCisxNDEgMCA1NjY2NjY2CisxMTAzIDAgNTgzMzMzMworMjg5IDAgNTc2NjY2NgorMTQ5IDAgNTczMzMzMworMTQ4IDAgNTgwMDAwMAorMzkxNCAwIDU5NjY2NjYKKzEwMjUgMCA1OTAwMDAwCis3MTQgMCA1ODY2NjY2Cis0MjggMCA1OTMzMzMzCis0NjA0IDAgNjEwMDAwMAorMTQ1NiAwIDYwMzMzMzMKKzY5OSAwIDYwMDAwMDAKKzg5MiAwIDYwNjY2NjYKKzQ1MzUgMCA2MjMzMzMzCisxMzAxIDAgNjE2NjY2NgorNzA4IDAgNjEzMzMzMworNTkyIDAgNjIwMDAwMAorMjE3NSAwIDYzMzMzMzMKKzYwMyAwIDYyNjY2NjYKKzQxMSAwIDYzMDAwMDAKKzE4MTMgMCA2MzY2NjY2Cis1MDU1IDAgNjQ2NjY2NgorMTUzOCAwIDY0MDAwMDAKKzIyMDEgMCA2NDMzMzMzCis2MjQ5IDAgNjUzMzMzMworMTQyMCAwIDY1MDAwMDAKKzIyNTQgMCA2NTY2NjY2CisyNDQxIDAgNjYzMzMzMworMjkzIDAgNjYwMDAwMAorMjA2MiAwIDY3MDAwMDAKKzIxMyAwIDY2NjY2NjYKKzI0NTUgMCA2ODAwMDAwCiszNDQgMCA2NzMzMzMzCisyMDQgMCA2NzY2NjY2CiszOTIwIDAgNjkzMzMzMworNzUxIDAgNjg2NjY2NgorMzc2IDAgNjgzMzMzMworMzM3IDAgNjkwMDAwMAorMjg4MiAwIDcwNjY2NjYKKzQ1NyAwIDcwMDAwMDAKKzIyMiAwIDY5NjY2NjYKKzE4NCAwIDcwMzMzMzMKKzI3MzQgMCA3MjAwMDAwCis0NzIgMCA3MTMzMzMzCisxODUgMCA3MTAwMDAwCisyNTAgMCA3MTY2NjY2CisyNzM1IDAgNzMzMzMzMworMzAxIDAgNzI2NjY2NgorMzA3IDAgNzIzMzMzMworMTA5IDAgNzMwMDAwMAorMTg1MiAwIDc0NjY2NjYKKzMyMiAwIDc0MDAwMDAKKzE1MyAwIDczNjY2NjYKKzE5NSAwIDc0MzMzMzMKKzE1MDYgMCA3NjAwMDAwCiszNTAgMCA3NTMzMzMzCisxNzAgMCA3NTAwMDAwCisxNDUgMCA3NTY2NjY2CisyMTIzIDAgNzczMzMzMworNDMwIDAgNzY2NjY2NgorMzY0IDAgNzYzMzMzMworMTkwIDAgNzcwMDAwMAorMTI5NiAwIDc4MDAwMDAKKzE5NiAwIDc3NjY2NjYKKzg1OCAwIDc4MzMzMzMKKzM4NjUgMCA3OTMzMzMzCis2OTMgMCA3ODY2NjY2CisxNjA2IDAgNzkwMDAwMAorNDg4NCAwIDc5NjY2NjYKKzI4MjEgMCA4MDMzMzMzCisyMjExIDAgODAwMDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmZsYWMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouZmxhYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjk0ZDhlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmZsYWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzU1Mjk1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmluZm8KQEAgLTAsMCArMSw0MTUgQEAKKzQyIDMyIDAKKzEzODYgMSAwCisyNDAxIDEgMjQwMDAKKzIzMjEgMSA0ODAwMAorMjM2NyAxIDcyMDAwCisyMzcwIDEgOTYwMDAKKzIzMzQgMSAxMjAwMDAKKzIzOTYgMSAxNDQwMDAKKzIzNzUgMSAxNjgwMDAKKzI0MzEgMSAxOTIwMDAKKzI0MjggMSAyMTYwMDAKKzIzMzQgMSAyNDAwMDAKKzIyNjEgMSAyNjQwMDAKKzIxMjQgMSAyODgwMDAKKzIxNTIgMSAzMTIwMDAKKzIyOTUgMSAzMzYwMDAKKzIxODMgMSAzNjAwMDAKKzIzOTMgMSAzODQwMDAKKzI0MDAgMSA0MDgwMDAKKzIyNDYgMSA0MzIwMDAKKzIyODkgMSA0NTYwMDAKKzI0MDAgMSA0ODAwMDAKKzIzMzUgMSA1MDQwMDAKKzIyOTQgMSA1MjgwMDAKKzIyNjAgMSA1NTIwMDAKKzIyMDYgMSA1NzYwMDAKKzIxODUgMSA2MDAwMDAKKzIxNTUgMSA2MjQwMDAKKzIxMTggMSA2NDgwMDAKKzIwOTQgMSA2NzIwMDAKKzIwNTAgMSA2OTYwMDAKKzIwNTkgMSA3MjAwMDAKKzIwMzAgMSA3NDQwMDAKKzIwMjIgMSA3NjgwMDAKKzIwNzggMSA3OTIwMDAKKzIwODIgMSA4MTYwMDAKKzIwOTQgMSA4NDAwMDAKKzIxMTEgMSA4NjQwMDAKKzIwNDMgMSA4ODgwMDAKKzIwMjMgMSA5MTIwMDAKKzIwMjQgMSA5MzYwMDAKKzIwNTYgMSA5NjAwMDAKKzIxMDggMSA5ODQwMDAKKzIxMzggMSAxMDA4MDAwCisyMTQwIDEgMTAzMjAwMAorMjExMSAxIDEwNTYwMDAKKzIxMTAgMSAxMDgwMDAwCisyMTM3IDEgMTEwNDAwMAorMjE1NyAxIDExMjgwMDAKKzIxNzQgMSAxMTUyMDAwCisyMjAwIDEgMTE3NjAwMAorMjIwMyAxIDEyMDAwMDAKKzIyMzcgMSAxMjI0MDAwCisyMjYxIDEgMTI0ODAwMAorMjIxNSAxIDEyNzIwMDAKKzIxMzMgMSAxMjk2MDAwCisyMDkxIDEgMTMyMDAwMAorMjA4OCAxIDEzNDQwMDAKKzIxMjIgMSAxMzY4MDAwCisyMTM5IDEgMTM5MjAwMAorMjE0NiAxIDE0MTYwMDAKKzIyMzEgMSAxNDQwMDAwCisyMjgyIDEgMTQ2NDAwMAorMjI3MyAxIDE0ODgwMDAKKzIzMDQgMSAxNTEyMDAwCisyMjkyIDEgMTUzNjAwMAorMjI1NSAxIDE1NjAwMDAKKzIxODEgMSAxNTg0MDAwCisyMDgxIDEgMTYwODAwMAorMjAxMiAxIDE2MzIwMDAKKzIwMTEgMSAxNjU2MDAwCisyMDY2IDEgMTY4MDAwMAorMjA2OSAxIDE3MDQwMDAKKzIxMjAgMSAxNzI4MDAwCisyMTQxIDEgMTc1MjAwMAorMjE0OCAxIDE3NzYwMDAKKzIxODEgMSAxODAwMDAwCisyMTc2IDEgMTgyNDAwMAorMjI0MCAxIDE4NDgwMDAKKzIyOTcgMSAxODcyMDAwCisyMzI1IDEgMTg5NjAwMAorMjMzNiAxIDE5MjAwMDAKKzIzMjkgMSAxOTQ0MDAwCisyMjk5IDEgMTk2ODAwMAorMjMyMiAxIDE5OTIwMDAKKzIzNDcgMSAyMDE2MDAwCisyMjg3IDEgMjA0MDAwMAorMjI4NiAxIDIwNjQwMDAKKzIyNjkgMSAyMDg4MDAwCisyMzIwIDEgMjExMjAwMAorMjMwNSAxIDIxMzYwMDAKKzIzODQgMSAyMTYwMDAwCisyNDI5IDEgMjE4NDAwMAorMjM3MCAxIDIyMDgwMDAKKzIzNjUgMSAyMjMyMDAwCisyMzYxIDEgMjI1NjAwMAorMjM3MCAxIDIyODAwMDAKKzIzOTMgMSAyMzA0MDAwCisyMzQyIDEgMjMyODAwMAorMjMyNSAxIDIzNTIwMDAKKzIzMzQgMSAyMzc2MDAwCisyMzE2IDEgMjQwMDAwMAorMjMxNyAxIDI0MjQwMDAKKzIzMDUgMSAyNDQ4MDAwCisyMzYwIDEgMjQ3MjAwMAorMjMzMSAxIDI0OTYwMDAKKzIzMzIgMSAyNTIwMDAwCisyMzYxIDEgMjU0NDAwMAorMjQxNyAxIDI1NjgwMDAKKzI0MzggMSAyNTkyMDAwCisyNDAzIDEgMjYxNjAwMAorMjM4NiAxIDI2NDAwMDAKKzIzODIgMSAyNjY0MDAwCisyMzUwIDEgMjY4ODAwMAorMjM1NSAxIDI3MTIwMDAKKzIzODMgMSAyNzM2MDAwCisyMzg0IDEgMjc2MDAwMAorMjM4MyAxIDI3ODQwMDAKKzIzNzMgMSAyODA4MDAwCisyMzc0IDEgMjgzMjAwMAorMjM0NyAxIDI4NTYwMDAKKzIzNTMgMSAyODgwMDAwCisyMzgxIDEgMjkwNDAwMAorMjQwMSAxIDI5MjgwMDAKKzI0MDEgMSAyOTUyMDAwCisyMzg1IDEgMjk3NjAwMAorMjM4MiAxIDMwMDAwMDAKKzIzMjggMSAzMDI0MDAwCisyMzAzIDEgMzA0ODAwMAorMjI3MiAxIDMwNzIwMDAKKzIyNzAgMSAzMDk2MDAwCisyMzEyIDEgMzEyMDAwMAorMjI3MyAxIDMxNDQwMDAKKzIzMzAgMSAzMTY4MDAwCisyMzM5IDEgMzE5MjAwMAorMjI5NiAxIDMyMTYwMDAKKzIzMTcgMSAzMjQwMDAwCisyNDQwIDEgMzI2NDAwMAorMjM1MyAxIDMyODgwMDAKKzIzNDYgMSAzMzEyMDAwCisyMzAzIDEgMzMzNjAwMAorMjMwOCAxIDMzNjAwMDAKKzIyODcgMSAzMzg0MDAwCisyMzE2IDEgMzQwODAwMAorMjM2NyAxIDM0MzIwMDAKKzIzMzUgMSAzNDU2MDAwCisyMzUwIDEgMzQ4MDAwMAorMjM5NSAxIDM1MDQwMDAKKzI0MDggMSAzNTI4MDAwCisyNDEzIDEgMzU1MjAwMAorMjQxNSAxIDM1NzYwMDAKKzI0NjggMSAzNjAwMDAwCisyNDM3IDEgMzYyNDAwMAorMjM3MiAxIDM2NDgwMDAKKzIzNzEgMSAzNjcyMDAwCisyMzQxIDEgMzY5NjAwMAorMjMyOCAxIDM3MjAwMDAKKzIyNzMgMSAzNzQ0MDAwCisyMjQ0IDEgMzc2ODAwMAorMjIzMyAxIDM3OTIwMDAKKzIyMjkgMSAzODE2MDAwCisyMjUyIDEgMzg0MDAwMAorMjIzNiAxIDM4NjQwMDAKKzIyMTcgMSAzODg4MDAwCisyMTc5IDEgMzkxMjAwMAorMjI1MSAxIDM5MzYwMDAKKzIxOTIgMSAzOTYwMDAwCisyMTk5IDEgMzk4NDAwMAorMjIxMiAxIDQwMDgwMDAKKzIxOTAgMSA0MDMyMDAwCisyMTAyIDEgNDA1NjAwMAorMjEyMCAxIDQwODAwMDAKKzIxNjcgMSA0MTA0MDAwCisyMDI0IDEgNDEyODAwMAorMjAxMCAxIDQxNTIwMDAKKzIwNjcgMSA0MTc2MDAwCisyMDM1IDEgNDIwMDAwMAorMjA1MSAxIDQyMjQwMDAKKzIwMTIgMSA0MjQ4MDAwCisyMDY2IDEgNDI3MjAwMAorMjAyNSAxIDQyOTYwMDAKKzE5ODcgMSA0MzIwMDAwCisxOTcyIDEgNDM0NDAwMAorMTk2NiAxIDQzNjgwMDAKKzE5OTkgMSA0MzkyMDAwCisxOTg3IDEgNDQxNjAwMAorMTkyMiAxIDQ0NDAwMDAKKzIwMjAgMSA0NDY0MDAwCisyMDcyIDEgNDQ4ODAwMAorMjAyMSAxIDQ1MTIwMDAKKzIwMTcgMSA0NTM2MDAwCisyMDk5IDEgNDU2MDAwMAorMjA2NCAxIDQ1ODQwMDAKKzIxMDkgMSA0NjA4MDAwCisyMDkzIDEgNDYzMjAwMAorMjA5MCAxIDQ2NTYwMDAKKzIxNDggMSA0NjgwMDAwCisyMTg0IDEgNDcwNDAwMAorMjE3OSAxIDQ3MjgwMDAKKzIxNTIgMSA0NzUyMDAwCisyMTQzIDEgNDc3NjAwMAorMjE1OSAxIDQ4MDAwMDAKKzIxMjMgMSA0ODI0MDAwCisyMTI5IDEgNDg0ODAwMAorMjE0NyAxIDQ4NzIwMDAKKzIxOTIgMSA0ODk2MDAwCisyMDUxIDEgNDkyMDAwMAorMjExNiAxIDQ5NDQwMDAKKzIxMjQgMSA0OTY4MDAwCisyMDg4IDEgNDk5MjAwMAorMjA3MyAxIDUwMTYwMDAKKzIxNDYgMSA1MDQwMDAwCisyMTMzIDEgNTA2NDAwMAorMjA3MyAxIDUwODgwMDAKKzIwNTkgMSA1MTEyMDAwCisyMDQ0IDEgNTEzNjAwMAorMjAxMiAxIDUxNjAwMDAKKzIwMzQgMSA1MTg0MDAwCisyMDUzIDEgNTIwODAwMAorMjAxMyAxIDUyMzIwMDAKKzE5ODEgMSA1MjU2MDAwCisyMDk0IDEgNTI4MDAwMAorMjA3NiAxIDUzMDQwMDAKKzE5NjggMSA1MzI4MDAwCisyMDI4IDEgNTM1MjAwMAorMjAzMSAxIDUzNzYwMDAKKzIwMjAgMSA1NDAwMDAwCisyMDE5IDEgNTQyNDAwMAorMjAzMCAxIDU0NDgwMDAKKzIwMTUgMSA1NDcyMDAwCisxOTYyIDEgNTQ5NjAwMAorMjA3MCAxIDU1MjAwMDAKKzIwODcgMSA1NTQ0MDAwCisxOTY0IDEgNTU2ODAwMAorMjA2OSAxIDU1OTIwMDAKKzIwMzQgMSA1NjE2MDAwCisxOTk0IDEgNTY0MDAwMAorMTk4NSAxIDU2NjQwMDAKKzIwMzAgMSA1Njg4MDAwCisyMDY2IDEgNTcxMjAwMAorMTk1NCAxIDU3MzYwMDAKKzE3MzMgMSA1NzYwMDAwCisxNjQ5IDEgNTc4NDAwMAorMTY1MiAxIDU4MDgwMDAKKzE2MzEgMSA1ODMyMDAwCisxNjU2IDEgNTg1NjAwMAorMTY3MiAxIDU4ODAwMDAKKzE2NjcgMSA1OTA0MDAwCisxNjk2IDEgNTkyODAwMAorMTY3MiAxIDU5NTIwMDAKKzE3MDEgMSA1OTc2MDAwCisxNjUxIDEgNjAwMDAwMAorMTY3NCAxIDYwMjQwMDAKKzE2OTUgMSA2MDQ4MDAwCisxNzAyIDEgNjA3MjAwMAorMTcwNyAxIDYwOTYwMDAKKzE2OTQgMSA2MTIwMDAwCisxNzI3IDEgNjE0NDAwMAorMTczMCAxIDYxNjgwMDAKKzE3MDggMSA2MTkyMDAwCisxNzA0IDEgNjIxNjAwMAorMTczNSAxIDYyNDAwMDAKKzE3NTggMSA2MjY0MDAwCisxNzUzIDEgNjI4ODAwMAorMTc0OCAxIDYzMTIwMDAKKzE3NjMgMSA2MzM2MDAwCisxNzM3IDEgNjM2MDAwMAorMTc4MyAxIDYzODQwMDAKKzE4MzkgMSA2NDA4MDAwCisxODYxIDEgNjQzMjAwMAorMTgzMiAxIDY0NTYwMDAKKzE5NDcgMSA2NDgwMDAwCisxOTM5IDEgNjUwNDAwMAorMTkyNiAxIDY1MjgwMDAKKzE4OTYgMSA2NTUyMDAwCisxOTA5IDEgNjU3NjAwMAorMTg2OSAxIDY2MDAwMDAKKzE5MDAgMSA2NjI0MDAwCisxODk2IDEgNjY0ODAwMAorMTg4MyAxIDY2NzIwMDAKKzE5MDMgMSA2Njk2MDAwCisxODk1IDEgNjcyMDAwMAorMTg2NSAxIDY3NDQwMDAKKzE4NzggMSA2NzY4MDAwCisxODgxIDEgNjc5MjAwMAorMTg2MSAxIDY4MTYwMDAKKzE3OTEgMSA2ODQwMDAwCisxNzg3IDEgNjg2NDAwMAorMTc5OCAxIDY4ODgwMDAKKzE4MTEgMSA2OTEyMDAwCisxODI0IDEgNjkzNjAwMAorMTg5NSAxIDY5NjAwMDAKKzIwNzkgMSA2OTg0MDAwCisyMDM0IDEgNzAwODAwMAorMjAzOCAxIDcwMzIwMDAKKzIwMTggMSA3MDU2MDAwCisyMDMwIDEgNzA4MDAwMAorMjA2NyAxIDcxMDQwMDAKKzE5ODIgMSA3MTI4MDAwCisxOTExIDEgNzE1MjAwMAorMTkwNCAxIDcxNzYwMDAKKzE4NzQgMSA3MjAwMDAwCisxODc2IDEgNzIyNDAwMAorMTk0NCAxIDcyNDgwMDAKKzE5NzcgMSA3MjcyMDAwCisxOTc3IDEgNzI5NjAwMAorMTk3OSAxIDczMjAwMDAKKzIwMTIgMSA3MzQ0MDAwCisxOTYxIDEgNzM2ODAwMAorMTc3MyAxIDczOTIwMDAKKzE3ODAgMSA3NDE2MDAwCisxODAxIDEgNzQ0MDAwMAorMTg5MiAxIDc0NjQwMDAKKzE4NjkgMSA3NDg4MDAwCisxOTM2IDEgNzUxMjAwMAorMjE1NCAxIDc1MzYwMDAKKzIyMjYgMSA3NTYwMDAwCisyMTU5IDEgNzU4NDAwMAorMjI1MyAxIDc2MDgwMDAKKzIyODYgMSA3NjMyMDAwCisyMjE0IDEgNzY1NjAwMAorMjExMSAxIDc2ODAwMDAKKzIwMjcgMSA3NzA0MDAwCisxOTk0IDEgNzcyODAwMAorMTg4MiAxIDc3NTIwMDAKKzE4ODcgMSA3Nzc2MDAwCisxOTkzIDEgNzgwMDAwMAorMTk2MiAxIDc4MjQwMDAKKzE5ODIgMSA3ODQ4MDAwCisxOTY2IDEgNzg3MjAwMAorMTk2MiAxIDc4OTYwMDAKKzE5MjggMSA3OTIwMDAwCisxODc4IDEgNzk0NDAwMAorMTg1NyAxIDc5NjgwMDAKKzE4ODUgMSA3OTkyMDAwCisxOTE5IDEgODAxNjAwMAorMTkwNCAxIDgwNDAwMDAKKzE5MDkgMSA4MDY0MDAwCisxOTA5IDEgODA4ODAwMAorMTkzMyAxIDgxMTIwMDAKKzE4MjQgMSA4MTM2MDAwCisxNzU2IDEgODE2MDAwMAorMTczMyAxIDgxODQwMDAKKzE3MDUgMSA4MjA4MDAwCisxNzU1IDEgODIzMjAwMAorMTc1NiAxIDgyNTYwMDAKKzE3MjUgMSA4MjgwMDAwCisxNzYxIDEgODMwNDAwMAorMTczNiAxIDgzMjgwMDAKKzE3MDYgMSA4MzUyMDAwCisxNjYyIDEgODM3NjAwMAorMTYwNCAxIDg0MDAwMDAKKzE2MTMgMSA4NDI0MDAwCisxNjkyIDEgODQ0ODAwMAorMTczNiAxIDg0NzIwMDAKKzE3NzkgMSA4NDk2MDAwCisxNzY4IDEgODUyMDAwMAorMTc1OCAxIDg1NDQwMDAKKzE3MDggMSA4NTY4MDAwCisxNjQyIDEgODU5MjAwMAorMTY0NSAxIDg2MTYwMDAKKzE1ODEgMSA4NjQwMDAwCisxNjUxIDEgODY2NDAwMAorMTczMSAxIDg2ODgwMDAKKzE3NDMgMSA4NzEyMDAwCisxNzE3IDEgODczNjAwMAorMTcxNSAxIDg3NjAwMDAKKzE2NDYgMSA4Nzg0MDAwCisxNTUxIDEgODgwODAwMAorMTU2MyAxIDg4MzIwMDAKKzE2NDkgMSA4ODU2MDAwCisxNzQyIDEgODg4MDAwMAorMTcyNCAxIDg5MDQwMDAKKzE2NzYgMSA4OTI4MDAwCisxNjY0IDEgODk1MjAwMAorMTU4NyAxIDg5NzYwMDAKKzE0OTcgMSA5MDAwMDAwCisxNTAzIDEgOTAyNDAwMAorMTY0NCAxIDkwNDgwMDAKKzE2NTggMSA5MDcyMDAwCisxNjgwIDEgOTA5NjAwMAorMTYxMSAxIDkxMjAwMDAKKzE2OTQgMSA5MTQ0MDAwCisxNjY4IDEgOTE2ODAwMAorMTY3NyAxIDkxOTIwMDAKKzE2MDQgMSA5MjE2MDAwCisxNTY3IDEgOTI0MDAwMAorMTYzOSAxIDkyNjQwMDAKKzE1NTIgMSA5Mjg4MDAwCisxNDg2IDEgOTMxMjAwMAorMTQ5NCAxIDkzMzYwMDAKKzE0ODAgMSA5MzYwMDAwCisxNTA5IDEgOTM4NDAwMAorMTQ1NyAxIDk0MDgwMDAKKzE0MjMgMSA5NDMyMDAwCisxNDU5IDEgOTQ1NjAwMAorMTQ0NCAxIDk0ODAwMDAKKzE0MjQgMSA5NTA0MDAwCisxNDEzIDEgOTUyODAwMAorMTQ5OCAxIDk1NTIwMDAKKzE0NTUgMSA5NTc2MDAwCisxMzkzIDEgOTYwMDAwMAorMTYzOCAxIDk2MjQwMDAKKzE5MTkgMSA5NjQ4MDAwCisxOTc5IDEgOTY3MjAwMAorMTg5NCAxIDk2OTYwMDAKKzIwMDIgMSA5NzIwMDAwCisyMDYyIDEgOTc0NDAwMAorMjA5OCAxIDk3NjgwMDAKKzE5MTkgMSA5NzkyMDAwCisxNzM4IDEgOTgxNjAwMAorMTg5MCAxIDk4NDAwMDAKKzE5NzEgMSA5ODY0MDAwCisyNDI5IDEgOTg4ODAwMAorMTg2MSAxIDk5MTIwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFhbGF3XzFjaF84a2h6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExYWxhd18xY2hfOGtoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZTU0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExYWxhd18xY2hfOGtoei5pbmZvCkBAIC0wLDAgKzEsMTAgQEAKKzgxOTIgMSAwCis4MTkyIDEgMTAyNDAwMAorODE5MiAxIDIwNDgwMDAKKzgxOTIgMSAzMDcyMDAwCis4MTkyIDEgNDA5NjAwMAorODE5MiAxIDUxMjAwMDAKKzgxOTIgMSA2MTQ0MDAwCis4MTkyIDEgNzE2ODAwMAorODE5MiAxIDgxOTIwMDAKKzU0NjIgMSA5MjE2MDAwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMWFsYXdfMWNoXzhraHoucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMWFsYXdfMWNoXzhraHoucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYzRhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExYWxhd18xY2hfOGtoei5yYXcKQEAgLTAsMCArMSBAQAora29nT8fF2NVKdkN1c1jT1Ul2Sn59S3VZXcHIxPT09MrYSXJ0QlJU8/nH2sbWVMX57Ozj/9VPZWJ92f7t6evhwVtzZ2dE9OXg4ODlxl5MTEt/ZVpRSdn38fNQdnhubXBV5O3k/txgaBcUZnb56O/m58N1Z21/dGV3WFvfX1jYxNTPz9jBWNDWeWV/Z3FS2/jl/+H4VEdlc0Z8T8L1ydBZ31l1wubvlebISmsQEWt3+OuQl+fHd2JpbUz55Obs5NhDenx5YnDD5ePn4ej4W3Z4eEpC9P/1/vRdcWdhdV/d++Dj5cLGVmV8VcFUT3BJcGBkcdD0wffk2ExCRktyZXZ0eXNnZn1zT9RCcVLc3EZx3M1OTk1xd1rC++fl+/TZc2lh2Pvj6Ort/VtlYmbc5OmXlejv+Fl4ZHh8Svfn5OiU6uLYc3hnZmZ5xPzZUExkZntP2sz28dFAcWBvekDO5f/L2l99YmxD8OXn+d1GZmltYmRbzeTlVkZIcnx8ZHZc2MdfRdvWSXBhftD2+uPn8FJ8f2BvcPHtlO349ERkbmtk3eSXlpXr7v3VcHBDRNj28c3JxPbx3VvHw1N/e1LT3MzPVNxTV9RQ1c7JyNV2RkVW9/jNXXFLcmNnVeTt58bUSGBrbmN+d8P7yVNBQ3d4Y2ZkeH57ZmdnfExkZnzT9cXV9vfQTX9nZ2dG5+mXkZGX4UJ9TNztl5Ock5Xt1Hh8dfTl9fH80sXbwPFTdVxxZmd7WMRBc0t3W1dNXlhzdnJhfUXN4Pjx/1NyfWBlck/l6eDn9lx0ahBqZNnh5vrMdmZvamBD0fPwU05zen94Y2dgfdnfwefk58h4enxA/OTl4v/YVXN/SNbk7ujq4ubh+NheUcT298LG8fLz2NDMzs/DRHlnZnNE2fL+5u7nx19a31dNdn1P01hE3MnIV3hia21M3/7lwE5kaRcTFXPW291Ndk5/ZGN6dUdQzv38+fBQdn5lQMzk4eT/+8LV03VQ8PfPxvTg/9BdeWNkcM3t7e/h8FxkYUXK+ub50ERaXlTG4JTq5PVadXJkfFfE+uPrl+D88FB7YWNIzPD5xEtzY2tpFWJ31tJXXtR8bmtqFWthQc3D311TZGxufcX3//rKQXV+cnJY/Of1yMP95/3k5PHXREXH1c/h7eDKRkJESdbWxsLb3d1TVdPdXHVKQlxfXVVeQFDY+PrMy8xEfWdI5e2Vlurv5PH6//Hl5+bk/uHu4PvbfmsVYlrJ+uzu8GcWHRAXa2dzeWRvFBESEW9hcVfU0UZ8YRUXaWVSwPf//PdJZGVwRN3By9d3dEhcxsH35/jwx93bV3Z8ZmVV8uX7++flUUpLU/bglZfvw0BzeXLU5ZSU7OPk5OPm98DV8OTh6JeV7/vC9sDaxMVTWHFSw9zcWnF9e2NibHpOSnN5bxVrYHFfVUF7aWsXFGNIQH1mZF/ayM3UV1FyQdffzcjPXn5OxtHa9vH9/vP3WkPR8Obl9PX5wk52XNdXxfjh4OLlR2ZtYkXl65GQkZX8yMZB0+Tt6OLg7PdQU1PM91FQxM/axcLfZ2hiZXx2RXF4Y25rb218RkZ3ZHx1ZmhkenNwS1BLf0dTQXRhZE3C28TByEZ8dFzy7ZXgzFlWU9/fw8vNwtjL+PvAytJ9bWFI2c7n7O3gzk18cXJKWsTHy+Th5OXk8dL14+/olJfu/V9LX8/32NjC2lPYxVFJRXdlZGR4eH1/YW9jZH5zentKfW4TEmpteFD2/vLcR0pJXsXx5fDS9M1RWkRG1vXl583Q20hkbGl7Xlzb+uXzRHlyYm59W1XA3vTj5uf7V9fHxO2Ul52T6frDyObl5+nk+f3Xwc3U3vPO3Hd6RV5IUk53QX1wQXN4fmxqFWp8QHdcT3p4enRcc2ZlZn5LSPf7w1FBT1jW9vjy9cdbQ3ZnSdn2+fPH0EZ10dZAUtxU11TH9vBQeWd2cU32/f7n4O3h3kBwc05Xy+Xk+v3L8cHM5fzE/vr+ys3WVNfd8/nm+srTWnhlcF7fVdbbWEtSdn9NV1fJ01hHSkF+YGBiYljw5fnG01BlYXZx0f/Jws9xY2ZkZmVlf3NK0lVybGpoZ0394cnV13ZNd2xmUFXA88bawP7v6+P6wNrz+uPj+fjh+uLs5+DjyM3w0Uxdxfjl9PHI/vPR38NO18nY91tmeXJgfnxnZkte2tJOSkhAc3x8f2phd3F0SHza2WRMcWZwWF/+91NxeX56d838/+39UGRoaXNZyeb9xcXKyP7ed3fQVFXw+/PH0UZZSnBD8/P2zEVJXNLz4OXl5uP9y85YdcXMw//w/OPg9195eXXP7ZSU50ZyfGVMUUTP+NvY3n9mZX9LQndzfHVCdEJ9YHJJfFlZQvTWfnNgamVBVNBaQk1G3VZezVh1VkZ3W3N8QE9C1kxy2Mnx+M5AW1LO/v/61kTY1MXj4e+U4PLOXMbn5OP+1kBZ2v/n7OPy89VlYHp6Rdj3+OT3xc7fxlV1cEbZ+uT3QH52cHbX3lb2zFBLZWZwSElyeXZ1THxhbWsTERRqYGV4fX9jbW1jZFP/5+XJSHh5ftfx9czm4Pv+8/3m4O3q7+f55uH68P3l4+jvlZTt4+DJ0sXF8OXk5frAQnJ2cHl4fUlc3sryU2dncnRR3t/2+PfRUHdzX8rCQ3NlZ3p6e3BlZX17ZHplfHNgbGNnbGhhe2FgYmoVbGF+fWdz0v7g5vbaxcfz5OX95+nu4OHh4+jq6urp4+zo7+b5/uXn4eLu4/n/xE19fGVlcnFERH1hYX58f0lE3PX7+s98bGF6fndHV830zdpZfnNMR0NE0VBFRk52fH913s3a2FtzZG9ubWkUaGBhYmkVFhYVaWFnZHBf1VBES03R/eLp7O3qkZaRkJOdnZycn5KQkJbo4Ofn4OPh+8l1Z2dwSd/O3dbUUkZ8Y2BkfnN1T9TD9vbBUH1zV97V3FFFVNPeyt9ATnN/eXlkZGZmYWNiYnpfXERFfGdmYGZ8YGxibm5pFWtubGd8c3BCU8Pc395e0c/w+eTz/eHn+uTk7O7rlpOQl5Tu6OjqlJWWkZeV5NvU2sTD9Mvz8f/53HR9cFzN8/H5/czMVFZNc0lfTHVLfHp6ZGdtaW9sZ2RgbBURERVuY2ZkemZsaRUUaX5MU1ZFWNHd1VhAR1Ty5OX3xsbPxMLy/fDy8/XJ2NHc98v2/Pz8/+bh5fbOyPT85uPj4+nqle/++eHt5uXl+uXg7u/n8/Ln5uTn/fP1z8JVfW1oFRVobW9qFWpoFRAWFWluamoWFhRvfEx2QlNU119ze2R9WdffUlzRVlBZcXBN3Pnn9sf1/Prk4ef4/vvs6OP+xNzRU9DU2PHl5/5XdEdayebg7eb4+vTTR0bb9/Pl4eX/8/z59PHw++zs6OL+8svKwF50emd6eX9wZ2F8e3BzZH5nbGkUFxMdEBdrbW9iYW1tYm9iYXfX3sNBdEVxWt9EXtPG5ef98PTz9vf82VDK/uHi+/Ly8P7m4Of+5Pj75/H0/PH67+zs7uiV7fNEelzD8O3kzsjRV8dU0fzk4+Lj4fXLxVhYcWR8cXBMdWFqFG5ndHJjYG4XFRcXa214eWVhaWxmY2FmaW1+fUZAfX1kZGR7fHJW8+Tg5dtX2M7/5OT+z/Dz9vzZxfP66ZXj//H1y/X3yvDh4uPp+8/++/v99MvJ8crD98/a/eXl5/32+uTt6OPxX1FVW9FTcXFyeXR0fnx3RndhahEXFxZqFxITERRvY2FhZmRiY2ZiccHAyNhR0dFQ1tRMSlHO/Pv3Xk5KcFzFys/N9dlWWUbU/ebs4/z55+fi5vnn5uLt6ejg5ub78czHw/z75vr3wkJa0fT+9f76+eb91ltS2t7RXklnYGJseGdmeX1HdWdhY2BhYWBhZmV5fkh+ZHNKXV5OcGV2SHNxd3B7Z3tJd3N3SVTWTn9kSd/E8/fXW1Le/+f+9PX88sLI9/vi4ebk/P785OiXleHj4Ofk+vL6lZWXlpTo5Obm5+XJ9fTCx3dgYnx/fHRnbRQXFGhha2tjZHFmeHh1RHlkaW5iZHVYxXVzcWF8ZX52X8na3kN+Y2BP1/bdWNR2RXZ7fHBQUcrNQnF9Wl3Hzcvl+eHm5OD64uPj7efm5Ofi6ezg7efg5vjm/fn6+uXAU1/14+/s4f5Vf3l8X0ZBVF9JbhESF2d9Q0JwcHhkYWR+enxwQXRkZ2VTRHVPfHB5eHxGUk3SwfTHTHF51sn0zFpbf2RhZUZLWlzdwVpwetfKyv3Fz1RJVNP6+fD5+OXPw97/4+Pv5+Hh8ffJ5u3j4uDs5PTb9O3rlePk8lfWVt/b1tNS0lh4bWhtYGVhZHV/eGR2QHZ8ZHB0ZG1pYnt1eWd7Y2NmfEVRw9RfWHJ/e17w5flRQXBhZn9V09FEQNZKcnp0zPXz9cLO2drA/+Xm4+fh5OT+9uHj7u7g4eXn5O3u5ub7+PHGXUHz+f/42dZAW1tS98DEx1B3fWRrYXNMw1B1f3t5c93VREdzZ2BgaWdBdE1xYmtraW5yQ0lYdXJzdnh1zvfy9lBISUJ9SEFzXd7c0tVzZXRO9ePm5fLDUNrxx/T98f3/zlDy5uLq4vj65ufi6+Lt7PrxyvbB+OH/5Ml2fn55d8j39P3TR0xwYGF3dt3BQEJ2ZGJ+dHPV0VldXHFkfHp2RHpkZ2FiYmdjeUNLdHB7Y3RS0fdQQXZ4Z2ZCSkxAfX97emN5X8Dg5/338fz97+7t7Pr9zMzU3fnk7eDt6+uV7Ovr4u/j4PvzxVLM9vv+2lpyfWVzU1bE0VRNfmFpekzA8/XGRU19ckFATUJISHFxe35AU9VDTHByZGxjYGBgZHpzcGRlR9HE0UZyYGNieEhwc0RYTEp1dcPk4+nj/8PDVdbw+vn5/cLTQnlAyfT67Ovt7eHn7eHn4+ju4+Ly9Pr+/NpNYWZ7ZELTUETcy9rESHbb0tLV2kJ8Sn9BVNTZwPdNcX5gfXNHVNZCYWRvb2BhZWVGQ3V9YmVL1cHCxHRNdnRacHhkcUl4ZWJ7dULbwf3EwPfJ+/v45OXn8cBcR9/a+Pjn5Prn++Pv7+Lv6+nm8sfKw/HOX3FsZ2d/dF7d2vf999Re0/3n5PH53Ud4eHRHXXVRWnlsbmljcltDUHZ6ZGR7fltxR9DXdHlnZULWS0Bac3d0XUtTdUPcUnZlfXFe8PXExEdMTd3T5ez65cnUTE9QwuPs5Of1U0bJ//vt5O/v5MvB8f3i6eX9V3Jlf0hxzcj1zlZLcNXe9uP79tl8YGBJXcP0ycxccmR1T17G2tVPZ2NhcXVB0tFUcGMVamllVtBedmZtYErSwMnN30pma2ZK0fzz89l9bG9wxvrv7Oz800JT0sTg6+rg8ddaxfzglZWWlu782s315+Dk9ltlYmZ2RcP1zsZKfn5M1/Tg4PNWfWRnd9n39E14Ym9pb3tG8Pvbd2BrFG5zWtvX0V54YhVgd9v4yFxxfHN82f7t4v702thHXMX0+/dfcHtkYE318/DJzd7T0drx++Pi8Fh2QEBf9v7m5fP8/PfeyeHg599yeXt/cMvm5/Laxt1U3MT+/fjzQXJ4cUvZ8MveSk5NdUt3xfHJ3HtmbWxiZUNHQkt0fGZhe0tMcEB9Z2NkS1bYx9pSQkNc1tPF2NPcT39leUve+PzDUVlQXVP34Ozi4+XDRk3H8uHm4eby9ffz+OHt4P7I10x7fXHb/cnD3sj0yfb45PDFzcRDenF0RVlleHt5f35DRtHBXUJzZWJ6f3LdRnJlZ39kcUTY8UR0QXZnZE1T9vTX1kNf3Pnm/Ofw2Fp5Z2d3d1fDQXZ8T1zV9/Lt5sPdX0BC0s7w5fLM1tbE8uT75OfwzNPSVNvP8+Hlw0BcwPD++uPj/NlZXnVD3Mv9wFt4YWR33vDn5/FFY2lpYnJxQUl7bhRseELQ09JEeWd6dH1MUtPSTnhjZVrd8ffDy8VbdUFC0dtdUUxwZ3jXyubt7eP83tb18v7i7e/mz1hO3PTh7uDn/sNeQkdG28LC2UB+ZnDR/uHl+PVVTE7U1M3J09dzZmBlRNr/88jWTnd8dUZZUHRwem1pb3tHwVVHR0JZX9vC2sbc20V5enla3/zk5P7D1URGX9HGVkdyYGxvetX75uXz30V1SNHN9c/xwHV7eEbT8+fn5/zx5fnl5uDm+/LPxtrA8uf6x1XVR0XRyeX69NzRdGRlf1nM8ff32ndxTHNIQUN9ZWwWF2pvctVAd0hyeHB9Xc7eVFZYeWV3TdDxzNHSdXhf3ML85PLRW3h+d3DX//7PwsjK5eTk7ezl9ffXSFJR0v359ffywPT5/OXk/s3QRXFASHfc9tdKdHJ0Vdvy4eXcUUB6YGdz0vbGy/bbXdDRXNfUdH1gamppbm9wSnx3SV7G9Pzn5/HKzsDG0NXXwthBR0J0WsfD3t5fS35lZXh4ZU7RVkVGXMfa3Mv6+M3VUk1wfHBU8PHK+eT65eft7eb58PL5/ffNwvfNXE1YV9/F9fXI3EHXwtlSXNLSUEZYx9/SwffPUU55ZGFtbW9sb3pxZ3pzSlbb3N7BUnVGRkh4f0lEX3RPUkdb3dpX0lBzS1BU29rb9/32yf7l5uHh7eLn98T20XZ3SFLZXUTEwsH++vr5yfX08c/e311OcHNyd0NIV9jdzvTdWN3WWFNQ0N9XwMTUXdbOwdJASnF5ZGNkf2VwTEdDdUzc00Fc09/bw87C1VhJcXBzRNfSxsXdVNdLcEBBSHRIT3dA38bNx/T9/uf68NPYwE92cV3e3tDVzMrw///6/P32/+fw9fD9xF5fUNbQRVVX19JAQHRUxNfY3tpV2MJXz9jYxd3fTXF4fnhiYWR6e3p+ZHtycEdFXdbc3F3F211TT3F4f35wU1vX0s/KV1pCV83OyPfz/fP2wfDl+Ofk+fHLwNTWVNba28zV1VVeUV5BW9zCxtrQw8pSR053TUhPd3J1QEZSxNzMzcH++vL2ysPb0VLY8PLA3VVIemFnend1dEJNdndPSEtfUtLSV9FTVN7Nw9ZSWV1ad31/RUJMR0hATEJFX1JbUEdBXFDSwvP28/LOwtxT1cPw98NUVMPOxMz8+uTh+PD88Pzk+vXb3VNOdnFDU1tZ0FBd09DT3snOzdpbTlPW0NhXWFdYd3B5ZHhwfX59fHh8fHpkenNaQHdKVdzSysrM2V1CQ0FGX1BTRU1MXNnZ0sDz8PTKxvf74ePn+vv+wldbRF/X31NOd0BQVd/FyfHz8cze2N3T3cf1ycVWQXN2SXB0S1pGQ1Hc2MT0/vzL3drL/fLM21VTdHFyfXRDWk12fX98c0tHRlXc0FJ3dlnWxNvO8N9OdExATUFfU3dxcH15ZHp3UlbYzc3K9/DMxczDw8TXVNvD28TE2ddTW8TF0M/8+fP4+/745+Dm5v3GV3F0TUdA0dNR0V5YXFbc2vbwwt/cxMvBXtvPW3VDcWdhY2dkZ3h5c3Z0dXR1TnB8S3d8QtPa9fL11EJ1QF9fVsbBxNFedXNxQlHay/Xz/PH9/PL65fzy/c3ZVVRVWEFOdnRf0tjd391SRFPd3sbx/fPyyNhUW1lbUFTS09vQQ3V3T9fN/+Hn+fzy9src2MPD2FNIf2dgZ2V4fHNwQ0p2QUpKQ1tfV93J88veXUB0fnxMU1PUX0BZcXJwfnt00c73wcHDxMTNwMnw8v3dT0dLWNzayfDzycDc11tcVMfMyf38+PPx+PL0wNZRVdjf2N1V1FFBQF9Qxsn1xNDSV8T1zdPbz8xecX9lYGxgZGV7c3dycn98Q0ZQVdnLwFfV0lfF0lJHTFHRV1rX3l1FdEZf0vP+//zJ3fXH0cPI8/j9zcdRWF9AX1DQ3V9DWEN3REBdwtvGz8ZeX1DRyNBU1sHF19zc1tHH1l7UVNn08fDwwcr+8v3x8PDKxEJkZHx5fExeXU9zeXB9dkFBWF7XVUBMd3Rc0VFaTnVHQUxARFlX01NNQlFSQdLaV9HC8fLLwvfNx9re09jf0MbD9sBB111R3dLH2NjUwNZT1lHB9vL2zdTRxFTD31TE2NzQ1V7ZxMn0w87Nz9rcUdXcSEJ3c3J7ZWV9ZX1lY2BgeXdJR9fR3snYy8PY8f/M1EV1U1pbUVBfXVxJSnFKXdbOzPb55f/4+/Ty8MLcVltQXUhQ2d3VQ3RwdFDYVd3dUcfG0tbU1szNWU53dVHf0tr25eXI2tBd09nC9vDx/vDNy83ZxNJATk52cHl+d3R0dH1+fHRHdXx2TEJbRkZT2MH3w0F0f31KTUdXxMHRXkNCRNDZ0NjNxdLQ3cnI2vD48/b0wdBQXdr3ycZSVsvE2dJFWdbX29zW9//Cx9RNQVlV2d/B8Mzc30hyQ3Va2Mv4/tnex9nIy9rG0FJVcWV/Z2d9Z2FkZ39Kc3Z8ZUPQ3MDN9uXyy/PTR19LQNPRxstTQkx0QFJU2MDK88XZ98r95PHD8/Dx9Fp2SHVa09FcWFbVX0dYdUBYd0nYy/L531NedndGXNf18/XF2sDGysfdxf36+fJWX1BQ2MjJ0sLRSktKdnVYTHd5c09Id31+eX19dUNBUVBaUFRF0d1AQFnA//bQQXF5d3Vex8X2/NpQ1933//77+Ofh5c/E1VLQ0MLCUF5Wd3FRV1XWW0lEwfLwxMXaVEdAVNjayvzdVN9ZVtdZTdr09PfeVVxaWdLLydNfRnhkc310SnJwSnx7f3llf3ZzS0xfXd/D09vP9c/fXV3Awsn33UBDS3NAV9rOy/Xb3NvDzvDy++Pm+OX21dNQR1tYX1FGfXN0Q1lbQUlOVtvQz8vWx9JSR09ewM7TyvTH29vDyfPn5vPwzltATEdZU9TXTXtycn53WVZZ1cTfd3F0ent/cn58cU9IdkFESEBWVlLSyv319srZVVlETl9QwcdV0NnVX9738/vh5/z0xt7Hzsv09Mj130ZIWEFLV1RBTVPS0N3d2tVfUVFDTVTcVlXH2d7Nysn09NjQU3RKdUXUxcTK8sBcdEh1dkdXUVNfTEt6bWFkZX93d0p0Q19fVd/Ex8nDzMrEz9BeWU12StHfwM3LwVNW2MDY8uX6/Mr/y9TQw8Da9srJ0NFfT1pc1dTMwNRYRlxLdklaQ0HSwdldVdZTV8T0zsz95PL09NtfSEVSVMbyy9HVTXJ8TUVD1cTRdHdPfmFhcn14SFVZc3JydnRJT0hd0dHUV1daTEfVUETb88jFwcbb3MHOz/Xl4eX//P7JxPbx9vrl9vfe1NVW0NVV1sHRRHV5eGV8WkdfzvL0xFfSx9XTxMHC9vbwx0NMd3BKd03S2tVSWdXVWFNfTFfH3dxfdnJlY2V6cUVER09xcnRaXU5By/fL9NhSVUNBVVpW2djf1tzCzPXL2MDx8uT69Mz1xM3Kw/D48MTf29RbUFhwdFfExlBMd3lmfXd10vf3wdLR1NnI21fD+uT98PHGXUTXXkTV38dVUsfF0VJ3fXNFV1BaQHR9ZWFjZnx3SXJ8Q3V2S3ZzTs329djfWXRzdEhK1/f20dn/8fTHxdLZ98H28PPy/fPI2N/44fry8Obl/8NQRUHF0tVZdXZ7bWJhZUXD9/T08/XC3dRXw/jzz871311zfXx+XFVERtXKwt5TQXB3WkdaQndJQ3ltbmJ/cH1OUFdbWEdDQdL38/79zN1dd35yWsn0z8718PTOUEdW3vH18fv6+v3PV1tawvH0/fDl5f7DUV5F1FtZ1151c2RjZ3hd19ny9vfZ011bWNr59Pb98vfaX3dPdkfXUt/dzM3eWUh2cEZIQ1lxcHN7Z2Rkd0Z3QkdKfH95cXRaycPz+MZFdnJ7e3nR98f18f3xyt5QUFX19vjg5+fl8d7WVMr45eDm+/n599VQ38rF2NJBcXphYGRkSVZXxNvBz8jIx8HJ/v/2x1TfR3JkYGZwTUTS38vIxtRJQUZU0dLVQkl7Z21pYXRNRl91SndKdHXdyvj98vHP31JJfn98WlDbwNDI8/RWWtXdyvbk4OHg5/RcTU1Vwfb5/f38ytpU0vf9zdjFRE52ZWZkfEJWXVFFXdvY0t30/vDCwc7fyMtRTXVLQVNVwsr099tSdEldXVdRUURJZW5ubWd3Xl9QQXZwfXt9X8TB2t/Z0FFHSE5OX9fUUlfVUlbQW0xFWVHY8Obt7+/h8MLJzvb74eDh5P/E1cbG2tlRUkR0c3l6fXVKRVlMQ19R2NnC/vvwyNnQVVleV051dnNGRFbEzcTJ1ElETnFOSltdSXJlYGd6eURUUdJXWFJ2d9fQVdrQXV9BWFtKW1VZ1t7U3tHTz9dHUVhewc3y4+3s4/jww9DN8fPl5P72V1LYU1HTXFtQRUBIdkNETkFEdXRCVMz1/OT/8vHM2t1XVlZJTEp3RV/VxvbKxNLVUHZxRFHc1lNKZ2NhZmB+dXV0SE1Id0pBXFlaX0BIRl5ZVMZTXNVZWllX1tbTVllITFTO5eDr7uHm+8fJ8/jj7e3t5/fH3FdYRd3f0d9QRkdMcF9SSUN2ckdd1MzIwdvYzMXYzdReU055dnFKVVHf99lbRHZyd3VX0dhSf3plY2FycktFR13VUFPWUVPe3VXX3dHX2NzXV1JAX1xFUdPXU1BMdUTTxf/h4eLl+crFy/Lm5ODj+vXS001fWURFWt5XVV3W3VxWU0R8eXR0XtrMycPE097AzvLxycFWR0xdVFLFw9hDcn55f3xEUt7JwkV/d3J5f3RDfXFPdHZyd1pEQVh1fUxIf0/WVl5bUF5f1drAxN9TXEhA1lb97u7i5+T45fr74uzs4+b5zMLdUlJeTUPUVVdUVsTO01NfT3ZCSHNe31RPTE9LVMXb09HZRUh0QdRewPfaXEpKeXB0cV7FwENxcH94ZX93QlpARUHS3NbB38VQRV9aWXVNU1dAcEpARdDfxMTb0UNGXdLP/OPh5OT89cf38fz65PrMzsfa0VTRVt/F0l9A3d/V2dzcUUxzf3dDW93b3tHR38n2yvHKzFRDdnDcw9zFxMtUQ3BwU0RT0N9EcnxleXllfnZLdnFwd1pGQkJY1VNGcnNaSXB3TnB6dkpZUN/2xN1HRUfc++Tm4Ozs4ebk4eDv7eXl//Xc2MXf0sLIxszD3cL0wcTV0NBxZWVxdXJzcHB3TVrXw8D0xFpfQnxzUtvXU9ZWTEp3dVLW1dFMSnZhZXF0cXZASHR3R1zTz9jG39nTQ01OQEdAUEl2dnZbUMXB0lBATn921MD/+efj4+Ph7ePi4+f6wN1YQVl1XtDU1t/N0d718/P1y8XTXExNd3Z1c3B/cXZY2/T4//fF2dVPTVpe1VFTV1dbSULQ0l5eRnd9f3N2cHVyeXF0dnFA3NJEUFRNR0FOdXFxcH1zc3JzQ9fPzdDfWEBHRlfA8vL/5+Lt7e/u6+/h4/zYyMva1NPdV93N9/T1/vr79MDSQV1Fc35zfmFnYGV2S9LN98PfxEdPSndKTlhDUtLQ29FT38TVQVtzfkp+c3B/Z2Rxckhf3M/0y9LE3FbB1lZUdX54f2V+SVbGwczXXk1+d0ZB0s7M9vj75eLv7+zv4OT/wM/A09jVSkrQ11TO/fj45vn299PU0EVDTmVtZ2BvfkfB9v//yfLfVtLW39rddVzXSkBV39DZ2UReSn5zcHNyZWNmfWFhTVZUxMrV1dFTRF5dTnZkYGdgYHxZU1bCUVpHSE9Txvbl++Xg4+Pj6erolevg5+T/9vL1xd9Y3dxUxfDk5OPn8/THUXRITGVhb2toaWN/U9Hb99vb1FtcXNdRUkhxdXxxTFPc0/fbQEV2c3VLfHt+YWVmZnBD1Nvz9MP1wNLUUEBxTWViZGd8Qldc2slS0FZO0MzO9fjwyeXn5uLp7umV4PrkysXJxFfF3UtDR07W/+fm4uH+/cVaUEd5f39saGBmekZdUsbIwMbE1Mnx3cTNUnRMQ0bSwMXB3k9wdnh4c2VhemdubGNhdldUx8jH11RQRUVLc3Z4b25mZnlMXtbA2tTG2cD/+P385/j44+Lrl5aUle7n5Pv/+/v0wM/WTUdY1vz6/uX4zdhURVZTT3lhY2lpbm16c3FCVV5H2d3M88BTVddCdUNQxc/C0lF2ZX55eUJAfnh5YGJlfljHycjOxFtFUFLYzdVwf3lhYWZldEde0NrV3czO/eX49fb5/Pnn4umV6+bk/s/18fH/8N9TV1pxRMP9+Pj58svbV9bHyfVdfX9lYmJmZXdfVNPY29DI///1yMbU2VFb19Daxkd3cnJlZGV4fHhnY2JibmRDXtzVU1lETnVD1NpUSX16ZG5jYGdLW0VTxtjVzv38+/jn4ePg7euVlpbu7ePn//3+9vT3zcTa1NH3/Pjn8szA01tCWdZURXxmb2lramxmRdBD2cDZV8b0xcva31FDT3dM1djbQ0lET3x+cnxycmVhYXp+cFDFz9LS11heX9r1zsVZfWRhbWB7TdDYV1fc2sPA8vn/5/j1y/H7+O3o7uPn5PDO2M/K28zQRdPayPbm4+fl9d1RUtVW2NdEcmJjb29nStnB9d9Sz8Pezf7/zMRHdHRwUN/Px1VYfHBlYmRzfGJiaRRiY2RF39PT03N8TUfY9/VXdnhsb21hT9/RX9xJdMj18ebt4uH6y8/+5uiWlJTr58rz+cr54f/RW0ZFyP7k7u7i59h1dURFVM3Vf21qFBVsZFLBU1twZUrB9/L+/8xMZWdlfFfB8NpUWGZmZX10R115bBUUYn/T8/74/cx2fkLF/Pzw0HZkb2xjctHaxUF3emdaz+Hi4eL5xUdcyubqleri+stMUs755v73UHN8SNj/65Xr7+TJTHFVwPD02kxkYm5he1Xw98dCS3RJ2ffn5/TSd3pkZHTd9fLJQXZ/YGRxQFx5bhYQFG5hQvf/9lx3Tn193ffxx1N9Y2NgZkjC2tRxYXxMXsT47eLn9sfx+uTilpWV6Pny8vL94O/lyVp8SM3z8uiU6u3M0NvG083w00FybRVpZmdD0kNOZGF9Q1TS8vHYRGVmf15G3MJW0El6ZXNAUdNEeGFqFWxyRtX98/Pcf3FQVsXy8dBQc2FgeUTRylJCcWNndFbB+OX29tVH1Pf65+nv5uT3wcz2/+Ptx1pLc0hT/+Hr6+bn887M8vz9+ttCfXtnY3XVz/FBS3RwcEPL8eTwUEB2cX7XzdHAXXRyf3l9UFpWcG1rFhUVY3RM09VDdUtPXvXCxsvVfWxneHtS3MfSd2Vnck7H9P/h/slQzfz57+7o6uj4yvn/4eLi7Pjed0nRxfvi6eLlzNj3yfrk9PfFd2xrYmB9RFNDfGZrbGZzwszxwkJ/ZXZx1vfE21FMZ2F/ccHcQE1+YxRoY3/EwMTb10dA39L65s3200lhZnJ0zcPV0F18b2V33eX85PzGVlHL9+bv7OP68FBXzvfi4OHl20RzQ9Dy7O/j+P7wy/rm7+7h9EhzYWJ9R9jfQHxlYGxlSNvx98xYTUpyWMXP9sZxf39iZ0pZ015JZ29oFWx6cXR3eHh/e0jV0sn1w0F3cWR4QVJWV0J5ZGZ5WNn65+X5/vjz5eLv7+7g/frxwPL44ePs587AVtH35OTm4f/78v3i7O/i+8hOcWVjZHF9enpsamhpZ3da3t/SXkxOSVfPzFdfRX99dnFXx8/FWHxsYmBhdEdLdUBwc1PTy//+999RSEtKfEVfTXR9YW16ckLJ8vL09vH1+frm4uby9s3X2MXc8Pn68sjF0M/C9Pn88v7w9/jm4+3p7frwxVlPcX90d3J6ZmBme3FDVd3c2VdHWFfV3cHUV1VbRk9MT1pcSX9hb25tYmF8fX92cnNCVtfWxdtRQHFycn5ydXZzfH95c0hT2Pb5///z5Obg7eLs4ODh+fPz/PPz/c/Hz8r08f38+vr7+fjl5OPv4Of5y8FcT3dzeWRnb29vaG1jZXp4d0lLQVJR3dFTVNfU1ldeUEV1fXZ9ZXt7e3tlf0hCSE5FWNbe29Lf2llYT3Z1SHR8dHZ7cn1xXVTE9fLPwfD/5+Hm5Obm/vv88f7L2tXVV1na3sbz9PH64OT64ebt7O3h5ubK2lNMWkN+fnF+ZHp7fUp0W19VX0pZXdfY2cPNztFfXEReQHJnYWZtYGNhfnl4eXZzeHNCQVxHQVZSTHRPdEFPfXdyfXpnc0ld28n0//n75+Lv6+ju6ePl+fPw8PDaUldX3tnA8fz5/fvy8/z95+Ps5vnk9d1XR0p/eWNsaWhiY2Z/dEB2d0tKWUZe0d9V2fTd0lBb3NFSSn9/ZmZken1xR0ZBdkPVU9vZzcdfW0txQ01eQUhxfHx4c31Y2Nra0VTUwfzk4+bj7+Lm+Pj1y8DVUVNIS0ld2PX++ubn+vj7+ubh4O3g+PD09/f3yll0fWRjYGV/ck5eXVBeUtn18c3f0lxCTnRzcnZwf31ze2FgZmBhYGdgZmFgZHBMd13N2F5fQnVzdnN9ZHp8en502Mb2/P3x8/zn7Ojv6ejg4frm5/rx9cDV1lXS19vO9vPw9P74+frj4OXh5+X58cvNX3FwfmFnZ2FmfnZ3QUJBRkZZRVjQ1tNSXlpITE9JSkl+ZHx4enNxcHRLdHVwc3d1R1jV2tvexd3aX3Rycn5keXJ3dFfeyfXOy/H+5P7/5f7+/PzLwMDB1NnM3tTe2MXcWNjHzvX3z/H/++Pp7uDg5Pr8/cNXSHZxfXNLXk5bVdBEWE1FV9xTU9LW1FdTQnd/d3FwZGdmYGR6ZGBmYGZ6ZWR9cnBKUlBRU11FT0x2cH18dk5PVcfEz//59fX38fnn4ePs7OLi4+H48PTAVF9TXFTby8/18vzx/fD3/vj65+b48P388MnY101zcnF1d0lwfXN1dnN0TXFM0FZU1lBER3R/ZGV/fn55eHN7enN9c3dxc0tPSFrXUVlQRU9EQkpISklNd0tSU1PU1FXDwt7D9/XN/Prk5ubk5/72yPXA0txGTEZER9bcx/b99v35+fv65Ofn/vzz/Pb2ysXH3FDfzNDR1FNERUpLSHZ0WlbcycDf0dd1c35mbGJtaWBkZWR5ZX9wf393cHByeXdwcnFFQnZ3Q3RLW13Q2dlcVtDTxcvPyfX54Obg7Ozj4ebk/fP3yMbb2MfE3VBUxdr18PP4++X6/fbw9vXDyMzY2sTaVlBT1VFedENednZ0THRLTktPR1PcxdVXRkNKcH5kZmZke35kenxydk5NX1RdRVFdT0ZGQVlEdnZwcnRdw8Tf01dS01ZWV1XZyP79/v/l/v3w8crax8TQTFhW1lxETl3cwPLl4Obk+uf49PT3w/T/+Pzw9/f28fPD2F1S1NxQR0bR1ltTX15HUVZXX0Fxd3Z5ZGFgbWNjYmNlZ3p+fXdPd3BLSX17cnN1d3FzcXBYXdnfxc3X38Te0NjG8vvl/uTh5uXm5/j89/758sLBwtvVX0tDW9T18v755uT75PzOwd/T397Q3cXO9szJzd1BT0VMSnRzSUVMdkpcQllbVlhNTENPfH5/fmdhYWZmfXNa1URQ2dhAQ0FKcHd3SndydV5Q0N7d0VxW1tBbRlzE0871yMnI/fvn8fL29s7Iz87E0FJWWXZaRFTdyPL65+Tk5PPO8P3z8vfOyvX4+uf98vLMxMRZTFlBU9DWcUxeRl7bVUZCT01JdmZne2RnZ2xvaWJkcXZzQ0l3dXZne3p5ZX9lZnhLRtXF1dNQ1VDH1VHcyfH+/fT++fjn7uHl5+Hk5f/IzsvF1tJBdUHeyvD85eT5zvX30NLAzNjN9MzK8s39/9zV1V5MTU11dEdDUFhxSl1YVN1TREFHc0h2ZXpzemR5ZWdkeXlFU15TRnd2dHB0d3NwTnF2Q0FD199RVF1bXtZdV9Pf0vTxyvz4/fzk+vj8ytrLz9nY3VpMQENF1FLc9vn8/v/C9ff38fz19P38/Prz9v75+P39w8fY29DaVkFfW0FXxFTQ0t5YWnV8emdhYWFvb2JnZ3h7cEpLcEpwZmR6emZ7ZXp+fHxGQ0hH3VZE0NzSVlTQ9/X18+bn4Ozu7u/s5uL79sr229Pc3F9dXFnKxcLI9FNS09zW3NPe88bG9fPay/H3z87E3/TT19ZTQFFZRkJcTlPJVNvRQXJ1SHN8f2Z4cmR/cn55SURS1V1wSkJxd3ZyfHBwc3F1eUhfU9RcREZd0dbS11bPzsH0/fD25ebm5v/38PTb01ZFTUFbQV5d3M319vHFWVjTx9zCyPD8/Pnk5fDw+Pn9+fv7//L3yMTbwMnQUN/Y39ja1lJwZ2R4YWxgZmZhZ2d/eWR+dHB8c3t6fmRnc3x+c3F6f0lPQlteUdFR0t/Z3c33/vj6/+ft5eXh5uTg4efn+sDBzdBWUVlCVdvCzMVZUVBNdk9zcFjXw8rM1PX3wt/Y1872/fn/ztT0yczLxEFU2d/e2kVCXnFyc2RvYGF+cn14d0t1Rl5xfE5LX0R0ZXB2SV3UcHJAR9PUWV3HUtbeUnZc3dv38ffy+vD88vXRzPf398JRXkZL19BcS1DUyfLO3N/VVFVfTHNNXM3z//T8/fz98/Tw+vjm4eT85fr6/vv20Nbc0dXXXltAdGVlYmtoY2dkZXp5fX98c2VmZ35keHhnenJ/dF91cnBPdVPGz8jI3NnA3dv1//3h4+bh5/L+5f3w8svT0FRTVNDQxNJR1tvbwvfDxdNMd05yfUhBW971w8jBxc7x9fLwws3x8fH/8Pf+/MPH0VNf39HWXXd4ZWNjZHp4cEl2T1tATVlASUlwZ2V+eXFBTEFRWlhGW09Q39jGx1Rc1lXR2/XC8/3y8/L0wMvN2N3XSHF9d0hSWVpXXFnZzdvI98zQ1E9xTkZB3cPEy/Hz9Pnk5+Hn5eT7/Pjl5frg4eX7/czDwNfS1EZ5ZGJpaWxjZmRle2R4fHFyc3FyemRhYGBmfndETElJQktZ1sLAy8rG0dzZx8j25efm5Obk+uXl8/TC1EVDdHFYV9Xc2VJS1dPc29vQVEV2cnx4ck1HW1ZWWVzTzv/+/v7/8vHy/vz85OHj5uT/9/fJy8JVTH1nYGBkZHt5eX9wcnFBWVpDQUlzfHtlZXhydExCQk1OXFTdzsDAx9zUV9nBzvb9+P789sv29cbfU050fnt9dnFCR0RSVFJW28XE3d1TRUt3SlhR3NzfwMLOy/nk5+bn5+Hl+uTm4Obh4+zg5/r/ys3WQXJkYm5sYmFmZGBkZXp7fXd1cH55eGdiZ2ZnZX5+c3VJUMTazPD1y/f0wczI/OX7+Ofg4efn5/vxw8BVRnRITnR3d3F2dUlZ0NPEz9JRWkV1fHBMREVEXkdaUdD08fH28fPy8vjl5+Hn5eTn4eHk5OXz2lVPfnpkZmV7ZWR6fntzdUlAQHdyfH5/fntzdHJwd3VIRNTB9ff28PHLzPX29PHx9/Pz/fr8yPTM1kRxeXtlZXt/eGdke3h5Q1fR29PU10BKW0dAVdnEzM3L9vPz/OXk+uXn+eXj7O/v4efm5fj7+fL3ysxWdXxlZGRmZGRgZmdne3F2d3Z/emVkYWV/fXZLd3x0dXVT29jL8fTx98j3//Ly8vPy5eXk4eb68/HeWF9FS0NMd3R2cnxzc3ZHX0FJdXZ3c3h/fXJxQEBAWVPSwM3O9vH09fL4++Tm5+Tl5eDh+uTg5Pz1x9hXT3R2fmRlf3llckJEX1pCSX16fX9+fXdAREhJX1JRUcb29/T8/vP+/vj68Mz0yMzP9PH29MvTQnVwcn97e35kZ2dhYWV6f3ZzfXJ9cnBydUxFRENFVFBUwMjy/Pj7+P7l5+bm4ePt4+bj4OHg5vr0011QQHBydHd+ZWdnZWR7dHd+cndyen99c3RxcHR3cE5eUtT2//z+/vjh5Prg4Obk5Pr5/uXm4OXx9/XQW11PdUxKdUt4eXB+eXJ3c3pnZmBmZ3h3d3p5d3lkZ3t2dXFHWERQ3szKzvb5/vz55eTh4e3j//P32dVFW9zfVFNQWFtLSFpZXtVRVkdDUFVdW0BDRHVIQFvXy/P88vbw/Pfz+ubj5OXm5f778vfNVVPXT312d3VIcX9+emdle3p+TVh1fnt7fnJ5d0V0cUVBd3ZMU9fUUNbE1VPFyfb098PEyPb+5/n8+PzPU01/eHZPWV13S1lESkldUltFQk5DS0NW0lxcVklycnxN1t7L+OT65+f++uDt7+zi4Ozu4+3i+fzyw9jUXlTBxdPUR3B/ZWd6fHJydHxkemZjZWVlfn57ZHpke394e39+fHBLR1X3yPfK2sHK2sHBxdvHzd3WWkFeVV5dW1xTUd3G8PTN2t9cUl1R1dzYwcpVQEtAR1NU2s/y/Pjk+fv65uX6+frl4ebg5vzK39d0S0BR09jTw9rVRkxacX18c31yf3N0SX1JUU5Kcn13TUhFUll2S098cXRBUdjf38/GUcTYRVtHRF9Ac3dMdnJMdnp6ZX9KWEZXx1dCVFBF1VBWx8PcxsVWX1dZVdHUw/D4++Hi4efg5OTl/fjn5P/k5/329cbIz8Dx/f/w8/PIzNtSXU1zd0tKd0RaWlhPcH16Z3p/cHdBdnNyeGV/eWVycklFU17WUV9AQUlwS0tBWVFd0NRSTUR1dkRHV9vSVtNUXEZUR0dTXdPD0FbUUl5F3FfR2N7w5/r//v/w9PDMycr2++f9yvX3zcDK2sXE2s3x2dbAwFJeUl5X1tPD8szM9vbb2dHR1FFQ389TQVJTRFJeQk5OQ9DZWEhASH55ZWZgYWZ/cHh4cHN/fH58d05A0tJYQllETU11cHFLTFXXVlbf0N3f1lLX3Mf29vT198/PzMDay/Tx/v7y/Pj65+b6/fz38/3xyvXZ2cbbUFHc08PDwcbIw8Dc1kJeUV/UU1pW1kJfVllLW0df0t/bz9lDQEFBfn95f3F3c3dwZHlwfGVwc1pRU1zWUEVTWUJzSkpNSVpG1lB0TFxFRlFc0dfR0N5aSU1bR0tNQERQ0VXMwMT18cTawcj38PPy+fTOzfHx8fz+8fn75OHl+f/6+P/xzNnKzM3N297Dy8fYzMTf9cLA31NYUllKdEJ8e356fH1lZmRkZ2VyZHlxdEt3eHtwdHB2Sn5AXlxdREtFX0ZEW0VJVF3cxNJR0F1eXVVRQFRcwcrMwfTBycvL0VDW1fTO2tvLwMrPwdDW0sXy8ffz//f0zszawdLa9sPB9PXJ8fH39PfN8/rw9vfG2trWUkVZRdLfW0FEdUhAdXd1cH5KcH5zcX92d3FKTUt0WV5ZWF5AW1pATUpwcU13d3N9fHZ2d31+c3VPSEZBXVhfU1BYRlPR3sXNy/bL9fP88PD55ebj4fr+9/H/8M738/H5//Dw/vzl5fHL9/fC9c7L9MrYxttWVd7TVtJcWFNBT1fRWEdMcnx/ZXl/enl3cHl+fH92SXRNXkJBXUBKREFOXl5FV1x1QlJHQ15eWlBQUdJXR11UQnR0cXBJSk5ET3RBX0Vd1NrGz9rBw9vfwfXPycr2zvD95OHn5uLi4ebl5f77/f7zyM/KysPAw8vawd3AxNLFw9nV19LXWFJf2tlWV15ASnR0dnBCTllPfX1yc3xzfH5+fXt8ZGd5en59cn94eXJxTU5BREFGQ1pEQ0BYXd1ZRVxZ0d/e0dRQ1NzZ0Nbd28fd297YwPb++vr65fv6+OTl+/vh4efk+Pn+/vD6//T3/fHP21BeUVJAU0N2SlFQVlJaRF5FQFZfQkZTQExLdEhbQU1FTHZCVlbWVVRUVURMdn16d1xaTnRKd0pyc3B9eEpCTnF8cHJ9eXtlemdxRlpJR0ZHWVzW2sHH/Pr68PDz9/Xx8fH89vjn/vH9/Pvk5OXl+/P5+PDJ9vL2yvXf0t7WzvDL9fH3ys3B0FFSXdfVW0dBR0t2fWRkZHpxcX12dnZ/enpkeHFY1lBZX1pGS0hBTVrXxNvWV1RfX09OSHZzd0pwf3l8cnB+cXR2S1Hd3VXV2cHC2vb2z8P29PHx8uTg5uXi4eT++/z88/z4+9pe1E90R9fV2MXHz8NT0cRU1MP29snw9vzzUVbb097Kzs/MwNz3xXdzfXlyRF5Ed0pzTH9kfHB4fUpzdH1wclxxfXdAdXd2c3N9cXNEeWV4fmVxSk91T0ZPXEJcVl1NXN3Z0M3w/Prz/fv6/f7n4OHp6OLi+/L7/fHl5eXl+vz9//bKxtjQ2trX0cZUUF52SVhFWNvc3cTeVNBfS0lEdUpVQUh1SnBGQk1X1UBa01BUU0R1T3N9dnJkf0t9TUdFQlpKcEpwZX1yZX94fn53cnBHcXNDW0fW3dNU3FTdzt3QwcnN/vz99/L19/zC9Pvn+efl+PD2zvD33sLz+fD4+fz09MP39sv18v/85Pj78/XezcLQ1NjRUdFBdXN9d05wfnhwfH9PdnJ4eHt8f3l5cnJ0Rk5IdHV3R1xMRV91RkFxfXtkZmVkZmZ6e0pET0p0dXRQUFpQ0tPz/Pf09/TC+P78//v84OLn5ub68ub//fDO2/fJ2tdTTnXT1dbd2t7xzdPdxFpRwcXJ3sPC9vfCwM9ZUMnQ1ddEQ9VFcUx3Z3N3dlt1SEJGWnZFSnlPT0NIfXVCXlZb1EF2TUlKcmZnZGdkZHhgYGBnfnl8SUJbWl9USkhA1Mbew/by/+Xh4eXm4O3s4ODh5uHm5f/OzMT19PHx98/DwdjfXlNRVFxQVEVYVtrIzcD18cnEw95GS0l3TnZ5fElydFxATktLdUVKdn1yZH9OcX53cHVdSUXVUnZZRHRyfXpye2NsbWJsc0h0cXB4d3R1d0Z0d1bT2Mbb2ff3/Pvh5efv6O7g+vjk+/j+5fP65+T79VbV0lTd1tRZ1Nbe3FdA08PI8vzxwfP95f703tjVV9rfXFrS0sr20kJYTV3XXUp0R0dfX3B7cXJA1VxwdkFOTndlYWJuYGdlYGZlZmdkaWtqam1mYGB9d3V3Rk9AXtL25/jw5OHn5u3h5uDu6peV6pXq6env5//x//3lz8TB001Y3FVW18HB8cbBxsdV38VQWlPayP309ff12s/B00dFXllQQF5WWUFW1lNZWERcU1hdWEFNTHd3dHd0RllYUkRMTUt5Z2BhZmFjbWFtaG9jY2R4d1pV1t7Z0tDTVtfDwM784OPolZXq6u7s4ufk5vv95f3NyPLK9MXcw8jC9/POwtjMXVvP39L48/rt4ubs7eT+8vzK8MbP9F5wRUl3S3NJW11H01R3e3psbmlpYGFmeEJPdXdGdXVwfXZzeWVyeWZgZWR/fmVIdXZD11BeVVJDWkRRx9ja/eT55eLi4Ozg7e3j5uHg+/3x9/H+9fz7/ffwytdGQHF5e3pxdnVFx8/Dz/bDzszC8v7/8fn59MnKzfP39Pj/ytrM31pBd2V6ZmNmZmZ6fGVlcXJleHl9dnZ+enl4eXNwcnB+eXN8ZXt6Z2ZmYmxgZHh+cEHY2sHw/f3y8PTw/P/k4OPs6+vq6Ozj7O3n5uf+/P/11ldFWNHRRVfWXd3b01bS3d7B3lfZx9dX3tLDw9zFysrGydvY09VHT319fHBwcE1JdEJbdHZ/f3tzfnt7eX5wd3Jwfn5ld3lkfXJleXhhYWFgYHJ6enRDdVbeV9VUQEbGXlrd3t3+/vHn7eDvlO7olOjh7+Hy/Prx8/zI+fj0zs7UV91Fd19cSFNVRVHA2Pf48vzh5f/m/s3y89nDwFxZ13dwTXxnemRnc3xgZ3ptYWVjZnlleUt2eXVOc1pefnZEdHB0eGV8ZmB8dn9KSXVKQ3N8SnF+SFtA3tjdwv339PH39fn59/77+/36/ff1ydn39sfMyM/bysfW0VFNWVVRV97d3P748OXn8vr68fbz9dr29sj2y9zLyNzN8cPR31hwdHxmfnFxcHtibWZtb2dia21iY2dlYGB5f3lxfnhNRFHd2tzW01RW2VBDVcLDw9/Z2sXBy/3IxcbKyM7b28Tx9vH/9/Xy+P3w9ffR3tXRU0p5d092dnRMcEFORkdDStXD9vLy//zk+Pn/8Pzj4uLt7uzi7OHn81dXwNfU19rd1V50dUp+f3x/f3h6ZHp8ZH55YX55f352dn95cH98ZWF2TUFB3dvF9fHD8/39+f/98Pv58PL9zPHK9/zy8Pb59sfY0V9RSE5bXVxUyvTM9MPe21TS3tBeX9FUV95UW13R0Nbf1t7298bOyMj08f37+/vl4eT75Pnz8vr78MzBxcDQUVRGdndEW1tFWkZfW3ZzdndKTE1MQkFRx9zQ11BZU1BBdEhDS0BEWFpCT0ZeWFzV0d3a19RRUdVRVFRUx8DP8PbM0NPU0VdaXNzXVNLSyc/Iyvb8/+Tg5uf5/PH08MjAwtjN9c/z8vLI0lFWXVBBW19T3FTZ2s3a3cbI28zDwcRTXtXDxtJCT1pdQ01HR09aUUdBREJYVE1LWNXTzMfb29rV1N7UUldxZ396ZGRkZXByfEpGeXlwcnx9fXFFRkpNVEZVwd/fz/Tx/v3Bz/bV0sPMz871/fL3zv7l9fHy8Pzy9PXKzMXDxcH98cvCwfXOxFxBW3Z9S3dHT0tR115S2fT1xdJS2VRfU0B1RVXY2d9T1thQWVJZSk50c2dnYXpkY3xHdUlMS15aRWRkfHdOdGV6fH18e3hlcXdFxcJRVFPVXERBWtnO8Pjl5ebn+vj22MH19fTM2Mfb39NVVNRR1MX9/vfJwMzH3FxETUTW2F1S19TY11JPQUFfXUd3cl3cUHF8cEVBRlbN9Pz/9spedHVJdVrW38P0zdnXTnB8eGZkZWBgYWd+ZW9tZ2Znc3RIWk9IQHRnYWdneEpwTtvbxvffWNNVRVPG0MH2yv368cn99c375P7h4ubj4v3OyN7cy9hV9vP3/fDUXVBMd0R0cltXVNfWdX9+Z2V3fEvRUUF0cn57ZGR9dUtfxPXxzdHa0VJQ1lFCR1zf9dZS1F7XV9BX3szGwMBCdXFnYGNtbWR+dlBUS17VSk9DcnxxcnNQWXZRW3VBQ0hc2N7L5ffbysfT3F1Vyvbz5eD4+eHn+uT3z/Dwy/jk/fr898LHU97Px9XJ3EFMdXxyfmVKdExf0l/U3d5WU3d5f2dkfnB/Sk9OTVp3TFNHRdDS19xXXkVDfE9Jf0Pd2PX8/v/z9tTVW3VFX1JZ0NbWxVBeV1BWzPf988z1wl1HTVJTXtLay/XDysBU2NxQUlHXxfTD3PHwxMvK2drQVvTxyM768cf3yMDB2NLJ8fT/4PDJ9FRNdGV6QkZN1MJZXd9YdUNzW8PQW1FEf35zZGd4ZEzSxcTyyFlbQHFzdnxC3dfSzs3WwfXD8ff1+uHl5Pv48/Dwxd/T0sf29P/l5eXl/cnf2dzG1cX0wPbf0NJScEJBSEB0dUZeSEVRU3NGWtfBz/Tx/M7B1VNF1tHCzfP45uDk5fD3wff1y8DB295cT3RyeXh3S9RTx8rxzN/UWnZlc3Z0dklH0lTR1l5ER1fQ3l3WyfDP38DBUFfR2P325e/r7eDh+fT09fb7+eTt7Ob49dRd3lRXwVBX9ffJy99wfnF9QVVcwvvEQEt8Ym1nY2VzfVLz2dnE2d/M2FXJyFTC8sL09d9Y39zC+/r94+f0/vFVWlt8eX97YUpJdF1CTdRXSlrXUV/w3NDO005Kd31dx8Lw5Pb95v3PwlVG3vXFyuXy+uXw9PTG3fX3yfL5yv/ywVJRWEPTwtrH1khGQXd5fXl9SElxW1Re2cDcTEV1c3d2f3N/eX1xZGdwcnZbVFvbzNnB99xdV0pwTk92VtDf/+HxzPfRRlxWS1tQRNZZZGdkZmR2dHbcx9/28tNTXFxF1VZR9/XJ/fbGzNZdUMnZVc3Mw8JXW1tB1Nb129ffW1/VV1BcU1FBUFBQ1dL1xdrAUUZxfHRwdkpwSn9KTX9wd3RLTUJLdkxzS31hYmlqamtoYnlwfkVJcXBxT0NGUNHS1VrH0sXHx8Dz+fj8///8+/XL2NvW1FtYUVJCWlFcWHVa1N1V29NWUVZRV93W1VZSWF5BTEdRUVp0eXx4e2V3Q0RVxMLH1ERT0NBW3tDYzMrMysrBzsPe0sRRVcTfTHJ4ZXp6ZXpzeXxKQkt3c39LTn15emFjY2Nvbm1tZnt5c01P1M/L29zM38/Iyc328fzm5vv4+/7h5vrz8M7F2MDW18fRUUN1fHBzR9fXTk9bREdOTn1HQUlZ1U9ZXFfZUkBbUENY0FR3RNJbXNfcV9PN/MjD3dXfxFDVxFfR2cLe2ldW0dlEWVl2dHRKfU9zdkVBc1lSQlrd00Bcd312d2Vye2FheHl/QE1B2PTb9vbKzfb19P3x+eb69vv78fL69vD+9fXxyN3RX0RZRHVaVVjV00FIUkJCVtHd283N9dtWUNrf0cTB2cDF0czOwdvUTURGdUtSXlrRUlfG3UxfX0ZaU1nA8cX0//zx+PLI8M3Wxs/R0dFMdERKT1fbx/H92M7NRHBMcnt7eH51SnJITXBI09NX9vH35P7wz8jQxMzz9Pjk/uT08f320cH2ytvHzcT0yPHJxdvezsHQ01FT3Mfa0t3e0drXXVRR0NDA9MrQUtfaUlnT3NLeys/I2tLd3VbdxdPbxcTTUEZOQ19dzvf8+ufm5uf1xN5fW9bT3dDf39PRUFTW0sPwydPTXU1zdmR4fnh1RE1LUcDI+fLz9PvG9MfJ3fHLzvbx8PL42/TKxN3PxdrBz/X931ba+kfO8Nj899daUXx8dEZeUF7Tw9Be1t1XVcfC2MTCz9nQwMvf08/x8/D88PXA3tLbXk1FXlTVXHVc3F3D8Pf/5+Dn/fH0z9/Z9sRNXsXS3tzT38fb2s5TSEx2dFFYdXNMTEXUdH9wdU1FRVNTW1718tlT3d3H8PL5/crIysdfUlxfwvD2zvXDyPLA1tBQ1sDWTUt9Z3JOd3N3dENcXVDSUEBUV17V2NfEys/L9srZwsHA9djTxVBIT0d2dllaWVlKdkhBQtba08zGVNDf1tVU0cXKyPb8ysHF09NUdXNydUhwcXRKd39xdHVfVdjWV19zdE50QXRO0cTaw/XYRV5YW9lSdXxMWkJISVje0NTbRkpGXt1RWXR4cXRNdXJzdVtUx87D2trEzMjRXFfb9/H8/P/z/fz+/crYw/XB03B7Z3x4Z2dmZn9yfHZ4YGd8f3NlYGNlenpyfXxycnBdVVnWwdj29NNU2s3Zy83D/Pn45f/O2MfUwMBAdUZXXcf1wM/CU9zBXVNWS09NfmRgZWR8dHlBR0BRzFdxcGRhZWIVaWpvYXB/cHVyf01GSNnb3Mf1xd7I98r85ebu7ODi6eDn5vrn5fHS0MbSzPfZXkl9ZHN+YWRhb21iYm1hZ2B4eXlPT2V8fGR5dHplZGBhZnx91d5S3t9f18jX1t9FT1fTXtDO2Mn55ezr7e/q7ODv7OH68dnbycjI8sjbw1FZwdNMRHx6eGdjYmwVamNsYHlnbWxjbWdkZHhmZ3xPUd33ztv0ycL+8vfz8/b8/Pz/+OX64+zs6O/k8vHExfTN3ldLQ0BQV9DOUEVfS052f3JhYmNjZ2JgZWFndkhYV0R3Q0xydHJyf2ZmYX5IcFzcWdDZ2/L64efn5uPs4+Li7ePslZfq6+Dl5+X4//3L2t/XWtRaXF1wZXp8ZH5yZWBiYmFhZ3pxQkna8PD3xNTT3tVW0MZTU9TV9f355Pn+/vn6/vvO1UVAUFDRQEbW1dzw8f7/z8PH2FTUXUVMQ17dzMvzydBSU1bV09BcR3Z2R013eH9/cENT2t5ZW9BUXNzHxtjI8vrt7OLi5P765fvk5P3y8Mzw+Pr8//r+/Pj4//bd0l9LSElMfXpwc1vazPHNwNjN9MHL3VpTdktBQ0NwW1Bf3cTw8sbPx9dYRk9+ZGV6cVrWz9vXVNfA2MLERtdTU9zfzFXezcby/uTg5OX+/MrI/MjbwMbP9vby8cBWXllYXll2cHByQFPS1dfc3/f8/ufl5fz0wVHfUEBd3Nv1+efh4fr9+fPD0UV2d3J7fUFdWNXSVMb3/fP8+/zy3lTVS3ZDR1pS1d/ZztBOW1JcWkVPc3hlZX9kZH94c3VdUl/N3FXfTUdMS0BQ9Mv1//7j4vrn5+T/9PbWU9RRyffw88PLz8bfXtlcck1xc3F8dmVP0FHHxPX8wsj29cDF9VJOUEVY1FFWTEdW0Mzez8/eysZNd3F9YWF/eXRMV9lV3M3CxcbK01/S0NnC8P3P28fEy8DFxF9EXkReXkF8fExKd3RCQ392QlxWQUd9ZXhydnZNRUhD197K/fbIwc70zsXYUUBySlDdxcb1z8P18/HO3V9yeXJKWU9DRnZG0d7I29vB09jT1d5fR3R7cUNASEheTUFU2cBfTkt+fnB3fGZ7ZmB+ckdAdFpLRVVU39Pa0FzV08/KyfHJwfb75/v3wlNb1tvAVNfSRdbG2MXX01JBREdNd3d8ZmZ7eXp+TXVJUNzDwMJVQ3NzfWR4eXh6c1LWUcDH1NPT1UlBWE1Kd3VJdkPWR0xY3tnA9sjd01NQVtPYTU5NWFJZ3NZBXF1eTEDUQXdxfGRnZ2VlZX9zcU9QTHh5f2dlc3Jyd1tW2/Dn4OX5+vzJ8/z08PP/yvX2yfHx9czcyfDxxsfMU1Lc1Ehwdn1/R11S11lUUHVH0FJURU95eX1nZX1IdHdfVlZZTXVnYGdmZmZ5emVI1tna9cxTWVlR0srw9MDD8fXI9f3aUtDazPHz8/T29sPMVV59ZHh6dENFWXRId3NAUMHXTUt9fU9TUFfUxcz85PPK2NzTQVDDxFZR2Mf8+vP9zMfA0Mfy+vPCxtDYy/T99cTX0Nvz5fz29vDCycJUXHZ+eX9JTUVCdndxSkxJdmZiYG1iZGV/eHt5dN7M0Fx1dXBxU1rfxd3I8+bk+ef8/vr45+Hv4ub+//j78/T3ydTdxsPIz8RV19nIXkhDdn1+SHRxXV5bVlzc3PfywUVzQ0NM3MXQV1Df0sfG3NfX3tlVXNJdSVtV2svz//f9/f/75+Lg+/b1y/b7/svZ2M7J9vf029FWU190fXhmYG1iZ2R2eHh6Z09WwdRHSHBH1cXz8/bx9f7l5vr98Pfw+/z9/PX02sfK9/bGyMbW9fH88M/00VDdyvLc2tnUzMr4/fXyyNrL8M9fTnZ/c0JQXEZbWXZB2tlSSlt0cHVMXEhNSnBIUMDY0dtU0PX//cPLys7M9/zz8PH/+OTj7eb65f7M0tDcx9PT0sb1zsDbx8bc2c7YVUJyfXFMQ0BNd01FRdzV1VVAUFHR1FDY1tjUX8NfRFxMRUJW21zQRUNfWsr1V8HExs/25/zn5v/78+T/UN7BxdzQ/szA9cT30sfMd3ZxZGBteWdiYW9ibWVefWVwfX9/VlZyRV9c1Vb/9NbGxs/G++D/++X/y87n+sVW18Td9Pvy/v/yysvn+NhbUddU2vDxyvb131718NlTTndkZnF1dnB4ZGB+Sn5hYmZhZ319ZGZke3p/SkdYT3Z8e3VV29raUFJXyPPw983Dw/f08uXg5vH9/frkzt5bQtZQ0tjBx0tPW1pQXllzYGZhZXdKXnN4cnpKWk9wYH10eHRBX39lcHh3WlNWeX51fUPdyt5MUFZR9OTk98798vjg7unm4Of9+ODg98fKx9vL+vjO2FpIcEpcfWdsFWpqYWRiY25qFWx5YWJhYGFkTNBcRHRzfErZ21BQTHFP1f/w9fXWWl7x/svzwlBUxfr+/v32zsj65PD2x11WwvL75f7xUUhWw9lUX31hZX9xdHB8ZmxjZ2NmYWhqaGFleXB5eWd/QkFZR053TtLA9+Xn+8/1/uXl5uHl+OTh4uLt4uX+8/Hz8M9XWdTV0cjPwdZbXkx3dHdxemV7f3dxT0twdmdmZ2Z5ZGV5ZXF0Q0dAQUFISEJ1SnJ2eH1CU9DQWE9N0dHay/Lh+vLl5uzi4OH+++Xk5fv6/vz8+OT6//XRTXZ0cH9ycn5/eGVxSkh2YG9tbW5tYWdmZ3h+d0t3d3p8WE1cXl1UQd30/OXz8dzE/PPk5+Di++Tg7O7t4/LB8/3/+vD+/fLn4OHn/sFJSkp2cX9yfnJIR1hJUERmZmFhYmhjYWFkfkh1WUZ/fHJ0dHNDdXFE0PbIyvDW3cPF98744+bg4ujv4+36/v/19dLN9MPw/eTn++XDRU1KS3h/c35xXlxATV9Ad3xle2FjZmBndEBIdllJckhKREBGWUlEVvT89+Dn9MjD88zx5fnh7ZWX6pXq6eLm4f/5+vTy5O3s5+fk8c/SRnF4eWdhZ31AS1tVR3R4ZmxsYWxtYXtIdEZaRkFJQnBIUUtDUt30wfDxzMzd3ElL3Nbc8P7n4O7q7+7t5vLf9fPP8//k5+yU7OH7/8RG09FGWl/USUbYVVxbXHFjZ2RgbGNnbWF+d3F4c35gZXdNTVve0dHk7+Pm5uHy9Pvl5+Po6u6UkJCXlJTm8fz19crNx1TG+PrxxsFZZGd8ZGRwemR8SV5CSUd3ZGd6Z2d9cH97dV5zdU14ZGF+cX5KdXFJUPXIyPfVRXVOVlH0/vvh45SUlZaV7uLk5/nk4fH8+ufg5uH79N9BREFMWXB6f3B1fnZ3ZGBvbmlvYWBheHt9eHFCfWZmZGR21FFa3Pb8/ufh5ffMxVJFzfn95e3v7OiUleng/sLQ9v/IyvP4/vrs4vzEVlpwWFRLdHBOd352Sn5lZ2MVFWJib21tY2FkcWRvaWkVF25nZ35LVNzM5fbF0V5Bd170yPb74+npl5fp6O/k/fH9/M7J9ff18uHwwsdbSnNDXkZeSk1Gd1FafnhhbW5pZmBhZWd4enl7Y21obmgVYHt7cndWwvX4xNJXc0h2T8vO8/jn6eiRluqV4ufn/uf69sPQz9/G8cHZWnVIcEpOSE58cUp9dH5hYhUVFBRiZmR+dkZCQklweWdmY2N7TkxzR8fK9fTP3FJPTnVK19ZX9/jk5uPt4OX59srHxPfT3cPezPH++cLZ2drX1sZVX1pOTHF2dGRnYG4VFGxgYXx5c0JyfXpibWhqaWR2d0HUyfzl5OX+/MnY38by8fzl5+Dt7e3t4ef88fDOyM/F31fSw9jBVFlFSFzQ1sba1kZKU0lxcH9yZ2Z6ZXB0QltN31N9fXt6Ymtvb2F/fEtxR1VHX1pNcmZ+dEnUzvPy5O/s7ejq6Ofn4eXk+vz32vTy8Pj5/MTfysnI/crURkpOcXxzemNiY2FnTNFZWFlUUkN3cHhnYGZmeHR0SkTZx9fU3EtxfHhydFDc3cH95/r67Ob45OX45Of49vD9+OHh7u7g4+Dm4OLj+fDIVV9eXkFkY2FiYGZ9cHBwfnh+fGZva2kVamlneWR8QdXHwdhQSldGd0DXwMfD/Ofn4ePh5fr68PDn+/fF3sbH9PP98/z4+vrg4+T9/fzD2MDY0VlPTElZVFTYxd1UQl5bZWZmY2JvYGd6SH16c1jXQX12TUpIW1ZU2Mf1/fjh4uLr6+zs4e3g5uH7+uTh4uXk4+Tm4O3t5uX/999FRXB4eGBnZWV7eVxQTV51TE96f2FpbWxiYWVxZXhydlFDdkt2TktOXVXN2NXG9Pj6+uLm4O3j7OPj4f/+/+Ti5+Lh+uDl5OLi5vbP3VLSXFlMfndxSl1Ww9ZAW3RDQXJ5bWxtbmR+cnV9dktD291fTHZ1dkNT28XQ3V7T5eX65fvk5O7p4u7h98/2+uXn4eXm4u/u6ejn8s5T3NVRWXx/ZGF6fEN0eH9nen95eWJqFRdqaW9sbmxtYHlKU1lIQEhZUN/02MfZUd3N+Ob65+Hl5uPi4Pr02s318Pr/8/355Pjg4Pz3zMbXUsnaRUx1d3BN1VdeVNjWRtzWcGRgYmJtYWBvb21hYHBFfGV+c3xnf3dydnRKckPC98r/5Ofl4e/i4+3i5Ofi4+Hm5OT7+OHl8fPI0FxXV0t2cnhmYmNjY2R+eXl5cmdgY2NgYm9saWJmYmd7cXR9cEx1dHRLdnRfS0hHWkdF2P39+P/wztjOzcLw/cnbw/TAyvLz98v2/Pz5+87V2cZRVlRRcHpwT1XbydRydHd4fmR6YmpraG1ge3dkekh1R1/R1E9aU9XM9P7MUMTfzP/m4//09s784OzkyPLJxMbNyN5X1VNR3MvHSnd8eXVETXB4ZGd/RM7OVkZxZGVLRXB+emBhekJcQ0l/fn1A31xcSGR4c9z03cVFdUHf+/L+5M/AzP/j5+b810Zc9cjF8dFAX9j+/PL1RHR2VNlPXnBmZn3XwczAS3pkSdZBVFd0ZmVPWdHNX3hlStLf9/dWcUvT8fjn/NBIVfH08eX72sTw/ubp7+XCyv78++Hn2ETc38P/+MZ+YX5wdH56Z2JmZX1f0lJ6bWFldk11emBmYGRawfVTeXFb3cryzVtT2dv95OT0U0FY0vT65vHT1Mfl4+Pk8s7U18f088DTXV3I8vn8wdhaXsHw8FdYUUlezMPN1XV+fExf01h1dGFmSllXWElkbXJBTkB3dH9/UcnwxdnYQdH95+Hk5PbH++Lp7uLnyMD2+OT8/s5Q3fD89svAT3RbVMXWWEdxc9/x9NzccXpzQcbC9cBYT0LUyMTPRXh4fkhCTnBnenZb29TbXHdZUsHOxcVBSUBc8fL7+t7F9fzm4eLk8vXH9vP3wllbVtfJzvbbXdLY9/DK2U1zcnh9dl5fdHVxR9va9NtdWHBMTVdScXd1QlTEwcVX19PD9fz62tPUXdz1+Pr1wtnE9vH/9drBX0RW0dxeWk1e2sn2ycfBUFPD2tBPf31lf0xSxtLWV0TC8fT031J1fXRMRUN2cXFP0trEzPXC1sj//f730ltP0NzB9NrHRVnLzPTDxFN2U0VAVkl2cH5OUFzQ0F52RNRS3spdc31zSdHKx8xGR8Xby/H03EhKSndYW11NX8TF9vf/99bHwfP59PzVS9fU9ufn5MPY3cj4yP3DTEp5dk9FUHtwdXHXQU5HfnBwQVFMRntjZ2B9RFFUSn1yQ/T9//VQRXFA29jI105NT9fGzcze2dXb8/Dywl9GRd7K/fTeU0JDxv748MFfd0JWxcfST3R3Td3E1lxEdXdexdxfcGRnZHJPQEl1cn9HwvHC1VNIcXZPQXd8Z3twwP/x9sLD2/Dh7eH0V01Szcv3yMTAXFT0+vr32VFHX9HDzlhwe3p3TURBdkxDWcLB2Vp5ZGB3RFNRcXJ9f1/BzsjTUHZzcH9yeGZgbGRNX9dT0VxJRU1ZU3d+f3fAy8bY0d9Txf7k4ub3w0XRXERQRVp2TNXYxsvb3NfQxtPE0HV+eXdKRl1eWE5Z9/7l+/HNRUN2fUp1cHxyS0BFxN7SV1xRSE1ATHVwQVLb9/XM3N709fP/9MVZXV9RwPT000VHQV3F3tdBRkVHVlBEfWV7ZH5NXNrF0srP/+H5zNZfW3BEV15CcEtG1czM2vTa109G3Udwe3lwdtr3wPTWXkFb9cBQ1UVFdUb0XEJGd3J5R110UdFeTVD588jA3FdO2P3VzfLNz/zs4uXl8thAT95QXMXXSnTKylXdxtdFXs7M2dFWXlry5/X2+fTX1/L3zcHa3XVY2dRURUtlbX99en99TXJNw9zWWEt2fVTSV9bYz9LA4efl5uXz3NPZVFNYQUxzWN5HQVhHdUlUXFnRUFpb2/Xf3cfE2M3298XK9N3b9/T28PHSREx2Q316fX5L1sfG0N9Ef3VNUVtNUlxQwPzl9/38xcPC8cdT2VlIXFzY08XN1c308snUxEdI1tryys703Mzf9P7K+fbE8fH78c31UltEQkh+dHxhcEDT98P3xV5bTF1DX9Z1WdrK5fj6/MHH09zRWl1MS0d3SXF0QHZycnFfWlJHdUVMWcT18/bJ98n09/XO2vf0yvn799vVVUF2TUVeQXV1ckbew8bV11FQ2d/BxdTLyP7h4OLm+/LCyvLA2UB0dHRETVFYd35tYXl5dnJ2f2RzcVPc1sfU2PL0/vj4+vP55eTm+PbVVtFT0ddEcGZ5cHdATExzZHBKXsHZwFZU3M755Obk8vb09vfx/NjQ1NTK8/zZd355cXZneXJ9fGF7RdhTfXx2RFZRxMrFUEtazP7/xVdFSV7X2PXW1V1Ry//z3l1ITkRVzfTD3VdWwfL+/fHA0FLEztrBW3d/f0BTVdnRWUhIW1PUUU5DUMT298zYV1pGV1fSxcLfXtjxzfXFWnd+cH5+SHF5e3t2XlBAW3VzT0FZ395WX9Lx8uXn5uTy9//z/eXLVFnXV9TY0kx8fXdwc3R1emF+fnJPWF9xcXVe2c3xy8jx8+Ds7OP48cbdwNjD00l1dUhVUEF0en9+eGVkeWRlfXBS2/HI2d9Swcn0+/bMx9rP9vzz2tNGRlLXUVhCdHZ8cHF3dEh3S0ROXF1T3t/F8Pn69s739PT2zPP99clDQ9zTU1hBWXR9fHpwdU5Ad0BYRU9G1NHc3FBdWFJcWF1QV95dUE5B1NdVWlnVUUdfdElKdVtITFlYV19R0lTAwNzR0tnb0Nfbz8DE3sD3+fnJ2trf1FXQ9/3w8/H09sjJ2NbTUlbXXNZVWEB1TlJNRkp+d3x+fHx5fmdhY2dyTltBXlpBXcf19vHw8f//8vj8/Pv19PH09cTd3EJ2ZmBhbWdhb2Z1XFldxvDDzPD8+/34+vzk4OPm4e/g+/X3ztVFf2djbm5rFWhsZ2Rmf39/dmVMQ3FTWVHTU/T88//x5OD74+ns58fYT3x/eWZgeHFZ09vJx9zEyvHx9s5TdHdIRkdM1tRYx/T75/jKSWR7f3J9eHN5c1rQ98/QV0zV9Pf7/vbMU11E1cbb3FJX2sn7+fHdd31+fX17eHx9TEXUyv349v3l+/3w8M3VVd1SQlTeUVPd8fHaVll6YGd6Zmd+cnFlf1pU0NTaUN72zPb1xcDQwvXG8fHe2tj08PX31kt9f0B2eHR9ZWVyRlHM/fD18+X8+Pv98NzEyt7z/vXN08XAx9BMcn1lY2NiZGRhZXh3Qdzw98X19fHk4eLg+efk//nn7eDk5+bn5PH3wltxZ2Jra25ub2FxdUVSSUpJW15Y09JBd3xyT3Jf0d328vj5yMjJ1VtaQ0JKX1xMR1HX2tNdRHVxWlbTxNLe1VleUN3I9PPl7evi4OHw/vLx/8vJ99/b9vz7/vTLUFnVUN1FdnV6ZHZ9d012TktMxsRfTX9kZmFlZ2V3TkdNQ9PWxd/T2srO8+Xl5+Xy8cnz5+Hk/vLn5Pry2ldwYWNob2BgemdldnVb3cf0yPL65u3v7OPk+uX65OHk/frl//LXX3dhbW4VFBRqbm5mZWF7fHRd1NLe1N/bxcr09PHHzNrew8708fXdWnFMR3x4ZHlLWPX2wczV29rS5Ofl7ODk5Pzk+cLLz9rZWNvK3/3BRlRF3dh2SH17cX1GXnRIfGZwd1zM09PXV9xQ0PTHzPTFx8f35Prz3E1Dcnp8e353dktETV1Pd3R0RFlXwMTKyN/axvL7/uXl/P/x5eH799d0cHBxd0h0dnxwfHt0cH54ZHt8cE1YTHR2c09PREVCVlNR3c//+v3E1UdAT0ZcRFnUVNn0/+Hj4OLj7eLg5/bS0EdKQUtwcWRke3l8fURHcX13cHB8ZHJ+eVlF0MTN9vT2+uXl5efm+8r198DdXl1OcklNS0hKTUd+cHR9SElzZWNkeHt0TdFXRNTO9/D45OT2yvLKx8j19VdXxdfEzc3BT0NScX53SmVoFWNmZHp0WnN20d7C9//l+Pfk4Obi4eb8wvHKzfD299dI39Hf3UxaSXl2cXp5fmZiYHRAfn50WXF9R1FORdxWTElSwFNe2NtUQNH8zNvc0UVCRd/c3Pf59vbx8/P3+fPM9/L8/srO+vbO9ffPUkBUQ0BQ0dVOfXZ9Z3lhYGNlW0B0Q3ZOdk7A8fHx9ff+/OX59PbJy/naxMNR03JkZXxxZ29oFWhiY2ZlZXBxdlTZxN3Azs755uDn5Prl/Mzh6Oro+t5Wd1pOcnVKRk10Rl5FSHddQEvFx97c0VpZTETfwvfFyvLPxdxMfHV7c319RUDX8fbJzvL68vbxw9JGQFxLQl5Mdn9hZ21jcn16emltYm5hen5JX/X99Pjm5efn6JeXkJOU6ePm5/vs6Ob/9eTh88HWemNibW4UFm5oamlrY2dlcX1lfnp9dEXNwNZZU/T58Pj85+zr7uL7wdlTQ0xF3sv2wkB0dnRFUVdTUV1Ld15cU1fX2c7y+vz9//zxUFtYRtDWTXV0TFfY9/Hx997Ez8TKycLN2FXSXU5LTHRkZn5IWU5+Z20VbGd5fXFF1tHy+Prh4+vp7OqWl+rp7OH4+uT4+svdUUlGV3VyfmBpa2loaGJmeXl6fkRfVNPY01XdwMbQ09tfXEXE9sD0//Dx///39M719Mvb9/7+8fn99Mvw9cbAxd1fQE1PQVt1cnN0cHR3XcXHyl1MR3JOTXJ2cnVXVsDZXNLTU9nSw/TBzcXXxtjH9ff5zl/V3s7z3UBzZmBjYmFtYm1pY2VwTELW0F3D9/Ph5+Hu4uzv7eju6e7m5uDk+VR2fm5pFBcUFxdpahVub2Z4fnNZXdL3/uHn4+by+uTh7+Hm4Obs4v/4ydDQRnV2eHRNSHd9dk9MWVzR21Z1TnB2cWZgbG5ib2Z+ddzRc3NwQlBMVtFaxf3k6ezp6OPk5+Lp4uD4yc3WRtZCTUpnYWJhdHhtb2hrbWJ8fn5NcHTX0vvk//z1yfPw5+Hl7uPl5OXs5/T10VTCysTWcHphb2xuY3phZ2NjYWBnfmFlcnxKcUTM3N7QUcv+++bm5eLi5vv/+PDZ30p6cnRf0EDQXULDyfbx1MnVSVTczfFQ2sJQ2Mv67eTh/MXX0l/cdHNMRlNQVPfR0MHbzPP87efx+9vQV3dNSHp6YG16Z35naW4Ua2NvYWNpYWNgd0NU1lnG9ubqlJeW6peV7u7t7eLx8OTh4+H5+VdYX15bcn1DfGVhYHp7ZmZjZmFmeHFJX0VYQl3exPbK2cbJ/P/85frn/src2cf3z97Z3N1VR0l1T0pLTVtbUk9wfn1xQHVIRdfHx99dWVNSR1xGW1JR09rC/fP6+vvn5fz/8fz99vTeXdVGRnFzcXx7dH1+eWNnYG9nYXBSUc3M2/bw/+DolJXplJSV6+Ds5ML9/8PTT1JLd3Z3dnh4eGRpbmxob2NnZGFnZWZnZUxCcUlbUVlFV1l0VM709vrule3m4ePt7JTv5Pvm7e3m4OT02Mb02kVFcGZjbWRkYGV6fnJ6fn10xvXR1lzb3V/Ey8D29+X79Pz6ydBYzfz38fn22k9DXHVewtJ1ZnBacH19cGRiYHlgb2Z/e2R9UtDC8vrg4ePq7+mUlOrg5OX68PH9z8PeylxPcHNkaxcUampvZGFsbWRwSFX/5Pv8/OT6+uDh+uXk+MrRz/XFVUZHVVtTVHd9dUFGR1fEXkJ+ckVY2/PFUkdxcXN8c3hlYmx6eUNQQ3FwQFzT2vDy+/n+5/rn4OTk5/vk+f7lysJWS013SVJFc3tkfnx7dHV9YGtvYmNxQURLfk5fUdze2ttS1drHyvv6//Dn7O3g4+3t5vr8yvXIwV92fHx6YWNtbGsUamtsZ354ZmR8dU1e2sxUUlHP/uHo4+X4++T/ycvHUEZKQVpE1EJ3R0XZx1fa3UV0eXFeUN1UW1Ba0MnfyMHQ00d2QVf09MX29Pf4+Ofm5fn4/f34+spU1ER3d3J6YGloahYWFxUUF2tobmRxQ3R0XlRR0/Hg4eDr6ezv6evi+uf69cHJ+vDZ9fXYwcvzwlpFXkxxT9BVcXZMf35zRHVyc3F/ZGd2SnV3Rk5E1fbyzNvLwt/K/fPz+ub89fT58N5TV1JKdFRWSHdMTnN9RkB0dU5XXnVQWEJOR1FYWMP3xllOVN3Wxs7HwMvy/P3z89rUUtDSX1TC2tzGRHRzc3d4Z2BgemZkTU5PUMzCyvji7OX75+Hn5Ozv+/H65+f45/nQdnZPc2V7cHpgZHx6emVwcmZhf3tkeHNzfnl2d3VAVNFcTVlRQF3ex9zM+uXn4O/v4e3p7f72/fHZ187M2sDPy1p9dUh7ZHx2emB6d0t0TdxR0/fn5PHIzMHe2Pf65fP79sDE2s7C0VReQEHTyfPbU0p2cHZJdEt/Y2hpY2FySUVxZH52QVDSy9VOSlnC9PD/5fn75u3t7Ozh89Hd9fPKyPTXS3d3Q13TVVRHd0lNX0dG0MXfwv/m4ef10EhKWlhUXENJTUdXx/Hwy8LNwMD3zcLVQlH19v3yzd11cEh0ZGFpaxATFhRienNOTkbF9f7+8/r45+zulJGUlOng7+iVleLh9F1SfHxNdXV8Zndyf3NlfHtjeHBKWkxGR3dZV9HJw/VQfUpQU9DVVdVK18rI8Pzh4vD8++Xm8/TIV0BaVdFRRFtwbWxmYWFheXl9ZWV5fHdDUsvcx/385eTk5fr/+eTk+95X2kh9eHJPcn11W1ZTwvTdQVzdW3N0UNFAXd32/ff65PHP9OT31tnI31vfxsbSVsb08Pb099VwS0RcRUBSUEB3dnBweWR7ZGZgbGRgY2V+SUx12dtV1crwwlhHUklCWlbZXdrm4Ofl4uL2y/bI9dj1+f30+Pzk5fDk/9bc1VZPZ2BiaW5pbGBneHZ/emR5dl/G9vL68/Xz8v338eXww/b2yvLy9vTR10BKdWF4fG8Va2JkZXNIcHN1WNXf2fX0y1VH1tXWzPf++v/8w9PCy/XPwM33wMD39PTE3lRU1EdW3Ex8ZX13fU9WXlBdQlXTVvfP3lhxRFp0Xsfz+/3J9c7Dz/TNXUxwckxIUtRKWkRL1FzT8fdURXphZm17c39xZmFwe3lY0dhYR1LXV8b//vXA9/L7+Pvj5MLOyPjm4ezi/MLWR0xwdFdDf2djYWVyWFzR0FxeUdzbwdJBdnFI3PfD9PzR1V9X8Pb/5vFWXd3398r9+8NbdEtKc0ZGfWBubWFhZXx2emxgZ3NbUERPf2VKWvTn5u/i+P77/v/m5f7IXU5NVtXB9vLGW0xdVt/H0lZ1U8nf8/Dz+1N038P05uT3z0lT0VnJ/PjDWHJ5ZXpOUFtAdXdKQdz/8s5SeXt6Z0JJYW1qFG1gfcfYUVZMcdVcwv/MydTYx/T94OPh5+T5+vr+5PHVTk1M3c7/4fdbW0NQwvPk/MZWV1NU2Mz+y1dJfmV6fnJ4fWZmZWd8WtzH105dU1L0/PLyVdPCyPrh7unm98deSVfYUkZ8YGRkZn5ZVN5XdEx7d9jf0lh1W0Bd9fn991F3cHlZ9vTO3EPRw8n54OLh59tdQ1rLzM3J0tHH39zw/sHdc3h6clJdRUJ+ZXB10/vm5//d1cf07eD58sjUW0VNw8pV0XFmZGZ8ZWdnbW5rb2B9Q3dxYWx7TtfGx/PM3NXByPni4PvI2l3Tyff1/vP+//jk4+zj+crfUlzMwttcdHhkd9fBztFbcWFtZUBSQUxJSlDVxNjM9Pvxw9jC/cvEw9hZVd/SV9nZ2EFnbGNwTk5HQHF8cn922cTAXnN9f1pfd0FRVlPQ2tP8+f3IQE9GwM/B8vPaX1f0/eLu4/FZc31d1djYRnROR9/A9vvKXVLVUfXywMjFcE/Z39zx8MreeWd+dkVdWkVIc01RUtzO0UBxf3h0VlpITHRf9MTR2t5DeWFjZXBCXk1dWHdB09305ub92VnVx/f88vr99uXh+ubg+8RcQkzT0FRaWERPWtHFyfr23E5zZmZzX9ZU21BAQFje/sRSQ3F7eUVcVl5dUc3l7+jr58ZCd3N22dhXQ05+ZHhyS9FWcHtmY2lldE58cU5NUFfP//3EXdXD0ff7/sXSVVTY3Pnk9lVHcXx8RsTYwuXn5OTk7Oji+cnX1Vpaxt5HV1Bf2sT2+d9yYWhvY2NzRklBUkZW2vzg5cnWSXZwZH92e2VyeUtKRsVGY29uaGN6WNRJdV5G0fHl6ZX6z9vRVlfO8PHx4ePm4eDt4/XTVFBUXdRU1FpWxfLl7evv9HV+Z25qbWBgbWF5dUHT9/Fdd0FbS3BU39xV08j75++V6+TXdHZzeERAcHtnZHN9d9LcXnV7ZXB+S19eWNP15OT44+Dy1Ul3cH52Qnd1QnVWy/Pv6uH0UElBS1vBy8z08fnm5+7u5M1SWUx/ZXp8cH93VPfJ8eT301x3f3N3TlTeUFhcx83/7eTEXnB4ZmNhZ2RhZUrT0M7l+VN8eXxlZ2RySX903cL84OuV+tdYdn5/Zn1adVnx5O2UkZfj4eDm8dNbdnVzd9Px8+fh5MlHfX1gb2xif3Jnddze8uTg5PBU3FhNSUXBQkhEyPD+5fjA1U5xfWVkZXF2SV7PyPTl5/z01XVlbGFnZ3xAQ9vc2vT+8t9JfnVwZH9PW9De9+bu6pSU6OHHVF5/dlHQzNdbV/fl7eH09F51f2Z5dFhX1djO5ebi4PDHUUxlb2lgbWZ6YGVcxPf5/Of930xgY3Fhd1JJSsH88P/z88TVcGRgYGBneXhyUsrN8/P5//rY0NPC8d7y8P375/vn4OHl4PV3cnJPT0dA0cX39sDN9tvZXXp7Y2JnTV9dU83D1/D89fZSYGNtbmN/SFjc9f/44O3i7e3xWEd9dnR5fEhR0NfTxFlMdWVrbm5kcnx9cFhW283z/P/y3nxNVVPf2djL/fDm5/n6+vRafnVURFNGdcH5/efi7uPn5c5TREhwfHZwXcne1ML00d/bVUR3ZWNoaWxhc3dYz/fG9/z00EtKdHVzd0hwfHxIU15UzlFyZWVlTEBFV3RaXdTO9fPh/cBeTlHEwVPExsHI+ePolerg9lVNSUfRSFTRU11X2s7y88JLfHtmZmxrYmFtenXZyvD+yPXcUUFfWF9fVVZT3/Xx9PfYyddHcX12cHJOdU1QQkFb2dZUQHZ0ckpMWkVPU93F2Mnh5vnAdH17YGB4WlfB9v/95uvv7eP1zMBeWklKdEFd3ML87+Hl5vJVRXd+T05leXtxQ0bExNzDVUteW3F1dHx3cUbFVt7TX9BOdN70Xk5JeXFDX97b9cdVwNN0c3R6ckF7f03X8/z3z9DP/MrM/vfw8tVGVMjk5+ft4ef+zNrz9N/extBMdkhFU15HVk5zcdVcTnVMXt7Y0NhSRndxZ2ZnT0JJW1xHVVbf+Pzk8//IVFdQQHdZ0VZa2sj++PBcUnxiY2FyeHh/YWF5fEXL+Pbx9t3a9fP2+OX9+v72+O/o+sFQfnFZXtfAxl9HSVnQ/eTNxVN7flDQwvf3xdb0ydnK/vfWXHhrYmNtZWRgYXN2dkH//NfSWV/Gz9789dFAQkBKVvXx1FdHT3dyZH1KdHN1T3dBUMfd0tvK8+Tl4+jt5+T88OXh7OTPxcbf21Xf99t1S0pwS0Ld2VR1XVZfWkXb00p1WEZS3sbF13F3T9f09f/PTnF9YXhAUdLTQ0xVWcfC881c1dVETNLcRnBmZnRAU9vy+cNdQ0ZP3vb1wU5wRt7G/OTm5Pr58/X95/79zs/ByN70+vL1x8zH09749dNbTV5ZRNv79MnVQHd8fERaSktwd3d2TV1f1lVTSnRAXVZcQH5+ckpfzvXOwFl3SlLP8MLcQUFeXdj8+/PxzNxWV9rG28bZyvPw/Pn48PbN19LHyMHS0lZTQt395+f55fRPdHdKdn5zZGd4ck5T3FTOzFRWWF1TW9xRQUFXUFfD9PLN1El0RNnTVFNKdkNCW9zQ9cReTnRJW3ZxXURc3MTCx1zH1Et3cXN8dFLV1FJE3MH9/fL7yNjPxN5VWtZMf9TC0M/aw8rT1N9VVF1Od09LQNhdUlXb9M/b3ldQzNjS39jb21dXWUdRTnF3TnF8fHFKQNTM2MXf2cnXXV5FQ39/c3l0TlheVNXU9VB0d3x4ZGd/fEhExsrx8PXh5eTg5Pn3xMPfXV1V19BU0v3y3Ud5Z2ZtZXN7f05KWNVUyPH39//8+/X09MH0/P3n5PP798bSWmdmY2BkYWF+fHJCW8b1xV9YTnd4ZHx4eVpHXN/W9cPJ2PX8/t1xdHx7fXVJVFXMy/LI29HVVV3HyszNwlLT1tdV0szN29za1NvXXl9Z1crCwNnc1lfS1ddcUVTa11tf2NnS9vnw2UFDTGFne3FDUU5PRXVKf3J4fHRKcX15eHt5dElYzfj/8/Hz3tHQx/Dl5PDfzfzy9sTG39NMS1PXRktUXFfD8vr90F1HREF1S0BW1MZVUdVexvf/5Pr0XXRhYXhnYGF6dU1axMdRUVhPVdn09lt1QENaRdPGwthUVnRzc093S19bQHN+T9vOzsLLwffzx/X10MXCzvnm4+H7zVJKTEpOW9XC1kZEdUpQ193GwF5OdX19fH5wTkxfVNHE3VRRX13Z2dNfRFJYQlb19P33zMZbSENHW9bP8/zIysjLzdnd11hLS39kZ3hwdnRHwfnn4ObyzURxTFtKRdvfUFzT9/364eLmyVRd11tOSUF0cVnTUEl1fHp+RFHTWXdMdnNzdtPy8PD8z9XRz/HM+ePi4Pvw/vr+ydzRUEBwd0txcnxkYULe09JbdHN8cnlxd0xTw8/bzPrl+ePv7u7j5fbBw1TUycXNUENxdEl0eGZ5cHZXxFXRU8bb2fDy88rQQUdcVd/0+efk5fj75+Dm011DfX5nY2JjZ2RyUPX2/uXIwMnz9NzEy8Hf2dvO8fP9//bw9vTTcXB+Z2JsZ3FzfHJxc3hK2MfO/P3zyNbZ9P3+8P7zz/TNxlDO/Pv/+f/MxFVRX0JfS3VAfGR6fnx2W8/Iyvv7+vjJ3tLezszb2dPb8dhe19rLws/YW1rEwFpJcU5ZV9dCSnd2cXx4eXRUWXdDR1lX9+Hj4Pv30tjA29vE9/L8+/Pl5uT598zCxt/STXZJTEZc2cv/5f1XVd1GdnFJcXFycn5/Rl3Uz8j38sjW3Mr12kZS2Vff21x2TkZAUkVczMjFTXF5f310R05ASHFze31dwvz7++Hn8Pv65ebl9cLdUFpOTHl9T1NZRNTW0V1CTFjf/eHn+fbb3VTD8+X/zdddRElAdHN3dEJfRFjU0HZnYWV5d1pSWFRRfHZc3cbK//fRUUdMUt/CxNPX193P3kdXX1hX1lJ2f3Z2fnRTxMv65//3z1pPWFPNyvXZQnRASV7ezfXK88LH//jO3VZXWkBcS396ZG1ubGZkcHR3dXNlZX9IVd3O31tfXd3J8Pjn5eD7zcFX1EV9cHB9cHZ8eGRnenVa1tvDVkxDdELS/eT4+fn1xNv25frH1UZJSX56ZmBkZHl2S0FWQk1dWsLw/fvw8cBAcHZ/dE5NTXVdRXZxdEnVVlbX18DG38nSUcHE9MjF2l5NRnVf2NHJw1hZWHFwZXXE0cfeRHF9cHF2RUVe1FbX1UdEWlHb3Mb2yNZEd3N7cU93QUR1fnhAR0xF3lhe3tBQQt328eHh+uf7/fHJxVNFUkB3RFZASnBycVnLzdHwztNccnh4SUh1X9FXVVFX2Mb08870+vLO3VJfX9TVRNjeRkd3emVwX9JHSnBgY21sZ3t5e3BXVlHKy8L54Ovp6ZTu4eb2zc7E2cTxwl7V0XZORUdFR0dFcnt/ZXBP1cb2/PPw8vD0//77/vH23ltBT01ZWUZeXUBJdn1kZHJNTUDRUEpKdnh8c392Rkp9cEt1X/Pk5+Ht7OPn/vL2yMzDxtjZ29ZUV9fHwcnw9lBwd3RA1FfTzsnx/Pz8/P36+Pj8+/rI1dfVU99T0PDMV0d8Z2dkfX18dUp2c3x9cHN2SltYVsfBwsb15ODm7+ju4v7D3VRcTnR0fnRATEBAUPT19fn8/ffSVlhA19j1/v33ysDfzvL/9PL98vLN39DQV1dVUV/Y0llwZ351d1rfXFdedHRJcnBPdH56cnB1TVTJ5ebt7O7u4fvJ3VtSU19YW053f3h3QEZbR3FCQEpLSndFUdr2/uPu7+Hm4OD65Ob+98HX0FJBUtJO1nxLUGZ0T05G3dbRxs/VRnd4ZX19d052Q3ZD3MT/4u/v4OTk88xdcnB8e3x2Q0dIRdXRy/XIwl7WVlrWRkHQUdXW19DaxszR2fny+Pv//ttcRUzX3dDVRnZ8ZGV9ekDUWl9BWlBMdHxkfXJ9TtfJ9832+ubs4uLi4fzEXU5xc3Fzf319cnRCVlbd2dbR0VdPd0FGR1bDyvTy//n1zvXP8vnx8MjYU0N0cn19d3x/f3FxfErV0NFRXN1XQHN4e355c319cXZd0NnM/ODu6ZTq4vLS0sbe3NdLWkN2cXdIUVfX1EHdXE12fnVGTdzM9/r9/eX9/+f55fb08t1JfnJKSkp1fH94YWd/enxZ0FVNWFhxZWBmf3lzc3xHQ05W1cb45uDm5OD/009xdkdXUUReVURXxsTC+vrxw8LaX3ZyT0RUVdXTzNrdxcHUx+Hs4eDg89heUtXB9cbU1VJweXxyf09Hd35wfGBsaGoVY2ZkeHZOTV7WzP3i6e7s4/DK2dNXVdpcTk9dTEZMTUvVzsDa39RMT3llSsT0//L29vX38/L+4+T4+eXJ11h9eH93f39/fX98c3dY09BUWEdLeHlkZ2ZlZ2V5ck1wfU5AVfD45efl88/Z1t/IyMbP29BUXdHY0NFHSkhKdHhkY2NmZHFBxN/DyPb2/OHv6Ozt5+X5ysDa3dxUX1hPRkl+ZGd9dHB9fn1xZ2hqaGN4eUdGS9XQx/Pm7e3i7ung/MLM0kFHU0BIdUBKfH5KRFlfRkJNRn1+cn1zR9PE2dfC3tHD8vP28ffw/PDH0NLZ2Pfwz1ldVUh3SkF3cEFGS3J4YGgVa216dnB+QVJKWvfm5uzu7eHk5P/M3cLx8/XTXdrQVl9eSHFNdH1kemRgYX5HwM3CyMv4/+Xh5uTg4ub6/Pr0VUVMSkNKdHh4Z2d4cn5ndnRDSXVwfH95fU1VUFJX1933+OX/4e3g4+Dm//fx/fXy8szO29HYwdJHdlHdWNXWTXVzcUJbzMDW2N7Pysny8/Pk5f/6/vD5ysNWRVF1eHh+e3J5ZGVleWZmZGJob2ZlenJDQlnU8efg7+ju6urt6ezn5frz/cLcVEtGQXR2cnN3cXV1WFZSRVfdxsHSz/b3/uTl5frn4eTk5uDm+vvzzclUdXR6ZH5+cX1+cXZITXZ+eGVhYmZ6Znl/ZnxE1NfU9+f/+uLi7ezu7uHt4PLzy9LMxtxScnR/YGV6ZXh5enp20ENx09bA/+Ts7OiWlZWWlenu5PzPyMVlY2Nub2BjYm9tZmN4TnZwdn1ye3x8enRIRt318/3z+uX4+vz/5frz8PH30kJPdH1KW0VYWllBRlNQQkFOTkNa1l5ZXdHfy/fz+fvk4+7plZXq7u3m8sNfcH1wcnd/Z2NibGhqbGFjYm1jY2RlZnpNVdr47emVl+ru6evu4efk8srJXHB5f3lnYGJsbWd5ck9VWV7W1lNe3tfX2PT//ufn+Prk++Xk4ePj5vFdRHJjYmJgZXBwdk5MSHFwcX95ZGVnY2RkYGZxQ1jV18z45Obs6+rqlerp7eLlwl1R3VlIZWJibGhraWFnZ3h6eXR3fHBC2/Ln7O6VkJGWlpSU6e/t+8hVeW1rFWoVamoWam5oZnJ1Qk1ASkhERVhYX9v08+fl8vnLxsP1/fvm5v/8yl1Lc3REWdbfRF3TVFBQVlTf1VlZTHB8Z2NnfHdIR0HA8fLk4uqXlOvv7ObzxURLT3V+Zm0VFxAdEhMRFhcWFW5uaGtmdsX85OiXlJGX6pWVleqU6Ozn3kp3emJtaBdrampsbGZwR1Pd1t7O9cvA/uXk4+3v7+Hm/vnn5+Hn9tZccmJrFBVvYGdncn1/dnB9f31xTUREQUh4YGNjZn56fnROUNTZzPrj7+no65SV6e3h5/DI1kBwZW1oa25hZmRnZWR7YmB+XsHx4e2Vl5eXlZWUlJXr7OT52XRnYm1qFRQXERYWFhYXFWliYWVM0d3Hzvjl5ODn5Of7/fL19fzl+cNaTnB6ZGd/fHJ0fXdCREF0Slb09/T3yvHHUkhKQ03Xxsbx8v/64O3v7uPi7enu4PjPzdNLfmdsaBUXERARFGhvbGNgYGd9VMDy5eHv7+7i4OHk4+zs7eH+8MtdS3hnZGZgYmJoaWxiZ31MSdTI8eTt7eHg7+zs4uPi4+bm5vvn/83ZWHZ7ZGZmZHJ5ZXNLcn5hYmBncElfWEdKdnJ9cEpZX1XMx97Ayvnn4Obi6Ovo6+ni/dvYT39nYWJraG9tY3p8ck1PcEHV0srl4O3ulZSVlJSVleqV7ub+yF9JfGZvbW8UFRUWEh0QFhRvYXBRzeXi6uvq6Ojo7u/v5//58cTR10l2dnZ2d3RPTVvVUFJR1VDQyvXG8Pr6/ffP1kRPdUfT08HKy8HC+OT+9vD5/uXh5vvIwFJ2d35mY28Va2hrFGhsbmlvZHJOUcz19P3n5uHg4Ozo6Onp7+3n5PPbSH1xZWFiY21ra2lpYmBlRtnz4Onu7uuV6+7u6pTo6ezt4Pr498NYc3x8fn9wfWZlfHt6YWBgYGF7eXR2dlpZRExAR13f2d/H3dvNzdHW0FTE8PLk5//19vzF1trR0dnXXUZZ1dZWRU5S11ffz/Lyyvjn4+zu65WUkZGW6u/i5M1aS3lhbGgXFhASExIdExYUbmFwVNv1/Ofg5+fm5ubk5f/z98/b0nR4e3l9fk5KdnRIU190dFvT38Hy+eTk4efy0trB39zN8/TI9Pzk+vnh4+Dk5+Dm+fP+8tNPS3V2ZWVmYmgUahQWERRvbG16Tl1R3PHl+/jm7eLrlpTu5ObkwV5wdnZhbG5ubxVuYWFgZndDUvXk5uXn4u/j4OPv6eLh4u/i4efy3lJFXUlKSHF/ZmV6ZGZjZ35lZ3p0cXlwQUl1cUDfXVpDTEl0R1ZZWlpW1UBF1snI2/XPycPX2sTTVVNZd0lbTn1leHBweXNxRUhN0dDBzv7s6+qWkZaVlZfr4frwwFN7Zm1pFBQVFxAQERdoaGNleH9f9/z8/Prk+vr65+T+5f3QQnFwdHN+f2VgbWRzfn1IWFVX2PP6/v7l+vD1/OXh+MvHUHV11Mfd0MXNwMXL/vnx9vTA1lFYUl10cXx7Y2BkbxUVFBRqaGN+fXl6f3BM0/bh7eLs7Of75ub13NPVUUd2dXZ5ZmFkZ3p+dkd0S1JTVcH95Pj+/v75/f/m5/vk5vj3//P09srNx0V2dXV9Z3p4eXp6c0lyZmNhYmxnenZCQVtAT05b3cdX0NDbUFPNyt7VV15CQdLQwcbb2NVTUdvERXd0d3B00vD9wNrY3d32++Du75WWlJXq6uLzy8TdXUVfVkhmaRQVamxvYGFsb2JhZnBFTUtHXVTTyvL88/TB1kVGQ3V2ZGRkZ2R+Qkl/eXZEVsH+4+7m/ffAwcjK//ny9/T29c3DV1hf0MbO8vrn4uH75fL64+Dm+/7ywt3d3F1ybBUUEBMWF2pvbm1jZnFEwP374+zu6evo4/PRdHN+c0NATHd6Y21iZHx0dEhPdUXG++f4++fj7O2VlJaV7+zn//39/P3Z1ERLSE9eWnR9Z2RxSVfF9srERXdLTnZxSndwc3Z21NNYQHF/cXZF1thQdXVxc3Rcz/z38f/y8/3k5PHRSnBxcn92WkNMdHZMX1XF/fn9/+Ht65SXle/n+vn5+uTl987WQndPQEFLeGZnY2xgZmJsYGF4dlvN5eXl5Pvl5fn8/fbRTEt5e39+ZXt6Z2V2V83x8fL2w/Xy+fn8+PL09cHz5/vI9cPc0N7B/+b/98/HxPf++uT/zPfI2vXx2FtKZGBgYG1gbW5oampseEtc3dnB/Pz54+HIw95aRkpPVtJCdEtNS0hf0cfWdUBVVsTOwVXexcP08/Lg7Of7+OTm4efn5Pj198zJ//LGRFheU1bVwvv+ysXHXUlCdGVgbW5hbG5hZWRhZXFF19HE8vTD3tJXx/Hy9vfE0cPf28jXR052d3Z1Q1FSQ1pQX1jG8/7//uXh7OuXkZTv4Of68vfx/vfVRFhDSkFcWU59e3x5eHhkbWlpb2BkfEtdXERTV1HQ9PDbU0BPSn10QHBhY2d8dktG0s7FxPL5/vnm5/z3xcjN0t/cRHZ0TVPHzvf//vTN8P/75uzv4u3j7+3g5vvDUlpZTHF8ZHphFBYVahVobG1tZ3Pfzc745/jx9vLL3NTW3EZ5en16ZGdkZ2dnfURARF5ZTF7S28r55+Lj5OXm4+Hi7OLn+Pnn+cLAw9VIT19TUF9S29ddXsfM2tvXWHJnZ2VhbG5sahcVaWN4dkJcWkRQ1ltWVllNSEbawVBNRE1lZH93cXd3Q0dxcFpeQltdXVhY3P7m5+Tj4uX75uDm5uHg5PPO9sLS1VNAdUfU2NZESEhlY2B/cXlwQEFxeX53cXVZVkZCRNDVTHZ3S39hZHB8fHx1THZBV9Dc3szNX1LQy/Xax95YS3dAUlzF/+f65ODv4+Tm4Of9/ubj5/30ztZMdF9YTUl1cGdgYGBhYGNnYmliZUhHX8fLws30//HLy8BeSk5Bd2RgYG8UFG9nZHlxdXR3S9zJ8Ofg7eDm4uLg5ufn5PH1y8PN01dfW1ZU2s7JyvfLz/H45+f+8/DZR0ZFQnVxfGFsa2pvbmxmf0pMVsnIx93YwdBX3sXd1FlNcX15ZX55fnF2fn59cHBOUN/A28DI9PDl4uiVlejp6O/o6+zg5uHn88jcXE96Z3p5cHVLdXN8ZX5zdVxURUNOSkN1dUtIT3R1SnN/cn9hYmFle3t6eXhkenZeV9/DxNtSTFbbyfb85f789sLNw8XCwszz5OLg5f7y+fjy+ufm5uT4/f388vf29PfaUl9HSXF9fnplYWNjbWJkSURc28PEwMLF3ldfRkVNSXFlYG1ra2hvY2d+c3VxdkPTyPz65Obs7uzv7+3j5vv5/vz45/vx9/Tx9vD98MfQ1Nj19vz5987d1tJSXlpCTXR8fH5le397ZmRyQlPQ0lNOd3B2TkBbUVB1cHBzfX97eGRhYWZ4cHB3Tk9F1/Tz+Obi7unrlJeV6uvu4ubk5f/y8/DK31VXV1XV2fHMx8v2+fvxzMfNyNxcWkBd0VNEd3FKTUBCSXV3cH17enxxcmVmZmdlf3VAT3N+ckt1dFtX1t7Eyfb++vzxycb1+OHt7+nu7+Lj4umUleji5uHg4OXzw9pVQE1Z0dZHc318eGV4cnR0d09YV8f0wtBFSXJ6ZmZmZGVkZGBjYmxvbm9tYGR5dkJFW1NRx/X54Onq6pWVlero6Oju7+/v4+Tk5OT788rOwvb/+efn5uX74ODh5fPAUnV0dnx5Zm1oFxcXFW5sY2ZnYG9jZnl/fXJwd3RBQkdOf3phYXp3WlHVwc3C/OXg4uPj5OTj6ZWUl5To7OPg4+Pm+/799vfw9NBSWk1PS05BRkJxZWdjaWpuYWBmZGVlZXh4fnh6emRlZWRken9yd0JeVtze1tnAzsbI/vj5+P/9//n+//rn5+bk/vHw//j5+vv/y9rb3lNCcHxwcHd0SnFxfmRlZHhxSkp3c3llf3d0cnxyf3N9cUZCQltZWVlHUtVRVlbdUdXPy83SXFpQ08fx//3/+/L//PP+//j88/D3///3wtlfWlNZW09yZ2dke392TEBNSk5aQ0ld08TTWVlZQnRLR0B1R0RaXVJW0dLS28DO9PTGzMzCyPf39/fG0NbURXB9eHp8cnh8fHp8d0RdWVjQ0FLTwNjUX9TQVtPSwMHRRUVNSEfWxcbNx/TNyf/4+fj7//XEwsLAwMjD3l1d2cnGVl9TUnJ/fGVmbW1ibWd+SkV0cnVHSEpe2dZWU1ZST0JJdUBLdXV2Q0XX2dzdyPHx5eHg5+Hg4+f65ufk+/LyzsH19/nxwsDcXnZLW05wd3ByZGNjYm1obm5obGBme2RhZ2ZmZHNISU9LSXN+c0hAW15ZW1rdwPH5/P7k4Obh7OLj4+Hn+Pz5/fD02NVEV9rx+vnw9vf29/DzwNNFQHR4ZWFtaWpqFBRqaG1vaG5sbm9iYXt7en53dE9YXVXT28vJ9uTg6euV6uju6Oju7ODn5+X55eT68v398fTz+vr49s7YVkFERE1Icn97YWFnZ2RjYWFsb21hZ2FgYWdjbGNnZGFiZmFjZXdaXETQ2tzF/ePt7e/o6+/s6ejs4eHh5+Tk5eT/9/fA0tXcwNjb39XVRV/a0ER1SU9PU9zbwFJPRkN0cExJfXpnZXhkeEpyZnp1c3DRwfXwwsv39PT28vPw9vH+/PL4+vL09fTC8OX4+/n3yPTA39rbUFpGW1lAW1pNcn1/f3B0TU9MS31zfH5xQlNTWdbZwPb95f/z8vz//OXm5/72ws3XR15TR3RLV1xNXdbaVltdXl1fzfPK3lZU1URBXV1YdUNRQk3V11BJcXZyf3VSU0RMS19STlvSx83P9vj64e7qlenv7+Li7+7t5//w8cLSxs7HVlfF01DW3tNOf3lnY2NmZ2dgbGJjb25jY2BgenR3SVfHw9FR3NJR38v398bU28ffxsjIyvbk5uXh4+Dh5uTl/f7l5uf6++Xk+/H3ytPUVNnTRFJXUFtJdXJnZ3t+ZWR6eHphYGZmY2NmeWdkfXRJd3F2cHh0VPb98P77/v3k4OLh4unu4uyVle/j7e/g+uTn4eX5/vfa28/JxdLc0Vl1SE5MfXplZGJvbGNgbGxtY2xsbWJvbmxgZmF6c3JwdFpWWdTJ///64+Lk5Obh4uPg4uLh5Ofh+/z+++fl+/r58ffzzt3a3lFFTU11dXRKR0NJT0FRX0tISXZ8fH5jbWZhYWdnZGdkZHJJdk1Q0djT18PLzfT+5ff0/PDw/fz++Pn85Ofk5+Tn5uT4//bB0tVJe3NzfH54emVlZGV0SXNwfH5/fXJxc39zRndyRF9R1dnB9fXay/73zMjOzMHA2sffW13WRFDb09/Z3MTN293Mw9FTXl9TWFhCS3V3cXZ3RdFXVN3Y2MJXRVJYSnVIdkpPdHd2fXNKcXx00N3a9/P65OX55OTl5OT6++X998bBwPXHwfH02dvax9RdRUl0e2RkZGNjYmxib2ltYWFme35zdEpMcXNzdEl8eH9lendxd0RS18j98ufv7O/v6+vu7uzt4OX7+PfK8PHKxNnPz8DZwsTR3lREfWdhYGNiaW9ua25tYWR5enl9dkpfX0NPRFJGcU93fmRmeXxxdETRzsr2+vr55+Lj4O3u6O3j4uDh+P388/76+fj/8Pz99sjL91VGQXd/Z2Fjb2loaGlpbGxsbWNiY2Nua2xjbmJhZXpkf05YQUBZ3Mr0/eHg5+bi4ufk7Ozh4OPj5fjl+PPw8fD1zfTK98La11lHS01DTkJIdnVKTdDb095VWkxGXF9SQ3RyemBvb21tbW1gYGNlfXB0TkNcVM3z+fr55Pr5+uTh4+Hm+Pv6+Obg5vr4+PL18ffM31RdTU13fXB2c3FxSUhMWUt9e35yemRleGRlZ2JjY2Nkc3J2WdHN9//6+v/9+/r2yPbxz8LAwdzc0dnIzNra11tcV9rdXE1GQXd2TFZfXVpDQFfTzf358vD28//y/M1YWldadE1bWlxdTH91Q1zA8/Dx/Pz29Pv/987O9MHZ3NPExNVZTnVOVNdQUkRBR1pT1k53cn9NS391SHd1d05BdEtbTUdPTkdARkd1fHp7dkxGWVbd2sL85OPv7u7t7+/p6O/s7OH48vDy9Mbd3VRXVNVTWkpKcXtkZ39lYGdkYG9uYmBneHRGU9RX09lX19xRXUVX31tGUV9BTltcUN7F8eXl5Obg7eLu6ezt7env4OHg5PPPysjPyPT8/PD09cvM0t1adHF7fH5mZGRjaWlsb2JuY2R7YG5ibWxiemdmZXhxSHF0QlFVwvHx+OXg4+/u6urq6uqV7uLm4eDk5Pr921bGxsfEw8bdV1BQW05NR0hwfXBOUkdHXkZNXlJdUVHdUEx0d3RxeHx5ZGBjZ352dV3exdj38//8++X65uLs7OLh4f398fH3wvXP9/D1yPXM29rJydvBws3M0FNWXllbUERBTkxbQXBwR0t9eXt6eHtzc3x4eX95f09bU9fa9vL99vjk+/rl+v785ebm5+Tl9tZCRF9VXVdfT3V7fHJ1T3R0dXN3SNXBwsfRUlxR28jD8PP75fzy8vD3zd5WXVNe1N/a3N/S2sbMyPf2zv3z9v/3zcdVRU5HU9RXRUxLQ0RcU1tLcXplZGd6ckpxeWdkZHJKRllQSn15dEBaRF/UXlNd1cTLyNnd19ffxMP1/OT48vz55+bi6e7s7eX89f32xt7U3NZNcnplZ2BmY2NuFBQXERcVaWxjeX55eWVwTFpZRdbRVNrZyvzz9s7b29DAzPL49cHewsj08vvn4Ofh4eHo6Ons5/71yfby5uf58Nhcd3dPQ3R5Z2FpFBUVFRcXFRVqaGlibWlrFBcXamlsY2Zydnl+dERZXtr08/z44OPk5OHt7uiXkZaXlZTq7+3v4f79+fP75fz+z1NNQERCREN5ZGNuaWhobGJsamlsYWVnZWdnYGJnZXlLWlZAdnB2SUXF8PPI9//w5efk5uXm5+bl5O3u7eDk5Prx+uf68ff7+vz9/fDKwddYcWV4fXlmZmBgb29gYmxvYmBgYWZ7ZG1nZWdhelzQRU5EUVNR9fHEX1NR3M3y4ePm5+Pi5uXg7e/l9v/yyMjLydRBRVLd1N329NFHQHRnYGR7emNhfHt8fXBxent2XVtNx/bDUVNU2dPJ/fPxzP3l+PL7+vTc0N7M9vDk4eXw9fTSWFzaw1xAUF5LQkRYS0tWUd3ewvzz3VJFdXpjbWNib29jbW9ubG4Va2xhZmdP1tHUxfTz8/vg4+Pg7enp7unp7ef+8PH08fj79NvTXnF6e396ZmV5emVzdHB9cHRITUTe9cRHTHRkYm5ob25uY3Nxdl5QQUHXwfbx8eHp4eTs6e3s6pWV6uuVl5SUl+vh/vXN21VU0dNSQENxeGRnf3xlZ3BZd0tBdH18SVt0en51fWdnZ24XExMQExAWFW5keXdLSEfE8/Tx5uzi4O7u7OnqkJCQkJCSkJCSkevi+vTTSU5aSHl+fntlZnhxcHN8f3l5cEd2f3JO0kJwfXd3d3F+eGFiYm1iYWNhZn1WVlpFUcn9/Ofg4+zq6pXq6JWXkZCTkJGRlpfo5/HC1HZ+eWV6ZmVwcnl/dEFDV8DZX1jF2k16YWZgYm1sb25rb21vaWJgYGF6dnNyTMXKzcXNz8nx5Obt6e/r6uvo6O/s65Tr7eTl4OXO1ERyeXt5e39+eH59ZXtyfnNCUFx1fndPS3J+ZGZ6TllWxd7f2sTYzMXW08zx9M3D8fn4//v98PHk4+3u7u3t5OXm/PT75vn99/Xw8dFEdH56e2Rne3B0cXR+e2VkYXtkZn5mbWNmaRVsYGN+dkBQ2Mzy/v3k5Pj4/PP3wPf75+Hm5+bh4uDu6+3u7+D48crB9MLUXERCRVnUU3RweGJvaG5jZ3tlfHtke3x7e31yfXl8dEFwcFbRWlTc9Pjg7pWV6e/v7ebk/fz75OLp7+Ls7+Pj4eb78fTIxldYXlZYQE11Q0NdUEV0eWVhaRVqaGtuYmNsbm1ob2FgbhUVaGxkcU1R28/2+Obt7+zt7+Pn5+Tk+ufh4OPi7+qV7+iV7efB3t3VVdfYV9/RUFVX11l2e2ZnZm9tYG1tYmZlZmF4f2ZzQVxzYGdmYWFyQdr08frk5eT+//v8/P/l5Ofi4u7p6Ojp6+Lpl5Ti+P7dWnVPWdPb3sHCyMRdREVxZG1ua2luahVqFRRqaxRrYXlgaGhpa2hsYGRlSN3N8//+/fbPysPEy/jn5uHs7+jq6OzqkZbv+PrxxFhNTnVITVzc28VQUNdddn9lZGRjYGV6enF2emZzWdJ/bGdvaRRuZX94dFbA9PT1/vj/8v7//fD55Pnk7ejq6eyXl5Tjx9tacX58cUlxcHdBW1NQWtRUQ3BxSXZ/eWdib2BhZmlpZWZjahYWFhYWaWZme09Uwv/7/vLw8vX0zfb99fH75OHt4u3j7Ons6OfOwVB0eXN2c3dxTVhOQ1nTUnR5eGRgY2BleXh1S3xhZnR0dnlgbmtob2Bkf0leVc/z5+Hj7+7m8/3k5+bg7OLi4u7s7ZXo7uH0yNJYX0JET3JleXdaW0RFSmVgZ2dhY29vb2lvb2NhYGdmbGoUFBQXFWtoa2x6cFzR8f//4ePh5OHj6e/m4+zs7u7r4+3h4Oz/+fz0wFbR1khKSkFRR0tKRUN1c3F7YGBnemVkeHJ2enlzf3hnZWRgbm1kZHp+cXd1WfT95u7oleroleqVl5aXlOvu6e/v7+ni5vr+9tnL98zA1FHTUVZV1VFOfGdmY2BnYGJoFRUVFWlvbmJvYmJtbW1gZmZhZ3N2RdnPzPHm4eDi7O3qlOrr7eHg7+Dh4Pv75ODv7uzj4+H+8fLx9vL2yMnFUl1ZTnZ4ZGdkZ2V+ZGVlfnp7ZGZkeWVgZ2FjZHl9SkzUzvnh6ZTr6evrlZSVlJSX6e/t4eHi7ODk5f7z8/Lk4fj29vT39fb98cJEdXZ7enJ5ZWNtb2liY2V/eWVmYGxvaW9iaxRpY2ZzUtLF9Pzk4ujqlJaU6+jo7OLg4OXx8ufk/vjk5PPIxtzO9vL75fPJ9/TMyt5RR39leWR5dk9PcnpgZX1KQ0xKcnh6ZGNgen9wcFrH9uDplJeV6enqlZWVle7t4fvMyv/x9s3R3cD08vz2zsHWV9ba29nRW0N1fHt/e2diaBQVbmxjbG1ibWJgZH53dnl8cnBKRNXP9fTI8Ofg6JWXl5Xv4+T+8/P0xN7ax8zz+OX//sr3/fP//PP02FtOdU53c317fX14eXt/fmRjamhsYGRlfH5le35/cXdORl/e9Pvh7Ojp7+Lh4+iUlJXq7+Xwx9/C29/a0M/y++Hh4OT0UkpKWdTW019zZ2FiYmNvbm1sbm9mY21vahcQExFpYmZydHthZnxxTEfX9/Ln7eqVlZXi/cDQxPP4+vL0zMXS28vw/OXk5+Pi4OXywVN8YWR9dUtdUUdyZGRnZmBgZmJsZHh5ZGNtaBYRFxVsZXl3dXRN3fzm4Ozv6peQkpCX6+H2UkZU0Mnx8v778v345uT5/fTMzf/+zlJJe2kXF2tvYGd7eWVuaGlrFRcXFRUVb2JsbmoXExIWa2Nlc1/K/Pb74+Pg4ODj5ufh+/HGUHV8cl7b+ObslJeU6O7h+MrcU19BXNxHd316YGlvZHJHTEldQ3dye2RjbW9sbWd3S3hnZm1sbWV01fTx5+/v6eju7Ob78/L75ODh/vHM2tRV2/bn4+Ps7eTk999GeWBuFWpuZmdiY2xvFRRvZnp6cnRyZGdnYmhub25gf0PVW09PdHRzQt3P/frh4+Hn+P3J29jT38T54ODn+P/n5fb+4e3v7ODl9VRFcGdsaGlobmRxfXl7eHB/fkhHdXF1dXRyc3V9ZWR/SFnP5eHg5Pn7//fx5eT+5Ofm4OTk5P745ebn5ezo6ezn5Of8z8Dy9cnP11BbdnpiFRcRFxYUb21gbm9iY2BgZnthZHl4cHN2dXZ2dF/ayeTj7+/j5vj13FBWW0PQwfb+5OHh+ufj7+nplZWV6e3m/cjZVNBU0d/e3dbTUnF4ZWFhYmJneH15ZWFtY2ZkeXZ3Tl3W383A19DD9vng6ZSU6eLg+v/5/fD29/b65OXg7ezi7O/v6enu7+Tw9NBMdnphYmBjYWV7fXZzeWdjbGxtb21iaWxgY2Flf3FMU9/38fz+/v/9/fLx9fH9/PDD8vDJ8/n45+Hm4+Pt7+np7OPj4efk5Pr4zsXb1VpLQU13fnFJRV9OdEp0cnx5cnxzentlZXNxdkJVwfL94eDh4Ofn5Pn+8M/MyPn68/T3/fHz+uDv7+7q6e/u7eLl//bBxN/e3Vp2eHpnYWdmYWZnfndlZ2ZmYWBgY2FnZHxxcHJwQFDTwMD08/f55fP29cHTUNZTXNDK8/3w9v3+5OPt7e/v7+ns4eT89VdHX15BXVDR31NHTnZ2Sn19TltERHVzc3x6e3F2c3RJRNbfwsnOy/Tx98nL8f3+/PP99sva0N/Azcrz9/H+5fj5/Pn9zvT09dvU1l13e2dmY29tZ2dke3lkb2hobGxiYWZnZmV+ZXpmYWdkeUzfx9jB9MVcWEdZ1NfK9srJ9/DIw8XHxMfK5eT6+fv+wFZcV9FRVMXH1FZVUEdxf39lenBCTHB8c31nYGZ4fHl7cntlfXB9ZWVydHRGy/DNycj3ztHezM3MzcjD287I9vb38vz99PL/8PbAx9xQTk9PSUp8cnx/fHx6ent7YWJvbWFtYmBib25sZmNkZXl4Z2dne35ydUh3cXFEU1PQ1lFZR0VX1cD0///w/ufh4eTm+8rG1tLU0dvHx9vY19HK98/XXl3UUn1lcUZOc2R4dExIcHpnZHpmYWR2UER1SdrzztjNz/TwzcPexM3F1kFBVlLZzvng4fr85Of4/vbdw8L3x9zC2dBYQUJ1cEtMQF90f2VkYGJnZ2FnZmRmYWRkZ2VnZGd4RVTXUlpYU1h2dFhcRE5YXFBV1sbG9fH39P/h4uDm5ufn8vD5+vrl5Pv98vL899nf1FhDXdLe3tBcRl5ITUp0Q0l2cEhEW1FHQVRSVcD08/b2w9zDw9BTXdHd0l1RzfXz+/r4+OXk4e3i5uf89vLJzd7SwFRQW0FCdnVJdXV2cUtBWXRJTXBye2V/ZWd5f39/cktLdU9NQk9ZUdPFV9nSWV9TU9ZQXd7YwcbJ8fH75OXm5Ofg4OPt7u3g5uT7+/zw8sve3N3b28DL9cHC9vHLwt9TXk90d0BWWlhcQ0dT0cfM9/TJycPAwdRXUFhEd3FIWsXJ9vzx8/Dz8v398fL38/vx8P7zyNDX3tVdXFxEWFRTXNTTWEhLSnRxdX1/e2ZnYWBgY2Z6eXh+d0pc09LRXFpDcUlNS0tOWl1e0Pfz5eDs7O+VlJeRlpaWl5eUlerv7eD/y95XV9/HzM/P9vf19sre0lNZXkt0c3NxeWZjYmJsY2ZkeXp2dXJzcn97f3N0R9DPyPfx8/z+++bh5/j6+ubg4u/h+vj+8/bz8/z4/fz9ztrRX0ZKfXtmeH9+f3tmY21vaWhtYGVnZX55fXdKc35le3NKcEtPdHVY0dbfy/7m7O7qlZWXkJCRl5eXlJTr6eP5y87b0dTS0drb3Mn1zMHMV1hJS3B4ZWBibxUWFhcWFhVrbG9tZ2FgZGRnZGVxWlfB9vHx9fH5/vL38/Lz//vl+uTm+P/x9vL++OXm5eX78vPJxsZdTHZ5e3plZWZvaxUVFWpobWR7fnx/fXx5c3x5eH9/eXp7fnN8fnNPRl3C++Dm4+/q6+7q6e3i4eT/wMXcWXJxdXx7cEJbQkNeUFxYUllOd3RxeWZgZm4XERYUFxVjenB8fnl5fXdPQV9SVtLHzvf3zN/S2M708fPy/crb39vf2NPX1tj08vb3+f3AXdfa2lFeVdvVXkJzcnNze2BgZ3p7Z3p3dVhdXFbQwcLc1FxbWU93cXN/fHBweH13TkfW9v3x/vr65Pr/w9vXdH9lZGNubGxgZ2R+dnRJVs738P76+fHD1kZzZWFsbmhgZ2JiZn93TkRFX1LI5ePt5uT48fb2yNPR3FRe08/G08DaVd3Yxff//vr8+//8887M2sXaxPX1xMHC1FNeXV1CQUNzeH14cn13WkFeVcD3ztLe31RTWFpDcXR2d2Rne2Z4fUhbR1bC9vbz//PKy8HF31JOTnd8eHx9cXR2cXFD2vf+5uT5+/v//PTeVERHSn96fn9wSEt1dXFOw/Ly/+Xg4uDj4OXz9cvC39ve19zZxNrawc3w/+ft6Orq6+js4eDn/PDxzcXdX1JCSUJBRV5ETkdZWlhGQnVxTU9AWlhYSHR8fXZ9Z2d6eX5/eHlyf3J2dnde1d/x//rm5fnl/crI8vXc1l1JfXx6ZX9xRcTx8OTs7unr6O7g+vz0zdBcSX9le319cXdLRkxW9fDl5uDi7+/j7OLj5vr/9s3CxNfX0tLV2sD1/eTk5ubh4eLs4/rwzdnUXlNCcX5hZnl/eWRkZGFne2ZnZGZhZmV7fnF3dkJKdEJJTU9PUVvW1Fvd3Nnb0FZU2cn85Pr//vH9/PL+8/TC2tdTTXZ5Z2Rke392QkTdwPzn+/vk5eTl5fDTUE12f39zcXZC0trN9PDn4+Pulerv7O3t7OPn8N5UWERIW15FX0JTx8bH9f39+f/999/TUnVwemBva2oUFxcVbm1jZnpnYGZ6dEJBV1xPSFxQW1BQVV1PTl5Q18LY2s/D8fL2+eX7+uXn5+Pm5eT+8vzwzdvQUk93fXpneHpgY2V9StTAzvT/+Pjg4u3v4eT9y9hQT0JLd3Fwdk5FXVTa9Pzn4+7p6Ovp6Ozn/M5SSmVgZ2FgbWxsbW9vZntAV1De3tLSXEVOeGdgbGxvbG9iYGNgYWFneHxxdEdcWNDA3NHRxMjOy8/d11JE1fXx9/TOwdrDwM785P///f/2wcHC9fH3zsLc1FJY1tBZQklJRVxSRltU1sz38fP39vn5/fj32FVUQndZUEhEVVzT2NnY2sXd38H3ysjb0tRPdnxhYmNvaW5uaxUUF2hjYXtH2s/w+fH19MHVUFZfcGFmY2Z6YWdnZmR7TVLAwdn29fL7zPTxwMfZxsZQXU9OSUhCV1DV3cL28/D08PL44Obk4fny8Pb98c/a38HF1lxbdHx7ZXp/e3pzTdz39/D35+D55OD+yt9ESHFlYWNvbmhuY2ZhZGV+RFFPRNDQwMjE1ll1cHB9ZGVkY21ibWZlZXh8clL3/fn7+OXl/vDK31deUllOc3JlYHtxc3dBU1xZ0cLE3sTA9PP2yszH0tzPxd3T0NTG/+Xh5ubh5+Lp6Ojp4+Xl5fHeUUVNSUhYWEfU19Tb31BFT3R2TUdQXU52cU/UQHB6Z2RmZmFjbGgVam1jYmZ8Qdn1/+Xn4eX/4ebw9dxZWnR8eGdkZGZ5TEVW0sf25ebj7+7v4+Lv4/rK0UZwZGFgYWNgZ3BPRFNR2vH75OPv6ezh4+Pm+vb3/fLKw8rG3N/W1snx8PXx+P/85OiWkers7unt+/ddSURJemxqFBVob29oFGpjeXFyc3RNRVZZdXR1TEpxfXh8c31we2V/cUt1Rdb3//rn5Ofg4ODj4fj3wcHXQHR8fHF9cUFTVl/TzvH/8/3l5uDm+v3A29RZWEFYWUlcUlPSzfDz+OTg7uvu6eng5PL1xVVSTXN3TEFGWNLA8f7l4eLi4OLg5uT/98/RW3hmZ2FoFRQWFxcREBdraW1hY35NWlTG9srNwNrcXNVGdU1+Z3t7eH9zTEdb08rx5Obh7O7s4+7s5vry8cLfUXNycXl7ZGd+SEBNVMH//+Xt7O/p6O7t4ODn8vbEUl5DTl5BTEZQXlvQxv3/+uTk+Ofg4OH78sveUVtLcXJ4ZGFmZGRkeX1KQ0Jc0VlOUlRTTnNxent5ZmJsZmdhZXxzcXF1TkFOQ1LVUdP9/cbCzMTTwcNVVVFcQEta0cfF2sjw5Pjn4eTk5eXzycPa2N1VUllZ1ddU3Njby8z35OXl4eHk++Tl+/v58MrD3FFYTHV0Sk9b9PLy8v/98OXg5/79xF9DS3xmbW4VFxcRERVqam5vaGlsZHNMw/b2/Pj4/v/z9cPQRUJ8e2dhYWBheXJxSkxS0Nr29cLJw8bY0sryzsfG0FRHRF90cXJ/dl5NR9zC9Pvh4OiXlOjo6ePm+v/TVF1LSkZfT3Z3THVH097H8fP9+/rn4ePi4+b7yNFWWExweWBtbG1lf358cnt6e35wc39kbG9uaGhvbW9iZGd5d3V2dnZ/eXFPSUBU0N3M8PP1/vvz9sXf0d/RTEp2cnNaV9bZ29/Zxc/ZVF91dkpGXNnAw/Xx8/fy+fn4+/z9//38+Obm5uHh5OTk/vTYQnJ8cXZ3S05NXtHc097LwPXw8/HI3FXQWk91Tkp7Z2Nsb29vaxVoaG5tYGRxUtPDyPX08fn3xdRNcXtnZ2NhYGNne3FEV1dUWVLU3fXw9sj19/f9+Pj6+vTJy8LZXEJIcHlnZ3FQUcD39fzl5uHg7OLn5fr78vj7/ffE1VHVVF5DSXV1U8HG8ufn4ePj4e3t4/r0zVx2eWdnZ2dgYmxsbWd4fHJzZGNmZH94ZX5wd0pVXk9TUFtbVtR1emRzW8bFX0JJU8r+5fXcXVDd1lR1eXNEUlJNf2V1VNZVU1Bc0d7Zx9ZV2sL95+Hs7+zs7eDg5uT49c3L9fL7//fOzdnUV1LW2dLA28LAxMzIzcv0xczw9Pbx9szA9MfA8c3F2tlRRXRlYW1pahUUFhYUFWtpYmdLw8jI9fX09Nr1/N1SXEhbW3V1dVtcQkxdVFPS3sjz8/P39/bNxPb+9vf03NPVQHFydEt+eHJ8ckFR2PT19/z45uDt65Tq6+volJTp5v/1wVfV3lFeVdDZzcnL3sjKyffy5+Ph5Pj299pFWVJCT3ZzcX5lZWFtYmxobGV9cENHcEZTRdLHV09JcXh+eGVnZmRnZUvR11fcxMDbz/TP9vfw+/nK0VdBdnZxSEfR2NfQ0tra3NTFz8zIyvb9+/r4/PfKwcHz+v7/8/Dz8/TIwtZcXNvGwPf9///k5Ofh4fr++//3ysn38M3SUdTURUJbRHR5ZWd7dnxhYm9pbm9tYGZkZHh0Q1Pe29ndVlHb9cjbUV1EX1BJTVtbTHZxcnZMXNdRU1NS0sXY28PHVNTfy/H39sTTXHRISkhOdnRC3M/38fb/+ufg7+ro6e/s4ub8ztNRS3Zzf3J3dktaTUddVd7C8ufh4eHh7O7h5Pr+8fTKxFBKeWFgYG9ubm9sbW1tYmdgYmNkcUtDdnB1c3BKTkp0d0pGR11dTkVRUVbXwdvFwcL3zd5RXEdKQUFJcnNHRVxZSHRxd0xPWd7TUkdUyf3w/P/7+/z/+uHj4eT//PHD3lfV11lbVNnB9/Dx8vX29djAxFRWRURcXEFFQUhPRNDF3d7SUUd0QUpLdHx+emRgYG1hYGFke3Z1R15RVNlXVN9VV1tLd3Z/ZWR6fWRmeHB1X9zS29DUzcLN8PbNxNTfxNhR11l9cnJ3QEx0SHZMWlXQ1t/Y9PHk5uXl5+Dn+uTk+PTHxtZXXtTZ1N3f1tZXUdLW3PTz9fDk4+Pg5uT+ysrM1l1Kc3psaBUUFhYXFBUVbGFnck5DXlPE9PH29/X09t/QV1DVQUt2dU1PTFhfVlbH8fTG09NRR3ZycXF2cXVMQEZBX9PUV1dQ2Mr08/n2y8fTwczbwMj0//r8/Pv65fDz+crNwNnf28HFxt/W1tDFxMP28v/5+v3+5eX48vj88cNVWVhdRlhKcXZ1d3Z+YGZnZmRnYGZmY2NjYGdlZH1xSlbO8vDz8cj38v3y8v328fTN3dLdVkZDUl1Rx8n19vf3yMvA2tbSWn9xcn52c3B2d3VC2/Dz9vH4+uTj7emVlenj5fDw8/XQXFBHRkBIT0ha1tfSzfb95eXl5/rw//n38PbI9/D3x9dSXHV8f3l6YGJtbG1iYGR4fHJIRl7d2MbI9PbH11BUVlFDcHthbWZlfEpLRNTFxcn09v39+ufm4+b49MLfX0ZBS3V0dUtaV9TA9fz98vH19fXK21bUV1Ld3sz3zcbB98r19/L+9cj3/f3wz8PY19v0ycjBVN3d2sTSV1fd0d7S1NFXUVFbcWZiYmJjYGZ7Z2RmenNzT31/Qkxc1tdSXVxf18z32NzQ3cDP9szXwVF1VtBWT3Z2e3t5c3dOTUxd3MTQ0cHPyvDM9fb1wfT8xVRWdUtdxtvSyPH4+uPp7uL4//v898XSTX5hbm1kZ2Z+T9/Py/H//uTg4+/s4ODh+MbXW3VJdHB7YW0VFxRoaW9nZGd4cnR1SXZ5c31PVd3XX1JWVVzZy97WXEFeWlVVXFpKdHBb3NLaxtjB9Mj28sjE10RCT3RxeGFiYWdnfXVHXdPZ08XO8//k4+Pi6eju7OP/wd1RRUhaXkVCXF5Rwfby8srI9M7dU19Zdnh7e3tzQ09OWd3G9PPyycTS3V91dHxkY2Jgb2toa2xpa2JkfEpT3Mr38uTn5Pr9xFRXTHxxT0h0QEZCUlTW0sbJzsHA9cre0EVJXEdDU9JVV8fDwcnJ397M31dZ1tdGRFDZ2MbMyvH+8/b9/f38+fn7+Pz1yPf121fR11Jf0dja9/35/ufg4eDg5PPN315OfWNqFxETEBYUa25hZHJd3sz0/fP19PDzysXF11FXQ0NFTHl6eXJxSFLWzfPy9vTy8cr1wdRdW3VyTEJxcHF1TVPE8/758cXO/ffdUNfR1FXfyvfx/+Th4ODm4efwwNnMx11IcndLcnt+TNVXVNzQ2/Hw+ODv7uDl5Pv4//zwxthfWNVZdUpxfn98cHB4emRhZGdsaxVqa2xmfXVWwfT/++Lv7+/t5uX/9NrTUk91f2ZgYGFkeUtdWV3X2Mf0/v7//fTLw8HRR0lycnx9fnt3cHbT8/rm4uzv7eLt5/v58/TAxFfUxdrb2FRT0NvHy8LExFRU1tvPzdrVUFHRzMjKwMfJyPTO2FBXUEJAQ3RKc3tkeHJyfX13Sk9AW9fezs7L995eT3RwfX96e3l/SV3T09HH9/rh4u3n+/3a1lNLfGdgYGd7f3dJQ3RIV8b09PDz9vLz/vz/8cTF2ddTX13Vxd7e2sj5/f7k+/n/8M7GwNtQQU1KQlhcVFXU38v/+fv68vP0wttaS35mY2JtbGNjbGluY2VycXRWwsHD8/z45OX6/v/z9crCzsXX0V9YXUdZTXBxcH54f2VlZH59dkNBW9TS28r8+ubg5fzJwNpZdHByeGRkeXNxdUVT1cn+4ePi7+zm5uTw9cNXW1x/ZmBjZH59cHFB0c/3/ODg7ePh4fL68cn03NRHdn5KdGVgbGF6e3hkY21tY2FnZGFmenF1fXZKQlb0//P9++Hg5PLE9fL59VhYXd1Xc3BaXXV8cnZJd312dUJDdHRKSHNyTlhZXd3a2NPA8frn5Pjz9c7G9/z0zcfVUV1RWElCQ3VCVNvF3sLM2NnVXlBYTkFZWFtdX1lFXlNe08nOzMDA29NWUUdKdnllZ2FmZ2VlZX55eXZaXdPF2sXcwvD3zsLaVltBdkpIdnxlfEpeVN3e2cnLzfT8/fH99s3298rdV0d2d3RJSHFPS3xwcXZNTE1aUdfH9vvk+ufk+Pn+/cnLyM7L09/YUklwd3Vyc0lPTllY0M32//3y8vX3ysbBw1Z3dXZzeWdmYWBmYWNgeH1wQF/Q3tDR2MfA9vL7+P76/Pf0y8DdRFtGTUFNSUtLTXR/fnJ8eHh3WlTR1NPawvP5+fr65uf75eX8y8zCw8DP29dTWEVaX1hW1NZU08zG0tXR3NzJ9c3AwN/T3VdET0pIQV7V3c70z8fbxtrEyvf2ysrBUVxbX0VOdXNyfn97fn9lZmBgen5yd0DW28DO8v7///z65Obk/ffB31TV19dRR01BRkBNdXdzcnN0TVze3txWRUZbV9fVX1PX19PU197c2cD3//vl5OTk+Pv4+fv6//b1zszZ11BETXRxdHJydXZzc3ZIXtfay8zL9Pb1w9vRUkxPWVJTVFJAd3x9cHFKdXJ8fnxyfXN3Tk1GVMbM9vzy9MDFwc3NzdrY3N/QXldXU0ZOWdfXV9ddRktOUdjD9Pf39PTx9cHQV1p3dEJFRFxdWk5LQEFH1dnbxs/38fDy/f/y8vrm4ebm/s7S1VxaWUVNdHBLWl9RUVJeRFbf093Z0VhPQV9cUFdRUFlHTnF5ZmBibG1hZ2V8SU1G0sv95OPi4Ofk+v/99cbWX0JMW11eXE9+f3NxdnVMTUFFUFTR39/T0trEzczAzcbW197Gx8XHwc/BxsHf2d9WXVlbVt3EzsrZ1dLe2sLJw9lXX0RARUFISUZZ3cjx8/33z/Xw987CzMTR19RRXkVPcnx4enp6eH57YWBmZ3pySVhfXFhX38PJwsfawPT28vn/9MD18fb0zsLRU1hHS3RxeHxwdEZZUNTUVVxX0NfW3vT39fXIx9/fVVFdXFdX3MDCzNLWxMvx/eX6+PP09MzC0Ed0fX98cElARk5ORFzUVlfQ1ldZWEdYXlpW2c3MzvXKw9JRXkBKc397ZWRnen5wTEZZV9HbyPz7+/DMw9jS38HBxN7W1FdRU1pLdnF9fXFKRl9f0s3PwM7CxtnYxt/X0dHVVtPf3dzFxsXb29ve3N/c3tLVVFFfW9TcV9ba2NjEx8XWX1haRlbW0sPHx8/3ycLA111EQEdNWlNZR1hdWFtcX15GQkpxfXt4e3p+fHJ9cU9bXFLf3sXJws7Nxs3Awcz39/fx9vP//v/yydJdWVFdQkNLdXVKRUZGXFtZ1NLawMv1y83JyNBeR0JGQU1DR0ZEREdaWV1QUNDFzvfw8/b0ycHY0NbR19vb0NzX19je3d/Z0d3W19DR3dPS1dbd1VJJcXF8f3hlZ2Zlfn54c0h3SF9U19zDzsv29MrI9PXI9fb8/fzy8fbw99nQVkFBR0xJd0hBTHVMQEZATE1aUtDb28TGw8He3d3Q1dXf3N/e2sHDw8zNwsDe09NUUVtAWkVHREl1RFDW2vfy/P765Pr99sVGcn96ZHt4eX5zSUZf1tfcw8LBzcza1l1JdnNzdnVOQVDU3dje38bOz8nOxMbf1VTVVtXR19PZUV9CS0xNR0FcUlPU3tjXUVFMTEFbX9HByPT09MrC9vb18fz4/fXG2NbT1FteXFtXVt3GwMvw98Ha3FBYTXV2cXRwcndDQVLVUF9FRl9R1tjC9fP09PHJzMzF3dJXWU9IQExKQUJOW1fU09jMy8r399tTQXZ+emVnZ3t8c3RS39jCyMbGys3axdjSVNRXVlJU1tLHz87x//3z8//+/PL3xdZSQE9ARkRbXVBXWV9SWkVeQVhX11RX19VGTV9GQlhT0M3z+vrl5fjz/fbMz8HQU01xf3J3dUxEWVxWVFRWXVbXXFtbQHRyeHple3lydklBX97b19bX1N3Yw8vw/v3x8PDO3dZWRExNQkhKTE9a193aws/IzcDOwMLNxNvb09RUUV5GTEVTXVXY3t3TVEBKdHNwcnRLRdjFxsjIz8LJ9PTz/v75+uXk5OX/98Ha3VdEQnV0dHFPQ0ZHdXdyemRkZGFmZmdlfnN8fnF0Q9T0/uXn5+X5+fPA3VNBQVteXdHdx8z08fb298Pf19zQVNdUVlBSUkdJdXNzcn9zd3R2cXR3dEtIQlnV28fL8vL09PbI2sP38/zl5OXh4+Hm5/vyydvQVlxZREZeWV5RX0N1cHZ1cXRJd0pJSEtPd3Byen5wdVZVVdBRXVBcRVhR0dvGyMnC9Mra39rXVl1BQUBS38X08vz99cPXRHd5Z2BhYWd9cXZ2dUpKQlzTzfL4+Prl//fP2VTX3cfCzPXO9P39/v78y8ffUVJQXEFPUtHdxd9XW0FBTkJT3djAyvD2z9tedH56fXZAWUdQUVJYXlZR19fW0NbeVVhdUlhdXkBPdXd2d0Jf18XOw8TF39DQUFtHTElKTVpcQHZ9Z2RlZX1KW9HHyPLxzcLI9PX19MnJzsDO8fv6+vv/8PX3yvX0y87DxtNETndzfHJ3dnVGX1TS2dJWRkxJQFxX0dnBxdPf0dTf2cPAz8rDzPTy/f7l+fHbX098Z2Nge31zdUJPS0lAQUBEQUJJSkpxfX9nYm9tZnpzdVjZzvfy+uX65OXl+v//9sjx/vrh4uHk88/fVllHRlzQ1dfRUlpNc3N3d3FydkJHQFxVXV9YRVbSxvTx/f31zvX0ysvCwcHfUlLX2cbC8fL2zdNdTXB/fnJ1T0xaWFpdUlJeR0BPSkNER1lBdHFyeWR6e3h+c0hPQFHX3vfz8v////755ebh4eH6//TXRE10dE1Y19Pd2N/fwcPa2d5TQU1PREdMT3VMTE5DW1he3cfYxMj0yMP1wtJVUEVFXdHN9PHy8PPxycDZV9HCxtnZ3dVRW1FUXUB3cn15eX1yfHx/cnFyfH5lZXl5cVhU0NnA9vf0yvT38Pzk4+3g5uX8991eQ3R3dUtDRkFGRURf0drF0FdUXV1cREBAT0hMT01OTkNc1sT08uX6//j78/fa0d1W0dvYxNjR1dVaQVpEX1bW2MbEz8Hd2t5YSXFzfX99dnZxSEpOTEpOREJIRlPU39rDxcXNxtjY3tvO8vn5+Pr4/v3J3tdddHx2SnRJTEFCTFpeRk5ISExZWFtZREVIdEhOTENPW9fEyv3+/Pn88v73ysrJzc3bxMLa2tvQ1F9GQXV1QFlS3tjfwcPG1UBDSndxdHZwdElMTUxBSElaRV/d9PPz8fPxysvfUlfW0tnDycjI9fH1zcHd1lxEXlJXU11BT0dZWEFPdUpNREBPRkNIdE5fXkZPS0tCUtHbwMTExvX1xNzazcXTx8j38cjExd5URE1DTE5Y18XNw83JwNVTVVTUX0dDd3Z9fHJzc3xxdHdNUd/T2vT18f33zMDP9fHw/P3y+fv/8vLxzdnQVNDQ3lZbRUt0fXllZ3p5cHJ9cn1xdnRHUdFUUFDRx8zKz8vNz/TB09bX0Nze397Fw/XDx8Hf1l9HQ09MQF5FWlfQ1EN1Sk9EX0FKQk1LQkVHTHdxd3FLWlfbwsHJ/eX598rw8fD/+/n4//3+/ffLw9jQUdXc2t7VX1PVXE1KdnB9c3Rwf3B9cnB1SUNfXF5d283P9vbK9/XN01JfUV1U1Vlf0NzQ0N7Y1tXUUV1XUF5dWUVW0dJFTkBEQ0FCSk5PdEpLTXd5fnx5fU9aVd3SxPX1y8TB8PLw++fn5+fl+PLwydjf0VJW3txVUlHXVl9cWkdbQU5GXkVFXFBYTUNATEhAXNTZxcbK9c3E39ZXVNfS09XX0sbCx9/e2NBWXFXXU19YW11QXVxDdn14ZWVkZXF0Sk5MQk91dHR1W1fWwMzM9fXIyMDFyMnJyMrx/vz9/fDx9MzD0FXW1lFWU1Dc0tRdRUdAdEtFX9bGxdje1lFaQUVPRlbdxcbDw87DxMTG9crNz8zCxsPYVF9U1lTUUkZDR0FARl5R1tHVU1tCcHt/fXJ0TUhyfXxlZGVnZHxMW9TBz8v1yMnJ8P3y8PHy/fz88crK9vf19cLf09nd0d/HxN1QRktxcn18S13W2tjd1tFRWkBPTUdXxNjax9rH2NrDyvHz8Pb8+f7+88rO9/TA3VRMfXlyfnxzcXF8fX98c3BzcUXR0NZXXE1JdHN9f3h8dUdW09zA2tbbwvfw9c/Pw87Ozcz0y/X0wMDfVNLS1sXK9MnfX0FxcnFLQFPT3NNdUlBfU0F0S1tU38/298zHxdPR2MfBzPX19P388cvK8PL8/fXeVFZfWVHVWU90cX5lf31/c3dEX0ZPdXZyc397ZWZkfn10QFNVU1HX1tv39PD+/Prn5+f6+P73zMbWRFNdQ1tV2NBYX0R2d3V2Q9XS2N3Z2dXRxdZeWkFEVtHYw8L0zdvGxd/F3NPD9PD88vPwzcDPxsbeVlJTXljV0VZOcXF8cnF2TkBQ1NHX0VNAQUxLd3Fze3p5eXJPQ0tPSkNYXtHazfP8+eXk5Pr99PXN2cXX19JQ19NUVkR3Tkxxd1rW2sTEz87CydrS10FJQUZcV9Xc0lTR11TRVF1U2/Xy//r6//32yMrKw8bF3t7b2NZFTnR9f398cnJ3QkxBWEFMTXZzc3FyeHt9dEhZVdDa2Nzb39rAz/H58//7/PL29cvB2dHUUlBSRkFKT0ZJS3ZxcXdGVt3X2sLBz8n0ysDRQ0ZeVd/Ew9zW39zXXVdSU9jL8vzl5fL29fb28chUV1RQXkZMdn18fH94fXZKQkZFXlxWX0JCTU5IcXh+cHVKS1pT1dVV197Ew/Dz8v77+P7w9Pb39c7SUdbY0FlAWF9aXFpPQkh1Q0FTVFfT3tbe9fTEVFlfXdDaVV/VU19TXllZWl3W18r//P3w8PPx8fL22dLf3t5ZW1tPSHZ/fXF/eXJwTUBGXkFMQ093c317eH1wcGVxRUBY1cTBzvf9+Pzl5fv7/fP8+fPNzM/C2tzWR1hWUlRSWkFPdnB3dVtdWF1c083A3dTW1NHR2d9U0dnfxc3Y3cXT19vJ9cjC9PXM9vbJzs3A21VeWXRwd3h5d3N8c3NKSURXUkBeRUlETnZxfXBze3h8fnJIRtXBxcDKy/Py/v7zyvT1yvL2zvb39vXDwN5WV1ReVdNSX15FWV7R01xbU1HWxsnGx8bO0FPTVFxEW1BeUF1eW17R28r28fH2/P/y8vDx9fXF0dJWWkl2d3FzfXNzc3Z2SHF/fHh4enl8fn9ycXl+c3N0T1Pc2Pf29PD55fj6+vzx9/H0ysrOwcHD2NRQVFtMRVxTXVxHTEZHQkFfWFnRxs7x8Pz98fXH3NfUV1TRVNTVU19T2drbwfXPx8jHxszGw9LZ2FREWVx1dHZ2TXVLT0xYQXd3SnN/c3N0SnZCdXR3fnh/cXdEUlTE2c/z/f//8vH1wcHE2MLMzfb09/HC2d7TUVJaXNdTUlBfWUJKSElAUdDZyvf19/XOx1FYX1FRUl1dXVld3cL298rx/fP98fb29/X3/fbI2FdRWktzcnZzfXBKdXF9eXt7ZXp4e395enl3fXl/cndMX93czfT0/+Tn5/v/8PXAycnBycj38PLz9N7TVFpaXEZX1FtYQ3VOSnB0RVPZwMn99/HwzMDaVFfd0dbZV9HQX9HFzPXDxM7Jy8rMzfbI9PDJwN5SXEd1dnR2cXdxdEhOdXJ8cXFwdndwdnRwc318cn55fHFJXlBc3crw/uXl8MjMwMLL8PH9+Pn5//LwwV5EU1tFXF9SRUFaQkh1d0FQ1sHLzvDzz8LB3NPUX1tbUVRHWlfS28H0zcDH9ffI8PDw8v388fP2z9JZRUZfR3dwfXJwcnx7emRlfn55ZX5/enplcHZ8fX12T1dTUsTM/Prk5/j+/fXK8fLy+fLw8vTx9dBbdHZ0d3d3dHd1d0pCS1tV3c/3/fvk+/j99PfM2N1WUVRbW1BT3M3GwcbT3drHwNrawNvS3Nzb31BSXEBeVF9ERkRfVlhaQUlKSk9Ldnd2fnt4enJxfHtlf3Nwdklc18X39vHz9sPP9c/1/fz88/P98PfD11lHTklITkdaR0ZCWl1V3vX39PL++fPw8M3e29BHT0h9cnZ1WNLAz8HLys/18vD39vH88cv0wt3b3VBU1lfWWU1MTUJ3f31yf3Nwf356ZGVmZ3h5fHRzeX1zdEtGVM385fv4+v728Pb38P3//fb3y8HY015NQ0x3cnN3S05Jd3VAWNXGyfDw/Pj9/Pn98MzZ11t0cXNwTEXcy870zsfOy8j1ysHPx93e0tHWWV9UUlbT1FNfRVFUU1ZHT0dMS0pIc394ZHt+cnF4emdgZHl9d1vQz/Tx8vLz8PT09vD9/fH3zM/2xtfc1FfXWEdMTEFLdE1HW9TFzff18/L09MrP9/VWR0xKdH1yd01c1sXA9/X38/b9//3//c7CxdzF3FbV09za3dHUXVpPSU9IdkhIcHN+fH9kZGV4eXx/emRmZGRlcE9c38D19/by/P3/+f34+/n89v30wMLcVFTWXUFJQl5MQltDQ1lT09rMyMj08fb08vbCxV5fUERGQF9W1NfHz833y8jw9/X3wd7RRNXQWF3WXdHYV9NWVNNaW9PUXNVZRV91SnB6f3hkfnpnZWRmZ2Zhenp/Sndc39738fH75Prl+fHy9/X3y8zIwMXD2d/cU9DVX9ne0trc1t7BwMDGwc7FxMTUVEVPREJORFhZUF5T2MP08P/5+vv+8vTOx9vTUlxWUdXV19PW0FdfXFpNTEJKS3FwcH5lenh6e2dmZGd6e2V8c3BxcXdYXdT18/P6+uTl8vPx9fD2zMrLx8bf1dFdV1RHR9HQ1NjSxsrFz8zM98j08fTA2tvY3lBEVlZWWHVaVlHW2sv98svOxNzURVPXVkZd297SV9DY2MPf3MjG01TX3NZdQUlweXhkZ2ZhY2xhZGZnZGV5e2V6cEhHVMj85eTl+f789PX39/Lx9fPyys/b3MbF0lTYxtLTwvb1ysrazsLW1VXWV0db1NdeRVpAQk1PS1vY3s355OX4//b3yN7axsDY0d/Hx9BRUVZXVdDUV1FGQVxZWURKf3h5Z2dnYWNtYWdkfnl8fnxwdE5Z3NjM8P3+/v/wys/OzMPOy9raxdnHUVfQ1dNQ0t/awszx/fn+8PzL3sLH3tre08TN0NpVSERASndAUdPHxvTK9fTY0lJZ0djax87C9sBS31ZR1dVXxc7dxcZVxcbQUk99ZHh6YWFgY2NhY2NmZmRhYXp2TUXU38/9/P/+/szP9/X3zvb08/ffw8XeydNX3czFxPfazPv/8fH10tVRXkNKWkBcV1DD1VDWdUpJ3FvX997w+/P+zsLbVlbWz9DH8c7H0dZaQ1hKR1TQVtfVUN7QV1d0T3JyZ2dkb2FmYmZgZmRlZGZ0cU/VVNn0/vPw/MnL9vfDwsPDyMXS1EXRXkDU08/AzMLYyvD4+fr+9/z3zN5QXV/TXFfF38JVT15TXlvR0tn29fPxz8nA0VJX2Nrby/TF3ttXXEVbQ17F0VFSz8BSxt9XUFpweXNmbWJiYGNtbWxibGxiZnl8dF318fXz9fH0w83//s73+//x9PXdX9DRXcbzy8T19sjK+/3K+vzOzv5UStZKfVJfRtLcSlfUf1LBR9r9y/37yvDw0Mj0Vsfx3sbOy81cXNFKddJNTdrUQVrE3l9e21120EhneXhuaH5maWdkbWZmbX5Ke1nIX8v73czz1tr2zPL+2Pf5xs3E1tZBX9hXxuXA3fHJzfbn+8/w4fHY5cN0V9NydsZTd1pFfnFfW8bJXcn608j7UtbzU1bw2/H7183yWVPeXF9DVfLfV/5fTPDaRFjB2nV3TWRiZG1pYmFibmBnFW15ZnJEXdbF8MBUwsNFwffM8Pjn8/HlxlX8UXHCzcfL8/3c1vvLWuXk1PHjw1vNzHZ23Ed02sB9c9REftb91lHn+Fvz5FxF+c91zubBz+XGTcPecUrfTkPM3V7T2lNb11d3UM1DdllybGV/aWlweRVndWloTnVsQfZYW+XMcd/5SXTn/l/77s/O4MdMyPVz1eXD3+T/2/rmxfTj8Mnn58308EdDxtd9VPRwflF1ZVbSdlXk3V7/wHVZyklZ/snW5ODFzf3WTMfWd9jwXUT22k/b9U5AzUF2wsVmd1NjbnR+a2R2FRR8bRR9XGBy/NNN8vZzUuRTTePmVefo1lHhw3nJ/3XW7/Vf4+DU5+7Szu7w1efkQd74Q3P02Hve/ntk8l1nzeVIV+70fPn8Zk3lRH3g+Ujl4HRW4FFk8MF6wv5+d/5MYfzfbFH2YXHzemDNfxRKSBdkXRQWWmIRQVFrSeZ9c+DcZvDletHuxVnp+Xvw43lL4UJ64Ptz+etWypTzUuvjW+DoRM/uQHHkUGbz9G1K8GV85Vh65OV2zuZ9dvxNZ/TzdsrjV1vg9En+9nvR5kxx59dk8PdgRPN6fvJCYfXFYn1dbm1HZhdlZhBgd2pv3kxhw8pl0OVPdefxRuDjQvPiXkbm1mTw83HM5lPN6f5X4eZT++zUze71ROT0e8v8f0jxcWfK2mdX+U1G595+9MNlWfZMUuD+WfLm1d7h20z//U/B5E1G/l94UFJndsNKf8vQeV9fYmRfYmhzZBVhc2hpdn5mUNN/WPRYW/bKX/rkU8Xk00zxwH3F/3RG58ZI5+JRyu3A0eP60+XswMLhxEvz8HBE9XR+xlB70fR1X/5XfMHaf1nzQlvg8Vj551za5NRd5fJMzuRPS/JdZ01YYXbBd33N0X9a0mR6U2ZrfH4VYHAVa316Y0HeenXyXHT++Vrw4VfX/8V03t54RP5cd/75SPHgU9vt/1Dn7MH17v5c+OVE0udSfcPLfEnGSnPKxXnf+3Jz/lR6zPp10ebEQuXlct/nVNbi9nX85Hdb8HZn3FZnRvBxcP5RYF/GZGZYZBRkSGsUeGMXe1hsZchfZc3/Qc/uwkbk+HzS/n168sNx9OVE0Oz/SvPt2s3u+F/h71XG7MdA5fp/W/x0fvfWYF/7fXD8VHP1939b/1RM/vpBweNUd/PNcfLi393h/0zF+3N48lFiW/Fne/NYbUXLZWLRcxZ4URQXTWMQZERuYPZQZ8Lkd0Du8HT64FpZ+lNj2/l/SuHGeOTjTcfp9lvt7Fv2lfRD4uFA9ejWfvjxZVj6d2PM92B15NR/8f96T+DRe/7hdkDj2GTO+n/W7MdJ4+1JUeJZes/FY3P/cWHKy2d1/HRsRkoVbUZvEGR/EWtGemlcyGR1+tp2++FGxe/FcvPKYXb+XH3550XA6fXX7OxXyu/23+Pm3cjt89Tn/ktW83V+2EdmWM9xQuX1dcj/fXX51XLz+1rY59hyx8N2WP/EXuXlUsL41XPTQmB303J5wV9kVcx8f9NlaXx8FBVkahF6dmJwwUt/zsh02ObBTP3nR9b/SWHX3GdG+VVI5ObQ++j23+7hxOOV8Mnj8sbs7dTA59dz2lBicld9cfLxQPX9dnTz0H3N/EtT5vZC9vV9Rf/UQeTlVvbm1lP/3GdAynNz9VF7W9l5W85zY3R/FBVhFBZhYGlzUWR9xkN/2vdfxefQQvj/fU70cXrJxn3Q4NvS4+Hb+u739OnmxOTg19Dj/VX+9nBEzH1sd3BiSfdBReb/dNv+XkHy2nfH/VnR5NZ3yfR01vjdUeX9Q8f7VU33V2XUwXt53UpmWdFlfVd6a2RmEBV/b2hKSGZG9kN1/PdL2f5GWPrefN3JfUr1VHPE9Vn14sLe7eTM7ZX75JX+Ufjnx8nhxkH+wXpH1mdiUFd7WfZfUv3Md/TkQ3fPUXz09Xla+F5l9vJ0w+bBV+XxdfX6Skz8wHLXxWZ+ynZtXERvZ0toFmdsEWFwFGLQfGf1znTe5dV1881LwcJ9R/vfcMH8Qdbj8Vbg4Nf46vnxlezM5+BA3+3HcvzzTNH3d37RSmVVwnZF5PRe+uDXxeDVffj9d9PnVXXn8n/a4UBY7cx48fZ8X/NHcvfUZFxSYXvNeG9eQml5SmsVdWQRYEZvYtlQcPP7WcfnVnXz1n9Q0Hp08U1nxsBP3OdVReXxX+Hp/fqW41bj4lza5t9P+v9YyflLdPVNZFDSZVH71FTn+U7Y8nRM8tBx9vZO3eTWdvPxRcH9WETzx3Pf801QyEF330NkREVjZkJ4aH5+FGJzahd9f2lyzUJ188xO9+VY0uffccjLdd3NSl7lwlv7+k7c58NW4+PZ5+nH3eL/d9fyT1n82Un0wn1dzEZ+0tRN/fLc8+ZTRPvHW/nlX9viy0L+/Hdd/tR9xNJ7TlZyft1SZEXSenDddWRddGFKRGFiTHhvfXtoZEVmZ/fcf9LzdEf7zE728HNCyEplX0R/VMpE1fDbQPf80PPj9vDp4fTv7NzK4M1Q+/9e2ufUQvnafFPNdEL21Enf2HZR+cdG5eHVy+HAUuf1SvT6Rk73X3pW3WR2xHtnzFN7R9l2cdV8Z3ZxbmB3Y2h+emtnR2Vmx0JiUfB0WuH3WObtR9DhQnr0zHPG5EZW/NlH/fNAzeXexOLn2v/k3s3hzUvx80rV+thT89172vp1Tv/QfMXJTfTn2sDv4cDk5FRU+811yvF/csV/YkV0bHtGZmXfQ2be93hD8EBlU0lid0RhYUZlb09QZ3/Ycmfd2HPE4cTR5vlYx8R6SvV1fPH0e1H7WUHkwHn04tzD6eX17ObD5uPV0+b1RfP7R1zxSXL1UGFe3Gd8x01z8+VZ9pXz1OD6S/Xi0VH7131U2GRz1mZtREljTdhlRPZJd/dRYEtZYWZGYRVwcRRkRGNnUHph9dR7wuPIwOjn1vrwcdblTU751n/M8XZR+1t99cl3zeDZw+7zy+zlTvfmQ9bhwXH29XnZ+3Vz8tFlxPB01uDDxertyOXjU93gyUvzzXp1xGdj1HsUfnZqZ9RlZM/dc8L/ck7wSmXaWG9yUm9mV3pnVkNgQMNyRvNfUeL5Q//lekX8fXr31GJT/Hxb+1B8ycxx9OLd8ZTm/JXoyuTtwvbtyV/7yGRc/Xx89HNt295mTfhBReDwxOzkWv3mQc7tV0Lm1mfOw2Jy1m5s33xu3dZmV/F7cPFyY9pPaU9ZFWJGaGtdeGpS32Nc+HVN4vxf7+9c8+xOcfrQfsjBelHOfEj1cWXGUX/O/1v36c7B7PtU5/7T4OZX+/p20uZMd+fQevLwZdnkRd7v987o/13793DM/UnQ83N71nFvdXJqZXZrecx6evxRe/DFf8rwel/yZHrbZm1VcWld02xeyWNN+3da78pS4tp//VZs08RgXP9kQuR3cvxafeX0SOLgU+Ho2vroV8bp10fsyHT4xWf39mbb8WFE/GVx4EFw7P1c7uJB/uF51uJG0u9affl3b9l2FV1Ya17IY0T+ZHL+fmb3SmnUWxRz1BRj3mxty39t+1Jt5fdk5pVa5JdPVu19eeRafvtcYfnfbfTAb9T/Z8TpSNCVxlLr83Dt/GDk4HD87HNX6lxP6vR85Np75OV55OtO/5VfzehyceBBcOJfYfFbFFtAFndOEX7abnrleWTkcG3lRmj03mtb9Wp282Jy8mR6/3xj/E1g+vV44eJ98eRhTvBhc+R6YPpIYeDeZvv4e/bvQ/mV0P2W8cfry3DjwHjj/2T8+GT352XH4GR153pk4lB76fxx7eBy9uBlwO9wUe1Lefl0bctIa9lBakHYY0rGe3HRYmFRZ2ZffmxeSW9K2np0znB38Vhx8M5a5Ofe4eR09PxlUPFzQvRwdPZ0d/d0fcvFdsr8XvXm2tn631L311n3y9Dxyt35+c79/NvJ9MfDzsTY+PLK+PzbzdF1W8V3W8V1RMNAf0dzZnV2eHZyfE5TdHXWSXRBcnZNdHdAdXxYQEHTXELQ0Exe3U5QxdXb/PHRydF9W0NzRF91QN7RV91c3PbMxPTxw8r99/fwwM/xys3Jw8/M3dHSxcPE2cDC2s/P197F2cL09czw/sTQx8XfzcVT2sZW1tdMSkdYQEF0fXNzZWFnZ3t+e3x2cnNye399f3NFWEJd2s3Z2fXM9/L29PP+yN/b0UVFV0NMUVNbUF9OQltd193X0tjY1VZWWlLZzvTy/Pz99sr98/vw9c7J8M/y/PDz/fn///DCzsRZXVdaX0VDSlpQTXdPcHJPTUZNdHZxeWV6Z3x3dEtHVdVFT0hJSXVZ0FNeV97V3NRS3szH08fP1l5CdEhGSU9HR0VcUdTT1dvB9/TxzM/2xVHQ1F3WzvT2+eXy8vXe0tvbxcXSV9nZUM7b2/X9/fD/wcvGV9vY9PTWw1HX30PZV0zUV1ZSX0N4fmZsa2ljYXp4eF5Jc0x9eX9zQl7ZXdLCzfHY8f/35M319NPCRFpWWl1WV19MWFpdRUdf3MZUV9tETVl3fXBKW9/L9/7++uH18/7y5/H59vT5xvT+y/fy+P/xy93b0U1BX8ZS19N4XNFKckdfTlLXSVpEcXhmZ2FiZXh8TElZQ0p0R3d1VNfX3/TLUsHD1NPKxN3AzUZBQ3J2ckNHSVtBQFtd017QxP30wczB31FZVk5GUV5UyPD09vj0zfXw8PP88fT39djH09rBzdj0/cfYx1Rc2vXFyPDaXdrDUlbFxt3H3FxMdX1mbW9vbGlgYWRle3thZH54f1jf0M758M/9//H9+P7++PLO21VEQ0REQl5HRUFHRnVYXl3B00TXW3d2QHF+d0Z12cvB9P/8+Obk4enh4+3h5Of78ffByfH1wMfbV1JDWlFYVNBQRVpZc3ZbQUnX2tRY10J5d3NmZWVleXJxSHNnf3JleXRC1cL19/Dz/PPBzfTOw8VUUVNbTnZzcnVAfENGWVnR2dHO+/HSw9Zf0V1FSXZUyNRRxsPNwcbVzP79+fj75vz/8/TZVsPd3cbT1N3F0VbO8cfeztrK0UDQUdXK3dHO31lIdHhgYGxuYm1nZmBiYmBobWBsfV/c8/vk5O3i5eXm+Pry2cbLwdlYcEp0dnN0cGVwSUpfUNPG0VZLRkJNSGdlQkxeUdPN9/bI/uXk5+Lh7ejh4+36zfPw0NpWWF9f1FlGX9ZUR1rcR3ZFcXBYUlTbzMTb1l9ZWmVhfGRkdnJgenxiY2dlen5NU9ry5uT/+OTw9Pj2R1bdXk1ARn5/eXtxc0LRQk7Uycb3+/bb9cjRXEt3dHBaQkLewdvfxvf25eTh4efg5OTn+/D2zsNHQFdaXdNY18DE1N3E1NdURVxfT9LCwcj/wtbNdGBhZ2JpZGRjeGNiYGhgaWJyfVfS+OHn7uzv4OT/y8j13t/dU9RMT0l4fXZ6cUpISlfP2/Tw3sLQcXd9fHhKc3HZXtn09fD14OX5lOTqlP6W5OaVRZRnx8Fi92P1Zl9L0UfYQ19GeMBhxmXzW8D43uTRzUV8SmRle2R9ZH19fWV6ZmB+ZHJNV8XI5fzz4sz99nT+d9DNZfhuwXZ612PGZ9t0x1H9zOHy/uHY+n33YElxZEFkREtG2FnYzvfl8uHk5ufs4eDi+OXKxV5AVHRK13PP0lrncvZRQ/pv5nLY9FTmW+TX93xYY3RofHptZWrTFnNtaWVocGB833Py/PPj4e3m4f/89cjB21VFW0BPeHN6Tnh2WXHeXs78XM3lZcnSaf9sYPUW8GZ/6Wru1cyRQ53w6e7kkPzo4ezl+tT9SFB3fUhh2Xz1Sl9LWltMWEzYR8nY29/x8NbWRk5DYHVAF1B/afYXf1sX+hdwyRfrY//mZ5N069XF4HrwccV2UtzEZMZk1096/2TmQeDN5fPB50f7eVJFYMdqfX1syGVM2Hf+w9ns3ebv1pb2+ZTI7Ode49l+72/2y2ORYMr4bJVjXeQVl3jY42qVYvTCauwXRnIR8R9xfBDwH81tZ8wU/GHOxFPn2OP/4vjk4dPnWvXBTs7S0l1zSE9nUnB3xHH013T1WEjzbMBdFeEWXkQR4GhV+G+RQOWXcp7f7JFxnk7ql2WeYOHKF5QQ/Eht6RHhenz2av5m0tFf80vx3/hc8tTWyWbNb0h/bsEUS35o9BfRdWrgFPlfZpdmlNvZ63zhcM5UTfZF/Ub0dMJzcdll83D09HHnfeXPe+NsyHFq4RPWfhXmEOd1Q+Jw6tHk5fvjwu346PDu/vbkdORzxt5C4nv4xHjgaPJYbO5q411hlWvpdEjha/pjSntrchR/aGZhf2F7TXtZZfZJVv1U6sHg41HtWNHmZ/v0futny/du9mBzV2ZLyHZ283/c0nnOTmTMeXn1b8ZWbex/xeJ9lPDEkUGU7k6e0u+VQZZG1PlGU8tNRPp60sVu139v9GJ/5m/992aXf9KUaOPDYJQW0M8d4hN+xx7gEXTAE+xpWf1vl3zm4X6XaeDHbZYV7Mdnlm34xWH6ZHH/evTLZu5k3Ppq729b8xbpaUzDF+IV39ptlGji/HicYpTtUJ5MlOtWlcXP7E/m5niUe8H4F+hqePcQ62lO4BfoaVfmFpdq8/4XlhL1ZBbyG8hqZ8EW5m7JxniUZer/35JmkVnC7m6RZuX2eO4V/ndw9hf6Y3XzaOxqwtRr4RXncXTkZeJlwNZ39Gb+RP30TOtK4uFUktHo61qWVPnkRObVzlPPXnfTFdpnb8IRwH5i7WL0+mbsXlnvUs7iU9DybVNFE9VvFdgWclER3EJ74XHH7XX35GTnyHvrd1/sY/jbYOd6deB60PB55vRh7UN/4m1S52L7+G7idGroFHjmE+TKaJZgXJNs6O93n/TDnFn+lnPq7GCW12WVFFzkH+F6F+sWxfgQlHRilmvz5xeTdH6XEPhDHeEdfEcT+WpaXWbhZOPKyZR2ltxGlm3uyWSQbdvnF+9gbO8Ry1hplGv09mnvacfUb+di+V917mzlcXLjFOBBWulv7PBJ6F3l7tXv59LjzfT43/HTwEta0m5eYmdCEcdgcMlp7Fl16kjk503qy9XgQtdRen1kZWlyZxRQa0pMaOZkzfx9l33X42T60HHmWUX/1EP3QnTNc1n3UFX9/kP+9HH8Q2TwWGL2WGD1dGTKembLf3ryS0LnQPbi3+Hs++Tt5Pnt5Pfu/XXqxWX6e2FRaGzDb2H5ZnPtePbuYOz9bepTZ+NvfOURd0QW2Wtu8xVHyG3iVF2QXviWcuTlZelSfe9xUflt0s0W0Ehr/GN07Grx4G7tTX7iat7+aPlGcuNj9PRm5mRS+2HnU9jgdOn88+xUldzI7kns01ztetnIbcNibVYRQHJj8GHw9NHi1O7+0+lO5t9942ZNVGtVbGpFEH5/avRj1P1k49fO4Hfn08H4cOZUz8p24HZG/GXY13Pl1ErhwFr71F30fUfaZXPUfUFQZFdLZF18QHFz+V9Y4ff04vHk6t/lldTh6V7t53XyyX1DVmZnQmJkVGJ5+15x4v915/Fy/95k/9BgwlpucHMUfH8URVFjwOZP/O5U8+JTVOxPQ+JNduZOdvhzefB0Y8pDZ/Rbe/nbcvvHesTKYVj8Z9/9ec/4ZkT5ZGXnfnfrfdaUQMyWRdOWc8qXZvjtafzKbv92bvZhaPBtZ/1rwvxn6vLDl1jg7Xvg3UvnZNzXbFhsY2YVS25502PwTkrvf/L9e+5eT+J22flwzuVM0uFIV+Jx3+Z92/tPXOBQZeVxY8pne894W9t+1HJiwWBj+Htc5Eb4993j2uXmXejl25X1/uFV/93VyXT0c3vwYkRCbPVmX+V45sFy4nF0+nxW+UpDyGFn3BVjUWl223BF/8lC5/18+vhMyfFc193NWln1dFzxd11H0ERg8U9h4N585dJl3NFkQv9PS+3FdubJYM/Jb9ngZdjucUaVVnyV0mWX3WXq2GTuyGHn2GHnVGbxWmDQWGDT23D4zlbkwcLDR/zXR+Fcc8J6ZH5iZ2N9dmFaVGfW9nxE/1BE5cBw+Mp+5eR7/eh02+pZU+tAeu1WZuzPaeTaF/RWF83DbvL6bMP1bVlRYVDOcdz2Tv3OTOZf2+1N+uZS7fHR7sNe49tA5UNx+XJ4xmV6w3Rz9ERzyFFzydF289XV/X7bXWzbZGfZZkHGZFT5fVH4f8XlfMf+ed74SMf6QMTnV9r6XtL/cFzVcv1wcPNhXdFj0kdnzclI5/525Ml69tB+8MR5xsB2yc1wwc918vBB+d/R5nX85Urkw0TzVkT2W3/AdXb2d9XzftjwcFP0WV343V7+1X/XX2Ny3WZkyXNh3EdlXN1KQM/RS8PLV8nJ8vXX5fdc+fvZzeVWUPZId9d0Y0pGb3FQYUHwRFL+0k/V20txy9Z93specd70fV/+V1P++Nz57PXC5/5M9+FlReF0ffTQZV/TZknYZnnDf2bNWXv18kzZ+NJfx1xITVpEdlvPWnj02G7P/2BE/0Bz5PJ08v1L9OVzWOdBcfjHdcDFfXVYcHlzdnl5d9VFV+PQR5Xxf//4c0n6SHvl3mbKxG1d+WFR7XPU68jW7c92+vZj9+Zg0O1lTuJ5ceFkeOZ+Z+ZwY+VGc+ZEQuFRcfDXZMfdZ8VWbfTUatHQa1HMY8H7f/zoddaVSHHuX3ji/X3g52X94G1N5GZh9X9o1U5s9Mpj++dn/OVi1OdmWudnUuFmTuRmffZ9WuPc9ZH6wZTKQu1MZPhKeuZSZ/jeb9rCblrJaHX0bnLjcmXty2Xj53j7ymT4zmb982HN/2Nd8WlO/G5HlXFT6VxY/nFJ9Hp55E9+41R749Zt5cRv99hpV8dh3PVx++R35u5mxu9mQO5lduF3ZP1BblFRakTke83rQvfqcFbse2XjRGXs0GXjQ2bn0WLlzGL73GH63Gbn8Gf45mHT5WZA/3tM9mFy+Xth/3hoyHBm5spx6ed+7f5k+chm+vl84eRm9uRh3/9mUfVuR/Zpc/F5cPZYdv1Hev5ZZeX2ZfTnedz6YVj1bEX4cN7p9cTq/1rg32b22GP2/2NF9GBO92Jb8G5G+GN95n9/4ltO60F06UJn7PBk5PNn+ftjyPpqdeRpe+NwfO3QfuPUYvtUas/8YFTlYVrjZXXucGTu0GLlwm39+Wf44GTx7GdE6HJ/7XZl4kth4HUU9NEVUPJgVuJzxOtKQu5NZ+DKZvr8bMr+b8PgYdbvSHfi2Hrlz2bn8GD75G9X4GR95nlk5Utn5F9u8cUU0eVsXOx83+lyXO5AeOP8Z+XnY/DnYNjhYk/iemfhdm//UW38yWz15W9W7WFJ7n9y7ltI711m+8Rpzedg0Ox01+lQX+xdeuHPbff6aXf5bGX/YGThcGDiwWDn+mT+5n797WTb7GF37HZz4NRy49tn5cBoy/EVReVsSedkcOd+ZONWbefzbvfkbNnjYlPsYU3oeWHtXWHtyGbv9Gzm+xX04G5W72Zc6GVx6WNi7WVq5kVp5s1u5f9u+O1i9upkRO9keO1lZOhBYe7KY+PkYOfvY/zub8DuaXftY2fgeWbiTWDi32jl8BXG+2rf5mlR4mlOlX1zltlylc1h7/Ru4Pxq/eVp3+VuSuBgcOxlZuxxaOReb+DDYuP/YeHmY8ThZ0/hZHLsc3rvdG3i0WPh/Wfl+2zN/BRN+mtk43p+7nx7lVxwl/R77fph8vhtyuZj2O1lXpVOSu9HeOdNbfdKatpTF1LAaF3lYt3rf0TodnzvVnHt1nvgwWPy8GH343zW43R1+H9n+E1j5fVh/eRkxuVjReRtevhmeeF3YOdZYufNZ+Dne+bxY+TTaeBPbO12d+560+ph4e5j6/Jt7mFn6RXa5hHsWmKRYFCUFOP3FZZteesTwsAR62RklGvn7G6X0GGUYHXrbcHtbNX0bt75Yc/6ZlX+Z3D1f3L8WXHk90jz+nBT5lx+9d1nWfN3c/FUZ0bJfnH78nNd5EVg3/1mYv7JbEXv1WHhlEB3lO5nde5QatDrRm397H1j5e19eODnYWL6/mFi9sFqbfbAaGbn5GVz7+J/fuHhcHzg73Rgx+dAZc7t02ZY5VJtcPzAYX74+nR+9uVEZdznUGB59NlmePb+fWfS/lp6w+L0cEf/9Hx73/BFfVPwxHZR5eTRWvzk0n9ezlFydc7JTnfS9VRAxfvw1VfO99VPUMRFf3BZX3F3xPfdXtv3wENN09nRXdXHUHdK09xZSVLEWHNJ08ReRs392tDP8cnR183IVkRFVlF1d1pVWHd3Rll0WtfRVEVfUFh0dVhdUEBR2dHewvP+8fb98Mfe2tLS1tXc0NzVVd/ax8TBx8VXWNbVXnV1QnRzfUpbRFhQ39PWxsHZ39vIyMDe29NeXdBUX1PXUFhcV1XVVVRfR9fcVlHT2t5RVFFQXl5aQENMQV5BWV5X0tveVVTUUkdPQkFTUFxR1NbSw8zOzcHNx9jbxNzV0tZSVd3UU1Tfw87K9PfPyMjM2FRRQnR0dUlNWFhTUlTQ1FRUU1hTVFHUXllTW1hcVNPXUlLUVdTb29LT3cbH2sHAxt7FxNZSV9NTQF9cREtKQkJ2Tl9GdElHQ3V1dUZBQVhZXFfR38HL8v/+/PD3zsPDzt1c3MXdVd3YxszMy8zCx8TZ0dVfTHZxdnx0TVhGSVlVUVNQ3t/fwM/G3d7TVlFd1dPW393TV9bZ3VNZXVhEUFJU19fQ1FNS3dFWX19dWFtQU1NeU1BcREdHSU1ZSUpFUlhGRFDR1dDH9cvL9PDJ39ncUkVf1dDQ29rdxcrwy8z28/PK9vHM1l1cQnR0RERKS0FEW1NQWlxSVF9dUV5DQEJaXVfe29vd3d7axFbX3dfQ39vYw8PE2dDcUFfVV1JeXlHVWk5aREBwcnF8eH1wdnBOW0dNR19AWN3fw/H65fj4/PP0ztxTX1bHwsfD9fb39M/Kysbaxd/S3NVaSXdzcElMdHV0T1xdRNTNw9jFxMDT1VVTXFfd29vb2dDV39RaWFJTXllc19VR1NVcU1NTXF9UV1FU11RdVVfQXUJJd3FxcHZIQkxbWkJGWkRYU8T0zPT89MfYx9JeR1TS3c309vP/+fny8/nw9/bx9cTZ3F93cUp3c31zd3Z2QE1GUdXV0FdRX0ZGW1lV0NvG2dDbxtRSVN3Z383Kwd/Dwt3X0NRYTFhaQkNeUEdPR1ZFSER1fHh7f395c0NDQlpRUFte3dja9uXl/v3y8Mzc2NDX2szIzcry/vTK8vTFxczCV1tV10x1Qk9KdE50cEtBdUtY09nByff03tTW0ddU08bA1VfT111aWFtFVNLXVNTXUF5dVFRFXNVZT0FU1FJW1t/R0t7WXlpEc3t9d3F2RkdLdVtTR0VR19LH9fXNwdrX1FXdzvHw9v38+OTk+vD28/3KzcDa1VtbXVhFX0Nwc3dMdnZ2dXVIUdFU1dVGRVxV297T3NDW38PGWlZXXd3PzfXF0dpQWFZS3dVaQHVPTkBHSEZfV11aUkZ1cXx9c0p1QkJBQE9Q0NHT1MT29fTx/vHRUtjA2cv/z87x+fD08f/2xs7wwdFXX0R2cE5SX01AW1l0SVtfQUVX1Nffyd5X08jF383P2lbQxF5PXlZAdEfX0VdQ3VZDQkJXV1fc3FdU2E9F01XEWF3Nx1RQ1lp3fXVBdHJ3WUR6dlxBREpdxd3KzMxadtZX3v7k9vP+5f/w++D88OXk/vfz215USF9YcU9DcXN9dHFzc19DcntMVUBKUld3UvTOUNP0/s5YVVdTUsHL1vHKwOV4Sv3DcEv2zMLGcHleRnVwT0fTWXXSX3JyWUdLelvbX1txdlFX39VHXdvC2d70ytXR2/D808L+9cnk5fv88fDB2/f0XUrXVNd1Sd1fT15Q0U1PWFxbQ13RVl1eVVZC1NpWXsXJUddT1dR0RtFRQ8JRQFtS21Z3XMVUX9j13VpcVFVIR1tWUdRWUFFEXNxLcddYRk1xTEN2cl9ZddrF1VNV19ZRwtvK/vjk5Prh7eDm5ub98PPzzdPGz9BFV9NIcE5Cd3FNWU91Qk5TQHV1cnV2c0tM1dLS09vf3ddf3dbW2czx2MTG3cVWUUVAWFjUXFtZUURFTEpJcnN1fXNPQ0t0d3VGRkxFdUBGWFRTU1hT0l1SV9/UU9rJ9P/+//n75+Ph5OX4+fX0yN/f11bRX1TdU11OWNLawFZcXtPbXFpAXUdlck9NSk1RXHZ1XFBJQF3dxcL1ytbU08TQWF5U0FpeV8DQxcDJw1hVRE9JQF9AR0JaSXZKdH19c0pOcXZMSFpYSXV1Rk5yQdbd1ffm5/vn7Obm4ePj4//49/TQ1fbR1NLR2kl7WdFeU9zQWkbXXUxMd0N8Z2Rxc3NJWUJH9MZZXcra9fjj5P72wPTM29DH3k9If3JBzlVR1tDD2H53UXVzdFZOcnd7c3BG1UxXRHdXXEdQQdR0UFl8d3R10fv7+eHj5fnG+ub/8dv0yddTX1FWRkzM0EJHdsJRRcXN0sbZ2kR3X0RNR11AQnZyQE18dHdefXBZX/f5wv7SzfTcVnPSdXbx0PvY+cVK8Mv9z/TLwFr02l1YTNdPdXZleENmSkZ2XXZST31YcUp4ZHJ0V8PL8ubn+Ofm/f775f3z9/j9/VxNUFvZTHd5f0Z2UltEVkXVQUFYcHpCQ3NVd0VYQExNVlZbWVJYwf7n5Pzg+PTw3dP10tjJxc/C31HWVFPfWdNRQkZzR0JxSHRMdXdOdHVLRVJbQtZDTVdfX15MSE5CXcD29v785+f5/uX65P/89vrnx9NfVt/H0t9fUtVf09DZ0NvSVFhFWHB+fn55fElwc0xKRkhIS3ZwRNjHyPTx8cfE9cTA0NH09MDF3snI0VTE8VDRV1JUTF5IQXJ7eXx5fGV8dHZ9dUVNdHBGT3R0S3FKQ9TGxMr//PPl5+Pk5OD7+OTk8PPBw8vA3MXFXFNUUNVeStRAXEZeVF10SXFwREFFRV5AUlHXWUpY09HS2fX/8MjIx1Tf0dRTXdbF2dZd1N5RV1FTdU5bXU9zT0pxdkp0dUtxc0tLX9ReUllFWlhfQnR2dk1Q0Mf1yPz49/Lk4Prl5OX88fbxxd3bwczR1tlRW1tfUNXRU9TY1FZSX0h1SU1OTlpDSUZGSHVxTU9KQVTV3NrGxMbMwdLSxNvS3M3Mwcf09cDFxtNTWEdAdXd0d31wd3B8ZGR8e3l3T3R3dnVOcnB2dnRIV9LE9uXk5+Hs6ens7Ozj4OHh//L39s7A2dRXU0VOSEhAQU1HUkRHRk90dU5FWkxbWllBQVpTRVnQ1dRQ2MHE38z0zFXR0ERNXtFSWVfY29PX2t5YSUx1fHNyc3F0dk1JTXd0QUdYXVBSWURGTU50SnRKQkFY0sfG8frk++Th5/j8+/v99Pz89sT09N9W0NhXWlzXUlpQ3NJWV9dTXFhTX1JPd0FATktARUdCW1lZWVJR1t/bzMzE3VVR1VJW09nS3Mz1zMXaxddPSUx1fHt9cHx+d3R9eHBId3BLSXdzcHF2dnB0SEFNXNv0/Pnh7e3s7uLh5uDl5OX4+M7z2tbeTVhQSF9LcVJEQHVbV0JIR1NXWFJXUFpMWV9DQlHVUFJV0trf2c/F28fY0FxHWEdBR1tW1FLT2N/f1tVfQE5DQ0p2dnVJT0lYWVpHTlhYSU9DT3J8cHN8ZX1xc3RE3vD95ebh5ufj4eT65OT6+ufl//XJ98HU0NdXX1hQ0dZZVtdQRExZU0VAQUxOdXZNRnVJW15cWVDf2dDazcDH0dfUXF1W1NbV0d7Z1N3D3dZUVVJMSURFdXJyT3dxQ11YS0pOQ3R9cHFyf35zcXN8fEpbWN3y+/v65uDm5uHg5vvl5eT4//z0wdLR0NVQVNRdWVNTWk1PREBKQ19fQ0pFXUFPUlNFQUldVlbWxcbG2d3F3lFfWFtbWlDR19bT0t3S09LVUVFTUl1fX1hCdHVAW1FX1ddbTEBFQnZyc314e355ZGR8dURRw/bz//vk5+fk5+f7+eTn5vr++PL19MnCwdjZ2NDWVFlaQHRLQ0hNSnF0dExGTUJFWkBCS0NXUNPF2sPb38Tf1tXX0NTV18XH39jc0NZXVFxAXlZSRU1Od3J9dHVOR19ZREx3SnVxcXt7eXp/fn91TV/e2s/28PLl5ebg4OPl//rg5uX75f/O9PTCxtjAxdLXX0dBT0x0dU1PTEpMR1hbUlNYRkRBQkJHWdXf09HS1tRRUFNdXEREXlHX3sHH31JX01BYW1De09RVVllOTERdWkVUXFhGQEV1d3N/eXh/emRlf3dNX9XY2sn3/uXk5+fk+OXn4eHg5uHm5Pj98fDz8fPxwddQXkx1dUt0cnxzc3Fzd3VASHdaWUF1QVbUUVXQ0NPR387Yxd/R1lTbxcTDwsTWUNFcRUNEU9VfQ09IcH99d0hwdU9HSnd1QnR9fH1zfn13TU9EUd/f3MT38vP55eX6+P7k5+fk5+Tl/P39y8n18PbPwtrUXFhGSnZ2Sk1KSUFdWkBHV1JNRVNXXVPX3lBQVtBUUl5X1FpFX1VXVNzPz8/EwNNbR0VcUldU1FdeRVlEREJLTk1DX15KdXZ2fHh5fX9le3RNSE9f0VLRxfbz9ff9/PP9+ufh4eHi4ODm5Pj29/zyy8vG31dETEpzcHN2cXB2S0p2QklDSkxeXEdfX15ZXFBU1lxdV93RVNfZ3dfYzMj1z9neXEZDUkRNR0dFT0BATXR0Sk1ORFJcS3F2dnFzcXVJdkteV19W1t3T0NjK9MzL8Pzx8Pjl+/rk5ub6+/nzycr3ysHBzMVVWkdHTHRPQUF0SUFFTE5aVlxIRNzcRV5U1FhFX1dNdU9aWElHV9bW08b09c/Y2VtIR1BeQEdT1VpaX1BCdEBRREZfUktydnRJcn5xdnF2TFNaRVjT31ZR2crc0Mzx9vby+ufn5uPt5v74+vL09PD2ys/Nw1RYXllGQkxaTnZzS0FKSltTTELV3VlBRdTUWF9UXUBAUtVfWlDS0dXe8/3N3d5VQU9NQ0t3dF1fQENZWk1BXd9SQklCdHNwSHBkZXZ1SklDVlZT087a3tnAzs3P8PL19PDl5OXk4fj8////8fXw8snGw83dUllUXV9FQEBKc3RGQ0h1QVlRU9XRVllX1lJEX1BHWF9cUFNZU1fX2s/IwN9U1FNGdE9GQ09YVltZWVNXXVPd0F1MQEJJdHB8eHl5cXd2cUBdVNTfx8XT0cTDwcXIzM/1+eXl+vr6+f/88/f38f/x9MvI2tBW1dPUXkdcRENARENIdE1BWkRGRVlcWVxSVVNHWlNSUF5YWlpW19jawNnExdpUX1lEQ05GU1RSU1FV1tzR1VxZRkRGT3RzcH1yfXd2c3ZLQl7Qw8bZycvOzcnPx9PH9ffw+OX7+/7l+/n98ff2zsP3yNxWVdZRR1LRUExaWVtPSkBDTU9GWlRaRVheW1ldWFxcXFFYQURGX0Rd0N7R3drYVEVRVEV1RlJbR0dF1NRWVNHcXF7XVkp3dUt5enxKd3BDR1xfV8TJxdnN98Dc2MHcVtLP8fb9+uTy/Prk+PDz/PHOyvf03tbc0FlR0dvdUVHS00NJQFp3ckPVUkJAUVlORtXWRU1DQ3Vwd0FEQ0fTxN/ewM5VXFbQUkdW0VFDXdHQXV3V11JTUNxZcXxycnplfHR9f3BDQVpc28vE2vT2yNzQ21JY0/Dy/Prh4+bk5ub58/Xy88nB98JTRV9UREdR0V5HWFJGT01ESHVMXNVYR0fVV19c3t1RXlhYS3VOWVhZUNnDzNrBxNFSWlZTWFHUWkdcV1NTWFDRVlFW1UZzeXJ8enxKR093Q1NeUd3b09vfxMbUUFlbW1PY9/Ty5Obm5OTn5P3K9PH19M3P21RdV1RW18HH1VFRUUVEQk91T1pTWk5NRVxZR1vVUk93SXRycU9FQl7Qxsfe2djWXF5X1dnFxcTU0dLUXkdR09VTXV9Pc394fntlcE5MTkJTVERZ09DW38fe0dXT1Vbfwcv55eXj4uDm5Of59PP898fBxthUWlxcWV1T19BeWlFcQEJBRkFBW1hOSEJARERb0dZTWFlbT3ZPXllb3cLd1dHcVlhEX1HW3MTH2dbVVF5BQlNWWEFeRUp2cHBzdnREUFNdVNFUQ13T0NdT0N9XXdHXVtDC9/P++uHh5Pv6+fH18v3IwsDH0lXexNjc0sXF39RXV1tNQFtYQklYSX1zS093TkJHWlpYWUBKcXRaX9Tc2NnVUdfUUlbZxcXJ9/bD09DQU1pf11lIQUFKc3JzfHxzdEJbUFZXVl5aWlJQXNTe117U2tjZzPf/+frn5+f4/PP88PH29sjZ19PRUdXd0dXX09/WVlRdRkxGV11AT0BMd0dFREBD197f3dFQX0NLQkZGXFRUXkxCQU5ORV3R3NnGx8XfVlBTWVtcU0N0dUJNTkJPTURTVFBX3NFWUllbVtdUUFlSR1jW3dLeyfL4+/rl+fL29/P//vL3z8fG2sfH2sTBzsPS2N9WWFxaSnVPW0tzcXF8c3B2Sk9EUVfVV0dBTEhOW1DX1tLdV1DS09be2M30z8zLwN5WUFFZW01KdHZydnd3dnRPSEdHR1FSWFNQV9Xb2VVdUtfW09jI9/Tw+OX6//L2y/XP9vP2yvXCxd7f097b2cXE2t7b3VFAR0dGTEhPQHR3QE1CWVZTUV5SUl5SSUp3SklDRVhERkFATUBQ1NfczfX3zMDY39RX1VdGSU5OQnVOQ15bW1pfX11TUl9HXdfQWl1QWE1OR1hd1NrMyvf/+Pjx9PX0yvT39vH2/fPx9Pf29s7Oy/fIxtDQ1URNTkJ2fHB0fH52Q0dHQUdCTkBPSHFKQk1NQFhTX19S1N1U38bC28HL8fTG2dnURkFAQnV1dXF8cHFKS3RIQVpFW0RTVlbV2tNXXNTRWlzay8rI9fbK8P389Mv0yNrawM/Cx8/DycHEz8/b3szy8Mfc0tpXWkdGTkhNRExFXdTQ1NFVWE1KcXFzdnV1dHFwT1t1dEXQ1FdUws/By/fJxsXF3l1fXFNZVlhdWExaUlpMQ19QQ0xS0V1aWNVcTEtASHFGUN/d08fOx8r19vf39vH0w83P9MjP9P798fDy8PX3/PDCx97ZX0NPS3RxcHB0S0lBUllbTUd0fHlzcnN2dXVwTkVdW1TB9PXIyvH3zsnL9MbZ3dZeTU5YXFpJQFtCdXd1d3VNRkxGWVNTU1VUWUFBRlpEV9/Czc3B9PDIz/by/fDx8M3a3tvW3dnBwdvEwM3O9fX3yMDAwtxWQ0JHQE1EX1NQU9HTVFlFd3FzcHB8fXJ+eHZKdUhe09rFzcPMyc3AzMrOw9nc11JZVVFQV9fXUVZfR01YWEdaXFJcWFxdR3V2dHZ2dERdUlHdxczNyffw8vz++/n1zM/I28b19MnL9/f19v3w9vT2zttWR0h1dEp0SE1NXVBYT0ZBSn19cXN5eXN2fn53QEJM18339ffz//DP9PfKxtjf319EW15FTEVVUVtYQXR3TUFESFjV1FxW1FFPdk5DR0xZ0cTf08vwzM/3/f328P/x29ra3lBW2MLH38TOyc3P8vj39vLxxV5BWEJ2SVxQV9Pc21BdXUR0cXB2fGV7eGVke3x0d0/XzsffxPHx2Mbx8cLBw8/cU9TQ1NHdxMHcVVFdREVPWFtDWVBYTk5MdXx5c3RwdENUVFLQzM7J9v/7+/78+fPLwMvJwsHK8cvI9fP29P36/vHKztFFdXdKcHB0WlhfWFxET0pIdXB8cnRyfn5yeXlyTV5Q1sn39Mv08Pf1yvb0zd7Q0FdYXVVXVFFRUltJQnZ2cXdIREVdU0ZHd3V0S3FNTEFfVNzc3dv19vL9/vn/9vH0z8DEwcXe3cXCw8XDyPf18fL+/PHP3ldGR05ARV1V1NzRXVtHQ0x2cXNzeGRmYWdnenJ0SUNe19DW08TYwsPO9/X0zdvZxsbEwM/CwN3E31JcQUh0dUtbX1pLdHR0cnZLdHVLQURaQ1LU0cbI8Pjl+v///fH29ffLysrP9PfI9/Ly/fPz/P31xVFfRUh3dExNSUtBQ0pLTEtKdHF3TnF6emV4eX11R1zW2cXHwM3CwMXHwMvKzdja0dTbxdvb29hVX1lHQnRxc3B1SVpFQkJBXFJHW1ZcRFhQUl9Q3d7e28vz/fH18/bNwMDH2N3FxNrFz8/O9ff9/P3/8PTO3NzfUERd1VNaRVBRXlNfWkZKd3F+ZmFhZmRkf0pNQF9V1VXU09/Q28j09vX08PTDyPTKysnNxNPQ3NREdHZwcn9ydnZwcHdPSnZMWEtxdUNYQUZVwc31/Pv4//3/8vDw8vz2zsvw9Pby8PfJ9PH1x97F3VNHRVtPc3FKdXdKWllOTF1SXFpNdXJ4enh9cXdHVlVU2cDb0dTS3NnYwcDGwM7OzcXax9/U1dLQVFdWWUh0Tkp2cXRDRkdBXlNcQUdcR0lNUlJZVtrAw8LL9PXPxsHI9MPMzsLByff29vfz8vzy8Pfx9MjA2tPR0VxYWlxQXl5TWUdBRk5LcHh7ZmFgZHh/fHFCR1taX11cVdnFwPXx/Pv+8vPy8Mn1y8/GwM7G3VdBdXZzcn9xdnNycUp1SHV1dnZ3dU1HUtXfzvT38PPy9Pb08Pzy8ffy//z//PPx9fTJysnFxsPA3VRUUEdER0RFREVBQEdbQENASXF2cXx8fXF2dUJGRFBTUFPVVdXT19Ddw/T29fTJwcbDx9jY3dbT09VXXERMTk51SU5OSHVLQkBNdU9MSktMXFFV1sLIzMbO9M7Bzcv29/X2/fzx8vLx9Mrx8fX19/bKzMna0NbSV1NUUFNdRU9OdHN8fn57ZWVle3p4cnZ3cU5CWkVBVtnS2Mz0zsny8vzy/PDy8MjL8/TD28XTWkZcWHZ2dkp9fHJ9eHh+eH9/eXNKc3RfxcfbyPL39PDy/fDy//v9/f765fnx8P3IycvL2sfPz9zQ0NHXUF5cVV5bRlpId3RCd3l+c31leHxwc3d3dUxBQ1xXX0fUzd7Q3svD2svy9M738PXJyM3Nx9hQV9NVXlRXREJFTXFycHF/fXJzcnJwdEp0TF/R1FTb8fXP9PD29vDy8fby8vn6/vb5+fL28vz0xsjK3dbBx9RXUNRZWEF0dkl2fHJ/ZWR7ZGRlfH1/c0p0d01aXUVQxczDwMD38/DK8v/x8fD89vT0ydzSUV9eXFtPQkBCdHRwfnl2fXh+cn5lfnZ2SllQ1dHGz/by/PD/+vnz/f7x8P/6/fL5+P3y8/b39M/e2NnUUdVTWFtcQEpKSUlJWEBKcXZyeXl/eHxwfXNOQUhJRVhEVtnE09Lax8/39PXw8/D1/P70wczEU1bXUFlaRUBNW0BLdEtxc3Z0cXJyfnp5dHd1WdZSVMTK98rx/f798/P+/PTK/P78/+Xl8vD98M/OwNzX1llHWV5NT0ZPdE9cQkhARndydnF7e3NzfnBPdUhNTEpEVdXQzPTCx/f0zvf9/v3z8PD29MDS39NeRVNbQ05PSkpMRklJTXdwdUhwfH5/eH13SEfR2dfb9Pf18f/89v34//z58/fy+f7/+vry9PD0w8HE1VNRXkNNW0J3SF5BQ1JQRERNdn5/f2VleHtkfHFxc3d3SkFQ093Bzsv08/Dx/vv8/fn68vDxwdXT2VBQ111BTUJMS0BDcHB0cnlwd3thZXJ4ZXdPTl/Q3Mf29Pfx/Pzy+OT4/Pj7+Prk5+Tl5f3398nZ29dZX15Od0JGS3ZCWkxMW0VMdXZzfXN/e359eXl0QXZxQVtGUMzKzcvx9PXw8PHx8/H28/30wsXRWVbWUUVeXkNPRVxHTUh0dnVyfXFxe3p8c31zTkVf1NnHyPf28f/88/L4+vLy+PL3/OX7/vv8ysDMx9De1lxfX0dAXlRESV9XR01fWndwdHB/eXpnZXh7fktCd0pZV1zSz87Cyfb09ff39vL98/L+9sfBx1df1txdW9TVWFpcQU5Idn1zcXl6fHNkZ3l+ZX5LRkJXw8PK/Pv++uT6++Tn+Pz6+/375+T/8vbB0dBTRkVZQUVXV1taXkNLRFxCTkdCdnZ0cH97e3t8dnF2RVJEX9rLx8bL9s7198nDwsbA9vP3y/TP3VXXX0ZZV1Jd1NZYTUNPd3RIdnZ1dn1ycXl7cnZwcENeUNzM9PH/+vn75OT++/vxzvfx9PD+/ffLwNZTU0RGXFTX0sTfXV5RVlhX10RIQ0lzf35lZmR6ZX53cHFHVFDVwcjHxfT2zs/N2dHbwsP18vbI98rQVdvcUNTY39TWUE91dnBzdnRyfHByenp+eWV9dnN0X9XXwvD9/uXk5+Dj5+Xk+PT3/vz09/z2wtjWQE9BTE5cVV1Q0VBCQl9GS0ReTndPdX18cnx5fHFwS1lZWNfHwsLx8/X18Mrc0tZdXNTS38PIwMbH11tQ1lBe1NnQUFFRWkFGS3VCQnV0SHd/cUlxckhCSURV0NLG9Pf2+ufl5OX/9vTI2trIy8P0/M7R0tBfWlHX1NPZ3sTD3FXX3VBBRVJNcnJzemR4eHt8cHB0REdDUdnfx/Hz9PX0xVTR2dVR2c3PyvbJ2MfaV1XH0lzV2FBAXVl3cEh0fHZLcn9zcH99dHF9SFlMTtXH2cL8+uTg7ebn4OT8/f30yfT2zcTFVUFNQElKRV1BQNXf0dLWXVbT1Vhc1UZ0SE92dk5PdUpARkRSVFLUz8rJ9PfD39vcWkRRWUdU29LQxN5WUNfXXdXRVlXc0FJQVVhJRVNMdURaSU5DSnVPT3F2TEt1WtXX2/b5+OXm5OXl+vHP9cvMzM7b0NFQQEBfRUFY19TQzM7ExMDb093RWEBaRnR3d3x5cnJ+fXRMd0pZUNXEzcHNzs3Fx9rQUNbf09vMzcDHx8be2NhUUdfRVdVWW0RGREx1Tkp0Skl1SnV0d3d1dHdIQkZR28jx/uXm4eDg5OX78/b09c/ExdZdR0FJdkp1dEFX19bR3tjT39/VUVBSWF9fQE5OT3FxQkdARltdVNHYxcfGxsTF2dBTX1xdX1bT3dLQVFTR11FZU1HV11XR1tVRVtVQUFNQV1JbW0VDTkpxcHZ2cXVBRVDYzPf85eTl+vv+8ff09cvCxtvS1lNFWFpDQFHT3MTBws/PzMTd0dRTW1xeQHR3d3N9fXBwdnZKWFJcV93axdnc3dPX1NbU3NjEz8/Ows/Dxd7Q0VfX3VdR1VZfXkVHQ0BEQk5GTHd3dHFwcHBzfHVbXdfMyvf85Obm5uHk+P7w9PH0xt7c1FhHRkpzd05NWlNVVtbS3NnY21ZSVFxeV1BBTUVDSElFR0BdVlXS2N/Q28XWU9bRR0ZbW0dc0tfW3NPU19ZWU9VUVtXf3tfZ2tFX0d9RXdVVUF9aTkt1c3x8fH52RFxS18bNyPH+//38//b098rI9c/a2sfSV1BRXkFc19bc2sbB2NnF2t7UWVpSRkhMSnF8fXFwcU5AR15W09jc2NrQ1VXX0NdQUdVUVN3DyMXEw8Td09LRV1BTV1dVVV1SXkBBRkFCTENIdEpJdHBxcHFJWtXbzsr18vj5+eTk/vzy88rMy8Df0NBXW1tBSUhKTEFWVlPX0tzX0tjQU15SUFJZW1pPS09NRVlS1N/Y2sLDwcba3NbUUF5YQU51T0ZFXFdVVlPR0NVU1VdQ1dna2cTDxdHVVdfXV1ZSWUdISE50cHN2S0lHVNLT2MHJ9Pbw8fT19MrD2d7Y3NTQ0tPX1tddXFbV3MTCxsTJzMXY3dRSU1JGQkJ1c3B3dE5HRVpT19TW2NnVVNfVU1BVUFlZQUdQ19TV3sXe2szF1NzdX1bZ2NbR3tFTUlBYWFxDSkhLcXNKS3F2REVa0tvSxvfx9/P+8vD98vX38cfc2t5WXlVVRURcQktaRU1e3dFR3cfWV9LTXlbQUFpbW0xNUVVT1sXFxsjD3sDO21dRV0FMWkF0SU1IdU1GRl3R0FTU3VFdVlNd0s/D28LLwcXF31XQ3lNAR0ZCTEFAS05eXFxQVdbYwMTYxcLNxcDA2MDG3dTW0NDS3djWV1RVUVJU3MDNzcjL9c/f3NdfWVlCd3dLTk1AW1pc1VRU1VXQ1NVXXV9V0VFRUFNR1NRR1djDx8XC293UXVpHU9XV0NLe3djEVFhbRU10d3Z3TkJMQl5R1NLZ3NnN9cvNyfT09/XIy8nP2dDTVFfR01ZeU1xHQ0l1Q1xcX9fFw8bAwNnd39NVVlNbWNfZ1dTEwNnQ3N7e2FVeXllBT0dFQk5DRENOQ1pZUdVQV9DRXlpcXFbZxsHN9cvJ9vXE2tlRQ0NaQ0JEW09NWERaUVZdV9ndUdTa01XQ3dLFw9zQ2sTf2snO09bdVVJZXVfT297Ez/TPxs7a1VdRWENBQk5DX1hAUFdERlxXV9dVXF5WV1tf1lNd1NBWXdza3tjF3Nfe0UdBXFlGUdnZ38XH0t3eVFxeQHFzTk1KSF9eW1dWXdfH2NPGzMTFysjGwMPF28bf1tPa0lbd2FdYW01xd05JTlHQV97IzsbK98bf2dBSVNPUUdLa09HF2VBU3NVdUVFHTUVPdUJGdHRCT0tFVlFU1tZUVlRfXNfc1t3Mzsn18crD9c/T19BaSERESEhFW05PQE1DUFdeXdVVXFLe3dTbwd/TwcPGzcPY28DH1ldQW0VSUVTe2tvYx8/AwM3a1VNXWURcW0BHUV9NWVFZW1dXX1fUU1hRU1te1FFGX9RUVt3b3d7F3VNQVlhbUVVX09nc3MXb0dbTV0ZHXkRPTUZBRVhHWl9eXVXc3NHdxMXEzczDwMTe0N/Z09HS19TS01BeWUdNQl9ZW1TQ0dDEzMbF2tjW09jT19DU1dbc09XX3VVeVlZeRFpbWV9ZW0BNTXVJR0FAW1bV1NXW19Tc0tPY2dLdxsPDz8nD2cTZVlFRR0hCWkxIQ0RCTFleWl1fRFnS2d7AythR3MbT1trZ19Le3N/F31JX2dzR3NxVV93f0sXN3FPT2VFQ11FbRVpaX1RSQVHcVVLU1VhaUlRQVdBfQFxSRltVUlpW2dPU3thX0szfVd3cUVzQ31ZV2NRb1NNdRV5BS0xZQUhYX09b11ZfVdDW3sj1yff2xdTGwdZU11FbUdNVV9PVR1PYVFpX0F9d39nV3MLWU9rFV1XF3FLV299V2cXX0sfUWVfVRVvQ10dFVUV0QEZKTERAR1Td1Vfbx93bzN9X3dNcU97eUNLM0tHPw1BdXENCRVpLdVxdTkRXREJe1VTQy/fAw/XH3cHYXllUUF7U3VVUx8Lc2MbZ0dHXXVHe3FfV0lTV3dZdXdZRXtbdV9fGxtHS3tdQUVZbV9lRRlpTRUJeUkFCUVNbVtZQ1MLM3tzH3lBQUEZZ19RSVMTH2Nrb1VheRE5CQExEXFlNR1FSXdHawMrz9s3O9cPb39VbRV9HQV5QUlHZ2tTcw9xSUNdQUNHWU9TE3FTS09bf3N3Q2c7B38Tb19TW1VxdUFNWUV1GWl9PTEVHREVFQ0ZdVdfR2dnQ3NzWV1dUVtXf39zPyMbYxMTUUVxNSE5NTE1ATExDR15c0sHDz83JzcDCx93X1FJYWkZFVtXV397Yx9zRVFLU1tTVUNbd0NDc0NHf0d3d1dDb39bU0dZXXVNSU9fWVVRWV1dcX11YX1FbWlhFWlzV0dXT2dFX1VddVlVXUdXc2N7F2NnZ3dVZWkVDQkRaQEBFRUdbUtTHzszAzsnDw8Ha3NHUXkFEREdYUlBQVdbUUFZUUNDZ0dHY2t/Zx8Da28TR1d3f0tLd1FdU1FZbVtVRVddWWV9dW1pSU1lYUkRDW0dEX1JUV9Td1tHF3tHT3NDU3NvY2MDZ1tLRWEVYW0ZEWUZPQEBPQ1JXV9/F39PFwMXFzMTT3NNQXlNTWV9SXVxWVVxW0N3X0dnd0NnF3tva09bQ0tTU393W09FQU1BdW1PR1tXQ01NQVFBdXFBdW1JTRENEQUBYU1NQVNHU0MTb09/c19Dd3d3QVVJeU1BZXlBdU9VRX1tFW0NbVNXW3N/Q3djFx8fF3NDc1VtZX0VEW1hZWV1QU1PU1tbc2Nnaw8DBx9rd09/d19za09bT1lZQV1RXV9RQXFNeX1JWUV1WUVJcXVlAQk1IQl1RUNHf3sXGw8HBxNnZ2sTc0NddWVhTUlpeXkVaXl5FWlhEW1xSU9XUVlfU0tnGwsHH29/W1FRTXlpZXVFXV1TV1tDd28Xe2NvS0Nza39zZ0tDS0tDQ1lRXUFxfUVVXUl1RV1XX1tXV0d3W0VVeRENMT0ZeXFFXVlXcx8fHw8TY2N/T1FVdRUZaRVheX19cVNfVVVRcW1FXUlbT0FTR3NLew8PY2dzRV11fRkZFW1pFU1FTUVRV1tjY3MfE39vBxtrbxdvf39/T28HS1FVUXFheW0BDWEVb1VVX0NvcVNfQUEZBTXVGU1PU0t7dxMnOxcLLxNjG2dDWVF5CQEZMT1hbQVJVXVleXkdFXEdCVtdcUdDS3sHNzcfH2N3f3FZR0NVcXFZUV9TTUV3XV17V0ldU09NV1NjTVN/F3dzB31dWVFZdVlVeWFdQXFXd3NnDwtve2ddZW1pMSUFFX9XX1NzBwN7bw8TS2dnW1VFFTU5MSU9f1FJR3dRT1NZSXVRRWlzS1V3T3dfdwcfExNvTVNRUXlxUX0RcVl5ZUdVTVt/XVN/SVNHc19bbx9jZwMDawcfQ1dZUW1pRXUFZUUREV9VW3cHb38bbUV5RRU1cV1NV2dzW3sDH2cLJ3tzE0V5SU0dJQkFPQFxFR1ZVXl3QUVtfUVhaUVRfUdzQ0s70zsPNwdzQ0FBS0NdYXlRZQ1pSWF7R3FfU11pGVlZT1d/Y3djG2t7Gx9fR2ddWVFRZRVNRRF7R1NDCz8fDx9zVUlxaW1TVXF9WU1HX2NvFz8LT19NYRl1cREVcXVhYWkZaV1FZUtHXX11XXFhSUVNX38XA9/TGxMfZ1VNQUF1RXEFDQkxCRFJR19jE1FhSXFxW19Hex8fZ2cTGxMbB3dbd2dFSX1lFW15FRdfe09Lb2t7c3VdcXVFQUlBYRVDT0NLN9c7Cw9xQVdRdX1NSRVtbT3RMRUJAXFNeVlVZRl1RW1zX1lTH98nDy8jExdvUUlXTXVpSW0xFVlhY1N1WUtdcTFhUWVjT2dHU3dVXxMnF2sjD09jYUFtW1VtF1VRf3sbR1NvC393a1VhU0VtEU11GU9DR3s/10tXa3VHR0l1YVdVFQEFKd0FYTUXU1V9eXEVGU1VYUt7T0cTP2tvLzNLS3tVf1VVaW1VXR1lRX19VVFpb1FFaXFZZWdPSUVfT1tfHys/N9c7d09JWU1RUXVDc01BU1FbXxsXS09xUWlxQWF/WUUVQ0NLcxMfR18fb1dDTVlZXXUFGX0dKTF5aXtVQRURdU19S1lVX3tNU1t/ax8XZ0NfS0V1SV1NSVVFQVlZQWVhSU1DXUFpdVVRXVFRWVd3f08TJw9rF2ddV0dFRVtDQVdfVXl5V09TQ2t7W0NFTUNDQUFHW1tHT3NLdxdrT0NLXUFVVRENFR0ZFR0xDXVlNRlhaRl5TUtfZ09fW0dXWw8Dcx8/b1t7a0dLb1l5X2FRaXVtNR1NdQVpdRFpQUFtS0FRW3cfFxM7P3NjCxN7Zx9rFw9zU0tJXUdfUUNXXXEVZUlhdVl9ZV9LVVtPe0t7F01fS29ZX0FRcUdRTWVTUXlpYWkBEXEVDX9dRXVdeQVtXVlPQ3tzT3tZW3djWVtHd0dzY0FZV1lRRVlBeXVVdW1fVUVXW19DaxdHX3N1X0NnW1NjF3dDQ1FHU31VX2d1W1N3WV9DZVFPS3tbd2dbX3sXSV9bXX1BUWUVYRENHWFlfVlBBQkVFRFlYWFBXVVNQ1lBaVtbU3cTb3N3e3d/D21XQ2t/R0tzUXV5fR0FbWkNHWFlS1dRW197Z3MTF3tvGxNvExsXe39/R1tDW1dHT09LRV19WV1tFUFZSU1ZVVdLT0d3d09XU0NVRV1XUVlFSUldQX19RVl9dVlNTX1hYWVtaWF5ZRERaXFJRUFDU1tPd09vE29raxcHH29/S1FRTR0VaW11S1dbU3djZ3N3T3tvY3dzZ2NBRVFRQ1dRX1dze3dzY0tbS0tZXVFfX0tZX197e19DY3dXUVV9eV1ddU1JaW19GT0FERVhX1F1R111BRF5aWFJSWFLT1FDX1FJU3N3d2sPa38bH3MXOxdTX0VNbR011SEREX9TQ1dPcVFTexMXGzMPEwMbXU1RUXVbW1lXcxN/Q3N3R3NxWXFRUXltQUFJX0dDT3t7VUFBcUtTd09bT0FZfRUFBXFJc1d3XVlBZQ0FFWkVaW1pZXFhHXlBdUlTVVFXS0dfcxMXEzcPFxsbSUFxcWFhdXV3W0tXV1FNQ0d7b2NjH2dBUX1xXVlPU3NzS3Nvb38TB3NrE09zY11xS19DW0d7f2MHdV1RSWllSV19ZUV9OSkt1TFpaWVPVUVtERUFYUlxTVVRQUVdSXdTc11fd3dfW1lZR19ne2sbb28HbVV9SW0JBX1xZVNdSX1dV1NLY3t7GwdzT1FfU39/Q39re1tbc0tHZ2dLS3dZUUF1BRVTVVtDe38XB2dDd3NVQ1NZW1dZTW1tZWVxQXVxW1VlDQEBNQV5eXlJRWkdeWFhX1tVV0N3WVlZQUNfT09nHwcHBxtjQ09FTWV5fWF1fRFhRU19X1lTU0FdeXl1TVNzf397H29DdxMbax8DBxszD3dDRV9Tc3NDfxdncxcTf09NRX11TXVtFQE1BWFtbWVlaWV5ETURZWlpT11dV11ZQ1NHR0t7c3Njb0VJcUlxSVNXT3t7XV9HRVlTVU1tfXFpGWFldVdBUUdbT1tTVVlDV0t3Yw83H2tre3drb0dTS2NnZ3tRdUlNTV9HQ0tnc19DFxtve0tDQ0NZXV9dUVtTUUFlcX0FAQUdYUl1ZXFRUW1tdX1lTVlJV0NzT0dFQX9XQ1dTf3tLd0tHR39xUV9HXVVRQWVpZU1xeUl5YX1lAQ15SUdbfxdrCwd7bxdvY29jc3d/E29/e393f3dbdxdrd0t/d0Nnf19Hc11JSXVxdVdRdXVxFQEBBSUhFU13X2NNU1FdeU9PTUFDW0dDe2dFVV1ZQVtPUVdFVX15SUFFWUVNX09ZQV1FcXVbVV11dWUVFW1hT3N/T2svLwMDG29jD2tbT0VVfU1VfWVXQVlTf0tfS0tfV39nW3Mfa2drY0dHf2N3S39ZRUF5MSUdGQ0RXVFfQVF5GRkFEUl1GRlJQWF3UVVJWVFXQxNvX0tnW19vY1VfS0tbe2NHX3NReU1FZTk5PcXZBWV7Rx9rFzM3f38DF193a0VRVUFtZVldW3drT38LB3NzF2d3e2dbRxd3U0tBTUtbRV1TWUkRHR09CUlNd1sfa1t3cUFhfR0xBRE1MWVlAWNTVXVDVV9XQ01VU0NFV09NUVNLd1tzG2tLf3FZWVlpPQkZDQF/X0d7NzsLAxdLT0tVcXVRdRkBEQkZTV9ff2tjZxsHb2MLA29vGwcfDxtvYxN/R0tzVUVVTW0dFWkBEXl5S1tdeRUdNSnV1dnZKSHVNW1hQ097f39vE39/a3t3FxN3d2dnf28fY2cTfVFXWU1tGT3R2dU5PR1XS3cHC2N3c3VRX1VFcVlFbX1VXV9LFxMXHw8TFwsLHwcDZ2cfE39zb0lHU1lNX0tVQVlFfRVleRVjV1FXQ11xGQ0x3c3d2cHVPS0NSUlzV3NBV0txV1Njf3MTA29rDw9/Yw8TT3dxU1dFRWltfQ0tGRUFf3NvZxMbc0NBRR1lRWUdeUlld19PRxc/Bxc3DxcfKzMfMy8LByMHT28VVUNbQ1dfc1lBVVVlGWFpGW1dQX1NTQUlPd3J2dXFxT0FDWVRXUdDc1tDY2N/YxdnbzMrJw8PF3dnF0tXR1lZRVl5HRkNLS0deUdLd1tbc39ZRXFhGWlxfUtTW19PexMfJ9cLBz8jJysjBw87MxsXY0tVXVlDV0dLS1tdXUVZTWERbXl9dXVxRUV5AT0l0dXd2dUhMRF9dXFDVVlNXVFXQ3d3fxMPIzsfa3NPT1tbW0tPW1FZTUFNZRFtaRVbU1dDZ39DVVVJZXkVARV9RV9Df3NjAzcHBzszCzsnMzvfIx8fF0NDd0VXX09bR297W0d/UX1JdWkZGQUJFX0FJQ0F1dE9KdnVJTkNcXFpQ1F5YVNDX0NjbxMj1zMDPzdzYxNzT3N/V1d3UUlBUREJZW0JYVlJW39lXU9VdRkRZRVrV1VbSxNnT2s/axcr1yffxys72ztzc2NRfUdVQVdzR19jF0FTR1VpEWEFORltAQV9ESE1GS3dDR0pCWVpFUlBGRl5YRlPXUVTYx97FyM/HwczE2sLa1t3Z1Vfbxt3T3VdFWlpCWldQU9be0NXVVltaWUFHUlZcV9nc19Pb2NzGwcfO9MvPyMze2cbf19LTU1PW1tHbxtjf3tFdW0RPS0BGTEJEQ0hJSXR1QEB1T1pHRl5eR0RZWlpW0NfTxsbZwcvOzM7Ows71wd3S01VU3d3R1tdfR1paQkdQXVtR1lZSV11HWVJeW1ZUUlTf0Nbd3trYwczJ9ff1z8zMxNrb3dXV1VJfXVFW0NLX1tBUWVtEQUBaWFpEWVpNTE1DQ0RZRUZbXl9ZWUBGRENDRVxdVtPY2cXGw83BxsHB2tLQ1lRV0dnf39nf1FBdUFBR1dXQ0dbVVVZSUFZdWVhcWVpR1FVX0Nzf39zbx8zBwcLOwMTDzMTe0tZTXl1dUdbS0Nzd11BcRk1HRENNRURNTEBAQEZAQ01NT0lAREFPQV5EWlHXV9bb2dnGzMLMz8zCzMLa09DUU1bS3tHR3NNQUFfVV9VX1ddVUlJVXVlQVV1eVldeXFTXVNTYxcTGzcDI9M/Dyszd38bbVdHe1l1QUVxcVFRUV1NbR15aQ0RSW0BYUkZAWVxbWFFfRkNCTEFATE5HWUdaVNdX08XA2MHNw8bEx9nb3tdV1FZT1dvf0tnbVVNU1lVU0NDR1NDU0NNUUFVWW1tX1V1R0tLX3dvY39nYxMbHw8LO2N3FwdnS3trWXFbUVFNRUFFcWEdaRENMRFtBWlJRXlBVVV9ZXkRIdHV1SnVIRllaWlLT1tTewMXYxsDGxcbBwsTZ09LQVNXc297Zx8XX1dbXXFPU0dXV1NTT0ddU1V5aXFZSXVDW0VfQ39zT3sfNwMLMycDc0sXA39vGxNPVV1dcW1pFQUlKT0NJTk1HRV5T1VZd19NUX1xfWE1PTUNPTEFZW0Ff1tPU3NrB3t3Yxd/f2MXF0tLe3FdX08Tb3NrF0dXVVdRU09jF29nawNjW1tZSRV1XVlxR1NVSUFTU1NXU0NjZ39jE3tHfw9vc38Xa0tfR0FdSUlJaTExGTXVOX1RRVN7F11XW1VpDRkVCdXVAQnR1T0RBW1fW1dDYxdjQ3cbG28TDzMbbxcDY0d/ExdPQ3tvUUlDUVVHVx9nQ2MDeUlPVVUREU1VcXlbWVFDQxMXT0sfC0tbFwdzewcPY2MHC2tPT0tFTW1lESHRLS3dzS1tbWVXY297SVVdRXltaWE1JQ0B1d01bW1lV1tDT2dzd39zc2t7R09rH09bex9LS3N7U0dTc01ZW09vd0ML0wNnEwVZYUdBTQFnVUURGX9RTXNHH3NTSx9ZaVtrb1djPxt3Fz8Hd2sHH0lFSU15MSUJPSkpGXF3U28DbVVNZX0VCTkFCd3F1dHJwRllARtXe1VPR2t7dwfXI2N/OydDWw8je0dvG1tXYxdVS193RVtHaxd7f11RfW15fXllfXlpBQUdc19zf28zA3Nff3tbTyMvH2/X129HHzt/U0t9TQUdTQHF3Q0J3dVhQW1Pc0lpCXlFGQlJXR0hITkh0TFtbW1DU1VdU1NfdxMLEx8LH3dDbx97awtlX1dreV1HS0lZW2s3E3sPO3FDR29RZUNBXWlhTR3RMU1FYU93eU19U09TWwcjC2s30zdnY2trE2tzd39NVUFNfRkZZXFlEXNZWWVhSWUBPREZ1dEJ0eH9LTnZKUlBBRFTXUl3Yzsffz/D1x8TPzd3ezMPT0cTYVVXS0FVV1NbW09DVVF1cV9TX1NdRXF1bR1tSUFlf1tDX08Tf19jLycPL8PXMyvXM29/BxVFf1NFbTkReQEte119CXldZSUZSXVleUlxZREZGT0pDWkRARF9eW15SXVHR39zY2d/Yxd5UVdra19Ha31VX0NNQXdPG29bSw8bVVdrb0dPG2tRQ09NZR1xQUllbX1pBQkRYRVzSxsfGyPT09PXOwsLCx8fH29PS3NVdVtHVU1bQ115FX1hBQ1hdQEtPQXd8c0p1dE9bREFbXl9eX1fc28TCycrKysrLzMjLz8DB2NzR0NVdV9VQUtVVU15ZWkRFUNfX19XS0VJZUVdQUtXVUl9WUVhYUdbSw8j1yvX0y8jIy8nA2Njc01ZSXEFCRFJeXlTRUF9dUFxfUFBfXl1cXEdDQ0ZaXlNQXFtZR0JDWVJW1NLf3Nnc0tPS0dzaxsTFxNnRVVVV0NdV1N/d19De0lfR2NrS2MPE1lZWUl5fVlJZRFpHTHRKQk9AU9zbxs7Lw8PPy8rKy8zAx9vR19bVVlTX1tPQ0VdRXV1S1VJFWl5ESEt1dnB3S05PRFtaRkxNRFlZ0NjFxc3IwMXM9M7J9Pf1y83G0tTWVdRXU11RXFpFXl5fUldXVd3c0tXVXF1RVF1TVFBaRlpGQVhXVd/ByvT0ysbDzsvNyMjB3dNRRUReRE1HW1lfVlBdX1ZXUVRdX1FUXkdAQ05CQUBDWFZeWkVaRkVfU13X3dnd0dTV2MXb28PCwMbB2NLY2NPX0NHW1NRQV9Df3tna2drAw97W1NRQUFJfX1lBSnd2cXdOQ0dS3NvExsDDzMjIyvT29cPF3VRXVFBeXVXX0dHW1NRWU1dRWURcXkBKSXV2c3Bxd3VLTkJAR19TVlTT2tve28XHwM7KycrK9c7Iwdva2tPU0dDVUFFdWFhdUldQVNHf39fR3N1RVd3TVNTUUkBNRkJAQ1tS19Dex83HwMjIws3Kycfe31ZdWEVPQltEWl1UXVLV1lBX1NDX1FVTXV5bQUBIdUpCS3dPWERPW11cWlFVVVbR2cTG2sfNzNvEw8PZ2MXY0djB29LW0VdVVNVU3NjY2sLG0tLd111QUF9GQU9JTkp3SEBNRlPT0d/C9MjL9vH1yPXKz9jY3dBQWVlRWERSV1JYUFFfW1JSWVpbRkBDQkNIdXd3cXR0SENbW1NUV9bT09DExsDD9MvCzvXLw83Cw9nd3tnW0dbUUF9fXlxeUNbe09jAwt/FwNrS19dQWERZWkFNRkZBRl5R1dHbyMrKy/TMxdva0tHVV1xYXkdHR1hFXlNWUdXR393R09DRVFdSU1pHRk13cXR1dHdOQkBMRVlbRFzU0dHcwMPGxMnLzMbPzsHEzMvA29nH2dzR1tdVVNHS3N7YxsTZ0N/c1l1bQE1KdU9PS3VDRFpHUtHc2c/w8vH28fTNx8PB3FZU0VZYXFFTWVlXUF5aU1dTWlhTXVpEWkVBSUxLd3F0S0xPTEReWEdfVlZdVdjH2sL19c3C9fTMxMPNwd/FxtnU1N/TU19U11BS3drc0dvG2NLfxd5WWF5ZQEhNQENMQUVbWVLW0tnHyPf0ycPMwN3U09JXUlFUUF5X0ddV1NLQVVTc39FWVdRSRF5RW0xMQU9xcUtLcXFJQExKT0ZGQVhU0NzYw8nIzs7Jz83My8/Pzs7Cxdjb2t1U1NLSVNXbxtjT2NrTUFTRUURAWkVOdUlPdXRDWEREUd/f3szx8MrK98jF0tva3NDT39PXVNPf1lTV0dRRV1dTX15SXFhGRUROSEhJdXF3S0h3dERZRE9bU19eV8bNzc/38c7NyMnB28PNwcXb2tDX0NPUXVBXUF1T0d/c0NLe0NdV0dNQXFxTWEFCQUVDTUdZU1JU3NvbwfXLwsXY2NbR0tbUVNdUUFJU3dHW0N7b0dDd39dWVVdRX11TWUVCSU9JSnR0dnVLdHR0SE9IQF7X3dvDz8rDwcPMy8LDyPfLwczCwtre2Nzc19XR0N3d39DR0ldSUFVXWFhSV1hMQ0NDSnVPQkZEUNLFxsDKy8rLw8fbwdvd39vH0VTV19ZQUdTQ0VFWV1RdWlhZW0FDR0VaT09NQ0BJTk5PTU5NQ0VFRltT093dxcn3z8DPyM/ax8LD2NLY2dnQ0dPX0VRSUlHWVNTR3N7V1dTc0lXQ39rQUFBTXUFNRltYRF9U0t3Q28TE3tHT0t3U1dPd3NVWXV1XUlHV2dnX0Nna0VDV1FZbRV9cXERbXltBS0hKdXFxdHVPTklCQFpbUtbZwsHAz/X0yvX09vTDw83JwdnHxtvUVdLd0VfW0NPXUVBdUlxbXFBUUFtaRVtOSUNGRUFaUNPc3cDL9c3HwcPC29jGwMHS09HUVllR1dVWVtfU1VZdXkVaRkNARFtGRlhcW01CQ0BPd0pDWkJPRVlcWFDfxsDAy8rKy/X39crMxMXZ297T0NPf1FXX091XU1Xc0FDV09BQU9DQ1lFTVlJcWlhYWEVAWl1X1tDS2MfE2dzexdzS2MTH09fW11ZYU9HS1FTT3t/X1ddUXVpYX1lZXlNfXl1fW0BATXd2dUxKdEhGWUREUd/e1t3C9crK8PL2ysnLwsXe2Nve2d7Z2cXF09VV3d9XU1DUUFteUVRZRlheQUtDWVpDQ19QU1DX3N7Exdvaxs3AwMDDzMba3t7SU1bU11FeU1VUWEVdUFxAQ1lZWUVZX1haWl5FQUxOTkpITEJBWFNeWVbbwN3fzfTKzvTw98/BwMbc1dXf09dV09/e3NHVVdbUV1bX09dQVNHSVF1dXVpPQlpeWkRS1NVdXFXR1lXW2cXGwcDHxMbF39HT11JeUVVXUNXW1V5YU9VXW1lWVlJZX1BSXlhbRkZOdHR0SnVLTVtaQVpc1t/S38TOz8fM9vP0zsr3ztjcxdjT19zb2N/S3dPWVFTV19BVUlNX1FBYWlxZSnVHX0RAX1RUXFLR3t3Q3cTBxsXHwszG2sXZ3tddXlNXU1JQUFdeQEZeXkFYVdBXX1DUVVlHWlpGTkpNRkJJQ0NCQ0FBRFNUVNbYwsDEw8j3yczPy87Y39rDxdPd2djd19Lf3dfR3sfa0t3d0dVRUlxcXkNJQltGQ1peV19bV9LTVlDQ2t/Sxs7Pw8HCxtrc1VFU1VZQVtVUXkRbX1xZXVbWVFxSVlZYQEdbR0l0SE1OdEtARkBCQVlRUFfS28bAzcvK9MvJzsnJxtrEzcHd09nY09TU0tjd0d/b29RXVFVTW1hdUkRBRURaREFaXFNeX1DV0VXU0NjF2cXCz8PZ2dva0FTX0ddSUlFUUVtYWV1dWVBV0dVTVNRVU19ZRUFJS0hOTU5PQEVET01FXFhe1djCwsDJ9PXMzczDxNzbxsba2NvY2NzQ0d/Y0NbfxcXT1dTWVlhFWFxaQEZZXVlYUlRXWFtSUFBeXVXQ09Lex8Ha39nb29/S09DXU1xS1dVSXVfUV1JV3d3UVtTVVFJeXkVASEtMTElKTkBFWkBEW19eW13QxdrYwPX0z8zIy8LbxcHB2t/axNre39vZ39ZV1tPd1FdU1VdYR1peRUJHXFddXNfRVF9fUlNSWFxV3dLW3sfD2tze2dnT1NbQ111fU1RRX1JX1tdX1Nzb0FfW0NRZRVlYQU5NRkVHQkFHQENDRkVeW0Re1dzR0d7Az8bHzcjPxMfDzMbbxs3CxMTAxtvT0dDd3NHW3NzWXVpEW0VAQ1tQU1xQ1FRZRFlfRE9HUlRRUtbZ2N3S2djY3t3d3dzRVdTQ09HX1tLWVlTT0lVTV9PVWEFYWVpBR1hZW0ZHR0ZBQVpZXl5eU1fV19TcxMLDw8/1ysDGwsvM2tvBxt7exNvdVVXW11VRV9DXUVxcX15eWFxRV9VdU1TVUV1QVlZYW11QXFtR09zQVdHd0FdX0dPR1dfT0t3W1dfU0dfX0dDWVtTR1lNaXFJQWV5WV1JEREdBQ0NGREdGRkVFW15c1dzbxcfDw8DFx8v0yMLOyMjC28HDxdzS2dPW1VfWVVBdXFxcX1heUVZcWVxfXV9aXVdQWURZXVxeUdzb3NDe2NLX1NLY39HQ2dzQVFbU1NVWV1dSU1ldVlFTWF9TUFxcVNZRRURZXltHWl9eRUJFWVlZUtbfxdvawcbE3tnHz8zFxcDG2NLZxdvf1NDd1lVX1NVUU1HVVFRW1dbRVVJR1FVTXl1SXEBNRkRFRljV11RTUdHX1dfdx8Xd3d7f01RU0dLT09HQ0VVcXVBTUVNQVFRRUFfUVV9EXl5ET0NHQEl1SUNEWl9V3NrZ2cfBwMTAzsvLzcLNzcDe28HH2dPf2dBRUtXVU19SUF1dW19SUFddVNVXU15eWkRBQkdeU1NT1N3QV1fS3NPT2MTExd3f39DVV9HR19RV1VBZR0VfWV5dUVTQ11bX0NPVV1dVUUVBRkBNTk5GWEVaUdbW19ff2dvb2cfGx8XFx8fF2dvBxsHb2dre0FTV0dRUV9fQ0FdX09PWVdTUVl5ER01DTElBWltYXlNWV1FQVdLe39jDw9re2drE3dDZ393d0dfUUVlZXFxcWFJWUVFSVNbX0FRWVlxHTk9JSUhPQUVbR1xUVdHU2cXGwMXNz8zBx8PAw8DBxNjb0tPT1lVSUdVUVlBWVFRWUtXQ0dTX01VdRVpFRkZAW1xTUlJVVNXV19ze39LZxNvY0NHQ1tfU1tPQVFFXVl1ZX1xcUlNR1NTW1NPe2dnW0tZQWUdaREFCT0BBQU1HXl5YWVXf3t7c29vb2N3EwcbHx8LGxtne2dPRVdbW1dZXVd3W0NzQ3djW19JWU0ZDQU1NSE5CQUZDWVNSUFTQ2drZ2sDE2t7Z29je0dzZ09ZU19ZXU1xTUlFdXVdU1FZX1lVVUVVcXFxHRE1BQ0lGRkNAR19dUlHT3tzbxcTDx8XHw83MxtvF39nR0FXVVV5cVlNUUlHX1lXV39Pd0tbS1VZSXF1eRENGREVYWFBQUlZW1NPe39LZ2dvS1t7T0dTW3NfVUdXVV1ZcVFVVV1Tf09/S3dnT0dTVVFBTWFteWkFMTEtJSE5ER0RZX1TQ3dPf29jY2MHDwcDNzsDGxd/Y3N3RVtFV19XR3NLf0NPf09BX1FZfW0dEQE5ISEJJQkFYUlJUV9He2Nvcx8bGx9vBx9zQ0N7f0NTV0lFSXVHVXFZW1dBV1tXWVdVVXVFfX15YXVheQEdEQUdGXVdXVlHW3d3T3sbF2t/ZxtjH2trE397X0dRQUVPVV1fR19zf2dLS2d7T1NfRVFVdUlxEQU9GQkJbRVBSVlRU09DQ09Dc39LR0tzQ0VXd0NTUV9TRVFRX3FDQxNLBV97d0djVV19QXFxZRllZREJIQkJOTUddW19fVdTW0NfG2sDF3sTAzMDHzMHE2NzZ0NdR1dDR3NPf3N7c0tvd1FJcRFFTWVtBQEl1SEhARkVdVlbV0d3f39PewMXExdjF2tnT3sXZ0FTU1VdWUtfXVVRX1tZXVlfUVlxaRV5HW1pYXFtHTUFEXF5Z1tDW1dTe3NPQ2cXe393bxNre2djc09dU11ZQUFPW19PW09/d3tPe2dPWVlZXUVNQVlxYR0NFRERbXVRXVFZX11VVUVXX1ddU0dPT09fc3tDU1NDXVFXT2NzS0tjG2NPQ3NBWUF9SXFxYW1lAQ0tIQU9MQVlQXFlZUNVXV9TZ2d3Z2MDAwcDCzcXY3tre19LQ3dje39Lf2d7T1tzWU1lFXlpHREVFQE1MRkZGXl1RVlFXV9bQ0tHd29/Y3NvBxMfFwMDE2dbT1VFXVtbXVlBW1VZSUlFWXF5YXlJcWVtYWFpEW11SUFBW11RWUVfQ1tbS2dvd3NzY2t/f3tjf0NdV11ZXV1TQ19bR0NLQ09Hf2dDWVNHWVlBQ1VNdX19TWFlYW19aWV5dUl5dXlBRUdTV0t7c3NjBx9jd3N7Q1tPaxNjb2NnS19DU09FUV1NRW0RGQkFOTE5NRkNDQFpYX1xdVVFU1dHf3tnYx8HBzcHMzsHCx8HB2N/c39LQ1lTQVVdXUldTXVhbW0FGQ0VaRVtbXVlaWlpdWFxQV9HR0tLc297Y3sTAxcbFwcfa3tPSVFZQU9VRUlNQUVNQUlRRUlFZUl1YWUVfX15YXFZfX11QV1BUVdTUVNHU0d3R0dDQ19bW1tPU19fR0tDS0Nzf3dDX0NPQ3dzY2N7d0tNUVFBQUV1SXl5aR0FMQEJMQkJbXl5eXVRUVFfX3N3e2cXAxsbGwMHHxsfGxNrY3djc0NDQ0FVXX11SRUFCTU5JTnVLdUtITUVEWVlcV1fV193Y2draxszCwMHMw8DB2sfExNvT09dVVlFVVFZT1dVRU15SUlhHQVhYW0RGRURHRkVfXlxR0dLS3NLa2tvb2cTH29nZxcXY3N/d0dZWUFNSUFNWVFZWV9VWUlNQVlBTWVhQUllaXlxYWFpZWV1UV9TQ1tfX09fT19fc0NPW0NHe1dTQ09PX1tDd0NDQ2N/e2sDExMPY2d/cUV5TXV5ERFpGQkxPQkxAR1tSUFFT1VXX1Nff097e2MPBx8XFx8ba2MXG29nf3dbc2cPJxVDdX1lUTkBNTEFOd05MW0h1TEFBUl9e1lLTVNjcU8bAxtrG39zd0sLQ0NrC3NzQ39/XVlbYVtDdU9XeV1lVUFtHQ1/URUBdWEJYQFXeUVbBwcXB2s3M3N7H2s3bwc3M2cbb0sXUUcTSUVRYVl5cX9/WUsPUV1FT0VpfXl9KVlpwXHFbdEbWUFVcUV7c1lbdW9XYVFRR2VfVUVRVVVXY0dba31faxVPYx8vZxPXK38X03lXV0tfVXF1JQUN0RHJCW153QVZDR1LUd9PARdHD28AKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExbXVsYXdfMWNoXzhraHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFtdWxhd18xY2hfOGtoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMGI5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExbXVsYXdfMWNoXzhraHouaW5mbwpAQCAtMCwwICsxLDEwIEBACis4MTkyIDEgMAorODE5MiAxIDEwMjQwMDAKKzgxOTIgMSAyMDQ4MDAwCis4MTkyIDEgMzA3MjAwMAorODE5MiAxIDQwOTYwMDAKKzgxOTIgMSA1MTIwMDAwCis4MTkyIDEgNjE0NDAwMAorODE5MiAxIDcxNjgwMDAKKzgxOTIgMSA4MTkyMDAwCis1NDYyIDEgOTIxNjAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMW11bGF3XzFjaF84a2h6LnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFtdWxhd18xY2hfOGtoei5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM4ZjFjYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFtdWxhd18xY2hfOGtoei5yYXcKQEAgLTAsMCArMSBAQAorP0NLXuXm6v1cWGBaVGry/l1YW1BTXFtrb+Pc5dna2tzqXVRaYHB81c/l6OT4e+fPxMTH0f5eTUZT69DFwcDJ42lVS0tm2s3IyMjN5GxeXlxRTWh2XevZ19V0WE9CRVZ9zMXM0O5IQDw9SljPwMPKy+FbS0VRWk1ZaWnsbWrp5fve3unjavX3T01RS1dw6c/N0cnPfWVNVWRSXuDb3fRr7Gtb4MrCvsrcXD85Oj9Zz8C5vMvlWUZBRV/PzMrEzOphTVFPRlbhzcfLycDOaFdOT1tg2tHb0NpvV0tJW2zvzsjHzeDjd01SfeJ8XlZdVkhMV/PZ49jM6l9gY1xUTVhaT1VLSlNVXv1gV3Du7mRX7t9dXV9XWWjgzsvNztrqVUFJ6s7HwL/F02hNRkruzMC8vsDDz2tPTE9SXNnLzMC8v8bqVU5KSkpP5tLqdF9MSk5e59/Y1/diV0hDTWLdzdHc52xTRkRh1s3Lz+9jSkFFRkxo38zNd2NdVFJSTFdt6uRsZun4XVZJUPTYzsfL1nBRUUhDVtbFvcXP2mZMQj9M7sy8u76/wtP+VlVgZunY1t/d5tjX7mnl4XNRTnDy7t7efe5yefx0/t3d3f9YZGd42c/fb1dcVEdLfszEy+T7XUg/QkdQWeHO3XFjYFhPR0lMT1BOSktKUl9MSlLy2+f+2Nn0X1FLS0tky8G8urq8yWBTXu7FvLi1uL7F/E9SW9rM29bS8Ofp4tdyW25XSktOauZiVVxZaXpfbGpVWFRJUmffyM/X0XFTUkhNVF7NwcjL2G1aPzk/TOrJys7fV0pDP0hh99XVcV5VTVFPR0tIU+vt48vMy9xPTVFh0szNxtHqfVRRXfnMwsC+xsrJz+lsdebY2eDj19PV6vTf3t7hZk9LSlVm6tTQysHL5Wxo7XtfWFNe8mpl7t3dek9GP0Vf7dDN4V5MQTw4PlX46e5fWF5RTEdNWmV13tPSz9VzWFBNYt/MyczRzuD+81t11tje5NnI0fNvT0dMVt/FxcPJ1m5MSWfczsrP82VnbH3kyL2+y9toW1RMUnrlzsa/vMfS1XVOSUdd39XP5lxVR0BAPUZZ+PB5bPtSQj8+Pj9JYt/h7W5xTERCU+fZ0c7cY1pQVFRq0svb3eHSy9LMzNf7Zmfl/t7JxcjcZGBmXff44+Do7+5xfvHvbltbYG5tb35sYnTpz87f3N9mU0pdzcW+u77Dy9fO0dfMy8rM0MnCyM7pUEA9RmjdzsTC1ks7Njk8P0tVT0xDPTo2OkNJV3r99mRSST48QU1w4tnR0tldTE1WZu/i3PpZWlxt4+PZy87W5e7peVhSSk191M3OzsvNdVxcctjIvrzD4GJVUFP8zb29xMfMzMfK2eH+1szJwLy+w87g2OLo5udyalZw4e7uaFdTTkdGRE5eW1VPQz5ASFdsfmJOQT88PUddYVNKTG3n3N/9endUY/rs393ebFBe5Pfo2NfT0NXZaGH21crN2tvP4F5Ybvp6587JyMbNZUlFRmbNv7q5ur7S3ONj88zFwMbIxNl0cnPf2HV05d7o5uDtS0BGTFJXZ1dPR0JAQ0VSZGRZTFJbSkBMTlVVXHRcUWVxYlpJTF/g6ebj3GRSWW7Uxb7I32t3ce3s4dzf4Orcz87h3PBTRUhd693LxMXI3l9SVlRcaObl3MzIzM3M1/Dbx8PAvbzC021cbd7Z6eng6HPq5nZdZ1lNTExPT1JRSUNHTFBVTk5bU0I4Nz9FT3TY0NTuZVtdbOfXzdbw2t91aGVj+NrNy9/z6V1MREFObG3pzs3VZk9TRkFSaX3i7NrHycvOevrl5sS9vLa4wc7h3MrNy8HMz9P549/77NXd7llOZmtdcF5ZY1NWY1VPUEM/Pj5SYlluXk5PTlpuVUpNSlBcXdnO4HZjXmr42M/U2+RpYVhLXevYz9Xl9GRb9/licO58+3vl2NZ1T0tXV1/Y09DLyMXJ62JWVV173M3MzdPc1+PfzdLm0M3Q29/4e/rv1c/KztzyaE9NVmztfvfpaVxwV1FfeXrd8WlkW2NQSEhGRmrWzc/k8XRNSVhX9tHd4N5XR0pMSk1NUVRc8X5TRD9AS1/Tyd3/+1dfWURKdH7i1eTo4tDDv8fO4ujVzcfHz8/JzsbEy8jH3d/W9l9v58/N2tbc0NX37eFe+d3p2GlJT1RIUFJLSlxs6PBeXF1hVVJSUD9JWVdaXFLn6kxfV0pVamzQ2HNXT1BNWd/S0cXTdExAQVVr3crS5ufc3dDsWVjzfH7WztXl9mRrXFZh1dXY3mddbvDVyM3NysfT3N1qWuff4dHW0sfI2WxPT1vexb29y2RUUk1fdmbez+nq7FFKTVFcYFlVUltgWmBTSFRdUmtqYNr4UFVIP01jfPRoYF9j7nhs32pbeGRZaFVRYl5g+F9U6t3Xz95iaXDe0NDO+Gbp/OfGycK9yNPdbeTLzMfQ92Jr6NHLxMfU1P9NSE1OZ+nZz8zZ593t5H1bVWTqzczYYlBYVlj67HjX33RcTUpWXV1UT1hbX1FIRT84Oj0/SE1PU1FHRUVHTHHQy83dXU9PUPrX29/KyM7Q1dPKyMW+w8vPysnO1tPNx8DDvr3Fx8jd8Obm1s3Mzc7iYFRYVk9PU11u7NvUcUtLVFp27O3Yz9n2c1lVbdvgYVVNS01OTlZNTVNOS05NUlVIREZLREBJTklIRj4+RElQU0tV8NDIydjo5+XUzM3Ty8HCyMnJx8C+vr/Bx8TAw8rP0M3LycbCx8/R5V9TUk1NVFdlZlJJSVBRUV1m7tvOzd5SRElNUFlke9/a3+drUFVfZWFm9XNmY15YUlFb7N/o6WlVTENCRUE9QEhJRkE+Ozs+QElLTFZt/3NmXF/308bBxMW/uru6uLi2trW1tLe5ubvAx8vLyMfJzt1bS0tWXeze7/j7cGRSR0hMUFVbXvvh2NjjdFNVeuz+7XdnfPLs2+1iXlVRT09MTEpKSUdGRk5tbWZnUktKSEpSSERGQkJBPj9BREtSVVZgcuHu7Oxs997Vz8zV08nLzszMxMK/u7i5vL3CwMC/vb67ury+zOn85+bh2dzV19HP7lpTVm7f1dfP09/ffHhfVV1tX1pcUk5NTEtFQUNES0xIRD46OT5CR0pMTkpEQT49QVBfcndnavfv/mpiZXvUzM3Y5OTe5uDU09bU1dvd6vXu2dzY0tLS0crJzdje3dnSysfHxsG/vsLQz8nFys3Nzc3IwcPL1dPLyszL09Xb3uB9U0VAPj5ARUM/Pj9APjk6PkFCPz47Oz1DUl5XYHJ7+m1VTkxTa/rtcG72eHVrV1Zf7s/L2OTb0s7MycvP0M7EwMfQ5u73c/T76tfNy9B7WmVo3crIxcrPztrzZWTp2dXNyc3R1dLQ2dfWzsTDwMbQ1Nzc4mxaTUtOT1FVS0hSTlZVTFBLREE9PDg2OTw/RUNGSUVFRkNGSVn77OBjWmZXaO1mbPLkzcvT1trV2NnS63Tc0MnGztTU1tDKyMvQzM/Oy9ba0tfOw8TEwsC+xdVmTm7h1sXM3d31euR79tLMx8bHydvc52lqV0xSV1ZfW0k/PUJLWlRHSEI8Pjw8QEVPT01JQURKR0lKQUVQUmRiU1NMTExOUlR41czIzel66t7RzMzQ3tbV2NLr5tXOwb7H0dfb3NvZ3NbJxsfBzt7Qzs7T2tzd19zh2d7n083Ny9PYzszFwMfXbXd+afZyVldUT1paUFFZZFhJPzo8PDs/PDc4Oj1DR0lJSkxGR0pGV+Pi3ep39vd0+PxeXHbe0c7ZbF1bVm7n3N7f2up4a2T808rEx9LPy8vGytDLysbFwcDIysrO19/l4dLOys3Z4GBo9trQ29DOz8rT92hx6Oz1bF1KSEVETkpKT1NlW0tJR0hJSUhJSk1PUFxQTFVbb2xeVkxYXFRXWVVOS05dWVVZXXz3XlFMXezm1dn5aXDs0cvQ2tvS1ODd2c7GycrM0tDSzMC8vsnHyMvMztPOvr68u73AzMrJy83d2trg5VlIRlJRUlpLRTw8PUBJPz9HTFdKT09bZk9MQUJGTFtp5ltVV0lSTVBYbN3o7GFQR0he+djvavxYZlhOUlZ0ddzfYFdTaG7k39zNz8nJzMfNxsfHxcvKzMrGwMTIxcvIys/K08/Ozs3icmzbx8PEydB9UVBSbWRie21dQjo3PEtSYGBWVk5MSUxQTlJWY1pMS01yZVteUVZPT1JjcF/x49rlX1dP+N3a32hpUUxJTWRcZ27v42hWTvrb3NPm3nxdffLOz9bPz83e4evRx8fDy8nJ19ndysXHxsjEzNrp2cXAvsfM1Hr5eO3p+fJw8GpORUBFSE1JTFtRT0xYYldSTFZaTEVBRk5aT0tOR0dKUmd34fttalRRTmzWzc93Y1VJSVF+8fVmYvhbVE5a39vU2+Dd6+ji0c3Kx8vJzMzQ2MnHwsLIyM3LzMXCysrOztbkbmLVz9HP6vhiaWlw2eLl5XVZU0xASVVf4XRaUU5PVe/9ZWRUS0hIQUtjWl9WRkA/QUJUYV1qW1RVWE9b3tnU2HRdXWBTXWJVb+zu8f1VTVle28fKzdThdOjX5drT19PR3XPUysa/xs/OysvGv8bFxM7X29jjz8nRzN1YUFBPWd3Z2tPzZV9WSElZV+/iYWBYTEZQWlX+9WtubldMUk5YZU5MS0lGRkpHT2FcWlZOR1pw9tlzY1hPS0pgW19iU1FOTkdQbeLIytPZ19LSw8LFxM3S3t/978/LxcjFv7++xL+/xsPHyM7U5nHf2M7Q6GhUU01Ucnnm9X1fUElBTV/i1dvjZ19TVGNiX2BdXVdXTlBicv1hX1ZUTERHSEhITE5VVkxNZfXl9WRUSEZGT11WVWZqX1tbW+HMx8HH0eHgffjWzs/P0+DzYE9h3drOxL/FxcnLxcnLx8DCx8bU2s7Q0uhfSUpOTGDydGbt3OfmXFjp8PD+6GBSW1Fjffzr4tlfV1BIU1Rle/lgSUxDQ0hJTU1kYVtSRk1c/uLg5lpfWFpoVk9MV11PTUZOW2Dp49Pl4dndzs7OzM3L1+JuZOzoz8/LzM7KzsbDw8bDv8HK1OXc4NfebVdES0pRWmzv59nT2f1s8tPKzNfP72VPT1plb1t1Z09EQkFHVGlhdFhNTExOUGhWZfT6Wk9LTWD4XGJoVVlZblxxW2DucFdNU1ds1tvm5WVfX+/xzMTOzd37X1504MfEzMvbcWPd0c7FzMPDzNzj19PGwc3Te1RMUV1X393b3nhcVv7s18fO2OtSSEhdb+Ha3d9uVExbXmzj5/9eS0dJV1pj8fZ7Vkc+P0FNePRsV0pFSFzw4t3f7FxKQEpb9tLV1OpSRENW5M3DxMTS8mBx8ObIv7/I1/po59LIvr67u8LS59/by8jM12lNRUpYZ+Ha3uRbUFBf+trIyNV3U0xLWevZ2l9PRkNBQ05k1s7pWUg/PUJVZ+n692xPRj5IWenP3W5WUlVS69DFxtDa5+plbubZztltVk5MSF/a1dbd3+zy9+jXzsfG1mpYYmJs2NDKzdXS0tnr3cnIy+1UT05RVtzKy9Tn5O987ubQ08/UY1RPV1zq1tzsXF5fW1xZ59fd7k5KRURGTWFlYFxZUkpITlxeVWJTS0dLXHnq5ehxYGBu+PPn6fLuXlFNT1zrz9Lgdmt0bnPZyMTGx83hY1/k1MnKycrU29jVz8nFyNDd+V9OU1fp093h7Nza3djPzNbm3+ZhTVZZZ2pNT05QUVBhZPXjb2BVTUZNUVTvZFNNS1FMV2bq12ZaY1hLS19y19r6+WFt7s/K0svW6mhPS0tZWXvhY1hSXm7+2dTFyuDvbWJg8N7WzdTf+Pjl1MzOy8vW3/HwfOje1cnN4WJu4tbQzcfH0utrbFth7tzS4mhPSUxY69bKy9dnR0FBRlRXYl1OQj1ET2D08fFmT0tOWlNfcPLwXk9HTWju19nh3OZpW2Ng9uludl9WS0/628rFxcfR6/jb1NDGxcPK3mpe7drIwsjL0OFsYGVk6eDg62JQSlX30MnNz9t+X138/d/d8flVSkhNZufR1d34XllSW2Rrc1pWTUVBQ05k431lZWBrbeng6OTu6WdPTlBn7NLLzNDh/2ZkbfbkeGVUSERDTf3OyszV7GdbXfXf297X4VtOTmTy1cvLy9LXzc/NysjKztTe5Ojh1MvO5H7+ZWf33c3N2u71WkxNUWvf19nZ6FlXX1VcYmFTTUQ7PD9DVP5iWF1UT1ZTb97rfXlpT01ZX/TX3/fwW09t7uDSy9T2aU9QWVb60dDe4N3czczMxcPN29n5XXF28NPP29nU4drP0s3M0N/0ZldhXVnu2PpcWVRafujUyc3td2JNSEtV8Njk3Njpb/X1bvv8WlNIPz9BQkNWXFJZXWzk2tLLy9fc3uLk9f774OpjZWBaaOXh7OttXFBNTU9PTV73eGdkbuXn7tzOz9/+cF9WUlZ81tfcz8zOzcvFxcrP1tTP09nf4Nnfbl9peu3n29vc7mL74OtxbvDwdGNq5e3w49jedV5PTElFRUNEQ05XS05VXHnp7uzicFtkZF1PUV1mbVpecGVp7uh68HRVXHN86ejp2dPY3dDNysnJxMbL2ebY9lhYXXDrb2bm4OPQzs7P3dvZ197s7W9eVlVUWGFceurv3trvau/4anNz8+x54eb8bvfe4/BiXFdPS0dMUU1VX2VhWl/u8mNt8e3p4d7g/WpdV1ZVZvnw5Ofve/pcVmJiXFpdXlli7eTf5drS0MvN1fHp4l5YV27r7PT+3tvW0NHN0tPY0cvV29bT5Wxtc/jzZ355+fBiYlp75vnq6+h+6eB63urq5u/tX1dPUE9GSUxOTk1QTE5UVmVnb/fu7m7n6W9zXlZPUVBWc2j58N7ceWhget/e3djV09XX4tbNzsvMz9fc4vz5fffo6d/9/n5sdWtiaO3g4+j14NxwZV5ZX1xeWVRbYmNw5u3f3+PQzdTY2+Dp9XDq1tTi7n1dTklLTVlbWmBfV1leXFxtcfHwefZye+vf4Phxa29oWVNQZ2BfZV1hXmBnbXFoc2VjbnTx4NXY1dTe4O1y/uHW2eF8feHe5t/SzcvJz9bS1tLMztvo7nJeWFZhcmlq9HVu8vTz7N3e3+hoXnP48+p6anpqWVZPS09WU1BTUk9SUk1MTVVoYlhcfu7w3Nvf629gYWNkbXNxZ19eburr8eLV1trb5NnOycfLzs7Q4HpoZWz67HFeWWJ0fe3n3dfV19/s6u/x7+Xb3ed5Y1VXXVZaXGdkYHbt6uba0NLc7+fc09Tf6X1yWlZUU1phZ19YU1FSVVxkZH7u9HBZWGr45une1u1eWl9iX2NtcllWVlNPTE5ZcHnq39/c2dbf59/h4eb6e+jg6ebm6/lxaebn9N7Sz9XPztDPy8jKytPjeldaX2Vi9vF19mtqbXfu59jW4O3t5dzjbOjeaVthV0tJR0tMS09PVVhaW1pbXlZSXFlSYPLo29Tb/GBbYW1seePj5vVrW1VXYHfo3NrV0tfT0dTOzdLU09/rfXt+amNeWFpt8Orv7e9wZnLu7OTX09XU3ep7aGtodX3x8ej0YFtZXvrf0cnLz9LU2Nzu6uDh6nFdUUtIS0xPUVVWYFtYY1xcYWlsee/d1dzrbmJaUFJfcnL8bWFrV1RWUE5a997Z4+Lh5ebf4d3W1NPvXmVcau7o3dbV3eLu+2lte+Xf3dPSz9XXztTZ4fl1furt6e9+/HZjYmx05N3b5vXxe+bb3/Lo3t9sV1BNSERITE1OVVlUVFFSYWR1furc4nn+8Hrn8HBlX3b2emj57G9nWWRt8NTQ0dHd7tvl9uHd1c/T3+V3aW1ibHTz7m1haWFZZmJu4Ojk3uNsbXX13fR8+OLn++3u9/Xl+Wv8fOva19bV4tvQ1NLX1tbc5mBMTFJPUl9sb15VT1VTWGJjamz6fmJfWVpu9nZoXlplY19iZmt783NfYHdwY/DoevXg19Tc4Njf5efr8urt8+Ph2OJj+m927vDl6ur74vlz+HXi2NTY3/335Xzh7Xzl6u30/2vq5t3a4d3f3ujudv7uXWBYVVNOTU1TTVNNR0hIT1hdZfn27N3p3OHp19Hf/GdbcmhpdnVsb25dW1dcb/je3tjPzdHPztrT1uDud2lzbl106+/+YVpWWnTqfe7vdeXk8fj7+N/fa15ZWnbt8OjYzc3d6PNv8evg2NbW0NXf3N/r5fFiXl1YVk9QWFpaWlNQUlplWlJYX2BoZGRx6uLY4GNaUVNcX2V55uP1a2BgZvTr9Onf5/Dz793d59bP1Nja4/Vzb+fZ3eRwd9zm6/Bna/n66O732dHg5fxfY2t+6+3i1t/u7F1UYVtn6tzP0Ors5evd3Ojk9XF9V01RS0tTS0lLS1FcVVhRTWH07uLf2M3U3NXyZWxcYvL35NxxYF9aYnB86eLc1efr2dvTzNfg1dbX2mdYXFto8vZuanj/bWVqW2JqWV3q3NTP7HJsWFhjbvrb1dvm6OHk3OXu59POz9R3bXR06tzd8eD3W1xcWFtqXllPVV5dWVNQT1NTW2Fjd3Roc3tn9+9iYWvi0dj1Y1dPWVts5efY0uh0+e/Y0dDOz8vJzd7m/XHz9ODgdGx4WVd2en74aF1m4tTV5efoe2VifOro29Lvfe1refprX+fa2tnsfm5na/Dc3fJsZE9MVVNaXFRWXFJOUU9NUFhVXF9sb+3h8+ne297tb2/h4N3Z72JhXFVieuje3Nvo7ung3tbUzsfKz83Y/fJ1ZWlqbXVkU1VaYGtpYl1eeOn13tz45fBwZV5r4t7y3Nrk6enh3dXLytXW3WliX2Vrcvz6X05UVFBYandr/eXtWVZaTU5RVFBSV15dWGNlXWJ4eHDw29Pb2NvrfmpmXmx04+V99Or+bOzZ1c7JytLa5Ozl3dza2d3b7WRdamJceXxiX3Lw9e7u6P5td3ZhX3vteX7l6+zf3N3a2ur0clpbWmb85+bc1OFuWl1bWGR6dnFtX1xNRUlMTVFZWVxaYW1tfu3m5d3h39zm3vVsa19YXPft4d/c43F36uLq1M3O0tvQ3Pv14eLo2Nzd9fZtXmhu//zf4vxqY25cWF1oYWLw4utvfvlyeuXa3t/TzNTa2ultXWZxe+TU3Pb/X1RSX2dh/ub2WlleUElJVFNOXH5rVVRUWFpdXl1v9/X8e3loX2X+c2Xo1d3n4+To7uPe3tvNyc3R0tDd5djW2M3N2Nns+/548/99+OP2ZltPT01SaGVs3tTa5nnx5P7x5uPg2NfW5GFfWVZbWV/w6P5wav7+anNtXnvl7u5tWFRNR01OV2dmZV5XVFpob15j3Nnc2ulwfmBifmh46+nt+O7g39vc6uHX08zO2t/b5t/b4dbP1ubt6fxodWpWWnrm43ReWU9KU1hb8dnZ4/D1/Ovd6XrhzszT1tfjb2b6bGb+7eV+cOXm9XBZU1VnenVnYlpTTUlHSlJZXVRRYVtYXFhVXd/Y2+rtalpVWl1c+dnY9evR19rl5/Hr2ePY1tXU09Xd6e3Pyc3U1srN0eFzZ2Pn8f1rW1hORUZITWfh2dna1dvg7/x54c/V3t7b7W5VU1JQbn5mZP/b4OxyYlVZaGRoYFldYU9EQkZRVlNedHlpaWVhY/DY1dDT3u9vWVBUaN3a3t3b1drdc2V369fb187NztPeemlo4Nfa09bNzdDgdWtn/Wlr+2xbVUxHS09u+evT2Nnr8m5paujP2tjT1NnobVleWGT7ce3v39/sa11YVmRdYGtWVlVOS0xMWWRZYGVbUlBPV1lo3eDUz+RnWFROTk/32eXb19PX2+x0dH7b187Iy8vN1+v4fNvPzcjKzs/P2f5z7Nvn6fBiV05JSExMXXh65uji3tzd5ePd0NHY5XvtZVNMSEpVX2bw7dzd5PxdY2R89vH+YF1OSkVBSVpfZG1bW1lcWlvv3M/T1Nfe7XBdUFFSZ3Pp4fXd1dp3aP/v3NfMyMnIy9puX19+4tjP09LS3Od88NnT3+nnZV1YTUpMUmB3bnZnb+nq8O/a0Nbg497t3dx2X1tcY3J+4Nva2elwWl1ub3l3dWZdTUJCRUpZbG10Y1hWU05TbeXj6O3r9HVkXV5ebfr8cXv9cXjzaV9na3fq1srEw8PJ1uDd3djOycjJzNHm/eTk5+p2cGVaVU9OU1tbZ2tfYWx16uvg0M7W3Ov1fmtsel5bWFVjZnjl3+Xd/F1lXVdeW2hvXVRNSEtOT2V8dfB5anBYWfv0fuj0b21jaWlcaX5r9+v87Pfz3vlld2ps49/Tx8XEx8/W4fPf1tXNzNDYenDqcXfybWl0Z2FdWGFmXmNlW1pgfd7a0szR1Nff6O96eHhdX1tYZ2z+49fb5vH9dFhXZnXu93NbS0dJSkhQW1taXV9cWFtibWtobWJdZGxre+Rzbv5raGt7+PjxeGtdX3zezci/wsnKzuXd1c/HxcXFy9nl7nlpZ+/s9ux0Y2VfVm1wXWFYVGVv+9/d4+nq3+fp3/1scl5PWFdcfnbt2eppZlhUWVt69upwUU5NR0hUU1xnZW//dHH5dXLr73767/X56u76enFhbW5ndvL7cnRfWmby59HJycbNz9zn3NTKzMjHztvw8l9tamZnZ+x6fW/57m54cmZRT1paa+jf3eHm8+zi3tTX3eJ4ZV5ve3Dm4ephVFBPUVJmcOzd4GdRWVNPUVphU1deWlhUWWhlY2lbU15dUV74eWxpc2tt/efi5u1xblxi+HnTwcLGy8zPzM7OxsTEx8nP3+DvcHBrX2H8fXp9eOXd8nNtXlhgXVVs7XxeX15ce+fo8/XrZl1ZY/xr4tnnbltbT1ZZV2zn4mFWVlFPTVFZYGdiZ2Lw7vjj7ed0Zm1na1tfc3piVlxiZvXt5ebp9mBkbvDe0sfJzMzS2uXZ19LOzM7f3uXo9nz2eezn8G1h7+3/6+7tdV9VUVlgae/p7Pb27N3Y29fc331hWFbu4O3n5tx7YVZWcmZz9OxmVFJNT09MUFhcV1dWWWdkYGBq/3JkVFVnXVVZXlZNWFtrdO3Y5u9lZ2TuzszKyMTEycrMycjDxc3N0Nvu6ufs8ODd497h7+Da4+b/9fNXTU1WWlNVVVZYX2j64eLa5mhtYFJVcen6cvh3X1xZW3D3/fZfXFhJTFdaVldiXVpZZW7y3urk7evyYV9eYmVic11YWFhodefj8HRiXlFY/eHRz8vHx8fJxcfGxsvO4u9pY2tba/P8+O3f9uzb1dXb3Ofybl9fWVhbVVZRV1hq6drP0dnn6v1eX2hr/XZzeXtpXWD08GxsY1lTUVVYVltUT1daWFdi7vBmdH1fZGNeW1dXVlNVVVRVYPre3/PtamJlY3nh1NTRy8bFxcPCv8LJx9Lp3Nzo/fHveu7f2drb0M7O2uHwYm9mVVBVUElLSE1XXPHf2eDs5mVeXFhcXmlgcPD16fZy7eb9Y2hVUFtQVVZRS0xXVF1t7t7Z3PHm7njj+Xh7W1BPUU1QXXjj49/7bF9QWWRj8d3f2M/OzcbDw8TDyMzR4t7h8ur9XFv1+nze08/Pys/Y2fL99WdgXU1FS0dDUGXi2NHR3dTsePD47OjvW275XGJ+7fPq6mZsXFBVVlVUTUdKU0lJX3d75tz+/vZxZmtvXlhMSEtISFJqcnngdmhlXV5z5NjNzs3Ix8fHwb/Avr/Iy8zR2NPa5+1q7+5859bMzMfL1NrldlpdX01JQ0BAQUdRcfbo2enp/Wlubvp3cF1XW1JXXnLu8dnpYmdYVVtcUk5QSUxKSlZh++nV2uHb4vH8dWJXX01GTEtRYHpt6N1w83le9N7e28/V3c3LysbBwcG+yM7M3Ofd5nnn71xgZV730cvKxsnQ0+dodWVQUVFEQEhKTmRvcOTd4uTm/d3W7ubfcFpfYWTw4ufj7F5WWE9PVU1JTktCREdJWHt75N3l+nt0Z2ZcVVhPQ0JKSk9fbPji6Pzk6uHRz9LSy8/Px8a/vLu9vsLLzM7Rzs7a4t73X2Vq+NLO0M3O3+p9ZnhxXk9JR0FAQkVOVVdgfWxl6u/f1eJzfftgW2Fz5t7g8HZYTVBPT2BiUE9PSEZNUGrk3d3e5mlndHDq3/5WUU9JSUpNWmVs8+j+79/e083P29jP0c/LxsG+v8rM0N7b19fR1uxzemdXZuHTz87P1Nzpefjk3dtuU1FNRkZKTVltffLq6fPd0dHb3eT86ndp+/To5GVZU1RNTE1PUk5LR0ZGQkxhbO3+cWtmXlth/ed8XVNNTEJHSEtcaWdx5Or+3tPSzs/LyMfIxcC+u7vCxcfL0dPQ2NrZ3+bo+/fY0s/K1N7i8Wlga/l7ZlFKQ0E/P0RKZ/Rh6+Lre+Ta5tzo7XdhXlhf/urpYV1lXlJQU1JUVE1JSU1QVnTn3vHw+mpsbejb3uZrU0xJRUhOX/Tqenru6ODh1M/Ry8/a3NfOz8XAwsfLzNbd6t7b6d/zZvPo3djKx8vN2+92cf546vlmVEZGQ0NLXOri2uxw3uDs39DR3+ZlWlpWdO3e5H5pUlZMRkxVUUVGQT1GR0xn7fLy8lVSX2Xq2dt6WE9EQ0VJXuz3be5dWt3b18rFxsnO3N7QysC7vL2/y9zVz9zPydH1aWRm3dDMwsLGy+pbWmZmfN/+UUU/PT5ETHDjc2lWTVzj2dTQ0d9fTUtNUnnj1ud8akpKTVNZZW9PRD49RlDy1dDP099YUGDn0tLW9FhMQ0RHVPfn52NZTktn3snGycbP5mVt3Mq/vr/GzdxfcN3PytDZdFVSXerRv76/w8zdX1Z94tba6F9MRUJJTn7W2ORgXFpd69nLy9nwWU5MTFrv29TdYldRSExXYm5PQjs5PUJJYNnR2G5ZXlNS79nX5XNTR0dISl3g5/xXSVJfa+XPxcbL2OXXzszGu72+wM/U1NTTyMPN3WhSXd/V1MC9vsXe8+nk8d/W8mNURD5BSktg8GFeTElTYHzw1NfpZk1KUWtj7eB59F1NTVVidvJmT0k/PkRUZP7T1NXuUVd0eOfU1/V0VUlIT2b13HBgV0ZLWnnjz83Y2P5l/dnNy8HDyszZ49/Y0cfE5WdcVV1x0Mm/v8rL1d7f1NLSzelgU05LR1v/3tdjXFpWVmDc18zWdWJYV1D53/fib1pTUU9TdGh3VkQ/Oz4+R1pf8f5gW1xea9vg5Nz/UkRLT05x7uXwWU1LVF7k2tHJ0N1139LPw8LAv8DP3M/RycbGxM/rWV33587GwcbN3+rZ3c7M2tnnWUQ/RkhTZnFhUko/REpV4N/X4GBRTVhX+Njm6HZfS0lQVuPuYl9QRz1ARlHm4ebo+WVi7fDOyt/Y8l1JSlRa3+H+9W9RQ01Z783SzNLkeHbc2MrDxMfO1nR63dnGyMjN6WZVYfXUxMLHztDW3M7Kw8LJ2l1VSUZTZentYlJNSERNXenW2d9qX1tUaube2ORXUVFGS1tr8mxdS0NAPkROV1pZT09RTl3/8N3b4WJZVkxPY3B3emBPTEpPauvOy83P0M/UzcbDw8LI087W4tTPycfEy97iefbZzMzKydHO1NPGxMPGzt1eV01HTFdTTk1EP0BBS1ho6+3wbF5eXXne3nttZ1FTV1d65d7nalJERkhJWmRcW2FWVXHy3NHQ2O12XVxcUmZsX1lTSUVNU2Dd1NPa2Nfbz83KxcrU2N/56ufu1s/O1N3n9N7g2s/S1NDW2M/Kx8XBxc7V52teV1FaWVNNSkhKTldhfu/u6nllann/7uP8en1pY15fXmhuXVBJQ0JFRklSUlFYVFVgePr45+l1YldTVFBUW1hVUlFPVVxy6tfP0dHVzMrIxcbEyMjIz9XV0tXV097l3tza19LRzc7Oz8/NzMfDyMvP3OJuXllVT0xLQ0NCQEVHTU5PWV1cYnB27/Zxffr8+XprdGdbU1hTTU5OTk5NUV1gXF5mavjr6fHs6GtqXlhaXVpSWldOVFNXb3vl29Te49bRy8nKzMnK0M7R1tDc6P79emvo7OTV2tfOyMzOycrFxMXJysrb6HJeaGBQUFdQTE5OU1taaW1+bVxqb/rq6+Hf3vVsbWZsYVRLSUpFSEdJUE9PT1hUT1VgYm5lY3lwXlpeWmNeU1lTU05LVV1v6d3a0dDOy8bDv8DCwcfNz9TW1tbocHl67Ovi19LP0s7U1dLTy8fEys/M2+96ZFtRT0dEQUBGR0pRWmJYWVxcamRr9+x+69nu8XVp7vVwXFFRSkpMTlJXZGNjWGH+cunr3+VtaVxXYF9rY11XUlJPVVNq6ufo9X3849LMx8rHw8bKz8/b3OH+dnJdXF1u6dvQzcrLzc/OzsrJyMXIz9Xa2NnZ22tZU0tHR01RVF1sb3RscOrb19/t8G5gXlpUVFhWUVNVTklISkhJSEtISklITFZfWG/f6mttYFtVWFVTTE5STVBa6eTY0tPX1dLLxMDDwcDIyc7Ky87X2+L++X7w+une2NXV2dDPz83HyM3Jy83P19zfbVdWUElKS0lKUFhYY2BiZGRrZmr0+PJwbGhdX15dXF1QTFFPTlVXVlpcWlpVVVlbZWr/6Onr5+/obFpUVFBMT1RZWnvs3dvd3NfQzNDRzdDQ0tLc4eLi/evf7Pzr6ufuaunl3tvZ3tfRzsfBwsjIzM3S0+F6XVdWU1Vca15ofvVlaV9neu1xcvD5/HlxYFlRWVZWTEtKSExNS0hKSEpOTUxTVFZbcHV2c29nXl5YVlNSWF5efuXm3tHP29rY19DLycfExMbFx8nP1trifG1ybX3p3N7b09LX09XZ0M/Oy8rO1tPS1t3q+l9VVFdbWV1WU1VbWFRaX1df83d7+HRlZVpRTE1RUFBPT1ROTlVTVVlXVFxeXWj6dmt0Zl5mYFxcW11fWVxxcnH8/H7g4Ozg2drf0s3MysrMy9DY3Nvi8O5kXmRmZffu5djT2NPPz87NzMvL0NLV0tfY3Obl7nXt3vT2+3FmZ1tcXVdaaHnt3eLt9vpbVVBKREZFQUhMTUxPTVBWUVFZVlVUT1lWVFdmYFhZYVpcaW706+tuefPy59ze3dvPyMrIxMTHycnM09XZ3eTo6eXm73V75+jb1tTPzs3O09fW2Nvh3d/p5+XoeXRz/nZsWmFsWFhaX1pcXlxeZHLu5/57ZGBcVlBMSkpMTlBMTlJUWF5fbXxvZ3ZvXmRjY2tmWFhWVFpv4eXs8Xpx83h4en7r3NDT0NHN0NPW19zo5OX1X2p4+G5mXm/u4tPNyMrMzsvO2trZ4drRz9LV2dnY19Xg6m5x/O5zZWT392lzbWxld3h7bGJWWVhPS0lIRUZHRkdNS05QU1leWVZcXVNOVFVbWVdVVlZpb+rt59/77ebs9Onk1M7N0MzJys3Ky8/S2dDP1ODj4Oj+bVxhafvb1NDPyczOzNHe4+3z7Oz17+fd197d3+9jXmZfW1pVXWdfV1xtYGppeGpfX2BeUlBRUEtJSUpKU1Vo/WZ06+phYWNcVllZXFlUW2xz8+zv9W54+fNpZG7m8t3b3d3d087L19TY2N7d3t7m9XB4a1hoZn3v3dTNy8zMy9Xe1tPV1Nne3NvPzsvT1NTf5uZrX2picvX3V19sZGzpfWNgXl9dWElLTkxLSkRDQUZMVlhVYV1ZW1hLTk5PTVFNSk9cY//n/vF0/3Tl/3fu3dfQ09nQz8/LwsnNy8nMzdHd3dzn+PBiW2Ps29bSzczP3dvZ9fDh3urf2t/c1N/T0e79/mxfX19bWmVgc2pXXG9qfe5zZmJlVV1YTU5VTkxPTUtMT1BmcmxyZFhYWlZaWVVVXldYYWNh++11e29pa/hvefHs8NrX29LP09LMzc/R2+fc3uvq72dfYWFn/HHu2M/S0NHg2tnZ19Lb2tPS0s7V2NDPz9PT4eXq6fToeWNtaWN65nv08OxpaFtSTkpJSUlDQ0ZLS09OVVxcVlxWSkxOTkpOTU5QUlFkYV1l7nlm8+7xeXzz2dva1MrLyMTCwsPEysbO2NzY6fHu7mxvbmrc5+Dd2nFw8e737vPs1OTk29Xo3NfZ3t3m7Nry+vhyYnVrZGBuXXLde+n2YlRbXVVSUUpPVExRVFBPXWZx/m9WXGBXWVhUUlZWVVZbT11tcvxtZmNv9/fx+3je3uPa09XXzcrKytHY1trp8XhmX2JpYmtv7t/b2Nfna2rz5e7g3dbS0s/MzdbWzs/T0M7O0dTZ3ebp4t31dOzq7ero+HBWS0xPSURISkpJS0tRT0xQWlZRVE5OUExLVVJQVVdNUV1eYGlsd/V38e3r79/Z0M/N0cvFzczJyszIycvLzuLj3/N5dmtgfung3+drd3RfWF5VVmr74dvf/NvY4O3p+d7Y08/R3v3a3d/c5mN86+3r6GdgbFdUVUxDSElQVFJPWVxbZGxXUl5cbGZaTVZYXW/9VlRiZPL7a27lcPfscFht7+nZ19nUztbS1Nv239nY2OB2bGRc+vRuXHT83dTd7u3+e31tXlVfbd/V0drS09LT1dnWzs/KyczSzc3O0M7Y8/fu9v36a2liWk1NRkBAR0tMTU5PU1FSVU1KS1BMT05LTlRRWW1bVFZeW3Pk3t3d7evi7+na0dLIxsrJy9TQzdPW1Nzy9HxyfPTz5vF29+no4Nnh5/NfWF1UU11jaezb4d3j597X29TW4N/X19fR1tnQ0uDl93Ft7fb3b1lPTUdHTE1PVl1YXmliX2tiXV1WS0xQT1djX2N1aGpkaF5z7erk5H1u+X726dvg1dPU1dTa4dzf6u77XVdTWVxwamd5bmvq3+nd2d70+15XXmRj7+Hm3NfV2s/Ly8nLzczO0s/Nzc3IyczO09/h4vvw+2RQTEZBQURGSkxNTkxPUldUVVdUTUxISEhKUFllX11dYFxr9+Di3Nvk9e7r5N3YzcvKzMrMzs3N1dng/GdhWldqev7u63Bw/vHu6en0fGZYVFFPVF9kaXd5a23x3dHQ0NDR1NfU0NHSzMnHyszR2dnd3OB9X1NLSEhMTE5PT1FWU1dja2dgY11VUk5NTU9UWl9gYF9ebX3u3eLh5O79euvi3tjTz9DR2NzY2+Tscl5aUE5TWFdgZWZwfHB46efm7+5zZ1xYXGp27u7s4uDd3M/My8rLy8nNzczKyMrJx8TIy83R3N/3YlRMRUJERklKS0hMTU5OU1lbVlBPT0tGS0pLTVBQVVtddebo39ba3NnZ49/d0s3Oz8rHycvLy87X4eJ+ZFpdXlpZWVdYW11r9PLm3vB3aGdbUlZeZWZmbGVodfTa19fY19TU1M7Ny8nLzczLycnMzM3U6H5eUE5MSk1OTUtOUE5VW11hYllUUlBRUE5VWVRWWVtdZvzj29nY1dfc39vY2tfX2dXV083S3drf+GZXT05NTU5RT0tMTk9PYHr26PP7+mJcaWRifurm39/c2NXV0szMzc3Lz83HxMPDycvKzc/Oz9TZ3N94W1JNTExKTExISktLTldYWVhRTU1MSU1RU1hcWVJaWlty6erc19rX2N3Z0dTU1NXUzc3MycrO1dfsaW1nXGFfWVpYVFJUVVhkbWJdW1hZVU9RU1RXYmJia3Pw4t/e2Nfa29TPzszKy8zNzcjJzczIzNLb5ep6XlpYUExNUU9NVGBlbWdgXVNOU1FQU1liZl1dbHB2duPY2drS0NXQ0M/O1t/a3N/e2tfY2dzxYFtWVFFOTlBMS0tJSU1OUVhVU1RTVFZUW19nZmFne3V94tzT0s/Oz9DNy8rKycfFx8rHyMnIyc3a8W9zYlZUWVlQTUtLTExOWVlQVFlUTlFTVVlXVllZVl1rcPzY0dLQ0M/Jy87IyMrMzM7P0M3KyM3X2dv0aG5eW19cW1xPT1ZQT1RZVU5LSkhKS09ZWU1PWU9LS05XW1dlamZ07N7c3tjP0NHPzczJycXH0dXY6v1nae7se3F0amlcXWhqbP91d2Vhc31vaGFgZltdYWj63NTS1NjW0tnVzsrHzM3KzdDO09nffnH6XlNYWVpdVlFQTktMTk5QX2paUE5OUFRPWWdZVmdiWVhfcvr7dfjl/3Ln3dja2eHm3djQy8/Sz9Lec19RT1hea29ZXGtmXF1ucWhmYF5hXGB58G1ueF1UVFJf+OzczszOy8vQzsjFw8TGyMTCx8TGz9LU4er9bHzj5/L7ZFZRTUtNUlNTWlFMTkpHTU1MUFBOTE1MTlFPTlFQUlZcZH7Z3dnb6OLb5+Lj5+nl3+/4aGNsfmxvaW5xd+/k1trf6O1ucG91/u7q49t+YlxhZXJ96N7U0s/Mz87Oys3Oz83NycrIytHc7PlaXGF18erx4Of9ZF9nV1NSVVNUUVVaXVNddl5bVFNZX11ncGtYXF5SV1pjd+rt7d7kduXqZmlkZm1iVVlfWFReWE1OTVFcaWR55HlgfXRn/3N55OHt5Od3bHtrfvX74NbPzsnGycvIzMzN08/LzNHMy9PY2+Pd3uHX09HW1dXd3+lwb19VWVxcWWVoaGleVlNOS05RVlljWFVUT01RT01UVF1ncmv3dW1iY11WXFxia3Zu8/twX2ZbWGZkeunwePJ7bWR7ZWRxb/Lh83f8cGxm7nn26uvWy87R0NDW2dXf3dvYzsrT3NvZ3+Lc6Ofm6N/X6vni4XFscWx7+PLh1N/f2Njp6vb2/Hd17d5zYnByZnBrYF1eYfTral1iXVBPTUlISUpRVk9PVlVRUlBSWV5i8PBqYGtmX19bVldcX336eHjs8+/t+XH67uXY19rb2N7e3uLo3NrW0NDU0s/Oy8rN09LZ1dPW3Nvq6+TpdHfu8+Dh4uPd4eLu92Bsd238cmd4+GBseGtcaWRt8O3p3uthYmNiUFFPUVdZVVlWTE9WUk1WVWd2cW74dGdya2BVXFxfXWhk+HVaX25nZHVu9vv39exoXV9pZVxfYWV1933f4ubb1+bo493Z1tTUz9rd39fW19LQ18/OzMnNz9HOz9HX3+rc39/f6Ozh3OXp3+bt2+Di7XFqcGtcWmBSTlBOUVNNSktMS01UTE9XWVxZT05WWlZXXFBibG1vZlxnbWRmaWZdfW/u5vB1825sb353Yn1u49vf49rj3dzc9nT3/9rd6Onc4tze4/X38ObU19nV0dna3t/o4/Ho2OHj2tvd1tfZ2tnf1c7W2Nnk5+j5cGdrZ/HtaWNmW11iW1hbVlBcVlBVV1FYWFdcX1xaamxqamxhaGdiX1tWV19ZWVVTUlhYWVNQVVteXWRjb2ptcnVqY3H17Off3Njc29XS1tXPzcrHyc7Q2dfR1t7Z1dfP0dXW0NLNzdfc2dng297c2tzq5Ol4fuvyePBuanFjXnr2aWVfVFJRTU9RTk9ZVk9QUlFYXVlfa2Bjb2FcZmNebGxme25bYHBlYWtsZ3R0d/F7ZW99YFlaV1ZdXF1mXlpjbWZv/Ojk3ufj4ent49ve3dvY3dXTzMnLysbGycrNzdDO09DV3d7c3OHi4dzn4+7h5vDn4ev9+vD5aXBs6Ot4e2xiXFpaWFZgXmteU1NUVVJVUlBQU05STEtPTlBTVFFPT1RXX11jZmNkYWdmYWJpb+5rZ21r9u3r9/x0++3r8/fv6eTv6ezp4tjQzs7Nzc7Nz8zNzs7JycvMztDQ0NXO0drZ0tfe6HNsdXBicmFYW3Z1eXBoZmxnYXhsYGRyYl5cWlxpY19nX1hgeHj5fX18fWZfWFNOWG5oXlpcWVxUVVZTT1xgXldSVlRST05NTktXZGddZGRla2736OPl0s7O1tbV2dvW19bS18/L0NfS0s7MzM3NztXPz9bd2NTY29vt8Oz43dbc2tfZ3N/j83Zwbvv/aWRiZVxXU0xMTE5XVlNYWFhRTk5MT1dq+HRrbGhkXF1jX2f55uj4eX1tbF5eXFhVWVtWUU9SVFZQV1lYXHfv73396+Lg6NjY3uHY2tfX08zIys3GyczQztLS1dLPzuhs+15aZfv96ufk3uFy9eZ8/OHY2N3W2NLVdXjp8uzc3t7f4e7Z51lVU09UZmxmWVxVX1FLUlZPU1tVWlNWVG5XU1liW1lYVVVTV1VmT01PUE1XXF5bXmRebmBueW9fbu/r9N/W0s7V087N09DLyMnBwMbGztTO09bNzc3NztLT0dfc5Or06Oj69uR7dGxYXWlnaunu7+bre/RtXF1lW1x9Y1xbXFZjYF95/mJo8nV7cmZaXlVTWFRMUFxTX2VnYGhcVlxWTVJUTVFPUFBZVFZlV1VhaWX37/F87nzv3u70493f0NLT2dTb2dLg2s7Lz8vNz9bY3dbZ7ODUz9bPz9LZ2uHZ2Nzb1NHSzM/O1dvr3+D0/Or3dvZjW1VTWV1WUE9WUlFeWFRPT05SUU9PVFRaZF5dWltZZW1eZ21aZGNWU05MSk1MSUpOTlxmXltaW1p1dGh08PHV0tja2drgz9DS0c7SyMbLysrO1MrR09be6dnd6PpzXVvy/vju6OzX3/Pv5md24+fd7ODg2Nng4t5rdd30/fpmYf5nV19ZS1VYWGlbXWBkaFhnW09eXmFdU1tga3dp/GJYX11cVElLTEtMTE9ISEhLUE9SXWBpaGx7W11i/OTs4djU0M3Jyc3JyMTEyMjJysnKzNHe3+bb2dfX2d7h4urtbHJ2fG51e2dqd+jd3+Lb193m4etjXF1ZXlhPUl1UWm1hXlxcW2dcWFNUTFFeV1BZVltvXWf9cFhrZVpUU01TTkdERUVEVF1aV1ZPWVpbWWRaWXjx6uTp69nZ0s7JzcvDwMLIzc/Mzs7QzdXNy8vO23n98Xzv+Ptr+/js7nli8uHc1NLX4tXTzdDa6+n/e+jtbmjx8NzY8GBpX276b1xaZGVtbVZOV1Ri/21WWGJdXllNSUZCSEtNSEpNSktMQT8/P0VKSEhTWVpZZF5ha/HXys/WzMnKysXJysjCv7y+v76+wMHDy9HW0dPN3uXj819q7X55++Pi1+Tj5OV+7ed0aHLo3dPa29nb597j8mVna2t0Ymx4a2J4+XFramZucmlvamNfX1lZWVlaZGtqcGZfX1xPS0hJSklHRUlFQENHR0xPWWh++Ozr8PPxePrh4t7SyMfAvr6/v8LExsvMys7TzdPf3NTc2ufu4d3g2NXe4Orfb2ne7fHP1c7FxsrExczQ1NLb1uTe2mxWZl1ZXFVdaW9l8nxZTk5EQkFBSElKT2BeW1lkW1tWUlhVT01TT0pITUxRUE1dW1hh+3VsfXFhaGZ25eno08zPzcbGyMTHxcXHysnIztLW2dfQ29LO09nV2/lkYldPTk1XWFpn5N7h3tjh3d/g1NDR19DP2d3c39XZ2s/R2+je7WhiWU1NSkdKSkpNUk1NV1NMT09TWFhQTVBPT1VWVFZQUFRSTU5OS0pKRkRITE9QVmPq5+PW0tPU1trW0tHMyMfEwL+/wMTHxMXLysvQ0tHb+Hlnafb2Z3r5b+/p8njw7+zj7Hrr5ft77PHg4e7n3Nvk3enq8/5kXlNTUlVWVl9dWmBpWlhRUU5VUE5OT1BWWVRWUFBNWU9MUlRNT09JSUlISFROTlpgW3jse/57YmTkbGjv6+/Q0NbLxcjDvMLAvcDJw8nU0s3X1dLcz8/Z3t77eu9nWWxuXHJ9Z3bi6tnP09LIzdHK0N/T1evh4m1r+VlWX1FKTkxLVVJIS01FSUxHSk9NT1xXT1teVWhrUFhmWlZaT01SSkhSWFFbXVtcYVVSXFdQXWli7Orv4NPZ2tfZ2s/P2dDOztPO09nb3evZ1+Xf3d7p3OX593Zfa351eezv7dDP1czL1M3N19jV2+jY193Y3O7c3O3f1+D27WlVWlJKUFdXVU5GRUpFQ0tGP0VGR0tNSEhPUU9XUE9fZnbu5+3383x463NhfuDh4e3r5+fj3NPc5uTb3N7p6ebX2NfR2NvUz9PW29n17P72cltPWV5YWFpfVmJeZGVgXP7h2NTU0NLMz8/R1tLHxsbFwsTGxMnL1Hp74vr9+eju/mxaW1xQUVJRUU9OTE5STFBPSVBPUVBXWFFPVlBSTUlYX2Nj7+nn29bh1dLSz9HT1s7P1tTT39fb2dLU1tjP1+Xq9212XV1pb2573Nrf2eHr6Xzw7PRsbfV9eex7aW/29fft9+zY2OTd3Nza19POzs7MyczOzM/V1M3O1t/j5+L1d3xkWFlmaGlnaGNtaVhVV1lbX19eYGN15O7z+3RqcnVjWl1hXGJmamhgXmRsam799+/o+vt2dv51fHx85eLe1tjf9PH993lobu77e/Hx3d7d29jS0czIysvQ0tba1t3i4Onf297V1NPd8HZ3b3RjaW1y7nvq6N/n7+Td6d/h4uZza/7h4/BgXmdvYV9lZV5odmRjZWBqfF9cav/y3uXo6Oj+/Ov7cHtXS1FOTExMTVZUUlxkUE9WVFJTU1dnZFtffGN+4+3t3trX0NLj3tj+8ODf3t7b0tTZ3tDN29fU1tLU2tvb3+fg5+LT19zg49re5m5jaFdTXFllXlx2+mxw69rb5/Fx6nttcmJbZ37q6u1y+Op0a3BrXF5aVUtLSU5MR1JkW11fXGtoZ0xMUVleWkxNUlNRTk9NV1lm5+B3e3P+bmZjaOve1s/NzcrLzc/Y6uPb29rf6uXp7fJ+e/x2/efT0Nnd4t/l7m5mX2X56m5w+vzq+nBeY2Nsb2RZVG/tdFdSVmdjY3jf2tLR2NxsWltdW2j47eDa3+r5XlVST0pMTUhISUtQTUNES0pLVVpdaF5dYlpLSUtLT1tWXejp5NjtavJ+ZnPj9OPY3NPO193T29/OzNDJxsrHxtPe3ezu3Op+2NXZ09X8b3RfWWZaVGl6e/r4W1BQS01ZUVz1dWNaVFBOTExTW1xs5trX3/bo93B0+HVgZG7t2/hx/Wz7e/R67N/j4eJgW1ZLSEdFRUxQV3V9XGz/XF5hVFFXVFV0a1h1aVtjYFxu6evczdno2+Xz7m9+29fVzcjP0MnKzszZ3tbW3M/M083R2eDlcuze5f3d7mNfW1JUUE1cWl9t8Wz77+x3cllPUUtMUFZRXF5dX2dYX3NkZ/Xw+u16bGdhUl5dUWHv6trS0NDV2P3+aVtnbXBq9Pj453NseXN339nT1d/b4G9lX3Bya/Ho3Nvh2+F86u5zcHb65trh7tfW5tzc6ufzedrW3N7O1+XZ3eLj6vDd19rRyNbd2nxfWk1OYGRf/OBrb+1qW2FVaeD0aXVmUVBVTEtPTF7w5+bU3WtoYldVWFJg7/vw3t/34tvg19nbzcnNzM7P1dbW5+3z8eXY2tDNzc3M093t6+3k/ufa4tjt9PBwVmBjXGJZW2NsXGZ1clVjaPrj3tnX0t3j/3Nn9/fg39XPysjMzdbZ49nb3OLj6exuXlpUT09ZXPxy5NvX3+38aFhNVFhaV11l8Hz3+GxmZXv07G/43dbe7eHidXn36tPXzcO/xMjJz9ra29jOz8zFxMrP2/xu63x743N629nd3O1WUFdTY31u4M7lYlxSRkVLR0xVUnDV6uvm6+3f6n7d3Xvg1ODa2+xq7e7gzs3Tx8vZ0Nd9Z2hST1FOSVxdWm9gX/x5W2j6d23W7vTd8l5cWVNv5eDWzNjTytPe4H1k7Nvn3M3Uzs3W2trk79vY3dPQ29HU4nB2amHz4Ojl+F1kY1hPU09TXV1XaXts6+LtX2dbVVhXUVVRT1NXTEtWVFhoe2jp3+vj2e5ve1tVXV5YefPt0cnX39n1Y213XGl0ZvhrTEtMSkxYWljt5OzY1PFxbm5n/3h32dvd09jk3/lvdN3rft/f4OB7aWlj/Pnb6frsaW3/enRtcXdjc3N0//Hb5+jhd2RXUlpWWFtWXFFcX1FWWVpcX2BcWF9VXFJJRkE/Pz9ARk9WUGZdV1ZXXmFkdPbw/Wjl8Obl5eLVz87S0dHSztrc6un3+2lqdnBgaHZtalto++9+6fJ3dnh3e+74/XlwaWxjXmV2dmhaT1JPTk1ZYWZ+5uDl+2Vx9PR36/Tp39vf29vj3uHr8OZ3fuXsXlRPTU5OTU1VT1JcYFxYVVBcXlNPTUlHR0dCQkVFSk5PVV9e/N7c6e7f7N7d3d/Y1tLKys7PztDJys7U1t3n6uL4++X2dWFbUlZVZPv6Xl5pZWVeXVNkY11r/15qbXvrcGJpdGBp9X1ZZvBpbvrtefLf0d3h7v3t5nT95nn26+Ds6Hp49utma2tYWllbU15VWGdjVWtwYGjv8mJuWVNXWU1TTklJT09RYl9i6trp2Njc39ja2tPX0MrN2M7O19TO2NXQ29vX3e/2bGZqZltofmr+82NdcGBgefbv6N/f2+l4dOjs9eXj6uLn9d7d4+j9X2ZkW1xwbGj3cXrj715tbWRocWvh1+fa0dLXz9Td1d/35N729vZfWWZcXnro5dfT6t3fZlZfVE5OT1BbXFRdX1Zc8/N62NfZzNDW3t305t/V2s/M0Mza19PX9ePY2+jl3+ba3dfd5+ns3eLz83dy7uXo8O/r9uj6b3118/Ti2tz0cProcGvx7fDs297c6PDu73fv5/Hp5ubydGReYW1v3tnSzsvKysvb5uttafjy7/Pt7PL1dXz58ODV3fLzbl9VWExOUE9aZl9cduLdz9TV2c7j2uXd79fc3tjX1tTP6drb5u/e5ujj3trT7XjozmXe1urS2ftndVJSWmRsdGzx4fRs9+95fuXg6ubg3uvz4tzt8d7X1dbS1tvh7PHpbF9na3z+bltt7m7h1tnRy8jL09fa3u3r2OZfbObw7O7y7OTp6N5yXV9YWnVqW1VfXmf9WlFWW19nZ3JxaWvb0+py7+/k1tTP09zd2+RtcW5t4NbY3tvh3NPh+PN0+OH3X1xTS1ReWFVZWWFub3TwdGF8emv96vvm3N7c2Nzr4OPi2ury5nRdXmVXWGpna2tbWF1jYPjo8t7je/Xs9/589ufc3dfS3OPn8/N8WlRUW11WV1pcWFFXWltsfur3e21VWl5aY1pe9ubo4dvqZ2xqaetxW1JeZ2BcXWns9fzpZFxkbO52a1pPV1pfW1NVW2l85d7h6Ojl3931bXvp2dfS0tHV09HQ09vq4dri8lZOS1JPS0tJSlFUUlhPSEtRUFVNSEdNTk5UU1JUVFZvfmv44+rX2vF759/q3N/g0s/PzdHe6eX84uFiWmR6b+Xb4d7gcu7jb3F5XF5fUExITUxSWk9iZWJ23ntWVUxJTUY+QT9DSVZRVltUUF9jXevp7uTb5+zd2dzSzcrCxMjGwcjLys7Lzdfw9OTw39nrbF1TTFVQSUxIQ0VGRUVJS0hPT1BeXk1SUkxPWk5NTEhJSlJT/utw7Oxt+937+e1nXnrzbPTe6t3PzcTAxcO/xMjDxMnO1+ro3d3c1Nzp4Xdr4/NfZVJNT0pHRkQ+P0dESE9LRURHRUtMTE9KS1Jede/Z3una3eDQ1NnV1dfS0tLRzszOx8TEwMPM1Nfm59rf7HpcYWJ0evTedGdtXF5XUVRJRkdHS0ZHTUlLV11pemZZYV9UWlRUUUpKSVBdVm3tavTr6dPNycvLysfEx8bGxMfEvby+v8jNy83P0dPc6O36aP1obm9VTU1STFBUTUhGRklJS05WYF3o1dbZ5vzx7P939eRycvz+29PPzM/Q0M/O0M7e/2didXP2YWP5/+7W19DR3uHl6X38b2deYWzv39zV3fRxc3n+8vRtZVhYZV9ZT1FRVmBx6OxraPR7bu7l5Orc1M7FxMbGzNDOzc7My9PU1t7Wz87S0c7Q0c/P0djv8G1cXV1fU05WVWjo39ff4erf2uPc72hyWFxjYWFWaHRt7+bV1OTe5ftqZF5QTE1NV2j43un7e/ni6eDmZPtyc+7t337r3+TU0MzIzM3Q0tzc0t3p4eTe19fT1+J5a2tqa2tXVlZUYnHx/vvu7NnS0MvNzdLa43Xtc2Fu7unbz8vIyc7S0NXh9mZYWFROU2Nvav3wfOTZ09XSztLU6339XFhhZWhw/+3r3vReaHBuaGdeVU9NTVFMTFFPVVpvcG3f7n7tX2VfXGFz2tzb0dDHxs7Ly8zR2tj4cvx23dnV1eDc3uTsbOpuVF9XVVdSWE1e9Hbk5tvS4NzY2+Ln23Fec2dq/HZ4X2V389/s3t7s2+RfWVdTSUlRT1peeut+7t/g5+Tb8m3w8+vg1tPe6eXm3OLm5m1mbGZsbGNSUl9cWVpgYVBYYG13YmVTTU9UWFhfZ1xg+evc09jc497Z3ufqd2JUXHXv5+Tb3uDb1dfe721UT1Rca15hZFdj9uvd6enj8urx/uxtZVpOV2FiXV1sX2N76+JtXlxQUFVZUkpOSkhQVGViWmhcZ3597fLo9G7+8t7c3dfd49jOy87Y4HJp9+niffvwZ/nk6ef68XFiZmVfWFlSSkpOT05QX1tddO3g4uB+YVVVU0xPUE9OVHH4duLk+/Px/11jal9bWVtdWGH4ZF9p7Ori2N3u8nF0d/LqX15faXFq7vljbm9sX2H7YlhXUkxLS01NTVFVV15zX09PUUtNVVRUWWl46dbLyM3PzdLd1NLa1tXR3NvY3dfX29/u3dbW4+XecXDu+11WWFNQZW9w+2t7dFtk9HB7Zl5QT1NLTVNdWlhtd3hrX1tLSEtKSkpPTk1c+evn295ya2t28NzW2uHh19vd29PncPPo3tfV1drY2OHffWxTTE9NWmFna1pdWVRidOP5X1xTU15xdXr85t/SzNXc6u7zYnXh5nh26uXSzdXS3+Xi9eXUztXg5PPq3NrT2+b79enVzdLY2Nbg3eB8blhQT1FdX2dgWFhXXF9dV0pGSEVGTE1RTk5PWuzf825bW1ZXcmjt5u7c1crM0MvS0M7Py8nDxsrQ0c/O1NrZ3f3v5OHd3uV++uvdbF1hWFNQXFpWb2xpeG3t7dnT42dVYWFf7ubzenTt8OXj7fr57Ot9bfBvXWh+6NzU0dnT0tHOy8bIztjb3NjO0Nzr6d3d2Nna6fd5cm1aU09KSEVGSkxYT09NS1554/xkXVZl/efV1dfX29DNys7T1tnWztLT0tra6OTb2Njk3eT429fS1t7a93Tv3NTt6Or939vP09vU3ejc1t5sXVhRVWB1bmRpa1hj6OtwW2laVltfblxfW1ZddeLq9ul79NvR0+Dc3N7e2dLV1tfRz8zHxMrNzdDf8fTu5PLz8OTb3uLp5OTu697qfWBTU1dfYWJfWF9nZ+7+/X5idHb2/HPq+On8bOFtZW1eZ2B46W7zZ2FsaNzaeuPm5N7Yy9LKytDO1MzRdevi5+700N/i2+XY8OXfWVdWTEhFT0tGSUNGRU1sU01WU1BReXdUZ21u/XjR2vjk5N7kzsjRzs3R3N7Lzud4+ebu2s7U0NHU29zLz+ppd/p86NbX29jb7Gvb1utxXllMSldbV1ZPTEhQXFBJRkpJS1NTS0pMTk5RXGVpXlhSTlt+6efodXB63dXW2d/g4Nna1M3IytfT0s7M3utpYPh08Orj5VxeaGd1bGtVSEpJTVlca1RPVE1caF5WSFNaT1pjbFFNVk9ZZ3J4T1BbU2Hv3OtfdHh12szL2d7T1M/IwsHJyMvSz8jH2eXc5enczs/e6mhdVlttU0pEPj4+SUxGR0I/PkNPSUZJSElMX/RuZlpVUlvr6XN0X1de/tHW29v4Z2zX0NzV4HV75s7Q0NPY3tzOzNbY5W534NTOzdDWd1x44et9bFNJTVFXWlZSSkRHS0dKSUA/QElNT1ZPT0tRYGNrZV5ZXfDi2c3Lzt7b0M3NysnNz8zJxcbFxs3Q1NfV1d55avz+993e4/dpbF9ZWlhXTk1OUVhXXlxWWEtKS0pPTE1PTVdaYWViY2JdXWBbW1RYT1NgcvP0al5f9/bn3NTJzdTNysTGyMnQzs3MzM7O0NLRz8zO0dv1X1daVlFUVFBRTk1XXF1YSENFRUJFSUtKS09QWVxYWU5Sal9ubG97Y+7Z0s3V1+3l0tXMy8jGzszIxMLFx9Ti1dPQztbQ09TLyMnL0ONdW1xYV1FTUFRdZGpdc2ZKSUlJRkBHSElMUFxba2RRUlRaWlVhW1dm9djc3Nb37+Hm2d3Px8rIxcDDx8XN0NHb2/Hf2uHW08zLzs3hZ19cXE9RVFBXa25iX21iWVJNTkhGSkhKWmFcWGtdVF1cZWJkal1medrS2cjL2tzh1N/Xzc/Jxb68v76/wcbKydHPztrUzMXEy8vM197wY1dPT0tJS1NhXGl+ZFpOSkRESUNFSU5dWmRnZGNdYFZddlxhcO7a49bX39/u7V1c7fjt1tDKyMK/wsLFytTt29Xe1dHMy8S9xMnO0OZk8/VkZ239XWTpfm5obldHS0xIREdKRUlQWVdOVFBITFhfX2ns9/XMw8fKysnU2c7Ny8fAv8K9uLm8vb3K19Lb29zf5Xvkzs7X5ONrTEtSTExWTkxSXWtgXWVZTEtOS0tTVlFOW2xVW19PTElQV1BbW1dddNvd3Nn/Z1tdeHfa0M7Jx729vru+wsbMy8/MydfSzsvHysnO2u1jZWNfa1ZOUFZbUFhYTEhDQUFDSUhJT05TTldgU0pKTEtY/HZn7tjS0MvJzdnf53Bn38/TzcXDxMC9vsHI0ODz2NHd3NXP0M3ExtLmeWhWan1cWlVdWVBYXFBNS0c+PkZGQ0VFR0lMV0tDQEE+O0JLS1Bce+7fzdfm9mxiWWza3djOx8HBvLzBwMPM0tfT0t3d29ja1MnW4OVpW1VhbGNrW19kWXZnUE9JRUJBSkhJTUtPTk9OR0VAQkA+SE5OVFh44NvP5vB6VV1XXtze1c/LwcC6u7++xsvL0MvO2OH03u3j1uPraFtdVlxeXV5SV1xTWVBJRj4+PT1GSkxQWGRgYF1WUEtKR0dOXl5VZeTc29re7nBeXVtb+vd62M/MysfFyM3P2Nzl5tnx7uDr39fQz+Dr6uj5+eN+bGhdX1dXWkxLSEI+PURISVFPVWBUU01GRUA/QUxYWWP73dLNzM3Q0t3q7ePU1tLNy8fFxcXFycvS19be3d7n7Xnw4OnjfWtmXW70+OTo+GRccl1XVlFUSklOTVZaYGhf7XJTUk5NRj9DQ0lRUlxXZX5lbWhfVEpQWl393tXUzMPExcC/wMvLyc3MztLZ6NrU1s/Q0uXt3N3d09v9ZFxeV1FVTkdGR0lLX/Vramt7cGFZVk9LSElKT1paXGbr5Pr87lxXUk9TWnXu7+LTy87OxMrPzM3OzMvP2NbTzsnJwsLIx8jKyMbHz9bdfmxrbGJMR0lGSEpTVlZWUE9QUkpDQEE+P0FLT0xSY/7l4up0W3tjWGL74uTh0cvLycfJzc3O1tbLztnn6+Pl2tXT1dLPzs7Ix8zS0tLg6uLq9WteX11rfXvq5u57YGxpTUpKR0ZDSEtOXFJOVWr6YlNXX1tdaXh76eXb087Jxsa/v8TEycXIysnOzszJxs3Mx8zKyMXFys3R2e1mZ1ZPT0hLTU1OT251X2xbX15OUUlARURGSE1XTU9UWHVhWFxYXlxeb37f6v3k2s/OzcbKyMXHxMfHydHQ0czGy8bJzsjNzMbGytje73HwbmtfUFlXW2954fliaVpgY1NPRURFQkxQVFtSV1xh6O9tX1hbV2Fx6Of172zxzc3Ozc7MzMLBxsLJ2d7Xzs3LyczKxsPCwcDL1N5y7v53a1JRTElOUmBaT1BLTVFQT0Y/Pjw+QUJEQkRFSE9bcWtdYl1rc+za6uXrdu/fz8rOy8nNysfGyM3a6N/b1s7Q1dPPzM/IyNLY3uP7cd3oZ19bWVVf/nlsfOr3ZO75VkxIRkZFSUhDQ0VJSFZnUk1QVVJLUVlUWFpcVGHg2dzRzMvNycPGx8XGzMvGx8nKzMzOz8nN19Xd9G16e1xYVE9KRkdHR0xQT1BPVEtIR0dIRkNEQUZKRktOV1pTVl9bWlpcWFptXF1lZ2Vm6tLSz9HW3ure3+DW093p4dri29TV2dzY0dLPzt3/6uR3eXt2VU5WXn3p3f1UWllPUExORT4/QEVITllMTl1aZG31+15ocv3f2tDfdObt39HKx9Ha2N7SyMTM3dTd5ePf3ex6/nF27tzlW1hST1tmX1ZPTEtRZt7eeGRXTE1cZ1ZQTUhJTmBuYF1RUFNi7W5uXUxPVe7a7+dmW2PsztTQzN7i3tDHy8rS+WRt293m1/ZiberQ0tTbZlpYfetebFZKSlP649/iXE5MXfdifHtaSk1ea/ffbE9NW/Dt2dl4V1zx187L0vRdfdfa183O6OXW0MrBw83g29DSzsnL6Wbu7eDRz+RQSVBWWlBNS0ZKTVJt8XBORUlNWF9bTUhKSExo4ttxUFdp7tvU32lx6+nTzMzacWNq8drOytfz/OXNx8fM1N38+uTZ1eLxbm/d1M/S4+pobOPW1Xppdl1s3+Df/VpQUl9s82pbWklKW2t6al1MRVNjXmJZWlFQdt3W5+vqY/bTy8nMzNjlzsXBwsbL3OHYz8zS0N5179bS2NziXlpofOf5amVXVe3X2u7tV05VY+Tg2+JqXmD83eXeZ09PUF1gXVZLTVhp6fvobllrcOPd5uZjXWJu1tPOzuzm29LKycbM1Nvl2NXZ4GtpePrd3tjpb/Dq2dXc6l9UVE9TWGxtWltXZenn2uhvalZeX3pwV1lbYH3m4uZ7+vPg29HN6PP8b+7bz87b4Ovm2NfR2ujjbWZ39u1saF9r6N3Y3eXjc3Ph5/NeUVNNUF9w5PH5embg19ra7XBbU1lfZ2BYV1de8Ojl39rg+NzR09DZ8Ghe9O3j2ujlZmvc39rg5nJYcmdieV1YVlBec2709GxYZvxw7NxvVVNVXfbc5d5jZOfo3NfZ7lxbXFlqaW9fbebn2NnR2fnl49XP2tL9XPn82MvLzOHp7t3P3dPgX1xPWF5mdE5VW1f7Y15lUFZVY3deY05HS0hTZnd8W1NTYNrT0dt0Z1di6erc+l5fXvrk39/s6v3o1dbU4G1kZ+zc09rrc2Bh5NDP1uJsWWB35+TwXllZX+/m+W5mW1ls5+5tVkxLTFReYl1bVFFl4Nfg/nJdV1heY1lSS05W4tHX2ODg6NbJxMnaeV9w39zZ3OXhbnzZzs7Z6nZlbffh3mlWTk1ZX2ZjWF9ha+Dj62hPTEhZZnJ2V1RTUW3j3t3yc1hUVlFUT0pIRExfbfpy9m5dZl9rcllQUVni3OTp9uxy59DMxsrZ4Wf2bmZ0Z2hYXv3q49zp7vrz4/Lm9FpQT1lcY29saV5r2dDNztffZmBYU1xbVlJTXGFm5uzweW11XV9iX1pWY3Dp2dvf7eza29XR2udrbm134tra8mZlY2/n7PpjZGZleHVmU01OTFBfbujn8Nze0cnP3/htaVZmemxgVlxk/t7f6Nro+V5j7mVWTk9WWOfZ4dr3bGNp2+J1/mdnW2PabmBkWVRPZG9advZsX3PP1d3h7nle6tP+39Tf3tLExs3N1OpiXutzbuf6XFrc237v5PpnbN7f6vV4bGjUy9rYz9r7+tTZ3+Pn71tq6/18Z1xNRVFTTlFTX1Rf4e74alxYUnvwevjq3vDiycvNys3V7vHrfXJpY19VauxlY2llW118bmv3dGhp6drt7uXm6t/Y2efc2u/p2drY1tfwZl5YYVNOU1Bc+OXk9OxmUVpfdmlfcG104tLN2dPS5+Dg1+Vy62pcbm7q8uff/t/Z1N385mVd+OjU297a7t/t2tDcz9jm19fO19/bcGllYF1QWlJJVWLz2eDZ52toX29gbfhba+fczc/O0uLl8u73aG9fXGVZXVdaYlhUVFdsZ3BkW2dfaubb1djd2d3a2dve6Nna3M/O2ej9fmNYX2dsY1tbVGPs4eT++3V16u3j5/zc3NDIyMXKztTg29Ti62JaWlplX3ZpWVBFSU9PWFRXUExUV3Lu9+X96tTa0M/PztXPzMzKz9j9ePdy9fplVkpPVllhX19VTFZcbOLr4Xd77t7PzMrM1NfZ2NnX0un0/f3b1dLrWVBPV1hLT1RSUklOZupyU1JYZXh15dzndVxo3tDR5ntnXWz76dv5/m923NDV7G9cXmZ939rh73p449TQ09bi9HDm3ejjaVlRUWJyfev2a11daXL9dl1hdObY2d/qemhkeXnw5+Dta+rX39vnZ1lQVlBQXVdPTk5YbHNiaVtVXmNr7Ox4bfDX1M3LyczU2dHV083ce2v5e/zq8F9SU1lWVVpbTklQUFReaW1XV1pr69/X3N3X1MjExMfP1+Tu4urg8V1bW11+dGNaTlFQT01MT0tNUlZx6Nfd6+1w493aztjf5eje2NLU6PNkZHD6dmpgWlhSVVdYWl1ZXGZdbm9y6+3n1c/O2N3Y2trY3tXT291hYe7zcWpja1pTUk1WWl5hWWJqZ15j/Pbu7nNvanFuam5ze+xvdF5j/Pl+aGv/dWRsWl1bWmldXmpqem138Hvi4u738Ovp9Prp3uHm7OLZz8/d6Oft/X702dPW1Nfa193d6fnycHf7bfl+aWJbXnBfZFxQWVJQUlJPUEtJR0tUXmlia2hib+Xb2NfW19HR1M/S0s7b2tfZ2ubv7mBXSkhJRUtJQ0pabmtu5Nbg3tbSztPOztLMyMfKycPIztvZ3f5nUUtHQkI/PkBES0xKUVFRWE1eYVdxanXzctrR1NHXzMjOx8HDy+XqXlJRT0lIT1dr8end5e7l3NbW2N5zWVlcZGRe+Pxq5drOy8/cXUxOUVRTT1VPVWjz2d70e1/92tjO0Njfc29m/uTp7nB66N3Oz9fvWVNQU1NOT1JTXmf929LP19PNztPW1t/+fe9wYHzsdXLu19fneGpOSEtOSktQVFZNUWh78/zoc+zY39jb5uL04Nvk19fs6Ora1dvZ+VxTUWFYT1pTTU1UY3fe09bb1c3Sz87T1u7l3OzV0Nvf8+fh5fNfVFNNR0dGTExJTU9ZY+7W2efb29fLycbIz8vM0c/LxcjMy8rLzNfZ4GlXS0ZAP0JCQ0lXW2dwXVtdaGxq8vBjWVJUXlNs9e/X1M/P3d3d/WhoYWBcbG5eZXb66PFuZVtXZ3nz5vHr/mtsdO/d2tXNxb/GyMnV0NTX0dzd2ezp2NLO0NrcdGv/c+9nWFtNTFhTWV9YXlxf4+ZtX1FMSklNS01ZXmVfYfP35uzz6Nzd1c3Ny83U193Vy8nM0NTLzM7U6HpWSUdAQ0hITktNWFtp7+Xa3NTNysXDxMfLzc3OzMnM087N0dT6bVhJRUI+PT0/QkJJTUlOUVpu/PDs/O3p59va2tfl3+jr4N3a19vuaFdfZVJPTE9catrY49/96ejwzMvNxMjMzNLMz+Dc3ujraejb7NPjY31n7+lYXVNOV1NkbFlcUUpWWW7f8/L7eu5z89rl39rn5OXZzM7V7l9gU01STlBZWFxlX29eWVlaZmp64ebc3e3n5NTO0M3N0tHXzcnO2flZVlZXWV1aWFJWUk5ZVlBPTE5SVl9qX1lYVV5eZWZgd3J1797RztPl/2RhXmRuZmv8e+va0cnHyMbHxcbIy9jx9GVcYlxWV0xMTk9RUmVkV1NZVlZSTFRQT2tn9Obf2NnYzs3NzcvKztzb2eLva25dVF1fXFxcX2VQVlpTXV1VTUdMT05ZX/Z7Zvzd2NbPzMzY29Tb5N3b23t55vvl39/jXmFwV1BZXE1APkZKTE5aaFRY9+zg2dHNz9nMyMrGycrR4Nfc39bY2Ppd7fbt7l9oXU9YVk5PUEpGR1piUFBaaldTZXdeZu54X11x4nFs6uh8YvXS3unt9mdgZ+3u7tnP2NjX1dXZz9Tf2dTR0Nzdztjd29necWJ8YWJz9/1dU1hTS09JSEZNaWFaYFhdWF7h19fX29nQ0s3P2djd3M/o5uB18VRMTVJXS0NAPkBGR0pNTVZXWH3r5e/i3d3PysjLzM3N0t/JwL/Azux4WWhdVFpbZF9aZGxnXFluYlzn5Ozu92drX2Xt4Nnm3NTe5+5fUltOVVNTZ2L619fd3dTN1NjX4fBjYm5cYGxfWFFJS0VHVFNOTUFFRkJJTlBdbdvT2s/KzcvLwLy8ubi9wcfKy87EwMrR2szJ1eL4TkdGRUI8O0JAP0E/R0tNVlNNUE1TWWff4vlqctrP1s/RysTAwcbO4+tyYV9n7NzY4GJaWFpndnpzdW9cWWxtcnr7693UztLT0dHXdWhpZPX5X1paX3vq2dfX2evm3ubc3eDf6n3wb15cXlpMSlBda11QS0U+REtPU1dn+fbTz87Jx7/BxL+7vL7BxMnPzszPztzvdV1keltUUEhBP0FAQEZKT09NUGZtffLp8n3v4uT18elsbmfm2OLa0dXX0dHZ2t7b2tzp2dDQ18/T2tzW2+Ti5u9tYl9eY2lbVFVaVlpZb+fl229fZFReX1RYU1t6d+LqbvHyc+vw4drj3+f55Orl2tnP3W3/7N7V72JUSkhHRklFRkVBR01WX2D59G/h2dTJy8nCxsTDxcDCwcLKysfM0HxYUEJBPTw9PDxBPz5CQ0pPUFVqb/DZ0MnLxsrUzszJw8nKyMrExtHP3fX0ZFtYT1pfXVlTWF5fam316XhbXVZXV0pIREJGQ0pQW+72VVVWYHVfePZo59PMwcTBwMfMy8bBxsjP3d/4ZPhgX1tLSUZJWk9FQ0A/REZSUFBfVlr78c7M0dLb3dTVysjNwsfNzM3Ey9rb93zg2+b5Vk5JQ0RCR05JSkdHSUhLUElMVFJbV2bf7uz0dtzQzsrKzcbGys7Rz9br7VxNVFps82H0b2Dh3djX/N3+XXzu39d06OBz6dzOxczJ0uf68G3uWlVeZHF0fNn18+Lo3tXSxcvXzunzellfXU5OSEVNS1BLQUI9P0dDSUdBSUdIWWF9+Wrk2Mq/vby7v7y+wsLFxMbX1czJx8nQz3ppbWxoVFNgUk1JSE5OSUpHSklKTlddbGdqYG7s5djb6uTd0tDSzc7L0Nzu6+XZ3uvr7u99ZF1bXlxcX2lpcV5WUFNXYltdZ/vl5exvanFwZW5jaXF28ujg09XNzs7LzdHR19LT19rsb/1kZFdVV1JOWlJQT0dLSENLSVZwdt/f6djW0cjAvb7Avb2+v8jEzODT0eHxXnBcWVhZWE9PT0xBQkRAQ0dLTElLTUpLTV9gV11odmtne2tae97a2M7CvsXKycfFxL3DzM7KxcXKyMza6uPa6GdnVUpHRExMSE1OUFROUFNa5Nv2+W7o7mzm3OLY2M3O2tLN3fRq39LZ18/X6F5hblts4PBbSlZoVlNTVkxGSFBIQ0pQTkxTcPXg1M3Iyce/w8G9vb/IzM3O1tfT3uHs3G5eVlVMPzw9Pz9DTElERUxWXH3RzM7S0szNzcjJzczMz9z23tvmfmNkfWlxe1lSW2NkZXrlbGBQU2Zq6dXncGVXV1VSVE5NRkROT2F0YVdWYW7x6NbUzs/Qy83LyMzMy87Mz9DN3OB5XF9ZXXBnVU5MUFJOWltTSD9DRkdXY2VcUF1tdu7r6Olx/+jk287O0dbLxMTIx8XFys7R3Nvc421YUlJNSUdFRD89Pz9ES1BOSkxSW19s6N99cHbe0MnAx83OzszR3dzldGNbY2dm+2BZZWfr5Xrn7mdZT1dsc+99aXRo9N3s3eL08mVYYnra2ufY2tnPz8vKzc/P09POztt9+2ZZWVRNSEFAPzs7PD49PD9AQkxXYFpabHt38dfIyci/wcTDwb/GzsvO2+Ldztbr2tvq49zV4GhnbF9XXvR+V1hfUVBVZVpUVVdRTEtXW1pZZF5m/tjU3unc4O3b09XUzsnS29nP1uxxe3BbWnt3XVleXlVTZGJaW155bFtzamBeZHZqaeHZ5Gtdfe/55N7l4tzU0tPV1ej9cfTwbXzg6O7kZlpVVVlPS0hITUpMX15edN/g3M/FxM3Oy8nLy8TDztfNysvOys/1V1heVU1OVk5HTFJOTk1WVEpJUU5MT1VVUE9YWVtifPZuX2t3YW/s5O7fzs3LyMPDycXBxdDY0tfr+t7f5+Le3GhTW11OTFJYTkhOWVxaX+528tjLzNfd3uPs6tnNzdXO2OHm6N3g9nxsYmPx3dXoclxYVlhdWlxRRkBBR0lUXWZXTFBXY3Px3P9eXGvg2dbQzc/OysXFw8TJ1fbv29Tc3Nr7XFlZYW/xfnxkWV1fbGVk9Oft4NHKycvb9V1caGp9bmFdX2R55dfW3ODf4uLZ3+D+YHXb2NPU3+9bVlxaTElBPzg4Oz1GTVReXmTn29DQ1c7Py8TCvbq9vcHIw8C+vsbJ2W9wUlJfW1tSSlhTUVVNUk5HTlZcaF9kZVlrevbd4dp0U1xzcfX/ff1b+dzd1tHJxtbSzs3K1drdemJoffd2ZWlWRURJSUlJT09TTUxPUllhcNzu5dPSzczMzM3Rz8zMzux66FxST1ReVFJaaXhz4NrvY23vaFVadPZibu7Y09jOzNfe2szZ+evd7Wnt5OTwd+Ta1tjZ2f5WXGVuZ2JxdGJZWFZWUExOTEpIQ0xIR0xQXV9b6+l9/tvW4GplcF1gaHfrbujKyMvNxsbY3Njc2+rbz9Paz9LMzdbM0fnt/3heS0hGQUJBREhLTldRTkxQWG3j2NPO1NvV09PZ183W4NfY29TU2Nn2+2JcW0lOUkM+P0ZMTVVdVlVbaf/t69va3H5l9/7539nQztHS4fHg3Nve4t/Z4uHZ2tnl7Hx8/WV47l9RTVNZUl53bHRvYH7xeNne7GpXZmhabOXVztPd293h3trfbl9WVF9dcP1caGZc/W3y19l8Zk5JSkROVVFWSklWTk9q9upqZHD6euPR0Nvi2dTOz87HzODe3c/KycTG0uD5ZF9WWnthUUtHSU1Uam729W5sdu7p4/BjWFdd7tnh2tL2/m161tjRytd3b+/Z2dzTzuFpWlxcVWNkU0hBRUhJTFJXTkRIS1RpdGVeUE1bZ9rLysPFz9DO0NHKzdDcbl1fef7j2NTjaF9vd+3k8Xlbct3t1dXVznNa7eDayszZ3l1x9mvd0s/haVRPTU1edGliW1hbYu3R1N5xT05OS2BdSUU/PURIU+TqdnlfVv5t4NHe3fvq5drTyMfJy8zPzs7QzNf9Xl9f797RydlpaWB04NXM0uN4enF96t/Q3HpdUE1NUFRPU0pKTUtSaO7l+l5vcXHa0tTUffHg3c7JwsHK2eRsXXnqcGRRSExLSlBrfOx5Wl9OWens8GpbaWJv28/T2HVZVk9q2Nre7WH24N3PyMbIy+lvYGfc39/d8fbl7e7W0OPvVU9NVHBvZ2BQTVZa8s7Ky9Hv/uXaxcjP1N39aWdf4Nx+9VdKTEpSTUtLRUI/Q0hTYVlWSUROXfvk5dXf7f7i3c/FyM7d6G7x3dna0NXQ0c/Mx8THz9ztcG7f4OluWk9MWfri3vdpV0lFTWFwYl9dW3T95urf2c7X4Org0tzl4epqfuzxeevr6mNLREdWXl5lYldSVFFY6ubhbFVTUWhtWWJ2eXL06PHSz9PdYV5j4t7i1NTobXra08bCx9drVVJv/urqZFleZe3h187cb3D9dtvU4tznVl7r7e7W1tvsT0tQWGZuaGZdVV92ce7e9WFWUU9aeWhdXlps2uX16OxhT0lHTVZgbF9vaVli8u/aysrT6mv+5NnS1M7T2M3JzsrIzuZuYF/y9HxoamZeaPfn3c7Y7l5VSkpVbfh86XRiYWns0OVwYVdOT2dueGtvd9/Nw8DAy+RgWVVY6+p7YF5QTE9UXPV5Vk5KR0FNWV5SVl1fc3ne0NPmb/3h99nO0OfwfXzq7c/L2H5kV1JSZObp4M3LzMzMxMDGz937/2hn4+xkenVt6ObYz+1TSUBDR0dVY11icWN56NLIzd33XVhWTFFYTk1UT1xcZOdkR0NCQEdOaftdW2xj9dfNwb7O3un2eHne1tfXycfKycjFx9vye3R9b/t8/Gh459PNxb/D2ltQS0I/RUdIRUlPW2Pz2NZvWWNoXFZ97O598dzOy8O+v8z6WVhVT2ZhVk5LTFVTWfHubFtOTVZQXGxsavLbzMzPx8jU/l1ZVlBYYFlbYFt43NXDv8nadF1iXGnj3N7a18/Ky8LCzN9wa15RTU5SVVFZfNnd18zZ825ZUVRZXn3sdGlu5d/RxczmbFVPSkdJS0xJTVvx9N3Nz3JST1JNS0xTXVBa7+DRyL++zfpqWFBQSlNoW2vXzMW9urvHycjK1/FpWFtVWfHX1cvJzN1lU1JIQ0RGUVRLW+7r08zIzNZ77WlfXWfjYF1m3NXQzc/i/l1XU01MTFdYXWze3drNy9La/VtNRElLS1JhYenu6NrQ1O1dUFtVTFFeaPTs2crCv729wMnlfGxRWHfz3/loetnNxcnZ2mxbUUpPWml5/urdzcrGyNbldl9NQ0BIRUpOSE1u5tjQ0cvT7V5IR1dJWXBdW+PS1tHV1eb/VkxIR0hLT05Ucdzf1dXP0c7q8/Lg1+zU1tPOy87LyMnMyNtZVFReXmVi9efZ1+Lf2Ojqb01OR0VLX2xucd/g+tbS29hxSEdFQkdRXGru29HPyMXGxcXXamVSWFpPUl138/ny5mtfW00/QUJMVFJTVmp46d/V0tHU61JffXLs6+rc09bKy8/NzdpoUFt8ZnFkW+PP08vFwsfLzd5xZV1WUlhWbt3s/ODa9u3pfWZZTUdAQURJVVlq3tjj2dLZ9VxcWltVWV1WUlJdcWt83nZUTU1NX2Jnelpob/3d29XJ0+FsXnbm4nPm5OLcz8fAvr/I2H1fXWT2XXz2c297597U1eBcUk5KSkRARUlFTlvq29bQ3NvtdmNsam1sfnlz7dvX2tnq3fllV1NYVlReW191YGNp6/l9YlhZVFxfaGZecu7n6t3Jys/iWVNOR0hPZ3vj2NHTyr/Dxcfb3+FraF1bWmJu7eDSw8nNytR9Z1lQXl5NT05WYGTm5u7hflxsaVZbWVJZV2Tnd+zybPReWuvabF5dUFdhbevo2+V94vJaVVpOVGNOUV/61dLZ3vTe0tvf0NnW1P9ke93My8vFycvQ3ujV2u3s5PRfV11mc2xld15VV/5uXlpfbOvp9epwZFlXS0lLXmBdaW5kfnntz9LM1dHdfHt0Yllr93ho6N3QztVucFJGR0lTT09RSUlPUmbcz9fW2O/o2tXYz83TztDYz8PAzuN1UFdrbPri5G1lXWvz08zf53JOUHT04NnZ5/ja3evc0Nn4bU9ARkdFTUxISVVYWGPR0vrxa23k3uzS2/VhYGJceNvX/HtlXllUTFNcWVRbXlljc+Xv8Onb1czNx8DFy8zS1s3IxMze5+Tt6X7t2elaXFtVXGDv63xbb3hsaGfp8ltbamRw7OTn+ldZXvrZ29HeXlZTSU9idfHxYV99a+Xg1d9u/v5lX/DuZFZKSlpicujUz+FuYGNe7Njb4l1WZOzk0szKzM3P1dvSy9DS3d7j3evazdTb5d7l8uvP2/FoX2trZujO2d3+YlhSUWZoXFxVWVlYX29s+H1xW1pib3ltYVBQVFxs3tvd4mtZXHDe1uDuY2Nrb+rSztXX3+55eujj6eTr29TV0s/P1tff+/Hl3ePx8HhzYO7Ty8vPzdpeWllbV1BVTEtPVF5y7n3e3nx3am9zae11Y2N6dXrh2tTf/F1aZuvyfXNbWGFgae702uZsXlldaFhXb2Zu7ebg5W7l/FxZV1VSWnD+/XBm7uLT09TO3ere5ut9Z/hfUfzg9d7o4dzz/O1+fG9eWV5cYepvcX3p2t7p7Ht03+nw7ero6Hp6amV2XldYXldSUVZbYvvf6eft6t36b2xnYFFRVU9aXWpsfP7823VZWVFPTEtQUl1l5NzX1tvJzczIzM/Z5eHtb29++vN88NPU72RPS0lFTVVOUV1caf593dfZ2dHSztva2uPa0tPLzNXO2eTwaEtKR0hMSElQUlRgaeTb52xqXllPTFJPUGdlbu342+Hd6tvS0O9XWlJOU1pde37e3NTd6Pb/fm/k3N/f4HDz9/p98d7f6e3o++n7a21r/tvg4uvu93nx//pudXzo+Wls6urx2M/V6mNhX0lLTldhdl1eZ1tcUVRPUlpcV1NQT05PWl1q38/Q1dfV6/b15NbNzNbt39LU2Obk7fJfXHP6ZFx8bnnh1M3T9G5kZWNbXGJ4/OR9d/5s5NnRzM7ab1pJSU9LSElOW19o5uV1dWpefeva2GlbYmBnZ/Lk4Op8eFpVVV5ZXG1pYlVQXund3uDc49nV5dva8+fg3tDKx8nO33BbXlxeaf7g+GRmW1xz+e/k4mxeWlNTUlBWXl9tfPfm7n12bW/r6vJtZnBpYHnb2tPZ3+NpXWFlafne1dLd3N3c3+vv+mpcXFFMSk9WWFpl4tDLyMrU32ZXXmlbZ+ntdG3y2dPOycbK3Xtv+2leXWNaV2vydV1bUk1QZnbya1leWFVVWPHU1tbS3v323tbfz8fGyM7V0M3Q3e72dGJWWVxXVFJMSWDs8fBoWlVRVE9XWV9y4d7o387N0MfDwsLHzdjj4X393ebfdGBXWl1aT0pPVlh65n72cuTp69bU1dz0Y2Vtfezaz8vMzc/Oy8jK8W9hU1BLR0ZGS0xUdNvY0M3d4t3V2u7l3OLt6+ne19XT0dfW19ryV1ZQS0VES1dVUlRXVU9c6uXd0tPV3fnr2tPQ1tDV3trf5HXe0s7R0NDf5n52bWBtXFtiUkxOUFJYad7c287Ozs7d7PHs3t/o6/Ho1+ps+ujc4N7qaWjm4mddVl5revpgXFhYV1JOT1p8a1lhZGp52cnHyM7Z8Ori6Onm2NTRztXNyszP2d/g4+3xX1hdX2Ru69zRzdN7fe9kWFddV1dUU1BRZG/73t3Z1Nz47tzb6GRw63rs6W5YXmRhcGZu393nX1dPUVNaZV5iXFdVTlNv4NLOzsnL1s7OzcrN2+Dvc2heX09TXnJrZfv39m5gX2rt08nKz9jp7nzg1M3R3/lvZl1iWlVZWmBtZWn99VhLSU1PWWhwaXx1Ulhu7+Tc0dn2dmVecO3g5vP6+u/e62V5bWp6+XBYUVhXUFpy5tzOy9HZ3mdeaXPf29vqYFpiXWzr39vc1ODl0c/e7nh5aGJuXFBNTEVCREpMVlpZW1VNTFFdfu/e7Wltb+/d1s/LzcfO3+N6/GdTVlZTVlhST0xLTlto+OngeF9hWmDw08zPz8/a5unYzc3l/WRdXVBOSkhMTE9YXGJ5YF9uZ+DW087V1+FiVlhRWl5fX1tuZ1hXWV3+d3f5+uHk7d3wduLm2t3n6GxfZFtt6vbd4WpraldWTVvm9uXsZVdSVldXZ2ds+3j7/mVlaHfp7eTY3flmWVVOV15ZY2ZbUE9iZF9n7Gpr7PR0YO/X18nJzcvO09fd53JncGJZZnhhW1ZUV2vc3/XW3vNtVE9PXV1bbPV7fXZ56uPa1N7aztPe7nBtbfv9ZersZGVZTk1WbfBlXFZIR0VES05PTlZ5d3fc3ODPyL/Bwb3BycrY397m6ubX4Gv99lheZ2VnZWVnVE5RTVZe/eTY0dXW1Nba0NDO0NfY7GljXl9ra2Nsb2JdWFNMTFRfX2H1dVxcWE9RVVFXZFxSVVxbbdXMy8nFw8fL0NTY3d7h4+rq6Ph7e/rl4t3W2HNWWVpi/Hrz3t3X0tLS0tPOz8/Szs7c/vr+c+1y89bfemVSS0tMU1NSWltYVVJTVlVYXGhqeeXj4OPbzMjKw8DCxtDh73xuXlpZUFpiX2FidNrb28/S09nweGpi++rb0NPZ3OLt3tTR2tTT1NTf7fP0enp+dm3q8WtWS1BbWWjtbnpsWlpdVFZeWlBOVFVbX3zdzcrFw8LCyc7d72lwcWxqaF5ZUU9ZYmRpZFdgYlxcW1lnd+jY0MfCw8nKyMjOzMrQ2eP683BjcPFe+FJcdUpaXl5k7/j35N7+Y1lOTVNTWV5YYVhg7uXRxsPDyMzM1d5vVFZSTlJYYWRdZ//33Nvc4Gz3eGj5ZGPzdv75+/Xo5N7368/Uz87R0OltZ1/67/X/ZFdSTE1TTmL8Z21jaHReWlJMU1RTXfrd2d/YzsrExsbGydLmb15XVVdVUVJTVFlgeHjv6/j29npeWWNkZHnh3NnU0c/a3dve1M/W1t3pcmFaVFNTWVJRUVdWUlv/9Pd1bu95YlVPTlBPVFNTV1hv9Ovf0cjCwb2/xtTw8OTr7vtcaGBYV1hddnr7+2Pvbl9YUFtkX+7f2c7T083T0cvPzdja1O5dUFRcW1tbUlFOSUtRTVJr9H5fampXTUhKUU9VVVJlYV53/+PPysjKzMjR8l5XWGV5d2ZrfmZ54+Xgzs3X4eDobVhUXmZ8fv/z3+jv5+P85cnEycjI1epscf7j2+T9/3BVUFJUUV5lWVBWUkhEQD8+R0pMT1heX2z439PFwcLEx9bc6/J5fedtXl5vX2RfX1z93uLn7fxfXk9NXOba0dTX19vZ1dTQx8zPz83d+mpST1FZUVFRU1FSVVlq8vN8aWVcT09MS0pNS01PVF9WU15ifdbPzcvN1d7q+Ozd3ePe6PV8b/bq8/VlXF1bWk9MR0dJTFdj5u3h3djY0snDwMTFy83P2+Ho7+59bWpeY11QTEtTWlZTUFJXS0A/QEZOT2RkXP715dTKxcXGwsHI0uDe8GNlcmFdW2FbUlBbZmptZGBfZFNQVFJVZPPl6/vg7Pbh1NTY19nW0tbk9fDr6dnW3mtufl1ZXGNZVmNkXFRPSEA+P0VOWFZQYnFcZ9nKysTCxcjMzNHe7uDX1dvxbuj0eW1sXVdfWlNLTkxISVBl4t/g3dzP0czJyszIxsrO0c7afmdfW2FcWk9OS0tOVFBLWFpgXVtWUlFPU19+dXB7+u/Zzs3RycXIx8jK0dnX09rU1N/e6fXq4vBlV3bvav35X1tUV2Bp3uL46uve3N3U1dXMzdHO0NbP3OB4Z3VbT09QTlRPTE1MT0pKTEZAQ0pNTlNhYGv718vIw8DCv7/EwcTLzc7V0+DtfFxjY1pYVFVZV1tbanlwZ3rv5OLw3tjZ0MzNzc7LyczMysjKzc7V3917WlpOTFBQV1NQV1hdX1hQT01JRkpOSVBRSVJl/Pr82cvRzcbGxMTCwsnFyNTV3PDf4+5wVFlRSE1OTU9PTk5Y9WFX8vfi0czExMC7vr67vsHCzNLe3edNR0dCQ0hHRkNFSkdOXVhWWFNUTlJRTlpdZO/a1dPVzczPztLRzc3V1tfZ8GBeWlNcaGZqaGtjY3J0YGNeXmFo+Wxqb/bt3NjVz87Mx8LAvr6/wsXK1OFtVlNWVFlRSkdGREA/RElHRkVHR0xNSk5ffejPxcG+vL7CwcDCycrM1NzdblZPUVBLSEZERUtPVF59a2z3+HNr7Pv76trR0MvLzs7Mzs3MycbHytdvZlRHRkZITVZWWF5fXVdWV1FPTE1LR0xMSEpWYWr++t/PzMrEv76+vr/BxcbN4G9172tdTUZFREBAQElLS09OT1lZUlZg6dTLxMK+ubq7u729wcPFztx+T0U/Pj8+Pz87PkFASlRbYF9iXF1mZ2pqbOna1cvN1M/c5OHb087KytHS225cVVpma/fsZW/yfHR1eX3s/WtqXlZSS0dLUlldZWPi19TMxr+8vb/DxMrV52ZcXltQSkU+PDk2Nzg6Ozw7PkJCQD9KWOfSzMC8vbq8v76+vr+9wMTK61xZTkZFQDw/Pj5EREpWZXHv+Ove29zi0M3Mx8XDw8nK0M/Ly8nL2PhtVEVAPT5DSEtLVFNRWFZTUVNXX2ZmY11PSEdHSlBOUFpedPzq387Hw8HAv729wcXJy9bc+WJWTUVAP0JJSkxLTUxORkhQbOPXycW+vLy8vr69vb6/xMzP61pLRkU/Pj08Ojs7Ozs8PkFGSU1f9u7l3s/NzMjLzMvO09Tb29LNz+FoXlZOTEtQUlRaU1hgZmNaXHja2dnZ29fkcF1cYV/65OTX1NDOx8XDwsfGxcHCyM/e3/FcUEpEQD47Ojk6PUBDREdISEtTe+HUzcnDw8LGyMnLx8TExcnQ1txvXE9LTEpHRkZAQURGS1NfXf3d18zExcnIw8PExsfGx8rKys7L0N/ralhOTEpKTFRPTVVcVFBJRkhLVl1taWVcWFRTVltrbX7e5evi3M/LyMrGwL/Av8DG0+nqXlFLSUY/QENFR05SU19eVmP+8dzNyMXBvr2+vb2+vr++wsnQ3GxdUkpDRUM9Pj07NzY5Oz1DSVZ2383Gvr+/wMDAwsPDy9HP1+X1+V1YWFhYWVleX2n/dXB2/nT03Nvk1s3O0tje+WVeW2Ty8uPc3OPgz8zQ2NbP0M3Jys7d4nBYWVBKR0M+P0A/PUBEQkFDTFRddt/b2tLKysnIyMTAwMDBw8XLzNXpXVNWTUlGR0U/P0FBRkhNZOvVyMHCwr++v8LCv73AwcTFyM7P2eFqVVJRUFFWU0pNUk5NSUhIR0lOT1pYWGhrZV9iZW7s6+3l7+nf3/b383zm1tTMy9Ha2NLn9+j29ur6bmRr/fh4Z15x+nrs3tTT3M/Lx8TCwL69urq7vsPGzN9oXE9JQ0A8Ozk3ODc2ODs9QklWe+jb0cvIy8vKysrMzdHV2d7p8FpPTk9TUF1cV1pdc2xaWmjz7eLUz8zMycvU8Ojj7e7f1drd2dLMzc/Jx8jMy8jKz9XQ1PNeXFtYTU1KRkA9Pz07Oj1CREVOXm517dbNzs/Kxca/u73CzMrM42xWWFhJREJCQz5CSElISllhcNvMys3LxsPHyMfDwcbJxsPGycvU63Bnb11bXFdRSk1OTEpHS1BMS05ZV09WY11aV2Ltb2hhX11ZZXdrZ2d3/2Fm993d6Nve3eH76OXzfnJqWV1pXlNNT1ZVT1VXZl1f9fTj3dDEwL67uru+vrzAyM3W4XFOSUVAPT0+PDk5OjxAQEdNTlFs2dLS0s7Mzc7Oy8zQzdL0YFdWWVVQUU1IRUxVUFJdan576tTO0NDMztbb0s3JztzkdFta/OTu9Off4efc0NDW2Nri93ZqcG9aV1JOR0hMQz4+PT0/QEdQU09OUVZf8djJxcbExMvOysrb7fL/dmRYW1hPSklMS05QWGRaXHByfuPTzM/Q0NDP09HKy87Mys/Z0dTa2Nzf5GdYW1pTS01PT05OVV1USkdJRkRLTlhgY2liXl5o7uV69PTpdHHf3Oz+emxgY/Dz4+Po6f1ydunlZ1haWVZa8NbT4efq7+/XzsjCw767vb6/vsXV3Obvb2dteF1JQT0+P0RDSElEQ0ZJSlZnX1xlb33z29TS1Nrj+WZkYVpYTExMS0xQYF1RT1dmeOPQx8LK0tji493c0c/U2drY29/hempt9ePd1M7LxsnOzdTNx8jKztDT4O/v7m9URD49OTg6PD9DQkVHSlZm4tPOx8TCwcDAx9X2WlVQVGFiX1lNR0VGTFJaWlxeWmfkzsrPzsvHxMW+vLu+w8TL0dPS0tPr/GZcXF5sZ1pTS0xWXXnn2NzmZ1lcXlhXXFlWVVhY/PJqYlZRV1hn9+p0W1tXVVpu3tLZ19HT1dPMzNf1XFZXVFFYaGFfWlhfbX3n09DT0MnFv728vsPLzc/PzszN2d74YFleYmNcT0pLR0RISkZESElPWGnfzc3NzM7Nzc/S09f2X1xPTlFQTE5OS01Yet/X1tTY4dvU0M/Sz9TZ2+PVy87d2+Ht8+zj0crR2d7k5tnQzszR3tnd6NrX6mhcTEhIR0VIRUJAPj9ETlxu7+vj0dLPx8nd4exoZFxed/BgWlxfXFxt9+X5W2J+eeXd4n7s5+Ha1dTIxMvOz8zKycvLy8/b2d/d0dTkZmpscnj94M7Q3Oflb11gWU1IREJIREJJTUtJTVdm+/bl1Nrh7PB65dbU2Nnl9uHt6N37ZV5YWVhbYXdxYWh0bWrk1dDR0M3JxL+8urzDyMvO1NnX0Nj/ZmphXGNta11TTlJPT09LRUBAQ0hMUlxvbWVxenbz2tXpc2FeXFJaYlZJRktSWFxj8N7n5tTP0M/Ky9LY593f8ezuZlhZX3Ll3tnR0Nrf1tHOysPDxsXGw8XIys7hcWhrX1dSTE1JPTs+Pz5AREVFS1Ts397Py8/X2NTc7v347mNPTlNOTEtMS0tLU2ZiZWxrXmzw6dzPy8bHzM3Kx8nGxMbLzs/L0ODi4f1dXm1zdG1w6fpvbOXe6On7aVNLS01JREJEPzw+QUdPWGBuaGV092h4eGtfXWTn4nRfZl9NTFFZV1lZYWVXVmhsYGlub2lq7tDKy8zHxs3OysjKysnIzNXe2ODw/nFhW2X76vhmXV1NR0hRV09VYmJXT1BZV1treWNgZvT9X1hZXFFJTFZSUlJbX1hje/Tu69/fbXD03Nvo5OxqXFlicW7m0MvOzMjDx8zJyMvS0MrHy9Pa3vdfWm1qX11aVktHSEhJSEdKRkFGTVxlbeTc4N/a0dfc3OJsW11jWUxISEM9PUNKTE9XW1pZXO3d1svIxcjKxsbIysvKy9fb3OHf8XpsaXl76N3d3Nnc3tfPy8vQ1dXrZWRnYFtXUUlEPz5DQkNKUVteed3c5e7q4/R77Ofv/GpfV1NPTVBQUFdYUFBTVlVec+3i6eLc2tbNxsC+vsDBwMLAv8TIysnL1Nzubl5OSk5PVltcW1VSTVBUW258Z2BdXGFbW1xdXlpbW1VRVFFJRklNTk5OT09MTlhreu3h5uhxX3jp3djSzdDS2ODf4efg4N/VzMbIzdDU0M/UzcvKysvP09PS1NnY2tnocG1kXVdTUE5NSUdHRUZMXWZu6eHl4uDn7HlsZGZfXVdNSEQ/P0BDR0tQVVtXWGHx3dLOzMnEwsTDw8XHys7P0NLOy87X2drX19bS1uT0/Orb2NLP2d7v9/BwbGdgX1pSUlBNTlFOSkxUYHHz8XFdWVZYXWJpdnNbVlZVU1FOT0xJSUpOVlZZXl5n+9rVz8rGwsG/vby+vr/CxsrMzdDU1dbb7H57eX3/69ff5NzY0M7X3+Tf3O1uaGJv9nFmWVZbX2FgXVtZVlJOTlJXVE1KSkpNUVtiXlRQVFxbWWh69+zm3djQztHX3eTbz8nFw8HCw8bHxsG9vsDGysnIyM3V4Oh9Yl9r9vllVFNST01PU1paWV5qeuTa4PRnXVRNSkpKS01MTEhGRkRDQkNFSExQWGBnaXJ25dvPyMG/v76+vr/AwMDCw8PDx8zMzMzO1dze4NjRz8vLys3OyMjJzdXicFtaWFJPSUVAPDw8PkJER0pLSENHSlBRU1RWWVpjYGRdUU5JSU5ZaHf/49/g0s3IxsfHzMzHwb69vL3AxMfIx8fKztDT19nW2vNwZ19eXF5jZGBXTUtHQT9CSUhKTE1NTU9PUE9OTkxNTUxMTVFUWWBreO3s+Ori3uTd0M/Pz9HT0c/Q0c7Ly8rM0NbW0M7Qzs7R3Ojp63NgVlJWVllaXFdXUExNTE9XW1xZVU9NUVlaVFJTUVVSV2RgYGlra2plcP52d3nvdv7e3N/wbmh18eTX0dPRztTQ0tXQ0M/R1dbZ0dHZ4OttaHJqaV5US0tMTlFYX2JfXF5oYV1v8ubyamtrYFpcZWFbZWZnb3B49fHw6eLe2trj39/g3NnZ2Nnk9fj9ZlZST05SU09SUk5SWWVuamrz83Hy4er9bP31efHw4eP2Z2dfXWX35+Tf5drf3dHP0M/O0dvm4ODi4t3h7G5v6t3jeGxycFRRUU1KRUVGRUtQW2daU1tlXVxs6/d4cXhwXmBdW2JcW1tYYWf66+7u3dfXzcnIy8nIx8vNysvMztTU3ePb2c/X4OHubFhcaF5WWVZUTEdHRkVAQkJAREhKTkxJS0pKTFVcXV5cXVVQVV1haWxraGjv4dfP0dDMyMrJxMbHx8nLz9LP0tba6v5meejXzs/W2NjY2dbU4vNnYlpPTUlFQT8+PT0/QEVDQEJEQkNGSU5OTVBZWl5qb37y6Nzd18zIwb++vsDCwMDCxMjLy8zPzczO1NPS19rVzs3P2N3qeWNmZl9dU1FOSUlKS0xHSUlEQ0RJS0lISUtHREdLTElGSUlHTVlobWb06O7n0sfFxcPAwMPEwcDEycnJy8zMzczR2dnh8P7t4urp7f3+Z23o9GZbXV5ecu7p4nBeZGFaVl9dU05LTU9MT1xUSk5bVFb249vW4NzZ2drY09XW2NbQ0tTPztTZ2trg1s3Pzs/Z3drh7OjpdGhkaWtiaGdfVFJRUVZaX15fXFNVUlBWYHJya/jr4djTzdDV1NLR0s3Ky9DY4N/6ZGxzZVpce25fbvfoeGlva29t39Xc7Hh7/WVjb29qW2B2YF/++XVdVlhTUFpwcWZeXG1wXmnw5d/e2M/OycK+vsHDw8bGw8LFy9HW1+Dw497leHvn8XP57PJeUU9LR0dKS0pIREZHQkJHR0hITVpZXXrl4fV17vF27dzZ2OT96eXt5N3d29jMyszJx8jJyszN0tDNysvOzs3MztfZ3PH9e+rxZnB5dWldW1RLS05QTUxOT05JSEpKR0dKT0tMU1pdWVdYVk9afdjT1tDO0NPMyMbJxsHCxsS+vsPHxcLIzszLyc3P0Nnn6d7d5/Hu9mtbXV5fU05NTEZDREdIRERFR0NERUZDQkRISklOVVRWWmh5avzd0dHOx8bMzMrJxsfIxsbJzMvJztLQzsvNzs7P19nU3u/o7HdmX19aW1lcZWFdXmN1bVxdXVhSUlBHRUpISUtLS0tMTFNdWF919+rx+eHc39rQzdja0tbW09LQz8/RzMvMy8zLyszP0Njj8P5dTlVVUlBPTk1NTE1aXVVWUVBRU1RXVVFVZFlUZm12/uvj2tro3NDZ393e3uPh6OXtaW74ZXPp8+3r7ubf6e7e4PZya21yampgXFtYV1hZZ/Z7e+/q6uB6Z3BqW1pdWFxeWllYU1VbV1Ja9e/n2dXNzM3PzMzNy8zOzs3T2eTj4tvk49ba6+nn5fxvZ11aTktMTEdHRkRGQ0FFSElKTlBVWltfV1VUWl1STlFNTllXWWZw+93T08vDw8PCv7/CwsTFx83Oz9nb1tfc5uve3uHr4Ob2631mU0tJSEdGQUNCP0JFSUxPTU9TWFxtbWBeZnFkV15ZUExKT1FXWWb33tzYzs7Py8bHyMXCwMXHxsfJz9PS1dDOz8/Q1tLT2N3c2X1jY1lRS0lHQ0FAQEFBRERERUdGR0dCP0RHQUZITU1MUV1qY2Jr7tza08nIy8rGxsvMxMTIyMfHzc/Nz9XW19bb39rc2eDo+WtlXF9hXmBdWFtbX/Tp8ex+Z15kbmxwYVpUTkhDQ0VFRUVISEdNU1ZaXmFtfN/Vz83PzM7QzczJx8nKz87Oz8rIys7Pz9Ta19nf7H1uX19ZU1ZXVVZXXV1ea1xTTlBUTUxNTkxNS0ZHR0dMVVRYa/bf2dHOztHTzs7X3NjX3uDi4+7t9erc3+jo+Wlue+jvbl9kY1lYX3hsbmhgYnnz39PP09bY1dHU0t9pZ3poWl9paG5uX1FbYW3i1dXX0tLY2s7R2d7e2uPr7vLl5v5qXltefPt1cGZjZWdy+V1ZU1FfXFFaXFlbWF5jWlxpX2VeXmVhZGRaUk5OWF9ka3nv5+DSzMfDwsLEw8PAwMPExMnP1NbT2uTv7nt5fP5yZ1xbV05MS1FNSEpMSENCRUhLT1pkcvt68ut6+u11b2d67WhkdW1jXmltc+zn183NzMrIxcbCwMTFxMHDyMnIzNTe3N3e3drS0dba29zf8O9nWVdOUlBKTExHQUFEQ0ZCR0xOSEJGRURGTUtKTU5XXVdaYHV+4NfXz83Ix8PCvr+/v76+wsbKycjLzM7T6Hjj4+Xm4OPve3N1aV5fZV1WU1ZecGVlbGRfbHBvdnbvdF5aWVpXT1JPTEhHS1BYW2/s5+rZ1dHRzs3OysbExMbJydPT19fZ4Nve2dbb3drf6Ojd3enj4N/f9HN4bGtpdGZiXV9oY1ZWZVxTT05OT05VVVJPT1FPUV5ocvnn2NTT2M/Mzs7NztDSzcrKy8zN2PdgZm1+b3ttXltOUlNbXlpaW1VZXf3j4OX2cW536dzh1tXOzdLU09bZ3+x3b3Fr/Ozn7u3x5+Pe3dnY3tPV2NHZ3+V9Z15lc/x7Z19cYGVtcmlcV01NTEtOVFtXT0tMTFRcY2t1XFNPWWFoZW38a3Nv/ubc3Orv+/rt5uHb0szP09LPy8rGwMLExc3S29PY5Oz77vdfVE5NS0hKR0dCPT08Ojw+QURHT1BPT01WXmhrZ/f2fOfr29LU2N7p6fPi39TO2uPs4N3a1M7LyMvJycjAwMHEy9Db3djUysvP1uptWVleYVlPS0lBPT4+Pjw8PT4/QEFGRUFAPTw8P0FER0pUWE9QWmVra+ja1dLPyMfMzMnFwsC8uru8vr2+w8XDydDTz9XOzdLQ3nFfYWVgZmFPTEdCQUBAREVEP0FESU1LTEtLSEZLTU9caHdiWFZYXWbm1tXd2dHWzcvMys3Ky8rNzMXBxcjMzM7WzsvO19nOztLS09Xc4/lqV01PU09KSkhHQ0NIRkRDRkhISUlOTEVLTEtJTm3zZ15ldnJ229fmbXF27d/UycfKy8fGyczIxcPN2NHT3dzc3f1jZ3Dv/e/Y2vdkYlpLSExOTUdJUk5SU1ZXTk5Ybmlf5djhd3F96/Ld09TX39PNz9POztru9Ovf2NbMyczW29rxam7o4W5ic2xcYGVqXFx5du7s4NLV73BnW05HRUdGQkNHRUJCREI+QERJSkte+Pb859rV1c7Ix8fIxcHAwsHBxcvQ1tfa18/O2unybFdNTlBNSk1PTU1VWlZTVlpdX2Xs2+ZlX1lMRkJAQ0JCR1RXWGxzY2P64tjX18nAyczEwcXEv76+v8C+vL29vL/J0Nvf6X579/JwYWFXT0xLUVJNS1ZrWVxjWlNSXWlaTlBaU0tLS0I8ODg5ODk7PkJMT1lcXGXm1drXysTGyMLCxMG/ubm5ubm3ubm3usDGztryXV5oXE9QUE5NSk9WVlVSUU9PVmVYUVRd8WBWU1lZWFdQTklGRkVGSUZJSlN5eWhnd93T0svIx8S+v76/wL68urm4uLm6u7zAy9fg/FhQT01NSk1WVE9RWmNhe+HrbWrn519OSUpIRkVEQ0JAQ0VCQUZISElOV1VUXufb3+ff3t3XzMrFwcO/v8DAwMPEv72/xczNyMze/GZUT05PTlFQTlBTTU5TUFVgdW5bUFleXFNQTEpOXWp45+zt6Obp3uf38t/X2t/h18/P0c7T1tbLx8XCwsXFzM3K0drOys/T2drW1vZlWlBOTkxLTlZaV1pQTk1MSU5MSlBKRUdKQT5ER0dQWGFz6t7U0NPMzM/P0tXY4tnOy8nKy8nJxsjCv8XCw8jP1tzj2uD9bmVgZ2v7c1pWT0ZDQEJHS05NUk5MTlJOTlNUU09SWmNWVnn3Z3zt2s/Iwb6+wcLDxcrM09LOzMbBw8bDw8fHycnO19rd43pqbHhpYV9bYGBvdWZaT01JQT4/QD9CRkdEQkVAQ0lIQj4+QERMV1926N7YzsrFw8TFw8fLy8zLzsvJyMfGw7++w8C+xcvi6+7+fvrqe+31dX56+mtYTkpLSUJFSEVFRkpNSklPUUpVY21VSEtKSUlUY+ja1s7LzczQ0c7S0tDNzMvGxsLBwMDAv8bBvL3Gz9DvaFteavLp6+Pg3eZvZmdXTEVCQEFCPz4/Pj0/Pz0/SU9IQEBBP0BESExNXe7f1dHQ09je3OHl3M/LysnEw8C/wMS/urvDz87X5mlfXltcX27u6eZzc/tvWFFNTExHSE1NTldYTkpVavFRREtDQT1CTVFPWnfi2trb0M/R1NDQ09XPzM/MxcC/wcO8vL3H5eloV1BSV11XVVljaXJzaPx8YVZXXVhQT0tGQ0hJSkFBTUpHPzs7Ozs7QUpKTl584NHO0NPW1Nva39jS29fOzMnFxsXHw8HDwMvd43RaUFVYVVlXX2peYGvzcFpQT0xIR0hNT09bXFJJSlpaWE9IQj9AQ0dMUV1sft7Uy8nHw8LK1dPMy8rIxMbGxsLExb7AwsnZ3fBpbWBmXlRNT1lnaGVnW01IS0pJR0NDQ0FDQ0dISEtKRD89PT08PkBAP0ROVm7319HRycfJzMnGwcPKx8TEwsLAx8XJyMPRz9La4Xj1911bXGJ1ZVxcZ2BbVVdOSEhLTU1MTlRXTVBVUE5LTUxIQkVMTE5QV1lba9rTysLAvr/Avr++vLu8vb/CwcPCw8HGys7Q2Ovc2d/h/Hfyd3h9/3VeUktKR0hLSEZAPj4+PkFDQkZDRkZFRURISkpJS1VXZ+ve3tbJycjGxMW/vb/AxMnIw8jJyM7OzMjDwsTHx8nQ19TX2NTY3d3ncG9rXlhOTEtMS01QTE1NUE5OTEpMUE1IS0lHTE9TXF/83s/Jwb2/wL+/vr2+vb28wcPEycnGxMjLzdDU1dTMyc/Y2NrZ29jT1uBmW1hOTlNQTUdFQ0FGR0xRT01KSERDQUNGPz1BR0pVcPDn2tLMxsC/vbu9v8DAxMbIyM3X1MvM0M7MzNXc5O3e2NTOzdXd2dnf3Ot2ZVBNT0xPWF5eVE5ITVNbYV9cVE5NTEdITlFWVmjl2MjBvby+wcG/vr6+vsLFyc7e3NHX19/17+La09LY3eP5efjo6ev2aWFbUk5RTktGQD0+QkRHRERGRUZITFBYWE9SVFZbZf3e29rc1svHwL68vL7Cx8zQ1dXZ5ezo5d7Vz83R0NvZ09XQ0tXa6mldW15ZVVNOU1NPT05RUExHP0BER0xNUVBNTlBRV1leY23s2c7IxMDBw8bJx8C9vb6/w83W5e3g6Ozo9N7UzsnJyMzacFxba/z58mxVS0hGRkdDQkVEQkNKR0VDPzw5ODpBRkpUWk5JSlFXX2X72dTLxb++vr7G0+H05dXPztTa3ufw6dzW0s3My8fGyM3U43JSSUxTW1xvdmVUTExLSkhISUZETE9PTEdFQDs6PD5ETU9ZW1pf79LKyMTDvry4t7m8v8jYcGR79d3X1NDO1NPPyszP0trf39HQ3XBdTkE8PD9DSEtOT01CQEE/Pjw8Pj4+Q0ZEQj88ODc7QEdNVWzc0tjOx8fHyMjHysvJztfkdVtSVGvpz8rEvby9wMLJz9zuc2xjbu5kWVNOSEFDTFRkX11vYVlUTkxHRUNERUtZXE5LSkVERU1a/trXy8PDwcDCxMrO1dTOzMjJ0Nff5/196djLx8fExczM2e1jT0hCPj9CSUtGR0RDPj1DSk1NVFpUTEtLRkBCQ0JIUWH9aV5eWVpUYO/e087Jx8nLztPd6Orz7eXPyMfLztHLzNjQycXDxMjN23xnVktEQEFAQkxXU09OT1ZRUF1lW1dbW1pUVVtTTUxRXWvezcnIy8/O0djXzczQzMvKyMzMzNDPzcrLzcPAwcTLzMvS3uLU293e+3NpV05GPjw6PDs9Q0VIQkNGR0hISk5JTE9PVlVYW1hYWm3o3czHw8PHys/b7nV5aWDz49jQzMnJzcvHwsHBvr6+wcXK093rfPR99+3s7/jxcFdPTUlJRkZKT1NPTUhFR0pMT1hZXW/37N/i+fTh18/Iwb29wcbIzdHP09bY2NjNzM3IxcTGxMPDwcHCw8zW2vNfWE5JRkhHSU1OUlhVT0tHRERFQ0VGQURIR0lNUVdfce3Z19LQ0NHT09TX29fT0tbg1Nbd1c/Oy8nKx8fFw8HBxMfHycvMzM3P3efo/2dcY19ZUFddZ21dWlxaVFJPVFJVTk5MTVVXWGB+49TSycjJyMvLzNDQ1d7e3dDO1NrZ09fVzcjDwsK/wMPCxcbN0dji5e3s72hYT05LSUpKSUpLUFlNSkpKSUhIR0lLTFJXVlRWYnTx4eLa1dnPzdXY2+PydPdzbfPc1dPW2NPQzMfFxcPDw8HEyczS23plbWxjbnT27XJkXlhXW1NTXmhmZltVVFJOTldYVVpdZvft4N3e3NrX2d3c19PQ0tXT2Nzo9ezh39zV2NfQzc7Q0s/T3drZ2+n7+W9ZTktJR0NFS0tMTk9MQ0BARERGSUpLSk1QTU1KSUtMT1/t5erj2uduamVr/Prc2Nvd2dbd4efl5eXczcvOz87Q4nluevZ2fefl/Xh9c2VXUVBNTVZgX1ZSVVNLSEpPUk9OVE5NU1ZSTUxUWVpj3Nbf3dzZ3ffs3t/e393h6d3d2NjZ1NLT2tPR1tji5e51XV5eXVxSVFJRUVFOTk5OSUZDRUlFRkhGQ0JESkdMTU9PS0tLTlBUW11YV1dmcnL0+XZrZWd5/+La0dHW0MvJyczKztzk9/H89enl5enq+/bc2d75a277cFNNV2ReVUxPWV9dVk1LTE1KSUxYdWZbXejV3urf3trW3+Hr5t/n+WNjeHHr3s/Iyc7SzMvO0Nfu4eDZ5e7g6/RpY2BbVlxeYW1aUU1MSEZLSklLSkxKSUxMS01LTEtPZ335cWhpcmpYWmluZl5pbnR++OPk29fZ2dHJxsjKysvL1NbQzs3NzM7T1NTS2evs/Gpgb/Dr7PRuZGxdX1taYV1YVl1laHVlY3xwfuLa1djY4e7h4fRyb/bv8G9139vVzs7Pz83MycXGysrS19Td3+zw4ntzaWJgWFtdW1tXV1xia1pdX1VUTk1RTUtPUVFRVFxcWl5fYF5rdvHneuvxa21yc/d0b+zp4+Td19fOzMzKzMvIyMfFwsTIyszOztHW1Nzs7u/p6OLc2+Pg19fc4O1xbF5ZWWJ4aGpuYWVz9uXf2drd3eHi4vx7dGpmWVddaOfd2NLX1dbU1NPT19TZ1c7X1tDV3fT77P1vbm5maXtxbvzxal1cXFpXW1JRTkpLSUdIR0pOT09QWVtu8vD1bmdhV11fXFxeaG9s9NnVzcjExMO9vby6u7u7vLy9vb/DxcjR3Ox5eu3k397e2Nnb2Nzr8HFra1xaVVVXT0pHRkZER0pMT05XW1RVVFFOUVVaZfTe3dnX1dLQzsrJy8/OzcrIxsPJzs/Q1NjV1dLP09LT3uj2bWRbU05KT1FQUU5KR0VDQUBFSE1LTVBPU1hcVVBNTlVcVlxeWVtp9vft3NDKxMK/vr68ubm6vLy8vb2/wcfP3N7p9vzw9ujo7t3b3+PfempdXFZPTUhGQz47Ozw7Oz4/RENFS0lITEtLTExXZ3vj19fX29fP0NTZ1dTU0c7NzszKz9HX2NTQzs3Kzc3O09Xd4+RuX1hQTk5NTUpDPz4+Pj5ARUxOUFJRU1JPVFJPT1FRT05OUFRSUFVeZG7gzsjJx8O+v8G+wcXGyczR4ubua1RWW1JOVmBoYGFrdW5pcGteWVpXT0pISkI8Ojs9PD5HTVZSUE9PU1leY21wefDk3dnZ3+zw6t7a1tXU09zp7ens6vL5+Ona1NjZz9Phb/ro6HZsfun9a2BVVFVUTkhIS05OS05ZW2lubnn04+Du/W5pal5YV1VRUVZWT1NZXmX32NPX0M7OzM7R4On5WlFNTEdCRERIS0tQWFpdeN7Z1dDN0Nfh92RVTUlEQkBHS0ZFSlFZXmZnbXHdzcfFyszP19jY3fL17ntr8t7k8uHofu7q5tnR0M7SztHS1d7e6Obo5tvb5ePg/HNsbm9gYmFVT1NPVFNZaGNrfeLZ3vDs7X1yamhgV1pYWUxLTkpPU11pZXng2NjU0dXb3OPn7HBeXllST1JTV1pYV1dg6NjQyszPzs7R0trsfGZlW1BOUFFWXVxbW1de4dPU0c3IxsjHyM3V29zg7ejs++7r5ufo49/W0MvFwL+/v8DEycjL0dbX3+fvbXBgXWBjZmtlXWVraGljYFtXX15iaGppXVpSU1hTS0tOT1BRT09UUVRYWFls/+3X0c7Kzc/N09zd1Nvu+G9dU1JNTVFXZ+bX1czEwsG/wMLIztHa3/RuXVFNTlNTVllcZF9429bNysjGw8PHxMbHys7R2N/g5vr68PD/6OHa08zMysrJycbEx87W3+r9a3JgV1BJSk9RUExMTElLTkpLTEpJSk1OUFdZWGBcWmBdX15edWn4/Gnv7evp9Xl8693SzM7R0NfT0tTQ1drg6PpxX1hPS0xMTlBYYGbv4tLLzs7MzczNzdbydV9YUVFUV1hg8Ojf2tbLx8fCvr/DxMXFw8fL1ux9amZcaWxnbWBy5ePl29PT0NDT2ezycFtWTkhCPz49PDw+QkVHSk1LSEpOWWBjem5eXW10aXN0fm9eXmx0+eDq6N7h19TYz83Ozc3Ly8fKzczQ1NLW3+j0cF5ZU01LT01IR01TXPzi3drRz8/IxsXDyczT3Ol0XmBcWVdVWF5nbnvn2dLLx8LBwL/BwMTL0t5wXE1IS0lIRURERUNDSk5henPs7PDxbmdeT0tIRERDRENGSEdISUlLT1FXWmVuavPh7fX35t3d3N7v+3Bl/dvX2dre4+jh4t7SzNHR09HX4uPg29fZ3uDu+3Bq+PRrYF1dZm5wZGh8+N7Z19XZ2M/Q0s/Z6X57YFlrdV1lfW7y6uvq6Ofv7ePZ3N3p8fteV1JJRkdDQUJCPz48PEBHSU5l597Wz9fa2eP/dXhtVUlKR0pNSUtLSktOX3Di4+vY29TO39rX4uTq5OR0b15eXV1geXT97+DY1NXa1tTPyMrMyc/U1tjT197o7OLn+W1pWlJOTU1RTk1VX+7Z2NbZy8fQzMjQ3OxmXVZNSUdDQkBCR0pJTE1QZnZeZvXz4t3m92tbVlZTTE1MR0VGRUpNTU9SVHDZ08/Ozs3N0Nbc7XpscWteVVNNSE5WVVljcm5r9+Dl7Obh2tXY3N7l8O7e5u/x9Pzj0c3JysrJy8bBwMDAx83MzdfrdmdfXV1pamX8+/zp7XNnXlpYX2V0b15XVl79YVZOS0tKSklHREA+P0RHRkpSY+rb0c3Lyc3QycrW2+5qaFpST0tMTEpPX2Z38OXXzcrHw8LDx8bDx87c9mRWTElISUdIS1ZeZXJ26NfOzMfDwcTJx8bKztjZ09Tb4Nvj7uz3+d3X1tvXz9HSy8C7ur7EwsHFzthvXWVdTkQ+PT5AQ0NAPT9HT1dUVVlfZnhqW1pbX1xXUk9SVVNVTk1RV1xbZ/jZ0c7LzMvIyMfHyc/Z4+P5YlpSUldTV2Nyd23y3tbR1dPNysjKztPi6ftraWNqal1ucHLw39bVz8zHwr/CwcHIzNPb531wX1VZX2JkavDi19DNycbGyMbIyszR2N72aU9KS0lAPj07PDw6OTw/QUVJR1BfaHzj19vf4ujubv5kW19QS05OT1FUX2Vp8dvXzMrJxMLDxsLEys3U1+DtdVVTV09OTEtQXWJffOPR0M3FxMPBwMLFyMjL1NjmcGxhXmxjX2R0bGjz5NPRzszMz8vIyMnO1Nzsd2lcV1RPTElKTExMT1NbYWBu9mtecXxzXVVXTU5PSkZESktJTVFVV1dbXWNdYHH9dvPT0+Tg3+bz4+F+fnZuYVxo9+Xn6N3WzM/LyczMzc3U3eHo6u99cGtr/vp97urp3N/ZzM3NycjMzsvNzs7Q1tvg7nZqX1taW15p2tTT1NHS1c3Hy9DT5mxhXFJKREI+PDw6Oj4/P0JDQEFETFVf4NfY0s/P0NHV2+H0Z2BSTktJSUhIT1RXXF9w9OjY2+Dd4OTq8NzU3eTk9XtlZm1ZV1RQV2tfZe7g2s7JyMC8vcDAwcfKzdHxe25cXGRtXlhZX1pl8+zl1tXTzs3LycfGx8rO3fV4al9WT0dFREVNUVBSVE5OTlBWVVFMRENCQEBDRENGS0tPWVtYWFhRT1deXWJ99O/f1tXb0M7U2Oft9+32X1tYVFVne/fr6e3r597re21bWFxkbuvi4dvX1djUz8/OztLT0dPSz8nKysnJzMzL0NrpYFNSVlhZXF5fa/Xu8uzc4dvW1dbd7X70Z15bXlxOS0dEQ0NDPz5AQEJFSExXcPLh3dva18/Z5/xfV05LS0dJSEdKTldmenp8a3H87trV2N3b2dnTz8/Oztrd3ODrbmBdVlBLS1dzdeLZ29LNysnIxMbLzc7O1M/O09jl/nf9fGxhXVtbcePk08vLycfHycXFx87a325YT0tLS0tIRkRERUtOUlRVS0dKTFFPTVBWWVx+bF5xdWlpd/xaTUxVaOTnbWBdctzQzdvub3Tv+HxbT1VmcHBfUU1bfPh9cXVu9ezr5fh+6ODTy8nEw8TExcjIyszP2t/c29PO0dje3+r8enD36/Dh6eDi5d7d39za59/W2tfX19/i2uXi19/m6Ot3Z1pNSUVBPz49Ozs9PkBBRktc4N3d2tva2ufb0u9xbl1paVtbW2huYF9ufHHw693V1NXZ2djf5tjQ2Nna7vL/YVdUWlxQT1RSVGJ16trb2dLPysjFv72/v7/Avb3BytHb43v97HZrfvPq393c693b3dnTy8fJzM/Y2ehna3BgXlhUV1BNTElFRkRARE1TVmFlVmNxZ/DleV5dV09QT01KSkxLTVz1+nnt5eLp3tre2NnWzs/b9ntjV1dXXGX16vv08Ojo7vzm3t/d3NjTzs7P0tjc4+PVztDQ1dbV1drd4Pdtbunj4tnT0dHMzMvIyc7QztHZ3N3Z1t/xd/z7ZmBoZVpPTEtOWFJJRkNBQkNFSEpMTE9aYXHs6evueXXp29zpd29mbHRdX2hpX1dXVFhfbvl3cXNw8Obp6eDlfPzt3NfY2ObzblpdW1xdWFpg7t7Z19jRzcrIw7/AwcPExsrR3vJ2XFhVUVRZWFxnX2Vvfezg1MvJycnJw8LJzM7Q19rc5XVcT0lISENCQkNERUVFRktIRkdMV1xgWFZbVFZbXlxaWVtjZW9uXmd1d3j74+jm4+DY3+x3bmRbY2NdVFVkZ25rXVpWWV9ea+zycWV93dPW0tDOztLRzcnHyczR0tfh63r++mpofOvj2dbX1NvY2+ri5n14Z2ZubmNnY11eZvPn7uzwdmRaYlxcWlJQTkxISEVISElMTlhbZGx2e+t5e+x+emhcWVhRTUxNU0xKT1Zbbe7x6fP93+Df1djf5vzt5up2+mtTVFRZYV9ZXVhfaH70+O3q2tfMys3Ny8jLzszMz9rl4/h6bPzq/O/t+Ph5dfD47trV29bMx8fIyszQ29ve929cVU1EQD49Ozs8PT4+RElLVF5hbHHm2tfY2dva2O31eXT+Y1xYW19eX2pteXnk19nk8/N3ZFhUV1dYV1tfYWRjbfL7eXp06dva1c/Y3OXz49/p4t3a0c7S0s7OzdbVz9zf4urt6eLm5Oz3+fTn5eDY09DPztPQzc3P08/S1+F+a2puZGlcV1hbWVhQSEpLSkxLSEpJR0dHSEtNTFNXXHje1NbV193Z1NPU1NPY19rf7/DveGRgcG915d3b2NnZ3Nzi6PjxZ1FXVFBYVVZYWVtg6dbU2NfPzszHxcG+vsHHzdXW1dv0bXNkZGJdXl1o+Pnx39fSzc3Ny83W0c/Y1tfd2NbZ5flwbltSUU9OSEZFREVGSExPUlRdZGzv6uPd2tjl+nN8eHdgVk5JRUpNUVxcZvzm593a19LTzcvKx8nP2uDsbWRiXFtaWlxoev3i2tHT1Nfb29vb6Xf7enDv7N7Z3+Pi2dza2NTQ293Z09PW3uDp+una3d3jfe/v6Obwenrv9ezw/PZ7dndpV0pGRkZGSEpOS0xKTVVVXlNRYF9u9/pwbm5t+t/Z6u707+He2N/743Zbd/N4XldYTk5PVVheX19v7eb19uPe3Nbe29jb49nS5314W1xu4+nw3dfPzcfBwsbP0c7S2OfwX1BIQkVMS0pQXu3e3NfQ0MzIx8PEyMjIz+P6aVtdWlZOSUU+PD1AQUNLTEtPVFpbXVdPVVJefu77bXB5fm7r3Ov4bmNsaH59bmdcWlZp7vHo4+rj2t3Y1N3m+mVgXlpXT0lGSUtLUltkb/Pr8ufd1dDMx8fGwcDCxMfR4+91Z11obGdgbWt249jU1Nvc2t7vcm1rWE9OTk5VYV5ea+7j2tXU3ebw721bWVJMR0ZIQz9AQERAP0ZMUVxy7dvZ1MzLzM7T5n15X1JXXlxaYmRgcXz48OTd3uLi29zr9GddbmVgcvB9euXh493d7eze7Xpr+PpkZnTr6uTf3NfQ1djS09LR0M/Oz9Lb3dna6Xr2+nBt9+ro2dPQ0MvIycjIzNXf7WteU0c/PDo4OTs9P0JJTFRv7N7a09Xb2tbV3Ofn+3V5YWFnXk9OT1RXXXH439XT19rU19zb4/xvaVtUXmBXVlZbX3Pm1dDP1+fe09nudPv1/H7t3NnX0czJyMjKycvW4erf5W9dVFlcVE5QXv55fO7z6dfWz8jDwcjNzM7P0dLW5Optav9rWlxWUFBSVlVPTkxJTEtEPz4/P0RKUlt349rRzsbDw8PFyc3R2ujzcF5bUUpISElMUFxva2/66uXa0NDR09rc4eP1ZV1UVFJTUE5ZVljy1c3KxsTDxcbFy87P1dri5nv95+jo6nxz9Ojl3ODm5nt7+Oje3+j9dHb2393c4uXd3drd6XR5dGBiYVpbVU5MT1NUU1NZW15iafns3d7c2exsXllWU1FOTk9RXW/x8vXk2M7JxsXLztPo93JcUktISEtOUVldYVpdeuTa2tbV2NTU0NLR1+Xn6/lybW/+5+zr6N3P09DMztDR1t7k4ul0Y19cYGpufH797dzRz87O09Xa4OhoXFBKR0ZFREdHREFBR01UV1p54OPg1dLPzM3O0NHV29zg3ef7921qbmRrX1ZXVlBPUU1NTFBTV2Fjafzx6dvSzsrIzdLd4uhrWlVUT0xMT1VXWmdz/t3QycfGw8TKyszW2uF7aW5RSkhHTFBTVldj9d7Z0sjIxcfJydTN193a7fxlWFBcWk1IRElNTk9MR0VFR0lLTElKTldaU1hcYHja0dXTzsnIzNTl29TP22pqbu96VVVnb1tSVFhdWVNYW2BgWlpcXVVUXmprbu/o6fHh187KzM/U297k2dLa3+X/d251al1gYVtgfOnm7ODf6uv+a3RqXmNraWlvbWtnbHJs8d3e3+Li6fJ4d2VbWFBNS0lKS01NTVBPT1hob/Hn6Ofu4NbZ3uDoeWljWFxdWFJNUlxsfe/r693c39rS0tbT19/Y2dzuemVYWVpdXVdeXFJWV1hfXl9ndvrl2M7MzsvMz8/Q093c3d3c8e3qcF1WWVpTVV1eXmtq89/Y0dLU1NvY2+Tj4XdZW1hUT0tKSUhKSUdIT1NWYm3z6/X16uXh2NTOz9DO0dna3OHvZmlkX2NfXVxcX1pRUFRST09YZ3z2/PLo4NXPz87OysvOzczS3N7g4eLe6PtzamdnbGp4/fh98t7j8P727u3d29/h4u3y73lmXlxdY2v9793a3uXp4+jm3NnY3Nvjdm5pbWZeWlVUUFFOUFFMSkhITlBUWWH36eLe1NDR0dLNzMrM09nj7Xz9+vl2ZV9jZGJfW1lVU1VaX27s7O54Z2Roevn9bXL6+/L8+uvu6+LZ0c7MzMzMz87Pz87O0djb3t/r+nVmX1pXWVRUW1hVVVhcbPno3N/c2tjb4en1cF9ea3Bze3FiWVJTVldbW1RSUFJUU1VYXl9kfOTf2NLU2eHm4t/f3+jq7u31bHl6c2Rea/r6e/puZFxedurg2tnY2tnX2+PzemdZWmBnZm5uZ15cYWNl/+vp5N7Z19bU09HU1M7KycrK0N7w/W5na2dfWlZcZ2x2dnBsZXns8u7q9mpeY2xudHl2dGtkXldPSkdGREVJS01SXV9j8NzTzMfGyMvMztDT2uP4bWBfaG5sbl5QUVVXV1tfX2NndHz27O3z8Ojl397i3+T3+evk5Obl497j5OPs6u15b2tpeO/m3tzr/fHs5+Dd4Op6bWVhZmNdXWRr79zX1dPZ3tvW2d3g3+b2+/t3bGdeVFJPTk5NT1BOSUdKS01UXWptbWl67eDd4OXo4trY1NDR2eHb19ja3eD2c2plXFpXT1FWWmRrc/z7fm169Pn57NrZ29vd5e3tfnZvbXp77uHg3vD45tzW083Nz9Xa2t/g9GVaUlFSVV1hY11eZm78eHr0+HlqamVqa2h469/e3tvc4PB3bGJcVVFOTUxLTVBWX2RqevXo3dLOztbe4erw7OPj5uz3/Xp2cmhcWFZTU1dbZG1t8N/e4t7g5Ovq5Oz79/X+ePPt7+7n5Ofo6enr7e3t7PD+e3dsaP3ueffn6unm5ef4bWpoZHn48ODl5d7Z3eDi+m5mYmVfaHNrZWpvamlubWtkYFtXU05PTk5QUlRTVl5pbnDt7Obd4N7f5N/i4t/Z2dnX2NXR0NHU3fFva3duYGBcW1tcZmRjbmlr/PDo4dzb3N/d3fRrZWBkY19hZWRmZmRoa290dfXn3dnW1dfZ3ePp9fn2+enp9O75+urr7+3r9u/4+/X37vLw/ffv/nBdVldSUU5NS0pNUFBPVV1ZXG19++7g3tzY2tvd2tvd2tjS09LT19jW2evzeWNjZF9dWV1jX1teYWRiX19ocPXp6ebk4OPs7u/0//3t7u3s5+Ph4d/f4OLs8fN8dmliaGZlZl1bZnT459nU0dDNzM7S2OdkVFBNTE5PT1BVXWNt+Pru4eDj397o+G5dWFVVWFteYnT87urs7OTe3t3d5uTt/nz/eP/3+vHrdmxgXF9fZGNtcXL97Or6dnZfX2Npbffj3Nra2tzg2Njb1tLP09vj6fjy+2lsbml5eO7k4tzW2eLn7nRqX1tYVllWVFlhYnH+dGxnZG13+Org29Xa2tfd39/n7/B7a15cYl5cY2BdaXv88+nf3NzZ2elzYlhQTU1LS05SVFpw7erg3ePj3N/o5+nwff15eHB8+PHl3t7X0dPV1dDQ0tTZ5/hxYV5hY2Zob3N5a21xaGdsY2l6+X16+v5kX2xkYGpz9d/Vzs3Nzc/V09jf3uP0cl9WUVNZW15mam55fXx3b3j6bmlpYllUT01NTlBUWF1ibezp+vf5/e/p4dzW0NLX1tbe7/d4ZV9fYFxcXl5o++/n4N7d3+Ld4uDf5ujp8vx9d2xkX2dyb37p6+/ye2JbWlVWVFpcZ+rm5N3c3uDd2trV0NDPzs3MzM3R2ePo73tlYFtaWldeYWRkW1lUTktMTElKSktNUFVSUFdaYfzZ0M3Ly83Pz9Xh73JiY2lrbvfv5d/a19jY2eHt++70fPp8eHNwcWVdW1VVVFFUWVlYV1pZWlxcYGr+6eXc1NTa2tjc5+HZ1NLNzM3Jx8nKy87U3ej0eG1qZWRsa2x2bWFaVlhaV1pdWVxdXVxeWVVTTlBWW3d+fvV1b3RuZ2p39+nj3d3g2tvo7ef6eG9jY2Jw7eba1NLT2+D6ZVlPS0hJSUtTV1hYW1xcYG7x39TPz83N0dje6nv57+Xg39vd2tPT0NDS3OXtdnB0bmNecPXv5+x6aWNjXmBz7+ri29bY3ulsWlBNUlhiamV0dnBqa3h3+vn49PnsfmlvcGpvbGJeW1lYWWBt+ufe4OXn7PT0c2llXl1cX2htYlhTS0xNTVNbaPfl3dTX3+Dd2dvb2t3d3uLe187Ozc7R1tvZ29va3N7h5PJmXllUUlRZV1tkbHzx6/B4ZF9dYm559erj5/Ht9/vt6+Hh3tvh39rU09DN0NfobF5SS0dITlNVW2BeXF1iYmJmYmBdXFxXU1FLRkNFSk5VW2rr3tnUzs3NzM3NzdDR2NzX0M7JxsnM1d7teWtlZG70//v1cGhfVVVZWVdUV2BlYm59bm1qZ3fw49rX09Pb3tva3Nzg4+PtcXD56+Pg19TY3/FvX1ZRUFRbXl5oaWdvcHBrZWJeXGBmZWpiWldUT0xOTk9QVF1eYnf57NnV1NHR0dDPzcrJycnO0dn6Zl9aWl9q+/Lu6u3t4uDo6uxxYl9eZmRfXltfX15haGps7+Xq5d3a3eHb4PF+dGdnb/bf2tfU1dTX3eLrevXg5Ovr7/12aXZ9bmJZVFNPT1NUUlJRVFdUUlBNTU9PV2l98+vi2Nja3NrZ1tLMxsXIys3S2e9sYVpZW1xhZGJkZ2Zt9+jm9Hl8b29uZmJhXlxfXl9eXmFu+Oba1M3O0c/O1Nno9u949enq5ur2/v9oY2hmbXf36uTm3uLv5+xqXVdUU1FTWFhXXFxeX1xeZWBdZHH87ejh5uff4+rq6+je1M/Pz87P0NPd7PlvWlJYXFpdX2NgX2hsZF5dXV9ramhrZmddWl1eX2Beafvl29PQ0s/S09DY29zd39/o5uDo6Oj0+2xjY1tbYWpx7Ont4+Hj/WJgXFlXWlhWWl1fX19jXV1oZm3u2tXV19XX3NztcHr48evg3d3d29fb3+Pv+G5mbHB6cm5jXmVramNeW1tfZmJeZGFcWl5ta2ReXFxgcPbo4ebm5Nvb5u7o3+fy5N3Z19zl5+t8ZV9hX15q+uff4d/d4f9yfn38bWVhWVhTUlRVVVJXWllfduzx6Nrb19PZ3uLe29fW0tPUz87R1NTX3+v1ffTz7HhoZ1xaU09NS01PVlRSVFNXWFpld/d8dHX15d/c3tzf3trj8fn69e7s7ezm4dvg5ePs+GxkYF5fYmtnaHrz/WFbW15lbWNbYF9cYGdlX1lXWVdcaHvp4OPd0s3P2dvW19bRzs/P0dPQ09nc4erzdv/u6Oz+bHH9bl9bWFZTVVpWUVZTVFZbXWBtbWtu6d/e2Nfc2dvf8nBtdm99/2tt9e308+vq+f/8dW96c2xvamZ59vFnXmFmYWJgW15eWlxcX1lQUFJPU15ofe7x5trb3Obj1dTWzsvLy8vNz9TW3ert9nF47O5+cXX7eG1uaGVpY15jbGdnbnRpX2FiX11ibvzr5+Tb2t/m7fh5ffrw8v/58OTg5O3s6vV4bn77cm1qaG90b25hWFNPTU1MTVdaW15fYF5bWlpaaXr34t7f29vd3eLm3d3d3dzX0NLT09bX2t/h9H73+Hd4cXXu8PxuZ2ViWlxnbfjk5+rs+HVoYmdeZHnv5+Th4d3g5uXk2tzf3t/g5OHqfG17+H38cGRhZWNiY2x39/b9cmlgVk5RU1RZX1xUUlJNTE1LTFJfafzj3tzb3d3d1tPU1tfU09LS19vc2Nnb2+Dt8uru9e3l5u5zZFxXVFNRXG/45+rv+Pd2aGJeX2V65ero5efl6ujg3NfV1tjSz9DQ1dve2drh7nxeU09UUFJVV1dSU1FRVVZVV2b29Pd7bl9dWlVTUU9SW2V48u7i6Pno4NnW297e4d7d39/a3Nra4uHtfPDx9+bc2t3tbWJXVFdcYnLy7fJvcXRtcWNaXGl87d7Y2d/l5vL26uXj3tvb2tPR19zb1tTS09vrfXdta3b+a15aV1BNUVNRVVlmbGReW1dUVFFOTUpMUFNaYnN+cnb6+OnZ2dbQ0s7Ly8vOz9DY3uP4ZnJvYWh96fVqbGZYWVtYYP7w6u/r6//15/hsaGNlePbq4eDa3+nj5+zn7vPh2tbR1NXW3+Le5OTrd3Bxa2r99XheVldSVFdYXmJ1+/b693JiYl5cWVdVTk5PT1NeYVxeXGFqbPbn39XRz83MzM7T2tvf6+f7+fB0+vN8d2ZZXl9XWWj45+bl3t7g3ejw+mJdY2Rtev7u8H31+nv2fG976NvU0c7N0dPY3dzc4eTm7Ovp6vdnXVpTUVFSVFRZYF9jaWNfX1hUVVdUT05TWV1rffTo6u7o7ejh3tfP1NHO0tTY29zj6/f9cHVxY2NcXmNdXFhXV1ljee/56ODj3t3a3OH3YWRsfu3l4e337e76b3twcenc1NLNzdTY29jY19x8e310a2NfWFNSUlFPU1hcYGRnbG53bWBgX15dVk9QVltbXGdz/v1+++zm4dbU1NDOz9DW2dfZ2t7xdvnq9Gpham1nbmheYFxaYWJyfXvy7Pnr29rle2tsb/Xofm3+c21ybGpraG/4+tzR0dPW1dXX19TY6/Dt6+xraWleXFhRU1dRT1RWX2Jja2JfYF5ZVVNOT1NWVk1XZ2Jp/ubj3tnTz9LNzc7O0tXSz9Xf397g5+75ZGp5cHxwaGNeWFVZWmlvam9u89/i7/35/Pb36+x89uvt59/p7+by+end293g2tvf19jd3t/i6H1sa1pVWU9PWVRSVVVcXWZ6cGFsZ11lXlhXU1ZVTk9SUFRcZP7j5+Hb3NXT0NDV29rb3NTY3tjZ2Nvh4ux3eXxsfvJwbWxna2z38m1pcXf5493k5ePe83HzfG1maXVsdG5saWz26dzY19fY0tHU1NbX29vn9vF4aF1YWVdUUlVVVVhYXVdQUU9PTk9RUFFUV09QVVVaXnPu6dnY2tXPzc/OztLX2dfa3Nve4+Ph6ft0fGlfZ25yb25lX2RkYGNsamv15N3X1tLT19vl7vn9enz2fP3+c2xx6ufp49ve5d3l5N/j4fDr6n1ma25bWlhYX1pcXl9qY1hYW1VRVVVaXFhgW1pZUE9RV1lmcXzm697V09HR1Nfb4+Ll6uDe39ja2Nfg6+zyd3BobfpzcHNta2BcXF1idvXr3Nnb2dve5XZpbHZ3cG9ubmtu7+DY2dzX09XT19jX2dvZ09fd6np1aFxVVFhVU1ZcWldTT05OTU5PTlFQTU9ZU09RVFlfbe7u39rZ0czLy87R1dvi3d3j3d3Z1tTU2uvxfGhnbmR5/WlqYVteW1ZaZ3Lr4t3T2dfW3uLofHrv9vjre/bzbffm39vh5d7d3Nve39jc2tbd4exwbmVbWFpYV1lWWlxeW1RRV1dWWFlVWFpWVVJSVFBPUlddbHNu7tvW0M3N1t3f4eDc1tbTz8/P0dTV42tmc2lnbW1wZmJoYF1bWWN09+Pc3dbV3uDi7fL8bGlpd3tkaHrx6ePa3+Lk29nc1tbW1NPS19XY3vBrZmRtZVhWU1RWVFJOTkxNUFBQTVBRTU5NVlhSU1NYXnpxcebf0s7My8/Q09rb1tTU0NTW1NnX2/RpWlhaWVlZWllbWVxgXGl+797Y087Mzs/T2tne6e93dXxpaHVz7t/k4+Tx7+fl4ufn4unw7u7p7XNwbWJrfG1mZGZteGloYl1cW15cWFlYUE5PTlRXUk5NUVVVWF1u+efZ2NbV2ODe297b09LS1NXT1tnh+2plXl1dXWVoZWRgZ2997NvZ2tPQz9XW1t/s6fVkXl1SVFhaavDh3uPc297b1NbZ2NfS1tza4O/p73R8+Hr4a19fX2BZUVJUUVVWUVBNTE1KS09PUlpVUFNVWVxjfN/Szc7PztDY1tjZ1tLR09jZ3OPq8WxfYV5ZVFVZXF5dWVtiav7k3dbW0s/T0s/S1t/q+2laV1VWX2fu3N3a3eXd3N3b3OLe5e/s8PX4a218cHnx/XJtZ3Z9cnhlXmVfXFtcVVFPTE5QVFdPTktITFBSWWj03trX1NTV1tra2NbT09fY397Y5Pnu/Xn6aWVfX2NcWl9laPzn39nb1dTa2tze2dt3ZV9cWlNTWV9u+Ofi2dvZ1dfT0dPR097g5+3n7Xj+8+7o7vf9b2heXV5cWF1dVlVQUlFMTE1OT1JRTkxKTExNVl5u7OLb2NjU0tPRz9PPztDS19Pa4uDufH34bmNdYGxfYGlhYWpx8ujf3Nza19ja1Njg52xtdGZjYmx4+/rk3t/Z3N3W2NvZ4uz2Zv31am/4bvbqevF5e/FnaPL8bv9rZ21bXFZOUU9MUE5LTUxJS0pJTU1RW1lt7ezZ1tfOzM3N0NfU2dvZ3N7d4efh6+zucvP/bevs8Ofu+Ovj4eLk493m5uX8fGdeZmBeZmprdWxy6eHa1tHPzs7Q09rd5enycW54dv/++vL59XpsbmhfX2BcXFdWVlBNTU9OTktKTEtOTk1SVVZXVlhqb/vb1dXOzczM1NXX29bX39vc5eTt//VvenxlZfb0++nx49zm3t/f2N3a19ri5+jp7HNmeHd5altod3b46NzT1Nze5e38Z3P5eGRv6ezwe/Xp6uDt7t3k83v67vhvY11WT09MS0pJR0RJTEpLTE1PTk1OVl1le93SzczNz9DS2tvZ2NTX29XU297p7uTn8X3q5PDz4Njb29zo3uD4/334eWRo/PtsZmdiYF9eXGnq7N/PzM3P0djZ3Ozo5OLq9u3k5fR1dnh6fvT8eXZkY25ramVbUU9PS0tLSUdFSUtMUE9SUFJWWl5q7urf1tPQ0NHW3N7d3+De3Ojn5+rldnr1//F08O3o4N7X08/Q1tLc6+Dl6+js8+bf9Od9XWZhW1lidvLl5Nrb29rq8XBr9ern5N7g2OJw7Xh3/f56593v5+R+5uT0cV5TTE9NSUlIR0dJR0dKSkxJSU1YX2f87d7T0dHQ0N7e2dvZ3tja1dnt4efs3fN579/n5tno387R19bb8P93bGBbaGJueXPg/nT4W1td7mj52evVztXQ3uDpeXn53vTl197l9/hoYWpcZXvzePn+c+z1e3paXlRUS0tMQ0lKRkpISkxNTEpaV17+fOva0NXW0t3c2Nnh4ODh3efw/Gb1a2L78d7i3+Dq3NXPz83Q2dLZ3+t1b2zzbXnn7eB9XmxybGn28OvY29XX3t3i93B66ufp3Nnn7Ol7bWdpYWzn9ndw3uJw5O16dWdWT1RKRUZGSEdFRURGRERGSk9SWm7b1trV29ba4d/R0N7ZztHW2trvbfT2buTV3Oba2N3bztLbztLe3tB8W/lbU3BsY/DtW3n7UXHjZefT3NPO3NXW9N3aeOXX6+Te3N9ubvdcW/FfX+j8Y2jm7Gxs6W5Y811LT09CQFBKQUtMRUpKRVBcTmrdbdzO79/V9+jY3tTQ6tnP5N/m9/ljbep65M3i79fd39jLzt7WydfqzeBaevFUWORxWWhmUFdsaeTdb93O893OcPfVcnjW6NfO+t/Ua3Hrbm1hftTtedBtX9boZmrj6FtZX0xGTEVBRklGQkhLPkVPSlRlb/fn1eJ94OFn49je1s/L1dfN5H3Sdlfg3+Xc1dPt+c7cZ8zM/NfH4Wjf31hY7mRa6OJTVf1lUPjT+HbLz2jVzG5mz95b3sri3s3kX+HsV1zsXmHf72zz53Np+3lZdN9gWGpURE1RQUFWTz5LW0FAXlpEYthpaM3fV+3PXVrL0GzOwt7eyOVf3dtV/c3h7czR6c3K5trH1t3Ly9/a1mVh4/pSfNpWUHZbTXnwWH7M72zR4ltr3F1r0N35zMjn39L5X+X4WerWbmbY6F7o215i32NX4OdKWHFHQlpQP0xYPj1SRT1SbkhT0vJf1NdVcMxyX8fKfsvA+HfJ4VDd0Vv4w9ptx8j9y8Lw3sLW/svMY+vPYVTa6k7r0E5M1G9L381ce8LaUs/SSl/NZlPIz13MyFp3yHZM1uNO4NBQWdBfSdLsRHbYSVfVTkjfUT1cXTxMbz07Z0Y6YnY/XcpTVcjtStbNTvbC52vBz07Wx1BcyWBOyM5Uz7953L3VcL/HacjAZt7CYVfLdErV2kVc1k1SzWpOzM1Y3spTWNFfS9rVWNzHe2nI2l3Q2E72yl9Xy/pM1dlIZdVOUNRgSdvnRlNvQkVlSjxNSjlIWT9D7F9J4dtN881eW8vXZMjHYNXGbGPK+EzV1VffynHfwdB6ycpxzsT838LbZszaTtzSUVzXV0vc6Et7z19ky+xQ2uBNa9hfcMjQa9TJ/uvJ6V/R017jzF9k0G1OdHBLWOFbUdz0T2xtRUxtRkBVTD5JVUBBWFBKdPJRatlqadfcbc7McufM8V/X4lPn0Vpjy+Rdy8Z13MTi9sfO8s3E4uDJ5lzV1lZl21pQ5HRO9dlabdB6UuLoUWrVYGjI1mrPy27ozP1vzdRe3sxeXNRvS19qSVjjWVPf9VFo8UxOcko/UVA+SFY+P1NNRmPsTVvUblrQz2jWyXr60Oda6+xPZdBuWdDPXdfIcunF0XPLw+LbwtBuz81l8MtwU+HcUl3kW1Xc5k/szlRV0HxN385b9srmYM3NVO3LfPnG2FvSzFlo1VhL7XhLZNVXVtB2SG3kTEppTD1MXD89T0c8TmlETNxtTd/RY97C4GPMzlLw0FNO0+FX2c1m9MTRW9XF59/Cz23Jw37kxORizc5RadJaUNn4SG3OU1XSe1Xb2VBo0Xxf0M5j48Z8WdXfV9TG7e/J0V/mzlVP1HdGaddLTtVqRWbcTUX1VTtOdz08X0Y5TGZCSNh0S+DMWWLC1lrNyGdrznJH6c9RXMjkT8zHX+XB12jFxGnYvtpgxsli28D4UM/XTWnOWUbf2Uhby/xR19FNXsj1TtDJWGLH6kzezlH3xORdx8VddcZrTt7nRlXRVknc3Eta0lpEY1w+RWRDOUxROj9kTkFu3UxazuhXzslk58PnVNXcSVjQblPPy2bhwdv7xMR63MPY7cfK793F1fzL0Fx41VtQ6mVKat5XYM3bW93RU1rP/1TVzmjqy+lU5eBYadHmbMzNcODP/lXzYEhZ81RP4m1Mft9SUfFNQVJSPD5MPjpOWEZW41xR3t1Z6srjX9PLZPjRXUn77ktkz31dzMr0zsDY7MLJ5se+1t3G1OTExfziy/tV53RGU3tSVtTXYtvTWFrV9VPf0lxyythg2NtTZtH8Y8zNd9jK+XLR7Uth21VV23VOaOtQad5VR1pRPT5JPTtJSEFVdUxT5GFR6Nlt58vzYM/RU13aV03d5FP0yOjwxsnozcLZ2sHK5szI+/TH037Q2FZl31NEWVZGXdljZsrRWunQbGPU6Fnl02v1zPlZ3dpa+M/vds3TYeXOfl/Ze038405Q71xKa/ZNU3tOP0xKOD5QQ0BcXEpj2GFb0dlc6tBkas3sUu7dU1zbfVXl22rbxuDsxczfxb7OzL7Qd8/L5d3J5GPQ401l+EtGdXpOa9htcNPfWdrMYFnedVLZ209nz2tN2NRa4crjes3XW9vOXF/R4VT65kpQ3FhFbmZDS1xAO0tEOkhWPUb0Ukva3lrszP9b1d9c4+BTZc7tVuPSY/jH13jIyPnPvs/WvsTfy8hi7cXlVNLVX/XYWVD1XE1+4FhnzNpszcj55sj+U8/SWfPLflvL1FHnyWFqxd9P19hSbdVlVNn8TG1xSU7fT0NsYEFQXD8+Wkw6SGRDRut1VtXOauXLeFvV+FF09E1a119L5OFe7st+Z83XbMnB0867x3jHxm3oyu1eztFq3c9cWttfS3TwTHfO+3zLz17q1Fpf1PRX2Nhd7sz4WNXXZ+PSambV5VXt1V9z3WNZ7WFMZmZHSmBPQFBQPUZVPzxTUUFU32Ba1N9e2c1q8cvsV93cW+/fW2vN4GjOzl7uy+B3x8fqy8Hl78bQWfvTXmrS613a4FNv32RQ8f1f0tPu1cpxZs7lac/NbenG3GDQ0lhv0PxS5vFOXndUUO9wTGfwTlbvW0xvWklcZklGXk9DU05ATGdKS9juUfDVWmXO317Y1VVg3VtNbWZQe9tl/9bpYtjS89XH2NbByNrDxO7cyN91ztFs6Mv8YM/oUXHfWmDY+13t6Vh2z+Rjzcn+3MnicMvbW9rOZF7YbU1470xY5k5L3nJOZOpYV/5RS1dWQUhZR0BQTj9LZU1K5WBGdtVaaMnZasrFZfTJYE3a31XjzGR40utl09Vi383s5sbL6NHM7N/J31zX1Vv9zupx1e9O6M5bXtH1UufdX9rL5+HDyeHMzH17zt9b3NdRU+dRRmdZRE5kSk3tYUrs2U9h1mJMcl1GWWZJSWNNQ15zS1HqVEvu6lXmyeb2ys9q5eZOW9tbUtfaTnbOa2PL4k/axu7hwc3bxMnhysf/8crbZ9XOZG7XXVTbdUls7ktS5V9V1c1r2L7V/MjOXNvG93bO+1N86kxV90pFZl1HX+pMZdhdWdl3SFxrSUpkST5WVz1MZkdLdE5J2/xO4Mfd4sDL+M7WV/nNX17P+VHf11d2zmlT291Z38jr4MLV3MTNXtnKYfnJ41fY20/qzltV1PZN5tZZ98jg5r/F3c3Hc+/I3VzV305a5ktH/E49UFg/S/tNTN7uVeDRVF7WW03nakNUcENKe01Ld2FIYeFUZNVtdcbPYNHNTmfSU07Z/EZx0lJoznRS3d5X2sbu173K0b7A3MzF4NjF3W3O3Uxu01FS2lRF6exKX89jZ8jW5cPMaNPKY97FeWDK+Eve4UZT90JE7VJC7/hKe9dOVtdUR+deQV5qPkZkQD9vTz9w7Eduz1tfxtJtw8Nu1cReV870UN3jTnfdUV3bV03kd1Hd0WjZwd3jxM57y9DxyMp6zs5Y8MpfWcv0TdTWTevMZuzD2d7A0W7O2Vbf01311VVO+FZDW1Q/TVdAT99OTdJ3TtbnUNvWTm3UTE7oSkV9V0Fv80Rs3Udfzllow9twxuhR03lE8eVIbtFMYMxYVNJoUs3aXcbHc8nA6M7AeuTA+WXE3VnP50vZ2Erp10lm0U1XyGNWw9NtwsZi0MlP+MVk8MNoU89ZQ+tXPm5qP2zdR2XQTFTQUErYXEH8aD1V/D1H60RF3FFFznFFzdlMyr5ozLxeeMVTT8xoUM5uSc/tRdriQ/zQS+bBXPS+5HC/1VbF0kjMyFXSxFV7v25ev9lSzOhOzM1PzL9e0L5s38BUV8hjVsZtSdZoPWliO1leOlDoQk7NUEzMVkXNZEDa7D9p2z9Y1UZU1ExO0VJH0V9IzttOycVT18xJXtZJVcxNSM1cScjrSs7PTtjDYNC+9NO71+TA3FXH4U7H0UzSz0zZy03lyExby05MxnROwdJXxchU2MhN4sNWd8VcT89aRdxdQOtiP2PqR1zjTlf3Rkl2S0ptUERrXUNb501a3lVZ12pX1t5ozMvsycxZ2tJNdNdVYNpWWthZWdlaU9znWNzSa9rK6OvO7XHZ+mvZ3PPX3O/Pz93T0und2uXh3ubqz9Tbz9Lp3/VbaeZZaOdbZuFiUWVVSltXT1hUUV5xWlv4XVpjU1hfWlliW1JpYWPybWD09V9s71505v3p0tf23fZTaWBVZmxbYuz1e+5u7tje5drW4dzT2dnW4t7X29/d4N7f7vXx5+Hl6uLg6N7e+ezn6+Da297W0Ob05eft3+dy6OR3+ftfW2VqYmNaU1RVTUlKS05QTlJYVFVUTlFTUVVmaWBv6N/r69vf2dTY2tXQ3O3p9mZnemFfd3Jpc2xdYGlv+u/78Onq/Xh3aHHr3trU0tLT2NzT1c7W2t7d1t7U0tbV0s/R0Nbg3uZrb3lobWdgXGdzX1leVlReX2RfWlhXT01NS1JZWlxkfv1nXlxdXVtq9HFseuz97fxw69/l8uXe+GtgWV1jXV5kZWdudvvz/unj2drX397X53X1/G/33trYz83U09vs8enp5+fwe+vqdd7p6dvT09XR49zkeunq2tr54Hf67GDreV/9enhxbWFPUEpEQEFHSU1OT2xdVV9TT1FVYGzrbvDg39fp19HZzN/a2fPgZWh5Z254emxfamhvZ2Vt7uN8eellX2tZU1Zbae3c2NDQzcnb1dDTy9bP2NrP5NrQ3NnUz9HX3O7o9V9ibeRw+vJPbvZcVGVtXXD5XWhmV09KS0lGTU9SX11rYFtaZVlbffr67drccePg/fLc5u/h32RjYVRYVGFlXWljYWhu8mz15tPa497j7HdreV1jdWt83dba18/a39vW1tXS19nZ2unk8ujj3+ra0+Xq5X1u6Nvn3dbnb+jhcHfn5O/l7m1fW1NKRUNDREFISUxNTk5JTFBPUGrt9d7P1t7T0dfTztDQz9Te6X5lYWZmYGxlZ2JlY1tqbG7j8WX6aVlYYldQWWRb6tzi2dHSz8nMycHJx8XJzMvO19ni3dfa4uXpenBhaHZqffRzZ2hrVVhpY1375/1q+mBPWVVKTU1NT1RXXVVLUVRNT1lg/eDb2dbV0tXi39rd4eZ8dnJoXVhVVFthUmFka2v16/feztfw4Pht9W9nXVh83Px25OHf4+T+3tDTz8/OytLR1drrd+Hv7+Tz/e7n9Xje1+Xr3ujc9mHzdv7c7/be7GtdWk9ISENCRkVLSkhGRkhARUhEU2zu1c7MzMXGzc3Kzs3U6uTc4+tpVltaWFVZVk1WXVxtdPPk9ndcZGBfXUtNYF9sdvLf2djd0M3My8bJxcDJx8TO39TW9Oh4aW1t/Gtkbfh7ZGjuZVhnV1ZqcH3p3+bp+W1qZ01JUkxMV1RITlJGR0tNTlBfcujUyszRz8zW2s/YZXjubF9hZFBRUE5XVGD1YF783eTZztjp2933bVxZWlZoYGDs4uns5NnYzczJycvIzMzKztbX3uBkYnpob/Jq+eLl/e/m+/l8Z25sXvHg493R4PjfWkhJS0ZBTExHT0dGSEBIQUVUU3rwz8nLwsTDyMzR3N3b7Ozuc/xeXl1PU1hOV1tdXHre6drW7OD1V1lSUk9bVVfra+va29bbyM3Pvcy/vdC7zMq+Z71L5eNF2UfbSmxc9mXqYW1kT+JJ403VaeLP68v232ZRXExNTktTTFNSU01OSkhQTFRfeefczdLVxt/S2FrQWfTfTc9C41hN+kfkS+la5HbT38nU0MnqzlPZSF1XTGNMZlxj6mrq3tnN1MnMysrEycjGz83c52xie1pc+lTe8WfLVNh3YM5DylTq2n3Kacz62VJqR1pAUk5ETT/yO1VEQU1AVkhS7VXU0tXHycXKydDS293j6X5naWJeT1VOXk9Xa1fsbN3Sbt/NTd3wQdBDSNs71kpQwT/C/t+6YbbVwcLMuNLAyMTNzfzTXXRZU11J61LbW2xcaGhfaV/pZd3q6e3X1vj5ZF5hSFthPHRQQdg8UGk8zjxW3Ty/R9HKS7hav/7myE7WV+dYcO7mTORL+V5O0UvJY8jfzdXjy2XOT3FmSOU/U1JE3U1f6VnQ4evE78rD97vXz73cxMtsx+tQw0PY3Ee6R9vPRL5Hb8w9vE/pxz++RtrgP8Q8Y1Q61zRXUjnWNN9FS9490kne5XLL6sfRxs/MyfPLaNvjXt3w8W5VXV5LcFZZ5lfa+VrbalzVROJvPck7bGY6yEB9zkO6Yc28VLPtxLpXs12+vE2zSMnbPL050l1FwTrJTVLXP9BK8PZs1VzX7c9u1P353UrfQ11RQuM9XFBA2jz3Wz/IPc9sSrxJvejrv1HJVt57X9hn02TaWuBVV+tN1VXZ2lfKU83eTsdE3Vc/yTj3UD7KOctbYcZWvvbLzc7H4MXPwNbC0NjMWsxV5Oxgxk7P5k/IQNNpRMI/x29Jvj/BWl3JQM5HW04/VD1QQEpJUUlOX05rTdddd9N8v+LIx3fFavfJS87aUL9L3NlC10hVeUpc3VhY1VDt8U/eXkzfT0/bQuR4RcRR58ZTvdbmumO9wl2z8MK+Y7tj/M9jctxfZs5O8OdC+VFD2kZRykPT2Uq8UfC9QMfhSL078941xThQ5TLIOlrhN8RBatNDvFLKyVC8QcjlRbs+xOVLu0XP50nOTFfRTtrcSsJM7c4/w0Np1DvBQV/gPMY+7OhFvUDG0k+1Rr3Fc7Nfvb93vufexF7Kyk+9TuPPO8A/T9k5v0FeyDzAQXrKO7w+1NA8uzfbTDvTMN0+SuI7ykLd5E+9Tb/R7LdKumvgwkK6Ss3YT8I+0FhW2DzOR1rVQMQ/4P0/yT7LV1rMTcZN4vdY2UrQZtPaX79bxsl7t/fAwGi7fc/MZcr93XLebFnxPuhLQ+A64VBGxUbazkrEbGvDcN7GcvXURXFnOP1DPuo6VHc67mBOyVfkxVvZzEzL3E6/WW3ER8/pSMtNW8hO9NZPytpJxWBRxkVwy0bOz0LGWj/APU/KOMzcQLtIbrhEwMNYtNrhtWvQu1W/xEi7+k2+PW7MNMlNPL875845vVpGuz/Vyzy4WlC8Oc9hNsk2UmU4zz9ob0rITMfc3b1Yu+5ku0XC3Uy4RenLPMNIRMM63GlBvT/a2EHDQeX8Q8tG0G1bwkTNV1THPchiZ8FDxNZdwG7Nwv3Dy/DH39rP7dfy4lxo8UJsRktgOuRIVd1BxGpbv13Myl+/3P/IYPt3TVNMTUFUSz11P1tfQMpM39JTvFP7x0zO9VfKa2fR+2DZYFrfVWvZdH3T0GHQ2lbSYEzWakbYakjaWkvcTkrcUU3UXGDLYdjG7cnEzszFzM/FzNnC01u+503OTkh2QEThQ0nPSlXFT9jCSMTTRL9yS8dDUs06WWY76z9C1D5l3EXGfG+5bM+7VMzMTMFwU8NWds9F8N87810/0kdaxD/XyELEX1DGPuzQQM9kVMdH2tpKykxxzknLcurHWsHS1MR8vu3dwl3E8m3FTuvdReFGRXg6YlRH1knW2vXG/MLQ88FeyuxTxkpfez9+RD9nOVBRP9pG/NNMx/rex1nL8uPPVsp73txYyFhk0k3q+VXN/VzJ4mjO+2/aU2ToTVX7UmN0THpcTG9SYldVz21qydjaxtbMvuzNvv3JwWzFy1vU3VNheEpLYEZMe0ZPzmxXxtFby9dU0exM0fRH4GhCVlU9UlE9Z3ZH4spe0sJ81cZye8ReYcZfWMpeWM9VT9ZaR9thS9ppTs/pVM7kTubcSWrRS+3TT97PSmbPTE3LUFm/U/i9Yt+7Z/G7Vdu8Ss/FQdHcQtFXQthJQNZFS9I/4NJLv9TgvGrIxU7I71zLS+76RGpER0o+XEJP8UfWXlzDUNTTTsJsXsVY689W3s1f8cldesZX7cpT6M5ebchzTc1XR9xLTt5PaOhQ/FNG40hHz05uzGTP2e/H583Kb8DN6b7a0Ml+0e/+3VraVU7WRmZgRNtKbc1PyuNTxldazlJ5z1xh3UlL7j5Hd0FY6FZn0N1gy9NSzc9e3ddu++/faGrbWm7XWW9l9GZI115JyOxSzfBN7fVMYNFeXMXnWMrdSN7dQ+vITenCV2S+eVK+8U28702+6kvC3UnL6knLfErXZ0j1akjy6VbP3XjM4+DgZdL6ZcluVeBOTFBGS0dTWElofEv42FJl0XRmzeJVz9tQzcxO08Ba6b9rc79iTsV4SsTeQczoPNp4PN/hQtPNROHbRWt1SXPeV+7YXdPeXsps6cVfzcpwxdf2wuFsx+lizWFWz1RP5E1O4FlV2mZU3XZV3fdY1f7/01DpbkTpTEvrSmLkTH3QUnXPUefNUuTQT+zPXOXNYubLe+fObPHRVm79VNNWVtVJb/dH8GVL391dy9BYzN1N2PRQ1uZP5OFX3d9W495b1NZj0Oz1ylvRzVzM4GbVeGXYaFHiW1jYWP3VUOrWVnHaa2/O7mvQ/lH7bEdU70pM3VRJ7WVNbu9cYd71XOHcet3d1Nv6zdltz87r3815dNhdWflaR1xkQ1d0SWPWZXHQ8F7/6VxX3PhT7NxrV+zaU23QenPQz+7PxNvgy9Bf2clNZ8laU9r0TW3ySl3qSk/hUUrfa07b1F/rzvFt5G5dX2hlWGjeaE/a6kLe0Uhl0WJVzNRa1NNc2s1UactiV8/lW+LnUltpVlBVWE9PWf9nesf1Zb7XUNHOVV3NXU7N7Erc5kVvz0l1xVX8v9z5xd5XzdhH2cpI9MVNXsZPV8lLT8pQS8pWR81kVcplYMl3V9X7TOXuS+d3Rdr8P/bzP3ffR+POUNLAW/i+XVfCbU7F01PIy03SyEVfzEpJ21FA/l5E2ttHzstL0s1G+8tKaMtLcMlKXsxKU9hTaMft27rN473cYMVfS89bTspwS8/sQ+jgQmjdQFvZQlTHVE3F3E3Hy0/O20zP3UrT1Unf0Udv10Fe0kJlvldywW1p0Fdd2k5PzF5Qx3xOxvhFzOZD2epBe+VI7ttXzsxZysJK5MNKYsJNWMlZTNNjQXd2PmbMTt+/YNm+VnnETk3HZk3E9E3HYUrL9UbN30bO7UnN7UrL1kvPyknxzUpi0U5f2ElTz05J0U5A3FZKyttXwctQxdBMz9xKzs9SycxK2MxJ7dFKd9tCZdhBVddPVtdqWNNlTtBrTc3YTNnLT+7OSWrbRGfPVuzB2+a/0WjI7ErY6UfY0Edn2khd2UZp1kJkz0dTylFRxmhev2JawWBLxNZMzNVLz85H3M4+W8xBTsdVUsX1UMf8Rs59P97SSHvNSWjHTVrCVkzC9EbN4EXTz0rPyEzWxEpmwFRRxVhNxlxJyFs92vc+dNRIeMZV5r9bYMJfS8jcSs7SRNzQQ+HISfnDXVnG6k7N3krL1UjOy0N7x0xTyk9MzVxKzG1B1+c9981DbsRR7cFUbsJhT8bSS8zLR9XLSOrJRl7GTkvJWEPRdkXS3UTbzUN4xUldwVFUwWlcw29KzuZB38tI88Ra+sFzbMRvTsneRNnOQVnPRE3RSEzJVkjG40jLzkzQylDTxUzow0lZxFhVyPxUx+lLzeFA3Nc+Z81EXctMVstQTMd4RcrVQtnMROvHRnLESV/AT0nFb0nF3ErD2kTKzj7ayEJ4w0puwE1XwUdGxU0/ymZByt9CzdFCzsVG2L9MZsNMT8VNTMBjScLbR8fMSMvDR9LCQ+HCQVnFRkvIT0rGX0jF7UDN1j7kzj7tykF2xkFevlNVu+pUvt9Jw9pCyNI/08xB7c1CXMhIVsRNSsNXQMxsQ8fhRsfRSMnKR+bJS17JTFTEVU7DWkXF9kfJ00vNzkTf0j1fzT9Mxk5QwlJOvW5WvNpOxc5J1M5F3MpH6sVNa75eXMNlT8tfRdlcP+hxPHHiQG/NRu+/UWXAWFLDeFfF+E7I40fU1knZx1L5x1pbzlFLz19HzdtJ08xL5M1HZ8xFTc9KT8hZSMtqRsrfS8jLTsrXR8zyQcheRMVYWcJN8b9JyMJHv9RFwklLwT7nyjrEaEa6SHW9PcbZPbtFT7844OE6v0xMvT/KxEK89Em9SFu/ROLFRP3ZQuzPSd7NSn7QS1bbUFTSa1fM2V3VzlZxym1Q2+5LatVZVdd8S2TdUFfO1FVvzGdI7NNKRtDdRGfD/0nJvWJZvcJLW8J1P/S/ZEXTxFNHzcVTTsjLSUbO0ElG2OI/RdjiQErLzE1Vw8ZRUMnJVVLHw1pI5cthTd7F8kppzXFFVtLiSVDPzlpQ2M1mTe7Lc0hP2utKT9jQU0vw0GhO4cbaVmXQ2lFO7dZnU3LW5lh2zcz2aNLM8VFs3nZUW97dXlnw23ti587W/3ne2f1edOZnUVZrbFdZ5djvbOjZ4mBf8uv3b/3kdFlb8u1rXXDmaVVd8uZrY9/T6PTe1933+t/deGZnd3ZbWWh+allZZGtaaPr2fGdtdGpaW2pudGF26/Xs4NXQ19jT1uXs6PDw+f3u9e7+fu3n5ebj5Od7avj+bFtbYFpVU1xpZmp17PL34+Pr7Ojd3eLr6fJsbvN8bXL7dWpuen79fnxtZfvueHfz6Ot3e3d0a2toYmFfY2tia2x78OnsfX38cGVeYGJydW51/Pjx4d/d3+Pf5Orp5u798Phxfu/8c3vt4N7c2tne3d3f6nx1YFpaW11famlycHz0/Xt7cmlyfXf9bGpyaWpufPL6cHD8ffvp6PDz7+Tl6OLi5Ozn5fhwevFyYm1uZlxcYGBYXm1kWl1lYVtbW2RjY2lqbnr17ePc1NHQ0tbZ3uHg3e9t7ubvfu7q5N/f3N7g5ebr9v9tX1hXWFJZX2pjXWt+dnF17O3t4d7k7uvyeHZu/vP47O/yevjr7nJrbmpmc3B8+vn0+3Jw7vV4bW1vaml0cXFrcnRuZWVkXV9rXVxncGpjZnP3/vPl29zc2dbd7erucWZt//T06eju59zW3N/X1dXc2Nff+G5uYFpZZmZbXGNmaXF1aG1wfW1vdWxhYWBob3rs6Onu7+vo5nf77/vz7ejp4eHm6vTudHr9eXBsbHX+aF1nZmFWVFdST1NVWFZeaWVfZW1iae/t4dfOzc/P0tXa3u5ybXjl4OXh29fZ2t7c2+Po5+3w7v5oXVlVVl1fWltaXm5uZvvf4ern5uLy/n5ybnrv6Onp6/T97fxoanBybGpu+v52/f5tcXJzbm18enV8+ntvfnn0b2BdWVdXVlhcYF9pZ2BkaGZqceba3trS2uXq5fBsZHzx79/Z2NXRz8/T1c/W2djX2ubr7mxZV1xZVVNVWVhYYl9kd//+9Hp3bWRkaGp+9Onk6/Tp5PtxfO7r7d/b4+zh4O779PxqXmpoYGBsdGVeZXhnXWZaUU9OUVFPVWFhYGh2dWls7uro2M3N0NPU1d7u6vP66N/d39vT0Nnc1Nrm59/geml9+19bYF5bWV5aVlxjW1xq8erj3dna7Pv49/p88uTi/nry+m5oamhnffD5fPv6dGxve3xnbv9qXmJ8/HB49+328ev3bGhmVU5TWFdXZGVcW2hzZWd2+vHk29vf4+j6/H3u3tfW2NLSz8zMztbY1dPb3+Ln/2hobmpmbWFVVVlfWFhYW1pddvZ9//9kZ25+6ezy7fT57eHkaHh5bu7e39rn9ed1aXhw7v9nYlteXmJlXGRtem9ncGNbV1JTVVxbYGBiYl519PXz/ObY29rX0Nb2ceri69zR3t7Xz9ba19DY497W4vV6bWZXVl1xbV9iaWtaXWltY2d5/frs3et689zn7d/e6Hj15WtebHhiWmX59nt073hhYGB5eXru7Xl76l5m8X7lam/f5Ht1+GhZU1tjWlRZamZOWG1iZVxu5u/b399oV/l67NDM2NXQzdHVzsjS1s3M0NnV6Gx9XWxqV15hV1VTWldVVWxhU05ffWJccHtYcNnedPLZ0N5qfnpzcOPc+dfc4c1PXNLhVlzY3+DjVk9rZFpWXmXyalvwbVRTa2VcTmnpbWhXWHd77f5kb+ng6+za2//26dbS8uDQ293Mzc7S19Xi6dnab1z5fPpbXe9tXmx1919eam5pYW73eG9sfnhg/eh4a+bddflz/vxaZPd2YeB2Ymlw6XhZbud7benb72hufH1dZGl4dvx3dHZmbu5cV/lpY19WXmFYVGxrW+fm/nJ9+vh24Onb0M/MzM7JxcjKycrS1tXV3/Lk3vNme/NdVl5gWVdfal5aYF5zYlpbVFtYVVxe//Dw8ejt7/pt7/j56t/X6ebk7uZ3d2diamr7bmlqd2ZnX1xdVFVaU1VeYVxZWVtjZF9mW2Jkantzcmpy8G9weu39cejd2tHQ0c/Oy8fJzM3Pz9ra3e3t+Xf2bX3ucm9eavDn4Xlua/Ppbmhib2RNVF5fXF93blhbbnRdYW/v5+Db2/j88ub1amx99WhseuHz5+Ld4Wp+ZV5dYm1iZWBoXVhcWlNTVVxdV1heXWdqXVpbY15TYvnv/9nKy87LxMrKycfHx9HP2dr0/tj1+/H36F1Oa/Zrcu7zZ2T6bl9eWWFSS0xWVFVda2Bl2uRrb9vo2s/HzNDY4trf6fTk7F5cUVRj3n51+fXh6lBZdltVWndeVFlOVVZk/155Zll7bmVzY/xadGpSWVpb9s7O0MnHzM/kzsrR1una3fpzbXd4ZF7f9GBlWOB2Z+ff8eTr6GZZbWZfZG9iYFhUYl9SWVlsU1ZrbNnQ4NDw39rueVXwW1fX9c7qz+dc1tzT3trc4mja525qX/teW1hNT2BKW2NYb1hwXlNqV1xOTFRaeuDc1MrLz8rK09DOzdPV2c/T021fdWjrX1lQUWRYcGhleGf9Y2NqVk5gYVV+WWdqYl9fd3dpa3Bq49DLzNLHz9rW7vLb8Ond597g7Xb4fHLtavJ2YGRVZGBWXFpfW1heWltcZ3BoYPhhX3ltbWxfXV1gb+LY2NDSy8vP0M3OzNHS2M7L5fFseOzl8O1scP9t8vTr9enwe2pnaVZQUFBPUl1WVV9bZF1dXFhWZunl3drX1+Xm2+bi8/ba2uLm7N3d9Xzm13T2e3B9XmtdY1ROT1JPUk1SWVhTW2ZfWlZkXlpaXFdcYf3j5tzR0tXNy8fLzMjOz8zM1tTj4Nzi7ufnbnF8dP5sXPthbmRsfW5aXVdWZmJnZ2ticHX7alxp8vbw6tvR1t3c5Xvt9ftzbvjn6/lu/Ox1enZxW11ob15VXltXWFtaW1xXVVxcbf1scGtmaGptYFpYWF909eXb3dLP2dTMyM7NzM3S19jX5+/p49/1+Op2aWhtdP73cfzq/HdxbV1bXV9eXmhhXWRkXVtXX15cY3z+7ufk5uTf4/Dw5unw7t/f4+Xa2uLn5PJyamViW1laWVJWWVZSTEtRTk9ZXllZWFteVFVYV1pcevDm2M3My8nEwcHExMTHyMnJ0dTZ2N7h6/15cWZeXV1iY19lcWZkZF5aW15maF9paGtjY2dyZ2vz//x06uLm7d7a33729GZfbPdwannp6fP75+xqXV9bUlRUVVdaWF9dX1haY2Vqb3VwamZkX15aXFpcYGNq8OXk187MzszJy87Szs7T2dLS2OXa2u139Op5Z237cWd07vF3evtzbWlybXBeWWNiXVxiZmVgaWtra3F2+O3p39/m7312/nB38urw7t7b3+fo5/peXV9bUk5TVlJQWVpTT1VdWVZcXVlVVldYWFZaXWNfbuna0s/JxcXEwsbJysfNzM3Pz97V6PjrX2pzXW1cV3BmYlpoe2BdZHJ7aXF6dWdfa21hYHb/dHB+8Ojt6t7m6eTq825laWVjZGl5+3Dx6uzt+P9tYl5hYFtYWFtdXl1qa2hlXmppXV5hXlRSVlVSTVNXVVpm7NbTzcrJysvHyczNzMzOzsvN0dvd2eP79fl6bWp19vlrefp0Zl9qcmdiY19eWlhfY1tdaWtua3Tt6/Xo3+Hl9fr7bm94/ff99uzr/e/h7/l8fnFeXWZmW1RUXllXYW5qXFxeYVpTVldUUVBUV1VRUVxpau7Uzs7NysjKysnIys7NzczO0dHa4/D29P50fP1va3NzaF9eZWJcYWxtYVtnb2NecXJnY11veHj45uPk6+/n7HZtaWloaHX1+vjy8O/w8vH9dnZxcG5tbWpgWltiaXd6//lpX2JnYFhUVVNPTlBPTExSW2Z14djV0c7My8rMy8vOz8zLys7Qz9Tb2t3g4+nq6vX4e2poYlpcYVxfXFdaWl9kX2BnaGJgXGF6c/Lm5+Hp7Obt+P378/v9+ubl7Onu9fh7e21hbHhwZ19eWVRTWlteZWxqZl9ZW1tXV05OUE5RUFFbX23s6N7Y1tTNzcrIyMfN0c7Iys3OzdDd2trg4+rh5vD6bWViXl9aW19eX1tfZWppcHJqZGZjYGBlav7s8fbw9/x1c3JubmZmbHf57OPl7XB783RqaHTs8/1+d2teX2ZvaGZ7bmpkYmdbWVVRT09RTkxNUFlfbf3q593Z0M3My8vMzs3LycnIysnKzM/T19bV19XX4/l0bF9bW1xaVFJVVVdVWVtiXVlna2NbY3j8dX708/L37d3q5+33+Hzo5ubh4Ob5dfZuZ2Flcv1sYV5dVlFTWF1WW15lW1lbYFpTUlNVUFNZX15mdu3t7ubZ09XPzc3Oz9DMysvMy8zN0tPT3N3b1tje4Oj8bWpkXFdYXF9cXWNuZ2JkenFfZnN5b3L67HNzePR8cWx6+2hnbX16fO7e3t7m4fJpZWducHp9/HpsZ2pmZWBcXV9hbWxcW1dYUk9PU1FNTlpfXV5t93D259jV29nT0tXTzsvJycnGyMjKzM/X2dLT3Nzk7XpmX1tVVlVXVlZYXFxYYF1hXF9sbmRtbWxrbXV9925ve+/3fPrr7/rp393b3uvsbmNhcGZfZWVmXmFiX1pZXF9eZXBuXFdYWFZVVlpdWFxremx5+e/y8+rc2t7c1tLX1s/Nzs7MysrOzs/V3dzZ2+Pj3+d9aGVkXlpeY2NaXWNmX15od25dZe7uZ2x9/WpnbXpfWl5oal1kevj58+Pa297q6mlcZHNsYmVx/mdobXNgWmJ1ZmNtcFxUWFpdU1BXWFdYX3JoZ2ry7Hh269zu9d7X2NjUzsvLysfEytDPzdTa2tbY3N7f4XtqbGpkYF9oXlhVXGNcW2hyXmD+72tjZ/v7aW17bmFicP5taHTw9v7r1dLf7+x+Yl5fYVxYWm9tYmFraF9ibu1wYF1gWVVWXFZMTVhbXF1heHdz897o6+vh3t/e1tTb2tXNzM3Myc/S0dDR19vW1N3j4N/vcGp8b21nYWFbVVpjYVxbY2t2c/32eGt793BmbXNlam1udHFrcnn66N7d4ux9/HJkWl5kYF5qeGlqa3F6b3Hv825fYmBdWVZST09PV1lYV2Jue/3s5efz9ubh4+bd397bz83Nzc7Oz9HS1djZ19HX2tzd6PR4/vP8bGVuZmBhZmFdWl9jZ2ZjZ2tuam5wfnJkaHJwdGxqaGh4+urn4uvm5+d9bWtlYV1kc3twc3d+9+33/m5rY2ZjXllVVlJUU1lYVVhcYGz04eTq3dze393e5PHk29nWz83OztDNzs/S19nY3eHZ3e13ffh2ZXD2dF9oamleXGJhX15kZ3tnZ2praGpvam5ubXZqY2ZkbWVv8+z37+jqe2Z2fGdaZHBpZWVn/Px4e/fubmz6d1tZW1xPTVJcWVZgZW5te+bd5urf2eHu6uPud/De19fTzszU0s3MztbV0tfe29na7Pju9Wt29+nvdnbw82BdYmdZVGH+cGBidmpeY/33Z19hYFtWWWNlYWXz5e3s4d59bnn0cGV39nZhbvXzbm7++XFydO5rVlJUU05NUVpTUFZhY2du6dzl59rY3e716XFq8tbU0s7Jx8rLysrP1dvU1d3j2eBxZ217ZmV392xlanBjXl9lXFpfbv1qZGX/eW1u7O93a2pqXFpda2prc+vh3ujj5vdxaHdxaXX7Z2Rue3FxaXP1eHZ3/mRVT1RSTlJcZV5ZYXJsd+/p8ent5uT8dGppaXLp2drUzMrKy8zLzNPb2tfb2t/e6X1veXx4+uPl/nV2dWZmYF5bXmdzaF5fZ25qZWn+cF5ZXVpUV15mYGzz5OXr6ur4bmx5/evm5+b89vD9bGV28v5yb21eVVFPUE5NVl5fXWBzfGVr8/P47eXr9f7z/nft4tzPzc3HxsjKzMvP2tXS2eXj5Ol7aG5ua29y+vNraHVuYWBiZGNjaWldXWBiZmVp9/dyaWppXlhebGtp7+Dv/vXueGlmbHX47uXl6/j/fWxjYHF4amJsZ1xYVlZVWFpmdHJvffd8YW/x9Ppy8+16b/f7ePTg2NXQzcnJzM7Oz9fb1NPd4OLl8H3s5enu8Ofn7ft5emlfYmlqYF1qXVNVXF5ZXmBlZ2hpa2FbV1pobfzu6er+dvr8cXjr5+fd2djh8vT0cWht+WtdY2NbVVRVUlFVWmBodXh7eGxnaHB1bf3s+Wz75+rq39nQz83Ky8vP0tXS1tfY2Nzq+vH2dv3v9v768ez4eH1vY19ke29hXmJfWGVnZWJg+evt7vV0bWFcYGRkbnx7bF9gY15dZ2/37uvj5efteHRzamhtcWFaW2BfXmBeX2Zze3V67vZ4cGtpePl8c2twZWn47/Ds3dTPzs7Nz9TY2dXR0NPZ3uXk6OXl5+Xj3eHw6u14am5nXFteaVxVV1dRVVZYXF5mdXv+emVjX11daXX69/DvenPx8ffs6t/a3t/c4ex3dXdraF9bWlhUWFlZWFpeXWVlZXVwanF0e/7o631vcPv48end2drWz83O0dTY3Nve2NXX3Nvg5uzt8+zo6+fm5+zo73ZiZWVkX11eYVpZYV9ganlzd2xwcWxwXVxZW11gZmlmZGNiX2J0/Prt39vZ3+Lq7Px5/XpkXV1eYFteYWxpaWhtbW9ycG1lb/r1aG91aV9eZGpu/ejf3NnQz8/X2tva3NrZ2NfY09XX2tnY193e3Njd5PPz/mZfXmBYUlZaUlBXYWVlY2RgXmJeXFdcYF9fYWpybW1w/O997eTg6OPc19rk6+v8ZGNiYFtbW1dSVldbXFldY2hnaWZyeHn+6PJ7bvz3aG7o3Nvd29jb1tLS2tzZ3ejn4t7g5d7h3ePm3t7p7N/T1uTu8Oh5aGVkXl1fZl9mb/vz/PZ9al9cV1dVWFtbWldWXmlbWWf0/Hp74N7j3Nnd4+fn7G5tbnJreWpval9ocGheYW10YV9w9W5oav1uX1xiXFdkdO3v8eXe5dzb2NnZ2NfZ4d/e2tze2tDT19bU1dvZ0tbg5ezqbWFeXFpXVlZaXF1icGtpX2VaUk9VVFRYW1tWXWZvaXzj2tvc29bZ3d3c2uTr7/dsX15pbmddYWlgW1lbWVtfZF9ka3Nxcn19a2NjZGhmeu3g39/j2tbd3tfU09XX1t/o6+j47+rj4unm4d/e29vZ3OLi4O14YWBlYl9mbXJ0cvfyfWtnWVdVVVZSU1RQT1dbW1xr8ejn3+He3d/i39ve4evt+nBrfXZ1evr5dXlsZV9qaWVnbXBuam5vZVtYWlhYWmZvcHfv597f3dnW1NLQzs/a397d6eTa2t3c2dnb2NPV2NnX3ul4ZV1bWlxaXV9fbnRqXmRjW1NTV1VQT1VYUFBZYmBe+d/Y29nV0dbe2tnb4+rs7W1laWxmX2d+dmlpYlpZX2JmXWn9+215/HVeV15hZF9r9+bt8dzW397Z09PY1tDX6Ojn63V46uDl7eXe3d/e1M/Z2NTW52xiamBYXW1ze/Pt6XRub2ZaV1ZXUk1OT01MTlJZWV773uXs5dfW6uTW1+Dj4N7ucvv0/PXv5uPtfnVvZWZeamlha3RqXl5fW1JPVVpWWmF8e3H0393d2NHOztDSz9Xc4dzd4OPc19zd29XY2dPO0Nfb3vZnW1lcVlZaaGltam1mXlxdWlZSVFpUUFBUT1BUX2xz+d3Z2tza1tnb29ja3+z083pqb357fHV3cGldYFhYV1ldZWducWRlWVtaXFdfXmJte+7u7+nb2NTT0NDR2Nfa3uLm4+fs7+fg4efh3dnb19TQ0tfe7HtkZV5iZ25+++32bmllYF9YV1VVT0xKSUtLTlRaXWFs+vX38uXp4ODd2dva3+nr4+Tm4t7g4e7m7HFuY11aW1xobGhcWlpaVFhcWltcY2ZoYXH99eTd1s/NztHR09fX29jc29ze2tnd2dTU09XU0tPa53ZsZ11ZWl9fXVxjYFxcX1xcWldZXldOTU1PT1NbZW746+fl4t/g4ebl4tzc3+ro9f3p5+np6Op+bGtlYFpWVFZbXWhnYGBjbXBlaXduZWpzcW117uzs6dzV09fb1djf4uLl6u7m5ujn3t7e29nS0tPR1tre7u3tdWZv/nJnZ3R2bHFtaGNcWVdQSklJSUtMUVxfYm19/n788e306N3a2Nva1trh3drb3N3f5vL07f1lWlhWVFBUWFhWVlleXFhfalxXW2FpY2R+49/b0s7P0dPR1NbW1NLY3tzW2tjT1tnd2tfb5evn73JlZ2heVFdcW1lbaGteXm9wbmhfW1RPTU9TV1lleH196+Lp9/zw7uvq4uLj4d3d3+fn5e37//Dze3p4a11aXVxYV1phY2VibHNtYmRuZF1fcHBreOji4ODc2tve5OLd2uHf3uDj3dnX2NnV1NLU1tnW2t3i6PL1925qaG51bGxxa2RjZF1cVk9OSklITE9RUldgZWhnbW9uferm4tvW0s7Q1NTU1t3b3N7j4t3k73tjW1hUVFFXWFVUV1xbXVpbWFhZWl9lcP3s3drZ1dXU2tfa1tLU19nU0NLR0tXX29rd293n5OHh73x9c2VmZWZnZmdjYmVpYmFhXVdYV1JSU1dYW2BkZnRydHL/fv/y+vXv4drY2trd4+Th5erq7/jz8f55bWZeXV1bXV5eXVtcYGJfW15eW1xebnV99+Dc3+Te2t7j39zY2dvY09HX09TW2tvX19vb2djb3t3o8/jwe3J7c3FuZ15dWlVSUFBOTU1NTk5PVFhZV15gaGdjeevw6t/a3t3U09LU0tbU1t3c1drg6efxaGNtaVhYWFtTUlRTT09QT1FRT1VcVVpt5uXp3dTY2tbT0tbU0c7T09DOzc/X1tPd3dzc6OXe3u718/f6dGttfmxoZGhdWVpgWU9QVVNNT1JWVVlZW19jYW57bWX83+z07Nzh6NzU2t7Z1trd3d/f5Op0evJ+a3x5ZmBnX1dUVldRU1RVVFRWWlxaX232/Hzp19ve2tbY2NbU1tfU1M/N0NjPz9TY09La5N3c7/fi5fx7df1qamNaWF1YUlRRTExOTExNUlNRVVtZWV9ob2d059/h4eLZ1dbc1NHX19bS2Nra3e7wdm1sbmleYGJgWlpVUE9YU09QVFBNUFhXW2t1/fbk3tjU0tbRzs/V09DX1tDO09TPz9PU1djZ2t7s6uv7df5yaWluYlxbXV1damFbV1dUT09QT1JWU1VeY1xdZmpmeevm8/Ho5d7Z2dvW1dXb0tDa49/mcnf7c2toZ2FfaWJcWlxXVVhaVlRUUE5PWllba/hwe+bb2dzX09DT1dXQ0trb0tDS0c3N1NbT1t7e4u76+Gtla2xfXmReWl5uYF1iZFlUWFdOTlRVUFZeW11fXltmff7039ng5dnZ3tnT0NPV1tbY2uLw7fFrZ3FoYF5eXFteZF1dX1lWW11WUVBRT1NZXWX16/rp2tna19HS2NPP0dLP1dnUz9DRzs3U2tba4ePm/nN2bGBfaWBZXWxjYXF0ZmZfWFBRUU1NT05MUlZXVVhZXGN08+/i3dza1dbX0M7S0s/O1NbW4/7x63V1+29iX2BeXGJhVlZaVE9WWU5JTVROTVleXm3z7uXX2tnX0tLUz8zP0s/Oz87My8zNzdPZ2d3r6fprbGxdWWBkXFhgaF9faWdfW1hVU1VRTlBTT09aYlhXY2lkdN/c39zX2tvW1dfX1NfY1NPa4Ob1a3j3d2drbGFeZ25kX11aWFtUUldXTk5SVVJVXmdt/Ovk3dnY19HR1NTPztTTz9TZ0s3O0M7S2+Hf5fTs+G5tbGVibH1mXW16ZV9saFlWWlZRT05LTU9OUFxgWVxqem7x3t3g3dja29nZ2NTT1NPQ2OTj5Xtt+O5vaPz+aWhuY15dWFJVV1BNUlVMS09QTVBcZGB74eHb0s7QzszNzsvLz9LNztPOy8zR1Njj9fVzZGdrY2d6e2lobGFcZW5gXmVgWFhaVVFOTk5SWFdYZ3Bmbefc5eTc2N3b2N3g4OPi2NXZ3Nre7376bWRreXBv/PdpX2FeWFpdWFhbWFNUV09OVFhWVmBsdO7f2tfQzs/OzMzQzs7X3dnX2tXQ09nc4fdyc2VjbXv58Obtb2t2eGp6+2ZdYV1VUFBNSkxOTVBZVldle3T/493l5trY3t7f6/bp4OHb1Njd2dz0fentdf3q7fv4dF5aWFZVV1pUUlZUTk5QT01SWFVabP754NbT0MzMy8jHy83Mz9nZ0NLa2dLY4On5Yl5iX11tfm9z9XVgYG1kXGZsXlleW1NSVFJPUldWXGpravnl4ODX1dvb1tvu8flvbv3w7eHd4eTl+2l1+XRs/OvzdHV2aGJkXFpgYFtaXFlRVl1XVF1gXWZ99fHj2tnYzsvNzM3R19rd6Ofd3OHa0t728PNtaHb5/PLr7Obh7n7673NjZ3BfVFRVTkxPT05SVlVaZmRhduvs5dfV2tva53z16/5369/e29jd6uToen7l8G3/6nRib2tZVl1aUlhcVFFVVlFTWldTXWteXf7l6+DSzszIxcrKyMzS09PZ3drY3+XmfWJfYl1cZm9jYv/t9/D3b3jx/Wpu/2NaXF5YWF5eW1tiZGZwfHD73tzd2tnh7ejtaGZ2a2V86PDz5ux4dfn7bv71eH3t9XB1fmpdZ3JfW2VoXV5hXFteXldXX1xbaP366djPz83KzM3Nztfe29zf397p9PV0YmJtZ2Np+vz0397m5uLp8u72amJoZFpZWVJPU1RQUlpfWVtrc/7l3+Pf3t/m5ej1dfjs8unf3+Ll5eTs6ep7dvn3fv54aGZjZV9bXVxaXF1bXFtZWVlbWlldYGR26N3X0M3KycjIzM3O1dja297m5/luZWNdWFtbWmJ6+vn17Ory7O3/dnRxamxtYl1eXldXYGViY2lvfPbq5+Xk5Obn6/NybG1vbXjy7/Dze332+ndrcXf++X73+P12eP10dHN0e3BpaWdhXltXVldYV1tjZ3Tp39nSzczNzs7Q1tnZ29zg4+nw93JnaWhgYXbz7ebj4N7e3+Xv9/xyaW5sYVlZWVVTU1ZWWFhcanBuee/n5+vt7/L6+/f87urm3t7e4N7h5+zz93n673p2/nhsa2dkYWJmYF5jX1lZWldWVlZUUltpbvnf3NnSzMrKysnMztDW2dfa5Ovt/GpkZFxVWV5faHN+ePjx7evq6XhwfG1senRjX2ZhXV1mZWJud37w6u306Of3cvn2ZWRpaWVu8Pn47fH7+/l4cv18eP7t7Pnr6PZ69u13b/5+c21nXlxbVVJSUlBYZW5w+uTf3dbQ0NPS0dfa2dzd297n6OXwe3N1bGNu+/jt6OPi6uvn6Oz8a2hwZF1eW1dSU1dVV15iZWx58enu6uj0/X368/p0dv97fe/h3ebm4ebu8/D3enRye3t+fm9wa2FjZGNgX2BcWltdWlZXVVddaP7p3tva1M/Pz8zM0NLU1dze3OLs9fV7aWljXV1cX2N5eHP78O378On0c2twdHBraWheXF5fZmtw/O3q6ODh4uTo7fn9dGxpYl1aXmNnbnl+d3P29P59/3pz/evo6ubh5/X9fvr7e3dwa2VdXF5aVVVYXF1lfPDx6uLd2tfW19rb2tzg6uzp7vv08PP79/pvbnj+7ubg5Obd3+fp7/xwc3BjYGBbVFZZWl5lZ2hy+v346ur9e/r/c3R+dGtrY2V0+vz96+fs6N/n/O7vbXjr6vj37PZzcHRqam5hXF1cV1VbXFdYZWdn8Onw5NnW2dXQ1NbT1NvZ1+Tu6Ox4bH59Z2ZuYFxnZ19s7/V37+X3efDybHf1dGhpaV9fdX5x+ebn5N3h7OLe6Xt3emNfaGNaXV9dW19kZG/39Hz873ZveXJv8N7g6ODc4ufn7H7z7HNiZWRgX2JiXF5rbm10ffjq4eXp5+Df5+Li6eLk7v338/Pw7ur3enx+dXB77uLf393c297t7vpta2pgWVlcXl9haWhu/nx9/371/P57b21+9nV1dXJ1/P12/urh5efg6e/9b2dlcf798/Ds7+rlfWpoZ19aWVhZXmBfYGt2/PDr7evf29zf3dra2dvc3N3e6/Xxe3r28Xhrcm5lYV1bYW1ubfvn4ePi4urv7PF9eXJpafrr/v3m4ur17uzs6X5sbGtjXmVnYF5hZmBeYWdrdv1ze/P1bGhubnfr5OPf29zd2Nvm5+t2YWFoYWBmaV5faWZndXlveuvvdvzn8n3z7/Dn4e706OXt6N3e8/fufnBrb3ny6Ozm3tre5N7o/3l3amFjYF1hbWpidHtmZG56evp9bWx4emlt+HFv/fN5bu7o7Orn7vrs92Vjbmtkd+vr7efk8e/sfW5sYldVXV9cXW1saXp3bvnl6vLk3ubn3N3k4uDm6ePs+fHo8Hfu6nppaV9XWV5dXnf1e+zd3uTc2eTt6/Rwe/H9dvDo8/fn63V87f1vdndlX2deW2BjWVpgXlxneXd8+Ph9eX1tbfnu9+/f3t3a19zh297z+/RoXWZmXVxmaV1eYl9hdHpsb/5+bnHs7/zp4+3x4uHj3+Dp6OLl+Hp0aWdwdXvs6Onq5d7i4t/n/nF5a2ZuaGJldm1fa3ZraXp6bXr8cmp2c2lr/XZjbf19eO7p7+zn73N0eGppdX568evu7ufp9/jze2RkbGZeX2RjZ2plZ21sbn7u7vbv5ufm39/h4ubs8+3r8fbw+f3x8nRsa2RfYG1raXz19vTm3+Tm5+r58urz+vX7//ju8v76731sd3hsZmdoamxqaWJfX1tdZGNiaHf9/P/4+fvu8PHq6/Dv4+Hh3t3h6+breHV3ZV1gaF9dYGZgX2tsaG5tZmvx6+zi3Op17uTx+Ojr+/Ds7e3n7XB66+327e5+e+/t8Off7nLy63dz+XdpZmhobXxwY3XufnD7/WlocHxzfvNtYm5xZGl+cGh46/P87Op78d/sfu/udm7z7Hh+6vxp/fJuZ2xjXF5rYlxpbV5p+XdtffP47N3a3dnX5/3k4/h8+nZpd/N+evL+ZHLqe2h79Gxv7ev97uD3cujne33n7nD/6e1+6+f78OX7a3v9Z2n0+2VnfWZZYmRbXmViZX3v/3vp5O/p3u167/Juc+vsdfDf8Pfe4XVvbmFgZ2hcW25vXmZ6ZmBs/n303Nni4drl7+Pqa2t8c2z873595eDu6uTr9vf7b3bs7nr/8Xz+7/hvb/h3a/jvevrk5PXw6/lzdndpeut3ZGhxZ2BrcGNgdnNpefh1/ODe7O7l63V1dGRr+f1wfebk6ujp/mlrZV5gYl9mbmtfZXdwbvfn4tvV2N/d2+Dp7f1pZ21lYmx0cHXr6Pvu4e1wdPl1dPX5c/zm7Xzw8vns7e/z6t7j7ebp+fv3/W5udXF3d29kaG1eXmZlZWdnYWRvfvv36uv07u75e3l8ef3t7e3e3eTq5ub7dm1fXV1fX19iX19gZWxt8OPh3t/d3+Lg5e/6/HBqZ2Rnd/7+7ezp5e71e3D7+Pv9dfnv8/Tt9Pbt9e/v/vTp7fj79/h6b3Jwc/n4fXx3enpubW5qbXVpZ2lnaG7+9v7z6/Z6/npvd316dv/u6uzn6evr7/9qZ2ZhYGZoYmJnZ2VpcP3l3t/i3t3h4ePo7fb8bGNlZmVqcHN0fvj8dHd8dPXq9/fq6O3r5OHo6eb1/u/s8PDu+3p8/Xhoef12fvt3a21vaWdwcmtpcGZhaGVlbHB7e/zv+Pbm6/fx7vX97ejq6uLr+PD3amZqaWNma2ReYWJeYHB7eu3n7fHn4ufn3uby7vJ0a3Jya21wb254fW549O769uvv9evn7Ono8vj08Pz97e/38vd0c3NvaXL29/7083N0fXNvbnVvaXByZmFmYmFqcnFzffb79Obp8uzu+vXv7+/zfnFsc3NrbHNvcf52bWlnaGFpff757u307+rn5OTn7fPu/mlrbWdmaWpra29zcXL9+Pnu6uvn4eLj5eju8+zv+e7o8fnx93h1enx5efx1bnFsbHB5dm94dnBub2tiYF9dYG52dPbt6+fj4ePj5uvr6OXt9PpvampycGhsbGZoa2xnaGpmaW5xcv/7eHr78Ovk4OPl6e33/XtxbGhrb3d5e3z++PPv6efr6ujw9e3o7e7r8PTw8PP0+Ht5c21tdX55cG92en76+P7+9e/5935rZmFfXmRsbnZ7eX7u5eTk4Obq6e3y+31vZ2RnZ2psbG1tfPn+fXxuaXZ5cHnx9Hv27vDs4eHq6u31em9tY2RnaGhncXdxdnt+9+rq7uTl7enj5Ojp5unt7e3y6ePw+358bWpsaWJhaWdo/n579OjtfPn0dGNiX1tkcnL88Ozu5t3e5uDc5urk6/P5fGxgYmReXmppY3B9b2trbGRmbmVgefpudvXw7OPf3+Xl6e7t7nh19f9ubnh8evzzdm/6emz/8Xt88vJ+/enyfe3n7+7j7Ht3fHhveX5sanlzbX3v7uvh4Ons6vtraGheXWNnbf/5++7i4ezp4Obw6+v3/3ZnX15fXV5t/HB37/1y/Pdwb3t2aG7w/2/z7vrv4+Xm5unzfPx9a259bWZteWxrd/5yeO37fe3we/bu+vnp5enr4eHo4+X1/vl8aWh1bmNqdmZme/557+Pp7ePpdWx1Zl9te3F+6+757OLl6+Dd7O7m9WxwcmRdYGNeYm5mZXd+bG/0dmltdWlndXttdu708N3a3eHf4+709XVw9Ptqa3trYWhwamv17nr9+mdjeXlx/uzq7urk6Ozj5fr26/p5fH1rZnJ2Zmz3/fTg3uTh5e3+cG5oaHz/bmx5c3b66ejm3uDy+vNpZG9uZmdtbmpqaGRoeXdrcPb7bW96bmlwdnJ77efi2drk5uXr/nNzdG91bmJhYF9gZnB3++rl/Wpwbm15+/fr5eXq6ubk5uTj7/nu6/dwbWtmaWxnZ/vs8vDp6Ovu73ptb3d0cHVqZ3Tx9PDf297g4e50fvxvbXFxZ2lpXlpfZ2BibnFseH5rZG91aW35+Hzl2d3h3N3m5+j9cH7xb2hwaF9nd2pp/e95cPttX2l8a2ry6/b77/165t3n6N3h8erqdGl4/Wlm/Xxt7OT2/ejg7O7o/ml89mhmcm9kc/T27N7b8f7o73b28G9qff1mYWNcWWNqX2f8/W1sbmdkcn5pcOzy9ube5+nc3/Dw7P5t/n5naX56ZWt2bW1+e2hp/HVobXhra/Hwd3ny+fnl3N7f2t7v8vB5c3x8bnPu83R8+3j55Obw8+18aG11aW34dWZz8/Ht5uX3+uXp/vPyeHh7bmNkbWRcX2xoa/90Z2Zvcmxw+H167PF8+O3o5ebr9frw9m9wenFxfnd0eHd0a2pwcnP6dGhvfn15fXx3fu/t8+bd4Ojn6/p99fZ2efP1fvn9bGx+8vz06Oz48/ZxdPX0c3X5+Pby7fDv5ujy9PD7dH19ZmFnZWRmZV9hb2tfY2pnY2xycPrr8/r39v344eLu5d7o9+zo9/Dp+Gx66nxob2hfZXNvY2hvZmh0dWlw83x37uXn5d7e7urg5uvq5Ojn4e788fF6dfn8c/75bWdrcGpveG1qe/D/d/Pr8Ozn83vw6fl69Xtudvtza338bGhqaGFmbmdhbfp1bntsY2l7eHL16+7y7Ph47ur4ePbu9e7p83h++Xx2eXRsb35vaXv+d374+fXo5/b67u968+v4/Orn7/T0+3X97X556+94/e/4e/PrfXLw6/jv6/f67Ofwe/j6bXN9a2ZqZWFkamtteXNjYGdnZmpqanN7fnJ0+HRoePj87+bo7u/s7+3g6X316O328O38b2xtZWJpZ2FlaWtw/vt4+ezr7uXn7Ojj5ujl5Ofs7e31+PT4/vXz8fD1em14eWlndXhwcnl+fvDx9u/v8/789f53e377eXVwcHpzbG13eG1ueXNzbWpqa2loamxqZmVobnB1dXT9+PLv8ujm6ejn5+Pl6e3x/H1xZWdnaW9w/fj97+rr7e/x7Onq7u7r6vV2fHt0//t7/e7s7+7q8Pfw8Pl6e3r78Pd5++vs+vXq7/78fW1seXlvcnBoaW1kXmJmZmp6/G91+m9jZWxoanBxaXDy/XX7/HB87u/v5+Ho7OTk7efe5/z59nJpZV9bXWZmbPz1//LufXvs5ebk3+Hm4uT5c3x7bnj3+X7u5e307u737u55bXt8bGh0c3F79fTy7Ov/dXNucPzu8vjz9HltZmNibnBt/u/7d3NrYGJnaGdoaWhqbmpkbHVucHz/fH7w9vvu5ubm3+Hn4+TwdW1taWlvbm/48P3+/HFz9+zp6url6vR7bW16d3L77u3w7ujp7Obj7ujm8e7q+m5w+vP49uzt6uPve3xwaGtxe21qd21eW1xbX2hoa3P+d2hmZ2NqcG5yfn1zdnpwb/zu+nnu7/n593h1+urs6OTo6ePpfW1waWBjbW5qfPpwbXt+/PDq7Ozj4+7y/Hn97O307ejr+fft8fXr6/Dw7/h7dW9jZ3z+ePXs7efj6/Pv7v10/Pd4/vlyaGlram50bm55/mtgYWJfYmxsbHB2aGVsamp69/598+/5eHlzdPny8uvl4uLj5On08vZza2xtam5tZml2cW16+Hv783lrbG9ze+7s7ezl6fPv5uPo5eLj5N/h7/P1efzu7vXt5+vu5+bs8vN2bG9yb2lnYl9jaWloa2toa2xmX2ZrZ2hx+3p9+3d0/fX28Ozu7urp9nBucW5xfP7y6+z6evb1eHv+cmltbmhkaWtvfvV9dvjz9/39eHP+8O/q4N/l6Ofr7+jp9f3w6uvr7P1vcHJye/f08Ovt+/Pn5Ons8PX19Pd6evt9ef38dWtubGNiY2RpcG9qbnx9aWlubWtxeHB98+7x9vd0bf/z//zs7PDv8Pb17e19efX5fnx1amhqcW5scGxqbWtiYGtwd/nt5+jg4+zp5+nq6ert7+3m6e3r7e/t7/fv5+jv8Ozv8+rt+vbu+nBxb21vfftvb25nYmJiXV1ncW/76vJ7+3tscvLydXP59fTs6/V+endzefL8ffZ+bWxxdHZ5dnN68vl1endub3n+eW9va2dnaWpz7u3z6Nzc4eLj6enh6Pjz9X1tc35ta331eHzt8Pnx8Pv+7ev47uXo6+fq9/fs6u/w7Ph2dGxfXWRkYWZ6fHvzfWtkZGNmcG9kZHFzam/7fnB4fH7z5en78ev3+enq/3rw8Pns6fb77vtscnZrXl5eV1hja2z15efn3t/t7eLn+u7n93x+c2lreHt47+jy7eDi7u3n6+/r6/f25u/78PNxcPj1enz5cGZlZF5gcXJv9+Xo9+7udGltZV9jZl9eamtiav3+bnX9ev/18n589Pd98vJ7ffDu9+7k5/Dt7nl4d2heYGRgYm359+vf3uDi5/Dz8P5ubnxuY2FmYGRye/rs5+rq5OPo6eDi6ejj4+Xh4+nq5u338e79dn1zaGRnZ2Jma2xw9/lsZ2VfW1tbWFhbXVtfaWp08uzt7enm7e3n6+/n5e7v6+vt6OXq6+bte375cmlkXlpYW15eZX3w7uPg6e/u73x6/nVueHdobH56evHn5ufk4ebn4ODl4+Lq6+Xl7e3p8Hf893N78P51d3ZsZ2tsZ2r+/H71+m1kYV9YVVlYVlpeXGFwcW3+7vR+8O5+/Ors7eXi6Ojh4e3q4eXy7+58/vZ2Z2ltYVxjZ2Nt7unq5eTu8/V1ZWp2a2RscGtv+fH1597j59/h5+Tc3+Xe3ODj3ePx6Od9dfjz//rt93V+fmtjaWhjaXl0bXNyY11eWFRXW1dXXmNha3x7dvTu9/Tq6uzq5+ro39vd4OHn7+vm8f72+Hh2d2tlZGBcXGVsdvDu9/fu7fd2bWpkaG1scPz4+fPr5uXd2+Dj3t3d293j4d3f5Ofq8P17eHT/9vDx+fp6d3lyaWZobGxvb251d2xiXl1aWllYW11fZm1vbnX/eHJ5fH707+7t5eHd3uXo7vHy+fj38fP5/XhxdHNqZmloZ3j8//Xr7fP+fXBra2diZm12evTt7uri3+Pj3t7g3t3f3dnc5eTm9fTu93378/j26ez49+37bXFuaGRjY2BnbWJdYWNbWl5cWFtdXWFubmh0/GxqffX69Onp5t3b3uHe3+3q5e7y7u3+/e78cXR7ZmBraWBqeXB47et5c/5vZGVrZmj9/njw5erx6N7o59vb3dnX3N3Y3u7u6ftsdv9zfu32+urn9Xz2/mhlamJdY2hiY21lXV9jXFlhZFtga2hncXRkZGxqZHL7dnzq5evn3d7l49/m6ODo+O7r/nvp5O/z73lnaGhgZ3p0c/fr9f3+eGhna2JkcHhteuvu+vLp6u7k4uXd2tze3N/r6+Tt+vHyc3H4+Pfp5Ort6/ZvaWZeXGFjX2BmYV1dXVlaYmJbXmhkZGxsZWZrZ2h39fvy4+Tq49ze393e4N3b4+/x83587+/3+PtsZWhoYGRzb2h2+XhweW9la3BsaXh7cHvt9Pnv6+fq4t/d29na3t7e5ujo7/7//nBtb3Z38/D5+PR7a2lmYmJoamhma2hfX19hYGVrZ2Roa2xqa2FkZmBhZm5uePPq6ufk4d/j5OLi6PDz931+9evs7Ovt/HNvdXN3/v/19vf9fnhwc3hva2pta2h3/H578+7s7O3p5N/j4+De4uXh3+Xs8fdxa29vdvjw9O3v+nNuY19kZmFfZ2ZfX2JhYWRiYV9fXl1iZWJeY2xmaHX7evnp6uvk3uDf3t/g3uDo8fT8cnfw7Pb37fN0dHv+ev97/vl+cHF+bmt0fW5seXpsbn35fPvp5ubj3+Ld2t7h3N/v7ePofffs+G90dm5ufHx8enFpZWtnYWZwaWJqcGRia25paXVtZGBgX2NiXl5la2Roe/p68efi6uPf4OTl5ero7Pp++3hx/unt8OrpfnF8+H579PP3/PX89PJ8dH14aWl6/m538fD77+nq7evq5uPk4eDe6u/n4+rw6+f3bnj8e3J2dXZuamVoZmFfZmljaHB2bHR+fmxrbGZdWltbXFtdZGtoZ3Hy+Pzr4efq4+Lk5+Pj4Obr8vDzff7t6evr5eb7//j6bnL79v/++/zz9vp9/mxobXhwbnT49nv07e3z7OXf4uDf3eLt8efi7enj5vP9enpuaGdnYl1cXmFdXl9lZ2xx/nlv+vF7bW5tal9eX2FeXmNqaWNt+fL97efj7O/q5+zs6ubn8fDs7Xt68ubp7ujm9v/+fv188urn6evo4ur5+flwZ257eW52/P5wdH38+//89Onr7Orm7Pbt4enu7efo8Pr383pwcHBnX19kX1tebX11e+zn+373/mhhZGdgW1tiYFpbXmZjaXv4/vTq5ur07+Tj6OXh3+Tp5+Lq9+3m5/H07On8cHT7fnX95er16uLscHH9fWZmc35ubHn3fXX05efy8OXg8Pjn4+7s4uDq6ePg5/Py8fdyaWtmXVpcXFhVXGhpa33p6ezxfnt3a2loal9dYWJbWV9oaGp9+PPz6+7v7e7t6Oz18ujl8vjs5fHx7ez89vvt83h38unu9ODZ4uvm43hqdvVzYmr9dmZkbfxxbvXk7v3x5PloeOfp/+ne4+/n3uPv6OPl8XVxcWxfXWBeW1xjbm/96eLpfXJrbWZgXWNgWVZbWlRWZGtiZP/r/nL35+zv49vd6uze3fT44Nzs9ujk9/7q5v1w+u73ePbo5+vt+31taWxtbGtsbGhjY2Vu+e7t6d/i7frs6/nx3Nzl6Nva6fbl3uz88OxxY2VyYldZYGBZWmlzaHHu8GhgbHVkYHF6ZV1dXl1aXmlpaXT9/3l7+/nv5uDl5ODl7/Pp5ezo4Op7/ejse3fw8Xh56N/m6+De7nT36fxrdPV6aGpyZFpfc3Vpce/scmx98f344tzg59/a3+vq5+jm5+7v7fJ+dXFtZGRrbWtmbvh4ampwa2JeZmRbWmBaT1FcXVhbcHRjZnv5cG/q3eXs3tba5ebe3+/s3uDz9ebqfX7w9X5+/fj38vT+e29uev35/fp1bm5pZWhwdGpt+PT68uXt++rc3eHc1tvf3Nve6ezj53Vs/PVoXmZsYVxs+WxgbHtrXWRwb2tscG5rZmRkXlthZ2ZiZm1saWxxbnb17e3q6+zp5ut8fufo+vXo7X168/F0b/Lk6ffw4OT/fujo9vPk5/x08vJrZG10cWtpbWhiYGZqZm3x4+Xj3Nra2tve4ODg5eXl6fLw7f1vePb/cnj1+2tnbWpjYGluYlxeYllSVVtbWl5pZmNpbG1sbXru6ebg3dzc3Nzc3t3c3uLj6u729f5vef9zcP5+c2xqaGZnc/r6+v3w9nBqd3p0cP7+cG14dmpqdvfw4d3b29va3N3d3N3h6ent8nhwbWNgZXBsbHv2c21vdG1tdHNta29tbmRhYWNobHF1bmlrZGBga3B4+/Dt7uvt8fHw9+7o5OXn5ev1fn1+9Pl9/O3v+vXr8Hv36ejw6eDm+Hl5cGxteHBrZmdkXlpcYF5ice7p5N7c4OHe3Nzb3N/h5On3+/f+d336+fL193l3b29w/3BmaGxmXVxaWFZZXF5eZWloZF9fZmpr9Onn59/d4uff2t3d2tnb3N/k8Pz5fv16c292bmhmbGttcXt7fu/u8P7+bm92e29xfHRoY2hjY2p5fu3i3Nra3OPh3tzf3d3j7/N1Z2ZrZl9laWtteHVvbXd6dntvbXZ9bGViYV5gY2JhanlraGdoZGdtcW/77+vu9vz+6ubo6OHg4uTj6vDp6fH59Pf4+/tzevTt6+vo6ufh4ez4+/x1c3BtbWtjW1lYVlldYWVw7unm5OLh393d3NrY2+Hm73x5fHVsb3359vf3/Px3cnl2a2Zua2FcXVtYVVZXWVpcXWBiZW1yeHvy6Ojs6efl4t7b3dzb293d4uno6PH89/T+c3ZuampvcXl0e/bt7Pr27u92fu/xfPz8cGJfZGBiYWhw+fTs5d/l4t3d4N/b3eTs7XhvamdeYGlmaG59bnD/+XN5/PT6/X5yb2xoY2JdW1xgXFleamVeaW9taHd9fXn26+Xk6OXf3+nm4eHr6ebq9erj6PH493p9fP597erp5+Dk8PDv+W9zc2xkY15dXlxZXGJfZHLy9+3g2t3c2Nfa3dvb3unq7vVza2t2amVwenFqdXZtaXFwa2hpZGJhYGFdW1lZV1paXWFoaXF7efjx8vTm5OLh2tzg3tvc4N/g4evv7Ov59fj8dG1sbG5sc/ns8uri4Ozn4ufw+ftzamZrZ2NfZGNjZGx2/vXp3dzc3Nrf5+no8Pb+eW5qa2VlZWpnbHJ3dv737e/18fX2fHtwcmhlZF9ZV1pbWVhdYGJfZ2ppZm799/fu4uHj5t3c3+Te3uPm39zh6evl6+72+ft9fPXw7uzq5Obr9O3u+G9oYl9cW15eXFthZWhlcPbt697W1NfY19rf5eDj7nd993hqbXdza2t5c2xocnlyaGpybmhmaGdiXV5cWVdZXF5eX2ZraWVseHdvfurl6ODa29/g29rf5uHf4+3m4+v9/O3xcm18+3Rx7+ju9ujk6vDt5+x5amxqYl1fYmFfY2dpa3H58Ovl3dna3eDf4u/88vB6cXZ9dGx69vl+/PH0fXzu7fZ5fvtxZmx1aV5eY15XV1xcV1ddYl5cXmNjYmp79O7q4d3d3t7d3t/f3N7e3t7g5+rp6O99/PDwff7p5Ory6ujzdHv1dWZiaGdeWl1eW1pgamZmduzt697X1tvc2dzn8eno7vTy7PH7fPHt+Hz+9vx2enlybWxwbmpjZ2ZdXFxdW1dYXF1YWmZrZV5ocmxreuTf397Z197f3d3j6eHf4+fp6PP69PL8b3V7dG9y9e3t9PDs9Pt+9vJ0bW1xamJgYmdhX2VrcnB87enp49vc4Ofp6vn28Pj9e/t8c3B77vf49Ovo9/Pv7fp4fnp3bW9xa2dgXV5dXFpaWFpcWlpaXV5dYmz57+nh3tzh4+Hf3ODg3Nnc49/g4Ojs6u7u+v338+/u7fT38HpwdH57amlxemlfYWFhXFteYGNldPDn4+Lb3Nzc4eXp4+jv7enl9X3/+vd0dvzz9nV4entvaGpqaWNhZWdoXl5fYGJdXl1eX11fYWdnZGlz8u/u5t3Z3uHe3d7n5eDg6vDq6uvz9vP693twcXf4fPv17ez+/vzt8H707ej0dXRxb2NfY2lqZW188e706ebl6/fx8O/8//Pv7v53b295cHf96+r68+vn93X/+3doZ21ubmVpbGljXF1cW1dXWVteXl1gYWhpcPnq4OLi3tva3Nva2Nrg4d/d4+vl5On9fvHv9nn48/P6dnVvcG1pbnR8c2lnZ2heXWBkZmNodfPu7+Hc29/k4uDg6enk4ePw8/X7eGt2/f53d/r9/XhubGdoZGFiZmlkZGptaV9gYWJeWVxgaGBeZ2tuanTt5OLi3Nzc3NvZ29zf5ufq6ezy9PHt+3378e56cn7t9HT/8vR0cvXz+XZzeHFuaGlpaWdiaG95+PXw6uTm6+3r5+7w6ebl8vr4+nlqc/fx/Hzx6+z6//p7b2dqbWprbHFta29taWJiX1lYW15cWl1kamZmdu3s+O7g29vb1dTX3N3c4Ofs6ens6uzr6+fn8v9+7+17c3X9dWlsdX1rZGpsYlxha2dhYWx0c3X67ezl5+no5N/i4uHh3+To7Ozwcnj9+Xdscn58aWdvdG5iYWtra2drbWpoaGtnY19eXlxdX2BianNsa3jp4u/t39rb3trW2d7j4uTt//7t8fl98+zs7ff+fvj7eXf78fp1ffbwfW5ub2deYGhsZ2Zw/P1vbn72+X756+bj4+Ll5eTn7fXz+nBsdn56df73/2xqcf57aWt4eHBrbXVwbGlpZGReWlpaXFtcX2hoY2hu+e3w7ebe3uXf2NXa3tzZ3urt5+ry+u7o6e3w7/P4e3z++/R+cXJ6/HRqaG1qW1tlbWVhbX18bnD27O717+bj5Obl4N/j6Ofr7PpvbHF6c3FzdHlsYmRsbGJqfvV5bHP7fWtlaGhkXVxfY2BdYGFgYWJjZXJ9e/jq4OLm4d3Z3d/e3N7q7ejg5vLv6+rv+fHt7/r27OXo8e/v9f12cG1tbGBdYGlkYWhsem1pefHyd3Tz6O3w5N7e4ePg5Ofu/nd7/XlzeP99bGZpbW5rbnf5fG1weHlpYWVpZV1aXV9eWlxhZGJgY2p2dHvw6eTi39zc2tzd3t3d5Ofm3+Pv8uvp8v378erv9u3o6ft6fH5yaWpvcGZjZmZoZWNobnNsbXP99n788+rn6+fg3uHr6+nn9Xz59ftwcHV8dWlpa29va3V+9v1zfP19cW1rZ2NdXF1eX15eYWZmXl9nbmps/urg4OLd2tvf397g5u7p5OTn6unq6e709+3q9ffs5+fx/v34eWlnam1oYmRrb2tqcHx6amlxdHRsbn708fHr5ePn7evo6e3w8vP6cm1w//5wb3n7enB+7+78eP3+fXFsbGZiXVxfX11cXmFnZ2JlaW1saW/05+jq4dva3t/d3ODo5+Pj6O3o5ujs7enr7fd++fLv+3l8/ntpZGhrZ2Blbnlvbvr3fG1tcXNwaW1+7/H47OXh5+7s6+vx/Pj1+29tcnt3bXB5+Pp5/e7o9Hr49PtrZ2tpY15fZGZkYGNkYmFhY2ZraGZs/+719evi3uPk39ze5eXg3uTp49/g5ubi5Ony9/Tv7vX37u35bmdlaWZiYWh1c250/XtrZmptZl5lcHx3cfnr6u/w6urq6+/v7u71fvz18/b69/D4d3vz8X5xe/P9amNqa2djZWpraWRkZWRjY2hqa2xscnr9+vvu5eDh4N7b3OHk4Nzf5+ni5Ovr5ujvfn74+X53evX6dW1tbWtsaW52ev9vc3v+dm90eXdpaW9zbml18+30fffv9Hp69vP2/vnz8O/4/vr99vn79/X4ePz3+XJnbXB0amx4eXFmZmViYGFjZWRkZGdnaWxu/e7o5uXg4eLn5Nza3eDe3dzg6eLh5+7w6/P3/3r4fXRvbW1ubGpsdndta25tb21nb3p1amZqb25rd+7p7vTs6fD5/PDq7Pb06+70fHj9/f94enpwcmtveHZyam1zc25ufPl3Z2ZrbGhlZ21sZ2BnamtrcPfs5+no4uTm7Ovl3t/n5+Lk6vDr5+jt+/Pv9316/f98c3b9fXx5/vj2fnB2/H1ya29wbWJfZGZnZGr++31zdvb6/vrv5efv7+zs83x79/Dz8/f09X5ub3VydnF1fHt3dHn8fm1mbGxmXmFkYl1bXWFmZ2x97ejq6+Xj4uXi3dzc3+Df3+Ls6eLl6/Lt6/R3cP7/cW1wdG9vaG1xdXpvff55cWxsaGZjYGVrc3Fz/O/0enrw7vHy6ubl5+7t7fT9evf3+fx+/XNrZWdsa2xudXz0+3j68/H+ent+dWdjZGJfXl5kaWZndfn4+frt6+no6+Xj5Ofm5OXm6+nj5OPp6+js9Xz+9vx8evn09Xp78fL5fvv9eWtmZV9gXl1iaGhpbHF4enZ0fvDs7erh4efs6+jm7/Tr7O/v9fv9dWtrbW1uanB5d3dwfPj79Xt4eG5lXl5dXVxeY2dpZW58fvf76+fk4uff3t7j5eHi4OLi5urp8PPx+H5wdv59eHR3fHx4cP709fz68n1vZ2hnY2RiaW5xcHB+fP79+u3s7fDr5unq9Pbz9/n9+PL1fHV6eG9rbW5ucHF2+/v3/PLs6uv38Pd0amRoZmNgXmJiYl9kbGxqa37t6+zu6ejp6u/l4uTl5ODk5Ors6/L2fvn5//h5fe/39O707+r4+/B4cWRgY19fXF5gYmRha3Nwc3v16+fr6OLm6Ozr6Ons9u7r8fd8+vh6cm5xcHZvb3l7/Hl5+H5+dn5tbm5lZl9jYV1kZGBiZW1ucHXz6+7o5+bg5ebl4N/e4+jn7ev29X7+fmxueHJ8cHX7+X797fPv8Pfw/Xhwbm9sZmBkZmdqanN0cXh4+/Ps7PDr6+nw+Ozz9/347vn+d//9eXdtfH5+eXzt8u3w7+rz9fv+fHVyamlsaGNfX1xdXV1mZWZrbH307/Ht6enq6uPg4+Lf3uLj5u3p7u72d/Z++f727vDs9PLt8vV6/XltaWVmYl5dXWBdYGNqcHF8efbs6unt5ePk5enj5O709evt9Pv+8HZwbnX+bnd4/fR9+P74fv5+bnZtbGxqb2psYmVmY2Vkb3p6d3f57u/x7OTn5+zr5Onl5+jm7ez69fxzdXL/eXr2+e7s6/Dx6+zx/Pn2fX1vcG5lYl5kYGBpZ3Vwd3x88vXz8fTu7fD28O709n7v9P38efz3fXx67nPz5vDjeuzv9er+em11bm5rZGtrZmBcYGBdX2VvaW1tfvz49Pnk6OLn7Obi3+Ll3uPm6e7r9Pt1/fT27vLs7uzu8ejv+3BuZnZxa2ljYl1bXV1hY2dveHn/9u/t7PLs4ufm5+rn6Ovy7Obq9Xv8/nl4cPn6fX16+Ph6eHv8d25oZ2tlaWdpbmllX2Nmbmxr9/P5/vzs7fL06+fr7O7p5ujs6+nt8vp8+nl1dHL3+/P48uzv7PPs6/H4eXl6dnN1eG5pZWFmZWZobnx5fXd5+X5+dX36/vt89/Ly8vnt7PT8+/X6fH7y6u3x8Orj6fP17fR5dGxwbm5qaWpiYVxdYl5fYmtzbWtrdf56efzr6+7r6uLh4+Lg3+bq7Ojs+fD07+rs7fDs6+zy+O75cmtma2dlZmdnYV9fZGRka292eHZ6evf08Pbu6ezq7ujj5uXn4uLm6/fx/nZ5ePj7eHR3/3hxcXV5bmxqbHFua2lqamhmaG9wdHR3+3x5dXn0+Pnx6uju7u7q6Ozt7Ort8/p++nl6e3v0+vj29fHz8vbt6/X4e/b3d3Rz/nJvbWxxaWtqaW1oa2tvcGxva3R1d/z98Ozt7urj5eru7ez09/Po5uro6uvw+vX88/d7enN2aWZjYGNeXl5fZGBhYmdqbG5vfnV7/fbt7Ovq5eLj3+Pf3uLg5OPj6u3u7PD0+Xv0fXt6cHpyb2ppaWJkYWdoZ2hpbmtoaGdvam51efb28PDu6evq7Obh5uTn4+Xo7PHwfXdzc/52cXJzdXF1cHt3cXZqcG9qa2dsbWxqbndsbG90e3N7fv38ffb89u/19fT1+ff3+PL8+vv28PPx8+7t7/X78/H17u7q6uzv8PN8fHN0d29wbGxnZWNfYmBfYGBoa2xrb3x7fHr77e/s6ubi5OTk4uPl5OXk5ujq7+ru9PT09X16bW9wZ2NgX15dXltcW1xdX2dma2tuenr++u7q6+jo5N/g4uLf4eLj6OXm5unz8/l+eHZ+fHhz//53cWxwcGplY2pqaGZkZ2VlY2dsbG519/Dw7vDn6Ojp6+Xl6evr5+fp7u3v9vh3dHNwdHJ4e3l5e/13cXF1eHVya2p0cGtobG5pamhra297evzz+fn58vny+/ru9fL49PXs/vv08vP6+PPu9PT06u3s5+Ll5uDq6+ztdmxyb2xmZmhkYF5eYF9hZWlwdXdy/n76+/vt8uzr6uHj5Obm5eTo6efk6evt7/ju6+Hd53TvbGt9XmJfXmJeWV5faFxbX2NjcGxs93Hye+nucuTi5Ojk7O7v8OD09Ojg7u717e36eHjqePTvcf7re2t+dGllYW38Z2FvamBqYn7sd3jj4+fj6N/f7ezl6N/p49/f6+Pp8Ob9dubwd3xqeGtube35cOH9enZz9WhtbG1ceWdWbldoWmP4c35tdmzt93fvaf7qfXx263v/dn19fn7q9/jo7Xno53Hq5dzq5tvc7eba7H7+8Pv/bW9dYmFaZlRgaWxZY3dhZHD9WfPiZvbh6OIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nc21fMWNoXzhraHpfMTNrYnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nc21fMWNoXzhraHpfMTNrYnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRmYmUzMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2dzbV8xY2hfOGtoel8xM2ticHMuaW5mbwpAQCAtMCwwICsxLDE3IEBACis5NzUgMSAwCis5NzUgMSA2MDAwMDAKKzk3NSAxIDEyMDAwMDAKKzk3NSAxIDE4MDAwMDAKKzk3NSAxIDI0MDAwMDAKKzk3NSAxIDMwMDAwMDAKKzk3NSAxIDM2MDAwMDAKKzk3NSAxIDQyMDAwMDAKKzk3NSAxIDQ4MDAwMDAKKzk3NSAxIDU0MDAwMDAKKzk3NSAxIDYwMDAwMDAKKzk3NSAxIDY2MDAwMDAKKzk3NSAxIDcyMDAwMDAKKzk3NSAxIDc4MDAwMDAKKzk3NSAxIDg0MDAwMDAKKzk3NSAxIDkwMDAwMDAKKzUyMCAxIDk2MDAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2dzbV8xY2hfOGtoel8xM2ticHMucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY5MDNhOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2dzbV8xY2hfOGtoel8xM2ticHMucmF3CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmgyNjMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5oMjYzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MjU4MWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5oMjYzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YmZjYjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5pbmZvCkBAIC0wLDAgKzEsMTIyIEBACisyNjM2MiAxIDAKKzEyMDIzIDAgODMzMzMKKzEwNjQ3IDAgMTY2NjY2CisxMDI2OSAwIDI1MDAwMAorMTEwNzYgMCAzMzMzMzMKKzExMTA0IDAgNDE2NjY2Cis1OTA5IDAgNTAwMDAwCis0MjkxIDAgNTgzMzMzCis1MTQ5IDAgNjY2NjY2Cis1MzUzIDAgNzUwMDAwCis1MTg1IDAgODMzMzMzCisyNzM2IDAgOTE2NjY2CisyMTU3NSAxIDEwMDAwMDAKKzIxOTYgMCAxMDgzMzMzCis0MzQwIDAgMTE2NjY2NgorMzEwOSAwIDEyNTAwMDAKKzQ0MTAgMCAxMzMzMzMzCisxNzMxIDAgMTQxNjY2NgorNDU1NyAwIDE1MDAwMDAKKzMzNzYgMCAxNTgzMzMzCisxMzUyIDAgMTY2NjY2NgorMjg0NCAwIDE3NTAwMDAKKzE3ODcgMCAxODMzMzMzCisxMDg4IDAgMTkxNjY2NgorMzY4NDMgMSAyMDAwMDAwCisyNTIwIDAgMjA4MzMzMworMzc0OSAwIDIxNjY2NjYKKzM3ODQgMCAyMjUwMDAwCiszNDAyIDAgMjMzMzMzMworMzc5NSAwIDI0MTY2NjYKKzIzNDUgMCAyNTAwMDAwCiszMTQyIDAgMjU4MzMzMworMjk0OCAwIDI2NjY2NjYKKzIwMTggMCAyNzUwMDAwCis1MTMzIDAgMjgzMzMzMworMjI3NiAwIDI5MTY2NjYKKzIzNDY4IDEgMzAwMDAwMAorMTUyMiAwIDMwODMzMzMKKzIyOTkgMCAzMTY2NjY2CiszMjczIDAgMzI1MDAwMAorMjYzMCAwIDMzMzMzMzMKKzI5MTUgMCAzNDE2NjY2CiszMDMyIDAgMzUwMDAwMAorMTg5MCAwIDM1ODMzMzMKKzM3MTggMCAzNjY2NjY2CisxOTkwIDAgMzc1MDAwMAorMzEzOSAwIDM4MzMzMzMKKzE4MDYgMCAzOTE2NjY2CisyMzIwOCAxIDQwMDAwMDAKKzE0MTkgMCA0MDgzMzMzCisyMjYzIDAgNDE2NjY2NgorMzEzMSAwIDQyNTAwMDAKKzI2NDUgMCA0MzMzMzMzCisxODgwIDAgNDQxNjY2NgorMjIzOSAwIDQ1MDAwMDAKKzM2MzcgMCA0NTgzMzMzCisxOTQxIDAgNDY2NjY2NgorMTU3NyAwIDQ3NTAwMDAKKzM3NzcgMCA0ODMzMzMzCisxODE2IDAgNDkxNjY2NgorMTk2MDEgMSA1MDAwMDAwCisxMTA0IDAgNTA4MzMzMworMjgwOCAwIDUxNjY2NjYKKzI0MTEgMCA1MjUwMDAwCisyMTU5IDAgNTMzMzMzMworMjQxMSAwIDU0MTY2NjYKKzI0MDggMCA1NTAwMDAwCisyMzg4IDAgNTU4MzMzMworMjQxOCAwIDU2NjY2NjYKKzE0ODEgMCA1NzUwMDAwCisxOTI2IDAgNTgzMzMzMworOTAyMiAxIDU5MTY2NjYKKzI5MiAwIDYwMDAwMDAKKzcwMSAwIDYwODMzMzMKKzc0NyAwIDYxNjY2NjYKKzIwNTkgMCA2MjUwMDAwCisxNjkzIDAgNjMzMzMzMworMjA3OCAwIDY0MTY2NjYKKzI5NzUgMCA2NTAwMDAwCisxMzE3IDAgNjU4MzMzMworMTc0MiAwIDY2NjY2NjYKKzEwMTkgMCA2NzUwMDAwCisxMDUzIDAgNjgzMzMzMworMTQxODMgMSA2OTE2NjY2CisxNDY3IDAgNzAwMDAwMAorOTk0IDAgNzA4MzMzMworMTcwOSAwIDcxNjY2NjYKKzgzOCAwIDcyNTAwMDAKKzEzMjggMCA3MzMzMzMzCisyMjkyIDAgNzQxNjY2NgorMTgyOSAwIDc1MDAwMDAKKzE3MjggMCA3NTgzMzMzCisyNDM2IDAgNzY2NjY2NgorMTg1MiAwIDc3NTAwMDAKKzIxOTAgMCA3ODMzMzMzCisxNTE2NyAxIDc5MTY2NjYKKzExODggMCA4MDAwMDAwCisyMDcwIDAgODA4MzMzMworMzMxNiAwIDgxNjY2NjYKKzI2MzYgMCA4MjUwMDAwCis5NTAgMCA4MzMzMzMzCisxMjYwIDAgODQxNjY2NgorOTA2IDAgODUwMDAwMAorMTI5NCAwIDg1ODMzMzMKKzEyOTggMCA4NjY2NjY2CisxODk3IDAgODc1MDAwMAorMTM0OCAwIDg4MzMzMzMKKzEzMTk0IDEgODkxNjY2NgorMTA0MiAwIDkwMDAwMDAKKzEyNTggMCA5MDgzMzMzCisxNDU3IDAgOTE2NjY2NgorOTkwIDAgOTI1MDAwMAorOTAwIDAgOTMzMzMzMworOTYzIDAgOTQxNjY2NgorMzQ0OCAwIDk1MDAwMDAKKzc3NCAwIDk1ODMzMzMKKzEwNzUgMCA5NjY2NjY2Cis3NTAgMCA5NzUwMDAwCisxMDU0IDAgOTgzMzMzMworMTMxMzkgMSA5OTE2NjY2CiszMTA0IDAgMTAwMDAwMDAKKzMzNjYgMCAxMDA4MzMzMwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaGV2YyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmhldmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyMjM2ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmhldmMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzNTdjZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmluZm8KQEAgLTAsMCArMSw2MSBAQAorMTY5NSAzMiAwCisxOTM4IDEgMzMzMzMKKzQ3MSAwIDgzMzMzCisxNTMgMCA2NjY2NgorOTkgMCA1MDAwMAorNjU3IDAgMTUwMDAwCisyNjAgMCAxMTY2NjYKKzExNSAwIDEwMDAwMAorOTkgMCAxMzMzMzMKKzYyMiAwIDIxNjY2NgorMjExIDAgMTgzMzMzCis3OSAwIDE2NjY2NgorOTUgMCAyMDAwMDAKKzU5NyAwIDI4MzMzMworMjg4IDAgMjUwMDAwCisxNDUgMCAyMzMzMzMKKzE0NyAwIDI2NjY2NgorNjc2IDAgMzUwMDAwCisyODQgMCAzMTY2NjYKKzE0NCAwIDMwMDAwMAorMTMxIDAgMzMzMzMzCis2NTggMCA0MTY2NjYKKzI3MCAwIDM4MzMzMworMTAxIDAgMzY2NjY2CisxNTEgMCA0MDAwMDAKKzUyOSAwIDQ4MzMzMworMjU3IDAgNDUwMDAwCis5OCAwIDQzMzMzMworMTYwIDAgNDY2NjY2Cis2NjQgMCA1NjY2NjYKKzE4NiAwIDUzMzMzMworMTQ3IDAgNTAwMDAwCis2NyAwIDUxNjY2NgorNzggMCA1NTAwMDAKKzU3NSAwIDYzMzMzMworMjMwIDAgNjAwMDAwCisxMzQgMCA1ODMzMzMKKzExNCAwIDYxNjY2NgorNjI5IDAgNzAwMDAwCisyMjQgMCA2NjY2NjYKKzEzOCAwIDY1MDAwMAorMTI5IDAgNjgzMzMzCis2NDUgMCA3NTAwMDAKKzI2NCAwIDczMzMzMworMTQ1IDAgNzE2NjY2Cis3MDUgMCA4MTY2NjYKKzM2NSAwIDc4MzMzMworMTU2IDAgNzY2NjY2CisxNjAgMCA4MDAwMDAKKzcyNSAwIDg4MzMzMworMzMwIDAgODUwMDAwCisxMzggMCA4MzMzMzMKKzE2MiAwIDg2NjY2NgorNjM4IDAgOTUwMDAwCiszMzcgMCA5MTY2NjYKKzE3MCAwIDkwMDAwMAorMTMzIDAgOTMzMzMzCis0MzIgMCAxMDE2NjY2CisyODcgMCA5ODMzMzMKKzEzMCAwIDk2NjY2NgorMTM2IDAgMTAwMDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmhldmMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaGV2YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTFmN2NmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmhldmMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTk0OTFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8KQEAgLTAsMCArMSwzMDIgQEAKKzEwNzUgMzIgMAorMTA3NSAzMiAwCis2ODYxMyAxIDY2Njg3CisxOTAyNSAwIDE5OTY4NworMjQwNSAwIDEzMzY4NworNzc3IDAgOTk2ODcKKzY4MSAwIDE2NjY4NworMjAyNTQgMCAzMzM2ODcKKzI5MjcgMCAyNjY2ODcKKzc2NiAwIDIzMzY4NworNjU4IDAgMjk5Njg3CisyMDc4NiAwIDQ2NjY4NworNDIxNCAwIDM5OTY4NworNjA5IDAgMzY2Njg3Cis2NjEgMCA0MzM2ODcKKzIwODM4IDAgNTk5Njg3Cis0MjA5IDAgNTMzNjg3Cis1MDYgMCA0OTk2ODcKKzU4NiAwIDU2NjY4NworMjA0MTUgMCA3MzM2ODcKKzQyMDcgMCA2NjY2ODcKKzQyNyAwIDYzMzY4NworNTE0IDAgNjk5Njg3CisyNDQ1NyAwIDg5OTY4NworMTkwNCAwIDgzMzY4NworOTIxIDAgNzY2Njg3Cis5OTIgMCA3OTk2ODcKKzU0MyAwIDg2NjY4NworMjQzNDIgMCAxMDY2Njg3CisxODIyIDAgOTk5Njg3Cis4NDAgMCA5MzM2ODcKKzg5MiAwIDk2NjY4NworNzE1IDAgMTAzMzY4NworMjI4OTMgMCAxMjMzNjg3CisxNjE4IDAgMTE2NjY4NworODgxIDAgMTA5OTY4NworODkwIDAgMTEzMzY4NworNzk0IDAgMTE5OTY4NworMjQyOTIgMCAxMzk5Njg3CisxNjczIDAgMTMzMzY4NworNzU1IDAgMTI2NjY4NworODEwIDAgMTI5OTY4NworNTg4IDAgMTM2NjY4NworMTk4MjggMCAxNTMzNjg3CisxNTM4IDAgMTQ2NjY4NworODk0IDAgMTQzMzY4NworOTMzIDAgMTQ5OTY4NworMTk4NTMgMCAxNjY2Njg3CisyMDExIDAgMTU5OTY4NworOTgxIDAgMTU2NjY4NworOTAwIDAgMTYzMzY4NworMjI4NjkgMCAxODMzNjg3CisxNTYyIDAgMTc2NjY4NworODQyIDAgMTY5OTY4NworNzY1IDAgMTczMzY4NworNjY1IDAgMTc5OTY4NworMjIzNDYgMCAxOTY2Njg3CisyMjQ1IDAgMTg5OTY4NworNTE2IDAgMTg2NjY4NworNjA0IDAgMTkzMzY4NworMjQzMzMgMCAyMDk5Njg3CisxNzY1IDAgMjAzMzY4NworMzE4IDAgMTk5OTY4NworMzIwIDAgMjA2NjY4NworMTg1NzcgMCAyMTk5Njg3CisxMTIzIDAgMjE2NjY4NworMzM3IDAgMjEzMzY4NworMTc1MDkgMCAyMjk5Njg3Cis4NjkgMCAyMjY2Njg3Cis5MDEgMCAyMjMzNjg3CisyMzM2NiAwIDI0MzM2ODcKKzEyMTcgMCAyMzY2Njg3CiszODAgMCAyMzMzNjg3CiszNDcgMCAyMzk5Njg3CisxOTU0MiAwIDI1MzM2ODcKKzE4ODcgMCAyNDk5Njg3Cis0NjcgMCAyNDY2Njg3CisxODkzOSAwIDI2NjY2ODcKKzI4NjMgMCAyNTk5Njg3CiszMTcgMCAyNTY2Njg3CisyNzIgMCAyNjMzNjg3CisxOTM1MyAwIDI3OTk2ODcKKzIwOTIgMCAyNzMzNjg3CisyMDMgMCAyNjk5Njg3CiszMTAgMCAyNzY2Njg3CisxODgwMCAwIDI5MzM2ODcKKzIwMzggMCAyODY2Njg3CisyNDIgMCAyODMzNjg3CisxOTkgMCAyODk5Njg3CisxNzQ1MiAwIDMwOTk2ODcKKzEwNjAgMCAzMDMzNjg3CiszMDEgMCAyOTY2Njg3Cis0NTIgMCAyOTk5Njg3CisyNTYgMCAzMDY2Njg3CisyMTM1MiAwIDMxOTk2ODcKKzQwOSAwIDMxNjY2ODcKKzE3MyAwIDMxMzM2ODcKKzE5MTQyIDAgMzI5OTY4NworNjQyIDAgMzI2NjY4NworNDY4IDAgMzIzMzY4NworMTkwNjYgMCAzNDMzNjg3Cis2MzUgMCAzMzY2Njg3CisxOTcgMCAzMzMzNjg3CisxOTAgMCAzMzk5Njg3CisxODgxMyAwIDM1NjY2ODcKKzk2OSAwIDM0OTk2ODcKKzE2NSAwIDM0NjY2ODcKKzIwMyAwIDM1MzM2ODcKKzE3MzYyIDAgMzczMzY4NworMjQ2IDAgMzY2NjY4NworMjM2IDAgMzU5OTY4NworMTc0IDAgMzYzMzY4NworMTY0IDAgMzY5OTY4NworMTcwODEgMCAzODk5Njg3CiszNTMgMCAzODMzNjg3CisyMjIgMCAzNzY2Njg3CisxODEgMCAzNzk5Njg3CisxNDggMCAzODY2Njg3CisxMDgzNSAwIDM5OTk2ODcKKzE4NSAwIDM5NjY2ODcKKzEzOSAwIDM5MzM2ODcKKzc1MTAgMCA0MTMzNjg3CisxNDkgMCA0MDY2Njg3CisxMjkgMCA0MDMzNjg3CisxMzIgMCA0MDk5Njg3CisxMDYzIDAgNDE2NjY4NworODA1IDAgNDI2NjY4NworMTU3IDAgNDIzMzY4NworMzk0IDAgNDE5OTY4NworOTA4NDAgMCA0Mzk5Njg3Cis2MTU5IDAgNDMzMzY4NworMTc1MiAwIDQyOTk2ODcKKzk4NSAwIDQzNjY2ODcKKzMxMzM4IDAgNDUzMzY4NworMzM5MCAwIDQ0NjY2ODcKKzc3MiAwIDQ0MzM2ODcKKzc4MSAwIDQ0OTk2ODcKKzMxMDg0IDAgNDY2NjY4NworMzQ5OCAwIDQ1OTk2ODcKKzgxOCAwIDQ1NjY2ODcKKzg4MSAwIDQ2MzM2ODcKKzMwNDE2IDAgNDc5OTY4NworMzI2NSAwIDQ3MzM2ODcKKzgxNSAwIDQ2OTk2ODcKKzc5MCAwIDQ3NjY2ODcKKzMxMDUzIDAgNDkzMzY4NworMzEwNiAwIDQ4NjY2ODcKKzcwOCAwIDQ4MzM2ODcKKzcxMyAwIDQ4OTk2ODcKKzMwMjMwIDAgNTA2NjY4NworMzIxNCAwIDQ5OTk2ODcKKzYzOSAwIDQ5NjY2ODcKKzc2OCAwIDUwMzM2ODcKKzI5NjU3IDAgNTE5OTY4NworMzAxMyAwIDUxMzM2ODcKKzYyMiAwIDUwOTk2ODcKKzcyMCAwIDUxNjY2ODcKKzI5MzQ0IDAgNTMzMzY4NworMzE5NiAwIDUyNjY2ODcKKzcxMyAwIDUyMzM2ODcKKzc3NSAwIDUyOTk2ODcKKzMwNDIwIDAgNTQ2NjY4NworMzM3NCAwIDUzOTk2ODcKKzgwMyAwIDUzNjY2ODcKKzcxNyAwIDU0MzM2ODcKKzI5OTYwIDAgNTU5OTY4NworMzI4MyAwIDU1MzM2ODcKKzc5MyAwIDU0OTk2ODcKKzc5MCAwIDU1NjY2ODcKKzMxMDExIDAgNTczMzY4NworMzM5NyAwIDU2NjY2ODcKKzgwOSAwIDU2MzM2ODcKKzgzMSAwIDU2OTk2ODcKKzMxMTk0IDAgNTg2NjY4NworMzQwMSAwIDU3OTk2ODcKKzgwNyAwIDU3NjY2ODcKKzgyNyAwIDU4MzM2ODcKKzMwMzI2IDAgNTk5OTY4NworMzE4NiAwIDU5MzM2ODcKKzgxOCAwIDU4OTk2ODcKKzg2MyAwIDU5NjY2ODcKKzMxNTU5IDAgNjEzMzY4NworMzM2NCAwIDYwNjY2ODcKKzg0MCAwIDYwMzM2ODcKKzkxOSAwIDYwOTk2ODcKKzMyMDEzIDAgNjI2NjY4NworMzQ5NSAwIDYxOTk2ODcKKzg3MSAwIDYxNjY2ODcKKzgwMyAwIDYyMzM2ODcKKzMwMjk0IDAgNjM5OTY4NworMzE1MyAwIDYzMzM2ODcKKzcxNiAwIDYyOTk2ODcKKzgxMiAwIDYzNjY2ODcKKzI5OTUyIDAgNjUzMzY4NworMzI5OSAwIDY0NjY2ODcKKzgwMSAwIDY0MzM2ODcKKzc0OSAwIDY0OTk2ODcKKzMwNTk4IDAgNjY2NjY4NworMzUzNiAwIDY1OTk2ODcKKzg4NyAwIDY1NjY2ODcKKzg1MCAwIDY2MzM2ODcKKzE3MjQ2IDAgNjY5OTY4NworMzExMTAgMCA2ODMzNjg3CiszMTk4IDAgNjc2NjY4NworODA5IDAgNjczMzY4NworODM2IDAgNjc5OTY4NworMjk3ODQgMCA2OTY2Njg3CiszMTU1IDAgNjg5OTY4NworODU5IDAgNjg2NjY4NworOTU4IDAgNjkzMzY4NworMzA2NjYgMCA3MDk5Njg3CiszMzcxIDAgNzAzMzY4NworODg2IDAgNjk5OTY4NworODYxIDAgNzA2NjY4NworMzA0MTYgMCA3MjMzNjg3CiszMzUwIDAgNzE2NjY4NworOTE3IDAgNzEzMzY4NworOTg3IDAgNzE5OTY4NworMjk1MDkgMCA3MzY2Njg3CiszNTc0IDAgNzI5OTY4NworOTcyIDAgNzI2NjY4NworODg1IDAgNzMzMzY4NworMzA4NzIgMCA3NDk5Njg3CiszMzk5IDAgNzQzMzY4NworODk4IDAgNzM5OTY4NworMTAyNyAwIDc0NjY2ODcKKzMxMTU1IDAgNzYzMzY4NworMzQ1NCAwIDc1NjY2ODcKKzk2NSAwIDc1MzM2ODcKKzg0MSAwIDc1OTk2ODcKKzI4NDg3IDAgNzc2NjY4NworMzYxNiAwIDc2OTk2ODcKKzkyMSAwIDc2NjY2ODcKKzk5MSAwIDc3MzM2ODcKKzIzMjA4IDAgNzg5OTY4NworMzU1MSAwIDc4MzM2ODcKKzkxOCAwIDc3OTk2ODcKKzg5NCAwIDc4NjY2ODcKKzE2OTgyIDAgODAzMzY4NworMzQ1OCAwIDc5NjY2ODcKKzg0NCAwIDc5MzM2ODcKKzk0MyAwIDc5OTk2ODcKKzMwMzk2IDAgODE5OTY4NworNDk2MyAwIDgxMzM2ODcKKzE0MTYgMCA4MDY2Njg3CisxNjM5IDAgODA5OTY4NworNTI0IDAgODE2NjY4NworMTM2OCAwIDgyOTk2ODcKKzU2NSAwIDgyNjY2ODcKKzM5MiAwIDgyMzM2ODcKKzQxMzE3IDEgODM5OTY4NworMTg1IDAgODM2NjY4NworNDc3IDAgODMzMzY4NworNTM0MiAwIDg1MzM2ODcKKzEyNzUgMCA4NDY2Njg3CisxMjEgMCA4NDMzNjg3Cis5ODIgMCA4NDk5Njg3Cis2NDY1IDAgODY5OTY4NworMjYwNiAwIDg2MzM2ODcKKzExNjMgMCA4NTY2Njg3Cis5NDMgMCA4NTk5Njg3CisxMTg2IDAgODY2NjY4NworMTE1OTMgMCA4ODMzNjg3CiszMTIyIDAgODc2NjY4NworMTI3OCAwIDg3MzM2ODcKKzE1OTMgMCA4Nzk5Njg3Cis5MDk5IDAgODk5OTY4NworOTc4IDAgODkzMzY4NworNzQ4IDAgODg2NjY4NworODM1IDAgODg5OTY4NworMzY0IDAgODk2NjY4NworNDc5OSAwIDkwOTk2ODcKKzM2NSAwIDkwNjY2ODcKKzIxNSAwIDkwMzM2ODcKKzQzNjcgMCA5MTk5Njg3CiszMDIgMCA5MTY2Njg3Cis0ODAgMCA5MTMzNjg3Cis2MTgwIDAgOTMzMzY4NworNzcxIDAgOTI2NjY4NworMjQ2IDAgOTIzMzY4NworMjgxIDAgOTI5OTY4NworNDYzNiAwIDkzOTk2ODcKKzIxMSAwIDkzNjY2ODcKKzQwMzcgMCA5NDk5Njg3CiszODIgMCA5NDY2Njg3Cis0ODYgMCA5NDMzNjg3CiszOTc1IDAgOTU5OTY4NworMzEyIDAgOTU2NjY4NworNDc0IDAgOTUzMzY4NworNjg4MCAwIDk3MzM2ODcKKzExMTYgMCA5NjY2Njg3CisyMDYgMCA5NjMzNjg3Cis2OTggMCA5Njk5Njg3Cis2MjU0IDAgOTg5OTY4NworMjU4MSAwIDk4MzM2ODcKKzEzMDMgMCA5NzY2Njg3Cis5ODUgMCA5Nzk5Njg3Cis5NjcgMCA5ODY2Njg3Cis2NDg2IDAgMTAwMzM2ODcKKzM1NTUgMCA5OTY2Njg3CisxNDMwIDAgOTkzMzY4NworMTYwNSAwIDk5OTk2ODcKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZmJmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5pbmZvCkBAIC0wLDAgKzEsNDE0IEBACis1NzYgMSAwCis1NzYgMSAyNDAwMAorNTc2IDEgNDgwMDAKKzU3NiAxIDcyMDAwCis1NzYgMSA5NjAwMAorNTc2IDEgMTIwMDAwCis1NzYgMSAxNDQwMDAKKzU3NiAxIDE2ODAwMAorNTc2IDEgMTkyMDAwCis1NzYgMSAyMTYwMDAKKzU3NiAxIDI0MDAwMAorNTc2IDEgMjY0MDAwCis1NzYgMSAyODgwMDAKKzU3NiAxIDMxMjAwMAorNTc2IDEgMzM2MDAwCis1NzYgMSAzNjAwMDAKKzU3NiAxIDM4NDAwMAorNTc2IDEgNDA4MDAwCis1NzYgMSA0MzIwMDAKKzU3NiAxIDQ1NjAwMAorNTc2IDEgNDgwMDAwCis1NzYgMSA1MDQwMDAKKzU3NiAxIDUyODAwMAorNTc2IDEgNTUyMDAwCis1NzYgMSA1NzYwMDAKKzU3NiAxIDYwMDAwMAorNTc2IDEgNjI0MDAwCis1NzYgMSA2NDgwMDAKKzU3NiAxIDY3MjAwMAorNTc2IDEgNjk2MDAwCis1NzYgMSA3MjAwMDAKKzU3NiAxIDc0NDAwMAorNTc2IDEgNzY4MDAwCis1NzYgMSA3OTIwMDAKKzU3NiAxIDgxNjAwMAorNTc2IDEgODQwMDAwCis1NzYgMSA4NjQwMDAKKzU3NiAxIDg4ODAwMAorNTc2IDEgOTEyMDAwCis1NzYgMSA5MzYwMDAKKzU3NiAxIDk2MDAwMAorNTc2IDEgOTg0MDAwCis1NzYgMSAxMDA4MDAwCis1NzYgMSAxMDMyMDAwCis1NzYgMSAxMDU2MDAwCis1NzYgMSAxMDgwMDAwCis1NzYgMSAxMTA0MDAwCis1NzYgMSAxMTI4MDAwCis1NzYgMSAxMTUyMDAwCis1NzYgMSAxMTc2MDAwCis1NzYgMSAxMjAwMDAwCis1NzYgMSAxMjI0MDAwCis1NzYgMSAxMjQ4MDAwCis1NzYgMSAxMjcyMDAwCis1NzYgMSAxMjk2MDAwCis1NzYgMSAxMzIwMDAwCis1NzYgMSAxMzQ0MDAwCis1NzYgMSAxMzY4MDAwCis1NzYgMSAxMzkyMDAwCis1NzYgMSAxNDE2MDAwCis1NzYgMSAxNDQwMDAwCis1NzYgMSAxNDY0MDAwCis1NzYgMSAxNDg4MDAwCis1NzYgMSAxNTEyMDAwCis1NzYgMSAxNTM2MDAwCis1NzYgMSAxNTYwMDAwCis1NzYgMSAxNTg0MDAwCis1NzYgMSAxNjA4MDAwCis1NzYgMSAxNjMyMDAwCis1NzYgMSAxNjU2MDAwCis1NzYgMSAxNjgwMDAwCis1NzYgMSAxNzA0MDAwCis1NzYgMSAxNzI4MDAwCis1NzYgMSAxNzUyMDAwCis1NzYgMSAxNzc2MDAwCis1NzYgMSAxODAwMDAwCis1NzYgMSAxODI0MDAwCis1NzYgMSAxODQ4MDAwCis1NzYgMSAxODcyMDAwCis1NzYgMSAxODk2MDAwCis1NzYgMSAxOTIwMDAwCis1NzYgMSAxOTQ0MDAwCis1NzYgMSAxOTY4MDAwCis1NzYgMSAxOTkyMDAwCis1NzYgMSAyMDE2MDAwCis1NzYgMSAyMDQwMDAwCis1NzYgMSAyMDY0MDAwCis1NzYgMSAyMDg4MDAwCis1NzYgMSAyMTEyMDAwCis1NzYgMSAyMTM2MDAwCis1NzYgMSAyMTYwMDAwCis1NzYgMSAyMTg0MDAwCis1NzYgMSAyMjA4MDAwCis1NzYgMSAyMjMyMDAwCis1NzYgMSAyMjU2MDAwCis1NzYgMSAyMjgwMDAwCis1NzYgMSAyMzA0MDAwCis1NzYgMSAyMzI4MDAwCis1NzYgMSAyMzUyMDAwCis1NzYgMSAyMzc2MDAwCis1NzYgMSAyNDAwMDAwCis1NzYgMSAyNDI0MDAwCis1NzYgMSAyNDQ4MDAwCis1NzYgMSAyNDcyMDAwCis1NzYgMSAyNDk2MDAwCis1NzYgMSAyNTIwMDAwCis1NzYgMSAyNTQ0MDAwCis1NzYgMSAyNTY4MDAwCis1NzYgMSAyNTkyMDAwCis1NzYgMSAyNjE2MDAwCis1NzYgMSAyNjQwMDAwCis1NzYgMSAyNjY0MDAwCis1NzYgMSAyNjg4MDAwCis1NzYgMSAyNzEyMDAwCis1NzYgMSAyNzM2MDAwCis1NzYgMSAyNzYwMDAwCis1NzYgMSAyNzg0MDAwCis1NzYgMSAyODA4MDAwCis1NzYgMSAyODMyMDAwCis1NzYgMSAyODU2MDAwCis1NzYgMSAyODgwMDAwCis1NzYgMSAyOTA0MDAwCis1NzYgMSAyOTI4MDAwCis1NzYgMSAyOTUyMDAwCis1NzYgMSAyOTc2MDAwCis1NzYgMSAzMDAwMDAwCis1NzYgMSAzMDI0MDAwCis1NzYgMSAzMDQ4MDAwCis1NzYgMSAzMDcyMDAwCis1NzYgMSAzMDk2MDAwCis1NzYgMSAzMTIwMDAwCis1NzYgMSAzMTQ0MDAwCis1NzYgMSAzMTY4MDAwCis1NzYgMSAzMTkyMDAwCis1NzYgMSAzMjE2MDAwCis1NzYgMSAzMjQwMDAwCis1NzYgMSAzMjY0MDAwCis1NzYgMSAzMjg4MDAwCis1NzYgMSAzMzEyMDAwCis1NzYgMSAzMzM2MDAwCis1NzYgMSAzMzYwMDAwCis1NzYgMSAzMzg0MDAwCis1NzYgMSAzNDA4MDAwCis1NzYgMSAzNDMyMDAwCis1NzYgMSAzNDU2MDAwCis1NzYgMSAzNDgwMDAwCis1NzYgMSAzNTA0MDAwCis1NzYgMSAzNTI4MDAwCis1NzYgMSAzNTUyMDAwCis1NzYgMSAzNTc2MDAwCis1NzYgMSAzNjAwMDAwCis1NzYgMSAzNjI0MDAwCis1NzYgMSAzNjQ4MDAwCis1NzYgMSAzNjcyMDAwCis1NzYgMSAzNjk2MDAwCis1NzYgMSAzNzIwMDAwCis1NzYgMSAzNzQ0MDAwCis1NzYgMSAzNzY4MDAwCis1NzYgMSAzNzkyMDAwCis1NzYgMSAzODE2MDAwCis1NzYgMSAzODQwMDAwCis1NzYgMSAzODY0MDAwCis1NzYgMSAzODg4MDAwCis1NzYgMSAzOTEyMDAwCis1NzYgMSAzOTM2MDAwCis1NzYgMSAzOTYwMDAwCis1NzYgMSAzOTg0MDAwCis1NzYgMSA0MDA4MDAwCis1NzYgMSA0MDMyMDAwCis1NzYgMSA0MDU2MDAwCis1NzYgMSA0MDgwMDAwCis1NzYgMSA0MTA0MDAwCis1NzYgMSA0MTI4MDAwCis1NzYgMSA0MTUyMDAwCis1NzYgMSA0MTc2MDAwCis1NzYgMSA0MjAwMDAwCis1NzYgMSA0MjI0MDAwCis1NzYgMSA0MjQ4MDAwCis1NzYgMSA0MjcyMDAwCis1NzYgMSA0Mjk2MDAwCis1NzYgMSA0MzIwMDAwCis1NzYgMSA0MzQ0MDAwCis1NzYgMSA0MzY4MDAwCis1NzYgMSA0MzkyMDAwCis1NzYgMSA0NDE2MDAwCis1NzYgMSA0NDQwMDAwCis1NzYgMSA0NDY0MDAwCis1NzYgMSA0NDg4MDAwCis1NzYgMSA0NTEyMDAwCis1NzYgMSA0NTM2MDAwCis1NzYgMSA0NTYwMDAwCis1NzYgMSA0NTg0MDAwCis1NzYgMSA0NjA4MDAwCis1NzYgMSA0NjMyMDAwCis1NzYgMSA0NjU2MDAwCis1NzYgMSA0NjgwMDAwCis1NzYgMSA0NzA0MDAwCis1NzYgMSA0NzI4MDAwCis1NzYgMSA0NzUyMDAwCis1NzYgMSA0Nzc2MDAwCis1NzYgMSA0ODAwMDAwCis1NzYgMSA0ODI0MDAwCis1NzYgMSA0ODQ4MDAwCis1NzYgMSA0ODcyMDAwCis1NzYgMSA0ODk2MDAwCis1NzYgMSA0OTIwMDAwCis1NzYgMSA0OTQ0MDAwCis1NzYgMSA0OTY4MDAwCis1NzYgMSA0OTkyMDAwCis1NzYgMSA1MDE2MDAwCis1NzYgMSA1MDQwMDAwCis1NzYgMSA1MDY0MDAwCis1NzYgMSA1MDg4MDAwCis1NzYgMSA1MTEyMDAwCis1NzYgMSA1MTM2MDAwCis1NzYgMSA1MTYwMDAwCis1NzYgMSA1MTg0MDAwCis1NzYgMSA1MjA4MDAwCis1NzYgMSA1MjMyMDAwCis1NzYgMSA1MjU2MDAwCis1NzYgMSA1MjgwMDAwCis1NzYgMSA1MzA0MDAwCis1NzYgMSA1MzI4MDAwCis1NzYgMSA1MzUyMDAwCis1NzYgMSA1Mzc2MDAwCis1NzYgMSA1NDAwMDAwCis1NzYgMSA1NDI0MDAwCis1NzYgMSA1NDQ4MDAwCis1NzYgMSA1NDcyMDAwCis1NzYgMSA1NDk2MDAwCis1NzYgMSA1NTIwMDAwCis1NzYgMSA1NTQ0MDAwCis1NzYgMSA1NTY4MDAwCis1NzYgMSA1NTkyMDAwCis1NzYgMSA1NjE2MDAwCis1NzYgMSA1NjQwMDAwCis1NzYgMSA1NjY0MDAwCis1NzYgMSA1Njg4MDAwCis1NzYgMSA1NzEyMDAwCis1NzYgMSA1NzM2MDAwCis1NzYgMSA1NzYwMDAwCis1NzYgMSA1Nzg0MDAwCis1NzYgMSA1ODA4MDAwCis1NzYgMSA1ODMyMDAwCis1NzYgMSA1ODU2MDAwCis1NzYgMSA1ODgwMDAwCis1NzYgMSA1OTA0MDAwCis1NzYgMSA1OTI4MDAwCis1NzYgMSA1OTUyMDAwCis1NzYgMSA1OTc2MDAwCis1NzYgMSA2MDAwMDAwCis1NzYgMSA2MDI0MDAwCis1NzYgMSA2MDQ4MDAwCis1NzYgMSA2MDcyMDAwCis1NzYgMSA2MDk2MDAwCis1NzYgMSA2MTIwMDAwCis1NzYgMSA2MTQ0MDAwCis1NzYgMSA2MTY4MDAwCis1NzYgMSA2MTkyMDAwCis1NzYgMSA2MjE2MDAwCis1NzYgMSA2MjQwMDAwCis1NzYgMSA2MjY0MDAwCis1NzYgMSA2Mjg4MDAwCis1NzYgMSA2MzEyMDAwCis1NzYgMSA2MzM2MDAwCis1NzYgMSA2MzYwMDAwCis1NzYgMSA2Mzg0MDAwCis1NzYgMSA2NDA4MDAwCis1NzYgMSA2NDMyMDAwCis1NzYgMSA2NDU2MDAwCis1NzYgMSA2NDgwMDAwCis1NzYgMSA2NTA0MDAwCis1NzYgMSA2NTI4MDAwCis1NzYgMSA2NTUyMDAwCis1NzYgMSA2NTc2MDAwCis1NzYgMSA2NjAwMDAwCis1NzYgMSA2NjI0MDAwCis1NzYgMSA2NjQ4MDAwCis1NzYgMSA2NjcyMDAwCis1NzYgMSA2Njk2MDAwCis1NzYgMSA2NzIwMDAwCis1NzYgMSA2NzQ0MDAwCis1NzYgMSA2NzY4MDAwCis1NzYgMSA2NzkyMDAwCis1NzYgMSA2ODE2MDAwCis1NzYgMSA2ODQwMDAwCis1NzYgMSA2ODY0MDAwCis1NzYgMSA2ODg4MDAwCis1NzYgMSA2OTEyMDAwCis1NzYgMSA2OTM2MDAwCis1NzYgMSA2OTYwMDAwCis1NzYgMSA2OTg0MDAwCis1NzYgMSA3MDA4MDAwCis1NzYgMSA3MDMyMDAwCis1NzYgMSA3MDU2MDAwCis1NzYgMSA3MDgwMDAwCis1NzYgMSA3MTA0MDAwCis1NzYgMSA3MTI4MDAwCis1NzYgMSA3MTUyMDAwCis1NzYgMSA3MTc2MDAwCis1NzYgMSA3MjAwMDAwCis1NzYgMSA3MjI0MDAwCis1NzYgMSA3MjQ4MDAwCis1NzYgMSA3MjcyMDAwCis1NzYgMSA3Mjk2MDAwCis1NzYgMSA3MzIwMDAwCis1NzYgMSA3MzQ0MDAwCis1NzYgMSA3MzY4MDAwCis1NzYgMSA3MzkyMDAwCis1NzYgMSA3NDE2MDAwCis1NzYgMSA3NDQwMDAwCis1NzYgMSA3NDY0MDAwCis1NzYgMSA3NDg4MDAwCis1NzYgMSA3NTEyMDAwCis1NzYgMSA3NTM2MDAwCis1NzYgMSA3NTYwMDAwCis1NzYgMSA3NTg0MDAwCis1NzYgMSA3NjA4MDAwCis1NzYgMSA3NjMyMDAwCis1NzYgMSA3NjU2MDAwCis1NzYgMSA3NjgwMDAwCis1NzYgMSA3NzA0MDAwCis1NzYgMSA3NzI4MDAwCis1NzYgMSA3NzUyMDAwCis1NzYgMSA3Nzc2MDAwCis1NzYgMSA3ODAwMDAwCis1NzYgMSA3ODI0MDAwCis1NzYgMSA3ODQ4MDAwCis1NzYgMSA3ODcyMDAwCis1NzYgMSA3ODk2MDAwCis1NzYgMSA3OTIwMDAwCis1NzYgMSA3OTQ0MDAwCis1NzYgMSA3OTY4MDAwCis1NzYgMSA3OTkyMDAwCis1NzYgMSA4MDE2MDAwCis1NzYgMSA4MDQwMDAwCis1NzYgMSA4MDY0MDAwCis1NzYgMSA4MDg4MDAwCis1NzYgMSA4MTEyMDAwCis1NzYgMSA4MTM2MDAwCis1NzYgMSA4MTYwMDAwCis1NzYgMSA4MTg0MDAwCis1NzYgMSA4MjA4MDAwCis1NzYgMSA4MjMyMDAwCis1NzYgMSA4MjU2MDAwCis1NzYgMSA4MjgwMDAwCis1NzYgMSA4MzA0MDAwCis1NzYgMSA4MzI4MDAwCis1NzYgMSA4MzUyMDAwCis1NzYgMSA4Mzc2MDAwCis1NzYgMSA4NDAwMDAwCis1NzYgMSA4NDI0MDAwCis1NzYgMSA4NDQ4MDAwCis1NzYgMSA4NDcyMDAwCis1NzYgMSA4NDk2MDAwCis1NzYgMSA4NTIwMDAwCis1NzYgMSA4NTQ0MDAwCis1NzYgMSA4NTY4MDAwCis1NzYgMSA4NTkyMDAwCis1NzYgMSA4NjE2MDAwCis1NzYgMSA4NjQwMDAwCis1NzYgMSA4NjY0MDAwCis1NzYgMSA4Njg4MDAwCis1NzYgMSA4NzEyMDAwCis1NzYgMSA4NzM2MDAwCis1NzYgMSA4NzYwMDAwCis1NzYgMSA4Nzg0MDAwCis1NzYgMSA4ODA4MDAwCis1NzYgMSA4ODMyMDAwCis1NzYgMSA4ODU2MDAwCis1NzYgMSA4ODgwMDAwCis1NzYgMSA4OTA0MDAwCis1NzYgMSA4OTI4MDAwCis1NzYgMSA4OTUyMDAwCis1NzYgMSA4OTc2MDAwCis1NzYgMSA5MDAwMDAwCis1NzYgMSA5MDI0MDAwCis1NzYgMSA5MDQ4MDAwCis1NzYgMSA5MDcyMDAwCis1NzYgMSA5MDk2MDAwCis1NzYgMSA5MTIwMDAwCis1NzYgMSA5MTQ0MDAwCis1NzYgMSA5MTY4MDAwCis1NzYgMSA5MTkyMDAwCis1NzYgMSA5MjE2MDAwCis1NzYgMSA5MjQwMDAwCis1NzYgMSA5MjY0MDAwCis1NzYgMSA5Mjg4MDAwCis1NzYgMSA5MzEyMDAwCis1NzYgMSA5MzM2MDAwCis1NzYgMSA5MzYwMDAwCis1NzYgMSA5Mzg0MDAwCis1NzYgMSA5NDA4MDAwCis1NzYgMSA5NDMyMDAwCis1NzYgMSA5NDU2MDAwCis1NzYgMSA5NDgwMDAwCis1NzYgMSA5NTA0MDAwCis1NzYgMSA5NTI4MDAwCis1NzYgMSA5NTUyMDAwCis1NzYgMSA5NTc2MDAwCis1NzYgMSA5NjAwMDAwCis1NzYgMSA5NjI0MDAwCis1NzYgMSA5NjQ4MDAwCis1NzYgMSA5NjcyMDAwCis1NzYgMSA5Njk2MDAwCis1NzYgMSA5NzIwMDAwCis1NzYgMSA5NzQ0MDAwCis1NzYgMSA5NzY4MDAwCis1NzYgMSA5NzkyMDAwCis1NzYgMSA5ODE2MDAwCis1NzYgMSA5ODQwMDAwCis1NzYgMSA5ODY0MDAwCis1NzYgMSA5ODg4MDAwCis1NzYgMSA5OTEyMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5tcDMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5tcDMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgzYTQ0MTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5tcDMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1Yzc1ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8KQEAgLTAsMCArMSwzODUgQEAKKzU3NiAxIDAKKzU3NiAxIDI0MDAwCisxMTUyIDEgNDgwMDAKKzExNTIgMSA5NjAwMAorMTE1MiAxIDE0NDAwMAorMTE1MiAxIDE5MjAwMAorMTcyOCAxIDI0MDAwMAorMTcyOCAxIDMxMjAwMAorMTcyOCAxIDM4NDAwMAorMTcyOCAxIDQ1NjAwMAorMTcyOCAxIDUyODAwMAorMjMwNCAxIDYwMDAwMAorMjMwNCAxIDY5NjAwMAorMjMwNCAxIDc5MjAwMAorMjMwNCAxIDg4ODAwMAorMjMwNCAxIDk4NDAwMAorNTc2IDEgMTA4MDAwMAorNTc2IDEgMTEwNDAwMAorNTc2IDEgMTEyODAwMAorNTc2IDEgMTE1MjAwMAorNTc2IDEgMTE3NjAwMAorNTc2IDEgMTIwMDAwMAorNTc2IDEgMTIyNDAwMAorNTc2IDEgMTI0ODAwMAorNTc2IDEgMTI3MjAwMAorNTc2IDEgMTI5NjAwMAorNTc2IDEgMTMyMDAwMAorNTc2IDEgMTM0NDAwMAorNTc2IDEgMTM2ODAwMAorNTc2IDEgMTM5MjAwMAorNTc2IDEgMTQxNjAwMAorNTc2IDEgMTQ0MDAwMAorNTc2IDEgMTQ2NDAwMAorNTc2IDEgMTQ4ODAwMAorNTc2IDEgMTUxMjAwMAorNTc2IDEgMTUzNjAwMAorNTc2IDEgMTU2MDAwMAorNTc2IDEgMTU4NDAwMAorNTc2IDEgMTYwODAwMAorNTc2IDEgMTYzMjAwMAorNTc2IDEgMTY1NjAwMAorNTc2IDEgMTY4MDAwMAorNTc2IDEgMTcwNDAwMAorNTc2IDEgMTcyODAwMAorNTc2IDEgMTc1MjAwMAorNTc2IDEgMTc3NjAwMAorNTc2IDEgMTgwMDAwMAorNTc2IDEgMTgyNDAwMAorNTc2IDEgMTg0ODAwMAorNTc2IDEgMTg3MjAwMAorNTc2IDEgMTg5NjAwMAorNTc2IDEgMTkyMDAwMAorNTc2IDEgMTk0NDAwMAorNTc2IDEgMTk2ODAwMAorNTc2IDEgMTk5MjAwMAorNTc2IDEgMjAxNjAwMAorNTc2IDEgMjA0MDAwMAorNTc2IDEgMjA2NDAwMAorNTc2IDEgMjA4ODAwMAorNTc2IDEgMjExMjAwMAorNTc2IDEgMjEzNjAwMAorNTc2IDEgMjE2MDAwMAorNTc2IDEgMjE4NDAwMAorNTc2IDEgMjIwODAwMAorNTc2IDEgMjIzMjAwMAorNTc2IDEgMjI1NjAwMAorNTc2IDEgMjI4MDAwMAorNTc2IDEgMjMwNDAwMAorNTc2IDEgMjMyODAwMAorNTc2IDEgMjM1MjAwMAorNTc2IDEgMjM3NjAwMAorNTc2IDEgMjQwMDAwMAorNTc2IDEgMjQyNDAwMAorNTc2IDEgMjQ0ODAwMAorNTc2IDEgMjQ3MjAwMAorNTc2IDEgMjQ5NjAwMAorNTc2IDEgMjUyMDAwMAorNTc2IDEgMjU0NDAwMAorNTc2IDEgMjU2ODAwMAorNTc2IDEgMjU5MjAwMAorNTc2IDEgMjYxNjAwMAorNTc2IDEgMjY0MDAwMAorNTc2IDEgMjY2NDAwMAorNTc2IDEgMjY4ODAwMAorNTc2IDEgMjcxMjAwMAorNTc2IDEgMjczNjAwMAorNTc2IDEgMjc2MDAwMAorNTc2IDEgMjc4NDAwMAorNTc2IDEgMjgwODAwMAorNTc2IDEgMjgzMjAwMAorNTc2IDEgMjg1NjAwMAorNTc2IDEgMjg4MDAwMAorNTc2IDEgMjkwNDAwMAorNTc2IDEgMjkyODAwMAorNTc2IDEgMjk1MjAwMAorNTc2IDEgMjk3NjAwMAorNTc2IDEgMzAwMDAwMAorNTc2IDEgMzAyNDAwMAorNTc2IDEgMzA0ODAwMAorNTc2IDEgMzA3MjAwMAorNTc2IDEgMzA5NjAwMAorNTc2IDEgMzEyMDAwMAorNTc2IDEgMzE0NDAwMAorNTc2IDEgMzE2ODAwMAorNTc2IDEgMzE5MjAwMAorNTc2IDEgMzIxNjAwMAorNTc2IDEgMzI0MDAwMAorNTc2IDEgMzI2NDAwMAorNTc2IDEgMzI4ODAwMAorNTc2IDEgMzMxMjAwMAorNTc2IDEgMzMzNjAwMAorNTc2IDEgMzM2MDAwMAorNTc2IDEgMzM4NDAwMAorNTc2IDEgMzQwODAwMAorNTc2IDEgMzQzMjAwMAorNTc2IDEgMzQ1NjAwMAorNTc2IDEgMzQ4MDAwMAorNTc2IDEgMzUwNDAwMAorNTc2IDEgMzUyODAwMAorNTc2IDEgMzU1MjAwMAorNTc2IDEgMzU3NjAwMAorNTc2IDEgMzYwMDAwMAorNTc2IDEgMzYyNDAwMAorNTc2IDEgMzY0ODAwMAorNTc2IDEgMzY3MjAwMAorNTc2IDEgMzY5NjAwMAorNTc2IDEgMzcyMDAwMAorNTc2IDEgMzc0NDAwMAorNTc2IDEgMzc2ODAwMAorNTc2IDEgMzc5MjAwMAorNTc2IDEgMzgxNjAwMAorNTc2IDEgMzg0MDAwMAorNTc2IDEgMzg2NDAwMAorNTc2IDEgMzg4ODAwMAorNTc2IDEgMzkxMjAwMAorNTc2IDEgMzkzNjAwMAorNTc2IDEgMzk2MDAwMAorNTc2IDEgMzk4NDAwMAorNTc2IDEgNDAwODAwMAorNTc2IDEgNDAzMjAwMAorNTc2IDEgNDA1NjAwMAorNTc2IDEgNDA4MDAwMAorNTc2IDEgNDEwNDAwMAorNTc2IDEgNDEyODAwMAorNTc2IDEgNDE1MjAwMAorNTc2IDEgNDE3NjAwMAorNTc2IDEgNDIwMDAwMAorNTc2IDEgNDIyNDAwMAorNTc2IDEgNDI0ODAwMAorNTc2IDEgNDI3MjAwMAorNTc2IDEgNDI5NjAwMAorNTc2IDEgNDMyMDAwMAorNTc2IDEgNDM0NDAwMAorNTc2IDEgNDM2ODAwMAorNTc2IDEgNDM5MjAwMAorNTc2IDEgNDQxNjAwMAorNTc2IDEgNDQ0MDAwMAorNTc2IDEgNDQ2NDAwMAorNTc2IDEgNDQ4ODAwMAorNTc2IDEgNDUxMjAwMAorNTc2IDEgNDUzNjAwMAorNTc2IDEgNDU2MDAwMAorNTc2IDEgNDU4NDAwMAorNTc2IDEgNDYwODAwMAorNTc2IDEgNDYzMjAwMAorNTc2IDEgNDY1NjAwMAorNTc2IDEgNDY4MDAwMAorNTc2IDEgNDcwNDAwMAorNTc2IDEgNDcyODAwMAorNTc2IDEgNDc1MjAwMAorNTc2IDEgNDc3NjAwMAorNTc2IDEgNDgwMDAwMAorNTc2IDEgNDgyNDAwMAorNTc2IDEgNDg0ODAwMAorNTc2IDEgNDg3MjAwMAorNTc2IDEgNDg5NjAwMAorNTc2IDEgNDkyMDAwMAorNTc2IDEgNDk0NDAwMAorNTc2IDEgNDk2ODAwMAorNTc2IDEgNDk5MjAwMAorNTc2IDEgNTAxNjAwMAorNTc2IDEgNTA0MDAwMAorNTc2IDEgNTA2NDAwMAorNTc2IDEgNTA4ODAwMAorNTc2IDEgNTExMjAwMAorNTc2IDEgNTEzNjAwMAorNTc2IDEgNTE2MDAwMAorNTc2IDEgNTE4NDAwMAorNTc2IDEgNTIwODAwMAorNTc2IDEgNTIzMjAwMAorNTc2IDEgNTI1NjAwMAorNTc2IDEgNTI4MDAwMAorNTc2IDEgNTMwNDAwMAorNTc2IDEgNTMyODAwMAorNTc2IDEgNTM1MjAwMAorNTc2IDEgNTM3NjAwMAorNTc2IDEgNTQwMDAwMAorNTc2IDEgNTQyNDAwMAorNTc2IDEgNTQ0ODAwMAorNTc2IDEgNTQ3MjAwMAorNTc2IDEgNTQ5NjAwMAorNTc2IDEgNTUyMDAwMAorNTc2IDEgNTU0NDAwMAorNTc2IDEgNTU2ODAwMAorNTc2IDEgNTU5MjAwMAorNTc2IDEgNTYxNjAwMAorNTc2IDEgNTY0MDAwMAorNTc2IDEgNTY2NDAwMAorNTc2IDEgNTY4ODAwMAorNTc2IDEgNTcxMjAwMAorNTc2IDEgNTczNjAwMAorNTc2IDEgNTc2MDAwMAorNTc2IDEgNTc4NDAwMAorNTc2IDEgNTgwODAwMAorNTc2IDEgNTgzMjAwMAorNTc2IDEgNTg1NjAwMAorNTc2IDEgNTg4MDAwMAorNTc2IDEgNTkwNDAwMAorNTc2IDEgNTkyODAwMAorNTc2IDEgNTk1MjAwMAorNTc2IDEgNTk3NjAwMAorNTc2IDEgNjAwMDAwMAorNTc2IDEgNjAyNDAwMAorNTc2IDEgNjA0ODAwMAorNTc2IDEgNjA3MjAwMAorNTc2IDEgNjA5NjAwMAorNTc2IDEgNjEyMDAwMAorNTc2IDEgNjE0NDAwMAorNTc2IDEgNjE2ODAwMAorNTc2IDEgNjE5MjAwMAorNTc2IDEgNjIxNjAwMAorNTc2IDEgNjI0MDAwMAorNTc2IDEgNjI2NDAwMAorNTc2IDEgNjI4ODAwMAorNTc2IDEgNjMxMjAwMAorNTc2IDEgNjMzNjAwMAorNTc2IDEgNjM2MDAwMAorNTc2IDEgNjM4NDAwMAorNTc2IDEgNjQwODAwMAorNTc2IDEgNjQzMjAwMAorNTc2IDEgNjQ1NjAwMAorNTc2IDEgNjQ4MDAwMAorNTc2IDEgNjUwNDAwMAorNTc2IDEgNjUyODAwMAorNTc2IDEgNjU1MjAwMAorNTc2IDEgNjU3NjAwMAorNTc2IDEgNjYwMDAwMAorNTc2IDEgNjYyNDAwMAorNTc2IDEgNjY0ODAwMAorNTc2IDEgNjY3MjAwMAorNTc2IDEgNjY5NjAwMAorNTc2IDEgNjcyMDAwMAorNTc2IDEgNjc0NDAwMAorNTc2IDEgNjc2ODAwMAorNTc2IDEgNjc5MjAwMAorNTc2IDEgNjgxNjAwMAorNTc2IDEgNjg0MDAwMAorNTc2IDEgNjg2NDAwMAorNTc2IDEgNjg4ODAwMAorNTc2IDEgNjkxMjAwMAorNTc2IDEgNjkzNjAwMAorNTc2IDEgNjk2MDAwMAorNTc2IDEgNjk4NDAwMAorNTc2IDEgNzAwODAwMAorNTc2IDEgNzAzMjAwMAorNTc2IDEgNzA1NjAwMAorNTc2IDEgNzA4MDAwMAorNTc2IDEgNzEwNDAwMAorNTc2IDEgNzEyODAwMAorNTc2IDEgNzE1MjAwMAorNTc2IDEgNzE3NjAwMAorNTc2IDEgNzIwMDAwMAorNTc2IDEgNzIyNDAwMAorNTc2IDEgNzI0ODAwMAorNTc2IDEgNzI3MjAwMAorNTc2IDEgNzI5NjAwMAorNTc2IDEgNzMyMDAwMAorNTc2IDEgNzM0NDAwMAorNTc2IDEgNzM2ODAwMAorNTc2IDEgNzM5MjAwMAorNTc2IDEgNzQxNjAwMAorNTc2IDEgNzQ0MDAwMAorNTc2IDEgNzQ2NDAwMAorNTc2IDEgNzQ4ODAwMAorNTc2IDEgNzUxMjAwMAorNTc2IDEgNzUzNjAwMAorNTc2IDEgNzU2MDAwMAorNTc2IDEgNzU4NDAwMAorNTc2IDEgNzYwODAwMAorNTc2IDEgNzYzMjAwMAorNTc2IDEgNzY1NjAwMAorNTc2IDEgNzY4MDAwMAorNTc2IDEgNzcwNDAwMAorNTc2IDEgNzcyODAwMAorNTc2IDEgNzc1MjAwMAorNTc2IDEgNzc3NjAwMAorNTc2IDEgNzgwMDAwMAorNTc2IDEgNzgyNDAwMAorNTc2IDEgNzg0ODAwMAorNTc2IDEgNzg3MjAwMAorNTc2IDEgNzg5NjAwMAorNTc2IDEgNzkyMDAwMAorNTc2IDEgNzk0NDAwMAorNTc2IDEgNzk2ODAwMAorNTc2IDEgNzk5MjAwMAorNTc2IDEgODAxNjAwMAorNTc2IDEgODA0MDAwMAorNTc2IDEgODA2NDAwMAorNTc2IDEgODA4ODAwMAorNTc2IDEgODExMjAwMAorNTc2IDEgODEzNjAwMAorNTc2IDEgODE2MDAwMAorNTc2IDEgODE4NDAwMAorNTc2IDEgODIwODAwMAorNTc2IDEgODIzMjAwMAorNTc2IDEgODI1NjAwMAorNTc2IDEgODI4MDAwMAorNTc2IDEgODMwNDAwMAorNTc2IDEgODMyODAwMAorNTc2IDEgODM1MjAwMAorNTc2IDEgODM3NjAwMAorNTc2IDEgODQwMDAwMAorNTc2IDEgODQyNDAwMAorNTc2IDEgODQ0ODAwMAorNTc2IDEgODQ3MjAwMAorNTc2IDEgODQ5NjAwMAorNTc2IDEgODUyMDAwMAorNTc2IDEgODU0NDAwMAorNTc2IDEgODU2ODAwMAorNTc2IDEgODU5MjAwMAorNTc2IDEgODYxNjAwMAorNTc2IDEgODY0MDAwMAorNTc2IDEgODY2NDAwMAorNTc2IDEgODY4ODAwMAorNTc2IDEgODcxMjAwMAorNTc2IDEgODczNjAwMAorNTc2IDEgODc2MDAwMAorNTc2IDEgODc4NDAwMAorNTc2IDEgODgwODAwMAorNTc2IDEgODgzMjAwMAorNTc2IDEgODg1NjAwMAorNTc2IDEgODg4MDAwMAorNTc2IDEgODkwNDAwMAorNTc2IDEgODkyODAwMAorNTc2IDEgODk1MjAwMAorNTc2IDEgODk3NjAwMAorNTc2IDEgOTAwMDAwMAorNTc2IDEgOTAyNDAwMAorNTc2IDEgOTA0ODAwMAorNTc2IDEgOTA3MjAwMAorNTc2IDEgOTA5NjAwMAorNTc2IDEgOTEyMDAwMAorNTc2IDEgOTE0NDAwMAorNTc2IDEgOTE2ODAwMAorNTc2IDEgOTE5MjAwMAorNTc2IDEgOTIxNjAwMAorNTc2IDEgOTI0MDAwMAorNTc2IDEgOTI2NDAwMAorNTc2IDEgOTI4ODAwMAorNTc2IDEgOTMxMjAwMAorNTc2IDEgOTMzNjAwMAorNTc2IDEgOTM2MDAwMAorNTc2IDEgOTM4NDAwMAorNTc2IDEgOTQwODAwMAorNTc2IDEgOTQzMjAwMAorNTc2IDEgOTQ1NjAwMAorNTc2IDEgOTQ4MDAwMAorNTc2IDEgOTUwNDAwMAorNTc2IDEgOTUyODAwMAorNTc2IDEgOTU1MjAwMAorNTc2IDEgOTU3NjAwMAorNTc2IDEgOTYwMDAwMAorNTc2IDEgOTYyNDAwMAorNTc2IDEgOTY0ODAwMAorNTc2IDEgOTY3MjAwMAorNTc2IDEgOTY5NjAwMAorNTc2IDEgOTcyMDAwMAorNTc2IDEgOTc0NDAwMAorNTc2IDEgOTc2ODAwMAorNTc2IDEgOTc5MjAwMAorNTc2IDEgOTgxNjAwMAorNTc2IDEgOTg0MDAwMAorNTc2IDEgOTg2NDAwMAorNTc2IDEgOTg4ODAwMAorNTc2IDEgOTkxMjAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTQwNjQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLmluZm8KQEAgLTAsMCArMSwyNDkgQEAKKzY0NTggMSA0MDAwMAorNDA0MCAwIDgwMDAwCiszMjU1IDAgMTIwMDAwCiszMDI2IDAgMTYwMDAwCiszMjkzIDAgMjAwMDAwCiszMDg5IDAgMjQwMDAwCiszMzA1IDAgMjgwMDAwCisxNzk0IDAgMzIwMDAwCisxODQ4IDAgMzYwMDAwCisxMjg4IDAgNDAwMDAwCisxNTExIDAgNDQwMDAwCisxNTI3IDAgNDgwMDAwCis2MTQ2IDEgNTIwMDAwCisxMjQzIDAgNTYwMDAwCisxMDk5IDAgNjAwMDAwCisxMzU0IDAgNjQwMDAwCisxMzY2IDAgNjgwMDAwCisxMDQyIDAgNzIwMDAwCisxNjAwIDAgNzYwMDAwCis4NzUgMCA4MDAwMDAKKzE3MjggMCA4NDAwMDAKKzEyNTQgMCA4ODAwMDAKKzk5NCAwIDkyMDAwMAorMTU5MSAwIDk2MDAwMAorNjI2NSAxIDEwMDAwMDAKKzEwMTggMCAxMDQwMDAwCis4MjUgMCAxMDgwMDAwCis4NjkgMCAxMTIwMDAwCis5MjEgMCAxMTYwMDAwCis5NzUgMCAxMjAwMDAwCis5MjQgMCAxMjQwMDAwCis4MzQgMCAxMjgwMDAwCisxMDY2IDAgMTMyMDAwMAorNzkzIDAgMTM2MDAwMAorODg5IDAgMTQwMDAwMAorMjA1MCAwIDE0NDAwMDAKKzYyNzYgMSAxNDgwMDAwCis4ODEgMCAxNTIwMDAwCisyNjAgMCAxNTYwMDAwCis3MzAgMCAxNjAwMDAwCis0MzEgMCAxNjQwMDAwCiszNTEgMCAxNjgwMDAwCiszMjEgMCAxNzIwMDAwCiszODAyIDAgMTc2MDAwMAorMTQ2IDAgMTgwMDAwMAorNjQ2MiAwIDE4NDAwMDAKKzMyNDYgMCAxODgwMDAwCis1MzMgMCAxOTIwMDAwCis2MjMxIDEgMTk2MDAwMAorMTM3OCAwIDIwMDAwMDAKKzcxOSAwIDIwNDAwMDAKKzgxOCAwIDIwODAwMDAKKzg1NiAwIDIxMjAwMDAKKzkzNyAwIDIxNjAwMDAKKzYxMSAwIDIyMDAwMDAKKzMwMzEgMCAyMjQwMDAwCisxMDQxIDAgMjI4MDAwMAorNjA0IDAgMjMyMDAwMAorNzE0IDAgMjM2MDAwMAorMTI4MyAwIDI0MDAwMDAKKzc1NjUgMSAyNDQwMDAwCis2MDIgMCAyNDgwMDAwCis1MzAgMCAyNTIwMDAwCisyNTc5IDAgMjU2MDAwMAorMTE1IDAgMjYwMDAwMAorMTA1OCAwIDI2NDAwMDAKKzY4OSAwIDI2ODAwMDAKKzExMTkgMCAyNzIwMDAwCis2OTggMCAyNzYwMDAwCisxMDA2IDAgMjgwMDAwMAorNTQ1IDAgMjg0MDAwMAorMTYxNyAwIDI4ODAwMDAKKzkxMjMgMSAyOTIwMDAwCis1MjcgMCAyOTYwMDAwCisxNTc2IDAgMzAwMDAwMAorNDY1IDAgMzA0MDAwMAorNzQxIDAgMzA4MDAwMAorNTIxIDAgMzEyMDAwMAorMTMyMiAwIDMxNjAwMDAKKzc3NSAwIDMyMDAwMDAKKzg2MyAwIDMyNDAwMDAKKzkxMCAwIDMyODAwMDAKKzkxNSAwIDMzMjAwMDAKKzkyNiAwIDMzNjAwMDAKKzc1NTYgMSAzNDAwMDAwCis3NDEgMCAzNDQwMDAwCis1MjcgMCAzNDgwMDAwCisyNTE2IDAgMzUyMDAwMAorNDU5IDAgMzU2MDAwMAorNDA0IDAgMzYwMDAwMAorNTA5IDAgMzY0MDAwMAorMTIyNyAwIDM2ODAwMDAKKzE1NjEgMCAzNzIwMDAwCis0OTAgMCAzNzYwMDAwCis3MTIgMCAzODAwMDAwCis4MDMgMCAzODQwMDAwCis3NTI0IDEgMzg4MDAwMAorNzMwIDAgMzkyMDAwMAorNDYxIDAgMzk2MDAwMAorMjUyNiAwIDQwMDAwMDAKKzQ1MyAwIDQwNDAwMDAKKzYzMiAwIDQwODAwMDAKKzc4MyAwIDQxMjAwMDAKKzg0MyAwIDQxNjAwMDAKKzkxOCAwIDQyMDAwMDAKKzk2MSAwIDQyNDAwMDAKKzk0OCAwIDQyODAwMDAKKzk1OSAwIDQzMjAwMDAKKzc1OTggMSA0MzYwMDAwCis2NzggMCA0NDAwMDAwCis1NjkgMCA0NDQwMDAwCis4OTMgMCA0NDgwMDAwCis2MjQgMCA0NTIwMDAwCis3NTUgMCA0NTYwMDAwCisyMjM0IDAgNDYwMDAwMAorNTU2IDAgNDY0MDAwMAorOTQ0IDAgNDY4MDAwMAorNzM5IDAgNDcyMDAwMAorODYyIDAgNDc2MDAwMAorOTM4IDAgNDgwMDAwMAorNzU3NCAxIDQ4NDAwMDAKKzY5OSAwIDQ4ODAwMDAKKzcwMSAwIDQ5MjAwMDAKKzUzMCAwIDQ5NjAwMDAKKzY4OSAwIDUwMDAwMDAKKzc3OCAwIDUwNDAwMDAKKzg1NiAwIDUwODAwMDAKKzkzMCAwIDUxMjAwMDAKKzk3NSAwIDUxNjAwMDAKKzEwMjEgMCA1MjAwMDAwCisxMDc0IDAgNTI0MDAwMAorOTc4IDAgNTI4MDAwMAorODAyMSAxIDUzMjAwMDAKKzcwNCAwIDUzNjAwMDAKKzYxMCAwIDU0MDAwMDAKKzY5NyAwIDU0NDAwMDAKKzcxMSAwIDU0ODAwMDAKKzgyMCAwIDU1MjAwMDAKKzg0MyAwIDU1NjAwMDAKKzI1MSAwIDU2MDAwMDAKKzMzNjcgMCA1NjQwMDAwCis1MDcgMCA1NjgwMDAwCiszMTY4IDEgNTcyMDAwMAorNzc5IDAgNTc2MDAwMAorMzE2IDAgNTgwMDAwMAorNjM1IDAgNTg0MDAwMAorMjA0IDAgNTg4MDAwMAorOTc4IDAgNTkyMDAwMAorMTI3IDAgNTk2MDAwMAorNTg5IDAgNjAwMDAwMAorNjA0IDAgNjA0MDAwMAorNjY2IDAgNjA4MDAwMAorNTgyIDAgNjEyMDAwMAorNzI5IDAgNjE2MDAwMAorNDE1MiAxIDYyMDAwMDAKKzg1OCAwIDYyNDAwMDAKKzczOSAwIDYyODAwMDAKKzg4NSAwIDYzMjAwMDAKKzc0OSAwIDYzNjAwMDAKKzk1MCAwIDY0MDAwMDAKKzU5MyAwIDY0NDAwMDAKKzc3MSAwIDY0ODAwMDAKKzY3OCAwIDY1MjAwMDAKKzUyOSAwIDY1NjAwMDAKKzgzNSAwIDY2MDAwMDAKKzM5MSAwIDY2NDAwMDAKKzQ2OTIgMSA2NjgwMDAwCis0NzMgMCA2NzIwMDAwCis3MjQgMCA2NzYwMDAwCiszODEgMCA2ODAwMDAwCis5MDkgMCA2ODQwMDAwCiszOTQgMCA2ODgwMDAwCis2NTkgMCA2OTIwMDAwCiszNjcgMCA2OTYwMDAwCis2NTggMCA3MDAwMDAwCis1MjMgMCA3MDQwMDAwCis1NTQgMCA3MDgwMDAwCis1NTMgMCA3MTIwMDAwCis2MDgwIDEgNzE2MDAwMAorNDk2IDAgNzIwMDAwMAorNzYzIDAgNzI0MDAwMAorOTM5IDAgNzI4MDAwMAorNzE1IDAgNzMyMDAwMAorNjcyIDAgNzM2MDAwMAorNjE0IDAgNzQwMDAwMAorODExIDAgNzQ0MDAwMAorOTE2IDAgNzQ4MDAwMAorMTE1MyAwIDc1MjAwMDAKKzk0MCAwIDc1NjAwMDAKKzMyMiAwIDc2MDAwMDAKKzY2MTMgMSA3NjQwMDAwCis4NTEgMCA3NjgwMDAwCisxMDA3IDAgNzcyMDAwMAorNTIwIDAgNzc2MDAwMAorNDU2IDAgNzgwMDAwMAorNjM5IDAgNzg0MDAwMAorNzU4IDAgNzg4MDAwMAorODc5IDAgNzkyMDAwMAorMTE1MiAwIDc5NjAwMDAKKzEwNjEgMCA4MDAwMDAwCis5NDYgMCA4MDQwMDAwCis4NTkgMCA4MDgwMDAwCiszNjEwIDEgODEyMDAwMAorODcxIDAgODE2MDAwMAorNzQ2IDAgODIwMDAwMAorMzY3IDAgODI0MDAwMAorMzk3IDAgODI4MDAwMAorOTMwIDAgODMyMDAwMAorMzM3IDAgODM2MDAwMAorNDE4IDAgODQwMDAwMAorNzQwIDAgODQ0MDAwMAorNjM3IDAgODQ4MDAwMAorNjY2IDAgODUyMDAwMAorNjI3IDAgODU2MDAwMAorNDMzOCAxIDg2MDAwMDAKKzc0NSAwIDg2NDAwMDAKKzc4MyAwIDg2ODAwMDAKKzQ2NSAwIDg3MjAwMDAKKzQ2MCAwIDg3NjAwMDAKKzQ1NSAwIDg4MDAwMDAKKzUwNiAwIDg4NDAwMDAKKzQ5MiAwIDg4ODAwMDAKKzQ4NSAwIDg5MjAwMDAKKzUxNyAwIDg5NjAwMDAKKzUzNCAwIDkwMDAwMDAKKzM5NSAwIDkwNDAwMDAKKzU2MjYgMSA5MDgwMDAwCisxMTY5IDAgOTEyMDAwMAorNTY0IDAgOTE2MDAwMAorMjYxIDAgOTIwMDAwMAorMzI3IDAgOTI0MDAwMAorMzAzIDAgOTI4MDAwMAorMTE0NSAwIDkzMjAwMDAKKzI1NyAwIDkzNjAwMDAKKzQ5OCAwIDk0MDAwMDAKKzQ2NSAwIDk0NDAwMDAKKzQxNCAwIDk0ODAwMDAKKzU1MyAwIDk1MjAwMDAKKzU2MTcgMSA5NTYwMDAwCisxMDUyIDAgOTYwMDAwMAorNTkyIDAgOTY0MDAwMAorMzIzIDAgOTY4MDAwMAorNDk3IDAgOTcyMDAwMAorNDY3IDAgOTc2MDAwMAorNzA1IDAgOTgwMDAwMAorMTA4NiAwIDk4NDAwMDAKKzEyNTMgMCA5ODgwMDAwCisxMjUyIDAgOTkyMDAwMAorNzc2IDAgOTk2MDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLm0ydiBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5tMnYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmOTBjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5tMnYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxN2NhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLmluZm8KQEAgLTAsMCArMSw2MCBAQAorMTY2ODAgMSAxNjY2NgorMTcwMTcgMCAzMzMzMworMTA1MzQgMCA1MDAwMAorMTAyODkgMCA2NjY2NgorMzY5OCAwIDgzMzMzCisyNzc2IDAgMTAwMDAwCisxOTM2IDAgMTE2NjY2CisxNDkzIDAgMTMzMzMzCisxMjE3IDAgMTUwMDAwCis5OTMgMCAxNjY2NjYKKzgwNSAwIDE4MzMzMworODU3IDAgMjAwMDAwCis1MDgyIDEgMjE2NjY2Cis4MTIgMCAyMzMzMzMKKzcxOCAwIDI1MDAwMAorNzQ2IDAgMjY2NjY2Cis3NjIgMCAyODMzMzMKKzg2NSAwIDMwMDAwMAorNzgyIDAgMzE2NjY2Cis4MzMgMCAzMzMzMzMKKzc1MCAwIDM1MDAwMAorODE5IDAgMzY2NjY2Cis4MjYgMCAzODMzMzMKKzg0NiAwIDQwMDAwMAorNDUyMiAxIDQxNjY2NgorNjc4IDAgNDMzMzMzCis3MTggMCA0NTAwMDAKKzgwMyAwIDQ2NjY2NgorNzY5IDAgNDgzMzMzCis3NjIgMCA1MDAwMDAKKzU4NyAwIDUxNjY2NgorNjM1IDAgNTMzMzMzCis2NTggMCA1NTAwMDAKKzcxNCAwIDU2NjY2NgorNjc3IDAgNTgzMzMzCis2OTkgMCA2MDAwMDAKKzQ2MTYgMSA2MTY2NjYKKzgwMCAwIDYzMzMzMworODMxIDAgNjUwMDAwCis5MjggMCA2NjY2NjYKKzg2OSAwIDY4MzMzMworOTMxIDAgNzAwMDAwCis5MzAgMCA3MTY2NjYKKzk3NCAwIDczMzMzMworOTc4IDAgNzUwMDAwCis5MzIgMCA3NjY2NjYKKzkxOCAwIDc4MzMzMworOTc4IDAgODAwMDAwCis0NjU1IDEgODE2NjY2Cis4OTcgMCA4MzMzMzMKKzg5NiAwIDg1MDAwMAorODgzIDAgODY2NjY2Cis5NDkgMCA4ODMzMzMKKzk2NSAwIDkwMDAwMAorOTUxIDAgOTE2NjY2Cis5MDEgMCA5MzMzMzMKKzk2NSAwIDk1MDAwMAorOTU1IDAgOTY2NjY2Cis5NDggMCA5ODMzMzMKKzk2OCAwIDEwMDAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMubTJ2IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5tMnYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY2N2MyYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMubTJ2CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjliYTliMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5pbmZvCkBAIC0wLDAgKzEsMjQxIEBACis0NyAzMiAwCisyMTExNSAxIDAKKzE2NDU2IDAgMzMzMzMKKzExODgwIDAgNjY2NjYKKzEyMTU1IDAgMTAwMDAwCisxMTQwMiAwIDEzMzMzMworNTM0NSAwIDE2NjY2NgorMjk4NiAwIDIwMDAwMAorMTkyNCAwIDIzMzMzMworMjI3NSAwIDI2NjY2NgorMjc5MyAwIDMwMDAwMAorMjc1NiAwIDMzMzMzMworMjkzMyAwIDM2NjY2NgorMjExMDAgMSA0MDAwMDAKKzEzMDIgMCA0MzMzMzMKKzIyMDYgMCA0NjY2NjYKKzE1OTkgMCA1MDAwMDAKKzI1NTggMCA1MzMzMzMKKzI3ODQgMCA1NjY2NjYKKzI0NTggMCA2MDAwMDAKKzI0ODAgMCA2MzMzMzMKKzE0NDYgMCA2NjY2NjYKKzMxMDkgMCA3MDAwMDAKKzk0NCAwIDczMzMzMworMzEzNCAwIDc2NjY2NgorMjEzNDIgMSA4MDAwMDAKKzY1MiAwIDgzMzMzMworMTcwOCAwIDg2NjY2NgorMjIwMiAwIDkwMDAwMAorMTY5NSAwIDkzMzMzMworMTY2MSAwIDk2NjY2NgorMTY1MiAwIDEwMDAwMDAKKzE2NzkgMCAxMDMzMzMzCisxNjkwIDAgMTA2NjY2NgorMTgyNCAwIDExMDAwMDAKKzE4MDMgMCAxMTMzMzMzCisxNTk4IDAgMTE2NjY2NgorMjE1NDAgMSAxMjAwMDAwCisyMDUgMCAxMjMzMzMzCisxMTI0IDAgMTI2NjY2NgorMTA2OSAwIDEzMDAwMDAKKzgzOCAwIDEzMzMzMzMKKzc2NSAwIDEzNjY2NjYKKzQyNjUgMCAxNDAwMDAwCis5NCAwIDE0MzMzMzMKKzIwNDYzIDAgMTQ2NjY2NgorMTAyOCAwIDE1MDAwMDAKKzE0NzUgMCAxNTMzMzMzCiszNjMwIDAgMTU2NjY2NgorMjgzNzMgMSAxNjAwMDAwCis3MjUgMCAxNjMzMzMzCisxMTE5IDAgMTY2NjY2NgorMTQyNyAwIDE3MDAwMDAKKzE2NzkgMCAxNzMzMzMzCisxODY2IDAgMTc2NjY2NgorMTE5NyAwIDE4MDAwMDAKKzE1NzIgMCAxODMzMzMzCisxNjUxIDAgMTg2NjY2NgorMTY3OCAwIDE5MDAwMDAKKzE2ODggMCAxOTMzMzMzCisxNjU5IDAgMTk2NjY2NgorMTk5MDAgMSAyMDAwMDAwCis1ODQgMCAyMDMzMzMzCisxNDc1IDAgMjA2NjY2NgorMTY3OCAwIDIxMDAwMDAKKzEwMTAgMCAyMTMzMzMzCisxNDM1IDAgMjE2NjY2NgorMTYxMiAwIDIyMDAwMDAKKzE2MDIgMCAyMjMzMzMzCisxNzA5IDAgMjI2NjY2NgorMTczNyAwIDIzMDAwMDAKKzE4MzUgMCAyMzMzMzMzCis5MjYgMCAyMzY2NjY2CisyMDA5MCAxIDI0MDAwMDAKKzYzMSAwIDI0MzMzMzMKKzE1NzYgMCAyNDY2NjY2Cis5NDEgMCAyNTAwMDAwCisyMzQ5IDAgMjUzMzMzMworMTExMiAwIDI1NjY2NjYKKzE1NjYgMCAyNjAwMDAwCisxNzczIDAgMjYzMzMzMworOTc5IDAgMjY2NjY2NgorMjI0NiAwIDI3MDAwMDAKKzkwNCAwIDI3MzMzMzMKKzEzNDIgMCAyNzY2NjY2CisyMDE0NyAxIDI4MDAwMDAKKzYzMCAwIDI4MzMzMzMKKzk4MiAwIDI4NjY2NjYKKzIwODkgMCAyOTAwMDAwCisxMDIxIDAgMjkzMzMzMworMTUwNiAwIDI5NjY2NjYKKzE2NDIgMCAzMDAwMDAwCis5NjggMCAzMDMzMzMzCisxMjYyIDAgMzA2NjY2NgorMjI3MCAwIDMxMDAwMDAKKzg2NCAwIDMxMzMzMzMKKzEyNTIgMCAzMTY2NjY2CisyMDE0NSAxIDMyMDAwMDAKKzU5NSAwIDMyMzMzMzMKKzkxOCAwIDMyNjY2NjYKKzExNjcgMCAzMzAwMDAwCisxMzQ3IDAgMzMzMzMzMworMTU5NyAwIDMzNjY2NjYKKzE2MzYgMCAzNDAwMDAwCis5NDQgMCAzNDMzMzMzCisxMjk1IDAgMzQ2NjY2NgorMTM5NyAwIDM1MDAwMDAKKzE0MTMgMCAzNTMzMzMzCisxNDMyIDAgMzU2NjY2NgorMjAxODAgMSAzNjAwMDAwCis1MjUgMCAzNjMzMzMzCisxMDY4IDAgMzY2NjY2NgorMTIzMCAwIDM3MDAwMDAKKzE0MjggMCAzNzMzMzMzCis5MTYgMCAzNzY2NjY2CisxOTQ4IDAgMzgwMDAwMAorOTY2IDAgMzgzMzMzMworMTM0MiAwIDM4NjY2NjYKKzEzMzggMCAzOTAwMDAwCisxMzc5IDAgMzkzMzMzMworMTI5NiAwIDM5NjY2NjYKKzE3Mzc4IDEgNDAwMDAwMAorNTgzIDAgNDAzMzMzMworOTM2IDAgNDA2NjY2NgorMTc0NSAwIDQxMDAwMDAKKzk4NyAwIDQxMzMzMzMKKzEzOTMgMCA0MTY2NjY2CisxNDk1IDAgNDIwMDAwMAorODY5IDAgNDIzMzMzMworMTkzOCAwIDQyNjY2NjYKKzgyOCAwIDQzMDAwMDAKKzE4NTEgMCA0MzMzMzMzCis4MzQgMCA0MzY2NjY2CisxNzI4MCAxIDQ0MDAwMDAKKzU4MCAwIDQ0MzMzMzMKKzg2OSAwIDQ0NjY2NjYKKzE2MDUgMCA0NTAwMDAwCis4NDMgMCA0NTMzMzMzCis2MTQ3IDEgNDU2NjY2NgorMjIwIDAgNDYwMDAwMAorMTEwNiAwIDQ2MzMzMzMKKzM5NSAwIDQ2NjY2NjYKKzMwNCAwIDQ3MDAwMDAKKzE5NDYgMCA0NzMzMzMzCisxNTQgMCA0NzY2NjY2Cis0ODIgMCA0ODAwMDAwCis5NDkgMCA0ODMzMzMzCisxMDg4IDAgNDg2NjY2NgorOTc0IDAgNDkwMDAwMAorODc2IDAgNDkzMzMzMworOTE2NCAxIDQ5NjY2NjYKKzEwMTkgMCA1MDAwMDAwCis5ODMgMCA1MDMzMzMzCisxMzc1IDAgNTA2NjY2NgorMTA0MSAwIDUxMDAwMDAKKzc4OSAwIDUxMzMzMzMKKzEwMzcgMCA1MTY2NjY2Cis4MTIgMCA1MjAwMDAwCis3MzIgMCA1MjMzMzMzCis5NzIgMCA1MjY2NjY2Cis3MDggMCA1MzAwMDAwCis2MjMgMCA1MzMzMzMzCisxMDY2NyAxIDUzNjY2NjYKKzQ2MyAwIDU0MDAwMDAKKzkxMSAwIDU0MzMzMzMKKzg2MSAwIDU0NjY2NjYKKzUwNyAwIDU1MDAwMDAKKzEwMTUgMCA1NTMzMzMzCis1MDEgMCA1NTY2NjY2Cis5MzQgMCA1NjAwMDAwCis4MTIgMCA1NjMzMzMzCis4NTUgMCA1NjY2NjY2Cis4MDQgMCA1NzAwMDAwCis3ODMgMCA1NzMzMzMzCisxMDYxMCAxIDU3NjY2NjYKKzk1MCAwIDU4MDAwMDAKKzEyOTIgMCA1ODMzMzMzCisxMDAyIDAgNTg2NjY2NgorNzI4IDAgNTkwMDAwMAorOTYwIDAgNTkzMzMzMworMTIzMCAwIDU5NjY2NjYKKzEzMTUgMCA2MDAwMDAwCisxMjQ4IDAgNjAzMzMzMworOTk1IDAgNjA2NjY2NgorMTQwMSAwIDYxMDAwMDAKKzkwNSAwIDYxMzMzMzMKKzkzMjYgMSA2MTY2NjY2Cis3MjYgMCA2MjAwMDAwCis2NjcgMCA2MjMzMzMzCis4MzMgMCA2MjY2NjY2CisxMDA3IDAgNjMwMDAwMAorMTE3MiAwIDYzMzMzMzMKKzE5MTAgMCA2MzY2NjY2CisxOTU0IDAgNjQwMDAwMAorMTQ5OCAwIDY0MzMzMzMKKzExODggMCA2NDY2NjY2Cis3ODQgMCA2NTAwMDAwCisxMDA1IDAgNjUzMzMzMworMTAwMzAgMSA2NTY2NjY2Cis0NTIgMCA2NjAwMDAwCis3NjMgMCA2NjMzMzMzCis2MzkgMCA2NjY2NjY2Cis2NzEgMCA2NzAwMDAwCis4NjcgMCA2NzMzMzMzCis5NjMgMCA2NzY2NjY2Cis5ODIgMCA2ODAwMDAwCis5OTUgMCA2ODMzMzMzCis5ODIgMCA2ODY2NjY2Cis3NDcgMCA2OTAwMDAwCis1NzQgMCA2OTMzMzMzCisxMjM1MyAxIDY5NjY2NjYKKzQ3NCAwIDcwMDAwMDAKKzk2OSAwIDcwMzMzMzMKKzYzMyAwIDcwNjY2NjYKKzcyMyAwIDcxMDAwMDAKKzEyMjEgMCA3MTMzMzMzCis2NzQgMCA3MTY2NjY2Cis3NzYgMCA3MjAwMDAwCis1NzIgMCA3MjMzMzMzCis5MTIgMCA3MjY2NjY2Cis1NjQgMCA3MzAwMDAwCis1OTQgMCA3MzMzMzMzCisxNjY2MSAxIDczNjY2NjYKKzUxOCAwIDc0MDAwMDAKKzY1NiAwIDc0MzMzMzMKKzYyNSAwIDc0NjY2NjYKKzU4MyAwIDc1MDAwMDAKKzU4NCAwIDc1MzMzMzMKKzEwMjcgMCA3NTY2NjY2Cis4MTIgMCA3NjAwMDAwCis3MjkgMCA3NjMzMzMzCis3NjYgMCA3NjY2NjY2Cis5MDEgMCA3NzAwMDAwCis5NjAgMCA3NzMzMzMzCisxMjMzNiAxIDc3NjY2NjYKKzk0NCAwIDc4MDAwMDAKKzEzOTggMCA3ODMzMzMzCisxNjI1IDAgNzg2NjY2NgorMjEwMyAwIDc5MDAwMDAKKzE2MzAgMCA3OTMzMzMzCisxMjI4IDAgNzk2NjY2NgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLm00diBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5tNHYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdlYWQwMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5tNHYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2VkMTJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8KQEAgLTAsMCArMSw0OTkgQEAKKzE5IDMyIDAKKzggMzIgMAorOCAzMiAwCis1MjkgMSAwCiszMjkgMSAxMzUwMAorMzQ5IDEgMzM1MDAKKzMzNiAxIDUzNTAwCiszODMgMSA3MzUwMAorMzU5IDEgOTM1MDAKKzM0NCAxIDExMzUwMAorMzQzIDEgMTMzNTAwCiszMzIgMSAxNTM1MDAKKzMyMCAxIDE3MzUwMAorMzE5IDEgMTkzNTAwCiszMjMgMSAyMTM1MDAKKzMyMCAxIDIzMzUwMAorMzI4IDEgMjUzNTAwCiszNDAgMSAyNzM1MDAKKzMxOCAxIDI5MzUwMAorMzE5IDEgMzEzNTAwCiszMzUgMSAzMzM1MDAKKzUxMSAxIDM1MzUwMAorMzk1IDEgMzczNTAwCiszMjcgMSAzOTM1MDAKKzQ3OSAxIDQxMzUwMAorMzMyIDEgNDMzNTAwCiszMjAgMSA0NTM1MDAKKzMyMSAxIDQ3MzUwMAorMzEwIDEgNDkzNTAwCiszMTAgMSA1MTM1MDAKKzMxMCAxIDUzMzUwMAorMzI2IDEgNTUzNTAwCiszMzAgMSA1NzM1MDAKKzMxOCAxIDU5MzUwMAorMzA5IDEgNjEzNTAwCiszMDQgMSA2MzM1MDAKKzI5OCAxIDY1MzUwMAorMjk0IDEgNjczNTAwCiszMDAgMSA2OTM1MDAKKzMxNCAxIDcxMzUwMAorMzA0IDEgNzMzNTAwCiszMDcgMSA3NTM1MDAKKzMyMSAxIDc3MzUwMAorMzMzIDEgNzkzNTAwCiszMzUgMSA4MTM1MDAKKzMwNiAxIDgzMzUwMAorMzE1IDEgODUzNTAwCiszMjAgMSA4NzM1MDAKKzMxNSAxIDg5MzUwMAorMzA4IDEgOTEzNTAwCiszMjAgMSA5MzM1MDAKKzMxMSAxIDk1MzUwMAorMzExIDEgOTczNTAwCiszMTMgMSA5OTM1MDAKKzMxNCAxIDEwMTM1MDAKKzMwOCAxIDEwMzM1MDAKKzMwNyAxIDEwNTM1MDAKKzMxNyAxIDEwNzM1MDAKKzMyOCAxIDEwOTM1MDAKKzMxNyAxIDExMTM1MDAKKzMxMiAxIDExMzM1MDAKKzMwOCAxIDExNTM1MDAKKzMxNSAxIDExNzM1MDAKKzMyMCAxIDExOTM1MDAKKzMyMiAxIDEyMTM1MDAKKzMyMyAxIDEyMzM1MDAKKzMyMiAxIDEyNTM1MDAKKzMyMiAxIDEyNzM1MDAKKzMwMSAxIDEyOTM1MDAKKzMwMyAxIDEzMTM1MDAKKzMwOCAxIDEzMzM1MDAKKzI5OSAxIDEzNTM1MDAKKzI5NyAxIDEzNzM1MDAKKzI5MyAxIDEzOTM1MDAKKzI5NSAxIDE0MTM1MDAKKzI5NyAxIDE0MzM1MDAKKzMwMCAxIDE0NTM1MDAKKzI5NCAxIDE0NzM1MDAKKzI5OSAxIDE0OTM1MDAKKzI5NiAxIDE1MTM1MDAKKzMwMyAxIDE1MzM1MDAKKzMxMyAxIDE1NTM1MDAKKzMwNiAxIDE1NzM1MDAKKzMwMyAxIDE1OTM1MDAKKzMxMSAxIDE2MTM1MDAKKzMwNyAxIDE2MzM1MDAKKzMxMCAxIDE2NTM1MDAKKzMzOSAxIDE2NzM1MDAKKzMyNSAxIDE2OTM1MDAKKzMyMCAxIDE3MTM1MDAKKzMxNSAxIDE3MzM1MDAKKzMxNiAxIDE3NTM1MDAKKzMzOCAxIDE3NzM1MDAKKzMyNSAxIDE3OTM1MDAKKzMyNSAxIDE4MTM1MDAKKzMyOCAxIDE4MzM1MDAKKzMwNCAxIDE4NTM1MDAKKzI5NyAxIDE4NzM1MDAKKzMyMiAxIDE4OTM1MDAKKzMxMSAxIDE5MTM1MDAKKzMwNyAxIDE5MzM1MDAKKzMwMCAxIDE5NTM1MDAKKzMwMSAxIDE5NzM1MDAKKzMwOSAxIDE5OTM1MDAKKzMwMCAxIDIwMTM1MDAKKzMwNiAxIDIwMzM1MDAKKzMwNSAxIDIwNTM1MDAKKzI5OCAxIDIwNzM1MDAKKzI5MSAxIDIwOTM1MDAKKzMwMSAxIDIxMTM1MDAKKzMwMCAxIDIxMzM1MDAKKzQzOSAxIDIxNTM1MDAKKzI5MiAxIDIxNzM1MDAKKzMwOCAxIDIxOTM1MDAKKzMwNSAxIDIyMTM1MDAKKzI5OCAxIDIyMzM1MDAKKzI5NyAxIDIyNTM1MDAKKzI5MyAxIDIyNzM1MDAKKzQwOCAxIDIyOTM1MDAKKzI5OCAxIDIzMTM1MDAKKzQ1MiAxIDIzMzM1MDAKKzI5NyAxIDIzNTM1MDAKKzMwMyAxIDIzNzM1MDAKKzMwMCAxIDIzOTM1MDAKKzMxMCAxIDI0MTM1MDAKKzI5OSAxIDI0MzM1MDAKKzMwNiAxIDI0NTM1MDAKKzMxNiAxIDI0NzM1MDAKKzMwOCAxIDI0OTM1MDAKKzMxMyAxIDI1MTM1MDAKKzMwOSAxIDI1MzM1MDAKKzMxMCAxIDI1NTM1MDAKKzMxNSAxIDI1NzM1MDAKKzMwOSAxIDI1OTM1MDAKKzMxNyAxIDI2MTM1MDAKKzMxMSAxIDI2MzM1MDAKKzMyOCAxIDI2NTM1MDAKKzMzMyAxIDI2NzM1MDAKKzMyNiAxIDI2OTM1MDAKKzMyMyAxIDI3MTM1MDAKKzMxNiAxIDI3MzM1MDAKKzMyNSAxIDI3NTM1MDAKKzMxNiAxIDI3NzM1MDAKKzMxOSAxIDI3OTM1MDAKKzMyNiAxIDI4MTM1MDAKKzMyMCAxIDI4MzM1MDAKKzMyOCAxIDI4NTM1MDAKKzMxMiAxIDI4NzM1MDAKKzMxNCAxIDI4OTM1MDAKKzMwOSAxIDI5MTM1MDAKKzMwNiAxIDI5MzM1MDAKKzI5NSAxIDI5NTM1MDAKKzMwNCAxIDI5NzM1MDAKKzMyNiAxIDI5OTM1MDAKKzI5MSAxIDMwMTM1MDAKKzI5OSAxIDMwMzM1MDAKKzI5MyAxIDMwNTM1MDAKKzI4OCAxIDMwNzM1MDAKKzI5NCAxIDMwOTM1MDAKKzI5MiAxIDMxMTM1MDAKKzI5MiAxIDMxMzM1MDAKKzI4OCAxIDMxNTM1MDAKKzMwOCAxIDMxNzM1MDAKKzMwNCAxIDMxOTM1MDAKKzI5MiAxIDMyMTM1MDAKKzM4MiAxIDMyMzM1MDAKKzM4MSAxIDMyNTM1MDAKKzI5OSAxIDMyNzM1MDAKKzMxNiAxIDMyOTM1MDAKKzMwOCAxIDMzMTM1MDAKKzMwMSAxIDMzMzM1MDAKKzI5NyAxIDMzNTM1MDAKKzI5OSAxIDMzNzM1MDAKKzI5NCAxIDMzOTM1MDAKKzI5NSAxIDM0MTM1MDAKKzMxNyAxIDM0MzM1MDAKKzI5NyAxIDM0NTM1MDAKKzMwOSAxIDM0NzM1MDAKKzMxMyAxIDM0OTM1MDAKKzMyMCAxIDM1MTM1MDAKKzMyOSAxIDM1MzM1MDAKKzMzMCAxIDM1NTM1MDAKKzMyNCAxIDM1NzM1MDAKKzMyNCAxIDM1OTM1MDAKKzMwOSAxIDM2MTM1MDAKKzMwNCAxIDM2MzM1MDAKKzMxMyAxIDM2NTM1MDAKKzMxMiAxIDM2NzM1MDAKKzI5OSAxIDM2OTM1MDAKKzI5NSAxIDM3MTM1MDAKKzMwMSAxIDM3MzM1MDAKKzI5NSAxIDM3NTM1MDAKKzI5NyAxIDM3NzM1MDAKKzMwMiAxIDM3OTM1MDAKKzI5OCAxIDM4MTM1MDAKKzI5OSAxIDM4MzM1MDAKKzI5NiAxIDM4NTM1MDAKKzI5MiAxIDM4NzM1MDAKKzMwNyAxIDM4OTM1MDAKKzMwMyAxIDM5MTM1MDAKKzMxMyAxIDM5MzM1MDAKKzMxOCAxIDM5NTM1MDAKKzMxMyAxIDM5NzM1MDAKKzM1MyAxIDM5OTM1MDAKKzM3MSAxIDQwMTM1MDAKKzI5MiAxIDQwMzM1MDAKKzMwMCAxIDQwNTM1MDAKKzM4MSAxIDQwNzM1MDAKKzI5NCAxIDQwOTM1MDAKKzMwMSAxIDQxMTM1MDAKKzMwNSAxIDQxMzM1MDAKKzI5OSAxIDQxNTM1MDAKKzMwNSAxIDQxNzM1MDAKKzMyMiAxIDQxOTM1MDAKKzMxNSAxIDQyMTM1MDAKKzMyNiAxIDQyMzM1MDAKKzMzOCAxIDQyNTM1MDAKKzMyMCAxIDQyNzM1MDAKKzMxOSAxIDQyOTM1MDAKKzMyNyAxIDQzMTM1MDAKKzMzMCAxIDQzMzM1MDAKKzMxMCAxIDQzNTM1MDAKKzMwMyAxIDQzNzM1MDAKKzI5OSAxIDQzOTM1MDAKKzI5MyAxIDQ0MTM1MDAKKzI5MyAxIDQ0MzM1MDAKKzI5NCAxIDQ0NTM1MDAKKzI5NSAxIDQ0NzM1MDAKKzI5NSAxIDQ0OTM1MDAKKzMyMyAxIDQ1MTM1MDAKKzMwOSAxIDQ1MzM1MDAKKzMwOSAxIDQ1NTM1MDAKKzMwMSAxIDQ1NzM1MDAKKzQ3MyAxIDQ1OTM1MDAKKzI5MSAxIDQ2MTM1MDAKKzI5NyAxIDQ2MzM1MDAKKzI5NCAxIDQ2NTM1MDAKKzI5MyAxIDQ2NzM1MDAKKzMwNCAxIDQ2OTM1MDAKKzI5MiAxIDQ3MTM1MDAKKzMwMiAxIDQ3MzM1MDAKKzI5NiAxIDQ3NTM1MDAKKzI5OCAxIDQ3NzM1MDAKKzMwMSAxIDQ3OTM1MDAKKzMwNyAxIDQ4MTM1MDAKKzI4NSAxIDQ4MzM1MDAKKzI5NCAxIDQ4NTM1MDAKKzMwNCAxIDQ4NzM1MDAKKzI5NCAxIDQ4OTM1MDAKKzI5NSAxIDQ5MTM1MDAKKzMyNSAxIDQ5MzM1MDAKKzMxOSAxIDQ5NTM1MDAKKzMyMyAxIDQ5NzM1MDAKKzMxMyAxIDQ5OTM1MDAKKzMwMyAxIDUwMTM1MDAKKzI5NiAxIDUwMzM1MDAKKzI5NSAxIDUwNTM1MDAKKzI5MCAxIDUwNzM1MDAKKzI5NyAxIDUwOTM1MDAKKzI5NiAxIDUxMTM1MDAKKzI5NiAxIDUxMzM1MDAKKzI5MiAxIDUxNTM1MDAKKzI5NSAxIDUxNzM1MDAKKzI4NyAxIDUxOTM1MDAKKzI5NCAxIDUyMTM1MDAKKzI5MCAxIDUyMzM1MDAKKzI5NyAxIDUyNTM1MDAKKzI5NyAxIDUyNzM1MDAKKzI5NyAxIDUyOTM1MDAKKzI5MiAxIDUzMTM1MDAKKzI5NyAxIDUzMzM1MDAKKzI5MCAxIDUzNTM1MDAKKzI5MyAxIDUzNzM1MDAKKzI5MyAxIDUzOTM1MDAKKzI5MSAxIDU0MTM1MDAKKzI5MiAxIDU0MzM1MDAKKzI5MCAxIDU0NTM1MDAKKzI5MSAxIDU0NzM1MDAKKzI5NiAxIDU0OTM1MDAKKzI5NSAxIDU1MTM1MDAKKzMyNyAxIDU1MzM1MDAKKzI5MyAxIDU1NTM1MDAKKzI5MSAxIDU1NzM1MDAKKzI5MSAxIDU1OTM1MDAKKzMxMSAxIDU2MTM1MDAKKzI5MSAxIDU2MzM1MDAKKzI5NCAxIDU2NTM1MDAKKzI5NiAxIDU2NzM1MDAKKzI5NSAxIDU2OTM1MDAKKzI4OSAxIDU3MTM1MDAKKzI5NSAxIDU3MzM1MDAKKzI5NSAxIDU3NTM1MDAKKzI5NyAxIDU3NzM1MDAKKzI5MiAxIDU3OTM1MDAKKzI5NyAxIDU4MTM1MDAKKzI5MiAxIDU4MzM1MDAKKzI5NSAxIDU4NTM1MDAKKzI5NiAxIDU4NzM1MDAKKzI5NSAxIDU4OTM1MDAKKzMwMyAxIDU5MTM1MDAKKzMwNCAxIDU5MzM1MDAKKzMwMSAxIDU5NTM1MDAKKzMwNyAxIDU5NzM1MDAKKzMwNCAxIDU5OTM1MDAKKzMxMCAxIDYwMTM1MDAKKzMxMCAxIDYwMzM1MDAKKzMwNSAxIDYwNTM1MDAKKzMwMSAxIDYwNzM1MDAKKzMwMiAxIDYwOTM1MDAKKzMwNSAxIDYxMTM1MDAKKzI5OCAxIDYxMzM1MDAKKzMwMCAxIDYxNTM1MDAKKzMwMCAxIDYxNzM1MDAKKzI5MiAxIDYxOTM1MDAKKzI5NyAxIDYyMTM1MDAKKzMwMSAxIDYyMzM1MDAKKzI5NyAxIDYyNTM1MDAKKzI5NyAxIDYyNzM1MDAKKzI5OCAxIDYyOTM1MDAKKzI5NyAxIDYzMTM1MDAKKzMwMCAxIDYzMzM1MDAKKzI5MyAxIDYzNTM1MDAKKzI5MyAxIDYzNzM1MDAKKzI5NyAxIDYzOTM1MDAKKzI5NCAxIDY0MTM1MDAKKzMwNyAxIDY0MzM1MDAKKzMwMiAxIDY0NTM1MDAKKzMwNyAxIDY0NzM1MDAKKzMyMCAxIDY0OTM1MDAKKzMzMCAxIDY1MTM1MDAKKzMzMyAxIDY1MzM1MDAKKzMzNyAxIDY1NTM1MDAKKzMzMSAxIDY1NzM1MDAKKzMyMyAxIDY1OTM1MDAKKzMxMiAxIDY2MTM1MDAKKzMyNiAxIDY2MzM1MDAKKzMyOCAxIDY2NTM1MDAKKzMzMiAxIDY2NzM1MDAKKzMzMyAxIDY2OTM1MDAKKzM0MCAxIDY3MTM1MDAKKzMzNiAxIDY3MzM1MDAKKzMyNCAxIDY3NTM1MDAKKzMxMiAxIDY3NzM1MDAKKzMwMSAxIDY3OTM1MDAKKzI4OSAxIDY4MTM1MDAKKzMwMiAxIDY4MzM1MDAKKzI5NiAxIDY4NTM1MDAKKzI5OSAxIDY4NzM1MDAKKzI4OSAxIDY4OTM1MDAKKzI5NSAxIDY5MTM1MDAKKzI5OSAxIDY5MzM1MDAKKzM3NCAxIDY5NTM1MDAKKzM5MSAxIDY5NzM1MDAKKzM2NSAxIDY5OTM1MDAKKzM0MCAxIDcwMTM1MDAKKzMzMCAxIDcwMzM1MDAKKzMzNyAxIDcwNTM1MDAKKzMyOCAxIDcwNzM1MDAKKzMyOSAxIDcwOTM1MDAKKzMxOSAxIDcxMTM1MDAKKzMxMiAxIDcxMzM1MDAKKzMwOCAxIDcxNTM1MDAKKzMwNCAxIDcxNzM1MDAKKzMxMiAxIDcxOTM1MDAKKzMxMSAxIDcyMTM1MDAKKzMxNiAxIDcyMzM1MDAKKzI5OSAxIDcyNTM1MDAKKzMzMCAxIDcyNzM1MDAKKzMzMCAxIDcyOTM1MDAKKzMzMCAxIDczMTM1MDAKKzM0MiAxIDczMzM1MDAKKzQzOSAxIDczNTM1MDAKKzMyMiAxIDczNzM1MDAKKzI5OCAxIDczOTM1MDAKKzI5MyAxIDc0MTM1MDAKKzMxMCAxIDc0MzM1MDAKKzMwMyAxIDc0NTM1MDAKKzMxNyAxIDc0NzM1MDAKKzQ1MyAxIDc0OTM1MDAKKzM3NyAxIDc1MTM1MDAKKzM3NCAxIDc1MzM1MDAKKzI5MiAxIDc1NTM1MDAKKzI5NSAxIDc1NzM1MDAKKzI3NCAxIDc1OTM1MDAKKzI5MiAxIDc2MTM1MDAKKzI5MSAxIDc2MzM1MDAKKzM2NyAxIDc2NTM1MDAKKzI5NSAxIDc2NzM1MDAKKzI5OCAxIDc2OTM1MDAKKzI5NyAxIDc3MTM1MDAKKzMwMSAxIDc3MzM1MDAKKzI5MiAxIDc3NTM1MDAKKzM0NCAxIDc3NzM1MDAKKzI5NiAxIDc3OTM1MDAKKzI5NyAxIDc4MTM1MDAKKzMwNiAxIDc4MzM1MDAKKzMwOCAxIDc4NTM1MDAKKzMwNSAxIDc4NzM1MDAKKzMxMyAxIDc4OTM1MDAKKzMwNiAxIDc5MTM1MDAKKzMyMiAxIDc5MzM1MDAKKzMxMyAxIDc5NTM1MDAKKzMwNSAxIDc5NzM1MDAKKzMwNCAxIDc5OTM1MDAKKzMxMyAxIDgwMTM1MDAKKzMyNCAxIDgwMzM1MDAKKzMxMiAxIDgwNTM1MDAKKzMxOCAxIDgwNzM1MDAKKzMxMSAxIDgwOTM1MDAKKzMwMiAxIDgxMTM1MDAKKzMwNSAxIDgxMzM1MDAKKzMxMiAxIDgxNTM1MDAKKzMxMyAxIDgxNzM1MDAKKzMxMiAxIDgxOTM1MDAKKzMzNSAxIDgyMTM1MDAKKzMzMyAxIDgyMzM1MDAKKzM0NiAxIDgyNTM1MDAKKzMzOSAxIDgyNzM1MDAKKzMzNyAxIDgyOTM1MDAKKzM0MSAxIDgzMTM1MDAKKzMzNSAxIDgzMzM1MDAKKzMyNSAxIDgzNTM1MDAKKzMyNCAxIDgzNzM1MDAKKzMxNyAxIDgzOTM1MDAKKzMxNSAxIDg0MTM1MDAKKzMwMyAxIDg0MzM1MDAKKzMxNyAxIDg0NTM1MDAKKzQ1MiAxIDg0NzM1MDAKKzMyNCAxIDg0OTM1MDAKKzMyMSAxIDg1MTM1MDAKKzMzNSAxIDg1MzM1MDAKKzMyNyAxIDg1NTM1MDAKKzMxNSAxIDg1NzM1MDAKKzMyMSAxIDg1OTM1MDAKKzMxOSAxIDg2MTM1MDAKKzMwOCAxIDg2MzM1MDAKKzMxNCAxIDg2NTM1MDAKKzMyMiAxIDg2NzM1MDAKKzMyOCAxIDg2OTM1MDAKKzMyMCAxIDg3MTM1MDAKKzMyNCAxIDg3MzM1MDAKKzMzMSAxIDg3NTM1MDAKKzMzMCAxIDg3NzM1MDAKKzMyOCAxIDg3OTM1MDAKKzMxOCAxIDg4MTM1MDAKKzMxNCAxIDg4MzM1MDAKKzMxOCAxIDg4NTM1MDAKKzMxOCAxIDg4NzM1MDAKKzMyNSAxIDg4OTM1MDAKKzMzOCAxIDg5MTM1MDAKKzM0MSAxIDg5MzM1MDAKKzMzMyAxIDg5NTM1MDAKKzMzMCAxIDg5NzM1MDAKKzMzOCAxIDg5OTM1MDAKKzMzMyAxIDkwMTM1MDAKKzMzMCAxIDkwMzM1MDAKKzM0NCAxIDkwNTM1MDAKKzQ3OSAxIDkwNzM1MDAKKzQ3MyAxIDkwOTM1MDAKKzMzMyAxIDkxMTM1MDAKKzMzNyAxIDkxMzM1MDAKKzQ5NSAxIDkxNTM1MDAKKzM1MyAxIDkxNzM1MDAKKzM1MiAxIDkxOTM1MDAKKzM0NCAxIDkyMTM1MDAKKzMzNiAxIDkyMzM1MDAKKzMyNCAxIDkyNTM1MDAKKzMyMSAxIDkyNzM1MDAKKzM1MCAxIDkyOTM1MDAKKzM0NyAxIDkzMTM1MDAKKzM0MyAxIDkzMzM1MDAKKzM0NSAxIDkzNTM1MDAKKzMzNyAxIDkzNzM1MDAKKzMzNSAxIDkzOTM1MDAKKzMzMyAxIDk0MTM1MDAKKzMzNiAxIDk0MzM1MDAKKzMzNCAxIDk0NTM1MDAKKzMzMyAxIDk0NzM1MDAKKzMzMSAxIDk0OTM1MDAKKzMyOSAxIDk1MTM1MDAKKzMxOSAxIDk1MzM1MDAKKzMyMSAxIDk1NTM1MDAKKzMxNiAxIDk1NzM1MDAKKzMyMiAxIDk1OTM1MDAKKzQ0OCAxIDk2MTM1MDAKKzMxMiAxIDk2MzM1MDAKKzMwNiAxIDk2NTM1MDAKKzMwMSAxIDk2NzM1MDAKKzMwMyAxIDk2OTM1MDAKKzI5NiAxIDk3MTM1MDAKKzMwMCAxIDk3MzM1MDAKKzI5NSAxIDk3NTM1MDAKKzMwMCAxIDk3NzM1MDAKKzI5NyAxIDk3OTM1MDAKKzMwMCAxIDk4MTM1MDAKKzI5NyAxIDk4MzM1MDAKKzUxMiAxIDk4NTM1MDAKKzI5MiAxIDk4NzM1MDAKKzQ2OCAxIDk4OTM1MDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5vcHVzIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm9wdXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2Yjg3MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5vcHVzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfMTZraHpfczE2bGUucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEyZjQxYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfMTZraHpfczE2bGUucmF3CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMTZsZS5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczE2bGUucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNDllYjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczE2bGUucmF3CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMzJsZS5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MzMmxlLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlMjRjYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMzJsZS5pbmZvCkBAIC0wLDAgKzEsMTAgQEAKKzE2Mzg0IDEgMAorMTYzODQgMSAxMDI0MDAwCisxNjM4NCAxIDIwNDgwMDAKKzE2Mzg0IDEgMzA3MjAwMAorMTYzODQgMSA0MDk2MDAwCisxNjM4NCAxIDUxMjAwMDAKKzE2Mzg0IDEgNjE0NDAwMAorMTYzODQgMSA3MTY4MDAwCisxNjM4NCAxIDgxOTIwMDAKKzEwOTI0IDEgOTIxNjAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MzMmxlLnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMzJsZS5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ5MWI0NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMzJsZS5yYXcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OThiMmVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlhNmQzMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8KQEAgLTAsMCArMSw1MjAgQEAKKzMwIDMyIDAKKzQxNDAgMzIgMAorMzMgMzIgMAorNTIgMSAwCis1OCAxIDI2NjYKKzYxIDEgNTMzMworNTYgMSA4MDAwCis1OSAxIDEwNjY2Cis2MyAxIDEzMzMzCis2NiAxIDE2MDAwCis3MSAxIDE4NjY2Cis3NiAxIDIxMzMzCiszNzQgMSAyNDAwMAorMzY2IDEgMzYwMDAKKzM3OCAxIDU3MzMzCiszOTMgMSA3ODY2NgorMzkzIDEgMTAwMDAwCiszODYgMSAxMjEzMzMKKzM3NSAxIDE0MjY2NgorMzg4IDEgMTY0MDAwCiszNzggMSAxODUzMzMKKzM3OSAxIDIwNjY2NgorMzc0IDEgMjI4MDAwCiszNTYgMSAyNDkzMzMKKzM1OCAxIDI3MDY2NgorMzMyIDEgMjkyMDAwCiszMzUgMSAzMTMzMzMKKzM2MyAxIDMzNDY2NgorMzQxIDEgMzU2MDAwCiszNjAgMSAzNzczMzMKKzM0MSAxIDM5ODY2NgorMzM1IDEgNDIwMDAwCiszNTcgMSA0NDEzMzMKKzM1NSAxIDQ2MjY2NgorMzYzIDEgNDg0MDAwCiszODIgMSA1MDUzMzMKKzM3MSAxIDUyNjY2NgorMzU3IDEgNTQ4MDAwCiszNTMgMSA1NjkzMzMKKzM1MCAxIDU5MDY2NgorMzI3IDEgNjEyMDAwCiszMTUgMSA2MzMzMzMKKzMwNyAxIDY1NDY2NgorMzAzIDEgNjc2MDAwCisyOTUgMSA2OTczMzMKKzMxMiAxIDcxODY2NgorMzE2IDEgNzQwMDAwCiszMTUgMSA3NjEzMzMKKzMxOCAxIDc4MjY2NgorMzMwIDEgODA0MDAwCiszMTggMSA4MjUzMzMKKzMxNSAxIDg0NjY2NgorMzIyIDEgODY4MDAwCiszMTUgMSA4ODkzMzMKKzMxMCAxIDkxMDY2NgorMzE1IDEgOTMyMDAwCiszMTQgMSA5NTMzMzMKKzMwMiAxIDk3NDY2NgorMzEzIDEgOTk2MDAwCiszMjIgMSAxMDE3MzMzCiszMjMgMSAxMDM4NjY2CiszMTkgMSAxMDYwMDAwCiszMjUgMSAxMDgxMzMzCiszMjggMSAxMTAyNjY2CiszMzAgMSAxMTI0MDAwCiszMzMgMSAxMTQ1MzMzCiszMzAgMSAxMTY2NjY2CiszNDQgMSAxMTg4MDAwCiszMzEgMSAxMjA5MzMzCiszNDIgMSAxMjMwNjY2CiszMzkgMSAxMjUyMDAwCiszMTQgMSAxMjczMzMzCisyODUgMSAxMjk0NjY2CisyOTUgMSAxMzE2MDAwCiszMDIgMSAxMzM3MzMzCiszMDUgMSAxMzU4NjY2CiszMDkgMSAxMzgwMDAwCiszMjcgMSAxNDAxMzMzCiszMDQgMSAxNDIyNjY2CiszMzYgMSAxNDQ0MDAwCiszNTAgMSAxNDY1MzMzCiszNDYgMSAxNDg2NjY2CiszNTIgMSAxNTA4MDAwCiszNDEgMSAxNTI5MzMzCiszNDMgMSAxNTUwNjY2CiszNTEgMSAxNTcyMDAwCiszMTkgMSAxNTkzMzMzCiszMjggMSAxNjE0NjY2CiszMjggMSAxNjM2MDAwCiszMjQgMSAxNjU3MzMzCiszMzggMSAxNjc4NjY2CiszMTcgMSAxNzAwMDAwCiszMjggMSAxNzIxMzMzCiszMzUgMSAxNzQyNjY2CiszNDEgMSAxNzY0MDAwCiszMzUgMSAxNzg1MzMzCiszNDggMSAxODA2NjY2CiszNjIgMSAxODI4MDAwCiszNjEgMSAxODQ5MzMzCiszNDQgMSAxODcwNjY2CiszNDAgMSAxODkyMDAwCiszMzMgMSAxOTEzMzMzCiszMjkgMSAxOTM0NjY2CiszMjggMSAxOTU2MDAwCiszMjMgMSAxOTc3MzMzCiszMTAgMSAxOTk4NjY2CiszMTggMSAyMDIwMDAwCiszMTIgMSAyMDQxMzMzCisyOTUgMSAyMDYyNjY2CiszMjkgMSAyMDg0MDAwCiszMTggMSAyMTA1MzMzCiszMTEgMSAyMTI2NjY2CiszMTcgMSAyMTQ4MDAwCis2MiAxIDIxNjkzMzMKKzc1IDEgMjE4MTMzMworNzMgMSAyMTg0MDAwCiszMzIgMSAyMTg2NjY2CiszMjcgMSAyMTk4NjY2CiszMzIgMSAyMjIwMDAwCiszMjUgMSAyMjQxMzMzCiszMjkgMSAyMjYyNjY2CiszMzAgMSAyMjg0MDAwCis2MSAxIDIzMDUzMzMKKzYxIDEgMjMxNzMzMworNzAgMSAyMzIwMDAwCis3MCAxIDIzMjI2NjYKKzMxOSAxIDIzMjUzMzMKKzMwMyAxIDIzMzczMzMKKzI5MiAxIDIzNTg2NjYKKzMxMyAxIDIzODAwMDAKKzMxOCAxIDI0MDEzMzMKKzM0NiAxIDI0MjI2NjYKKzMyOCAxIDI0NDQwMDAKKzMxNiAxIDI0NjUzMzMKKzM0MSAxIDI0ODY2NjYKKzMyOCAxIDI1MDgwMDAKKzMzOCAxIDI1MjkzMzMKKzM0MSAxIDI1NTA2NjYKKzMzNyAxIDI1NzIwMDAKKzM0NyAxIDI1OTMzMzMKKzM4NCAxIDI2MTQ2NjYKKzM1OCAxIDI2MzYwMDAKKzM2MyAxIDI2NTczMzMKKzM2MyAxIDI2Nzg2NjYKKzM1OCAxIDI3MDAwMDAKKzMzOSAxIDI3MjEzMzMKKzM2OSAxIDI3NDI2NjYKKzM0MyAxIDI3NjQwMDAKKzM0OCAxIDI3ODUzMzMKKzM2MyAxIDI4MDY2NjYKKzM1MCAxIDI4MjgwMDAKKzM1OCAxIDI4NDkzMzMKKzM1MiAxIDI4NzA2NjYKKzMzOCAxIDI4OTIwMDAKKzMzNSAxIDI5MTMzMzMKKzM0MiAxIDI5MzQ2NjYKKzMzOCAxIDI5NTYwMDAKKzM0MCAxIDI5NzczMzMKKzI5MiAxIDI5OTg2NjYKKzI3OSAxIDMwMjAwMDAKKzI5OSAxIDMwNDEzMzMKKzMwMyAxIDMwNjI2NjYKKzI5OCAxIDMwODQwMDAKKzI5NyAxIDMxMDUzMzMKKzI4MCAxIDMxMjY2NjYKKzI5NyAxIDMxNDgwMDAKKzI5MCAxIDMxNjkzMzMKKzMwNiAxIDMxOTA2NjYKKzMwMSAxIDMyMTIwMDAKKzMwNiAxIDMyMzMzMzMKKzI4OSAxIDMyNTQ2NjYKKzMxMSAxIDMyNzYwMDAKKzMxNyAxIDMyOTczMzMKKzM0NCAxIDMzMTg2NjYKKzMwOCAxIDMzNDAwMDAKKzMwNCAxIDMzNjEzMzMKKzMwNCAxIDMzODI2NjYKKzMxMiAxIDM0MDQwMDAKKzMwNSAxIDM0MjUzMzMKKzI5OSAxIDM0NDY2NjYKKzMwMSAxIDM0NjgwMDAKKzMxOCAxIDM0ODkzMzMKKzMxMyAxIDM1MTA2NjYKKzMzMCAxIDM1MzIwMDAKKzMyNSAxIDM1NTMzMzMKKzMyNSAxIDM1NzQ2NjYKKzMyMSAxIDM1OTYwMDAKKzM0OSAxIDM2MTczMzMKKzI4OCAxIDM2Mzg2NjYKKzMwMCAxIDM2NjAwMDAKKzMxMiAxIDM2ODEzMzMKKzMwMiAxIDM3MDI2NjYKKzI3OCAxIDM3MjQwMDAKKzI4NCAxIDM3NDUzMzMKKzI4NiAxIDM3NjY2NjYKKzI3NCAxIDM3ODgwMDAKKzI5NSAxIDM4MDkzMzMKKzI4MSAxIDM4MzA2NjYKKzI4OCAxIDM4NTIwMDAKKzI3OCAxIDM4NzMzMzMKKzMwNiAxIDM4OTQ2NjYKKzYyIDEgMzkxNjAwMAorNTkgMSAzOTI4MDAwCis2MSAxIDM5MzA2NjYKKzU1IDEgMzkzMzMzMworNzAgMSAzOTM2MDAwCis3MiAxIDM5Mzg2NjYKKzMyNCAxIDM5NDEzMzMKKzMwOSAxIDM5NTMzMzMKKzMwMSAxIDM5NzQ2NjYKKzMwMSAxIDM5OTYwMDAKKzI5MSAxIDQwMTczMzMKKzI4OSAxIDQwMzg2NjYKKzMwNiAxIDQwNjAwMDAKKzMwNSAxIDQwODEzMzMKKzI4NiAxIDQxMDI2NjYKKzI5NCAxIDQxMjQwMDAKKzI5MCAxIDQxNDUzMzMKKzI5NyAxIDQxNjY2NjYKKzMwOCAxIDQxODgwMDAKKzI5NiAxIDQyMDkzMzMKKzI5MiAxIDQyMzA2NjYKKzI4NyAxIDQyNTIwMDAKKzI5MSAxIDQyNzMzMzMKKzI5OCAxIDQyOTQ2NjYKKzI5NSAxIDQzMTYwMDAKKzI5NCAxIDQzMzczMzMKKzI5NSAxIDQzNTg2NjYKKzI3NSAxIDQzODAwMDAKKzI4MCAxIDQ0MDEzMzMKKzI4OCAxIDQ0MjI2NjYKKzI4NSAxIDQ0NDQwMDAKKzI3NCAxIDQ0NjUzMzMKKzI5OCAxIDQ0ODY2NjYKKzMwMSAxIDQ1MDgwMDAKKzMwMCAxIDQ1MjkzMzMKKzMwNSAxIDQ1NTA2NjYKKzI5NyAxIDQ1NzIwMDAKKzU5IDEgNDU5MzMzMworNTYgMSA0NjA1MzMzCis1NyAxIDQ2MDgwMDAKKzU1IDEgNDYxMDY2NgorNTggMSA0NjEzMzMzCis1NyAxIDQ2MTYwMDAKKzU4IDEgNDYxODY2NgorNjggMSA0NjIxMzMzCis2NyAxIDQ2MjQwMDAKKzcxIDEgNDYyNjY2NgorMjg5IDEgNDYyOTMzMworMjgyIDEgNDY0MTMzMworMjczIDEgNDY2MjY2NgorMjc5IDEgNDY4NDAwMAorMjg2IDEgNDcwNTMzMworMjgyIDEgNDcyNjY2NgorMjg0IDEgNDc0ODAwMAorMjc4IDEgNDc2OTMzMworMjgxIDEgNDc5MDY2NgorMjgwIDEgNDgxMjAwMAorMjYzIDEgNDgzMzMzMworMjYwIDEgNDg1NDY2NgorMjcxIDEgNDg3NjAwMAorMjczIDEgNDg5NzMzMworMjgyIDEgNDkxODY2NgorMjc5IDEgNDk0MDAwMAorMjk3IDEgNDk2MTMzMworMjkxIDEgNDk4MjY2NgorMzA5IDEgNTAwNDAwMAorMjgzIDEgNTAyNTMzMworMjkyIDEgNTA0NjY2NgorMzA0IDEgNTA2ODAwMAorMjk2IDEgNTA4OTMzMworMjkzIDEgNTExMDY2NgorMjgyIDEgNTEzMjAwMAorMjczIDEgNTE1MzMzMworMjg0IDEgNTE3NDY2NgorMjgxIDEgNTE5NjAwMAorMjY1IDEgNTIxNzMzMworMjcyIDEgNTIzODY2NgorMjc3IDEgNTI2MDAwMAorMjgwIDEgNTI4MTMzMworMjc2IDEgNTMwMjY2NgorMjczIDEgNTMyNDAwMAorMjc4IDEgNTM0NTMzMworMjgwIDEgNTM2NjY2NgorMjgwIDEgNTM4ODAwMAorMjY4IDEgNTQwOTMzMworMjgyIDEgNTQzMDY2NgorMjc3IDEgNTQ1MjAwMAorMjc0IDEgNTQ3MzMzMworMjc1IDEgNTQ5NDY2NgorMjcwIDEgNTUxNjAwMAorMjgyIDEgNTUzNzMzMworMjc5IDEgNTU1ODY2NgorMjYwIDEgNTU4MDAwMAorMjcyIDEgNTYwMTMzMworMjc1IDEgNTYyMjY2NgorMjczIDEgNTY0NDAwMAorMjc2IDEgNTY2NTMzMworMjg4IDEgNTY4NjY2NgorMjk0IDEgNTcwODAwMAorMjcxIDEgNTcyOTMzMworMjc3IDEgNTc1MDY2NgorMjg4IDEgNTc3MjAwMAorMjc2IDEgNTc5MzMzMworMjgyIDEgNTgxNDY2NgorMjc2IDEgNTgzNjAwMAorMjc1IDEgNTg1NzMzMworMjY4IDEgNTg3ODY2NgorMjcwIDEgNTkwMDAwMAorMjY2IDEgNTkyMTMzMworMjY4IDEgNTk0MjY2NgorMjgyIDEgNTk2NDAwMAorMjc5IDEgNTk4NTMzMworMjc5IDEgNjAwNjY2NgorMjg3IDEgNjAyODAwMAorMjg2IDEgNjA0OTMzMworMjgwIDEgNjA3MDY2NgorMjkwIDEgNjA5MjAwMAorMjY2IDEgNjExMzMzMworMjkyIDEgNjEzNDY2NgorMjY0IDEgNjE1NjAwMAorMjcxIDEgNjE3NzMzMworMjc3IDEgNjE5ODY2NgorMjkyIDEgNjIyMDAwMAorMjk4IDEgNjI0MTMzMworMjg0IDEgNjI2MjY2NgorMjg3IDEgNjI4NDAwMAorMjc1IDEgNjMwNTMzMworMjkxIDEgNjMyNjY2NgorMjg3IDEgNjM0ODAwMAorMjgzIDEgNjM2OTMzMworMjg0IDEgNjM5MDY2NgorMjcxIDEgNjQxMjAwMAorMjgyIDEgNjQzMzMzMworMjc3IDEgNjQ1NDY2NgorMjgyIDEgNjQ3NjAwMAorMjg1IDEgNjQ5NzMzMworMjgwIDEgNjUxODY2NgorMjcxIDEgNjU0MDAwMAorMjg5IDEgNjU2MTMzMworMjg3IDEgNjU4MjY2NgorMjk0IDEgNjYwNDAwMAorMjc3IDEgNjYyNTMzMworMjgxIDEgNjY0NjY2NgorMjc0IDEgNjY2ODAwMAorMjcxIDEgNjY4OTMzMworMjc5IDEgNjcxMDY2NgorMjg4IDEgNjczMjAwMAorMjgwIDEgNjc1MzMzMworMjg0IDEgNjc3NDY2NgorMjc4IDEgNjc5NjAwMAorMjc2IDEgNjgxNzMzMworMjc1IDEgNjgzODY2NgorMjYzIDEgNjg2MDAwMAorMjY2IDEgNjg4MTMzMworMjQ3IDEgNjkwMjY2NgorMjY5IDEgNjkyNDAwMAorMjYzIDEgNjk0NTMzMworMjgzIDEgNjk2NjY2NgorMjgwIDEgNjk4ODAwMAorMjgxIDEgNzAwOTMzMworMjk5IDEgNzAzMDY2NgorMjg1IDEgNzA1MjAwMAorMjg4IDEgNzA3MzMzMworMjk5IDEgNzA5NDY2NgorMjg4IDEgNzExNjAwMAorMjc5IDEgNzEzNzMzMworMjc2IDEgNzE1ODY2NgorMjc3IDEgNzE4MDAwMAorMjgyIDEgNzIwMTMzMworMjg1IDEgNzIyMjY2NgorMjk1IDEgNzI0NDAwMAorMjk0IDEgNzI2NTMzMworMzA0IDEgNzI4NjY2NgorMjgyIDEgNzMwODAwMAorMjk5IDEgNzMyOTMzMworMjgzIDEgNzM1MDY2NgorMjgyIDEgNzM3MjAwMAorMjg3IDEgNzM5MzMzMworMzA2IDEgNzQxNDY2NgorMzA0IDEgNzQzNjAwMAorMjg5IDEgNzQ1NzMzMworMjk5IDEgNzQ3ODY2NgorMjgxIDEgNzUwMDAwMAorMjgxIDEgNzUyMTMzMworNjYgMSA3NTQyNjY2Cis2MyAxIDc1NTQ2NjYKKzI4OSAxIDc1NTczMzMKKzI3MCAxIDc1NjkzMzMKKzI1NyAxIDc1OTA2NjYKKzI0NiAxIDc2MTIwMDAKKzI2NCAxIDc2MzMzMzMKKzI4MCAxIDc2NTQ2NjYKKzI3MyAxIDc2NzYwMDAKKzI4NSAxIDc2OTczMzMKKzI2NyAxIDc3MTg2NjYKKzI3NSAxIDc3NDAwMDAKKzI3OCAxIDc3NjEzMzMKKzI5MyAxIDc3ODI2NjYKKzI4MSAxIDc4MDQwMDAKKzI5NyAxIDc4MjUzMzMKKzI5NCAxIDc4NDY2NjYKKzI4NiAxIDc4NjgwMDAKKzI5MCAxIDc4ODkzMzMKKzI5MCAxIDc5MTA2NjYKKzI4OSAxIDc5MzIwMDAKKzI4NiAxIDc5NTMzMzMKKzI4MiAxIDc5NzQ2NjYKKzMwNiAxIDc5OTYwMDAKKzI4NyAxIDgwMTczMzMKKzMxMiAxIDgwMzg2NjYKKzMxMiAxIDgwNjAwMDAKKzMwNyAxIDgwODEzMzMKKzI5MyAxIDgxMDI2NjYKKzI4OSAxIDgxMjQwMDAKKzI4NSAxIDgxNDUzMzMKKzI5MCAxIDgxNjY2NjYKKzI4NSAxIDgxODgwMDAKKzMxMSAxIDgyMDkzMzMKKzMwNyAxIDgyMzA2NjYKKzMxNCAxIDgyNTIwMDAKKzMxOCAxIDgyNzMzMzMKKzMxOSAxIDgyOTQ2NjYKKzMxNSAxIDgzMTYwMDAKKzMwMCAxIDgzMzczMzMKKzI5NSAxIDgzNTg2NjYKKzI5MSAxIDgzODAwMDAKKzI4MiAxIDg0MDEzMzMKKzI5NSAxIDg0MjI2NjYKKzI5NiAxIDg0NDQwMDAKKzI4OCAxIDg0NjUzMzMKKzMwNCAxIDg0ODY2NjYKKzI5OSAxIDg1MDgwMDAKKzI5OCAxIDg1MjkzMzMKKzMwNSAxIDg1NTA2NjYKKzI5NSAxIDg1NzIwMDAKKzI5NiAxIDg1OTMzMzMKKzI5NSAxIDg2MTQ2NjYKKzI4NyAxIDg2MzYwMDAKKzI5MiAxIDg2NTczMzMKKzMwOCAxIDg2Nzg2NjYKKzI4NyAxIDg3MDAwMDAKKzMwNyAxIDg3MjEzMzMKKzI5NSAxIDg3NDI2NjYKKzI5MiAxIDg3NjQwMDAKKzI5MiAxIDg3ODUzMzMKKzI3OSAxIDg4MDY2NjYKKzI4OSAxIDg4MjgwMDAKKzMwMyAxIDg4NDkzMzMKKzMwNyAxIDg4NzA2NjYKKzMxMCAxIDg4OTIwMDAKKzMwMCAxIDg5MTMzMzMKKzI5OSAxIDg5MzQ2NjYKKzI5OSAxIDg5NTYwMDAKKzI4OCAxIDg5NzczMzMKKzI5MCAxIDg5OTg2NjYKKzI5MSAxIDkwMjAwMDAKKzMwNCAxIDkwNDEzMzMKKzI5OSAxIDkwNjI2NjYKKzMwNCAxIDkwODQwMDAKKzI5MCAxIDkxMDUzMzMKKzMwOSAxIDkxMjY2NjYKKzMwMSAxIDkxNDgwMDAKKzI5NiAxIDkxNjkzMzMKKzI4OCAxIDkxOTA2NjYKKzMwNSAxIDkyMTIwMDAKKzMxNyAxIDkyMzMzMzMKKzI5MiAxIDkyNTQ2NjYKKzMwMCAxIDkyNzYwMDAKKzMwMSAxIDkyOTczMzMKKzI5NSAxIDkzMTg2NjYKKzI4MiAxIDkzNDAwMDAKKzI5NiAxIDkzNjEzMzMKKzI5NSAxIDkzODI2NjYKKzI4NyAxIDk0MDQwMDAKKzI5MiAxIDk0MjUzMzMKKzMwMSAxIDk0NDY2NjYKKzMxMSAxIDk0NjgwMDAKKzMwMSAxIDk0ODkzMzMKKzMwNyAxIDk1MTA2NjYKKzMwMCAxIDk1MzIwMDAKKzMwOSAxIDk1NTMzMzMKKzI5OCAxIDk1NzQ2NjYKKzMwNCAxIDk1OTYwMDAKKzYwIDEgOTYxNzMzMworNTkgMSA5NjI5MzMzCis2NCAxIDk2MzIwMDAKKzY0IDEgOTYzNDY2NgorNzcgMSA5NjM3MzMzCis3MiAxIDk2NDAwMDAKKzMwNiAxIDk2NDI2NjYKKzI5NyAxIDk2NTQ2NjYKKzI5NCAxIDk2NzYwMDAKKzI5NSAxIDk2OTczMzMKKzMwOCAxIDk3MTg2NjYKKzMwMyAxIDk3NDAwMDAKKzMwOCAxIDk3NjEzMzMKKzI4OSAxIDk3ODI2NjYKKzMwMCAxIDk4MDQwMDAKKzMwNCAxIDk4MjUzMzMKKzMwOCAxIDk4NDY2NjYKKzY0IDEgOTg2ODAwMAorNjMgMSA5ODgwMDAwCis2NCAxIDk4ODI2NjYKKzY0IDEgOTg4NTMzMworNjAgMSA5ODg4MDAwCis3NCAxIDk4OTA2NjYKKzY5IDEgOTg5MzMzMworNjggMSA5ODk2MDAwCis2MSAxIDk4OTg2NjYKKzcxIDEgOTkwMTMzMworNzYgMSA5OTA0MDAwCis3MyAxIDk5MDY2NjYKKzcwIDEgOTkwOTMzMworNzIgMSA5OTEyMDAwCis2MCAxIDk5MTQ2NjYKKzY5IDEgOTkxNzMzMworODIgMSA5OTIwMDAwCisyNzggMSA5OTIyNjY2CiszMCAxIDk5MzQ2NjYKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LnZvcmJpcyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LnZvcmJpcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDRjNWY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoudm9yYmlzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDFlYTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy5pbmZvCkBAIC0wLDAgKzEsNjAgQEAKKzEwMjcxIDEgMAorMTA2IDAgMTcwMDAKKzEzNCAwIDMzMDAwCisxNDkgMCA1MDAwMAorMTUyIDAgNjcwMDAKKzE1OSAwIDgzMDAwCisxMTQgMCAxMDAwMDAKKzcyMyAwIDExNzAwMAorMTc1IDAgMTMzMDAwCisxODYgMCAxNTAwMDAKKzIwMSAwIDE2NzAwMAorMjcwIDAgMTgzMDAwCiszODMgMCAyMDAwMDAKKzI1NSAwIDIxNzAwMAorMjg2IDAgMjMzMDAwCisyNzMgMCAyNTAwMDAKKzEyMjQgMCAyNjcwMDAKKzIyMCAwIDI4MzAwMAorMjMxIDAgMzAwMDAwCisxOTIgMCAzMTcwMDAKKzE4MiAwIDMzMzAwMAorMjg5IDAgMzUwMDAwCisyMDQgMCAzNjcwMDAKKzIzNyAwIDM4MzAwMAorMTg3IDAgNDAwMDAwCis4OTggMCA0MTcwMDAKKzIzMSAwIDQzMzAwMAorMjY2IDAgNDUwMDAwCisyNzggMCA0NjcwMDAKKzIwNSAwIDQ4MzAwMAorMjU1IDAgNTAwMDAwCisxNjkgMCA1MTcwMDAKKzIzMyAwIDUzMzAwMAorMTAxMSAwIDU1MDAwMAorMjAyIDAgNTY3MDAwCisyNTEgMCA1ODMwMDAKKzIyMyAwIDYwMDAwMAorMjgzIDAgNjE3MDAwCiszNjIgMCA2MzMwMDAKKzIxNyAwIDY1MDAwMAorMjQ1IDAgNjY3MDAwCis5NjAgMCA2ODMwMDAKKzIzMyAwIDcwMDAwMAorMjg2IDAgNzE3MDAwCisyNzIgMCA3MzMwMDAKKzI1NCAwIDc1MDAwMAorMzMxIDAgNzY3MDAwCisyMTggMCA3ODMwMDAKKzI2MSAwIDgwMDAwMAorOTgxIDAgODE3MDAwCisyMjYgMCA4MzMwMDAKKzIyNiAwIDg1MDAwMAorMjc5IDAgODY3MDAwCisyMjUgMCA4ODMwMDAKKzI5NSAwIDkwMDAwMAorMTc1IDAgOTE3MDAwCisyNDkgMCA5MzMwMDAKKzk5NiAwIDk1MDAwMAorMTY5IDAgOTY3MDAwCisyMjQgMCA5ODMwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMudnA4IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy52cDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmViYTU2YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMudnA4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMDBjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy5pbmZvCkBAIC0wLDAgKzEsMzAwIEBACis4Njk4MCAxIDAKKzY3NDEgMCAzMzAwMAorOTQzMyAwIDY3MDAwCis5MzYzIDAgMTAwMDAwCis4NjcxIDAgMTMzMDAwCis5MDAzIDAgMTY3MDAwCis3NzUxIDAgMjAwMDAwCisxMzIwNyAwIDIzMzAwMAorODU0MiAwIDI2NzAwMAorOTM0NCAwIDMwMDAwMAorODA2OSAwIDMzMzAwMAorODU4OCAwIDM2NzAwMAorMTIwODcgMCA0MDAwMDAKKzczMTUgMCA0MzMwMDAKKzk2NTQgMCA0NjcwMDAKKzEzMTAwIDAgNTAwMDAwCis3ODMyIDAgNTMzMDAwCisxMDA2MCAwIDU2NzAwMAorODU0MCAwIDYwMDAwMAorODY2NyAwIDYzMzAwMAorODUzMiAwIDY2NzAwMAorNjAxOCAwIDcwMDAwMAorODUyMCAwIDczMzAwMAorMTUzNTAgMCA3NjcwMDAKKzYxMTAgMCA4MDAwMDAKKzc4NzYgMCA4MzMwMDAKKzYxMzMgMCA4NjcwMDAKKzk0NzYgMCA5MDAwMDAKKzExMDAyIDAgOTMzMDAwCis3NDg0IDAgOTY3MDAwCis4NzYwIDAgMTAwMDAwMAorMTY1MTUgMCAxMDMzMDAwCis3NDgyIDAgMTA2NzAwMAorNjk4MyAwIDExMDAwMDAKKzc1NjEgMCAxMTMzMDAwCis4MjYzIDAgMTE2NzAwMAorMTA2ODIgMCAxMjAwMDAwCis4MTA4IDAgMTIzMzAwMAorNzkyNCAwIDEyNjcwMDAKKzg2OTMgMCAxMzAwMDAwCisxNDE5MCAwIDEzMzMwMDAKKzczOTMgMCAxMzY3MDAwCis2ODY0IDAgMTQwMDAwMAorOTQzMSAwIDE0MzMwMDAKKzc2NzQgMCAxNDY3MDAwCis4NDU4IDAgMTUwMDAwMAorNTg5OSAwIDE1MzMwMDAKKzgyNTkgMCAxNTY3MDAwCis3OTYzIDAgMTYwMDAwMAorMTQ3NzkgMCAxNjMzMDAwCis2ODc3IDAgMTY2NzAwMAorNzI2OCAwIDE3MDAwMDAKKzg1MjYgMCAxNzMzMDAwCis4NDY3IDAgMTc2NzAwMAorMTEyMDAgMCAxODAwMDAwCis3MjYxIDAgMTgzMzAwMAorODI4MCAwIDE4NjcwMDAKKzY3MTggMCAxOTAwMDAwCisxNzc0MiAwIDE5MzMwMDAKKzUyMDYgMCAxOTY3MDAwCis1NzAwIDAgMjAwMDAwMAorNTg3MiAwIDIwMzMwMDAKKzc5MTUgMCAyMDY3MDAwCis4NDkzIDAgMjEwMDAwMAorNjU0NSAwIDIxMzMwMDAKKzkwNzIgMCAyMTY3MDAwCisxMzIwMCAwIDIyMDAwMDAKKzk2MzIgMCAyMjMzMDAwCisxMDAxNiAwIDIyNjcwMDAKKzc4MjQgMCAyMzAwMDAwCisxMDYyOCAwIDIzMzMwMDAKKzEwNDAxIDAgMjM2NzAwMAorMTA4OTIgMCAyNDAwMDAwCis5MDIzIDAgMjQzMzAwMAorMTA3MzQgMCAyNDY3MDAwCisxNTA0NSAwIDI1MDAwMDAKKzc5NDAgMCAyNTMzMDAwCis5NjU3IDAgMjU2NzAwMAorODc0MyAwIDI2MDAwMDAKKzgwNzQgMCAyNjMzMDAwCis5NDQ1IDAgMjY2NzAwMAorNjQ5NCAwIDI3MDAwMDAKKzg2MDEgMCAyNzMzMDAwCisxMzQ3OCAwIDI3NjcwMDAKKzY5NDIgMCAyODAwMDAwCis4MDAyIDAgMjgzMzAwMAorNzk0MCAwIDI4NjcwMDAKKzgzMjAgMCAyOTAwMDAwCisxMjIxNSAwIDI5MzMwMDAKKzY2NjggMCAyOTY3MDAwCisxMTM4NCAwIDMwMDAwMDAKKzgzNzggMCAzMDMzMDAwCisxMjkwOCAwIDMwNjcwMDAKKzg0MjAgMCAzMTAwMDAwCis3NTAyIDAgMzEzMzAwMAorODQ4MiAwIDMxNjcwMDAKKzEwOTY4IDAgMzIwMDAwMAorMTIzMzggMCAzMjMzMDAwCis4NjU3IDAgMzI2NzAwMAorMTA0NjggMCAzMzAwMDAwCisxMzg3OCAwIDMzMzMwMDAKKzkzNzQgMCAzMzY3MDAwCis5ODU3IDAgMzQwMDAwMAorMTAzODEgMCAzNDMzMDAwCis5OTg0IDAgMzQ2NzAwMAorOTk1NiAwIDM1MDAwMDAKKzg5MDUgMCAzNTMzMDAwCis4NjcyIDAgMzU2NzAwMAorODEyMiAwIDM2MDAwMDAKKzk2NzcgMCAzNjMzMDAwCis5ODEyIDAgMzY2NzAwMAorOTYyMiAwIDM3MDAwMDAKKzkwMjMgMCAzNzMzMDAwCis3MTQ3IDAgMzc2NzAwMAorOTE0NiAwIDM4MDAwMDAKKzc0ODggMCAzODMzMDAwCisxMDgxMiAwIDM4NjcwMDAKKzgzNDAgMCAzOTAwMDAwCisxMzI4MCAwIDM5MzMwMDAKKzUxNjcgMCAzOTY3MDAwCis2OTkxIDAgNDAwMDAwMAorNjU0MyAwIDQwMzMwMDAKKzU5NTIgMCA0MDY3MDAwCis1MTY0IDAgNDEwMDAwMAorNDAxMSAwIDQxMzMwMDAKKzM3OTQgMCA0MTY3MDAwCisxMjk1OSAwIDQyMDAwMDAKKzcxMDIwIDEgNDIzMzAwMAorNTM1MSAwIDQyNjcwMDAKKzYyODMgMCA0MzAwMDAwCis1MDgwIDAgNDMzMzAwMAorNjcwNyAwIDQzNjcwMDAKKzU4NTcgMCA0NDAwMDAwCis1MjIxIDAgNDQzMzAwMAorMTA5NzIgMCA0NDY3MDAwCis3MDIzIDAgNDUwMDAwMAorNjkwNyAwIDQ1MzMwMDAKKzc4NTEgMCA0NTY3MDAwCis0ODQzIDAgNDYwMDAwMAorNjA4NSAwIDQ2MzMwMDAKKzQ4NjggMCA0NjY3MDAwCis1MDkzIDAgNDcwMDAwMAorMTI4MDcgMCA0NzMzMDAwCis2MzMwIDAgNDc2NzAwMAorNDIwOSAwIDQ4MDAwMDAKKzQ1OTYgMCA0ODMzMDAwCis2MzE2IDAgNDg2NzAwMAorNDk1NCAwIDQ5MDAwMDAKKzU1MzMgMCA0OTMzMDAwCis3NzQ5IDAgNDk2NzAwMAorMTI0ODYgMCA1MDAwMDAwCis1NDY4IDAgNTAzMzAwMAorNDM1MyAwIDUwNjcwMDAKKzU3ODYgMCA1MTAwMDAwCis1NTUxIDAgNTEzMzAwMAorNjcxMSAwIDUxNjcwMDAKKzU2ODggMCA1MjAwMDAwCis2MjU4IDAgNTIzMzAwMAorMTI5NzUgMCA1MjY3MDAwCis0ODczIDAgNTMwMDAwMAorNDU1MiAwIDUzMzMwMDAKKzQ4NDQgMCA1MzY3MDAwCis0Nzc0IDAgNTQwMDAwMAorNTAyNSAwIDU0MzMwMDAKKzUyMDQgMCA1NDY3MDAwCis0ODE0IDAgNTUwMDAwMAorMTQ4MzUgMCA1NTMzMDAwCis1MzQzIDAgNTU2NzAwMAorNDgwOCAwIDU2MDAwMDAKKzUwNzEgMCA1NjMzMDAwCis2MzI0IDAgNTY2NzAwMAorNTI0MyAwIDU3MDAwMDAKKzQ5OTUgMCA1NzMzMDAwCis1MTM0IDAgNTc2NzAwMAorMTEwNTQgMCA1ODAwMDAwCis0ODA3IDAgNTgzMzAwMAorNTExOCAwIDU4NjcwMDAKKzY0MjQgMCA1OTAwMDAwCis0OTg0IDAgNTkzMzAwMAorNzE4NyAwIDU5NjcwMDAKKzU1MDUgMCA2MDAwMDAwCis2OTQxIDAgNjAzMzAwMAorMTE1MTcgMCA2MDY3MDAwCis1NjQ2IDAgNjEwMDAwMAorNjgzMiAwIDYxMzMwMDAKKzUyOTQgMCA2MTY3MDAwCis2MjAwIDAgNjIwMDAwMAorNjMyOCAwIDYyMzMwMDAKKzQzNDggMCA2MjY3MDAwCis0NjA3IDAgNjMwMDAwMAorMTI5NTggMCA2MzMzMDAwCis0MzA4IDAgNjM2NzAwMAorNjA4NCAwIDY0MDAwMDAKKzQ0OTQgMCA2NDMzMDAwCis1MzM4IDAgNjQ2NzAwMAorNTc0MiAwIDY1MDAwMDAKKzU0NzIgMCA2NTMzMDAwCis4NDU5IDAgNjU2NzAwMAorMTMwNzUgMCA2NjAwMDAwCis4OTg2IDAgNjYzMzAwMAorOTU4MyAwIDY2NjcwMDAKKzg3OTIgMCA2NzAwMDAwCis5MDA0IDAgNjczMzAwMAorOTYzMiAwIDY3NjcwMDAKKzkzOTMgMCA2ODAwMDAwCis5MjU5IDAgNjgzMzAwMAorMTE5MjcgMCA2ODY3MDAwCisxMDMyMyAwIDY5MDAwMDAKKzE1MjQ4IDAgNjkzMzAwMAorMTEyNDQgMCA2OTY3MDAwCisxNTU1OCAwIDcwMDAwMDAKKzYxOTcgMCA3MDMzMDAwCis4MDQ0IDAgNzA2NzAwMAorMTE0MzIgMCA3MTAwMDAwCis4NzM3IDAgNzEzMzAwMAorMTM4ODUgMCA3MTY3MDAwCisxMTE1OCAwIDcyMDAwMDAKKzE1MTUyIDAgNzIzMzAwMAorNzAyNSAwIDcyNjcwMDAKKzgwMjUgMCA3MzAwMDAwCisxMzM2MiAwIDczMzMwMDAKKzgwOTAgMCA3MzY3MDAwCisxMzYzNyAwIDc0MDAwMDAKKzYxNDggMCA3NDMzMDAwCis5MjcwIDAgNzQ2NzAwMAorODYzMyAwIDc1MDAwMDAKKzEwNjczIDAgNzUzMzAwMAorMTQyMDggMCA3NTY3MDAwCis4MDg0IDAgNzYwMDAwMAorMTM3ODMgMCA3NjMzMDAwCisxMDY2MCAwIDc2NjcwMDAKKzc0NjYgMCA3NzAwMDAwCisxNDQzMyAwIDc3MzMwMDAKKzEwOTM0IDAgNzc2NzAwMAorNzIzOSAwIDc4MDAwMDAKKzEyNTQ4IDAgNzgzMzAwMAorNjU2NCAwIDc4NjcwMDAKKzEwNzYxIDAgNzkwMDAwMAorMTA5OTIgMCA3OTMzMDAwCisxMjkyNCAwIDc5NjcwMDAKKzEyMzQ4IDAgODAwMDAwMAorNjc3MCAwIDgwMzMwMDAKKzE0Mjg4IDAgODA2NzAwMAorMjkzNDUgMSA4MTAwMDAwCisxODIyIDAgODEzMzAwMAorMTA4NyAwIDgxNjcwMDAKKzExMDkgMCA4MjAwMDAwCisyMDA3IDAgODIzMzAwMAorMTc5OCAwIDgyNjcwMDAKKzE2MzUgMCA4MzAwMDAwCisxOTYwNyAwIDgzMzMwMDAKKzkxOSAwIDgzNjcwMDAKKzIzNTcgMCA4NDAwMDAwCiszNTc4IDAgODQzMzAwMAorNDQ5NyAwIDg0NjcwMDAKKzQzMTQgMCA4NTAwMDAwCiszODUxIDAgODUzMzAwMAorMzgyMiAwIDg1NjcwMDAKKzQyNTIgMCA4NjAwMDAwCis0Nzc1IDAgODYzMzAwMAorMTIyMDMgMCA4NjY3MDAwCis1MDc4IDAgODcwMDAwMAorNTg3NiAwIDg3MzMwMDAKKzYxMjQgMCA4NzY3MDAwCis0NDkwIDAgODgwMDAwMAorMzUzOCAwIDg4MzMwMDAKKzM0NTAgMCA4ODY3MDAwCiszNjExIDAgODkwMDAwMAorMjg0NyAwIDg5MzMwMDAKKzI2MDUgMCA4OTY3MDAwCisxMjI0MyAwIDkwMDAwMDAKKzE5NDYgMCA5MDMzMDAwCisxODQ3IDAgOTA2NzAwMAorMjAzNSAwIDkxMDAwMDAKKzI1NzIgMCA5MTMzMDAwCisyMzI2IDAgOTE2NzAwMAorMjY0NSAwIDkyMDAwMDAKKzI5MzggMCA5MjMzMDAwCisyNDk1IDAgOTI2NzAwMAorMjYwOSAwIDkzMDAwMDAKKzk3NDQgMCA5MzMzMDAwCisxNzk2IDAgOTM2NzAwMAorMTk4NSAwIDk0MDAwMDAKKzE3NTkgMCA5NDMzMDAwCisyMjU5IDAgOTQ2NzAwMAorMjIzMyAwIDk1MDAwMDAKKzIwNDQgMCA5NTMzMDAwCisyNTAyIDAgOTU2NzAwMAorMjMwNyAwIDk2MDAwMDAKKzI3MzkgMCA5NjMzMDAwCisxMTcwNyAwIDk2NjcwMDAKKzUxNjggMCA5NzAwMDAwCis0NDgzIDAgOTczMzAwMAorMzA0NCAwIDk3NjcwMDAKKzQyNDEgMCA5ODAwMDAwCis0MzkyIDAgOTgzMzAwMAorNDkzNCAwIDk4NjcwMDAKKzU5MzQgMCA5OTAwMDAwCis1NjQ3IDAgOTkzMzAwMAorNTMyNiAwIDk5NjcwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLnZwOCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLnZwOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWM0NjBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMudnA4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTFhMDNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy5pbmZvCkBAIC0wLDAgKzEsNjAgQEAKKzY5MzkgMSAwCis2ODE4IDAgMTcwMDAKKzMxMCAwIDMzMDAwCisyNzMgMCA1MDAwMAorMjY3IDAgNjcwMDAKKzIzOSAwIDgzMDAwCisyMzIgMCAxMDAwMDAKKzIyMiAwIDExNzAwMAorMTg2IDAgMTMzMDAwCisxOTQgMCAxNTAwMDAKKzE4OSAwIDE2NzAwMAorMTggMCAxODMwMDAKKzIwMTQgMCAyMDAwMDAKKzI5NyAwIDIxNzAwMAorMjg3IDAgMjMzMDAwCisyMzcgMCAyNTAwMDAKKzI2MyAwIDI2NzAwMAorMjM4IDAgMjgzMDAwCisyNTcgMCAzMDAwMDAKKzIyOSAwIDMxNzAwMAorMTg3IDAgMzMzMDAwCisxOTEgMCAzNTAwMDAKKzE4IDAgMzY3MDAwCisyMjAzIDAgMzgzMDAwCisyNjUgMCA0MDAwMDAKKzIyNCAwIDQxNzAwMAorMjU0IDAgNDMzMDAwCisyNTIgMCA0NTAwMDAKKzI3MyAwIDQ2NzAwMAorMjA4IDAgNDgzMDAwCisxNTQgMCA1MDAwMDAKKzE4MiAwIDUxNzAwMAorMTM4IDAgNTMzMDAwCisxOCAwIDU1MDAwMAorMjUwMiAwIDU2NzAwMAorMjg2IDAgNTgzMDAwCiszMDQgMCA2MDAwMDAKKzM0MSAwIDYxNzAwMAorMjU5IDAgNjMzMDAwCisyNzUgMCA2NTAwMDAKKzIyMiAwIDY2NzAwMAorMjU0IDAgNjgzMDAwCisyNTMgMCA3MDAwMDAKKzIyNSAwIDcxNzAwMAorMTggMCA3MzMwMDAKKzI1MDEgMCA3NTAwMDAKKzI4MiAwIDc2NzAwMAorMjk4IDAgNzgzMDAwCisyNTIgMCA4MDAwMDAKKzI0MiAwIDgxNzAwMAorMjUwIDAgODMzMDAwCisyNjAgMCA4NTAwMDAKKzIxOCAwIDg2NzAwMAorMjEzIDAgODgzMDAwCisxNDQgMCA5MDAwMDAKKzE4IDAgOTE3MDAwCisyMzMgMCA5MzMwMDAKKzI1NCAwIDk1MDAwMAorMjI5IDAgOTY3MDAwCisyMzkgMCA5ODMwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMudnA5IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy52cDkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzM2M4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMudnA5CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZTk2NzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvCkBAIC0wLDAgKzEsMzAwIEBACis1NDkxOCAxIDAKKzQ2MjgwIDAgMzMwMDAKKzIwMDYgMCA2NzAwMAorMjg0MSAwIDEwMDAwMAorMzA0NCAwIDEzMzAwMAorMzQyOSAwIDE2NzAwMAorMzE5NiAwIDIwMDAwMAorMjkyNiAwIDIzMzAwMAorMjgyMSAwIDI2NzAwMAorMTE1MCAwIDMwMDAwMAorMzYgMCAzMzMwMDAKKzM4MDg0IDAgMzY3MDAwCiszNjg5IDAgNDAwMDAwCiszNDczIDAgNDMzMDAwCiszMDExIDAgNDY3MDAwCiszMDkwIDAgNTAwMDAwCisyNTE2IDAgNTMzMDAwCisyNzcxIDAgNTY3MDAwCiszMjUwIDAgNjAwMDAwCisxMTU5IDAgNjMzMDAwCiszNCAwIDY2NzAwMAorMzk2OTAgMCA3MDAwMDAKKzM2MTUgMCA3MzMwMDAKKzI0OTQgMCA3NjcwMDAKKzI4OTMgMCA4MDAwMDAKKzMzMjkgMCA4MzMwMDAKKzI5MzkgMCA4NjcwMDAKKzIzNTIgMCA5MDAwMDAKKzI3MzIgMCA5MzMwMDAKKzE3NDYgMCA5NjcwMDAKKzMzIDAgMTAwMDAwMAorNDE1MDEgMCAxMDMzMDAwCisyOTk3IDAgMTA2NzAwMAorMjY2NiAwIDExMDAwMDAKKzM1ODIgMCAxMTMzMDAwCisyNjE2IDAgMTE2NzAwMAorMjkyMyAwIDEyMDAwMDAKKzI2OTYgMCAxMjMzMDAwCisxNjI4IDAgMTI2NzAwMAorMTg4NyAwIDEzMDAwMDAKKzMzIDAgMTMzMzAwMAorNDI4NzYgMCAxMzY3MDAwCisyNTg4IDAgMTQwMDAwMAorMzMxNiAwIDE0MzMwMDAKKzIyODcgMCAxNDY3MDAwCiszMzc1IDAgMTUwMDAwMAorMjEwOCAwIDE1MzMwMDAKKzI5NjEgMCAxNTY3MDAwCisxNzMwIDAgMTYwMDAwMAorMTgwMCAwIDE2MzMwMDAKKzM0IDAgMTY2NzAwMAorNDM3OTcgMCAxNzAwMDAwCisyNDg0IDAgMTczMzAwMAorMjU1NiAwIDE3NjcwMDAKKzI2NzEgMCAxODAwMDAwCisyMzM4IDAgMTgzMzAwMAorMzEzMyAwIDE4NjcwMDAKKzIwMDIgMCAxOTAwMDAwCisxNzk0IDAgMTkzMzAwMAorMTI3OSAwIDE5NjcwMDAKKzMyIDAgMjAwMDAwMAorNDI2NDIgMCAyMDMzMDAwCisyNjg2IDAgMjA2NzAwMAorMjIwMiAwIDIxMDAwMDAKKzIxNDUgMCAyMTMzMDAwCisyNTY2IDAgMjE2NzAwMAorMjE5MCAwIDIyMDAwMDAKKzE1ODAgMCAyMjMzMDAwCisxNzExIDAgMjI2NzAwMAorNjQ4IDAgMjMwMDAwMAorMzIgMCAyMzMzMDAwCis0MDQwOSAwIDIzNjcwMDAKKzI2MjggMCAyNDAwMDAwCisxOTczIDAgMjQzMzAwMAorMjM2MCAwIDI0NjcwMDAKKzMwNDMgMCAyNTAwMDAwCisxNzMwIDAgMjUzMzAwMAorMTQ1NiAwIDI1NjcwMDAKKzIzMTIgMCAyNjAwMDAwCiszNjkgMCAyNjMzMDAwCiszMiAwIDI2NjcwMDAKKzQxMzkxIDAgMjcwMDAwMAorMjk2NyAwIDI3MzMwMDAKKzI0NTQgMCAyNzY3MDAwCisxODI1IDAgMjgwMDAwMAorMTg1MyAwIDI4MzMwMDAKKzE3NDYgMCAyODY3MDAwCisyMzQ3IDAgMjkwMDAwMAorMTM2MiAwIDI5MzMwMDAKKzQ0MSAwIDI5NjcwMDAKKzM0IDAgMzAwMDAwMAorNDI1MDMgMCAzMDMzMDAwCisxODc3IDAgMzA2NzAwMAorMTY5MCAwIDMxMDAwMDAKKzEzNjcgMCAzMTMzMDAwCisxNTIwIDAgMzE2NzAwMAorMTI0MCAwIDMyMDAwMDAKKzEwOTQgMCAzMjMzMDAwCis3MzkgMCAzMjY3MDAwCiszOTIgMCAzMzAwMDAwCiszMyAwIDMzMzMwMDAKKzM1MTA0IDAgMzM2NzAwMAorMTQ2MyAwIDM0MDAwMDAKKzIwMjkgMCAzNDMzMDAwCisxNjI2IDAgMzQ2NzAwMAorMTk1NiAwIDM1MDAwMDAKKzc5OSAwIDM1MzMwMDAKKzU1NiAwIDM1NjcwMDAKKzU4NCAwIDM2MDAwMDAKKzE5MSAwIDM2MzMwMDAKKzM2IDAgMzY2NzAwMAorMzc2NTIgMCAzNzAwMDAwCis4NjIgMCAzNzMzMDAwCis1MjQgMCAzNzY3MDAwCis2NDEgMCAzODAwMDAwCis1ODQgMCAzODMzMDAwCiszNjAgMCAzODY3MDAwCiszNjUgMCAzOTAwMDAwCiszNjEgMCAzOTMzMDAwCisxNTQgMCAzOTY3MDAwCiszNiAwIDQwMDAwMDAKKzEyNTc0MCAwIDQwMzMwMDAKKzMzMiAwIDQwNjcwMDAKKzM4MSAwIDQxMDAwMDAKKzQyMCAwIDQxMzMwMDAKKzQ2NCAwIDQxNjcwMDAKKzI4OCAwIDQyMDAwMDAKKzI2NjAgMCA0MjMzMDAwCisxMjc1NjQgMSA0MjY3MDAwCiszMDY5NiAwIDQzMDAwMDAKKzM0MjMgMCA0MzMzMDAwCiszMzEwIDAgNDM2NzAwMAorMzUxMyAwIDQ0MDAwMDAKKzM3MzUgMCA0NDMzMDAwCiszMzU4IDAgNDQ2NzAwMAorMzEwOCAwIDQ1MDAwMDAKKzI4MDAgMCA0NTMzMDAwCisxNzUxIDAgNDU2NzAwMAorNDEgMCA0NjAwMDAwCiszOTg2MiAwIDQ2MzMwMDAKKzM3MzkgMCA0NjY3MDAwCiszNzU1IDAgNDcwMDAwMAorMzQwOCAwIDQ3MzMwMDAKKzM3ODMgMCA0NzY3MDAwCiszNDIzIDAgNDgwMDAwMAorMjgwMSAwIDQ4MzMwMDAKKzI1NDkgMCA0ODY3MDAwCisxNDYxIDAgNDkwMDAwMAorNDAgMCA0OTMzMDAwCis0MTY2NyAwIDQ5NjcwMDAKKzM2MjMgMCA1MDAwMDAwCiszMzU2IDAgNTAzMzAwMAorMzQyNCAwIDUwNjcwMDAKKzM1NDggMCA1MTAwMDAwCiszMTE5IDAgNTEzMzAwMAorMjkwNSAwIDUxNjcwMDAKKzI3NzIgMCA1MjAwMDAwCisxNjIzIDAgNTIzMzAwMAorNDMgMCA1MjY3MDAwCis0Njc4MyAwIDUzMDAwMDAKKzM0NjIgMCA1MzMzMDAwCiszNDcwIDAgNTM2NzAwMAorMzY3NyAwIDU0MDAwMDAKKzM2ODQgMCA1NDMzMDAwCiszMjY2IDAgNTQ2NzAwMAorMzEyNyAwIDU1MDAwMDAKKzI4MDkgMCA1NTMzMDAwCisxNzUwIDAgNTU2NzAwMAorNDAgMCA1NjAwMDAwCis0NjIxNSAwIDU2MzMwMDAKKzM1OTkgMCA1NjY3MDAwCiszNTU4IDAgNTcwMDAwMAorMzU0NCAwIDU3MzMwMDAKKzM2MzIgMCA1NzY3MDAwCiszNTQ4IDAgNTgwMDAwMAorMjk2OCAwIDU4MzMwMDAKKzI3MTUgMCA1ODY3MDAwCisxNzI5IDAgNTkwMDAwMAorNDEgMCA1OTMzMDAwCis0NTk1OCAwIDU5NjcwMDAKKzM3NzYgMCA2MDAwMDAwCiszNTI1IDAgNjAzMzAwMAorMzY0NCAwIDYwNjcwMDAKKzM3ODYgMCA2MTAwMDAwCiszMjIyIDAgNjEzMzAwMAorMjkyMyAwIDYxNjcwMDAKKzI3NTIgMCA2MjAwMDAwCisxNTkyIDAgNjIzMzAwMAorNDEgMCA2MjY3MDAwCis0NjAzMSAwIDYzMDAwMDAKKzM1MjAgMCA2MzMzMDAwCiszMzgwIDAgNjM2NzAwMAorMzM3MSAwIDY0MDAwMDAKKzM0MjcgMCA2NDMzMDAwCiszMTM1IDAgNjQ2NzAwMAorMjk4OCAwIDY1MDAwMDAKKzI3MzAgMCA2NTMzMDAwCisxNjcxIDAgNjU2NzAwMAorNDEgMCA2NjAwMDAwCis0NTg0NiAwIDY2MzMwMDAKKzM1MzUgMCA2NjY3MDAwCiszNTA3IDAgNjcwMDAwMAorMzQyOSAwIDY3MzMwMDAKKzM0OTEgMCA2NzY3MDAwCiszMzI1IDAgNjgwMDAwMAorMjk3OSAwIDY4MzMwMDAKKzI4MDAgMCA2ODY3MDAwCisxNjEwIDAgNjkwMDAwMAorNDAgMCA2OTMzMDAwCis0NTk1OCAwIDY5NjcwMDAKKzM3NjIgMCA3MDAwMDAwCiszMjU0IDAgNzAzMzAwMAorMzQwOCAwIDcwNjcwMDAKKzM4NjAgMCA3MTAwMDAwCiszMTk4IDAgNzEzMzAwMAorMjk2NiAwIDcxNjcwMDAKKzI4ODIgMCA3MjAwMDAwCisxNzYzIDAgNzIzMzAwMAorNDIgMCA3MjY3MDAwCis0NjEzMCAwIDczMDAwMDAKKzM1OTMgMCA3MzMzMDAwCiszNTIzIDAgNzM2NzAwMAorMzkzOSAwIDc0MDAwMDAKKzM5ODAgMCA3NDMzMDAwCiszNDcwIDAgNzQ2NzAwMAorMzE5MSAwIDc1MDAwMDAKKzI5NjkgMCA3NTMzMDAwCisxNzQwIDAgNzU2NzAwMAorNDEgMCA3NjAwMDAwCis0NjMwMCAwIDc2MzMwMDAKKzM3MzkgMCA3NjY3MDAwCiszNzgxIDAgNzcwMDAwMAorMzk2NCAwIDc3MzMwMDAKKzQwMjMgMCA3NzY3MDAwCiszNDgwIDAgNzgwMDAwMAorMzA2NSAwIDc4MzMwMDAKKzI5MzQgMCA3ODY3MDAwCisxODA1IDAgNzkwMDAwMAorNDIgMCA3OTMzMDAwCiszODE2NiAwIDc5NjcwMDAKKzQwNjIgMCA4MDAwMDAwCiszODQ0IDAgODAzMzAwMAorNDU0NyAwIDgwNjcwMDAKKzkzNCAwIDgxMDAwMDAKKzM2NSAwIDgxMzMwMDAKKzE4MSAwIDgxNjcwMDAKKzQ2MyAwIDgyMDAwMDAKKzQxOSAwIDgyMzMwMDAKKzM4IDAgODI2NzAwMAorOTcwMiAwIDgzMDAwMDAKKzM0NCAwIDgzMzMwMDAKKzI3NiAwIDgzNjcwMDAKKzEzNTAgMCA4NDAwMDAwCisxNzAzIDAgODQzMzAwMAorMTg0MyAwIDg0NjcwMDAKKzEyMjggMCA4NTAwMDAwCiszNTU4MCAxIDg1MzMwMDAKKzI3NDU4IDAgODU2NzAwMAorMjE0NCAwIDg2MDAwMDAKKzI0ODIgMCA4NjMzMDAwCisyMDA0IDAgODY2NzAwMAorMjgyMiAwIDg3MDAwMDAKKzI1NzAgMCA4NzMzMDAwCisxNzI2IDAgODc2NzAwMAorMTI0OCAwIDg4MDAwMDAKKzg0NCAwIDg4MzMwMDAKKzM1IDAgODg2NzAwMAorMTQyMDcgMCA4OTAwMDAwCisxMDM3IDAgODkzMzAwMAorNzQ5IDAgODk2NzAwMAorODI5IDAgOTAwMDAwMAorOTE1IDAgOTAzMzAwMAorNjg1IDAgOTA2NzAwMAorNzY3IDAgOTEwMDAwMAorNzk4IDAgOTEzMzAwMAorMzQyIDAgOTE2NzAwMAorMzEgMCA5MjAwMDAwCisxMjU5MCAwIDkyMzMwMDAKKzkyMyAwIDkyNjcwMDAKKzgxOSAwIDkzMDAwMDAKKzc3NiAwIDkzMzMwMDAKKzg2MyAwIDkzNjcwMDAKKzcyOSAwIDk0MDAwMDAKKzQ3MSAwIDk0MzMwMDAKKzYzOCAwIDk0NjcwMDAKKzI3NiAwIDk1MDAwMDAKKzM4IDAgOTUzMzAwMAorMTcyNzIgMCA5NTY3MDAwCis4NTYgMCA5NjAwMDAwCisxMTU4IDAgOTYzMzAwMAorMjE3MiAwIDk2NjcwMDAKKzI3NTEgMCA5NzAwMDAwCisyMTQyIDAgOTczMzAwMAorMTI2NyAwIDk3NjcwMDAKKzE5NjUgMCA5ODAwMDAwCisxNTEwIDAgOTgzMzAwMAorMzQgMCA5ODY3MDAwCisyNjkyIDAgOTkwMDAwMAorMjc3OCAwIDk5MzMwMDAKKzI1ODUgMCA5OTY3MDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy52cDkgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy52cDkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlMjAwMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLnZwOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouYW1ybmIgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouYW1ybmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhZjJlMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5hbXJuYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNmU4MTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouaW5mbwpAQCAtMCwwICsxLDgzMyBAQAorMzIgMSAwCiszMiAxIDIwMDAwCiszMiAxIDQwMDAwCiszMiAxIDYwMDAwCiszMiAxIDgwMDAwCiszMiAxIDEwMDAwMAorMzIgMSAxMjAwMDAKKzMyIDEgMTQwMDAwCiszMiAxIDE2MDAwMAorMzIgMSAxODAwMDAKKzMyIDEgMjAwMDAwCiszMiAxIDIyMDAwMAorMzIgMSAyNDAwMDAKKzMyIDEgMjYwMDAwCiszMiAxIDI4MDAwMAorMzIgMSAzMDAwMDAKKzMyIDEgMzIwMDAwCiszMiAxIDM0MDAwMAorMzIgMSAzNjAwMDAKKzMyIDEgMzgwMDAwCiszMiAxIDQwMDAwMAorMzIgMSA0MjAwMDAKKzMyIDEgNDQwMDAwCiszMiAxIDQ2MDAwMAorMzIgMSA0ODAwMDAKKzMyIDEgNTAwMDAwCiszMiAxIDUyMDAwMAorMzIgMSA1NDAwMDAKKzMyIDEgNTYwMDAwCiszMiAxIDU4MDAwMAorMzIgMSA2MDAwMDAKKzMyIDEgNjIwMDAwCiszMiAxIDY0MDAwMAorMzIgMSA2NjAwMDAKKzMyIDEgNjgwMDAwCiszMiAxIDcwMDAwMAorMzIgMSA3MjAwMDAKKzMyIDEgNzQwMDAwCiszMiAxIDc2MDAwMAorMzIgMSA3ODAwMDAKKzMyIDEgODAwMDAwCiszMiAxIDgyMDAwMAorMzIgMSA4NDAwMDAKKzMyIDEgODYwMDAwCiszMiAxIDg4MDAwMAorMzIgMSA5MDAwMDAKKzMyIDEgOTIwMDAwCiszMiAxIDk0MDAwMAorMzIgMSA5NjAwMDAKKzMyIDEgOTgwMDAwCiszMiAxIDEwMDAwMDAKKzMyIDEgMTAyMDAwMAorMzIgMSAxMDQwMDAwCiszMiAxIDEwNjAwMDAKKzMyIDEgMTA4MDAwMAorMzIgMSAxMTAwMDAwCiszMiAxIDExMjAwMDAKKzMyIDEgMTE0MDAwMAorMzIgMSAxMTYwMDAwCiszMiAxIDExODAwMDAKKzMyIDEgMTIwMDAwMAorMzIgMSAxMjIwMDAwCiszMiAxIDEyNDAwMDAKKzMyIDEgMTI2MDAwMAorMzIgMSAxMjgwMDAwCiszMiAxIDEzMDAwMDAKKzMyIDEgMTMyMDAwMAorMzIgMSAxMzQwMDAwCiszMiAxIDEzNjAwMDAKKzMyIDEgMTM4MDAwMAorMzIgMSAxNDAwMDAwCiszMiAxIDE0MjAwMDAKKzMyIDEgMTQ0MDAwMAorMzIgMSAxNDYwMDAwCiszMiAxIDE0ODAwMDAKKzMyIDEgMTUwMDAwMAorMzIgMSAxNTIwMDAwCiszMiAxIDE1NDAwMDAKKzMyIDEgMTU2MDAwMAorMzIgMSAxNTgwMDAwCiszMiAxIDE2MDAwMDAKKzMyIDEgMTYyMDAwMAorMzIgMSAxNjQwMDAwCiszMiAxIDE2NjAwMDAKKzMyIDEgMTY4MDAwMAorMzIgMSAxNzAwMDAwCiszMiAxIDE3MjAwMDAKKzMyIDEgMTc0MDAwMAorMzIgMSAxNzYwMDAwCiszMiAxIDE3ODAwMDAKKzMyIDEgMTgwMDAwMAorMzIgMSAxODIwMDAwCiszMiAxIDE4NDAwMDAKKzMyIDEgMTg2MDAwMAorMzIgMSAxODgwMDAwCiszMiAxIDE5MDAwMDAKKzMyIDEgMTkyMDAwMAorMzIgMSAxOTQwMDAwCiszMiAxIDE5NjAwMDAKKzMyIDEgMTk4MDAwMAorMzIgMSAyMDAwMDAwCiszMiAxIDIwMjAwMDAKKzMyIDEgMjA0MDAwMAorMzIgMSAyMDYwMDAwCiszMiAxIDIwODAwMDAKKzMyIDEgMjEwMDAwMAorMzIgMSAyMTIwMDAwCiszMiAxIDIxNDAwMDAKKzMyIDEgMjE2MDAwMAorMzIgMSAyMTgwMDAwCiszMiAxIDIyMDAwMDAKKzMyIDEgMjIyMDAwMAorMzIgMSAyMjQwMDAwCiszMiAxIDIyNjAwMDAKKzMyIDEgMjI4MDAwMAorMzIgMSAyMzAwMDAwCiszMiAxIDIzMjAwMDAKKzMyIDEgMjM0MDAwMAorMzIgMSAyMzYwMDAwCiszMiAxIDIzODAwMDAKKzMyIDEgMjQwMDAwMAorMzIgMSAyNDIwMDAwCiszMiAxIDI0NDAwMDAKKzMyIDEgMjQ2MDAwMAorMzIgMSAyNDgwMDAwCiszMiAxIDI1MDAwMDAKKzMyIDEgMjUyMDAwMAorMzIgMSAyNTQwMDAwCiszMiAxIDI1NjAwMDAKKzMyIDEgMjU4MDAwMAorMzIgMSAyNjAwMDAwCiszMiAxIDI2MjAwMDAKKzMyIDEgMjY0MDAwMAorMzIgMSAyNjYwMDAwCiszMiAxIDI2ODAwMDAKKzMyIDEgMjcwMDAwMAorMzIgMSAyNzIwMDAwCiszMiAxIDI3NDAwMDAKKzMyIDEgMjc2MDAwMAorMzIgMSAyNzgwMDAwCiszMiAxIDI4MDAwMDAKKzMyIDEgMjgyMDAwMAorMzIgMSAyODQwMDAwCiszMiAxIDI4NjAwMDAKKzMyIDEgMjg4MDAwMAorMzIgMSAyOTAwMDAwCiszMiAxIDI5MjAwMDAKKzMyIDEgMjk0MDAwMAorMzIgMSAyOTYwMDAwCiszMiAxIDI5ODAwMDAKKzMyIDEgMzAwMDAwMAorMzIgMSAzMDIwMDAwCiszMiAxIDMwNDAwMDAKKzMyIDEgMzA2MDAwMAorMzIgMSAzMDgwMDAwCiszMiAxIDMxMDAwMDAKKzMyIDEgMzEyMDAwMAorMzIgMSAzMTQwMDAwCiszMiAxIDMxNjAwMDAKKzMyIDEgMzE4MDAwMAorMzIgMSAzMjAwMDAwCiszMiAxIDMyMjAwMDAKKzMyIDEgMzI0MDAwMAorMzIgMSAzMjYwMDAwCiszMiAxIDMyODAwMDAKKzMyIDEgMzMwMDAwMAorMzIgMSAzMzIwMDAwCiszMiAxIDMzNDAwMDAKKzMyIDEgMzM2MDAwMAorMzIgMSAzMzgwMDAwCiszMiAxIDM0MDAwMDAKKzMyIDEgMzQyMDAwMAorMzIgMSAzNDQwMDAwCiszMiAxIDM0NjAwMDAKKzMyIDEgMzQ4MDAwMAorMzIgMSAzNTAwMDAwCiszMiAxIDM1MjAwMDAKKzMyIDEgMzU0MDAwMAorMzIgMSAzNTYwMDAwCiszMiAxIDM1ODAwMDAKKzMyIDEgMzYwMDAwMAorMzIgMSAzNjIwMDAwCiszMiAxIDM2NDAwMDAKKzMyIDEgMzY2MDAwMAorMzIgMSAzNjgwMDAwCiszMiAxIDM3MDAwMDAKKzMyIDEgMzcyMDAwMAorMzIgMSAzNzQwMDAwCiszMiAxIDM3NjAwMDAKKzMyIDEgMzc4MDAwMAorMzIgMSAzODAwMDAwCiszMiAxIDM4MjAwMDAKKzMyIDEgMzg0MDAwMAorMzIgMSAzODYwMDAwCiszMiAxIDM4ODAwMDAKKzMyIDEgMzkwMDAwMAorMzIgMSAzOTIwMDAwCiszMiAxIDM5NDAwMDAKKzMyIDEgMzk2MDAwMAorMzIgMSAzOTgwMDAwCiszMiAxIDQwMDAwMDAKKzMyIDEgNDAyMDAwMAorMzIgMSA0MDQwMDAwCiszMiAxIDQwNjAwMDAKKzMyIDEgNDA4MDAwMAorMzIgMSA0MTAwMDAwCiszMiAxIDQxMjAwMDAKKzMyIDEgNDE0MDAwMAorMzIgMSA0MTYwMDAwCiszMiAxIDQxODAwMDAKKzMyIDEgNDIwMDAwMAorMzIgMSA0MjIwMDAwCiszMiAxIDQyNDAwMDAKKzMyIDEgNDI2MDAwMAorMzIgMSA0MjgwMDAwCiszMiAxIDQzMDAwMDAKKzMyIDEgNDMyMDAwMAorMzIgMSA0MzQwMDAwCiszMiAxIDQzNjAwMDAKKzMyIDEgNDM4MDAwMAorMzIgMSA0NDAwMDAwCiszMiAxIDQ0MjAwMDAKKzMyIDEgNDQ0MDAwMAorMzIgMSA0NDYwMDAwCiszMiAxIDQ0ODAwMDAKKzMyIDEgNDUwMDAwMAorMzIgMSA0NTIwMDAwCiszMiAxIDQ1NDAwMDAKKzMyIDEgNDU2MDAwMAorMzIgMSA0NTgwMDAwCiszMiAxIDQ2MDAwMDAKKzMyIDEgNDYyMDAwMAorMzIgMSA0NjQwMDAwCiszMiAxIDQ2NjAwMDAKKzMyIDEgNDY4MDAwMAorMzIgMSA0NzAwMDAwCiszMiAxIDQ3MjAwMDAKKzMyIDEgNDc0MDAwMAorMzIgMSA0NzYwMDAwCiszMiAxIDQ3ODAwMDAKKzMyIDEgNDgwMDAwMAorMzIgMSA0ODIwMDAwCiszMiAxIDQ4NDAwMDAKKzMyIDEgNDg2MDAwMAorMzIgMSA0ODgwMDAwCiszMiAxIDQ5MDAwMDAKKzMyIDEgNDkyMDAwMAorMzIgMSA0OTQwMDAwCiszMiAxIDQ5NjAwMDAKKzMyIDEgNDk4MDAwMAorMzIgMSA1MDAwMDAwCiszMiAxIDUwMjAwMDAKKzMyIDEgNTA0MDAwMAorMzIgMSA1MDYwMDAwCiszMiAxIDUwODAwMDAKKzMyIDEgNTEwMDAwMAorMzIgMSA1MTIwMDAwCiszMiAxIDUxNDAwMDAKKzMyIDEgNTE2MDAwMAorMzIgMSA1MTgwMDAwCiszMiAxIDUyMDAwMDAKKzMyIDEgNTIyMDAwMAorMzIgMSA1MjQwMDAwCiszMiAxIDUyNjAwMDAKKzMyIDEgNTI4MDAwMAorMzIgMSA1MzAwMDAwCiszMiAxIDUzMjAwMDAKKzMyIDEgNTM0MDAwMAorMzIgMSA1MzYwMDAwCiszMiAxIDUzODAwMDAKKzMyIDEgNTQwMDAwMAorMzIgMSA1NDIwMDAwCiszMiAxIDU0NDAwMDAKKzMyIDEgNTQ2MDAwMAorMzIgMSA1NDgwMDAwCiszMiAxIDU1MDAwMDAKKzMyIDEgNTUyMDAwMAorMzIgMSA1NTQwMDAwCiszMiAxIDU1NjAwMDAKKzMyIDEgNTU4MDAwMAorMzIgMSA1NjAwMDAwCiszMiAxIDU2MjAwMDAKKzMyIDEgNTY0MDAwMAorMzIgMSA1NjYwMDAwCiszMiAxIDU2ODAwMDAKKzMyIDEgNTcwMDAwMAorMzIgMSA1NzIwMDAwCiszMiAxIDU3NDAwMDAKKzMyIDEgNTc2MDAwMAorMzIgMSA1NzgwMDAwCiszMiAxIDU4MDAwMDAKKzMyIDEgNTgyMDAwMAorMzIgMSA1ODQwMDAwCiszMiAxIDU4NjAwMDAKKzMyIDEgNTg4MDAwMAorMzIgMSA1OTAwMDAwCiszMiAxIDU5MjAwMDAKKzMyIDEgNTk0MDAwMAorMzIgMSA1OTYwMDAwCiszMiAxIDU5ODAwMDAKKzMyIDEgNjAwMDAwMAorMzIgMSA2MDIwMDAwCiszMiAxIDYwNDAwMDAKKzMyIDEgNjA2MDAwMAorMzIgMSA2MDgwMDAwCiszMiAxIDYxMDAwMDAKKzMyIDEgNjEyMDAwMAorMzIgMSA2MTQwMDAwCiszMiAxIDYxNjAwMDAKKzMyIDEgNjE4MDAwMAorMzIgMSA2MjAwMDAwCiszMiAxIDYyMjAwMDAKKzMyIDEgNjI0MDAwMAorMzIgMSA2MjYwMDAwCiszMiAxIDYyODAwMDAKKzMyIDEgNjMwMDAwMAorMzIgMSA2MzIwMDAwCiszMiAxIDYzNDAwMDAKKzMyIDEgNjM2MDAwMAorMzIgMSA2MzgwMDAwCiszMiAxIDY0MDAwMDAKKzMyIDEgNjQyMDAwMAorMzIgMSA2NDQwMDAwCiszMiAxIDY0NjAwMDAKKzMyIDEgNjQ4MDAwMAorMzIgMSA2NTAwMDAwCiszMiAxIDY1MjAwMDAKKzMyIDEgNjU0MDAwMAorMzIgMSA2NTYwMDAwCiszMiAxIDY1ODAwMDAKKzMyIDEgNjYwMDAwMAorMzIgMSA2NjIwMDAwCiszMiAxIDY2NDAwMDAKKzMyIDEgNjY2MDAwMAorMzIgMSA2NjgwMDAwCiszMiAxIDY3MDAwMDAKKzMyIDEgNjcyMDAwMAorMzIgMSA2NzQwMDAwCiszMiAxIDY3NjAwMDAKKzMyIDEgNjc4MDAwMAorMzIgMSA2ODAwMDAwCiszMiAxIDY4MjAwMDAKKzMyIDEgNjg0MDAwMAorMzIgMSA2ODYwMDAwCiszMiAxIDY4ODAwMDAKKzMyIDEgNjkwMDAwMAorMzIgMSA2OTIwMDAwCiszMiAxIDY5NDAwMDAKKzMyIDEgNjk2MDAwMAorMzIgMSA2OTgwMDAwCiszMiAxIDcwMDAwMDAKKzMyIDEgNzAyMDAwMAorMzIgMSA3MDQwMDAwCiszMiAxIDcwNjAwMDAKKzMyIDEgNzA4MDAwMAorMzIgMSA3MTAwMDAwCiszMiAxIDcxMjAwMDAKKzMyIDEgNzE0MDAwMAorMzIgMSA3MTYwMDAwCiszMiAxIDcxODAwMDAKKzMyIDEgNzIwMDAwMAorMzIgMSA3MjIwMDAwCiszMiAxIDcyNDAwMDAKKzMyIDEgNzI2MDAwMAorMzIgMSA3MjgwMDAwCiszMiAxIDczMDAwMDAKKzMyIDEgNzMyMDAwMAorMzIgMSA3MzQwMDAwCiszMiAxIDczNjAwMDAKKzMyIDEgNzM4MDAwMAorMzIgMSA3NDAwMDAwCiszMiAxIDc0MjAwMDAKKzMyIDEgNzQ0MDAwMAorMzIgMSA3NDYwMDAwCiszMiAxIDc0ODAwMDAKKzMyIDEgNzUwMDAwMAorMzIgMSA3NTIwMDAwCiszMiAxIDc1NDAwMDAKKzMyIDEgNzU2MDAwMAorMzIgMSA3NTgwMDAwCiszMiAxIDc2MDAwMDAKKzMyIDEgNzYyMDAwMAorMzIgMSA3NjQwMDAwCiszMiAxIDc2NjAwMDAKKzMyIDEgNzY4MDAwMAorMzIgMSA3NzAwMDAwCiszMiAxIDc3MjAwMDAKKzMyIDEgNzc0MDAwMAorMzIgMSA3NzYwMDAwCiszMiAxIDc3ODAwMDAKKzMyIDEgNzgwMDAwMAorMzIgMSA3ODIwMDAwCiszMiAxIDc4NDAwMDAKKzMyIDEgNzg2MDAwMAorMzIgMSA3ODgwMDAwCiszMiAxIDc5MDAwMDAKKzMyIDEgNzkyMDAwMAorMzIgMSA3OTQwMDAwCiszMiAxIDc5NjAwMDAKKzMyIDEgNzk4MDAwMAorMzIgMSA4MDAwMDAwCiszMiAxIDgwMjAwMDAKKzMyIDEgODA0MDAwMAorMzIgMSA4MDYwMDAwCiszMiAxIDgwODAwMDAKKzMyIDEgODEwMDAwMAorMzIgMSA4MTIwMDAwCiszMiAxIDgxNDAwMDAKKzMyIDEgODE2MDAwMAorMzIgMSA4MTgwMDAwCiszMiAxIDgyMDAwMDAKKzMyIDEgODIyMDAwMAorMzIgMSA4MjQwMDAwCiszMiAxIDgyNjAwMDAKKzMyIDEgODI4MDAwMAorMzIgMSA4MzAwMDAwCiszMiAxIDgzMjAwMDAKKzMyIDEgODM0MDAwMAorMzIgMSA4MzYwMDAwCiszMiAxIDgzODAwMDAKKzMyIDEgODQwMDAwMAorMzIgMSA4NDIwMDAwCiszMiAxIDg0NDAwMDAKKzMyIDEgODQ2MDAwMAorMzIgMSA4NDgwMDAwCiszMiAxIDg1MDAwMDAKKzMyIDEgODUyMDAwMAorMzIgMSA4NTQwMDAwCiszMiAxIDg1NjAwMDAKKzMyIDEgODU4MDAwMAorMzIgMSA4NjAwMDAwCiszMiAxIDg2MjAwMDAKKzMyIDEgODY0MDAwMAorMzIgMSA4NjYwMDAwCiszMiAxIDg2ODAwMDAKKzMyIDEgODcwMDAwMAorMzIgMSA4NzIwMDAwCiszMiAxIDg3NDAwMDAKKzMyIDEgODc2MDAwMAorMzIgMSA4NzgwMDAwCiszMiAxIDg4MDAwMDAKKzMyIDEgODgyMDAwMAorMzIgMSA4ODQwMDAwCiszMiAxIDg4NjAwMDAKKzMyIDEgODg4MDAwMAorMzIgMSA4OTAwMDAwCiszMiAxIDg5MjAwMDAKKzMyIDEgODk0MDAwMAorMzIgMSA4OTYwMDAwCiszMiAxIDg5ODAwMDAKKzMyIDEgOTAwMDAwMAorMzIgMSA5MDIwMDAwCiszMiAxIDkwNDAwMDAKKzMyIDEgOTA2MDAwMAorMzIgMSA5MDgwMDAwCiszMiAxIDkxMDAwMDAKKzMyIDEgOTEyMDAwMAorMzIgMSA5MTQwMDAwCiszMiAxIDkxNjAwMDAKKzMyIDEgOTE4MDAwMAorMzIgMSA5MjAwMDAwCiszMiAxIDkyMjAwMDAKKzMyIDEgOTI0MDAwMAorMzIgMSA5MjYwMDAwCiszMiAxIDkyODAwMDAKKzMyIDEgOTMwMDAwMAorMzIgMSA5MzIwMDAwCiszMiAxIDkzNDAwMDAKKzMyIDEgOTM2MDAwMAorMzIgMSA5MzgwMDAwCiszMiAxIDk0MDAwMDAKKzMyIDEgOTQyMDAwMAorMzIgMSA5NDQwMDAwCiszMiAxIDk0NjAwMDAKKzMyIDEgOTQ4MDAwMAorMzIgMSA5NTAwMDAwCiszMiAxIDk1MjAwMDAKKzMyIDEgOTU0MDAwMAorMzIgMSA5NTYwMDAwCiszMiAxIDk1ODAwMDAKKzMyIDEgOTYwMDAwMAorMzIgMSA5NjIwMDAwCiszMiAxIDk2NDAwMDAKKzMyIDEgOTY2MDAwMAorMzIgMSA5NjgwMDAwCiszMiAxIDk3MDAwMDAKKzMyIDEgOTcyMDAwMAorMzIgMSA5NzQwMDAwCiszMiAxIDk3NjAwMDAKKzMyIDEgOTc4MDAwMAorMzIgMSA5ODAwMDAwCiszMiAxIDk4MjAwMDAKKzMyIDEgOTg0MDAwMAorMzIgMSA5ODYwMDAwCiszMiAxIDk4ODAwMDAKKzMyIDEgOTkwMDAwMAorMzIgMSA5OTIwMDAwCiszMiAxIDk5NDAwMDAKKzMyIDEgOTk2MDAwMAorMzIgMSA5OTgwMDAwCiszMiAxIDEwMDAwMDAwCiszMiAxIDEwMDIwMDAwCiszMiAxIDEwMDQwMDAwCiszMiAxIDEwMDYwMDAwCiszMiAxIDEwMDgwMDAwCiszMiAxIDEwMTAwMDAwCiszMiAxIDEwMTIwMDAwCiszMiAxIDEwMTQwMDAwCiszMiAxIDEwMTYwMDAwCiszMiAxIDEwMTgwMDAwCiszMiAxIDEwMjAwMDAwCiszMiAxIDEwMjIwMDAwCiszMiAxIDEwMjQwMDAwCiszMiAxIDEwMjYwMDAwCiszMiAxIDEwMjgwMDAwCiszMiAxIDEwMzAwMDAwCiszMiAxIDEwMzIwMDAwCiszMiAxIDEwMzQwMDAwCiszMiAxIDEwMzYwMDAwCiszMiAxIDEwMzgwMDAwCiszMiAxIDEwNDAwMDAwCiszMiAxIDEwNDIwMDAwCiszMiAxIDEwNDQwMDAwCiszMiAxIDEwNDYwMDAwCiszMiAxIDEwNDgwMDAwCiszMiAxIDEwNTAwMDAwCiszMiAxIDEwNTIwMDAwCiszMiAxIDEwNTQwMDAwCiszMiAxIDEwNTYwMDAwCiszMiAxIDEwNTgwMDAwCiszMiAxIDEwNjAwMDAwCiszMiAxIDEwNjIwMDAwCiszMiAxIDEwNjQwMDAwCiszMiAxIDEwNjYwMDAwCiszMiAxIDEwNjgwMDAwCiszMiAxIDEwNzAwMDAwCiszMiAxIDEwNzIwMDAwCiszMiAxIDEwNzQwMDAwCiszMiAxIDEwNzYwMDAwCiszMiAxIDEwNzgwMDAwCiszMiAxIDEwODAwMDAwCiszMiAxIDEwODIwMDAwCiszMiAxIDEwODQwMDAwCiszMiAxIDEwODYwMDAwCiszMiAxIDEwODgwMDAwCiszMiAxIDEwOTAwMDAwCiszMiAxIDEwOTIwMDAwCiszMiAxIDEwOTQwMDAwCiszMiAxIDEwOTYwMDAwCiszMiAxIDEwOTgwMDAwCiszMiAxIDExMDAwMDAwCiszMiAxIDExMDIwMDAwCiszMiAxIDExMDQwMDAwCiszMiAxIDExMDYwMDAwCiszMiAxIDExMDgwMDAwCiszMiAxIDExMTAwMDAwCiszMiAxIDExMTIwMDAwCiszMiAxIDExMTQwMDAwCiszMiAxIDExMTYwMDAwCiszMiAxIDExMTgwMDAwCiszMiAxIDExMjAwMDAwCiszMiAxIDExMjIwMDAwCiszMiAxIDExMjQwMDAwCiszMiAxIDExMjYwMDAwCiszMiAxIDExMjgwMDAwCiszMiAxIDExMzAwMDAwCiszMiAxIDExMzIwMDAwCiszMiAxIDExMzQwMDAwCiszMiAxIDExMzYwMDAwCiszMiAxIDExMzgwMDAwCiszMiAxIDExNDAwMDAwCiszMiAxIDExNDIwMDAwCiszMiAxIDExNDQwMDAwCiszMiAxIDExNDYwMDAwCiszMiAxIDExNDgwMDAwCiszMiAxIDExNTAwMDAwCiszMiAxIDExNTIwMDAwCiszMiAxIDExNTQwMDAwCiszMiAxIDExNTYwMDAwCiszMiAxIDExNTgwMDAwCiszMiAxIDExNjAwMDAwCiszMiAxIDExNjIwMDAwCiszMiAxIDExNjQwMDAwCiszMiAxIDExNjYwMDAwCiszMiAxIDExNjgwMDAwCiszMiAxIDExNzAwMDAwCiszMiAxIDExNzIwMDAwCiszMiAxIDExNzQwMDAwCiszMiAxIDExNzYwMDAwCiszMiAxIDExNzgwMDAwCiszMiAxIDExODAwMDAwCiszMiAxIDExODIwMDAwCiszMiAxIDExODQwMDAwCiszMiAxIDExODYwMDAwCiszMiAxIDExODgwMDAwCiszMiAxIDExOTAwMDAwCiszMiAxIDExOTIwMDAwCiszMiAxIDExOTQwMDAwCiszMiAxIDExOTYwMDAwCiszMiAxIDExOTgwMDAwCiszMiAxIDEyMDAwMDAwCiszMiAxIDEyMDIwMDAwCiszMiAxIDEyMDQwMDAwCiszMiAxIDEyMDYwMDAwCiszMiAxIDEyMDgwMDAwCiszMiAxIDEyMTAwMDAwCiszMiAxIDEyMTIwMDAwCiszMiAxIDEyMTQwMDAwCiszMiAxIDEyMTYwMDAwCiszMiAxIDEyMTgwMDAwCiszMiAxIDEyMjAwMDAwCiszMiAxIDEyMjIwMDAwCiszMiAxIDEyMjQwMDAwCiszMiAxIDEyMjYwMDAwCiszMiAxIDEyMjgwMDAwCiszMiAxIDEyMzAwMDAwCiszMiAxIDEyMzIwMDAwCiszMiAxIDEyMzQwMDAwCiszMiAxIDEyMzYwMDAwCiszMiAxIDEyMzgwMDAwCiszMiAxIDEyNDAwMDAwCiszMiAxIDEyNDIwMDAwCiszMiAxIDEyNDQwMDAwCiszMiAxIDEyNDYwMDAwCiszMiAxIDEyNDgwMDAwCiszMiAxIDEyNTAwMDAwCiszMiAxIDEyNTIwMDAwCiszMiAxIDEyNTQwMDAwCiszMiAxIDEyNTYwMDAwCiszMiAxIDEyNTgwMDAwCiszMiAxIDEyNjAwMDAwCiszMiAxIDEyNjIwMDAwCiszMiAxIDEyNjQwMDAwCiszMiAxIDEyNjYwMDAwCiszMiAxIDEyNjgwMDAwCiszMiAxIDEyNzAwMDAwCiszMiAxIDEyNzIwMDAwCiszMiAxIDEyNzQwMDAwCiszMiAxIDEyNzYwMDAwCiszMiAxIDEyNzgwMDAwCiszMiAxIDEyODAwMDAwCiszMiAxIDEyODIwMDAwCiszMiAxIDEyODQwMDAwCiszMiAxIDEyODYwMDAwCiszMiAxIDEyODgwMDAwCiszMiAxIDEyOTAwMDAwCiszMiAxIDEyOTIwMDAwCiszMiAxIDEyOTQwMDAwCiszMiAxIDEyOTYwMDAwCiszMiAxIDEyOTgwMDAwCiszMiAxIDEzMDAwMDAwCiszMiAxIDEzMDIwMDAwCiszMiAxIDEzMDQwMDAwCiszMiAxIDEzMDYwMDAwCiszMiAxIDEzMDgwMDAwCiszMiAxIDEzMTAwMDAwCiszMiAxIDEzMTIwMDAwCiszMiAxIDEzMTQwMDAwCiszMiAxIDEzMTYwMDAwCiszMiAxIDEzMTgwMDAwCiszMiAxIDEzMjAwMDAwCiszMiAxIDEzMjIwMDAwCiszMiAxIDEzMjQwMDAwCiszMiAxIDEzMjYwMDAwCiszMiAxIDEzMjgwMDAwCiszMiAxIDEzMzAwMDAwCiszMiAxIDEzMzIwMDAwCiszMiAxIDEzMzQwMDAwCiszMiAxIDEzMzYwMDAwCiszMiAxIDEzMzgwMDAwCiszMiAxIDEzNDAwMDAwCiszMiAxIDEzNDIwMDAwCiszMiAxIDEzNDQwMDAwCiszMiAxIDEzNDYwMDAwCiszMiAxIDEzNDgwMDAwCiszMiAxIDEzNTAwMDAwCiszMiAxIDEzNTIwMDAwCiszMiAxIDEzNTQwMDAwCiszMiAxIDEzNTYwMDAwCiszMiAxIDEzNTgwMDAwCiszMiAxIDEzNjAwMDAwCiszMiAxIDEzNjIwMDAwCiszMiAxIDEzNjQwMDAwCiszMiAxIDEzNjYwMDAwCiszMiAxIDEzNjgwMDAwCiszMiAxIDEzNzAwMDAwCiszMiAxIDEzNzIwMDAwCiszMiAxIDEzNzQwMDAwCiszMiAxIDEzNzYwMDAwCiszMiAxIDEzNzgwMDAwCiszMiAxIDEzODAwMDAwCiszMiAxIDEzODIwMDAwCiszMiAxIDEzODQwMDAwCiszMiAxIDEzODYwMDAwCiszMiAxIDEzODgwMDAwCiszMiAxIDEzOTAwMDAwCiszMiAxIDEzOTIwMDAwCiszMiAxIDEzOTQwMDAwCiszMiAxIDEzOTYwMDAwCiszMiAxIDEzOTgwMDAwCiszMiAxIDE0MDAwMDAwCiszMiAxIDE0MDIwMDAwCiszMiAxIDE0MDQwMDAwCiszMiAxIDE0MDYwMDAwCiszMiAxIDE0MDgwMDAwCiszMiAxIDE0MTAwMDAwCiszMiAxIDE0MTIwMDAwCiszMiAxIDE0MTQwMDAwCiszMiAxIDE0MTYwMDAwCiszMiAxIDE0MTgwMDAwCiszMiAxIDE0MjAwMDAwCiszMiAxIDE0MjIwMDAwCiszMiAxIDE0MjQwMDAwCiszMiAxIDE0MjYwMDAwCiszMiAxIDE0MjgwMDAwCiszMiAxIDE0MzAwMDAwCiszMiAxIDE0MzIwMDAwCiszMiAxIDE0MzQwMDAwCiszMiAxIDE0MzYwMDAwCiszMiAxIDE0MzgwMDAwCiszMiAxIDE0NDAwMDAwCiszMiAxIDE0NDIwMDAwCiszMiAxIDE0NDQwMDAwCiszMiAxIDE0NDYwMDAwCiszMiAxIDE0NDgwMDAwCiszMiAxIDE0NTAwMDAwCiszMiAxIDE0NTIwMDAwCiszMiAxIDE0NTQwMDAwCiszMiAxIDE0NTYwMDAwCiszMiAxIDE0NTgwMDAwCiszMiAxIDE0NjAwMDAwCiszMiAxIDE0NjIwMDAwCiszMiAxIDE0NjQwMDAwCiszMiAxIDE0NjYwMDAwCiszMiAxIDE0NjgwMDAwCiszMiAxIDE0NzAwMDAwCiszMiAxIDE0NzIwMDAwCiszMiAxIDE0NzQwMDAwCiszMiAxIDE0NzYwMDAwCiszMiAxIDE0NzgwMDAwCiszMiAxIDE0ODAwMDAwCiszMiAxIDE0ODIwMDAwCiszMiAxIDE0ODQwMDAwCiszMiAxIDE0ODYwMDAwCiszMiAxIDE0ODgwMDAwCiszMiAxIDE0OTAwMDAwCiszMiAxIDE0OTIwMDAwCiszMiAxIDE0OTQwMDAwCiszMiAxIDE0OTYwMDAwCiszMiAxIDE0OTgwMDAwCiszMiAxIDE1MDAwMDAwCiszMiAxIDE1MDIwMDAwCiszMiAxIDE1MDQwMDAwCiszMiAxIDE1MDYwMDAwCiszMiAxIDE1MDgwMDAwCiszMiAxIDE1MTAwMDAwCiszMiAxIDE1MTIwMDAwCiszMiAxIDE1MTQwMDAwCiszMiAxIDE1MTYwMDAwCiszMiAxIDE1MTgwMDAwCiszMiAxIDE1MjAwMDAwCiszMiAxIDE1MjIwMDAwCiszMiAxIDE1MjQwMDAwCiszMiAxIDE1MjYwMDAwCiszMiAxIDE1MjgwMDAwCiszMiAxIDE1MzAwMDAwCiszMiAxIDE1MzIwMDAwCiszMiAxIDE1MzQwMDAwCiszMiAxIDE1MzYwMDAwCiszMiAxIDE1MzgwMDAwCiszMiAxIDE1NDAwMDAwCiszMiAxIDE1NDIwMDAwCiszMiAxIDE1NDQwMDAwCiszMiAxIDE1NDYwMDAwCiszMiAxIDE1NDgwMDAwCiszMiAxIDE1NTAwMDAwCiszMiAxIDE1NTIwMDAwCiszMiAxIDE1NTQwMDAwCiszMiAxIDE1NTYwMDAwCiszMiAxIDE1NTgwMDAwCiszMiAxIDE1NjAwMDAwCiszMiAxIDE1NjIwMDAwCiszMiAxIDE1NjQwMDAwCiszMiAxIDE1NjYwMDAwCiszMiAxIDE1NjgwMDAwCiszMiAxIDE1NzAwMDAwCiszMiAxIDE1NzIwMDAwCiszMiAxIDE1NzQwMDAwCiszMiAxIDE1NzYwMDAwCiszMiAxIDE1NzgwMDAwCiszMiAxIDE1ODAwMDAwCiszMiAxIDE1ODIwMDAwCiszMiAxIDE1ODQwMDAwCiszMiAxIDE1ODYwMDAwCiszMiAxIDE1ODgwMDAwCiszMiAxIDE1OTAwMDAwCiszMiAxIDE1OTIwMDAwCiszMiAxIDE1OTQwMDAwCiszMiAxIDE1OTYwMDAwCiszMiAxIDE1OTgwMDAwCiszMiAxIDE2MDAwMDAwCiszMiAxIDE2MDIwMDAwCiszMiAxIDE2MDQwMDAwCiszMiAxIDE2MDYwMDAwCiszMiAxIDE2MDgwMDAwCiszMiAxIDE2MTAwMDAwCiszMiAxIDE2MTIwMDAwCiszMiAxIDE2MTQwMDAwCiszMiAxIDE2MTYwMDAwCiszMiAxIDE2MTgwMDAwCiszMiAxIDE2MjAwMDAwCiszMiAxIDE2MjIwMDAwCiszMiAxIDE2MjQwMDAwCiszMiAxIDE2MjYwMDAwCiszMiAxIDE2MjgwMDAwCiszMiAxIDE2MzAwMDAwCiszMiAxIDE2MzIwMDAwCiszMiAxIDE2MzQwMDAwCiszMiAxIDE2MzYwMDAwCiszMiAxIDE2MzgwMDAwCiszMiAxIDE2NDAwMDAwCiszMiAxIDE2NDIwMDAwCiszMiAxIDE2NDQwMDAwCiszMiAxIDE2NDYwMDAwCiszMiAxIDE2NDgwMDAwCiszMiAxIDE2NTAwMDAwCiszMiAxIDE2NTIwMDAwCiszMiAxIDE2NTQwMDAwCiszMiAxIDE2NTYwMDAwCiszMiAxIDE2NTgwMDAwCiszMiAxIDE2NjAwMDAwCiszMiAxIDE2NjIwMDAwCiszMiAxIDE2NjQwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoel9tdWx0aV9mcmFtZS5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNzZlYWY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6X211bHRpX2ZyYW1lLmluZm8KQEAgLTAsMCArMSw4MDcgQEAKKzMyIDEgMAorMzIgMSAyMDAwMAorNjQgMSA0MDAwMAorNjQgMSA4MDAwMAorNjQgMSAxMjAwMDAKKzk2IDEgMTYwMDAwCis5NiAxIDIyMDAwMAorOTYgMSAyODAwMDAKKzk2IDEgMzQwMDAwCisxMjggMSA0MDAwMDAKKzEyOCAxIDQ4MDAwMAorMTI4IDEgNTYwMDAwCisxMjggMSA2NDAwMDAKKzEyOCAxIDcyMDAwMAorMzIgMSA4MDAwMDAKKzMyIDEgODIwMDAwCiszMiAxIDg0MDAwMAorMzIgMSA4NjAwMDAKKzMyIDEgODgwMDAwCiszMiAxIDkwMDAwMAorMzIgMSA5MjAwMDAKKzMyIDEgOTQwMDAwCiszMiAxIDk2MDAwMAorMzIgMSA5ODAwMDAKKzMyIDEgMTAwMDAwMAorMzIgMSAxMDIwMDAwCiszMiAxIDEwNDAwMDAKKzMyIDEgMTA2MDAwMAorMzIgMSAxMDgwMDAwCiszMiAxIDExMDAwMDAKKzMyIDEgMTEyMDAwMAorMzIgMSAxMTQwMDAwCiszMiAxIDExNjAwMDAKKzMyIDEgMTE4MDAwMAorMzIgMSAxMjAwMDAwCiszMiAxIDEyMjAwMDAKKzMyIDEgMTI0MDAwMAorMzIgMSAxMjYwMDAwCiszMiAxIDEyODAwMDAKKzMyIDEgMTMwMDAwMAorMzIgMSAxMzIwMDAwCiszMiAxIDEzNDAwMDAKKzMyIDEgMTM2MDAwMAorMzIgMSAxMzgwMDAwCiszMiAxIDE0MDAwMDAKKzMyIDEgMTQyMDAwMAorMzIgMSAxNDQwMDAwCiszMiAxIDE0NjAwMDAKKzMyIDEgMTQ4MDAwMAorMzIgMSAxNTAwMDAwCiszMiAxIDE1MjAwMDAKKzMyIDEgMTU0MDAwMAorMzIgMSAxNTYwMDAwCiszMiAxIDE1ODAwMDAKKzMyIDEgMTYwMDAwMAorMzIgMSAxNjIwMDAwCiszMiAxIDE2NDAwMDAKKzMyIDEgMTY2MDAwMAorMzIgMSAxNjgwMDAwCiszMiAxIDE3MDAwMDAKKzMyIDEgMTcyMDAwMAorMzIgMSAxNzQwMDAwCiszMiAxIDE3NjAwMDAKKzMyIDEgMTc4MDAwMAorMzIgMSAxODAwMDAwCiszMiAxIDE4MjAwMDAKKzMyIDEgMTg0MDAwMAorMzIgMSAxODYwMDAwCiszMiAxIDE4ODAwMDAKKzMyIDEgMTkwMDAwMAorMzIgMSAxOTIwMDAwCiszMiAxIDE5NDAwMDAKKzMyIDEgMTk2MDAwMAorMzIgMSAxOTgwMDAwCiszMiAxIDIwMDAwMDAKKzMyIDEgMjAyMDAwMAorMzIgMSAyMDQwMDAwCiszMiAxIDIwNjAwMDAKKzMyIDEgMjA4MDAwMAorMzIgMSAyMTAwMDAwCiszMiAxIDIxMjAwMDAKKzMyIDEgMjE0MDAwMAorMzIgMSAyMTYwMDAwCiszMiAxIDIxODAwMDAKKzMyIDEgMjIwMDAwMAorMzIgMSAyMjIwMDAwCiszMiAxIDIyNDAwMDAKKzMyIDEgMjI2MDAwMAorMzIgMSAyMjgwMDAwCiszMiAxIDIzMDAwMDAKKzMyIDEgMjMyMDAwMAorMzIgMSAyMzQwMDAwCiszMiAxIDIzNjAwMDAKKzMyIDEgMjM4MDAwMAorMzIgMSAyNDAwMDAwCiszMiAxIDI0MjAwMDAKKzMyIDEgMjQ0MDAwMAorMzIgMSAyNDYwMDAwCiszMiAxIDI0ODAwMDAKKzMyIDEgMjUwMDAwMAorMzIgMSAyNTIwMDAwCiszMiAxIDI1NDAwMDAKKzMyIDEgMjU2MDAwMAorMzIgMSAyNTgwMDAwCiszMiAxIDI2MDAwMDAKKzMyIDEgMjYyMDAwMAorMzIgMSAyNjQwMDAwCiszMiAxIDI2NjAwMDAKKzMyIDEgMjY4MDAwMAorMzIgMSAyNzAwMDAwCiszMiAxIDI3MjAwMDAKKzMyIDEgMjc0MDAwMAorMzIgMSAyNzYwMDAwCiszMiAxIDI3ODAwMDAKKzMyIDEgMjgwMDAwMAorMzIgMSAyODIwMDAwCiszMiAxIDI4NDAwMDAKKzMyIDEgMjg2MDAwMAorMzIgMSAyODgwMDAwCiszMiAxIDI5MDAwMDAKKzMyIDEgMjkyMDAwMAorMzIgMSAyOTQwMDAwCiszMiAxIDI5NjAwMDAKKzMyIDEgMjk4MDAwMAorMzIgMSAzMDAwMDAwCiszMiAxIDMwMjAwMDAKKzMyIDEgMzA0MDAwMAorMzIgMSAzMDYwMDAwCiszMiAxIDMwODAwMDAKKzMyIDEgMzEwMDAwMAorMzIgMSAzMTIwMDAwCiszMiAxIDMxNDAwMDAKKzMyIDEgMzE2MDAwMAorMzIgMSAzMTgwMDAwCiszMiAxIDMyMDAwMDAKKzMyIDEgMzIyMDAwMAorMzIgMSAzMjQwMDAwCiszMiAxIDMyNjAwMDAKKzMyIDEgMzI4MDAwMAorMzIgMSAzMzAwMDAwCiszMiAxIDMzMjAwMDAKKzMyIDEgMzM0MDAwMAorMzIgMSAzMzYwMDAwCiszMiAxIDMzODAwMDAKKzMyIDEgMzQwMDAwMAorMzIgMSAzNDIwMDAwCiszMiAxIDM0NDAwMDAKKzMyIDEgMzQ2MDAwMAorMzIgMSAzNDgwMDAwCiszMiAxIDM1MDAwMDAKKzMyIDEgMzUyMDAwMAorMzIgMSAzNTQwMDAwCiszMiAxIDM1NjAwMDAKKzMyIDEgMzU4MDAwMAorMzIgMSAzNjAwMDAwCiszMiAxIDM2MjAwMDAKKzMyIDEgMzY0MDAwMAorMzIgMSAzNjYwMDAwCiszMiAxIDM2ODAwMDAKKzMyIDEgMzcwMDAwMAorMzIgMSAzNzIwMDAwCiszMiAxIDM3NDAwMDAKKzMyIDEgMzc2MDAwMAorMzIgMSAzNzgwMDAwCiszMiAxIDM4MDAwMDAKKzMyIDEgMzgyMDAwMAorMzIgMSAzODQwMDAwCiszMiAxIDM4NjAwMDAKKzMyIDEgMzg4MDAwMAorMzIgMSAzOTAwMDAwCiszMiAxIDM5MjAwMDAKKzMyIDEgMzk0MDAwMAorMzIgMSAzOTYwMDAwCiszMiAxIDM5ODAwMDAKKzMyIDEgNDAwMDAwMAorMzIgMSA0MDIwMDAwCiszMiAxIDQwNDAwMDAKKzMyIDEgNDA2MDAwMAorMzIgMSA0MDgwMDAwCiszMiAxIDQxMDAwMDAKKzMyIDEgNDEyMDAwMAorMzIgMSA0MTQwMDAwCiszMiAxIDQxNjAwMDAKKzMyIDEgNDE4MDAwMAorMzIgMSA0MjAwMDAwCiszMiAxIDQyMjAwMDAKKzMyIDEgNDI0MDAwMAorMzIgMSA0MjYwMDAwCiszMiAxIDQyODAwMDAKKzMyIDEgNDMwMDAwMAorMzIgMSA0MzIwMDAwCiszMiAxIDQzNDAwMDAKKzMyIDEgNDM2MDAwMAorMzIgMSA0MzgwMDAwCiszMiAxIDQ0MDAwMDAKKzMyIDEgNDQyMDAwMAorMzIgMSA0NDQwMDAwCiszMiAxIDQ0NjAwMDAKKzMyIDEgNDQ4MDAwMAorMzIgMSA0NTAwMDAwCiszMiAxIDQ1MjAwMDAKKzMyIDEgNDU0MDAwMAorMzIgMSA0NTYwMDAwCiszMiAxIDQ1ODAwMDAKKzMyIDEgNDYwMDAwMAorMzIgMSA0NjIwMDAwCiszMiAxIDQ2NDAwMDAKKzMyIDEgNDY2MDAwMAorMzIgMSA0NjgwMDAwCiszMiAxIDQ3MDAwMDAKKzMyIDEgNDcyMDAwMAorMzIgMSA0NzQwMDAwCiszMiAxIDQ3NjAwMDAKKzMyIDEgNDc4MDAwMAorMzIgMSA0ODAwMDAwCiszMiAxIDQ4MjAwMDAKKzMyIDEgNDg0MDAwMAorMzIgMSA0ODYwMDAwCiszMiAxIDQ4ODAwMDAKKzMyIDEgNDkwMDAwMAorMzIgMSA0OTIwMDAwCiszMiAxIDQ5NDAwMDAKKzMyIDEgNDk2MDAwMAorMzIgMSA0OTgwMDAwCiszMiAxIDUwMDAwMDAKKzMyIDEgNTAyMDAwMAorMzIgMSA1MDQwMDAwCiszMiAxIDUwNjAwMDAKKzMyIDEgNTA4MDAwMAorMzIgMSA1MTAwMDAwCiszMiAxIDUxMjAwMDAKKzMyIDEgNTE0MDAwMAorMzIgMSA1MTYwMDAwCiszMiAxIDUxODAwMDAKKzMyIDEgNTIwMDAwMAorMzIgMSA1MjIwMDAwCiszMiAxIDUyNDAwMDAKKzMyIDEgNTI2MDAwMAorMzIgMSA1MjgwMDAwCiszMiAxIDUzMDAwMDAKKzMyIDEgNTMyMDAwMAorMzIgMSA1MzQwMDAwCiszMiAxIDUzNjAwMDAKKzMyIDEgNTM4MDAwMAorMzIgMSA1NDAwMDAwCiszMiAxIDU0MjAwMDAKKzMyIDEgNTQ0MDAwMAorMzIgMSA1NDYwMDAwCiszMiAxIDU0ODAwMDAKKzMyIDEgNTUwMDAwMAorMzIgMSA1NTIwMDAwCiszMiAxIDU1NDAwMDAKKzMyIDEgNTU2MDAwMAorMzIgMSA1NTgwMDAwCiszMiAxIDU2MDAwMDAKKzMyIDEgNTYyMDAwMAorMzIgMSA1NjQwMDAwCiszMiAxIDU2NjAwMDAKKzMyIDEgNTY4MDAwMAorMzIgMSA1NzAwMDAwCiszMiAxIDU3MjAwMDAKKzMyIDEgNTc0MDAwMAorMzIgMSA1NzYwMDAwCiszMiAxIDU3ODAwMDAKKzMyIDEgNTgwMDAwMAorMzIgMSA1ODIwMDAwCiszMiAxIDU4NDAwMDAKKzMyIDEgNTg2MDAwMAorMzIgMSA1ODgwMDAwCiszMiAxIDU5MDAwMDAKKzMyIDEgNTkyMDAwMAorMzIgMSA1OTQwMDAwCiszMiAxIDU5NjAwMDAKKzMyIDEgNTk4MDAwMAorMzIgMSA2MDAwMDAwCiszMiAxIDYwMjAwMDAKKzMyIDEgNjA0MDAwMAorMzIgMSA2MDYwMDAwCiszMiAxIDYwODAwMDAKKzMyIDEgNjEwMDAwMAorMzIgMSA2MTIwMDAwCiszMiAxIDYxNDAwMDAKKzMyIDEgNjE2MDAwMAorMzIgMSA2MTgwMDAwCiszMiAxIDYyMDAwMDAKKzMyIDEgNjIyMDAwMAorMzIgMSA2MjQwMDAwCiszMiAxIDYyNjAwMDAKKzMyIDEgNjI4MDAwMAorMzIgMSA2MzAwMDAwCiszMiAxIDYzMjAwMDAKKzMyIDEgNjM0MDAwMAorMzIgMSA2MzYwMDAwCiszMiAxIDYzODAwMDAKKzMyIDEgNjQwMDAwMAorMzIgMSA2NDIwMDAwCiszMiAxIDY0NDAwMDAKKzMyIDEgNjQ2MDAwMAorMzIgMSA2NDgwMDAwCiszMiAxIDY1MDAwMDAKKzMyIDEgNjUyMDAwMAorMzIgMSA2NTQwMDAwCiszMiAxIDY1NjAwMDAKKzMyIDEgNjU4MDAwMAorMzIgMSA2NjAwMDAwCiszMiAxIDY2MjAwMDAKKzMyIDEgNjY0MDAwMAorMzIgMSA2NjYwMDAwCiszMiAxIDY2ODAwMDAKKzMyIDEgNjcwMDAwMAorMzIgMSA2NzIwMDAwCiszMiAxIDY3NDAwMDAKKzMyIDEgNjc2MDAwMAorMzIgMSA2NzgwMDAwCiszMiAxIDY4MDAwMDAKKzMyIDEgNjgyMDAwMAorMzIgMSA2ODQwMDAwCiszMiAxIDY4NjAwMDAKKzMyIDEgNjg4MDAwMAorMzIgMSA2OTAwMDAwCiszMiAxIDY5MjAwMDAKKzMyIDEgNjk0MDAwMAorMzIgMSA2OTYwMDAwCiszMiAxIDY5ODAwMDAKKzMyIDEgNzAwMDAwMAorMzIgMSA3MDIwMDAwCiszMiAxIDcwNDAwMDAKKzMyIDEgNzA2MDAwMAorMzIgMSA3MDgwMDAwCiszMiAxIDcxMDAwMDAKKzMyIDEgNzEyMDAwMAorMzIgMSA3MTQwMDAwCiszMiAxIDcxNjAwMDAKKzMyIDEgNzE4MDAwMAorMzIgMSA3MjAwMDAwCiszMiAxIDcyMjAwMDAKKzMyIDEgNzI0MDAwMAorMzIgMSA3MjYwMDAwCiszMiAxIDcyODAwMDAKKzMyIDEgNzMwMDAwMAorMzIgMSA3MzIwMDAwCiszMiAxIDczNDAwMDAKKzMyIDEgNzM2MDAwMAorMzIgMSA3MzgwMDAwCiszMiAxIDc0MDAwMDAKKzMyIDEgNzQyMDAwMAorMzIgMSA3NDQwMDAwCiszMiAxIDc0NjAwMDAKKzMyIDEgNzQ4MDAwMAorMzIgMSA3NTAwMDAwCiszMiAxIDc1MjAwMDAKKzMyIDEgNzU0MDAwMAorMzIgMSA3NTYwMDAwCiszMiAxIDc1ODAwMDAKKzMyIDEgNzYwMDAwMAorMzIgMSA3NjIwMDAwCiszMiAxIDc2NDAwMDAKKzMyIDEgNzY2MDAwMAorMzIgMSA3NjgwMDAwCiszMiAxIDc3MDAwMDAKKzMyIDEgNzcyMDAwMAorMzIgMSA3NzQwMDAwCiszMiAxIDc3NjAwMDAKKzMyIDEgNzc4MDAwMAorMzIgMSA3ODAwMDAwCiszMiAxIDc4MjAwMDAKKzMyIDEgNzg0MDAwMAorMzIgMSA3ODYwMDAwCiszMiAxIDc4ODAwMDAKKzMyIDEgNzkwMDAwMAorMzIgMSA3OTIwMDAwCiszMiAxIDc5NDAwMDAKKzMyIDEgNzk2MDAwMAorMzIgMSA3OTgwMDAwCiszMiAxIDgwMDAwMDAKKzMyIDEgODAyMDAwMAorMzIgMSA4MDQwMDAwCiszMiAxIDgwNjAwMDAKKzMyIDEgODA4MDAwMAorMzIgMSA4MTAwMDAwCiszMiAxIDgxMjAwMDAKKzMyIDEgODE0MDAwMAorMzIgMSA4MTYwMDAwCiszMiAxIDgxODAwMDAKKzMyIDEgODIwMDAwMAorMzIgMSA4MjIwMDAwCiszMiAxIDgyNDAwMDAKKzMyIDEgODI2MDAwMAorMzIgMSA4MjgwMDAwCiszMiAxIDgzMDAwMDAKKzMyIDEgODMyMDAwMAorMzIgMSA4MzQwMDAwCiszMiAxIDgzNjAwMDAKKzMyIDEgODM4MDAwMAorMzIgMSA4NDAwMDAwCiszMiAxIDg0MjAwMDAKKzMyIDEgODQ0MDAwMAorMzIgMSA4NDYwMDAwCiszMiAxIDg0ODAwMDAKKzMyIDEgODUwMDAwMAorMzIgMSA4NTIwMDAwCiszMiAxIDg1NDAwMDAKKzMyIDEgODU2MDAwMAorMzIgMSA4NTgwMDAwCiszMiAxIDg2MDAwMDAKKzMyIDEgODYyMDAwMAorMzIgMSA4NjQwMDAwCiszMiAxIDg2NjAwMDAKKzMyIDEgODY4MDAwMAorMzIgMSA4NzAwMDAwCiszMiAxIDg3MjAwMDAKKzMyIDEgODc0MDAwMAorMzIgMSA4NzYwMDAwCiszMiAxIDg3ODAwMDAKKzMyIDEgODgwMDAwMAorMzIgMSA4ODIwMDAwCiszMiAxIDg4NDAwMDAKKzMyIDEgODg2MDAwMAorMzIgMSA4ODgwMDAwCiszMiAxIDg5MDAwMDAKKzMyIDEgODkyMDAwMAorMzIgMSA4OTQwMDAwCiszMiAxIDg5NjAwMDAKKzMyIDEgODk4MDAwMAorMzIgMSA5MDAwMDAwCiszMiAxIDkwMjAwMDAKKzMyIDEgOTA0MDAwMAorMzIgMSA5MDYwMDAwCiszMiAxIDkwODAwMDAKKzMyIDEgOTEwMDAwMAorMzIgMSA5MTIwMDAwCiszMiAxIDkxNDAwMDAKKzMyIDEgOTE2MDAwMAorMzIgMSA5MTgwMDAwCiszMiAxIDkyMDAwMDAKKzMyIDEgOTIyMDAwMAorMzIgMSA5MjQwMDAwCiszMiAxIDkyNjAwMDAKKzMyIDEgOTI4MDAwMAorMzIgMSA5MzAwMDAwCiszMiAxIDkzMjAwMDAKKzMyIDEgOTM0MDAwMAorMzIgMSA5MzYwMDAwCiszMiAxIDkzODAwMDAKKzMyIDEgOTQwMDAwMAorMzIgMSA5NDIwMDAwCiszMiAxIDk0NDAwMDAKKzMyIDEgOTQ2MDAwMAorMzIgMSA5NDgwMDAwCiszMiAxIDk1MDAwMDAKKzMyIDEgOTUyMDAwMAorMzIgMSA5NTQwMDAwCiszMiAxIDk1NjAwMDAKKzMyIDEgOTU4MDAwMAorMzIgMSA5NjAwMDAwCiszMiAxIDk2MjAwMDAKKzMyIDEgOTY0MDAwMAorMzIgMSA5NjYwMDAwCiszMiAxIDk2ODAwMDAKKzMyIDEgOTcwMDAwMAorMzIgMSA5NzIwMDAwCiszMiAxIDk3NDAwMDAKKzMyIDEgOTc2MDAwMAorMzIgMSA5NzgwMDAwCiszMiAxIDk4MDAwMDAKKzMyIDEgOTgyMDAwMAorMzIgMSA5ODQwMDAwCiszMiAxIDk4NjAwMDAKKzMyIDEgOTg4MDAwMAorMzIgMSA5OTAwMDAwCiszMiAxIDk5MjAwMDAKKzMyIDEgOTk0MDAwMAorMzIgMSA5OTYwMDAwCiszMiAxIDk5ODAwMDAKKzMyIDEgMTAwMDAwMDAKKzMyIDEgMTAwMjAwMDAKKzMyIDEgMTAwNDAwMDAKKzMyIDEgMTAwNjAwMDAKKzMyIDEgMTAwODAwMDAKKzMyIDEgMTAxMDAwMDAKKzMyIDEgMTAxMjAwMDAKKzMyIDEgMTAxNDAwMDAKKzMyIDEgMTAxNjAwMDAKKzMyIDEgMTAxODAwMDAKKzMyIDEgMTAyMDAwMDAKKzMyIDEgMTAyMjAwMDAKKzMyIDEgMTAyNDAwMDAKKzMyIDEgMTAyNjAwMDAKKzMyIDEgMTAyODAwMDAKKzMyIDEgMTAzMDAwMDAKKzMyIDEgMTAzMjAwMDAKKzMyIDEgMTAzNDAwMDAKKzMyIDEgMTAzNjAwMDAKKzMyIDEgMTAzODAwMDAKKzMyIDEgMTA0MDAwMDAKKzMyIDEgMTA0MjAwMDAKKzMyIDEgMTA0NDAwMDAKKzMyIDEgMTA0NjAwMDAKKzMyIDEgMTA0ODAwMDAKKzMyIDEgMTA1MDAwMDAKKzMyIDEgMTA1MjAwMDAKKzMyIDEgMTA1NDAwMDAKKzMyIDEgMTA1NjAwMDAKKzMyIDEgMTA1ODAwMDAKKzMyIDEgMTA2MDAwMDAKKzMyIDEgMTA2MjAwMDAKKzMyIDEgMTA2NDAwMDAKKzMyIDEgMTA2NjAwMDAKKzMyIDEgMTA2ODAwMDAKKzMyIDEgMTA3MDAwMDAKKzMyIDEgMTA3MjAwMDAKKzMyIDEgMTA3NDAwMDAKKzMyIDEgMTA3NjAwMDAKKzMyIDEgMTA3ODAwMDAKKzMyIDEgMTA4MDAwMDAKKzMyIDEgMTA4MjAwMDAKKzMyIDEgMTA4NDAwMDAKKzMyIDEgMTA4NjAwMDAKKzMyIDEgMTA4ODAwMDAKKzMyIDEgMTA5MDAwMDAKKzMyIDEgMTA5MjAwMDAKKzMyIDEgMTA5NDAwMDAKKzMyIDEgMTA5NjAwMDAKKzMyIDEgMTA5ODAwMDAKKzMyIDEgMTEwMDAwMDAKKzMyIDEgMTEwMjAwMDAKKzMyIDEgMTEwNDAwMDAKKzMyIDEgMTEwNjAwMDAKKzMyIDEgMTEwODAwMDAKKzMyIDEgMTExMDAwMDAKKzMyIDEgMTExMjAwMDAKKzMyIDEgMTExNDAwMDAKKzMyIDEgMTExNjAwMDAKKzMyIDEgMTExODAwMDAKKzMyIDEgMTEyMDAwMDAKKzMyIDEgMTEyMjAwMDAKKzMyIDEgMTEyNDAwMDAKKzMyIDEgMTEyNjAwMDAKKzMyIDEgMTEyODAwMDAKKzMyIDEgMTEzMDAwMDAKKzMyIDEgMTEzMjAwMDAKKzMyIDEgMTEzNDAwMDAKKzMyIDEgMTEzNjAwMDAKKzMyIDEgMTEzODAwMDAKKzMyIDEgMTE0MDAwMDAKKzMyIDEgMTE0MjAwMDAKKzMyIDEgMTE0NDAwMDAKKzMyIDEgMTE0NjAwMDAKKzMyIDEgMTE0ODAwMDAKKzMyIDEgMTE1MDAwMDAKKzMyIDEgMTE1MjAwMDAKKzMyIDEgMTE1NDAwMDAKKzMyIDEgMTE1NjAwMDAKKzMyIDEgMTE1ODAwMDAKKzMyIDEgMTE2MDAwMDAKKzMyIDEgMTE2MjAwMDAKKzMyIDEgMTE2NDAwMDAKKzMyIDEgMTE2NjAwMDAKKzMyIDEgMTE2ODAwMDAKKzMyIDEgMTE3MDAwMDAKKzMyIDEgMTE3MjAwMDAKKzMyIDEgMTE3NDAwMDAKKzMyIDEgMTE3NjAwMDAKKzMyIDEgMTE3ODAwMDAKKzMyIDEgMTE4MDAwMDAKKzMyIDEgMTE4MjAwMDAKKzMyIDEgMTE4NDAwMDAKKzMyIDEgMTE4NjAwMDAKKzMyIDEgMTE4ODAwMDAKKzMyIDEgMTE5MDAwMDAKKzMyIDEgMTE5MjAwMDAKKzMyIDEgMTE5NDAwMDAKKzMyIDEgMTE5NjAwMDAKKzMyIDEgMTE5ODAwMDAKKzMyIDEgMTIwMDAwMDAKKzMyIDEgMTIwMjAwMDAKKzMyIDEgMTIwNDAwMDAKKzMyIDEgMTIwNjAwMDAKKzMyIDEgMTIwODAwMDAKKzMyIDEgMTIxMDAwMDAKKzMyIDEgMTIxMjAwMDAKKzMyIDEgMTIxNDAwMDAKKzMyIDEgMTIxNjAwMDAKKzMyIDEgMTIxODAwMDAKKzMyIDEgMTIyMDAwMDAKKzMyIDEgMTIyMjAwMDAKKzMyIDEgMTIyNDAwMDAKKzMyIDEgMTIyNjAwMDAKKzMyIDEgMTIyODAwMDAKKzMyIDEgMTIzMDAwMDAKKzMyIDEgMTIzMjAwMDAKKzMyIDEgMTIzNDAwMDAKKzMyIDEgMTIzNjAwMDAKKzMyIDEgMTIzODAwMDAKKzMyIDEgMTI0MDAwMDAKKzMyIDEgMTI0MjAwMDAKKzMyIDEgMTI0NDAwMDAKKzMyIDEgMTI0NjAwMDAKKzMyIDEgMTI0ODAwMDAKKzMyIDEgMTI1MDAwMDAKKzMyIDEgMTI1MjAwMDAKKzMyIDEgMTI1NDAwMDAKKzMyIDEgMTI1NjAwMDAKKzMyIDEgMTI1ODAwMDAKKzMyIDEgMTI2MDAwMDAKKzMyIDEgMTI2MjAwMDAKKzMyIDEgMTI2NDAwMDAKKzMyIDEgMTI2NjAwMDAKKzMyIDEgMTI2ODAwMDAKKzMyIDEgMTI3MDAwMDAKKzMyIDEgMTI3MjAwMDAKKzMyIDEgMTI3NDAwMDAKKzMyIDEgMTI3NjAwMDAKKzMyIDEgMTI3ODAwMDAKKzMyIDEgMTI4MDAwMDAKKzMyIDEgMTI4MjAwMDAKKzMyIDEgMTI4NDAwMDAKKzMyIDEgMTI4NjAwMDAKKzMyIDEgMTI4ODAwMDAKKzMyIDEgMTI5MDAwMDAKKzMyIDEgMTI5MjAwMDAKKzMyIDEgMTI5NDAwMDAKKzMyIDEgMTI5NjAwMDAKKzMyIDEgMTI5ODAwMDAKKzMyIDEgMTMwMDAwMDAKKzMyIDEgMTMwMjAwMDAKKzMyIDEgMTMwNDAwMDAKKzMyIDEgMTMwNjAwMDAKKzMyIDEgMTMwODAwMDAKKzMyIDEgMTMxMDAwMDAKKzMyIDEgMTMxMjAwMDAKKzMyIDEgMTMxNDAwMDAKKzMyIDEgMTMxNjAwMDAKKzMyIDEgMTMxODAwMDAKKzMyIDEgMTMyMDAwMDAKKzMyIDEgMTMyMjAwMDAKKzMyIDEgMTMyNDAwMDAKKzMyIDEgMTMyNjAwMDAKKzMyIDEgMTMyODAwMDAKKzMyIDEgMTMzMDAwMDAKKzMyIDEgMTMzMjAwMDAKKzMyIDEgMTMzNDAwMDAKKzMyIDEgMTMzNjAwMDAKKzMyIDEgMTMzODAwMDAKKzMyIDEgMTM0MDAwMDAKKzMyIDEgMTM0MjAwMDAKKzMyIDEgMTM0NDAwMDAKKzMyIDEgMTM0NjAwMDAKKzMyIDEgMTM0ODAwMDAKKzMyIDEgMTM1MDAwMDAKKzMyIDEgMTM1MjAwMDAKKzMyIDEgMTM1NDAwMDAKKzMyIDEgMTM1NjAwMDAKKzMyIDEgMTM1ODAwMDAKKzMyIDEgMTM2MDAwMDAKKzMyIDEgMTM2MjAwMDAKKzMyIDEgMTM2NDAwMDAKKzMyIDEgMTM2NjAwMDAKKzMyIDEgMTM2ODAwMDAKKzMyIDEgMTM3MDAwMDAKKzMyIDEgMTM3MjAwMDAKKzMyIDEgMTM3NDAwMDAKKzMyIDEgMTM3NjAwMDAKKzMyIDEgMTM3ODAwMDAKKzMyIDEgMTM4MDAwMDAKKzMyIDEgMTM4MjAwMDAKKzMyIDEgMTM4NDAwMDAKKzMyIDEgMTM4NjAwMDAKKzMyIDEgMTM4ODAwMDAKKzMyIDEgMTM5MDAwMDAKKzMyIDEgMTM5MjAwMDAKKzMyIDEgMTM5NDAwMDAKKzMyIDEgMTM5NjAwMDAKKzMyIDEgMTM5ODAwMDAKKzMyIDEgMTQwMDAwMDAKKzMyIDEgMTQwMjAwMDAKKzMyIDEgMTQwNDAwMDAKKzMyIDEgMTQwNjAwMDAKKzMyIDEgMTQwODAwMDAKKzMyIDEgMTQxMDAwMDAKKzMyIDEgMTQxMjAwMDAKKzMyIDEgMTQxNDAwMDAKKzMyIDEgMTQxNjAwMDAKKzMyIDEgMTQxODAwMDAKKzMyIDEgMTQyMDAwMDAKKzMyIDEgMTQyMjAwMDAKKzMyIDEgMTQyNDAwMDAKKzMyIDEgMTQyNjAwMDAKKzMyIDEgMTQyODAwMDAKKzMyIDEgMTQzMDAwMDAKKzMyIDEgMTQzMjAwMDAKKzMyIDEgMTQzNDAwMDAKKzMyIDEgMTQzNjAwMDAKKzMyIDEgMTQzODAwMDAKKzMyIDEgMTQ0MDAwMDAKKzMyIDEgMTQ0MjAwMDAKKzMyIDEgMTQ0NDAwMDAKKzMyIDEgMTQ0NjAwMDAKKzMyIDEgMTQ0ODAwMDAKKzMyIDEgMTQ1MDAwMDAKKzMyIDEgMTQ1MjAwMDAKKzMyIDEgMTQ1NDAwMDAKKzMyIDEgMTQ1NjAwMDAKKzMyIDEgMTQ1ODAwMDAKKzMyIDEgMTQ2MDAwMDAKKzMyIDEgMTQ2MjAwMDAKKzMyIDEgMTQ2NDAwMDAKKzMyIDEgMTQ2NjAwMDAKKzMyIDEgMTQ2ODAwMDAKKzMyIDEgMTQ3MDAwMDAKKzMyIDEgMTQ3MjAwMDAKKzMyIDEgMTQ3NDAwMDAKKzMyIDEgMTQ3NjAwMDAKKzMyIDEgMTQ3ODAwMDAKKzMyIDEgMTQ4MDAwMDAKKzMyIDEgMTQ4MjAwMDAKKzMyIDEgMTQ4NDAwMDAKKzMyIDEgMTQ4NjAwMDAKKzMyIDEgMTQ4ODAwMDAKKzMyIDEgMTQ5MDAwMDAKKzMyIDEgMTQ5MjAwMDAKKzMyIDEgMTQ5NDAwMDAKKzMyIDEgMTQ5NjAwMDAKKzMyIDEgMTQ5ODAwMDAKKzMyIDEgMTUwMDAwMDAKKzMyIDEgMTUwMjAwMDAKKzMyIDEgMTUwNDAwMDAKKzMyIDEgMTUwNjAwMDAKKzMyIDEgMTUwODAwMDAKKzMyIDEgMTUxMDAwMDAKKzMyIDEgMTUxMjAwMDAKKzMyIDEgMTUxNDAwMDAKKzMyIDEgMTUxNjAwMDAKKzMyIDEgMTUxODAwMDAKKzMyIDEgMTUyMDAwMDAKKzMyIDEgMTUyMjAwMDAKKzMyIDEgMTUyNDAwMDAKKzMyIDEgMTUyNjAwMDAKKzMyIDEgMTUyODAwMDAKKzMyIDEgMTUzMDAwMDAKKzMyIDEgMTUzMjAwMDAKKzMyIDEgMTUzNDAwMDAKKzMyIDEgMTUzNjAwMDAKKzMyIDEgMTUzODAwMDAKKzMyIDEgMTU0MDAwMDAKKzMyIDEgMTU0MjAwMDAKKzMyIDEgMTU0NDAwMDAKKzMyIDEgMTU0NjAwMDAKKzMyIDEgMTU0ODAwMDAKKzMyIDEgMTU1MDAwMDAKKzMyIDEgMTU1MjAwMDAKKzMyIDEgMTU1NDAwMDAKKzMyIDEgMTU1NjAwMDAKKzMyIDEgMTU1ODAwMDAKKzMyIDEgMTU2MDAwMDAKKzMyIDEgMTU2MjAwMDAKKzMyIDEgMTU2NDAwMDAKKzMyIDEgMTU2NjAwMDAKKzMyIDEgMTU2ODAwMDAKKzMyIDEgMTU3MDAwMDAKKzMyIDEgMTU3MjAwMDAKKzMyIDEgMTU3NDAwMDAKKzMyIDEgMTU3NjAwMDAKKzMyIDEgMTU3ODAwMDAKKzMyIDEgMTU4MDAwMDAKKzMyIDEgMTU4MjAwMDAKKzMyIDEgMTU4NDAwMDAKKzMyIDEgMTU4NjAwMDAKKzMyIDEgMTU4ODAwMDAKKzMyIDEgMTU5MDAwMDAKKzMyIDEgMTU5MjAwMDAKKzMyIDEgMTU5NDAwMDAKKzMyIDEgMTU5NjAwMDAKKzMyIDEgMTU5ODAwMDAKKzMyIDEgMTYwMDAwMDAKKzMyIDEgMTYwMjAwMDAKKzMyIDEgMTYwNDAwMDAKKzMyIDEgMTYwNjAwMDAKKzMyIDEgMTYwODAwMDAKKzMyIDEgMTYxMDAwMDAKKzMyIDEgMTYxMjAwMDAKKzMyIDEgMTYxNDAwMDAKKzMyIDEgMTYxNjAwMDAKKzMyIDEgMTYxODAwMDAKKzMyIDEgMTYyMDAwMDAKKzMyIDEgMTYyMjAwMDAKKzMyIDEgMTYyNDAwMDAKKzMyIDEgMTYyNjAwMDAKKzMyIDEgMTYyODAwMDAKKzMyIDEgMTYzMDAwMDAKKzMyIDEgMTYzMjAwMDAKKzMyIDEgMTYzNDAwMDAKKzMyIDEgMTYzNjAwMDAKKzMyIDEgMTYzODAwMDAKKzMyIDEgMTY0MDAwMDAKKzMyIDEgMTY0MjAwMDAKKzMyIDEgMTY0NDAwMDAKKzMyIDEgMTY0NjAwMDAKKzMyIDEgMTY0ODAwMDAKKzMyIDEgMTY1MDAwMDAKKzMyIDEgMTY1MjAwMDAKKzMyIDEgMTY1NDAwMDAKKzMyIDEgMTY1NjAwMDAKKzMyIDEgMTY1ODAwMDAKKzMyIDEgMTY2MDAwMDAKKzMyIDEgMTY2MjAwMDAKKzMyIDEgMTY2NDAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1N2VlNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzTWVkaWFDMlYxXzBEZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdC5jcHAiXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0VuY1Rlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c01lZGlhQzJWMV8wRGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIlZ0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0VuY1Rlc3QuY3BwIl0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9EZWNUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9EZWNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmZjYjZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL1Z0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0RlY1Rlc3QuY3BwCkBAIC0wLDAgKzEsODkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfdmlkZW9fZGVjX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorCit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaCIKKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK3N0cnVjdCBGcmFtZUluZm8geworICAgIGludCBieXRlc0NvdW50OworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGludDY0X3QgdGltZXN0YW1wOworfTsKKworY2xhc3MgTGluZWFyQnVmZmVyIDogcHVibGljIEMyQnVmZmVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBMaW5lYXJCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+JiBibG9jaykKKyAgICAgICAgOiBDMkJ1ZmZlcigKKyAgICAgICAgICAgICAge2Jsb2NrLT5zaGFyZShibG9jay0+b2Zmc2V0KCksIGJsb2NrLT5zaXplKCksIDo6QzJGZW5jZSgpKX0pIHt9Cit9OworCitzdGF0aWMgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KiBnRW52ID0gbnVsbHB0cjsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSB7CisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgU3VwZXI7CisKKyAgIHB1YmxpYzoKKyAgICA6OnN0ZDo6c3RyaW5nIGdldFRlc3RDYXNlSW5mbygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIDo6c3RkOjpzdHJpbmcoKSArCisgICAgICAgICAgICAgICAgIkNvbXBvbmVudDogIiArIGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCkgKyAiIHwgIiArCisgICAgICAgICAgICAgICAgIkluc3RhbmNlOiAiICsgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJSZXM6ICIgKyBnRW52LT5nZXRSZXMoKS5jX3N0cigpOworICAgIH0KKworICAgIC8vIGdvb2dsZS5jb2RlYzIgVmlkZW8gdGVzdCBzZXR1cAorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgU3VwZXI6OlNldFVwKCk7CisgICAgICAgIG1EaXNhYmxlVGVzdCA9IGZhbHNlOworICAgICAgICBBTE9HVigiQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCBTZXRVcCIpOworICAgICAgICBtQ2xpZW50ID0gYW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgICAgIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSk7CisgICAgICAgIEFTU0VSVF9ORShtQ2xpZW50LCBudWxscHRyKTsKKyAgICAgICAgbUxpc3RlbmVyLnJlc2V0KG5ldyBDb2RlY0xpc3RlbmVyKAorICAgICAgICAgICAgW3RoaXNdKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICAgICAgICAgIGhhbmRsZVdvcmtEb25lKHdvcmtJdGVtcyk7CisgICAgICAgICAgICB9KSk7CisgICAgICAgIEFTU0VSVF9ORShtTGlzdGVuZXIsIG51bGxwdHIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9JTlBVVF9CVUZGRVJTOyArK2kpIHsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmspOworICAgICAgICB9CisgICAgICAgIG1DbGllbnQtPmNyZWF0ZUNvbXBvbmVudChnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpLCBtTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNvbXBvbmVudCk7CisgICAgICAgIEFTU0VSVF9ORShtQ29tcG9uZW50LCBudWxscHRyKTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gc3RvcmUgPQorICAgICAgICAgICAgYW5kcm9pZDo6R2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgICAgICBDSEVDS19FUShzdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUxpbmVhckFsbG9jYXRvciksCisgICAgICAgICAgICAgICAgIEMyX09LKTsKKyAgICAgICAgbUxpbmVhclBvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihtTGluZWFyQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xJZCsrKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaW5lYXJQb29sLCBudWxscHRyKTsKKworICAgICAgICBtQ29tcE5hbWUgPSB1bmtub3duX2NvbXA7CisgICAgICAgIHN0cnVjdCBTdHJpbmdUb05hbWUgeworICAgICAgICAgICAgY29uc3QgY2hhciogTmFtZTsKKyAgICAgICAgICAgIHN0YW5kYXJkQ29tcCBDb21wTmFtZTsKKyAgICAgICAgfTsKKworICAgICAgICBjb25zdCBTdHJpbmdUb05hbWUga1N0cmluZ1RvTmFtZVtdID0geworICAgICAgICAgICAgeyJoMjYzIiwgaDI2M30sIHsiYXZjIiwgYXZjfSwgeyJtcGVnMiIsIG1wZWcyfSwgeyJtcGVnNCIsIG1wZWc0fSwKKyAgICAgICAgICAgIHsiaGV2YyIsIGhldmN9LCB7InZwOCIsIHZwOH0sIHsidnA5IiwgdnA5fSwgeyJhdjEiLCBhdjF9LAorICAgICAgICB9OworCisgICAgICAgIGNvbnN0IHNpemVfdCBrTnVtU3RyaW5nVG9OYW1lID0KKyAgICAgICAgICAgIHNpemVvZihrU3RyaW5nVG9OYW1lKSAvIHNpemVvZihrU3RyaW5nVG9OYW1lWzBdKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBzdWJzdHJpbmc7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbXA7CisgICAgICAgIHN1YnN0cmluZyA9IHN0ZDo6c3RyaW5nKGdFbnYtPmdldENvbXBvbmVudCgpKTsKKyAgICAgICAgLyogVE9ETzogYmV0dGVyIGFwcHJvYWNoIHRvIGZpbmQgdGhlIGNvbXBvbmVudCAqLworICAgICAgICAvKiAiYzIuYW5kcm9pZC4iID0+IDExdGggcG9zaXRpb24gKi8KKyAgICAgICAgc2l6ZV90IHBvcyA9IDExOworICAgICAgICBzaXplX3QgbGVuID0gc3Vic3RyaW5nLmZpbmQoIi5kZWNvZGVyIiwgcG9zKTsKKyAgICAgICAgY29tcCA9IHN1YnN0cmluZy5zdWJzdHIocG9zLCBsZW4gLSBwb3MpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVN0cmluZ1RvTmFtZTsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoY29tcC5jX3N0cigpLCBrU3RyaW5nVG9OYW1lW2ldLk5hbWUpKSB7CisgICAgICAgICAgICAgICAgbUNvbXBOYW1lID0ga1N0cmluZ1RvTmFtZVtpXS5Db21wTmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRW9zID0gZmFsc2U7CisgICAgICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIG1UaW1lc3RhbXBVcyA9IDB1OworICAgICAgICBtVGltZXN0YW1wRGV2VGVzdCA9IGZhbHNlOworICAgICAgICBpZiAobUNvbXBOYW1lID09IHVua25vd25fY29tcCkgbURpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1EaXNhYmxlVGVzdCkgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBEaXNhYmxlZCBcbiI7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUNvbXBvbmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAoOjp0ZXN0aW5nOjpUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworICAgICAgICAgICAgbUNvbXBvbmVudC0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUNvbXBvbmVudCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgU3VwZXI6OlRlYXJEb3duKCk7CisgICAgfQorCisgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCisgICAgdm9pZCBoYW5kbGVXb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtJdGVtcykgeworICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gRm9yIGRlY29kZXIgY29tcG9uZW50cyBjdXJyZW50IHRpbWVzdGFtcCBhbHdheXMgZXhjZWVkcworICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICAgICAgICAgICAgICBib29sIGNvZGVjQ29uZmlnID0gKCh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMCk7CisgICAgICAgICAgICAgICAgaWYgKCFjb2RlY0NvbmZpZyAmJgorICAgICAgICAgICAgICAgICAgICAhd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfR0UoCisgICAgICAgICAgICAgICAgICAgICAgICAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzKTsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpOworCisgICAgICAgICAgICAgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0c0hpdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgaXQgPSBtVGltZXN0YW1wVXNsaXN0LmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXQgIT0gbVRpbWVzdGFtcFVzbGlzdC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqaXQgPT0gbVRpbWVzdGFtcFVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVc2xpc3QuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c0hpdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRzSGl0ID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1UaW1lc3RhbXBVc2xpc3QuZW1wdHkoKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfRVEodHNIaXQsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVGltZVN0YW1wIG5vdCByZWNvZ25pemVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBJTkZPICAgXSBSZWNlaXZlZCBub24temVybyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0IC8gVGltZVN0YW1wIG5vdCByZWNvZ25pemVkIFxuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYm9vbCBtQ3NkOworICAgICAgICAgICAgICAgIHdvcmtEb25lKG1Db21wb25lbnQsIHdvcmssIG1GbHVzaGVkSW5kaWNlcywgbVF1ZXVlTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1Fb3MsIG1Dc2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1JlY2VpdmVkKTsKKyAgICAgICAgICAgICAgICAodm9pZCltQ3NkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZW51bSBzdGFuZGFyZENvbXAgeworICAgICAgICBoMjYzLAorICAgICAgICBhdmMsCisgICAgICAgIG1wZWcyLAorICAgICAgICBtcGVnNCwKKyAgICAgICAgaGV2YywKKyAgICAgICAgdnA4LAorICAgICAgICB2cDksCisgICAgICAgIGF2MSwKKyAgICAgICAgdW5rbm93bl9jb21wLAorICAgIH07CisKKyAgICBib29sIG1Fb3M7CisgICAgYm9vbCBtRGlzYWJsZVRlc3Q7CisgICAgYm9vbCBtVGltZXN0YW1wRGV2VGVzdDsKKyAgICB1aW50NjRfdCBtVGltZXN0YW1wVXM7CisgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtVGltZXN0YW1wVXNsaXN0OworICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbUZsdXNoZWRJbmRpY2VzOworICAgIHN0YW5kYXJkQ29tcCBtQ29tcE5hbWU7CisgICAgdWludDMyX3QgbUZyYW1lc1JlY2VpdmVkOworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xJZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1MaW5lYXJQb29sOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUxpbmVhckFsbG9jYXRvcjsKKworICAgIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudD4gbUNsaWVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKworICAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgICAgfQorfTsKKwordm9pZCB2YWxpZGF0ZUNvbXBvbmVudCgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgQ29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXBOYW1lLCBib29sJiBkaXNhYmxlVGVzdCkgeworICAgIC8vIFZhbGlkYXRlIGl0cyBhIEMyIENvbXBvbmVudAorICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJjMiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJOb3QgYSBjMiBjb21wb25lbnQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgaXRzIG5vdCBhbiBlbmNvZGVyIGFuZCB0aGUgY29tcG9uZW50IHRvIGJlIHRlc3RlZCBpcyB2aWRlbworICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJlbmNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIkV4cGVjdGVkIERlY29kZXIsIGdpdmVuIEVuY29kZXIiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9CisgICAgICAgIGNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBxdWVyaWVkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlZCIsIGMyZXJyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnN0cmluZyBpbnB1dERvbWFpbiA9CisgICAgICAgICAgICAoKEMyU3RyZWFtTWVkaWFUeXBlU2V0dGluZzo6aW5wdXQqKXF1ZXJpZWRbMF0uZ2V0KCkpLT5tLnZhbHVlOworICAgICAgICBpZiAoaW5wdXREb21haW4uZmluZCgidmlkZW8vIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBWaWRlbyBDb21wb25lbnQiKTsKKyAgICAgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZhbGlkYXRlcyBjb21wb25lbnQgbmFtZQorICAgIGlmIChjb21wTmFtZSA9PSBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0Ojp1bmtub3duX2NvbXApIHsKKyAgICAgICAgQUxPR0UoIkNvbXBvbmVudCBJblZhbGlkIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiQ29tcG9uZW50IFZhbGlkIik7Cit9CisKKy8vIG51bWJlciBvZiBlbGVtZW50YXJ5IHN0cmVhbXMgcGVyIGNvbXBvbmVudAorI2RlZmluZSBTVFJFQU1fQ09VTlQgMgorLy8gTG9va1VwVGFibGUgb2YgY2xpcHMgYW5kIG1ldGFkYXRhIGZvciBjb21wb25lbnQgdGVzdGluZwordm9pZCBHZXRVUkxGb3JDb21wb25lbnQoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXAsIGNoYXIqIG1VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBpbmZvLCBzaXplX3Qgc3RyZWFtSW5kZXggPSAxKSB7CisgICAgc3RydWN0IENvbXBUb1VSTCB7CisgICAgICAgIENvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wOworICAgICAgICBjb25zdCBjaGFyIG1VUkxbU1RSRUFNX0NPVU5UXVs1MTJdOworICAgICAgICBjb25zdCBjaGFyIGluZm9bU1RSRUFNX0NPVU5UXVs1MTJdOworICAgIH07CisgICAgQVNTRVJUX1RSVUUoc3RyZWFtSW5kZXggPCBTVFJFQU1fQ09VTlQpOworCisgICAgc3RhdGljIGNvbnN0IENvbXBUb1VSTCBrQ29tcFRvVVJMW10gPSB7CisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmF2YywKKyAgICAgICAgIHsiYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaDI2NCIsCisgICAgICAgICAgImJiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmgyNjQifSwKKyAgICAgICAgIHsiYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaW5mbyIsCisgICAgICAgICAgImJiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmhldmMsCisgICAgICAgICB7ImJiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5oZXZjIiwKKyAgICAgICAgICAiYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5oZXZjIn0sCisgICAgICAgICB7ImJiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5pbmZvIiwKKyAgICAgICAgICAiYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvIn19LAorICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjptcGVnMiwKKyAgICAgICAgIHsiYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5tMnYiLAorICAgICAgICAgICJiYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5tMnYifSwKKyAgICAgICAgIHsiYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5pbmZvIiwKKyAgICAgICAgICAiYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6aDI2MywKKyAgICAgICAgIHsiIiwgImJiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5oMjYzIn0sCisgICAgICAgICB7IiIsICJiYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6bXBlZzQsCisgICAgICAgICB7IiIsICJiYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLm00diJ9LAorICAgICAgICAgeyIiLCAiYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5pbmZvIn19LAorICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjp2cDgsCisgICAgICAgICB7ImJiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLnZwOCIsCisgICAgICAgICAgImJiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy52cDgifSwKKyAgICAgICAgIHsiYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMuaW5mbyIsCisgICAgICAgICAgImJiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy5pbmZvIn19LAorICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjp2cDksCisgICAgICAgICB7ImJiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLnZwOSIsCisgICAgICAgICAgImJiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy52cDkifSwKKyAgICAgICAgIHsiYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMuaW5mbyIsCisgICAgICAgICAgImJiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvIn19LAorICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphdjEsCisgICAgICAgICB7ImJiYl9hdjFfNjQwXzM2MC5hdjEiLAorICAgICAgICAgICJiYmJfYXYxXzE3Nl8xNDQuYXYxIn0sCisgICAgICAgICB7ImJiYl9hdjFfNjQwXzM2MC5pbmZvIiwKKyAgICAgICAgICAiYmJiX2F2MV8xNzZfMTQ0LmluZm8ifX0sCisgICAgfTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGtDb21wVG9VUkwpIC8gc2l6ZW9mKGtDb21wVG9VUkxbMF0pOyArK2kpIHsKKyAgICAgICAgaWYgKGtDb21wVG9VUkxbaV0uY29tcCA9PSBjb21wKSB7CisgICAgICAgICAgICBzdHJjYXQobVVSTCwga0NvbXBUb1VSTFtpXS5tVVJMW3N0cmVhbUluZGV4XSk7CisgICAgICAgICAgICBzdHJjYXQoaW5mbywga0NvbXBUb1VSTFtpXS5pbmZvW3N0cmVhbUluZGV4XSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgZGVjb2RlTkZyYW1lcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjptdXRleCAmcXVldWVMb2NrLCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4mIGZsdXNoZWRJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIGxpbmVhclBvb2wsCisgICAgICAgICAgICAgICAgICAgc3RkOjppZnN0cmVhbSYgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+KiBJbmZvLAorICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCByYW5nZSwgYm9vbCBzaWduYWxFT1MgPSB0cnVlKSB7CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIGludCBmcmFtZUlEID0gb2Zmc2V0OworICAgIGludCBtYXhSZXRyeSA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKGZyYW1lSUQgPT0gKGludClJbmZvLT5zaXplKCkgfHwgZnJhbWVJRCA9PSAob2Zmc2V0ICsgcmFuZ2UpKSBicmVhazsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAvLyBQcmVwYXJlIEMyV29yaworICAgICAgICB3aGlsZSAoIXdvcmsgJiYgKG1heFJldHJ5IDwgTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgaWYgKCF3b3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHdvcmsuc3dhcCh3b3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgd29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXdvcmsgJiYgKG1heFJldHJ5ID49IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiV2FpdCBmb3IgZ2VuZXJhdGluZyBDMldvcmsgZXhjZWVkZWQgdGltZW91dCI7CisgICAgICAgIH0KKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAgPSAoKkluZm8pW2ZyYW1lSURdLnRpbWVzdGFtcDsKKyAgICAgICAgaWYgKCgqSW5mbylbZnJhbWVJRF0uZmxhZ3MpIGZsYWdzID0gKDEgPDwgKCgqSW5mbylbZnJhbWVJRF0uZmxhZ3MgLSAxKSk7CisgICAgICAgIGlmIChzaWduYWxFT1MgJiYgKChmcmFtZUlEID09IChpbnQpSW5mby0+c2l6ZSgpIC0gMSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGZyYW1lSUQgPT0gKG9mZnNldCArIHJhbmdlIC0gMSkpKSkKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisKKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBmcmFtZUlEOworICAgICAgICB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBmbHVzaGVkSW5kaWNlcy5lbXBsYWNlX2JhY2soZnJhbWVJRCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgc2l6ZSA9ICgqSW5mbylbZnJhbWVJRF0uYnl0ZXNDb3VudDsKKyAgICAgICAgY2hhciogZGF0YSA9IChjaGFyKiltYWxsb2Moc2l6ZSk7CisgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKTsKKworICAgICAgICBlbGVTdHJlYW0ucmVhZChkYXRhLCBzaXplKTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5nY291bnQoKSwgc2l6ZSk7CisKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICBpZiAoc2l6ZSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICAgICAgQVNTRVJUX0VRKEMyX09LLAorICAgICAgICAgICAgICAgICAgICBsaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgJmJsb2NrKSk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShibG9jayk7CisKKyAgICAgICAgICAgIC8vIFdyaXRlIFZpZXcKKyAgICAgICAgICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDMkxpbmVhckJsb2NrOjptYXAoKSBmYWlsZWQgOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBU1NFUlRfRVEoKHNpemVfdClzaXplLCB2aWV3LmNhcGFjaXR5KCkpOworICAgICAgICAgICAgQVNTRVJUX0VRKDB1LCB2aWV3Lm9mZnNldCgpKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgoc2l6ZV90KXNpemUsIHZpZXcuc2l6ZSgpKTsKKworICAgICAgICAgICAgbWVtY3B5KHZpZXcuYmFzZSgpLCBkYXRhLCBzaXplKTsKKworICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IExpbmVhckJ1ZmZlcihibG9jaykpOworICAgICAgICAgICAgZnJlZShkYXRhKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIC8vIERPIFRIRSBERUNPRElORworICAgICAgICBBU1NFUlRfRVEoY29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisgICAgICAgIEFMT0dWKCJGcmFtZSAjJWQgc2l6ZSA9ICVkIHF1ZXVlZCIsIGZyYW1lSUQsIHNpemUpOworICAgICAgICBmcmFtZUlEKys7CisgICAgICAgIG1heFJldHJ5ID0gMDsKKyAgICB9Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LCB2YWxpZGF0ZUNvbXBOYW1lKSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFMT0dWKCJDaGVja3MgaWYgdGhlIGdpdmVuIGNvbXBvbmVudCBpcyBhIHZhbGlkIHZpZGVvIGNvbXBvbmVudCIpOworICAgIHZhbGlkYXRlQ29tcG9uZW50KG1Db21wb25lbnQsIG1Db21wTmFtZSwgbURpc2FibGVUZXN0KTsKKyAgICBBU1NFUlRfRVEobURpc2FibGVUZXN0LCBmYWxzZSk7Cit9CisKK2NsYXNzIENvZGVjMlZpZGVvRGVjRGVjb2RlVGVzdAorICAgIDogcHVibGljIENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjpwYWlyPGludDMyX3QsIGJvb2w+PiB7Cit9OworCisvLyBCaXRzdHJlYW0gVGVzdAorVEVTVF9QKENvZGVjMlZpZGVvRGVjRGVjb2RlVGVzdCwgRGVjb2RlVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJEZWNvZGVzIGlucHV0IGZpbGUiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICB1aW50MzJfdCBzdHJlYW1JbmRleCA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgYm9vbCBzaWduYWxFT1MgPSBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbywgc3RyZWFtSW5kZXgpOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIC0gZmlsZSBub3QgZm91bmQiOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgYm9vbCBjb2RlY0NvbmZpZyA9IGZsYWdzID8KKyAgICAgICAgICAgICgoMSA8PCAoZmxhZ3MgLSAxKSkgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDAgOiAwOworICAgICAgICBpZiAobVRpbWVzdGFtcERldlRlc3QgJiYgIWNvZGVjQ29uZmlnKQorICAgICAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5wdXNoX2JhY2sodGltZXN0YW1wKTsKKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICAvLyBSZXNldCB0b3RhbCBubyBvZiBmcmFtZXMgcmVjZWl2ZWQKKyAgICBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgIG1UaW1lc3RhbXBVcyA9IDA7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgKGludClJbmZvLnNpemUoKSwgc2lnbmFsRU9TKSk7CisKKyAgICAvLyBJZiBFT1MgaXMgbm90IHNlbnQsIHNlbmRpbmcgZW1wdHkgaW5wdXQgd2l0aCBFT1MgZmxhZworICAgIHNpemVfdCBpbmZvU2l6ZSA9IEluZm8uc2l6ZSgpOworICAgIGlmICghc2lnbmFsRU9TKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIDEpKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB0ZXN0SW5wdXRCdWZmZXIobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNLCBmYWxzZSkpOworICAgICAgICBpbmZvU2l6ZSArPSAxOworICAgIH0KKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgaWYgKCFtRW9zKSB7CisgICAgICAgIEFMT0dWKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgfQorCisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBpbmZvU2l6ZSkgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dWKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXp1IiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBpbmZvU2l6ZSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAobVRpbWVzdGFtcERldlRlc3QpIEVYUEVDVF9FUShtVGltZXN0YW1wVXNsaXN0LmVtcHR5KCksIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKy8vIERlY29kZVRlc3Qgd2l0aCBTdHJlYW1JbmRleCBhbmQgRU9TIC8gTm8gRU9TCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChTdHJlYW1JbmRleEFuZEVPUywgQ29kZWMyVmlkZW9EZWNEZWNvZGVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoc3RkOjptYWtlX3BhaXIoMCwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoMCwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcigxLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcigxLCB0cnVlKSkpOworCisvLyBBZGFwdGl2ZSBUZXN0CitURVNUX0YoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCwgQWRhcHRpdmVEZWNvZGVUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIkFkYXB0aXZlIERlY29kZSBUZXN0Iik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIGlmICghKG1Db21wTmFtZSA9PSBhdmMgfHwgbUNvbXBOYW1lID09IGhldmMgfHwgbUNvbXBOYW1lID09IHZwOCB8fAorICAgICAgICAgIG1Db21wTmFtZSA9PSB2cDkgfHwgbUNvbXBOYW1lID09IG1wZWcyKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICBtVGltZXN0YW1wRGV2VGVzdCA9IHRydWU7CisgICAgdWludDMyX3QgdGltZXN0YW1wT2Zmc2V0ID0gMDsKKyAgICB1aW50MzJfdCBvZmZzZXQgPSAwOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFNUUkVBTV9DT1VOVCAqIDI7IGkrKykgeworICAgICAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgICAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgICAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICAgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbywgaSAlIFNUUkVBTV9DT1VOVCk7CisKKyAgICAgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgICAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpIDw8IG1VUkwgPDwgIiAtIGZpbGUgbm90IGZvdW5kIjsKKyAgICAgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgICAgIHVpbnQzMl90IHRpbWVzdGFtcE1heCA9IDA7CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgICAgIHRpbWVzdGFtcCArPSB0aW1lc3RhbXBPZmZzZXQ7CisgICAgICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgICAgICAgICAgYm9vbCBjb2RlY0NvbmZpZyA9IGZsYWdzID8KKyAgICAgICAgICAgICAgICAoKDEgPDwgKGZsYWdzIC0gMSkpICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwIDogMDsKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgICAgICAgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0ICYmICFjb2RlY0NvbmZpZykKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5wdXNoX2JhY2sodGltZXN0YW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aW1lc3RhbXBNYXggPCB0aW1lc3RhbXApIHRpbWVzdGFtcE1heCA9IHRpbWVzdGFtcDsKKyAgICAgICAgfQorICAgICAgICB0aW1lc3RhbXBPZmZzZXQgPSB0aW1lc3RhbXBNYXg7CisgICAgICAgIGVsZUluZm8uY2xvc2UoKTsKKworICAgICAgICAvLyBSZXNldCBUb3RhbCBmcmFtZXMgYmVmb3JlIHNlY29uZCBkZWNvZGUgbG9vcAorICAgICAgICAvLyBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgICAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBkZWNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCAoaW50KShJbmZvLnNpemUoKSAtIG9mZnNldCksIGZhbHNlKSk7CisKKyAgICAgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgICAgIG9mZnNldCA9IChpbnQpSW5mby5zaXplKCk7CisgICAgfQorCisgICAgLy8gU2VuZCBFT1MKKyAgICAvLyBUT0RPIEFkZCBmdW5jdGlvbiB0byBzZW5kIEVPUyB3b3JrIGl0ZW0KKyAgICBpbnQgbWF4UmV0cnkgPSAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgd2hpbGUgKCF3b3JrICYmIChtYXhSZXRyeSA8IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgbVdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBBTE9HVigiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gKChJbmZvLnNpemUoKSkgKyAxKSkgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dWKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXp1IiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBJbmZvLnNpemUoKSArIDEpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0KSBFWFBFQ1RfRVEobVRpbWVzdGFtcFVzbGlzdC5lbXB0eSgpLCB0cnVlKTsKK30KKworLy8gdGh1bWJuYWlsIHRlc3QKK1RFU1RfRihDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LCBUaHVtYm5haWxUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgUmVxdWVzdCBmb3IgdGh1bWJuYWlsIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX0lURVJBVElPTlM7IGkrKykgeworICAgICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgICAgIC8vIHJlcXVlc3QgRU9TIGZvciB0aHVtYm5haWwKKyAgICAgICAgLy8gc2lnbmFsIEVPUyBmbGFnIHdpdGggbGFzdCBmcmFtZQorICAgICAgICBzaXplX3QgaiA9IC0xOworICAgICAgICBkbyB7CisgICAgICAgICAgICBqKys7CisgICAgICAgICAgICBmbGFncyA9IDA7CisgICAgICAgICAgICBpZiAoSW5mb1tqXS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoSW5mb1tqXS5mbGFncyAtIDEpOworCisgICAgICAgIH0gd2hpbGUgKCEoZmxhZ3MgJiBTWU5DX0ZSQU1FKSk7CisgICAgICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIGogKyAxKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKyAgICAgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgICAgIEVYUEVDVF9HRShtRnJhbWVzUmVjZWl2ZWQsIDFVKTsKKyAgICAgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5yZWxlYXNlKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIEVPU1Rlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdCBlbXB0eSBpbnB1dCBidWZmZXIgd2l0aCBFT1MgZmxhZyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAoIW1Xb3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgd29yay5zd2FwKG1Xb3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJtV29ya1F1ZXVlIEVtcHR5IGF0IHRoZSBzdGFydCBvZiB0ZXN0IjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKG1Xb3JrUXVldWUuc2l6ZSgpICE9IE1BWF9JTlBVVF9CVUZGRVJTKSB7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobVdvcmtRdWV1ZS5zaXplKCksIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIEZsdXNoVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0cyBGbHVzaCBjYWxscyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworCisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIC8vIERlY29kZSAxMjggZnJhbWVzIGFuZCBmbHVzaC4gaGVyZSAxMjggaXMgY2hvc2VuIHRvIGVuc3VyZSB0aGVyZSBpcyBhIGtleQorICAgIC8vIGZyYW1lIGFmdGVyIHRoaXMgc28gdGhhdCB0aGUgYmVsb3cgc2VjdGlvbiBjYW4gYmUgY292ZXJlZCBmb3IgYWxsCisgICAgLy8gY29tcG9uZW50cworICAgIHVpbnQzMl90IG51bUZyYW1lc0ZsdXNoZWQgPSAxMjg7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsCisgICAgICAgIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCBudW1GcmFtZXNGbHVzaGVkLCBmYWxzZSkpOworICAgIC8vIGZsdXNoCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworCisgICAgeworICAgICAgICAvLyBVcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBhdXRvIGZyYW1lSW5kZXhJdCA9CisgICAgICAgICAgICAgICAgc3RkOjpmaW5kKG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIFNlZWsgdG8gbmV4dCBrZXkgZnJhbWUgYW5kIHN0YXJ0IGRlY29kaW5nIHRpbGwgdGhlIGVuZAorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIGludCBpbmRleCA9IG51bUZyYW1lc0ZsdXNoZWQ7CisgICAgYm9vbCBrZXlGcmFtZSA9IGZhbHNlOworICAgIGZsYWdzID0gMDsKKyAgICB3aGlsZSAoaW5kZXggPCAoaW50KUluZm8uc2l6ZSgpKSB7CisgICAgICAgIGlmIChJbmZvW2luZGV4XS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoSW5mb1tpbmRleF0uZmxhZ3MgLSAxKTsKKyAgICAgICAgaWYgKChmbGFncyAmIFNZTkNfRlJBTUUpID09IFNZTkNfRlJBTUUpIHsKKyAgICAgICAgICAgIGtleUZyYW1lID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgZWxlU3RyZWFtLmlnbm9yZShJbmZvW2luZGV4XS5ieXRlc0NvdW50KTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICB9CisgICAgaWYgKGtleUZyYW1lKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZGVjb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KUluZm8uc2l6ZSgpIC0gaW5kZXgpKTsKKyAgICB9CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgZXJyID0gbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB7CisgICAgICAgIC8vIFVwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9IHN0ZDo6ZmluZCgKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLCBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRmx1c2hlZEluZGljZXMuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCwgRGVjb2RlVGVzdEVtcHR5QnVmZmVyc0luc2VydGVkKSB7CisgICAgZGVzY3JpcHRpb24oIkRlY29kZSB3aXRoIG11bHRpcGxlIGVtcHR5IGlucHV0IGZyYW1lcyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIC0gZmlsZSBub3QgZm91bmQiOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZyYW1lSWQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIGJvb2wgY29kZWNDb25maWcgPSBmYWxzZTsKKyAgICAvLyBUaGlzIHRlc3QgaW50cm9kdWNlcyBlbXB0eSBDU0QgYWZ0ZXIgZXZlcnkgMjB0aCBmcmFtZQorICAgIC8vIGFuZCBlbXB0eSBpbnB1dCBmcmFtZXMgYXQgYW4gaW50ZXJ2YWwgb2YgNSBmcmFtZXMuCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZnJhbWVJZCAlIDUpKSB7CisgICAgICAgICAgICBpZiAoIShmcmFtZUlkICUgMjApKSBmbGFncyA9IDMyOworICAgICAgICAgICAgZWxzZSBmbGFncyA9IDA7CisgICAgICAgICAgICBieXRlc0NvdW50ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICAgICAgY29kZWNDb25maWcgPSBmbGFncyA/CisgICAgICAgICAgICAgICAgKCgxIDw8IChmbGFncyAtIDEpKSAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMCA6IDA7CisgICAgICAgIH0KKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICAgICAgZnJhbWVJZCsrOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywKKyAgICAgICAgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIChpbnQpSW5mby5zaXplKCkpKTsKKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBpZiAoIW1Fb3MpIHsKKyAgICAgICAgQUxPR1YoIldhaXRpbmcgZm9yIGlucHV0IGNvbnN1bXB0aW9uIik7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKyAgICB9CisKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBpZiAobUZyYW1lc1JlY2VpdmVkICE9IEluZm8uc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgY291bnQgYW5kIE91dHB1dCBidWZmZXIgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR1YoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAlenUiLCBtRnJhbWVzUmVjZWl2ZWQsCisgICAgICAgICAgICAgIEluZm8uc2l6ZSgpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLyBUT0RPIDogVmlkZW8gc3BlY2lmaWMgY29uZmlndXJhdGlvbiBUZXN0CitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGdFbnYtPmluaXQoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQzIgVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzNkYzg1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL1Z0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0VuY1Rlc3QuY3BwCkBAIC0wLDAgKzEsNjQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfdmlkZW9fZW5jX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorCit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaCIKKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK2NsYXNzIEdyYXBoaWNCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICBleHBsaWNpdCBHcmFwaGljQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKQorICAgICAgOiBDMkJ1ZmZlcih7YmxvY2stPnNoYXJlKEMyUmVjdChibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkMyRmVuY2UoKSl9KSB7fQorfTsKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENvZGVjMlZpZGVvRW5jSGlkbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgOjpzdGQ6OnN0cmluZyBnZXRUZXN0Q2FzZUluZm8oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiA6OnN0ZDo6c3RyaW5nKCkgKworICAgICAgICAgICAgICAgICJDb21wb25lbnQ6ICIgKyBnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJJbnN0YW5jZTogIiArIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiUmVzOiAiICsgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKTsKKyAgICB9CisKKyAgICAvLyBnb29nbGUuY29kZWMyIFZpZGVvIHRlc3Qgc2V0dXAKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKKyAgICAgICAgQUxPR1YoIkNvZGVjMlZpZGVvRW5jSGlkbFRlc3QgU2V0VXAiKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgICAgIFt0aGlzXShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfTkUobUxpc3RlbmVyLCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xpZW50LT5jcmVhdGVDb21wb25lbnQoZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSwgbUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db21wb25lbnQpOworICAgICAgICBBU1NFUlRfTkUobUNvbXBvbmVudCwgbnVsbHB0cik7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgQ0hFQ0tfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtR3JhcGhpY0FsbG9jYXRvciksCisgICAgICAgICAgICAgICAgIEMyX09LKTsKKyAgICAgICAgbUdyYXBoaWNQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUdyYXBoaWNBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xJZCsrKTsKKyAgICAgICAgQVNTRVJUX05FKG1HcmFwaGljUG9vbCwgbnVsbHB0cik7CisKKyAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOworICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7CisgICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7CisgICAgICAgIH07CisKKyAgICAgICAgY29uc3QgU3RyaW5nVG9OYW1lIGtTdHJpbmdUb05hbWVbXSA9IHsKKyAgICAgICAgICAgIHsiaDI2MyIsIGgyNjN9LCB7ImF2YyIsIGF2Y30sIHsibXBlZzQiLCBtcGVnNH0sCisgICAgICAgICAgICB7ImhldmMiLCBoZXZjfSwgeyJ2cDgiLCB2cDh9LCB7InZwOSIsIHZwOX0sCisgICAgICAgIH07CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IGtOdW1TdHJpbmdUb05hbWUgPQorICAgICAgICAgICAgc2l6ZW9mKGtTdHJpbmdUb05hbWUpIC8gc2l6ZW9mKGtTdHJpbmdUb05hbWVbMF0pOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHN1YnN0cmluZzsKKyAgICAgICAgc3RkOjpzdHJpbmcgY29tcDsKKyAgICAgICAgc3Vic3RyaW5nID0gc3RkOjpzdHJpbmcoZ0Vudi0+Z2V0Q29tcG9uZW50KCkpOworICAgICAgICAvKiBUT0RPOiBiZXR0ZXIgYXBwcm9hY2ggdG8gZmluZCB0aGUgY29tcG9uZW50ICovCisgICAgICAgIC8qICJjMi5hbmRyb2lkLiIgPT4gMTF0aCBwb3NpdGlvbiAqLworICAgICAgICBzaXplX3QgcG9zID0gMTE7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdWJzdHJpbmcuZmluZCgiLmVuY29kZXIiLCBwb3MpOworICAgICAgICBjb21wID0gc3Vic3RyaW5nLnN1YnN0cihwb3MsIGxlbiAtIHBvcyk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU3RyaW5nVG9OYW1lOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChjb21wLmNfc3RyKCksIGtTdHJpbmdUb05hbWVbaV0uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBtQ29tcE5hbWUgPSBrU3RyaW5nVG9OYW1lW2ldLkNvbXBOYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Fb3MgPSBmYWxzZTsKKyAgICAgICAgbUNzZCA9IGZhbHNlOworICAgICAgICBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgICAgICBtRmFpbGVkV29ya1JlY2VpdmVkID0gMDsKKyAgICAgICAgaWYgKG1Db21wTmFtZSA9PSB1bmtub3duX2NvbXApIG1EaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIGlmIChtRGlzYWJsZVRlc3QpIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgRGlzYWJsZWQgXG4iOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db21wb25lbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaWYgKDo6dGVzdGluZzo6VGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKKyAgICAgICAgICAgIG1Db21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1Db21wb25lbnQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIFN1cGVyOjpUZWFyRG93bigpOworICAgIH0KKworICAgIGJvb2wgc2V0dXBDb25maWdQYXJhbShpbnQzMl90IG5XaWR0aCwgaW50MzJfdCBuSGVpZ2h0KTsKKworICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByb2Nlc3Mgb25Xb3JrRG9uZSByZWNlaXZlZCBieSBMaXN0ZW5lcgorICAgIHZvaWQgaGFuZGxlV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgIGlmICghd29yay0+d29ya2xldHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmICh3b3JrLT5yZXN1bHQgIT0gQzJfT0spIG1GYWlsZWRXb3JrUmVjZWl2ZWQrKzsKKyAgICAgICAgICAgICAgICB3b3JrRG9uZShtQ29tcG9uZW50LCB3b3JrLCBtRmx1c2hlZEluZGljZXMsIG1RdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRW9zLCBtQ3NkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnVtIHN0YW5kYXJkQ29tcCB7CisgICAgICAgIGgyNjMsCisgICAgICAgIGF2YywKKyAgICAgICAgbXBlZzQsCisgICAgICAgIGhldmMsCisgICAgICAgIHZwOCwKKyAgICAgICAgdnA5LAorICAgICAgICB1bmtub3duX2NvbXAsCisgICAgfTsKKworICAgIGJvb2wgbUVvczsKKyAgICBib29sIG1Dc2Q7CisgICAgYm9vbCBtRGlzYWJsZVRlc3Q7CisgICAgYm9vbCBtQ29uZmlnOworICAgIHN0YW5kYXJkQ29tcCBtQ29tcE5hbWU7CisgICAgdWludDMyX3QgbUZyYW1lc1JlY2VpdmVkOworICAgIHVpbnQzMl90IG1GYWlsZWRXb3JrUmVjZWl2ZWQ7CisKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1GbHVzaGVkSW5kaWNlczsKKworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xJZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1HcmFwaGljUG9vbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1HcmFwaGljQWxsb2NhdG9yOworCisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9Cit9OworCit2b2lkIHZhbGlkYXRlQ29tcG9uZW50KAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGJvb2wmIGRpc2FibGVUZXN0KSB7CisgICAgLy8gVmFsaWRhdGUgaXRzIGEgQzIgQ29tcG9uZW50CisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImMyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIk5vdCBhIGMyIGNvbXBvbmVudCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBpdHMgbm90IGFuIGVuY29kZXIgYW5kIHRoZSBjb21wb25lbnQgdG8gYmUgdGVzdGVkIGlzIHZpZGVvCisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImRlY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgRW5jb2RlciwgZ2l2ZW4gRGVjb2RlciIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0KKyAgICAgICAgY29tcG9uZW50LT5xdWVyeSh7fSwge0MyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LICYmIHF1ZXJpZWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkID0+ICVkIiwgYzJlcnIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGlucHV0RG9tYWluID0KKyAgICAgICAgICAgICgoQzJTdHJlYW1NZWRpYVR5cGVTZXR0aW5nOjppbnB1dCopcXVlcmllZFswXS5nZXQoKSktPm0udmFsdWU7CisgICAgICAgIGlmIChpbnB1dERvbWFpbi5maW5kKCJ2aWRlby8iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIFZpZGVvIENvbXBvbmVudCIpOworICAgICAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVmFsaWRhdGVzIGNvbXBvbmVudCBuYW1lCisgICAgaWYgKGNvbXBOYW1lID09IENvZGVjMlZpZGVvRW5jSGlkbFRlc3Q6OnVua25vd25fY29tcCkgeworICAgICAgICBBTE9HRSgiQ29tcG9uZW50IEluVmFsaWQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJDb21wb25lbnQgVmFsaWQiKTsKK30KKworLy8gU2V0IERlZmF1bHQgY29uZmlnIHBhcmFtLgorYm9vbCBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0OjpzZXR1cENvbmZpZ1BhcmFtKGludDMyX3QgbldpZHRoLCBpbnQzMl90IG5IZWlnaHQpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0IGlucHV0U2l6ZSgwdSwgbldpZHRoLCBuSGVpZ2h0KTsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gY29uZmlnUGFyYW17JmlucHV0U2l6ZX07CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgbUNvbXBvbmVudC0+Y29uZmlnKGNvbmZpZ1BhcmFtLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIGlmIChzdGF0dXMgPT0gQzJfT0sgJiYgZmFpbHVyZXMuc2l6ZSgpID09IDB1KSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIExvb2tVcFRhYmxlIG9mIGNsaXBzIGZvciBjb21wb25lbnQgdGVzdGluZwordm9pZCBHZXRVUkxGb3JDb21wb25lbnQoY2hhciogVVJMKSB7CisgICAgc3RyY2F0KFVSTCwgImJiYl8zNTJ4Mjg4XzQyMHBfMzBmcHNfMzJmcmFtZXMueXV2Iik7Cit9CisKK3ZvaWQgZW5jb2RlTkZyYW1lcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjptdXRleCAmcXVldWVMb2NrLCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4mIGZsdXNoZWRJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIGdyYXBoaWNQb29sLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0mIGVsZVN0cmVhbSwgdWludDMyX3QgZnJhbWVJRCwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuRnJhbWVzLCB1aW50MzJfdCBuV2lkdGgsIGludDMyX3QgbkhlaWdodCwKKyAgICAgICAgICAgICAgICAgICBib29sIGZsdXNoZWQgPSBmYWxzZSxib29sIHNpZ25hbEVPUyA9IHRydWUpIHsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisKKyAgICB1aW50MzJfdCBtYXhSZXRyeSA9IDA7CisgICAgaW50IGJ5dGVzQ291bnQgPSBuV2lkdGggKiBuSGVpZ2h0ICogMyA+PiAxOworICAgIGludDMyX3QgdGltZXN0YW1wSW5jciA9IEVOQ09ERVJfVElNRVNUQU1QX0lOQ1JFTUVOVDsKKyAgICB1aW50NjRfdCB0aW1lc3RhbXAgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChuRnJhbWVzID09IDApIGJyZWFrOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgICAgIHdoaWxlICghd29yayAmJiAobWF4UmV0cnkgPCBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBpZiAoIXdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29yay5zd2FwKHdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICB3b3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghd29yayAmJiAobWF4UmV0cnkgPj0gTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJXYWl0IGZvciBnZW5lcmF0aW5nIEMyV29yayBleGNlZWRlZCB0aW1lb3V0IjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2lnbmFsRU9TICYmIChuRnJhbWVzID09IDEpKQorICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgaWYgKGZsdXNoZWQpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IFNZTkNfRlJBTUU7CisgICAgICAgICAgICBmbHVzaGVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IGZyYW1lSUQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjayhmcmFtZUlEKTsKKyAgICAgICAgfQorICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKW1hbGxvYyhieXRlc0NvdW50KTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpOworICAgICAgICBtZW1zZXQoZGF0YSwgMCwgYnl0ZXNDb3VudCk7CisgICAgICAgIGlmIChlbGVTdHJlYW0uaXNfb3BlbigpKSB7CisgICAgICAgICAgICBlbGVTdHJlYW0ucmVhZChkYXRhLCBieXRlc0NvdW50KTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uZ2NvdW50KCksIGJ5dGVzQ291bnQpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisgICAgICAgIEFTU0VSVF9FUSgKKyAgICAgICAgICAgIEMyX09LLAorICAgICAgICAgICAgZ3JhcGhpY1Bvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgICAgIG5XaWR0aCwgbkhlaWdodCwgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLAorICAgICAgICAgICAgICAgIHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSwgJmJsb2NrKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGJsb2NrKTsKKyAgICAgICAgLy8gR3JhcGhpYyBWaWV3CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDMkdyYXBoaWNCbG9jazo6bWFwKCkgZmFpbGVkIDogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90KiBwWSA9IHZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgdWludDhfdCogcFUgPSB2aWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgIHVpbnQ4X3QqIHBWID0gdmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworCisgICAgICAgIG1lbWNweShwWSwgZGF0YSwgbldpZHRoICogbkhlaWdodCk7CisgICAgICAgIG1lbWNweShwVSwgZGF0YSArIG5XaWR0aCAqIG5IZWlnaHQsIChuV2lkdGggKiBuSGVpZ2h0ID4+IDIpKTsKKyAgICAgICAgbWVtY3B5KHBWLCBkYXRhICsgKG5XaWR0aCAqIG5IZWlnaHQgKiA1ID4+IDIpLCBuV2lkdGggKiBuSGVpZ2h0ID4+IDIpOworCisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IEdyYXBoaWNCdWZmZXIoYmxvY2spKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBmcmVlKGRhdGEpOworCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIC8vIERPIFRIRSBFTkNPRElORworICAgICAgICBBU1NFUlRfRVEoY29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisgICAgICAgIEFMT0dWKCJGcmFtZSAjJWQgc2l6ZSA9ICVkIHF1ZXVlZCIsIGZyYW1lSUQsIGJ5dGVzQ291bnQpOworICAgICAgICBuRnJhbWVzLS07CisgICAgICAgIHRpbWVzdGFtcCArPSB0aW1lc3RhbXBJbmNyOworICAgICAgICBmcmFtZUlEKys7CisgICAgICAgIG1heFJldHJ5ID0gMDsKKyAgICB9Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LCB2YWxpZGF0ZUNvbXBOYW1lKSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFMT0dWKCJDaGVja3MgaWYgdGhlIGdpdmVuIGNvbXBvbmVudCBpcyBhIHZhbGlkIHZpZGVvIGNvbXBvbmVudCIpOworICAgIHZhbGlkYXRlQ29tcG9uZW50KG1Db21wb25lbnQsIG1Db21wTmFtZSwgbURpc2FibGVUZXN0KTsKKyAgICBBU1NFUlRfRVEobURpc2FibGVUZXN0LCBmYWxzZSk7Cit9CisKK2NsYXNzIENvZGVjMlZpZGVvRW5jRW5jb2RlVGVzdCA6IHB1YmxpYyBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGJvb2w+IHsKK307CisKK1RFU1RfUChDb2RlYzJWaWRlb0VuY0VuY29kZVRlc3QsIEVuY29kZVRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiRW5jb2RlcyBpbnB1dCBmaWxlIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgY2hhciBtVVJMWzUxMl07CisgICAgaW50MzJfdCBuV2lkdGggPSBFTkNfREVGQVVMVF9GUkFNRV9XSURUSDsKKyAgICBpbnQzMl90IG5IZWlnaHQgPSBFTkNfREVGQVVMVF9GUkFNRV9IRUlHSFQ7CisgICAgYm9vbCBzaWduYWxFT1MgPSBHZXRQYXJhbSgpOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtVVJMKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpIDw8IG1VUkwgPDwgIiBmaWxlIG5vdCBmb3VuZCI7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworCisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG5XaWR0aCwgbkhlaWdodCkpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1HcmFwaGljUG9vbCwgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIDAsIEVOQ19OVU1fRlJBTUVTLCBuV2lkdGgsIG5IZWlnaHQsIGZhbHNlLCBzaWduYWxFT1MpKTsKKworICAgIC8vIElmIEVPUyBpcyBub3Qgc2VudCwgc2VuZGluZyBlbXB0eSBpbnB1dCB3aXRoIEVPUyBmbGFnCisgICAgdWludDMyX3QgaW5wdXRGcmFtZXMgPSBFTkNfTlVNX0ZSQU1FUzsKKyAgICBpZiAoIXNpZ25hbEVPUykgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCAxKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgdGVzdElucHV0QnVmZmVyKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSwgZmFsc2UpKTsKKyAgICAgICAgaW5wdXRGcmFtZXMgKz0gMTsKKyAgICB9CisKKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgQUxPR0QoIldhaXRpbmcgZm9yIGlucHV0IGNvbnN1bXB0aW9uIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBpZiAobUZyYW1lc1JlY2VpdmVkICE9IGlucHV0RnJhbWVzKSB7CisgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgY291bnQgYW5kIE91dHB1dCBidWZmZXIgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR0UoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAlZCIsIG1GcmFtZXNSZWNlaXZlZCwKKyAgICAgICAgICAgICAgaW5wdXRGcmFtZXMpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgaWYgKCFtQ3NkICYmIChtQ29tcE5hbWUgIT0gdnA4ICYmIG1Db21wTmFtZSAhPSB2cDkpKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiQ1NEIEJ1ZmZlciBub3QgcmVjZWl2ZWQiOworICAgIH0KKworICAgIGlmIChtQ3NkICYmIChtQ29tcE5hbWUgPT0gdnA4IHx8IG1Db21wTmFtZSA9PSB2cDkpKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiQ1NEIEJ1ZmZlciBub3QgZXhwZWN0ZWQiOworICAgIH0KKworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworLy8gRW5jb2RlVGVzdCB3aXRoIEVPUyAvIE5vIEVPUworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoRW5jb2RlVGVzdHdpdGhFT1MsIENvZGVjMlZpZGVvRW5jRW5jb2RlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKHRydWUsIGZhbHNlKSk7CisKK1RFU1RfRihDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LCBFT1NUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgZW1wdHkgaW5wdXQgYnVmZmVyIHdpdGggRU9TIGZsYWciKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgbVdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJtV29ya1F1ZXVlIEVtcHR5IGlzIG5vdCBleHBlY3RlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHRlc3QiKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IDA7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gMDsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisgICAgdWludDMyX3QgcXVldWVTaXplOworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgcXVldWVTaXplID0gbVdvcmtRdWV1ZS5zaXplKCk7CisgICAgICAgIGlmIChxdWV1ZVNpemUgPCBNQVhfSU5QVVRfQlVGRkVSUykgeworICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgRmx1c2hUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgUmVxdWVzdCBmb3IgZmx1c2giKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgY2hhciBtVVJMWzUxMl07CisgICAgaW50MzJfdCBuV2lkdGggPSBFTkNfREVGQVVMVF9GUkFNRV9XSURUSDsKKyAgICBpbnQzMl90IG5IZWlnaHQgPSBFTkNfREVGQVVMVF9GUkFNRV9IRUlHSFQ7CisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtVVJMKTsKKworICAgIGlmICghc2V0dXBDb25maWdQYXJhbShuV2lkdGgsIG5IZWlnaHQpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKworICAgIC8vIFNldHRpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9uCisgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CisgICAgdWludDMyX3QgbnVtRnJhbWVzRmx1c2hlZCA9IDEwOworICAgIHVpbnQzMl90IG51bUZyYW1lcyA9IEVOQ19OVU1fRlJBTUVTOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCBudW1GcmFtZXNGbHVzaGVkLCBuV2lkdGgsIG5IZWlnaHQpKTsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOworICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgIG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB1aW50NjRfdCBmcmFtZUluZGV4OworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPSBzdGQ6OmZpbmQoCisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmJlZ2luKCksIG1GbHVzaGVkSW5kaWNlcy5lbmQoKSwgZnJhbWVJbmRleCk7CisgICAgICAgICAgICBpZiAoIW1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgKGZyYW1lSW5kZXhJdCAhPSBtRmx1c2hlZEluZGljZXMuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXNGbHVzaGVkLCBudW1GcmFtZXMgLSBudW1GcmFtZXNGbHVzaGVkLAorICAgICAgICAgICAgICAgICAgICAgIG5XaWR0aCwgbkhlaWdodCwgdHJ1ZSkpOworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGVyciA9IG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB7CisgICAgICAgIC8vVXBkYXRlIG1GbHVzaGVkSW5kaWNlcyBiYXNlZCBvbiB0aGUgaW5kZXggcmVjZWl2ZWQgZnJvbSBmbHVzaCgpCisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgICAgICAgICAgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgZnJhbWVJbmRleEl0ID0gc3RkOjpmaW5kKAorICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LCBJbnZhbGlkQnVmZmVyVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0cyBmZWVkaW5nIGxhcmdlci9zbWFsbGVyIGlucHV0IGJ1ZmZlciIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIGludDMyX3QgbldpZHRoID0gRU5DX0RFRkFVTFRfRlJBTUVfV0lEVEggLyAyOworICAgIGludDMyX3QgbkhlaWdodCA9IEVOQ19ERUZBVUxUX0ZSQU1FX0hFSUdIVCAvIDI7CisKKyAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obldpZHRoLCBuSGVpZ2h0KSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAxLCBuV2lkdGgsIG5IZWlnaHQsIGZhbHNlLCBmYWxzZSkpOworCisgICAgLy8gRmVlZCBsYXJnZXIgaW5wdXQgYnVmZmVyLgorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1HcmFwaGljUG9vbCwgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIG5XaWR0aCoyLCBuSGVpZ2h0KjIsIGZhbHNlLCBmYWxzZSkpOworCisgICAgLy8gRmVlZCBzbWFsbGVyIGlucHV0IGJ1ZmZlci4KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAyLCAxLCBuV2lkdGgvMiwgbkhlaWdodC8yLCBmYWxzZSwgdHJ1ZSkpOworCisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIEFMT0dEKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworCisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSAzKSB7CisgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgY291bnQgYW5kIE91dHB1dCBidWZmZXIgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR0UoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAzIiwgbUZyYW1lc1JlY2VpdmVkKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKworICAgIGlmIChtRmFpbGVkV29ya1JlY2VpdmVkID09IDApIHsKKyAgICAgICAgQUxPR0UoIkV4cGVjdGVkIGZhaWxlZCBmcmFtZSBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HRSgiZmFpbGVkRnJhbWVzUmVjZWl2ZWQgOiAlZCIsIG1GYWlsZWRXb3JrUmVjZWl2ZWQpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitjbGFzcyBDb2RlYzJWaWRlb0VuY1Jlc29sdXRpb25UZXN0IDogcHVibGljIENvZGVjMlZpZGVvRW5jSGlkbFRlc3QsCisgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4gPiB7Cit9OworCitURVNUX1AoQ29kZWMyVmlkZW9FbmNSZXNvbHV0aW9uVGVzdCwgUmVzb2x1dGlvblRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgZW5jb2RpbmcgYXQgZGlmZmVyZW50IHJlc29sdXRpb25zIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CisgICAgaW50MzJfdCBuV2lkdGggPSBHZXRQYXJhbSgpLmZpcnN0OworICAgIGludDMyX3QgbkhlaWdodCA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIEFMT0dEKCJUcnlpbmcgZW5jb2RlIGZvciB3aWR0aCAlZCBoZWlnaHQgJWQiLCBuV2lkdGgsIG5IZWlnaHQpOworICAgIG1Fb3MgPSBmYWxzZTsKKworICAgIGlmICghc2V0dXBDb25maWdQYXJhbShuV2lkdGgsIG5IZWlnaHQpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1HcmFwaGljUG9vbCwgZWxlU3RyZWFtLCAwLAorICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTlBVVF9CVUZGRVJTLCBuV2lkdGgsIG5IZWlnaHQpKTsKKworICAgIEFMT0dEKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworCisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cmVzZXQoKSwgQzJfT0spOworfQorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTm9uU3RkU2l6ZXMsIENvZGVjMlZpZGVvRW5jUmVzb2x1dGlvblRlc3QsIDo6dGVzdGluZzo6VmFsdWVzKAorICAgIHN0ZDo6bWFrZV9wYWlyKDUyLCAxOCksCisgICAgc3RkOjptYWtlX3BhaXIoMzY1LCAzNjUpLAorICAgIHN0ZDo6bWFrZV9wYWlyKDQ4NCwgMzYyKSwKKyAgICBzdGQ6Om1ha2VfcGFpcigyNDQsIDQ4OCkpKTsKKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGdFbnYtPmluaXQoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQzIgVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9tZWRpYV9jMl92aWRlb19oaWRsX3Rlc3RfY29tbW9uLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vbWVkaWFfYzJfdmlkZW9faGlkbF90ZXN0X2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNDU1NTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vbWVkaWFfYzJfdmlkZW9faGlkbF90ZXN0X2NvbW1vbi5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0MyX1ZJREVPX0hJRExfVEVTVF9DT01NT05fSAorI2RlZmluZSBNRURJQV9DMl9WSURFT19ISURMX1RFU1RfQ09NTU9OX0gKKworI2RlZmluZSBFTkNPREVSX1RJTUVTVEFNUF9JTkNSRU1FTlQgNDAwMDAKKyNkZWZpbmUgRU5DX05VTV9GUkFNRVMgMzIKKyNkZWZpbmUgRU5DX0RFRkFVTFRfRlJBTUVfV0lEVEggMzUyCisjZGVmaW5lIEVOQ19ERUZBVUxUX0ZSQU1FX0hFSUdIVCAyODgKKyNkZWZpbmUgTUFYX0lURVJBVElPTlMgMTI4CisKKy8qCisgKiBDb21tb24gdmlkZW8gdXRpbHMKKyAqLworCisKKyNlbmRpZiAgLy8gTUVESUFfQzJfVklERU9fSElETF9URVNUX0NPTU1PTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYTQ5OGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvQW5kcm9pZC5icApAQCAtMCwwICsxLDM4IEBACitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliY29kZWMyX2NsaWVudCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJjbGllbnQuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl9oaWRsQDEuMCIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlciIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfaGlkbEAxLjAiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICBdLAorCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2NsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EyZTU0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwCkBAIC0wLDAgKzEsMTMyNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzJDbGllbnQiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorCisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzEuMC9IMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudExpc3RlbmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbmZpZ3VyYWJsZS5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6dXRpbHM7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKKy8vIGMyX3N0YXR1c190IHZhbHVlIHRoYXQgY29ycmVzcG9uZHMgdG8gaHdiaW5kZXIgdHJhbnNhY3Rpb24gZmFpbHVyZS4KK2NvbnN0ZXhwciBjMl9zdGF0dXNfdCBDMl9UUkFOU0FDVElPTl9GQUlMRUQgPSBDMl9DT1JSVVBURUQ7CisKKy8vIExpc3Qgb2Yga25vd24gSUNvbXBvbmVudFN0b3JlIHNlcnZpY2VzIGluIHRoZSBkZWNyZWFzaW5nIG9yZGVyIG9mIHByZWZlcmVuY2UuCitjb25zdGV4cHIgY29uc3QgY2hhcioga0NsaWVudE5hbWVzW10gPSB7CisgICAgICAgICJkZWZhdWx0IiwKKyAgICAgICAgInNvZnR3YXJlIiwKKyAgICB9OworCisvLyBOdW1iZXIgb2Yga25vd24gSUNvbXBvbmVudFN0b3JlIHNlcnZpY2VzLgorY29uc3RleHByIHNpemVfdCBrTnVtQ2xpZW50cyA9IHN0ZDo6ZXh0ZW50PGRlY2x0eXBlKGtDbGllbnROYW1lcyk+Ojp2YWx1ZTsKKwordHlwZWRlZiBzdGQ6OmFycmF5PHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+LCBrTnVtQ2xpZW50cz4gQ2xpZW50TGlzdDsKKworLy8gQ29udmVuaWVuY2UgbWV0aG9kcyB0byBvYnRhaW4ga25vd24gY2xpZW50cy4KK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGdldENsaWVudChzaXplX3QgaW5kZXgpIHsKKyAgICB1aW50MzJfdCBzZXJ2aWNlTWFzayA9IDo6YW5kcm9pZDo6YmFzZTo6R2V0VWludFByb3BlcnR5KAorICAgICAgICAgICAgImRlYnVnLm1lZGlhLmNvZGVjMiIsIHVpbnQzMl90KDApKTsKKyAgICByZXR1cm4gQ29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgICAgIGtDbGllbnROYW1lc1tpbmRleF0sCisgICAgICAgICAgICAoc2VydmljZU1hc2sgJiAoMSA8PCBpbmRleCkpICE9IDApOworfQorCitDbGllbnRMaXN0IGdldENsaWVudExpc3QoKSB7CisgICAgQ2xpZW50TGlzdCBsaXN0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICBsaXN0W2ldID0gZ2V0Q2xpZW50KGkpOworICAgIH0KKyAgICByZXR1cm4gbGlzdDsKK30KKworfSAvLyB1bm5hbWVkCisKKy8vIENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudAorCitjb25zdCBDMlN0cmluZyYgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpnZXROYW1lKCkgY29uc3QgeworICAgIHJldHVybiBtTmFtZTsKK30KKworQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpDb2RlYzJDb25maWd1cmFibGVDbGllbnQoCisgICAgICAgIGNvbnN0IHNwPElDb25maWd1cmFibGU+JiBiYXNlKQorICAgICAgOiBtQmFzZXtiYXNlfSwKKyAgICAgICAgbU5hbWV7W2Jhc2VdKCkgLT4gQzJTdHJpbmcgeworICAgICAgICAgICAgICAgIEMyU3RyaW5nIG91dE5hbWU7CisgICAgICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gYmFzZS0+Z2V0TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFsmb3V0TmFtZV0oY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXROYW1lID0gbmFtZS5jX3N0cigpOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zU3RhdHVzLmlzT2soKSA/IG91dE5hbWUgOiAiIjsKKyAgICAgICAgICAgIH0oKX0geworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDb25maWd1cmFibGVDbGllbnQ6OnF1ZXJ5KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0IHsKKyAgICBoaWRsX3ZlYzxQYXJhbUluZGV4PiBpbmRpY2VzKAorICAgICAgICAgICAgc3RhY2tQYXJhbXMuc2l6ZSgpICsgaGVhcFBhcmFtSW5kaWNlcy5zaXplKCkpOworICAgIHNpemVfdCBudW1JbmRpY2VzID0gMDsKKyAgICBmb3IgKEMyUGFyYW0qIGNvbnN0JiBzdGFja1BhcmFtIDogc3RhY2tQYXJhbXMpIHsKKyAgICAgICAgaWYgKCFzdGFja1BhcmFtKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXJ5IC0tIG51bGwgc3RhY2sgcGFyYW0gZW5jb3VudGVyZWQuIjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGluZGljZXNbbnVtSW5kaWNlcysrXSA9IHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KHN0YWNrUGFyYW0tPmluZGV4KCkpOworICAgIH0KKyAgICBzaXplX3QgbnVtU3RhY2tJbmRpY2VzID0gbnVtSW5kaWNlczsKKyAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4JiBpbmRleCA6IGhlYXBQYXJhbUluZGljZXMpIHsKKyAgICAgICAgaW5kaWNlc1tudW1JbmRpY2VzKytdID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxQYXJhbUluZGV4PihzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5kZXgpKTsKKyAgICB9CisgICAgaW5kaWNlcy5yZXNpemUobnVtSW5kaWNlcyk7CisgICAgaWYgKGhlYXBQYXJhbXMpIHsKKyAgICAgICAgaGVhcFBhcmFtcy0+cmVzZXJ2ZShoZWFwUGFyYW1zLT5zaXplKCkgKyBudW1JbmRpY2VzKTsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5xdWVyeSgKKyAgICAgICAgICAgIGluZGljZXMsCisgICAgICAgICAgICBtYXlCbG9jayA9PSBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICBbJnN0YXR1cywgJm51bVN0YWNrSW5kaWNlcywgJnN0YWNrUGFyYW1zLCBoZWFwUGFyYW1zXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsIGNvbnN0IFBhcmFtcyYgcCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LICYmIHN0YXR1cyAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnkgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbVBvaW50ZXJzOworICAgICAgICAgICAgICAgIGlmICghcGFyc2VQYXJhbXNCbG9iKCZwYXJhbVBvaW50ZXJzLCBwKSkgeworICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeSAtLSBlcnJvciB3aGlsZSBwYXJzaW5nIHBhcmFtcy4iOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IHBhcmFtUG9pbnRlcnMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IHBhcmFtUG9pbnRlcnMuZW5kKCk7ICkgeworICAgICAgICAgICAgICAgICAgICBDMlBhcmFtKiBwYXJhbVBvaW50ZXIgPSAqaXQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChudW1TdGFja0luZGljZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAtLW51bVN0YWNrSW5kaWNlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1Qb2ludGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJxdWVyeSAtLSBudWxsIHN0YWNrIHBhcmFtLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgc3RhY2tQYXJhbXMuc2l6ZSgpICYmICFzdGFja1BhcmFtc1tpXTsgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gc3RhY2tQYXJhbXMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnkgLS0gdW5leHBlY3RlZCBlcnJvci4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tQYXJhbXNbaV0tPmluZGV4KCkgIT0gcGFyYW1Qb2ludGVyLT5pbmRleCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJxdWVyeSAtLSBwYXJhbSBza2lwcGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmRleCA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhY2tQYXJhbXNbaV0tPmluZGV4KCkgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrUGFyYW1zW2krK10tPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2tQYXJhbXNbaSsrXS0+dXBkYXRlRnJvbSgqcGFyYW1Qb2ludGVyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnkgLS0gcGFyYW0gdXBkYXRlIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5kZXggPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHBhcmFtUG9pbnRlci0+aW5kZXgoKSA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnkgLS0gbnVsbCBoZWFwIHBhcmFtLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGVhcFBhcmFtcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnkgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBleHRyYSBzdGFjayBwYXJhbS4iOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwUGFyYW1zLT5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KCpwYXJhbVBvaW50ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5IC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDb25maWd1cmFibGVDbGllbnQ6OmNvbmZpZygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIHsKKyAgICBQYXJhbXMgaGlkbFBhcmFtczsKKyAgICBpZiAoIWNyZWF0ZVBhcmFtc0Jsb2IoJmhpZGxQYXJhbXMsIHBhcmFtcykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY29uZmlnIC0tIGJhZCBpbnB1dC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmNvbmZpZygKKyAgICAgICAgICAgIGhpZGxQYXJhbXMsCisgICAgICAgICAgICBtYXlCbG9jayA9PSBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICBbJnN0YXR1cywgJnBhcmFtcywgZmFpbHVyZXNdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8U2V0dGluZ1Jlc3VsdD4gZiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyYW1zJiBvKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0sgJiYgc3RhdHVzICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJjb25maWcgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzaXplX3QgaSA9IGZhaWx1cmVzLT5zaXplKCk7CisgICAgICAgICAgICAgICAgZmFpbHVyZXMtPnJlc2l6ZShpICsgZi5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgU2V0dGluZ1Jlc3VsdCYgc2YgOiBmKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KCYoKmZhaWx1cmVzKVtpKytdLCBzZikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgImNvbmZpZyAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnZhbGlkIFNldHRpbmdSZXN1bHQgcmV0dXJuZWQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXVwZGF0ZVBhcmFtc0Zyb21CbG9iKHBhcmFtcywgbykpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiY29uZmlnIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiZmFpbGVkIHRvIHBhcnNlIHJldHVybmVkIHBhcmFtcy4iOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY29uZmlnIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDb25maWd1cmFibGVDbGllbnQ6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiogY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgLy8gVE9ETzogQ2FjaGUgYW5kIHF1ZXJ5IHByb3Blcmx5IQorICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWluKCksCisgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCksCisgICAgICAgICAgICBbJnN0YXR1cywgcGFyYW1zXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFBhcmFtRGVzY3JpcHRvcj4mIHApIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeVN1cHBvcnRlZFBhcmFtcyAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSBwYXJhbXMtPnNpemUoKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnJlc2l6ZShpICsgcC5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgUGFyYW1EZXNjcmlwdG9yJiBzcCA6IHApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmpjcHkoJigqcGFyYW1zKVtpKytdLCBzcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5U3VwcG9ydGVkUGFyYW1zIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImludmFsaWQgcmV0dXJuZWQgUGFyYW1EZXNjcmlwdG9yLiI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeVN1cHBvcnRlZFBhcmFtcyAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgZmllbGRzLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCB7CisgICAgaGlkbF92ZWM8RmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gaW5GaWVsZHMoZmllbGRzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKCFvYmpjcHkoJmluRmllbGRzW2ldLCBmaWVsZHNbaV0pKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeVN1cHBvcnRlZFZhbHVlcyAtLSBiYWQgaW5wdXQiOworICAgICAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBpbkZpZWxkcywKKyAgICAgICAgICAgIG1heUJsb2NrID09IEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmaW5GaWVsZHMsICZmaWVsZHNdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8RmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdD4mIHIpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeVN1cHBvcnRlZFZhbHVlcyAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHIuc2l6ZSgpICE9IGZpZWxkcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dCBhbmQgb3V0cHV0IGxpc3RzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGF2ZSBkaWZmZXJlbnQgc2l6ZXMuIjsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KCZmaWVsZHNbaV0sIGluRmllbGRzW2ldLCByW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCByZXR1cm5lZCB2YWx1ZS4iOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8vIENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpIaWRsTGlzdGVuZXIKK3N0cnVjdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6SGlkbExpc3RlbmVyIDogcHVibGljIElDb21wb25lbnRMaXN0ZW5lciB7CisgICAgc3RkOjp3ZWFrX3B0cjxDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgICBzdGQ6OndlYWtfcHRyPExpc3RlbmVyPiBiYXNlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25Xb3JrRG9uZShjb25zdCBXb3JrQnVuZGxlJiB3b3JrQnVuZGxlKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zOworICAgICAgICBpZiAoIW9iamNweSgmd29ya0l0ZW1zLCB3b3JrQnVuZGxlKSkgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25Xb3JrRG9uZSAtLSByZWNlaXZlZCBjb3JydXB0ZWQgV29ya0J1bmRsZS4iOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICAvLyByZWxlYXNlIGlucHV0IGJ1ZmZlcnMgcG90ZW50aWFsbHkgaGVsZCBieSB0aGUgY29tcG9uZW50IGZyb20gcXVldWUKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBzdHJvbmdDb21wb25lbnQgPQorICAgICAgICAgICAgICAgIGNvbXBvbmVudC5sb2NrKCk7CisgICAgICAgIGlmIChzdHJvbmdDb21wb25lbnQpIHsKKyAgICAgICAgICAgIHN0cm9uZ0NvbXBvbmVudC0+aGFuZGxlT25Xb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBiYXNlLmxvY2soKSkgeworICAgICAgICAgICAgbGlzdGVuZXItPm9uV29ya0RvbmUoY29tcG9uZW50LCB3b3JrSXRlbXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25Xb3JrRG9uZSAtLSBsaXN0ZW5lciBkaWVkLiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvblRyaXBwZWQoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxTZXR0aW5nUmVzdWx0PiYgc2V0dGluZ1Jlc3VsdHMpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGMyU2V0dGluZ1Jlc3VsdHMoCisgICAgICAgICAgICAgICAgc2V0dGluZ1Jlc3VsdHMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzZXR0aW5nUmVzdWx0cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4gYzJTZXR0aW5nUmVzdWx0OworICAgICAgICAgICAgaWYgKCFvYmpjcHkoJmMyU2V0dGluZ1Jlc3VsdCwgc2V0dGluZ1Jlc3VsdHNbaV0pKSB7CisgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25UcmlwcGVkIC0tIHJlY2VpdmVkIGNvcnJ1cHRlZCBTZXR0aW5nUmVzdWx0LiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMyU2V0dGluZ1Jlc3VsdHNbaV0gPSBzdGQ6Om1vdmUoYzJTZXR0aW5nUmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gYmFzZS5sb2NrKCkpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vblRyaXBwZWQoY29tcG9uZW50LCBjMlNldHRpbmdSZXN1bHRzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIm9uVHJpcHBlZCAtLSBsaXN0ZW5lciBkaWVkLiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkVycm9yKFN0YXR1cyBzLCB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAib25FcnJvciAtLSIKKyAgICAgICAgICAgICAgICAgICA8PCAiIHN0YXR1cyA9ICIgPDwgcworICAgICAgICAgICAgICAgICAgIDw8ICIsIGVycm9yQ29kZSA9ICIgPDwgZXJyb3JDb2RlCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICBpZiAoc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiBsaXN0ZW5lciA9IGJhc2UubG9jaygpKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25FcnJvcihjb21wb25lbnQsIHMgPT0gU3RhdHVzOjpPSyA/CisgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSA6IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJvbkVycm9yIC0tIGxpc3RlbmVyIGRpZWQuIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uRnJhbWVzUmVuZGVyZWQoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxSZW5kZXJlZEZyYW1lPiYgcmVuZGVyZWRGcmFtZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiBsaXN0ZW5lciA9IGJhc2UubG9jaygpOworICAgICAgICBpZiAoIWxpc3RlbmVyKSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJvbkZyYW1lc1JlbmRlcmVkIC0tIGxpc3RlbmVyIGRpZWQuIjsKKyAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBSZW5kZXJlZEZyYW1lJiByZW5kZXJlZEZyYW1lIDogcmVuZGVyZWRGcmFtZXMpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbkZyYW1lUmVuZGVyZWQoCisgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkRnJhbWUuYnVmZmVyUXVldWVJZCwKKyAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRGcmFtZS5zbG90SWQsCisgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkRnJhbWUudGltZXN0YW1wTnMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPElucHV0QnVmZmVyPiYgaW5wdXRCdWZmZXJzKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gbGlzdGVuZXIgPSBiYXNlLmxvY2soKTsKKyAgICAgICAgaWYgKCFsaXN0ZW5lcikgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCAtLSBsaXN0ZW5lciBkaWVkLiI7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgSW5wdXRCdWZmZXImIGlucHV0QnVmZmVyIDogaW5wdXRCdWZmZXJzKSB7CisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIm9uSW5wdXRCdWZmZXJzUmVsZWFzZWQgLS0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZWNlaXZlZCBkZWF0aCBub3RpZmljYXRpb24gb2YiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpbnB1dCBidWZmZXI6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZnJhbWVJbmRleCA9ICIgPDwgaW5wdXRCdWZmZXIuZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGJ1ZmZlckluZGV4ID0gIiA8PCBpbnB1dEJ1ZmZlci5hcnJheUluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAgICAgbGlzdGVuZXItPm9uSW5wdXRCdWZmZXJEb25lKAorICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5mcmFtZUluZGV4LCBpbnB1dEJ1ZmZlci5hcnJheUluZGV4KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworfTsKKworLy8gQ29kZWMyQ2xpZW50CitDb2RlYzJDbGllbnQ6OkNvZGVjMkNsaWVudChjb25zdCBzcDxJQ29tcG9uZW50U3RvcmU+JiBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc2VydmljZU5hbWUpCisgICAgICA6IENvbmZpZ3VyYWJsZXsKKyAgICAgICAgICAgIFtiYXNlXSgpIC0+IHNwPElDb25maWd1cmFibGU+IHsKKyAgICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHRyYW5zUmVzdWx0KSA6CisgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyOworICAgICAgICAgICAgfSgpCisgICAgICAgIH0sCisgICAgICAgIG1CYXNle2Jhc2V9LAorICAgICAgICBtTGlzdGVke2ZhbHNlfSwKKyAgICAgICAgbVNlcnZpY2VOYW1le3NlcnZpY2VOYW1lfSB7CisgICAgUmV0dXJuPHNwPElDbGllbnRNYW5hZ2VyPj4gdHJhbnNSZXN1bHQgPSBiYXNlLT5nZXRQb29sQ2xpZW50TWFuYWdlcigpOworICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImdldFBvb2xDbGllbnRNYW5hZ2VyIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Ib3N0UG9vbE1hbmFnZXIgPSBzdGF0aWNfY2FzdDxzcDxJQ2xpZW50TWFuYWdlcj4+KHRyYW5zUmVzdWx0KTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Y3JlYXRlQ29tcG9uZW50KAorICAgICAgICBjb25zdCBDMlN0cmluZyYgbmFtZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiogY29uc3QgY29tcG9uZW50KSB7CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgc3A8Q29tcG9uZW50OjpIaWRsTGlzdGVuZXI+IGhpZGxMaXN0ZW5lciA9IG5ldyBDb21wb25lbnQ6OkhpZGxMaXN0ZW5lcnt9OworICAgIGhpZGxMaXN0ZW5lci0+YmFzZSA9IGxpc3RlbmVyOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgaGlkbExpc3RlbmVyLAorICAgICAgICAgICAgQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKSwKKyAgICAgICAgICAgIFsmc3RhdHVzLCBjb21wb25lbnQsIGhpZGxMaXN0ZW5lcl0oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50PiYgYykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+KGMpOworICAgICAgICAgICAgICAgIGhpZGxMaXN0ZW5lci0+Y29tcG9uZW50ID0gKmNvbXBvbmVudDsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNyZWF0ZUNvbXBvbmVudCgiIDw8IG5hbWUuY19zdHIoKQorICAgICAgICAgICAgICAgICAgIDw8ICIpIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNyZWF0ZUNvbXBvbmVudCgiIDw8IG5hbWUuY19zdHIoKQorICAgICAgICAgICAgICAgICAgIDw8ICIpIC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfSBlbHNlIGlmICghKmNvbXBvbmVudCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVDb21wb25lbnQoIiA8PCBuYW1lLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKSAtLSBudWxsIGNvbXBvbmVudC4iOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIHN0YXR1cyA9ICgqY29tcG9uZW50KS0+c2V0RGVhdGhMaXN0ZW5lcigqY29tcG9uZW50LCBsaXN0ZW5lcik7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVDb21wb25lbnQoIiA8PCBuYW1lLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKSAtLSBmYWlsZWQgdG8gc2V0IHVwIGRlYXRoIGxpc3RlbmVyOiAiCisgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisKKyAgICAoKmNvbXBvbmVudCktPm1CdWZmZXJQb29sU2VuZGVyLnNldFJlY2VpdmVyKG1Ib3N0UG9vbE1hbmFnZXIpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Y3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjb25zdCBDMlN0cmluZyYgbmFtZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgWyZzdGF0dXMsIGludGVyZmFjZV0oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50SW50ZXJmYWNlPiYgaSkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW50ZXJmYWNlPihpKTsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNyZWF0ZUludGVyZmFjZSgiIDw8IG5hbWUuY19zdHIoKQorICAgICAgICAgICAgICAgICAgIDw8ICIpIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNyZWF0ZUNvbXBvbmVudCgiIDw8IG5hbWUuY19zdHIoKQorICAgICAgICAgICAgICAgICAgIDw8ICIpIC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpjcmVhdGVJbnB1dFN1cmZhY2UoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U+KiBjb25zdCBpbnB1dFN1cmZhY2UpIHsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmNyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIFsmc3RhdHVzLCBpbnB1dFN1cmZhY2VdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUlucHV0U3VyZmFjZT4mIGkpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICppbnB1dFN1cmZhY2UgPSBzdGQ6Om1ha2Vfc2hhcmVkPElucHV0U3VyZmFjZT4oaSk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVJbnB1dFN1cmZhY2UgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfSBlbHNlIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiY3JlYXRlSW5wdXRTdXJmYWNlIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4mIENvZGVjMkNsaWVudDo6bGlzdENvbXBvbmVudHMoKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBpZiAobUxpc3RlZCkgeworICAgICAgICByZXR1cm4gbVRyYWl0c0xpc3Q7CisgICAgfQorICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5saXN0Q29tcG9uZW50cygKKyAgICAgICAgICAgIFt0aGlzXShTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0cz4mIHQpIHsKKyAgICAgICAgICAgICAgICBpZiAocyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgImxpc3RDb21wb25lbnRzIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVHJhaXRzTGlzdC5yZXNpemUodC5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmbVRyYWl0c0xpc3RbaV0sIHRbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJsaXN0Q29tcG9uZW50cyAtLSBjb3JydXB0ZWQgb3V0cHV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbVRyYWl0c0xpc3RbaV0ub3duZXIgPSBtU2VydmljZU5hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAibGlzdENvbXBvbmVudHMgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgfQorICAgIG1MaXN0ZWQgPSB0cnVlOworICAgIHJldHVybiBtVHJhaXRzTGlzdDsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50Ojpjb3B5QnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBzcmMsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGRzdCkgeworICAgIC8vIFRPRE86IEltcGxlbWVudD8KKyAgICAodm9pZClzcmM7CisgICAgKHZvaWQpZHN0OworICAgIExPRyhFUlJPUikgPDwgImNvcHlCdWZmZXIgbm90IGltcGxlbWVudGVkIjsKKyAgICByZXR1cm4gQzJfT01JVFRFRDsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+CisgICAgICAgIENvZGVjMkNsaWVudDo6Z2V0UGFyYW1SZWZsZWN0b3IoKSB7CisgICAgLy8gVE9ETzogdGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgZXhwb3NlZCBhcyBDMlBhcmFtUmVmbGVjdG9yIG9uIHRoZSBjbGllbnQgc2lkZTsgaW5zdGVhZCwgaXQKKyAgICAvLyBzaG91bGQgcmVmbGVjdCB0aGUgSEFMIEFQSS4KKyAgICBzdHJ1Y3QgU2ltcGxlUGFyYW1SZWZsZWN0b3IgOiBwdWJsaWMgQzJQYXJhbVJlZmxlY3RvciB7CisgICAgICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY3JpYmUoQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCkgY29uc3QgeworICAgICAgICAgICAgaGlkbF92ZWM8UGFyYW1JbmRleD4gaW5kaWNlcygxKTsKKyAgICAgICAgICAgIGluZGljZXNbMF0gPSBzdGF0aWNfY2FzdDxQYXJhbUluZGV4Pihjb3JlSW5kZXguY29yZUluZGV4KCkpOworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY3JpcHRvcjsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5nZXRTdHJ1Y3REZXNjcmlwdG9ycygKKyAgICAgICAgICAgICAgICAgICAgaW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgWyZkZXNjcmlwdG9yXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxTdHJ1Y3REZXNjcmlwdG9yPiYgc2QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJTaW1wbGVQYXJhbVJlZmxlY3RvciAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0U3RydWN0RGVzY3JpcHRvcnMoKSBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZC5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgIlNpbXBsZVBhcmFtUmVmbGVjdG9yIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRTdHJ1Y3REZXNjcmlwdG9ycygpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm5lZCB2ZWN0b3Igb2Ygc2l6ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzZC5zaXplKCkgPDwgIi4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkl0IHNob3VsZCBiZSAxLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KCZkZXNjcmlwdG9yLCBzZFswXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJTaW1wbGVQYXJhbVJlZmxlY3RvciAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0U3RydWN0RGVzY3JpcHRvcnMoKSByZXR1cm5lZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29ycnVwdGVkIGRhdGEuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yOworICAgICAgICB9CisKKyAgICAgICAgU2ltcGxlUGFyYW1SZWZsZWN0b3Ioc3A8QmFzZT4gYmFzZSkKKyAgICAgICAgICAgIDogbUJhc2UoYmFzZSkgeyB9CisKKyAgICAgICAgc3A8QmFzZT4gbUJhc2U7CisgICAgfTsKKworICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZVBhcmFtUmVmbGVjdG9yPihtQmFzZSk7Cit9OworCitzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICBjb25zdCBjaGFyKiBzZXJ2aWNlTmFtZSwgYm9vbCB3YWl0Rm9yU2VydmljZSkgeworICAgIGlmICghc2VydmljZU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHNwPEJhc2U+IGJhc2VTdG9yZSA9IHdhaXRGb3JTZXJ2aWNlID8KKyAgICAgICAgICAgIEJhc2U6OmdldFNlcnZpY2Uoc2VydmljZU5hbWUpIDoKKyAgICAgICAgICAgIEJhc2U6OnRyeUdldFNlcnZpY2Uoc2VydmljZU5hbWUpOworICAgIGlmICghYmFzZVN0b3JlKSB7CisgICAgICAgIGlmICh3YWl0Rm9yU2VydmljZSkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJDb2RlYzIuMCBzZXJ2aWNlIFwiIiA8PCBzZXJ2aWNlTmFtZSA8PCAiXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpbmFjY2Vzc2libGUuIENoZWNrIHRoZSBkZXZpY2UgbWFuaWZlc3QuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIkNvZGVjMi4wIHNlcnZpY2UgXCIiIDw8IHNlcnZpY2VOYW1lIDw8ICJcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiB1bmF2YWlsYWJsZSBhdCB0aGUgbW9tZW50LiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgV2FpdCBvciBjaGVjayB0aGUgZGV2aWNlIG1hbmlmZXN0LiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudD4oYmFzZVN0b3JlLCBzZXJ2aWNlTmFtZSk7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Rm9yQWxsU3RvcmVzKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAma2V5LAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+Jik+CisgICAgICAgICAgICBwcmVkaWNhdGUpIHsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBDMl9OT19JTklUOyAgLy8gbm8gSUNvbXBvbmVudFN0b3JlcyBwcmVzZW50CisKKyAgICAvLyBDYWNoZSB0aGUgbWFwcGluZyBrZXkgLT4gaW5kZXggb2YgQ29kZWMyQ2xpZW50IGluIGdldENsaWVudCgpLgorICAgIHN0YXRpYyBzdGQ6Om11dGV4IGtleTJJbmRleE11dGV4OworICAgIHN0YXRpYyBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc2l6ZV90PiBrZXkySW5kZXg7CisKKyAgICAvLyBCeSBkZWZhdWx0IHRyeSBhbGwgc3RvcmVzLiBIb3dldmVyLCB0cnkgdGhlIGxhc3Qga25vd24gY2xpZW50IGZpcnN0LiBJZgorICAgIC8vIHRoZSBsYXN0IGtub3duIGNsaWVudCBmYWlscywgcmV0cnkgb25jZS4gV2UgZG8gdGhpcyBieSBwdXNoaW5nIHRoZSBsYXN0CisgICAgLy8ga25vd24gY2xpZW50IGluIGZyb250IG9mIHRoZSBsaXN0IG9mIGFsbCBjbGllbnRzLgorICAgIHN0ZDo6ZGVxdWU8c2l6ZV90PiBpbmRpY2VzOworICAgIGZvciAoc2l6ZV90IGluZGV4ID0ga051bUNsaWVudHM7IGluZGV4ID4gMDsgKSB7CisgICAgICAgIGluZGljZXMucHVzaF9mcm9udCgtLWluZGV4KTsKKyAgICB9CisKKyAgICBib29sIHdhc01hcHBlZCA9IGZhbHNlOworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhrZXkySW5kZXhNdXRleCk7CisgICAgYXV0byBpdCA9IGtleTJJbmRleC5maW5kKGtleSk7CisgICAgaWYgKGl0ICE9IGtleTJJbmRleC5lbmQoKSkgeworICAgICAgICBpbmRpY2VzLnB1c2hfZnJvbnQoaXQtPnNlY29uZCk7CisgICAgICAgIHdhc01hcHBlZCA9IHRydWU7CisgICAgfQorICAgIGxvY2sudW5sb2NrKCk7CisKKyAgICBmb3IgKHNpemVfdCBpbmRleCA6IGluZGljZXMpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gY2xpZW50ID0gZ2V0Q2xpZW50KGluZGV4KTsKKyAgICAgICAgaWYgKGNsaWVudCkgeworICAgICAgICAgICAgc3RhdHVzID0gcHJlZGljYXRlKGNsaWVudCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAga2V5MkluZGV4W2tleV0gPSBpbmRleDsgLy8gdXBkYXRlIGxhc3Qga25vd24gY2xpZW50IGluZGV4CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAod2FzTWFwcGVkKSB7CisgICAgICAgICAgICBMT0coSU5GTykgPDwgIkNvdWxkIG5vdCBmaW5kIFwiIiA8PCBrZXkgPDwgIlwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICIgaW4gdGhlIGxhc3QgaW5zdGFuY2UuIFJldHJ5aW5nLi4uIjsKKyAgICAgICAgICAgIHdhc01hcHBlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7ICAvLyByZXR1cm4gdGhlIGxhc3Qgc3RhdHVzIGZyb20gYSB2YWxpZCBjbGllbnQKK30KKworc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PgorICAgICAgICBDb2RlYzJDbGllbnQ6OkNyZWF0ZUNvbXBvbmVudEJ5TmFtZSgKKyAgICAgICAgY29uc3QgY2hhciogY29tcG9uZW50TmFtZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+KiBvd25lcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBGb3JBbGxTdG9yZXMoCisgICAgICAgICAgICBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgW293bmVyLCAmY29tcG9uZW50LCBjb21wb25lbnROYW1lLCAmbGlzdGVuZXJdKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiAmY2xpZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgLT4gYzJfc3RhdHVzX3QgeworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBpZiAob3duZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpvd25lciA9IGNsaWVudDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IEMyX05PVF9GT1VORCkgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJJQ29tcG9uZW50U3RvcmUoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBjbGllbnQtPmdldFNlcnZpY2VOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTo6Y3JlYXRlQ29tcG9uZW50KFwiIiA8PCBjb21wb25lbnROYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiKSByZXR1cm5lZCBzdGF0dXMgPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiQ291bGQgbm90IGNyZWF0ZSBjb21wb25lbnQgXCIiIDw8IGNvbXBvbmVudE5hbWUgPDwgIlwiLiAiCisgICAgICAgICAgICAgICAgICAgICAgIlN0YXR1cyA9ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisgICAgcmV0dXJuIGNvbXBvbmVudDsKK30KKworc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW50ZXJmYWNlPgorICAgICAgICBDb2RlYzJDbGllbnQ6OkNyZWF0ZUludGVyZmFjZUJ5TmFtZSgKKyAgICAgICAgY29uc3QgY2hhciogaW50ZXJmYWNlTmFtZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4qIG93bmVyKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGVyZmFjZT4gaW50ZXJmYWNlOworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IEZvckFsbFN0b3JlcygKKyAgICAgICAgICAgIGludGVyZmFjZU5hbWUsCisgICAgICAgICAgICBbb3duZXIsICZpbnRlcmZhY2UsIGludGVyZmFjZU5hbWVdKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiAmY2xpZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgLT4gYzJfc3RhdHVzX3QgeworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGNsaWVudC0+Y3JlYXRlSW50ZXJmYWNlKGludGVyZmFjZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZmFjZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBpZiAob3duZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpvd25lciA9IGNsaWVudDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IEMyX05PVF9GT1VORCkgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJJQ29tcG9uZW50U3RvcmUoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBjbGllbnQtPmdldFNlcnZpY2VOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTo6Y3JlYXRlSW50ZXJmYWNlKFwiIiA8PCBpbnRlcmZhY2VOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiKSByZXR1cm5lZCBzdGF0dXMgPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiQ291bGQgbm90IGNyZWF0ZSBpbnRlcmZhY2UgXCIiIDw8IGludGVyZmFjZU5hbWUgPDwgIlwiLiAiCisgICAgICAgICAgICAgICAgICAgICAgIlN0YXR1cyA9ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisgICAgcmV0dXJuIGludGVyZmFjZTsKK30KKworc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPiBDb2RlYzJDbGllbnQ6OkNyZWF0ZUlucHV0U3VyZmFjZSgpIHsKKyAgICB1aW50MzJfdCBzZXJ2aWNlTWFzayA9IDo6YW5kcm9pZDo6YmFzZTo6R2V0VWludFByb3BlcnR5KAorICAgICAgICAgICAgImRlYnVnLnN0YWdlZnJpZ2h0LmMyaW5wdXRzdXJmYWNlIiwgdWludDMyX3QoMCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bUNsaWVudHM7ICsraSkgeworICAgICAgICBpZiAoKDEgPDwgaSkgJiBzZXJ2aWNlTWFzaykgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gY2xpZW50ID0gZ2V0Q2xpZW50KGkpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPiBpbnB1dFN1cmZhY2U7CisgICAgICAgICAgICBpZiAoY2xpZW50ICYmCisgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+Y3JlYXRlSW5wdXRTdXJmYWNlKCZpbnB1dFN1cmZhY2UpID09IEMyX09LICYmCisgICAgICAgICAgICAgICAgICAgIGlucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dFN1cmZhY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HKElORk8pIDw8ICJDb3VsZCBub3QgY3JlYXRlIGFuIGlucHV0IHN1cmZhY2UgIgorICAgICAgICAgICAgICAgICAiZnJvbSBhbnkgQ29kZWMyLjAgc2VydmljZXMuIjsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4mIENvZGVjMkNsaWVudDo6TGlzdENvbXBvbmVudHMoKSB7CisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+IHRyYWl0c0xpc3QgPSBbXSgpeworICAgICAgICBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiBsaXN0OworICAgICAgICBzaXplX3QgbGlzdFNpemUgPSAwOworICAgICAgICBDbGllbnRMaXN0IGNsaWVudExpc3QgPSBnZXRDbGllbnRMaXN0KCk7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4mIGNsaWVudCA6IGNsaWVudExpc3QpIHsKKyAgICAgICAgICAgIGlmICghY2xpZW50KSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0U2l6ZSArPSBjbGllbnQtPmxpc3RDb21wb25lbnRzKCkuc2l6ZSgpOworICAgICAgICB9CisgICAgICAgIGxpc3QucmVzZXJ2ZShsaXN0U2l6ZSk7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4mIGNsaWVudCA6IGNsaWVudExpc3QpIHsKKyAgICAgICAgICAgIGlmICghY2xpZW50KSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0Lmluc2VydCgKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5saXN0Q29tcG9uZW50cygpLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+bGlzdENvbXBvbmVudHMoKS5lbmQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfSgpOworCisgICAgcmV0dXJuIHRyYWl0c0xpc3Q7Cit9CisKKy8vIENvZGVjMkNsaWVudDo6TGlzdGVuZXIKKworQ29kZWMyQ2xpZW50OjpMaXN0ZW5lcjo6fkxpc3RlbmVyKCkgeworfQorCisvLyBDb2RlYzJDbGllbnQ6OkludGVyZmFjZQorQ29kZWMyQ2xpZW50OjpJbnRlcmZhY2U6OkludGVyZmFjZShjb25zdCBzcDxCYXNlPiYgYmFzZSkKKyAgICAgIDogQ29uZmlndXJhYmxleworICAgICAgICAgICAgW2Jhc2VdKCkgLT4gc3A8SUNvbmZpZ3VyYWJsZT4geworICAgICAgICAgICAgICAgIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gdHJhbnNSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+Z2V0Q29uZmlndXJhYmxlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zUmVzdWx0LmlzT2soKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxJQ29uZmlndXJhYmxlPj4odHJhbnNSZXN1bHQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHI7CisgICAgICAgICAgICB9KCkKKyAgICAgICAgfSwKKyAgICAgICAgbUJhc2V7YmFzZX0geworfQorCisvLyBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudAorQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OkNvbXBvbmVudChjb25zdCBzcDxCYXNlPiYgYmFzZSkKKyAgICAgIDogQ29uZmlndXJhYmxleworICAgICAgICAgICAgW2Jhc2VdKCkgLT4gc3A8SUNvbmZpZ3VyYWJsZT4geworICAgICAgICAgICAgICAgIFJldHVybjxzcDxJQ29tcG9uZW50SW50ZXJmYWNlPj4gdHJhbnNSZXN1bHQxID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmdldEludGVyZmFjZSgpOworICAgICAgICAgICAgICAgIGlmICghdHJhbnNSZXN1bHQxLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiB0cmFuc1Jlc3VsdDIgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbXBvbmVudEludGVyZmFjZT4+KHRyYW5zUmVzdWx0MSktPgorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZmlndXJhYmxlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zUmVzdWx0Mi5pc09rKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHRyYW5zUmVzdWx0MikgOgorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cjsKKyAgICAgICAgICAgIH0oKQorICAgICAgICB9LAorICAgICAgICBtQmFzZXtiYXNlfSwKKyAgICAgICAgbUJ1ZmZlclBvb2xTZW5kZXJ7bnVsbHB0cn0geworfQorCitDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6fkNvbXBvbmVudCgpIHsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3QgaWQsCisgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90KiBibG9ja1Bvb2xJZCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlPiogY29uZmlndXJhYmxlKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaWQpLAorICAgICAgICAgICAgWyZzdGF0dXMsIGJsb2NrUG9vbElkLCBjb25maWd1cmFibGVdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgcElkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ29uZmlndXJhYmxlPiYgYykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBjb25maWd1cmFibGUtPnJlc2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJjcmVhdGVCbG9ja1Bvb2wgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpibG9ja1Bvb2xJZCA9IHN0YXRpY19jYXN0PEMyQmxvY2tQb29sOjpsb2NhbF9pZF90PihwSWQpOworICAgICAgICAgICAgICAgICpjb25maWd1cmFibGUgPSBzdGQ6Om1ha2Vfc2hhcmVkPENvbmZpZ3VyYWJsZT4oYyk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVCbG9ja1Bvb2wgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpkZXN0cm95QmxvY2tQb29sKAorICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBsb2NhbElkKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNSZXN1bHQgPSBtQmFzZS0+ZGVzdHJveUJsb2NrUG9vbCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2NF90Pihsb2NhbElkKSk7CisgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiZGVzdHJveUJsb2NrUG9vbCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zUmVzdWx0KSk7Cit9CisKK3ZvaWQgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmhhbmRsZU9uV29ya0RvbmUoCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJndvcmtJdGVtcykgeworICAgIC8vIE91dHB1dCBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3MnIGxpZmV0aW1lIG1hbmFnZW1lbnQKKyAgICBtT3V0cHV0QnVmZmVyUXVldWVNdXRleC5sb2NrKCk7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaWdicCA9IG1PdXRwdXRJZ2JwOworICAgIHVpbnQ2NF90IGJxSWQgPSBtT3V0cHV0QnFJZDsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uID0gbU91dHB1dEdlbmVyYXRpb247CisgICAgbU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgudW5sb2NrKCk7CisKKyAgICBpZiAoaWdicCkgeworICAgICAgICBob2xkQnVmZmVyUXVldWVCbG9ja3Mod29ya0l0ZW1zLCBpZ2JwLCBicUlkLCBnZW5lcmF0aW9uKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpxdWV1ZSgKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIHsKKyAgICBXb3JrQnVuZGxlIHdvcmtCdW5kbGU7CisgICAgaWYgKCFvYmpjcHkoJndvcmtCdW5kbGUsICppdGVtcywgJm1CdWZmZXJQb29sU2VuZGVyKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJxdWV1ZSAtLSBiYWQgaW5wdXQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+cXVldWUod29ya0J1bmRsZSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVldWUgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAicXVldWUgLS0gY2FsbCBmYWlsZWQ6ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmZsdXNoKAorICAgICAgICBDMkNvbXBvbmVudDo6Zmx1c2hfbW9kZV90IG1vZGUsCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSB7CisgICAgKHZvaWQpbW9kZTsgLy8gRmx1c2ggbW9kZSBpc24ndCBzdXBwb3J0ZWQgaW4gSElETCB5ZXQuCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5mbHVzaCgKKyAgICAgICAgICAgIFsmc3RhdHVzLCBmbHVzaGVkV29ya10oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLCBjb25zdCBXb3JrQnVuZGxlJiB3YikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgImZsdXNoIC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFvYmpjcHkoZmx1c2hlZFdvcmssIHdiKSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiZmx1c2ggLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorCisgICAgLy8gSW5kaWNlcyBvZiBmbHVzaGVkIHdvcmsgaXRlbXMuCisgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IGZsdXNoZWRJbmRpY2VzOworICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmsgOiAqZmx1c2hlZFdvcmspIHsKKyAgICAgICAgaWYgKHdvcmspIHsKKyAgICAgICAgICAgIGlmICh3b3JrLT53b3JrbGV0cy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgIHx8ICF3b3JrLT53b3JrbGV0cy5iYWNrKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHdvcmstPndvcmtsZXRzLmJhY2soKS0+b3V0cHV0LmZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBpbnB1dCBpcyBjb21wbGV0ZQorICAgICAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE91dHB1dCBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3MnIGxpZmV0aW1lIG1hbmFnZW1lbnQKKyAgICBtT3V0cHV0QnVmZmVyUXVldWVNdXRleC5sb2NrKCk7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaWdicCA9IG1PdXRwdXRJZ2JwOworICAgIHVpbnQ2NF90IGJxSWQgPSBtT3V0cHV0QnFJZDsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uID0gbU91dHB1dEdlbmVyYXRpb247CisgICAgbU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgudW5sb2NrKCk7CisKKyAgICBpZiAoaWdicCkgeworICAgICAgICBob2xkQnVmZmVyUXVldWVCbG9ja3MoKmZsdXNoZWRXb3JrLCBpZ2JwLCBicUlkLCBnZW5lcmF0aW9uKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6ZHJhaW4oQzJDb21wb25lbnQ6OmRyYWluX21vZGVfdCBtb2RlKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+ZHJhaW4oCisgICAgICAgICAgICBtb2RlID09IEMyQ29tcG9uZW50OjpEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImRyYWluIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgImRyYWluIC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpzdGFydCgpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5zdGFydCgpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInN0YXJ0IC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInN0YXJ0IC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpzdG9wKCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnN0b3AoKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJzdG9wIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInN0b3AgLS0gY2FsbCBmYWlsZWQ6ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnJlc2V0KCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnJlc2V0KCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAicmVzZXQgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAicmVzZXQgLS0gY2FsbCBmYWlsZWQ6ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnJlbGVhc2UoKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+cmVsZWFzZSgpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInJlbGVhc2UgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAicmVsZWFzZSAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6c2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgYmxvY2tQb29sSWQsCisgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBzdXJmYWNlLAorICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uKSB7CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaWdicCA9CisgICAgICAgICAgICBzdXJmYWNlLT5nZXRIYWxJbnRlcmZhY2U8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4oKTsKKworICAgIGlmICghaWdicCkgeworICAgICAgICBpZ2JwID0gbmV3IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+KHN1cmZhY2UpOworICAgIH0KKworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnNldE91dHB1dFN1cmZhY2UoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4oYmxvY2tQb29sSWQpLCBpZ2JwKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJzZXRPdXRwdXRTdXJmYWNlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInNldE91dHB1dFN1cmZhY2UgLS0gY2FsbCBmYWlsZWQ6ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtT3V0cHV0QnVmZmVyUXVldWVNdXRleCk7CisgICAgICAgIGlmIChtT3V0cHV0SWdicCAhPSBzdXJmYWNlKSB7CisgICAgICAgICAgICBtT3V0cHV0SWdicCA9IHN1cmZhY2U7CisgICAgICAgICAgICBpZiAoIXN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBtT3V0cHV0QnFJZCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN1cmZhY2UtPmdldFVuaXF1ZUlkKCZtT3V0cHV0QnFJZCkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJzZXRPdXRwdXRTdXJmYWNlIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgb2J0YWluIGJ1ZmZlcnF1ZXVlIGlkLiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbU91dHB1dEdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6cXVldWVUb091dHB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICBjb25zdCBRdWV1ZUJ1ZmZlcklucHV0JiBpbnB1dCwKKyAgICAgICAgUXVldWVCdWZmZXJPdXRwdXQqIG91dHB1dCkgeworICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgdWludDY0X3QgYnFJZDsKKyAgICBpbnQzMl90IGJxU2xvdDsKKyAgICBpZiAoIWdldEJ1ZmZlclF1ZXVlQXNzaWdubWVudChibG9jaywgJmdlbmVyYXRpb24sICZicUlkLCAmYnFTbG90KSB8fAorICAgICAgICAgICAgYnFJZCA9PSAwKSB7CisgICAgICAgIC8vIEJsb2NrIG5vdCBmcm9tIGJ1ZmZlcnF1ZXVlIC0tIGl0IG11c3QgYmUgYXR0YWNoZWQgYmVmb3JlIHF1ZXVpbmcuCisKKyAgICAgICAgbU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgubG9jaygpOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBvdXRwdXRJZ2JwID0gbU91dHB1dElnYnA7CisgICAgICAgIHVpbnQzMl90IG91dHB1dEdlbmVyYXRpb24gPSBtT3V0cHV0R2VuZXJhdGlvbjsKKyAgICAgICAgbU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgudW5sb2NrKCk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXR0YWNoVG9CdWZmZXJRdWV1ZShibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0SWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0R2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJxU2xvdCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVldWVUb091dHB1dFN1cmZhY2UgLS0gYXR0YWNoaW5nIGZhaWxlZC4iOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gb3V0cHV0SWdicC0+cXVldWVCdWZmZXIoc3RhdGljX2Nhc3Q8aW50PihicVNsb3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgb3V0cHV0KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVldWVUb091dHB1dFN1cmZhY2UgLS0gcXVldWVCdWZmZXIoKSBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAib24gbm9uLWJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciA9ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LmxvY2soKTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBvdXRwdXRJZ2JwID0gbU91dHB1dElnYnA7CisgICAgdWludDY0X3Qgb3V0cHV0QnFJZCA9IG1PdXRwdXRCcUlkOworICAgIHVpbnQzMl90IG91dHB1dEdlbmVyYXRpb24gPSBtT3V0cHV0R2VuZXJhdGlvbjsKKyAgICBtT3V0cHV0QnVmZmVyUXVldWVNdXRleC51bmxvY2soKTsKKworICAgIGlmICghb3V0cHV0SWdicCkgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIG91dHB1dCBzdXJmYWNlIGlzIG51bGwuIjsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaWYgKGJxSWQgIT0gb3V0cHV0QnFJZCB8fCBnZW5lcmF0aW9uICE9IG91dHB1dEdlbmVyYXRpb24pIHsKKyAgICAgICAgaWYgKCFob2xkQnVmZmVyUXVldWVCbG9jayhibG9jaywgbU91dHB1dElnYnAsIG1PdXRwdXRCcUlkLCBtT3V0cHV0R2VuZXJhdGlvbikpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIG1pZ3JhdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWdldEJ1ZmZlclF1ZXVlQXNzaWdubWVudChibG9jaywgJmdlbmVyYXRpb24sICZicUlkLCAmYnFTbG90KSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVldWVUb091dHB1dFN1cmZhY2UgLS0gY29ycnVwdGVkIGJ1ZmZlcnF1ZXVlIGFzc2lnbm1lbnQuIjsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0SWdicC0+cXVldWVCdWZmZXIoc3RhdGljX2Nhc3Q8aW50PihicVNsb3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBvdXRwdXQpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAicXVldWVUb091dHB1dFN1cmZhY2UgLS0gcXVldWVCdWZmZXIoKSBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICJvbiBidWZmZXJxdWV1ZS1iYXNlZCBibG9jay4gIgorICAgICAgICAgICAgICAgICAgICAgICJFcnJvciA9ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKCF5aWVsZEJ1ZmZlclF1ZXVlQmxvY2soYmxvY2spKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIGNhbm5vdCB5aWVsZCAiCisgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrIHRvIHRoZSBidWZmZXJxdWV1ZS4iOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6Y29ubmVjdFRvSW5wdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlPiYgaW5wdXRTdXJmYWNlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4qIGNvbm5lY3Rpb24pIHsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmNvbm5lY3RUb0lucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGlucHV0U3VyZmFjZS0+bUJhc2UsCisgICAgICAgICAgICBbJnN0YXR1cywgY29ubmVjdGlvbl0oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLCBjb25zdCBzcDxJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4mIGMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJjb25uZWN0VG9JbnB1dFN1cmZhY2UgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpjb25uZWN0aW9uID0gc3RkOjptYWtlX3NoYXJlZDxJbnB1dFN1cmZhY2VDb25uZWN0aW9uPihjKTsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNvbm5lY3RUb0lucHV0U3VyZmFjZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQiOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6Y29ubmVjdFRvT214SW5wdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIsCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4qIGNvbm5lY3Rpb24pIHsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmNvbm5lY3RUb09teElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIHByb2R1Y2VyLCBzb3VyY2UsCisgICAgICAgICAgICBbJnN0YXR1cywgY29ubmVjdGlvbl0oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLCBjb25zdCBzcDxJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4mIGMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpjb25uZWN0aW9uID0gc3RkOjptYWtlX3NoYXJlZDxJbnB1dFN1cmZhY2VDb25uZWN0aW9uPihjKTsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNvbm5lY3RUb09teElucHV0U3VyZmFjZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmRpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlKCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmRpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlKCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiZGlzY29ubmVjdFRvSW5wdXRTdXJmYWNlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgImRpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnNldERlYXRoTGlzdGVuZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisKKyAgICBzdHJ1Y3QgSGlkbERlYXRoUmVjaXBpZW50IDogcHVibGljIGhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudCB7CisgICAgICAgIHN0ZDo6d2Vha19wdHI8Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgICAgIHN0ZDo6d2Vha19wdHI8TGlzdGVuZXI+IGJhc2U7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKAorICAgICAgICAgICAgICAgIHVpbnQ2NF90IC8qIGNvb2tpZSAqLywKKyAgICAgICAgICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgICAgICBpZiAoc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gYmFzZS5sb2NrKCkpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci0+b25EZWF0aChjb21wb25lbnQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJvbkRlYXRoIC0tIGxpc3RlbmVyIGRpZWQuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBzcDxIaWRsRGVhdGhSZWNpcGllbnQ+IGRlYXRoUmVjaXBpZW50ID0gbmV3IEhpZGxEZWF0aFJlY2lwaWVudCgpOworICAgIGRlYXRoUmVjaXBpZW50LT5iYXNlID0gbGlzdGVuZXI7CisgICAgZGVhdGhSZWNpcGllbnQtPmNvbXBvbmVudCA9IGNvbXBvbmVudDsKKworICAgIGNvbXBvbmVudC0+bURlYXRoUmVjaXBpZW50ID0gZGVhdGhSZWNpcGllbnQ7CisgICAgUmV0dXJuPGJvb2w+IHRyYW5zUmVzdWx0ID0gY29tcG9uZW50LT5tQmFzZS0+bGlua1RvRGVhdGgoCisgICAgICAgICAgICBjb21wb25lbnQtPm1EZWF0aFJlY2lwaWVudCwgMCk7CisgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAic2V0RGVhdGhMaXN0ZW5lciAtLSBsaW5rVG9EZWF0aCgpIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBpZiAoIXN0YXRpY19jYXN0PGJvb2w+KHRyYW5zUmVzdWx0KSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJzZXREZWF0aExpc3RlbmVyIC0tIGxpbmtUb0RlYXRoKCkgY2FsbCBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCisvLyBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZQorQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U6OklucHV0U3VyZmFjZShjb25zdCBzcDxJSW5wdXRTdXJmYWNlPiYgYmFzZSkKKyAgICAgIDogQ29uZmlndXJhYmxleworICAgICAgICAgICAgW2Jhc2VdKCkgLT4gc3A8SUNvbmZpZ3VyYWJsZT4geworICAgICAgICAgICAgICAgIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gdHJhbnNSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+Z2V0Q29uZmlndXJhYmxlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zUmVzdWx0LmlzT2soKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxJQ29uZmlndXJhYmxlPj4odHJhbnNSZXN1bHQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHI7CisgICAgICAgICAgICB9KCkKKyAgICAgICAgfSwKKyAgICAgICAgbUJhc2V7YmFzZX0sCisgICAgICAgIG1HcmFwaGljQnVmZmVyUHJvZHVjZXJ7bmV3CisgICAgICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OnV0aWxzOjoKKyAgICAgICAgICAgIEgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcihbYmFzZV0oKSAtPiBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiB7CisgICAgICAgICAgICAgICAgUmV0dXJuPHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+PiB0cmFuc1Jlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5nZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNSZXN1bHQuaXNPaygpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+Pih0cmFuc1Jlc3VsdCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cjsKKyAgICAgICAgICAgIH0oKSl9IHsKK30KKworc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4KKyAgICAgICAgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U6OmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK30KKworc3A8SUlucHV0U3VyZmFjZT4gQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U6OmdldEhhbEludGVyZmFjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUJhc2U7Cit9CisKKy8vIENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbgorQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uKAorICAgICAgICBjb25zdCBzcDxJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4mIGJhc2UpCisgICAgICA6IENvbmZpZ3VyYWJsZXsKKyAgICAgICAgICAgIFtiYXNlXSgpIC0+IHNwPElDb25maWd1cmFibGU+IHsKKyAgICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHRyYW5zUmVzdWx0KSA6CisgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyOworICAgICAgICAgICAgfSgpCisgICAgICAgIH0sCisgICAgICAgIG1CYXNle2Jhc2V9IHsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpkaXNjb25uZWN0KCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zUmVzdWx0ID0gbUJhc2UtPmRpc2Nvbm5lY3QoKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNSZXN1bHQpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvY2xpZW50LmggYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvaW5jbHVkZS9jb2RlYzIvaGlkbC9jbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzhjZTZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvY2xpZW50LmgKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfQ0xJRU5UX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfQ0xJRU5UX0gKKworI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzIuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisKKy8qKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIG1pbmltYWwgaW50ZXJmYWNlcyBmb3IgdGhlIGZyYW1ld29yayB0byBhY2Nlc3MgQ29kZWMyLjAuCisgKgorICogQ29kZWMyQ2xpZW50IGlzIHRoZSBtYWluIGNsYXNzIHRoYXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBpbm5lciBjbGFzc2VzOgorICogLSBMaXN0ZW5lcgorICogLSBDb25maWd1cmFibGUKKyAqIC0gSW50ZXJmYWNlCisgKiAtIENvbXBvbmVudAorICoKKyAqIENsYXNzZXMgaW4gQ29kZWMyQ2xpZW50LCBpbnRlcmZhY2VzIGluIENvZGVjMi4wLCBhbmQgIEhJREwgaW50ZXJmYWNlcyBhcmUKKyAqIHJlbGF0ZWQgYXMgZm9sbG93czoKKyAqIC0gQ29kZWMyQ2xpZW50IDw9PT4gQzJDb21wb25lbnRTdG9yZSA8PT0+IElDb21wb25lbnRTdG9yZQorICogLSBDb2RlYzJDbGllbnQ6Okxpc3RlbmVyIDw9PT4gQzJDb21wb25lbnQ6Okxpc3RlbmVyIDw9PT4gSUNvbXBvbmVudExpc3RlbmVyCisgKiAtIENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlIDw9PT4gW05vIGVxdWl2YWxlbnRdIDw9PT4gSUNvbmZpZ3VyYWJsZQorICogLSBDb2RlYzJDbGllbnQ6OkludGVyZmFjZSA8PT0+IEMyQ29tcG9uZW50SW50ZXJmYWNlIDw9PT4gSUNvbXBvbmVudEludGVyZmFjZQorICogLSBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudCA8PT0+IEMyQ29tcG9uZW50IDw9PT4gSUNvbXBvbmVudAorICoKKyAqIFRoZSBlbnRyeSBwb2ludCBpcyBDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKCksIHdoaWNoIGNyZWF0ZXMgYQorICogQ29kZWMyQ2xpZW50IG9iamVjdC4gRnJvbSBDb2RlYzJDbGllbnQsIEludGVyZmFjZSBhbmQgQ29tcG9uZW50IG9iamVjdHMgY2FuCisgKiBiZSBjcmVhdGVkIGJ5IGNhbGxpbmcgY3JlYXRlQ29tcG9uZW50KCkgYW5kIGNyZWF0ZUludGVyZmFjZSgpLgorICoKKyAqIGNyZWF0ZUNvbXBvbmVudCgpIHRha2VzIGEgTGlzdGVuZXIgb2JqZWN0LCB3aGljaCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZQorICogdXNlci4KKyAqCisgKiBBdCB0aGUgcHJlc2VudCwgY3JlYXRlQmxvY2tQb29sKCkgaXMgdGhlIG9ubHkgbWV0aG9kIHRoYXQgeWllbGRzIGEKKyAqIENvbmZpZ3VyYWJsZSBvYmplY3QuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgSW50ZXJmYWNlLCBDb21wb25lbnQgYW5kCisgKiBDb2RlYzJDbGllbnQgYXJlIGFsbCBzdWJjbGFzc2VzIG9mIENvbmZpZ3VyYWJsZS4KKyAqLworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIENvZGVjMi4wIEhJREwgaW50ZXJmYWNlcworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworc3RydWN0IElDb25maWd1cmFibGU7CitzdHJ1Y3QgSUNvbXBvbmVudDsKK3N0cnVjdCBJQ29tcG9uZW50SW50ZXJmYWNlOworc3RydWN0IElDb21wb25lbnRTdG9yZTsKK3N0cnVjdCBJSW5wdXRTdXJmYWNlOworc3RydWN0IElJbnB1dFN1cmZhY2VDb25uZWN0aW9uOworfSAvLyBuYW1lc3BhY2UgVjFfMAorfSAvLyBuYW1lc3BhY2UgYzIKK30gLy8gbmFtZXNwYWNlIG1lZGlhCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK3N0cnVjdCBJQ2xpZW50TWFuYWdlcjsKK30gLy8gbmFtZXNwYWNlIFYyXzAKK30gLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gLy8gbmFtZXNwYWNlIG1lZGlhCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBvdGhlciBjbGFzc2VzCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGdyYXBoaWNzIHsKK25hbWVzcGFjZSBidWZmZXJxdWV1ZSB7CituYW1lc3BhY2UgVjFfMCB7CitzdHJ1Y3QgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK30gLy8gbmFtZXNwYWNlIFYxXzAKK30gLy8gbmFtZXNwYWNlIGJ1ZmZlcnF1ZXVlCit9IC8vIG5hbWVzcGFjZSBncmFwaGljcworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBvbXggeworbmFtZXNwYWNlIFYxXzAgeworc3RydWN0IElHcmFwaGljQnVmZmVyU291cmNlOworfSAvLyBuYW1lc3BhY2UgVjFfMAorfSAvLyBuYW1lc3BhY2Ugb214Cit9IC8vIG5hbWVzcGFjZSBtZWRpYQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUaGlzIGNsYXNzIGlzIHN1cHBvc2VkIHRvIGJlIGNhbGxlZCBDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZSwgYnV0IGZvcndhcmQKKy8vIGRlY2xhcmF0aW9uIG9mIGFuIGlubmVyIGNsYXNzIGlzIG5vdCBwb3NzaWJsZS4KK3N0cnVjdCBDb2RlYzJDb25maWd1cmFibGVDbGllbnQgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb25maWd1cmFibGUgQmFzZTsKKworICAgIGNvbnN0IEMyU3RyaW5nJiBnZXROYW1lKCkgY29uc3Q7CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3Q7CisKKyAgICBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKTsKKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcworICAgICAgICAgICAgKSBjb25zdDsKKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgZmllbGRzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Q7CisKKyAgICAvLyBiYXNlIGNhbm5vdCBiZSBudWxsLgorICAgIENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudChjb25zdCBzcDxCYXNlPiYgYmFzZSk7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxCYXNlPiBtQmFzZTsKKyAgICBDMlN0cmluZyBtTmFtZTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29kZWMyQ2xpZW50OworfTsKKworc3RydWN0IENvZGVjMkNsaWVudCA6IHB1YmxpYyBDb2RlYzJDb25maWd1cmFibGVDbGllbnQgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnRTdG9yZSBCYXNlOworCisgICAgc3RydWN0IExpc3RlbmVyOworCisgICAgdHlwZWRlZiBDb2RlYzJDb25maWd1cmFibGVDbGllbnQgQ29uZmlndXJhYmxlOworCisgICAgc3RydWN0IENvbXBvbmVudDsKKworICAgIHN0cnVjdCBJbnRlcmZhY2U7CisKKyAgICBzdHJ1Y3QgSW5wdXRTdXJmYWNlOworCisgICAgc3RydWN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb247CisKKyAgICB0eXBlZGVmIENvZGVjMkNsaWVudCBTdG9yZTsKKworICAgIHN0ZDo6c3RyaW5nIGdldFNlcnZpY2VOYW1lKCkgY29uc3QgeyByZXR1cm4gbVNlcnZpY2VOYW1lOyB9CisKKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBDMlN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCk7CisKKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjb25zdCBDMlN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UpOworCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZT4qIGNvbnN0IGlucHV0U3VyZmFjZSk7CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiYgbGlzdENvbXBvbmVudHMoKSBjb25zdDsKKworICAgIGMyX3N0YXR1c190IGNvcHlCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBzcmMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBkc3QpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCk7CisKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gQ3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBjb25zdCBjaGFyKiBzZXJ2aWNlTmFtZSwKKyAgICAgICAgICAgIGJvb2wgd2FpdEZvclNlcnZpY2UgPSB0cnVlKTsKKworICAgIC8vIFRyeSB0byBjcmVhdGUgYSBjb21wb25lbnQgd2l0aCBhIGdpdmVuIG5hbWUgZnJvbSBhbGwga25vd24KKyAgICAvLyBJQ29tcG9uZW50U3RvcmUgc2VydmljZXMuCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+IENyZWF0ZUNvbXBvbmVudEJ5TmFtZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+KiBvd25lciA9IG51bGxwdHIpOworCisgICAgLy8gVHJ5IHRvIGNyZWF0ZSBhIGNvbXBvbmVudCBpbnRlcmZhY2Ugd2l0aCBhIGdpdmVuIG5hbWUgZnJvbSBhbGwga25vd24KKyAgICAvLyBJQ29tcG9uZW50U3RvcmUgc2VydmljZXMuCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJbnRlcmZhY2U+IENyZWF0ZUludGVyZmFjZUJ5TmFtZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGludGVyZmFjZU5hbWUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Piogb3duZXIgPSBudWxscHRyKTsKKworICAgIC8vIExpc3QgdHJhaXRzIGZyb20gYWxsIGtub3duIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlcy4KKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4mIExpc3RDb21wb25lbnRzKCk7CisKKyAgICAvLyBDcmVhdGUgYW4gaW5wdXQgc3VyZmFjZS4KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZT4gQ3JlYXRlSW5wdXRTdXJmYWNlKCk7CisKKyAgICAvLyBiYXNlIGNhbm5vdCBiZSBudWxsLgorICAgIENvZGVjMkNsaWVudChjb25zdCBzcDxCYXNlPiYgYmFzZSwgc3RkOjpzdHJpbmcgc2VydmljZU5hbWUpOworCitwcm90ZWN0ZWQ6CisgICAgc3A8QmFzZT4gbUJhc2U7CisKKyAgICAvLyBGaW5kcyB0aGUgZmlyc3Qgc3RvcmUgd2hlcmUgdGhlIHByZWRpY2F0ZSByZXR1cm5zIE9LLCBhbmQgcmV0dXJucyB0aGUgbGFzdAorICAgIC8vIHByZWRpY2F0ZSByZXN1bHQuIFVzZXMga2V5IHRvIHJlbWVtYmVyIHRoZSBsYXN0IHN0b3JlIGZvdW5kLCBhbmQgaWYgY2FjaGVkLAorICAgIC8vIGl0IHRyaWVzIHRoYXQgc3RvcmUgYmVmb3JlIHRyeWluZyBhbGwgc3RvcmVzIChvbmUgcmV0cnkpLgorICAgIHN0YXRpYyBjMl9zdGF0dXNfdCBGb3JBbGxTdG9yZXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiYpPiBwcmVkaWNhdGUpOworCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBtdXRhYmxlIGJvb2wgbUxpc3RlZDsKKyAgICBzdGQ6OnN0cmluZyBtU2VydmljZU5hbWU7CisgICAgbXV0YWJsZSBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiBtVHJhaXRzTGlzdDsKKworICAgIHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ2xpZW50TWFuYWdlcj4KKyAgICAgICAgICAgIG1Ib3N0UG9vbE1hbmFnZXI7Cit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpJbnRlcmZhY2UgOiBwdWJsaWMgQ29kZWMyQ2xpZW50OjpDb25maWd1cmFibGUgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnRJbnRlcmZhY2UgQmFzZTsKKworICAgIEludGVyZmFjZShjb25zdCBzcDxCYXNlPiYgYmFzZSk7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxCYXNlPiBtQmFzZTsKK307CisKK3N0cnVjdCBDb2RlYzJDbGllbnQ6Okxpc3RlbmVyIHsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBwcm9kdWNlcyBzb21lIG91dHB1dC4KKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrRG9uZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29tcG9uZW50PiYgY29tcCwKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgPSAwOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGdvZXMgaW50byBhIHRyaXBwZWQgc3RhdGUuCisgICAgdmlydHVhbCB2b2lkIG9uVHJpcHBlZCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29tcG9uZW50PiYgY29tcCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiYgc2V0dGluZ1Jlc3VsdHMKKyAgICAgICAgICAgICkgPSAwOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGVuY291bnRlcnMgYW4gZXJyb3IuCisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3IoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4mIGNvbXAsCisgICAgICAgICAgICB1aW50MzJfdCBlcnJvckNvZGUpID0gMDsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIHByb2Nlc3MgdGhhdCBob3N0cyB0aGUgY29tcG9uZW50IHNodXRzIGRvd24KKyAgICAvLyB1bmV4cGVjdGVkbHkuCisgICAgdmlydHVhbCB2b2lkIG9uRGVhdGgoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4mIGNvbXApID0gMDsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gaW5wdXQgYnVmZmVyIGlzIG5vIGxvbmdlciBpbiB1c2UgYnkgdGhlIGNvZGVjLgorICAgIC8vIElucHV0IGJ1ZmZlcnMgdGhhdCBoYXZlIGJlZW4gcmV0dXJuZWQgYnkgb25Xb3JrRG9uZSgpIG9yIGZsdXNoKCkgd2lsbCBub3QKKyAgICAvLyB0cmlnZ2VyIGEgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLgorICAgIHZpcnR1YWwgdm9pZCBvbklucHV0QnVmZmVyRG9uZSgKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBhcnJheUluZGV4KSA9IDA7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgYmVjb21lcyBhd2FyZSBvZiBhIGZyYW1lIGJlaW5nCisgICAgLy8gcmVuZGVyZWQuCisgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVSZW5kZXJlZCgKKyAgICAgICAgICAgIHVpbnQ2NF90IGJ1ZmZlclF1ZXVlSWQsCisgICAgICAgICAgICBpbnQzMl90IHNsb3RJZCwKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wTnMpID0gMDsKKworICAgIHZpcnR1YWwgfkxpc3RlbmVyKCk7CisKK307CisKK3N0cnVjdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudCA6IHB1YmxpYyBDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZSB7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbXBvbmVudCBCYXNlOworCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3QgaWQsCisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCogYmxvY2tQb29sSWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29uZmlndXJhYmxlPiogY29uZmlndXJhYmxlKTsKKworICAgIGMyX3N0YXR1c190IGRlc3Ryb3lCbG9ja1Bvb2woCisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBsb2NhbElkKTsKKworICAgIGMyX3N0YXR1c190IHF1ZXVlKAorICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpOworCisgICAgYzJfc3RhdHVzX3QgZmx1c2goCisgICAgICAgICAgICBDMkNvbXBvbmVudDo6Zmx1c2hfbW9kZV90IG1vZGUsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yayk7CisKKyAgICBjMl9zdGF0dXNfdCBkcmFpbihDMkNvbXBvbmVudDo6ZHJhaW5fbW9kZV90IG1vZGUpOworCisgICAgYzJfc3RhdHVzX3Qgc3RhcnQoKTsKKworICAgIGMyX3N0YXR1c190IHN0b3AoKTsKKworICAgIGMyX3N0YXR1c190IHJlc2V0KCk7CisKKyAgICBjMl9zdGF0dXNfdCByZWxlYXNlKCk7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisgICAgdHlwZWRlZiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjoKKyAgICAgICAgICAgIFF1ZXVlQnVmZmVySW5wdXQgUXVldWVCdWZmZXJJbnB1dDsKKyAgICB0eXBlZGVmIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OgorICAgICAgICAgICAgUXVldWVCdWZmZXJPdXRwdXQgUXVldWVCdWZmZXJPdXRwdXQ7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyU291cmNlIEhHcmFwaGljQnVmZmVyU291cmNlOworCisgICAgLy8gU2V0IHRoZSBvdXRwdXQgc3VyZmFjZSB0byBiZSB1c2VkIHdpdGggYSBibG9ja3Bvb2wgcHJldmlvdXNseSBjcmVhdGVkIGJ5CisgICAgLy8gY3JlYXRlQmxvY2tQb29sKCkuCisgICAgYzJfc3RhdHVzX3Qgc2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkLAorICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UsCisgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uKTsKKworICAgIC8vIEV4dHJhY3QgYSBzbG90IG51bWJlciBmcm9tIG9mIHRoZSBibG9jaywgdGhlbiBjYWxsCisgICAgLy8gSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6cXVldWVCdWZmZXIoKS4KKyAgICAvLworICAgIC8vIElmIHRoZSBvdXRwdXQgc3VyZmFjZSBoYXMgbm90IGJlZW4gc2V0LCBOT19JTklUIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAvLyBJZiB0aGUgYmxvY2sgZG9lcyBub3QgY29tZSBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQgYmxvY2twb29sLAorICAgIC8vIGF0dGFjaEJ1ZmZlcigpIHdpbGwgYmUgY2FsbGVkLCBmb2xsb3dlZCBieSBxdWV1ZUJ1ZmZlcigpLgorICAgIC8vCisgICAgLy8gSWYgdGhlIGJsb2NrIGhhcyBhIGJxSWQgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGUgaWQgb2YgdGhlIG91dHB1dCBzdXJmYWNlLAorICAgIC8vIERFQURfT0JKRUNUIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAvLyBJZiB0aGUgY2FsbCB0byBxdWV1ZUJ1ZmZlcigpIGlzIHN1Y2Nlc3NmdWwgYnV0IHRoZSBibG9jayBjYW5ub3QgYmUKKyAgICAvLyBhc3NvY2lhdGVkIHRvIHRoZSBvdXRwdXQgc3VyZmFjZSBmb3IgYXV0b21hdGljIGNhbmNlbGxhdGlvbiB1cG9uCisgICAgLy8gZGVzdHJ1Y3Rpb24sIFVOS05PV05fRVJST1Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICAvLworICAgIC8vIE90aGVyd2lzZSwgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHF1ZXVlQnVmZmVyKCkgd2lsbCBiZSByZXR1cm5lZC4KKyAgICBzdGF0dXNfdCBxdWV1ZVRvT3V0cHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgY29uc3QgUXVldWVCdWZmZXJJbnB1dCYgaW5wdXQsCisgICAgICAgICAgICBRdWV1ZUJ1ZmZlck91dHB1dCogb3V0cHV0KTsKKworICAgIC8vIENvbm5lY3QgdG8gYSBnaXZlbiBJbnB1dFN1cmZhY2UuCisgICAgYzJfc3RhdHVzX3QgY29ubmVjdFRvSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZT4mIGlucHV0U3VyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiogY29ubmVjdGlvbik7CisKKyAgICBjMl9zdGF0dXNfdCBjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIsCisgICAgICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiogY29ubmVjdGlvbik7CisKKyAgICBjMl9zdGF0dXNfdCBkaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSgpOworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBDb21wb25lbnQoY29uc3Qgc3A8QmFzZT4mIGJhc2UpOworCisgICAgfkNvbXBvbmVudCgpOworCitwcm90ZWN0ZWQ6CisgICAgc3A8QmFzZT4gbUJhc2U7CisKKyAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOjpEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcgorICAgICAgICAgICAgbUJ1ZmZlclBvb2xTZW5kZXI7CisKKyAgICBzdGQ6Om11dGV4IG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4OworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1PdXRwdXRJZ2JwOworICAgIHVpbnQ2NF90IG1PdXRwdXRCcUlkOworICAgIHVpbnQzMl90IG1PdXRwdXRHZW5lcmF0aW9uOworCisgICAgc3RhdGljIGMyX3N0YXR1c190IHNldERlYXRoTGlzdGVuZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiYgbGlzdGVuZXIpOworICAgIHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50PiBtRGVhdGhSZWNpcGllbnQ7CisKKyAgICBmcmllbmQgc3RydWN0IENvZGVjMkNsaWVudDsKKworICAgIHN0cnVjdCBIaWRsTGlzdGVuZXI7CisgICAgdm9pZCBoYW5kbGVPbldvcmtEb25lKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJndvcmtJdGVtcyk7CisKK307CisKK3N0cnVjdCBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZSA6IHB1YmxpYyBDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZSB7CitwdWJsaWM6CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklJbnB1dFN1cmZhY2UgQmFzZTsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbgorICAgICAgICAgICAgQ29ubmVjdGlvbkJhc2U7CisKKyAgICB0eXBlZGVmIENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbiBDb25uZWN0aW9uOworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXIgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIGNvbnN0OworCisgICAgLy8gUmV0dXJuIHRoZSB1bmRlcmx5aW5nIElJbnB1dFN1cmZhY2UuCisgICAgc3A8QmFzZT4gZ2V0SGFsSW50ZXJmYWNlKCkgY29uc3Q7CisKKyAgICAvLyBiYXNlIGNhbm5vdCBiZSBudWxsLgorICAgIElucHV0U3VyZmFjZShjb25zdCBzcDxCYXNlPiYgYmFzZSk7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxCYXNlPiBtQmFzZTsKKworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1HcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKyAgICBmcmllbmQgc3RydWN0IENvZGVjMkNsaWVudDsKKyAgICBmcmllbmQgc3RydWN0IENvbXBvbmVudDsKK307CisKK3N0cnVjdCBDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZUNvbm5lY3Rpb24gOiBwdWJsaWMgQ29kZWMyQ2xpZW50OjpDb25maWd1cmFibGUgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklJbnB1dFN1cmZhY2VDb25uZWN0aW9uIEJhc2U7CisKKyAgICBjMl9zdGF0dXNfdCBkaXNjb25uZWN0KCk7CisKKyAgICAvLyBiYXNlIGNhbm5vdCBiZSBudWxsLgorICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oY29uc3Qgc3A8QmFzZT4mIGJhc2UpOworCitwcm90ZWN0ZWQ6CisgICAgc3A8QmFzZT4gbUJhc2U7CisKKyAgICBmcmllbmQgc3RydWN0IENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSElETF9DTElFTlRfSAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTY1MjVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icApAQCAtMCwwICsxLDM5IEBACitjY19iaW5hcnkgeworICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlIiwKKyAgICBkZWZhdWx0czogWyJoaWRsX2RlZmF1bHRzIl0sCisgICAgc29jX3NwZWNpZmljOiB0cnVlLAorICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogImh3IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ2ZW5kb3IuY3BwIiwKKyAgICBdLAorCisgICAgaW5pdF9yYzogWyJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlLnJjIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImxpYmF2c2VydmljZXNfbWluaWphaWxfdmVuZG9yIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbEAxLjAiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGFyY2g6IHsKKyAgICAgICAgYXJtOiB7CisgICAgICAgICAgICByZXF1aXJlZDogWyJjb2RlYzIudmVuZG9yLmJhc2UucG9saWN5Il0sCisgICAgICAgIH0sCisgICAgICAgIHg4NjogeworICAgICAgICAgICAgcmVxdWlyZWQ6IFsiY29kZWMyLnZlbmRvci5iYXNlLnBvbGljeSJdLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLm1rIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWIyOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI0IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKyMgdmVuZG9yIHNlcnZpY2Ugc2VjY29tcCBwb2xpY3kKK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLCQoZmlsdGVyICQoVEFSR0VUX0FSQ0gpLCB4ODYgeDg2XzY0IGFybSBhcm02NCkpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBjb2RlYzIudmVuZG9yLmJhc2UucG9saWN5CitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9WRU5ET1IpL2V0Yy9zZWNjb21wX3BvbGljeQorTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBjcmFzaF9kdW1wLnBvbGljeQoraWZkZWYgVEFSR0VUXzJORF9BUkNICisgICAgaWZuZXEgKCQoVEFSR0VUX1RSQU5TTEFURV8yTkRfQVJDSCksdHJ1ZSkKKyAgICAgICAgTE9DQUxfU1JDX0ZJTEVTIDo9IHNlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS0kKFRBUkdFVF8yTkRfQVJDSCkucG9saWN5CisgICAgZWxzZQorICAgICAgICBMT0NBTF9TUkNfRklMRVMgOj0gc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLSQoVEFSR0VUX0FSQ0gpLnBvbGljeQorICAgIGVuZGlmCitlbHNlCisgICAgTE9DQUxfU1JDX0ZJTEVTIDo9IHNlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS0kKFRBUkdFVF9BUkNIKS5wb2xpY3kKK2VuZGlmCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCitlbmRpZgorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCAkKExPQ0FMX1BBVEgpKQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlLnJjIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODA2YmQxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2UucmMKQEAgLTAsMCArMSw3IEBACitzZXJ2aWNlIGFuZHJvaWQtaGFyZHdhcmUtbWVkaWEtYzItaGFsLTEtMCAvdmVuZG9yL2Jpbi9ody9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlCisgICAgY2xhc3MgaGFsCisgICAgdXNlciBtZWRpYWNvZGVjCisgICAgZ3JvdXAgY2FtZXJhIG1lZGlhZHJtIGRybXJwYworICAgIGlvcHJpbyBydCA0CisgICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIuc29mdHdhcmUuYmFzZS1hcm0ucG9saWN5IGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UtYXJtLnBvbGljeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTg3MWQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UtYXJtLnBvbGljeQpAQCAtMCwwICsxLDczIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIE9yZ2FuaXplZCBieSBmcmVxdWVuY3kgb2Ygc3lzdGVtY2FsbCAtIGluIGRlc2NlbmRpbmcgb3JkZXIgZm9yCisjIGJlc3QgcGVyZm9ybWFuY2UuCitmdXRleDogMQoraW9jdGw6IDEKK3dyaXRlOiAxCitwcmN0bDogMQorY2xvY2tfZ2V0dGltZTogMQorZ2V0cHJpb3JpdHk6IDEKK3JlYWQ6IDEKK2Nsb3NlOiAxCit3cml0ZXY6IDEKK2R1cDogMQorcHBvbGw6IDEKK21tYXAyOiAxCitnZXRyYW5kb206IDEKKworIyBtcmVtYXA6IEVuc3VyZSB8ZmxhZ3N8IGFyZSAoTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQpIFRPRE86IE9uY2UgbWluaWphaWwKKyMgcGFyc2VyIHN1cHBvcnQgZm9yICc8JyBpcyBpbiB0aGlzIG5lZWRzIHRvIGJlIG1vZGlmaWVkIHRvIGFsc28gcHJldmVudAorIyB8b2xkX2FkZHJlc3N8IGFuZCB8bmV3X2FkZHJlc3N8IGZyb20gdG91Y2hpbmcgdGhlIGV4Y2VwdGlvbiB2ZWN0b3IgcGFnZSwgd2hpY2gKKyMgb24gQVJNIGlzIHN0YXRpY2FsbHkgbG9hZGVkIGF0IDB4ZmZmZiAwMDAwLiBTZWUKKyMgaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL2luZGV4LmpzcD90b3BpYz0vY29tLmFybS5kb2MuZGRpMDIxMWgvQmFiZmVlZ2EuaHRtbAorIyBmb3IgbW9yZSBkZXRhaWxzLgorbXJlbWFwOiBhcmczID09IDMKK211bm1hcDogMQorbXByb3RlY3Q6IDEKK21hZHZpc2U6IDEKK29wZW5hdDogMQorc2lnYWx0c3RhY2s6IDEKK2Nsb25lOiAxCitzZXRwcmlvcml0eTogMQorZ2V0dWlkMzI6IDEKK2ZzdGF0NjQ6IDEKK2ZzdGF0ZnM2NDogMQorcHJlYWQ2NDogMQorZmFjY2Vzc2F0OiAxCityZWFkbGlua2F0OiAxCitleGl0OiAxCitydF9zaWdwcm9jbWFzazogMQorc2V0X3RpZF9hZGRyZXNzOiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK2V4aXRfZ3JvdXA6IDEKK3J0X3NpZ3JldHVybjogMQorcGlwZTI6IDEKK2dldHRpbWVvZmRheTogMQorc2NoZWRfeWllbGQ6IDEKK25hbm9zbGVlcDogMQorbHNlZWs6IDEKK19sbHNlZWs6IDEKK3NjaGVkX2dldF9wcmlvcml0eV9tYXg6IDEKK3NjaGVkX2dldF9wcmlvcml0eV9taW46IDEKK3N0YXRmczY0OiAxCitzY2hlZF9zZXRzY2hlZHVsZXI6IDEKK2ZzdGF0YXQ2NDogMQordWdldHJsaW1pdDogMQorZ2V0ZGVudHM2NDogMQorZ2V0cmFuZG9tOiAxCisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAuYXJtLnBvbGljeQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIuc29mdHdhcmUuYmFzZS14ODYucG9saWN5IGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UteDg2LnBvbGljeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGM3NjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UteDg2LnBvbGljeQpAQCAtMCwwICsxLDU3IEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCityZWFkOiAxCittcHJvdGVjdDogMQorcHJjdGw6IDEKK29wZW5hdDogMQorZ2V0dWlkMzI6IDEKK3dyaXRldjogMQoraW9jdGw6IDEKK2Nsb3NlOiAxCittbWFwMjogMQorZnN0YXQ2NDogMQorbWFkdmlzZTogMQorZnN0YXRhdDY0OiAxCitmdXRleDogMQorbXVubWFwOiAxCitmYWNjZXNzYXQ6IDEKK19sbHNlZWs6IDEKK2xzZWVrOiAxCitjbG9uZTogMQorc2lnYWx0c3RhY2s6IDEKK3NldHByaW9yaXR5OiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK2V4aXQ6IDEKK2V4aXRfZ3JvdXA6IDEKK3J0X3NpZ3JldHVybjogMQordWdldHJsaW1pdDogMQorcmVhZGxpbmthdDogMQorX2xsc2VlazogMQorZnN0YXRmczY0OiAxCitwcmVhZDY0OiAxCittcmVtYXA6IDEKK2R1cDogMQorc2V0X3RpZF9hZGRyZXNzOiAxCit3cml0ZTogMQorbmFub3NsZWVwOiAxCisKKyMgUmVxdWlyZWQgYnkgQWRkcmVzc1Nhbml0aXplcgorZ2V0dGlkOiAxCitzY2hlZF95aWVsZDogMQorZ2V0cGlkOiAxCitnZXR0aWQ6IDEKKworQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODYucG9saWN5CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS1hcm0ucG9saWN5IGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLWFybS5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU4NzFkMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS1hcm0ucG9saWN5CkBAIC0wLDAgKzEsNzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgT3JnYW5pemVkIGJ5IGZyZXF1ZW5jeSBvZiBzeXN0ZW1jYWxsIC0gaW4gZGVzY2VuZGluZyBvcmRlciBmb3IKKyMgYmVzdCBwZXJmb3JtYW5jZS4KK2Z1dGV4OiAxCitpb2N0bDogMQord3JpdGU6IDEKK3ByY3RsOiAxCitjbG9ja19nZXR0aW1lOiAxCitnZXRwcmlvcml0eTogMQorcmVhZDogMQorY2xvc2U6IDEKK3dyaXRldjogMQorZHVwOiAxCitwcG9sbDogMQorbW1hcDI6IDEKK2dldHJhbmRvbTogMQorCisjIG1yZW1hcDogRW5zdXJlIHxmbGFnc3wgYXJlIChNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCkgVE9ETzogT25jZSBtaW5pamFpbAorIyBwYXJzZXIgc3VwcG9ydCBmb3IgJzwnIGlzIGluIHRoaXMgbmVlZHMgdG8gYmUgbW9kaWZpZWQgdG8gYWxzbyBwcmV2ZW50CisjIHxvbGRfYWRkcmVzc3wgYW5kIHxuZXdfYWRkcmVzc3wgZnJvbSB0b3VjaGluZyB0aGUgZXhjZXB0aW9uIHZlY3RvciBwYWdlLCB3aGljaAorIyBvbiBBUk0gaXMgc3RhdGljYWxseSBsb2FkZWQgYXQgMHhmZmZmIDAwMDAuIFNlZQorIyBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvaW5kZXguanNwP3RvcGljPS9jb20uYXJtLmRvYy5kZGkwMjExaC9CYWJmZWVnYS5odG1sCisjIGZvciBtb3JlIGRldGFpbHMuCittcmVtYXA6IGFyZzMgPT0gMworbXVubWFwOiAxCittcHJvdGVjdDogMQorbWFkdmlzZTogMQorb3BlbmF0OiAxCitzaWdhbHRzdGFjazogMQorY2xvbmU6IDEKK3NldHByaW9yaXR5OiAxCitnZXR1aWQzMjogMQorZnN0YXQ2NDogMQorZnN0YXRmczY0OiAxCitwcmVhZDY0OiAxCitmYWNjZXNzYXQ6IDEKK3JlYWRsaW5rYXQ6IDEKK2V4aXQ6IDEKK3J0X3NpZ3Byb2NtYXNrOiAxCitzZXRfdGlkX2FkZHJlc3M6IDEKK3Jlc3RhcnRfc3lzY2FsbDogMQorZXhpdF9ncm91cDogMQorcnRfc2lncmV0dXJuOiAxCitwaXBlMjogMQorZ2V0dGltZW9mZGF5OiAxCitzY2hlZF95aWVsZDogMQorbmFub3NsZWVwOiAxCitsc2VlazogMQorX2xsc2VlazogMQorc2NoZWRfZ2V0X3ByaW9yaXR5X21heDogMQorc2NoZWRfZ2V0X3ByaW9yaXR5X21pbjogMQorc3RhdGZzNjQ6IDEKK3NjaGVkX3NldHNjaGVkdWxlcjogMQorZnN0YXRhdDY0OiAxCit1Z2V0cmxpbWl0OiAxCitnZXRkZW50czY0OiAxCitnZXRyYW5kb206IDEKKworQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5hcm0ucG9saWN5CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS14ODYucG9saWN5IGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLXg4Ni5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjNzYyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS14ODYucG9saWN5CkBAIC0wLDAgKzEsNTcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3JlYWQ6IDEKK21wcm90ZWN0OiAxCitwcmN0bDogMQorb3BlbmF0OiAxCitnZXR1aWQzMjogMQord3JpdGV2OiAxCitpb2N0bDogMQorY2xvc2U6IDEKK21tYXAyOiAxCitmc3RhdDY0OiAxCittYWR2aXNlOiAxCitmc3RhdGF0NjQ6IDEKK2Z1dGV4OiAxCittdW5tYXA6IDEKK2ZhY2Nlc3NhdDogMQorX2xsc2VlazogMQorbHNlZWs6IDEKK2Nsb25lOiAxCitzaWdhbHRzdGFjazogMQorc2V0cHJpb3JpdHk6IDEKK3Jlc3RhcnRfc3lzY2FsbDogMQorZXhpdDogMQorZXhpdF9ncm91cDogMQorcnRfc2lncmV0dXJuOiAxCit1Z2V0cmxpbWl0OiAxCityZWFkbGlua2F0OiAxCitfbGxzZWVrOiAxCitmc3RhdGZzNjQ6IDEKK3ByZWFkNjQ6IDEKK21yZW1hcDogMQorZHVwOiAxCitzZXRfdGlkX2FkZHJlc3M6IDEKK3dyaXRlOiAxCituYW5vc2xlZXA6IDEKKworIyBSZXF1aXJlZCBieSBBZGRyZXNzU2FuaXRpemVyCitnZXR0aWQ6IDEKK3NjaGVkX3lpZWxkOiAxCitnZXRwaWQ6IDEKK2dldHRpZDogMQorCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLng4Ni5wb2xpY3kKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvdmVuZG9yLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3ZlbmRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyZjk4ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3ZlbmRvci5jcHAKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZSIKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8bWluaWphaWwuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisKKy8vIE9teFN0b3JlIGlzIGFkZGVkIGZvciB2aXNpYmlsaXR5IGJ5IGR1bXBzdGF0ZS4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmg+CisKKy8vIFRoaXMgaXMgY3JlYXRlZCBieSBtb2R1bGUgImNvZGVjMi52ZW5kb3IuYmFzZS5wb2xpY3kiLiBUaGlzIGNhbiBiZSBtb2RpZmllZC4KK3N0YXRpYyBjb25zdGV4cHIgY2hhciBrQmFzZVNlY2NvbXBQb2xpY3lQYXRoW10gPQorICAgICAgICAiL3ZlbmRvci9ldGMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLnBvbGljeSI7CisKKy8vIEFkZGl0aW9uYWwgZGV2aWNlLXNwZWNpZmljIHNlY2NvbXAgcGVybWlzc2lvbnMgY2FuIGJlIGFkZGVkIGluIHRoaXMgZmlsZS4KK3N0YXRpYyBjb25zdGV4cHIgY2hhciBrRXh0U2VjY29tcFBvbGljeVBhdGhbXSA9CisgICAgICAgICIvdmVuZG9yL2V0Yy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmV4dC5wb2xpY3kiOworCitjbGFzcyBEdW1teUMyU3RvcmUgOiBwdWJsaWMgQzJDb21wb25lbnRTdG9yZSB7CitwdWJsaWM6CisgICAgRHVtbXlDMlN0b3JlKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB+RHVtbXlDMlN0b3JlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gImRlZmF1bHQiOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgQzJTdHJpbmcgLypuYW1lKi8sCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCAvKmNvbXBvbmVudCovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBDMlN0cmluZyAvKiBuYW1lICovLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgLyogaW50ZXJmYWNlICovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+CisgICAgICAgICAgICBsaXN0Q29tcG9uZW50cygpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29weUJ1ZmZlcigKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IC8qIHNyYyAqLywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IC8qIGRzdCAqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3NtKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIC8qIHN0YWNrUGFyYW1zICovLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4mIC8qIGhlYXBQYXJhbUluZGljZXMgKi8sCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IC8qIGhlYXBQYXJhbXMgKi8pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWdfc20oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIC8qIHBhcmFtcyAqLywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgLyogZmFpbHVyZXMgKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UGFyYW1SZWZsZWN0b3IoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiogY29uc3QgLyogcGFyYW1zICovKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20oCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiAvKiBmaWVsZHMgKi8pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorfTsKKworaW50IG1haW4oaW50IC8qIGFyZ2MgKi8sIGNoYXIqKiAvKiBhcmd2ICovKSB7CisgICAgQUxPR0QoImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2Ugc3RhcnRpbmcuLi4iKTsKKworICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKyAgICBhbmRyb2lkOjpTZXRVcE1pbmlqYWlsKGtCYXNlU2VjY29tcFBvbGljeVBhdGgsIGtFeHRTZWNjb21wUG9saWN5UGF0aCk7CisKKyAgICAvLyB2bmRiaW5kZXIgaXMgbmVlZGVkIGJ5IEJ1ZmZlclF1ZXVlLgorICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6aW5pdFdpdGhEcml2ZXIoIi9kZXYvdm5kYmluZGVyIik7CisgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOworCisgICAgLy8gRXh0cmEgdGhyZWFkcyBtYXkgYmUgbmVlZGVkIHRvIGhhbmRsZSBhIHN0YWNrZWQgSVBDIHNlcXVlbmNlIHRoYXQKKyAgICAvLyBjb250YWlucyBhbHRlcm5hdGluZyBiaW5kZXIgYW5kIGh3YmluZGVyIGNhbGxzLiAoU2VlIGIvMzUyODM0ODAuKQorICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sKDgsIHRydWUgLyogY2FsbGVyV2lsbEpvaW4gKi8pOworCisgICAgLy8gQ3JlYXRlIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlLgorICAgIHsKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDsKKyAgICAgICAgYW5kcm9pZDo6c3A8SUNvbXBvbmVudFN0b3JlPiBzdG9yZTsKKworICAgICAgICAvLyBWZW5kb3IncyBUT0RPOiBSZXBsYWNlIHRoaXMgd2l0aAorICAgICAgICAvLyBzdG9yZSA9IG5ldyB1dGlsczo6Q29tcG9uZW50U3RvcmUoCisgICAgICAgIC8vICAgICAgICAgLyogaW1wbGVtZW50YXRpb24gb2YgQzJDb21wb25lbnRTdG9yZSAqLyk7CisgICAgICAgIEFMT0dEKCJJbnN0YW50aWF0aW5nIENvZGVjMidzIGR1bW15IElDb21wb25lbnRTdG9yZSBzZXJ2aWNlLi4uIik7CisgICAgICAgIHN0b3JlID0gbmV3IHV0aWxzOjpDb21wb25lbnRTdG9yZSgKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPER1bW15QzJTdG9yZT4oKSk7CisKKyAgICAgICAgaWYgKHN0b3JlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgY3JlYXRlIENvZGVjMidzIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHN0b3JlLT5yZWdpc3RlckFzU2VydmljZSgiZGVmYXVsdCIpICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCByZWdpc3RlciBDb2RlYzIncyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiSUNvbXBvbmVudFN0b3JlIHNlcnZpY2UuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dJKCJDb2RlYzIncyBJQ29tcG9uZW50U3RvcmUgc2VydmljZSBjcmVhdGVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmVnaXN0ZXIgSU9teFN0b3JlIHNlcnZpY2UuCisgICAgeworICAgICAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDsKKyAgICAgICAgYW5kcm9pZDo6c3A8SU9teFN0b3JlPiBvbXhTdG9yZSA9IG5ldyBpbXBsZW1lbnRhdGlvbjo6T214U3RvcmUoKTsKKyAgICAgICAgaWYgKG9teFN0b3JlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgY3JlYXRlIElPbXhTdG9yZSBIQUwgc2VydmljZS4iKTsKKyAgICAgICAgfSBlbHNlIGlmIChvbXhTdG9yZS0+cmVnaXN0ZXJBc1NlcnZpY2UoKSAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCByZWdpc3RlciBJT214U3RvcmUgSEFMIHNlcnZpY2UuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhbmRyb2lkOjpoYXJkd2FyZTo6am9pblJwY1RocmVhZHBvb2woKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIxMjY1MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTkgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlic2ZwbHVnaW5fY2NvZGVjIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyT01YTm9kZS5jcHAiLAorICAgICAgICAiQ0NvZGVjLmNwcCIsCisgICAgICAgICJDQ29kZWNCdWZmZXJDaGFubmVsLmNwcCIsCisgICAgICAgICJDQ29kZWNDb25maWcuY3BwIiwKKyAgICAgICAgIkNvZGVjMkJ1ZmZlci5jcHAiLAorICAgICAgICAiQ29kZWMySW5mb0J1aWxkZXIuY3BwIiwKKyAgICAgICAgIlBpcGVsaW5lV2F0Y2hlci5jcHAiLAorICAgICAgICAiUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmNwcCIsCisgICAgICAgICJTa2lwQ3V0QnVmZmVyLmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfaW50ZXJuYWwiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl9jbGllbnQiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycXVldWVfaGVscGVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2NvZGVjYmFzZSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teF91dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZDg1OWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmNwcApAQCAtMCwwICsxLDMyOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZmRlZiBfX0xQNjRfXworI2RlZmluZSBPTVhfQU5EUk9JRF9DT01QSUxFX0FTXzMyQklUX09OXzY0QklUX1BMQVRGT1JNUworI2VuZGlmCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJPTVhOb2RlIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxPTVhfSW5kZXguaD4KKyNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dWkvRmVuY2UuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CisKKyNpbmNsdWRlICJDMk9NWE5vZGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjbGFzcyBCdWZmZXIyRCA6IHB1YmxpYyBDMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQnVmZmVyMkQoQzJDb25zdEdyYXBoaWNCbG9jayBibG9jaykgOiBDMkJ1ZmZlcih7IGJsb2NrIH0pIHt9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworQzJPTVhOb2RlOjpDMk9NWE5vZGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcCkKKyAgICA6IG1Db21wKGNvbXApLCBtRnJhbWVJbmRleCgwKSwgbVdpZHRoKDApLCBtSGVpZ2h0KDApLAorICAgICAgbUFkanVzdFRpbWVzdGFtcEdhcFVzKDApLCBtRmlyc3RJbnB1dEZyYW1lKHRydWUpIHsKKyAgICAvLyBUT0RPOiByZWFkIGZyb20gaW50ZigpCisgICAgaWYgKCFzdHJuY21wKGNvbXAtPmdldE5hbWUoKS5jX3N0cigpLCAiYzIuYW5kcm9pZC4iLCAxMSkpIHsKKyAgICAgICAgbVVzYWdlID0gR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Vc2FnZSA9IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUjsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6ZnJlZU5vZGUoKSB7CisgICAgbUNvbXAucmVzZXQoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6c2VuZENvbW1hbmQoT01YX0NPTU1BTkRUWVBFIGNtZCwgT01YX1MzMiBwYXJhbSkgeworICAgIGlmIChjbWQgPT0gT01YX0NvbW1hbmRTdGF0ZVNldCAmJiBwYXJhbSA9PSBPTVhfU3RhdGVMb2FkZWQpIHsKKyAgICAgICAgLy8gUmVzZXQgZmlyc3QgaW5wdXQgZnJhbWUgc28gaWYgQzJPTVhOb2RlIGlzIHJlY3ljbGVkLCB0aGUgdGltZXN0YW1wIGRvZXMgbm90IGJlY29tZQorICAgICAgICAvLyBuZWdhdGl2ZS4gVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIEhXIGNvZGVjcyB0aGF0IGRvIG5vdCBoYW5kbGUgdGltZXN0YW1wIHJvbGxvdmVyLgorICAgICAgICBtRmlyc3RJbnB1dEZyYW1lID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmdldFBhcmFtZXRlcihPTVhfSU5ERVhUWVBFIGluZGV4LCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSB7CisgICAgc3RhdHVzX3QgZXJyID0gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgc3dpdGNoICgodWludDMyX3QpaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUNvbnN1bWVyVXNhZ2VCaXRzOiB7CisgICAgICAgICAgICBPTVhfVTMyICp1c2FnZSA9IChPTVhfVTMyICopcGFyYW1zOworICAgICAgICAgICAgKnVzYWdlID0gbVVzYWdlOworICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb246IHsKKyAgICAgICAgICAgIGlmIChzaXplIDwgc2l6ZW9mKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKnBEZWYgPSAoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqKXBhcmFtczsKKyAgICAgICAgICAgIC8vIFRPRE86IHJlYWQgdGhlc2UgZnJvbSBpbnRmKCkKKyAgICAgICAgICAgIHBEZWYtPm5CdWZmZXJDb3VudEFjdHVhbCA9IDE2OworICAgICAgICAgICAgcERlZi0+ZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluVmlkZW87CisgICAgICAgICAgICBwRGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CisgICAgICAgICAgICBwRGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gbUhlaWdodDsKKyAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNldFBhcmFtZXRlcihPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSB7CisgICAgLy8gaGFuZGxlIG1heC9maXhlZCBmcmFtZSBkdXJhdGlvbiBjb250cm9sCisgICAgaWYgKGluZGV4ID09IChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtTWF4RnJhbWVEdXJhdGlvbkZvckJpdHJhdGVDb250cm9sCisgICAgICAgICAgICAmJiBwYXJhbXMgIT0gTlVMTAorICAgICAgICAgICAgJiYgc2l6ZSA9PSBzaXplb2YoT01YX1BBUkFNX1UzMlRZUEUpKSB7CisgICAgICAgIC8vIFRoZSBpbmNvbWluZyBudW1iZXIgaXMgYW4gaW50MzJfdCBjb250YWluZWQgaW4gT01YX1UzMi4KKyAgICAgICAgbUFkanVzdFRpbWVzdGFtcEdhcFVzID0gKGludDMyX3QpKChPTVhfUEFSQU1fVTMyVFlQRSopcGFyYW1zKS0+blUzMjsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6Z2V0Q29uZmlnKE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKmNvbmZpZywgc2l6ZV90IHNpemUpIHsKKyAgICAodm9pZClpbmRleDsKKyAgICAodm9pZCljb25maWc7CisgICAgKHZvaWQpc2l6ZTsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6c2V0Q29uZmlnKE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKmNvbmZpZywgc2l6ZV90IHNpemUpIHsKKyAgICAodm9pZClpbmRleDsKKyAgICAodm9pZCljb25maWc7CisgICAgKHZvaWQpc2l6ZTsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6c2V0UG9ydE1vZGUoT01YX1UzMiBwb3J0SW5kZXgsIElPTVg6OlBvcnRNb2RlIG1vZGUpIHsKKyAgICAodm9pZClwb3J0SW5kZXg7CisgICAgKHZvaWQpbW9kZTsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6cHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCBlbmFibGUsCisgICAgICAgIE9NWF9VMzIgbWF4RnJhbWVXaWR0aCwgT01YX1UzMiBtYXhGcmFtZUhlaWdodCkgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZCllbmFibGU7CisgICAgKHZvaWQpbWF4RnJhbWVXaWR0aDsKKyAgICAodm9pZCltYXhGcmFtZUhlaWdodDsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6Y29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgIE9NWF9VMzIgYXVkaW9Id1N5bmMsIG5hdGl2ZV9oYW5kbGVfdCAqKnNpZGViYW5kSGFuZGxlKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICh2b2lkKXR1bm5lbGVkOworICAgICh2b2lkKWF1ZGlvSHdTeW5jOworICAgICpzaWRlYmFuZEhhbmRsZSA9IG51bGxwdHI7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmdldEdyYXBoaWNCdWZmZXJVc2FnZShPTVhfVTMyIHBvcnRJbmRleCwgT01YX1UzMiogdXNhZ2UpIHsKKyAgICAodm9pZClwb3J0SW5kZXg7CisgICAgKnVzYWdlID0gMDsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6c2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPElPTVhCdWZmZXJTb3VyY2U+ICZidWZmZXJTb3VyY2UpIHsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCktPmZldGNoQWxsb2NhdG9yKAorICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DLAorICAgICAgICAgICAgJm1BbGxvY2F0b3IpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1CdWZmZXJTb3VyY2UgPSBidWZmZXJTb3VyY2U7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmFsbG9jYXRlU2VjdXJlQnVmZmVyKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgc2l6ZV90IHNpemUsIGJ1ZmZlcl9pZCAqYnVmZmVyLAorICAgICAgICB2b2lkICoqYnVmZmVyRGF0YSwgc3A8TmF0aXZlSGFuZGxlPiAqbmF0aXZlSGFuZGxlKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICh2b2lkKXNpemU7CisgICAgKHZvaWQpbmF0aXZlSGFuZGxlOworICAgICpidWZmZXIgPSAwOworICAgICpidWZmZXJEYXRhID0gbnVsbHB0cjsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6dXNlQnVmZmVyKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3QgT01YQnVmZmVyICZvbXhCdWYsIGJ1ZmZlcl9pZCAqYnVmZmVyKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICh2b2lkKW9teEJ1ZjsKKyAgICAqYnVmZmVyID0gMDsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6ZnJlZUJ1ZmZlcihPTVhfVTMyIHBvcnRJbmRleCwgYnVmZmVyX2lkIGJ1ZmZlcikgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZClidWZmZXI7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmZpbGxCdWZmZXIoCisgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIsIGNvbnN0IE9NWEJ1ZmZlciAmb214QnVmLCBpbnQgZmVuY2VGZCkgeworICAgICh2b2lkKWJ1ZmZlcjsKKyAgICAodm9pZClvbXhCdWY7CisgICAgKHZvaWQpZmVuY2VGZDsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6ZW1wdHlCdWZmZXIoCisgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIsIGNvbnN0IE9NWEJ1ZmZlciAmb214QnVmLAorICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCkgeworICAgIC8vIFRPRE86IGJldHRlciBmZW5jZSBoYW5kbGluZworICAgIGlmIChmZW5jZUZkID49IDApIHsKKyAgICAgICAgc3A8RmVuY2U+IGZlbmNlID0gbmV3IEZlbmNlKGZlbmNlRmQpOworICAgICAgICBmZW5jZS0+d2FpdEZvcmV2ZXIoTE9HX1RBRyk7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcCA9IG1Db21wLmxvY2soKTsKKyAgICBpZiAoIWNvbXApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgdWludDMyX3QgYzJGbGFncyA9IChmbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykKKyAgICAgICAgICAgID8gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSA6IDA7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKworICAgIEMySGFuZGxlICpoYW5kbGUgPSBudWxscHRyOworICAgIGlmIChvbXhCdWYubUJ1ZmZlclR5cGUgPT0gT01YQnVmZmVyOjprQnVmZmVyVHlwZUFOV0J1ZmZlcgorICAgICAgICAgICAgJiYgb214QnVmLm1HcmFwaGljQnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOworICAgICAgICBoYW5kbGUgPSBXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZSgKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPmhhbmRsZSwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPndpZHRoLAorICAgICAgICAgICAgICAgIG9teEJ1Zi5tR3JhcGhpY0J1ZmZlci0+aGVpZ2h0LAorICAgICAgICAgICAgICAgIG9teEJ1Zi5tR3JhcGhpY0J1ZmZlci0+Zm9ybWF0LAorICAgICAgICAgICAgICAgIG9teEJ1Zi5tR3JhcGhpY0J1ZmZlci0+dXNhZ2UsCisgICAgICAgICAgICAgICAgb214QnVmLm1HcmFwaGljQnVmZmVyLT5zdHJpZGUpOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYyk7CisgICAgfSBlbHNlIGlmICghKGZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmsobmV3IEMyV29yayk7CisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpYzJGbGFnczsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKworICAgIC8vIFdPUktBUk9VTkQ6IGFkanVzdCB0aW1lc3RhbXAgYmFzZWQgb24gZ2FwVXMKKyAgICB7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbCA9IHRpbWVzdGFtcDsgLy8gc2F2ZSBpbnB1dCB0aW1lc3RhbXAKKyAgICAgICAgaWYgKG1GaXJzdElucHV0RnJhbWUpIHsKKyAgICAgICAgICAgIC8vIGdyYWIgdGltZXN0YW1wcyBvbiBmaXJzdCBmcmFtZQorICAgICAgICAgICAgbVByZXZJbnB1dFRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgICAgIG1QcmV2Q29kZWNUaW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgICAgICBtRmlyc3RJbnB1dEZyYW1lID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAobUFkanVzdFRpbWVzdGFtcEdhcFVzID4gMCkgeworICAgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPQorICAgICAgICAgICAgICAgIG1QcmV2Q29kZWNUaW1lc3RhbXAKKyAgICAgICAgICAgICAgICAgICAgICAgICsgYzJfbWluKCh0aW1lc3RhbXAgLSBtUHJldklucHV0VGltZXN0YW1wKS5wZWVrKCksIG1BZGp1c3RUaW1lc3RhbXBHYXBVcyk7CisgICAgICAgIH0gZWxzZSBpZiAobUFkanVzdFRpbWVzdGFtcEdhcFVzIDwgMCkgeworICAgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSBtUHJldkNvZGVjVGltZXN0YW1wIC0gbUFkanVzdFRpbWVzdGFtcEdhcFVzOworICAgICAgICB9CisgICAgICAgIG1QcmV2SW5wdXRUaW1lc3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWw7CisgICAgICAgIG1QcmV2Q29kZWNUaW1lc3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcDsKKyAgICAgICAgQUxPR1YoImFkanVzdGluZyAlbGxkIHRvICVsbGQgKGdhcD0lbGxkKSIsCisgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbC5wZWVrbGwoKSwKKyAgICAgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla2xsKCksCisgICAgICAgICAgICAgIChsb25nIGxvbmcpbUFkanVzdFRpbWVzdGFtcEdhcFVzKTsKKyAgICB9CisKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBtRnJhbWVJbmRleCsrOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBpZiAoYmxvY2spIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjMkJ1ZmZlcigKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgIG5ldyBCdWZmZXIyRChibG9jay0+c2hhcmUoCisgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QoYmxvY2stPndpZHRoKCksIGJsb2NrLT5oZWlnaHQoKSksIDo6QzJGZW5jZSgpKSksCisgICAgICAgICAgICAgICAgW2J1ZmZlciwgc291cmNlID0gZ2V0U291cmNlKCldKEMyQnVmZmVyICpwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHB0cjsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpc291cmNlLT5vbklucHV0QnVmZmVyRW1wdGllZChidWZmZXIsIC0xKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5wdXNoX2JhY2soYzJCdWZmZXIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgYzJfc3RhdHVzX3QgZXJyID0gY29tcC0+cXVldWUoJml0ZW1zKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpnZXRFeHRlbnNpb25JbmRleCgKKyAgICAgICAgY29uc3QgY2hhciAqcGFyYW1ldGVyTmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKKyAgICAodm9pZClwYXJhbWV0ZXJOYW1lOworICAgICppbmRleCA9IE9NWF9JbmRleE1heDsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6ZGlzcGF0Y2hNZXNzYWdlKGNvbnN0IG9teF9tZXNzYWdlJiBtc2cpIHsKKyAgICBpZiAobXNnLnR5cGUgIT0gb214X21lc3NhZ2U6OkVWRU5UKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisgICAgaWYgKG1zZy51LmV2ZW50X2RhdGEuZXZlbnQgIT0gT01YX0V2ZW50RGF0YVNwYWNlQ2hhbmdlZCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSA9IChhbmRyb2lkX2RhdGFzcGFjZSltc2cudS5ldmVudF9kYXRhLmRhdGExOworICAgIHVpbnQzMl90IHBpeGVsRm9ybWF0ID0gbXNnLnUuZXZlbnRfZGF0YS5kYXRhMzsKKworICAgIC8vIFRPRE86IHNldCBkYXRhc3BhY2Ugb24gY29tcG9uZW50IHRvIHNlZSBpZiBpdCBpbXBhY3RzIGNvbG9yIGFzcGVjdHMKKyAgICBBTE9HRCgiZGF0YXNwYWNlIGNoYW5nZWQgdG8gJSN4IHBpeGVsIGZvcm1hdDogJSN4IiwgZGF0YVNwYWNlLCBwaXhlbEZvcm1hdCk7CisgICAgcmV0dXJuIE9LOworfQorCitzcDxJT01YQnVmZmVyU291cmNlPiBDMk9NWE5vZGU6OmdldFNvdXJjZSgpIHsKKyAgICByZXR1cm4gbUJ1ZmZlclNvdXJjZTsKK30KKwordm9pZCBDMk9NWE5vZGU6OnNldEZyYW1lU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgbVdpZHRoID0gd2lkdGg7CisgICAgbUhlaWdodCA9IGhlaWdodDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWE4MTVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMl9PTVhfTk9ERV9IXworI2RlZmluZSBDMl9PTVhfTk9ERV9IXworCisjaW5jbHVkZSA8YXRvbWljPgorCisjaW5jbHVkZSA8YW5kcm9pZC9JT01YQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgorI2luY2x1ZGUgPG1lZGlhL09NWEJ1ZmZlci5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogSU9teE5vZGUgaW1wbGVtZW50YXRpb24gYXJvdW5kIGNvZGVjIDIuMCBjb21wb25lbnQsIG9ubHkgdG8gYmUgdXNlZCBpbgorICogSUdyYXBoaWNCdWZmZXJTb3VyY2U6OmNvbmZpZ3VyZS4gT25seSBzdWJzZXQgb2YgSU9teE5vZGUgQVBJIGlzIGltcGxlbWVudGVkCisgKiBhbmQgb3RoZXJzIGFyZSBsZWZ0IGFzIHN0dWIuIEFzIGEgcmVzdWx0LCBvbmUgY2Fubm90IGV4cGVjdCB0aGlzIElPbXhOb2RlCisgKiB0byB3b3JrIGluIGFueSBvdGhlciB1c2FnZSB0aGFuIElHcmFwaGljQnVmZmVyU291cmNlLgorICovCitzdHJ1Y3QgQzJPTVhOb2RlIDogcHVibGljIEJuT01YTm9kZSB7CisgICAgZXhwbGljaXQgQzJPTVhOb2RlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXApOworICAgIH5DMk9NWE5vZGUoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvLyBJT01YTm9kZQorICAgIHN0YXR1c190IGZyZWVOb2RlKCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2VuZENvbW1hbmQoT01YX0NPTU1BTkRUWVBFIGNtZCwgT01YX1MzMiBwYXJhbSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3Qgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0Q29uZmlnKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0Q29uZmlnKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3Qgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0UG9ydE1vZGUoT01YX1UzMiBwb3J0X2luZGV4LCBJT01YOjpQb3J0TW9kZSBtb2RlKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCBlbmFibGUsCisgICAgICAgICAgICBPTVhfVTMyIG1heEZyYW1lV2lkdGgsIE9NWF9VMzIgbWF4RnJhbWVIZWlnaHQpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCB0dW5uZWxlZCwKKyAgICAgICAgICAgIE9NWF9VMzIgYXVkaW9Id1N5bmMsIG5hdGl2ZV9oYW5kbGVfdCAqKnNpZGViYW5kSGFuZGxlKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBnZXRHcmFwaGljQnVmZmVyVXNhZ2UoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9VMzIqIHVzYWdlKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBzZXRJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBzcDxJT01YQnVmZmVyU291cmNlPiAmYnVmZmVyU291cmNlKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBhbGxvY2F0ZVNlY3VyZUJ1ZmZlcigKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCwgc2l6ZV90IHNpemUsIGJ1ZmZlcl9pZCAqYnVmZmVyLAorICAgICAgICAgICAgdm9pZCAqKmJ1ZmZlcl9kYXRhLCBzcDxOYXRpdmVIYW5kbGU+ICpuYXRpdmVfaGFuZGxlKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCB1c2VCdWZmZXIoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXgsIGNvbnN0IE9NWEJ1ZmZlciAmb214QnVmLCBidWZmZXJfaWQgKmJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZnJlZUJ1ZmZlcigKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydF9pbmRleCwgYnVmZmVyX2lkIGJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZmlsbEJ1ZmZlcigKKyAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIsIGNvbnN0IE9NWEJ1ZmZlciAmb214QnVmLCBpbnQgZmVuY2VGZCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZW1wdHlCdWZmZXIoCisgICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyLCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwKKyAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXAsIGludCBmZW5jZUZkKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBnZXRFeHRlbnNpb25JbmRleCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhcmFtZXRlcl9uYW1lLAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSAqaW5kZXgpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGRpc3BhdGNoTWVzc2FnZShjb25zdCBvbXhfbWVzc2FnZSAmbXNnKSBvdmVycmlkZTsKKworICAgIHNwPElPTVhCdWZmZXJTb3VyY2U+IGdldFNvdXJjZSgpOworICAgIHZvaWQgc2V0RnJhbWVTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOworCitwcml2YXRlOgorICAgIHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wOworICAgIHNwPElPTVhCdWZmZXJTb3VyY2U+IG1CdWZmZXJTb3VyY2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1GcmFtZUluZGV4OworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIHVpbnQ2NF90IG1Vc2FnZTsKKworICAgIC8vIFdPUktBUk9VTkQ6IHRpbWVzdGFtcCBhZGp1c3RtZW50CisKKyAgICAvLyBpZiA+MDogdGhpcyBpcyB0aGUgbWF4IHRpbWVzdGFtcCBnYXAsIGlmIDwwOiB0aGlzIGlzIC0xIHRpbWVzIHRoZSBmaXhlZCB0aW1lc3RhbXAgZ2FwCisgICAgLy8gaWYgMDogbm8gdGltZXN0YW1wIGFkanVzdG1lbnQgaXMgbWFkZQorICAgIC8vIG5vdGUgdGhhdCBDMk9NWE5vZGUgY2FuIGJlIHJlY3ljbGVkIGJldHdlZW4gZW5jb2Rpbmcgc2Vzc2lvbnMuCisgICAgaW50MzJfdCBtQWRqdXN0VGltZXN0YW1wR2FwVXM7CisgICAgYm9vbCBtRmlyc3RJbnB1dEZyYW1lOyAvLyB0cnVlIGZvciBmaXJzdCBpbnB1dAorICAgIGMyX2NudHI2NF90IG1QcmV2SW5wdXRUaW1lc3RhbXA7IC8vIGlucHV0IHRpbWVzdGFtcCBmb3IgcHJldmlvdXMgZnJhbWUKKyAgICBjMl9jbnRyNjRfdCBtUHJldkNvZGVjVGltZXN0YW1wOyAvLyBhZGp1c3RlZCAoY29kZWMpIHRpbWVzdGFtcCBmb3IgcHJldmlvdXMgZnJhbWUKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQzJfT01YX05PREVfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxMGM2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuY3BwCkBAIC0wLDAgKzEsMTc4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ0NvZGVjIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9JR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvSU9NWEJ1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8xLjAvSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0luZGV4RXh0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQnVmZmVyUHJvZHVjZXJXcmFwcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1BlcnNpc3RlbnRTdXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2UuaD4KKworI2luY2x1ZGUgIkMyT01YTm9kZS5oIgorI2luY2x1ZGUgIkNDb2RlYy5oIgorI2luY2x1ZGUgIkNDb2RlY0J1ZmZlckNoYW5uZWwuaCIKKyNpbmNsdWRlICJJbnB1dFN1cmZhY2VXcmFwcGVyLmgiCisKK2V4dGVybiAiQyIgYW5kcm9pZDo6UGVyc2lzdGVudFN1cmZhY2UgKkNyZWF0ZUlucHV0U3VyZmFjZSgpOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6dXRpbHM6OkgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKK3VzaW5nIEJHcmFwaGljQnVmZmVyU291cmNlID0gOjphbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclNvdXJjZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUlucHV0U3VyZmFjZTsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQ0NvZGVjV2F0Y2hkb2cgOiBwdWJsaWMgQUhhbmRsZXIgeworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRXYXRjaCwKKyAgICB9OworICAgIGNvbnN0ZXhwciBzdGF0aWMgaW50NjRfdCBrV2F0Y2hJbnRlcnZhbFVzID0gMzMwMDAwMDsgIC8vIDMuMyBzZWNzCisKK3B1YmxpYzoKKyAgICBzdGF0aWMgc3A8Q0NvZGVjV2F0Y2hkb2c+IGdldEluc3RhbmNlKCkgeworICAgICAgICBzdGF0aWMgc3A8Q0NvZGVjV2F0Y2hkb2c+IGluc3RhbmNlKG5ldyBDQ29kZWNXYXRjaGRvZyk7CisgICAgICAgIHN0YXRpYyBzdGQ6Om9uY2VfZmxhZyBmbGFnOworICAgICAgICAvLyBDYWxsIEluaXQoKSBvbmx5IG9uY2UuCisgICAgICAgIHN0ZDo6Y2FsbF9vbmNlKGZsYWcsIEluaXQsIGluc3RhbmNlKTsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIH5DQ29kZWNXYXRjaGRvZygpID0gZGVmYXVsdDsKKworICAgIHZvaWQgd2F0Y2goc3A8Q0NvZGVjPiBjb2RlYykgeworICAgICAgICBib29sIHNob3VsZFBvc3QgPSBmYWxzZTsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6OnNldDx3cDxDQ29kZWM+Pj46OkxvY2tlZCBjb2RlY3MobUNvZGVjc1RvV2F0Y2gpOworICAgICAgICAgICAgLy8gSWYgYSB3YXRjaCBtZXNzYWdlIGlzIGluIGZsaWdodCwgcGlnZ3ktYmFjayB0aGlzIGluc3RhbmNlIGFzIHdlbGwuCisgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHBvc3QgYSBuZXcgd2F0Y2ggbWVzc2FnZS4KKyAgICAgICAgICAgIHNob3VsZFBvc3QgPSBjb2RlY3MtPmVtcHR5KCk7CisgICAgICAgICAgICBjb2RlY3MtPmVtcGxhY2UoY29kZWMpOworICAgICAgICB9CisgICAgICAgIGlmIChzaG91bGRQb3N0KSB7CisgICAgICAgICAgICBBTE9HVigicG9zdGluZyB3YXRjaCBtZXNzYWdlIik7CisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0V2F0Y2gsIHRoaXMpKS0+cG9zdChrV2F0Y2hJbnRlcnZhbFVzKTsKKyAgICAgICAgfQorICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICAgICAgY2FzZSBrV2hhdFdhdGNoOiB7CisgICAgICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6OnNldDx3cDxDQ29kZWM+Pj46OkxvY2tlZCBjb2RlY3MobUNvZGVjc1RvV2F0Y2gpOworICAgICAgICAgICAgICAgIEFMT0dWKCJ3YXRjaCBmb3IgJXp1IGNvZGVjcyIsIGNvZGVjcy0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBjb2RlY3MtPmJlZ2luKCk7IGl0ICE9IGNvZGVjcy0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8Q0NvZGVjPiBjb2RlYyA9IGl0LT5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlYyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb2RlYy0+aW5pdGlhdGVSZWxlYXNlSWZTdHVjaygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb2RlY3MtPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICBUUkVTUEFTUygiQ0NvZGVjV2F0Y2hkb2c6IHVucmVjb2duaXplZCBtZXNzYWdlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgQ0NvZGVjV2F0Y2hkb2coKSA6IG1Mb29wZXIobmV3IEFMb29wZXIpIHt9CisKKyAgICBzdGF0aWMgdm9pZCBJbml0KGNvbnN0IHNwPENDb2RlY1dhdGNoZG9nPiAmdGhpeikgeworICAgICAgICBBTE9HVigiSW5pdCIpOworICAgICAgICB0aGl6LT5tTG9vcGVyLT5zZXROYW1lKCJDQ29kZWNXYXRjaGRvZyIpOworICAgICAgICB0aGl6LT5tTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpeik7CisgICAgICAgIHRoaXotPm1Mb29wZXItPnN0YXJ0KCk7CisgICAgfQorCisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKworICAgIE11dGV4ZWQ8c3RkOjpzZXQ8d3A8Q0NvZGVjPj4+IG1Db2RlY3NUb1dhdGNoOworfTsKKworY2xhc3MgQzJJbnB1dFN1cmZhY2VXcmFwcGVyIDogcHVibGljIElucHV0U3VyZmFjZVdyYXBwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEMySW5wdXRTdXJmYWNlV3JhcHBlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gJnN1cmZhY2UpIDoKKyAgICAgICAgbVN1cmZhY2Uoc3VyZmFjZSkgeworICAgIH0KKworICAgIH5DMklucHV0U3VyZmFjZVdyYXBwZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBzdGF0dXNfdCBjb25uZWN0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXApIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG9TdGF0dXNUKGNvbXAtPmNvbm5lY3RUb0lucHV0U3VyZmFjZShtU3VyZmFjZSwgJm1Db25uZWN0aW9uKSk7CisgICAgfQorCisgICAgdm9pZCBkaXNjb25uZWN0KCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUNvbm5lY3Rpb24tPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIG1Db25uZWN0aW9uID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1c190IHN0YXJ0KCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBJbnB1dFN1cmZhY2UgZG9lcyBub3QgZGlzdGluZ3Vpc2ggc3RhcnRlZCBzdGF0ZQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIG92ZXJyaWRlIHsKKyAgICAgICAgQzJJbnB1dFN1cmZhY2VFb3NUdW5pbmcgZW9zKHRydWUpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1TdXJmYWNlLT5jb25maWcoeyZlb3N9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBjb25maWd1cmUoQ29uZmlnICZjb25maWcgX191bnVzZWQpIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gbVN1cmZhY2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4gbUNvbm5lY3Rpb247Cit9OworCitjbGFzcyBHcmFwaGljQnVmZmVyU291cmNlV3JhcHBlciA6IHB1YmxpYyBJbnB1dFN1cmZhY2VXcmFwcGVyIHsKK3B1YmxpYzoKKy8vICAgIGV4cGxpY2l0IEdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyKGNvbnN0IHNwPEJHcmFwaGljQnVmZmVyU291cmNlPiAmc291cmNlKSA6IG1Tb3VyY2Uoc291cmNlKSB7fQorICAgIEdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QkdyYXBoaWNCdWZmZXJTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCkKKyAgICAgICAgOiBtU291cmNlKHNvdXJjZSksIG1XaWR0aCh3aWR0aCksIG1IZWlnaHQoaGVpZ2h0KSB7CisgICAgICAgIG1EYXRhU3BhY2UgPSBIQUxfREFUQVNQQUNFX0JUNzA5OworICAgIH0KKyAgICB+R3JhcGhpY0J1ZmZlclNvdXJjZVdyYXBwZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBzdGF0dXNfdCBjb25uZWN0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXApIG92ZXJyaWRlIHsKKyAgICAgICAgbU5vZGUgPSBuZXcgQzJPTVhOb2RlKGNvbXApOworICAgICAgICBtTm9kZS0+c2V0RnJhbWVTaXplKG1XaWR0aCwgbUhlaWdodCk7CisKKyAgICAgICAgLy8gTk9URTogd2UgZG8gbm90IHVzZS9wYXNzIHRocm91Z2ggY29sb3IgYXNwZWN0cyBmcm9tIEdyYXBoaWNCdWZmZXJTb3VyY2UgYXMgd2UKKyAgICAgICAgLy8gY29tbXVuaWNhdGUgdGhhdCBkaXJlY3RseSB0byB0aGUgY29tcG9uZW50LgorICAgICAgICBtU291cmNlLT5jb25maWd1cmUobU5vZGUsIG1EYXRhU3BhY2UpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgdm9pZCBkaXNjb25uZWN0KCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobU5vZGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNwPElPTVhCdWZmZXJTb3VyY2U+IHNvdXJjZSA9IG1Ob2RlLT5nZXRTb3VyY2UoKTsKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRCgiR0JTV3JhcHBlcjo6ZGlzY29ubmVjdDogbm9kZSBpcyBub3QgY29uZmlndXJlZCB3aXRoIE9NWEJ1ZmZlclNvdXJjZS4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzb3VyY2UtPm9uT214SWRsZSgpOworICAgICAgICBzb3VyY2UtPm9uT214TG9hZGVkKCk7CisgICAgICAgIG1Ob2RlLmNsZWFyKCk7CisgICAgfQorCisgICAgc3RhdHVzX3QgR2V0U3RhdHVzKGNvbnN0IGJpbmRlcjo6U3RhdHVzICZzdGF0dXMpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgZXJyID0gc3RhdHVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIGVyciA9IHN0YXR1cy50cmFuc2FjdGlvbkVycm9yKCk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAvLyBiaW5kZXIgc3RhdHVzIGZhaWxlZCwgYnV0IHRoZXJlIGlzIG5vIHNlcnZpZSBvciB0cmFuc2FjdGlvbiBlcnJvcgorICAgICAgICAgICAgICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXJ0KCkgb3ZlcnJpZGUgeworICAgICAgICBzcDxJT01YQnVmZmVyU291cmNlPiBzb3VyY2UgPSBtTm9kZS0+Z2V0U291cmNlKCk7CisgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICAgICAgY29uc3RleHByIHNpemVfdCBrTnVtU2xvdHMgPSAxNjsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU2xvdHM7ICsraSkgeworICAgICAgICAgICAgc291cmNlLT5vbklucHV0QnVmZmVyQWRkZWQoaSk7CisgICAgICAgIH0KKworICAgICAgICBzb3VyY2UtPm9uT214RXhlY3V0aW5nKCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gR2V0U3RhdHVzKG1Tb3VyY2UtPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSk7CisgICAgfQorCisgICAgc3RhdHVzX3QgY29uZmlndXJlKENvbmZpZyAmY29uZmlnKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHN0YXR1czsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisKKyAgICAgICAgLy8gaGFuZGxlIGVhY2ggY29uZmlndXJhdGlvbiBncmFudWFsbHksIGluIGNhc2Ugd2UgbmVlZCB0byBoYW5kbGUgcGFydCBvZiB0aGUgY29uZmlndXJhdGlvbgorICAgICAgICAvLyBlbHNld2hlcmUKKworICAgICAgICAvLyBUUklDS1k6IHdlIGRvIG5vdCB1bnNldCBmcmFtZSBkZWxheSByZXBlYXRpbmcKKyAgICAgICAgaWYgKGNvbmZpZy5tTWluRnBzID4gMCAmJiBjb25maWcubU1pbkZwcyAhPSBtQ29uZmlnLm1NaW5GcHMpIHsKKyAgICAgICAgICAgIGludDY0X3QgdXMgPSAxZTYgLyBjb25maWcubU1pbkZwcyArIDAuNTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5zZXRSZXBlYXRQcmV2aW91c0ZyYW1lRGVsYXlVcyh1cykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgbWluRnBzPSIgPDwgY29uZmlnLm1NaW5GcHMgPDwgIiA9PiByZXBlYXREZWxheVVzPSIgPDwgdXM7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tTWluRnBzID0gY29uZmlnLm1NaW5GcHM7CisgICAgICAgIH0KKworICAgICAgICAvLyBwdHMgZ2FwCisgICAgICAgIGlmIChjb25maWcubU1pbkFkanVzdGVkRnBzID4gMCB8fCBjb25maWcubUZpeGVkQWRqdXN0ZWRGcHMgPiAwKSB7CisgICAgICAgICAgICBpZiAobU5vZGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIE9NWF9QQVJBTV9VMzJUWVBFIHB0ckdhcFBhcmFtID0ge307CisgICAgICAgICAgICAgICAgcHRyR2FwUGFyYW0ublNpemUgPSBzaXplb2YoT01YX1BBUkFNX1UzMlRZUEUpOworICAgICAgICAgICAgICAgIHB0ckdhcFBhcmFtLm5VMzIgPSAoY29uZmlnLm1NaW5BZGp1c3RlZEZwcyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICA/IGMyX21pbihJTlQzMl9NQVggKyAwLiwgMWU2IC8gY29uZmlnLm1NaW5BZGp1c3RlZEZwcyArIDAuNSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogYzJfbWF4KDAuIC0gSU5UMzJfTUFYLCAtMWU2IC8gY29uZmlnLm1GaXhlZEFkanVzdGVkRnBzIC0gMC41KTsKKyAgICAgICAgICAgICAgICAodm9pZCltTm9kZS0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1NYXhGcmFtZUR1cmF0aW9uRm9yQml0cmF0ZUNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAmcHRyR2FwUGFyYW0sIHNpemVvZihwdHJHYXBQYXJhbSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbWF4IGZwcworICAgICAgICAvLyBUUklDS1k6IHdlIGRvIG5vdCB1bnNldCBtYXggZnBzIHRvIDAgdW5sZXNzIHVzaW5nIGZpeGVkIGZwcworICAgICAgICBpZiAoKGNvbmZpZy5tTWF4RnBzID4gMCB8fCAoY29uZmlnLm1GaXhlZEFkanVzdGVkRnBzID4gMCAmJiBjb25maWcubU1heEZwcyA9PSAwKSkKKyAgICAgICAgICAgICAgICAmJiBjb25maWcubU1heEZwcyAhPSBtQ29uZmlnLm1NYXhGcHMpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5zZXRNYXhGcHMoY29uZmlnLm1NYXhGcHMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIG1heEZwcz0iIDw8IGNvbmZpZy5tTWF4RnBzOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubU1heEZwcyA9IGNvbmZpZy5tTWF4RnBzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbmZpZy5tVGltZU9mZnNldFVzICE9IG1Db25maWcubVRpbWVPZmZzZXRVcykgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPnNldFRpbWVPZmZzZXRVcyhjb25maWcubVRpbWVPZmZzZXRVcykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgdGltZU9mZnNldCAiIDw8IGNvbmZpZy5tVGltZU9mZnNldFVzIDw8ICJ1cyI7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tVGltZU9mZnNldFVzID0gY29uZmlnLm1UaW1lT2Zmc2V0VXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29uZmlnLm1DYXB0dXJlRnBzICE9IG1Db25maWcubUNhcHR1cmVGcHMgfHwgY29uZmlnLm1Db2RlZEZwcyAhPSBtQ29uZmlnLm1Db2RlZEZwcykgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0KKyAgICAgICAgICAgICAgICBHZXRTdGF0dXMobVNvdXJjZS0+c2V0VGltZUxhcHNlQ29uZmlnKGNvbmZpZy5tQ29kZWRGcHMsIGNvbmZpZy5tQ2FwdHVyZUZwcykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgdGltZUxhcHNlICIgPDwgY29uZmlnLm1DYXB0dXJlRnBzIDw8ICJmcHMgYXMgIiA8PCBjb25maWcubUNvZGVkRnBzIDw8ICJmcHMiOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubUNhcHR1cmVGcHMgPSBjb25maWcubUNhcHR1cmVGcHM7CisgICAgICAgICAgICBtQ29uZmlnLm1Db2RlZEZwcyA9IGNvbmZpZy5tQ29kZWRGcHM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29uZmlnLm1TdGFydEF0VXMgIT0gbUNvbmZpZy5tU3RhcnRBdFVzCisgICAgICAgICAgICAgICAgfHwgKGNvbmZpZy5tU3RvcHBlZCAhPSBtQ29uZmlnLm1TdG9wcGVkICYmICFjb25maWcubVN0b3BwZWQpKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+c2V0U3RhcnRUaW1lVXMoY29uZmlnLm1TdGFydEF0VXMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIHN0YXJ0IGF0ICIgPDwgY29uZmlnLm1TdGFydEF0VXMgPDwgInVzIjsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1TdGFydEF0VXMgPSBjb25maWcubVN0YXJ0QXRVczsKKyAgICAgICAgICAgIG1Db25maWcubVN0b3BwZWQgPSBjb25maWcubVN0b3BwZWQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBzdXNwZW5kLXJlc3VtZQorICAgICAgICBpZiAoY29uZmlnLm1TdXNwZW5kZWQgIT0gbUNvbmZpZy5tU3VzcGVuZGVkKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+c2V0U3VzcGVuZChjb25maWcubVN1c3BlbmRlZCwgY29uZmlnLm1TdXNwZW5kQXRVcykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgIiA8PCAoY29uZmlnLm1TdXNwZW5kZWQgPyAic3VzcGVuZCIgOiAicmVzdW1lIikKKyAgICAgICAgICAgICAgICAgICAgPDwgIiBhdCAiIDw8IGNvbmZpZy5tU3VzcGVuZEF0VXMgPDwgInVzIjsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1TdXNwZW5kZWQgPSBjb25maWcubVN1c3BlbmRlZDsKKyAgICAgICAgICAgIG1Db25maWcubVN1c3BlbmRBdFVzID0gY29uZmlnLm1TdXNwZW5kQXRVczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25maWcubVN0b3BwZWQgIT0gbUNvbmZpZy5tU3RvcHBlZCAmJiBjb25maWcubVN0b3BwZWQpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5zZXRTdG9wVGltZVVzKGNvbmZpZy5tU3RvcEF0VXMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIHN0b3AgYXQgIiA8PCBjb25maWcubVN0b3BBdFVzIDw8ICJ1cyI7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiBkZWxheVVzIjsKKyAgICAgICAgICAgICAgICByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+Z2V0U3RvcFRpbWVPZmZzZXRVcygmY29uZmlnLm1JbnB1dERlbGF5VXMpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiPSIgPDwgY29uZmlnLm1JbnB1dERlbGF5VXMgPDwgInVzIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNvbmZpZy5tSW5wdXREZWxheVVzID0gY29uZmlnLm1JbnB1dERlbGF5VXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1TdG9wQXRVcyA9IGNvbmZpZy5tU3RvcEF0VXM7CisgICAgICAgICAgICBtQ29uZmlnLm1TdG9wcGVkID0gY29uZmlnLm1TdG9wcGVkOworICAgICAgICB9CisKKyAgICAgICAgLy8gY29sb3IgYXNwZWN0cyAoYW5kcm9pZC5fY29sb3ItYXNwZWN0cykKKworICAgICAgICAvLyBjb25zdW1lciB1c2FnZQorICAgICAgICBBTE9HRCgiSVNDb25maWclcyIsIHN0YXR1cy5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3A8QkdyYXBoaWNCdWZmZXJTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8QzJPTVhOb2RlPiBtTm9kZTsKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICBDb25maWcgbUNvbmZpZzsKK307CisKK2NsYXNzIENvZGVjMkNsaWVudEludGVyZmFjZVdyYXBwZXIgOiBwdWJsaWMgQzJDb21wb25lbnRTdG9yZSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gbUNsaWVudDsKKworcHVibGljOgorICAgIENvZGVjMkNsaWVudEludGVyZmFjZVdyYXBwZXIoc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gY2xpZW50KQorICAgICAgICA6IG1DbGllbnQoY2xpZW50KSB7IH0KKworICAgIHZpcnR1YWwgfkNvZGVjMkNsaWVudEludGVyZmFjZVdyYXBwZXIoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZ19zbSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiAqY29uc3QgZmFpbHVyZXMpIHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnQtPmNvbmZpZyhwYXJhbXMsIEMyX01BWV9CTE9DSywgZmFpbHVyZXMpOworICAgIH07CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvcHlCdWZmZXIoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+KSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgQzJTdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gKmNvbnN0IGNvbXBvbmVudCkgeworICAgICAgICBjb21wb25lbnQtPnJlc2V0KCk7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgQzJTdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gKmNvbnN0IGludGVyZmFjZSkgeworICAgICAgICBpbnRlcmZhY2UtPnJlc2V0KCk7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlfc20oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKmNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnQtPnF1ZXJ5KHN0YWNrUGFyYW1zLCBoZWFwUGFyYW1JbmRpY2VzLCBDMl9NQVlfQkxPQ0ssIGhlYXBQYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2xpZW50LT5xdWVyeVN1cHBvcnRlZFBhcmFtcyhwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20oCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnQtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKGZpZWxkcywgQzJfTUFZX0JMT0NLKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2xpZW50LT5nZXROYW1lKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UGFyYW1SZWZsZWN0b3IoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2xpZW50LT5nZXRQYXJhbVJlZmxlY3RvcigpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PiBsaXN0Q29tcG9uZW50cygpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4oKTsKKyAgICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworLy8gQ0NvZGVjOjpDbGllbnRMaXN0ZW5lcgorCitzdHJ1Y3QgQ0NvZGVjOjpDbGllbnRMaXN0ZW5lciA6IHB1YmxpYyBDb2RlYzJDbGllbnQ6Okxpc3RlbmVyIHsKKworICAgIGV4cGxpY2l0IENsaWVudExpc3RlbmVyKGNvbnN0IHdwPENDb2RlYz4gJmNvZGVjKSA6IG1Db2RlYyhjb2RlYykge30KKworICAgIHZpcnR1YWwgdm9pZCBvbldvcmtEb25lKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgb3ZlcnJpZGUgeworICAgICAgICAodm9pZCljb21wb25lbnQ7CisgICAgICAgIHNwPENDb2RlYz4gY29kZWMobUNvZGVjLnByb21vdGUoKSk7CisgICAgICAgIGlmICghY29kZWMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb2RlYy0+b25Xb3JrRG9uZSh3b3JrSXRlbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+JiBzZXR0aW5nUmVzdWx0CisgICAgICAgICAgICApIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICAodm9pZCljb21wb25lbnQ7CisgICAgICAgICh2b2lkKXNldHRpbmdSZXN1bHQ7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3IoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRPRE8KKyAgICAgICAgKHZvaWQpY29tcG9uZW50OworICAgICAgICAodm9pZCllcnJvckNvZGU7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRGVhdGgoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50KSBvdmVycmlkZSB7CisgICAgICAgIHsgLy8gTG9nIHRoZSBkZWF0aCBvZiB0aGUgY29tcG9uZW50LgorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wID0gY29tcG9uZW50LmxvY2soKTsKKyAgICAgICAgICAgIGlmICghY29tcCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYzIgY29tcG9uZW50IGRpZWQuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYzIgY29tcG9uZW50IFwiJXNcIiBkaWVkLiIsIGNvbXAtPmdldE5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCB0byBNZWRpYUNvZGVjLgorICAgICAgICBzcDxDQ29kZWM+IGNvZGVjKG1Db2RlYy5wcm9tb3RlKCkpOworICAgICAgICBpZiAoIWNvZGVjIHx8ICFjb2RlYy0+bUNhbGxiYWNrKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29kZWMtPm1DYWxsYmFjay0+b25FcnJvcihERUFEX09CSkVDVCwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lUmVuZGVyZWQodWludDY0X3QgYnVmZmVyUXVldWVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2xvdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBOcykgb3ZlcnJpZGUgeworICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQKKyAgICAgICAgKHZvaWQpYnVmZmVyUXVldWVJZDsKKyAgICAgICAgKHZvaWQpc2xvdElkOworICAgICAgICAodm9pZCl0aW1lc3RhbXBOczsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUoCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYXJyYXlJbmRleCkgb3ZlcnJpZGUgeworICAgICAgICBzcDxDQ29kZWM+IGNvZGVjKG1Db2RlYy5wcm9tb3RlKCkpOworICAgICAgICBpZiAoY29kZWMpIHsKKyAgICAgICAgICAgIGNvZGVjLT5vbklucHV0QnVmZmVyRG9uZShmcmFtZUluZGV4LCBhcnJheUluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICB3cDxDQ29kZWM+IG1Db2RlYzsKK307CisKKy8vIENDb2RlY0NhbGxiYWNrSW1wbAorCitjbGFzcyBDQ29kZWNDYWxsYmFja0ltcGwgOiBwdWJsaWMgQ0NvZGVjQ2FsbGJhY2sgeworcHVibGljOgorICAgIGV4cGxpY2l0IENDb2RlY0NhbGxiYWNrSW1wbChDQ29kZWMgKmNvZGVjKSA6IG1Db2RlYyhjb2RlYykge30KKyAgICB+Q0NvZGVjQ2FsbGJhY2tJbXBsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdm9pZCBvbkVycm9yKHN0YXR1c190IGVyciwgZW51bSBBY3Rpb25Db2RlIGFjdGlvbkNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNvZGVjLT5tQ2FsbGJhY2stPm9uRXJyb3IoZXJyLCBhY3Rpb25Db2RlKTsKKyAgICB9CisKKyAgICB2b2lkIG9uT3V0cHV0RnJhbWVzUmVuZGVyZWQoaW50NjRfdCBtZWRpYVRpbWVVcywgbnNlY3NfdCByZW5kZXJUaW1lTnMpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNvZGVjLT5tQ2FsbGJhY2stPm9uT3V0cHV0RnJhbWVzUmVuZGVyZWQoCisgICAgICAgICAgICAgICAge1JlbmRlcmVkRnJhbWVJbmZvKG1lZGlhVGltZVVzLCByZW5kZXJUaW1lTnMpfSk7CisgICAgfQorCisgICAgdm9pZCBvbk91dHB1dEJ1ZmZlcnNDaGFuZ2VkKCkgb3ZlcnJpZGUgeworICAgICAgICBtQ29kZWMtPm1DYWxsYmFjay0+b25PdXRwdXRCdWZmZXJzQ2hhbmdlZCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDQ29kZWMgKm1Db2RlYzsKK307CisKKy8vIENDb2RlYworCitDQ29kZWM6OkNDb2RlYygpCisgICAgOiBtQ2hhbm5lbChuZXcgQ0NvZGVjQnVmZmVyQ2hhbm5lbChzdGQ6Om1ha2Vfc2hhcmVkPENDb2RlY0NhbGxiYWNrSW1wbD4odGhpcykpKSB7Cit9CisKK0NDb2RlYzo6fkNDb2RlYygpIHsKK30KKworc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlckNoYW5uZWxCYXNlPiBDQ29kZWM6OmdldEJ1ZmZlckNoYW5uZWwoKSB7CisgICAgcmV0dXJuIG1DaGFubmVsOworfQorCitzdGF0dXNfdCBDQ29kZWM6OnRyeUFuZFJlcG9ydE9uRXJyb3Ioc3RkOjpmdW5jdGlvbjxzdGF0dXNfdCgpPiBqb2IpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBqb2IoKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihlcnIsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlQWxsb2NhdGVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBhdXRvIHNldEFsbG9jYXRpbmcgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gUkVMRUFTRUQpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KEFMTE9DQVRJTkcpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihzZXRBbGxvY2F0aW5nKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8UmVmQmFzZT4gY29kZWNJbmZvOworICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiY29kZWNJbmZvIiwgJmNvZGVjSW5mbykpOworICAgIC8vIEZvciBDb2RlYyAyLjAgY29tcG9uZW50cywgY29tcG9uZW50TmFtZSA9PSBjb2RlY0luZm8tPmdldENvZGVjTmFtZSgpLgorCisgICAgc3A8QU1lc3NhZ2U+IGFsbG9jTXNnKG5ldyBBTWVzc2FnZShrV2hhdEFsbG9jYXRlLCB0aGlzKSk7CisgICAgYWxsb2NNc2ctPnNldE9iamVjdCgiY29kZWNJbmZvIiwgY29kZWNJbmZvKTsKKyAgICBhbGxvY01zZy0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6YWxsb2NhdGUoY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZjb2RlY0luZm8pIHsKKyAgICBpZiAoY29kZWNJbmZvID09IG51bGxwdHIpIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HRCgiYWxsb2NhdGUoJXMpIiwgY29kZWNJbmZvLT5nZXRDb2RlY05hbWUoKSk7CisgICAgbUNsaWVudExpc3RlbmVyLnJlc2V0KG5ldyBDbGllbnRMaXN0ZW5lcih0aGlzKSk7CisKKyAgICBBU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBjb2RlY0luZm8tPmdldENvZGVjTmFtZSgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGNsaWVudDsKKworICAgIC8vIHNldCB1cCBwcmVmZXJyZWQgY29tcG9uZW50IHN0b3JlIHRvIGFjY2VzcyB2ZW5kb3Igc3RvcmUgcGFyYW1ldGVycworICAgIGNsaWVudCA9IENvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoImRlZmF1bHQiLCBmYWxzZSk7CisgICAgaWYgKGNsaWVudCkgeworICAgICAgICBBTE9HSSgic2V0dGluZyB1cCAnJXMnIGFzIGRlZmF1bHQgKHZlbmRvcikgc3RvcmUiLCBjbGllbnQtPmdldFNlcnZpY2VOYW1lKCkuY19zdHIoKSk7CisgICAgICAgIFNldFByZWZlcnJlZENvZGVjMkNvbXBvbmVudFN0b3JlKAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q29kZWMyQ2xpZW50SW50ZXJmYWNlV3JhcHBlcj4oY2xpZW50KSk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wID0KKyAgICAgICAgICAgIENvZGVjMkNsaWVudDo6Q3JlYXRlQ29tcG9uZW50QnlOYW1lKAorICAgICAgICAgICAgY29tcG9uZW50TmFtZS5jX3N0cigpLAorICAgICAgICAgICAgbUNsaWVudExpc3RlbmVyLAorICAgICAgICAgICAgJmNsaWVudCk7CisgICAgaWYgKCFjb21wKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgQ3JlYXRlIGNvbXBvbmVudDogJXMiLCBjb21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTRUQpOworICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dJKCJDcmVhdGVkIGNvbXBvbmVudCBbJXNdIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICBtQ2hhbm5lbC0+c2V0Q29tcG9uZW50KGNvbXApOworICAgIGF1dG8gc2V0QWxsb2NhdGVkID0gW3RoaXMsIGNvbXAsIGNsaWVudF0geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gQUxMT0NBVElORykgeworICAgICAgICAgICAgc3RhdGUtPnNldChSRUxFQVNFRCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KEFMTE9DQVRFRCk7CisgICAgICAgIHN0YXRlLT5jb21wID0gY29tcDsKKyAgICAgICAgbUNsaWVudCA9IGNsaWVudDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3Ioc2V0QWxsb2NhdGVkKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gaW5pdGlhbGl6ZSBjb25maWcgaGVyZSBpbiBjYXNlIHNldFBhcmFtZXRlcnMgaXMgY2FsbGVkIHByaW9yIHRvIGNvbmZpZ3VyZQorICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBjb25maWctPmluaXRpYWxpemUobUNsaWVudCwgY29tcCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGluaXRpYWxpemUgY29uZmlndXJhdGlvbiBzdXBwb3J0Iik7CisgICAgICAgIC8vIFRPRE86IHJlcG9ydCBlcnJvciBvbmNlIHdlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uLgorICAgIH0KKyAgICBjb25maWctPnF1ZXJ5Q29uZmlndXJhdGlvbihjb21wKTsKKworICAgIG1DYWxsYmFjay0+b25Db21wb25lbnRBbGxvY2F0ZWQoY29tcG9uZW50TmFtZS5jX3N0cigpKTsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlQ29uZmlndXJlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgYXV0byBjaGVja0FsbG9jYXRlZCA9IFt0aGlzXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgcmV0dXJuIChzdGF0ZS0+Z2V0KCkgIT0gQUxMT0NBVEVEKSA/IFVOS05PV05fRVJST1IgOiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGNoZWNrQWxsb2NhdGVkKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG1zZyhuZXcgQU1lc3NhZ2Uoa1doYXRDb25maWd1cmUsIHRoaXMpKTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgYXV0byBjaGVja0FsbG9jYXRlZCA9IFt0aGlzLCAmY29tcF0geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gQUxMT0NBVEVEKSB7CisgICAgICAgICAgICBzdGF0ZS0+c2V0KFJFTEVBU0VEKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNvbXAgPSBzdGF0ZS0+Y29tcDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3IoY2hlY2tBbGxvY2F0ZWQpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGRvQ29uZmlnID0gW21zZywgY29tcCwgdGhpc10oKSAtPiBzdGF0dXNfdCB7CisgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGVuY29kZXI7CisgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImVuY29kZXIiLCAmZW5jb2RlcikpIHsKKyAgICAgICAgICAgIGVuY29kZXIgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IHJlYWQgZnJvbSBpbnRmKCkKKyAgICAgICAgaWYgKCghZW5jb2RlcikgIT0gKGNvbXAtPmdldE5hbWUoKS5maW5kKCJlbmNvZGVyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3Qgc3RvcmVNZXRhOworICAgICAgICBpZiAoZW5jb2RlcgorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKCJhbmRyb2lkLl9pbnB1dC1tZXRhZGF0YS1idWZmZXItdHlwZSIsICZzdG9yZU1ldGEpCisgICAgICAgICAgICAgICAgJiYgc3RvcmVNZXRhICE9IGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkKSB7CisgICAgICAgICAgICBpZiAoc3RvcmVNZXRhICE9IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiT25seSBBTlcgYnVmZmVycyBhcmUgc3VwcG9ydGVkIGZvciBsZWdhY3kgbWV0YWRhdGEgbW9kZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2hhbm5lbC0+c2V0TWV0YU1vZGUoQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6TU9ERV9BTlcpOworICAgICAgICB9CisKKyAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOworICAgICAgICBpZiAobXNnLT5maW5kT2JqZWN0KCJuYXRpdmUtd2luZG93IiwgJm9iaikpIHsKKyAgICAgICAgICAgIHN1cmZhY2UgPSBzdGF0aWNfY2FzdDxTdXJmYWNlICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICBzZXRTdXJmYWNlKHN1cmZhY2UpOworICAgICAgICB9CisKKyAgICAgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgICAgICBjb25maWctPm1Vc2luZ1N1cmZhY2UgPSBzdXJmYWNlICE9IG51bGxwdHI7CisKKyAgICAgICAgLy8gRW5mb3JjZSByZXF1aXJlZCBwYXJhbWV0ZXJzCisgICAgICAgIGludDMyX3QgaTMyOworICAgICAgICBmbG9hdCBmbHQ7CisgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0FVRElPKSB7CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKEtFWV9TQU1QTEVfUkFURSwgJmkzMikpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgic2FtcGxlIHJhdGUgaXMgbWlzc2luZywgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIGF1ZGlvIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX0NIQU5ORUxfQ09VTlQsICZpMzIpKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImNoYW5uZWwgY291bnQgaXMgbWlzc2luZywgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIGF1ZGlvIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKQorICAgICAgICAgICAgICAgICAgICAmJiAhbWltZS5lcXVhbHNJZ25vcmVDYXNlKE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpCisgICAgICAgICAgICAgICAgICAgICYmICFtc2ctPmZpbmRJbnQzMihLRVlfQklUX1JBVEUsICZpMzIpCisgICAgICAgICAgICAgICAgICAgICYmICFtc2ctPmZpbmRGbG9hdChLRVlfQklUX1JBVEUsICZmbHQpKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImJpdHJhdGUgaXMgbWlzc2luZywgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIGF1ZGlvIGVuY29kZXJzLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIChDb25maWc6OklTX0lNQUdFIHwgQ29uZmlnOjpJU19WSURFTykpIHsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX1dJRFRILCAmaTMyKSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJ3aWR0aCBpcyBtaXNzaW5nLCB3aGljaCBpcyByZXF1aXJlZCBmb3IgaW1hZ2UvdmlkZW8gY29tcG9uZW50cy4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfSEVJR0hULCAmaTMyKSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJoZWlnaHQgaXMgbWlzc2luZywgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIGltYWdlL3ZpZGVvIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSAmJiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19WSURFTykpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKEtFWV9CSVRfUkFURSwgJmkzMikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFtc2ctPmZpbmRGbG9hdChLRVlfQklUX1JBVEUsICZmbHQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJiaXRyYXRlIGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciB2aWRlbyBlbmNvZGVycy4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfSV9GUkFNRV9JTlRFUlZBTCwgJmkzMikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFtc2ctPmZpbmRGbG9hdChLRVlfSV9GUkFNRV9JTlRFUlZBTCwgJmZsdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkkgZnJhbWUgaW50ZXJ2YWwgaXMgbWlzc2luZywgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIHZpZGVvIGVuY29kZXJzLiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEhhbmRsZSBpbnB1dCBzdXJmYWNlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICovCisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgKENvbmZpZzo6SVNfVklERU8gfCBDb25maWc6OklTX0lNQUdFKSkKKyAgICAgICAgICAgICAgICAmJiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSkgeworICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWcucmVzZXQobmV3IElucHV0U3VyZmFjZVdyYXBwZXI6OkNvbmZpZ3t9KTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bU1pbkZwcyA9IDA7CisgICAgICAgICAgICAgICAgaW50NjRfdCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50NjQoS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUiwgJnZhbHVlKSAmJiB2YWx1ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1NaW5GcHMgPSAxZTYgLyB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKHZvaWQpbXNnLT5maW5kRmxvYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBLRVlfTUFYX0ZQU19UT19FTkNPREVSLCAmY29uZmlnLT5tSVNDb25maWctPm1NYXhGcHMpOworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tTWluQWRqdXN0ZWRGcHMgPSAwOworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tRml4ZWRBZGp1c3RlZEZwcyA9IDA7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDY0KEtFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSLCAmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDAgJiYgdmFsdWUgPj0gSU5UMzJfTUlOKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bUZpeGVkQWRqdXN0ZWRGcHMgPSAtMWU2IC8gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPiAwICYmIHZhbHVlIDw9IElOVDMyX01BWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1NaW5BZGp1c3RlZEZwcyA9IDFlNiAvIHZhbHVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHZhbHVlOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmREb3VibGUoInRpbWUtbGFwc2UtZnBzIiwgJnZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bUNhcHR1cmVGcHMgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpbXNnLT5maW5kQXNGbG9hdChLRVlfRlJBTUVfUkFURSwgJmNvbmZpZy0+bUlTQ29uZmlnLT5tQ29kZWRGcHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tU3VzcGVuZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1TdXNwZW5kQXRVcyA9IC0xOworICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKEtFWV9DUkVBVEVfSU5QVVRfU1VSRkFDRV9TVVNQRU5ERUQsICZ2YWx1ZSkgJiYgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1TdXNwZW5kZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEhhbmRsZSBkZXNpcmVkIGNvbG9yIGZvcm1hdC4KKyAgICAgICAgICovCisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgKENvbmZpZzo6SVNfVklERU8gfCBDb25maWc6OklTX0lNQUdFKSkpIHsKKyAgICAgICAgICAgIGludDMyX3QgZm9ybWF0ID0gLTE7CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKEtFWV9DT0xPUl9GT1JNQVQsICZmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBBbHNvIGhhbmRsZSBkZWZhdWx0IGNvbG9yIGZvcm1hdCAoZW5jb2RlcnMgcmVxdWlyZSBjb2xvciBmb3JtYXQsIHNvIHRoaXMgaXMgb25seQorICAgICAgICAgICAgICAgICAqIG5lZWRlZCBmb3IgZGVjb2RlcnMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKCEoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAoc3VyZmFjZSA9PSBudWxscHRyKSA/IENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciA6IENPTE9SX0Zvcm1hdFN1cmZhY2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0ID49IDApIHsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJhbmRyb2lkLl9jb2xvci1mb3JtYXQiLCBmb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBjb25maWdVcGRhdGU7CisgICAgICAgIC8vIE5PVEU6IFdlIHVzZWQgdG8gaWdub3JlICJ2aWRlby1iaXRyYXRlIiBhdCBjb25maWd1cmU7IHJlcGxpY2F0ZQorICAgICAgICAvLyAgICAgICB0aGUgYmVoYXZpb3IgaGVyZS4KKyAgICAgICAgc3A8QU1lc3NhZ2U+IHNka1BhcmFtcyA9IG1zZzsKKyAgICAgICAgaW50MzJfdCB2aWRlb0JpdHJhdGU7CisgICAgICAgIGlmIChzZGtQYXJhbXMtPmZpbmRJbnQzMihQQVJBTUVURVJfS0VZX1ZJREVPX0JJVFJBVEUsICZ2aWRlb0JpdHJhdGUpKSB7CisgICAgICAgICAgICBzZGtQYXJhbXMgPSBtc2ctPmR1cCgpOworICAgICAgICAgICAgc2RrUGFyYW1zLT5yZW1vdmVFbnRyeUF0KHNka1BhcmFtcy0+ZmluZEVudHJ5QnlOYW1lKFBBUkFNRVRFUl9LRVlfVklERU9fQklUUkFURSkpOworICAgICAgICB9CisgICAgICAgIHN0YXR1c190IGVyciA9IGNvbmZpZy0+Z2V0Q29uZmlnVXBkYXRlRnJvbVNka1BhcmFtcygKKyAgICAgICAgICAgICAgICBjb21wLCBzZGtQYXJhbXMsIENvbmZpZzo6SVNfQ09ORklHLCBDMl9ET05UX0JMT0NLLCAmY29uZmlnVXBkYXRlKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byBjb252ZXJ0IGNvbmZpZ3VyYXRpb24gdG8gYzIgcGFyYW1zIik7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gY29uZmlnLT5zZXRQYXJhbWV0ZXJzKGNvbXAsIGNvbmZpZ1VwZGF0ZSwgQzJfRE9OVF9CTE9DSyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gY29uZmlndXJlIGMyIHBhcmFtcyIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgICAgICBDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dCB1c2FnZSgwdSwgMHUpOworICAgICAgICBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCBtYXhJbnB1dFNpemUoMHUsIDB1KTsKKworICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8QzJQYXJhbTo6SW5kZXg+IGluZGljZXMgeworICAgICAgICB9OworICAgICAgICBjMl9zdGF0dXNfdCBjMmVyciA9IGNvbXAtPnF1ZXJ5KAorICAgICAgICAgICAgICAgIHsgJnVzYWdlLCAmbWF4SW5wdXRTaXplIH0sCisgICAgICAgICAgICAgICAgaW5kaWNlcywKKyAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgICAgICZwYXJhbXMpOworICAgICAgICBpZiAoYzJlcnIgIT0gQzJfT0sgJiYgYzJlcnIgIT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHF1ZXJ5IGNvbXBvbmVudCBpbnRlcmZhY2U6ICVkIiwgYzJlcnIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gaW5kaWNlcy5zaXplKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb21wb25lbnQgcmV0dXJucyB3cm9uZyBudW1iZXIgb2YgcGFyYW1zOiBleHBlY3RlZCAlenUgYWN0dWFsICV6dSIsCisgICAgICAgICAgICAgICAgICAgIGluZGljZXMuc2l6ZSgpLCBwYXJhbXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmICh1c2FnZSAmJiAodXNhZ2UudmFsdWUgJiBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCkpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMigidXNpbmctc3ctcmVhZC1vZnRlbiIsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTk9URTogd2UgZG9uJ3QgYmxpbmRseSB1c2UgY2xpZW50IHNwZWNpZmllZCBpbnB1dCBzaXplIGlmIHNwZWNpZmllZCBhcyBjbGllbnRzCisgICAgICAgIC8vIGF0IHRpbWVzIHNwZWNpZnkgdG9vIHNtYWxsIHNpemUuIEluc3RlYWQsIG1pbWljIHRoZSBiZWhhdmlvciBmcm9tIE9NWCwgd2hlcmUgdGhlCisgICAgICAgIC8vIGNsaWVudCBzcGVjaWZpZWQgc2l6ZSBpcyBvbmx5IHVzZWQgdG8gYXNrIGZvciBiaWdnZXIgYnVmZmVycyB0aGFuIGNvbXBvbmVudCBzdWdnZXN0ZWQKKyAgICAgICAgLy8gc2l6ZS4KKyAgICAgICAgaW50MzJfdCBjbGllbnRJbnB1dFNpemUgPSAwOworICAgICAgICBib29sIGNsaWVudFNwZWNpZmllZElucHV0U2l6ZSA9CisgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMihLRVlfTUFYX0lOUFVUX1NJWkUsICZjbGllbnRJbnB1dFNpemUpICYmIGNsaWVudElucHV0U2l6ZSA+IDA7CisgICAgICAgIC8vIFRFTVA6IGVuZm9yY2UgbWluaW11bSBidWZmZXIgc2l6ZSBvZiAxTUIgZm9yIHZpZGVvIGRlY29kZXJzCisgICAgICAgIC8vIGFuZCAxNksgLyA0SyBmb3IgYXVkaW8gZW5jb2RlcnMvZGVjb2RlcnMKKyAgICAgICAgaWYgKG1heElucHV0U2l6ZS52YWx1ZSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19BVURJTykgeworICAgICAgICAgICAgICAgIG1heElucHV0U2l6ZS52YWx1ZSA9IGVuY29kZXIgPyAxNjM4NCA6IDQwOTY7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFlbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgbWF4SW5wdXRTaXplLnZhbHVlID0gMTA0ODU3NnU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB2ZXJpZnkgdGhhdCBDU0QgZml0cyBpbnRvIHRoaXMgc2l6ZSAoaWYgZGVmaW5lZCkKKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0RFQ09ERVIpICYmIG1heElucHV0U2l6ZS52YWx1ZSA+IDApIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNzZDsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgbXNnLT5maW5kQnVmZmVyKFN0cmluZ1ByaW50ZigiY3NkLSV6dSIsIGl4KS5jX3N0cigpLCAmY3NkKTsgKytpeCkgeworICAgICAgICAgICAgICAgIGlmIChjc2QgJiYgY3NkLT5zaXplKCkgPiBtYXhJbnB1dFNpemUudmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4SW5wdXRTaXplLnZhbHVlID0gY3NkLT5zaXplKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogZG8gdGhpcyBiYXNlZCBvbiBjb21wb25lbnQgcmVxdWlyaW5nIGxpbmVhciBhbGxvY2F0b3IgZm9yIGlucHV0CisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19ERUNPREVSKSB8fCAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19BVURJTykpIHsKKyAgICAgICAgICAgIGlmIChjbGllbnRTcGVjaWZpZWRJbnB1dFNpemUpIHsKKyAgICAgICAgICAgICAgICAvLyBXYXJuIHRoYXQgd2UncmUgb3ZlcnJpZGluZyBjbGllbnQncyBtYXggaW5wdXQgc2l6ZSBpZiBuZWNlc3NhcnkuCisgICAgICAgICAgICAgICAgaWYgKCh1aW50MzJfdCljbGllbnRJbnB1dFNpemUgPCBtYXhJbnB1dFNpemUudmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImNsaWVudCByZXF1ZXN0ZWQgbWF4IGlucHV0IHNpemUgJWQsIHdoaWNoIGlzIHNtYWxsZXIgdGhhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGF0IGNvbXBvbmVudCByZWNvbW1lbmRlZCAoJXUpOyBvdmVycmlkaW5nIHdpdGggY29tcG9uZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY29tbWVuZGF0aW9uLiIsIGNsaWVudElucHV0U2l6ZSwgbWF4SW5wdXRTaXplLnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIlRoaXMgYmVoYXZpb3IgaXMgc3ViamVjdCB0byBjaGFuZ2UuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYXBwIGRldmVsb3BlcnMgZG91YmxlIGNoZWNrIHdoZXRoZXIgdGhlIHJlcXVlc3RlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXggaW5wdXQgc2l6ZSBpcyBpbiByZWFzb25hYmxlIHJhbmdlLiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1heElucHV0U2l6ZS52YWx1ZSA9IGNsaWVudElucHV0U2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBQYXNzIG1heCBpbnB1dCBzaXplIG9uIGlucHV0IGZvcm1hdCB0byB0aGUgYnVmZmVyIGNoYW5uZWwgKGlmIHN1cHBsaWVkIGJ5IHRoZQorICAgICAgICAgICAgLy8gY29tcG9uZW50IG9yIGJ5IGEgZGVmYXVsdCkKKyAgICAgICAgICAgIGlmIChtYXhJbnB1dFNpemUudmFsdWUpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+c2V0SW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICBLRVlfTUFYX0lOUFVUX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCkoYzJfbWluKG1heElucHV0U2l6ZS52YWx1ZSwgdWludDMyX3QoSU5UMzJfTUFYKSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgKENvbmZpZzo6SVNfVklERU8gfCBDb25maWc6OklTX0lNQUdFKSkpIHsKKyAgICAgICAgICAgIC8vIHByb3BhZ2F0ZSBIRFIgc3RhdGljIGluZm8gdG8gb3V0cHV0IGZvcm1hdCBmb3IgYm90aCBlbmNvZGVycyBhbmQgZGVjb2RlcnMKKyAgICAgICAgICAgIC8vIGlmIGNvbXBvbmVudCBzdXBwb3J0cyB0aGlzIGluZm8sIHdlIHdpbGwgdXBkYXRlIGZyb20gY29tcG9uZW50LCBidXQgb25seSB0aGUgcmF3IHBvcnQsCisgICAgICAgICAgICAvLyBzbyBkb24ndCBwcm9wYWdhdGUgaWYgY29tcG9uZW50IGFscmVhZHkgZmlsbGVkIGl0IGluLgorICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gaGRySW5mbzsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoS0VZX0hEUl9TVEFUSUNfSU5GTywgJmhkckluZm8pCisgICAgICAgICAgICAgICAgICAgICYmICFjb25maWctPm1PdXRwdXRGb3JtYXQtPmZpbmRCdWZmZXIoS0VZX0hEUl9TVEFUSUNfSU5GTywgJmhkckluZm8pKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRCdWZmZXIoS0VZX0hEUl9TVEFUSUNfSU5GTywgaGRySW5mbyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNldCBkZXNpcmVkIGNvbG9yIGZvcm1hdCBmcm9tIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyCisgICAgICAgICAgICBpbnQzMl90IGZvcm1hdDsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5fY29sb3ItZm9ybWF0IiwgJmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfRk9STUFULCBmb3JtYXQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX0ZPUk1BVCwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9wYWdhdGUgZW5jb2RlciBkZWxheSBhbmQgcGFkZGluZyB0byBvdXRwdXQgZm9ybWF0CisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19ERUNPREVSKSAmJiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19BVURJTykpIHsKKyAgICAgICAgICAgIGludCBkZWxheSA9IDA7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImVuY29kZXItZGVsYXkiLCAmZGVsYXkpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiZW5jb2Rlci1kZWxheSIsIGRlbGF5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBwYWRkaW5nID0gMDsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZW5jb2Rlci1wYWRkaW5nIiwgJnBhZGRpbmcpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiZW5jb2Rlci1wYWRkaW5nIiwgcGFkZGluZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBzZXQgY2hhbm5lbC1tYXNrCisgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0FVRElPKSB7CisgICAgICAgICAgICBpbnQzMl90IG1hc2s7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoS0VZX0NIQU5ORUxfTUFTSywgJm1hc2spKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0NIQU5ORUxfTUFTSywgbWFzayk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ0hBTk5FTF9NQVNLLCBtYXNrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBBTE9HRCgic2V0dXAgZm9ybWF0cyBpbnB1dDogJXMgYW5kIG91dHB1dDogJXMiLAorICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihkb0NvbmZpZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKworICAgIG1DYWxsYmFjay0+b25Db21wb25lbnRDb25maWd1cmVkKGNvbmZpZy0+bUlucHV0Rm9ybWF0LCBjb25maWctPm1PdXRwdXRGb3JtYXQpOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVDcmVhdGVJbnB1dFN1cmZhY2UoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRFRCkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogcmVhZCBpdCBmcm9tIGludGYoKSBwcm9wZXJseS4KKyAgICAgICAgaWYgKHN0YXRlLT5jb21wLT5nZXROYW1lKCkuZmluZCgiZW5jb2RlciIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0oKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VDcmVhdGlvbkZhaWxlZChlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgKG5ldyBBTWVzc2FnZShrV2hhdENyZWF0ZUlucHV0U3VyZmFjZSwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3NwPFBlcnNpc3RlbnRTdXJmYWNlPiBDQ29kZWM6OkNyZWF0ZU9teElucHV0U3VyZmFjZSgpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7CisgICAgdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjp1dGlsczsKKyAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6dXRpbHM7CisgICAgdHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6U3RhdHVzIE9teFN0YXR1czsKKyAgICBhbmRyb2lkOjpzcDxJT214PiBvbXggPSBJT214OjpnZXRTZXJ2aWNlKCk7CisgICAgdHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKyAgICB0eXBlZGVmIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyU291cmNlIEhHcmFwaGljQnVmZmVyU291cmNlOworICAgIE9teFN0YXR1cyBzOworICAgIGFuZHJvaWQ6OnNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdicDsKKyAgICBhbmRyb2lkOjpzcDxIR3JhcGhpY0J1ZmZlclNvdXJjZT4gZ2JzOworICAgIGFuZHJvaWQ6OlJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG9teC0+Y3JlYXRlSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgWyZzLCAmZ2JwLCAmZ2JzXSgKKyAgICAgICAgICAgICAgICAgICAgT214U3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxIR3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSkgeworICAgICAgICAgICAgICAgIHMgPSBzdGF0dXM7CisgICAgICAgICAgICAgICAgZ2JwID0gcHJvZHVjZXI7CisgICAgICAgICAgICAgICAgZ2JzID0gc291cmNlOworICAgICAgICAgICAgfSk7CisgICAgaWYgKHRyYW5zU3RhdHVzLmlzT2soKSAmJiBzID09IE9teFN0YXR1czo6T0spIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQZXJzaXN0ZW50U3VyZmFjZSgKKyAgICAgICAgICAgICAgICBuZXcgSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyKGdicCksCisgICAgICAgICAgICAgICAgc3A8OjphbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclNvdXJjZT4obmV3IExXR3JhcGhpY0J1ZmZlclNvdXJjZShnYnMpKSk7CisgICAgfQorCisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3NwPFBlcnNpc3RlbnRTdXJmYWNlPiBDQ29kZWM6OkNyZWF0ZUNvbXBhdGlibGVJbnB1dFN1cmZhY2UoKSB7CisgICAgc3A8UGVyc2lzdGVudFN1cmZhY2U+IHN1cmZhY2UoQ3JlYXRlSW5wdXRTdXJmYWNlKCkpOworCisgICAgaWYgKHN1cmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBzdXJmYWNlID0gQ3JlYXRlT214SW5wdXRTdXJmYWNlKCk7CisgICAgfQorCisgICAgcmV0dXJuIHN1cmZhY2U7Cit9CisKK3ZvaWQgQ0NvZGVjOjpjcmVhdGVJbnB1dFN1cmZhY2UoKSB7CisgICAgc3RhdHVzX3QgZXJyOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGJ1ZmZlclByb2R1Y2VyOworCisgICAgc3A8QU1lc3NhZ2U+IGlucHV0Rm9ybWF0OworICAgIHNwPEFNZXNzYWdlPiBvdXRwdXRGb3JtYXQ7CisgICAgeworICAgICAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgICAgIGlucHV0Rm9ybWF0ID0gY29uZmlnLT5tSW5wdXRGb3JtYXQ7CisgICAgICAgIG91dHB1dEZvcm1hdCA9IGNvbmZpZy0+bU91dHB1dEZvcm1hdDsKKyAgICB9CisKKyAgICBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gcGVyc2lzdGVudFN1cmZhY2UgPSBDcmVhdGVDb21wYXRpYmxlSW5wdXRTdXJmYWNlKCk7CisKKyAgICBpZiAocGVyc2lzdGVudFN1cmZhY2UtPmdldEhpZGxUYXJnZXQoKSkgeworICAgICAgICBzcDxJSW5wdXRTdXJmYWNlPiBoaWRsSW5wdXRTdXJmYWNlID0gSUlucHV0U3VyZmFjZTo6Y2FzdEZyb20oCisgICAgICAgICAgICAgICAgcGVyc2lzdGVudFN1cmZhY2UtPmdldEhpZGxUYXJnZXQoKSk7CisgICAgICAgIGlmICghaGlkbElucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgQUxPR0UoIkNvcnJ1cHRlZCBpbnB1dCBzdXJmYWNlIik7CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlQ3JlYXRpb25GYWlsZWQoVU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPiBpbnB1dFN1cmZhY2UgPQorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+KGhpZGxJbnB1dFN1cmZhY2UpOworICAgICAgICBlcnIgPSBzZXR1cElucHV0U3VyZmFjZShzdGQ6Om1ha2Vfc2hhcmVkPEMySW5wdXRTdXJmYWNlV3JhcHBlcj4oCisgICAgICAgICAgICAgICAgaW5wdXRTdXJmYWNlKSk7CisgICAgICAgIGJ1ZmZlclByb2R1Y2VyID0gaW5wdXRTdXJmYWNlLT5nZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQzMl90IHdpZHRoID0gMDsKKyAgICAgICAgKHZvaWQpb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKTsKKyAgICAgICAgaW50MzJfdCBoZWlnaHQgPSAwOworICAgICAgICAodm9pZClvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCk7CisgICAgICAgIGVyciA9IHNldHVwSW5wdXRTdXJmYWNlKHN0ZDo6bWFrZV9zaGFyZWQ8R3JhcGhpY0J1ZmZlclNvdXJjZVdyYXBwZXI+KAorICAgICAgICAgICAgICAgIHBlcnNpc3RlbnRTdXJmYWNlLT5nZXRCdWZmZXJTb3VyY2UoKSwgd2lkdGgsIGhlaWdodCkpOworICAgICAgICBidWZmZXJQcm9kdWNlciA9IHBlcnNpc3RlbnRTdXJmYWNlLT5nZXRCdWZmZXJQcm9kdWNlcigpOworICAgIH0KKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgdXAgaW5wdXQgc3VyZmFjZTogJWQiLCBlcnIpOworICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlQ3JlYXRpb25GYWlsZWQoZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VDcmVhdGVkKAorICAgICAgICAgICAgaW5wdXRGb3JtYXQsCisgICAgICAgICAgICBvdXRwdXRGb3JtYXQsCisgICAgICAgICAgICBuZXcgQnVmZmVyUHJvZHVjZXJXcmFwcGVyKGJ1ZmZlclByb2R1Y2VyKSk7Cit9CisKK3N0YXR1c190IENDb2RlYzo6c2V0dXBJbnB1dFN1cmZhY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+ICZzdXJmYWNlKSB7CisgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgIGNvbmZpZy0+bVVzaW5nU3VyZmFjZSA9IHRydWU7CisKKyAgICAvLyB3ZSBhcmUgbm93IHVzaW5nIHN1cmZhY2UgLSBhcHBseSBkZWZhdWx0IGNvbG9yIGFzcGVjdHMgdG8gaW5wdXQgZm9ybWF0IC0gYXMgd2VsbCBhcworICAgIC8vIGdldCBkYXRhc3BhY2UKKyAgICBib29sIGlucHV0Rm9ybWF0Q2hhbmdlZCA9IGNvbmZpZy0+dXBkYXRlRm9ybWF0cyhjb25maWctPklTX0lOUFVUKTsKKyAgICBBTE9HRCgiaW5wdXQgZm9ybWF0ICVzIHRvICVzIiwKKyAgICAgICAgICAgIGlucHV0Rm9ybWF0Q2hhbmdlZCA/ICJjaGFuZ2VkIiA6ICJ1bmNoYW5nZWQiLAorICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICAvLyBjb25maWd1cmUgZGF0YXNwYWNlCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoaW50MzJfdCkgPT0gc2l6ZW9mKGFuZHJvaWRfZGF0YXNwYWNlKSwgImRhdGFzcGFjZSBzaXplIG1pc21hdGNoIik7CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOOworICAgICh2b2lkKWNvbmZpZy0+bUlucHV0Rm9ybWF0LT5maW5kSW50MzIoImFuZHJvaWQuX2RhdGFzcGFjZSIsIChpbnQzMl90KikmZGF0YVNwYWNlKTsKKyAgICBzdXJmYWNlLT5zZXREYXRhU3BhY2UoZGF0YVNwYWNlKTsKKworICAgIHN0YXR1c190IGVyciA9IG1DaGFubmVsLT5zZXRJbnB1dFN1cmZhY2Uoc3VyZmFjZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAvLyB1bmRvIGlucHV0IGZvcm1hdCB1cGRhdGUKKyAgICAgICAgY29uZmlnLT5tVXNpbmdTdXJmYWNlID0gZmFsc2U7CisgICAgICAgICh2b2lkKWNvbmZpZy0+dXBkYXRlRm9ybWF0cyhjb25maWctPklTX0lOUFVUKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgY29uZmlnLT5tSW5wdXRTdXJmYWNlID0gc3VyZmFjZTsKKworICAgIGlmIChjb25maWctPm1JU0NvbmZpZykgeworICAgICAgICBzdXJmYWNlLT5jb25maWd1cmUoKmNvbmZpZy0+bUlTQ29uZmlnKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgiSVNDb25maWc6IG5vIGNvbmZpZ3VyYXRpb24iKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZVNldElucHV0U3VyZmFjZShjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0SW5wdXRTdXJmYWNlLCB0aGlzKTsKKyAgICBtc2ctPnNldE9iamVjdCgic3VyZmFjZSIsIHN1cmZhY2UpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6c2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIHNwPEFNZXNzYWdlPiBpbnB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0OworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgICAgICBpbnB1dEZvcm1hdCA9IGNvbmZpZy0+bUlucHV0Rm9ybWF0OworICAgICAgICBvdXRwdXRGb3JtYXQgPSBjb25maWctPm1PdXRwdXRGb3JtYXQ7CisgICAgfQorICAgIGF1dG8gaGlkbFRhcmdldCA9IHN1cmZhY2UtPmdldEhpZGxUYXJnZXQoKTsKKyAgICBpZiAoaGlkbFRhcmdldCkgeworICAgICAgICBzcDxJSW5wdXRTdXJmYWNlPiBpbnB1dFN1cmZhY2UgPQorICAgICAgICAgICAgICAgIElJbnB1dFN1cmZhY2U6OmNhc3RGcm9tKGhpZGxUYXJnZXQpOworICAgICAgICBpZiAoIWlucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgaW5wdXQgc3VyZmFjZTogQ29ycnVwdGVkIHN1cmZhY2UuIik7CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlRGVjbGluZWQoVU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBJbnB1dFN1cmZhY2Uoc3RkOjptYWtlX3NoYXJlZDxDMklucHV0U3VyZmFjZVdyYXBwZXI+KAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+KGlucHV0U3VyZmFjZSkpKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgdXAgaW5wdXQgc3VyZmFjZTogJWQiLCBlcnIpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZURlY2xpbmVkKGVycik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQzMl90IHdpZHRoID0gMDsKKyAgICAgICAgKHZvaWQpb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKTsKKyAgICAgICAgaW50MzJfdCBoZWlnaHQgPSAwOworICAgICAgICAodm9pZClvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCk7CisgICAgICAgIHN0YXR1c190IGVyciA9IHNldHVwSW5wdXRTdXJmYWNlKHN0ZDo6bWFrZV9zaGFyZWQ8R3JhcGhpY0J1ZmZlclNvdXJjZVdyYXBwZXI+KAorICAgICAgICAgICAgICAgIHN1cmZhY2UtPmdldEJ1ZmZlclNvdXJjZSgpLCB3aWR0aCwgaGVpZ2h0KSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHVwIGlucHV0IHN1cmZhY2U6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VEZWNsaW5lZChlcnIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VBY2NlcHRlZChpbnB1dEZvcm1hdCwgb3V0cHV0Rm9ybWF0KTsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlU3RhcnQoKSB7CisgICAgYXV0byBzZXRTdGFydGluZyA9IFt0aGlzXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBBTExPQ0FURUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoU1RBUlRJTkcpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihzZXRTdGFydGluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzdGFydCgpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgYXV0byBjaGVja1N0YXJ0aW5nID0gW3RoaXMsICZjb21wXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBTVEFSVElORykgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY29tcCA9IHN0YXRlLT5jb21wOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihjaGVja1N0YXJ0aW5nKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZXJyID0gY29tcC0+c3RhcnQoKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcih0b1N0YXR1c1QoZXJyLCBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3N0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxBTWVzc2FnZT4gaW5wdXRGb3JtYXQ7CisgICAgc3A8QU1lc3NhZ2U+IG91dHB1dEZvcm1hdDsKKyAgICBzdGF0dXNfdCBlcnIyID0gT0s7CisgICAgeworICAgICAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgICAgIGlucHV0Rm9ybWF0ID0gY29uZmlnLT5tSW5wdXRGb3JtYXQ7CisgICAgICAgIG91dHB1dEZvcm1hdCA9IGNvbmZpZy0+bU91dHB1dEZvcm1hdDsKKyAgICAgICAgaWYgKGNvbmZpZy0+bUlucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgZXJyMiA9IGNvbmZpZy0+bUlucHV0U3VyZmFjZS0+c3RhcnQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZXJyMiAhPSBPSykgeworICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoZXJyMiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVycjIgPSBtQ2hhbm5lbC0+c3RhcnQoaW5wdXRGb3JtYXQsIG91dHB1dEZvcm1hdCk7CisgICAgaWYgKGVycjIgIT0gT0spIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKGVycjIsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gc2V0UnVubmluZyA9IFt0aGlzXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBTVEFSVElORykgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChSVU5OSU5HKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3Ioc2V0UnVubmluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ2FsbGJhY2stPm9uU3RhcnRDb21wbGV0ZWQoKTsKKworICAgICh2b2lkKW1DaGFubmVsLT5yZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygpOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVTaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQpIHsKKyAgICBpZiAoa2VlcENvbXBvbmVudEFsbG9jYXRlZCkgeworICAgICAgICBpbml0aWF0ZVN0b3AoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbml0aWF0ZVJlbGVhc2UoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZVN0b3AoKSB7CisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gQUxMT0NBVEVECisgICAgICAgICAgICAgICAgfHwgc3RhdGUtPmdldCgpICA9PSBSRUxFQVNFRAorICAgICAgICAgICAgICAgIHx8IHN0YXRlLT5nZXQoKSA9PSBTVE9QUElORworICAgICAgICAgICAgICAgIHx8IHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNJTkcpIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGFscmVhZHkgc3RvcHBlZCwgcmVsZWFzZWQsIG9yIGRvaW5nIGl0IHJpZ2h0IG5vdy4KKyAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vblN0b3BDb21wbGV0ZWQoKTsKKyAgICAgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KFNUT1BQSU5HKTsKKyAgICB9CisKKyAgICBtQ2hhbm5lbC0+c3RvcCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OnN0b3AoKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFJFTEVBU0lORykgeworICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICAvLyBXZSdyZSBhbHJlYWR5IHN0b3BwZWQgb3IgcmVsZWFzZSBpcyBpbiBwcm9ncmVzcy4KKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25TdG9wQ29tcGxldGVkKCk7CisgICAgICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUtPmdldCgpICE9IFNUT1BQSU5HKSB7CisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29tcCA9IHN0YXRlLT5jb21wOworICAgIH0KKyAgICBzdGF0dXNfdCBlcnIgPSBjb21wLT5zdG9wKCk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAvLyBUT0RPOiBjb252ZXJ0IGVyciBpbnRvIHN0YXR1c190CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgICAgIGlmIChjb25maWctPm1JbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZS0+ZGlzY29ubmVjdCgpOworICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRTdXJmYWNlID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBTVE9QUElORykgeworICAgICAgICAgICAgc3RhdGUtPnNldChBTExPQ0FURUQpOworICAgICAgICB9CisgICAgfQorICAgIG1DYWxsYmFjay0+b25TdG9wQ29tcGxldGVkKCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZVJlbGVhc2UoYm9vbCBzZW5kQ2FsbGJhY2sgLyogPSB0cnVlICovKSB7CisgICAgYm9vbCBjbGVhcklucHV0U3VyZmFjZUlmTmVlZGVkID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gUkVMRUFTRUQgfHwgc3RhdGUtPmdldCgpID09IFJFTEVBU0lORykgeworICAgICAgICAgICAgLy8gV2UncmUgYWxyZWFkeSByZWxlYXNlZCBvciBkb2luZyBpdCByaWdodCBub3cuCisgICAgICAgICAgICBpZiAoc2VuZENhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLT5vblJlbGVhc2VDb21wbGV0ZWQoKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBBTExPQ0FUSU5HKSB7CisgICAgICAgICAgICBzdGF0ZS0+c2V0KFJFTEVBU0lORyk7CisgICAgICAgICAgICAvLyBXaXRoIHRoZSBhbHRlcmVkIHN0YXRlIGFsbG9jYXRlKCkgd291bGQgZmFpbCBhbmQgY2xlYW4gdXAuCisgICAgICAgICAgICBpZiAoc2VuZENhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLT5vblJlbGVhc2VDb21wbGV0ZWQoKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBTVEFSVElORworICAgICAgICAgICAgICAgIHx8IHN0YXRlLT5nZXQoKSA9PSBSVU5OSU5HCisgICAgICAgICAgICAgICAgfHwgc3RhdGUtPmdldCgpID09IFNUT1BQSU5HKSB7CisgICAgICAgICAgICAvLyBJbnB1dCBzdXJmYWNlIG1heSBoYXZlIGJlZW4gc3RhcnRlZCwgc28gY2xlYW4gdXAgaXMgbmVlZGVkLgorICAgICAgICAgICAgY2xlYXJJbnB1dFN1cmZhY2VJZk5lZWRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChSRUxFQVNJTkcpOworICAgIH0KKworICAgIGlmIChjbGVhcklucHV0U3VyZmFjZUlmTmVlZGVkKSB7CisgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgaWYgKGNvbmZpZy0+bUlucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRTdXJmYWNlLT5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICBjb25maWctPm1JbnB1dFN1cmZhY2UgPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorCisgICAgbUNoYW5uZWwtPnN0b3AoKTsKKyAgICAvLyB0aGl6IGhvbGRzIHN0cm9uZyByZWYgdG8gdGhpcyB3aGlsZSB0aGUgdGhyZWFkIGlzIHJ1bm5pbmcuCisgICAgc3A8Q0NvZGVjPiB0aGl6KHRoaXMpOworICAgIHN0ZDo6dGhyZWFkKFt0aGl6LCBzZW5kQ2FsbGJhY2tdIHsgdGhpei0+cmVsZWFzZShzZW5kQ2FsbGJhY2spOyB9KS5kZXRhY2goKTsKK30KKwordm9pZCBDQ29kZWM6OnJlbGVhc2UoYm9vbCBzZW5kQ2FsbGJhY2spIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gUkVMRUFTRUQpIHsKKyAgICAgICAgICAgIGlmIChzZW5kQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2stPm9uUmVsZWFzZUNvbXBsZXRlZCgpOworICAgICAgICAgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgfQorICAgIGNvbXAtPnJlbGVhc2UoKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBzdGF0ZS0+c2V0KFJFTEVBU0VEKTsKKyAgICAgICAgc3RhdGUtPmNvbXAucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKHNlbmRDYWxsYmFjaykgeworICAgICAgICBtQ2FsbGJhY2stPm9uUmVsZWFzZUNvbXBsZXRlZCgpOworICAgIH0KK30KKworc3RhdHVzX3QgQ0NvZGVjOjpzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgcmV0dXJuIG1DaGFubmVsLT5zZXRTdXJmYWNlKHN1cmZhY2UpOworfQorCit2b2lkIENDb2RlYzo6c2lnbmFsRmx1c2goKSB7CisgICAgc3RhdHVzX3QgZXJyID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IEZMVVNIRUQpIHsKKyAgICAgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IFJVTk5JTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoRkxVU0hJTkcpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSgpOworICAgIHN3aXRjaCAoZXJyKSB7CisgICAgICAgIGNhc2UgQUxSRUFEWV9FWElTVFM6CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uRmx1c2hDb21wbGV0ZWQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSBPSzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKGVyciwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1DaGFubmVsLT5zdG9wKCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdEZsdXNoLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OmZsdXNoKCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICBhdXRvIGNoZWNrRmx1c2hpbmcgPSBbdGhpcywgJmNvbXBdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEZMVVNISU5HKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGNoZWNrRmx1c2hpbmcpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOworICAgIGMyX3N0YXR1c190IGVyciA9IGNvbXAtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4+OjpMb2NrZWQgcXVldWUobVdvcmtEb25lUXVldWUpOworICAgICAgICBmbHVzaGVkV29yay5zcGxpY2UoZmx1c2hlZFdvcmsuZW5kKCksICpxdWV1ZSk7CisgICAgfQorICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgLy8gVE9ETzogY29udmVydCBlcnIgaW50byBzdGF0dXNfdAorICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgIH0KKworICAgIG1DaGFubmVsLT5mbHVzaChmbHVzaGVkV29yayk7CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgc3RhdGUtPnNldChGTFVTSEVEKTsKKyAgICB9CisgICAgbUNhbGxiYWNrLT5vbkZsdXNoQ29tcGxldGVkKCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzaWduYWxSZXN1bWUoKSB7CisgICAgYXV0byBzZXRSZXN1bWluZyA9IFt0aGlzXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBGTFVTSEVEKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KFJFU1VNSU5HKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3Ioc2V0UmVzdW1pbmcpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAodm9pZCltQ2hhbm5lbC0+c3RhcnQobnVsbHB0ciwgbnVsbHB0cik7CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBSRVNVTUlORykgeworICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoUlVOTklORyk7CisgICAgfQorCisgICAgKHZvaWQpbUNoYW5uZWwtPnJlcXVlc3RJbml0aWFsSW5wdXRCdWZmZXJzKCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzaWduYWxTZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIGF1dG8gY2hlY2tTdGF0ZSA9IFt0aGlzLCAmY29tcF0geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gUkVMRUFTRUQpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGNoZWNrU3RhdGUpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBOT1RFOiBXZSB1c2VkIHRvIGlnbm9yZSAiYml0cmF0ZSIgYXQgc2V0UGFyYW1ldGVyczsgcmVwbGljYXRlCisgICAgLy8gICAgICAgdGhlIGJlaGF2aW9yIGhlcmUuCisgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG1zZzsKKyAgICBpbnQzMl90IGJpdHJhdGU7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKEtFWV9CSVRfUkFURSwgJmJpdHJhdGUpKSB7CisgICAgICAgIHBhcmFtcyA9IG1zZy0+ZHVwKCk7CisgICAgICAgIHBhcmFtcy0+cmVtb3ZlRW50cnlBdChwYXJhbXMtPmZpbmRFbnRyeUJ5TmFtZShLRVlfQklUX1JBVEUpKTsKKyAgICB9CisKKyAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgaW5wdXQgc3VyZmFjZSBwYXJhbWV0ZXJzCisgICAgICovCisgICAgaWYgKChjb25maWctPm1Eb21haW4gJiAoQ29uZmlnOjpJU19WSURFTyB8IENvbmZpZzo6SVNfSU1BR0UpKQorICAgICAgICAgICAgJiYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikgJiYgY29uZmlnLT5tSW5wdXRTdXJmYWNlICYmIGNvbmZpZy0+bUlTQ29uZmlnKSB7CisgICAgICAgICh2b2lkKXBhcmFtcy0+ZmluZEludDY0KFBBUkFNRVRFUl9LRVlfT0ZGU0VUX1RJTUUsICZjb25maWctPm1JU0NvbmZpZy0+bVRpbWVPZmZzZXRVcyk7CisKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDY0KCJza2lwLWZyYW1lcy1iZWZvcmUiLCAmY29uZmlnLT5tSVNDb25maWctPm1TdGFydEF0VXMpKSB7CisgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN0b3BwZWQgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMtPmZpbmRJbnQ2NCgic3RvcC10aW1lLXVzIiwgJmNvbmZpZy0+bUlTQ29uZmlnLT5tU3RvcEF0VXMpKSB7CisgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN0b3BwZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKFBBUkFNRVRFUl9LRVlfU1VTUEVORCwgJnZhbHVlKSkgeworICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1TdXNwZW5kZWQgPSB2YWx1ZTsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tU3VzcGVuZEF0VXMgPSAtMTsKKyAgICAgICAgICAgICh2b2lkKXBhcmFtcy0+ZmluZEludDY0KFBBUkFNRVRFUl9LRVlfU1VTUEVORF9USU1FLCAmY29uZmlnLT5tSVNDb25maWctPm1TdXNwZW5kQXRVcyk7CisgICAgICAgIH0KKworICAgICAgICAodm9pZCljb25maWctPm1JbnB1dFN1cmZhY2UtPmNvbmZpZ3VyZSgqY29uZmlnLT5tSVNDb25maWcpOworICAgICAgICBpZiAoY29uZmlnLT5tSVNDb25maWctPm1TdG9wcGVkKSB7CisgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+c2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLl9zdG9wLXRpbWUtb2Zmc2V0LXVzIiwgY29uZmlnLT5tSVNDb25maWctPm1JbnB1dERlbGF5VXMpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBjb25maWdVcGRhdGU7CisgICAgKHZvaWQpY29uZmlnLT5nZXRDb25maWdVcGRhdGVGcm9tU2RrUGFyYW1zKAorICAgICAgICAgICAgY29tcCwgcGFyYW1zLCBDb25maWc6OklTX1BBUkFNLCBDMl9NQVlfQkxPQ0ssICZjb25maWdVcGRhdGUpOworICAgIC8vIFByZWZlciB0byBwYXNzIHBhcmFtZXRlcnMgdG8gdGhlIGJ1ZmZlciBjaGFubmVsLCBzbyB0aGV5IGNhbiBiZSBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgZnJhbWVzLgorICAgIC8vIFBhcmFtZXRlciBzeW5jaHJvbml6YXRpb24gaXMgbm90IGRlZmluZWQgd2hlbiB1c2luZyBpbnB1dCBzdXJmYWNlLiBGb3Igbm93LCByb3V0ZQorICAgIC8vIHRoZXNlIGRpcmVjdGx5IHRvIHRoZSBjb21wb25lbnQuCisgICAgaWYgKGNvbmZpZy0+bUlucHV0U3VyZmFjZSA9PSBudWxscHRyCisgICAgICAgICAgICAmJiAocHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlY19kZWxheWVkX3BhcmFtcyIsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICB8fCBjb21wLT5nZXROYW1lKCkuZmluZCgiYzIuYW5kcm9pZC4iKSA9PSAwKSkgeworICAgICAgICBtQ2hhbm5lbC0+c2V0UGFyYW1ldGVycyhjb25maWdVcGRhdGUpOworICAgIH0gZWxzZSB7CisgICAgICAgICh2b2lkKWNvbmZpZy0+c2V0UGFyYW1ldGVycyhjb21wLCBjb25maWdVcGRhdGUsIEMyX01BWV9CTE9DSyk7CisgICAgfQorfQorCit2b2lkIENDb2RlYzo6c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIHsKKyAgICBtQ2FsbGJhY2stPm9uU2lnbmFsZWRJbnB1dEVPUyhtQ2hhbm5lbC0+c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpKTsKK30KKwordm9pZCBDQ29kZWM6OnNpZ25hbFJlcXVlc3RJRFJGcmFtZSgpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gUkVMRUFTRUQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJubyBJRFIgcmVxdWVzdCBzZW50IHNpbmNlIGNvbXBvbmVudCBpcyByZWxlYXNlZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbXAgPSBzdGF0ZS0+Y29tcDsKKyAgICB9CisgICAgQUxPR1YoInJlcXVlc3QgSURSIik7CisgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgIHBhcmFtcy5wdXNoX2JhY2soCisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PigwdSwgdHJ1ZSkpOworICAgIGNvbmZpZy0+c2V0UGFyYW1ldGVycyhjb21wLCBwYXJhbXMsIEMyX01BWV9CTE9DSyk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpvbldvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJndvcmtJdGVtcykgeworICAgIGlmICghd29ya0l0ZW1zLmVtcHR5KCkpIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+Pjo6TG9ja2VkIHF1ZXVlKG1Xb3JrRG9uZVF1ZXVlKTsKKyAgICAgICAgcXVldWUtPnNwbGljZShxdWV1ZS0+ZW5kKCksIHdvcmtJdGVtcyk7CisgICAgfQorICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRXb3JrRG9uZSwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpvbklucHV0QnVmZmVyRG9uZSh1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYXJyYXlJbmRleCkgeworICAgIG1DaGFubmVsLT5vbklucHV0QnVmZmVyRG9uZShmcmFtZUluZGV4LCBhcnJheUluZGV4KTsKK30KKwordm9pZCBDQ29kZWM6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgVGltZVBvaW50IG5vdyA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgIENDb2RlY1dhdGNoZG9nOjpnZXRJbnN0YW5jZSgpLT53YXRjaCh0aGlzKTsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRBbGxvY2F0ZTogeworICAgICAgICAgICAgLy8gQzJDb21wb25lbnRTdG9yZTo6Y3JlYXRlQ29tcG9uZW50KCkgc2hvdWxkIHJldHVybiB3aXRoaW4gMTAwbXMuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDE1MG1zLCAiYWxsb2NhdGUiKTsKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiY29kZWNJbmZvIiwgJm9iaikpOworICAgICAgICAgICAgYWxsb2NhdGUoKE1lZGlhQ29kZWNJbmZvICopb2JqLmdldCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRDb25maWd1cmU6IHsKKyAgICAgICAgICAgIC8vIEMyQ29tcG9uZW50Ojpjb21taXRfc20oKSBzaG91bGQgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDI1MG1zLCAiY29uZmlndXJlIik7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOworICAgICAgICAgICAgY29uZmlndXJlKGZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6IHsKKyAgICAgICAgICAgIC8vIEMyQ29tcG9uZW50OjpzdGFydCgpIHNob3VsZCByZXR1cm4gd2l0aGluIDUwMG1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCA1NTBtcywgInN0YXJ0Iik7CisgICAgICAgICAgICBzdGFydCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFN0b3A6IHsKKyAgICAgICAgICAgIC8vIEMyQ29tcG9uZW50OjpzdG9wKCkgc2hvdWxkIHJldHVybiB3aXRoaW4gNTAwbXMuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDU1MG1zLCAic3RvcCIpOworICAgICAgICAgICAgc3RvcCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdEZsdXNoOiB7CisgICAgICAgICAgICAvLyBDMkNvbXBvbmVudDo6Zmx1c2hfc20oKSBzaG91bGQgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDUwbXMsICJmbHVzaCIpOworICAgICAgICAgICAgZmx1c2goKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRDcmVhdGVJbnB1dFN1cmZhY2U6IHsKKyAgICAgICAgICAgIC8vIFN1cmZhY2Ugb3BlcmF0aW9ucyBtYXkgYmUgYnJpZWZseSBibG9ja2luZy4KKyAgICAgICAgICAgIHNldERlYWRsaW5lKG5vdywgMTAwbXMsICJjcmVhdGVJbnB1dFN1cmZhY2UiKTsKKyAgICAgICAgICAgIGNyZWF0ZUlucHV0U3VyZmFjZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFNldElucHV0U3VyZmFjZTogeworICAgICAgICAgICAgLy8gU3VyZmFjZSBvcGVyYXRpb25zIG1heSBiZSBicmllZmx5IGJsb2NraW5nLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCAxMDBtcywgInNldElucHV0U3VyZmFjZSIpOworICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzdXJmYWNlIiwgJm9iaikpOworICAgICAgICAgICAgc3A8UGVyc2lzdGVudFN1cmZhY2U+IHN1cmZhY2Uoc3RhdGljX2Nhc3Q8UGVyc2lzdGVudFN1cmZhY2UgKj4ob2JqLmdldCgpKSk7CisgICAgICAgICAgICBzZXRJbnB1dFN1cmZhY2Uoc3VyZmFjZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0V29ya0RvbmU6IHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgICAgICBib29sIHNob3VsZFBvc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleGVkPHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4+OjpMb2NrZWQgcXVldWUobVdvcmtEb25lUXVldWUpOworICAgICAgICAgICAgICAgIGlmIChxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd29yay5zd2FwKHF1ZXVlLT5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICBxdWV1ZS0+cG9wX2Zyb250KCk7CisgICAgICAgICAgICAgICAgc2hvdWxkUG9zdCA9ICFxdWV1ZS0+ZW1wdHkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaG91bGRQb3N0KSB7CisgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFdvcmtEb25lLCB0aGlzKSktPnBvc3QoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaGFuZGxlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBpbiB3b3JrIGRvbmUKKyAgICAgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgQ29uZmlnOjpXYXRjaGVyPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+IGluaXREYXRhID0KKyAgICAgICAgICAgICAgICBjb25maWctPndhdGNoPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+KCk7CisgICAgICAgICAgICBpZiAoIXdvcmstPndvcmtsZXRzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgQzJGcmFtZURhdGE6OkZMQUdfRElTQ0FSRF9GUkFNRSkgPT0gMCkgeworCisgICAgICAgICAgICAgICAgLy8gY29weSBidWZmZXIgaW5mbyB0byBjb25maWcKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHVwZGF0ZXMgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZSk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgc3RyZWFtID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZiA6IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gJmluZm8gOiBidWYtPmluZm8oKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSBhbGwgaW5mbyBpbnRvIG91dHB1dC1zdHJlYW0gIzAgZG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjayhDMlBhcmFtOjpDb3B5QXNTdHJlYW0oKmluZm8sIHRydWUgLyogb3V0cHV0ICovLCBzdHJlYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgJmJsb2NrIDogYnVmLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBTE9HVigiZ290IG91dHB1dCBidWZmZXIgd2l0aCBjcm9wICV1LCV1KyV1LCV1IGFuZCBzaXplICV1LCV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYmxvY2suY3JvcCgpLmxlZnQsIGJsb2NrLmNyb3AoKS50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIGJsb2NrLmNyb3AoKS53aWR0aCwgYmxvY2suY3JvcCgpLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYmxvY2sud2lkdGgoKSwgYmxvY2suaGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlcy5lbXBsYWNlX2JhY2sobmV3IEMyU3RyZWFtQ3JvcFJlY3RJbmZvOjpvdXRwdXQoc3RyZWFtLCBibG9jay5jcm9wKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZXMuZW1wbGFjZV9iYWNrKG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIGJsb2NrLndpZHRoKCksIGJsb2NrLmhlaWdodCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gZm9yIG5vdyBvbmx5IGRvIHRoZSBmaXJzdCBibG9jaworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrc3RyZWFtOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNoYW5nZWQgPSBjb25maWctPnVwZGF0ZUNvbmZpZ3VyYXRpb24odXBkYXRlcywgY29uZmlnLT5tT3V0cHV0RG9tYWluKTsKKworICAgICAgICAgICAgICAgIC8vIGNvcHkgc3RhbmRhcmQgaW5mb3MgdG8gZ3JhcGhpYyBidWZmZXJzIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQgKG90aGVyd2lzZSwgd2UKKyAgICAgICAgICAgICAgICAvLyBtYXkgb3ZlcndyaXRlIHRoZSBhY3R1YWwgaW50ZXJtZWRpYXRlIHZhbHVlIHdpdGggYSBmaW5hbCB2YWx1ZSkKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSAwOworICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gc3RkR2Z4SW5mb3MgPSB7CisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbURhdGFTcGFjZUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVBpeGVsQXNwZWN0UmF0aW9JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtU3VyZmFjZVNjYWxpbmdJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmIDogd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Zi0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQzJQYXJhbTo6SW5kZXggaXggOiBzdGRHZnhJbmZvcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYnVmLT5oYXNJbmZvKGl4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBhcmFtICpwYXJhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmdldENvbmZpZ1BhcmFtZXRlclZhbHVlKGl4LndpdGhTdHJlYW0oc3RyZWFtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IGluZm8oQzJQYXJhbTo6Q29weSgqcGFyYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi0+c2V0SW5mbyhzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJJbmZvPihpbmZvKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKytzdHJlYW07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNoYW5uZWwtPm9uV29ya0RvbmUoCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZSh3b3JrKSwgY2hhbmdlZCA/IGNvbmZpZy0+bU91dHB1dEZvcm1hdCA6IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIGluaXREYXRhLmhhc0NoYW5nZWQoKSA/IGluaXREYXRhLnVwZGF0ZSgpLmdldCgpIDogbnVsbHB0cik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0V2F0Y2g6IHsKKyAgICAgICAgICAgIC8vIHdhdGNoIG1lc3NhZ2UgYWxyZWFkeSBwb3N0ZWQ7IG5vLW9wLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgQUxPR0UoInVucmVjb2duaXplZCBtZXNzYWdlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBzZXREZWFkbGluZShUaW1lUG9pbnQ6Om1heCgpLCAwbXMsICJub25lIik7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzZXREZWFkbGluZSgKKyAgICAgICAgY29uc3QgVGltZVBvaW50ICZub3csCisgICAgICAgIGNvbnN0IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgJnRpbWVvdXQsCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBpbnQzMl90IG11bHQgPSBzdGQ6Om1heCgxLCBwcm9wZXJ0eV9nZXRfaW50MzIoImRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlY190aW1lb3V0X211bHQiLCAxKSk7CisgICAgTXV0ZXhlZDxOYW1lZFRpbWVQb2ludD46OkxvY2tlZCBkZWFkbGluZShtRGVhZGxpbmUpOworICAgIGRlYWRsaW5lLT5zZXQobm93ICsgKHRpbWVvdXQgKiBtdWx0KSwgbmFtZSk7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZVJlbGVhc2VJZlN0dWNrKCkgeworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgYm9vbCBwZW5kaW5nRGVhZGxpbmUgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8TmFtZWRUaW1lUG9pbnQ+OjpMb2NrZWQgZGVhZGxpbmUobURlYWRsaW5lKTsKKyAgICAgICAgaWYgKGRlYWRsaW5lLT5nZXQoKSA8IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpKSB7CisgICAgICAgICAgICBuYW1lID0gZGVhZGxpbmUtPmdldE5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVhZGxpbmUtPmdldCgpICE9IFRpbWVQb2ludDo6bWF4KCkpIHsKKyAgICAgICAgICAgIHBlbmRpbmdEZWFkbGluZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG5hbWUuZW1wdHkoKSkgeworICAgICAgICBjb25zdGV4cHIgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24ga1dvcmtEdXJhdGlvblRocmVzaG9sZCA9IDNzOworICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiBlbGFwc2VkID0gbUNoYW5uZWwtPmVsYXBzZWQoKTsKKyAgICAgICAgaWYgKGVsYXBzZWQgPj0ga1dvcmtEdXJhdGlvblRocmVzaG9sZCkgeworICAgICAgICAgICAgbmFtZSA9ICJxdWV1ZSI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVsYXBzZWQgPiAwcykgeworICAgICAgICAgICAgcGVuZGluZ0RlYWRsaW5lID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobmFtZS5lbXB0eSgpKSB7CisgICAgICAgIC8vIFdlJ3JlIG5vdCBzdHVjay4KKyAgICAgICAgaWYgKHBlbmRpbmdEZWFkbGluZSkgeworICAgICAgICAgICAgLy8gSWYgd2UgYXJlIG5vdCBzdHVjayB5ZXQgYnV0IHN0aWxsIGhhcyBkZWFkbGluZSBjb21pbmcgdXAsCisgICAgICAgICAgICAvLyBwb3N0IHdhdGNoIG1lc3NhZ2UgdG8gY2hlY2sgYmFjayBsYXRlci4KKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRXYXRjaCwgdGhpcykpLT5wb3N0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dXKCJwcmV2aW91cyBjYWxsIHRvICVzIGV4Y2VlZGVkIHRpbWVvdXQiLCBuYW1lLmNfc3RyKCkpOworICAgIGluaXRpYXRlUmVsZWFzZShmYWxzZSk7CisgICAgbUNhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiBhbmRyb2lkOjpDb2RlY0Jhc2UgKkNyZWF0ZUNvZGVjKCkgeworICAgIHJldHVybiBuZXcgYW5kcm9pZDo6Q0NvZGVjOworfQorCisvLyBDcmVhdGUgQ29kZWMgMi4wIGlucHV0IHN1cmZhY2UKK2V4dGVybiAiQyIgYW5kcm9pZDo6UGVyc2lzdGVudFN1cmZhY2UgKkNyZWF0ZUlucHV0U3VyZmFjZSgpIHsKKyAgICAvLyBBdHRlbXB0IHRvIGNyZWF0ZSBhIENvZGVjMidzIGlucHV0IHN1cmZhY2UuCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPiBpbnB1dFN1cmZhY2UgPQorICAgICAgICAgICAgYW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICBpZiAoIWlucHV0U3VyZmFjZSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpQZXJzaXN0ZW50U3VyZmFjZSgKKyAgICAgICAgICAgIGlucHV0U3VyZmFjZS0+Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxhbmRyb2lkOjpzcDxhbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4+KAorICAgICAgICAgICAgaW5wdXRTdXJmYWNlLT5nZXRIYWxJbnRlcmZhY2UoKSkpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiM2M0ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuaApAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ19DT0RFQ19IXworI2RlZmluZSBDX0NPREVDX0hfCisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1NraXBDdXRCdWZmZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9OYXRpdmVIYW5kbGUuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+CisjaW5jbHVkZSA8bmF0aXZlYmFzZS9uYXRpdmViYXNlLmg+CisKKyNpbmNsdWRlICJDQ29kZWNDb25maWcuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDQ29kZWNCdWZmZXJDaGFubmVsOworY2xhc3MgSW5wdXRTdXJmYWNlV3JhcHBlcjsKK3N0cnVjdCBNZWRpYUNvZGVjSW5mbzsKKworY2xhc3MgQ0NvZGVjIDogcHVibGljIENvZGVjQmFzZSB7CitwdWJsaWM6CisgICAgQ0NvZGVjKCk7CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJDaGFubmVsQmFzZT4gZ2V0QnVmZmVyQ2hhbm5lbCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVDb25maWd1cmVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVNldElucHV0U3VyZmFjZShjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gJnN1cmZhY2UpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU2h1dGRvd24oYm9vbCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkID0gZmFsc2UpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxGbHVzaCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxSZXN1bWUoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxTZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxSZXF1ZXN0SURSRnJhbWUoKSBvdmVycmlkZTsKKworICAgIHZvaWQgaW5pdGlhdGVSZWxlYXNlSWZTdHVjaygpOworICAgIHZvaWQgb25Xb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZ3b3JrSXRlbXMpOworICAgIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUodWludDY0X3QgZnJhbWVJbmRleCwgc2l6ZV90IGFycmF5SW5kZXgpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Q0NvZGVjKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBUaW1lUG9pbnQ7CisKKyAgICBzdGF0dXNfdCB0cnlBbmRSZXBvcnRPbkVycm9yKHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoKT4gam9iKTsKKworICAgIHZvaWQgaW5pdGlhdGVTdG9wKCk7CisgICAgdm9pZCBpbml0aWF0ZVJlbGVhc2UoYm9vbCBzZW5kQ2FsbGJhY2sgPSB0cnVlKTsKKworICAgIHZvaWQgYWxsb2NhdGUoY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZjb2RlY0luZm8pOworICAgIHZvaWQgY29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIHN0YXJ0KCk7CisgICAgdm9pZCBzdG9wKCk7CisgICAgdm9pZCBmbHVzaCgpOworICAgIHZvaWQgcmVsZWFzZShib29sIHNlbmRDYWxsYmFjayk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGlucHV0IHN1cmZhY2UgZm9yIHRoZSBjdXJyZW50IGRldmljZSBjb25maWd1cmF0aW9uIGNvbXBhdGlibGUgd2l0aCBDQ29kZWMuCisgICAgICogVGhpcyBjb3VsZCBiZSBiYWNrZWQgYnkgdGhlIEMyIEhBTCBvciB0aGUgT01YIEhBTC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8UGVyc2lzdGVudFN1cmZhY2U+IENyZWF0ZUNvbXBhdGlibGVJbnB1dFN1cmZhY2UoKTsKKworICAgIC8vLyBDcmVhdGVzIGFuIGlucHV0IHN1cmZhY2UgdG8gdGhlIE9NWCBIQUwKKyAgICBzdGF0aWMgc3A8UGVyc2lzdGVudFN1cmZhY2U+IENyZWF0ZU9teElucHV0U3VyZmFjZSgpOworCisgICAgLy8vIGhhbmRsZSBhIGNyZWF0ZSBpbnB1dCBzdXJmYWNlIGNhbGwKKyAgICB2b2lkIGNyZWF0ZUlucHV0U3VyZmFjZSgpOworICAgIHZvaWQgc2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiAmc3VyZmFjZSk7CisgICAgc3RhdHVzX3Qgc2V0dXBJbnB1dFN1cmZhY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+ICZzdXJmYWNlKTsKKworICAgIHZvaWQgc2V0RGVhZGxpbmUoCisgICAgICAgICAgICBjb25zdCBUaW1lUG9pbnQgJm5vdywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgJnRpbWVvdXQsCisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKKworICAgIGVudW0geworICAgICAgICBrV2hhdEFsbG9jYXRlLAorICAgICAgICBrV2hhdENvbmZpZ3VyZSwKKyAgICAgICAga1doYXRTdGFydCwKKyAgICAgICAga1doYXRGbHVzaCwKKyAgICAgICAga1doYXRTdG9wLAorICAgICAgICBrV2hhdFJlbGVhc2UsCisgICAgICAgIGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlLAorICAgICAgICBrV2hhdFNldElucHV0U3VyZmFjZSwKKyAgICAgICAga1doYXRTZXRQYXJhbWV0ZXJzLAorCisgICAgICAgIGtXaGF0V29ya0RvbmUsCisgICAgICAgIGtXaGF0V2F0Y2gsCisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBSRUxFQVNFRCwKKyAgICAgICAgQUxMT0NBVEVELAorICAgICAgICBGTFVTSEVELAorICAgICAgICBSVU5OSU5HLAorCisgICAgICAgIEFMTE9DQVRJTkcsICAvLyBSRUxFQVNFRCAtPiBBTExPQ0FURUQKKyAgICAgICAgU1RBUlRJTkcsICAgIC8vIEFMTE9DQVRFRCAtPiBSVU5OSU5HCisgICAgICAgIFNUT1BQSU5HLCAgICAvLyBSVU5OSU5HIC0+IEFMTE9DQVRFRAorICAgICAgICBGTFVTSElORywgICAgLy8gUlVOTklORyAtPiBGTFVTSEVECisgICAgICAgIFJFU1VNSU5HLCAgICAvLyBGTFVTSEVEIC0+IFJVTk5JTkcKKyAgICAgICAgUkVMRUFTSU5HLCAgIC8vIHtBTlkgRVhDRVBUIFJFTEVBU0VEfSAtPiBSRUxFQVNFRAorICAgIH07CisKKyAgICBzdHJ1Y3QgU3RhdGUgeworICAgICAgICBpbmxpbmUgU3RhdGUoKSA6IG1TdGF0ZShSRUxFQVNFRCkge30KKyAgICAgICAgaW5saW5lIGludCBnZXQoKSBjb25zdCB7IHJldHVybiBtU3RhdGU7IH0KKyAgICAgICAgaW5saW5lIHZvaWQgc2V0KGludCBuZXdTdGF0ZSkgeyBtU3RhdGUgPSBuZXdTdGF0ZTsgfQorCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICBwcml2YXRlOgorICAgICAgICBpbnQgbVN0YXRlOworICAgIH07CisKKyAgICBzdHJ1Y3QgTmFtZWRUaW1lUG9pbnQgeworICAgICAgICBOYW1lZFRpbWVQb2ludCgpIDogbVRpbWVQb2ludChUaW1lUG9pbnQ6Om1heCgpKSwgbU5hbWUoIiIpIHt9CisKKyAgICAgICAgaW5saW5lIHZvaWQgc2V0KAorICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVQb2ludCAmdGltZVBvaW50LAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICAgICAgICAgIG1UaW1lUG9pbnQgPSB0aW1lUG9pbnQ7CisgICAgICAgICAgICBtTmFtZSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgVGltZVBvaW50IGdldCgpIGNvbnN0IHsgcmV0dXJuIG1UaW1lUG9pbnQ7IH0KKyAgICAgICAgaW5saW5lIGNvbnN0IGNoYXIgKmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorICAgIHByaXZhdGU6CisgICAgICAgIFRpbWVQb2ludCBtVGltZVBvaW50OworICAgICAgICBjb25zdCBjaGFyICptTmFtZTsKKyAgICB9OworCisgICAgTXV0ZXhlZDxTdGF0ZT4gbVN0YXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsPiBtQ2hhbm5lbDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6TGlzdGVuZXI+IG1DbGllbnRMaXN0ZW5lcjsKKyAgICBzdHJ1Y3QgQ2xpZW50TGlzdGVuZXI7CisKKyAgICBNdXRleGVkPE5hbWVkVGltZVBvaW50PiBtRGVhZGxpbmU7CisgICAgdHlwZWRlZiBDQ29kZWNDb25maWcgQ29uZmlnOworICAgIE11dGV4ZWQ8Q29uZmlnPiBtQ29uZmlnOworICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Pj4gbVdvcmtEb25lUXVldWU7CisKKyAgICBmcmllbmQgY2xhc3MgQ0NvZGVjQ2FsbGJhY2tJbXBsOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ0NvZGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ19DT0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNmFmOTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKQEAgLTAsMCArMSwyOTI1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNDb2RlY0J1ZmZlckNoYW5uZWwiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxudW1lcmljPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvSURlc2NyYW1ibGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0NvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29rdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CisKKyNpbmNsdWRlICJDQ29kZWNCdWZmZXJDaGFubmVsLmgiCisjaW5jbHVkZSAiQ29kZWMyQnVmZmVyLmgiCisjaW5jbHVkZSAiU2tpcEN1dEJ1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpWMV8wOwordXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDsKKwordXNpbmcgQ2FzU3RhdHVzID0gaGFyZHdhcmU6OmNhczo6VjFfMDo6U3RhdHVzOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIHJlcHJlc2VudGF0aW9uIG9mIGJ1ZmZlcnMgYXQgb25lIHBvcnQuCisgKi8KK2NsYXNzIENDb2RlY0J1ZmZlckNoYW5uZWw6OkJ1ZmZlcnMgeworcHVibGljOgorICAgIEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJCdWZmZXJzIikKKyAgICAgICAgOiBtQ29tcG9uZW50TmFtZShjb21wb25lbnROYW1lKSwKKyAgICAgICAgICBtQ2hhbm5lbE5hbWUoc3RkOjpzdHJpbmcoY29tcG9uZW50TmFtZSkgKyAiOiIgKyBuYW1lKSwKKyAgICAgICAgICBtTmFtZShtQ2hhbm5lbE5hbWUuY19zdHIoKSkgeworICAgIH0KKyAgICB2aXJ0dWFsIH5CdWZmZXJzKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogU2V0IGZvcm1hdCBmb3IgTWVkaWFDb2RlYy1mYWNpbmcgYnVmZmVycy4KKyAgICAgKi8KKyAgICB2b2lkIHNldEZvcm1hdChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgICAgICBDSEVDSyhmb3JtYXQgIT0gbnVsbHB0cik7CisgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgY29weSBvZiBjdXJyZW50IGZvcm1hdC4KKyAgICAgKi8KKyAgICBzcDxBTWVzc2FnZT4gZHVwRm9ybWF0KCkgeworICAgICAgICByZXR1cm4gbUZvcm1hdCAhPSBudWxscHRyID8gbUZvcm1hdC0+ZHVwKCkgOiBudWxscHRyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYnVmZmVycyBhcmUgb3BlcmF0aW5nIHVuZGVyIGFycmF5IG1vZGUuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGlzQXJyYXlNb2RlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIC8qKgorICAgICAqIEZpbGxzIHRoZSB2ZWN0b3Igd2l0aCBNZWRpYUNvZGVjQnVmZmVyJ3MgaWYgaW4gYXJyYXkgbW9kZTsgb3RoZXJ3aXNlLAorICAgICAqIG5vLW9wLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBnZXRBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICopIGNvbnN0IHt9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gbnVtYmVyIG9mIGJ1ZmZlcnMgdGhlIGNsaWVudCBvd25zLgorICAgICAqLworICAgIHZpcnR1YWwgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCA9IDA7CisKKyAgICB2b2lkIGhhbmRsZUltYWdlRGF0YShjb25zdCBzcDxDb2RlYzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gaW1hZ2VEYXRhQ2FuZGlkYXRlID0gYnVmZmVyLT5nZXRJbWFnZURhdGEoKTsKKyAgICAgICAgaWYgKGltYWdlRGF0YUNhbmRpZGF0ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3A8QUJ1ZmZlcj4gaW1hZ2VEYXRhOworICAgICAgICBpZiAoIW1Gb3JtYXQtPmZpbmRCdWZmZXIoImltYWdlLWRhdGEiLCAmaW1hZ2VEYXRhKQorICAgICAgICAgICAgICAgIHx8IGltYWdlRGF0YUNhbmRpZGF0ZS0+c2l6ZSgpICE9IGltYWdlRGF0YS0+c2l6ZSgpCisgICAgICAgICAgICAgICAgfHwgbWVtY21wKGltYWdlRGF0YUNhbmRpZGF0ZS0+ZGF0YSgpLCBpbWFnZURhdGEtPmRhdGEoKSwgaW1hZ2VEYXRhLT5zaXplKCkpICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dEKCJbJXNdIHVwZGF0aW5nIGltYWdlLWRhdGEiLCBtTmFtZSk7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbmV3Rm9ybWF0ID0gZHVwRm9ybWF0KCk7CisgICAgICAgICAgICBuZXdGb3JtYXQtPnNldEJ1ZmZlcigiaW1hZ2UtZGF0YSIsIGltYWdlRGF0YUNhbmRpZGF0ZSk7CisgICAgICAgICAgICBNZWRpYUltYWdlMiAqaW1nID0gKE1lZGlhSW1hZ2UyKilpbWFnZURhdGFDYW5kaWRhdGUtPmRhdGEoKTsKKyAgICAgICAgICAgIGlmIChpbWctPm1OdW1QbGFuZXMgPiAwICYmIGltZy0+bVR5cGUgIT0gaW1nLT5NRURJQV9JTUFHRV9UWVBFX1VOS05PV04pIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSA9IGltZy0+bVBsYW5lWzBdLm1Sb3dJbmM7CisgICAgICAgICAgICAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfU1RSSURFLCBzdHJpZGUpOworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIHVwZGF0aW5nIHN0cmlkZSA9ICVkIiwgbU5hbWUsIHN0cmlkZSk7CisgICAgICAgICAgICAgICAgaWYgKGltZy0+bU51bVBsYW5lcyA+IDEgJiYgc3RyaWRlID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZzdHJpZGUgPSAoaW1nLT5tUGxhbmVbMV0ubU9mZnNldCAtIGltZy0+bVBsYW5lWzBdLm1PZmZzZXQpIC8gc3RyaWRlOworICAgICAgICAgICAgICAgICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9TTElDRV9IRUlHSFQsIHZzdHJpZGUpOworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSB1cGRhdGluZyB2c3RyaWRlID0gJWQiLCBtTmFtZSwgdnN0cmlkZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0Rm9ybWF0KG5ld0Zvcm1hdCk7CisgICAgICAgICAgICBidWZmZXItPnNldEZvcm1hdChuZXdGb3JtYXQpOworICAgICAgICB9CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3RkOjpzdHJpbmcgbUNvbXBvbmVudE5hbWU7IC8vLzwgbmFtZSBvZiBjb21wb25lbnQgZm9yIGRlYnVnZ2luZworICAgIHN0ZDo6c3RyaW5nIG1DaGFubmVsTmFtZTsgLy8vPCBuYW1lIG9mIGNoYW5uZWwgZm9yIGRlYnVnZ2luZworICAgIGNvbnN0IGNoYXIgKm1OYW1lOyAvLy88IEMtc3RyaW5nIHZlcnNpb24gb2YgY2hhbm5lbCBuYW1lCisgICAgLy8gRm9ybWF0IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIE1lZGlhQ29kZWMtZmFjaW5nIGJ1ZmZlcnMuCisgICAgc3A8QU1lc3NhZ2U+IG1Gb3JtYXQ7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQnVmZmVycyk7Cit9OworCitjbGFzcyBDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnMgOiBwdWJsaWMgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6QnVmZmVycyB7CitwdWJsaWM6CisgICAgSW5wdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiSW5wdXRbXSIpCisgICAgICAgIDogQnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKyAgICB2aXJ0dWFsIH5JbnB1dEJ1ZmZlcnMoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBibG9jayBwb29sIHRvIG9idGFpbiBpbnB1dCBtZW1vcnkgYmxvY2tzLgorICAgICAqLworICAgIHZvaWQgc2V0UG9vbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7IG1Qb29sID0gcG9vbDsgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgbmV3IE1lZGlhQ29kZWNCdWZmZXIgZm9yIGlucHV0IGFuZCBpdHMgY29ycmVzcG9uZGluZyBpbmRleC4KKyAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIG5vIG5ldyBidWZmZXIgY2FuIGJlIG9idGFpbmVkIGF0IHRoZSBtb21lbnQuCisgICAgICovCisgICAgdmlydHVhbCBib29sIHJlcXVlc3ROZXdCdWZmZXIoc2l6ZV90ICppbmRleCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmJ1ZmZlcikgPSAwOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgYnVmZmVyIG9idGFpbmVkIGZyb20gcmVxdWVzdE5ld0J1ZmZlcigpIGFuZCBnZXQgdGhlCisgICAgICogYXNzb2NpYXRlZCBDMkJ1ZmZlciBvYmplY3QgYmFjay4gUmV0dXJucyB0cnVlIGlmIHRoZSBidWZmZXIgd2FzIG9uIGZpbGUKKyAgICAgKiBhbmQgcmVsZWFzZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyLAorICAgICAgICAgICAgYm9vbCByZWxlYXNlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBidWZmZXIgdGhhdCBpcyBubyBsb25nZXIgdXNlZCBieSB0aGUgY29kZWMgcHJvY2Vzcy4gUmV0dXJuCisgICAgICogdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgYnVmZmVyIHdhcyBvbiBmaWxlIGFuZCByZWxlYXNlZCBzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCBpbnRlcm5hbCBzdGF0ZS4gQWZ0ZXIgdGhpcyBjYWxsLCBubyBpbmRleCBvciBidWZmZXIgcHJldmlvdXNseQorICAgICAqIHJldHVybmVkIGZyb20gcmVxdWVzdE5ld0J1ZmZlcigpIGlzIHZhbGlkLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBmbHVzaCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhcnJheS1iYWNrZWQgdmVyc2lvbiBvZiBpbnB1dCBidWZmZXJzLiBUaGUgcmV0dXJuZWQgb2JqZWN0CisgICAgICogc2hhbGwgcmV0YWluIHRoZSBpbnRlcm5hbCBzdGF0ZSBzbyB0aGF0IGl0IHdpbGwgaG9ub3IgaW5kZXggYW5kCisgICAgICogYnVmZmVyIGZyb20gcHJldmlvdXMgY2FsbHMgb2YgcmVxdWVzdE5ld0J1ZmZlcigpLgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4gdG9BcnJheU1vZGUoc2l6ZV90IHNpemUpID0gMDsKKworcHJvdGVjdGVkOgorICAgIC8vIFBvb2wgdG8gb2J0YWluIGJsb2NrcyBmb3IgaW5wdXQgYnVmZmVycy4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1Qb29sOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKElucHV0QnVmZmVycyk7Cit9OworCitjbGFzcyBDQ29kZWNCdWZmZXJDaGFubmVsOjpPdXRwdXRCdWZmZXJzIDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6OkJ1ZmZlcnMgeworcHVibGljOgorICAgIE91dHB1dEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJPdXRwdXQiKQorICAgICAgICA6IEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSkgeyB9CisgICAgdmlydHVhbCB+T3V0cHV0QnVmZmVycygpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIG91dHB1dCBDMkJ1ZmZlciBmcm9tIHRoZSBjb21wb25lbnQgYW5kIG9idGFpbiBjb3JyZXNwb25kaW5nCisgICAgICogaW5kZXggYW5kIE1lZGlhQ29kZWNCdWZmZXIgb2JqZWN0LiBSZXR1cm5zIGZhbHNlIGlmIHJlZ2lzdHJhdGlvbgorICAgICAqIGZhaWxzLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzaXplX3QgKmluZGV4LAorICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmNsaWVudEJ1ZmZlcikgPSAwOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgY29kZWMgc3BlY2lmaWMgZGF0YSBhcyBhIGJ1ZmZlciB0byBiZSBjb25zaXN0ZW50IHdpdGgKKyAgICAgKiBNZWRpYUNvZGVjIGJlaGF2aW9yLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJDc2QoCisgICAgICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICogLyogY3NkICovLAorICAgICAgICAgICAgc2l6ZV90ICogLyogaW5kZXggKi8sCisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqIC8qIGNsaWVudEJ1ZmZlciAqLykgPSAwOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgYnVmZmVyIG9idGFpbmVkIGZyb20gcmVnaXN0ZXJCdWZmZXIoKSBhbmQgZ2V0IHRoZQorICAgICAqIGFzc29jaWF0ZWQgQzJCdWZmZXIgb2JqZWN0IGJhY2suIFJldHVybnMgdHJ1ZSBpZiB0aGUgYnVmZmVyIHdhcyBvbiBmaWxlCisgICAgICogYW5kIHJlbGVhc2VkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCBpbnRlcm5hbCBzdGF0ZS4gQWZ0ZXIgdGhpcyBjYWxsLCBubyBpbmRleCBvciBidWZmZXIgcHJldmlvdXNseQorICAgICAqIHJldHVybmVkIGZyb20gcmVnaXN0ZXJCdWZmZXIoKSBpcyB2YWxpZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgZmx1c2goY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmZmx1c2hlZFdvcmspID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhcnJheS1iYWNrZWQgdmVyc2lvbiBvZiBvdXRwdXQgYnVmZmVycy4gVGhlIHJldHVybmVkIG9iamVjdAorICAgICAqIHNoYWxsIHJldGFpbiB0aGUgaW50ZXJuYWwgc3RhdGUgc28gdGhhdCBpdCB3aWxsIGhvbm9yIGluZGV4IGFuZAorICAgICAqIGJ1ZmZlciBmcm9tIHByZXZpb3VzIGNhbGxzIG9mIHJlZ2lzdGVyQnVmZmVyKCkuCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4gdG9BcnJheU1vZGUoc2l6ZV90IHNpemUpID0gMDsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgU2tpcEN1dEJ1ZmZlciBvYmplY3QuCisgICAgICovCisgICAgdm9pZCBpbml0U2tpcEN1dEJ1ZmZlcigKKyAgICAgICAgICAgIGludDMyX3QgZGVsYXksIGludDMyX3QgcGFkZGluZywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNoYW5uZWxDb3VudCkgeworICAgICAgICBDSEVDSyhtU2tpcEN1dEJ1ZmZlciA9PSBudWxscHRyKTsKKyAgICAgICAgbURlbGF5ID0gZGVsYXk7CisgICAgICAgIG1QYWRkaW5nID0gcGFkZGluZzsKKyAgICAgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgICAgICBzZXRTa2lwQ3V0QnVmZmVyKGRlbGF5LCBwYWRkaW5nLCBjaGFubmVsQ291bnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZSB0aGUgU2tpcEN1dEJ1ZmZlciBvYmplY3QuIE5vLW9wIGlmIGl0J3MgbmV2ZXIgaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgdm9pZCB1cGRhdGVTa2lwQ3V0QnVmZmVyKGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgaWYgKG1Ta2lwQ3V0QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IGRlbGF5ID0gbURlbGF5OworICAgICAgICBpbnQzMl90IHBhZGRpbmcgPSBtUGFkZGluZzsKKyAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gbVNhbXBsZVJhdGUpIHsKKyAgICAgICAgICAgIGRlbGF5ID0gKChpbnQ2NF90KWRlbGF5ICogc2FtcGxlUmF0ZSkgLyBtU2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIHBhZGRpbmcgPSAoKGludDY0X3QpcGFkZGluZyAqIHNhbXBsZVJhdGUpIC8gbVNhbXBsZVJhdGU7CisgICAgICAgIH0KKyAgICAgICAgc2V0U2tpcEN1dEJ1ZmZlcihkZWxheSwgcGFkZGluZywgY2hhbm5lbENvdW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWJtaXQgYnVmZmVyIHRvIFNraXBDdXRCdWZmZXIgb2JqZWN0LCBpZiBpbml0aWFsaXplZC4KKyAgICAgKi8KKyAgICB2b2lkIHN1Ym1pdChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgICAgIGlmIChtU2tpcEN1dEJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtU2tpcEN1dEJ1ZmZlci0+c3VibWl0KGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2ZlciBTa2lwQ3V0QnVmZmVyIG9iamVjdCB0byB0aGUgb3RoZXIgQnVmZmVycyBvYmplY3QuCisgICAgICovCisgICAgdm9pZCB0cmFuc2ZlclNraXBDdXRCdWZmZXIoY29uc3Qgc3A8U2tpcEN1dEJ1ZmZlcj4gJnNjYikgeworICAgICAgICBtU2tpcEN1dEJ1ZmZlciA9IHNjYjsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzcDxTa2lwQ3V0QnVmZmVyPiBtU2tpcEN1dEJ1ZmZlcjsKKworcHJpdmF0ZToKKyAgICBpbnQzMl90IG1EZWxheTsKKyAgICBpbnQzMl90IG1QYWRkaW5nOworICAgIGludDMyX3QgbVNhbXBsZVJhdGU7CisKKyAgICB2b2lkIHNldFNraXBDdXRCdWZmZXIoaW50MzJfdCBza2lwLCBpbnQzMl90IGN1dCwgaW50MzJfdCBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgaWYgKG1Ta2lwQ3V0QnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNpemVfdCBwcmV2U2l6ZSA9IG1Ta2lwQ3V0QnVmZmVyLT5zaXplKCk7CisgICAgICAgICAgICBpZiAocHJldlNpemUgIT0gMHUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBSZXBsYWNpbmcgU2tpcEN1dEJ1ZmZlciBob2xkaW5nICV6dSBieXRlcyIsIG1OYW1lLCBwcmV2U2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVNraXBDdXRCdWZmZXIgPSBuZXcgU2tpcEN1dEJ1ZmZlcihza2lwLCBjdXQsIGNoYW5uZWxDb3VudCk7CisgICAgfQorCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoT3V0cHV0QnVmZmVycyk7Cit9OworCituYW1lc3BhY2UgeworCitjb25zdCBzdGF0aWMgc2l6ZV90IGtTbW9vdGhuZXNzRmFjdG9yID0gNDsKK2NvbnN0IHN0YXRpYyBzaXplX3Qga1JlbmRlcmluZ0RlcHRoID0gMzsKK2NvbnN0IHN0YXRpYyBzaXplX3Qga0xpbmVhckJ1ZmZlclNpemUgPSAxMDQ4NTc2OworLy8gVGhpcyBjYW4gZml0IDRLIFJHQkEgZnJhbWUsIGFuZCBtb3N0IGxpa2VseSBjbGllbnQgd29uJ3QgbmVlZCBtb3JlIHRoYW4gdGhpcy4KK2NvbnN0IHN0YXRpYyBzaXplX3Qga01heExpbmVhckJ1ZmZlclNpemUgPSAzODQwICogMjE2MCAqIDQ7CisKKy8qKgorICogU2ltcGxlIGxvY2FsIGJ1ZmZlciBwb29sIGJhY2tlZCBieSBzdGQ6OnZlY3Rvci4KKyAqLworY2xhc3MgTG9jYWxCdWZmZXJQb29sIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8TG9jYWxCdWZmZXJQb29sPiB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IExvY2FsQnVmZmVyUG9vbCBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbENhcGFjaXR5ICBtYXggdG90YWwgc2l6ZSBvZiBidWZmZXJzIG1hbmFnZWQgYnkgdGhpcyBwb29sLgorICAgICAqCisgICAgICogXHJldHVybiAgYSBuZXdseSBjcmVhdGVkIHBvb2wgb2JqZWN0LgorICAgICAqLworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TG9jYWxCdWZmZXJQb29sPiBDcmVhdGUoc2l6ZV90IHBvb2xDYXBhY2l0eSkgeworICAgICAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4obmV3IExvY2FsQnVmZmVyUG9vbChwb29sQ2FwYWNpdHkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gQUJ1ZmZlciBvYmplY3Qgd2hvc2Ugc2l6ZSBpcyBhdCBsZWFzdCB8Y2FwYWNpdHl8LgorICAgICAqCisgICAgICogXHBhcmFtICAgY2FwYWNpdHkgIHJlcXVlc3RlZCBjYXBhY2l0eQorICAgICAqIFxyZXR1cm4gIG51bGxwdHIgaWYgdGhlIHBvb2wgY2FwYWNpdHkgaXMgcmVhY2hlZAorICAgICAqICAgICAgICAgIGFuIEFCdWZmZXIgb2JqZWN0IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzcDxBQnVmZmVyPiBuZXdCdWZmZXIoc2l6ZV90IGNhcGFjaXR5KSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYoCisgICAgICAgICAgICAgICAgbVBvb2wuYmVnaW4oKSwgbVBvb2wuZW5kKCksCisgICAgICAgICAgICAgICAgW2NhcGFjaXR5XShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmdmVjKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZWMuY2FwYWNpdHkoKSA+PSBjYXBhY2l0eTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKGl0ICE9IG1Qb29sLmVuZCgpKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgVmVjdG9yQnVmZmVyKHN0ZDo6bW92ZSgqaXQpLCBzaGFyZWRfZnJvbV90aGlzKCkpOworICAgICAgICAgICAgbVBvb2wuZXJhc2UoaXQpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICAgICAgfQorICAgICAgICBpZiAobVVzZWRTaXplICsgY2FwYWNpdHkgPiBtUG9vbENhcGFjaXR5KSB7CisgICAgICAgICAgICB3aGlsZSAoIW1Qb29sLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtVXNlZFNpemUgLT0gbVBvb2wuYmFjaygpLmNhcGFjaXR5KCk7CisgICAgICAgICAgICAgICAgbVBvb2wucG9wX2JhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtVXNlZFNpemUgKyBjYXBhY2l0eSA+IG1Qb29sQ2FwYWNpdHkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgibVVzZWRTaXplID0gJXp1LCBjYXBhY2l0eSA9ICV6dSwgbVBvb2xDYXBhY2l0eSA9ICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtVXNlZFNpemUsIGNhcGFjaXR5LCBtUG9vbENhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWMoY2FwYWNpdHkpOworICAgICAgICBtVXNlZFNpemUgKz0gdmVjLmNhcGFjaXR5KCk7CisgICAgICAgIHJldHVybiBuZXcgVmVjdG9yQnVmZmVyKHN0ZDo6bW92ZSh2ZWMpLCBzaGFyZWRfZnJvbV90aGlzKCkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBBQnVmZmVyIGJhY2tlZCBieSBzdGQ6OnZlY3Rvci4KKyAgICAgKi8KKyAgICBjbGFzcyBWZWN0b3JCdWZmZXIgOiBwdWJsaWMgOjphbmRyb2lkOjpBQnVmZmVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3QgYSBWZWN0b3JCdWZmZXIgYnkgdGFraW5nIHRoZSBvd25lcnNoaXAgb2Ygc3VwcGxpZWQgdmVjdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gdmVjICAgYmFja2luZyB2ZWN0b3Igb2YgdGhlIGJ1ZmZlci4gdGhpcyBvYmplY3QgdGFrZXMKKyAgICAgICAgICogICAgICAgICAgICAgIG93bmVyc2hpcCBhdCBjb25zdHJ1Y3Rpb24uCisgICAgICAgICAqIFxwYXJhbSBwb29sICBhIExvY2FsQnVmZmVyUG9vbCBvYmplY3QgdG8gcmV0dXJuIHRoZSB2ZWN0b3IgYXQKKyAgICAgICAgICogICAgICAgICAgICAgIGRlc3RydWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgVmVjdG9yQnVmZmVyKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICYmdmVjLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TG9jYWxCdWZmZXJQb29sPiAmcG9vbCkKKyAgICAgICAgICAgIDogQUJ1ZmZlcih2ZWMuZGF0YSgpLCB2ZWMuY2FwYWNpdHkoKSksCisgICAgICAgICAgICAgIG1WZWMoc3RkOjptb3ZlKHZlYykpLAorICAgICAgICAgICAgICBtUG9vbChwb29sKSB7CisgICAgICAgIH0KKworICAgICAgICB+VmVjdG9yQnVmZmVyKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gcG9vbCA9IG1Qb29sLmxvY2soKTsKKyAgICAgICAgICAgIGlmIChwb29sKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgcG9vbCBpcyBhbGl2ZSwgcmV0dXJuIHRoZSB2ZWN0b3IgYmFjayB0byB0aGUgcG9vbCBzbyB0aGF0CisgICAgICAgICAgICAgICAgLy8gaXQgY2FuIGJlIHJlY3ljbGVkLgorICAgICAgICAgICAgICAgIHBvb2wtPnJldHVyblZlY3RvcihzdGQ6Om1vdmUobVZlYykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtVmVjOworICAgICAgICBzdGQ6OndlYWtfcHRyPExvY2FsQnVmZmVyUG9vbD4gbVBvb2w7CisgICAgfTsKKworICAgIE11dGV4IG1NdXRleDsKKyAgICBzaXplX3QgbVBvb2xDYXBhY2l0eTsKKyAgICBzaXplX3QgbVVzZWRTaXplOworICAgIHN0ZDo6bGlzdDxzdGQ6OnZlY3Rvcjx1aW50OF90Pj4gbVBvb2w7CisKKyAgICAvKioKKyAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgY29uc3RydWN0aW5nIG5vbi1tYW5hZ2VkIExvY2FsQnVmZmVyUG9vbC4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBMb2NhbEJ1ZmZlclBvb2woc2l6ZV90IHBvb2xDYXBhY2l0eSkKKyAgICAgICAgOiBtUG9vbENhcGFjaXR5KHBvb2xDYXBhY2l0eSksIG1Vc2VkU2l6ZSgwKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGFrZSBiYWNrIHRoZSBvd25lcnNoaXAgb2YgdmVjIGZyb20gdGhlIGRlc3RydWN0ZWQgVmVjdG9yQnVmZmVyIGFuZCBwdXQKKyAgICAgKiBpdCBpbiBmcm9udCBvZiB0aGUgcG9vbC4KKyAgICAgKi8KKyAgICB2b2lkIHJldHVyblZlY3RvcihzdGQ6OnZlY3Rvcjx1aW50OF90PiAmJnZlYykgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgICAgICBtUG9vbC5wdXNoX2Zyb250KHN0ZDo6bW92ZSh2ZWMpKTsKKyAgICB9CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhMb2NhbEJ1ZmZlclBvb2wpOworfTsKKworc3A8R3JhcGhpY0Jsb2NrQnVmZmVyPiBBbGxvY2F0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICB1aW50MzJfdCBwaXhlbEZvcm1hdCwKKyAgICAgICAgY29uc3QgQzJNZW1vcnlVc2FnZSAmdXNhZ2UsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+ICZsb2NhbEJ1ZmZlclBvb2wpIHsKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpIHx8ICFmb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgQUxPR0QoImZvcm1hdCBsYWNrcyB3aWR0aCBvciBoZWlnaHQiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHBpeGVsRm9ybWF0LCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJmZXRjaCBncmFwaGljIGJsb2NrIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gR3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZSgKKyAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgIGJsb2NrLAorICAgICAgICAgICAgW2xvY2FsQnVmZmVyUG9vbF0oc2l6ZV90IGNhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsQnVmZmVyUG9vbC0+bmV3QnVmZmVyKGNhcGFjaXR5KTsKKyAgICAgICAgICAgIH0pOworfQorCitjbGFzcyBCdWZmZXJzQXJyYXlJbXBsOworCisvKioKKyAqIEZsZXhpYmxlIGJ1ZmZlciBzbG90cyBpbXBsZW1lbnRhdGlvbi4KKyAqLworY2xhc3MgRmxleEJ1ZmZlcnNJbXBsIHsKK3B1YmxpYzoKKyAgICBGbGV4QnVmZmVyc0ltcGwoY29uc3QgY2hhciAqbmFtZSkKKyAgICAgICAgOiBtSW1wbE5hbWUoc3RkOjpzdHJpbmcobmFtZSkgKyAiLkltcGwiKSwKKyAgICAgICAgICBtTmFtZShtSW1wbE5hbWUuY19zdHIoKSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBBc3NpZ24gYW4gZW1wdHkgc2xvdCBmb3IgYSBidWZmZXIgYW5kIHJldHVybiB0aGUgaW5kZXguIElmIHRoZXJlJ3Mgbm8KKyAgICAgKiBlbXB0eSBzbG90LCBqdXN0IGFkZCBvbmUgYXQgdGhlIGVuZCBhbmQgcmV0dXJuIGl0LgorICAgICAqCisgICAgICogXHBhcmFtIGJ1ZmZlcltpbl0gIGEgbmV3IGJ1ZmZlciB0byBhc3NpZ24gYSBzbG90LgorICAgICAqIFxyZXR1cm4gICAgICAgICAgICBpbmRleCBvZiB0aGUgYXNzaWduZWQgc2xvdC4KKyAgICAgKi8KKyAgICBzaXplX3QgYXNzaWduU2xvdChjb25zdCBzcDxDb2RlYzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlciA9PSBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICYmIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIuZXhwaXJlZCgpKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyID0gYnVmZmVyOworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1CdWZmZXJzLnB1c2hfYmFjayh7IGJ1ZmZlciwgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4oKSB9KTsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXJzLnNpemUoKSAtIDE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgc2xvdCBmcm9tIHRoZSBjbGllbnQsIGFuZCBnZXQgdGhlIEMyQnVmZmVyIG9iamVjdCBiYWNrIGZyb20KKyAgICAgKiB0aGUgcHJldmlvdXNseSBhc3NpZ25lZCBidWZmZXIuIE5vdGUgdGhhdCB0aGUgc2xvdCBpcyBub3QgY29tcGxldGVseSBmcmVlCisgICAgICogdW50aWwgdGhlIHJldHVybmVkIEMyQnVmZmVyIG9iamVjdCBpcyBmcmVlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGJ1ZmZlcltpbl0gICAgICAgIHRoZSBidWZmZXIgcHJldmlvdXNseSBhc3NpZ25lZCBhIHNsb3QuCisgICAgICogXHBhcmFtICAgYzJidWZmZXJbaW4sb3V0XSAgcG9pbnRlciB0byBDMkJ1ZmZlciB0byBiZSBwb3B1bGF0ZWQuIElnbm9yZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBudWxsLgorICAgICAqIFxyZXR1cm4gIHRydWUgIGlmIHRoZSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IHJlbGVhc2VkIGZyb20gYSBzbG90CisgICAgICogICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCByZWxlYXNlU2xvdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgcmVsZWFzZSkgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGNsaWVudEJ1ZmZlcjsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gbUJ1ZmZlcnMuc2l6ZSgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAobUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyID09IGJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGNsaWVudEJ1ZmZlciA9IG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBpZiAocmVsZWFzZSkgeworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnRCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1YoIlslc10gJXM6IE5vIG1hdGNoaW5nIGJ1ZmZlciBmb3VuZCIsIG1OYW1lLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiByZXN1bHQgPSBtQnVmZmVyc1tpbmRleF0uY29tcEJ1ZmZlci5sb2NrKCk7CisgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICByZXN1bHQgPSBjbGllbnRCdWZmZXItPmFzQzJCdWZmZXIoKTsKKyAgICAgICAgICAgIG1CdWZmZXJzW2luZGV4XS5jb21wQnVmZmVyID0gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChjMmJ1ZmZlcikgeworICAgICAgICAgICAgKmMyYnVmZmVyID0gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY29tcEJ1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIubG9jaygpOworICAgICAgICAgICAgaWYgKCFjb21wQnVmZmVyIHx8IGNvbXBCdWZmZXIgIT0gYzJidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIucmVzZXQoKTsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIGNvZGVjIHJlbGVhc2VkIGJ1ZmZlciAjJXp1IiwgbU5hbWUsIGkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlslc10gY29kZWMgcmVsZWFzZWQgYW4gdW5rbm93biBidWZmZXIiLCBtTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoKCkgeworICAgICAgICBBTE9HVigiWyVzXSBidWZmZXJzIGFyZSBmbHVzaGVkICV6dSIsIG1OYW1lLCBtQnVmZmVycy5zaXplKCkpOworICAgICAgICBtQnVmZmVycy5jbGVhcigpOworICAgIH0KKworICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjpjb3VudF9pZigKKyAgICAgICAgICAgICAgICBtQnVmZmVycy5iZWdpbigpLCBtQnVmZmVycy5lbmQoKSwKKyAgICAgICAgICAgICAgICBbXShjb25zdCBFbnRyeSAmZW50cnkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlbnRyeS5jbGllbnRCdWZmZXIgIT0gbnVsbHB0cik7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBCdWZmZXJzQXJyYXlJbXBsOworCisgICAgc3RkOjpzdHJpbmcgbUltcGxOYW1lOyAvLy88IG5hbWUgZm9yIGRlYnVnZ2luZworICAgIGNvbnN0IGNoYXIgKm1OYW1lOyAvLy88IEMtc3RyaW5nIHZlcnNpb24gb2YgbmFtZQorCisgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXI7CisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXI+IGNvbXBCdWZmZXI7CisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxFbnRyeT4gbUJ1ZmZlcnM7Cit9OworCisvKioKKyAqIFN0YXRpYyBidWZmZXIgc2xvdHMgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gYSBmaXhlZC1zaXplIGFycmF5LgorICovCitjbGFzcyBCdWZmZXJzQXJyYXlJbXBsIHsKK3B1YmxpYzoKKyAgICBCdWZmZXJzQXJyYXlJbXBsKCkKKyAgICAgICAgOiBtSW1wbE5hbWUoIkJ1ZmZlcnNBcnJheUltcGwiKSwKKyAgICAgICAgICBtTmFtZShtSW1wbE5hbWUuY19zdHIoKSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGJ1ZmZlciBhcnJheSBmcm9tIHRoZSBvcmlnaW5hbCB8aW1wbHwuIFRoZSBidWZmZXJzIGtub3duIGJ5CisgICAgICogdGhlIGNsaWVudCBpcyBwcmVzZXJ2ZWQsIGFuZCB0aGUgZW1wdHkgc2xvdHMgYXJlIHBvcHVsYXRlZCBzbyB0aGF0IHRoZQorICAgICAqIGFycmF5IHNpemUgaXMgYXQgbGVhc3QgfG1pblNpemV8LgorICAgICAqCisgICAgICogXHBhcmFtIGltcGxbaW5dICAgICAgRmxleEJ1ZmZlcnNJbXBsIG9iamVjdCB1c2VkIHNvIGZhci4KKyAgICAgKiBccGFyYW0gbWluU2l6ZVtpbl0gICBtaW5pbXVtIHNpemUgb2YgdGhlIGJ1ZmZlciBhcnJheS4KKyAgICAgKiBccGFyYW0gYWxsb2NhdGVbaW5dICBmdW5jdGlvbiB0byBhbGxvY2F0ZSBhIGNsaWVudCBidWZmZXIgZm9yIGFuIGVtcHR5IHNsb3QuCisgICAgICovCisgICAgdm9pZCBpbml0aWFsaXplKAorICAgICAgICAgICAgY29uc3QgRmxleEJ1ZmZlcnNJbXBsICZpbXBsLAorICAgICAgICAgICAgc2l6ZV90IG1pblNpemUsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2NhdGUpIHsKKyAgICAgICAgbUltcGxOYW1lID0gaW1wbC5tSW1wbE5hbWUgKyAiW05dIjsKKyAgICAgICAgbU5hbWUgPSBtSW1wbE5hbWUuY19zdHIoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbXBsLm1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGNsaWVudEJ1ZmZlciA9IGltcGwubUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyOworICAgICAgICAgICAgYm9vbCBvd25lZEJ5Q2xpZW50ID0gKGNsaWVudEJ1ZmZlciAhPSBudWxscHRyKTsKKyAgICAgICAgICAgIGlmICghb3duZWRCeUNsaWVudCkgeworICAgICAgICAgICAgICAgIGNsaWVudEJ1ZmZlciA9IGFsbG9jYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQnVmZmVycy5wdXNoX2JhY2soeyBjbGllbnRCdWZmZXIsIGltcGwubUJ1ZmZlcnNbaV0uY29tcEJ1ZmZlciwgb3duZWRCeUNsaWVudCB9KTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiWyVzXSBjb252ZXJ0ZWQgJXp1IGJ1ZmZlcnMgdG8gYXJyYXkgbW9kZSBvZiAlenUiLCBtTmFtZSwgbUJ1ZmZlcnMuc2l6ZSgpLCBtaW5TaXplKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IGltcGwubUJ1ZmZlcnMuc2l6ZSgpOyBpIDwgbWluU2l6ZTsgKytpKSB7CisgICAgICAgICAgICBtQnVmZmVycy5wdXNoX2JhY2soeyBhbGxvY2F0ZSgpLCBzdGQ6OndlYWtfcHRyPEMyQnVmZmVyPigpLCBmYWxzZSB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdyYWIgYSBidWZmZXIgZnJvbSB0aGUgdW5kZXJseWluZyBhcnJheSB3aGljaCBtYXRjaGVzIHRoZSBjcml0ZXJpYS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpbmRleFtvdXRdICAgIGluZGV4IG9mIHRoZSBzbG90LgorICAgICAqIFxwYXJhbSBidWZmZXJbb3V0XSAgIHRoZSBtYXRjaGluZyBidWZmZXIuCisgICAgICogXHBhcmFtIG1hdGNoW2luXSAgICAgYSBmdW5jdGlvbiB0byB0ZXN0IHdoZXRoZXIgdGhlIGJ1ZmZlciBtYXRjaGVzIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlhIG9yIG5vdC4KKyAgICAgKiBccmV0dXJuIE9LICAgICAgICAgICBpZiBzdWNjZXNzZnVsLAorICAgICAqICAgICAgICAgV09VTERfQkxPQ0sgIGlmIHNsb3RzIGFyZSBiZWluZyB1c2VkLAorICAgICAqICAgICAgICAgTk9fTUVNT1JZICAgIGlmIG5vIHNsb3QgbWF0Y2hlcyB0aGUgY3JpdGVyaWEsIGV2ZW4gdGhvdWdoIGl0J3MKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBncmFiQnVmZmVyKAorICAgICAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gKmJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzcDxDb2RlYzJCdWZmZXI+ICYpPiBtYXRjaCA9CisgICAgICAgICAgICAgICAgW10oY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmKSB7IHJldHVybiB0cnVlOyB9KSB7CisgICAgICAgIC8vIGFsbEJ1ZmZlcnNEb250TWF0Y2ggcmVtYWlucyB0cnVlIGlmIGFsbCBidWZmZXJzIGFyZSBhdmFpbGFibGUgYnV0CisgICAgICAgIC8vIG1hdGNoKCkgcmV0dXJucyBmYWxzZSBmb3IgZXZlcnkgYnVmZmVyLgorICAgICAgICBib29sIGFsbEJ1ZmZlcnNEb250TWF0Y2ggPSB0cnVlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJzW2ldLm93bmVkQnlDbGllbnQgJiYgbUJ1ZmZlcnNbaV0uY29tcEJ1ZmZlci5leHBpcmVkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobWF0Y2gobUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyKSkgeworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5vd25lZEJ5Q2xpZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgKCpidWZmZXIpLT5tZXRhKCktPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICgqYnVmZmVyKS0+c2V0UmFuZ2UoMCwgKCpidWZmZXIpLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgICAgICAgICAgICAgKmluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWxsQnVmZmVyc0RvbnRNYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhbGxCdWZmZXJzRG9udE1hdGNoID8gTk9fTUVNT1JZIDogV09VTERfQkxPQ0s7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBidWZmZXIgZnJvbSB0aGUgY2xpZW50LCBhbmQgZ2V0IHRoZSBDMkJ1ZmZlciBvYmplY3QgYmFjayBmcm9tCisgICAgICogdGhlIGJ1ZmZlci4gTm90ZSB0aGF0IHRoZSBzbG90IGlzIG5vdCBjb21wbGV0ZWx5IGZyZWUgdW50aWwgdGhlIHJldHVybmVkCisgICAgICogQzJCdWZmZXIgb2JqZWN0IGlzIGZyZWVkLgorICAgICAqCisgICAgICogXHBhcmFtICAgYnVmZmVyW2luXSAgICAgICAgdGhlIGJ1ZmZlciBwcmV2aW91c2x5IGdyYWJiZWQuCisgICAgICogXHBhcmFtICAgYzJidWZmZXJbaW4sb3V0XSAgcG9pbnRlciB0byBDMkJ1ZmZlciB0byBiZSBwb3B1bGF0ZWQuIElnbm9yZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBudWxsLgorICAgICAqIFxyZXR1cm4gIHRydWUgIGlmIHRoZSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IHJldHVybmVkCisgICAgICogICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCByZXR1cm5CdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIsCisgICAgICAgICAgICBib29sIHJlbGVhc2UpIHsKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXI7CisgICAgICAgIHNpemVfdCBpbmRleCA9IG1CdWZmZXJzLnNpemUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlciA9PSBidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1CdWZmZXJzW2ldLm93bmVkQnlDbGllbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gQ2xpZW50IHJldHVybmVkIGEgYnVmZmVyIGl0IGRvZXMgbm90IG93biBhY2NvcmRpbmcgdG8gb3VyIHJlY29yZDogJXp1IiwgbU5hbWUsIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbGllbnRCdWZmZXIgPSBtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXI7CisgICAgICAgICAgICAgICAgaWYgKHJlbGVhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0ub3duZWRCeUNsaWVudCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsaWVudEJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVigiWyVzXSAlczogTm8gbWF0Y2hpbmcgYnVmZmVyIGZvdW5kIiwgbU5hbWUsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiWyVzXSAlczogbWF0Y2hpbmcgYnVmZmVyIGZvdW5kIChpbmRleD0lenUpIiwgbU5hbWUsIF9fZnVuY19fLCBpbmRleCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gcmVzdWx0ID0gbUJ1ZmZlcnNbaW5kZXhdLmNvbXBCdWZmZXIubG9jaygpOworICAgICAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICAgICAgcmVzdWx0ID0gY2xpZW50QnVmZmVyLT5hc0MyQnVmZmVyKCk7CisgICAgICAgICAgICBtQnVmZmVyc1tpbmRleF0uY29tcEJ1ZmZlciA9IHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYzJidWZmZXIpIHsKKyAgICAgICAgICAgICpjMmJ1ZmZlciA9IHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNvbXBCdWZmZXIgPQorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLmxvY2soKTsKKyAgICAgICAgICAgIGlmICghY29tcEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMyYnVmZmVyID09IGNvbXBCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlcnNbaV0ub3duZWRCeUNsaWVudCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBjb2RlYyByZWxlYXNlZCBhIGJ1ZmZlciBvd25lZCBieSBjbGllbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiKGluZGV4ICV6dSkiLCBtTmFtZSwgaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIucmVzZXQoKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBjb2RlYyByZWxlYXNlZCBidWZmZXIgIyV6dShhcnJheSBtb2RlKSIsIG1OYW1lLCBpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiWyVzXSBjb2RlYyByZWxlYXNlZCBhbiB1bmtub3duIGJ1ZmZlciAoYXJyYXkgbW9kZSkiLCBtTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3B1bGF0ZSB8YXJyYXl8IHdpdGggdGhlIHVuZGVybHlpbmcgYnVmZmVyIGFycmF5LgorICAgICAqCisgICAgICogXHBhcmFtIGFycmF5W291dF0gIGFuIGFycmF5IHRvIGJlIGZpbGxlZCB3aXRoIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBhcnJheS4KKyAgICAgKi8KKyAgICB2b2lkIGdldEFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBjb25zdCB7CisgICAgICAgIGFycmF5LT5jbGVhcigpOworICAgICAgICBmb3IgKGNvbnN0IEVudHJ5ICZlbnRyeSA6IG1CdWZmZXJzKSB7CisgICAgICAgICAgICBhcnJheS0+cHVzaChlbnRyeS5jbGllbnRCdWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGNsaWVudCBhYmFuZG9uZWQgYWxsIGtub3duIGJ1ZmZlcnMsIHNvIHJlY2xhaW0gdGhlIG93bmVyc2hpcC4KKyAgICAgKi8KKyAgICB2b2lkIGZsdXNoKCkgeworICAgICAgICBmb3IgKEVudHJ5ICZlbnRyeSA6IG1CdWZmZXJzKSB7CisgICAgICAgICAgICBlbnRyeS5vd25lZEJ5Q2xpZW50ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJlYWxsb2Moc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jKSB7CisgICAgICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlcnMuc2l6ZSgpOworICAgICAgICBtQnVmZmVycy5jbGVhcigpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICAgICAgbUJ1ZmZlcnMucHVzaF9iYWNrKHsgYWxsb2MoKSwgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4oKSwgZmFsc2UgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6Y291bnRfaWYoCisgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuYmVnaW4oKSwgbUJ1ZmZlcnMuZW5kKCksCisgICAgICAgICAgICAgICAgW10oY29uc3QgRW50cnkgJmVudHJ5KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5vd25lZEJ5Q2xpZW50OworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBtSW1wbE5hbWU7IC8vLzwgbmFtZSBmb3IgZGVidWdnaW5nCisgICAgY29uc3QgY2hhciAqbU5hbWU7IC8vLzwgQy1zdHJpbmcgdmVyc2lvbiBvZiBuYW1lCisKKyAgICBzdHJ1Y3QgRW50cnkgeworICAgICAgICBjb25zdCBzcDxDb2RlYzJCdWZmZXI+IGNsaWVudEJ1ZmZlcjsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4gY29tcEJ1ZmZlcjsKKyAgICAgICAgYm9vbCBvd25lZEJ5Q2xpZW50OworICAgIH07CisgICAgc3RkOjp2ZWN0b3I8RW50cnk+IG1CdWZmZXJzOworfTsKKworY2xhc3MgSW5wdXRCdWZmZXJzQXJyYXkgOiBwdWJsaWMgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBJbnB1dEJ1ZmZlcnNBcnJheShjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIklucHV0W05dIikKKyAgICAgICAgOiBJbnB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSkgeyB9CisgICAgfklucHV0QnVmZmVyc0FycmF5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdm9pZCBpbml0aWFsaXplKAorICAgICAgICAgICAgY29uc3QgRmxleEJ1ZmZlcnNJbXBsICZpbXBsLAorICAgICAgICAgICAgc2l6ZV90IG1pblNpemUsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2NhdGUpIHsKKyAgICAgICAgbUltcGwuaW5pdGlhbGl6ZShpbXBsLCBtaW5TaXplLCBhbGxvY2F0ZSk7CisgICAgfQorCisgICAgYm9vbCBpc0FycmF5TW9kZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKAorICAgICAgICAgICAgc2l6ZV90KSBmaW5hbCB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHZvaWQgZ2V0QXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIGNvbnN0IGZpbmFsIHsKKyAgICAgICAgbUltcGwuZ2V0QXJyYXkoYXJyYXkpOworICAgIH0KKworICAgIGJvb2wgcmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKmluZGV4LCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gYzJCdWZmZXI7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1JbXBsLmdyYWJCdWZmZXIoaW5kZXgsICZjMkJ1ZmZlcik7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIGMyQnVmZmVyLT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgICAgICAgICBoYW5kbGVJbWFnZURhdGEoYzJCdWZmZXIpOworICAgICAgICAgICAgKmJ1ZmZlciA9IGMyQnVmZmVyOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgcmVsZWFzZSkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwucmV0dXJuQnVmZmVyKGJ1ZmZlciwgYzJidWZmZXIsIHJlbGVhc2UpOworICAgIH0KKworICAgIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLmV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjMmJ1ZmZlcik7CisgICAgfQorCisgICAgdm9pZCBmbHVzaCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbUltcGwuZmx1c2goKTsKKyAgICB9CisKKyAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IGZpbmFsIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLm51bUNsaWVudEJ1ZmZlcnMoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQnVmZmVyc0FycmF5SW1wbCBtSW1wbDsKK307CisKK2NsYXNzIExpbmVhcklucHV0QnVmZmVycyA6IHB1YmxpYyBDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIExpbmVhcklucHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjFELUlucHV0IikKKyAgICAgICAgOiBJbnB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSksCisgICAgICAgICAgbUltcGwobU5hbWUpIHsgfQorCisgICAgYm9vbCByZXF1ZXN0TmV3QnVmZmVyKHNpemVfdCAqaW5kZXgsIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgaW50MzJfdCBjYXBhY2l0eSA9IGtMaW5lYXJCdWZmZXJTaXplOworICAgICAgICAodm9pZCltRm9ybWF0LT5maW5kSW50MzIoS0VZX01BWF9JTlBVVF9TSVpFLCAmY2FwYWNpdHkpOworICAgICAgICBpZiAoKHNpemVfdCljYXBhY2l0eSA+IGtNYXhMaW5lYXJCdWZmZXJTaXplKSB7CisgICAgICAgICAgICBBTE9HRCgiY2xpZW50IHJlcXVlc3RlZCAlZCwgY2FwcGVkIHRvICV6dSIsIGNhcGFjaXR5LCBrTWF4TGluZWFyQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBjYXBhY2l0eSA9IGtNYXhMaW5lYXJCdWZmZXJTaXplOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IHByb3BlciBtYXggaW5wdXQgc2l6ZQorICAgICAgICAvLyBUT0RPOiByZWFkIHVzYWdlIGZyb20gaW50ZgorICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IG5ld0J1ZmZlciA9IGFsbG9jKChzaXplX3QpY2FwYWNpdHkpOworICAgICAgICBpZiAobmV3QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAqaW5kZXggPSBtSW1wbC5hc3NpZ25TbG90KG5ld0J1ZmZlcik7CisgICAgICAgICpidWZmZXIgPSBuZXdCdWZmZXI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgcmVsZWFzZSkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwucmVsZWFzZVNsb3QoYnVmZmVyLCBjMmJ1ZmZlciwgcmVsZWFzZSk7CisgICAgfQorCisgICAgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwuZXhwaXJlQ29tcG9uZW50QnVmZmVyKGMyYnVmZmVyKTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUaGlzIGlzIG5vLW9wIGJ5IGRlZmF1bHQgdW5sZXNzIHdlJ3JlIGluIGFycmF5IG1vZGUgd2hlcmUgd2UgbmVlZCB0byBrZWVwCisgICAgICAgIC8vIHRyYWNrIG9mIHRoZSBmbHVzaGVkIHdvcmsuCisgICAgICAgIG1JbXBsLmZsdXNoKCk7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycz4gdG9BcnJheU1vZGUoCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgZmluYWwgeworICAgICAgICBpbnQzMl90IGNhcGFjaXR5ID0ga0xpbmVhckJ1ZmZlclNpemU7CisgICAgICAgICh2b2lkKW1Gb3JtYXQtPmZpbmRJbnQzMihLRVlfTUFYX0lOUFVUX1NJWkUsICZjYXBhY2l0eSk7CisgICAgICAgIGlmICgoc2l6ZV90KWNhcGFjaXR5ID4ga01heExpbmVhckJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIEFMT0dEKCJjbGllbnQgcmVxdWVzdGVkICVkLCBjYXBwZWQgdG8gJXp1IiwgY2FwYWNpdHksIGtNYXhMaW5lYXJCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIGNhcGFjaXR5ID0ga01heExpbmVhckJ1ZmZlclNpemU7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogcHJvcGVyIG1heCBpbnB1dCBzaXplCisgICAgICAgIC8vIFRPRE86IHJlYWQgdXNhZ2UgZnJvbSBpbnRmCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnNBcnJheT4gYXJyYXkoCisgICAgICAgICAgICAgICAgbmV3IElucHV0QnVmZmVyc0FycmF5KG1Db21wb25lbnROYW1lLmNfc3RyKCksICIxRC1JbnB1dFtOXSIpKTsKKyAgICAgICAgYXJyYXktPnNldFBvb2wobVBvb2wpOworICAgICAgICBhcnJheS0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgICAgICBhcnJheS0+aW5pdGlhbGl6ZSgKKyAgICAgICAgICAgICAgICBtSW1wbCwKKyAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgIFt0aGlzLCBjYXBhY2l0eV0gKCkgLT4gc3A8Q29kZWMyQnVmZmVyPiB7IHJldHVybiBhbGxvYyhjYXBhY2l0eSk7IH0pOworICAgICAgICByZXR1cm4gc3RkOjptb3ZlKGFycmF5KTsKKyAgICB9CisKKyAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IGZpbmFsIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLm51bUNsaWVudEJ1ZmZlcnMoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNwPENvZGVjMkJ1ZmZlcj4gYWxsb2Moc2l6ZV90IHNpemUpIHsKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbVBvb2wtPmZldGNoTGluZWFyQmxvY2soc2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIExpbmVhckJsb2NrQnVmZmVyOjpBbGxvY2F0ZShtRm9ybWF0LCBibG9jayk7CisgICAgfQorCitwcml2YXRlOgorICAgIEZsZXhCdWZmZXJzSW1wbCBtSW1wbDsKK307CisKK2NsYXNzIEVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVycyA6IHB1YmxpYyBMaW5lYXJJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIEVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVycygKKyAgICAgICAgICAgIGJvb2wgc2VjdXJlLAorICAgICAgICAgICAgY29uc3Qgc3A8TWVtb3J5RGVhbGVyPiAmZGVhbGVyLAorICAgICAgICAgICAgY29uc3Qgc3A8SUNyeXB0bz4gJmNyeXB0bywKKyAgICAgICAgICAgIGludDMyX3QgaGVhcFNlcU51bSwKKyAgICAgICAgICAgIHNpemVfdCBjYXBhY2l0eSwKKyAgICAgICAgICAgIHNpemVfdCBudW1JbnB1dFNsb3RzLAorICAgICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJFbmNyeXB0ZWRJbnB1dCIpCisgICAgICAgIDogTGluZWFySW5wdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpLAorICAgICAgICAgIG1Vc2FnZSh7MCwgMH0pLAorICAgICAgICAgIG1EZWFsZXIoZGVhbGVyKSwKKyAgICAgICAgICBtQ3J5cHRvKGNyeXB0byksCisgICAgICAgICAgbUhlYXBTZXFOdW0oaGVhcFNlcU51bSkgeworICAgICAgICBpZiAoc2VjdXJlKSB7CisgICAgICAgICAgICBtVXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OlJFQURfUFJPVEVDVEVELCAwIH07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUlucHV0U2xvdHM7ICsraSkgeworICAgICAgICAgICAgc3A8SU1lbW9yeT4gbWVtb3J5ID0gbURlYWxlci0+YWxsb2NhdGUoY2FwYWNpdHkpOworICAgICAgICAgICAgaWYgKG1lbW9yeSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmcm9tIGRlYWxlcjogb25seSAlenUgc2xvdHMgYWxsb2NhdGVkIiwgbU5hbWUsIGkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU1lbW9yeVZlY3Rvci5wdXNoX2JhY2soe3N0ZDo6d2Vha19wdHI8QzJMaW5lYXJCbG9jaz4oKSwgbWVtb3J5fSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB+RW5jcnlwdGVkTGluZWFySW5wdXRCdWZmZXJzKCkgb3ZlcnJpZGUgeworICAgIH0KKworICAgIHNwPENvZGVjMkJ1ZmZlcj4gYWxsb2Moc2l6ZV90IHNpemUpIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8SU1lbW9yeT4gbWVtb3J5OworICAgICAgICBzaXplX3Qgc2xvdCA9IDA7CisgICAgICAgIGZvciAoOyBzbG90IDwgbU1lbW9yeVZlY3Rvci5zaXplKCk7ICsrc2xvdCkgeworICAgICAgICAgICAgaWYgKG1NZW1vcnlWZWN0b3Jbc2xvdF0uYmxvY2suZXhwaXJlZCgpKSB7CisgICAgICAgICAgICAgICAgbWVtb3J5ID0gbU1lbW9yeVZlY3RvcltzbG90XS5tZW1vcnk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lbW9yeSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbVBvb2wtPmZldGNoTGluZWFyQmxvY2soc2l6ZSwgbVVzYWdlLCAmYmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LIHx8IGJsb2NrID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisKKyAgICAgICAgbU1lbW9yeVZlY3RvcltzbG90XS5ibG9jayA9IGJsb2NrOworICAgICAgICByZXR1cm4gbmV3IEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyKG1Gb3JtYXQsIGJsb2NrLCBtZW1vcnksIG1IZWFwU2VxTnVtKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQzJNZW1vcnlVc2FnZSBtVXNhZ2U7CisgICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyOworICAgIHNwPElDcnlwdG8+IG1DcnlwdG87CisgICAgaW50MzJfdCBtSGVhcFNlcU51bTsKKyAgICBzdHJ1Y3QgRW50cnkgeworICAgICAgICBzdGQ6OndlYWtfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICBzcDxJTWVtb3J5PiBtZW1vcnk7CisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxFbnRyeT4gbU1lbW9yeVZlY3RvcjsKK307CisKK2NsYXNzIEdyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVycyA6IHB1YmxpYyBDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIEdyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjJELU1ldGFJbnB1dCIpCisgICAgICAgIDogSW5wdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpLAorICAgICAgICAgIG1JbXBsKG1OYW1lKSwKKyAgICAgICAgICBtU3RvcmUoR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpKSB7IH0KKyAgICB+R3JhcGhpY01ldGFkYXRhSW5wdXRCdWZmZXJzKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgYm9vbCByZXF1ZXN0TmV3QnVmZmVyKHNpemVfdCAqaW5kZXgsIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvYzsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbVN0b3JlLT5mZXRjaEFsbG9jYXRvcihtUG9vbC0+Z2V0QWxsb2NhdG9ySWQoKSwgJmFsbG9jKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHNwPEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcj4gbmV3QnVmZmVyID0gbmV3IEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcihtRm9ybWF0LCBhbGxvYyk7CisgICAgICAgIGlmIChuZXdCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAgICAgKmJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyLAorICAgICAgICAgICAgYm9vbCByZWxlYXNlKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5yZWxlYXNlU2xvdChidWZmZXIsIGMyYnVmZmVyLCByZWxlYXNlKTsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5leHBpcmVDb21wb25lbnRCdWZmZXIoYzJidWZmZXIpOworICAgIH0KKworICAgIHZvaWQgZmx1c2goKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm8tb3AgYnkgZGVmYXVsdCB1bmxlc3Mgd2UncmUgaW4gYXJyYXkgbW9kZSB3aGVyZSB3ZSBuZWVkIHRvIGtlZXAKKyAgICAgICAgLy8gdHJhY2sgb2YgdGhlIGZsdXNoZWQgd29yay4KKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzPiB0b0FycmF5TW9kZSgKKyAgICAgICAgICAgIHNpemVfdCBzaXplKSBmaW5hbCB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2M7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1TdG9yZS0+ZmV0Y2hBbGxvY2F0b3IobVBvb2wtPmdldEFsbG9jYXRvcklkKCksICZhbGxvYyk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnNBcnJheT4gYXJyYXkoCisgICAgICAgICAgICAgICAgbmV3IElucHV0QnVmZmVyc0FycmF5KG1Db21wb25lbnROYW1lLmNfc3RyKCksICIyRC1NZXRhSW5wdXRbTl0iKSk7CisgICAgICAgIGFycmF5LT5zZXRQb29sKG1Qb29sKTsKKyAgICAgICAgYXJyYXktPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAgICAgYXJyYXktPmluaXRpYWxpemUoCisgICAgICAgICAgICAgICAgbUltcGwsCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICBbZm9ybWF0ID0gbUZvcm1hdCwgYWxsb2NdKCkgLT4gc3A8Q29kZWMyQnVmZmVyPiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgR3JhcGhpY01ldGFkYXRhQnVmZmVyKGZvcm1hdCwgYWxsb2MpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gc3RkOjptb3ZlKGFycmF5KTsKKyAgICB9CisKKyAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IGZpbmFsIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLm51bUNsaWVudEJ1ZmZlcnMoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRmxleEJ1ZmZlcnNJbXBsIG1JbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBtU3RvcmU7Cit9OworCitjbGFzcyBHcmFwaGljSW5wdXRCdWZmZXJzIDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgR3JhcGhpY0lucHV0QnVmZmVycygKKyAgICAgICAgICAgIHNpemVfdCBudW1JbnB1dFNsb3RzLCBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjJELUJCLUlucHV0IikKKyAgICAgICAgOiBJbnB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSksCisgICAgICAgICAgbUltcGwobU5hbWUpLAorICAgICAgICAgIG1Mb2NhbEJ1ZmZlclBvb2woTG9jYWxCdWZmZXJQb29sOjpDcmVhdGUoCisgICAgICAgICAgICAgICAgICBrTWF4TGluZWFyQnVmZmVyU2l6ZSAqIG51bUlucHV0U2xvdHMpKSB7IH0KKyAgICB+R3JhcGhpY0lucHV0QnVmZmVycygpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIGJvb2wgcmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKmluZGV4LCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRPRE86IHByb3BlciBtYXggaW5wdXQgc2l6ZQorICAgICAgICAvLyBUT0RPOiByZWFkIHVzYWdlIGZyb20gaW50ZgorICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIHNwPEdyYXBoaWNCbG9ja0J1ZmZlcj4gbmV3QnVmZmVyID0gQWxsb2NhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgICAgIG1Qb29sLCBtRm9ybWF0LCBIQUxfUElYRUxfRk9STUFUX1lWMTIsIHVzYWdlLCBtTG9jYWxCdWZmZXJQb29sKTsKKyAgICAgICAgaWYgKG5ld0J1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgKmluZGV4ID0gbUltcGwuYXNzaWduU2xvdChuZXdCdWZmZXIpOworICAgICAgICBoYW5kbGVJbWFnZURhdGEobmV3QnVmZmVyKTsKKyAgICAgICAgKmJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyLAorICAgICAgICAgICAgYm9vbCByZWxlYXNlKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5yZWxlYXNlU2xvdChidWZmZXIsIGMyYnVmZmVyLCByZWxlYXNlKTsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5leHBpcmVDb21wb25lbnRCdWZmZXIoYzJidWZmZXIpOworICAgIH0KKworICAgIHZvaWQgZmx1c2goKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm8tb3AgYnkgZGVmYXVsdCB1bmxlc3Mgd2UncmUgaW4gYXJyYXkgbW9kZSB3aGVyZSB3ZSBuZWVkIHRvIGtlZXAKKyAgICAgICAgLy8gdHJhY2sgb2YgdGhlIGZsdXNoZWQgd29yay4KKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjQnVmZmVyQ2hhbm5lbDo6SW5wdXRCdWZmZXJzPiB0b0FycmF5TW9kZSgKKyAgICAgICAgICAgIHNpemVfdCBzaXplKSBmaW5hbCB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnNBcnJheT4gYXJyYXkoCisgICAgICAgICAgICAgICAgbmV3IElucHV0QnVmZmVyc0FycmF5KG1Db21wb25lbnROYW1lLmNfc3RyKCksICIyRC1CQi1JbnB1dFtOXSIpKTsKKyAgICAgICAgYXJyYXktPnNldFBvb2wobVBvb2wpOworICAgICAgICBhcnJheS0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgICAgICBhcnJheS0+aW5pdGlhbGl6ZSgKKyAgICAgICAgICAgICAgICBtSW1wbCwKKyAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgIFtwb29sID0gbVBvb2wsIGZvcm1hdCA9IG1Gb3JtYXQsIGxicCA9IG1Mb2NhbEJ1ZmZlclBvb2xdKCkgLT4gc3A8Q29kZWMyQnVmZmVyPiB7CisgICAgICAgICAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFsbG9jYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sLCBmb3JtYXQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMiwgdXNhZ2UsIGxicCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoYXJyYXkpOworICAgIH0KKworICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgZmluYWwgeworICAgICAgICByZXR1cm4gbUltcGwubnVtQ2xpZW50QnVmZmVycygpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBGbGV4QnVmZmVyc0ltcGwgbUltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gbUxvY2FsQnVmZmVyUG9vbDsKK307CisKK2NsYXNzIER1bW15SW5wdXRCdWZmZXJzIDogcHVibGljIENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgRHVtbXlJbnB1dEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICIyRC1JbnB1dCIpCisgICAgICAgIDogSW5wdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpIHsgfQorCisgICAgYm9vbCByZXF1ZXN0TmV3QnVmZmVyKHNpemVfdCAqLCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmLCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICosIGJvb2wpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZvaWQgZmx1c2goKSBvdmVycmlkZSB7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0QnVmZmVycz4gdG9BcnJheU1vZGUoCisgICAgICAgICAgICBzaXplX3QpIGZpbmFsIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYm9vbCBpc0FycmF5TW9kZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHZvaWQgZ2V0QXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIGNvbnN0IGZpbmFsIHsKKyAgICAgICAgYXJyYXktPmNsZWFyKCk7CisgICAgfQorCisgICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCBmaW5hbCB7CisgICAgICAgIHJldHVybiAwdTsKKyAgICB9Cit9OworCitjbGFzcyBPdXRwdXRCdWZmZXJzQXJyYXkgOiBwdWJsaWMgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6T3V0cHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgT3V0cHV0QnVmZmVyc0FycmF5KGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiT3V0cHV0W05dIikKKyAgICAgICAgOiBPdXRwdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpIHsgfQorICAgIH5PdXRwdXRCdWZmZXJzQXJyYXkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIGluaXRpYWxpemUoCisgICAgICAgICAgICBjb25zdCBGbGV4QnVmZmVyc0ltcGwgJmltcGwsCisgICAgICAgICAgICBzaXplX3QgbWluU2l6ZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBhbGxvY2F0ZSkgeworICAgICAgICBtSW1wbC5pbml0aWFsaXplKGltcGwsIG1pblNpemUsIGFsbG9jYXRlKTsKKyAgICB9CisKKyAgICBib29sIGlzQXJyYXlNb2RlKCkgY29uc3QgZmluYWwgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY0J1ZmZlckNoYW5uZWw6Ok91dHB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKAorICAgICAgICAgICAgc2l6ZV90KSBmaW5hbCB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHN0YXR1c190IHJlZ2lzdGVyQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpjbGllbnRCdWZmZXIpIGZpbmFsIHsKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjMkJ1ZmZlcjsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUltcGwuZ3JhYkJ1ZmZlcigKKyAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAmYzJCdWZmZXIsCisgICAgICAgICAgICAgICAgW2J1ZmZlcl0oY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmY2xpZW50QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnRCdWZmZXItPmNhbkNvcHkoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKGVyciA9PSBXT1VMRF9CTE9DSykgeworICAgICAgICAgICAgQUxPR1YoIlslc10gYnVmZmVycyB0ZW1wb3JhcmlseSBub3QgYXZhaWxhYmxlIiwgbU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJbJXNdIGdyYWJCdWZmZXIgZmFpbGVkOiAlZCIsIG1OYW1lLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBjMkJ1ZmZlci0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgICAgICBpZiAoIWMyQnVmZmVyLT5jb3B5KGJ1ZmZlcikpIHsKKyAgICAgICAgICAgIEFMT0dEKCJbJXNdIGNvcHkgYnVmZmVyIGZhaWxlZCIsIG1OYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICAgICAgfQorICAgICAgICBzdWJtaXQoYzJCdWZmZXIpOworICAgICAgICBoYW5kbGVJbWFnZURhdGEoYzJCdWZmZXIpOworICAgICAgICAqY2xpZW50QnVmZmVyID0gYzJCdWZmZXI7CisgICAgICAgIEFMT0dWKCJbJXNdIGdyYWJiZWQgYnVmZmVyICV6dSIsIG1OYW1lLCAqaW5kZXgpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmVnaXN0ZXJDc2QoCisgICAgICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICpjc2QsCisgICAgICAgICAgICBzaXplX3QgKmluZGV4LAorICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmNsaWVudEJ1ZmZlcikgZmluYWwgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGMyQnVmZmVyOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtSW1wbC5ncmFiQnVmZmVyKAorICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICZjMkJ1ZmZlciwKKyAgICAgICAgICAgICAgICBbY3NkXShjb25zdCBzcDxDb2RlYzJCdWZmZXI+ICZjbGllbnRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudEJ1ZmZlci0+YmFzZSgpICE9IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjbGllbnRCdWZmZXItPmNhcGFjaXR5KCkgPj0gY3NkLT5mbGV4Q291bnQoKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoYzJCdWZmZXItPmJhc2UoKSwgY3NkLT5tLnZhbHVlLCBjc2QtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgYzJCdWZmZXItPnNldFJhbmdlKDAsIGNzZC0+ZmxleENvdW50KCkpOworICAgICAgICBjMkJ1ZmZlci0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgICAgICAqY2xpZW50QnVmZmVyID0gYzJCdWZmZXI7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwucmV0dXJuQnVmZmVyKGJ1ZmZlciwgYzJidWZmZXIsIHRydWUpOworICAgIH0KKworICAgIHZvaWQgZmx1c2goY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmZmx1c2hlZFdvcmspIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpZmx1c2hlZFdvcms7CisgICAgICAgIG1JbXBsLmZsdXNoKCk7CisgICAgICAgIGlmIChtU2tpcEN1dEJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtU2tpcEN1dEJ1ZmZlci0+Y2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZ2V0QXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIGNvbnN0IGZpbmFsIHsKKyAgICAgICAgbUltcGwuZ2V0QXJyYXkoYXJyYXkpOworICAgIH0KKworICAgIHZvaWQgcmVhbGxvYyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgeworICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2M7CisgICAgICAgIHN3aXRjaCAoYzJidWZmZXItPmRhdGEoKS50eXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgQzJCdWZmZXJEYXRhOjpMSU5FQVI6IHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplID0ga0xpbmVhckJ1ZmZlclNpemU7CisgICAgICAgICAgICAgICAgY29uc3QgQzJDb25zdExpbmVhckJsb2NrICZibG9jayA9IGMyYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYmxvY2suc2l6ZSgpIDwga01heExpbmVhckJ1ZmZlclNpemUgLyAyKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBibG9jay5zaXplKCkgKiAyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBrTWF4TGluZWFyQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWxsb2MgPSBbZm9ybWF0ID0gbUZvcm1hdCwgc2l6ZV0geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExvY2FsTGluZWFyQnVmZmVyKGZvcm1hdCwgbmV3IEFCdWZmZXIoc2l6ZSkpOworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0CisgICAgICAgICAgICBjYXNlIEMyQnVmZmVyRGF0YTo6R1JBUEhJQzogICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKKworICAgICAgICAgICAgY2FzZSBDMkJ1ZmZlckRhdGE6OklOVkFMSUQ6ICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CisgICAgICAgICAgICBjYXNlIEMyQnVmZmVyRGF0YTo6TElORUFSX0NIVU5LUzogICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKKyAgICAgICAgICAgIGNhc2UgQzJCdWZmZXJEYXRhOjpHUkFQSElDX0NIVU5LUzogIEZBTExUSFJPVUdIX0lOVEVOREVEOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRCgiVW5zdXBwb3J0ZWQgdHlwZTogJWQiLCAoaW50KWMyYnVmZmVyLT5kYXRhKCkudHlwZSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUltcGwucmVhbGxvYyhhbGxvYyk7CisgICAgfQorCisgICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCBmaW5hbCB7CisgICAgICAgIHJldHVybiBtSW1wbC5udW1DbGllbnRCdWZmZXJzKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIEJ1ZmZlcnNBcnJheUltcGwgbUltcGw7Cit9OworCitjbGFzcyBGbGV4T3V0cHV0QnVmZmVycyA6IHB1YmxpYyBDQ29kZWNCdWZmZXJDaGFubmVsOjpPdXRwdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBGbGV4T3V0cHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIk91dHB1dFtdIikKKyAgICAgICAgOiBPdXRwdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpLAorICAgICAgICAgIG1JbXBsKG1OYW1lKSB7IH0KKworICAgIHN0YXR1c190IHJlZ2lzdGVyQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpjbGllbnRCdWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBuZXdCdWZmZXIgPSB3cmFwKGJ1ZmZlcik7CisgICAgICAgIGlmIChuZXdCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBuZXdCdWZmZXItPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAgICAgKmluZGV4ID0gbUltcGwuYXNzaWduU2xvdChuZXdCdWZmZXIpOworICAgICAgICBoYW5kbGVJbWFnZURhdGEobmV3QnVmZmVyKTsKKyAgICAgICAgKmNsaWVudEJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICAgICAgQUxPR1YoIlslc10gcmVnaXN0ZXJlZCBidWZmZXIgJXp1IiwgbU5hbWUsICppbmRleCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZWdpc3RlckNzZCgKKyAgICAgICAgICAgIGNvbnN0IEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQgKmNzZCwKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqY2xpZW50QnVmZmVyKSBmaW5hbCB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gbmV3QnVmZmVyID0gbmV3IExvY2FsTGluZWFyQnVmZmVyKAorICAgICAgICAgICAgICAgIG1Gb3JtYXQsIEFCdWZmZXI6OkNyZWF0ZUFzQ29weShjc2QtPm0udmFsdWUsIGNzZC0+ZmxleENvdW50KCkpKTsKKyAgICAgICAgKmluZGV4ID0gbUltcGwuYXNzaWduU2xvdChuZXdCdWZmZXIpOworICAgICAgICAqY2xpZW50QnVmZmVyID0gbmV3QnVmZmVyOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC5yZWxlYXNlU2xvdChidWZmZXIsIGMyYnVmZmVyLCB0cnVlKTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmZmx1c2hlZFdvcmspIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpIGZsdXNoZWRXb3JrOworICAgICAgICAvLyBUaGlzIGlzIG5vLW9wIGJ5IGRlZmF1bHQgdW5sZXNzIHdlJ3JlIGluIGFycmF5IG1vZGUgd2hlcmUgd2UgbmVlZCB0byBrZWVwCisgICAgICAgIC8vIHRyYWNrIG9mIHRoZSBmbHVzaGVkIHdvcmsuCisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY0J1ZmZlckNoYW5uZWw6Ok91dHB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKAorICAgICAgICAgICAgc2l6ZV90IHNpemUpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnNBcnJheT4gYXJyYXkobmV3IE91dHB1dEJ1ZmZlcnNBcnJheShtQ29tcG9uZW50TmFtZS5jX3N0cigpKSk7CisgICAgICAgIGFycmF5LT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgICAgIGFycmF5LT50cmFuc2ZlclNraXBDdXRCdWZmZXIobVNraXBDdXRCdWZmZXIpOworICAgICAgICBhcnJheS0+aW5pdGlhbGl6ZSgKKyAgICAgICAgICAgICAgICBtSW1wbCwKKyAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgIFt0aGlzXSgpIHsgcmV0dXJuIGFsbG9jYXRlQXJyYXlCdWZmZXIoKTsgfSk7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoYXJyYXkpOworICAgIH0KKworICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgZmluYWwgeworICAgICAgICByZXR1cm4gbUltcGwubnVtQ2xpZW50QnVmZmVycygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhcHByb3ByaWF0ZSBDb2RlYzJCdWZmZXIgb2JqZWN0IGZvciB0aGUgdHlwZSBvZiBidWZmZXJzLgorICAgICAqCisgICAgICogXHBhcmFtIGJ1ZmZlciAgQzJCdWZmZXIgb2JqZWN0IHRvIHdyYXAuCisgICAgICoKKyAgICAgKiBccmV0dXJuICBhcHByb3ByaWF0ZSBDb2RlYzJCdWZmZXIgb2JqZWN0IHRvIHdyYXAgfGJ1ZmZlcnwuCisgICAgICovCisgICAgdmlydHVhbCBzcDxDb2RlYzJCdWZmZXI+IHdyYXAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gYXBwcm9wcmlhdGUgQ29kZWMyQnVmZmVyIG9iamVjdCBmb3IgdGhlIHR5cGUgb2YgYnVmZmVycywgdG8gYmUKKyAgICAgKiB1c2VkIGFzIGFuIGVtcHR5IGFycmF5IGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gIGFwcHJvcHJpYXRlIENvZGVjMkJ1ZmZlciBvYmplY3Qgd2hpY2ggY2FuIGNvcHkoKSBmcm9tIEMyQnVmZmVycy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNwPENvZGVjMkJ1ZmZlcj4gYWxsb2NhdGVBcnJheUJ1ZmZlcigpID0gMDsKKworcHJpdmF0ZToKKyAgICBGbGV4QnVmZmVyc0ltcGwgbUltcGw7Cit9OworCitjbGFzcyBMaW5lYXJPdXRwdXRCdWZmZXJzIDogcHVibGljIEZsZXhPdXRwdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBMaW5lYXJPdXRwdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMUQtT3V0cHV0IikKKyAgICAgICAgOiBGbGV4T3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKworICAgIHZvaWQgZmx1c2goCisgICAgICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yaykgb3ZlcnJpZGUgeworICAgICAgICBpZiAobVNraXBDdXRCdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbVNraXBDdXRCdWZmZXItPmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgRmxleE91dHB1dEJ1ZmZlcnM6OmZsdXNoKGZsdXNoZWRXb3JrKTsKKyAgICB9CisKKyAgICBzcDxDb2RlYzJCdWZmZXI+IHdyYXAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1YoIlslc10gdXNpbmcgYSBkdW1teSBidWZmZXIiLCBtTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IExvY2FsTGluZWFyQnVmZmVyKG1Gb3JtYXQsIG5ldyBBQnVmZmVyKDApKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkudHlwZSgpICE9IEMyQnVmZmVyRGF0YTo6TElORUFSKSB7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBub24tbGluZWFyIGJ1ZmZlciAlZCIsIG1OYW1lLCBidWZmZXItPmRhdGEoKS50eXBlKCkpOworICAgICAgICAgICAgLy8gV2UgZXhwZWN0IGxpbmVhciBvdXRwdXQgYnVmZmVycyBmcm9tIHRoZSBjb21wb25lbnQuCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBubyBsaW5lYXIgYnVmZmVycyIsIG1OYW1lKTsKKyAgICAgICAgICAgIC8vIFdlIGV4cGVjdCBvbmUgYW5kIG9ubHkgb25lIGxpbmVhciBibG9jayBmcm9tIHRoZSBjb21wb25lbnQuCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGNsaWVudEJ1ZmZlciA9IENvbnN0TGluZWFyQmxvY2tCdWZmZXI6OkFsbG9jYXRlKG1Gb3JtYXQsIGJ1ZmZlcik7CisgICAgICAgIGlmIChjbGllbnRCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0QoIlslc10gQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcjo6QWxsb2NhdGUgZmFpbGVkIiwgbU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgc3VibWl0KGNsaWVudEJ1ZmZlcik7CisgICAgICAgIHJldHVybiBjbGllbnRCdWZmZXI7CisgICAgfQorCisgICAgc3A8Q29kZWMyQnVmZmVyPiBhbGxvY2F0ZUFycmF5QnVmZmVyKCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUT0RPOiBwcm9wZXIgbWF4IG91dHB1dCBzaXplCisgICAgICAgIHJldHVybiBuZXcgTG9jYWxMaW5lYXJCdWZmZXIobUZvcm1hdCwgbmV3IEFCdWZmZXIoa0xpbmVhckJ1ZmZlclNpemUpKTsKKyAgICB9Cit9OworCitjbGFzcyBHcmFwaGljT3V0cHV0QnVmZmVycyA6IHB1YmxpYyBGbGV4T3V0cHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgR3JhcGhpY091dHB1dEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICIyRC1PdXRwdXQiKQorICAgICAgICA6IEZsZXhPdXRwdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpIHsgfQorCisgICAgc3A8Q29kZWMyQnVmZmVyPiB3cmFwKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbmV3IER1bW15Q29udGFpbmVyQnVmZmVyKG1Gb3JtYXQsIGJ1ZmZlcik7CisgICAgfQorCisgICAgc3A8Q29kZWMyQnVmZmVyPiBhbGxvY2F0ZUFycmF5QnVmZmVyKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbmV3IER1bW15Q29udGFpbmVyQnVmZmVyKG1Gb3JtYXQpOworICAgIH0KK307CisKK2NsYXNzIFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzIDogcHVibGljIEZsZXhPdXRwdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBSYXdHcmFwaGljT3V0cHV0QnVmZmVycygKKyAgICAgICAgICAgIHNpemVfdCBudW1PdXRwdXRTbG90cywgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICIyRC1CQi1PdXRwdXQiKQorICAgICAgICA6IEZsZXhPdXRwdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpLAorICAgICAgICAgIG1Mb2NhbEJ1ZmZlclBvb2woTG9jYWxCdWZmZXJQb29sOjpDcmVhdGUoCisgICAgICAgICAgICAgICAgICBrTWF4TGluZWFyQnVmZmVyU2l6ZSAqIG51bU91dHB1dFNsb3RzKSkgeyB9CisgICAgflJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgc3A8Q29kZWMyQnVmZmVyPiB3cmFwKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gYzJidWZmZXIgPSBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGVFbXB0eSgKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgW2xicCA9IG1Mb2NhbEJ1ZmZlclBvb2xdKHNpemVfdCBjYXBhY2l0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxicC0+bmV3QnVmZmVyKGNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoYzJidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZUVtcHR5IGZhaWxlZCIsIG1OYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMyYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgICAgIHJldHVybiBjMmJ1ZmZlcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgW2xicCA9IG1Mb2NhbEJ1ZmZlclBvb2xdKHNpemVfdCBjYXBhY2l0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxicC0+bmV3QnVmZmVyKGNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxDb2RlYzJCdWZmZXI+IGFsbG9jYXRlQXJyYXlCdWZmZXIoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGVFbXB0eSgKKyAgICAgICAgICAgICAgICBtRm9ybWF0LAorICAgICAgICAgICAgICAgIFtsYnAgPSBtTG9jYWxCdWZmZXJQb29sXShzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxicC0+bmV3QnVmZmVyKGNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gbUxvY2FsQnVmZmVyUG9vbDsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZUd1YXJkOjpRdWV1ZUd1YXJkKAorICAgICAgICBDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmMgJnN5bmMpIDogbVN5bmMoc3luYykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1TeW5jLm1HdWFyZExvY2spOworICAgIC8vIEF0IHRoaXMgcG9pbnQgaXQncyBndWFyYW50ZWVkIHRoYXQgbVN5bmMgaXMgbm90IHVuZGVyIHN0YXRlIHRyYW5zaXRpb24sCisgICAgLy8gYXMgd2UgYXJlIGhvbGRpbmcgaXRzIG11dGV4LgorCisgICAgTXV0ZXhlZDxDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmM6OkNvdW50ZXI+OjpMb2NrZWQgY291bnQobVN5bmMubUNvdW50KTsKKyAgICBpZiAoY291bnQtPnZhbHVlID09IC0xKSB7CisgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKytjb3VudC0+dmFsdWU7CisgICAgICAgIG1SdW5uaW5nID0gdHJ1ZTsKKyAgICB9Cit9CisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlR3VhcmQ6On5RdWV1ZUd1YXJkKCkgeworICAgIGlmIChtUnVubmluZykgeworICAgICAgICAvLyBXZSBhcmUgbm90IGhvbGRpbmcgbUd1YXJkTG9jayBhdCB0aGlzIHBvaW50IHNvIHRoYXQgUXVldWVTeW5jOjpzdG9wKCkgY2FuCisgICAgICAgIC8vIGtlZXAgaG9sZGluZyB0aGUgbG9jayB1bnRpbCBtQ291bnQgcmVhY2hlcyB6ZXJvLgorICAgICAgICBNdXRleGVkPENDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlU3luYzo6Q291bnRlcj46OkxvY2tlZCBjb3VudChtU3luYy5tQ291bnQpOworICAgICAgICAtLWNvdW50LT52YWx1ZTsKKyAgICAgICAgY291bnQtPmNvbmQuYnJvYWRjYXN0KCk7CisgICAgfQorfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlU3luYzo6c3RhcnQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUd1YXJkTG9jayk7CisgICAgLy8gSWYgc3RvcHBlZCwgaXQgZ29lcyB0byBydW5uaW5nIHN0YXRlOyBvdGhlcndpc2Ugbm8tb3AuCisgICAgTXV0ZXhlZDxDb3VudGVyPjo6TG9ja2VkIGNvdW50KG1Db3VudCk7CisgICAgaWYgKGNvdW50LT52YWx1ZSA9PSAtMSkgeworICAgICAgICBjb3VudC0+dmFsdWUgPSAwOworICAgIH0KK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmM6OnN0b3AoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUd1YXJkTG9jayk7CisgICAgTXV0ZXhlZDxDb3VudGVyPjo6TG9ja2VkIGNvdW50KG1Db3VudCk7CisgICAgaWYgKGNvdW50LT52YWx1ZSA9PSAtMSkgeworICAgICAgICAvLyBuby1vcAorICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEhvbGRpbmcgbUd1YXJkTG9jayBoZXJlIGJsb2NrcyBjcmVhdGlvbiBvZiBhZGRpdGlvbmFsIFF1ZXVlR3VhcmQgb2JqZWN0cywgc28KKyAgICAvLyBtQ291bnQgY2FuIG9ubHkgZGVjcmVtZW50LiBJbiBvdGhlciB3b3JkcywgdGhyZWFkcyB0aGF0IGFjcXVpcmVkIHRoZSBsb2NrCisgICAgLy8gYXJlIGFsbG93ZWQgdG8gZmluaXNoIGV4ZWN1dGlvbiBidXQgYWRkaXRpb25hbCB0aHJlYWRzIHRyeWluZyB0byBhY3F1aXJlCisgICAgLy8gdGhlIGxvY2sgYXQgdGhpcyBwb2ludCB3aWxsIGJsb2NrLCBhbmQgdGhlbiBnZXQgUXVldWVHdWFyZCBhdCBTVE9QUEVECisgICAgLy8gc3RhdGUuCisgICAgd2hpbGUgKGNvdW50LT52YWx1ZSAhPSAwKSB7CisgICAgICAgIGNvdW50LndhaXRGb3JDb25kaXRpb24oY291bnQtPmNvbmQpOworICAgIH0KKyAgICBjb3VudC0+dmFsdWUgPSAtMTsKK30KKworLy8gQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoCisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6UmVvcmRlclN0YXNoKCkgeworICAgIGNsZWFyKCk7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpjbGVhcigpIHsKKyAgICBtUGVuZGluZy5jbGVhcigpOworICAgIG1TdGFzaC5jbGVhcigpOworICAgIG1EZXB0aCA9IDA7CisgICAgbUtleSA9IEMyQ29uZmlnOjpPUkRJTkFMOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6Zmx1c2goKSB7CisgICAgbVBlbmRpbmcuY2xlYXIoKTsKKyAgICBtU3Rhc2guY2xlYXIoKTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6OnNldERlcHRoKHVpbnQzMl90IGRlcHRoKSB7CisgICAgbVBlbmRpbmcuc3BsaWNlKG1QZW5kaW5nLmVuZCgpLCBtU3Rhc2gpOworICAgIG1EZXB0aCA9IGRlcHRoOworfQordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6OnNldEtleShDMkNvbmZpZzo6b3JkaW5hbF9rZXlfdCBrZXkpIHsKKyAgICBtUGVuZGluZy5zcGxpY2UobVBlbmRpbmcuZW5kKCksIG1TdGFzaCk7CisgICAgbUtleSA9IGtleTsKK30KKworYm9vbCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6OnBvcChFbnRyeSAqZW50cnkpIHsKKyAgICBpZiAobVBlbmRpbmcuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGVudHJ5LT5idWZmZXIgICAgID0gbVBlbmRpbmcuZnJvbnQoKS5idWZmZXI7CisgICAgZW50cnktPnRpbWVzdGFtcCAgPSBtUGVuZGluZy5mcm9udCgpLnRpbWVzdGFtcDsKKyAgICBlbnRyeS0+ZmxhZ3MgICAgICA9IG1QZW5kaW5nLmZyb250KCkuZmxhZ3M7CisgICAgZW50cnktPm9yZGluYWwgICAgPSBtUGVuZGluZy5mcm9udCgpLm9yZGluYWw7CisgICAgbVBlbmRpbmcucG9wX2Zyb250KCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjplbXBsYWNlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIGludDY0X3QgdGltZXN0YW1wLAorICAgICAgICBpbnQzMl90IGZsYWdzLAorICAgICAgICBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0ICZvcmRpbmFsKSB7CisgICAgYXV0byBpdCA9IG1TdGFzaC5iZWdpbigpOworICAgIGZvciAoOyBpdCAhPSBtU3Rhc2guZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGxlc3Mob3JkaW5hbCwgaXQtPm9yZGluYWwpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBtU3Rhc2guZW1wbGFjZShpdCwgYnVmZmVyLCB0aW1lc3RhbXAsIGZsYWdzLCBvcmRpbmFsKTsKKyAgICB3aGlsZSAoIW1TdGFzaC5lbXB0eSgpICYmIG1TdGFzaC5zaXplKCkgPiBtRGVwdGgpIHsKKyAgICAgICAgbVBlbmRpbmcucHVzaF9iYWNrKG1TdGFzaC5mcm9udCgpKTsKKyAgICAgICAgbVN0YXNoLnBvcF9mcm9udCgpOworICAgIH0KK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6OmRlZmVyKAorICAgICAgICBjb25zdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6OkVudHJ5ICZlbnRyeSkgeworICAgIG1QZW5kaW5nLnB1c2hfZnJvbnQoZW50cnkpOworfQorCitib29sIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6aGFzUGVuZGluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gIW1QZW5kaW5nLmVtcHR5KCk7Cit9CisKK2Jvb2wgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpsZXNzKAorICAgICAgICBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0ICZvMSwgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmbzIpIHsKKyAgICBzd2l0Y2ggKG1LZXkpIHsKKyAgICAgICAgY2FzZSBDMkNvbmZpZzo6T1JESU5BTDogICByZXR1cm4gbzEuZnJhbWVJbmRleCA8IG8yLmZyYW1lSW5kZXg7CisgICAgICAgIGNhc2UgQzJDb25maWc6OlRJTUVTVEFNUDogcmV0dXJuIG8xLnRpbWVzdGFtcCA8IG8yLnRpbWVzdGFtcDsKKyAgICAgICAgY2FzZSBDMkNvbmZpZzo6Q1VTVE9NOiAgICByZXR1cm4gbzEuY3VzdG9tT3JkaW5hbCA8IG8yLmN1c3RvbU9yZGluYWw7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRCgiVW5yZWNvZ25pemVkIGtleTsgZGVmYXVsdCB0byB0aW1lc3RhbXAiKTsKKyAgICAgICAgICAgIHJldHVybiBvMS5mcmFtZUluZGV4IDwgbzIuZnJhbWVJbmRleDsKKyAgICB9Cit9CisKKy8vIENDb2RlY0J1ZmZlckNoYW5uZWwKKworQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6Q0NvZGVjQnVmZmVyQ2hhbm5lbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENDb2RlY0NhbGxiYWNrPiAmY2FsbGJhY2spCisgICAgOiBtSGVhcFNlcU51bSgtMSksCisgICAgICBtQ0NvZGVjQ2FsbGJhY2soY2FsbGJhY2spLAorICAgICAgbU51bUlucHV0U2xvdHMoa1Ntb290aG5lc3NGYWN0b3IpLAorICAgICAgbU51bU91dHB1dFNsb3RzKGtTbW9vdGhuZXNzRmFjdG9yKSwKKyAgICAgIG1EZWxheSgwKSwKKyAgICAgIG1GcmFtZUluZGV4KDB1KSwKKyAgICAgIG1GaXJzdFZhbGlkRnJhbWVJbmRleCgwdSksCisgICAgICBtTWV0YU1vZGUoTU9ERV9OT05FKSwKKyAgICAgIG1JbnB1dE1ldEVvcyhmYWxzZSkgeworICAgIG1PdXRwdXRTdXJmYWNlLmxvY2soKS0+bWF4RGVxdWV1ZUJ1ZmZlcnMgPSBrU21vb3RobmVzc0ZhY3RvciArIGtSZW5kZXJpbmdEZXB0aDsKKyAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobUlucHV0QnVmZmVycyk7CisgICAgYnVmZmVycy0+cmVzZXQobmV3IER1bW15SW5wdXRCdWZmZXJzKCIiKSk7Cit9CisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6On5DQ29kZWNCdWZmZXJDaGFubmVsKCkgeworICAgIGlmIChtQ3J5cHRvICE9IG51bGxwdHIgJiYgbURlYWxlciAhPSBudWxscHRyICYmIG1IZWFwU2VxTnVtID49IDApIHsKKyAgICAgICAgbUNyeXB0by0+dW5zZXRIZWFwKG1IZWFwU2VxTnVtKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c2V0Q29tcG9uZW50KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpIHsKKyAgICBtQ29tcG9uZW50ID0gY29tcG9uZW50OworICAgIG1Db21wb25lbnROYW1lID0gY29tcG9uZW50LT5nZXROYW1lKCkgKyBTdHJpbmdQcmludGYoIiMlZCIsIGludCh1aW50cHRyX3QoY29tcG9uZW50LmdldCgpKSAlIDk5NykpOworICAgIG1OYW1lID0gbUNvbXBvbmVudE5hbWUuY19zdHIoKTsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c2V0SW5wdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlV3JhcHBlcj4gJnN1cmZhY2UpIHsKKyAgICBBTE9HVigiWyVzXSBzZXRJbnB1dFN1cmZhY2UiLCBtTmFtZSk7CisgICAgbUlucHV0U3VyZmFjZSA9IHN1cmZhY2U7CisgICAgcmV0dXJuIG1JbnB1dFN1cmZhY2UtPmNvbm5lY3QobUNvbXBvbmVudCk7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSB7CisgICAgaWYgKG1JbnB1dFN1cmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBtSW5wdXRTdXJmYWNlLT5zaWduYWxFbmRPZklucHV0U3RyZWFtKCk7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgaWYgKG1JbnB1dE1ldEVvcykgeworICAgICAgICBBTE9HRCgiWyVzXSBidWZmZXJzIGFmdGVyIEVPUyBpZ25vcmVkICglbGxkIHVzKSIsIG1OYW1lLCAobG9uZyBsb25nKXRpbWVVcyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpbnQzMl90IHRtcCA9IDA7CisgICAgYm9vbCBlb3MgPSBmYWxzZTsKKyAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZW9zIiwgJnRtcCkgJiYgdG1wKSB7CisgICAgICAgIGVvcyA9IHRydWU7CisgICAgICAgIG1JbnB1dE1ldEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJbJXNdIGlucHV0IEVPUyIsIG1OYW1lKTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImNzZCIsICZ0bXApICYmIHRtcCkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUc7CisgICAgfQorICAgIEFMT0dWKCJbJXNdIHF1ZXVlSW5wdXRCdWZmZXI6IGJ1ZmZlci0+c2l6ZSgpID0gJXp1IiwgbU5hbWUsIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKG5ldyBDMldvcmspOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gdGltZVVzOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IG1GcmFtZUluZGV4Kys7CisgICAgLy8gV09SS0FST1VORDogdW50aWwgY29kZWNzIHN1cHBvcnQgaGFuZGxpbmcgd29yayBhZnRlciBFT1MgYW5kIG1heCBvdXRwdXQgc2l6aW5nLCB1c2UgdGltZXN0YW1wCisgICAgLy8gbWFuaXB1bGF0aW9uIHRvIGFjaGlldmUgaW1hZ2UgZW5jb2RpbmcgdmlhIHZpZGVvIGNvZGVjLCBhbmQgdG8gY29uc3RyYWluIGVuY29kZWQgb3V0cHV0LgorICAgIC8vIEtlZXAgY2xpZW50IHRpbWVzdGFtcCBpbiBjdXN0b21PcmRpbmFsCisgICAgd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsID0gdGltZVVzOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKworICAgIHVpbnQ2NF90IHF1ZXVlZEZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+PiBxdWV1ZWRCdWZmZXJzOworCisgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID4gMHUpIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGMyYnVmZmVyOworICAgICAgICBpZiAoISgqYnVmZmVycyktPnJlbGVhc2VCdWZmZXIoYnVmZmVyLCAmYzJidWZmZXIsIGZhbHNlKSkgeworICAgICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5wdXNoX2JhY2soYzJidWZmZXIpOworICAgICAgICBxdWV1ZWRCdWZmZXJzLnB1c2hfYmFjayhjMmJ1ZmZlcik7CisgICAgfSBlbHNlIGlmIChlb3MpIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICB9CisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgLy8gVE9ETzogZmlsbCBpbmZvJ3MKKworICAgIHdvcmstPmlucHV0LmNvbmZpZ1VwZGF0ZSA9IHN0ZDo6bW92ZShtUGFyYW1zVG9CZVNldCk7CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5vbldvcmtRdWV1ZWQoCisgICAgICAgICAgICBxdWV1ZWRGcmFtZUluZGV4LAorICAgICAgICAgICAgc3RkOjptb3ZlKHF1ZXVlZEJ1ZmZlcnMpLAorICAgICAgICAgICAgUGlwZWxpbmVXYXRjaGVyOjpDbG9jazo6bm93KCkpOworICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+b25Xb3JrRG9uZShxdWV1ZWRGcmFtZUluZGV4KTsKKyAgICB9CisKKyAgICBpZiAoZXJyID09IEMyX09LICYmIGVvcyAmJiBidWZmZXItPnNpemUoKSA+IDB1KSB7CisgICAgICAgIHdvcmsucmVzZXQobmV3IEMyV29yayk7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gdGltZVVzOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBtRnJhbWVJbmRleCsrOworICAgICAgICAvLyBXT1JLQVJPVU5EOiBrZWVwIGNsaWVudCB0aW1lc3RhbXAgaW4gY3VzdG9tT3JkaW5hbAorICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwgPSB0aW1lVXM7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICAgICAgcXVldWVkRnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICBxdWV1ZWRCdWZmZXJzLmNsZWFyKCk7CisKKyAgICAgICAgaXRlbXMuY2xlYXIoKTsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPm9uV29ya1F1ZXVlZCgKKyAgICAgICAgICAgICAgICBxdWV1ZWRGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShxdWV1ZWRCdWZmZXJzKSwKKyAgICAgICAgICAgICAgICBQaXBlbGluZVdhdGNoZXI6OkNsb2NrOjpub3coKSk7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5vbldvcmtEb25lKHF1ZXVlZEZyYW1lSW5kZXgpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgICAgICBib29sIHJlbGVhc2VkID0gKCpidWZmZXJzKS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIsIG51bGxwdHIsIHRydWUpOworICAgICAgICBBTE9HVigiWyVzXSBxdWV1ZUlucHV0QnVmZmVyOiBidWZmZXIgJXNyZWxlYXNlZCIsIG1OYW1lLCByZWxlYXNlZCA/ICIiIDogIm5vdCAiKTsKKyAgICB9CisKKyAgICBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZUludGVybmFsKCk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c2V0UGFyYW1ldGVycyhzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZwYXJhbXMpIHsKKyAgICBRdWV1ZUd1YXJkIGd1YXJkKG1TeW5jKTsKKyAgICBpZiAoIWd1YXJkLmlzUnVubmluZygpKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIHNldFBhcmFtZXRlcnMgaXMgb25seSBzdXBwb3J0ZWQgaW4gdGhlIHJ1bm5pbmcgc3RhdGUuIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICB9CisgICAgbVBhcmFtc1RvQmVTZXQuaW5zZXJ0KG1QYXJhbXNUb0JlU2V0LmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihwYXJhbXMuYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKHBhcmFtcy5lbmQoKSkpOworICAgIHBhcmFtcy5jbGVhcigpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cXVldWVJbnB1dEJ1ZmZlcihjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgUXVldWVHdWFyZCBndWFyZChtU3luYyk7CisgICAgaWYgKCFndWFyZC5pc1J1bm5pbmcoKSkgeworICAgICAgICBBTE9HRCgiWyVzXSBObyBtb3JlIGJ1ZmZlcnMgc2hvdWxkIGJlIHF1ZXVlZCBhdCBjdXJyZW50IHN0YXRlLiIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisgICAgfQorICAgIHJldHVybiBxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoYnVmZmVyKTsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cXVldWVTZWN1cmVJbnB1dEJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgYm9vbCBzZWN1cmUsIGNvbnN0IHVpbnQ4X3QgKmtleSwKKyAgICAgICAgY29uc3QgdWludDhfdCAqaXYsIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLCBDcnlwdG9QbHVnaW46OlBhdHRlcm4gcGF0dGVybiwKKyAgICAgICAgY29uc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgKnN1YlNhbXBsZXMsIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICBBU3RyaW5nICplcnJvckRldGFpbE1zZykgeworICAgIFF1ZXVlR3VhcmQgZ3VhcmQobVN5bmMpOworICAgIGlmICghZ3VhcmQuaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgQUxPR0QoIlslc10gTm8gbW9yZSBidWZmZXJzIHNob3VsZCBiZSBxdWV1ZWQgYXQgY3VycmVudCBzdGF0ZS4iLCBtTmFtZSk7CisgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgIH0KKworICAgIGlmICghaGFzQ3J5cHRvT3JEZXNjcmFtYmxlcigpKSB7CisgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgIH0KKyAgICBzcDxFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcj4gZW5jcnlwdGVkQnVmZmVyKChFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlciAqKWJ1ZmZlci5nZXQoKSk7CisKKyAgICBzc2l6ZV90IHJlc3VsdCA9IC0xOworICAgIHNzaXplX3QgY29kZWNEYXRhT2Zmc2V0ID0gMDsKKyAgICBpZiAobUNyeXB0byAhPSBudWxscHRyKSB7CisgICAgICAgIElDcnlwdG86OkRlc3RpbmF0aW9uQnVmZmVyIGRlc3RpbmF0aW9uOworICAgICAgICBpZiAoc2VjdXJlKSB7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tVHlwZSA9IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGU7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tSGFuZGxlID0gZW5jcnlwdGVkQnVmZmVyLT5oYW5kbGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLm1UeXBlID0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZVNoYXJlZE1lbW9yeTsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLm1TaGFyZWRNZW1vcnkgPSBtRGVjcnlwdERlc3RpbmF0aW9uOworICAgICAgICB9CisgICAgICAgIElDcnlwdG86OlNvdXJjZUJ1ZmZlciBzb3VyY2U7CisgICAgICAgIGVuY3J5cHRlZEJ1ZmZlci0+ZmlsbFNvdXJjZUJ1ZmZlcigmc291cmNlKTsKKyAgICAgICAgcmVzdWx0ID0gbUNyeXB0by0+ZGVjcnlwdCgKKyAgICAgICAgICAgICAgICBrZXksIGl2LCBtb2RlLCBwYXR0ZXJuLCBzb3VyY2UsIGJ1ZmZlci0+b2Zmc2V0KCksCisgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywgbnVtU3ViU2FtcGxlcywgZGVzdGluYXRpb24sIGVycm9yRGV0YWlsTXNnKTsKKyAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc3RpbmF0aW9uLm1UeXBlID09IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVTaGFyZWRNZW1vcnkpIHsKKyAgICAgICAgICAgIGVuY3J5cHRlZEJ1ZmZlci0+Y29weURlY3J5cHRlZENvbnRlbnQobURlY3J5cHREZXN0aW5hdGlvbiwgcmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEhlcmUgd2UgY2FzdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSB0byBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OlN1YlNhbXBsZQorICAgICAgICAvLyBkaXJlY3RseSwgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBzaG91bGQgbWF0Y2ggYXMgY2hlY2tlZCBpbiBEZXNjcmFtYmxlckltcGwuY3BwLgorICAgICAgICBoaWRsX3ZlYzxTdWJTYW1wbGU+IGhpZGxTdWJTYW1wbGVzOworICAgICAgICBoaWRsU3ViU2FtcGxlcy5zZXRUb0V4dGVybmFsKChTdWJTYW1wbGUgKilzdWJTYW1wbGVzLCBudW1TdWJTYW1wbGVzLCBmYWxzZSAvKm93biovKTsKKworICAgICAgICBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OlNoYXJlZEJ1ZmZlciBzcmNCdWZmZXI7CisgICAgICAgIGVuY3J5cHRlZEJ1ZmZlci0+ZmlsbFNvdXJjZUJ1ZmZlcigmc3JjQnVmZmVyKTsKKworICAgICAgICBEZXN0aW5hdGlvbkJ1ZmZlciBkc3RCdWZmZXI7CisgICAgICAgIGlmIChzZWN1cmUpIHsKKyAgICAgICAgICAgIGRzdEJ1ZmZlci50eXBlID0gQnVmZmVyVHlwZTo6TkFUSVZFX0hBTkRMRTsKKyAgICAgICAgICAgIGRzdEJ1ZmZlci5zZWN1cmVNZW1vcnkgPSBoaWRsX2hhbmRsZShlbmNyeXB0ZWRCdWZmZXItPmhhbmRsZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRzdEJ1ZmZlci50eXBlID0gQnVmZmVyVHlwZTo6U0hBUkVEX01FTU9SWTsKKyAgICAgICAgICAgIGRzdEJ1ZmZlci5ub25zZWN1cmVNZW1vcnkgPSBzcmNCdWZmZXI7CisgICAgICAgIH0KKworICAgICAgICBDYXNTdGF0dXMgc3RhdHVzID0gQ2FzU3RhdHVzOjpPSzsKKyAgICAgICAgaGlkbF9zdHJpbmcgZGV0YWlsZWRFcnJvcjsKKyAgICAgICAgU2NyYW1ibGluZ0NvbnRyb2wgc2N0cmwgPSBTY3JhbWJsaW5nQ29udHJvbDo6VU5TQ1JBTUJMRUQ7CisKKyAgICAgICAgaWYgKGtleSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzY3RybCA9IChTY3JhbWJsaW5nQ29udHJvbClrZXlbMF07CisgICAgICAgICAgICAvLyBBZGp1c3QgZm9yIHRoZSBQRVMgb2Zmc2V0CisgICAgICAgICAgICBjb2RlY0RhdGFPZmZzZXQgPSBrZXlbMl0gfCAoa2V5WzNdIDw8IDgpOworICAgICAgICB9CisKKyAgICAgICAgYXV0byByZXR1cm5Wb2lkID0gbURlc2NyYW1ibGVyLT5kZXNjcmFtYmxlKAorICAgICAgICAgICAgICAgIHNjdHJsLAorICAgICAgICAgICAgICAgIGhpZGxTdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgIHNyY0J1ZmZlciwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmcmVzdWx0LCAmZGV0YWlsZWRFcnJvcl0gKAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FzU3RhdHVzIF9zdGF0dXMsIHVpbnQzMl90IF9ieXRlc1dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgX2RldGFpbGVkRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gX3N0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHNzaXplX3QpX2J5dGVzV3JpdHRlbjsKKyAgICAgICAgICAgICAgICAgICAgZGV0YWlsZWRFcnJvciA9IF9kZXRhaWxlZEVycm9yOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIGlmICghcmV0dXJuVm9pZC5pc09rKCkgfHwgc3RhdHVzICE9IENhc1N0YXR1czo6T0sgfHwgcmVzdWx0IDwgMCkgeworICAgICAgICAgICAgQUxPR0koIlslc10gZGVzY3JhbWJsZSBmYWlsZWQsIHRyYW5zPSVzLCBzdGF0dXM9JWQsIHJlc3VsdD0lemQiLAorICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcmV0dXJuVm9pZC5kZXNjcmlwdGlvbigpLmNfc3RyKCksIHN0YXR1cywgcmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdCA8IGNvZGVjRGF0YU9mZnNldCkgeworICAgICAgICAgICAgQUxPR0QoImludmFsaWQgY29kZWMgZGF0YSBvZmZzZXQ6ICV6ZCwgcmVzdWx0ICV6ZCIsIGNvZGVjRGF0YU9mZnNldCwgcmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiWyVzXSBkZXNjcmFtYmxlIHN1Y2NlZWRlZCwgJXpkIGJ5dGVzIiwgbU5hbWUsIHJlc3VsdCk7CisKKyAgICAgICAgaWYgKGRzdEJ1ZmZlci50eXBlID09IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlkpIHsKKyAgICAgICAgICAgIGVuY3J5cHRlZEJ1ZmZlci0+Y29weURlY3J5cHRlZENvbnRlbnRGcm9tTWVtb3J5KHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBidWZmZXItPnNldFJhbmdlKGNvZGVjRGF0YU9mZnNldCwgcmVzdWx0IC0gY29kZWNEYXRhT2Zmc2V0KTsKKyAgICByZXR1cm4gcXVldWVJbnB1dEJ1ZmZlckludGVybmFsKGJ1ZmZlcik7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6ZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKSB7CisgICAgUXVldWVHdWFyZCBndWFyZChtU3luYyk7CisgICAgaWYgKCFndWFyZC5pc1J1bm5pbmcoKSkgeworICAgICAgICBBTE9HVigiWyVzXSBXZSdyZSBub3QgcnVubmluZyAtLS0gbm8gaW5wdXQgYnVmZmVyIHJlcG9ydGVkIiwgbU5hbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlSW50ZXJuYWwoKTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZUludGVybmFsKCkgeworICAgIGlmIChtSW5wdXRNZXRFb3MgfHwKKyAgICAgICAgICAgbVJlb3JkZXJTdGFzaC5sb2NrKCktPmhhc1BlbmRpbmcoKSB8fAorICAgICAgICAgICBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+cGlwZWxpbmVGdWxsKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobU91dHB1dEJ1ZmZlcnMpOworICAgICAgICBpZiAoKCpidWZmZXJzKS0+bnVtQ2xpZW50QnVmZmVycygpID49IG1OdW1PdXRwdXRTbG90cykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bUlucHV0U2xvdHM7ICsraSkgeworICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBpbkJ1ZmZlcjsKKyAgICAgICAgc2l6ZV90IGluZGV4OworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobUlucHV0QnVmZmVycyk7CisgICAgICAgICAgICBpZiAoKCpidWZmZXJzKS0+bnVtQ2xpZW50QnVmZmVycygpID49IG1OdW1JbnB1dFNsb3RzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEoKmJ1ZmZlcnMpLT5yZXF1ZXN0TmV3QnVmZmVyKCZpbmRleCwgJmluQnVmZmVyKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG5vIG5ldyBidWZmZXIgYXZhaWxhYmxlIiwgbU5hbWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJbJXNdIG5ldyBpbnB1dCBpbmRleCA9ICV6dSBbJXBdIiwgbU5hbWUsIGluZGV4LCBpbkJ1ZmZlci5nZXQoKSk7CisgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dEJ1ZmZlckF2YWlsYWJsZShpbmRleCwgaW5CdWZmZXIpOworICAgIH0KK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cmVuZGVyT3V0cHV0QnVmZmVyKAorICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBpbnQ2NF90IHRpbWVzdGFtcE5zKSB7CisgICAgQUxPR1YoIlslc10gcmVuZGVyT3V0cHV0QnVmZmVyOiAlcCIsIG1OYW1lLCBidWZmZXIuZ2V0KCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJCdWZmZXI7CisgICAgYm9vbCByZWxlYXNlZCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtT3V0cHV0QnVmZmVycyk7CisgICAgICAgIGlmICgqYnVmZmVycykgeworICAgICAgICAgICAgcmVsZWFzZWQgPSAoKmJ1ZmZlcnMpLT5yZWxlYXNlQnVmZmVyKGJ1ZmZlciwgJmMyQnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBOT1RFOiBzb21lIGFwcHMgdHJ5IHRvIHJlbGVhc2VPdXRwdXRCdWZmZXIoKSB3aXRoIHRpbWVzdGFtcCBhbmQvb3IgcmVuZGVyCisgICAgLy8gICAgICAgc2V0IHRvIHRydWUuCisgICAgc2VuZE91dHB1dEJ1ZmZlcnMoKTsKKyAgICAvLyBpbnB1dCBidWZmZXIgZmVlZGluZyBtYXkgaGF2ZSBiZWVuIGdhdGVkIGJ5IHBlbmRpbmcgb3V0cHV0IGJ1ZmZlcnMKKyAgICBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSgpOworICAgIGlmICghYzJCdWZmZXIpIHsKKyAgICAgICAgaWYgKHJlbGVhc2VkKSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBUaGUgYXBwIGlzIGNhbGxpbmcgcmVsZWFzZU91dHB1dEJ1ZmZlcigpIHdpdGggIgorICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCBvciByZW5kZXI9dHJ1ZSB3aXRoIG5vbi12aWRlbyBidWZmZXJzLiBBcHBzIHNob3VsZCAiCisgICAgICAgICAgICAgICAgICAiY2FsbCByZWxlYXNlT3V0cHV0QnVmZmVyKCkgd2l0aCByZW5kZXI9ZmFsc2UgZm9yIHRob3NlLiIsCisgICAgICAgICAgICAgICAgICBtTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworI2lmIDAKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPj4gaW5mb1BhcmFtcyA9IGMyQnVmZmVyLT5pbmZvKCk7CisgICAgQUxPR1YoIlslc10gcXVldWluZyBnZnggYnVmZmVyIHdpdGggJXp1IGluZm9zIiwgbU5hbWUsIGluZm9QYXJhbXMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+ICZpbmZvIDogaW5mb1BhcmFtcykgeworICAgICAgICBBU3RyaW5nIHJlczsKKyAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCArIDMgPCBpbmZvLT5zaXplKCk7IGl4ICs9IDQpIHsKKyAgICAgICAgICAgIGlmIChpeCkgcmVzLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIHJlcy5hcHBlbmQoKigoaW50MzJfdCopaW5mby5nZXQoKSArIChpeCAvIDQpKSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiAgWyVzXSIsIHJlcy5jX3N0cigpKTsKKyAgICB9CisjZW5kaWYKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJTdHJlYW1Sb3RhdGlvbkluZm86Om91dHB1dD4gcm90YXRpb24gPQorICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJTdHJlYW1Sb3RhdGlvbkluZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgYzJCdWZmZXItPmdldEluZm8oQzJTdHJlYW1Sb3RhdGlvbkluZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpOworICAgIGJvb2wgZmxpcCA9IHJvdGF0aW9uICYmIChyb3RhdGlvbi0+ZmxpcCAmIDEpOworICAgIHVpbnQzMl90IHF1YXJ0ZXJzID0gKChyb3RhdGlvbiA/IHJvdGF0aW9uLT52YWx1ZSA6IDApIC8gOTApICYgMzsKKyAgICB1aW50MzJfdCB0cmFuc2Zvcm0gPSAwOworICAgIHN3aXRjaCAocXVhcnRlcnMpIHsKKyAgICAgICAgY2FzZSAwOiAvLyBubyByb3RhdGlvbgorICAgICAgICAgICAgdHJhbnNmb3JtID0gZmxpcCA/IEhBTF9UUkFOU0ZPUk1fRkxJUF9IIDogMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6IC8vIDkwIGRlZ3JlZXMgY291bnRlci1jbG9ja3dpc2UKKyAgICAgICAgICAgIHRyYW5zZm9ybSA9IGZsaXAgPyAoSEFMX1RSQU5TRk9STV9GTElQX1YgfCBIQUxfVFJBTlNGT1JNX1JPVF85MCkKKyAgICAgICAgICAgICAgICAgICAgOiBIQUxfVFJBTlNGT1JNX1JPVF8yNzA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOiAvLyAxODAgZGVncmVlcworICAgICAgICAgICAgdHJhbnNmb3JtID0gZmxpcCA/IEhBTF9UUkFOU0ZPUk1fRkxJUF9WIDogSEFMX1RSQU5TRk9STV9ST1RfMTgwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzogLy8gOTAgZGVncmVlcyBjbG9ja3dpc2UKKyAgICAgICAgICAgIHRyYW5zZm9ybSA9IGZsaXAgPyAoSEFMX1RSQU5TRk9STV9GTElQX0ggfCBIQUxfVFJBTlNGT1JNX1JPVF85MCkKKyAgICAgICAgICAgICAgICAgICAgOiBIQUxfVFJBTlNGT1JNX1JPVF85MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzo6b3V0cHV0PiBzdXJmYWNlU2NhbGluZyA9CisgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxjb25zdCBDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICBjMkJ1ZmZlci0+Z2V0SW5mbyhDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSk7CisgICAgdWludDMyX3QgdmlkZW9TY2FsaW5nTW9kZSA9IE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVzsKKyAgICBpZiAoc3VyZmFjZVNjYWxpbmcpIHsKKyAgICAgICAgdmlkZW9TY2FsaW5nTW9kZSA9IHN1cmZhY2VTY2FsaW5nLT52YWx1ZTsKKyAgICB9CisKKyAgICAvLyBVc2UgZGF0YXNwYWNlIGZyb20gZm9ybWF0IGFzIGl0IGhhcyB0aGUgZGVmYXVsdCBhc3BlY3RzIGFscmVhZHkgYXBwbGllZAorICAgIGFuZHJvaWRfZGF0YXNwYWNlX3QgZGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOOyAvLyB0aGlzIGlzIDAKKyAgICAodm9pZClidWZmZXItPmZvcm1hdCgpLT5maW5kSW50MzIoImFuZHJvaWQuX2RhdGFzcGFjZSIsIChpbnQzMl90ICopJmRhdGFTcGFjZSk7CisKKyAgICAvLyBIRFIgc3RhdGljIGluZm8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ+IGhkclN0YXRpY0luZm8gPQorICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgIGMyQnVmZmVyLT5nZXRJbmZvKEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSk7CisKKyAgICAvLyBIRFIxMCBwbHVzIGluZm8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ+IGhkcjEwUGx1c0luZm8gPQorICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgIGMyQnVmZmVyLT5nZXRJbmZvKEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSk7CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8T3V0cHV0U3VyZmFjZT46OkxvY2tlZCBvdXRwdXQobU91dHB1dFN1cmZhY2UpOworICAgICAgICBpZiAob3V0cHV0LT5zdXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIGNhbm5vdCByZW5kZXIgYnVmZmVyIHdpdGhvdXQgc3VyZmFjZSIsIG1OYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+IGJsb2NrcyA9IGMyQnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpOworICAgIGlmIChibG9ja3Muc2l6ZSgpICE9IDF1KSB7CisgICAgICAgIEFMT0dEKCJbJXNdIGV4cGVjdGVkIDEgZ3JhcGhpYyBibG9jaywgYnV0IGdvdCAlenUiLCBtTmFtZSwgYmxvY2tzLnNpemUoKSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrICZibG9jayA9IGJsb2Nrcy5mcm9udCgpOworCisgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIGFmdGVyIEMyRmVuY2UgaW1wbGVtZW50YXRpb24uCisgICAgYW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBxYmkoCisgICAgICAgICAgICB0aW1lc3RhbXBOcywKKyAgICAgICAgICAgIGZhbHNlLCAvLyBkcm9wcGFibGUKKyAgICAgICAgICAgIGRhdGFTcGFjZSwKKyAgICAgICAgICAgIFJlY3QoYmxvY2tzLmZyb250KCkuY3JvcCgpLmxlZnQsCisgICAgICAgICAgICAgICAgIGJsb2Nrcy5mcm9udCgpLmNyb3AoKS50b3AsCisgICAgICAgICAgICAgICAgIGJsb2Nrcy5mcm9udCgpLmNyb3AoKS5yaWdodCgpLAorICAgICAgICAgICAgICAgICBibG9ja3MuZnJvbnQoKS5jcm9wKCkuYm90dG9tKCkpLAorICAgICAgICAgICAgdmlkZW9TY2FsaW5nTW9kZSwKKyAgICAgICAgICAgIHRyYW5zZm9ybSwKKyAgICAgICAgICAgIEZlbmNlOjpOT19GRU5DRSwgMCk7CisgICAgaWYgKGhkclN0YXRpY0luZm8gfHwgaGRyMTBQbHVzSW5mbykgeworICAgICAgICBIZHJNZXRhZGF0YSBoZHI7CisgICAgICAgIGlmIChoZHJTdGF0aWNJbmZvKSB7CisgICAgICAgICAgICBzdHJ1Y3QgYW5kcm9pZF9zbXB0ZTIwODZfbWV0YWRhdGEgc21wdGUyMDg2X21ldGEgPSB7CisgICAgICAgICAgICAgICAgLmRpc3BsYXlQcmltYXJ5UmVkID0geworICAgICAgICAgICAgICAgICAgICBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcucmVkLngsIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5yZWQueQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgLmRpc3BsYXlQcmltYXJ5R3JlZW4gPSB7CisgICAgICAgICAgICAgICAgICAgIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5ncmVlbi54LCBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcuZ3JlZW4ueQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgLmRpc3BsYXlQcmltYXJ5Qmx1ZSA9IHsKKyAgICAgICAgICAgICAgICAgICAgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLmJsdWUueCwgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLmJsdWUueQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgLndoaXRlUG9pbnQgPSB7CisgICAgICAgICAgICAgICAgICAgIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy53aGl0ZS54LCBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcud2hpdGUueQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgLm1heEx1bWluYW5jZSA9IGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5tYXhMdW1pbmFuY2UsCisgICAgICAgICAgICAgICAgLm1pbkx1bWluYW5jZSA9IGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5taW5MdW1pbmFuY2UsCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzdHJ1Y3QgYW5kcm9pZF9jdGE4NjFfM19tZXRhZGF0YSBjdGE4NjFfbWV0YSA9IHsKKyAgICAgICAgICAgICAgICAubWF4Q29udGVudExpZ2h0TGV2ZWwgPSBoZHJTdGF0aWNJbmZvLT5tYXhDbGwsCisgICAgICAgICAgICAgICAgLm1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwgPSBoZHJTdGF0aWNJbmZvLT5tYXhGYWxsLAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgaGRyLnZhbGlkVHlwZXMgPSBIZHJNZXRhZGF0YTo6U01QVEUyMDg2IHwgSGRyTWV0YWRhdGE6OkNUQTg2MV8zOworICAgICAgICAgICAgaGRyLnNtcHRlMjA4NiA9IHNtcHRlMjA4Nl9tZXRhOworICAgICAgICAgICAgaGRyLmN0YTg2MTMgPSBjdGE4NjFfbWV0YTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGRyMTBQbHVzSW5mbykgeworICAgICAgICAgICAgaGRyLnZhbGlkVHlwZXMgfD0gSGRyTWV0YWRhdGE6OkhEUjEwUExVUzsKKyAgICAgICAgICAgIGhkci5oZHIxMHBsdXMuYXNzaWduKAorICAgICAgICAgICAgICAgICAgICBoZHIxMFBsdXNJbmZvLT5tLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICBoZHIxMFBsdXNJbmZvLT5tLnZhbHVlICsgaGRyMTBQbHVzSW5mby0+ZmxleENvdW50KCkpOworICAgICAgICB9CisgICAgICAgIHFiaS5zZXRIZHJNZXRhZGF0YShoZHIpOworICAgIH0KKyAgICAvLyB3ZSBkb24ndCBoYXZlIGRpcnR5IHJlZ2lvbnMKKyAgICBxYmkuc2V0U3VyZmFjZURhbWFnZShSZWdpb246OklOVkFMSURfUkVHSU9OKTsKKyAgICBhbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBxYm87CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbUNvbXBvbmVudC0+cXVldWVUb091dHB1dFN1cmZhY2UoYmxvY2ssIHFiaSwgJnFibyk7CisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBBTE9HSSgiWyVzXSBxdWV1ZUJ1ZmZlciBmYWlsZWQ6ICVkIiwgbU5hbWUsIHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIEFMT0dWKCJbJXNdIHF1ZXVlIGJ1ZmZlciBzdWNjZXNzZnVsIiwgbU5hbWUpOworCisgICAgaW50NjRfdCBtZWRpYVRpbWVVcyA9IDA7CisgICAgKHZvaWQpYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKTsKKyAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uT3V0cHV0RnJhbWVzUmVuZGVyZWQobWVkaWFUaW1lVXMsIHRpbWVzdGFtcE5zKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6ZGlzY2FyZEJ1ZmZlcihjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgQUxPR1YoIlslc10gZGlzY2FyZEJ1ZmZlcjogJXAiLCBtTmFtZSwgYnVmZmVyLmdldCgpKTsKKyAgICBib29sIHJlbGVhc2VkID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobUlucHV0QnVmZmVycyk7CisgICAgICAgIGlmICgqYnVmZmVycyAmJiAoKmJ1ZmZlcnMpLT5yZWxlYXNlQnVmZmVyKGJ1ZmZlciwgbnVsbHB0ciwgdHJ1ZSkpIHsKKyAgICAgICAgICAgIHJlbGVhc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobU91dHB1dEJ1ZmZlcnMpOworICAgICAgICBpZiAoKmJ1ZmZlcnMgJiYgKCpidWZmZXJzKS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIsIG51bGxwdHIpKSB7CisgICAgICAgICAgICByZWxlYXNlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJlbGVhc2VkKSB7CisgICAgICAgIHNlbmRPdXRwdXRCdWZmZXJzKCk7CisgICAgICAgIGZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoIlslc10gTWVkaWFDb2RlYyBkaXNjYXJkZWQgYW4gdW5rbm93biBidWZmZXIiLCBtTmFtZSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpnZXRJbnB1dEJ1ZmZlckFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSB7CisgICAgYXJyYXktPmNsZWFyKCk7CisgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworCisgICAgaWYgKCEoKmJ1ZmZlcnMpLT5pc0FycmF5TW9kZSgpKSB7CisgICAgICAgICpidWZmZXJzID0gKCpidWZmZXJzKS0+dG9BcnJheU1vZGUobU51bUlucHV0U2xvdHMpOworICAgIH0KKworICAgICgqYnVmZmVycyktPmdldEFycmF5KGFycmF5KTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpnZXRPdXRwdXRCdWZmZXJBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgeworICAgIGFycmF5LT5jbGVhcigpOworICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobU91dHB1dEJ1ZmZlcnMpOworCisgICAgaWYgKCEoKmJ1ZmZlcnMpLT5pc0FycmF5TW9kZSgpKSB7CisgICAgICAgICpidWZmZXJzID0gKCpidWZmZXJzKS0+dG9BcnJheU1vZGUobU51bU91dHB1dFNsb3RzKTsKKyAgICB9CisKKyAgICAoKmJ1ZmZlcnMpLT5nZXRBcnJheShhcnJheSk7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnN0YXJ0KAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmlucHV0Rm9ybWF0LCBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCkgeworICAgIEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0IGlTdHJlYW1Gb3JtYXQoMHUpOworICAgIEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCBvU3RyZWFtRm9ybWF0KDB1KTsKKyAgICBDMlBvcnRSZW9yZGVyQnVmZmVyRGVwdGhUdW5pbmc6Om91dHB1dCByZW9yZGVyRGVwdGg7CisgICAgQzJQb3J0UmVvcmRlcktleVNldHRpbmc6Om91dHB1dCByZW9yZGVyS2V5OworICAgIEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dCBpbnB1dERlbGF5KDApOworICAgIEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQgb3V0cHV0RGVsYXkoMCk7CisgICAgQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nIHBpcGVsaW5lRGVsYXkoMCk7CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSgKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAmaVN0cmVhbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAmb1N0cmVhbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAmcmVvcmRlckRlcHRoLAorICAgICAgICAgICAgICAgICZyZW9yZGVyS2V5LAorICAgICAgICAgICAgICAgICZpbnB1dERlbGF5LAorICAgICAgICAgICAgICAgICZwaXBlbGluZURlbGF5LAorICAgICAgICAgICAgICAgICZvdXRwdXREZWxheSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7fSwKKyAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICBudWxscHRyKTsKKyAgICBpZiAoZXJyID09IEMyX0JBRF9JTkRFWCkgeworICAgICAgICBpZiAoIWlTdHJlYW1Gb3JtYXQgfHwgIW9TdHJlYW1Gb3JtYXQpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleGVkPFJlb3JkZXJTdGFzaD46OkxvY2tlZCByZW9yZGVyKG1SZW9yZGVyU3Rhc2gpOworICAgICAgICByZW9yZGVyLT5jbGVhcigpOworICAgICAgICBpZiAocmVvcmRlckRlcHRoKSB7CisgICAgICAgICAgICByZW9yZGVyLT5zZXREZXB0aChyZW9yZGVyRGVwdGgudmFsdWUpOworICAgICAgICB9CisgICAgICAgIGlmIChyZW9yZGVyS2V5KSB7CisgICAgICAgICAgICByZW9yZGVyLT5zZXRLZXkocmVvcmRlcktleS52YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1aW50MzJfdCBpbnB1dERlbGF5VmFsdWUgPSBpbnB1dERlbGF5ID8gaW5wdXREZWxheS52YWx1ZSA6IDA7CisgICAgdWludDMyX3QgcGlwZWxpbmVEZWxheVZhbHVlID0gcGlwZWxpbmVEZWxheSA/IHBpcGVsaW5lRGVsYXkudmFsdWUgOiAwOworICAgIHVpbnQzMl90IG91dHB1dERlbGF5VmFsdWUgPSBvdXRwdXREZWxheSA/IG91dHB1dERlbGF5LnZhbHVlIDogMDsKKworICAgIG1OdW1JbnB1dFNsb3RzID0gaW5wdXREZWxheVZhbHVlICsgcGlwZWxpbmVEZWxheVZhbHVlICsga1Ntb290aG5lc3NGYWN0b3I7CisgICAgbU51bU91dHB1dFNsb3RzID0gb3V0cHV0RGVsYXlWYWx1ZSArIGtTbW9vdGhuZXNzRmFjdG9yOworICAgIG1EZWxheSA9IGlucHV0RGVsYXlWYWx1ZSArIHBpcGVsaW5lRGVsYXlWYWx1ZSArIG91dHB1dERlbGF5VmFsdWU7CisKKyAgICAvLyBUT0RPOiBnZXQgdGhpcyBmcm9tIGlucHV0IGZvcm1hdAorICAgIGJvb2wgc2VjdXJlID0gbUNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoIi5zZWN1cmUiKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBhbGxvY2F0b3JTdG9yZSA9IEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICBpbnQgcG9vbE1hc2sgPSBwcm9wZXJ0eV9nZXRfaW50MzIoCisgICAgICAgICAgICAiZGVidWcuc3RhZ2VmcmlnaHQuYzItcG9vbG1hc2siLAorICAgICAgICAgICAgMSA8PCBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTiB8CisgICAgICAgICAgICAxIDw8IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUpOworCisgICAgaWYgKGlucHV0Rm9ybWF0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgYm9vbCBncmFwaGljID0gKGlTdHJlYW1Gb3JtYXQudmFsdWUgPT0gQzJCdWZmZXJEYXRhOjpHUkFQSElDKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwb29sOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPEJsb2NrUG9vbHM+OjpMb2NrZWQgcG9vbHMobUJsb2NrUG9vbHMpOworCisgICAgICAgICAgICAvLyBzZXQgZGVmYXVsdCBhbGxvY2F0b3IgSUQuCisgICAgICAgICAgICBwb29scy0+aW5wdXRBbGxvY2F0b3JJZCA9IChncmFwaGljKSA/IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTjsKKworICAgICAgICAgICAgLy8gcXVlcnkgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQgZnJvbSBjb21wb25lbnQuIElmIGFuIGFsbG9jYXRvciBJRCBpcyBvYnRhaW5lZAorICAgICAgICAgICAgLy8gZnJvbSBjb21wb25lbnQsIGNyZWF0ZSB0aGUgaW5wdXQgYmxvY2sgcG9vbCB3aXRoIGdpdmVuIElELiBPdGhlcndpc2UsIHVzZSBkZWZhdWx0IElEcy4KKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgICAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoeyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpOworICAgICAgICAgICAgaWYgKChlcnIgIT0gQzJfT0sgJiYgZXJyICE9IEMyX0JBRF9JTkRFWCkgfHwgcGFyYW1zLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gUXVlcnkgaW5wdXQgYWxsb2NhdG9ycyByZXR1cm5lZCAlenUgcGFyYW1zID0+ICVzICgldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHBhcmFtcy5zaXplKCksIGFzU3RyaW5nKGVyciksIGVycik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBDMl9PSyAmJiBwYXJhbXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dCAqaW5wdXRBbGxvY2F0b3JzID0KKyAgICAgICAgICAgICAgICAgICAgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ6OkZyb20ocGFyYW1zWzBdLmdldCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXRBbGxvY2F0b3JzICYmIGlucHV0QWxsb2NhdG9ycy0+ZmxleENvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yOworICAgICAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgYWxsb2NhdG9yIElEcyBhbmQgcmVzb2x2ZSBkZWZhdWx0IGFsbG9jYXRvcgorICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoaW5wdXRBbGxvY2F0b3JzLT5tLnZhbHVlc1swXSwgJmFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbGxvY2F0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xzLT5pbnB1dEFsbG9jYXRvcklkID0gYWxsb2NhdG9yLT5nZXRJZCgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gY29tcG9uZW50IHJlcXVlc3RlZCBpbnZhbGlkIGlucHV0IGFsbG9jYXRvciBJRCAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBpbnB1dEFsbG9jYXRvcnMtPm0udmFsdWVzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogdXNlIEMyQ29tcG9uZW50IHdyYXBwZXIgdG8gYXNzb2NpYXRlIHRoaXMgcG9vbCB3aXRoIG91cnNlbHZlcworICAgICAgICAgICAgaWYgKChwb29sTWFzayA+PiBwb29scy0+aW5wdXRBbGxvY2F0b3JJZCkgJiAxKSB7CisgICAgICAgICAgICAgICAgZXJyID0gQ3JlYXRlQ29kZWMyQmxvY2tQb29sKHBvb2xzLT5pbnB1dEFsbG9jYXRvcklkLCBudWxscHRyLCAmcG9vbCk7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gQ3JlYXRlZCBpbnB1dCBibG9jayBwb29sIHdpdGggYWxsb2NhdG9ySUQgJXUgPT4gcG9vbElEICVsbHUgLSAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwb29scy0+aW5wdXRBbGxvY2F0b3JJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKHBvb2wgPyBwb29sLT5nZXRMb2NhbElkKCkgOiAxMTEwMDAxMTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoZXJyKSwgZXJyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyID0gQzJfTk9UX0ZPVU5EOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGlucHV0UG9vbElkID0KKyAgICAgICAgICAgICAgICAgICAgZ3JhcGhpYyA/IEMyQmxvY2tQb29sOjpCQVNJQ19HUkFQSElDIDogQzJCbG9ja1Bvb2w6OkJBU0lDX0xJTkVBUjsKKyAgICAgICAgICAgICAgICBlcnIgPSBHZXRDb2RlYzJCbG9ja1Bvb2woaW5wdXRQb29sSWQsIG51bGxwdHIsICZwb29sKTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBVc2luZyBiYXNpYyBpbnB1dCBibG9jayBwb29sIHdpdGggcG9vbElEICVsbHUgPT4gZ290ICVsbHUgLSAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKWlucHV0UG9vbElkLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykocG9vbCA/IHBvb2wtPmdldExvY2FsSWQoKSA6IDExMTAwMDExMSksCisgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb29scy0+aW5wdXRQb29sID0gcG9vbDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgZm9yY2VBcnJheU1vZGUgPSBmYWxzZTsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgICAgICBpZiAoZ3JhcGhpYykgeworICAgICAgICAgICAgaWYgKG1JbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJzLT5yZXNldChuZXcgRHVtbXlJbnB1dEJ1ZmZlcnMobU5hbWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobU1ldGFNb2RlID09IE1PREVfQU5XKSB7CisgICAgICAgICAgICAgICAgYnVmZmVycy0+cmVzZXQobmV3IEdyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVycyhtTmFtZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXJzLT5yZXNldChuZXcgR3JhcGhpY0lucHV0QnVmZmVycyhtTnVtSW5wdXRTbG90cywgbU5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChoYXNDcnlwdG9PckRlc2NyYW1ibGVyKCkpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGNhcGFjaXR5ID0ga0xpbmVhckJ1ZmZlclNpemU7CisgICAgICAgICAgICAgICAgKHZvaWQpaW5wdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfTUFYX0lOUFVUX1NJWkUsICZjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgaWYgKChzaXplX3QpY2FwYWNpdHkgPiBrTWF4TGluZWFyQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiY2xpZW50IHJlcXVlc3RlZCAlZCwgY2FwcGVkIHRvICV6dSIsIGNhcGFjaXR5LCBrTWF4TGluZWFyQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5ID0ga01heExpbmVhckJ1ZmZlclNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtRGVhbGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgbURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24oY2FwYWNpdHksIE1lbW9yeURlYWxlcjo6Z2V0QWxsb2NhdGlvbkFsaWdubWVudCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChtTnVtSW5wdXRTbG90cyArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmNyeXB0ZWRMaW5lYXJJbnB1dEJ1ZmZlcnMiKTsKKyAgICAgICAgICAgICAgICAgICAgbURlY3J5cHREZXN0aW5hdGlvbiA9IG1EZWFsZXItPmFsbG9jYXRlKChzaXplX3QpY2FwYWNpdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobUNyeXB0byAhPSBudWxscHRyICYmIG1IZWFwU2VxTnVtIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBtSGVhcFNlcU51bSA9IG1DcnlwdG8tPnNldEhlYXAobURlYWxlci0+Z2V0TWVtb3J5SGVhcCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtSGVhcFNlcU51bSA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWZmZXJzLT5yZXNldChuZXcgRW5jcnlwdGVkTGluZWFySW5wdXRCdWZmZXJzKAorICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlLCBtRGVhbGVyLCBtQ3J5cHRvLCBtSGVhcFNlcU51bSwgKHNpemVfdCljYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1JbnB1dFNsb3RzLCBtTmFtZSkpOworICAgICAgICAgICAgICAgIGZvcmNlQXJyYXlNb2RlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVycy0+cmVzZXQobmV3IExpbmVhcklucHV0QnVmZmVycyhtTmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICgqYnVmZmVycyktPnNldEZvcm1hdChpbnB1dEZvcm1hdCk7CisKKyAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgKCpidWZmZXJzKS0+c2V0UG9vbChwb29sKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGVycm9yCisgICAgICAgIH0KKworICAgICAgICBpZiAoZm9yY2VBcnJheU1vZGUpIHsKKyAgICAgICAgICAgICpidWZmZXJzID0gKCpidWZmZXJzKS0+dG9BcnJheU1vZGUobU51bUlucHV0U2xvdHMpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG91dHB1dEZvcm1hdCAhPSBudWxscHRyKSB7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG91dHB1dFN1cmZhY2U7CisgICAgICAgIHVpbnQzMl90IG91dHB1dEdlbmVyYXRpb247CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8T3V0cHV0U3VyZmFjZT46OkxvY2tlZCBvdXRwdXQobU91dHB1dFN1cmZhY2UpOworICAgICAgICAgICAgb3V0cHV0LT5tYXhEZXF1ZXVlQnVmZmVycyA9IG1OdW1PdXRwdXRTbG90cyArIHJlb3JkZXJEZXB0aC52YWx1ZSArIGtSZW5kZXJpbmdEZXB0aDsKKyAgICAgICAgICAgIG91dHB1dFN1cmZhY2UgPSBvdXRwdXQtPnN1cmZhY2UgPworICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPnN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSA6IG51bGxwdHI7CisgICAgICAgICAgICBpZiAob3V0cHV0U3VyZmFjZSkgeworICAgICAgICAgICAgICAgIG91dHB1dC0+c3VyZmFjZS0+c2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudChvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dHB1dEdlbmVyYXRpb24gPSBvdXRwdXQtPmdlbmVyYXRpb247CisgICAgICAgIH0KKworICAgICAgICBib29sIGdyYXBoaWMgPSAob1N0cmVhbUZvcm1hdC52YWx1ZSA9PSBDMkJ1ZmZlckRhdGE6OkdSQVBISUMpOworICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBvdXRwdXRQb29sSWRfOworCisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8QmxvY2tQb29scz46OkxvY2tlZCBwb29scyhtQmxvY2tQb29scyk7CisKKyAgICAgICAgICAgIC8vIHNldCBkZWZhdWx0IGFsbG9jYXRvciBJRC4KKyAgICAgICAgICAgIHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCA9IChncmFwaGljKSA/IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT047CisKKyAgICAgICAgICAgIC8vIHF1ZXJ5IEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dCBmcm9tIGNvbXBvbmVudCwgb3IgdXNlIGRlZmF1bHQgYWxsb2NhdG9yIGlmCisgICAgICAgICAgICAvLyB1bnN1Y2Nlc3NmdWwuCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcyk7CisgICAgICAgICAgICBpZiAoKGVyciAhPSBDMl9PSyAmJiBlcnIgIT0gQzJfQkFEX0lOREVYKSB8fCBwYXJhbXMuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBRdWVyeSBvdXRwdXQgYWxsb2NhdG9ycyByZXR1cm5lZCAlenUgcGFyYW1zID0+ICVzICgldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHBhcmFtcy5zaXplKCksIGFzU3RyaW5nKGVyciksIGVycik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBDMl9PSyAmJiBwYXJhbXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjpvdXRwdXQgKm91dHB1dEFsbG9jYXRvcnMgPQorICAgICAgICAgICAgICAgICAgICBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjpvdXRwdXQ6OkZyb20ocGFyYW1zWzBdLmdldCgpKTsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0QWxsb2NhdG9ycyAmJiBvdXRwdXRBbGxvY2F0b3JzLT5mbGV4Q291bnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3I7CisgICAgICAgICAgICAgICAgICAgIC8vIHZlcmlmeSBhbGxvY2F0b3IgSURzIGFuZCByZXNvbHZlIGRlZmF1bHQgYWxsb2NhdG9yCisgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcihvdXRwdXRBbGxvY2F0b3JzLT5tLnZhbHVlc1swXSwgJmFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbGxvY2F0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCA9IGFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIGNvbXBvbmVudCByZXF1ZXN0ZWQgaW52YWxpZCBvdXRwdXQgYWxsb2NhdG9yIElEICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIG91dHB1dEFsbG9jYXRvcnMtPm0udmFsdWVzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdXNlIGJ1ZmZlcnF1ZXVlIGlmIG91dHB1dHRpbmcgdG8gYSBzdXJmYWNlLgorICAgICAgICAgICAgLy8gcXVlcnkgQzJQb3J0U3VyZmFjZUFsbG9jYXRvclR1bmluZzo6b3V0cHV0IGZyb20gY29tcG9uZW50LCBvciB1c2UgZGVmYXVsdCBhbGxvY2F0b3IKKyAgICAgICAgICAgIC8vIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgICAgICAgICAgIGlmIChvdXRwdXRTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoeyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgQzJQb3J0U3VyZmFjZUFsbG9jYXRvclR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgICAgICAgICBpZiAoKGVyciAhPSBDMl9PSyAmJiBlcnIgIT0gQzJfQkFEX0lOREVYKSB8fCBwYXJhbXMuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gUXVlcnkgb3V0cHV0IHN1cmZhY2UgYWxsb2NhdG9yIHJldHVybmVkICV6dSBwYXJhbXMgPT4gJXMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHBhcmFtcy5zaXplKCksIGFzU3RyaW5nKGVyciksIGVycik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gQzJfT0sgJiYgcGFyYW1zLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIEMyUG9ydFN1cmZhY2VBbGxvY2F0b3JUdW5pbmc6Om91dHB1dCAqc3VyZmFjZUFsbG9jYXRvciA9CisgICAgICAgICAgICAgICAgICAgICAgICBDMlBvcnRTdXJmYWNlQWxsb2NhdG9yVHVuaW5nOjpvdXRwdXQ6OkZyb20ocGFyYW1zWzBdLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1cmZhY2VBbGxvY2F0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGFsbG9jYXRvciBJRHMgYW5kIHJlc29sdmUgZGVmYXVsdCBhbGxvY2F0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcihzdXJmYWNlQWxsb2NhdG9yLT52YWx1ZSwgJmFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb2NhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkID0gYWxsb2NhdG9yLT5nZXRJZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBjb21wb25lbnQgcmVxdWVzdGVkIGludmFsaWQgc3VyZmFjZSBvdXRwdXQgYWxsb2NhdG9yIElEICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBzdXJmYWNlQWxsb2NhdG9yLT52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQgPT0gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBlcnIgIT0gQzJfT0sKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICgocG9vbE1hc2sgPj4gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRSkgJiAxKSkgeworICAgICAgICAgICAgICAgICAgICBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQgPSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChwb29sTWFzayA+PiBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQpICYgMSkgeworICAgICAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCwgJnBvb2xzLT5vdXRwdXRQb29sSWQsICZwb29scy0+b3V0cHV0UG9vbEludGYpOworICAgICAgICAgICAgICAgIEFMT0dJKCJbJXNdIENyZWF0ZWQgb3V0cHV0IGJsb2NrIHBvb2wgd2l0aCBhbGxvY2F0b3JJRCAldSA9PiBwb29sSUQgJWxsdSAtICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBvb2xzLT5vdXRwdXRQb29sSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyID0gQzJfTk9UX0ZPVU5EOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIC8vIHVzZSBiYXNpYyBwb29sIGluc3RlYWQKKyAgICAgICAgICAgICAgICBwb29scy0+b3V0cHV0UG9vbElkID0KKyAgICAgICAgICAgICAgICAgICAgZ3JhcGhpYyA/IEMyQmxvY2tQb29sOjpCQVNJQ19HUkFQSElDIDogQzJCbG9ja1Bvb2w6OkJBU0lDX0xJTkVBUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ29uZmlndXJlIG91dHB1dCBibG9jayBwb29sIElEIGFzIHBhcmFtZXRlciBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQgdG8KKyAgICAgICAgICAgIC8vIGNvbXBvbmVudC4KKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ+IHBvb2xJZHNUdW5pbmcgPQorICAgICAgICAgICAgICAgICAgICBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKHsgcG9vbHMtPm91dHB1dFBvb2xJZCB9KTsKKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+Y29uZmlnKHsgcG9vbElkc1R1bmluZy5nZXQoKSB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBDb25maWd1cmVkIG91dHB1dCBibG9jayBwb29sIGlkcyAlbGx1ID0+ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgbU5hbWUsICh1bnNpZ25lZCBsb25nIGxvbmcpcG9vbElkc1R1bmluZy0+bS52YWx1ZXNbMF0sIGFzU3RyaW5nKGVycikpOworICAgICAgICAgICAgb3V0cHV0UG9vbElkXyA9IHBvb2xzLT5vdXRwdXRQb29sSWQ7CisgICAgICAgIH0KKworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1PdXRwdXRCdWZmZXJzKTsKKworICAgICAgICBpZiAoZ3JhcGhpYykgeworICAgICAgICAgICAgaWYgKG91dHB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJzLT5yZXNldChuZXcgR3JhcGhpY091dHB1dEJ1ZmZlcnMobU5hbWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVycy0+cmVzZXQobmV3IFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzKG1OdW1PdXRwdXRTbG90cywgbU5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZmZlcnMtPnJlc2V0KG5ldyBMaW5lYXJPdXRwdXRCdWZmZXJzKG1OYW1lKSk7CisgICAgICAgIH0KKyAgICAgICAgKCpidWZmZXJzKS0+c2V0Rm9ybWF0KG91dHB1dEZvcm1hdC0+ZHVwKCkpOworCisKKyAgICAgICAgLy8gVHJ5IHRvIHNldCBvdXRwdXQgc3VyZmFjZSB0byBjcmVhdGVkIGJsb2NrIHBvb2wgaWYgZ2l2ZW4uCisgICAgICAgIGlmIChvdXRwdXRTdXJmYWNlKSB7CisgICAgICAgICAgICBtQ29tcG9uZW50LT5zZXRPdXRwdXRTdXJmYWNlKAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRQb29sSWRfLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRHZW5lcmF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvU3RyZWFtRm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6TElORUFSCisgICAgICAgICAgICAgICAgJiYgbUNvbXBvbmVudE5hbWUuZmluZCgiYzIucXRpLiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAvLyBXT1JLQVJPVU5EOiBpZiB3ZSdyZSB1c2luZyBlYXJseSBDU0Qgd29ya2Fyb3VuZCB3ZSBjb252ZXJ0IHRvCisgICAgICAgICAgICAvLyAgICAgICAgICAgICBhcnJheSBtb2RlLCB0byBhcHBlYXNlIGFwcHMgYXNzdW1pbmcgdGhlIG91dHB1dAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgYnVmZmVycyB0byBiZSBvZiB0aGUgc2FtZSBzaXplLgorICAgICAgICAgICAgKCpidWZmZXJzKSA9ICgqYnVmZmVycyktPnRvQXJyYXlNb2RlKG1OdW1PdXRwdXRTbG90cyk7CisKKyAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50OworICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgICAgICAgICAgaWYgKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKEtFWV9DSEFOTkVMX0NPVU5ULCAmY2hhbm5lbENvdW50KQorICAgICAgICAgICAgICAgICAgICAmJiBvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfU0FNUExFX1JBVEUsICZzYW1wbGVSYXRlKSkgeworICAgICAgICAgICAgICAgIGludDMyX3QgZGVsYXkgPSAwOworICAgICAgICAgICAgICAgIGludDMyX3QgcGFkZGluZyA9IDA7OworICAgICAgICAgICAgICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImVuY29kZXItZGVsYXkiLCAmZGVsYXkpKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGF5ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiZW5jb2Rlci1wYWRkaW5nIiwgJnBhZGRpbmcpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhZGRpbmcgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZGVsYXkgfHwgcGFkZGluZykgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHdyaXRlIGFjY2VzcyB0byB0aGUgYnVmZmVycywgYW5kIHdlJ3JlIGFscmVhZHkgaW4KKyAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgKCpidWZmZXJzKS0+aW5pdFNraXBDdXRCdWZmZXIoZGVsYXksIHBhZGRpbmcsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2V0IHVwIHBpcGVsaW5lIGNvbnRyb2wuIFRoaXMgaGFzIHRvIGJlIGRvbmUgYWZ0ZXIgbUlucHV0QnVmZmVycyBhbmQKKyAgICAvLyBtT3V0cHV0QnVmZmVycyBhcmUgaW5pdGlhbGl6ZWQgdG8gbWFrZSBzdXJlIHRoYXQgbGluZ2VyaW5nIGNhbGxiYWNrcworICAgIC8vIGFib3V0IGJ1ZmZlcnMgZnJvbSB0aGUgcHJldmlvdXMgZ2VuZXJhdGlvbiBkbyBub3QgaW50ZXJmZXJlIHdpdGggdGhlCisgICAgLy8gbmV3bHkgaW5pdGlhbGl6ZWQgcGlwZWxpbmUgY2FwYWNpdHkuCisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8UGlwZWxpbmVXYXRjaGVyPjo6TG9ja2VkIHdhdGNoZXIobVBpcGVsaW5lV2F0Y2hlcik7CisgICAgICAgIHdhdGNoZXItPmlucHV0RGVsYXkoaW5wdXREZWxheVZhbHVlKQorICAgICAgICAgICAgICAgIC5waXBlbGluZURlbGF5KHBpcGVsaW5lRGVsYXlWYWx1ZSkKKyAgICAgICAgICAgICAgICAub3V0cHV0RGVsYXkob3V0cHV0RGVsYXlWYWx1ZSkKKyAgICAgICAgICAgICAgICAuc21vb3RobmVzc0ZhY3RvcihrU21vb3RobmVzc0ZhY3Rvcik7CisgICAgICAgIHdhdGNoZXItPmZsdXNoKCk7CisgICAgfQorCisgICAgbUlucHV0TWV0RW9zID0gZmFsc2U7CisgICAgbVN5bmMuc3RhcnQoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnJlcXVlc3RJbml0aWFsSW5wdXRCdWZmZXJzKCkgeworICAgIGlmIChtSW5wdXRTdXJmYWNlKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQgb1N0cmVhbUZvcm1hdCgwdSk7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoeyAmb1N0cmVhbUZvcm1hdCB9LCB7fSwgQzJfRE9OVF9CTE9DSywgbnVsbHB0cik7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+IHRvQmVRdWV1ZWQ7CisgICAgLy8gVE9ETzogdXNlIHByb3BlciBidWZmZXIgZGVwdGggaW5zdGVhZCBvZiB0aGlzIHJhbmRvbSB2YWx1ZQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bUlucHV0U2xvdHM7ICsraSkgeworICAgICAgICBzaXplX3QgaW5kZXg7CisgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgICAgICAgICAgaWYgKCEoKmJ1ZmZlcnMpLT5yZXF1ZXN0TmV3QnVmZmVyKCZpbmRleCwgJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJbJXNdIHN0YXJ0OiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGF0IGFsbCIsIG1OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBzdGFydDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSwgb25seSAlenUgYnVmZmVycyBhbGxvY2F0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3A8QUJ1ZmZlcj4+Pjo6TG9ja2VkIGNvbmZpZ3MobUZsdXNoZWRDb25maWdzKTsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIGlucHV0IGJ1ZmZlciAlenUgYXZhaWxhYmxlIiwgbU5hbWUsIGluZGV4KTsKKyAgICAgICAgICAgIGJvb2wgcG9zdCA9IHRydWU7CisgICAgICAgICAgICBpZiAoIWNvbmZpZ3MtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBjb25maWcgPSBjb25maWdzLT5mcm9udCgpOworICAgICAgICAgICAgICAgIGlmIChidWZmZXItPmNhcGFjaXR5KCkgPj0gY29uZmlnLT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlci0+YmFzZSgpLCBjb25maWctPmRhdGEoKSwgY29uZmlnLT5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIGNvbmZpZy0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgMSk7CisgICAgICAgICAgICAgICAgICAgIHBvc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBidWZmZXIgY2FwYWNpdHkgdG9vIHNtYWxsIGZvciB0aGUgY29uZmlnICglenUgPCAlenUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgYnVmZmVyLT5jYXBhY2l0eSgpLCBjb25maWctPnNpemUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChvU3RyZWFtRm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6TElORUFSICYmIGkgPT0gMAorICAgICAgICAgICAgICAgICAgICAmJiBtQ29tcG9uZW50TmFtZS5maW5kKCJjMi5xdGkuIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgICAgICAvLyBXT1JLQVJPVU5EOiBTb21lIGFwcHMgZXhwZWN0IENTRCBhdmFpbGFibGUgd2l0aG91dCBxdWV1ZWluZworICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGFueSBpbnB1dC4gUXVldWUgYW4gZW1wdHkgYnVmZmVyIHRvIGdldCB0aGUgQ1NELgorICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgICAgICAgICBwb3N0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocG9zdCkgeworICAgICAgICAgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dEJ1ZmZlckF2YWlsYWJsZShpbmRleCwgYnVmZmVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdG9CZVF1ZXVlZC5lbXBsYWNlX2JhY2soYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIgOiB0b0JlUXVldWVkKSB7CisgICAgICAgIGlmIChxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoYnVmZmVyKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR1YoIlslc10gRXJyb3Igd2hpbGUgcXVldWVpbmcgaW5pdGlhbCBidWZmZXJzIiwgbU5hbWUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzdG9wKCkgeworICAgIG1TeW5jLnN0b3AoKTsKKyAgICBtRmlyc3RWYWxpZEZyYW1lSW5kZXggPSBtRnJhbWVJbmRleC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIGlmIChtSW5wdXRTdXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUlucHV0U3VyZmFjZS5yZXNldCgpOworICAgIH0KK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpmbHVzaChjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yaykgeworICAgIEFMT0dWKCJbJXNdIGZsdXNoIiwgbU5hbWUpOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3A8QUJ1ZmZlcj4+Pjo6TG9ja2VkIGNvbmZpZ3MobUZsdXNoZWRDb25maWdzKTsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBpZiAoISh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgfHwgd29yay0+aW5wdXQuYnVmZmVycy5mcm9udCgpLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIG5vIGxpbmVhciBjb2RlYyBjb25maWcgZGF0YSBmb3VuZCIsIG1OYW1lKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEMyUmVhZFZpZXcgdmlldyA9CisgICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZnJvbnQoKS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gZmFpbGVkIHRvIG1hcCBmbHVzaGVkIGNvZGVjIGNvbmZpZyBkYXRhOiAlZCIsIG1OYW1lLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uZmlncy0+cHVzaF9iYWNrKEFCdWZmZXI6OkNyZWF0ZUFzQ29weSh2aWV3LmRhdGEoKSwgdmlldy5jYXBhY2l0eSgpKSk7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBzdGFzaGVkIGZsdXNoZWQgY29kZWMgY29uZmlnIGRhdGEgKHNpemU9JXUpIiwgbU5hbWUsIHZpZXcuY2FwYWNpdHkoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobUlucHV0QnVmZmVycyk7CisgICAgICAgICgqYnVmZmVycyktPmZsdXNoKCk7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtT3V0cHV0QnVmZmVycyk7CisgICAgICAgICgqYnVmZmVycyktPmZsdXNoKGZsdXNoZWRXb3JrKTsKKyAgICB9CisgICAgbVJlb3JkZXJTdGFzaC5sb2NrKCktPmZsdXNoKCk7CisgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPmZsdXNoKCk7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6b25Xb3JrRG9uZSgKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgIGNvbnN0IEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQgKmluaXREYXRhKSB7CisgICAgaWYgKGhhbmRsZVdvcmsoc3RkOjptb3ZlKHdvcmspLCBvdXRwdXRGb3JtYXQsIGluaXREYXRhKSkgeworICAgICAgICBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSgpOworICAgIH0KK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpvbklucHV0QnVmZmVyRG9uZSgKKyAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwgc2l6ZV90IGFycmF5SW5kZXgpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9CisgICAgICAgICAgICBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+b25JbnB1dEJ1ZmZlclJlbGVhc2VkKGZyYW1lSW5kZXgsIGFycmF5SW5kZXgpOworICAgIGJvb2wgbmV3SW5wdXRTbG90QXZhaWxhYmxlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj46OkxvY2tlZCBidWZmZXJzKG1JbnB1dEJ1ZmZlcnMpOworICAgICAgICBuZXdJbnB1dFNsb3RBdmFpbGFibGUgPSAoKmJ1ZmZlcnMpLT5leHBpcmVDb21wb25lbnRCdWZmZXIoYnVmZmVyKTsKKyAgICB9CisgICAgaWYgKG5ld0lucHV0U2xvdEF2YWlsYWJsZSkgeworICAgICAgICBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSgpOworICAgIH0KK30KKworYm9vbCBDQ29kZWNCdWZmZXJDaGFubmVsOjpoYW5kbGVXb3JrKAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKKyAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqaW5pdERhdGEpIHsKKyAgICBpZiAoKHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCAtIG1GaXJzdFZhbGlkRnJhbWVJbmRleC5sb2FkKCkpLnBlZWsoKSA8IDApIHsKKyAgICAgICAgLy8gRGlzY2FyZCBmcmFtZXMgZnJvbSBwcmV2aW91cyBnZW5lcmF0aW9uLgorICAgICAgICBBTE9HRCgiWyVzXSBEaXNjYXJkIGZyYW1lcyBmcm9tIHByZXZpb3VzIGdlbmVyYXRpb24uIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHdvcmstPndvcmtsZXRzLnNpemUoKSAhPSAxdQorICAgICAgICAgICAgfHwgIXdvcmstPndvcmtsZXRzLmZyb250KCkKKyAgICAgICAgICAgIHx8ICEod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSkpIHsKKyAgICAgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPm9uV29ya0RvbmUod29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIH0KKworICAgIGlmICh3b3JrLT5yZXN1bHQgPT0gQzJfTk9UX0ZPVU5EKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIGZsdXNoZWQgd29yazsgaWdub3JlZC4iLCBtTmFtZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmICh3b3JrLT5yZXN1bHQgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoIlslc10gd29yayBmYWlsZWQgdG8gY29tcGxldGU6ICVkIiwgbU5hbWUsIHdvcmstPnJlc3VsdCk7CisgICAgICAgIG1DQ29kZWNDYWxsYmFjay0+b25FcnJvcih3b3JrLT5yZXN1bHQsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE5PVEU6IE1lZGlhQ29kZWMgdXNhZ2Ugc3VwcG9zZWRseSBoYXZlIG9ubHkgb25lIHdvcmtsZXQKKyAgICBpZiAod29yay0+d29ya2xldHMuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgIEFMT0dJKCJbJXNdIG9uV29ya0RvbmU6IGluY29ycmVjdCBudW1iZXIgb2Ygd29ya2xldHM6ICV6dSIsCisgICAgICAgICAgICAgICAgbU5hbWUsIHdvcmstPndvcmtsZXRzLnNpemUoKSk7CisgICAgICAgIG1DQ29kZWNDYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrbGV0PiAmd29ya2xldCA9IHdvcmstPndvcmtsZXRzLmZyb250KCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlcjsKKyAgICAvLyBOT1RFOiBNZWRpYUNvZGVjIHVzYWdlIHN1cHBvc2VkbHkgaGF2ZSBvbmx5IG9uZSBvdXRwdXQgc3RyZWFtLgorICAgIGlmICh3b3JrbGV0LT5vdXRwdXQuYnVmZmVycy5zaXplKCkgPiAxdSkgeworICAgICAgICBBTE9HSSgiWyVzXSBvbldvcmtEb25lOiBpbmNvcnJlY3QgbnVtYmVyIG9mIG91dHB1dCBidWZmZXJzOiAlenUiLAorICAgICAgICAgICAgICAgIG1OYW1lLCB3b3JrbGV0LT5vdXRwdXQuYnVmZmVycy5zaXplKCkpOworICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmICh3b3JrbGV0LT5vdXRwdXQuYnVmZmVycy5zaXplKCkgPT0gMXUpIHsKKyAgICAgICAgYnVmZmVyID0gd29ya2xldC0+b3V0cHV0LmJ1ZmZlcnNbMF07CisgICAgICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBvbldvcmtEb25lOiBudWxscHRyIGZvdW5kIGluIGJ1ZmZlcnM7IGlnbm9yZWQuIiwgbU5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKCF3b3JrbGV0LT5vdXRwdXQuY29uZmlnVXBkYXRlLmVtcHR5KCkpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IHBhcmFtOworICAgICAgICB3b3JrbGV0LT5vdXRwdXQuY29uZmlnVXBkYXRlLmJhY2soKS5zd2FwKHBhcmFtKTsKKyAgICAgICAgd29ya2xldC0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wb3BfYmFjaygpOworICAgICAgICBzd2l0Y2ggKHBhcmFtLT5jb3JlSW5kZXgoKS5jb3JlSW5kZXgoKSkgeworICAgICAgICAgICAgY2FzZSBDMlBvcnRSZW9yZGVyQnVmZmVyRGVwdGhUdW5pbmc6OkNPUkVfSU5ERVg6IHsKKyAgICAgICAgICAgICAgICBDMlBvcnRSZW9yZGVyQnVmZmVyRGVwdGhUdW5pbmc6Om91dHB1dCByZW9yZGVyRGVwdGg7CisgICAgICAgICAgICAgICAgaWYgKHJlb3JkZXJEZXB0aC51cGRhdGVGcm9tKCpwYXJhbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlb3JkZXJTdGFzaC5sb2NrKCktPnNldERlcHRoKHJlb3JkZXJEZXB0aC52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IHVwZGF0ZWQgcmVvcmRlciBkZXB0aCB0byAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCByZW9yZGVyRGVwdGgudmFsdWUpOworICAgICAgICAgICAgICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5tYXhEZXF1ZXVlQnVmZmVycyA9IG1OdW1PdXRwdXRTbG90cyArIHJlb3JkZXJEZXB0aC52YWx1ZSArIGtSZW5kZXJpbmdEZXB0aDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dC0+c3VyZmFjZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5zdXJmYWNlLT5zZXRNYXhEZXF1ZXVlZEJ1ZmZlckNvdW50KG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gb25Xb3JrRG9uZTogZmFpbGVkIHRvIHJlYWQgcmVvcmRlciBkZXB0aCIsIG1OYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEMyUG9ydFJlb3JkZXJLZXlTZXR0aW5nOjpDT1JFX0lOREVYOiB7CisgICAgICAgICAgICAgICAgQzJQb3J0UmVvcmRlcktleVNldHRpbmc6Om91dHB1dCByZW9yZGVyS2V5OworICAgICAgICAgICAgICAgIGlmIChyZW9yZGVyS2V5LnVwZGF0ZUZyb20oKnBhcmFtKSkgeworICAgICAgICAgICAgICAgICAgICBtUmVvcmRlclN0YXNoLmxvY2soKS0+c2V0S2V5KHJlb3JkZXJLZXkudmFsdWUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiB1cGRhdGVkIHJlb3JkZXIga2V5IHRvICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHJlb3JkZXJLZXkudmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIG9uV29ya0RvbmU6IGZhaWxlZCB0byByZWFkIHJlb3JkZXIga2V5IiwgbU5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogdW5yZWNvZ25pemVkIGNvbmZpZyB1cGRhdGUgKCUwOFgpIiwKKyAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcGFyYW0tPmluZGV4KCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG91dHB1dEZvcm1hdCAhPSBudWxscHRyKSB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobU91dHB1dEJ1ZmZlcnMpOworICAgICAgICBBTE9HRCgiWyVzXSBvbldvcmtEb25lOiBvdXRwdXQgZm9ybWF0IGNoYW5nZWQgdG8gJXMiLAorICAgICAgICAgICAgICAgIG1OYW1lLCBvdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICgqYnVmZmVycyktPnNldEZvcm1hdChvdXRwdXRGb3JtYXQpOworCisgICAgICAgIEFTdHJpbmcgbWVkaWFUeXBlOworICAgICAgICBpZiAob3V0cHV0Rm9ybWF0LT5maW5kU3RyaW5nKEtFWV9NSU1FLCAmbWVkaWFUeXBlKQorICAgICAgICAgICAgICAgICYmIG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9BVURJT19SQVcpIHsKKyAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50OworICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgICAgICAgICAgaWYgKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKEtFWV9DSEFOTkVMX0NPVU5ULCAmY2hhbm5lbENvdW50KQorICAgICAgICAgICAgICAgICAgICAmJiBvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfU0FNUExFX1JBVEUsICZzYW1wbGVSYXRlKSkgeworICAgICAgICAgICAgICAgICgqYnVmZmVycyktPnVwZGF0ZVNraXBDdXRCdWZmZXIoc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrbGV0LT5vdXRwdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKKyAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogb3V0cHV0IEVPUyIsIG1OYW1lKTsKKyAgICB9CisKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBvdXRCdWZmZXI7CisgICAgc2l6ZV90IGluZGV4OworCisgICAgLy8gV09SS0FST1VORDogYWRqdXN0IG91dHB1dCB0aW1lc3RhbXAgYmFzZWQgb24gY2xpZW50IGlucHV0IHRpbWVzdGFtcCBhbmQgY29kZWMKKyAgICAvLyBpbnB1dCB0aW1lc3RhbXAuIENvZGVjIG91dHB1dCB0aW1lc3RhbXAgKGluIHRoZSB0aW1lc3RhbXAgZmllbGQpIHNoYWxsIGNvcnJlc3BvbmQgdG8KKyAgICAvLyB0aGUgY29kZWMgaW5wdXQgdGltZXN0YW1wLCBidXQgY2xpZW50IG91dHB1dCB0aW1lc3RhbXAgc2hvdWxkIChyZXBvcnRlZCBpbiB0aW1lVXMpCisgICAgLy8gc2hhbGwgY29ycmVzcG9uZCB0byB0aGUgY2xpZW50IGlucHV0IHRpbWVzYW1wIChpbiBjdXN0b21PcmRpbmFsKS4gQnkgdXNpbmcgdGhlCisgICAgLy8gZGVsdGEgYmV0d2VlbiB0aGUgdHdvLCB0aGlzIGFsbG93cyBmb3Igc29tZSB0aW1lc3RhbXAgZGV2aWF0aW9uIC0gZS5nLiBpZiBvbmUgaW5wdXQKKyAgICAvLyBwcm9kdWNlcyBtdWx0aXBsZSBvdXRwdXQuCisgICAgYzJfY250cjY0X3QgdGltZXN0YW1wID0KKyAgICAgICAgd29ya2xldC0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wICsgd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsCisgICAgICAgICAgICAgICAgLSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcDsKKyAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBpbnB1dCAlbGxkLCBjb2RlYyAlbGxkID0+IG91dHB1dCAlbGxkID0+ICVsbGQiLAorICAgICAgICAgIG1OYW1lLAorICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbC5wZWVrbGwoKSwKKyAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrbGwoKSwKKyAgICAgICAgICB3b3JrbGV0LT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVla2xsKCksCisgICAgICAgICAgdGltZXN0YW1wLnBlZWtsbCgpKTsKKworICAgIGlmIChpbml0RGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+Pjo6TG9ja2VkIGJ1ZmZlcnMobU91dHB1dEJ1ZmZlcnMpOworICAgICAgICBpZiAoKCpidWZmZXJzKS0+cmVnaXN0ZXJDc2QoaW5pdERhdGEsICZpbmRleCwgJm91dEJ1ZmZlcikgPT0gT0spIHsKKyAgICAgICAgICAgIG91dEJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZXN0YW1wLnBlZWsoKSk7CisgICAgICAgICAgICBvdXRCdWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImZsYWdzIiwgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfQ09ERUNDT05GSUcpOworICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogY3NkIGluZGV4ID0gJXp1IFslcF0iLCBtTmFtZSwgaW5kZXgsIG91dEJ1ZmZlci5nZXQoKSk7CisKKyAgICAgICAgICAgIGJ1ZmZlcnMudW5sb2NrKCk7CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uT3V0cHV0QnVmZmVyQXZhaWxhYmxlKGluZGV4LCBvdXRCdWZmZXIpOworICAgICAgICAgICAgYnVmZmVycy5sb2NrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBvbldvcmtEb25lOiB1bmFibGUgdG8gcmVnaXN0ZXIgY3NkIiwgbU5hbWUpOworICAgICAgICAgICAgYnVmZmVycy51bmxvY2soKTsKKyAgICAgICAgICAgIG1DQ29kZWNDYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgICAgICBidWZmZXJzLmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYnVmZmVyICYmICFmbGFncykgeworICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBOb3QgcmVwb3J0aW5nIG91dHB1dCBidWZmZXIgKCVsbGQpIiwKKyAgICAgICAgICAgICAgbU5hbWUsIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdWxsKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gJmluZm8gOiBidWZmZXItPmluZm8oKSkgeworICAgICAgICAgICAgLy8gVE9ETzogcHJvcGVybHkgdHJhbnNsYXRlIHRoZXNlIHRvIG1ldGFkYXRhCisgICAgICAgICAgICBzd2l0Y2ggKGluZm8tPmNvcmVJbmRleCgpLmNvcmVJbmRleCgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm86OkNPUkVfSU5ERVg6CisgICAgICAgICAgICAgICAgICAgIGlmICgoKEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrSW5mbyAqKWluZm8uZ2V0KCkpLT52YWx1ZSAmIEMyQ29uZmlnOjpTWU5DX0ZSQU1FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19TWU5DRlJBTUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8UmVvcmRlclN0YXNoPjo6TG9ja2VkIHJlb3JkZXIobVJlb3JkZXJTdGFzaCk7CisgICAgICAgIHJlb3JkZXItPmVtcGxhY2UoYnVmZmVyLCB0aW1lc3RhbXAucGVlaygpLCBmbGFncywgd29ya2xldC0+b3V0cHV0Lm9yZGluYWwpOworICAgICAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1MpIHsKKyAgICAgICAgICAgIC8vIEZsdXNoIHJlb3JkZXIgc3Rhc2gKKyAgICAgICAgICAgIHJlb3JkZXItPnNldERlcHRoKDApOworICAgICAgICB9CisgICAgfQorICAgIHNlbmRPdXRwdXRCdWZmZXJzKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c2VuZE91dHB1dEJ1ZmZlcnMoKSB7CisgICAgUmVvcmRlclN0YXNoOjpFbnRyeSBlbnRyeTsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBvdXRCdWZmZXI7CisgICAgc2l6ZV90IGluZGV4OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgTXV0ZXhlZDxSZW9yZGVyU3Rhc2g+OjpMb2NrZWQgcmVvcmRlcihtUmVvcmRlclN0YXNoKTsKKyAgICAgICAgaWYgKCFyZW9yZGVyLT5oYXNQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghcmVvcmRlci0+cG9wKCZlbnRyeSkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4+OjpMb2NrZWQgYnVmZmVycyhtT3V0cHV0QnVmZmVycyk7CisgICAgICAgIHN0YXR1c190IGVyciA9ICgqYnVmZmVycyktPnJlZ2lzdGVyQnVmZmVyKGVudHJ5LmJ1ZmZlciwgJmluZGV4LCAmb3V0QnVmZmVyKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgYm9vbCBvdXRwdXRCdWZmZXJzQ2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGVyciAhPSBXT1VMRF9CTE9DSykgeworICAgICAgICAgICAgICAgIGlmICghKCpidWZmZXJzKS0+aXNBcnJheU1vZGUoKSkgeworICAgICAgICAgICAgICAgICAgICAqYnVmZmVycyA9ICgqYnVmZmVycyktPnRvQXJyYXlNb2RlKG1OdW1PdXRwdXRTbG90cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE91dHB1dEJ1ZmZlcnNBcnJheSAqYXJyYXkgPSAoT3V0cHV0QnVmZmVyc0FycmF5ICopYnVmZmVycy0+Z2V0KCk7CisgICAgICAgICAgICAgICAgYXJyYXktPnJlYWxsb2MoZW50cnkuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiWyVzXSBzZW5kT3V0cHV0QnVmZmVyczogdW5hYmxlIHRvIHJlZ2lzdGVyIG91dHB1dCBidWZmZXIiLCBtTmFtZSk7CisgICAgICAgICAgICByZW9yZGVyLT5kZWZlcihlbnRyeSk7CisKKyAgICAgICAgICAgIGJ1ZmZlcnMudW5sb2NrKCk7CisgICAgICAgICAgICByZW9yZGVyLnVubG9jaygpOworCisgICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyc0NoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBidWZmZXJzLnVubG9jaygpOworICAgICAgICByZW9yZGVyLnVubG9jaygpOworCisgICAgICAgIG91dEJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgZW50cnkudGltZXN0YW1wKTsKKyAgICAgICAgb3V0QnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJmbGFncyIsIGVudHJ5LmZsYWdzKTsKKyAgICAgICAgQUxPR1YoIlslc10gc2VuZE91dHB1dEJ1ZmZlcnM6IG91dCBidWZmZXIgaW5kZXggPSAlenUgWyVwXSA9PiAlcCArICV6dSIsCisgICAgICAgICAgICAgICAgbU5hbWUsIGluZGV4LCBvdXRCdWZmZXIuZ2V0KCksIG91dEJ1ZmZlci0+ZGF0YSgpLCBvdXRCdWZmZXItPnNpemUoKSk7CisgICAgICAgIG1DYWxsYmFjay0+b25PdXRwdXRCdWZmZXJBdmFpbGFibGUoaW5kZXgsIG91dEJ1ZmZlcik7CisgICAgfQorfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZuZXdTdXJmYWNlKSB7CisgICAgc3RhdGljIHN0ZDo6YXRvbWljX3VpbnQzMl90IHN1cmZhY2VHZW5lcmF0aW9uezB9OworICAgIHVpbnQzMl90IGdlbmVyYXRpb24gPSAoZ2V0cGlkKCkgPDwgMTApIHwKKyAgICAgICAgICAgICgoc3VyZmFjZUdlbmVyYXRpb24uZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpICsgMSkKKyAgICAgICAgICAgICAgICAmICgoMSA8PCAxMCkgLSAxKSk7CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKKyAgICBpZiAobmV3U3VyZmFjZSkgeworICAgICAgICBuZXdTdXJmYWNlLT5zZXRTY2FsaW5nTW9kZShOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1cpOworICAgICAgICBwcm9kdWNlciA9IG5ld1N1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKKyAgICAgICAgcHJvZHVjZXItPnNldEdlbmVyYXRpb25OdW1iZXIoZ2VuZXJhdGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIlslc10gc2V0dGluZyBvdXRwdXQgc3VyZmFjZSB0byBudWxsIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlPiBvdXRwdXRQb29sSW50ZjsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBvdXRwdXRQb29sSWQ7CisgICAgeworICAgICAgICBNdXRleGVkPEJsb2NrUG9vbHM+OjpMb2NrZWQgcG9vbHMobUJsb2NrUG9vbHMpOworICAgICAgICBvdXRwdXRQb29sSWQgPSBwb29scy0+b3V0cHV0UG9vbElkOworICAgICAgICBvdXRwdXRQb29sSW50ZiA9IHBvb2xzLT5vdXRwdXRQb29sSW50ZjsKKyAgICB9CisKKyAgICBpZiAob3V0cHV0UG9vbEludGYpIHsKKyAgICAgICAgaWYgKG1Db21wb25lbnQtPnNldE91dHB1dFN1cmZhY2UoCisgICAgICAgICAgICAgICAgb3V0cHV0UG9vbElkLAorICAgICAgICAgICAgICAgIHByb2R1Y2VyLAorICAgICAgICAgICAgICAgIGdlbmVyYXRpb24pICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HSSgiWyVzXSBzZXRTdXJmYWNlOiBjb21wb25lbnQgc2V0T3V0cHV0U3VyZmFjZSBmYWlsZWQiLCBtTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8T3V0cHV0U3VyZmFjZT46OkxvY2tlZCBvdXRwdXQobU91dHB1dFN1cmZhY2UpOworICAgICAgICBuZXdTdXJmYWNlLT5zZXRNYXhEZXF1ZXVlZEJ1ZmZlckNvdW50KG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMpOworICAgICAgICBvdXRwdXQtPnN1cmZhY2UgPSBuZXdTdXJmYWNlOworICAgICAgICBvdXRwdXQtPmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworUGlwZWxpbmVXYXRjaGVyOjpDbG9jazo6ZHVyYXRpb24gQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6ZWxhcHNlZCgpIHsKKyAgICAvLyBXaGVuIGNsaWVudCBwdXNoZWQgRU9TLCB3ZSB3YW50IGFsbCB0aGUgd29yayB0byBiZSBkb25lIHF1aWNrbHkuCisgICAgLy8gT3RoZXJ3aXNlLCBjb21wb25lbnQgbWF5IGhhdmUgc3RhbGxlZCB3b3JrIGR1ZSB0byBpbnB1dCBzdGFydmF0aW9uIHVwIHRvCisgICAgLy8gdGhlIHN1bSBvZiB0aGUgZGVsYXkgaW4gdGhlIHBpcGVsaW5lLgorICAgIHNpemVfdCBuID0gbUlucHV0TWV0RW9zID8gMCA6IG1EZWxheTsKKyAgICByZXR1cm4gbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPmVsYXBzZWQoUGlwZWxpbmVXYXRjaGVyOjpDbG9jazo6bm93KCksIG4pOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OnNldE1ldGFNb2RlKE1ldGFNb2RlIG1vZGUpIHsKKyAgICBtTWV0YU1vZGUgPSBtb2RlOworfQorCitzdGF0dXNfdCB0b1N0YXR1c1QoYzJfc3RhdHVzX3QgYzJzLCBjMl9vcGVyYXRpb25fdCBjMm9wKSB7CisgICAgLy8gQzJfT0sgaXMgYWx3YXlzIHRyYW5zbGF0ZWQgdG8gT0suCisgICAgaWYgKGMycyA9PSBDMl9PSykgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gT3BlcmF0aW9uLWRlcGVuZGVudCB0cmFuc2xhdGlvbgorICAgIC8vIFRPRE86IEFkZCBhcyBuZWNlc3NhcnkKKyAgICBzd2l0Y2ggKGMyb3ApIHsKKyAgICBjYXNlIEMyX09QRVJBVElPTl9Db21wb25lbnRfc3RhcnQ6CisgICAgICAgIHN3aXRjaCAoYzJzKSB7CisgICAgICAgIGNhc2UgQzJfTk9fTUVNT1JZOgorICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gQmFja3VwIG9wZXJhdGlvbi1hZ25vc3RpYyB0cmFuc2xhdGlvbgorICAgIHN3aXRjaCAoYzJzKSB7CisgICAgY2FzZSBDMl9CQURfSU5ERVg6CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgY2FzZSBDMl9CQURfVkFMVUU6CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgY2FzZSBDMl9CTE9DS0lORzoKKyAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgIGNhc2UgQzJfRFVQTElDQVRFOgorICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgY2FzZSBDMl9OT19JTklUOgorICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICBjYXNlIEMyX05PX01FTU9SWToKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICBjYXNlIEMyX05PVF9GT1VORDoKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIGNhc2UgQzJfVElNRURfT1VUOgorICAgICAgICByZXR1cm4gVElNRURfT1VUOworICAgIGNhc2UgQzJfQkFEX1NUQVRFOgorICAgIGNhc2UgQzJfQ0FOQ0VMRUQ6CisgICAgY2FzZSBDMl9DQU5OT1RfRE86CisgICAgY2FzZSBDMl9DT1JSVVBURUQ6CisgICAgY2FzZSBDMl9PTUlUVEVEOgorICAgIGNhc2UgQzJfUkVGVVNFRDoKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC1zdGF0aWNfY2FzdDxzdGF0dXNfdD4oYzJzKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWEyOWI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuaApAQCAtMCwwICsxLDM1MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0NPREVDX0JVRkZFUl9DSEFOTkVMX0hfCisKKyNkZWZpbmUgQ0NPREVDX0JVRkZFUl9DSEFOTkVMX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJNYXBwZXIuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKworI2luY2x1ZGUgIklucHV0U3VyZmFjZVdyYXBwZXIuaCIKKyNpbmNsdWRlICJQaXBlbGluZVdhdGNoZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZW1vcnlEZWFsZXI7CisKK2NsYXNzIENDb2RlY0NhbGxiYWNrIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5DQ29kZWNDYWxsYmFjaygpID0gZGVmYXVsdDsKKyAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcihzdGF0dXNfdCBlcnIsIGVudW0gQWN0aW9uQ29kZSBhY3Rpb25Db2RlKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uT3V0cHV0RnJhbWVzUmVuZGVyZWQoaW50NjRfdCBtZWRpYVRpbWVVcywgbnNlY3NfdCByZW5kZXJUaW1lTnMpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25PdXRwdXRCdWZmZXJzQ2hhbmdlZCgpID0gMDsKK307CisKKy8qKgorICogQnVmZmVyQ2hhbm5lbEJhc2UgaW1wbGVtZW50YXRpb24gZm9yIENDb2RlYy4KKyAqLworY2xhc3MgQ0NvZGVjQnVmZmVyQ2hhbm5lbAorICAgIDogcHVibGljIEJ1ZmZlckNoYW5uZWxCYXNlLCBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxDQ29kZWNCdWZmZXJDaGFubmVsPiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQ0NvZGVjQnVmZmVyQ2hhbm5lbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q0NvZGVjQ2FsbGJhY2s+ICZjYWxsYmFjayk7CisgICAgdmlydHVhbCB+Q0NvZGVjQnVmZmVyQ2hhbm5lbCgpOworCisgICAgLy8gQnVmZmVyQ2hhbm5lbEJhc2UgaW50ZXJmYWNlCisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWV1ZUlucHV0QnVmZmVyKGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVldWVTZWN1cmVJbnB1dEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBib29sIHNlY3VyZSwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmtleSwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKml2LAorICAgICAgICAgICAgQ3J5cHRvUGx1Z2luOjpNb2RlIG1vZGUsCisgICAgICAgICAgICBDcnlwdG9QbHVnaW46OlBhdHRlcm4gcGF0dGVybiwKKyAgICAgICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzLAorICAgICAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMsCisgICAgICAgICAgICBBU3RyaW5nICplcnJvckRldGFpbE1zZykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW5kZXJPdXRwdXRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBpbnQ2NF90IHRpbWVzdGFtcE5zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2NhcmRCdWZmZXIoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGdldElucHV0QnVmZmVyQXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBnZXRPdXRwdXRCdWZmZXJBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgb3ZlcnJpZGU7CisKKyAgICAvLyBNZXRob2RzIGJlbG93IGFyZSBpbnRlcmZhY2UgZm9yIENDb2RlYyB0byB1c2UuCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbXBvbmVudCBvYmplY3QgZm9yIGJ1ZmZlciBwcm9jZXNzaW5nLgorICAgICAqLworICAgIHZvaWQgc2V0Q29tcG9uZW50KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgb3V0cHV0IGdyYXBoaWMgc3VyZmFjZSBmb3IgcmVuZGVyaW5nLgorICAgICAqLworICAgIHN0YXR1c190IHNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpOworCisgICAgLyoqCisgICAgICogU2V0IEdyYXBoaWNCdWZmZXJTb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdGhlIGNvbXBvbmVudCBleHRyYWN0cyBpbnB1dAorICAgICAqIGJ1ZmZlcnMuCisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0SW5wdXRTdXJmYWNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyPiAmc3VyZmFjZSk7CisKKyAgICAvKioKKyAgICAgKiBTaWduYWwgRU9TIHRvIGlucHV0IHN1cmZhY2UuCisgICAgICovCisgICAgc3RhdHVzX3Qgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpOworCisgICAgLyoqCisgICAgICogU2V0IHBhcmFtZXRlcnMuCisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZwYXJhbXMpOworCisgICAgLyoqCisgICAgICogU3RhcnQgcXVldWVpbmcgYnVmZmVycyB0byB0aGUgY29tcG9uZW50LiBUaGlzIG9iamVjdCBzaG91bGQgbmV2ZXIgcXVldWUKKyAgICAgKiBidWZmZXJzIGJlZm9yZSB0aGlzIGNhbGwgaGFzIGNvbXBsZXRlZC4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzdGFydChjb25zdCBzcDxBTWVzc2FnZT4gJmlucHV0Rm9ybWF0LCBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCk7CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IGluaXRpYWwgaW5wdXQgYnVmZmVycyB0byBiZSBmaWxsZWQgYnkgY2xpZW50LgorICAgICAqLworICAgIHN0YXR1c190IHJlcXVlc3RJbml0aWFsSW5wdXRCdWZmZXJzKCk7CisKKyAgICAvKioKKyAgICAgKiBTdG9wIHF1ZXVlaW5nIGJ1ZmZlcnMgdG8gdGhlIGNvbXBvbmVudC4gVGhpcyBvYmplY3Qgc2hvdWxkIG5ldmVyIHF1ZXVlCisgICAgICogYnVmZmVycyBhZnRlciB0aGlzIGNhbGwsIHVudGlsIHN0YXJ0KCkgaXMgY2FsbGVkLgorICAgICAqLworICAgIHZvaWQgc3RvcCgpOworCisgICAgdm9pZCBmbHVzaChjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yayk7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgaW5wdXQgY2xpZW50IGFib3V0IHdvcmsgZG9uZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3b3JrSXRlbXMgICBmaW5pc2hlZCB3b3JrIGl0ZW0uCisgICAgICogQHBhcmFtIG91dHB1dEZvcm1hdCBuZXcgb3V0cHV0IGZvcm1hdCBpZiBpdCBoYXMgY2hhbmdlZCwgb3RoZXJ3aXNlIG51bGxwdHIKKyAgICAgKiBAcGFyYW0gaW5pdERhdGEgICAgbmV3IGluaXQgZGF0YSAoQ1NEKSBpZiBpdCBoYXMgY2hhbmdlZCwgb3RoZXJ3aXNlIG51bGxwdHIKKyAgICAgKi8KKyAgICB2b2lkIG9uV29ya0RvbmUoCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrLCBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQgKmluaXREYXRhKTsKKworICAgIC8qKgorICAgICAqIE1ha2UgYW4gaW5wdXQgYnVmZmVyIGF2YWlsYWJsZSBmb3IgdGhlIGNsaWVudCBhcyBpdCBpcyBubyBsb25nZXIgbmVlZGVkCisgICAgICogYnkgdGhlIGNvZGVjLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYW1lSW5kZXggVGhlIGluZGV4IG9mIGlucHV0IHdvcmsKKyAgICAgKiBAcGFyYW0gYXJyYXlJbmRleCBUaGUgaW5kZXggb2YgYnVmZmVyIGluIHRoZSBpbnB1dCB3b3JrIGJ1ZmZlcnMuCisgICAgICovCisgICAgdm9pZCBvbklucHV0QnVmZmVyRG9uZSh1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYXJyYXlJbmRleCk7CisKKyAgICBQaXBlbGluZVdhdGNoZXI6OkNsb2NrOjpkdXJhdGlvbiBlbGFwc2VkKCk7CisKKyAgICBlbnVtIE1ldGFNb2RlIHsKKyAgICAgICAgTU9ERV9OT05FLAorICAgICAgICBNT0RFX0FOVywKKyAgICB9OworCisgICAgdm9pZCBzZXRNZXRhTW9kZShNZXRhTW9kZSBtb2RlKTsKKworICAgIC8vIEludGVybmFsIGNsYXNzZXMKKyAgICBjbGFzcyBCdWZmZXJzOworICAgIGNsYXNzIElucHV0QnVmZmVyczsKKyAgICBjbGFzcyBPdXRwdXRCdWZmZXJzOworCitwcml2YXRlOgorICAgIGNsYXNzIFF1ZXVlR3VhcmQ7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsIG11dGV4LWxpa2Ugb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICAgICAqCisgICAgICogLSBBdCBTVE9QUEVEIHN0YXRlIChpbml0aWFsLCBvciBhZnRlciBzdG9wKCkpCisgICAgICogICAtIFF1ZXVlR3VhcmQgb2JqZWN0IGdldHMgY3JlYXRlZCBhdCBTVE9QUEVEIHN0YXRlLCBhbmQgdGhlIGNsaWVudCBpcworICAgICAqICAgICBzdXBwb3NlZCB0byByZXR1cm4gaW1tZWRpYXRlbHkuCisgICAgICogLSBBdCBSVU5OSU5HIHN0YXRlIChhZnRlciBzdGFydCgpKQorICAgICAqICAgLSBFYWNoIFF1ZXVlR3VhcmQgb2JqZWN0CisgICAgICovCisgICAgY2xhc3MgUXVldWVTeW5jIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKgorICAgICAgICAgKiBBdCBjb25zdHJ1Y3Rpb24gdGhlIHN5bmMgb2JqZWN0IGlzIGluIFNUT1BQRUQgc3RhdGUuCisgICAgICAgICAqLworICAgICAgICBpbmxpbmUgUXVldWVTeW5jKCkge30KKyAgICAgICAgflF1ZXVlU3luYygpID0gZGVmYXVsdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVHJhbnNpdGlvbiB0byBSVU5OSU5HIHN0YXRlIHdoZW4gc3RvcHBlZC4gTm8tb3AgaWYgYWxyZWFkeSBpbiBSVU5OSU5HCisgICAgICAgICAqIHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzdGFydCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBdCBSVU5OSU5HIHN0YXRlLCB3YWl0IHVudGlsIGFsbCBRdWV1ZUd1YXJkIG9iamVjdCBjcmVhdGVkIGR1cmluZworICAgICAgICAgKiBSVU5OSU5HIHN0YXRlIGFyZSBkZXN0cm95ZWQsIGFuZCB0aGVuIHRyYW5zaXRpb24gdG8gU1RPUFBFRCBzdGF0ZS4KKyAgICAgICAgICogTm8tb3AgaWYgYWxyZWFkeSBpbiBTVE9QUEVEIHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzdG9wKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBNdXRleCBtR3VhcmRMb2NrOworCisgICAgICAgIHN0cnVjdCBDb3VudGVyIHsKKyAgICAgICAgICAgIGlubGluZSBDb3VudGVyKCkgOiB2YWx1ZSgtMSkge30KKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBDb25kaXRpb24gY29uZDsKKyAgICAgICAgfTsKKyAgICAgICAgTXV0ZXhlZDxDb3VudGVyPiBtQ291bnQ7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIENDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlR3VhcmQ7CisgICAgfTsKKworICAgIGNsYXNzIFF1ZXVlR3VhcmQgeworICAgIHB1YmxpYzoKKyAgICAgICAgUXVldWVHdWFyZChRdWV1ZVN5bmMgJnN5bmMpOworICAgICAgICB+UXVldWVHdWFyZCgpOworICAgICAgICBpbmxpbmUgYm9vbCBpc1J1bm5pbmcoKSB7IHJldHVybiBtUnVubmluZzsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgUXVldWVTeW5jICZtU3luYzsKKyAgICAgICAgYm9vbCBtUnVubmluZzsKKyAgICB9OworCisgICAgdm9pZCBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSgpOworICAgIHZvaWQgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGVJbnRlcm5hbCgpOworICAgIHN0YXR1c190IHF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKTsKKyAgICBib29sIGhhbmRsZVdvcmsoCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrLCBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQgKmluaXREYXRhKTsKKyAgICB2b2lkIHNlbmRPdXRwdXRCdWZmZXJzKCk7CisKKyAgICBRdWV1ZVN5bmMgbVN5bmM7CisgICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyOworICAgIHNwPElNZW1vcnk+IG1EZWNyeXB0RGVzdGluYXRpb247CisgICAgaW50MzJfdCBtSGVhcFNlcU51bTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKyAgICBzdGQ6OnN0cmluZyBtQ29tcG9uZW50TmFtZTsgLy8vPCBjb21wb25lbnQgbmFtZSBmb3IgZGVidWdnaW5nCisgICAgY29uc3QgY2hhciAqbU5hbWU7IC8vLzwgQy1zdHJpbmcgdmVyc2lvbiBvZiBjb21wb25lbnQgbmFtZQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDQ29kZWNDYWxsYmFjaz4gbUNDb2RlY0NhbGxiYWNrOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUlucHV0QWxsb2NhdG9yOworICAgIFF1ZXVlU3luYyBtUXVldWVTeW5jOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gbVBhcmFtc1RvQmVTZXQ7CisKKyAgICBzaXplX3QgbU51bUlucHV0U2xvdHM7CisgICAgc2l6ZV90IG1OdW1PdXRwdXRTbG90czsKKyAgICBzaXplX3QgbURlbGF5OworCisgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPj4gbUlucHV0QnVmZmVyczsKKyAgICBNdXRleGVkPHN0ZDo6bGlzdDxzcDxBQnVmZmVyPj4+IG1GbHVzaGVkQ29uZmlnczsKKyAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPj4gbU91dHB1dEJ1ZmZlcnM7CisKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtRnJhbWVJbmRleDsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtRmlyc3RWYWxpZEZyYW1lSW5kZXg7CisKKyAgICBzcDxNZW1vcnlEZWFsZXI+IG1ha2VNZW1vcnlEZWFsZXIoc2l6ZV90IGhlYXBTaXplKTsKKworICAgIHN0cnVjdCBPdXRwdXRTdXJmYWNlIHsKKyAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgaW50IG1heERlcXVldWVCdWZmZXJzOworICAgIH07CisgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPiBtT3V0cHV0U3VyZmFjZTsKKworICAgIHN0cnVjdCBCbG9ja1Bvb2xzIHsKKyAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3QgaW5wdXRBbGxvY2F0b3JJZDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBpbnB1dFBvb2w7CisgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IG91dHB1dEFsbG9jYXRvcklkOworICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBvdXRwdXRQb29sSWQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZT4gb3V0cHV0UG9vbEludGY7CisgICAgfTsKKyAgICBNdXRleGVkPEJsb2NrUG9vbHM+IG1CbG9ja1Bvb2xzOworCisgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+IG1JbnB1dFN1cmZhY2U7CisKKyAgICBNZXRhTW9kZSBtTWV0YU1vZGU7CisKKyAgICBNdXRleGVkPFBpcGVsaW5lV2F0Y2hlcj4gbVBpcGVsaW5lV2F0Y2hlcjsKKworICAgIGNsYXNzIFJlb3JkZXJTdGFzaCB7CisgICAgcHVibGljOgorICAgICAgICBzdHJ1Y3QgRW50cnkgeworICAgICAgICAgICAgaW5saW5lIEVudHJ5KCkgOiBidWZmZXIobnVsbHB0ciksIHRpbWVzdGFtcCgwKSwgZmxhZ3MoMCksIG9yZGluYWwoezAsIDAsIDB9KSB7fQorICAgICAgICAgICAgaW5saW5lIEVudHJ5KAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZiLAorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHQsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmbykKKyAgICAgICAgICAgICAgICA6IGJ1ZmZlcihiKSwgdGltZXN0YW1wKHQpLCBmbGFncyhmKSwgb3JkaW5hbChvKSB7fQorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXI7CisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcDsKKyAgICAgICAgICAgIGludDMyX3QgZmxhZ3M7CisgICAgICAgICAgICBDMldvcmtPcmRpbmFsU3RydWN0IG9yZGluYWw7CisgICAgICAgIH07CisKKyAgICAgICAgUmVvcmRlclN0YXNoKCk7CisKKyAgICAgICAgdm9pZCBjbGVhcigpOworICAgICAgICB2b2lkIGZsdXNoKCk7CisgICAgICAgIHZvaWQgc2V0RGVwdGgodWludDMyX3QgZGVwdGgpOworICAgICAgICB2b2lkIHNldEtleShDMkNvbmZpZzo6b3JkaW5hbF9rZXlfdCBrZXkpOworICAgICAgICBib29sIHBvcChFbnRyeSAqZW50cnkpOworICAgICAgICB2b2lkIGVtcGxhY2UoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLAorICAgICAgICAgICAgICAgIGludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmb3JkaW5hbCk7CisgICAgICAgIHZvaWQgZGVmZXIoY29uc3QgRW50cnkgJmVudHJ5KTsKKyAgICAgICAgYm9vbCBoYXNQZW5kaW5nKCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Omxpc3Q8RW50cnk+IG1QZW5kaW5nOworICAgICAgICBzdGQ6Omxpc3Q8RW50cnk+IG1TdGFzaDsKKyAgICAgICAgdWludDMyX3QgbURlcHRoOworICAgICAgICBDMkNvbmZpZzo6b3JkaW5hbF9rZXlfdCBtS2V5OworCisgICAgICAgIGJvb2wgbGVzcyhjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0ICZvMSwgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmbzIpOworICAgIH07CisgICAgTXV0ZXhlZDxSZW9yZGVyU3Rhc2g+IG1SZW9yZGVyU3Rhc2g7CisKKyAgICBzdGQ6OmF0b21pY19ib29sIG1JbnB1dE1ldEVvczsKKworICAgIGlubGluZSBib29sIGhhc0NyeXB0b09yRGVzY3JhbWJsZXIoKSB7CisgICAgICAgIHJldHVybiBtQ3J5cHRvICE9IG51bGxwdHIgfHwgbURlc2NyYW1ibGVyICE9IG51bGxwdHI7CisgICAgfQorfTsKKworLy8gQ29udmVyc2lvbiBvZiBhIGMyX3N0YXR1c190IHZhbHVlIHRvIGEgc3RhdHVzX3QgdmFsdWUgbWF5IGRlcGVuZCBvbiB0aGUKKy8vIG9wZXJhdGlvbiB0aGF0IHJldHVybnMgdGhlIGMyX3N0YXR1c190IHZhbHVlLgorZW51bSBjMl9vcGVyYXRpb25fdCB7CisgICAgQzJfT1BFUkFUSU9OX05PTkUsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9jb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9jcmVhdGVCbG9ja1Bvb2wsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9kZXN0cm95QmxvY2tQb29sLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfZGlzY29ubmVjdEZyb21JbnB1dFN1cmZhY2UsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9kcmFpbiwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X2ZsdXNoLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfcXVldWUsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9yZWxlYXNlLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfcmVzZXQsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9zZXRPdXRwdXRTdXJmYWNlLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfc3RhcnQsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9zdG9wLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRTdG9yZV9jb3B5QnVmZmVyLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRTdG9yZV9jcmVhdGVDb21wb25lbnQsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudFN0b3JlX2NyZWF0ZUlucHV0U3VyZmFjZSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50U3RvcmVfY3JlYXRlSW50ZXJmYWNlLAorICAgIEMyX09QRVJBVElPTl9Db25maWd1cmFibGVfY29uZmlnLAorICAgIEMyX09QRVJBVElPTl9Db25maWd1cmFibGVfcXVlcnksCisgICAgQzJfT1BFUkFUSU9OX0NvbmZpZ3VyYWJsZV9xdWVyeVN1cHBvcnRlZFBhcmFtcywKKyAgICBDMl9PUEVSQVRJT05fQ29uZmlndXJhYmxlX3F1ZXJ5U3VwcG9ydGVkVmFsdWVzLAorICAgIEMyX09QRVJBVElPTl9JbnB1dFN1cmZhY2VfY29ubmVjdFRvQ29tcG9uZW50LAorICAgIEMyX09QRVJBVElPTl9JbnB1dFN1cmZhY2VDb25uZWN0aW9uX2Rpc2Nvbm5lY3QsCit9OworCitzdGF0dXNfdCB0b1N0YXR1c1QoYzJfc3RhdHVzX3QgYzJzLCBjMl9vcGVyYXRpb25fdCBjMm9wID0gQzJfT1BFUkFUSU9OX05PTkUpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENDT0RFQ19CVUZGRVJfQ0hBTk5FTF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjAyZTc0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5jcHAKQEAgLTAsMCArMSwxNjEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDQ29kZWNDb25maWciCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorCisjaW5jbHVkZSAiQ0NvZGVjQ29uZmlnLmgiCisjaW5jbHVkZSAiQ29kZWMyTWFwcGVyLmgiCisKKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCA2NCAgLyogNjQqLTAuMjVkQiA9IC0xNiBkQiBiZWxvdyBmdWxsIHNjYWxlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCAgIDEyNyAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QgMTI3IC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19IRUFWWSAxICAgLyogc3dpdGNoIGZvciBoZWF2eSBjb21wcmVzc2lvbiBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19FRkZFQ1QgMyAgLyogTVBFRy1EIERSQyBlZmZlY3QgdHlwZTsgMyA9PiBMaW1pdGVkIHBsYXliYWNrIHJhbmdlICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwgKC0xKSAvKiBlbmNvZGVyIHRhcmdldCBsZXZlbDsgLTEgPT4gdGhlIHZhbHVlIGlzIHVua25vd24sIG90aGVyd2lzZSBkQiBzdGVwIHZhbHVlIChlLmcuIDY0IGZvciAtMTYgZEIpICovCisvLyBuYW1lcyBvZiBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgRFJDIHNldHRpbmdzCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX1JFRl9MRVZFTCAgImFhY19kcmNfcmVmZXJlbmNlX2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9DVVQgICAgICAgICJhYWNfZHJjX2N1dCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QgICAgICAiYWFjX2RyY19ib29zdCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlkgICAgICAiYWFjX2RyY19oZWF2eSIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRU5DX0xFVkVMICAiYWFjX2RyY19lbmNfdGFyZ2V0X2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FRkZFQ1QgICAgICJyby5hYWNfZHJjX2VmZmVjdF90eXBlIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIENDb2RlY0NvbmZpZworCituYW1lc3BhY2UgeworCisvKioKKyAqIG1hcHBpbmcgYmV0d2VlbiBTREsgYW5kIENvZGVjIDIuMCBjb25maWd1cmF0aW9ucy4KKyAqLworc3RydWN0IENvbmZpZ01hcHBlciB7CisgICAgLyoqCisgICAgICogVmFsdWUgbWFwcGVyIChDMlZhbHVlID0+IEMyVmFsdWUpCisgICAgICovCisgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPEMyVmFsdWUoQzJWYWx1ZSk+IE1hcHBlcjsKKworICAgIC8vLyBzaG9ydGhhbmQKKyAgICB0eXBlZGVmIENDb2RlY0NvbmZpZzo6RG9tYWluIERvbWFpbjsKKworICAgIENvbmZpZ01hcHBlcihzdGQ6OnN0cmluZyBtZWRpYUtleSwgQzJTdHJpbmcgYzJzdHJ1Y3QsIEMyU3RyaW5nIGMyZmllbGQpCisgICAgICAgIDogbURvbWFpbihEb21haW46OkFMTCksIG1NZWRpYUtleShtZWRpYUtleSksIG1TdHJ1Y3QoYzJzdHJ1Y3QpLCBtRmllbGQoYzJmaWVsZCkgeyB9CisKKyAgICAvLy8gTGltaXRzIHRoaXMgcGFyYW1ldGVyIHRvIHRoZSBnaXZlbiBkb21haW4KKyAgICBDb25maWdNYXBwZXIgJmxpbWl0VG8odWludDMyX3QgZG9tYWluKSB7CisgICAgICAgIEMyX0NIRUNLKGRvbWFpbiAmIERvbWFpbjo6R1VBUkRfQklUKTsKKyAgICAgICAgbURvbWFpbiA9IERvbWFpbihtRG9tYWluICYgZG9tYWluKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vLyBBZGRzIFNESyA9PiBDb2RlYyAyLjAgbWFwcGVyIChzaG91bGQgbm90IGJlIGluIHRoZSBTREsgZm9ybWF0KQorICAgIENvbmZpZ01hcHBlciAmd2l0aE1hcHBlcihNYXBwZXIgbWFwcGVyKSB7CisgICAgICAgIEMyX0NIRUNLKCFtTWFwcGVyKTsKKyAgICAgICAgQzJfQ0hFQ0soIW1SZXZlcnNlKTsKKyAgICAgICAgbU1hcHBlciA9IG1hcHBlcjsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vLyBBZGRzIFNESyA8PT4gQ29kZWMgMi4wIHZhbHVlIG1hcHBlcnMKKyAgICBDb25maWdNYXBwZXIgJndpdGhNYXBwZXJzKE1hcHBlciBtYXBwZXIsIE1hcHBlciByZXZlcnNlKSB7CisgICAgICAgIEMyX0NIRUNLKCFtTWFwcGVyKTsKKyAgICAgICAgQzJfQ0hFQ0soIW1SZXZlcnNlKTsKKyAgICAgICAgbU1hcHBlciA9IG1hcHBlcjsKKyAgICAgICAgbVJldmVyc2UgPSByZXZlcnNlOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8vIEFkZHMgU0RLIDw9PiBDb2RlYyAyLjAgdmFsdWUgbWFwcGVycyBiYXNlZCBvbiBDMk1hcHBlcgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMyVHlwZSwgdHlwZW5hbWUgU2RrVHlwZT1pbnQzMl90PgorICAgIENvbmZpZ01hcHBlciAmd2l0aEMyTWFwcGVycygpIHsKKyAgICAgICAgQzJfQ0hFQ0soIW1NYXBwZXIpOworICAgICAgICBDMl9DSEVDSyghbVJldmVyc2UpOworICAgICAgICBtTWFwcGVyID0gW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIFNka1R5cGUgc2RrVmFsdWU7CisgICAgICAgICAgICBDMlR5cGUgYzJWYWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmc2RrVmFsdWUpICYmIEMyTWFwcGVyOjptYXAoc2RrVmFsdWUsICZjMlZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjMlZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfTsKKyAgICAgICAgbVJldmVyc2UgPSBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgU2RrVHlwZSBzZGtWYWx1ZTsKKyAgICAgICAgICAgIEMyVHlwZSBjMlZhbHVlOworICAgICAgICAgICAgdXNpbmcgQzJWYWx1ZVR5cGU9dHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxDMlR5cGU+Ojp0eXBlOworICAgICAgICAgICAgaWYgKHYuZ2V0KChDMlZhbHVlVHlwZSopJmMyVmFsdWUpICYmIEMyTWFwcGVyOjptYXAoYzJWYWx1ZSwgJnNka1ZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzZGtWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH07CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gTWFwcyBmcm9tIFNESyB2YWx1ZXMgaW4gYW4gQU1lc3NhZ2UgdG8gYSBzdWl0YWJsZSBDMlZhbHVlLgorICAgIEMyVmFsdWUgbWFwRnJvbU1lc3NhZ2UoY29uc3QgQU1lc3NhZ2U6Okl0ZW1EYXRhICZpdGVtKSBjb25zdCB7CisgICAgICAgIEMyVmFsdWUgdmFsdWU7CisgICAgICAgIGludDMyX3QgaW50MzJWYWx1ZTsKKyAgICAgICAgaW50NjRfdCBpbnQ2NFZhbHVlOworICAgICAgICBmbG9hdCBmbG9hdFZhbHVlOworICAgICAgICBkb3VibGUgZG91YmxlVmFsdWU7CisgICAgICAgIGlmIChpdGVtLmZpbmQoJmludDMyVmFsdWUpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGludDMyVmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5maW5kKCZpbnQ2NFZhbHVlKSkgeworICAgICAgICAgICAgdmFsdWUgPSBpbnQ2NFZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZmluZCgmZmxvYXRWYWx1ZSkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gZmxvYXRWYWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpdGVtLmZpbmQoJmRvdWJsZVZhbHVlKSkgeworICAgICAgICAgICAgdmFsdWUgPSAoZmxvYXQpZG91YmxlVmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlLnR5cGUoKSAhPSBDMlZhbHVlOjpOT19JTklUICYmIG1NYXBwZXIpIHsKKyAgICAgICAgICAgIHZhbHVlID0gbU1hcHBlcih2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8vLyBNYXBzIGZyb20gYSBDMlZhbHVlIHRvIGFuIFNESyB2YWx1ZSBpbiBhbiBBTWVzc2FnZS4KKyAgICBBTWVzc2FnZTo6SXRlbURhdGEgbWFwVG9NZXNzYWdlKEMyVmFsdWUgdmFsdWUpIGNvbnN0IHsKKyAgICAgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIGl0ZW07CisgICAgICAgIGludDMyX3QgaW50MzJWYWx1ZTsKKyAgICAgICAgdWludDMyX3QgdWludDMyVmFsdWU7CisgICAgICAgIGludDY0X3QgaW50NjRWYWx1ZTsKKyAgICAgICAgdWludDY0X3QgdWludDY0VmFsdWU7CisgICAgICAgIGZsb2F0IGZsb2F0VmFsdWU7CisgICAgICAgIGlmICh2YWx1ZS50eXBlKCkgIT0gQzJWYWx1ZTo6Tk9fSU5JVCAmJiBtUmV2ZXJzZSkgeworICAgICAgICAgICAgdmFsdWUgPSBtUmV2ZXJzZSh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlLmdldCgmaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgICAgIGl0ZW0uc2V0KGludDMyVmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmdldCgmdWludDMyVmFsdWUpICYmIHVpbnQzMlZhbHVlIDw9IHVpbnQzMl90KElOVDMyX01BWCkpIHsKKyAgICAgICAgICAgIC8vIFNESyBkb2VzIG5vdCBzdXBwb3J0IHVuc2lnbmVkIHZhbHVlcworICAgICAgICAgICAgaXRlbS5zZXQoKGludDMyX3QpdWludDMyVmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmdldCgmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgICAgIGl0ZW0uc2V0KGludDY0VmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmdldCgmdWludDY0VmFsdWUpICYmIHVpbnQ2NFZhbHVlIDw9IHVpbnQ2NF90KElOVDY0X01BWCkpIHsKKyAgICAgICAgICAgIC8vIFNESyBkb2VzIG5vdCBzdXBwb3J0IHVuc2lnbmVkIHZhbHVlcworICAgICAgICAgICAgaXRlbS5zZXQoKGludDY0X3QpdWludDY0VmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmdldCgmZmxvYXRWYWx1ZSkpIHsKKyAgICAgICAgICAgIGl0ZW0uc2V0KGZsb2F0VmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KKworICAgIERvbWFpbiBkb21haW4oKSBjb25zdCB7IHJldHVybiBtRG9tYWluOyB9CisgICAgc3RkOjpzdHJpbmcgbWVkaWFLZXkoKSBjb25zdCB7IHJldHVybiBtTWVkaWFLZXk7IH0KKyAgICBzdGQ6OnN0cmluZyBwYXRoKCkgY29uc3QgeyByZXR1cm4gbUZpZWxkLnNpemUoKSA/IG1TdHJ1Y3QgKyAnLicgKyBtRmllbGQgOiBtU3RydWN0OyB9CisgICAgTWFwcGVyIG1hcHBlcigpIGNvbnN0IHsgcmV0dXJuIG1NYXBwZXI7IH0KKyAgICBNYXBwZXIgcmV2ZXJzZSgpIGNvbnN0IHsgcmV0dXJuIG1SZXZlcnNlOyB9CisKK3ByaXZhdGU6CisgICAgRG9tYWluIG1Eb21haW47ICAgICAgICAgLy8vPCBwYXJhbWV0ZXIgZG9tYWluIChtYXNrKSBjb250YWluaW5nIHBvcnQsIGtpbmQgYW5kIGNvbmZpZyBkb21haW5zCisgICAgc3RkOjpzdHJpbmcgbU1lZGlhS2V5OyAgLy8vPCBTREsga2V5CisgICAgQzJTdHJpbmcgbVN0cnVjdDsgICAgICAgLy8vPCBDb2RlYyAyLjAgc3RydWN0IG5hbWUKKyAgICBDMlN0cmluZyBtRmllbGQ7ICAgICAgICAvLy88IENvZGVjIDIuMCBmaWVsZCBuYW1lCisgICAgTWFwcGVyIG1NYXBwZXI7ICAgICAgICAgLy8vPCBvcHRpb25hbCBTREsgPT4gQ29kZWMgMi4wIHZhbHVlIG1hcHBlcgorICAgIE1hcHBlciBtUmV2ZXJzZTsgICAgICAgIC8vLzwgb3B0aW9uYWwgQ29kZWMgMi4wID0+IFNESyB2YWx1ZSBtYXBwZXIKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBQT1JULCB0eXBlbmFtZSBTVFJFQU0+CitBU3RyaW5nIFF1ZXJ5TWVkaWFUeXBlSW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KSB7CisgICAgQVN0cmluZyBtZWRpYVR5cGU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0gY29tcG9uZW50LT5xdWVyeSgKKyAgICAgICAgICAgIHt9LCB7IFBPUlQ6OlBBUkFNX1RZUEUsIFNUUkVBTTo6UEFSQU1fVFlQRSB9LCBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LICYmIHF1ZXJpZWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0QoIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkID0+ICVzIiwgYXNTdHJpbmcoYzJlcnIpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQT1JUICpwb3J0TWVkaWFUeXBlID0KKyAgICAgICAgICAgIFBPUlQ6OkZyb20ocXVlcmllZFswXS5nZXQoKSk7CisgICAgICAgIGlmIChwb3J0TWVkaWFUeXBlKSB7CisgICAgICAgICAgICBtZWRpYVR5cGUgPSBBU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICBwb3J0TWVkaWFUeXBlLT5tLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICBzdHJubGVuKHBvcnRNZWRpYVR5cGUtPm0udmFsdWUsIHBvcnRNZWRpYVR5cGUtPmZsZXhDb3VudCgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTVFJFQU0gKnN0cmVhbU1lZGlhVHlwZSA9IFNUUkVBTTo6RnJvbShxdWVyaWVkWzBdLmdldCgpKTsKKyAgICAgICAgICAgIGlmIChzdHJlYW1NZWRpYVR5cGUpIHsKKyAgICAgICAgICAgICAgICBtZWRpYVR5cGUgPSBBU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtTWVkaWFUeXBlLT5tLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RybmxlbihzdHJlYW1NZWRpYVR5cGUtPm0udmFsdWUsIHN0cmVhbU1lZGlhVHlwZS0+ZmxleENvdW50KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HRCgicmVhZCBtZWRpYSB0eXBlOiAlcyIsIG1lZGlhVHlwZS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIG1lZGlhVHlwZTsKK30KKworQVN0cmluZyBRdWVyeU1lZGlhVHlwZSgKKyAgICAgICAgYm9vbCBpbnB1dCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KSB7CisgICAgdHlwZWRlZiBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nIFA7CisgICAgdHlwZWRlZiBDMlN0cmVhbU1lZGlhVHlwZVNldHRpbmcgUzsKKyAgICBpZiAoaW5wdXQpIHsKKyAgICAgICAgcmV0dXJuIFF1ZXJ5TWVkaWFUeXBlSW1wbDxQOjppbnB1dCwgUzo6aW5wdXQ+KGNvbXBvbmVudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFF1ZXJ5TWVkaWFUeXBlSW1wbDxQOjpvdXRwdXQsIFM6Om91dHB1dD4oY29tcG9uZW50KTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvKioKKyAqIFNldCBvZiBzdGFuZGFyZCBwYXJhbWV0ZXJzIHVzZWQgYnkgQ0NvZGVjIHRoYXQgYXJlIGV4cG9zZWQgdG8gTWVkaWFDb2RlYy4KKyAqLworc3RydWN0IFN0YW5kYXJkUGFyYW1zIHsKKyAgICB0eXBlZGVmIENDb2RlY0NvbmZpZzo6RG9tYWluIERvbWFpbjsKKworICAgIC8vIHN0YW5kYXJkIChNZWRpYUNvZGVjKSBwYXJhbXMgYXJlIGtleWVkIGJ5IG1lZGlhIGZvcm1hdCBrZXkKKyAgICB0eXBlZGVmIHN0ZDo6c3RyaW5nIFNka0tleTsKKworICAgIC8vLyB1c2VkIHRvIHJldHVybiByZWZlcmVuY2UgdG8gbm8gY29uZmlnIG1hcHBlcnMgaW4gZ2V0Q29uZmlnTWFwcGVyc0ZvclNka0tleQorICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+IE5PX01BUFBFUlM7CisKKyAgICAvLy8gUmV0dXJucyBDb2RlYyAyLjAgZXF1aXZhbGVudCBwYXJhbWV0ZXJzIGZvciBhbiBTREsgZm9ybWF0IGtleS4KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+ICZnZXRDb25maWdNYXBwZXJzRm9yU2RrS2V5KHN0ZDo6c3RyaW5nIGtleSkgY29uc3QgeworICAgICAgICBhdXRvIGl0ID0gbUNvbmZpZ01hcHBlcnMuZmluZChrZXkpOworICAgICAgICBpZiAoaXQgPT0gbUNvbmZpZ01hcHBlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dEKCJubyBjMiBlcXVpdmFsZW50cyBmb3IgJXMiLCBrZXkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fTUFQUEVSUzsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiZm91bmQgJXp1IGVxcyBmb3IgJXMiLCBpdC0+c2Vjb25kLnNpemUoKSwga2V5LmNfc3RyKCkpOworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgU0RLIDw9PiBDb2RlYyAyLjAgcGFyYW1ldGVyIG1hcHBpbmcuIE11bHRpcGxlIENvZGVjIDIuMCBwYXJhbWV0ZXJzIG1heSBtYXAgdG8gYQorICAgICAqIHNpbmdsZSBTREsga2V5LCBpbiB3aGljaCBjYXNlIHRoZXkgc2hhbGwgYmUgb3JkZXJlZCBmcm9tIGxlYXN0IGF1dGhvcml0YXRpdmUgdG8gbW9zdAorICAgICAqIGF1dGhvcml0YXRpdmUuIFdoZW4gY29uc3RydWN0aW5nIFNESyBmb3JtYXRzLCB0aGUgbGFzdCBtYXBwZWQgQ29kZWMgMi4wIHBhcmFtZXRlciB0aGF0CisgICAgICogaXMgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQgd2lsbCBkZXRlcm1pbmUgdGhlIGV4cG9zZWQgdmFsdWUuIChUT0RPOiBwZXJoYXBzIHJlc3RyaWN0IHRoaXMKKyAgICAgKiBieSBkb21haW4uKQorICAgICAqLworICAgIHZvaWQgYWRkKGNvbnN0IENvbmZpZ01hcHBlciAmY20pIHsKKyAgICAgICAgYXV0byBpdCA9IG1Db25maWdNYXBwZXJzLmZpbmQoY20ubWVkaWFLZXkoKSk7CisgICAgICAgIEFMT0dWKCIlYyVjJWMlYyAlYyVjJWMgJTA0eCAlOXMgJXMgPT4gJXMiLAorICAgICAgICAgICAgICAoKGNtLmRvbWFpbigpICYgRG9tYWluOjpJU19JTlBVVCkgPyAnSScgOiAnICcpLAorICAgICAgICAgICAgICAoKGNtLmRvbWFpbigpICYgRG9tYWluOjpJU19PVVRQVVQpID8gJ08nIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfQ09ERUQpID8gJ0MnIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfUkFXKSA/ICdSJyA6ICcgJyksCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX0NPTkZJRykgPyAnYycgOiAnICcpLAorICAgICAgICAgICAgICAoKGNtLmRvbWFpbigpICYgRG9tYWluOjpJU19QQVJBTSkgPyAncCcgOiAnICcpLAorICAgICAgICAgICAgICAoKGNtLmRvbWFpbigpICYgRG9tYWluOjpJU19SRUFEKSA/ICdyJyA6ICcgJyksCisgICAgICAgICAgICAgIGNtLmRvbWFpbigpLAorICAgICAgICAgICAgICBpdCA9PSBtQ29uZmlnTWFwcGVycy5lbmQoKSA/ICJhZGRpbmciIDogImV4dGVuZGluZyIsCisgICAgICAgICAgICAgIGNtLm1lZGlhS2V5KCkuY19zdHIoKSwgY20ucGF0aCgpLmNfc3RyKCkpOworICAgICAgICBpZiAoaXQgPT0gbUNvbmZpZ01hcHBlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4gZXFzID0geyBjbSB9OworICAgICAgICAgICAgbUNvbmZpZ01hcHBlcnMuZW1wbGFjZShjbS5tZWRpYUtleSgpLCBlcXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXQtPnNlY29uZC5wdXNoX2JhY2soY20pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbGwgcGF0aHMgZm9yIGEgc3BlY2lmaWMgZG9tYWluLgorICAgICAqCisgICAgICogXHBhcmFtIGFueSBtYXhpbXVtIGRvbWFpbiBtYXNrLiBSZXR1cm5lZCBwYXJhbWV0ZXJzIG11c3QgbWF0Y2ggYXQgbGVhc3Qgb25lIG9mIHRoZSBkb21haW5zCisgICAgICogICAgICAgICAgICBpbiB0aGUgbWFzay4KKyAgICAgKiBccGFyYW0gYWxsIG1pbmltdW0gZG9tYWluIG1hc2suIFJldHVybmVkIHBhcmFtZXRlcnMgbXVzdCBtYXRjaCBhbGwgb2YgdGhlIGRvbWFpbnMgaW4gdGhlCisgICAgICogICAgICAgICAgICBtYXNrLiBUaGlzIGlzIHJlc3RyaWN0ZWQgdG8gdGhlIGJpdHMgb2YgdGhlIG1heGltdW0gbWFzay4KKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZ2V0UGF0aHNGb3JEb21haW4oCisgICAgICAgICAgICBEb21haW4gYW55LCBEb21haW4gYWxsID0gRG9tYWluOjpBTEwpIGNvbnN0IHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlczsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4+ICZlbCA6IG1Db25maWdNYXBwZXJzKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IENvbmZpZ01hcHBlciAmY20gOiBlbC5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiZmlsdGVyaW5nICVzICV4ICV4ICV4ICV4IiwgY20ucGF0aCgpLmNfc3RyKCksIGNtLmRvbWFpbigpLCBhbnksCisgICAgICAgICAgICAgICAgICAgICAgICAoY20uZG9tYWluKCkgJiBhbnkpLCAoY20uZG9tYWluKCkgJiBhbnkgJiBhbGwpKTsKKyAgICAgICAgICAgICAgICBpZiAoKGNtLmRvbWFpbigpICYgYW55KSAmJiAoKGNtLmRvbWFpbigpICYgYW55ICYgYWxsKSA9PSAoYW55ICYgYWxsKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2hfYmFjayhjbS5wYXRoKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgU0RLIDw9PiBDb2RlYyAyLjAgbWFwcGluZ3MuCisgICAgICoKKyAgICAgKiBUT0RPOiByZXBsYWNlIHRoZXNlIHdpdGggYmV0dGVyIG1ldGhvZHMgYXMgdGhpcyBleHBvc2VzIHRoZSBpbm5lciBzdHJ1Y3R1cmUuCisgICAgICovCisgICAgY29uc3Qgc3RkOjptYXA8U2RrS2V5LCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+PiBnZXRLZXlzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNvbmZpZ01hcHBlcnM7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6bWFwPFNka0tleSwgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPj4gbUNvbmZpZ01hcHBlcnM7Cit9OworCitjb25zdCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+IFN0YW5kYXJkUGFyYW1zOjpOT19NQVBQRVJTOworCisKK0NDb2RlY0NvbmZpZzo6Q0NvZGVjQ29uZmlnKCkKKyAgICA6IG1JbnB1dEZvcm1hdChuZXcgQU1lc3NhZ2UpLAorICAgICAgbU91dHB1dEZvcm1hdChuZXcgQU1lc3NhZ2UpLAorICAgICAgbVVzaW5nU3VyZmFjZShmYWxzZSkgeyB9CisKK3ZvaWQgQ0NvZGVjQ29uZmlnOjppbml0aWFsaXplU3RhbmRhcmRQYXJhbXMoKSB7CisgICAgdHlwZWRlZiBEb21haW4gRDsKKyAgICBtU3RhbmRhcmRQYXJhbXMgPSBzdGQ6Om1ha2Vfc2hhcmVkPFN0YW5kYXJkUGFyYW1zPigpOworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBDb25maWdNYXBwZXIgJik+IGFkZCA9CisgICAgICAgIFtwYXJhbXMgPSBtU3RhbmRhcmRQYXJhbXNdKGNvbnN0IENvbmZpZ01hcHBlciAmY20pIHsKKyAgICAgICAgICAgIHBhcmFtcy0+YWRkKGNtKTsKKyAgICB9OworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBDb25maWdNYXBwZXIgJik+IGRlcHJlY2F0ZWQgPSBhZGQ7CisKKyAgICAvLyBhbGxvdyBpbnQzMiBvciBmbG9hdCBTREsgdmFsdWVzIGFuZCByZXByZXNlbnQgdGhlbSBhcyBmbG9hdAorICAgIENvbmZpZ01hcHBlcjo6TWFwcGVyIG1ha2VGbG9hdCA9IFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgIC8vIGNvbnZlcnQgZnJvbSBpMzIgdG8gZmxvYXQKKyAgICAgICAgaW50MzJfdCBpMzJWYWx1ZTsKKyAgICAgICAgZmxvYXQgZnBWYWx1ZTsKKyAgICAgICAgaWYgKHYuZ2V0KCZpMzJWYWx1ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAoZmxvYXQpaTMyVmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAodi5nZXQoJmZwVmFsdWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZnBWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgIH07CisKKyAgICBDb25maWdNYXBwZXI6Ok1hcHBlciBuZWdhdGUgPSBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIC12YWx1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgIH07CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9NSU1FLCAgICAgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRSwgICAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6SU5QVVQgJiBEOjpSRUFEKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUlNRSwgICAgIEMyX1BBUkFNS0VZX09VVFBVVF9NRURJQV9UWVBFLCAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6Ok9VVFBVVCAmIEQ6OlJFQUQpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0JJVF9SQVRFLCBDMl9QQVJBTUtFWV9CSVRSQVRFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6T1VUUFVUKSk7CisgICAgLy8gd2UgYWxzbyBuZWVkIHRvIHB1dCB0aGUgYml0cmF0ZSBpbiB0aGUgbWF4IGJpdHJhdGUgZmllbGQKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9NQVhfQklUX1JBVEUsIEMyX1BBUkFNS0VZX0JJVFJBVEUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpSRUFEICYgRDo6T1VUUFVUKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihQQVJBTUVURVJfS0VZX1ZJREVPX0JJVFJBVEUsIEMyX1BBUkFNS0VZX0JJVFJBVEUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpWSURFTyAmIEQ6OlBBUkFNKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQklUUkFURV9NT0RFLCBDMl9QQVJBTUtFWV9CSVRSQVRFX01PREUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpDT0RFRCkKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QgbW9kZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpICYmIEMyTWFwcGVyOjptYXAodmFsdWUsICZtb2RlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtb2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworICAgIC8vIHJlbW92ZSB3aGVuIGNvZGVjcyBzd2l0Y2ggdG8gUEFSQU1LRVkgYW5kIG5ldyBtb2RlcworICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKEtFWV9CSVRSQVRFX01PREUsICJjb2RlZC5iaXRyYXRlLW1vZGUiLCAidmFsdWUiKQorICAgICAgICAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUikpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0ZSQU1FX1JBVEUsIEMyX1BBUkFNS0VZX0ZSQU1FX1JBVEUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPKQorICAgICAgICAud2l0aE1hcHBlcnMobWFrZUZsb2F0LCBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgLy8gcmVhZCBiYWNrIGFsd2F5cyBhcyBpbnQKKyAgICAgICAgICAgIGZsb2F0IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGludDMyX3QpdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9NQVhfSU5QVVRfU0laRSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpJTlBVVCkpOworICAgIC8vIHJlbW92ZSB3aGVuIGNvZGVjcyBzd2l0Y2ggdG8gUEFSQU1LRVkKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihLRVlfTUFYX0lOUFVUX1NJWkUsICJjb2RlZC5tYXgtZnJhbWUtc2l6ZSIsICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAubGltaXRUbyhEOjpJTlBVVCkpOworCisgICAgLy8gUm90YXRpb24KKyAgICAvLyBOb3RlOiBTREsgcm90YXRpb24gaXMgY2xvY2std2lzZSwgd2hpbGUgQzIgcm90YXRpb24gaXMgY291bnRlci1jbG9jay13aXNlCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUk9UQVRJT04sIEMyX1BBUkFNS0VZX1ZVSV9ST1RBVElPTiwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpDT0RFRCkKKyAgICAgICAgLndpdGhNYXBwZXJzKG5lZ2F0ZSwgbmVnYXRlKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUk9UQVRJT04sIEMyX1BBUkFNS0VZX1JPVEFUSU9OLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhNYXBwZXJzKG5lZ2F0ZSwgbmVnYXRlKSk7CisKKyAgICAvLyBhbmRyb2lkICd2aWRlby1zY2FsaW5nJworICAgIGFkZChDb25maWdNYXBwZXIoImFuZHJvaWQuX3ZpZGVvLXNjYWxpbmciLCBDMl9QQVJBTUtFWV9TVVJGQUNFX1NDQUxJTkdfTU9ERSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpERUNPREVSICYgRDo6UkFXKSk7CisKKyAgICAvLyBDb2xvciBBc3BlY3RzCisgICAgLy8KKyAgICAvLyBjb25maWd1cmUgZGVmYXVsdCBmb3IgZGVjb2RlcnMKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9SQU5HRSwgICAgICAgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTLCAgICJyYW5nZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6Q09ERUQgJiAoRDo6Q09ORklHIHwgRDo6UEFSQU0pKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjpyYW5nZV90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgICAgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTLCAgICJ0cmFuc2ZlciIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6Q09ERUQgJiAoRDo6Q09ORklHIHwgRDo6UEFSQU0pKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjp0cmFuc2Zlcl90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1wcmltYXJpZXMiLCAgICAgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTLCAgICJwcmltYXJpZXMiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OkNPREVEICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNKSkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLW1hdHJpeCIsICAgICAgICBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMsICAgIm1hdHJpeCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6Q09ERUQgJiAoRDo6Q09ORklHIHwgRDo6UEFSQU0pKSk7CisKKyAgICAvLyByZWFkIGJhY2sgZmluYWwgZm9yIGRlY29kZXIgb3V0cHV0IChhbHNvLCBjb25maWd1cmUgZmluYWwgYXNwZWN0cyBhcyB3ZWxsLiBUaGlzIHNob3VsZCBiZQorICAgIC8vIG92ZXJ3cml0dGVuIGJhc2VkIG9uIGNvZGVkL2RlZmF1bHQgdmFsdWVzIGlmIGNvbXBvbmVudCBzdXBwb3J0cyBjb2xvciBhc3BlY3RzLCBidXQgaXMgdXNlZAorICAgIC8vIGFzIGZpbmFsIHZhbHVlcyBpZiBjb21wb25lbnQgZG9lcyBub3Qgc3VwcG9ydCBhc3BlY3RzIGF0IGFsbCkKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9SQU5HRSwgICAgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAicmFuZ2UiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6cmFuZ2VfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfVFJBTlNGRVIsICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInRyYW5zZmVyIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnRyYW5zZmVyX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLXByaW1hcmllcyIsICAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJwcmltYXJpZXMiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLW1hdHJpeCIsICAgICAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJtYXRyaXgiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OlJBVykpOworCisgICAgLy8gY29uZmlndXJlIHNvdXJjZSBhc3BlY3RzIGZvciBlbmNvZGVycyBhbmQgcmVhZCB0aGVtIGJhY2sgb24gdGhlIGNvZGVkKCEpIHBvcnQuCisgICAgLy8gVGhpcyBpcyB0byBlbnN1cmUgbXV4aW5nIHRoZSBkZXNpcmVkIGFzcGVjdHMgaW50byB0aGUgY29udGFpbmVyLgorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1JBTkdFLCAgICAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJyYW5nZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6Q09ERUQpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnJhbmdlX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1RSQU5TRkVSLCAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJ0cmFuc2ZlciIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6Q09ERUQpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnRyYW5zZmVyX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLXByaW1hcmllcyIsICAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJwcmltYXJpZXMiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OkNPREVEKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItbWF0cml4IiwgICAgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgIm1hdHJpeCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6Q09ERUQpKTsKKworICAgIC8vIHJlYWQgYmFjayBjb2RlZCBhc3BlY3RzIGZvciBlbmNvZGVycyAob24gdGhlIHJhdyBwb3J0KSwgYnV0IGFsc28gY29uZmlndXJlCisgICAgLy8gZGVzaXJlZCBhc3BlY3RzIGhlcmUuCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfUkFOR0UsICAgICAgIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTLCAgICJyYW5nZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6UkFXKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjpyYW5nZV90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgICAgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMsICAgInRyYW5zZmVyIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpSQVcpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnRyYW5zZmVyX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLXByaW1hcmllcyIsICAgICBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUywgICAicHJpbWFyaWVzIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1tYXRyaXgiLCAgICAgICAgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMsICAgIm1hdHJpeCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6UkFXKSk7CisKKyAgICAvLyBEYXRhc3BhY2UKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCBDMl9QQVJBTUtFWV9EQVRBX1NQQUNFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKworICAgIC8vIEhEUgorICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5yZWQueCIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5yZWQueCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5yZWQueSIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5yZWQueSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5ncmVlbi54IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLmdyZWVuLngiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYuZ3JlZW4ueSIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5ncmVlbi55IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LmJsdWUueCIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5ibHVlLngiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYuYmx1ZS55IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLmJsdWUueSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni53aGl0ZS54IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLndoaXRlLngiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYud2hpdGUueSIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy53aGl0ZS55IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2Lm1heC1sdW1pbmFuY2UiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcubWF4LWx1bWluYW5jZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5taW4tbHVtaW5hbmNlIiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLm1pbi1sdW1pbmFuY2UiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjdGE4NjEubWF4LWNsbCIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1heC1jbGwiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjdGE4NjEubWF4LWZhbGwiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXgtZmFsbCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihzdGQ6OnN0cmluZyhLRVlfRkVBVFVSRV8pICsgRkVBVFVSRV9TZWN1cmVQbGF5YmFjaywKKyAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1NFQ1VSRV9NT0RFLCAidmFsdWUiKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJwcmVwZW5kLXNwcy1wcHMtdG8taWRyLWZyYW1lcyIsCisgICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9QUkVQRU5EX0hFQURFUl9NT0RFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6VklERU8pCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkgJiYgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZShDMkNvbmZpZzo6UFJFUEVORF9IRUFERVJfVE9fQUxMX1NZTkMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZShDMkNvbmZpZzo6UFJFUEVORF9IRUFERVJfVE9fTk9ORSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pKTsKKyAgICAvLyByZW1vdmUgd2hlbiBjb2RlY3Mgc3dpdGNoIHRvIFBBUkFNS0VZCisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoInByZXBlbmQtc3BzLXBwcy10by1pZHItZnJhbWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29kaW5nLmFkZC1jc2QtdG8tc3luYy1mcmFtZXMiLCAidmFsdWUiKQorICAgICAgICAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlZJREVPKSk7CisgICAgLy8gY29udmVydCB0byB0aW1lc3RhbXAgYmFzZQorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0lfRlJBTUVfSU5URVJWQUwsIEMyX1BBUkFNS0VZX1NZTkNfRlJBTUVfSU5URVJWQUwsICJ2YWx1ZSIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICAvLyBjb252ZXJ0IGZyb20gaTMyIHRvIGZsb2F0CisgICAgICAgICAgICBpbnQzMl90IGkzMlZhbHVlOworICAgICAgICAgICAgZmxvYXQgZnBWYWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmaTMyVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGludDY0X3QoMTAwMDAwMCkgKiBpMzJWYWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodi5nZXQoJmZwVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGludDY0X3QoYzJfbWluKDEwMDAwMDAgKiBmcFZhbHVlICsgMC41LCAoZG91YmxlKUlOVDY0X01BWCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworICAgIC8vIHJlbW92ZSB3aGVuIGNvZGVjcyBzd2l0Y2ggdG8gcHJvcGVyIGNvZGluZy5nb3AgKGFkZCBzdXBwb3J0IGZvciBjYWxjdWxhdGluZyBnb3ApCisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoImktZnJhbWUtcGVyaW9kIiwgImNvZGluZy5nb3AiLCAiaW50cmEtcGVyaW9kIikKKyAgICAgICAgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpWSURFTykpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0lOVFJBX1JFRlJFU0hfUEVSSU9ELCBDMl9QQVJBTUtFWV9JTlRSQV9SRUZSRVNILCAicGVyaW9kIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpFTkNPREVSKQorICAgICAgICAud2l0aE1hcHBlcnMobWFrZUZsb2F0LCBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgLy8gcmVhZCBiYWNrIGFsd2F5cyBhcyBpbnQKKyAgICAgICAgICAgIGZsb2F0IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGludDMyX3QpdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUVVBTElUWSwgQzJfUEFSQU1LRVlfUVVBTElUWSwgInZhbHVlIikpOworICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKFBBUkFNRVRFUl9LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgImNvZGluZy5yZXF1ZXN0LXN5bmMiLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpQQVJBTSAmIEQ6OkVOQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUpIC0+IEMyVmFsdWUgeyByZXR1cm4gdWludDMyX3QoMSk7IH0pKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKFBBUkFNRVRFUl9LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FLAorICAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpQQVJBTSAmIEQ6OkVOQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUpIC0+IEMyVmFsdWUgeyByZXR1cm4gdWludDMyX3QoMSk7IH0pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX09QRVJBVElOR19SQVRFLCAgIEMyX1BBUkFNS0VZX09QRVJBVElOR19SQVRFLCAgICAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6UEFSQU0gfCBEOjpDT05GSUcpIC8vIHdyaXRlLW9ubHkKKyAgICAgICAgLndpdGhNYXBwZXIobWFrZUZsb2F0KSk7CisgICAgLy8gQzIgcHJpb3JpdGllcyBhcmUgaW52ZXJ0ZWQKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9QUklPUklUWSwgICAgICAgICBDMl9QQVJBTUtFWV9QUklPUklUWSwgICAgICAgICAgICJ2YWx1ZSIpCisgICAgICAgIC53aXRoTWFwcGVycyhuZWdhdGUsIG5lZ2F0ZSkpOworICAgIC8vIHJlbW92ZSB3aGVuIGNvZGVjcyBzd2l0Y2ggdG8gUEFSQU1LRVkKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihLRVlfT1BFUkFUSU5HX1JBVEUsICAgImN0cmwub3BlcmF0aW5nLXJhdGUiLCAgICAgInZhbHVlIikKKyAgICAgICAgICAgICAgIC53aXRoTWFwcGVyKG1ha2VGbG9hdCkpOworICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKEtFWV9QUklPUklUWSwgICAgICAgICAiY3RybC5wcmlvcml0eSIsICAgICAgICAgICAidmFsdWUiKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9XSURUSCwgICAgICAgICBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUsICAgICAgICJ3aWR0aCIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPIHwgRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9IRUlHSFQsICAgICAgICBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUsICAgICAgICJoZWlnaHQiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjcm9wLWxlZnQiLCAgICAgICBDMl9QQVJBTUtFWV9DUk9QX1JFQ1QsICAgICAgICJsZWZ0IikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gfCBEOjpJTUFHRSkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNyb3AtdG9wIiwgICAgICAgIEMyX1BBUkFNS0VZX0NST1BfUkVDVCwgICAgICAgInRvcCIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPIHwgRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjcm9wLXdpZHRoIiwgICAgICBDMl9QQVJBTUtFWV9DUk9QX1JFQ1QsICAgICAgICJ3aWR0aCIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPIHwgRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjcm9wLWhlaWdodCIsICAgICBDMl9QQVJBTUtFWV9DUk9QX1JFQ1QsICAgICAgICJoZWlnaHQiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9NQVhfV0lEVEgsICAgICBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFLCAgICAid2lkdGgiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9NQVhfSEVJR0hULCAgICBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFLCAgICAiaGVpZ2h0IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjc2QtMCIsICAgICAgICAgICBDMl9QQVJBTUtFWV9JTklUX0RBVEEsICAgICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6Ok9VVFBVVCAmIEQ6OlJFQUQpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0hEUjEwX1BMVVNfSU5GTywgQzJfUEFSQU1LRVlfSU5QVVRfSERSMTBfUExVU19JTkZPLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OlBBUkFNICYgRDo6SU5QVVQpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0hEUjEwX1BMVVNfSU5GTywgQzJfUEFSQU1LRVlfT1VUUFVUX0hEUjEwX1BMVVNfSU5GTywgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpPVVRQVVQpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoQzJfUEFSQU1LRVlfVEVNUE9SQUxfTEFZRVJJTkcsIEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCAiIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlZJREVPICYgRDo6T1VUUFVUKSk7CisKKyAgICAvLyBQaXhlbCBGb3JtYXQgKHVzZSBsb2NhbCBrZXkgZm9yIGFjdHVhbCBwaXhlbCBmb3JtYXQgYXMgd2UgZG9uJ3QgZGlzdGluZ3Vpc2ggYmV0d2VlbgorICAgIC8vIFNESyBsYXlvdXRzIGZvciBmbGV4aWJsZSBmb3JtYXQgYW5kIHdlIG5lZWQgdGhlIGFjdHVhbCBTREsgY29sb3IgZm9ybWF0IGluIHRoZSBtZWRpYSBmb3JtYXQpCisgICAgYWRkKENvbmZpZ01hcHBlcigiYW5kcm9pZC5fY29sb3ItZm9ybWF0IiwgIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKQorICAgICAgICAud2l0aE1hcHBlcnMoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRTdXJmYWNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1aW50MzJfdClIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHVpbnQzMl90KUhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4ODsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodWludDMyX3QpSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBzb21lIHNvcnQgb2YgcGFzc3Rocm91Z2gKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0sIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDT0xPUl9Gb3JtYXRTdXJmYWNlOworICAgICAgICAgICAgICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWVYxMjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODg6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IHNvbWUgc29ydCBvZiBwYXNzdGhyb3VnaAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ0hBTk5FTF9DT1VOVCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCwgICAgICAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8pKTsgLy8gcmVhZCBiYWNrIHRvIGJvdGggZm9ybWF0cworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NIQU5ORUxfQ09VTlQsIEMyX1BBUkFNS0VZX0NPREVEX0NIQU5ORUxfQ09VTlQsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6Q09ERUQpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1NBTVBMRV9SQVRFLCAgIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFLCAgICAgICAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8pKTsgLy8gcmVhZCBiYWNrIHRvIGJvdGggcG9ydCBmb3JtYXRzCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfU0FNUExFX1JBVEUsICAgQzJfUEFSQU1LRVlfQ09ERURfU0FNUExFX1JBVEUsICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkNPREVEKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9QQ01fRU5DT0RJTkcsICBDMl9QQVJBTUtFWV9QQ01fRU5DT0RJTkcsICAgICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPKQorICAgICAgICAud2l0aE1hcHBlcnMoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgdG87CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHZhbHVlLCAmdG8pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSwgW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCB2YWx1ZTsKKyAgICAgICAgICAgIGludDMyX3QgdG87CisgICAgICAgICAgICB1c2luZyBDMlZhbHVlVHlwZT10eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPGRlY2x0eXBlKHZhbHVlKT46OnR5cGU7CisgICAgICAgICAgICBpZiAodi5nZXQoKEMyVmFsdWVUeXBlKikmdmFsdWUpICYmIEMyTWFwcGVyOjptYXAodmFsdWUsICZ0bykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG87CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9JU19BRFRTLCBDMl9QQVJBTUtFWV9BQUNfUEFDS0FHSU5HLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkNPREVEKQorICAgICAgICAud2l0aE1hcHBlcnMoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSAmJiB2YWx1ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19BRFRTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSwgW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkgJiYgdmFsdWUgPT0gQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfQURUUykgeworICAgICAgICAgICAgICAgIHJldHVybiAoaW50MzJfdCkxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTWFwcGVyOjpQcm9maWxlTGV2ZWxNYXBwZXI+IG1hcHBlciA9CisgICAgICAgIEMyTWFwcGVyOjpHZXRQcm9maWxlTGV2ZWxNYXBwZXIobUNvZGluZ01lZGlhVHlwZSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9QUk9GSUxFLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMLCAicHJvZmlsZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkNPREVEKQorICAgICAgICAud2l0aE1hcHBlcnMoW21hcHBlcl0oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpwcm9maWxlX3QgYzIgPSBQUk9GSUxFX1VOVVNFRDsKKyAgICAgICAgICAgIGludDMyX3Qgc2RrOworICAgICAgICAgICAgaWYgKG1hcHBlciAmJiB2LmdldCgmc2RrKSAmJiBtYXBwZXItPm1hcFByb2ZpbGUoc2RrLCAmYzIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFBST0ZJTEVfVU5VU0VEOworICAgICAgICB9LCBbbWFwcGVyXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgQzJDb25maWc6OnByb2ZpbGVfdCBjMjsKKyAgICAgICAgICAgIGludDMyX3Qgc2RrOworICAgICAgICAgICAgdXNpbmcgQzJWYWx1ZVR5cGU9dHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxkZWNsdHlwZShjMik+Ojp0eXBlOworICAgICAgICAgICAgaWYgKG1hcHBlciAmJiB2LmdldCgoQzJWYWx1ZVR5cGUqKSZjMikgJiYgbWFwcGVyLT5tYXBQcm9maWxlKGMyLCAmc2RrKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzZGs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9MRVZFTCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCwgImxldmVsIikKKyAgICAgICAgLmxpbWl0VG8oRDo6Q09ERUQpCisgICAgICAgIC53aXRoTWFwcGVycyhbbWFwcGVyXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgYzIgPSBMRVZFTF9VTlVTRUQ7CisgICAgICAgICAgICBpbnQzMl90IHNkazsKKyAgICAgICAgICAgIGlmIChtYXBwZXIgJiYgdi5nZXQoJnNkaykgJiYgbWFwcGVyLT5tYXBMZXZlbChzZGssICZjMikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTEVWRUxfVU5VU0VEOworICAgICAgICB9LCBbbWFwcGVyXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgYzI7CisgICAgICAgICAgICBpbnQzMl90IHNkazsKKyAgICAgICAgICAgIHVzaW5nIEMyVmFsdWVUeXBlPXR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8ZGVjbHR5cGUoYzIpPjo6dHlwZTsKKyAgICAgICAgICAgIGlmIChtYXBwZXIgJiYgdi5nZXQoKEMyVmFsdWVUeXBlKikmYzIpICYmIG1hcHBlci0+bWFwTGV2ZWwoYzIsICZzZGspKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNkazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKworICAgIC8vIGNvbnZlcnQgdG8gZEJGUyBhbmQgYWRkIGRlZmF1bHQKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfRFJDX1RBUkdFVF9SRUZFUkVOQ0VfTEVWRUwsIEMyX1BBUkFNS0VZX0RSQ19UQVJHRVRfUkVGRVJFTkNFX0xFVkVMLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX1JFRl9MRVZFTCwgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmxvYXQoLTAuMjUgKiBjMl9taW4odmFsdWUsIDEyNykpOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIDAtMSAoJSkgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IsIEMyX1BBUkFNS0VZX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfQ1VULCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmxvYXQoYzJfbWluKHZhbHVlLCAxMjcpIC8gMTI3Lik7CisgICAgICAgIH0pKTsKKworICAgIC8vIGNvbnZlcnQgdG8gMC0xICglKSBhbmQgYWRkIGRlZmF1bHQKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfRFJDX0JPT1NUX0ZBQ1RPUiwgQzJfUEFSQU1LRVlfRFJDX0JPT1NUX0ZBQ1RPUiwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3BlcnR5X2dldF9pbnQzMihQUk9QX0RSQ19PVkVSUklERV9CT09TVCwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmxvYXQoYzJfbWluKHZhbHVlLCAxMjcpIC8gMTI3Lik7CisgICAgICAgIH0pKTsKKworICAgIC8vIGNvbnZlcnQgdG8gY29tcHJlc3Npb24gdHlwZSBhbmQgYWRkIGRlZmF1bHQKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfRFJDX0hFQVZZX0NPTVBSRVNTSU9OLCBDMl9QQVJBTUtFWV9EUkNfQ09NUFJFU1NJT05fTU9ERSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3BlcnR5X2dldF9pbnQzMihQUk9QX0RSQ19PVkVSUklERV9IRUFWWSwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19IRUFWWSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gMSA/IEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fSEVBVlkgOiBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0xJR0hUOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIGRCRlMgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0VOQ09ERURfVEFSR0VUX0xFVkVMLCBDMl9QQVJBTUtFWV9EUkNfRU5DT0RFRF9UQVJHRVRfTEVWRUwsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfRU5DX0xFVkVMLCBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmbG9hdCgtMC4yNSAqIGMyX21pbih2YWx1ZSwgMTI3KSk7CisgICAgICAgIH0pKTsKKworICAgIC8vIGNvbnZlcnQgdG8gZWZmZWN0IHR5cGUgKHRoZXNlIG1hcCB0byBTREsgdmFsdWVzKSBhbmQgYWRkIGRlZmF1bHQKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfRFJDX0VGRkVDVF9UWVBFLCBDMl9QQVJBTUtFWV9EUkNfRUZGRUNUX1RZUEUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAtMSB8fCB2YWx1ZSA+IDgpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3BlcnR5X2dldF9pbnQzMihQUk9QX0RSQ19PVkVSUklERV9FRkZFQ1QsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfRUZGRUNUKTsKKyAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdmFsdWUgaXMgd2l0aGluIHJhbmdlCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgLTEgfHwgdmFsdWUgPiA4KSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19FRkZFQ1Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfTUFYX09VVFBVVF9DSEFOTkVMX0NPVU5ULCBDMl9QQVJBTUtFWV9NQVhfQ0hBTk5FTF9DT1VOVCwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19TQlJfTU9ERSwgQzJfUEFSQU1LRVlfQUFDX1NCUl9NT0RFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkVOQ09ERVIgJiBEOjpDT05GSUcpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMkNvbmZpZzo6QUFDX1NCUl9BVVRPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIEMyQ29uZmlnOjpBQUNfU0JSX09GRjsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBDMkNvbmZpZzo6QUFDX1NCUl9TSU5HTEVfUkFURTsKKyAgICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBDMkNvbmZpZzo6QUFDX1NCUl9EVUFMX1JBVEU7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIEMyQ29uZmlnOjpBQUNfU0JSX0FVVE8gKyAxOyAvLyBpbnZhbGlkIHZhbHVlCisgICAgICAgICAgICB9CisgICAgICAgIH0pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1FVQUxJVFksIEMyX1BBUkFNS0VZX1FVQUxJVFksICJ2YWx1ZSIpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMLCBDMl9QQVJBTUtFWV9DT01QTEVYSVRZLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkVOQ09ERVIpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb21wbGV4aXR5IiwgQzJfUEFSQU1LRVlfQ09NUExFWElUWSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUikpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfR1JJRF9DT0xVTU5TLCBDMl9QQVJBTUtFWV9USUxFX0xBWU9VVCwgImNvbHVtbnMiKQorICAgICAgICAubGltaXRUbyhEOjpJTUFHRSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0dSSURfUk9XUywgQzJfUEFSQU1LRVlfVElMRV9MQVlPVVQsICJyb3dzIikKKyAgICAgICAgLmxpbWl0VG8oRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9USUxFX1dJRFRILCBDMl9QQVJBTUtFWV9USUxFX0xBWU9VVCwgInRpbGUud2lkdGgiKQorICAgICAgICAubGltaXRUbyhEOjpJTUFHRSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1RJTEVfSEVJR0hULCBDMl9QQVJBTUtFWV9USUxFX0xBWU9VVCwgInRpbGUuaGVpZ2h0IikKKyAgICAgICAgLmxpbWl0VG8oRDo6SU1BR0UpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0xBVEVOQ1ksIEMyX1BBUkFNS0VZX1BJUEVMSU5FX0RFTEFZX1JFUVVFU1QsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6RU5DT0RFUikpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihDMl9QQVJBTUtFWV9JTlBVVF9USU1FX1NUUkVUQ0gsIEMyX1BBUkFNS0VZX0lOUFVUX1RJTUVfU1RSRVRDSCwgInZhbHVlIikpOworCisgICAgLyogc3RpbGwgdG8gZG8KKyAgICBjb25zdGV4cHIgY2hhciBLRVlfUFVTSF9CTEFOS19CVUZGRVJTX09OX1NUT1BbXSA9ICJwdXNoLWJsYW5rLWJ1ZmZlcnMtb24tc2h1dGRvd24iOworCisgICAgICAgbm90IHlldCB1c2VkIGJ5IE1lZGlhQ29kZWMsIGJ1dCBkZWZpbmVkIGFzIE1lZGlhRm9ybWF0CisgICAgS0VZX0FVRElPX1NFU1NJT05fSUQgLy8gd2UgdXNlICJhdWRpby1ody1zeW5jIgorICAgIEtFWV9PVVRQVVRfUkVPUkRFUl9ERVBUSAorICAgICovCit9CisKK3N0YXR1c190IENDb2RlY0NvbmZpZzo6aW5pdGlhbGl6ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gJmNsaWVudCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KSB7CisgICAgQzJDb21wb25lbnREb21haW5TZXR0aW5nIGRvbWFpbihDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSKTsKKyAgICBDMkNvbXBvbmVudEtpbmRTZXR0aW5nIGtpbmQoQzJDb21wb25lbnQ6OktJTkRfT1RIRVIpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0gY29tcG9uZW50LT5xdWVyeSh7ICZkb21haW4sICZraW5kIH0sIHt9LCBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJRdWVyeSBkb21haW4gJiBraW5kIGZhaWxlZCA9PiAlcyIsIGFzU3RyaW5nKGMyZXJyKSk7CisgICAgICAgIC8vIFRFTVA6IGRldGVybWluZSBraW5kIGZyb20gY29tcG9uZW50IG5hbWUKKyAgICAgICAgaWYgKGtpbmQudmFsdWUgPT0gQzJDb21wb25lbnQ6OktJTkRfT1RIRVIpIHsKKyAgICAgICAgICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJlbmNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgICAgICBraW5kLnZhbHVlID0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiZGVjb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAga2luZC52YWx1ZSA9IEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBURU1QOiBkZXRlcm1pbmUgZG9tYWluIGZyb20gbWVkaWEgdHlwZSAocG9ydCAocHJlZmVycmVkKSBvciBzdHJlYW0gIzApCisgICAgICAgIGlmIChkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUikgeworICAgICAgICAgICAgQVN0cmluZyBtZWRpYVR5cGUgPSBRdWVyeU1lZGlhVHlwZSh0cnVlIC8qIGlucHV0ICovLCBjb21wb25lbnQpOworICAgICAgICAgICAgaWYgKG1lZGlhVHlwZS5zdGFydHNXaXRoKCJhdWRpby8iKSkgeworICAgICAgICAgICAgICAgIGRvbWFpbi52YWx1ZSA9IEMyQ29tcG9uZW50OjpET01BSU5fQVVESU87CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgICAgIGRvbWFpbi52YWx1ZSA9IEMyQ29tcG9uZW50OjpET01BSU5fVklERU87CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZS5zdGFydHNXaXRoKCJpbWFnZS8iKSkgeworICAgICAgICAgICAgICAgIGRvbWFpbi52YWx1ZSA9IEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtRG9tYWluID0gKGRvbWFpbi52YWx1ZSA9PSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPID8gRG9tYWluOjpJU19WSURFTyA6CisgICAgICAgICAgICAgICBkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRSA/IERvbWFpbjo6SVNfSU1BR0UgOgorICAgICAgICAgICAgICAgZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8gPyBEb21haW46OklTX0FVRElPIDogRG9tYWluOjpPVEhFUl9ET01BSU4pCisgICAgICAgICAgICB8IChraW5kLnZhbHVlID09IEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIgPyBEb21haW46OklTX0RFQ09ERVIgOgorICAgICAgICAgICAgICAga2luZC52YWx1ZSA9PSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSID8gRG9tYWluOjpJU19FTkNPREVSIDogRG9tYWluOjpPVEhFUl9LSU5EKTsKKworICAgIG1JbnB1dERvbWFpbiA9IERvbWFpbigoKG1Eb21haW4gJiBJU19ERUNPREVSKSA/IElTX0NPREVEIDogSVNfUkFXKSB8IElTX0lOUFVUKTsKKyAgICBtT3V0cHV0RG9tYWluID0gRG9tYWluKCgobURvbWFpbiAmIElTX0VOQ09ERVIpID8gSVNfQ09ERUQgOiBJU19SQVcpIHwgSVNfT1VUUFVUKTsKKworICAgIEFMT0dWKCJkb21haW4gaXMgJSN4ICgldSAldSkiLCBtRG9tYWluLCBkb21haW4udmFsdWUsIGtpbmQudmFsdWUpOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IHBhcmFtSW5kaWNlczsKKyAgICBzd2l0Y2ggKGtpbmQudmFsdWUpIHsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVI6CisgICAgICAgIG1Db2RpbmdNZWRpYVR5cGUgPSBRdWVyeU1lZGlhVHlwZSh0cnVlIC8qIGlucHV0ICovLCBjb21wb25lbnQpLmNfc3RyKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjoKKyAgICAgICAgbUNvZGluZ01lZGlhVHlwZSA9IFF1ZXJ5TWVkaWFUeXBlKGZhbHNlIC8qIGlucHV0ICovLCBjb21wb25lbnQpLmNfc3RyKCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG1Db2RpbmdNZWRpYVR5cGUgPSAiIjsKKyAgICB9CisKKyAgICBjMmVyciA9IGNvbXBvbmVudC0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMoJm1QYXJhbURlc2NzKTsKKyAgICBpZiAoYzJlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoIlF1ZXJ5IHN1cHBvcnRlZCBwYXJhbXMgZmFpbGVkIGFmdGVyIHJldHVybmluZyAlenUgdmFsdWVzID0+ICVzIiwKKyAgICAgICAgICAgICAgICBtUGFyYW1EZXNjcy5zaXplKCksIGFzU3RyaW5nKGMyZXJyKSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gJmRlc2MgOiBtUGFyYW1EZXNjcykgeworICAgICAgICBtU3VwcG9ydGVkSW5kaWNlcy5lbXBsYWNlKGRlc2MtPmluZGV4KCkpOworICAgIH0KKworICAgIG1SZWZsZWN0b3IgPSBjbGllbnQtPmdldFBhcmFtUmVmbGVjdG9yKCk7CisgICAgaWYgKG1SZWZsZWN0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBwYXJhbSByZWZsZWN0b3IiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLy8gZW51bWVyYXRlIGFsbCBmaWVsZHMKKyAgICBtUGFyYW1VcGRhdGVyID0gc3RkOjptYWtlX3NoYXJlZDxSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI+KCk7CisgICAgbVBhcmFtVXBkYXRlci0+Y2xlYXIoKTsKKyAgICBtUGFyYW1VcGRhdGVyLT5zdXBwb3J0V2hvbGVQYXJhbSgKKyAgICAgICAgICAgIEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6OkNPUkVfSU5ERVgpOworICAgIG1QYXJhbVVwZGF0ZXItPmFkZFBhcmFtRGVzYyhtUmVmbGVjdG9yLCBtUGFyYW1EZXNjcyk7CisKKyAgICAvLyBURU1QOiBhZGQgc29tZSBzdGFuZGFyZCBmaWVsZHMgZXZlbiBpZiBub3QgcmVmbGVjdGVkCisgICAgaWYgKGtpbmQudmFsdWUgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUikgeworICAgICAgICBtUGFyYW1VcGRhdGVyLT5hZGRTdGFuZGFyZFBhcmFtPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+KEMyX1BBUkFNS0VZX0lOSVRfREFUQSk7CisgICAgfQorICAgIGlmIChkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRSB8fCBkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTykgeworICAgICAgICBpZiAoa2luZC52YWx1ZSAhPSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSKSB7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+KEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtPEMyU3RyZWFtQ3JvcFJlY3RJbmZvOjpvdXRwdXQ+KEMyX1BBUkFNS0VZX0NST1BfUkVDVCk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1QaXhlbEFzcGVjdFJhdGlvSW5mbzo6b3V0cHV0KDB1LCAxdSwgMXUpLAorICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9QSVhFTF9BU1BFQ1RfUkFUSU8pOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbShuZXcgQzJTdHJlYW1Sb3RhdGlvbkluZm86Om91dHB1dCgwdSwgMCksIEMyX1BBUkFNS0VZX1JPVEFUSU9OKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW0obmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0KDB1KSwgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUyk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtPEMyU3RyZWFtRGF0YVNwYWNlSW5mbzo6b3V0cHV0PihDMl9QQVJBTUtFWV9EQVRBX1NQQUNFKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW08QzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ+KEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTyk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKG5ldyBDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzo6b3V0cHV0KDB1LCBWSURFT19TQ0FMSU5HX01PREVfU0NBTEVfVE9fRklUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfU1VSRkFDRV9TQ0FMSU5HX01PREUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbShuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCgwdSksIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpOworICAgICAgICB9CisgICAgfQorCisgICAgaW5pdGlhbGl6ZVN0YW5kYXJkUGFyYW1zKCk7CisKKyAgICAvLyBzdWJzY3JpYmUgdG8gYWxsIHN1cHBvcnRlZCBzdGFuZGFyZCAoZXhwb3NlZCkgcGFyYW1zCisgICAgLy8gVE9ETzogbGltaXQgdGhpcyB0byBwYXJhbXMgdGhhdCBhcmUgYWN0dWFsbHkgaW4gdGhlIGRvbWFpbgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmb3JtYXRLZXlzID0gbVN0YW5kYXJkUGFyYW1zLT5nZXRQYXRoc0ZvckRvbWFpbihEb21haW4oMSA8PCAzMCkpOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzOworICAgIG1QYXJhbVVwZGF0ZXItPmdldFBhcmFtSW5kaWNlc0ZvcktleXMoZm9ybWF0S2V5cywgJmluZGljZXMpOworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5pbnNlcnQoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpKTsKKworICAgIC8vIGFsc28gc3Vic2NyaWJlIHRvIHNvbWUgbm9uLVNESyBzdGFuZGFyZCBwYXJhbWV0ZXJzCisgICAgLy8gZm9yIG51bWJlciBvZiBpbnB1dC9vdXRwdXQgYnVmZmVycworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJQb3J0U3VnZ2VzdGVkQnVmZmVyQ291bnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nOjpQQVJBTV9UWVBFKTsKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworICAgIC8vIGZvciBvdXRwdXQgYnVmZmVyIGFycmF5IGFsbG9jYXRpb24KKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworICAgIC8vIGluaXQgZGF0YSAoQ1NEKQorICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OnN1YnNjcmliZVRvQ29uZmlnVXBkYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaW5kaWNlcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZykgeworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5pbnNlcnQoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpKTsKKyAgICAvLyBUT0RPOiBlbmFibGUgdGhpcyB3aGVuIGNvbXBvbmVudHMgbm8gbG9uZ2VyIGNyYXNoIG9uIHRoaXMgY29uZmlnCisgICAgaWYgKG1TdWJzY3JpYmVkSW5kaWNlcy5zaXplKCkgIT0gbVN1YnNjcmliZWRJbmRpY2VzU2l6ZSAmJiBmYWxzZSkgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gaW5kaWNlczsKKyAgICAgICAgZm9yIChDMlBhcmFtOjpJbmRleCBpeCA6IG1TdWJzY3JpYmVkSW5kaWNlcykgeworICAgICAgICAgICAgaW5kaWNlcy5wdXNoX2JhY2soaXgpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc+IHN1YnNjcmliZVR1bmluZyA9CisgICAgICAgICAgICBDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc6OkFsbG9jVW5pcXVlKGluZGljZXMpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gcmVzdWx0czsKKyAgICAgICAgYzJfc3RhdHVzX3QgYzJFcnIgPSBjb21wb25lbnQtPmNvbmZpZyh7IHN1YnNjcmliZVR1bmluZy5nZXQoKSB9LCBibG9ja2luZywgJnJlc3VsdHMpOworICAgICAgICBpZiAoYzJFcnIgIT0gQzJfT0sgJiYgYzJFcnIgIT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIHN1YnNjcmliZSB0byBwYXJhbWV0ZXJzID0+ICVzIiwgYXNTdHJpbmcoYzJFcnIpKTsKKyAgICAgICAgICAgIC8vIFRPRE86IGVycm9yCisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlN1YnNjcmliZWQgdG8gJXp1IHBhcmFtcyIsIG1TdWJzY3JpYmVkSW5kaWNlcy5zaXplKCkpOworICAgICAgICBtU3Vic2NyaWJlZEluZGljZXNTaXplID0gbVN1YnNjcmliZWRJbmRpY2VzLnNpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OnF1ZXJ5Q29uZmlndXJhdGlvbigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KSB7CisgICAgLy8gcXVlcnkgYWxsIHN1YnNjcmliZWQgcGFyYW1ldGVycworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzKG1TdWJzY3JpYmVkSW5kaWNlcy5iZWdpbigpLCBtU3Vic2NyaWJlZEluZGljZXMuZW5kKCkpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMkVyciA9IGNvbXBvbmVudC0+cXVlcnkoe30sIGluZGljZXMsIEMyX01BWV9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMkVyciAhPSBPSykgeworICAgICAgICBBTE9HSSgicXVlcnkgZmFpbGVkIGFmdGVyIHJldHVybmluZyAlenUgdmFsdWVzICglcykiLCBxdWVyaWVkLnNpemUoKSwgYXNTdHJpbmcoYzJFcnIpKTsKKyAgICAgICAgLy8gVE9ETzogZXJyb3IKKyAgICB9CisKKyAgICB1cGRhdGVDb25maWd1cmF0aW9uKHF1ZXJpZWQsIEFMTCk7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIENDb2RlY0NvbmZpZzo6dXBkYXRlQ29uZmlndXJhdGlvbigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmY29uZmlnVXBkYXRlLCBEb21haW4gZG9tYWluKSB7CisgICAgQUxPR1YoInVwZGF0aW5nIGNvbmZpZ3VyYXRpb24gd2l0aCAlenUgcGFyYW1zIiwgY29uZmlnVXBkYXRlLnNpemUoKSk7CisgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnAgOiBjb25maWdVcGRhdGUpIHsKKyAgICAgICAgaWYgKHAgJiYgKnApIHsKKyAgICAgICAgICAgIGF1dG8gaW5zZXJ0aW9uID0gbUN1cnJlbnRDb25maWcuZW1wbGFjZShwLT5pbmRleCgpLCBudWxscHRyKTsKKyAgICAgICAgICAgIGlmIChpbnNlcnRpb24uc2Vjb25kIHx8ICppbnNlcnRpb24uZmlyc3QtPnNlY29uZCAhPSAqcCkgeworICAgICAgICAgICAgICAgIGlmIChtU3VwcG9ydGVkSW5kaWNlcy5jb3VudChwLT5pbmRleCgpKSB8fCBtTG9jYWxQYXJhbXMuY291bnQocC0+aW5kZXgoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gb25seSB0cmFjayBjaGFuZ2VzIGluIHN1cHBvcnRlZCAocmVmbGVjdGVkIG9yIGxvY2FsKSBpbmRpY2VzCisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJhbiB1bmxpc3RlZCBjb25maWcgd2FzICVzOiAlI3giLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGlvbi5zZWNvbmQgPyAiYWRkZWQiIDogInVwZGF0ZWQiLCBwLT5pbmRleCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnNlcnRpb24uZmlyc3QtPnNlY29uZCA9IHN0ZDo6bW92ZShwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJ1cGRhdGVkIGNvbmZpZ3VyYXRpb24gaGFzICV6dSBwYXJhbXMgKCVzKSIsIG1DdXJyZW50Q29uZmlnLnNpemUoKSwKKyAgICAgICAgICAgIGNoYW5nZWQgPyAiQ0hBTkdFRCIgOiAibm8gY2hhbmdlIik7CisgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgcmV0dXJuIHVwZGF0ZUZvcm1hdHMoZG9tYWluKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENDb2RlY0NvbmZpZzo6dXBkYXRlRm9ybWF0cyhEb21haW4gZG9tYWluKSB7CisgICAgLy8gZ2V0IGFkZHJlc3NlcyBvZiBwYXJhbXMgaW4gdGhlIGN1cnJlbnQgY29uZmlnCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IG1DdXJyZW50Q29uZmlnKSB7CisgICAgICAgIHBhcmFtUG9pbnRlcnMucHVzaF9iYWNrKGl0LnNlY29uZC5nZXQoKSk7CisgICAgfQorCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IHJlZmxlY3RlZCA9IG1QYXJhbVVwZGF0ZXItPmdldFBhcmFtcyhwYXJhbVBvaW50ZXJzKTsKKyAgICBBTE9HRCgiYzIgY29uZmlnIGlzICVzIiwgcmVmbGVjdGVkLmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICBpZiAoZG9tYWluICYgbUlucHV0RG9tYWluKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBvbGRGb3JtYXQgPSBtSW5wdXRGb3JtYXQ7CisgICAgICAgIG1JbnB1dEZvcm1hdCA9IG1JbnB1dEZvcm1hdC0+ZHVwKCk7IC8vIHRyaWdnZXIgZm9ybWF0IGNoYW5nZWQKKyAgICAgICAgbUlucHV0Rm9ybWF0LT5leHRlbmQoZ2V0U2RrRm9ybWF0Rm9yRG9tYWluKHJlZmxlY3RlZCwgbUlucHV0RG9tYWluKSk7CisgICAgICAgIGlmIChtSW5wdXRGb3JtYXQtPmNvdW50RW50cmllcygpICE9IG9sZEZvcm1hdC0+Y291bnRFbnRyaWVzKCkKKyAgICAgICAgICAgICAgICB8fCBtSW5wdXRGb3JtYXQtPmNoYW5nZXNGcm9tKG9sZEZvcm1hdCktPmNvdW50RW50cmllcygpID4gMCkgeworICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW5wdXRGb3JtYXQgPSBvbGRGb3JtYXQ7IC8vIG5vIGNoYW5nZQorICAgICAgICB9CisgICAgfQorICAgIGlmIChkb21haW4gJiBtT3V0cHV0RG9tYWluKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBvbGRGb3JtYXQgPSBtT3V0cHV0Rm9ybWF0OworICAgICAgICBtT3V0cHV0Rm9ybWF0ID0gbU91dHB1dEZvcm1hdC0+ZHVwKCk7IC8vIHRyaWdnZXIgb3V0cHV0IGZvcm1hdCBjaGFuZ2VkCisgICAgICAgIG1PdXRwdXRGb3JtYXQtPmV4dGVuZChnZXRTZGtGb3JtYXRGb3JEb21haW4ocmVmbGVjdGVkLCBtT3V0cHV0RG9tYWluKSk7CisgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5jb3VudEVudHJpZXMoKSAhPSBvbGRGb3JtYXQtPmNvdW50RW50cmllcygpCisgICAgICAgICAgICAgICAgfHwgbU91dHB1dEZvcm1hdC0+Y2hhbmdlc0Zyb20ob2xkRm9ybWF0KS0+Y291bnRFbnRyaWVzKCkgPiAwKSB7CisgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQgPSBvbGRGb3JtYXQ7IC8vIG5vIGNoYW5nZQorICAgICAgICB9CisgICAgfQorICAgIEFMT0dWX0lGKGNoYW5nZWQsICJmb3JtYXQocykgY2hhbmdlZCIpOworICAgIHJldHVybiBjaGFuZ2VkOworfQorCitzcDxBTWVzc2FnZT4gQ0NvZGVjQ29uZmlnOjpnZXRTZGtGb3JtYXRGb3JEb21haW4oCisgICAgICAgIGNvbnN0IFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCAmcmVmbGVjdGVkLCBEb21haW4gcG9ydERvbWFpbikgY29uc3QgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2U7CisgICAgZm9yIChjb25zdCBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4+ICZlbCA6IG1TdGFuZGFyZFBhcmFtcy0+Z2V0S2V5cygpKSB7CisgICAgICAgIGZvciAoY29uc3QgQ29uZmlnTWFwcGVyICZjbSA6IGVsLnNlY29uZCkgeworICAgICAgICAgICAgaWYgKChjbS5kb21haW4oKSAmIHBvcnREb21haW4pID09IDAgLy8gaW5wdXQtb3V0cHV0LWNvZGVkLXJhdworICAgICAgICAgICAgICAgIHx8IChjbS5kb21haW4oKSAmIG1Eb21haW4pICE9IG1Eb21haW4gLy8gY29tcG9uZW50IGRvbWFpbiArIGtpbmQgKHRoZXNlIG11c3QgbWF0Y2gpCisgICAgICAgICAgICAgICAgfHwgKGNtLmRvbWFpbigpICYgSVNfUkVBRCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBpdCA9IHJlZmxlY3RlZC5maW5kKGNtLnBhdGgoKSk7CisgICAgICAgICAgICBpZiAoaXQgPT0gcmVmbGVjdGVkLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDMlZhbHVlIGMyVmFsdWU7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZWYWx1ZTsKKyAgICAgICAgICAgIEFTdHJpbmcgc3RyVmFsdWU7CisgICAgICAgICAgICBBTWVzc2FnZTo6SXRlbURhdGEgaXRlbTsKKyAgICAgICAgICAgIGlmIChpdC0+c2Vjb25kLmZpbmQoJmMyVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgaXRlbSA9IGNtLm1hcFRvTWVzc2FnZShjMlZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXQtPnNlY29uZC5maW5kKCZidWZWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBpdGVtLnNldChidWZWYWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGl0LT5zZWNvbmQuZmluZCgmc3RyVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXQoc3RyVmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgidW5leHBlY3RlZCB1bnR5cGVkIHF1ZXJ5IHZhbHVlIGZvciBrZXk6ICVzIiwgY20ucGF0aCgpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNnLT5zZXRJdGVtKGVsLmZpcnN0LmNfc3RyKCksIGl0ZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgeyAvLyBjb252ZXJ0IGZyb20gQ29kZWMgMi4wIHJlY3QgdG8gTWVkaWFGb3JtYXQgcmVjdCBhbmQgYWRkIGNyb3AgcmVjdCBpZiBub3QgcHJlc2VudAorICAgICAgICBpbnQzMl90IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjcm9wLWxlZnQiLCAmbGVmdCkgJiYgbXNnLT5maW5kSW50MzIoImNyb3Atd2lkdGgiLCAmd2lkdGgpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoImNyb3AtdG9wIiwgJnRvcCkgJiYgbXNnLT5maW5kSW50MzIoImNyb3AtaGVpZ2h0IiwgJmhlaWdodCkKKyAgICAgICAgICAgICAgICAmJiBsZWZ0ID49IDAgJiYgd2lkdGggPj0wICYmIHdpZHRoIDw9IElOVDMyX01BWCAtIGxlZnQKKyAgICAgICAgICAgICAgICAmJiB0b3AgPj0gMCAmJiBoZWlnaHQgPj0wICYmIGhlaWdodCA8PSBJTlQzMl9NQVggLSB0b3ApIHsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY3JvcC1sZWZ0IikpOworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjcm9wLXRvcCIpKTsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY3JvcC13aWR0aCIpKTsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY3JvcC1oZWlnaHQiKSk7CisgICAgICAgICAgICBtc2ctPnNldFJlY3QoImNyb3AiLCBsZWZ0LCB0b3AsIGxlZnQgKyB3aWR0aCAtIDEsIHRvcCArIGhlaWdodCAtIDEpOworICAgICAgICB9IGVsc2UgaWYgKG1zZy0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkgJiYgbXNnLT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7CisgICAgICAgICAgICBtc2ctPnNldFJlY3QoImNyb3AiLCAwLCAwLCB3aWR0aCAtIDEsIGhlaWdodCAtIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgeyAvLyBjb252ZXJ0IHRlbXBvcmFsIGxheWVyaW5nIHRvIHNjaGVtYQorICAgICAgICBzcDxBQnVmZmVyPiB0bXA7CisgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoQzJfUEFSQU1LRVlfVEVNUE9SQUxfTEFZRVJJTkcsICZ0bXApICYmIHRtcCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmcgKmxheWVyaW5nID0KKyAgICAgICAgICAgICAgICBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6OkZyb20oQzJQYXJhbTo6RnJvbSh0bXAtPmRhdGEoKSwgdG1wLT5zaXplKCkpKTsKKyAgICAgICAgICAgIGlmIChsYXllcmluZyAmJiBsYXllcmluZy0+bS5sYXllckNvdW50ID4gMAorICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iTGF5ZXJDb3VudCA8IGxheWVyaW5nLT5tLmxheWVyQ291bnQpIHsKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGlzIGlzIHdlYnJ0YyBjb21wYXRpYmxlCisgICAgICAgICAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoS0VZX01JTUUsICZtaW1lKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbWltZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX1ZQOCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nLT5tLmJMYXllckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChsYXllcmluZy0+bS5sYXllckNvdW50ID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGxheWVyaW5nLT5tLmxheWVyQ291bnQgPT0gMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5mbGV4Q291bnQoKSA+PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPm0uYml0cmF0ZVJhdGlvc1swXSA9PSAuNmYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChsYXllcmluZy0+bS5sYXllckNvdW50ID09IDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+ZmxleENvdW50KCkgPj0gMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMF0gPT0gLjRmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPm0uYml0cmF0ZVJhdGlvc1sxXSA9PSAuNmYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChsYXllcmluZy0+bS5sYXllckNvdW50ID09IDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+ZmxleENvdW50KCkgPj0gMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMF0gPT0gLjI1ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMV0gPT0gLjRmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPm0uYml0cmF0ZVJhdGlvc1syXSA9PSAuNmYpKSkgeworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFN0cmluZyhLRVlfVEVNUE9SQUxfTEFZRVJJTkcsIEFTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndlYnJ0Yy52cDguJXUtbGF5ZXIiLCBsYXllcmluZy0+bS5sYXllckNvdW50KSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXllcmluZy0+bS5iTGF5ZXJDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFN0cmluZyhLRVlfVEVNUE9SQUxfTEFZRVJJTkcsIEFTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuZ2VuZXJpYy4ldSsldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJpbmctPm0ubGF5ZXJDb3VudCAtIGxheWVyaW5nLT5tLmJMYXllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nLT5tLmJMYXllckNvdW50KSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXllcmluZy0+bS5iTGF5ZXJDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFN0cmluZyhLRVlfVEVNUE9SQUxfTEFZRVJJTkcsIEFTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuZ2VuZXJpYy4ldSIsIGxheWVyaW5nLT5tLmxheWVyQ291bnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoQzJfUEFSQU1LRVlfVEVNUE9SQUxfTEFZRVJJTkcpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsgLy8gY29udmVydCBjb2xvciBpbmZvCisgICAgICAgIEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllczsKKyAgICAgICAgQzJDb2xvcjo6bWF0cml4X3QgbWF0cml4OworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImNvbG9yLXByaW1hcmllcyIsIChpbnQzMl90KikmcHJpbWFyaWVzKQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKCJjb2xvci1tYXRyaXgiLCAoaW50MzJfdCopJm1hdHJpeCkpIHsKKyAgICAgICAgICAgIGludDMyX3Qgc3RhbmRhcmQ7CisKKyAgICAgICAgICAgIGlmIChDMk1hcHBlcjo6bWFwKHByaW1hcmllcywgbWF0cml4LCAmc3RhbmRhcmQpKSB7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihLRVlfQ09MT1JfU1RBTkRBUkQsIHN0YW5kYXJkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjb2xvci1wcmltYXJpZXMiKSk7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNvbG9yLW1hdHJpeCIpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gY2FsY3VsYXRlIGRhdGFzcGFjZSBmb3IgcmF3IGdyYXBoaWMgYnVmZmVycyBpZiBub3Qgc3BlY2lmaWVkIGJ5IGNvbXBvbmVudCwgb3IgaWYKKyAgICAgICAgLy8gdXNpbmcgc3VyZmFjZSB3aXRoIHVuc3BlY2lmaWVkIGFzcGVjdHMgKGFzIHRob3NlIG11c3QgYmUgZGVmYXVsdGVkIHdoaWNoIG1heSBjaGFuZ2UKKyAgICAgICAgLy8gdGhlIGRhdGFzcGFjZSkKKyAgICAgICAgaWYgKChwb3J0RG9tYWluICYgSVNfUkFXKSAmJiAobURvbWFpbiAmIChJU19JTUFHRSB8IElTX1ZJREVPKSkpIHsKKyAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFzcGFjZTsKKyAgICAgICAgICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzID0geworICAgICAgICAgICAgICAgIENvbG9yQXNwZWN0czo6UmFuZ2VVbnNwZWNpZmllZCwgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNVbnNwZWNpZmllZCwKKyAgICAgICAgICAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyVW5zcGVjaWZpZWQsIENvbG9yQXNwZWN0czo6TWF0cml4VW5zcGVjaWZpZWQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBDb2xvclV0aWxzOjpnZXRDb2xvckFzcGVjdHNGcm9tRm9ybWF0KG1zZywgYXNwZWN0cyk7CisgICAgICAgICAgICBDb2xvckFzcGVjdHMgb3JpZ0FzcGVjdHMgPSBhc3BlY3RzOworICAgICAgICAgICAgaWYgKG1Vc2luZ1N1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICAvLyBnZXQgaW1hZ2Ugc2l6ZSAoZGVmYXVsdCB0byBIRCkKKyAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoID0gMTI4MDsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCA9IDcyMDsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kUmVjdCgiY3JvcCIsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pKSB7CisgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gcmlnaHQgLSBsZWZ0ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gYm90dG9tIC0gdG9wICsgMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAodm9pZCltc2ctPmZpbmRJbnQzMihLRVlfV0lEVEgsICZ3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKW1zZy0+ZmluZEludDMyKEtFWV9IRUlHSFQsICZoZWlnaHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjpzZXREZWZhdWx0Q29kZWNDb2xvckFzcGVjdHNJZk5lZWRlZChhc3BlY3RzLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjpzZXRDb2xvckFzcGVjdHNJbnRvRm9ybWF0KGFzcGVjdHMsIG1zZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFuZHJvaWQuX2RhdGFzcGFjZSIsIChpbnQzMl90KikmZGF0YXNwYWNlKQorICAgICAgICAgICAgICAgICAgICB8fCBhc3BlY3RzLm1SYW5nZSAhPSBvcmlnQXNwZWN0cy5tUmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgfHwgYXNwZWN0cy5tUHJpbWFyaWVzICE9IG9yaWdBc3BlY3RzLm1QcmltYXJpZXMKKyAgICAgICAgICAgICAgICAgICAgfHwgYXNwZWN0cy5tVHJhbnNmZXIgIT0gb3JpZ0FzcGVjdHMubVRyYW5zZmVyCisgICAgICAgICAgICAgICAgICAgIHx8IGFzcGVjdHMubU1hdHJpeENvZWZmcyAhPSBvcmlnQXNwZWN0cy5tTWF0cml4Q29lZmZzKSB7CisgICAgICAgICAgICAgICAgZGF0YXNwYWNlID0gQ29sb3JVdGlsczo6Z2V0RGF0YVNwYWNlRm9yQ29sb3JBc3BlY3RzKGFzcGVjdHMsIHRydWUgLyogbWF5RXhwYW5kICovKTsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCBkYXRhc3BhY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSERSIHN0YXRpYyBpbmZvCisKKyAgICAgICAgQzJIZHJTdGF0aWNNZXRhZGF0YVN0cnVjdCBoZHI7CisgICAgICAgIGlmIChtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LnJlZC54IiwgJmhkci5tYXN0ZXJpbmcucmVkLngpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5yZWQueSIsICZoZHIubWFzdGVyaW5nLnJlZC55KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYuZ3JlZW4ueCIsICZoZHIubWFzdGVyaW5nLmdyZWVuLngpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5ncmVlbi55IiwgJmhkci5tYXN0ZXJpbmcuZ3JlZW4ueSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LmJsdWUueCIsICZoZHIubWFzdGVyaW5nLmJsdWUueCkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LmJsdWUueSIsICZoZHIubWFzdGVyaW5nLmJsdWUueSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LndoaXRlLngiLCAmaGRyLm1hc3RlcmluZy53aGl0ZS54KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYud2hpdGUueSIsICZoZHIubWFzdGVyaW5nLndoaXRlLnkpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5tYXgtbHVtaW5hbmNlIiwgJmhkci5tYXN0ZXJpbmcubWF4THVtaW5hbmNlKQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYubWluLWx1bWluYW5jZSIsICZoZHIubWFzdGVyaW5nLm1pbkx1bWluYW5jZSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgiY3RhODYxLm1heC1jbGwiLCAmaGRyLm1heENsbCkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgiY3RhODYxLm1heC1mYWxsIiwgJmhkci5tYXhGYWxsKSkgeworICAgICAgICAgICAgaWYgKGhkci5tYXN0ZXJpbmcucmVkLnggPj0gMCAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLnJlZC54IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5yZWQueSA+PSAwICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5yZWQueSA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuZ3JlZW4ueCA+PSAwICAgICAgICYmIGhkci5tYXN0ZXJpbmcuZ3JlZW4ueCA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuZ3JlZW4ueSA+PSAwICAgICAgICYmIGhkci5tYXN0ZXJpbmcuZ3JlZW4ueSA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuYmx1ZS54ID49IDAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuYmx1ZS54IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5ibHVlLnkgPj0gMCAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5ibHVlLnkgPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLndoaXRlLnggPj0gMCAgICAgICAmJiBoZHIubWFzdGVyaW5nLndoaXRlLnggPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLndoaXRlLnkgPj0gMCAgICAgICAmJiBoZHIubWFzdGVyaW5nLndoaXRlLnkgPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLm1heEx1bWluYW5jZSA+PSAwICAmJiBoZHIubWFzdGVyaW5nLm1heEx1bWluYW5jZSA8PSA2NTUzNQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLm1pbkx1bWluYW5jZSA+PSAwICAmJiBoZHIubWFzdGVyaW5nLm1pbkx1bWluYW5jZSA8PSA2LjU1MzUKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1heENsbCA+PSAwICAgICAgICAgICAgICAgICAgJiYgaGRyLm1heENsbCA8PSA2NTUzNQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWF4RmFsbCA+PSAwICAgICAgICAgICAgICAgICAmJiBoZHIubWF4RmFsbCA8PSA2NTUzNSkgeworICAgICAgICAgICAgICAgIEhEUlN0YXRpY0luZm8gbWV0YTsKKyAgICAgICAgICAgICAgICBtZXRhLm1JRCA9IG1ldGEua1R5cGUxOworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1SLnggPSBoZHIubWFzdGVyaW5nLnJlZC54IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tUi55ID0gaGRyLm1hc3RlcmluZy5yZWQueSAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubUcueCA9IGhkci5tYXN0ZXJpbmcuZ3JlZW4ueCAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubUcueSA9IGhkci5tYXN0ZXJpbmcuZ3JlZW4ueSAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubUIueCA9IGhkci5tYXN0ZXJpbmcuYmx1ZS54IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tQi55ID0gaGRyLm1hc3RlcmluZy5ibHVlLnkgLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1XLnggPSBoZHIubWFzdGVyaW5nLndoaXRlLnggLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1XLnkgPSBoZHIubWFzdGVyaW5nLndoaXRlLnkgLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1NYXhEaXNwbGF5THVtaW5hbmNlID0gaGRyLm1hc3RlcmluZy5tYXhMdW1pbmFuY2UgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubU1pbkRpc3BsYXlMdW1pbmFuY2UgPSBoZHIubWFzdGVyaW5nLm1pbkx1bWluYW5jZSAvIDAuMDAwMSArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tTWF4Q29udGVudExpZ2h0TGV2ZWwgPSBoZHIubWF4Q2xsICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID0gaGRyLm1heEZhbGwgKyAwLjU7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYucmVkLngiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYucmVkLnkiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYuZ3JlZW4ueCIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5ncmVlbi55IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LmJsdWUueCIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5ibHVlLnkiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYud2hpdGUueCIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni53aGl0ZS55IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2Lm1heC1sdW1pbmFuY2UiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYubWluLWx1bWluYW5jZSIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImN0YTg2MS5tYXgtY2xsIikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY3RhODYxLm1heC1mYWxsIikpOworICAgICAgICAgICAgICAgIG1zZy0+c2V0QnVmZmVyKEtFWV9IRFJfU1RBVElDX0lORk8sIEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgmbWV0YSwgc2l6ZW9mKG1ldGEpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dEKCJmb3VuZCBpbnZhbGlkIEhEUiBzdGF0aWMgbWV0YWRhdGEgJXMiLCBtc2ctPmRlYnVnU3RyaW5nKDgpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoImNvbnZlcnRlZCB0byBTREsgdmFsdWVzIGFzICVzIiwgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgIHJldHVybiBtc2c7Cit9CisKKy8vLyBjb252ZXJ0cyBhbiBBTWVzc2FnZSB2YWx1ZSB0byBhIFBhcmFtVXBkYXRlciB2YWx1ZQorc3RhdGljIHZvaWQgY29udmVydChjb25zdCBBTWVzc2FnZTo6SXRlbURhdGEgJmZyb20sIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6VmFsdWUgKnRvKSB7CisgICAgaW50MzJfdCBpbnQzMlZhbHVlOworICAgIGludDY0X3QgaW50NjRWYWx1ZTsKKyAgICBzcDxBQnVmZmVyPiBidWZWYWx1ZTsKKyAgICBBU3RyaW5nIHN0clZhbHVlOworICAgIGZsb2F0IGZsb2F0VmFsdWU7CisgICAgZG91YmxlIGRvdWJsZVZhbHVlOworCisgICAgaWYgKGZyb20uZmluZCgmaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgdG8tPnNldChpbnQzMlZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGZyb20uZmluZCgmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgdG8tPnNldChpbnQ2NFZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGZyb20uZmluZCgmYnVmVmFsdWUpKSB7CisgICAgICAgIHRvLT5zZXQoYnVmVmFsdWUpOworICAgIH0gZWxzZSBpZiAoZnJvbS5maW5kKCZzdHJWYWx1ZSkpIHsKKyAgICAgICAgdG8tPnNldChzdHJWYWx1ZSk7CisgICAgfSBlbHNlIGlmIChmcm9tLmZpbmQoJmZsb2F0VmFsdWUpKSB7CisgICAgICAgIHRvLT5zZXQoQzJWYWx1ZShmbG9hdFZhbHVlKSk7CisgICAgfSBlbHNlIGlmIChmcm9tLmZpbmQoJmRvdWJsZVZhbHVlKSkgeworICAgICAgICAvLyBjb252ZXJ0IGRvdWJsZSB0byBmbG9hdAorICAgICAgICB0by0+c2V0KEMyVmFsdWUoKGZsb2F0KWRvdWJsZVZhbHVlKSk7CisgICAgfQorICAgIC8vIGlnbm9yZSBhbGwgb3RoZXIgQU1lc3NhZ2UgdHlwZXMKK30KKworLy8vIHJlbGF4ZXMgQ29kZWMgMi4wIHNwZWNpZmljIHZhbHVlIHR5cGVzIHRvIFNESyB0eXBlcyAobWFpbmx5IHJlbW92ZXMgc2lnbmVkbmVzcyBhbmQgY291bnRlcm5lc3MKKy8vLyBmcm9tIDMyLzY0LWJpdCB2YWx1ZXMuKQorc3RhdGljIHZvaWQgcmVsYXhWYWx1ZXMoUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpWYWx1ZSAmaXRlbSkgeworICAgIEMyVmFsdWUgYzJWYWx1ZTsKKyAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgaW50NjRfdCBpbnQ2NFZhbHVlOworICAgICh2b2lkKWl0ZW0uZmluZCgmYzJWYWx1ZSk7CisgICAgaWYgKGMyVmFsdWUuZ2V0KCZpbnQzMlZhbHVlKSB8fCBjMlZhbHVlLmdldCgodWludDMyX3QqKSZpbnQzMlZhbHVlKQorICAgICAgICAgICAgfHwgYzJWYWx1ZS5nZXQoKGMyX2NudHIzMl90KikmaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgaXRlbS5zZXQoaW50MzJWYWx1ZSk7CisgICAgfSBlbHNlIGlmIChjMlZhbHVlLmdldCgmaW50NjRWYWx1ZSkKKyAgICAgICAgICAgIHx8IGMyVmFsdWUuZ2V0KCh1aW50NjRfdCopJmludDY0VmFsdWUpCisgICAgICAgICAgICB8fCBjMlZhbHVlLmdldCgoYzJfY250cjY0X3QqKSZpbnQ2NFZhbHVlKSkgeworICAgICAgICBpdGVtLnNldChpbnQ2NFZhbHVlKTsKKyAgICB9Cit9CisKK1JlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBDQ29kZWNDb25maWc6OmdldFJlZmxlY3RlZEZvcm1hdCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXNfLCBEb21haW4gY29uZmlnRG9tYWluKSBjb25zdCB7CisgICAgLy8gY3JlYXRlIGEgbW9kaWZpYWJsZSBjb3B5IG9mIHBhcmFtcworICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBwYXJhbXNfLT5kdXAoKTsKKyAgICBBTE9HVigiZmlsdGVyaW5nIHdpdGggY29uZmlnIGRvbWFpbiAleCIsIGNvbmZpZ0RvbWFpbik7CisKKyAgICAvLyBjb252ZXJ0IHNvbWUgbWFjcm8gcGFyYW1ldGVycyB0byBDb2RlYyAyLjAgc3BlY2lmaWMgZXhwcmVzc2lvbnMKKworICAgIHsgLy8gbWFrZSBpLWZyYW1lLWludGVydmFsIGZyYW1lIGJhc2VkCisgICAgICAgIGZsb2F0IGlGcmFtZUludGVydmFsOworICAgICAgICBpZiAocGFyYW1zLT5maW5kQXNGbG9hdChLRVlfSV9GUkFNRV9JTlRFUlZBTCwgJmlGcmFtZUludGVydmFsKSkgeworICAgICAgICAgICAgZmxvYXQgZnJhbWVSYXRlOworICAgICAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEFzRmxvYXQoS0VZX0ZSQU1FX1JBVEUsICZmcmFtZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigiaS1mcmFtZS1wZXJpb2QiLAorICAgICAgICAgICAgICAgICAgICAgICAgKGZyYW1lUmF0ZSA8PSAwIHx8IGlGcmFtZUludGVydmFsIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gLTEgLyogbm8gc3luYyBmcmFtZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGludDMyX3QpYzJfbWluKGlGcmFtZUludGVydmFsICogZnJhbWVSYXRlICsgMC41LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KUlOVDMyX01BWCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1Eb21haW4gPT0gKElTX1ZJREVPIHwgSVNfRU5DT0RFUikpIHsKKyAgICAgICAgLy8gY29udmVydCBjYXB0dXJlLXJhdGUgaW50byBpbnB1dC10aW1lLXN0cmV0Y2gKKyAgICAgICAgZmxvYXQgZnJhbWVSYXRlLCBjYXB0dXJlUmF0ZTsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEFzRmxvYXQoS0VZX0ZSQU1FX1JBVEUsICZmcmFtZVJhdGUpKSB7CisgICAgICAgICAgICBpZiAoIXBhcmFtcy0+ZmluZEFzRmxvYXQoInRpbWUtbGFwc2UtZnBzIiwgJmNhcHR1cmVSYXRlKQorICAgICAgICAgICAgICAgICAgICAmJiAhcGFyYW1zLT5maW5kQXNGbG9hdChLRVlfQ0FQVFVSRV9SQVRFLCAmY2FwdHVyZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgY2FwdHVyZVJhdGUgPSBmcmFtZVJhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FwdHVyZVJhdGUgPiAwICYmIGZyYW1lUmF0ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KEMyX1BBUkFNS0VZX0lOUFVUX1RJTUVfU1RSRVRDSCwgY2FwdHVyZVJhdGUgLyBmcmFtZVJhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgeyAgIC8vIHJlZmxlY3QgdGVtcG9yYWwgbGF5ZXJpbmcgaW50byBhIGJpbmFyeSBibG9iCisgICAgICAgIEFTdHJpbmcgc2NoZW1hOworICAgICAgICBpZiAocGFyYW1zLT5maW5kU3RyaW5nKEtFWV9URU1QT1JBTF9MQVlFUklORywgJnNjaGVtYSkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1MYXllcnMgPSAwOworICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bUJMYXllcnMgPSAwOworICAgICAgICAgICAgaW50IHRhZ3M7CisgICAgICAgICAgICBjaGFyIGR1bW15OworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0PiBsYXllcmluZzsKKyAgICAgICAgICAgIGlmIChzc2NhbmYoc2NoZW1hLmNfc3RyKCksICJ3ZWJydGMudnA4LiV1LWxheWVyJWMiLCAmbnVtTGF5ZXJzLCAmZHVtbXkpID09IDEKKyAgICAgICAgICAgICAgICAmJiBudW1MYXllcnMgPiAwKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChudW1MYXllcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJpbmcgPSBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9LCAwdSwgMXUsIDB1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZyA9IEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuNmYgfSwgMHUsIDJ1LCAwdSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJpbmcgPSBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLjRmLCAuNmYgfSwgMHUsIDN1LCAwdSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nID0gQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC4yNWYsIC40ZiwgLjZmIH0sIDB1LCA0dSwgMHUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICgodGFncyA9IHNzY2FuZihzY2hlbWEuY19zdHIoKSwgImFuZHJvaWQuZ2VuZXJpYy4ldSVjJXUlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAmbnVtTGF5ZXJzLCAmZHVtbXksICZudW1CTGF5ZXJzLCAmZHVtbXkpKQorICAgICAgICAgICAgICAgICYmICh0YWdzID09IDEgfHwgKHRhZ3MgPT0gMyAmJiBkdW1teSA9PSAnKycpKQorICAgICAgICAgICAgICAgICYmIG51bUxheWVycyA+IDAgJiYgbnVtTGF5ZXJzIDwgVUlOVDMyX01BWCAtIG51bUJMYXllcnMpIHsKKyAgICAgICAgICAgICAgICBsYXllcmluZyA9IEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHt9LCAwdSwgbnVtTGF5ZXJzICsgbnVtQkxheWVycywgbnVtQkxheWVycyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dEKCJJZ25vcmluZyB1bnN1cHBvcnRlZCB0cy1zY2hlbWEgWyVzXSIsIHNjaGVtYS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYXllcmluZykgeworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0QnVmZmVyKEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCdWZmZXI6OkNyZWF0ZUFzQ29weShsYXllcmluZy5nZXQoKSwgbGF5ZXJpbmctPnNpemUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgeyAvLyBjb252ZXJ0IGZyb20gTWVkaWFGb3JtYXQgcmVjdCB0byBDb2RlYyAyLjAgcmVjdAorICAgICAgICBpbnQzMl90IG9mZnNldDsKKyAgICAgICAgaW50MzJfdCBlbmQ7CisgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBpdGVtOworICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoImNyb3AtbGVmdCIsICZvZmZzZXQpICYmIHBhcmFtcy0+ZmluZEludDMyKCJjcm9wLXJpZ2h0IiwgJmVuZCkKKyAgICAgICAgICAgICAgICAmJiBvZmZzZXQgPj0gMCAmJiBlbmQgPj0gb2Zmc2V0IC0gMSkgeworICAgICAgICAgICAgc2l6ZV90IGl4ID0gcGFyYW1zLT5maW5kRW50cnlCeU5hbWUoImNyb3AtcmlnaHQiKTsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0RW50cnlOYW1lQXQoaXgsICJjcm9wLXdpZHRoIik7CisgICAgICAgICAgICBpdGVtLnNldChlbmQgLSBvZmZzZXQgKyAxKTsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0RW50cnlBdChpeCwgaXRlbSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJjcm9wLXRvcCIsICZvZmZzZXQpICYmIHBhcmFtcy0+ZmluZEludDMyKCJjcm9wLWJvdHRvbSIsICZlbmQpCisgICAgICAgICAgICAgICAgJiYgb2Zmc2V0ID49IDAgJiYgZW5kID49IG9mZnNldCAtIDEpIHsKKyAgICAgICAgICAgIHNpemVfdCBpeCA9IHBhcmFtcy0+ZmluZEVudHJ5QnlOYW1lKCJjcm9wLWJvdHRvbSIpOworICAgICAgICAgICAgcGFyYW1zLT5zZXRFbnRyeU5hbWVBdChpeCwgImNyb3AtaGVpZ2h0Iik7CisgICAgICAgICAgICBpdGVtLnNldChlbmQgLSBvZmZzZXQgKyAxKTsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0RW50cnlBdChpeCwgaXRlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7IC8vIGNvbnZlcnQgY29sb3IgaW5mbworICAgICAgICBpbnQzMl90IHN0YW5kYXJkOworICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoS0VZX0NPTE9SX1NUQU5EQVJELCAmc3RhbmRhcmQpKSB7CisgICAgICAgICAgICBDMkNvbG9yOjpwcmltYXJpZXNfdCBwcmltYXJpZXM7CisgICAgICAgICAgICBDMkNvbG9yOjptYXRyaXhfdCBtYXRyaXg7CisKKyAgICAgICAgICAgIGlmIChDMk1hcHBlcjo6bWFwKHN0YW5kYXJkLCAmcHJpbWFyaWVzLCAmbWF0cml4KSkgeworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImNvbG9yLXByaW1hcmllcyIsIHByaW1hcmllcyk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigiY29sb3ItbWF0cml4IiwgbWF0cml4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPEFCdWZmZXI+IGhkck1ldGE7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRCdWZmZXIoS0VZX0hEUl9TVEFUSUNfSU5GTywgJmhkck1ldGEpCisgICAgICAgICAgICAgICAgJiYgaGRyTWV0YS0+c2l6ZSgpID09IHNpemVvZihIRFJTdGF0aWNJbmZvKSkgeworICAgICAgICAgICAgSERSU3RhdGljSW5mbyAqbWV0YSA9IChIRFJTdGF0aWNJbmZvKiloZHJNZXRhLT5kYXRhKCk7CisgICAgICAgICAgICBpZiAobWV0YS0+bUlEID09IG1ldGEtPmtUeXBlMSkgeworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5yZWQueCIsIG1ldGEtPnNUeXBlMS5tUi54ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LnJlZC55IiwgbWV0YS0+c1R5cGUxLm1SLnkgKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYuZ3JlZW4ueCIsIG1ldGEtPnNUeXBlMS5tRy54ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LmdyZWVuLnkiLCBtZXRhLT5zVHlwZTEubUcueSAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5ibHVlLngiLCBtZXRhLT5zVHlwZTEubUIueCAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5ibHVlLnkiLCBtZXRhLT5zVHlwZTEubUIueSAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni53aGl0ZS54IiwgbWV0YS0+c1R5cGUxLm1XLnggKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYud2hpdGUueSIsIG1ldGEtPnNUeXBlMS5tVy55ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2Lm1heC1sdW1pbmFuY2UiLCBtZXRhLT5zVHlwZTEubU1heERpc3BsYXlMdW1pbmFuY2UpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5taW4tbHVtaW5hbmNlIiwgbWV0YS0+c1R5cGUxLm1NaW5EaXNwbGF5THVtaW5hbmNlICogMC4wMDAxKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJjdGE4NjEubWF4LWNsbCIsIG1ldGEtPnNUeXBlMS5tTWF4Q29udGVudExpZ2h0TGV2ZWwpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoImN0YTg2MS5tYXgtZmFsbCIsIG1ldGEtPnNUeXBlMS5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB0aGlzIGlzIHRvIHZlcmlmeSB0aGF0IHdlIHNldCBwcm9wZXIgc2lnbmVkbmVzcyBmb3Igc3RhbmRhcmQgcGFyYW1ldGVycworICAgIGJvb2wgYmVWZXJ5U3RyaWN0ID0gcHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlY19zdHJpY3RfdHlwZSIsIGZhbHNlKTsKKyAgICAvLyB0aGlzIGlzIHRvIGFsbG93IHZlbmRvcnMgdG8gdXNlIHRoZSB3cm9uZyBzaWduZWRuZXNzIGZvciBzdGFuZGFyZCBwYXJhbWV0ZXJzCisgICAgYm9vbCBiZVZlcnlMYXggPSBwcm9wZXJ0eV9nZXRfYm9vbCgiZGVidWcuc3RhZ2VmcmlnaHQuY2NvZGVjX2xheF90eXBlIiwgZmFsc2UpOworCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IGZpbHRlcmVkOworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBwYXJhbXMtPmNvdW50RW50cmllcygpOyArK2l4KSB7CisgICAgICAgIEFNZXNzYWdlOjpUeXBlIHR5cGU7CisgICAgICAgIEFTdHJpbmcgbmFtZSA9IHBhcmFtcy0+Z2V0RW50cnlOYW1lQXQoaXgsICZ0eXBlKTsKKyAgICAgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIG1zZ0l0ZW0gPSBwYXJhbXMtPmdldEVudHJ5QXQoaXgpOworICAgICAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OlZhbHVlIGl0ZW07CisgICAgICAgIGNvbnZlcnQobXNnSXRlbSwgJml0ZW0pOyAvLyBjb252ZXJ0IGl0ZW0gdG8gcGFyYW0gdXBkYXRlciBpdGVtCisKKyAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgidmVuZG9yLiIpKSB7CisgICAgICAgICAgICAvLyB2ZW5kb3IgcGFyYW1zIHBhc3MgdGhyb3VnaCBhcyBpcworICAgICAgICAgICAgZmlsdGVyZWQuZW1wbGFjZShuYW1lLmNfc3RyKCksIGl0ZW0pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gc3RhbmRhcmQgcGFyYW1ldGVycyBtYXkgZ2V0IG1vZGlmaWVkLCBmaWx0ZXJlZCBvciBkdXBsaWNhdGVkCisgICAgICAgIGZvciAoY29uc3QgQ29uZmlnTWFwcGVyICZjbSA6IG1TdGFuZGFyZFBhcmFtcy0+Z2V0Q29uZmlnTWFwcGVyc0ZvclNka0tleShuYW1lLmNfc3RyKCkpKSB7CisgICAgICAgICAgICAvLyBub3RlOiB3ZSBpZ25vcmUgcG9ydCBkb21haW4gZm9yIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIGlmICgoY20uZG9tYWluKCkgJiBjb25maWdEb21haW4pCisgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCBkb21haW4gKyBraW5kICh0aGVzZSBtdXN0IG1hdGNoKQorICAgICAgICAgICAgICAgICAgICAmJiAoY20uZG9tYWluKCkgJiBtRG9tYWluKSA9PSBtRG9tYWluKSB7CisgICAgICAgICAgICAgICAgLy8gbWFwIGFyaXRobWV0aWMgdmFsdWVzLCBwYXNzIHRocm91Z2ggc3RyaW5nIG9yIGJ1ZmZlcgorICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUJ1ZmZlcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVTdHJpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVJbnQzMjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVJbnQ2NDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVGbG9hdDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVEb3VibGU6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3Igbm93IG9ubHkgbWFwIHNldHRpbmdzIHdpdGggbWFwcGVycyBhcyB3ZSBhcmUgbm90IGNyZWF0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWduZWQgPD0+IHVuc2lnbmVkIG1hcHBlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGJlIHByZWNpc2UgYWJvdXQgc2lnbmVkIHVuc2lnbmVkCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmVWZXJ5U3RyaWN0IHx8IGNtLm1hcHBlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXQoY20ubWFwRnJvbU1lc3NhZ2UocGFyYW1zLT5nZXRFbnRyeUF0KGl4KSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsc28gYWxsb3cgdG8gcmVsYXggdHlwZSBzdHJpY3RuZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJlVmVyeUxheCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxheFZhbHVlcyhpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaWx0ZXJlZC5lbXBsYWNlKGNtLnBhdGgoKSwgaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoImZpbHRlcmVkICVzIHRvICVzIiwgcGFyYW1zLT5kZWJ1Z1N0cmluZyg0KS5jX3N0cigpLAorICAgICAgICAgICAgZmlsdGVyZWQuZGVidWdTdHJpbmcoNCkuY19zdHIoKSk7CisgICAgcmV0dXJuIGZpbHRlcmVkOworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OmdldENvbmZpZ1VwZGF0ZUZyb21TZGtQYXJhbXMoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJnNka1BhcmFtcywgRG9tYWluIGNvbmZpZ0RvbWFpbiwKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uZmlnVXBkYXRlKSBjb25zdCB7CisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IHBhcmFtcyA9IGdldFJlZmxlY3RlZEZvcm1hdChzZGtQYXJhbXMsIGNvbmZpZ0RvbWFpbik7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICBtUGFyYW1VcGRhdGVyLT5nZXRQYXJhbUluZGljZXNGcm9tTWVzc2FnZShwYXJhbXMsICZpbmRpY2VzKTsKKyAgICBpZiAoaW5kaWNlcy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dEKCJubyByZWNvZ25pemVkIHBhcmFtcyBpbjogJXMiLCBwYXJhbXMuZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGNvbmZpZ1VwZGF0ZS0+Y2xlYXIoKTsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gc3VwcG9ydGVkSW5kaWNlczsKKyAgICBmb3IgKEMyUGFyYW06OkluZGV4IGl4IDogaW5kaWNlcykgeworICAgICAgICBpZiAobVN1cHBvcnRlZEluZGljZXMuY291bnQoaXgpKSB7CisgICAgICAgICAgICBzdXBwb3J0ZWRJbmRpY2VzLnB1c2hfYmFjayhpeCk7CisgICAgICAgIH0gZWxzZSBpZiAobUxvY2FsUGFyYW1zLmNvdW50KGl4KSkgeworICAgICAgICAgICAgLy8gcXVlcnkgbG9jYWwgcGFyYW1ldGVyIGhlcmUKKyAgICAgICAgICAgIGF1dG8gaXQgPSBtQ3VycmVudENvbmZpZy5maW5kKGl4KTsKKyAgICAgICAgICAgIGlmIChpdCAhPSBtQ3VycmVudENvbmZpZy5lbmQoKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZ1VwZGF0ZS0+ZW1wbGFjZV9iYWNrKEMyUGFyYW06OkNvcHkoKml0LT5zZWNvbmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGMyX3N0YXR1c190IGVyciA9IGNvbXBvbmVudC0+cXVlcnkoeyB9LCBzdXBwb3J0ZWRJbmRpY2VzLCBibG9ja2luZywgY29uZmlnVXBkYXRlKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJxdWVyeSBmYWlsZWQgYWZ0ZXIgcmV0dXJuaW5nICV6dSBwYXJhbXMgPT4gJXMiLCBjb25maWdVcGRhdGUtPnNpemUoKSwgYXNTdHJpbmcoZXJyKSk7CisgICAgfQorCisgICAgaWYgKGNvbmZpZ1VwZGF0ZS0+c2l6ZSgpKSB7CisgICAgICAgIG1QYXJhbVVwZGF0ZXItPnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKHBhcmFtcywgY29uZmlnVXBkYXRlKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OnNldFBhcmFtZXRlcnMoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZjb25maWdVcGRhdGUsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcpIHsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKKyAgICBpZiAoY29uZmlnVXBkYXRlLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gcGFyYW1WZWN0b3I7CisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtIDogY29uZmlnVXBkYXRlKSB7CisgICAgICAgIGlmIChtU3VwcG9ydGVkSW5kaWNlcy5jb3VudChwYXJhbS0+aW5kZXgoKSkpIHsKKyAgICAgICAgICAgIC8vIGNvbXBvbmVudCBwYXJhbWV0ZXIKKyAgICAgICAgICAgIHBhcmFtVmVjdG9yLnB1c2hfYmFjayhwYXJhbS5nZXQoKSk7CisgICAgICAgICAgICBpbmRpY2VzLnB1c2hfYmFjayhwYXJhbS0+aW5kZXgoKSk7CisgICAgICAgIH0gZWxzZSBpZiAobUxvY2FsUGFyYW1zLmNvdW50KHBhcmFtLT5pbmRleCgpKSkgeworICAgICAgICAgICAgLy8gaGFuZGxlIGxvY2FsIHBhcmFtZXRlciBoZXJlCisgICAgICAgICAgICBMb2NhbFBhcmFtVmFsaWRhdG9yIHZhbGlkYXRvciA9IG1Mb2NhbFBhcmFtcy5maW5kKHBhcmFtLT5pbmRleCgpKS0+c2Vjb25kOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gY29weSA9IEMyUGFyYW06OkNvcHkoKnBhcmFtKTsKKyAgICAgICAgICAgIGlmICh2YWxpZGF0b3IpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSB2YWxpZGF0b3IoY29weSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInVwZGF0ZWQgbG9jYWwgcGFyYW1ldGVyIHZhbHVlIGZvciAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1VcGRhdGVyLT5nZXRQYXJhbU5hbWUocGFyYW0tPmluZGV4KCkpLmNfc3RyKCkpOworCisgICAgICAgICAgICAgICAgbUN1cnJlbnRDb25maWdbcGFyYW0tPmluZGV4KCldID0gc3RkOjptb3ZlKGNvcHkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIHNldCBwYXJhbWV0ZXIgdmFsdWUgZm9yICVzID0+ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbVVwZGF0ZXItPmdldFBhcmFtTmFtZShwYXJhbS0+aW5kZXgoKSkuY19zdHIoKSwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIHVwZGF0ZSBzdWJzY3JpYmVkIHBhcmFtIGluZGljZXMKKyAgICBzdWJzY3JpYmVUb0NvbmZpZ1VwZGF0ZShjb21wb25lbnQsIGluZGljZXMsIGJsb2NraW5nKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBjb21wb25lbnQtPmNvbmZpZyhwYXJhbVZlY3RvciwgYmxvY2tpbmcsICZmYWlsdXJlcyk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiY29uZmlnIGZhaWxlZCA9PiAlcyIsIGFzU3RyaW5nKGVycikpOworICAgICAgICAvLyBUaGlzIGlzIG5vbi1mYXRhbC4KKyAgICB9CisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiAmZmFpbHVyZSA6IGZhaWx1cmVzKSB7CisgICAgICAgIHN3aXRjaCAoZmFpbHVyZS0+ZmFpbHVyZSkgeworICAgICAgICAgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OkJBRF9WQUxVRToKKyAgICAgICAgICAgICAgICBBTE9HRCgiQmFkIHBhcmFtZXRlciB2YWx1ZSIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR1YoImZhaWx1cmUgPSAlZCIsIGludChmYWlsdXJlLT5mYWlsdXJlKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZS1xdWVyeSBwYXJhbWV0ZXIgdmFsdWVzIGluIGNhc2UgY29uZmlnIGNvdWxkIG5vdCB1cGRhdGUgdGhlbSBhbmQgdXBkYXRlIHRoZSBjdXJyZW50CisgICAgLy8gY29uZmlndXJhdGlvbi4KKyAgICBjb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICBlcnIgPSBjb21wb25lbnQtPnF1ZXJ5KHt9LCBpbmRpY2VzLCBibG9ja2luZywgJmNvbmZpZ1VwZGF0ZSk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgicXVlcnkgZmFpbGVkIGFmdGVyIHJldHVybmluZyAlenUgcGFyYW1zID0+ICVzIiwgY29uZmlnVXBkYXRlLnNpemUoKSwgYXNTdHJpbmcoZXJyKSk7CisgICAgfQorICAgICh2b2lkKXVwZGF0ZUNvbmZpZ3VyYXRpb24oY29uZmlnVXBkYXRlLCBBTEwpOworCisgICAgLy8gVE9ETzogZXJyb3IgdmFsdWUKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitjb25zdCBDMlBhcmFtICpDQ29kZWNDb25maWc6OmdldENvbmZpZ1BhcmFtZXRlclZhbHVlKEMyUGFyYW06OkluZGV4IGluZGV4KSBjb25zdCB7CisgICAgYXV0byBpdCA9IG1DdXJyZW50Q29uZmlnLmZpbmQoaW5kZXgpOworICAgIGlmIChpdCA9PSBtQ3VycmVudENvbmZpZy5lbmQoKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gaXQtPnNlY29uZC5nZXQoKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhZmUzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuaApAQCAtMCwwICsxLDM0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ19DT0RFQ19DT05GSUdfSF8KKyNkZWZpbmUgQ19DT0RFQ19DT05GSUdfSF8KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlICJJbnB1dFN1cmZhY2VXcmFwcGVyLmgiCisjaW5jbHVkZSAiUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFNZXNzYWdlOworc3RydWN0IFN0YW5kYXJkUGFyYW1zOworCisvKioKKyAqIFN0cnVjdCBtYW5hZ2luZyB0aGUgY29kZWMgY29uZmlndXJhdGlvbiBmb3IgQ0NvZGVjLgorICovCitzdHJ1Y3QgQ0NvZGVjQ29uZmlnIHsKKworICAgIC8qKgorICAgICAqIERvbWFpbiBjb25zaXN0cyBvZiBhIGJpdG1hc2sgZGl2aWRlZCBpbnRvIGZpZWxkcywgYW5kIHNwZWNpZmllcnMgd29yayBieSBleGNsdWRpbmcgb3RoZXIKKyAgICAgKiB2YWx1ZXMgaW4gdGhvc2UgZG9tYWlucy4KKyAgICAgKgorICAgICAqIENvbXBvbmVudCBkb21haW5zIGFyZSBjb21wb3NlZCBieSBvci1pbmcgdGhlIGluZGl2aWR1YWwgSVNfIGNvbnN0YW50cywgZS5nLgorICAgICAqIElTX0RFQ09ERVIgfCBJU19BVURJTy4KKyAgICAgKgorICAgICAqIENvbmZpZyBzcGVjaWZpZXJzIGFyZSBjb21wb3NlZCBieSBvci1pbmcgdGhlIGluZGl2aWR1YWwgbWFzayBjb25zdGFudHMsIGFuZAorICAgICAqIGFuZC1pbmcgdGhlc2UgZ3JvdXBzOiBlLmcuIChERUNPREVSIHwgRU5DT0RFUikgJiBBVURJTy4KKyAgICAgKgorICAgICAqIFRoZSBuYW1pbmcgb2YgdGhlc2UgY29uc3RhbnRzIHdhcyB0byBsaW1pdCB0aGUgbGVuZ3RoIG9mIG1hc2sgbmFtZXMgYXMgdGhlc2UgYXJlIHVzZWQgbW9yZQorICAgICAqIGNvbW1vbmx5IGFzIG1hc2tzLgorICAgICAqLworICAgIGVudW0gRG9tYWluIDogdWludDMyX3QgeworICAgICAgICAvLyBjb21wb25lbnQgZG9tYWluIChkb21haW4gJiBraW5kKQorICAgICAgICBHVUFSRF9CSVQgICA9ICgxIDw8IDEpLCAgIC8vLzwgdGhpcyBpcyB0byBwcmV2ZW50IGFnYWluc3QgYWNjaWRlbnRhbCAmJiBvciB8fCB1c2FnZQorICAgICAgICBJU19BVURJTyAgICA9ICgxIDw8IDIpLCAgIC8vLzwgZm9yIGF1ZGlvIGNvZGVjcworICAgICAgICBJU19WSURFTyAgICA9ICgxIDw8IDMpLCAgIC8vLzwgZm9yIHZpZGVvIGNvZGVjcworICAgICAgICBJU19JTUFHRSAgICA9ICgxIDw8IDQpLCAgIC8vLzwgZm9yIGltYWdlIGNvZGVjcworICAgICAgICBPVEhFUl9ET01BSU4gPSAoMSA8PCA1KSwgIC8vLzwgZm9yIG90aGVyIGRvbWFpbnMKKworICAgICAgICBJU19FTkNPREVSICA9ICgxIDw8IDYpLCAgIC8vLzwgZm9yIGVuY29kZXJzCisgICAgICAgIElTX0RFQ09ERVIgID0gKDEgPDwgNyksICAgLy8vPCBmb3IgZGVjb2RlcnMKKyAgICAgICAgT1RIRVJfS0lORCAgPSAoMSA8PCA4KSwgICAvLy88IGZvciBvdGhlciBkb21haW5zCisKKyAgICAgICAgLy8gY29uZmlnIGRvbWFpbgorICAgICAgICBJU19QQVJBTSAgICA9ICgxIDw8IDkpLCAgIC8vLzwgZm9yIHNldFBhcmFtZXRlcgorICAgICAgICBJU19DT05GSUcgICA9ICgxIDw8IDEwKSwgIC8vLzwgZm9yIGNvbmZpZ3VyZQorICAgICAgICBJU19SRUFEICAgICA9ICgxIDw8IDExKSwgIC8vLzwgZm9yIGdldEZvcm1hdAorCisgICAgICAgIC8vIHBvcnQgZG9tYWluCisgICAgICAgIElTX0lOUFVUICAgID0gKDEgPDwgMTIpLCAgLy8vPCBmb3IgaW5wdXQgcG9ydCAoZ2V0Rm9ybWF0KQorICAgICAgICBJU19PVVRQVVQgICA9ICgxIDw8IDEzKSwgIC8vLzwgZm9yIG91dHB1dCBwb3J0IChnZXRGb3JtYXQpCisgICAgICAgIElTX1JBVyAgICAgID0gKDEgPDwgMTQpLCAgLy8vPCBmb3IgcmF3IHBvcnQgKGlucHV0LWVuY29kZXIsIG91dHB1dC1kZWNvZGVyKQorICAgICAgICBJU19DT0RFRCAgICA9ICgxIDw8IDE1KSwgIC8vLzwgZm9yIGNvZGVkIHBvcnQgKGlucHV0LWRlY29kZXIsIG91dHB1dC1lbmNvZGVyKQorCisgICAgICAgIEFMTCAgICAgPSB+MFUsCisgICAgICAgIE5PTkUgICAgPSAwLAorCisgICAgICAgIEFVRElPICAgPSB+KElTX0lNQUdFIHwgSVNfVklERU8gfCBPVEhFUl9ET01BSU4pLAorICAgICAgICBWSURFTyAgID0gfihJU19BVURJTyB8IElTX0lNQUdFIHwgT1RIRVJfRE9NQUlOKSwKKyAgICAgICAgSU1BR0UgICA9IH4oSVNfQVVESU8gfCBJU19WSURFTyB8IE9USEVSX0RPTUFJTiksCisKKyAgICAgICAgREVDT0RFUiA9IH4oSVNfRU5DT0RFUiB8IE9USEVSX0tJTkQpLAorICAgICAgICBFTkNPREVSID0gfihJU19ERUNPREVSIHwgT1RIRVJfS0lORCksCisKKyAgICAgICAgUEFSQU0gICA9IH4oSVNfQ09ORklHIHwgSVNfUkVBRCksCisgICAgICAgIENPTkZJRyAgPSB+KElTX1BBUkFNICB8IElTX1JFQUQpLAorICAgICAgICBSRUFEICAgID0gfihJU19DT05GSUcgfCBJU19QQVJBTSksCisKKyAgICAgICAgSU5QVVQgICA9IH4oSVNfT1VUUFVUIHwgSVNfUkFXICAgIHwgSVNfQ09ERUQpLAorICAgICAgICBPVVRQVVQgID0gfihJU19JTlBVVCAgfCBJU19SQVcgICAgfCBJU19DT0RFRCksCisgICAgICAgIFJBVyAgICAgPSB+KElTX0lOUFVUICB8IElTX09VVFBVVCB8IElTX0NPREVEKSwKKyAgICAgICAgQ09ERUQgICA9IH4oSVNfSU5QVVQgIHwgSVNfUkFXICAgIHwgSVNfT1VUUFVUKSwKKyAgICB9OworCisgICAgLy8gdGhpbmdzIHJlcXVpcmVkIHRvIG1hbmFnZSBmb3JtYXRzCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gbVBhcmFtRGVzY3M7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IG1SZWZsZWN0b3I7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmVmbGVjdGVkUGFyYW1VcGRhdGVyPiBtUGFyYW1VcGRhdGVyOworCisgICAgRG9tYWluIG1Eb21haW47IC8vIGNvbXBvbmVudCBkb21haW4KKyAgICBEb21haW4gbUlucHV0RG9tYWluOyAvLyBpbnB1dCBwb3J0IGRvbWFpbgorICAgIERvbWFpbiBtT3V0cHV0RG9tYWluOyAvLyBvdXRwdXQgcG9ydCBkb21haW4KKyAgICBzdGQ6OnN0cmluZyBtQ29kaW5nTWVkaWFUeXBlOyAgLy8gbWVkaWEgdHlwZSBvZiB0aGUgY29kZWQgc3RyZWFtCisKKyAgICAvLyBzdGFuZGFyZCBNZWRpYUNvZGVjIHRvIENvZGVjIDIuMCBwYXJhbXMgbWFwcGluZworICAgIHN0ZDo6c2hhcmVkX3B0cjxTdGFuZGFyZFBhcmFtcz4gbVN0YW5kYXJkUGFyYW1zOworCisgICAgc3RkOjpzZXQ8QzJQYXJhbTo6SW5kZXg+IG1TdXBwb3J0ZWRJbmRpY2VzOyAvLy88IGluZGljZXMgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQKKyAgICBzdGQ6OnNldDxDMlBhcmFtOjpJbmRleD4gbVN1YnNjcmliZWRJbmRpY2VzOyAvLy88IGluZGljZXMgdG8gc3Vic2NyaWJlIHRvCisgICAgc2l6ZV90IG1TdWJzY3JpYmVkSW5kaWNlc1NpemU7IC8vLzwgY291bnQgb2YgY3VycmVudGx5IHN1YnNjcmliZWQgaW5kaWNlcworCisgICAgc3A8QU1lc3NhZ2U+IG1JbnB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKKworICAgIGJvb2wgbVVzaW5nU3VyZmFjZTsgLy8vPCB1c2luZyBpbnB1dCBvciBvdXRwdXQgc3VyZmFjZQorCisgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+IG1JbnB1dFN1cmZhY2U7CisgICAgc3RkOjp1bmlxdWVfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI6OkNvbmZpZz4gbUlTQ29uZmlnOworCisgICAgLy8vIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uIFVwZGF0ZWQgYWZ0ZXIgY29uZmlndXJlKCkgYW5kIGJhc2VkIG9uIGNvbmZpZ1VwZGF0ZSBpbgorICAgIC8vLyBvbldvcmtEb25lCisgICAgc3RkOjptYXA8QzJQYXJhbTo6SW5kZXgsIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gbUN1cnJlbnRDb25maWc7CisKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qoc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+Jik+IExvY2FsUGFyYW1WYWxpZGF0b3I7CisKKyAgICAvLy8gUGFyYW1ldGVyIGluZGljZXMgdHJhY2tlZCBpbiBjdXJyZW50IGNvbmZpZyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQuCisgICAgLy8vIHRoZXNlIGFyZSBwcm92aWRlZCBzbyB0aGF0IG9wdGlvbmFsIHBhcmFtZXRlcnMgY2FuIHJlbWFpbiBpbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorICAgIC8vLyBhcyBzdWNoLCB0aGVzZSBwYXJhbWV0ZXJzIGhhdmUgbm8gZGVwZW5kZW5jaWVzLiBUT0RPOiB1c2UgQzJJbnRlcmZhY2VIZWxwZXIgZm9yIHRoaXMuCisgICAgLy8vIEZvciBub3cgc3VwcG9ydCBhIHZhbGlkYXRpb24gZnVuY3Rpb24uCisgICAgc3RkOjptYXA8QzJQYXJhbTo6SW5kZXgsIExvY2FsUGFyYW1WYWxpZGF0b3I+IG1Mb2NhbFBhcmFtczsKKworICAgIENDb2RlY0NvbmZpZygpOworCisgICAgLy8vIGluaXRpYWxpemVzIHRoZSBtZW1iZXJzIHJlcXVpcmVkIHRvIG1hbmFnZSB0aGUgZm9ybWF0OiBkZXNjcmlwdG9ycywgcmVmbGVjdG9yLAorICAgIC8vLyByZWZsZWN0ZWQgcGFyYW0gaGVscGVyLCBkb21haW4sIHN0YW5kYXJkIHBhcmFtcywgYW5kIHN1YnNjcmliZXMgdG8gc3RhbmRhcmQKKyAgICAvLy8gaW5kaWNlcy4KKyAgICBzdGF0dXNfdCBpbml0aWFsaXplKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gJmNsaWVudCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCk7CisKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBsb2NhbGx5IG1haW50YWluZWQgcGFyYW1ldGVyLiBUaGlzIGlzIHVzZWQgZm9yIG91dHB1dCBjb25maWd1cmF0aW9uIHRoYXQgY2FuIGJlCisgICAgICogYXBwZW5kZWQgdG8gdGhlIG91dHB1dCBidWZmZXJzIGluIGNhc2UgaXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50LgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgYm9vbCBhZGRMb2NhbFBhcmFtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCisgICAgICAgICAgICBDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QgYXR0cmliID0gQzJQYXJhbURlc2NyaXB0b3I6OklTX1JFQURfT05MWSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qoc3RkOjp1bmlxdWVfcHRyPFQ+Jik+IHZhbGlkYXRvcl8gPQorICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qoc3RkOjp1bmlxdWVfcHRyPFQ+Jik+KCkpIHsKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggaW5kZXggPSBUOjpQQVJBTV9UWVBFOworICAgICAgICBpZiAobVN1cHBvcnRlZEluZGljZXMuY291bnQoaW5kZXgpIHx8IG1Mb2NhbFBhcmFtcy5jb3VudChpbmRleCkpIHsKKyAgICAgICAgICAgIGlmIChtU3VwcG9ydGVkSW5kaWNlcy5jb3VudChpbmRleCkpIHsKKyAgICAgICAgICAgICAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShpbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HRCgiaWdub3JpbmcgbG9jYWwgcGFyYW0gJXMgKCUjeCkgYXMgaXQgaXMgYWxyZWFkeSAlcyIsCisgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgKHVpbnQzMl90KWluZGV4LCBtU3VwcG9ydGVkSW5kaWNlcy5jb3VudChpbmRleCkgPyAic3VwcG9ydGVkIiA6ICJsb2NhbCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBhbHJlYWR5IHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50IG9yIGFscmVhZHkgYWRkZWQKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdyYXAgdHlwZWQgdmFsaWRhdG9yIGludG8gdW50eXBlZCB2YWxpZGF0b3IKKyAgICAgICAgTG9jYWxQYXJhbVZhbGlkYXRvciB2YWxpZGF0b3I7CisgICAgICAgIGlmICh2YWxpZGF0b3JfKSB7CisgICAgICAgICAgICB2YWxpZGF0b3IgPSBbdmFsaWRhdG9yX10oc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+JiBwKXsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCByZXMgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHR5cGVkKHN0YXRpY19jYXN0PFQqPihwLnJlbGVhc2UoKSkpOworICAgICAgICAgICAgICAgIC8vIGlmIHBhcmFtZXRlciBpcyBjb3JyZWN0bHkgdHlwZWQKKyAgICAgICAgICAgICAgICBpZiAoVDo6RnJvbSh0eXBlZC5nZXQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gdmFsaWRhdG9yXyh0eXBlZCk7CisgICAgICAgICAgICAgICAgICAgIHAucmVzZXQodHlwZWQucmVsZWFzZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBtTG9jYWxQYXJhbXMuZW1wbGFjZShpbmRleCwgdmFsaWRhdG9yKTsKKyAgICAgICAgbVBhcmFtVXBkYXRlci0+YWRkU3RhbmRhcmRQYXJhbTxUPihuYW1lLCBhdHRyaWIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbG9jYWxseSBtYWludGFpbmVkIHBhcmFtZXRlciB3aXRoIGEgZGVmYXVsdCB2YWx1ZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGJvb2wgYWRkTG9jYWxQYXJhbSgKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBkZWZhdWx0XywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYiA9IEMyUGFyYW1EZXNjcmlwdG9yOjpJU19SRUFEX09OTFksCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPiB2YWxpZGF0b3JfID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPigpKSB7CisgICAgICAgIGlmIChhZGRMb2NhbFBhcmFtPFQ+KG5hbWUsIGF0dHJpYiwgdmFsaWRhdG9yXykpIHsKKyAgICAgICAgICAgIGlmICh2YWxpZGF0b3JfKSB7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gdmFsaWRhdG9yXyhkZWZhdWx0Xyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZGVmYXVsdCB2YWx1ZSBmb3IgJXMgaXMgaW52YWxpZCA9PiAlcyIsIG5hbWUuY19zdHIoKSwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3VycmVudENvbmZpZ1tUOjpQQVJBTV9UWVBFXSA9IHN0ZDo6bW92ZShkZWZhdWx0Xyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBib29sIGFkZExvY2FsUGFyYW0oCisgICAgICAgICAgICBUICpkZWZhdWx0XywgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCisgICAgICAgICAgICBDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QgYXR0cmliID0gQzJQYXJhbURlc2NyaXB0b3I6OklTX1JFQURfT05MWSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qoc3RkOjp1bmlxdWVfcHRyPFQ+Jik+IHZhbGlkYXRvcl8gPQorICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qoc3RkOjp1bmlxdWVfcHRyPFQ+Jik+KCkpIHsKKyAgICAgICAgcmV0dXJuIGFkZExvY2FsUGFyYW0oc3RkOjp1bmlxdWVfcHRyPFQ+KGRlZmF1bHRfKSwgbmFtZSwgYXR0cmliLCB2YWxpZGF0b3JfKTsKKyAgICB9CisKKyAgICAvLy8gQXBwbGllcyBjb25maWd1cmF0aW9uIHVwZGF0ZXMsIGFuZCB1cGRhdGVzIGZvcm1hdCBpbiB0aGUgc3BlY2lmaWMgZG9tYWluLgorICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgZm9ybWF0cyB3ZXJlIHVwZGF0ZWQKKyAgICAvLy8gXHBhcmFtIGRvbWFpbiBpbnB1dC9vdXRwdXQgYml0bWFzaworICAgIGJvb2wgdXBkYXRlQ29uZmlndXJhdGlvbigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJmNvbmZpZ1VwZGF0ZSwgRG9tYWluIGRvbWFpbik7CisKKyAgICAvLy8gVXBkYXRlcyBmb3JtYXRzIGluIHRoZSBzcGVjaWZpYyBkb21haW4uIFJldHVybnMgdHJ1ZSBpZiBhbnkgb2YgdGhlIGZvcm1hdHMgaGF2ZSBjaGFuZ2VkLgorICAgIC8vLyBccGFyYW0gZG9tYWluIGlucHV0L291dHB1dCBiaXRtYXNrCisgICAgYm9vbCB1cGRhdGVGb3JtYXRzKERvbWFpbiBkb21haW4pOworCisgICAgLyoqCisgICAgICogQXBwbGllcyBTREsgY29uZmlndXJhdGlvbnMgaW4gYSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGRvbWFpbi4KKyAgICAgKiBVcGRhdGVzIHJlbGV2YW50IGlucHV0L291dHB1dCBmb3JtYXRzIGFuZCBzdWJzY3JpYmVzIHRvIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIHRoZQorICAgICAqIGNvbmZpZ3VyYXRpb24uCisgICAgICogXHBhcmFtIGRvbWFpbiBjb25maWcvc2V0UGFyYW0gYml0bWFzaworICAgICAqIFxwYXJhbSBibG9ja2luZyBibG9ja2luZyBtb2RlIHRvIHVzZSB3aXRoIHRoZSBjb21wb25lbnQKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBnZXRDb25maWdVcGRhdGVGcm9tU2RrUGFyYW1zKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJnNka1BhcmFtcywgRG9tYWluIGRvbWFpbiwKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25maWdVcGRhdGUpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQXBwbGllcyBhIGNvbmZpZ3VyYXRpb24gdXBkYXRlIHRvIHRoZSBjb21wb25lbnQuCisgICAgICogVXBkYXRlcyByZWxldmFudCBpbnB1dC9vdXRwdXQgZm9ybWF0cyBhbmQgc3Vic2NyaWJlcyB0byBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgKiBjb25maWd1cmF0aW9uLgorICAgICAqIFxwYXJhbSBibG9ja2luZyBibG9ja2luZyBtb2RlIHRvIHVzZSB3aXRoIHRoZSBjb21wb25lbnQKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZjb25maWdVcGRhdGUsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nKTsKKworICAgIC8vLyBRdWVyaWVzIHN1YnNjcmliZWQgaW5kaWNlcyAod2hpY2ggY29udGFpbnMgYWxsIFNESy1leHBvc2VkIHZhbHVlcykgYW5kIHVwZGF0ZXMKKyAgICAvLy8gaW5wdXQvb3V0cHV0IGZvcm1hdHMuCisgICAgc3RhdHVzX3QgcXVlcnlDb25maWd1cmF0aW9uKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KTsKKworICAgIC8vLyBRdWVyaWVzIGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgdmFsdWUuIFJldHVybnMgbnVsbHB0ciBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdAorICAgIC8vLyBwYXJ0IG9mIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24KKyAgICBjb25zdCBDMlBhcmFtICpnZXRDb25maWdQYXJhbWV0ZXJWYWx1ZShDMlBhcmFtOjpJbmRleCBpbmRleCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBPYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFuZCBpZiB0aGV5IGNoYW5nZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBXYXRjaGVyIHsKKyAgICAgICAgfldhdGNoZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgb2YgdGhpcyBjb25maWd1cmF0aW9uIGhhcyBjaGFuZ2VkCisgICAgICAgIGJvb2wgaGFzQ2hhbmdlZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlID0gbVBhcmVudC0+Z2V0Q29uZmlnUGFyYW1ldGVyVmFsdWUobUluZGV4KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBtVmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnZhbHVlICE9ICptVmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPSBtVmFsdWUuZ2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gdXBkYXRlcyB0aGUgY3VycmVudCB2YWx1ZSBhbmQgcmV0dXJucyBpdAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVD4gdXBkYXRlKCkgeworICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUgPSBtUGFyZW50LT5nZXRDb25maWdQYXJhbWV0ZXJWYWx1ZShtSW5kZXgpOworICAgICAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgbVZhbHVlID0gc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFQ+KFQ6OkZyb20oQzJQYXJhbTo6Q29weSgqdmFsdWUpLnJlbGVhc2UoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgV2F0Y2hlcihDMlBhcmFtOjpJbmRleCBpbmRleCwgY29uc3QgQ0NvZGVjQ29uZmlnICpwYXJlbnQpCisgICAgICAgICAgICA6IG1QYXJlbnQocGFyZW50KSwgbUluZGV4KGluZGV4KSB7CisgICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQ0NvZGVjQ29uZmlnOworCisgICAgICAgIGNvbnN0IENDb2RlY0NvbmZpZyAqbVBhcmVudDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFQ+IG1WYWx1ZTsKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggbUluZGV4OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgd2F0Y2hlciBvYmplY3QgZm9yIGEgcGFyYW1ldGVyLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgV2F0Y2hlcjxUPiB3YXRjaChDMlBhcmFtOjpJbmRleCBpbmRleCA9IFQ6OlBBUkFNX1RZUEUpIGNvbnN0IHsKKyAgICAgICAgaWYgKGluZGV4LnR5cGUoKSAhPSBUOjpQQVJBTV9UWVBFKSB7CisgICAgICAgICAgICBfX2J1aWx0aW5fdHJhcCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBXYXRjaGVyPFQ+KGluZGV4LCB0aGlzKTsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICAvLy8gaW5pdGlhbGl6ZXMgdGhlIHN0YW5kYXJkIE1lZGlhQ29kZWMgdG8gQ29kZWMgMi4wIHBhcmFtcyBtYXBwaW5nCisgICAgdm9pZCBpbml0aWFsaXplU3RhbmRhcmRQYXJhbXMoKTsKKworICAgIC8vLyBBZGRzIGluZGljZXMgdG8gdGhlIHN1YnNjcmliZWQgaW5kaWNlcywgYW5kIHVwZGF0ZWQgc3Vic2NyaXB0aW9uIHRvIGNvbXBvbmVudAorICAgIC8vLyBccGFyYW0gYmxvY2tpbmcgYmxvY2tpbmcgbW9kZSB0byB1c2Ugd2l0aCB0aGUgY29tcG9uZW50CisgICAgc3RhdHVzX3Qgc3Vic2NyaWJlVG9Db25maWdVcGRhdGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nID0gQzJfRE9OVF9CTE9DSyk7CisKKyAgICAvLy8gR2V0cyBTREsgZm9ybWF0IGZyb20gY29kZWMgMi4wIHJlZmxlY3RlZCBjb25maWd1cmF0aW9uCisgICAgLy8vIFxwYXJhbSBkb21haW4gaW5wdXQvb3V0cHV0IGJpdG1hc2sKKyAgICBzcDxBTWVzc2FnZT4gZ2V0U2RrRm9ybWF0Rm9yRG9tYWluKAorICAgICAgICAgICAgY29uc3QgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0ICZyZWZsZWN0ZWQsIERvbWFpbiBkb21haW4pIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ29udmVydHMgYSBzZXQgb2YgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGluIGFuIEFNZXNzYWdlIHRvIGEgbGlzdCBvZiBwYXRoLWJhc2VkIENvZGVjCisgICAgICogMi4wIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBkb21haW4gY29uZmlnL3NldFBhcmFtIGJpdG1hc2sKKyAgICAgKi8KKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgZ2V0UmVmbGVjdGVkRm9ybWF0KAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZjb25maWcsIERvbWFpbiBkb21haW4pIGNvbnN0OworfTsKKworREVGSU5FX0VOVU1fT1BFUkFUT1JTKENDb2RlY0NvbmZpZzo6RG9tYWluKQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENfQ09ERUNfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmQ1NzMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5jcHAKQEAgLTAsMCArMSw4MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyQnVmZmVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8aGlkbG1lbW9yeS9GcmFtZXdvcmtVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG5hdGl2ZWJhc2UvbmF0aXZlYmFzZS5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorCisjaW5jbHVkZSAiQ29kZWMyQnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gQ29kZWMyQnVmZmVyCisKK2Jvb2wgQ29kZWMyQnVmZmVyOjpjYW5Db3B5TGluZWFyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3QgeworICAgIGlmIChjb25zdF9jYXN0PENvZGVjMkJ1ZmZlciAqPih0aGlzKS0+YmFzZSgpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAvLyBOb3RoaW5nIHRvIGNvcHksIHNvIHdlIGNhbiBjb3B5IGJ5IGRvaW5nIG5vdGhpbmcuCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoYnVmZmVyLT5kYXRhKCkudHlwZSgpICE9IEMyQnVmZmVyRGF0YTo6TElORUFSKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLnNpemUoKSA9PSAwdSkgeworICAgICAgICAvLyBOb3RoaW5nIHRvIGNvcHksIHNvIHdlIGNhbiBjb3B5IGJ5IGRvaW5nIG5vdGhpbmcuCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuc2l6ZSgpID4gMXUpIHsKKyAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyBob3cgdG8gY29weSBtb3JlIHRoYW4gb25lIGJsb2Nrcy4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0uc2l6ZSgpID4gY2FwYWNpdHkoKSkgeworICAgICAgICAvLyBJdCB3b24ndCBmaXQuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29kZWMyQnVmZmVyOjpjb3B5TGluZWFyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIC8vIFdlIGFzc3VtZSB0aGF0IGFsbCBjYW5Db3B5TGluZWFyKCkgY2hlY2tzIHBhc3NlZC4KKyAgICBpZiAoIWJ1ZmZlciB8fCBidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5zaXplKCkgPT0gMHUKKyAgICAgICAgICAgIHx8IGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpWzBdLnNpemUoKSA9PSAwdSkgeworICAgICAgICBzZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIEMyUmVhZFZpZXcgdmlldyA9IGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpWzBdLm1hcCgpLmdldCgpOworICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoIkVycm9yIHdoaWxlIG1hcHBpbmc6ICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAodmlldy5jYXBhY2l0eSgpID4gY2FwYWNpdHkoKSkgeworICAgICAgICBBTE9HRCgiQzJDb25zdExpbmVhckJsb2NrIGxpZWQgLS0tIGl0IGFjdHVhbGx5IGRvZXNuJ3QgZml0OiB2aWV3KCV1KSA+IHRoaXMoJXp1KSIsCisgICAgICAgICAgICAgICAgdmlldy5jYXBhY2l0eSgpLCBjYXBhY2l0eSgpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1jcHkoYmFzZSgpLCB2aWV3LmRhdGEoKSwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICBzZXRSYW5nZSgwLCB2aWV3LmNhcGFjaXR5KCkpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENvZGVjMkJ1ZmZlcjo6c2V0SW1hZ2VEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZpbWFnZURhdGEpIHsKKyAgICBtSW1hZ2VEYXRhID0gaW1hZ2VEYXRhOworfQorCisvLyBMb2NhbExpbmVhckJ1ZmZlcgorCitib29sIExvY2FsTGluZWFyQnVmZmVyOjpjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3QgeworICAgIHJldHVybiBjYW5Db3B5TGluZWFyKGJ1ZmZlcik7Cit9CisKK2Jvb2wgTG9jYWxMaW5lYXJCdWZmZXI6OmNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgcmV0dXJuIGNvcHlMaW5lYXIoYnVmZmVyKTsKK30KKworLy8gRHVtbXlDb250YWluZXJCdWZmZXIKKworc3RhdGljIHVpbnQ4X3Qgc0R1bW15Qnl0ZVsxXSA9IHsgMCB9OworCitEdW1teUNvbnRhaW5lckJ1ZmZlcjo6RHVtbXlDb250YWluZXJCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcihzRHVtbXlCeXRlLCAxKSksCisgICAgICBtQnVmZmVyUmVmKGJ1ZmZlcikgeworICAgIHNldFJhbmdlKDAsIGJ1ZmZlciA/IDEgOiAwKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBEdW1teUNvbnRhaW5lckJ1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyAgICByZXR1cm4gc3RkOjptb3ZlKG1CdWZmZXJSZWYpOworfQorCitib29sIER1bW15Q29udGFpbmVyQnVmZmVyOjpjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJikgY29uc3QgeworICAgIHJldHVybiAhbUJ1ZmZlclJlZjsKK30KKworYm9vbCBEdW1teUNvbnRhaW5lckJ1ZmZlcjo6Y29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBtQnVmZmVyUmVmID0gYnVmZmVyOworICAgIHNldFJhbmdlKDAsIG1CdWZmZXJSZWYgPyAxIDogMCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIExpbmVhckJsb2NrQnVmZmVyCisKKy8vIHN0YXRpYworc3A8TGluZWFyQmxvY2tCdWZmZXI+IExpbmVhckJsb2NrQnVmZmVyOjpBbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spIHsKKyAgICBDMldyaXRlVmlldyB3cml0ZVZpZXcoYmxvY2stPm1hcCgpLmdldCgpKTsKKyAgICBpZiAod3JpdGVWaWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBuZXcgTGluZWFyQmxvY2tCdWZmZXIoZm9ybWF0LCBzdGQ6Om1vdmUod3JpdGVWaWV3KSwgYmxvY2spOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IExpbmVhckJsb2NrQnVmZmVyOjphc0MyQnVmZmVyKCkgeworICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKG1CbG9jay0+c2hhcmUob2Zmc2V0KCksIHNpemUoKSwgQzJGZW5jZSgpKSk7Cit9CisKK2Jvb2wgTGluZWFyQmxvY2tCdWZmZXI6OmNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCB7CisgICAgcmV0dXJuIGNhbkNvcHlMaW5lYXIoYnVmZmVyKTsKK30KKworYm9vbCBMaW5lYXJCbG9ja0J1ZmZlcjo6Y29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICByZXR1cm4gY29weUxpbmVhcihidWZmZXIpOworfQorCitMaW5lYXJCbG9ja0J1ZmZlcjo6TGluZWFyQmxvY2tCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBDMldyaXRlVmlldyYmIHdyaXRlVmlldywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaykKKyAgICA6IENvZGVjMkJ1ZmZlcihmb3JtYXQsIG5ldyBBQnVmZmVyKHdyaXRlVmlldy5kYXRhKCksIHdyaXRlVmlldy5zaXplKCkpKSwKKyAgICAgIG1Xcml0ZVZpZXcod3JpdGVWaWV3KSwKKyAgICAgIG1CbG9jayhibG9jaykgeworfQorCisvLyBDb25zdExpbmVhckJsb2NrQnVmZmVyCisKKy8vIHN0YXRpYworc3A8Q29uc3RMaW5lYXJCbG9ja0J1ZmZlcj4gQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBpZiAoIWJ1ZmZlcgorICAgICAgICAgICAgfHwgYnVmZmVyLT5kYXRhKCkudHlwZSgpICE9IEMyQnVmZmVyRGF0YTo6TElORUFSCisgICAgICAgICAgICB8fCBidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIEMyUmVhZFZpZXcgcmVhZFZpZXcoYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0ubWFwKCkuZ2V0KCkpOworICAgIGlmIChyZWFkVmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbmV3IENvbnN0TGluZWFyQmxvY2tCdWZmZXIoZm9ybWF0LCBzdGQ6Om1vdmUocmVhZFZpZXcpLCBidWZmZXIpOworfQorCitDb25zdExpbmVhckJsb2NrQnVmZmVyOjpDb25zdExpbmVhckJsb2NrQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgQzJSZWFkVmlldyYmIHJlYWRWaWV3LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcigKKyAgICAgICAgICAgIC8vIE5PVEU6IEFCdWZmZXIgb25seSB0YWtlcyBub24tY29uc3QgcG9pbnRlciBidXQgdGhpcyBkYXRhIGlzCisgICAgICAgICAgICAvLyAgICAgICBzdXBwb3NlZCB0byBiZSByZWFkLW9ubHkuCisgICAgICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QgKj4ocmVhZFZpZXcuZGF0YSgpKSwgcmVhZFZpZXcuY2FwYWNpdHkoKSkpLAorICAgICAgbVJlYWRWaWV3KHJlYWRWaWV3KSwKKyAgICAgIG1CdWZmZXJSZWYoYnVmZmVyKSB7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyAgICByZXR1cm4gc3RkOjptb3ZlKG1CdWZmZXJSZWYpOworfQorCisvLyBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyCisKK25hbWVzcGFjZSB7CisKK2NsYXNzIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBDMkdyYXBoaWNWaWV3IDw9PiBNZWRpYUltYWdlIGNvbnZlcnRlcgorICAgICAqCisgICAgICogXHBhcmFtIHZpZXcgQzJHcmFwaGljVmlldyBvYmplY3QKKyAgICAgKiBccGFyYW0gY29sb3JGb3JtYXQgZGVzaXJlZCBTREsgY29sb3IgZm9ybWF0IGZvciB0aGUgTWVkaWFJbWFnZSAoaWYgdGhpcyBpcyBhIGZsZXhpYmxlIGZvcm1hdCwKKyAgICAgKiAgICAgICAgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHNpbXBseSByZXByZXNlbnQgdGhlIGdyYXBoaWMgdmlldyBhcyBhIGZsZXhpYmxlIFNESyBmb3JtYXQKKyAgICAgKiAgICAgICAgd2l0aG91dCBhIG1lbWNweSkKKyAgICAgKi8KKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyKAorICAgICAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAmdmlldywgaW50MzJfdCBjb2xvckZvcm1hdCkKKyAgICAgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAorICAgICAgICAgIG1WaWV3KHZpZXcpLAorICAgICAgICAgIG1XaWR0aCh2aWV3LndpZHRoKCkpLAorICAgICAgICAgIG1IZWlnaHQodmlldy5oZWlnaHQoKSksCisgICAgICAgICAgbUNvbG9yRm9ybWF0KGNvbG9yRm9ybWF0KSwKKyAgICAgICAgICBtQWxsb2NhdGVkRGVwdGgoMCksCisgICAgICAgICAgbUJhY2tCdWZmZXJTaXplKDApLAorICAgICAgICAgIG1NZWRpYUltYWdlKG5ldyBBQnVmZmVyKHNpemVvZihNZWRpYUltYWdlMikpKSB7CisgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6IHZpZXcuZXJyb3IoKSA9ICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTWVkaWFJbWFnZTIgKm1lZGlhSW1hZ2UgPSAoTWVkaWFJbWFnZTIgKiltTWVkaWFJbWFnZS0+YmFzZSgpOworICAgICAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gdmlldy5sYXlvdXQoKTsKKyAgICAgICAgaWYgKGxheW91dC5udW1QbGFuZXMgPT0gMCkgeworICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogMCBwbGFuZXMiKTsKKyAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KG1lZGlhSW1hZ2UsIDAsIHNpemVvZigqbWVkaWFJbWFnZSkpOworICAgICAgICBtQWxsb2NhdGVkRGVwdGggPSBsYXlvdXQucGxhbmVzWzBdLmFsbG9jYXRlZERlcHRoOworICAgICAgICB1aW50MzJfdCBiaXREZXB0aCA9IGxheW91dC5wbGFuZXNbMF0uYml0RGVwdGg7CisKKyAgICAgICAgLy8gYWxpZ24gd2lkdGggYW5kIGhlaWdodCB0byBzdXBwb3J0IHN1YnNhbXBsaW5nIGNsZWFubHkKKyAgICAgICAgdWludDMyX3QgbVN0cmlkZSA9IGFsaWduKG1XaWR0aCwgMikgKiBkaXZVcChsYXlvdXQucGxhbmVzWzBdLmFsbG9jYXRlZERlcHRoLCA4dSk7CisgICAgICAgIHVpbnQzMl90IG1WU3RyaWRlID0gYWxpZ24obUhlaWdodCwgMik7CisKKyAgICAgICAgc3dpdGNoIChsYXlvdXQudHlwZSkgeworICAgICAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY6CisgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVR5cGUgPSBNZWRpYUltYWdlMjo6TUVESUFfSU1BR0VfVFlQRV9ZVVY7CisgICAgICAgICAgICAgICAgaWYgKGxheW91dC5udW1QbGFuZXMgIT0gMykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiAlZCBwbGFuZXMgZm9yIFlVViBsYXlvdXQiLCBsYXlvdXQubnVtUGxhbmVzKTsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobGF5b3V0LnBsYW5lc1swXS5jaGFubmVsICE9IEMyUGxhbmVJbmZvOjpDSEFOTkVMX1kKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMV0uY2hhbm5lbCAhPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DQgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1syXS5jaGFubmVsICE9IEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NSCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzBdLmNvbFNhbXBsaW5nICE9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMF0ucm93U2FtcGxpbmcgIT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1sxXS5jb2xTYW1wbGluZyAhPSAyCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzFdLnJvd1NhbXBsaW5nICE9IDIKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMl0uY29sU2FtcGxpbmcgIT0gMgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1syXS5yb3dTYW1wbGluZyAhPSAyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6IG5vdCBZVVY0MjAgZm9yIFlVViBsYXlvdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1Db2xvckZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOgorICAgICAgICAgICAgICAgICAgICB7ICAvLyB0cnkgdG8gbWFwIGRpcmVjdGx5LiBjaGVjayBpZiB0aGUgcGxhbmVzIGFyZSBuZWFyIG9uZSBhbm90aGVyCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICptaW5QdHIgPSBtVmlldy5kYXRhKClbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICptYXhQdHIgPSBtVmlldy5kYXRhKClbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBsYW5lU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGF5b3V0Lm51bVBsYW5lczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQbGFuZUluZm8gJnBsYW5lID0gbGF5b3V0LnBsYW5lc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG1pbk9mZnNldCA9IHBsYW5lLm1pbk9mZnNldChtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgbWF4T2Zmc2V0ID0gcGxhbmUubWF4T2Zmc2V0KG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pblB0ciA+IG1WaWV3LmRhdGEoKVtpXSArIG1pbk9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5QdHIgPSBtVmlldy5kYXRhKClbaV0gKyBtaW5PZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhQdHIgPCBtVmlldy5kYXRhKClbaV0gKyBtYXhPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UHRyID0gbVZpZXcuZGF0YSgpW2ldICsgbWF4T2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZVNpemUgKz0gc3RkOjphYnMocGxhbmUucm93SW5jKSAqIGFsaWduKG1IZWlnaHQsIDY0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBwbGFuZS5yb3dTYW1wbGluZyAvIHBsYW5lLmNvbFNhbXBsaW5nICogZGl2VXAobUFsbG9jYXRlZERlcHRoLCA4dSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobWF4UHRyIC0gbWluUHRyICsgMSkgPD0gcGxhbmVTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IHRoaXMgaXMgcmlza3kgYXMgcmVhZGluZy93cml0aW5nIGRhdGEgb3V0IG9mIGJvdW5kIHJlc3VsdHMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgYW4gdW5kZWZpbmVkIGJlaGF2aW9yLCBidXQgZ3JhbGxvYyBkb2VzIGFzc3VtZSBhIGNvbnRpZ3VvdXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgbWFwcGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBsYXlvdXQubnVtUGxhbmVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQbGFuZUluZm8gJnBsYW5lID0gbGF5b3V0LnBsYW5lc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW2ldLm1PZmZzZXQgPSBtVmlldy5kYXRhKClbaV0gLSBtaW5QdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVtpXS5tQ29sSW5jID0gcGxhbmUuY29sSW5jOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbaV0ubVJvd0luYyA9IHBsYW5lLnJvd0luYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW2ldLm1Ib3JpelN1YnNhbXBsaW5nID0gcGxhbmUuY29sU2FtcGxpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVtpXS5tVmVydFN1YnNhbXBsaW5nID0gcGxhbmUucm93U2FtcGxpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XcmFwcGVkID0gbmV3IEFCdWZmZXIoY29uc3RfY2FzdDx1aW50OF90ICo+KG1pblB0ciksIG1heFB0ciAtIG1pblB0ciArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubU9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUNvbEluYyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubVJvd0luYyA9IG1TdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUhvcml6U3Vic2FtcGxpbmcgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1WZXJ0U3Vic2FtcGxpbmcgPSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubU9mZnNldCA9IG1TdHJpZGUgKiBtVlN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tQ29sSW5jID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tUm93SW5jID0gbVN0cmlkZSAvIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubUhvcml6U3Vic2FtcGxpbmcgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1WZXJ0U3Vic2FtcGxpbmcgPSAyOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubU9mZnNldCA9IG1TdHJpZGUgKiBtVlN0cmlkZSAqIDUgLyA0OworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1Db2xJbmMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1Sb3dJbmMgPSBtU3RyaWRlIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5ZXS5tT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5ZXS5tQ29sSW5jID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5ZXS5tUm93SW5jID0gbVN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5ZXS5tSG9yaXpTdWJzYW1wbGluZyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubVZlcnRTdWJzYW1wbGluZyA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tT2Zmc2V0ID0gbVN0cmlkZSAqIG1WU3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Db2xJbmMgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Sb3dJbmMgPSBtU3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1PZmZzZXQgPSBtU3RyaWRlICogbVZTdHJpZGUgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1Db2xJbmMgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1Sb3dJbmMgPSBtU3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiBpbmNvbXBhY3RpYmxlIGNvbG9yIGZvcm1hdCAoJWQpIGZvciBZVVYgbGF5b3V0IiwgbUNvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVZBOgorICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1UeXBlID0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfWVVWQTsKKyAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBoYXZlIGFuIFNESyBZVVZBIGZvcm1hdAorICAgICAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6IGluY29tcGFjdGlibGUgY29sb3IgZm9ybWF0ICglZCkgZm9yIFlVVkEgbGF5b3V0IiwgbUNvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCOgorICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1UeXBlID0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfUkdCOworICAgICAgICAgICAgICAgIHN3aXRjaCAobUNvbG9yRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gbWVkaWEgaW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRSR0JGbGV4aWJsZToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQyNGJpdEJHUjg4ODoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQyNGJpdFJHQjg4ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogaW5jb21wYWN0aWJsZSBjb2xvciBmb3JtYXQgKCVkKSBmb3IgUkdCIGxheW91dCIsIG1Db2xvckZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobGF5b3V0Lm51bVBsYW5lcyAhPSAzKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6ICVkIHBsYW5lcyBmb3IgUkdCIGxheW91dCIsIGxheW91dC5udW1QbGFuZXMpOworICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0JBOgorICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1UeXBlID0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfUkdCQTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1Db2xvckZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIG1lZGlhIGltYWdlCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UkdCQUZsZXhpYmxlOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QUJHUjg4ODg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRBUkdCODg4ODoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiSW5jb21wYWN0aWJsZSBjb2xvciBmb3JtYXQgKCVkKSBmb3IgUkdCQSBsYXlvdXQiLCBtQ29sb3JGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxheW91dC5udW1QbGFuZXMgIT0gNCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiAlZCBwbGFuZXMgZm9yIFJHQkEgbGF5b3V0IiwgbGF5b3V0Lm51bVBsYW5lcyk7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1UeXBlID0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfVU5LTk9XTjsKKyAgICAgICAgICAgICAgICBBTE9HRCgiVW5rbm93biBsYXlvdXQiKTsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZWRpYUltYWdlLT5tTnVtUGxhbmVzID0gbGF5b3V0Lm51bVBsYW5lczsKKyAgICAgICAgbWVkaWFJbWFnZS0+bVdpZHRoID0gbVdpZHRoOworICAgICAgICBtZWRpYUltYWdlLT5tSGVpZ2h0ID0gbUhlaWdodDsKKyAgICAgICAgbWVkaWFJbWFnZS0+bUJpdERlcHRoID0gYml0RGVwdGg7CisgICAgICAgIG1lZGlhSW1hZ2UtPm1CaXREZXB0aEFsbG9jYXRlZCA9IG1BbGxvY2F0ZWREZXB0aDsKKworICAgICAgICB1aW50MzJfdCBidWZmZXJTaXplID0gMDsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxheW91dC5udW1QbGFuZXM7ICsraSkgeworICAgICAgICAgICAgY29uc3QgQzJQbGFuZUluZm8gJnBsYW5lID0gbGF5b3V0LnBsYW5lc1tpXTsKKyAgICAgICAgICAgIGlmIChwbGFuZS5hbGxvY2F0ZWREZXB0aCA8IHBsYW5lLmJpdERlcHRoCisgICAgICAgICAgICAgICAgICAgIHx8IHBsYW5lLnJpZ2h0U2hpZnQgIT0gcGxhbmUuYWxsb2NhdGVkRGVwdGggLSBwbGFuZS5iaXREZXB0aCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJyaWdodFNoaWZ0IHZhbHVlIG9mICV1IHVuc3VwcG9ydGVkIiwgcGxhbmUucmlnaHRTaGlmdCk7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGxhbmUuYWxsb2NhdGVkRGVwdGggPiA4ICYmIHBsYW5lLmVuZGlhbm5lc3MgIT0gQzJQbGFuZUluZm86Ok5BVElWRSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJlbmRpYW5uZXNzIHZhbHVlIG9mICV1IHVuc3VwcG9ydGVkIiwgcGxhbmUuZW5kaWFubmVzcyk7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGxhbmUuYWxsb2NhdGVkRGVwdGggIT0gbUFsbG9jYXRlZERlcHRoIHx8IHBsYW5lLmJpdERlcHRoICE9IGJpdERlcHRoKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImRpZmZlcmVudCBhbGxvY2F0ZWREZXB0aC9iaXREZXB0aCBwZXIgcGxhbmUgdW5zdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlclNpemUgKz0gbVN0cmlkZSAqIG1WU3RyaWRlCisgICAgICAgICAgICAgICAgICAgIC8gcGxhbmUucm93U2FtcGxpbmcgLyBwbGFuZS5jb2xTYW1wbGluZzsKKyAgICAgICAgfQorCisgICAgICAgIG1CYWNrQnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCB7IHJldHVybiBtSW5pdENoZWNrOyB9CisKKyAgICB1aW50MzJfdCBiYWNrQnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1CYWNrQnVmZmVyU2l6ZTsgfQorCisgICAgLyoqCisgICAgICogV3JhcCBDMkdyYXBoaWNWaWV3IHVzaW5nIGEgTWVkaWFJbWFnZTIuIE5vdGUgdGhhdCBpZiBub3Qgd3JhcHBlZCwgdGhlIGNvbnRlbnQgaXMgbm90IG1hcHBlZAorICAgICAqIGluIHRoaXMgZnVuY3Rpb24gLS0tIHRoZSBjYWxsZXIgc2hvdWxkIHVzZSBDb3B5R3JhcGhpY1ZpZXcyTWVkaWFJbWFnZSgpIGZ1bmN0aW9uIHRvIGNvcHkgdGhlCisgICAgICogZGF0YSBpbnRvIGEgYmFja2luZyBidWZmZXIgZXhwbGljaXRseS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gbWVkaWEgYnVmZmVyLiBUaGlzIGlzIG51bGwgaWYgd3JhcHBpbmcgZmFpbGVkLgorICAgICAqLworICAgIHNwPEFCdWZmZXI+IHdyYXAoKSBjb25zdCB7CisgICAgICAgIGlmIChtQmFja0J1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYm9vbCBzZXRCYWNrQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZiYWNrQnVmZmVyKSB7CisgICAgICAgIGlmIChiYWNrQnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmFja0J1ZmZlci0+Y2FwYWNpdHkoKSA8IG1CYWNrQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJhY2tCdWZmZXItPnNldFJhbmdlKDAsIG1CYWNrQnVmZmVyU2l6ZSk7CisgICAgICAgIG1CYWNrQnVmZmVyID0gYmFja0J1ZmZlcjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSBDMkdyYXBoaWNWaWV3IHRvIE1lZGlhSW1hZ2UyLgorICAgICAqLworICAgIHN0YXR1c190IGNvcHlUb01lZGlhSW1hZ2UoKSB7CisgICAgICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSW1hZ2VDb3B5KG1CYWNrQnVmZmVyLT5iYXNlKCksIGdldE1lZGlhSW1hZ2UoKSwgbVZpZXcpOworICAgIH0KKworICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZpbWFnZURhdGEoKSBjb25zdCB7IHJldHVybiBtTWVkaWFJbWFnZTsgfQorCitwcml2YXRlOgorICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisKKyAgICBjb25zdCBDMkdyYXBoaWNWaWV3IG1WaWV3OworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIGludDMyX3QgbUNvbG9yRm9ybWF0OyAgLy8vPCBTREsgY29sb3IgZm9ybWF0IGZvciBNZWRpYUltYWdlCisgICAgc3A8QUJ1ZmZlcj4gbVdyYXBwZWQ7ICAvLy88IHdyYXBwZWQgYnVmZmVyIChpZiB3ZSBjYW4gbWFwIEMyQnVmZmVyIHRvIGFuIEFCdWZmZXIpCisgICAgdWludDMyX3QgbUFsbG9jYXRlZERlcHRoOworICAgIHVpbnQzMl90IG1CYWNrQnVmZmVyU2l6ZTsKKyAgICBzcDxBQnVmZmVyPiBtTWVkaWFJbWFnZTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IG1BbGxvYzsKKworICAgIHNwPEFCdWZmZXI+IG1CYWNrQnVmZmVyOyAgICAvLy88IGJhY2tpbmcgYnVmZmVyIGlmIHdlIGhhdmUgdG8gY29weSBDMkJ1ZmZlciA8PT4gQUJ1ZmZlcgorCisgICAgTWVkaWFJbWFnZTIgKmdldE1lZGlhSW1hZ2UoKSB7CisgICAgICAgIHJldHVybiAoTWVkaWFJbWFnZTIgKiltTWVkaWFJbWFnZS0+YmFzZSgpOworICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBHcmFwaGljQmxvY2tCdWZmZXIKKworLy8gc3RhdGljCitzcDxHcmFwaGljQmxvY2tCdWZmZXI+IEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBhbGxvYykgeworICAgIEMyR3JhcGhpY1ZpZXcgdmlldyhibG9jay0+bWFwKCkuZ2V0KCkpOworICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoIkMyR3JhcGhpY0Jsb2NrOjptYXAgZmFpbGVkOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKyAgICAodm9pZClmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KTsKKworICAgIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgY29udmVydGVyKHZpZXcsIGNvbG9yRm9ybWF0KTsKKyAgICBpZiAoY29udmVydGVyLmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXIgaW5pdCBmYWlsZWQ6ICVkIiwgY29udmVydGVyLmluaXRDaGVjaygpKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGJvb2wgd3JhcHBlZCA9IHRydWU7CisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gY29udmVydGVyLndyYXAoKTsKKyAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgYnVmZmVyID0gYWxsb2MoY29udmVydGVyLmJhY2tCdWZmZXJTaXplKCkpOworICAgICAgICBpZiAoIWNvbnZlcnRlci5zZXRCYWNrQnVmZmVyKGJ1ZmZlcikpIHsKKyAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXIgZmFpbGVkIHRvIHNldCBiYWNrIGJ1ZmZlciIpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgd3JhcHBlZCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbmV3IEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6bW92ZSh2aWV3KSwKKyAgICAgICAgICAgIGJsb2NrLAorICAgICAgICAgICAgY29udmVydGVyLmltYWdlRGF0YSgpLAorICAgICAgICAgICAgd3JhcHBlZCk7Cit9CisKK0dyYXBoaWNCbG9ja0J1ZmZlcjo6R3JhcGhpY0Jsb2NrQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgQzJHcmFwaGljVmlldyAmJnZpZXcsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrLAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhLAorICAgICAgICBib29sIHdyYXBwZWQpCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBidWZmZXIpLAorICAgICAgbVZpZXcodmlldyksCisgICAgICBtQmxvY2soYmxvY2spLAorICAgICAgbVdyYXBwZWQod3JhcHBlZCkgeworICAgIHNldEltYWdlRGF0YShpbWFnZURhdGEpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IEdyYXBoaWNCbG9ja0J1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyAgICB1aW50MzJfdCB3aWR0aCA9IG1WaWV3LndpZHRoKCk7CisgICAgdWludDMyX3QgaGVpZ2h0ID0gbVZpZXcuaGVpZ2h0KCk7CisgICAgaWYgKCFtV3JhcHBlZCkgeworICAgICAgICAodm9pZClJbWFnZUNvcHkobVZpZXcsIGJhc2UoKSwgaW1hZ2VEYXRhKCkpOworICAgIH0KKyAgICByZXR1cm4gQzJCdWZmZXI6OkNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBtQmxvY2stPnNoYXJlKEMyUmVjdCh3aWR0aCwgaGVpZ2h0KSwgQzJGZW5jZSgpKSk7Cit9CisKKy8vIEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcgorR3JhcGhpY01ldGFkYXRhQnVmZmVyOjpHcmFwaGljTWV0YWRhdGFCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvYykKKyAgICA6IENvZGVjMkJ1ZmZlcihmb3JtYXQsIG5ldyBBQnVmZmVyKHNpemVvZihWaWRlb05hdGl2ZU1ldGFkYXRhKSkpLAorICAgICAgbUFsbG9jKGFsbG9jKSB7CisgICAgKChWaWRlb05hdGl2ZU1ldGFkYXRhICopYmFzZSgpKS0+cEJ1ZmZlciA9IG51bGxwdHI7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gR3JhcGhpY01ldGFkYXRhQnVmZmVyOjphc0MyQnVmZmVyKCkgeworI2lmbmRlZiBfX0xQNjRfXworICAgIFZpZGVvTmF0aXZlTWV0YWRhdGEgKm1ldGEgPSAoVmlkZW9OYXRpdmVNZXRhZGF0YSAqKWJhc2UoKTsKKyAgICBBTmF0aXZlV2luZG93QnVmZmVyICpidWZmZXIgPSAoQU5hdGl2ZVdpbmRvd0J1ZmZlciAqKW1ldGEtPnBCdWZmZXI7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJWaWRlb05hdGl2ZU1ldGFkYXRhIGNvbnRhaW5zIG51bGwgYnVmZmVyIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIEFMT0dWKCJWaWRlb05hdGl2ZU1ldGFkYXRhOiAlZHglZCIsIGJ1ZmZlci0+d2lkdGgsIGJ1ZmZlci0+aGVpZ2h0KTsKKyAgICBDMkhhbmRsZSAqaGFuZGxlID0gV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgICAgICBidWZmZXItPmhhbmRsZSwKKyAgICAgICAgICAgIGJ1ZmZlci0+d2lkdGgsCisgICAgICAgICAgICBidWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgIGJ1ZmZlci0+Zm9ybWF0LAorICAgICAgICAgICAgYnVmZmVyLT51c2FnZSwKKyAgICAgICAgICAgIGJ1ZmZlci0+c3RyaWRlKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gd3JhcCBWaWRlb05hdGl2ZU1ldGFkYXRhIGludG8gQzJHcmFwaGljQWxsb2NhdGlvbiIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jKTsKKworICAgIG1ldGEtPnBCdWZmZXIgPSAwOworICAgIC8vIFRPRE86IGZlbmNlCisgICAgcmV0dXJuIEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgYmxvY2stPnNoYXJlKEMyUmVjdChidWZmZXItPndpZHRoLCBidWZmZXItPmhlaWdodCksIEMyRmVuY2UoKSkpOworI2Vsc2UKKyAgICBBTE9HRSgiR3JhcGhpY01ldGFkYXRhQnVmZmVyIGRvZXMgbm90IHdvcmsgb24gNjQtYml0IGFyY2giKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyNlbmRpZgorfQorCisvLyBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcgorCisvLyBzdGF0aWMKK3NwPENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyPiBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8QUJ1ZmZlcj4oc2l6ZV90KT4gYWxsb2MpIHsKKyAgICBpZiAoIWJ1ZmZlcgorICAgICAgICAgICAgfHwgYnVmZmVyLT5kYXRhKCkudHlwZSgpICE9IEMyQnVmZmVyRGF0YTo6R1JBUEhJQworICAgICAgICAgICAgfHwgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLnNpemUoKSAhPSAxdSkgeworICAgICAgICBBTE9HRCgiQzJCdWZmZXIgcHJlY29uZCBmYWlsIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gdmlldyhzdGQ6Om1ha2VfdW5pcXVlPGNvbnN0IEMyR3JhcGhpY1ZpZXc+KAorICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpWzBdLm1hcCgpLmdldCgpKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IGhvbGRlcjsKKworICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKyAgICAodm9pZClmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KTsKKworICAgIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgY29udmVydGVyKCp2aWV3LCBjb2xvckZvcm1hdCk7CisgICAgaWYgKGNvbnZlcnRlci5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICBBTE9HRCgiQ29udmVydGVyIGluaXQgZmFpbGVkOiAlZCIsIGNvbnZlcnRlci5pbml0Q2hlY2soKSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBib29sIHdyYXBwZWQgPSB0cnVlOworICAgIHNwPEFCdWZmZXI+IGFCdWZmZXIgPSBjb252ZXJ0ZXIud3JhcCgpOworICAgIGlmIChhQnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgYUJ1ZmZlciA9IGFsbG9jKGNvbnZlcnRlci5iYWNrQnVmZmVyU2l6ZSgpKTsKKyAgICAgICAgaWYgKCFjb252ZXJ0ZXIuc2V0QmFja0J1ZmZlcihhQnVmZmVyKSkgeworICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlciBmYWlsZWQgdG8gc2V0IGJhY2sgYnVmZmVyIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICB3cmFwcGVkID0gZmFsc2U7CisgICAgICAgIGNvbnZlcnRlci5jb3B5VG9NZWRpYUltYWdlKCk7CisgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdGhlIHZpZXcuCisgICAgICAgIGhvbGRlciA9IHN0ZDo6bW92ZSh2aWV3KTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgIGFCdWZmZXIsCisgICAgICAgICAgICBzdGQ6Om1vdmUodmlldyksCisgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICBjb252ZXJ0ZXIuaW1hZ2VEYXRhKCksCisgICAgICAgICAgICB3cmFwcGVkKTsKK30KKworLy8gc3RhdGljCitzcDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcj4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlRW1wdHkoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IGFsbG9jKSB7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKQorICAgICAgICAgICAgfHwgIWZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICBBTE9HRCgiZm9ybWF0IGhhZCBubyB3aWR0aCAvIGhlaWdodCIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3A8QUJ1ZmZlcj4gYUJ1ZmZlcihhbGxvYyh3aWR0aCAqIGhlaWdodCAqIDQpKTsKKyAgICByZXR1cm4gbmV3IENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyKAorICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgYUJ1ZmZlciwKKyAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgIGZhbHNlKTsKK30KKworQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFCdWZmZXIsCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiAmJnZpZXcsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmltYWdlRGF0YSwKKyAgICAgICAgYm9vbCB3cmFwcGVkKQorICAgIDogQ29kZWMyQnVmZmVyKGZvcm1hdCwgYUJ1ZmZlciksCisgICAgICBtVmlldyhzdGQ6Om1vdmUodmlldykpLAorICAgICAgbUJ1ZmZlclJlZihidWZmZXIpLAorICAgICAgbVdyYXBwZWQod3JhcHBlZCkgeworICAgIHNldEltYWdlRGF0YShpbWFnZURhdGEpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjphc0MyQnVmZmVyKCkgeworICAgIG1WaWV3LnJlc2V0KCk7CisgICAgcmV0dXJuIHN0ZDo6bW92ZShtQnVmZmVyUmVmKTsKK30KKworYm9vbCBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IHsKKyAgICBpZiAobVdyYXBwZWQgfHwgbUJ1ZmZlclJlZikgeworICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHk6ICVzd3JhcHBlZCA7IGJ1ZmZlciByZWYgJXMiLAorICAgICAgICAgICAgICAgIG1XcmFwcGVkID8gIiIgOiAibm90ICIsIG1CdWZmZXJSZWYgPyAiZXhpc3RzIiA6ICJkb2Vzbid0IGV4aXN0Iik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBjb3B5LCBzbyB3ZSBjYW4gY29weSBieSBkb2luZyBub3RoaW5nLgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSAhPSBDMkJ1ZmZlckRhdGE6OkdSQVBISUMpIHsKKyAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5OiBidWZmZXIgcHJlY29uZGl0aW9uIHVuc2F0aXNmaWVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5OiB0b28gbWFueSBibG9ja3MiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKyAgICAvLyBGSVhNRTogZm9ybWF0KCkgaXMgbm90IGNvbnN0LCBidXQgd2UgY2Fubm90IGNoYW5nZSBpdCwgc28gZG8gYSBjb25zdCBjYXN0IGhlcmUKKyAgICBjb25zdF9jYXN0PENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyICo+KHRoaXMpLT5mb3JtYXQoKS0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmY29sb3JGb3JtYXQpOworCisgICAgR3JhcGhpY1ZpZXcyTWVkaWFJbWFnZUNvbnZlcnRlciBjb252ZXJ0ZXIoCisgICAgICAgICAgICBidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKClbMF0ubWFwKCkuZ2V0KCksIGNvbG9yRm9ybWF0KTsKKyAgICBpZiAoY29udmVydGVyLmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y2FuQ29weTogY29udmVydGVyIGluaXQgZmFpbGVkOiAlZCIsIGNvbnZlcnRlci5pbml0Q2hlY2soKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGNvbnZlcnRlci5iYWNrQnVmZmVyU2l6ZSgpID4gY2FwYWNpdHkoKSkgeworICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHk6IGluc3VmZmljaWVudCBjYXBhY2l0eTogcmVxICV1IGhhcyAlenUiLAorICAgICAgICAgICAgICAgIGNvbnZlcnRlci5iYWNrQnVmZmVyU2l6ZSgpLCBjYXBhY2l0eSgpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBpZiAoIWJ1ZmZlciB8fCBidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgc2V0UmFuZ2UoMCwgMCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgZm9ybWF0KCktPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KTsKKworICAgIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgY29udmVydGVyKAorICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpWzBdLm1hcCgpLmdldCgpLCBjb2xvckZvcm1hdCk7CisgICAgaWYgKGNvbnZlcnRlci5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNvcHk6IGNvbnZlcnRlciBpbml0IGZhaWxlZDogJWQiLCBjb252ZXJ0ZXIuaW5pdENoZWNrKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHNwPEFCdWZmZXI+IGFCdWZmZXIgPSBuZXcgQUJ1ZmZlcihiYXNlKCksIGNhcGFjaXR5KCkpOworICAgIGlmICghY29udmVydGVyLnNldEJhY2tCdWZmZXIoYUJ1ZmZlcikpIHsKKyAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjb3B5OiBzZXQgYmFjayBidWZmZXIgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29udmVydGVyLmNvcHlUb01lZGlhSW1hZ2UoKTsKKyAgICBzZXRJbWFnZURhdGEoY29udmVydGVyLmltYWdlRGF0YSgpKTsKKyAgICBtQnVmZmVyUmVmID0gYnVmZmVyOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcgorCitFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6RW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrLAorICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmbWVtb3J5LAorICAgICAgICBpbnQzMl90IGhlYXBTZXFOdW0pCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcihtZW1vcnktPnBvaW50ZXIoKSwgbWVtb3J5LT5zaXplKCkpKSwKKyAgICAgIG1CbG9jayhibG9jayksCisgICAgICBtTWVtb3J5KG1lbW9yeSksCisgICAgICBtSGVhcFNlcU51bShoZWFwU2VxTnVtKSB7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OmFzQzJCdWZmZXIoKSB7CisgICAgcmV0dXJuIEMyQnVmZmVyOjpDcmVhdGVMaW5lYXJCdWZmZXIobUJsb2NrLT5zaGFyZShvZmZzZXQoKSwgc2l6ZSgpLCBDMkZlbmNlKCkpKTsKK30KKwordm9pZCBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6ZmlsbFNvdXJjZUJ1ZmZlcigKKyAgICAgICAgSUNyeXB0bzo6U291cmNlQnVmZmVyICpzb3VyY2UpIHsKKyAgICBzb3VyY2UtPm1TaGFyZWRNZW1vcnkgPSBtTWVtb3J5OworICAgIHNvdXJjZS0+bUhlYXBTZXFOdW0gPSBtSGVhcFNlcU51bTsKK30KKwordm9pZCBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6ZmlsbFNvdXJjZUJ1ZmZlcigKKyAgICAgICAgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTaGFyZWRCdWZmZXIgKnNvdXJjZSkgeworICAgIHNzaXplX3Qgb2Zmc2V0OworICAgIHNpemVfdCBzaXplOworCisgICAgbUhpZGxNZW1vcnkgPSBoYXJkd2FyZTo6ZnJvbUhlYXAobU1lbW9yeS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKSk7CisgICAgc291cmNlLT5oZWFwQmFzZSA9ICptSGlkbE1lbW9yeTsKKyAgICBzb3VyY2UtPm9mZnNldCA9IG9mZnNldDsKKyAgICBzb3VyY2UtPnNpemUgPSBzaXplOworfQorCitib29sIEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyOjpjb3B5RGVjcnlwdGVkQ29udGVudCgKKyAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJmRlY3J5cHRlZCwgc2l6ZV90IGxlbmd0aCkgeworICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBtQmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAodmlldy5zaXplKCkgPCBsZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1jcHkodmlldy5kYXRhKCksIGRlY3J5cHRlZC0+cG9pbnRlcigpLCBsZW5ndGgpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyOjpjb3B5RGVjcnlwdGVkQ29udGVudEZyb21NZW1vcnkoc2l6ZV90IGxlbmd0aCkgeworICAgIHJldHVybiBjb3B5RGVjcnlwdGVkQ29udGVudChtTWVtb3J5LCBsZW5ndGgpOworfQorCituYXRpdmVfaGFuZGxlX3QgKkVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyOjpoYW5kbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KG1CbG9jay0+aGFuZGxlKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNjE4YWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmgKQEAgLTAsMCArMSw0MDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9CVUZGRVJfSF8KKworI2RlZmluZSBDT0RFQzJfQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQ29waWVzIGEgZ3JhcGhpYyB2aWV3IGludG8gYSBtZWRpYSBpbWFnZS4KKyAqCisgKiBccGFyYW0gaW1nQmFzZSBiYXNlIG9mIE1lZGlhSW1hZ2UKKyAqIFxwYXJhbSBpbWcgTWVkaWFJbWFnZSBkYXRhCisgKiBccGFyYW0gdmlldyBncmFwaGljIHZpZXcKKyAqCisgKiBccmV0dXJuIE9LIG9uIHN1Y2Nlc3MKKyAqLworc3RhdHVzX3QgSW1hZ2VDb3B5KHVpbnQ4X3QgKmltZ0Jhc2UsIGNvbnN0IE1lZGlhSW1hZ2UyICppbWcsIGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcpOworCisvKioKKyAqIENvcGllcyBhIG1lZGlhIGltYWdlIGludG8gYSBncmFwaGljIHZpZXcuCisgKgorICogXHBhcmFtIHZpZXcgZ3JhcGhpYyB2aWV3CisgKiBccGFyYW0gaW1nQmFzZSBiYXNlIG9mIE1lZGlhSW1hZ2UKKyAqIFxwYXJhbSBpbWcgTWVkaWFJbWFnZSBkYXRhCisgKgorICogXHJldHVybiBPSyBvbiBzdWNjZXNzCisgKi8KK3N0YXR1c190IEltYWdlQ29weShDMkdyYXBoaWNWaWV3ICZ2aWV3LCBjb25zdCB1aW50OF90ICppbWdCYXNlLCBjb25zdCBNZWRpYUltYWdlMiAqaW1nKTsKKworY2xhc3MgQ29kZWMyQnVmZmVyIDogcHVibGljIE1lZGlhQ29kZWNCdWZmZXIgeworcHVibGljOgorICAgIHVzaW5nIE1lZGlhQ29kZWNCdWZmZXI6Ok1lZGlhQ29kZWNCdWZmZXI7CisgICAgfkNvZGVjMkJ1ZmZlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gIEMyQnVmZmVyIG9iamVjdCByZXByZXNlbnRzIHRoaXMgYnVmZmVyLgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgPSAwOworCisgICAgLyoqCisgICAgICogVGVzdCBpZiB3ZSBjYW4gY29weSB0aGUgY29udGVudCBvZiB8YnVmZmVyfCBpbnRvIHRoaXMgb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtICAgYnVmZmVyICBDMkJ1ZmZlciBvYmplY3QgdG8gY29weS4KKyAgICAgKiBccmV0dXJuICB0cnVlICAgIGlmIHRoZSBjb250ZW50IG9mIGJ1ZmZlciBjYW4gYmUgY29waWVkIG92ZXIgdG8gdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICBmYWxzZSAgIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgY2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IHsKKyAgICAgICAgKHZvaWQpYnVmZmVyOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSB0aGUgY29udGVudCBvZiB8YnVmZmVyfCBpbnRvIHRoaXMgb2JqZWN0LiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQKKyAgICAgKiBjYW5Db3B5KCkgY2hlY2sgYWxyZWFkeSBwYXNzZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBidWZmZXIgIEMyQnVmZmVyIG9iamVjdCB0byBjb3B5LgorICAgICAqIFxyZXR1cm4gIHRydWUgICAgaWYgc3VjY2Vzc2Z1bAorICAgICAqICAgICAgICAgIGZhbHNlICAgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBjb3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgICAgICAodm9pZClidWZmZXI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBnZXRJbWFnZURhdGEoKSBjb25zdCB7IHJldHVybiBtSW1hZ2VEYXRhOyB9CisKK3Byb3RlY3RlZDoKKyAgICAvKioKKyAgICAgKiBjYW5Db3B5KCkgaW1wbGVtZW50YXRpb24gZm9yIGxpbmVhciBidWZmZXJzLgorICAgICAqLworICAgIGJvb2wgY2FuQ29weUxpbmVhcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0OworCisgICAgLyoqCisgICAgICogY29weSgpIGltcGxlbWVudGF0aW9uIGZvciBsaW5lYXIgYnVmZmVycy4KKyAgICAgKi8KKyAgICBib29sIGNvcHlMaW5lYXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKTsKKworICAgIC8qKgorICAgICAqIHNldHMgTWVkaWFJbWFnZSBkYXRhIGZvciBmbGV4aWJsZSBncmFwaGljIGJ1ZmZlcnMKKyAgICAgKi8KKyAgICB2b2lkIHNldEltYWdlRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhKTsKKworICAgIHNwPEFCdWZmZXI+IG1JbWFnZURhdGE7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gb24gdG9wIG9mIGxvY2FsIGxpbmVhciBidWZmZXIuIFRoaXMgY2Fubm90CisgKiBjcm9zcyBwcm9jZXNzIGJvdW5kYXJ5IHNvIGFzQzJCdWZmZXIoKSByZXR1cm5zIG9ubHkgbnVsbHB0ci4KKyAqLworY2xhc3MgTG9jYWxMaW5lYXJCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICB1c2luZyBDb2RlYzJCdWZmZXI6OkNvZGVjMkJ1ZmZlcjsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgICBib29sIGNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIGNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKK307CisKKy8qKgorICogTWVkaWFDb2RlY0J1ZmZlciBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkIG9ubHkgYXMgYSBkdW1teSB3cmFwcGVyIGFyb3VuZCBhCisgKiBDMkJ1ZmZlciBvYmplY3QuCisgKi8KK2NsYXNzIER1bW15Q29udGFpbmVyQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgRHVtbXlDb250YWluZXJCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciA9IG51bGxwdHIpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBjb3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBtQnVmZmVyUmVmOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIHdyYXBzIGFyb3VuZCBDMkxpbmVhckJsb2NrLgorICovCitjbGFzcyBMaW5lYXJCbG9ja0J1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEFsbG9jYXRlIGEgbmV3IExpbmVhckJ1ZmZlckJsb2NrIHdyYXBwaW5nIGFyb3VuZCBDMkxpbmVhckJsb2NrIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGZvcm1hdCAgbWFuZGF0b3J5IGJ1ZmZlciBmb3JtYXQgZm9yIE1lZGlhQ29kZWNCdWZmZXIKKyAgICAgKiBccGFyYW0gICBibG9jayAgIEMyTGluZWFyQmxvY2sgb2JqZWN0IHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgTGluZWFyQmxvY2tCdWZmZXIgb2JqZWN0IHdpdGggd3JpdGFibGUgbWFwcGluZy4KKyAgICAgKiAgICAgICAgICAgICAgICAgIG51bGxwdHIgaWYgdW5zdWNjZXNzZnVsLgorICAgICAqLworICAgIHN0YXRpYyBzcDxMaW5lYXJCbG9ja0J1ZmZlcj4gQWxsb2NhdGUoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jayk7CisKKyAgICB2aXJ0dWFsIH5MaW5lYXJCbG9ja0J1ZmZlcigpID0gZGVmYXVsdDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworICAgIGJvb2wgY2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgY29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIExpbmVhckJsb2NrQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBDMldyaXRlVmlldyAmJndyaXRlVmlldywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spOworICAgIExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWxldGU7CisKKyAgICBDMldyaXRlVmlldyBtV3JpdGVWaWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBtQmxvY2s7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gd3JhcHMgYXJvdW5kIEMyQ29uc3RMaW5lYXJCbG9jay4KKyAqLworY2xhc3MgQ29uc3RMaW5lYXJCbG9ja0J1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEFsbG9jYXRlIGEgbmV3IENvbnN0TGluZWFyQmxvY2tCdWZmZXIgd3JhcHBpbmcgYXJvdW5kIEMyQnVmZmVyIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGZvcm1hdCAgbWFuZGF0b3J5IGJ1ZmZlciBmb3JtYXQgZm9yIE1lZGlhQ29kZWNCdWZmZXIKKyAgICAgKiBccGFyYW0gICBidWZmZXIgIGxpbmVhciBDMkJ1ZmZlciBvYmplY3QgdG8gd3JhcCBhcm91bmQuCisgICAgICogXHJldHVybiAgICAgICAgICBDb25zdExpbmVhckJsb2NrQnVmZmVyIG9iamVjdCB3aXRoIHJlYWRhYmxlIG1hcHBpbmcuCisgICAgICogICAgICAgICAgICAgICAgICBudWxscHRyIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8Q29uc3RMaW5lYXJCbG9ja0J1ZmZlcj4gQWxsb2NhdGUoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKTsKKworICAgIHZpcnR1YWwgfkNvbnN0TGluZWFyQmxvY2tCdWZmZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBDb25zdExpbmVhckJsb2NrQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBDMlJlYWRWaWV3ICYmcmVhZFZpZXcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpOworICAgIENvbnN0TGluZWFyQmxvY2tCdWZmZXIoKSA9IGRlbGV0ZTsKKworICAgIEMyUmVhZFZpZXcgbVJlYWRWaWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gbUJ1ZmZlclJlZjsKK307CisKKy8qKgorICogTWVkaWFDb2RlY0J1ZmZlciBpbXBsZW1lbnRhdGlvbiB3cmFwcyBhcm91bmQgQzJHcmFwaGljQmxvY2suCisgKgorICogVGhpcyBvYmplY3QgZXhwb3NlcyB0aGUgdW5kZXJseWluZyBiaXRzIHZpYSBhY2Nlc3NvciBBUElzIGFuZCAiaW1hZ2UtZGF0YSIKKyAqIG1ldGFkYXRhLCBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYXQgYWxsb2NhdGlvbiB0aW1lLgorICovCitjbGFzcyBHcmFwaGljQmxvY2tCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBHcmFwaGljQmxvY2tCdWZmZXIgd3JhcHBpbmcgYXJvdW5kIEMyR3JhcGhpY0Jsb2NrIG9iamVjdC4KKyAgICAgKiBJZiB8YmxvY2t8IGlzIG5vdCBpbiBnb29kIGNvbG9yIGZvcm1hdHMsIGl0IGFsbG9jYXRlcyBZVjEyIGxvY2FsIGJ1ZmZlcgorICAgICAqIGFuZCBjb3BpZXMgdGhlIGNvbnRlbnQgb3ZlciBhdCBhc0MyQnVmZmVyKCkuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYmxvY2sgICBDMkdyYXBoaWNCbG9jayBvYmplY3QgdG8gd3JhcCBhcm91bmQuCisgICAgICogXHBhcmFtICAgYWxsb2MgICBhIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIGJhY2tpbmcgQUJ1ZmZlciBpZiBuZWVkZWQuCisgICAgICogXHJldHVybiAgICAgICAgICBHcmFwaGljQmxvY2tCdWZmZXIgb2JqZWN0IHdpdGggd3JpdGFibGUgbWFwcGluZy4KKyAgICAgKiAgICAgICAgICAgICAgICAgIG51bGxwdHIgaWYgdW5zdWNjZXNzZnVsLgorICAgICAqLworICAgIHN0YXRpYyBzcDxHcmFwaGljQmxvY2tCdWZmZXI+IEFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8QUJ1ZmZlcj4oc2l6ZV90KT4gYWxsb2MpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIH5HcmFwaGljQmxvY2tCdWZmZXIoKSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgR3JhcGhpY0Jsb2NrQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgQzJHcmFwaGljVmlldyAmJnZpZXcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywKKyAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZpbWFnZURhdGEsCisgICAgICAgICAgICBib29sIHdyYXBwZWQpOworICAgIEdyYXBoaWNCbG9ja0J1ZmZlcigpID0gZGVsZXRlOworCisgICAgaW5saW5lIE1lZGlhSW1hZ2UyICppbWFnZURhdGEoKSB7IHJldHVybiAoTWVkaWFJbWFnZTIgKiltSW1hZ2VEYXRhLT5kYXRhKCk7IH0KKworICAgIEMyR3JhcGhpY1ZpZXcgbVZpZXc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBtQmxvY2s7CisgICAgY29uc3QgYm9vbCBtV3JhcHBlZDsKK307CisKKy8qKgorICogTWVkaWFDb2RlY0J1ZmZlciBpbXBsZW1lbnRhdGlvbiB3cmFwcyBhcm91bmQgVmlkZW9OYXRpdmVNZXRhZGF0YS4KKyAqLworY2xhc3MgR3JhcGhpY01ldGFkYXRhQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IEdyYXBoaWNNZXRhZGF0YUJ1ZmZlciB3aXRoIGxvY2FsIGxpbmVhciBidWZmZXIgZm9yCisgICAgICogVmlkZW9OYXRpdmVNZXRhZGF0YS4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGZvcm1hdCAgICAgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICovCisgICAgR3JhcGhpY01ldGFkYXRhQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB+R3JhcGhpY01ldGFkYXRhQnVmZmVyKCkgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcigpID0gZGVsZXRlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2M7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gd3JhcHMgYXJvdW5kIGdyYXBoaWMgQzJCdWZmZXIgb2JqZWN0LgorICoKKyAqIFRoaXMgb2JqZWN0IGV4cG9zZXMgdGhlIHVuZGVybHlpbmcgYml0cyB2aWEgYWNjZXNzb3IgQVBJcyBhbmQgImltYWdlLWRhdGEiCisgKiBtZXRhZGF0YSwgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGF0IGFsbG9jYXRpb24gdGltZS4KKyAqLworY2xhc3MgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciB3cmFwcGluZyBhcm91bmQgQzJCdWZmZXIgb2JqZWN0LgorICAgICAqIElmIHxidWZmZXJ8IGlzIG5vdCBpbiBnb29kIGNvbG9yIGZvcm1hdHMsIGl0IGFsbG9jYXRlcyBZVjEyIGxvY2FsIGJ1ZmZlcgorICAgICAqIGFuZCBjb3BpZXMgdGhlIGNvbnRlbnQgb2YgfGJ1ZmZlcnwgb3ZlciB0byBleHBvc2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYnVmZmVyICBncmFwaGljIEMyQnVmZmVyIG9iamVjdCB0byB3cmFwIGFyb3VuZC4KKyAgICAgKiBccGFyYW0gICBhbGxvYyAgIGEgZnVuY3Rpb24gdG8gYWxsb2NhdGUgYmFja2luZyBBQnVmZmVyIGlmIG5lZWRlZC4KKyAgICAgKiBccmV0dXJuICAgICAgICAgIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyIG9iamVjdCB3aXRoIHJlYWRhYmxlIG1hcHBpbmcuCisgICAgICogICAgICAgICAgICAgICAgICBudWxscHRyIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8Q29uc3RHcmFwaGljQmxvY2tCdWZmZXI+IEFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IGFsbG9jKTsKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlIGEgbmV3IENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyIHdoaWNoIGFsbG9jYXRlcyBZVjEyIGxvY2FsIGJ1ZmZlcgorICAgICAqIGFuZCBjb3BpZXMgdGhlIGNvbnRlbnQgb2YgfGJ1ZmZlcnwgb3ZlciB0byBleHBvc2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYWxsb2MgICBhIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIGJhY2tpbmcgQUJ1ZmZlciBpZiBuZWVkZWQuCisgICAgICogXHJldHVybiAgICAgICAgICBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciBvYmplY3Qgd2l0aCBubyB3cmFwcGluZyBidWZmZXIuCisgICAgICovCisgICAgc3RhdGljIHNwPENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyPiBBbGxvY2F0ZUVtcHR5KAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IGFsbG9jKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworICAgIGJvb2wgY2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgY29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB+Q29uc3RHcmFwaGljQmxvY2tCdWZmZXIoKSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZhQnVmZmVyLAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+ICYmdmlldywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZpbWFnZURhdGEsCisgICAgICAgICAgICBib29sIHdyYXBwZWQpOworICAgIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyKCkgPSBkZWxldGU7CisKKyAgICBzcDxBQnVmZmVyPiBtSW1hZ2VEYXRhOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiBtVmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IG1CdWZmZXJSZWY7CisgICAgY29uc3QgYm9vbCBtV3JhcHBlZDsKK307CisKKy8qKgorICogTWVkaWFDb2RlY0J1ZmZlciBpbXBsZW1lbnRhdGlvbiB3cmFwcyBhcm91bmQgQzJMaW5lYXJCbG9jayBmb3IgY29tcG9uZW50CisgKiBhbmQgSU1lbW9yeSBmb3IgY2xpZW50LiBVbmRlcmx5aW5nIEMyTGluZWFyQmxvY2sgd29uJ3QgYmUgbWFwcGVkIGZvciBzZWN1cmUKKyAqIHVzZWNhc2VzLi4KKyAqLworY2xhc3MgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgRW5jcnlwdGVkTGluZWFyQnVmZmVyQmxvY2sgd3JhcHBpbmcgYXJvdW5kIEMyTGluZWFyQmxvY2sKKyAgICAgKiBvYmplY3QgYW5kIHdyaXRhYmxlIElNZW1vcnkgcmVnaW9uLgorICAgICAqCisgICAgICogXHBhcmFtICAgZm9ybWF0ICAgICAgbWFuZGF0b3J5IGJ1ZmZlciBmb3JtYXQgZm9yIE1lZGlhQ29kZWNCdWZmZXIKKyAgICAgKiBccGFyYW0gICBibG9jayAgICAgICBDMkxpbmVhckJsb2NrIG9iamVjdCB0byB3cmFwIGFyb3VuZC4KKyAgICAgKiBccGFyYW0gICBtZW1vcnkgICAgICBJTWVtb3J5IG9iamVjdCB0byBzdG9yZSBlbmNyeXB0ZWQgY29udGVudC4KKyAgICAgKiBccGFyYW0gICBoZWFwU2VxTnVtICBIZWFwIHNlcXVlbmNlIG51bWJlciBmcm9tIElDcnlwdG87IC0xIGlmIE4vQQorICAgICAqLworICAgIEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJm1lbW9yeSwKKyAgICAgICAgICAgIGludDMyX3QgaGVhcFNlcU51bSA9IC0xKTsKKyAgICBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcigpID0gZGVsZXRlOworCisgICAgdmlydHVhbCB+RW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIEZpbGwgdGhlIHNvdXJjZSBidWZmZXIgc3RydWN0dXJlIHdpdGggYXBwcm9wcmlhdGUgdmFsdWUgYmFzZWQgb24KKyAgICAgKiBpbnRlcm5hbCBJTWVtb3J5IG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzb3VyY2UgIHNvdXJjZSBidWZmZXIgc3RydWN0dXJlIHRvIGZpbGwuCisgICAgICovCisgICAgdm9pZCBmaWxsU291cmNlQnVmZmVyKElDcnlwdG86OlNvdXJjZUJ1ZmZlciAqc291cmNlKTsKKyAgICB2b2lkIGZpbGxTb3VyY2VCdWZmZXIoCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OlNoYXJlZEJ1ZmZlciAqc291cmNlKTsKKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGNvbnRlbnQgb2YgfGRlY3J5cHRlZHwgaW50byBDMkxpbmVhckJsb2NrIGluc2lkZS4gVGhpcyBzaGFsbAorICAgICAqIG9ubHkgYmUgY2FsbGVkIGluIG5vbi1zZWN1cmUgdXNlY2FzZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBkZWNyeXB0ZWQgICBkZWNyeXB0ZWQgY29udGVudCB0byBjb3B5IGZyb20uCisgICAgICogXHBhcmFtICAgbGVuZ3RoICAgICAgbGVuZ3RoIG9mIHRoZSBjb250ZW50CisgICAgICogXHJldHVybiAgdHJ1ZSAgICAgICAgaWYgc3VjY2Vzc2Z1bAorICAgICAqICAgICAgICAgIGZhbHNlICAgICAgIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIGNvcHlEZWNyeXB0ZWRDb250ZW50KGNvbnN0IHNwPElNZW1vcnk+ICZkZWNyeXB0ZWQsIHNpemVfdCBsZW5ndGgpOworCisgICAgLyoqCisgICAgICogQ29weSB0aGUgY29udGVudCBvZiBpbnRlcm5hbCBJTWVtb3J5IG9iamVjdCBpbnRvIEMyTGluZWFyQmxvY2sgaW5zaWRlLgorICAgICAqIFRoaXMgc2hhbGwgb25seSBiZSBjYWxsZWQgaW4gbm9uLXNlY3VyZSB1c2VjYXNlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGxlbmd0aCAgICAgIGxlbmd0aCBvZiB0aGUgY29udGVudAorICAgICAqIFxyZXR1cm4gIHRydWUgICAgICAgIGlmIHN1Y2Nlc3NmdWwKKyAgICAgKiAgICAgICAgICBmYWxzZSAgICAgICBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbCBjb3B5RGVjcnlwdGVkQ29udGVudEZyb21NZW1vcnkoc2l6ZV90IGxlbmd0aCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gbmF0aXZlIGhhbmRsZSBvZiBzZWN1cmUgYnVmZmVyIHVuZGVyc3Rvb2QgYnkgSUNyeXB0by4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2VjdXJlIGJ1ZmZlciBoYW5kbGUKKyAgICAgKi8KKyAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSgpIGNvbnN0OworCitwcml2YXRlOgorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IG1CbG9jazsKKyAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OworICAgIHNwPGhhcmR3YXJlOjpIaWRsTWVtb3J5PiBtSGlkbE1lbW9yeTsKKyAgICBpbnQzMl90IG1IZWFwU2VxTnVtOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWQwYTliCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmNwcApAQCAtMCwwICsxLDQxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMySW5mb0J1aWxkZXIiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8c3RyaW5ncy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMk1hcHBlci5oPgorCisjaW5jbHVkZSA8T01YX0F1ZGlvLmg+CisjaW5jbHVkZSA8T01YX0F1ZGlvRXh0Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CisjaW5jbHVkZSA8T01YX1R5cGVzLmg+CisjaW5jbHVkZSA8T01YX1ZpZGVvLmg+CisjaW5jbHVkZSA8T01YX1ZpZGVvRXh0Lmg+CisjaW5jbHVkZSA8T01YX0FzU3RyaW5nLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214T2JzZXJ2ZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teE5vZGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb2t1cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmg+CisKKyNpbmNsdWRlICJDb2RlYzJJbmZvQnVpbGRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIFRyYWl0cyA9IEMyQ29tcG9uZW50OjpUcmFpdHM7CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworYm9vbCBoYXNQcmVmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIHMsIGNvbnN0IGNoYXIqIHByZWZpeCkgeworICAgIHNpemVfdCBwcmVmaXhMZW4gPSBzdHJsZW4ocHJlZml4KTsKKyAgICByZXR1cm4gcy5jb21wYXJlKDAsIHByZWZpeExlbiwgcHJlZml4KSA9PSAwOworfQorCitib29sIGhhc1N1ZmZpeChjb25zdCBzdGQ6OnN0cmluZyYgcywgY29uc3QgY2hhciogc3VmZml4KSB7CisgICAgc2l6ZV90IHN1ZmZpeExlbiA9IHN0cmxlbihzdWZmaXgpOworICAgIHJldHVybiBzdWZmaXhMZW4gPiBzLnNpemUoKSA/IGZhbHNlIDoKKyAgICAgICAgICAgIHMuY29tcGFyZShzLnNpemUoKSAtIHN1ZmZpeExlbiwgc3VmZml4TGVuLCBzdWZmaXgpID09IDA7Cit9CisKK3ZvaWQgYWRkU3VwcG9ydGVkUHJvZmlsZUxldmVscygKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW50ZXJmYWNlPiBpbnRmLAorICAgICAgICBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyICpjYXBzLAorICAgICAgICBjb25zdCBUcmFpdHMmIHRyYWl0LCBjb25zdCBzdGQ6OnN0cmluZyAmbWVkaWFUeXBlKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTWFwcGVyOjpQcm9maWxlTGV2ZWxNYXBwZXI+IG1hcHBlciA9CisgICAgICAgIEMyTWFwcGVyOjpHZXRQcm9maWxlTGV2ZWxNYXBwZXIodHJhaXQubWVkaWFUeXBlKTsKKyAgICAvLyBpZiB3ZSBkb24ndCBrbm93IHRoZSBtZWRpYSB0eXBlLCBwYXNzIHRocm91Z2ggYWxsIHZhbHVlcyB1bm1hcHBlZAorCisgICAgLy8gVE9ETzogd2UgY2Fubm90IGZpbmQgbGV2ZWxzIHRoYXQgYXJlIGxvY2FsICdtYXhpbWEnIHdpdGhvdXQga25vd2luZyB0aGUgY29kaW5nCisgICAgLy8gZS5nLiBILjI2MyBsZXZlbCA0NSBhbmQgbGV2ZWwgMzAgY291bGQgYmUgdHdvIHZhbHVlcyBmb3IgaGlnaGVzdCBsZXZlbCBhcworICAgIC8vIHRoZXkgZG9uJ3QgaW5jbHVkZSBvbmUgYW5vdGhlci4gRm9yIG5vdyB3ZSB1c2UgdGhlIGxhc3Qgc3VwcG9ydGVkIHZhbHVlLgorICAgIGJvb2wgZW5jb2RlciA9IHRyYWl0LmtpbmQgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKyAgICBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm8gcGwoZW5jb2RlciAvKiBvdXRwdXQgKi8sIDB1KTsKKyAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IHByb2ZpbGVRdWVyeSA9IHsKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQb3NzaWJsZShDMlBhcmFtRmllbGQoJnBsLCAmcGwucHJvZmlsZSkpCisgICAgfTsKKworICAgIGMyX3N0YXR1c190IGVyciA9IGludGYtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKHByb2ZpbGVRdWVyeSwgQzJfRE9OVF9CTE9DSyk7CisgICAgQUxPR1YoInF1ZXJ5IHN1cHBvcnRlZCBwcm9maWxlcyAtPiAlcyB8ICVzIiwgYXNTdHJpbmcoZXJyKSwgYXNTdHJpbmcocHJvZmlsZVF1ZXJ5WzBdLnN0YXR1cykpOworICAgIGlmIChlcnIgIT0gQzJfT0sgfHwgcHJvZmlsZVF1ZXJ5WzBdLnN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gd2Ugb25seSBoYW5kbGUgZW51bWVyYXRlZCB2YWx1ZXMKKyAgICBpZiAocHJvZmlsZVF1ZXJ5WzBdLnZhbHVlcy50eXBlICE9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gZGV0ZXJtaW5lIGlmIGNvZGVjIHN1cHBvcnRzIEhEUgorICAgIGJvb2wgc3VwcG9ydHNIZHIgPSBmYWxzZTsKKyAgICBib29sIHN1cHBvcnRzSGRyMTBQbHVzID0gZmFsc2U7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiBwYXJhbURlc2NzOworICAgIGMyX3N0YXR1c190IGVycjEgPSBpbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtcygmcGFyYW1EZXNjcyk7CisgICAgaWYgKGVycjEgPT0gQzJfT0spIHsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICZkZXNjIDogcGFyYW1EZXNjcykgeworICAgICAgICAgICAgc3dpdGNoICgodWludDMyX3QpZGVzYy0+aW5kZXgoKSkgeworICAgICAgICAgICAgY2FzZSBDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dDo6UEFSQU1fVFlQRToKKyAgICAgICAgICAgICAgICBzdXBwb3J0c0hkcjEwUGx1cyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFOgorICAgICAgICAgICAgICAgIHN1cHBvcnRzSGRyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGb3IgVlA5LCB0aGUgc3RhdGljIGluZm8gaXMgYWx3YXlzIHByb3BhZ2F0ZWQgYnkgZnJhbWV3b3JrLgorICAgIHN1cHBvcnRzSGRyIHw9IChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fVlA5KTsKKworICAgIGZvciAoQzJWYWx1ZTo6UHJpbWl0aXZlIHByb2ZpbGUgOiBwcm9maWxlUXVlcnlbMF0udmFsdWVzLnZhbHVlcykgeworICAgICAgICBwbC5wcm9maWxlID0gKEMyQ29uZmlnOjpwcm9maWxlX3QpcHJvZmlsZS5yZWY8dWludDMyX3Q+KCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgZXJyID0gaW50Zi0+Y29uZmlnKHsmcGx9LCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICBBTE9HVigic2V0IHByb2ZpbGUgdG8gJXUgLT4gJXMiLCBwbC5wcm9maWxlLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiBsZXZlbFF1ZXJ5ID0geworICAgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDdXJyZW50KEMyUGFyYW1GaWVsZCgmcGwsICZwbC5sZXZlbCkpCisgICAgICAgIH07CisgICAgICAgIGVyciA9IGludGYtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKGxldmVsUXVlcnksIEMyX0RPTlRfQkxPQ0spOworICAgICAgICBBTE9HVigicXVlcnkgc3VwcG9ydGVkIGxldmVscyAtPiAlcyB8ICVzIiwgYXNTdHJpbmcoZXJyKSwgYXNTdHJpbmcobGV2ZWxRdWVyeVswXS5zdGF0dXMpKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSyB8fCBsZXZlbFF1ZXJ5WzBdLnN0YXR1cyAhPSBDMl9PSworICAgICAgICAgICAgICAgIHx8IGxldmVsUXVlcnlbMF0udmFsdWVzLnR5cGUgIT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6VkFMVUVTCisgICAgICAgICAgICAgICAgfHwgbGV2ZWxRdWVyeVswXS52YWx1ZXMudmFsdWVzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEMyVmFsdWU6OlByaW1pdGl2ZSBsZXZlbCA9IGxldmVsUXVlcnlbMF0udmFsdWVzLnZhbHVlcy5iYWNrKCk7CisgICAgICAgIHBsLmxldmVsID0gKEMyQ29uZmlnOjpsZXZlbF90KWxldmVsLnJlZjx1aW50MzJfdD4oKTsKKyAgICAgICAgQUxPR1YoInN1cHBvcnRpbmcgbGV2ZWw6ICV1IiwgcGwubGV2ZWwpOworICAgICAgICBpbnQzMl90IHNka1Byb2ZpbGUsIHNka0xldmVsOworICAgICAgICBpZiAobWFwcGVyICYmIG1hcHBlci0+bWFwUHJvZmlsZShwbC5wcm9maWxlLCAmc2RrUHJvZmlsZSkKKyAgICAgICAgICAgICAgICAmJiBtYXBwZXItPm1hcExldmVsKHBsLmxldmVsLCAmc2RrTGV2ZWwpKSB7CisgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoKHVpbnQzMl90KXNka1Byb2ZpbGUsICh1aW50MzJfdClzZGtMZXZlbCk7CisgICAgICAgICAgICAvLyBhbHNvIGxpc3QgSERSIHByb2ZpbGVzIGlmIGNvbXBvbmVudCBzdXBwb3J0cyBIRFIKKyAgICAgICAgICAgIGlmIChzdXBwb3J0c0hkcikgeworICAgICAgICAgICAgICAgIGF1dG8gaGRyTWFwcGVyID0gQzJNYXBwZXI6OkdldEhkclByb2ZpbGVMZXZlbE1hcHBlcih0cmFpdC5tZWRpYVR5cGUpOworICAgICAgICAgICAgICAgIGlmIChoZHJNYXBwZXIgJiYgaGRyTWFwcGVyLT5tYXBQcm9maWxlKHBsLnByb2ZpbGUsICZzZGtQcm9maWxlKSkgeworICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoKHVpbnQzMl90KXNka1Byb2ZpbGUsICh1aW50MzJfdClzZGtMZXZlbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0c0hkcjEwUGx1cykgeworICAgICAgICAgICAgICAgICAgICBoZHJNYXBwZXIgPSBDMk1hcHBlcjo6R2V0SGRyUHJvZmlsZUxldmVsTWFwcGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0Lm1lZGlhVHlwZSwgdHJ1ZSAvKmlzSGRyMTBQbHVzKi8pOworICAgICAgICAgICAgICAgICAgICBpZiAoaGRyTWFwcGVyICYmIGhkck1hcHBlci0+bWFwUHJvZmlsZShwbC5wcm9maWxlLCAmc2RrUHJvZmlsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbCgodWludDMyX3Qpc2RrUHJvZmlsZSwgKHVpbnQzMl90KXNka0xldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghbWFwcGVyKSB7CisgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwocGwucHJvZmlsZSwgcGwubGV2ZWwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZm9yIEguMjYzIGFsc28gYWR2ZXJ0aXNlIHRoZSBzZWNvbmQgaGlnaGVzdCBsZXZlbCBpZiB0aGUKKyAgICAgICAgLy8gY29kZWMgc3VwcG9ydHMgbGV2ZWwgNDUsIGFzIGxldmVsIDQ1IG9ubHkgY292ZXJzIGxldmVsIDEwCisgICAgICAgIC8vIFRPRE86IG1vdmUgdGhpcyB0byBzb21lIGZvcm0gb2YgYSBzZXR0aW5nIHNvIGl0IGRvZXMgbm90CisgICAgICAgIC8vIGhhdmUgdG8gYmUgaGVyZQorICAgICAgICBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX0gyNjMpIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IG5leHRMZXZlbCA9IEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQ7CisgICAgICAgICAgICBmb3IgKEMyVmFsdWU6OlByaW1pdGl2ZSB2IDogbGV2ZWxRdWVyeVswXS52YWx1ZXMudmFsdWVzKSB7CisgICAgICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgbGV2ZWwgPSAoQzJDb25maWc6OmxldmVsX3Qpdi5yZWY8dWludDMyX3Q+KCk7CisgICAgICAgICAgICAgICAgaWYgKGxldmVsIDwgQzJDb25maWc6OkxFVkVMX0gyNjNfNDUgJiYgbGV2ZWwgPiBuZXh0TGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dExldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5leHRMZXZlbCAhPSBDMkNvbmZpZzo6TEVWRUxfVU5VU0VECisgICAgICAgICAgICAgICAgICAgICYmIG5leHRMZXZlbCAhPSBwbC5sZXZlbAorICAgICAgICAgICAgICAgICAgICAmJiBtYXBwZXIKKyAgICAgICAgICAgICAgICAgICAgJiYgbWFwcGVyLT5tYXBQcm9maWxlKHBsLnByb2ZpbGUsICZzZGtQcm9maWxlKQorICAgICAgICAgICAgICAgICAgICAmJiBtYXBwZXItPm1hcExldmVsKG5leHRMZXZlbCwgJnNka0xldmVsKSkgeworICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClzZGtQcm9maWxlLCAodWludDMyX3Qpc2RrTGV2ZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGFkZFN1cHBvcnRlZENvbG9yRm9ybWF0cygKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW50ZXJmYWNlPiBpbnRmLAorICAgICAgICBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyICpjYXBzLAorICAgICAgICBjb25zdCBUcmFpdHMmIHRyYWl0LCBjb25zdCBzdGQ6OnN0cmluZyAmbWVkaWFUeXBlKSB7CisgICAgKHZvaWQpaW50ZjsKKworICAgIC8vIFRPRE86IGdldCB0aGlzIGZyb20gaW50ZigpIGFzIHdlbGwsIGJ1dCBob3cgZG8gd2UgbWFwIHRoZW0gdG8KKyAgICAvLyBNZWRpYUNvZGVjIGNvbG9yIGZvcm1hdHM/CisgICAgYm9vbCBlbmNvZGVyID0gdHJhaXQua2luZCA9PSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSOworICAgIGlmIChtZWRpYVR5cGUuZmluZCgidmlkZW8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAvLyB2ZW5kb3IgdmlkZW8gY29kZWNzIHByZWZlciBvcGFxdWUgZm9ybWF0CisgICAgICAgIGlmICh0cmFpdC5uYW1lLmZpbmQoImFuZHJvaWQiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0U3VyZmFjZSk7CisgICAgICAgIH0KKyAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUpOworICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOworICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKTsKKyAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyKTsKKyAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcik7CisgICAgICAgIC8vIGZyYW1ld29yayB2aWRlbyBlbmNvZGVycyBtdXN0IHN1cHBvcnQgc3VyZmFjZSBmb3JtYXQsIHRob3VnaCBpdCBpcyB1bmNsZWFyCisgICAgICAgIC8vIHRoYXQgdGhleSB3aWxsIGJlIGFibGUgdG8gbWFwIGl0IGlmIGl0IGlzIG9wYXF1ZQorICAgICAgICBpZiAoZW5jb2RlciAmJiB0cmFpdC5uYW1lLmZpbmQoImFuZHJvaWQiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0U3VyZmFjZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworc3RhdHVzX3QgQ29kZWMySW5mb0J1aWxkZXI6OmJ1aWxkTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RXcml0ZXIqIHdyaXRlcikgeworICAgIC8vIFRPRE86IFJlbW92ZSBydW4tdGltZSBjb25maWd1cmF0aW9ucyBvbmNlIGFsbCBjb2RlY3MgYXJlIHdvcmtpbmcKKyAgICAvLyBwcm9wZXJseS4gKEFzc3VtZSAiZnVsbCIgYmVoYXZpb3IgZXZlbnR1YWxseS4pCisgICAgLy8KKyAgICAvLyBkZWJ1Zy5zdGFnZWZyaWdodC5jY29kZWMgc3VwcG9ydHMgNSB2YWx1ZXMuCisgICAgLy8gICAwIC0gTm8gQ29kZWMgMi4wIGNvbXBvbmVudHMgYXJlIGF2YWlsYWJsZS4KKyAgICAvLyAgIDEgLSBBdWRpbyBkZWNvZGVycyBhbmQgZW5jb2RlcnMgd2l0aCBwcmVmaXggImMyLmFuZHJvaWQuIiBhcmUgYXZhaWxhYmxlCisgICAgLy8gICAgICAgYW5kIHJhbmtlZCBmaXJzdC4KKyAgICAvLyAgICAgICBBbGwgb3RoZXIgY29tcG9uZW50cyB3aXRoIHByZWZpeCAiYzIuYW5kcm9pZC4iIGFyZSBhdmFpbGFibGUgd2l0aAorICAgIC8vICAgICAgIHRoZWlyIG5vcm1hbCByYW5rcy4KKyAgICAvLyAgICAgICBDb21wb25lbnRzIHdpdGggcHJlZml4ICJjMi52ZGEuIiBhcmUgYXZhaWxhYmxlIHdpdGggdGhlaXIgbm9ybWFsCisgICAgLy8gICAgICAgcmFua3MuCisgICAgLy8gICAgICAgQWxsIG90aGVyIGNvbXBvbmVudHMgd2l0aCBzdWZmaXggIi5hdmMuZGVjb2RlciIgb3IgIi5hdmMuZW5jb2RlciIKKyAgICAvLyAgICAgICBhcmUgYXZhaWxhYmxlIGJ1dCByYW5rZWQgbGFzdC4KKyAgICAvLyAgIDIgLSBDb21wb25lbnRzIHdpdGggcHJlZml4ICJjMi5hbmRyb2lkLiIgYXJlIGF2YWlsYWJsZSBhbmQgcmFua2VkCisgICAgLy8gICAgICAgZmlyc3QuCisgICAgLy8gICAgICAgQ29tcG9uZW50cyB3aXRoIHByZWZpeCAiYzIudmRhLiIgYXJlIGF2YWlsYWJsZSB3aXRoIHRoZWlyIG5vcm1hbAorICAgIC8vICAgICAgIHJhbmtzLgorICAgIC8vICAgICAgIEFsbCBvdGhlciBjb21wb25lbnRzIHdpdGggc3VmZml4ICIuYXZjLmRlY29kZXIiIG9yICIuYXZjLmVuY29kZXIiCisgICAgLy8gICAgICAgYXJlIGF2YWlsYWJsZSBidXQgcmFua2VkIGxhc3QuCisgICAgLy8gICAzIC0gQ29tcG9uZW50cyB3aXRoIHByZWZpeCAiYzIuYW5kcm9pZC4iIGFyZSBhdmFpbGFibGUgYW5kIHJhbmtlZAorICAgIC8vICAgICAgIGZpcnN0LgorICAgIC8vICAgICAgIEFsbCBvdGhlciBjb21wb25lbnRzIGFyZSBhdmFpbGFibGUgd2l0aCB0aGVpciBub3JtYWwgcmFua3MuCisgICAgLy8gICA0IC0gQWxsIGNvbXBvbmVudHMgYXJlIGF2YWlsYWJsZSB3aXRoIHRoZWlyIG5vcm1hbCByYW5rcy4KKyAgICAvLworICAgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIChib290IHRpbWUpIGlzIDEuCisgICAgLy8KKyAgICAvLyBOb3RlOiBDdXJyZW50bHksIE9NWCBjb21wb25lbnRzIGhhdmUgZGVmYXVsdCByYW5rIDB4MTAwLCB3aGlsZSBhbGwKKyAgICAvLyBDb2RlYzIuMCBzb2Z0d2FyZSBjb21wb25lbnRzIGhhdmUgZGVmYXVsdCByYW5rIDB4MjAwLgorICAgIGludCBvcHRpb24gPSA6OmFuZHJvaWQ6OmJhc2U6OkdldEludFByb3BlcnR5KCJkZWJ1Zy5zdGFnZWZyaWdodC5jY29kZWMiLCAxKTsKKworICAgIC8vIE9idGFpbiBDb2RlYzJDbGllbnQKKyAgICBzdGQ6OnZlY3RvcjxUcmFpdHM+IHRyYWl0cyA9IENvZGVjMkNsaWVudDo6TGlzdENvbXBvbmVudHMoKTsKKworICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyIHBhcnNlcigKKyAgICAgICAgICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0U2VhcmNoRGlycywKKyAgICAgICAgICAgICJtZWRpYV9jb2RlY3NfYzIueG1sIiwKKyAgICAgICAgICAgICJtZWRpYV9jb2RlY3NfcGVyZm9ybWFuY2VfYzIueG1sIik7CisgICAgaWYgKHBhcnNlci5nZXRQYXJzaW5nU3RhdHVzKCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0QoIlhNTCBwYXJzZXIgbm8gZ29vZCIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgZm9yIChjb25zdCBUcmFpdHMmIHRyYWl0IDogdHJhaXRzKSB7CisgICAgICAgIEMyQ29tcG9uZW50OjpyYW5rX3QgcmFuayA9IHRyYWl0LnJhbms7CisKKyAgICAgICAgLy8gSW50ZXJmYWNlIG11c3QgYmUgYWNjZXNzaWJsZSBmb3IgdXMgdG8gbGlzdCB0aGUgY29tcG9uZW50LCBhbmQgdGhlcmUgYWxzbworICAgICAgICAvLyBtdXN0IGJlIGFuIFhNTCBlbnRyeSBmb3IgdGhlIGNvZGVjLiBDb2RlYyBhbGlhc2VzIGxpc3RlZCBpbiB0aGUgdHJhaXRzCisgICAgICAgIC8vIGFsbG93IGFkZGl0aW9uYWwgWE1MIGVudHJpZXMgdG8gYmUgc3BlY2lmaWVkIGZvciBlYWNoIGFsaWFzLiBUaGVzZSB3aWxsCisgICAgICAgIC8vIGJlIGxpc3RlZCBhcyBzZXBhcmF0ZSBjb2RlY3MuIElmIG5vIFhNTCBlbnRyeSBpcyBzcGVjaWZpZWQgZm9yIGFuIGFsaWFzLAorICAgICAgICAvLyB0aG9zZSB3aWxsIGJlIHRyZWF0ZWQgYXMgYW4gYWRkaXRpb25hbCBhbGlhcyBzcGVjaWZpZWQgaW4gdGhlIFhNTCBlbnRyeQorICAgICAgICAvLyBmb3IgdGhlIGludGVyZmFjZSBuYW1lLgorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbmFtZUFuZEFsaWFzZXMgPSB0cmFpdC5hbGlhc2VzOworICAgICAgICBuYW1lQW5kQWxpYXNlcy5pbnNlcnQobmFtZUFuZEFsaWFzZXMuYmVnaW4oKSwgdHJhaXQubmFtZSk7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWVPckFsaWFzIDogbmFtZUFuZEFsaWFzZXMpIHsKKyAgICAgICAgICAgIGJvb2wgaXNBbGlhcyA9IHRyYWl0Lm5hbWUgIT0gbmFtZU9yQWxpYXM7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnRlcmZhY2U+IGludGYgPQorICAgICAgICAgICAgICAgIENvZGVjMkNsaWVudDo6Q3JlYXRlSW50ZXJmYWNlQnlOYW1lKG5hbWVPckFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgaWYgKCFpbnRmKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImNvdWxkIG5vdCBjcmVhdGUgaW50ZXJmYWNlIGZvciAlcyclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNBbGlhcyA/ICJhbGlhcyAiIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lT3JBbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJzZXIuZ2V0Q29kZWNNYXAoKS5jb3VudChuYW1lT3JBbGlhcykgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChpc0FsaWFzKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4gYmFzZUNvZGVjSW5mbyA9CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPmZpbmRNZWRpYUNvZGVjSW5mbyh0cmFpdC5uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWJhc2VDb2RlY0luZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJhbGlhcyAnJXMnIG5vdCBmb3VuZCBpbiB4bWwgYnV0IGNhbm9uaWNhbCBjb2RlYyBpbmZvICclcycgbWlzc2luZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVPckFsaWFzLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0Lm5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiYWxpYXMgJyVzJyBub3QgZm91bmQgaW4geG1sOyB1c2UgYW4gWE1MIDxBbGlhcz4gdGFnIGZvciB0aGlzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZU9yQWxpYXMuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhbGlhcyBpbnRvIGV4aXN0aW5nIGNvZGVjCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlQ29kZWNJbmZvLT5hZGRBbGlhcyhuYW1lT3JBbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJjb21wb25lbnQgJyVzJyBub3QgZm91bmQgaW4geG1sIiwgdHJhaXQubmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYW5vbk5hbWUgPSB0cmFpdC5uYW1lOworCisgICAgICAgICAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBibG9jayBvbmNlIGFsbCBjb2RlY3MgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgaWYgKGhhc1ByZWZpeChjYW5vbk5hbWUsICJjMi52ZGEuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoYXNQcmVmaXgoY2Fub25OYW1lLCAiYzIuYW5kcm9pZC4iKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodHJhaXQuZG9tYWluID09IEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhbmsgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoYXNTdWZmaXgoY2Fub25OYW1lLCAiLmF2Yy5kZWNvZGVyIikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhc1N1ZmZpeChjYW5vbk5hbWUsICIuYXZjLmVuY29kZXIiKSkgeworICAgICAgICAgICAgICAgICAgICByYW5rID0gc3RkOjpudW1lcmljX2xpbWl0czxkZWNsdHlwZShyYW5rKT46Om1heCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgaWYgKGhhc1ByZWZpeChjYW5vbk5hbWUsICJjMi52ZGEuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoYXNQcmVmaXgoY2Fub25OYW1lLCAiYzIuYW5kcm9pZC4iKSkgeworICAgICAgICAgICAgICAgICAgICByYW5rID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoYXNTdWZmaXgoY2Fub25OYW1lLCAiLmF2Yy5kZWNvZGVyIikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhc1N1ZmZpeChjYW5vbk5hbWUsICIuYXZjLmVuY29kZXIiKSkgeworICAgICAgICAgICAgICAgICAgICByYW5rID0gc3RkOjpudW1lcmljX2xpbWl0czxkZWNsdHlwZShyYW5rKT46Om1heCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgaWYgKGhhc1ByZWZpeChjYW5vbk5hbWUsICJjMi5hbmRyb2lkLiIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJhbmsgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoImFkZGluZyBjb2RlYyBlbnRyeSBmb3IgJyVzJyIsIG5hbWVPckFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPiBjb2RlY0luZm8gPSB3cml0ZXItPmFkZE1lZGlhQ29kZWNJbmZvKCk7CisgICAgICAgICAgICBjb2RlY0luZm8tPnNldE5hbWUobmFtZU9yQWxpYXMuY19zdHIoKSk7CisgICAgICAgICAgICBjb2RlY0luZm8tPnNldE93bmVyKCgiY29kZWMyOjoiICsgdHJhaXQub3duZXIpLmNfc3RyKCkpOworICAgICAgICAgICAgY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjUHJvcGVydGllcyAmY29kZWMgPQorICAgICAgICAgICAgICAgIHBhcnNlci5nZXRDb2RlY01hcCgpLmF0KG5hbWVPckFsaWFzKTsKKworICAgICAgICAgICAgYm9vbCBlbmNvZGVyID0gdHJhaXQua2luZCA9PSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSOworICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8TWVkaWFDb2RlY0luZm86OkF0dHJpYnV0ZXM+Ojp0eXBlIGF0dHJzID0gMDsKKworICAgICAgICAgICAgaWYgKGVuY29kZXIpIHsKKyAgICAgICAgICAgICAgICBhdHRycyB8PSBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc0VuY29kZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHJhaXQub3duZXIgPT0gInNvZnR3YXJlIikgeworICAgICAgICAgICAgICAgIGF0dHJzIHw9IE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzU29mdHdhcmVPbmx5OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdHRycyB8PSBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc1ZlbmRvcjsKKyAgICAgICAgICAgICAgICBpZiAodHJhaXQub3duZXIgPT0gInZlbmRvci1zb2Z0d2FyZSIpIHsKKyAgICAgICAgICAgICAgICAgICAgYXR0cnMgfD0gTWVkaWFDb2RlY0luZm86OmtGbGFnSXNTb2Z0d2FyZU9ubHk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlYy5xdWlya1NldC5maW5kKCJhdHRyaWJ1dGU6OnNvZnR3YXJlLWNvZGVjIikKKyAgICAgICAgICAgICAgICAgICAgICAgID09IGNvZGVjLnF1aXJrU2V0LmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJzIHw9IE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzSGFyZHdhcmVBY2NlbGVyYXRlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2RlY0luZm8tPnNldEF0dHJpYnV0ZXMoYXR0cnMpOworICAgICAgICAgICAgaWYgKCFjb2RlYy5yYW5rLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB4bWxSYW5rOworICAgICAgICAgICAgICAgIGNoYXIgZHVtbXk7CisgICAgICAgICAgICAgICAgaWYgKHNzY2FuZihjb2RlYy5yYW5rLmNfc3RyKCksICIldSVjIiwgJnhtbFJhbmssICZkdW1teSkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICByYW5rID0geG1sUmFuazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2RlY0luZm8tPnNldFJhbmsocmFuayk7CisKKyAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcgJmFsaWFzIDogY29kZWMuYWxpYXNlcykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJhZGRpbmcgYWxpYXMgJyVzJyIsIGFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvZGVjSW5mby0+YWRkQWxpYXMoYWxpYXMuY19zdHIoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoYXV0byB0eXBlSXQgPSBjb2RlYy50eXBlTWFwLmJlZ2luKCk7IHR5cGVJdCAhPSBjb2RlYy50eXBlTWFwLmVuZCgpOyArK3R5cGVJdCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZtZWRpYVR5cGUgPSB0eXBlSXQtPmZpcnN0OworICAgICAgICAgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpBdHRyaWJ1dGVNYXAgJmF0dHJNYXAgPSB0eXBlSXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4gY2FwcyA9CisgICAgICAgICAgICAgICAgICAgIGNvZGVjSW5mby0+YWRkTWVkaWFUeXBlKG1lZGlhVHlwZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gYXR0ckl0ID0gYXR0ck1hcC5iZWdpbigpOyBhdHRySXQgIT0gYXR0ck1hcC5lbmQoKTsgKythdHRySXQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2V5LCB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp0aWUoa2V5LCB2YWx1ZSkgPSAqYXR0ckl0OworICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmZpbmQoImZlYXR1cmUtIikgPT0gMCAmJiBrZXkuZmluZCgiZmVhdHVyZS1iaXRyYXRlLW1vZGVzIikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbnRWYWx1ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgdHJhaWxpbmcgYmFkIGNoYXJhY3RlcnMgYW5kIGRlZmF1bHQgdG8gMC4KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKXNzY2FuZih2YWx1ZS5jX3N0cigpLCAiJWQiLCAmaW50VmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkRGV0YWlsKGtleS5jX3N0cigpLCBpbnRWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGREZXRhaWwoa2V5LmNfc3RyKCksIHZhbHVlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYWRkU3VwcG9ydGVkUHJvZmlsZUxldmVscyhpbnRmLCBjYXBzLmdldCgpLCB0cmFpdCwgbWVkaWFUeXBlKTsKKyAgICAgICAgICAgICAgICBhZGRTdXBwb3J0ZWRDb2xvckZvcm1hdHMoaW50ZiwgY2Fwcy5nZXQoKSwgdHJhaXQsIG1lZGlhVHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIGFuZHJvaWQ6Ok1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UgKkNyZWF0ZUJ1aWxkZXIoKSB7CisgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpDb2RlYzJJbmZvQnVpbGRlcjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBjMTg5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9JTkZPX0JVSUxERVJfSF8KKyNkZWZpbmUgQ09ERUMyX0lORk9fQlVJTERFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDb2RlYzJJbmZvQnVpbGRlciA6IHB1YmxpYyBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlIHsKK3B1YmxpYzoKKyAgICBDb2RlYzJJbmZvQnVpbGRlcigpID0gZGVmYXVsdDsKKyAgICB+Q29kZWMySW5mb0J1aWxkZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisgICAgc3RhdHVzX3QgYnVpbGRNZWRpYUNvZGVjTGlzdChNZWRpYUNvZGVjTGlzdFdyaXRlciogd3JpdGVyKSBvdmVycmlkZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0lORk9fQlVJTERFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0lucHV0U3VyZmFjZVdyYXBwZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9JbnB1dFN1cmZhY2VXcmFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDljNGVlYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9JbnB1dFN1cmZhY2VXcmFwcGVyLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOUFVUX1NVUkZBQ0VfV1JBUFBFUl9IXworI2RlZmluZSBJTlBVVF9TVVJGQUNFX1dSQVBQRVJfSF8KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogV3JhcHBlciBpbnRlcmZhY2UgYXJvdW5kIElucHV0U3VyZmFjZS4KKyAqLworY2xhc3MgSW5wdXRTdXJmYWNlV3JhcHBlciB7CitwdWJsaWM6CisgICAgSW5wdXRTdXJmYWNlV3JhcHBlcigpCisgICAgICAgIDogbURhdGFTcGFjZShIQUxfREFUQVNQQUNFX1VOS05PV04pIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5JbnB1dFN1cmZhY2VXcmFwcGVyKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0aGUgc3VyZmFjZSB3aXRoIHxjb21wfC4gQSBzdXJmYWNlIGNhbgorICAgICAqIGNvbm5lY3QgdG8gYXQgbW9zdCBvbmUgY29tcG9uZW50IGF0IGEgdGltZS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gT0sgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIHxjb21wfAorICAgICAqIFxyZXR1cm4gQUxSRUFEWV9FWElTVFMgICBhbHJlYWR5IGNvbm5lY3RlZCB0byBhbm90aGVyIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEaXNjb25uZWN0IHRoZSBzdXJmYWNlIGZyb20gdGhlIGNvbXBvbmVudCBpZiBhbnkuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBwdXNoaW5nIGJ1ZmZlcnMgdG8gdGhlIHN1cmZhY2UuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlZjogR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSA9IDA7CisKKyAgICAvLy8gSW5wdXQgU3VyZmFjZSBjb25maWd1cmF0aW9uCisgICAgc3RydWN0IENvbmZpZyB7CisgICAgICAgIC8vIElOIFBBUkFNUyAoR0JTKQorICAgICAgICBmbG9hdCBtTWluRnBzOyAvLyBtaW5pbXVtIGZwcyAocmVwZWF0IGZyYW1lIHRvIGFjaGlldmUgdGhpcykKKyAgICAgICAgZmxvYXQgbU1heEZwczsgLy8gbWF4IGZwcyAodmlhIGZyYW1lIGRyb3ApCisgICAgICAgIGZsb2F0IG1DYXB0dXJlRnBzOyAvLyBjYXB0dXJlIGZwcworICAgICAgICBmbG9hdCBtQ29kZWRGcHM7ICAgLy8gY29kZWQgZnBzCisgICAgICAgIGJvb2wgbVN1c3BlbmRlZDsgLy8gc3VzcGVuZGVkCisgICAgICAgIGludDY0X3QgbVRpbWVPZmZzZXRVczsgLy8gdGltZSBvZmZzZXQgKGlucHV0ID0+IGNvZGVjKQorICAgICAgICBpbnQ2NF90IG1TdXNwZW5kQXRVczsgLy8gc3VzcGVuZC9yZXN1bWUgdGltZQorICAgICAgICBpbnQ2NF90IG1TdGFydEF0VXM7IC8vIHN0YXJ0IHRpbWUKKyAgICAgICAgYm9vbCBtU3RvcHBlZDsgLy8gc3RvcHBlZAorICAgICAgICBpbnQ2NF90IG1TdG9wQXRVczsgLy8gc3RvcCB0aW1lCisKKyAgICAgICAgLy8gT1VUIFBBUkFNUyAoR0JTKQorICAgICAgICBpbnQ2NF90IG1JbnB1dERlbGF5VXM7IC8vIGRlbGF5IGJldHdlZW4gZW5jb2RlciBpbnB1dCBhbmQgc3VyZmFjZSBpbnB1dAorCisgICAgICAgIC8vIElOIFBBUkFNUyAoQ09ERUMgV1JBUFBFUikKKyAgICAgICAgZmxvYXQgbUZpeGVkQWRqdXN0ZWRGcHM7IC8vIGZpeGVkIGZwcyB2aWEgUFRTIG1hbmlwdWxhdGlvbgorICAgICAgICBmbG9hdCBtTWluQWRqdXN0ZWRGcHM7IC8vIG1pbmltdW0gZnBzIHZpYSBQVFMgbWFuaXB1bGF0aW9uCisgICAgfTsKKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZXMgaW5wdXQgc3VyZmFjZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBjb25maWcgY29uZmlndXJhdGlvbi4gVGhpcyBjYW4gYmUgdXBkYXRlZCBkdXJpbmcgdGhpcyBjYWxsIHRvIHByb3ZpZGUgb3V0cHV0CisgICAgICogICAgICAgICAgICAgICBwYXJhbWV0ZXJzLCBidXQgbm90IHRvIHByb3ZpZGUgY29uZmlndXJlZCBwYXJhbWV0ZXJzICh0byBhdm9pZCBjb250aW51YWxseQorICAgICAqICAgICAgICAgICAgICAgcmVjb25maWd1cmluZykKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZShDb25maWcgJmNvbmZpZykgPSAwOworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyBkZXNpcmVkIGRhdGEgc3BhY2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gZGF0YVNwYWNlIGRlc2lyZWQgZGF0YSBzcGFjZQorICAgICAqLworICAgIGlubGluZSB2b2lkIHNldERhdGFTcGFjZShhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UpIHsKKyAgICAgICAgbURhdGFTcGFjZSA9IGRhdGFTcGFjZTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBtRGF0YVNwYWNlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBJTlBVVF9TVVJGQUNFX1dSQVBQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9QaXBlbGluZVdhdGNoZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1BpcGVsaW5lV2F0Y2hlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY4MWQ0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9QaXBlbGluZVdhdGNoZXIuY3BwCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlBpcGVsaW5lV2F0Y2hlciIKKworI2luY2x1ZGUgPG51bWVyaWM+CisKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlICJQaXBlbGluZVdhdGNoZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitQaXBlbGluZVdhdGNoZXIgJlBpcGVsaW5lV2F0Y2hlcjo6aW5wdXREZWxheSh1aW50MzJfdCB2YWx1ZSkgeworICAgIG1JbnB1dERlbGF5ID0gdmFsdWU7CisgICAgcmV0dXJuICp0aGlzOworfQorCitQaXBlbGluZVdhdGNoZXIgJlBpcGVsaW5lV2F0Y2hlcjo6cGlwZWxpbmVEZWxheSh1aW50MzJfdCB2YWx1ZSkgeworICAgIG1QaXBlbGluZURlbGF5ID0gdmFsdWU7CisgICAgcmV0dXJuICp0aGlzOworfQorCitQaXBlbGluZVdhdGNoZXIgJlBpcGVsaW5lV2F0Y2hlcjo6b3V0cHV0RGVsYXkodWludDMyX3QgdmFsdWUpIHsKKyAgICBtT3V0cHV0RGVsYXkgPSB2YWx1ZTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK1BpcGVsaW5lV2F0Y2hlciAmUGlwZWxpbmVXYXRjaGVyOjpzbW9vdGhuZXNzRmFjdG9yKHVpbnQzMl90IHZhbHVlKSB7CisgICAgbVNtb290aG5lc3NGYWN0b3IgPSB2YWx1ZTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3ZvaWQgUGlwZWxpbmVXYXRjaGVyOjpvbldvcmtRdWV1ZWQoCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4+ICYmYnVmZmVycywKKyAgICAgICAgY29uc3QgQ2xvY2s6OnRpbWVfcG9pbnQgJnF1ZXVlZEF0KSB7CisgICAgQUxPR1YoIm9uV29ya1F1ZXVlZChmcmFtZUluZGV4PSVsbHUsIGJ1ZmZlcnMoc2l6ZT0lenUpLCBxdWV1ZWRBdD0lbGxkKSIsCisgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFtZUluZGV4LAorICAgICAgICAgIGJ1ZmZlcnMuc2l6ZSgpLAorICAgICAgICAgIChsb25nIGxvbmcpcXVldWVkQXQudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCkpOworICAgIGF1dG8gaXQgPSBtRnJhbWVzSW5QaXBlbGluZS5maW5kKGZyYW1lSW5kZXgpOworICAgIGlmIChpdCAhPSBtRnJhbWVzSW5QaXBlbGluZS5lbmQoKSkgeworICAgICAgICBBTE9HRCgib25Xb3JrUXVldWVkOiBEdXBsaWNhdGUgZnJhbWUgaW5kZXggKCVsbHUpOyBwcmV2aW91cyBlbnRyeSByZW1vdmVkIiwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFtZUluZGV4KTsKKyAgICAgICAgKHZvaWQpbUZyYW1lc0luUGlwZWxpbmUuZXJhc2UoaXQpOworICAgIH0KKyAgICAodm9pZCltRnJhbWVzSW5QaXBlbGluZS50cnlfZW1wbGFjZShmcmFtZUluZGV4LCBzdGQ6Om1vdmUoYnVmZmVycyksIHF1ZXVlZEF0KTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBQaXBlbGluZVdhdGNoZXI6Om9uSW5wdXRCdWZmZXJSZWxlYXNlZCgKKyAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwgc2l6ZV90IGFycmF5SW5kZXgpIHsKKyAgICBBTE9HVigib25JbnB1dEJ1ZmZlclJlbGVhc2VkKGZyYW1lSW5kZXg9JWxsdSwgYXJyYXlJbmRleD0lenUpIiwKKyAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWZyYW1lSW5kZXgsIGFycmF5SW5kZXgpOworICAgIGF1dG8gaXQgPSBtRnJhbWVzSW5QaXBlbGluZS5maW5kKGZyYW1lSW5kZXgpOworICAgIGlmIChpdCA9PSBtRnJhbWVzSW5QaXBlbGluZS5lbmQoKSkgeworICAgICAgICBBTE9HRCgib25JbnB1dEJ1ZmZlclJlbGVhc2VkOiBmcmFtZUluZGV4IG5vdCBmb3VuZCAoJWxsdSk7IGlnbm9yZWQiLAorICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWZyYW1lSW5kZXgpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKGl0LT5zZWNvbmQuYnVmZmVycy5zaXplKCkgPD0gYXJyYXlJbmRleCkgeworICAgICAgICBBTE9HRCgib25JbnB1dEJ1ZmZlclJlbGVhc2VkOiBidWZmZXJzIGF0ICVsbHU6IHNpemUgJXp1LCByZXF1ZXN0ZWQgaW5kZXg6ICV6dSIsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhbWVJbmRleCwgaXQtPnNlY29uZC5idWZmZXJzLnNpemUoKSwgYXJyYXlJbmRleCk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlcihzdGQ6Om1vdmUoaXQtPnNlY29uZC5idWZmZXJzW2FycmF5SW5kZXhdKSk7CisgICAgQUxPR0RfSUYoIWJ1ZmZlciwgIm9uSW5wdXRCdWZmZXJSZWxlYXNlZDogYnVmZmVyIGFscmVhZHkgcmVsZWFzZWQgKCVsbHU6JXp1KSIsCisgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFtZUluZGV4LCBhcnJheUluZGV4KTsKKyAgICByZXR1cm4gYnVmZmVyOworfQorCit2b2lkIFBpcGVsaW5lV2F0Y2hlcjo6b25Xb3JrRG9uZSh1aW50NjRfdCBmcmFtZUluZGV4KSB7CisgICAgQUxPR1YoIm9uV29ya0RvbmUoZnJhbWVJbmRleD0lbGx1KSIsICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhbWVJbmRleCk7CisgICAgYXV0byBpdCA9IG1GcmFtZXNJblBpcGVsaW5lLmZpbmQoZnJhbWVJbmRleCk7CisgICAgaWYgKGl0ID09IG1GcmFtZXNJblBpcGVsaW5lLmVuZCgpKSB7CisgICAgICAgIEFMT0dEKCJvbldvcmtEb25lOiBmcmFtZUluZGV4IG5vdCBmb3VuZCAoJWxsdSk7IGlnbm9yZWQiLAorICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWZyYW1lSW5kZXgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgICh2b2lkKW1GcmFtZXNJblBpcGVsaW5lLmVyYXNlKGl0KTsKK30KKwordm9pZCBQaXBlbGluZVdhdGNoZXI6OmZsdXNoKCkgeworICAgIG1GcmFtZXNJblBpcGVsaW5lLmNsZWFyKCk7Cit9CisKK2Jvb2wgUGlwZWxpbmVXYXRjaGVyOjpwaXBlbGluZUZ1bGwoKSBjb25zdCB7CisgICAgaWYgKG1GcmFtZXNJblBpcGVsaW5lLnNpemUoKSA+PQorICAgICAgICAgICAgbUlucHV0RGVsYXkgKyBtUGlwZWxpbmVEZWxheSArIG1PdXRwdXREZWxheSArIG1TbW9vdGhuZXNzRmFjdG9yKSB7CisgICAgICAgIEFMT0dWKCJwaXBlbGluZUZ1bGw6IHRvbyBtYW55IGZyYW1lcyBpbiBwaXBlbGluZSAoJXp1KSIsIG1GcmFtZXNJblBpcGVsaW5lLnNpemUoKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBzaXplX3Qgc2l6ZVdpdGhJbnB1dFJlbGVhc2VkID0gc3RkOjpjb3VudF9pZigKKyAgICAgICAgICAgIG1GcmFtZXNJblBpcGVsaW5lLmJlZ2luKCksCisgICAgICAgICAgICBtRnJhbWVzSW5QaXBlbGluZS5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGRlY2x0eXBlKG1GcmFtZXNJblBpcGVsaW5lKTo6dmFsdWVfdHlwZSAmdmFsdWUpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciA6IHZhbHVlLnNlY29uZC5idWZmZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0pOworICAgIGlmIChzaXplV2l0aElucHV0UmVsZWFzZWQgPj0KKyAgICAgICAgICAgIG1QaXBlbGluZURlbGF5ICsgbU91dHB1dERlbGF5ICsgbVNtb290aG5lc3NGYWN0b3IpIHsKKyAgICAgICAgQUxPR1YoInBpcGVsaW5lRnVsbDogdG9vIG1hbnkgZnJhbWVzIGluIHBpcGVsaW5lLCB3aXRoIGlucHV0IHJlbGVhc2VkICglenUpIiwKKyAgICAgICAgICAgICAgc2l6ZVdpdGhJbnB1dFJlbGVhc2VkKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIEFMT0dWKCJwaXBlbGluZSBoYXMgcm9vbSAodG90YWw6ICV6dSwgaW5wdXQgcmVsZWFzZWQ6ICV6dSkiLAorICAgICAgICAgIG1GcmFtZXNJblBpcGVsaW5lLnNpemUoKSwgc2l6ZVdpdGhJbnB1dFJlbGVhc2VkKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1BpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6OmR1cmF0aW9uIFBpcGVsaW5lV2F0Y2hlcjo6ZWxhcHNlZCgKKyAgICAgICAgY29uc3QgUGlwZWxpbmVXYXRjaGVyOjpDbG9jazo6dGltZV9wb2ludCAmbm93LCBzaXplX3QgbikgY29uc3QgeworICAgIGlmIChtRnJhbWVzSW5QaXBlbGluZS5zaXplKCkgPD0gbikgeworICAgICAgICByZXR1cm4gQ2xvY2s6OmR1cmF0aW9uOjp6ZXJvKCk7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPENsb2NrOjpkdXJhdGlvbj4gZHVyYXRpb25zOworICAgIGZvciAoY29uc3QgZGVjbHR5cGUobUZyYW1lc0luUGlwZWxpbmUpOjp2YWx1ZV90eXBlICZ2YWx1ZSA6IG1GcmFtZXNJblBpcGVsaW5lKSB7CisgICAgICAgIENsb2NrOjpkdXJhdGlvbiBlbGFwc2VkID0gbm93IC0gdmFsdWUuc2Vjb25kLnF1ZXVlZEF0OworICAgICAgICBBTE9HVigiZWxhcHNlZDogZnJhbWVJbmRleCA9ICVsbHUgZWxhcHNlZCA9ICVsbGRtcyIsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdmFsdWUuZmlyc3QsCisgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KGVsYXBzZWQpLmNvdW50KCkpOworICAgICAgICBkdXJhdGlvbnMucHVzaF9iYWNrKGVsYXBzZWQpOworICAgIH0KKyAgICBzdGQ6Om50aF9lbGVtZW50KGR1cmF0aW9ucy5iZWdpbigpLCBkdXJhdGlvbnMuZW5kKCksIGR1cmF0aW9ucy5iZWdpbigpICsgbiwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Z3JlYXRlcjxDbG9jazo6ZHVyYXRpb24+KCkpOworICAgIHJldHVybiBkdXJhdGlvbnNbbl07Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyMzE0NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9QaXBlbGluZVdhdGNoZXIuaApAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBQSVBFTElORV9XQVRDSEVSX0hfCisjZGVmaW5lIFBJUEVMSU5FX1dBVENIRVJfSF8KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8QzJXb3JrLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBQaXBlbGluZVdhdGNoZXIgd2F0Y2hlcyB0aGUgcGlwZWxpbmUgYW5kIGluZmVycyB0aGUgc3RhdHVzIG9mIHdvcmsgaXRlbXMgZnJvbQorICogZXZlbnRzLgorICovCitjbGFzcyBQaXBlbGluZVdhdGNoZXIgeworcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jayBDbG9jazsKKworICAgIFBpcGVsaW5lV2F0Y2hlcigpCisgICAgICAgIDogbUlucHV0RGVsYXkoMCksCisgICAgICAgICAgbVBpcGVsaW5lRGVsYXkoMCksCisgICAgICAgICAgbU91dHB1dERlbGF5KDApLAorICAgICAgICAgIG1TbW9vdGhuZXNzRmFjdG9yKDApIHt9CisgICAgflBpcGVsaW5lV2F0Y2hlcigpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgbmV3IGlucHV0IGRlbGF5IHZhbHVlCisgICAgICogXHJldHVybiAgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBQaXBlbGluZVdhdGNoZXIgJmlucHV0RGVsYXkodWludDMyX3QgdmFsdWUpOworCisgICAgLyoqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBuZXcgcGlwZWxpbmUgZGVsYXkgdmFsdWUKKyAgICAgKiBccmV0dXJuICB0aGlzIG9iamVjdAorICAgICAqLworICAgIFBpcGVsaW5lV2F0Y2hlciAmcGlwZWxpbmVEZWxheSh1aW50MzJfdCB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIG5ldyBvdXRwdXQgZGVsYXkgdmFsdWUKKyAgICAgKiBccmV0dXJuICB0aGlzIG9iamVjdAorICAgICAqLworICAgIFBpcGVsaW5lV2F0Y2hlciAmb3V0cHV0RGVsYXkodWludDMyX3QgdmFsdWUpOworCisgICAgLyoqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBuZXcgc21vb3RobmVzcyBmYWN0b3IgdmFsdWUKKyAgICAgKiBccmV0dXJuICB0aGlzIG9iamVjdAorICAgICAqLworICAgIFBpcGVsaW5lV2F0Y2hlciAmc21vb3RobmVzc0ZhY3Rvcih1aW50MzJfdCB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBDbGllbnQgcXVldWVkIGEgd29yayBpdGVtIHRvIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBccGFyYW0gZnJhbWVJbmRleCAgaW5wdXQgZnJhbWUgaW5kZXggb2YgdGhpcyB3b3JrCisgICAgICogXHBhcmFtIGJ1ZmZlcnMgICAgIGlucHV0IGJ1ZmZlcnMgb2YgdGhlIHF1ZXVlZCB3b3JrIGl0ZW0KKyAgICAgKiBccGFyYW0gcXVldWVkQXQgICAgdGltZSB3aGVuIHRoZSBjbGllbnQgcXVldWVkIHRoZSBidWZmZXIKKyAgICAgKi8KKyAgICB2b2lkIG9uV29ya1F1ZXVlZCgKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+PiAmJmJ1ZmZlcnMsCisgICAgICAgICAgICBjb25zdCBDbG9jazo6dGltZV9wb2ludCAmcXVldWVkQXQpOworCisgICAgLyoqCisgICAgICogVGhlIGNvbXBvbmVudCByZWxlYXNlZCBpbnB1dCBidWZmZXJzIGZyb20gYSB3b3JrIGl0ZW0uCisgICAgICoKKyAgICAgKiBccGFyYW0gZnJhbWVJbmRleCAgaW5wdXQgZnJhbWUgaW5kZXgKKyAgICAgKiBccGFyYW0gYXJyYXlJbmRleCAgaW5kZXggb2YgdGhlIGJ1ZmZlciBhdCB0aGUgb3JpZ2luYWwgfGJ1ZmZlcnN8IGluCisgICAgICogICAgICAgICAgICAgICAgICAgIG9uV29ya1F1ZXVlZCgpLgorICAgICAqIFxyZXR1cm4gIGJ1ZmZlcnNbYXJyYXlJbmRleF0KKyAgICAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IG9uSW5wdXRCdWZmZXJSZWxlYXNlZCgKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBhcnJheUluZGV4KTsKKworICAgIC8qKgorICAgICAqIFRoZSBjb21wb25lbnQgZmluaXNoZWQgcHJvY2Vzc2luZyBhIHdvcmsgaXRlbS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmcmFtZUluZGV4ICBpbnB1dCBmcmFtZSBpbmRleAorICAgICAqLworICAgIHZvaWQgb25Xb3JrRG9uZSh1aW50NjRfdCBmcmFtZUluZGV4KTsKKworICAgIC8qKgorICAgICAqIEZsdXNoIHRoZSBwaXBlbGluZS4KKyAgICAgKi8KKyAgICB2b2lkIGZsdXNoKCk7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuICB0cnVlICBpZiBwaXBlbGluZSBkb2VzIG5vdCBuZWVkIG1vcmUgd29yayBpdGVtcyB0byBwcm9jZWVkCisgICAgICogICAgICAgICAgICAgICAgc21vb3RobHksIGNvbnNpZGVyaW5nIGRlbGF5cyBhbmQgc21vb3RobmVzcyBmYWN0b3I7CisgICAgICogICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgcGlwZWxpbmVGdWxsKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZWxhcHNlZCBwcm9jZXNzaW5nIHRpbWUgb2YgYSB3b3JrIGl0ZW0sIG50aCBmcm9tIHRoZSBsb25nZXN0CisgICAgICogcHJvY2Vzc2luZyB0aW1lIHRvIHRoZSBzaG9ydGVzdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBub3cgY3VycmVudCB0aW1lc3RhbXAKKyAgICAgKiBccGFyYW0gbiAgIG50aCB3b3JrIGl0ZW0sIGZyb20gdGhlIGxvbmdlc3QgcHJvY2Vzc2luZyB0aW1lIHRvIHRoZQorICAgICAqICAgICAgICAgICAgc2hvcnRlc3QuIEl0J3MgYSAwLWJhc2VkIGluZGV4LgorICAgICAqIFxyZXR1cm4gIGVsYXBzZWQgcHJvY2Vzc2luZyB0aW1lIG9mIG50aCB3b3JrIGl0ZW0uCisgICAgICovCisgICAgQ2xvY2s6OmR1cmF0aW9uIGVsYXBzZWQoY29uc3QgQ2xvY2s6OnRpbWVfcG9pbnQgJm5vdywgc2l6ZV90IG4pIGNvbnN0OworCitwcml2YXRlOgorICAgIHVpbnQzMl90IG1JbnB1dERlbGF5OworICAgIHVpbnQzMl90IG1QaXBlbGluZURlbGF5OworICAgIHVpbnQzMl90IG1PdXRwdXREZWxheTsKKyAgICB1aW50MzJfdCBtU21vb3RobmVzc0ZhY3RvcjsKKworICAgIHN0cnVjdCBGcmFtZSB7CisgICAgICAgIEZyYW1lKHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4+ICYmYiwKKyAgICAgICAgICAgICAgY29uc3QgQ2xvY2s6OnRpbWVfcG9pbnQgJnEpCisgICAgICAgICAgICA6IGJ1ZmZlcnMoYiksCisgICAgICAgICAgICAgIHF1ZXVlZEF0KHEpIHt9CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4+IGJ1ZmZlcnM7CisgICAgICAgIGNvbnN0IENsb2NrOjp0aW1lX3BvaW50IHF1ZXVlZEF0OworICAgIH07CisgICAgc3RkOjptYXA8dWludDY0X3QsIEZyYW1lPiBtRnJhbWVzSW5QaXBlbGluZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gUElQRUxJTkVfV0FUQ0hFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODBkNGE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5jcHAKQEAgLTAsMCArMSw1NzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlJlZmxlY3RlZFBhcmFtVXBkYXRlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKworI2luY2x1ZGUgIlJlZmxlY3RlZFBhcmFtVXBkYXRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0ZDo6c3RyaW5nIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdDo6ZGVidWdTdHJpbmcoc2l6ZV90IGluZGVudF8pIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZyBpbmRlbnQoaW5kZW50XywgJyAnKTsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzOworICAgIHMgPDwgIkRpY3QgeyIgPDwgc3RkOjplbmRsOworCisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6ICp0aGlzKSB7CisgICAgICAgIHMgPDwgaW5kZW50IDw8ICIgICI7CisKKyAgICAgICAgQzJWYWx1ZSBjMlZhbHVlOworICAgICAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgICAgIHVpbnQzMl90IHVpbnQzMlZhbHVlOworICAgICAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgICAgIHVpbnQ2NF90IHVpbnQ2NFZhbHVlOworICAgICAgICBmbG9hdCBmbG9hdFZhbHVlOworICAgICAgICBzcDxBQnVmZmVyPiBidWZWYWx1ZTsKKyAgICAgICAgQVN0cmluZyBzdHJWYWx1ZTsKKyAgICAgICAgaWYgKGl0LnNlY29uZC5maW5kKCZjMlZhbHVlKSkgeworICAgICAgICAgICAgc3dpdGNoIChjMlZhbHVlLnR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6SU5UMzI6CisgICAgICAgICAgICAgICAgICAgICh2b2lkKWMyVmFsdWUuZ2V0KCZpbnQzMlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OmkzMiAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IGludDMyVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6VUlOVDMyOgorICAgICAgICAgICAgICAgICAgICAodm9pZCljMlZhbHVlLmdldCgmdWludDMyVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzIDw8ICJjMjo6dTMyICIgPDwgaXQuZmlyc3QgPDwgIiA9ICIgPDwgdWludDMyVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6Q05UUjMyOgorICAgICAgICAgICAgICAgICAgICAvLyBkdW1wIGNvdW50ZXIgdmFsdWUgYXMgdW5zaWduZWQKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpYzJWYWx1ZS5nZXQoKGMyX2NudHIzMl90KikmdWludDMyVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzIDw8ICJjMjo6YzMyICIgPDwgaXQuZmlyc3QgPDwgIiA9ICIgPDwgdWludDMyVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6SU5UNjQ6CisgICAgICAgICAgICAgICAgICAgICh2b2lkKWMyVmFsdWUuZ2V0KCZpbnQ2NFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6Omk2NCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IGludDY0VmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6VUlOVDY0OgorICAgICAgICAgICAgICAgICAgICAodm9pZCljMlZhbHVlLmdldCgmdWludDY0VmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzIDw8ICJjMjo6dTY0ICIgPDwgaXQuZmlyc3QgPDwgIiA9ICIgPDwgdWludDY0VmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6Q05UUjY0OgorICAgICAgICAgICAgICAgICAgICAvLyBkdW1wIGNvdW50ZXIgdmFsdWUgYXMgdW5zaWduZWQKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpYzJWYWx1ZS5nZXQoKGMyX2NudHI2NF90KikmdWludDY0VmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzIDw8ICJjMjo6YzY0ICIgPDwgaXQuZmlyc3QgPDwgIiA9ICIgPDwgdWludDY0VmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJWYWx1ZTo6RkxPQVQ6CisgICAgICAgICAgICAgICAgICAgICh2b2lkKWMyVmFsdWUuZ2V0KCZmbG9hdFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OmZsb2F0ICIgPDwgaXQuZmlyc3QgPDwgIiA9ICIgPDwgZmxvYXRWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLy8gZHVtcCB1bnN1cHBvcnRlZCB2YWx1ZXMgZm9yIGRlYnVnZ2luZywgdGhlc2Ugc2hvdWxkIG5vdCBiZSB1c2VkCisgICAgICAgICAgICAgICAgICAgIHMgPDwgImMyOjp1bnN1cHBvcnRlZCAiIDw8IGl0LmZpcnN0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGl0LnNlY29uZC5maW5kKCZpbnQzMlZhbHVlKSkgeworICAgICAgICAgICAgcyA8PCAiaW50MzJfdCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IGludDMyVmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoaXQuc2Vjb25kLmZpbmQoJmludDY0VmFsdWUpKSB7CisgICAgICAgICAgICBzIDw8ICJpbnQ2NF90ICIgPDwgaXQuZmlyc3QgPDwgIiA9ICIgPDwgaW50NjRWYWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpdC5zZWNvbmQuZmluZCgmc3RyVmFsdWUpKSB7CisgICAgICAgICAgICBzIDw8ICJzdHJpbmcgIiA8PCBpdC5maXJzdCA8PCAiID0gXCIiIDw8IHN0clZhbHVlLmNfc3RyKCkgPDwgIlwiIjsKKyAgICAgICAgfSBlbHNlIGlmIChpdC5zZWNvbmQuZmluZCgmYnVmVmFsdWUpKSB7CisgICAgICAgICAgICBzIDw8ICJCdWZmZXIgIiA8PCBpdC5maXJzdCA8PCAiID0gIjsKKyAgICAgICAgICAgIGlmIChidWZWYWx1ZSAhPSBudWxscHRyICYmIGJ1ZlZhbHVlLT5kYXRhKCkgIT0gbnVsbHB0ciAmJiBidWZWYWx1ZS0+c2l6ZSgpIDw9IDY0KSB7CisgICAgICAgICAgICAgICAgcyA8PCAieyIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIEFTdHJpbmcgdG1wOworICAgICAgICAgICAgICAgIGhleGR1bXAoYnVmVmFsdWUtPmRhdGEoKSwgYnVmVmFsdWUtPnNpemUoKSwgaW5kZW50XyArIDQsICZ0bXApOworICAgICAgICAgICAgICAgIHMgPDwgdG1wLmNfc3RyKCkgPDwgaW5kZW50IDw8ICIgIH0iOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzIDw8ICh2b2lkKilidWZWYWx1ZS5nZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGR1bXAgdW5zdXBwb3J0ZWQgdmFsdWVzIGZvciBkZWJ1Z2dpbmcsIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4KKyAgICAgICAgICAgIHMgPDwgInVuc3VwcG9ydGVkICIgPDwgaXQuZmlyc3Q7CisgICAgICAgIH0KKyAgICAgICAgcyA8PCBzdGQ6OmVuZGw7CisgICAgfQorICAgIHMgPDwgaW5kZW50IDw8ICJ9IjsKKworICAgIHJldHVybiBzLnN0cigpOworfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6YWRkUGFyYW1EZXNjKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gJnBhcmFtRGVzY3MpIHsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gJmRlc2MgOiBwYXJhbURlc2NzKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IHN0cnVjdERlc2MgPSByZWZsZWN0b3ItPmRlc2NyaWJlKAorICAgICAgICAgICAgICAgIGRlc2MtPmluZGV4KCkuY29yZUluZGV4KCkpOworICAgICAgICBpZiAoc3RydWN0RGVzYyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IGRlc2NyaWJlICVzIiwgZGVzYy0+bmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYWRkUGFyYW1EZXNjKGRlc2MsICpzdHJ1Y3REZXNjLCByZWZsZWN0b3IsIHRydWUgLyogbWFya1ZlbmRvciAqLyk7CisgICAgfQorCisgICAgLy8gVEVNUDogYWxzbyBhZGQgdmVuZG9yIHBhcmFtZXRlcnMgYXMgbm9uLXZlbmRvcgorICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiAmZGVzYyA6IHBhcmFtRGVzY3MpIHsKKyAgICAgICAgaWYgKCFkZXNjLT5pbmRleCgpLmlzVmVuZG9yKCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IHN0cnVjdERlc2MgPSByZWZsZWN0b3ItPmRlc2NyaWJlKAorICAgICAgICAgICAgICAgIGRlc2MtPmluZGV4KCkuY29yZUluZGV4KCkpOworICAgICAgICBpZiAoc3RydWN0RGVzYykgeworICAgICAgICAgICAgYWRkUGFyYW1EZXNjKGRlc2MsICpzdHJ1Y3REZXNjLCByZWZsZWN0b3IsIGZhbHNlIC8qIG1hcmtWZW5kb3IgKi8pOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6YWRkUGFyYW1TdHJ1Y3REZXNjKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IGRlc2MsCisgICAgICAgIEMyU3RyaW5nIHBhdGgsCisgICAgICAgIHNpemVfdCBvZmZzZXQsCisgICAgICAgIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvciAmc3RydWN0RGVzYywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpIHsKKyAgICBmb3IgKGF1dG8gaXQgPSBzdHJ1Y3REZXNjLmJlZ2luKCk7IGl0ICE9IHN0cnVjdERlc2MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgQzJTdHJpbmcgZmllbGROYW1lID0gcGF0aCArICIuIiArIGl0LT5uYW1lKCk7CisgICAgICAgIGlmIChpdC0+dHlwZSgpICYgQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHKSB7CisgICAgICAgICAgICBpZiAocmVmbGVjdG9yID09IG51bGxwdHIgfHwgaXQtPmV4dGVudCgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiaWdub3JlZCBzdHJ1Y3QgZmllbGQgJXMiLCBmaWVsZE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBzdHJ1Y3REZXNjXyA9IHJlZmxlY3Rvci0+ZGVzY3JpYmUoCisgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleChpdC0+dHlwZSgpKS5jb3JlSW5kZXgoKSk7CisgICAgICAgICAgICBpZiAoc3RydWN0RGVzY18gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3QgZGVzY3JpYmUgc3RydWN0dXJlIG9mICVzIiwgZmllbGROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkUGFyYW1TdHJ1Y3REZXNjKGRlc2MsIGZpZWxkTmFtZSwgb2Zmc2V0ICsgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldCgqaXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3REZXNjXywgcmVmbGVjdG9yKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmVyaWZ5IGV4dGVudCBhbmQgdHlwZQorICAgICAgICBzd2l0Y2ggKGl0LT50eXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjMyOgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UNjQ6CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UNjQ6CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSNjQ6CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpGTE9BVDoKKyAgICAgICAgICAgICAgICBpZiAoaXQtPmV4dGVudCgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImV4dGVudCgpICE9IDEgZm9yIHNpbmdsZSB2YWx1ZSB0eXBlOiAlcyIsIGZpZWxkTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6QkxPQjoKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRCgiVW5yZWNvZ25pemVkIHR5cGU6ICVzIiwgZmllbGROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIiVzIHJlZ2lzdGVyZWQiLCBmaWVsZE5hbWUuY19zdHIoKSk7CisgICAgICAgIC8vIFRPRE86IGdldCB0aGUgcHJvcGVyIHNpemUgYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGZpZWxkcy4KKyAgICAgICAgLy8gb25seSBpbnNlcnQgZmllbGRzIHRoZSB2ZXJ5IGZpcnN0IHRpbWUKKyAgICAgICAgbU1hcC5lbXBsYWNlKGZpZWxkTmFtZSwgRmllbGREZXNjIHsKKyAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEMyRmllbGREZXNjcmlwdG9yPigKKyAgICAgICAgICAgICAgICAgICAgaXQtPnR5cGUoKSwgaXQtPmV4dGVudCgpLCBpdC0+bmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KCppdCksCisgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKCppdCkpLAorICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICB9KTsKKyAgICB9Cit9CisKK3ZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjphZGRQYXJhbURlc2MoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gZGVzYywgY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yICZzdHJ1Y3REZXNjLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvciwgYm9vbCBtYXJrVmVuZG9yKSB7CisgICAgQzJTdHJpbmcgcGFyYW1OYW1lID0gZGVzYy0+bmFtZSgpOworCisgICAgLy8gcHJlZml4IHZlbmRvciBwYXJhbWV0ZXJzCisgICAgaWYgKGRlc2MtPmluZGV4KCkuaXNWZW5kb3IoKSAmJiBtYXJrVmVuZG9yKSB7CisgICAgICAgIHBhcmFtTmFtZSA9ICJ2ZW5kb3IuIiArIHBhcmFtTmFtZTsKKyAgICB9CisgICAgbVBhcmFtTmFtZXMuZW1wbGFjZShkZXNjLT5pbmRleCgpLCBwYXJhbU5hbWUpOworCisgICAgLy8gYWxzbyBhbGxvdyBzZXR0aW5nIHdob2xlIHBhcmFtZXRlcnMgaW4gYSBiaW5hcnkgZmFzaGlvbiB2aWEgQnl0ZUJ1ZmZlcgorICAgIC8vIHRoaXMgaXMgb3B0LWluIGZvciBub3cKKyAgICBhdXRvIGl0ID0gbVdob2xlUGFyYW1zLmZpbmQocGFyYW1OYW1lKTsKKyAgICBpZiAoaXQgIT0gbVdob2xlUGFyYW1zLmVuZCgpICYmIGl0LT5zZWNvbmQuY29yZUluZGV4KCkgPT0gZGVzYy0+aW5kZXgoKS5jb3JlSW5kZXgoKSkgeworICAgICAgICBtTWFwLmVtcGxhY2UocGFyYW1OYW1lLCBGaWVsZERlc2N7IGRlc2MsIG51bGxwdHIsIDAgLyogb2Zmc2V0ICovIH0pOworICAgICAgICAvLyBkb24ndCBhZGQgZmllbGRzIG9mIHdob2xlIHBhcmFtZXRlcnMuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhZGRQYXJhbVN0cnVjdERlc2MoZGVzYywgcGFyYW1OYW1lLCAwIC8qIG9mZnNldCAqLywgc3RydWN0RGVzYywgcmVmbGVjdG9yKTsKK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OnN1cHBvcnRXaG9sZVBhcmFtKHN0ZDo6c3RyaW5nIG5hbWUsIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCkgeworICAgIG1XaG9sZVBhcmFtcy5lbXBsYWNlKG5hbWUsIGluZGV4KTsKK30KKworc3RkOjpzdHJpbmcgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpnZXRQYXJhbU5hbWUoQzJQYXJhbTo6SW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICBhdXRvIGl0ID0gbVBhcmFtTmFtZXMuZmluZChpbmRleCk7CisgICAgaWYgKGl0ICE9IG1QYXJhbU5hbWVzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJldDsKKyAgICByZXQgPDwgIjx1bmtub3duICIgPDwgaW5kZXggPDwgIj4iOworICAgIHJldHVybiByZXQuc3RyKCk7Cit9CisKK3ZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpnZXRQYXJhbUluZGljZXNGcm9tTWVzc2FnZSgKKyAgICAgICAgY29uc3QgRGljdCAmcGFyYW1zLAorICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gKnZlYyAvKiBub25udWxsICovKSBjb25zdCB7CisgICAgQ0hFQ0sodmVjICE9IG51bGxwdHIpOworICAgIHZlYy0+Y2xlYXIoKTsKKyAgICBzdGQ6OnNldDxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICBwYXJzZU1lc3NhZ2VBbmREb1dvcmsoCisgICAgICAgICAgICBwYXJhbXMsCisgICAgICAgICAgICBbJmluZGljZXNdKGNvbnN0IHN0ZDo6c3RyaW5nICYsIGNvbnN0IEZpZWxkRGVzYyAmZGVzYywgY29uc3Qgdm9pZCAqLCBzaXplX3QpIHsKKyAgICAgICAgICAgICAgICBpbmRpY2VzLmluc2VydChkZXNjLnBhcmFtRGVzYy0+aW5kZXgoKSk7CisgICAgICAgICAgICB9KTsKKyAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4ICZpbmRleCA6IGluZGljZXMpIHsKKyAgICAgICAgdmVjLT5wdXNoX2JhY2soaW5kZXgpOworICAgIH0KK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmdldFBhcmFtSW5kaWNlc0ZvcktleXMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAma2V5cywKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICp2ZWMgLyogbm9ubnVsbCAqLykgY29uc3QgeworICAgIENIRUNLKHZlYyAhPSBudWxscHRyKTsKKyAgICB2ZWMtPmNsZWFyKCk7CisgICAgc3RkOjpzZXQ8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4ga2V5TWFwKGtleXMuYmVnaW4oKSwga2V5cy5lbmQoKSk7CisKKyAgICBBTE9HVigiaW4gZ2V0UGFyYW1JbmRpY2VzRm9yS2V5cyB3aXRoICV6dSBrZXlzIGFuZCBtYXAgb2YgJXp1IGVudHJpZXMiLAorICAgICAgICAgICAga2V5TWFwLnNpemUoKSwgbU1hcC5zaXplKCkpOworICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPGNvbnN0IHN0ZDo6c3RyaW5nLCBGaWVsZERlc2M+ICZrdiA6IG1NYXApIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUgPSBrdi5maXJzdDsKKyAgICAgICAgY29uc3QgRmllbGREZXNjICZkZXNjID0ga3Yuc2Vjb25kOworICAgICAgICBBTE9HVigiY291bnQgb2YgJXMgaXMgJXp1IiwgbmFtZS5jX3N0cigpLCBrZXlNYXAuY291bnQobmFtZSkpOworICAgICAgICBpZiAoa2V5TWFwLmNvdW50KG5hbWUpID4gMCkgeworICAgICAgICAgICAgaW5kaWNlcy5pbnNlcnQoZGVzYy5wYXJhbURlc2MtPmluZGV4KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChjb25zdCBDMlBhcmFtOjpJbmRleCAmaW5kZXggOiBpbmRpY2VzKSB7CisgICAgICAgIHZlYy0+cHVzaF9iYWNrKGluZGV4KTsKKyAgICB9Cit9CisKK3ZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjp1cGRhdGVQYXJhbXNGcm9tTWVzc2FnZSgKKyAgICAgICAgY29uc3QgRGljdCAmcGFyYW1zLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICp2ZWMgLyogbm9ubnVsbCAqLykgY29uc3QgeworICAgIENIRUNLKHZlYyAhPSBudWxscHRyKTsKKworICAgIHN0ZDo6bWFwPEMyUGFyYW06OkluZGV4LCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4qPiBwYXJhbXNNYXA7CisgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtIDogKnZlYykgeworICAgICAgICBpZiAocGFyYW0gJiYgKnBhcmFtKSB7CisgICAgICAgICAgICBwYXJhbXNNYXBbcGFyYW0tPmluZGV4KCldID0gJnBhcmFtOworICAgICAgICB9CisgICAgfQorCisgICAgcGFyc2VNZXNzYWdlQW5kRG9Xb3JrKAorICAgICAgICAgICAgcGFyYW1zLAorICAgICAgICAgICAgWyZwYXJhbXNNYXBdKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBjb25zdCBGaWVsZERlc2MgJmRlc2MsIGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gKnBhcmFtID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBhdXRvIHBhcmFtSXQgPSBwYXJhbXNNYXAuZmluZChkZXNjLnBhcmFtRGVzYy0+aW5kZXgoKSk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtSXQgPT0gcGFyYW1zTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCIlcyBmb3VuZCwgYnV0IHBhcmFtICMlZCBpc24ndCBwcmVzZW50IHRvIHVwZGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCAoaW50MzJfdClkZXNjLnBhcmFtRGVzYy0+aW5kZXgoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGFyYW0gPSBwYXJhbUl0LT5zZWNvbmQ7CisKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgX0MyUGFyYW0gOiBwdWJsaWMgQzJQYXJhbSB7CisgICAgICAgICAgICAgICAgICAgIHVzaW5nIEMyUGFyYW06OkMyUGFyYW07CisgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtKHVpbnQzMl90IHNpemUsIHVpbnQzMl90IGluZGV4KSA6IEMyUGFyYW0oc2l6ZSwgaW5kZXgpIHsgfQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIGhhbmRsZSB3aG9sZSBwYXJhbSB1cGRhdGVzIGFzIHBhcnQgb2YgYSBmbGV4aWJsZSBwYXJhbSB1cGRhdGUgdXNpbmcKKyAgICAgICAgICAgICAgICAvLyBhIHplcm8gb2Zmc2V0LgorICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIHNpemVfdCBtaW5PZmZzZXQgPSAwOworCisgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBkZXNjcmlwdG9yIGhhcyBhIGZpZWxkLCB1c2UgdGhlIG9mZnNldCBhbmQgc2l6ZSBhbmQgZW5zdXJlIHRoYXQgb2Zmc2V0CisgICAgICAgICAgICAgICAgLy8gaXMgbm90IHBhcnQgb2YgdGhlIGhlYWRlcgorICAgICAgICAgICAgICAgIGlmIChkZXNjLmZpZWxkRGVzYykgeworICAgICAgICAgICAgICAgICAgICBtaW5PZmZzZXQgPSBzaXplb2YoQzJQYXJhbSk7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHNpemVvZihDMlBhcmFtKSArIGRlc2Mub2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KCpkZXNjLmZpZWxkRGVzYyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gcmVhbGxvY2F0ZSBvciB0cmltIGZsZXhpYmxlIHBhcmFtIChvciB3aG9sZSBwYXJhbSkgYXMgbmVjZXNzYXJ5CisgICAgICAgICAgICAgICAgaWYgKCFkZXNjLmZpZWxkRGVzYyAvKiB3aG9sZSBwYXJhbSAqLyB8fCBkZXNjLmZpZWxkRGVzYy0+ZXh0ZW50KCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyByZWFsbG9jYXRlIHBhcmFtIGlmIG1vcmUgc3BhY2UgaXMgbmVlZGVkCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS0+Z2V0KCktPnNpemUoKSA8IG9mZnNldCArIHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID4gSU5UMzJfTUFYIC0gb2Zmc2V0IHx8IG9mZnNldCA8IG1pbk9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgdG9vIGxvbmcgb3Igb2Zmc2V0IHRvbyBlYXJseSAtIGFiYW5kb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtICpuZXdQYXJhbSA9IChDMlBhcmFtICopOjpvcGVyYXRvciBuZXcob2Zmc2V0ICsgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgKG5ld1BhcmFtKSBfQzJQYXJhbShvZmZzZXQgKyBzaXplLCBwYXJhbS0+Z2V0KCktPmluZGV4KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShuZXdQYXJhbSArIDEsIHBhcmFtLT5nZXQoKSArIDEsIG9mZnNldCAtIHNpemVvZihDMlBhcmFtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS0+cmVzZXQobmV3UGFyYW0pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLT5nZXQoKS0+c2l6ZSgpID4gb2Zmc2V0ICsgc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJpbSBwYXJhbWV0ZXIgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OlRyaW1QYXJhbShwYXJhbS0+Z2V0KCksIG9mZnNldCArIHNpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXNjLmZpZWxkRGVzYy0+dHlwZSgpID09IEMyRmllbGREZXNjcmlwdG9yOjpCTE9CKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHplcm8gZmlsbCBibG9icyBpZiB1cGRhdGluZyB3aXRoIHNtYWxsZXIgYmxvYgorICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYy5maWVsZERlc2MtPmV4dGVudCgpID4gc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh1aW50OF90ICopKHBhcmFtLT5nZXQoKSkgKyBvZmZzZXQgKyBzaXplLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MuZmllbGREZXNjLT5leHRlbnQoKSAtIHNpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90ICopKHBhcmFtLT5nZXQoKSkgKyBvZmZzZXQsIHB0ciwgc2l6ZSk7CisgICAgICAgICAgICB9KTsKK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OnBhcnNlTWVzc2FnZUFuZERvV29yaygKKyAgICAgICAgY29uc3QgRGljdCAmcGFyYW1zLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcgJiwgY29uc3QgRmllbGREZXNjICYsIGNvbnN0IHZvaWQgKiwgc2l6ZV90KT4gd29yaykgY29uc3QgeworICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPGNvbnN0IHN0ZDo6c3RyaW5nLCBGaWVsZERlc2M+ICZrdiA6IG1NYXApIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUgPSBrdi5maXJzdDsKKyAgICAgICAgY29uc3QgRmllbGREZXNjICZkZXNjID0ga3Yuc2Vjb25kOworICAgICAgICBhdXRvIHBhcmFtID0gcGFyYW1zLmZpbmQobmFtZSk7CisgICAgICAgIGlmIChwYXJhbSA9PSBwYXJhbXMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gaGFuZGxlIHdob2xlIHBhcmFtZXRlcnMKKyAgICAgICAgaWYgKCFkZXNjLmZpZWxkRGVzYykgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gdG1wOworICAgICAgICAgICAgaWYgKHBhcmFtLT5zZWNvbmQuZmluZCgmdG1wKSAmJiB0bXAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEMyUGFyYW0gKnRtcEFzUGFyYW0gPSBDMlBhcmFtOjpGcm9tKHRtcC0+ZGF0YSgpLCB0bXAtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgaWYgKHRtcEFzUGFyYW0gJiYgdG1wQXNQYXJhbS0+dHlwZSgpLnR5cGUoKSA9PSBkZXNjLnBhcmFtRGVzYy0+aW5kZXgoKS50eXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCB0bXAtPmRhdGEoKSwgdG1wLT5zaXplKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJQYXJhbSBibG9iIGRvZXMgbm90IG1hdGNoIHBhcmFtIGZvciAnJXMnICglcCwgJXggdnMgJXgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIHRtcEFzUGFyYW0sIHRtcEFzUGFyYW0gPyB0bXBBc1BhcmFtLT50eXBlKCkudHlwZSgpIDogMHhERUFEdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLnBhcmFtRGVzYy0+aW5kZXgoKS50eXBlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBpbnQzMlZhbHVlOworICAgICAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgICAgIEMyVmFsdWUgYzJWYWx1ZTsKKworICAgICAgICBDMkZpZWxkRGVzY3JpcHRvcjo6dHlwZV90IGZpZWxkVHlwZSA9IGRlc2MuZmllbGREZXNjLT50eXBlKCk7CisgICAgICAgIHNpemVfdCBmaWVsZEV4dGVudCA9IGRlc2MuZmllbGREZXNjLT5leHRlbnQoKTsKKyAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOgorICAgICAgICAgICAgICAgIGlmICgocGFyYW0tPnNlY29uZC5maW5kKCZjMlZhbHVlKSAmJiBjMlZhbHVlLmdldCgmaW50MzJWYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbS0+c2Vjb25kLmZpbmQoJmludDMyVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgJmludDMyVmFsdWUsIHNpemVvZihpbnQzMlZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOgorICAgICAgICAgICAgICAgIGlmICgocGFyYW0tPnNlY29uZC5maW5kKCZjMlZhbHVlKSAmJiBjMlZhbHVlLmdldCgodWludDMyX3QqKSZpbnQzMlZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBhcmFtLT5zZWNvbmQuZmluZCgmaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCAmaW50MzJWYWx1ZSwgc2l6ZW9mKGludDMyVmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSMzI6CisgICAgICAgICAgICAgICAgaWYgKChwYXJhbS0+c2Vjb25kLmZpbmQoJmMyVmFsdWUpICYmIGMyVmFsdWUuZ2V0KChjMl9jbnRyMzJfdCopJmludDMyVmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW0tPnNlY29uZC5maW5kKCZpbnQzMlZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsICZpbnQzMlZhbHVlLCBzaXplb2YoaW50MzJWYWx1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OgorICAgICAgICAgICAgICAgIGlmICgocGFyYW0tPnNlY29uZC5maW5kKCZjMlZhbHVlKSAmJiBjMlZhbHVlLmdldCgmaW50NjRWYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbS0+c2Vjb25kLmZpbmQoJmludDY0VmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgJmludDY0VmFsdWUsIHNpemVvZihpbnQ2NFZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDY0OgorICAgICAgICAgICAgICAgIGlmICgocGFyYW0tPnNlY29uZC5maW5kKCZjMlZhbHVlKSAmJiBjMlZhbHVlLmdldCgodWludDY0X3QqKSZpbnQ2NFZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBhcmFtLT5zZWNvbmQuZmluZCgmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCAmaW50NjRWYWx1ZSwgc2l6ZW9mKGludDY0VmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSNjQ6CisgICAgICAgICAgICAgICAgaWYgKChwYXJhbS0+c2Vjb25kLmZpbmQoJmMyVmFsdWUpICYmIGMyVmFsdWUuZ2V0KChjMl9jbnRyNjRfdCopJmludDY0VmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW0tPnNlY29uZC5maW5kKCZpbnQ2NFZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsICZpbnQ2NFZhbHVlLCBzaXplb2YoaW50NjRWYWx1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkZMT0FUOiB7CisgICAgICAgICAgICAgICAgZmxvYXQgdG1wOworICAgICAgICAgICAgICAgIGlmIChwYXJhbS0+c2Vjb25kLmZpbmQoJmMyVmFsdWUpICYmIGMyVmFsdWUuZ2V0KCZ0bXApKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgJnRtcCwgc2l6ZW9mKHRtcCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlNUUklORzogeworICAgICAgICAgICAgICAgIEFTdHJpbmcgdG1wOworICAgICAgICAgICAgICAgIGlmICghcGFyYW0tPnNlY29uZC5maW5kKCZ0bXApKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGRFeHRlbnQgPiAwICYmIHRtcC5zaXplKCkgPj0gZmllbGRFeHRlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyB0cnVuY2F0ZWQodG1wLCAwLCBmaWVsZEV4dGVudCAtIDEpOworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiU3RyaW5nIHZhbHVlIHRvbyBsb25nIHRvIGZpdDogb3JpZ2luYWwgXCIlc1wiIHRydW5jYXRlZCB0byBcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcC5jX3N0cigpLCB0cnVuY2F0ZWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRydW5jYXRlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCB0bXAuY19zdHIoKSwgdG1wLnNpemUoKSArIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COiB7CisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gdG1wOworICAgICAgICAgICAgICAgIGlmICghcGFyYW0tPnNlY29uZC5maW5kKCZ0bXApIHx8IHRtcCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChmaWVsZEV4dGVudCA+IDAgJiYgdG1wLT5zaXplKCkgPiBmaWVsZEV4dGVudCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQmxvYiB2YWx1ZSB0b28gbG9uZyB0byBmaXQuIFRydW5jYXRpbmcuIik7CisgICAgICAgICAgICAgICAgICAgIHRtcC0+c2V0UmFuZ2UodG1wLT5vZmZzZXQoKSwgZmllbGRFeHRlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsIHRtcC0+ZGF0YSgpLCB0bXAtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0QoIlVuc3VwcG9ydGVkIGRhdGEgdHlwZSBmb3IgJXMiLCBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QKK1JlZmxlY3RlZFBhcmFtVXBkYXRlcjo6Z2V0UGFyYW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJnBhcmFtc18pIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1zOworICAgIHBhcmFtcy5yZXNpemUocGFyYW1zXy5zaXplKCkpOworICAgIHN0ZDo6dHJhbnNmb3JtKHBhcmFtc18uYmVnaW4oKSwgcGFyYW1zXy5lbmQoKSwgcGFyYW1zLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgW10oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+JiBwKSAtPiBDMlBhcmFtKiB7IHJldHVybiBwLmdldCgpOyB9KTsKKyAgICByZXR1cm4gZ2V0UGFyYW1zKHBhcmFtcyk7Cit9CisKK1JlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdAorUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpnZXRQYXJhbXMoY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMpIGNvbnN0IHsKKyAgICBEaWN0IHJldDsKKworICAgIC8vIGNvbnZlcnQgdmVjdG9yIHRvIG1hcAorICAgIHN0ZDo6bWFwPEMyUGFyYW06OkluZGV4LCBDMlBhcmFtICo+IHBhcmFtc01hcDsKKyAgICBmb3IgKEMyUGFyYW0gKnBhcmFtIDogcGFyYW1zKSB7CisgICAgICAgIGlmIChwYXJhbSAhPSBudWxscHRyICYmICpwYXJhbSkgeworICAgICAgICAgICAgcGFyYW1zTWFwW3BhcmFtLT5pbmRleCgpXSA9IHBhcmFtOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChjb25zdCBzdGQ6OnBhaXI8Y29uc3Qgc3RkOjpzdHJpbmcsIEZpZWxkRGVzYz4gJmt2IDogbU1hcCkgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSA9IGt2LmZpcnN0OworICAgICAgICBjb25zdCBGaWVsZERlc2MgJmRlc2MgPSBrdi5zZWNvbmQ7CisgICAgICAgIGlmIChwYXJhbXNNYXAuY291bnQoZGVzYy5wYXJhbURlc2MtPmluZGV4KCkpID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEMyUGFyYW0gKnBhcmFtID0gcGFyYW1zTWFwW2Rlc2MucGFyYW1EZXNjLT5pbmRleCgpXTsKKyAgICAgICAgVmFsdWUgdmFsdWU7CisKKyAgICAgICAgLy8gaGFuZGxlIHdob2xlIHBhcmFtcyBmaXJzdAorICAgICAgICBpZiAoIWRlc2MuZmllbGREZXNjKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWYgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkocGFyYW0sIHBhcmFtLT5zaXplKCkpOworICAgICAgICAgICAgdmFsdWUuc2V0KGJ1Zik7CisgICAgICAgICAgICByZXQuZW1wbGFjZShuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBvZmZzZXQgPSBzaXplb2YoQzJQYXJhbSkgKyBkZXNjLm9mZnNldAorICAgICAgICAgICAgICAgICsgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldCgqZGVzYy5maWVsZERlc2MpOworICAgICAgICB1aW50OF90ICpkYXRhID0gKHVpbnQ4X3QgKilwYXJhbSArIG9mZnNldDsKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCBmaWVsZFR5cGUgPSBkZXNjLmZpZWxkRGVzYy0+dHlwZSgpOworICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkgeworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOiB7CisgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCA9IGRlc2MuZmllbGREZXNjLT5leHRlbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gcGFyYW0tPnNpemUoKSAtIG9mZnNldDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0tPnNpemUoKSA8IGxlbmd0aCB8fCBwYXJhbS0+c2l6ZSgpIC0gbGVuZ3RoIDwgb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJwYXJhbSB0b28gc21hbGwgZm9yIHN0cmluZzogbGVuZ3RoICV6dSBzaXplICV6dSBvZmZzZXQgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsIHBhcmFtLT5zaXplKCksIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWx1ZS5zZXQoQVN0cmluZygoY2hhciAqKWRhdGEsIHN0cm5sZW4oKGNoYXIgKilkYXRhLCBsZW5ndGgpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6IHsKKyAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoID0gZGVzYy5maWVsZERlc2MtPmV4dGVudCgpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBwYXJhbS0+c2l6ZSgpIC0gb2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwYXJhbS0+c2l6ZSgpIDwgbGVuZ3RoIHx8IHBhcmFtLT5zaXplKCkgLSBsZW5ndGggPCBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoInBhcmFtIHRvbyBzbWFsbCBmb3IgYmxvYjogbGVuZ3RoICV6dSBzaXplICV6dSBvZmZzZXQgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsIHBhcmFtLT5zaXplKCksIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShkYXRhLCBsZW5ndGgpOworICAgICAgICAgICAgICAgIHZhbHVlLnNldChidWYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHZhbHVlU2l6ZSA9IEMyVmFsdWU6OlNpemVGb3IoKEMyVmFsdWU6OnR5cGVfdClmaWVsZFR5cGUpOworICAgICAgICAgICAgICAgIGlmIChwYXJhbS0+c2l6ZSgpIDwgdmFsdWVTaXplIHx8IHBhcmFtLT5zaXplKCkgLSB2YWx1ZVNpemUgPCBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoInBhcmFtIHRvbyBzbWFsbCBmb3IgYzJ2YWx1ZTogc2l6ZSAlenUgb2Zmc2V0ICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPnNpemUoKSwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQzJWYWx1ZSBjMlZhbHVlOworICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGRUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOiAgYzJWYWx1ZSA9ICooKGludDMyX3QgKilkYXRhKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjogYzJWYWx1ZSA9ICooKHVpbnQzMl90ICopZGF0YSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSMzI6IGMyVmFsdWUgPSAqKChjMl9jbnRyMzJfdCAqKWRhdGEpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UNjQ6ICBjMlZhbHVlID0gKigoaW50NjRfdCAqKWRhdGEpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDY0OiBjMlZhbHVlID0gKigodWludDY0X3QgKilkYXRhKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFI2NDogYzJWYWx1ZSA9ICooKGMyX2NudHI2NF90ICopZGF0YSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpGTE9BVDogIGMyVmFsdWUgPSAqKChmbG9hdCAqKWRhdGEpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJVbnN1cHBvcnRlZCBkYXRhIHR5cGUgZm9yICVzIiwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWx1ZS5zZXQoYzJWYWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0LmVtcGxhY2UobmFtZSwgdmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6Y2xlYXIoKSB7CisgICAgbU1hcC5jbGVhcigpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MzZiYTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmgKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFJFRkxFQ1RFRF9QQVJBTV9CVUlMREVSX0hfCisjZGVmaW5lIFJFRkxFQ1RFRF9QQVJBTV9CVUlMREVSX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8QzIuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0byBxdWVyeSBhbmQgdXBkYXRlIENvZGVjIDIuMCBjb25maWd1cmF0aW9uIHZhbHVlcy4gVXNlIGN1c3RvbSBkaWN0aW9uYXJ5IGFzCisgKiBBTWVzc2FnZSBjYW5ub3QgcmVwcmVzZW50IGFsbCB0eXBlcyBvZiBDb2RlYyAyLjAgcGFyYW1ldGVycyBhbmQgQzJWYWx1ZSBjYW5ub3QgcmVwcmVzZW50CisgKiBhbGwgdHlwZXMgb2YgU0RLIHZhbHVlcy4gV2Ugd2FudCB0byBiZSBwcmVjaXNlIHdoZW4gc2V0dGluZyBzdGFuZGFyZCBwYXJhbWV0ZXJzICh1c2UgQzJWYWx1ZQorICogZm9yIGFyaXRobWV0aWMgdmFsdWVzKSwgYnV0IGFsc28gc3VwcG9ydCBpbnQzMiBhbmQgaW50NjQgZm9yIFNESyB2YWx1ZXMgc3BlY2lmaWNhbGx5IGZvcgorICogdmVuZG9yIHBhcmFtZXRlcnMgKGFzIFNESyBBUEkgZG9lcyBub3QgYWxsb3cgc3BlY2lmeWluZyBwcm9wZXIgdHlwZS4pIFdoZW4gcXVlcnlpbmcgZmllbGRzLAorICogd2UgY2FuIHVzZSBDMlZhbHVlcyBhcyB0aGV5IGFyZSBkZWZpbmVkLgorICoKKyAqICAgICAgSXRlbSA9PiBDb2RlYyAyLjAgdmFsdWUgbWFwcGluZ3M6CisgKiAgICAgQ1ZhbHVlOjp0eXBlID0+IHR5cGUKKyAqICAgICBpbnQzMiA9PiBpbnQzMiwgY3RyMzIgb3IgdWludDMyCisgKiAgICAgaW50NjQgPT4gaW50NjQsIGN0cjY0IG9yIHVpbnQ2NAorICogICAgIEFTdHJpbmcgPT4gc3RyaW5nCisgKiAgICAgQUJ1ZmZlciA9PiBibG9iCisgKiAgICAgJ1JlY3QnID0+IEMyUmVjdFN0cnVjdCAobm90IGV4cG9zZWQgaW4gU0RLIGFzIGEgcmVjdGFuZ2xlKQorICovCitjbGFzcyBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIgeworcHVibGljOgorICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcigpID0gZGVmYXVsdDsKKyAgICB+UmVmbGVjdGVkUGFyYW1VcGRhdGVyKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogRWxlbWVudCBmb3IgdmFsdWVzCisgICAgICovCisgICAgc3RydWN0IFZhbHVlIDogcHVibGljIEFEYXRhPEMyVmFsdWUsIGludDMyX3QsIGludDY0X3QsIEFTdHJpbmcsIHNwPEFCdWZmZXI+Pjo6QmFzaWMgeworICAgICAgICAvLyBhbGxvdyBjb25zdHJ1Y3Rpb24gZnJvbSBiYXNlIHR5cGVzCisgICAgICAgIFZhbHVlKCkgPSBkZWZhdWx0OworICAgICAgICBleHBsaWNpdCBWYWx1ZShDMlZhbHVlIGkpICAgICAgICAgICAgeyBzZXQoaSk7IH0KKyAgICAgICAgZXhwbGljaXQgVmFsdWUoaW50MzJfdCBpKSAgICAgICAgICAgIHsgc2V0KGkpOyB9CisgICAgICAgIGV4cGxpY2l0IFZhbHVlKGludDY0X3QgaSkgICAgICAgICAgICB7IHNldChpKTsgfQorICAgICAgICBleHBsaWNpdCBWYWx1ZShjb25zdCBBU3RyaW5nICZpKSAgICAgeyBzZXQoaSk7IH0KKyAgICAgICAgZXhwbGljaXQgVmFsdWUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmkpIHsgc2V0KGkpOyB9CisgICAgfTsKKworICAgIHN0cnVjdCBEaWN0IDogcHVibGljIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBWYWx1ZT4geworICAgICAgICBEaWN0KCkgPSBkZWZhdWx0OworICAgICAgICBzdGQ6OnN0cmluZyBkZWJ1Z1N0cmluZyhzaXplX3QgaW5kZW50ID0gMCkgY29uc3Q7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgYWxsIGZpZWxkcyBvZiB0aGUgcGFyYW1ldGVyIGRlc2NyaXB0b3JzIHN1cHBsaWVkLCBzbyB0aGF0IHRoaXMgb3BiamVjdCBjYW4gbGF0ZXIKKyAgICAgKiBxdWVyeSBhbmQgdXBkYXRlIHRoZXNlLgorICAgICAqCisgICAgICogRm9yIG5vdyBvbmx5IGZpcnN0LWxldmVsIGZpZWxkcyBhcmUgc3VwcG9ydGVkLiBBbHNvLCBhcnJheSBmaWVsZHMgYXJlIG5vdCBzdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gcmVmbGVjdG9yICAgQzJQYXJhbVJlZmxlY3RvciBvYmplY3QgZm9yIEMyUGFyYW0gcmVmbGVjdGlvbi4KKyAgICAgKiBccGFyYW0gcGFyYW1EZXNjcyAgdmVjdG9yIG9mIEMyUGFyYW1EZXNjcmlwdG9yIG9iamVjdHMgdGhhdCB0aGlzIG9iamVjdAorICAgICAqICAgICAgICAgICAgICAgICAgICB3b3VsZCByZWNvZ25pemUgd2hlbiBidWlsZGluZyBwYXJhbXMuCisgICAgICovCisgICAgdm9pZCBhZGRQYXJhbURlc2MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvciwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICZwYXJhbURlc2NzKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgZmllbGRzIG9mIGEgc3RhbmRhcmQgcGFyYW1ldGVyICh0aGF0IG1heSBub3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBwYXJhbWV0ZXIgcmVmbGVjdG9yCisgICAgICogb3IgbWF5IG5vdCBiZSBsaXN0ZWQgYXMgYSBzdXBwb3J0ZWQgdmFsdWUgYnkgdGhlIGNvbXBvbmVudCkuIElmIHRoZSBwYXJhbWV0ZXIgbmFtZSBpcworICAgICAqIHVzZWQgZm9yIGFub3RoZXIgcGFyYW1ldGVyLCB0aGlzIG9wZXJhdGlvbiBpcyBhIG5vLW9wLiAoVGVjaG5pY2FsbHksIHRoaXMgaXMgYnkgZmllbGRzKS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBUIHN0YW5kYXJkIHBhcmFtZXRlciB0eXBlCisgICAgICogXHBhcmFtIG5hbWUgcGFyYW1ldGVyIG5hbWUKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHZvaWQgYWRkU3RhbmRhcmRQYXJhbShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW1EZXNjcmlwdG9yOjpJU19SRUFEX09OTFkpIHsKKyAgICAgICAgYWRkUGFyYW1EZXNjKHN0ZDo6bWFrZV9zaGFyZWQ8QzJQYXJhbURlc2NyaXB0b3I+KAorICAgICAgICAgICAgICAgIEMyUGFyYW06OkluZGV4KFQ6OlBBUkFNX1RZUEUpLCBhdHRyaWIsIG5hbWUuY19zdHIoKSksCisgICAgICAgICAgICAgICAgQzJTdHJ1Y3REZXNjcmlwdG9yKChUKiludWxscHRyKSwgbnVsbHB0ciAvKiBkZXNjcmlwdG9yICovKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGZpZWxkcyBvZiBhIHN0cnVjdHVyZSAob3IgYSBwYXJhbWVhdGVyKSBkZXNjcmliZWQgYnkgdGhlIHN0cnVjdCBkZXNjcmlwdG9yLiBJZgorICAgICAqIHJlZmxlY3RvciBpcyBwcm92aWRlZCwgZmllbGRzIG9mIHN1Yi1zdHJ1Y3R1cmVzIGFyZSBhbHNvIGFkZGVkLiBPdGhlcndpc2UsIG9ubHkgdG9wLWxldmVsCisgICAgICogZnVuZGFtZW50YWwgdHlwZWQgZmllbGRzIChhcml0aG1ldGljLCBzdHJpbmcgYW5kIGJsb2IpIGFyZSBhZGRlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbURlc2MgcGFyYW1ldGVyIGRlc2NyaXB0b3IKKyAgICAgKiBccGFyYW0gZmllbGREZXNjIGZpZWxkIGRlc2NyaXB0b3IKKyAgICAgKiBccGFyYW0gcGF0aCBwYXRoL25hbWUgb2YgdGhlIHN0cnVjdHVyZSAoZmllbGQgb3IgcGFyZW50IHBhcmFtZXRlcikKKyAgICAgKiBccGFyYW0gb2Zmc2V0IG9mZnNldCBvZiB0aGUgc3RydWN0dXJlIGluIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiBccGFyYW0gcmVmbGVjdG9yICBDMlBhcmFtUmVmbGVjdG9yIG9iamVjdCBmb3IgQzJQYXJhbSByZWZsZWN0aW9uIChtYXkgYmUgbnVsbCkKKyAgICAgKi8KKyAgICB2b2lkIGFkZFBhcmFtU3RydWN0RGVzYygKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gcGFyYW1EZXNjLCBDMlN0cmluZyBwYXRoLCBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yICZzdHJ1Y3REZXNjLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpOworCisgICAgLyoqCisgICAgICogQWRkcyBmaWVsZHMgb2YgYSBwYXJhbWV0ZXIgZGVzY3JpYmVkIGJ5IHRoZSBzdHJ1Y3QgZGVzY3JpcHRvci4gSWYgcmVmbGVjdG9yIGlzIHByb3ZpZGVkLAorICAgICAqIGZpZWxkcyBvZiBzdWItc3RydWN0dXJlcyBhcmUgYWxzbyBhZGRlZC4gT3RoZXJ3aXNlLCBvbmx5IHRvcC1sZXZlbCBmdW5kYW1lbnRhbCB0eXBlZCBmaWVsZHMKKyAgICAgKiAoYXJpdGhtZXRpYywgc3RyaW5nIGFuZCBibG9iKSBhcmUgYWRkZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1EZXNjIHBhcmFtZXRlciBkZXNjcmlwdG9yCisgICAgICogXHBhcmFtIGZpZWxkRGVzYyBmaWVsZCBkZXNjcmlwdG9yCisgICAgICogXHBhcmFtIHJlZmxlY3RvciAgQzJQYXJhbVJlZmxlY3RvciBvYmplY3QgZm9yIEMyUGFyYW0gcmVmbGVjdGlvbiAobWF5IGJlIG51bGwpCisgICAgICogXHBhcmFtIG1hcmtWZW5kb3IgVEVNUCBpZiB0cnVlLCBwcmVmaXggdmVuZG9yIHBhcmFtZXRlciBuYW1lcyB3aXRoICJ2ZW5kb3IuIgorICAgICAqLworICAgIHZvaWQgYWRkUGFyYW1EZXNjKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBwYXJhbURlc2MsIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvciAmc3RydWN0RGVzYywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yLAorICAgICAgICAgICAgYm9vbCBtYXJrVmVuZG9yID0gdHJ1ZSk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgc3VwcG9ydCBmb3Igc2V0dGluZyBhIHBhcmFtZXRlciBhcyBhIGJpbmFyeSBibG9iLgorICAgICAqCisgICAgICogXHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyCisgICAgICogXHBhcmFtIGNvcmVJbmRleCBwYXJhbWV0ZXIgKGNvcmUpIGluZGV4CisgICAgICovCisgICAgdm9pZCBzdXBwb3J0V2hvbGVQYXJhbShzdGQ6OnN0cmluZyBuYW1lLCBDMlBhcmFtOjpDb3JlSW5kZXggY29yZUluZGV4KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBmb3IgYW4gaW5kZXguCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgZ2V0UGFyYW1OYW1lKEMyUGFyYW06OkluZGV4IGluZGV4KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEdldCBsaXN0IG9mIHBhcmFtIGluZGljZXMgZnJvbSBmaWVsZCBuYW1lcyBhbmQgdmFsdWVzIGluIEFNZXNzYWdlIG9iamVjdC4KKyAgICAgKgorICAgICAqIFRPRE86IFRoaXMgc2hvdWxkIGJlIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXJlIGxpc3RlZCBieSB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtc1tpbl0gIERpY3Qgb2JqZWN0IHdpdGggZmllbGQgbmFtZSB0byB2YWx1ZSBwYWlycy4KKyAgICAgKiBccGFyYW0gdmVjW291dF0gICAgdmVjdG9yIHRvIHN0b3JlIHRoZSBpbmRpY2VzIGZyb20gfHBhcmFtc3wuCisgICAgICovCisgICAgdm9pZCBnZXRQYXJhbUluZGljZXNGcm9tTWVzc2FnZSgKKyAgICAgICAgICAgIGNvbnN0IERpY3QgJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAqdmVjIC8qIG5vbm51bGwgKi8pIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0IGxpc3Qgb2YgcGFyYW0gaW5kaWNlcyBmcm9tIGZpZWxkIG5hbWVzIChvbmx5KSBpbiBBTWVzc2FnZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1zW2luXSAgVmVjdG9yIG9iamVjdCB3aXRoIGZpZWxkIG5hbWVzLgorICAgICAqIFxwYXJhbSB2ZWNbb3V0XSAgICB2ZWN0b3IgdG8gc3RvcmUgdGhlIGluZGljZXMgZnJvbSB8cGFyYW1zfC4KKyAgICAgKi8KKyAgICB2b2lkIGdldFBhcmFtSW5kaWNlc0ZvcktleXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmtleXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gKnZlYyAvKiBub25udWxsICovKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFVwZGF0ZSBDMlBhcmFtIG9iamVjdHMgZnJvbSBmaWVsZCBuYW1lIGFuZCB2YWx1ZSBpbiBBTWVzc2FnZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1zW2luXSAgICBEaWN0IG9iamVjdCB3aXRoIGZpZWxkIG5hbWUgdG8gdmFsdWUgcGFpcnMuCisgICAgICogXHBhcmFtIHZlY1tpbixvdXRdICAgdmVjdG9yIG9mIHRoZSBDMlBhcmFtIG9iamVjdHMgdG8gYmUgdXBkYXRlZC4KKyAgICAgKi8KKyAgICB2b2lkIHVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKAorICAgICAgICAgICAgY29uc3QgRGljdCAmcGFyYW1zLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqdmVjIC8qIG5vbm51bGwgKi8pIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0IGZpZWxkcyBmcm9tIEMyUGFyYW0gb2JqZWN0cyBpbiBBTWVzc2FnZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1zW2luXSAgICB2ZWN0b3Igb2YgdGhlIEMyUGFyYW0gb2JqZWN0cyB0byBiZSBxdWVyaWVkCisgICAgICogXHJldHVybiBhIERpY3Qgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGtub3duIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBEaWN0IGdldFBhcmFtcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zIC8qIG5vbm51bGwgKi8pIGNvbnN0OworCisgICAgRGljdCBnZXRQYXJhbXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZwYXJhbXMgLyogbm9ubnVsbCAqLykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDbGVhciBwYXJhbSBkZXNjcmlwdG9ycyBpbiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCk7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IEZpZWxkRGVzYyB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gcGFyYW1EZXNjOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkRGVzYzsKKyAgICAgICAgc2l6ZV90IG9mZnNldDsKKyAgICB9OworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBGaWVsZERlc2M+IG1NYXA7CisgICAgc3RkOjptYXA8QzJQYXJhbTo6SW5kZXgsIHN0ZDo6c3RyaW5nPiBtUGFyYW1OYW1lczsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQzJQYXJhbTo6Q29yZUluZGV4PiBtV2hvbGVQYXJhbXM7CisKKyAgICB2b2lkIHBhcnNlTWVzc2FnZUFuZERvV29yaygKKyAgICAgICAgICAgIGNvbnN0IERpY3QgJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnN0cmluZyAmLCBjb25zdCBGaWVsZERlc2MgJiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpPiB3b3JrKSBjb25zdDsKKworICAgIEMyX0RPX05PVF9DT1BZKFJlZmxlY3RlZFBhcmFtVXBkYXRlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFJFRkxFQ1RFRF9QQVJBTV9CVUlMREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vU2tpcEN1dEJ1ZmZlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vU2tpcEN1dEJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQxZGU2NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Ta2lwQ3V0QnVmZmVyLmNwcApAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU2tpcEN1dEJ1ZmZlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlICJTa2lwQ3V0QnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworU2tpcEN1dEJ1ZmZlcjo6U2tpcEN1dEJ1ZmZlcihzaXplX3Qgc2tpcCwgc2l6ZV90IGN1dCwgc2l6ZV90IG51bTE2Qml0Q2hhbm5lbHMpIHsKKworICAgIG1Xcml0ZUhlYWQgPSAwOworICAgIG1SZWFkSGVhZCA9IDA7CisgICAgbUNhcGFjaXR5ID0gMDsKKyAgICBtQ3V0QnVmZmVyID0gbnVsbHB0cjsKKworICAgIGlmIChudW0xNkJpdENoYW5uZWxzID09IDAgfHwgbnVtMTZCaXRDaGFubmVscyA+IElOVDMyX01BWCAvIDIpIHsKKyAgICAgICAgQUxPR1coIiMgY2hhbm5lbHMgb3V0IG9mIHJhbmdlOiAlenUsIHVzaW5nIHBhc3N0aHJvdWdoIGluc3RlYWQiLCBudW0xNkJpdENoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzaXplX3QgZnJhbWVTaXplID0gbnVtMTZCaXRDaGFubmVscyAqIDI7CisgICAgaWYgKHNraXAgPiBJTlQzMl9NQVggLyBmcmFtZVNpemUgfHwgY3V0ID4gSU5UMzJfTUFYIC8gZnJhbWVTaXplCisgICAgICAgICAgICB8fCBjdXQgKiBmcmFtZVNpemUgPiBJTlQzMl9NQVggLSA0MDk2KSB7CisgICAgICAgIEFMT0dXKCJvdXQgb2YgcmFuZ2Ugc2tpcC9jdXQ6ICV6dS8lenUsIHVzaW5nIHBhc3N0aHJvdWdoIGluc3RlYWQiLAorICAgICAgICAgICAgICAgIHNraXAsIGN1dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2tpcCAqPSBmcmFtZVNpemU7CisgICAgY3V0ICo9IGZyYW1lU2l6ZTsKKworICAgIG1Gcm9udFBhZGRpbmcgPSBtU2tpcCA9IHNraXA7CisgICAgbUJhY2tQYWRkaW5nID0gY3V0OworICAgIG1DYXBhY2l0eSA9IGN1dCArIDQwOTY7CisgICAgbUN1dEJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBjaGFyW21DYXBhY2l0eV07CisgICAgQUxPR1YoInNraXBjdXRidWZmZXIgJXp1ICV6dSAlZCIsIHNraXAsIGN1dCwgbUNhcGFjaXR5KTsKK30KKworU2tpcEN1dEJ1ZmZlcjo6flNraXBDdXRCdWZmZXIoKSB7CisgICAgZGVsZXRlW10gbUN1dEJ1ZmZlcjsKK30KKwordm9pZCBTa2lwQ3V0QnVmZmVyOjpzdWJtaXQoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworICAgIGlmIChtQ3V0QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gcGFzc3Rocm91Z2ggbW9kZQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBvZmZzZXQgPSBidWZmZXItPnJhbmdlX29mZnNldCgpOworICAgIGludDMyX3QgYnVmbGVuID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKworICAgIC8vIGRyb3AgdGhlIGluaXRpYWwgZGF0YSBmcm9tIHRoZSBidWZmZXIgaWYgbmVlZGVkCisgICAgaWYgKG1Gcm9udFBhZGRpbmcgPiAwKSB7CisgICAgICAgIC8vIHN0aWxsIGRhdGEgbGVmdCB0byBkcm9wCisgICAgICAgIGludDMyX3QgdG9fZHJvcCA9IChidWZsZW4gPCBtRnJvbnRQYWRkaW5nKSA/IGJ1ZmxlbiA6IG1Gcm9udFBhZGRpbmc7CisgICAgICAgIG9mZnNldCArPSB0b19kcm9wOworICAgICAgICBidWZsZW4gLT0gdG9fZHJvcDsKKyAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2Uob2Zmc2V0LCBidWZsZW4pOworICAgICAgICBtRnJvbnRQYWRkaW5nIC09IHRvX2Ryb3A7CisgICAgfQorCisKKyAgICAvLyBhcHBlbmQgZGF0YSB0byBjdXRidWZmZXIKKyAgICBjaGFyICpzcmMgPSAoKGNoYXIqKSBidWZmZXItPmRhdGEoKSkgKyBvZmZzZXQ7CisgICAgd3JpdGUoc3JjLCBidWZsZW4pOworCisKKyAgICAvLyB0aGUgbWVkaWFidWZmZXIgaXMgbm93IGVtcHR5LiBGaWxsIGl0IGZyb20gY3V0YnVmZmVyLCBhbHdheXMgbGVhdmluZworICAgIC8vIGF0IGxlYXN0IG1CYWNrUGFkZGluZyBieXRlcyBpbiB0aGUgY3V0YnVmZmVyCisgICAgY2hhciAqZHN0ID0gKGNoYXIqKSBidWZmZXItPmRhdGEoKTsKKyAgICBzaXplX3QgY29waWVkID0gcmVhZChkc3QsIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBidWZmZXItPnNldF9yYW5nZSgwLCBjb3BpZWQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgU2tpcEN1dEJ1ZmZlcjo6c3VibWl0SW50ZXJuYWwoY29uc3Qgc3A8VD4mIGJ1ZmZlcikgeworICAgIGlmIChtQ3V0QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gcGFzc3Rocm91Z2ggbW9kZQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBvZmZzZXQgPSBidWZmZXItPm9mZnNldCgpOworICAgIGludDMyX3QgYnVmbGVuID0gYnVmZmVyLT5zaXplKCk7CisKKyAgICAvLyBkcm9wIHRoZSBpbml0aWFsIGRhdGEgZnJvbSB0aGUgYnVmZmVyIGlmIG5lZWRlZAorICAgIGlmIChtRnJvbnRQYWRkaW5nID4gMCkgeworICAgICAgICAvLyBzdGlsbCBkYXRhIGxlZnQgdG8gZHJvcAorICAgICAgICBpbnQzMl90IHRvX2Ryb3AgPSAoYnVmbGVuIDwgbUZyb250UGFkZGluZykgPyBidWZsZW4gOiBtRnJvbnRQYWRkaW5nOworICAgICAgICBvZmZzZXQgKz0gdG9fZHJvcDsKKyAgICAgICAgYnVmbGVuIC09IHRvX2Ryb3A7CisgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2Uob2Zmc2V0LCBidWZsZW4pOworICAgICAgICBtRnJvbnRQYWRkaW5nIC09IHRvX2Ryb3A7CisgICAgfQorCisKKyAgICAvLyBhcHBlbmQgZGF0YSB0byBjdXRidWZmZXIKKyAgICBjaGFyICpzcmMgPSAoY2hhciopIGJ1ZmZlci0+ZGF0YSgpOworICAgIHdyaXRlKHNyYywgYnVmbGVuKTsKKworCisgICAgLy8gdGhlIG1lZGlhYnVmZmVyIGlzIG5vdyBlbXB0eS4gRmlsbCBpdCBmcm9tIGN1dGJ1ZmZlciwgYWx3YXlzIGxlYXZpbmcKKyAgICAvLyBhdCBsZWFzdCBtQmFja1BhZGRpbmcgYnl0ZXMgaW4gdGhlIGN1dGJ1ZmZlcgorICAgIGNoYXIgKmRzdCA9IChjaGFyKikgYnVmZmVyLT5iYXNlKCk7CisgICAgc2l6ZV90IGNvcGllZCA9IHJlYWQoZHN0LCBidWZmZXItPmNhcGFjaXR5KCkpOworICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgY29waWVkKTsKK30KKwordm9pZCBTa2lwQ3V0QnVmZmVyOjpzdWJtaXQoY29uc3Qgc3A8QUJ1ZmZlcj4mIGJ1ZmZlcikgeworICAgIHN1Ym1pdEludGVybmFsKGJ1ZmZlcik7Cit9CisKK3ZvaWQgU2tpcEN1dEJ1ZmZlcjo6c3VibWl0KGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+JiBidWZmZXIpIHsKKyAgICBzdWJtaXRJbnRlcm5hbChidWZmZXIpOworfQorCit2b2lkIFNraXBDdXRCdWZmZXI6OmNsZWFyKCkgeworICAgIG1Xcml0ZUhlYWQgPSBtUmVhZEhlYWQgPSAwOworICAgIG1Gcm9udFBhZGRpbmcgPSBtU2tpcDsKK30KKwordm9pZCBTa2lwQ3V0QnVmZmVyOjp3cml0ZShjb25zdCBjaGFyICpzcmMsIHNpemVfdCBudW0pIHsKKyAgICBpbnQzMl90IHNpemV1c2VkID0gKG1Xcml0ZUhlYWQgLSBtUmVhZEhlYWQpOworICAgIGlmIChzaXpldXNlZCA8IDApIHNpemV1c2VkICs9IG1DYXBhY2l0eTsKKworICAgIC8vIEV2ZXJ5dGhpbmcgbXVzdCBmaXQuIE1ha2Ugc3VyZSB0aGUgYnVmZmVyIGlzIGEgbGl0dGxlIGxhcmdlciB0aGFuIG5lZWRlZCwKKyAgICAvLyBzbyB0aGVyZSBpcyBubyBhbWJpZ3VpdHkgYXMgdG8gd2hldGhlciBtV3JpdGVIZWFkID09IG1SZWFkSGVhZCBtZWFucyBidWZmZXIKKyAgICAvLyBmdWxsIG9yIGVtcHR5CisgICAgc2l6ZV90IGF2YWlsYWJsZSA9IG1DYXBhY2l0eSAtIHNpemV1c2VkIC0gMzI7CisgICAgaWYgKGF2YWlsYWJsZSA8IG51bSkgeworICAgICAgICBpbnQzMl90IG5ld2NhcGFjaXR5ID0gbUNhcGFjaXR5ICsgKG51bSAtIGF2YWlsYWJsZSk7CisgICAgICAgIGNoYXIgKiBuZXdidWZmZXIgPSBuZXcgY2hhcltuZXdjYXBhY2l0eV07CisgICAgICAgIG1lbWNweShuZXdidWZmZXIsIG1DdXRCdWZmZXIsIG1DYXBhY2l0eSk7CisgICAgICAgIGRlbGV0ZSBbXSBtQ3V0QnVmZmVyOworICAgICAgICBtQ2FwYWNpdHkgPSBuZXdjYXBhY2l0eTsKKyAgICAgICAgbUN1dEJ1ZmZlciA9IG5ld2J1ZmZlcjsKKyAgICAgICAgQUxPR1YoInJlYWxsb2NhdGVkIGJ1ZmZlciBhdCBzaXplICVkIiwgbmV3Y2FwYWNpdHkpOworICAgIH0KKworICAgIHNpemVfdCBjb3B5Zmlyc3QgPSAobUNhcGFjaXR5IC0gbVdyaXRlSGVhZCk7CisgICAgaWYgKGNvcHlmaXJzdCA+IG51bSkgY29weWZpcnN0ID0gbnVtOworICAgIGlmIChjb3B5Zmlyc3QpIHsKKyAgICAgICAgbWVtY3B5KG1DdXRCdWZmZXIgKyBtV3JpdGVIZWFkLCBzcmMsIGNvcHlmaXJzdCk7CisgICAgICAgIG51bSAtPSBjb3B5Zmlyc3Q7CisgICAgICAgIHNyYyArPSBjb3B5Zmlyc3Q7CisgICAgICAgIG1Xcml0ZUhlYWQgKz0gY29weWZpcnN0OworICAgICAgICBDSEVDS19MRShtV3JpdGVIZWFkLCBtQ2FwYWNpdHkpOworICAgICAgICBpZiAobVdyaXRlSGVhZCA9PSBtQ2FwYWNpdHkpIG1Xcml0ZUhlYWQgPSAwOworICAgICAgICBpZiAobnVtKSB7CisgICAgICAgICAgICBtZW1jcHkobUN1dEJ1ZmZlciwgc3JjLCBudW0pOworICAgICAgICAgICAgbVdyaXRlSGVhZCArPSBudW07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NpemVfdCBTa2lwQ3V0QnVmZmVyOjpyZWFkKGNoYXIgKmRzdCwgc2l6ZV90IG51bSkgeworICAgIGludDMyX3QgYXZhaWxhYmxlID0gKG1Xcml0ZUhlYWQgLSBtUmVhZEhlYWQpOworICAgIGlmIChhdmFpbGFibGUgPCAwKSBhdmFpbGFibGUgKz0gbUNhcGFjaXR5OworCisgICAgYXZhaWxhYmxlIC09IG1CYWNrUGFkZGluZzsKKyAgICBpZiAoYXZhaWxhYmxlIDw9MCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGF2YWlsYWJsZSA8IGludDMyX3QobnVtKSkgeworICAgICAgICBudW0gPSBhdmFpbGFibGU7CisgICAgfQorCisgICAgc2l6ZV90IGNvcHlmaXJzdCA9IChtQ2FwYWNpdHkgLSBtUmVhZEhlYWQpOworICAgIGlmIChjb3B5Zmlyc3QgPiBudW0pIGNvcHlmaXJzdCA9IG51bTsKKyAgICBpZiAoY29weWZpcnN0KSB7CisgICAgICAgIG1lbWNweShkc3QsIG1DdXRCdWZmZXIgKyBtUmVhZEhlYWQsIGNvcHlmaXJzdCk7CisgICAgICAgIG51bSAtPSBjb3B5Zmlyc3Q7CisgICAgICAgIGRzdCArPSBjb3B5Zmlyc3Q7CisgICAgICAgIG1SZWFkSGVhZCArPSBjb3B5Zmlyc3Q7CisgICAgICAgIENIRUNLX0xFKG1SZWFkSGVhZCwgbUNhcGFjaXR5KTsKKyAgICAgICAgaWYgKG1SZWFkSGVhZCA9PSBtQ2FwYWNpdHkpIG1SZWFkSGVhZCA9IDA7CisgICAgICAgIGlmIChudW0pIHsKKyAgICAgICAgICAgIG1lbWNweShkc3QsIG1DdXRCdWZmZXIsIG51bSk7CisgICAgICAgICAgICBtUmVhZEhlYWQgKz0gbnVtOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhdmFpbGFibGU7Cit9CisKK3NpemVfdCBTa2lwQ3V0QnVmZmVyOjpzaXplKCkgeworICAgIGludDMyX3QgYXZhaWxhYmxlID0gKG1Xcml0ZUhlYWQgLSBtUmVhZEhlYWQpOworICAgIGlmIChhdmFpbGFibGUgPCAwKSBhdmFpbGFibGUgKz0gbUNhcGFjaXR5OworICAgIHJldHVybiBhdmFpbGFibGU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vU2tpcEN1dEJ1ZmZlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1NraXBDdXRCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmI1NjkwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1NraXBDdXRCdWZmZXIuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTS0lQX0NVVF9CVUZGRVJfSF8KKworI2RlZmluZSBTS0lQX0NVVF9CVUZGRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogdXRpbGl0eSBjbGFzcyB0byBjdXQgdGhlIHN0YXJ0IGFuZCBlbmQgb2ZmIGEgc3RyZWFtIG9mIGRhdGEgaW4gTWVkaWFCdWZmZXJzCisgKgorICovCitjbGFzcyBTa2lwQ3V0QnVmZmVyOiBwdWJsaWMgUmVmQmFzZSB7CisgcHVibGljOgorICAgIC8vICdza2lwJyBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBza2lwIGZyb20gdGhlIGJlZ2lubmluZworICAgIC8vICdjdXQnIGlzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGN1dCBmcm9tIHRoZSBlbmQKKyAgICAvLyAnbnVtMTZCaXRDaGFubmVscycgaXMgdGhlIG51bWJlciBvZiBjaGFubmVscywgd2hpY2ggYXJlIGFzc3VtZWQgdG8gYmUgMTYgYml0IHdpZGUgZWFjaAorICAgIFNraXBDdXRCdWZmZXIoc2l6ZV90IHNraXAsIHNpemVfdCBjdXQsIHNpemVfdCBudW0xNkNoYW5uZWxzKTsKKworICAgIC8vIFN1Ym1pdCBvbmUgTWVkaWFCdWZmZXIgZm9yIHNraXBwaW5nIGFuZCBjdXR0aW5nLiBUaGlzIG1heSBjb25zdW1lIGFsbCBvcgorICAgIC8vIHNvbWUgb2YgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlciwgb3IgaXQgbWF5IGFkZCBkYXRhIHRvIGl0LgorICAgIC8vIEFmdGVyIHRoaXMsIHRoZSBjYWxsZXIgc2hvdWxkIGNvbnRpbnVlIHByb2Nlc3NpbmcgdGhlIGJ1ZmZlciBhcyB1c3VhbC4KKyAgICB2b2lkIHN1Ym1pdChNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKKyAgICB2b2lkIHN1Ym1pdChjb25zdCBzcDxBQnVmZmVyPiYgYnVmZmVyKTsgICAgLy8gc2FtZSBhcyBhYm92ZSwgYnV0IHdpdGggYW4gQUJ1ZmZlcgorICAgIHZvaWQgc3VibWl0KGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+JiBidWZmZXIpOyAgICAvLyBzYW1lIGFzIGFib3ZlLCBidXQgd2l0aCBhbiBBQnVmZmVyCisgICAgdm9pZCBjbGVhcigpOworICAgIHNpemVfdCBzaXplKCk7IC8vIGhvdyBtYW55IGJ5dGVzIGFyZSBjdXJyZW50bHkgc3RvcmVkIGluIHRoZSBidWZmZXIKKworIHByb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Ta2lwQ3V0QnVmZmVyKCk7CisKKyBwcml2YXRlOgorICAgIHZvaWQgd3JpdGUoY29uc3QgY2hhciAqc3JjLCBzaXplX3QgbnVtKTsKKyAgICBzaXplX3QgcmVhZChjaGFyICpkc3QsIHNpemVfdCBudW0pOworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHZvaWQgc3VibWl0SW50ZXJuYWwoY29uc3Qgc3A8VD4mIGJ1ZmZlcik7CisgICAgaW50MzJfdCBtU2tpcDsKKyAgICBpbnQzMl90IG1Gcm9udFBhZGRpbmc7CisgICAgaW50MzJfdCBtQmFja1BhZGRpbmc7CisgICAgaW50MzJfdCBtV3JpdGVIZWFkOworICAgIGludDMyX3QgbVJlYWRIZWFkOworICAgIGludDMyX3QgbUNhcGFjaXR5OworICAgIGNoYXIqIG1DdXRCdWZmZXI7CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2tpcEN1dEJ1ZmZlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE9NWF9DT0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTdmNTVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MiBAQAorY2NfdGVzdCB7CisgICAgbmFtZTogImNjb2RlY191bml0X3Rlc3QiLAorCisgICAgc3JjczogWworICAgICAgICAiUmVmbGVjdGVkUGFyYW1VcGRhdGVyX3Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2NvZGVjMi9zZnBsdWdpbiIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJtY19zYW5pdHlfdGVzdCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJNZWRpYUNvZGVjX3Nhbml0eV90ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4iLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL01lZGlhQ29kZWNfc2FuaXR5X3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL01lZGlhQ29kZWNfc2FuaXR5X3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzY4N2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvTWVkaWFDb2RlY19zYW5pdHlfdGVzdC5jcHAKQEAgLTAsMCArMSw0NTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhQ29kZWNTYW5pdHlUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgTWVkaWFDb2RlY1Nhbml0eVRlc3QoKQorICAgICAgICA6IGxvb3BlcihuZXcgQUxvb3BlciksCisgICAgICAgICAgY2ZnKG5ldyBBTWVzc2FnZSksCisgICAgICAgICAgaWZtdChuZXcgQU1lc3NhZ2UpLAorICAgICAgICAgIG9mbXQobmV3IEFNZXNzYWdlKSB7CisgICAgICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKyAgICAgICAgbG9vcGVyLT5zdGFydCgpOworICAgIH0KKworICAgIH5NZWRpYUNvZGVjU2FuaXR5VGVzdCgpIHsKKyAgICAgICAgaWYgKGNvZGVjICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvZGVjLT5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICAgICAgbG9vcGVyLT5zdG9wKCk7CisgICAgfQorCisgICAgc3A8QUxvb3Blcj4gbG9vcGVyOworICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjOworICAgIHNwPEFNZXNzYWdlPiBjZmc7CisgICAgc3A8QU1lc3NhZ2U+IGlmbXQ7CisgICAgc3A8QU1lc3NhZ2U+IG9mbXQ7Cit9OworCitjb25zdCBzdGF0aWMgc2l6ZV90IGtMaW5lYXJCdWZmZXJTaXplID0gMTA0ODU3NjsKKworLy8gZGF0YSBmb3IgYSBjb2RlYyBpbnB1dCBmcmFtZQorc3RydWN0IEZyYW1lRGF0YSB7CisgICAgY29uc3QgdWludDhfdCAqZGF0YTsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICB0ZW1wbGF0ZTxzaXplX3QgTj4KKyAgICBjb25zdGV4cHIgRnJhbWVEYXRhKGNvbnN0IHVpbnQ4X3QoJmRhdGFfKVtOXSkgOiBkYXRhKGRhdGFfKSwgc2l6ZShOKSB7IH0KK307CisKKy8vIG9uZSB5ZWxsb3cgZnJhbWUgb2YgMjQweDE4MCAoYWxiZWl0IDQ6NDo0KQorY29uc3QgdWludDhfdCBhdmNTdHJlYW1fQTFbXSA9IHsgLy8gSURSIGZyYW1lCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NywgMHg2NCwgMHgwMCwgMHgwZCwgMHhhYywgMHhkOSwgMHg0MSwgMHg0MSwgMHhmYSwgMHgxMCwgMHgwMCwgMHgwMCwKKyAgICAweDAzLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAzLCAweDAzLCAweDIwLCAweGYxLCAweDQyLCAweDk5LCAweDYwLAorCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2OCwgMHhlYiwgMHhlMywgMHhjYiwgMHgyMiwgMHhjMCwKKworICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4NjUsIDB4ODgsIDB4ODQsIDB4MDAsIDB4MmIsIDB4ZmYsIDB4ZmUsIDB4ZDgsIDB4ZTcsIDB4ZjMsIDB4MmMsIDB4YTUsIDB4NjAsCisgICAgMHhjYSwgMHhiYiwgMHhmMSwgMHg1YywgMHg0NCwgMHg3YywgMHg5YSwgMHhhNSwgMHhjMywgMHhhYiwgMHgyZiwgMHg3NywgMHgwYSwgMHg5NCwgMHgwZCwgMHgxOSwKKyAgICAweDQzLCAweDNiLCAweDRmLCAweDI1LCAweGVhLCAweDY2LCAweDAwLCAweDAxLCAweDI0LCAweGNkLCAweDM1LCAweDVmLCAweGMyLCAweDM0LCAweDg5LCAweGQxLAorICAgIDB4YTUsIDB4NjAsIDB4MDksIDB4OTgsIDB4MDAsIDB4MDEsIDB4MWIsIDB4MGUsIDB4Y2IsIDB4MGQsIDB4MDQsIDB4ODYsIDB4OTQsIDB4ZTIsIDB4MzIsIDB4M2MsCisgICAgMHhkZCwgMHgwZiwKK307CisKK0ZyYW1lRGF0YSBhdmNTdHJlYW1fQVtdIF9fdW51c2VkID0geyBhdmNTdHJlYW1fQTEgfTsKKworLy8gQVZDIHN0cmVhbSBvZiAyIHllbGxvdyBmcmFtZXMgKDI0MHgxODApCitjb25zdCB1aW50OF90IGF2Y1N0cmVhbV9CMVtdID0geyAvLyBJRFIgZnJhbWUKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDY3LCAweDY0LCAweDAwLCAweDBjLCAweGFjLCAweGQ5LCAweDQxLCAweDQxLCAweGZhLCAweDEwLCAweDAwLCAweDAwLAorICAgIDB4MDMsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDIsIDB4ODAsIDB4ZjEsIDB4NDIsIDB4OTksIDB4NjAsCisKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDY4LCAweGViLCAweGUzLCAweGNiLCAweDIyLCAweGMwLAorCisgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NSwgMHg4OCwgMHg4NCwgMHgwMCwgMHgzMywgMHhmZiwgMHhmZSwgMHhkZiwgMHgzMiwgMHhmOCwgMHgxNCwgMHhkNiwgMHgyNSwKKyAgICAweGQwLCAweDc0LCAweDQyLCAweDUwLCAweDg0LCAweDZmLCAweGY0LCAweGMyLCAweDVjLCAweDc2LCAweDM3LCAweDE3LCAweDcyLCAweGFjLCAweDUyLCAweGZjLAorICAgIDB4ZDYsIDB4MWYsIDB4ZDIsIDB4ZDAsIDB4NjAsIDB4YjIsIDB4MjAsIDB4MDAsIDB4MTAsIDB4M2QsIDB4MmEsIDB4YzAsIDB4ZTQsIDB4MjcsIDB4Y2IsIDB4Y2UsCisgICAgMHhlYSwgMHgyNSwgMHgwMCwgMHg4MSwgMHgwMCwgMHgwMCwgMHgwZiwgMHg0MCwgMHhiYywgMHg4MSwgMHgxNSwgMHhjMSwgMHg2NSwgMHgyMCwgMHg4MCwgMHg4MSwKKyAgICAweDdhLCAweDU3LCAweDUxLAorfTsKKworY29uc3QgdWludDhfdCBhdmNTdHJlYW1fQjJbXSA9IHsgLy8gUCBmcmFtZQorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NDEsIDB4OWEsIDB4MjEsIDB4NmMsIDB4NDIsIDB4YmYsIDB4ZmUsIDB4MzgsIDB4NDAsIDB4MDAsIDB4MGQsIDB4NDgsCit9OworCitGcmFtZURhdGEgYXZjU3RyZWFtX0JbXSA9IHsgYXZjU3RyZWFtX0IxLCBhdmNTdHJlYW1fQjIgfTsKKworY2xhc3MgTWVkaWFDb2RlY0lucHV0QnVmZmVyU2l6ZVRlc3QgOiBwdWJsaWMgTWVkaWFDb2RlY1Nhbml0eVRlc3QsCisgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxpbnQzMl90PiB7Cit9OworCitURVNUX1AoTWVkaWFDb2RlY0lucHV0QnVmZmVyU2l6ZVRlc3QsIFRlc3RBdmNEZWNvZGVyKSB7CisgICAgY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobG9vcGVyLCAiYzIuYW5kcm9pZC5hdmMuZGVjb2RlciIpOworICAgIGNmZy0+c2V0SW50MzIoIndpZHRoIiwgMzIwKTsKKyAgICBjZmctPnNldEludDMyKCJoZWlnaHQiLCAyNDApOworICAgIGNmZy0+c2V0U3RyaW5nKCJtaW1lIiwgTUlNRVRZUEVfVklERU9fQVZDKTsKKworICAgIGNvbnN0IGludDMyX3QgSW5wdXRTaXplID0gR2V0UGFyYW0oKTsKKyAgICBpZiAoSW5wdXRTaXplID49IDApIHsKKyAgICAgICAgY2ZnLT5zZXRJbnQzMigibWF4LWlucHV0LXNpemUiLCBJbnB1dFNpemUpOworICAgIH0KKworICAgIEVYUEVDVF9FUShjb2RlYy0+Y29uZmlndXJlKGNmZywgbnVsbHB0ciwgbnVsbHB0ciwgMCksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldElucHV0Rm9ybWF0KCZpZm10KSwgT0spOworICAgIGludDMyX3QgbWF4SW5wdXRTaXplOworICAgIEFTU0VSVF9UUlVFKGlmbXQtPmZpbmRJbnQzMigibWF4LWlucHV0LXNpemUiLCAmbWF4SW5wdXRTaXplKSk7CisgICAgaWYgKElucHV0U2l6ZSA+IDApIHsKKyAgICAgICAgRVhQRUNUX0VRKG1heElucHV0U2l6ZSwgSW5wdXRTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBFWFBFQ1RfR0UobWF4SW5wdXRTaXplLCAxIDw8IDIwKTsgLy8gMSBNQgorICAgIH0KKyAgICBFWFBFQ1RfRVEoY29kZWMtPnN0YXJ0KCksICBPSyk7CisgICAgc2l6ZV90IGl4OworICAgIEVYUEVDVF9FUShjb2RlYy0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZpeCwgMTAwMDAwMCksIE9LKTsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWY7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5nZXRJbnB1dEJ1ZmZlcihpeCwgJmJ1ZiksICBPSyk7CisgICAgRVhQRUNUX0dFKGJ1Zi0+c2l6ZSgpLCAoc2l6ZV90KW1heElucHV0U2l6ZSk7CisgICAgRVhQRUNUX0xFKGJ1Zi0+c2l6ZSgpLCAoc2l6ZV90KW1heElucHV0U2l6ZSArIDQwOTZ1KTsKK30KKworVEVTVF9QKE1lZGlhQ29kZWNJbnB1dEJ1ZmZlclNpemVUZXN0LCBUZXN0VmlkZW9EZWNvZGVyKSB7CisgICAgY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobG9vcGVyLCAiYzIuYW5kcm9pZC52cDguZGVjb2RlciIpOworICAgIGNmZy0+c2V0SW50MzIoIndpZHRoIiwgMzIwKTsKKyAgICBjZmctPnNldEludDMyKCJoZWlnaHQiLCAyNDApOworICAgIGNmZy0+c2V0U3RyaW5nKCJtaW1lIiwgTUlNRVRZUEVfVklERU9fVlA4KTsKKworICAgIGNvbnN0IGludDMyX3QgSW5wdXRTaXplID0gR2V0UGFyYW0oKTsKKyAgICBpZiAoSW5wdXRTaXplID49IDApIHsKKyAgICAgICAgY2ZnLT5zZXRJbnQzMigibWF4LWlucHV0LXNpemUiLCBJbnB1dFNpemUpOworICAgIH0KKworICAgIEVYUEVDVF9FUShjb2RlYy0+Y29uZmlndXJlKGNmZywgbnVsbHB0ciwgbnVsbHB0ciwgMCksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldElucHV0Rm9ybWF0KCZpZm10KSwgT0spOworICAgIGludDMyX3QgbWF4SW5wdXRTaXplOworICAgIEFTU0VSVF9UUlVFKGlmbXQtPmZpbmRJbnQzMigibWF4LWlucHV0LXNpemUiLCAmbWF4SW5wdXRTaXplKSk7CisgICAgaWYgKElucHV0U2l6ZSA+IDApIHsKKyAgICAgICAgRVhQRUNUX0VRKG1heElucHV0U2l6ZSwgSW5wdXRTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBFWFBFQ1RfR0UobWF4SW5wdXRTaXplLCAxIDw8IDIwKTsgLy8gMSBNQgorICAgIH0KKyAgICBFWFBFQ1RfRVEoY29kZWMtPnN0YXJ0KCksICBPSyk7CisgICAgc2l6ZV90IGl4OworICAgIEVYUEVDVF9FUShjb2RlYy0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZpeCwgMTAwMDAwMCksIE9LKTsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWY7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5nZXRJbnB1dEJ1ZmZlcihpeCwgJmJ1ZiksICBPSyk7CisgICAgRVhQRUNUX0dFKGJ1Zi0+c2l6ZSgpLCAoc2l6ZV90KW1heElucHV0U2l6ZSk7CisgICAgRVhQRUNUX0xFKGJ1Zi0+c2l6ZSgpLCAoc2l6ZV90KW1heElucHV0U2l6ZSArIDQwOTZ1KTsKK30KKworVEVTVF9QKE1lZGlhQ29kZWNJbnB1dEJ1ZmZlclNpemVUZXN0LCBUZXN0QXVkaW9EZWNvZGVyKSB7CisgICAgY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobG9vcGVyLCAiYzIuYW5kcm9pZC5hYWMuZGVjb2RlciIpOworICAgIGNmZy0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgNDQxMDApOworICAgIGNmZy0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCAyKTsKKyAgICBjZmctPnNldFN0cmluZygibWltZSIsIE1JTUVUWVBFX0FVRElPX0FBQyk7CisKKyAgICBjb25zdCBpbnQzMl90IElucHV0U2l6ZSA9IEdldFBhcmFtKCk7CisgICAgaWYgKElucHV0U2l6ZSA+PSAwKSB7CisgICAgICAgIGNmZy0+c2V0SW50MzIoIm1heC1pbnB1dC1zaXplIiwgSW5wdXRTaXplKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmNvbmZpZ3VyZShjZmcsIG51bGxwdHIsIG51bGxwdHIsIDApLCBPSyk7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5nZXRJbnB1dEZvcm1hdCgmaWZtdCksIE9LKTsKKyAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKKyAgICBpZiAoSW5wdXRTaXplID4gMCkgeworICAgICAgICBBU1NFUlRfVFJVRShpZm10LT5maW5kSW50MzIoIm1heC1pbnB1dC1zaXplIiwgJm1heElucHV0U2l6ZSkpOworICAgICAgICBFWFBFQ1RfRVEobWF4SW5wdXRTaXplLCBJbnB1dFNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpZm10LT5maW5kSW50MzIoIm1heC1pbnB1dC1zaXplIiwgJm1heElucHV0U2l6ZSkpIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUShtYXhJbnB1dFNpemUsIDEgPDwgMTkpOyAvLyA1MTIgS0IKKyAgICAgICAgfQorICAgICAgICBtYXhJbnB1dFNpemUgPSBrTGluZWFyQnVmZmVyU2l6ZTsgLy8gaW5wdXQgc2l6ZSBpcyBzZXQgYnkgY2hhbm5lbAorICAgIH0KKworICAgIEVYUEVDVF9FUShjb2RlYy0+c3RhcnQoKSwgIE9LKTsKKyAgICBzaXplX3QgaXg7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJml4LCAxMDAwMDAwKSwgT0spOworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZjsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldElucHV0QnVmZmVyKGl4LCAmYnVmKSwgIE9LKTsKKyAgICBFWFBFQ1RfR0UoYnVmLT5zaXplKCksIChzaXplX3QpbWF4SW5wdXRTaXplKTsKKyAgICBFWFBFQ1RfTEUoYnVmLT5zaXplKCksIChzaXplX3QpbWF4SW5wdXRTaXplICsgNDA5NnUpOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChJbnB1dFNpemVzLCBNZWRpYUNvZGVjSW5wdXRCdWZmZXJTaXplVGVzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoLTEsIDEyMzQsIDEyMzQ1Njc4KSk7CisKK1RFU1RfRihNZWRpYUNvZGVjU2FuaXR5VGVzdCwgVGVzdEF2Y0RlY29kZXJIZHJTdGF0aWNJbmZvKSB7CisgICAgY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobG9vcGVyLCAiYzIuYW5kcm9pZC5hdmMuZGVjb2RlciIpOworICAgIGNmZy0+c2V0SW50MzIoIndpZHRoIiwgMzIwKTsKKyAgICBjZmctPnNldEludDMyKCJoZWlnaHQiLCAyNDApOworICAgIGNmZy0+c2V0U3RyaW5nKCJtaW1lIiwgTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBIRFJTdGF0aWNJbmZvIGluZm8gPSB7IC5tSUQgPSBIRFJTdGF0aWNJbmZvOjprVHlwZTEsIC5zVHlwZTEgPSB7CisgICAgICAgIC5tUiA9IHsgLnggPSAzNTQwMCwgLnkgPSAxNDYwMCB9LCAubUcgPSB7IC54ID0gODUwMCwgIC55ID0gMzk4NTAgfSwKKyAgICAgICAgLm1CID0geyAueCA9IDY1NTAsICAueSA9ICAyMzAwIH0sIC5tVyA9IHsgLnggPSAxNTYzNSwgLnkgPSAxNjQ1MCB9LAorICAgICAgICAubU1heERpc3BsYXlMdW1pbmFuY2UgPSAxMDAwLCAubU1pbkRpc3BsYXlMdW1pbmFuY2UgPSAxMDAwLAorICAgICAgICAubU1heENvbnRlbnRMaWdodExldmVsID0gMTAwMCwgLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID0gMTIwIH0KKyAgICB9OworICAgIGNmZy0+c2V0QnVmZmVyKCJoZHItc3RhdGljLWluZm8iLCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoJmluZm8sIHNpemVvZihpbmZvKSkpOworCisgICAgRVhQRUNUX0VRKGNvZGVjLT5jb25maWd1cmUoY2ZnLCBudWxscHRyLCBudWxscHRyLCAwKSwgT0spOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KCZvZm10KSwgT0spOworICAgIHNwPEFCdWZmZXI+IG9pbmZvOworICAgIEFTU0VSVF9UUlVFKG9mbXQtPmZpbmRCdWZmZXIoImhkci1zdGF0aWMtaW5mbyIsICZvaW5mbykpOworICAgIEFTU0VSVF9FUShvaW5mby0+c2l6ZSgpLCBzaXplb2YoaW5mbykpOworICAgIEVYUEVDVF9FUShtZW1jbXAob2luZm8tPmRhdGEoKSwgJmluZm8sIHNpemVvZihpbmZvKSksICAwKTsKKworICAgIEVYUEVDVF9FUShjb2RlYy0+c3RhcnQoKSwgIE9LKTsKKyAgICAvLyBhc3N1bWUgd2UgY2FuIHN1Ym1pdCBhbGwgaW5wdXQgYmVmb3JlIGRlcXVldWluZyBvdXRwdXQKKyAgICBzaXplX3QgZnJhbWVJeCA9IDA7CisgICAgc2l6ZV90IGl4OworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZjsKKyAgICBmb3IgKGNvbnN0IEZyYW1lRGF0YSAmZnJhbWUgOiBhdmNTdHJlYW1fQikgeworICAgICAgICBFWFBFQ1RfRVEoY29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaXgsIDEwMDAwMDApLCBPSyk7CisgICAgICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0SW5wdXRCdWZmZXIoaXgsICZidWYpLCAgT0spOworICAgICAgICBBU1NFUlRfR0UoYnVmLT5jYXBhY2l0eSgpLCBmcmFtZS5zaXplKTsKKyAgICAgICAgbWVtY3B5KGJ1Zi0+YmFzZSgpLCBmcmFtZS5kYXRhLCBmcmFtZS5zaXplKTsKKyAgICAgICAgRVhQRUNUX0VRKGJ1Zi0+c2V0UmFuZ2UoMCwgZnJhbWUuc2l6ZSksIE9LKTsKKyAgICAgICAgYm9vbCBlb3MgPSArK2ZyYW1lSXggPT0gTkVMRU0oYXZjU3RyZWFtX0IpOworICAgICAgICBFWFBFQ1RfRVEoY29kZWMtPnF1ZXVlSW5wdXRCdWZmZXIoaXgsIDAsIGZyYW1lLnNpemUsIGZyYW1lSXggKiAzMzMzMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVvcyA/IEJVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU0gOiAwKSwgIE9LKTsKKyAgICB9CisKKyAgICBzaXplX3Qgb2Zmc2V0LCBzaXplOworICAgIGludDY0X3QgdHM7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgYm9vbCBtSW5mb0Zvcm1hdENoYW5nZWRPayA9IHRydWU7CisgICAgYm9vbCBtSW5mb0J1ZmZlcnNDaGFuZ2VkT2sgPSB0cnVlOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IGNvZGVjLT5kZXF1ZXVlT3V0cHV0QnVmZmVyKCZpeCwgJm9mZnNldCwgJnNpemUsICZ0cywgJmZsYWdzLCAxMDAwMDAwKTsKKyAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEICYmIG1JbmZvRm9ybWF0Q2hhbmdlZE9rKSB7CisgICAgICAgICAgICBtSW5mb0Zvcm1hdENoYW5nZWRPayA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQgJiYgbUluZm9CdWZmZXJzQ2hhbmdlZE9rKSB7CisgICAgICAgICAgICBtSW5mb0J1ZmZlcnNDaGFuZ2VkT2sgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVF9FUShlcnIsIE9LKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0T3V0cHV0QnVmZmVyKGl4LCAmYnVmKSwgT0spOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KGl4LCAmb2ZtdCksIE9LKTsKKyAgICBBU1NFUlRfVFJVRShvZm10LT5maW5kQnVmZmVyKCJoZHItc3RhdGljLWluZm8iLCAmb2luZm8pKTsKKyAgICBBU1NFUlRfRVEob2luZm8tPnNpemUoKSwgc2l6ZW9mKGluZm8pKTsKKyAgICBFWFBFQ1RfRVEobWVtY21wKG9pbmZvLT5kYXRhKCksICZpbmZvLCBzaXplb2YoaW5mbykpLCAgMCk7Cit9CisKK1RFU1RfRihNZWRpYUNvZGVjU2FuaXR5VGVzdCwgVGVzdFZpZGVvRGVjb2RlckhkclN0YXRpY0luZm8pIHsKKyAgICBjb2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZShsb29wZXIsICJjMi5hbmRyb2lkLm1wZWc0LmRlY29kZXIiKTsKKyAgICBjZmctPnNldEludDMyKCJ3aWR0aCIsIDMyMCk7CisgICAgY2ZnLT5zZXRJbnQzMigiaGVpZ2h0IiwgMjQwKTsKKyAgICBjZmctPnNldFN0cmluZygibWltZSIsIE1JTUVUWVBFX1ZJREVPX01QRUc0KTsKKyAgICBIRFJTdGF0aWNJbmZvIGluZm8gPSB7IC5tSUQgPSBIRFJTdGF0aWNJbmZvOjprVHlwZTEsIC5zVHlwZTEgPSB7CisgICAgICAgIC5tUiA9IHsgLnggPSAzNTQwMCwgLnkgPSAxNDYwMCB9LCAubUcgPSB7IC54ID0gODUwMCwgIC55ID0gMzk4NTAgfSwKKyAgICAgICAgLm1CID0geyAueCA9IDY1NTAsICAueSA9ICAyMzAwIH0sIC5tVyA9IHsgLnggPSAxNTYzNSwgLnkgPSAxNjQ1MCB9LAorICAgICAgICAubU1heERpc3BsYXlMdW1pbmFuY2UgPSAxMDAwLCAubU1pbkRpc3BsYXlMdW1pbmFuY2UgPSAxMDAwLAorICAgICAgICAubU1heENvbnRlbnRMaWdodExldmVsID0gMTAwMCwgLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID0gMTIwIH0KKyAgICB9OworICAgIGNmZy0+c2V0QnVmZmVyKCJoZHItc3RhdGljLWluZm8iLCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoJmluZm8sIHNpemVvZihpbmZvKSkpOworCisgICAgRVhQRUNUX0VRKGNvZGVjLT5jb25maWd1cmUoY2ZnLCBudWxscHRyLCBudWxscHRyLCAwKSwgT0spOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KCZvZm10KSwgT0spOworICAgIHNwPEFCdWZmZXI+IG9pbmZvOworICAgIEFTU0VSVF9UUlVFKG9mbXQtPmZpbmRCdWZmZXIoImhkci1zdGF0aWMtaW5mbyIsICZvaW5mbykpOworICAgIEFTU0VSVF9FUShvaW5mby0+c2l6ZSgpLCBzaXplb2YoaW5mbykpOworICAgIEVYUEVDVF9FUShtZW1jbXAob2luZm8tPmRhdGEoKSwgJmluZm8sIHNpemVvZihpbmZvKSksICAwKTsKK30KKworY2xhc3MgTWVkaWFDb2RlY0J5dGVCdWZmZXJUZXN0IDogcHVibGljIE1lZGlhQ29kZWNTYW5pdHlUZXN0LAorICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8aW50MzJfdD4geworfTsKKworVEVTVF9QKE1lZGlhQ29kZWNCeXRlQnVmZmVyVGVzdCwgVGVzdFZpZGVvRGVjb2RlcjQyMFBsYW5hcikgeworICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiKTsKKy8vICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgIk9NWC5nb29nbGUuaDI2NC5kZWNvZGVyIik7CisgICAgY2ZnLT5zZXRJbnQzMigid2lkdGgiLCAzMjApOworICAgIGNmZy0+c2V0SW50MzIoImhlaWdodCIsIDI0MCk7CisgICAgY2ZnLT5zZXRTdHJpbmcoIm1pbWUiLCBNSU1FVFlQRV9WSURFT19BVkMpOworICAgIGNvbnN0IGludDMyX3QgQ29sb3IgPSBHZXRQYXJhbSgpOworICAgIGlmIChDb2xvciA+PSAwKSB7CisgICAgICAgIGNmZy0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIENvbG9yKTsKKyAgICB9CisgICAgaW50MzJfdCB4Y29sb3IgPSBDb2xvciA9PSAtMSA/IENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciA6IENvbG9yOworCisgICAgRVhQRUNUX0VRKGNvZGVjLT5jb25maWd1cmUoY2ZnLCBudWxscHRyLCBudWxscHRyLCAwKSwgT0spOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KCZvZm10KSwgT0spOworICAgIGludDMyX3Qgb2NvbG9yID0gLTE7CisgICAgRVhQRUNUX1RSVUUob2ZtdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmb2NvbG9yKSk7CisgICAgRVhQRUNUX0VRKG9jb2xvciwgeGNvbG9yKTsKKworICAgIEVYUEVDVF9FUShjb2RlYy0+c3RhcnQoKSwgIE9LKTsKKyAgICAvLyBhc3N1bWUgd2UgY2FuIHN1Ym1pdCBhbGwgaW5wdXQgYmVmb3JlIGRlcXVldWluZyBvdXRwdXQKKyAgICBzaXplX3QgZnJhbWVJeCA9IDA7CisgICAgc2l6ZV90IGl4OworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZjsKKyAgICBmb3IgKGNvbnN0IEZyYW1lRGF0YSAmZnJhbWUgOiBhdmNTdHJlYW1fQSkgeworICAgICAgICBFWFBFQ1RfRVEoY29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaXgsIDEwMDAwMDApLCBPSyk7CisgICAgICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0SW5wdXRCdWZmZXIoaXgsICZidWYpLCAgT0spOworICAgICAgICBBU1NFUlRfR0UoYnVmLT5jYXBhY2l0eSgpLCBmcmFtZS5zaXplKTsKKyAgICAgICAgbWVtY3B5KGJ1Zi0+YmFzZSgpLCBmcmFtZS5kYXRhLCBmcmFtZS5zaXplKTsKKyAgICAgICAgRVhQRUNUX0VRKGJ1Zi0+c2V0UmFuZ2UoMCwgZnJhbWUuc2l6ZSksIE9LKTsKKyAgICAgICAgYm9vbCBlb3MgPSArK2ZyYW1lSXggPT0gTkVMRU0oYXZjU3RyZWFtX0EpOworICAgICAgICBFWFBFQ1RfRVEoY29kZWMtPnF1ZXVlSW5wdXRCdWZmZXIoaXgsIDAsIGZyYW1lLnNpemUsIGZyYW1lSXggKiAzMzMzMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVvcyA/IEJVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU0gOiAwKSwgIE9LKTsKKyAgICB9CisKKyAgICBzaXplX3Qgb2Zmc2V0LCBzaXplOworICAgIGludDY0X3QgdHM7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgYm9vbCBtSW5mb0Zvcm1hdENoYW5nZWRPayA9IHRydWU7CisgICAgYm9vbCBtSW5mb0J1ZmZlcnNDaGFuZ2VkT2sgPSB0cnVlOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IGNvZGVjLT5kZXF1ZXVlT3V0cHV0QnVmZmVyKCZpeCwgJm9mZnNldCwgJnNpemUsICZ0cywgJmZsYWdzLCAxMDAwMDAwKTsKKyAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEICYmIG1JbmZvRm9ybWF0Q2hhbmdlZE9rKSB7CisgICAgICAgICAgICBtSW5mb0Zvcm1hdENoYW5nZWRPayA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQgJiYgbUluZm9CdWZmZXJzQ2hhbmdlZE9rKSB7CisgICAgICAgICAgICBtSW5mb0J1ZmZlcnNDaGFuZ2VkT2sgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVF9FUShlcnIsIE9LKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0T3V0cHV0QnVmZmVyKGl4LCAmYnVmKSwgT0spOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KGl4LCAmb2ZtdCksIE9LKTsKKyAgICBBU1NFUlRfVFJVRShvZm10LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZvY29sb3IpKTsKKyAgICBFWFBFQ1RfRVEob2NvbG9yLCB4Y29sb3IpIDw8IG9mbXQtPmRlYnVnU3RyaW5nKDgpLmNfc3RyKCkgPDwgYnVmLT5tZXRhKCktPmRlYnVnU3RyaW5nKDgpLmNfc3RyKCk7CisgICAgLy8gZXhwZWN0IGFuIGltYWdlLWRhdGEgaW4gYm90aCBmb3JtYXQgYW5kIG1ldGEKKyAgICBzcDxBQnVmZmVyPiBpbWdCdWYsIGltZ0J1ZjI7CisgICAgQVNTRVJUX1RSVUUob2ZtdC0+ZmluZEJ1ZmZlcigiaW1hZ2UtZGF0YSIsICZpbWdCdWYpKTsKKyAgICBBU1NFUlRfVFJVRShidWYtPm1ldGEoKS0+ZmluZEJ1ZmZlcigiaW1hZ2UtZGF0YSIsICZpbWdCdWYyKSk7CisgICAgRVhQRUNUX0VRKGltZ0J1Zi0+c2l6ZSgpLCBzaXplb2YoTWVkaWFJbWFnZTIpKTsKKyAgICBBU1NFUlRfRVEoaW1nQnVmLT5zaXplKCksIGltZ0J1ZjItPnNpemUoKSk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChpbWdCdWYtPmRhdGEoKSwgaW1nQnVmMi0+ZGF0YSgpLCBpbWdCdWYtPnNpemUoKSkpOworICAgIE1lZGlhSW1hZ2UyICppbWcgPSAoTWVkaWFJbWFnZTIqKWltZ0J1Zi0+ZGF0YSgpOworICAgIEVYUEVDVF9FUShpbWctPm1UeXBlLCBpbWctPk1FRElBX0lNQUdFX1RZUEVfWVVWKTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tTnVtUGxhbmVzLCAzdSk7CisgICAgRVhQRUNUX0VRKGltZy0+bVdpZHRoLCAzMjB1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tSGVpZ2h0LCAyNDB1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tQml0RGVwdGgsIDh1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tQml0RGVwdGhBbGxvY2F0ZWQsIDh1KTsKKworICAgIC8vIHJlYWQgc3RyaWRlcyBmcm9tIGZvcm1hdAorICAgIGludDMyX3Qgc3RyaWRlLCB2c3RyaWRlOworICAgIG9mbXQtPmZpbmRJbnQzMigic3RyaWRlIiwgJnN0cmlkZSkgICAgICAgICAgfHwgb2ZtdC0+ZmluZEludDMyKCJ3aWR0aCIsICZzdHJpZGUpOworICAgIG9mbXQtPmZpbmRJbnQzMigic2xpY2UtaGVpZ2h0IiwgJnZzdHJpZGUpICAgfHwgb2ZtdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmdnN0cmlkZSk7CisKKyAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tSG9yaXpTdWJzYW1wbGluZywgMXUpOworICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlldLm1WZXJ0U3Vic2FtcGxpbmcsIDF1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5VXS5tSG9yaXpTdWJzYW1wbGluZywgMnUpOworICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlVdLm1WZXJ0U3Vic2FtcGxpbmcsIDJ1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5WXS5tSG9yaXpTdWJzYW1wbGluZywgMnUpOworICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1WZXJ0U3Vic2FtcGxpbmcsIDJ1KTsKKworICAgIHN3aXRjaCAoeGNvbG9yKSB7CisgICAgICAgIC8vIGRlZmluZWQgZm9ybWF0cworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXI6CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tT2Zmc2V0LCAwdSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tQ29sSW5jLCAxKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlldLm1Sb3dJbmMsIHN0cmlkZSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlVdLm1PZmZzZXQsICh1aW50MzJfdCkoc3RyaWRlICogdnN0cmlkZSkpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+VV0ubUNvbEluYywgMSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5VXS5tUm93SW5jLCBzdHJpZGUgLyAyKTsKKworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+Vl0ubU9mZnNldCwgKHVpbnQzMl90KShzdHJpZGUgKiB2c3RyaWRlICogNSAvIDQpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1Db2xJbmMsIDEpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+Vl0ubVJvd0luYywgc3RyaWRlIC8gMik7CisKKyAgICAgICAgICAgIEVYUEVDVF9HRShzaXplLCAoc2l6ZV90KShzdHJpZGUgKiB2c3RyaWRlICogNSAvIDQgKyBzdHJpZGUgLyAyICogMTE5ICsgMTYwKSk7CisgICAgICAgICAgICBFWFBFQ1RfTEUoc2l6ZSwgKHNpemVfdCkoc3RyaWRlICogdnN0cmlkZSAqIDMgLyAyKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlldLm1PZmZzZXQsIDB1KTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlldLm1Db2xJbmMsIDEpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+WV0ubVJvd0luYywgc3RyaWRlKTsKKworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+VV0ubU9mZnNldCwgKHVpbnQzMl90KShzdHJpZGUgKiB2c3RyaWRlKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5VXS5tQ29sSW5jLCAyKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlVdLm1Sb3dJbmMsIHN0cmlkZSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1PZmZzZXQsICh1aW50MzJfdCkoc3RyaWRlICogdnN0cmlkZSArIDEpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1Db2xJbmMsIDIpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+Vl0ubVJvd0luYywgc3RyaWRlKTsKKworICAgICAgICAgICAgRVhQRUNUX0dFKHNpemUsIChzaXplX3QpKHN0cmlkZSAqIHZzdHJpZGUgKyBzdHJpZGUgKiAxMTkgKyAzMjApKTsKKyAgICAgICAgICAgIEVYUEVDVF9MRShzaXplLCAoc2l6ZV90KShzdHJpZGUgKiB2c3RyaWRlICogMyAvIDIpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU6CisgICAgICAgICAgICAvLyBhbnl0aGluZyBnb2VzLCBidXQgc3RyaWRlIHNob3VsZCBtYXRjaCBZIHBsYW5lCisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tUm93SW5jLCBzdHJpZGUpOworCisgICAgICAgICAgICBFWFBFQ1RfR0Uoc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heCh7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5tUGxhbmVbaW1nLT5ZXS5tT2Zmc2V0ICsgMjM5ICogaW1nLT5tUGxhbmVbaW1nLT5ZXS5tUm93SW5jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDMxOSAqIGltZy0+bVBsYW5lW2ltZy0+WV0ubUNvbEluYyArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5tUGxhbmVbaW1nLT5VXS5tT2Zmc2V0ICsgMTE5ICogaW1nLT5tUGxhbmVbaW1nLT5VXS5tUm93SW5jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDE1OSAqIGltZy0+bVBsYW5lW2ltZy0+VV0ubUNvbEluYyArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5tUGxhbmVbaW1nLT5WXS5tT2Zmc2V0ICsgMTE5ICogaW1nLT5tUGxhbmVbaW1nLT5WXS5tUm93SW5jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDE1OSAqIGltZy0+bVBsYW5lW2ltZy0+Vl0ubUNvbEluYyArIDEgfSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIHZhbGlkYXRlIGFsbCBwaXhlbHMKKyNpZiAwCisgICAgZnByaW50ZihzdGRlcnIsICJNZWRpYUltYWdlIHsgRigldXgldSkgQCV1KyVkKyVkIEAldSslZCslZCBAJXUrJWQrJWQgfVxuIiwKKyAgICAgICAgICAgIGltZy0+bVdpZHRoLCBpbWctPm1IZWlnaHQsCisgICAgICAgICAgICBpbWctPm1QbGFuZVswXS5tT2Zmc2V0LCBpbWctPm1QbGFuZVswXS5tQ29sSW5jLCBpbWctPm1QbGFuZVswXS5tUm93SW5jLAorICAgICAgICAgICAgaW1nLT5tUGxhbmVbMV0ubU9mZnNldCwgaW1nLT5tUGxhbmVbMV0ubUNvbEluYywgaW1nLT5tUGxhbmVbMV0ubVJvd0luYywKKyAgICAgICAgICAgIGltZy0+bVBsYW5lWzJdLm1PZmZzZXQsIGltZy0+bVBsYW5lWzJdLm1Db2xJbmMsIGltZy0+bVBsYW5lWzJdLm1Sb3dJbmMpOworI2VuZGlmCisgICAgZm9yIChpeCA9IDA7IGl4IDwgMzsgKytpeCkgeworICAgICAgICBjb25zdCBzdGF0aWMgdWludDhfdCBleHBlY3RlZFtdID0geyAyMTAsIDE2LCAxNDYgfTsKKyAgICAgICAgZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IGltZy0+bUhlaWdodCAvIGltZy0+bVBsYW5lW2l4XS5tVmVydFN1YnNhbXBsaW5nIDsgKyt5KSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgaW1nLT5tV2lkdGggLyBpbWctPm1QbGFuZVtpeF0ubUhvcml6U3Vic2FtcGxpbmc7ICsreCkgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdmFsID0gYnVmLT5kYXRhKClbaW1nLT5tUGxhbmVbaXhdLm1PZmZzZXQgKyBpbWctPm1QbGFuZVtpeF0ubUNvbEluYyAqIHgKKyAgICAgICAgICAgICAgICAgICAgICAgICsgaW1nLT5tUGxhbmVbaXhdLm1Sb3dJbmMgKiB5XTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEodmFsLCBleHBlY3RlZFtpeF0pIDw8ICJpbmNvcnJlY3QgdmFsdWUgZm9yIHBsYW5lICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGl4IDw8ICIgYXQgeD0iIDw8IHggPDwgIiwgeT0iIDw8IHk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKElucHV0U2l6ZXMsIE1lZGlhQ29kZWNCeXRlQnVmZmVyVGVzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgIC0xLAorICAgICAgICBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIsCisgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIsCisgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hciwKKyAgICAgICAgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hciwKKyAgICAgICAgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUpKTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL1JlZmxlY3RlZFBhcmFtVXBkYXRlcl90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkYjBlMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXJfdGVzdC5jcHAKQEAgLTAsMCArMSwzNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fCisKKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8QzJQYXJhbURlZi5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8UmVmbGVjdGVkUGFyYW1VcGRhdGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworZW51bSB7CisgICAga1BhcmFtSW5kZXhUZXN0U3RhcnQgPSAweDEwMDAsCisgICAga1BhcmFtSW5kZXhJbnQsCisgICAga1BhcmFtSW5kZXhTdHJpbmcsCisgICAga1BhcmFtSW5kZXhDb21wb3NpdGUsCisgICAga1BhcmFtSW5kZXhGbGV4U3RyaW5nLAorCisgICAga1BhcmFtSW5kZXhMb25nID0gQzJQYXJhbTo6VFlQRV9JTkRFWF9WRU5ET1JfU1RBUlQsCit9OworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkludDMyVmFsdWUsIGtQYXJhbUluZGV4SW50PiBDMkludEluZm87Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkludDY0VmFsdWUsIGtQYXJhbUluZGV4TG9uZz4gQzJMb25nSW5mbzsKKworc3RydWN0IEMyRml4ZWRTaXplU3RyaW5nU3RydWN0IHsKKyAgICBjaGFyIHZhbHVlWzEyXTsKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9DMlNUUlVDVChGaXhlZFNpemVTdHJpbmcpCisgICAgQzJGSUVMRCh2YWx1ZSwgInZhbHVlIikKK307Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkZpeGVkU2l6ZVN0cmluZ1N0cnVjdCwga1BhcmFtSW5kZXhTdHJpbmc+IEMyU3RyaW5nSW5mbzsKKworc3RydWN0IEMyQ29tcG9zaXRlU3RydWN0IHsKKyAgICBpbnQzMl90IGkzMjsKKyAgICB1aW50NjRfdCB1NjQ7CisgICAgY2hhciBzdHJbMTJdOworICAgIHVpbnQ4X3QgYmxvYls4XTsKKyAgICB1aW50OF90IGZsZXhCbG9iW107CisKKyAgICBDMkNvbXBvc2l0ZVN0cnVjdCgpID0gZGVmYXVsdDsKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9GTEVYX0MyU1RSVUNUKENvbXBvc2l0ZSwgZmxleEJsb2IpCisgICAgQzJGSUVMRChpMzIsICJpMzIiKQorICAgIEMyRklFTEQodTY0LCAidTY0IikKKyAgICBDMkZJRUxEKHN0ciwgInN0ciIpCisgICAgQzJGSUVMRChibG9iLCAiYmxvYiIpCisgICAgQzJGSUVMRChmbGV4QmxvYiwgImZsZXgtYmxvYiIpCit9Oworc3RhdGljX2Fzc2VydChDMkNvbXBvc2l0ZVN0cnVjdDo6RkxFWF9TSVpFID09IDEsICIiKTsKK3N0YXRpY19hc3NlcnQoX0MyRmxleEhlbHBlcjxDMkNvbXBvc2l0ZVN0cnVjdD46OkZMRVhfU0laRSA9PSAxLCAiIik7Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkNvbXBvc2l0ZVN0cnVjdCwga1BhcmFtSW5kZXhDb21wb3NpdGU+IEMyQ29tcG9zaXRlSW5mbzsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJTdHJpbmdWYWx1ZSwga1BhcmFtSW5kZXhGbGV4U3RyaW5nPiBDMkZsZXhTdHJpbmdJbmZvOworCisjZGVmaW5lIFNVUFBPUlRFRF9UWVBFUyAgIFwKKyAgICBDMkludEluZm8sICAgICAgICAgICAgXAorICAgIEMyTG9uZ0luZm8sICAgICAgICAgICBcCisgICAgQzJTdHJpbmdJbmZvLCAgICAgICAgIFwKKyAgICBDMkNvbXBvc2l0ZUluZm8sICAgICAgXAorICAgIEMyRmxleFN0cmluZ0luZm8KKwordGVtcGxhdGU8dHlwZW5hbWUuLi4gVFlQRVM+IHN0cnVjdCBkZXNjcmliZV9pbXBsOwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gVFlQRVM+IHN0cnVjdCBkZXNjcmliZV9pbXBsPFQsIFRZUEVTLi4uPiB7CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCkgeworICAgICAgICBpZiAoaW5kZXggPT0gVDo6Q09SRV9JTkRFWCkgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8QzJTdHJ1Y3REZXNjcmlwdG9yPihUOjpDT1JFX0lOREVYLCBUOjpGaWVsZExpc3QoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVfaW1wbDxUWVBFUy4uLj46OmRlc2NyaWJlKGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGRlc2NyaWJlX2ltcGw8PiB7CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKEMyUGFyYW06OkNvcmVJbmRleCkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjb25zdCBjaGFyICpHZXROYW1lKCkgICAgICAgIHsgcmV0dXJuIG51bGxwdHI7IH0KK3RlbXBsYXRlPD4gY29uc3QgY2hhciAqR2V0TmFtZTxDMkludEluZm8+KCkgICAgICAgeyByZXR1cm4gImludCI7IH0KK3RlbXBsYXRlPD4gY29uc3QgY2hhciAqR2V0TmFtZTxDMkxvbmdJbmZvPigpICAgICAgeyByZXR1cm4gImxvbmciOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0IGNoYXIgKkdldE5hbWU8QzJTdHJpbmdJbmZvPigpICAgIHsgcmV0dXJuICJzdHJpbmciOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0IGNoYXIgKkdldE5hbWU8QzJDb21wb3NpdGVJbmZvPigpIHsgcmV0dXJuICJjb21wb3NpdGUiOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0IGNoYXIgKkdldE5hbWU8QzJGbGV4U3RyaW5nSW5mbz4oKSB7IHJldHVybiAiZmxleC1zdHJpbmciOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIFRZUEVTPiBzdHJ1Y3QgZmlsbF9kZXNjcmlwdG9yc19pbXBsOwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gVFlQRVM+IHN0cnVjdCBmaWxsX2Rlc2NyaXB0b3JzX2ltcGw8VCwgVFlQRVMuLi4+IHsKKyAgICBzdGF0aWMgdm9pZCBmaWxsKHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICp2ZWMpIHsKKyAgICAgICAgZmlsbF9kZXNjcmlwdG9yc19pbXBsPFRZUEVTLi4uPjo6ZmlsbCh2ZWMpOworICAgICAgICB2ZWMtPnB1c2hfYmFjayhzdGQ6Om1ha2Vfc2hhcmVkPEMyUGFyYW1EZXNjcmlwdG9yPigKKyAgICAgICAgICAgICAgICBUOjpQQVJBTV9UWVBFLCBDMlBhcmFtRGVzY3JpcHRvcjo6SVNfUEVSU0lTVEVOVCwgR2V0TmFtZTxUPigpKSk7CisgICAgfQorfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgZmlsbF9kZXNjcmlwdG9yc19pbXBsPD4geworICAgIHN0YXRpYyB2b2lkIGZpbGwoc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKikge30KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IFQgKkNhc3RQYXJhbShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtKSB7CisgICAgcmV0dXJuIChUICopcGFyYW0uZ2V0KCk7Cit9CisKK2NsYXNzIFBhcmFtUmVmbGVjdG9yIDogcHVibGljIEMyUGFyYW1SZWZsZWN0b3IgeworcHVibGljOgorICAgIFBhcmFtUmVmbGVjdG9yKCkgPSBkZWZhdWx0OworICAgIH5QYXJhbVJlZmxlY3RvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKEMyUGFyYW06OkNvcmVJbmRleCBwYXJhbUluZGV4KSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBkZXNjcmliZV9pbXBsPFNVUFBPUlRFRF9UWVBFUz46OmRlc2NyaWJlKHBhcmFtSW5kZXgpOworICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyVGVzdCgpIDogbVJlZmxlY3RvcihuZXcgUGFyYW1SZWZsZWN0b3IpIHsKKyAgICAgICAgZmlsbF9kZXNjcmlwdG9yc19pbXBsPFNVUFBPUlRFRF9UWVBFUz46OmZpbGwoJm1EZXNjcmlwdG9ycyk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IG1SZWZsZWN0b3I7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gbURlc2NyaXB0b3JzOworfTsKKworVEVTVF9GKFJlZmxlY3RlZFBhcmFtVXBkYXRlclRlc3QsIFNpbmdsZVZhbHVlVGVzdCkgeworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlciB1cGRhdGVyOworCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IG1zZzsKKyAgICBtc2cuZW1wbGFjZSgiaW50LnZhbHVlIiwgaW50MzJfdCgxMikpOworICAgIG1zZy5lbXBsYWNlKCJ2ZW5kb3IubG9uZy52YWx1ZSIsIGludDY0X3QoMzQpKTsKKworICAgIHVwZGF0ZXIuYWRkUGFyYW1EZXNjKG1SZWZsZWN0b3IsIG1EZXNjcmlwdG9ycyk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICB1cGRhdGVyLmdldFBhcmFtSW5kaWNlc0Zyb21NZXNzYWdlKG1zZywgJmluZGljZXMpOworICAgIEVYUEVDVF9FUSgxLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJJbnRJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDEsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkxvbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMlN0cmluZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyQ29tcG9zaXRlSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJGbGV4U3RyaW5nSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgcGFyYW1zLmVtcGxhY2VfYmFjayhuZXcgQzJJbnRJbmZvKTsKKyAgICBwYXJhbXMuZW1wbGFjZV9iYWNrKG5ldyBDMkxvbmdJbmZvKTsKKyAgICBFWFBFQ1RfRVEoMCwgQ2FzdFBhcmFtPEMySW50SW5mbz4ocGFyYW1zWzBdKS0+dmFsdWUpOworICAgIEVYUEVDVF9FUSgwLCBDYXN0UGFyYW08QzJMb25nSW5mbz4ocGFyYW1zWzFdKS0+dmFsdWUpOworCisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9FUSgxMiwgQ2FzdFBhcmFtPEMySW50SW5mbz4ocGFyYW1zWzBdKS0+dmFsdWUpOworICAgIEVYUEVDVF9FUSgzNCwgQ2FzdFBhcmFtPEMyTG9uZ0luZm8+KHBhcmFtc1sxXSktPnZhbHVlKTsKKworICAgIEMyVmFsdWUgYzJWYWx1ZTsKKyAgICBpbnQzMl90IGludDMyVmFsdWUgPSAwOworICAgIGludDY0X3QgaW50NjRWYWx1ZSA9IDA7CisgICAgbXNnID0gdXBkYXRlci5nZXRQYXJhbXMocGFyYW1zKTsKKyAgICBBU1NFUlRfRVEoMXUsIG1zZy5jb3VudCgiaW50LnZhbHVlIikpOworICAgIEVYUEVDVF9FUSh0cnVlLCBtc2dbImludC52YWx1ZSJdLmZpbmQoJmMyVmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgYzJWYWx1ZS5nZXQoJmludDMyVmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEoMTIsIGludDMyVmFsdWUpOworCisgICAgQVNTRVJUX0VRKDF1LCBtc2cuY291bnQoInZlbmRvci5sb25nLnZhbHVlIikpOworICAgIEVYUEVDVF9FUSh0cnVlLCBtc2dbInZlbmRvci5sb25nLnZhbHVlIl0uZmluZCgmYzJWYWx1ZSkpOworICAgIEVYUEVDVF9FUSh0cnVlLCBjMlZhbHVlLmdldCgmaW50NjRWYWx1ZSkpOworICAgIEVYUEVDVF9FUSgzNCwgaW50NjRWYWx1ZSk7Cit9CisKK1RFU1RfRihSZWZsZWN0ZWRQYXJhbVVwZGF0ZXJUZXN0LCBTdHJpbmdUZXN0KSB7CisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyIHVwZGF0ZXI7CisKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgbXNnOworICAgIG1zZy5lbXBsYWNlKCJzdHJpbmcudmFsdWUiLCBBU3RyaW5nKCI1NiIpKTsKKyAgICBtc2cuZW1wbGFjZSgiZmxleC1zdHJpbmcudmFsdWUiLCBBU3RyaW5nKCJTb21lIHN0cmluZyIpKTsKKyAgICB1cGRhdGVyLmFkZFBhcmFtRGVzYyhtUmVmbGVjdG9yLCBtRGVzY3JpcHRvcnMpOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgdXBkYXRlci5nZXRQYXJhbUluZGljZXNGcm9tTWVzc2FnZShtc2csICZpbmRpY2VzKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMySW50SW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJMb25nSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgxLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJTdHJpbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkNvbXBvc2l0ZUluZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMSwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyRmxleFN0cmluZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgIHBhcmFtcy5lbXBsYWNlX2JhY2sobmV3IEMyU3RyaW5nSW5mbyk7CisgICAgRVhQRUNUX0VRKDAsIENhc3RQYXJhbTxDMlN0cmluZ0luZm8+KHBhcmFtc1swXSktPnZhbHVlWzBdKTsKKyAgICBwYXJhbXMuZW1wbGFjZV9iYWNrKEMyRmxleFN0cmluZ0luZm86OkFsbG9jVW5pcXVlKDApKTsKKyAgICBFWFBFQ1RfRVEoMHUsIENhc3RQYXJhbTxDMkZsZXhTdHJpbmdJbmZvPihwYXJhbXNbMV0pLT5mbGV4Q291bnQoKSk7CisgICAgY2hhciAqZmxleFN0cmluZ0RhdGEgPSAmQ2FzdFBhcmFtPEMyRmxleFN0cmluZ0luZm8+KHBhcmFtc1sxXSktPm0udmFsdWVbMF07CisKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgRVhQRUNUX1NUUkVRKCI1NiIsIENhc3RQYXJhbTxDMlN0cmluZ0luZm8+KHBhcmFtc1swXSktPnZhbHVlKTsKKyAgICBFWFBFQ1RfRVEoMTJ1LCBDYXN0UGFyYW08QzJGbGV4U3RyaW5nSW5mbz4ocGFyYW1zWzBdKS0+ZmxleENvdW50KCkpOworICAgIEVYUEVDVF9TVFJFUSgiU29tZSBzdHJpbmciLCBDYXN0UGFyYW08QzJGbGV4U3RyaW5nSW5mbz4ocGFyYW1zWzFdKS0+bS52YWx1ZSk7CisgICAgRVhQRUNUX05FKGZsZXhTdHJpbmdEYXRhLCAmQ2FzdFBhcmFtPEMyRmxleFN0cmluZ0luZm8+KHBhcmFtc1sxXSktPm0udmFsdWVbMF0pOworICAgIGZsZXhTdHJpbmdEYXRhID0gJkNhc3RQYXJhbTxDMkZsZXhTdHJpbmdJbmZvPihwYXJhbXNbMV0pLT5tLnZhbHVlWzBdOworCisgICAgLy8gdmVyaWZ5IHRydW5jYXRpb24gYW5kIGluLXBsYWNlIHVwZGF0ZQorICAgIG1zZ1sic3RyaW5nLnZhbHVlIl0gPSBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OlZhbHVlKEFTdHJpbmcoIjEyMzQ1Njc4OTBBQkNERSIpKTsKKyAgICBtc2dbImZsZXgtc3RyaW5nLnZhbHVlIl0gPSBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OlZhbHVlKEFTdHJpbmcoImFiYyIpKTsKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgRVhQRUNUX1NUUkVRKCIxMjM0NTY3ODkwQSIsIENhc3RQYXJhbTxDMlN0cmluZ0luZm8+KHBhcmFtc1swXSktPnZhbHVlKTsKKyAgICBFWFBFQ1RfRVEoNHUsIENhc3RQYXJhbTxDMkZsZXhTdHJpbmdJbmZvPihwYXJhbXNbMV0pLT5mbGV4Q291bnQoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJhYmMiLCBDYXN0UGFyYW08QzJGbGV4U3RyaW5nSW5mbz4ocGFyYW1zWzFdKS0+bS52YWx1ZSk7CisgICAgRVhQRUNUX0VRKGZsZXhTdHJpbmdEYXRhLCAmQ2FzdFBhcmFtPEMyRmxleFN0cmluZ0luZm8+KHBhcmFtc1sxXSktPm0udmFsdWVbMF0pOworCisgICAgQVN0cmluZyBzdHJWYWx1ZTsKKyAgICBtc2cgPSB1cGRhdGVyLmdldFBhcmFtcyhwYXJhbXMpOworICAgIEFTU0VSVF9FUSgxdSwgbXNnLmNvdW50KCJzdHJpbmcudmFsdWUiKSk7CisgICAgRVhQRUNUX0VRKHRydWUsIG1zZ1sic3RyaW5nLnZhbHVlIl0uZmluZCgmc3RyVmFsdWUpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjEyMzQ1Njc4OTBBIiwgc3RyVmFsdWUuY19zdHIoKSk7CisKKyAgICBBU1NFUlRfRVEoMXUsIG1zZy5jb3VudCgiZmxleC1zdHJpbmcudmFsdWUiKSk7CisgICAgRVhQRUNUX0VRKHRydWUsIG1zZ1siZmxleC1zdHJpbmcudmFsdWUiXS5maW5kKCZzdHJWYWx1ZSkpOworICAgIEVYUEVDVF9TVFJFUSgiYWJjIiwgc3RyVmFsdWUuY19zdHIoKSk7Cit9CisKK1RFU1RfRihSZWZsZWN0ZWRQYXJhbVVwZGF0ZXJUZXN0LCBDb21wb3NpdGVUZXN0KSB7CisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyIHVwZGF0ZXI7CisKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgbXNnOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuaTMyIiwgaW50MzJfdCg3OCkpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUudTY0IiwgaW50NjRfdCg5MTApKTsKKyAgICBtc2cuZW1wbGFjZSgiY29tcG9zaXRlLnN0ciIsIEFTdHJpbmcoIjExMTIiKSk7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5ibG9iIiwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCJidWZmZXIwOCIsIDgpKTsKKyAgICBtc2cuZW1wbGFjZSgiY29tcG9zaXRlLmZsZXgtYmxvYiIsIEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgiZmxleC1idWZmZXItMTQiLCAxNCkpOworCisgICAgdXBkYXRlci5hZGRQYXJhbURlc2MobVJlZmxlY3RvciwgbURlc2NyaXB0b3JzKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzOworICAgIHVwZGF0ZXIuZ2V0UGFyYW1JbmRpY2VzRnJvbU1lc3NhZ2UobXNnLCAmaW5kaWNlcyk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkludEluZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyTG9uZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyU3RyaW5nSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgxLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJDb21wb3NpdGVJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICBwYXJhbXMuZW1wbGFjZV9iYWNrKEMyQ29tcG9zaXRlSW5mbzo6QWxsb2NVbmlxdWUoMCkpOworICAgIEVYUEVDVF9FUSgwLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmkzMik7CisgICAgRVhQRUNUX0VRKDB1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnU2NCk7CisgICAgRVhQRUNUX0VRKDAsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uc3RyWzBdKTsKKyAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKCJcMFwwXDBcMFwwXDBcMFwwIiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5ibG9iLCA4KSk7CisgICAgRVhQRUNUX0VRKDB1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5mbGV4Q291bnQoKSk7CisgICAgdWludDhfdCAqZmxleEJsb2JEYXRhID0gJkNhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uZmxleEJsb2JbMF07CisKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgRVhQRUNUX0VRKDc4LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmkzMik7CisgICAgRVhQRUNUX0VRKDkxMHUsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0udTY0KTsKKyAgICBFWFBFQ1RfU1RSRVEoIjExMTIiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnN0cik7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiYnVmZmVyMDgiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmJsb2IsIDgpKTsKKyAgICBBU3RyaW5nIGhleDsKKyAgICBoZXhkdW1wKENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uYmxvYiwgOCwgMCwgJmhleCk7CisgICAgcHJpbnRmKCIlc1xuIiwgaGV4LmNfc3RyKCkpOworICAgIEFTU0VSVF9FUSgxNHUsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPmZsZXhDb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKCJmbGV4LWJ1ZmZlci0xNCIsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uZmxleEJsb2IsIDE0KSk7CisgICAgRVhQRUNUX05FKGZsZXhCbG9iRGF0YSwgJkNhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uZmxleEJsb2JbMF0pOworICAgIGZsZXhCbG9iRGF0YSA9ICZDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iWzBdOworCisgICAgLy8gdGVzdCBzZXR0aW5nIGFuZCB6ZXJvIGV4dGVuZGluZyBzaG9ydGVyIGJsb2IgdGhhbiBhbGxvd2VkCisgICAgbXNnLmNsZWFyKCk7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5ibG9iIiwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCJidWYwNSIsIDUpKTsKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiYnVmMDVcMFwwXDAiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmJsb2IsIDgpKTsKKyAgICBBU1NFUlRfRVEoMTR1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5mbGV4Q291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiZmxleC1idWZmZXItMTQiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iLCAxNCkpOworICAgIEVYUEVDVF9FUShmbGV4QmxvYkRhdGEsICZDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iWzBdKTsKKworICAgIC8vIHRlc3Qgc2V0dGluZyBhbmQgdHJpbW1pbmcgbGFyZ2VyIGJsb2IgdGhhbiBhbGxvd2VkCisgICAgbXNnLmNsZWFyKCk7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5ibG9iIiwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCJSZWFsbHlMb25nQnVmZmVyIiwgMTYpKTsKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiUmVhbGx5TG8iLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmJsb2IsIDgpKTsKKyAgICBBU1NFUlRfRVEoMTR1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5mbGV4Q291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiZmxleC1idWZmZXItMTQiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iLCAxNCkpOworICAgIEVYUEVDVF9FUShmbGV4QmxvYkRhdGEsICZDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iWzBdKTsKKworICAgIC8vIHRlc3QgdHJpbW1pbmcgZmxleCBibG9iIGluLXBsYWNlCisgICAgbXNnLmNsZWFyKCk7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5mbGV4LWJsb2IiLCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoImJ1ZjA1IiwgNSkpOworICAgIHVwZGF0ZXIudXBkYXRlUGFyYW1zRnJvbU1lc3NhZ2UobXNnLCAmcGFyYW1zKTsKKyAgICBBU1NFUlRfRVEoNXUsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPmZsZXhDb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKCJidWYwNSIsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uZmxleEJsb2IsIDUpKTsKKyAgICBFWFBFQ1RfRVEoZmxleEJsb2JEYXRhLCAmQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYlswXSk7Cit9CisKK1RFU1RfRihSZWZsZWN0ZWRQYXJhbVVwZGF0ZXJUZXN0LCBDb21wb3NpdGVQYXJ0aWFsVGVzdCkgeworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlciB1cGRhdGVyOworCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IG1zZzsKKyAgICBtc2cuZW1wbGFjZSgiY29tcG9zaXRlLmkzMiIsIEMyVmFsdWUoMTMxNCkpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuc3RyIiwgQVN0cmluZygiMTUxNiIpKTsKKworICAgIHVwZGF0ZXIuYWRkUGFyYW1EZXNjKG1SZWZsZWN0b3IsIG1EZXNjcmlwdG9ycyk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICB1cGRhdGVyLmdldFBhcmFtSW5kaWNlc0Zyb21NZXNzYWdlKG1zZywgJmluZGljZXMpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJJbnRJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkxvbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMlN0cmluZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMSwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyQ29tcG9zaXRlSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgcGFyYW1zLmVtcGxhY2VfYmFjayhDMkNvbXBvc2l0ZUluZm86OkFsbG9jVW5pcXVlKDEydSkpOworICAgIEVYUEVDVF9FUSgwLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmkzMik7CisgICAgRVhQRUNUX0VRKDB1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnU2NCk7CisgICAgRVhQRUNUX0VRKDAsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uc3RyWzBdKTsKKworICAgIHVwZGF0ZXIudXBkYXRlUGFyYW1zRnJvbU1lc3NhZ2UobXNnLCAmcGFyYW1zKTsKKyAgICBFWFBFQ1RfRVEoMTMxNCwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5pMzIpOworICAgIEVYUEVDVF9FUSgwdSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS51NjQpOworICAgIEVYUEVDVF9TVFJFUSgiMTUxNiIsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uc3RyKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzhmMDI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0MCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDb2RlYzJCdWZmZXJVdGlscy5jcHAiLAorICAgICAgICAiQ29kZWMyTWFwcGVyLmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgIi4iLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnl1dl9zdGF0aWMiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQnVmZmVyVXRpbHMuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yjg2NjNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmNwcApAQCAtMCwwICsxLDUzMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzJCdWZmZXJVdGlscyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGxpYnl1di5oPgorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKworI2luY2x1ZGUgIkNvZGVjMkJ1ZmZlclV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworLyoqCisgKiBBIGZsaXBwYWJsZSwgb3B0aW1pemFibGUgbWVtY3B5LiBDb25zdHJ1Y3RzIHN1Y2ggYXMgKGZyb20gPyBzcmMgOiBkc3QpIGRvIG5vdCB3b3JrIGFzIHRoZSByZXN1bHRzIGFyZQorICogYWx3YXlzIGNvbnN0LgorICovCit0ZW1wbGF0ZTxib29sIFRvQSwgc2l6ZV90IFM+CitzdHJ1Y3QgTWVtQ29waWVyIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgorICAgIGlubGluZSBzdGF0aWMgdm9pZCBjb3B5KEEgKmEsIGNvbnN0IEIgKmIsIHNpemVfdCBzaXplKSB7CisgICAgICAgIF9fYnVpbHRpbl9tZW1jcHkoYSwgYiwgc2l6ZSk7CisgICAgfQorfTsKKwordGVtcGxhdGU8c2l6ZV90IFM+CitzdHJ1Y3QgTWVtQ29waWVyPGZhbHNlLCBTPiB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KKyAgICBpbmxpbmUgc3RhdGljIHZvaWQgY29weShjb25zdCBBICphLCBCICpiLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBNZW1Db3BpZXI8dHJ1ZSwgUz46OmNvcHkoYiwgYSwgc2l6ZSk7CisgICAgfQorfTsKKworLyoqCisgKiBDb3BpZXMgYmV0d2VlbiBhIE1lZGlhSW1hZ2UgYW5kIGEgZ3JhcGhpYyB2aWV3LgorICoKKyAqIFxwYXJhbSBUb01lZGlhSW1hZ2Ugd2hldGhlciB0byBjb3B5IHRvIChvciBmcm9tKSB0aGUgTWVkaWFJbWFnZQorICogXHBhcmFtIHZpZXcgZ3JhcGhpYyB2aWV3IChjb3VsZCBiZSBDb25zdEdyYXBoaWNWaWV3IG9yIEdyYXBoaWNWaWV3IGRlcGVuZGluZyBvbiBkaXJlY3Rpb24pCisgKiBccGFyYW0gaW1nIE1lZGlhSW1hZ2UgZGF0YQorICogXHBhcmFtIGltZ0Jhc2UgYmFzZSBvZiBNZWRpYUltYWdlIChjb3VsZCBiZSBjb25zdCB1aW50OF90KiBvciB1aW50OF90KiBkZXBlbmRpbmcgb24gZGlyZWN0aW9uKQorICovCit0ZW1wbGF0ZTxib29sIFRvTWVkaWFJbWFnZSwgdHlwZW5hbWUgVmlldywgdHlwZW5hbWUgSW1hZ2VQaXhlbD4KK3N0YXRpYyBzdGF0dXNfdCBfSW1hZ2VDb3B5KFZpZXcgJnZpZXcsIGNvbnN0IE1lZGlhSW1hZ2UyICppbWcsIEltYWdlUGl4ZWwgKmltZ0Jhc2UpIHsKKyAgICAvLyBUT0RPOiBtb3JlIGVmZmljaWVudCBjb3B5aW5nIC0tLSBlLmcuIGNvcHkgaW50ZXJsZWF2ZWQgcGxhbmVzIHRvZ2V0aGVyLCBldGMuCisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IHZpZXcubGF5b3V0KCk7CisgICAgY29uc3Qgc2l6ZV90IGJwcCA9IGRpdlVwKGltZy0+bUJpdERlcHRoQWxsb2NhdGVkLCA4dSk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGF5b3V0Lm51bVBsYW5lczsgKytpKSB7CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8VG9NZWRpYUltYWdlLCB1aW50OF90LCBjb25zdCB1aW50OF90Pjo6dHlwZSAqaW1nUm93ID0KKyAgICAgICAgICAgIGltZ0Jhc2UgKyBpbWctPm1QbGFuZVtpXS5tT2Zmc2V0OworICAgICAgICB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPFRvTWVkaWFJbWFnZSwgY29uc3QgdWludDhfdCwgdWludDhfdD46OnR5cGUgKnZpZXdSb3cgPQorICAgICAgICAgICAgdmlld1JvdyA9IHZpZXcuZGF0YSgpW2ldOworICAgICAgICBjb25zdCBDMlBsYW5lSW5mbyAmcGxhbmUgPSBsYXlvdXQucGxhbmVzW2ldOworICAgICAgICBpZiAocGxhbmUuY29sU2FtcGxpbmcgIT0gaW1nLT5tUGxhbmVbaV0ubUhvcml6U3Vic2FtcGxpbmcKKyAgICAgICAgICAgICAgICB8fCBwbGFuZS5yb3dTYW1wbGluZyAhPSBpbWctPm1QbGFuZVtpXS5tVmVydFN1YnNhbXBsaW5nCisgICAgICAgICAgICAgICAgfHwgcGxhbmUuYWxsb2NhdGVkRGVwdGggIT0gaW1nLT5tQml0RGVwdGhBbGxvY2F0ZWQKKyAgICAgICAgICAgICAgICB8fCBwbGFuZS5hbGxvY2F0ZWREZXB0aCA8IHBsYW5lLmJpdERlcHRoCisgICAgICAgICAgICAgICAgLy8gTWVkaWFJbWFnZSBvbmx5IHN1cHBvcnRzIE1TQiB2YWx1ZXMKKyAgICAgICAgICAgICAgICB8fCBwbGFuZS5yaWdodFNoaWZ0ICE9IHBsYW5lLmFsbG9jYXRlZERlcHRoIC0gcGxhbmUuYml0RGVwdGgKKyAgICAgICAgICAgICAgICB8fCAoYnBwID4gMSAmJiBwbGFuZS5lbmRpYW5uZXNzICE9IHBsYW5lLk5BVElWRSkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCBwbGFuZVcgPSBpbWctPm1XaWR0aCAvIHBsYW5lLmNvbFNhbXBsaW5nOworICAgICAgICB1aW50MzJfdCBwbGFuZUggPSBpbWctPm1IZWlnaHQgLyBwbGFuZS5yb3dTYW1wbGluZzsKKworICAgICAgICBib29sIGNhbkNvcHlCeVJvdyA9IChwbGFuZS5jb2xJbmMgPT0gMSkgJiYgKGltZy0+bVBsYW5lW2ldLm1Db2xJbmMgPT0gMSk7CisgICAgICAgIGJvb2wgY2FuQ29weUJ5UGxhbmUgPSBjYW5Db3B5QnlSb3cgJiYgKHBsYW5lLnJvd0luYyA9PSBpbWctPm1QbGFuZVtpXS5tUm93SW5jKTsKKyAgICAgICAgaWYgKGNhbkNvcHlCeVBsYW5lKSB7CisgICAgICAgICAgICBNZW1Db3BpZXI8VG9NZWRpYUltYWdlLCAwPjo6Y29weShpbWdSb3csIHZpZXdSb3csIHBsYW5lLnJvd0luYyAqIHBsYW5lSCk7CisgICAgICAgIH0gZWxzZSBpZiAoY2FuQ29weUJ5Um93KSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHJvdyA9IDA7IHJvdyA8IHBsYW5lSDsgKytyb3cpIHsKKyAgICAgICAgICAgICAgICBNZW1Db3BpZXI8VG9NZWRpYUltYWdlLCAwPjo6Y29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGltZ1Jvdywgdmlld1Jvdywgc3RkOjptaW4ocGxhbmUucm93SW5jLCBpbWctPm1QbGFuZVtpXS5tUm93SW5jKSk7CisgICAgICAgICAgICAgICAgaW1nUm93ICs9IGltZy0+bVBsYW5lW2ldLm1Sb3dJbmM7CisgICAgICAgICAgICAgICAgdmlld1JvdyArPSBwbGFuZS5yb3dJbmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHJvdyA9IDA7IHJvdyA8IHBsYW5lSDsgKytyb3cpIHsKKyAgICAgICAgICAgICAgICBkZWNsdHlwZShpbWdSb3cpIGltZ1B0ciA9IGltZ1JvdzsKKyAgICAgICAgICAgICAgICBkZWNsdHlwZSh2aWV3Um93KSB2aWV3UHRyID0gdmlld1JvdzsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGNvbCA9IDA7IGNvbCA8IHBsYW5lVzsgKytjb2wpIHsKKyAgICAgICAgICAgICAgICAgICAgTWVtQ29waWVyPFRvTWVkaWFJbWFnZSwgMD46OmNvcHkoaW1nUHRyLCB2aWV3UHRyLCBicHApOworICAgICAgICAgICAgICAgICAgICBpbWdQdHIgKz0gaW1nLT5tUGxhbmVbaV0ubUNvbEluYzsKKyAgICAgICAgICAgICAgICAgICAgdmlld1B0ciArPSBwbGFuZS5jb2xJbmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGltZ1JvdyArPSBpbWctPm1QbGFuZVtpXS5tUm93SW5jOworICAgICAgICAgICAgICAgIHZpZXdSb3cgKz0gcGxhbmUucm93SW5jOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK3N0YXR1c190IEltYWdlQ29weSh1aW50OF90ICppbWdCYXNlLCBjb25zdCBNZWRpYUltYWdlMiAqaW1nLCBjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KSB7CisgICAgaWYgKHZpZXcud2lkdGgoKSAhPSBpbWctPm1XaWR0aCB8fCB2aWV3LmhlaWdodCgpICE9IGltZy0+bUhlaWdodCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoKElzTlYxMih2aWV3KSAmJiBJc0k0MjAoaW1nKSkgfHwgKElzSTQyMCh2aWV3KSAmJiBJc05WMTIoaW1nKSkpIHsKKyAgICAgICAgLy8gVGFrZSBzaG9ydGN1dHMgdG8gdXNlIGxpYnl1diBmdW5jdGlvbnMgYmV0d2VlbiBOVjEyIGFuZCBJNDIwIGNvbnZlcnNpb24uCisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY195ID0gdmlldy5kYXRhKClbMF07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY191ID0gdmlldy5kYXRhKClbMV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY192ID0gdmlldy5kYXRhKClbMl07CisgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZV95ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMF0ucm93SW5jOworICAgICAgICBpbnQzMl90IHNyY19zdHJpZGVfdSA9IHZpZXcubGF5b3V0KCkucGxhbmVzWzFdLnJvd0luYzsKKyAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlX3YgPSB2aWV3LmxheW91dCgpLnBsYW5lc1syXS5yb3dJbmM7CisgICAgICAgIHVpbnQ4X3QqIGRzdF95ID0gaW1nQmFzZSArIGltZy0+bVBsYW5lWzBdLm1PZmZzZXQ7CisgICAgICAgIHVpbnQ4X3QqIGRzdF91ID0gaW1nQmFzZSArIGltZy0+bVBsYW5lWzFdLm1PZmZzZXQ7CisgICAgICAgIHVpbnQ4X3QqIGRzdF92ID0gaW1nQmFzZSArIGltZy0+bVBsYW5lWzJdLm1PZmZzZXQ7CisgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZV95ID0gaW1nLT5tUGxhbmVbMF0ubVJvd0luYzsKKyAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlX3UgPSBpbWctPm1QbGFuZVsxXS5tUm93SW5jOworICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGVfdiA9IGltZy0+bVBsYW5lWzJdLm1Sb3dJbmM7CisgICAgICAgIGlmIChJc05WMTIodmlldykgJiYgSXNJNDIwKGltZykpIHsKKyAgICAgICAgICAgIGlmICghbGlieXV2OjpOVjEyVG9JNDIwKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY191LCBzcmNfc3RyaWRlX3UsIGRzdF95LCBkc3Rfc3RyaWRlX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfdSwgZHN0X3N0cmlkZV91LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB2aWV3LndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmhlaWdodCgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghbGlieXV2OjpJNDIwVG9OVjEyKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY191LCBzcmNfc3RyaWRlX3UsIHNyY192LCBzcmNfc3RyaWRlX3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfeSwgZHN0X3N0cmlkZV95LCBkc3RfdSwgZHN0X3N0cmlkZV91LCB2aWV3LndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmhlaWdodCgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX0ltYWdlQ29weTx0cnVlPih2aWV3LCBpbWcsIGltZ0Jhc2UpOworfQorCitzdGF0dXNfdCBJbWFnZUNvcHkoQzJHcmFwaGljVmlldyAmdmlldywgY29uc3QgdWludDhfdCAqaW1nQmFzZSwgY29uc3QgTWVkaWFJbWFnZTIgKmltZykgeworICAgIGlmICh2aWV3LndpZHRoKCkgIT0gaW1nLT5tV2lkdGggfHwgdmlldy5oZWlnaHQoKSAhPSBpbWctPm1IZWlnaHQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKChJc05WMTIoaW1nKSAmJiBJc0k0MjAodmlldykpIHx8IChJc0k0MjAoaW1nKSAmJiBJc05WMTIodmlldykpKSB7CisgICAgICAgIC8vIFRha2Ugc2hvcnRjdXRzIHRvIHVzZSBsaWJ5dXYgZnVuY3Rpb25zIGJldHdlZW4gTlYxMiBhbmQgSTQyMCBjb252ZXJzaW9uLgorICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfeSA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVswXS5tT2Zmc2V0OworICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfdSA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVsxXS5tT2Zmc2V0OworICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfdiA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVsyXS5tT2Zmc2V0OworICAgICAgICBpbnQzMl90IHNyY19zdHJpZGVfeSA9IGltZy0+bVBsYW5lWzBdLm1Sb3dJbmM7CisgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZV91ID0gaW1nLT5tUGxhbmVbMV0ubVJvd0luYzsKKyAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlX3YgPSBpbWctPm1QbGFuZVsyXS5tUm93SW5jOworICAgICAgICB1aW50OF90KiBkc3RfeSA9IHZpZXcuZGF0YSgpWzBdOworICAgICAgICB1aW50OF90KiBkc3RfdSA9IHZpZXcuZGF0YSgpWzFdOworICAgICAgICB1aW50OF90KiBkc3RfdiA9IHZpZXcuZGF0YSgpWzJdOworICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGVfeSA9IHZpZXcubGF5b3V0KCkucGxhbmVzWzBdLnJvd0luYzsKKyAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlX3UgPSB2aWV3LmxheW91dCgpLnBsYW5lc1sxXS5yb3dJbmM7CisgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZV92ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMl0ucm93SW5jOworICAgICAgICBpZiAoSXNOVjEyKGltZykgJiYgSXNJNDIwKHZpZXcpKSB7CisgICAgICAgICAgICBpZiAoIWxpYnl1djo6TlYxMlRvSTQyMChzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdSwgc3JjX3N0cmlkZV91LCBkc3RfeSwgZHN0X3N0cmlkZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3UsIGRzdF9zdHJpZGVfdSwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgdmlldy53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5oZWlnaHQoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIWxpYnl1djo6STQyMFRvTlYxMihzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdSwgc3JjX3N0cmlkZV91LCBzcmNfdiwgc3JjX3N0cmlkZV92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3ksIGRzdF9zdHJpZGVfeSwgZHN0X3UsIGRzdF9zdHJpZGVfdSwgdmlldy53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5oZWlnaHQoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9JbWFnZUNvcHk8ZmFsc2U+KHZpZXcsIGltZywgaW1nQmFzZSk7Cit9CisKK2Jvb2wgSXNZVVY0MjAoY29uc3QgQzJHcmFwaGljVmlldyAmdmlldykgeworICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSB2aWV3LmxheW91dCgpOworICAgIHJldHVybiAobGF5b3V0Lm51bVBsYW5lcyA9PSAzCisgICAgICAgICAgICAmJiBsYXlvdXQudHlwZSA9PSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVYKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmNoYW5uZWwgPT0gQzJQbGFuZUluZm86OkNIQU5ORUxfWQorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uYWxsb2NhdGVkRGVwdGggPT0gOAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uYml0RGVwdGggPT0gOAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0ucmlnaHRTaGlmdCA9PSAwCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5jb2xTYW1wbGluZyA9PSAxCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5yb3dTYW1wbGluZyA9PSAxCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5jaGFubmVsID09IEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NCCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5hbGxvY2F0ZWREZXB0aCA9PSA4CisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5iaXREZXB0aCA9PSA4CisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5yaWdodFNoaWZ0ID09IDAKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmNvbFNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLnJvd1NhbXBsaW5nID09IDIKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmNoYW5uZWwgPT0gQzJQbGFuZUluZm86OkNIQU5ORUxfQ1IKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmFsbG9jYXRlZERlcHRoID09IDgKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmJpdERlcHRoID09IDgKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLnJpZ2h0U2hpZnQgPT0gMAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY29sU2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0ucm93U2FtcGxpbmcgPT0gMik7Cit9CisKK2Jvb2wgSXNOVjEyKGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcpIHsKKyAgICBpZiAoIUlzWVVWNDIwKHZpZXcpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IHZpZXcubGF5b3V0KCk7CisgICAgcmV0dXJuIChsYXlvdXQucm9vdFBsYW5lcyA9PSAyCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5jb2xJbmMgPT0gMgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0ucm9vdEl4ID09IGxheW91dC5QTEFORV9VCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5vZmZzZXQgPT0gMAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY29sSW5jID09IDIKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLnJvb3RJeCA9PSBsYXlvdXQuUExBTkVfVQorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0ub2Zmc2V0ID09IDEpOworfQorCitib29sIElzSTQyMChjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KSB7CisgICAgaWYgKCFJc1lVVjQyMCh2aWV3KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSB2aWV3LmxheW91dCgpOworICAgIHJldHVybiAobGF5b3V0LnJvb3RQbGFuZXMgPT0gMworICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLnJvb3RJeCA9PSBsYXlvdXQuUExBTkVfVQorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0ub2Zmc2V0ID09IDAKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmNvbEluYyA9PSAxCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5yb290SXggPT0gbGF5b3V0LlBMQU5FX1YKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLm9mZnNldCA9PSAwKTsKK30KKworYm9vbCBJc1lVVjQyMChjb25zdCBNZWRpYUltYWdlMiAqaW1nKSB7CisgICAgcmV0dXJuIChpbWctPm1UeXBlID09IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1lVVgorICAgICAgICAgICAgJiYgaW1nLT5tTnVtUGxhbmVzID09IDMKKyAgICAgICAgICAgICYmIGltZy0+bUJpdERlcHRoID09IDgKKyAgICAgICAgICAgICYmIGltZy0+bUJpdERlcHRoQWxsb2NhdGVkID09IDgKKyAgICAgICAgICAgICYmIGltZy0+bVBsYW5lWzBdLm1Ib3JpelN1YnNhbXBsaW5nID09IDEKKyAgICAgICAgICAgICYmIGltZy0+bVBsYW5lWzBdLm1WZXJ0U3Vic2FtcGxpbmcgPT0gMQorICAgICAgICAgICAgJiYgaW1nLT5tUGxhbmVbMV0ubUhvcml6U3Vic2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgJiYgaW1nLT5tUGxhbmVbMV0ubVZlcnRTdWJzYW1wbGluZyA9PSAyCisgICAgICAgICAgICAmJiBpbWctPm1QbGFuZVsyXS5tSG9yaXpTdWJzYW1wbGluZyA9PSAyCisgICAgICAgICAgICAmJiBpbWctPm1QbGFuZVsyXS5tVmVydFN1YnNhbXBsaW5nID09IDIpOworfQorCitib29sIElzTlYxMihjb25zdCBNZWRpYUltYWdlMiAqaW1nKSB7CisgICAgaWYgKCFJc1lVVjQyMChpbWcpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIChpbWctPm1QbGFuZVsxXS5tQ29sSW5jID09IDIKKyAgICAgICAgICAgICYmIGltZy0+bVBsYW5lWzJdLm1Db2xJbmMgPT0gMgorICAgICAgICAgICAgJiYgKGltZy0+bVBsYW5lWzJdLm1PZmZzZXQgLSBpbWctPm1QbGFuZVsxXS5tT2Zmc2V0ID09IDEpKTsKK30KKworYm9vbCBJc0k0MjAoY29uc3QgTWVkaWFJbWFnZTIgKmltZykgeworICAgIGlmICghSXNZVVY0MjAoaW1nKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiAoaW1nLT5tUGxhbmVbMV0ubUNvbEluYyA9PSAxCisgICAgICAgICAgICAmJiBpbWctPm1QbGFuZVsyXS5tQ29sSW5jID09IDEKKyAgICAgICAgICAgICYmIGltZy0+bVBsYW5lWzJdLm1PZmZzZXQgPiBpbWctPm1QbGFuZVsxXS5tT2Zmc2V0KTsKK30KKworTWVkaWFJbWFnZTIgQ3JlYXRlWVVWNDIwUGxhbmFyTWVkaWFJbWFnZTIoCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgdnN0cmlkZSkgeworICAgIHJldHVybiBNZWRpYUltYWdlMiB7CisgICAgICAgIC5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1lVViwKKyAgICAgICAgLm1OdW1QbGFuZXMgPSAzLAorICAgICAgICAubVdpZHRoID0gd2lkdGgsCisgICAgICAgIC5tSGVpZ2h0ID0gaGVpZ2h0LAorICAgICAgICAubUJpdERlcHRoID0gOCwKKyAgICAgICAgLm1CaXREZXB0aEFsbG9jYXRlZCA9IDgsCisgICAgICAgIC5tUGxhbmUgPSB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLm1PZmZzZXQgPSAwLAorICAgICAgICAgICAgICAgIC5tQ29sSW5jID0gMSwKKyAgICAgICAgICAgICAgICAubVJvd0luYyA9IChpbnQzMl90KXN0cmlkZSwKKyAgICAgICAgICAgICAgICAubUhvcml6U3Vic2FtcGxpbmcgPSAxLAorICAgICAgICAgICAgICAgIC5tVmVydFN1YnNhbXBsaW5nID0gMSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLm1PZmZzZXQgPSBzdHJpZGUgKiB2c3RyaWRlLAorICAgICAgICAgICAgICAgIC5tQ29sSW5jID0gMSwKKyAgICAgICAgICAgICAgICAubVJvd0luYyA9IChpbnQzMl90KXN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgLm1Ib3JpelN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgICAgICAubVZlcnRTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gc3RyaWRlICogdnN0cmlkZSAqIDUgLyA0LAorICAgICAgICAgICAgICAgIC5tQ29sSW5jID0gMSwKKyAgICAgICAgICAgICAgICAubVJvd0luYyA9IChpbnQzMl90KXN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgLm1Ib3JpelN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgICAgICAubVZlcnRTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgfTsKK30KKworTWVkaWFJbWFnZTIgQ3JlYXRlWVVWNDIwU2VtaVBsYW5hck1lZGlhSW1hZ2UyKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IHZzdHJpZGUpIHsKKyAgICByZXR1cm4gTWVkaWFJbWFnZTIgeworICAgICAgICAubVR5cGUgPSBNZWRpYUltYWdlMjo6TUVESUFfSU1BR0VfVFlQRV9ZVVYsCisgICAgICAgIC5tTnVtUGxhbmVzID0gMywKKyAgICAgICAgLm1XaWR0aCA9IHdpZHRoLAorICAgICAgICAubUhlaWdodCA9IGhlaWdodCwKKyAgICAgICAgLm1CaXREZXB0aCA9IDgsCisgICAgICAgIC5tQml0RGVwdGhBbGxvY2F0ZWQgPSA4LAorICAgICAgICAubVBsYW5lID0geworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gMCwKKyAgICAgICAgICAgICAgICAubUNvbEluYyA9IDEsCisgICAgICAgICAgICAgICAgLm1Sb3dJbmMgPSAoaW50MzJfdClzdHJpZGUsCisgICAgICAgICAgICAgICAgLm1Ib3JpelN1YnNhbXBsaW5nID0gMSwKKyAgICAgICAgICAgICAgICAubVZlcnRTdWJzYW1wbGluZyA9IDEsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gc3RyaWRlICogdnN0cmlkZSwKKyAgICAgICAgICAgICAgICAubUNvbEluYyA9IDIsCisgICAgICAgICAgICAgICAgLm1Sb3dJbmMgPSAoaW50MzJfdClzdHJpZGUsCisgICAgICAgICAgICAgICAgLm1Ib3JpelN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgICAgICAubVZlcnRTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC5tT2Zmc2V0ID0gc3RyaWRlICogdnN0cmlkZSArIDEsCisgICAgICAgICAgICAgICAgLm1Db2xJbmMgPSAyLAorICAgICAgICAgICAgICAgIC5tUm93SW5jID0gKGludDMyX3Qpc3RyaWRlLAorICAgICAgICAgICAgICAgIC5tSG9yaXpTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICAgICAgLm1WZXJ0U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgIH07Cit9CisKK3N0YXR1c190IENvbnZlcnRSR0JUb1BsYW5hcllVVigKKyAgICAgICAgdWludDhfdCAqZHN0WSwgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IGRzdFZTdHJpZGUsIHNpemVfdCBidWZmZXJTaXplLAorICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3ICZzcmMpIHsKKyAgICBDSEVDSyhkc3RZICE9IG51bGxwdHIpOworICAgIENIRUNLKChzcmMud2lkdGgoKSAmIDEpID09IDApOworICAgIENIRUNLKChzcmMuaGVpZ2h0KCkgJiAxKSA9PSAwKTsKKworICAgIGlmIChkc3RTdHJpZGUgKiBkc3RWU3RyaWRlICogMyAvIDIgPiBidWZmZXJTaXplKSB7CisgICAgICAgIEFMT0dEKCJjb252ZXJzaW9uIGJ1ZmZlciBpcyB0b28gc21hbGwgZm9yIGNvbnZlcnRpbmcgZnJvbSBSR0IgdG8gWVVWIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgdWludDhfdCAqZHN0VSA9IGRzdFkgKyBkc3RTdHJpZGUgKiBkc3RWU3RyaWRlOworICAgIHVpbnQ4X3QgKmRzdFYgPSBkc3RVICsgKGRzdFN0cmlkZSA+PiAxKSAqIChkc3RWU3RyaWRlID4+IDEpOworCisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IHNyYy5sYXlvdXQoKTsKKyAgICBjb25zdCB1aW50OF90ICpwUmVkICAgPSBzcmMuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9SXTsKKyAgICBjb25zdCB1aW50OF90ICpwR3JlZW4gPSBzcmMuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9HXTsKKyAgICBjb25zdCB1aW50OF90ICpwQmx1ZSAgPSBzcmMuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9CXTsKKworI2RlZmluZSBDTElQMyh4LHkseikgKCgoeikgPCAoeCkpID8gKHgpIDogKCgoeikgPiAoeSkpID8gKHkpIDogKHopKSkKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IHNyYy5oZWlnaHQoKTsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgc3JjLndpZHRoKCk7ICsreCkgeworICAgICAgICAgICAgdWludDhfdCByZWQgPSAqcFJlZDsKKyAgICAgICAgICAgIHVpbnQ4X3QgZ3JlZW4gPSAqcEdyZWVuOworICAgICAgICAgICAgdWludDhfdCBibHVlID0gKnBCbHVlOworCisgICAgICAgICAgICAvLyB1c2luZyBJVFUtUiBCVC42MDEgY29udmVyc2lvbiBtYXRyaXgKKyAgICAgICAgICAgIHVuc2lnbmVkIGx1bWEgPQorICAgICAgICAgICAgICAgIENMSVAzKDAsICgoKHJlZCAqIDY2ICsgZ3JlZW4gKiAxMjkgKyBibHVlICogMjUpID4+IDgpICsgMTYpLCAyNTUpOworCisgICAgICAgICAgICBkc3RZW3hdID0gbHVtYTsKKworICAgICAgICAgICAgaWYgKCh4ICYgMSkgPT0gMCAmJiAoeSAmIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBVID0KKyAgICAgICAgICAgICAgICAgICAgQ0xJUDMoMCwgKCgoLXJlZCAqIDM4IC0gZ3JlZW4gKiA3NCArIGJsdWUgKiAxMTIpID4+IDgpICsgMTI4KSwgMjU1KTsKKworICAgICAgICAgICAgICAgIHVuc2lnbmVkIFYgPQorICAgICAgICAgICAgICAgICAgICBDTElQMygwLCAoKChyZWQgKiAxMTIgLSBncmVlbiAqIDk0IC0gYmx1ZSAqIDE4KSA+PiA4KSArIDEyOCksIDI1NSk7CisKKyAgICAgICAgICAgICAgICBkc3RVW3ggPj4gMV0gPSBVOworICAgICAgICAgICAgICAgIGRzdFZbeCA+PiAxXSA9IFY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwUmVkICAgKz0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfUl0uY29sSW5jOworICAgICAgICAgICAgcEdyZWVuICs9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0ddLmNvbEluYzsKKyAgICAgICAgICAgIHBCbHVlICArPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9CXS5jb2xJbmM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHkgJiAxKSA9PSAwKSB7CisgICAgICAgICAgICBkc3RVICs9IGRzdFN0cmlkZSA+PiAxOworICAgICAgICAgICAgZHN0ViArPSBkc3RTdHJpZGUgPj4gMTsKKyAgICAgICAgfQorCisgICAgICAgIHBSZWQgICAtPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9SXS5jb2xJbmMgKiBzcmMud2lkdGgoKTsKKyAgICAgICAgcEdyZWVuIC09IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0ddLmNvbEluYyAqIHNyYy53aWR0aCgpOworICAgICAgICBwQmx1ZSAgLT0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfQl0uY29sSW5jICogc3JjLndpZHRoKCk7CisgICAgICAgIHBSZWQgICArPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9SXS5yb3dJbmM7CisgICAgICAgIHBHcmVlbiArPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9HXS5yb3dJbmM7CisgICAgICAgIHBCbHVlICArPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9CXS5yb3dJbmM7CisKKyAgICAgICAgZHN0WSArPSBkc3RTdHJpZGU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworbmFtZXNwYWNlIHsKKworLyoqCisgKiBBIGJsb2NrIG9mIHJhdyBhbGxvY2F0ZWQgbWVtb3J5LgorICovCitzdHJ1Y3QgTWVtb3J5QmxvY2tQb29sQmxvY2sgeworICAgIE1lbW9yeUJsb2NrUG9vbEJsb2NrKHNpemVfdCBzaXplKQorICAgICAgICA6IG1EYXRhKG5ldyB1aW50OF90W3NpemVdKSwgbVNpemUobURhdGEgPyBzaXplIDogMCkgeyB9CisKKyAgICB+TWVtb3J5QmxvY2tQb29sQmxvY2soKSB7CisgICAgICAgIGRlbGV0ZVtdIG1EYXRhOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGF0YTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TaXplOworICAgIH0KKworICAgIEMyX0RPX05PVF9DT1BZKE1lbW9yeUJsb2NrUG9vbEJsb2NrKTsKKworcHJpdmF0ZToKKyAgICB1aW50OF90ICptRGF0YTsKKyAgICBzaXplX3QgbVNpemU7Cit9OworCisvKioKKyAqIEEgc2ltcGxlIHJhdyBtZW1vcnkgYmxvY2sgcG9vbCBpbXBsZW1lbnRhdGlvbi4KKyAqLworc3RydWN0IE1lbW9yeUJsb2NrUG9vbEltcGwgeworICAgIHZvaWQgcmVsZWFzZShzdGQ6Omxpc3Q8TWVtb3J5QmxvY2tQb29sQmxvY2s+Ojpjb25zdF9pdGVyYXRvciBibG9jaykgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICAvLyByZXR1cm4gYmxvY2sgdG8gZnJlZSBibG9ja3MgaWYgaXQgaXMgdGhlIGN1cnJlbnQgc2l6ZTsgb3RoZXJ3aXNlLCBkaXNjYXJkCisgICAgICAgIGlmIChibG9jay0+c2l6ZSgpID09IG1DdXJyZW50U2l6ZSkgeworICAgICAgICAgICAgbUZyZWVCbG9ja3Muc3BsaWNlKG1GcmVlQmxvY2tzLmJlZ2luKCksIG1CbG9ja3NJblVzZSwgYmxvY2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUJsb2Nrc0luVXNlLmVyYXNlKGJsb2NrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6bGlzdDxNZW1vcnlCbG9ja1Bvb2xCbG9jaz46OmNvbnN0X2l0ZXJhdG9yIGZldGNoKHNpemVfdCBzaXplKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIG1GcmVlQmxvY2tzLnJlbW92ZV9pZihbc2l6ZV0oY29uc3QgTWVtb3J5QmxvY2tQb29sQmxvY2sgJmJsb2NrKSAtPiBib29sIHsKKyAgICAgICAgICAgIHJldHVybiBibG9jay5zaXplKCkgIT0gc2l6ZTsKKyAgICAgICAgfSk7CisgICAgICAgIG1DdXJyZW50U2l6ZSA9IHNpemU7CisgICAgICAgIGlmIChtRnJlZUJsb2Nrcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBtQmxvY2tzSW5Vc2UuZW1wbGFjZV9mcm9udChzaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1CbG9ja3NJblVzZS5zcGxpY2UobUJsb2Nrc0luVXNlLmJlZ2luKCksIG1GcmVlQmxvY2tzLCBtRnJlZUJsb2Nrcy5iZWdpbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUJsb2Nrc0luVXNlLmJlZ2luKCk7CisgICAgfQorCisgICAgTWVtb3J5QmxvY2tQb29sSW1wbCgpID0gZGVmYXVsdDsKKworICAgIEMyX0RPX05PVF9DT1BZKE1lbW9yeUJsb2NrUG9vbEltcGwpOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHN0ZDo6bGlzdDxNZW1vcnlCbG9ja1Bvb2xCbG9jaz4gbUZyZWVCbG9ja3M7CisgICAgc3RkOjpsaXN0PE1lbW9yeUJsb2NrUG9vbEJsb2NrPiBtQmxvY2tzSW5Vc2U7CisgICAgc2l6ZV90IG1DdXJyZW50U2l6ZTsKK307CisKK30gLy8gbmFtZXNwYWNlCisKK3N0cnVjdCBNZW1vcnlCbG9ja1Bvb2w6OkltcGwgOiBNZW1vcnlCbG9ja1Bvb2xJbXBsIHsKK307CisKK3N0cnVjdCBNZW1vcnlCbG9jazo6SW1wbCB7CisgICAgSW1wbChzdGQ6Omxpc3Q8TWVtb3J5QmxvY2tQb29sQmxvY2s+Ojpjb25zdF9pdGVyYXRvciBibG9jaywKKyAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxNZW1vcnlCbG9ja1Bvb2xJbXBsPiBwb29sKQorICAgICAgICA6IG1CbG9jayhibG9jayksIG1Qb29sKHBvb2wpIHsKKyAgICB9CisKKyAgICB+SW1wbCgpIHsKKyAgICAgICAgbVBvb2wtPnJlbGVhc2UobUJsb2NrKTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJsb2NrLT5kYXRhKCk7CisgICAgfQorCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQmxvY2stPnNpemUoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpsaXN0PE1lbW9yeUJsb2NrUG9vbEJsb2NrPjo6Y29uc3RfaXRlcmF0b3IgbUJsb2NrOworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZW1vcnlCbG9ja1Bvb2xJbXBsPiBtUG9vbDsKK307CisKK01lbW9yeUJsb2NrIE1lbW9yeUJsb2NrUG9vbDo6ZmV0Y2goc2l6ZV90IHNpemUpIHsKKyAgICBzdGQ6Omxpc3Q8TWVtb3J5QmxvY2tQb29sQmxvY2s+Ojpjb25zdF9pdGVyYXRvciBwb29sQmxvY2sgPSBtSW1wbC0+ZmV0Y2goc2l6ZSk7CisgICAgcmV0dXJuIE1lbW9yeUJsb2NrKHN0ZDo6bWFrZV9zaGFyZWQ8TWVtb3J5QmxvY2s6OkltcGw+KAorICAgICAgICAgICAgcG9vbEJsb2NrLCBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8TWVtb3J5QmxvY2tQb29sSW1wbD4obUltcGwpKSk7Cit9CisKK01lbW9yeUJsb2NrUG9vbDo6TWVtb3J5QmxvY2tQb29sKCkKKyAgICA6IG1JbXBsKHN0ZDo6bWFrZV9zaGFyZWQ8TWVtb3J5QmxvY2tQb29sOjpJbXBsPigpKSB7Cit9CisKK01lbW9yeUJsb2NrOjpNZW1vcnlCbG9jayhzdGQ6OnNoYXJlZF9wdHI8TWVtb3J5QmxvY2s6OkltcGw+IGltcGwpCisgICAgOiBtSW1wbChpbXBsKSB7Cit9CisKK01lbW9yeUJsb2NrOjpNZW1vcnlCbG9jaygpID0gZGVmYXVsdDsKKworTWVtb3J5QmxvY2s6On5NZW1vcnlCbG9jaygpID0gZGVmYXVsdDsKKworY29uc3QgdWludDhfdCogTWVtb3J5QmxvY2s6OmRhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsID8gbUltcGwtPmRhdGEoKSA6IG51bGxwdHI7Cit9CisKK3NpemVfdCBNZW1vcnlCbG9jazo6c2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwgPyBtSW1wbC0+c2l6ZSgpIDogMDsKK30KKworTWVtb3J5QmxvY2sgTWVtb3J5QmxvY2s6OkFsbG9jYXRlKHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIE1lbW9yeUJsb2NrUG9vbCgpLmZldGNoKHNpemUpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQnVmZmVyVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmFkZjAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9CVUZGRVJfVVRJTFNfSF8KKyNkZWZpbmUgQ09ERUMyX0JVRkZFUl9VVElMU19IXworCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQ29udmVydHMgYW4gUkdCIHZpZXcgdG8gcGxhbmFyIFlVViA0MjAgbWVkaWEgaW1hZ2UuCisgKgorICogXHBhcmFtIGRzdFkgICAgICAgcG9pbnRlciB0byBtZWRpYSBpbWFnZSBidWZmZXIKKyAqIFxwYXJhbSBkc3RTdHJpZGUgIHN0cmlkZSBpbiBieXRlcworICogXHBhcmFtIGRzdFZTdHJpZGUgdmVydGljYWwgc3RyaWRlIGluIHBpeGVscworICogXHBhcmFtIGJ1ZmZlclNpemUgbWVkaWEgaW1hZ2UgYnVmZmVyIHNpemUKKyAqIFxwYXJhbSBzcmMgc291cmNlIGltYWdlCisgKgorICogXHJldHZhbCBOT19NRU1PUlkgbWVkaWEgaW1hZ2UgaXMgdG9vIHNtYWxsCisgKiBccmV0dmFsIE9LIG9uIHN1Y2Nlc3MKKyAqLworc3RhdHVzX3QgQ29udmVydFJHQlRvUGxhbmFyWVVWKAorICAgICAgICB1aW50OF90ICpkc3RZLCBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3QgZHN0VlN0cmlkZSwgc2l6ZV90IGJ1ZmZlclNpemUsCisgICAgICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnNyYyk7CisKKy8qKgorICogUmV0dXJucyBhIHBsYW5hciBZVVYgNDIwIDgtYml0IG1lZGlhIGltYWdlIGRlc2NyaXB0b3IuCisgKgorICogXHBhcmFtIHdpZHRoIHdpZHRoIG9mIGltYWdlIGluIHBpeGVscworICogXHBhcmFtIGhlaWdodCBoZWlnaHQgb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKiBccGFyYW0gc3RyaWRlIHN0cmlkZSBvZiBpbWFnZSBpbiBwaXhlbHMKKyAqIFxwYXJhbSB2c3RyaWRlIHZlcnRpY2FsIHN0cmlkZSBvZiBpbWFnZSBpbiBwaXhlbHMKKyAqLworTWVkaWFJbWFnZTIgQ3JlYXRlWVVWNDIwUGxhbmFyTWVkaWFJbWFnZTIoCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgdnN0cmlkZSk7CisKKy8qKgorICogUmV0dXJucyBhIHNlbWlwbGFuYXIgWVVWIDQyMCA4LWJpdCBtZWRpYSBpbWFnZSBkZXNjcmlwdG9yLgorICoKKyAqIFxwYXJhbSB3aWR0aCB3aWR0aCBvZiBpbWFnZSBpbiBwaXhlbHMKKyAqIFxwYXJhbSBoZWlnaHQgaGVpZ2h0IG9mIGltYWdlIGluIHBpeGVscworICogXHBhcmFtIHN0cmlkZSBzdHJpZGUgb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKiBccGFyYW0gdnN0cmlkZSB2ZXJ0aWNhbCBzdHJpZGUgb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKi8KK01lZGlhSW1hZ2UyIENyZWF0ZVlVVjQyMFNlbWlQbGFuYXJNZWRpYUltYWdlMigKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCB2c3RyaWRlKTsKKworLyoqCisgKiBDb3BpZXMgYSBncmFwaGljIHZpZXcgaW50byBhIG1lZGlhIGltYWdlLgorICoKKyAqIFxwYXJhbSBpbWdCYXNlIGJhc2Ugb2YgTWVkaWFJbWFnZQorICogXHBhcmFtIGltZyBNZWRpYUltYWdlIGRhdGEKKyAqIFxwYXJhbSB2aWV3IGdyYXBoaWMgdmlldworICoKKyAqIFxyZXR1cm4gT0sgb24gc3VjY2VzcworICovCitzdGF0dXNfdCBJbWFnZUNvcHkodWludDhfdCAqaW1nQmFzZSwgY29uc3QgTWVkaWFJbWFnZTIgKmltZywgY29uc3QgQzJHcmFwaGljVmlldyAmdmlldyk7CisKKy8qKgorICogQ29waWVzIGEgbWVkaWEgaW1hZ2UgaW50byBhIGdyYXBoaWMgdmlldy4KKyAqCisgKiBccGFyYW0gdmlldyBncmFwaGljIHZpZXcKKyAqIFxwYXJhbSBpbWdCYXNlIGJhc2Ugb2YgTWVkaWFJbWFnZQorICogXHBhcmFtIGltZyBNZWRpYUltYWdlIGRhdGEKKyAqCisgKiBccmV0dXJuIE9LIG9uIHN1Y2Nlc3MKKyAqLworc3RhdHVzX3QgSW1hZ2VDb3B5KEMyR3JhcGhpY1ZpZXcgJnZpZXcsIGNvbnN0IHVpbnQ4X3QgKmltZ0Jhc2UsIGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpOworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZmYgYSB2aWV3IGhhcyBhIFlVViA0MjAgODg4IGxheW91dC4KKyAqLworYm9vbCBJc1lVVjQyMChjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWZmIGEgdmlldyBoYXMgYSBOVjEyIGxheW91dC4KKyAqLworYm9vbCBJc05WMTIoY29uc3QgQzJHcmFwaGljVmlldyAmdmlldyk7CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmZiBhIHZpZXcgaGFzIGEgSTQyMCBsYXlvdXQuCisgKi8KK2Jvb2wgSXNJNDIwKGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcpOworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZmYgYSBNZWRpYUltYWdlMiBoYXMgYSBZVVYgNDIwIDg4OCBsYXlvdXQuCisgKi8KK2Jvb2wgSXNZVVY0MjAoY29uc3QgTWVkaWFJbWFnZTIgKmltZyk7CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmZiBhIE1lZGlhSW1hZ2UyIGhhcyBhIE5WMTIgbGF5b3V0LgorICovCitib29sIElzTlYxMihjb25zdCBNZWRpYUltYWdlMiAqaW1nKTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWZmIGEgTWVkaWFJbWFnZTIgaGFzIGEgSTQyMCBsYXlvdXQuCisgKi8KK2Jvb2wgSXNJNDIwKGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpOworCisvKioKKyAqIEEgcmF3IG1lbW9yeSBibG9jayB0byB1c2UgZm9yIGludGVybmFsIGJ1ZmZlcnMuCisgKgorICogVE9ETzogcmVwbGFjZSB0aGlzIHdpdGggQzJMaW5lYXJCbG9ja3MgZnJvbSBhIHByaXZhdGUgQzJCbG9ja1Bvb2wKKyAqLworc3RydWN0IE1lbW9yeUJsb2NrIDogcHVibGljIEMyTWVtb3J5QmxvY2s8dWludDhfdD4geworICAgIHZpcnR1YWwgY29uc3QgdWludDhfdCogZGF0YSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCBvdmVycmlkZTsKKworICAgIGlubGluZSB1aW50OF90ICpkYXRhKCkgeworICAgICAgICByZXR1cm4gY29uc3RfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjb25zdCBNZW1vcnlCbG9jayo+KHRoaXMpLT5kYXRhKCkpOworICAgIH0KKworICAgIC8vIGFsbG9jYXRlcyBhbiB1bm1hbmFnZWQgYmxvY2sgKG5vdCBpbiBhIHBvb2wpCisgICAgc3RhdGljIE1lbW9yeUJsb2NrIEFsbG9jYXRlKHNpemVfdCk7CisKKyAgICAvLyBtZW1vcnkgYmxvY2sgd2l0aCBubyBhY3R1YWwgbWVtb3J5IChzaXplIGlzIDAsIGRhdGEgaXMgbnVsbCkKKyAgICBNZW1vcnlCbG9jaygpOworCisgICAgc3RydWN0IEltcGw7CisgICAgTWVtb3J5QmxvY2soc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwpOworICAgIHZpcnR1YWwgfk1lbW9yeUJsb2NrKCk7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworfTsKKworLyoqCisgKiBBIHJhdyBtZW1vcnkgbWluaS1wb29sLgorICovCitzdHJ1Y3QgTWVtb3J5QmxvY2tQb29sIHsKKyAgICAvKioKKyAgICAgKiBGZXRjaGVzIGEgYmxvY2sgd2l0aCBhIGdpdmVuIHNpemUuCisgICAgICoKKyAgICAgKiBccGFyYW0gc2l6ZSBzaXplIGluIGJ5dGVzCisgICAgICovCisgICAgTWVtb3J5QmxvY2sgZmV0Y2goc2l6ZV90IHNpemUpOworCisgICAgTWVtb3J5QmxvY2tQb29sKCk7CisgICAgfk1lbW9yeUJsb2NrUG9vbCgpID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0JVRkZFUl9VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGExMzFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5jcHAKQEAgLTAsMCArMSw5MTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzJNYXBwZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9va3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPiAgLy8gZm9yIElOVDMyX01BWAorCisjaW5jbHVkZSAiQ29kZWMyTWFwcGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCituYW1lc3BhY2UgeworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNBYWNQcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQywgICAgICAgICBBQUNPYmplY3RMQyB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX01BSU4sICAgICAgIEFBQ09iamVjdE1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19TU1IsICAgICAgICBBQUNPYmplY3RTU1IgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MVFAsICAgICAgICBBQUNPYmplY3RMVFAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRSwgICAgICAgICBBQUNPYmplY3RIRSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX1NDQUxBQkxFLCAgIEFBQ09iamVjdFNjYWxhYmxlIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRVJfTEMsICAgICAgQUFDT2JqZWN0RVJMQyB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VSX1NDQUxBQkxFLCBBQUNPYmplY3RFUlNjYWxhYmxlIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEQsICAgICAgICAgQUFDT2JqZWN0TEQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRV9QUywgICAgICBBQUNPYmplY3RIRV9QUyB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VMRCwgICAgICAgIEFBQ09iamVjdEVMRCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX1hIRSwgICAgICAgIEFBQ09iamVjdFhIRSB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc0F2Y0xldmVscyA9IHsKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfMSwgICAgQVZDTGV2ZWwxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzFCLCAgIEFWQ0xldmVsMWIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8xLCAgQVZDTGV2ZWwxMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18xXzIsICBBVkNMZXZlbDEyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMywgIEFWQ0xldmVsMTMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfMiwgICAgQVZDTGV2ZWwyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzJfMSwgIEFWQ0xldmVsMjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfMl8yLCAgQVZDTGV2ZWwyMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18zLCAgICBBVkNMZXZlbDMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfM18xLCAgQVZDTGV2ZWwzMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18zXzIsICBBVkNMZXZlbDMyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzQsICAgIEFWQ0xldmVsNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ180XzEsICBBVkNMZXZlbDQxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzRfMiwgIEFWQ0xldmVsNDIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfNSwgICAgQVZDTGV2ZWw1IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMSwgIEFWQ0xldmVsNTEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfNV8yLCAgQVZDTGV2ZWw1MiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ182LCAgICBBVkNMZXZlbDYgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfNl8xLCAgQVZDTGV2ZWw2MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ182XzIsICBBVkNMZXZlbDYyIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNBdmNQcm9maWxlcyA9IHsKKyAgICAvLyB0cmVhdCByZXN0cmljdGVkIHByb2ZpbGVzIGFzIGZ1bGwgcHJvZmlsZSBpZiB0aGVyZSBpcyBubyBlcXVpdmFsZW50IC0gd2hpY2ggd29ya3MgZm9yCisgICAgLy8gZGVjb2RlcnMsIGJ1dCBub3QgZm9yIGVuY29kZXJzCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQkFTRUxJTkUsICAgICAgICAgICAgICAgQVZDUHJvZmlsZUJhc2VsaW5lIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkUsICAgQVZDUHJvZmlsZUNvbnN0cmFpbmVkQmFzZWxpbmUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19NQUlOLCAgICAgICAgICAgICAgICAgICBBVkNQcm9maWxlTWFpbiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0VYVEVOREVELCAgICAgICAgICAgICAgIEFWQ1Byb2ZpbGVFeHRlbmRlZCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0gsICAgICAgICAgICAgICAgICAgIEFWQ1Byb2ZpbGVIaWdoIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfUFJPR1JFU1NJVkVfSElHSCwgICAgICAgQVZDUHJvZmlsZUhpZ2ggfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9ISUdILCAgICAgICBBVkNQcm9maWxlQ29uc3RyYWluZWRIaWdoIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF8xMCwgICAgICAgICAgICAgICAgQVZDUHJvZmlsZUhpZ2gxMCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0hfMTAsICAgIEFWQ1Byb2ZpbGVIaWdoMTAgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQyMiwgICAgICAgICAgICAgICBBVkNQcm9maWxlSGlnaDQyMiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDQ0X1BSRURJQ1RJVkUsICAgIEFWQ1Byb2ZpbGVIaWdoNDQ0IH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF8xMF9JTlRSQSwgICAgICAgICAgQVZDUHJvZmlsZUhpZ2gxMCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDIyX0lOVFJBLCAgICAgICAgIEFWQ1Byb2ZpbGVIaWdoNDIyIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF80NDRfSU5UUkEsICAgICAgICAgQVZDUHJvZmlsZUhpZ2g0NDQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19DQVZMQ180NDRfSU5UUkEsICAgICAgICBBVkNQcm9maWxlSGlnaDQ0NCB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QsIGludDMyX3Q+IHNCaXRyYXRlTW9kZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6QklUUkFURV9DT05TVCwgICAgICBCSVRSQVRFX01PREVfQ0JSIH0sCisgICAgeyBDMkNvbmZpZzo6QklUUkFURV9WQVJJQUJMRSwgICBCSVRSQVRFX01PREVfVkJSIH0sCisgICAgeyBDMkNvbmZpZzo6QklUUkFURV9JR05PUkUsICAgICBCSVRSQVRFX01PREVfQ1EgfSwKK307CisKK0FMb29rdXA8QzJDb2xvcjo6bWF0cml4X3QsIENvbG9yQXNwZWN0czo6TWF0cml4Q29lZmZzPiBzQ29sb3JNYXRyaWNlc1NmID0geworICAgIHsgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhVbnNwZWNpZmllZCB9LAorICAgIHsgQzJDb2xvcjo6TUFUUklYX0JUNzA5LCAgICAgICAgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDcwOV81IH0sCisgICAgeyBDMkNvbG9yOjpNQVRSSVhfRkNDNDdfNzNfNjgyLCAgICBDb2xvckFzcGVjdHM6Ok1hdHJpeEJUNDcwXzZNIH0sCisgICAgeyBDMkNvbG9yOjpNQVRSSVhfQlQ2MDEsICAgICAgICAgICBDb2xvckFzcGVjdHM6Ok1hdHJpeEJUNjAxXzYgfSwKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF8yNDBNLCAgICAgICBDb2xvckFzcGVjdHM6Ok1hdHJpeFNNUFRFMjQwTSB9LAorICAgIHsgQzJDb2xvcjo6TUFUUklYX0JUMjAyMCwgICAgICAgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDIwMjAgfSwKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9CVDIwMjBfQ09OU1RBTlQsIENvbG9yQXNwZWN0czo6TWF0cml4QlQyMDIwQ29uc3RhbnQgfSwKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUiwgICAgICAgICAgIENvbG9yQXNwZWN0czo6TWF0cml4T3RoZXIgfSwKK307CisKK0FMb29rdXA8QzJDb2xvcjo6cHJpbWFyaWVzX3QsIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzPiBzQ29sb3JQcmltYXJpZXNTZiA9IHsKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzVW5zcGVjaWZpZWQgfSwKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19CVDcwOSwgICAgICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzQlQ3MDlfNSB9LAorICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNDcwX00sICAgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNCVDQ3MF82TSB9LAorICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNjAxXzYyNSwgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNCVDYwMV82XzYyNSB9LAorICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNjAxXzUyNSwgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNCVDYwMV82XzUyNSB9LAorICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0dFTkVSSUNfRklMTSwgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNHZW5lcmljRmlsbSB9LAorICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0JUMjAyMCwgICAgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNCVDIwMjAgfSwKKy8vICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX1JQNDMxLCAgICAgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMuLi4gfSwKKy8vICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0VHNDMyLCAgICAgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMuLi4gfSwKKy8vICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0VCVTMyMTMsICAgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMuLi4gfSwKKyAgICB7IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiwgICAgICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzT3RoZXIgfSwKK307CisKK0FMb29rdXA8QzJDb2xvcjo6cmFuZ2VfdCwgaW50MzJfdD4gc0NvbG9yUmFuZ2VzID0geworICAgIHsgQzJDb2xvcjo6UkFOR0VfRlVMTCwgICAgQ09MT1JfUkFOR0VfRlVMTCB9LAorICAgIHsgQzJDb2xvcjo6UkFOR0VfTElNSVRFRCwgQ09MT1JfUkFOR0VfTElNSVRFRCB9LAorfTsKKworQUxvb2t1cDxDMkNvbG9yOjpyYW5nZV90LCBDb2xvckFzcGVjdHM6OlJhbmdlPiBzQ29sb3JSYW5nZXNTZiA9IHsKKyAgICB7IEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDb2xvckFzcGVjdHM6OlJhbmdlVW5zcGVjaWZpZWQgfSwKKyAgICB7IEMyQ29sb3I6OlJBTkdFX0ZVTEwsICAgICAgICBDb2xvckFzcGVjdHM6OlJhbmdlRnVsbCB9LAorICAgIHsgQzJDb2xvcjo6UkFOR0VfTElNSVRFRCwgICAgIENvbG9yQXNwZWN0czo6UmFuZ2VMaW1pdGVkIH0sCisgICAgeyBDMkNvbG9yOjpSQU5HRV9PVEhFUiwgICAgICAgQ29sb3JBc3BlY3RzOjpSYW5nZU90aGVyIH0sCit9OworCitBTG9va3VwPEMyQ29sb3I6OnRyYW5zZmVyX3QsIGludDMyX3Q+IHNDb2xvclRyYW5zZmVycyA9IHsKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX0xJTkVBUiwgQ09MT1JfVFJBTlNGRVJfTElORUFSIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl8xNzBNLCAgIENPTE9SX1RSQU5TRkVSX1NEUl9WSURFTyB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfU1QyMDg0LCBDT0xPUl9UUkFOU0ZFUl9TVDIwODQgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX0hMRywgICAgQ09MT1JfVFJBTlNGRVJfSExHIH0sCit9OworCitBTG9va3VwPEMyQ29sb3I6OnRyYW5zZmVyX3QsIENvbG9yQXNwZWN0czo6VHJhbnNmZXI+IHNDb2xvclRyYW5zZmVyc1NmID0geworICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIENvbG9yQXNwZWN0czo6VHJhbnNmZXJVbnNwZWNpZmllZCB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfTElORUFSLCAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJMaW5lYXIgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX1NSR0IsICAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyU1JHQiB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfMTcwTSwgICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJTTVBURTE3ME0gfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX0dBTU1BMjIsICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyR2FtbWEyMiB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfR0FNTUEyOCwgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJHYW1tYTI4IH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9TVDIwODQsICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclNUMjA4NCB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfSExHLCAgICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJITEcgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSXzI0ME0sICAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyU01QVEUyNDBNIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9YVllDQywgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2Zlclh2WUNDIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9CVDEzNjEsICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlckJUMTM2MSB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfU1Q0MjgsICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJTVDQyOCB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIsICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJPdGhlciB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc0RvbGJ5VmlzaW9uTGV2ZWxzID0geworICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fSERfMjQsICBEb2xieVZpc2lvbkxldmVsSGQyNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fSERfMzAsICBEb2xieVZpc2lvbkxldmVsSGQzMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fRkhEXzI0LCBEb2xieVZpc2lvbkxldmVsRmhkMjQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX0ZIRF8zMCwgRG9sYnlWaXNpb25MZXZlbEZoZDMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9GSERfNjAsIERvbGJ5VmlzaW9uTGV2ZWxGaGQ2MCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fVUhEXzI0LCBEb2xieVZpc2lvbkxldmVsVWhkMjQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX1VIRF8zMCwgRG9sYnlWaXNpb25MZXZlbFVoZDMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9VSERfNDgsIERvbGJ5VmlzaW9uTGV2ZWxVaGQ0OCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fVUhEXzYwLCBEb2xieVZpc2lvbkxldmVsVWhkNjAgfSwKKworICAgIC8vIGhpZ2ggdGllcnMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIG9uIGFuZHJvaWQsIGZvciBub3cgbWFwIHRoZW0gdG8gbWFpbiB0aWVyCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9IRF8yNCwgIERvbGJ5VmlzaW9uTGV2ZWxIZDI0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9IRF8zMCwgIERvbGJ5VmlzaW9uTGV2ZWxIZDMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9GSERfMjQsIERvbGJ5VmlzaW9uTGV2ZWxGaGQyNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfRkhEXzMwLCBEb2xieVZpc2lvbkxldmVsRmhkMzAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX0ZIRF82MCwgRG9sYnlWaXNpb25MZXZlbEZoZDYwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9VSERfMjQsIERvbGJ5VmlzaW9uTGV2ZWxVaGQyNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfVUhEXzMwLCBEb2xieVZpc2lvbkxldmVsVWhkMzAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX1VIRF80OCwgRG9sYnlWaXNpb25MZXZlbFVoZDQ4IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9VSERfNjAsIERvbGJ5VmlzaW9uTGV2ZWxVaGQ2MCB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzRG9sYnlWaXNpb25Qcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0FWX1BFUiwgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlciB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfQVZfUEVOLCBEb2xieVZpc2lvblByb2ZpbGVEdmF2UGVuIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9IRV9ERVIsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEZXIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0hFX0RFTiwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZURlbiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfSEVfMDQsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdHIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0hFXzA1LCBEb2xieVZpc2lvblByb2ZpbGVEdmhlU3RuIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9IRV9EVEgsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdGggfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0hFXzA3LCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRiIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9IRV8wOCwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0IH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9BVl8wOSwgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90PiBzSDI2M0xldmVscyA9IHsKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzEwLCBIMjYzTGV2ZWwxMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0gyNjNfMjAsIEgyNjNMZXZlbDIwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSDI2M18zMCwgSDI2M0xldmVsMzAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQwLCBIMjYzTGV2ZWw0MCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0gyNjNfNDUsIEgyNjNMZXZlbDQ1IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSDI2M181MCwgSDI2M0xldmVsNTAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzYwLCBIMjYzTGV2ZWw2MCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0gyNjNfNzAsIEgyNjNMZXZlbDcwIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNIMjYzUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0JBU0VMSU5FLCAgICAgICAgICBIMjYzUHJvZmlsZUJhc2VsaW5lIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0gzMjAsICAgICAgICAgICAgICBIMjYzUHJvZmlsZUgzMjBDb2RpbmcgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfVjFCQywgICAgICAgICAgICAgIEgyNjNQcm9maWxlQmFja3dhcmRDb21wYXRpYmxlIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lTV1YyLCAgICAgICAgICAgICBIMjYzUHJvZmlsZUlTV1YyIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lTV1YzLCAgICAgICAgICAgICBIMjYzUHJvZmlsZUlTV1YzIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0hJR0hfQ09NUFJFU1NJT04sICBIMjYzUHJvZmlsZUhpZ2hDb21wcmVzc2lvbiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JTlRFUk5FVCwgICAgICAgICAgSDI2M1Byb2ZpbGVJbnRlcm5ldCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JTlRFUkxBQ0UsICAgICAgICAgSDI2M1Byb2ZpbGVJbnRlcmxhY2UgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSElHSF9MQVRFTkNZLCAgICAgIEgyNjNQcm9maWxlSGlnaExhdGVuY3kgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNIZXZjTGV2ZWxzID0geworICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8xLCAgICAgIEhFVkNNYWluVGllckxldmVsMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yLCAgICAgIEhFVkNNYWluVGllckxldmVsMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yXzEsICAgIEhFVkNNYWluVGllckxldmVsMjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMywgICAgICBIRVZDTWFpblRpZXJMZXZlbDMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fM18xLCAgICBIRVZDTWFpblRpZXJMZXZlbDMxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzQsICAgICAgSEVWQ01haW5UaWVyTGV2ZWw0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzRfMSwgICAgSEVWQ01haW5UaWVyTGV2ZWw0MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81LCAgICAgIEhFVkNNYWluVGllckxldmVsNSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81XzEsICAgIEhFVkNNYWluVGllckxldmVsNTEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8yLCAgICBIRVZDTWFpblRpZXJMZXZlbDUyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzYsICAgICAgSEVWQ01haW5UaWVyTGV2ZWw2IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzZfMSwgICAgSEVWQ01haW5UaWVyTGV2ZWw2MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl82XzIsICAgIEhFVkNNYWluVGllckxldmVsNjIgfSwKKworICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF80LCAgICAgIEhFVkNIaWdoVGllckxldmVsNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF80XzEsICAgIEhFVkNIaWdoVGllckxldmVsNDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNSwgICAgICBIRVZDSGlnaFRpZXJMZXZlbDUgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNV8xLCAgICBIRVZDSGlnaFRpZXJMZXZlbDUxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzVfMiwgICAgSEVWQ0hpZ2hUaWVyTGV2ZWw1MiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF82LCAgICAgIEhFVkNIaWdoVGllckxldmVsNiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF82XzEsICAgIEhFVkNIaWdoVGllckxldmVsNjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNl8yLCAgICBIRVZDSGlnaFRpZXJMZXZlbDYyIH0sCisKKyAgICAvLyBtYXAgaGlnaCB0aWVyIGxldmVscyBiZWxvdyA0IHRvIG1haW4gdGllcgorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8xLCAgICAgIEhFVkNIaWdoVGllckxldmVsMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yLCAgICAgIEhFVkNIaWdoVGllckxldmVsMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yXzEsICAgIEhFVkNIaWdoVGllckxldmVsMjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMywgICAgICBIRVZDSGlnaFRpZXJMZXZlbDMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fM18xLCAgICBIRVZDSGlnaFRpZXJMZXZlbDMxIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNIZXZjUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU4sIEhFVkNQcm9maWxlTWFpbiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEwLCBIRVZDUHJvZmlsZU1haW4xMCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOX1NUSUxMLCBIRVZDUHJvZmlsZU1haW5TdGlsbCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOX0lOVFJBLCBIRVZDUHJvZmlsZU1haW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMF9JTlRSQSwgSEVWQ1Byb2ZpbGVNYWluMTAgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0hldmNIZHJQcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMCwgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMCB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzSGV2Y0hkcjEwUGx1c1Byb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEwLCBIRVZDUHJvZmlsZU1haW4xMEhEUjEwUGx1cyB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc01wZWcyTGV2ZWxzID0geworICAgIHsgQzJDb25maWc6OkxFVkVMX01QMlZfTE9XLCAgICAgICAgIE1QRUcyTGV2ZWxMTCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QMlZfTUFJTiwgICAgICAgIE1QRUcyTGV2ZWxNTCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSF8xNDQwLCAgIE1QRUcyTGV2ZWxIMTQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0gsICAgICAgICBNUEVHMkxldmVsSEwgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0hQLCAgICAgICBNUEVHMkxldmVsSFAgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc01wZWcyUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NJTVBMRSwgICAgICAgICAgICAgICAgTVBFRzJQcm9maWxlU2ltcGxlIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX01BSU4sICAgICAgICAgICAgICAgICAgTVBFRzJQcm9maWxlTWFpbiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9TTlJfU0NBTEFCTEUsICAgICAgICAgIE1QRUcyUHJvZmlsZVNOUiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9TUEFUSUFMTFlfU0NBTEFCTEUsICAgIE1QRUcyUHJvZmlsZVNwYXRpYWwgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfSElHSCwgICAgICAgICAgICAgICAgICBNUEVHMlByb2ZpbGVIaWdoIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDJWXzQyMiwgICAgICAgICAgICAgICAgICAgTVBFRzJQcm9maWxlNDIyIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90PiBzTXBlZzRMZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8wLCAgIE1QRUc0TGV2ZWwwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8wQiwgIE1QRUc0TGV2ZWwwYiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfMSwgICBNUEVHNExldmVsMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfMiwgICBNUEVHNExldmVsMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfMywgICBNUEVHNExldmVsMyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfM0IsICBNUEVHNExldmVsM2IgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzQsICAgTVBFRzRMZXZlbDQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzRBLCAgTVBFRzRMZXZlbDRhIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl81LCAgIE1QRUc0TGV2ZWw1IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl82LCAgIE1QRUc0TGV2ZWw2IH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNNcGVnNFByb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9TSU1QTEUsICAgICAgICAgICAgTVBFRzRQcm9maWxlU2ltcGxlIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRV9TQ0FMQUJMRSwgICBNUEVHNFByb2ZpbGVTaW1wbGVTY2FsYWJsZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9DT1JFLCAgICAgICAgICAgICAgTVBFRzRQcm9maWxlQ29yZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9NQUlOLCAgICAgICAgICAgICAgTVBFRzRQcm9maWxlTWFpbiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9OQklULCAgICAgICAgICAgICAgTVBFRzRQcm9maWxlTmJpdCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BUlRTLCAgICAgICAgICAgICAgTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9DT1JFX1NDQUxBQkxFLCAgICAgTVBFRzRQcm9maWxlQ29yZVNjYWxhYmxlIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0FDRSwgICAgICAgICAgICAgICBNUEVHNFByb2ZpbGVBZHZhbmNlZENvZGluZyB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BRFZBTkNFRF9DT1JFLCAgICAgTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0FEVkFOQ0VEX1NJTVBMRSwgICBNUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QsIGludDMyX3Q+IHNQY21FbmNvZGluZ3MgPSB7CisgICAgeyBDMkNvbmZpZzo6UENNXzgsIGtBdWRpb0VuY29kaW5nUGNtOGJpdCB9LAorICAgIHsgQzJDb25maWc6OlBDTV8xNiwga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCB9LAorICAgIHsgQzJDb25maWc6OlBDTV9GTE9BVCwga0F1ZGlvRW5jb2RpbmdQY21GbG9hdCB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc1ZwOUxldmVscyA9IHsKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfMSwgICAgVlA5TGV2ZWwxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzFfMSwgIFZQOUxldmVsMTEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfMiwgICAgVlA5TGV2ZWwyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzJfMSwgIFZQOUxldmVsMjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfMywgICAgVlA5TGV2ZWwzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzNfMSwgIFZQOUxldmVsMzEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfNCwgICAgVlA5TGV2ZWw0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzRfMSwgIFZQOUxldmVsNDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfNSwgICAgVlA5TGV2ZWw1IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzVfMSwgIFZQOUxldmVsNTEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfNV8yLCAgVlA5TGV2ZWw1MiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV82LCAgICBWUDlMZXZlbDYgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfNl8xLCAgVlA5TGV2ZWw2MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV82XzIsICBWUDlMZXZlbDYyIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNWcDlQcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8wLCBWUDlQcm9maWxlMCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzEsIFZQOVByb2ZpbGUxIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMiwgVlA5UHJvZmlsZTIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8zLCBWUDlQcm9maWxlMyB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzIsIFZQOVByb2ZpbGUySERSIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMywgVlA5UHJvZmlsZTNIRFIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8yLCBWUDlQcm9maWxlMkhEUjEwUGx1cyB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzMsIFZQOVByb2ZpbGUzSERSMTBQbHVzIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNWcDlIZHJQcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8yLCBWUDlQcm9maWxlMkhEUiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzMsIFZQOVByb2ZpbGUzSERSIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNWcDlIZHIxMFBsdXNQcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8yLCBWUDlQcm9maWxlMkhEUjEwUGx1cyB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzMsIFZQOVByb2ZpbGUzSERSMTBQbHVzIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90PiBzQXYxTGV2ZWxzID0geworICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV8yLCAgICBBVjFMZXZlbDIgIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMSwgIEFWMUxldmVsMjEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfMl8yLCAgQVYxTGV2ZWwyMiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV8yXzMsICBBVjFMZXZlbDIzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzMsICAgIEFWMUxldmVsMyAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfM18xLCAgQVYxTGV2ZWwzMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV8zXzIsICBBVjFMZXZlbDMyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzNfMywgIEFWMUxldmVsMzMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNCwgICAgQVYxTGV2ZWw0ICB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV80XzEsICBBVjFMZXZlbDQxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzRfMiwgIEFWMUxldmVsNDIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNF8zLCAgQVYxTGV2ZWw0MyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV81LCAgICBBVjFMZXZlbDUgIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzVfMSwgIEFWMUxldmVsNTEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNV8yLCAgQVYxTGV2ZWw1MiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV81XzMsICBBVjFMZXZlbDUzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzYsICAgIEFWMUxldmVsNiAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNl8xLCAgQVYxTGV2ZWw2MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV82XzIsICBBVjFMZXZlbDYyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzZfMywgIEFWMUxldmVsNjMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNywgICAgQVYxTGV2ZWw3ICB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV83XzEsICBBVjFMZXZlbDcxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzdfMiwgIEFWMUxldmVsNzIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfN18zLCAgQVYxTGV2ZWw3MyB9LAorfTsKKworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNBdjFQcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8wLCBBVjFQcm9maWxlMCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVYxXzEsIEFWMVByb2ZpbGUxIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMiwgQVYxUHJvZmlsZTIgfSwKK307CisKKworLyoqCisgKiBBIGhlbHBlciB0aGF0IHBhc3NlcyB0aHJvdWdoIHZlbmRvciBleHRlbnNpb24gcHJvZmlsZSBhbmQgbGV2ZWwgdmFsdWVzLgorICovCitzdHJ1Y3QgUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIDogQzJNYXBwZXI6OlByb2ZpbGVMZXZlbE1hcHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgPSAwOworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pID0gMDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CisgICAgYm9vbCBwYXNzVGhyb3VnaE1hcChUIGZyb20sIFUgKnRvKSB7CisgICAgICAgIC8vIGFsbG93IChhbmQgcGFzcyB0aHJvdWdoKSB2ZW5kb3IgZXh0ZW5zaW9ucworICAgICAgICBpZiAoZnJvbSA+PSAoVClDMl9QUk9GSUxFX0xFVkVMX1ZFTkRPUl9TVEFSVCAmJiBmcm9tIDwgKFQpSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAqdG8gPSAoVSlmcm9tOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNpbXBsZU1hcChmcm9tLCB0byk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIG1hcExldmVsKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBwYXNzVGhyb3VnaE1hcChmcm9tLCB0byk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIG1hcExldmVsKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBwYXNzVGhyb3VnaE1hcChmcm9tLCB0byk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIG1hcFByb2ZpbGUoQzJDb25maWc6OnByb2ZpbGVfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gcGFzc1Rocm91Z2hNYXAoZnJvbSwgdG8pOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBtYXBQcm9maWxlKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHBhc3NUaHJvdWdoTWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCisvLyBBQUMgb25seSB1c2VzIHByb2ZpbGVzLCBtYXAgYWxsIGxldmVscyB0byB1bnVzZWQgb3IgMAorc3RydWN0IEFhY1Byb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgKnRvID0gMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgICp0byA9IEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNBYWNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNBYWNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KK307CisKK3N0cnVjdCBBdmNQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNBdmNMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gc0F2Y0xldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNBdmNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNBdmNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KK307CisKK3N0cnVjdCBEb2xieVZpc2lvblByb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc0RvbGJ5VmlzaW9uTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNEb2xieVZpc2lvbkxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNEb2xieVZpc2lvblByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgeworICAgICAgICByZXR1cm4gc0RvbGJ5VmlzaW9uUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgSDI2M1Byb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc0gyNjNMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gc0gyNjNMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzSDI2M1Byb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgeworICAgICAgICByZXR1cm4gc0gyNjNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KK307CisKK3N0cnVjdCBIZXZjUHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICBIZXZjUHJvZmlsZUxldmVsTWFwcGVyKGJvb2wgaXNIZHIgPSBmYWxzZSwgYm9vbCBpc0hkcjEwUGx1cyA9IGZhbHNlKSA6CisgICAgICAgIFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlcigpLAorICAgICAgICBtSXNIZHIoaXNIZHIpLCBtSXNIZHIxMFBsdXMoaXNIZHIxMFBsdXMpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzSGV2Y0xldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzSGV2Y0xldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIG1Jc0hkcjEwUGx1cyA/IHNIZXZjSGRyMTBQbHVzUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgICBtSXNIZHIgPyBzSGV2Y0hkclByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0hldmNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIG1Jc0hkcjEwUGx1cyA/IHNIZXZjSGRyMTBQbHVzUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgICBtSXNIZHIgPyBzSGV2Y0hkclByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0hldmNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKworcHJpdmF0ZToKKyAgICBib29sIG1Jc0hkcjsKKyAgICBib29sIG1Jc0hkcjEwUGx1czsKK307CisKK3N0cnVjdCBNcGVnMlByb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc01wZWcyTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnMkxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnMlByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgeworICAgICAgICByZXR1cm4gc01wZWcyUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgTXBlZzRQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnNExldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzRMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzRQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnNFByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorfTsKKworLy8gVlA4IGhhcyBubyBwcm9maWxlcyBhbmQgbGV2ZWxzIGluIENvZGVjIDIuMCwgYnV0IHdlIHVzZSBtYWluIHByb2ZpbGUgYW5kIGxldmVsIDAgaW4gTWVkaWFDb2RlYworLy8gbWFwIGFsbCBwcm9maWxlcyBhbmQgbGV2ZWxzIHRvIHRoYXQuCitzdHJ1Y3QgVnA4UHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90ICp0bykgeworICAgICAgICAqdG8gPSBWUDhMZXZlbF9WZXJzaW9uMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgICp0byA9IEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3QgKnRvKSB7CisgICAgICAgICp0byA9IFZQOFByb2ZpbGVNYWluOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90LCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgeworICAgICAgICAqdG8gPSBDMkNvbmZpZzo6UFJPRklMRV9VTlVTRUQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK307CisKK3N0cnVjdCBWcDlQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIFZwOVByb2ZpbGVMZXZlbE1hcHBlcihib29sIGlzSGRyID0gZmFsc2UsIGJvb2wgaXNIZHIxMFBsdXMgPSBmYWxzZSkgOgorICAgICAgICBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIoKSwKKyAgICAgICAgbUlzSGRyKGlzSGRyKSwgbUlzSGRyMTBQbHVzKGlzSGRyMTBQbHVzKSB7fQorCisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc1ZwOUxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzVnA5TGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OnByb2ZpbGVfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gbUlzSGRyMTBQbHVzID8gc1ZwOUhkcjEwUGx1c1Byb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgbUlzSGRyID8gc1ZwOUhkclByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1ZwOVByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgeworICAgICAgICByZXR1cm4gbUlzSGRyMTBQbHVzID8gc1ZwOUhkcjEwUGx1c1Byb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgbUlzSGRyID8gc1ZwOUhkclByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1ZwOVByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorCitwcml2YXRlOgorICAgIGJvb2wgbUlzSGRyOworICAgIGJvb2wgbUlzSGRyMTBQbHVzOworfTsKKworfSAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitzdGQ6OnNoYXJlZF9wdHI8QzJNYXBwZXI6OlByb2ZpbGVMZXZlbE1hcHBlcj4KK0MyTWFwcGVyOjpHZXRQcm9maWxlTGV2ZWxNYXBwZXIoc3RkOjpzdHJpbmcgbWVkaWFUeXBlKSB7CisgICAgc3RkOjp0cmFuc2Zvcm0obWVkaWFUeXBlLmJlZ2luKCksIG1lZGlhVHlwZS5iZWdpbigpLCBtZWRpYVR5cGUuZW5kKCksIDo6dG9sb3dlcik7CisgICAgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9BVURJT19BQUMpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8QWFjUHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX0FWQykgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxBdmNQcm9maWxlTGV2ZWxNYXBwZXI+KCk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPERvbGJ5VmlzaW9uUHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX0gyNjMpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8SDI2M1Byb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19IRVZDKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEhldmNQcm9maWxlTGV2ZWxNYXBwZXI+KCk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fTVBFRzIpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8TXBlZzJQcm9maWxlTGV2ZWxNYXBwZXI+KCk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fTVBFRzQpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8TXBlZzRQcm9maWxlTGV2ZWxNYXBwZXI+KCk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fVlA4KSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPFZwOFByb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19WUDkpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8VnA5UHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworLy8gc3RhdGljCitzdGQ6OnNoYXJlZF9wdHI8QzJNYXBwZXI6OlByb2ZpbGVMZXZlbE1hcHBlcj4KK0MyTWFwcGVyOjpHZXRIZHJQcm9maWxlTGV2ZWxNYXBwZXIoc3RkOjpzdHJpbmcgbWVkaWFUeXBlLCBib29sIGlzSGRyMTBQbHVzKSB7CisgICAgc3RkOjp0cmFuc2Zvcm0obWVkaWFUeXBlLmJlZ2luKCksIG1lZGlhVHlwZS5iZWdpbigpLCBtZWRpYVR5cGUuZW5kKCksIDo6dG9sb3dlcik7CisgICAgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19IRVZDKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEhldmNQcm9maWxlTGV2ZWxNYXBwZXI+KHRydWUsIGlzSGRyMTBQbHVzKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19WUDkpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8VnA5UHJvZmlsZUxldmVsTWFwcGVyPih0cnVlLCBpc0hkcjEwUGx1cyk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICByZXR1cm4gc0JpdHJhdGVNb2Rlcy5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdCAqdG8pIHsKKyAgICByZXR1cm4gc0JpdHJhdGVNb2Rlcy5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICByZXR1cm4gc1BjbUVuY29kaW5ncy5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCAqdG8pIHsKKyAgICByZXR1cm4gc1BjbUVuY29kaW5ncy5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbG9yOjpyYW5nZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgYm9vbCByZXMgPSB0cnVlOworICAgIC8vIG1hcCBTREsgZGVmaW5lZCB2YWx1ZXMgZGlyZWN0bHkuIEZvciBvdGhlciB2YWx1ZXMsIHVzZSB3cmFwcGluZyBmcm9tIENvbG9yVXRpbHMuCisgICAgaWYgKCFzQ29sb3JSYW5nZXMubWFwKGZyb20sIHRvKSkgeworICAgICAgICBDb2xvckFzcGVjdHM6OlJhbmdlIHNmUmFuZ2U7CisKKyAgICAgICAgLy8gbWFwIGtub3duIGNvbnN0YW50cyBhbmQga2VlcCB2ZW5kb3IgZXh0ZW5zaW9ucy4gYWxsIG90aGVyIHZhbHVlcyBhcmUgbWFwcGVkIHRvICdPdGhlcicKKyAgICAgICAgaWYgKCFzQ29sb3JSYW5nZXNTZi5tYXAoZnJvbSwgJnNmUmFuZ2UpKSB7CisgICAgICAgICAgICAvLyB1c2Ugc3RhdGljIGNhc3QgYW5kIGVuc3VyZSBpdCBpcyBpbiB0aGUgZXh0ZW5zaW9uIHJhbmdlCisgICAgICAgICAgICBpZiAoZnJvbSA8IEMyQ29sb3I6OlJBTkdFX1ZFTkRPUl9TVEFSVCB8fCBmcm9tID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBzZlJhbmdlID0gQ29sb3JBc3BlY3RzOjpSYW5nZU90aGVyOworICAgICAgICAgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKnRvID0gQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclJhbmdlKHNmUmFuZ2UpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChpbnQzMl90IGZyb20sIEMyQ29sb3I6OnJhbmdlX3QgKnRvKSB7CisgICAgLy8gbWFwIFNESyBkZWZpbmVkIHZhbHVlcyBkaXJlY3RseS4gRm9yIG90aGVyIHZhbHVlcywgdXNlIHdyYXBwaW5nIGZyb20gQ29sb3JVdGlscy4KKyAgICBpZiAoIXNDb2xvclJhbmdlcy5tYXAoZnJvbSwgdG8pKSB7CisgICAgICAgIENvbG9yQXNwZWN0czo6UmFuZ2Ugc2ZSYW5nZTsKKyAgICAgICAgKHZvaWQpQ29sb3JVdGlsczo6dW53cmFwQ29sb3JBc3BlY3RzRnJvbUNvbG9yUmFuZ2UoZnJvbSwgJnNmUmFuZ2UpOworCisgICAgICAgIC8vIG1hcCBrbm93biBjb25zdGFudHMgYW5kIGtlZXAgdmVuZG9yIGV4dGVuc2lvbnMuIGFsbCBvdGhlciB2YWx1ZXMgYXJlIG1hcHBlZCB0byAnT3RoZXInCisgICAgICAgIGlmICghc0NvbG9yUmFuZ2VzU2YubWFwKHNmUmFuZ2UsIHRvKSkgeworICAgICAgICAgICAgLy8gdXNlIHN0YXRpYyBjYXN0IGFuZCBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZQorICAgICAgICAgICAgKnRvID0gKEMyQ29sb3I6OnJhbmdlX3Qpc2ZSYW5nZTsKKyAgICAgICAgICAgIGlmICgqdG8gPCBDMkNvbG9yOjpSQU5HRV9WRU5ET1JfU1RBUlQgfHwgKnRvID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICAqdG8gPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb2xvcjo6cmFuZ2VfdCBmcm9tLCBDb2xvckFzcGVjdHM6OlJhbmdlICp0bykgeworICAgIHJldHVybiBzQ29sb3JSYW5nZXNTZi5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDb2xvckFzcGVjdHM6OlJhbmdlIGZyb20sIEMyQ29sb3I6OnJhbmdlX3QgKnRvKSB7CisgICAgcmV0dXJuIHNDb2xvclJhbmdlc1NmLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllcywgQzJDb2xvcjo6bWF0cml4X3QgbWF0cml4LCBpbnQzMl90ICpzdGFuZGFyZCkgeworICAgIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzIHNmUHJpbWFyaWVzOworICAgIENvbG9yQXNwZWN0czo6TWF0cml4Q29lZmZzIHNmTWF0cml4OworICAgIGJvb2wgcmVzID0gdHJ1ZTsKKworICAgIC8vIG1hcCBrbm93biBjb25zdGFudHMgYW5kIGtlZXAgdmVuZG9yIGV4dGVuc2lvbnMuIGFsbCBvdGhlciB2YWx1ZXMgYXJlIG1hcHBlZCB0byAnT3RoZXInCisgICAgaWYgKCFzQ29sb3JQcmltYXJpZXNTZi5tYXAocHJpbWFyaWVzLCAmc2ZQcmltYXJpZXMpKSB7CisgICAgICAgIC8vIGVuc3VyZSBpdCBpcyBpbiB0aGUgZXh0ZW5zaW9uIHJhbmdlIGFuZCB1c2Ugc3RhdGljIGNhc3QKKyAgICAgICAgaWYgKHByaW1hcmllcyA8IEMyQ29sb3I6OlBSSU1BUklFU19WRU5ET1JfU1RBUlQgfHwgcHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAvLyB1bmRlZmluZWQgbm9uLWV4dGVuc2lvbiB2YWx1ZXMgbWFwIHRvICdPdGhlcicKKyAgICAgICAgICAgIHNmUHJpbWFyaWVzID0gQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNPdGhlcjsKKyAgICAgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2ZQcmltYXJpZXMgPSAoQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMpcHJpbWFyaWVzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFzQ29sb3JNYXRyaWNlc1NmLm1hcChtYXRyaXgsICZzZk1hdHJpeCkpIHsKKyAgICAgICAgLy8gdXNlIHN0YXRpYyBjYXN0IGFuZCBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZQorICAgICAgICBpZiAobWF0cml4IDwgQzJDb2xvcjo6TUFUUklYX1ZFTkRPUl9TVEFSVCB8fCBtYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgIC8vIHVuZGVmaW5lZCBub24tZXh0ZW5zaW9uIHZhbHVlcyBtYXAgdG8gJ090aGVyJworICAgICAgICAgICAgc2ZNYXRyaXggPSBDb2xvckFzcGVjdHM6Ok1hdHJpeE90aGVyOworICAgICAgICAgICAgcmVzID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZk1hdHJpeCA9IChDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcyltYXRyaXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqc3RhbmRhcmQgPSBDb2xvclV0aWxzOjp3cmFwQ29sb3JBc3BlY3RzSW50b0NvbG9yU3RhbmRhcmQoc2ZQcmltYXJpZXMsIHNmTWF0cml4KTsKKworICAgIHJldHVybiByZXM7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKGludDMyX3Qgc3RhbmRhcmQsIEMyQ29sb3I6OnByaW1hcmllc190ICpwcmltYXJpZXMsIEMyQ29sb3I6Om1hdHJpeF90ICptYXRyaXgpIHsKKyAgICAvLyBmaXJzdCBtYXAgdG8gc3RhZ2VmcmlnaHQgZm91bmRhdGlvbiBhc3BlY3RzID0+IHRoZXNlIGFjdHVhbGx5IG1hcCBuZWFybHkgMToxIHRvCisgICAgLy8gQ29kZWMgMi4wIGFzcGVjdHMKKyAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllcyBzZlByaW1hcmllczsKKyAgICBDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcyBzZk1hdHJpeDsKKyAgICBib29sIHJlcyA9IHRydWU7CisgICAgKHZvaWQpQ29sb3JVdGlsczo6dW53cmFwQ29sb3JBc3BlY3RzRnJvbUNvbG9yU3RhbmRhcmQoc3RhbmRhcmQsICZzZlByaW1hcmllcywgJnNmTWF0cml4KTsKKworICAgIC8vIG1hcCBrbm93biBjb25zdGFudHMgYW5kIGtlZXAgdmVuZG9yIGV4dGVuc2lvbnMuIGFsbCBvdGhlciB2YWx1ZXMgYXJlIG1hcHBlZCB0byAnT3RoZXInCisgICAgaWYgKCFzQ29sb3JQcmltYXJpZXNTZi5tYXAoc2ZQcmltYXJpZXMsIHByaW1hcmllcykpIHsKKyAgICAgICAgLy8gdXNlIHN0YXRpYyBjYXN0IGFuZCBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZQorICAgICAgICAqcHJpbWFyaWVzID0gKEMyQ29sb3I6OnByaW1hcmllc190KXNmUHJpbWFyaWVzOworICAgICAgICBpZiAoKnByaW1hcmllcyA8IEMyQ29sb3I6OlBSSU1BUklFU19WRU5ET1JfU1RBUlQgfHwgKnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgKnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFzQ29sb3JNYXRyaWNlc1NmLm1hcChzZk1hdHJpeCwgbWF0cml4KSkgeworICAgICAgICAvLyB1c2Ugc3RhdGljIGNhc3QgYW5kIGVuc3VyZSBpdCBpcyBpbiB0aGUgZXh0ZW5zaW9uIHJhbmdlCisgICAgICAgICptYXRyaXggPSAoQzJDb2xvcjo6bWF0cml4X3Qpc2ZNYXRyaXg7CisgICAgICAgIGlmICgqbWF0cml4IDwgQzJDb2xvcjo6TUFUUklYX1ZFTkRPUl9TVEFSVCB8fCAqbWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAqbWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICAgICAgcmVzID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbG9yOjpwcmltYXJpZXNfdCBmcm9tLCBDb2xvckFzcGVjdHM6OlByaW1hcmllcyAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yUHJpbWFyaWVzU2YubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMgZnJvbSwgQzJDb2xvcjo6cHJpbWFyaWVzX3QgKnRvKSB7CisgICAgcmV0dXJuIHNDb2xvclByaW1hcmllc1NmLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKEMyQ29sb3I6Om1hdHJpeF90IGZyb20sIENvbG9yQXNwZWN0czo6TWF0cml4Q29lZmZzICp0bykgeworICAgIHJldHVybiBzQ29sb3JNYXRyaWNlc1NmLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKENvbG9yQXNwZWN0czo6TWF0cml4Q29lZmZzIGZyb20sIEMyQ29sb3I6Om1hdHJpeF90ICp0bykgeworICAgIHJldHVybiBzQ29sb3JNYXRyaWNlc1NmLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKEMyQ29sb3I6OnRyYW5zZmVyX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICBib29sIHJlcyA9IHRydWU7CisgICAgLy8gbWFwIFNESyBkZWZpbmVkIHZhbHVlcyBkaXJlY3RseS4gRm9yIG90aGVyIHZhbHVlcywgdXNlIHdyYXBwaW5nIGZyb20gQ29sb3JVdGlscy4KKyAgICBpZiAoIXNDb2xvclRyYW5zZmVycy5tYXAoZnJvbSwgdG8pKSB7CisgICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXIgc2ZUcmFuc2ZlcjsKKworICAgICAgICAvLyBtYXAga25vd24gY29uc3RhbnRzIGFuZCBrZWVwIHZlbmRvciBleHRlbnNpb25zLiBhbGwgb3RoZXIgdmFsdWVzIGFyZSBtYXBwZWQgdG8gJ090aGVyJworICAgICAgICBpZiAoIXNDb2xvclRyYW5zZmVyc1NmLm1hcChmcm9tLCAmc2ZUcmFuc2ZlcikpIHsKKyAgICAgICAgICAgIC8vIHVzZSBzdGF0aWMgY2FzdCBhbmQgZW5zdXJlIGl0IGlzIGluIHRoZSBleHRlbnNpb24gcmFuZ2UKKyAgICAgICAgICAgIGlmIChmcm9tIDwgQzJDb2xvcjo6VFJBTlNGRVJfVkVORE9SX1NUQVJUIHx8IGZyb20gPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgICAgIHNmVHJhbnNmZXIgPSBDb2xvckFzcGVjdHM6OlRyYW5zZmVyT3RoZXI7CisgICAgICAgICAgICAgICAgcmVzID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAqdG8gPSBDb2xvclV0aWxzOjp3cmFwQ29sb3JBc3BlY3RzSW50b0NvbG9yVHJhbnNmZXIoc2ZUcmFuc2Zlcik7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKGludDMyX3QgZnJvbSwgQzJDb2xvcjo6dHJhbnNmZXJfdCAqdG8pIHsKKyAgICAvLyBtYXAgU0RLIGRlZmluZWQgdmFsdWVzIGRpcmVjdGx5LiBGb3Igb3RoZXIgdmFsdWVzLCB1c2Ugd3JhcHBpbmcgZnJvbSBDb2xvclV0aWxzLgorICAgIGlmICghc0NvbG9yVHJhbnNmZXJzLm1hcChmcm9tLCB0bykpIHsKKyAgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlciBzZlRyYW5zZmVyOworICAgICAgICAodm9pZClDb2xvclV0aWxzOjp1bndyYXBDb2xvckFzcGVjdHNGcm9tQ29sb3JUcmFuc2Zlcihmcm9tLCAmc2ZUcmFuc2Zlcik7CisKKyAgICAgICAgLy8gbWFwIGtub3duIGNvbnN0YW50cyBhbmQga2VlcCB2ZW5kb3IgZXh0ZW5zaW9ucy4gYWxsIG90aGVyIHZhbHVlcyBhcmUgbWFwcGVkIHRvICdPdGhlcicKKyAgICAgICAgaWYgKCFzQ29sb3JUcmFuc2ZlcnNTZi5tYXAoc2ZUcmFuc2ZlciwgdG8pKSB7CisgICAgICAgICAgICAvLyB1c2Ugc3RhdGljIGNhc3QgYW5kIGVuc3VyZSBpdCBpcyBpbiB0aGUgZXh0ZW5zaW9uIHJhbmdlCisgICAgICAgICAgICAqdG8gPSAoQzJDb2xvcjo6dHJhbnNmZXJfdClzZlRyYW5zZmVyOworICAgICAgICAgICAgaWYgKCp0byA8IEMyQ29sb3I6OlRSQU5TRkVSX1ZFTkRPUl9TVEFSVCB8fCAqdG8gPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgICAgICp0byA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcCgKKyAgICAgICAgQzJDb2xvcjo6cmFuZ2VfdCByYW5nZSwgQzJDb2xvcjo6cHJpbWFyaWVzX3QgcHJpbWFyaWVzLAorICAgICAgICBDMkNvbG9yOjptYXRyaXhfdCBtYXRyaXgsIEMyQ29sb3I6OnRyYW5zZmVyX3QgdHJhbnNmZXIsIHVpbnQzMl90ICpkYXRhU3BhY2UpIHsKKyNpZiAwCisgICAgLy8gcHVyZSByZWltcGxlbWVudGF0aW9uCisgICAgKmRhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsgLy8gdGhpcyBpcyAwCisKKyAgICBzd2l0Y2ggKHJhbmdlKSB7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UkFOR0VfRlVMTDogICAgKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1JBTkdFX0ZVTEw7ICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29sb3I6OlJBTkdFX0xJTUlURUQ6ICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9SQU5HRV9MSU1JVEVEOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoICh0cmFuc2ZlcikgeworICAgICAgICBjYXNlIEMyQ29sb3I6OlRSQU5TRkVSX0xJTkVBUjogICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9UUkFOU0ZFUl9MSU5FQVI7ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpUUkFOU0ZFUl9TUkdCOiAgICAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfU1JHQjsgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6VFJBTlNGRVJfMTcwTTogICAgKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1RSQU5TRkVSX1NNUFRFXzE3ME07IGJyZWFrOworICAgICAgICBjYXNlIEMyQ29sb3I6OlRSQU5TRkVSX0dBTU1BMjI6ICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9UUkFOU0ZFUl9HQU1NQTJfMjsgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpUUkFOU0ZFUl9HQU1NQTI4OiAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfR0FNTUEyXzg7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6VFJBTlNGRVJfU1QyMDg0OiAgKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1RSQU5TRkVSX1NUMjA4NDsgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29sb3I6OlRSQU5TRkVSX0hMRzogICAgICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9UUkFOU0ZFUl9ITEc7ICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoIChwcmltYXJpZXMpIHsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpQUklNQVJJRVNfQlQ2MDFfNTI1OgorICAgICAgICAgICAgKmRhdGFTcGFjZSB8PSAobWF0cml4ID09IEMyQ29sb3I6Ok1BVFJJWF8yNDBNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbWF0cml4ID09IEMyQ29sb3I6Ok1BVFJJWF9CVDcwOSkKKyAgICAgICAgICAgICAgICAgICAgPyBIQUxfREFUQVNQQUNFX1NUQU5EQVJEX0JUNjAxXzUyNV9VTkFESlVTVEVECisgICAgICAgICAgICAgICAgICAgIDogSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDYwMV81MjU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpQUklNQVJJRVNfQlQ2MDFfNjI1OgorICAgICAgICAgICAgKmRhdGFTcGFjZSB8PSAobWF0cml4ID09IEMyQ29sb3I6Ok1BVFJJWF8yNDBNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbWF0cml4ID09IEMyQ29sb3I6Ok1BVFJJWF9CVDcwOSkKKyAgICAgICAgICAgICAgICAgICAgPyBIQUxfREFUQVNQQUNFX1NUQU5EQVJEX0JUNjAxXzYyNV9VTkFESlVTVEVECisgICAgICAgICAgICAgICAgICAgIDogSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDYwMV82MjU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpQUklNQVJJRVNfQlQyMDIwOgorICAgICAgICAgICAgKmRhdGFTcGFjZSB8PSAobWF0cml4ID09IEMyQ29sb3I6Ok1BVFJJWF9CVDIwMjBfQ09OU1RBTlQKKyAgICAgICAgICAgICAgICAgICAgPyBIQUxfREFUQVNQQUNFX1NUQU5EQVJEX0JUMjAyMF9DT05TVEFOVF9MVU1JTkFOQ0UKKyAgICAgICAgICAgICAgICAgICAgOiBIQUxfREFUQVNQQUNFX1NUQU5EQVJEX0JUMjAyMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpQUklNQVJJRVNfQlQ0NzBfTToKKyAgICAgICAgICAgICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDQ3ME07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpQUklNQVJJRVNfQlQ3MDk6CisgICAgICAgICAgICAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfQlQ3MDk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorI2Vsc2UKKyAgICAvLyBmb3Igbm93IHVzZSBsZWdhY3kgaW1wbGVtZW50YXRpb24KKyAgICBDb2xvckFzcGVjdHMgYXNwZWN0czsKKyAgICBpZiAoIXNDb2xvclJhbmdlc1NmLm1hcChyYW5nZSwgJmFzcGVjdHMubVJhbmdlKSkgeworICAgICAgICBhc3BlY3RzLm1SYW5nZSA9IENvbG9yQXNwZWN0czo6UmFuZ2VVbnNwZWNpZmllZDsKKyAgICB9CisgICAgaWYgKCFzQ29sb3JQcmltYXJpZXNTZi5tYXAocHJpbWFyaWVzLCAmYXNwZWN0cy5tUHJpbWFyaWVzKSkgeworICAgICAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBDb2xvckFzcGVjdHM6OlByaW1hcmllc1Vuc3BlY2lmaWVkOworICAgIH0KKyAgICBpZiAoIXNDb2xvck1hdHJpY2VzU2YubWFwKG1hdHJpeCwgJmFzcGVjdHMubU1hdHJpeENvZWZmcykpIHsKKyAgICAgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gQ29sb3JBc3BlY3RzOjpNYXRyaXhVbnNwZWNpZmllZDsKKyAgICB9CisgICAgaWYgKCFzQ29sb3JUcmFuc2ZlcnNTZi5tYXAodHJhbnNmZXIsICZhc3BlY3RzLm1UcmFuc2ZlcikpIHsKKyAgICAgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBDb2xvckFzcGVjdHM6OlRyYW5zZmVyVW5zcGVjaWZpZWQ7CisgICAgfQorICAgICpkYXRhU3BhY2UgPSBDb2xvclV0aWxzOjpnZXREYXRhU3BhY2VGb3JDb2xvckFzcGVjdHMoYXNwZWN0cywgdHJ1ZSAvKiBtYXlFeHBhbmQgKi8pOworI2VuZGlmCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKEMyQ29sb3I6OnRyYW5zZmVyX3QgZnJvbSwgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlciAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yVHJhbnNmZXJzU2YubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQ29sb3JBc3BlY3RzOjpUcmFuc2ZlciBmcm9tLCBDMkNvbG9yOjp0cmFuc2Zlcl90ICp0bykgeworICAgIHJldHVybiBzQ29sb3JUcmFuc2ZlcnNTZi5tYXAoZnJvbSwgdG8pOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYzZmMDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQ09ERUMyX01BUFBFUl9IXworI2RlZmluZSBBTkRST0lEX0NPREVDMl9NQVBQRVJfSF8KKworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisgICAgLyoqCisgICAgICogVXRpbGl0eSBjbGFzcyB0byBtYXAgQ29kZWMgMi4wIHZhbHVlcyB0byBhbmRyb2lkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQzJNYXBwZXIgeworICAgICAgICBzdHJ1Y3QgUHJvZmlsZUxldmVsTWFwcGVyIHsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXBQcm9maWxlKEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3QqKSA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWFwUHJvZmlsZShpbnQzMl90LCBDMkNvbmZpZzo6cHJvZmlsZV90KikgPSAwOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hcExldmVsKEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90KikgPSAwOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hcExldmVsKGludDMyX3QsIEMyQ29uZmlnOjpsZXZlbF90KikgPSAwOworICAgICAgICAgICAgdmlydHVhbCB+UHJvZmlsZUxldmVsTWFwcGVyKCkgPSBkZWZhdWx0OworICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8UHJvZmlsZUxldmVsTWFwcGVyPgorICAgICAgICBHZXRQcm9maWxlTGV2ZWxNYXBwZXIoc3RkOjpzdHJpbmcgbWVkaWFUeXBlKTsKKworICAgICAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFByb2ZpbGVMZXZlbE1hcHBlcj4KKyAgICAgICAgR2V0SGRyUHJvZmlsZUxldmVsTWFwcGVyKHN0ZDo6c3RyaW5nIG1lZGlhVHlwZSwgYm9vbCBpc0hkcjEwUGx1cyA9IGZhbHNlKTsKKworICAgICAgICAvLyBjb252ZXJ0IGJldHdlZW4gYml0cmF0ZXMKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdCwgaW50MzJfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoaW50MzJfdCwgQzJDb25maWc6OmJpdHJhdGVfbW9kZV90Kik7CisKKyAgICAgICAgLy8gY29udmVydCBiZXR3ZWVuIHBjbSBlbmNvZGluZ3MKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCwgaW50MzJfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoaW50MzJfdCwgQzJDb25maWc6OnBjbV9lbmNvZGluZ190Kik7CisKKyAgICAgICAgLy8gY29udmVydCBiZXR3ZWVuIHBpY3R1cmUgdHlwZXMKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCwgaW50MzJfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoaW50MzJfdCwgQzJDb25maWc6OnBpY3R1cmVfdHlwZV90Kik7CisKKyAgICAgICAgLy8gY29udmVydCBiZXR3ZWVuIGNvbG9yIGFzcGVjdHMKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29sb3I6OnJhbmdlX3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29sb3I6OnJhbmdlX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29sb3I6OnByaW1hcmllc190LCBDMkNvbG9yOjptYXRyaXhfdCwgaW50MzJfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoaW50MzJfdCwgQzJDb2xvcjo6cHJpbWFyaWVzX3QqLCBDMkNvbG9yOjptYXRyaXhfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb2xvcjo6dHJhbnNmZXJfdCwgaW50MzJfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoaW50MzJfdCwgQzJDb2xvcjo6dHJhbnNmZXJfdCopOworCisgICAgICAgIHN0YXRpYyBib29sIG1hcCgKKyAgICAgICAgICAgICAgICBDMkNvbG9yOjpyYW5nZV90LCBDMkNvbG9yOjpwcmltYXJpZXNfdCwgQzJDb2xvcjo6bWF0cml4X3QsIEMyQ29sb3I6OnRyYW5zZmVyX3QsCisgICAgICAgICAgICAgICAgdWludDMyX3QgKmRhdGFTcGFjZSk7CisKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29sb3I6OnJhbmdlX3QsIENvbG9yQXNwZWN0czo6UmFuZ2UqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKENvbG9yQXNwZWN0czo6UmFuZ2UsIEMyQ29sb3I6OnJhbmdlX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29sb3I6OnByaW1hcmllc190LCBDb2xvckFzcGVjdHM6OlByaW1hcmllcyopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMsIEMyQ29sb3I6OnByaW1hcmllc190Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjptYXRyaXhfdCwgQ29sb3JBc3BlY3RzOjpNYXRyaXhDb2VmZnMqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKENvbG9yQXNwZWN0czo6TWF0cml4Q29lZmZzLCBDMkNvbG9yOjptYXRyaXhfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb2xvcjo6dHJhbnNmZXJfdCwgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlciopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQ29sb3JBc3BlY3RzOjpUcmFuc2ZlciwgQzJDb2xvcjo6dHJhbnNmZXJfdCopOworICAgIH07Cit9CisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DT0RFQzJfTUFQUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZTZlMjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDc5IEBACitjY190ZXN0IHsKKyAgICBuYW1lOiAiY29kZWMyX2NvcmVfcGFyYW1fdGVzdCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMlBhcmFtX3Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliY29kZWMyX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICAvLyBwYXJhbSB0ZXN0cyBtdXN0IG5vdCBkZXBlbmQgb24gYW55IGNvZGVjMiBsaWJyYXJpZXMgYXMgYWxsIHBhcmFtcyBzaG91bGQgYmUgdGVtcGxhdGVkCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiY29kZWMyX3ZuZGtfdGVzdCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMl90ZXN0LmNwcCIsCisgICAgICAgICJDMlNhbXBsZUNvbXBvbmVudF90ZXN0LmNwcCIsCisgICAgICAgICJDMlV0aWxUZXN0LmNwcCIsCisgICAgICAgICJ2bmRrL0MyQnVmZmVyVGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiY29kZWMyX3ZuZGtfaW50ZXJmYWNlX3Rlc3QiLAorCisgICAgc3JjczogWworICAgICAgICAiQzJDb21wb25lbnRJbnRlcmZhY2VfdGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJDb21wb25lbnRJbnRlcmZhY2VfdGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJDb21wb25lbnRJbnRlcmZhY2VfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdmNzMzZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMkNvbXBvbmVudEludGVyZmFjZV90ZXN0LmNwcApAQCAtMCwwICsxLDcwNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDMkNvbXBvbmVudEludGVyZmFjZV90ZXN0IgorCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorCisjaWYgIWRlZmluZWQoVU5VU0VEKQorI2RlZmluZSBVTlVTRUQoZXhwcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAodm9pZCkoZXhwcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZW5kaWYgLy8hZGVmaW5lZChVTlVTRUQpCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0ZDo6dW5pcXVlX3B0cjxUPiBhbGxvY191bmlxdWVfY3N0cihjb25zdCBjaGFyICpjc3RyKSB7CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihjc3RyKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcHRyID0gVDo6QWxsb2NVbmlxdWUobGVuKTsKKyAgICBtZW1jcHkocHRyLT5tLnZhbHVlLCBjc3RyLCBsZW4pOworICAgIHJldHVybiBwdHI7Cit9CisKK2NsYXNzIEMyQ29tcEludGZUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Citwcm90ZWN0ZWQ6CisgICAgQzJDb21wSW50ZlRlc3QoKSB7fQorICAgIH5DMkNvbXBJbnRmVGVzdCgpIG92ZXJyaWRlIHt9CisKKyAgICB2b2lkIHNldENvbXBvbmVudChzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYpIHsKKyAgICAgICAgbUludGYgPSBpbnRmOworICAgIH0KKworICAgIHZvaWQgcmVzZXRSZXN1bHRzKCkgeworICAgICAgICBtSW50ZiA9IG51bGxwdHI7CisgICAgICAgIG1QYXJhbVJlc3VsdHMuY2xlYXIoKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCB0ZXN0VW5zdXBwb3J0ZWRQYXJhbSgpOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgdGVzdFN1cHBvcnRlZFBhcmFtKCk7CisKKyAgICAvLyB0ZXN0UmVhZE9ubHlQYXJhbSgpIGFuZCB0ZXN0V3JpdGFibGVQYXJhbSgpIGFyZSB0aGUgbWFpbiBmdW5jdGlvbnMgZm9yIHRlc3RpbmcgYSBwYXJhbWV0ZXIuCisgICAgLy8gQSBjYWxsZXIgc2hvdWxkIGZpbmQgb3V0IGlmIGEgdGVzdGVkIHBhcmFtZXRlciBpcyByZWFkLW9ubHkgb3Igd3JpdGFibGUgYmVmb3JlIGNhbGxpbmcgdGhlbQorICAgIC8vIGFuZCBpdCBtdXN0IGNhbGwgb25lIG9mIHRoZSBjb3JyZXNwb25kZWQgdGhlbS4KKworICAgIC8vIElmIGEgcGFyYW1ldGVyIGlzIHJlYWQtb25seSB0aGlzIGlzIGNhbGxlZC4KKyAgICAvLyBUZXN0IHJlYWQtb25seSBwYXJhbWV0ZXIgfHByZVBhcmFtfC4gVGhlIHRlc3QgZXhwZWN0cyBmYWlsdXJlIHdoaWxlIGNvbmZpZygpIHdpdGggfG5ld1BhcmFtfCwKKyAgICAvLyBhbmQgbWFrZSBzdXJlIHxwcmVQYXJhbXwgc3RheSB1bmNoYW5nZWQuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgdm9pZCB0ZXN0UmVhZE9ubHlQYXJhbShjb25zdCBUICZwcmVQYXJhbSwgY29uc3QgVCAmbmV3UGFyYW0pOworCisgICAgLy8gSWYgYSBwYXJhbWV0ZXIgaXMgd3JpdGFibGUgdGhpcyBpcyBjYWxsZWQuCisgICAgLy8gVGVzdCBvbmUgZmlsZWQgfHdyaXRhYmxlRmllbGR8IGZvciBnaXZlbiB3cml0YWJsZSBwYXJhbWV0ZXIgfHBhcmFtfC4KKyAgICAvLyB8dmFsaWRWYWx1ZXN8IGNvbnRhaW5zIGFsbCB2YWx1ZXMgb2J0YWluZWQgZnJvbSBxdWVyeVN1cHBvcnRlZFZhbHVlcygpIGZvciB8d3JpdGFibGVGaWVsZHwuCisgICAgLy8gVGhlIHRlc3QgY2hlY2tzIHZhbGlkaXR5IGZvciBjb25maWcoKSB3aXRoIGVhY2ggdmFsdWUsIGFuZCBtYWtlIHN1cmUgdmFsdWVzIGFyZSBjb25maWctZWQKKyAgICAvLyBieSBxdWVyeSgpIHRoZW0gb3V0LiB8aW52YWxpZFZhbHVlc3wgY29udGFpbnMgc29tZSB2YWx1ZXMgd2hpY2ggYXJlIG5vdCBpbiB8dmFsaWRWYWx1ZXN8LgorICAgIC8vIFRoZSB0ZXN0IGV4cGVjdHMgQzJfQkFEX1ZBTFVFIHdoaWxlIGNvbmZpZygpIHdpdGggdGhlc2UgdmFsdWVzLAorICAgIC8vIGFuZCB8cGFyYW18IHNob3VsZCBzdGF5IHVuY2hhbmdlZC4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVFBhcmFtLCB0eXBlbmFtZSBUUmVhbEZpZWxkLCB0eXBlbmFtZSBURmllbGQ+CisgICAgdm9pZCB0ZXN0V3JpdGFibGVQYXJhbShUUGFyYW0gKmNvbnN0IHBhcmFtLCBUUmVhbEZpZWxkICpjb25zdCB3cml0YWJsZUZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VEZpZWxkPiAmdmFsaWRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxURmllbGQ+ICZpbnZhbGlkVmFsdWVzKTsKKworICAgIC8vIFRlc3QgYWxsIHRoZSBkZWZpbmVkIHBhcmFtZXRlcnMgaW4gQzJQYXJhbS5oLgorICAgIHZvaWQgdGVzdE1haW4oc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNvbXBvbmVudE5hbWUpOworCisgICAgLy8gQ2hlY2sgcGVybWlzc2lvbiBvZiBwYXJhbWV0ZXIgdHlwZSB8VHwgZm9yIHRlc3RpbmcgaW50ZXJmYWNlLgorICAgIC8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmaXJzdCBvZiB0aGUgdGVzdGluZyBwZXIgcGFyYW1ldGVyIHR5cGUsCisgICAgLy8gdGhlcmVmb3JlIGRpZmZlcmVudCB0ZXN0aW5nIHByb2Nlc3MgaXMgYXBwbGllZCBhY2NvcmRpbmcgdG8gdGhlIHBlcm1pc3Npb24gdHlwZS4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICB2b2lkIGNoZWNrUGFyYW1QZXJtaXNzaW9uKAorICAgICAgICAgICAgaW50ICpjb25zdCB3cml0YWJsZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICZzdXBwb3J0ZWRQYXJhbXMpOworCitwcml2YXRlOgorICAgIGVudW0gUGFyYW1QZXJtaXNzaW9uIDogaW50IHsKKyAgICAgICAgV1JJVEFCTEUsCisgICAgICAgIFJFQURPTkxZLAorICAgICAgICBVTlNVUFBPUlRFRCwKKyAgICB9OworCisgICAgc3RydWN0IHBhcmFtVGVzdEluZm8geworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBpbnQgcmVzdWx0OworICAgICAgICBwYXJhbVRlc3RJbmZvKGNvbnN0IGNoYXIgKm5hbWVfLCBpbnQgcmVzdWx0XykKKyAgICAgICAgICAgIDogbmFtZShuYW1lXyksIHJlc3VsdChyZXN1bHRfKSB7fQorICAgIH07CisKKyAgICAvLyBxdWVyeU9uU3RhY2soKSBhbmQgcXVlcnlvbkhlYXAoKSBib3RoIGNhbGwgYW4gaW50ZXJmYWNlJ3MgcXVlcnlfdmIoKSBhbmQKKyAgICAvLyBjaGVjayBpZiBhIGNvbXBvbmVudCBoYXMgYSBwYXJhbWV0ZXIgd2hvc2UgdHlwZSBpcyB8VHwuCisgICAgLy8gSWYgYSBjb21wb25lbnQgaGFzLCB0aGUgdmFsdWUgc2hvdWxkIGJlIGNvcGllZCBpbnRvIGFuIGFyZ3VtZW50LCB0aGF0IGlzCisgICAgLy8gfHB8IGluIHF1ZXJ5T25TdGFjaygpIGFuZCB8aGVhcFBhcmFtc3wgaW4gcXVlcnlPbkhlYXAoKS4KKyAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIGlzIGMyX3N0YXR1c190IChlLmcuIEMyX09LKS4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gYzJfc3RhdHVzX3QgcXVlcnlPblN0YWNrKFQgKmNvbnN0IHApOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgYzJfc3RhdHVzX3QgcXVlcnlPbkhlYXAoY29uc3QgVCAmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBoZWFwUGFyYW1zKTsKKworICAgIC8vIEdldCBhIHZhbHVlIHdob3NlIHR5cGUgaXMgfFR8IGluIGEgY29tcG9uZW50LiBUaGUgdmFsdWUgaXMgY29waWVkIHRvIHxwYXJhbXwuCisgICAgLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIG9ubHkgaWYgYSBjb21wb25lbnQgaGFzIHRoZSBwYXJhbWV0ZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgZ2V0VmFsdWUoVCAqY29uc3QgcGFyYW0pOworCisgICAgLy8gQ2hlY2sgaWYgdGhlIHBhcmFtZXRlcidzIHZhbHVlIGluIGNvbXBvbmVudCBpcyBlcXVhbCB0byB8ZXhwZWN0ZWR8IGFuZAorICAgIC8vIHF1ZXJ5T25TdGFjaygpIGFuZCBxdWVyeU9uSGVhcCgpIGFyZSBzdWNjZWVkZWQuIFdoZW4gdGhpcyBmdW5jdGlvbiBjYWxsZWQsCisgICAgLy8gaXQgc2hvdWxkIGJlIGd1YXJhbnRlZWQgYSBjb21wb25lbnQgaGFzIHRoZSBwYXJhbWV0ZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgcXVlcnlQYXJhbUFzRXhwZWN0ZWQoY29uc3QgVCAmZXhwZWN0ZWQpOworCisgICAgLy8gVGVzdCBpZiBxdWVyeSBmdW5jdGlvbnMgd29ya3MgY29ycmVjdGx5IGZvciBzdXBwb3J0ZWQgcGFyYW1ldGVycy4KKyAgICAvLyAiU3VwcG9ydCIgbWVhbnMgaGVyZSBhIGNvbXBvbmVudCBoYXMgdGhlIHBhcmFtZXRlci4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBxdWVyeVN1cHBvcnRlZFBhcmFtKCk7CisKKyAgICAvLyBUZXN0IHF1ZXJ5IGZ1bmN0aW9ucyB3b3JrcyBjb3JyZWN0bHkgZm9yIHVuc3VwcG9ydGVkIHBhcmFtZXRlcnMuCisgICAgLy8gIlVuc3VwcG9ydCIgbWVhbnMgaGVyZSBhIGNvbXBvbmVudCBkb2Vzbid0IGhhdmUgdGhlIHBhcmFtZXRlci4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBxdWVyeVVuc3VwcG9ydGVkUGFyYW0oKTsKKworICAgIC8vIEV4ZWN1dGUgYW4gaW50ZXJmYWNlJ3MgY29uZmlnX3ZiKCkuIHxUfCBpcyBhIHNpbmdsZSBwYXJhbWV0ZXIgdHlwZSwgbm90IHN0ZDo6dmVjdG9yLgorICAgIC8vIGNvbmZpZygpIGNyZWF0ZXMgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiB7cH0gYW5kIHBhc3NlcyBpdCB0byBjb25maWdfdmIoKS4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBjMl9zdGF0dXNfdAorICAgIGNvbmZpZyhUICpjb25zdCBwLAorICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzKTsKKworICAgIC8vIFRlc3QgaWYgY29uZmlnIHdvcmtzIGNvcnJlY3RseSBmb3IgcmVhZC1vbmx5IHBhcmFtZXRlcnMuCisgICAgLy8gQmVjYXVzZSB0aGUgZmFpbHVyZSBvZiBjb25maWcoKSBpcyBhc3N1bWVkLCB8bmV3UGFyYW18IGRvZXNuJ3QgbWF0dGVyLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIGNvbmZpZ1JlYWRPbmx5UGFyYW0oY29uc3QgVCAmbmV3UGFyYW0pOworCisgICAgLy8gVGVzdCBpZiBjb25maWcgd29ya3MgY29ycmVjdGx5IGZvciB3cml0YWJsZSBwYXJhbWV0ZXJzLgorICAgIC8vIFRoaXMgY2hhbmdlcyB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUgdG8gfG5ld1BhcmFtfC4KKyAgICAvLyB8c3RDb25maWd8IGlzIGEgcmV0dXJuIHZhbHVlIG9mIGNvbmZpZygpLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIGNvbmZpZ1dyaXRhYmxlUGFyYW1WYWxpZFZhbHVlKGNvbnN0IFQgJm5ld1BhcmFtLCBjMl9zdGF0dXNfdCAqc3RDb25maWcpOworCisgICAgLy8gVGVzdCBpZiBjb25maWcgd29ya3MgY29ycmVjdGx5IGluIHRoZSBjYXNlIGFuIGludmFsaWQgdmFsdWUgfG5ld1BhcmFtfCBpcyB0cmllZCB0byB3cml0ZQorICAgIC8vIHRvIGFuIHdyaXRhYmxlIHBhcmFtZXRlci4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBjb25maWdXcml0YWJsZVBhcmFtSW52YWxpZFZhbHVlKGNvbnN0IFQgJm5ld1BhcmFtKTsKKworICAgIC8vIENyZWF0ZSB2YWx1ZXMgZm9yIHRlc3RpbmcgZnJvbSB8dmFsaWRWYWx1ZUluZm9zfC4gVGhlIHZhbHVlcyBhcmUgcmV0dXJuZWQgYXMgYXJndW1lbnRzLgorICAgIC8vIHx2YWxpZFZhbHVlc3wgOiB2YWxpZCB2YWx1ZXMsIHdoaWNoIGNhbiBiZSB3cml0dGVuIGZvciB0aGUgcGFyYW1ldGVyLgorICAgIC8vIHxJbnZhbGlkVmFsdWVzfCA6IGludmFsaWQgdmFsdWVzLCB3aGljaCBjYW5ub3QgYmUgd3JpdHRlbiBmb3IgdGhlIHBhcmFtZXRlci4KKyAgICAvLyAgICAgICAgICAgICAgICAgICBjb25maWcoKSBzaG91bGQgYmUgZmFpbGVkIGlmIHRoZXNlIHZhbHVlcyBhcmUgdXNlZCBhcyBuZXcgdmFsdWVzLgorICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGZvciB3cml0YWJsZSBhbmQgc3VwcG9ydGVkIHBhcmFtZXRlcnMuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRGaWVsZD4KKyAgICB2b2lkIGdldFRlc3RWYWx1ZXMoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsaWRWYWx1ZUluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxURmllbGQ+ICpjb25zdCB2YWxpZFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VEZpZWxkPiAqY29uc3QgaW52YWxpZFZhbHVlcyk7CisKKyAgICAvLyBPdXRwdXQgdGhlIHN1bW1hcnkgb2YgdGVzdCByZXN1bHRzLiBDYXRlZ29yaXplcyBwYXJhbWV0ZXJzIHdpdGggdGhlaXIgY29uZmlndXJhdGlvbi4KKyAgICB2b2lkIG91dHB1dFJlc3VsdHMoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBtSW50ZjsKKyAgICBzdGQ6OnZlY3RvcjxwYXJhbVRlc3RJbmZvPiBtUGFyYW1SZXN1bHRzOworICAgIHN0ZDo6c3RyaW5nIG1DdXJyZW50UGFyYW1OYW1lOworfTsKKworLy8gZmFjdG9yeSBmdW5jdGlvbgorLy8gVE9ETyhoaXJvaCk6IEFkZCBmYWN0b3J5IGZ1bmN0aW9ucyBmb3Igb3RoZXIgdHlwZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RkOjp1bmlxdWVfcHRyPFQ+IG1ha2VQYXJhbSgpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxUPigpOworfQorCit0ZW1wbGF0ZSA8PiBzdGQ6OnVuaXF1ZV9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1ha2VQYXJhbSgpIHsKKyAgICAvLyBUT0RPKGhpcm9oKTogU2V0IG1vcmUgcHJlY2lzZSBsZW5ndGguCisgICAgcmV0dXJuIEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpBbGxvY1VuaXF1ZSgxMDApOworfQorCisjZGVmaW5lIFRSQUNFRF9GQUlMVVJFKGZ1bmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTQ09QRURfVFJBQ0UobUN1cnJlbnRQYXJhbU5hbWUpOyAgICAgICAgICAgICBcCisgICAgICAgIGZ1bmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKDo6dGVzdGluZzo6VGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHsgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlIChmYWxzZSkKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGMyX3N0YXR1c190IEMyQ29tcEludGZUZXN0OjpxdWVyeU9uU3RhY2soVCAqY29uc3QgcCkgeworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBzdGFja1BhcmFtc3twfTsKKyAgICByZXR1cm4gbUludGYtPnF1ZXJ5X3ZiKHN0YWNrUGFyYW1zLCB7fSwgQzJfRE9OVF9CTE9DSywgbnVsbHB0cik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYzJfc3RhdHVzX3QgQzJDb21wSW50ZlRlc3Q6OnF1ZXJ5T25IZWFwKAorICAgICAgICBjb25zdCBUICZwLCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBoZWFwUGFyYW1zKSB7CisgICAgdWludDMyX3QgaW5kZXggPSBwLmluZGV4KCkgJiB+MHgwM0ZFMDAwMDsKKyAgICBpZiAocC5mb3JTdHJlYW0oKSkgeworICAgICAgICBpbmRleCB8PSAoKHAuc3RyZWFtKCkgPDwgMTcpICYgMHgwMUZFMDAwMCkgfCAweDAyMDAwMDAwOworICAgIH0KKyAgICByZXR1cm4gbUludGYtPnF1ZXJ5X3ZiKHt9LCB7aW5kZXh9LCBDMl9ET05UX0JMT0NLLCBoZWFwUGFyYW1zKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgQzJDb21wSW50ZlRlc3Q6OmdldFZhbHVlKFQgKmNvbnN0IHBhcmFtKSB7CisgICAgLy8gV2hlbiBnZXRWYWx1ZSgpIGlzIGNhbGxlZCwgYSBjb21wb25lbnQgaGFzIHRvIGhhdmUgdGhlIHBhcmFtZXRlci4KKyAgICBBU1NFUlRfRVEoQzJfT0ssIHF1ZXJ5T25TdGFjayhwYXJhbSkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgQzJDb21wSW50ZlRlc3Q6OnF1ZXJ5UGFyYW1Bc0V4cGVjdGVkKGNvbnN0IFQgJmV4cGVjdGVkKSB7CisgICAgLy8gVE9ETyhoaXJvaCk6IERvbid0IGNyZWF0ZSBwYXJhbSBvbiBzdGFjayBhbmQgY2FsbCBxdWVyeU9uU3RhY2sgZm9yIGZsZXggcGFyYW1zLgorICAgIC8vIE5vdGUgdGhhdCBhbGwgdGhlIGN1cnJlbnQgc3VwcG9ydGVkIHBhcmFtZXRlcnMgYXJlIG5vbi1mbGV4IHBhcmFtcy4KKyAgICBUIHN0YWNrOworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwSGVhcCA9IG1ha2VQYXJhbTxUPigpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gaGVhcFBhcmFtczsKKworICAgIEFTU0VSVF9FUShDMl9PSywgcXVlcnlPblN0YWNrKCZzdGFjaykpOworCisgICAgLy8gfHN0YWNrfCBpcyBhIHBhcmFtZXRlciB2YWx1ZS4gVGhlIHBhcmFtZXRlciBzaXplIHNob3VsZG4ndCBiZSAwLgorICAgIEVYUEVDVF9ORSgwdSwgc3RhY2suc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoc3RhY2ssIGV4cGVjdGVkKTsKKworICAgIEFTU0VSVF9FUShDMl9PSywgcXVlcnlPbkhlYXAoKnBIZWFwLCAmaGVhcFBhcmFtcykpOworCisgICAgLy8gfCpoZWFwUGFyYW1zWzBdfCBpcyBhIHBhcmFtZXRlciB2YWx1ZS4gVGhlIHNpemUgb2YgfGhlYXBQYXJhbXN8IGhhcyB0byBiZSBvbmUuCisgICAgQVNTRVJUX0VRKDF1LCBoZWFwUGFyYW1zLnNpemUoKSk7CisgICAgRVhQRUNUX1RSVUUoaGVhcFBhcmFtc1swXSk7CisgICAgRVhQRUNUX0VRKCpoZWFwUGFyYW1zWzBdLCBleHBlY3RlZCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIEMyQ29tcEludGZUZXN0OjpxdWVyeVN1cHBvcnRlZFBhcmFtKCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwYXJhbSA9IG1ha2VQYXJhbTxUPigpOworICAgIC8vIFRoZSBjdXJyZW50IHBhcmFtZXRlcidzIHZhbHVlIGlzIGFjcXVpcmVkIGJ5IGdldFZhbHVlKCksIHdoaWNoIHNob3VsZCBiZSBzdWNjZWVkZWQuCisgICAgZ2V0VmFsdWUocGFyYW0uZ2V0KCkpOworICAgIHF1ZXJ5UGFyYW1Bc0V4cGVjdGVkKCpwYXJhbSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIEMyQ29tcEludGZUZXN0OjpxdWVyeVVuc3VwcG9ydGVkUGFyYW0oKSB7CisgICAgLy8gVE9ETyhoaXJvaCk6IERvbid0IGNyZWF0ZSBwYXJhbSBvbiBzdGFjayBhbmQgY2FsbCBxdWVyeU9uU3RhY2sgZm9yIGZsZXggcGFyYW1zLgorICAgIC8vIE5vdGUgdGhhdCBhbGwgdGhlIGN1cnJlbnQgc3VwcG9ydGVkIHBhcmFtZXRlcnMgYXJlIG5vbi1mbGV4IHBhcmFtcy4KKyAgICBUIHN0YWNrOworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwSGVhcCA9IG1ha2VQYXJhbTxUPigpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gaGVhcFBhcmFtczsKKyAgICAvLyBJZiBhIGNvbXBvbmVudCBkb2Vzbid0IGhhdmUgdGhlIHBhcmFtZXRlciwgcXVlcnlPblN0YWNrKCkgYW5kIHF1ZXJ5T25IZWFwKCkKKyAgICAvLyBzaG91bGQgcmV0dXJuIEMyX0JBRF9JTkRFWC4KKyAgICBBU1NFUlRfRVEoQzJfQkFEX0lOREVYLCBxdWVyeU9uU3RhY2soJnN0YWNrKSk7CisgICAgRVhQRUNUX0ZBTFNFKHN0YWNrKTsKKyAgICBBU1NFUlRfRVEoQzJfQkFEX0lOREVYLCBxdWVyeU9uSGVhcCgqcEhlYXAsICZoZWFwUGFyYW1zKSk7CisgICAgRVhQRUNUX0VRKDB1LCBoZWFwUGFyYW1zLnNpemUoKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYzJfc3RhdHVzX3QgQzJDb21wSW50ZlRlc3Q6OmNvbmZpZygKKyAgICAgICAgVCAqY29uc3QgcCwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcykgeworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbXN7cH07CisgICAgcmV0dXJuIG1JbnRmLT5jb25maWdfdmIocGFyYW1zLCBDMl9ET05UX0JMT0NLLCBmYWlsdXJlcyk7Cit9CisKKy8vIENyZWF0ZSBhIG5ldyBwYXJhbWV0ZXIgY29waWVkIGZyb20gfHB8LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0ZDo6dW5pcXVlX3B0cjxUPiBtYWtlUGFyYW1Gcm9tKGNvbnN0IFQgJnApIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcmV0UCA9IG1ha2VQYXJhbTxUPigpOworICAgIEVYUEVDVF9UUlVFKHJldFAtPnVwZGF0ZUZyb20ocCkpOworICAgIEVYUEVDVF9UUlVFKG1lbWNtcChyZXRQLmdldCgpLCAmcCwgc2l6ZW9mKFQpKSA9PSAwKTsKKyAgICByZXR1cm4gcmV0UDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEMyQ29tcEludGZUZXN0Ojpjb25maWdSZWFkT25seVBhcmFtKGNvbnN0IFQgJm5ld1BhcmFtKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHAgPSBtYWtlUGFyYW1Gcm9tKG5ld1BhcmFtKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbXN7cC5nZXQoKX07CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworCisgICAgLy8gY29uZmlnX3ZiIHNob3VsZCBiZSBmYWlsZWQgYmVjYXVzZSBhIHBhcmFtZXRlciBpcyByZWFkLW9ubHkuCisgICAgQVNTRVJUX0VRKEMyX0JBRF9WQUxVRSwgbUludGYtPmNvbmZpZ192YihwYXJhbXMsIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcykpOworICAgIEFTU0VSVF9FUSgxdSwgZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoQzJTZXR0aW5nUmVzdWx0OjpSRUFEX09OTFksIGZhaWx1cmVzWzBdLT5mYWlsdXJlKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEMyQ29tcEludGZUZXN0Ojpjb25maWdXcml0YWJsZVBhcmFtVmFsaWRWYWx1ZShjb25zdCBUICZuZXdQYXJhbSwgYzJfc3RhdHVzX3QgKmNvbmZpZ1Jlc3VsdCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwID0gbWFrZVBhcmFtRnJvbShuZXdQYXJhbSk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1ze3AuZ2V0KCl9OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAvLyBJbiBtb3N0IGNhc2VzLCBjb25maWdfdmIgcmV0dXJuIEMyX09LIGFuZCB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUgc2hvdWxkIGJlIGNoYW5nZWQKKyAgICAvLyB0byB8bmV3UGFyYW18LCB3aGljaCBpcyBjb25maXJtZWQgaW4gYSBjYWxsZXIgb2YgY29uZmlnV3JpdGFibGVQYXJhbVZhbHVlVmFsdWUoKS4KKyAgICAvLyBIb3dldmVyLCB0aGlzIGNhbiByZXR1cm4gfn5+fiBhbmQgdGhlIHBhcmFtZXRlcidzIHZhbHVlcyBpcyBub3QgY2hhbmdlZCwKKyAgICAvLyBiZWNhdXNlIHRoZXJlIG1heSBiZSBkZXBlbmRlbnQgbGltaXRhdGlvbnMgYmV0d2VlbiBmaWVsZHMgb3IgYmV0d2VlbiBwYXJhbWV0ZXJzLgorICAgIC8vIFRPRE8oaGlyb2gpOiBJIGhhdmUgdG8gZmlsbCB0aGUgcmV0dXJuIHZhbHVlLiBDb21tZW50cyBpbiBDMkNvbXBvbmVudC5oIGRvZXNuJ3QgbWVudGlvbgorICAgIC8vIGFib3V0IHRoZSByZXR1cm4gdmFsdWUgd2hlbiBjb25mbGljdCBoYXBwZW5zLiBJIHNldCBDMl9CQURfVkFMVUUgdG8gaXQgdGVtcG9yYXJpbHkgbm93LgorICAgIGMyX3N0YXR1c190IHN0Q29uZmlnID0gbUludGYtPmNvbmZpZ192YihwYXJhbXMsIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgaWYgKHN0Q29uZmlnID09IEMyX09LKSB7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfRVEoQzJfQkFEX1ZBTFVFLCBzdENvbmZpZyk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU2V0dGluZ1Jlc3VsdDo6Q09ORkxJQ1QsIGZhaWx1cmVzWzBdLT5mYWlsdXJlKTsKKyAgICB9CisgICAgKmNvbmZpZ1Jlc3VsdCA9IHN0Q29uZmlnOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgQzJDb21wSW50ZlRlc3Q6OmNvbmZpZ1dyaXRhYmxlUGFyYW1JbnZhbGlkVmFsdWUoY29uc3QgVCAmbmV3UGFyYW0pIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcCA9IG1ha2VQYXJhbUZyb20obmV3UGFyYW0pOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtc3twLmdldCgpfTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgLy8gQWx0aG91Z2ggYSBwYXJhbWV0ZXIgaXMgd3JpdGFibGUsIGNvbmZpZ192YiBzaG91bGQgYmUgZmFpbGVkLAorICAgIC8vIGJlY2F1c2UgYSBuZXcgdmFsdWUgaXMgaW52YWxpZC4KKyAgICBBU1NFUlRfRVEoQzJfQkFEX1ZBTFVFLCBtSW50Zi0+Y29uZmlnX3ZiKHBhcmFtcywgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKSk7CisgICAgQVNTRVJUX0VRKDF1LCBmYWlsdXJlcy5zaXplKCkpOworICAgIEVYUEVDVF9FUShDMlNldHRpbmdSZXN1bHQ6OkJBRF9WQUxVRSwgZmFpbHVyZXNbMF0tPmZhaWx1cmUpOworfQorCisvLyBUaGVyZSBpcyBvbmx5IHVzZWQgZW51bSB0eXBlIGZvciB0aGUgZmllbGQgdHlwZSwgdGhhdCBpcyBDMkNvbXBvbmVudDo6ZG9tYWluX3QuCisvLyBJZiBhbm90aGVyIGZpZWxkIHR5cGUgaXMgYWRkZWQsIGl0IGlzIG5lY2Vzc2FyeSB0byBhZGQgZnVuY3Rpb24gZm9yIHRoYXQuCit0ZW1wbGF0ZSA8Pgordm9pZCBDMkNvbXBJbnRmVGVzdDo6Z2V0VGVzdFZhbHVlcygKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsaWRWYWx1ZUluZm9zLAorICAgICAgICBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6ZG9tYWluX3Q+ICpjb25zdCB2YWxpZFZhbHVlcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OmRvbWFpbl90PiAqY29uc3QgaW52YWxpZFZhbHVlcykgeworICAgIFVOVVNFRCh2YWxpZFZhbHVlSW5mb3MpOworICAgIHZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTyk7CisgICAgdmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPKTsKKyAgICB2YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKEMyQ29tcG9uZW50OjpET01BSU5fT1RIRVIpOworCisgICAgLy8gVGhlcmUgaXMgbm8gaW52YWxpZCB2YWx1ZS4KKyAgICBVTlVTRUQoaW52YWxpZFZhbHVlcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBURmllbGQ+Cit2b2lkIEMyQ29tcEludGZUZXN0OjpnZXRUZXN0VmFsdWVzKAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWxpZFZhbHVlSW5mb3MsCisgICAgICAgIHN0ZDo6dmVjdG9yPFRGaWVsZD4gKmNvbnN0IHZhbGlkVmFsdWVzLAorICAgICAgICBzdGQ6OnZlY3RvcjxURmllbGQ+ICpjb25zdCBpbnZhbGlkVmFsdWVzKSB7CisgICAgdXNpbmcgVFN0b3JhZ2UgPSB0eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPFRGaWVsZD46OnR5cGU7CisKKyAgICAvLyBUaGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYnkgQzJWYWx1ZXMuIEMyVmFsdWU6OlByaW1pdGl2ZSBuZWVkcyB0bworICAgIC8vIGJlIHRyYW5zZm9ybWVkIHRvIGEgcHJpbWl0aXZlIHZhbHVlLiBUaGlzIGZ1bmN0aW9uIGlzIG9uZSB0byBkbyB0aGF0LgorICAgIGF1dG8gcHJpbTJWYWx1ZSA9IFtdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcHJpbSkgLT4gVEZpZWxkIHsKKyAgICAgICAgcmV0dXJuIChURmllbGQpcHJpbS5yZWY8VFN0b3JhZ2U+KCk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPFRTdG9yYWdlLCBpbnQzMl90Pjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VFN0b3JhZ2UsIHVpbnQzMl90Pjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VFN0b3JhZ2UsIGludDY0X3Q+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxUU3RvcmFnZSwgdWludDY0X3Q+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxUU3RvcmFnZSwgZmxvYXQ+Ojp2YWx1ZSwgIkludmFsaWQgVEZpZWxkIHR5cGUuIik7CisgICAgfTsKKworICAgIC8vIFRoZSBzaXplIG9mIHZhbGlkVmFsdWVJbmZvcyBpcyBvbmUuCisgICAgY29uc3QgYXV0byAmYzJGU1YgPSB2YWxpZFZhbHVlSW5mb3M7CisKKyAgICBzd2l0Y2ggKGMyRlNWLnR5cGUpIHsKKyAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdDo6RU1QVFk6IHsKKyAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZCgwKSk7CisgICAgICAgIC8vIFRPRE8oaGlyb2gpIDogU2hvdWxkIG90aGVyIGludmFsaWQgdmFsdWVzIGJlIHRlc3RlZD8KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90OjpSQU5HRTogeworICAgICAgICBjb25zdCBhdXRvICZyYW5nZSA9IGMyRlNWLnJhbmdlOworICAgICAgICBhdXRvIHJtaW4gPSBwcmltMlZhbHVlKHJhbmdlLm1pbik7CisgICAgICAgIGF1dG8gcm1heCA9IHByaW0yVmFsdWUocmFuZ2UubWF4KTsKKyAgICAgICAgYXV0byByc3RlcCA9IHByaW0yVmFsdWUocmFuZ2Uuc3RlcCk7CisKKyAgICAgICAgQVNTRVJUX0xFKHJtaW4sIHJtYXgpOworCisgICAgICAgIGlmIChyc3RlcCAhPSAwKSB7CisgICAgICAgICAgICAvLyBJbmNyZWFzZSBsaW5lYXIKKyAgICAgICAgICAgIGZvciAoYXV0byB2ID0gcm1pbjsgdiA8PSBybWF4OyB2ID0gVEZpZWxkKHYgKyByc3RlcCkpIHsKKyAgICAgICAgICAgICAgICB2YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKHYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJtaW4gPiBzdGQ6Om51bWVyaWNfbGltaXRzPFRGaWVsZD46Om1pbigpKSB7CisgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZChybWluIC0gMSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJtYXggPCBzdGQ6Om51bWVyaWNfbGltaXRzPFRGaWVsZD46Om1heCgpKSB7CisgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZChybWF4ICsgMSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IE4gPSB2YWxpZFZhbHVlcy0+c2l6ZSgpOworICAgICAgICAgICAgaWYgKE4gPj0gMikgeworICAgICAgICAgICAgICAgIGlmIChzdGQ6OmlzX3NhbWU8VEZpZWxkLCBmbG9hdD46OnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQoKHZhbGlkVmFsdWVzLT5hdCgwKSArIHZhbGlkVmFsdWVzLT5hdCgxKSkgLyAyKSk7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQoKHZhbGlkVmFsdWVzLT5hdChOIC0gMikgKyB2YWxpZFZhbHVlcy0+YXQoTiAtIDEpKSAvIDIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAocnN0ZXAgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKHZhbGlkVmFsdWVzLT5hdCgwKSArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQodmFsaWRWYWx1ZXMtPmF0KE4gLSAxKSAtIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoZXJlIHNob3VsZCBiZSB0d28gY2FzZXMsIGV4Y2VwdCBsaW5lYXIgY2FzZS4KKyAgICAgICAgICAgIC8vIDEuIGludGVnZXIgZ2VvbWV0cmljIGNhc2UKKyAgICAgICAgICAgIC8vIDIuIGZsb2F0IGdlb21ldHJpYyBjYXNlCisKKyAgICAgICAgICAgIGF1dG8gbnVtID0gcHJpbTJWYWx1ZShyYW5nZS5udW0pOworICAgICAgICAgICAgYXV0byBkZW5vbSA9IHByaW0yVmFsdWUocmFuZ2UuZGVub20pOworCisgICAgICAgICAgICAvLyBJZiBib3RoIHJhbmdlLm51bSBhbmQgcmFuZ2UuZGVub20gYXJlIDEgYW5kIHN0ZXAgaXMgMCwgd2Ugc2hvdWxkIHVzZQorICAgICAgICAgICAgLy8gVkFMVUVTLCBzaG91bGRuJ3Qgd2U/CisgICAgICAgICAgICBBU1NFUlRfRkFMU0UobnVtID09IDEgJiYgZGVub20gPT0gMSk7CisKKyAgICAgICAgICAgIC8vIChudW0gLyBkZW5vbSkgaXMgbm90IGxlc3MgdGhhbiAxLgorICAgICAgICAgICAgQVNTRVJUX0ZBTFNFKGRlbm9tID09IDApOworICAgICAgICAgICAgQVNTRVJUX0xFKGRlbm9tLCBudW0pOworICAgICAgICAgICAgZm9yIChhdXRvIHYgPSBybWluOyB2IDw9IHJtYXg7IHYgPSBURmllbGQodiAqIG51bSAvIGRlbm9tKSkgeworICAgICAgICAgICAgICAgIHZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2sodik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChybWluID4gc3RkOjpudW1lcmljX2xpbWl0czxURmllbGQ+OjptaW4oKSkgeworICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQocm1pbiAtIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChybWF4IDwgc3RkOjpudW1lcmljX2xpbWl0czxURmllbGQ+OjptYXgoKSkgeworICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQocm1heCArIDEpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IE4gPSB2YWxpZFZhbHVlcy0+c2l6ZSgpOworICAgICAgICAgICAgaWYgKE4gPj0gMikgeworICAgICAgICAgICAgICAgIGlmIChzdGQ6OmlzX3NhbWU8VEZpZWxkLCBmbG9hdD46OnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQoKHZhbGlkVmFsdWVzLT5hdCgwKSArIHZhbGlkVmFsdWVzLT5hdCgxKSkgLyAyKSk7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQoKHZhbGlkVmFsdWVzLT5hdChOIC0gMikgKyB2YWxpZFZhbHVlcy0+YXQoTiAtIDEpKSAvIDIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRWYWx1ZXMtPmF0KDEpIC0gdmFsaWRWYWx1ZXMtPmF0KDApID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZCh2YWxpZFZhbHVlcy0+YXQoMCkgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkVmFsdWVzLT5hdChOIC0gMSkgLSB2YWxpZFZhbHVlcy0+YXQoTiAtIDIpID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZCh2YWxpZFZhbHVlcy0+YXQoTiAtIDEpIC0gMSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdDo6VkFMVUVTOiB7CisgICAgICAgIGZvciAoY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwcmltIDogYzJGU1YudmFsdWVzKSB7CisgICAgICAgICAgICB2YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKHByaW0yVmFsdWUocHJpbSkpOworICAgICAgICB9CisgICAgICAgIGF1dG8gbWludiA9ICpzdGQ6Om1pbl9lbGVtZW50KHZhbGlkVmFsdWVzLT5iZWdpbigpLCB2YWxpZFZhbHVlcy0+ZW5kKCkpOworICAgICAgICBhdXRvIG1heHYgPSAqc3RkOjptYXhfZWxlbWVudCh2YWxpZFZhbHVlcy0+YmVnaW4oKSwgdmFsaWRWYWx1ZXMtPmVuZCgpKTsKKyAgICAgICAgaWYgKG1pbnYgLSAxID4gc3RkOjpudW1lcmljX2xpbWl0czxURmllbGQ+OjptaW4oKSkgeworICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZChtaW52IC0gMSkpOworICAgICAgICB9CisgICAgICAgIGlmIChtYXh2ICsgMSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8VEZpZWxkPjo6bWF4KCkpIHsKKyAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQobWF4diArIDEpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3Q6OkZMQUdTOiB7CisgICAgICAgIC8vIFRPRE8oaGlyb2gpIDogSW1wbGVtZW50IHRoZSBjYXNlIHRoYXQgcGFyYW0udHlwZSBpcyBGTEFHUy4KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEMyQ29tcEludGZUZXN0Ojp0ZXN0UmVhZE9ubHlQYXJhbShjb25zdCBUICZwcmVQYXJhbSwgY29uc3QgVCAmbmV3UGFyYW0pIHsKKyAgICBUUkFDRURfRkFJTFVSRShjb25maWdSZWFkT25seVBhcmFtKG5ld1BhcmFtKSk7CisgICAgLy8gUGFyYW1ldGVyIHZhbHVlIG11c3Qgbm90IGJlIGNoYW5nZWQKKyAgICBUUkFDRURfRkFJTFVSRShxdWVyeVBhcmFtQXNFeHBlY3RlZChwcmVQYXJhbSkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVFBhcmFtLCB0eXBlbmFtZSBUUmVhbEZpZWxkLCB0eXBlbmFtZSBURmllbGQ+Cit2b2lkIEMyQ29tcEludGZUZXN0Ojp0ZXN0V3JpdGFibGVQYXJhbSgKKyAgICAgICAgVFBhcmFtICpjb25zdCBwYXJhbSwgVFJlYWxGaWVsZCAqY29uc3Qgd3JpdGFibGVGaWVsZCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VEZpZWxkPiAmdmFsaWRWYWx1ZXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFRGaWVsZD4gJmludmFsaWRWYWx1ZXMpIHsKKyAgICBjMl9zdGF0dXNfdCBzdENvbmZpZzsKKworICAgIC8vIEdldCB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUgaW4gdGhlIGJlZ2lubmluZyBpbiBvcmRlciB0byByZXNldCB0aGUgdmFsdWUgYXQgdGhlIGVuZC4KKyAgICBUUkFDRURfRkFJTFVSRShnZXRWYWx1ZShwYXJhbSkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxUUGFyYW0+IGRlZmF1bHRQYXJhbSA9IG1ha2VQYXJhbUZyb20oKnBhcmFtKTsKKworICAgIC8vIFRlc3QgdmFsaWQgdmFsdWVzCisgICAgZm9yIChjb25zdCBhdXRvICZ2YWwgOiB2YWxpZFZhbHVlcykgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VFBhcmFtPiBwcmVQYXJhbSA9IG1ha2VQYXJhbUZyb20oKnBhcmFtKTsKKworICAgICAgICAvLyBQYXJhbSBpcyB0cnkgdG8gYmUgY2hhbmdlZAorICAgICAgICAqd3JpdGFibGVGaWVsZCA9IHZhbDsKKyAgICAgICAgVFJBQ0VEX0ZBSUxVUkUoY29uZmlnV3JpdGFibGVQYXJhbVZhbGlkVmFsdWUoKnBhcmFtLCAmc3RDb25maWcpKTsKKyAgICAgICAgaWYgKHN0Q29uZmlnID09IEMyX09LKSB7CisgICAgICAgICAgICBUUkFDRURfRkFJTFVSRShxdWVyeVBhcmFtQXNFeHBlY3RlZCgqcGFyYW0pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFBhcmFtIGlzIHVuY2hhbmdlZCBiZWNhdXNlIGEgZmllbGQgdmFsdWUgY29uZmxpY3RzIHdpdGggb3RoZXIgZmllbGQgb3IgcGFyYW1ldGVyLgorICAgICAgICAgICAgVFJBQ0VEX0ZBSUxVUkUocXVlcnlQYXJhbUFzRXhwZWN0ZWQoKnByZVBhcmFtKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTdG9yZSB0aGUgY3VycmVudCBwYXJhbWV0ZXIgaW4gb3JkZXIgdG8gdGVzdCB8cGFyYW18IGlzIHVuY2hhbmdlZAorICAgIC8vIGFmdGVyIHRyeWluZyB0byB3cml0ZSBhbiBpbnZhbGlkIHZhbHVlLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxUUGFyYW0+IGxhc3RWYWxpZFBhcmFtID0gbWFrZVBhcmFtRnJvbSgqcGFyYW0pOworCisgICAgLy8gVGVzdCBpbnZhbGlkIHZhbHVlcworICAgIGZvciAoY29uc3QgYXV0byAmdmFsIDogaW52YWxpZFZhbHVlcykgeworICAgICAgICAvLyBQYXJhbSBpcyBjaGFuZ2VkCisgICAgICAgICp3cml0YWJsZUZpZWxkID0gdmFsOworICAgICAgICBUUkFDRURfRkFJTFVSRShjb25maWdXcml0YWJsZVBhcmFtSW52YWxpZFZhbHVlKCpwYXJhbSkpOworICAgICAgICBUUkFDRURfRkFJTFVSRShxdWVyeVBhcmFtQXNFeHBlY3RlZCgqbGFzdFZhbGlkUGFyYW0pKTsKKyAgICB9CisgICAgLy8gUmVzZXQgdGhlIHBhcmFtZXRlciBieSBjb25maWcoKS4KKyAgICBUUkFDRURfRkFJTFVSRShjb25maWdXcml0YWJsZVBhcmFtVmFsaWRWYWx1ZSgqZGVmYXVsdFBhcmFtLCAmc3RDb25maWcpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgQzJDb21wSW50ZlRlc3Q6OnRlc3RVbnN1cHBvcnRlZFBhcmFtKCkgeworICAgIFRSQUNFRF9GQUlMVVJFKHF1ZXJ5VW5zdXBwb3J0ZWRQYXJhbTxUPigpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgQzJDb21wSW50ZlRlc3Q6OnRlc3RTdXBwb3J0ZWRQYXJhbSgpIHsKKyAgICBUUkFDRURfRkFJTFVSRShxdWVyeVN1cHBvcnRlZFBhcmFtPFQ+KCkpOworfQorCitib29sIGlzU3VwcG9ydGVkUGFyYW0oCisgICAgICAgIGNvbnN0IEMyUGFyYW0gJnBhcmFtLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAmc1BhcmFtcykgeworICAgIGZvciAoY29uc3QgYXV0byAmcGQgOiBzUGFyYW1zKSB7CisgICAgICAgIGlmIChwYXJhbS50eXBlKCkgPT0gcGQtPmluZGV4KCkudHlwZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6Y2hlY2tQYXJhbVBlcm1pc3Npb24oCisgICAgaW50ICpjb25zdCByZXN1bHQsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gJnN1cHBvcnRlZFBhcmFtcykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwYXJhbSA9IG1ha2VQYXJhbTxUPigpOworCisgICAgaWYgKCFpc1N1cHBvcnRlZFBhcmFtKCpwYXJhbSwgc3VwcG9ydGVkUGFyYW1zKSkgeworICAgICAgICAvLyBJZiBhIHBhcmFtZXRlciBpc24ndCBzdXBwb3J0ZWQsIGl0IGp1c3QgZmluaXNoIGFmdGVyIGNhbGxpbmcgdGVzdFVuc3VwcG9ydGVkUGFyYW0oKS4KKyAgICAgICAgdGVzdFVuc3VwcG9ydGVkUGFyYW08VD4oKTsKKyAgICAgICAgKnJlc3VsdCA9IFBhcmFtUGVybWlzc2lvbjo6VU5TVVBQT1JURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0ZXN0U3VwcG9ydGVkUGFyYW08VD4oKTsKKworICAgIFRSQUNFRF9GQUlMVVJFKGdldFZhbHVlKHBhcmFtLmdldCgpKSk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIC8vIENvbmZpZyBkb2VzIG5vdCBjaGFuZ2UgdGhlIHBhcmFtZXRlciwgYmVjYXVzZSBwYXJhbSBpcyB0aGUgcHJlc2VudCBwYXJhbS4KKyAgICAvLyBUaGlzIGNvbmZpZyBpcyBleGVjdXRlZCB0byBmaW5kIG91dCBpZiBhIHBhcmFtZXRlciBpcyByZWFkLW9ubHkgb3Igd3JpdGFibGUuCisgICAgYzJfc3RhdHVzX3Qgc3RTdGFjayA9IGNvbmZpZyhwYXJhbS5nZXQoKSwgJmZhaWx1cmVzKTsKKyAgICBpZiAoc3RTdGFjayA9PSBDMl9CQURfVkFMVUUpIHsKKyAgICAgICAgLy8gUmVhZC1vbmx5CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBuZXdQYXJhbSA9IG1ha2VQYXJhbTxUPigpOworICAgICAgICB0ZXN0UmVhZE9ubHlQYXJhbSgqcGFyYW0sICpuZXdQYXJhbSk7CisgICAgICAgICpyZXN1bHQgPSBQYXJhbVBlcm1pc3Npb246OlJFQURPTkxZOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdyaXRhYmxlCisgICAgICAgIEVYUEVDVF9FUShzdFN0YWNrLCBDMl9PSyk7CisgICAgICAgICpyZXN1bHQgPSBQYXJhbVBlcm1pc3Npb246OldSSVRBQkxFOworICAgIH0KK30KKwordm9pZCBDMkNvbXBJbnRmVGVzdDo6b3V0cHV0UmVzdWx0cyhjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYXJhbXNbM107CisgICAgZm9yIChjb25zdCBhdXRvICZ0ZXN0SW5mbyA6IG1QYXJhbVJlc3VsdHMpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IHRlc3RJbmZvLnJlc3VsdDsKKyAgICAgICAgQVNTRVJUX1RSVUUoMCA8PSByZXN1bHQgJiYgcmVzdWx0IDw9IDIpOworICAgICAgICBwYXJhbXNbcmVzdWx0XS5lbXBsYWNlX2JhY2sodGVzdEluZm8ubmFtZSk7CisgICAgfQorICAgIGNvbnN0IGNoYXIgKnJlc3VsdFN0cmluZ1tdID0geyJXcml0YWJsZSIsICJSZWFkLU9ubHkiLCAiVW5zdXBwb3J0ZWQifTsKKyAgICBwcmludGYoIlxuLS0tLVRFU1QgUkVTVUxUUyAoJXMpLS0tLVxuXG4iLCBuYW1lLmNfc3RyKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIHByaW50ZigiWyAlcyBdXG4iLCByZXN1bHRTdHJpbmdbaV0pOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnQgOiBwYXJhbXNbaV0pIHsKKyAgICAgICAgICAgIHByaW50ZigiJXNcbiIsIHQuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0KK30KKworI2RlZmluZSBURVNUX0dFTkVSQUxfV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXywgZmllbGRfbmFtZV8pIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFRQYXJhbV8+IHBhcmFtID0gbWFrZVBhcmFtPFRQYXJhbV8+KCk7ICAgICAgICAgIFwKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiB2YWxpZFZhbHVlSW5mb3MgPSB7ICAgIFwKKyAgICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q3VycmVudCggICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbUZpZWxkKHBhcmFtLmdldCgpLCAmZmllbGRfdHlwZV9uYW1lXzo6ZmllbGRfbmFtZV8pKSBcCisgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFTU0VSVF9FUShDMl9PSywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfdmIodmFsaWRWYWx1ZUluZm9zLCBDMl9ET05UX0JMT0NLKSk7ICAgICBcCisgICAgICAgIEFTU0VSVF9FUSgxdSwgdmFsaWRWYWx1ZUluZm9zLnNpemUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0ZDo6dmVjdG9yPGRlY2x0eXBlKHBhcmFtLT5maWVsZF9uYW1lXyk+IHZhbGlkVmFsdWVzOyAgICAgICAgICBcCisgICAgICAgIHN0ZDo6dmVjdG9yPGRlY2x0eXBlKHBhcmFtLT5maWVsZF9uYW1lXyk+IGludmFsaWRWYWx1ZXM7ICAgICAgICBcCisgICAgICAgIGdldFRlc3RWYWx1ZXModmFsaWRWYWx1ZUluZm9zWzBdLnZhbHVlcywgJnZhbGlkVmFsdWVzLCAmaW52YWxpZFZhbHVlcyk7ICAgXAorICAgICAgICB0ZXN0V3JpdGFibGVQYXJhbShwYXJhbS5nZXQoKSwgJnBhcmFtLT5maWVsZF9uYW1lXywgdmFsaWRWYWx1ZXMsXAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVEVTVF9WU1NUUlVDVF9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfKSAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8sIHdpZHRoKTsgIFwKKyAgICAgICAgVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8sIGhlaWdodCk7IFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRFU1RfVTMyX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8pICAgICAgICAgICAgICBcCisgIFRFU1RfR0VORVJBTF9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfLCB2YWx1ZSkKKworI2RlZmluZSBURVNUX0VOVU1fV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXykgICAgICAgICAgICAgXAorICBURVNUX0dFTkVSQUxfV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXywgdmFsdWUpCisKKy8vIFRPRE8oaGlyb2gpOiBTdXBwb3J0IHBhcmFtZXRlcnMgYmFzZWQgb24gY2hhcltdIGFuZCB1aW50MzJfdFtdLgorLy8jZGVmaW5lIFRFU1RfU1RSSU5HX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8pCisvLyBURVNUX0dFTkVSQUxfV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXywgbS52YWx1ZSkKKy8vI2RlZmluZSBURVNUX1UzMkFSUkFZX1dSSVRBQkxFX0ZJRUxEKFRwYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8pCisvLyBURVNUX0dFTkVSQUxfV1JJVEFCTEVfRklFTEQoVHBhcmFtXywgdWludDMyX3RbXSwgZmllbGRfdHlwZV9uYW1lXywgdmFsdWVzKQorCisjZGVmaW5lIEVBQ0hfVEVTVChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfLCB0ZXN0X25hbWUpICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgcmVzdWx0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0aGlzLT5tQ3VycmVudFBhcmFtTmFtZSA9ICNUUGFyYW1fOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjaGVja1BhcmFtUGVybWlzc2lvbjxUUGFyYW1fPigmcmVzdWx0LCBzdXBwb3J0ZWRQYXJhbXMpOyAgICAgICAgICBcCisgICAgICBpZiAocmVzdWx0ID09IFBhcmFtUGVybWlzc2lvbjo6V1JJVEFCTEUpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgdGVzdF9uYW1lKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtUGFyYW1SZXN1bHRzLmVtcGxhY2VfYmFjaygjVFBhcmFtXywgcmVzdWx0KTsgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEVBQ0hfVEVTVF9TRUxGKHR5cGVfLCB0ZXN0X25hbWUpIEVBQ0hfVEVTVCh0eXBlXywgdHlwZV8sIHRlc3RfbmFtZSkKKyNkZWZpbmUgRUFDSF9URVNUX0lOUFVUKHR5cGVfLCB0ZXN0X25hbWUpIEVBQ0hfVEVTVCh0eXBlXzo6aW5wdXQsIHR5cGVfLCB0ZXN0X25hbWUpCisjZGVmaW5lIEVBQ0hfVEVTVF9PVVRQVVQodHlwZV8sIHRlc3RfbmFtZSkgRUFDSF9URVNUKHR5cGVfOjpvdXRwdXQsIHR5cGVfLCB0ZXN0X25hbWUpCit2b2lkIEMyQ29tcEludGZUZXN0Ojp0ZXN0TWFpbihzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY29tcG9uZW50TmFtZSkgeworICAgIHNldENvbXBvbmVudChpbnRmKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IHN1cHBvcnRlZFBhcmFtczsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIG1JbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtc19uYigmc3VwcG9ydGVkUGFyYW1zKSk7CisKKyAgICBFQUNIX1RFU1RfU0VMRihDMkFjdHVhbFBpcGVsaW5lRGVsYXlUdW5pbmcsIFRFU1RfVTMyX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfU0VMRihDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nLCBURVNUX1UzMl9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX0lOUFVUKEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nLCBURVNUX1UzMl9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX09VVFBVVChDMlBvcnRBY3R1YWxEZWxheVR1bmluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9JTlBVVChDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nLCBURVNUX1UzMl9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX09VVFBVVChDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nLCBURVNUX1UzMl9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX0lOUFVUKEMyUG9ydFN0cmVhbUNvdW50VHVuaW5nLCBURVNUX1UzMl9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX09VVFBVVChDMlBvcnRTdHJlYW1Db3VudFR1bmluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworCisgICAgRUFDSF9URVNUX1NFTEYoQzJDb21wb25lbnREb21haW5TZXR0aW5nLCBURVNUX0VOVU1fV1JJVEFCTEVfRklFTEQpOworCisgICAgLy8gVE9ETyhoaXJvaCk6IFN1cHBvcnQgcGFyYW1ldGVycyBiYXNlZCBvbiB1aW50MzJfdFtdIGFuZCBjaGFyW10uCisgICAgLy8gRUFDSF9URVNUX0lOUFVUKEMyUG9ydE1lZGlhVHlwZVNldHRpbmcsIFRFU1RfU1RSSU5HX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICAvLyBFQUNIX1RFU1RfT1VUUFVUKEMyUG9ydE1lZGlhVHlwZVNldHRpbmcsIFRFU1RfU1RSSU5HX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICAvLyBFQUNIX1RFU1RfSU5QVVQoQzJTdHJlYW1NaW1lQ29uZmlnLCBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX09VVFBVVChDMlN0cmVhbU1pbWVDb25maWcsIFRFU1RfU1RSSU5HX1dSSVRBQkxFX0ZJRUxEKTsKKworICAgIC8vIEVBQ0hfVEVTVF9TRUxGKEMyU3VwcG9ydGVkUGFyYW1zSW5mbywgVEVTVF9VMzJBUlJBWV9XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX1NFTEYoQzJSZXF1aXJlZFBhcmFtc0luZm8sIFRFU1RfVTMyQVJSQVlfV1JJVEFCTEVfRklFTEQpOworICAgIC8vIEVBQ0hfVEVTVF9TRUxGKEMyUmVhZE9ubHlQYXJhbXNJbmZvLCBURVNUX1UzMkFSUkFZX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICAvLyBFQUNIX1RFU1RfU0VMRihDMlJlcXVlc3RlZEluZm9zSW5mbywgVEVTVF9VMzJBUlJBWV9XUklUQUJMRV9GSUVMRCk7CisKKyAgICBFQUNIX1RFU1RfSU5QVVQoQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm8sIFRFU1RfVlNTVFJVQ1RfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9PVVRQVVQoQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm8sIFRFU1RfVlNTVFJVQ1RfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9JTlBVVChDMlN0cmVhbVBpY3R1cmVTaXplSW5mbywgVEVTVF9WU1NUUlVDVF9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX09VVFBVVChDMlN0cmVhbVBpY3R1cmVTaXplSW5mbywgVEVTVF9WU1NUUlVDVF9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX0lOUFVUKEMyTWF4VmlkZW9TaXplSGludFBvcnRTZXR0aW5nLCBURVNUX1ZTU1RSVUNUX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfT1VUUFVUKEMyTWF4VmlkZW9TaXplSGludFBvcnRTZXR0aW5nLCBURVNUX1ZTU1RSVUNUX1dSSVRBQkxFX0ZJRUxEKTsKKworICAgIG91dHB1dFJlc3VsdHMoY29tcG9uZW50TmFtZSk7CisgICAgcmVzZXRSZXN1bHRzKCk7Cit9CisKK1RFU1RfRihDMkNvbXBJbnRmVGVzdCwgQzJWNEwyQ29kZWNJbnRmKSB7CisKKyAgICAvLyBSZWFkIGEgc2hhcmVkIG9iamVjdCBsaWJyYXJ5LgorICAgIHZvaWQqIGNvbXBMaWIgPSBkbG9wZW4oInN5c3RlbS9saWIvbGlidjRsMl9jb2RlYzIuc28iLCBSVExEX05PVyk7CisKKyAgICBpZiAoIWNvbXBMaWIpIHsKKyAgICAgICAgcHJpbnRmKCJDYW5ub3Qgb3BlbiBsaWJyYXJ5OiAlcy5cbiIsIGRsZXJyb3IoKSk7CisgICAgICAgIEZBSUwoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHR5cGVkZWYgQzJDb21wb25lbnRTdG9yZSogY3JlYXRlX3QoKTsKKyAgICBjcmVhdGVfdCogY3JlYXRlX3N0b3JlPSAoY3JlYXRlX3QqKSBkbHN5bShjb21wTGliLCAiY3JlYXRlX3N0b3JlIik7CisgICAgY29uc3QgY2hhciogZGxzeW1fZXJyb3IgPSBkbGVycm9yKCk7CisgICAgaWYgKGRsc3ltX2Vycm9yKSB7CisgICAgICAgIHByaW50ZigiQ2Fubm90IGxvYWQgc3ltYm9sIGNyZWF0ZTogJXMuXG4iLCBkbHN5bV9lcnJvcik7CisgICAgICAgIEZBSUwoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHR5cGVkZWYgdm9pZCBkZXN0cm95X3QoQzJDb21wb25lbnRTdG9yZSopOworICAgIGRlc3Ryb3lfdCogZGVzdHJveV9zdG9yZSA9IChkZXN0cm95X3QqKSBkbHN5bShjb21wTGliLCAiZGVzdHJveV9zdG9yZSIpOworICAgIGRsc3ltX2Vycm9yID0gZGxlcnJvcigpOworICAgIGlmIChkbHN5bV9lcnJvcikgeworICAgICAgICBwcmludGYoIkNhbm5vdCBsb2FkIHN5bWJvbCBkZXN0cm95OiAlcy5cbiIsIGRsc3ltX2Vycm9yKTsKKyAgICAgICAgRkFJTCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IGNvbXBvbmVudFN0b3JlKGNyZWF0ZV9zdG9yZSgpLCBkZXN0cm95X3N0b3JlKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGNvbXBvbmVudEludGY7CisgICAgY29tcG9uZW50U3RvcmUtPmNyZWF0ZUludGVyZmFjZSgidjRsMi5kZWNvZGVyIiwgJmNvbXBvbmVudEludGYpOworICAgIGF1dG8gY29tcG9uZW50TmFtZSA9ICJDMlY0TDJDb2RlYyI7CisgICAgdGVzdE1haW4oY29tcG9uZW50SW50ZiwgY29tcG9uZW50TmFtZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyUGFyYW1fdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY0ZDRkMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMjUxNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlBhcmFtX3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXworI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisKK3ZvaWQgUHJpbnRUbyhjb25zdCBfQzJGaWVsZElkICZpZCwgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgKm9zIDw8ICJAIiA8PCBpZC5fbU9mZnNldCA8PCAiKyIgPDwgaWQuX21TaXplOworfQorCit2b2lkIFByaW50VG8oY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkLCA6OnN0ZDo6b3N0cmVhbSAqb3MpIHsKKyAgICB1c2luZyBGRD1DMkZpZWxkRGVzY3JpcHRvcjsKKyAgICBzd2l0Y2ggKGZkLnR5cGUoKSkgeworICAgIGNhc2UgRkQ6OklOVDMyOiAqb3MgPDwgImkzMiI7IGJyZWFrOworICAgIGNhc2UgRkQ6OklOVDY0OiAqb3MgPDwgImk2NCI7IGJyZWFrOworICAgIGNhc2UgRkQ6OlVJTlQzMjogKm9zIDw8ICJ1MzIiOyBicmVhazsKKyAgICBjYXNlIEZEOjpVSU5UNjQ6ICpvcyA8PCAidTY0IjsgYnJlYWs7CisgICAgY2FzZSBGRDo6RkxPQVQ6ICpvcyA8PCAiZmxvYXQiOyBicmVhazsKKyAgICBjYXNlIEZEOjpTVFJJTkc6ICpvcyA8PCAiY2hhciI7IGJyZWFrOworICAgIGNhc2UgRkQ6OkJMT0I6ICpvcyA8PCAidTgiOyBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBpZiAoZmQudHlwZSgpICYgRkQ6OlNUUlVDVF9GTEFHKSB7CisgICAgICAgICAgICAqb3MgPDwgInN0cnVjdC0iIDw8IChmZC50eXBlKCkgJiB+RkQ6OlNUUlVDVF9GTEFHKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpvcyA8PCAidHlwZS0iIDw8IGZkLnR5cGUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAqb3MgPDwgIiAiIDw8IGZkLm5hbWUoKTsKKyAgICBpZiAoZmQuZXh0ZW50KCkgPiAxKSB7CisgICAgICAgICpvcyA8PCAiWyIgPDwgZmQuZXh0ZW50KCkgPDwgIl0iOworICAgIH0gZWxzZSBpZiAoZmQuZXh0ZW50KCkgPT0gMCkgeworICAgICAgICAqb3MgPDwgIltdIjsKKyAgICB9CisgICAgKm9zIDw8ICIgKCI7CisgICAgUHJpbnRUbyhmZC5fbUZpZWxkSWQsIG9zKTsKKyAgICAqb3MgPDwgIioiIDw8IGZkLmV4dGVudCgpIDw8ICIpIjsKK30KKworZW51bSBDMlBhcmFtSW5kZXhUeXBlIDogQzJQYXJhbTo6dHlwZV9pbmRleF90IHsKKyAgICBrUGFyYW1JbmRleE51bWJlciwKKyAgICBrUGFyYW1JbmRleE51bWJlcnMsCisgICAga1BhcmFtSW5kZXhOdW1iZXIyLAorICAgIGtQYXJhbUluZGV4VmVuZG9yU3RhcnQgPSBDMlBhcmFtOjpUWVBFX0lOREVYX1ZFTkRPUl9TVEFSVCwKKyAgICBrUGFyYW1JbmRleFZlbmRvck51bWJlcnMsCit9OworCit2b2lkIGZmZmYoaW50KCopKGludCkpIHt9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNUUlVDVCBERUNMQVJBVElPTiBBTkQgREVTQ1JJUFRJT04gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwordHlwZWRlZiBDMkZpZWxkRGVzY3JpcHRvciBGRDsKKworY2xhc3MgQzJQYXJhbVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK307CisKK2NsYXNzIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0CisgICAgICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+IHsKK307CisKK2VudW0geworICAgIGtQYXJhbUluZGV4U2l6ZSwKKyAgICBrUGFyYW1JbmRleFRlc3RBLAorICAgIGtQYXJhbUluZGV4VGVzdEIsCisgICAga1BhcmFtSW5kZXhUZXN0RmxleFMzMiwKKyAgICBrUGFyYW1JbmRleFRlc3RGbGV4RW5kUzMyLAorICAgIGtQYXJhbUluZGV4VGVzdEZsZXhTNjQsCisgICAga1BhcmFtSW5kZXhUZXN0RmxleEVuZFM2NCwKKyAgICBrUGFyYW1JbmRleFRlc3RGbGV4U2l6ZSwKKyAgICBrUGFyYW1JbmRleFRlc3RGbGV4RW5kU2l6ZSwKK307CisKK3N0cnVjdCBDMlNpemVTdHJ1Y3QgeworICAgIGludDMyX3Qgd2lkdGg7CisgICAgaW50MzJfdCBoZWlnaHQ7CisgICAgZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4U2l6ZSB9OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDw9IG5lZWRlZCBmb3IgQzJGaWVsZERlc2NyaXB0b3IKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7ICAvLyA8PSBuZWVkZWQgZm9yIEMyRmllbGREZXNjcmlwdG9yCisgICAgY29uc3Qgc3RhdGljIEZEOjp0eXBlX3QgVFlQRSA9IChGRDo6dHlwZV90KShDT1JFX0lOREVYIHwgRkQ6OlNUUlVDVF9GTEFHKTsKK307CisKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKEMyU2l6ZVN0cnVjdCkKKworLy8gVGVzdCAxLiBkZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aG91dCBhbnkgaGVscGVyIG1ldGhvZHMKKworYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZhLCBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmYikgeworICAgIHJldHVybiBhLnR5cGUoKSA9PSBiLnR5cGUoKQorICAgICAgICAgICAgJiYgYS5leHRlbnQoKSA9PSBiLmV4dGVudCgpCisgICAgICAgICAgICAmJiBhLm5hbWUoKSA9PSBiLm5hbWUoKQorICAgICAgICAgICAgJiYgYS5fbUZpZWxkSWQgPT0gYi5fbUZpZWxkSWQ7Cit9CisKK3N0cnVjdCBDMlRlc3RTdHJ1Y3RfQSB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQ2NF90IHNpZ25lZDY0WzJdOworICAgIHVpbnQzMl90IHVuc2lnbmVkMzJbMV07CisgICAgdWludDY0X3QgdW5zaWduZWQ2NDsKKyAgICBmbG9hdCBmcDMyOworICAgIEMyU2l6ZVN0cnVjdCBzelszXTsKKyAgICB1aW50OF90IGJsb2JbMTAwXTsKKyAgICBjaGFyIHN0cmluZ1sxMDBdOworICAgIGJvb2wgeWVzTm9bMTAwXTsKKworICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX0ZJRUxEX0xJU1Q7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKKyAgICAvLyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXhUZXN0IH07CisgICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfQSBfdHlwZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfQTo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfQTo6X0ZJRUxEX0xJU1QgPQorICAgIHsgeyBGRDo6SU5UMzIsICAgIDEsICJzMzIiLCAgIDAsIDQgfSwKKyAgICAgIHsgRkQ6OklOVDY0LCAgICAyLCAiczY0IiwgICA0LCA4IH0sCisgICAgICB7IEZEOjpVSU5UMzIsICAgMSwgInUzMiIsICAyMCwgNCB9LAorICAgICAgeyBGRDo6VUlOVDY0LCAgIDEsICJ1NjQiLCAgMjQsIDggfSwKKyAgICAgIHsgRkQ6OkZMT0FULCAgICAxLCAiZnAiLCAgIDMyLCA0IH0sCisgICAgICB7IEMyU2l6ZVN0cnVjdDo6VFlQRSwgMywgInNpemUiLCAzNiwgOCB9LAorICAgICAgeyBGRDo6QkxPQiwgICAxMDAsICJibG9iIiwgNjAsIDEgfSwKKyAgICAgIHsgRkQ6OlNUUklORywgMTAwLCAic3RyIiwgMTYwLCAxIH0sCisgICAgICB7IEZEOjpCTE9CLCAgIDEwMCwgInktbiIsIDI2MCwgMSB9IH07CisKK1RFU1RfUChDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgVmVyaWZ5U3RydWN0KSB7CisgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IEdldFBhcmFtKCksIGV4cGVjdGVkID0gQzJUZXN0U3RydWN0X0E6Ol9GSUVMRF9MSVNUOworCisgICAgLy8gdmVyaWZ5IGZpcnN0IGZpZWxkIGRlc2NyaXB0b3IKKyAgICBFWFBFQ1RfRVEoRkQ6OklOVDMyLCBmaWVsZHNbMF0udHlwZSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoInMzMiIsIGZpZWxkc1swXS5uYW1lKCkuY19zdHIoKSk7CisgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHNbMF0uZXh0ZW50KCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBmaWVsZHNbMF0uX21GaWVsZElkKTsKKworICAgIEVYUEVDVF9FUShleHBlY3RlZFswXSwgZmllbGRzWzBdKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbMV0sIGZpZWxkc1sxXSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkWzJdLCBmaWVsZHNbMl0pOworICAgIEVYUEVDVF9FUShleHBlY3RlZFszXSwgZmllbGRzWzNdKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbNF0sIGZpZWxkc1s0XSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkWzVdLCBmaWVsZHNbNV0pOworICAgIEVYUEVDVF9FUShleHBlY3RlZFs2XSwgZmllbGRzWzZdKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbN10sIGZpZWxkc1s3XSk7CisgICAgZm9yIChzaXplX3QgaSA9IDg7IGkgPCBmaWVsZHMuc2l6ZSgpICYmIGkgPCBleHBlY3RlZC5zaXplKCk7ICsraSkgeworICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIGZpZWxkc1tpXSk7CisgICAgfQorfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChJbml0aWFsaXplckxpc3QsIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCA6OnRlc3Rpbmc6OlZhbHVlcyhDMlRlc3RTdHJ1Y3RfQTo6X0ZJRUxEX0xJU1QpKTsKKworLy8gZGVmaW5lIGZpZWxkcyB1c2luZyBDMkZpZWxkRGVzY3JpcHRvciBwb2ludGVyIGNvbnN0cnVjdG9yCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0FfRkRfUFRSX2ZpZWxkTGlzdCA9CisgICAgeyBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+c2lnbmVkMzIsICAgInMzMiIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPnNpZ25lZDY0LCAgICJzNjQiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT51bnNpZ25lZDMyLCAidTMyIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+dW5zaWduZWQ2NCwgInU2NCIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPmZwMzIsICAgICAgImZwIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+c3osICAgICAgICJzaXplIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+YmxvYiwgICAgICAgImJsb2IiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT5zdHJpbmcsICAgICAic3RyIiksCisgICAgLy8gIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT55ZXNObywgICAgICAieS1uIikKKyAgICB9OworCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChQb2ludGVyQ29uc3RydWN0b3IsIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCA6OnRlc3Rpbmc6OlZhbHVlcyhDMlRlc3RTdHJ1Y3RfQV9GRF9QVFJfZmllbGRMaXN0KSk7CisKKy8vIGRlZmluZSBmaWVsZHMgdXNpbmcgQzJGaWVsZERlc2NyaXB0b3IgbWVtYmVyLXBvaW50ZXIgY29uc3RydWN0b3IKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfQV9GRF9NRU1fUFRSX2ZpZWxkTGlzdCA9CisgICAgeyBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkMzIsICAgInMzMiIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDY0LCAgICJzNjQiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjp1bnNpZ25lZDMyLCAidTMyIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQ2NCwgInU2NCIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OmZwMzIsICAgICAgImZwIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c3osICAgICAgICJzaXplIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6YmxvYiwgICAgICAgImJsb2IiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzdHJpbmcsICAgICAic3RyIiksCisgICAgLy8gIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjp5ZXNObywgICAgICAieS1uIikKKyAgICB9OworCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChNZW1iZXJQb2ludGVyQ29uc3RydWN0b3IsIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCA6OnRlc3Rpbmc6OlZhbHVlcyhDMlRlc3RTdHJ1Y3RfQV9GRF9NRU1fUFRSX2ZpZWxkTGlzdCkpOworCisvLyBUZXN0IDIuIGRlZmluZSBhIHN0cnVjdHVyZSB3aXRoIHR3by1zdGVwIGhlbHBlciBtZXRob2RzCisKK3N0cnVjdCBDMlRlc3RBU3RydWN0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIGludDY0X3Qgc2lnbmVkNjRbMl07CisgICAgdWludDMyX3QgdW5zaWduZWQzMlsxXTsKKyAgICB1aW50NjRfdCB1bnNpZ25lZDY0OworICAgIGZsb2F0IGZwMzI7CisgICAgQzJTaXplU3RydWN0IHN6WzNdOworICAgIHVpbnQ4X3QgYmxvYlsxMDBdOworICAgIGNoYXIgc3RyaW5nWzEwMF07CisgICAgYm9vbCB5ZXNOb1sxMDBdOworCitwcml2YXRlOiAvLyB0ZXN0IGFjY2VzcyBsZXZlbAorICAgIERFRklORV9DMlNUUlVDVChUZXN0QSkKK30gQzJfUEFDSzsKKworREVTQ1JJQkVfQzJTVFJVQ1QoVGVzdEEsIHsKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKHNpZ25lZDY0LCAiczY0IikKKyAgICBDMkZJRUxEKHVuc2lnbmVkMzIsICJ1MzIiKQorICAgIEMyRklFTEQodW5zaWduZWQ2NCwgInU2NCIpCisgICAgQzJGSUVMRChmcDMyLCAiZnAiKQorICAgIEMyRklFTEQoc3osICJzaXplIikKKyAgICBDMkZJRUxEKGJsb2IsICJibG9iIikKKyAgICBDMkZJRUxEKHN0cmluZywgInN0ciIpCisgICAgLy8gQzJGSUVMRCh5ZXNObywgInktbiIpCit9KSAvLyA7IG9wdGlvbmFsCisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKERlc2NyaWJlU3RydWN0MlN0ZXAsIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCA6OnRlc3Rpbmc6OlZhbHVlcyhDMlRlc3RBU3RydWN0OjpGaWVsZExpc3QoKSkpOworCisvLyBUZXN0IDMuIGRlZmluZSBhIHN0cnVjdHVyZSB3aXRoIG9uZS1zdGVwIGhlbHBlciBtZXRob2QKKworc3RydWN0IEMyVGVzdEJTdHJ1Y3QgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgaW50NjRfdCBzaWduZWQ2NFsyXTsKKyAgICB1aW50MzJfdCB1bnNpZ25lZDMyWzFdOworICAgIHVpbnQ2NF90IHVuc2lnbmVkNjQ7CisgICAgZmxvYXQgZnAzMjsKKyAgICBDMlNpemVTdHJ1Y3Qgc3pbM107CisgICAgdWludDhfdCBibG9iWzEwMF07CisgICAgY2hhciBzdHJpbmdbMTAwXTsKKyAgICBib29sIHllc05vWzEwMF07CisKK3ByaXZhdGU6IC8vIHRlc3QgYWNjZXNzIGxldmVsCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChUZXN0QikKKworICAgIEMyRklFTEQoc2lnbmVkMzIsICJzMzIiKQorICAgIEMyRklFTEQoc2lnbmVkNjQsICJzNjQiKQorICAgIEMyRklFTEQodW5zaWduZWQzMiwgInUzMiIpCisgICAgQzJGSUVMRCh1bnNpZ25lZDY0LCAidTY0IikKKyAgICBDMkZJRUxEKGZwMzIsICJmcCIpCisgICAgQzJGSUVMRChzeiwgInNpemUiKQorICAgIEMyRklFTEQoYmxvYiwgImJsb2IiKQorICAgIEMyRklFTEQoc3RyaW5nLCAic3RyIikKKyAgICAvLyBDMkZJRUxEKHllc05vLCAieS1uIikKK307CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKERlc2NyaWJlU3RydWN0MVN0ZXAsIEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCA6OnRlc3Rpbmc6OlZhbHVlcyhDMlRlc3RCU3RydWN0OjpGaWVsZExpc3QoKSkpOworCisvLyBUZXN0IDQuIGZsZXhpYmxlIG1lbWJlcnMKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyUGFyYW1UZXN0X0ZsZXhQYXJhbUZpZWxkTGlzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHJvdGVjdGVkOgorICAgIHVzaW5nIHR5cGVfdD1GRDo6dHlwZV90OworCisgICAgLy8gc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PgorICAgICAgICAgICAgR2V0TGlzdHMoKTsKKworICAgIGNvbnN0ZXhwciBzdGF0aWMgdHlwZV90IEZsZXhUeXBlID0KKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCBpbnQzMl90Pjo6dmFsdWUgPyBGRDo6SU5UMzIgOgorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIGludDY0X3Q+Ojp2YWx1ZSA/IEZEOjpJTlQ2NCA6CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgdWludDMyX3Q+Ojp2YWx1ZSA/IEZEOjpVSU5UMzIgOgorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIHVpbnQ2NF90Pjo6dmFsdWUgPyBGRDo6VUlOVDY0IDoKKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCBmbG9hdD46OnZhbHVlID8gRkQ6OkZMT0FUIDoKKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCB1aW50OF90Pjo6dmFsdWUgPyBGRDo6QkxPQiA6CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlID8gRkQ6OlNUUklORyA6CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgQzJTaXplU3RydWN0Pjo6dmFsdWUgPyBDMlNpemVTdHJ1Y3Q6OlRZUEUgOiAodHlwZV90KTA7CisgICAgY29uc3RleHByIHN0YXRpYyBzaXplX3QgRkxFWF9TSVpFID0gc2l6ZW9mKFQpOworfTsKKwordHlwZWRlZiA6OnRlc3Rpbmc6OlR5cGVzPGludDMyX3QsIGludDY0X3QsIEMyU2l6ZVN0cnVjdD4gRmxleFR5cGVzOworVFlQRURfVEVTVF9DQVNFKEMyUGFyYW1UZXN0X0ZsZXhQYXJhbUZpZWxkTGlzdCwgRmxleFR5cGVzKTsKKworVFlQRURfVEVTVChDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3QsIFZlcmlmeVN0cnVjdCkgeworICAgIGZvciAoYXV0byBhIDogdGhpcy0+R2V0TGlzdHMoKSkgeworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gYTsKKyAgICAgICAgaWYgKGZpZWxkcy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMnUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKEMyRmllbGREZXNjcmlwdG9yKEZEOjpJTlQzMiwgMSwgInMzMiIsIDAsIDQpLCBmaWVsZHNbMF0pOworICAgICAgICAgICAgRVhQRUNUX0VRKEMyRmllbGREZXNjcmlwdG9yKHRoaXMtPkZsZXhUeXBlLCAwLCAiZmxleCIsIDQsIHRoaXMtPkZMRVhfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgZmllbGRzWzFdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoQzJGaWVsZERlc2NyaXB0b3IodGhpcy0+RmxleFR5cGUsIDAsICJmbGV4IiwgMCwgdGhpcy0+RkxFWF9TSVpFKSwKKyAgICAgICAgICAgICAgICAgICAgICBmaWVsZHNbMF0pOworICAgICAgICB9CisgICAgfQorfQorCitzdHJ1Y3QgQzJUZXN0U3RydWN0X0ZsZXhTMzIgeworICAgIGludDMyX3QgbUZsZXhbXTsKKworICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX0ZJRUxEX0xJU1Q7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKKyAgICAvLyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXhUZXN0RmxleCwgRkxFWF9TSVpFID0gNCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhTMzIgX3R5cGU7CisgICAgLy8gdHlwZWRlZiBpbnQzMl90IEZsZXhUeXBlOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4UzMyOjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIF9GSUVMRF9MSVNUOworfQorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4UzMyOjpfRklFTERfTElTVCA9IHsKKyAgICB7IEZEOjpJTlQzMiwgMCwgImZsZXgiLCAwLCA0IH0KK307CisKK3N0cnVjdCBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMiB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQzMl90IG1GbGV4W107CisKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgLy8gZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4VGVzdEZsZXhFbmQsIEZMRVhfU0laRSA9IDQgfTsKKyAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4RW5kIF90eXBlOworICAgIC8vIHR5cGVkZWYgaW50MzJfdCBGbGV4VHlwZTsKK307CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMjo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMjo6X0ZJRUxEX0xJU1QgPSB7CisgICAgeyBGRDo6SU5UMzIsIDEsICJzMzIiLCAwLCA0IH0sCisgICAgeyBGRDo6SU5UMzIsIDAsICJmbGV4IiwgNCwgNCB9LAorfTsKKworY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMl9wdHJfZmllbGRMaXN0ID0geworICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9GbGV4RW5kUzMyKikwKS0+c2lnbmVkMzIsICJzMzIiKSwKKyAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMiopMCktPm1GbGV4LCAiZmxleCIpLAorfTsKKworc3RydWN0IEMyVGVzdEZsZXhTMzJTdHJ1Y3QgeworICAgIGludDMyX3QgbUZsZXhTaWduZWQzMltdOworcHJpdmF0ZTogLy8gdGVzdCBhY2Nlc3MgbGV2ZWwKKyAgICBDMlRlc3RGbGV4UzMyU3RydWN0KCkge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChUZXN0RmxleFMzMiwgbUZsZXhTaWduZWQzMikKKyAgICBDMkZJRUxEKG1GbGV4U2lnbmVkMzIsICJmbGV4IikKK307CisKK3N0cnVjdCBDMlRlc3RGbGV4RW5kUzMyU3RydWN0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIGludDMyX3QgbUZsZXhTaWduZWQzMltdOworcHJpdmF0ZTogLy8gdGVzdCBhY2Nlc3MgbGV2ZWwKKyAgICBDMlRlc3RGbGV4RW5kUzMyU3RydWN0KCkge30KKworICAgIERFRklORV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4RW5kUzMyLCBtRmxleFNpZ25lZDMyKQorfSBDMl9QQUNLOworCitERVNDUklCRV9DMlNUUlVDVChUZXN0RmxleEVuZFMzMiwgeworICAgIEMyRklFTEQoc2lnbmVkMzIsICJzMzIiKQorICAgIEMyRklFTEQobUZsZXhTaWduZWQzMiwgImZsZXgiKQorfSkgLy8gOyBvcHRpb25hbAorCit0ZW1wbGF0ZTw+CitzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CisvL3N0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KK0MyUGFyYW1UZXN0X0ZsZXhQYXJhbUZpZWxkTGlzdDxpbnQzMl90Pjo6R2V0TGlzdHMoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhTMzI6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMjo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdFN0cnVjdF9GbGV4RW5kUzMyX3B0cl9maWVsZExpc3QsCisgICAgICAgIEMyVGVzdEZsZXhTMzJTdHJ1Y3Q6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RGbGV4RW5kUzMyU3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICB9OworfQorCitzdHJ1Y3QgQzJUZXN0U3RydWN0X0ZsZXhTNjQgeworICAgIGludDY0X3QgbUZsZXhTaWduZWQ2NFtdOworCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleFRlc3RGbGV4UzY0LCBGTEVYX1NJWkUgPSA4IH07CisgICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfRmxleFM2NCBfdHlwZTsKKyAgICAvLyB0eXBlZGVmIGludDY0X3QgRmxleFR5cGU7Cit9OworCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhTNjQ6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhTNjQ6Ol9GSUVMRF9MSVNUID0geworICAgIHsgRkQ6OklOVDY0LCAwLCAiZmxleCIsIDAsIDggfQorfTsKKworc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4RW5kUzY0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIGludDY0X3QgbVNpZ25lZDY0RmxleFtdOworCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NCwgRkxFWF9TSVpFID0gOCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhFbmRTNjQgX3R5cGU7CisgICAgLy8gdHlwZWRlZiBpbnQ2NF90IEZsZXhUeXBlOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4RW5kUzY0OjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIF9GSUVMRF9MSVNUOworfQorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4RW5kUzY0OjpfRklFTERfTElTVCA9IHsKKyAgICB7IEZEOjpJTlQzMiwgMSwgInMzMiIsIDAsIDQgfSwKKyAgICB7IEZEOjpJTlQ2NCwgMCwgImZsZXgiLCA0LCA4IH0sCit9OworCitzdHJ1Y3QgQzJUZXN0RmxleFM2NFN0cnVjdCB7CisgICAgaW50NjRfdCBtRmxleFNpZ25lZDY0W107CisgICAgQzJUZXN0RmxleFM2NFN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoVGVzdEZsZXhTNjQsIG1GbGV4U2lnbmVkNjQpCisgICAgQzJGSUVMRChtRmxleFNpZ25lZDY0LCAiZmxleCIpCit9OworCitzdHJ1Y3QgQzJUZXN0RmxleEVuZFM2NFN0cnVjdCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQ2NF90IG1GbGV4U2lnbmVkNjRbXTsKKyAgICBDMlRlc3RGbGV4RW5kUzY0U3RydWN0KCkge30KKworICAgIERFRklORV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4RW5kUzY0LCBtRmxleFNpZ25lZDY0KQorfSBDMl9QQUNLOworCitERVNDUklCRV9DMlNUUlVDVChUZXN0RmxleEVuZFM2NCwgeworICAgIEMyRklFTEQoc2lnbmVkMzIsICJzMzIiKQorICAgIEMyRklFTEQobUZsZXhTaWduZWQ2NCwgImZsZXgiKQorfSkgLy8gOyBvcHRpb25hbAorCit0ZW1wbGF0ZTw+CitzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CisvL3N0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KK0MyUGFyYW1UZXN0X0ZsZXhQYXJhbUZpZWxkTGlzdDxpbnQ2NF90Pjo6R2V0TGlzdHMoKSB7CisgICAgcmV0dXJuIHsKKyAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhTNjQ6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NDo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdEZsZXhTNjRTdHJ1Y3Q6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RGbGV4RW5kUzY0U3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICB9OworfQorCitzdHJ1Y3QgQzJUZXN0U3RydWN0X0ZsZXhTaXplIHsKKyAgICBDMlNpemVTdHJ1Y3QgbUZsZXhTaXplW107CisKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgLy8gZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4VGVzdEZsZXhTaXplLCBGTEVYX1NJWkUgPSA4IH07CisgICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfRmxleFNpemUgX3R5cGU7CisgICAgLy8gdHlwZWRlZiBDMlNpemVTdHJ1Y3QgRmxleFR5cGU7Cit9OworCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhTaXplOjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIF9GSUVMRF9MSVNUOworfQorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4U2l6ZTo6X0ZJRUxEX0xJU1QgPSB7CisgICAgeyBDMlNpemVTdHJ1Y3Q6OlRZUEUsIDAsICJmbGV4IiwgMCwgc2l6ZW9mKEMyU2l6ZVN0cnVjdCkgfQorfTsKKworc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZSB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBDMlNpemVTdHJ1Y3QgbVNpemVGbGV4W107CisKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgLy8gZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZSwgRkxFWF9TSVpFID0gOCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhFbmRTaXplIF90eXBlOworICAgIC8vIHR5cGVkZWYgQzJTaXplU3RydWN0IEZsZXhUeXBlOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZTo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemU6Ol9GSUVMRF9MSVNUID0geworICAgIHsgRkQ6OklOVDMyLCAxLCAiczMyIiwgMCwgNCB9LAorICAgIHsgQzJTaXplU3RydWN0OjpUWVBFLCAwLCAiZmxleCIsIDQsIHNpemVvZihDMlNpemVTdHJ1Y3QpIH0sCit9OworCitzdHJ1Y3QgQzJUZXN0RmxleFNpemVTdHJ1Y3QgeworICAgIEMyU2l6ZVN0cnVjdCBtRmxleFNpemVbXTsKKyAgICBDMlRlc3RGbGV4U2l6ZVN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoVGVzdEZsZXhTaXplLCBtRmxleFNpemUpCisgICAgQzJGSUVMRChtRmxleFNpemUsICJmbGV4IikKK307CisKK3N0cnVjdCBDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBDMlNpemVTdHJ1Y3QgbUZsZXhTaXplW107CisgICAgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0ZMRVhfQzJTVFJVQ1QoVGVzdEZsZXhFbmRTaXplLCBtRmxleFNpemUpCit9IEMyX1BBQ0s7CisKK0RFU0NSSUJFX0MyU1RSVUNUKFRlc3RGbGV4RW5kU2l6ZSwgeworICAgIEMyRklFTEQoc2lnbmVkMzIsICJzMzIiKQorICAgIEMyRklFTEQobUZsZXhTaXplLCAiZmxleCIpCit9KSAvLyA7IG9wdGlvbmFsCisKK3N0cnVjdCBDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgQzJTaXplU3RydWN0IG1GbGV4U2l6ZVtdOworICAgIEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQkFTRV9GTEVYX0MyU1RSVUNUKFRlc3RCYXNlRmxleEVuZFNpemUsIG1GbGV4U2l6ZSkKK30gQzJfUEFDSzsKKworREVTQ1JJQkVfQzJTVFJVQ1QoVGVzdEJhc2VGbGV4RW5kU2l6ZSwgeworICAgIEMyRklFTEQoc2lnbmVkMzIsICJzMzIiKQorICAgIEMyRklFTEQobUZsZXhTaXplLCAiZmxleCIpCit9KSAvLyA7IG9wdGlvbmFsCisKK3N0cnVjdCBDMlRlc3RCYXNlRmxleEVuZFNpemUyU3RydWN0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIEMyU2l6ZVN0cnVjdCBtRmxleFNpemVbXTsKKyAgICBDMlRlc3RCYXNlRmxleEVuZFNpemUyU3RydWN0KCkge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9GTEVYX0MyU1RSVUNUKFRlc3RCYXNlRmxleEVuZFNpemUyLCBtRmxleFNpemUpCisgICAgQzJGSUVMRChzaWduZWQzMiwgInMzMiIpCisgICAgQzJGSUVMRChtRmxleFNpemUsICJmbGV4IikKK307CisKK3RlbXBsYXRlPD4KK3N0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KKy8vc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PgorQzJQYXJhbVRlc3RfRmxleFBhcmFtRmllbGRMaXN0PEMyU2l6ZVN0cnVjdD46OkdldExpc3RzKCkgeworICAgIHJldHVybiB7CisgICAgICAgIEMyVGVzdFN0cnVjdF9GbGV4U2l6ZTo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZTo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdEZsZXhTaXplU3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3Q6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RCYXNlRmxleEVuZFNpemUyU3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICB9OworfQorCitURVNUX0YoQzJQYXJhbVRlc3QsIEZpZWxkSWQpIHsKKyAgICAvLyBwb2ludGVyIGNvbnN0cnVjdG9yCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+c2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyMCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT51bnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+dW5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPmZwMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzNiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5zeikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDYwLCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPmJsb2IpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNjAsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+c3RyaW5nKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjYwLCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnllc05vKSk7CisKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCopMCktPnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QqKTApLT5tRmxleFNpemUpKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCopMCktPnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0KikwKS0+bUZsZXhTaXplKSk7CisKKyAgICAvLyBtZW1iZXIgcG9pbnRlciBjb25zdHJ1Y3RvcgorICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDIwLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6ZnAzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDM2LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2MCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OmJsb2IpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNjAsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzdHJpbmcpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNjAsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjp5ZXNObykpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdEZsZXhFbmRTaXplU3RydWN0KikwLCAmQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q6OnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdEZsZXhFbmRTaXplU3RydWN0KikwLCAmQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q6Om1GbGV4U2l6ZSkpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCopMCwgJkMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdDo6c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0KikwLCAmQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0OjptRmxleFNpemUpKTsKKworICAgIC8vIG1lbWJlciBwb2ludGVyIHNhbnMgdHlwZSBwb2ludGVyCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpzaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyMCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjp1bnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjQsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OmZwMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzNiwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpzeikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDYwLCAxKSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OmJsb2IpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNjAsIDEpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6c3RyaW5nKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjYwLCAxKSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6Onllc05vKSk7CisKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q6OnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjptRmxleFNpemUpKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3Q6OnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdDo6bUZsZXhTaXplKSk7CisKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RBU3RydWN0PiBDMlRlc3RBSW5mbzsKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdD4gQzJUZXN0RmxleEVuZFNpemVJbmZvOworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhUZXN0RmxleEVuZFNpemU+IEMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlOworCisgICAgLy8gcG9pbnRlciBjb25zdHJ1Y3RvciBpbiBDMlBhcmFtCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjgsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0MCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5mcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2OCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5ibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTY4LCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2OCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT55ZXNObykpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVJbmZvKikwKS0+bS5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RGbGV4RW5kU2l6ZUluZm8qKTApLT5tLm1GbGV4U2l6ZSkpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVJbmZvRnJvbUJhc2UqKTApLT5tLnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTIsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlKikwKS0+bS5tRmxleFNpemUpKTsKKworICAgIC8vIG1lbWJlciBwb2ludGVyIGluIEMyUGFyYW0KKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg4LCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjgsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjp1bnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjp1bnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpmcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDQsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpzeikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDY4LCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6YmxvYikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2OCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2OCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86Onllc05vKSk7CisKKyAgICAvLyBOT1RFOiBjYW5ub3QgdXNlIGEgbWVtYmVyIHBvaW50ZXIgZm9yIGZsZXggcGFyYW1zIGR1ZSB0byBpbnRyb2R1Y3Rpb24gb2YgJ20nCisgICAgLy8gRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplSW5mbzo6bS5zaWduZWQzMikpOworICAgIC8vIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0RmxleEVuZFNpemVJbmZvOjptLm1GbGV4U2l6ZSkpOworCisgICAgLy8gRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlOjptLnNpZ25lZDMyKSk7CisgICAgLy8gRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTIsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZTo6bS5tRmxleFNpemUpKTsKKworCit9CisKK3N0cnVjdCBTMzIgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIGNsYXNzIEI9dHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFQ+Ojp0eXBlPgorICAgIGlubGluZSBTMzIoY29uc3QgVCopIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19hcnJheTxUPjo6dmFsdWUsICJzaG91bGQgbm90IGJlIGFuIGFycmF5Iik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPEIsIGludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQzMl90Iik7CisgICAgfQorfTsKKworc3RydWN0IEZMWCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgVCwgY2xhc3MgQj10eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGU+CisgICAgaW5saW5lIEZMWChjb25zdCBUKiwgY29uc3QgVSopIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2FycmF5PFQ+Ojp2YWx1ZSwgInNob3VsZCBiZSBhbiBhcnJheSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6ZXh0ZW50PFQ+Ojp2YWx1ZSA9PSAwLCAic2hvdWxkIGJlIGFuIGFycmF5IG9mIDAgZXh0ZW50Iik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPEIsIFU+Ojp2YWx1ZSwgInNob3VsZCBiZSB0eXBlIFUiKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgTVAgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEV4cGVjdGVkVSwgdHlwZW5hbWUgVW5leHBlY3RlZFU+CisgICAgaW5saW5lIE1QKFQgVTo6KiwgY29uc3QgRXhwZWN0ZWRVKiwgY29uc3QgVW5leHBlY3RlZFUqKSB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfc2FtZTxVLCBVbmV4cGVjdGVkVT46OnZhbHVlLCAic2hvdWxkIG5vdCBiZSBtZW1iZXIgcG9pbnRlciBvZiB0aGUgYmFzZSB0eXBlIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPFUsIEV4cGVjdGVkVT46OnZhbHVlLCAic2hvdWxkIGJlIG1lbWJlciBwb2ludGVyIG9mIHRoZSBkZXJpdmVkIHR5cGUiKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBCLCB0eXBlbmFtZSBEPgorICAgIGlubGluZSBNUChUIEQ6OiosIGNvbnN0IEQqKSB7IH0KK307CisKK3ZvaWQgY29tcGlsZWRTdGF0aWNfYXJyYXlUeXBlUHJvcGFnYXRpb25UZXN0KCkgeworICAgICh2b2lkKVMzMigmKChDMlRlc3RGbGV4RW5kUzMyU3RydWN0ICopMCktPnNpZ25lZDMyKTsKKyAgICAodm9pZClGTFgoJigoQzJUZXN0RmxleEVuZFMzMlN0cnVjdCAqKTApLT5tRmxleFNpZ25lZDMyLCAoaW50MzJfdCopMCk7CisgICAgKHZvaWQpRkxYKCYoKEMyVGVzdEZsZXhTMzJTdHJ1Y3QgKikwKS0+bUZsZXhTaWduZWQzMiwgKGludDMyX3QqKTApOworCisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0QVN0cnVjdD4gQzJUZXN0QUluZm87CisKKyAgICAvLyBUUklDS1k6ICZkZXJpdmVkQ2xhc3M6OmJhc2VNZW1iZXIgaGFzIHR5cGUgb2YgYmFzZUNsYXNzOjoqCisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoJkMyVGVzdEFJbmZvOjpzaWduZWQzMiksIGludDMyX3QgQzJUZXN0QVN0cnVjdDo6Kj46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgImJhc2UgbWVtYmVyIHBvaW50ZXIgc2hvdWxkIGhhdmUgYmFzZSBjbGFzcyBpbiB0eXBlIik7CisKKyAgICAvLyB0aGVyZWZvcmUsIG1lbWJlciBwb2ludGVyIGV4cGFuZHMgdG8gYmFzZUNsYXNzOjoqIGluIHRlbXBsYXRlcworICAgICh2b2lkKU1QKCZDMlRlc3RBSW5mbzo6c2lnbmVkMzIsCisgICAgICAgICAgICAgKEMyVGVzdEFTdHJ1Y3QqKTAgLyogZXhwZWN0ZWQgKi8sIChDMlRlc3RBSW5mbyopMCAvKiB1bmV4cGVjdGVkICovKTsKKyAgICAvLyBidXQgY2FuIGJlIGNhc3QgdG8gZGVyaXZlZENsYXNzOjoqCisgICAgKHZvaWQpTVAoKGludDMyX3QgQzJUZXN0QUluZm86OiopJkMyVGVzdEFJbmZvOjpzaWduZWQzMiwKKyAgICAgICAgICAgICAoQzJUZXN0QUluZm8qKTAgLyogZXhwZWN0ZWQgKi8sIChDMlRlc3RBU3RydWN0KikwIC8qIHVuZXhwZWN0ZWQgKi8pOworCisgICAgLy8gVFJJQ0tZOiBiYXNlQ2xhc3M6OiogZG9lcyBub3QgYXV0b2NvbnZlcnQgdG8gZGVyaXZlZENsYXNzOjoqIGV2ZW4gaW4gdGVtcGxhdGVzCisgICAgLy8gKHZvaWQpTVAoJkMyVGVzdEFJbmZvOjpzaWduZWQzMiwgKEMyVGVzdEFJbmZvKikwKTsKK30KKworVEVTVF9GKEMyUGFyYW1UZXN0LCBNZW1iZXJQb2ludGVyQ2FzdCkgeworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVGVzdEFTdHJ1Y3Q+IEMyVGVzdEFJbmZvOworCisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMlRlc3RBSW5mbywgc2lnbmVkMzIpID09IDgsICJvZmZzZXQgc2hvdWxkIGJlIDgiKTsKKyAgICBjb25zdGV4cHIgaW50MzJfdCBDMlRlc3RBU3RydWN0OjoqIHMzMnB0ciA9ICZDMlRlc3RBSW5mbzo6c2lnbmVkMzI7CisgICAgY29uc3RleHByIGludDMyX3QgQzJUZXN0QUluZm86OiogczMycHRyX2Rlcml2ZWQgPSAoaW50MzJfdCBDMlRlc3RBU3RydWN0OjoqKSZDMlRlc3RBSW5mbzo6c2lnbmVkMzI7CisgICAgY29uc3RleHByIGludDMyX3QgQzJUZXN0QUluZm86OiogczMycHRyX2Nhc3QyZGVyaXZlZCA9IChpbnQzMl90IEMyVGVzdEFJbmZvOjoqKXMzMnB0cjsKKyAgICBDMlRlc3RBSW5mbyAqaW5mbyA9IChDMlRlc3RBSW5mbyAqKTI1NjsKKyAgICBDMlRlc3RBU3RydWN0ICpzdHJ1a3QgPSAoQzJUZXN0QVN0cnVjdCAqKWluZm87CisgICAgaW50MzJfdCAqaW5mb19zMzJfZGVyaXZlZCA9ICYoaW5mby0+KnMzMnB0cl9kZXJpdmVkKTsKKyAgICBpbnQzMl90ICppbmZvX3MzMl9jYXN0MmRlcml2ZWQgPSAmKGluZm8tPipzMzJwdHJfY2FzdDJkZXJpdmVkKTsKKyAgICBpbnQzMl90ICppbmZvX3MzMiA9ICYoaW5mby0+KnMzMnB0cik7CisgICAgaW50MzJfdCAqc3RydWt0X3MzMiA9ICYoc3RydWt0LT4qczMycHRyKTsKKworICAgIEVYUEVDVF9FUSgyNTZ1LCAodWludHB0cl90KWluZm8pOworICAgIEVYUEVDVF9FUSgyNjR1LCAodWludHB0cl90KXN0cnVrdCk7CisgICAgRVhQRUNUX0VRKDI2NHUsICh1aW50cHRyX3QpaW5mb19zMzJfZGVyaXZlZCk7CisgICAgRVhQRUNUX0VRKDI2NHUsICh1aW50cHRyX3QpaW5mb19zMzJfY2FzdDJkZXJpdmVkKTsKKyAgICBFWFBFQ1RfRVEoMjY0dSwgKHVpbnRwdHJfdClpbmZvX3MzMik7CisgICAgRVhQRUNUX0VRKDI2NHUsICh1aW50cHRyX3Qpc3RydWt0X3MzMik7CisKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdD4gQzJUZXN0RmxleEVuZFNpemVJbmZvOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJUZXN0RmxleEVuZFNpemVJbmZvLCBtLnNpZ25lZDMyKSA9PSA4LCAib2Zmc2V0IHNob3VsZCBiZSA4Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMlRlc3RGbGV4RW5kU2l6ZUluZm8sIG0ubUZsZXhTaXplKSA9PSAxMiwgIm9mZnNldCBzaG91bGQgYmUgMTIiKTsKKworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhUZXN0RmxleEVuZFNpemU+IEMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJUZXN0RmxleEVuZFNpemVJbmZvRnJvbUJhc2UsIG0uc2lnbmVkMzIpID09IDgsICJvZmZzZXQgc2hvdWxkIGJlIDgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlLCBtLm1GbGV4U2l6ZSkgPT0gMTIsICJvZmZzZXQgc2hvdWxkIGJlIDEyIik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUEFSQU0gVVNBR0UgVEVTVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdHJ1Y3QgQzJOdW1iZXJTdHJ1Y3QgeworICAgIGludDMyX3QgbU51bWJlcjsKKyAgICBDMk51bWJlclN0cnVjdCgpIHt9CisgICAgQzJOdW1iZXJTdHJ1Y3QoaW50MzJfdCBfbnVtYmVyKSA6IG1OdW1iZXIoX251bWJlcikge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoTnVtYmVyKQorICAgIEMyRklFTEQobU51bWJlciwgIm51bWJlciIpCit9OworCitzdHJ1Y3QgQzJOdW1iZXJCYXNlU3RydWN0IHsKKyAgICBpbnQzMl90IG1OdW1iZXI7CisgICAgQzJOdW1iZXJCYXNlU3RydWN0KCkge30KKyAgICBDMk51bWJlckJhc2VTdHJ1Y3QoaW50MzJfdCBfbnVtYmVyKSA6IG1OdW1iZXIoX251bWJlcikge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9DMlNUUlVDVChOdW1iZXJCYXNlKQorICAgIEMyRklFTEQobU51bWJlciwgIm51bWJlciIpCit9OworCitzdHJ1Y3QgQzJOdW1iZXJzU3RydWN0IHsKKyAgICBpbnQzMl90IG1OdW1iZXJzW107CisgICAgQzJOdW1iZXJzU3RydWN0KCkge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChOdW1iZXJzLCBtTnVtYmVycykKKyAgICBDMkZJRUxEKG1OdW1iZXJzLCAibnVtYmVycyIpCit9Oworc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzU3RydWN0KSA9PSAwLCAiQzJOdW1iZXJzU3RydWN0IGhhcyBpbmNvcnJlY3Qgc2l6ZSIpOworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMk51bWJlclN0cnVjdD4gQzJOdW1iZXJJbmZvOworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyU3RydWN0PiBDMk51bWJlclR1bmluZzsKK3R5cGVkZWYgICBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJOdW1iZXJTdHJ1Y3Q+IEMyTnVtYmVyUG9ydFR1bmluZzsKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJOdW1iZXJTdHJ1Y3Q+IEMyTnVtYmVyU3RyZWFtVHVuaW5nOworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyc1N0cnVjdD4gQzJOdW1iZXJzVHVuaW5nOwordHlwZWRlZiAgIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMk51bWJlcnNTdHJ1Y3Q+IEMyTnVtYmVyc1BvcnRUdW5pbmc7Cit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyc1N0cnVjdD4gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOworCisvLworI2lmIDAKKwordm9pZCB0ZXN0KCkgeworICAgIEMyTnVtYmVyU3RydWN0IHMoMTApOworICAgICh2b2lkKUMyTnVtYmVyU3RydWN0OjpGaWVsZExpc3QoKTsKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJJbnQ2NFZhbHVlLCBrUGFyYW1JbmRleE51bWJlckI+IEMyTnVtYmVyQ29uZmlnNDsKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMySW50MzJWYWx1ZSwga1BhcmFtSW5kZXhOdW1iZXI+IEMyTnVtYmVyQ29uZmlnMzsKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJTdHJpbmdWYWx1ZSwga1BhcmFtSW5kZXhOdW1iZXI+IEMyVmlkZW9OYW1lQ29uZmlnOworCit2b2lkIHRlc3QzKCkgeworICAgIEMyTnVtYmVyQ29uZmlnMyBzKDEwKTsKKyAgICBzLnZhbHVlID0gMTE7CisgICAgcyA9IDEyOworICAgICh2b2lkKUMyTnVtYmVyQ29uZmlnMzo6RmllbGRMaXN0KCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyVmlkZW9OYW1lQ29uZmlnPiBuID0gQzJWaWRlb05hbWVDb25maWc6OkFsbG9jU2hhcmVkKDI1KTsKKyAgICBzdHJjcHkobi0+bS52YWx1ZSwgImxham9zIik7CisgICAgQzJOdW1iZXJDb25maWc0IHQoZmFsc2UsIDAsIDExKTsKKyAgICB0LnZhbHVlID0gMTU7Cit9OworCitzdHJ1Y3QgQzJOdW1iZXJzU3RydWN0IHsKKyAgICBpbnQzMl90IG1OdW1iZXJzW107CisgICAgZW51bSB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleE51bWJlciB9OworICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKKyAgICBDMk51bWJlcnNTdHJ1Y3QoKSB7fQorCisgICAgRkxFWChDMk51bWJlcnNTdHJ1Y3QsIG1OdW1iZXJzKTsKK307CisKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1N0cnVjdCkgPT0gMCwgInllcyIpOworCisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyTnVtYmVyc1N0cnVjdD4gQzJOdW1iZXJzSW5mbzsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyTnVtYmVyc1N0cnVjdDo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMk51bWJlcnNTdHJ1Y3Q6Ol9GSUVMRF9MSVNUID0KKy8vICAgIHsgeyBGRDo6SU5UMzIsIDAsICJ3aWR0aHMiIH0gfTsKKyAgICB7IEMyRmllbGREZXNjcmlwdG9yKCYoKEMyTnVtYmVyc1N0cnVjdCopKG51bGxwdHIpKS0+bU51bWJlcnMsICJudW1iZXIiKSB9OworCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMk51bWJlclN0cnVjdD4gQzJOdW1iZXJDb25maWc7CisKK3N0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBteUxpc3QgPSBDMk51bWJlckNvbmZpZzo6RmllbGRMaXN0KCk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IF9fdGVzdF9kZXNjcmliZSh1aW50MzJfdCBwYXJhbVR5cGUpIHsKKyAgICAgICAgc3RkOjpsaXN0PEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBkZXNjcmliZUMyUGFyYW1zPEMyTnVtYmVyQ29uZmlnPigpOworCisgICAgICAgIGF1dG8gd2lkdGhzID0gQzJOdW1iZXJzSW5mbzo6QWxsb2NTaGFyZWQoNSk7CisgICAgICAgIHdpZHRocy0+ZmxleENvdW50KCk7CisgICAgICAgIHdpZHRocy0+bS5tTnVtYmVyc1s0XSA9IDE7CisKKyAgICAgICAgdGVzdCgpOworICAgICAgICB0ZXN0MygpOworCisgICAgICAgIEMyTnVtYmVyQ29uZmlnIG91dHB1dFdpZHRoKGZhbHNlLCAxMjMpOworCisgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4KHBhcmFtVHlwZSk7CisgICAgICAgIHN3aXRjaCAocGFyYW1UeXBlKSB7CisgICAgICAgIGNhc2UgQzJOdW1iZXJDb25maWc6OkNPUkVfSU5ERVg6CisgICAgICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPihuZXcgQzJQYXJhbURlc2NyaXB0b3J7CisgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpc1JlcXVpcmVkICovLAorICAgICAgICAgICAgICAgICJudW1iZXIiLAorICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCisvLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBjYW5TZXRQb3J0KFQgJm8sIGJvb2wgb3V0cHV0KSB7IHJldHVybiBvLnNldFBvcnQob3V0cHV0KTsgfQorYm9vbCBjYW5TZXRQb3J0KC4uLikgeyByZXR1cm4gZmFsc2U7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWU9ZGVjbHR5cGUoKChTKikwKS0+c2V0UG9ydCh0cnVlKSk+CitzdGF0aWMgc3RkOjp0cnVlX3R5cGUgX2NhbkNhbGxTZXRQb3J0KGludCk7Cit0ZW1wbGF0ZTx0eXBlbmFtZT4KK3N0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgX2NhbkNhbGxTZXRQb3J0KC4uLik7CisjZGVmaW5lIGNhbkNhbGxTZXRQb3J0KHgpIGRlY2x0eXBlKF9jYW5DYWxsU2V0UG9ydDxzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8ZGVjbHR5cGUoeCk+Ojp0eXBlPigwKSk6OnZhbHVlCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVEFUSUMgVEVTVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpY19hc3NlcnQoX0MyQ29tcGFyYWJsZTxpbnQ+Ojp2YWx1ZSwgImludCBpcyBub3QgY29tcGFyYWJsZSIpOworc3RhdGljX2Fzc2VydCghX0MyQ29tcGFyYWJsZTx2b2lkPjo6dmFsdWUsICJ2b2lkIGlzIGNvbXBhcmFibGUiKTsKKworc3RydWN0IEMyX0hJREUgX3Rlc3QwIHsKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgX3Rlc3QwJik7CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF90ZXN0MCYpOworfTsKK3N0cnVjdCBDMl9ISURFIF90ZXN0MSB7CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF90ZXN0MSYpOworfTsKK3N0cnVjdCBDMl9ISURFIF90ZXN0MiB7CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IF90ZXN0MiYpOworfTsKK3N0YXRpY19hc3NlcnQoX0MyQ29tcGFyYWJsZTxfdGVzdDA+Ojp2YWx1ZSwgImNsYXNzIHdpdGggPT0gYW5kICE9IGlzIG5vdCBjb21wYXJhYmxlIik7CitzdGF0aWNfYXNzZXJ0KF9DMkNvbXBhcmFibGU8X3Rlc3QxPjo6dmFsdWUsICJjbGFzcyB3aXRoID09IGlzIG5vdCBjb21wYXJhYmxlIik7CitzdGF0aWNfYXNzZXJ0KF9DMkNvbXBhcmFibGU8X3Rlc3QyPjo6dmFsdWUsICJjbGFzcyB3aXRoICE9IGlzIG5vdCBjb21wYXJhYmxlIik7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDMlBBUkFNIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3IgeworICAgIHN0YXRpYyB2b2lkIFN0YXRpY1Rlc3QoKTsKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNGcm9tQmFzZVRlc3QoKTsKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNGbGV4VGVzdCgpOworICAgIHN0YXRpYyB2b2lkIFN0YXRpY0ZsZXhGcm9tQmFzZVRlc3QoKTsKK307CisKKy8vIFRFU1RfRihfQzJQYXJhbUluc3BlY3RvciwgU3RhdGljVGVzdCkgewordm9pZCBfQzJQYXJhbUluc3BlY3Rvcjo6U3RhdGljVGVzdCgpIHsKKyAgICB0eXBlZGVmIEMyUGFyYW06OkluZGV4IEk7CisKKyAgICAvLyBDMk51bWJlclN0cnVjdDogQ09SRV9JTkRFWCA9IGtJbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCA9PSBrUGFyYW1JbmRleE51bWJlciwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyU3RydWN0KSA9PSA0LCAiYmFkIHNpemUiKTsKKworICAgIC8vIEMyTnVtYmVyVHVuaW5nOiAgICAgICAgICAgICBrSW5kZXggfCB0dW4gfCBnbG9iYWwgICAgICAgICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJUdW5pbmc6OkNPUkVfSU5ERVggPT0ga1BhcmFtSW5kZXhOdW1iZXIsICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyVHVuaW5nOjpQQVJBTV9UWVBFID09IChrUGFyYW1JbmRleE51bWJlciB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX0dMT0JBTCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclR1bmluZykgPT0gMTIsICJiYWQgc2l6ZSIpOworCisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclR1bmluZywgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyVHVuaW5nLCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJUdW5pbmcsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk51bWJlclBvcnRUdW5pbmc6ICAgICAgICAga0luZGV4IHwgdHVuIHwgcG9ydCAgICAgICAgICAgICAoYm9vbCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclBvcnRUdW5pbmcpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OiAga0luZGV4IHwgdHVuIHwgcG9ydCB8IGlucHV0ICAgICAoYXJncykKKyAgICAvLyBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDoga0luZGV4IHwgdHVuIHwgcG9ydCB8IG91dHB1dCAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TnVtYmVyLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhOdW1iZXIgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9JTlBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICBrUGFyYW1JbmRleE51bWJlciwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE51bWJlciB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX09VVFBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKworICAgIC8vIEMyTnVtYmVyU3RyZWFtVHVuaW5nOiAgICAgICBrSW5kZXggfCB0dW4gfCBzdHIgICAgICAgICAgICAgIChib29sLCB1aW50LCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nKSA9PSAxMnUsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCBrSW5kZXggfCB0dW4gfCBzdHIgfCBpbnB1dCAgICAgIChpbnQsIGFyZ3MpCisgICAgLy8gQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCBrSXggICB8IHR1biB8IHN0ciB8IG91dHB1dCAgICAgKGludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhOdW1iZXIsICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TnVtYmVyIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfSU5QVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TnVtYmVyLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhOdW1iZXIgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9PVVRQVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQpID09IDEydSwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCkgPT0gMTJ1LCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKK30KKwordm9pZCBfQzJQYXJhbUluc3BlY3Rvcjo6U3RhdGljRnJvbUJhc2VUZXN0KCkgeworICAgIGVudW0geyBrUGFyYW1JbmRleE15ID0gMzEwMiB9OworICAgIHR5cGVkZWYgQzJOdW1iZXJCYXNlU3RydWN0IEMyTXlTdHJ1Y3Q7CisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJNeVN0cnVjdCwga1BhcmFtSW5kZXhNeT4gQzJNeVNldHRpbmc7CisgICAgdHlwZWRlZiAgIEMyUG9ydFBhcmFtPEMyU2V0dGluZywgQzJNeVN0cnVjdCwga1BhcmFtSW5kZXhNeT4gQzJNeVBvcnRTZXR0aW5nOworICAgIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlNldHRpbmcsIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlTdHJlYW1TZXR0aW5nOworCisgICAgdHlwZWRlZiBDMlBhcmFtOjpJbmRleCBJOworCisgICAgLy8gQzJNeVN0cnVjdCBoYXMgbm8gQ09SRV9JTkRFWAorICAgIC8vc3RhdGljX2Fzc2VydChDMk15U3RydWN0OjpDT1JFX0lOREVYID09IGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RydWN0KSA9PSA0LCAiYmFkIHNpemUiKTsKKworICAgIC8vIEMyTXlTZXR0aW5nOiAgICAgICAgICAgICBrSW5kZXggfCB0dW4gfCBnbG9iYWwgICAgICAgICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJNeVNldHRpbmc6OkNPUkVfSU5ERVggPT0ga1BhcmFtSW5kZXhNeSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVNldHRpbmc6OlBBUkFNX1RZUEUgPT0gKGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX1NFVFRJTkcgfCBJOjpESVJfR0xPQkFMKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTZXR0aW5nKSA9PSAxMiwgImJhZCBzaXplIik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTZXR0aW5nLCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVNldHRpbmcsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U2V0dGluZywgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKworICAgIC8vIEMyTXlQb3J0U2V0dGluZzogICAgICAgICBrSW5kZXggfCB0dW4gfCBwb3J0ICAgICAgICAgICAgIChib29sLCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlQb3J0U2V0dGluZykgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTXlQb3J0U2V0dGluZzo6aW5wdXQ6ICBrSW5kZXggfCB0dW4gfCBwb3J0IHwgaW5wdXQgICAgIChhcmdzKQorICAgIC8vIEMyTXlQb3J0U2V0dGluZzo6b3V0cHV0OiBrSW5kZXggfCB0dW4gfCBwb3J0IHwgb3V0cHV0ICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRTZXR0aW5nOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhNeSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX1NFVFRJTkcgfCBJOjpESVJfSU5QVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15UG9ydFNldHRpbmc6Om91dHB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhNeSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRTZXR0aW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE15IHwgSTo6S0lORF9TRVRUSU5HIHwgSTo6RElSX09VVFBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15UG9ydFNldHRpbmc6OmlucHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVBvcnRTZXR0aW5nOjpvdXRwdXQpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0U2V0dGluZzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydFNldHRpbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRTZXR0aW5nOjppbnB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0U2V0dGluZzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRTZXR0aW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydFNldHRpbmc6Om91dHB1dCwgbU51bWJlcikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKworICAgIC8vIEMyTXlTdHJlYW1TZXR0aW5nOiAgICAgICBrSW5kZXggfCB0dW4gfCBzdHIgICAgICAgICAgICAgIChib29sLCB1aW50LCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJlYW1TZXR0aW5nKSA9PSAxMnUsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTXlTdHJlYW1TZXR0aW5nOjppbnB1dCBrSW5kZXggfCB0dW4gfCBzdHIgfCBpbnB1dCAgICAgIChpbnQsIGFyZ3MpCisgICAgLy8gQzJNeVN0cmVhbVNldHRpbmc6Om91dHB1dCBrSXggICB8IHR1biB8IHN0ciB8IG91dHB1dCAgICAgKGludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1TZXR0aW5nOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhNeSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVN0cmVhbVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfU0VUVElORyB8IEk6OkRJUl9JTlBVVCB8IEk6OklTX1NUUkVBTV9GTEFHKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVN0cmVhbVNldHRpbmc6Om91dHB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhNeSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVN0cmVhbVNldHRpbmc6Om91dHB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX1NFVFRJTkcgfCBJOjpESVJfT1VUUFVUIHwgSTo6SVNfU1RSRUFNX0ZMQUcpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVN0cmVhbVNldHRpbmc6OmlucHV0KSA9PSAxMnUsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQpID09IDEydSwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtU2V0dGluZzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtU2V0dGluZzo6aW5wdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtU2V0dGluZzo6aW5wdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtU2V0dGluZzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbVNldHRpbmc6Om91dHB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7Cit9CisKK3ZvaWQgX0MyUGFyYW1JbnNwZWN0b3I6OlN0YXRpY0ZsZXhUZXN0KCkgeworICAgIHR5cGVkZWYgQzJQYXJhbTo6SW5kZXggSTsKKworICAgIC8vIEMyTnVtYmVyc1N0cnVjdDogQ09SRV9JTkRFWCA9IGtJbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVggPT0gKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJ1Y3QpID09IDAsICJiYWQgc2l6ZSIpOworCisgICAgLy8gQzJOdW1iZXJzVHVuaW5nOiAgICAgICAgICAgICBrSW5kZXggfCB0dW4gfCBnbG9iYWwgICAgICAgICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzVHVuaW5nOjpDT1JFX0lOREVYID09IChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNUdW5pbmc6OlBBUkFNX1RZUEUgPT0gKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX0dMT0JBTCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNUdW5pbmcpID09IDgsICJiYWQgc2l6ZSIpOworCisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNUdW5pbmcsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNUdW5pbmcsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNUdW5pbmcsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk51bWJlcnNQb3J0VHVuaW5nOiAgICAgICAgIGtJbmRleCB8IHR1biB8IHBvcnQgICAgICAgICAgICAgKGJvb2wsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzUG9ydFR1bmluZykgPT0gOCwgImJhZCBzaXplIik7CisgICAgLy8gQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6ICBrSW5kZXggfCB0dW4gfCBwb3J0IHwgaW5wdXQgICAgIChhcmdzKQorICAgIC8vIEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDoga0luZGV4IHwgdHVuIHwgcG9ydCB8IG91dHB1dCAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9JTlBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX09VVFBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCkgPT0gOCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0KSA9PSA4LCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCwgbS5tTnVtYmVycykgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCwgbS5tTnVtYmVycykgPT0gOCwgImJhZCBvZmZzZXQiKTsKKworICAgIC8vIEMyTnVtYmVyc1N0cmVhbVR1bmluZzogICAgICAga0luZGV4IHwgdHVuIHwgc3RyICAgICAgICAgICAgICAoYm9vbCwgdWludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJlYW1UdW5pbmcpID09IDgsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQga0luZGV4IHwgdHVuIHwgc3RyIHwgaW5wdXQgICAgICAoaW50LCBhcmdzKQorICAgIC8vIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0IGtJeCAgIHwgdHVuIHwgc3RyIHwgb3V0cHV0ICAgICAoaW50LCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9JTlBVVCB8IEk6OklTX1NUUkVBTV9GTEFHKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX09VVFBVVCB8IEk6OklTX1NUUkVBTV9GTEFHKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQpID09IDgsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0KSA9PSA4LCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dCwgbS5tTnVtYmVycykgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCwgbS5tTnVtYmVycykgPT0gOCwgImJhZCBvZmZzZXQiKTsKK30KKwordGVtcGxhdGU8Ym9vbCwgdW5zaWduZWQgLi4uTj4KK3N0cnVjdCBfcHJpbnRfYXNfd2FybmluZyB7IH07CisKK3RlbXBsYXRlPHVuc2lnbmVkIC4uLk4+CitzdHJ1Y3QgX3ByaW50X2FzX3dhcm5pbmc8dHJ1ZSwgTi4uLj4gOiBzdGQ6OnRydWVfdHlwZSB7IH07CisKKyNkZWZpbmUgc3RhdGljX2Fzc2VydF9lcXVhbHMoYSwgYiwgbXNnKSBcCitzdGF0aWNfYXNzZXJ0KF9wcmludF9hc193YXJuaW5nPChhKSA9PSAoYiksIGEsIGI+Ojp2YWx1ZSwgbXNnKQorCit2b2lkIF9DMlBhcmFtSW5zcGVjdG9yOjpTdGF0aWNGbGV4RnJvbUJhc2VUZXN0KCkgeworICAgIGVudW0geyBrUGFyYW1JbmRleE15ID0gMTIwMyB9OworICAgIHR5cGVkZWYgQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0IEMyTXlTdHJ1Y3Q7CisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJNeVN0cnVjdCwga1BhcmFtSW5kZXhNeT4gQzJNeUluZm87CisgICAgdHlwZWRlZiAgIEMyUG9ydFBhcmFtPEMySW5mbywgQzJNeVN0cnVjdCwga1BhcmFtSW5kZXhNeT4gQzJNeVBvcnRJbmZvOworICAgIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlTdHJlYW1JbmZvOworCisgICAgdHlwZWRlZiBDMlBhcmFtOjpJbmRleCBJOworCisgICAgLy8gQzJNeVN0cnVjdCBoYXMgbm8gQ09SRV9JTkRFWAorICAgIC8vc3RhdGljX2Fzc2VydChDMk15U3RydWN0OjpDT1JFX0lOREVYID09IChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15KSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJ1Y3QpID09IDQsICJiYWQgc2l6ZSIpOworCisgICAgLy8gQzJNeUluZm86ICAgICAgICAgICAgIGtJbmRleCB8IHR1biB8IGdsb2JhbCAgICAgICAgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydF9lcXVhbHMoQzJNeUluZm86OkNPUkVfSU5ERVgsIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15KSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnRfZXF1YWxzKEMyTXlJbmZvOjpQQVJBTV9UWVBFLCAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfSU5GTyB8IEk6OkRJUl9HTE9CQUwpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeUluZm8pID09IDEyLCAiYmFkIHNpemUiKTsKKworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeUluZm8sIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15SW5mbywgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlJbmZvLCBtLnNpZ25lZDMyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworCisgICAgLy8gQzJNeVBvcnRJbmZvOiAgICAgICAgIGtJbmRleCB8IHR1biB8IHBvcnQgICAgICAgICAgICAgKGJvb2wsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVBvcnRJbmZvKSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgLy8gQzJNeVBvcnRJbmZvOjppbnB1dDogIGtJbmRleCB8IHR1biB8IHBvcnQgfCBpbnB1dCAgICAgKGFyZ3MpCisgICAgLy8gQzJNeVBvcnRJbmZvOjpvdXRwdXQ6IGtJbmRleCB8IHR1biB8IHBvcnQgfCBvdXRwdXQgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk15UG9ydEluZm86OmlucHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0SW5mbzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15IHwgSTo6S0lORF9JTkZPIHwgSTo6RElSX0lOUFVUKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRJbmZvOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15KSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15IHwgSTo6S0lORF9JTkZPIHwgSTo6RElSX09VVFBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15UG9ydEluZm86OmlucHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVBvcnRJbmZvOjpvdXRwdXQpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0SW5mbzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydEluZm86OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRJbmZvOjppbnB1dCwgbS5zaWduZWQzMikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0SW5mbzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRJbmZvOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydEluZm86Om91dHB1dCwgbS5zaWduZWQzMikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKworICAgIC8vIEMyTXlTdHJlYW1JbmZvOiAgICAgICBrSW5kZXggfCB0dW4gfCBzdHIgICAgICAgICAgICAgIChib29sLCB1aW50LCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJlYW1JbmZvKSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgLy8gQzJNeVN0cmVhbUluZm86OmlucHV0IGtJbmRleCB8IHR1biB8IHN0ciB8IGlucHV0ICAgICAgKGludCwgYXJncykKKyAgICAvLyBDMk15U3RyZWFtSW5mbzo6b3V0cHV0IGtJeCAgIHwgdHVuIHwgc3RyIHwgb3V0cHV0ICAgICAoaW50LCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJNeVN0cmVhbUluZm86OmlucHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1JbmZvOjppbnB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX0lORk8gfCBJOjpESVJfSU5QVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1JbmZvOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15KSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVN0cmVhbUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX0lORk8gfCBJOjpESVJfT1VUUFVUIHwgSTo6SVNfU1RSRUFNX0ZMQUcpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVN0cmVhbUluZm86OmlucHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVN0cmVhbUluZm86Om91dHB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbUluZm86OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbUluZm86OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbUluZm86OmlucHV0LCBtLnNpZ25lZDMyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbUluZm86Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1JbmZvOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtSW5mbzo6b3V0cHV0LCBtLnNpZ25lZDMyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworfQorCitURVNUX0YoQzJQYXJhbVRlc3QsIFBhcmFtT3BzVGVzdCkgeworICAgIGNvbnN0IEMyTnVtYmVyU3RydWN0IHN0cigxMDApOworICAgIEMyTnVtYmVyU3RydWN0IGJzdHI7CisKKyAgICB7CisgICAgICAgIEVYUEVDVF9FUSgxMDAsIHN0ci5tTnVtYmVyKTsKKyAgICAgICAgYnN0ci5tTnVtYmVyID0gMTAwOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgfQorCisgICAgY29uc3QgQzJOdW1iZXJUdW5pbmcgdHVuKDEwMCk7CisgICAgQzJOdW1iZXJUdW5pbmcgYnR1bjsKKworICAgIHsKKyAgICAgIEMyTnVtYmVySW5mbyBpbmYoMTAwKTsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNUdW5pbmc+IHR1bl8gPSBDMk51bWJlcnNUdW5pbmc6OkFsbG9jVW5pcXVlKDEpOworCisgICAgICBFWFBFQ1RfRVEodHVuLmNvcmVJbmRleCgpLCBpbmYuY29yZUluZGV4KCkpOworICAgICAgRVhQRUNUX05FKHR1bi5jb3JlSW5kZXgoKSwgdHVuXy0+Y29yZUluZGV4KCkpOworICAgICAgRVhQRUNUX05FKHR1bi50eXBlKCksIGluZi50eXBlKCkpOworICAgICAgRVhQRUNUX05FKHR1bi50eXBlKCksIHR1bl8tPnR5cGUoKSk7CisgICAgfQorCisgICAgeworICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgdHVuLCBidHVuIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yT3V0cHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yUG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlCisgICAgICAgIEVYUEVDVF9FUSgxMDAsIHR1bi5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJ0dW4ubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0dW4gPT0gYnR1bik7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0dW4ub3BlcmF0b3I9PShidHVuKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR1biAhPSBidHVuKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHVuLm9wZXJhdG9yIT0oYnR1bikpOworICAgICAgICBidHVuLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9FUSh0dW4sIGJ0dW4pOworCisgICAgICAgIC8vIGluZGV4CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKHR1bi50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKHR1bi50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSh0dW4udHlwZSgpLCBDMk51bWJlclR1bmluZzo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUSh0dW4uc3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0gQzJOdW1iZXJUdW5pbmc6OkNPUkVfSU5ERVg7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKworICAgICAgICBDMlBhcmFtOjpUeXBlIHR5cGUgPSBDMk51bWJlclR1bmluZzo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJnR1biksICZ0dW4pOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJnR1biksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJnR1biksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJnR1biksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJnR1biksIG51bGxwdHIpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoYnR1bikpLCBidHVuKTsKKyAgICAgICAgYnR1bi5pbnZhbGlkYXRlKCk7CisgICAgICAgIEVYUEVDVF9GQUxTRShDMlBhcmFtOjpDb3B5KGJ0dW4pKTsKKyAgICB9CisKKyAgICBjb25zdCBDMk51bWJlclBvcnRUdW5pbmcgb3V0cDEodHJ1ZSwgMTAwKSwgaW5wMShmYWxzZSwgMTAwKTsKKyAgICBDMk51bWJlclBvcnRUdW5pbmcgYm91dHAxLCBiaW5wMSwgYmlucDMoZmFsc2UsIDEwMCk7CisgICAgY29uc3QgQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCBpbnAyKDEwMCk7CisgICAgQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCBiaW5wMjsKKyAgICBjb25zdCBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCBvdXRwMigxMDApOworICAgIEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0IGJvdXRwMjsKKworICAgIEVYUEVDVF9FUShpbnAxLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShvdXRwMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEoYmlucDEuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKGJvdXRwMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEoaW5wMi5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEob3V0cDIuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisKKyAgICBFWFBFQ1RfRVEoaW5wMS50eXBlKCksIGlucDIudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEob3V0cDEudHlwZSgpLCBvdXRwMi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnAxLnR5cGUoKSwgb3V0cDEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5wMi50eXBlKCksIG91dHAyLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGlucDEudHlwZSgpLCBiaW5wMS50eXBlKCkpOworICAgIEVYUEVDVF9ORShvdXRwMS50eXBlKCksIGJvdXRwMS50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnAxLnR5cGUoKSwgdHVuLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGlucDIudHlwZSgpLCB0dW4udHlwZSgpKTsKKworICAgIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydChiaW5wMyksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KGJpbnAxKSwgInNob3VsZCBiZSBhYmxlIHRvIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGlucDEpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoaW5wMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0ICYgdHlwZSkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoYmlucDIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvICh0eXBlKSIpOworCisgICAgICAgIC8vIGZsYWdzICYgaW52YXJpYWJsZXMKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRwMSwgaW5wMSwgYm91dHAxIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgaW5wMiwgYmlucDIgfSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvclBvcnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRwMiwgYm91dHAyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JQb3J0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcG9ydCBzcGVjaWZpYyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIEVYUEVDVF9GQUxTRShvdXRwMS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEuZm9yT3V0cHV0KCkpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGlucDEuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbnAxLmZvck91dHB1dCgpKTsKKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHAxLCBpbnAxIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMDAsIHAubU51bWJlcik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRwMiwgYm91dHAyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvck91dHB1dCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IGlucDIsIGJpbnAyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKKworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvck91dHB1dCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IGJvdXRwMSB9ICkgeworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKChib29sKXApOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoIXApOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvck91dHB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgwLCBwLm1OdW1iZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmFsdWVzCisgICAgICAgIEVYUEVDVF9FUSgxMDAsIGlucDIubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgxMDAsIG91dHAyLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmlucDEubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBiaW5wMi5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRwMS5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRwMi5tTnVtYmVyKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnAxICE9IG91dHAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSA9PSBpbnAyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEgPT0gb3V0cDIpOworICAgICAgICBFWFBFQ1RfVFJVRShiaW5wMSA9PSBib3V0cDEpOworICAgICAgICBFWFBFQ1RfVFJVRShiaW5wMiAhPSBib3V0cDIpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGlucDEgIT0gYmlucDEpOworICAgICAgICBiaW5wMS5tTnVtYmVyID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRShpbnAxICE9IGJpbnAxKTsKKyAgICAgICAgYmlucDEuc2V0UG9ydChmYWxzZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCliaW5wMSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSghYmlucDEpOworICAgICAgICBFWFBFQ1RfVFJVRShpbnAxID09IGJpbnAxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnAyICE9IGJpbnAyKTsKKyAgICAgICAgYmlucDIubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMiA9PSBiaW5wMik7CisKKyAgICAgICAgYmlucDEuc2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxID09IGJpbnAxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMSAhPSBib3V0cDEpOworICAgICAgICBib3V0cDEubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEgIT0gYm91dHAxKTsKKyAgICAgICAgYm91dHAxLnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClib3V0cDEpOworICAgICAgICBFWFBFQ1RfRkFMU0UoIWJvdXRwMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxID09IGJvdXRwMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0cDIgIT0gYm91dHAyKTsKKyAgICAgICAgYm91dHAyLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAyID09IGJvdXRwMik7CisKKyAgICAgICAgYm91dHAxLnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSA9PSBib3V0cDEpOworCisgICAgICAgIC8vIGluZGV4CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDEudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnAxLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDEudHlwZSgpLCBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDEuc3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMi50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDIudHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoaW5wMi50eXBlKCksIEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEoaW5wMi5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMS50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAxLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAxLnR5cGUoKSwgQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEob3V0cDEuc3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDIudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMi50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShvdXRwMi50eXBlKCksIEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAyLnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKworICAgICAgICBpbmRleCA9IEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisKKyAgICAgICAgQzJQYXJhbTo6VHlwZSB0eXBlID0gQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIHR5cGUgPSBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmaW5wMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJmlucDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZvdXRwMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJm91dHAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJmlucDEpLCAmaW5wMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJmlucDIpLCAoQzJOdW1iZXJQb3J0VHVuaW5nKikmaW5wMik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJm91dHAxKSwgJm91dHAxKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmb3V0cDIpLCAoQzJOdW1iZXJQb3J0VHVuaW5nKikmb3V0cDIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmaW5wMSksIChDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0KikmaW5wMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZpbnAyKSwgJmlucDIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0cDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5wMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJmlucDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRwMSksIChDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCopJm91dHAxKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRwMiksICZvdXRwMik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmaW5wMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJmlucDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZvdXRwMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJm91dHAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJmlucDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmaW5wMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRwMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRwMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5wMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5wMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0cDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHAyKSwgbnVsbHB0cik7CisKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShpbnAxKSksIGlucDEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KGlucDIpKSwgaW5wMik7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkob3V0cDEpKSwgb3V0cDEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KG91dHAyKSksIG91dHAyKTsKKyAgICB9CisKKyAgICBjb25zdCBDMk51bWJlclN0cmVhbVR1bmluZyBvdXRzMSh0cnVlLCAxdSwgMTAwKSwgaW5zMShmYWxzZSwgMXUsIDEwMCk7CisgICAgQzJOdW1iZXJTdHJlYW1UdW5pbmcgYm91dHMxLCBiaW5zMSwgYmluczMoZmFsc2UsIDF1LCAxMDApOworICAgIGNvbnN0IEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCBpbnMyKDF1LCAxMDApOworICAgIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dCBiaW5zMjsKKyAgICBjb25zdCBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0IG91dHMyKDF1LCAxMDApOworICAgIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQgYm91dHMyOworCisgICAgRVhQRUNUX0VRKGluczEuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKG91dHMxLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShiaW5zMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEoYm91dHMxLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShpbnMyLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShvdXRzMi5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKworICAgIEVYUEVDVF9FUShpbnMxLnR5cGUoKSwgaW5zMi50eXBlKCkpOworICAgIEVYUEVDVF9FUShpbnMxLnR5cGUoKSwgYmluczIudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEob3V0czEudHlwZSgpLCBvdXRzMi50eXBlKCkpOworICAgIEVYUEVDVF9FUShvdXRzMS50eXBlKCksIGJvdXRzMi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnMxLnR5cGUoKSwgb3V0czEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5zMi50eXBlKCksIG91dHMyLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGluczEudHlwZSgpLCBiaW5zMS50eXBlKCkpOworICAgIEVYUEVDVF9ORShvdXRzMS50eXBlKCksIGJvdXRzMS50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnMxLnR5cGUoKSwgdHVuLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGluczIudHlwZSgpLCB0dW4udHlwZSgpKTsKKworICAgIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydChiaW5zMyksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KGJpbnMxKSwgInNob3VsZCBiZSBhYmxlIHRvIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGluczEpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoaW5zMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0ICYgdHlwZSkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoYmluczIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvICh0eXBlKSIpOworCisgICAgICAgIC8vIGZsYWdzICYgaW52YXJpYWJsZXMKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRzMSwgaW5zMSwgYm91dHMxIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgaW5zMiwgYmluczIgfSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclBvcnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRzMiwgYm91dHMyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JQb3J0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcG9ydCBzcGVjaWZpYyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIEVYUEVDVF9GQUxTRShvdXRzMS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEuZm9yT3V0cHV0KCkpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGluczEuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbnMxLmZvck91dHB1dCgpKTsKKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHMxLCBpbnMxIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKXApOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCFwKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMDAsIHAubU51bWJlcik7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMXUsIHAuc3RyZWFtKCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0czIsIGJvdXRzMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBpbnMyLCBiaW5zMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBib3V0czEgfSApIHsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKCFwKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JPdXRwdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMCwgcC5tTnVtYmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlcworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBpbnMyLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBvdXRzMi5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnMxLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmluczIubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0czEubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0czIubU51bWJlcik7CisKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBpbnMyLnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBvdXRzMi5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYmluczEuc3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJpbnMyLnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBib3V0czEuc3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJvdXRzMi5zdHJlYW0oKSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSAhPSBvdXRzMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgPT0gaW5zMik7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxID09IG91dHMyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoYmluczEgPT0gYm91dHMxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoYmluczIgIT0gYm91dHMyKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxICE9IGJpbnMxKTsKKyAgICAgICAgYmluczEubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSAhPSBiaW5zMSk7CisgICAgICAgIGJpbnMxLnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSAhPSBiaW5zMSk7CisgICAgICAgIGJpbnMxLnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgPT0gYmluczEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGluczIgIT0gYmluczIpOworICAgICAgICBiaW5zMi5tTnVtYmVyID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRShpbnMyICE9IGJpbnMyKTsKKyAgICAgICAgYmluczIuc2V0U3RyZWFtKDF1KTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMiA9PSBiaW5zMik7CisKKyAgICAgICAgYmluczEuc2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxID09IGJpbnMxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMSAhPSBib3V0czEpOworICAgICAgICBib3V0czEubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEgIT0gYm91dHMxKTsKKyAgICAgICAgYm91dHMxLnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMSAhPSBib3V0czEpOworICAgICAgICBib3V0czEuc2V0U3RyZWFtKDF1KTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEgPT0gYm91dHMxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMiAhPSBib3V0czIpOworICAgICAgICBib3V0czIubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czIgIT0gYm91dHMyKTsKKyAgICAgICAgYm91dHMyLnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMyID09IGJvdXRzMik7CisKKyAgICAgICAgYm91dHMxLnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSA9PSBib3V0czEpOworCisgICAgICAgIC8vIGluZGV4CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczEudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMxLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluczEudHlwZSgpLCBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczIudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMyLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluczIudHlwZSgpLCBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMxLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0czEudHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEob3V0czEudHlwZSgpLCBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMi50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMyLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHMyLnR5cGUoKSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0gQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisKKyAgICAgICAgaW5kZXggPSBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisKKyAgICAgICAgQzJQYXJhbTo6VHlwZSB0eXBlID0gQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgdHlwZSA9IEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJmluczEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZpbnMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmb3V0czEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZvdXRzMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZpbnMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJmluczIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmb3V0czEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmb3V0czIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJmluczEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJmluczIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRzMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJmluczEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0czEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRzMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJmluczEpLCAmaW5zMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmaW5zMiksIChDMk51bWJlclN0cmVhbVR1bmluZyopJmluczIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJm91dHMxKSwgJm91dHMxKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZvdXRzMiksIChDMk51bWJlclN0cmVhbVR1bmluZyopJm91dHMyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmaW5zMSksIChDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQqKSZpbnMxKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmaW5zMiksICZpbnMyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0czEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0czIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJmluczEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJmluczIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHMxKSwgKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQqKSZvdXRzMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRzMiksICZvdXRzMik7CisKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShpbnMxKSksIGluczEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KGluczIpKSwgaW5zMik7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkob3V0czEpKSwgb3V0czEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KG91dHMyKSksIG91dHMyKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZpZGVvV2lkdGhbXSA9IHsgMTJ1LCBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFLCAxMDAgfTsKKyAgICAgICAgQzJQYXJhbSAqcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSk7CisgICAgICAgIEVYUEVDVF9ORShwMSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAxLT5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEocDEtPnR5cGUoKSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSArIDIpOworICAgICAgICBFWFBFQ1RfRVEocDEsIG51bGxwdHIpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgLSAyKTsKKyAgICAgICAgRVhQRUNUX0VRKHAxLCBudWxscHRyKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgMyk7CisgICAgICAgIEVYUEVDVF9FUShwMSwgbnVsbHB0cik7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDApOworICAgICAgICBFWFBFQ1RfRVEocDEsIG51bGxwdHIpOworICAgIH0KK30KKwordm9pZCBTdGF0aWNUZXN0QWRkQ29yZUluZGV4KCkgeworICAgIHN0cnVjdCBub2Jhc2Uge307CisgICAgc3RydWN0IGJhc2UgeyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0gMSB9OyB9OworICAgIHN0YXRpY19hc3NlcnQoX0MyQWRkQ29yZUluZGV4PG5vYmFzZSwgMj46OkNPUkVfSU5ERVggPT0gMiwgInNob3VsZCBiZSAyIik7CisgICAgc3RhdGljX2Fzc2VydChfQzJBZGRDb3JlSW5kZXg8YmFzZSwgMT46OkNPUkVfSU5ERVggPT0gMSwgInNob3VsZCBiZSAxIik7Cit9CisKK2NsYXNzIFRlc3RGbGV4SGVscGVyIHsKKyAgICBzdHJ1Y3QgX0ZsZXggeworICAgICAgICBpbnQzMl90IGE7CisgICAgICAgIGNoYXIgYltdOworICAgICAgICBfRmxleCgpIHt9CisgICAgICAgIEZMRVgoX0ZsZXgsIGIpOworICAgIH07CisKKyAgICBzdHJ1Y3QgX0JvRmxleCB7CisgICAgICAgIF9GbGV4IGE7CisgICAgICAgIF9Cb0ZsZXgoKSB7fQorICAgICAgICBGTEVYKF9Cb0ZsZXgsIGEpOworICAgIH07CisKKyAgICBzdHJ1Y3QgX05vbkZsZXggeworICAgIH07CisKKworICAgIHN0YXRpYyB2b2lkIFN0YXRpY1Rlc3QoKSB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPF9DMkZsZXhIZWxwZXI8Y2hhcj46OkZsZXhUeXBlLCB2b2lkPjo6dmFsdWUsICJzaG91bGQgYmUgdm9pZCIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxfQzJGbGV4SGVscGVyPGNoYXJbXT46OkZsZXhUeXBlLCBjaGFyPjo6dmFsdWUsICJzaG91bGQgYmUgY2hhciIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxfQzJGbGV4SGVscGVyPF9GbGV4Pjo6RmxleFR5cGUsIGNoYXI+Ojp2YWx1ZSwgInNob3VsZCBiZSBjaGFyIik7CisKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8X0MyRmxleEhlbHBlcjxfQm9GbGV4Pjo6RmxleFR5cGUsIGNoYXI+Ojp2YWx1ZSwgInNob3VsZCBiZSB2b2lkIik7CisKKyAgICAgICAgc3RhdGljX2Fzc2VydChfQzJGbGV4aWJsZTxfRmxleD46OnZhbHVlLCAic2hvdWxkIGJlIGZsZXhpYmxlIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIV9DMkZsZXhpYmxlPF9Ob25GbGV4Pjo6dmFsdWUsICJzaG91bGQgbm90IGJlIGZsZXhpYmxlIik7CisgICAgfQorfTsKKworVEVTVF9GKEMyUGFyYW1UZXN0LCBGbGV4UGFyYW1PcHNUZXN0KSB7CisvLyAgICBjb25zdCBDMk51bWJlcnNTdHJ1Y3Qgc3RyezEwMH07CisgICAgQzJOdW1iZXJzU3RydWN0IGJzdHI7CisgICAgeworLy8gICAgICAgIEVYUEVDVF9FUSgxMDAsIHN0ci0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgICh2b2lkKSZic3RyLm1OdW1iZXJzWzBdOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWDsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNUdW5pbmc+IHR1bl8gPSBDMk51bWJlcnNUdW5pbmc6OkFsbG9jVW5pcXVlKDEpOworICAgIHR1bl8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1R1bmluZz4gdHVuID0gc3RkOjptb3ZlKHR1bl8pOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNUdW5pbmc+IGJ0dW4gPSBDMk51bWJlcnNUdW5pbmc6OkFsbG9jU2hhcmVkKDEpOworCisgICAgeworICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1R1bmluZyAqVFtdID0geyB0dW4uZ2V0KCksIGJ0dW4uZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBUKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JQb3J0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmFsdWUKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgdHVuLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJ0dW4tPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRkFMU0UoKnR1biA9PSAqYnR1bik7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0dW4tPm9wZXJhdG9yPT0oKmJ0dW4pKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKnR1biAhPSAqYnR1bik7CisgICAgICAgIEVYUEVDVF9UUlVFKHR1bi0+b3BlcmF0b3IhPSgqYnR1bikpOworICAgICAgICBidHVuLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfRVEoKnR1biwgKmJ0dW4pOworCisgICAgICAgIC8vIGluZGV4CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKHR1bi0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUodHVuLT50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworICAgICAgICBFWFBFQ1RfRVEodHVuLT50eXBlKCksIEMyTnVtYmVyc1R1bmluZzo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUSh0dW4tPnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyc1R1bmluZzo6Q09SRV9JTkRFWDsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworCisgICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyc1R1bmluZzo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKHR1bi5nZXQoKSksIHR1bi5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20odHVuLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20odHVuLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20odHVuLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20odHVuLmdldCgpKSwgbnVsbHB0cik7CisKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqdHVuKSksICp0dW4pOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNQb3J0VHVuaW5nPiBvdXRwMV8oQzJOdW1iZXJzUG9ydFR1bmluZzo6QWxsb2NVbmlxdWUoMSwgdHJ1ZSkpLAorICAgICAgICAgICAgaW5wMV8gPSBDMk51bWJlcnNQb3J0VHVuaW5nOjpBbGxvY1VuaXF1ZSgxLCBmYWxzZSk7CisgICAgb3V0cDFfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIGlucDFfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nPiBvdXRwMSA9IHN0ZDo6bW92ZShvdXRwMV8pOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nPiBpbnAxID0gc3RkOjptb3ZlKGlucDFfKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZz4gYm91dHAxKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkFsbG9jU2hhcmVkKDEpKSwKKyAgICAgICAgICAgIGJpbnAxID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6QWxsb2NTaGFyZWQoMSksCisgICAgICAgICAgICBiaW5wMyA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OkFsbG9jU2hhcmVkKDEsIGZhbHNlKTsKKyAgICBiaW5wMy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ+IGlucDJfKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpBbGxvY1VuaXF1ZSgxKSk7CisgICAgaW5wMl8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0PiBpbnAyID0gc3RkOjptb3ZlKGlucDJfKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ+IGJpbnAyKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpBbGxvY1NoYXJlZCgxKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dD4gb3V0cDJfKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoMSkpOworICAgIG91dHAyXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0PiBvdXRwMiA9IHN0ZDo6bW92ZShvdXRwMl8pOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ+IGJvdXRwMihDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKDEpKTsKKworICAgIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydCgqYmlucDMpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydCgqYmlucDEpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmlucDEpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmlucDIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCAmIHR5cGUpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KCpiaW5wMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKHR5cGUpIik7CisKKyAgICAgICAgLy8gZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nICpQW10gPSB7IG91dHAxLmdldCgpLCBpbnAxLmdldCgpLCBib3V0cDEuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0ICpQSVtdID0geyBpbnAyLmdldCgpLCBiaW5wMi5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFBJKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCAqUE9bXSA9IHsgb3V0cDIuZ2V0KCksIGJvdXRwMi5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFBPKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JQb3J0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcG9ydCBzcGVjaWZpYyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIEVYUEVDVF9GQUxTRShvdXRwMS0+Zm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxLT5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMS0+Zm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbnAxLT5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgY29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZyAqUDJbXSA9IHsgb3V0cDEuZ2V0KCksIGlucDEuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQMikgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDEwMCwgcC0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQTykgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQSSkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOworCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZyAqUDNbXSA9IHsgYm91dHAxLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUDMpIHsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSgoYm9vbCkoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvck91dHB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgwLCBwLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlcworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBpbnAyLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgb3V0cDItPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmlucDEtPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmlucDItPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHAxLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRwMi0+bS5tTnVtYmVyc1swXSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDEgIT0gKm91dHAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDEgPT0gKmlucDIpOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDEgPT0gKm91dHAyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmJpbnAxID09ICpib3V0cDEpOworICAgICAgICBFWFBFQ1RfVFJVRSgqYmlucDIgIT0gKmJvdXRwMik7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDEgIT0gKmJpbnAxKTsKKyAgICAgICAgYmlucDEtPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxICE9ICpiaW5wMSk7CisgICAgICAgIGJpbnAxLT5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSpiaW5wMSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSghKmJpbnAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDEgPT0gKmJpbnAxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5wMiAhPSAqYmlucDIpOworICAgICAgICBiaW5wMi0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDIgPT0gKmJpbnAyKTsKKworICAgICAgICBiaW5wMS0+c2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRwMSA9PSAqYmlucDEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRwMSAhPSAqYm91dHAxKTsKKyAgICAgICAgYm91dHAxLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDEgIT0gKmJvdXRwMSk7CisgICAgICAgIGJvdXRwMS0+c2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSpib3V0cDEpOworICAgICAgICBFWFBFQ1RfRkFMU0UoISpib3V0cDEpOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDEgPT0gKmJvdXRwMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAyICE9ICpib3V0cDIpOworICAgICAgICBib3V0cDItPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRwMiA9PSAqYm91dHAyKTsKKworICAgICAgICBib3V0cDEtPnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDEgPT0gKmJvdXRwMSk7CisKKyAgICAgICAgLy8gaW5kZXgKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMS0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMS0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDEtPnR5cGUoKSwgQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEoaW5wMS0+c3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMi0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMi0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDItPnR5cGUoKSwgQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEoaW5wMi0+c3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDEtPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAxLT50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworICAgICAgICBFWFBFQ1RfRVEob3V0cDEtPnR5cGUoKSwgQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAxLT5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMi0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDItPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShvdXRwMi0+dHlwZSgpLCBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEob3V0cDItPnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzIHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19GTEVYX0ZMQUcpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisKKyAgICAgICAgaW5kZXggPSBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRyk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKworICAgICAgICBDMlBhcmFtOjpUeXBlIHR5cGUgPSBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgdHlwZSA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShpbnAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20oaW5wMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKG91dHAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20ob3V0cDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20oaW5wMS5nZXQoKSksIGlucDEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShpbnAyLmdldCgpKSwgKEMyTnVtYmVyc1BvcnRUdW5pbmcqKWlucDIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShvdXRwMS5nZXQoKSksIG91dHAxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20ob3V0cDIuZ2V0KCkpLCAoQzJOdW1iZXJzUG9ydFR1bmluZyopb3V0cDIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oaW5wMS5nZXQoKSksIChDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCopaW5wMS5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShpbnAyLmdldCgpKSwgaW5wMi5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShvdXRwMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20ob3V0cDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShpbnAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5wMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHAxLmdldCgpKSwgKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCopb3V0cDEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHAyLmdldCgpKSwgb3V0cDIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKGlucDEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShpbnAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20ob3V0cDEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShvdXRwMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShpbnAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKGlucDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20ob3V0cDEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20ob3V0cDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKGlucDEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKGlucDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShvdXRwMi5nZXQoKSksIG51bGxwdHIpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKmlucDEpKSwgKmlucDEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KCppbnAyKSksICppbnAyKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqb3V0cDEpKSwgKm91dHAxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqb3V0cDIpKSwgKm91dHAyKTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBvdXRzMV8oQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpBbGxvY1VuaXF1ZSgxLCB0cnVlLCAxdSkpOworICAgIG91dHMxXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBvdXRzMSA9IHN0ZDo6bW92ZShvdXRzMV8pOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc+IGluczFfKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6QWxsb2NVbmlxdWUoMSwgZmFsc2UsIDF1KSk7CisgICAgaW5zMV8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gaW5zMSA9IHN0ZDo6bW92ZShpbnMxXyk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gYm91dHMxKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6QWxsb2NTaGFyZWQoMSkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc+IGJpbnMxKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6QWxsb2NTaGFyZWQoMSkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc+IGJpbnMzKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6QWxsb2NTaGFyZWQoMSwgZmFsc2UsIDF1KSk7CisgICAgYmluczMtPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ+IGluczJfKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkFsbG9jVW5pcXVlKDEsIDF1KSk7CisgICAgaW5zMl8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ+IGluczIgPSBzdGQ6Om1vdmUoaW5zMl8pOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0PiBiaW5zMihDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpBbGxvY1NoYXJlZCgxKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0PiBvdXRzMl8oQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKDEsIDF1KSk7CisgICAgb3V0czJfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dD4gb3V0czIgPSBzdGQ6Om1vdmUob3V0czJfKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ+IGJvdXRzMihDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6QWxsb2NTaGFyZWQoMSkpOworCisgICAgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KCpiaW5zMyksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KGNhbkNhbGxTZXRQb3J0KCpiaW5zMSksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydCgqaW5zMSksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0KSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydCgqaW5zMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKGNvbnN0ICYgdHlwZSkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmJpbnMyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAodHlwZSkiKTsKKworICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZyAqU1tdID0geyBvdXRzMS5nZXQoKSwgaW5zMS5nZXQoKSwgYm91dHMxLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUykgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0ICpTSVtdID0geyBpbnMyLmdldCgpLCBiaW5zMi5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFNJKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0ICpTT1tdID0geyBvdXRzMi5nZXQoKSwgYm91dHMyLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogU08pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAtPnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclBvcnQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwb3J0IHNwZWNpZmljIGZsYWdzICYgaW52YXJpYWJsZXMKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG91dHMxLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEtPmZvck91dHB1dCgpKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluczEtPmZvck91dHB1dCgpKTsKKworICAgICAgICBjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmcgKlMyW10gPSB7IG91dHMxLmdldCgpLCBpbnMxLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUzIpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMDAsIHAtPm0ubU51bWJlcnNbMF0pOworICAgICAgICAgICAgRVhQRUNUX0VRKDF1LCBwLT5zdHJlYW0oKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBTTykgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBTSSkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOworCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nICpTM1tdID0geyBib3V0czEuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBTMykgeworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoISgqcCkpOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDAsIHAtPm0ubU51bWJlcnNbMF0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmFsdWVzCisgICAgICAgIEVYUEVDVF9FUSgxMDAsIGluczItPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBvdXRzMi0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBiaW5zMS0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBiaW5zMi0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0czEtPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHMyLT5tLm1OdW1iZXJzWzBdKTsKKworICAgICAgICBFWFBFQ1RfRVEoMXUsIGluczItPnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBvdXRzMi0+c3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJpbnMxLT5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYmluczItPnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBib3V0czEtPnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBib3V0czItPnN0cmVhbSgpKTsKKworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMSAhPSAqb3V0czEpOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMSA9PSAqaW5zMik7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSA9PSAqb3V0czIpOworICAgICAgICBFWFBFQ1RfVFJVRSgqYmluczEgPT0gKmJvdXRzMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpiaW5zMiAhPSAqYm91dHMyKTsKKworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMSAhPSAqYmluczEpOworICAgICAgICBiaW5zMS0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgIT0gKmJpbnMxKTsKKyAgICAgICAgYmluczEtPnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgIT0gKmJpbnMxKTsKKyAgICAgICAgYmluczEtPnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMxID09ICpiaW5zMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczIgIT0gKmJpbnMyKTsKKyAgICAgICAgYmluczItPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMyICE9ICpiaW5zMik7CisgICAgICAgIGJpbnMyLT5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMiA9PSAqYmluczIpOworCisgICAgICAgIGJpbnMxLT5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMxID09ICpiaW5zMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMxICE9ICpib3V0czEpOworICAgICAgICBib3V0czEtPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSAhPSAqYm91dHMxKTsKKyAgICAgICAgYm91dHMxLT5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMxICE9ICpib3V0czEpOworICAgICAgICBib3V0czEtPnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSA9PSAqYm91dHMxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czIgIT0gKmJvdXRzMik7CisgICAgICAgIGJvdXRzMi0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMyICE9ICpib3V0czIpOworICAgICAgICBib3V0czItPnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMiA9PSAqYm91dHMyKTsKKworICAgICAgICBib3V0czEtPnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgPT0gKmJvdXRzMSk7CisKKyAgICAgICAgLy8gaW5kZXgKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMS0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMS0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKGluczEtPnR5cGUoKSwgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMi0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMi0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKGluczItPnR5cGUoKSwgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0czEtPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMxLT50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworICAgICAgICBFWFBFQ1RfRVEob3V0czEtPnR5cGUoKSwgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMyLT50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMi0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHMyLT50eXBlKCksIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzIHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19GTEVYX0ZMQUcpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisKKyAgICAgICAgaW5kZXggPSBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworCisgICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIHR5cGUgPSBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShpbnMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20oaW5zMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKG91dHMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20ob3V0czIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShpbnMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKG91dHMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKG91dHMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShpbnMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShpbnMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20ob3V0czIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShpbnMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5zMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0czIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShpbnMxLmdldCgpKSwgaW5zMS5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20oaW5zMi5nZXQoKSksIChDMk51bWJlcnNTdHJlYW1UdW5pbmcqKWluczIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKG91dHMxLmdldCgpKSwgb3V0czEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKG91dHMyLmdldCgpKSwgKEMyTnVtYmVyc1N0cmVhbVR1bmluZyopb3V0czIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShpbnMxLmdldCgpKSwgKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQqKWluczEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShpbnMyLmdldCgpKSwgaW5zMi5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKG91dHMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKG91dHMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShpbnMxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShpbnMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShvdXRzMS5nZXQoKSksIChDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCopb3V0czEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0czIuZ2V0KCkpLCBvdXRzMi5nZXQoKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqaW5zMSkpLCAqaW5zMSk7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKmluczIpKSwgKmluczIpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KCpvdXRzMSkpLCAqb3V0czEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KCpvdXRzMikpLCAqb3V0czIpOworICAgIH0KKworICAgIHsKKyAgICAgICAgQzJJbnQzMlZhbHVlIGludDMyVmFsdWUoSU5UMzJfTUlOKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoaW50MzJWYWx1ZS52YWx1ZSksIGludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQzMl90Iik7CisgICAgICAgIEVYUEVDVF9FUShJTlQzMl9NSU4sIGludDMyVmFsdWUudmFsdWUpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gaW50MzJWYWx1ZS5GaWVsZExpc3QoKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEZEOjpJTlQzMiwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEMyVWludDMyVmFsdWUgdWludDMyVmFsdWUoVUlOVDMyX01BWCk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKHVpbnQzMlZhbHVlLnZhbHVlKSwgdWludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50MzJfdCIpOworICAgICAgICBFWFBFQ1RfRVEoVUlOVDMyX01BWCwgdWludDMyVmFsdWUudmFsdWUpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gdWludDMyVmFsdWUuRmllbGRMaXN0KCk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShGRDo6VUlOVDMyLCBmaWVsZHMuY2JlZ2luKCktPnR5cGUoKSk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLmNiZWdpbigpLT5leHRlbnQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMlN0cmluZygidmFsdWUiKSwgZmllbGRzLmNiZWdpbigpLT5uYW1lKCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgQzJJbnQ2NFZhbHVlIGludDY0VmFsdWUoSU5UNjRfTUlOKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoaW50NjRWYWx1ZS52YWx1ZSksIGludDY0X3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQ2NF90Iik7CisgICAgICAgIEVYUEVDVF9FUShJTlQ2NF9NSU4sIGludDY0VmFsdWUudmFsdWUpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gaW50NjRWYWx1ZS5GaWVsZExpc3QoKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEZEOjpJTlQ2NCwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEMyVWludDY0VmFsdWUgdWludDY0VmFsdWUoVUlOVDY0X01BWCk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKHVpbnQ2NFZhbHVlLnZhbHVlKSwgdWludDY0X3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50NjRfdCIpOworICAgICAgICBFWFBFQ1RfRVEoVUlOVDY0X01BWCwgdWludDY0VmFsdWUudmFsdWUpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gdWludDY0VmFsdWUuRmllbGRMaXN0KCk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShGRDo6VUlOVDY0LCBmaWVsZHMuY2JlZ2luKCktPnR5cGUoKSk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLmNiZWdpbigpLT5leHRlbnQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMlN0cmluZygidmFsdWUiKSwgZmllbGRzLmNiZWdpbigpLT5uYW1lKCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgQzJGbG9hdFZhbHVlIGZsb2F0VmFsdWUoMTIzLjRmKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoZmxvYXRWYWx1ZS52YWx1ZSksIGZsb2F0Pjo6dmFsdWUsICJzaG91bGQgYmUgZmxvYXQiKTsKKyAgICAgICAgRVhQRUNUX0VRKDEyMy40ZiwgZmxvYXRWYWx1ZS52YWx1ZSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBmbG9hdFZhbHVlLkZpZWxkTGlzdCgpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoRkQ6OkZMT0FULCBmaWVsZHMuY2JlZ2luKCktPnR5cGUoKSk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLmNiZWdpbigpLT5leHRlbnQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMlN0cmluZygidmFsdWUiKSwgZmllbGRzLmNiZWdpbigpLT5uYW1lKCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgdWludDhfdCBpbml0VmFsdWVbXSA9ICJBQkNEIjsKKyAgICAgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJCbG9iVmFsdWUsIDA+IEJsb2JTZXR0aW5nOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QmxvYlNldHRpbmc+IGJsb2JWYWx1ZSA9IEJsb2JTZXR0aW5nOjpBbGxvY1VuaXF1ZSg2LCBDMkNvbnN0TWVtb3J5QmxvY2s8dWludDhfdD4oaW5pdFZhbHVlKSk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGJsb2JWYWx1ZS0+bS52YWx1ZSksIHVpbnQ4X3RbXT46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQ4X3RbXSIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKGJsb2JWYWx1ZS0+bS52YWx1ZSwgIkFCQ0RcMCIsIDYpKTsKKyAgICAgICAgRVhQRUNUX0VRKDZ1LCBibG9iVmFsdWUtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IGJsb2JWYWx1ZS0+RmllbGRMaXN0KCk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShGRDo6QkxPQiwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKworICAgICAgICBibG9iVmFsdWUgPSBCbG9iU2V0dGluZzo6QWxsb2NVbmlxdWUoMywgQzJDb25zdE1lbW9yeUJsb2NrPHVpbnQ4X3Q+KGluaXRWYWx1ZSkpOworICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKGJsb2JWYWx1ZS0+bS52YWx1ZSwgIkFCQyIsIDMpKTsKKyAgICAgICAgRVhQRUNUX0VRKDN1LCBibG9iVmFsdWUtPmZsZXhDb3VudCgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGNvbnN0ZXhwciBjaGFyIGluaXRWYWx1ZVtdID0gIkFCQ0QiOworICAgICAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlN0cmluZ1ZhbHVlLCAwPiBTdHJpbmdTZXR0aW5nOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nU2V0dGluZz4gc3RyaW5nVmFsdWUgPSBTdHJpbmdTZXR0aW5nOjpBbGxvY1VuaXF1ZSg2LCBDMkNvbnN0TWVtb3J5QmxvY2s8Y2hhcj4oaW5pdFZhbHVlKSk7CisgICAgICAgIHN0cmluZ1ZhbHVlID0gU3RyaW5nU2V0dGluZzo6QWxsb2NVbmlxdWUoNiwgaW5pdFZhbHVlKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoc3RyaW5nVmFsdWUtPm0udmFsdWUpLCBjaGFyW10+Ojp2YWx1ZSwgInNob3VsZCBiZSBjaGFyW10iKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChzdHJpbmdWYWx1ZS0+bS52YWx1ZSwgIkFCQ0RcMCIsIDYpKTsKKyAgICAgICAgRVhQRUNUX0VRKDZ1LCBzdHJpbmdWYWx1ZS0+ZmxleENvdW50KCkpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gc3RyaW5nVmFsdWUtPkZpZWxkTGlzdCgpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoRkQ6OlNUUklORywgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKworICAgICAgICBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OkFsbG9jVW5pcXVlKDMsIEMyQ29uc3RNZW1vcnlCbG9jazxjaGFyPihpbml0VmFsdWUpKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChzdHJpbmdWYWx1ZS0+bS52YWx1ZSwgIkFCIiwgMykpOworICAgICAgICBFWFBFQ1RfRVEoM3UsIHN0cmluZ1ZhbHVlLT5mbGV4Q291bnQoKSk7CisKKyAgICAgICAgc3RyaW5nVmFsdWUgPSBTdHJpbmdTZXR0aW5nOjpBbGxvY1VuaXF1ZSgxMSwgImluaXRWYWx1ZSIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHN0cmluZ1ZhbHVlLT5tLnZhbHVlLCAiaW5pdFZhbHVlXDAiLCAxMSkpOworICAgICAgICBFWFBFQ1RfRVEoMTF1LCBzdHJpbmdWYWx1ZS0+ZmxleENvdW50KCkpOworCisgICAgICAgIHN0cmluZ1ZhbHVlID0gU3RyaW5nU2V0dGluZzo6QWxsb2NVbmlxdWUoaW5pdFZhbHVlKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChzdHJpbmdWYWx1ZS0+bS52YWx1ZSwgIkFCQ0QiLCA1KSk7CisgICAgICAgIEVYUEVDVF9FUSg1dSwgc3RyaW5nVmFsdWUtPmZsZXhDb3VudCgpKTsKKworICAgICAgICBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OkFsbG9jVW5pcXVlKHsgJ0EnLCAnQicsICdDJywgJ0QnIH0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKHN0cmluZ1ZhbHVlLT5tLnZhbHVlLCAiQUJDIiwgNCkpOworICAgICAgICBFWFBFQ1RfRVEoNHUsIHN0cmluZ1ZhbHVlLT5mbGV4Q291bnQoKSk7CisgICAgfQorCisgICAgeworICAgICAgICB1aW50MzJfdCB2aWRlb1dpZHRoW10gPSB7IDEydSwgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUsIDEwMCB9OworICAgICAgICBDMlBhcmFtICpwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpKTsKKyAgICAgICAgRVhQRUNUX05FKG51bGxwdHIsIHAxKTsKKyAgICAgICAgRVhQRUNUX0VRKDEydSwgcDEtPnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShwMS0+dHlwZSgpLCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQgKnZzdCA9IEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKHAxKTsKKyAgICAgICAgRVhQRUNUX05FKG51bGxwdHIsIHZzdCk7CisgICAgICAgIGlmICh2c3QpIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxdSwgdnN0LT5mbGV4Q291bnQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAwLCB2c3QtPm0ubU51bWJlcnNbMF0pOworICAgICAgICB9CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSArIDIpOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgLSAyKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgMyk7CisgICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDApOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworICAgIH0KKworICAgIHsKKyAgICAgICAgdWludDMyX3QgdmlkZW9XaWR0aFtdID0geyAxNnUsIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFLCAxMDEsIDEwMiB9OworCisgICAgICAgIEMyUGFyYW0gKnAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkpOworICAgICAgICBFWFBFQ1RfTkUobnVsbHB0ciwgcDEpOworICAgICAgICBFWFBFQ1RfRVEoMTZ1LCBwMS0+c2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKHAxLT50eXBlKCksIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCAqdnB0ID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20ocDEpOworICAgICAgICBFWFBFQ1RfTkUobnVsbHB0ciwgdnB0KTsKKyAgICAgICAgaWYgKHZwdCkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDJ1LCB2cHQtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMDEsIHZwdC0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAyLCB2cHQtPm0ubU51bWJlcnNbMV0pOworICAgICAgICB9CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSArIDIpOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgLSAyKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgMyk7CisgICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDApOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworICAgIH0KK30KKworVEVTVF9GKEMyUGFyYW1UZXN0LCBDMlZhbHVlVGVzdCkgeworICAgIEMyVmFsdWUgdmFsOworICAgIGludDMyX3QgaTMyID0gLTMyOworICAgIGludDY0X3QgaTY0ID0gLTY0OworICAgIHVpbnQzMl90IHUzMiA9IDMyOworICAgIHVpbnQ2NF90IHU2NCA9IDY0OworICAgIGZsb2F0IGZwID0gMS41ZjsKKworICAgIEVYUEVDVF9FUShDMlZhbHVlOjpOT19JTklULCB2YWwudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmkzMikpOworICAgIEVYUEVDVF9FUSgtMzIsIGkzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpNjQpKTsKKyAgICBFWFBFQ1RfRVEoLTY0LCBpNjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7CisgICAgRVhQRUNUX0VRKDMydSwgdTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnU2NCkpOworICAgIEVYUEVDVF9FUSg2NHUsIHU2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZmcCkpOworICAgIEVYUEVDVF9FUSgxLjVmLCBmcCk7CisKKyAgICB2YWwgPSBpbnQzMl90KC0zMjE2KTsKKyAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6SU5UMzIsIHZhbC50eXBlKCkpOworICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZpMzIpKTsKKyAgICBFWFBFQ1RfRVEoLTMyMTYsIGkzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpNjQpKTsKKyAgICBFWFBFQ1RfRVEoLTY0LCBpNjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7CisgICAgRVhQRUNUX0VRKDMydSwgdTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnU2NCkpOworICAgIEVYUEVDVF9FUSg2NHUsIHU2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZmcCkpOworICAgIEVYUEVDVF9FUSgxLjVmLCBmcCk7CisKKyAgICB2YWwgPSB1aW50MzJfdCgzMjE2KTsKKyAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6VUlOVDMyLCB2YWwudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmkzMikpOworICAgIEVYUEVDVF9FUSgtMzIxNiwgaTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmk2NCkpOworICAgIEVYUEVDVF9FUSgtNjQsIGk2NCk7CisgICAgRVhQRUNUX0VRKHRydWUsIHZhbC5nZXQoJnUzMikpOworICAgIEVYUEVDVF9FUSgzMjE2dSwgdTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnU2NCkpOworICAgIEVYUEVDVF9FUSg2NHUsIHU2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZmcCkpOworICAgIEVYUEVDVF9FUSgxLjVmLCBmcCk7CisKKyAgICB2YWwgPSBpbnQ2NF90KC02NDMyKTsKKyAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6SU5UNjQsIHZhbC50eXBlKCkpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTMyKSk7CisgICAgRVhQRUNUX0VRKC0zMjE2LCBpMzIpOworICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZpNjQpKTsKKyAgICBFWFBFQ1RfRVEoLTY0MzIsIGk2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1MzIpKTsKKyAgICBFWFBFQ1RfRVEoMzIxNnUsIHUzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1NjQpKTsKKyAgICBFWFBFQ1RfRVEoNjR1LCB1NjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmZnApKTsKKyAgICBFWFBFQ1RfRVEoMS41ZiwgZnApOworCisgICAgdmFsID0gdWludDY0X3QoNjQzMik7CisgICAgRVhQRUNUX0VRKEMyVmFsdWU6OlVJTlQ2NCwgdmFsLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpMzIpKTsKKyAgICBFWFBFQ1RfRVEoLTMyMTYsIGkzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpNjQpKTsKKyAgICBFWFBFQ1RfRVEoLTY0MzIsIGk2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1MzIpKTsKKyAgICBFWFBFQ1RfRVEoMzIxNnUsIHUzMik7CisgICAgRVhQRUNUX0VRKHRydWUsIHZhbC5nZXQoJnU2NCkpOworICAgIEVYUEVDVF9FUSg2NDMydSwgdTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmZwKSk7CisgICAgRVhQRUNUX0VRKDEuNWYsIGZwKTsKKworICAgIHZhbCA9IDE1LjI1ZjsKKyAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6RkxPQVQsIHZhbC50eXBlKCkpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTMyKSk7CisgICAgRVhQRUNUX0VRKC0zMjE2LCBpMzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTY0KSk7CisgICAgRVhQRUNUX0VRKC02NDMyLCBpNjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7CisgICAgRVhQRUNUX0VRKDMyMTZ1LCB1MzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTY0KSk7CisgICAgRVhQRUNUX0VRKDY0MzJ1LCB1NjQpOworICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZmcCkpOworICAgIEVYUEVDVF9FUSgxNS4yNWYsIGZwKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3Rlc3RzL0MyU2FtcGxlQ29tcG9uZW50X3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyU2FtcGxlQ29tcG9uZW50X3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NTY4MzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJTYW1wbGVDb21wb25lbnRfdGVzdC5jcHAKQEAgLTAsMCArMSw0MzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTYW1wbGVDb21wb25lbnRfdGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNkZWZpbmUgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkVudW0uaD4KKworI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKK2NsYXNzIEMyU2FtcGxlQ29tcG9uZW50VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworfTsKKwordm9pZCBQcmludFRvKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCwgOjpzdGQ6Om9zdHJlYW0gKm9zKSB7CisgICAgdXNpbmcgRkQ9QzJGaWVsZERlc2NyaXB0b3I7CisgICAgc3dpdGNoIChmZC50eXBlKCkpIHsKKyAgICBjYXNlIEZEOjpJTlQzMjogKm9zIDw8ICJpMzIiOyBicmVhazsKKyAgICBjYXNlIEZEOjpJTlQ2NDogKm9zIDw8ICJpNjQiOyBicmVhazsKKyAgICBjYXNlIEZEOjpVSU5UMzI6ICpvcyA8PCAidTMyIjsgYnJlYWs7CisgICAgY2FzZSBGRDo6VUlOVDY0OiAqb3MgPDwgInU2NCI7IGJyZWFrOworICAgIGNhc2UgRkQ6OkZMT0FUOiAqb3MgPDwgImZsb2F0IjsgYnJlYWs7CisgICAgY2FzZSBGRDo6U1RSSU5HOiAqb3MgPDwgImNoYXIiOyBicmVhazsKKyAgICBjYXNlIEZEOjpCTE9COiAqb3MgPDwgInU4IjsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGZkLnR5cGUoKSAmIEZEOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgKm9zIDw8ICJzdHJ1Y3QtIiA8PCAoZmQudHlwZSgpICYgfkZEOjpTVFJVQ1RfRkxBRyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqb3MgPDwgInR5cGUtIiA8PCBmZC50eXBlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgKm9zIDw8ICIgIiA8PCBmZC5uYW1lKCk7CisgICAgaWYgKGZkLmV4dGVudCgpID4gMSkgeworICAgICAgICAqb3MgPDwgIlsiIDw8IGZkLmV4dGVudCgpIDw8ICJdIjsKKyAgICB9IGVsc2UgaWYgKGZkLmV4dGVudCgpID09IDApIHsKKyAgICAgICAgKm9zIDw8ICJbXSI7CisgICAgfQorICAgICpvcyA8PCAiICgiIDw8IGZkLl9tRmllbGRJZCA8PCAiKiIgPDwgZmQuZXh0ZW50KCkgPDwgIikiOworfQorCitDMkVOVU0oCisgICAgTWV0YWRhdGFUeXBlLCBpbnQzMl90LAorICAgIGtJbnZhbGlkID0gLTEsCisgICAga05vbmUgPSAwLAorICAgIGtHcmFsbG9jLAorICAgIGtOYXRpdmVIYW5kbGUsCisgICAga0FOYXRpdmVXaW5kb3csCisgICAga0NhbWVyYSwKKykKKworZW51bSB7CisgICAga1BhcmFtSW5kZXhWaWRlb0NvbmZpZyA9IDB4MTIzNCwKK307CisKK3N0cnVjdCBDMlZpZGVvQ29uZmlnU3RydWN0IHsKKyAgICBpbnQzMl90IHdpZHRoOworICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICBNZXRhZGF0YVR5cGUgbWV0YWRhdGFUeXBlOworICAgIGludDMyX3Qgc3VwcG9ydGVkRm9ybWF0c1tdOworCisgICAgQzJWaWRlb0NvbmZpZ1N0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoVmlkZW9Db25maWcsIHN1cHBvcnRlZEZvcm1hdHMpCisgICAgQzJGSUVMRCh3aWR0aCwgIndpZHRoIikKKyAgICBDMkZJRUxEKGhlaWdodCwgImhlaWdodCIpCisgICAgQzJGSUVMRChtZXRhZGF0YVR5cGUsICJtZXRhZGF0YS10eXBlIikKKyAgICBDMkZJRUxEKHN1cHBvcnRlZEZvcm1hdHMsICJmb3JtYXRzIikKK307CisKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVmlkZW9Db25maWdTdHJ1Y3Q+IEMyVmlkZW9Db25maWdQb3J0VHVuaW5nOworCitjbGFzcyBNeUNvbXBvbmVudEluc3RhbmNlIDogcHVibGljIEMyQ29tcG9uZW50SW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIC8vLyBcdG9kbyB0aGlzIHNlZW1zIHRvbyBzcGVjaWZpYworICAgICAgICByZXR1cm4gInNhbXBsZS5pbnRlcmZhY2UiOworICAgIH07CisKKyAgICB2aXJ0dWFsIGMyX25vZGVfaWRfdCBnZXRJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgLy8vIFx0b2RvIGhvdyBhcmUgdGhlc2Ugc2hhcmVkPworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZ192YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpcGFyYW1zOworICAgICAgICAodm9pZClmYWlsdXJlczsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlVHVubmVsX3NtKGMyX25vZGVfaWRfdCB0YXJnZXRDb21wb25lbnQpIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpdGFyZ2V0Q29tcG9uZW50OworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIGZvciAoQzJQYXJhbSogY29uc3QgcGFyYW0gOiBzdGFja1BhcmFtcykgeworICAgICAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICAgICBpZiAoISpwYXJhbSkgeyAvLyBwYXJhbSBpcyBhbHJlYWR5IGludmFsaWQgLSByZW1lbWJlciBpdAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBub3RlOiB0aGlzIGRvZXMgbm90IGhhbmRsZSBzdHJlYW0gcGFyYW1zIChzaG91bGQgdXNlIGluZGV4Li4uKQorICAgICAgICAgICAgaWYgKCFtTXlQYXJhbXMuY291bnQocGFyYW0tPmluZGV4KCkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7IC8vIG5vdCBteSBwYXJhbQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDMlBhcmFtICYgbXlQYXJhbSA9IG1NeVBhcmFtcy5maW5kKHBhcmFtLT5pbmRleCgpKS0+c2Vjb25kOworICAgICAgICAgICAgaWYgKG15UGFyYW0uc2l6ZSgpICE9IHBhcmFtLT5zaXplKCkpIHsgLy8gaW5jb3JyZWN0IHNpemUKKyAgICAgICAgICAgICAgICBwYXJhbS0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXJhbS0+dXBkYXRlRnJvbShteVBhcmFtKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoY29uc3QgQzJQYXJhbTo6SW5kZXggaW5kZXggOiBoZWFwUGFyYW1JbmRpY2VzKSB7CisgICAgICAgICAgICBpZiAobU15UGFyYW1zLmNvdW50KGluZGV4KSkgeworICAgICAgICAgICAgICAgIEMyUGFyYW0gJiBteVBhcmFtID0gbU15UGFyYW1zLmZpbmQoaW5kZXgpLT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IHBhcmFtQ29weShDMlBhcmFtOjpDb3B5KG15UGFyYW0pKTsKKyAgICAgICAgICAgICAgICBoZWFwUGFyYW1zLT5wdXNoX2JhY2soc3RkOjptb3ZlKHBhcmFtQ29weSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MzJfdCwgQzJQYXJhbSAmPiBtTXlQYXJhbXM7CisKKyAgICBDMkNvbXBvbmVudERvbWFpblNldHRpbmcgbURvbWFpbkluZm87CisKKyAgICBNeUNvbXBvbmVudEluc3RhbmNlKCkgeworICAgICAgICBtTXlQYXJhbXMuaW5zZXJ0KHttRG9tYWluSW5mby5pbmRleCgpLCBtRG9tYWluSW5mb30pOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVsZWFzZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QgdGFyZ2V0Q29tcG9uZW50KSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKXRhcmdldENvbXBvbmVudDsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgY2xhc3MgTXlQYXJhbVJlZmxlY3RvciA6IHB1YmxpYyBDMlBhcmFtUmVmbGVjdG9yIHsKKyAgICAgICAgY29uc3QgTXlDb21wb25lbnRJbnN0YW5jZSAqaW5zdGFuY2U7CisKKyAgICBwdWJsaWM6CisgICAgICAgIE15UGFyYW1SZWZsZWN0b3IoY29uc3QgTXlDb21wb25lbnRJbnN0YW5jZSAqaSkgOiBpbnN0YW5jZShpKSB7IH0KKworICAgICAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKEMyUGFyYW06OkNvcmVJbmRleCBwYXJhbUluZGV4KSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICBzd2l0Y2ggKHBhcmFtSW5kZXgudHlwZUluZGV4KCkpIHsKKyAgICAgICAgICAgIGNhc2UgZGVjbHR5cGUoaW5zdGFuY2UtPm1Eb21haW5JbmZvKTo6Q09SRV9JTkRFWDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+KG5ldyBDMlN0cnVjdERlc2NyaXB0b3J7CisgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLT5tRG9tYWluSW5mby50eXBlKCksCisgICAgICAgICAgICAgICAgICAgIGRlY2x0eXBlKGluc3RhbmNlLT5tRG9tYWluSW5mbyk6OkZpZWxkTGlzdCgpLAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc192YigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGZvciAoQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5ICZxdWVyeSA6IGZpZWxkcykgeworICAgICAgICAgICAgaWYgKHF1ZXJ5LmZpZWxkKCkgPT0gQzJQYXJhbUZpZWxkKCZtRG9tYWluSW5mbywgJkMyQ29tcG9uZW50RG9tYWluU2V0dGluZzo6dmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcXVlcnkudmFsdWVzID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogZmxhZyAqLywKKyAgICAgICAgICAgICAgICAgICAgJm1Eb21haW5JbmZvLnZhbHVlCisgICAgICAgICAgICAgICAgICAgIC8vLAorICAgICAgICAgICAgICAgICAgICAvL3soaW50MzJfdClDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPfQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgcXVlcnkuc3RhdHVzID0gQzJfT0s7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX0JBRF9JTkRFWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+KG5ldyBNeVBhcmFtUmVmbGVjdG9yKHRoaXMpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKiBjb25zdCBwYXJhbXMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcGFyYW1zLT5wdXNoX2JhY2soc3RkOjptYWtlX3NoYXJlZDxDMlBhcmFtRGVzY3JpcHRvcj4oCisgICAgICAgICAgICAgICAgdHJ1ZSAvKiByZXF1aXJlZCAqLywgIl9kb21haW4iLCAmbURvbWFpbkluZm8pKTsKKyAgICAgICAgcGFyYW1zLT5wdXNoX2JhY2soc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPigKKyAgICAgICAgICAgICAgICBuZXcgQzJQYXJhbURlc2NyaXB0b3IodHJ1ZSAvKiByZXF1aXJlZCAqLywgIl9kb21haW4iLCAmbURvbWFpbkluZm8pKSk7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5NeUNvbXBvbmVudEluc3RhbmNlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRSwgYm9vbCBTPXN0ZDo6aXNfZW51bTxFPjo6dmFsdWU+CitzdHJ1Y3QgZ2V0dGVyIHsKKyAgICBpbnQzMl90IGdldChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIGludDMyX3QqKSB7CisgICAgICAgIHJldHVybiBwLmkzMjsKKyAgICB9CisgICAgaW50NjRfdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBpbnQ2NF90KikgeworICAgICAgICByZXR1cm4gcC5pNjQ7CisgICAgfQorICAgIHVpbnQzMl90IGdldChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIHVpbnQzMl90KikgeworICAgICAgICByZXR1cm4gcC51MzI7CisgICAgfQorICAgIHVpbnQ2NF90IGdldChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIHVpbnQ2NF90KikgeworICAgICAgICByZXR1cm4gcC51NjQ7CisgICAgfQorICAgIGZsb2F0IGdldChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIGZsb2F0KikgeworICAgICAgICByZXR1cm4gcC5mcDsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBFPgorc3RydWN0IGdldHRlcjxFLCB0cnVlPiB7CisgICAgIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEU+Ojp0eXBlIGdldChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIEUqKSB7CisgICAgICAgICB1c2luZyB1PXR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEU+Ojp0eXBlOworICAgICAgICAgcmV0dXJuIGdldHRlcjx1PigpLmdldChwLCAodSopMCk7CisgICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgRT1zdGQ6OmlzX2VudW08VD46OnZhbHVlPgorc3RydWN0IGxheF91bmRlcmx5aW5nX3R5cGUgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8VD46OnR5cGUgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgbGF4X3VuZGVybHlpbmdfdHlwZTxULCBmYWxzZT4geworICAgIHR5cGVkZWYgVCB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRT4KK3R5cGVuYW1lIGxheF91bmRlcmx5aW5nX3R5cGU8RT46OnR5cGUgZ2V0KAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAsIEUqKSB7CisgICAgcmV0dXJuIGdldHRlcjxFPigpLmdldChwLCAoRSopMCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIGR1bXBGU1YoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmc3YsIFQqdCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisgICAgY291dCA8PCAoc3RkOjppc19lbnVtPFQ+Ojp2YWx1ZSA/IChzdGQ6OmlzX3NpZ25lZDx0eXBlbmFtZSBsYXhfdW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlPjo6dmFsdWUgPyAiaSIgOiAidSIpCisgICAgICAgICAgICAgOiBzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSA/IHN0ZDo6aXNfc2lnbmVkPFQ+Ojp2YWx1ZSA/ICJpIiA6ICJ1IiA6ICJmIikKKyAgICAgICAgIDw8ICg4ICogc2l6ZW9mKFQpKTsKKyAgICBpZiAoc3YudHlwZSA9PSBzdi5SQU5HRSkgeworICAgICAgICBjb3V0IDw8ICIucmFuZ2UoIiA8PCBnZXQoc3YucmFuZ2UubWluLCB0KTsKKyAgICAgICAgaWYgKGdldChzdi5yYW5nZS5zdGVwLCB0KSAhPSBzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSkgeworICAgICAgICAgICAgY291dCA8PCAiOiIgPDwgZ2V0KHN2LnJhbmdlLnN0ZXAsIHQpOworICAgICAgICB9CisgICAgICAgIGlmIChnZXQoc3YucmFuZ2UubnVtLCB0KSAhPSAxIHx8IGdldChzdi5yYW5nZS5kZW5vbSwgdCkgIT0gMSkgeworICAgICAgICAgICAgY291dCA8PCAiOiIgPDwgZ2V0KHN2LnJhbmdlLm51bSwgdCkgPDwgIi8iIDw8IGdldChzdi5yYW5nZS5kZW5vbSwgdCk7CisgICAgICAgIH0KKyAgICAgICAgY291dCA8PCBnZXQoc3YucmFuZ2UubWF4LCB0KSA8PCAiKSI7CisgICAgfQorICAgIGlmIChzdi52YWx1ZXMuc2l6ZSgpKSB7CisgICAgICAgIGNvdXQgPDwgKHN2LnR5cGUgPT0gc3YuRkxBR1MgPyAiLmZsYWdzKCIgOiAiLmxpc3QoIik7CisgICAgICAgIGNvbnN0IGNoYXIgKnNlcCA9ICIiOworICAgICAgICBmb3IgKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlByaW1pdGl2ZSAmcCA6IHN2LnZhbHVlcykgeworICAgICAgICAgICAgY291dCA8PCBzZXAgPDwgZ2V0KHAsIHQpOworICAgICAgICAgICAgc2VwID0gIiwiOworICAgICAgICB9CisgICAgICAgIGNvdXQgPDwgIikiOworICAgIH0KKyAgICBjb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgZHVtcFR5cGUoQzJQYXJhbTo6VHlwZSB0eXBlKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICBjb3V0IDw8ICh0eXBlLmlzVmVuZG9yKCkgPyAiVmVuZG9yIiA6ICJDMiIpOworICAgIGlmICh0eXBlLmZvcklucHV0KCkpIHsKKyAgICAgICAgY291dCA8PCAiSW5wdXQiOworICAgIH0gZWxzZSBpZiAodHlwZS5mb3JPdXRwdXQoKSkgeworICAgICAgICBjb3V0IDw8ICJPdXRwdXQiOworICAgIH0gZWxzZSBpZiAodHlwZS5mb3JQb3J0KCkgJiYgIXR5cGUuZm9yU3RyZWFtKCkpIHsKKyAgICAgICAgY291dCA8PCAiUG9ydCI7CisgICAgfQorICAgIGlmICh0eXBlLmZvclN0cmVhbSgpKSB7CisgICAgICAgIGNvdXQgPDwgIlN0cmVhbSI7CisgICAgfQorCisgICAgaWYgKHR5cGUuaXNGbGV4aWJsZSgpKSB7CisgICAgICAgIGNvdXQgPDwgIkZsZXgiOworICAgIH0KKworICAgIGNvdXQgPDwgdHlwZS50eXBlSW5kZXgoKTsKKworICAgIHN3aXRjaCAodHlwZS5raW5kKCkpIHsKKyAgICBjYXNlIEMyUGFyYW06OklORk86IGNvdXQgPDwgIkluZm8iOyBicmVhazsKKyAgICBjYXNlIEMyUGFyYW06OlNFVFRJTkc6IGNvdXQgPDwgIlNldHRpbmciOyBicmVhazsKKyAgICBjYXNlIEMyUGFyYW06OlRVTklORzogY291dCA8PCAiVHVuaW5nIjsgYnJlYWs7CisgICAgY2FzZSBDMlBhcmFtOjpTVFJVQ1Q6IGNvdXQgPDwgIlN0cnVjdCI7IGJyZWFrOworICAgIGRlZmF1bHQ6IGNvdXQgPDwgIktpbmQiIDw8IChpbnQzMl90KXR5cGUua2luZCgpOyBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgZHVtcFR5cGUoQzJQYXJhbTo6Q29yZUluZGV4IHR5cGUpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIGNvdXQgPDwgKHR5cGUuaXNWZW5kb3IoKSA/ICJWZW5kb3IiIDogIkMyIik7CisgICAgaWYgKHR5cGUuaXNGbGV4aWJsZSgpKSB7CisgICAgICAgIGNvdXQgPDwgIkZsZXgiOworICAgIH0KKworICAgIGNvdXQgPDwgdHlwZS50eXBlSW5kZXgoKSA8PCAiU3RydWN0IjsKK30KKwordm9pZCBkdW1wVHlwZShDMkZpZWxkRGVzY3JpcHRvcjo6dHlwZV90IHR5cGUpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6IGNvdXQgPDwgImJsb2IgIjsgYnJlYWs7CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6IGNvdXQgPDwgImZsb2F0ICI7IGJyZWFrOworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOiBjb3V0IDw8ICJpbnQzMl90ICI7IGJyZWFrOworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OiBjb3V0IDw8ICJpbnQ2NF90ICI7IGJyZWFrOworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjogY291dCA8PCAidWludDMyX3QgIjsgYnJlYWs7CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDY0OiBjb3V0IDw8ICJ1aW50NjRfdCAiOyBicmVhazsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpTVFJJTkc6IGNvdXQgPDwgImNoYXIgIjsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgY291dCA8PCAic3RydWN0ICI7CisgICAgICAgIGR1bXBUeXBlKChDMlBhcmFtOjpUeXBlKXR5cGUpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgZHVtcFN0cnVjdChjb25zdCBDMlN0cnVjdERlc2NyaXB0b3IgJnNkKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICBjb3V0IDw8ICJzdHJ1Y3QgIjsKKyAgICBkdW1wVHlwZShzZC5jb3JlSW5kZXgoKSk7CisgICAgY291dCA8PCAiIHsiIDw8IGVuZGw7CisgICAgLy9DMkZpZWxkRGVzY3JpcHRvciAmZjsKKyAgICBmb3IgKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmIDogc2QpIHsKKyAgICAgICAgUHJpbnRUbyhmLCAmY291dCk7CisgICAgICAgIGNvdXQgPDwgZW5kbDsKKworICAgICAgICBpZiAoZi5uYW1lZFZhbHVlcygpLnNpemUoKSkgeworICAgICAgICAgICAgY291dCA8PCAiLm5hbWVkKCI7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzZXAgPSAiIjsKKyAgICAgICAgICAgIGZvciAoY29uc3QgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVUeXBlICZwIDogZi5uYW1lZFZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgY291dCA8PCBzZXAgPDwgcC5maXJzdCA8PCAiPSI7CisgICAgICAgICAgICAgICAgc3dpdGNoIChmLnR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOiBjb3V0IDw8IGdldChwLnNlY29uZCwgKGludDMyX3QgKikwKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UNjQ6IGNvdXQgPDwgZ2V0KHAuc2Vjb25kLCAoaW50NjRfdCAqKTApOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UMzI6IGNvdXQgPDwgZ2V0KHAuc2Vjb25kLCAodWludDMyX3QgKikwKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDY0OiBjb3V0IDw8IGdldChwLnNlY29uZCwgKHVpbnQ2NF90ICopMCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkZMT0FUOiBjb3V0IDw8IGdldChwLnNlY29uZCwgKGZsb2F0ICopMCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGNvdXQgPDwgIj8/PyI7IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXAgPSAiLCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3V0IDw8ICIpIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvdXQgPDwgIn07IiA8PCBlbmRsOworfQorCit2b2lkIGR1bXBEZXNjKGNvbnN0IEMyUGFyYW1EZXNjcmlwdG9yICZwZCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisgICAgaWYgKHBkLmlzUmVxdWlyZWQoKSkgeworICAgICAgICBjb3V0IDw8ICJyZXF1aXJlZCAiOworICAgIH0KKyAgICBpZiAocGQuaXNQZXJzaXN0ZW50KCkpIHsKKyAgICAgICAgY291dCA8PCAicGVyc2lzdGVudCAiOworICAgIH0KKyAgICBjb3V0IDw8ICJzdHJ1Y3QgIjsKKyAgICBkdW1wVHlwZShDMlBhcmFtOjpUeXBlKHBkLmluZGV4KCkudHlwZSgpKSk7CisgICAgY291dCA8PCAiICIgPDwgcGQubmFtZSgpIDw8ICI7IiA8PCBlbmRsOworfQorCitURVNUX0YoQzJTYW1wbGVDb21wb25lbnRUZXN0LCBSZWZsZWN0b3JUZXN0KSB7CisgICAgQzJDb21wb25lbnREb21haW5TZXR0aW5nIGRvbWFpbkluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPE15Q29tcG9uZW50SW5zdGFuY2U+IG15Q29tcChuZXcgTXlDb21wb25lbnRJbnN0YW5jZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBjb21wID0gbXlDb21wOworCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY3sKKyAgICAgICAgbXlDb21wLT5nZXRQYXJhbVJlZmxlY3RvcigpLT5kZXNjcmliZShDMkNvbXBvbmVudERvbWFpblNldHRpbmc6OkNPUkVfSU5ERVgpfTsKKyAgICBkdW1wU3RydWN0KCpkZXNjKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gcXVlcnkgPSB7CisgICAgICAgIHsgQzJQYXJhbUZpZWxkKCZkb21haW5JbmZvLCAmQzJDb21wb25lbnREb21haW5TZXR0aW5nOjp2YWx1ZSksCisgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDVVJSRU5UIH0sCisgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeShDMlBhcmFtRmllbGQoJmRvbWFpbkluZm8sICZDMkNvbXBvbmVudERvbWFpblNldHRpbmc6OnZhbHVlKSwKKyAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkNVUlJFTlQpLAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkN1cnJlbnQoQzJQYXJhbUZpZWxkKCZkb21haW5JbmZvLCAmQzJDb21wb25lbnREb21haW5TZXR0aW5nOjp2YWx1ZSkpLAorICAgIH07CisKKyAgICBFWFBFQ1RfRVEoQzJfT0ssIGNvbXAtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKHF1ZXJ5LCBDMl9ET05UX0JMT0NLKSk7CisKKyAgICBmb3IgKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAmcSA6IHF1ZXJ5KSB7CisgICAgICAgIGR1bXBGU1YocS52YWx1ZXMsICZkb21haW5JbmZvLnZhbHVlKTsKKyAgICB9Cit9CisKK1RFU1RfRihDMlNhbXBsZUNvbXBvbmVudFRlc3QsIEZpZWxkU3VwcG9ydGVkVmFsdWVzVGVzdCkgeworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIDA+IFVpbnQzMlRlc3RJbmZvOworICAgIFVpbnQzMlRlc3RJbmZvIHQ7CisgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gdmFsdWVzOworICAgIHZhbHVlcy5wdXNoX2JhY2soQzJGaWVsZFN1cHBvcnRlZFZhbHVlcygwLCAxMCwgMSkpOyAgLy8gbWluLCBtYXgsIHN0ZXAKKyAgICB2YWx1ZXMucHVzaF9iYWNrKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoMSwgNjQsIDIsIDEpKTsgIC8vIG1pbiwgbWF4LCBudW0sIGRlbgorICAgIHZhbHVlcy5wdXNoX2JhY2soQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhmYWxzZSwgezEsIDIsIDN9KSk7ICAvLyBmbGFncywgc3RkOjppbml0aWFsaXplcl9saXN0CisgICAgdWludDMyX3QgdmFsW10gPSB7MSwgMywgNSwgN307CisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHYoc3RkOjpiZWdpbih2YWwpLCBzdGQ6OmVuZCh2YWwpKTsKKyAgICB2YWx1ZXMucHVzaF9iYWNrKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoZmFsc2UsIHYpKTsgIC8vIGZsYWdzLCBzdGQ6OnZlY3RvcgorCisgICAgZm9yIChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZzdiA6IHZhbHVlcykgeworICAgICAgICBkdW1wRlNWKHN2LCAmdC52YWx1ZSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJVdGlsVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJVdGlsVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljZDMxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlV0aWxUZXN0LmNwcApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJVdGlsVGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNkZWZpbmUgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fCisjaW5jbHVkZSA8X0MyTWFjcm9VdGlscy5oPgorI2luY2x1ZGUgPEMyRW51bS5oPgorCisvKiogXGZpbGUKKyAqIFRlc3RzIGZvciB2bmRrL3V0aWwuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIF9DMk1hY3JvVXRpbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpY19hc3NlcnQoMCA9PSBfQzJfQVJHQygpLCAic2hvdWxkIGJlIDAiKTsKK3N0YXRpY19hc3NlcnQoMSA9PSBfQzJfQVJHQygxKSwgInNob3VsZCBiZSAxIik7CitzdGF0aWNfYXNzZXJ0KDIgPT0gX0MyX0FSR0MoMSwgMiksICJzaG91bGQgYmUgMiIpOworc3RhdGljX2Fzc2VydCg2NCA9PSBfQzJfQVJHQygKKyAgICAgICAgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsCisgICAgICAgIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwKKyAgICAgICAgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQpLCAic2hvdWxkIGJlIDY0Iik7CisKK3N0YXRpY19hc3NlcnQoMCA9PSBfQzJfQVJHQygsKSwgInNob3VsZCBiZSAwIik7CitzdGF0aWNfYXNzZXJ0KDEgPT0gX0MyX0FSR0MoMSwpLCAic2hvdWxkIGJlIDEiKTsKK3N0YXRpY19hc3NlcnQoMiA9PSBfQzJfQVJHQygxLCAyLCksICJzaG91bGQgYmUgMiIpOworc3RhdGljX2Fzc2VydCg2NCA9PSBfQzJfQVJHQygKKyAgICAgICAgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsCisgICAgICAgIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwKKyAgICAgICAgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQsKSwgInNob3VsZCBiZSA2NCIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIF9DMkVudW1VdGlscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2NsYXNzIEMyVXRpbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK307CisKK0MyRU5VTShFbnVtMSwgdWludDMyX3QsCisgICAgRW51bTFWYWx1ZTEsCisgICAgRW51bTFWYWx1ZTIsCisgICAgRW51bTFWYWx1ZTQgPSBFbnVtMVZhbHVlMiArIDIsCispOworCitDMkVOVU1fQ1VTVE9NX1BSRUZJWChFbnVtMiwgdWludDMyX3QsICJFbnVtIiwKKyAgICBFbnVtMlZhbHVlMSwKKyAgICBFbnVtMlZhbHVlMiwKKyAgICBFbnVtMlZhbHVlNCA9IEVudW0xVmFsdWUyICsgMiwKKyk7CisKK0MyRU5VTV9DVVNUT01fTkFNRVMoRW51bTMsIHVpbnQ4X3QsCisgICAgKHsgeyAidmFsdWUxIiwgRW51bTNWYWx1ZTEgfSwKKyAgICAgICB7ICJ2YWx1ZTIiLCBFbnVtM1ZhbHVlMiB9LAorICAgICAgIHsgInZhbHVlNCIsIEVudW0zVmFsdWU0IH0sCisgICAgICAgeyAiaW52YWxpZCIsIEludmFsaWQgfSB9KSwKKyAgICBFbnVtM1ZhbHVlMSwKKyAgICBFbnVtM1ZhbHVlMiwKKyAgICBFbnVtM1ZhbHVlNCA9IEVudW0zVmFsdWUyICsgMiwKKyAgICBJbnZhbGlkLAorKTsKKworVEVTVF9GKEMyVXRpbFRlc3QsIEVudW1VdGlsc1Rlc3QpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8QzJTdHJpbmcsIEVudW0zPj4gcGFpcnMgKCB7IHsgInZhbHVlMSIsIEVudW0zVmFsdWUxIH0sCisgICAgICB7ICJ2YWx1ZTIiLCBFbnVtM1ZhbHVlMiB9LAorICAgICAgeyAidmFsdWU0IiwgRW51bTNWYWx1ZTQgfSwKKyAgICAgIHsgImludmFsaWQiLCBJbnZhbGlkIH0gfSk7CisgICAgRW51bTMgZTM7CisgICAgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKGUzKTsKKworICAgIC8vIHVwcGVyIGNhc2UKKyAgICBFWFBFQ1RfRVEoInllcyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIllFUyIpKTsKKyAgICBFWFBFQ1RfRVEoIm5vIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTk8iKSk7CisgICAgRVhQRUNUX0VRKCJ5ZXMtbm8iLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZRVNfTk8iKSk7CisgICAgRVhQRUNUX0VRKCJ5ZXMtbm8iLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZRVNfX05PIikpOworICAgIEVYUEVDVF9FUSgiYTJkcCIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIkEyRFAiKSk7CisgICAgRVhQRUNUX0VRKCJtcDItdHMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNUDJfVFMiKSk7CisgICAgRVhQRUNUX0VRKCJibG9jay0yZCIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIkJMT0NLXzJEIikpOworICAgIEVYUEVDVF9FUSgibXBlZy0yLXRzIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTVBFR18yX1RTIikpOworICAgIEVYUEVDVF9FUSgiX2hpZGRlbi12YWx1ZSIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9ISURERU5fVkFMVUUiKSk7CisgICAgRVhQRUNUX0VRKCJfX2hpZGRlbi12YWx1ZTIiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfX0hJRERFTl9WQUxVRTIiKSk7CisgICAgRVhQRUNUX0VRKCJfX2hpZGRlbi12YWx1ZS0yIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX19ISURERU5fVkFMVUVfMiIpKTsKKworICAgIC8vIGNhbWVsIGNhc2UKKyAgICBFWFBFQ1RfRVEoInllcyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIlllcyIpKTsKKyAgICBFWFBFQ1RfRVEoIm5vIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTm8iKSk7CisgICAgRVhQRUNUX0VRKCJ5ZXMtbm8iLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZZXNObyIpKTsKKyAgICBFWFBFQ1RfRVEoInllcy1ubyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIlllc19ObyIpKTsKKyAgICBFWFBFQ1RfRVEoIm1wMi10cyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1QMlRzIikpOworICAgIEVYUEVDVF9FUSgiYmxvY2stMmQiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJCbG9jazJEIikpOworICAgIEVYUEVDVF9FUSgibXBlZy0yLXRzIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTXBlZzJ0cyIpKTsKKyAgICBFWFBFQ1RfRVEoIl9oaWRkZW4tdmFsdWUiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfSGlkZGVuVmFsdWUiKSk7CisgICAgRVhQRUNUX0VRKCJfX2hpZGRlbi12YWx1ZS0yIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX19IaWRkZW5WYWx1ZTIiKSk7CisKKyAgICAvLyBtaXhlZCBjYXNlCisgICAgRVhQRUNUX0VRKCJtcDJ0LXMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNUDJUX3MiKSk7CisgICAgRVhQRUNUX0VRKCJibG9jay0yZCIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIkJsb2NrXzJEIikpOworICAgIEVYUEVDVF9FUSgiYmxvY2stMi1kIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiQmxvY2syX0QiKSk7CisgICAgRVhQRUNUX0VRKCJtcGVnLTItdHMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNcGVnXzJ0cyIpKTsKKyAgICBFWFBFQ1RfRVEoIm1wZWctMi10cyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1wZWdfMl9UUyIpKTsKKyAgICBFWFBFQ1RfRVEoIl9oaWRkZW4tdmFsdWUiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfSGlkZGVuX19WQUxVRSIpKTsKKyAgICBFWFBFQ1RfRVEoIl9faGlkZGVuLXZhbHVlLTIiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfX0hpZGRlblZhbHVlXzIiKSk7CisgICAgRVhQRUNUX0VRKCJfMiIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl8yIikpOworICAgIEVYUEVDVF9FUSgiX18yMyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9fMjMiKSk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy9DMl90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWRhOWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyX3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8QzIuaD4KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNUQVRJQyBURVNUUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwordGVtcGxhdGU8aW50IE4+CitzdHJ1Y3QgYzJfY29uc3RfY2hlY2tlcgoreworICAgIGlubGluZSBjb25zdGV4cHIgc3RhdGljIGludCBudW0oKSB7IHJldHVybiBOOyB9Cit9OworCitjb25zdGV4cHIgYXV0byBtaW5faTMyX2kzMiA9IGMyX21pbihpbnQzMl90KDEpLCBpbnQzMl90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl9pMzJfaTMyKSwgY29uc3QgaW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDMyX3QiKTsKK2NvbnN0ZXhwciBhdXRvIG1pbl9pMzJfaTY0ID0gYzJfbWluKGludDMyX3QoMyksIGludDY0X3QoMikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWluX2kzMl9pNjQpLCBjb25zdCBpbnQ2NF90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50NjRfdCIpOworY29uc3RleHByIGF1dG8gbWluX2k4X2kzMiA9IGMyX21pbihpbnQ4X3QoMHhmZiksIGludDMyX3QoMHhmZmZmZmZmZikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWluX2k4X2kzMiksIGNvbnN0IGludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQzMl90Iik7CisKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtaW5faTMyX2kzMj46Om51bSgpID09IDEsICJzaG91bGQgYmUgMSIpOworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1pbl9pMzJfaTY0Pjo6bnVtKCkgPT0gMiwgInNob3VsZCBiZSAyIik7CitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWluX2k4X2kzMj46Om51bSgpID09IDB4ZmZmZmZmZmYsICJzaG91bGQgYmUgMHhmZmZmZmZmZiIpOworCitjb25zdGV4cHIgYXV0byBtaW5fdTMyX3UzMiA9IGMyX21pbih1aW50MzJfdCgxKSwgdWludDMyX3QoMikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWluX3UzMl91MzIpLCBjb25zdCB1aW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQzMl90Iik7Citjb25zdGV4cHIgYXV0byBtaW5fdTMyX3U2NCA9IGMyX21pbih1aW50MzJfdCgzKSwgdWludDY0X3QoMikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWluX3UzMl91NjQpLCBjb25zdCB1aW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQzMl90Iik7Citjb25zdGV4cHIgYXV0byBtaW5fdTMyX3U4ID0gYzJfbWluKHVpbnQzMl90KDB4ZmZmZmZmZmYpLCB1aW50OF90KDB4ZmYpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl91MzJfdTgpLCBjb25zdCB1aW50OF90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDhfdCIpOworCitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWluX3UzMl91MzI+OjpudW0oKSA9PSAxLCAic2hvdWxkIGJlIDEiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtaW5fdTMyX3U2ND46Om51bSgpID09IDIsICJzaG91bGQgYmUgMiIpOworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1pbl91MzJfdTg+OjpudW0oKSA9PSAweGZmLCAic2hvdWxkIGJlIDB4ZmYiKTsKKworY29uc3RleHByIGF1dG8gbWF4X2kzMl9pMzIgPSBjMl9tYXgoaW50MzJfdCgxKSwgaW50MzJfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfaTMyX2kzMiksIGNvbnN0IGludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQzMl90Iik7Citjb25zdGV4cHIgYXV0byBtYXhfaTMyX2k2NCA9IGMyX21heChpbnQzMl90KDMpLCBpbnQ2NF90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1heF9pMzJfaTY0KSwgY29uc3QgaW50NjRfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDY0X3QiKTsKK2NvbnN0ZXhwciBhdXRvIG1heF9pOF9pMzIgPSBjMl9tYXgoaW50OF90KDB4ZmYpLCBpbnQzMl90KDB4ZmZmZmZmZmYpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1heF9pOF9pMzIpLCBjb25zdCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOworCitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWF4X2kzMl9pMzI+OjpudW0oKSA9PSAyLCAic2hvdWxkIGJlIDIiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtYXhfaTMyX2k2ND46Om51bSgpID09IDMsICJzaG91bGQgYmUgMyIpOworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1heF9pOF9pMzI+OjpudW0oKSA9PSAweGZmZmZmZmZmLCAic2hvdWxkIGJlIDB4ZmZmZmZmZmYiKTsKKworY29uc3RleHByIGF1dG8gbWF4X3UzMl91MzIgPSBjMl9tYXgodWludDMyX3QoMSksIHVpbnQzMl90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1heF91MzJfdTMyKSwgY29uc3QgdWludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50MzJfdCIpOworY29uc3RleHByIGF1dG8gbWF4X3UzMl91NjQgPSBjMl9tYXgodWludDMyX3QoMyksIHVpbnQ2NF90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1heF91MzJfdTY0KSwgY29uc3QgdWludDY0X3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50NjRfdCIpOworY29uc3RleHByIGF1dG8gbWF4X3UzMl91OCA9IGMyX21heCh1aW50MzJfdCgweDdmZmZmZmZmKSwgdWludDhfdCgweGZmKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfdTMyX3U4KSwgY29uc3QgdWludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50MzJfdCIpOworCitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWF4X3UzMl91MzI+OjpudW0oKSA9PSAyLCAic2hvdWxkIGJlIDIiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtYXhfdTMyX3U2ND46Om51bSgpID09IDMsICJzaG91bGQgYmUgMyIpOworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1heF91MzJfdTg+OjpudW0oKSA9PSAweDdmZmZmZmZmLCAic2hvdWxkIGJlIDB4N2ZmZmZmZmYiKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENPVU5URVIgVEVTVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3ZvaWQgYzJfY250cl9zdGF0aWNfdGVzdCgpIHsKKyAgICAvLyBzYW5pdHkgY2hlY2tzIGZvciBjb25zdHJ1Y3Rpb24vYXNzaWdubWVudAorICAgIGNvbnN0ZXhwciBjMl9jbnRyMzJfdCBjMzJfYSgxMjMpOworICAgIGNvbnN0ZXhwciBjMl9jbnRyNjRfdCBjNjRfYSgtNDU2KTsKKyAgICBjMl9jbnRyMzJfdCBjMzJfYiBfX3VudXNlZCA9IGM2NF9hOworICAgIC8vIGMzMl9iID0gNjQuOyAvLyBESVNBTExPV0VECisgICAgLy8gYzJfY250cjY0X3QgYzY0X2IgPSBjMzJfYTsgLy8gRElTQUxMT1dFRAorCisgICAgLy8gc2FuaXR5IGNoZWNrcyBmb3Igc29tZSBjb25zdGV4cHIgb3BlcmF0b3JzCisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoYzMyX2EgKyBjNjRfYSksIGRlY2x0eXBlKGM2NF9hICsgYzMyX2EpPjo6dmFsdWUsICIrIHNob3VsZCByZXN1bHQgc2FtZSB0eXBlIik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSArIGM2NF9hID09IGMyX2NudHIzMl90KC0zMzMpLCAiMTIzICsgLTQ1NiA9IC0zMzMiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hICsgYzMyX2EgPT0gYzJfY250cjMyX3QoMjQ2KSwgIjEyMyArIDEyMyA9IDI0NiIpOworICAgIHN0YXRpY19hc3NlcnQoYzY0X2EgKyBjMzJfYSA9PSBjMl9jbnRyMzJfdCgtMzMzKSwgIi00NTYgKyAxMjMgPSA1NzkiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShjMzJfYSArIDEpLCBkZWNsdHlwZSgxICsgYzMyX2EpPjo6dmFsdWUsICIrIHNob3VsZCByZXN1bHQgc2FtZSB0eXBlIik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSArIDQ1NiA9PSBjMl9jbnRyMzJfdCg1NzkpLCAiMTIzICsgNDU2ID0gNTc5Iik7CisgICAgc3RhdGljX2Fzc2VydCg0NTYgKyBjNjRfYSA9PSBjMl9jbnRyNjRfdCgwKSwgIjQ1NiArIC00NTYgPSAwIik7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoYzMyX2EgLSBjNjRfYSksIGRlY2x0eXBlKGM2NF9hIC0gYzMyX2EpPjo6dmFsdWUsICItIHNob3VsZCByZXN1bHQgc2FtZSB0eXBlIik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSAtIGM2NF9hID09IGMyX2NudHIzMl90KDU3OSksICIxMjMgLSAtNDU2ID0gNTc5Iik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSAtIGMzMl9hID09IGMyX2NudHIzMl90KDApLCAiMTIzIC0gMTIzID0gMCIpOworICAgIHN0YXRpY19hc3NlcnQoYzY0X2EgLSBjMzJfYSA9PSBjMl9jbnRyMzJfdCgtNTc5KSwgIi00NTYgLSAxMjMgPSAtNTc5Iik7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoYzMyX2EgLSAxKSwgZGVjbHR5cGUoMSAtIGMzMl9hKT46OnZhbHVlLCAiLSBzaG91bGQgcmVzdWx0IHNhbWUgdHlwZSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgLSA0NTYgPT0gYzJfY250cjMyX3QoLTMzMyksICIxMjMgLSA0NTYgPSAtMzMzIik7CisgICAgc3RhdGljX2Fzc2VydCg0NTYgLSBjNjRfYSA9PSBjMl9jbnRyNjRfdCg5MTIpLCAiNDU2IC0gLTQ1NiA9IDkxMiIpOworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGMzMl9hICogYzY0X2EpLCBkZWNsdHlwZShjNjRfYSAqIGMzMl9hKT46OnZhbHVlLCAiKiBzaG91bGQgcmVzdWx0IHNhbWUgdHlwZSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgKiBjNjRfYSA9PSBjMl9jbnRyMzJfdCgtNTYwODgpLCAiMTIzICogLTQ1NiA9IC01NjA4OCIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgKiBjMzJfYSA9PSBjMl9jbnRyMzJfdCgxNTEyOSksICIxMjMgKiAxMjMgPSAxNTEyOSIpOworICAgIHN0YXRpY19hc3NlcnQoYzY0X2EgKiBjMzJfYSA9PSBjMl9jbnRyMzJfdCgtNTYwODgpLCAiLTQ1NiAqIDEyMyA9IC01NjA4OCIpOworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGMzMl9hICogMSksIGRlY2x0eXBlKDEgKiBjMzJfYSk+Ojp2YWx1ZSwgIiogc2hvdWxkIHJlc3VsdCBzYW1lIHR5cGUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hICogNDU2ID09IGMyX2NudHIzMl90KDU2MDg4KSwgIjEyMyAqIDQ1NiA9IDU2MDg4Iik7CisgICAgc3RhdGljX2Fzc2VydCg0NTYgKiBjNjRfYSA9PSBjMl9jbnRyNjRfdCgtMjA3OTM2KSwgIjQ1NiAqIC00NTYgPSAtMjA3OTM2Iik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KChjMzJfYSA8PCAyNnUpID09IGMyX2NudHIzMl90KDB4RUMwMDAwMDApLCAiMTIzIDw8IDI2ID0gMHhFQzAwMDAwMCIpOworCisgICAgLy8gc2FuaXR5IGNoZWNrcyBmb3IgdW5hcnkgb3BlcmF0b3JzCisgICAgc3RhdGljX2Fzc2VydChjMl9jbnRyMzJfdCgxKSA9PSArYzJfY250cjMyX3QoMSksICIxID09ICsxIik7CisgICAgc3RhdGljX2Fzc2VydChjMl9jbnRyMzJfdCgxKSA9PSAtYzJfY250cjMyX3QoLTEpLCAiMSA9PSAtLTEiKTsKKworICAgIC8vIHNhbml0eSBjaGVja3MgZm9yIGNvbXBhcmlzb24KKyAgICB1c2luZyBjOF90ID0gYzJfY250cl90PHVpbnQ4X3Q+OworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgtMHg4MCkgPiBjOF90KDB4N2YpLCAiODAgPiA3RiIpOworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgtMHg4MCkgPj0gYzhfdCgweDdmKSwgIjgwID49IDdGIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KDB4N2YpID4gYzhfdCgweDdlKSwgIjdGID4gN0UiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoMHg3ZikgPj0gYzhfdCgweDdlKSwgIjdGID49IDdFIik7CisgICAgc3RhdGljX2Fzc2VydCghKGM4X3QoLTB4ODApID4gYzhfdCgwKSksICI4MCAhPiAwMCIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDgwKSA+PSBjOF90KDApKSwgIjgwICE+PSAwMCIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDgwKSA+IGM4X3QoLTB4ODApKSwgIjgwICE+IDgwIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KC0weDgwKSA+PSBjOF90KC0weDgwKSwgIjgwID49IDgwIik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoLTB4ODApID09IGM4X3QoMHg4MCksICI4MCA9PSA4MCIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDgwKSA9PSBjOF90KDApKSwgIjgwICE9IDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoLTB4ODApICE9IGM4X3QoMHg3ZiksICI4MCAhPSA3RiIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KDB4N2YpICE9IGM4X3QoMHg3ZikpLCAiODAgIT0gN0YiKTsKKworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgweDdmKSA8IGM4X3QoLTB4ODApLCAiN0YgPCA4MCIpOworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgweDdmKSA8PSBjOF90KC0weDgwKSwgIjdGIDwgODAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoMHg3ZSkgPCBjOF90KDB4N2YpLCAiN0UgPCA3RiIpOworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgweDdlKSA8PSBjOF90KDB4N2YpLCAiN0UgPCA3RiIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDQwKSA8IGM4X3QoMHg0MCkpLCAiLTQwICE8IDQwIik7CisgICAgc3RhdGljX2Fzc2VydCghKGM4X3QoLTB4NDApIDw9IGM4X3QoMHg0MCkpLCAiLTQwICE8PSA0MCIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDQwKSA8IGM4X3QoLTB4NDApKSwgIi00MCAhPCAtNDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoLTB4NDApIDw9IGM4X3QoLTB4NDApLCAiLTQwIDw9IC00MCIpOworCisgICAgc3RhdGljX2Fzc2VydChjMl9jbnRyMzJfdCgtMHg3ZmZmZmZmZiAtIDEpID4gYzJfY250cjMyX3QoMHg3ZmZmZmZmZiksICI4MCA+IDdGIik7CisgICAgc3RhdGljX2Fzc2VydCghKGMyX2NudHIzMl90KC0weDdmZmZmZmZmIC0gMSkgPiBjMl9jbnRyMzJfdCgwKSksICI4MCAhPiAwMCIpOworICAgIHN0YXRpY19hc3NlcnQoYzJfY250cjMyX3QoMSkgPT0gYzJfY250cjMyX3QoYzJfY250cjY0X3QoMHgxMDAwMDAwMDF1bCkpLCAiMSA9PSAxIik7Cit9CisKK2NsYXNzIEMyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworfTsKKworVEVTVF9GKEMyVGVzdCwgQ291bnRlclRlc3QpIHsKKyAgICBjMl9jbnRyMzJfdCBjMzJfYSgxMjMpOworICAgIGMyX2NudHI2NF90IGM2NF9hKC00NTYpOworICAgIEVYUEVDVF9FUShjMzJfYSArPSAzLCBjMl9jbnRyMzJfdCgxMjYpKTsKKyAgICBFWFBFQ1RfRVEoYzMyX2EgKz0gYzY0X2EsIGMyX2NudHIzMl90KC0zMzApKTsKKyAgICBFWFBFQ1RfRVEoYzMyX2EgPDw9IDJ1LCBjMl9jbnRyMzJfdCgtMTMyMCkpOworICAgIEVYUEVDVF9FUShjNjRfYSAqPSAzLCBjMl9jbnRyNjRfdCgtMTM2OCkpOworICAgIEVYUEVDVF9FUShjMzJfYSAtPSBjNjRfYSwgYzJfY250cjMyX3QoNDgpKTsKKyAgICBFWFBFQ1RfRVEoYzMyX2EgLT0gNDAsIGMyX2NudHIzMl90KDgpKTsKKyAgICBFWFBFQ1RfRVEoYzMyX2EgKj0gYzMyX2EsIGMyX2NudHIzMl90KDY0KSk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy92bmRrL0MyQnVmZmVyVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvdm5kay9DMkJ1ZmZlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MDk5NGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvdm5kay9DMkJ1ZmZlclRlc3QuY3BwCkBAIC0wLDAgKzEsNzY4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMkJ1ZmZlclV0aWxzVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICAgIHN0YXRpYyB2b2lkIFN0YXRpY1NlZ21lbnRUZXN0KCkgeworICAgICAgICAvLyBjb25zdHJ1Y3RvcgorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5vZmZzZXQgPT0gMTIzLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLnNpemUgPT0gNDU2LCAiIik7CisKKyAgICAgICAgLy8gZW1wdHkKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmlzRW1wdHkoKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAwdSkuaXNFbXB0eSgpLCAiIik7CisKKyAgICAgICAgLy8gdmFsaWQKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaXNWYWxpZCgpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5pc1ZhbGlkKCksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkuaXNWYWxpZCgpLCAiIik7CisKKyAgICAgICAgLy8gYm9vbCgpCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoKGJvb2wpQzJTZWdtZW50KDEyM3UsIH4xMjN1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFib29sKEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFib29sKEMyU2VnbWVudCgxMjN1LCAwKSksICIiKTsKKworICAgICAgICAvLyAhCisgICAgICAgIHN0YXRpY19hc3NlcnQoISFDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghIUMyU2VnbWVudCgxMjN1LCB+MTIzdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDApLCAiIik7CisKKyAgICAgICAgLy8gY29udGFpbnMKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjN1LCAwKSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyM3UsIDApKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCB+MTIzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyM3UsIH4xMjN1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5jb250YWlucyhDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCB+MTIzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyMnUsIDJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjN1LCAydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDN1KS5jb250YWlucyhDMlNlZ21lbnQoMTI0dSwgMnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFDMlNlZ21lbnQoMTIzdSwgM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjV1LCAydSkpLCAiIik7CisKKyAgICAgICAgLy8gPT0KKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPT0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPT0gQzJTZWdtZW50KDEyM3UsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID09IEMyU2VnbWVudCgxMjN1LCA0NTV1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA9PSBDMlNlZ21lbnQoMTIydSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPT0gQzJTZWdtZW50KDEyNHUsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDB1KSA9PSBDMlNlZ21lbnQoMTI0dSwgMHUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAwdSkgPT0gQzJTZWdtZW50KDEyM3UsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpID09IEMyU2VnbWVudCgxMjR1LCAxICsgfjEyNHUpLCAiIik7CisKKyAgICAgICAgLy8gIT0KKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSAhPSBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpICE9IEMyU2VnbWVudCgxMjN1LCA0NTd1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSAhPSBDMlNlZ21lbnQoMTIzdSwgNDU1dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgIT0gQzJTZWdtZW50KDEyMnUsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpICE9IEMyU2VnbWVudCgxMjR1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAwdSkgIT0gQzJTZWdtZW50KDEyNHUsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDB1KSAhPSBDMlNlZ21lbnQoMTIzdSwgMHUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkgIT0gQzJTZWdtZW50KDEyNHUsIDEgKyB+MTI0dSkpLCAiIik7CisKKyAgICAgICAgLy8gPD0KKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPD0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpIDw9IEMyU2VnbWVudCgxMjN1LCA0NTd1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA8PSBDMlNlZ21lbnQoMTIydSwgNDU3dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTd1KSA8PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgNDU3dSkgPD0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1N3UpIDw9IEMyU2VnbWVudCgxMjR1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCA0NTd1KSA8PSBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMHUpIDw9IEMyU2VnbWVudCgxMjN1LCAwdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDB1KSA8PSBDMlNlZ21lbnQoMTIydSwgMXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyMnUsIDB1KSA8PSBDMlNlZ21lbnQoMTIydSwgMXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgfjEyMnUpIDw9IEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkgPD0gQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpIDw9IEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpKSwgIiIpOworCisgICAgICAgIC8vIDwKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA8IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPCBDMlNlZ21lbnQoMTIzdSwgNDU3dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPCBDMlNlZ21lbnQoMTIydSwgNDU3dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTd1KSA8IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCA0NTd1KSA8IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTd1KSA8IEMyU2VnbWVudCgxMjR1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCA0NTd1KSA8IEMyU2VnbWVudCgxMjN1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAwdSkgPCBDMlNlZ21lbnQoMTIzdSwgMHUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAwdSkgPCBDMlNlZ21lbnQoMTIydSwgMXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyMnUsIDB1KSA8IEMyU2VnbWVudCgxMjJ1LCAxdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCB+MTIydSkgPCBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpIDwgQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpIDwgQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkpLCAiIik7CisKKyAgICAgICAgLy8gPD0KKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPj0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1N3UpID49IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCA0NTd1KSA+PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA+PSBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPj0gQzJTZWdtZW50KDEyMnUsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyNHUsIDQ1N3UpID49IEMyU2VnbWVudCgxMjN1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTd1KSA+PSBDMlNlZ21lbnQoMTIydSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgMHUpID49IEMyU2VnbWVudCgxMjJ1LCAwdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyMnUsIDF1KSA+PSBDMlNlZ21lbnQoMTIzdSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyMnUsIDF1KSA+PSBDMlNlZ21lbnQoMTIydSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA+PSBDMlNlZ21lbnQoMTIydSwgfjEyMnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSA+PSBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpID49IEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpKSwgIiIpOworCisgICAgICAgIC8vIDwKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA+IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPiBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIydSwgNDU3dSkgPiBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA+IEMyU2VnbWVudCgxMjN1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA+IEMyU2VnbWVudCgxMjJ1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjR1LCA0NTd1KSA+IEMyU2VnbWVudCgxMjN1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTd1KSA+IEMyU2VnbWVudCgxMjJ1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCAwdSkgPiBDMlNlZ21lbnQoMTIydSwgMHUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAxdSkgPiBDMlNlZ21lbnQoMTIzdSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyMnUsIDF1KSA+IEMyU2VnbWVudCgxMjJ1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpID4gQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCB+MTIydSkgPiBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpID4gQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkpLCAiIik7CisKKyAgICAgICAgLy8gZW5kCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmVuZCgpID09IDU3OXUsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMHUpLmVuZCgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLmVuZCgpID09IDB4ZmZmZmZmZmZ1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkuZW5kKCkgPT0gMHUsICIiKTsKKworICAgICAgICAvLyBpbnRlcnNlY3QKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSkgPT0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTIzdSwgNDYwdSkpID09IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDEyNHUsIDQ2MHUpKSA9PSBDMlNlZ21lbnQoMTI0dSwgNDU1dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCg1Nzl1LCA0NjB1KSkgPT0gQzJTZWdtZW50KDU3OXUsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDU4OXUsIDQ2MHUpKSA9PSBDMlNlZ21lbnQoNTg5dSwgfjl1IC8qIC0xMCAqLyksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxMjN1LCA0NTV1KSkgPT0gQzJTZWdtZW50KDEyM3UsIDQ1NXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTIydSwgNDU2dSkpID09IEMyU2VnbWVudCgxMjN1LCA0NTV1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDB1LCAxMjN1KSkgPT0gQzJTZWdtZW50KDEyM3UsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDB1LCAwdSkpID09IEMyU2VnbWVudCgxMjN1LCB+MTIydSAvKiAtMTIzICovKSwgIiIpOworCisgICAgICAgIC8vIG5vcm1hbGl6ZSAoY2hhbmdlIGludmFsaWQgc2VnbWVudHMgdG8gZW1wdHkgc2VnbWVudHMpCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCB+MTIzdSkubm9ybWFsaXplKCkgPT0gQzJTZWdtZW50KDEyM3UsIH4xMjN1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxMjN1LCAwdSksICIiKTsKKworICAgICAgICAvLyBub3RlOiBub3JtYWxpemUgY2Fubm90IGJlIHVzZWQgdG8gbWFrZSB0aGlzIHdvcmsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxNTB1LCB+MTUwdSkpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxNTB1LCA0Mjl1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDE1MHUsIDEgKyB+MTUwdSkpLm5vcm1hbGl6ZSgpICE9IEMyU2VnbWVudCgxNTB1LCA0Mjl1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDE1MHUsIDEgKyB+MTUwdSkpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxNTB1LCAwdSksICIiKTsKKworICAgICAgICAvLyBzYXR1cmF0ZSAoY2hhbmdlIGludmFsaWQgc2VnbWVudHMgdG8gZnVsbCBzZWdtZW50cyB1cCB0byBtYXgpCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLnNhdHVyYXRlKCkgPT0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5zYXR1cmF0ZSgpID09IEMyU2VnbWVudCgxMjN1LCB+MTIzdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KS5zYXR1cmF0ZSgpID09IEMyU2VnbWVudCgxMjN1LCB+MTIzdSksICIiKTsKKworICAgICAgICAvLyBub3RlOiBzYXR1cmF0ZSBjYW4gYmUgdXNlZCB0byBtYWtlIHRoaXMgd29yayBidXQgb25seSBwYXJ0aWFsbHkKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxNTB1LCAxICsgfjE1MHUpLnNhdHVyYXRlKCkpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxNTB1LCA0Mjl1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDB1LCAxMDB1KS5zYXR1cmF0ZSgpKS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTIzdSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTAwMHUsIDEwMHUpLnNhdHVyYXRlKCkpLm5vcm1hbGl6ZSgpICE9IEMyU2VnbWVudCg1Nzl1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxMDAwdSwgMTAwdSkuc2F0dXJhdGUoKSkubm9ybWFsaXplKCkgPT0gQzJTZWdtZW50KDEwMDB1LCAwdSksICIiKTsKKworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIFN0YXRpY0xpbmVhclJhbmdlQW5kQ2FwYWNpdHlUZXN0KCkgeworICAgICAgICBjbGFzcyBUZXN0Q2FwYWNpdHkgOiBwdWJsaWMgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworICAgICAgICAgICAgdXNpbmcgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3Q6Ol9DMkxpbmVhckNhcGFjaXR5QXNwZWN0OworICAgICAgICAgICAgZnJpZW5kIGNsYXNzIEMyQnVmZmVyVXRpbHNUZXN0OworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIFRlc3RSYW5nZSA6IHB1YmxpYyBfQzJMaW5lYXJSYW5nZUFzcGVjdCB7CisgICAgICAgICAgICB1c2luZyBfQzJMaW5lYXJSYW5nZUFzcGVjdDo6X0MyTGluZWFyUmFuZ2VBc3BlY3Q7CisgICAgICAgICAgICBmcmllbmQgY2xhc3MgQzJCdWZmZXJVdGlsc1Rlc3Q7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0Q2FwYWNpdHkoMHUpLmNhcGFjaXR5KCkgPT0gMHUsICIiKTsKKyAgICAgICAgY29uc3RleHByIFRlc3RDYXBhY2l0eSBjYXAoMTIzdSk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdENhcGFjaXR5KCZjYXApLmNhcGFjaXR5KCkgPT0gMTIzdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RDYXBhY2l0eShudWxscHRyKS5jYXBhY2l0eSgpID09IDB1LCAiIik7CisKKyAgICAgICAgLy8gX0MyTGluZWFyQ2FwYWNpdHlSYW5nZQorICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwKS5jYXBhY2l0eSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCkub2Zmc2V0KCkgPT0gMHUsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCkuc2l6ZSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCkuZW5kT2Zmc2V0KCkgPT0gMTIzdSwgIiIpOworCisgICAgICAgIGNvbnN0ZXhwciBUZXN0UmFuZ2UgcmFuZ2UoJmNhcCwgNTB1LCAxMDB1KTsKKworICAgICAgICBzdGF0aWNfYXNzZXJ0KHJhbmdlLmNhcGFjaXR5KCkgPT0gMTIzdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHJhbmdlLm9mZnNldCgpID09IDUwdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHJhbmdlLnNpemUoKSA9PSA3M3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChyYW5nZS5lbmRPZmZzZXQoKSA9PSAxMjN1LCAiIik7CisKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjB1LCAzMHUpLmNhcGFjaXR5KCkgPT0gMTIzdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwLCAyMHUsIDMwdSkub2Zmc2V0KCkgPT0gMjB1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXAsIDIwdSwgMzB1KS5zaXplKCkgPT0gMzB1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXAsIDIwdSwgMzB1KS5lbmRPZmZzZXQoKSA9PSA1MHUsICIiKTsKKworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwLCAyMDB1LCAzMHUpLmNhcGFjaXR5KCkgPT0gMTIzdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwLCAyMDB1LCAzMHUpLm9mZnNldCgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjAwdSwgMzB1KS5zaXplKCkgPT0gMHUsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjAwdSwgMzB1KS5lbmRPZmZzZXQoKSA9PSAxMjN1LCAiIik7CisKKyAgICB9CisKK307CisKKworY2xhc3MgQzJCdWZmZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgQzJCdWZmZXJUZXN0KCkKKyAgICAgICAgOiBtQmxvY2tQb29sSWQoQzJCbG9ja1Bvb2w6OlBMQVRGT1JNX1NUQVJUKSwKKyAgICAgICAgICBtTGluZWFyQWxsb2NhdG9yKHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0b3JJb24+KCdpJykpLAorICAgICAgICAgIG1TaXplKDB1KSwKKyAgICAgICAgICBtQWRkcihudWxscHRyKSwKKyAgICAgICAgICBtR3JhcGhpY0FsbG9jYXRvcihzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdG9yR3JhbGxvYz4oJ2cnKSkgeworICAgIH0KKworICAgIH5DMkJ1ZmZlclRlc3QoKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIGFsbG9jYXRlTGluZWFyKHNpemVfdCBjYXBhY2l0eSkgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtTGluZWFyQWxsb2NhdG9yLT5uZXdMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICAgICAgICAgIGNhcGFjaXR5LAorICAgICAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgICAgICZtTGluZWFyQWxsb2NhdGlvbik7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIG1MaW5lYXJBbGxvY2F0aW9uLnJlc2V0KCk7CisgICAgICAgICAgICBGQUlMKCkgPDwgIkMyQWxsb2NhdG9yOjpuZXdMaW5lYXJBbGxvY2F0aW9uKCkgZmFpbGVkOiAiIDw8IGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgbWFwTGluZWFyKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCB1aW50OF90ICoqYWRkcikgeworICAgICAgICBBU1NFUlRfVFJVRShtTGluZWFyQWxsb2NhdGlvbik7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1MaW5lYXJBbGxvY2F0aW9uLT5tYXAoCisgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICZtQWRkcik7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIG1BZGRyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIEZBSUwoKSA8PCAiQzJMaW5lYXJBbGxvY2F0aW9uOjptYXAoKSBmYWlsZWQ6ICIgPDwgZXJyOworICAgICAgICB9CisgICAgICAgIEFTU0VSVF9ORShudWxscHRyLCBtQWRkcik7CisgICAgICAgIG1TaXplID0gc2l6ZTsKKyAgICAgICAgKmFkZHIgPSAodWludDhfdCAqKW1BZGRyOworICAgIH0KKworICAgIHZvaWQgdW5tYXBMaW5lYXIoKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKG1MaW5lYXJBbGxvY2F0aW9uKTsKKyAgICAgICAgQVNTRVJUX05FKG51bGxwdHIsIG1BZGRyKTsKKyAgICAgICAgQVNTRVJUX05FKDB1LCBtU2l6ZSk7CisKKyAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgQVNTRVJUX0VRKEMyX09LLCBtTGluZWFyQWxsb2NhdGlvbi0+dW5tYXAobUFkZHIsIG1TaXplLCBudWxscHRyKSk7CisgICAgICAgIG1TaXplID0gMHU7CisgICAgICAgIG1BZGRyID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1ha2VMaW5lYXJCbG9ja1Bvb2woKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihtTGluZWFyQWxsb2NhdG9yLCBtQmxvY2tQb29sSWQrKyk7CisgICAgfQorCisgICAgdm9pZCBhbGxvY2F0ZUdyYXBoaWModWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtR3JhcGhpY0FsbG9jYXRvci0+bmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCwKKyAgICAgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICAgICAmbUdyYXBoaWNBbGxvY2F0aW9uKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgbUdyYXBoaWNBbGxvY2F0aW9uLnJlc2V0KCk7CisgICAgICAgICAgICBGQUlMKCkgPDwgIkMyQWxsb2NhdG9yOjpuZXdHcmFwaGljQWxsb2NhdGlvbigpIGZhaWxlZDogIiA8PCBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG1hcEdyYXBoaWMoQzJSZWN0IHJlY3QsIEMyUGxhbmFyTGF5b3V0ICpsYXlvdXQsIHVpbnQ4X3QgKiphZGRyKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKG1HcmFwaGljQWxsb2NhdGlvbik7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1HcmFwaGljQWxsb2NhdGlvbi0+bWFwKAorICAgICAgICAgICAgICAgIHJlY3QsCisgICAgICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICAgICAgICAgICAgICBhZGRyKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfWV0gPSBudWxscHRyOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSBudWxscHRyOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0gPSBudWxscHRyOworICAgICAgICAgICAgRkFJTCgpIDw8ICJDMkdyYXBoaWNBbGxvY2F0aW9uOjptYXAoKSBmYWlsZWQ6ICIgPDwgZXJyOworICAgICAgICB9CisgICAgICAgIG1NYXBwZWRSZWN0ID0gcmVjdDsKKyAgICAgICAgbWVtY3B5KG1BZGRyR3JhcGhpYywgYWRkciwgc2l6ZW9mKHVpbnQ4X3QqKSAqIEMyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FUyk7CisgICAgfQorCisgICAgdm9pZCB1bm1hcEdyYXBoaWMoKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKG1HcmFwaGljQWxsb2NhdGlvbik7CisKKyAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgQVNTRVJUX0VRKEMyX09LLCBtR3JhcGhpY0FsbG9jYXRpb24tPnVubWFwKG1BZGRyR3JhcGhpYywgbU1hcHBlZFJlY3QsIG51bGxwdHIpKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1ha2VHcmFwaGljQmxvY2tQb29sKCkgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbD4obUdyYXBoaWNBbGxvY2F0b3IpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBtQmxvY2tQb29sSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtTGluZWFyQWxsb2NhdG9yOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IG1MaW5lYXJBbGxvY2F0aW9uOworICAgIHNpemVfdCBtU2l6ZTsKKyAgICB2b2lkICptQWRkcjsKKyAgICBDMlJlY3QgbU1hcHBlZFJlY3Q7CisgICAgdWludDhfdCogbUFkZHJHcmFwaGljW0MyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FU107CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1HcmFwaGljQWxsb2NhdG9yOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBtR3JhcGhpY0FsbG9jYXRpb247Cit9OworCitURVNUX0YoQzJCdWZmZXJUZXN0LCBMaW5lYXJBbGxvY2F0aW9uVGVzdCkgeworICAgIGNvbnN0ZXhwciBzaXplX3Qga0NhcGFjaXR5ID0gMTAyNHUgKiAxMDI0dTsKKworICAgIGFsbG9jYXRlTGluZWFyKGtDYXBhY2l0eSk7CisKKyAgICB1aW50OF90ICphZGRyID0gbnVsbHB0cjsKKyAgICBtYXBMaW5lYXIoMHUsIGtDYXBhY2l0eSwgJmFkZHIpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga0NhcGFjaXR5OyArK2kpIHsKKyAgICAgICAgYWRkcltpXSA9IGkgJSAxMDB1OworICAgIH0KKworICAgIHVubWFwTGluZWFyKCk7CisgICAgYWRkciA9IG51bGxwdHI7CisKKyAgICBtYXBMaW5lYXIoa0NhcGFjaXR5IC8gMywga0NhcGFjaXR5IC8gMywgJmFkZHIpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtDYXBhY2l0eSAvIDM7ICsraSkgeworICAgICAgICBBU1NFUlRfRVEoKGkgKyBrQ2FwYWNpdHkgLyAzKSAlIDEwMCwgYWRkcltpXSkgPDwgIiBhdCBpID0gIiA8PCBpOworICAgIH0KK30KKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgQmxvY2tQb29sVGVzdCkgeworICAgIGNvbnN0ZXhwciBzaXplX3Qga0NhcGFjaXR5ID0gMTAyNHUgKiAxMDI0dTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gYmxvY2tQb29sKG1ha2VMaW5lYXJCbG9ja1Bvb2woKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQVNTRVJUX0VRKEMyX09LLCBibG9ja1Bvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICBrQ2FwYWNpdHksCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZibG9jaykpOworICAgIEFTU0VSVF9UUlVFKGJsb2NrKTsKKworICAgIEMyQWNxdWlyYWJsZTxDMldyaXRlVmlldz4gd3JpdGVWaWV3SG9sZGVyID0gYmxvY2stPm1hcCgpOworICAgIEMyV3JpdGVWaWV3IHdyaXRlVmlldyA9IHdyaXRlVmlld0hvbGRlci5nZXQoKTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIHdyaXRlVmlldy5lcnJvcigpKTsKKyAgICBBU1NFUlRfRVEoa0NhcGFjaXR5LCB3cml0ZVZpZXcuY2FwYWNpdHkoKSk7CisgICAgQVNTRVJUX0VRKDB1LCB3cml0ZVZpZXcub2Zmc2V0KCkpOworICAgIEFTU0VSVF9FUShrQ2FwYWNpdHksIHdyaXRlVmlldy5zaXplKCkpOworCisgICAgdWludDhfdCAqZGF0YSA9IHdyaXRlVmlldy5kYXRhKCk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGRhdGEpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgd3JpdGVWaWV3LnNpemUoKTsgKytpKSB7CisgICAgICAgIGRhdGFbaV0gPSBpICUgMTAwdTsKKyAgICB9CisKKyAgICB3cml0ZVZpZXcuc2V0T2Zmc2V0KGtDYXBhY2l0eSAvIDMpOworICAgIGRhdGEgPSB3cml0ZVZpZXcuZGF0YSgpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBkYXRhKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdyaXRlVmlldy5zaXplKCk7ICsraSkgeworICAgICAgICBBU1NFUlRfRVEoKGkgKyBrQ2FwYWNpdHkgLyAzKSAlIDEwMHUsIGRhdGFbaV0pIDw8ICIgYXQgaSA9ICIgPDwgaQorICAgICAgICAgICAgPDwgIjsgZGF0YSA9ICIgPDwgc3RhdGljX2Nhc3Q8dm9pZCAqPihkYXRhKTsKKyAgICB9CisKKyAgICBDMkZlbmNlIGZlbmNlOworICAgIEMyQ29uc3RMaW5lYXJCbG9jayBjb25zdEJsb2NrID0gYmxvY2stPnNoYXJlKAorICAgICAgICAgICAga0NhcGFjaXR5IC8gMywga0NhcGFjaXR5IC8gMywgZmVuY2UpOworCisgICAgQzJBY3F1aXJhYmxlPEMyUmVhZFZpZXc+IHJlYWRWaWV3SG9sZGVyID0gY29uc3RCbG9jay5tYXAoKTsKKyAgICBDMlJlYWRWaWV3IHJlYWRWaWV3ID0gcmVhZFZpZXdIb2xkZXIuZ2V0KCk7CisgICAgQVNTRVJUX0VRKEMyX09LLCByZWFkVmlldy5lcnJvcigpKTsKKyAgICBBU1NFUlRfRVEoa0NhcGFjaXR5IC8gMywgcmVhZFZpZXcuY2FwYWNpdHkoKSk7CisKKyAgICAvLyBUT0RPOiBmZW5jZQorICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnN0RGF0YSA9IHJlYWRWaWV3LmRhdGEoKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgY29uc3REYXRhKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlYWRWaWV3LmNhcGFjaXR5KCk7ICsraSkgeworICAgICAgICBBU1NFUlRfRVEoKGkgKyBrQ2FwYWNpdHkgLyAzKSAlIDEwMHUsIGNvbnN0RGF0YVtpXSkgPDwgIiBhdCBpID0gIiA8PCBpCisgICAgICAgICAgICAgICAgPDwgIjsgZGF0YSA9ICIgPDwgc3RhdGljX2Nhc3Q8dm9pZCAqPihkYXRhKQorICAgICAgICAgICAgICAgIDw8ICI7IGNvbnN0RGF0YSA9ICIgPDwgc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCAqPihjb25zdERhdGEpOworICAgIH0KKworICAgIHJlYWRWaWV3ID0gcmVhZFZpZXcuc3ViVmlldygzMzN1LCAxMDB1KTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIHJlYWRWaWV3LmVycm9yKCkpOworICAgIEFTU0VSVF9FUSgxMDB1LCByZWFkVmlldy5jYXBhY2l0eSgpKTsKKworICAgIGNvbnN0RGF0YSA9IHJlYWRWaWV3LmRhdGEoKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgY29uc3REYXRhKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlYWRWaWV3LmNhcGFjaXR5KCk7ICsraSkgeworICAgICAgICBBU1NFUlRfRVEoKGkgKyAzMzN1ICsga0NhcGFjaXR5IC8gMykgJSAxMDB1LCBjb25zdERhdGFbaV0pIDw8ICIgYXQgaSA9ICIgPDwgaTsKKyAgICB9Cit9CisKK3ZvaWQgZmlsbFBsYW5lKGNvbnN0IEMyUmVjdCByZWN0LCBjb25zdCBDMlBsYW5lSW5mbyBpbmZvLCB1aW50OF90ICphZGRyLCB1aW50OF90IHZhbHVlKSB7CisgICAgZm9yICh1aW50MzJfdCByb3cgPSAwOyByb3cgPCByZWN0LmhlaWdodCAvIGluZm8ucm93U2FtcGxpbmc7ICsrcm93KSB7CisgICAgICAgIGludDMyX3Qgcm93T2Zmc2V0ID0gKHJvdyArIHJlY3QudG9wIC8gaW5mby5yb3dTYW1wbGluZykgKiBpbmZvLnJvd0luYzsKKyAgICAgICAgZm9yICh1aW50MzJfdCBjb2wgPSAwOyBjb2wgPCByZWN0LndpZHRoIC8gaW5mby5jb2xTYW1wbGluZzsgKytjb2wpIHsKKyAgICAgICAgICAgIGludDMyX3QgY29sT2Zmc2V0ID0gKGNvbCArIHJlY3QubGVmdCAvIGluZm8uY29sU2FtcGxpbmcpICogaW5mby5jb2xJbmM7CisgICAgICAgICAgICBhZGRyW3Jvd09mZnNldCArIGNvbE9mZnNldF0gPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCB2ZXJpZnlQbGFuZShjb25zdCBDMlJlY3QgcmVjdCwgY29uc3QgQzJQbGFuZUluZm8gaW5mbywgY29uc3QgdWludDhfdCAqYWRkciwgdWludDhfdCB2YWx1ZSkgeworICAgIGZvciAodWludDMyX3Qgcm93ID0gMDsgcm93IDwgcmVjdC5oZWlnaHQgLyBpbmZvLnJvd1NhbXBsaW5nOyArK3JvdykgeworICAgICAgICBpbnQzMl90IHJvd09mZnNldCA9IChyb3cgKyByZWN0LnRvcCAvIGluZm8ucm93U2FtcGxpbmcpICogaW5mby5yb3dJbmM7CisgICAgICAgIGZvciAodWludDMyX3QgY29sID0gMDsgY29sIDwgcmVjdC53aWR0aCAvIGluZm8uY29sU2FtcGxpbmc7ICsrY29sKSB7CisgICAgICAgICAgICBpbnQzMl90IGNvbE9mZnNldCA9IChjb2wgKyByZWN0LmxlZnQgLyBpbmZvLmNvbFNhbXBsaW5nKSAqIGluZm8uY29sSW5jOworICAgICAgICAgICAgaWYgKGFkZHJbcm93T2Zmc2V0ICsgY29sT2Zmc2V0XSAhPSB2YWx1ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgR3JhcGhpY0FsbG9jYXRpb25UZXN0KSB7CisgICAgY29uc3RleHByIHVpbnQzMl90IGtXaWR0aCA9IDMyMDsKKyAgICBjb25zdGV4cHIgdWludDMyX3Qga0hlaWdodCA9IDI0MDsKKworICAgIGFsbG9jYXRlR3JhcGhpYyhrV2lkdGgsIGtIZWlnaHQpOworCisgICAgdWludDhfdCAqYWRkcltDMlBsYW5hckxheW91dDo6TUFYX05VTV9QTEFORVNdOworICAgIEMyUmVjdCByZWN0KGtXaWR0aCwga0hlaWdodCk7CisgICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0OworICAgIG1hcEdyYXBoaWMocmVjdCwgJmxheW91dCwgYWRkcik7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV0pOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSk7CisKKyAgICB1aW50OF90ICp5ID0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgQzJQbGFuZUluZm8geUluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICB1aW50OF90ICp1ID0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgQzJQbGFuZUluZm8gdUluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICB1aW50OF90ICp2ID0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisgICAgQzJQbGFuZUluZm8gdkluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKworICAgIGZpbGxQbGFuZShyZWN0LCB5SW5mbywgeSwgMCk7CisgICAgZmlsbFBsYW5lKHJlY3QsIHVJbmZvLCB1LCAwKTsKKyAgICBmaWxsUGxhbmUocmVjdCwgdkluZm8sIHYsIDApOworICAgIGZpbGxQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgeUluZm8sIHksIDB4MTIpOworICAgIGZpbGxQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgdUluZm8sIHUsIDB4MzQpOworICAgIGZpbGxQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgdkluZm8sIHYsIDB4NTYpOworCisgICAgdW5tYXBHcmFwaGljKCk7CisKKyAgICBtYXBHcmFwaGljKHJlY3QsICZsYXlvdXQsIGFkZHIpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOworCisgICAgeSA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIHlJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgdSA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIHVJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgdiA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIHZJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgeUluZm8sIHksIDB4MTIpKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgdUluZm8sIHUsIDB4MzQpKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgdkluZm8sIHYsIDB4NTYpKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCwga0hlaWdodCAvIDQgfSwgeUluZm8sIHksIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCwga0hlaWdodCAvIDQgfSwgdUluZm8sIHUsIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCwga0hlaWdodCAvIDQgfSwgdkluZm8sIHYsIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCAvIDQsIGtIZWlnaHQgfSwgeUluZm8sIHksIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCAvIDQsIGtIZWlnaHQgfSwgdUluZm8sIHUsIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCAvIDQsIGtIZWlnaHQgfSwgdkluZm8sIHYsIDApKTsKK30KKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgR3JhcGhpY0Jsb2NrUG9vbFRlc3QpIHsKKyAgICBjb25zdGV4cHIgdWludDMyX3Qga1dpZHRoID0gMzIwOworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrSGVpZ2h0ID0gMjQwOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBibG9ja1Bvb2wobWFrZUdyYXBoaWNCbG9ja1Bvb2woKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOworICAgIEFTU0VSVF9FUShDMl9PSywgYmxvY2tQb29sLT5mZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIGtXaWR0aCwKKyAgICAgICAgICAgIGtIZWlnaHQsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgsCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZibG9jaykpOworICAgIEFTU0VSVF9UUlVFKGJsb2NrKTsKKworICAgIEMyQWNxdWlyYWJsZTxDMkdyYXBoaWNWaWV3PiBncmFwaGljVmlld0hvbGRlciA9IGJsb2NrLT5tYXAoKTsKKyAgICBDMkdyYXBoaWNWaWV3IGdyYXBoaWNWaWV3ID0gZ3JhcGhpY1ZpZXdIb2xkZXIuZ2V0KCk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBncmFwaGljVmlldy5lcnJvcigpKTsKKyAgICBBU1NFUlRfRVEoa1dpZHRoLCBncmFwaGljVmlldy53aWR0aCgpKTsKKyAgICBBU1NFUlRfRVEoa0hlaWdodCwgZ3JhcGhpY1ZpZXcuaGVpZ2h0KCkpOworCisgICAgdWludDhfdCAqY29uc3QgKmRhdGEgPSBncmFwaGljVmlldy5kYXRhKCk7CisgICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0ID0gZ3JhcGhpY1ZpZXcubGF5b3V0KCk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGRhdGEpOworCisgICAgdWludDhfdCAqeSA9IGRhdGFbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIEMyUGxhbmVJbmZvIHlJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgdWludDhfdCAqdSA9IGRhdGFbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIEMyUGxhbmVJbmZvIHVJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgdWludDhfdCAqdiA9IGRhdGFbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIEMyUGxhbmVJbmZvIHZJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisKKyAgICBmaWxsUGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgfSwgeUluZm8sIHksIDApOworICAgIGZpbGxQbGFuZSh7IGtXaWR0aCwga0hlaWdodCB9LCB1SW5mbywgdSwgMCk7CisgICAgZmlsbFBsYW5lKHsga1dpZHRoLCBrSGVpZ2h0IH0sIHZJbmZvLCB2LCAwKTsKKyAgICBmaWxsUGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHlJbmZvLCB5LCAweDEyKTsKKyAgICBmaWxsUGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHVJbmZvLCB1LCAweDM0KTsKKyAgICBmaWxsUGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHZJbmZvLCB2LCAweDU2KTsKKworICAgIEMyRmVuY2UgZmVuY2U7CisgICAgQzJDb25zdEdyYXBoaWNCbG9jayBjb25zdEJsb2NrID0gYmxvY2stPnNoYXJlKEMyUmVjdChrV2lkdGgsIGtIZWlnaHQpLCBmZW5jZSk7CisgICAgYmxvY2sucmVzZXQoKTsKKworICAgIEMyQWNxdWlyYWJsZTxjb25zdCBDMkdyYXBoaWNWaWV3PiBjb25zdFZpZXdIb2xkZXIgPSBjb25zdEJsb2NrLm1hcCgpOworICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgY29uc3RHcmFwaGljVmlldyA9IGNvbnN0Vmlld0hvbGRlci5nZXQoKTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGNvbnN0R3JhcGhpY1ZpZXcuZXJyb3IoKSk7CisgICAgQVNTRVJUX0VRKGtXaWR0aCwgY29uc3RHcmFwaGljVmlldy53aWR0aCgpKTsKKyAgICBBU1NFUlRfRVEoa0hlaWdodCwgY29uc3RHcmFwaGljVmlldy5oZWlnaHQoKSk7CisKKyAgICBjb25zdCB1aW50OF90ICpjb25zdCAqY29uc3REYXRhID0gY29uc3RHcmFwaGljVmlldy5kYXRhKCk7CisgICAgbGF5b3V0ID0gZ3JhcGhpY1ZpZXcubGF5b3V0KCk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGNvbnN0RGF0YSk7CisKKyAgICBjb25zdCB1aW50OF90ICpjeSA9IGNvbnN0RGF0YVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgeUluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICBjb25zdCB1aW50OF90ICpjdSA9IGNvbnN0RGF0YVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgdUluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICBjb25zdCB1aW50OF90ICpjdiA9IGNvbnN0RGF0YVtDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisgICAgdkluZm8gPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB5SW5mbywgY3ksIDB4MTIpKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgdUluZm8sIGN1LCAweDM0KSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHZJbmZvLCBjdiwgMHg1NikpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoLCBrSGVpZ2h0IC8gNCB9LCB5SW5mbywgY3ksIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCwga0hlaWdodCAvIDQgfSwgdUluZm8sIGN1LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgLyA0IH0sIHZJbmZvLCBjdiwgMCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoIC8gNCwga0hlaWdodCB9LCB5SW5mbywgY3ksIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCAvIDQsIGtIZWlnaHQgfSwgdUluZm8sIGN1LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGggLyA0LCBrSGVpZ2h0IH0sIHZJbmZvLCBjdiwgMCkpOworfQorCitjbGFzcyBCdWZmZXJEYXRhIDogcHVibGljIEMyQnVmZmVyRGF0YSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQnVmZmVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpIDogQzJCdWZmZXJEYXRhKGJsb2Nrcykge30KKyAgICBleHBsaWNpdCBCdWZmZXJEYXRhKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpIDogQzJCdWZmZXJEYXRhKGJsb2Nrcykge30KK307CisKK2NsYXNzIEJ1ZmZlciA6IHB1YmxpYyBDMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQnVmZmVyKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2NrcykgOiBDMkJ1ZmZlcihibG9ja3MpIHt9CisgICAgZXhwbGljaXQgQnVmZmVyKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpIDogQzJCdWZmZXIoYmxvY2tzKSB7fQorfTsKKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgQnVmZmVyRGF0YVRlc3QpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IGxpbmVhckJsb2NrUG9vbChtYWtlTGluZWFyQmxvY2tQb29sKCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gZ3JhcGhpY0Jsb2NrUG9vbChtYWtlR3JhcGhpY0Jsb2NrUG9vbCgpKTsKKworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrV2lkdGgxID0gMzIwOworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrSGVpZ2h0MSA9IDI0MDsKKyAgICBjb25zdGV4cHIgQzJSZWN0IGtDcm9wMShrV2lkdGgxLCBrSGVpZ2h0MSk7CisgICAgY29uc3RleHByIHVpbnQzMl90IGtXaWR0aDIgPSAxNzY7CisgICAgY29uc3RleHByIHVpbnQzMl90IGtIZWlnaHQyID0gMTQ0OworICAgIGNvbnN0ZXhwciBDMlJlY3Qga0Nyb3AyKGtXaWR0aDIsIGtIZWlnaHQyKTsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtDYXBhY2l0eTEgPSAxMDI0dTsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtDYXBhY2l0eTIgPSAyMDQ4dTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBsaW5lYXJCbG9jazE7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGxpbmVhckJsb2NrMjsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGxpbmVhckJsb2NrUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIGtDYXBhY2l0eTEsCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZsaW5lYXJCbG9jazEpKTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGxpbmVhckJsb2NrUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIGtDYXBhY2l0eTIsCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZsaW5lYXJCbG9jazIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGdyYXBoaWNCbG9jazE7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBncmFwaGljQmxvY2syOworICAgIEFTU0VSVF9FUShDMl9PSywgZ3JhcGhpY0Jsb2NrUG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICBrV2lkdGgxLAorICAgICAgICAgICAga0hlaWdodDEsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgsCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZncmFwaGljQmxvY2sxKSk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBncmFwaGljQmxvY2tQb29sLT5mZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIGtXaWR0aDIsCisgICAgICAgICAgICBrSGVpZ2h0MiwKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCwKKyAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgJmdyYXBoaWNCbG9jazIpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlckRhdGE+IGRhdGEobmV3IEJ1ZmZlckRhdGEoeyBsaW5lYXJCbG9jazEtPnNoYXJlKDAsIGtDYXBhY2l0eTEsIEMyRmVuY2UoKSkgfSkpOworICAgIEVYUEVDVF9FUShDMkJ1ZmZlckRhdGE6OkxJTkVBUiwgZGF0YS0+dHlwZSgpKTsKKyAgICBBU1NFUlRfRVEoMXUsIGRhdGEtPmxpbmVhckJsb2NrcygpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKGxpbmVhckJsb2NrMS0+aGFuZGxlKCksIGRhdGEtPmxpbmVhckJsb2NrcygpLmZyb250KCkuaGFuZGxlKCkpOworICAgIEVYUEVDVF9UUlVFKGRhdGEtPmdyYXBoaWNCbG9ja3MoKS5lbXB0eSgpKTsKKworICAgIGRhdGEucmVzZXQobmV3IEJ1ZmZlckRhdGEoeworICAgICAgICBsaW5lYXJCbG9jazEtPnNoYXJlKDAsIGtDYXBhY2l0eTEsIEMyRmVuY2UoKSksCisgICAgICAgIGxpbmVhckJsb2NrMi0+c2hhcmUoMCwga0NhcGFjaXR5MiwgQzJGZW5jZSgpKSwKKyAgICB9KSk7CisgICAgRVhQRUNUX0VRKEMyQnVmZmVyRGF0YTo6TElORUFSX0NIVU5LUywgZGF0YS0+dHlwZSgpKTsKKyAgICBBU1NFUlRfRVEoMnUsIGRhdGEtPmxpbmVhckJsb2NrcygpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKGxpbmVhckJsb2NrMS0+aGFuZGxlKCksIGRhdGEtPmxpbmVhckJsb2NrcygpLmZyb250KCkuaGFuZGxlKCkpOworICAgIEVYUEVDVF9FUShsaW5lYXJCbG9jazItPmhhbmRsZSgpLCBkYXRhLT5saW5lYXJCbG9ja3MoKS5iYWNrKCkuaGFuZGxlKCkpOworICAgIEVYUEVDVF9UUlVFKGRhdGEtPmdyYXBoaWNCbG9ja3MoKS5lbXB0eSgpKTsKKworICAgIGRhdGEucmVzZXQobmV3IEJ1ZmZlckRhdGEoeyBncmFwaGljQmxvY2sxLT5zaGFyZShrQ3JvcDEsIEMyRmVuY2UoKSkgfSkpOworICAgIEVYUEVDVF9FUShDMkJ1ZmZlckRhdGE6OkdSQVBISUMsIGRhdGEtPnR5cGUoKSk7CisgICAgQVNTRVJUX0VRKDF1LCBkYXRhLT5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoZ3JhcGhpY0Jsb2NrMS0+aGFuZGxlKCksIGRhdGEtPmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhLT5saW5lYXJCbG9ja3MoKS5lbXB0eSgpKTsKKworICAgIGRhdGEucmVzZXQobmV3IEJ1ZmZlckRhdGEoeworICAgICAgICBncmFwaGljQmxvY2sxLT5zaGFyZShrQ3JvcDEsIEMyRmVuY2UoKSksCisgICAgICAgIGdyYXBoaWNCbG9jazItPnNoYXJlKGtDcm9wMiwgQzJGZW5jZSgpKSwKKyAgICB9KSk7CisgICAgRVhQRUNUX0VRKEMyQnVmZmVyRGF0YTo6R1JBUEhJQ19DSFVOS1MsIGRhdGEtPnR5cGUoKSk7CisgICAgQVNTRVJUX0VRKDJ1LCBkYXRhLT5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoZ3JhcGhpY0Jsb2NrMS0+aGFuZGxlKCksIGRhdGEtPmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfRVEoZ3JhcGhpY0Jsb2NrMi0+aGFuZGxlKCksIGRhdGEtPmdyYXBoaWNCbG9ja3MoKS5iYWNrKCkuaGFuZGxlKCkpOworICAgIEVYUEVDVF9UUlVFKGRhdGEtPmxpbmVhckJsb2NrcygpLmVtcHR5KCkpOworfQorCit2b2lkIERlc3Ryb3lDYWxsYmFjayhjb25zdCBDMkJ1ZmZlciAqIC8qIGJ1ZiAqLywgdm9pZCAqYXJnKSB7CisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQpPiAqY2IgPSAoc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQpPiAqKWFyZzsKKyAgICAoKmNiKSgpOworfQorCitlbnVtIDogdWludDMyX3QgeworICAgIGtQYXJhbUluZGV4TnVtYmVyMSwKKyAgICBrUGFyYW1JbmRleE51bWJlcjIsCit9OworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkludDMyVmFsdWUsIGtQYXJhbUluZGV4TnVtYmVyMT4gQzJOdW1iZXIxSW5mbzsKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMySW50MzJWYWx1ZSwga1BhcmFtSW5kZXhOdW1iZXIyPiBDMk51bWJlcjJJbmZvOworCitURVNUX0YoQzJCdWZmZXJUZXN0LCBCdWZmZXJUZXN0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBhbGxvYyhtYWtlTGluZWFyQmxvY2tQb29sKCkpOworICAgIGNvbnN0ZXhwciBzaXplX3Qga0NhcGFjaXR5ID0gMTAyNHU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworCisgICAgQVNTRVJUX0VRKEMyX09LLCBhbGxvYy0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIGtDYXBhY2l0eSwKKyAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgJmJsb2NrKSk7CisKKyAgICBzdGQ6OmF0b21pY19ib29sIGRlc3Ryb3llZChmYWxzZSk7CisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQpPiBhcmcgPSBbJmRlc3Ryb3llZF0oKXsgZGVzdHJveWVkID0gdHJ1ZTsgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyKG5ldyBCdWZmZXIoIHsgYmxvY2stPnNoYXJlKDAsIGtDYXBhY2l0eSwgQzJGZW5jZSgpKSB9KSk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBidWZmZXItPnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCZEZXN0cm95Q2FsbGJhY2ssICZhcmcpKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGVzdHJveWVkKTsKKyAgICBBU1NFUlRfRVEoQzJfRFVQTElDQVRFLCBidWZmZXItPnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCZEZXN0cm95Q2FsbGJhY2ssICZhcmcpKTsKKyAgICBidWZmZXIucmVzZXQoKTsKKyAgICBFWFBFQ1RfVFJVRShkZXN0cm95ZWQpOworCisgICAgYnVmZmVyLnJlc2V0KG5ldyBCdWZmZXIoIHsgYmxvY2stPnNoYXJlKDAsIGtDYXBhY2l0eSwgQzJGZW5jZSgpKSB9KSk7CisgICAgZGVzdHJveWVkID0gZmFsc2U7CisgICAgQVNTRVJUX0VRKEMyX09LLCBidWZmZXItPnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCZEZXN0cm95Q2FsbGJhY2ssICZhcmcpKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGVzdHJveWVkKTsKKyAgICBBU1NFUlRfRVEoQzJfTk9UX0ZPVU5ELCBidWZmZXItPnVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoJkRlc3Ryb3lDYWxsYmFjaywgbnVsbHB0cikpOworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCZEZXN0cm95Q2FsbGJhY2ssICZhcmcpKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGVzdHJveWVkKTsKKyAgICBBU1NFUlRfRVEoQzJfTk9UX0ZPVU5ELCBidWZmZXItPnVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoJkRlc3Ryb3lDYWxsYmFjaywgJmFyZykpOworICAgIGJ1ZmZlci5yZXNldCgpOworICAgIEVYUEVDVF9GQUxTRShkZXN0cm95ZWQpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gaW5mbzEobmV3IEMyTnVtYmVyMUluZm8oMSkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IGluZm8yKG5ldyBDMk51bWJlcjJJbmZvKDIpKTsKKyAgICBidWZmZXIucmVzZXQobmV3IEJ1ZmZlciggeyBibG9jay0+c2hhcmUoMCwga0NhcGFjaXR5LCBDMkZlbmNlKCkpIH0pKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmluZm8oKS5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKKworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT5zZXRJbmZvKGluZm8xKSk7CisgICAgRVhQRUNUX0VRKDF1LCBidWZmZXItPmluZm8oKS5zaXplKCkpOworICAgIEVYUEVDVF9FUSgqaW5mbzEsICpidWZmZXItPmluZm8oKS5mcm9udCgpKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmhhc0luZm8oaW5mbzEtPnR5cGUoKSkpOworICAgIEVYUEVDVF9GQUxTRShidWZmZXItPmhhc0luZm8oaW5mbzItPnR5cGUoKSkpOworCisgICAgQVNTRVJUX0VRKEMyX09LLCBidWZmZXItPnNldEluZm8oaW5mbzIpKTsKKyAgICBFWFBFQ1RfRVEoMnUsIGJ1ZmZlci0+aW5mbygpLnNpemUoKSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmhhc0luZm8oaW5mbzItPnR5cGUoKSkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gcmVtb3ZlZCA9IGJ1ZmZlci0+cmVtb3ZlSW5mbyhpbmZvMS0+dHlwZSgpKTsKKyAgICBBU1NFUlRfVFJVRShyZW1vdmVkKTsKKyAgICBFWFBFQ1RfRVEoKnJlbW92ZWQsICppbmZvMSk7CisgICAgRVhQRUNUX0VRKDF1LCBidWZmZXItPmluZm8oKS5zaXplKCkpOworICAgIEVYUEVDVF9FUSgqaW5mbzIsICpidWZmZXItPmluZm8oKS5mcm9udCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmhhc0luZm8oaW5mbzItPnR5cGUoKSkpOworCisgICAgcmVtb3ZlZCA9IGJ1ZmZlci0+cmVtb3ZlSW5mbyhpbmZvMS0+dHlwZSgpKTsKKyAgICBBU1NFUlRfRkFMU0UocmVtb3ZlZCk7CisgICAgRVhQRUNUX0VRKDF1LCBidWZmZXItPmluZm8oKS5zaXplKCkpOworICAgIEVYUEVDVF9GQUxTRShidWZmZXItPmhhc0luZm8oaW5mbzEtPnR5cGUoKSkpOworICAgIEVYUEVDVF9UUlVFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMi0+dHlwZSgpKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiBpbmZvMyhuZXcgQzJOdW1iZXIySW5mbygzKSk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBidWZmZXItPnNldEluZm8oaW5mbzMpKTsKKyAgICBFWFBFQ1RfRVEoMXUsIGJ1ZmZlci0+aW5mbygpLnNpemUoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMS0+dHlwZSgpKSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKKworICAgIHJlbW92ZWQgPSBidWZmZXItPnJlbW92ZUluZm8oaW5mbzItPnR5cGUoKSk7CisgICAgQVNTRVJUX1RSVUUocmVtb3ZlZCk7CisgICAgRVhQRUNUX0VRKCppbmZvMywgKnJlbW92ZWQpOworICAgIEVYUEVDVF9UUlVFKGJ1ZmZlci0+aW5mbygpLmVtcHR5KCkpOworICAgIEVYUEVDVF9GQUxTRShidWZmZXItPmhhc0luZm8oaW5mbzEtPnR5cGUoKSkpOworICAgIEVYUEVDVF9GQUxTRShidWZmZXItPmhhc0luZm8oaW5mbzItPnR5cGUoKSkpOworfQorCitURVNUX0YoQzJCdWZmZXJUZXN0LCBNdWx0aXBsZUxpbmVhck1hcFRlc3QpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHBvb2wobWFrZUxpbmVhckJsb2NrUG9vbCgpKTsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtDYXBhY2l0eSA9IDUyNDI4OHU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkgeworICAgICAgICBzdGQ6OnZlY3RvcjxDMldyaXRlVmlldz4gd1ZpZXdzOworICAgICAgICBzdGQ6OnZlY3RvcjxDMlJlYWRWaWV3PiByVmlld3M7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTY7ICsraikgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICAgICAgQVNTRVJUX0VRKEMyX09LLCBwb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICBrQ2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgICAgICAgICAmYmxvY2spKTsKKyAgICAgICAgICAgIHdWaWV3cy5wdXNoX2JhY2soYmxvY2stPm1hcCgpLmdldCgpKTsKKyAgICAgICAgICAgIEMyQ29uc3RMaW5lYXJCbG9jayBjQmxvY2sgPSBibG9jay0+c2hhcmUoMCwga0NhcGFjaXR5IC8gMiwgQzJGZW5jZSgpKTsKKyAgICAgICAgICAgIHJWaWV3cy5wdXNoX2JhY2soY0Jsb2NrLm1hcCgpLmdldCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi92bmRrL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2YTEwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMDUgQEAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmNvZGVjMl9pbnRlcm5hbCIsCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbnRlcm5hbCIsCisgICAgXSwKKworICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIHdoZW4gdGhpcyBtb2R1bGUgaXMgbW92ZWQgYmFjayB0byBmcmFtZXdvcmtzL2F2LgorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCit9CisKKy8vICEhIURPIE5PVCBERVBFTkQgT04gVEhJUyBTSEFSRUQgTElCUkFSWSBESVJFQ1RMWSEhIQorLy8gdXNlIGxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIGluc3RlYWQKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3ZuZGsiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMkFsbG9jYXRvcklvbi5jcHAiLAorICAgICAgICAiQzJBbGxvY2F0b3JHcmFsbG9jLmNwcCIsCisgICAgICAgICJDMkJ1ZmZlci5jcHAiLAorICAgICAgICAiQzJDb25maWcuY3BwIiwKKyAgICAgICAgIkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5jcHAiLAorICAgICAgICAiQzJTdG9yZS5jcHAiLAorICAgICAgICAicGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAiLAorICAgICAgICAidXRpbC9DMkRlYnVnLmNwcCIsCisgICAgICAgICJ1dGlsL0MySW50ZXJmYWNlSGVscGVyLmNwcCIsCisgICAgICAgICJ1dGlsL0MySW50ZXJmYWNlVXRpbHMuY3BwIiwKKyAgICAgICAgInV0aWwvQzJQYXJhbVV0aWxzLmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImludGVybmFsIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICAgICAgImxpYmNvZGVjMl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYWxsb2NhdG9yQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZGwiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaW9uIiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycXVldWVfaGVscGVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBpbXBsZW1lbnRpbmcgQ29kZWMgMiBjb21wb25lbnRzCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIiwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwgLy8gZm9yIEMyX0xPRworICAgICAgICAibGlibG9nIiwgLy8gZm9yIEFMT0cKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworLy8gcHVibGljIGRlcGVuZGVuY3kgZm9yIGltcGxlbWVudGluZyBDb2RlYyAyIGZyYW1ld29yayB1dGlsaXRpZXMKKy8vIFRISVMgSVMgT05MWSBGT1IgRlJBTUVXT1JLIFVTRSBPTkxZCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMi1pbnRlcm5hbC1kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLCAvLyBmb3IgcHJvcGVydGllcworICAgIF0sCisKKyAgICAvLyBUT0RPOiBzZXBhcmF0ZSBpbnRlcm5hbCBoZWFkZXJzIHNvIHRoZXkgY2FuIGJlIGV4cG9zZWQgaGVyZQorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvckdyYWxsb2MuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JHcmFsbG9jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjk4YmY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JHcmFsbG9jLmNwcApAQCAtMCwwICsxLDg0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJBbGxvY2F0b3JHcmFsbG9jIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9hbGxvY2F0b3IvMi4wL0lBbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL21hcHBlci8yLjAvSU1hcHBlci5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisgICAgZW51bSA6IHVpbnQ2NF90IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzYWdlIG1hc2sgdGhhdCBpcyBwYXNzZWQgdGhyb3VnaCBmcm9tIGdyYWxsb2MgdG8gQ29kZWMgMi4wIHVzYWdlLgorICAgICAgICAgKi8KKyAgICAgICAgUEFTU1RIUk9VR0hfVVNBR0VfTUFTSyA9CisgICAgICAgICAgICB+KEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9NQVNLIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9NQVNLIHwgR1JBTExPQ19VU0FHRV9QUk9URUNURUQpCisgICAgfTsKKworICAgIC8vIHZlcmlmeSB0aGF0IHBhc3N0aHJvdWdoIG1hc2sgaXMgd2l0aGluIHRoZSBwbGF0Zm9ybSBtYXNrCisgICAgc3RhdGljX2Fzc2VydCgofkMyTWVtb3J5VXNhZ2U6OlBMQVRGT1JNX01BU0sgJiBQQVNTVEhST1VHSF9VU0FHRV9NQVNLKSA9PSAwLCAiIik7Cit9CisKK0MyTWVtb3J5VXNhZ2UgQzJBbmRyb2lkTWVtb3J5VXNhZ2U6OkZyb21HcmFsbG9jVXNhZ2UodWludDY0X3QgdXNhZ2UpIHsKKyAgICAvLyBncmFsbG9jIGRvZXMgbm90IHN1cHBvcnQgV1JJVEVfUFJPVEVDVEVECisgICAgcmV0dXJuIEMyTWVtb3J5VXNhZ2UoCisgICAgICAgICAgICAoKHVzYWdlICYgR1JBTExPQ19VU0FHRV9TV19SRUFEX01BU0spID8gQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQgOiAwKSB8CisgICAgICAgICAgICAoKHVzYWdlICYgR1JBTExPQ19VU0FHRV9TV19XUklURV9NQVNLKSA/IEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSA6IDApIHwKKyAgICAgICAgICAgICgodXNhZ2UgJiBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCkgPyBDMk1lbW9yeVVzYWdlOjpSRUFEX1BST1RFQ1RFRCA6IDApIHwKKyAgICAgICAgICAgICh1c2FnZSAmIFBBU1NUSFJPVUdIX1VTQUdFX01BU0spKTsKK30KKwordWludDY0X3QgQzJBbmRyb2lkTWVtb3J5VXNhZ2U6OmFzR3JhbGxvY1VzYWdlKCkgY29uc3QgeworICAgIC8vIGdyYWxsb2MgZG9lcyBub3Qgc3VwcG9ydCBXUklURV9QUk9URUNURUQKKyAgICByZXR1cm4gKCgoZXhwZWN0ZWQgJiBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCkgPyBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gOiAwKSB8CisgICAgICAgICAgICAoKGV4cGVjdGVkICYgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFKSA/IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4gOiAwKSB8CisgICAgICAgICAgICAoKGV4cGVjdGVkICYgQzJNZW1vcnlVc2FnZTo6UkVBRF9QUk9URUNURUQpID8gR1JBTExPQ19VU0FHRV9QUk9URUNURUQgOiAwKSB8CisgICAgICAgICAgICAoZXhwZWN0ZWQgJiBQQVNTVEhST1VHSF9VU0FHRV9NQVNLKSk7Cit9CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjphbGxvY2F0b3I6OlYyXzA6OklBbGxvY2F0b3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpCdWZmZXJVc2FnZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6Om1hcHBlcjo6VjJfMDo6QnVmZmVyRGVzY3JpcHRvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjptYXBwZXI6OlYyXzA6OkVycm9yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6Om1hcHBlcjo6VjJfMDo6SU1hcHBlcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjptYXBwZXI6OlYyXzA6OllDYkNyTGF5b3V0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKKworbmFtZXNwYWNlIHsKKworc3RydWN0IEJ1ZmZlckRlc2NyaXB0b3JJbmZvIHsKKyAgICBJTWFwcGVyOjpCdWZmZXJEZXNjcmlwdG9ySW5mbyBtYXBwZXJJbmZvOworICAgIHVpbnQzMl90IHN0cmlkZTsKK307CisKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBHUkFMTE9DIEFMTE9DQVRJT04gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitzdGF0aWMgYzJfc3RhdHVzX3QgbWFwZXJyMmVycm9yKEVycm9yIG1hcGVycikgeworICAgIHN3aXRjaCAobWFwZXJyKSB7CisgICAgICAgIGNhc2UgRXJyb3I6Ok5PTkU6ICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIGNhc2UgRXJyb3I6OkJBRF9ERVNDUklQVE9SOiByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICBjYXNlIEVycm9yOjpCQURfQlVGRkVSOiAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgY2FzZSBFcnJvcjo6QkFEX1ZBTFVFOiAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIGNhc2UgRXJyb3I6Ok5PX1JFU09VUkNFUzogICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgICAgICBjYXNlIEVycm9yOjpVTlNVUFBPUlRFRDogICAgcmV0dXJuIEMyX0NBTk5PVF9ETzsKKyAgICB9CisgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKK30KKworc3RhdGljCitib29sIG5hdGl2ZV9oYW5kbGVfaXNfaW52YWxpZChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmNvbnN0IGhhbmRsZSkgeworICAgIC8vIHBlcmZvcm0gYmFzaWMgdmFsaWRhdGlvbiBvZiBhIG5hdGl2ZSBoYW5kbGUKKyAgICBpZiAoaGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gbnVsbCBoYW5kbGUgaXMgY29uc2lkZXJlZCB2YWxpZAorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiAoKHNpemVfdCloYW5kbGUtPnZlcnNpb24gIT0gc2l6ZW9mKG5hdGl2ZV9oYW5kbGVfdCkgfHwKKyAgICAgICAgICAgIGhhbmRsZS0+bnVtRmRzIDwgMCB8fAorICAgICAgICAgICAgaGFuZGxlLT5udW1JbnRzIDwgMCB8fAorICAgICAgICAgICAgLy8gZm9yIHNhbml0eSBhc3N1bWUgaGFuZGxlcyBtdXN0IG9jY3VweSBsZXNzIG1lbW9yeSB0aGFuIElOVF9NQVggYnl0ZXMKKyAgICAgICAgICAgIGhhbmRsZS0+bnVtRmRzID4gaW50KChJTlRfTUFYIC0gaGFuZGxlLT52ZXJzaW9uKSAvIHNpemVvZihpbnQpKSAtIGhhbmRsZS0+bnVtSW50cyk7Cit9CisKK2NsYXNzIEMySGFuZGxlR3JhbGxvYyA6IHB1YmxpYyBDMkhhbmRsZSB7Citwcml2YXRlOgorICAgIHN0cnVjdCBFeHRyYURhdGEgeworICAgICAgICB1aW50MzJfdCB3aWR0aDsKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0OworICAgICAgICB1aW50MzJfdCBmb3JtYXQ7CisgICAgICAgIHVpbnQzMl90IHVzYWdlX2xvOworICAgICAgICB1aW50MzJfdCB1c2FnZV9oaTsKKyAgICAgICAgdWludDMyX3Qgc3RyaWRlOworICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICB1aW50MzJfdCBpZ2JwX2lkX2xvOworICAgICAgICB1aW50MzJfdCBpZ2JwX2lkX2hpOworICAgICAgICB1aW50MzJfdCBpZ2JwX3Nsb3Q7CisgICAgICAgIHVpbnQzMl90IG1hZ2ljOworICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgICAgTlVNX0lOVFMgPSBzaXplb2YoRXh0cmFEYXRhKSAvIHNpemVvZihpbnQpLAorICAgIH07CisgICAgY29uc3Qgc3RhdGljIHVpbnQzMl90IE1BR0lDID0gJ1x4YzJnclx4MDAnOworCisgICAgc3RhdGljCisgICAgY29uc3QgRXh0cmFEYXRhKiBnZXRFeHRyYURhdGEoY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSkgeworICAgICAgICBpZiAoaGFuZGxlID09IG51bGxwdHIKKyAgICAgICAgICAgICAgICB8fCBuYXRpdmVfaGFuZGxlX2lzX2ludmFsaWQoaGFuZGxlKQorICAgICAgICAgICAgICAgIHx8IGhhbmRsZS0+bnVtSW50cyA8IE5VTV9JTlRTKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFeHRyYURhdGEqPigKKyAgICAgICAgICAgICAgICAmaGFuZGxlLT5kYXRhW2hhbmRsZS0+bnVtRmRzICsgaGFuZGxlLT5udW1JbnRzIC0gTlVNX0lOVFNdKTsKKyAgICB9CisKKyAgICBzdGF0aWMKKyAgICBFeHRyYURhdGEgKmdldEV4dHJhRGF0YShDMkhhbmRsZSAqY29uc3QgaGFuZGxlKSB7CisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PEV4dHJhRGF0YSAqPihnZXRFeHRyYURhdGEoY29uc3RfY2FzdDxjb25zdCBDMkhhbmRsZSAqY29uc3Q+KGhhbmRsZSkpKTsKKyAgICB9CisKK3B1YmxpYzoKKyAgICB2b2lkIGdldElnYnBEYXRhKHVpbnQzMl90ICpnZW5lcmF0aW9uLCB1aW50NjRfdCAqaWdicF9pZCwgdWludDMyX3QgKmlnYnBfc2xvdCkgY29uc3QgeworICAgICAgICBjb25zdCBFeHRyYURhdGEgKmVkID0gZ2V0RXh0cmFEYXRhKHRoaXMpOworICAgICAgICAqZ2VuZXJhdGlvbiA9IGVkLT5nZW5lcmF0aW9uOworICAgICAgICAqaWdicF9pZCA9IHVuc2lnbmVkKGVkLT5pZ2JwX2lkX2xvKSB8IHVpbnQ2NF90KHVuc2lnbmVkKGVkLT5pZ2JwX2lkX2hpKSkgPDwgMzI7CisgICAgICAgICppZ2JwX3Nsb3QgPSBlZC0+aWdicF9zbG90OworICAgIH0KKworICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgQzJIYW5kbGUgKmNvbnN0IG8pIHsKKyAgICAgICAgaWYgKG8gPT0gbnVsbHB0cikgeyAvLyBudWxsIGhhbmRsZSBpcyBhbHdheXMgdmFsaWQKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqeGQgPSBnZXRFeHRyYURhdGEobyk7CisgICAgICAgIC8vIHdlIGNhbm5vdCB2YWxpZGF0ZSB3aWR0aC9oZWlnaHQvZm9ybWF0L3VzYWdlIHdpdGhvdXQgYWNjZXNzaW5nIGdyYWxsb2MgZHJpdmVyCisgICAgICAgIHJldHVybiB4ZCAhPSBudWxscHRyICYmIHhkLT5tYWdpYyA9PSBNQUdJQzsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJIYW5kbGVHcmFsbG9jKiBXcmFwQW5kTW92ZU5hdGl2ZUhhbmRsZSgKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqY29uc3QgaGFuZGxlLAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSwKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgaWdicF9pZCA9IDAsIHVpbnQzMl90IGlnYnBfc2xvdCA9IDApIHsKKyAgICAgICAgLy9DSEVDSyhoYW5kbGUgIT0gbnVsbHB0cik7CisgICAgICAgIGlmIChuYXRpdmVfaGFuZGxlX2lzX2ludmFsaWQoaGFuZGxlKSB8fAorICAgICAgICAgICAgaGFuZGxlLT5udW1JbnRzID4gaW50KChJTlRfTUFYIC0gaGFuZGxlLT52ZXJzaW9uKSAvIHNpemVvZihpbnQpKSAtIE5VTV9JTlRTIC0gaGFuZGxlLT5udW1GZHMpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIEV4dHJhRGF0YSB4ZCA9IHsKKyAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdWludDMyX3QodXNhZ2UgJiAweEZGRkZGRkZGKSwgdWludDMyX3QodXNhZ2UgPj4gMzIpLAorICAgICAgICAgICAgc3RyaWRlLCBnZW5lcmF0aW9uLCB1aW50MzJfdChpZ2JwX2lkICYgMHhGRkZGRkZGRiksIHVpbnQzMl90KGlnYnBfaWQgPj4gMzIpLAorICAgICAgICAgICAgaWdicF9zbG90LCBNQUdJQworICAgICAgICB9OworICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKnJlcyA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKGhhbmRsZS0+bnVtRmRzLCBoYW5kbGUtPm51bUludHMgKyBOVU1fSU5UUyk7CisgICAgICAgIGlmIChyZXMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbWVtY3B5KCZyZXMtPmRhdGEsICZoYW5kbGUtPmRhdGEsIHNpemVvZihpbnQpICogKGhhbmRsZS0+bnVtRmRzICsgaGFuZGxlLT5udW1JbnRzKSk7CisgICAgICAgICAgICAqZ2V0RXh0cmFEYXRhKHJlcykgPSB4ZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDMkhhbmRsZUdyYWxsb2MgKj4ocmVzKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJIYW5kbGVHcmFsbG9jKiBXcmFwTmF0aXZlSGFuZGxlKAorICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpjb25zdCBoYW5kbGUsCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlLAorICAgICAgICAgICAgdWludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBpZ2JwX2lkID0gMCwgdWludDMyX3QgaWdicF9zbG90ID0gMCkgeworICAgICAgICBpZiAoaGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqY2xvbmUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKGhhbmRsZSk7CisgICAgICAgIGlmIChjbG9uZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBDMkhhbmRsZUdyYWxsb2MgKnJlcyA9IFdyYXBBbmRNb3ZlTmF0aXZlSGFuZGxlKAorICAgICAgICAgICAgICAgIGNsb25lLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCBzdHJpZGUsIGdlbmVyYXRpb24sIGlnYnBfaWQsIGlnYnBfc2xvdCk7CisgICAgICAgIGlmIChyZXMgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShjbG9uZSk7CisgICAgICAgIH0KKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoY2xvbmUpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBuYXRpdmVfaGFuZGxlX3QqIFVud3JhcE5hdGl2ZUhhbmRsZSgKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUpIHsKKyAgICAgICAgY29uc3QgRXh0cmFEYXRhICp4ZCA9IGdldEV4dHJhRGF0YShoYW5kbGUpOworICAgICAgICBpZiAoeGQgPT0gbnVsbHB0ciB8fCB4ZC0+bWFnaWMgIT0gTUFHSUMpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqcmVzID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoaGFuZGxlLT5udW1GZHMsIGhhbmRsZS0+bnVtSW50cyAtIE5VTV9JTlRTKTsKKyAgICAgICAgaWYgKHJlcyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtZW1jcHkoJnJlcy0+ZGF0YSwgJmhhbmRsZS0+ZGF0YSwgc2l6ZW9mKGludCkgKiAocmVzLT5udW1GZHMgKyByZXMtPm51bUludHMpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBuYXRpdmVfaGFuZGxlX3QqIFVud3JhcE5hdGl2ZUhhbmRsZSgKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUsCisgICAgICAgICAgICB1aW50MzJfdCAqZ2VuZXJhdGlvbiwgdWludDY0X3QgKmlnYnBfaWQsIHVpbnQzMl90ICppZ2JwX3Nsb3QpIHsKKyAgICAgICAgY29uc3QgRXh0cmFEYXRhICp4ZCA9IGdldEV4dHJhRGF0YShoYW5kbGUpOworICAgICAgICBpZiAoeGQgPT0gbnVsbHB0ciB8fCB4ZC0+bWFnaWMgIT0gTUFHSUMpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgICpnZW5lcmF0aW9uID0geGQtPmdlbmVyYXRpb247CisgICAgICAgICppZ2JwX2lkID0gdW5zaWduZWQoeGQtPmlnYnBfaWRfbG8pIHwgdWludDY0X3QodW5zaWduZWQoeGQtPmlnYnBfaWRfaGkpKSA8PCAzMjsKKyAgICAgICAgKmlnYnBfc2xvdCA9IHhkLT5pZ2JwX3Nsb3Q7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqcmVzID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoaGFuZGxlLT5udW1GZHMsIGhhbmRsZS0+bnVtSW50cyAtIE5VTV9JTlRTKTsKKyAgICAgICAgaWYgKHJlcyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtZW1jcHkoJnJlcy0+ZGF0YSwgJmhhbmRsZS0+ZGF0YSwgc2l6ZW9mKGludCkgKiAocmVzLT5udW1GZHMgKyByZXMtPm51bUludHMpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBDMkhhbmRsZUdyYWxsb2MqIEltcG9ydCgKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUsCisgICAgICAgICAgICB1aW50MzJfdCAqd2lkdGgsIHVpbnQzMl90ICpoZWlnaHQsIHVpbnQzMl90ICpmb3JtYXQsCisgICAgICAgICAgICB1aW50NjRfdCAqdXNhZ2UsIHVpbnQzMl90ICpzdHJpZGUsCisgICAgICAgICAgICB1aW50MzJfdCAqZ2VuZXJhdGlvbiwgdWludDY0X3QgKmlnYnBfaWQsIHVpbnQzMl90ICppZ2JwX3Nsb3QpIHsKKyAgICAgICAgY29uc3QgRXh0cmFEYXRhICp4ZCA9IGdldEV4dHJhRGF0YShoYW5kbGUpOworICAgICAgICBpZiAoeGQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgKndpZHRoID0geGQtPndpZHRoOworICAgICAgICAqaGVpZ2h0ID0geGQtPmhlaWdodDsKKyAgICAgICAgKmZvcm1hdCA9IHhkLT5mb3JtYXQ7CisgICAgICAgICp1c2FnZSA9IHhkLT51c2FnZV9sbyB8ICh1aW50NjRfdCh4ZC0+dXNhZ2VfaGkpIDw8IDMyKTsKKyAgICAgICAgKnN0cmlkZSA9IHhkLT5zdHJpZGU7CisgICAgICAgICpnZW5lcmF0aW9uID0geGQtPmdlbmVyYXRpb247CisgICAgICAgICppZ2JwX2lkID0geGQtPmlnYnBfaWRfbG8gfCAodWludDY0X3QoeGQtPmlnYnBfaWRfaGkpIDw8IDMyKTsKKyAgICAgICAgKmlnYnBfc2xvdCA9IHhkLT5pZ2JwX3Nsb3Q7CisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEMySGFuZGxlR3JhbGxvYyAqPihoYW5kbGUpOworICAgIH0KK307CisKK25hdGl2ZV9oYW5kbGVfdCAqVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZShjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlKSB7CisgICAgcmV0dXJuIEMySGFuZGxlR3JhbGxvYzo6VW53cmFwTmF0aXZlSGFuZGxlKGhhbmRsZSk7Cit9CisKK25hdGl2ZV9oYW5kbGVfdCAqVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZSgKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgdWludDMyX3QgKmdlbmVyYXRpb24sIHVpbnQ2NF90ICppZ2JwX2lkLCB1aW50MzJfdCAqaWdicF9zbG90KSB7CisgICAgcmV0dXJuIEMySGFuZGxlR3JhbGxvYzo6VW53cmFwTmF0aXZlSGFuZGxlKGhhbmRsZSwgZ2VuZXJhdGlvbiwgaWdicF9pZCwgaWdicF9zbG90KTsKK30KKworQzJIYW5kbGUgKldyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSwgdWludDMyX3Qgc3RyaWRlLAorICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBpZ2JwX2lkLCB1aW50MzJfdCBpZ2JwX3Nsb3QpIHsKKyAgICByZXR1cm4gQzJIYW5kbGVHcmFsbG9jOjpXcmFwTmF0aXZlSGFuZGxlKGhhbmRsZSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbiwgaWdicF9pZCwgaWdicF9zbG90KTsKK30KKworY2xhc3MgQzJBbGxvY2F0aW9uR3JhbGxvYyA6IHB1YmxpYyBDMkdyYXBoaWNBbGxvY2F0aW9uIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRpb25HcmFsbG9jKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG1hcCgKKyAgICAgICAgICAgIEMyUmVjdCByZWN0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlICpmZW5jZSwKKyAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0ICpsYXlvdXQgLyogbm9ubnVsbCAqLywgdWludDhfdCAqKmFkZHIgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCB1bm1hcCgKKyAgICAgICAgICAgIHVpbnQ4X3QgKiphZGRyIC8qIG5vbm51bGwgKi8sIEMyUmVjdCByZWN0LCBDMkZlbmNlICpmZW5jZSAvKiBudWxsYWJsZSAqLykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1BbGxvY2F0b3JJZDsgfQorICAgIHZpcnR1YWwgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1Mb2NrZWRIYW5kbGUgPyA6IG1IYW5kbGU7IH0KKyAgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNBbGxvY2F0aW9uPiAmb3RoZXIpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gaW50ZXJuYWwgbWV0aG9kcworICAgIC8vIHxoYW5kbGV8IHdpbGwgYmUgbW92ZWQuCisgICAgQzJBbGxvY2F0aW9uR3JhbGxvYygKKyAgICAgICAgICAgICAgY29uc3QgQnVmZmVyRGVzY3JpcHRvckluZm8gJmluZm8sCisgICAgICAgICAgICAgIGNvbnN0IHNwPElNYXBwZXI+ICZtYXBwZXIsCisgICAgICAgICAgICAgIGhpZGxfaGFuZGxlICZoaWRsSGFuZGxlLAorICAgICAgICAgICAgICBjb25zdCBDMkhhbmRsZUdyYWxsb2MgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3QgYWxsb2NhdG9ySWQpOworICAgIGludCBkdXAoKSBjb25zdDsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBjb25zdCBCdWZmZXJEZXNjcmlwdG9ySW5mbyBtSW5mbzsKKyAgICBjb25zdCBzcDxJTWFwcGVyPiBtTWFwcGVyOworICAgIGNvbnN0IGhpZGxfaGFuZGxlIG1IaWRsSGFuZGxlOworICAgIGNvbnN0IEMySGFuZGxlR3JhbGxvYyAqbUhhbmRsZTsKKyAgICBidWZmZXJfaGFuZGxlX3QgbUJ1ZmZlcjsKKyAgICBjb25zdCBDMkhhbmRsZUdyYWxsb2MgKm1Mb2NrZWRIYW5kbGU7CisgICAgYm9vbCBtTG9ja2VkOworICAgIEMyQWxsb2NhdG9yOjppZF90IG1BbGxvY2F0b3JJZDsKKyAgICBzdGQ6Om11dGV4IG1NYXBwZWRMb2NrOworfTsKKworQzJBbGxvY2F0aW9uR3JhbGxvYzo6QzJBbGxvY2F0aW9uR3JhbGxvYygKKyAgICAgICAgICBjb25zdCBCdWZmZXJEZXNjcmlwdG9ySW5mbyAmaW5mbywKKyAgICAgICAgICBjb25zdCBzcDxJTWFwcGVyPiAmbWFwcGVyLAorICAgICAgICAgIGhpZGxfaGFuZGxlICZoaWRsSGFuZGxlLAorICAgICAgICAgIGNvbnN0IEMySGFuZGxlR3JhbGxvYyAqY29uc3QgaGFuZGxlLAorICAgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkKQorICAgIDogQzJHcmFwaGljQWxsb2NhdGlvbihpbmZvLm1hcHBlckluZm8ud2lkdGgsIGluZm8ubWFwcGVySW5mby5oZWlnaHQpLAorICAgICAgbUluZm8oaW5mbyksCisgICAgICBtTWFwcGVyKG1hcHBlciksCisgICAgICBtSGlkbEhhbmRsZShzdGQ6Om1vdmUoaGlkbEhhbmRsZSkpLAorICAgICAgbUhhbmRsZShoYW5kbGUpLAorICAgICAgbUJ1ZmZlcihudWxscHRyKSwKKyAgICAgIG1Mb2NrZWRIYW5kbGUobnVsbHB0ciksCisgICAgICBtTG9ja2VkKGZhbHNlKSwKKyAgICAgIG1BbGxvY2F0b3JJZChhbGxvY2F0b3JJZCkgeworfQorCitDMkFsbG9jYXRpb25HcmFsbG9jOjp+QzJBbGxvY2F0aW9uR3JhbGxvYygpIHsKKyAgICBpZiAobUJ1ZmZlciAmJiBtTG9ja2VkKSB7CisgICAgICAgIC8vIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgYWRkcmVzc3MgYW5kIHJlY3QKKyAgICAgICAgdWludDhfdCogYWRkcltDMlBsYW5hckxheW91dDo6TUFYX05VTV9QTEFORVNdID0ge307CisgICAgICAgIHVubWFwKGFkZHIsIEMyUmVjdCgpLCBudWxscHRyKTsKKyAgICB9CisgICAgaWYgKG1CdWZmZXIpIHsKKyAgICAgICAgbU1hcHBlci0+ZnJlZUJ1ZmZlcihjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSk7CisgICAgfQorICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKAorICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbmF0aXZlX2hhbmRsZV90ICo+KG1IYW5kbGUpKSk7CisgICAgfQorICAgIGlmIChtTG9ja2VkSGFuZGxlKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKAorICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KAorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBuYXRpdmVfaGFuZGxlX3QgKj4obUxvY2tlZEhhbmRsZSkpKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdGlvbkdyYWxsb2M6Om1hcCgKKyAgICAgICAgQzJSZWN0IHJlY3QsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlLAorICAgICAgICBDMlBsYW5hckxheW91dCAqbGF5b3V0IC8qIG5vbm51bGwgKi8sIHVpbnQ4X3QgKiphZGRyIC8qIG5vbm51bGwgKi8pIHsKKyAgICB1aW50NjRfdCBncmFsbG9jVXNhZ2UgPSBzdGF0aWNfY2FzdDxDMkFuZHJvaWRNZW1vcnlVc2FnZT4odXNhZ2UpLmFzR3JhbGxvY1VzYWdlKCk7CisgICAgQUxPR1YoIm1hcHBpbmcgYnVmZmVyIHdpdGggdXNhZ2UgJSNsbHggPT4gJSNsbHgiLAorICAgICAgICAgIChsb25nIGxvbmcpdXNhZ2UuZXhwZWN0ZWQsIChsb25nIGxvbmcpZ3JhbGxvY1VzYWdlKTsKKworICAgIC8vIFRPRE8KKyAgICAodm9pZCkgZmVuY2U7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWFwcGVkTG9jayk7CisgICAgaWYgKG1CdWZmZXIgJiYgbUxvY2tlZCkgeworICAgICAgICBBTE9HRCgiYWxyZWFkeSBtYXBwZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX0RVUExJQ0FURTsKKyAgICB9CisgICAgaWYgKCFsYXlvdXQgfHwgIWFkZHIpIHsKKyAgICAgICAgQUxPR0QoIndyb25nIHBhcmFtIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgaWYgKCFtQnVmZmVyKSB7CisgICAgICAgIG1NYXBwZXItPmltcG9ydEJ1ZmZlcigKKyAgICAgICAgICAgICAgICBtSGlkbEhhbmRsZSwgWyZlcnIsIHRoaXNdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1hcGVycjJlcnJvcihtYXBlcnIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gc3RhdGljX2Nhc3Q8YnVmZmVyX2hhbmRsZV90PihidWZmZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJpbXBvcnRCdWZmZXIgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGlmIChtQnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJpbXBvcnRCdWZmZXIgcmV0dXJuZWQgbnVsbCBidWZmZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiA9IDA7CisgICAgICAgIHVpbnQ2NF90IGlnYnBfaWQgPSAwOworICAgICAgICB1aW50MzJfdCBpZ2JwX3Nsb3QgPSAwOworICAgICAgICBpZiAobUhhbmRsZSkgeworICAgICAgICAgICAgbUhhbmRsZS0+Z2V0SWdicERhdGEoJmdlbmVyYXRpb24sICZpZ2JwX2lkLCAmaWdicF9zbG90KTsKKyAgICAgICAgfQorICAgICAgICBtTG9ja2VkSGFuZGxlID0gQzJIYW5kbGVHcmFsbG9jOjpXcmFwQW5kTW92ZU5hdGl2ZUhhbmRsZSgKKyAgICAgICAgICAgICAgICBtQnVmZmVyLCBtSW5mby5tYXBwZXJJbmZvLndpZHRoLCBtSW5mby5tYXBwZXJJbmZvLmhlaWdodCwKKyAgICAgICAgICAgICAgICAodWludDMyX3QpbUluZm8ubWFwcGVySW5mby5mb3JtYXQsIG1JbmZvLm1hcHBlckluZm8udXNhZ2UsIG1JbmZvLnN0cmlkZSwKKyAgICAgICAgICAgICAgICBnZW5lcmF0aW9uLCBpZ2JwX2lkLCBpZ2JwX3Nsb3QpOworICAgIH0KKworICAgIHN3aXRjaCAobUluZm8ubWFwcGVySW5mby5mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBQaXhlbEZvcm1hdDo6UkdCQV8xMDEwMTAyOiB7CisgICAgICAgICAgICAvLyBUUklDS1k6IHRoaXMgaXMgdXNlZCBmb3IgbWVkaWEgYXMgWVVWNDQ0IGluIHRoZSBjYXNlIHdoZW4gaXQgaXMgcXVldWVkIGRpcmVjdGx5IHRvIGEKKyAgICAgICAgICAgIC8vIFN1cmZhY2UuIEluIGFsbCBvdGhlciBjYXNlcyBpdCBpcyBSR0JBLiBXZSBkb24ndCBrbm93IHdoaWNoIGNhc2UgaXQgaXMgaGVyZSwgc28KKyAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gWVVWIGZvciBub3cuCisgICAgICAgICAgICB2b2lkICpwb2ludGVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1NYXBwZXItPmxvY2soCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KG1CdWZmZXIpLAorICAgICAgICAgICAgICAgICAgICBncmFsbG9jVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgIHsgKGludDMyX3QpcmVjdC5sZWZ0LCAoaW50MzJfdClyZWN0LnRvcCwgKGludDMyX3QpcmVjdC53aWR0aCwgKGludDMyX3QpcmVjdC5oZWlnaHQgfSwKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICAgICAgaGlkbF9oYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgWyZlcnIsICZwb2ludGVyXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJm1hcFBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1hcGVycjJlcnJvcihtYXBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgPSBtYXBQb2ludGVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgibG9jayBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gdHJlYXQgYXMgMzItYml0IHZhbHVlcworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfWV0gPSAodWludDhfdCAqKXBvaW50ZXI7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSA9ICh1aW50OF90ICopcG9pbnRlcjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdID0gKHVpbnQ4X3QgKilwb2ludGVyOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfQV0gPSAodWludDhfdCAqKXBvaW50ZXI7CisgICAgICAgICAgICBsYXlvdXQtPnR5cGUgPSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVZBOworICAgICAgICAgICAgbGF5b3V0LT5udW1QbGFuZXMgPSA0OworICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9ZLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkxJVFRMRV9FTkQsICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ksICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DQiwgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICA0ICogKGludDMyX3QpbUluZm8uc3RyaWRlLCAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpMSVRUTEVfRU5ELCAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQ1IsICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgNCAqIChpbnQzMl90KW1JbmZvLnN0cmlkZSwgICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAyMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TElUVExFX0VORCwgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0FdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0EsICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgNCAqIChpbnQzMl90KW1JbmZvLnN0cmlkZSwgICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAzMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TElUVExFX0VORCwgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFBpeGVsRm9ybWF0OjpSR0JBXzg4ODg6CisgICAgICAgICAgICAvLyBUT0RPOiBhbHBoYSBjaGFubmVsCisgICAgICAgICAgICAvLyBmYWxsLXRocm91Z2gKKyAgICAgICAgY2FzZSBQaXhlbEZvcm1hdDo6UkdCWF84ODg4OiB7CisgICAgICAgICAgICB2b2lkICpwb2ludGVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1NYXBwZXItPmxvY2soCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KG1CdWZmZXIpLAorICAgICAgICAgICAgICAgICAgICBncmFsbG9jVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgIHsgKGludDMyX3QpcmVjdC5sZWZ0LCAoaW50MzJfdClyZWN0LnRvcCwgKGludDMyX3QpcmVjdC53aWR0aCwgKGludDMyX3QpcmVjdC5oZWlnaHQgfSwKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICAgICAgaGlkbF9oYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgWyZlcnIsICZwb2ludGVyXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJm1hcFBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1hcGVycjJlcnJvcihtYXBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgPSBtYXBQb2ludGVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgibG9jayBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfUl0gPSAodWludDhfdCAqKXBvaW50ZXI7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9HXSA9ICh1aW50OF90ICopcG9pbnRlciArIDE7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9CXSA9ICh1aW50OF90ICopcG9pbnRlciArIDI7CisgICAgICAgICAgICBsYXlvdXQtPnR5cGUgPSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0I7CisgICAgICAgICAgICBsYXlvdXQtPm51bVBsYW5lcyA9IDM7CisgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAxOworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1JdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX1IsICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgNCAqIChpbnQzMl90KW1JbmZvLnN0cmlkZSwgICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfUiwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0ddID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0csICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgNCAqIChpbnQzMl90KW1JbmZvLnN0cmlkZSwgICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfUiwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0JdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0IsICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgNCAqIChpbnQzMl90KW1JbmZvLnN0cmlkZSwgICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfUiwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFBpeGVsRm9ybWF0OjpZQ0JDUl80MjBfODg4OgorICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoCisgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQ6OllWMTI6CisgICAgICAgICAgICAvLyBmYWxsLXRocm91Z2gKKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgWUNiQ3JMYXlvdXQgeWNiY3JMYXlvdXQ7CisgICAgICAgICAgICBtTWFwcGVyLT5sb2NrWUNiQ3IoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KG1CdWZmZXIpLCBncmFsbG9jVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgIHsgKGludDMyX3QpcmVjdC5sZWZ0LCAoaW50MzJfdClyZWN0LnRvcCwgKGludDMyX3QpcmVjdC53aWR0aCwgKGludDMyX3QpcmVjdC5oZWlnaHQgfSwKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICAgICAgaGlkbF9oYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgWyZlcnIsICZ5Y2JjckxheW91dF0oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZtYXBMYXlvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1hcGVycjJlcnJvcihtYXBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHljYmNyTGF5b3V0ID0gbWFwTGF5b3V0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgibG9ja1lDYkNyIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSA9ICh1aW50OF90ICopeWNiY3JMYXlvdXQueTsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdID0gKHVpbnQ4X3QgKil5Y2JjckxheW91dC5jYjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdID0gKHVpbnQ4X3QgKil5Y2JjckxheW91dC5jcjsKKyAgICAgICAgICAgIGxheW91dC0+dHlwZSA9IEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVjsKKyAgICAgICAgICAgIGxheW91dC0+bnVtUGxhbmVzID0gMzsKKyAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDM7CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfWSwgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICAoaW50MzJfdCl5Y2JjckxheW91dC55U3RyaWRlLCAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IsICAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAoaW50MzJfdCl5Y2JjckxheW91dC5jaHJvbWFTdGVwLCAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgKGludDMyX3QpeWNiY3JMYXlvdXQuY1N0cmlkZSwgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9VLCAgICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NSLCAgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgKGludDMyX3QpeWNiY3JMYXlvdXQuY2hyb21hU3RlcCwgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIChpbnQzMl90KXljYmNyTGF5b3V0LmNTdHJpZGUsICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfViwgICAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIC8vIGhhbmRsZSBpbnRlcmxlYXZlZCBmb3JtYXRzCisgICAgICAgICAgICBpbnRwdHJfdCB1dk9mZnNldCA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdIC0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgICAgICBpZiAodXZPZmZzZXQgPiAwICYmIHV2T2Zmc2V0IDwgKGludHB0cl90KXljYmNyTGF5b3V0LmNocm9tYVN0ZXApIHsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAyOworICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXS5yb290SXggPSBDMlBsYW5hckxheW91dDo6UExBTkVfVTsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ub2Zmc2V0ID0gdXZPZmZzZXQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHV2T2Zmc2V0IDwgMCAmJiB1dk9mZnNldCA+IC0oaW50cHRyX3QpeWNiY3JMYXlvdXQuY2hyb21hU3RlcCkgeworICAgICAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDI7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvb3RJeCA9IEMyUGxhbmFyTGF5b3V0OjpQTEFORV9WOworICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5vZmZzZXQgPSAtdXZPZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBtTG9ja2VkID0gdHJ1ZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0aW9uR3JhbGxvYzo6dW5tYXAoCisgICAgICAgIHVpbnQ4X3QgKiphZGRyLCBDMlJlY3QgcmVjdCwgQzJGZW5jZSAqZmVuY2UgLyogbnVsbGFibGUgKi8pIHsKKyAgICAvLyBUT0RPOiBjaGVjayBhZGRyIGFuZCBzaXplLCB1c2UgZmVuY2UKKyAgICAodm9pZClhZGRyOworICAgICh2b2lkKXJlY3Q7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWFwcGVkTG9jayk7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgbU1hcHBlci0+dW5sb2NrKAorICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4obUJ1ZmZlciksCisgICAgICAgICAgICBbJmVyciwgJmZlbmNlXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJnJlbGVhc2VGZW5jZSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICAodm9pZCkgZmVuY2U7CisgICAgICAgICAgICAgICAgKHZvaWQpIHJlbGVhc2VGZW5jZTsKKyAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICBtTG9ja2VkID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK2Jvb2wgQzJBbGxvY2F0aW9uR3JhbGxvYzo6ZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNBbGxvY2F0aW9uPiAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gb3RoZXIgJiYgb3RoZXItPmhhbmRsZSgpID09IGhhbmRsZSgpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEdSQUxMT0MgQUxMT0NBVE9SID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworY2xhc3MgQzJBbGxvY2F0b3JHcmFsbG9jOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBJbXBsKGlkX3QgaWQsIGJvb2wgYnVmZmVyUXVldWUpOworCisgICAgaWRfdCBnZXRJZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UcmFpdHMtPmlkOworICAgIH0KKworICAgIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHJhaXRzLT5uYW1lOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkFsbG9jYXRvcjo6VHJhaXRzPiBnZXRUcmFpdHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHJhaXRzOworICAgIH0KKworICAgIGMyX3N0YXR1c190IG5ld0dyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCBjb25zdCBDMk1lbW9yeVVzYWdlICZ1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbik7CisKKyAgICBjMl9zdGF0dXNfdCBwcmlvckdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbik7CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBtSW5pdDsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcjo6VHJhaXRzPiBtVHJhaXRzOworICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIHNwPElBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgICAgc3A8SU1hcHBlcj4gbU1hcHBlcjsKKyAgICBjb25zdCBib29sIG1CdWZmZXJRdWV1ZTsKK307CisKK3ZvaWQgX1Vud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NNZXRhZGF0YSgKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LCB1aW50MzJfdCAqZm9ybWF0LHVpbnQ2NF90ICp1c2FnZSwgdWludDMyX3QgKnN0cmlkZSwKKyAgICAgICAgdWludDMyX3QgKmdlbmVyYXRpb24sIHVpbnQ2NF90ICppZ2JwX2lkLCB1aW50MzJfdCAqaWdicF9zbG90KSB7CisgICAgKHZvaWQpQzJIYW5kbGVHcmFsbG9jOjpJbXBvcnQoaGFuZGxlLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbiwgaWdicF9pZCwgaWdicF9zbG90KTsKK30KKworQzJBbGxvY2F0b3JHcmFsbG9jOjpJbXBsOjpJbXBsKGlkX3QgaWQsIGJvb2wgYnVmZmVyUXVldWUpCisgICAgOiBtSW5pdChDMl9PSyksIG1CdWZmZXJRdWV1ZShidWZmZXJRdWV1ZSkgeworICAgIC8vIFRPRE86IGdldCB0aGlzIGZyb20gYWxsb2NhdG9yCisgICAgQzJNZW1vcnlVc2FnZSBtaW5Vc2FnZSA9IHsgMCwgMCB9LCBtYXhVc2FnZSA9IHsgfih1aW50NjRfdCkwLCB+KHVpbnQ2NF90KTAgfTsKKyAgICBUcmFpdHMgdHJhaXRzID0geyAiYW5kcm9pZC5hbGxvY2F0b3IuZ3JhbGxvYyIsIGlkLCBDMkFsbG9jYXRvcjo6R1JBUEhJQywgbWluVXNhZ2UsIG1heFVzYWdlIH07CisgICAgbVRyYWl0cyA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0b3I6OlRyYWl0cz4odHJhaXRzKTsKKworICAgIC8vIGdyYWxsb2MgYWxsb2NhdG9yIGlzIGEgc2luZ2xldG9uLCBzbyBhbGwgb2JqZWN0cyBzaGFyZSBhIGdsb2JhbCBzZXJ2aWNlCisgICAgbUFsbG9jYXRvciA9IElBbGxvY2F0b3I6OmdldFNlcnZpY2UoKTsKKyAgICBtTWFwcGVyID0gSU1hcHBlcjo6Z2V0U2VydmljZSgpOworICAgIGlmIChtQWxsb2NhdG9yID09IG51bGxwdHIgfHwgbU1hcHBlciA9PSBudWxscHRyKSB7CisgICAgICAgIG1Jbml0ID0gQzJfQ09SUlVQVEVEOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JHcmFsbG9jOjpJbXBsOjpuZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCBjb25zdCBDMk1lbW9yeVVzYWdlICZ1c2FnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKSB7CisgICAgdWludDY0X3QgZ3JhbGxvY1VzYWdlID0gc3RhdGljX2Nhc3Q8QzJBbmRyb2lkTWVtb3J5VXNhZ2U+KHVzYWdlKS5hc0dyYWxsb2NVc2FnZSgpOworICAgIEFMT0dWKCJhbGxvY2F0aW5nIGJ1ZmZlciB3aXRoIHVzYWdlICUjbGx4ID0+ICUjbGx4IiwKKyAgICAgICAgICAobG9uZyBsb25nKXVzYWdlLmV4cGVjdGVkLCAobG9uZyBsb25nKWdyYWxsb2NVc2FnZSk7CisKKyAgICBCdWZmZXJEZXNjcmlwdG9ySW5mbyBpbmZvID0geworICAgICAgICB7CisgICAgICAgICAgICB3aWR0aCwKKyAgICAgICAgICAgIGhlaWdodCwKKyAgICAgICAgICAgIDF1LCAgLy8gbGF5ZXJDb3VudAorICAgICAgICAgICAgKFBpeGVsRm9ybWF0KWZvcm1hdCwKKyAgICAgICAgICAgIGdyYWxsb2NVc2FnZSwKKyAgICAgICAgfSwKKyAgICAgICAgMHUsICAvLyBzdHJpZGUgcGxhY2Vob2xkZXIKKyAgICB9OworICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgIEJ1ZmZlckRlc2NyaXB0b3IgZGVzYzsKKyAgICBtTWFwcGVyLT5jcmVhdGVEZXNjcmlwdG9yKAorICAgICAgICAgICAgaW5mby5tYXBwZXJJbmZvLCBbJmVyciwgJmRlc2NdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmZGVzY3JpcHRvcikgeworICAgICAgICAgICAgICAgIGVyciA9IG1hcGVycjJlcnJvcihtYXBlcnIpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzYyA9IGRlc2NyaXB0b3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8vIElBbGxvY2F0b3Igc2hhcmVzIElNYXBwZXIgZXJyb3IgY29kZXMuCisgICAgaGlkbF9oYW5kbGUgYnVmZmVyOworICAgIG1BbGxvY2F0b3ItPmFsbG9jYXRlKAorICAgICAgICAgICAgZGVzYywKKyAgICAgICAgICAgIDF1LAorICAgICAgICAgICAgWyZlcnIsICZidWZmZXIsICZpbmZvXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJnN0cmlkZSwgYXV0byAmYnVmZmVycykgeworICAgICAgICAgICAgICAgIGVyciA9IG1hcGVycjJlcnJvcihtYXBlcnIpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVycy5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZm8uc3RyaWRlID0gc3RyaWRlOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlcnNbMF07CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisKKyAgICBhbGxvY2F0aW9uLT5yZXNldChuZXcgQzJBbGxvY2F0aW9uR3JhbGxvYygKKyAgICAgICAgICAgIGluZm8sIG1NYXBwZXIsIGJ1ZmZlciwKKyAgICAgICAgICAgIEMySGFuZGxlR3JhbGxvYzo6V3JhcEFuZE1vdmVOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5nZXROYXRpdmVIYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgaW5mby5tYXBwZXJJbmZvLndpZHRoLCBpbmZvLm1hcHBlckluZm8uaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpaW5mby5tYXBwZXJJbmZvLmZvcm1hdCwgaW5mby5tYXBwZXJJbmZvLnVzYWdlLCBpbmZvLnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgMCwgMCwgbUJ1ZmZlclF1ZXVlID8gfjAgOiAwKSwKKyAgICAgICAgICAgIG1UcmFpdHMtPmlkKSk7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvckdyYWxsb2M6OkltcGw6OnByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgeworICAgIEJ1ZmZlckRlc2NyaXB0b3JJbmZvIGluZm87CisgICAgaW5mby5tYXBwZXJJbmZvLmxheWVyQ291bnQgPSAxdTsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgIHVpbnQ2NF90IGlnYnBfaWQ7CisgICAgdWludDMyX3QgaWdicF9zbG90OworICAgIGNvbnN0IEMySGFuZGxlR3JhbGxvYyAqZ3JhbGxvY0hhbmRsZSA9IEMySGFuZGxlR3JhbGxvYzo6SW1wb3J0KAorICAgICAgICAgICAgaGFuZGxlLAorICAgICAgICAgICAgJmluZm8ubWFwcGVySW5mby53aWR0aCwgJmluZm8ubWFwcGVySW5mby5oZWlnaHQsCisgICAgICAgICAgICAodWludDMyX3QgKikmaW5mby5tYXBwZXJJbmZvLmZvcm1hdCwgKHVpbnQ2NF90ICopJmluZm8ubWFwcGVySW5mby51c2FnZSwgJmluZm8uc3RyaWRlLAorICAgICAgICAgICAgJmdlbmVyYXRpb24sICZpZ2JwX2lkLCAmaWdicF9zbG90KTsKKyAgICBpZiAoZ3JhbGxvY0hhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgaGlkbF9oYW5kbGUgaGlkbEhhbmRsZTsKKyAgICBoaWRsSGFuZGxlLnNldFRvKEMySGFuZGxlR3JhbGxvYzo6VW53cmFwTmF0aXZlSGFuZGxlKGdyYWxsb2NIYW5kbGUpLCB0cnVlKTsKKworICAgIGFsbG9jYXRpb24tPnJlc2V0KG5ldyBDMkFsbG9jYXRpb25HcmFsbG9jKGluZm8sIG1NYXBwZXIsIGhpZGxIYW5kbGUsIGdyYWxsb2NIYW5kbGUsIG1UcmFpdHMtPmlkKSk7CisgICAgcmV0dXJuIEMyX09LOworfQorCitDMkFsbG9jYXRvckdyYWxsb2M6OkMyQWxsb2NhdG9yR3JhbGxvYyhpZF90IGlkLCBib29sIGJ1ZmZlclF1ZXVlKQorICAgICAgICA6IG1JbXBsKG5ldyBJbXBsKGlkLCBidWZmZXJRdWV1ZSkpIHt9CisKK0MyQWxsb2NhdG9yR3JhbGxvYzo6fkMyQWxsb2NhdG9yR3JhbGxvYygpIHsgZGVsZXRlIG1JbXBsOyB9CisKK0MyQWxsb2NhdG9yOjppZF90IEMyQWxsb2NhdG9yR3JhbGxvYzo6Z2V0SWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRJZCgpOworfQorCitDMlN0cmluZyBDMkFsbG9jYXRvckdyYWxsb2M6OmdldE5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXROYW1lKCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkFsbG9jYXRvcjo6VHJhaXRzPiBDMkFsbG9jYXRvckdyYWxsb2M6OmdldFRyYWl0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldFRyYWl0cygpOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvckdyYWxsb2M6Om5ld0dyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgeworICAgIHJldHVybiBtSW1wbC0+bmV3R3JhcGhpY0FsbG9jYXRpb24od2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgYWxsb2NhdGlvbik7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9yR3JhbGxvYzo6cHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKSB7CisgICAgcmV0dXJuIG1JbXBsLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGhhbmRsZSwgYWxsb2NhdGlvbik7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9yR3JhbGxvYzo6c3RhdHVzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+c3RhdHVzKCk7Cit9CisKK2Jvb2wgQzJBbGxvY2F0b3JHcmFsbG9jOjppc1ZhbGlkKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSB7CisgICAgcmV0dXJuIEMySGFuZGxlR3JhbGxvYzo6aXNWYWxpZChvKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JJb24uY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JJb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMjE1M2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvcklvbi5jcHAKQEAgLTAsMCArMSw2MzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyQWxsb2NhdG9ySW9uIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgPGlvbi9pb24uaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPiAvLyBnZXRwYWdlc2l6ZSwgc2l6ZV90LCBjbG9zZSwgZHVwCisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyRXJybm9VdGlscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisgICAgY29uc3RleHByIHNpemVfdCBVU0FHRV9MUlVfQ0FDSEVfU0laRSA9IDEwMjQ7Cit9CisKKy8qIHNpemVfdCA8PT4gaW50KGxvKSwgaW50KGhpKSBjb252ZXJzaW9ucyAqLworY29uc3RleHByIGlubGluZSBpbnQgc2l6ZTJpbnRMbyhzaXplX3QgcykgeworICAgIHJldHVybiBpbnQocyAmIDB4RkZGRkZGRkYpOworfQorCitjb25zdGV4cHIgaW5saW5lIGludCBzaXplMmludEhpKHNpemVfdCBzKSB7CisgICAgLy8gY2FzdCB0byB1aW50NjRfdCBhcyBzaXplX3QgbWF5IGJlIDMyIGJpdHMgd2lkZQorICAgIHJldHVybiBpbnQoKHVpbnQ2NF90KHMpID4+IDMyKSAmIDB4RkZGRkZGRkYpOworfQorCitjb25zdGV4cHIgaW5saW5lIHNpemVfdCBpbnRzMnNpemUoaW50IGludExvLCBpbnQgaW50SGkpIHsKKyAgICAvLyBjb252ZXJ0IGluIDIgc3RhZ2VzIHRvIDY0IGJpdHMgYXMgaW50SGkgbWF5IGJlIG5lZ2F0aXZlCisgICAgcmV0dXJuIHNpemVfdCh1bnNpZ25lZChpbnRMbykpIHwgc2l6ZV90KHVpbnQ2NF90KHVuc2lnbmVkKGludEhpKSkgPDwgMzIpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJT04gSEFORExFID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qKgorICogSU9OIGhhbmRsZQorICoKKyAqIFRoZXJlIGNhbiBiZSBvbmx5IGEgc29sZSBpb24gY2xpZW50IHBlciBwcm9jZXNzLCB0aGlzIGlzIGNhcHR1cmVkIGluIHRoZSBpb24gZmQgdGhhdCBpcyBwYXNzZWQKKyAqIHRvIHRoZSBjb25zdHJ1Y3RvciwgYnV0IHRoaXMgc2hvdWxkIGJlIG1hbmFnZWQgYnkgdGhlIGlvbiBidWZmZXIgYWxsb2NhdG9yL21hcHBlci4KKyAqCisgKiBpb24gdXNlcyBpb25fdXNlcl9oYW5kbGVfdCBmb3IgYnVmZmVycy4gV2UgZG9uJ3Qgc3RvcmUgdGhpcyBpbiB0aGUgbmF0aXZlIGhhbmRsZSBhcworICogaXQgcmVxdWlyZXMgYW4gaW9uX2ZyZWUgdG8gZGVjcmVmLiBJbnN0ZWFkLCB3ZSBzaGFyZSB0aGUgYnVmZmVyIHRvIGdldCBhbiBmZCB0aGF0IGFsc28gaG9sZHMKKyAqIGEgcmVmY291bnQuCisgKgorICogVGhpcyBoYW5kbGUgd2lsbCBub3QgY2FwdHVyZSBtYXBwZWQgZmQtcyBhcyB1cGRhdGluZyB0aGF0IHdvdWxkIHJlcXVpcmUgYSBnbG9iYWwgbXV0ZXguCisgKi8KKworc3RydWN0IEMySGFuZGxlSW9uIDogcHVibGljIEMySGFuZGxlIHsKKyAgICAvLyBpb24gaGFuZGxlIG93bnMgaW9uRmQoISkgYW5kIGJ1ZmZlckZkCisgICAgQzJIYW5kbGVJb24oaW50IGJ1ZmZlckZkLCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBDMkhhbmRsZShjSGVhZGVyKSwKKyAgICAgICAgICBtRmRzeyBidWZmZXJGZCB9LAorICAgICAgICAgIG1JbnRzeyBpbnQoc2l6ZSAmIDB4RkZGRkZGRkYpLCBpbnQoKHVpbnQ2NF90KHNpemUpID4+IDMyKSAmIDB4RkZGRkZGRkYpLCBrTWFnaWMgfSB7IH0KKworICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgQzJIYW5kbGUgKiBjb25zdCBvKTsKKworICAgIGludCBidWZmZXJGZCgpIGNvbnN0IHsgcmV0dXJuIG1GZHMubUJ1ZmZlcjsgfQorICAgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc2l6ZV90KHVuc2lnbmVkKG1JbnRzLm1TaXplTG8pKQorICAgICAgICAgICAgICAgIHwgc2l6ZV90KHVpbnQ2NF90KHVuc2lnbmVkKG1JbnRzLm1TaXplSGkpKSA8PCAzMik7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3RydWN0IHsKKyAgICAgICAgaW50IG1CdWZmZXI7IC8vIHNoYXJlZCBpb24gYnVmZmVyCisgICAgfSBtRmRzOworICAgIHN0cnVjdCB7CisgICAgICAgIGludCBtU2l6ZUxvOyAvLyBsb3cgMzItYml0cyBvZiBzaXplCisgICAgICAgIGludCBtU2l6ZUhpOyAvLyBoaWdoIDMyLWJpdHMgb2Ygc2l6ZQorICAgICAgICBpbnQgbU1hZ2ljOworICAgIH0gbUludHM7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBDMkhhbmRsZUlvbiBfdHlwZTsKKyAgICBlbnVtIHsKKyAgICAgICAga01hZ2ljID0gJ1x4YzJpb1x4MDAnLAorICAgICAgICBudW1GZHMgPSBzaXplb2YobUZkcykgLyBzaXplb2YoaW50KSwKKyAgICAgICAgbnVtSW50cyA9IHNpemVvZihtSW50cykgLyBzaXplb2YoaW50KSwKKyAgICAgICAgdmVyc2lvbiA9IHNpemVvZihDMkhhbmRsZSkKKyAgICB9OworICAgIC8vY29uc3RleHByIHN0YXRpYyBDMkhhbmRsZSBjSGVhZGVyID0geyB2ZXJzaW9uLCBudW1GZHMsIG51bUludHMsIHt9IH07CisgICAgY29uc3Qgc3RhdGljIEMySGFuZGxlIGNIZWFkZXI7Cit9OworCitjb25zdCBDMkhhbmRsZSBDMkhhbmRsZUlvbjo6Y0hlYWRlciA9IHsKKyAgICBDMkhhbmRsZUlvbjo6dmVyc2lvbiwKKyAgICBDMkhhbmRsZUlvbjo6bnVtRmRzLAorICAgIEMySGFuZGxlSW9uOjpudW1JbnRzLAorICAgIHt9Cit9OworCisvLyBzdGF0aWMKK2Jvb2wgQzJIYW5kbGVJb246OmlzVmFsaWQoY29uc3QgQzJIYW5kbGUgKiBjb25zdCBvKSB7CisgICAgaWYgKCFvIHx8IG1lbWNtcChvLCAmY0hlYWRlciwgc2l6ZW9mKGNIZWFkZXIpKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IEMySGFuZGxlSW9uICpvdGhlciA9IHN0YXRpY19jYXN0PGNvbnN0IEMySGFuZGxlSW9uKj4obyk7CisgICAgcmV0dXJuIG90aGVyLT5tSW50cy5tTWFnaWMgPT0ga01hZ2ljOworfQorCisvLyBUT0RPOiBpcyB0aGUgZHVwIG9mIGFuIGlvbiBmZCBpZGVudGljYWwgdG8gaW9uX3NoYXJlPworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU9OIEFMTE9DQVRJT04gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2NsYXNzIEMyQWxsb2NhdGlvbklvbiA6IHB1YmxpYyBDMkxpbmVhckFsbG9jYXRpb24geworcHVibGljOgorICAgIC8qIEludGVyZmFjZSBtZXRob2RzICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBtYXAoCisgICAgICAgIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlICpmZW5jZSwKKyAgICAgICAgdm9pZCAqKmFkZHIgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCB1bm1hcCh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSwgQzJGZW5jZSAqZmVuY2VGZCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB+QzJBbGxvY2F0aW9uSW9uKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBpZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBib29sIGVxdWFscyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAmb3RoZXIpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gaW50ZXJuYWwgbWV0aG9kcworICAgIEMyQWxsb2NhdGlvbklvbihpbnQgaW9uRmQsIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24sIHVuc2lnbmVkIGhlYXBNYXNrLCB1bnNpZ25lZCBmbGFncywgQzJBbGxvY2F0b3I6OmlkX3QgaWQpOworICAgIEMyQWxsb2NhdGlvbklvbihpbnQgaW9uRmQsIHNpemVfdCBzaXplLCBpbnQgc2hhcmVGZCwgQzJBbGxvY2F0b3I6OmlkX3QgaWQpOworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICBjbGFzcyBJbXBsOworICAgIGNsYXNzIEltcGxWMjsKKyAgICBJbXBsICptSW1wbDsKKworICAgIC8vIFRPRE86IHdlIGNvdWxkIG1ha2UgdGhpcyBlbmNhcHN1bGF0ZSBzaGFyZWRfcHRyIGFuZCBjb3BpYWJsZQorICAgIEMyX0RPX05PVF9DT1BZKEMyQWxsb2NhdGlvbklvbik7Cit9OworCitjbGFzcyBDMkFsbG9jYXRpb25Jb246OkltcGwgeworcHJvdGVjdGVkOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gaW9uIGFsbG9jYXRpb24uCisgICAgICoKKyAgICAgKiBcbm90ZSBXZSBhbHdheXMgY3JlYXRlIGFuIGlvbiBhbGxvY2F0aW9uLCBldmVuIGlmIHRoZSBhbGxvY2F0aW9uIG9yIGltcG9ydCBmYWlscworICAgICAqIHNvIHRoYXQgd2UgY2FuIGNhcHR1cmUgdGhlIGVycm9yLgorICAgICAqCisgICAgICogXHBhcmFtIGlvbkZkICAgICBpb24gY2xpZW50IChvd25lcnNoaXAgdHJhbnNmZXJyZWQgdG8gY3JlYXRlZCBvYmplY3QpCisgICAgICogXHBhcmFtIGNhcGFjaXR5ICBzaXplIG9mIGFsbG9jYXRpb24KKyAgICAgKiBccGFyYW0gYnVmZmVyRmQgIGJ1ZmZlciBoYW5kbGUgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkuIE11c3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgIGludmFsaWQgaWYgZXJyIGlzIG5vdCAwLgorICAgICAqIFxwYXJhbSBidWZmZXIgICAgaW9uIGJ1ZmZlciB1c2VyIGhhbmRsZSAob3duZXJzaGlwIHRyYW5zZmVycmVkIHRvIGNyZWF0ZWQgb2JqZWN0KS4gTXVzdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgaW52YWxpZCBpZiBlcnIgaXMgbm90IDAuCisgICAgICogXHBhcmFtIGVyciAgICAgICBlcnJubyBkdXJpbmcgYnVmZmVyIGFsbG9jYXRpb24gb3IgaW1wb3J0CisgICAgICovCisgICAgSW1wbChpbnQgaW9uRmQsIHNpemVfdCBjYXBhY2l0eSwgaW50IGJ1ZmZlckZkLCBpb25fdXNlcl9oYW5kbGVfdCBidWZmZXIsIEMyQWxsb2NhdG9yOjppZF90IGlkLCBpbnQgZXJyKQorICAgICAgICA6IG1Jb25GZChpb25GZCksCisgICAgICAgICAgbUhhbmRsZShidWZmZXJGZCwgY2FwYWNpdHkpLAorICAgICAgICAgIG1CdWZmZXIoYnVmZmVyKSwKKyAgICAgICAgICBtSWQoaWQpLAorICAgICAgICAgIG1Jbml0KGMyX21hcF9lcnJubzxFTk9NRU0sIEVBQ0NFUywgRUlOVkFMPihlcnIpKSwKKyAgICAgICAgICBtTWFwRmQoLTEpIHsKKyAgICAgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgICAgICAvLyBjbG9zZSBpb25GZCBub3cgb24gZXJyb3IKKyAgICAgICAgICAgIGlmIChtSW9uRmQgPj0gMCkgeworICAgICAgICAgICAgICAgIGNsb3NlKG1Jb25GZCk7CisgICAgICAgICAgICAgICAgbUlvbkZkID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBDMl9DSEVDSyhidWZmZXJGZCA8IDApOworICAgICAgICAgICAgLy8gQzJfQ0hFQ0soYnVmZmVyIDwgMCk7CisgICAgICAgIH0KKyAgICB9CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGlvbiBhbGxvY2F0aW9uIGJ5IGltcG9ydGluZyBhIHNoYXJlZCBidWZmZXIgZmQuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW9uRmQgICAgIGlvbiBjbGllbnQgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkKKyAgICAgKiBccGFyYW0gY2FwYWNpdHkgIHNpemUgb2YgYWxsb2NhdGlvbgorICAgICAqIFxwYXJhbSBidWZmZXJGZCAgYnVmZmVyIGhhbmRsZSAob3duZXJzaGlwIHRyYW5zZmVycmVkIHRvIGNyZWF0ZWQgb2JqZWN0KQorICAgICAqCisgICAgICogXHJldHVybiBjcmVhdGVkIGlvbiBhbGxvY2F0aW9uIChpbXBsZW1lbnRhdGlvbikgd2hpY2ggbWF5IGJlIGludmFsaWQgaWYgdGhlCisgICAgICogaW1wb3J0IGZhaWxlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgSW1wbCAqSW1wb3J0KGludCBpb25GZCwgc2l6ZV90IGNhcGFjaXR5LCBpbnQgYnVmZmVyRmQsIEMyQWxsb2NhdG9yOjppZF90IGlkKTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gaW9uIGFsbG9jYXRpb24gYnkgYWxsb2NhdGluZyBhbiBpb24gYnVmZmVyLgorICAgICAqCisgICAgICogXHBhcmFtIGlvbkZkICAgICBpb24gY2xpZW50IChvd25lcnNoaXAgdHJhbnNmZXJyZWQgdG8gY3JlYXRlZCBvYmplY3QpCisgICAgICogXHBhcmFtIHNpemUgICAgICBzaXplIG9mIGFsbG9jYXRpb24KKyAgICAgKiBccGFyYW0gYWxpZ24gICAgIGRlc2lyZWQgYWxpZ25tZW50IG9mIGFsbG9jYXRpb24KKyAgICAgKiBccGFyYW0gaGVhcE1hc2sgIG1hc2sgb2YgaGVhcHMgY29uc2lkZXJlZAorICAgICAqIFxwYXJhbSBmbGFncyAgICAgaW9uIGFsbG9jYXRpb24gZmxhZ3MKKyAgICAgKgorICAgICAqIFxyZXR1cm4gY3JlYXRlZCBpb24gYWxsb2NhdGlvbiAoaW1wbGVtZW50YXRpb24pIHdoaWNoIG1heSBiZSBpbnZhbGlkIGlmIHRoZQorICAgICAqIGFsbG9jYXRpb24gZmFpbGVkLgorICAgICAqLworICAgIHN0YXRpYyBJbXBsICpBbGxvYyhpbnQgaW9uRmQsIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24sIHVuc2lnbmVkIGhlYXBNYXNrLCB1bnNpZ25lZCBmbGFncywgQzJBbGxvY2F0b3I6OmlkX3QgaWQpOworCisgICAgYzJfc3RhdHVzX3QgbWFwKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlICpmZW5jZSwgdm9pZCAqKmFkZHIpIHsKKyAgICAgICAgKHZvaWQpZmVuY2U7IC8vIFRPRE86IHdhaXQgZm9yIGZlbmNlCisgICAgICAgICphZGRyID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKCFtTWFwcGluZ3MuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1YoIm11bHRpcGxlIG1hcCIpOworICAgICAgICAgICAgLy8gVE9ETzogdGVjaG5pY2FsbHkgd2Ugc2hvdWxkIHJldHVybiBEVVBMSUNBVEUgaGVyZSwgYnV0IG91ciBibG9jayB2aWV3cyBkb24ndAorICAgICAgICAgICAgLy8gYWN0dWFsbHkgdW5tYXAsIHNvIHdlIGVuZCB1cCByZW1hcHBpbmcgYW4gaW9uIGJ1ZmZlciBtdWx0aXBsZSB0aW1lcy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyByZXR1cm4gQzJfRFVQTElDQVRFOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcHJvdCA9IFBST1RfTk9ORTsKKyAgICAgICAgaW50IGZsYWdzID0gTUFQX1NIQVJFRDsKKyAgICAgICAgaWYgKHVzYWdlLmV4cGVjdGVkICYgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpIHsKKyAgICAgICAgICAgIHByb3QgfD0gUFJPVF9SRUFEOworICAgICAgICB9CisgICAgICAgIGlmICh1c2FnZS5leHBlY3RlZCAmIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSkgeworICAgICAgICAgICAgcHJvdCB8PSBQUk9UX1dSSVRFOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGFsaWdubWVudEJ5dGVzID0gb2Zmc2V0ICUgUEFHRV9TSVpFOworICAgICAgICBzaXplX3QgbWFwT2Zmc2V0ID0gb2Zmc2V0IC0gYWxpZ25tZW50Qnl0ZXM7CisgICAgICAgIHNpemVfdCBtYXBTaXplID0gc2l6ZSArIGFsaWdubWVudEJ5dGVzOworICAgICAgICBNYXBwaW5nIG1hcCA9IHsgbnVsbHB0ciwgYWxpZ25tZW50Qnl0ZXMsIG1hcFNpemUgfTsKKworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtYXBJbnRlcm5hbChtYXBTaXplLCBtYXBPZmZzZXQsIGFsaWdubWVudEJ5dGVzLCBwcm90LCBmbGFncywgJihtYXAuYWRkciksIGFkZHIpOworICAgICAgICBpZiAobWFwLmFkZHIpIHsKKyAgICAgICAgICAgIG1NYXBwaW5ncy5wdXNoX2JhY2sobWFwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHVubWFwKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLCBDMkZlbmNlICpmZW5jZSkgeworICAgICAgICBpZiAobU1hcHBpbmdzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dEKCJ0cmllZCB0byB1bm1hcCB1bm1hcHBlZCBidWZmZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbU1hcHBpbmdzLmJlZ2luKCk7IGl0ICE9IG1NYXBwaW5ncy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgaWYgKGFkZHIgIT0gKHVpbnQ4X3QgKilpdC0+YWRkciArIGl0LT5hbGlnbm1lbnRCeXRlcyB8fAorICAgICAgICAgICAgICAgICAgICBzaXplICsgaXQtPmFsaWdubWVudEJ5dGVzICE9IGl0LT5zaXplKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgZXJyID0gbXVubWFwKGl0LT5hZGRyLCBpdC0+c2l6ZSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgibXVubWFwIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIHJldHVybiBjMl9tYXBfZXJybm88RUlOVkFMPihlcnJubyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmVuY2UpIHsKKyAgICAgICAgICAgICAgICAqZmVuY2UgPSBDMkZlbmNlKCk7IC8vIG5vdCB1c2luZyBmZW5jZXMKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICh2b2lkKW1NYXBwaW5ncy5lcmFzZShpdCk7CisgICAgICAgICAgICBBTE9HVigic3VjY2Vzc2Z1bGx5IHVubWFwcGVkOiAlZCIsIG1IYW5kbGUuYnVmZmVyRmQoKSk7CisgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoInVubWFwIGZhaWxlZCB0byBmaW5kIHNwZWNpZmllZCBtYXAiKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5JbXBsKCkgeworICAgICAgICBpZiAoIW1NYXBwaW5ncy5lbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRCgiRGFuZ2xpbmcgbWFwcGluZ3MhIik7CisgICAgICAgICAgICBmb3IgKGNvbnN0IE1hcHBpbmcgJm1hcCA6IG1NYXBwaW5ncykgeworICAgICAgICAgICAgICAgICh2b2lkKW11bm1hcChtYXAuYWRkciwgbWFwLnNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtTWFwRmQgPj0gMCkgeworICAgICAgICAgICAgY2xvc2UobU1hcEZkKTsKKyAgICAgICAgICAgIG1NYXBGZCA9IC0xOworICAgICAgICB9CisgICAgICAgIGlmIChtSW5pdCA9PSBDMl9PSykgeworICAgICAgICAgICAgaWYgKG1CdWZmZXIgPj0gMCkgeworICAgICAgICAgICAgICAgICh2b2lkKWlvbl9mcmVlKG1Jb25GZCwgbUJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKCZtSGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUlvbkZkID49IDApIHsKKyAgICAgICAgICAgIGNsb3NlKG1Jb25GZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisKKyAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gJm1IYW5kbGU7CisgICAgfQorCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSWQ7CisgICAgfQorCisgICAgdmlydHVhbCBpb25fdXNlcl9oYW5kbGVfdCBpb25IYW5kbGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQnVmZmVyOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbWFwSW50ZXJuYWwoc2l6ZV90IG1hcFNpemUsIHNpemVfdCBtYXBPZmZzZXQsIHNpemVfdCBhbGlnbm1lbnRCeXRlcywKKyAgICAgICAgICAgIGludCBwcm90LCBpbnQgZmxhZ3MsIHZvaWQqKiBiYXNlLCB2b2lkKiogYWRkcikgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICAgICAgaWYgKG1NYXBGZCA9PSAtMSkgeworICAgICAgICAgICAgaW50IHJldCA9IGlvbl9tYXAobUlvbkZkLCBtQnVmZmVyLCBtYXBTaXplLCBwcm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG1hcE9mZnNldCwgKHVuc2lnbmVkIGNoYXIqKiliYXNlLCAmbU1hcEZkKTsKKyAgICAgICAgICAgIEFMT0dWKCJpb25fbWFwKGlvbkZkID0gJWQsIGhhbmRsZSA9ICVkLCBzaXplID0gJXp1LCBwcm90ID0gJWQsIGZsYWdzID0gJWQsICIKKyAgICAgICAgICAgICAgICAgICJvZmZzZXQgPSAlenUpIHJldHVybmVkICglZCkiLAorICAgICAgICAgICAgICAgICAgbUlvbkZkLCBtQnVmZmVyLCBtYXBTaXplLCBwcm90LCBmbGFncywgbWFwT2Zmc2V0LCByZXQpOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIG1NYXBGZCA9IC0xOworICAgICAgICAgICAgICAgICpiYXNlID0gKmFkZHIgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGVyciA9IGMyX21hcF9lcnJubzxFSU5WQUw+KC1yZXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqYWRkciA9ICh1aW50OF90ICopKmJhc2UgKyBhbGlnbm1lbnRCeXRlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpiYXNlID0gbW1hcChudWxscHRyLCBtYXBTaXplLCBwcm90LCBmbGFncywgbU1hcEZkLCBtYXBPZmZzZXQpOworICAgICAgICAgICAgQUxPR1YoIm1tYXAoc2l6ZSA9ICV6dSwgcHJvdCA9ICVkLCBmbGFncyA9ICVkLCBtYXBGZCA9ICVkLCBvZmZzZXQgPSAlenUpICIKKyAgICAgICAgICAgICAgICAgICJyZXR1cm5lZCAoJWQpIiwKKyAgICAgICAgICAgICAgICAgIG1hcFNpemUsIHByb3QsIGZsYWdzLCBtTWFwRmQsIG1hcE9mZnNldCwgZXJybm8pOworICAgICAgICAgICAgaWYgKCpiYXNlID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgICAgICAgICAqYmFzZSA9ICphZGRyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBlcnIgPSBjMl9tYXBfZXJybm88RUlOVkFMPihlcnJubyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICphZGRyID0gKHVpbnQ4X3QgKikqYmFzZSArIGFsaWdubWVudEJ5dGVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50IG1Jb25GZDsKKyAgICBDMkhhbmRsZUlvbiBtSGFuZGxlOworICAgIGlvbl91c2VyX2hhbmRsZV90IG1CdWZmZXI7CisgICAgQzJBbGxvY2F0b3I6OmlkX3QgbUlkOworICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIGludCBtTWFwRmQ7IC8vIG9ubHkgb25lIGZvciBub3cKKyAgICBzdHJ1Y3QgTWFwcGluZyB7CisgICAgICAgIHZvaWQgKmFkZHI7CisgICAgICAgIHNpemVfdCBhbGlnbm1lbnRCeXRlczsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgfTsKKyAgICBzdGQ6Omxpc3Q8TWFwcGluZz4gbU1hcHBpbmdzOworfTsKKworY2xhc3MgQzJBbGxvY2F0aW9uSW9uOjpJbXBsVjIgOiBwdWJsaWMgQzJBbGxvY2F0aW9uSW9uOjpJbXBsIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGlvbiBhbGxvY2F0aW9uIGZvciBwbGF0Zm9ybXMgd2l0aCBuZXcgKGlvbl80LjEyLmgpIGFwaQorICAgICAqCisgICAgICogXG5vdGUgV2UgYWx3YXlzIGNyZWF0ZSBhbiBpb24gYWxsb2NhdGlvbiwgZXZlbiBpZiB0aGUgYWxsb2NhdGlvbiBvciBpbXBvcnQgZmFpbHMKKyAgICAgKiBzbyB0aGF0IHdlIGNhbiBjYXB0dXJlIHRoZSBlcnJvci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpb25GZCAgICAgaW9uIGNsaWVudCAob3duZXJzaGlwIHRyYW5zZmVycmVkIHRvIGNyZWF0ZWQgb2JqZWN0KQorICAgICAqIFxwYXJhbSBjYXBhY2l0eSAgc2l6ZSBvZiBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGJ1ZmZlckZkICBidWZmZXIgaGFuZGxlIChvd25lcnNoaXAgdHJhbnNmZXJyZWQgdG8gY3JlYXRlZCBvYmplY3QpLiBNdXN0IGJlCisgICAgICogICAgICAgICAgICAgICAgICBpbnZhbGlkIGlmIGVyciBpcyBub3QgMC4KKyAgICAgKiBccGFyYW0gZXJyICAgICAgIGVycm5vIGR1cmluZyBidWZmZXIgYWxsb2NhdGlvbiBvciBpbXBvcnQKKyAgICAgKi8KKyAgICBJbXBsVjIoaW50IGlvbkZkLCBzaXplX3QgY2FwYWNpdHksIGludCBidWZmZXJGZCwgQzJBbGxvY2F0b3I6OmlkX3QgaWQsIGludCBlcnIpCisgICAgICAgIDogSW1wbChpb25GZCwgY2FwYWNpdHksIGJ1ZmZlckZkLCAtMSAvKmJ1ZmZlciovLCBpZCwgZXJyKSB7CisgICAgfQorCisgICAgdmlydHVhbCB+SW1wbFYyKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBpb25fdXNlcl9oYW5kbGVfdCBpb25IYW5kbGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSGFuZGxlLmJ1ZmZlckZkKCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBtYXBJbnRlcm5hbChzaXplX3QgbWFwU2l6ZSwgc2l6ZV90IG1hcE9mZnNldCwgc2l6ZV90IGFsaWdubWVudEJ5dGVzLAorICAgICAgICAgICAgaW50IHByb3QsIGludCBmbGFncywgdm9pZCoqIGJhc2UsIHZvaWQqKiBhZGRyKSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgICAgICAqYmFzZSA9IG1tYXAobnVsbHB0ciwgbWFwU2l6ZSwgcHJvdCwgZmxhZ3MsIG1IYW5kbGUuYnVmZmVyRmQoKSwgbWFwT2Zmc2V0KTsKKyAgICAgICAgQUxPR1YoIm1tYXBWMihzaXplID0gJXp1LCBwcm90ID0gJWQsIGZsYWdzID0gJWQsIG1hcEZkID0gJWQsIG9mZnNldCA9ICV6dSkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgKCVkKSIsCisgICAgICAgICAgICAgIG1hcFNpemUsIHByb3QsIGZsYWdzLCBtSGFuZGxlLmJ1ZmZlckZkKCksIG1hcE9mZnNldCwgZXJybm8pOworICAgICAgICBpZiAoKmJhc2UgPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICAgICAgKmJhc2UgPSAqYWRkciA9IG51bGxwdHI7CisgICAgICAgICAgICBlcnIgPSBjMl9tYXBfZXJybm88RUlOVkFMPihlcnJubyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqYWRkciA9ICh1aW50OF90ICopKmJhc2UgKyBhbGlnbm1lbnRCeXRlczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworfTsKKworQzJBbGxvY2F0aW9uSW9uOjpJbXBsICpDMkFsbG9jYXRpb25Jb246OkltcGw6OkltcG9ydChpbnQgaW9uRmQsIHNpemVfdCBjYXBhY2l0eSwgaW50IGJ1ZmZlckZkLAorICAgICAgICBDMkFsbG9jYXRvcjo6aWRfdCBpZCkgeworICAgIGludCByZXQgPSAwOworICAgIGlmIChpb25faXNfbGVnYWN5KGlvbkZkKSkgeworICAgICAgICBpb25fdXNlcl9oYW5kbGVfdCBidWZmZXIgPSAtMTsKKyAgICAgICAgcmV0ID0gaW9uX2ltcG9ydChpb25GZCwgYnVmZmVyRmQsICZidWZmZXIpOworICAgICAgICByZXR1cm4gbmV3IEltcGwoaW9uRmQsIGNhcGFjaXR5LCBidWZmZXJGZCwgYnVmZmVyLCBpZCwgcmV0KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbmV3IEltcGxWMihpb25GZCwgY2FwYWNpdHksIGJ1ZmZlckZkLCBpZCwgcmV0KTsKKyAgICB9Cit9CisKK0MyQWxsb2NhdGlvbklvbjo6SW1wbCAqQzJBbGxvY2F0aW9uSW9uOjpJbXBsOjpBbGxvYyhpbnQgaW9uRmQsIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24sCisgICAgICAgIHVuc2lnbmVkIGhlYXBNYXNrLCB1bnNpZ25lZCBmbGFncywgQzJBbGxvY2F0b3I6OmlkX3QgaWQpIHsKKyAgICBpbnQgYnVmZmVyRmQgPSAtMTsKKyAgICBpb25fdXNlcl9oYW5kbGVfdCBidWZmZXIgPSAtMTsKKyAgICBzaXplX3QgYWxpZ25lZFNpemUgPSBhbGlnbiA9PSAwID8gc2l6ZSA6IChzaXplICsgYWxpZ24gLSAxKSAmIH4oYWxpZ24gLSAxKTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGlvbl9pc19sZWdhY3koaW9uRmQpKSB7CisgICAgICAgIHJldCA9IGlvbl9hbGxvYyhpb25GZCwgYWxpZ25lZFNpemUsIGFsaWduLCBoZWFwTWFzaywgZmxhZ3MsICZidWZmZXIpOworICAgICAgICBBTE9HVigiaW9uX2FsbG9jKGlvbkZkID0gJWQsIHNpemUgPSAlenUsIGFsaWduID0gJXp1LCBwcm90ID0gJWQsIGZsYWdzID0gJWQpICIKKyAgICAgICAgICAgICAgInJldHVybmVkICglZCkgOyBidWZmZXIgPSAlZCIsCisgICAgICAgICAgICAgIGlvbkZkLCBhbGlnbmVkU2l6ZSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgcmV0LCBidWZmZXIpOworICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIC8vIGdldCBidWZmZXIgZmQgZm9yIG5hdGl2ZSBoYW5kbGUgY29uc3RydWN0b3IKKyAgICAgICAgICAgIHJldCA9IGlvbl9zaGFyZShpb25GZCwgYnVmZmVyLCAmYnVmZmVyRmQpOworICAgICAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgaW9uX2ZyZWUoaW9uRmQsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgYnVmZmVyID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBJbXBsKGlvbkZkLCBhbGlnbmVkU2l6ZSwgYnVmZmVyRmQsIGJ1ZmZlciwgaWQsIHJldCk7CisKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBpb25fYWxsb2NfZmQoaW9uRmQsIGFsaWduZWRTaXplLCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzLCAmYnVmZmVyRmQpOworICAgICAgICBBTE9HVigiaW9uX2FsbG9jX2ZkKGlvbkZkID0gJWQsIHNpemUgPSAlenUsIGFsaWduID0gJXp1LCBwcm90ID0gJWQsIGZsYWdzID0gJWQpICIKKyAgICAgICAgICAgICAgInJldHVybmVkICglZCkgOyBidWZmZXJGZCA9ICVkIiwKKyAgICAgICAgICAgICAgaW9uRmQsIGFsaWduZWRTaXplLCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzLCByZXQsIGJ1ZmZlckZkKTsKKworICAgICAgICByZXR1cm4gbmV3IEltcGxWMihpb25GZCwgYWxpZ25lZFNpemUsIGJ1ZmZlckZkLCBpZCwgcmV0KTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdGlvbklvbjo6bWFwKAorICAgIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlICpmZW5jZSwgdm9pZCAqKmFkZHIpIHsKKyAgICByZXR1cm4gbUltcGwtPm1hcChvZmZzZXQsIHNpemUsIHVzYWdlLCBmZW5jZSwgYWRkcik7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdGlvbklvbjo6dW5tYXAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUsIEMyRmVuY2UgKmZlbmNlKSB7CisgICAgcmV0dXJuIG1JbXBsLT51bm1hcChhZGRyLCBzaXplLCBmZW5jZSk7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdGlvbklvbjo6c3RhdHVzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+c3RhdHVzKCk7Cit9CisKK0MyQWxsb2NhdG9yOjppZF90IEMyQWxsb2NhdGlvbklvbjo6Z2V0QWxsb2NhdG9ySWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRBbGxvY2F0b3JJZCgpOworfQorCitib29sIEMyQWxsb2NhdGlvbklvbjo6ZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICZvdGhlcikgY29uc3QgeworICAgIGlmICghb3RoZXIgfHwgb3RoZXItPmdldEFsbG9jYXRvcklkKCkgIT0gZ2V0QWxsb2NhdG9ySWQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIGdldCB1c2VyIGhhbmRsZSB0byBjb21wYXJlIG9iamVjdHMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0aW9uSW9uPiBvdGhlckFzSW9uID0gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQWxsb2NhdGlvbklvbj4ob3RoZXIpOworICAgIHJldHVybiBtSW1wbC0+aW9uSGFuZGxlKCkgPT0gb3RoZXJBc0lvbi0+bUltcGwtPmlvbkhhbmRsZSgpOworfQorCitjb25zdCBDMkhhbmRsZSAqQzJBbGxvY2F0aW9uSW9uOjpoYW5kbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5oYW5kbGUoKTsKK30KKworQzJBbGxvY2F0aW9uSW9uOjp+QzJBbGxvY2F0aW9uSW9uKCkgeworICAgIGRlbGV0ZSBtSW1wbDsKK30KKworQzJBbGxvY2F0aW9uSW9uOjpDMkFsbG9jYXRpb25Jb24oaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaGVhcE1hc2ssIHVuc2lnbmVkIGZsYWdzLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCkKKyAgICA6IEMyTGluZWFyQWxsb2NhdGlvbihzaXplKSwKKyAgICAgIG1JbXBsKEltcGw6OkFsbG9jKGlvbkZkLCBzaXplLCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzLCBpZCkpIHsgfQorCitDMkFsbG9jYXRpb25Jb246OkMyQWxsb2NhdGlvbklvbihpbnQgaW9uRmQsIHNpemVfdCBzaXplLCBpbnQgc2hhcmVGZCwgQzJBbGxvY2F0b3I6OmlkX3QgaWQpCisgICAgOiBDMkxpbmVhckFsbG9jYXRpb24oc2l6ZSksCisgICAgICBtSW1wbChJbXBsOjpJbXBvcnQoaW9uRmQsIHNpemUsIHNoYXJlRmQsIGlkKSkgeyB9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJT04gQUxMT0NBVE9SID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitDMkFsbG9jYXRvcklvbjo6QzJBbGxvY2F0b3JJb24oaWRfdCBpZCkKKyAgICA6IG1Jbml0KEMyX09LKSwKKyAgICAgIG1Jb25GZChpb25fb3BlbigpKSB7CisgICAgaWYgKG1Jb25GZCA8IDApIHsKKyAgICAgICAgc3dpdGNoIChlcnJubykgeworICAgICAgICBjYXNlIEVOT0VOVDogICAgbUluaXQgPSBDMl9PTUlUVEVEOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogICAgICAgIG1Jbml0ID0gYzJfbWFwX2Vycm5vPEVBQ0NFUz4oZXJybm8pOyBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgbWluVXNhZ2UgPSB7IDAsIDAgfTsKKyAgICAgICAgQzJNZW1vcnlVc2FnZSBtYXhVc2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICBUcmFpdHMgdHJhaXRzID0geyAiYW5kcm9pZC5hbGxvY2F0b3IuaW9uIiwgaWQsIExJTkVBUiwgbWluVXNhZ2UsIG1heFVzYWdlIH07CisgICAgICAgIG1UcmFpdHMgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRyYWl0cz4odHJhaXRzKTsKKyAgICAgICAgbUJsb2NrU2l6ZSA9IDo6Z2V0cGFnZXNpemUoKTsKKyAgICB9Cit9CisKK0MyQWxsb2NhdG9ySW9uOjp+QzJBbGxvY2F0b3JJb24oKSB7CisgICAgaWYgKG1Jbml0ID09IEMyX09LKSB7CisgICAgICAgIGlvbl9jbG9zZShtSW9uRmQpOworICAgIH0KK30KKworQzJBbGxvY2F0b3I6OmlkX3QgQzJBbGxvY2F0b3JJb246OmdldElkKCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Vc2FnZU1hcHBlckxvY2spOworICAgIHJldHVybiBtVHJhaXRzLT5pZDsKK30KKworQzJTdHJpbmcgQzJBbGxvY2F0b3JJb246OmdldE5hbWUoKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVzYWdlTWFwcGVyTG9jayk7CisgICAgcmV0dXJuIG1UcmFpdHMtPm5hbWU7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkFsbG9jYXRvcjo6VHJhaXRzPiBDMkFsbG9jYXRvcklvbjo6Z2V0VHJhaXRzKCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Vc2FnZU1hcHBlckxvY2spOworICAgIHJldHVybiBtVHJhaXRzOworfQorCit2b2lkIEMyQWxsb2NhdG9ySW9uOjpzZXRVc2FnZU1hcHBlcigKKyAgICAgICAgY29uc3QgVXNhZ2VNYXBwZXJGbiAmbWFwcGVyLCB1aW50NjRfdCBtaW5Vc2FnZSwgdWludDY0X3QgbWF4VXNhZ2UsIHVpbnQ2NF90IGJsb2NrU2l6ZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Vc2FnZU1hcHBlckxvY2spOworICAgIG1Vc2FnZU1hcHBlckNhY2hlLmNsZWFyKCk7CisgICAgbVVzYWdlTWFwcGVyTHJ1LmNsZWFyKCk7CisgICAgbVVzYWdlTWFwcGVyID0gbWFwcGVyOworICAgIFRyYWl0cyB0cmFpdHMgPSB7CisgICAgICAgIG1UcmFpdHMtPm5hbWUsIG1UcmFpdHMtPmlkLCBMSU5FQVIsCisgICAgICAgIEMyTWVtb3J5VXNhZ2UobWluVXNhZ2UpLCBDMk1lbW9yeVVzYWdlKG1heFVzYWdlKQorICAgIH07CisgICAgbVRyYWl0cyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VHJhaXRzPih0cmFpdHMpOworICAgIG1CbG9ja1NpemUgPSBibG9ja1NpemU7Cit9CisKK3N0ZDo6c2l6ZV90IEMyQWxsb2NhdG9ySW9uOjpNYXBwZXJLZXlIYXNoOjpvcGVyYXRvcigpKGNvbnN0IE1hcHBlcktleSAmaykgY29uc3QgeworICAgIHJldHVybiBzdGQ6Omhhc2g8dWludDY0X3Q+e30oay5maXJzdCkgXiBzdGQ6Omhhc2g8c2l6ZV90Pnt9KGsuc2Vjb25kKTsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JJb246Om1hcFVzYWdlKAorICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLCBzaXplX3QgY2FwYWNpdHksIHNpemVfdCAqYWxpZ24sIHVuc2lnbmVkICpoZWFwTWFzaywgdW5zaWduZWQgKmZsYWdzKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVzYWdlTWFwcGVyTG9jayk7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfT0s7CisgICAgLy8gYWxpZ24gY2FwYWNpdHkKKyAgICBjYXBhY2l0eSA9IChjYXBhY2l0eSArIG1CbG9ja1NpemUgLSAxKSAmIH4obUJsb2NrU2l6ZSAtIDEpOworICAgIE1hcHBlcktleSBrZXkgPSBzdGQ6Om1ha2VfcGFpcih1c2FnZS5leHBlY3RlZCwgY2FwYWNpdHkpOworICAgIGF1dG8gZW50cnkgPSBtVXNhZ2VNYXBwZXJDYWNoZS5maW5kKGtleSk7CisgICAgaWYgKGVudHJ5ID09IG1Vc2FnZU1hcHBlckNhY2hlLmVuZCgpKSB7CisgICAgICAgIGlmIChtVXNhZ2VNYXBwZXIpIHsKKyAgICAgICAgICAgIHJlcyA9IG1Vc2FnZU1hcHBlcih1c2FnZSwgY2FwYWNpdHksIGFsaWduLCBoZWFwTWFzaywgZmxhZ3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmFsaWduID0gMDsgLy8gVE9ETyBtYWtlIHRoaXMgMQorICAgICAgICAgICAgKmhlYXBNYXNrID0gfjA7IC8vIGRlZmF1bHQgbWFzaworICAgICAgICAgICAgKmZsYWdzID0gMDsgLy8gZGVmYXVsdCBmbGFncworICAgICAgICAgICAgcmVzID0gQzJfTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICAvLyBhZGQgdXNhZ2UgdG8gY2FjaGUKKyAgICAgICAgTWFwcGVyVmFsdWUgdmFsdWUgPSBzdGQ6Om1ha2VfdHVwbGUoKmFsaWduLCAqaGVhcE1hc2ssICpmbGFncywgcmVzKTsKKyAgICAgICAgbVVzYWdlTWFwcGVyTHJ1LmVtcGxhY2VfZnJvbnQoa2V5LCB2YWx1ZSk7CisgICAgICAgIG1Vc2FnZU1hcHBlckNhY2hlLmVtcGxhY2Uoc3RkOjptYWtlX3BhaXIoa2V5LCBtVXNhZ2VNYXBwZXJMcnUuYmVnaW4oKSkpOworICAgICAgICBpZiAobVVzYWdlTWFwcGVyQ2FjaGUuc2l6ZSgpID4gVVNBR0VfTFJVX0NBQ0hFX1NJWkUpIHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSBMUlUgZW50cnkKKyAgICAgICAgICAgIE1hcHBlcktleSBscnVLZXkgPSBtVXNhZ2VNYXBwZXJMcnUuZnJvbnQoKS5maXJzdDsKKyAgICAgICAgICAgIG1Vc2FnZU1hcHBlckNhY2hlLmVyYXNlKGxydUtleSk7CisgICAgICAgICAgICBtVXNhZ2VNYXBwZXJMcnUucG9wX2JhY2soKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIG1vdmUgZW50cnkgdG8gTVJVCisgICAgICAgIG1Vc2FnZU1hcHBlckxydS5zcGxpY2UobVVzYWdlTWFwcGVyTHJ1LmJlZ2luKCksIG1Vc2FnZU1hcHBlckxydSwgZW50cnktPnNlY29uZCk7CisgICAgICAgIGNvbnN0IE1hcHBlclZhbHVlICZ2YWx1ZSA9IGVudHJ5LT5zZWNvbmQtPnNlY29uZDsKKyAgICAgICAgc3RkOjp0aWUoKmFsaWduLCAqaGVhcE1hc2ssICpmbGFncywgcmVzKSA9IHZhbHVlOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvcklvbjo6bmV3TGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgdWludDMyX3QgY2FwYWNpdHksIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICphbGxvY2F0aW9uKSB7CisgICAgaWYgKGFsbG9jYXRpb24gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIGFsbG9jYXRpb24tPnJlc2V0KCk7CisgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisKKyAgICBzaXplX3QgYWxpZ24gPSAwOworICAgIHVuc2lnbmVkIGhlYXBNYXNrID0gfjA7CisgICAgdW5zaWduZWQgZmxhZ3MgPSAwOworICAgIGMyX3N0YXR1c190IHJldCA9IG1hcFVzYWdlKHVzYWdlLCBjYXBhY2l0eSwgJmFsaWduLCAmaGVhcE1hc2ssICZmbGFncyk7CisgICAgaWYgKHJldCAmJiByZXQgIT0gQzJfTk9fSU5JVCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRpb25Jb24+IGFsbG9jCisgICAgICAgID0gc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRpb25Jb24+KGR1cChtSW9uRmQpLCBjYXBhY2l0eSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgbVRyYWl0cy0+aWQpOworICAgIHJldCA9IGFsbG9jLT5zdGF0dXMoKTsKKyAgICBpZiAocmV0ID09IEMyX09LKSB7CisgICAgICAgICphbGxvY2F0aW9uID0gYWxsb2M7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9ySW9uOjpwcmlvckxpbmVhckFsbG9jYXRpb24oCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICphbGxvY2F0aW9uKSB7CisgICAgKmFsbG9jYXRpb24gPSBudWxscHRyOworICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorCisgICAgaWYgKCFDMkhhbmRsZUlvbjo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gVE9ETzogZ2V0IGNhcGFjaXR5IGFuZCB2YWxpZGF0ZSBpdAorICAgIGNvbnN0IEMySGFuZGxlSW9uICpoID0gc3RhdGljX2Nhc3Q8Y29uc3QgQzJIYW5kbGVJb24qPihoYW5kbGUpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRpb25Jb24+IGFsbG9jCisgICAgICAgID0gc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRpb25Jb24+KGR1cChtSW9uRmQpLCBoLT5zaXplKCksIGgtPmJ1ZmZlckZkKCksIG1UcmFpdHMtPmlkKTsKKyAgICBjMl9zdGF0dXNfdCByZXQgPSBhbGxvYy0+c3RhdHVzKCk7CisgICAgaWYgKHJldCA9PSBDMl9PSykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IGFsbG9jOworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbmF0aXZlX2hhbmRsZV90Kj4oaGFuZGxlKSkpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIEMyQWxsb2NhdG9ySW9uOjppc1ZhbGlkKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSB7CisgICAgcmV0dXJuIEMySGFuZGxlSW9uOjppc1ZhbGlkKG8pOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQnVmZmVyLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTBiNTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJCdWZmZXIuY3BwCkBAIC0wLDAgKzEsMTMwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJCdWZmZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisKK25hbWVzcGFjZSB7CisKK3VzaW5nIGFuZHJvaWQ6OkMyQWxsb2NhdG9yR3JhbGxvYzsKK3VzaW5nIGFuZHJvaWQ6OkMyQWxsb2NhdG9ySW9uOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6QnVmZmVyUG9vbEFsbG9jYXRpb247Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpCdWZmZXJQb29sQWxsb2NhdG9yOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6Q2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNvbm5lY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OklOVkFMSURfQ09OTkVDVElPTklEOworCisvLyBUaGlzIGFub255bW91cyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIGhlbHBlciBjbGFzc2VzIHRoYXQgYWxsb3cgb3VyIGltcGxlbWVudGF0aW9uIHRvIGNyZWF0ZQorLy8gYmxvY2svYnVmZmVyIG9iamVjdHMuCisvLworLy8gSW5oZXJpdCBmcm9tIHRoZSBwYXJlbnQsIHNoYXJlIHdpdGggdGhlIGZyaWVuZC4KK2NsYXNzIFJlYWRWaWV3QnVkZHkgOiBwdWJsaWMgQzJSZWFkVmlldyB7CisgICAgdXNpbmcgQzJSZWFkVmlldzo6QzJSZWFkVmlldzsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkNvbnN0TGluZWFyQmxvY2s7Cit9OworCitjbGFzcyBXcml0ZVZpZXdCdWRkeSA6IHB1YmxpYyBDMldyaXRlVmlldyB7CisgICAgdXNpbmcgQzJXcml0ZVZpZXc6OkMyV3JpdGVWaWV3OworICAgIGZyaWVuZCBjbGFzcyA6OkMyTGluZWFyQmxvY2s7Cit9OworCitjbGFzcyBDb25zdExpbmVhckJsb2NrQnVkZHkgOiBwdWJsaWMgQzJDb25zdExpbmVhckJsb2NrIHsKKyAgICB1c2luZyBDMkNvbnN0TGluZWFyQmxvY2s6OkMyQ29uc3RMaW5lYXJCbG9jazsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkxpbmVhckJsb2NrOworfTsKKworY2xhc3MgTGluZWFyQmxvY2tCdWRkeSA6IHB1YmxpYyBDMkxpbmVhckJsb2NrIHsKKyAgICB1c2luZyBDMkxpbmVhckJsb2NrOjpDMkxpbmVhckJsb2NrOworICAgIGZyaWVuZCBjbGFzcyA6OkMyQmFzaWNMaW5lYXJCbG9ja1Bvb2w7Cit9OworCitjbGFzcyBBY3F1aXJhYmxlUmVhZFZpZXdCdWRkeSA6IHB1YmxpYyBDMkFjcXVpcmFibGU8QzJSZWFkVmlldz4geworICAgIHVzaW5nIEMyQWNxdWlyYWJsZTo6QzJBY3F1aXJhYmxlOworICAgIGZyaWVuZCBjbGFzcyA6OkMyQ29uc3RMaW5lYXJCbG9jazsKK307CisKK2NsYXNzIEFjcXVpcmFibGVXcml0ZVZpZXdCdWRkeSA6IHB1YmxpYyBDMkFjcXVpcmFibGU8QzJXcml0ZVZpZXc+IHsKKyAgICB1c2luZyBDMkFjcXVpcmFibGU6OkMyQWNxdWlyYWJsZTsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkxpbmVhckJsb2NrOworfTsKKworY2xhc3MgR3JhcGhpY1ZpZXdCdWRkeSA6IHB1YmxpYyBDMkdyYXBoaWNWaWV3IHsKKyAgICB1c2luZyBDMkdyYXBoaWNWaWV3OjpDMkdyYXBoaWNWaWV3OworICAgIGZyaWVuZCBjbGFzcyA6OkMyQ29uc3RHcmFwaGljQmxvY2s7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJHcmFwaGljQmxvY2s7Cit9OworCitjbGFzcyBBY3F1aXJhYmxlQ29uc3RHcmFwaGljVmlld0J1ZGR5IDogcHVibGljIEMyQWNxdWlyYWJsZTxjb25zdCBDMkdyYXBoaWNWaWV3PiB7CisgICAgdXNpbmcgQzJBY3F1aXJhYmxlOjpDMkFjcXVpcmFibGU7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJDb25zdEdyYXBoaWNCbG9jazsKK307CisKK2NsYXNzIEFjcXVpcmFibGVHcmFwaGljVmlld0J1ZGR5IDogcHVibGljIEMyQWNxdWlyYWJsZTxDMkdyYXBoaWNWaWV3PiB7CisgICAgdXNpbmcgQzJBY3F1aXJhYmxlOjpDMkFjcXVpcmFibGU7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJHcmFwaGljQmxvY2s7Cit9OworCitjbGFzcyBDb25zdEdyYXBoaWNCbG9ja0J1ZGR5IDogcHVibGljIEMyQ29uc3RHcmFwaGljQmxvY2sgeworICAgIHVzaW5nIEMyQ29uc3RHcmFwaGljQmxvY2s6OkMyQ29uc3RHcmFwaGljQmxvY2s7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJHcmFwaGljQmxvY2s7Cit9OworCitjbGFzcyBHcmFwaGljQmxvY2tCdWRkeSA6IHB1YmxpYyBDMkdyYXBoaWNCbG9jayB7CisgICAgdXNpbmcgQzJHcmFwaGljQmxvY2s6OkMyR3JhcGhpY0Jsb2NrOworICAgIGZyaWVuZCBjbGFzcyA6OkMyQmFzaWNHcmFwaGljQmxvY2tQb29sOworfTsKKworY2xhc3MgQnVmZmVyRGF0YUJ1ZGR5IDogcHVibGljIEMyQnVmZmVyRGF0YSB7CisgICAgdXNpbmcgQzJCdWZmZXJEYXRhOjpDMkJ1ZmZlckRhdGE7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJCdWZmZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IDFEIEJMT0NLID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIDFEIGJsb2NrIGFuZCB2aWV3IGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiBUaGlzIGlzIGJhc2ljYWxseSBqdXN0IGEgcGxhY2Vob2xkZXIgZm9yIHRoZSB1bmRlcmx5aW5nIDFEIGFsbG9jYXRpb24gYW5kIHRoZSByYW5nZSBvZiB0aGUKKyAqIGFsbG90ZWQgcG9ydGlvbiB0byB0aGlzIGJsb2NrLiBUaGVyZSBpcyBhbHNvIGEgcGxhY2Vob2xkZXIgZm9yIGEgYmxvY2twb29sIGRhdGEuCisgKi8KK2NsYXNzIEMyX0hJREUgX0MyQmxvY2sxREltcGwgOiBwdWJsaWMgX0MyTGluZWFyUmFuZ2VBc3BlY3QgeworcHVibGljOgorICAgIF9DMkJsb2NrMURJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiAmcG9vbERhdGEgPSBudWxscHRyLAorICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IDAsIHNpemVfdCBzaXplID0gfihzaXplX3QpMCkKKyAgICAgICAgOiBfQzJMaW5lYXJSYW5nZUFzcGVjdChhbGxvYy5nZXQoKSwgb2Zmc2V0LCBzaXplKSwKKyAgICAgICAgICBtQWxsb2NhdGlvbihhbGxvYyksCisgICAgICAgICAgbVBvb2xEYXRhKHBvb2xEYXRhKSB7IH0KKworICAgIF9DMkJsb2NrMURJbXBsKGNvbnN0IF9DMkJsb2NrMURJbXBsICZvdGhlciwgc2l6ZV90IG9mZnNldCA9IDAsIHNpemVfdCBzaXplID0gfihzaXplX3QpMCkKKyAgICAgICAgOiBfQzJMaW5lYXJSYW5nZUFzcGVjdCgmb3RoZXIsIG9mZnNldCwgc2l6ZSksCisgICAgICAgICAgbUFsbG9jYXRpb24ob3RoZXIubUFsbG9jYXRpb24pLAorICAgICAgICAgIG1Qb29sRGF0YShvdGhlci5tUG9vbERhdGEpIHsgfQorCisgICAgLyoqIHJldHVybnMgcG9vbCBkYXRhICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Qb29sRGF0YTsKKyAgICB9CisKKyAgICAvKiogcmV0dXJucyBuYXRpdmUgaGFuZGxlICovCisgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uID8gbUFsbG9jYXRpb24tPmhhbmRsZSgpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICAvKiogcmV0dXJucyB0aGUgYWxsb2NhdG9yJ3MgSUQgKi8KKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IHsKKyAgICAgICAgLy8gQkFEX0lEIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGlzIEltcGwgY2xhc3MgaXMgaW5pdGlhbGl6ZWQgZm9yIGEgdmlldyAtIG5ldmVyIGZvciBhIGJsb2NrLgorICAgICAgICByZXR1cm4gbUFsbG9jYXRpb24gPyBtQWxsb2NhdGlvbi0+Z2V0QWxsb2NhdG9ySWQoKSA6IEMyQWxsb2NhdG9yOjpCQURfSUQ7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gZ2V0QWxsb2NhdGlvbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gbVBvb2xEYXRhOworfTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHRoZSBtYXBwZWQgZGF0YSBwb2ludGVyLCBhbmQgdGhlIHBvdGVudGlhbCBlcnJvci4KKyAqCisgKiByYW5nZSBpcyB0aGUgbWFwcGVkIHJhbmdlIG9mIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRpb24gKHdoaWNoIGlzIHBhcnQgb2YgdGhlIGFsbG90dGVkCisgKiByYW5nZSkuCisgKi8KK2NsYXNzIEMyX0hJREUgX0MyTWFwcGVkQmxvY2sxREltcGwgOiBwdWJsaWMgX0MyQmxvY2sxREltcGwgeworcHVibGljOgorICAgIF9DMk1hcHBlZEJsb2NrMURJbXBsKGNvbnN0IF9DMkJsb2NrMURJbXBsICZibG9jaywgdWludDhfdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMCwgc2l6ZV90IHNpemUgPSB+KHNpemVfdCkwKQorICAgICAgICA6IF9DMkJsb2NrMURJbXBsKGJsb2NrLCBvZmZzZXQsIHNpemUpLCBtRGF0YShkYXRhKSwgbUVycm9yKEMyX09LKSB7IH0KKworICAgIF9DMk1hcHBlZEJsb2NrMURJbXBsKGMyX3N0YXR1c190IGVycm9yKQorICAgICAgICA6IF9DMkJsb2NrMURJbXBsKG51bGxwdHIpLCBtRGF0YShudWxscHRyKSwgbUVycm9yKGVycm9yKSB7CisgICAgICAgIC8vIENIRUNLKGVycm9yICE9IEMyX09LKTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURhdGE7CisgICAgfQorCisgICAgdWludDhfdCAqZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGVycm9yKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUVycm9yOworICAgIH0KKworcHJpdmF0ZToKKyAgICB1aW50OF90ICptRGF0YTsKKyAgICBjMl9zdGF0dXNfdCBtRXJyb3I7Cit9OworCisvKioKKyAqIEJsb2NrIGltcGxlbWVudGF0aW9uLgorICovCitjbGFzcyBDMkJsb2NrMUQ6OkltcGwgOiBwdWJsaWMgX0MyQmxvY2sxREltcGwgeworICAgIHVzaW5nIF9DMkJsb2NrMURJbXBsOjpfQzJCbG9jazFESW1wbDsKK307CisKK2NvbnN0IEMySGFuZGxlICpDMkJsb2NrMUQ6OmhhbmRsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmhhbmRsZSgpOworfTsKKworQzJBbGxvY2F0b3I6OmlkX3QgQzJCbG9jazFEOjpnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldEFsbG9jYXRvcklkKCk7Cit9OworCitDMkJsb2NrMUQ6OkMyQmxvY2sxRChzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnJhbmdlKQorICAgIC8vIGFsd2F5cyBjbGFtcCBzdWJyYW5nZSB0byBwYXJlbnQgKGltcGwpIHJhbmdlIGZvciBzYWZldHkKKyAgICA6IF9DMkxpbmVhclJhbmdlQXNwZWN0KGltcGwuZ2V0KCksIHJhbmdlLm9mZnNldCgpLCByYW5nZS5zaXplKCkpLCBtSW1wbChpbXBsKSB7Cit9CisKKy8qKgorICogUmVhZCB2aWV3IGltcGxlbWVudGF0aW9uLgorICoKKyAqIHJhbmdlIG9mIEltcGwgaXMgdGhlIG1hcHBlZCByYW5nZSBvZiB0aGUgdW5kZXJseWluZyBhbGxvY2F0aW9uICh3aGljaCBpcyBwYXJ0IG9mIHRoZSBhbGxvdHRlZAorICogcmFuZ2UpLiByYW5nZSBvZiBWaWV3IGlzIDAgdG8gY2FwYWNpdHkoKSAobm90IHJlcHJlc2VudGVkIGFzIGFuIGFjdHVhbCByYW5nZSkuIFRoaXMgbWFwcyB0byBhCisgKiBzdWJyYW5nZSBvZiBJbXBsIHJhbmdlIHN0YXJ0aW5nIGF0IG1JbXBsLT5vZmZzZXQoKSArIF9tT2Zmc2V0LgorICovCitjbGFzcyBDMlJlYWRWaWV3OjpJbXBsIDogcHVibGljIF9DMk1hcHBlZEJsb2NrMURJbXBsIHsKKyAgICB1c2luZyBfQzJNYXBwZWRCbG9jazFESW1wbDo6X0MyTWFwcGVkQmxvY2sxREltcGw7Cit9OworCitDMlJlYWRWaWV3OjpDMlJlYWRWaWV3KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHNpemUpCisgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChDMkxpbmVhckNhcGFjaXR5KGltcGwtPnNpemUoKSkucmFuZ2Uob2Zmc2V0LCBzaXplKS5zaXplKCkpLAorICAgICAgbUltcGwoaW1wbCksCisgICAgICBtT2Zmc2V0KEMyTGluZWFyQ2FwYWNpdHkoaW1wbC0+c2l6ZSgpKS5yYW5nZShvZmZzZXQsIHNpemUpLm9mZnNldCgpKSB7IH0KKworQzJSZWFkVmlldzo6QzJSZWFkVmlldyhjMl9zdGF0dXNfdCBlcnJvcikKKyAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KDB1KSwgbUltcGwoc3RkOjptYWtlX3NoYXJlZDxJbXBsPihlcnJvcikpLCBtT2Zmc2V0KDB1KSB7CisgICAgLy8gQ0hFQ0soZXJyb3IgIT0gQzJfT0spOworfQorCitjb25zdCB1aW50OF90ICpDMlJlYWRWaWV3OjpkYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+ZXJyb3IoKSA/IG51bGxwdHIgOiBtSW1wbC0+ZGF0YSgpICsgbU9mZnNldDsKK30KKworYzJfc3RhdHVzX3QgQzJSZWFkVmlldzo6ZXJyb3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5lcnJvcigpOworfQorCitDMlJlYWRWaWV3IEMyUmVhZFZpZXc6OnN1YlZpZXcoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIGNvbnN0IHsKKyAgICBDMkxpbmVhclJhbmdlIHN1YlJhbmdlKCp0aGlzLCBvZmZzZXQsIHNpemUpOworICAgIHJldHVybiBDMlJlYWRWaWV3KG1JbXBsLCBtT2Zmc2V0ICsgc3ViUmFuZ2Uub2Zmc2V0KCksIHN1YlJhbmdlLnNpemUoKSk7Cit9CisKKy8qKgorICogV3JpdGUgdmlldyBpbXBsZW1lbnRhdGlvbi4KKyAqLworY2xhc3MgQzJXcml0ZVZpZXc6OkltcGwgOiBwdWJsaWMgX0MyTWFwcGVkQmxvY2sxREltcGwgeworICAgIHVzaW5nIF9DMk1hcHBlZEJsb2NrMURJbXBsOjpfQzJNYXBwZWRCbG9jazFESW1wbDsKK307CisKK0MyV3JpdGVWaWV3OjpDMldyaXRlVmlldyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCkKKy8vIFVHTFk6IF9DMkxpbmVhclJhbmdlQXNwZWN0IHJlcXVpcmVzIGEgYm9uYS1maWRlIG9iamVjdCBmb3IgY2FwYWNpdHkgdG8gcHJldmVudCBzcG9vZmluZywgc28KKy8vIHRoaXMgaXMgd2hhdCB3ZSBoYXZlIHRvIGRvLgorLy8gVE9ETzogdXNlIGNoaWxkUmFuZ2UKKyAgICA6IF9DMkVkaXRhYmxlTGluZWFyUmFuZ2VBc3BlY3Qoc3RkOjptYWtlX3VuaXF1ZTxDMkxpbmVhckNhcGFjaXR5PihpbXBsLT5zaXplKCkpLmdldCgpKSwgbUltcGwoaW1wbCkgeyB9CisKK0MyV3JpdGVWaWV3OjpDMldyaXRlVmlldyhjMl9zdGF0dXNfdCBlcnJvcikKKyAgICA6IF9DMkVkaXRhYmxlTGluZWFyUmFuZ2VBc3BlY3QobnVsbHB0ciksIG1JbXBsKHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oZXJyb3IpKSB7fQorCit1aW50OF90ICpDMldyaXRlVmlldzo6YmFzZSgpIHsgcmV0dXJuIG1JbXBsLT5kYXRhKCk7IH0KKwordWludDhfdCAqQzJXcml0ZVZpZXc6OmRhdGEoKSB7IHJldHVybiBtSW1wbC0+ZGF0YSgpICsgb2Zmc2V0KCk7IH0KKworYzJfc3RhdHVzX3QgQzJXcml0ZVZpZXc6OmVycm9yKCkgY29uc3QgeyByZXR1cm4gbUltcGwtPmVycm9yKCk7IH0KKworLyoqCisgKiBDb25zdCBsaW5lYXIgYmxvY2sgaW1wbGVtZW50YXRpb24uCisgKi8KK0MyQ29uc3RMaW5lYXJCbG9jazo6QzJDb25zdExpbmVhckJsb2NrKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJMaW5lYXJSYW5nZUFzcGVjdCAmcmFuZ2UsIEMyRmVuY2UgZmVuY2UpCisgICAgOiBDMkJsb2NrMUQoaW1wbCwgcmFuZ2UpLCBtRmVuY2UoZmVuY2UpIHsgfQorCitDMkFjcXVpcmFibGU8QzJSZWFkVmlldz4gQzJDb25zdExpbmVhckJsb2NrOjptYXAoKSBjb25zdCB7CisgICAgdm9pZCAqYmFzZSA9IG51bGxwdHI7CisgICAgdWludDMyX3QgbGVuID0gc2l6ZSgpOworICAgIGMyX3N0YXR1c190IGVycm9yID0gbUltcGwtPmdldEFsbG9jYXRpb24oKS0+bWFwKAorICAgICAgICAgICAgb2Zmc2V0KCksIGxlbiwgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgMCB9LCBudWxscHRyLCAmYmFzZSk7CisgICAgLy8gVE9ETzogd2FpdCBvbiBmZW5jZQorICAgIGlmIChlcnJvciA9PSBDMl9PSykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVhZFZpZXdCdWRkeTo6SW1wbD4gcnZpID0gc3RkOjpzaGFyZWRfcHRyPFJlYWRWaWV3QnVkZHk6OkltcGw+KAorICAgICAgICAgICAgICAgIG5ldyBSZWFkVmlld0J1ZGR5OjpJbXBsKCptSW1wbCwgKHVpbnQ4X3QgKiliYXNlLCBvZmZzZXQoKSwgbGVuKSwKKyAgICAgICAgICAgICAgICBbYmFzZSwgbGVuXShSZWFkVmlld0J1ZGR5OjpJbXBsICppKSB7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKWktPmdldEFsbG9jYXRpb24oKS0+dW5tYXAoYmFzZSwgbGVuLCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gQWNxdWlyYWJsZVJlYWRWaWV3QnVkZHkoZXJyb3IsIEMyRmVuY2UoKSwgUmVhZFZpZXdCdWRkeShydmksIDAsIGxlbikpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBY3F1aXJhYmxlUmVhZFZpZXdCdWRkeShlcnJvciwgQzJGZW5jZSgpLCBSZWFkVmlld0J1ZGR5KGVycm9yKSk7CisgICAgfQorfQorCitDMkNvbnN0TGluZWFyQmxvY2sgQzJDb25zdExpbmVhckJsb2NrOjpzdWJCbG9jayhzaXplX3Qgb2Zmc2V0Xywgc2l6ZV90IHNpemVfKSBjb25zdCB7CisgICAgQzJMaW5lYXJSYW5nZSBzdWJSYW5nZSgqbUltcGwsIG9mZnNldF8sIHNpemVfKTsKKyAgICByZXR1cm4gQzJDb25zdExpbmVhckJsb2NrKG1JbXBsLCBzdWJSYW5nZSwgbUZlbmNlKTsKK30KKworLyoqCisgKiBMaW5lYXIgYmxvY2sgaW1wbGVtZW50YXRpb24uCisgKi8KK0MyTGluZWFyQmxvY2s6OkMyTGluZWFyQmxvY2soc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZyYW5nZSkKKyAgICA6IEMyQmxvY2sxRChpbXBsLCByYW5nZSkgeyB9CisKK0MyQWNxdWlyYWJsZTxDMldyaXRlVmlldz4gQzJMaW5lYXJCbG9jazo6bWFwKCkgeworICAgIHZvaWQgKmJhc2UgPSBudWxscHRyOworICAgIHVpbnQzMl90IGxlbiA9IHNpemUoKTsKKyAgICBjMl9zdGF0dXNfdCBlcnJvciA9IG1JbXBsLT5nZXRBbGxvY2F0aW9uKCktPm1hcCgKKyAgICAgICAgICAgIG9mZnNldCgpLCBsZW4sIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LCBudWxscHRyLCAmYmFzZSk7CisgICAgLy8gVE9ETzogd2FpdCBvbiBmZW5jZQorICAgIGlmIChlcnJvciA9PSBDMl9PSykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8V3JpdGVWaWV3QnVkZHk6OkltcGw+IHJ2aSA9IHN0ZDo6c2hhcmVkX3B0cjxXcml0ZVZpZXdCdWRkeTo6SW1wbD4oCisgICAgICAgICAgICAgICAgbmV3IFdyaXRlVmlld0J1ZGR5OjpJbXBsKCptSW1wbCwgKHVpbnQ4X3QgKiliYXNlLCAwLCBsZW4pLAorICAgICAgICAgICAgICAgIFtiYXNlLCBsZW5dKFdyaXRlVmlld0J1ZGR5OjpJbXBsICppKSB7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKWktPmdldEFsbG9jYXRpb24oKS0+dW5tYXAoYmFzZSwgbGVuLCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gQWNxdWlyYWJsZVdyaXRlVmlld0J1ZGR5KGVycm9yLCBDMkZlbmNlKCksIFdyaXRlVmlld0J1ZGR5KHJ2aSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBY3F1aXJhYmxlV3JpdGVWaWV3QnVkZHkoZXJyb3IsIEMyRmVuY2UoKSwgV3JpdGVWaWV3QnVkZHkoZXJyb3IpKTsKKyAgICB9Cit9CisKK0MyQ29uc3RMaW5lYXJCbG9jayBDMkxpbmVhckJsb2NrOjpzaGFyZShzaXplX3Qgb2Zmc2V0Xywgc2l6ZV90IHNpemVfLCBDMkZlbmNlIGZlbmNlKSB7CisgICAgcmV0dXJuIENvbnN0TGluZWFyQmxvY2tCdWRkeShtSW1wbCwgQzJMaW5lYXJSYW5nZSgqdGhpcywgb2Zmc2V0Xywgc2l6ZV8pLCBmZW5jZSk7Cit9CisKK0MyQmFzaWNMaW5lYXJCbG9ja1Bvb2w6OkMyQmFzaWNMaW5lYXJCbG9ja1Bvb2woCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvcikgeyB9CisKK2MyX3N0YXR1c190IEMyQmFzaWNMaW5lYXJCbG9ja1Bvb2w6OmZldGNoTGluZWFyQmxvY2soCisgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICBibG9jay0+cmVzZXQoKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IGFsbG9jOworICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPm5ld0xpbmVhckFsbG9jYXRpb24oY2FwYWNpdHksIHVzYWdlLCAmYWxsb2MpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAqYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKGFsbG9jKTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RydWN0IEMyX0hJREUgQzJQb29sZWRCbG9ja1Bvb2xEYXRhIDogX0MyQmxvY2tQb29sRGF0YSB7CisKKyAgICB2aXJ0dWFsIHR5cGVfdCBnZXRUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gVFlQRV9CVUZGRVJQT09MOworICAgIH0KKworICAgIHZvaWQgZ2V0QnVmZmVyUG9vbERhdGEoc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqZGF0YSkgY29uc3QgeworICAgICAgICAqZGF0YSA9IG1EYXRhOworICAgIH0KKworICAgIEMyUG9vbGVkQmxvY2tQb29sRGF0YShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZkYXRhKSA6IG1EYXRhKGRhdGEpIHt9CisKKyAgICB2aXJ0dWFsIH5DMlBvb2xlZEJsb2NrUG9vbERhdGEoKSBvdmVycmlkZSB7fQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gbURhdGE7Cit9OworCitib29sIF9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUG9vbERhdGEoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBfQzJCbG9ja1Bvb2xEYXRhPiAmZGF0YSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyUG9vbERhdGEpIHsKKyAgICBpZiAoZGF0YSAmJiBkYXRhLT5nZXRUeXBlKCkgPT0gX0MyQmxvY2tQb29sRGF0YTo6VFlQRV9CVUZGRVJQT09MKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBvb2xlZEJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJQb29sZWRCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICAgICAgcG9vbERhdGEtPmdldEJ1ZmZlclBvb2xEYXRhKGJ1ZmZlclBvb2xEYXRhKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+ICZkYXRhLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrMUQ6OkltcGw+IGltcGwgPQorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyQmxvY2sxRDo6SW1wbD4oYWxsb2MsIGRhdGEsIG9mZnNldCwgc2l6ZSk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPihuZXcgQzJMaW5lYXJCbG9jayhpbXBsLCAqaW1wbCkpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gX0MyQmxvY2tGYWN0b3J5OjpHZXRMaW5lYXJCbG9ja1Bvb2xEYXRhKAorICAgICAgICBjb25zdCBDMkJsb2NrMUQgJmJsb2NrKSB7CisgICAgaWYgKGJsb2NrLm1JbXBsKSB7CisgICAgICAgIHJldHVybiBibG9jay5tSW1wbC0+cG9vbERhdGEoKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKSB7CisgICAgLy8gVE9ETzogZ2V0IHByb3BlciBhbGxvY2F0b3I/IGFuZCBtdXRleD8KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9ySW9uPiBzQWxsb2NhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxDMkFsbG9jYXRvcklvbj4oMCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBpZiAoQzJBbGxvY2F0b3JJb246OmlzVmFsaWQoaGFuZGxlKSkgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBzQWxsb2NhdG9yLT5wcmlvckxpbmVhckFsbG9jYXRpb24oaGFuZGxlLCAmYWxsb2MpOworICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKGFsbG9jKTsKKyAgICAgICAgICAgIHJldHVybiBibG9jazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjSGFuZGxlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZkYXRhKSB7CisgICAgLy8gVE9ETzogZ2V0IHByb3BlciBhbGxvY2F0b3I/IGFuZCBtdXRleD8KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9ySW9uPiBzQWxsb2NhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxDMkFsbG9jYXRvcklvbj4oMCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBpZiAoQzJBbGxvY2F0b3JJb246OmlzVmFsaWQoY0hhbmRsZSkpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKGNIYW5kbGUpOworICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBzQWxsb2NhdG9yLT5wcmlvckxpbmVhckFsbG9jYXRpb24oaGFuZGxlLCAmYWxsb2MpOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4oZGF0YSk7CisgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LICYmIHBvb2xEYXRhKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogY29uZmlnIHBhcmFtcz8KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhhbGxvYywgcG9vbERhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiBibG9jazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK307CisKKy8qKgorICogV3JhcHBlZCBDMkFsbG9jYXRvciB3aGljaCBpcyBpbmplY3RlZCB0byBidWZmZXIgcG9vbCBvbiBiZWhhbGYgb2YKKyAqIEMyQmxvY2tQb29sLgorICovCitjbGFzcyBfQzJCdWZmZXJQb29sQWxsb2NhdG9yIDogcHVibGljIEJ1ZmZlclBvb2xBbGxvY2F0b3IgeworcHVibGljOgorICAgIF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgICAgICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSB7fQorCisgICAgfl9DMkJ1ZmZlclBvb2xBbGxvY2F0b3IoKSBvdmVycmlkZSB7fQorCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmFsbG9jU2l6ZSkgb3ZlcnJpZGU7CisKKyAgICBib29sIGNvbXBhdGlibGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm5ld1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgb3ZlcnJpZGU7CisKKyAgICAvLyBNZXRob2RzIGZvciBjb2RlYzIgY29tcG9uZW50IChDMkJsb2NrUG9vbCkuCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtcyBsaW5lYXIgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIGZvciBDMkFsbG9jYXRvciB0byBwYXJhbWV0ZXJzCisgICAgICogZm9yIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNhcGFjaXR5ICAgICAgc2l6ZSBvZiBsaW5lYXIgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSB1c2FnZSAgICAgICAgIG1lbW9yeSB1c2FnZSBwYXR0ZXJuIGZvciBsaW5lYXIgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgICAgIGFsbG9jYXRpb24gcGFyYW1ldGVycyBmb3IgYnVmZmVyIHBvb2wKKyAgICAgKi8KKyAgICB2b2lkIGdldExpbmVhclBhcmFtcyh1aW50MzJfdCBjYXBhY2l0eSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKTsKKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybXMgZ3JhcGhpYyBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgZm9yIEMyQWxsb2NhdG9yIHRvIHBhcmFtZXRlcnMKKyAgICAgKiBmb3IgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2lkdGggICAgICAgICB3aWR0aCBvZiBncmFwaGljIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gaGVpZ2h0ICAgICAgICBoZWlnaHQgb2YgZ3JhcGhpYyBhbGxvY2F0aW9uCisgICAgICogQHBhcmFtIGZvcm1hdCAgICAgICAgY29sb3IgZm9ybWF0IG9mIGdyYXBoaWMgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgICAgIGFsbG9jYXRpb24gcGFyYW1ldGVyIGZvciBidWZmZXIgcG9vbAorICAgICAqLworICAgIHZvaWQgZ2V0R3JhcGhpY1BhcmFtcyh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpOworCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtcyBhbiBleGlzdGluZyBuYXRpdmUgaGFuZGxlIHRvIGFuIEMyTGluZWFyQWxsY2F0aW9uLgorICAgICAqIFdyYXBwZXIgdG8gQzJBbGxvY2F0b3IjcHJpb3JMaW5lYXJBbGxvY2F0aW9uCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgcHJpb3JMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICpjMkFsbG9jYXRpb24pOworCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtcyBhbiBleGlzdGluZyBuYXRpdmUgaGFuZGxlIHRvIGFuIEMyR3JhcGhpY0FsbGNhdGlvbi4KKyAgICAgKiBXcmFwcGVyIHRvIEMyQWxsb2NhdG9yI3ByaW9yR3JhcGhpY0FsbG9jYXRpb24KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBwcmlvckdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYzJBbGxvY2F0aW9uKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3RleHByIGludCBrTWF4SW50UGFyYW1zID0gNTsgLy8gbGFyZ2UgZW5vdWdoIG51bWJlcjsKKworICAgIGVudW0gQWxsb2NUeXBlIDogdWludDhfdCB7CisgICAgICAgIEFMTE9DX05PTkUgPSAwLAorCisgICAgICAgIEFMTE9DX0xJTkVBUiwKKyAgICAgICAgQUxMT0NfR1JBUEhJQywKKyAgICB9OworCisgICAgdW5pb24gQWxsb2NQYXJhbXMgeworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgQWxsb2NUeXBlIGFsbG9jVHlwZTsKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2U7CisgICAgICAgICAgICB1aW50MzJfdCBwYXJhbXNba01heEludFBhcmFtc107CisgICAgICAgIH0gZGF0YTsKKyAgICAgICAgdWludDhfdCBhcnJheVswXTsKKworICAgICAgICBBbGxvY1BhcmFtcygpIDogZGF0YXtBTExPQ19OT05FLCB7MCwgMH0sIHswfX0ge30KKyAgICAgICAgQWxsb2NQYXJhbXMoQzJNZW1vcnlVc2FnZSB1c2FnZSwgdWludDMyX3QgY2FwYWNpdHkpCisgICAgICAgICAgICA6IGRhdGF7QUxMT0NfTElORUFSLCB1c2FnZSwge1swXSA9IGNhcGFjaXR5fX0ge30KKyAgICAgICAgQWxsb2NQYXJhbXMoCisgICAgICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQpCisgICAgICAgICAgICAgICAgOiBkYXRhe0FMTE9DX0dSQVBISUMsIHVzYWdlLCB7d2lkdGgsIGhlaWdodCwgZm9ybWF0fX0ge30KKyAgICB9OworCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworfTsKKworc3RydWN0IExpbmVhckFsbG9jYXRpb25EdG9yIHsKKyAgICBMaW5lYXJBbGxvY2F0aW9uRHRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAmYWxsb2MpCisgICAgICAgIDogbUFsbG9jYXRpb24oYWxsb2MpIHt9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoQnVmZmVyUG9vbEFsbG9jYXRpb24gKnBvb2xBbGxvYykgeyBkZWxldGUgcG9vbEFsbG9jOyB9CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKK307CisKK3N0cnVjdCBHcmFwaGljQWxsb2NhdGlvbkR0b3IgeworICAgIEdyYXBoaWNBbGxvY2F0aW9uRHRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gJmFsbG9jKQorICAgICAgICA6IG1BbGxvY2F0aW9uKGFsbG9jKSB7fQorCisgICAgdm9pZCBvcGVyYXRvcigpKEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwb29sQWxsb2MpIHsgZGVsZXRlIHBvb2xBbGxvYzsgfQorCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IG1BbGxvY2F0aW9uOworfTsKKworUmVzdWx0U3RhdHVzIF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I6OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAgJnBhcmFtcywKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgICAgIHNpemVfdCAqYWxsb2NTaXplKSB7CisgICAgQWxsb2NQYXJhbXMgYzJQYXJhbXM7CisgICAgbWVtY3B5KCZjMlBhcmFtcywgcGFyYW1zLmRhdGEoKSwgc3RkOjptaW4oc2l6ZW9mKEFsbG9jUGFyYW1zKSwgcGFyYW1zLnNpemUoKSkpOworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IEMyX0JBRF9WQUxVRTsKKyAgICBzd2l0Y2goYzJQYXJhbXMuZGF0YS5hbGxvY1R5cGUpIHsKKyAgICAgICAgY2FzZSBBTExPQ19OT05FOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUxMT0NfTElORUFSOiB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBjMkxpbmVhcjsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1BbGxvY2F0b3ItPm5ld0xpbmVhckFsbG9jYXRpb24oCisgICAgICAgICAgICAgICAgICAgIGMyUGFyYW1zLmRhdGEucGFyYW1zWzBdLCBjMlBhcmFtcy5kYXRhLnVzYWdlLCAmYzJMaW5lYXIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9PSyAmJiBjMkxpbmVhcikgeworICAgICAgICAgICAgICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwdHIgPSBuZXcgQnVmZmVyUG9vbEFsbG9jYXRpb24oYzJMaW5lYXItPmhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICAgICAgICAgICphbGxvYyA9IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyLCBMaW5lYXJBbGxvY2F0aW9uRHRvcihjMkxpbmVhcikpOworICAgICAgICAgICAgICAgICAgICBpZiAoKmFsbG9jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqYWxsb2NTaXplID0gKHNpemVfdCljMlBhcmFtcy5kYXRhLnBhcmFtc1swXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQUxMT0NfR1JBUEhJQzogeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGMyR3JhcGhpYzsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1BbGxvY2F0b3ItPm5ld0dyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICBjMlBhcmFtcy5kYXRhLnBhcmFtc1swXSwKKyAgICAgICAgICAgICAgICAgICAgYzJQYXJhbXMuZGF0YS5wYXJhbXNbMV0sCisgICAgICAgICAgICAgICAgICAgIGMyUGFyYW1zLmRhdGEucGFyYW1zWzJdLAorICAgICAgICAgICAgICAgICAgICBjMlBhcmFtcy5kYXRhLnVzYWdlLCAmYzJHcmFwaGljKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfT0sgJiYgYzJHcmFwaGljKSB7CisgICAgICAgICAgICAgICAgQnVmZmVyUG9vbEFsbG9jYXRpb24gKnB0ciA9IG5ldyBCdWZmZXJQb29sQWxsb2NhdGlvbihjMkdyYXBoaWMtPmhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICAgICAgICAgICphbGxvYyA9IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyLCBHcmFwaGljQWxsb2NhdGlvbkR0b3IoYzJHcmFwaGljKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYWxsb2MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICphbGxvY1NpemUgPSBjMlBhcmFtcy5kYXRhLnBhcmFtc1swXSAqIGMyUGFyYW1zLmRhdGEucGFyYW1zWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHB0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworYm9vbCBfQzJCdWZmZXJQb29sQWxsb2NhdG9yOjpjb21wYXRpYmxlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAgJm5ld1BhcmFtcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gICZvbGRQYXJhbXMpIHsKKyAgICBBbGxvY1BhcmFtcyBuZXdBbGxvYzsKKyAgICBBbGxvY1BhcmFtcyBvbGRBbGxvYzsKKyAgICBtZW1jcHkoJm5ld0FsbG9jLCBuZXdQYXJhbXMuZGF0YSgpLCBzdGQ6Om1pbihzaXplb2YoQWxsb2NQYXJhbXMpLCBuZXdQYXJhbXMuc2l6ZSgpKSk7CisgICAgbWVtY3B5KCZvbGRBbGxvYywgb2xkUGFyYW1zLmRhdGEoKSwgc3RkOjptaW4oc2l6ZW9mKEFsbG9jUGFyYW1zKSwgb2xkUGFyYW1zLnNpemUoKSkpOworCisgICAgLy8gVE9ETzogc3VwcG9ydCBub3QgZXhhY3QgbWF0Y2hpbmcuIGUuZykgbmV3Q2FwYWNpdHkgPCBvbGRDYXBhY2l0eQorICAgIGlmIChuZXdBbGxvYy5kYXRhLmFsbG9jVHlwZSA9PSBvbGRBbGxvYy5kYXRhLmFsbG9jVHlwZSAmJgorICAgICAgICAgICAgbmV3QWxsb2MuZGF0YS51c2FnZS5leHBlY3RlZCA9PSBvbGRBbGxvYy5kYXRhLnVzYWdlLmV4cGVjdGVkKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga01heEludFBhcmFtczsgKytpKSB7CisgICAgICAgICAgICBpZiAobmV3QWxsb2MuZGF0YS5wYXJhbXNbaV0gIT0gb2xkQWxsb2MuZGF0YS5wYXJhbXNbaV0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBfQzJCdWZmZXJQb29sQWxsb2NhdG9yOjpnZXRMaW5lYXJQYXJhbXMoCisgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKSB7CisgICAgQWxsb2NQYXJhbXMgYzJQYXJhbXModXNhZ2UsIGNhcGFjaXR5KTsKKyAgICBwYXJhbXMtPmFzc2lnbihjMlBhcmFtcy5hcnJheSwgYzJQYXJhbXMuYXJyYXkgKyBzaXplb2YoQWxsb2NQYXJhbXMpKTsKK30KKwordm9pZCBfQzJCdWZmZXJQb29sQWxsb2NhdG9yOjpnZXRHcmFwaGljUGFyYW1zKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpIHsKKyAgICBBbGxvY1BhcmFtcyBjMlBhcmFtcyh1c2FnZSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKKyAgICBwYXJhbXMtPmFzc2lnbihjMlBhcmFtcy5hcnJheSwgYzJQYXJhbXMuYXJyYXkgKyBzaXplb2YoQWxsb2NQYXJhbXMpKTsKK30KKworYzJfc3RhdHVzX3QgX0MyQnVmZmVyUG9vbEFsbG9jYXRvcjo6cHJpb3JMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYzJBbGxvY2F0aW9uKSB7CisgICAgcmV0dXJuIG1BbGxvY2F0b3ItPnByaW9yTGluZWFyQWxsb2NhdGlvbihoYW5kbGUsIGMyQWxsb2NhdGlvbik7Cit9CisKK2MyX3N0YXR1c190IF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I6OnByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYzJBbGxvY2F0aW9uKSB7CisgICAgcmV0dXJuIG1BbGxvY2F0b3ItPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oaGFuZGxlLCBjMkFsbG9jYXRpb24pOworfQorCitjbGFzcyBDMlBvb2xlZEJsb2NrUG9vbDo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgICAgICAgICA6IG1Jbml0KEMyX09LKSwKKyAgICAgICAgICAgICAgbUJ1ZmZlclBvb2xNYW5hZ2VyKENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCkpLAorICAgICAgICAgICAgICBtQWxsb2NhdG9yKHN0ZDo6bWFrZV9zaGFyZWQ8X0MyQnVmZmVyUG9vbEFsbG9jYXRvcj4oYWxsb2NhdG9yKSkgeworICAgICAgICBpZiAobUFsbG9jYXRvciAmJiBtQnVmZmVyUG9vbE1hbmFnZXIpIHsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyUG9vbE1hbmFnZXItPmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgbUFsbG9jYXRvciwgJm1Db25uZWN0aW9uSWQpID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUluaXQgPSBDMl9OT19JTklUOworICAgIH0KKworICAgIH5JbXBsKCkgeworICAgICAgICBpZiAobUluaXQgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIG1CdWZmZXJQb29sTWFuYWdlci0+Y2xvc2UobUNvbm5lY3Rpb25JZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBmZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgYmxvY2stPnJlc2V0KCk7CisgICAgICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIG1Jbml0OworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhcmFtczsKKyAgICAgICAgbUFsbG9jYXRvci0+Z2V0TGluZWFyUGFyYW1zKGNhcGFjaXR5LCB1c2FnZSwgJnBhcmFtcyk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVyUG9vbERhdGE7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqY0hhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtQnVmZmVyUG9vbE1hbmFnZXItPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIHBhcmFtcywgJmNIYW5kbGUsICZidWZmZXJQb29sRGF0YSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKGNIYW5kbGUpOworICAgICAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IGFsbG9jOworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvb2xlZEJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPihidWZmZXJQb29sRGF0YSk7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+cHJpb3JMaW5lYXJBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LICYmIHBvb2xEYXRhICYmIGFsbG9jKSB7CisgICAgICAgICAgICAgICAgICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soYWxsb2MsIHBvb2xEYXRhLCAwLCBjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYmxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWSkgeworICAgICAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrKSB7CisgICAgICAgIGJsb2NrLT5yZXNldCgpOworICAgICAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYXJhbXM7CisgICAgICAgIG1BbGxvY2F0b3ItPmdldEdyYXBoaWNQYXJhbXMod2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJnBhcmFtcyk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVyUG9vbERhdGE7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqY0hhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtQnVmZmVyUG9vbE1hbmFnZXItPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIHBhcmFtcywgJmNIYW5kbGUsICZidWZmZXJQb29sRGF0YSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKGNIYW5kbGUpOworICAgICAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPihidWZmZXJQb29sRGF0YSk7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LICYmIHBvb2xEYXRhICYmIGFsbG9jKSB7CisgICAgICAgICAgICAgICAgICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jLCBwb29sRGF0YSwgQzJSZWN0KHdpZHRoLCBoZWlnaHQpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpibG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgQ29ubmVjdGlvbklkIGdldENvbm5lY3Rpb25JZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0ICE9IEMyX09LID8gSU5WQUxJRF9DT05ORUNUSU9OSUQgOiBtQ29ubmVjdGlvbklkOworICAgIH0KKworcHJpdmF0ZToKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBjb25zdCBhbmRyb2lkOjpzcDxDbGllbnRNYW5hZ2VyPiBtQnVmZmVyUG9vbE1hbmFnZXI7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7IC8vIGxvY2FsbHkKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKK307CisKK0MyUG9vbGVkQmxvY2tQb29sOjpDMlBvb2xlZEJsb2NrUG9vbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yLCBjb25zdCBsb2NhbF9pZF90IGxvY2FsSWQpCisgICAgICAgIDogbUFsbG9jYXRvcihhbGxvY2F0b3IpLCBtTG9jYWxJZChsb2NhbElkKSwgbUltcGwobmV3IEltcGwoYWxsb2NhdG9yKSkge30KKworQzJQb29sZWRCbG9ja1Bvb2w6On5DMlBvb2xlZEJsb2NrUG9vbCgpIHsKK30KKworYzJfc3RhdHVzX3QgQzJQb29sZWRCbG9ja1Bvb2w6OmZldGNoTGluZWFyQmxvY2soCisgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mZXRjaExpbmVhckJsb2NrKGNhcGFjaXR5LCB1c2FnZSwgYmxvY2spOworICAgIH0KKyAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlBvb2xlZEJsb2NrUG9vbDo6ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2spIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mZXRjaEdyYXBoaWNCbG9jayh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCBibG9jayk7CisgICAgfQorICAgIHJldHVybiBDMl9DT1JSVVBURUQ7Cit9CisKK2ludDY0X3QgQzJQb29sZWRCbG9ja1Bvb2w6OmdldENvbm5lY3Rpb25JZCgpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAyRCBCTE9DSyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIHRoYXQgaXMgc2hhcmVkIGJldHdlZW4gYWxsIDJEIGJsb2NrcyBhbmQgdmlld3MuCisgKgorICogRm9yIGJsb2NrcycgSW1wbCdzIGNyb3AgaXMgYWx3YXlzIHRoZSBhbGxvdHRlZCBjcm9wLCBldmVuIGlmIGl0IGlzIGEgc3ViIGJsb2NrLgorICoKKyAqIEZvciB2aWV3cycgSW1wbCdzIGNyb3AgaXMgdGhlIG1hcHBlZCBwb3J0aW9uIC0gd2hpY2ggZm9yIG5vdyBpcyBhbHdheXMgdGhlCisgKiBhbGxvdHRlZCBjcm9wLgorICovCitjbGFzcyBDMl9ISURFIF9DMkJsb2NrMkRJbXBsIDogcHVibGljIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEltcGwncyBjcm9wIGlzIGFsd2F5cyB0aGUgb3IgcGFydCBvZiB0aGUgYWxsb3R0ZWQgY3JvcCBvZiB0aGUgYWxsb2NhdGlvbi4KKyAgICAgKi8KKyAgICBfQzJCbG9jazJESW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+ICZwb29sRGF0YSA9IG51bGxwdHIsCisgICAgICAgICAgICBjb25zdCBDMlJlY3QgJmFsbG90dGVkQ3JvcCA9IEMyUmVjdCh+MHUsIH4wdSkpCisgICAgICAgIDogX0MyUGxhbmFyU2VjdGlvbkFzcGVjdChhbGxvYy5nZXQoKSwgYWxsb3R0ZWRDcm9wKSwKKyAgICAgICAgICBtQWxsb2NhdGlvbihhbGxvYyksCisgICAgICAgICAgbVBvb2xEYXRhKHBvb2xEYXRhKSB7IH0KKworICAgIHZpcnR1YWwgfl9DMkJsb2NrMkRJbXBsKCkgPSBkZWZhdWx0OworCisgICAgLyoqIHJldHVybnMgcG9vbCBkYXRhICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Qb29sRGF0YTsKKyAgICB9CisKKyAgICAvKiogcmV0dXJucyBuYXRpdmUgaGFuZGxlICovCisgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uID8gbUFsbG9jYXRpb24tPmhhbmRsZSgpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICAvKiogcmV0dXJucyB0aGUgYWxsb2NhdG9yJ3MgSUQgKi8KKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IHsKKyAgICAgICAgLy8gQkFEX0lEIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGlzIEltcGwgY2xhc3MgaXMgaW5pdGlhbGl6ZWQgZm9yIGEgdmlldyAtIG5ldmVyIGZvciBhIGJsb2NrLgorICAgICAgICByZXR1cm4gbUFsbG9jYXRpb24gPyBtQWxsb2NhdGlvbi0+Z2V0QWxsb2NhdG9ySWQoKSA6IEMyQWxsb2NhdG9yOjpCQURfSUQ7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGdldEFsbG9jYXRpb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IG1BbGxvY2F0aW9uOworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBtUG9vbERhdGE7Cit9OworCitjbGFzcyBDMl9ISURFIF9DMk1hcHBpbmdCbG9jazJESW1wbAorICAgIDogcHVibGljIF9DMkJsb2NrMkRJbXBsLCBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxfQzJNYXBwaW5nQmxvY2syREltcGw+IHsKK3B1YmxpYzoKKyAgICB1c2luZyBfQzJCbG9jazJESW1wbDo6X0MyQmxvY2syREltcGw7CisKKyAgICB2aXJ0dWFsIH5fQzJNYXBwaW5nQmxvY2syREltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHRoZSBtYXBwZWQgZGF0YSBwb2ludGVyLCBhbmQgdGhlIHBvdGVudGlhbCBlcnJvci4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgTWFwcGVkIHsKKyAgICBwcml2YXRlOgorICAgICAgICBmcmllbmQgY2xhc3MgX0MyTWFwcGluZ0Jsb2NrMkRJbXBsOworCisgICAgICAgIE1hcHBlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2syREltcGw+ICZpbXBsLCBib29sIHdyaXRhYmxlLCBDMkZlbmNlICpmZW5jZSBfX3VudXNlZCkKKyAgICAgICAgICAgIDogbUltcGwoaW1wbCksIG1Xcml0YWJsZSh3cml0YWJsZSkgeworICAgICAgICAgICAgbWVtc2V0KG1EYXRhLCAwLCBzaXplb2YobURhdGEpKTsKKyAgICAgICAgICAgIGNvbnN0IEMyUmVjdCBjcm9wID0gbUltcGwtPmNyb3AoKTsKKyAgICAgICAgICAgIC8vIGdyYWxsb2MgcmVxdWlyZXMgbWFwcGluZyB0aGUgd2hvbGUgcmVnaW9uIG9mIGludGVyZXN0IGFzIHdlIGNhbm5vdAorICAgICAgICAgICAgLy8gbWFwIG11bHRpcGxlIHJlZ2lvbnMKKyAgICAgICAgICAgIG1FcnJvciA9IG1JbXBsLT5nZXRBbGxvY2F0aW9uKCktPm1hcCgKKyAgICAgICAgICAgICAgICAgICAgY3JvcCwKKyAgICAgICAgICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgd3JpdGFibGUgPyBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgOiAwIH0sCisgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICZtTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICBtRGF0YSk7CisgICAgICAgICAgICBpZiAobUVycm9yICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZtTGF5b3V0LCAwLCBzaXplb2YobUxheW91dCkpOworICAgICAgICAgICAgICAgIG1lbXNldChtRGF0YSwgMCwgc2l6ZW9mKG1EYXRhKSk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1PZmZzZXREYXRhLCAwLCBzaXplb2YobURhdGEpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogdmFsaWRhdGUgcGxhbmUgbGF5b3V0IGFuZAorICAgICAgICAgICAgICAgIC8vIGFkanVzdCBkYXRhIHBvaW50ZXJzIHRvIHRoZSBjcm9wIHJlZ2lvbidzIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgICAgICAgICAgICAvLyBmYWlsIGlmIGl0IGlzIG5vdCBvbiBhIHN1YnNhbXBsaW5nIGJvdW5kYXJ5CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgcGxhbmVJeCA9IDA7IHBsYW5lSXggPCBtTGF5b3V0Lm51bVBsYW5lczsgKytwbGFuZUl4KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNvbFNhbXBsaW5nID0gbUxheW91dC5wbGFuZXNbcGxhbmVJeF0uY29sU2FtcGxpbmc7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHJvd1NhbXBsaW5nID0gbUxheW91dC5wbGFuZXNbcGxhbmVJeF0ucm93U2FtcGxpbmc7CisgICAgICAgICAgICAgICAgICAgIGlmIChjcm9wLmxlZnQgJSBjb2xTYW1wbGluZyB8fCBjcm9wLnJpZ2h0KCkgJSBjb2xTYW1wbGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNyb3AudG9wICUgcm93U2FtcGxpbmcgfHwgY3JvcC5ib3R0b20oKSAlIHJvd1NhbXBsaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW5ub3QgY2FsY3VsYXRlIGRhdGEgcG9pbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgbUltcGwtPmdldEFsbG9jYXRpb24oKS0+dW5tYXAobURhdGEsIGNyb3AsIG51bGxwdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZtTGF5b3V0LCAwLCBzaXplb2YobUxheW91dCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG1EYXRhLCAwLCBzaXplb2YobURhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChtT2Zmc2V0RGF0YSwgMCwgc2l6ZW9mKG1EYXRhKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRXJyb3IgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbU9mZnNldERhdGFbcGxhbmVJeF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFbcGxhbmVJeF0gKyAoc3NpemVfdCljcm9wLmxlZnQgKiBtTGF5b3V0LnBsYW5lc1twbGFuZUl4XS5jb2xJbmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoc3NpemVfdCljcm9wLnRvcCAqIG1MYXlvdXQucGxhbmVzW3BsYW5lSXhdLnJvd0luYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBleHBsaWNpdCBNYXBwZWQoYzJfc3RhdHVzX3QgZXJyb3IpCisgICAgICAgICAgICA6IG1JbXBsKG51bGxwdHIpLCBtV3JpdGFibGUoZmFsc2UpLCBtRXJyb3IoZXJyb3IpIHsKKyAgICAgICAgICAgIC8vIENIRUNLKGVycm9yICE9IEMyX09LKTsKKyAgICAgICAgICAgIG1lbXNldCgmbUxheW91dCwgMCwgc2l6ZW9mKG1MYXlvdXQpKTsKKyAgICAgICAgICAgIG1lbXNldChtRGF0YSwgMCwgc2l6ZW9mKG1EYXRhKSk7CisgICAgICAgICAgICBtZW1zZXQobU9mZnNldERhdGEsIDAsIHNpemVvZihtRGF0YSkpOworICAgICAgICB9CisKKyAgICBwdWJsaWM6CisgICAgICAgIH5NYXBwZWQoKSB7CisgICAgICAgICAgICBpZiAobURhdGFbMF0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1JbXBsLT5nZXRBbGxvY2F0aW9uKCktPnVubWFwKG1EYXRhLCBtSW1wbC0+Y3JvcCgpLCBudWxscHRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiByZXR1cm5zIG1hcHBpbmcgc3RhdHVzICovCisgICAgICAgIGMyX3N0YXR1c190IGVycm9yKCkgY29uc3QgeyByZXR1cm4gbUVycm9yOyB9CisKKyAgICAgICAgLyoqIHJldHVybnMgZGF0YSBwb2ludGVyICovCisgICAgICAgIHVpbnQ4X3QgKmNvbnN0ICpkYXRhKCkgY29uc3QgeyByZXR1cm4gbU9mZnNldERhdGE7IH0KKworICAgICAgICAvKiogcmV0dXJucyB0aGUgcGxhbmUgbGF5b3V0ICovCisgICAgICAgIEMyUGxhbmFyTGF5b3V0IGxheW91dCgpIGNvbnN0IHsgcmV0dXJuIG1MYXlvdXQ7IH0KKworICAgICAgICAvKiogcmV0dXJucyB3aGV0aGVyIHRoZSBtYXBwaW5nIGlzIHdyaXRhYmxlICovCisgICAgICAgIGJvb2wgd3JpdGFibGUoKSBjb25zdCB7IHJldHVybiBtV3JpdGFibGU7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9jazJESW1wbD4gbUltcGw7CisgICAgICAgIGJvb2wgbVdyaXRhYmxlOworICAgICAgICBjMl9zdGF0dXNfdCBtRXJyb3I7CisgICAgICAgIHVpbnQ4X3QgKm1EYXRhW0MyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FU107CisgICAgICAgIHVpbnQ4X3QgKm1PZmZzZXREYXRhW0MyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FU107CisgICAgICAgIEMyUGxhbmFyTGF5b3V0IG1MYXlvdXQ7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIE1hcHMgdGhlIGFsbG90dGVkIHJlZ2lvbi4KKyAgICAgKgorICAgICAqIElmIGFscmVhZHkgbWFwcGVkIGFuZCBpdCBpcyBjdXJyZW50bHkgaW4gdXNlLCByZXR1cm5zIHRoZSBleGlzdGluZyBtYXBwaW5nLgorICAgICAqIElmIGZlbmNlIGlzIHByb3ZpZGVkLCBhbiBhY3F1aXJlIGZlbmNlIGlzIHN0b3JlZCB0aGVyZS4KKyAgICAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWFwcGVkPiBtYXAoYm9vbCB3cml0YWJsZSwgQzJGZW5jZSAqZmVuY2UpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1hcHBlZExvY2spOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TWFwcGVkPiBleGlzdGluZyA9IG1NYXBwZWQubG9jaygpOworICAgICAgICBpZiAoIWV4aXN0aW5nKSB7CisgICAgICAgICAgICBleGlzdGluZyA9IHN0ZDo6c2hhcmVkX3B0cjxNYXBwZWQ+KG5ldyBNYXBwZWQoc2hhcmVkX2Zyb21fdGhpcygpLCB3cml0YWJsZSwgZmVuY2UpKTsKKyAgICAgICAgICAgIG1NYXBwZWQgPSBleGlzdGluZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIHdlIG1hcHBlZCB0aGUgcmVnaW9uIHJlYWQtb25seSwgd2UgY2Fubm90IHJlbWFwIGl0IHJlYWQtd3JpdGUKKyAgICAgICAgICAgIGlmICh3cml0YWJsZSAmJiAhZXhpc3RpbmctPndyaXRhYmxlKCkpIHsKKyAgICAgICAgICAgICAgICBleGlzdGluZyA9IHN0ZDo6c2hhcmVkX3B0cjxNYXBwZWQ+KG5ldyBNYXBwZWQoQzJfQ0FOTk9UX0RPKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmVuY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICpmZW5jZSA9IEMyRmVuY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6d2Vha19wdHI8TWFwcGVkPiBtTWFwcGVkOworICAgIHN0ZDo6bXV0ZXggbU1hcHBlZExvY2s7Cit9OworCitjbGFzcyBDMl9ISURFIF9DMk1hcHBlZEJsb2NrMkRJbXBsIDogcHVibGljIF9DMkJsb2NrMkRJbXBsIHsKK3B1YmxpYzoKKyAgICBfQzJNYXBwZWRCbG9jazJESW1wbChjb25zdCBfQzJCbG9jazJESW1wbCAmaW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyTWFwcGluZ0Jsb2NrMkRJbXBsOjpNYXBwZWQ+IG1hcHBpbmcpCisgICAgICAgIDogX0MyQmxvY2syREltcGwoaW1wbCksIG1NYXBwaW5nKG1hcHBpbmcpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5fQzJNYXBwZWRCbG9jazJESW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJNYXBwaW5nQmxvY2syREltcGw6Ok1hcHBlZD4gbWFwcGluZygpIGNvbnN0IHsgcmV0dXJuIG1NYXBwaW5nOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMk1hcHBpbmdCbG9jazJESW1wbDo6TWFwcGVkPiBtTWFwcGluZzsKK307CisKKy8qKgorICogQmxvY2sgaW1wbGVtZW50YXRpb24uCisgKi8KK2NsYXNzIEMyQmxvY2syRDo6SW1wbCA6IHB1YmxpYyBfQzJNYXBwaW5nQmxvY2syREltcGwgeworcHVibGljOgorICAgIHVzaW5nIF9DMk1hcHBpbmdCbG9jazJESW1wbDo6X0MyTWFwcGluZ0Jsb2NrMkRJbXBsOworICAgIHZpcnR1YWwgfkltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Cit9OworCitjb25zdCBDMkhhbmRsZSAqQzJCbG9jazJEOjpoYW5kbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5oYW5kbGUoKTsKK30KKworQzJBbGxvY2F0b3I6OmlkX3QgQzJCbG9jazJEOjpnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldEFsbG9jYXRvcklkKCk7Cit9CisKK0MyQmxvY2syRDo6QzJCbG9jazJEKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uKQorICAgIC8vIGFsd2F5cyBjbGFtcCBzdWJzZWN0aW9uIHRvIHBhcmVudCAoaW1wbCkgY3JvcCBmb3Igc2FmZXR5CisgICAgOiBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KGltcGwuZ2V0KCksIHNlY3Rpb24uY3JvcCgpKSwgbUltcGwoaW1wbCkgeworfQorCisvKioKKyAqIEdyYXBoaWMgdmlldyBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiByYW5nZSBvZiBJbXBsIGlzIHRoZSBtYXBwZWQgcmFuZ2Ugb2YgdGhlIHVuZGVybHlpbmcgYWxsb2NhdGlvbi4gcmFuZ2Ugb2YgVmlldyBpcyB0aGUgY3VycmVudAorICogY3JvcC4KKyAqLworY2xhc3MgQzJHcmFwaGljVmlldzo6SW1wbCA6IHB1YmxpYyBfQzJNYXBwZWRCbG9jazJESW1wbCB7CitwdWJsaWM6CisgICAgdXNpbmcgX0MyTWFwcGVkQmxvY2syREltcGw6Ol9DMk1hcHBlZEJsb2NrMkRJbXBsOworICAgIHZpcnR1YWwgfkltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Cit9OworCitDMkdyYXBoaWNWaWV3OjpDMkdyYXBoaWNWaWV3KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uKQorICAgIDogX0MyRWRpdGFibGVQbGFuYXJTZWN0aW9uQXNwZWN0KGltcGwuZ2V0KCksIHNlY3Rpb24uY3JvcCgpKSwgbUltcGwoaW1wbCkgeworfQorCitjb25zdCB1aW50OF90ICpjb25zdCAqQzJHcmFwaGljVmlldzo6ZGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPm1hcHBpbmcoKS0+ZGF0YSgpOworfQorCit1aW50OF90ICpjb25zdCAqQzJHcmFwaGljVmlldzo6ZGF0YSgpIHsKKyAgICByZXR1cm4gbUltcGwtPm1hcHBpbmcoKS0+ZGF0YSgpOworfQorCitjb25zdCBDMlBsYW5hckxheW91dCBDMkdyYXBoaWNWaWV3OjpsYXlvdXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5tYXBwaW5nKCktPmxheW91dCgpOworfQorCitjb25zdCBDMkdyYXBoaWNWaWV3IEMyR3JhcGhpY1ZpZXc6OnN1YlZpZXcoY29uc3QgQzJSZWN0ICZyZWN0KSBjb25zdCB7CisgICAgcmV0dXJuIEMyR3JhcGhpY1ZpZXcobUltcGwsIEMyUGxhbmFyU2VjdGlvbigqbUltcGwsIHJlY3QpKTsKK30KKworQzJHcmFwaGljVmlldyBDMkdyYXBoaWNWaWV3OjpzdWJWaWV3KGNvbnN0IEMyUmVjdCAmcmVjdCkgeworICAgIHJldHVybiBDMkdyYXBoaWNWaWV3KG1JbXBsLCBDMlBsYW5hclNlY3Rpb24oKm1JbXBsLCByZWN0KSk7Cit9CisKK2MyX3N0YXR1c190IEMyR3JhcGhpY1ZpZXc6OmVycm9yKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+bWFwcGluZygpLT5lcnJvcigpOworfQorCisvKioKKyAqIENvbnN0IGdyYXBoaWMgYmxvY2sgaW1wbGVtZW50YXRpb24uCisgKi8KK0MyQ29uc3RHcmFwaGljQmxvY2s6OkMyQ29uc3RHcmFwaGljQmxvY2soCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uLCBDMkZlbmNlIGZlbmNlKQorICAgIDogQzJCbG9jazJEKGltcGwsIHNlY3Rpb24pLCBtRmVuY2UoZmVuY2UpIHsgfQorCitDMkFjcXVpcmFibGU8Y29uc3QgQzJHcmFwaGljVmlldz4gQzJDb25zdEdyYXBoaWNCbG9jazo6bWFwKCkgY29uc3QgeworICAgIEMyRmVuY2UgZmVuY2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMk1hcHBpbmdCbG9jazJESW1wbDo6TWFwcGVkPiBtYXBwaW5nID0KKyAgICAgICAgbUltcGwtPm1hcChmYWxzZSAvKiB3cml0YWJsZSAqLywgJmZlbmNlKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8R3JhcGhpY1ZpZXdCdWRkeTo6SW1wbD4gZ3ZpID0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEdyYXBoaWNWaWV3QnVkZHk6OkltcGw+KG5ldyBHcmFwaGljVmlld0J1ZGR5OjpJbXBsKCptSW1wbCwgbWFwcGluZykpOworICAgIHJldHVybiBBY3F1aXJhYmxlQ29uc3RHcmFwaGljVmlld0J1ZGR5KAorICAgICAgICAgICAgbWFwcGluZy0+ZXJyb3IoKSwgZmVuY2UsIEdyYXBoaWNWaWV3QnVkZHkoZ3ZpLCBDMlBsYW5hclNlY3Rpb24oKm1JbXBsLCBjcm9wKCkpKSk7Cit9CisKK0MyQ29uc3RHcmFwaGljQmxvY2sgQzJDb25zdEdyYXBoaWNCbG9jazo6c3ViQmxvY2soY29uc3QgQzJSZWN0ICZyZWN0KSBjb25zdCB7CisgICAgcmV0dXJuIEMyQ29uc3RHcmFwaGljQmxvY2sobUltcGwsIEMyUGxhbmFyU2VjdGlvbigqbUltcGwsIGNyb3AoKS5pbnRlcnNlY3QocmVjdCkpLCBtRmVuY2UpOworfQorCisvKioKKyAqIEdyYXBoaWMgYmxvY2sgaW1wbGVtZW50YXRpb24uCisgKi8KK0MyR3JhcGhpY0Jsb2NrOjpDMkdyYXBoaWNCbG9jaygKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAmc2VjdGlvbikKKyAgICA6IEMyQmxvY2syRChpbXBsLCBzZWN0aW9uKSB7IH0KKworQzJBY3F1aXJhYmxlPEMyR3JhcGhpY1ZpZXc+IEMyR3JhcGhpY0Jsb2NrOjptYXAoKSB7CisgICAgQzJGZW5jZSBmZW5jZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyTWFwcGluZ0Jsb2NrMkRJbXBsOjpNYXBwZWQ+IG1hcHBpbmcgPQorICAgICAgICBtSW1wbC0+bWFwKHRydWUgLyogd3JpdGFibGUgKi8sICZmZW5jZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEdyYXBoaWNWaWV3QnVkZHk6OkltcGw+IGd2aSA9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxHcmFwaGljVmlld0J1ZGR5OjpJbXBsPihuZXcgR3JhcGhpY1ZpZXdCdWRkeTo6SW1wbCgqbUltcGwsIG1hcHBpbmcpKTsKKyAgICByZXR1cm4gQWNxdWlyYWJsZUdyYXBoaWNWaWV3QnVkZHkoCisgICAgICAgICAgICBtYXBwaW5nLT5lcnJvcigpLCBmZW5jZSwgR3JhcGhpY1ZpZXdCdWRkeShndmksIEMyUGxhbmFyU2VjdGlvbigqbUltcGwsIGNyb3AoKSkpKTsKK30KKworQzJDb25zdEdyYXBoaWNCbG9jayBDMkdyYXBoaWNCbG9jazo6c2hhcmUoY29uc3QgQzJSZWN0ICZjcm9wLCBDMkZlbmNlIGZlbmNlKSB7CisgICAgcmV0dXJuIENvbnN0R3JhcGhpY0Jsb2NrQnVkZHkobUltcGwsIEMyUGxhbmFyU2VjdGlvbigqbUltcGwsIGNyb3ApLCBmZW5jZSk7Cit9CisKKy8qKgorICogQmFzaWMgYmxvY2sgcG9vbCBpbXBsZW1lbnRhdGlvbnMuCisgKi8KK0MyQmFzaWNHcmFwaGljQmxvY2tQb29sOjpDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSB7fQorCitjMl9zdGF0dXNfdCBDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbDo6ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgIGJsb2NrLT5yZXNldCgpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOworICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPm5ld0dyYXBoaWNBbGxvY2F0aW9uKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZhbGxvYyk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jKTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+ICZkYXRhLCBjb25zdCBDMlJlY3QgJmFsbG90dGVkQ3JvcCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrMkQ6OkltcGw+IGltcGwgPQorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyQmxvY2syRDo6SW1wbD4oYWxsb2MsIGRhdGEsIGFsbG90dGVkQ3JvcCk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4obmV3IEMyR3JhcGhpY0Jsb2NrKGltcGwsICppbXBsKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBfQzJCbG9ja0ZhY3Rvcnk6OkdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKAorICAgICAgICBjb25zdCBDMkJsb2NrMkQgJmJsb2NrKSB7CisgICAgaWYgKGJsb2NrLm1JbXBsKSB7CisgICAgICAgIHJldHVybiBibG9jay5tSW1wbC0+cG9vbERhdGEoKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjSGFuZGxlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZkYXRhKSB7CisgICAgLy8gVE9ETzogZ2V0IHByb3BlciBhbGxvY2F0b3I/IGFuZCBtdXRleD8KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9yR3JhbGxvYz4gc0FsbG9jYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJBbGxvY2F0b3JHcmFsbG9jPigwKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBpZiAoQzJBbGxvY2F0b3JHcmFsbG9jOjppc1ZhbGlkKGNIYW5kbGUpKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZShjSGFuZGxlKTsKKyAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gc0FsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0sgJiYgcG9vbERhdGEpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBjb25maWcgc2V0dXA/CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jayA9CisgICAgICAgICAgICAgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYywgcG9vbERhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiBibG9jazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK307CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEJVRkZFUiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitjbGFzcyBDMkJ1ZmZlckRhdGE6OkltcGwgeworcHVibGljOgorICAgIGV4cGxpY2l0IEltcGwoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKQorICAgICAgICA6IG1UeXBlKGJsb2Nrcy5zaXplKCkgPT0gMSA/IExJTkVBUiA6IExJTkVBUl9DSFVOS1MpLAorICAgICAgICAgIG1MaW5lYXJCbG9ja3MoYmxvY2tzKSB7CisgICAgfQorCisgICAgZXhwbGljaXQgSW1wbChjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKQorICAgICAgICA6IG1UeXBlKGJsb2Nrcy5zaXplKCkgPT0gMSA/IEdSQVBISUMgOiBHUkFQSElDX0NIVU5LUyksCisgICAgICAgICAgbUdyYXBoaWNCbG9ja3MoYmxvY2tzKSB7CisgICAgfQorCisgICAgdHlwZV90IHR5cGUoKSBjb25zdCB7IHJldHVybiBtVHlwZTsgfQorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmxpbmVhckJsb2NrcygpIGNvbnN0IHsgcmV0dXJuIG1MaW5lYXJCbG9ja3M7IH0KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmZ3JhcGhpY0Jsb2NrcygpIGNvbnN0IHsgcmV0dXJuIG1HcmFwaGljQmxvY2tzOyB9CisKK3ByaXZhdGU6CisgICAgdHlwZV90IG1UeXBlOworICAgIHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gbUxpbmVhckJsb2NrczsKKyAgICBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBtR3JhcGhpY0Jsb2NrczsKK307CisKK0MyQnVmZmVyRGF0YTo6QzJCdWZmZXJEYXRhKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2NrcykgOiBtSW1wbChuZXcgSW1wbChibG9ja3MpKSB7fQorQzJCdWZmZXJEYXRhOjpDMkJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2NrcykgOiBtSW1wbChuZXcgSW1wbChibG9ja3MpKSB7fQorCitDMkJ1ZmZlckRhdGE6OnR5cGVfdCBDMkJ1ZmZlckRhdGE6OnR5cGUoKSBjb25zdCB7IHJldHVybiBtSW1wbC0+dHlwZSgpOyB9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gQzJCdWZmZXJEYXRhOjpsaW5lYXJCbG9ja3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5saW5lYXJCbG9ja3MoKTsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gQzJCdWZmZXJEYXRhOjpncmFwaGljQmxvY2tzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z3JhcGhpY0Jsb2NrcygpOworfQorCitjbGFzcyBDMkJ1ZmZlcjo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbChDMkJ1ZmZlciAqdGhpeiwgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKQorICAgICAgICA6IG1UaGlzKHRoaXopLCBtRGF0YShibG9ja3MpIHt9CisgICAgSW1wbChDMkJ1ZmZlciAqdGhpeiwgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2NrcykKKyAgICAgICAgOiBtVGhpcyh0aGl6KSwgbURhdGEoYmxvY2tzKSB7fQorCisgICAgfkltcGwoKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcGFpciA6IG1Ob3RpZnkpIHsKKyAgICAgICAgICAgIHBhaXIuZmlyc3QobVRoaXMsIHBhaXIuc2Vjb25kKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IEMyQnVmZmVyRGF0YSAmZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhOyB9CisKKyAgICBjMl9zdGF0dXNfdCByZWdpc3Rlck9uRGVzdHJveU5vdGlmeShPbkRlc3Ryb3lOb3RpZnkgb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcpIHsKKyAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZF9pZigKKyAgICAgICAgICAgICAgICBtTm90aWZ5LmJlZ2luKCksIG1Ob3RpZnkuZW5kKCksCisgICAgICAgICAgICAgICAgW29uRGVzdHJveU5vdGlmeSwgYXJnXSAoY29uc3QgYXV0byAmcGFpcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFpci5maXJzdCA9PSBvbkRlc3Ryb3lOb3RpZnkgJiYgcGFpci5zZWNvbmQgPT0gYXJnOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoaXQgIT0gbU5vdGlmeS5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIEMyX0RVUExJQ0FURTsKKyAgICAgICAgfQorICAgICAgICBtTm90aWZ5LmVtcGxhY2VfYmFjayhvbkRlc3Ryb3lOb3RpZnksIGFyZyk7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCB1bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KE9uRGVzdHJveU5vdGlmeSBvbkRlc3Ryb3lOb3RpZnksIHZvaWQgKmFyZykgeworICAgICAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKAorICAgICAgICAgICAgICAgIG1Ob3RpZnkuYmVnaW4oKSwgbU5vdGlmeS5lbmQoKSwKKyAgICAgICAgICAgICAgICBbb25EZXN0cm95Tm90aWZ5LCBhcmddIChjb25zdCBhdXRvICZwYWlyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYWlyLmZpcnN0ID09IG9uRGVzdHJveU5vdGlmeSAmJiBwYWlyLnNlY29uZCA9PSBhcmc7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChpdCA9PSBtTm90aWZ5LmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIG1Ob3RpZnkuZXJhc2UoaXQpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IGluZm8oKSBjb25zdCB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiByZXN1bHQobUluZm9zLnNpemUoKSk7CisgICAgICAgIHN0ZDo6dHJhbnNmb3JtKAorICAgICAgICAgICAgICAgIG1JbmZvcy5iZWdpbigpLCBtSW5mb3MuZW5kKCksIHJlc3VsdC5iZWdpbigpLAorICAgICAgICAgICAgICAgIFtdIChjb25zdCBhdXRvICZlbGVtKSB7IHJldHVybiBlbGVtLnNlY29uZDsgfSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3Qgc2V0SW5mbyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiAmaW5mbykgeworICAgICAgICAvLyBUbyAidXBkYXRlIiB5b3UgbmVlZCB0byBlcmFzZSB0aGUgZXhpc3Rpbmcgb25lIGlmIGFueSwgYW5kIHRoZW4gaW5zZXJ0LgorICAgICAgICAodm9pZCkgbUluZm9zLmVyYXNlKGluZm8tPmNvcmVJbmRleCgpKTsKKyAgICAgICAgKHZvaWQpIG1JbmZvcy5pbnNlcnQoeyBpbmZvLT5jb3JlSW5kZXgoKSwgaW5mbyB9KTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIGJvb2wgaGFzSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSW5mb3MuY291bnQoaW5kZXguY29yZUluZGV4KCkpID4gMDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPiBnZXRJbmZvKEMyUGFyYW06OlR5cGUgaW5kZXgpIGNvbnN0IHsKKyAgICAgICAgYXV0byBpdCA9IG1JbmZvcy5maW5kKGluZGV4LmNvcmVJbmRleCgpKTsKKyAgICAgICAgaWYgKGl0ID09IG1JbmZvcy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0ZDo6Y29uc3RfcG9pbnRlcl9jYXN0PGNvbnN0IEMySW5mbz4oaXQtPnNlY29uZCk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gcmVtb3ZlSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSB7CisgICAgICAgIGF1dG8gaXQgPSBtSW5mb3MuZmluZChpbmRleC5jb3JlSW5kZXgoKSk7CisgICAgICAgIGlmIChpdCA9PSBtSW5mb3MuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IHJldCA9IGl0LT5zZWNvbmQ7CisgICAgICAgICh2b2lkKSBtSW5mb3MuZXJhc2UoaXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworcHJpdmF0ZToKKyAgICBDMkJ1ZmZlciAqIGNvbnN0IG1UaGlzOworICAgIEJ1ZmZlckRhdGFCdWRkeSBtRGF0YTsKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpDb3JlSW5kZXgsIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+PiBtSW5mb3M7CisgICAgc3RkOjpsaXN0PHN0ZDo6cGFpcjxPbkRlc3Ryb3lOb3RpZnksIHZvaWQgKj4+IG1Ob3RpZnk7Cit9OworCitDMkJ1ZmZlcjo6QzJCdWZmZXIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKQorICAgIDogbUltcGwobmV3IEltcGwodGhpcywgYmxvY2tzKSkge30KKworQzJCdWZmZXI6OkMyQnVmZmVyKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpCisgICAgOiBtSW1wbChuZXcgSW1wbCh0aGlzLCBibG9ja3MpKSB7fQorCitjb25zdCBDMkJ1ZmZlckRhdGEgQzJCdWZmZXI6OmRhdGEoKSBjb25zdCB7IHJldHVybiBtSW1wbC0+ZGF0YSgpOyB9CisKK2MyX3N0YXR1c190IEMyQnVmZmVyOjpyZWdpc3Rlck9uRGVzdHJveU5vdGlmeShPbkRlc3Ryb3lOb3RpZnkgb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcpIHsKKyAgICByZXR1cm4gbUltcGwtPnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KG9uRGVzdHJveU5vdGlmeSwgYXJnKTsKK30KKworYzJfc3RhdHVzX3QgQzJCdWZmZXI6OnVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoT25EZXN0cm95Tm90aWZ5IG9uRGVzdHJveU5vdGlmeSwgdm9pZCAqYXJnKSB7CisgICAgcmV0dXJuIG1JbXBsLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KG9uRGVzdHJveU5vdGlmeSwgYXJnKTsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IEMyQnVmZmVyOjppbmZvKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+aW5mbygpOworfQorCitjMl9zdGF0dXNfdCBDMkJ1ZmZlcjo6c2V0SW5mbyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiAmaW5mbykgeworICAgIHJldHVybiBtSW1wbC0+c2V0SW5mbyhpbmZvKTsKK30KKworYm9vbCBDMkJ1ZmZlcjo6aGFzSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5oYXNJbmZvKGluZGV4KTsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gQzJCdWZmZXI6OmdldEluZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0SW5mbyhpbmRleCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IEMyQnVmZmVyOjpyZW1vdmVJbmZvKEMyUGFyYW06OlR5cGUgaW5kZXgpIHsKKyAgICByZXR1cm4gbUltcGwtPnJlbW92ZUluZm8oaW5kZXgpOworfQorCisvLyBzdGF0aWMKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gQzJCdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcihjb25zdCBDMkNvbnN0TGluZWFyQmxvY2sgJmJsb2NrKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4obmV3IEMyQnVmZmVyKHsgYmxvY2sgfSkpOworfQorCisvLyBzdGF0aWMKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gQzJCdWZmZXI6OkNyZWF0ZUdyYXBoaWNCdWZmZXIoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2spIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPihuZXcgQzJCdWZmZXIoeyBibG9jayB9KSk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQ29uZmlnLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQ29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDY4MGE3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJDb25maWcuY3BwCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkNvbmZpZyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworLyoqCisgKiBEZWZpbmUgYW5kIGluaXRpYWxpemUgZ2xvYmFsIGNvbmZpZyBmaWVsZCBkZXNjcmlwdG9ycyBpbiB0aGlzIGNwcCBmaWxlCisgKi8KKyNkZWZpbmUgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fCisjaW5jbHVkZSA8QzJDb25maWcuaD4KKworREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihDMkNvbmZpZzo6cHJvZmlsZV90LCAoeworICAgICAgICB7ICJ1bnVzZWQiLCBDMkNvbmZpZzo6UFJPRklMRV9VTlVTRUQgfSwKKyAgICAgICAgeyAiYWFjLWxjIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDIH0sCisgICAgICAgIHsgImFhYy1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX01BSU4gfSwKKyAgICAgICAgeyAiYWFjLXNzciIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19TU1IgfSwKKyAgICAgICAgeyAiYWFjLWx0cCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MVFAgfSwKKyAgICAgICAgeyAiYWFjLWhlIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFIH0sCisgICAgICAgIHsgImFhYy1zY2FsYWJsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19TQ0FMQUJMRSB9LAorICAgICAgICB7ICJhYWMtZXItbGMiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRVJfTEMgfSwKKyAgICAgICAgeyAiYWFjLWVyLXNjYWxhYmxlIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VSX1NDQUxBQkxFIH0sCisgICAgICAgIHsgImFhYy1sZCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MRCB9LAorICAgICAgICB7ICJhYWMtaGUtcHMiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEVfUFMgfSwKKyAgICAgICAgeyAiYWFjLWVsZCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FTEQgfSwKKyAgICAgICAgeyAiYWFjLXhoZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19YSEUgfSwKKyAgICAgICAgeyAibXAydi1zaW1wbGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NJTVBMRSB9LAorICAgICAgICB7ICJtcDJ2LW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX01BSU4gfSwKKyAgICAgICAgeyAibXAydi1zbnItc2NhbGFibGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NOUl9TQ0FMQUJMRSB9LAorICAgICAgICB7ICJtcDJ2LXNwYXRpYWxseS1zY2FsYWJsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU1BBVElBTExZX1NDQUxBQkxFIH0sCisgICAgICAgIHsgIm1wMnYtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfSElHSCB9LAorICAgICAgICB7ICJtcDJ2LTQyMiIsIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfNDIyIH0sCisgICAgICAgIHsgIm1wMnYtbXVsdGl2aWV3IiwgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9NVUxUSVZJRVcgfSwKKyAgICAgICAgeyAiaDI2My1iYXNlbGluZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfQkFTRUxJTkUgfSwKKyAgICAgICAgeyAiaDI2My1oMzIwIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19IMzIwIH0sCisgICAgICAgIHsgImgyNjMtdjFiYyIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfVjFCQyB9LAorICAgICAgICB7ICJoMjYzLWlzd3YyIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JU1dWMiB9LAorICAgICAgICB7ICJoMjYzLWlzd3YzIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JU1dWMyB9LAorICAgICAgICB7ICJoMjYzLWhpZ2gtY29tcHJlc3Npb24iLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0hJR0hfQ09NUFJFU1NJT04gfSwKKyAgICAgICAgeyAiaDI2My1pbnRlcm5ldCIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSU5URVJORVQgfSwKKyAgICAgICAgeyAiaDI2My1pbnRlcmxhY2UiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lOVEVSTEFDRSB9LAorICAgICAgICB7ICJoMjYzLWhpZ2gtbGF0ZW5jeSIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSElHSF9MQVRFTkNZIH0sCisgICAgICAgIHsgIm1wNHYtc2ltcGxlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9TSU1QTEUgfSwKKyAgICAgICAgeyAibXA0di1zaW1wbGUtc2NhbGFibGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRV9TQ0FMQUJMRSB9LAorICAgICAgICB7ICJtcDR2LWNvcmUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0NPUkUgfSwKKyAgICAgICAgeyAibXA0di1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9NQUlOIH0sCisgICAgICAgIHsgIm1wNHYtbmJpdCIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfTkJJVCB9LAorICAgICAgICB7ICJtcDR2LWFydHMiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0FSVFMgfSwKKyAgICAgICAgeyAibXA0di1jb3JlLXNjYWxhYmxlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9DT1JFX1NDQUxBQkxFIH0sCisgICAgICAgIHsgIm1wNHYtYWNlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BQ0UgfSwKKyAgICAgICAgeyAibXA0di1hZHZhbmNlZC1jb3JlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BRFZBTkNFRF9DT1JFIH0sCisgICAgICAgIHsgIm1wNHYtc2ltcGxlLXN0dWRpbyIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfU0lNUExFX1NUVURJTyB9LAorICAgICAgICB7ICJtcDR2LWNvcmUtc3R1ZGlvIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9DT1JFX1NUVURJTyB9LAorICAgICAgICB7ICJtcDR2LWFkdmFuY2VkLXNpbXBsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQURWQU5DRURfU0lNUExFIH0sCisgICAgICAgIHsgIm1wNHYtZmdzIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9GR1MgfSwKKyAgICAgICAgeyAiYXZjLWJhc2VsaW5lIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0JBU0VMSU5FIH0sCisgICAgICAgIHsgImF2Yy1jb25zdHJhaW5lZC1iYXNlbGluZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSB9LAorICAgICAgICB7ICJhdmMtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19NQUlOIH0sCisgICAgICAgIHsgImF2Yy1leHRlbmRlZCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19FWFRFTkRFRCB9LAorICAgICAgICB7ICJhdmMtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIIH0sCisgICAgICAgIHsgImF2Yy1wcm9ncmVzc2l2ZS1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLWNvbnN0cmFpbmVkLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ09OU1RSQUlORURfSElHSCB9LAorICAgICAgICB7ICJhdmMtaGlnaC0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzEwIH0sCisgICAgICAgIHsgImF2Yy1wcm9ncmVzc2l2ZS1oaWdoLTEwIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0hfMTAgfSwKKyAgICAgICAgeyAiYXZjLWhpZ2gtNDIyIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDIyIH0sCisgICAgICAgIHsgImF2Yy1oaWdoLTQ0NC1wcmVkaWN0aXZlIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDQ0X1BSRURJQ1RJVkUgfSwKKyAgICAgICAgeyAiYXZjLWhpZ2gtMTAtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF8xMF9JTlRSQSB9LAorICAgICAgICB7ICJhdmMtaGlnaC00MjItaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF80MjJfSU5UUkEgfSwKKyAgICAgICAgeyAiYXZjLWhpZ2gtNDQ0LWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDQ0X0lOVFJBIH0sCisgICAgICAgIHsgImF2Yy1jYXZsYy00NDQtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ0FWTENfNDQ0X0lOVFJBIH0sCisgICAgICAgIHsgImF2Yy1zY2FsYWJsZS1iYXNlbGluZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19TQ0FMQUJMRV9CQVNFTElORSB9LAorICAgICAgICB7ICJhdmMtc2NhbGFibGUtY29uc3RyYWluZWQtYmFzZWxpbmUiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfU0NBTEFCTEVfQ09OU1RSQUlORURfQkFTRUxJTkUgfSwKKyAgICAgICAgeyAiYXZjLXNjYWxhYmxlLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfU0NBTEFCTEVfSElHSCB9LAorICAgICAgICB7ICJhdmMtc2NhbGFibGUtY29uc3RyYWluZWQtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19TQ0FMQUJMRV9DT05TVFJBSU5FRF9ISUdIIH0sCisgICAgICAgIHsgImF2Yy1zY2FsYWJsZS1oaWdoLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1NDQUxBQkxFX0hJR0hfSU5UUkEgfSwKKyAgICAgICAgeyAiYXZjLW11bHRpdmlldy1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX01VTFRJVklFV19ISUdIIH0sCisgICAgICAgIHsgImF2Yy1zdGVyZW8taGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19TVEVSRU9fSElHSCB9LAorICAgICAgICB7ICJhdmMtbWZjLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTUZDX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLW11bHRpdmlldy1kZXB0aC1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX01VTFRJVklFV19ERVBUSF9ISUdIIH0sCisgICAgICAgIHsgImF2Yy1tZmMtZGVwdGgtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19NRkNfREVQVEhfSElHSCB9LAorICAgICAgICB7ICJhdmMtZW5oYW5jZWQtbXVsdGl2aWV3LWRlcHRoLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfRU5IQU5DRURfTVVMVElWSUVXX0RFUFRIX0hJR0ggfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMCB9LAorICAgICAgICB7ICJoZXZjLW1haW4tc3RpbGwiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fU1RJTEwgfSwKKyAgICAgICAgeyAiaGV2Yy1tb25vIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NT05PIH0sCisgICAgICAgIHsgImhldmMtbW9uby0xMiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTU9OT18xMiB9LAorICAgICAgICB7ICJoZXZjLW1vbm8tMTYiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01PTk9fMTYgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTEyIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEyIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00MjItMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDIyXzEwIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00MjItMTIiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDIyXzEyIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0IH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzEwIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTIiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzEyIH0sCisgICAgICAgIHsgImhldmMtbWFpbi1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMTAtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTBfSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTEyLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEyX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00MjItMTAtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDIyXzEwX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00MjItMTItaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDIyXzEyX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0X0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTAtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzEwX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTItaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzEyX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTYtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzE2X0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtc3RpbGwiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0X1NUSUxMIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTYtc3RpbGwiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzE2X1NUSUxMIH0sCisgICAgICAgIHsgImhldmMtaGlnaC00NDQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX0hJR0hfNDQ0IH0sCisgICAgICAgIHsgImhldmMtaGlnaC00NDQtMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX0hJR0hfNDQ0XzEwIH0sCisgICAgICAgIHsgImhldmMtaGlnaC00NDQtMTQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX0hJR0hfNDQ0XzE0IH0sCisgICAgICAgIHsgImhldmMtaGlnaC00NDQtMTYtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX0hJR0hfNDQ0XzE2X0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtc3gtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfTUFJTiB9LAorICAgICAgICB7ICJoZXZjLXN4LW1haW4tMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX01BSU5fMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1tYWluLTQ0NCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfTUFJTl80NDQgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1tYWluLTQ0NC0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfTUFJTl80NDRfMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1oaWdoLTQ0NCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfSElHSF80NDQgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1oaWdoLTQ0NC0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfSElHSF80NDRfMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1oaWdoLTQ0NC0xNCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfSElHSF80NDRfMTQgfSwKKyAgICAgICAgeyAiaGV2Yy1tdWx0aXZpZXctbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTVVMVElWSUVXX01BSU4gfSwKKyAgICAgICAgeyAiaGV2Yy1zY2FsYWJsZS1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NQUlOIH0sCisgICAgICAgIHsgImhldmMtc2NhbGFibGUtbWFpbi0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTUFJTl8xMCB9LAorICAgICAgICB7ICJoZXZjLXNjYWxhYmxlLW1vbm8iLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk8gfSwKKyAgICAgICAgeyAiaGV2Yy1zY2FsYWJsZS1tb25vLTEyIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NT05PXzEyIH0sCisgICAgICAgIHsgImhldmMtc2NhbGFibGUtbW9uby0xNiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTU9OT18xNiB9LAorICAgICAgICB7ICJoZXZjLXNjYWxhYmxlLW1haW4tNDQ0IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NQUlOXzQ0NCB9LAorICAgICAgICB7ICJoZXZjLTNkLW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDXzNEX01BSU4gfSwKKyAgICAgICAgeyAidnA5LTAiLCBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMCB9LAorICAgICAgICB7ICJ2cDktMSIsIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8xIH0sCisgICAgICAgIHsgInZwOS0yIiwgQzJDb25maWc6OlBST0ZJTEVfVlA5XzIgfSwKKyAgICAgICAgeyAidnA5LTMiLCBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMyB9LAorICAgICAgICB7ICJhdjEtMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8wIH0sCisgICAgICAgIHsgImF2MS0xIiwgQzJDb25maWc6OlBST0ZJTEVfQVYxXzEgfSwKKyAgICAgICAgeyAiYXYxLTIiLCBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMiB9LAorfSkpCisKK0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoQzJDb25maWc6OmxldmVsX3QsICh7CisgICAgICAgIHsgInVudXNlZCIsIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQgfSwKKyAgICAgICAgeyAibXAydi1sb3ciLCBDMkNvbmZpZzo6TEVWRUxfTVAyVl9MT1cgfSwKKyAgICAgICAgeyAibXAydi1tYWluIiwgQzJDb25maWc6OkxFVkVMX01QMlZfTUFJTiB9LAorICAgICAgICB7ICJtcDJ2LWhpZ2gtMTQ0MCIsIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0hfMTQ0MCB9LAorICAgICAgICB7ICJtcDJ2LWhpZ2giLCBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIIH0sCisgICAgICAgIHsgIm1wMnYtaGlnaHAiLCBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIUCB9LAorICAgICAgICB7ICJoMjYzLTEwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfMTAgfSwKKyAgICAgICAgeyAiaDI2My0yMCIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzIwIH0sCisgICAgICAgIHsgImgyNjMtMzAiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M18zMCB9LAorICAgICAgICB7ICJoMjYzLTQwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfNDAgfSwKKyAgICAgICAgeyAiaDI2My00NSIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQ1IH0sCisgICAgICAgIHsgImgyNjMtNTAiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M181MCB9LAorICAgICAgICB7ICJoMjYzLTYwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfNjAgfSwKKyAgICAgICAgeyAiaDI2My03MCIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzcwIH0sCisgICAgICAgIHsgIm1wNHYtMCIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzAgfSwKKyAgICAgICAgeyAibXA0di0wYiIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzBCIH0sCisgICAgICAgIHsgIm1wNHYtMSIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzEgfSwKKyAgICAgICAgeyAibXA0di0yIiwgQzJDb25maWc6OkxFVkVMX01QNFZfMiB9LAorICAgICAgICB7ICJtcDR2LTMiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8zIH0sCisgICAgICAgIHsgIm1wNHYtM2IiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8zQiB9LAorICAgICAgICB7ICJtcDR2LTQiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80IH0sCisgICAgICAgIHsgIm1wNHYtNGEiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80QSB9LAorICAgICAgICB7ICJtcDR2LTUiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl81IH0sCisgICAgICAgIHsgIm1wNHYtNiIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzYgfSwKKyAgICAgICAgeyAiYXZjLTEiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzEgfSwKKyAgICAgICAgeyAiYXZjLTFiIiwgQzJDb25maWc6OkxFVkVMX0FWQ18xQiB9LAorICAgICAgICB7ICJhdmMtMS4xIiwgQzJDb25maWc6OkxFVkVMX0FWQ18xXzEgfSwKKyAgICAgICAgeyAiYXZjLTEuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8yIH0sCisgICAgICAgIHsgImF2Yy0xLjMiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMyB9LAorICAgICAgICB7ICJhdmMtMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMiB9LAorICAgICAgICB7ICJhdmMtMi4xIiwgQzJDb25maWc6OkxFVkVMX0FWQ18yXzEgfSwKKyAgICAgICAgeyAiYXZjLTIuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMl8yIH0sCisgICAgICAgIHsgImF2Yy0zIiwgQzJDb25maWc6OkxFVkVMX0FWQ18zIH0sCisgICAgICAgIHsgImF2Yy0zLjEiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzNfMSB9LAorICAgICAgICB7ICJhdmMtMy4yIiwgQzJDb25maWc6OkxFVkVMX0FWQ18zXzIgfSwKKyAgICAgICAgeyAiYXZjLTQiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzQgfSwKKyAgICAgICAgeyAiYXZjLTQuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNF8xIH0sCisgICAgICAgIHsgImF2Yy00LjIiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzRfMiB9LAorICAgICAgICB7ICJhdmMtNSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNSB9LAorICAgICAgICB7ICJhdmMtNS4xIiwgQzJDb25maWc6OkxFVkVMX0FWQ181XzEgfSwKKyAgICAgICAgeyAiYXZjLTUuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNV8yIH0sCisgICAgICAgIHsgImF2Yy02IiwgQzJDb25maWc6OkxFVkVMX0FWQ182IH0sCisgICAgICAgIHsgImF2Yy02LjEiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzZfMSB9LAorICAgICAgICB7ICJhdmMtNi4yIiwgQzJDb25maWc6OkxFVkVMX0FWQ182XzIgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTIiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzIgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTIuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMl8xIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0zIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0zLjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzNfMSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNCIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNCB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNC4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl80XzEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTUiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzUgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTUuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8xIH0sCisgICAgICAgIHsgImhldmMtbWFpbi01LjIiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNi4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl82XzEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTYuMiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNl8yIH0sCisgICAgICAgIHsgImhldmMtaGlnaC00IiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF80IH0sCisgICAgICAgIHsgImhldmMtaGlnaC00LjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzRfMSB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNSB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNS4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81XzEgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTUuMiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNV8yIH0sCisgICAgICAgIHsgImhldmMtaGlnaC02IiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF82IH0sCisgICAgICAgIHsgImhldmMtaGlnaC02LjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzZfMSB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNi4yIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF82XzIgfSwKKyAgICAgICAgeyAidnA5LTEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzEgfSwKKyAgICAgICAgeyAidnA5LTEuMSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfMV8xIH0sCisgICAgICAgIHsgInZwOS0yIiwgQzJDb25maWc6OkxFVkVMX1ZQOV8yIH0sCisgICAgICAgIHsgInZwOS0yLjEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzJfMSB9LAorICAgICAgICB7ICJ2cDktMyIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfMyB9LAorICAgICAgICB7ICJ2cDktMy4xIiwgQzJDb25maWc6OkxFVkVMX1ZQOV8zXzEgfSwKKyAgICAgICAgeyAidnA5LTQiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzQgfSwKKyAgICAgICAgeyAidnA5LTQuMSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNF8xIH0sCisgICAgICAgIHsgInZwOS01IiwgQzJDb25maWc6OkxFVkVMX1ZQOV81IH0sCisgICAgICAgIHsgInZwOS01LjEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzVfMSB9LAorICAgICAgICB7ICJ2cDktNS4yIiwgQzJDb25maWc6OkxFVkVMX1ZQOV81XzIgfSwKKyAgICAgICAgeyAidnA5LTYiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzYgfSwKKyAgICAgICAgeyAidnA5LTYuMSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNl8xIH0sCisgICAgICAgIHsgInZwOS02LjIiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzZfMiB9LAorICAgICAgICB7ICJhdjEtMiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfMiB9LAorICAgICAgICB7ICJhdjEtMi4xIiwgQzJDb25maWc6OkxFVkVMX0FWMV8yXzEgfSwKKyAgICAgICAgeyAiYXYxLTIuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfMl8yIH0sCisgICAgICAgIHsgImF2MS0yLjMiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMyB9LAorICAgICAgICB7ICJhdjEtMyIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfMyB9LAorICAgICAgICB7ICJhdjEtMy4xIiwgQzJDb25maWc6OkxFVkVMX0FWMV8zXzEgfSwKKyAgICAgICAgeyAiYXYxLTMuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfM18yIH0sCisgICAgICAgIHsgImF2MS0zLjMiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzNfMyB9LAorICAgICAgICB7ICJhdjEtNCIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNCB9LAorICAgICAgICB7ICJhdjEtNC4xIiwgQzJDb25maWc6OkxFVkVMX0FWMV80XzEgfSwKKyAgICAgICAgeyAiYXYxLTQuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNF8yIH0sCisgICAgICAgIHsgImF2MS00LjMiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzRfMyB9LAorICAgICAgICB7ICJhdjEtNSIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNSB9LAorICAgICAgICB7ICJhdjEtNS4xIiwgQzJDb25maWc6OkxFVkVMX0FWMV81XzEgfSwKKyAgICAgICAgeyAiYXYxLTUuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNV8yIH0sCisgICAgICAgIHsgImF2MS01LjMiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzVfMyB9LAorICAgICAgICB7ICJhdjEtNiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNiB9LAorICAgICAgICB7ICJhdjEtNi4xIiwgQzJDb25maWc6OkxFVkVMX0FWMV82XzEgfSwKKyAgICAgICAgeyAiYXYxLTYuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNl8yIH0sCisgICAgICAgIHsgImF2MS02LjMiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzZfMyB9LAorICAgICAgICB7ICJhdjEtNyIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNyB9LAorICAgICAgICB7ICJhdjEtNy4xIiwgQzJDb25maWc6OkxFVkVMX0FWMV83XzEgfSwKKyAgICAgICAgeyAiYXYxLTcuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfN18yIH0sCisgICAgICAgIHsgImF2MS03LjMiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzdfMyB9LAorfSkpCisKK0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoQzJCdWZmZXJEYXRhOjp0eXBlX3QsICh7CisgICAgICAgIHsgImludmFsaWQiLCAgICAgICAgQzJCdWZmZXJEYXRhOjpJTlZBTElEIH0sCisgICAgICAgIHsgImxpbmVhciIsICAgICAgICAgQzJCdWZmZXJEYXRhOjpMSU5FQVIgfSwKKyAgICAgICAgeyAibGluZWFyLWNodW5rcyIsICBDMkJ1ZmZlckRhdGE6OkxJTkVBUl9DSFVOS1MgfSwKKyAgICAgICAgeyAiZ3JhcGhpYyIsICAgICAgICBDMkJ1ZmZlckRhdGE6OkdSQVBISUMgfSwKKyAgICAgICAgeyAiZ3JhcGhpYy1jaHVua3MiLCBDMkJ1ZmZlckRhdGE6OkdSQVBISUNfQ0hVTktTIH0sCit9KSkKKworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzMzMGU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmNwcApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIiCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuaCIKKworLyogc3RhdGljICovIGFuZHJvaWQ6Ok11dGV4IEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6c011dGV4OworLyogc3RhdGljICovIHN0ZDo6dW5pcXVlX3B0cjxDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI+IEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6c0luc3RhbmNlOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK2NvbnN0ZXhwciBjb25zdCBjaGFyIGtTdG9yZVBsdWdpblBhdGhbXSA9ICJsaWJjMnBsdWdpbl9zdG9yZS5zbyI7CisKK30gIC8vIHVubmFtZWQKKworQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIoY29uc3QgY2hhciAqbGliUGF0aCkKKyAgICA6IG1DcmVhdGVCbG9ja1Bvb2wobnVsbHB0cikgeworICAgIG1MaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aCwgUlRMRF9OT1cgfCBSVExEX05PREVMRVRFKTsKKyAgICBpZiAobUxpYkhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gbG9hZCBsaWJyYXJ5OiAlcyAoJXMpIiwgbGliUGF0aCwgZGxlcnJvcigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ3JlYXRlQmxvY2tQb29sID0gKENyZWF0ZUJsb2NrUG9vbEZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIkNyZWF0ZUJsb2NrUG9vbCIpOworICAgIGlmIChtQ3JlYXRlQmxvY2tQb29sID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBmaW5kIHN5bWJvbDogQ3JlYXRlQmxvY2tQb29sICglcykiLCBkbGVycm9yKCkpOworICAgIH0KKyAgICBtQ3JlYXRlQWxsb2NhdG9yID0gKENyZWF0ZUFsbG9jYXRvckZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIkNyZWF0ZUFsbG9jYXRvciIpOworICAgIGlmIChtQ3JlYXRlQWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBmaW5kIHN5bWJvbDogQ3JlYXRlQWxsb2NhdG9yICglcykiLCBkbGVycm9yKCkpOworICAgIH0KK30KKworQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjp+QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyKCkgeworICAgIGlmIChtTGliSGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIkNsb3NpbmcgaGFuZGxlIik7CisgICAgICAgIGRsY2xvc2UobUxpYkhhbmRsZSk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgOjpDMkFsbG9jYXRvcjo6aWRfdCBhbGxvY2F0b3JJZCwgOjpDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBibG9ja1Bvb2xJZCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiogcG9vbCkgeworICAgIGlmIChtQ3JlYXRlQmxvY2tQb29sID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIkhhbmRsZSBvciBDcmVhdGVCbG9ja1Bvb2wgc3ltYm9sIGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIEMyX05PVF9GT1VORDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8OjpDMkJsb2NrUG9vbD4gcHRyKG1DcmVhdGVCbG9ja1Bvb2woYWxsb2NhdG9ySWQsIGJsb2NrUG9vbElkKSk7CisgICAgaWYgKHB0cikgeworICAgICAgICAqcG9vbCA9IHB0cjsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBBTE9HRCgiRmFpbGVkIHRvIENyZWF0ZUJsb2NrUG9vbCBieSBhbGxvY2F0b3IgaWQ6ICV1IiwgYWxsb2NhdG9ySWQpOworICAgIHJldHVybiBDMl9CQURfSU5ERVg7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6Y3JlYXRlQWxsb2NhdG9yKAorICAgICAgICA6OkMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkLCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+KiBjb25zdCBhbGxvY2F0b3IpIHsKKyAgICBpZiAobUNyZWF0ZUFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJIYW5kbGUgb3IgQ3JlYXRlQWxsb2NhdG9yIHN5bWJvbCBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfQ09SUlVQVEVEOworICAgIGFsbG9jYXRvci0+cmVzZXQobUNyZWF0ZUFsbG9jYXRvcihhbGxvY2F0b3JJZCwgJnJlcykpOworICAgIGlmIChyZXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBDcmVhdGVBbGxvY2F0b3IgYnkgaWQ6ICV1LCByZXM6ICVkIiwgYWxsb2NhdG9ySWQsIHJlcyk7CisgICAgICAgIGFsbG9jYXRvci0+cmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCisvLyBzdGF0aWMKK2NvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI+JiBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OkdldEluc3RhbmNlKCkgeworICAgIGFuZHJvaWQ6Ok11dGV4OjpBdXRvbG9jayBfbChzTXV0ZXgpOworICAgIGlmICghc0luc3RhbmNlKSB7CisgICAgICAgIEFMT0dWKCJMb2FkaW5nIGxpYnJhcnkiKTsKKyAgICAgICAgc0luc3RhbmNlLnJlc2V0KG5ldyBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIoa1N0b3JlUGx1Z2luUGF0aCkpOworICAgIH0KKyAgICByZXR1cm4gc0luc3RhbmNlOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJTdG9yZS5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMlN0b3JlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDc1ODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJTdG9yZS5jcHAKQEAgLTAsMCArMSw5OTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkMyU3RvcmUiCisjZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkJxQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+IC8vIGdldHBhZ2VzaXplCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogUmV0dXJucyB0aGUgcHJlZmVycmVkIGNvbXBvbmVudCBzdG9yZSBpbiB0aGlzIHByb2Nlc3MgdG8gYWNjZXNzIGl0cyBpbnRlcmZhY2UuCisgKi8KK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBHZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZSgpOworCisvKioKKyAqIFRoZSBwbGF0Zm9ybSBhbGxvY2F0b3Igc3RvcmUgcHJvdmlkZXMgYmFzaWMgYWxsb2NhdG9yLXR5cGVzIGZvciB0aGUgZnJhbWV3b3JrIGJhc2VkIG9uIGlvbiBhbmQKKyAqIGdyYWxsb2MuIEFsbG9jYXRvcnMgYXJlIG5vdCBtZWFudCB0byBiZSB1cGRhdGFibGUuCisgKgorICogXHRvZG8gUHJvdmlkZSBhbGxvY2F0b3IgYmFzZWQgb24gYXNobWVtCisgKiBcdG9kbyBNb3ZlIGlvbiBhbGxvY2F0aW9uIGludG8gaXRzIEhJREwgb3IgcHJvdmlkZSBzb21lIG1hcHBpbmcgZnJvbSBtZW1vcnkgdXNhZ2UgdG8gaW9uIGZsYWdzCisgKiBcdG9kbyBNYWtlIHRoaXMgYWxsb2NhdG9yIHN0b3JlIGV4dGVuZGFibGUKKyAqLworY2xhc3MgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbCA6IHB1YmxpYyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUgeworcHVibGljOgorICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGwoKTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hBbGxvY2F0b3IoCisgICAgICAgICAgICBpZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICpjb25zdCBhbGxvY2F0b3IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4+IGxpc3RBbGxvY2F0b3JzX25iKCkKKyAgICAgICAgICAgIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkFsbG9jYXRvcjo6VHJhaXRzPj4oKTsgLy8vIFx0b2RvCisgICAgfQorCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gImFuZHJvaWQuYWxsb2NhdG9yLXN0b3JlIjsKKyAgICB9CisKKyAgICB2b2lkIHNldENvbXBvbmVudFN0b3JlKHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSk7CisKKyAgICB+QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICAvLy8gcmV0dXJucyBhIHNoYXJlZC1zaW5nbGV0b24gaW9uIGFsbG9jYXRvcgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gZmV0Y2hJb25BbGxvY2F0b3IoKTsKKworICAgIC8vLyByZXR1cm5zIGEgc2hhcmVkLXNpbmdsZXRvbiBncmFsbG9jIGFsbG9jYXRvcgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gZmV0Y2hHcmFsbG9jQWxsb2NhdG9yKCk7CisKKyAgICAvLy8gcmV0dXJucyBhIHNoYXJlZC1zaW5nbGV0b24gYnVmZmVycXVldWUgc3VwcG9ydGluZyBncmFsbG9jIGFsbG9jYXRvcgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gZmV0Y2hCdWZmZXJRdWV1ZUFsbG9jYXRvcigpOworCisgICAgLy8vIGNvbXBvbmVudCBzdG9yZSB0byB1c2UKKyAgICBzdGQ6Om11dGV4IF9tQ29tcG9uZW50U3RvcmVTZXRMb2NrOyAvLyBwcm90ZWN0cyB0aGUgZW50aXJlIHVwZGF0aW5nIF9tQ29tcG9uZW50U3RvcmUgYW5kIGl0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcGVuZGVuY2llcworICAgIHN0ZDo6bXV0ZXggX21Db21wb25lbnRTdG9yZVJlYWRMb2NrOyAvLyBtdXN0IHByb3RlY3Qgb25seSByZWFkL3dyaXRlIG9mIF9tQ29tcG9uZW50U3RvcmUKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gX21Db21wb25lbnRTdG9yZTsKK307CisKK0MyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OkMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGwoKSB7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OmZldGNoQWxsb2NhdG9yKAorICAgICAgICBpZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICpjb25zdCBhbGxvY2F0b3IpIHsKKyAgICBhbGxvY2F0b3ItPnJlc2V0KCk7CisgICAgc3dpdGNoIChpZCkgeworICAgIC8vIFRPRE86IHNob3VsZCB3ZSBpbXBsZW1lbnQgYSBnZW5lcmljIHJlZ2lzdHJ5IGZvciBhbGwsIGFuZCB1c2UgdGhhdD8KKyAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6SU9OOgorICAgIGNhc2UgQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVI6CisgICAgICAgICphbGxvY2F0b3IgPSBmZXRjaElvbkFsbG9jYXRvcigpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DOgorICAgIGNhc2UgQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9HUkFQSElDOgorICAgICAgICAqYWxsb2NhdG9yID0gZmV0Y2hHcmFsbG9jQWxsb2NhdG9yKCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFOgorICAgICAgICAqYWxsb2NhdG9yID0gZmV0Y2hCdWZmZXJRdWV1ZUFsbG9jYXRvcigpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIFRyeSB0byBjcmVhdGUgYWxsb2NhdG9yIGZyb20gcGxhdGZvcm0gc3RvcmUgcGx1Z2lucy4KKyAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0KKyAgICAgICAgICAgICAgICBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OkdldEluc3RhbmNlKCktPmNyZWF0ZUFsbG9jYXRvcihpZCwgYWxsb2NhdG9yKTsKKyAgICAgICAgaWYgKHJlcyAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCphbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK25hbWVzcGFjZSB7CisKK3N0ZDo6bXV0ZXggZ0lvbkFsbG9jYXRvck11dGV4Oworc3RkOjp3ZWFrX3B0cjxDMkFsbG9jYXRvcklvbj4gZ0lvbkFsbG9jYXRvcjsKKwordm9pZCBVc2VDb21wb25lbnRTdG9yZUZvcklvbkFsbG9jYXRvcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9ySW9uPiBhbGxvY2F0b3IsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSkgeworICAgIEMyQWxsb2NhdG9ySW9uOjpVc2FnZU1hcHBlckZuIG1hcHBlcjsKKyAgICB1aW50NjRfdCBtaW5Vc2FnZSA9IDA7CisgICAgdWludDY0X3QgbWF4VXNhZ2UgPSBDMk1lbW9yeVVzYWdlKEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUpLmV4cGVjdGVkOworICAgIHNpemVfdCBibG9ja1NpemUgPSBnZXRwYWdlc2l6ZSgpOworCisgICAgLy8gcXVlcnkgbWluIGFuZCBtYXggdXNhZ2UgYXMgd2VsbCBhcyBibG9jayBzaXplIHZpYSBzdXBwb3J0ZWQgdmFsdWVzCisgICAgQzJTdG9yZUlvblVzYWdlSW5mbyB1c2FnZUluZm87CisgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiBxdWVyeSA9IHsKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQb3NzaWJsZShDMlBhcmFtRmllbGQ6Ok1ha2UodXNhZ2VJbmZvLCB1c2FnZUluZm8udXNhZ2UpKSwKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQb3NzaWJsZShDMlBhcmFtRmllbGQ6Ok1ha2UodXNhZ2VJbmZvLCB1c2FnZUluZm8uY2FwYWNpdHkpKSwKKyAgICB9OworICAgIGMyX3N0YXR1c190IHJlcyA9IHN0b3JlLT5xdWVyeVN1cHBvcnRlZFZhbHVlc19zbShxdWVyeSk7CisgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICBpZiAocXVlcnlbMF0uc3RhdHVzID09IEMyX09LKSB7CisgICAgICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZmc3YgPSBxdWVyeVswXS52YWx1ZXM7CisgICAgICAgICAgICBpZiAoZnN2LnR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RkxBR1MgJiYgIWZzdi52YWx1ZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1pblVzYWdlID0gZnN2LnZhbHVlc1swXS51NjQ7CisgICAgICAgICAgICAgICAgbWF4VXNhZ2UgPSAwOworICAgICAgICAgICAgICAgIGZvciAoQzJWYWx1ZTo6UHJpbWl0aXZlIHYgOiBmc3YudmFsdWVzKSB7CisgICAgICAgICAgICAgICAgICAgIG1heFVzYWdlIHw9IHYudTY0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocXVlcnlbMV0uc3RhdHVzID09IEMyX09LKSB7CisgICAgICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZmc3YgPSBxdWVyeVsxXS52YWx1ZXM7CisgICAgICAgICAgICBpZiAoZnN2LnR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UkFOR0UgJiYgZnN2LnJhbmdlLnN0ZXAudTMyID4gMCkgeworICAgICAgICAgICAgICAgIGJsb2NrU2l6ZSA9IGZzdi5yYW5nZS5zdGVwLnUzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1hcHBlciA9IFtzdG9yZV0oQzJNZW1vcnlVc2FnZSB1c2FnZSwgc2l6ZV90IGNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqYWxpZ24sIHVuc2lnbmVkICpoZWFwTWFzaywgdW5zaWduZWQgKmZsYWdzKSAtPiBjMl9zdGF0dXNfdCB7CisgICAgICAgICAgICBpZiAoY2FwYWNpdHkgPiBVSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEMyU3RvcmVJb25Vc2FnZUluZm8gdXNhZ2VJbmZvID0geyB1c2FnZS5leHBlY3RlZCwgY2FwYWNpdHkgfTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsgLy8gVE9ETzogcmVtb3ZlCisgICAgICAgICAgICBjMl9zdGF0dXNfdCByZXMgPSBzdG9yZS0+Y29uZmlnX3NtKHsmdXNhZ2VJbmZvfSwgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAqYWxpZ24gPSB1c2FnZUluZm8ubWluQWxpZ25tZW50OworICAgICAgICAgICAgICAgICpoZWFwTWFzayA9IHVzYWdlSW5mby5oZWFwTWFzazsKKyAgICAgICAgICAgICAgICAqZmxhZ3MgPSB1c2FnZUluZm8uYWxsb2NGbGFnczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH07CisgICAgfQorCisgICAgYWxsb2NhdG9yLT5zZXRVc2FnZU1hcHBlcihtYXBwZXIsIG1pblVzYWdlLCBtYXhVc2FnZSwgYmxvY2tTaXplKTsKK30KKworfQorCit2b2lkIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OnNldENvbXBvbmVudFN0b3JlKHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSkgeworICAgIC8vIHRlY2huaWNhbGx5IHRoaXMgc2V0IGxvY2sgaXMgbm90IG5lZWRlZCwgYnV0IGlzIGhlcmUgZm9yIHNhZmV0eSBpbiBjYXNlIHdlIGFkZCBtb3JlCisgICAgLy8gZ2V0dGVyIG9yZGVycworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKF9tQ29tcG9uZW50U3RvcmVTZXRMb2NrKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKF9tQ29tcG9uZW50U3RvcmVSZWFkTG9jayk7CisgICAgICAgIF9tQ29tcG9uZW50U3RvcmUgPSBzdG9yZTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9ySW9uPiBhbGxvY2F0b3I7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnSW9uQWxsb2NhdG9yTXV0ZXgpOworICAgICAgICBhbGxvY2F0b3IgPSBnSW9uQWxsb2NhdG9yLmxvY2soKTsKKyAgICB9CisgICAgaWYgKGFsbG9jYXRvcikgeworICAgICAgICBVc2VDb21wb25lbnRTdG9yZUZvcklvbkFsbG9jYXRvcihhbGxvY2F0b3IsIHN0b3JlKTsKKyAgICB9Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6ZmV0Y2hJb25BbGxvY2F0b3IoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ0lvbkFsbG9jYXRvck11dGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JJb24+IGFsbG9jYXRvciA9IGdJb25BbGxvY2F0b3IubG9jaygpOworICAgIGlmIChhbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gY29tcG9uZW50U3RvcmU7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKF9tQ29tcG9uZW50U3RvcmVSZWFkTG9jayk7CisgICAgICAgICAgICBjb21wb25lbnRTdG9yZSA9IF9tQ29tcG9uZW50U3RvcmU7CisgICAgICAgIH0KKyAgICAgICAgYWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRvcklvbj4oQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT04pOworICAgICAgICBVc2VDb21wb25lbnRTdG9yZUZvcklvbkFsbG9jYXRvcihhbGxvY2F0b3IsIGNvbXBvbmVudFN0b3JlKTsKKyAgICAgICAgZ0lvbkFsbG9jYXRvciA9IGFsbG9jYXRvcjsKKyAgICB9CisgICAgcmV0dXJuIGFsbG9jYXRvcjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpmZXRjaEdyYWxsb2NBbGxvY2F0b3IoKSB7CisgICAgc3RhdGljIHN0ZDo6bXV0ZXggbXV0ZXg7CisgICAgc3RhdGljIHN0ZDo6d2Vha19wdHI8QzJBbGxvY2F0b3I+IGdyYWxsb2NBbGxvY2F0b3I7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yID0gZ3JhbGxvY0FsbG9jYXRvci5sb2NrKCk7CisgICAgaWYgKGFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgIGFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0b3JHcmFsbG9jPihDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0MpOworICAgICAgICBncmFsbG9jQWxsb2NhdG9yID0gYWxsb2NhdG9yOworICAgIH0KKyAgICByZXR1cm4gYWxsb2NhdG9yOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OmZldGNoQnVmZmVyUXVldWVBbGxvY2F0b3IoKSB7CisgICAgc3RhdGljIHN0ZDo6bXV0ZXggbXV0ZXg7CisgICAgc3RhdGljIHN0ZDo6d2Vha19wdHI8QzJBbGxvY2F0b3I+IGdyYWxsb2NBbGxvY2F0b3I7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yID0gZ3JhbGxvY0FsbG9jYXRvci5sb2NrKCk7CisgICAgaWYgKGFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgIGFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0b3JHcmFsbG9jPigKKyAgICAgICAgICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFLCB0cnVlKTsKKyAgICAgICAgZ3JhbGxvY0FsbG9jYXRvciA9IGFsbG9jYXRvcjsKKyAgICB9CisgICAgcmV0dXJuIGFsbG9jYXRvcjsKK30KKworbmFtZXNwYWNlIHsKKyAgICBzdGQ6Om11dGV4IGdQcmVmZXJyZWRDb21wb25lbnRTdG9yZU11dGV4OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBnUHJlZmVycmVkQ29tcG9uZW50U3RvcmU7CisKKyAgICBzdGQ6Om11dGV4IGdQbGF0Zm9ybUFsbG9jYXRvclN0b3JlTXV0ZXg7CisgICAgc3RkOjp3ZWFrX3B0cjxDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsPiBnUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ1BsYXRmb3JtQWxsb2NhdG9yU3RvcmVNdXRleCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw+IHN0b3JlID0gZ1BsYXRmb3JtQWxsb2NhdG9yU3RvcmUubG9jaygpOworICAgIGlmIChzdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgIHN0b3JlID0gc3RkOjptYWtlX3NoYXJlZDxDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsPigpOworICAgICAgICBzdG9yZS0+c2V0Q29tcG9uZW50U3RvcmUoR2V0UHJlZmVycmVkQ29kZWMyQ29tcG9uZW50U3RvcmUoKSk7CisgICAgICAgIGdQbGF0Zm9ybUFsbG9jYXRvclN0b3JlID0gc3RvcmU7CisgICAgfQorICAgIHJldHVybiBzdG9yZTsKK30KKwordm9pZCBTZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZShzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gY29tcG9uZW50U3RvcmUpIHsKKyAgICBzdGF0aWMgc3RkOjptdXRleCBtdXRleDsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleCk7IC8vIGRvbid0IGludGVybGV2ZSBzZXQtcworCisgICAgLy8gdXBkYXRlIHByZWZlcnJlZCBzdG9yZQorICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ1ByZWZlcnJlZENvbXBvbmVudFN0b3JlTXV0ZXgpOworICAgICAgICBnUHJlZmVycmVkQ29tcG9uZW50U3RvcmUgPSBjb21wb25lbnRTdG9yZTsKKyAgICB9CisKKyAgICAvLyB1cGRhdGUgcGxhdGZvcm0gYWxsb2NhdG9yJ3Mgc3RvcmUgYXMgd2VsbCBpZiBpdCBpcyBhbGl2ZQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsPiBhbGxvY2F0b3JTdG9yZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdQbGF0Zm9ybUFsbG9jYXRvclN0b3JlTXV0ZXgpOworICAgICAgICBhbGxvY2F0b3JTdG9yZSA9IGdQbGF0Zm9ybUFsbG9jYXRvclN0b3JlLmxvY2soKTsKKyAgICB9CisgICAgaWYgKGFsbG9jYXRvclN0b3JlKSB7CisgICAgICAgIGFsbG9jYXRvclN0b3JlLT5zZXRDb21wb25lbnRTdG9yZShjb21wb25lbnRTdG9yZSk7CisgICAgfQorfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gR2V0UHJlZmVycmVkQ29kZWMyQ29tcG9uZW50U3RvcmUoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ1ByZWZlcnJlZENvbXBvbmVudFN0b3JlTXV0ZXgpOworICAgIHJldHVybiBnUHJlZmVycmVkQ29tcG9uZW50U3RvcmUgPyBnUHJlZmVycmVkQ29tcG9uZW50U3RvcmUgOiBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7Cit9CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIF9DMkJsb2NrUG9vbENhY2hlIHsKK3B1YmxpYzoKKyAgICBfQzJCbG9ja1Bvb2xDYWNoZSgpIDogbUJsb2NrUG9vbFNlcUlkKEMyQmxvY2tQb29sOjpQTEFURk9STV9TVEFSVCArIDEpIHt9CisKKyAgICBjMl9zdGF0dXNfdCBfY3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBwb29sSWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBhbGxvY2F0b3JTdG9yZSA9CisgICAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfTk9UX0ZPVU5EOworCisgICAgICAgIHN3aXRjaChhbGxvY2F0b3JJZCkgeworICAgICAgICAgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTjoKKyAgICAgICAgICAgIGNhc2UgQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVI6CisgICAgICAgICAgICAgICAgcmVzID0gYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIsICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwdHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yLCBwb29sSWQpOworICAgICAgICAgICAgICAgICAgICAqcG9vbCA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbHNbcG9vbElkXSA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXSA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQzoKKyAgICAgICAgICAgIGNhc2UgQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9HUkFQSElDOgorICAgICAgICAgICAgICAgIHJlcyA9IGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQywgJmFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHB0ciA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihhbGxvY2F0b3IsIHBvb2xJZCk7CisgICAgICAgICAgICAgICAgICAgICpwb29sID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sc1twb29sSWRdID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdID0gY29tcG9uZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRToKKyAgICAgICAgICAgICAgICByZXMgPSBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcHRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yLCBwb29sSWQpOworICAgICAgICAgICAgICAgICAgICAqcG9vbCA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbHNbcG9vbElkXSA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXSA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIFRyeSB0byBjcmVhdGUgYmxvY2sgcG9vbCBmcm9tIHBsYXRmb3JtIHN0b3JlIHBsdWdpbnMuCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwdHI7CisgICAgICAgICAgICAgICAgcmVzID0gQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpHZXRJbnN0YW5jZSgpLT5jcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JJZCwgcG9vbElkLCAmcHRyKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICpwb29sID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sc1twb29sSWRdID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdID0gY29tcG9uZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCkgeworICAgICAgICByZXR1cm4gX2NyZWF0ZUJsb2NrUG9vbChhbGxvY2F0b3JJZCwgY29tcG9uZW50LCBtQmxvY2tQb29sU2VxSWQrKywgcG9vbCk7CisgICAgfQorCisgICAgYm9vbCBnZXRCbG9ja1Bvb2woCisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBibG9ja1Bvb2xJZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCkgeworICAgICAgICAvLyBUT0RPOiB1c2Ugb25lIGl0ZXJhdG9yIGZvciBtdWx0aXBsZSBibG9ja3Bvb2wgdHlwZSBzY2FsYWJpbGl0eS4KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwdHI7CisgICAgICAgIGF1dG8gaXQgPSBtQmxvY2tQb29scy5maW5kKGJsb2NrUG9vbElkKTsKKyAgICAgICAgaWYgKGl0ICE9IG1CbG9ja1Bvb2xzLmVuZCgpKSB7CisgICAgICAgICAgICBwdHIgPSBpdC0+c2Vjb25kLmxvY2soKTsKKyAgICAgICAgICAgIGlmICghcHRyKSB7CisgICAgICAgICAgICAgICAgbUJsb2NrUG9vbHMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIG1Db21wb25lbnRzLmVyYXNlKGJsb2NrUG9vbElkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXV0byBmb3VuZCA9IG1Db21wb25lbnRzLmZpbmQoYmxvY2tQb29sSWQpOworICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgPT0gZm91bmQtPnNlY29uZC5sb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKnBvb2wgPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCitwcml2YXRlOgorICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xTZXFJZDsKKworICAgIHN0ZDo6bWFwPEMyQmxvY2tQb29sOjpsb2NhbF9pZF90LCBzdGQ6OndlYWtfcHRyPEMyQmxvY2tQb29sPj4gbUJsb2NrUG9vbHM7CisgICAgc3RkOjptYXA8QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QsIHN0ZDo6d2Vha19wdHI8Y29uc3QgQzJDb21wb25lbnQ+PiBtQ29tcG9uZW50czsKK307CisKK3N0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8X0MyQmxvY2tQb29sQ2FjaGU+IHNCbG9ja1Bvb2xDYWNoZSA9CisgICAgc3RkOjptYWtlX3VuaXF1ZTxfQzJCbG9ja1Bvb2xDYWNoZT4oKTsKK3N0YXRpYyBzdGQ6Om11dGV4IHNCbG9ja1Bvb2xDYWNoZU11dGV4OworCit9IC8vIGFueW55bW91cyBuYW1lc3BhY2UKKworYzJfc3RhdHVzX3QgR2V0Q29kZWMyQmxvY2tQb29sKAorICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpIHsKKyAgICBwb29sLT5yZXNldCgpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNCbG9ja1Bvb2xDYWNoZU11dGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gYWxsb2NhdG9yU3RvcmUgPSBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3I7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfTk9UX0ZPVU5EOworCisgICAgaWYgKGlkID49IEMyQmxvY2tQb29sOjpQTEFURk9STV9TVEFSVCkgeworICAgICAgICBpZiAoc0Jsb2NrUG9vbENhY2hlLT5nZXRCbG9ja1Bvb2woaWQsIGNvbXBvbmVudCwgcG9vbCkpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICBjYXNlIEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI6CisgICAgICAgIHJlcyA9IGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUiwgJmFsbG9jYXRvcik7CisgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICpwb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMkJhc2ljTGluZWFyQmxvY2tQb29sPihhbGxvY2F0b3IpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJCbG9ja1Bvb2w6OkJBU0lDX0dSQVBISUM6CisgICAgICAgIHJlcyA9IGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0dSQVBISUMsICZhbGxvY2F0b3IpOworICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAqcG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2w+KGFsbG9jYXRvcik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMuIHRoaXMgaXMgdGVtcG9yYXJ5CisgICAgY2FzZSBDMkJsb2NrUG9vbDo6UExBVEZPUk1fU1RBUlQ6CisgICAgICAgIHJlcyA9IHNCbG9ja1Bvb2xDYWNoZS0+X2NyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFLCBjb21wb25lbnQsIGlkLCBwb29sKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK2MyX3N0YXR1c190IENyZWF0ZUNvZGVjMkJsb2NrUG9vbCgKKyAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCkgeworICAgIHBvb2wtPnJlc2V0KCk7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzQmxvY2tQb29sQ2FjaGVNdXRleCk7CisgICAgcmV0dXJuIHNCbG9ja1Bvb2xDYWNoZS0+Y3JlYXRlQmxvY2tQb29sKGFsbG9jYXRvcklkLCBjb21wb25lbnQsIHBvb2wpOworfQorCitjbGFzcyBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUgOiBwdWJsaWMgQzJDb21wb25lbnRTdG9yZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IGxpc3RDb21wb25lbnRzKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UGFyYW1SZWZsZWN0b3IoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcykgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV9zbSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBoZWFwUGFyYW1zKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIEMyU3RyaW5nIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gKmNvbnN0IGludGVyZmFjZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBDMlN0cmluZyBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICpjb25zdCBjb21wb25lbnQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29weUJ1ZmZlcigKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IHNyYywgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gZHN0KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZ19zbSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcykgb3ZlcnJpZGU7CisgICAgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7CisKKyAgICB2aXJ0dWFsIH5DMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisKKyAgICAvKioKKyAgICAgKiBBbiBvYmplY3QgZW5jYXBzdWxhdGluZyBhIGxvYWRlZCBjb21wb25lbnQgbW9kdWxlLgorICAgICAqCisgICAgICogXHRvZG8gcHJvdmlkZSBhIHdheSB0byBhZGQgdHJhaXRzIHRvIGtub3duIGNvbXBvbmVudHMgaGVyZSB0byBhdm9pZCBsb2FkaW5nIHRoZSAuc28tcworICAgICAqIGZvciBsaXN0Q29tcG9uZW50cworICAgICAqLworICAgIHN0cnVjdCBDb21wb25lbnRNb2R1bGUgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5LAorICAgICAgICAgICAgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8Q29tcG9uZW50TW9kdWxlPiB7CisgICAgICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAqY29tcG9uZW50LAorICAgICAgICAgICAgICAgIENvbXBvbmVudERlbGV0ZXIgZGVsZXRlciA9IHN0ZDo6ZGVmYXVsdF9kZWxldGU8QzJDb21wb25lbnQ+KCkpIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gKmludGVyZmFjZSwKKyAgICAgICAgICAgICAgICBJbnRlcmZhY2VEZWxldGVyIGRlbGV0ZXIgPSBzdGQ6OmRlZmF1bHRfZGVsZXRlPEMyQ29tcG9uZW50SW50ZXJmYWNlPigpKSBvdmVycmlkZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogXHJldHVybnMgdGhlIHRyYWl0cyBvZiB0aGUgY29tcG9uZW50IGluIHRoaXMgbW9kdWxlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+IGdldFRyYWl0cygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIHVuaW5pdGlhbGl6ZWQgY29tcG9uZW50IG1vZHVsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIG5hbWVbaW5dICBjb21wb25lbnQgbmFtZS4KKyAgICAgICAgICoKKyAgICAgICAgICogXG5vdGUgT25seSB1c2VkIGJ5IENvbXBvbmVudExvYWRlci4KKyAgICAgICAgICovCisgICAgICAgIENvbXBvbmVudE1vZHVsZSgpCisgICAgICAgICAgICA6IG1Jbml0KEMyX05PX0lOSVQpLAorICAgICAgICAgICAgICBtTGliSGFuZGxlKG51bGxwdHIpLAorICAgICAgICAgICAgICBjcmVhdGVGYWN0b3J5KG51bGxwdHIpLAorICAgICAgICAgICAgICBkZXN0cm95RmFjdG9yeShudWxscHRyKSwKKyAgICAgICAgICAgICAgbUNvbXBvbmVudEZhY3RvcnkobnVsbHB0cikgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluaXRpYWxpemVzIGEgY29tcG9uZW50IG1vZHVsZSB3aXRoIGEgZ2l2ZW4gbGlicmFyeSBwYXRoLiBNdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UuCisgICAgICAgICAqCisgICAgICAgICAqIFxub3RlIE9ubHkgdXNlZCBieSBDb21wb25lbnRMb2FkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBsaWJQYXRoW2luXSBsaWJyYXJ5IHBhdGgKKyAgICAgICAgICoKKyAgICAgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBtb2R1bGUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGxvYWRlZAorICAgICAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBsb2FkaW5nIHRoZSBjb21wb25lbnQgbW9kdWxlCisgICAgICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGNvdWxkIG5vdCBsb2NhdGUgdGhlIGNvbXBvbmVudCBtb2R1bGUKKyAgICAgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgdGhlIGNvbXBvbmVudCBtb2R1bGUgY291bGQgbm90IGJlIGxvYWRlZCAodW5leHBlY3RlZCkKKyAgICAgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgcGVybWlzc2lvbiBkZW5pZWQgdG8gbG9hZCB0aGUgY29tcG9uZW50IG1vZHVsZSAodW5leHBlY3RlZCkKKyAgICAgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGxvYWQgdGhlIG1vZHVsZSB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICAgICAqLworICAgICAgICBjMl9zdGF0dXNfdCBpbml0KHN0ZDo6c3RyaW5nIGxpYlBhdGgpOworCisgICAgICAgIHZpcnR1YWwgfkNvbXBvbmVudE1vZHVsZSgpIG92ZXJyaWRlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBzdGQ6OnJlY3Vyc2l2ZV9tdXRleCBtTG9jazsgLy8vPCBsb2NrIHByb3RlY3RpbmcgbVRyYWl0cworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6OlRyYWl0cz4gbVRyYWl0czsgLy8vPCBjYWNoZWQgY29tcG9uZW50IHRyYWl0cworCisgICAgICAgIGMyX3N0YXR1c190IG1Jbml0OyAvLy88IGluaXRpYWxpemF0aW9uIHJlc3VsdAorCisgICAgICAgIHZvaWQgKm1MaWJIYW5kbGU7IC8vLzwgbG9hZGVkIGxpYnJhcnkgaGFuZGxlCisgICAgICAgIEMyQ29tcG9uZW50RmFjdG9yeTo6Q3JlYXRlQ29kZWMyRmFjdG9yeUZ1bmMgY3JlYXRlRmFjdG9yeTsgLy8vPCBsb2FkZWQgY3JlYXRlIGZ1bmN0aW9uCisgICAgICAgIEMyQ29tcG9uZW50RmFjdG9yeTo6RGVzdHJveUNvZGVjMkZhY3RvcnlGdW5jIGRlc3Ryb3lGYWN0b3J5OyAvLy88IGxvYWRlZCBkZXN0cm95IGZ1bmN0aW9uCisgICAgICAgIEMyQ29tcG9uZW50RmFjdG9yeSAqbUNvbXBvbmVudEZhY3Rvcnk7IC8vLzwgbG9hZGVkL2NyZWF0ZWQgY29tcG9uZW50IGZhY3RvcnkKKyAgICB9OworCisgICAgLyoqCisgICAgICogQW4gb2JqZWN0IGVuY2Fwc3VsYXRpbmcgYSBsb2FkYWJsZSBjb21wb25lbnQgbW9kdWxlLgorICAgICAqCisgICAgICogXHRvZG8gbWFrZSB0aGlzIGFsc28gd29yayBmb3IgZW51bWVyYXRpb25zCisgICAgICovCisgICAgc3RydWN0IENvbXBvbmVudExvYWRlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBMb2FkIHRoZSBjb21wb25lbnQgbW9kdWxlLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBzaW1wbHkgcmV0dXJucyB0aGUgY29tcG9uZW50IG1vZHVsZSBpZiBpdCBpcyBhbHJlYWR5IGN1cnJlbnRseSBsb2FkZWQsIG9yCisgICAgICAgICAqIGF0dGVtcHRzIHRvIGxvYWQgaXQgaWYgaXQgaXMgbm90LgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gbW9kdWxlW291dF0gcG9pbnRlciB0byB0aGUgc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGxvYWRlZCBtb2R1bGUgc2hhbGwgYmUgc3RvcmVkLgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgVGhpcyB3aWxsIGJlIG51bGxwdHIgb24gZXJyb3IuCisgICAgICAgICAqCisgICAgICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgbW9kdWxlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBsb2FkZWQKKyAgICAgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gbG9hZGluZyB0aGUgY29tcG9uZW50IG1vZHVsZQorICAgICAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBjb3VsZCBub3QgbG9jYXRlIHRoZSBjb21wb25lbnQgbW9kdWxlCisgICAgICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHRoZSBjb21wb25lbnQgbW9kdWxlIGNvdWxkIG5vdCBiZSBsb2FkZWQKKyAgICAgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgcGVybWlzc2lvbiBkZW5pZWQgdG8gbG9hZCB0aGUgY29tcG9uZW50IG1vZHVsZQorICAgICAgICAgKi8KKyAgICAgICAgYzJfc3RhdHVzX3QgZmV0Y2hNb2R1bGUoc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gKm1vZHVsZSkgeworICAgICAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfT0s7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbG9jYWxNb2R1bGUgPSBtTW9kdWxlLmxvY2soKTsKKyAgICAgICAgICAgIGlmIChsb2NhbE1vZHVsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbG9jYWxNb2R1bGUgPSBzdGQ6Om1ha2Vfc2hhcmVkPENvbXBvbmVudE1vZHVsZT4oKTsKKyAgICAgICAgICAgICAgICByZXMgPSBsb2NhbE1vZHVsZS0+aW5pdChtTGliUGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBtTW9kdWxlID0gbG9jYWxNb2R1bGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKm1vZHVsZSA9IGxvY2FsTW9kdWxlOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgY29tcG9uZW50IGxvYWRlciBmb3IgYSBzcGVjaWZpYyBsaWJyYXJ5IHBhdGggKG9yIG5hbWUpLgorICAgICAgICAgKi8KKyAgICAgICAgQ29tcG9uZW50TG9hZGVyKHN0ZDo6c3RyaW5nIGxpYlBhdGgpCisgICAgICAgICAgICA6IG1MaWJQYXRoKGxpYlBhdGgpIHt9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsgLy8vPCBtdXRleCBndWFyZGluZyB0aGUgbW9kdWxlCisgICAgICAgIHN0ZDo6d2Vha19wdHI8Q29tcG9uZW50TW9kdWxlPiBtTW9kdWxlOyAvLy88IHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBsb2FkZWQgbW9kdWxlCisgICAgICAgIHN0ZDo6c3RyaW5nIG1MaWJQYXRoOyAvLy88IGxpYnJhcnkgcGF0aAorICAgIH07CisKKyAgICBzdHJ1Y3QgSW50ZXJmYWNlIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RvcmVJb25Vc2FnZUluZm8+IG1Jb25Vc2FnZUluZm87CisKKyAgICAgICAgSW50ZXJmYWNlKHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gcmVmbGVjdG9yKQorICAgICAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihyZWZsZWN0b3IpIHsKKyAgICAgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICAgICAgc3RydWN0IFNldHRlciB7CisgICAgICAgICAgICAgICAgc3RhdGljIEMyUiBzZXRJb25Vc2FnZShib29sIC8qIG1heUJsb2NrICovLCBDMlA8QzJTdG9yZUlvblVzYWdlSW5mbz4gJm1lKSB7CisgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLmhlYXBNYXNrID0gfjA7CisgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLmFsbG9jRmxhZ3MgPSAwOworICAgICAgICAgICAgICAgICAgICBtZS5zZXQoKS5taW5BbGlnbm1lbnQgPSAwOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW9uVXNhZ2VJbmZvLCAiaW9uLXVzYWdlIikKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RvcmVJb25Vc2FnZUluZm8oKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtSW9uVXNhZ2VJbmZvLCB1c2FnZSkuZmxhZ3Moe0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEIHwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtSW9uVXNhZ2VJbmZvLCBjYXBhY2l0eSkuaW5SYW5nZSgwLCBVSU5UMzJfTUFYLCAxMDI0KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Jb25Vc2FnZUluZm8sIGhlYXBNYXNrKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Jb25Vc2FnZUluZm8sIGFsbG9jRmxhZ3MpLmZsYWdzKHt9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Jb25Vc2FnZUluZm8sIG1pbkFsaWdubWVudCkuZXF1YWxUbygwKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyOjpzZXRJb25Vc2FnZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBjb21wb25lbnQgbW9kdWxlIGZvciBhIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtb2R1bGUgcG9pbnRlciB0byBhIHNoYXJlZF9wb2ludGVyIHdoZXJlIHRoZSBjb21wb25lbnQgbW9kdWxlIHdpbGwgYmUgc3RvcmVkIG9uCisgICAgICogICAgICAgICAgICAgICBzdWNjZXNzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBsb2FkZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGxvY2F0ZSB0aGUgY29tcG9uZW50IGxvYWRlcgorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGNvdWxkIG5vdCBsb2NhdGUgdGhlIGNvbXBvbmVudCB0byBiZSBsb2FkZWQKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCB0aGUgY29tcG9uZW50IGxvYWRlciBjb3VsZCBub3QgYmUgaWRlbnRpZmllZCBkdWUgdG8gc29tZSBtb2R1bGVzIGJlaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgY29ycnVwdGVkICh0aGlzIGNhbiBoYXBwZW4gaWYgdGhlIG5hbWUgZG9lcyBub3QgcmVmZXIgdG8gYW4gYWxyZWFkeQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZWQgY29tcG9uZW50IGJ1dCBzb21lIGNvbXBvbmVudHMgY291bGQgbm90IGJlIGxvYWRlZCBkdWUgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBiYWQgbGlicmFyeSkKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBwZXJtaXNzaW9uIGRlbmllZCB0byBmaW5kIHRoZSBjb21wb25lbnQgbG9hZGVyIGZvciB0aGUgbmFtZWQgY29tcG9uZW50CisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgbmFtZSBkb2VzIG5vdCByZWZlciB0byBhbiBhbHJlYWR5IGlkZW50aWZpZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgYnV0IHNvbWUgY29tcG9uZW50cyBjb3VsZCBub3QgYmUgbG9hZGVkIGR1ZSB0byBsYWNrIG9mCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMpCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgZmluZENvbXBvbmVudChDMlN0cmluZyBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiAqbW9kdWxlKTsKKworICAgIC8qKgorICAgICAqIExvYWRzIGVhY2ggY29tcG9uZW50IG1vZHVsZSBhbmQgZGlzY292ZXIgaXRzIGNvbnRlbnRzLgorICAgICAqLworICAgIHZvaWQgdmlzaXRDb21wb25lbnRzKCk7CisKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsgLy8vPCBtdXRleCBndWFyZGluZyB0aGUgY29tcG9uZW50IGxpc3RzIGR1cmluZyBjb25zdHJ1Y3Rpb24KKyAgICBib29sIG1WaXNpdGVkOyAvLy88IGNvbXBvbmVudCBtb2R1bGVzIHZpc2l0ZWQKKyAgICBzdGQ6Om1hcDxDMlN0cmluZywgQ29tcG9uZW50TG9hZGVyPiBtQ29tcG9uZW50czsgLy8vPCBwYXRoIC0+IGNvbXBvbmVudCBtb2R1bGUKKyAgICBzdGQ6Om1hcDxDMlN0cmluZywgQzJTdHJpbmc+IG1Db21wb25lbnROYW1lVG9QYXRoOyAvLy88IG5hbWUgLT4gcGF0aAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gbUNvbXBvbmVudExpc3Q7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1SZWZsZWN0b3I7CisgICAgSW50ZXJmYWNlIG1JbnRlcmZhY2U7Cit9OworCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudE1vZHVsZTo6aW5pdCgKKyAgICAgICAgc3RkOjpzdHJpbmcgbGliUGF0aCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBBTE9HVigibG9hZGluZyBkbGwiKTsKKyAgICBtTGliSGFuZGxlID0gZGxvcGVuKGxpYlBhdGguY19zdHIoKSwgUlRMRF9OT1d8UlRMRF9OT0RFTEVURSk7CisgICAgaWYgKG1MaWJIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBjb3VsZCBiZSBhY2Nlc3Mvc3ltYm9sIG9yIHNpbXBseSBub3QgYmVpbmcgdGhlcmUKKyAgICAgICAgQUxPR0QoImNvdWxkIG5vdCBkbG9wZW4gJXM6ICVzIiwgbGliUGF0aC5jX3N0cigpLCBkbGVycm9yKCkpOworICAgICAgICBtSW5pdCA9IEMyX0NPUlJVUFRFRDsKKyAgICB9IGVsc2UgeworICAgICAgICBjcmVhdGVGYWN0b3J5ID0KKyAgICAgICAgICAgIChDMkNvbXBvbmVudEZhY3Rvcnk6OkNyZWF0ZUNvZGVjMkZhY3RvcnlGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJDcmVhdGVDb2RlYzJGYWN0b3J5Iik7CisgICAgICAgIGRlc3Ryb3lGYWN0b3J5ID0KKyAgICAgICAgICAgIChDMkNvbXBvbmVudEZhY3Rvcnk6OkRlc3Ryb3lDb2RlYzJGYWN0b3J5RnVuYylkbHN5bShtTGliSGFuZGxlLCAiRGVzdHJveUNvZGVjMkZhY3RvcnkiKTsKKworICAgICAgICBtQ29tcG9uZW50RmFjdG9yeSA9IGNyZWF0ZUZhY3RvcnkoKTsKKyAgICAgICAgaWYgKG1Db21wb25lbnRGYWN0b3J5ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJjb3VsZCBub3QgY3JlYXRlIGZhY3RvcnkgaW4gJXMiLCBsaWJQYXRoLmNfc3RyKCkpOworICAgICAgICAgICAgbUluaXQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW5pdCA9IEMyX09LOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmOworICAgIGMyX3N0YXR1c190IHJlcyA9IGNyZWF0ZUludGVyZmFjZSgwLCAmaW50Zik7CisgICAgaWYgKHJlcyAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIGNyZWF0ZSBpbnRlcmZhY2U6ICVkIiwgcmVzKTsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6VHJhaXRzPiB0cmFpdHMobmV3IChzdGQ6Om5vdGhyb3cpIEMyQ29tcG9uZW50OjpUcmFpdHMpOworICAgIGlmICh0cmFpdHMpIHsKKyAgICAgICAgdHJhaXRzLT5uYW1lID0gaW50Zi0+Z2V0TmFtZSgpOworCisgICAgICAgIEMyQ29tcG9uZW50S2luZFNldHRpbmcga2luZDsKKyAgICAgICAgQzJDb21wb25lbnREb21haW5TZXR0aW5nIGRvbWFpbjsKKyAgICAgICAgcmVzID0gaW50Zi0+cXVlcnlfdmIoeyAma2luZCwgJmRvbWFpbiB9LCB7fSwgQzJfTUFZX0JMT0NLLCBudWxscHRyKTsKKyAgICAgICAgYm9vbCBmaXhEb21haW4gPSByZXMgIT0gQzJfT0s7CisgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHRyYWl0cy0+a2luZCA9IGtpbmQudmFsdWU7CisgICAgICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IGRvbWFpbi52YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGZhbGwtYmFjaworICAgICAgICAgICAgQUxPR0QoImZhaWxlZCB0byBxdWVyeSBpbnRlcmZhY2UgZm9yIGtpbmQgYW5kIGRvbWFpbjogJWQiLCByZXMpOworCisgICAgICAgICAgICB0cmFpdHMtPmtpbmQgPQorICAgICAgICAgICAgICAgICh0cmFpdHMtPm5hbWUuZmluZCgiZW5jb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSA/IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIgOgorICAgICAgICAgICAgICAgICh0cmFpdHMtPm5hbWUuZmluZCgiZGVjb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSA/IEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIgOgorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX09USEVSOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgbWVkaWFUeXBlSW5kZXggPQorICAgICAgICAgICAgICAgIHRyYWl0cy0+a2luZCA9PSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSID8gQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0OjpQQVJBTV9UWVBFCisgICAgICAgICAgICAgICAgOiBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgICAgIHJlcyA9IGludGYtPnF1ZXJ5X3ZiKHt9LCB7IG1lZGlhVHlwZUluZGV4IH0sIEMyX01BWV9CTE9DSywgJnBhcmFtcyk7CisgICAgICAgIGlmIChyZXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gcXVlcnkgaW50ZXJmYWNlOiAlZCIsIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gcXVlcnkgaW50ZXJmYWNlOiB1bmV4cGVjdGVkIHZlY3RvciBzaXplOiAlenUiLCBwYXJhbXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICAgICAgfQorICAgICAgICBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nICptZWRpYVR5cGVDb25maWcgPSBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgIGlmIChtZWRpYVR5cGVDb25maWcgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0QoImZhaWxlZCB0byBxdWVyeSBtZWRpYSB0eXBlIik7CisgICAgICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgICAgIH0KKyAgICAgICAgdHJhaXRzLT5tZWRpYVR5cGUgPQorICAgICAgICAgICAgc3RkOjpzdHJpbmcobWVkaWFUeXBlQ29uZmlnLT5tLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RybmxlbihtZWRpYVR5cGVDb25maWctPm0udmFsdWUsIG1lZGlhVHlwZUNvbmZpZy0+ZmxleENvdW50KCkpKTsKKworICAgICAgICBpZiAoZml4RG9tYWluKSB7CisgICAgICAgICAgICBpZiAoc3RybmNtcCh0cmFpdHMtPm1lZGlhVHlwZS5jX3N0cigpLCAiYXVkaW8vIiwgNikgPT0gMCkgeworICAgICAgICAgICAgICAgIHRyYWl0cy0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCh0cmFpdHMtPm1lZGlhVHlwZS5jX3N0cigpLCAidmlkZW8vIiwgNikgPT0gMCkgeworICAgICAgICAgICAgICAgIHRyYWl0cy0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCh0cmFpdHMtPm1lZGlhVHlwZS5jX3N0cigpLCAiaW1hZ2UvIiwgNikgPT0gMCkgeworICAgICAgICAgICAgICAgIHRyYWl0cy0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJhaXRzLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogZ2V0IHRoaXMgcHJvcGVybHkgZnJvbSB0aGUgc3RvcmUgZHVyaW5nIGVtcGxhY2UKKyAgICAgICAgc3dpdGNoICh0cmFpdHMtPmRvbWFpbikgeworICAgICAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU86CisgICAgICAgICAgICB0cmFpdHMtPnJhbmsgPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0cmFpdHMtPnJhbmsgPSA1MTI7CisgICAgICAgIH0KKworICAgICAgICBwYXJhbXMuY2xlYXIoKTsKKyAgICAgICAgcmVzID0gaW50Zi0+cXVlcnlfdmIoe30sIHsgQzJDb21wb25lbnRBbGlhc2VzU2V0dGluZzo6UEFSQU1fVFlQRSB9LCBDMl9NQVlfQkxPQ0ssICZwYXJhbXMpOworICAgICAgICBpZiAocmVzID09IEMyX09LICYmIHBhcmFtcy5zaXplKCkgPT0gMXUpIHsKKyAgICAgICAgICAgIEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmcgKmFsaWFzZXNTZXR0aW5nID0KKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudEFsaWFzZXNTZXR0aW5nOjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICBpZiAoYWxpYXNlc1NldHRpbmcpIHsKKyAgICAgICAgICAgICAgICAvLyBTcGxpdCBhbGlhc2VzIG9uICcsJworICAgICAgICAgICAgICAgIC8vIFRoaXMgbG9va3Mgc2ltcGxlciBpbiBwbGFpbiBDIGFuZCBldmVuIHN0ZDo6c3RyaW5nIHdvdWxkIHN0aWxsIG1ha2UgYSBjb3B5LgorICAgICAgICAgICAgICAgIGNoYXIgKmFsaWFzZXMgPSA6OnN0cm5kdXAoYWxpYXNlc1NldHRpbmctPm0udmFsdWUsIGFsaWFzZXNTZXR0aW5nLT5mbGV4Q291bnQoKSk7CisgICAgICAgICAgICAgICAgQUxPR0QoIiclcycgaGFzIGFsaWFzZXM6ICclcyciLCBpbnRmLT5nZXROYW1lKCkuY19zdHIoKSwgYWxpYXNlcyk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGNoYXIgKnRvaywgKnB0ciwgKnN0ciA9IGFsaWFzZXM7ICh0b2sgPSA6OnN0cnRva19yKHN0ciwgIiwiLCAmcHRyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHRyYWl0cy0+YWxpYXNlcy5wdXNoX2JhY2sodG9rKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImFkZGluZyBhbGlhczogJyVzJyIsIHRvayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyZWUoYWxpYXNlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbVRyYWl0cyA9IHRyYWl0czsKKworICAgIHJldHVybiBtSW5pdDsKK30KKworQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRNb2R1bGU6On5Db21wb25lbnRNb2R1bGUoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGlmIChkZXN0cm95RmFjdG9yeSAmJiBtQ29tcG9uZW50RmFjdG9yeSkgeworICAgICAgICBkZXN0cm95RmFjdG9yeShtQ29tcG9uZW50RmFjdG9yeSk7CisgICAgfQorICAgIGlmIChtTGliSGFuZGxlKSB7CisgICAgICAgIEFMT0dWKCJ1bmxvYWRpbmcgZGxsIik7CisgICAgICAgIGRsY2xvc2UobUxpYkhhbmRsZSk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudE1vZHVsZTo6Y3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gKmludGVyZmFjZSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKDo6QzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgeworICAgIGludGVyZmFjZS0+cmVzZXQoKTsKKyAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiBtb2R1bGUgPSBzaGFyZWRfZnJvbV90aGlzKCk7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gbUNvbXBvbmVudEZhY3RvcnktPmNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGlkLCBpbnRlcmZhY2UsIFttb2R1bGUsIGRlbGV0ZXJdKEMyQ29tcG9uZW50SW50ZXJmYWNlICpwKSBtdXRhYmxlIHsKKyAgICAgICAgICAgICAgICAvLyBjYXB0dXJlIG1vZHVsZSBzbyB0aGF0IHdlIGVuc3VyZSB3ZSBzdGlsbCBoYXZlIGl0IHdoaWxlIGRlbGV0aW5nIGludGVyZmFjZQorICAgICAgICAgICAgICAgIGRlbGV0ZXIocCk7IC8vIGRlbGV0ZSBpbnRlcmZhY2UgZmlyc3QKKyAgICAgICAgICAgICAgICBtb2R1bGUucmVzZXQoKTsgLy8gcmVtb3ZlIG1vZHVsZSByZWYgKG5vdCB0ZWNobmljYWxseSBuZWVkZWQpCisgICAgfSk7CisgICAgcmV0dXJuIHJlczsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRNb2R1bGU6OmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICpjb21wb25lbnQsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCg6OkMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIHsKKyAgICBjb21wb25lbnQtPnJlc2V0KCk7CisgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbW9kdWxlID0gc2hhcmVkX2Zyb21fdGhpcygpOworICAgIGMyX3N0YXR1c190IHJlcyA9IG1Db21wb25lbnRGYWN0b3J5LT5jcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBpZCwgY29tcG9uZW50LCBbbW9kdWxlLCBkZWxldGVyXShDMkNvbXBvbmVudCAqcCkgbXV0YWJsZSB7CisgICAgICAgICAgICAgICAgLy8gY2FwdHVyZSBtb2R1bGUgc28gdGhhdCB3ZSBlbnN1cmUgd2Ugc3RpbGwgaGF2ZSBpdCB3aGlsZSBkZWxldGluZyBjb21wb25lbnQKKyAgICAgICAgICAgICAgICBkZWxldGVyKHApOyAvLyBkZWxldGUgY29tcG9uZW50IGZpcnN0CisgICAgICAgICAgICAgICAgbW9kdWxlLnJlc2V0KCk7IC8vIHJlbW92ZSBtb2R1bGUgcmVmIChub3QgdGVjaG5pY2FsbHkgbmVlZGVkKQorICAgIH0pOworICAgIHJldHVybiByZXM7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudE1vZHVsZTo6Z2V0VHJhaXRzKCkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobUxvY2spOworICAgIHJldHVybiBtVHJhaXRzOworfQorCitDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OkMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpCisgICAgOiBtVmlzaXRlZChmYWxzZSksCisgICAgICBtUmVmbGVjdG9yKHN0ZDo6bWFrZV9zaGFyZWQ8QzJSZWZsZWN0b3JIZWxwZXI+KCkpLAorICAgICAgbUludGVyZmFjZShtUmVmbGVjdG9yKSB7CisKKyAgICBhdXRvIGVtcGxhY2UgPSBbdGhpc10oY29uc3QgY2hhciAqbGliUGF0aCkgeworICAgICAgICBtQ29tcG9uZW50cy5lbXBsYWNlKGxpYlBhdGgsIGxpYlBhdGgpOworICAgIH07CisKKyAgICAvLyBUT0RPOiBtb3ZlIHRoaXMgYWxzbyBpbnRvIGEgLnNvIHNvIGl0IGNhbiBiZSB1cGRhdGVkCisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfYWFjZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfYWFjZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfYW1ybmJkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9hbXJuYmVuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2FtcndiZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfYW1yd2JlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9hdjFkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9hdmNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9hdmNlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9mbGFjZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfZmxhY2VuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2c3MTFhbGF3ZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfZzcxMW1sYXdkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9nc21kZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9oMjYzZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfaDI2M2VuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2hldmNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9oZXZjZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfbXAzZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfbXBlZzJkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9tcGVnNGRlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X21wZWc0ZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfb3B1c2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X29wdXNlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9yYXdkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF92b3JiaXNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF92cDhkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF92cDhlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF92cDlkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF92cDllbmMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF94YWFjZGVjLnNvIik7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Y29weUJ1ZmZlcigKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gc3JjLCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiBkc3QpIHsKKyAgICAodm9pZClzcmM7CisgICAgKHZvaWQpZHN0OworICAgIHJldHVybiBDMl9PTUlUVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OnF1ZXJ5X3NtKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKmNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0IHsKKyAgICByZXR1cm4gbUludGVyZmFjZS5xdWVyeShzdGFja1BhcmFtcywgaGVhcFBhcmFtSW5kaWNlcywgQzJfTUFZX0JMT0NLLCBoZWFwUGFyYW1zKTsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpjb25maWdfc20oCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzKSB7CisgICAgcmV0dXJuIG1JbnRlcmZhY2UuY29uZmlnKHBhcmFtcywgQzJfTUFZX0JMT0NLLCBmYWlsdXJlcyk7Cit9CisKK3ZvaWQgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjp2aXNpdENvbXBvbmVudHMoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBpZiAobVZpc2l0ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8gJnBhdGhBbmRMb2FkZXIgOiBtQ29tcG9uZW50cykgeworICAgICAgICBjb25zdCBDMlN0cmluZyAmcGF0aCA9IHBhdGhBbmRMb2FkZXIuZmlyc3Q7CisgICAgICAgIENvbXBvbmVudExvYWRlciAmbG9hZGVyID0gcGF0aEFuZExvYWRlci5zZWNvbmQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+IG1vZHVsZTsKKyAgICAgICAgaWYgKGxvYWRlci5mZXRjaE1vZHVsZSgmbW9kdWxlKSA9PSBDMl9PSykgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+IHRyYWl0cyA9IG1vZHVsZS0+Z2V0VHJhaXRzKCk7CisgICAgICAgICAgICBpZiAodHJhaXRzKSB7CisgICAgICAgICAgICAgICAgbUNvbXBvbmVudExpc3QucHVzaF9iYWNrKHRyYWl0cyk7CisgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWVUb1BhdGguZW1wbGFjZSh0cmFpdHMtPm5hbWUsIHBhdGgpOworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgQzJTdHJpbmcgJmFsaWFzIDogdHJhaXRzLT5hbGlhc2VzKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lVG9QYXRoLmVtcGxhY2UoYWxpYXMsIHBhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtVmlzaXRlZCA9IHRydWU7Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpsaXN0Q29tcG9uZW50cygpIHsKKyAgICAvLyBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDUwMG1zLgorICAgIHZpc2l0Q29tcG9uZW50cygpOworICAgIHJldHVybiBtQ29tcG9uZW50TGlzdDsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpmaW5kQ29tcG9uZW50KAorICAgICAgICBDMlN0cmluZyBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiAqbW9kdWxlKSB7CisgICAgKCptb2R1bGUpLnJlc2V0KCk7CisgICAgdmlzaXRDb21wb25lbnRzKCk7CisKKyAgICBhdXRvIHBvcyA9IG1Db21wb25lbnROYW1lVG9QYXRoLmZpbmQobmFtZSk7CisgICAgaWYgKHBvcyAhPSBtQ29tcG9uZW50TmFtZVRvUGF0aC5lbmQoKSkgeworICAgICAgICByZXR1cm4gbUNvbXBvbmVudHMuYXQocG9zLT5zZWNvbmQpLmZldGNoTW9kdWxlKG1vZHVsZSk7CisgICAgfQorICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Y3JlYXRlQ29tcG9uZW50KAorICAgICAgICBDMlN0cmluZyBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICpjb25zdCBjb21wb25lbnQpIHsKKyAgICAvLyBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDEwMG1zLgorICAgIGNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiBtb2R1bGU7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gZmluZENvbXBvbmVudChuYW1lLCAmbW9kdWxlKTsKKyAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgIC8vIFRPRE86IGdldCBhIHVuaXF1ZSBub2RlIElECisgICAgICAgIHJlcyA9IG1vZHVsZS0+Y3JlYXRlQ29tcG9uZW50KDAsIGNvbXBvbmVudCk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Y3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBDMlN0cmluZyBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICpjb25zdCBpbnRlcmZhY2UpIHsKKyAgICAvLyBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDEwMG1zLgorICAgIGludGVyZmFjZS0+cmVzZXQoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiBtb2R1bGU7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gZmluZENvbXBvbmVudChuYW1lLCAmbW9kdWxlKTsKKyAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgIC8vIFRPRE86IGdldCBhIHVuaXF1ZSBub2RlIElECisgICAgICAgIHJlcyA9IG1vZHVsZS0+Y3JlYXRlSW50ZXJmYWNlKDAsIGludGVyZmFjZSk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IHsKKyAgICByZXR1cm4gbUludGVyZmFjZS5xdWVyeVN1cHBvcnRlZFBhcmFtcyhwYXJhbXMpOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKAorICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMpIGNvbnN0IHsKKyAgICByZXR1cm4gbUludGVyZmFjZS5xdWVyeVN1cHBvcnRlZFZhbHVlcyhmaWVsZHMsIEMyX01BWV9CTE9DSyk7Cit9CisKK0MyU3RyaW5nIEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Z2V0TmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gImFuZHJvaWQuY29tcG9uZW50U3RvcmUucGxhdGZvcm0iOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpnZXRQYXJhbVJlZmxlY3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbVJlZmxlY3RvcjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKSB7CisgICAgc3RhdGljIHN0ZDo6bXV0ZXggbXV0ZXg7CisgICAgc3RhdGljIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnRTdG9yZT4gcGxhdGZvcm1TdG9yZTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHN0b3JlID0gcGxhdGZvcm1TdG9yZS5sb2NrKCk7CisgICAgaWYgKHN0b3JlID09IG51bGxwdHIpIHsKKyAgICAgICAgc3RvcmUgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZT4oKTsKKyAgICAgICAgcGxhdGZvcm1TdG9yZSA9IHN0b3JlOworICAgIH0KKyAgICByZXR1cm4gc3RvcmU7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JHcmFsbG9jLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9yR3JhbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZDk4OWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9yR3JhbGxvYy5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0NPREVDMl9BTExPQ0FUT1JfR1JBTExPQ19IXworI2RlZmluZSBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0dSQUxMT0NfSF8KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVW53cmFwIHRoZSBuYXRpdmUgaGFuZGxlIGZyb20gYSBDb2RlYzIgaGFuZGxlIGFsbG9jYXRlZCBieSBDMkFsbG9jYXRvckdyYWxsb2MuCisgKgorICogQHBhcmFtIGhhbmRsZSBhIGhhbmRsZSBhbGxvY2F0ZWQgYnkgQzJBbGxvY2F0b3JHcmFsbG9jLiBUaGlzIGluY2x1ZGVzIGhhbmRsZXMgcmV0dXJuZWQgZm9yIGEKKyAqIGdyYXBoaWMgYmxvY2sgYWxsb2NhdGlvbiBoYW5kbGUgcmV0dXJuZWQuCisgKgorICogQHJldHVybiBhIG5ldyBOT04tT1dOSU5HIG5hdGl2ZSBoYW5kbGUgdGhhdCBtdXN0IGJlIGRlbGV0ZWQgdXNpbmcgbmF0aXZlX2hhbmRsZV9kZWxldGUuCisgKi8KK25hdGl2ZV9oYW5kbGVfdCAqVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZShjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlKTsKKworLyoqCisgKiBXcmFwIHRoZSBncmFsbG9jIGhhbmRsZSBhbmQgbWV0YWRhdGEgaW50byBDb2RlYzIgaGFuZGxlIHJlY29nbml6ZWQgYnkKKyAqIEMyQWxsb2NhdG9yR3JhbGxvYy4KKyAqCisgKiBAcmV0dXJuIGEgbmV3IE5PTi1PV05JTkcgQzJIYW5kbGUgdGhhdCBtdXN0IGJlIGRlbGV0ZWQgdXNpbmcgbmF0aXZlX2hhbmRsZV9kZWxldGUuCisgKi8KK0MySGFuZGxlICpXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZSgKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpjb25zdCBoYW5kbGUsCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UsIHVpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiA9IDAsIHVpbnQ2NF90IGlnYnBfaWQgPSAwLCB1aW50MzJfdCBpZ2JwX3Nsb3QgPSAwKTsKKworLyoqCisgKiBcdG9kbyBHZXQgdGhpcyBmcm9tIHRoZSBidWZmZXIKKyAqLwordm9pZCBfVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY01ldGFkYXRhKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlLAorICAgICAgICB1aW50MzJfdCAqd2lkdGgsIHVpbnQzMl90ICpoZWlnaHQsIHVpbnQzMl90ICpmb3JtYXQsIHVpbnQ2NF90ICp1c2FnZSwgdWludDMyX3QgKnN0cmlkZSwKKyAgICAgICAgdWludDMyX3QgKmdlbmVyYXRpb24sIHVpbnQ2NF90ICppZ2JwX2lkLCB1aW50MzJfdCAqaWdicF9zbG90KTsKKworY2xhc3MgQzJBbGxvY2F0b3JHcmFsbG9jIDogcHVibGljIEMyQWxsb2NhdG9yIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIGlkX3QgZ2V0SWQoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVHJhaXRzPiBnZXRUcmFpdHMoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBwcmlvckdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgb3ZlcnJpZGU7CisKKyAgICBDMkFsbG9jYXRvckdyYWxsb2MoaWRfdCBpZCwgYm9vbCBidWZmZXJRdWV1ZSA9IGZhbHNlKTsKKworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0OworCisgICAgdmlydHVhbCB+QzJBbGxvY2F0b3JHcmFsbG9jKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKTsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIEltcGwgKm1JbXBsOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9HUkFMTE9DX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9ySW9uLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9ySW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIyMDUxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JJb24uaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9JT05fSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9JT05fSF8KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMkFsbG9jYXRvcklvbiA6IHB1YmxpYyBDMkFsbG9jYXRvciB7CitwdWJsaWM6CisgICAgLy8gVXNhZ2UgbWFwcGVyIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGFsbG9jYXRvcgorICAgIC8vICAgKHVzYWdlLCBjYXBhY2l0eSkgPT4gKGFsaWduLCBoZWFwTWFzaywgZmxhZ3MpCisgICAgLy8KKyAgICAvLyBjYXBhY2l0eSBpcyBhbGlnbmVkIHRvIHRoZSBkZWZhdWx0IGJsb2NrLXNpemUgKGRlZmF1bHRzIHRvIHBhZ2Ugc2l6ZSkgdG8gcmVkdWNlIGNhY2hpbmcKKyAgICAvLyBvdmVyaGVhZAorICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChDMk1lbW9yeVVzYWdlLCBzaXplX3QsCisgICAgICAgICAgICAgICAgICAgICAgLyogPT4gKi8gc2l6ZV90KiwgdW5zaWduZWQqLCB1bnNpZ25lZCopPiBVc2FnZU1hcHBlckZuOworCisgICAgdmlydHVhbCBpZF90IGdldElkKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRyYWl0cz4gZ2V0VHJhaXRzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG5ld0xpbmVhckFsbG9jYXRpb24oCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICphbGxvY2F0aW9uKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcHJpb3JMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICphbGxvY2F0aW9uKSBvdmVycmlkZTsKKworICAgIEMyQWxsb2NhdG9ySW9uKGlkX3QgaWQpOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBtSW5pdDsgfQorCisgICAgdmlydHVhbCB+QzJBbGxvY2F0b3JJb24oKSBvdmVycmlkZTsKKworICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pOworCisgICAgLyoqCisgICAgICogVXBkYXRlcyB0aGUgdXNhZ2UgbWFwcGVyIGZvciBzdWJzZXF1ZW50IG5ldyBhbGxvY2F0aW9ucywgYXMgd2VsbCBhcyB0aGUgc3VwcG9ydGVkCisgICAgICogbWluaW11bSBhbmQgbWF4aW11bSB1c2FnZSBtYXNrcyBhbmQgZGVmYXVsdCBibG9jay1zaXplIHRvIHVzZSBmb3IgdGhlIG1hcHBlci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtYXBwZXIgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIG1hcCBDb2RlYyAyLjAgYnVmZmVyIHVzYWdlIHRvIGlvbiBmbGFncworICAgICAqICAgICAgICByZXF1aXJlZCBieSB0aGUgaW9uIGRldmljZQorICAgICAqIFxwYXJhbSBtaW5Vc2FnZSBtaW5pbXVtIGJ1ZmZlciB1c2FnZSByZXF1aXJlZCBmb3Igc3VwcG9ydGVkIGFsbG9jYXRpb25zIChkZWZhdWx0cyB0byAwKQorICAgICAqIFxwYXJhbSBtYXhVc2FnZSBtYXhpbXVtIGJ1ZmZlciB1c2FnZSBzdXBwb3J0ZWQgYnkgdGhlIGlvbiBhbGxvY2F0b3IgKGRlZmF1bHRzIHRvIFNXX1JFQUQKKyAgICAgKiAgICAgICAgfCBTV19XUklURSkKKyAgICAgKiBccGFyYW0gYmxvY2tTaXplIGFsaWdubWVudCB1c2VkIHByaW9yIHRvIGNhbGxpbmcgfG1hcHBlcnwgZm9yIHRoZSBidWZmZXIgY2FwYWNpdHkuCisgICAgICogICAgICAgIFRoaXMgYWxzbyBoZWxwcyByZWR1Y2UgdGhlIHNpemUgb2YgY2FjaGUgcmVxdWlyZWQgZm9yIGNhY2hpbmcgbWFwcGVyIHJlc3VsdHMuCisgICAgICogICAgICAgIChkZWZhdWx0cyB0byB0aGUgcGFnZSBzaXplKQorICAgICAqLworICAgIHZvaWQgc2V0VXNhZ2VNYXBwZXIoCisgICAgICAgICAgICBjb25zdCBVc2FnZU1hcHBlckZuICZtYXBwZXIsIHVpbnQ2NF90IG1pblVzYWdlLCB1aW50NjRfdCBtYXhVc2FnZSwgdWludDY0X3QgYmxvY2tTaXplKTsKKworcHJpdmF0ZToKKyAgICBjMl9zdGF0dXNfdCBtYXBVc2FnZShDMk1lbW9yeVVzYWdlIHVzYWdlLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIC8qID0+ICovIHNpemVfdCAqYWxpZ24sIHVuc2lnbmVkICpoZWFwTWFzaywgdW5zaWduZWQgKmZsYWdzKTsKKworICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIGludCBtSW9uRmQ7CisKKyAgICAvLyB0aGlzIGxvY2tzIG1UcmFpdHMsIG1CbG9ja1NpemUsIG1Vc2FnZU1hcHBlciwgbVVzYWdlTWFwcGVyTHJ1IGFuZCBtVXNhZ2VNYXBwZXJDYWNoZQorICAgIG11dGFibGUgc3RkOjptdXRleCBtVXNhZ2VNYXBwZXJMb2NrOworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUcmFpdHM+IG1UcmFpdHM7CisgICAgc2l6ZV90IG1CbG9ja1NpemU7CisgICAgVXNhZ2VNYXBwZXJGbiBtVXNhZ2VNYXBwZXI7CisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8dWludDY0X3QsIHNpemVfdD4gTWFwcGVyS2V5OworICAgIHN0cnVjdCBNYXBwZXJLZXlIYXNoIHsKKyAgICAgICAgc3RkOjpzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBNYXBwZXJLZXkgJikgY29uc3Q7CisgICAgfTsKKyAgICB0eXBlZGVmIHN0ZDo6dHVwbGU8c2l6ZV90LCB1bnNpZ25lZCwgdW5zaWduZWQsIGMyX3N0YXR1c190PiBNYXBwZXJWYWx1ZTsKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjxNYXBwZXJLZXksIE1hcHBlclZhbHVlPiBNYXBwZXJLZXlWYWx1ZTsKKyAgICB0eXBlZGVmIHN0ZDo6bGlzdDxNYXBwZXJLZXlWYWx1ZT46Oml0ZXJhdG9yIE1hcHBlcktleVZhbHVlUG9pbnRlcjsKKyAgICBzdGQ6Omxpc3Q8TWFwcGVyS2V5VmFsdWU+IG1Vc2FnZU1hcHBlckxydTsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8TWFwcGVyS2V5LCBNYXBwZXJLZXlWYWx1ZVBvaW50ZXIsIE1hcHBlcktleUhhc2g+IG1Vc2FnZU1hcHBlckNhY2hlOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9JT05fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJCcUJ1ZmZlclByaXYuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJCcUJ1ZmZlclByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjcxYTcxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJxQnVmZmVyUHJpdi5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0NPREVDMl9CUV9CVUZGRVJfUFJJVl9IXworI2RlZmluZSBTVEFHRUZSSUdIVF9DT0RFQzJfQlFfQlVGRkVSX1BSSVZfSF8KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKworY2xhc3MgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IsIGNvbnN0IGxvY2FsX2lkX3QgbG9jYWxJZCk7CisKKyAgICB2aXJ0dWFsIH5DMkJ1ZmZlclF1ZXVlQmxvY2tQb29sKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICB9OworCisgICAgdmlydHVhbCBsb2NhbF9pZF90IGdldExvY2FsSWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtTG9jYWxJZDsKKyAgICB9OworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOworCisgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDY0X3QgcHJvZHVjZXIsIGludDMyX3Qgc2xvdCwgaW50NjRfdCBuc2Vjcyk+IE9uUmVuZGVyQ2FsbGJhY2s7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHJlbmRlciBjYWxsYmFjay4KKyAgICAgKgorICAgICAqIFxwYXJhbSByZW5kZXJDYWxsYmFrIGNhbGxiYWNrIHRvIGNhbGwgZm9yIGFsbCBkZXF1ZXVlIGJ1ZmZlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgc2V0UmVuZGVyQ2FsbGJhY2soY29uc3QgT25SZW5kZXJDYWxsYmFjayAmcmVuZGVyQ2FsbGJhY2sgPSBPblJlbmRlckNhbGxiYWNrKCkpOworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyBhbiBJR0JQIGluIG9yZGVyIHRvIGNyZWF0ZSBibG9ja3MuIEEgbmV3bHkgY3JlYXRlZCBibG9jayBpcworICAgICAqIGRlcXVldWVkIGZyb20gdGhlIGNvbmZpZ3VyZWQgSUdCUC4gVW5pcXVlIElkIG9mIElHQlAgYW5kIHRoZSBzbG90IG51bWJlciBvZgorICAgICAqIGJsb2NrcyBhcmUgcGFzc2VkIHZpYSBuYXRpdmVfaGFuZGxlLiBNYW5hZ2luZyBJR0JQIGlzIHJlc3BvbnNpYmlsaXR5IG9mIGNhbGxlci4KKyAgICAgKiBXaGVuIElHQlAgaXMgbm90IGNvbmZpZ3VyZWQsIGJsb2NrIHdpbGwgYmUgY3JlYXRlZCB2aWEgYWxsb2NhdG9yLgorICAgICAqIFNpbmNlIHplcm8gaXMgbm90IHVzZWQgZm9yIFVuaXF1ZSBJZCBvZiBJR0JQLCBpZiBJR0JQIGlzIG5vdCBjb25maWd1cmVkIG9yIHByb2R1Y2VyCisgICAgICogaXMgY29uZmlndXJlZCBhcyBudWxscHRyLCB1bmlxdWUgaWQgd2hpY2ggaXMgYnVuZGxlZCBpbiBuYXRpdmVfaGFuZGxlIGlzIHplcm8uCisgICAgICoKKyAgICAgKiBccGFyYW0gcHJvZHVjZXIgICAgICB0aGUgSUdCUCwgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGZldGNoIGJsb2NrcworICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBjb25maWd1cmVQcm9kdWNlcihjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmcHJvZHVjZXIpOworCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgICBjb25zdCBsb2NhbF9pZF90IG1Mb2NhbElkOworCisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisKKyAgICBmcmllbmQgc3RydWN0IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOworfTsKKworI2VuZGlmIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9CVUZGRVJfUFJJVl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJ1ZmZlclByaXYuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJCdWZmZXJQcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU1ZjY5YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJCdWZmZXJQcml2LmgKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0NPREVDMl9CVUZGRVJfUFJJVl9IXworI2RlZmluZSBTVEFHRUZSSUdIVF9DT0RFQzJfQlVGRkVSX1BSSVZfSF8KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUFjY2Vzc29yLmg+CisKK2NsYXNzIEMyQmFzaWNMaW5lYXJCbG9ja1Bvb2wgOiBwdWJsaWMgQzJCbG9ja1Bvb2wgeworcHVibGljOgorICAgIGV4cGxpY2l0IEMyQmFzaWNMaW5lYXJCbG9ja1Bvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKTsKKworICAgIHZpcnR1YWwgfkMyQmFzaWNMaW5lYXJCbG9ja1Bvb2woKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGxvY2FsX2lkX3QgZ2V0TG9jYWxJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEJBU0lDX0xJTkVBUjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOworCisgICAgLy8gVE9ETzogZmV0Y2hDaXJjdWxhckJsb2NrCisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworfTsKKworY2xhc3MgQzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2wgOiBwdWJsaWMgQzJCbG9ja1Bvb2wgeworcHVibGljOgorICAgIGV4cGxpY2l0IEMyQmFzaWNHcmFwaGljQmxvY2tQb29sKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvcik7CisKKyAgICB2aXJ0dWFsIH5DMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdG9yLT5nZXRJZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQkFTSUNfR1JBUEhJQzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworfTsKKworY2xhc3MgQzJQb29sZWRCbG9ja1Bvb2wgOiBwdWJsaWMgQzJCbG9ja1Bvb2wgeworcHVibGljOgorICAgIEMyUG9vbGVkQmxvY2tQb29sKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvciwgY29uc3QgbG9jYWxfaWRfdCBsb2NhbElkKTsKKworICAgIHZpcnR1YWwgfkMyUG9vbGVkQmxvY2tQb29sKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGxvY2FsX2lkX3QgZ2V0TG9jYWxJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1Mb2NhbElkOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2spIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBjb25uZWN0aW9uIElkIGZvciB1bmRlcmx5aW5nIGJ1ZmZlcnBvb2wKKyAgICAgKi8KKyAgICBpbnQ2NF90IGdldENvbm5lY3Rpb25JZCgpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBhY2Nlc3NvciB3aGljaCBpcyB1c2VkIGJ5IHVuZGVybHlpbmcgYnVmZmVycG9vbC4gKEl0IGNhbiBiZQorICAgICAqIHBhc3NlZCB0byByZWNlaXZpbmcgcHJvY2Vzcy4pCisgICAgICoKKyAgICAgKiBccGFyYW0gYWNjZXNzb3IgICAgICAgICAgSUFjY2Vzc29yIHdpbGwgYmUgd3JpdHRlbiB0byB0aGlzIG91dCBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRydWUgICAgICAgICAgICAgSUFjZXNzb3IgaXMgd3JpdGVuIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBccmV0dXJuIGZhbHNlICAgICAgICAgICAgSUFjY2Vzc29yIGlzIG5vdCB3cml0dGVuLgorICAgICAqLworICAgIGJvb2wgZ2V0QWNjZXNzb3IoYW5kcm9pZDo6c3A8YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3I+ICphY2Nlc3Nvcik7CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICAgIGNvbnN0IGxvY2FsX2lkX3QgbUxvY2FsSWQ7CisKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfQlVGRkVSX1BSSVZfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJDb21wb25lbnRGYWN0b3J5LmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQ29tcG9uZW50RmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZDhiOTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQ29tcG9uZW50RmFjdG9yeS5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0NPREVDMl9DT01QT05FTlRfRkFDVE9SWV9IXworI2RlZmluZSBTVEFHRUZSSUdIVF9DT0RFQzJfQ09NUE9ORU5UX0ZBQ1RPUllfSF8KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKworLyoqCisgKiBDb21wb25lbnQgZmFjdG9yeSBvYmplY3QgdGhhdCBlbmFibGVzIHRvIGNyZWF0ZSBhIGNvbXBvbmVudCBhbmQvb3IgaW50ZXJmYWNlIGZyb20gYSBkeW5hbWljYWxseQorICogbGlua2VkIGxpYnJhcnkuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIGNvbXBvbmVudC9pbnRlcmZhY2VzIGFyZSBtYW5hZ2VkIG9iamVjdHMsIGJ1dCB3ZQorICogY2Fubm90IHNhZmVseSBjcmVhdGUgYSBtYW5hZ2VkIG9iamVjdCBhbmQgcGFzcyBpdCBpbiBDLgorICoKKyAqIENvbXBvbmVudHMvaW50ZXJmYWNlcyB0eXBpY2FsbHkgaW5oZXJpdCBmcm9tIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMsIGJ1dCBDIHJlcXVpcmVzCisgKiBwYXNzaW5nIHNpbXBsZSBwb2ludGVyLCBhbmQgc2hhcmVkX3B0ciBjb25zdHJ1Y3RvciBuZWVkcyB0byBrbm93IHRoZSBjbGFzcyB0byBiZSBjb25zdHJ1Y3RlZAorICogZGVyaXZlcyBmcm9tIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzLgorICoKKyAqLworY2xhc3MgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZCg6OkMyQ29tcG9uZW50Kik+IENvbXBvbmVudERlbGV0ZXI7CisgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoOjpDMkNvbXBvbmVudEludGVyZmFjZSopPiBJbnRlcmZhY2VEZWxldGVyOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIFNIQUxMIHJldHVybiB3aXRoaW4gMTAwbXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gaWQgICAgICAgIGNvbXBvbmVudCBJRCBmb3IgdGhlIGNyZWF0ZWQgY29tcG9uZW50CisgICAgICogXHBhcmFtIGNvbXBvbmVudCBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgY3JlYXRlZCBjb21wb25lbnQgaXMgc3RvcmVkLiBDbGVhcmVkIG9uCisgICAgICogICAgICAgICAgICAgICAgICBmYWlsdXJlIGFuZCB1cGRhdGVkIG9uIHN1Y2Nlc3MuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBjcmVhdGUgdGhlIGNvbXBvbmVudCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgY3JlYXRpb24gb2YgdGhlIGNvbXBvbmVudCAodW5leHBlY3RlZCkKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSB0aGUgY29tcG9uZW50CisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIENvbXBvbmVudERlbGV0ZXIgZGVsZXRlciA9IHN0ZDo6ZGVmYXVsdF9kZWxldGU8QzJDb21wb25lbnQ+KCkpID0gMDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb21wb25lbnQgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpZCAgICAgICAgY29tcG9uZW50IGludGVyZmFjZSBJRCBmb3IgdGhlIGNyZWF0ZWQgaW50ZXJmYWNlCisgICAgICogXHBhcmFtIGludGVyZmFjZSBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgY3JlYXRlZCBpbnRlcmZhY2UgaXMgc3RvcmVkLiBDbGVhcmVkIG9uCisgICAgICogICAgICAgICAgICAgICAgICBmYWlsdXJlIGFuZCB1cGRhdGVkIG9uIHN1Y2Nlc3MuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IGludGVyZmFjZSB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgY3JlYXRlIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlIHdpdGhpbiB0aGUgdGltZSBsaW1pdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgSW50ZXJmYWNlRGVsZXRlciBkZWxldGVyID0gc3RkOjpkZWZhdWx0X2RlbGV0ZTxDMkNvbXBvbmVudEludGVyZmFjZT4oKSkgPSAwOworCisgICAgdmlydHVhbCB+QzJDb21wb25lbnRGYWN0b3J5KCkgPSBkZWZhdWx0OworCisgICAgdHlwZWRlZiA6OkMyQ29tcG9uZW50RmFjdG9yeSogKCpDcmVhdGVDb2RlYzJGYWN0b3J5RnVuYykodm9pZCk7CisgICAgdHlwZWRlZiB2b2lkICgqRGVzdHJveUNvZGVjMkZhY3RvcnlGdW5jKSg6OkMyQ29tcG9uZW50RmFjdG9yeSopOworfTsKKworCisjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX0NPTVBPTkVOVF9GQUNUT1JZX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRGVidWcuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJEZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMWNkYWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRGVidWcuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0RFQlVHX0hfCisjZGVmaW5lIEMyVVRJTFNfREVCVUdfSF8KKworI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1sb2cuaD4KKworLy8gVG8gYWxsb3cgYXJiaXRyYXJ5IG9yZGVyaW5nIG9mIEMyRGVidWcuaCBhbmQgQVBJIGhlYWRlcnMgYW5kIHRvIGtlZXAgZGVidWcgdXRpbGl0aWVzIHNlcGFyYXRlbHkKKy8vIGZyb20gdGhlIEFQSSBkZWZpbml0aW9ucywgd2UgcHJvdmlkZSBBUEkgaGVhZGVyIHNwZWNpZmljIGRlYnVnIGhlYWRlcnMuCisjaWZkZWYgQzJQQVJBTV9IXworI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1wYXJhbS5oPgorI2VuZGlmCisKKyNlbmRpZiAgLy8gQzJVVElMU19ERUJVR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkVycm5vVXRpbHMuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJFcnJub1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5OTVmNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJFcnJub1V0aWxzLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfRVJSTk9fVVRJTFNfSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX0VSUk5PX1VUSUxTX0hfCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPEMyLmg+CisKKy8vIHN0YW5kYXJkIEVSUk5PIG1hcHBpbmdzCit0ZW1wbGF0ZTxpbnQgTj4gY29uc3RleHByIGMyX3N0YXR1c190IF9jMl9lcnJubzJzdGF0dXNfaW1wbCgpOwordGVtcGxhdGU8PiBjb25zdGV4cHIgYzJfc3RhdHVzX3QgX2MyX2Vycm5vMnN0YXR1c19pbXBsPDA+KCkgICAgICAgeyByZXR1cm4gQzJfT0s7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIGMyX3N0YXR1c190IF9jMl9lcnJubzJzdGF0dXNfaW1wbDxFSU5WQUw+KCkgIHsgcmV0dXJuIEMyX0JBRF9WQUxVRTsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgYzJfc3RhdHVzX3QgX2MyX2Vycm5vMnN0YXR1c19pbXBsPEVBQ0NFUz4oKSAgeyByZXR1cm4gQzJfUkVGVVNFRDsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgYzJfc3RhdHVzX3QgX2MyX2Vycm5vMnN0YXR1c19pbXBsPEVQRVJNPigpICAgeyByZXR1cm4gQzJfUkVGVVNFRDsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgYzJfc3RhdHVzX3QgX2MyX2Vycm5vMnN0YXR1c19pbXBsPEVOT01FTT4oKSAgeyByZXR1cm4gQzJfTk9fTUVNT1JZOyB9CisKKy8vIG1hcCBzdGFuZGFyZCBlcnJuby1zIHRvIHRoZSBlcXVpdmFsZW50IGMyX3N0YXR1c190Cit0ZW1wbGF0ZTxpbnQuLi4gTj4gc3RydWN0IF9jMl9tYXBfZXJybm9faW1wbDsKK3RlbXBsYXRlPGludCBFLCBpbnQgLi4uIE4+IHN0cnVjdCBfYzJfbWFwX2Vycm5vX2ltcGw8RSwgTi4uLj4geworICAgIHN0YXRpYyBjMl9zdGF0dXNfdCBtYXAoaW50IHJlc3VsdCkgeworICAgICAgICBpZiAocmVzdWx0ID09IEUpIHsKKyAgICAgICAgICAgIHJldHVybiBfYzJfZXJybm8yc3RhdHVzX2ltcGwgPEU+KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gX2MyX21hcF9lcnJub19pbXBsPE4uLi4+OjptYXAocmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KK307Cit0ZW1wbGF0ZTw+IHN0cnVjdCBfYzJfbWFwX2Vycm5vX2ltcGw8PiB7CisgICAgc3RhdGljIGMyX3N0YXR1c190IG1hcChpbnQgcmVzdWx0KSB7CisgICAgICAgIHJldHVybiByZXN1bHQgPT0gMCA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworICAgIH0KK307CisKK3RlbXBsYXRlPGludC4uLiBOPgorYzJfc3RhdHVzX3QgYzJfbWFwX2Vycm5vKGludCByZXN1bHQpIHsKKyAgICByZXR1cm4gX2MyX21hcF9lcnJub19pbXBsPE4uLi4+OjptYXAocmVzdWx0KTsKK30KKworI2VuZGlmIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9FUlJOT19VVElMU19IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzEwNjQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0MyX1BMQVRGT1JNX1NUT1JFX1BMVUdJTl9MT0FERVJfSF8KKworI2RlZmluZSBTVEFHRUZSSUdIVF9DMl9QTEFURk9STV9TVE9SRV9QTFVHSU5fTE9BREVSX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorCisjaW5jbHVkZSA8QzIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorCisvKioKKyAqIEV4dGVybiBDIGludGVyZmFjZSBmb3IgY3JlYXRpbmcgYmxvY2sgcG9vbCBmcm9tIHBsYXRmb3JtIHN0b3JlIGV4dGVuc2lvbi4KKyAqCisgKiBccGFyYW0gYWxsb2N0b3JJZCAgdGhlIElEIG9mIHRoZSBiYWNraW5nIGFsbG9jYXRvciB0eXBlLgorICogXHBhcmVtIGJsb2NrUG9vbElkIHRoZSBJRCBvZiBjcmVhdGVkIGJsb2NrIHBvb2wuCisgKgorICogXHJldHVybiBwb2ludGVyIG9mIGNyZWF0ZWQgQzJCbG9ja1Bvb2wsIG51bGxwdHIgb24gZXJyb3IuCisgKi8KK3R5cGVkZWYgOjpDMkJsb2NrUG9vbCogKCpDcmVhdGVCbG9ja1Bvb2xGdW5jKSg6OkMyQWxsb2NhdG9yOjppZF90LCA6OkMyQmxvY2tQb29sOjpsb2NhbF9pZF90KTsKKworLyoqCisgKiBFeHRlcm4gQyBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIGFsbG9jYXRvciBmcm9tIHBsYXRmb3JtIHN0b3JlIGV4dGVuc2lvbi4KKyAqCisgKiBccGFyYW0gYWxsb2N0b3JJZCAgdGhlIElEIG9mIHRoZSBhbGxvY2F0b3IgdG8gY3JlYXRlLgorICogXHBhcmFtIHN0YXR1cyAgICAgIHRoZSByZXR1cm5lZCBzdGF0dXMgZnJvbSBjcmVhdGluZyBhbGxvY2F0b3IuCisgKgorICogXHJldHVybiBwb2ludGVyIG9mIGNyZWF0ZWQgQzJBbGxvY2F0b3IsIG51bGxwdHIgb24gZXJyb3IuCisgKi8KK3R5cGVkZWYgOjpDMkFsbG9jYXRvciogKCpDcmVhdGVBbGxvY2F0b3JGdW5jKSg6OkMyQWxsb2NhdG9yOjppZF90LCA6OmMyX3N0YXR1c190Kik7CisKK2NsYXNzIEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlciB7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI+JiBHZXRJbnN0YW5jZSgpOworICAgIH5DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYmxvY2sgcG9vbCBmcm9tIHBsYXRmb3JtIHN0b3JlIGV4dGVuc2lvbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhbGxvY3RvcklkICB0aGUgSUQgb2YgdGhlIGJhY2tpbmcgYWxsb2NhdG9yIHR5cGUuCisgICAgICogXHBhcmFtIGJsb2NrUG9vbElkIHRoZSBJRCBvZiBjcmVhdGVkIGJsb2NrIHBvb2wuCisgICAgICogXHBhcmFtIHBvb2wgICAgICAgIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGJsb2NrIHBvb2wgaXMgc3RvcmVkLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGJsb2NrIHBvb2wgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIHRoZSBleHRlbnNpb24gc3ltYm9sIHdhcyBub3QgZm91bmQuCisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggdGhlIGlucHV0IGFsbG9jYXRvcklkIGlzIG5vdCBkZWZpbmVkIGluIHBsYXRmb3JtIHN0b3JlIGV4dGVuc2lvbi4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVCbG9ja1Bvb2woOjpDMkFsbG9jYXRvcjo6aWRfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBibG9ja1Bvb2xJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiogcG9vbCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFsbG9jYXRvciBmcm9tIHBsYXRmb3JtIHN0b3JlIGV4dGVuc2lvbi4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCB0aGlzIGFsbG9jYXRvciBpcyBub3QgY3JlYXRlZCBhcyBzaGFyZWQgc2luZ2xldG9uIGFzIEMyQWxsb2NhdG9yU3RvcmUgZG9lcywgYmVjYXVzZQorICAgICAqIEMgaW50ZXJmYWNlIG9ubHkgYWxsb3dzIHJhdyBwb2ludGVyIHRyYW5zbWlzc2lvbiBmb3IgZXh0ZW5zaW9uLgorICAgICAqCisgICAgICogXHBhcmFtIGFsbG9jdG9ySWQgIHRoZSBJRCBvZiB0aGUgYWxsb2NhdG9yIHRvIGNyZWF0ZS4KKyAgICAgKiBccGFyYW0gYWxsb2NhdG9yICAgc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGNyZWF0ZWQgYWxsb2NhdG9yIGlzIHN0b3JlZC4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBhbGxvY2F0b3Igd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBjcmVhdGUgdGhlIGFsbG9jYXRvciB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgY3JlYXRpb24gb2YgdGhlIGFsbG9jYXRvciAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCB0aGUgZXh0ZW5zaW9uIHN5bWJvbCB3YXMgbm90IGZvdW5kLgorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIHRoZSBpbnB1dCBhbGxvY2F0b3JJZCBpcyBub3QgZGVmaW5lZCBpbiBwbGF0Zm9ybSBzdG9yZSBleHRlbnNpb24uCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBhbGxvY2F0b3IKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVBbGxvY2F0b3IoOjpDMkFsbG9jYXRvcjo6aWRfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiogY29uc3QgYWxsb2NhdG9yKTsKKworcHJpdmF0ZToKKyAgICBleHBsaWNpdCBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIoY29uc3QgY2hhciAqbGliUGF0aCk7CisKKyAgICBzdGF0aWMgYW5kcm9pZDo6TXV0ZXggc011dGV4OworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyPiBzSW5zdGFuY2U7CisKKyAgICB2b2lkICptTGliSGFuZGxlOworICAgIENyZWF0ZUJsb2NrUG9vbEZ1bmMgbUNyZWF0ZUJsb2NrUG9vbDsKKyAgICBDcmVhdGVBbGxvY2F0b3JGdW5jIG1DcmVhdGVBbGxvY2F0b3I7Cit9OworCisjZW5kaWYgIC8vIFNUQUdFRlJJR0hUX0MyX1BMQVRGT1JNX1NUT1JFX1BMVUdJTl9MT0FERVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJQbGF0Zm9ybVN1cHBvcnQuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJQbGF0Zm9ybVN1cHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzEyODJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3VwcG9ydC5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfUExBVEZPUk1fU1VQUE9SVF9IXworI2RlZmluZSBTVEFHRUZSSUdIVF9DT0RFQzJfUExBVEZPUk1fU1VQUE9SVF9IXworCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudEZhY3RvcnkuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFJldHVybnMgdGhlIHBsYXRmb3JtIGFsbG9jYXRvciBzdG9yZS4KKyAqIFxyZXR2YWwgbnVsbHB0ciBpZiB0aGUgcGxhdGZvcm0gYWxsb2NhdG9yIHN0b3JlIGNvdWxkIG5vdCBiZSBvYnRhaW5lZAorICovCitzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworCisvKioKKyAqIFBsYXRmb3JtIGFsbG9jYXRvciBzdG9yZSBJRHMKKyAqLworY2xhc3MgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlIDogcHVibGljIEMyQWxsb2NhdG9yU3RvcmUgeworcHVibGljOgorICAgIGVudW0gOiBpZF90IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIElEIG9mIHRoZSBpb24gYmFja2VkIHBsYXRmb3JtIGFsbG9jYXRvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQzJIYW5kbGUgY29uc2lzdHMgb2Y6CisgICAgICAgICAqICAgZmQgIHNoYXJlZCBpb24gYnVmZmVyIGhhbmRsZQorICAgICAgICAgKiAgIGludCBzaXplIChsbyAzMiBiaXRzKQorICAgICAgICAgKiAgIGludCBzaXplIChoaSAzMiBiaXRzKQorICAgICAgICAgKiAgIGludCBtYWdpYyAnXHhjMmlvXHgwMCcKKyAgICAgICAgICovCisgICAgICAgIElPTiA9IFBMQVRGT1JNX1NUQVJULAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJRCBvZiB0aGUgZ3JhbGxvYyBiYWNrZWQgcGxhdGZvcm0gYWxsb2NhdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBDMkhhbmRsZSBsYXlvdXQgaXMgbm90IHB1YmxpYy4gVXNlIEMyQWxsb2NhdG9yR3JhbGxvYzo6VW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZQorICAgICAgICAgKiB0byBnZXQgdGhlIHVuZGVybHlpbmcgZ3JhbGxvYyBoYW5kbGUgZnJvbSBhIEMySGFuZGxlLCBhbmQgV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUKKyAgICAgICAgICogdG8gY3JlYXRlIGEgQzJIYW5kbGUgZnJvbSBhIGdyYWxsb2MgaGFuZGxlIC0gZm9yIEMyQWxsb2NhdG9yOjpwcmlvckFsbG9jYXRpb24uCisgICAgICAgICAqLworICAgICAgICBHUkFMTE9DLAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJRCBvZiB0aGUgYnVmZmVycXVldWUgYmFja2VkIHBsYXRmb3JtIGFsbG9jYXRvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQzJIYW5kbGUgbGF5b3V0IGlzIG5vdCBwdWJsaWMuIFVzZSBDMkFsbG9jYXRvckdyYWxsb2M6OlVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUKKyAgICAgICAgICogdG8gZ2V0IHRoZSB1bmRlcmx5aW5nIGhhbmRsZSBmcm9tIGEgQzJIYW5kbGUsIGFuZCBXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZQorICAgICAgICAgKiB0byBjcmVhdGUgYSBDMkhhbmRsZSBmcm9tIGEgaGFuZGxlIC0gZm9yIEMyQWxsb2NhdG9yOjpwcmlvckFsbG9jYXRpb24uCisgICAgICAgICAqLworICAgICAgICBCVUZGRVJRVUVVRSwKKworICAgICAgICAvKioKKyAgICAgICAgICogSUQgb2YgaW5kaWNhdGluZyB0aGUgZW5kIG9mIHBsYXRmb3JtIGFsbG9jYXRvciBkZWZpbml0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBcbm90ZSBhbHdheXMgcHV0IHRoaXMgbWFjcm8gaW4gdGhlIGxhc3QgcGxhY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEV4dGVuZGVkIHBsYXRmb3JtIHN0b3JlIHBsdWdpbiBzaG91bGQgdXNlIHRoaXMgbWFjcm8gYXMgdGhlIHN0YXJ0IElEIG9mIGl0cyBvd24gYWxsb2NhdG9yCisgICAgICAgICAqIHR5cGVzLgorICAgICAgICAgKi8KKyAgICAgICAgUExBVEZPUk1fRU5ELAorICAgIH07Cit9OworCisvKioKKyAqIFJldHJpZXZlcyBhIGJsb2NrIHBvb2wgZm9yIGEgY29tcG9uZW50LgorICoKKyAqIFxwYXJhbSBpZCAgICAgICAgdGhlIGxvY2FsIElEIG9mIHRoZSBibG9jayBwb29sCisgKiBccGFyYW0gY29tcG9uZW50IHRoZSBjb21wb25lbnQgdXNpbmcgdGhlIGJsb2NrIHBvb2wgKG11c3QgYmUgbm9uLW51bGwpCisgKiBccGFyYW0gcG9vbCAgICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG9idGFpbmVkIGJsb2NrIHBvb2wgc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAqICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgKgorICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICogXHJldHZhbCBDMl9CQURfVkFMVUUgdGhlIGNvbXBvbmVudCBpcyBudWxsCisgKiBccmV0dmFsIEMyX05PVF9GT1VORCBpZiB0aGUgYmxvY2sgcG9vbCBkb2VzIG5vdCBleGlzdAorICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gZmV0Y2ggdGhlIGJsb2NrIHBvb2wgKHRoaXMgcmV0dXJuIHZhbHVlIGlzIG9ubHkKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIGZvciBiYXNpYyBwb29scykKKyAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0ICh0aGlzIHJldHVybiB2YWx1ZSBpcyBvbmx5IHBvc3NpYmxlIGZvciBiYXNpYyBwb29scykKKyAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gY29tcGxldGUgYW55IHJlcXVpcmVkIGFsbG9jYXRpb24gKHRoaXMgcmV0dXJuIHZhbHVlIGlzIG9ubHkKKyAqICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIGZvciBiYXNpYyBwb29scykKKyAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBvcGVyYXRpb24gKHVuZXhwZWN0ZWQsCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGlzIHJldHVybiB2YWx1ZSBpcyBvbmx5IHBvc3NpYmxlIGZvciBiYXNpYyBwb29scykKKyAqLworYzJfc3RhdHVzX3QgR2V0Q29kZWMyQmxvY2tQb29sKAorICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpOworCisvKioKKyAqIENyZWF0ZXMgYSBibG9jayBwb29sLgorICogXHBhcmFtIGFsbG9jYXRvcklkICB0aGUgYWxsb2NhdG9yIElEIHdoaWNoIGlzIHVzZWQgdG8gYWxsb2NhdGUgYmxvY2tzCisgKiBccGFyYW0gY29tcG9uZW50ICAgICB0aGUgY29tcG9uZW50IHVzaW5nIHRoZSBibG9jayBwb29sIChtdXN0IGJlIG5vbi1udWxsKQorICogXHBhcmFtIHBvb2wgICAgICAgICAgcG9pbnRlciB0byB3aGVyZSB0aGUgY3JlYXRlZCBibG9jayBwb29sIHNoYWxsIGJlIHN0b3JlIG9uIHN1Y2Nlc3MuCisgKiAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICoKKyAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHRoZSBjb21wb25lbnQgaXMgbnVsbAorICogXHJldHZhbCBDMl9OT1RfRk9VTkQgaWYgdGhlIGFsbG9jYXRvciBkb2VzIG5vdCBleGlzdAorICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIGEgYmxvY2sgcG9vbAorICovCitjMl9zdGF0dXNfdCBDcmVhdGVDb2RlYzJCbG9ja1Bvb2woCisgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpOworCisvKioKKyAqIFJldHVybnMgdGhlIHBsYXRmb3JtIGNvbXBvbmVudCBzdG9yZS4KKyAqIFxyZXR2YWwgbnVsbHB0ciBpZiB0aGUgcGxhdGZvcm0gY29tcG9uZW50IHN0b3JlIGNvdWxkIG5vdCBiZSBvYnRhaW5lZAorICovCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpOworCisvKioKKyAqIFNldHMgdGhlIHByZWZlcnJlZCBjb21wb25lbnQgc3RvcmUgaW4gdGhpcyBwcm9jZXNzIGZvciB0aGUgc29sZSBwdXJwb3NlIG9mIGFjY2Vzc2luZyBpdHMKKyAqIGludGVyZmFjZS4gSWYgdGhpcyBpcyBub3QgY2FsbGVkLCB0aGUgZGVmYXVsdCBJQ29tcG9uZW50U3RvcmUgSEFMIChpZiBleGlzdHMpIGlzIHRoZSBwcmVmZXJyZWQKKyAqIHN0b3JlIGZvciB0aGlzIHB1cnBvc2UuIElmIHRoZSBkZWZhdWx0IElDb21wb25lbnRTdG9yZSBIQUwgaXMgbm90IHByZXNlbnQsIHRoZSBwbGF0Zm9ybQorICogY29tcG9uZW50IHN0b3JlIGlzIHVzZWQuCisgKi8KK3ZvaWQgU2V0UHJlZmVycmVkQ29kZWMyQ29tcG9uZW50U3RvcmUoc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHN0b3JlKTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX1BMQVRGT1JNX1NVUFBPUlRfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvYW5kcm9pZC1DMkRlYnVnLWxvZy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9hbmRyb2lkLUMyRGVidWctbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxMDIyOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvYW5kcm9pZC1DMkRlYnVnLWxvZy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfQU5EUk9JRF9ERUJVR19MT0dfSF8KKyNkZWZpbmUgQzJVVElMU19BTkRST0lEX0RFQlVHX0xPR19IXworCisvKgorICogQW5kcm9pZCBwcm92aWRlcyBsb2dnaW5nIGFuZCBkZWJ1ZyBtYWNyb3MuIFJlZGVmaW5lIHRoZW0gd2l0aCBDMiBwcmVmaXggYW5kIGFkZCBzdXBwb3J0IGZvcgorICogb3B0aW5nIG91dCBvZiB2ZXJib3NlIGxvZ3MuCisgKi8KKworI2lmZGVmIEMyX0xPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyBDMl9MT0dfVEFHCisjZW5kaWYKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpZmRlZiBDMl9MT0dfVkVSQk9TRQorI2RlZmluZSBDMl9MT0coTEVWRUwpIExPRyg6OmFuZHJvaWQ6OmJhc2U6OkxFVkVMKQorI2Vsc2UKKy8qKgorICogVXNlIGFzIGZvbGxvd3M6CisgKgorICogI2RlZmluZSBDMl9MT0dfVEFHICJ0YWciCisgKiAvLyNkZWZpbmUgQzJfTE9HX1ZFUkJPU0UgIC8vIGVuYWJsZSB2ZXJib3NlIGxvZ3MgaW4gdGhpcyBmaWxlCisgKiAjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorICoKKyAqIEMyX0xPRyhERUJVRykgPDwgZXhwciAuLi47CisgKgorICogTG9nIGxldmVscyBhcmU6IFZFUkJPU0UsIERFQlVHLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwgRkFUQUwgKGFib3J0cykuCisgKgorICogTm8gZW5kbCBpcyByZXF1aXJlZC4KKyAqLworI2RlZmluZSBDMl9MT0coTEVWRUwpIFwKKyAgICAgICAgKDo6YW5kcm9pZDo6YmFzZTo6TEVWRUwgIT0gOjphbmRyb2lkOjpiYXNlOjpWRVJCT1NFKSAmJiBMT0coOjphbmRyb2lkOjpiYXNlOjpMRVZFTCkKKyNlbmRpZgorCisjZGVmaW5lIEMyX0NIRUNLICAgIENIRUNLCisjZGVmaW5lIEMyX0NIRUNLX0xUIENIRUNLX0xUCisjZGVmaW5lIEMyX0NIRUNLX0xFIENIRUNLX0xFCisjZGVmaW5lIEMyX0NIRUNLX0VRIENIRUNLX0VRCisjZGVmaW5lIEMyX0NIRUNLX0dFIENIRUNLX0dFCisjZGVmaW5lIEMyX0NIRUNLX0dUIENIRUNLX0dUCisjZGVmaW5lIEMyX0NIRUNLX05FIENIRUNLX05FCisKKyNkZWZpbmUgQzJfRENIRUNLICAgIERDSEVDSworI2RlZmluZSBDMl9EQ0hFQ0tfTFQgRENIRUNLX0xUCisjZGVmaW5lIEMyX0RDSEVDS19MRSBEQ0hFQ0tfTEUKKyNkZWZpbmUgQzJfRENIRUNLX0VRIERDSEVDS19FUQorI2RlZmluZSBDMl9EQ0hFQ0tfR0UgRENIRUNLX0dFCisjZGVmaW5lIEMyX0RDSEVDS19HVCBEQ0hFQ0tfR1QKKyNkZWZpbmUgQzJfRENIRUNLX05FIERDSEVDS19ORQorCisjZW5kaWYgIC8vIEMyVVRJTFNfQU5EUk9JRF9ERUJVR19MT0dfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWJhc2UuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDQwZTQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctYmFzZS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfREVCVUdfQkFTRV9IXworI2RlZmluZSBDMlVUSUxTX0RFQlVHX0JBU0VfSF8KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisvKioKKyAqIERlYnVnIHByaW50IHV0aWxpdGllcyBmb3IgQ29kZWMgMi4wIGJhc2Ugb2JqZWN0cy4KKyAqLworCisjZGVmaW5lIEMyX0RFQ0xBUkVfQVNfU1RSSU5HX0FORF9ERUZJTkVfU1RSRUFNX09VVCh0eXBlKSBcCitjb25zdCBjaGFyICphc1N0cmluZyh0eXBlIGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpOyBcCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IHR5cGUgJmkpIHsgXAorICAgIHJldHVybiBvcyA8PCBhc1N0cmluZyhpKTsgXAorfQorCitDMl9ERUNMQVJFX0FTX1NUUklOR19BTkRfREVGSU5FX1NUUkVBTV9PVVQoYzJfc3RhdHVzX3QpCisKKworI2VuZGlmICAvLyBDMlVUSUxTX0RFQlVHX0JBU0VfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctaW50ZXJmYWNlLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjMxODc1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctaW50ZXJmYWNlLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19ERUJVR19JTlRFUkZBQ0VfSF8KKyNkZWZpbmUgQzJVVElMU19ERUJVR19JTlRFUkZBQ0VfSF8KKworI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1iYXNlLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZVV0aWxzLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+ICZpKTsKKworI2VuZGlmICAvLyBDMlVUSUxTX0RFQlVHX0lOVEVSRkFDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctbG9nLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1sb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTVjNGMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctbG9nLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19ERUJVR19MT0dfSF8KKyNkZWZpbmUgQzJVVElMU19ERUJVR19MT0dfSF8KKworLy8gUGxhdGZvcm0gc3BlY2lmaWMgZGVidWcgdXRpbGl0aWVzCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhbmRyb2lkLUMyRGVidWctbG9nLmg+CisjZWxzZQorLy8gVE9ETzogaW1wbGVtZW50IGJhc2UgZGVidWcgdXRpbHMKKyNlbmRpZgorCisjZW5kaWYgIC8vIEMyVVRJTFNfREVCVUdfTE9HX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1wYXJhbS5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctcGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWMxZGUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctcGFyYW0uaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0RFQlVHX1BBUkFNX0hfCisjZGVmaW5lIEMyVVRJTFNfREVCVUdfUEFSQU1fSF8KKworI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctYmFzZS5oPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKy8qKgorICogRGVidWcvcHJpbnQgZGVjbGFyYXRpb25zIGZvciBvYmplY3RzIGRlZmluZWQgaW4gQzJQYXJhbS5oCisgKi8KK0MyX0RFQ0xBUkVfQVNfU1RSSU5HX0FORF9ERUZJTkVfU1RSRUFNX09VVChDMkZpZWxkRGVzY3JpcHRvcjo6dHlwZV90KQorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbTo6Q29yZUluZGV4ICZpKTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtOjpUeXBlICZpKTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtOjpJbmRleCAmaSk7CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgX0MyRmllbGRJZCAmaSk7CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmkpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW1GaWVsZCAmaSk7CisKKyNlbmRpZiAgLy8gQzJVVElMU19ERUJVR19QQVJBTV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlSGVscGVyLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmI0M2FmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlSGVscGVyLmgKQEAgLTAsMCArMSw3NTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfSU5URVJGQUNFX0hFTFBFUl9IXworI2RlZmluZSBDMlVUSUxTX0lOVEVSRkFDRV9IRUxQRVJfSF8KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZVV0aWxzLmg+CisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qKgorICogSW50ZXJmYWNlIEhlbHBlcgorICovCit1c2luZyBDMlIgPSBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcjsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgYm9vbCBFPXN0ZDo6aXNfZW51bTxUPjo6dmFsdWU+CitzdHJ1Y3QgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZSB7CisgICAgdHlwZWRlZiBUIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8VCwgdHJ1ZT4geworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8VD46OnR5cGUgdHlwZTsKK307CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIGltcGxlbWVudCBwYXJhbWV0ZXIgcmVmbGVjdG9ycy4gVGhpcyBjbGFzcyBpcyBkeW5hbWljIGFuZCBpcyBkZXNpZ25lZCB0byBiZQorICogc2hhcmVkIGJ5IG11bHRpcGxlIGludGVyZmFjZXMuIFRoaXMgYWxsb3dzIGludGVyZmFjZXMgdG8gYWRkIHN0cnVjdHVyZSBkZXNjcmlwdG9ycyBhcyBuZWVkZWQuCisgKi8KK2NsYXNzIEMyUmVmbGVjdG9ySGVscGVyIDogcHVibGljIEMyUGFyYW1SZWZsZWN0b3IgeworcHVibGljOgorICAgIEMyUmVmbGVjdG9ySGVscGVyKCkgPSBkZWZhdWx0OworICAgIHZpcnR1YWwgfkMyUmVmbGVjdG9ySGVscGVyKCkgPSBkZWZhdWx0OworICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY3JpYmUoCisgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggcGFyYW1JbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHN1cHBvcnQgZm9yIGRlc2NyaWJpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBccGFyYW0gUGFyYW1zIHR5cGVzIG9mIGNvZGVjIDIuMCBzdHJ1Y3RzIChvciBwYXJhbWV0ZXJzKSB0byBkZXNjcmliZQorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIFBhcmFtcz4KKyAgICBDMl9JTkxJTkUgdm9pZCBhZGRTdHJ1Y3REZXNjcmlwdG9ycygpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJ1Y3REZXNjcmlwdG9yPiBzdHJ1Y3RzOworICAgICAgICBhZGRTdHJ1Y3REZXNjcmlwdG9ycyhzdHJ1Y3RzLCAoX1R1cGxlPFBhcmFtcy4uLj4gKiludWxscHRyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHN1cHBvcnQgZm9yIGRlc2NyaWJpbmcgYSBzcGVjaWZpYyBzdHJ1Y3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gc3RydWt0IGRlc2NyaXB0b3IgZm9yIHRoZSBzdHJ1Y3QgdGhhdCB3aWxsIGJlIG1vdmVkIG91dC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZFN0cnVjdERlc2NyaXB0b3IoQzJTdHJ1Y3REZXNjcmlwdG9yICYmc3RydWt0KTsKKworcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBQYXJhbXM+CisgICAgY2xhc3MgQzJfSElERSBfVHVwbGUgeyB9OworCisgICAgLyoqCisgICAgICogQWRkcyBzdXBwb3J0IGZvciBkZXNjcmliaW5nIHRoZSBnaXZlbiBkZXNjcmlwdG9ycy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzdHJ1Y3RzIExpc3Qgb2Ygc3RydWN0dXJlIGRlc2NyaXB0b3JzIHRvIGFkZCBzdXBwb3J0IGZvcgorICAgICAqLworICAgIHZvaWQgYWRkU3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cnVjdERlc2NyaXB0b3I+ICZzdHJ1Y3RzLCBfVHVwbGU8PiAqKTsKKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgYWRkcyBzdXBwb3J0IGZvciBkZXNjcmliaW5nIHRoZSBnaXZlbiBkZXNjcmlwdG9ycyBpbiBhIHJlY3Vyc2l2ZSBtYW5uZXIKKyAgICAgKiBvbmUgc3RydWN0dXJlIGF0IGEgdGltZSB1c2luZyBhIGxpc3Qgb2Ygc3RydWN0dXJlIGRlc2NyaXB0b3JzIHRlbXBvcmFyeS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBUIHRoZSB0eXBlIG9mIGNvZGVjIDIuMCBzdHJ1Y3QgdG8gZGVzY3JpYmUKKyAgICAgKiBccGFyYW0gUGFyYW1zIHJlc3Qgb2YgdGhlIHN0cnVjdHMKKyAgICAgKiBccGFyYW0gc3RydWN0cyBUZW1wb3JhcnkgbGlzdCBvZiBzdHJ1Y3R1cmUgZGVzY3JpcHRvcnMgdXNlZCB0byBvcHRpbWl6ZSB0aGUgb3BlcmF0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFBhcmFtcz4KKyAgICBDMl9JTkxJTkUgdm9pZCBhZGRTdHJ1Y3REZXNjcmlwdG9ycygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RydWN0RGVzY3JpcHRvcj4gJnN0cnVjdHMsIF9UdXBsZTxULCBQYXJhbXMuLi4+ICopIHsKKyAgICAgICAgc3RydWN0cy5lbXBsYWNlX2JhY2soKFQqKW51bGxwdHIpOworICAgICAgICBhZGRTdHJ1Y3REZXNjcmlwdG9ycyhzdHJ1Y3RzLCAoX1R1cGxlPFBhcmFtcy4uLj4gKiludWxscHRyKTsKKyAgICB9CisKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggX21NdXRleDsKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpDb3JlSW5kZXgsIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvcj4gX21TdHJ1Y3RzOyAvLy88IGRlc2NyaXB0b3JzCit9OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBjb2RlYyAyLjAgaW50ZXJmYWNlIEFQSS1zIGZvciBzb21lIHBhcmFtZXRlcnMuCisgKgorICogVGhpcyBjbGFzcyBtdXN0IGJlIHN1YmNsYXNzZWQuCisgKi8KK2NsYXNzIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBiYXNlIG9mZnNldCBvZiBhIGZpZWxkIGF0IHxvZmZzZXR8IHRoYXQgY291bGQgYmUgcGFydCBvZiBhbiBhcnJheSBvciBwYXJ0IG9mIGEKKyAgICAgKiBzdWItc3RydWN0dXJlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgZG8gZmllbGQgc2l6ZSB2ZXJpZmljYXRpb24sIGUuZy4gaWYgb2Zmc2V0IGlmIG9idGFpbmVkIGZyb20gYSBzdHJ1Y3R1cmUsCisgICAgICogaXQgd2lsbCBub3Qgc3RvcCBhdCB0aGUgc3RydWN0dXJlIGJvdW5kYXJ5IC0gdGhpcyBpcyBva2F5LCBhcyB3ZSBqdXN0IHdhbnQgdGhlIGJhc2Ugb2Zmc2V0CisgICAgICogaGVyZSwgd2hpY2ggaXMgdGhlIHNhbWUuCisgICAgICovCisgICAgc3RhdGljCisgICAgc2l6ZV90IEdldEJhc2VPZmZzZXQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCwgc2l6ZV90IG9mZnNldCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW50ZXJmYWNlIGhlbHBlciBjbGFzcyB1c2VzIHJlZmVyZW5jZXMgdG8gc3RkOjpzaGFyZWRfcHRyPFQ+IGNvbmZpZyBwYXJhbWV0ZXJzLgorICAgICAqIEludGVybmFsbHksIHRoZXNlIG5lZWQgdG8gYmUgZ2VuZXJhbGl6ZWQgdG8gc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHJlZnMsIGJ1dCB0aGUgY2FzdCBpcworICAgICAqIG5vdCBhbGxvd2VkIChhcyB0aGVzZSBhcmUgcmVmZXJlbmNlcykuIEFzIHN1Y2gsIHRoaXMgY2xhc3MgbmV2ZXIgcmV0dXJucyBwb2ludGVyIHRvIHRoZQorICAgICAqIHNoYXJlZF9wdHJzLgorICAgICAqLworICAgIHN0cnVjdCBQYXJhbVJlZiB7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIGVuYWJsZT0KKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPFQsIEMyUGFyYW0+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGlubGluZSBDMl9ISURFIFBhcmFtUmVmKHN0ZDo6c2hhcmVkX3B0cjxUPiAmcGFyYW0pCisgICAgICAgICAgICA6IF9tUmVmKHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+Kj4oJnBhcmFtKSkgeyB9CisKKyAgICAgICAgLy8gdXNlZCBieSBjb21wYXJpc29uIG9wZXJhdG9yIGZvciBjb250YWluZXJzCisgICAgICAgIG9wZXJhdG9yIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiAqKCkgY29uc3QgeyByZXR1cm4gX21SZWY7IH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBwYXJhbWV0ZXIuCisgICAgICAgICAqLworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gZ2V0KCkgY29uc3QgeyByZXR1cm4gKl9tUmVmOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gKl9tUmVmOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBGaWVsZCBoZWxwZXIuCisgICAgICoKKyAgICAgKiBDb250YWlucyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgZmllbGQ6IHBvc3NpYmxlIHZhbHVlcywgYW5kIGN1cnJlbnRseSBzdXBwb3J0ZWQKKyAgICAgKiB2YWx1ZXMuCisgICAgICovCisgICAgY2xhc3MgRmllbGRIZWxwZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgaGVscGVyIGZvciBhIGZpZWxkIHdpdGggZ2l2ZW4gcG9zc2libGUgdmFsdWVzLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gcGFyYW0gcGFyYW1ldGVyIHJlZmVyZW5jZS4gVGhlIHBhcmFtZXRlciBkb2VzIG5vdCBoYXZlIHRvIGJlIGluaXRpYWxpemVkIGF0IHRoaXMKKyAgICAgICAgICogICAgICAgIHBvaW50LgorICAgICAgICAgKiBccGFyYW0gZmllbGQgZmllbGQgaWRlbnRpZmllcgorICAgICAgICAgKiBccGFyYW0gdmFsdWVzIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIGZpZWxkCisgICAgICAgICAqLworICAgICAgICBGaWVsZEhlbHBlcihjb25zdCBQYXJhbVJlZiAmcGFyYW0sIGNvbnN0IF9DMkZpZWxkSWQgJmZpZWxkLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gJiZ2YWx1ZXMpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgcGFyYW0tZmllbGQgaWRlbnRpZmllciBmb3IgdGhpcyBmaWVsZC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZQorICAgICAgICAgKiB1bmRlcmx5aW5nIHBhcmFtZXRlciBoYXMgYmVlbiBpbml0aWFsaXplZC4KKyAgICAgICAgICoKKyAgICAgICAgICogXGFyYW0gaW5kZXgKKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBDMlBhcmFtRmllbGQKKyAgICAgICAgICovCisgICAgICAgIEMyUGFyYW1GaWVsZCBtYWtlUGFyYW1GaWVsZChDMlBhcmFtOjpJbmRleCBpbmRleCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGlzIGZpZWxkLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gdmFsdWVzIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIHRoYXQgd2lsbCBiZSBtb3ZlZCBvdXQKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc2V0U3VwcG9ydGVkVmFsdWVzKHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiAmJnZhbHVlcyk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGlzIGZpZWxkLiBUaGlzIGRlZmF1bHRzIHRvIHRoZSBwb3NzaWJsZSB2YWx1ZXMKKyAgICAgICAgICogaWYgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgd2VyZSBuZXZlciBzZXQuCisgICAgICAgICAqLworICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICpnZXRTdXBwb3J0ZWRWYWx1ZXMoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgcG9zc2libGUgdmFsdWVzIGZvciB0aGlzIGZpZWxkLgorICAgICAgICAgKi8KKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAqZ2V0UG9zc2libGVWYWx1ZXMoKSBjb25zdDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgLy8gVE9ETzogbW92ZSB0byBpbXBsIGZvciBzYWZldHkKKyAgICAgICAgUGFyYW1SZWYgbVBhcmFtOworICAgICAgICBfQzJGaWVsZElkIG1GaWVsZElkOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gbVBvc3NpYmxlOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gbVN1cHBvcnRlZDsgLy8vPCBpZiBkaWZmZXJlbnQgZnJvbSBwb3NzaWJsZQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBDMl9ISURFIFBhcmFtOworICAgIGNsYXNzIFBhcmFtSGVscGVyOworCisgICAgLyoqCisgICAgICogRmFjdG9yeSBpcyBhbiBpbnRlcmZhY2UgdG8gZ2V0IHRoZSBwYXJhbWV0ZXIgaGVscGVycyBmcm9tIGEgc3RkOjpzaGFyZWRfcHRyPFQ+ICYuCisgICAgICovCisgICAgY2xhc3MgRmFjdG9yeSB7CisgICAgICAgIC8vIFx0b2RvIHRoaXMgbWF5IGJlIGFscmVhZHkgaW4gUGFyYW1IZWxwZXIKKyAgICAgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UmVmbGVjdG9yKCkgY29uc3QgPSAwOworCisgICAgICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBnZXRQYXJhbUhlbHBlcihjb25zdCBQYXJhbVJlZiAmcGFyYW0pIGNvbnN0ID0gMDsKKworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+RmFjdG9yeSgpID0gZGVmYXVsdDsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBQYXJhbTxUPiBnZXQoc3RkOjpzaGFyZWRfcHRyPFQ+ICZwYXJhbSwgc3RkOjpzaGFyZWRfcHRyPFQ+IGFsdFZhbHVlID0gbnVsbHB0cikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIFBhcmFtPFQ+KGdldFBhcmFtSGVscGVyKFBhcmFtUmVmKHBhcmFtKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0VmFsdWUgPT0gbnVsbHB0ciA/IHBhcmFtIDogYWx0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVmbGVjdG9yKCkpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFR5cGVkIGZpZWxkIGhlbHBlci4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBGaWVsZCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGhlbHBlciBoZWxwZXIgZm9yIHRoaXMgZmllbGQKKyAgICAgICAgICogXHBhcmFtIGluZGV4ICBwYXJhbWV0ZXIgaW5kZXggKHRoaXMgaXMgbmVlZGVkIGFzIGl0IGlzIG5vdCBhdmFpbGFibGUgZHVyaW5nIHBhcmFtZXRlcgorICAgICAgICAgKiAgICAgICAgY29uc3RydWN0aW9uKSBcdG9kbyByZW1vdmUKKyAgICAgICAgICovCisgICAgICAgIEZpZWxkKHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gaGVscGVyLCBDMlBhcmFtOjpJbmRleCBpbmRleCk7CisKKyAgICAgICAgYm9vbCBzdXBwb3J0c0F0QWxsKFQgdmFsdWUpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KCpfbUhlbHBlci0+Z2V0UG9zc2libGVWYWx1ZXMoKSkuc3VwcG9ydHModmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBzdXBwb3J0c05vdyhUIHZhbHVlKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPigqX21IZWxwZXItPmdldFN1cHBvcnRlZFZhbHVlcygpKS5zdXBwb3J0cyh2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGNvbmZsaWN0IHJlc29sdXRpb24gc3VnZ2VzdGlvbiBidWlsZGVyIGZvciB0aGlzIGZpZWxkLgorICAgICAgICAgKi8KKyAgICAgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiBzaG91bGRCZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgYnVpbGRlciBmb3IgdGhpcyBmaWVsZC4gVGhpcyBpcyBvbmx5IHN1cHBvcnRlZAorICAgICAgICAgKiBmb3Igbm9uLWNvbnN0IGZpZWxkcyB0byBkaXNhbGxvdyBzZXR0aW5nIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICovCisgICAgICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gbXVzdEJlKCk7CisKKyAgICAgICAgb3BlcmF0b3IgQzJQYXJhbUZpZWxkKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIF9tRmllbGQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPCisgICAgICAgIEMyUiB2YWxpZGF0ZVBvc3NpYmxlKGNvbnN0IFQgJnZhbHVlIF9fdW51c2VkKSBjb25zdCB7CisgICAgICAgICAgICAvLy8gVE9ETworICAgICAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPiBfbUhlbHBlcjsKKyAgICAgICAgQzJQYXJhbUZpZWxkIF9tRmllbGQ7CisgICAgfTsKKworICAgIGNsYXNzIFBhcmFtSGVscGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFBhcmFtSGVscGVyKFBhcmFtUmVmIHBhcmFtLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSwgQzJTdHJ1Y3REZXNjcmlwdG9yICYmKTsKKyAgICAgICAgUGFyYW1IZWxwZXIoUGFyYW1IZWxwZXIgJiYpOworICAgICAgICB+UGFyYW1IZWxwZXIoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogRmluZHMgYSBmaWVsZCBkZXNjcmlwdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPiBmaW5kRmllbGQoc2l6ZV90IGJhc2VPZmZzLCBzaXplX3QgYmFzZVNpemUpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBwYXJhbWV0ZXIgcmVmIGZvciB0aGlzIHBhcmFtZXRlcgorICAgICAgICBjb25zdCBQYXJhbVJlZiByZWYoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGlzIHBhcmFtZXRlciBhcyBtb2RpZmlhYmxlLiBUaGUgY29uc3RuZXNzIG9mIHRoaXMKKyAgICAgICAgLy8vIG9iamVjdCBkZXRlcm1pbmVzIHRoZSBjb25zdG5lc3Mgb2YgdGhlIHJldHVybmVkIHZhbHVlLgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gdmFsdWUoKTsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGlzIHBhcmFtZXRlciBhcyBjb25zdAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbT4gdmFsdWUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUGVyZm9ybXMgYSBjb25maWd1cmF0aW9uIGNoYW5nZSByZXF1ZXN0IGZvciB0aGlzIHBhcmFtZXRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIHZhbHVlICAgIHRoZSB2YWx1ZSB0aGF0IGlzIGJlaW5nIGFzc2lnbmVkIHRvIHRoaXMgcGFyYW1ldGVyLgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgVGhpcyBjb3VsZCBiZSBwb2ludGluZyB0byB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUKKyAgICAgICAgICogICAgICAgICAgICAgICAgIHBhcmFtZXRlci4gVGhpcyBtdXN0IG5vdCBjaGFuZ2UuCisgICAgICAgICAqIFxwYXJhbSBtYXlCbG9jayB3aGV0aGVyIGJsb2NraW5nIGlzIGFsbG93ZWQKKyAgICAgICAgICogXHBhcmFtIGVuZFZhbHVlIHRoZSByZXN1bHRpbmcgdmFsdWUKKyAgICAgICAgICogXHBhcmFtIGZhY3RvcnkgIHBhcmFtZXRlciBmYWN0b3J5ICh0byBhY2Nlc3MgZGVwZW5kZW5jaWVzKQorICAgICAgICAgKiBccGFyYW0gZmFpbHVyZXMgdmVjdG9yIG9mIGZhaWx1cmVzIHRvIGFwcGVuZCBhbnkgZmFpbHVyZXMgZnJvbSB0aGlzCisgICAgICAgICAqICAgICAgICAgICAgICAgICBvcGVyYXRpb24KKyAgICAgICAgICoKKyAgICAgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgY29uZmlndXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB2YWx1ZSBpcyBpbmNvcnJlY3QgKFRCRCkKKyAgICAgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcGVyZm9ybSB0aGUgYXNzaWdubWVudAorICAgICAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb25maWd1cmF0aW9uIHRpbWVkIG91dAorICAgICAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICBjb25maWd1cmF0aW9uIHJlcXVpcmVzIGJsb2NraW5nIHRvIGJlIGFsbG93ZWQKKyAgICAgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgaW50ZXJmYWNlIGlzIGNvcnJ1cHRlZAorICAgICAgICAgKi8KKyAgICAgICAgYzJfc3RhdHVzX3QgdHJ5U2V0KAorICAgICAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlLCBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgICAgIGJvb2wgKmNoYW5nZWQsCisgICAgICAgICAgICAgICAgRmFjdG9yeSAmZmFjdG9yeSwKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKTsKKworICAgICAgICAvLy8gcmV0dXJucyBwYXJhbWV0ZXIgaW5kaWNlcyB0aGF0IGRlcGVuZCBvbiB0aGlzIHBhcmFtZXRlcgorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gZ2V0RG93bkRlcGVuZGVuY2llcygpIGNvbnN0OworCisgICAgICAgIC8vLyBhZGRzIGEgZGVwZW5kZW50IHBhcmFtZXRlcgorICAgICAgICB2b2lkIGFkZERvd25EZXBlbmRlbmN5KEMyUGFyYW06OkluZGV4IGluZGV4KTsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGF0IHBhcmFtZXRlciByZWZzIGZvciBwYXJhbWV0ZXJzIHRoYXQgZGVwZW5kIG9uIHRoaXMKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+IGdldERlcGVuZGVuY2llc0FzUmVmcygpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIGFuZCBtb3ZlcyBvdXQgc3RvcmVkIHN0cnVjdCBkZXNjcmlwdG9yCisgICAgICAgIEMyU3RydWN0RGVzY3JpcHRvciByZXRyaWV2ZVN0cnVjdERlc2NyaXB0b3IoKTsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHBhcmFtZXRlcgorICAgICAgICBDMlN0cmluZyBuYW1lKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGluZGV4IG9mIHRoaXMgcGFyYW1ldGVyCisgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4KCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIHBhcmFtZXRlciBkZXNjcmlwdG9yCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBhcmFtRGVzY3JpcHRvcj4gZ2V0RGVzY3JpcHRvcigpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBWYWxpZGF0ZXMgcGFyYW0gaGVscGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBGb3Igbm93LCB0aGlzIGZpbGxzIGZpZWxkIGluZm8gZm9yIGNvbnN0IHBhcmFtcy4KKyAgICAgICAgICoKKyAgICAgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgdGhlIHBhcmFtZXRlciBjYW5ub3QgYmUgYWRkZWQgYXMgc3VjaAorICAgICAgICAgKi8KKyAgICAgICAgYzJfc3RhdHVzX3QgdmFsaWRhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICB0eXBlZGVmIEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCBhdHRyaWJfdDsKKyAgICAgICAgYXR0cmliX3QmIGF0dHJpYigpOworCisgICAgICAgIC8vLyBzZXRzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgcGFyYW1ldGVyCisgICAgICAgIHZvaWQgc2V0RGVmYXVsdFZhbHVlKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBkZWZhdWx0Xyk7CisKKyAgICAgICAgLy8vIHNldHMgdGhlIHNldHRlciBtZXRob2QKKyAgICAgICAgdm9pZCBzZXRTZXR0ZXIoc3RkOjpmdW5jdGlvbjxDMlIoY29uc3QgQzJQYXJhbSAqLCBib29sLCBib29sICosIEZhY3RvcnkgJik+IHNldHRlcik7CisKKyAgICAgICAgLy8vIHNldHMgdGhlIGdldHRlciBtZXRob2QKKyAgICAgICAgdm9pZCBzZXRHZXR0ZXIoc3RkOjpmdW5jdGlvbjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4oYm9vbCk+IGdldHRlcik7CisKKyAgICAgICAgLy8vIHNldHMgdGhlIGRlcGVuZGVuY2llcworICAgICAgICB2b2lkIHNldERlcGVuZGVuY2llcyhzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlcywgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+IHJlZnMpOworCisgICAgICAgIC8vLyBzZXRzIHRoZSBmaWVsZHMgYW5kIHRoZWlyIHN1cHBvcnRlZCB2YWx1ZXMKKyAgICAgICAgdm9pZCBzZXRGaWVsZHMoc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiAmJmZpZWxkcyk7CisKKyAgICAgICAgLy8vIGJ1aWxkIHRoaXMgaW50byBhIGZpbmFsIFBhcmFtSGVscGVyIG9iamVjdAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IGJ1aWxkKCk7CisKKyAgICAgICAgY2xhc3MgSW1wbDsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEltcGw+IG1JbXBsOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUeXBlZCBwYXJhbWV0ZXIgaGVscGVyLiBUaGlzIHByb3ZpZGVzIGFjY2VzcyB0byBtZW1iZXJzIGFzIHdlbGwgYXMgZmllbGQgaGVscGVycy4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBDMl9ISURFIFBhcmFtIHsKKyAgICAgICAgUGFyYW0oCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBoZWxwZXIsIHN0ZDo6c2hhcmVkX3B0cjxUPiAmcGFyYW0sCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IHJlZmxlY3RvcikKKyAgICAgICAgICAgIDogdigqcGFyYW0uZ2V0KCkpLAorICAgICAgICAgICAgICBfbVR5cGVkUGFyYW0ocGFyYW0pLAorICAgICAgICAgICAgICBfbUhlbHBlcihoZWxwZXIpLAorICAgICAgICAgICAgICBfbVJlZmxlY3RvcihyZWZsZWN0b3IpIHsgfQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFM+CisgICAgICAgIHVzaW5nIEZpZWxkVHlwZSA9IEZpZWxkPAorICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jb25zdDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFM+Ojp0eXBlPjo6dHlwZT46OnR5cGU+OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFM+CisgICAgICAgIEZpZWxkVHlwZTxTPiBGKFMgJmZpZWxkKSB7CisgICAgICAgICAgICBzaXplX3Qgb2ZmcyA9ICh1aW50cHRyX3QpJmZpZWxkIC0gKHVpbnRwdHJfdCkmZ2V0KCk7CisgICAgICAgICAgICAvLyB0aGlzIG11c3QgZmFsbCBlaXRoZXIgd2l0aGluIHNpemVvZihUKSArIEZMRVhfU0laRSBvciBwYXJhbS0+c2l6ZSgpCisgICAgICAgICAgICAvLyBzaXplX3Qgc2l6ZSA9IHNpemVvZihmaWVsZCk7CisgICAgICAgICAgICAvLyBtUGFyYW0gbWF5IGJlIG51bGwKKyAgICAgICAgICAgIHNpemVfdCBiYXNlU2l6ZSA9IHNpemVvZih0eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8Uz46OnR5cGUpOworICAgICAgICAgICAgc2l6ZV90IGJhc2VPZmZzID0gR2V0QmFzZU9mZnNldCgKKyAgICAgICAgICAgICAgICAgICAgX21SZWZsZWN0b3IsIFQ6OkNPUkVfSU5ERVgsIG9mZnMgLSBzaXplb2YoQzJQYXJhbSkpOworICAgICAgICAgICAgaWYgKH5iYXNlT2ZmcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gQzJfTE9HKEZBVEFMKSA8PCAidW5rbm93biBmaWVsZCBhdCBvZmZzZXQgIiA8PCBvZmZzIDw8ICIgc2l6ZSAiIDw8IHNpemVvZihTKQorICAgICAgICAgICAgICAgIC8vICAgICAgIDw8ICIgYmFzZS1zaXplICIgPDwgYmFzZVNpemU7CisgICAgICAgICAgICAgICAgLy8gX19idWlsdGluX3RyYXAoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYmFzZU9mZnMgKz0gc2l6ZW9mKEMyUGFyYW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGhlbHBlciA9IF9tSGVscGVyLT5maW5kRmllbGQoYmFzZU9mZnMsIGJhc2VTaXplKTsKKyAgICAgICAgICAgIHJldHVybiBGaWVsZFR5cGU8Uz4oaGVscGVyLCBfbVR5cGVkUGFyYW0tPmluZGV4KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY29uc3QgUGFyYW0gaGF2ZSBjb25zdCBGaWVsZHM7IGhvd2V2ZXIsIHJlbW92ZSBjb25zdCBmcm9tIFMKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUz4KKyAgICAgICAgY29uc3QgRmllbGRUeXBlPFM+IEYoUyAmZmllbGQpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBjb25zdF9jYXN0PGNvbnN0IEZpZWxkVHlwZTxTPj4oY29uc3RfY2FzdDxQYXJhbSAqPih0aGlzKS0+RihmaWVsZCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIFJldHVybnMgYSBjb25zdCByZWYgdmFsdWUgb2YgdGhpcyBjb25zdCBwYXJhbS4KKyAgICAgICAgY29uc3QgVCAmZ2V0KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuICpfbVR5cGVkUGFyYW0uZ2V0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gUmV0dXJucyBhIG1vZGlmaWFibGUgcmVmIHZhbHVlIG9mIHRoaXMgbm9uLWNvbnN0IHBhcmFtLgorICAgICAgICBUICZzZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gKl9tVHlwZWRQYXJhbS5nZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyBDb25zdC1yZWZlcmVuY2UgdG8gdGhlIHZhbHVlLnMKKyAgICAgICAgVCBjb25zdCAmdjsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiBfbVR5cGVkUGFyYW07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gX21IZWxwZXI7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBfbVJlZmxlY3RvcjsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB1c2luZyBDMlAgPSBQYXJhbTxUPjsKKworICAgIC8qKgorICAgICAqIFRlbXBsYXRlZCBtb3ZlIGJ1aWxkZXIgY2xhc3MgZm9yIGEgcGFyYW1ldGVyIGhlbHBlci4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNsYXNzIEMyX0hJREUgUGFyYW1CdWlsZGVyIDogcHJpdmF0ZSBQYXJhbUhlbHBlciB7CisgICAgcHVibGljOgorICAgICAgICAvKiogQ29uc3RydWN0IHRoZSBwYXJhbWV0ZXIgYnVpbGRlciBmcm9tIG1pbmltYWwgaW5mbyByZXF1aXJlZC4gKi8KKyAgICAgICAgUGFyYW1CdWlsZGVyKHN0ZDo6c2hhcmVkX3B0cjxUPiAmcGFyYW0sIEMyU3RyaW5nTGl0ZXJhbCBuYW1lKQorICAgICAgICAgICAgOiBQYXJhbUhlbHBlcihwYXJhbSwgbmFtZSwgQzJTdHJ1Y3REZXNjcmlwdG9yKChUKiludWxscHRyKSksCisgICAgICAgICAgICAgIG1UeXBlZFBhcmFtKCZwYXJhbSkgeworICAgICAgICAgICAgYXR0cmliKCkgPSBhdHRyaWJfdDo6SVNfUEVSU0lTVEVOVDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBNYWtlcyB0aGlzIHBhcmFtZXRlciByZXF1aXJlZC4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmcmVxdWlyZWQoKSB7CisgICAgICAgICAgICBhdHRyaWIoKSB8PSBhdHRyaWJfdDo6SVNfUkVRVUlSRUQ7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogTWFrZXMgdGhpcyBwYXJhbWV0ZXIgdHJhbnNpZW50IChub3QgcGVyc2lzdGVudCkuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJnRyYW5zaWVudCgpIHsKKyAgICAgICAgICAgIGF0dHJpYigpICY9IH5hdHRyaWJfdDo6SVNfUEVSU0lTVEVOVDsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBNYWtlcyB0aGlzIHBhcmFtZXRlciBoaWRkZW4gKG5vdCBleHBvc2VkIGluIEpBVkEgQVBJKS4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmaGlkZGVuKCkgeworICAgICAgICAgICAgYXR0cmliKCkgfD0gYXR0cmliX3Q6OklTX0hJRERFTjsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBNYWtlcyB0aGlzIHBhcmFtZXRlciBpbnRlcm5hbCAobm90IGV4cG9zZWQgdG8gcXVlcnkvc2V0dGluZ3MpLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZpbnRlcm5hbCgpIHsKKyAgICAgICAgICAgIGF0dHJpYigpIHw9IGF0dHJpYl90OjpJU19JTlRFUk5BTDsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBBZGRzIGRlZmF1bHQgdmFsdWUuIE11c3QgYmUgYWRkZWQgZXhhY3RseSBvbmNlLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoRGVmYXVsdChzdGQ6OnNoYXJlZF9wdHI8VD4gZGVmYXVsdF8pIHsKKyAgICAgICAgICAgIC8vIENIRUNLKCFtRGVmYXVsdFZhbHVlKTsKKyAgICAgICAgICAgIC8vIFdBUk5fSUYoIWRlZmF1bHRfKTsgLy8gY291bGQgYmUgbnVsbHB0ciBpZiBPT00KKyAgICAgICAgICAgIC8vIHRlY2huaWNhbGx5LCB0aGlzIGNvdWxkIGJlIGluIHRoZSBwYXJlbnQKKyAgICAgICAgICAgICptVHlwZWRQYXJhbSA9IHN0ZDo6c2hhcmVkX3B0cjxUPihUOjpGcm9tKEMyUGFyYW06OkNvcHkoKmRlZmF1bHRfKS5yZWxlYXNlKCkpKTsKKyAgICAgICAgICAgIHNldERlZmF1bHRWYWx1ZShkZWZhdWx0Xyk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gKnR5cGVkUGFyYW0gPSBtVHlwZWRQYXJhbTsKKyAgICAgICAgICAgIHNldEdldHRlcihbdHlwZWRQYXJhbV0oYm9vbCkgLT4gc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUGFyYW0+KCp0eXBlZFBhcmFtKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEFkZHMgZGVmYXVsdCB2YWx1ZS4gTXVzdCBiZSBhZGRlZCBleGFjdGx5IG9uY2UuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhEZWZhdWx0KFQgKmRlZmF1bHRfKSB7CisgICAgICAgICAgICByZXR1cm4gd2l0aERlZmF1bHQoc3RkOjpzaGFyZWRfcHRyPFQ+KGRlZmF1bHRfKSk7CisgICAgICAgIH0KKworICAgICAgICAvKiogQWRkcyBhbGwgZmllbGRzIHRvIHRoaXMgcGFyYW1ldGVyIHdpdGggdGhlaXIgcG9zc2libGUgdmFsdWVzLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoRmllbGRzKHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gJiZmaWVsZHNfKSB7CisgICAgICAgICAgICBzZXRGaWVsZHMoc3RkOjptb3ZlKGZpZWxkc18pKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgY29uc3RhbnQgdmFsdWUgKGFsc28gYXMgZGVmYXVsdCkuIE11c3QgYmUgYWRkZWQgZXhhY3RseSBvbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBDb25zdCBwYXJhbWV0ZXJzIGJ5IGRlZmluaXRpb24gaGF2ZSBubyBkZXBlbmRlbmNpZXMuCisgICAgICAgICAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoQ29uc3RWYWx1ZShzdGQ6OnNoYXJlZF9wdHI8VD4gZGVmYXVsdF8pIHsKKyAgICAgICAgICAgIGF0dHJpYigpIHw9IGF0dHJpYl90OjpJU19DT05TVDsKKyAgICAgICAgICAgIHNldFNldHRlcihbZGVmYXVsdF9dKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jayBfX3VudXNlZCwgYm9vbCAqY2hhbmdlZCwgRmFjdG9yeSAmKSAtPiBDMlIgeworICAgICAgICAgICAgICAgICpjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29uc3QgVCAqdHlwZWRWYWx1ZSA9IFQ6OkZyb20odmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh0eXBlZFZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6Q29ycnVwdGVkKCk7IC8vIFRPRE8gQmFkVmFsdWUvSW52YWxpZC4gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBoZXJlLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKnR5cGVkVmFsdWUgIT0gKmRlZmF1bHRfKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6OkNvcnJ1cHRlZCgpOyAvLyBUT0RPIFJlYWRPbmx5KCpkZWZhdWx0Xyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIHdpdGhEZWZhdWx0KGRlZmF1bHRfKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBBZGRzIGNvbnN0YW50IHZhbHVlIChhbHNvIGFzIGRlZmF1bHQpLiBNdXN0IGJlIGFkZGVkIGV4YWN0bHkgb25jZS4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aENvbnN0VmFsdWUoVCAqZGVmYXVsdF8pIHsKKyAgICAgICAgICAgIHJldHVybiB3aXRoQ29uc3RWYWx1ZShzdGQ6OnNoYXJlZF9wdHI8VD4oZGVmYXVsdF8pKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2UgYSBzdHJpY3Qgc2V0dGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gZm4gICBzdHJpY3Qgc2V0dGVyCisgICAgICAgICAqIFxwYXJhbSBkZXBzIGRlcGVuZGVuY2llcyAocmVmZXJlbmNlcykKKyAgICAgICAgICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLiBEZXBzPgorICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgIEMyUiAoKmZuKShib29sLCBjb25zdCBDMlA8VD4gJiwgQzJQPFQ+ICYsIGNvbnN0IEMyUDxEZXBzPiAmLi4uKSwKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RGVwcz4mIC4uLiBkZXBzKSB7CisgICAgICAgICAgICBhdHRyaWIoKSB8PSBhdHRyaWJfdDo6SVNfU1RSSUNUOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+ICp0eXBlZFBhcmFtID0gbVR5cGVkUGFyYW07CisgICAgICAgICAgICBzZXRTZXR0ZXIoW3R5cGVkUGFyYW0sIGZuLCAmZGVwcy4uLl0oCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlLCBib29sIG1heUJsb2NrLCBib29sICpjaGFuZ2VkLCBGYWN0b3J5ICZmYWN0b3J5KSAtPiBDMlIgeworICAgICAgICAgICAgICAgICpjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29uc3QgVCAqdHlwZWRWYWx1ZSA9IFQ6OkZyb20odmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh0eXBlZFZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6Q29ycnVwdGVkKCk7IC8vIFRPRE8gQmFkVmFsdWUvSW52YWxpZC4gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBoZXJlLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBEbyBjb3B5LW9uLWNoYW5nZSBmb3IgcGFyYW1ldGVycyBpbiB0aGlzIGhlbHBlciBzbyBjaGFuZ2UgY2FuIGJlIGRldGVjdGVkIGJ5CisgICAgICAgICAgICAgICAgLy8gYSBjaGFuZ2Ugb2YgdGhlIHBvaW50ZXIuIERvIHRoaXMgYnkgd29ya2luZyBvbiBhIHByb3Bvc2VkIHZhbHVlLgorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiBwcm9wb3NlZFZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+KFQ6OkZyb20oQzJQYXJhbTo6Q29weSgqdmFsdWUpLnJlbGVhc2UoKSkpOworICAgICAgICAgICAgICAgIGlmIChwcm9wb3NlZFZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6Tm9NZW1vcnkodmFsdWUtPmluZGV4KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDMlA8VD4gb2xkVmFsdWUgPSBmYWN0b3J5LmdldCgqdHlwZWRQYXJhbSk7CisgICAgICAgICAgICAgICAgLy8gR2V0IGEgcGFyYW1ldGVyIGhlbHBlciB3aXRoIHZhbHVlIHBvaW50aW5nIHRvIHByb3Bvc2VkVmFsdWUKKyAgICAgICAgICAgICAgICBDMlA8VD4gaGVscGVyID0gZmFjdG9yeS5nZXQoKnR5cGVkUGFyYW0sIHByb3Bvc2VkVmFsdWUpOworICAgICAgICAgICAgICAgIEMyUiByZXN1bHQgPSBmbihtYXlCbG9jaywgb2xkVmFsdWUsIGhlbHBlciwgZmFjdG9yeS5nZXQoZGVwcykuLi4pOworCisgICAgICAgICAgICAgICAgLy8gSWYgdmFsdWUgY2hhbmdlZCwgY29weSByZXN1bHQgdG8gY3VycmVudCB2YWx1ZQorICAgICAgICAgICAgICAgIGlmIChoZWxwZXIuZ2V0KCkgIT0gKnR5cGVkUGFyYW0tPmdldCgpKSB7CisgICAgICAgICAgICAgICAgICAgICp0eXBlZFBhcmFtID0gcHJvcG9zZWRWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgKmNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBzZXREZXBlbmRlbmNpZXMoc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+eyBkZXBzLT5pbmRleCgpLi4uIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+eyBQYXJhbVJlZihkZXBzKS4uLiB9KTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2UgYSBub24tc3RyaWN0IHNldHRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGZuICAgbm9uLXN0cmljdCBzZXR0ZXIKKyAgICAgICAgICogXHBhcmFtIGRlcHMgZGVwZW5kZW5jaWVzIChyZWZlcmVuY2VzKQorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uIERlcHM+CisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhTZXR0ZXIoCisgICAgICAgICAgICAgICAgQzJSICgqZm4pKGJvb2wsIEMyUDxUPiAmLCBjb25zdCBDMlA8RGVwcz4gJi4uLiksIHN0ZDo6c2hhcmVkX3B0cjxEZXBzPiYgLi4uIGRlcHMpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiAqdHlwZWRQYXJhbSA9IG1UeXBlZFBhcmFtOworICAgICAgICAgICAgc2V0U2V0dGVyKFt0eXBlZFBhcmFtLCBmbiwgJmRlcHMuLi5dKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jaywgYm9vbCAqY2hhbmdlZCwgRmFjdG9yeSAmZmFjdG9yeSkgLT4gQzJSIHsKKyAgICAgICAgICAgICAgICAqY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNvbnN0IFQgKnR5cGVkVmFsdWUgPSBUOjpGcm9tKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZWRWYWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6OkNvcnJ1cHRlZCgpOyAvLyBUT0RPIEJhZFZhbHVlL0ludmFsaWQuIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaGVyZS4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gRG8gY29weS1vbi1jaGFuZ2UgZm9yIHBhcmFtZXRlcnMgaW4gdGhpcyBoZWxwZXIgc28gY2hhbmdlIGNhbiBiZSBkZXRlY3RlZCBieQorICAgICAgICAgICAgICAgIC8vIGEgY2hhbmdlIG9mIHRoZSBwb2ludGVyLiBEbyB0aGlzIGJ5IHdvcmtpbmcgb24gYSBwcm9wb3NlZCB2YWx1ZS4KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gcHJvcG9zZWRWYWx1ZSA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPihUOjpGcm9tKEMyUGFyYW06OkNvcHkoKnZhbHVlKS5yZWxlYXNlKCkpKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvcG9zZWRWYWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6Ok5vTWVtb3J5KHZhbHVlLT5pbmRleCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gR2V0IGEgcGFyYW1ldGVyIGhlbHBlciB3aXRoIHZhbHVlIHBvaW50aW5nIHRvIHByb3Bvc2VkVmFsdWUKKyAgICAgICAgICAgICAgICBDMlA8VD4gaGVscGVyID0gZmFjdG9yeS5nZXQoKnR5cGVkUGFyYW0sIHByb3Bvc2VkVmFsdWUpOworICAgICAgICAgICAgICAgIEMyUiByZXN1bHQgPSBmbihtYXlCbG9jaywgaGVscGVyLCBmYWN0b3J5LmdldChkZXBzKS4uLik7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB2YWx1ZSBjaGFuZ2VkLCBjb3B5IHJlc3VsdCB0byBjdXJyZW50IHZhbHVlCisgICAgICAgICAgICAgICAgaWYgKGhlbHBlci5nZXQoKSAhPSAqdHlwZWRQYXJhbS0+Z2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKnR5cGVkUGFyYW0gPSBwcm9wb3NlZFZhbHVlOworICAgICAgICAgICAgICAgICAgICAqY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHNldERlcGVuZGVuY2llcyhzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD57IGRlcHMtPmluZGV4KCkuLi4gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJhbVJlZj57IFBhcmFtUmVmKGRlcHMpLi4uIH0pOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1hcmtzIHRoaXMgYSBjYWxjdWxhdGVkIChyZWFkLW9ubHkpIGZpZWxkLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gZm4gICBub24tc3RyaWN0IHNldHRlciAoY2FsY3VsYXRvcikKKyAgICAgICAgICogXHBhcmFtIGRlcHMgZGVwZW5kZW5jaWVzIChyZWZlcmVuY2VzKQorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uIERlcHM+CisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJmNhbGN1bGF0ZWRBcygKKyAgICAgICAgICAgICAgICBDMlIgKCpmbikoYm9vbCwgQzJQPFQ+ICYsIGNvbnN0IEMyUDxEZXBzPiAmLi4uKSwgc3RkOjpzaGFyZWRfcHRyPERlcHM+JiAuLi4gZGVwcykgeworICAgICAgICAgICAgYXR0cmliKCkgfD0gYXR0cmliX3Q6OklTX1JFQURfT05MWTsKKyAgICAgICAgICAgIHJldHVybiB3aXRoU2V0dGVyKGZuLCBzdGQ6OmZvcndhcmQ8ZGVjbHR5cGUoZGVwcyk+KGRlcHMpLi4uKTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IGJ1aWxkKCkgeworICAgICAgICAgICAgcmV0dXJuIFBhcmFtSGVscGVyOjpidWlsZCgpOworICAgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiAqbVR5cGVkUGFyYW07CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIFBhcmFtQnVpbGRlcjxUPiBEZWZpbmVQYXJhbShzdGQ6OnNoYXJlZF9wdHI8VD4gJnBhcmFtLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSkgeworICAgICAgICByZXR1cm4gUGFyYW1CdWlsZGVyPFQ+KHBhcmFtLCBuYW1lKTsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgaW1wbGVtZW50aW5nIGNvbmZpZyBjYWxscyBhcyB3ZWxsIGFzIG90aGVyIGNvbmZpZ3VyYXRpb24gdXBkYXRlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHZpcnR1YWwsIHNvIGltcGxlbWVudGF0aW9ucyBtYXkgcHJvdmlkZSB3cmFwcGVycyBhcm91bmQgaXQgKGFuZCBwZXJmb3JtCisgICAgICogYWN0aW9ucyBqdXN0IGJlZm9yZSBhbmQgYWZ0ZXIgYSBjb25maWd1cmF0aW9uKS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbXMKKyAgICAgKiBccGFyYW0gbWF5QmxvY2sKKyAgICAgKiBccGFyYW0gZmFpbHVyZXMKKyAgICAgKiBccGFyYW0gdXBkYXRlUGFyYW1zIGlmIHRydWUsIHRoZSB1cGRhdGVkIHBhcmFtZXRlciB2YWx1ZXMgYXJlIGNvcGllZCBiYWNrIGludG8gdGhlIGFyZ3VtZW50cworICAgICAqICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIGluIHxwYXJhbXN8CisgICAgICogXHBhcmFtIGNoYW5nZXMgICAgICBwb2ludGVkIHRvIGEgdmVjdG9yIHRvIHJlY2VpdmUgc2V0dGluZ3Mgd2l0aCB0aGVpciB2YWx1ZXMgY2hhbmdlZC4gSWYgbm90CisgICAgICogICAgICAgICAgICAgICAgICAgICBudWxsLCBzZXR0aW5ncyB3aXRoIHRoZWlyIHZhbHVlcyBjaGFuZ2VkIGFyZSBhZGRlZCB0byB0aGlzLgorICAgICAqIFxyZXR1cm4gcmVzdWx0IGZyb20gY29uZmlnCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMsCisgICAgICAgICAgICBib29sIHVwZGF0ZVBhcmFtcyA9IHRydWUsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4+ICpjaGFuZ2VzID0gbnVsbHB0cik7CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMpIGNvbnN0OworCisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBnZXRSZWZsZWN0b3IoKSB7CisgICAgICAgIHJldHVybiBtUmVmbGVjdG9yOworICAgIH0KKworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBMb2NrOworCisgICAgLyoqCisgICAgICogTG9ja3MgdGhlIGludGVyZmFjZSBhbmQgcmV0dXJucyBhIGxvY2suIFRoaXMgbG9jayBtdXN0IGJlIHVubG9ja2VkIG9yIHJlbGVhc2VkIHdpdGhvdXQKKyAgICAgKiBjYWxsaW5nIGFueSBvdGhlciBibG9ja2luZyBjYWxsLgorICAgICAqLworICAgIExvY2sgbG9jaygpIGNvbnN0OworCitwcml2YXRlOgorICAgIHZvaWQgc2V0SW50ZXJmYWNlQWRkcmVzc0JvdW5kcyh1aW50cHRyX3Qgc3RhcnQsIHVpbnRwdHJfdCBlbmQpIHsKKyAgICAgICAgLy8gVE9ETzogZXhjbHVkZSB0aGlzIGhlbHBlcgorICAgICAgICAodm9pZClzdGFydDsKKyAgICAgICAgKHZvaWQpZW5kOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIG11dGFibGUgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtUmVmbGVjdG9yOworICAgIHN0cnVjdCBGYWN0b3J5SW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8RmFjdG9yeUltcGw+IF9tRmFjdG9yeTsKKworICAgIEMySW50ZXJmYWNlSGVscGVyKHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gcmVmbGVjdG9yKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBwYXJhbWV0ZXIgdG8gdGhpcyBpbnRlcmZhY2UuCisgICAgICogXG5vdGUgVGhpcyBtZXRob2QgQ0hFQ0tzLgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtIHBhcmFtZXRlciB0byBhZGQuCisgICAgICovCisgICAgdm9pZCBhZGRQYXJhbWV0ZXIoc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBwYXJhbSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZXBlbmRlbmN5IGluZGV4IGZvciBhIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpeCB0aGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlcgorICAgICAqLworICAgIHNpemVfdCBnZXREZXBlbmRlbmN5SW5kZXhfbChDMlBhcmFtOjpJbmRleCBpeCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIH5DMkludGVyZmFjZUhlbHBlcigpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFNldHMgc3ViY2xhc3MgaW5zdGFuY2UncyBhZGRyZXNzIGFuZCBzaXplLgorICAgICAqCisgICAgICogXHRvZG8gYWxsb3cgc3ViY2xhc3MgdG8gc3BlY2lmeSBwYXJhbWV0ZXIgYWRkcmVzcyByYW5nZSBkaXJlY3RseSAoZS5nLiBkbyBub3QgYXNzdW1lIHRoYXQKKyAgICAgKiAgICAgICB0aGV5IGFyZSBsb2NhbCB0byB0aGUgc3ViY2xhc3MgaW5zdGFuY2UpCisgICAgICoKKyAgICAgKiBccGFyYW0gVCB0eXBlIG9mIHRoZSBkZXJpdmVkIGluc3RhbmNlCisgICAgICogXHBhcmFtIGluc3RhbmNlIHBvaW50ZXIgdG8gdGhlIGRlcml2ZWQgaW5zdGFuY2UKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBDMl9ISURFIHZvaWQgc2V0RGVyaXZlZEluc3RhbmNlKFQgKmluc3RhbmNlKSB7CisgICAgICAgIHNldEludGVyZmFjZUFkZHJlc3NCb3VuZHMoKHVpbnRwdHJfdClpbnN0YW5jZSwgKHVpbnRwdHJfdCkoaW5zdGFuY2UgKyAxKSk7CisgICAgfQorCisgICAgQzJfRE9fTk9UX0NPUFkoQzJJbnRlcmZhY2VIZWxwZXIpOworfTsKKworLyoqCisgKiBDcmVhdGVzIGEgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlciBjbGFzcyBmb3IgYSBmaWVsZCBvZiBhIHBhcmFtZXRlcgorICoKKyAqIFxwYXJhbSBzcFBhcmFtIGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgaW4gYW4gaW50ZXJmYWNlIGNsYXNzIHN1YmNsYXNzZWQgZnJvbSBDMkludGVyZmFjZUhlbHBlci4KKyAqIFxwYXJhbSBmaWVsZCAgIGEgZmllbGQgb2Ygc3VjaCBwYXJhbWV0ZXIKKyAqLworI2RlZmluZSBDMkYoc3BQYXJhbSwgZmllbGQpIFwKKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPCBcCisgICAgICAgICAgICB0eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPCBcCisgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbHR5cGUoc3BQYXJhbS0+ZmllbGQpPjo6dHlwZT46OnR5cGU+Ojp0eXBlPiggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtRmllbGQoc3BQYXJhbS5nZXQoKSwgJnNwUGFyYW0tPmZpZWxkKSkKKworI2VuZGlmICAvLyBDMlVUSUxTX0lOVEVSRkFDRV9IRUxQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZVV0aWxzLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MDM3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5oCkBAIC0wLDAgKzEsMTEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19JTlRFUkZBQ0VfVVRJTFNfSF8KKyNkZWZpbmUgQzJVVElMU19JTlRFUkZBQ0VfVVRJTFNfSF8KKworI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gbWFwIHVuZGVybHlpbmcgdHlwZXMgdG8gQzJWYWx1ZSB0eXBlcyBhcyB3ZWxsIGFzIHRvIHByaW50IGZpZWxkIHZhbHVlcy4gVGhpcyBpcworICogZ2VuZXJhbGx5IHRoZSBzYW1lIGFzIHNpbXBseSB0aGUgdW5kZXJseWluZyB0eXBlIGV4Y2VwdCBmb3IgY2hhcmFjdGVycyAoU1RSSU5HKSBhbmQgYnl0ZXMgKEJMT0IpLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyX0hJREUgX0MyRmllbGRWYWx1ZUhlbHBlciB7CisgICAgdHlwZWRlZiBUIFZhbHVlVHlwZTsKKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6b3N0cmVhbSYgcHV0KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCkgeworICAgICAgICByZXR1cm4gb3MgPDwgcC5yZWY8VD4oKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQzJfSElERSBfQzJGaWVsZFZhbHVlSGVscGVyPHVpbnQ4X3Q+IHsKKyAgICB0eXBlZGVmIHVpbnQzMl90IFZhbHVlVHlwZTsKKyAgICBzdGF0aWMgc3RkOjpvc3RyZWFtJiBwdXQoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKTsKK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBDMl9ISURFIF9DMkZpZWxkVmFsdWVIZWxwZXI8Y2hhcj4geworICAgIHR5cGVkZWYgaW50MzJfdCBWYWx1ZVR5cGU7CisgICAgc3RhdGljIHN0ZDo6b3N0cmVhbSYgcHV0KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCk7Cit9OworCisvKioKKyAqIFN1cHBvcnRlZCB2YWx1ZSByYW5nZSB1dGlsaXR5IGZvciBhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZS4KKyAqCisgKiBUaGlzIG1pbWljcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWUgZm9yIFJBTkdFIHR5cGUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMlN1cHBvcnRlZFJhbmdlIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OlZhbHVlVHlwZSBWYWx1ZVR5cGU7CisKKy8vcHJpdmF0ZToKKyAgICBjb25zdGV4cHIgc3RhdGljIFQgTUlOX1ZBTFVFID0gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWluKCk7CisgICAgY29uc3RleHByIHN0YXRpYyBUIE1BWF9WQUxVRSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpOworICAgIGNvbnN0ZXhwciBzdGF0aWMgVCBNSU5fU1RFUCA9IHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8gMCA6IDE7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IHJhbmdlIHdpdGggbm8gc3VwcG9ydGVkIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgaXMgYSBzcGVjaWFsaXphdGVkIHN1cHBvcnRlZCByYW5nZSByZXByZXNlbnRhdGlvbiB0aGF0IGlzIG9ubHkgdXNlZCBmb3IKKyAgICAgKiB0aGlzIG9iamVjdCAtIGl0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIEVNUFRZIHR5cGUgaW4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcy4KKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IE5vbmUoKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKE1BWF9WQUxVRSwgTUlOX1ZBTFVFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBhbGwgdmFsdWVzIHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IEFueSgpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UoTUlOX1ZBTFVFLCBNQVhfVkFMVUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIGEgc2luZ2xlIHN1cHBvcnRlZCB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgc29sZSBzdXBwb3J0ZWQgdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IEVxdWFsVG8oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZSh2YWx1ZSwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIHN1cHBvcnRlZCB2YWx1ZXMgZ3JlYXRlciB0aGFuIGEgZ2l2ZW4gdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBDMlN1cHBvcnRlZFJhbmdlPFQ+IEdyZWF0ZXJUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuICh2YWx1ZSA9PSBNQVhfVkFMVUUgPyBOb25lKCkgOgorICAgICAgICAgICAgICAgIHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3VwcG9ydGVkUmFuZ2Uoc3RkOjpuZXh0YWZ0ZXIodmFsdWUsIE1BWF9WQUxVRSksIE1BWF9WQUxVRSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdXBwb3J0ZWRSYW5nZSh2YWx1ZSArIE1JTl9TVEVQLCBNQVhfVkFMVUUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBzdXBwb3J0ZWQgdmFsdWVzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBhIGdpdmVuIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIEMyU3VwcG9ydGVkUmFuZ2U8VD4gR3JlYXRlclRoYW5PckVxdWFsVG8oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZSh2YWx1ZSwgTUFYX1ZBTFVFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBzdXBwb3J0ZWQgdmFsdWVzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAoYWthIG5vdCBsZXNzIHRoYW4pIGEgZ2l2ZW4KKyAgICAgKiB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IE5vdExlc3NUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEdyZWF0ZXJUaGFuT3JFcXVhbFRvKHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBzdXBwb3J0ZWQgdmFsdWVzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBhIGdpdmVuIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIEMyU3VwcG9ydGVkUmFuZ2U8VD4gTGVzc1RoYW5PckVxdWFsVG8oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShNSU5fVkFMVUUsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBzdXBwb3J0ZWQgdmFsdWVzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAoYWthIG5vdCBncmVhdGVyIHRoYW4pIGEgZ2l2ZW4KKyAgICAgKiB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IE5vdEdyZWF0ZXJUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIExlc3NUaGFuT3JFcXVhbFRvKHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBzdXBwb3J0ZWQgdmFsdWVzIGxlc3MgdGhhbiBhIGdpdmVuIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgQzJTdXBwb3J0ZWRSYW5nZTxUPiBMZXNzVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiAodmFsdWUgPT0gTUlOX1ZBTFVFID8gTm9uZSgpIDoKKyAgICAgICAgICAgICAgICBzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA/CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN1cHBvcnRlZFJhbmdlKE1JTl9WQUxVRSwgc3RkOjpuZXh0YWZ0ZXIodmFsdWUsIE1JTl9WQUxVRSkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3VwcG9ydGVkUmFuZ2UoTUlOX1ZBTFVFLCB2YWx1ZSAtIE1JTl9TVEVQKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGNvbnRpbnVvdXMgb3IgYXJpdGhtZXRpYyByYW5nZSBiZXR3ZWVuIHR3byB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWluIHRoZSBsb3dlciB2YWx1ZQorICAgICAqIFxwYXJhbSBtYXggdGhlIGhpZ2hlciB2YWx1ZSAoaWYgdGhpcyBpcyBsb3dlciB0aGFuIHxtaW58IHRoZSByYW5nZSB3aWxsIGJlIGVtcHR5KQorICAgICAqIFxwYXJhbSBzdGVwIHRoZSBzdGVwIG9mIHRoZSBhcml0aG1ldGljIHJhbmdlLiAoSWYgdGhpcyBpcyAwIGZvciBmbG9hdGluZyBwb2ludCB0eXBlcyBvciAxIGZvcgorICAgICAqICAgICAgICBpbnRlZ2VyIHR5cGVzLCB0aGUgY29uc3RydWN0ZWQgcmFuZ2UgaXMgY29udGludW91cykKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwcgorICAgIEMyU3VwcG9ydGVkUmFuZ2U8VD4gSW5SYW5nZShUIG1pbiwgVCBtYXgsIFQgc3RlcCA9IE1JTl9TVEVQKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKG1pbiwgbWF4LCBzdGVwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugb3ZlciBhIGdlb21ldHJpYyBzZXJpZXMgYmV0d2VlbiB0d28gdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIG1pbiB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIHJhbmdlLiBUaGlzIHZhbHVlIGlzIGFsd2F5cyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCByYW5nZQorICAgICAqICAgICAgICBhcyBsb25nIGFzIGl0IGlzIG5vdCBncmVhdGVyIHRoYW4gfG1heHwuCisgICAgICogXHBhcmFtIG1heCB0aGUgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLiBUaGlzIHZhbHVlIGlzIG9ubHkgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQKKyAgICAgKiAgICAgICAgcmFuZ2UgaWYgaXQgaXMgcGFydCBvZiB0aGUgZ2VvbWV0cmljIHNlcmllcy4KKyAgICAgKiBccGFyYW0gbnVtIHRoZSBudW1lcmF0b3Igb2YgdGhlIGdlb21ldHJpYyBzZXJpZXMuCisgICAgICogXHBhcmFtIGRlbm9tIHRoZSBkZW5vbWluYXRvciBvZiB0aGUgZ2VvbWV0cmljIHNlcmllcy4KKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwcgorICAgIEMyU3VwcG9ydGVkUmFuZ2U8VD4gSW5TZXJpZXMoVCBtaW4sIFQgbWF4LCBUIG51bSwgVCBkZW5vbSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShtaW4sIG1heCwgMCwgbnVtLCBkZW5vbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIG92ZXIgYSBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcyBiZXR3ZWVuIHR3byB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWluIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgcmFuZ2UuIFRoaXMgdmFsdWUgaXMgYWx3YXlzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIHJhbmdlCisgICAgICogICAgICAgIGFzIGxvbmcgYXMgaXQgaXMgbm90IGdyZWF0ZXIgdGhhbiB8bWF4fC4KKyAgICAgKiBccGFyYW0gbWF4IHRoZSB1cHBlciBib3VuZCBvZiB0aGUgcmFuZ2UuIFRoaXMgdmFsdWUgaXMgb25seSBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZAorICAgICAqICAgICAgICByYW5nZSBpZiBpdCBpcyBwYXJ0IG9mIHRoZSBzZXJpZXMuCisgICAgICogXHBhcmFtIHN0ZXAgdGhlIGFjY3VtdWxhdG9yIG9mIHRoZSBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcworICAgICAqIFxwYXJhbSBudW0gdGhlIG51bWVyYXRvciBvZiB0aGUgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMuCisgICAgICogXHBhcmFtIGRlbm9tIHRoZSBkZW5vbWluYXRvciBvZiB0aGUgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMuCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIKKyAgICBDMlN1cHBvcnRlZFJhbmdlPFQ+IEluTWFjU2VyaWVzKFQgbWluLCBUIG1heCwgVCBzdGVwLCBUIG51bSwgVCBkZW5vbSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShtaW4sIG1heCwgc3RlcCwgbnVtLCBkZW5vbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIGZyb20gYSBnZW5lcmljIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LiBUaGlzIHdpbGwgYmUgYW4gZW1wdHkKKyAgICAgKiByYW5nZSBpZiB0aGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUgbm90IG9mIFJBTkdFIHR5cGUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIG9iamVjdAorICAgICAqLworICAgIEMyU3VwcG9ydGVkUmFuZ2UoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHJhbmdlIGlzIGVtcHR5LgorICAgICAqLworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21NaW4gPiBfbU1heDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyByYW5nZSBpcyB2YWxpZC4KKyAgICAgKgorICAgICAqIFJhbmdlcyBhcmUgdmFsaWQgaWYgdGhleSBhcmUgY29udGludW91cyBvciBtb25vdG9uaWMuCisgICAgICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBvdmVyZmxvdyBvciBuZWdhdGl2ZSBzZXJpZXMKKyAgICAgICAgcmV0dXJuIF9tRGVub20gPiAwICYmIF9tTnVtID49IF9tRGVub20gJiYgX21NaW4gKiAoX21EZW5vbSAtIF9tTnVtKSA8IF9tU3RlcCAqIF9tRGVub207CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGEgdmFsdWUgaXMgcGFydCBvZiB0aGlzIHJhbmdlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKi8KKyAgICBib29sIGNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyByYW5nZSB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyByYW5nZSBhbmQgYW5vdGhlciwgaWYgaXQgaXMKKyAgICAgKiByZXByZXNlbnRhYmxlIGFzIGEgcmFuZ2Ugb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIGxpbWl0IHRoZSBvdGhlciByYW5nZQorICAgICAqLworICAgIEMyU3VwcG9ydGVkUmFuZ2U8VD4gbGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3QuCisgICAgICovCisgICAgaW5saW5lIG9wZXJhdG9yIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKF9tTWluLCBfbU1heCwgX21TdGVwLCBfbU51bSwgX21EZW5vbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbG93ZXIgYm91bmQgYW5kIHN0YXJ0aW5nIHBvaW50IG9mIHRoaXMgcmFuZ2UuCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIFQgbWluKCkgY29uc3QgICB7IHJldHVybiBfbU1pbjsgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1cHBlciBib3VuZCBvZiB0aGlzIHJhbmdlLgorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBUIG1heCgpIGNvbnN0ICAgeyByZXR1cm4gX21NYXg7ICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RlcCBvZiB0aGlzIHJhbmdlLgorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBUIHN0ZXAoKSBjb25zdCAgeyByZXR1cm4gX21TdGVwOyAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtZXJhdG9yIG9mIHRoaXMgcmFuZ2UuCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIFQgbnVtKCkgY29uc3QgICB7IHJldHVybiBfbU51bTsgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZW5vbWluYXRvciBvZiB0aGlzIHJhbmdlLgorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBUIGRlbm9tKCkgY29uc3QgeyByZXR1cm4gX21EZW5vbTsgfQorCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB4W2kuLi5dIGlzIGFsbCB2YWx1ZXMgYmV0d2VlbiBfbU1pbiBhbmQgX21NYXguCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIGJvb2wgaXNTaW1wbGVSYW5nZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tU3RlcCA9PSBNSU5fU1RFUCAmJiBfbU51bSA9PSAxICYmIF9tRGVub20gPT0gMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgeFtpLi4uXSBpcyBkZWZpbmVkIGFzIHN1Y2g6CisgICAgICogeFtpICsgMV0gPSB4W2ldICsgX21TdGVwLCB3aGVyZSBfbVN0ZXAgPiAwIGFuZCBfbU1pbiA8PSB4W2ldIDw9IF9tTWF4CisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIGJvb2wgaXNBcml0aG1ldGljU2VyaWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21TdGVwID4gTUlOX1NURVAgJiYgX21OdW0gPT0gMSAmJiBfbURlbm9tID09IDE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHhbaS4uLl0gaXMgZGVmaW5lZCBhcyBzdWNoOgorICAgICAqIHhbaV0gPSB4WzBdICogKF9tTnVtIC8gX21EZW5vbSkgXiBpICh3aXRoIHJvdW5kaW5nKSwgd2hlcmUgX21OdW0gPiBfbURlbm9tID4gMCBhbmQgeFswXSA+IDAKKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgYm9vbCBpc0dlb21ldHJpY1NlcmllcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tTWluID4gMCAmJiBfbVN0ZXAgPT0gMCAmJiBfbU51bSA+IF9tRGVub20gJiYgX21EZW5vbSA+IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHhbaS4uLl0gaXMgZGVmaW5lZCBhcyBzdWNoOgorICAgICAqIHhbaSArIDFdID0geFtpXSAqIF9tTnVtIC8gX21EZW5vbSArIF9tU3RlcCAod2l0aCByb3VuZGluZyksIHdoaWxlIHhbaSArIDFdID4geFtpXSwgd2hlcmUKKyAgICAgKiBfbVN0ZXAgIT0gMCwgX21EZW5vbSA+IDAgYW5kIF9tTnVtID4gMAorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBib29sIGlzTWFjU2VyaWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21TdGVwICE9IDAgJiYgX21OdW0gPiAwICYmIF9tRGVub20gPiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gYXJpdGhtZXRpYyBvciBjb250aW51b3VzIHJhbmdlLgorICAgICAqCisgICAgICogXHBhcmFtIG1pbiB0aGUgbG93ZXIgdmFsdWUKKyAgICAgKiBccGFyYW0gbWF4IHRoZSBoaWdoZXIgdmFsdWUgKGlmIHRoaXMgaXMgbG93ZXIgdGhhbiB8bWlufCB0aGUgcmFuZ2Ugd2lsbCBiZSBlbXB0eSkKKyAgICAgKiBccGFyYW0gc3RlcCB0aGUgc3RlcCBvZiB0aGUgYXJpdGhtZXRpYyByYW5nZS4gKElmIHRoaXMgaXMgMCBmb3IgZmxvYXRpbmcgcG9pbnQgdHlwZXMgb3IgMSBmb3IKKyAgICAgKiAgICAgICAgaW50ZWdlciB0eXBlcywgdGhlIGNvbnN0cnVjdGVkIHJhbmdlIGlzIGNvbnRpbnVvdXMpCisgICAgICovCisgICAgY29uc3RleHByIEMyX0hJREUgQzJTdXBwb3J0ZWRSYW5nZShUIG1pbiwgVCBtYXgsIFQgc3RlcCA9IFQoc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPyAwIDogMSkpCisgICAgICAgIDogX21NaW4obWluKSwgX21NYXgobWF4KSwgX21TdGVwKHN0ZXApLCBfbU51bSgxKSwgX21EZW5vbSgxKSB7IH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSBvdmVyIGEgZ2VvbWVydGljIHNvciBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtaW4gdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS4gVGhpcyB2YWx1ZSBpcyBhbHdheXMgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQgcmFuZ2UKKyAgICAgKiAgICAgICAgYXMgbG9uZyBhcyBpdCBpcyBub3QgZ3JlYXRlciB0aGFuIHxtYXh8LgorICAgICAqIFxwYXJhbSBtYXggdGhlIHVwcGVyIGJvdW5kIG9mIHRoZSByYW5nZS4gVGhpcyB2YWx1ZSBpcyBvbmx5IHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkCisgICAgICogICAgICAgIHJhbmdlIGlmIGl0IGlzIHBhcnQgb2YgdGhlIGdlb21ldHJpYyBzZXJpZXMuCisgICAgICogXHBhcmFtIHN0ZXAgdGhlIGFjY3VtdWxhdG9yIG9mIHRoZSBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcy4gVGhpcyBpcyAwIGZvciBhIHB1cmUgZ2VvbWV0cmljCisgICAgICogICAgICAgIHNlcmllcworICAgICAqIFxwYXJhbSBudW0gdGhlIG51bWVyYXRvciBvZiB0aGUgZ2VvbWV0cmljIHNlcmllcy4KKyAgICAgKiBccGFyYW0gZGVub20gdGhlIGRlbm9taW5hdG9yIG9mIHRoZSBnZW9tZXRyaWMgc2VyaWVzLgorICAgICAqLworICAgIGNvbnN0ZXhwciBDMl9ISURFIEMyU3VwcG9ydGVkUmFuZ2UoVCBtaW4sIFQgbWF4LCBUIHN0ZXAsIFQgbnVtLCBUIGRlbikKKyAgICAgICAgOiBfbU1pbihtaW4pLCBfbU1heChtYXgpLCBfbVN0ZXAoc3RlcCksIF9tTnVtKG51bSksIF9tRGVub20oZGVuKSB7IH0KKworICAgIFQgX21NaW47IC8vLzwgbG93ZXIgYm91bmQgYW5kIHN0YXJ0aW5nIHBvaW50CisgICAgVCBfbU1heDsgLy8vPCB1cHBlciBib3VuZAorICAgIFQgX21TdGVwOyAvLy88IHN0ZXAgb2YgYW4gYXJpdGhtZXRpYyBzZXJpZXMgKDAgaWYgY29udGludW91cyBmbG9hdGluZyBwb2ludCByYW5nZSkKKyAgICBUIF9tTnVtOyAvLy88IG51bWVyYXRvciBvZiBhIGdlb21ldHJpYyBzZXJpZXMKKyAgICBUIF9tRGVub207IC8vLzwgZGVub21pbmF0b3Igb2YgYSBnZW9tZXRyaWMgc2VyaWVzCit9OworCisvKioKKyAqIE9yZGVyZWQgc3VwcG9ydGVkIGZsYWcgc2V0IGZvciBhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyU3VwcG9ydGVkRmxhZ3MgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgZmxhZyBzZXQuCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGlzIGlzIGEgc3BlY2lhbGl6YXRlZCBzdXBwb3J0ZWQgZmxhZ3MgcmVwcmVzZW50YXRpb24gdGhhdCBpcyBvbmx5IHVzZWQgZm9yCisgICAgICogdGhpcyBvYmplY3QgLSBpdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBFTVBUWSB0eXBlIGluIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMuCisgICAgICovCisgICAgc3RhdGljIGlubGluZSBDMlN1cHBvcnRlZEZsYWdzPFQ+IE5vbmUoKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZEZsYWdzKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxDMlZhbHVlOjpQcmltaXRpdmU+KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBmbGFncyBzZXQgb2YgZ2l2ZW4gZmxhZ3MuCisgICAgICoKKyAgICAgKiBccGFyYW0gZmxhZ3MgdGhlIG9yZGVyZWQgc2V0IG9mIGZsYWdzIGFzIGFuIGluaXRpYWxpemVyIGxpc3QuCisgICAgICogXHBhcmFtIG1pbiBtaW5pbXVtIHNldCBvZiBmbGFncyB0byBiZSBzZXQuCisgICAgICovCisgICAgc3RhdGljIGlubGluZSBDMlN1cHBvcnRlZEZsYWdzPFQ+IEZsYWdzKGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBmbGFncywgVCBtaW4gPSBUKDApKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZEZsYWdzKG1pbiwgZmxhZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBmbGFncyBzZXQgb2YgZ2l2ZW4gZmxhZ3MuCisgICAgICoKKyAgICAgKiBccGFyYW0gZmxhZ3MgdGhlIG9yZGVyZWQgc2V0IG9mIGZsYWdzLgorICAgICAqIFxwYXJhbSBtaW4gbWluaW11bSBzZXQgb2YgZmxhZ3MgdG8gYmUgc2V0LgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgQzJTdXBwb3J0ZWRGbGFnczxUPiBGbGFncyhjb25zdCBzdGQ6OnZlY3RvcjxUPiAmZmxhZ3MsIFQgbWluID0gVCgwKSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRGbGFncyhtaW4sIGZsYWdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmxhZyBzZXQgZnJvbSBhIGdlbmVyaWMgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3QuIFRoaXMgd2lsbCBiZSBhbiBlbXB0eQorICAgICAqIHNldCBpZiB0aGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUgbm90IG9mIEZMQUdTIHR5cGUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIG9iamVjdAorICAgICAqLworICAgIEMyU3VwcG9ydGVkRmxhZ3M8VD4oY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKSB7CisgICAgICAgIGlmICh2YWx1ZXMudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUykgeworICAgICAgICAgICAgX21WYWx1ZXMuaW5zZXJ0KF9tVmFsdWVzLmVuZCgpLCB2YWx1ZXMudmFsdWVzLmJlZ2luKCksIHZhbHVlcy52YWx1ZXMuZW5kKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2V0IGlzIGVtcHR5LgorICAgICAqLworICAgIGNvbnN0ZXhwciBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVZhbHVlcy5lbXB0eSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBhIHZhbHVlIGlzIHBhcnQgb2YgdGhpcyBzZXQuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAqLworICAgIGJvb2wgY29udGFpbnMoVCB2YWx1ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IGZsYWcgc2V0IHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIHNldCBhbmQgYW5vdGhlci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaW1pdCB0aGUgb3RoZXIgdmFsdWUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRGbGFnczxUPiBsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdC4KKyAgICAgKi8KKyAgICBvcGVyYXRvciBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyghaXNFbXB0eSgpIC8qIGZsYWdzICovLCBfbVZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgb3JkZXJlZCBzZXQgb2YgZmxhZ3Mgb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VD4gZmxhZ3MoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1pbmltdW0gc2V0IG9mIGZsYWdzIGZvciB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBUIG1pbigpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoaXMgc3VwcG9ydGVkIHZhbHVlIHNldC4KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgX21WYWx1ZXMuY2xlYXIoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGZsYWcgc2V0IGRpcmVjdGx5IGZyb20gYW4gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIGEgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIG1pbmltdW0gZmxhZyBzZXQgZm9sbG93ZWQgYnkgdGhlIHNldCBvZiBmbGFncworICAgICAqLworICAgIEMyU3VwcG9ydGVkRmxhZ3Moc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiAmJnZhbHVlcykKKyAgICAgICAgOiBfbVZhbHVlcyh2YWx1ZXMpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmxhZyBzZXQgZnJvbSBhIHNldCBvZiBmbGFncyBhbmQgYSBtaW5pbXVtIGZsYWcgc2V0LgorICAgICAqCisgICAgICogXHBhcmFtIGZsYWdzIHRoZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZEZsYWdzKFQgbWluLCBjb25zdCBzdGQ6OnZlY3RvcjxUPiAmZmxhZ3MpIHsKKyAgICAgICAgX21WYWx1ZXMuZW1wbGFjZV9iYWNrKG1pbik7CisgICAgICAgIGZvciAoVCBlbGVtIDogZmxhZ3MpIHsKKyAgICAgICAgICAgIF9tVmFsdWVzLmVtcGxhY2VfYmFjayhlbGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBmbGFnIHNldCBmcm9tIGEgc2V0IG9mIGluaXRpYWxpemVyIGxpc3QgdmFsdWVzIGFuZCBhIG1pbmltdW0gZmxhZyBzZXQKKyAgICAgKgorICAgICAqIFxwYXJhbSBmbGFncyB0aGUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRGbGFncyhUIG1pbiwgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IGZsYWdzKSB7CisgICAgICAgIF9tVmFsdWVzLmVtcGxhY2VfYmFjayhtaW4pOworICAgICAgICBmb3IgKFQgZWxlbSA6IGZsYWdzKSB7CisgICAgICAgICAgICBfbVZhbHVlcy5lbXBsYWNlX2JhY2soZWxlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IF9tVmFsdWVzOyAvLy88IHRoZSBtaW5pbXVtIGZsYWcgc2V0IGZvbGxvd2VkIGJ5IHRoZSBzZXQgb2YgZmxhZ3MKK307CisKKy8qKgorICogT3JkZXJlZCBzdXBwb3J0ZWQgdmFsdWUgc2V0IGZvciBhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgdmFsdWUgc2V0LgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyBpcyBhIHNwZWNpYWxpemF0ZWQgc3VwcG9ydGVkIHJhbmdlIHJlcHJlc2VudGF0aW9uIHRoYXQgaXMgb25seSB1c2VkIGZvcgorICAgICAqIHRoaXMgb2JqZWN0IC0gaXQgaXMgZXF1aXZhbGVudCB0byB0aGUgRU1QVFkgdHlwZSBpbiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzLgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBOb25lKCkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRWYWx1ZVNldCh7IH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB2YWx1ZSBzZXQgb2YgZ2l2ZW4gdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgb3JkZXJlZCBzZXQgb2YgdmFsdWVzIGFzIGFuIGluaXRpYWxpemVyIGxpc3QuCisgICAgICovCisgICAgc3RhdGljIGlubGluZSBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IE9uZU9mKGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiB2YWx1ZXMpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQodmFsdWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdmFsdWUgc2V0IG9mIGdpdmVuIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIG9yZGVyZWQgc2V0IG9mIHZhbHVlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW5saW5lIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gT25lT2YoY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJnZhbHVlcykgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRWYWx1ZVNldCh2YWx1ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB2YWx1ZSBzZXQgZnJvbSBhIGdlbmVyaWMgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3QuIFRoaXMgd2lsbCBiZSBhbiBlbXB0eQorICAgICAqIHNldCBpZiB0aGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUgbm90IG9mIFZBTFVFUyB0eXBlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgc3VwcG9ydGVkIHZhbHVlcyBvYmplY3QKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+KGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcykgeworICAgICAgICBpZiAodmFsdWVzLnR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6VkFMVUVTKSB7CisgICAgICAgICAgICBfbVZhbHVlcy5pbnNlcnQoX21WYWx1ZXMuZW5kKCksIHZhbHVlcy52YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLnZhbHVlcy5lbmQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyByYW5nZSBpcyBlbXB0eS4KKyAgICAgKi8KKyAgICBjb25zdGV4cHIgYm9vbCBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21WYWx1ZXMuZW1wdHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSB2YWx1ZSBpcyBwYXJ0IG9mIHRoaXMgc2V0LgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKi8KKyAgICBib29sIGNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyB2YWx1ZSBzZXQgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgc2V0IGFuZCBhbm90aGVyLgorICAgICAqCisgICAgICogXHBhcmFtIGxpbWl0IHRoZSBvdGhlciB2YWx1ZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IGxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZsaW1pdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IHZhbHVlIHNldCB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBzZXQgYW5kIGEgdmFsdWUgcmFuZ2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGltaXQgdGhlIG90aGVyIHJhbmdlCisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyB2YWx1ZSBzZXQgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgc2V0IGFuZCBhIGZsYWcgc2V0LgorICAgICAqCisgICAgICogXHBhcmFtIGxpbWl0IHRoZSBvdGhlciBmbGFnIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gbGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8VD4gJmxpbWl0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3QuCisgICAgICovCisgICAgb3BlcmF0b3IgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoZmFsc2UgLyogZmxhZ3MgKi8sIF9tVmFsdWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBvcmRlcmVkIHNldCBvZiB2YWx1ZXMgb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VD4gdmFsdWVzKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhpcyBzdXBwb3J0ZWQgdmFsdWUgc2V0LgorICAgICAqLworICAgIGlubGluZSB2b2lkIGNsZWFyKCkgeworICAgICAgICBfbVZhbHVlcy5jbGVhcigpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdmFsdWUgc2V0IGZyb20gYSBzZXQgb2YgQzJWYWx1ZTo6UHJpbWl0aXZlIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQoc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiAmJnZhbHVlcykKKyAgICAgICAgOiBfbVZhbHVlcyh2YWx1ZXMpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdmFsdWUgc2V0IGZyb20gYSBzZXQgb2YgdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldChjb25zdCBzdGQ6OnZlY3RvcjxUPiAmdmFsdWVzKSB7CisgICAgICAgIGZvciAoVCBlbGVtIDogdmFsdWVzKSB7CisgICAgICAgICAgICBfbVZhbHVlcy5lbXBsYWNlX2JhY2soZWxlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdmFsdWUgc2V0IGZyb20gYSBzZXQgb2YgaW5pdGlhbGl6ZXIgbGlzdCB2YWx1ZXMKKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQoY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IHZhbHVlcykgeworICAgICAgICBmb3IgKFQgZWxlbSA6IHZhbHVlcykgeworICAgICAgICAgICAgX21WYWx1ZXMuZW1wbGFjZV9iYWNrKGVsZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiBfbVZhbHVlczsgLy8vPCB0aGUgc3VwcG9ydGVkIHNldCBvZiB2YWx1ZXMKK307CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBDMkZpZWxkU3VwcG9ydGVWYWx1ZXMgb2JqZWN0IGZvciBmaWVsZHMgb2YgdmFyaW91cyB0eXBlcy4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI7CisKKy8vIHRlbXBsYXRlZCBvcGVyYXRvciBtdXN0IGJlIHByZWRlY2xhcmVkIGZvciBmcmllbmQgZGVjbGFyYXRpb24KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgaGVscGVyIGZvciBhIHNwZWNpZmljIHR5cGUgZnJvbSBhIGdlbmVyaWMgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBzdHJ1Y3QuCisgICAgICovCisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcihjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpOworCisgICAgLy8gVFJJQ0tZOiBuZWVkZWQgZm9yIHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBkZWNsYXJhdGlvbgorICAgIH5DMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyKCk7CisKKyAgICAvLyBzdXBwb3J0IGNvcHkgY29uc3RydWN0b3Ivb3BlcmF0b3IKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIgJik7CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlciYgb3BlcmF0b3I9KGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIgJik7CisKKyAgICBib29sIHN1cHBvcnRzKFQgdmFsdWUpIGNvbnN0OworCitwcml2YXRlOgorICAgIC8vIHVzZSBwaW1wbCBhcyBpbXBsZW1lbnRhdGlvbiBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUKKyAgICBzdHJ1Y3QgSW1wbDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gX21JbXBsOworCisgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCA8VD4oc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPiAmaSk7CisgICAgLy9mcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIgJmkpOworfTsKKworLyoqCisgKiBCdWlsZGVyIGZvciBzdXBwb3J0ZWQgdmFsdWVzIGZvciBhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZS4KKyAqCisgKiBUaGlzIGJ1aWxkZXIgY2FuIGJlIHVzZWQgdG8gc3VjY2Vzc2l2ZWx5IHJlc3RyaWN0IHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGZvciBhIGZpZWxkLiBVcG9uCisgKiBjcmVhdGlvbiwgdGhlcmUgYXJlIG5vIHN1cHBvcnRlZCB2YWx1ZXMgc3BlY2lmaWVkIC0gd2hpY2ggZm9yIHRoaXMgYnVpbGRlciBtZWFucyB0aGF0IGFsbAorICogdmFsdWVzIGFyZSBzdXBwb3J0ZWQuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVpbGRlciB3aXRoIG5vIGRlZmluZWQgdmFsdWVzIC0gYnV0IGltcGxpY2l0bHkgYW55IHZhbHVlIGFsbG93ZWQuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcihjb25zdCBDMlBhcmFtRmllbGQgJmZpZWxkKTsKKworICAgIC8qKgorICAgICAqIEdldCBDMlBhcmFtRmllbGRWYWx1ZXMgZnJvbSB0aGlzIGJ1aWxkZXIuCisgICAgICovCisgICAgb3BlcmF0b3IgQzJQYXJhbUZpZWxkVmFsdWVzKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmUgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXMgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIG9mIHRoaXMgYnVpbGRlci4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZhbnkoKTsKKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIG5vbmUuCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGlzIHJlYWxseSBzaG91bGQgbm90IGJlIHVzZWQgZnJvbSB0aGUgYnVpbGRlciBhcyBhbGwgcGFyYW1zIG11c3QgaGF2ZSBzdXBwb3J0ZWQKKyAgICAgKiAgICAgICB2YWx1ZXMsIGJ1dCBpcyBoZXJlIGluIGNhc2UgdGhpcyBpcyByZWFsbHkgdGhlIGNhc2UuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbm9uZSgpOworCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gfHZhbHVlfCBhbG9uZS4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZlcXVhbFRvKFQgdmFsdWUpOworCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGdyZWF0ZXIgdGhhbiB8dmFsdWV8LgorICAgICAqLworICAgIGlubGluZSBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZncmVhdGVyVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46OkdyZWF0ZXJUaGFuKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB8dmFsdWV8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmdyZWF0ZXJUaGFuT3JFcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6R3JlYXRlclRoYW5PckVxdWFsVG8odmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHx2YWx1ZXwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbm90TGVzc1RoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpOb3RMZXNzVGhhbih2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gfHZhbHVlfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZsZXNzVGhhbk9yRXF1YWxUbyhUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46Okxlc3NUaGFuT3JFcXVhbFRvKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB8dmFsdWV8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm5vdEdyZWF0ZXJUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6Tm90R3JlYXRlclRoYW4odmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgbGVzcyB0aGFuIHx2YWx1ZXwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbGVzc1RoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpMZXNzVGhhbih2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBpbiB0aGUgcmFuZ2Ugb2YgWyB8bWlufCwgfG1heHwgXQorICAgICAqIHdpdGggb3B0aW9uYWwgfHN0ZXB8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmluUmFuZ2UoCisgICAgICAgICAgICBUIG1pbiwgVCBtYXgsIFQgc3RlcCA9IHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8gVCgwKSA6IFQoMSkpICB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46OkluUmFuZ2UobWluLCBtYXgsIHN0ZXApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgaW4gdGhlIGdlb21ldHJpYyBzZXJpZXMgc3RhcnRpbmcKKyAgICAgKiBmcm9tIHxtaW58IHdpdGggZmFjdG9yIHxudW18IC8gfGRlbm9tfCwgbm90IGdyZWF0ZXIgdGhhbiB8bWF4fC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZpblNlcmllcyhUIG1pbiwgVCBtYXgsIFQgbnVtLCBUIGRlbm9tKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46OkluU2VyaWVzKG1pbiwgbWF4LCBudW0sIGRlbm9tKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGluIHRoZSBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcworICAgICAqIHN0YXJ0aW5nIGZyb20gfG1pbnwgd2l0aCBmYWN0b3IgfG51bXwgLyB8ZGVub218IGFuZCB8c3RlcHwsIG5vdCBncmVhdGVyIHRoYW4gfG1heHwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmaW5NYWNTZXJpZXMoVCBtaW4sIFQgbWF4LCBUIHN0ZXAsIFQgbnVtLCBUIGRlbm9tKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46OkluTWFjU2VyaWVzKG1pbiwgbWF4LCBzdGVwLCBudW0sIGRlbm9tKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGluIHx2YWx1ZXN8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm9uZU9mKGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiB2YWx1ZXMpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6T25lT2YodmFsdWVzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGluIHx2YWx1ZXN8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm9uZU9mKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZ2YWx1ZXMpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6T25lT2YodmFsdWVzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gZmxhZ3MgaW4gfGZsYWdzfCB3aXRoIGF0IGxlYXN0IHxtaW58CisgICAgICogc2V0LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmZsYWdzKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZmbGFncywgVCBtaW4gPSBUKDApKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkRmxhZ3M8VD46OkZsYWdzKGZsYWdzLCBtaW4pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBmbGFncyBpbiB8dmFsdWVzfCB3aXRoIGF0IGxlYXN0IHxtaW58CisgICAgICogc2V0LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmZsYWdzKGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBmbGFncywgVCBtaW4gPSBUKDApKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkRmxhZ3M8VD46OkZsYWdzKGZsYWdzLCBtaW4pKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyKCk7CisKKyAgICAvLyBzdXBwb3J0IGNvcHkgY29uc3RydWN0b3Ivb3BlcmF0b3IKKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyKGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIgJik7CisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlciYgb3BlcmF0b3I9KGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIgJik7CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gYSB2YWx1ZSBzZXQuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZsaW1pdCk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBhIHZhbHVlIHNldC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZsaW1pdFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8VD4gJmxpbWl0KTsKKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGEgcmFuZ2UuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZsaW1pdCk7CisKKyAgICBzdHJ1Y3QgSW1wbDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gX21JbXBsOworfTsKKworLyoqCisgKiBCdWlsZGVyIGZvciBhIGxpc3Qgb2Ygc2V0dGluZyBjb25mbGljdHMuCisgKi8KK2NsYXNzIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgbGlzdCBvZiBzZXR0aW5nIGNvbmZsaWN0cy4KKyAgICAgKi8KKyAgICBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbGlzdCBjb250YWluaW5nIGEgc2luZ2xlIHNldHRpbmcgY29uZmxpY3QuCisgICAgICovCisgICAgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlcihDMlBhcmFtRmllbGRWYWx1ZXMgJiZjb25mbGljdCk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgY29uZmxpY3QgdG8gdGhlIGN1cnJlbnQgbGlzdCBvZiBjb25mbGljdHMgYW5kIHJldHVybnMgdGhpcworICAgICAqLworICAgIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXImIHdpdGgoQzJQYXJhbUZpZWxkVmFsdWVzICYmY29uZmxpY3QpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY3VycmVudCBsaXN0IG9mIGNvbmZsaWN0cyAoYW5kIG1vdmVzIHRoZW0gb3V0IG9mIHRoaXMgYnVpbGRlci4pCisgICAgICogKHRoaXMgaXMgd2h5IGl0IGlzIG5vdCBjb25zdCkKKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+IHJldHJpZXZlQ29uZmxpY3RzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgbGlzdCBpcyBlbXB0eS4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9tQ29uZmxpY3RzLmVtcHR5KCk7IH0KKworICAgIGlubGluZSBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gZW1wdHkoKTsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gX21Db25mbGljdHM7Cit9OworCisvKioKKyAqIFNldHRpbmcgcmVzdWx0IGJ1aWxkZXIgZm9yIGEgcGFyYW1ldGVyLgorICovCitzdHJ1Y3QgQzJTZXR0aW5nUmVzdWx0QnVpbGRlciB7CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHJlYWQtb25seSBzZXR0aW5nIHJlc3VsdCBmYWlsdXJlLgorICAgICAqCisgICAgICogVGhpcyBkb2VzIG5vdCB0YWtlIEZTViBhcyBvbmx5IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmaWVsZCBpcyBzdXBwb3J0ZWQuCisgICAgICovCisgICAgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdCBSZWFkT25seShjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBiYWQtdmFsdWUgb3IgaW5mb2luZm9ybWF0aW9uYWwgYmFkLXZhbHVlIHNldHRpbmcgcmVzdWx0IGZhaWx1cmUuCisgICAgICoKKyAgICAgKiBUaGlzIGRvZXMgbm90IHRha2UgRlNWIGFzIHRoZSB2YWx1ZSBpcyBvdXRzaWRlIG9mIHRoZSBwb3NzaWJsZSB2YWx1ZXMuIEFzIHN1Y2gsIHRoZXJlIGFyZSBubworICAgICAqIGNvbmZsaWN0cyBmb3IgdGhpcyBjYXNlIGVpdGhlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0IEJhZFZhbHVlKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGFyYW1GaWVsZCwgYm9vbCBpc0luZm8gPSBmYWxzZSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29uZmxpY3QgKG9yIGluZm9ybWF0aW9uYWwgY29uZmxpY3QpIHNldHRpbmcgcmVzdWx0IGZhaWx1cmUuCisgICAgICoKKyAgICAgKiBUaGlzIHRha2VzIEZTViBzbyB1c2UgcGFyYW1GaWVsZFZhbHVlcyBhbmQgb3B0aW9uYWwgY29uZmxpY3RzLgorICAgICAqLworICAgIHN0YXRpYyBDMlNldHRpbmdSZXN1bHQgQ29uZmxpY3QoCisgICAgICAgICAgICBDMlBhcmFtRmllbGRWYWx1ZXMgJiZwYXJhbUZpZWxkVmFsdWVzLCBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyICZjb25mbGljdHMsCisgICAgICAgICAgICBib29sIGlzSW5mbyA9IGZhbHNlKTsKKworICAgIC8vIFRPRE86IHJldHJpZXZlIHJlc3VsdHMKKworCitwcml2YXRlOgorICAgIEMyUGFyYW1GaWVsZCBfbVBhcmFtRmllbGQ7CisgICAgQzJTZXR0aW5nUmVzdWx0IF9tUmVzdWx0OworCisgICAgQzJTZXR0aW5nUmVzdWx0QnVpbGRlcihjb25zdCBDMlNldHRpbmdSZXN1bHRCdWlsZGVyICYpID0gZGVsZXRlOworfTsKKworLyoqCisgKiBTZXR0aW5nIHJlc3VsdHMgKFBMVVJBTCkgYnVpbGRlci4KKyAqCisgKiBTZXR0aW5nIHJlc3VsdHMgY29udGFpbiBhIGZhaWx1cmUgc3RhdHVzIGFsb25nIHdpdGggYSBsaXN0IG9mIGZhaWxpbmcgZmllbGRzIG9yIHBhcmFtcy4KKyAqLworc3RydWN0IEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIHsKKyAgICBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihjb25zdCBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciYpID0gZGVsZXRlOworICAgIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyJiYpID0gZGVmYXVsdDsKKyAgICBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciAmb3BlcmF0b3I9KEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyJiYpID0gZGVmYXVsdDsKKworICAgIC8qKiBccmV0dXJucyAoZGVmYXVsdCkgc3VjY2Vzc2Z1bCByZXN1bHQgd2l0aCBubyBkZXRhaWxzLiAqLworICAgIGlubGluZSBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgT2soKSB7CisgICAgICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMl9PSyk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIEludGVyZmFjZSBpcyBpbiBiYWQgc3RhdGUsIHdpdGggbm8gZnVydGhlciBkZXRhaWxzLiAqLworICAgIGlubGluZSBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgQmFkU3RhdGUoKSB7CisgICAgICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMl9CQURfU1RBVEUpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBJbnRlcmZhY2UgY29ubmVjdGlvbiB0aW1lZCBvdXQsIHdpdGggbm8gZnVydGhlciBkZXRhaWxzLiAqLworICAgIGlubGluZSBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgVGltZWRPdXQoKSB7CisgICAgICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMl9USU1FRF9PVVQpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBJbnRlcmZhY2UgY29ubmVjdGlvbiBpcyBjb3JydXB0ZWQsIHdpdGggbm8gZnVydGhlciBkZXRhaWxzLiAqLworICAgIGlubGluZSBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgQ29ycnVwdGVkKCkgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJfQ09SUlVQVEVEKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIE5vTWVtb3J5KEMyUGFyYW06OkluZGV4IGluZGV4XyBfX3VudXNlZCkgeworICAgICAgICAvLyBUT0RPOiB0cnkgdG8gYWRkIGZhaWx1cmUgcmVzdWx0CisgICAgICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMl9OT19NRU1PUlkpOworICAgIH0KKworICAgIC8vIFRPRE86IHRoaXMgc2hvdWxkIG5vdCBiZSBhIGNvbnN0cnVjdG9yCisgICAgLyoqIENyZWF0ZXMgYSBidWlsZGVyIHdpdGggYSBzaW5nbGUgYmFkIHZhbHVlIHNldHRpbmcgcmVzdWx0LiAqLworICAgIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyU2V0dGluZ1Jlc3VsdCAmJnJlc3VsdCk7CisKKyAgICAvKiogQ29tYmluZXMgdGhpcyByZXN1bHRzIHdpdGggb3RoZXIgcmVzdWx0cy4gKi8KKyAgICBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBwbHVzKEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyJiYgcmVzdWx0cyk7CisKKyAgICAvKiogUmV0cmlldmUgKGdldCBhbmQgbW92ZSBvdXQpIGZhaWx1cmVzIGFuZCByZXR1cm4gdGhlIGZhaWx1cmUgc3RhdHVzLiAqLworICAgIGMyX3N0YXR1c190IHJldHJpZXZlRmFpbHVyZXMoc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcyk7CisKK3ByaXZhdGU6CisgICAgLyoqIFNldHRpbmcgcmVzdWx0cyBiYXNlZCBvbiBhIHNpbmdsZSBzdGF0dXMuIFRoaXMgaXMgdXNlZCB3aGVuIGFjdHVhbCBzZXR0aW5nIGNvdWxkIG5vdCBiZQorICAgICAqICBhdHRlbXB0ZWQgdG8gZ2V0IGEgc2luZ2xlIEMyU2V0dGluZ1Jlc3VsdCwgb3Igd2hlbiBhIHNldHRpbmcgc3VjY2VlZGVkIHdpdGhvdXQKKyAgICAgKiAgJ2NvbXBsYWludHMnLiAqLworICAgIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKGMyX3N0YXR1c190IHN0YXR1cyk7CisgICAgICAgIC8vIHN0YXR1cyBtdXN0IGJlIG9uZSBvZiBPSywgQkFEX1NUQVRFLCBUSU1FRF9PVVQsIENPUlJVUFRFRCBvciBOT19NRU1PUlkKKyAgICAgICAgLy8gbWFpbmx5OiBCTE9DS0lORywgQkFEX0lOREVYLCBCQURfVkFMVUUgYW5kIE5PX01FTU9SWSByZXF1aXJlcyBhIHNldHRpbmcgYXR0ZW1wdCwgYnV0CisgICAgICAgIC8vIE5PX01FTU9SWSBtYXkgbm90IGFsbG93IHVzIHRvIGNyZWF0ZSBhIHJlc3VsdHMgc3RydWN0dXJlLgorCisgICAgLyoqCisgICAgICogT25lIG9mIE9LLCBCQURfSU5ERVgsIEJBRF9WQUxVRSwgQkFEX1NUQVRFLCBOT19NRU1PUlksIFRJTUVEX09VVCwgQkxPQ0tJTkcgb3IgQ09SUlVQVEVELgorICAgICAqLworICAgIGMyX3N0YXR1c190IF9tU3RhdHVzIF9fdW51c2VkOworCisgICAgLyoqCisgICAgICogVmVjdG9yIG9mIGluZGl2aWR1YWwgc2V0dGluZyByZXN1bHQgZGV0YWlscy4KKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gX21SZXN1bHRzOworfTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRvIGVudW1lcmF0ZSBmaWVsZHMgb2YgcGFyYW1ldGVycy4KKyAqLworc3RydWN0IEMyRmllbGRVdGlscyB7CisgICAgc3RydWN0IF9JbnNwZWN0b3I7CisKKyAgICAvKioKKyAgICAgKiBBbiBleHRlbmRlZCBmaWVsZCBkZXNjcmlwdG9yIG9iamVjdCB3aXRoIHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gKGxpbmVhZ2UgYmFjayB0byB0aGUgcm9vdCBvZgorICAgICAqIHRoZSBwYXJhbSkuCisgICAgICovCisgICAgc3RydWN0IEluZm8geworICAgICAgICB0eXBlZGVmIEMyRmllbGREZXNjcmlwdG9yOjp0eXBlX3QgdHlwZV90OyAvLy88IGZpZWxkIHR5cGUKKyAgICAgICAgdHlwZWRlZiBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIE5hbWVkVmFsdWVzVHlwZTsgLy8vPCBuYW1lZCB2YWx1ZXMgbGlzdCB0eXBlCisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCisgICAgICAgIEMyU3RyaW5nIG5hbWUoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkCisgICAgICAgIHR5cGVfdCB0eXBlKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGRlZmluZWQgbmFtZS12YWx1ZSBwYWlyaW5ncyBmb3IgdGhpcyBmaWVsZC4gVGhlIHJldHVybmVkIHJlZmVyZW5jZSBpcworICAgICAgICAgKiBvbmx5IHZhbGlkIGR1cmluZyB0aGUgdmFsaWRpdHkgb2YgdGhpcyBvYmplY3QKKyAgICAgICAgICovCisgICAgICAgIGNvbnN0IE5hbWVkVmFsdWVzVHlwZSAmbmFtZWRWYWx1ZXMoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGluZGV4IG9mIHRoaXMgZmllbGQuIEUuZy4gcGFyYW0uZmllbGQgb3IgcGFyYW0uZmllbGRbMF0gaGFzIGFuIGluZGV4IG9mIDAsIGFuZAorICAgICAgICAgKiBwYXJhbS5zdHJ1Y3RbMl0uZmllbGRbM10gaGFzIGFuIGluZGV4IG9mIDMuCisgICAgICAgICAqLworICAgICAgICBzaXplX3QgaW5kZXgoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBmaWVsZCBpbiBjYXNlIGl0IGlzIGFuIGFycmF5LiBSZXR1cm5zIDAgZm9yCisgICAgICAgIC8vLyBUW10gYXJyYXlzIGlmIHRoaXMgaW5mbyBjb21lcyBmcm9tIGEgQzJQYXJhbTo6SW5kZXggb2JqZWN0LCBhbmQgdGhlIGN1cnJlbnRseSB1c2VkCisgICAgICAgIC8vLyBleHRlbnQgaWYgaXQgY29tZXMgZnJvbSBhIEMyUGFyYW0gb2JqZWN0LiBSZXR1cm5zIDEgZm9yIFRbMV0gYXJyYXlzIGFzIHdlbGwgYXMgaWYgdGhlCisgICAgICAgIC8vLyBmaWVsZCBpcyBub3QgYW4gYXJyYXkuCisgICAgICAgIHNpemVfdCBleHRlbnQoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIChzdHJ1Y3R1cmFsKSBkZXB0aCBvZiB0aGlzIGZpZWxkLiBFLmcuIHBhcmFtLmZpZWxkIG9yIHBhcmFtLmZpZWxkWzBdIGhhcyBhIGRlcHRoIG9mCisgICAgICAgICAqICAwLCBhbmQgcGFyYW0uc3RydWN0LmZpZWxkIG9yIHBhcmFtLnN0cnVjdFswXS5maWVsZFswXSBoYXMgYSBkZXB0aCBvZiAxLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IGRlcHRoKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGlzIGZpZWxkIGluIHRoZSBwYXJhbWV0ZXIgaW4gYnl0ZXMuCisgICAgICAgICAqLworICAgICAgICBzaXplX3Qgb2Zmc2V0KCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhpcyBmaWVsZCBpbiBieXRlcy4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBzaXplKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvZmZzZXQgb2YgdGhpcyBmaWVsZCdzIGFycmF5LiBFLmcuIGZvciBwYXJhbS5zdHJ1Y3RbMl0uZmllbGRbM10gdGhpcyBpcyB0aGUgb2Zmc2V0CisgICAgICAgICAqIG9mIGl0cyBzbWFsbGVzdCBzaWJsaW5nOiBwYXJhbS5zdHJ1Y3RbMl0uZmllbGRbMF0uCisgICAgICAgICAqLworICAgICAgICBzaXplX3QgYXJyYXlPZmZzZXQoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGlzIGZpZWxkJ3MgYXJyYXkuIFRoaXMgaXMgZXF1aXZhbGVudCB0byBleHRlbnQoKSAqIHNpemUoKQorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IGFycmF5U2l6ZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb2Zmc2V0IG9mIHRoZSBiYXNlIGZpZWxkLiBUaGUgYmFzZSBmaWVsZCBpcyBhIGNvdXNpbiBvZiB0aGUgY3VycmVudCBmaWVsZCB3aGVyZQorICAgICAgICAgKiBhbGwgaW5kaWNlcyBhcmUgMC4gRS5nLiB0aGUgdGhlIGJhc2UgZmllbGQgZm9yIHBhcmFtLnN0cnVjdFsyXS5maWVsZFszXSBpcworICAgICAgICAgKiBwYXJhbS5zdHJ1Y3RbMF0uZmllbGRbMF0uIEJhc2UgZmllbGRzIGFyZSB1c2VkIHRvIHNwZWNpZnkgc3VwcG9ydGVkIHZhbHVlcyBmb3IKKyAgICAgICAgICogYWxsIGNvdXNpbiBmaWVsZHMuCisgICAgICAgICAqLworICAgICAgICBzaXplX3QgYmFzZUZpZWxkT2Zmc2V0KCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGZpZWxkIGlzIGFuIGFyaXRobWV0aWMgKGludGVncmFsLCBjb3VudGVyIG9yIGZsb2F0KSBmaWVsZC4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaXNBcml0aG1ldGljKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGZpZWxkIGNhbiBoYXZlIGEgZmxleGlibGUgZXh0ZW50LiBleHRlbnQoKSByZXR1cm5zIHRoZSBjdXJyZW50CisgICAgICAgICAqIGV4dGVudC4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaXNGbGV4aWJsZSgpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHdoZXRoZXIgdGhpcyBpbmZvIGlzIHZhbGlkCisgICAgICAgIGlubGluZSBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBfbUltcGwgIT0gbnVsbHB0cjsgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBpbmZvIGZvciB0aGUgcGFyZW50IG9mIHRoaXMgZmllbGQsIG9yIGFuIGludmFsaWQgSW5mbyBvYmplY3QgaWYgaXQgaGFzIG5vCisgICAgICAgIC8vLyBwYXJlbnRzCisgICAgICAgIEluZm8gcGFyZW50KCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgd2hldGhlciB0aGlzIGluZm8gaXMgdmFsaWQKKyAgICAgICAgaW5saW5lIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBpc1ZhbGlkKCk7IH0KKworICAgICAgICBzdHJ1Y3QgSW1wbDsKKyAgICAgICAgSW5mbyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4pOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IF9tSW1wbDsKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBfSW5zcGVjdG9yOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBbiAoaW5wdXQpIGl0ZXJhdG9yIG9iamVjdCBvdmVyIGZpZWxkcyB1c2luZyBJbmZvIG9iamVjdHMuCisgICAgICovCisgICAgc3RydWN0IEl0ZXJhdG9yIHsKKyAgICAgICAgdHlwZWRlZiBJbmZvIGNvbnN0IHZhbHVlX3R5cGU7CisgICAgICAgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgICAgdHlwZWRlZiBJbmZvIGNvbnN0ICogcG9pbnRlcjsKKyAgICAgICAgdHlwZWRlZiBJbmZvIGNvbnN0IHJlZmVyZW5jZTsKKyAgICAgICAgdHlwZWRlZiBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgICAvLy8gcmV0dXJuIEluZm8gYXQgY3VycmVudCBwb3NpdGlvbgorICAgICAgICB2aXJ0dWFsIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdDsKKworICAgICAgICAvLy8gbW92ZSB0byB0aGUgbmV4dCBmaWVsZAorICAgICAgICB2aXJ0dWFsIEl0ZXJhdG9yJiBvcGVyYXRvcisrKCk7CisKKyAgICAgICAgdmlydHVhbCBib29sIG9wZXJhdG9yPT0oY29uc3QgSXRlcmF0b3IgJikgY29uc3Q7CisgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgSXRlcmF0b3IgJm90aGVyKSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3I9PShvdGhlcik7IH0KKworICAgICAgICB2aXJ0dWFsIH5JdGVyYXRvcigpID0gZGVmYXVsdDsKKworICAgICAgICBzdHJ1Y3QgSW1wbDsKKyAgICAgICAgSXRlcmF0b3Ioc3RkOjpzaGFyZWRfcHRyPEltcGw+KTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBbiAoaW5wdXQpIGl0ZXJhYmxlIG9iamVjdCByZXByZXNlbnRpbmcgYSBsaXN0IG9mIGZpZWxkcy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgTGlzdCB7CisgICAgICAgIC8vLyByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QKKyAgICAgICAgdmlydHVhbCBJdGVyYXRvciBiZWdpbigpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKKyAgICAgICAgdmlydHVhbCBJdGVyYXRvciBlbmQoKSBjb25zdDsKKworICAgICAgICB2aXJ0dWFsIH5MaXN0KCkgPSBkZWZhdWx0OworCisgICAgICAgIHN0cnVjdCBJbXBsOworICAgICAgICBMaXN0KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPik7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlcyBhbGwgKGJhc2UpIGZpZWxkcyBhdCBpbmRleCAwIG9mIHRoZSBwYXJhbWV0ZXIuIFRoZSBvcmRlciBvZiBpdGVyYXRpb24gaXMgdGhlCisgICAgICogZm9sbG93aW5nOgorICAgICAqICAgRmllbGRzIG9mIGEgc3RydWN0dXJlIGFyZSBlbnVtZXJhdGVkIGluIGZpZWxkIG9yZGVyLiBIb3dldmVyLCBzdWItZmllbGRzIG9mIGEgc3RydWN0dXJlCisgICAgICogICBhcmUgZW51bWVyYXRlZCBkaXJlY3RseSBhZnRlciB0aGUgc3RydWN0dXJlIGZpZWxkLCBhbmQgcHJpb3IgdG8gc2libGluZyBmaWVsZHMuCisgICAgICoKKyAgICAgKiBJbiBlc3NlbmNlIHRoZSBvcmRlciBvZiBlbnVtZXJhdGlvbiBpcyBmaXJzdCBieSBpbmNyZWFzaW5nIG9mZnNldCwgdGhlbiBieSBkZWNyZWFzaW5nIHNpemUuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW0gcGFyYW1ldGVyIHRvIGVudW1lcmF0ZSBpdHMgZmllbGRzCisgICAgICogXHBhcmFtIHJlZmxlY3RvciBwYXJhbWV0ZXIgcmVmbGVjdG9yIHVzZWQgZm9yIGVudW1lcmF0aW9uCisgICAgICoKKyAgICAgKiBccmV0dXJuIGFuIGl0ZXJhYmxlIG9iamVjdAorICAgICAqLworICAgIHN0YXRpYyBMaXN0IGVudW1lcmF0ZUZpZWxkcygKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gJnBhcmFtLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpOworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlcyBhbGwgY291c2luIGZpZWxkcyB1cCB0byBkZXB0aCAtIGxldmVsIGZvciBhIGZpZWxkLiBJZiBsZXZlbCBpcyAwLCBpdCBlbnVtZXJhdGVzCisgICAgICogb25seSB0aGUgZmllbGQuIEZvciBsZXZlbCAxLCBpdCBlbnVtZXJhdGVzIGFsbCBmaWVsZHMgaW4gaXRzIGN1cnJlbnQgYXJyYXkgKHdoaWNoIG1heSBiZQorICAgICAqIGl0c2VsZiBpZiBleHRlbnQgaXMgMSkuIFRoZSBvcmRlciBvZiBpdGVyYXRpb24gaXMgYnkgaW5jcmVhc2luZyBmaWVsZCBvZmZzZXQuCisgICAgICovCisgICAgc3RhdGljIExpc3QgZW51bWVyYXRlQ291c2lucygKKyAgICAgICAgICAgIGNvbnN0IEluZm8gJmZpZWxkLAorICAgICAgICAgICAgdWludDMyX3QgbGV2ZWwgPSB+MCk7CisKKyAgICAvKioKKyAgICAgKiBMb2NhdGVzIHRoZSBmaWVsZCBpbiBhIHBhcmFtZXRlciBhbmQgcmV0dXJucyBhIGxpc3Qgb2YgMiBlbGVtZW50cyAtIHRoZSBtb3N0LXNwZWNpZmljIGZpZWxkCisgICAgICogYXJyYXkgb2YgdGhlIHBhcmFtZXRlciB0aGF0IGNvbnRhaW5zIHRoZSBlbnRpcmUgZmllbGQuIElmIHRoZSBmaWVsZCBpcyBub3QgYSB2YWxpZCBmaWVsZAorICAgICAqIHNwZWNpZmllciBmb3IgdGhpcyBwYXJhbWV0ZXIgKGUuZy4gaXQgaXMgb3V0c2lkZSB0aGUgYm91bmRzIG9mIHRoZSBwYXJhbWV0ZXIpLCBpdCByZXR1cm5zCisgICAgICogYW4gZW1wdHkgbGlzdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8SW5mbz4gbG9jYXRlRmllbGQoCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3Rvcik7CisKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8SW5mbz4gbG9jYXRlRmllbGQoCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtRmllbGQgJnBmLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3Rvcik7CisKK307CisKKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctaW50ZXJmYWNlLmg+CisKKyNlbmRpZiAgLy8gQzJVVElMU19JTlRFUkZBQ0VfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMlBhcmFtVXRpbHMuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMlBhcmFtVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTFiZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyUGFyYW1VdGlscy5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfUEFSQU1fVVRJTFNfSF8KKyNkZWZpbmUgQzJVVElMU19QQVJBTV9VVElMU19IXworCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8qKiBcZmlsZQorICogVXRpbGl0aWVzIGZvciBwYXJhbWV0ZXIgaGFuZGxpbmcgdG8gYmUgdXNlZCBieSBDb2RlYzIgaW1wbGVtZW50YXRpb25zLgorICovCisKKy8vLyBcY29uZCBJTlRFUk5BTAorCitzdHJ1Y3QgQzJQYXJhbTsKKworY2xhc3MgQzJQYXJhbVV0aWxzIHsKKyAgICBmcmllbmQgY2xhc3MgQzJVdGlsVGVzdF9QYXJhbVV0aWxzVGVzdF9UZXN0OworCitwdWJsaWM6CisKKyAgICAvLy8gc2FmZShyKSBwYXJzaW5nIGZyb20gcGFyYW1ldGVyIGJsb2IKKyAgICBzdGF0aWMKKyAgICBDMlBhcmFtICpQYXJzZUZpcnN0KGNvbnN0IHVpbnQ4X3QgKmJsb2IsIHNpemVfdCBzaXplKTsKK307CisKKy8vLyBcZW5kY29uZAorCisjZW5kaWYgIC8vIEMyVVRJTFNfUEFSQU1fVVRJTFNfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJCbG9ja0ludGVybmFsLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMkJsb2NrSW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWJmM2FjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJCbG9ja0ludGVybmFsLmgKQEAgLTAsMCArMSwzMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU1RBR0VGUklHSFRfQzJCTE9DS19JTlRFUk5BTF9IXworI2RlZmluZSBBTkRST0lEX1NUQUdFRlJJR0hUX0MyQkxPQ0tfSU5URVJOQUxfSF8KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworCitzdHJ1Y3QgQnVmZmVyUG9vbERhdGE7CisKK30KK30KK30KK30KKworLyoqCisgKiBTdG9yZXMgaW5mb3JtYXRpb25zIGZyb20gQzJCbG9ja1Bvb2wgaW1wbGVtZW50YXRpb25zIHdoaWNoIGFyZSByZXF1aXJlZCBieSBDMkJsb2NrLgorICovCitzdHJ1Y3QgQzJfSElERSBfQzJCbG9ja1Bvb2xEYXRhIHsKKyAgICBlbnVtIHR5cGVfdCA6IGludCB7CisgICAgICAgIFRZUEVfQlVGRkVSUE9PTCA9IDAsCisgICAgICAgIFRZUEVfQlVGRkVSUVVFVUUsCisgICAgfTsKKworICAgIHZpcnR1YWwgdHlwZV90IGdldFR5cGUoKSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICBfQzJCbG9ja1Bvb2xEYXRhKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB+X0MyQmxvY2tQb29sRGF0YSgpID0gZGVmYXVsdDsKK307CisKK3N0cnVjdCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTsKKworLyoqCisgKiBJbnRlcm5hbCBvbmx5IGludGVyZmFjZSBmb3IgY3JlYXRpbmcgYmxvY2tzIGJ5IGJsb2NrIHBvb2wvYnVmZmVyIHBhc3NpbmcgaW1wbGVtZW50YXRpb25zLgorICoKKyAqIFx0b2RvIHRoaXMgbXVzdCBiZSBoaWRkZW4KKyAqLworc3RydWN0IF9DMkJsb2NrRmFjdG9yeSB7CisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbGluZWFyIGJsb2NrIGZyb20gYW4gYWxsb2NhdGlvbiBmb3IgYW4gYWxsb3R0ZWQgcmFuZ2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gYWxsb2MgcGFyZW50IGFsbG9jYXRpb24KKyAgICAgKiBccGFyYW0gZGF0YSAgYmxvY2twb29sIGRhdGEKKyAgICAgKiBccGFyYW0gb2Zmc2V0IGFsbG90dGVkIHJhbmdlIG9mZnNldAorICAgICAqIFxwYXJhbSBzaXplICBhbGxvdHRlZCBzaXplCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBsaW5lYXIgYmxvY2suIG51bGxwdHIgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvCisgICAgICogICAgICAgICBjcmVhdGUgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gQ3JlYXRlTGluZWFyQmxvY2soCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gJmRhdGEgPSBudWxscHRyLAorICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IDAsCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IH4oc2l6ZV90KTApOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZ3JhcGhpYyBibG9jayBmcm9tIGFuIGFsbG9jYXRpb24gZm9yIGFuIGFsbG90dGVkIHNlY3Rpb24uCisgICAgICoKKyAgICAgKiBccGFyYW0gYWxsb2MgcGFyZW50IGFsbG9jYXRpb24KKyAgICAgKiBccGFyYW0gZGF0YSAgYmxvY2twb29sIGRhdGEKKyAgICAgKiBccGFyYW0gY3JvcCAgYWxsb3R0ZWQgY3JvcCByZWdpb24KKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGdyYXBoaWMgYmxvY2suIG51bGxwdHIgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvCisgICAgICogICAgICAgICBjcmVhdGUgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IENyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gJmRhdGEgPSBudWxscHRyLAorICAgICAgICAgICAgY29uc3QgQzJSZWN0ICZhbGxvdHRlZENyb3AgPSBDMlJlY3QofjB1LCB+MHUpKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGJsb2NrIHBvb2wgZGF0YSBmcm9tIDFEIGJsb2NrLgorICAgICAqCisgICAgICogXHBhcmFtIHNoYXJlZCBwb2ludGVyIHRvIHRoZSAxRCBibG9jayB3aGljaCBpcyBhbHJlYWR5IGNyZWF0ZWQuCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IEdldExpbmVhckJsb2NrUG9vbERhdGEoCisgICAgICAgICAgICBjb25zdCBDMkJsb2NrMUQmIGJsb2NrKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGJsb2NrIHBvb2wgZGF0YSBmcm9tIDJEIGJsb2NrLgorICAgICAqCisgICAgICogXHBhcmFtIHNoYXJlZCBwb2ludGVyIHRvIHRoZSAyRCBibG9jayB3aGljaCBpcyBhbHJlYWR5IGNyZWF0ZWQuCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IEdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKAorICAgICAgICAgICAgY29uc3QgQzJCbG9jazJEJiBibG9jayk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBsaW5lYXIgYmxvY2sgZnJvbSB0aGUgcmVjZWl2ZWQgbmF0aXZlIGhhbmRsZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBoYW5kbGUgICAgbmF0aXZlIGhhbmRsZSB0byBhIGxpbmVhciBibG9jaworICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgbGluZWFyIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IENyZWF0ZUxpbmVhckJsb2NrKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBncmFwaGljIGJsb2NrIGZyb20gdGhlIHJlY2VpdmVkIG5hdGl2ZSBoYW5kbGUuCisgICAgICoKKyAgICAgKiBccGFyYW0gaGFuZGxlICAgIG5hdGl2ZSBoYW5kbGUgdG8gYSBncmFwaGljIGJsb2NrCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBncmFwaGljIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGxpbmVhciBibG9jayBmcm9tIHRoZSByZWNlaXZlZCBidWZmZXJwb29sIGRhdGEuCisgICAgICoKKyAgICAgKiBccGFyYW0gZGF0YSAgYnVmZmVycG9vbCBkYXRhIHRvIGEgbGluZWFyIGJsb2NrCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBsaW5lYXIgYmxvY2suIG51bGxwdHIgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvCisgICAgICogICAgICAgICBjcmVhdGUgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gQ3JlYXRlTGluZWFyQmxvY2soCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE+ICZkYXRhKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGdyYXBoaWMgYmxvY2sgZnJvbSB0aGUgcmVjZWl2ZWQgYnVmZmVycG9vbCBkYXRhLgorICAgICAqCisgICAgICogXHBhcmFtIGRhdGEgIGJ1ZmZlcnBvb2wgZGF0YSB0byBhIGdyYXBoaWMgYmxvY2sKKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGdyYXBoaWMgYmxvY2suIG51bGxwdHIgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvCisgICAgICogICAgICAgICBjcmVhdGUgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IENyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YT4gJmRhdGEpOworCisgICAgLyoqCisgICAgICogR2V0IGJ1ZmZlcnBvb2wgZGF0YSBmcm9tIHRoZSBibG9ja3Bvb2wgZGF0YS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwb29sRGF0YSAgICAgICAgICBibG9ja3Bvb2wgZGF0YQorICAgICAqIFxwYXJhbSBidWZmZXJQb29sRGF0YSAgICBwb2ludGVyIHRvIGJ1ZmZlcnBvb2wgZGF0YSB3aGVyZSB0aGUgYnVmZmVycG9vbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIHN0b3JlZC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4ge1xjb2RlIHRydWV9IHdoZW4gdGhlcmUgaXMgdmFsaWQgYnVmZmVycG9vbCBkYXRhLCB7XGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBib29sIEdldEJ1ZmZlclBvb2xEYXRhKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IF9DMkJsb2NrUG9vbERhdGE+ICZwb29sRGF0YSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyUG9vbERhdGEpOworCisgICAgLyoKKyAgICAgKiBMaWZlIEN5Y2xlIE1hbmFnZW1lbnQgb2YgQnVmZmVyUXVldWUtQmFzZWQgQmxvY2tzCisgICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAqCisgICAgICogQSBibG9jayB0aGF0IGlzIGNyZWF0ZWQgYnkgYSBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3Bvb2wgcmVxdWlyZXMgc29tZQorICAgICAqIHNwZWNpYWwgdHJlYXRtZW50IHdoZW4gaXQgaXMgZGVzdHJveWVkLiBJbiBwYXJ0aWN1bGFyLCBpZiB0aGUgYmxvY2sKKyAgICAgKiBjb3JyZXNwb25kcyB0byBhIGhlbGQgKGRlcXVldWVkL2F0dGFjaGVkKSBHcmFwaGljQnVmZmVyIGluIGEgc2xvdCBvZiBhCisgICAgICogYnVmZmVycXVldWUsIGl0cyBkZXN0cnVjdGlvbiBzaG91bGQgdHJpZ2dlciBhIGNhbGwgdG8KKyAgICAgKiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpjYW5jZWxCdWZmZXIoKS4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZQorICAgICAqIEdyYXBoaWNCdWZmZXIgaXMgbm90IGhlbGQsIGkuZS4sIGlmIGl0IGhhcyBiZWVuIHF1ZXVlZCBvciBkZXRhY2hlZCwKKyAgICAgKiBjYW5jZWxCdWZmZXIoKSBzaG91bGQgbm90IGJlIGNhbGxlZCB1cG9uIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUgYmxvY2suCisgICAgICoKKyAgICAgKiBfQzJCbG9ja1Bvb2xEYXRhIGNyZWF0ZWQgYnkgYSBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3Bvb2wgaW5jbHVkZXMgdHdvCisgICAgICogbWFpbiBwaWVjZXMgb2YgaW5mb3JtYXRpb246CisgICAgICogICAtICJoZWxkIiBzdGF0dXM6IFdoZXRoZXIgY2FuY2VsQnVmZmVyKCkgc2hvdWxkIGJlIGNhbGxlZCB1cG9uCisgICAgICogICAgIGRlc3RydWN0aW9uIG9mIHRoZSBibG9jay4KKyAgICAgKiAgIC0gYnVmZmVycXVldWUgYXNzaWdubWVudDogVGhlIHF1YWRydXBsZSAoaWdicCwgZ2VuZXJhdGlvbiwgYnFJZCwKKyAgICAgKiAgICAgYnFTbG90KSwgd2hlcmUgaWdicCBpcyB0aGUgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBpbnN0YW5jZSBvZiB0aGUKKyAgICAgKiAgICAgYnVmZmVycXVldWUsIGdlbmVyYXRpb24gaXMgdGhlIGxhdGVzdCBnZW5lcmF0aW9uIG51bWJlciwgb2YgdGhlCisgICAgICogICAgIGJ1ZmZlcnF1ZXVlLCBicUlkIGlzIHRoZSBnbG9iYWxseSB1bmlxdWUgaWQgb2YgdGhlIGJ1ZmZlcnF1ZXVlLCBhbmQKKyAgICAgKiAgICAgYnFTbG90IGlzIHRoZSBzbG90IGluIHRoZSBidWZmZXJxdWV1ZS4KKyAgICAgKgorICAgICAqIGlnYnAgaXMgdGhlIGluc3RhbmNlIG9mIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgb24gd2hpY2ggY2FuY2VsQnVmZmVyKCkKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCBpZiAiaGVsZCIgc3RhdHVzIGlzIHRydWUgd2hlbiB0aGUgYmxvY2sgaXMgZGVzdHJveWVkLgorICAgICAqIChicVNsb3QgaXMgYW4gaW5wdXQgdG8gY2FuY2VsQnVmZmVyKCkuKSBIb3dldmVyLCBvbmx5IGdlbmVyYXRpb24sIGJxSWQKKyAgICAgKiBhbmQgYnFTbG90IGFyZSByZXRhaW5lZCB3aGVuIGEgYmxvY2sgaXMgdHJhbnNmZXJyZWQgZnJvbSBvbmUgcHJvY2VzcyB0bworICAgICAqIGFub3RoZXIuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBib3RoIHRoZSBzZW5kaW5nIGFuZCByZWNlaXZpbmcKKyAgICAgKiBwcm9jZXNzZXMgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kgb2YgImhlbGQiIHN0YXR1cyBhbmQgaWdicC4gQmVsb3cgYXJlCisgICAgICogZnVuY3Rpb25zIHByb3ZpZGVkIGZvciB0aGlzIHB1cnBvc2U6CisgICAgICoKKyAgICAgKiAgIC0gR2V0QnVmZmVyUXVldWVEYXRhKCk6IFJldHVybnMgZ2VuZXJhdGlvbiwgYnFJZCBhbmQgYnFTbG90LgorICAgICAqICAgLSBIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoKTogU2V0cyAiaGVsZCIgc3RhdHVzIHRvIHRydWUuCisgICAgICogICAtIFlpZWxkQmxvY2tUb0J1ZmZlclF1ZXVlKCk6IFNldHMgImhlbGQiIHN0YXR1cyB0byBmYWxzZS4KKyAgICAgKiAgIC0gQXNzaWduQmxvY2tUb0J1ZmZlclF1ZXVlKCk6IFNldHMgdGhlIGJ1ZmZlcnF1ZXVlIGFzc2lnbm1lbnQgYW5kCisgICAgICogICAgICJoZWxkIiBzdGF0dXMuCisgICAgICoKKyAgICAgKiBBbGwgdGhlc2UgZnVuY3Rpb25zIG9wZXJhdGUgb24gX0MyQmxvY2tQb29sRGF0YSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGJ5CisgICAgICogY2FsbGluZyBHZXRHcmFwaGljQmxvY2tQb29sRGF0YSgpLgorICAgICAqCisgICAgICogSG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKCkgd2lsbCBtYXJrIHRoZSBibG9jayBhcyBoZWxkLCB3aGlsZQorICAgICAqIFlpZWxkQmxvY2tUb0J1ZmZlclF1ZXVlKCkgd2lsbCBkbyB0aGUgb3Bwb3NpdGUuIFRoZXNlIHR3byBmdW5jdGlvbnMgZG8KKyAgICAgKiBub3QgbW9kaWZ5IHRoZSBidWZmZXJxdWV1ZSBhc3NpZ25tZW50LCBzbyBpdCBpcyBub3Qgd3JvbmcgdG8gY2FsbAorICAgICAqIEhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZSgpIGFmdGVyIFlpZWxkQmxvY2tUb0J1ZmZlclF1ZXVlKCkgaWYgaXQgY2FuIGJlCisgICAgICogZ3VhcmFudGVlZCB0aGF0IHRoZSBibG9jayBpcyBub3QgZGVzdHJveWVkIGR1cmluZyB0aGUgcGVyaW9kIGJldHdlZW4gdGhlCisgICAgICogdHdvIGNhbGxzLgorICAgICAqCisgICAgICogQXNzaW5nQmxvY2tUb0J1ZmZlclF1ZXVlKCkgaGFzIGEgImhlbGQiIHN0YXR1cyBhcyBhbiBvcHRpb25hbCBhcmd1bWVudC4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLgorICAgICAqCisgICAgICogTWFpbnRhaW5pbmcgQ29uc2lzdGVuY3kgd2l0aCBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIE9wZXJhdGlvbnMKKyAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAqCisgICAgICogZGVxdWV1ZUJ1ZmZlcigpCisgICAgICogICAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBibG9ja3Bvb2wuIEl0IHNob3VsZCBub3QgYmUgY2FsbGVkCisgICAgICogICAgIG1hbnVhbGx5LiBUaGUgYmxvY2twb29sIHdpbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZSB0aGUgY29ycmVjdAorICAgICAqICAgICBpbmZvcm1hdGlvbiBmb3IgX0MyQmxvY2tQb29sRGF0YSwgd2l0aCAiaGVsZCIgc3RhdHVzIHNldCB0byB0cnVlLgorICAgICAqCisgICAgICogcXVldWVCdWZmZXIoKQorICAgICAqICAgLSBBZnRlciBxdWV1ZUJ1ZmZlcigpIGlzIGNhbGxlZCwgWWllbGRCbG9ja1RvQnVmZmVyUXVldWUoKSBzaG91bGQgYmUKKyAgICAgKiAgICAgY2FsbGVkLgorICAgICAqCisgICAgICogYXR0YWNoQnVmZmVyKCkKKyAgICAgKiAgIC0gQWZ0ZXIgYXR0YWNoQnVmZmVyKCkgaXMgY2FsbGVkLCBBc3NpZ25CbG9ja1RvQnVmZmVyUXVldWUoKSBzaG91bGQgYmUKKyAgICAgKiAgICAgY2FsbGVkIHdpdGggImhlbGQiIHN0YXR1cyBzZXQgdG8gdHJ1ZS4KKyAgICAgKgorICAgICAqIGRldGFjaEJ1ZmZlcigpCisgICAgICogICAtIEFmdGVyIGRldGFjaEJ1ZmZlcigpIGlzIGNhbGxlZCwgSG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKCkgc2hvdWxkIGJlCisgICAgICogICAgIGNhbGxlZC4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEdldCBidWZmZXJxdWV1ZSBkYXRhIGZyb20gdGhlIGJsb2NrcG9vbCBkYXRhLgorICAgICAqCisgICAgICogQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpdGggXHAgZ2VuZXJhdGlvbiBzZXQgdG8gbnVsbHB0ciB3aWxsIHJldHVybgorICAgICAqIHdoZXRoZXIgdGhlIGJsb2NrIGNvbWVzIGZyb20gYSBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3Bvb2wsIGJ1dCB3aWxsIG5vdAorICAgICAqIGZpbGwgaW4gdGhlIHZhbHVlcyBmb3IgXHAgZ2VuZXJhdGlvbiwgXHAgYnFJZCBvciBccCBicVNsb3QuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dICBwb29sRGF0YSAgIGJsb2NrcG9vbCBkYXRhLgorICAgICAqIFxwYXJhbVtvdXRdIGdlbmVyYXRpb24gR2VuZXJhdGlvbiBudW1iZXIgYXR0YWNoZWQgdG8gdGhlIGJ1ZmZlci4KKyAgICAgKiBccGFyYW1bb3V0XSBicUlkICAgICAgIElkIG9mIHRoZSBidWZmZXJxdWV1ZSBvd25pbmcgdGhlIGJ1ZmZlciAoYmxvY2spLgorICAgICAqIFxwYXJhbVtvdXRdIGJxU2xvdCAgICAgU2xvdCBudW1iZXIgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gXGMgdHJ1ZSB3aGVuIHRoZXJlIGlzIHZhbGlkIGJ1ZmZlcnF1ZXVlIGRhdGE7CisgICAgICogICAgICAgICBcYyBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBHZXRCdWZmZXJRdWV1ZURhdGEoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIHBvb2xEYXRhLAorICAgICAgICAgICAgdWludDMyX3QqIGdlbmVyYXRpb24gPSBudWxscHRyLAorICAgICAgICAgICAgdWludDY0X3QqIGJxSWQgPSBudWxscHRyLAorICAgICAgICAgICAgaW50MzJfdCogYnFTbG90ID0gbnVsbHB0cik7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYnVmZmVycXVldWUgYXNzaWdubWVudCBhbmQgImhlbGQiIHN0YXR1cyB0byBhIGJsb2NrIGNyZWF0ZWQgYnkgYQorICAgICAqIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwb29sRGF0YSBibG9ja3Bvb2wgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBibG9jay4KKyAgICAgKiBccGFyYW0gaWdicCAgICAgICBcYyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGluc3RhbmNlIGZyb20gdGhlIGRlc2lnbmF0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICBidWZmZXJxdWV1ZS4KKyAgICAgKiBccGFyYW0gZ2VuZXJhdGlvbiBHZW5lcmF0aW9uIG51bWJlciB0aGF0IHRoZSBidWZmZXIgYmVsb25ncyB0by4KKyAgICAgKiBccGFyYW0gYnFJZCAgICAgICBJZCBvZiB0aGUgYnVmZmVycXVldWUgdGhhdCB3aWxsIG93biB0aGUgYnVmZmVyIChibG9jaykuCisgICAgICogXHBhcmFtIGJxU2xvdCAgICAgU2xvdCBudW1iZXIgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKiBccGFyYW0gaGVsZCAgICAgICBXaGV0aGVyIHRoZSBibG9jayBpcyBoZWxkLiBUaGlzICJoZWxkIiBzdGF0dXMgY2FuIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgY2hhbmdlZCBsYXRlciBieSBjYWxsaW5nIFlpZWxkQmxvY2tUb0J1ZmZlclF1ZXVlKCkgb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICBIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoKS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gXGMgdHJ1ZSBpZiBccCBwb29sRGF0YSBpcyB2YWxpZCBidWZmZXJxdWV1ZSBkYXRhOworICAgICAqICAgICAgICAgXGMgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogTm90ZTogXHAgZ2VuZXJhdGlvbiBzaG91bGQgbWF0Y2ggdGhlIGxhdGVzdCBnZW5lcmF0aW9uIG51bWJlciBzZXQgb24gdGhlCisgICAgICogYnVmZmVycXVldWUsIGFuZCBccCBicUlkIHNob3VsZCBtYXRjaCB0aGUgdW5pcXVlIGlkIGZvciB0aGUgYnVmZmVycXVldWUKKyAgICAgKiAob2J0YWluYWJsZSBieSBjYWxsaW5nIGlnYnAtPmdldFVuaXF1ZUlkKCkpLgorICAgICAqLworICAgIHN0YXRpYworICAgIGJvb2wgQXNzaWduQmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBwb29sRGF0YSwKKyAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgdWludDY0X3QgYnFJZCwKKyAgICAgICAgICAgIGludDMyX3QgYnFTbG90LAorICAgICAgICAgICAgYm9vbCBoZWxkID0gdHJ1ZSk7CisKKyAgICAvKioKKyAgICAgKiBIb2xkIGEgYmxvY2sgZnJvbSB0aGUgZGVzaWduYXRlZCBidWZmZXJxdWV1ZS4gVGhpcyBjYXVzZXMgdGhlIGRlc3RydWN0aW9uCisgICAgICogb2YgdGhlIGJsb2NrIHRvIHRyaWdnZXIgYSBjYWxsIHRvIGNhbmNlbEJ1ZmZlcigpLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgXHAgcG9vbERhdGEgY29tZXMgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkCisgICAgICogYmxvY2suIEl0IGRvZXMgbm90IGNoZWNrIGlmIHRoYXQgaXMgdGhlIGNhc2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbERhdGEgYmxvY2twb29sIGRhdGEgYXNzb2NpYXRlZCB0byB0aGUgYmxvY2suCisgICAgICogXHBhcmFtIGlnYnAgICAgIFxjIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgaW5zdGFuY2UgdG8gYmUgYXNzaWduZWQgdG8gdGhlCisgICAgICogICAgICAgICAgICAgICAgIGJsb2NrLiBUaGlzIGlzIG5vdCBuZWVkZWQgd2hlbiB0aGUgYmxvY2sgaXMgbG9jYWwuCisgICAgICoKKyAgICAgKiBccmV0dXJuIFRoZSBwcmV2aW91cyBoZWxkIHN0YXR1cy4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBib29sIEhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgcG9vbERhdGEsCisgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYxXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwID0gbnVsbHB0cik7CisKKyAgICAvKioKKyAgICAgKiBZaWVsZCBhIGJsb2NrIHRvIHRoZSBkZXNpZ25hdGVkIGJ1ZmZlcnF1ZXVlLiBUaGlzIGNhdXNlcyB0aGUgZGVzdHJ1Y3Rpb24KKyAgICAgKiBvZiB0aGUgYmxvY2sgbm90IHRvIHRyaWdnZXIgYSBjYWxsIHRvIGNhbmNlbEJ1ZmZlcigpOworICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgXHAgcG9vbERhdGEgY29tZXMgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkCisgICAgICogYmxvY2suIEl0IGRvZXMgbm90IGNoZWNrIGlmIHRoYXQgaXMgdGhlIGNhc2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbERhdGEgYmxvY2twb29sIGRhdGEgYXNzb2NpYXRlZCB0byB0aGUgYmxvY2suCisgICAgICoKKyAgICAgKiBccmV0dXJuIFRoZSBwcmV2aW91cyBoZWxkIHN0YXR1cy4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBib29sIFlpZWxkQmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBwb29sRGF0YSk7CisKK307CisKKyNlbmRpZiAvLyBBTkRST0lEX1NUQUdFRlJJR0hUX0MyQkxPQ0tfSU5URVJOQUxfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJQYXJhbUludGVybmFsLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMlBhcmFtSW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGE4ZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJQYXJhbUludGVybmFsLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU1RBR0VGUklHSFRfQzJQQVJBTV9JTlRFUk5BTF9IXworI2RlZmluZSBBTkRST0lEX1NUQUdFRlJJR0hUX0MyUEFSQU1fSU5URVJOQUxfSF8KKworI2luY2x1ZGUgPEMyUGFyYW0uaD4KKworc3RydWN0IEMyX0hJREUgX0MyUGFyYW1JbnNwZWN0b3IgeworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0T2Zmc2V0KGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCkgeworICAgICAgICByZXR1cm4gZmQuX21GaWVsZElkLl9tT2Zmc2V0OworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdm9pZCBTZXRPZmZzZXQoQzJGaWVsZERlc2NyaXB0b3IgJmZkLCB1aW50MzJfdCBvZmZzZXQpIHsKKyAgICAgICAgZmQuX21GaWVsZElkLl9tT2Zmc2V0ID0gb2Zmc2V0OworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0RW5kT2Zmc2V0KGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCwgdWludDMyX3QgcGFyYW1TaXplID0gMCkgeworICAgICAgICB1aW50MzJfdCBlbmRPZmZzZXQgPSBmZC5fbUZpZWxkSWQuX21PZmZzZXQgKyBmZC5fbUV4dGVudCAqIGZkLl9tRmllbGRJZC5fbVNpemU7CisgICAgICAgIC8vLyBmb3IgZmxleCBwYXJhbWV0ZXJzIHJldHVybiBwYXJhbVNpemUgaWYgZ2l2ZW4KKyAgICAgICAgcmV0dXJuIGZkLl9tRXh0ZW50ID8gZW5kT2Zmc2V0IDogc3RkOjptYXgoZW5kT2Zmc2V0LCBwYXJhbVNpemUpOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0U2l6ZShjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQpIHsKKyAgICAgICAgcmV0dXJuIGZkLl9tRmllbGRJZC5fbVNpemU7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRJbmRleChjb25zdCBDMlBhcmFtRmllbGQgJnBmKSB7CisgICAgICAgIHJldHVybiBwZi5fbUluZGV4OworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0T2Zmc2V0KGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYpIHsKKyAgICAgICAgcmV0dXJuIHBmLl9tRmllbGRJZC5fbU9mZnNldDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldFNpemUoY29uc3QgQzJQYXJhbUZpZWxkICZwZikgeworICAgICAgICByZXR1cm4gcGYuX21GaWVsZElkLl9tU2l6ZTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldE9mZnNldChjb25zdCBfQzJGaWVsZElkICZmKSB7CisgICAgICAgIHJldHVybiBmLl9tT2Zmc2V0OworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0U2l6ZShjb25zdCBfQzJGaWVsZElkICZmKSB7CisgICAgICAgIHJldHVybiBmLl9tU2l6ZTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIF9DMkZpZWxkSWQgR2V0RmllbGQoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkKSB7CisgICAgICAgIHJldHVybiBmZC5fbUZpZWxkSWQ7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRBdHRyaWIoY29uc3QgQzJQYXJhbURlc2NyaXB0b3IgJnBkKSB7CisgICAgICAgIHJldHVybiBwZC5fbUF0dHJpYjsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIF9DMkZpZWxkSWQgR2V0RmllbGQoY29uc3QgQzJQYXJhbUZpZWxkICZwZikgeworICAgICAgICByZXR1cm4gcGYuX21GaWVsZElkOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMKKyAgICBDMlBhcmFtRmllbGQgQ3JlYXRlUGFyYW1GaWVsZChDMlBhcmFtOjpJbmRleCBpbmRleCwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplKSB7CisgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGQoaW5kZXgsIG9mZnNldCwgc2l6ZSk7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYworICAgIEMyUGFyYW1GaWVsZCBDcmVhdGVQYXJhbUZpZWxkKEMyUGFyYW06OkluZGV4IGluZGV4LCBfQzJGaWVsZElkIGZpZWxkKSB7CisgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGQoaW5kZXgsIGZpZWxkLl9tT2Zmc2V0LCBmaWVsZC5fbVNpemUpOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMKKyAgICB2b2lkIFRyaW1QYXJhbShDMlBhcmFtICpwYXJhbSwgdWludDMyX3QgbmV3U2l6ZSkgeworICAgICAgICBpZiAocGFyYW0gJiYgKnBhcmFtICYmIHBhcmFtLT5zaXplKCkgPiBuZXdTaXplICYmIG5ld1NpemUgPj0gc2l6ZW9mKEMyUGFyYW0pKSB7CisgICAgICAgICAgICBwYXJhbS0+X21TaXplID0gbmV3U2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdm9pZCBBZGROYW1lZFZhbHVlcygKKyAgICAgICAgICAgIEMyRmllbGREZXNjcmlwdG9yICZmZCwgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSAmJm5hbWVkVmFsdWVzKSB7CisgICAgICAgIGZkLl9tTmFtZWRWYWx1ZXMgPSBzdGQ6Om1vdmUobmFtZWRWYWx1ZXMpOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMKKyAgICBDMlN0cnVjdERlc2NyaXB0b3IgQ3JlYXRlU3RydWN0RGVzY3JpcHRvcihDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+ICYmZmllbGRzKSB7CisgICAgICAgIHJldHVybiBDMlN0cnVjdERlc2NyaXB0b3IoaW5kZXgsIHN0ZDo6bW92ZShmaWVsZHMpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljCisgICAgQzJGaWVsZERlc2NyaXB0b3IgT2Zmc2V0RmllbGREZXNjcmlwdG9yKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCwgc2l6ZV90IG9mZnNldCkgeworICAgICAgICByZXR1cm4gQzJGaWVsZERlc2NyaXB0b3IoZmQsIG9mZnNldCk7CisgICAgfQorCisgICAgLy8gZXhwb3NlIGF0dHJpYnV0ZXMKKyAgICB0eXBlZGVmIEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCBhdHRyaWJfdDsKK307CisKKyNlbmRpZiAvLyBBTkRST0lEX1NUQUdFRlJJR0hUX0MyUEFSQU1fSU5URVJOQUxfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9wbGF0Zm9ybS9DMkJxQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWE1YjNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAKQEAgLTAsMCArMSw0OTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyQnFCdWZmZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxndWkvQnVmZmVyUXVldWVEZWZzLmg+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJxQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgorCit1c2luZyA6OmFuZHJvaWQ6OkFud0J1ZmZlcjsKK3VzaW5nIDo6YW5kcm9pZDo6QnVmZmVyUXVldWVEZWZzOjpOVU1fQlVGRkVSX1NMT1RTOwordXNpbmcgOjphbmRyb2lkOjpDMkFsbG9jYXRvckdyYWxsb2M7Cit1c2luZyA6OmFuZHJvaWQ6OkMyQW5kcm9pZE1lbW9yeVVzYWdlOwordXNpbmcgOjphbmRyb2lkOjpGZW5jZTsKK3VzaW5nIDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlcjsKK3VzaW5nIDo6YW5kcm9pZDo6SEdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGlkbF9oYW5kbGU7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjpzdGF0dXNfdDsKK3VzaW5nIDo6YW5kcm9pZDo6d3A7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0OworCitzdHJ1Y3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEgOiBwdWJsaWMgX0MyQmxvY2tQb29sRGF0YSB7CisKKyAgICBib29sIGhlbGQ7CisgICAgYm9vbCBsb2NhbDsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgIHVpbnQ2NF90IGJxSWQ7CisgICAgaW50MzJfdCBicVNsb3Q7CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaWdicDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6SW1wbD4gbG9jYWxQb29sOworCisgICAgdmlydHVhbCB0eXBlX3QgZ2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIFRZUEVfQlVGRkVSUVVFVUU7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgcmVtb3RlIEJsb2NrUG9vbERhdGEuCisgICAgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoCisgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBicUlkLCBpbnQzMl90IGJxU2xvdCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciA9IG51bGxwdHIpOworCisgICAgLy8gQ3JlYXRlIGEgbG9jYWwgQmxvY2tQb29sRGF0YS4KKyAgICBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKKyAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGJxSWQsIGludDMyX3QgYnFTbG90LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OkltcGw+JiBwb29sKTsKKworICAgIHZpcnR1YWwgfkMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKCkgb3ZlcnJpZGU7CisKK307CisKK2Jvb2wgX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJRdWV1ZURhdGEoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgZGF0YSwKKyAgICAgICAgdWludDMyX3QqIGdlbmVyYXRpb24sIHVpbnQ2NF90KiBicUlkLCBpbnQzMl90KiBicVNsb3QpIHsKKyAgICBpZiAoZGF0YSAmJiBkYXRhLT5nZXRUeXBlKCkgPT0gX0MyQmxvY2tQb29sRGF0YTo6VFlQRV9CVUZGRVJRVUVVRSkgeworICAgICAgICBpZiAoZ2VuZXJhdGlvbikgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oZGF0YSk7CisgICAgICAgICAgICAqZ2VuZXJhdGlvbiA9IHBvb2xEYXRhLT5nZW5lcmF0aW9uOworICAgICAgICAgICAgaWYgKGJxSWQpIHsKKyAgICAgICAgICAgICAgICAqYnFJZCA9IHBvb2xEYXRhLT5icUlkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJxU2xvdCkgeworICAgICAgICAgICAgICAgICpicVNsb3QgPSBwb29sRGF0YS0+YnFTbG90OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgX0MyQmxvY2tGYWN0b3J5OjpBc3NpZ25CbG9ja1RvQnVmZmVyUXVldWUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgZGF0YSwKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgIHVpbnQ2NF90IGJxSWQsCisgICAgICAgIGludDMyX3QgYnFTbG90LAorICAgICAgICBib29sIGhlbGQpIHsKKyAgICBpZiAoZGF0YSAmJiBkYXRhLT5nZXRUeXBlKCkgPT0gX0MyQmxvY2tQb29sRGF0YTo6VFlQRV9CVUZGRVJRVUVVRSkgeworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KGRhdGEpOworICAgICAgICBwb29sRGF0YS0+aWdicCA9IGlnYnA7CisgICAgICAgIHBvb2xEYXRhLT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKyAgICAgICAgcG9vbERhdGEtPmJxSWQgPSBicUlkOworICAgICAgICBwb29sRGF0YS0+YnFTbG90ID0gYnFTbG90OworICAgICAgICBwb29sRGF0YS0+aGVsZCA9IGhlbGQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgX0MyQmxvY2tGYWN0b3J5OjpIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgZGF0YSwKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnApIHsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oZGF0YSk7CisgICAgaWYgKCFwb29sRGF0YS0+bG9jYWwpIHsKKyAgICAgICAgcG9vbERhdGEtPmlnYnAgPSBpZ2JwOworICAgIH0KKyAgICBpZiAocG9vbERhdGEtPmhlbGQpIHsKKyAgICAgICAgcG9vbERhdGEtPmhlbGQgPSB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHBvb2xEYXRhLT5oZWxkID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OllpZWxkQmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIGRhdGEpIHsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oZGF0YSk7CisgICAgaWYgKCFwb29sRGF0YS0+aGVsZCkgeworICAgICAgICBwb29sRGF0YS0+aGVsZCA9IGZhbHNlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHBvb2xEYXRhLT5oZWxkID0gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUpIHsKKyAgICAvLyBUT0RPOiBnZXQgcHJvcGVyIGFsbG9jYXRvcj8gYW5kIG11dGV4PworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJBbGxvY2F0b3JHcmFsbG9jPiBzQWxsb2NhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxDMkFsbG9jYXRvckdyYWxsb2M+KDApOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOworICAgIGlmIChDMkFsbG9jYXRvckdyYWxsb2M6OmlzVmFsaWQoaGFuZGxlKSkgeworICAgICAgICB1aW50MzJfdCB3aWR0aDsKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0OworICAgICAgICB1aW50MzJfdCBmb3JtYXQ7CisgICAgICAgIHVpbnQ2NF90IHVzYWdlOworICAgICAgICB1aW50MzJfdCBzdHJpZGU7CisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgIHVpbnQ2NF90IGJxSWQ7CisgICAgICAgIHVpbnQzMl90IGJxU2xvdDsKKyAgICAgICAgYW5kcm9pZDo6X1Vud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NNZXRhZGF0YSgKKyAgICAgICAgICAgICAgICBoYW5kbGUsICZ3aWR0aCwgJmhlaWdodCwgJmZvcm1hdCwgJnVzYWdlLCAmc3RyaWRlLCAmZ2VuZXJhdGlvbiwgJmJxSWQsICZicVNsb3QpOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBzQWxsb2NhdG9yLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKyAgICAgICAgICAgIGlmIChicUlkIHx8IGJxU2xvdCkgeworICAgICAgICAgICAgICAgIC8vIEJRQkJQCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWJxU2xvdCk7CisgICAgICAgICAgICAgICAgYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYywgcG9vbERhdGEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBibG9jazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworY2xhc3MgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6SW1wbAorICAgICAgICA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OkltcGw+IHsKK3ByaXZhdGU6CisgICAgYzJfc3RhdHVzX3QgZmV0Y2hGcm9tSWdicF9sKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgICAgICAvLyBXZSBoYXZlIGFuIElHQlAgbm93LgorICAgICAgICBzcDxGZW5jZT4gZmVuY2UgPSBuZXcgRmVuY2UoKTsKKyAgICAgICAgQzJBbmRyb2lkTWVtb3J5VXNhZ2UgYW5kcm9pZFVzYWdlID0gdXNhZ2U7CisgICAgICAgIHN0YXR1c190IHN0YXR1czsKKyAgICAgICAgUGl4ZWxGb3JtYXQgcGl4ZWxGb3JtYXQgPSBzdGF0aWNfY2FzdDxQaXhlbEZvcm1hdD4oZm9ybWF0KTsKKyAgICAgICAgaW50IHNsb3Q7CisgICAgICAgIEFMT0dWKCJ0cmllcyB0byBkZXF1ZXVlIGJ1ZmZlciIpOworICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtUHJvZHVjZXItPmRlcXVldWVCdWZmZXIoCisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcGl4ZWxGb3JtYXQsIGFuZHJvaWRVc2FnZS5hc0dyYWxsb2NVc2FnZSgpLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnNsb3QsICZmZW5jZV0oCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRTdGF0dXMsIGludDMyX3QgdFNsb3QsIGhpZGxfaGFuZGxlIGNvbnN0JiB0RmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiB0VHMpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgc2xvdCA9IHRTbG90OworICAgICAgICAgICAgICAgICAgICBpZiAoIWFuZHJvaWQ6OmNvbnZlcnNpb246OmNvbnZlcnRUbyhmZW5jZS5nZXQoKSwgdEZlbmNlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9PSBhbmRyb2lkOjpOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICh2b2lkKSB0VHM7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIC8vIGRlcXVldWVCdWZmZXIgcmV0dXJucyBmbGFnLgorICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSB8fCBzdGF0dXMgPCBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgQUxPR0QoImNhbm5vdCBkZXF1ZXVlIGJ1ZmZlciAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICBpZiAodHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBhbmRyb2lkOjpJTlZBTElEX09QRVJBVElPTiB8fAorICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gYW5kcm9pZDo6VElNRURfT1VUIHx8CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9PSBhbmRyb2lkOjpXT1VMRF9CTE9DSykgeworICAgICAgICAgICAgICAgICAgICAvLyBEZXF1ZXVlIGJ1ZmZlciBpcyBibG9ja2VkIHRlbXBvcmFyaWx5LiBSZXRyeWluZyBpcworICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlZC4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JMT0NLSU5HOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImRlcXVldWVkIGEgYnVmZmVyIHN1Y2Nlc3NmdWxseSIpOworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIG5oID0gbnVsbHB0cjsKKyAgICAgICAgaGlkbF9oYW5kbGUgZmVuY2VIYW5kbGU7CisgICAgICAgIGlmIChmZW5jZSkgeworICAgICAgICAgICAgYW5kcm9pZDo6Y29udmVyc2lvbjo6d3JhcEFzKCZmZW5jZUhhbmRsZSwgJm5oLCAqZmVuY2UpOworICAgICAgICB9CisgICAgICAgIGlmIChmZW5jZSkgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0ZlbmNlV2FpdFRpbWVNcyA9IDEwOworCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmZW5jZS0+d2FpdChrRmVuY2VXYWl0VGltZU1zKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gLUVUSU1FKSB7CisgICAgICAgICAgICAgICAgLy8gZmVuY2UgaXMgbm90IHNpZ25hbGxlZCB5ZXQuCisgICAgICAgICAgICAgICAgKHZvaWQpbVByb2R1Y2VyLT5jYW5jZWxCdWZmZXIoc2xvdCwgZmVuY2VIYW5kbGUpLmlzT2soKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IGFuZHJvaWQ6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImJ1ZmZlciBmZW5jZSB3YWl0IGVycm9yICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAodm9pZCltUHJvZHVjZXItPmNhbmNlbEJ1ZmZlcihzbG90LCBmZW5jZUhhbmRsZSkuaXNPaygpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1SZW5kZXJDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIG5zZWNzX3Qgc2lnbmFsVGltZSA9IGZlbmNlLT5nZXRTaWduYWxUaW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKHNpZ25hbFRpbWUgPj0gMCAmJiBzaWduYWxUaW1lIDwgSU5UNjRfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZW5kZXJDYWxsYmFjayhtUHJvZHVjZXJJZCwgc2xvdCwgc2lnbmFsVGltZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImdvdCBmZW5jZSBzaWduYWwgdGltZSBvZiAlbGxkIiwgKGxvbmcgbG9uZylzaWduYWxUaW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiAmc2xvdEJ1ZmZlciA9IG1CdWZmZXJzW3Nsb3RdOworICAgICAgICBpZiAoc3RhdHVzICYgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6QlVGRkVSX05FRURTX1JFQUxMT0NBVElPTiB8fCAhc2xvdEJ1ZmZlcikgeworICAgICAgICAgICAgaWYgKCFzbG90QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlciA9IG5ldyBHcmFwaGljQnVmZmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBOLkIuIFRoaXMgYXNzdW1lcyByZXF1ZXN0QnVmZmVyIyByZXR1cm5zIGFuIGV4aXN0aW5nIGFsbG9jYXRpb24KKyAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgYSBuZXcgYWxsb2NhdGlvbi4KKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1Qcm9kdWNlci0+cmVxdWVzdEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZzbG90QnVmZmVyXShpbnQzMl90IHRTdGF0dXMsIEFud0J1ZmZlciBjb25zdCYgdEJ1ZmZlcil7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0U3RhdHVzOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbmRyb2lkOjpjb252ZXJzaW9uOjpjb252ZXJ0VG8oc2xvdEJ1ZmZlci5nZXQoKSwgdEJ1ZmZlcikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID09IGFuZHJvaWQ6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT0gYW5kcm9pZDo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzbG90QnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgKHZvaWQpbVByb2R1Y2VyLT5jYW5jZWxCdWZmZXIoc2xvdCwgZmVuY2VIYW5kbGUpLmlzT2soKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzbG90QnVmZmVyKSB7CisgICAgICAgICAgICBBTE9HVigiYnVmZmVyIHdyYXBzICVsbHUgJWQiLCAodW5zaWduZWQgbG9uZyBsb25nKW1Qcm9kdWNlcklkLCBzbG90KTsKKyAgICAgICAgICAgIEMySGFuZGxlICpjMkhhbmRsZSA9IGFuZHJvaWQ6OldyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKAorICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT5oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPndpZHRoLAorICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+dXNhZ2UsCisgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+Z2V0R2VuZXJhdGlvbk51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICBtUHJvZHVjZXJJZCwgc2xvdCk7CisgICAgICAgICAgICBpZiAoYzJIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihjMkhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPmdldEdlbmVyYXRpb25OdW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByb2R1Y2VySWQsIHNsb3QsIHNoYXJlZF9mcm9tX3RoaXMoKSk7CisgICAgICAgICAgICAgICAgKmJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MsIHBvb2xEYXRhKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBCbG9jayB3YXMgbm90IGNyZWF0ZWQuIGNhbGwgcmVxdWVzdEJ1ZmZlciMgYWdhaW4gbmV4dCB0aW1lLgorICAgICAgICAgICAgc2xvdEJ1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgKHZvaWQpbVByb2R1Y2VyLT5jYW5jZWxCdWZmZXIoc2xvdCwgZmVuY2VIYW5kbGUpLmlzT2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworcHVibGljOgorICAgIEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgICAgICA6IG1Jbml0KEMyX09LKSwgbVByb2R1Y2VySWQoMCksIG1BbGxvY2F0b3IoYWxsb2NhdG9yKSB7CisgICAgfQorCisgICAgfkltcGwoKSB7CisgICAgICAgIGJvb2wgbm9Jbml0ID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0JVRkZFUl9TTE9UUzsgKytpKSB7CisgICAgICAgICAgICBpZiAoIW5vSW5pdCAmJiBtUHJvZHVjZXIpIHsKKyAgICAgICAgICAgICAgICBSZXR1cm48aW50MzJfdD4gdHJhbnNSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgbVByb2R1Y2VyLT5kZXRhY2hCdWZmZXIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oaSkpOworICAgICAgICAgICAgICAgIG5vSW5pdCA9ICF0cmFuc1Jlc3VsdC5pc09rKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0cmFuc1Jlc3VsdCkgPT0gYW5kcm9pZDo6Tk9fSU5JVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgYmxvY2stPnJlc2V0KCk7CisgICAgICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIG1Jbml0OworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGludCBrTWF4SWdicFJldHJ5ID0gMjA7IC8vIFRPRE86IHNtYWxsIG51bWJlciBjYW4gY2F1c2UgY3Jhc2ggaW4gcmVsZWFzaW5nLgorICAgICAgICBzdGF0aWMgaW50IGtNYXhJZ2JwUmV0cnlEZWxheVVzID0gMTAwMDA7CisKKyAgICAgICAgaW50IGN1clRyeSA9IDA7CisKKyAgICAgICAgd2hpbGUgKGN1clRyeSsrIDwga01heElnYnBSZXRyeSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgICAgICAvLyBUT0RPOiByZXR1cm4gQzJfTk9fSU5JVAorICAgICAgICAgICAgaWYgKG1Qcm9kdWNlcklkID09IDApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+bmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmYWxsb2MpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgKHVpbnQ2NF90KTAsIH4wLCBzaGFyZWRfZnJvbV90aGlzKCkpOworICAgICAgICAgICAgICAgIC8vIFRPRE86IGNvbmZpZz8KKyAgICAgICAgICAgICAgICAqYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYywgcG9vbERhdGEpOworICAgICAgICAgICAgICAgIEFMT0dWKCJhbGxvY2F0ZWQgYSBidWZmZXIgc3VjY2Vzc2Z1bGx5Iik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBmZXRjaEZyb21JZ2JwX2wod2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgYmxvY2spOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9CTE9DS0lORykgeworICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgOjp1c2xlZXAoa01heElnYnBSZXRyeURlbGF5VXMpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CisgICAgfQorCisgICAgdm9pZCBzZXRSZW5kZXJDYWxsYmFjayhjb25zdCBPblJlbmRlckNhbGxiYWNrICZyZW5kZXJDYWxsYmFjaykgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBtUmVuZGVyQ2FsbGJhY2sgPSByZW5kZXJDYWxsYmFjazsKKyAgICB9CisKKyAgICB2b2lkIGNvbmZpZ3VyZVByb2R1Y2VyKGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZwcm9kdWNlcikgeworICAgICAgICBpbnQzMl90IHN0YXR1cyA9IGFuZHJvaWQ6Ok9LOworICAgICAgICB1aW50NjRfdCBwcm9kdWNlcklkID0gMDsKKyAgICAgICAgaWYgKHByb2R1Y2VyKSB7CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBwcm9kdWNlci0+Z2V0VW5pcXVlSWQoCisgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmcHJvZHVjZXJJZF0oaW50MzJfdCB0U3RhdHVzLCBpbnQ2NF90IHRQcm9kdWNlcklkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0U3RhdHVzOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjZXJJZCA9IHRQcm9kdWNlcklkOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImNvbmZpZ3VyZVByb2R1Y2VyIC0tIGZhaWxlZCB0byBjb25uZWN0IHRvIHRoZSBwcm9kdWNlciIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICAgICAgYm9vbCBub0luaXQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0JVRkZFUl9TTE9UUzsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFub0luaXQgJiYgbVByb2R1Y2VyKSB7CisgICAgICAgICAgICAgICAgICAgIFJldHVybjxpbnQzMl90PiB0cmFuc1Jlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByb2R1Y2VyLT5kZXRhY2hCdWZmZXIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oaSkpOworICAgICAgICAgICAgICAgICAgICBub0luaXQgPSAhdHJhbnNSZXN1bHQuaXNPaygpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHRyYW5zUmVzdWx0KSA9PSBhbmRyb2lkOjpOT19JTklUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHByb2R1Y2VyICYmIHN0YXR1cyA9PSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgICAgIG1Qcm9kdWNlciA9IHByb2R1Y2VyOworICAgICAgICAgICAgICAgIG1Qcm9kdWNlcklkID0gcHJvZHVjZXJJZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVByb2R1Y2VyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBtUHJvZHVjZXJJZCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTsKKworICAgIHZvaWQgY2FuY2VsKHVpbnQ2NF90IGlnYnBfaWQsIGludDMyX3QgaWdicF9zbG90KSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIGlmIChpZ2JwX2lkID09IG1Qcm9kdWNlcklkICYmIG1Qcm9kdWNlcikgeworICAgICAgICAgICAgKHZvaWQpbVByb2R1Y2VyLT5jYW5jZWxCdWZmZXIoaWdicF9zbG90LCBudWxscHRyKS5pc09rKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICB1aW50NjRfdCBtUHJvZHVjZXJJZDsKKyAgICBPblJlbmRlckNhbGxiYWNrIG1SZW5kZXJDYWxsYmFjazsKKworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKworICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1Qcm9kdWNlcjsKKworICAgIHNwPEdyYXBoaWNCdWZmZXI+IG1CdWZmZXJzW05VTV9CVUZGRVJfU0xPVFNdOworfTsKKworQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE6OkMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKAorICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBicUlkLCBpbnQzMl90IGJxU2xvdCwKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyKSA6CisgICAgICAgIGhlbGQocHJvZHVjZXIgJiYgYnFJZCAhPSAwKSwgbG9jYWwoZmFsc2UpLAorICAgICAgICBnZW5lcmF0aW9uKGdlbmVyYXRpb24pLCBicUlkKGJxSWQpLCBicVNsb3QoYnFTbG90KSwKKyAgICAgICAgaWdicChwcm9kdWNlciksCisgICAgICAgIGxvY2FsUG9vbCgpIHsKK30KKworQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE6OkMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKAorICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBicUlkLCBpbnQzMl90IGJxU2xvdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OkltcGw+JiBwb29sKSA6CisgICAgICAgIGhlbGQodHJ1ZSksIGxvY2FsKHRydWUpLAorICAgICAgICBnZW5lcmF0aW9uKGdlbmVyYXRpb24pLCBicUlkKGJxSWQpLCBicVNsb3QoYnFTbG90KSwKKyAgICAgICAgaWdicChwb29sID8gcG9vbC0+bVByb2R1Y2VyIDogbnVsbHB0ciksCisgICAgICAgIGxvY2FsUG9vbChwb29sKSB7Cit9CisKK0MyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjp+QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoKSB7CisgICAgaWYgKCFoZWxkIHx8IGJxSWQgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChsb2NhbCAmJiBsb2NhbFBvb2wpIHsKKyAgICAgICAgbG9jYWxQb29sLT5jYW5jZWwoYnFJZCwgYnFTbG90KTsKKyAgICB9IGVsc2UgaWYgKGlnYnApIHsKKyAgICAgICAgaWdicC0+Y2FuY2VsQnVmZmVyKGJxU2xvdCwgbnVsbHB0cik7CisgICAgfQorfQorCitDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IsIGNvbnN0IGxvY2FsX2lkX3QgbG9jYWxJZCkKKyAgICAgICAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvciksIG1Mb2NhbElkKGxvY2FsSWQpLCBtSW1wbChuZXcgSW1wbChhbGxvY2F0b3IpKSB7fQorCitDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjp+QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbCgpIHt9CisKK2MyX3N0YXR1c190IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mZXRjaEdyYXBoaWNCbG9jayh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCBibG9jayk7CisgICAgfQorICAgIHJldHVybiBDMl9DT1JSVVBURUQ7Cit9CisKK3ZvaWQgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6Y29uZmlndXJlUHJvZHVjZXIoY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJnByb2R1Y2VyKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5jb25maWd1cmVQcm9kdWNlcihwcm9kdWNlcik7CisgICAgfQorfQorCit2b2lkIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OnNldFJlbmRlckNhbGxiYWNrKGNvbnN0IE9uUmVuZGVyQ2FsbGJhY2sgJnJlbmRlckNhbGxiYWNrKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5zZXRSZW5kZXJDYWxsYmFjayhyZW5kZXJDYWxsYmFjayk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkRlYnVnLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJEZWJ1Zy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhYTcxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJEZWJ1Zy5jcHAKQEAgLTAsMCArMSwyNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8QzJQYXJhbUludGVybmFsLmg+CisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1wYXJhbS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VVdGlscy5oPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYXNTdHJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworY29uc3QgY2hhciAqYXNTdHJpbmcoYzJfc3RhdHVzX3QgaSwgY29uc3QgY2hhciAqZGVmKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgQzJfT0s6ICAgICAgICByZXR1cm4gIk9LIjsKKyAgICAgICAgY2FzZSBDMl9CQURfVkFMVUU6IHJldHVybiAiQkFEX1ZBTFVFIjsKKyAgICAgICAgY2FzZSBDMl9CQURfSU5ERVg6IHJldHVybiAiQkFEX0lOREVYIjsKKyAgICAgICAgY2FzZSBDMl9DQU5OT1RfRE86IHJldHVybiAiQ0FOTk9UX0RPIjsKKyAgICAgICAgY2FzZSBDMl9EVVBMSUNBVEU6IHJldHVybiAiRFVQTElDQVRFIjsKKyAgICAgICAgY2FzZSBDMl9OT1RfRk9VTkQ6IHJldHVybiAiTk9UX0ZPVU5EIjsKKyAgICAgICAgY2FzZSBDMl9CQURfU1RBVEU6IHJldHVybiAiQkFEX1NUQVRFIjsKKyAgICAgICAgY2FzZSBDMl9CTE9DS0lORzogIHJldHVybiAiQkxPQ0tJTkciOworICAgICAgICBjYXNlIEMyX0NBTkNFTEVEOiAgcmV0dXJuICJDQU5DRUxFRCI7CisgICAgICAgIGNhc2UgQzJfTk9fTUVNT1JZOiByZXR1cm4gIk5PX01FTU9SWSI7CisgICAgICAgIGNhc2UgQzJfUkVGVVNFRDogICByZXR1cm4gIlJFRlVTRUQiOworICAgICAgICBjYXNlIEMyX1RJTUVEX09VVDogcmV0dXJuICJUSU1FRF9PVVQiOworICAgICAgICBjYXNlIEMyX09NSVRURUQ6ICAgcmV0dXJuICJPTUlUVEVEIjsKKyAgICAgICAgY2FzZSBDMl9DT1JSVVBURUQ6IHJldHVybiAiQ09SUlVQVEVEIjsKKyAgICAgICAgY2FzZSBDMl9OT19JTklUOiAgIHJldHVybiAiTk9fSU5JVCI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKworY29uc3QgY2hhciAqYXNTdHJpbmcoQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCBpLCBjb25zdCBjaGFyICpkZWYpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6QkxPQjogICByZXR1cm4gInU4IjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjMyOiByZXR1cm4gImMzMiI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFI2NDogcmV0dXJuICJjNjQiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpGTE9BVDogIHJldHVybiAiZnAiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjogIHJldHVybiAiaTMyIjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UNjQ6ICByZXR1cm4gImk2NCI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlNUUklORzogcmV0dXJuICJjaHIiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UMzI6IHJldHVybiAidTMyIjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDY0OiByZXR1cm4gInU2NCI7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiAoaSAmIEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgPyAic3RydWN0IiA6IGRlZjsKKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlBhcmFtRmllbGQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdGQ6OnN0cmluZyBhdHRyaWJQYXJhbUNvcmVJbmRleChjb25zdCBDMlBhcmFtOjpDb3JlSW5kZXggJmkpIHsKKyAgICByZXR1cm4gU3RyaW5nUHJpbnRmKCIlYyVjJTAzeCIsCisgICAgICAgICAgICBpLmlzRmxleGlibGUoKSA/ICdGJyA6ICctJywKKyAgICAgICAgICAgIGkuaXNWZW5kb3IoKSA/ICdWJyA6ICctJywKKyAgICAgICAgICAgIGkuY29yZUluZGV4KCkpOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgYXR0cmliUGFyYW1JbmRleCgKKyAgICAgICAgY29uc3QgQzJQYXJhbTo6VHlwZSAmaSwgYm9vbCBhZGRTdHJlYW0sIHVuc2lnbmVkIHN0cmVhbUlkKSB7CisgICAgc3RkOjpzdHJpbmcgdiA9IFN0cmluZ1ByaW50ZigiJWMlYyIsCisgICAgICAgICAgICBpLmZvcklucHV0KCkgPyAnSScgOiBpLmZvck91dHB1dCgpID8gJ08nIDogJy0nLAorICAgICAgICAgICAgaS5mb3JTdHJlYW0oKSA/ICdTJyA6IGkuZm9yUG9ydCgpID8gJ1AnIDogJ0cnKTsKKyAgICBpZiAoYWRkU3RyZWFtKSB7CisgICAgICAgIGlmIChpLmZvclN0cmVhbSgpKSB7CisgICAgICAgICAgICB2ICs9IFN0cmluZ1ByaW50ZigiJTAyZCIsIHN0cmVhbUlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHYgKz0gIi0tIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB2CisgICAgICAgICAgICArIFN0cmluZ1ByaW50ZigiJWMgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaS5raW5kKCkgPT0gQzJQYXJhbTo6U1RSVUNUICA/ICdTJyA6CisgICAgICAgICAgICAgICAgICAgICAgIGkua2luZCgpID09IEMyUGFyYW06OklORk8gICAgPyAnaScgOgorICAgICAgICAgICAgICAgICAgICAgICBpLmtpbmQoKSA9PSBDMlBhcmFtOjpUVU5JTkcgID8gJ3QnIDoKKyAgICAgICAgICAgICAgICAgICAgICAgaS5raW5kKCkgPT0gQzJQYXJhbTo6U0VUVElORyA/ICdzJyA6CisgICAgICAgICAgICAgICAgICAgICAgIGkua2luZCgpID09IEMyUGFyYW06Ok5PTkUgICAgPyAnLScgOiAnPycpCisgICAgICAgICAgICArIGF0dHJpYlBhcmFtQ29yZUluZGV4KGkpOworfQorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbTo6Q29yZUluZGV4ICZpKSB7CisgICAgcmV0dXJuIG9zIDw8ICJQYXJhbTo6Q29yZUluZGV4KCIgPDwgYXR0cmliUGFyYW1Db3JlSW5kZXgoaSkgPDwgIikiOworfQorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbTo6VHlwZSAmaSkgeworICAgIHJldHVybiBvcyA8PCBTdHJpbmdQcmludGYoIlBhcmFtOjpUeXBlKCUwOHg6ICIsIGkudHlwZSgpKQorICAgICAgICAgICAgPDwgYXR0cmliUGFyYW1JbmRleChpLCBmYWxzZSwgMCkgPDwgIikiOworfQorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbTo6SW5kZXggJmkpIHsKKyAgICByZXR1cm4gb3MgPDwgU3RyaW5nUHJpbnRmKCJQYXJhbTo6SW5kZXgoJTA4eDogIiwgKHVpbnQzMl90KWkpCisgICAgICAgICAgICA8PCBhdHRyaWJQYXJhbUluZGV4KGksIHRydWUsIGkuc3RyZWFtKCkpIDw8ICIpIjsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGF0dHJpYkZpZWxkSWQoY29uc3QgX0MyRmllbGRJZCAmaSkgeworICAgIHJldHVybiBTdHJpbmdQcmludGYoIkZpZWxkKEAlMDJ4KyUwMngpIiwKKyAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoaSksCisgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0U2l6ZShpKSk7Cit9CisKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IF9DMkZpZWxkSWQgJmkpIHsKKyAgICByZXR1cm4gb3MgPDwgIjwiIDw8IGF0dHJpYkZpZWxkSWQoaSkgPDwgIj4iOworfQorCisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmaSkgeworICAgIG9zIDw8IGF0dHJpYkZpZWxkSWQoX0MyUGFyYW1JbnNwZWN0b3I6OkdldEZpZWxkKGkpKSA8PCAiICI7CisgICAgaWYgKGkubmFtZWRWYWx1ZXMoKS5zaXplKCkpIHsKKyAgICAgICAgb3MgPDwgImVudW0gIjsKKyAgICB9CisgICAgcmV0dXJuIG9zIDw8IGFzU3RyaW5nKGkudHlwZSgpKSA8PCAiICIgPDwgaS5uYW1lKCkKKyAgICAgICAgICAgIDw8IFN0cmluZ1ByaW50ZigiWyV6dV0iLCBpLmV4dGVudCgpKTsKK30KKworCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbUZpZWxkICZpKSB7CisgICAgb3MgPDwgIjwiIDw8IEMyUGFyYW06OkluZGV4KF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRJbmRleChpKSkKKyAgICAgICAgICAgIDw8IFN0cmluZ1ByaW50ZigiOjpGaWVsZChAJTAyeCslMDJ4KT4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUoaSkpOworICAgIHJldHVybiBvczsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBfQzJGaWVsZFZhbHVlSGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0ZDo6b3N0cmVhbSYgX0MyRmllbGRWYWx1ZUhlbHBlcjxjaGFyPjo6cHV0KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCkgeworICAgIGlmIChpc3ByaW50KHAuaTMyKSkgeworICAgICAgICByZXR1cm4gb3MgPDwgU3RyaW5nUHJpbnRmKCInJWMnIiwgcC5pMzIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBvcyA8PCBTdHJpbmdQcmludGYoIidcXHglMDJ4JyIsICh1aW50MzJfdClwLmkzMik7CisgICAgfQorfQorCitzdGQ6Om9zdHJlYW0mIF9DMkZpZWxkVmFsdWVIZWxwZXI8dWludDhfdD46OnB1dChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApIHsKKyAgICByZXR1cm4gb3MgPDwgU3RyaW5nUHJpbnRmKCIweCUwMngiLCBwLnUzMik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgYzJfY250cl90PFQ+ICZ2KSB7CisgICAgcmV0dXJuIG9zIDw8ICJjdHIoIiA8PCB2LnBlZWt1KCkgPDwgIikiOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmkpIHsKKyAgICBvcyA8PCAiUmFuZ2UoIjsKKyAgICBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpwdXQob3MsIGkubWluKCkpOworICAgIG9zIDw8ICIuLiI7CisgICAgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6cHV0KG9zLCBpLm1heCgpKTsKKyAgICBvcyA8PCAiICo9ICIgPDwgaS5udW0oKSA8PCAiIC89ICIgPDwgaS5kZW5vbSgpIDw8ICIgKz0gIiA8PCBpLnN0ZXAoKSA8PCAiKSI7CisgICAgcmV0dXJuIG9zOworfQordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8Y2hhcj4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8dWludDhfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8aW50MzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8dWludDMyX3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8YzJfY250cjMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPGludDY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPHVpbnQ2NF90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPGMyX2NudHI2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxmbG9hdD4gJmkpOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8VD4gJmkpIHsKKyAgICBvcyA8PCAiRmxhZ3NbIjsKKyAgICBpZiAoIWkuaXNFbXB0eSgpKSB7CisgICAgICAgIG9zIDw8ICJtaW49IjsKKyAgICAgICAgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6cHV0KG9zLCBpLm1pbigpKTsKKyAgICB9CisgICAgYm9vbCBjb21tYSA9IGZhbHNlOworICAgIGZvciAoY29uc3QgVCAmdiA6IGkuZmxhZ3MoKSkgeworICAgICAgICBpZiAoY29tbWEpIHsKKyAgICAgICAgICAgIG9zIDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6cHV0KG9zLCB2KTsKKyAgICAgICAgY29tbWEgPSB0cnVlOworICAgIH0KKyAgICBvcyA8PCAiXSI7CisgICAgcmV0dXJuIG9zOworfQordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8Y2hhcj4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8dWludDhfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8aW50MzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8dWludDMyX3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8YzJfY250cjMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGludDY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPHVpbnQ2NF90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGMyX2NudHI2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD4gJmkpOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gJmkpIHsKKyAgICBvcyA8PCAiVmFsdWVzWyI7CisgICAgYm9vbCBjb21tYSA9IGZhbHNlOworICAgIGZvciAoY29uc3QgVCAmdiA6IGkudmFsdWVzKCkpIHsKKyAgICAgICAgaWYgKGNvbW1hKSB7CisgICAgICAgICAgICBvcyA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OnB1dChvcywgdik7CisgICAgICAgIGNvbW1hID0gdHJ1ZTsKKyAgICB9CisgICAgb3MgPDwgIl0iOworICAgIHJldHVybiBvczsKK30KK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PGNoYXI+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PHVpbnQ4X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PGludDMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PHVpbnQzMl90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PGMyX2NudHIzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxpbnQ2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDx1aW50NjRfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjMl9jbnRyNjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8ZmxvYXQ+ICZpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpJbXBsIHsKKyAgICBJbXBsKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcyk7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpWYWx1ZVR5cGUgVmFsdWVUeXBlOworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdCBfbVR5cGU7CisgICAgQzJTdXBwb3J0ZWRSYW5nZTxWYWx1ZVR5cGU+IF9tUmFuZ2U7CisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldDxWYWx1ZVR5cGU+IF9tVmFsdWVzOworICAgIEMyU3VwcG9ydGVkRmxhZ3M8VmFsdWVUeXBlPiBfbUZsYWdzOworCitwdWJsaWM6CisvLyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8IDxUPihzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpJbXBsICZpKTsKKy8vICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgSW1wbCAmaSk7CisgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW1PdXQoc3RkOjpvc3RyZWFtJiBvcykgY29uc3Q7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpJbXBsOjpzdHJlYW1PdXQoc3RkOjpvc3RyZWFtJiBvcykgY29uc3QgeworICAgIGlmIChfbVR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UkFOR0UpIHsKKyAgICAgICAgb3MgPDwgX21SYW5nZTsKKyAgICB9IGVsc2UgaWYgKF9tVHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpWQUxVRVMpIHsKKyAgICAgICAgb3MgPDwgX21WYWx1ZXM7CisgICAgfSBlbHNlIGlmIChfbVR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RkxBR1MpIHsKKyAgICAgICAgb3MgPDwgX21GbGFnczsKKyAgICB9IGVsc2UgeworICAgICAgICBvcyA8PCAiVW5rbm93biBGU1YgdHlwZTogIiA8PCAodWludDMyX3QpX21UeXBlOworICAgIH0KKyAgICByZXR1cm4gb3M7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPiAmaSkgeworICAgIHJldHVybiBpLl9tSW1wbC0+c3RyZWFtT3V0KG9zKTsKK30KK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGNoYXI+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPHVpbnQ4X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGludDMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPHVpbnQzMl90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGMyX2NudHIzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxpbnQ2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50NjRfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxjMl9jbnRyNjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8ZmxvYXQ+ICZpKTsKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZUhlbHBlci5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MySW50ZXJmYWNlSGVscGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDQ3ZmJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZUhlbHBlci5jcHAKQEAgLTAsMCArMSw4NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKwordXNpbmcgOjphbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZWZsZWN0b3JIZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgQzJSZWZsZWN0b3JIZWxwZXI6OmFkZFN0cnVjdERlc2NyaXB0b3JzKAorICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cnVjdERlc2NyaXB0b3I+ICZzdHJ1Y3RzLCBfVHVwbGU8PiAqKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soX21NdXRleCk7CisgICAgZm9yIChDMlN0cnVjdERlc2NyaXB0b3IgJnN0cnVrdCA6IHN0cnVjdHMpIHsKKyAgICAgICAgLy8gVE9ETzogY2hlY2sgaWYgc3RydWN0dXJlIGRlc2NyaXB0aW9ucyBjb25mbGljdCB3aXRoIGV4aXN0aW5nIG9uZXMKKyAgICAgICAgYWRkU3RydWN0RGVzY3JpcHRvcihzdGQ6Om1vdmUoc3RydWt0KSk7CisgICAgfQorfQorCitzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPgorQzJSZWZsZWN0b3JIZWxwZXI6OmRlc2NyaWJlKEMyUGFyYW06OkNvcmVJbmRleCBwYXJhbUluZGV4KSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soX21NdXRleCk7CisgICAgYXV0byBpdCA9IF9tU3RydWN0cy5maW5kKHBhcmFtSW5kZXgpOworICAgIGlmIChpdCA9PSBfbVN0cnVjdHMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8QzJTdHJ1Y3REZXNjcmlwdG9yPihpdC0+c2Vjb25kKTsKKyAgICB9Cit9OworCit2b2lkIEMyUmVmbGVjdG9ySGVscGVyOjphZGRTdHJ1Y3REZXNjcmlwdG9yKEMyU3RydWN0RGVzY3JpcHRvciAmJnN0cnVrdCkgeworICAgIGlmIChfbVN0cnVjdHMuZmluZChzdHJ1a3QuY29yZUluZGV4KCkpICE9IF9tU3RydWN0cy5lbmQoKSkgeworICAgICAgICAvLyBhbHJlYWR5IGFkZGVkCisgICAgICAgIC8vIFRPRE86IHZhbGlkYXRlIHRoYXQgZGVzY3JpcHRvciBtYXRjaGVzIHN0b3JlZCBkZXNjcmlwdG9yCisgICAgfQorICAgIC8vIHZhbGlkYXRlIHRoYXQgYWxsIHN0cnVjdCBmaWVsZHMgYXJlIGtub3duIHRvIHRoaXMgcmVmbGVjdG9yCisgICAgZm9yIChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQgOiBzdHJ1a3QpIHsKKyAgICAgICAgaWYgKGZkLnR5cGUoKSAmIEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCA9IGZkLnR5cGUoKSAmfiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUc7CisgICAgICAgICAgICBpZiAoX21TdHJ1Y3RzLmZpbmQoY29yZUluZGV4KSA9PSBfbVN0cnVjdHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBDMl9MT0coSU5GTykgPDwgIm1pc3Npbmcgc3RydWN0IGRlc2NyaXB0b3IgIyIgPDwgY29yZUluZGV4IDw8ICIgZm9yIGZpZWxkICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGZkLm5hbWUoKSA8PCAiIG9mIHN0cnVjdCAjIiA8PCBzdHJ1a3QuY29yZUluZGV4KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgX21TdHJ1Y3RzLmVtcGxhY2Uoc3RydWt0LmNvcmVJbmRleCgpLCBzdHJ1a3QpOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFyYW1IZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitjbGFzcyBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OkltcGwgeworcHVibGljOgorICAgIEltcGwoUGFyYW1SZWYgcGFyYW0sIEMyU3RyaW5nTGl0ZXJhbCBuYW1lLCBDMlN0cnVjdERlc2NyaXB0b3IgJiZzdHJ1a3QpCisgICAgICAgIDogbVBhcmFtKHBhcmFtKSwgbU5hbWUobmFtZSksIF9tU3RydWN0KHN0cnVrdCkgeyB9CisKKyAgICBJbXBsKEltcGwmJikgPSBkZWZhdWx0OworCisgICAgdm9pZCBhZGREb3duRGVwZW5kZW5jeShDMlBhcmFtOjpJbmRleCBpbmRleCkgeworICAgICAgICBtRG93bkRlcGVuZGVuY2llcy5wdXNoX2JhY2soaW5kZXgpOworICAgIH0KKworICAgIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6YXR0cmliX3QmIGF0dHJpYigpIHsKKyAgICAgICAgcmV0dXJuIG1BdHRyaWI7CisgICAgfQorCisgICAgdm9pZCBidWlsZCgpIHsKKyAgICAgICAgLy8gbW92ZSBkZXBlbmRlbmNpZXMgaW50byBkZXNjcmlwdG9yCisgICAgICAgIG1EZXNjcmlwdG9yID0gc3RkOjptYWtlX3NoYXJlZDxDMlBhcmFtRGVzY3JpcHRvcj4oCisgICAgICAgICAgICAgICAgaW5kZXgoKSwgKEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCltQXR0cmliLAorICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShtTmFtZSksIHN0ZDo6bW92ZShtRGVwZW5kZW5jaWVzKSk7CisgICAgfQorCisgICAgdm9pZCBjcmVhdGVGaWVsZHNBbmRTdXBwb3J0ZWRWYWx1ZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpIHsKKyAgICAgICAgZm9yIChjb25zdCBDMkZpZWxkVXRpbHM6OkluZm8gJmYgOgorICAgICAgICAgICAgICAgIEMyRmllbGRVdGlsczo6ZW51bWVyYXRlRmllbGRzKCptRGVmYXVsdFZhbHVlLCByZWZsZWN0b3IpKSB7CisgICAgICAgICAgICBpZiAoIWYuaXNBcml0aG1ldGljKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiBmc3ZQb2ludGVyOworCisgICAgICAgICAgICAvLyBjcmVhdGUgYSBicmVha2FibGUgc3RydWN0dXJlCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBmc3Y7CisgICAgICAgICAgICAgICAgc3dpdGNoIChmLnR5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjogIGZzdiA9IEMyU3VwcG9ydGVkUmFuZ2U8aW50MzJfdD46OkFueSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOiBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPHVpbnQzMl90Pjo6QW55KCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQ2NDogIGZzdiA9IEMyU3VwcG9ydGVkUmFuZ2U8aW50NjRfdD46OkFueSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDY0OiBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPHVpbnQ2NF90Pjo6QW55KCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpGTE9BVDogIGZzdiA9IEMyU3VwcG9ydGVkUmFuZ2U8ZmxvYXQ+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6ICAgZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTx1aW50OF90Pjo6QW55KCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpTVFJJTkc6IGZzdiA9IEMyU3VwcG9ydGVkUmFuZ2U8Y2hhcj46OkFueSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gYnJlYWsgb3V0IG9mIGRvIHt9IHdoaWxlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZzdlBvaW50ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+KGZzdik7CisgICAgICAgICAgICB9IHdoaWxlIChmYWxzZSk7CisKKyAgICAgICAgICAgIG1GaWVsZHMuZW1wbGFjZV9oaW50KAorICAgICAgICAgICAgICAgICAgICBtRmllbGRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICBfQzJGaWVsZElkKGYub2Zmc2V0KCksIGYuc2l6ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxGaWVsZEhlbHBlcj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtLCBfQzJGaWVsZElkKGYub2Zmc2V0KCksIGYuc2l6ZSgpKSwgc3RkOjptb3ZlKGZzdlBvaW50ZXIpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhIGZpZWxkIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPiBmaW5kRmllbGQoc2l6ZV90IGJhc2VPZmZzLCBzaXplX3QgYmFzZVNpemUpIGNvbnN0IHsKKyAgICAgICAgYXV0byBpdCA9IG1GaWVsZHMuZmluZChfQzJGaWVsZElkKGJhc2VPZmZzLCBiYXNlU2l6ZSkpOworICAgICAgICBpZiAoaXQgPT0gbUZpZWxkcy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgfQorCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+IGdldERlcGVuZGVuY2llc0FzUmVmcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EZXBlbmRlbmNpZXNBc1JlZnM7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyUGFyYW1EZXNjcmlwdG9yPiBnZXREZXNjcmlwdG9yKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURlc2NyaXB0b3I7CisgICAgfQorCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGdldERvd25EZXBlbmRlbmNpZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRG93bkRlcGVuZGVuY2llczsKKyAgICB9CisKKyAgICBDMlBhcmFtOjpJbmRleCBpbmRleCgpIGNvbnN0IHsKKyAgICAgICAgaWYgKCFtRGVmYXVsdFZhbHVlKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIG1pc3NpbmcgZGVmYXVsdCB2YWx1ZVxuIiwgbU5hbWUuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0VmFsdWUtPmluZGV4KCk7CisgICAgfQorCisgICAgQzJTdHJpbmcgbmFtZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1OYW1lOworICAgIH0KKworICAgIGNvbnN0IFBhcmFtUmVmIHJlZigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QYXJhbTsKKyAgICB9CisKKyAgICBDMlN0cnVjdERlc2NyaXB0b3IgcmV0cmlldmVTdHJ1Y3REZXNjcmlwdG9yKCkgeworICAgICAgICByZXR1cm4gc3RkOjptb3ZlKF9tU3RydWN0KTsKKyAgICB9CisKKyAgICB2b2lkIHNldERlZmF1bHRWYWx1ZShzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gZGVmYXVsdF8pIHsKKyAgICAgICAgbURlZmF1bHRWYWx1ZSA9IGRlZmF1bHRfOworICAgIH0KKworICAgIHZvaWQgc2V0RGVwZW5kZW5jaWVzKHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzLCBzdGQ6OnZlY3RvcjxQYXJhbVJlZj4gcmVmcykgeworICAgICAgICBtRGVwZW5kZW5jaWVzID0gaW5kaWNlczsKKyAgICAgICAgbURlcGVuZGVuY2llc0FzUmVmcyA9IHJlZnM7CisgICAgfQorCisgICAgdm9pZCBzZXRGaWVsZHMoc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiAmJmZpZWxkcykgeworICAgICAgICAvLyBkbyBub3QgYWxsb3cgYWRkaW5nIGZpZWxkcyBtdWx0aXBsZSB0aW1lcywgb3IgdG8gY29uc3QgdmFsdWVzCisgICAgICAgIGlmICghbUZpZWxkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJUcnlpbmcgdG8gYWRkIGZpZWxkcyB0byBwYXJhbSAiIDw8IG1OYW1lIDw8ICIgbXVsdGlwbGUgdGltZXMiOworICAgICAgICB9IGVsc2UgaWYgKG1BdHRyaWIgJiBhdHRyaWJfdDo6SVNfQ09OU1QpIHsKKyAgICAgICAgICAgIEMyX0xPRyhGQVRBTCkgPDwgIlRyeWluZyB0byBhZGQgZmllbGRzIHRvIGNvbnN0IHBhcmFtICIgPDwgbU5hbWU7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEMyUGFyYW1GaWVsZFZhbHVlcyAmcGZ2IDogZmllbGRzKSB7CisgICAgICAgICAgICBtRmllbGRzLmVtcGxhY2VfaGludCgKKyAgICAgICAgICAgICAgICAgICAgbUZpZWxkcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgLy8gX0MyRmllbGRJZCBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0RmllbGQocGZ2LnBhcmFtT3JGaWVsZCksCisgICAgICAgICAgICAgICAgICAgIC8vIEZpZWxkIGNvbnN0cnVjdG9yCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8RmllbGRIZWxwZXI+KG1QYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldEZpZWxkKHBmdi5wYXJhbU9yRmllbGQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocGZ2LnZhbHVlcykpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc2V0R2V0dGVyKHN0ZDo6ZnVuY3Rpb248c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+KGJvb2wpPiBnZXR0ZXIpIHsKKyAgICAgICAgbUdldHRlciA9IGdldHRlcjsKKyAgICB9CisKKyAgICB2b2lkIHNldFNldHRlcihzdGQ6OmZ1bmN0aW9uPEMyUihjb25zdCBDMlBhcmFtICosIGJvb2wsIGJvb2wgKiwgRmFjdG9yeSAmKT4gc2V0dGVyKSB7CisgICAgICAgIG1TZXR0ZXIgPSBzZXR0ZXI7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgdHJ5U2V0KAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUsIGJvb2wgbWF5QmxvY2ssIGJvb2wgKmNoYW5nZWQsIEZhY3RvcnkgJmYsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSB7CisgICAgICAgIEMyUiByZXN1bHQgPSBtU2V0dGVyKHZhbHVlLCBtYXlCbG9jaywgY2hhbmdlZCwgZik7CisgICAgICAgIHJldHVybiByZXN1bHQucmV0cmlldmVGYWlsdXJlcyhmYWlsdXJlcyk7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgdmFsaWRhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpIHsKKyAgICAgICAgaWYgKCFtU2V0dGVyICYmIG1GaWVsZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgQzJfTE9HKFdBUk5JTkcpIDw8ICJQYXJhbSAiIDw8IG1OYW1lIDw8ICIgaGFzIG5vIHNldHRlciwgbWFraW5nIGl0IGNvbnN0IjsKKyAgICAgICAgICAgIC8vIGRlcGVuZGVuY2llcyBhcmUgZW1wdHkgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICBtQXR0cmliIHw9IGF0dHJpYl90OjpJU19DT05TVDsKKyAgICAgICAgfSBlbHNlIGlmICghbVNldHRlcikgeworICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAiUGFyYW0gIiA8PCBtTmFtZSA8PCAiIGhhcyBubyBzZXR0ZXIiOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1BdHRyaWIgJiBhdHRyaWJfdDo6SVNfQ09OU1QpIHsKKyAgICAgICAgICAgIGNyZWF0ZUZpZWxkc0FuZFN1cHBvcnRlZFZhbHVlcyhyZWZsZWN0b3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVE9ETzogdXBkYXRlIGRlZmF1bHQgYmFzZWQgb24gc2V0dGVyIGFuZCB2ZXJpZnkgdGhhdCBGU1YgY292ZXJzIHRoZSB2YWx1ZXMKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRmllbGRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEMyX0xPRyhGQVRBTCkgPDwgIlBhcmFtICIgPDwgbU5hbWUgPDwgIiBoYXMgbm8gZmllbGRzIjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gdmFsdWUoKSB7CisgICAgICAgIHJldHVybiBtUGFyYW0uZ2V0KCk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyUGFyYW0+IHZhbHVlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVBhcmFtLmdldCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIF9DMlBhcmFtSW5zcGVjdG9yOjphdHRyaWJfdCBhdHRyaWJfdDsKKyAgICBQYXJhbVJlZiBtUGFyYW07CisgICAgQzJTdHJpbmcgbU5hbWU7CisgICAgQzJTdHJ1Y3REZXNjcmlwdG9yIF9tU3RydWN0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBtRGVmYXVsdFZhbHVlOworICAgIGF0dHJpYl90IG1BdHRyaWI7CisgICAgc3RkOjpmdW5jdGlvbjxDMlIoY29uc3QgQzJQYXJhbSAqLCBib29sLCBib29sICosIEZhY3RvcnkgJik+IG1TZXR0ZXI7CisgICAgc3RkOjpmdW5jdGlvbjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4oYm9vbCk+IG1HZXR0ZXI7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IG1EZXBlbmRlbmNpZXM7CisgICAgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+IG1EZXBlbmRlbmNpZXNBc1JlZnM7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IG1Eb3duRGVwZW5kZW5jaWVzOyAvLyBUT0RPOiB0aGlzIGRvZXMgbm90IHdvcmsgZm9yIHN0cmVhbSBkZXBlbmRlbmNpZXMKKyAgICBzdGQ6Om1hcDxfQzJGaWVsZElkLCBzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+PiBtRmllbGRzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gbURlc2NyaXB0b3I7Cit9OworCitDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OlBhcmFtSGVscGVyKAorICAgICAgICBQYXJhbVJlZiBwYXJhbSwgQzJTdHJpbmdMaXRlcmFsIG5hbWUsIEMyU3RydWN0RGVzY3JpcHRvciAmJnN0cnVrdCkKKyAgICA6IG1JbXBsKHN0ZDo6bWFrZV91bmlxdWU8QzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpJbXBsPigKKyAgICAgICAgICAgIHBhcmFtLCBuYW1lLCBzdGQ6Om1vdmUoc3RydWt0KSkpIHsgfQorCitDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OlBhcmFtSGVscGVyKEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlciAmJikgPSBkZWZhdWx0OworCitDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6On5QYXJhbUhlbHBlcigpID0gZGVmYXVsdDsKKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmFkZERvd25EZXBlbmRlbmN5KEMyUGFyYW06OkluZGV4IGluZGV4KSB7CisgICAgcmV0dXJuIG1JbXBsLT5hZGREb3duRGVwZW5kZW5jeShpbmRleCk7Cit9CisKK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6YXR0cmliX3QmIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6YXR0cmliKCkgeworICAgIHJldHVybiBtSW1wbC0+YXR0cmliKCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI+IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6YnVpbGQoKSB7CisgICAgbUltcGwtPmJ1aWxkKCk7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8QzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyPihzdGQ6Om1vdmUoKnRoaXMpKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZEhlbHBlcj4KK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6ZmluZEZpZWxkKHNpemVfdCBiYXNlT2Zmcywgc2l6ZV90IGJhc2VTaXplKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5maW5kRmllbGQoYmFzZU9mZnMsIGJhc2VTaXplKTsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtUmVmPgorQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpnZXREZXBlbmRlbmNpZXNBc1JlZnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXREZXBlbmRlbmNpZXNBc1JlZnMoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyUGFyYW1EZXNjcmlwdG9yPgorQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpnZXREZXNjcmlwdG9yKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0RGVzY3JpcHRvcigpOworfQorCitjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpnZXREb3duRGVwZW5kZW5jaWVzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0RG93bkRlcGVuZGVuY2llcygpOworfQorCitDMlBhcmFtOjpJbmRleCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmluZGV4KCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+aW5kZXgoKTsKK30KKworQzJTdHJpbmcgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpuYW1lKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+bmFtZSgpOworfQorCitjb25zdCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1SZWYgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpyZWYoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5yZWYoKTsKK30KKworQzJTdHJ1Y3REZXNjcmlwdG9yIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6cmV0cmlldmVTdHJ1Y3REZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBtSW1wbC0+cmV0cmlldmVTdHJ1Y3REZXNjcmlwdG9yKCk7Cit9CisKK3ZvaWQgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpzZXREZWZhdWx0VmFsdWUoc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IGRlZmF1bHRfKSB7CisgICAgbUltcGwtPnNldERlZmF1bHRWYWx1ZShkZWZhdWx0Xyk7Cit9CisKK3ZvaWQgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpzZXREZXBlbmRlbmNpZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzLCBzdGQ6OnZlY3RvcjxQYXJhbVJlZj4gcmVmcykgeworICAgIG1JbXBsLT5zZXREZXBlbmRlbmNpZXMoaW5kaWNlcywgcmVmcyk7Cit9CisKK3ZvaWQgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpzZXRGaWVsZHMoc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiAmJmZpZWxkcykgeworICAgIHJldHVybiBtSW1wbC0+c2V0RmllbGRzKHN0ZDo6bW92ZShmaWVsZHMpKTsKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnNldEdldHRlcigKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4oYm9vbCk+IGdldHRlcikgeworICAgIG1JbXBsLT5zZXRHZXR0ZXIoZ2V0dGVyKTsKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnNldFNldHRlcigKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxDMlIoY29uc3QgQzJQYXJhbSAqLCBib29sLCBib29sICosIEZhY3RvcnkgJik+IHNldHRlcikgeworICAgIG1JbXBsLT5zZXRTZXR0ZXIoc2V0dGVyKTsKK30KKworYzJfc3RhdHVzX3QgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjp0cnlTZXQoCisgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlLCBib29sIG1heUJsb2NrLCBib29sICpjaGFuZ2VkLCBGYWN0b3J5ICZmLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSB7CisgICAgcmV0dXJuIG1JbXBsLT50cnlTZXQodmFsdWUsIG1heUJsb2NrLCBjaGFuZ2VkLCBmLCBmYWlsdXJlcyk7Cit9CisKK2MyX3N0YXR1c190IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6dmFsaWRhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgcmV0dXJuIG1JbXBsLT52YWxpZGF0ZShyZWZsZWN0b3IpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjp2YWx1ZSgpIHsKKyAgICByZXR1cm4gbUltcGwtPnZhbHVlKCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBhcmFtPiBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+dmFsdWUoKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGaWVsZEhlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK0MyUGFyYW1GaWVsZCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI6Om1ha2VQYXJhbUZpZWxkKEMyUGFyYW06OkluZGV4IGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIF9DMlBhcmFtSW5zcGVjdG9yOjpDcmVhdGVQYXJhbUZpZWxkKGluZGV4LCBtRmllbGRJZCk7Cit9CisKK0MySW50ZXJmYWNlSGVscGVyOjpGaWVsZEhlbHBlcjo6RmllbGRIZWxwZXIoY29uc3QgUGFyYW1SZWYgJnBhcmFtLCBjb25zdCBfQzJGaWVsZElkICZmaWVsZCwKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiAmJnZhbHVlcykKKyAgICA6IG1QYXJhbShwYXJhbSksCisgICAgICBtRmllbGRJZChmaWVsZCksCisgICAgICBtUG9zc2libGUoc3RkOjptb3ZlKHZhbHVlcykpIHsKKyAgICBDMl9MT0coVkVSQk9TRSkgPDwgIkNyZWF0aW5nIGZpZWxkIGhlbHBlciAiIDw8IGZpZWxkIDw8ICIgIgorICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50MzJfdD4oKm1Qb3NzaWJsZSk7Cit9CisKK3ZvaWQgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyOjpzZXRTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiAmJnZhbHVlcykgeworICAgIG1TdXBwb3J0ZWQgPSBzdGQ6Om1vdmUodmFsdWVzKTsKK30KKworY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAqQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyOjpnZXRTdXBwb3J0ZWRWYWx1ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIChtU3VwcG9ydGVkID8gbVN1cHBvcnRlZCA6IG1Qb3NzaWJsZSkuZ2V0KCk7Cit9CisKK2NvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKkMySW50ZXJmYWNlSGVscGVyOjpGaWVsZEhlbHBlcjo6Z2V0UG9zc2libGVWYWx1ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Qb3NzaWJsZS5nZXQoKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpZWxkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBXcmFwcGVyIGFyb3VuZCBmaWVsZC1zdXBwb3J0ZWQtdmFsdWVzIGJ1aWxkZXIgdGhhdCBnZXRzIHN0b3JlZCBpbiB0aGUKKyAqIGZpZWxkIGhlbHBlciB3aGVuIHRoZSBidWlsZGVyIGdvZXMgb3V0IG9mIHNjb3BlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IFN1cHBvcnRlZFZhbHVlc0J1aWxkZXIgOiBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+IHsKKyAgICBTdXBwb3J0ZWRWYWx1ZXNCdWlsZGVyKAorICAgICAgICAgICAgQzJQYXJhbUZpZWxkICZmaWVsZCwgc3RkOjpzaGFyZWRfcHRyPEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZEhlbHBlcj4gaGVscGVyKQorICAgICAgICA6IEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4oZmllbGQpLCBfbUhlbHBlcihoZWxwZXIpLCBfbUZpZWxkKGZpZWxkKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZSBidWlsZGVyIHZhbHVlcyBvbiBkZXN0cnVjdGlvbi4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIH5TdXBwb3J0ZWRWYWx1ZXNCdWlsZGVyKCkgb3ZlcnJpZGUgeworICAgICAgICBfbUhlbHBlci0+c2V0U3VwcG9ydGVkVmFsdWVzKHN0ZDo6bW92ZShDMlBhcmFtRmllbGRWYWx1ZXMoKnRoaXMpLnZhbHVlcykpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyPiBfbUhlbHBlcjsKKyAgICBDMlBhcmFtRmllbGQgX21GaWVsZDsKK307CisKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPFQ+OjpzaG91bGRCZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPihfbUZpZWxkKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPFQ+OjptdXN0QmUoKSB7CisgICAgcmV0dXJuIFN1cHBvcnRlZFZhbHVlc0J1aWxkZXI8VD4oX21GaWVsZCwgX21IZWxwZXIpOworfQorCisvKgordGVtcGxhdGU8dHlwZW5hbWUgVD4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPFQ+Ojp2YWxpZGF0ZVBvc3NpYmxlKFQgJnZhbHVlKQorY29uc3QgeworICAgIC8vLyBUT0RPCisgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyOjpPaygpOworfQorKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxUPjo6RmllbGQoc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPiBoZWxwZXIsIEMyUGFyYW06OkluZGV4IGluZGV4KQorICAgIDogX21IZWxwZXIoaGVscGVyKSwgX21GaWVsZChoZWxwZXItPm1ha2VQYXJhbUZpZWxkKGluZGV4KSkgeyB9CisKK3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8dWludDhfdD47Cit0ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPGNoYXI+OwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxpbnQzMl90PjsKK3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8dWludDMyX3Q+OworLy90ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPGMyX2NudHIzMl90PjsKK3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8aW50NjRfdD47Cit0ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPHVpbnQ2NF90PjsKKy8vdGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxjMl9jbnRyNjRfdD47Cit0ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPGZsb2F0PjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZhY3RvcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmFjdG9yeUltcGwgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXI6OkZhY3RvcnkgeworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFJlZmxlY3RvcigpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIF9tUmVmbGVjdG9yOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPgorICAgIGdldFBhcmFtSGVscGVyKGNvbnN0IFBhcmFtUmVmICZwYXJhbSkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gX21QYXJhbXMuZmluZChwYXJhbSktPnNlY29uZDsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBGYWN0b3J5SW1wbChzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICA6IF9tUmVmbGVjdG9yKHJlZmxlY3RvcikgeyB9CisKKyAgICB2aXJ0dWFsIH5GYWN0b3J5SW1wbCgpID0gZGVmYXVsdDsKKworICAgIHZvaWQgYWRkUGFyYW0oc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBwYXJhbSkgeworICAgICAgICBfbVBhcmFtcy5pbnNlcnQoeyBwYXJhbS0+cmVmKCksIHBhcmFtIH0pOworICAgICAgICBfbUluZGV4VG9IZWxwZXIuaW5zZXJ0KHtwYXJhbS0+aW5kZXgoKSwgcGFyYW19KTsKKworICAgICAgICAvLyBhZGQgZG93bi1kZXBlbmRlbmNpZXMgKGFuZCB2YWxpZGF0ZSBkZXBlbmRlbmNpZXMgYXMgYSByZXN1bHQpCisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIGZvciAoY29uc3QgUGFyYW1SZWYgJnJlZiA6IHBhcmFtLT5nZXREZXBlbmRlbmNpZXNBc1JlZnMoKSkgeworICAgICAgICAgICAgLy8gZGVwZW5kZW5jaWVzIG11c3QgYWxyZWFkeSBiZSBkZWZpbmVkCisgICAgICAgICAgICBpZiAoIV9tUGFyYW1zLmNvdW50KHJlZikpIHsKKyAgICAgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJQYXJhbWV0ZXIgIiA8PCBwYXJhbS0+bmFtZSgpIDw8ICIgaGFzIGEgZGVwZW5kZW5jeSBhdCBpbmRleCAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBpeCA8PCAiIHRoYXQgaXMgbm90IHlldCBkZWZpbmVkIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9tUGFyYW1zLmZpbmQocmVmKS0+c2Vjb25kLT5hZGREb3duRGVwZW5kZW5jeShwYXJhbS0+aW5kZXgoKSk7CisgICAgICAgICAgICArK2l4OworICAgICAgICB9CisKKyAgICAgICAgX21EZXBlbmRlbmN5SW5kZXguZW1wbGFjZShwYXJhbS0+aW5kZXgoKSwgX21EZXBlbmRlbmN5SW5kZXguc2l6ZSgpKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IGdldFBhcmFtKEMyUGFyYW06OkluZGV4IGl4KSBjb25zdCB7CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBzdHJlYW1zIHNlcGFyYXRlbHkKKyAgICAgICAgY29uc3QgYXV0byBpdCA9IF9tSW5kZXhUb0hlbHBlci5maW5kKGl4KTsKKyAgICAgICAgaWYgKGl0ID09IF9tSW5kZXhUb0hlbHBlci5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETzogdGhpcyBjb3VsZCByZXR1cm4gYSBjb3B5IHVzaW5nIHByb3BlciBwb2ludGVyIGNhc3QuCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IGdldFBhcmFtVmFsdWUoQzJQYXJhbTo6SW5kZXggaXgpIGNvbnN0IHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBoZWxwZXIgPSBnZXRQYXJhbShpeCk7CisgICAgICAgIHJldHVybiBoZWxwZXIgPyBoZWxwZXItPnZhbHVlKCkgOiBudWxscHRyOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcykgY29uc3QgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogX21QYXJhbXMpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGNoYW5nZSBxdWVyeVN1cHBvcnRlZFBhcmFtcyBzaWduYXR1cmU/CisgICAgICAgICAgICBwYXJhbXMtPnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpjb25zdF9wb2ludGVyX2Nhc3Q8QzJQYXJhbURlc2NyaXB0b3I+KGl0LnNlY29uZC0+Z2V0RGVzY3JpcHRvcigpKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogaGFuZGxlIGVycm9ycworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgc2l6ZV90IGdldERlcGVuZGVuY3lJbmRleChDMlBhcmFtOjpJbmRleCBpeCkgeworICAgICAgICAvLyBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIGhlbHBlciB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHN0cmVhbSBzbworICAgICAgICAvLyB3ZSBjYW4gbG9vayB1cCBkaXJlY3RseSBieSBpbmRleAorICAgICAgICBhdXRvIGl0ID0gX21EZXBlbmRlbmN5SW5kZXguZmluZChpeCk7CisgICAgICAgIHJldHVybiBpdCA9PSBfbURlcGVuZGVuY3lJbmRleC5lbmQoKSA/IFNJWkVfTUFYIDogaXQtPnNlY29uZDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjptYXA8UGFyYW1SZWYsIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4+IF9tUGFyYW1zOworICAgIHN0ZDo6bWFwPEMyUGFyYW06OkluZGV4LCBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+PiBfbUluZGV4VG9IZWxwZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IF9tUmVmbGVjdG9yOworICAgIHN0ZDo6bWFwPEMyUGFyYW06OkluZGV4LCBzaXplX3Q+IF9tRGVwZW5kZW5jeUluZGV4OworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworbmFtZXNwYWNlIHsKKworc3RhdGljIHN0ZDo6c3RyaW5nIGFzU3RyaW5nKEMyUGFyYW0gKnApIHsKKyAgICBjaGFyIGFkZHJbMjBdOworICAgIHNwcmludGYoYWRkciwgIiVwOlsiLCBwKTsKKyAgICBzdGQ6OnN0cmluZyB2ID0gYWRkcjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHAtPnNpemUoKTsgKytpKSB7CisgICAgICAgIGNoYXIgZFs0XTsKKyAgICAgICAgc3ByaW50ZihkLCAiICUwMngiLCAqKCgodWludDhfdCAqKXApICsgaSkpOworICAgICAgICB2ICs9IGQgKyAoaSA9PSAwKTsKKyAgICB9CisgICAgcmV0dXJuIHYgKyAiXSI7Cit9CisKK30KKworQzJJbnRlcmZhY2VIZWxwZXI6OkMySW50ZXJmYWNlSGVscGVyKHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gcmVmbGVjdG9yKQorICAgIDogbVJlZmxlY3RvcihyZWZsZWN0b3IpLAorICAgICAgX21GYWN0b3J5KHN0ZDo6bWFrZV9zaGFyZWQ8RmFjdG9yeUltcGw+KHJlZmxlY3RvcikpIHsgfQorCisKK3NpemVfdCBDMkludGVyZmFjZUhlbHBlcjo6R2V0QmFzZU9mZnNldChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvciwKKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4LCBzaXplX3Qgb2Zmc2V0KSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gcGFyYW0gPSByZWZsZWN0b3ItPmRlc2NyaWJlKGluZGV4KTsKKyAgICBpZiAocGFyYW0gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gfihzaXplX3QpMDsgLy8gcGFyYW0gc3RydWN0dXJlIG5vdCBkZXNjcmliZWQKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmaWVsZCA6ICpwYXJhbSkgeworICAgICAgICBzaXplX3QgZmllbGRPZmZzZXQgPSBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KGZpZWxkKTsKKyAgICAgICAgc2l6ZV90IGZpZWxkU2l6ZSA9IF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKGZpZWxkKTsKKyAgICAgICAgc2l6ZV90IGZpZWxkRXh0ZW50ID0gZmllbGQuZXh0ZW50KCk7CisgICAgICAgIGlmIChvZmZzZXQgPCBmaWVsZE9mZnNldCkgeworICAgICAgICAgICAgcmV0dXJuIH4oc2l6ZV90KTA7IC8vIG5vdCBmb3VuZAorICAgICAgICB9CisgICAgICAgIGlmIChvZmZzZXQgPT0gZmllbGRPZmZzZXQpIHsKKyAgICAgICAgICAgIC8vIGV4YWN0IG1hdGNoCisgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgICAgICB9CisgICAgICAgIGlmIChmaWVsZC5leHRlbnQoKSA9PSAwIHx8IG9mZnNldCA8IGZpZWxkT2Zmc2V0ICsgZmllbGRTaXplICogZmllbGRFeHRlbnQpIHsKKyAgICAgICAgICAgIC8vIHJlZHVjZSB0byBmaXJzdCBlbGVtZW50IGluIGNhc2Ugb2YgYXJyYXkKKyAgICAgICAgICAgIG9mZnNldCA9IGZpZWxkT2Zmc2V0ICsgKG9mZnNldCAtIGZpZWxkT2Zmc2V0KSAlIGZpZWxkU2l6ZTsKKyAgICAgICAgICAgIGlmIChmaWVsZC50eXBlKCkgPj0gQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHKSB7CisgICAgICAgICAgICAgICAgLy8gdGhpcyBvZmZzZXQgaXMgd2l0aGluIGEgZmllbGQKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBHZXRCYXNlT2Zmc2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgcmVmbGVjdG9yLCBmaWVsZC50eXBlKCkgJiB+QzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC0gZmllbGRPZmZzZXQpOworICAgICAgICAgICAgICAgIHJldHVybiB+b2Zmc2V0ID8gZmllbGRPZmZzZXQgKyBvZmZzZXQgOiBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIH4oc2l6ZV90KTA7IC8vIG5vdCBmb3VuZAorfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjphZGRQYXJhbWV0ZXIoc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBwYXJhbSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgbVJlZmxlY3Rvci0+YWRkU3RydWN0RGVzY3JpcHRvcihwYXJhbS0+cmV0cmlldmVTdHJ1Y3REZXNjcmlwdG9yKCkpOworICAgIGMyX3N0YXR1c190IGVyciA9IHBhcmFtLT52YWxpZGF0ZShtUmVmbGVjdG9yKTsKKyAgICBpZiAoZXJyICE9IEMyX0NPUlJVUFRFRCkgeworICAgICAgICBfbUZhY3RvcnktPmFkZFBhcmFtKHBhcmFtKTsKKworICAgICAgICAvLyBydW4gc2V0dGVyIHRvIGVuc3VyZSBjb3JyZWN0IHZhbHVlcworICAgICAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAodm9pZClwYXJhbS0+dHJ5U2V0KHBhcmFtLT52YWx1ZSgpLmdldCgpLCBDMl9NQVlfQkxPQ0ssICZjaGFuZ2VkLCAqX21GYWN0b3J5LCAmZmFpbHVyZXMpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJJbnRlcmZhY2VIZWxwZXI6OmNvbmZpZygKKyAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzLCBib29sIHVwZGF0ZVBhcmFtcywKKyAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4+ICpjaGFuZ2VzIF9fdW51c2VkIC8qIFRPRE8gKi8pIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIGJvb2wgcGFyYW1XYXNJbnZhbGlkID0gZmFsc2U7IC8vIFRPRE8gaXMgdGhpcyB0aGUgc2FtZSBhcyBiYWQgdmFsdWU/CisgICAgYm9vbCBwYXJhbU5vdEZvdW5kID0gZmFsc2U7CisgICAgYm9vbCBwYXJhbUJhZFZhbHVlID0gZmFsc2U7CisgICAgYm9vbCBwYXJhbU5vTWVtb3J5ID0gZmFsc2U7CisgICAgYm9vbCBwYXJhbUJsb2NraW5nID0gZmFsc2U7CisgICAgYm9vbCBwYXJhbVRpbWVkT3V0ID0gZmFsc2U7CisgICAgYm9vbCBwYXJhbUNvcnJ1cHRlZCA9IGZhbHNlOworCisgICAgLy8gZGVwZW5kZW5jaWVzCisgICAgLy8gZG93biBkZXBlbmRlbmNpZXMgYXJlIG1hcmtlZCBkaXJ0eSwgYnV0IHBhcmFtcyBzZXQgYXJlIG5vdCBpbW1lZGlhdGVseQorICAgIC8vIG1hcmtlZCBkaXJ0eSAodW5sZXNzIHRoZXkgYmVjb21lIGRvd24gZGVwZW5kZW5jeSkgc28gdGhhdCB3ZSBjYW4KKyAgICAvLyBhdm9pZCBzZXR0aW5nIHRoZW0gaWYgdGhleSBkaWQgbm90IGNoYW5nZQorCisgICAgLy8gVE9ETzogdGhlcmUgY291bGQgYmUgbXVsdGlwbGUgaW5kaWNlcyBmb3IgdGhlIHNhbWUgZGVwZW5kZW5jeSBpbmRleAorICAgIC8vIHsgZGVwSXgsIHBhcmFtSXggfSBtYXkgYmUgYSBzdWl0YWJsZSBrZXkKKyAgICBzdGQ6Om1hcDxzaXplX3QsIHN0ZDo6cGFpcjxDMlBhcmFtOjpJbmRleCwgYm9vbD4+IGRlcGVuZGVuY2llczsKKworICAgIC8vIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGxhc3QgdmFsaWQgcGFyYW1ldGVyLCBzbyBhZGQgYW4gZXh0cmEKKyAgICAvLyBsb29wIGl0ZXJhdGlvbiBhZnRlciB0aGUgbGFzdCBwYXJhbWV0ZXIKKyAgICBmb3IgKHNpemVfdCBwX2l4ID0gMDsgcF9peCA8PSBwYXJhbXMuc2l6ZSgpOyArK3BfaXgpIHsKKyAgICAgICAgQzJQYXJhbSAqcCA9IG51bGxwdHI7CisgICAgICAgIEMyUGFyYW06OkluZGV4IHBhcmFtSXggPSAwdTsKKyAgICAgICAgc2l6ZV90IHBhcmFtRGVwSXggPSBTSVpFX01BWDsKKyAgICAgICAgYm9vbCBsYXN0ID0gcF9peCA9PSBwYXJhbXMuc2l6ZSgpOworICAgICAgICBpZiAoIWxhc3QpIHsKKyAgICAgICAgICAgIHAgPSBwYXJhbXNbcF9peF07CisgICAgICAgICAgICBpZiAoISpwKSB7CisgICAgICAgICAgICAgICAgcGFyYW1XYXNJbnZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBhcmFtSXggPSBwLT5pbmRleCgpOworICAgICAgICAgICAgcGFyYW1EZXBJeCA9IGdldERlcGVuZGVuY3lJbmRleF9sKHBhcmFtSXgpOworICAgICAgICAgICAgaWYgKHBhcmFtRGVwSXggPT0gU0laRV9NQVgpIHsKKyAgICAgICAgICAgICAgICAvLyB1bnN1cHBvcnRlZCBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICBwYXJhbU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIGZpcnN0IGluc2VydCAtIG1hcmsgbm90IGRpcnR5CisgICAgICAgICAgICAvLyBpdCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBkaXJ0eSBieSBhIGRlcGVuZGVuY3kgdXBkYXRlCisgICAgICAgICAgICAvLyB0aGlzIGRvZXMgbm90IG92ZXJyd3JpdGUoISkKKyAgICAgICAgICAgICh2b2lkKWRlcGVuZGVuY2llcy5pbnNlcnQoeyBwYXJhbURlcEl4LCB7IHBhcmFtSXgsIGZhbHNlIC8qIGRpcnR5ICovIH19KTsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBkZXBlbmRlbmNpZXMuZmluZChwYXJhbURlcEl4KTsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAibWFya2luZyBkZXBlbmRlbmN5IGZvciBzZXR0aW5nIGF0ICMiIDw8IHBhcmFtRGVwSXggPDwgIjogIgorICAgICAgICAgICAgICAgICAgICA8PCBpdC0+c2Vjb25kLmZpcnN0IDw8ICIsIHVwZGF0ZSAiCisgICAgICAgICAgICAgICAgICAgIDw8IChpdC0+c2Vjb25kLnNlY29uZCA/ICJhbHdheXMgKGRpcnR5KSIgOiAib25seSBpZiBjaGFuZ2VkIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBwcm9jZXNzIGFueSByZW1haW5pbmcgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiaGFuZGxpbmcgZGlydHkgZG93biBkZXBlbmRlbmNpZXMgYWZ0ZXIgbGFzdCBzZXR0aW5nIjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb2Nlc3MgYW55IGRpcnRpZWQgZG93bi1kZXBlbmRlbmNpZXMgdW50aWwgdGhlIG5leHQgcGFyYW0KKyAgICAgICAgd2hpbGUgKGRlcGVuZGVuY2llcy5zaXplKCkgJiYgZGVwZW5kZW5jaWVzLmJlZ2luKCktPmZpcnN0IDw9IHBhcmFtRGVwSXgpIHsKKyAgICAgICAgICAgIGF1dG8gbWluID0gZGVwZW5kZW5jaWVzLmJlZ2luKCk7CisgICAgICAgICAgICBDMlBhcmFtOjpJbmRleCBpeCA9IG1pbi0+c2Vjb25kLmZpcnN0OworICAgICAgICAgICAgYm9vbCBkaXJ0eSA9IG1pbi0+c2Vjb25kLnNlY29uZDsKKyAgICAgICAgICAgIGRlcGVuZGVuY2llcy5lcmFzZShtaW4pOworCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IHBhcmFtID0gX21GYWN0b3J5LT5nZXRQYXJhbShpeCk7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIm9sZCB2YWx1ZSAiIDw8IGFzU3RyaW5nKHBhcmFtLT52YWx1ZSgpLmdldCgpKTsKKyAgICAgICAgICAgIGlmICghbGFzdCkgeworICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAibmV3IHZhbHVlICIgPDwgYXNTdHJpbmcocCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWxhc3QgJiYgIWRpcnR5ICYmIGl4ID09IHBhcmFtSXggJiYgKnBhcmFtLT52YWx1ZSgpID09ICpwKSB7CisgICAgICAgICAgICAgICAgLy8gbm8gY2hhbmdlIGluIHZhbHVlIC0gYW5kIGRlcGVuZGVuY2llcyB3ZXJlIG5vdCB1cGRhdGVkCisgICAgICAgICAgICAgICAgLy8gbm8gbmVlZCB0byB1cGRhdGUKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImlnbm9yaW5nIHNldHRpbmcgdW5jaGFuZ2VkIHBhcmFtICIgPDwgaXg7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGFwcGx5IHNldHRpbmcKKyAgICAgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJzZXR0aW5nIHBhcmFtICIgPDwgaXg7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gb2xkVmFsdWUgPSBwYXJhbS0+dmFsdWUoKTsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IHJlcyA9IHBhcmFtLT50cnlTZXQoCisgICAgICAgICAgICAgICAgICAgICghbGFzdCAmJiBwYXJhbUl4ID09IGl4KSA/IHAgOiBwYXJhbS0+dmFsdWUoKS5nZXQoKSwgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICZjaGFuZ2VkLCAqX21GYWN0b3J5LCBmYWlsdXJlcyk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gbmV3VmFsdWUgPSBwYXJhbS0+dmFsdWUoKTsKKyAgICAgICAgICAgIEMyX0NIRUNLX0VRKG9sZFZhbHVlID09IG5ld1ZhbHVlLCAqb2xkVmFsdWUgPT0gKm5ld1ZhbHVlKTsKKyAgICAgICAgICAgIHN3aXRjaCAocmVzKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDMl9PSzogYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMl9CQURfVkFMVUU6IHBhcmFtQmFkVmFsdWUgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyX05PX01FTU9SWTogcGFyYW1Ob01lbW9yeSA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJfVElNRURfT1VUOiBwYXJhbVRpbWVkT3V0ID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMl9CTE9DS0lORzogIHBhcmFtQmxvY2tpbmcgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyX0NPUlJVUFRFRDogcGFyYW1Db3JydXB0ZWQgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiA7Ly8gVE9ETyBmYXRhbAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb3B5IGJhY2sgcmVzdWx0IGZvciBjb25maWd1cmVkIHZhbHVlcyAob3IgaW52YWxpZGF0ZSBpZiBpdCBkb2VzIG5vdCBmaXQgb3IgbWF0Y2gpCisgICAgICAgICAgICBpZiAodXBkYXRlUGFyYW1zICYmICFsYXN0ICYmIHBhcmFtSXggPT0gaXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXAtPnVwZGF0ZUZyb20oKnBhcmFtLT52YWx1ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBwLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb21wYXJlIHB0cnMgYXMgcGFyYW1zIGFyZSBjb3B5IG9uIHdyaXRlCisgICAgICAgICAgICBpZiAoY2hhbmdlZCkgeworICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAicGFyYW0gIiA8PCBpeCA8PCAiIHZhbHVlIGNoYW5nZWQiOworICAgICAgICAgICAgICAgIC8vIHZhbHVlIGNoYW5nZWQgdXBkYXRlIGRvd24tZGVwZW5kZW5jaWVzIGFuZCBtYXJrIHRoZW0gZGlydHkKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4IGl4IDogcGFyYW0tPmdldERvd25EZXBlbmRlbmNpZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgMTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBpbnNlcnRfcmVzID0gZGVwZW5kZW5jaWVzLmluc2VydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdldERlcGVuZGVuY3lJbmRleF9sKGl4KSwgeyBpeCwgdHJ1ZSAvKiBkaXJ0eSAqLyB9fSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaW5zZXJ0X3Jlcy5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICgqaW5zZXJ0X3Jlcy5maXJzdCkuc2Vjb25kLnNlY29uZCA9IHRydWU7IC8vIG1hcmsgZGlydHkKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGF1dG8gaXQgPSBkZXBlbmRlbmNpZXMuZmluZChnZXREZXBlbmRlbmN5SW5kZXhfbChpeCkpOworICAgICAgICAgICAgICAgICAgICBDMl9DSEVDSyhpdC0+c2Vjb25kLnNlY29uZCk7CisgICAgICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAibWFya2luZyBkb3duIGRlcGVuZGVuY2llcyB0byB1cGRhdGUgYXQgIyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBnZXREZXBlbmRlbmN5SW5kZXhfbChpeCkgPDwgIjogIiA8PCBpdC0+c2Vjb25kLmZpcnN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAocGFyYW1Db3JydXB0ZWQgPyBDMl9DT1JSVVBURUQgOgorICAgICAgICAgICAgcGFyYW1CbG9ja2luZyA/IEMyX0JMT0NLSU5HIDoKKyAgICAgICAgICAgIHBhcmFtVGltZWRPdXQgPyBDMl9USU1FRF9PVVQgOgorICAgICAgICAgICAgcGFyYW1Ob01lbW9yeSA/IEMyX05PX01FTU9SWSA6CisgICAgICAgICAgICAocGFyYW1CYWRWYWx1ZSB8fCBwYXJhbVdhc0ludmFsaWQpID8gQzJfQkFEX1ZBTFVFIDoKKyAgICAgICAgICAgIHBhcmFtTm90Rm91bmQgPyBDMl9CQURfSU5ERVggOiBDMl9PSyk7Cit9CisKK3NpemVfdCBDMkludGVyZmFjZUhlbHBlcjo6Z2V0RGVwZW5kZW5jeUluZGV4X2woQzJQYXJhbTo6SW5kZXggaXgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21GYWN0b3J5LT5nZXREZXBlbmRlbmN5SW5kZXgoaXgpOworfQorCitjMl9zdGF0dXNfdCBDMkludGVyZmFjZUhlbHBlcjo6cXVlcnkoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jayBfX3VudXNlZCAvKiBUT0RPICovLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBib29sIHBhcmFtV2FzSW52YWxpZCA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1Ob3RGb3VuZCA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1EaWROb3RGaXQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtTm9NZW1vcnkgPSBmYWxzZTsKKworICAgIGZvciAoQzJQYXJhbSogY29uc3QgcCA6IHN0YWNrUGFyYW1zKSB7CisgICAgICAgIGlmICghKnApIHsKKyAgICAgICAgICAgIHBhcmFtV2FzSW52YWxpZCA9IHRydWU7CisgICAgICAgICAgICBwLT5pbnZhbGlkYXRlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gdmFsdWUgPSBfbUZhY3RvcnktPmdldFBhcmFtVmFsdWUocC0+aW5kZXgoKSk7CisgICAgICAgICAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgICAgICAgICAgcGFyYW1Ob3RGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgcC0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICghcC0+dXBkYXRlRnJvbSgqdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcGFyYW1EaWROb3RGaXQgPSB0cnVlOworICAgICAgICAgICAgICAgIHAtPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoY29uc3QgQzJQYXJhbTo6SW5kZXggaXggOiBoZWFwUGFyYW1JbmRpY2VzKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiB2YWx1ZSA9IF9tRmFjdG9yeS0+Z2V0UGFyYW1WYWx1ZShpeCk7CisgICAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IHAgPSBDMlBhcmFtOjpDb3B5KCp2YWx1ZSk7CisgICAgICAgICAgICBpZiAocCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgaGVhcFBhcmFtcy0+cHVzaF9iYWNrKHN0ZDo6bW92ZShwKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhcmFtTm9NZW1vcnkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyYW1Ob3RGb3VuZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcGFyYW1Ob01lbW9yeSA/IEMyX05PX01FTU9SWSA6CisgICAgICAgICAgIHBhcmFtTm90Rm91bmQgPyBDMl9CQURfSU5ERVggOgorICAgICAgICAgICAvLyB0aGUgZm9sbG93aW5nIGVycm9ycyBhcmUgbm90IG1hcmtlZCBpbiB0aGUgcmV0dXJuIHZhbHVlCisgICAgICAgICAgIHBhcmFtRGlkTm90Rml0ID8gQzJfT0sgOgorICAgICAgICAgICBwYXJhbVdhc0ludmFsaWQgPyBDMl9PSyA6IEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMkludGVyZmFjZUhlbHBlcjo6cXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIHJldHVybiBfbUZhY3RvcnktPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKHBhcmFtcyk7Cit9CisKKworYzJfc3RhdHVzX3QgQzJJbnRlcmZhY2VIZWxwZXI6OnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2sgX191bnVzZWQpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIGZvciAoQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5ICZxdWVyeSA6IGZpZWxkcykgeworICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgInF1ZXJ5aW5nIGZpZWxkICIgPDwgcXVlcnkuZmllbGQoKTsKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggaXggPSBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0SW5kZXgocXVlcnkuZmllbGQoKSk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gcGFyYW0gPSBfbUZhY3RvcnktPmdldFBhcmFtKGl4KTsKKyAgICAgICAgaWYgKCFwYXJhbSkgeworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJiYWQgcGFyYW0iOworICAgICAgICAgICAgcXVlcnkuc3RhdHVzID0gQzJfQkFEX0lOREVYOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IG9mZnMgPSBHZXRCYXNlT2Zmc2V0KAorICAgICAgICAgICAgICAgIG1SZWZsZWN0b3IsIGl4LAorICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQocXVlcnkuZmllbGQoKSkgLSBzaXplb2YoQzJQYXJhbSkpOworICAgICAgICBpZiAofm9mZnMgPT0gMCkgeworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJmaWVsZCBjb3VsZCBub3QgYmUgZm91bmQiOworICAgICAgICAgICAgcXVlcnkuc3RhdHVzID0gQzJfTk9UX0ZPVU5EOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgb2ZmcyArPSBzaXplb2YoQzJQYXJhbSk7CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiZmllbGQgcmVzb2x2ZWQgdG8gIgorICAgICAgICAgICAgICAgIDw8IFN0cmluZ1ByaW50ZigiQCUwMnp4KyUwMngiLCBvZmZzLCBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0U2l6ZShxdWVyeS5maWVsZCgpKSk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gZmllbGQgPQorICAgICAgICAgICAgcGFyYW0tPmZpbmRGaWVsZChvZmZzLCBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0U2l6ZShxdWVyeS5maWVsZCgpKSk7CisgICAgICAgIGlmICghZmllbGQpIHsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiYmFkIGZpZWxkIjsKKyAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX05PVF9GT1VORDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAqdmFsdWVzID0gbnVsbHB0cjsKKyAgICAgICAgc3dpdGNoIChxdWVyeS50eXBlKCkpIHsKKyAgICAgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkNVUlJFTlQ6CisgICAgICAgICAgICB2YWx1ZXMgPSBmaWVsZC0+Z2V0U3VwcG9ydGVkVmFsdWVzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBPU1NJQkxFOgorICAgICAgICAgICAgdmFsdWVzID0gZmllbGQtPmdldFBvc3NpYmxlVmFsdWVzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiYmFkIHF1ZXJ5IHR5cGU6ICIgPDwgcXVlcnkudHlwZSgpOworICAgICAgICAgICAgcXVlcnkuc3RhdHVzID0gQzJfQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZXMpIHsKKyAgICAgICAgICAgIHF1ZXJ5LnZhbHVlcyA9ICp2YWx1ZXM7CisgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9PSzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEMyX0xPRyhERUJVRykgPDwgIm5vIHZhbHVlcyBwdWJsaXNoZWQgYnkgY29tcG9uZW50IjsKKyAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gQzJJbnRlcmZhY2VIZWxwZXI6OmxvY2soKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4obU11dGV4KTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MySW50ZXJmYWNlVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZWM5MTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MySW50ZXJmYWNlVXRpbHMuY3BwCkBAIC0wLDAgKzEsMTI5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtcGFyYW1ldGVyIgorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLXZhcmlhYmxlIgorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLXZhbHVlIgorCisjZGVmaW5lIEMyX0xPR19WRVJCT1NFCisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKyNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlVXRpbHMuaD4KKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBfQzJGaWVsZElkICZpKTsKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW1GaWVsZCAmaSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJTdXBwb3J0ZWRSYW5nZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogSGVscGVyIGNsYXNzIGZvciBzdXBwb3J0ZWQgdmFsdWVzIHJhbmdlIGNhbGN1bGF0aW9ucy4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgYm9vbCBGUD1zdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZT4KK3N0cnVjdCBfQzJUeXBlZFN1cHBvcnRlZFJhbmdlSGVscGVyIHsKKyAgICAvKioKKyAgICAgKiB0eXBlIG9mIHJhbmdlIHNpemU6IGEgLSBiIGlmIGEgPj0gYiBhbmQgYSBhbmQgYiBhcmUgb2YgdHlwZSBUCisgICAgICovCisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Om1ha2VfdW5zaWduZWQ8VD46OnR5cGUgRGlmZlR5cGU7CisKKyAgICAvKioKKyAgICAgKiBjYWxjdWxhdGUgKGhpZ2ggLSBsb3cpIG1vZCBzdGVwCisgICAgICovCisgICAgc3RhdGljIERpZmZUeXBlIG1vZChUIGxvdywgVCBoaWdoLCBUIHN0ZXApIHsKKyAgICAgICAgcmV0dXJuIERpZmZUeXBlKGhpZ2ggLSBsb3cpICUgRGlmZlR5cGUoc3RlcCk7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBfQzJUeXBlZFN1cHBvcnRlZFJhbmdlSGVscGVyPFQsIHRydWU+IHsKKyAgICB0eXBlZGVmIFQgRGlmZlR5cGU7CisKKyAgICBzdGF0aWMgRGlmZlR5cGUgbW9kKFQgbG93LCBUIGhpZ2gsIFQgc3RlcCkgeworICAgICAgICByZXR1cm4gZm1vZChoaWdoIC0gbG93LCBzdGVwKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJTdXBwb3J0ZWRSYW5nZTxUPjo6QzJTdXBwb3J0ZWRSYW5nZShjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpIHsKKyAgICBpZiAodmFsdWVzLnR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UkFOR0UpIHsKKyAgICAgICAgX21NaW4gPSB2YWx1ZXMucmFuZ2UubWluLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgIF9tTWF4ID0gdmFsdWVzLnJhbmdlLm1heC5yZWY8VmFsdWVUeXBlPigpOworICAgICAgICBfbVN0ZXAgPSB2YWx1ZXMucmFuZ2Uuc3RlcC5yZWY8VmFsdWVUeXBlPigpOworICAgICAgICBfbU51bSA9IHZhbHVlcy5yYW5nZS5udW0ucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgX21EZW5vbSA9IHZhbHVlcy5yYW5nZS5kZW5vbS5yZWY8VmFsdWVUeXBlPigpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9tTWluID0gTUFYX1ZBTFVFOworICAgICAgICBfbU1heCA9IE1JTl9WQUxVRTsKKyAgICAgICAgX21TdGVwID0gTUlOX1NURVA7CisgICAgICAgIF9tTnVtID0gMDsKKyAgICAgICAgX21EZW5vbSA9IDA7CisgICAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBDMlN1cHBvcnRlZFJhbmdlPFQ+Ojpjb250YWlucyhUIHZhbHVlKSBjb25zdCB7CisgICAgLy8gdmFsdWUgbXVzdCBmYWxsIGJldHdlZW4gbWluIGFuZCBtYXgKKyAgICBpZiAodmFsdWUgPCBfbU1pbiB8fCB2YWx1ZSA+IF9tTWF4KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gc2ltcGxlIHJhbmdlcyBjb250YWluIGFsbCB2YWx1ZXMgYmV0d2VlbiBtaW4gYW5kIG1heAorICAgIGlmIChpc1NpbXBsZVJhbmdlKCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vIG1pbiBpcyBhbHdheXMgcGFydCBvZiB0aGUgcmFuZ2UKKyAgICBpZiAodmFsdWUgPT0gX21NaW4pIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vIHN0ZXBwZWQgcmFuZ2VzIHJlcXVpcmUgKHZhbCAtIG1pbikgJSBzdGVwIHRvIGJlIHplcm8KKyAgICBpZiAoaXNBcml0aG1ldGljU2VyaWVzKCkpIHsKKyAgICAgICAgcmV0dXJuIF9DMlR5cGVkU3VwcG9ydGVkUmFuZ2VIZWxwZXI8VD46Om1vZChfbU1pbiwgdmFsdWUsIF9tU3RlcCkgPT0gMDsKKyAgICB9CisgICAgLy8gcHVyZSBnZW9tZXRyaWMgc2VyaWVzIHJlcXVpcmUgKHZhbCAvIG1pbikgdG8gYmUgaW50ZWdlciBtdWx0aXBsZSBvZiAobnVtL2Rlbm9tKQorICAgIGlmIChpc0dlb21ldHJpY1NlcmllcygpKSB7CisgICAgICAgIGlmICh2YWx1ZSA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZG91YmxlIGxvZzJiYXNlID0gbG9nMihfbU51bSAvIF9tRGVub20pOworICAgICAgICBkb3VibGUgcG93ZXIgPSBsbHJvdW5kKGxvZzIodmFsdWUgLyBkb3VibGUoX21NaW4pKSAvIGxvZzJiYXNlKTsKKyAgICAgICAgLy8gVE9ETzogdmFsaWRhdGUgdGhhdCByZXN1bHQgZmFsbHMgd2l0aGluIHByZWNpc2lvbiAob3RoZXIgdGhhbiByb3VuZCkKKyAgICAgICAgcmV0dXJuIHZhbHVlID09IFQoX21NaW4gKiBwb3coX21OdW0gLyBfbURlbm9tLCBwb3dlcikgKyBNSU5fU1RFUCAvIDIpOworICAgIH0KKyAgICAvLyBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcyByZXF1aXJlIHZhbGlkYXRpbmcgYnkgd2Fsa2luZyB0aHJvdWdoIHRoZSBzZXJpZXMKKyAgICBpZiAoaXNNYWNTZXJpZXMoKSkgeworICAgICAgICBkb3VibGUgbGFzdFZhbHVlID0gX21NaW47CisgICAgICAgIGRvdWJsZSBiYXNlID0gX21OdW0gLyBfbURlbm9tOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgLy8gdGhpcyBjYXN0IGlzIHNhZmUgYXMgX21NaW4gPD0gbGFzdFZhbHVlIDw9IF9tTWF4CisgICAgICAgICAgICBpZiAoVChsYXN0VmFsdWUgKyBNSU5fU1RFUCAvIDIpID09IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkb3VibGUgbmV4dFZhbHVlID0gZm1hKGxhc3RWYWx1ZSwgYmFzZSwgX21TdGVwKTsKKyAgICAgICAgICAgIGlmIChuZXh0VmFsdWUgPD0gbGFzdFZhbHVlIHx8IG5leHRWYWx1ZSA+IF9tTWF4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBzZXJpZXMgaXMgbm8gbG9uZ2VyIG1vbm90b25pYyBvciB3aXRoaW4gcmFuZ2UKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3RWYWx1ZSA9IG5leHRWYWx1ZTsKKyAgICAgICAgfTsKKyAgICB9CisgICAgLy8gaWYgd2UgYXJlIGhlcmUsIHRoaXMgbXVzdCBiZSBhbiBpbnZhbGlkIHJhbmdlCisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJTdXBwb3J0ZWRSYW5nZTxUPiBDMlN1cHBvcnRlZFJhbmdlPFQ+OjpsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpIGNvbnN0IHsKKyAgICAvLyBUT0RPIC0gdGhpcyBvbmx5IHdvcmtzIGZvciBzaW1wbGUgcmFuZ2VzCisgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2Uoc3RkOjptYXgoX21NaW4sIGxpbWl0Ll9tTWluKSwgc3RkOjptaW4oX21NYXgsIGxpbWl0Ll9tTWF4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWF4KF9tU3RlcCwgbGltaXQuX21TdGVwKSk7Cit9CisKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8dWludDhfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPGNoYXI+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTxpbnQzMl90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8dWludDMyX3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPGMyX2NudHIzMl90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8aW50NjRfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPHVpbnQ2NF90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTxjMl9jbnRyNjRfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPGZsb2F0PjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJTdXBwb3J0ZWRGbGFncyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIE9yZGVyZWQgc3VwcG9ydGVkIGZsYWcgc2V0IGZvciBhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZS4KKyAqLworLy8gZmxvYXQgZmxhZ3MgYXJlIG5vdCBzdXBwb3J0ZWQsIGJ1dCBkZWZpbmUgYSBmZXcgbWV0aG9kcyB0byBzdXBwb3J0IGdlbmVyaWMgc3VwcG9ydGVkIHZhbHVlcyBjb2RlCit0ZW1wbGF0ZTw+Citib29sIEMyU3VwcG9ydGVkRmxhZ3M8ZmxvYXQ+Ojpjb250YWlucyhmbG9hdCB2YWx1ZSkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGU8PgorY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+IEMyU3VwcG9ydGVkRmxhZ3M8ZmxvYXQ+OjpmbGFncygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8ZmxvYXQ+KCk7Cit9CisKK3RlbXBsYXRlPD4KK0MyU3VwcG9ydGVkRmxhZ3M8ZmxvYXQ+IEMyU3VwcG9ydGVkRmxhZ3M8ZmxvYXQ+OjpsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD4gJmxpbWl0KSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB2YWx1ZXM7CisgICAgcmV0dXJuIEMyU3VwcG9ydGVkRmxhZ3Moc3RkOjptb3ZlKHZhbHVlcykpOworfQorCit0ZW1wbGF0ZTw+CitmbG9hdCBDMlN1cHBvcnRlZEZsYWdzPGZsb2F0Pjo6bWluKCkgY29uc3QgeworICAgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBDMlN1cHBvcnRlZEZsYWdzPFQ+Ojpjb250YWlucyhUIHZhbHVlKSBjb25zdCB7CisgICAgLy8gdmFsdWUgbXVzdCBjb250YWluIHRoZSBtaW5pbWFsIG1hc2sKKyAgICBUIG1pbk1hc2sgPSBtaW4oKTsKKyAgICBpZiAofnZhbHVlICYgbWluTWFzaykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZhbHVlICY9IH5taW5NYXNrOworICAgIC8vIG90aGVyd2lzZSwgcmVtb3ZlIGZsYWdzIGZyb20gdmFsdWUgYW5kIHNlZSBpZiB3ZSBhcnJpdmUgYXQgMAorICAgIGZvciAoY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZ2IDogX21WYWx1ZXMpIHsKKyAgICAgICAgaWYgKHZhbHVlID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgofnZhbHVlICYgdi5yZWY8VmFsdWVUeXBlPigpKSA9PSAwKSB7CisgICAgICAgICAgICB2YWx1ZSAmPSB+di5yZWY8VmFsdWVUeXBlPigpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB2YWx1ZSA9PSAwOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY29uc3Qgc3RkOjp2ZWN0b3I8VD4gQzJTdXBwb3J0ZWRGbGFnczxUPjo6ZmxhZ3MoKSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8VD4gdmFscyhjMl9tYXgoX21WYWx1ZXMuc2l6ZSgpLCAxdSkgLSAxKTsKKyAgICBpZiAoIV9tVmFsdWVzLmVtcHR5KCkpIHsKKyAgICAgICAgc3RkOjp0cmFuc2Zvcm0oX21WYWx1ZXMuY2JlZ2luKCkgKyAxLCBfbVZhbHVlcy5jZW5kKCksIHZhbHMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKS0+VCB7CisgICAgICAgICAgICByZXR1cm4gcC5yZWY8VmFsdWVUeXBlPigpOworICAgICAgICB9KTsKKyAgICB9CisgICAgcmV0dXJuIHZhbHM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlN1cHBvcnRlZEZsYWdzPFQ+IEMyU3VwcG9ydGVkRmxhZ3M8VD46OmxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZsaW1pdCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gdmFsdWVzID0gX21WYWx1ZXM7IC8vIG1ha2UgYSBjb3B5CisgICAgVCBtaW5NYXNrID0gbWluKCkgfCBsaW1pdC5taW4oKTsKKyAgICAvLyBtaW5pbXVtIG1hc2sgbXVzdCBiZSBjb3ZlcmVkIGJ5IGJvdGggdGhpcyBhbmQgb3RoZXIKKyAgICBpZiAobGltaXQuY29udGFpbnMobWluTWFzaykgJiYgY29udGFpbnMobWluTWFzaykpIHsKKyAgICAgICAgdmFsdWVzWzBdID0gbWluTWFzazsKKyAgICAgICAgLy8ga2VlcCBvbmx5IGZsYWdzIHRoYXQgYXJlIGNvdmVyZWQgYnkgbGltaXQKKyAgICAgICAgc3RkOjpyZW1vdmVfaWYodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSwgWyZsaW1pdCwgbWluTWFza10oY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZ2KSAtPiBib29sIHsKKyAgICAgICAgICAgIFQgdmFsdWUgPSB2LnJlZjxWYWx1ZVR5cGU+KCkgfCBtaW5NYXNrOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09IG1pbk1hc2sgfHwgIWxpbWl0LmNvbnRhaW5zKHZhbHVlKTsgfSk7CisgICAgICAgIC8vIHdlIGFsc28gbmVlZCB0byBkbyBpdCB2aWNlIHZlcnNhCisgICAgICAgIGZvciAoY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZ2IDogX21WYWx1ZXMpIHsKKyAgICAgICAgICAgIFQgdmFsdWUgPSB2LnJlZjxWYWx1ZVR5cGU+KCkgfCBtaW5NYXNrOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG1pbk1hc2sgJiYgY29udGFpbnModmFsdWUpKSB7CisgICAgICAgICAgICAgICAgdmFsdWVzLmVtcGxhY2VfYmFjaygoVmFsdWVUeXBlKXZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQzJTdXBwb3J0ZWRGbGFncyhzdGQ6Om1vdmUodmFsdWVzKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitUIEMyU3VwcG9ydGVkRmxhZ3M8VD46Om1pbigpIGNvbnN0IHsKKyAgICBpZiAoIV9tVmFsdWVzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIF9tVmFsdWVzLmZyb250KCkudGVtcGxhdGUgcmVmPFZhbHVlVHlwZT4oKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gVCgwKTsKKyAgICB9Cit9CisKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8dWludDhfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPGNoYXI+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczxpbnQzMl90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8dWludDMyX3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPGMyX2NudHIzMl90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8aW50NjRfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPHVpbnQ2NF90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczxjMl9jbnRyNjRfdD47CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyU3VwcG9ydGVkVmFsdWVTZXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBPcmRlcmVkIHN1cHBvcnRlZCB2YWx1ZSBzZXQgZm9yIGEgZmllbGQgb2YgYSBnaXZlbiB0eXBlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+Ojpjb250YWlucyhUIHZhbHVlKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6ZmluZF9pZihfbVZhbHVlcy5jYmVnaW4oKSwgX21WYWx1ZXMuY2VuZCgpLAorICAgICAgICAgICAgW3ZhbHVlXShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApIC0+IGJvb2wgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PSBwLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgICAgICB9KSAhPSBfbVZhbHVlcy5jZW5kKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46OmxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZsaW1pdCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gdmFsdWVzID0gX21WYWx1ZXM7IC8vIG1ha2UgYSBjb3B5CisgICAgc3RkOjpyZW1vdmVfaWYodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSwgWyZsaW1pdF0oY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZ2KSAtPiBib29sIHsKKyAgICAgICAgcmV0dXJuICFsaW1pdC5jb250YWlucyh2LnJlZjxWYWx1ZVR5cGU+KCkpOyB9KTsKKyAgICByZXR1cm4gQzJTdXBwb3J0ZWRWYWx1ZVNldChzdGQ6Om1vdmUodmFsdWVzKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46OmxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZsaW1pdCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gdmFsdWVzID0gX21WYWx1ZXM7IC8vIG1ha2UgYSBjb3B5CisgICAgc3RkOjpyZW1vdmVfaWYodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSwgWyZsaW1pdF0oY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZ2KSAtPiBib29sIHsKKyAgICAgICAgcmV0dXJuICFsaW1pdC5jb250YWlucyh2LnJlZjxWYWx1ZVR5cGU+KCkpOyB9KTsKKyAgICByZXR1cm4gQzJTdXBwb3J0ZWRWYWx1ZVNldChzdGQ6Om1vdmUodmFsdWVzKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46OmxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZsaW1pdCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gdmFsdWVzID0gX21WYWx1ZXM7IC8vIG1ha2UgYSBjb3B5CisgICAgc3RkOjpyZW1vdmVfaWYodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSwgWyZsaW1pdF0oY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZ2KSAtPiBib29sIHsKKyAgICAgICAgcmV0dXJuICFsaW1pdC5jb250YWlucyh2LnJlZjxWYWx1ZVR5cGU+KCkpOyB9KTsKKyAgICByZXR1cm4gQzJTdXBwb3J0ZWRWYWx1ZVNldChzdGQ6Om1vdmUodmFsdWVzKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdCBzdGQ6OnZlY3RvcjxUPiBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+Ojp2YWx1ZXMoKSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8VD4gdmFscyhfbVZhbHVlcy5zaXplKCkpOworICAgIHN0ZDo6dHJhbnNmb3JtKF9tVmFsdWVzLmNiZWdpbigpLCBfbVZhbHVlcy5jZW5kKCksIHZhbHMuYmVnaW4oKSwgW10oY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKSAtPiBUIHsKKyAgICAgICAgcmV0dXJuIHAucmVmPFZhbHVlVHlwZT4oKTsKKyAgICB9KTsKKyAgICByZXR1cm4gdmFsczsKK30KKwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDx1aW50OF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8Y2hhcj47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PGludDMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDx1aW50MzJfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8YzJfY250cjMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDxpbnQ2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDY0X3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PGMyX2NudHI2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8ZmxvYXQ+OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46OkltcGwgeworICAgIEltcGwoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKQorICAgICAgICA6IF9tVHlwZSh2YWx1ZXMudHlwZSksCisgICAgICAgICAgX21SYW5nZSh2YWx1ZXMpLAorICAgICAgICAgIF9tVmFsdWVzKHZhbHVlcyksCisgICAgICAgICAgX21GbGFncyh2YWx1ZXMpIHsgfQorCisgICAgYm9vbCBzdXBwb3J0cyhUIHZhbHVlKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OlZhbHVlVHlwZSBWYWx1ZVR5cGU7CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90IF9tVHlwZTsKKyAgICBDMlN1cHBvcnRlZFJhbmdlPFZhbHVlVHlwZT4gX21SYW5nZTsKKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFZhbHVlVHlwZT4gX21WYWx1ZXM7CisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldDxWYWx1ZVR5cGU+IF9tRmxhZ3M7CisKKy8vICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwgPFQ+KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46OkltcGwgJmkpOworLy8gICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBJbXBsICZpKTsKKyAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbU91dChzdGQ6Om9zdHJlYW0mIG9zKSBjb25zdDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46OkltcGw6OnN1cHBvcnRzKFQgdmFsdWUpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKF9tVHlwZSkgeworICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJBTkdFOiByZXR1cm4gX21SYW5nZS5jb250YWlucyh2YWx1ZSk7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6VkFMVUVTOiByZXR1cm4gX21WYWx1ZXMuY29udGFpbnModmFsdWUpOworICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OkZMQUdTOiByZXR1cm4gX21GbGFncy5jb250YWlucyh2YWx1ZSk7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+OjpDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcykKKyAgICA6IF9tSW1wbChzdGQ6Om1ha2VfdW5pcXVlPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46OkltcGw+KHZhbHVlcykpIHsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6fkMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIoKSA9IGRlZmF1bHQ7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46OnN1cHBvcnRzKFQgdmFsdWUpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5zdXBwb3J0cyh2YWx1ZSk7Cit9CisKK3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDhfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGNoYXI+OwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxpbnQzMl90PjsKK3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDMyX3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGMyX2NudHIzMl90PjsKK3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8aW50NjRfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPHVpbnQ2NF90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxjMl9jbnRyNjRfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGZsb2F0PjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OkltcGwgeworICAgIEltcGwoY29uc3QgQzJQYXJhbUZpZWxkICZmaWVsZCkKKyAgICAgICAgOiBfbVBhcmFtRmllbGQoZmllbGQpLAorICAgICAgICAgIF9tVHlwZSh0eXBlX3Q6OlJBTkdFKSwKKyAgICAgICAgICBfbURlZmluZWQoZmFsc2UpLAorICAgICAgICAgIF9tUmFuZ2UoQzJTdXBwb3J0ZWRSYW5nZTxUPjo6QW55KCkpLAorICAgICAgICAgIF9tVmFsdWVzKEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46Ok5vbmUoKSksCisgICAgICAgICAgX21GbGFncyhDMlN1cHBvcnRlZEZsYWdzPFQ+OjpOb25lKCkpIHsgfQorCisgICAgLyoqCisgICAgICogR2V0IEMyUGFyYW1GaWVsZFZhbHVlcyBmcm9tIHRoaXMgYnVpbGRlci4KKyAgICAgKi8KKyAgICBvcGVyYXRvciBDMlBhcmFtRmllbGRWYWx1ZXMoKSBjb25zdCB7CisgICAgICAgIGlmICghX21EZWZpbmVkKSB7CisgICAgICAgICAgICByZXR1cm4gQzJQYXJhbUZpZWxkVmFsdWVzKF9tUGFyYW1GaWVsZCk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChfbVR5cGUpIHsKKyAgICAgICAgY2FzZSB0eXBlX3Q6OkVNUFRZOgorICAgICAgICBjYXNlIHR5cGVfdDo6VkFMVUVTOgorICAgICAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZFZhbHVlcyhfbVBhcmFtRmllbGQsIChDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKV9tVmFsdWVzKTsKKyAgICAgICAgY2FzZSB0eXBlX3Q6OlJBTkdFOgorICAgICAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZFZhbHVlcyhfbVBhcmFtRmllbGQsIChDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKV9tUmFuZ2UpOworICAgICAgICBjYXNlIHR5cGVfdDo6RkxBR1M6CisgICAgICAgICAgICByZXR1cm4gQzJQYXJhbUZpZWxkVmFsdWVzKF9tUGFyYW1GaWVsZCwgKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMpX21GbGFncyk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBUUkVTUEFTUworICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGdldCBoZXJlCisgICAgICAgICAgICByZXR1cm4gQzJQYXJhbUZpZWxkVmFsdWVzKF9tUGFyYW1GaWVsZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogRGVmaW5lIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFzIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBvZiB0aGlzIGJ1aWxkZXIuICovCisgICAgdm9pZCBhbnkoKSB7CisgICAgICAgIF9tRGVmaW5lZCA9IHRydWU7CisgICAgfQorCisgICAgLyoqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIG5vbmUuICovCisgICAgdm9pZCBub25lKCkgeworICAgICAgICBfbURlZmluZWQgPSB0cnVlOworICAgICAgICBfbVR5cGUgPSB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgX21WYWx1ZXMuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvKiogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gfHZhbHVlfCBhbG9uZS4gKi8KKyAgICB2b2lkIGVxdWFsVG8oVCB2YWx1ZSkgeworICAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6T25lT2Yoe3ZhbHVlfSkpOworICAgIH0KKworICAgIC8qKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBhIHZhbHVlIHNldC4gKi8KKyAgICB2b2lkIGxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmbGltaXQpIHsKKyAgICAgICAgaWYgKCFfbURlZmluZWQpIHsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiTkEubGltaXRUbygiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKworICAgICAgICAgICAgLy8gc2hvcnRjdXQgZm9yIGZpcnN0IGxpbWl0IGFwcGxpZWQKKyAgICAgICAgICAgIF9tRGVmaW5lZCA9IHRydWU7CisgICAgICAgICAgICBfbVZhbHVlcyA9IGxpbWl0OworICAgICAgICAgICAgX21UeXBlID0gX21WYWx1ZXMuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6VkFMVUVTOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dpdGNoIChfbVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpFTVBUWToKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpWQUxVRVM6CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIoIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tVmFsdWVzKSA8PCAiKS5saW1pdFRvKCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKworICAgICAgICAgICAgICAgIF9tVmFsdWVzID0gX21WYWx1ZXMubGltaXRlZFRvKGxpbWl0KTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbVZhbHVlcy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpWQUxVRVM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6UkFOR0U6CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIoIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tUmFuZ2UpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgX21WYWx1ZXMgPSBsaW1pdC5saW1pdGVkVG8oX21SYW5nZSk7CisgICAgICAgICAgICAgICAgX21UeXBlID0gX21WYWx1ZXMuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6VkFMVUVTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OkZMQUdTOgorICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVJhbmdlKSA8PCAiKS5saW1pdFRvKCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKworICAgICAgICAgICAgICAgIF9tVmFsdWVzID0gbGltaXQubGltaXRlZFRvKF9tRmxhZ3MpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tVmFsdWVzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQzJfTE9HKEZBVEFMKTsgLy8gc2hvdWxkIG5vdCBiZSBoZXJlCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IGZsYWdzCisgICAgICAgIH0KKyAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIgPSAiIDw8IF9tVHlwZSA8PCAiOiIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVZhbHVlcyk7CisgICAgfQorCisgICAgLyoqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGEgZmxhZyBzZXQuICovCisgICAgdm9pZCBsaW1pdFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8VD4gJmxpbWl0KSB7CisgICAgICAgIGlmICghX21EZWZpbmVkKSB7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIk5BLmxpbWl0VG8oIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgIC8vIHNob3J0Y3V0IGZvciBmaXJzdCBsaW1pdCBhcHBsaWVkCisgICAgICAgICAgICBfbURlZmluZWQgPSB0cnVlOworICAgICAgICAgICAgX21GbGFncyA9IGxpbWl0OworICAgICAgICAgICAgX21UeXBlID0gX21GbGFncy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpGTEFHUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX21UeXBlKSB7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6RU1QVFk6CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6VkFMVUVTOgorICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVZhbHVlcykgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBfbVZhbHVlcyA9IF9tVmFsdWVzLmxpbWl0ZWRUbyhsaW1pdCk7CisgICAgICAgICAgICAgICAgX21UeXBlID0gX21WYWx1ZXMuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6VkFMVUVTOworICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiID0gIiA8PCBfbVR5cGUgPDwgIjoiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21WYWx1ZXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OkZMQUdTOgorICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbUZsYWdzKSA8PCAiKS5saW1pdFRvKCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKworICAgICAgICAgICAgICAgIF9tRmxhZ3MgPSBfbUZsYWdzLmxpbWl0ZWRUbyhsaW1pdCk7CisgICAgICAgICAgICAgICAgX21UeXBlID0gX21GbGFncy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpGTEFHUzsKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIiA9ICIgPDwgX21UeXBlIDw8ICI6IiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tRmxhZ3MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OlJBTkdFOgorICAgICAgICAgICAgICAgIEMyX0xPRyhGQVRBTCkgPDwgImxpbWl0aW5nIHJhbmdlcyB0byBmbGFncyBpcyBub3Qgc3VwcG9ydGVkIjsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSB0eXBlX3Q6OkVNUFRZOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBDMl9MT0coRkFUQUwpOyAvLyBzaG91bGQgbm90IGJlIGhlcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgbGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZsaW1pdCkgeworICAgICAgICBpZiAoIV9tRGVmaW5lZCkgeworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJOQS5saW1pdFRvKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAvLyBzaG9ydGN1dCBmb3IgZmlyc3QgbGltaXQgYXBwbGllZAorICAgICAgICAgICAgX21EZWZpbmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIF9tUmFuZ2UgPSBsaW1pdDsKKyAgICAgICAgICAgIF9tVHlwZSA9IF9tUmFuZ2UuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6UkFOR0U7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIiA9ICIgPDwgX21UeXBlIDw8ICI6IiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tUmFuZ2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dpdGNoIChfbVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpFTVBUWToKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpWQUxVRVM6CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIoIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tVmFsdWVzKSA8PCAiKS5saW1pdFRvKCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBfbVZhbHVlcyA9IF9tVmFsdWVzLmxpbWl0ZWRUbyhsaW1pdCk7CisgICAgICAgICAgICAgICAgX21UeXBlID0gX21WYWx1ZXMuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6VkFMVUVTOworICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiID0gIiA8PCBfbVR5cGUgPDwgIjoiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21WYWx1ZXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OkZMQUdTOgorICAgICAgICAgICAgICAgIEMyX0xPRyhGQVRBTCkgPDwgImxpbWl0aW5nIGZsYWdzIHRvIHJhbmdlcyBpcyBub3Qgc3VwcG9ydGVkIjsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSB0eXBlX3Q6OkVNUFRZOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OlJBTkdFOgorICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVJhbmdlKSA8PCAiKS5saW1pdFRvKCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBfbVJhbmdlID0gX21SYW5nZS5saW1pdGVkVG8obGltaXQpOworICAgICAgICAgICAgICAgIEMyX0RDSEVDSyhfbVZhbHVlcy5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tUmFuZ2UuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6UkFOR0U7CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIgPSAiIDw8IF9tVHlwZSA8PCAiOiIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVJhbmdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQzJfTE9HKEZBVEFMKTsgLy8gc2hvdWxkIG5vdCBiZSBoZXJlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgdm9pZCBpbnN0YW50aWF0ZSgpIF9fdW51c2VkIHsKKyAgICAgICAgKHZvaWQpX21WYWx1ZXMudmFsdWVzKCk7IC8vIGluc3RhbnRpYXRlIG5vbi1jb25zdCB2YWx1ZXMoKQorICAgIH0KKworICAgIHZvaWQgaW5zdGFudGlhdGUoKSBjb25zdCBfX3VudXNlZCB7CisgICAgICAgICh2b2lkKV9tVmFsdWVzLnZhbHVlcygpOyAvLyBpbnN0YW50aWF0ZSBjb25zdCB2YWx1ZXMoKQorICAgIH0KKworICAgIHR5cGVkZWYgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90IHR5cGVfdDsKKworICAgIEMyUGFyYW1GaWVsZCBfbVBhcmFtRmllbGQ7CisgICAgdHlwZV90IF9tVHlwZTsKKyAgICBib29sIF9tRGVmaW5lZDsKKyAgICBDMlN1cHBvcnRlZFJhbmdlPFQ+IF9tUmFuZ2U7CisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBfbVZhbHVlczsKKyAgICBDMlN1cHBvcnRlZEZsYWdzPFQ+IF9tRmxhZ3M7CisKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpvcGVyYXRvciBDMlBhcmFtRmllbGRWYWx1ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIChDMlBhcmFtRmllbGRWYWx1ZXMpKCpfbUltcGwuZ2V0KCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6QzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcihjb25zdCBDMlBhcmFtRmllbGQgJmZpZWxkKQorICAgIDogX21JbXBsKHN0ZDo6bWFrZV91bmlxdWU8QzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6SW1wbD4oZmllbGQpKSB7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OmFueSgpIHsKKyAgICBfbUltcGwtPmFueSgpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46Om5vbmUoKSB7CisgICAgX21JbXBsLT5ub25lKCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6ZXF1YWxUbyhUIHZhbHVlKSB7CisgICAgX21JbXBsLT5lcXVhbFRvKHZhbHVlKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpsaW1pdFRvKGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gJmxpbWl0KSB7CisgICAgX21JbXBsLT5saW1pdFRvKGxpbWl0KTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpsaW1pdFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8VD4gJmxpbWl0KSB7CisgICAgX21JbXBsLT5saW1pdFRvKGxpbWl0KTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpsaW1pdFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KSB7CisgICAgX21JbXBsLT5saW1pdFRvKGxpbWl0KTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyKGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm90aGVyKQorICAgIDogX21JbXBsKHN0ZDo6bWFrZV91bmlxdWU8QzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6SW1wbD4oKm90aGVyLl9tSW1wbC5nZXQoKSkpIHsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6b3BlcmF0b3I9KAorICAgICAgICBjb25zdCBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZvdGhlcikgeworICAgIF9tSW1wbCA9IHN0ZDo6bWFrZV91bmlxdWU8QzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6SW1wbD4oKm90aGVyLl9tSW1wbC5nZXQoKSk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6fkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIoKSA9IGRlZmF1bHQ7CisKK3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8dWludDhfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPGNoYXI+OwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxpbnQzMl90PjsKK3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8dWludDMyX3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPGMyX2NudHIzMl90PjsKK3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8aW50NjRfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPHVpbnQ2NF90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxjMl9jbnRyNjRfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPGZsb2F0PjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlNldHRpbmdSZXN1bHRCdWlsZGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlcjo6QzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlcigpIDogX21Db25mbGljdHMoKSB7IH0KKworQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlcjo6QzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlcihDMlBhcmFtRmllbGRWYWx1ZXMgJiZjb25mbGljdCkgeworICAgIF9tQ29uZmxpY3RzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoY29uZmxpY3QpKTsKK30KKworQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlciYgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlcjo6d2l0aChDMlBhcmFtRmllbGRWYWx1ZXMgJiZjb25mbGljdCkgeworICAgIF9tQ29uZmxpY3RzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoY29uZmxpY3QpKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3N0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlcjo6cmV0cmlldmVDb25mbGljdHMoKSB7CisgICAgcmV0dXJuIHN0ZDo6bW92ZShfbUNvbmZsaWN0cyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJTZXR0aW5nUmVzdWx0L3NCdWlsZGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworQzJTZXR0aW5nUmVzdWx0IEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OlJlYWRPbmx5KGNvbnN0IEMyUGFyYW1GaWVsZCAmcGFyYW0pIHsKKyAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0IHsgQzJTZXR0aW5nUmVzdWx0OjpSRUFEX09OTFksIHsgcGFyYW0gfSwgeyB9IH07Cit9CisKK0MyU2V0dGluZ1Jlc3VsdCBDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtRmllbGQsIGJvb2wgaXNJbmZvKSB7CisgICAgcmV0dXJuIHsgaXNJbmZvID8gQzJTZXR0aW5nUmVzdWx0OjpJTkZPX0JBRF9WQUxVRSA6IEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1ZBTFVFLAorICAgICAgICAgICAgIHsgcGFyYW1GaWVsZCB9LCB7IH0gfTsKK30KKworQzJTZXR0aW5nUmVzdWx0IEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkNvbmZsaWN0KAorICAgICAgICBDMlBhcmFtRmllbGRWYWx1ZXMgJiZwYXJhbUZpZWxkVmFsdWVzLCBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyICZjb25mbGljdHMsIGJvb2wgaXNJbmZvKSB7CisgICAgQzJfQ0hFQ0soIWNvbmZsaWN0cy5lbXB0eSgpKTsKKyAgICBpZiAoaXNJbmZvKSB7CisgICAgICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHQgeworICAgICAgICAgICAgQzJTZXR0aW5nUmVzdWx0OjpJTkZPX0NPTkZMSUNULAorICAgICAgICAgICAgc3RkOjptb3ZlKHBhcmFtRmllbGRWYWx1ZXMpLCBjb25mbGljdHMucmV0cmlldmVDb25mbGljdHMoKQorICAgICAgICB9OworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHQgeworICAgICAgICAgICAgQzJTZXR0aW5nUmVzdWx0OjpDT05GTElDVCwKKyAgICAgICAgICAgIHN0ZDo6bW92ZShwYXJhbUZpZWxkVmFsdWVzKSwgY29uZmxpY3RzLnJldHJpZXZlQ29uZmxpY3RzKCkKKyAgICAgICAgfTsKKyAgICB9Cit9CisKK0MyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyOjpDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMlNldHRpbmdSZXN1bHQgJiZyZXN1bHQpCisgICAgICAgIDogX21TdGF0dXMoQzJfQkFEX1ZBTFVFKSB7CisgICAgX21SZXN1bHRzLmVtcGxhY2VfYmFjayhuZXcgQzJTZXR0aW5nUmVzdWx0KHN0ZDo6bW92ZShyZXN1bHQpKSk7Cit9CisKK0MyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyOjpwbHVzKEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyJiYgcmVzdWx0cykgeworICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4gJnIgOiByZXN1bHRzLl9tUmVzdWx0cykgeworICAgICAgICBfbVJlc3VsdHMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShyKSk7CisgICAgfQorICAgIHJlc3VsdHMuX21SZXN1bHRzLmNsZWFyKCk7CisgICAgLy8gVE9ETzogbVN0YXR1cworICAgIHJldHVybiBzdGQ6Om1vdmUoKnRoaXMpOworfQorCitjMl9zdGF0dXNfdCBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcjo6cmV0cmlldmVGYWlsdXJlcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgeworICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4gJnIgOiBfbVJlc3VsdHMpIHsKKyAgICAgICAgZmFpbHVyZXMtPmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUocikpOworICAgIH0KKyAgICBfbVJlc3VsdHMuY2xlYXIoKTsKKyAgICByZXR1cm4gX21TdGF0dXM7Cit9CisKK0MyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyOjpDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihjMl9zdGF0dXNfdCBzdGF0dXMpIDogX21TdGF0dXMoc3RhdHVzKSB7CisgICAgLy8gc3RhdHVzIG11c3QgYmUgb25lIG9mIE9LLCBCQURfU1RBVEUsIFRJTUVEX09VVCBvciBDT1JSVVBURUQKKyAgICAvLyBtYWlubHk6IEJMT0NLSU5HLCBCQURfSU5ERVgsIEJBRF9WQUxVRSBhbmQgTk9fTUVNT1JZIHJlcXVpcmVzIGEgc2V0dGluZyBhdHRlbXB0Cit9CisKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkVXRpbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgQzJfSElERSBDMkZpZWxkVXRpbHM6Ol9JbnNwZWN0b3IgeworICAgIC8vLyByZXR1cm5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvYmplY3QKKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJbmZvOjpJbXBsPiBHZXRJbXBsKGNvbnN0IEluZm8gJmluZm8pIHsKKyAgICAgICAgcmV0dXJuIGluZm8uX21JbXBsOworICAgIH0KK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzOjpJbmZvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IEMyX0hJREUgQzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsIHsKKyAgICBDMkZpZWxkRGVzY3JpcHRvciBmaWVsZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gcGFyZW50OworICAgIHVpbnQzMl90IGluZGV4OworICAgIHVpbnQzMl90IGRlcHRoOworICAgIHVpbnQzMl90IGJhc2VGaWVsZE9mZnNldDsKKyAgICB1aW50MzJfdCBhcnJheU9mZnNldDsKKyAgICB1aW50MzJfdCB1c2VkRXh0ZW50OworCisgICAgLy8vIGNyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgb2JqZWN0IGluY2x1ZGluZyBjb3BpZXMgb2YgaXRzIHBhcmVudCBjaGFpbgorICAgIEltcGwgY2xvbmUoKSBjb25zdDsKKworICAgIC8vLyBjcmVhdGVzIGEgY29weSBvZiBhIHNoYXJlZCBwb2ludGVyIHRvIGFuIG9iamVjdAorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gQ2xvbmUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEltcGw+ICYpOworCisgICAgSW1wbChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmllbGRfLCBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gcGFyZW50XywKKyAgICAgICAgICAgIHVpbnQzMl90IGluZGV4XywgdWludDMyX3QgZGVwdGhfLCB1aW50MzJfdCBiYXNlRmllbGRPZmZzZXRfLAorICAgICAgICAgICAgdWludDMyX3QgYXJyYXlPZmZzZXRfLCB1aW50MzJfdCB1c2VkRXh0ZW50XykKKyAgICAgICAgOiBmaWVsZChmaWVsZF8pLCBwYXJlbnQocGFyZW50XyksIGluZGV4KGluZGV4XyksIGRlcHRoKGRlcHRoXyksCisgICAgICAgICAgYmFzZUZpZWxkT2Zmc2V0KGJhc2VGaWVsZE9mZnNldF8pLCBhcnJheU9mZnNldChhcnJheU9mZnNldF8pLCB1c2VkRXh0ZW50KHVzZWRFeHRlbnRfKSB7IH0KK307CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbDo6Q2xvbmUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEltcGw+ICZpbmZvKSB7CisgICAgaWYgKGluZm8pIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oaW5mby0+Y2xvbmUoKSk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitDMkZpZWxkVXRpbHM6OkluZm86OkltcGwgQzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsOjpjbG9uZSgpIGNvbnN0IHsKKyAgICBJbXBsIHJlcyA9IEltcGwoKnRoaXMpOworICAgIHJlcy5wYXJlbnQgPSBDbG9uZShyZXMucGFyZW50KTsKKyAgICByZXR1cm4gcmVzOworfQorCitDMkZpZWxkVXRpbHM6OkluZm86OkluZm8oc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwpCisgICAgOiBfbUltcGwoaW1wbCkgeyB9CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OmFycmF5T2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmFycmF5T2Zmc2V0OworfQorCitzaXplX3QgQzJGaWVsZFV0aWxzOjpJbmZvOjphcnJheVNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIGV4dGVudCgpICogc2l6ZSgpOworfQorCitzaXplX3QgQzJGaWVsZFV0aWxzOjpJbmZvOjpiYXNlRmllbGRPZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+YmFzZUZpZWxkT2Zmc2V0OworfTsKKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6ZGVwdGgoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+ZGVwdGg7Cit9CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OmV4dGVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT51c2VkRXh0ZW50OworfQorCitzaXplX3QgQzJGaWVsZFV0aWxzOjpJbmZvOjppbmRleCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5pbmRleDsKK30KKworYm9vbCBDMkZpZWxkVXRpbHM6OkluZm86OmlzQXJpdGhtZXRpYygpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKF9tSW1wbC0+ZmllbGQudHlwZSgpKSB7CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6QkxPQjoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSMzI6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjY0OgorICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkZMT0FUOgorICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOgorICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OgorICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlNUUklORzoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UMzI6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDY0OgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIEMyRmllbGRVdGlsczo6SW5mbzo6aXNGbGV4aWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5maWVsZC5leHRlbnQoKSA9PSAwOworfQorCitDMlN0cmluZyBDMkZpZWxkVXRpbHM6OkluZm86Om5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+ZmllbGQubmFtZSgpOworfQorCitjb25zdCBDMkZpZWxkVXRpbHM6OkluZm86Ok5hbWVkVmFsdWVzVHlwZSAmQzJGaWVsZFV0aWxzOjpJbmZvOjpuYW1lZFZhbHVlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5maWVsZC5uYW1lZFZhbHVlcygpOworfQorCitzaXplX3QgQzJGaWVsZFV0aWxzOjpJbmZvOjpvZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoX21JbXBsLT5maWVsZCk7Cit9CisKK0MyRmllbGRVdGlsczo6SW5mbyBDMkZpZWxkVXRpbHM6OkluZm86OnBhcmVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5mbyhfbUltcGwtPnBhcmVudCk7Cit9OworCitzaXplX3QgQzJGaWVsZFV0aWxzOjpJbmZvOjpzaXplKCkgY29uc3QgeworICAgIHJldHVybiBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0U2l6ZShfbUltcGwtPmZpZWxkKTsKK30KKworQzJGaWVsZFV0aWxzOjpJbmZvOjp0eXBlX3QgQzJGaWVsZFV0aWxzOjpJbmZvOjp0eXBlKCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmZpZWxkLnR5cGUoKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IEMyX0hJREUgQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbCA6IHB1YmxpYyBfQzJQYXJhbUluc3BlY3RvciB7CisgICAgSW1wbCgpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgfkltcGwoKSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gaW1wbGVtZW50cyBvYmplY3QgZXF1YWxpdHkKKyAgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG90aGVyICE9IG51bGxwdHIgJiYgbUhlYWQgPT0gb3RoZXItPm1IZWFkOworICAgIH07CisKKyAgICAvLy8gcmV0dXJucyB0aGUgaW5mbyBwb2ludGVkIHRvIGJ5IHRoaXMgaXRlcmF0b3IKKyAgICB2aXJ0dWFsIHZhbHVlX3R5cGUgZ2V0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gSW5mbyhtSGVhZCk7CisgICAgfQorCisgICAgLy8vIGluY3JlbWVudHMgdGhpcyBpdGVyYXRvcgorICAgIHZpcnR1YWwgdm9pZCBpbmNyZW1lbnQoKSB7CisgICAgICAgIC8vIG5vdGU6IHRoaXMgY2Fubm90IGJlIGFic3RyYWN0IGFzIHdlIGluc3RhbnRpYXRlIHRoaXMgZm9yIExpc3Q6OmVuZCgpLiBpbmNyZW1lbnQgdG8gZW5kKCkKKyAgICAgICAgLy8gaW5zdGVhZC4KKyAgICAgICAgbUhlYWQucmVzZXQoKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBJbXBsKHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IGhlYWQpCisgICAgICAgIDogbUhlYWQoaGVhZCkgeyB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW5mbzo6SW1wbD4gbUhlYWQ7IC8vLzwgY3VycmVudCBmaWVsZAorfTsKKworQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SXRlcmF0b3Ioc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwpCisgICAgOiBtSW1wbChpbXBsKSB7IH0KKworQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6dmFsdWVfdHlwZSBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpvcGVyYXRvciooKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXQoKTsKK30KKworQzJGaWVsZFV0aWxzOjpJdGVyYXRvciYgQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6b3BlcmF0b3IrKygpIHsKKyAgICBtSW1wbC0+aW5jcmVtZW50KCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCitib29sIEMyRmllbGRVdGlsczo6SXRlcmF0b3I6Om9wZXJhdG9yPT0oY29uc3QgSXRlcmF0b3IgJm90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5lcXVhbHMob3RoZXIubUltcGwpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlsczo6TGlzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBDMl9ISURFIEMyRmllbGRVdGlsczo6TGlzdDo6SW1wbCB7CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8SXRlcmF0b3I6OkltcGw+IGJlZ2luKCkgY29uc3QgPSAwOworCisgICAgLy8vIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdAorICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEl0ZXJhdG9yOjpJbXBsPiBlbmQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEl0ZXJhdG9yOjpJbXBsPigpOworICAgIH0KKworICAgIHZpcnR1YWwgfkltcGwoKSA9IGRlZmF1bHQ7Cit9OworCitDMkZpZWxkVXRpbHM6Okxpc3Q6Okxpc3Qoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwpCisgICAgOiBtSW1wbChpbXBsKSB7IH0KKworQzJGaWVsZFV0aWxzOjpJdGVyYXRvciBDMkZpZWxkVXRpbHM6Okxpc3Q6OmJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yKG1JbXBsLT5iZWdpbigpKTsKK30KKworQzJGaWVsZFV0aWxzOjpJdGVyYXRvciBDMkZpZWxkVXRpbHM6Okxpc3Q6OmVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQzJGaWVsZFV0aWxzOjpJdGVyYXRvcihtSW1wbC0+ZW5kKCkpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlsczo6ZW51bWVyYXRlRmllbGRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworbmFtZXNwYWNlIHsKKworLyoqCisgKiBJdGVyYXRvciBiYXNlIGNsYXNzIGhlbHBlciB0aGF0IGFsbG93cyBkZXNjZW5kaW5nIGludG8gdGhlIGZpZWxkIGhpZXJhcmNoeS4KKyAqLworc3RydWN0IEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyIDogcHVibGljIEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGwgeworICAgIHZpcnR1YWwgfkMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8vIHJldHVybnMgdGhlIGJhc2UtZmllbGQncyBvZmZzZXQgb2YgdGhlIHBhcmVudCBmaWVsZCAob3IgdGhlIHBhcmFtIG9mZnNldCBpZiBubyBwYXJlbnQpCisgICAgc3RhdGljIGlubGluZSB1aW50MzJfdCBHZXRQYXJlbnRCYXNlRmllbGRPZmZzZXQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBwYXJlbnQpIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudCA9PSBudWxscHRyID8gc2l6ZW9mKEMyUGFyYW0pIDogcGFyZW50LT5iYXNlRmllbGRPZmZzZXQ7CisgICAgfQorCisgICAgLy8vIHJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgcGFyZW50IGZpZWxkIChvciB0aGUgcGFyYW0pCisgICAgc3RhdGljIGlubGluZSB1aW50MzJfdCBHZXRQYXJlbnRPZmZzZXQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gcGFyZW50KSB7CisgICAgICAgIHJldHVybiBwYXJlbnQgPT0gbnVsbHB0ciA/IHNpemVvZihDMlBhcmFtKSA6IEdldE9mZnNldChwYXJlbnQtPmZpZWxkKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvckhlbHBlcigKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IsCisgICAgICAgICAgICB1aW50MzJfdCBwYXJhbVNpemUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBoZWFkID0gbnVsbHB0cikKKyAgICAgICAgOiBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsKGhlYWQpLAorICAgICAgICAgIG1QYXJhbVNpemUocGFyYW1TaXplKSwKKyAgICAgICAgICBtUmVmbGVjdG9yKHJlZmxlY3RvcikgeyB9CisKKyAgICAvLy8gcmV0dXJucyBhIGxlYWYgaW5mbyBvYmplY3QgYXQgYSBzcGVjaWZpYyBpbmRleCBmb3IgYSBjaGlsZCBmaWVsZAorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IG1ha2VMZWFmKAorICAgICAgICAgICAgY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZpZWxkLCB1aW50MzJfdCBpbmRleCkgeworICAgICAgICB1aW50MzJfdCBwYXJlbnRPZmZzZXQgPSBHZXRQYXJlbnRPZmZzZXQobUhlYWQpOworICAgICAgICB1aW50MzJfdCBhcnJheU9mZnNldCA9IHBhcmVudE9mZnNldCArIEdldE9mZnNldChmaWVsZCk7CisgICAgICAgIHVpbnQzMl90IHVzZWRFeHRlbnQgPSBmaWVsZC5leHRlbnQoKSA/IDoKKyAgICAgICAgICAgICAgICAoc3RkOjptYXgoYXJyYXlPZmZzZXQsIG1QYXJhbVNpemUpIC0gYXJyYXlPZmZzZXQpIC8gR2V0U2l6ZShmaWVsZCk7CisKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPigKKyAgICAgICAgICAgICAgICBPZmZzZXRGaWVsZERlc2NyaXB0b3IoZmllbGQsIHBhcmVudE9mZnNldCArIGluZGV4ICogR2V0U2l6ZShmaWVsZCkpLAorICAgICAgICAgICAgICAgIG1IZWFkIC8qIHBhcmVudCAqLywgaW5kZXgsIG1IZWFkID09IG51bGxwdHIgPyAwIDogbUhlYWQtPmRlcHRoICsgMSwKKyAgICAgICAgICAgICAgICBHZXRQYXJlbnRCYXNlRmllbGRPZmZzZXQobUhlYWQpICsgR2V0T2Zmc2V0KGZpZWxkKSwKKyAgICAgICAgICAgICAgICBhcnJheU9mZnNldCwgdXNlZEV4dGVudCk7CisgICAgfQorCisgICAgLy8vIHJldHVybnMgd2hldGhlciB0aGlzIHN0cnVjdCBpbmRleCBoYXZlIGJlZW4gdHJhdmVyc2VkIHRvIGdldCB0byB0aGlzIGZpZWxkCisgICAgYm9vbCB2aXNpdGVkKEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCkgY29uc3QgeworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+ICZzZCA6IG1IaXN0b3J5KSB7CisgICAgICAgICAgICBpZiAoc2QtPmNvcmVJbmRleCgpID09IGluZGV4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQzMl90IG1QYXJhbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IG1SZWZsZWN0b3I7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4+IG1IaXN0b3J5OyAvLyBzdHJ1Y3R1cmUgdHlwZXMgdmlzaXRlZAorfTsKKworLyoqCisgKiBJdGVyYXRvciBpbXBsZW1lbnRpbmcgZW51bWVyYXRlRmllbGRzKCkgdGhhdCB2aXNpdHMgZWFjaCBiYXNlIGZpZWxkLgorICovCitzdHJ1Y3QgQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3IgOiBwdWJsaWMgQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIgeworICAgIC8vLyBlbnVtZXJhdGUgYmFzZSBmaWVsZHMgb2YgYSBwYXJhbWV0ZXIKKyAgICBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvcihjb25zdCBDMlBhcmFtICZwYXJhbSwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IHJlZmxlY3RvcikKKyAgICAgICAgOiBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvckhlbHBlcihyZWZsZWN0b3IsIHBhcmFtLnNpemUoKSkgeworICAgICAgICBkZXNjZW5kSW50byhwYXJhbS5jb3JlSW5kZXgoKSk7CisgICAgfQorCisgICAgLy8vIGVudW1lcmF0ZSBiYXNlIGZpZWxkcyBvZiBhIGZpZWxkCisgICAgQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3Ioc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9yPiBpbXBsKQorICAgICAgICA6IEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyKGltcGwtPm1SZWZsZWN0b3IsIGltcGwtPm1QYXJhbVNpemUsIGltcGwtPm1IZWFkKSB7CisgICAgICAgIG1IaXN0b3J5ID0gaW1wbC0+bUhpc3Rvcnk7CisgICAgICAgIGlmIChtSGVhZC0+ZmllbGQudHlwZSgpICYgQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHKSB7CisgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSB7IG1IZWFkLT5maWVsZC50eXBlKCkgJn5DMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcgfTsKKyAgICAgICAgICAgIGlmICghdmlzaXRlZChpbmRleCkpIHsKKyAgICAgICAgICAgICAgICBkZXNjZW5kSW50byhpbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIC8vLyBJbmNyZW1lbnRzIHRoaXMgaXRlcmF0b3IgYnkgdmlzaXRpbmcgZWFjaCBiYXNlIGZpZWxkLgorICAgIHZpcnR1YWwgdm9pZCBpbmNyZW1lbnQoKSBvdmVycmlkZSB7CisgICAgICAgIC8vIGRvbid0IGdvIHBhc3QgZW5kCisgICAgICAgIGlmIChtSGVhZCA9PSBudWxscHRyIHx8IF9tRmllbGRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRlc2NlbmQgaW50byBzdHJ1Y3R1cmVzCisgICAgICAgIGlmIChtSGVhZC0+ZmllbGQudHlwZSgpICYgQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHKSB7CisgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSB7IG1IZWFkLT5maWVsZC50eXBlKCkgJn5DMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcgfTsKKyAgICAgICAgICAgIC8vIGRvIG5vdCByZWN1cnNlIGludG8gdGhlIHNhbWUgc3RydWN0cworICAgICAgICAgICAgaWYgKCF2aXNpdGVkKGluZGV4KSAmJiBkZXNjZW5kSW50byhpbmRleCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhc2NlbmQgYWZ0ZXIgdGhlIGxhc3QgZmllbGQgaW4gdGhlIGN1cnJlbnQgc3RydWN0CisgICAgICAgIHdoaWxlICghbUhpc3RvcnkuZW1wdHkoKSAmJiBfbUZpZWxkcy5iYWNrKCkgPT0gbUhpc3RvcnkuYmFjaygpLT5lbmQoKSkgeworICAgICAgICAgICAgbUhlYWQgPSBtSGVhZC0+cGFyZW50OworICAgICAgICAgICAgbUhpc3RvcnkucG9wX2JhY2soKTsKKyAgICAgICAgICAgIF9tRmllbGRzLnBvcF9iYWNrKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBkb25lIGlmIGhpc3RvcnkgaXMgbm93IGVtcHR5CisgICAgICAgIGlmIChfbUZpZWxkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAvLyB3ZSBjb3VsZCBiZSB0cmF2ZXJzaW5nIGEgc3ViLXRyZWUgc28gY2xlYXIgaGVhZAorICAgICAgICAgICAgbUhlYWQucmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG1vdmUgdG8gdGhlIG5leHQgZmllbGQgaW4gdGhlIGN1cnJlbnQgc3RydWN0CisgICAgICAgIEMyU3RydWN0RGVzY3JpcHRvcjo6ZmllbGRfaXRlcmF0b3IgbmV4dCA9IF9tRmllbGRzLmJhY2soKTsKKyAgICAgICAgbUhlYWQtPmZpZWxkID0gT2Zmc2V0RmllbGREZXNjcmlwdG9yKCpuZXh0LCBHZXRQYXJlbnRPZmZzZXQobUhlYWQtPnBhcmVudCkpOworICAgICAgICBtSGVhZC0+aW5kZXggPSAwOyAvLyByZXNldCBpbmRleCBqdXN0IGluIGNhc2UgZm9yIGNvcnJlY3RuZXNzCisgICAgICAgIG1IZWFkLT5iYXNlRmllbGRPZmZzZXQgPSBHZXRQYXJlbnRCYXNlRmllbGRPZmZzZXQobUhlYWQtPnBhcmVudCkgKyBHZXRPZmZzZXQoKm5leHQpOworICAgICAgICBtSGVhZC0+YXJyYXlPZmZzZXQgPSBHZXRPZmZzZXQobUhlYWQtPmZpZWxkKTsKKyAgICAgICAgbUhlYWQtPnVzZWRFeHRlbnQgPSBtSGVhZC0+ZmllbGQuZXh0ZW50KCkgPyA6CisgICAgICAgICAgICAgICAgKHN0ZDo6bWF4KG1IZWFkLT5hcnJheU9mZnNldCwgbVBhcmFtU2l6ZSkgLSBtSGVhZC0+YXJyYXlPZmZzZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAvIEdldFNpemUobUhlYWQtPmZpZWxkKTsKKyAgICAgICAgKytfbUZpZWxkcy5iYWNrKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIC8vLyBJZiB0aGUgY3VycmVudCBmaWVsZCBpcyBhIGtub3duLCB2YWxpZCAodW50cmF2ZXJzZWQpIHN0cnVjdHVyZSwgaXQgbW9kaWZpZXMgdGhpcyBpdGVyYXRvcgorICAgIC8vLyB0byBwb2ludCB0byB0aGUgZmlyc3QgZmllbGQgb2YgdGhlIHN0cnVjdHVyZSBhbmQgcmV0dXJucyB0cnVlLiBPdGhlcndpc2UsIGl0IGRvZXMgbm90CisgICAgLy8vIG1vZGlmeSB0aGlzIGl0ZXJhdG9yIGFuZCByZXR1cm5zIGZhbHNlLgorICAgIGJvb2wgZGVzY2VuZEludG8oQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4KSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NVbmlxdWUgPSBtUmVmbGVjdG9yLT5kZXNjcmliZShpbmRleCk7CisgICAgICAgIC8vIGRlc2NlbmQgaW50byBrbm93biBzdHJ1Y3RzIChhcyBsb25nIGFzIHRoZXkgaGF2ZSBhdCBsZWFzdCBvbmUgZmllbGQpCisgICAgICAgIGlmIChkZXNjVW5pcXVlICYmIGRlc2NVbmlxdWUtPmJlZ2luKCkgIT0gZGVzY1VuaXF1ZS0+ZW5kKCkpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2Moc3RkOjptb3ZlKGRlc2NVbmlxdWUpKTsKKyAgICAgICAgICAgIG1IaXN0b3J5LmVtcGxhY2VfYmFjayhkZXNjKTsKKyAgICAgICAgICAgIEMyU3RydWN0RGVzY3JpcHRvcjo6ZmllbGRfaXRlcmF0b3IgZmlyc3QgPSBkZXNjLT5iZWdpbigpOworICAgICAgICAgICAgbUhlYWQgPSBtYWtlTGVhZigqZmlyc3QsIDAgLyogaW5kZXggKi8pOworICAgICAgICAgICAgX21GaWVsZHMuZW1wbGFjZV9iYWNrKCsrZmlyc3QpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vLyBuZXh0IGZpZWxkIHBvaW50ZXJzIGZvciBlYWNoIGRlcHRoLgorICAgIC8vLyBub3RlOiBfbUZpZWxkcyBtYXkgYmUgc2hvcnRlZCB0aGFuIG1IaXN0b3J5LCBpZiBpdGVyYXRpbmcgYXQgYSBkZXB0aAorICAgIHN0ZDo6dmVjdG9yPEMyU3RydWN0RGVzY3JpcHRvcjo6ZmllbGRfaXRlcmF0b3I+IF9tRmllbGRzOworfTsKKworLyoqCisgKiBJdGVyYWJsZSBpbXBsZW1lbnRpbmcgZW51bWVyYXRlRmllbGRzKCkuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHNGaWVsZEl0ZXJhYmxlIDogcHVibGljIEMyRmllbGRVdGlsczo6TGlzdDo6SW1wbCB7CisgICAgLy8vIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdAorICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGw+IGJlZ2luKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvcj4oKl9tUGFyYW0sIF9tUmVmbGVjdG9yKTsKKyAgICB9OworCisgICAgQzJGaWVsZFV0aWxzRmllbGRJdGVyYWJsZShjb25zdCBDMlBhcmFtICZwYXJhbSwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IHJlZmxlY3RvcikKKyAgICAgICAgOiBfbVBhcmFtKCZwYXJhbSksIF9tUmVmbGVjdG9yKHJlZmxlY3RvcikgeyB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgQzJQYXJhbSAqX21QYXJhbTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gX21SZWZsZWN0b3I7Cit9OworCit9CisKK0MyRmllbGRVdGlsczo6TGlzdCBDMkZpZWxkVXRpbHM6OmVudW1lcmF0ZUZpZWxkcygKKyAgICAgICAgY29uc3QgQzJQYXJhbSAmcGFyYW0sIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgcmV0dXJuIEMyRmllbGRVdGlsczo6TGlzdChzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0ZpZWxkSXRlcmFibGU+KHBhcmFtLCByZWZsZWN0b3IpKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkVXRpbHM6OmVudW1lcmF0ZSBzaWJsaW5ncyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBDMkZpZWxkVXRpbHNDb3VzaW5zSXRlcmF0b3IgOiBwdWJsaWMgQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbCB7CisgICAgQzJGaWVsZFV0aWxzQ291c2luc0l0ZXJhdG9yKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+ICZpbmZvLCBzaXplX3QgbGV2ZWwpCisgICAgICAgICAgLy8gY2xvbmUgaW5mbyBjaGFpbiBhcyB0aGlzIGl0ZXJhdG9yIHdpbGwgY2hhbmdlIGl0CisgICAgICAgIDogQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbChDMkZpZWxkVXRpbHM6OkluZm86OkltcGw6OkNsb25lKGluZm8pKSB7CisgICAgICAgIGlmIChsZXZlbCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBzdG9yZSBwYXJlbnQgY2hhaW4gKHVwIHRvIGxldmVsKSBmb3IgcXVpY2sgYWNjZXNzCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IG5vZGUgPSBtSGVhZDsKKyAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgZm9yICg7IGl4IDwgbGV2ZWwgJiYgbm9kZTsgKytpeCkgeworICAgICAgICAgICAgbm9kZS0+aW5kZXggPSAwOworICAgICAgICAgICAgX21QYXRoLmVtcGxhY2VfYmFjayhub2RlKTsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5wYXJlbnQ7CisgICAgICAgIH0KKyAgICAgICAgc2V0dXBQYXRoKGl4KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMkZpZWxkVXRpbHNDb3VzaW5zSXRlcmF0b3IoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gSW5jcmVtZW50cyB0aGlzIGl0ZXJhdG9yIGJ5IHZpc2l0aW5nIGVhY2ggaW5kZXguCisgICAgdmlydHVhbCB2b2lkIGluY3JlbWVudCgpIG92ZXJyaWRlIHsKKyAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgd2hpbGUgKGl4IDwgX21QYXRoLnNpemUoKSkgeworICAgICAgICAgICAgaWYgKCsrX21QYXRoW2l4XS0+aW5kZXggPCBfbVBhdGhbaXhdLT51c2VkRXh0ZW50KSB7CisgICAgICAgICAgICAgICAgc2V0dXBQYXRoKGl4ICsgMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX21QYXRoW2l4KytdLT5pbmRleCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbUhlYWQucmVzZXQoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8vIGFkanVzdHMgZmllbGQgb2Zmc2V0cyBhbG9uZyB0aGUgcGF0aCB1cCB0byB0aGUgc3BlY2lmaWMgbGV2ZWwgLSAxLgorICAgIC8vLyBUaGlzIGluLWZhY3QgaGFzIHRvIGJlIGRvbmUgZG93biB0aGUgcGF0aCBmcm9tIHBhcmVudCB0byBjaGlsZCBhcyBjaGlsZCBmaWVsZHMgbXVzdAorICAgIC8vLyBmYWxsIHdpdGhpbiBwYXJlbnQgZmllbGRzLgorICAgIHZvaWQgc2V0dXBQYXRoKHNpemVfdCBsZXZlbCkgeworICAgICAgICBDMl9DSEVDS19MRShsZXZlbCwgX21QYXRoLnNpemUoKSk7CisgICAgICAgIHVpbnQzMl90IG9sZEFycmF5T2Zmc2V0ID0gbGV2ZWwgPyBfbVBhdGhbbGV2ZWwgLSAxXS0+YXJyYXlPZmZzZXQgOiAwIC8qIHVudXNlZCAqLzsKKyAgICAgICAgd2hpbGUgKGxldmVsKSB7CisgICAgICAgICAgICAtLWxldmVsOworICAgICAgICAgICAgQzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsICZwYXRoID0gKl9tUGF0aFtsZXZlbF07CisgICAgICAgICAgICB1aW50MzJfdCBzaXplID0gR2V0U2l6ZShwYXRoLmZpZWxkKTsKKyAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCA9IHBhdGguYXJyYXlPZmZzZXQgKyBzaXplICogcGF0aC5pbmRleDsKKyAgICAgICAgICAgIFNldE9mZnNldChwYXRoLmZpZWxkLCBvZmZzZXQpOworICAgICAgICAgICAgaWYgKGxldmVsKSB7CisgICAgICAgICAgICAgICAgLy8gcmVzZXQgY2hpbGQncyBhcnJheSBvZmZzZXQgdG8gZmFsbCB3aXRoaW4gY3VycmVudCBpbmRleCwgYnV0IGhvbGQgb250byB0aGUKKyAgICAgICAgICAgICAgICAvLyBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgYXJyYXlPZmZzZXQgc28gdGhhdCB3ZSBjYW4gYWRqdXN0IHN1YnNlcXVlbnQgY2hpbGRyZW4uCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBiZWNhdXNlIHRoZSBtb2R1bG8gaXMgb25seSBkZWZpbmVkIHdpdGhpbiB0aGUgY3VycmVudCBhcnJheS4KKyAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGlsZEFycmF5T2Zmc2V0ID0KKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICsgKF9tUGF0aFtsZXZlbCAtIDFdLT5hcnJheU9mZnNldCAtIG9sZEFycmF5T2Zmc2V0KSAlIHNpemU7CisgICAgICAgICAgICAgICAgb2xkQXJyYXlPZmZzZXQgPSBfbVBhdGhbbGV2ZWwgLSAxXS0+YXJyYXlPZmZzZXQ7CisgICAgICAgICAgICAgICAgX21QYXRoW2xldmVsIC0gMV0tPmFycmF5T2Zmc2V0ID0gY2hpbGRBcnJheU9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+PiBfbVBhdGg7Cit9OworCisvKioKKyAqIEl0ZXJhYmxlIGltcGxlbWVudGluZyBlbnVtZXJhdGVGaWVsZHMoKS4KKyAqLworc3RydWN0IEMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYWJsZSA6IHB1YmxpYyBDMkZpZWxkVXRpbHM6Okxpc3Q6OkltcGwgeworICAgIC8vLyByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsPiBiZWdpbigpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8QzJGaWVsZFV0aWxzQ291c2luc0l0ZXJhdG9yPihfbUhlYWQsIF9tTGV2ZWwpOworICAgIH07CisKKyAgICBDMkZpZWxkVXRpbHNDb3VzaW5zSXRlcmFibGUoY29uc3QgQzJGaWVsZFV0aWxzOjpJbmZvICZmaWVsZCwgdWludDMyX3QgbGV2ZWwpCisgICAgICAgIDogX21IZWFkKEMyRmllbGRVdGlsczo6X0luc3BlY3Rvcjo6R2V0SW1wbChmaWVsZCkpLCBfbUxldmVsKGxldmVsKSB7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBfbUhlYWQ7CisgICAgc2l6ZV90IF9tTGV2ZWw7Cit9OworCit9CisKK0MyRmllbGRVdGlsczo6TGlzdCBDMkZpZWxkVXRpbHM6OmVudW1lcmF0ZUNvdXNpbnMoY29uc3QgQzJGaWVsZFV0aWxzOjpJbmZvICZmaWVsZCwgdWludDMyX3QgbGV2ZWwpIHsKKyAgICByZXR1cm4gQzJGaWVsZFV0aWxzOjpMaXN0KHN0ZDo6bWFrZV9zaGFyZWQ8QzJGaWVsZFV0aWxzQ291c2luc0l0ZXJhYmxlPihmaWVsZCwgbGV2ZWwpKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkVXRpbHM6OmxvY2F0ZUZpZWxkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworbmFtZXNwYWNlIHsKKworLyoqCisgKiBJdGVyYXRvciBpbXBsZW1lbnRpbmcgbG9jYXRlRmllbGQoKS4KKyAqLworc3RydWN0IEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRvciA6IHB1YmxpYyBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvckhlbHBlciB7CisgICAgQzJGaWVsZFV0aWxzRmllbGRMb2NhdG9yKAorICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4LCBjb25zdCBfQzJGaWVsZElkICZmaWVsZCwgdWludDMyX3QgcGFyYW1TaXplLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IHJlZmxlY3RvcikKKyAgICAgICAgOiBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvckhlbHBlcihyZWZsZWN0b3IsIHBhcmFtU2l6ZSksCisgICAgICAgICAgX21GaWVsZChmaWVsZCkgeworICAgICAgICB3aGlsZSAoZGVzY2VuZEludG8oaW5kZXgpKSB7CisgICAgICAgICAgICBpZiAoKG1IZWFkLT5maWVsZC50eXBlKCkgJiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpID09IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGV4ID0gQzJQYXJhbTo6Q29yZUluZGV4KG1IZWFkLT5maWVsZC50eXBlKCkgJn4gQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgaW5jcmVtZW50KCkgeworICAgICAgICBtSGVhZCA9IF9tVGFpbDsKKyAgICAgICAgX21UYWlsID0gbnVsbHB0cjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8vIElmIHRoZSBjdXJyZW50IGZpZWxkIGlzIGEga25vd24sIHZhbGlkICh1bnRyYXZlcnNlZCkgc3RydWN0dXJlLCBpdCBtb2RpZmllcyB0aGlzIGl0ZXJhdG9yCisgICAgLy8vIHRvIHBvaW50IHRvIHRoZSBmaWVsZCBhdCB0aGUgYmVnaW5uaW5nL2VuZCBvZiB0aGUgZ2l2ZW4gZmllbGQgb2YgdGhlIHN0cnVjdHVyZSBhbmQgcmV0dXJucworICAgIC8vLyB0cnVlLiBPdGhlcndpc2UsIGluY2x1ZGluZyBpZiBubyBzdWNoIGZpZWxkIGV4aXN0cyBpbiB0aGUgc3RydWN0dXJlLCBpdCBkb2VzIG5vdCBtb2RpZnkgdGhpcworICAgIC8vLyBpdGVyYXRvciBhbmQgcmV0dXJucyBmYWxzZS4KKyAgICBib29sIGRlc2NlbmRJbnRvKEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCkgeworICAgICAgICAvLyBjaGVjayB0aGF0IHRoZSBib3VuZGFyaWVzIG9mIHRoZSBmaWVsZCB0byBiZSBsb2NhdGVkIGFyZSBzdGlsbCB3aXRoaW4gdGhlIHNhbWUgcGFyZW50CisgICAgICAgIC8vIGZpZWxkCisgICAgICAgIGlmIChtSGVhZCAhPSBfbVRhaWwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NVbmlxdWUgPSBtUmVmbGVjdG9yLT5kZXNjcmliZShpbmRleCk7CisgICAgICAgIC8vIGRlc2NlbmQgaW50byBrbm93biBzdHJ1Y3RzIChhcyBsb25nIGFzIHRoZXkgaGF2ZSBhdCBsZWFzdCBvbmUgZmllbGQpCisgICAgICAgIGlmIChkZXNjVW5pcXVlICYmIGRlc2NVbmlxdWUtPmJlZ2luKCkgIT0gZGVzY1VuaXF1ZS0+ZW5kKCkpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2Moc3RkOjptb3ZlKGRlc2NVbmlxdWUpKTsKKyAgICAgICAgICAgIG1IaXN0b3J5LmVtcGxhY2VfYmFjayhkZXNjKTsKKworICAgICAgICAgICAgdWludDMyX3QgcGFyZW50T2Zmc2V0ID0gR2V0UGFyZW50T2Zmc2V0KG1IZWFkKTsKKworICAgICAgICAgICAgLy8gbG9jYXRlIGZpZWxkIHVzaW5nIGEgZHVtbXkgZmllbGQgZGVzY3JpcHRvcgorICAgICAgICAgICAgQzJGaWVsZERlc2NyaXB0b3IgZHVtbXkgPSB7CisgICAgICAgICAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0IsIDEgLyogZXh0ZW50ICovLCAibmFtZSIsCisgICAgICAgICAgICAgICAgR2V0T2Zmc2V0KF9tRmllbGQpIC0gcGFyZW50T2Zmc2V0LCBHZXRTaXplKF9tRmllbGQpCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBsb2NhdGUgZmlyc3QgZmllbGQgd2hlcmUgb2Zmc2V0IGlzIGdyZWF0ZXIgdGhhbiBkdW1teSBvZmZzZXQgKHdoaWNoIGlzIG9uZSBwYXN0KQorICAgICAgICAgICAgYXV0byBpdCA9IHN0ZDo6dXBwZXJfYm91bmQoCisgICAgICAgICAgICAgICAgICAgIGRlc2MtPmNiZWdpbigpLCBkZXNjLT5jZW5kKCksIGR1bW15LAorICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmYSwgY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmIpIC0+IGJvb2wgeworICAgICAgICAgICAgICAgIHJldHVybiBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KGEpIDwgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChiKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKGl0ID09IGRlc2MtPmJlZ2luKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBmaWVsZCBpcyBwcmlvciB0byBmaXJzdCBmaWVsZAorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC0taXQ7CisgICAgICAgICAgICBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmllbGQgPSAqaXQ7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgZHVtbXkgZW5kLW9mZnNldCBpcyB3aXRoaW4gdGhpcyBmaWVsZAorICAgICAgICAgICAgdWludDMyX3Qgc3RydWN0U2l6ZSA9IHN0ZDo6bWF4KG1QYXJhbVNpemUsIHBhcmVudE9mZnNldCkgLSBwYXJlbnRPZmZzZXQ7CisgICAgICAgICAgICBpZiAoR2V0RW5kT2Zmc2V0KGR1bW15KSA+IEdldEVuZE9mZnNldChmaWVsZCwgc3RydWN0U2l6ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0SW5kZXggPSAoR2V0T2Zmc2V0KGR1bW15KSAtIEdldE9mZnNldChmaWVsZCkpIC8gR2V0U2l6ZShmaWVsZCk7CisgICAgICAgICAgICB1aW50MzJfdCBlbmRJbmRleCA9CisgICAgICAgICAgICAgICAgKEdldEVuZE9mZnNldChkdW1teSkgLSBHZXRPZmZzZXQoZmllbGQpICsgR2V0U2l6ZShmaWVsZCkgLSAxKSAvIEdldFNpemUoZmllbGQpOworICAgICAgICAgICAgaWYgKGVuZEluZGV4ID4gc3RhcnRJbmRleCkgeworICAgICAgICAgICAgICAgIC8vIEZpZWxkIHNpemUgY291bGQgYmUgemVybywgaW4gd2hpY2ggY2FzZSBlbmQgaW5kZXggaXMgc3RpbGwgb24gc3RhcnQgaW5kZXguCisgICAgICAgICAgICAgICAgLy8gSG93ZXZlciwgZm9yIGFsbCBvdGhlciBjYXNlcywgZW5kSW5kZXggd2FzIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgaW5kZXgsIHNvCisgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50IGl0LgorICAgICAgICAgICAgICAgIC0tZW5kSW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBzdGFydExlYWYgPQorICAgICAgICAgICAgICAgIG1ha2VMZWFmKGZpZWxkLCBzdGFydEluZGV4KTsKKyAgICAgICAgICAgIGlmIChlbmRJbmRleCA9PSBzdGFydEluZGV4KSB7CisgICAgICAgICAgICAgICAgX21UYWlsID0gc3RhcnRMZWFmOworICAgICAgICAgICAgICAgIG1IZWFkID0gc3RhcnRMZWFmOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBfbVRhaWwgPSBtYWtlTGVhZihmaWVsZCwgZW5kSW5kZXgpOworICAgICAgICAgICAgICAgIG1IZWFkID0gc3RhcnRMZWFmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIF9DMkZpZWxkSWQgX21GaWVsZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBfbVRhaWw7Cit9OworCisvKioKKyAqIEl0ZXJhYmxlIGltcGxlbWVudGluZyBsb2NhdGVGaWVsZCgpLgorICovCitzdHJ1Y3QgQzJGaWVsZFV0aWxzRmllbGRMb2NhdGlvbiA6IHB1YmxpYyBDMkZpZWxkVXRpbHM6Okxpc3Q6OkltcGwgeworICAgIC8vLyByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsPiBiZWdpbigpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8QzJGaWVsZFV0aWxzRmllbGRMb2NhdG9yPigKKyAgICAgICAgICAgICAgICBfbUluZGV4LCBfbUZpZWxkLCBfbVBhcmFtU2l6ZSwgX21SZWZsZWN0b3IpOworICAgIH07CisKKyAgICBDMkZpZWxkVXRpbHNGaWVsZExvY2F0aW9uKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbUZpZWxkICZwZiwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IHJlZmxlY3RvcikKKyAgICAgICAgOiBfbUluZGV4KEMyUGFyYW06OkNvcmVJbmRleChfQzJQYXJhbUluc3BlY3Rvcjo6R2V0SW5kZXgocGYpKSksCisgICAgICAgICAgX21GaWVsZChfQzJQYXJhbUluc3BlY3Rvcjo6R2V0RmllbGQocGYpKSwKKyAgICAgICAgICBfbVBhcmFtU2l6ZSgwKSwKKyAgICAgICAgICBfbVJlZmxlY3RvcihyZWZsZWN0b3IpIHsgfQorCisKKyAgICBDMkZpZWxkVXRpbHNGaWVsZExvY2F0aW9uKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAmcGFyYW0sIGNvbnN0IF9DMkZpZWxkSWQgJmZpZWxkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IHJlZmxlY3RvcikKKyAgICAgICAgOiBfbUluZGV4KHBhcmFtLmNvcmVJbmRleCgpKSwKKyAgICAgICAgICBfbUZpZWxkKGZpZWxkKSwKKyAgICAgICAgICBfbVBhcmFtU2l6ZShwYXJhbS5zaXplKCkpLAorICAgICAgICAgIF9tUmVmbGVjdG9yKHJlZmxlY3RvcikgeyB9CisKK3ByaXZhdGU6CisgICAgQzJQYXJhbTo6Q29yZUluZGV4IF9tSW5kZXg7CisgICAgX0MyRmllbGRJZCBfbUZpZWxkOworICAgIHVpbnQzMl90IF9tUGFyYW1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBfbVJlZmxlY3RvcjsKK307CisKK30KKworc3RkOjp2ZWN0b3I8QzJGaWVsZFV0aWxzOjpJbmZvPiBDMkZpZWxkVXRpbHM6OmxvY2F0ZUZpZWxkKAorICAgICAgICBjb25zdCBDMlBhcmFtRmllbGQgJnBmLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvcikgeworICAgIEMyRmllbGRVdGlsczo6TGlzdCBsb2NhdGlvbiA9IHsgc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHNGaWVsZExvY2F0aW9uPihwZiwgcmVmbGVjdG9yKSB9OworICAgIHJldHVybiBzdGQ6OnZlY3RvcjxJbmZvPihsb2NhdGlvbi5iZWdpbigpLCBsb2NhdGlvbi5lbmQoKSk7Cit9CisKK3N0ZDo6dmVjdG9yPEMyRmllbGRVdGlsczo6SW5mbz4gQzJGaWVsZFV0aWxzOjpsb2NhdGVGaWVsZCgKKyAgICAgICAgY29uc3QgQzJQYXJhbSAmcGFyYW0sIGNvbnN0IF9DMkZpZWxkSWQgJmZpZWxkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvcikgeworICAgIEMyRmllbGRVdGlsczo6TGlzdCBsb2NhdGlvbiA9IHsKKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHNGaWVsZExvY2F0aW9uPihwYXJhbSwgZmllbGQsIHJlZmxlY3RvcikKKyAgICB9OworICAgIHJldHVybiBzdGQ6OnZlY3RvcjxJbmZvPihsb2NhdGlvbi5iZWdpbigpLCBsb2NhdGlvbi5lbmQoKSk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJQYXJhbVV0aWxzLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJQYXJhbVV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDU3M2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMlBhcmFtVXRpbHMuY3BwCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18gLy8gdG8gYmUgYWJsZSB0byBpbXBsZW1lbnQgdGhlIG1ldGhvZHMgZGVmaW5lZAorI2luY2x1ZGUgPEMyRW51bS5oPgorI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1sb2cuaD4KKyNpbmNsdWRlIDx1dGlsL0MyUGFyYW1VdGlscy5oPgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8qKiBcZmlsZQorICogVXRpbGl0aWVzIGZvciBwYXJhbWV0ZXIgaGFuZGxpbmcgdG8gYmUgdXNlZCBieSBDb2RlYzIgaW1wbGVtZW50YXRpb25zLgorICovCisKKy8vLyBcY29uZCBJTlRFUk5BTAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVUSUxJVElFUyBGT1IgRU5VTUVSQVRJT04gUkVGTEVDVElPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzaXplX3QgY291bnRMZWFkaW5nVW5kZXJzY29yZXMoQzJTdHJpbmdMaXRlcmFsIGEpIHsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgd2hpbGUgKGFbaV0gPT0gJ18nKSB7CisgICAgICAgICsraTsKKyAgICB9CisgICAgcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBzaXplX3QgY291bnRNYXRjaGluZyhDMlN0cmluZ0xpdGVyYWwgYSwgY29uc3QgQzJTdHJpbmcgJmIpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGIuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKCFhW2ldIHx8IGFbaV0gIT0gYltpXSkgeworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGIuc2l6ZSgpOworfQorCisvLyBBQkNEZWYgPT4gYWJjLWRlZgorLy8gQUJDRDJlZiA9PiBhYmNkMi1lZiAvLyAwCisvLyBBQkNEMkVmID0+IGFuY2QyLWVmIC8vIC0xCisvLyBBYmNEZWYgPT4gYWJjLWRlZiAvLyAtMQorLy8gQWJjMkRlZiA9PiBhYmMtMmRlZgorLy8gQWJjMmRlZiA9PiBhYmMtMi1kZWYKKy8vIF9ZbyA9PiBfeW8KKy8vIF95byA9PiBfeW8KKy8vIEMyX3lvID0+IGMyLXlvCisvLyBDMl9feW8gPT4gYzIteW8KKworLy9zdGF0aWMKK0MyU3RyaW5nIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoQzJTdHJpbmcgbmFtZSkgeworICAgIGVudW0geworICAgICAgICBrTm9uZSA9ICcuJywKKyAgICAgICAga0xvd2VyID0gJ2EnLAorICAgICAgICBrVXBwZXIgPSAnQScsCisgICAgICAgIGtEaWdpdCA9ICcxJywKKyAgICAgICAga0Rhc2ggPSAnLScsCisgICAgICAgIGtVbmRlcnNjb3JlID0gJ18nLAorICAgIH0gdHlwZSA9IGtOb25lOworICAgIHNpemVfdCB3b3JkX3N0YXJ0ID0gMDsKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgbmFtZS5zaXplKCk7ICsraXgpIHsKKyAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8IG5hbWUuc3Vic3RyKDAsIHdvcmRfc3RhcnQpIDw8ICJ8IgorICAgICAgICAgICAgICAgIDw8IG5hbWUuc3Vic3RyKHdvcmRfc3RhcnQsIGl4IC0gd29yZF9zdGFydCkgPDwgIlsiCisgICAgICAgICAgICAgICAgPDwgbmFtZS5zdWJzdHIoaXgsIDEpIDw8ICJdIiA8PCBuYW1lLnN1YnN0cihpeCArIDEpCisgICAgICAgICAgICAgICAgPDwgIjogIiA8PCAoY2hhcil0eXBlOworICAgICAgICBpZiAoaXN1cHBlcihuYW1lW2l4XSkpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IGtMb3dlcikgeworICAgICAgICAgICAgICAgIG5hbWUuaW5zZXJ0KGl4KyssIDEsICctJyk7CisgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmFtZVtpeF0gPSB0b2xvd2VyKG5hbWVbaXhdKTsKKyAgICAgICAgICAgIHR5cGUgPSBrVXBwZXI7CisgICAgICAgIH0gZWxzZSBpZiAoaXNsb3dlcihuYW1lW2l4XSkpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IGtEaWdpdCAmJiBpeCA+IDApIHsKKyAgICAgICAgICAgICAgICBuYW1lLmluc2VydChpeCsrLCAxLCAnLScpOworICAgICAgICAgICAgICAgIHdvcmRfc3RhcnQgPSBpeDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBrVXBwZXIgJiYgaXggPiB3b3JkX3N0YXJ0ICsgMSkgeworICAgICAgICAgICAgICAgIG5hbWUuaW5zZXJ0KGl4KysgLSAxLCAxLCAnLScpOworICAgICAgICAgICAgICAgIHdvcmRfc3RhcnQgPSBpeCAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0eXBlID0ga0xvd2VyOworICAgICAgICB9IGVsc2UgaWYgKGlzZGlnaXQobmFtZVtpeF0pKSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBrTG93ZXIpIHsKKyAgICAgICAgICAgICAgICBuYW1lLmluc2VydChpeCsrLCAxLCAnLScpOworICAgICAgICAgICAgICAgIHdvcmRfc3RhcnQgPSBpeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR5cGUgPSBrRGlnaXQ7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZVtpeF0gPT0gJ18nKSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBrRGFzaCkgeworICAgICAgICAgICAgICAgIG5hbWUuZXJhc2UoaXgtLSwgMSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT0ga05vbmUgJiYgdHlwZSAhPSBrVW5kZXJzY29yZSkgeworICAgICAgICAgICAgICAgIG5hbWVbaXhdID0gJy0nOworICAgICAgICAgICAgICAgIHR5cGUgPSBrRGFzaDsKKyAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXggKyAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0eXBlID0ga1VuZGVyc2NvcmU7CisgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4ICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5hbWUucmVzaXplKGl4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBDMl9MT0coVkVSQk9TRSkgPDwgIj0+ICIgPDwgbmFtZTsKKyAgICByZXR1cm4gbmFtZTsKK30KKworLy9zdGF0aWMKK3N0ZDo6dmVjdG9yPEMyU3RyaW5nPiBfQzJFbnVtVXRpbHM6OnNhbml0aXplRW51bVZhbHVlTmFtZXMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyU3RyaW5nTGl0ZXJhbD4gbmFtZXMsCisgICAgICAgIEMyU3RyaW5nTGl0ZXJhbCBfcHJlZml4KSB7CisgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IHNhbml0aXplZE5hbWVzOworICAgIEMyU3RyaW5nIHByZWZpeDsKKyAgICBzaXplX3QgZXh0cmFVbmRlcnNjb3JlcyA9IDA7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgaWYgKF9wcmVmaXgpIHsKKyAgICAgICAgZXh0cmFVbmRlcnNjb3JlcyA9IGNvdW50TGVhZGluZ1VuZGVyc2NvcmVzKF9wcmVmaXgpOworICAgICAgICBwcmVmaXggPSBfcHJlZml4ICsgZXh0cmFVbmRlcnNjb3JlczsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJwcmVmaXg6IiA8PCBwcmVmaXggPDwgIiwgdW5kZXJzY29yZXM6IiA8PCBleHRyYVVuZGVyc2NvcmVzOworICAgIH0KKworICAgIC8vIGNhbGN1bGF0ZSBwcmVmaXggYW5kIG1pbmltdW0gbGVhZGluZyB1bmRlcnNjb3JlcworICAgIGZvciAoQzJTdHJpbmdMaXRlcmFsIHMgOiBuYW1lcykgeworICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgczsKKyAgICAgICAgc2l6ZV90IHVuZGVyc2NvcmVzID0gY291bnRMZWFkaW5nVW5kZXJzY29yZXMocyk7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgZXh0cmFVbmRlcnNjb3JlcyA9IHVuZGVyc2NvcmVzOworICAgICAgICAgICAgcHJlZml4ID0gcyArIHVuZGVyc2NvcmVzOworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemVfdCBtYXRjaGluZyA9IGNvdW50TWF0Y2hpbmcoCisgICAgICAgICAgICAgICAgcyArIHVuZGVyc2NvcmVzLAorICAgICAgICAgICAgICAgIHByZWZpeCk7CisgICAgICAgICAgICBwcmVmaXgucmVzaXplKG1hdGNoaW5nKTsKKyAgICAgICAgICAgIGV4dHJhVW5kZXJzY29yZXMgPSBzdGQ6Om1pbih1bmRlcnNjb3JlcywgZXh0cmFVbmRlcnNjb3Jlcyk7CisgICAgICAgIH0KKyAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJwcmVmaXg6IiA8PCBwcmVmaXggPDwgIiwgdW5kZXJzY29yZXM6IiA8PCBleHRyYVVuZGVyc2NvcmVzOworICAgICAgICBpZiAocHJlZml4LnNpemUoKSA9PSAwICYmIGV4dHJhVW5kZXJzY29yZXMgPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB3ZSBzd2FsbG93IHRoZSBmaXJzdCB1bmRlcnNjb3JlIGFmdGVyIHVwcGVyIGNhc2UgcHJlZml4ZXMKKyAgICBib29sIHVwcGVyQ2FzZVByZWZpeCA9IHRydWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcmVmaXguc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKGlzbG93ZXIocHJlZml4W2ldKSkgeworICAgICAgICAgICAgdXBwZXJDYXNlUHJlZml4ID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoQzJTdHJpbmdMaXRlcmFsIHMgOiBuYW1lcykgeworICAgICAgICBzaXplX3QgdW5kZXJzY29yZXMgPSBjb3VudExlYWRpbmdVbmRlcnNjb3JlcyhzKTsKKyAgICAgICAgQzJTdHJpbmcgc2FuaXRpemVkID0gQzJTdHJpbmcocywgdW5kZXJzY29yZXMgLSBleHRyYVVuZGVyc2NvcmVzKTsKKyAgICAgICAgc2FuaXRpemVkLmFwcGVuZChzICsgcHJlZml4LnNpemUoKSArIHVuZGVyc2NvcmVzICsKKyAgICAgICAgICAgICAgICAgICAgKHVwcGVyQ2FzZVByZWZpeCAmJiBzW3ByZWZpeC5zaXplKCkgKyB1bmRlcnNjb3Jlc10gPT0gJ18nKSk7CisgICAgICAgIHNhbml0aXplZE5hbWVzLnB1c2hfYmFjayhjYW1lbENhc2VUb0Rhc2hlZChzYW5pdGl6ZWQpKTsKKyAgICB9CisKKyAgICBmb3IgKEMyU3RyaW5nIHMgOiBzYW5pdGl6ZWROYW1lcykgeworICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgczsKKyAgICB9CisKKyAgICByZXR1cm4gc2FuaXRpemVkTmFtZXM7Cit9CisKKy8vc3RhdGljCitzdGQ6OnZlY3RvcjxDMlN0cmluZz4gX0MyRW51bVV0aWxzOjpwYXJzZUVudW1WYWx1ZXNGcm9tU3RyaW5nKEMyU3RyaW5nTGl0ZXJhbCB2YWx1ZSkgeworICAgIHN0ZDo6dmVjdG9yPEMyU3RyaW5nPiBmb3VuZE5hbWVzOworICAgIHNpemVfdCBwb3MgPSAwLCBsZW4gPSBzdHJsZW4odmFsdWUpOworICAgIGRvIHsKKyAgICAgICAgc2l6ZV90IGVuZFBvcyA9IHN0cmNzcG4odmFsdWUgKyBwb3MsICIgLD0iKSArIHBvczsKKyAgICAgICAgaWYgKGVuZFBvcyA+IHBvcykgeworICAgICAgICAgICAgZm91bmROYW1lcy5lbXBsYWNlX2JhY2sodmFsdWUgKyBwb3MsIGVuZFBvcyAtIHBvcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlW2VuZFBvc10gJiYgdmFsdWVbZW5kUG9zXSAhPSAnLCcpIHsKKyAgICAgICAgICAgIGVuZFBvcyArPSBzdHJjc3BuKHZhbHVlICsgZW5kUG9zLCAiLCIpOworICAgICAgICB9CisgICAgICAgIHBvcyA9IHN0cnNwbih2YWx1ZSArIGVuZFBvcywgIiAsIikgKyBlbmRQb3M7CisgICAgfSB3aGlsZSAocG9zIDwgbGVuKTsKKyAgICByZXR1cm4gZm91bmROYW1lczsKK30KKworLy8vIHNhZmUocikgcGFyc2luZyBmcm9tIHBhcmFtZXRlciBibG9iCisvL3N0YXRpYworQzJQYXJhbSAqQzJQYXJhbVV0aWxzOjpQYXJzZUZpcnN0KGNvbnN0IHVpbnQ4X3QgKmJsb2IsIHNpemVfdCBzaXplKSB7CisgICAgLy8gX21TaXplIG11c3QgZml0IGludG8gc2l6ZSwgYnV0IHJlYWxseSBDMlBhcmFtIG11c3QgYWxzbyB0byBiZSBhIHZhbGlkIHBhcmFtCisgICAgaWYgKHNpemUgPCBzaXplb2YoQzJQYXJhbSkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIC8vIF9tU2l6ZSBtdXN0IG1hdGNoIGxlbmd0aAorICAgIEMyUGFyYW0gKnBhcmFtID0gKEMyUGFyYW0qKWJsb2I7CisgICAgaWYgKHBhcmFtLT5zaXplKCkgPiBzaXplKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gcGFyYW07Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuY3BwCmluZGV4IDlmYzVhNzYuLjlkMTgzZDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmNwcApAQCAtMTksNDggKzE5LDQ1IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJBQUNFeHRyYWN0b3IuaCIKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBBQUNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitjbGFzcyBBQUNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiBwdWJsaWM6CiAgICAgQUFDU291cmNlKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50NjRfdD4gJm9mZnNldF92ZWN0b3IsCiAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lX2R1cmF0aW9uX3VzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFBQ1NvdXJjZSgpOwogCiBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heEZyYW1lU2l6ZTsKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAKICAgICBvZmY2NF90IG1PZmZzZXQ7CiAgICAgaW50NjRfdCBtQ3VycmVudFRpbWVVczsKICAgICBib29sIG1TdGFydGVkOwotICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKIAogICAgIFZlY3Rvcjx1aW50NjRfdD4gbU9mZnNldFZlY3RvcjsKICAgICBpbnQ2NF90IG1GcmFtZUR1cmF0aW9uVXM7CkBAIC05Miw3ICs4OSw3IEBACiAvLyBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgdGhlIEFBQyBmcmFtZSBzaXplIHdpdGggdGhlIEFEVFMgaGVhZGVyIGxlbmd0aCAocmVnYXJkbGVzcyBvZgogLy8gICAgIHRoZSBwcmVzZW5jZSBvZiB0aGUgQ1JDKS4KIC8vIElmIGhlYWRlclNpemUgaXMgbm9uLU5VTEwsIGl0IHdpbGwgYmUgdXNlZCB0byByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGhlYWRlciBvZiB0aGlzIEFEVFMgZnJhbWUuCi1zdGF0aWMgc2l6ZV90IGdldEFkdHNGcmFtZUxlbmd0aChEYXRhU291cmNlQmFzZSAqc291cmNlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90KiBoZWFkZXJTaXplKSB7CitzdGF0aWMgc2l6ZV90IGdldEFkdHNGcmFtZUxlbmd0aChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3QqIGhlYWRlclNpemUpIHsKIAogICAgIGNvbnN0IHNpemVfdCBrQWR0c0hlYWRlckxlbmd0aE5vQ3JjID0gNzsKICAgICBjb25zdCBzaXplX3Qga0FkdHNIZWFkZXJMZW5ndGhXaXRoQ3JjID0gOTsKQEAgLTEzMyw3ICsxMzAsNyBAQAogfQogCiBBQUNFeHRyYWN0b3I6OkFBQ0V4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQpCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1GcmFtZUR1cmF0aW9uVXMoMCkgewpAQCAtMTUxLDcgKzE0OCw5IEBACiAgICAgfQogICAgIGNoYW5uZWwgPSAoaGVhZGVyWzBdICYgMHgxKSA8PCAyIHwgKGhlYWRlclsxXSA+PiA2KTsKIAorICAgIG1NZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOwogICAgIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShtTWV0YSwgcHJvZmlsZSwgc2ZfaW5kZXgsIGNoYW5uZWwpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRSwgcHJvZmlsZSArIDEpOwogCiAgICAgb2ZmNjRfdCBzdHJlYW1TaXplLCBudW1GcmFtZXMgPSAwOwogICAgIHNpemVfdCBmcmFtZVNpemUgPSAwOwpAQCAtMTc0LDI5ICsxNzMsMzAgQEAKICAgICAgICAgLy8gUm91bmQgdXAgYW5kIGdldCB0aGUgZHVyYXRpb24KICAgICAgICAgbUZyYW1lRHVyYXRpb25VcyA9ICgxMDI0ICogMTAwMDAwMGxsICsgKHNyIC0gMSkpIC8gc3I7CiAgICAgICAgIGR1cmF0aW9uID0gbnVtRnJhbWVzICogbUZyYW1lRHVyYXRpb25VczsKLSAgICAgICAgbU1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbik7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZHVyYXRpb24pOwogICAgIH0KIAogICAgIG1Jbml0Q2hlY2sgPSBPSzsKIH0KIAogQUFDRXh0cmFjdG9yOjp+QUFDRXh0cmFjdG9yKCkgeworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobU1ldGEpOwogfQogCi1zdGF0dXNfdCBBQUNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuY2xlYXIoKTsKK21lZGlhX3N0YXR1c190IEFBQ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOwogICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7Ci0gICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTKTsKICAgICB9CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc2l6ZV90IEFBQ0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CiAgICAgcmV0dXJuIG1Jbml0Q2hlY2sgPT0gT0sgPyAxIDogMDsKIH0KIAotTWVkaWFUcmFjayAqQUFDRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXIgKkFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0yMDQsMTMgKzIwNCwxMiBAQAogICAgIHJldHVybiBuZXcgQUFDU291cmNlKG1EYXRhU291cmNlLCBtTWV0YSwgbU9mZnNldFZlY3RvciwgbUZyYW1lRHVyYXRpb25Vcyk7CiB9CiAKLXN0YXR1c190IEFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKK21lZGlhX3N0YXR1c190IEFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCi0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtMjE5LDggKzIxOCw4IEBACiBjb25zdCBzaXplX3QgQUFDU291cmNlOjprTWF4RnJhbWVTaXplID0gODE5MjsKIAogQUFDU291cmNlOjpBQUNTb3VyY2UoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50NjRfdD4gJm9mZnNldF92ZWN0b3IsCiAgICAgICAgIGludDY0X3QgZnJhbWVfZHVyYXRpb25fdXMpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLApAQCAtMjI4LDcgKzIyNyw2IEBACiAgICAgICBtT2Zmc2V0KDApLAogICAgICAgbUN1cnJlbnRUaW1lVXMoMCksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtR3JvdXAoTlVMTCksCiAgICAgICBtT2Zmc2V0VmVjdG9yKG9mZnNldF92ZWN0b3IpLAogICAgICAgbUZyYW1lRHVyYXRpb25VcyhmcmFtZV9kdXJhdGlvbl91cykgewogfQpAQCAtMjM5LDcgKzIzNyw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBQUNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworbWVkaWFfc3RhdHVzX3QgQUFDU291cmNlOjpzdGFydCgpIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCiAgICAgaWYgKG1PZmZzZXRWZWN0b3IuZW1wdHkoKSkgewpAQCAtMjQ5LDMwICsyNDcsMjUgQEAKICAgICB9CiAKICAgICBtQ3VycmVudFRpbWVVcyA9IDA7Ci0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbUdyb3VwLT5hZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKGtNYXhGcmFtZVNpemUpKTsKKyAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIoa01heEZyYW1lU2l6ZSk7CiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IEFBQ1NvdXJjZTo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IEFBQ1NvdXJjZTo6c3RvcCgpIHsKICAgICBDSEVDSyhtU3RhcnRlZCk7CiAKLSAgICBkZWxldGUgbUdyb3VwOwotICAgIG1Hcm91cCA9IE5VTEw7Ci0KICAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBBQUNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworbWVkaWFfc3RhdHVzX3QgQUFDU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKIH0KIAotc3RhdHVzX3QgQUFDU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBBQUNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwpAQCAtMjgyLDcgKzI3NSw3IEBACiAgICAgICAgICAgICBpbnQ2NF90IHNlZWtGcmFtZSA9IHNlZWtUaW1lVXMgLyBtRnJhbWVEdXJhdGlvblVzOwogICAgICAgICAgICAgaWYgKHNlZWtGcmFtZSA8IDAgfHwgc2Vla0ZyYW1lID49IChpbnQ2NF90KW1PZmZzZXRWZWN0b3Iuc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3MDIzOTUwNyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQ3VycmVudFRpbWVVcyA9IHNlZWtGcmFtZSAqIG1GcmFtZUR1cmF0aW9uVXM7CiAKQEAgLTI5MiwxMyArMjg1LDEzIEBACiAKICAgICBzaXplX3QgZnJhbWVTaXplLCBmcmFtZVNpemVXaXRob3V0SGVhZGVyLCBoZWFkZXJTaXplOwogICAgIGlmICgoZnJhbWVTaXplID0gZ2V0QWR0c0ZyYW1lTGVuZ3RoKG1EYXRhU291cmNlLCBtT2Zmc2V0LCAmaGVhZGVyU2l6ZSkpID09IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CisgICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBmcmFtZVNpemVXaXRob3V0SGVhZGVyID0gZnJhbWVTaXplIC0gaGVhZGVyU2l6ZTsKQEAgLTMwNywzNyArMzAwLDM5IEBACiAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICBidWZmZXIgPSBOVUxMOwogCi0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICB9CiAKICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBmcmFtZVNpemVXaXRob3V0SGVhZGVyKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVVcyk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgbUN1cnJlbnRUaW1lVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCiAgICAgbU9mZnNldCArPSBmcmFtZVNpemU7CiAgICAgbUN1cnJlbnRUaW1lVXMgKz0gbUZyYW1lRHVyYXRpb25VczsKIAogICAgICpvdXQgPSBidWZmZXI7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXN0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICB2b2lkICptZXRhKSB7CiAgICAgb2ZmNjRfdCBvZmZzZXQgPSAqc3RhdGljX2Nhc3Q8b2ZmNjRfdCo+KG1ldGEpOwotICAgIHJldHVybiBuZXcgQUFDRXh0cmFjdG9yKHNvdXJjZSwgb2Zmc2V0KTsKKyAgICByZXR1cm4gd3JhcChuZXcgQUFDRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSksIG9mZnNldCkpOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCi0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhKSB7CitzdGF0aWMgQ3JlYXRvckZ1bmMgU25pZmYoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqbWV0YSwKKyAgICAgICAgRnJlZU1ldGFGdW5jICpmcmVlTWV0YSkgewogICAgIG9mZjY0X3QgcG9zID0gMDsKIAorICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CiAgICAgZm9yICg7OykgewogICAgICAgICB1aW50OF90IGlkM2hlYWRlclsxMF07Ci0gICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdChwb3MsIGlkM2hlYWRlciwgc2l6ZW9mKGlkM2hlYWRlcikpCisgICAgICAgIGlmIChoZWxwZXIucmVhZEF0KHBvcywgaWQzaGVhZGVyLCBzaXplb2YoaWQzaGVhZGVyKSkKICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihpZDNoZWFkZXIpKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQpAQCAtMzY0LDcgKzM1OSw3IEBACiAKICAgICB1aW50OF90IGhlYWRlclsyXTsKIAotICAgIGlmIChzb3VyY2UtPnJlYWRBdChwb3MsICZoZWFkZXIsIDIpICE9IDIpIHsKKyAgICBpZiAoaGVscGVyLnJlYWRBdChwb3MsICZoZWFkZXIsIDIpICE9IDIpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC0zODMsMTcgKzM3OCwyMSBAQAogICAgIHJldHVybiBOVUxMOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZW5zaW9uc1tdID0geworICAgICJhYWMiLAorICAgIE5VTEwKK307CiAKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoIjRmZDgwZWFlLTAzZDItNGQ3Mi05ZWI5LTQ4ZmE2YmI1NDYxMyIpLAogICAgICAgICAxLCAvLyB2ZXJzaW9uCiAgICAgICAgICJBQUMgRXh0cmFjdG9yIiwKLSAgICAgICAgU25pZmYKKyAgICAgICAgeyAudjMgPSB7U25pZmYsIGV4dGVuc2lvbnN9IH0sCiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaAppbmRleCA5ZGFkYmVkLi42NDNkM2Y0IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaApAQCAtMTgsOCArMTgsOSBAQAogCiAjZGVmaW5lIEFBQ19FWFRSQUNUT1JfSF8KIAotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIApAQCAtMjgsMjMgKzI5LDIzIEBACiBzdHJ1Y3QgQU1lc3NhZ2U7CiBjbGFzcyBTdHJpbmc4OwogCi1jbGFzcyBBQUNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgQUFDRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIHB1YmxpYzoKLSAgICBBQUNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQpOworICAgIEFBQ0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJBQUNFeHRyYWN0b3IiOyB9CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BQUNFeHRyYWN0b3IoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKIAogICAgIFZlY3Rvcjx1aW50NjRfdD4gbU9mZnNldFZlY3RvcjsKQEAgLTU1LDcgKzU2LDcgQEAKIH07CiAKIGJvb2wgU25pZmZBQUMoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwgb2ZmNjRfdCAqb2Zmc2V0KTsKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsIG9mZjY0X3QgKm9mZnNldCk7CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCmluZGV4IDdjNTZjOTcuLmE1ODE2N2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icApAQCAtOCw3ICs4LDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5jcHAKaW5kZXggYmVhNmYxZC4uZmZlZmY0MiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuY3BwCkBAIC0yMCw4ICsyMCw2IEBACiAKICNpbmNsdWRlICJBTVJFeHRyYWN0b3IuaCIKIAotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgpAQCAtMzEsMjkgKzI5LDI5IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgQU1SU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgQU1SU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogcHVibGljOgogICAgIEFNUlNvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgICAgICBib29sIGlzV2lkZSwKICAgICAgICAgICAgIGNvbnN0IG9mZjY0X3QgKm9mZnNldF90YWJsZSwKICAgICAgICAgICAgIHNpemVfdCBvZmZzZXRfdGFibGVfbGVuZ3RoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QU1SU291cmNlKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogICAgIGJvb2wgbUlzV2lkZTsKIAogICAgIG9mZjY0X3QgbU9mZnNldDsKQEAgLTk4LDI3ICs5NiwyNyBAQAogICAgIHJldHVybiBmcmFtZVNpemU7CiB9CiAKLXN0YXRpYyBzdGF0dXNfdCBnZXRGcmFtZVNpemVCeU9mZnNldChEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIG1lZGlhX3N0YXR1c190IGdldEZyYW1lU2l6ZUJ5T2Zmc2V0KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwKICAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIGJvb2wgaXNXaWRlLCBzaXplX3QgKmZyYW1lU2l6ZSkgewogICAgIHVpbnQ4X3QgaGVhZGVyOwogICAgIHNzaXplX3QgY291bnQgPSBzb3VyY2UtPnJlYWRBdChvZmZzZXQsICZoZWFkZXIsIDEpOwogICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfSBlbHNlIGlmIChjb3VudCA8IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgIH0KIAogICAgIHVuc2lnbmVkIEZUID0gKGhlYWRlciA+PiAzKSAmIDB4MGY7CiAKICAgICAqZnJhbWVTaXplID0gZ2V0RnJhbWVTaXplKGlzV2lkZSwgRlQpOwogICAgIGlmICgqZnJhbWVTaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzdGF0aWMgYm9vbCBTbmlmZkFNUigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgYm9vbCAqaXNXaWRlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGJvb2wgKmlzV2lkZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKICAgICBjaGFyIGhlYWRlcls5XTsKIAogICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSAhPSBzaXplb2YoaGVhZGVyKSkgewpAQCAtMTQ0LDcgKzE0Miw3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1BTVJFeHRyYWN0b3I6OkFNUkV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorQU1SRXh0cmFjdG9yOjpBTVJFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCiAgICAgICBtT2Zmc2V0VGFibGVMZW5ndGgoMCkgewpAQCAtMTUzLDEyICsxNTEsMTIgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIG1NZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICBrS2V5TUlNRVR5cGUsIG1Jc1dpZGUgPyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7CisgICAgbU1ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLAorICAgICAgICAgICAgbUlzV2lkZSA/IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiA6IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7CiAKLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAxKTsKLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbUlzV2lkZSA/IDE2MDAwIDogODAwMCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIDEpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgbUlzV2lkZSA/IDE2MDAwIDogODAwMCk7CiAKICAgICBvZmY2NF90IG9mZnNldCA9IG1Jc1dpZGUgPyA5IDogNjsKICAgICBvZmY2NF90IHN0cmVhbVNpemU7CkBAIC0xNjYsMTEgKzE2NCwxMSBAQAogICAgIGludDY0X3QgZHVyYXRpb24gPSAwOwogCiAgICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplKCZzdHJlYW1TaXplKSA9PSBPSykgewotICAgICAgICAgd2hpbGUgKG9mZnNldCA8IHN0cmVhbVNpemUpIHsKLSAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRGcmFtZVNpemVCeU9mZnNldChzb3VyY2UsIG9mZnNldCwgbUlzV2lkZSwgJmZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHdoaWxlIChvZmZzZXQgPCBzdHJlYW1TaXplKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRGcmFtZVNpemVCeU9mZnNldChzb3VyY2UsIG9mZnNldCwgbUlzV2lkZSwgJmZyYW1lU2l6ZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCkBAIC0xODUsMzAgKzE4MywzMyBAQAogICAgICAgICAgICAgbnVtRnJhbWVzICsrOwogICAgICAgICB9CiAKLSAgICAgICAgbU1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbik7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZHVyYXRpb24pOwogICAgIH0KIAogICAgIG1Jbml0Q2hlY2sgPSBPSzsKIH0KIAogQU1SRXh0cmFjdG9yOjp+QU1SRXh0cmFjdG9yKCkgeworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1NZXRhKTsKIH0KIAotc3RhdHVzX3QgQU1SRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLmNsZWFyKCk7CittZWRpYV9zdGF0dXNfdCBBTVJFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKIAogICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7Ci0gICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1Jc1dpZGUgPyAiYXVkaW8vYW1yLXdiIiA6ICJhdWRpby9hbXIiKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgbUlzV2lkZSA/IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiA6ICJhdWRpby9hbXIiKTsKICAgICB9CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc2l6ZV90IEFNUkV4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CiAgICAgcmV0dXJuIG1Jbml0Q2hlY2sgPT0gT0sgPyAxIDogMDsKIH0KIAotTWVkaWFUcmFjayAqQU1SRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXIgKkFNUkV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0yMTcsMTkgKzIxOCwxOCBAQAogICAgICAgICAgICAgbU9mZnNldFRhYmxlLCBtT2Zmc2V0VGFibGVMZW5ndGgpOwogfQogCi1zdGF0dXNfdCBBTVJFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CittZWRpYV9zdGF0dXNfdCBBTVJFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogQU1SU291cmNlOjpBTVJTb3VyY2UoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIGJvb2wgaXNXaWRlLCBjb25zdCBvZmY2NF90ICpvZmZzZXRfdGFibGUsIHNpemVfdCBvZmZzZXRfdGFibGVfbGVuZ3RoKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1NZXRhKG1ldGEpLApAQCAtMjUwLDM1ICsyNTAsMzAgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IEFNUlNvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICogLyogcGFyYW1zICovKSB7CittZWRpYV9zdGF0dXNfdCBBTVJTb3VyY2U6OnN0YXJ0KCkgewogICAgIENIRUNLKCFtU3RhcnRlZCk7CiAKICAgICBtT2Zmc2V0ID0gbUlzV2lkZSA/IDkgOiA2OwogICAgIG1DdXJyZW50VGltZVVzID0gMDsKLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLSAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoMTI4KSk7CisgICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKDEyOCk7CiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IEFNUlNvdXJjZTo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IEFNUlNvdXJjZTo6c3RvcCgpIHsKICAgICBDSEVDSyhtU3RhcnRlZCk7CiAKLSAgICBkZWxldGUgbUdyb3VwOwotICAgIG1Hcm91cCA9IE5VTEw7Ci0KICAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBBTVJTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworbWVkaWFfc3RhdHVzX3QgQU1SU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKIH0KIAotc3RhdHVzX3QgQU1SU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBBTVJTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwpAQCAtMjk2LDcgKzI5MSw3IEBACiAgICAgICAgIG1PZmZzZXQgPSBtT2Zmc2V0VGFibGVbaW5kZXhdICsgKG1Jc1dpZGUgPyA5IDogNik7CiAKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGk8IHNlZWtGcmFtZSAtIGluZGV4ICogNTA7IGkrKykgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyOwogICAgICAgICAgICAgaWYgKChlcnIgPSBnZXRGcmFtZVNpemVCeU9mZnNldChtRGF0YVNvdXJjZSwgbU9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNXaWRlLCAmc2l6ZSkpICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTMwOSw3ICszMDQsNyBAQAogICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQobU9mZnNldCwgJmhlYWRlciwgMSk7CiAKICAgICBpZiAobiA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKICAgICBpZiAoaGVhZGVyICYgMHg4MykgewpAQCAtMzE3LDIwICszMTIsMjAgQEAKIAogICAgICAgICBBTE9HRSgicGFkZGluZyBiaXRzIG11c3QgYmUgMCwgaGVhZGVyIGlzIDB4JTAyeCIsIGhlYWRlcik7CiAKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgdW5zaWduZWQgRlQgPSAoaGVhZGVyID4+IDMpICYgMHgwZjsKIAogICAgIHNpemVfdCBmcmFtZVNpemUgPSBnZXRGcmFtZVNpemUobUlzV2lkZSwgRlQpOwogICAgIGlmIChmcmFtZVNpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CisgICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChtT2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgZnJhbWVTaXplKTsKQEAgLTM0MCw1MCArMzM1LDYzIEBACiAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAKICAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gb25seSBwYXJ0aWFsIGZyYW1lIGlzIGF2YWlsYWJsZSwgdHJlYXQgaXQgYXMgRU9TLgogICAgICAgICAgICAgbU9mZnNldCArPSBuOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgIH0KICAgICB9CiAKICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBmcmFtZVNpemUpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIG1DdXJyZW50VGltZVVzKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCBtQ3VycmVudFRpbWVVcyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAKICAgICBtT2Zmc2V0ICs9IGZyYW1lU2l6ZTsKICAgICBtQ3VycmVudFRpbWVVcyArPSAyMDAwMDsgIC8vIEVhY2ggZnJhbWUgaXMgMjBtcwogCiAgICAgKm91dCA9IGJ1ZmZlcjsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZW5zaW9uc1tdID0geworICAgICJhbXIiLAorICAgICJhd2IiLAorICAgIE5VTEwKK307CisKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoImM4NjYzOWM5LTJmMzEtNDBhYy1hNzE1LWZhMDFiNDQ5M2FhZiIpLAogICAgICAgICAxLAogICAgICAgICAiQU1SIEV4dHJhY3RvciIsCi0gICAgICAgIFtdKAotICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgICAgICAgICAgdm9pZCAqKiwKLSAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIC0+IE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyB7Ci0gICAgICAgICAgICBpZiAoU25pZmZBTVIoc291cmNlLCBudWxscHRyLCBjb25maWRlbmNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQU1SRXh0cmFjdG9yKHNvdXJjZSk7fTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgLnYzID0geworICAgICAgICAgICAgICAgW10oCisgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgICAgICAgICAgICB2b2lkICoqLAorICAgICAgICAgICAgICAgICAgIEZyZWVNZXRhRnVuYyAqKSAtPiBDcmVhdG9yRnVuYyB7CisgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIoc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICBpZiAoU25pZmZBTVIoJmhlbHBlciwgbnVsbHB0ciwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBDTWVkaWFFeHRyYWN0b3IqIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKG5ldyBBTVJFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpO307CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgIGV4dGVuc2lvbnMKKyAgICAgICAgICAgfSwKKyAgICAgICAgfSwKICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5oCmluZGV4IGM5MGIzMjUuLmI3NmVlOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5oCkBAIC0xOSw4ICsxOSw5IEBACiAjZGVmaW5lIEFNUl9FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMjgsMjMgKzI5LDIzIEBACiBjbGFzcyBTdHJpbmc4OwogI2RlZmluZSBPRkZTRVRfVEFCTEVfTEVOICAgIDMwMAogCi1jbGFzcyBBTVJFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgQU1SRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBBTVJFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisgICAgZXhwbGljaXQgQU1SRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiQU1SRXh0cmFjdG9yIjsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QU1SRXh0cmFjdG9yKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgYm9vbCBtSXNXaWRlOwogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icAppbmRleCBiMmZiODgwLi40YmQ5MzNkIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKQEAgLTgsNyArOCw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAKaW5kZXggNDI0MmQ3Ni4uM2EzZDA1MSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAKQEAgLTgsMTMgKzgsMTcgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliRkxBQyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKICAgICBuYW1lOiAibGliZmxhY2V4dHJhY3RvciIsCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5jcHAKaW5kZXggY2NmODBkMC4uODg1NDYzMSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmNwcApAQCAtMjQsNDEgKzI0LDU2IEBACiAvLyBsaWJGTEFDIHBhcnNlcgogI2luY2x1ZGUgIkZMQUMvc3RyZWFtX2RlY29kZXIuaCIKIAotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgotI2luY2x1ZGUgPG1lZGlhL1ZvcmJpc0NvbW1lbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+IC8vIGZvciBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+IC8vIGZvciBBSURfTUVESUEKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvLyBNZWRpYVNlcnZlciBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nIGZsb2F0IGV4dHJhY3RvciBvdXRwdXQsIGJ1dCBnZW5lcmFsIHByb2Nlc3NlcworLy8gbWF5IG5vdCBiZSBhYmxlIHRvIGRvIHNvLgorLy8gVE9ETzogSW1wcm92ZSBBUEkgdG8gc2V0IGV4dHJhY3RvciBmbG9hdCBvdXRwdXQuCisvLyAoTm90ZTogZHVwbGljYXRlZCB3aXRoIFdBVkV4dHJhY3Rvci5jcHApCitzdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxkRXh0cmFjdG9yT3V0cHV0RmxvYXQoaW50IGJpdHNQZXJTYW1wbGUpCit7CisgICAgcmV0dXJuIGJpdHNQZXJTYW1wbGUgPiAxNiAmJiBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkKCkgPT0gQUlEX01FRElBOworfQorCiBjbGFzcyBGTEFDUGFyc2VyOwogCi1jbGFzcyBGTEFDU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgRkxBQ1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKIAogcHVibGljOgogICAgIEZMQUNTb3VyY2UoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSk7CisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAorICAgICAgICAgICAgYm9vbCBvdXRwdXRGbG9hdCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+RkxBQ1NvdXJjZSgpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBNZXRhRGF0YUJhc2UgbVRyYWNrTWV0YWRhdGE7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptVHJhY2tNZXRhZGF0YTsKKyAgICBjb25zdCBib29sIG1PdXRwdXRGbG9hdDsKICAgICBGTEFDUGFyc2VyICptUGFyc2VyOwogICAgIGJvb2wgbUluaXRDaGVjazsKICAgICBib29sIG1TdGFydGVkOwpAQCAtNzUsMTQgKzkwLDE1IEBACiAKIHB1YmxpYzoKICAgICBlbnVtIHsKLSAgICAgICAga01heENoYW5uZWxzID0gOCwKKyAgICAgICAga01heENoYW5uZWxzID0gRkNDXzgsCiAgICAgfTsKIAogICAgIGV4cGxpY2l0IEZMQUNQYXJzZXIoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAorICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAorICAgICAgICBib29sIG91dHB1dEZsb2F0LAogICAgICAgICAvLyBJZiBtZXRhZGF0YSBwb2ludGVycyBhcmVuJ3QgcHJvdmlkZWQsIHdlIGRvbid0IGZpbGwgdGhlbQotICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhZGF0YSA9IDAsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqdHJhY2tNZXRhZGF0YSA9IDApOworICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhZGF0YSA9IDAsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSA9IDApOwogCiAgICAgdmlydHVhbCB+RkxBQ1BhcnNlcigpOwogCkBAIC0xMDgsMjQgKzEyNCwyNSBAQAogICAgIH0KIAogICAgIC8vIG1lZGlhIGJ1ZmZlcnMKLSAgICB2b2lkIGFsbG9jYXRlQnVmZmVycygpOworICAgIHZvaWQgYWxsb2NhdGVCdWZmZXJzKE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKmdyb3VwKTsKICAgICB2b2lkIHJlbGVhc2VCdWZmZXJzKCk7Ci0gICAgTWVkaWFCdWZmZXJCYXNlICpyZWFkQnVmZmVyKCkgeworICAgIE1lZGlhQnVmZmVySGVscGVyICpyZWFkQnVmZmVyKCkgewogICAgICAgICByZXR1cm4gcmVhZEJ1ZmZlcihmYWxzZSwgMExMKTsKICAgICB9Ci0gICAgTWVkaWFCdWZmZXJCYXNlICpyZWFkQnVmZmVyKEZMQUNfX3VpbnQ2NCBzYW1wbGUpIHsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqcmVhZEJ1ZmZlcihGTEFDX191aW50NjQgc2FtcGxlKSB7CiAgICAgICAgIHJldHVybiByZWFkQnVmZmVyKHRydWUsIHNhbXBsZSk7CiAgICAgfQogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBNZXRhRGF0YUJhc2UgKm1GaWxlTWV0YWRhdGE7Ci0gICAgTWV0YURhdGFCYXNlICptVHJhY2tNZXRhZGF0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBjb25zdCBib29sIG1PdXRwdXRGbG9hdDsKKyAgICBBTWVkaWFGb3JtYXQgKm1GaWxlTWV0YWRhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptVHJhY2tNZXRhZGF0YTsKICAgICBib29sIG1Jbml0Q2hlY2s7CiAKICAgICAvLyBtZWRpYSBidWZmZXJzCiAgICAgc2l6ZV90IG1NYXhCdWZmZXJTaXplOwotICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKKyAgICBNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICptR3JvdXA7CiAgICAgdm9pZCAoKm1Db3B5KShpbnQxNl90ICpkc3QsIGNvbnN0IGludCAqIHNyY1trTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKTsKIAogICAgIC8vIGhhbmRsZSB0byB1bmRlcmx5aW5nIGxpYkZMQUMgcGFyc2VyCkBAIC0xNDksNyArMTY2LDcgQEAKICAgICBGTEFDX19TdHJlYW1EZWNvZGVyRXJyb3JTdGF0dXMgbUVycm9yU3RhdHVzOwogCiAgICAgc3RhdHVzX3QgaW5pdCgpOwotICAgIE1lZGlhQnVmZmVyQmFzZSAqcmVhZEJ1ZmZlcihib29sIGRvU2VlaywgRkxBQ19fdWludDY0IHNhbXBsZSk7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKnJlYWRCdWZmZXIoYm9vbCBkb1NlZWssIEZMQUNfX3VpbnQ2NCBzYW1wbGUpOwogCiAgICAgLy8gbm8gY29weSBjb25zdHJ1Y3RvciBvciBhc3NpZ25tZW50CiAgICAgRkxBQ1BhcnNlcihjb25zdCBGTEFDUGFyc2VyICYpOwpAQCAtMTY5LDYgKzE4Niw3IEBACiAgICAgICAgICAgICBjb25zdCBGTEFDX19GcmFtZSAqZnJhbWUsIGNvbnN0IEZMQUNfX2ludDMyICogY29uc3QgYnVmZmVyW10pOwogICAgIHZvaWQgbWV0YWRhdGFDYWxsYmFjayhjb25zdCBGTEFDX19TdHJlYW1NZXRhZGF0YSAqbWV0YWRhdGEpOwogICAgIHZvaWQgZXJyb3JDYWxsYmFjayhGTEFDX19TdHJlYW1EZWNvZGVyRXJyb3JTdGF0dXMgc3RhdHVzKTsKKyAgICBzaXplX3QgZ2V0T3V0cHV0U2FtcGxlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1PdXRwdXRGbG9hdCA/IHNpemVvZihmbG9hdCkgOiBzaXplb2YoaW50MTZfdCk7IH0KIAogICAgIC8vIEZMQUMgcGFyc2VyIGNhbGxiYWNrcyBhcyBDLWNhbGxhYmxlIGZ1bmN0aW9ucwogICAgIHN0YXRpYyBGTEFDX19TdHJlYW1EZWNvZGVyUmVhZFN0YXR1cyByZWFkX2NhbGxiYWNrKApAQCAtMzY0LDkgKzM4Miw4IEBACiAgICAgY2FzZSBGTEFDX19NRVRBREFUQV9UWVBFX1BJQ1RVUkU6CiAgICAgICAgIGlmIChtRmlsZU1ldGFkYXRhICE9IDApIHsKICAgICAgICAgICAgIGNvbnN0IEZMQUNfX1N0cmVhbU1ldGFkYXRhX1BpY3R1cmUgKnAgPSAmbWV0YWRhdGEtPmRhdGEucGljdHVyZTsKLSAgICAgICAgICAgIG1GaWxlTWV0YWRhdGEtPnNldERhdGEoa0tleUFsYnVtQXJ0LAotICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YTo6VFlQRV9OT05FLCBwLT5kYXRhLCBwLT5kYXRhX2xlbmd0aCk7Ci0gICAgICAgICAgICBtRmlsZU1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlBbGJ1bUFydE1JTUUsIHAtPm1pbWVfdHlwZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1GaWxlTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQsCisgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSwgcC0+ZGF0YV9sZW5ndGgpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CkBAIC0zODEsMTIyICszOTgsNjEgQEAKICAgICBtRXJyb3JTdGF0dXMgPSBzdGF0dXM7CiB9CiAKLS8vIENvcHkgc2FtcGxlcyBmcm9tIEZMQUMgbmF0aXZlIDMyLWJpdCBub24taW50ZXJsZWF2ZWQgdG8gMTYtYml0IGludGVybGVhdmVkLgorLy8gQ29weSBzYW1wbGVzIGZyb20gRkxBQyBuYXRpdmUgMzItYml0IG5vbi1pbnRlcmxlYXZlZCB0byAxNi1iaXQgc2lnbmVkCisvLyBvciAzMi1iaXQgZmxvYXQgaW50ZXJsZWF2ZWQuCisvLyBUT0RPOiBDb25zaWRlciBtb3ZpbmcgdG8gYXVkaW9fdXRpbHMuCiAvLyBUaGVzZSBhcmUgY2FuZGlkYXRlcyBmb3Igb3B0aW1pemF0aW9uIGlmIG5lZWRlZC4KLQotc3RhdGljIHZvaWQgY29weU1vbm84KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAorc3RhdGljIHZvaWQgY29weVRvMTZTaWduZWQoCisgICAgICAgIHNob3J0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqY29uc3QgKnNyYywKICAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA8PCA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weVN0ZXJlbzgoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPDwgODsKLSAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldIDw8IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5TXVsdGlDaDgoaW50MTZfdCAqZHN0LCBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscykKLXsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA8PCA4OworICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMsCisgICAgICAgIHVuc2lnbmVkIGJpdHNQZXJTYW1wbGUpIHsKKyAgICBjb25zdCBpbnQgbGVmdFNoaWZ0ID0gMTYgLSAoaW50KWJpdHNQZXJTYW1wbGU7IC8vIGNhc3QgdG8gaW50IHRvIHByZXZlbnQgdW5zaWduZWQgb3ZlcmZsb3cuCisgICAgaWYgKGxlZnRTaGlmdCA+PSAwKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPDwgbGVmdFNoaWZ0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgaW50IHJpZ2h0U2hpZnQgPSAtbGVmdFNoaWZ0OworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldID4+IHJpZ2h0U2hpZnQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlNb25vMTYoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCitzdGF0aWMgdm9pZCBjb3B5VG9GbG9hdCgKKyAgICAgICAgZmxvYXQgKmRzdCwKKyAgICAgICAgY29uc3QgaW50ICpjb25zdCAqc3JjLAogICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weVN0ZXJlbzE2KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldOwotICAgICAgICAqZHN0KysgPSBzcmNbMV1baV07Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5TXVsdGlDaDE2KGludDE2X3QgKmRzdCwgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17CisgICAgICAgIHVuc2lnbmVkIG5DaGFubmVscywKKyAgICAgICAgdW5zaWduZWQgYml0c1BlclNhbXBsZSkgeworICAgIGNvbnN0IHVuc2lnbmVkIGxlZnRTaGlmdCA9IDMyIC0gYml0c1BlclNhbXBsZTsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewogICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXTsKKyAgICAgICAgICAgICpkc3QrKyA9IGZsb2F0X2Zyb21faTMyKHNyY1tjXVtpXSA8PCBsZWZ0U2hpZnQpOwogICAgICAgICB9CiAgICAgfQogfQogCi0vLyAyNC1iaXQgdmVyc2lvbnMgc2hvdWxkIGRvIGRpdGhlcmluZyBvciBub2lzZS1zaGFwaW5nLCBoZXJlIG9yIGluIEF1ZGlvRmxpbmdlcgotCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzI0KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldID4+IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvMjQoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPj4gODsKLSAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldID4+IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5TXVsdGlDaDI0KGludDE2X3QgKmRzdCwgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPj4gODsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weVRyZXNwYXNzKAotICAgICAgICBpbnQxNl90ICogLyogZHN0ICovLAotICAgICAgICBjb25zdCBpbnQgKltGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdIC8qIHNyYyAqLywKLSAgICAgICAgdW5zaWduZWQgLyogblNhbXBsZXMgKi8sCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIFRSRVNQQVNTKCk7Ci19Ci0KIC8vIEZMQUNQYXJzZXIKIAogRkxBQ1BhcnNlcjo6RkxBQ1BhcnNlcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGFkYXRhLAotICAgICAgICBNZXRhRGF0YUJhc2UgKnRyYWNrTWV0YWRhdGEpCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCisgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZmlsZU1ldGFkYXRhLAorICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YWRhdGEpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKKyAgICAgIG1PdXRwdXRGbG9hdChvdXRwdXRGbG9hdCksCiAgICAgICBtRmlsZU1ldGFkYXRhKGZpbGVNZXRhZGF0YSksCiAgICAgICBtVHJhY2tNZXRhZGF0YSh0cmFja01ldGFkYXRhKSwKICAgICAgIG1Jbml0Q2hlY2soZmFsc2UpLAogICAgICAgbU1heEJ1ZmZlclNpemUoMCksCiAgICAgICBtR3JvdXAoTlVMTCksCi0gICAgICBtQ29weShjb3B5VHJlc3Bhc3MpLAogICAgICAgbURlY29kZXIoTlVMTCksCiAgICAgICBtQ3VycmVudFBvcygwTEwpLAogICAgICAgbUVPRihmYWxzZSksCkBAIC01NjcsOCArNTIzLDEwIEBACiAgICAgICAgIGNhc2UgODoKICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgY2FzZSAzMjogLy8gZ2VuZXJhbGx5IG5vdCBleHBlY3RlZCBmb3IgRkxBQwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBOb3RlOiBpbnRlcm5hbGx5IHRoZSBGTEFDIGV4dHJhY3RvciBzdXBwb3J0cyAyLTMyIGJpdHMuCiAgICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgYml0cyBwZXIgc2FtcGxlICV1IiwgZ2V0Qml0c1BlclNhbXBsZSgpKTsKICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgICAgICB9CkBAIC01ODUsNzEgKzU0Myw1MyBAQAogICAgICAgICBjYXNlIDQ4MDAwOgogICAgICAgICBjYXNlIDg4MjAwOgogICAgICAgICBjYXNlIDk2MDAwOgorICAgICAgICBjYXNlIDE3NjQwMDoKKyAgICAgICAgY2FzZSAxOTIwMDA6CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIE5vdGU6IGludGVybmFsbHkgd2Ugc3VwcG9ydCBhcmJpdHJhcnkgc2FtcGxlIHJhdGVzIGZyb20gOGtIeiB0byAxOTJrSHouCiAgICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgc2FtcGxlIHJhdGUgJXUiLCBnZXRTYW1wbGVSYXRlKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgICAgIH0KLSAgICAgICAgLy8gY29uZmlndXJlIHRoZSBhcHByb3ByaWF0ZSBjb3B5IGZ1bmN0aW9uLCBkZWZhdWx0aW5nIHRvIHRyZXNwYXNzCi0gICAgICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewotICAgICAgICAgICAgdW5zaWduZWQgbUNoYW5uZWxzOwotICAgICAgICAgICAgdW5zaWduZWQgbUJpdHNQZXJTYW1wbGU7Ci0gICAgICAgICAgICB2b2lkICgqbUNvcHkpKGludDE2X3QgKmRzdCwgY29uc3QgaW50ICogc3JjW2tNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpOwotICAgICAgICB9IHRhYmxlW10gPSB7Ci0gICAgICAgICAgICB7IDEsICA4LCBjb3B5TW9ubzggICAgfSwKLSAgICAgICAgICAgIHsgMiwgIDgsIGNvcHlTdGVyZW84ICB9LAotICAgICAgICAgICAgeyA4LCAgOCwgY29weU11bHRpQ2g4ICB9LAotICAgICAgICAgICAgeyAxLCAxNiwgY29weU1vbm8xNiAgIH0sCi0gICAgICAgICAgICB7IDIsIDE2LCBjb3B5U3RlcmVvMTYgfSwKLSAgICAgICAgICAgIHsgOCwgMTYsIGNvcHlNdWx0aUNoMTYgfSwKLSAgICAgICAgICAgIHsgMSwgMjQsIGNvcHlNb25vMjQgICB9LAotICAgICAgICAgICAgeyAyLCAyNCwgY29weVN0ZXJlbzI0IH0sCi0gICAgICAgICAgICB7IDgsIDI0LCBjb3B5TXVsdGlDaDI0IH0sCi0gICAgICAgIH07Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplb2YodGFibGUpL3NpemVvZih0YWJsZVswXSk7ICsraSkgewotICAgICAgICAgICAgaWYgKHRhYmxlW2ldLm1DaGFubmVscyA+PSBnZXRDaGFubmVscygpICYmCi0gICAgICAgICAgICAgICAgICAgIHRhYmxlW2ldLm1CaXRzUGVyU2FtcGxlID09IGdldEJpdHNQZXJTYW1wbGUoKSkgewotICAgICAgICAgICAgICAgIG1Db3B5ID0gdGFibGVbaV0ubUNvcHk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICAgICAgLy8gcG9wdWxhdGUgdHJhY2sgbWV0YWRhdGEKICAgICAgICAgaWYgKG1UcmFja01ldGFkYXRhICE9IDApIHsKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBnZXRDaGFubmVscygpKTsKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgZ2V0U2FtcGxlUmF0ZSgpKTsKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgZ2V0Qml0c1BlclNhbXBsZSgpKTsKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtVHJhY2tNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGdldENoYW5uZWxzKCkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBnZXRTYW1wbGVSYXRlKCkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgZ2V0Qml0c1BlclNhbXBsZSgpKTsKICAgICAgICAgICAgIC8vIHNhbXBsZSByYXRlIGlzIG5vbi16ZXJvLCBzbyBkaXZpc2lvbiBieSB6ZXJvIG5vdCBwb3NzaWJsZQotICAgICAgICAgICAgbVRyYWNrTWV0YWRhdGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgKGdldFRvdGFsU2FtcGxlcygpICogMTAwMDAwMExMKSAvIGdldFNhbXBsZVJhdGUoKSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobVRyYWNrTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIChnZXRUb3RhbFNhbXBsZXMoKSAqIDEwMDAwMDBMTCkgLyBnZXRTYW1wbGVSYXRlKCkpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0UoIm1pc3NpbmcgU1RSRUFNSU5GTyIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgaWYgKG1GaWxlTWV0YWRhdGEgIT0gMCkgewotICAgICAgICBtRmlsZU1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgRkxBQ1BhcnNlcjo6YWxsb2NhdGVCdWZmZXJzKCkKK3ZvaWQgRkxBQ1BhcnNlcjo6YWxsb2NhdGVCdWZmZXJzKE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKmdyb3VwKQogewogICAgIENIRUNLKG1Hcm91cCA9PSBOVUxMKTsKLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLSAgICBtTWF4QnVmZmVyU2l6ZSA9IGdldE1heEJsb2NrU2l6ZSgpICogZ2V0Q2hhbm5lbHMoKSAqIHNpemVvZihpbnQxNl90KTsKLSAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUobU1heEJ1ZmZlclNpemUpKTsKKyAgICBtR3JvdXAgPSBncm91cDsKKyAgICBtTWF4QnVmZmVyU2l6ZSA9IGdldE1heEJsb2NrU2l6ZSgpICogZ2V0Q2hhbm5lbHMoKSAqIGdldE91dHB1dFNhbXBsZVNpemUoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobVRyYWNrTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIG1NYXhCdWZmZXJTaXplKTsKKyAgICBtR3JvdXAtPmFkZF9idWZmZXIobU1heEJ1ZmZlclNpemUpOwogfQogCiB2b2lkIEZMQUNQYXJzZXI6OnJlbGVhc2VCdWZmZXJzKCkKIHsKLSAgICBDSEVDSyhtR3JvdXAgIT0gTlVMTCk7Ci0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwogfQogCi1NZWRpYUJ1ZmZlckJhc2UgKkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIoYm9vbCBkb1NlZWssIEZMQUNfX3VpbnQ2NCBzYW1wbGUpCitNZWRpYUJ1ZmZlckhlbHBlciAqRkxBQ1BhcnNlcjo6cmVhZEJ1ZmZlcihib29sIGRvU2VlaywgRkxBQ19fdWludDY0IHNhbXBsZSkKIHsKICAgICBtV3JpdGVSZXF1ZXN0ZWQgPSB0cnVlOwogICAgIG1Xcml0ZUNvbXBsZXRlZCA9IGZhbHNlOwpAQCAtNjg2LDQxICs2MjYsNTMgQEAKICAgICB9CiAgICAgLy8gYWNxdWlyZSBhIG1lZGlhIGJ1ZmZlcgogICAgIENIRUNLKG1Hcm91cCAhPSBOVUxMKTsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOwogICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBibG9ja3NpemUgKiBnZXRDaGFubmVscygpICogc2l6ZW9mKGludDE2X3QpOworICAgIGNvbnN0IHNpemVfdCBidWZmZXJTaXplID0gYmxvY2tzaXplICogZ2V0Q2hhbm5lbHMoKSAqIGdldE91dHB1dFNhbXBsZVNpemUoKTsKICAgICBDSEVDSyhidWZmZXJTaXplIDw9IG1NYXhCdWZmZXJTaXplKTsKLSAgICBpbnQxNl90ICpkYXRhID0gKGludDE2X3QgKikgYnVmZmVyLT5kYXRhKCk7CiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgYnVmZmVyU2l6ZSk7CiAgICAgLy8gY29weSBQQ00gZnJvbSBGTEFDIHdyaXRlIGJ1ZmZlciB0byBvdXIgbWVkaWEgYnVmZmVyLCB3aXRoIGludGVybGVhdmluZwotICAgICgqbUNvcHkpKGRhdGEsIG1Xcml0ZUJ1ZmZlciwgYmxvY2tzaXplLCBnZXRDaGFubmVscygpKTsKKyAgICBjb25zdCB1bnNpZ25lZCBiaXRzUGVyU2FtcGxlID0gZ2V0Qml0c1BlclNhbXBsZSgpOworICAgIGlmIChtT3V0cHV0RmxvYXQpIHsKKyAgICAgICAgY29weVRvRmxvYXQocmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KGJ1ZmZlci0+ZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgbVdyaXRlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBibG9ja3NpemUsCisgICAgICAgICAgICAgICAgICAgIGdldENoYW5uZWxzKCksCisgICAgICAgICAgICAgICAgICAgIGJpdHNQZXJTYW1wbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvcHlUbzE2U2lnbmVkKHJlaW50ZXJwcmV0X2Nhc3Q8c2hvcnQqPihidWZmZXItPmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgIG1Xcml0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBnZXRDaGFubmVscygpLAorICAgICAgICAgICAgICAgICAgICAgICBiaXRzUGVyU2FtcGxlKTsKKyAgICB9CiAgICAgLy8gZmlsbCBpbiBidWZmZXIgbWV0YWRhdGEKICAgICBDSEVDSyhtV3JpdGVIZWFkZXIubnVtYmVyX3R5cGUgPT0gRkxBQ19fRlJBTUVfTlVNQkVSX1RZUEVfU0FNUExFX05VTUJFUik7CiAgICAgRkxBQ19fdWludDY0IHNhbXBsZU51bWJlciA9IG1Xcml0ZUhlYWRlci5udW1iZXIuc2FtcGxlX251bWJlcjsKICAgICBpbnQ2NF90IHRpbWVVcyA9ICgxMDAwMDAwTEwgKiBzYW1wbGVOdW1iZXIpIC8gZ2V0U2FtcGxlUmF0ZSgpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVVzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKICAgICByZXR1cm4gYnVmZmVyOwogfQogCiAvLyBGTEFDc291cmNlCiAKIEZMQUNTb3VyY2U6OkZMQUNTb3VyY2UoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICBNZXRhRGF0YUJhc2UgJnRyYWNrTWV0YWRhdGEpCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSwKKyAgICAgICAgYm9vbCBvdXRwdXRGbG9hdCkKICAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAogICAgICAgbVRyYWNrTWV0YWRhdGEodHJhY2tNZXRhZGF0YSksCi0gICAgICBtUGFyc2VyKDApLAotICAgICAgbUluaXRDaGVjayhmYWxzZSksCisgICAgICBtT3V0cHV0RmxvYXQob3V0cHV0RmxvYXQpLAorICAgICAgbVBhcnNlcihuZXcgRkxBQ1BhcnNlcihtRGF0YVNvdXJjZSwgb3V0cHV0RmxvYXQsIDAsIG1UcmFja01ldGFkYXRhKSksCisgICAgICBtSW5pdENoZWNrKG1QYXJzZXItPmluaXRDaGVjaygpKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKQogewogICAgIEFMT0dWKCJGTEFDU291cmNlOjpGTEFDU291cmNlIik7Ci0gICAgLy8gcmUtdXNlIHRoZSBzYW1lIHRyYWNrIG1ldGFkYXRhIHBhc3NlZCBpbnRvIGNvbnN0cnVjdG9yIGZyb20gRkxBQ0V4dHJhY3RvcgotICAgIG1QYXJzZXIgPSBuZXcgRkxBQ1BhcnNlcihtRGF0YVNvdXJjZSk7Ci0gICAgbUluaXRDaGVjayAgPSBtUGFyc2VyLT5pbml0Q2hlY2soKTsKIH0KIAogRkxBQ1NvdXJjZTo6fkZMQUNTb3VyY2UoKQpAQCAtNzMyLDE4ICs2ODQsMTggQEAKICAgICBkZWxldGUgbVBhcnNlcjsKIH0KIAotc3RhdHVzX3QgRkxBQ1NvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICogLyogcGFyYW1zICovKQorbWVkaWFfc3RhdHVzX3QgRkxBQ1NvdXJjZTo6c3RhcnQoKQogewogICAgIEFMT0dWKCJGTEFDU291cmNlOjpzdGFydCIpOwogCiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKLSAgICBtUGFyc2VyLT5hbGxvY2F0ZUJ1ZmZlcnMoKTsKKyAgICBtUGFyc2VyLT5hbGxvY2F0ZUJ1ZmZlcnMobUJ1ZmZlckdyb3VwKTsKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgRkxBQ1NvdXJjZTo6c3RvcCgpCittZWRpYV9zdGF0dXNfdCBGTEFDU291cmNlOjpzdG9wKCkKIHsKICAgICBBTE9HVigiRkxBQ1NvdXJjZTo6c3RvcCIpOwogCkBAIC03NTEsMTkgKzcwMywyMyBAQAogICAgIG1QYXJzZXItPnJlbGVhc2VCdWZmZXJzKCk7CiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBGTEFDU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKQorbWVkaWFfc3RhdHVzX3QgRkxBQ1NvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkKIHsKLSAgICBtZXRhID0gbVRyYWNrTWV0YWRhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIGNvbnN0IG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1UcmFja01ldGFkYXRhKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORywKKyAgICAgICAgICAgICAgICBtT3V0cHV0RmxvYXQgPyBrQXVkaW9FbmNvZGluZ1BjbUZsb2F0IDoga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEZMQUNTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dEJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpCittZWRpYV9zdGF0dXNfdCBGTEFDU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dEJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpCiB7Ci0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcjsKICAgICAvLyBwcm9jZXNzIGFuIG9wdGlvbmFsIHNlZWsgcmVxdWVzdAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKICAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKQEAgLTc4NCwyMCArNzQwLDIyIEBACiAgICAgICAgIGJ1ZmZlciA9IG1QYXJzZXItPnJlYWRCdWZmZXIoKTsKICAgICB9CiAgICAgKm91dEJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gYnVmZmVyICE9IE5VTEwgPyAoc3RhdHVzX3QpIE9LIDogKHN0YXR1c190KSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIHJldHVybiBidWZmZXIgIT0gTlVMTCA/IEFNRURJQV9PSyA6IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogfQogCiAvLyBGTEFDRXh0cmFjdG9yCiAKIEZMQUNFeHRyYWN0b3I6OkZMQUNFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlKQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlKQogICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCiAgICAgICBtUGFyc2VyKG51bGxwdHIpLAogICAgICAgbUluaXRDaGVjayhmYWxzZSkKIHsKICAgICBBTE9HVigiRkxBQ0V4dHJhY3Rvcjo6RkxBQ0V4dHJhY3RvciIpOwogICAgIC8vIEZMQUNQYXJzZXIgd2lsbCBmaWxsIGluIHRoZSBtZXRhZGF0YSBmb3IgdXMKLSAgICBtUGFyc2VyID0gbmV3IEZMQUNQYXJzZXIobURhdGFTb3VyY2UsICZtRmlsZU1ldGFkYXRhLCAmbVRyYWNrTWV0YWRhdGEpOworICAgIG1GaWxlTWV0YWRhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgbVRyYWNrTWV0YWRhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgbVBhcnNlciA9IG5ldyBGTEFDUGFyc2VyKG1EYXRhU291cmNlLCBmYWxzZSAvKiBvdXRwdXRGbG9hdCAqLywgbUZpbGVNZXRhZGF0YSwgbVRyYWNrTWV0YWRhdGEpOwogICAgIG1Jbml0Q2hlY2sgPSBtUGFyc2VyLT5pbml0Q2hlY2soKTsKIH0KIApAQCAtODA1LDYgKzc2Myw5IEBACiB7CiAgICAgQUxPR1YoIn5GTEFDRXh0cmFjdG9yOjpGTEFDRXh0cmFjdG9yIik7CiAgICAgZGVsZXRlIG1QYXJzZXI7CisgICAgZGVsZXRlIG1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobUZpbGVNZXRhZGF0YSk7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtVHJhY2tNZXRhZGF0YSk7CiB9CiAKIHNpemVfdCBGTEFDRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpCkBAIC04MTIsNDIgKzc3Myw3NiBAQAogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKkZMQUNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkKK01lZGlhVHJhY2tIZWxwZXIgKkZMQUNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkKIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHJldHVybiBuZXcgRkxBQ1NvdXJjZShtRGF0YVNvdXJjZSwgbVRyYWNrTWV0YWRhdGEpOworCisgICAgcmV0dXJuIG5ldyBGTEFDU291cmNlKAorICAgICAgICAgICAgbURhdGFTb3VyY2UsIG1UcmFja01ldGFkYXRhLCBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChtUGFyc2VyLT5nZXRCaXRzUGVyU2FtcGxlKCkpKTsKIH0KIAotc3RhdHVzX3QgRkxBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgRkxBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQotICAgIG1ldGEgPSBtVHJhY2tNZXRhZGF0YTsKLSAgICByZXR1cm4gT0s7CisgICAgY29uc3QgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbVRyYWNrTWV0YWRhdGEpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLAorICAgICAgICAgICAgICAgIHNob3VsZEV4dHJhY3Rvck91dHB1dEZsb2F0KG1QYXJzZXItPmdldEJpdHNQZXJTYW1wbGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgID8ga0F1ZGlvRW5jb2RpbmdQY21GbG9hdCA6IGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBGTEFDRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpCittZWRpYV9zdGF0dXNfdCBGTEFDRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpCiB7Ci0gICAgbWV0YSA9IG1GaWxlTWV0YWRhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtRmlsZU1ldGFkYXRhKTsKIH0KIAogLy8gU25pZmZlcgogCi1ib29sIFNuaWZmRkxBQyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkKK2Jvb2wgU25pZmZGTEFDKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpCiB7Ci0gICAgLy8gZmlyc3QgNCBpcyB0aGUgc2lnbmF0dXJlIHdvcmQKLSAgICAvLyBzZWNvbmQgNCBpcyB0aGUgc2l6ZW9mIFNUUkVBTUlORk8KLSAgICAvLyAwNDIgaXMgdGhlIG1hbmRhdG9yeSBTVFJFQU1JTkZPCi0gICAgLy8gbm8gbmVlZCB0byByZWFkIHJlc3Qgb2YgdGhlIGhlYWRlciwgYXMgYSBwcmVtYXR1cmUgRU9GIHdpbGwgYmUgY2F1Z2h0IGxhdGVyCi0gICAgdWludDhfdCBoZWFkZXJbNCs0XTsKLSAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgIT0gc2l6ZW9mKGhlYWRlcikKLSAgICAgICAgICAgIHx8IG1lbWNtcCgiZkxhQ1wwXDBcMFwwNDIiLCBoZWFkZXIsIDQrNCkpCi0gICAgeworICAgIC8vIFNraXAgSUQzIHRhZ3MKKyAgICBvZmY2NF90IHBvcyA9IDA7CisgICAgdWludDhfdCBoZWFkZXJbMTBdOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KHBvcywgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgIT0gc2l6ZW9mKGhlYWRlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gbm8gbW9yZSBmaWxlIHRvIHJlYWQuCisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBmb3IgSUQzIHRhZworICAgICAgICBpZiAobWVtY21wKCJJRDMiLCBoZWFkZXIsIDMpICE9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOyAvLyBub3QgYW4gSUQzIHRhZy4KKyAgICAgICAgfQorCisgICAgICAgIC8vIHNraXAgdGhlIElEM3YyIGRhdGEgYW5kIGNoZWNrIGFnYWluCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGlkM0xlbiA9IDEwICsKKyAgICAgICAgICAgICAgICAoKChoZWFkZXJbNl0gJiAweDdmKSA8PCAyMSkKKyAgICAgICAgICAgICAgICAgfCAoKGhlYWRlcls3XSAmIDB4N2YpIDw8IDE0KQorICAgICAgICAgICAgICAgICB8ICgoaGVhZGVyWzhdICYgMHg3ZikgPDwgNykKKyAgICAgICAgICAgICAgICAgfCAoaGVhZGVyWzldICYgMHg3ZikpOworICAgICAgICBwb3MgKz0gaWQzTGVuOworCisgICAgICAgIEFMT0dWKCJza2lwcGVkIElEMyB0YWcgb2YgbGVuICV1IG5ldyBzdGFydGluZyBvZmZzZXQgaXMgJSMwMTZsbHgiLAorICAgICAgICAgICAgICAgIGlkM0xlbiwgKGxvbmcgbG9uZylwb3MpOworICAgIH0KKworICAgIC8vIENoZWNrIEZMQUMgaGVhZGVyLgorICAgIC8vIGh0dHBzOi8veGlwaC5vcmcvZmxhYy9mb3JtYXQuaHRtbCNzdHJlYW0KKyAgICAvLworICAgIC8vIE5vdGU6IGNvbnRlbnQgc3RvcmVkIGJpZyBlbmRpYW4uCisgICAgLy8gYnl0ZSBvZmZzZXQgIGJpdCBzaXplICBjb250ZW50CisgICAgLy8gMCAgICAgICAgICAgIDMyICAgICAgICBmTGFDCisgICAgLy8gNCAgICAgICAgICAgIDggICAgICAgICBtZXRhZGF0YSB0eXBlIFNUUkVBTUlORk8gKDApIChub3RlOiBPUiB3aXRoIDB4ODAgaWYgbGFzdCBtZXRhZGF0YSkKKyAgICAvLyA1ICAgICAgICAgICAgMjQgICAgICAgIHNpemUgb2YgbWV0YWRhdGEsIGZvciBTVFJFQU1JTkZPICgweDIyKS4KKworICAgIGlmIChtZW1jbXAoImZMYUNceDAwXHgwMFx4MDBceDIyIiwgaGVhZGVyLCA4KSAhPSAwICYmCisgICAgICAgIG1lbWNtcCgiZkxhQ1x4ODBceDAwXHgwMFx4MjIiLCBoZWFkZXIsIDgpICE9IDApIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtODU2LDI5ICs4NTEsNDAgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAiZmxhYyIsCisgICAgImZsIiwKKyAgICBOVUxMCit9OwogCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgICAgIFVVSUQoIjEzNjRiMDQ4LWNjNDUtNGZkYS05OTM0LTMyN2QwZWJmOTgyOSIpLAogICAgICAgICAgICAgMSwKICAgICAgICAgICAgICJGTEFDIEV4dHJhY3RvciIsCi0gICAgICAgICAgICBbXSgKLSAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgLT4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIHsKLSAgICAgICAgICAgICAgICBpZiAoU25pZmZGTEFDKHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBNZWRpYUV4dHJhY3RvciogewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGTEFDRXh0cmFjdG9yKHNvdXJjZSk7fTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAudjMgPSB7CisgICAgICAgICAgICAgICAgICAgIFtdKAorICAgICAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZyZWVNZXRhRnVuYyAqKSAtPiBDcmVhdG9yRnVuYyB7CisgICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNuaWZmRkxBQygmaGVscGVyLCBjb25maWRlbmNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IENNZWRpYUV4dHJhY3RvciogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChuZXcgRkxBQ0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7fTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKICAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmgKaW5kZXggN2ZiNmVjNi4uNWE3M2QyMCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5oCkBAIC0xOCw0NSArMTgsNDQgQEAKICNkZWZpbmUgRkxBQ19FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgRkxBQ1BhcnNlcjsKIAotY2xhc3MgRkxBQ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitjbGFzcyBGTEFDRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIAogcHVibGljOgotICAgIGV4cGxpY2l0IEZMQUNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisgICAgZXhwbGljaXQgRkxBQ0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIkZMQUNFeHRyYWN0b3IiOyB9CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5GTEFDRXh0cmFjdG9yKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIEZMQUNQYXJzZXIgKm1QYXJzZXI7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKLSAgICBNZXRhRGF0YUJhc2UgbUZpbGVNZXRhZGF0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1GaWxlTWV0YWRhdGE7CiAKICAgICAvLyBUaGVyZSBpcyBvbmx5IG9uZSB0cmFjawotICAgIE1ldGFEYXRhQmFzZSBtVHJhY2tNZXRhZGF0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1UcmFja01ldGFkYXRhOwogCiAgICAgRkxBQ0V4dHJhY3Rvcihjb25zdCBGTEFDRXh0cmFjdG9yICYpOwogICAgIEZMQUNFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBGTEFDRXh0cmFjdG9yICYpOwogCiB9OwogCi1ib29sIFNuaWZmRkxBQyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gRkxBQ19FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAKaW5kZXggNmU5ODExNC4uN2Q0MmU3MCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAKQEAgLTgsNyArOCw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmNwcAppbmRleCBhMzBiNmY4Li45ZjRmOWU2IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuY3BwCkBAIC0yNCwzNSArMjQsMzQgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPGxpYnNvbml2b3gvZWFzX3JldmVyYi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8vIGhvdyBtYW55IFNvbml2b3ggb3V0cHV0IGJ1ZmZlcnMgdG8gYWdncmVnYXRlIGludG8gb25lIE1lZGlhQnVmZmVyQmFzZQorLy8gaG93IG1hbnkgU29uaXZveCBvdXRwdXQgYnVmZmVycyB0byBhZ2dyZWdhdGUgaW50byBvbmUgTWVkaWFCdWZmZXIKIHN0YXRpYyBjb25zdCBpbnQgTlVNX0NPTUJJTkVfQlVGRkVSUyA9IDQ7CiAKLWNsYXNzIE1pZGlTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitjbGFzcyBNaWRpU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogCiBwdWJsaWM6CiAgICAgTWlkaVNvdXJjZSgKICAgICAgICAgICAgIE1pZGlFbmdpbmUgJmVuZ2luZSwKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmdHJhY2tNZXRhZGF0YSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YWRhdGEpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1pZGlTb3VyY2UoKTsKIAogcHJpdmF0ZToKICAgICBNaWRpRW5naW5lICZtRW5naW5lOwotICAgIE1ldGFEYXRhQmFzZSAmbVRyYWNrTWV0YWRhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptVHJhY2tNZXRhZGF0YTsKICAgICBib29sIG1Jbml0Q2hlY2s7CiAgICAgYm9vbCBtU3RhcnRlZDsKIApAQCAtNjksNyArNjgsNyBAQAogCiBNaWRpU291cmNlOjpNaWRpU291cmNlKAogICAgICAgICBNaWRpRW5naW5lICZlbmdpbmUsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmdHJhY2tNZXRhZGF0YSkKKyAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGFkYXRhKQogICAgIDogbUVuZ2luZShlbmdpbmUpLAogICAgICAgbVRyYWNrTWV0YWRhdGEodHJhY2tNZXRhZGF0YSksCiAgICAgICBtSW5pdENoZWNrKGZhbHNlKSwKQEAgLTg3LDE3ICs4NiwxNyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgTWlkaVNvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICogLyogcGFyYW1zICovKQorbWVkaWFfc3RhdHVzX3QgTWlkaVNvdXJjZTo6c3RhcnQoKQogewogICAgIEFMT0dWKCJNaWRpU291cmNlOjpzdGFydCIpOwogCiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKICAgICBtU3RhcnRlZCA9IHRydWU7Ci0gICAgbUVuZ2luZS5hbGxvY2F0ZUJ1ZmZlcnMoKTsKLSAgICByZXR1cm4gT0s7CisgICAgbUVuZ2luZS5hbGxvY2F0ZUJ1ZmZlcnMobUJ1ZmZlckdyb3VwKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNaWRpU291cmNlOjpzdG9wKCkKK21lZGlhX3N0YXR1c190IE1pZGlTb3VyY2U6OnN0b3AoKQogewogICAgIEFMT0dWKCJNaWRpU291cmNlOjpzdG9wIik7CiAKQEAgLTEwNSwyMCArMTA0LDE5IEBACiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKICAgICBtRW5naW5lLnJlbGVhc2VCdWZmZXJzKCk7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTWlkaVNvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkKK21lZGlhX3N0YXR1c190IE1pZGlTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpCiB7Ci0gICAgbWV0YSA9IG1UcmFja01ldGFkYXRhOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbVRyYWNrTWV0YWRhdGEpOwogfQogCi1zdGF0dXNfdCBNaWRpU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXRCdWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKQorbWVkaWFfc3RhdHVzX3QgTWlkaVNvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXRCdWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKQogewogICAgIEFMT0dWKCJNaWRpU291cmNlOjpyZWFkIik7Ci0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcjsKICAgICAvLyBwcm9jZXNzIGFuIG9wdGlvbmFsIHNlZWsgcmVxdWVzdAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKICAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKQEAgLTEzMSw3ICsxMjksNyBAQAogICAgIGJ1ZmZlciA9IG1FbmdpbmUucmVhZEJ1ZmZlcigpOwogICAgICpvdXRCdWZmZXIgPSBidWZmZXI7CiAgICAgQUxPR1YoIk1pZGlTb3VyY2U6OnJlYWQgJXAgZG9uZSIsIHRoaXMpOwotICAgIHJldHVybiBidWZmZXIgIT0gTlVMTCA/IChzdGF0dXNfdCkgT0sgOiAoc3RhdHVzX3QpIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgcmV0dXJuIGJ1ZmZlciAhPSBOVUxMID8gQU1FRElBX09LIDogQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiB9CiAKIHN0YXR1c190IE1pZGlTb3VyY2U6OmluaXQoKQpAQCAtMTQyLDEwICsxNDAsOSBAQAogCiAvLyBNaWRpRW5naW5lCiAKLU1pZGlFbmdpbmU6Ok1pZGlFbmdpbmUoRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGFkYXRhLAotICAgICAgICBNZXRhRGF0YUJhc2UgKnRyYWNrTWV0YWRhdGEpIDoKLSAgICAgICAgICAgIG1Hcm91cChOVUxMKSwKK01pZGlFbmdpbmU6Ok1pZGlFbmdpbmUoQ0RhdGFTb3VyY2UgKmRhdGFTb3VyY2UsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZmlsZU1ldGFkYXRhLAorICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YWRhdGEpIDoKICAgICAgICAgICAgIG1FYXNEYXRhKE5VTEwpLAogICAgICAgICAgICAgbUVhc0hhbmRsZShOVUxMKSwKICAgICAgICAgICAgIG1FYXNDb25maWcoTlVMTCksCkBAIC0xNzAsMTYgKzE2NywyMCBAQAogICAgIH0KIAogICAgIGlmIChmaWxlTWV0YWRhdGEgIT0gTlVMTCkgewotICAgICAgICBmaWxlTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NSURJKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhmaWxlTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTUlESSk7CiAgICAgfQogCiAgICAgaWYgKHRyYWNrTWV0YWRhdGEgIT0gTlVMTCkgewotICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKLSAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCAxMDAwbGwgKiB0ZW1wKTsgLy8gbWlsbGktPm1pY3JvCisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcodHJhY2tNZXRhZGF0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgdHJhY2tNZXRhZGF0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgMTAwMGxsICogdGVtcCk7IC8vIG1pbGxpLT5taWNybwogICAgICAgICBtRWFzQ29uZmlnID0gRUFTX0NvbmZpZygpOwotICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbUVhc0NvbmZpZy0+c2FtcGxlUmF0ZSk7Ci0gICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG1FYXNDb25maWctPm51bUNoYW5uZWxzKTsKLSAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleVBjbUVuY29kaW5nLCBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKAorICAgICAgICAgICAgICAgIHRyYWNrTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIG1FYXNDb25maWctPnNhbXBsZVJhdGUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoCisgICAgICAgICAgICAgICAgdHJhY2tNZXRhZGF0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBtRWFzQ29uZmlnLT5udW1DaGFubmVscyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMigKKyAgICAgICAgICAgICAgICB0cmFja01ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORywga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CiAgICAgfQogICAgIG1Jc0luaXRpYWxpemVkID0gdHJ1ZTsKIH0KQEAgLTE5MSw3ICsxOTIsNiBAQAogICAgIGlmIChtRWFzRGF0YSkgewogICAgICAgICBFQVNfU2h1dGRvd24obUVhc0RhdGEpOwogICAgIH0KLSAgICBkZWxldGUgbUdyb3VwOwogICAgIGRlbGV0ZSBtSW9XcmFwcGVyOwogfQogCkBAIC0xOTksMjIgKzE5OSwyMCBAQAogICAgIHJldHVybiBtSXNJbml0aWFsaXplZCA/IE9LIDogVU5LTk9XTl9FUlJPUjsKIH0KIAotc3RhdHVzX3QgTWlkaUVuZ2luZTo6YWxsb2NhdGVCdWZmZXJzKCkgeworc3RhdHVzX3QgTWlkaUVuZ2luZTo6YWxsb2NhdGVCdWZmZXJzKE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKmdyb3VwKSB7CiAgICAgLy8gc2VsZWN0IHJldmVyYiBwcmVzZXQgYW5kIGVuYWJsZQogICAgIEVBU19TZXRQYXJhbWV0ZXIobUVhc0RhdGEsIEVBU19NT0RVTEVfUkVWRVJCLCBFQVNfUEFSQU1fUkVWRVJCX1BSRVNFVCwgRUFTX1BBUkFNX1JFVkVSQl9DSEFNQkVSKTsKICAgICBFQVNfU2V0UGFyYW1ldGVyKG1FYXNEYXRhLCBFQVNfTU9EVUxFX1JFVkVSQiwgRUFTX1BBUkFNX1JFVkVSQl9CWVBBU1MsIEVBU19GQUxTRSk7CiAKLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKICAgICBpbnQgYnVmc2l6ZSA9IHNpemVvZihFQVNfUENNKQogICAgICAgICAgICAgKiBtRWFzQ29uZmlnLT5taXhCdWZmZXJTaXplICogbUVhc0NvbmZpZy0+bnVtQ2hhbm5lbHMgKiBOVU1fQ09NQklORV9CVUZGRVJTOwogICAgIEFMT0dWKCJ1c2luZyAlZCBieXRlIGJ1ZmZlciIsIGJ1ZnNpemUpOwotICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShidWZzaXplKSk7CisgICAgbUdyb3VwID0gZ3JvdXA7CisgICAgbUdyb3VwLT5hZGRfYnVmZmVyKGJ1ZnNpemUpOwogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgTWlkaUVuZ2luZTo6cmVsZWFzZUJ1ZmZlcnMoKSB7Ci0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjI0LDEzICsyMjIsMTMgQEAKICAgICByZXR1cm4gcmVzdWx0ID09IEVBU19TVUNDRVNTID8gT0sgOiBVTktOT1dOX0VSUk9SOwogfQogCi1NZWRpYUJ1ZmZlckJhc2UqIE1pZGlFbmdpbmU6OnJlYWRCdWZmZXIoKSB7CitNZWRpYUJ1ZmZlckhlbHBlciogTWlkaUVuZ2luZTo6cmVhZEJ1ZmZlcigpIHsKICAgICBFQVNfU1RBVEUgc3RhdGU7CiAgICAgRUFTX1N0YXRlKG1FYXNEYXRhLCBtRWFzSGFuZGxlLCAmc3RhdGUpOwogICAgIGlmICgoc3RhdGUgPT0gRUFTX1NUQVRFX1NUT1BQRUQpIHx8IChzdGF0ZSA9PSBFQVNfU1RBVEVfRVJST1IpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOwogICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBBTE9HRSgicmVhZEJ1ZmZlcjogbm8gYnVmZmVyIik7CkBAIC0yMzksNyArMjM3LDkgQEAKICAgICBFQVNfSTMyIHRpbWVNczsKICAgICBFQVNfR2V0TG9jYXRpb24obUVhc0RhdGEsIG1FYXNIYW5kbGUsICZ0aW1lTXMpOwogICAgIGludDY0X3QgdGltZVVzID0gMTAwMGxsICogdGltZU1zOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB0aW1lVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCiAgICAgRUFTX1BDTSogcCA9IChFQVNfUENNKikgYnVmZmVyLT5kYXRhKCk7CiAgICAgaW50IG51bUJ5dGVzT3V0cHV0ID0gMDsKQEAgLTI2MywxOCArMjYzLDIzIEBACiAvLyBNaWRpRXh0cmFjdG9yCiAKIE1pZGlFeHRyYWN0b3I6Ok1pZGlFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlKQorICAgICAgICBDRGF0YVNvdXJjZSAqZGF0YVNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAogICAgICAgbUluaXRDaGVjayhmYWxzZSkKIHsKICAgICBBTE9HVigiTWlkaUV4dHJhY3RvciBjdG9yIik7Ci0gICAgbUVuZ2luZSA9IG5ldyBNaWRpRW5naW5lKG1EYXRhU291cmNlLCAmbUZpbGVNZXRhZGF0YSwgJm1UcmFja01ldGFkYXRhKTsKKyAgICBtRmlsZU1ldGFkYXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIG1UcmFja01ldGFkYXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIG1FbmdpbmUgPSBuZXcgTWlkaUVuZ2luZShtRGF0YVNvdXJjZSwgbUZpbGVNZXRhZGF0YSwgbVRyYWNrTWV0YWRhdGEpOwogICAgIG1Jbml0Q2hlY2sgPSBtRW5naW5lLT5pbml0Q2hlY2soKTsKIH0KIAogTWlkaUV4dHJhY3Rvcjo6fk1pZGlFeHRyYWN0b3IoKQogewogICAgIEFMT0dWKCJNaWRpRXh0cmFjdG9yIGR0b3IiKTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1GaWxlTWV0YWRhdGEpOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobVRyYWNrTWV0YWRhdGEpOworICAgIGRlbGV0ZSBtRW5naW5lOwogfQogCiBzaXplX3QgTWlkaUV4dHJhY3Rvcjo6Y291bnRUcmFja3MoKQpAQCAtMjgyLDcgKzI4Nyw3IEBACiAgICAgcmV0dXJuIG1Jbml0Q2hlY2sgPT0gT0sgPyAxIDogMDsKIH0KIAotTWVkaWFUcmFjayAqTWlkaUV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KQorTWVkaWFUcmFja0hlbHBlciAqTWlkaUV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KQogewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTI5MCwyNyArMjk1LDI1IEBACiAgICAgcmV0dXJuIG5ldyBNaWRpU291cmNlKCptRW5naW5lLCBtVHJhY2tNZXRhZGF0YSk7CiB9CiAKLXN0YXR1c190IE1pZGlFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1pZGlFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIEFMT0dWKCJNaWRpRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhIik7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQotICAgIG1ldGEgPSBtVHJhY2tNZXRhZGF0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1UcmFja01ldGFkYXRhKTsKIH0KIAotc3RhdHVzX3QgTWlkaUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKQorbWVkaWFfc3RhdHVzX3QgTWlkaUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKQogewogICAgIEFMT0dWKCJNaWRpRXh0cmFjdG9yOjpnZXRNZXRhRGF0YSIpOwotICAgIG1ldGEgPSBtRmlsZU1ldGFkYXRhOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbUZpbGVNZXRhZGF0YSk7CiB9CiAKIC8vIFNuaWZmZXIKIAotYm9vbCBTbmlmZk1pZGkoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpCitib29sIFNuaWZmTWlkaShDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkKIHsKICAgICBNaWRpRW5naW5lIHAoc291cmNlLCBOVUxMLCBOVUxMKTsKICAgICBpZiAocC5pbml0Q2hlY2soKSA9PSBPSykgewpAQCAtMzIzLDI4ICszMjYsNDYgQEAKIAogfQogCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZW5zaW9uc1tdID0geworICAgICJpbXkiLAorICAgICJtaWQiLAorICAgICJtaWRpIiwKKyAgICAibXhtZiIsCisgICAgIm90YSIsCisgICAgInJ0dHRsIiwKKyAgICAicnR4IiwKKyAgICAic21mIiwKKyAgICAieG1mIiwKKyAgICBOVUxMCit9OworCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCJlZjZjY2EwYS1mOGEyLTQzZTYtYmE1Zi1kZmNkN2M5YTdlZjIiKSwKICAgICAgICAgMSwKICAgICAgICAgIk1JREkgRXh0cmFjdG9yIiwKLSAgICAgICAgW10oCi0gICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgeworICAgICAgICAgICAgLnYzID0geworICAgICAgICAgICAgICAgIFtdKAorICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCiAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCiAgICAgICAgICAgICAgICAgdm9pZCAqKiwKLSAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIC0+IE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyB7Ci0gICAgICAgICAgICBpZiAoU25pZmZNaWRpKHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gW10oCi0gICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBNZWRpYUV4dHJhY3RvciogewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1pZGlFeHRyYWN0b3Ioc291cmNlKTt9OworICAgICAgICAgICAgICAgIEZyZWVNZXRhRnVuYyAqKSAtPiBDcmVhdG9yRnVuYyB7CisgICAgICAgICAgICAgICAgICAgIGlmIChTbmlmZk1pZGkoc291cmNlLCBjb25maWRlbmNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IENNZWRpYUV4dHJhY3RvciogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKG5ldyBNaWRpRXh0cmFjdG9yKHNvdXJjZSkpO307CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBleHRlbnNpb25zCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQorICAgICAgICB9LAogICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5oCmluZGV4IDI0NGRkMGYuLjJlNzgwODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuaApAQCAtMTgsMTEgKzE4LDEyIEBACiAjZGVmaW5lIE1JRElfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NaWRpSW9XcmFwcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8bGlic29uaXZveC9lYXMuaD4KIApAQCAtMzAsNDggKzMxLDQ4IEBACiAKIGNsYXNzIE1pZGlFbmdpbmUgewogcHVibGljOgotICAgIGV4cGxpY2l0IE1pZGlFbmdpbmUoRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhZGF0YSwKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAqdHJhY2tNZXRhZGF0YSk7CisgICAgZXhwbGljaXQgTWlkaUVuZ2luZShDRGF0YVNvdXJjZSAqZGF0YVNvdXJjZSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqZmlsZU1ldGFkYXRhLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGFkYXRhKTsKICAgICB+TWlkaUVuZ2luZSgpOwogCiAgICAgc3RhdHVzX3QgaW5pdENoZWNrKCk7CiAKLSAgICBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcnMoKTsKKyAgICBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcnMoTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqZ3JvdXApOwogICAgIHN0YXR1c190IHJlbGVhc2VCdWZmZXJzKCk7CiAgICAgc3RhdHVzX3Qgc2Vla1RvKGludDY0X3QgcG9zaXRpb25Vcyk7Ci0gICAgTWVkaWFCdWZmZXJCYXNlKiByZWFkQnVmZmVyKCk7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIqIHJlYWRCdWZmZXIoKTsKIHByaXZhdGU6CiAgICAgTWlkaUlvV3JhcHBlciAqbUlvV3JhcHBlcjsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CisgICAgTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqbUdyb3VwOwogICAgIEVBU19EQVRBX0hBTkRMRSBtRWFzRGF0YTsKICAgICBFQVNfSEFORExFIG1FYXNIYW5kbGU7CiAgICAgY29uc3QgU19FQVNfTElCX0NPTkZJRyogbUVhc0NvbmZpZzsKICAgICBib29sIG1Jc0luaXRpYWxpemVkOwogfTsKIAotY2xhc3MgTWlkaUV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitjbGFzcyBNaWRpRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIAogcHVibGljOgotICAgIGV4cGxpY2l0IE1pZGlFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisgICAgZXhwbGljaXQgTWlkaUV4dHJhY3RvcihDRGF0YVNvdXJjZSAqc291cmNlKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJNaWRpRXh0cmFjdG9yIjsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWlkaUV4dHJhY3RvcigpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBDRGF0YVNvdXJjZSAqbURhdGFTb3VyY2U7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKLSAgICBNZXRhRGF0YUJhc2UgbUZpbGVNZXRhZGF0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1GaWxlTWV0YWRhdGE7CiAKICAgICAvLyBUaGVyZSBpcyBvbmx5IG9uZSB0cmFjawotICAgIE1ldGFEYXRhQmFzZSBtVHJhY2tNZXRhZGF0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1UcmFja01ldGFkYXRhOwogCiAgICAgTWlkaUVuZ2luZSAqbUVuZ2luZTsKIApAQCAtODgsNyArODksNyBAQAogCiB9OwogCi1ib29sIFNuaWZmTWlkaShEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7Citib29sIFNuaWZmTWlkaShDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwCmluZGV4IGY3ZWQwYzguLjE3NDRkM2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icApAQCAtMTEsNyArMTEsNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKaW5kZXggZDY1NzU4Mi4uZjhhYTc4NCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmNwcApAQCAtMjMsMTcgKzIzLDE0IEBACiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0V4dHJhY3RvclV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCkBAIC00NCw3ICs0MSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBEYXRhU291cmNlQmFzZVJlYWRlciA6IHB1YmxpYyBta3ZwYXJzZXI6OklNa3ZSZWFkZXIgewotICAgIGV4cGxpY2l0IERhdGFTb3VyY2VCYXNlUmVhZGVyKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgZXhwbGljaXQgRGF0YVNvdXJjZUJhc2VSZWFkZXIoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgICAgICA6IG1Tb3VyY2Uoc291cmNlKSB7CiAgICAgfQogCkBAIC02OCw4ICs2NSwxMiBAQAogICAgIHZpcnR1YWwgaW50IExlbmd0aChsb25nIGxvbmcqIHRvdGFsLCBsb25nIGxvbmcqIGF2YWlsYWJsZSkgewogICAgICAgICBvZmY2NF90IHNpemU7CiAgICAgICAgIGlmIChtU291cmNlLT5nZXRTaXplKCZzaXplKSAhPSBPSykgewotICAgICAgICAgICAgKnRvdGFsID0gLTE7Ci0gICAgICAgICAgICAqYXZhaWxhYmxlID0gKGxvbmcgbG9uZykoKDF1bGwgPDwgNjMpIC0gMSk7CisgICAgICAgICAgICBpZiAodG90YWwpIHsKKyAgICAgICAgICAgICAgICAqdG90YWwgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICAqYXZhaWxhYmxlID0gKGxvbmcgbG9uZykoKDF1bGwgPDwgNjMpIC0gMSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CkBAIC04Niw3ICs4Nyw3IEBACiAgICAgfQogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1Tb3VyY2U7CiAKICAgICBEYXRhU291cmNlQmFzZVJlYWRlcihjb25zdCBEYXRhU291cmNlQmFzZVJlYWRlciAmKTsKICAgICBEYXRhU291cmNlQmFzZVJlYWRlciAmb3BlcmF0b3I9KGNvbnN0IERhdGFTb3VyY2VCYXNlUmVhZGVyICYpOwpAQCAtMTE4LDIyICsxMTksMjUgQEAKICAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrRW50cnkgKm1CbG9ja0VudHJ5OwogICAgIGxvbmcgbUJsb2NrRW50cnlJbmRleDsKIAorICAgIHVuc2lnbmVkIGxvbmcgbVRyYWNrVHlwZTsKKyAgICB2b2lkIHNlZWt3aXRob3V0Y3VlX2woaW50NjRfdCBzZWVrVGltZVVzLCBpbnQ2NF90ICphY3R1YWxGcmFtZVRpbWVVcyk7CisKICAgICB2b2lkIGFkdmFuY2VfbCgpOwogCiAgICAgQmxvY2tJdGVyYXRvcihjb25zdCBCbG9ja0l0ZXJhdG9yICYpOwogICAgIEJsb2NrSXRlcmF0b3IgJm9wZXJhdG9yPShjb25zdCBCbG9ja0l0ZXJhdG9yICYpOwogfTsKIAotc3RydWN0IE1hdHJvc2thU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworc3RydWN0IE1hdHJvc2thU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogICAgIE1hdHJvc2thU291cmNlKE1hdHJvc2thRXh0cmFjdG9yICpleHRyYWN0b3IsIHNpemVfdCBpbmRleCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1hdHJvc2thU291cmNlKCk7CkBAIC0xNTMsMTIgKzE1NywxMiBAQAogICAgIEJsb2NrSXRlcmF0b3IgbUJsb2NrSXRlcjsKICAgICBzc2l6ZV90IG1OQUxTaXplTGVuOyAgLy8gZm9yIHR5cGUgQVZDIG9yIEhFVkMKIAotICAgIExpc3Q8TWVkaWFCdWZmZXJCYXNlICo+IG1QZW5kaW5nRnJhbWVzOworICAgIExpc3Q8TWVkaWFCdWZmZXJIZWxwZXIgKj4gbVBlbmRpbmdGcmFtZXM7CiAKICAgICBzdGF0dXNfdCBhZHZhbmNlKCk7CiAKLSAgICBzdGF0dXNfdCBzZXRXZWJtQmxvY2tDcnlwdG9JbmZvKE1lZGlhQnVmZmVyQmFzZSAqbWJ1Zik7Ci0gICAgc3RhdHVzX3QgcmVhZEJsb2NrKCk7CisgICAgc3RhdHVzX3Qgc2V0V2VibUJsb2NrQ3J5cHRvSW5mbyhNZWRpYUJ1ZmZlckhlbHBlciAqbWJ1Zik7CisgICAgbWVkaWFfc3RhdHVzX3QgcmVhZEJsb2NrKCk7CiAgICAgdm9pZCBjbGVhclBlbmRpbmdGcmFtZXMoKTsKIAogICAgIE1hdHJvc2thU291cmNlKGNvbnN0IE1hdHJvc2thU291cmNlICYpOwpAQCAtMjIyLDQzICsyMjYsMzEgQEAKICAgICAgICAgICAgICAgICAgbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1UcmFja051bSwKICAgICAgICAgICAgICAgICAgaW5kZXgpLAogICAgICAgbU5BTFNpemVMZW4oLTEpIHsKLSAgICBNZXRhRGF0YUJhc2UgJm1ldGEgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLmVkaXRJdGVtQXQoaW5kZXgpLm1NZXRhOworICAgIE1hdHJvc2thRXh0cmFjdG9yOjpUcmFja0luZm8gJnRyYWNrSW5mbyA9IG1FeHRyYWN0b3ItPm1UcmFja3MuZWRpdEl0ZW1BdChpbmRleCk7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gdHJhY2tJbmZvLm1NZXRhOwogCiAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBDSEVDSyhtZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKIAogICAgIG1Jc0F1ZGlvID0gIXN0cm5jYXNlY21wKCJhdWRpby8iLCBtaW1lLCA2KTsKIAogICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7CiAgICAgICAgIG1UeXBlID0gQVZDOwogCi0gICAgICAgIHVpbnQzMl90IGR1bW15OwotICAgICAgICBjb25zdCB1aW50OF90ICphdmNjOwotICAgICAgICBzaXplX3QgYXZjY1NpemU7Ci0gICAgICAgIGludDMyX3QgbmFsU2l6ZUxlbiA9IDA7Ci0gICAgICAgIGlmIChtZXRhLmZpbmRJbnQzMihrS2V5TmFsTGVuZ3RoU2l6ZSwgJm5hbFNpemVMZW4pKSB7Ci0gICAgICAgICAgICBpZiAobmFsU2l6ZUxlbiA+PSAwICYmIG5hbFNpemVMZW4gPD0gNCkgewotICAgICAgICAgICAgICAgIG1OQUxTaXplTGVuID0gbmFsU2l6ZUxlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtZXRhLmZpbmREYXRhKGtLZXlBVkNDLCAmZHVtbXksIChjb25zdCB2b2lkICoqKSZhdmNjLCAmYXZjY1NpemUpCi0gICAgICAgICAgICAgICAgJiYgYXZjY1NpemUgPj0gNXUpIHsKLSAgICAgICAgICAgIG1OQUxTaXplTGVuID0gMSArIChhdmNjWzRdICYgMyk7Ci0gICAgICAgICAgICBBTE9HVigibU5BTFNpemVMZW4gPSAlemQiLCBtTkFMU2l6ZUxlbik7CisgICAgICAgIGludDMyX3QgbmFsU2l6ZUxlbiA9IHRyYWNrSW5mby5tTmFsTGVuZ3RoU2l6ZTsKKyAgICAgICAgaWYgKG5hbFNpemVMZW4gPj0gMCAmJiBuYWxTaXplTGVuIDw9IDQpIHsKKyAgICAgICAgICAgIG1OQUxTaXplTGVuID0gbmFsU2l6ZUxlbjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJObyBtTkFMU2l6ZUxlbiIpOworICAgICAgICAgICAgQUxPR0UoIk5vIEFWQyBtTkFMU2l6ZUxlbiIpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkgewogICAgICAgICBtVHlwZSA9IEhFVkM7CiAKLSAgICAgICAgdWludDMyX3QgZHVtbXk7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmh2Y2M7Ci0gICAgICAgIHNpemVfdCBodmNjU2l6ZTsKLSAgICAgICAgaWYgKG1ldGEuZmluZERhdGEoa0tleUhWQ0MsICZkdW1teSwgKGNvbnN0IHZvaWQgKiopJmh2Y2MsICZodmNjU2l6ZSkKLSAgICAgICAgICAgICAgICAmJiBodmNjU2l6ZSA+PSAyMnUpIHsKLSAgICAgICAgICAgIG1OQUxTaXplTGVuID0gMSArIChodmNjWzE0KzddICYgMyk7Ci0gICAgICAgICAgICBBTE9HVigibU5BTFNpemVMZW4gPSAlenUiLCBtTkFMU2l6ZUxlbik7CisgICAgICAgIGludDMyX3QgbmFsU2l6ZUxlbiA9IHRyYWNrSW5mby5tTmFsTGVuZ3RoU2l6ZTsKKyAgICAgICAgaWYgKG5hbFNpemVMZW4gPj0gMCAmJiBuYWxTaXplTGVuIDw9IDQpIHsKKyAgICAgICAgICAgIG1OQUxTaXplTGVuID0gbmFsU2l6ZUxlbjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJObyBtTkFMU2l6ZUxlbiIpOworICAgICAgICAgICAgQUxPR0UoIk5vIEhFVkMgbU5BTFNpemVMZW4iKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgewogICAgICAgICBtVHlwZSA9IEFBQzsKQEAgLTI2OSwyNSArMjYxLDI2IEBACiAgICAgY2xlYXJQZW5kaW5nRnJhbWVzKCk7CiB9CiAKLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pIHsKK21lZGlhX3N0YXR1c190IE1hdHJvc2thU291cmNlOjpzdGFydCgpIHsKICAgICBpZiAobVR5cGUgPT0gQVZDICYmIG1OQUxTaXplTGVuIDwgMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKKyAgICAvLyBhbGxvY2F0ZSBvbmUgc21hbGwgaW5pdGlhbCBidWZmZXIsIGJ1dCBsZWF2ZSBwbGVudHkgb2Ygcm9vbSB0byBncm93CisgICAgbUJ1ZmZlckdyb3VwLT5pbml0KDEgLyogbnVtYmVyIG9mIGJ1ZmZlcnMgKi8sIDEwMjQgLyogYnVmZmVyIHNpemUgKi8sIDY0IC8qIGdyb3d0aCBsaW1pdCAqLyk7CiAgICAgbUJsb2NrSXRlci5yZXNldCgpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnN0b3AoKSB7CiAgICAgY2xlYXJQZW5kaW5nRnJhbWVzKCk7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQobVRyYWNrSW5kZXgpLm1NZXRhOwotICAgIHJldHVybiBPSzsKK21lZGlhX3N0YXR1c190IE1hdHJvc2thU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KG1UcmFja0luZGV4KS5tTWV0YSk7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0zMDAsNiArMjkzLDcgQEAKICAgICAgIG1DbHVzdGVyKE5VTEwpLAogICAgICAgbUJsb2NrRW50cnkoTlVMTCksCiAgICAgICBtQmxvY2tFbnRyeUluZGV4KDApIHsKKyAgICBtVHJhY2tUeXBlID0gbUV4dHJhY3Rvci0+bVNlZ21lbnQtPkdldFRyYWNrcygpLT5HZXRUcmFja0J5TnVtYmVyKHRyYWNrTnVtKS0+R2V0VHlwZSgpOwogICAgIHJlc2V0KCk7CiB9CiAKQEAgLTQ1MiwxMiArNDQ2LDE0IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIXBDdWVzKSB7Ci0gICAgICAgICAgICBBTE9HRSgiTm8gQ3VlcyBpbiBmaWxlIik7CisgICAgICAgICAgICBBTE9HVigiTm8gQ3VlcyBpbiBmaWxlLHNlZWsgd2l0aG91dCBjdWUgZGF0YSIpOworICAgICAgICAgICAgc2Vla3dpdGhvdXRjdWVfbChzZWVrVGltZVVzLCBhY3R1YWxGcmFtZVRpbWVVcyk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZSBpZiAoIXBTSCkgewotICAgICAgICBBTE9HRSgiTm8gU2Vla0hlYWQiKTsKKyAgICAgICAgQUxPR1YoIk5vIFNlZWtIZWFkLCBzZWVrIHdpdGhvdXQgY3VlIGRhdGEiKTsKKyAgICAgICAgc2Vla3dpdGhvdXRjdWVfbChzZWVrVGltZVVzLCBhY3R1YWxGcmFtZVRpbWVVcyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTQ2Niw3ICs0NjIsOSBAQAogICAgIHdoaWxlICghcEN1ZXMtPkRvbmVQYXJzaW5nKCkpIHsKICAgICAgICAgcEN1ZXMtPkxvYWRDdWVQb2ludCgpOwogICAgICAgICBwQ1AgPSBwQ3Vlcy0+R2V0TGFzdCgpOwotICAgICAgICBDSEVDSyhwQ1ApOworICAgICAgICBBTE9HVigicENQID0gJXMiLCBwQ1AgPT0gTlVMTCA/ICJOVUxMIiA6ICJub3QgTlVMTCIpOworICAgICAgICBpZiAocENQID09IE5VTEwpCisgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICBzaXplX3QgdHJhY2tDb3VudCA9IG1FeHRyYWN0b3ItPm1UcmFja3Muc2l6ZSgpOwogICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgdHJhY2tDb3VudDsgKytpbmRleCkgewpAQCAtNTA0LDYgKzUwMiw3IEBACiAgICAgLy8gQWx3YXlzICpzZWFyY2gqIGJhc2VkIG9uIHRoZSB2aWRlbyB0cmFjaywgYnV0IGZpbmFsaXplIGJhc2VkIG9uIG1UcmFja051bQogICAgIGlmICghcFRQKSB7CiAgICAgICAgIEFMT0dFKCJEaWQgbm90IGxvY2F0ZSB0aGUgdmlkZW8gdHJhY2sgZm9yIHNlZWtpbmciKTsKKyAgICAgICAgc2Vla3dpdGhvdXRjdWVfbChzZWVrVGltZVVzLCBhY3R1YWxGcmFtZVRpbWVVcyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTU0Nyw2ICs1NDYsMzEgQEAKICAgICByZXR1cm4gKG1CbG9ja0VudHJ5LT5HZXRCbG9jaygpLT5HZXRUaW1lKG1DbHVzdGVyKSArIDUwMGxsKSAvIDEwMDBsbDsKIH0KIAordm9pZCBCbG9ja0l0ZXJhdG9yOjpzZWVrd2l0aG91dGN1ZV9sKGludDY0X3Qgc2Vla1RpbWVVcywgaW50NjRfdCAqYWN0dWFsRnJhbWVUaW1lVXMpIHsKKyAgICBtQ2x1c3RlciA9IG1FeHRyYWN0b3ItPm1TZWdtZW50LT5GaW5kQ2x1c3RlcihzZWVrVGltZVVzICogMTAwMGxsKTsKKyAgICBjb25zdCBsb25nIHN0YXR1cyA9IG1DbHVzdGVyLT5HZXRGaXJzdChtQmxvY2tFbnRyeSk7CisgICAgaWYgKHN0YXR1cyA8IDApIHsgIC8vIGVycm9yCisgICAgICAgIEFMT0dFKCJnZXQgbGFzdCBibG9ja2VucnkgZmFpbGVkISIpOworICAgICAgICBtQ2x1c3RlciA9IE5VTEw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUJsb2NrRW50cnlJbmRleCA9IDA7CisgICAgd2hpbGUgKCFlb3MoKSAmJiAoKGJsb2NrKCktPkdldFRyYWNrTnVtYmVyKCkgIT0gbVRyYWNrTnVtKSB8fCAoYmxvY2tUaW1lVXMoKSA8IHNlZWtUaW1lVXMpKSkgeworICAgICAgICBhZHZhbmNlX2woKTsKKyAgICB9CisKKyAgICAvLyB2aWRlbyB0cmFjayB3aWxsIHNlZWsgdG8gdGhlIG5leHQga2V5IGZyYW1lLgorICAgIGlmIChtVHJhY2tUeXBlID09IDEpIHsKKyAgICAgICAgd2hpbGUgKCFlb3MoKSAmJiAoKGJsb2NrKCktPkdldFRyYWNrTnVtYmVyKCkgIT0gbVRyYWNrTnVtKSB8fAorICAgICAgICAgICAgICAgICAgICAgICFtQmxvY2tFbnRyeS0+R2V0QmxvY2soKS0+SXNLZXkoKSkpIHsKKyAgICAgICAgICAgIGFkdmFuY2VfbCgpOworICAgICAgICB9CisgICAgfQorICAgICphY3R1YWxGcmFtZVRpbWVVcyA9IGJsb2NrVGltZVVzKCk7CisgICAgIEFMT0dWKCJzZWVrVGltZVVzOiVsbGQsIGFjdHVhbEZyYW1lVGltZVVzOiVsbGQsIHRyYWNrbnVtOiVsbGQiLAorICAgICAgICAgICAgICAobG9uZyBsb25nKXNlZWtUaW1lVXMsIChsb25nIGxvbmcpKmFjdHVhbEZyYW1lVGltZVVzLCAobG9uZyBsb25nKW1UcmFja051bSk7Cit9CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIHN0YXRpYyB1bnNpZ25lZCBVMjRfQVQoY29uc3QgdWludDhfdCAqcHRyKSB7CkBAIC01NzksNyArNjAzLDcgQEAKIAogdm9pZCBNYXRyb3NrYVNvdXJjZTo6Y2xlYXJQZW5kaW5nRnJhbWVzKCkgewogICAgIHdoaWxlICghbVBlbmRpbmdGcmFtZXMuZW1wdHkoKSkgewotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICpmcmFtZSA9ICptUGVuZGluZ0ZyYW1lcy5iZWdpbigpOwogICAgICAgICBtUGVuZGluZ0ZyYW1lcy5lcmFzZShtUGVuZGluZ0ZyYW1lcy5iZWdpbigpKTsKIAogICAgICAgICBmcmFtZS0+cmVsZWFzZSgpOwpAQCAtNTg3LDcgKzYxMSw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c2V0V2VibUJsb2NrQ3J5cHRvSW5mbyhNZWRpYUJ1ZmZlckJhc2UgKm1idWYpIHsKK3N0YXR1c190IE1hdHJvc2thU291cmNlOjpzZXRXZWJtQmxvY2tDcnlwdG9JbmZvKE1lZGlhQnVmZmVySGVscGVyICptYnVmKSB7CiAgICAgaWYgKG1idWYtPnJhbmdlX2xlbmd0aCgpIDwgMSB8fCBtYnVmLT5yYW5nZV9sZW5ndGgoKSAtIDEgPiBJTlQzMl9NQVgpIHsKICAgICAgICAgLy8gMS1ieXRlIHNpZ25hbAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwpAQCAtNjAxLDE3ICs2MjUsMTcgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBNZXRhRGF0YUJhc2UgJm1ldGEgPSBtYnVmLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtYnVmLT5tZXRhX2RhdGEoKTsKICAgICBpZiAoZW5jcnlwdGVkKSB7CiAgICAgICAgIHVpbnQ4X3QgY3RyQ291bnRlclsxNl0gPSB7IDAgfTsKLSAgICAgICAgdWludDMyX3QgdHlwZTsKICAgICAgICAgY29uc3QgdWludDhfdCAqa2V5SWQ7CiAgICAgICAgIHNpemVfdCBrZXlJZFNpemU7Ci0gICAgICAgIGNvbnN0IE1ldGFEYXRhQmFzZSAmdHJhY2tNZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQobVRyYWNrSW5kZXgpLm1NZXRhOwotICAgICAgICBDSEVDSyh0cmFja01ldGEuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJnR5cGUsIChjb25zdCB2b2lkICoqKSZrZXlJZCwgJmtleUlkU2l6ZSkpOwotICAgICAgICBtZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwga2V5SWQsIGtleUlkU2l6ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQobVRyYWNrSW5kZXgpLm1NZXRhOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLAorICAgICAgICAgICAgICAgICh2b2lkKiopJmtleUlkLCAma2V5SWRTaXplKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIGtleUlkLCBrZXlJZFNpemUpOwogICAgICAgICBtZW1jcHkoY3RyQ291bnRlciwgZGF0YSArIDEsIDgpOwotICAgICAgICBtZXRhLnNldERhdGEoa0tleUNyeXB0b0lWLCAwLCBjdHJDb3VudGVyLCAxNik7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYsIGN0ckNvdW50ZXIsIDE2KTsKICAgICAgICAgaWYgKHBhcnRpdGlvbmVkKSB7CiAgICAgICAgICAgICAvKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMwogICAgICAgICAgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQpAQCAtNjY0LDggKzY4OCwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgdWludDMyX3Qgc2l6ZW9mUGxhaW5TaXplcyA9IHNpemVvZih1aW50MzJfdCkgKiBwbGFpblNpemVzLnNpemUoKTsKICAgICAgICAgICAgIHVpbnQzMl90IHNpemVvZkVuY3J5cHRlZFNpemVzID0gc2l6ZW9mKHVpbnQzMl90KSAqIGVuY3J5cHRlZFNpemVzLnNpemUoKTsKLSAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwgcGxhaW5TaXplcy5kYXRhKCksIHNpemVvZlBsYWluU2l6ZXMpOwotICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwgZW5jcnlwdGVkU2l6ZXMuZGF0YSgpLCBzaXplb2ZFbmNyeXB0ZWRTaXplcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLAorICAgICAgICAgICAgICAgICAgICBwbGFpblNpemVzLmRhdGEoKSwgc2l6ZW9mUGxhaW5TaXplcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9TSVpFUywKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkU2l6ZXMuZGF0YSgpLCBzaXplb2ZFbmNyeXB0ZWRTaXplcyk7CiAgICAgICAgICAgICBtYnVmLT5zZXRfcmFuZ2UoZnJhbWVPZmZzZXQsIG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gZnJhbWVPZmZzZXQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyoKQEAgLTY4NSw4ICs3MTEsMTAgQEAKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgaW50MzJfdCBwbGFpblNpemVzW10gPSB7IDAgfTsKICAgICAgICAgICAgIGludDMyX3QgZW5jcnlwdGVkU2l6ZXNbXSA9IHsgc3RhdGljX2Nhc3Q8aW50MzJfdD4obWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSA5KSB9OwotICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLCBwbGFpblNpemVzLCBzaXplb2YocGxhaW5TaXplcykpOwotICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwgZW5jcnlwdGVkU2l6ZXMsIHNpemVvZihlbmNyeXB0ZWRTaXplcykpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUywKKyAgICAgICAgICAgICAgICAgICAgcGxhaW5TaXplcywgc2l6ZW9mKHBsYWluU2l6ZXMpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLAorICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRTaXplcywgc2l6ZW9mKGVuY3J5cHRlZFNpemVzKSk7CiAgICAgICAgICAgICBtYnVmLT5zZXRfcmFuZ2UoOSwgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSA5KTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC03MDMsMTkgKzczMSwyMSBAQAogICAgICAgICAgKi8KICAgICAgICAgaW50MzJfdCBwbGFpblNpemVzW10gPSB7IHN0YXRpY19jYXN0PGludDMyX3Q+KG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gMSkgfTsKICAgICAgICAgaW50MzJfdCBlbmNyeXB0ZWRTaXplc1tdID0geyAwIH07Ci0gICAgICAgIG1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwgcGxhaW5TaXplcywgc2l6ZW9mKHBsYWluU2l6ZXMpKTsKLSAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwgZW5jcnlwdGVkU2l6ZXMsIHNpemVvZihlbmNyeXB0ZWRTaXplcykpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLAorICAgICAgICAgICAgICAgIHBsYWluU2l6ZXMsIHNpemVvZihwbGFpblNpemVzKSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLAorICAgICAgICAgICAgICAgIGVuY3J5cHRlZFNpemVzLCBzaXplb2YoZW5jcnlwdGVkU2l6ZXMpKTsKICAgICAgICAgbWJ1Zi0+c2V0X3JhbmdlKDEsIG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gMSk7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6cmVhZEJsb2NrKCkgeworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnJlYWRCbG9jaygpIHsKICAgICBDSEVDSyhtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKTsKIAogICAgIGlmIChtQmxvY2tJdGVyLmVvcygpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCiAgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jayAqYmxvY2sgPSBtQmxvY2tJdGVyLmJsb2NrKCk7CkBAIC03MjcsMTggKzc1NywyMSBAQAogICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrOjpGcmFtZSAmZnJhbWUgPSBibG9jay0+R2V0RnJhbWUoaSk7CiAgICAgICAgIHNpemVfdCBsZW4gPSBmcmFtZS5sZW47CiAgICAgICAgIGlmIChTSVpFX01BWCAtIGxlbiA8IHRyYWNrSW5mby0+bUhlYWRlckxlbikgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAKICAgICAgICAgbGVuICs9IHRyYWNrSW5mby0+bUhlYWRlckxlbjsKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUobGVuKTsKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKm1idWY7CisgICAgICAgIG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJm1idWYsIGZhbHNlIC8qIG5vbmJsb2NraW5nICovLCBsZW4gLyogcmVxdWVzdGVkIHNpemUgKi8pOworICAgICAgICBtYnVmLT5zZXRfcmFuZ2UoMCwgbGVuKTsKICAgICAgICAgdWludDhfdCAqZGF0YSA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4obWJ1Zi0+ZGF0YSgpKTsKICAgICAgICAgaWYgKHRyYWNrSW5mby0+bUhlYWRlcikgewogICAgICAgICAgICAgbWVtY3B5KGRhdGEsIHRyYWNrSW5mby0+bUhlYWRlciwgdHJhY2tJbmZvLT5tSGVhZGVyTGVuKTsKICAgICAgICAgfQogCi0gICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIGJsb2NrLT5Jc0tleSgpKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gbWJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVVcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIGJsb2NrLT5Jc0tleSgpKTsKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSBmcmFtZS5SZWFkKG1FeHRyYWN0b3ItPm1SZWFkZXIsIGRhdGEgKyB0cmFja0luZm8tPm1IZWFkZXJMZW4pOwogICAgICAgICBpZiAoZXJyID09IE9LCkBAIC03NTIsNyArNzg1LDcgQEAKIAogICAgICAgICAgICAgbUJsb2NrSXRlci5hZHZhbmNlKCk7CiAgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAKICAgICAgICAgbVBlbmRpbmdGcmFtZXMucHVzaF9iYWNrKG1idWYpOwpAQCAtNzYwLDExICs3OTMsMTEgQEAKIAogICAgIG1CbG9ja0l0ZXIuYWR2YW5jZSgpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHRhcmdldFNhbXBsZVRpbWVVcyA9IC0xbGw7CkBAIC03NzMsNyArODA2LDcgQEAKICAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewogICAgICAgICBpZiAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19GUkFNRV9JTkRFWCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgfQogCiAgICAgICAgIGlmICghbUV4dHJhY3Rvci0+aXNMaXZlU3RyZWFtaW5nKCkpIHsKQEAgLTc5MSw3ICs4MjQsNyBAQAogICAgIH0KIAogICAgIHdoaWxlIChtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHJlYWRCbG9jaygpOworICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSByZWFkQmxvY2soKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKQEAgLTgwMCwxOCArODMzLDE4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CiAgICAgbVBlbmRpbmdGcmFtZXMuZXJhc2UobVBlbmRpbmdGcmFtZXMuYmVnaW4oKSk7CiAKICAgICBpZiAoKG1UeXBlICE9IEFWQyAmJiBtVHlwZSAhPSBIRVZDKSB8fCBtTkFMU2l6ZUxlbiA9PSAwKSB7CiAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMGxsKSB7Ci0gICAgICAgICAgICBmcmFtZS0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGZyYW1lLT5tZXRhX2RhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKICAgICAgICAgfQogCiAgICAgICAgICpvdXQgPSBmcmFtZTsKIAotICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgfQogCiAgICAgLy8gRWFjaCBpbnB1dCBmcmFtZSBjb250YWlucyBvbmUgb3IgbW9yZSBOQUwgZnJhZ21lbnRzLCBlYWNoIGZyYWdtZW50CkBAIC04MjksNyArODYyLDcgQEAKICAgICBzaXplX3Qgc3JjU2l6ZSA9IGZyYW1lLT5yYW5nZV9sZW5ndGgoKTsKIAogICAgIHNpemVfdCBkc3RTaXplID0gMDsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA9IE5VTEw7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciA9IE5VTEw7CiAgICAgdWludDhfdCAqZHN0UHRyID0gTlVMTDsKIAogICAgIGZvciAoaW50MzJfdCBwYXNzID0gMDsgcGFzcyA8IDI7ICsrcGFzcykgewpAQCAtODUwLDcgKzg4Myw3IEBACiAgICAgICAgICAgICAgICAgZnJhbWUtPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICBmcmFtZSA9IE5VTEw7CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNPZmZzZXQgKyBtTkFMU2l6ZUxlbiArIE5BTHNpemUgPiBzcmNTaXplKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC04NzgsNyArOTExLDcgQEAKICAgICAgICAgICAgIGZyYW1lLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBmcmFtZSA9IE5VTEw7CiAKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChwYXNzID09IDApIHsKQEAgLTg4OSwxNiArOTIyLDIwIEBACiAgICAgICAgICAgICAgICAgLy8gZWFjaCA0LWJ5dGUgbmFsIHNpemUgd2l0aCBhIDQtYnl0ZSBzdGFydCBjb2RlCiAgICAgICAgICAgICAgICAgYnVmZmVyID0gZnJhbWU7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKGRzdFNpemUpOworICAgICAgICAgICAgICAgIG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyLCBmYWxzZSAvKiBub25ibG9ja2luZyAqLywgZHN0U2l6ZSAvKiByZXF1ZXN0ZWQgc2l6ZSAqLyk7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0U2l6ZSk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqZnJhbWVNZXRhID0gZnJhbWUtPm1ldGFfZGF0YSgpOwogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICBDSEVDSyhmcmFtZS0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisgICAgICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50NjQoZnJhbWVNZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICZ0aW1lVXMpKTsKICAgICAgICAgICAgIGludDMyX3QgaXNTeW5jOwotICAgICAgICAgICAgQ0hFQ0soZnJhbWUtPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZpc1N5bmMpKTsKKyAgICAgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmcmFtZU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgJmlzU3luYykpOwogCi0gICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIGlzU3luYyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKmJ1Zk1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1Zk1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVVzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihidWZNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIGlzU3luYyk7CiAKICAgICAgICAgICAgIGRzdFB0ciA9ICh1aW50OF90ICopYnVmZmVyLT5kYXRhKCk7CiAgICAgICAgIH0KQEAgLTkxMCwxOCArOTQ3LDcxIEBACiAgICAgfQogCiAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwbGwpIHsKLSAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1ZmZlci0+bWV0YV9kYXRhKCksCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKICAgICB9CiAKICAgICAqb3V0ID0gYnVmZmVyOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLU1hdHJvc2thRXh0cmFjdG9yOjpNYXRyb3NrYUV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorLy8gdHJhbnMgYWxsIEZPVVJDQyAgdG8gbG93ZXIgY2hhcgorc3RhdGljIHVpbnQzMl90IEZvdXJDQ3RvTG93ZXIodWludDMyX3QgZm91cmNjKSB7CisgICAgdWludDhfdCBjaF8xID0gdG9sb3dlcigoZm91cmNjID4+IDI0KSAmIDB4ZmYpOworICAgIHVpbnQ4X3QgY2hfMiA9IHRvbG93ZXIoKGZvdXJjYyA+PiAxNikgJiAweGZmKTsKKyAgICB1aW50OF90IGNoXzMgPSB0b2xvd2VyKChmb3VyY2MgPj4gOCkgJiAweGZmKTsKKyAgICB1aW50OF90IGNoXzQgPSB0b2xvd2VyKChmb3VyY2MpICYgMHhmZik7CisgICAgdWludDMyX3QgZm91cmNjX291dCA9IGNoXzEgPDwgMjQgfCBjaF8yIDw8IDE2IHwgY2hfMyA8PCA4IHwgY2hfNDsKKworICAgIHJldHVybiBmb3VyY2Nfb3V0OworfQorCitzdGF0aWMgY29uc3QgY2hhciAqTUtWRm91ckNDMk1JTUUodWludDMyX3QgZm91cmNjKSB7CisgICAgQUxPR1YoIk1LVkZvdXJDQzJNSU1FIGZvdXJjYyAweCU4Ljh4IiwgZm91cmNjKTsKKyAgICB1aW50MzJfdCBsb3dlckZvdXJjYyA9IEZvdXJDQ3RvTG93ZXIoZm91cmNjKTsKKyAgICBzd2l0Y2ggKGxvd2VyRm91cmNjKSB7CisgICAgICAgIGNhc2UgRk9VUkNDKCJtcDR2Iik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQ7CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoInMyNjMiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImgyNjMiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzOworCisgICAgICAgIGNhc2UgRk9VUkNDKCJhdmMxIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJoMjY0Iik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fQVZDOworCisgICAgICAgIGNhc2UgRk9VUkNDKCJtcGcyIik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzI7CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoInh2aWQiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19YVklEOworCisgICAgICAgIGNhc2UgRk9VUkNDKCJkaXZ4Iik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJkeDUwIik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fRElWWDsKKworICAgICAgICBjYXNlIEZPVVJDQygiZGl2MyIpOgorICAgICAgICBjYXNlIEZPVVJDQygiZGl2NCIpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0RJVlgzOworCisgICAgICAgIGNhc2UgRk9VUkNDKCJtanBnIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJtcHBnIik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fTUpQRUc7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGNoYXIgZm91cmNjU3RyaW5nWzVdOworICAgICAgICAgICAgTWFrZUZvdXJDQ1N0cmluZyhmb3VyY2MsIGZvdXJjY1N0cmluZyk7CisgICAgICAgICAgICBBTE9HVygibWt2IHVuc3VwcG9ydCBmb3VyY2MgJXMiLCBmb3VyY2NTdHJpbmcpOworICAgICAgICAgICAgcmV0dXJuICIiOworICAgIH0KK30KKworCitNYXRyb3NrYUV4dHJhY3Rvcjo6TWF0cm9za2FFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1SZWFkZXIobmV3IERhdGFTb3VyY2VCYXNlUmVhZGVyKG1EYXRhU291cmNlKSksCiAgICAgICBtU2VnbWVudChOVUxMKSwKQEAgLTk1MywxNyArMTA0Myw1NiBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgLy8gZnJvbSBta3ZwYXJzZXI6OlNlZ21lbnQ6OkxvYWQoKSwgYnV0IHN0b3AgYXQgZmlyc3QgY2x1c3RlcgotICAgIHJldCA9IG1TZWdtZW50LT5QYXJzZUhlYWRlcnMoKTsKLSAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgbG9uZyBsZW47Ci0gICAgICAgIHJldCA9IG1TZWdtZW50LT5Mb2FkQ2x1c3Rlcihwb3MsIGxlbik7Ci0gICAgICAgIGlmIChyZXQgPj0gMSkgewotICAgICAgICAgICAgLy8gbm8gbW9yZSBjbHVzdGVycwotICAgICAgICAgICAgcmV0ID0gMDsKKyAgICBpZiAobUlzTGl2ZVN0cmVhbWluZykgeworICAgICAgICAvLyBmcm9tIG1rdnBhcnNlcjo6U2VnbWVudDo6TG9hZCgpLCBidXQgc3RvcCBhdCBmaXJzdCBjbHVzdGVyCisgICAgICAgIHJldCA9IG1TZWdtZW50LT5QYXJzZUhlYWRlcnMoKTsKKyAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgICAgIHJldCA9IG1TZWdtZW50LT5Mb2FkQ2x1c3Rlcihwb3MsIGxlbik7CisgICAgICAgICAgICBpZiAocmV0ID49IDEpIHsKKyAgICAgICAgICAgICAgICAvLyBubyBtb3JlIGNsdXN0ZXJzCisgICAgICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CisgICAgICAgICAgICByZXQgPSBta3ZwYXJzZXI6OkVfQlVGRkVSX05PVF9GVUxMOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7Ci0gICAgICAgIHJldCA9IG1rdnBhcnNlcjo6RV9CVUZGRVJfTk9UX0ZVTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gbVNlZ21lbnQtPlBhcnNlSGVhZGVycygpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIlNlZ21lbnQgcGFyc2UgaGVhZGVyIHJldHVybiBmYWlsICVsbGQiLCByZXQpOworICAgICAgICAgICAgZGVsZXRlIG1TZWdtZW50OworICAgICAgICAgICAgbVNlZ21lbnQgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZXMqIG1DdWVzID0gbVNlZ21lbnQtPkdldEN1ZXMoKTsKKyAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6U2Vla0hlYWQqIG1TSCA9IG1TZWdtZW50LT5HZXRTZWVrSGVhZCgpOworICAgICAgICAgICAgaWYgKChtQ3VlcyA9PSBOVUxMKSAmJiAobVNIICE9IE5VTEwpKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50ID0gbVNILT5HZXRDb3VudCgpOworICAgICAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6U2Vla0hlYWQ6OkVudHJ5KiBtRW50cnk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICAgICAgICAgIG1FbnRyeSA9IG1TSC0+R2V0RW50cnkoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpZiAobUVudHJ5LT5pZCA9PSAweDBDNTNCQjZCKSB7ICAvLyBDdWVzIElECisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbG9uZyBwb3M7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2VnbWVudC0+UGFyc2VDdWVzKG1FbnRyeS0+cG9zLCBwb3MsIGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VlcyA9IG1TZWdtZW50LT5HZXRDdWVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZmluZCBjdWUgZGF0YSBieSBzZWVraGVhZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtQ3VlcykgeworICAgICAgICAgICAgICAgIGxvbmcgbGVuOworICAgICAgICAgICAgICAgIHJldCA9IG1TZWdtZW50LT5Mb2FkQ2x1c3Rlcihwb3MsIGxlbik7CisgICAgICAgICAgICAgICAgQUxPR1YoImhhcyBDdWUgZGF0YSwgQ2x1c3RlciBudW09JWxkIiwgbVNlZ21lbnQtPkdldENvdW50KCkpOworICAgICAgICAgICAgfSBlbHNlICB7CisgICAgICAgICAgICAgICAgbG9uZyBzdGF0dXNfTG9hZCA9IG1TZWdtZW50LT5Mb2FkKCk7CisgICAgICAgICAgICAgICAgQUxPR1coIm5vIEN1ZSBkYXRhLFNlZ21lbnQgTG9hZCBzdGF0dXM6JWxkIixzdGF0dXNfTG9hZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocmV0ID4gMCkgeworICAgICAgICAgICAgcmV0ID0gbWt2cGFyc2VyOjpFX0JVRkZFUl9OT1RfRlVMTDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChyZXQgPCAwKSB7CkBAIC05OTQsMTMgKzExMjMsMTUgQEAKIAogICAgIGRlbGV0ZSBtUmVhZGVyOwogICAgIG1SZWFkZXIgPSBOVUxMOworCisgICAgZGVsZXRlIG1EYXRhU291cmNlOwogfQogCiBzaXplX3QgTWF0cm9za2FFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKIH0KIAotTWVkaWFUcmFjayAqTWF0cm9za2FFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworTWVkaWFUcmFja0hlbHBlciAqTWF0cm9za2FFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChpbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0xMDA4LDExICsxMTM5LDExIEBACiAgICAgcmV0dXJuIG5ldyBNYXRyb3NrYVNvdXJjZSh0aGlzLCBpbmRleCk7CiB9CiAKLXN0YXR1c190IE1hdHJvc2thRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCittZWRpYV9zdGF0dXNfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CiAgICAgaWYgKGluZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgaWYgKChmbGFncyAmIGtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGEpICYmICFtRXh0cmFjdGVkVGh1bWJuYWlscwpAQCAtMTAyMSw4ICsxMTUyLDcgQEAKICAgICAgICAgbUV4dHJhY3RlZFRodW1ibmFpbHMgPSB0cnVlOwogICAgIH0KIAotICAgIG1ldGEgPSBtVHJhY2tzLml0ZW1BdChpbmRleCkubU1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtVHJhY2tzLml0ZW1BdChpbmRleCkubU1ldGEpOwogfQogCiBib29sIE1hdHJvc2thRXh0cmFjdG9yOjppc0xpdmVTdHJlYW1pbmcoKSBjb25zdCB7CkBAIC0xMDU3LDcgKzExODcsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBhZGRFU0RTRnJvbUNvZGVjUHJpdmF0ZSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIGJvb2wgaXNBdWRpbywgY29uc3Qgdm9pZCAqcHJpdiwgc2l6ZV90IHByaXZTaXplKSB7CiAKICAgICBpbnQgcHJpdlNpemVCeXRlc1JlcXVpcmVkID0gYnl0ZXNGb3JTaXplKHByaXZTaXplKTsKQEAgLTEwODUsMTQgKzEyMTUsMTQgQEAKICAgICBzdG9yZVNpemUoZXNkcywgaWR4LCBwcml2U2l6ZSk7CiAgICAgbWVtY3B5KGVzZHMgKyBpZHgsIHByaXYsIHByaXZTaXplKTsKIAotICAgIG1ldGEuc2V0RGF0YShrS2V5RVNEUywgMCwgZXNkcywgZXNkc1NpemUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgcHJpdiwgcHJpdlNpemUpOwogCiAgICAgZGVsZXRlW10gZXNkczsKICAgICBlc2RzID0gTlVMTDsKIH0KIAogc3RhdHVzX3QgYWRkVm9yYmlzQ29kZWNJbmZvKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgY29uc3Qgdm9pZCAqX2NvZGVjUHJpdmF0ZSwgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemUpIHsKICAgICAvLyBoZXhkdW1wKF9jb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwogCkBAIC0xMTUwLDcgKzEyODAsOCBAQAogICAgIGlmIChjb2RlY1ByaXZhdGVbb2Zmc2V0XSAhPSAweDAxKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQotICAgIG1ldGEuc2V0RGF0YShrS2V5Vm9yYmlzSW5mbywgMCwgJmNvZGVjUHJpdmF0ZVtvZmZzZXRdLCBsZW4xKTsKKyAgICAvLyBmb3JtZXJseSBrS2V5Vm9yYmlzSW5mbworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgJmNvZGVjUHJpdmF0ZVtvZmZzZXRdLCBsZW4xKTsKIAogICAgIG9mZnNldCArPSBsZW4xOwogICAgIGlmIChjb2RlY1ByaXZhdGVbb2Zmc2V0XSAhPSAweDAzKSB7CkBAIC0xMTYyLDE5ICsxMjkzLDIwIEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgbWV0YS5zZXREYXRhKAotICAgICAgICAgICAga0tleVZvcmJpc0Jvb2tzLCAwLCAmY29kZWNQcml2YXRlW29mZnNldF0sCi0gICAgICAgICAgICBjb2RlY1ByaXZhdGVTaXplIC0gb2Zmc2V0KTsKKyAgICAvLyBmb3JtZXJseSBrS2V5Vm9yYmlzQm9va3MKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzEsCisgICAgICAgICAgICAmY29kZWNQcml2YXRlW29mZnNldF0sIGNvZGVjUHJpdmF0ZVNpemUgLSBvZmZzZXQpOwogCiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0aWMgc3RhdHVzX3QgYWRkRmxhY01ldGFkYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgY29uc3Qgdm9pZCAqY29kZWNQcml2YXRlLCBzaXplX3QgY29kZWNQcml2YXRlU2l6ZSkgewogICAgIC8vIGhleGR1bXAoY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKIAotICAgIG1ldGEuc2V0RGF0YShrS2V5RmxhY01ldGFkYXRhLCAwLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgIC8vIGZvcm1lcmx5IGtLZXlGbGFjTWV0YWRhdGEKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CiAKICAgICBpbnQzMl90IG1heElucHV0U2l6ZSA9IDY0IDw8IDEwOwogICAgIEZMQUNEZWNvZGVyICpmbGFjRGVjb2RlciA9IEZMQUNEZWNvZGVyOjpDcmVhdGUoKTsKQEAgLTExOTYsNyArMTMyOCw3IEBACiAgICAgICAgICAgICAgICAgKiBzdHJlYW1JbmZvLm1heF9ibG9ja3NpemUgKiBzdHJlYW1JbmZvLmNoYW5uZWxzOwogICAgICAgICB9CiAgICAgfQotICAgIG1ldGEuc2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4SW5wdXRTaXplKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgbWF4SW5wdXRTaXplKTsKIAogICAgIGRlbGV0ZSBmbGFjRGVjb2RlcjsKICAgICByZXR1cm4gT0s7CkBAIC0xMjI1LDEwICsxMzU3LDkzIEBACiAgICAgfQogCiAgICAgLy8gT3ZlcnJpZGUgdGhlIHN5bnRoZXNpemVkIG5hbCBsZW5ndGggc2l6ZSwgd2hpY2ggaXMgYXJiaXRyYXJ5Ci0gICAgdHJhY2tJbmZvLT5tTWV0YS5zZXRJbnQzMihrS2V5TmFsTGVuZ3RoU2l6ZSwgMCk7CisgICAgdHJhY2tJbmZvLT5tTmFsTGVuZ3RoU2l6ZSA9IDA7CiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6c3ludGhlc2l6ZU1QRUcyKFRyYWNrSW5mbyAqdHJhY2tJbmZvLCBzaXplX3QgaW5kZXgpIHsKKyAgICBBTE9HVigic3ludGhlc2l6ZU1QRUcyIik7CisgICAgQmxvY2tJdGVyYXRvciBpdGVyKHRoaXMsIHRyYWNrSW5mby0+bVRyYWNrTnVtLCBpbmRleCk7CisgICAgaWYgKGl0ZXIuZW9zKCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrICpibG9jayA9IGl0ZXIuYmxvY2soKTsKKyAgICBpZiAoYmxvY2stPkdldEZyYW1lQ291bnQoKSA8PSAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jazo6RnJhbWUgJmZyYW1lID0gYmxvY2stPkdldEZyYW1lKDApOworICAgIGF1dG8gdG1wRGF0YSA9IGhlYXBidWZmZXI8dW5zaWduZWQgY2hhcj4oZnJhbWUubGVuKTsKKyAgICBsb25nIG4gPSBmcmFtZS5SZWFkKG1SZWFkZXIsIHRtcERhdGEuZ2V0KCkpOworICAgIGlmIChuICE9IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBzaXplX3QgaGVhZGVyX3N0YXJ0ID0gMDsKKyAgICBzaXplX3QgaGVhZGVyX2xlbnRoID0gMDsKKyAgICBmb3IgKGhlYWRlcl9zdGFydCA9IDA7IGhlYWRlcl9zdGFydCA8IGZyYW1lLmxlbiAtIDQ7IGhlYWRlcl9zdGFydCsrKSB7CisgICAgICAgIGlmIChudG9obCgweDAwMDAwMWIzKSA9PSAqKHVpbnQzMl90KikoKHVpbnQ4X3QqKXRtcERhdGEuZ2V0KCkgKyBoZWFkZXJfc3RhcnQpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIGlzQ29tcGxldGVfY3NkID0gZmFsc2U7CisgICAgZm9yIChoZWFkZXJfbGVudGggPSAwOyBoZWFkZXJfbGVudGggPCBmcmFtZS5sZW4gLSA0IC0gaGVhZGVyX3N0YXJ0OyBoZWFkZXJfbGVudGgrKykgeworICAgICAgICBpZiAobnRvaGwoMHgwMDAwMDFiOCkgPT0gKih1aW50MzJfdCopKCh1aW50OF90Kil0bXBEYXRhLmdldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaGVhZGVyX3N0YXJ0ICsgaGVhZGVyX2xlbnRoKSkgeworICAgICAgICAgICAgaXNDb21wbGV0ZV9jc2QgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFpc0NvbXBsZXRlX2NzZCkgeworICAgICAgICBBTE9HRSgiY2FuJ3QgcGFyc2UgY29tcGxldGUgY3NkIGZvciBNUEVHMiEiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUodHJhY2tJbmZvLT5tTWV0YSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCopKHRtcERhdGEuZ2V0KCkpICsgaGVhZGVyX3N0YXJ0LCBoZWFkZXJfbGVudGgpOworCisgICAgcmV0dXJuIE9LOworCit9CisKK3N0YXR1c190IE1hdHJvc2thRXh0cmFjdG9yOjpzeW50aGVzaXplTVBFRzQoVHJhY2tJbmZvICp0cmFja0luZm8sIHNpemVfdCBpbmRleCkgeworICAgIEFMT0dWKCJzeW50aGVzaXplTVBFRzQiKTsKKyAgICBCbG9ja0l0ZXJhdG9yIGl0ZXIodGhpcywgdHJhY2tJbmZvLT5tVHJhY2tOdW0sIGluZGV4KTsKKyAgICBpZiAoaXRlci5lb3MoKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2sgKmJsb2NrID0gaXRlci5ibG9jaygpOworICAgIGlmIChibG9jay0+R2V0RnJhbWVDb3VudCgpIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrOjpGcmFtZSAmZnJhbWUgPSBibG9jay0+R2V0RnJhbWUoMCk7CisgICAgYXV0byB0bXBEYXRhID0gaGVhcGJ1ZmZlcjx1bnNpZ25lZCBjaGFyPihmcmFtZS5sZW4pOworICAgIGxvbmcgbiA9IGZyYW1lLlJlYWQobVJlYWRlciwgdG1wRGF0YS5nZXQoKSk7CisgICAgaWYgKG4gIT0gMCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgICBzaXplX3Qgdm9zZW5kOworICAgICBib29sIGlzQ29tcGxldGVfY3NkID0gZmFsc2U7CisgICAgIGZvciAodm9zZW5kID0gMDsgKGxvbmcpdm9zZW5kIDwgZnJhbWUubGVuIC0gNDsgdm9zZW5kKyspIHsKKyAgICAgICAgIGlmIChudG9obCgweDAwMDAwMWI2KSA9PSAqKHVpbnQzMl90KikoKHVpbnQ4X3QqKXRtcERhdGEuZ2V0KCkgKyB2b3NlbmQpKSB7CisgICAgICAgICAgICAgaXNDb21wbGV0ZV9jc2QgPSB0cnVlOworICAgICAgICAgICAgIGJyZWFrOyAgLy8gU2VuZCBWT1MgdW50aWwgVk9QCisgICAgICAgICB9CisgICAgIH0KKyAgICAgaWYgKCFpc0NvbXBsZXRlX2NzZCkgeworICAgICAgICAgQUxPR0UoImNhbid0IHBhcnNlIGNvbXBsZXRlIGNzZCBmb3IgTVBFRzQhIik7CisgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICB9CisgICAgIGFkZEVTRFNGcm9tQ29kZWNQcml2YXRlKHRyYWNrSW5mby0+bU1ldGEsIGZhbHNlLCB0bXBEYXRhLmdldCgpLCB2b3NlbmQpOworCisgICAgcmV0dXJuIE9LOworCit9CisKKwogc3RhdGljIGlubGluZSBib29sIGlzVmFsaWRJbnQzMkNvbG91clZhbHVlKGxvbmcgbG9uZyB2YWx1ZSkgewogICAgIHJldHVybiB2YWx1ZSAhPSBta3ZwYXJzZXI6OkNvbG91cjo6a1ZhbHVlTm90UHJlc2VudAogICAgICAgICAgICAgJiYgdmFsdWUgPj0gSU5UMzJfTUlOCkBAIC0xMjQ3LDcgKzE0NjIsNyBAQAogfQogCiB2b2lkIE1hdHJvc2thRXh0cmFjdG9yOjpnZXRDb2xvckluZm9ybWF0aW9uKAotICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKnZ0cmFjaywgTWV0YURhdGFCYXNlICZtZXRhKSB7CisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VmlkZW9UcmFjayAqdnRyYWNrLCBBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICBjb25zdCBta3ZwYXJzZXI6OkNvbG91ciAqY29sb3IgPSB2dHJhY2stPkdldENvbG91cigpOwogICAgIGlmIChjb2xvciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTEyNTYsNyArMTQ3MSw3IEBACiAgICAgLy8gQ29sb3IgQXNwZWN0cwogICAgIHsKICAgICAgICAgaW50MzJfdCBwcmltYXJpZXMgPSAyOyAvLyBJU08gdW5zcGVjaWZpZWQKLSAgICAgICAgaW50MzJfdCB0cmFuc2ZlciA9IDI7IC8vIElTTyB1bnNwZWNpZmllZAorICAgICAgICBpbnQzMl90IGlzb3RyYW5zZmVyID0gMjsgLy8gSVNPIHVuc3BlY2lmaWVkCiAgICAgICAgIGludDMyX3QgY29lZmZzID0gMjsgLy8gSVNPIHVuc3BlY2lmaWVkCiAgICAgICAgIGJvb2wgZnVsbFJhbmdlID0gZmFsc2U7IC8vIGRlZmF1bHQKICAgICAgICAgYm9vbCByYW5nZVNwZWNpZmllZCA9IGZhbHNlOwpAQCAtMTI2NSw3ICsxNDgwLDcgQEAKICAgICAgICAgICAgIHByaW1hcmllcyA9IGNvbG9yLT5wcmltYXJpZXM7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlzVmFsaWRJbnQzMkNvbG91clZhbHVlKGNvbG9yLT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MpKSB7Ci0gICAgICAgICAgICB0cmFuc2ZlciA9IGNvbG9yLT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M7CisgICAgICAgICAgICBpc290cmFuc2ZlciA9IGNvbG9yLT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlzVmFsaWRJbnQzMkNvbG91clZhbHVlKGNvbG9yLT5tYXRyaXhfY29lZmZpY2llbnRzKSkgewogICAgICAgICAgICAgY29lZmZzID0gY29sb3ItPm1hdHJpeF9jb2VmZmljaWVudHM7CkBAIC0xMjc4LDE0ICsxNDkzLDIxIEBACiAgICAgICAgICAgICByYW5nZVNwZWNpZmllZCA9IHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICBDb2xvckFzcGVjdHMgYXNwZWN0czsKLSAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAotICAgICAgICAgICAgICAgIHByaW1hcmllcywgdHJhbnNmZXIsIGNvZWZmcywgZnVsbFJhbmdlLCBhc3BlY3RzKTsKLSAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5Q29sb3JQcmltYXJpZXMsIGFzcGVjdHMubVByaW1hcmllcyk7Ci0gICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVRyYW5zZmVyRnVuY3Rpb24sIGFzcGVjdHMubVRyYW5zZmVyKTsKLSAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5Q29sb3JNYXRyaXgsIGFzcGVjdHMubU1hdHJpeENvZWZmcyk7Ci0gICAgICAgIG1ldGEuc2V0SW50MzIoCi0gICAgICAgICAgICAgICAga0tleUNvbG9yUmFuZ2UsIHJhbmdlU3BlY2lmaWVkID8gYXNwZWN0cy5tUmFuZ2UgOiBDb2xvckFzcGVjdHM6OlJhbmdlVW5zcGVjaWZpZWQpOworICAgICAgICBpbnQzMl90IHJhbmdlID0gMDsKKyAgICAgICAgaW50MzJfdCBzdGFuZGFyZCA9IDA7CisgICAgICAgIGludDMyX3QgdHJhbnNmZXIgPSAwOworICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoCisgICAgICAgICAgICAgICAgcHJpbWFyaWVzLCBpc290cmFuc2ZlciwgY29lZmZzLCBmdWxsUmFuZ2UsCisgICAgICAgICAgICAgICAgJnJhbmdlLCAmc3RhbmRhcmQsICZ0cmFuc2Zlcik7CisgICAgICAgIGlmIChyYW5nZSAhPSAwKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRSwgcmFuZ2UpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGFuZGFyZCAhPSAwKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9TVEFOREFSRCwgc3RhbmRhcmQpOworICAgICAgICB9CisgICAgICAgIGlmICh0cmFuc2ZlciAhPSAwKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUiwgdHJhbnNmZXIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gSERSIFN0YXRpYyBJbmZvCkBAIC0xMzI5LDI2ICsxNTUxLDI4IEBACiAgICAgICAgIC8vIE9ubHkgYWR2ZXJ0aXNlIHN0YXRpYyBpbmZvIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgZ3JvdXBzIGhhdmUgYmVlbiBzcGVjaWZpZWQuCiAgICAgICAgIGlmIChtZW1jbXAoJmluZm8sICZudWxsSW5mbywgc2l6ZW9mKGluZm8pKSAhPSAwKSB7CiAgICAgICAgICAgICBpbmZvLm1JRCA9IEhEUlN0YXRpY0luZm86OmtUeXBlMTsKLSAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5SGRyU3RhdGljSW5mbywgJ2hkclMnLCAmaW5mbywgc2l6ZW9mKGluZm8pKTsKKyAgICAgICAgICAgIENvbG9yVXRpbHM6OnNldEhEUlN0YXRpY0luZm9JbnRvQU1lZGlhRm9ybWF0KGluZm8sIG1ldGEpOwogICAgICAgICB9CiAgICAgfQogfQogCiBzdGF0dXNfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6aW5pdFRyYWNrSW5mbygKLSAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqdHJhY2ssIE1ldGFEYXRhQmFzZSAmbWV0YSwgVHJhY2tJbmZvICp0cmFja0luZm8pIHsKKyAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqdHJhY2ssIEFNZWRpYUZvcm1hdCAqbWV0YSwgVHJhY2tJbmZvICp0cmFja0luZm8pIHsKICAgICB0cmFja0luZm8tPm1UcmFja051bSA9IHRyYWNrLT5HZXROdW1iZXIoKTsKICAgICB0cmFja0luZm8tPm1NZXRhID0gbWV0YTsKICAgICB0cmFja0luZm8tPm1FeHRyYWN0b3IgPSB0aGlzOwogICAgIHRyYWNrSW5mby0+bUVuY3J5cHRlZCA9IGZhbHNlOwogICAgIHRyYWNrSW5mby0+bUhlYWRlciA9IE5VTEw7CiAgICAgdHJhY2tJbmZvLT5tSGVhZGVyTGVuID0gMDsKKyAgICB0cmFja0luZm8tPm1OYWxMZW5ndGhTaXplID0gLTE7CiAKICAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgdHJhY2stPkdldENvbnRlbnRFbmNvZGluZ0NvdW50KCk7IGkrKykgewogICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkNvbnRlbnRFbmNvZGluZyAqZW5jb2RpbmcgPSB0cmFjay0+R2V0Q29udGVudEVuY29kaW5nQnlJbmRleChpKTsKICAgICAgICAgZm9yKHNpemVfdCBqID0gMDsgaiA8IGVuY29kaW5nLT5HZXRFbmNyeXB0aW9uQ291bnQoKTsgaisrKSB7CiAgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkNvbnRlbnRFbmNvZGluZzo6Q29udGVudEVuY3J5cHRpb24gKmVuY3J5cHRpb247CiAgICAgICAgICAgICBlbmNyeXB0aW9uID0gZW5jb2RpbmctPkdldEVuY3J5cHRpb25CeUluZGV4KGopOwotICAgICAgICAgICAgdHJhY2tJbmZvLT5tTWV0YS5zZXREYXRhKGtLZXlDcnlwdG9LZXksIDAsIGVuY3J5cHRpb24tPmtleV9pZCwgZW5jcnlwdGlvbi0+a2V5X2lkX2xlbik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKHRyYWNrSW5mby0+bU1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgZW5jcnlwdGlvbi0+a2V5X2lkLCBlbmNyeXB0aW9uLT5rZXlfaWRfbGVuKTsKICAgICAgICAgICAgIHRyYWNrSW5mby0+bUVuY3J5cHRlZCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTM5Nyw5ICsxNjIxLDEyIEBACiAKICAgICAgICAgZW51bSB7IFZJREVPX1RSQUNLID0gMSwgQVVESU9fVFJBQ0sgPSAyIH07CiAKLSAgICAgICAgTWV0YURhdGFCYXNlIG1ldGE7CisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICAgICAgaW50MzJfdCBuYWxTaXplID0gLTE7CisKKyAgICAgICAgYm9vbCBpc1NldENzZEZyb20xc3RGcmFtZSA9IGZhbHNlOwogCiAgICAgICAgIHN3aXRjaCAodHJhY2stPkdldFR5cGUoKSkgewogICAgICAgICAgICAgY2FzZSBWSURFT19UUkFDSzoKQEAgLTE0MDgsMzcgKzE2MzUsODkgQEAKICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgbWt2cGFyc2VyOjpWaWRlb1RyYWNrICo+KHRyYWNrKTsKIAogICAgICAgICAgICAgICAgIGlmICghc3RyY21wKCJWX01QRUc0L0lTTy9BVkMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUFWQ0MsIDAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlY1ByaXZhdGVTaXplID4gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmFsU2l6ZSA9IDEgKyAoY29kZWNQcml2YXRlWzRdICYgMyk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlZfTVBFR0gvSVNPL0hFVkMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOwogICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWNQcml2YXRlU2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5SFZDQywga1R5cGVIVkNDLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWNQcml2YXRlU2l6ZSA+IDE0ICsgNykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbFNpemUgPSAxICsgKGNvZGVjUHJpdmF0ZVsxNCArIDddICYgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiSEVWQyBpcyBkZXRlY3RlZCwgYnV0IGRvZXMgbm90IGhhdmUgY29uZmlndXJhdGlvbi4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX01QRUc0L0lTTy9BU1AiLCBjb2RlY0lEKSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlY1ByaXZhdGVTaXplID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVTRFNGcm9tQ29kZWNQcml2YXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBmYWxzZSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBpcyBkZXRlY3RlZCwgYnV0IGRvZXMgbm90IGhhdmUgY29uZmlndXJhdGlvbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0lEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXRDc2RGcm9tMXN0RnJhbWUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX1ZQOCIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9WUDkiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgLy8gJ2NzZC0wJyBmb3IgVlA5IGlzIHRoZSBCbG9iIG9mIENvZGVjIFByaXZhdGUgZGF0YSBhcwogICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBpbiBodHRwOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy92cDkvcHJvZmlsZXMvLgotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVZwOUNvZGVjUHJpdmF0ZSwgMCwgY29kZWNQcml2YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX0FWMSIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9NUEVHMiIsIGNvZGVjSUQpIHx8ICFzdHJjbXAoIlZfTVBFRzEiLCBjb2RlY0lEKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlY1ByaXZhdGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVTRFNGcm9tQ29kZWNQcml2YXRlKG1ldGEsIGZhbHNlLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiTm8gc3BlY2lmaWMgY29kZWMgcHJpdmF0ZSBkYXRhLCBmaW5kIGl0IGZyb20gdGhlIGZpcnN0IGZyYW1lIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXRDc2RGcm9tMXN0RnJhbWUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9NSlBFRyIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fTUpQRUcpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9NUy9WRlcvRk9VUkNDIiwgY29kZWNJRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5VTEwgPT0gY29kZWNQcml2YXRlIHx8Y29kZWNQcml2YXRlU2l6ZSA8IDIwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVl9NUy9WRlcvRk9VUkNDIGhhcyBubyB2YWxpZCBwcml2YXRlIGRhdGEoJXApLGNvZGVjUHJpdmF0ZVNpemU6JXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvdXJjYyA9ICoodWludDMyX3QgKikoY29kZWNQcml2YXRlICsgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgZm91cmNjID0gbnRvaGwoZm91cmNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1pbWUgPSBNS1ZGb3VyQ0MyTUlNRShmb3VyY2MpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlZfTVMvVkZXL0ZPVVJDQyB0eXBlIGlzICVzIiwgbWltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlZfTVMvVkZXL0ZPVVJDQyBjb250aW51ZSx1bnN1cHBvcnQgdmlkZW8gdHlwZT0lcyxmb3VyY2M9MHglMDh4LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lLCBmb3VyY2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19YVklEKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fRElWWCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0RJVlgzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2V0Q3NkRnJvbTFzdEZyYW1lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZvdXJDQyBoYXZlIHVuc3VwcG9ydCBjb2RlYywgdHlwZT0lcyxmb3VyY2M9MHglMDh4LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZSwgZm91cmNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBpcyBub3Qgc3VwcG9ydGVkLiIsIGNvZGVjSUQpOwpAQCAtMTQ1NSw4ICsxNzM0LDggQEAKICAgICAgICAgICAgICAgICAgICAgQUxPR1coInRyYWNrIGhlaWdodCBleGNlZWRzIGludDMyX3QsICVsbGQiLCBoZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5V2lkdGgsIChpbnQzMl90KXdpZHRoKTsKLSAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlIZWlnaHQsIChpbnQzMl90KWhlaWdodCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsIChpbnQzMl90KXdpZHRoKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsIChpbnQzMl90KWhlaWdodCk7CiAKICAgICAgICAgICAgICAgICAvLyBzZXR0aW5nIGRpc3BsYXkgd2lkdGgvaGVpZ2h0IGlzIG9wdGlvbmFsCiAgICAgICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIGRpc3BsYXlVbml0ID0gdnRyYWNrLT5HZXREaXNwbGF5VW5pdCgpOwpAQCAtMTQ2Niw4ICsxNzQ1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAmJiBkaXNwbGF5SGVpZ2h0ID4gMCAmJiBkaXNwbGF5SGVpZ2h0IDw9IElOVDMyX01BWCkgewogICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRpc3BsYXlVbml0KSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogLy8gcGl4ZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlEaXNwbGF5V2lkdGgsIChpbnQzMl90KWRpc3BsYXlXaWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCAoaW50MzJfdClkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfV0lEVEgsIChpbnQzMl90KWRpc3BsYXlXaWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0hFSUdIVCwgKGludDMyX3QpZGlzcGxheUhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiAvLyBjZW50aW1ldGVycwogICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IC8vIGluY2hlcwpAQCAtMTQ4MSw4ICsxNzYyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgY29tcHV0ZWRIZWlnaHQgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heChoZWlnaHQsIHdpZHRoICogZGlzcGxheUhlaWdodCAvIGRpc3BsYXlXaWR0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcHV0ZWRXaWR0aCA8PSBJTlQzMl9NQVggJiYgY29tcHV0ZWRIZWlnaHQgPD0gSU5UMzJfTUFYKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCAoaW50MzJfdCljb21wdXRlZFdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCAoaW50MzJfdCljb21wdXRlZEhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfV0lEVEgsIChpbnQzMl90KWNvbXB1dGVkV2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0hFSUdIVCwgKGludDMyX3QpY29tcHV0ZWRIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTE1MDIsMzQgKzE3ODUsNTQgQEAKICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgbWt2cGFyc2VyOjpBdWRpb1RyYWNrICo+KHRyYWNrKTsKIAogICAgICAgICAgICAgICAgIGlmICghc3RyY21wKCJBX0FBQyIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOwogICAgICAgICAgICAgICAgICAgICBDSEVDSyhjb2RlY1ByaXZhdGVTaXplID49IDIpOwogCiAgICAgICAgICAgICAgICAgICAgIGFkZEVTRFNGcm9tQ29kZWNQcml2YXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIHRydWUsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX1ZPUkJJUyIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpOwogCiAgICAgICAgICAgICAgICAgICAgIGVyciA9IGFkZFZvcmJpc0NvZGVjSW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiQV9PUFVTIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUyk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5T3B1c0hlYWRlciwgMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQ2NChrS2V5T3B1c0NvZGVjRGVsYXksIHRyYWNrLT5HZXRDb2RlY0RlbGF5KCkpOwotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldEludDY0KGtLZXlPcHVzU2Vla1ByZVJvbGwsIHRyYWNrLT5HZXRTZWVrUHJlUm9sbCgpKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGNvZGVjRGVsYXkgPSB0cmFjay0+R2V0Q29kZWNEZWxheSgpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMSwgJmNvZGVjRGVsYXksIHNpemVvZihjb2RlY0RlbGF5KSk7CiAgICAgICAgICAgICAgICAgICAgIG1TZWVrUHJlUm9sbE5zID0gdHJhY2stPkdldFNlZWtQcmVSb2xsKCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8yLCAmbVNlZWtQcmVSb2xsTnMsIHNpemVvZihtU2Vla1ByZVJvbGxOcykpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiQV9NUEVHL0wzIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfRkxBQyIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQyk7CiAgICAgICAgICAgICAgICAgICAgIGVyciA9IGFkZEZsYWNNZXRhZGF0YShtZXRhLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKCFzdHJjbXAoIkFfTVMvQUNNIiwgY29kZWNJRCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoTlVMTCA9PSBjb2RlY1ByaXZhdGUpIHx8IChjb2RlY1ByaXZhdGVTaXplIDwgMzApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygidW5zdXBwb3J0ZWQgYXVkaW86IEFfTVMvQUNNIGhhcyBubyB2YWxpZCBwcml2YXRlIGRhdGE6ICVzLCBzaXplOiAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjUHJpdmF0ZSA9PSBOVUxMID8gIm51bGwiIDogIm5vbi1udWxsIiwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IElEID0gKih1aW50MTZfdCAqKWNvZGVjUHJpdmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJRCA9PSAweDAwNTUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiQV9NUy9BQ00gdW5zdXBwb3J0ZWQgdHlwZSAsIGNvbnRpbnVlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgaXMgbm90IHN1cHBvcnRlZC4iLCBjb2RlY0lEKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgYXRyYWNrLT5HZXRTYW1wbGluZ1JhdGUoKSk7Ci0gICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBhdHJhY2stPkdldENoYW5uZWxzKCkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBhdHJhY2stPkdldFNhbXBsaW5nUmF0ZSgpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBhdHJhY2stPkdldENoYW5uZWxzKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xNTQyLDcgKzE4NDUsNyBAQAogICAgICAgICAgICBjaGFyIGxhbmdbNF07CiAgICAgICAgICAgIHN0cm5jcHkobGFuZywgbGFuZ3VhZ2UsIDMpOwogICAgICAgICAgICBsYW5nWzNdID0gJ1wwJzsKLSAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNZWRpYUxhbmd1YWdlLCBsYW5nKTsKKyAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0xBTkdVQUdFLCBsYW5nKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTE1NTEsMjAgKzE4NTQsNDMgQEAKICAgICAgICAgfQogCiAgICAgICAgIGxvbmcgbG9uZyBkdXJhdGlvbk5zID0gbVNlZ21lbnQtPkdldER1cmF0aW9uKCk7Ci0gICAgICAgIG1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCAoZHVyYXRpb25OcyArIDUwMCkgLyAxMDAwKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIChkdXJhdGlvbk5zICsgNTAwKSAvIDEwMDApOwogCiAgICAgICAgIG1UcmFja3MucHVzaCgpOwogICAgICAgICBzaXplX3QgbiA9IG1UcmFja3Muc2l6ZSgpIC0gMTsKICAgICAgICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KG4pOwogICAgICAgICBpbml0VHJhY2tJbmZvKHRyYWNrLCBtZXRhLCB0cmFja0luZm8pOworICAgICAgICB0cmFja0luZm8tPm1OYWxMZW5ndGhTaXplID0gbmFsU2l6ZTsKIAotICAgICAgICBpZiAoIXN0cmNtcCgiVl9NUEVHNC9JU08vQVZDIiwgY29kZWNJRCkgJiYgY29kZWNQcml2YXRlU2l6ZSA9PSAwKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWV0eXBlID0gIiI7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZXR5cGUpOworCisgICAgICAgIGlmICgoIXN0cmNtcCgiVl9NUEVHNC9JU08vQVZDIiwgY29kZWNJRCkgJiYgY29kZWNQcml2YXRlU2l6ZSA9PSAwKSB8fAorICAgICAgICAgICAgKCFzdHJjbXAobWltZXR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykgJiYgaXNTZXRDc2RGcm9tMXN0RnJhbWUpKSB7CiAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIHJlY292ZXIgZnJvbSBBVkMgdHJhY2sgd2l0aG91dCBjb2RlYyBwcml2YXRlIGRhdGEKICAgICAgICAgICAgIGVyciA9IHN5bnRoZXNpemVBVkNDKHRyYWNrSW5mbywgbik7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgbVRyYWNrcy5wb3AoKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgoIXN0cmNtcCgiVl9NUEVHMiIsIGNvZGVjSUQpICYmIGNvZGVjUHJpdmF0ZVNpemUgPT0gMCkgfHwKKyAgICAgICAgICAgICghc3RyY21wKG1pbWV0eXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMikgJiYgaXNTZXRDc2RGcm9tMXN0RnJhbWUpKSB7CisgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIHJlY292ZXIgZnJvbSBNUEVHMiB0cmFjayB3aXRob3V0IGNvZGVjIHByaXZhdGUgZGF0YQorICAgICAgICAgICAgZXJyID0gc3ludGhlc2l6ZU1QRUcyKHRyYWNrSW5mbywgbik7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgbVRyYWNrcy5wb3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgoIXN0cmNtcCgiVl9NUEVHNC9JU08vQVNQIiwgY29kZWNJRCkgJiYgY29kZWNQcml2YXRlU2l6ZSA9PSAwKSB8fAorICAgICAgICAgICAgKCFzdHJjbXAobWltZXR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KSAmJiBpc1NldENzZEZyb20xc3RGcmFtZSkgfHwKKyAgICAgICAgICAgICghc3RyY21wKG1pbWV0eXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19YVklEKSAmJiBpc1NldENzZEZyb20xc3RGcmFtZSkgfHwKKyAgICAgICAgICAgICghc3RyY21wKG1pbWV0eXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19ESVZYKSAmJiBpc1NldENzZEZyb20xc3RGcmFtZSkgfHwKKyAgICAgICAgICAgICghc3RyY21wKG1pbWV0eXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19ESVZYMykgJiYgaXNTZXRDc2RGcm9tMXN0RnJhbWUpKSB7CisgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIHJlY292ZXIgZnJvbSBNUEVHNCB0cmFjayB3aXRob3V0IGNvZGVjIHByaXZhdGUgZGF0YQorICAgICAgICAgICAgZXJyID0gc3ludGhlc2l6ZU1QRUc0KHRyYWNrSW5mbywgbik7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgbVRyYWNrcy5wb3AoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorCiAgICAgfQogfQogCkBAIC0xNTczLDcgKzE4OTksNyBAQAogICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KGkpOwogCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgIENIRUNLKGluZm8tPm1NZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldFN0cmluZyhpbmZvLT5tTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogCiAgICAgICAgIGlmIChzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTU5OSwxNiArMTkyNSwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaXRlci5hZHZhbmNlKCk7CiAgICAgICAgIH0KLSAgICAgICAgaW5mby0+bU1ldGEuc2V0SW50NjQoa0tleVRodW1ibmFpbFRpbWUsIHRodW1ibmFpbFRpbWVVcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChpbmZvLT5tTWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FLCB0aHVtYm5haWxUaW1lVXMpOwogICAgIH0KIH0KIAotc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwKLSAgICAgICAgICAgIG1Jc1dlYm0gPyAidmlkZW8vd2VibSIgOiBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTUFUUk9TS0EpOworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgbUlzV2VibSA/ICJ2aWRlby93ZWJtIiA6IE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQSk7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogdWludDMyX3QgTWF0cm9za2FFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewpAQCAtMTYyMSw3ICsxOTQ3LDcgQEAKIH0KIAogYm9vbCBTbmlmZk1hdHJvc2thKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIgcmVhZGVyKHNvdXJjZSk7CiAgICAgbWt2cGFyc2VyOjpFQk1MSGVhZGVyIGVibWxIZWFkZXI7CiAgICAgbG9uZyBsb25nIHBvczsKQEAgLTE2MzQsMjggKzE5NjAsNDAgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAibWthIiwKKyAgICAibWt2IiwKKyAgICAid2VibSIsCisgICAgTlVMTAorfTsKIAogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgVVVJRCgiYWJiZWRkOTItMzhjNC00OTA0LWE0YzEtYjNmNDVmODk5OTgwIiksCiAgICAgICAgIDEsCiAgICAgICAgICJNYXRyb3NrYSBFeHRyYWN0b3IiLAotICAgICAgICBbXSgKLSAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICAgICAgICAgIHZvaWQgKiosCi0gICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgewotICAgICAgICAgICAgaWYgKFNuaWZmTWF0cm9za2Eoc291cmNlLCBjb25maWRlbmNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWF0cm9za2FFeHRyYWN0b3Ioc291cmNlKTt9OworICAgICAgICB7CisgICAgICAgICAgICAudjMgPSB7CisgICAgICAgICAgICAgICAgW10oCisgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICAgICAgICAgICAgICB2b2lkICoqLAorICAgICAgICAgICAgICAgICAgICBGcmVlTWV0YUZ1bmMgKikgLT4gQ3JlYXRvckZ1bmMgeworICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICBpZiAoU25pZmZNYXRyb3NrYSgmaGVscGVyLCBjb25maWRlbmNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IENNZWRpYUV4dHJhY3RvciogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKG5ldyBNYXRyb3NrYUV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7fTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgfTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5oCmluZGV4IDM1NjhlYTEuLmQ1M2Q5ZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuaApAQCAtMjAsOCArMjAsOSBAQAogCiAjaW5jbHVkZSAibWt2cGFyc2VyL21rdnBhcnNlci5oIgogCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKQEAgLTM0LDE2ICszNSwxNiBAQAogc3RydWN0IERhdGFTb3VyY2VCYXNlUmVhZGVyOwogc3RydWN0IE1hdHJvc2thU291cmNlOwogCi1zdHJ1Y3QgTWF0cm9za2FFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE1hdHJvc2thRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworc3RydWN0IE1hdHJvc2thRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKKyAgICBleHBsaWNpdCBNYXRyb3NrYUV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKIAotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CiAKQEAgLTU3LDkgKzU4LDE3IEBACiAgICAgZnJpZW5kIHN0cnVjdCBCbG9ja0l0ZXJhdG9yOwogCiAgICAgc3RydWN0IFRyYWNrSW5mbyB7CisgICAgICAgIFRyYWNrSW5mbygpIHsKKyAgICAgICAgICAgIG1NZXRhID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB+VHJhY2tJbmZvKCkgeworICAgICAgICAgICAgaWYgKG1NZXRhKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtTWV0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgdW5zaWduZWQgbG9uZyBtVHJhY2tOdW07CiAgICAgICAgIGJvb2wgbUVuY3J5cHRlZDsKLSAgICAgICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgICAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogICAgICAgICBjb25zdCBNYXRyb3NrYUV4dHJhY3RvciAqbUV4dHJhY3RvcjsKICAgICAgICAgVmVjdG9yPGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQqPiBtQ3VlUG9pbnRzOwogCkBAIC02OCw2ICs3Nyw3IEBACiAgICAgICAgIC8vIGluIH5NYXRyb3NrYUV4dHJhY3Rvci4KICAgICAgICAgdW5zaWduZWQgY2hhciAqbUhlYWRlcjsKICAgICAgICAgc2l6ZV90IG1IZWFkZXJMZW47CisgICAgICAgIGludDMyX3QgbU5hbExlbmd0aFNpemU7CiAKICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayogZ2V0VHJhY2soKSBjb25zdDsKICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludDo6VHJhY2tQb3NpdGlvbiAqZmluZChsb25nIGxvbmcgdGltZU5zKSBjb25zdDsKQEAgLTc2LDcgKzg2LDcgQEAKICAgICBNdXRleCBtTG9jazsKICAgICBWZWN0b3I8VHJhY2tJbmZvPiBtVHJhY2tzOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIERhdGFTb3VyY2VCYXNlUmVhZGVyICptUmVhZGVyOwogICAgIG1rdnBhcnNlcjo6U2VnbWVudCAqbVNlZ21lbnQ7CiAgICAgYm9vbCBtRXh0cmFjdGVkVGh1bWJuYWlsczsKQEAgLTg1LDE1ICs5NSwxNyBAQAogICAgIGludDY0X3QgbVNlZWtQcmVSb2xsTnM7CiAKICAgICBzdGF0dXNfdCBzeW50aGVzaXplQVZDQyhUcmFja0luZm8gKnRyYWNrSW5mbywgc2l6ZV90IGluZGV4KTsKKyAgICBzdGF0dXNfdCBzeW50aGVzaXplTVBFRzIoVHJhY2tJbmZvICp0cmFja0luZm8sIHNpemVfdCBpbmRleCk7CisgICAgc3RhdHVzX3Qgc3ludGhlc2l6ZU1QRUc0KFRyYWNrSW5mbyAqdHJhY2tJbmZvLCBzaXplX3QgaW5kZXgpOwogICAgIHN0YXR1c190IGluaXRUcmFja0luZm8oCiAgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjaywKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvKTsKICAgICB2b2lkIGFkZFRyYWNrcygpOwogICAgIHZvaWQgZmluZFRodW1ibmFpbHMoKTsKICAgICB2b2lkIGdldENvbG9ySW5mb3JtYXRpb24oCiAgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKnZ0cmFjaywKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIGJvb2wgaXNMaXZlU3RyZWFtaW5nKCkgY29uc3Q7CiAKICAgICBNYXRyb3NrYUV4dHJhY3Rvcihjb25zdCBNYXRyb3NrYUV4dHJhY3RvciAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCmluZGV4IDQ5NGNlYWMuLjRlMmYyNDggMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icApAQCAtMTIsMTMgKzEyLDEzIEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCiAKICAgICBuYW1lOiAibGlibXAzZXh0cmFjdG9yIiwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuY3BwCmluZGV4IDMzY2ZmOTYuLmE4MzhhZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmNwcApAQCAtMjQsOCArMjQsNiBAQAogI2luY2x1ZGUgIlZCUklTZWVrZXIuaCIKICNpbmNsdWRlICJYSU5HU2Vla2VyLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgpAQCAtNDYsNyArNDQsNyBAQAogc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXNrID0gMHhmZmZlMGMwMDsKIAogc3RhdGljIGJvb2wgUmVzeW5jKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCB1aW50MzJfdCBtYXRjaF9oZWFkZXIsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgdWludDMyX3QgbWF0Y2hfaGVhZGVyLAogICAgICAgICBvZmY2NF90ICppbm91dF9wb3MsIG9mZjY0X3QgKnBvc3RfaWQzX3BvcywgdWludDMyX3QgKm91dF9oZWFkZXIpIHsKICAgICBpZiAocG9zdF9pZDNfcG9zICE9IE5VTEwpIHsKICAgICAgICAgKnBvc3RfaWQzX3BvcyA9IDA7CkBAIC0yMDksMzUgKzIwNywzNCBAQAogICAgIHJldHVybiB2YWxpZDsKIH0KIAotY2xhc3MgTVAzU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgTVAzU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogcHVibGljOgogICAgIE1QM1NvdXJjZSgKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICAgICAgb2ZmNjRfdCBmaXJzdF9mcmFtZV9wb3MsIHVpbnQzMl90IGZpeGVkX2hlYWRlciwKICAgICAgICAgICAgIE1QM1NlZWtlciAqc2Vla2VyKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NUDNTb3VyY2UoKTsKIAogcHJpdmF0ZToKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhGcmFtZVNpemU7Ci0gICAgTWV0YURhdGFCYXNlICZtTWV0YTsKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBvZmY2NF90IG1GaXJzdEZyYW1lUG9zOwogICAgIHVpbnQzMl90IG1GaXhlZEhlYWRlcjsKICAgICBvZmY2NF90IG1DdXJyZW50UG9zOwogICAgIGludDY0X3QgbUN1cnJlbnRUaW1lVXM7CiAgICAgYm9vbCBtU3RhcnRlZDsKICAgICBNUDNTZWVrZXIgKm1TZWVrZXI7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwogCiAgICAgaW50NjRfdCBtQmFzaXNUaW1lVXM7CiAgICAgaW50NjRfdCBtU2FtcGxlc1JlYWQ7CkBAIC0yNTMsNyArMjUwLDcgQEAKIH07CiAKIE1QM0V4dHJhY3Rvcjo6TVAzRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBNcDNNZXRhICptZXRhKQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIE1wM01ldGEgKm1ldGEpCiAgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1GaXJzdEZyYW1lUG9zKC0xKSwKQEAgLTI4NSw2ICsyODIsNyBAQAogICAgIG1GaXhlZEhlYWRlciA9IGhlYWRlcjsKICAgICBYSU5HU2Vla2VyICpzZWVrZXIgPSBYSU5HU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKG1EYXRhU291cmNlLCBtRmlyc3RGcmFtZVBvcyk7CiAKKyAgICBtTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICBpZiAoc2Vla2VyID09IE5VTEwpIHsKICAgICAgICAgbVNlZWtlciA9IFZCUklTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UobURhdGFTb3VyY2UsIHBvc3RfaWQzX3Bvcyk7CiAgICAgfSBlbHNlIHsKQEAgLTI5Miw4ICsyOTAsOCBAQAogICAgICAgICBpbnQgZW5jZCA9IHNlZWtlci0+Z2V0RW5jb2RlckRlbGF5KCk7CiAgICAgICAgIGludCBlbmNwID0gc2Vla2VyLT5nZXRFbmNvZGVyUGFkZGluZygpOwogICAgICAgICBpZiAoZW5jZCAhPSAwIHx8IGVuY3AgIT0gMCkgewotICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJEZWxheSwgZW5jZCk7Ci0gICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIGVuY3ApOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVksIGVuY2QpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORywgZW5jcCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMyOSwyMSArMzI3LDIzIEBACiAKICAgICBzd2l0Y2ggKGxheWVyKSB7CiAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIG1NZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0kpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0kpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIG1NZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobU1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JSSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgbU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CiAKLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOwotICAgIG1NZXRhLnNldEludDMyKGtLZXlCaXRSYXRlLCBiaXRyYXRlICogMTAwMCk7Ci0gICAgbU1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtX2NoYW5uZWxzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZV9yYXRlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIGJpdHJhdGUgKiAxMDAwKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbnVtX2NoYW5uZWxzKTsKIAogICAgIGludDY0X3QgZHVyYXRpb25VczsKIApAQCAtMzYzLDcgKzM2Myw3IEBACiAgICAgfQogCiAgICAgaWYgKGR1cmF0aW9uVXMgPj0gMCkgewotICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uVXMpOwogICAgIH0KIAogICAgIG1Jbml0Q2hlY2sgPSBPSzsKQEAgLTM3MSw3ICszNzEsOCBAQAogICAgIC8vIEdldCBpVHVuZXMtc3R5bGUgZ2FwbGVzcyBpbmZvIGlmIHByZXNlbnQuCiAgICAgLy8gV2hlbiBnZXR0aW5nIHRoZSBpZDMgdGFnLCBza2lwIHRoZSBWMSB0YWdzIHRvIHByZXZlbnQgdGhlIHNvdXJjZSBjYWNoZQogICAgIC8vIGZyb20gYmVpbmcgaXRlcmF0ZWQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAgICBJRDMgaWQzKG1EYXRhU291cmNlLCB0cnVlKTsKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihtRGF0YVNvdXJjZSk7CisgICAgSUQzIGlkMygmaGVscGVyLCB0cnVlKTsKICAgICBpZiAoaWQzLmlzVmFsaWQoKSkgewogICAgICAgICBJRDM6Okl0ZXJhdG9yICpjb20gPSBuZXcgSUQzOjpJdGVyYXRvcihpZDMsICJDT00iKTsKICAgICAgICAgaWYgKGNvbS0+ZG9uZSgpKSB7CkBAIC0zOTAsOCArMzkxLDggQEAKIAogICAgICAgICAgICAgICAgIGludDMyX3QgZGVsYXksIHBhZGRpbmc7CiAgICAgICAgICAgICAgICAgaWYgKHNzY2FuZih2YWx1ZSwgIiAlKnggJXggJXggJSp4IiwgJmRlbGF5LCAmcGFkZGluZykgPT0gMikgewotICAgICAgICAgICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7Ci0gICAgICAgICAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgcGFkZGluZyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZLCBkZWxheSk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX1BBRERJTkcsIHBhZGRpbmcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTQwNCwxMyArNDA1LDE1IEBACiAKIE1QM0V4dHJhY3Rvcjo6fk1QM0V4dHJhY3RvcigpIHsKICAgICBkZWxldGUgbVNlZWtlcjsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtTWV0YSk7CiB9CiAKIHNpemVfdCBNUDNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrICE9IE9LID8gMCA6IDE7CiB9CiAKLU1lZGlhVHJhY2sgKk1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNUDNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtNDIwLDE0ICs0MjMsMTQgQEAKICAgICAgICAgICAgIG1TZWVrZXIpOwogfQogCi1zdGF0dXNfdCBNUDNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNDQwLDcgKzQ0Myw3IEBACiAvLyBTZXQgb3VyIG1heCBmcmFtZSBzaXplIHRvIHRoZSBuZWFyZXN0IHBvd2VyIG9mIDIgYWJvdmUgdGhpcyBzaXplIChha2EsIDRrQikKIGNvbnN0IHNpemVfdCBNUDNTb3VyY2U6OmtNYXhGcmFtZVNpemUgPSAoMSA8PCAxMik7IC8qIDQwOTYgYnl0ZXMgKi8KIE1QM1NvdXJjZTo6TVAzU291cmNlKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICBvZmY2NF90IGZpcnN0X2ZyYW1lX3BvcywgdWludDMyX3QgZml4ZWRfaGVhZGVyLAogICAgICAgICBNUDNTZWVrZXIgKnNlZWtlcikKICAgICA6IG1NZXRhKG1ldGEpLApAQCAtNDUxLDcgKzQ1NCw2IEBACiAgICAgICBtQ3VycmVudFRpbWVVcygwKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1TZWVrZXIoc2Vla2VyKSwKLSAgICAgIG1Hcm91cChOVUxMKSwKICAgICAgIG1CYXNpc1RpbWVVcygwKSwKICAgICAgIG1TYW1wbGVzUmVhZCgwKSB7CiB9CkBAIC00NjIsMTIgKzQ2NCwxMCBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgTVAzU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKikgeworbWVkaWFfc3RhdHVzX3QgTVAzU291cmNlOjpzdGFydCgpIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCi0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0KLSAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoa01heEZyYW1lU2l6ZSkpOworICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcihrTWF4RnJhbWVTaXplKTsKIAogICAgIG1DdXJyZW50UG9zID0gbUZpcnN0RnJhbWVQb3M7CiAgICAgbUN1cnJlbnRUaW1lVXMgPSAwOwpAQCAtNDc3LDI3ICs0NzcsMjMgQEAKIAogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUDNTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBNUDNTb3VyY2U6OnN0b3AoKSB7CiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUDNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworbWVkaWFfc3RhdHVzX3QgTVAzU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKIH0KIAotc3RhdHVzX3QgTVAzU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBNUDNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwpAQCAtNTA5LDExICs1MDUsMTEgQEAKICAgICAgICAgaWYgKG1TZWVrZXIgPT0gTlVMTAogICAgICAgICAgICAgICAgIHx8ICFtU2Vla2VyLT5nZXRPZmZzZXRGb3JUaW1lKCZhY3R1YWxTZWVrVGltZVVzLCAmbUN1cnJlbnRQb3MpKSB7CiAgICAgICAgICAgICBpbnQzMl90IGJpdHJhdGU7Ci0gICAgICAgICAgICBpZiAoIW1NZXRhLmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdHJhdGUpKSB7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgJmJpdHJhdGUpKSB7CiAgICAgICAgICAgICAgICAgLy8gYml0cmF0ZSBpcyBpbiBiaXRzL3NlYy4KICAgICAgICAgICAgICAgICBBTE9HSSgibm8gYml0cmF0ZSIpOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1DdXJyZW50VGltZVVzID0gc2Vla1RpbWVVczsKQEAgLTUyNywxMCArNTIzLDEwIEBACiAgICAgICAgIG1TYW1wbGVzUmVhZCA9IDA7CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgc2l6ZV90IGZyYW1lX3NpemU7CkBAIC01NDMsNyArNTM5LDggQEAKICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIChuIDwgMCA/IG4gOiBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgICAgIHJldHVybiAoKG4gPCAwICYmIG4gIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgPworICAgICAgICAgICAgICAgICAgICBBTUVESUFfRVJST1JfVU5LTk9XTiA6IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKTsKICAgICAgICAgfQogCiAgICAgICAgIHVpbnQzMl90IGhlYWRlciA9IFUzMl9BVCgoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpKTsKQEAgLTU3Miw3ICs1NjksNyBAQAogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgfQogCiAgICAgICAgIG1DdXJyZW50UG9zID0gcG9zOwpAQCAtNTg3LDEzICs1ODQsMTUgQEAKICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIChuIDwgMCA/IG4gOiBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgcmV0dXJuICgobiA8IDAgJiYgbiAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSA/CisgICAgICAgICAgICAgICAgQU1FRElBX0VSUk9SX1VOS05PV04gOiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSk7CiAgICAgfQogCiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVfc2l6ZSk7CiAKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVVcyk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgbUN1cnJlbnRUaW1lVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCiAgICAgbUN1cnJlbnRQb3MgKz0gZnJhbWVfc2l6ZTsKIApAQCAtNjAyLDM5ICs2MDEsNDAgQEAKIAogICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTVAzRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLmNsZWFyKCk7CittZWRpYV9zdGF0dXNfdCBNUDNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXVkaW8vbXBlZyIpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKIAotICAgIElEMyBpZDMobURhdGFTb3VyY2UpOworICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKG1EYXRhU291cmNlKTsKKyAgICBJRDMgaWQzKCZoZWxwZXIpOwogCiAgICAgaWYgKCFpZDMuaXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICB9CiAKICAgICBzdHJ1Y3QgTWFwIHsKLSAgICAgICAgaW50IGtleTsKKyAgICAgICAgY29uc3QgY2hhciAqa2V5OwogICAgICAgICBjb25zdCBjaGFyICp0YWcxOwogICAgICAgICBjb25zdCBjaGFyICp0YWcyOwogICAgIH07CiAgICAgc3RhdGljIGNvbnN0IE1hcCBrTWFwW10gPSB7Ci0gICAgICAgIHsga0tleUFsYnVtLCAiVEFMQiIsICJUQUwiIH0sCi0gICAgICAgIHsga0tleUFydGlzdCwgIlRQRTEiLCAiVFAxIiB9LAotICAgICAgICB7IGtLZXlBbGJ1bUFydGlzdCwgIlRQRTIiLCAiVFAyIiB9LAotICAgICAgICB7IGtLZXlDb21wb3NlciwgIlRDT00iLCAiVENNIiB9LAotICAgICAgICB7IGtLZXlHZW5yZSwgIlRDT04iLCAiVENPIiB9LAotICAgICAgICB7IGtLZXlUaXRsZSwgIlRJVDIiLCAiVFQyIiB9LAotICAgICAgICB7IGtLZXlZZWFyLCAiVFlFIiwgIlRZRVIiIH0sCi0gICAgICAgIHsga0tleUF1dGhvciwgIlRYVCIsICJURVhUIiB9LAotICAgICAgICB7IGtLZXlDRFRyYWNrTnVtYmVyLCAiVFJLIiwgIlRSQ0siIH0sCi0gICAgICAgIHsga0tleURpc2NOdW1iZXIsICJUUEEiLCAiVFBPUyIgfSwKLSAgICAgICAgeyBrS2V5Q29tcGlsYXRpb24sICJUQ1AiLCAiVENNUCIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FMQlVNLCAiVEFMQiIsICJUQUwiIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9BUlRJU1QsICJUUEUxIiwgIlRQMSIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNULCAiVFBFMiIsICJUUDIiIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUiwgIlRDT00iLCAiVENNIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfR0VOUkUsICJUQ09OIiwgIlRDTyIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX1RJVExFLCAiVElUMiIsICJUVDIiIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9ZRUFSLCAiVFlFIiwgIlRZRVIiIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9BVVRIT1IsICJUWFQiLCAiVEVYVCIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIsICJUUksiLCAiVFJDSyIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIsICJUUEEiLCAiVFBPUyIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OLCAiVENQIiwgIlRDTVAiIH0sCiAgICAgfTsKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1NYXBFbnRyaWVzID0gc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOwogCkBAIC02NTQsNyArNjU0LDcgQEAKICAgICAgICAgaXQtPmdldFN0cmluZygmcyk7CiAgICAgICAgIGRlbGV0ZSBpdDsKIAotICAgICAgICBtZXRhLnNldENTdHJpbmcoa01hcFtpXS5rZXksIHMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIGtNYXBbaV0ua2V5LCBzLnN0cmluZygpKTsKICAgICB9CiAKICAgICBzaXplX3QgZGF0YVNpemU7CkBAIC02NjIsMjggKzY2MiwyOCBAQAogICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBpZDMuZ2V0QWxidW1BcnQoJmRhdGFTaXplLCAmbWltZSk7CiAKICAgICBpZiAoZGF0YSkgewotICAgICAgICBtZXRhLnNldERhdGEoa0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLCBkYXRhLCBkYXRhU2l6ZSk7Ci0gICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCBtaW1lLnN0cmluZygpKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJULCBkYXRhLCBkYXRhU2l6ZSk7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICB2b2lkICptZXRhKSB7CiAgICAgTXAzTWV0YSAqbWV0YURhdGEgPSBzdGF0aWNfY2FzdDxNcDNNZXRhICo+KG1ldGEpOwotICAgIHJldHVybiBuZXcgTVAzRXh0cmFjdG9yKHNvdXJjZSwgbWV0YURhdGEpOworICAgIHJldHVybiB3cmFwKG5ldyBNUDNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSwgbWV0YURhdGEpKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSkgeworc3RhdGljIENyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCisgICAgICAgIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEpIHsKICAgICBvZmY2NF90IHBvcyA9IDA7CiAgICAgb2ZmNjRfdCBwb3N0X2lkM19wb3M7CiAgICAgdWludDMyX3QgaGVhZGVyOwogICAgIHVpbnQ4X3QgbXBlZ19oZWFkZXJbNV07Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIG1wZWdfaGVhZGVyLCBzaXplb2YobXBlZ19oZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihtcGVnX2hlYWRlcikpIHsKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOworICAgIGlmIChoZWxwZXIucmVhZEF0KDAsIG1wZWdfaGVhZGVyLCBzaXplb2YobXBlZ19oZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihtcGVnX2hlYWRlcikpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC02OTEsNyArNjkxLDcgQEAKICAgICAgICAgQUxPR1YoIk1QRUcxUFMgY29udGFpbmVyIGlzIG5vdCBzdXBwb3J0ZWQhIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAoIVJlc3luYyhzb3VyY2UsIDAsICZwb3MsICZwb3N0X2lkM19wb3MsICZoZWFkZXIpKSB7CisgICAgaWYgKCFSZXN5bmMoJmhlbHBlciwgMCwgJnBvcywgJnBvc3RfaWQzX3BvcywgJmhlYWRlcikpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC03MDcsMTYgKzcwNywyNSBAQAogICAgIHJldHVybiBDcmVhdGVFeHRyYWN0b3I7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgIm1wMiIsCisgICAgIm1wMyIsCisgICAgIm1wZWciLAorICAgICJtcGciLAorICAgICJtcGdhIiwKKyAgICBOVUxMCit9OworCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCI4MTJhM2Y2Yy1jOGNmLTQ2ZGUtYjUyOS0zNzc0YjE0MTAzZDQiKSwKICAgICAgICAgMSwgLy8gdmVyc2lvbgogICAgICAgICAiTVAzIEV4dHJhY3RvciIsCi0gICAgICAgIFNuaWZmCisgICAgICAgIHsgLnYzID0ge1NuaWZmLCBleHRlbnNpb25zfSB9CiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaAppbmRleCA0ODViMGNhLi4xZTM4YWI3IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaApAQCAtMTksMzUgKzE5LDM3IEBACiAjZGVmaW5lIE1QM19FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKKwogc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CiBzdHJ1Y3QgTVAzU2Vla2VyOwogY2xhc3MgU3RyaW5nODsKIHN0cnVjdCBNcDNNZXRhOwogCi1jbGFzcyBNUDNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgTVAzRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIHB1YmxpYzoKLSAgICBNUDNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgTXAzTWV0YSAqbWV0YSk7CisgICAgTVAzRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgTXAzTWV0YSAqbWV0YSk7CiAgICAgfk1QM0V4dHJhY3RvcigpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QM0V4dHJhY3RvciI7IH0KIAogcHJpdmF0ZToKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIG9mZjY0X3QgbUZpcnN0RnJhbWVQb3M7Ci0gICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgdWludDMyX3QgbUZpeGVkSGVhZGVyOwogICAgIE1QM1NlZWtlciAqbVNlZWtlcjsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmNwcAppbmRleCBjZDE3OTY1Li5jYTUxYjg4IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmNwcApAQCAtMjcsNyArMjcsOSBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzcsNyArMzksNyBAQAogCiAvLyBzdGF0aWMKIFZCUklTZWVrZXIgKlZCUklTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3QgcG9zdF9pZDNfcG9zKSB7CisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgb2ZmNjRfdCBwb3N0X2lkM19wb3MpIHsKICAgICBvZmY2NF90IHBvcyA9IHBvc3RfaWQzX3BvczsKIAogICAgIHVpbnQ4X3QgaGVhZGVyWzRdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5oCmluZGV4IDkyMTNmNmUuLjUwNzg5OWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmgKQEAgLTI0LDExICsyNCwxMSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIERhdGFTb3VyY2VCYXNlOworY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKIAogc3RydWN0IFZCUklTZWVrZXIgOiBwdWJsaWMgTVAzU2Vla2VyIHsKICAgICBzdGF0aWMgVkJSSVNlZWtlciAqQ3JlYXRlRnJvbVNvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3QgcG9zdF9pZDNfcG9zKTsKKyAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgb2ZmNjRfdCBwb3N0X2lkM19wb3MpOwogCiAgICAgdmlydHVhbCBib29sIGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpOwogICAgIHZpcnR1YWwgYm9vbCBnZXRPZmZzZXRGb3JUaW1lKGludDY0X3QgKnRpbWVVcywgb2ZmNjRfdCAqcG9zKTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5jcHAKaW5kZXggMDFlMDZjYS4uOWYxZmQ3YSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5jcHAKQEAgLTIxLDcgKzIxLDkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTc5LDcgKzgxLDcgQEAKIAogLy8gc3RhdGljCiBYSU5HU2Vla2VyICpYSU5HU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBvZmY2NF90IGZpcnN0X2ZyYW1lX3BvcykgeworICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zKSB7CiAKICAgICB1aW50OF90IGJ1ZmZlcls0XTsKICAgICBpbnQgb2Zmc2V0ID0gZmlyc3RfZnJhbWVfcG9zOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5oCmluZGV4IDU4NjdlYWUuLjlhY2VlMzggMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmgKQEAgLTIyLDExICsyMiwxMSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIERhdGFTb3VyY2VCYXNlOworY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKIAogc3RydWN0IFhJTkdTZWVrZXIgOiBwdWJsaWMgTVAzU2Vla2VyIHsKICAgICBzdGF0aWMgWElOR1NlZWtlciAqQ3JlYXRlRnJvbVNvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zKTsKKyAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgb2ZmNjRfdCBmaXJzdF9mcmFtZV9wb3MpOwogCiAgICAgdmlydHVhbCBib29sIGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpOwogICAgIHZpcnR1YWwgYm9vbCBnZXRPZmZzZXRGb3JUaW1lKGludDY0X3QgKnRpbWVVcywgb2ZmNjRfdCAqcG9zKTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FDNFBhcnNlci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BQzRQYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZDYwYzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BQzRQYXJzZXIuY3BwCkBAIC0wLDAgKzEsNjIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBQzRQYXJzZXIiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgIkFDNFBhcnNlci5oIgorCisjZGVmaW5lIEJPT0xTVFIoYSkgICgoYSk/InRydWUiOiJmYWxzZSIpCisjZGVmaW5lIEJZVEVfQUxJR04gbUJpdFJlYWRlci5za2lwQml0cyhtQml0UmVhZGVyLm51bUJpdHNMZWZ0KCkgJSA4KQorI2RlZmluZSBDSEVDS19CSVRTX0xFRlQobikgaWYgKG1CaXRSZWFkZXIubnVtQml0c0xlZnQoKSA8IG4pIHtyZXR1cm4gZmFsc2U7fQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0FDNFBhcnNlcjo6QUM0UGFyc2VyKCkgeworfQorCitBQzREU0lQYXJzZXI6OkFDNERTSVBhcnNlcihBQml0UmVhZGVyICZicikKKyAgICA6IG1CaXRSZWFkZXIoYnIpeworCisgICAgbURTSVNpemUgPSBtQml0UmVhZGVyLm51bUJpdHNMZWZ0KCk7Cit9CisKKy8vIEVUU0kgVFMgMTAzIDE5MC0yIFYxLjEuMSAoMjAxNS0wOSkgVGFibGUgNzk6IGNoYW5uZWxfbW9kZQorc3RhdGljIGNvbnN0IGNoYXIgKkNoYW5uZWxNb2Rlc1tdID0geworICAgICJtb25vIiwKKyAgICAic3RlcmVvIiwKKyAgICAiMy4wIiwKKyAgICAiNS4wIiwKKyAgICAiNS4xIiwKKyAgICAiNy4wICgzLzQvMCkiLAorICAgICI3LjEgKDMvNC8wLjEpIiwKKyAgICAiNy4wICg1LzIvMCkiLAorICAgICI3LjEgKDUvMi8wLjEpIiwKKyAgICAiNy4wICgzLzIvMikiLAorICAgICI3LjEgKDMvMi8yLjEpIiwKKyAgICAiNy4wLjQiLAorICAgICI3LjEuNCIsCisgICAgIjkuMC40IiwKKyAgICAiOS4xLjQiLAorICAgICIyMi4yIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIENvbnRlbnRDbGFzc2lmaWVyW10gPSB7CisgICAgIkNvbXBsZXRlIE1haW4iLAorICAgICJNdXNpYyBhbmQgRWZmZWN0cyIsCisgICAgIlZpc3VhbGx5IEltcGFpcmVkIiwKKyAgICAiSGVhcmluZyBJbXBhaXJlZCIsCisgICAgIkRpYWxvZyIsCisgICAgIkNvbW1lbnRhcnkiLAorICAgICJFbWVyZ2VuY3kiLAorICAgICJWb2ljZSBPdmVyIgorfTsKKworYm9vbCBBQzREU0lQYXJzZXI6OnBhcnNlTGFuZ3VhZ2VUYWcodWludDMyX3QgcHJlc2VudGF0aW9uSUQsIHVpbnQzMl90IHN1YnN0cmVhbUlEKXsKKyAgICBDSEVDS19CSVRTX0xFRlQoNik7CisgICAgdWludDMyX3Qgbl9sYW5ndWFnZV90YWdfYnl0ZXMgPSBtQml0UmVhZGVyLmdldEJpdHMoNik7CisgICAgaWYgKG5fbGFuZ3VhZ2VfdGFnX2J5dGVzIDwgMiB8fCBuX2xhbmd1YWdlX3RhZ19ieXRlcyA+PSA0MikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIENIRUNLX0JJVFNfTEVGVChuX2xhbmd1YWdlX3RhZ19ieXRlcyAqIDgpOworICAgIGNoYXIgbGFuZ3VhZ2VfdGFnX2J5dGVzWzQyXTsgLy8gVFMgMTAzIDE5MCBwYXJ0IDEgNC4zLjMuOC43CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5fbGFuZ3VhZ2VfdGFnX2J5dGVzOyBpKyspIHsKKyAgICAgICAgbGFuZ3VhZ2VfdGFnX2J5dGVzW2ldID0gKGNoYXIpbUJpdFJlYWRlci5nZXRCaXRzKDgpOworICAgIH0KKyAgICBsYW5ndWFnZV90YWdfYnl0ZXNbbl9sYW5ndWFnZV90YWdfYnl0ZXNdID0gMDsKKyAgICBBTE9HVigiJXUuJXU6IGxhbmd1YWdlX3RhZyA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsIGxhbmd1YWdlX3RhZ19ieXRlcyk7CisKKyAgICBzdGQ6OnN0cmluZyBsYW5ndWFnZShsYW5ndWFnZV90YWdfYnl0ZXMsIG5fbGFuZ3VhZ2VfdGFnX2J5dGVzKTsKKyAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25JRF0ubUxhbmd1YWdlID0gbGFuZ3VhZ2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVFMgMTAzIDE5MC0xIHYxLjIuMSBFLjUgYW5kIFRTIDEwMyAxOTAtMiB2MS4xLjEgRS45Citib29sIEFDNERTSVBhcnNlcjo6cGFyc2VTdWJzdHJlYW1EU0kodWludDMyX3QgcHJlc2VudGF0aW9uSUQsIHVpbnQzMl90IHN1YnN0cmVhbUlEKXsKKyAgICBDSEVDS19CSVRTX0xFRlQoNSk7CisgICAgdWludDMyX3QgY2hhbm5lbF9tb2RlID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgIENIRUNLX0JJVFNfTEVGVCgyKTsKKyAgICB1aW50MzJfdCBkc2lfc2ZfbXVsdGlwbGllciA9IG1CaXRSZWFkZXIuZ2V0Qml0cygyKTsKKyAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgYm9vbCBiX3N1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvciA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgQUxPR1YoIiV1LiV1OiBjaGFubmVsX21vZGUgPSAldSAoJXMpXG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsIGNoYW5uZWxfbW9kZSwKKyAgICBjaGFubmVsX21vZGUgPCBORUxFTShDaGFubmVsTW9kZXMpID8gQ2hhbm5lbE1vZGVzW2NoYW5uZWxfbW9kZV0gOiAicmVzZXJ2ZWQiKTsKKyAgICBBTE9HVigiJXUuJXU6IGRzaV9zZl9tdWx0aXBsaWVyID0gJXVcbiIsIHByZXNlbnRhdGlvbklELAorICAgICAgICBzdWJzdHJlYW1JRCwgZHNpX3NmX211bHRpcGxpZXIpOworICAgIEFMT0dWKCIldS4ldTogYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsCisgICAgICAgIHN1YnN0cmVhbUlELCBCT09MU1RSKGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yKSk7CisKKyAgICBpZiAoYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IpIHsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgICAgICB1aW50MzJfdCBzdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgIEFMT0dWKCIldS4ldTogc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gJXVcbiIsIHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCwKKyAgICAgICAgICAgIHN1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvcik7CisgICAgfQorICAgIGlmIChjaGFubmVsX21vZGUgPj0gNyAmJiBjaGFubmVsX21vZGUgPD0gMTApIHsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICB1aW50MzJfdCBhZGRfY2hfYmFzZSA9IG1CaXRSZWFkZXIuZ2V0Qml0cygxKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1OiBhZGRfY2hfYmFzZSA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsIGFkZF9jaF9iYXNlKTsKKyAgICB9CisgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgIGJvb2wgYl9jb250ZW50X3R5cGUgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgIEFMT0dWKCIldS4ldTogYl9jb250ZW50X3R5cGUgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlELCBCT09MU1RSKGJfY29udGVudF90eXBlKSk7CisgICAgaWYgKGJfY29udGVudF90eXBlKSB7CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgzKTsKKyAgICAgICAgdWludDMyX3QgY29udGVudF9jbGFzc2lmaWVyID0gbUJpdFJlYWRlci5nZXRCaXRzKDMpOworICAgICAgICBBTE9HVigiJXUuJXU6IGNvbnRlbnRfY2xhc3NpZmllciA9ICV1ICglcylcbiIsIHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCwKKyAgICAgICAgICAgIGNvbnRlbnRfY2xhc3NpZmllciwgQ29udGVudENsYXNzaWZpZXJbY29udGVudF9jbGFzc2lmaWVyXSk7CisKKyAgICAgICAgLy8gRm9yIHN0cmVhbXMgYmFzZWQgb24gVFMgMTAzIDE5MCBwYXJ0IDEgdGhlIHByZXNlbnRhdGlvbiBsZXZlbCBjaGFubmVsX21vZGUgZG9lc24ndAorICAgICAgICAvLyBleGlzdCBhbmQgc28gd2UgdXNlIHRoZSBjaGFubmVsX21vZGUgZnJvbSBlaXRoZXIgdGhlIENNIG9yIE0mRSBzdWJzdHJlYW0KKyAgICAgICAgLy8gKHRoZXkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSkKKyAgICAgICAgaWYgKG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbklEXS5tQ2hhbm5lbE1vZGUgPT0gLTEgJiYKKyAgICAgICAgICAgIChjb250ZW50X2NsYXNzaWZpZXIgPT0gMCB8fCBjb250ZW50X2NsYXNzaWZpZXIgPT0gMSkpIHsKKyAgICAgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbklEXS5tQ2hhbm5lbE1vZGUgPSBjaGFubmVsX21vZGU7CisgICAgICAgIH0KKyAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uSURdLm1Db250ZW50Q2xhc3NpZmllciA9IGNvbnRlbnRfY2xhc3NpZmllcjsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICBib29sIGJfbGFuZ3VhZ2VfaW5kaWNhdG9yID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1OiBiX2xhbmd1YWdlX2luZGljYXRvciA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsCisgICAgICAgICAgICBCT09MU1RSKGJfbGFuZ3VhZ2VfaW5kaWNhdG9yKSk7CisgICAgICAgIGlmIChiX2xhbmd1YWdlX2luZGljYXRvcikgeworICAgICAgICAgICAgaWYgKCFwYXJzZUxhbmd1YWdlVGFnKHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRVRTSSBUUyAxMDMgMTkwLTIgdjEuMS4xIHNlY3Rpb24gRS4xMQorYm9vbCBBQzREU0lQYXJzZXI6OnBhcnNlU3Vic3RyZWFtR3JvdXBEU0kodWludDMyX3QgcHJlc2VudGF0aW9uSUQsIHVpbnQzMl90IGdyb3VwSUQpCit7CisgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgIGJvb2wgYl9zdWJzdHJlYW1zX3ByZXNlbnQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICBib29sIGJfaHNmX2V4dCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgIGJvb2wgYl9jaGFubmVsX2NvZGVkID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICBDSEVDS19CSVRTX0xFRlQoOCk7CisgICAgdWludDMyX3Qgbl9zdWJzdHJlYW1zID0gbUJpdFJlYWRlci5nZXRCaXRzKDgpOworICAgIEFMT0dWKCIldS4ldTogYl9zdWJzdHJlYW1zX3ByZXNlbnQgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsCisgICAgICAgIEJPT0xTVFIoYl9zdWJzdHJlYW1zX3ByZXNlbnQpKTsKKyAgICBBTE9HVigiJXUuJXU6IGJfaHNmX2V4dCA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgQk9PTFNUUihiX2hzZl9leHQpKTsKKyAgICBBTE9HVigiJXUuJXU6IGJfY2hhbm5lbF9jb2RlZCA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgQk9PTFNUUihiX2NoYW5uZWxfY29kZWQpKTsKKyAgICBBTE9HVigiJXUuJXU6IG5fc3Vic3RyZWFtcyA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgbl9zdWJzdHJlYW1zKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuX3N1YnN0cmVhbXM7IGkrKykgeworICAgICAgICBDSEVDS19CSVRTX0xFRlQoMik7CisgICAgICAgIHVpbnQzMl90IGRzaV9zZl9tdWx0aXBsaWVyID0gbUJpdFJlYWRlci5nZXRCaXRzKDIpOworICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgIGJvb2wgYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICBBTE9HVigiJXUuJXUuJXU6IGRzaV9zZl9tdWx0aXBsaWVyID0gJXVcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLCBkc2lfc2ZfbXVsdGlwbGllcik7CisgICAgICAgIEFMT0dWKCIldS4ldS4ldTogYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksCisgICAgICAgICAgICBCT09MU1RSKGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yKSk7CisKKyAgICAgICAgaWYgKGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNSk7CisgICAgICAgICAgICB1aW50MzJfdCBzdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IHN1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvciA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwKKyAgICAgICAgICAgICAgICBzdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IpOworICAgICAgICB9CisgICAgICAgIGlmIChiX2NoYW5uZWxfY29kZWQpIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgyNCk7CisgICAgICAgICAgICB1aW50MzJfdCBkc2lfc3Vic3RyZWFtX2NoYW5uZWxfbWFzayA9IG1CaXRSZWFkZXIuZ2V0Qml0cygyNCk7CisgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IGRzaV9zdWJzdHJlYW1fY2hhbm5lbF9tYXNrID0gMHglMDZ4XG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwKKyAgICAgICAgICAgICAgICBkc2lfc3Vic3RyZWFtX2NoYW5uZWxfbWFzayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICBib29sIGJfYWpvYyA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IGJfYWpvYyA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwgQk9PTFNUUihiX2Fqb2MpKTsKKyAgICAgICAgICAgIGlmIChiX2Fqb2MpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICAgICAgYm9vbCBiX3N0YXRpY19kbXggPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgIEFMT0dWKCIldS4ldS4ldTogYl9zdGF0aWNfZG14ID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLAorICAgICAgICAgICAgICAgICAgICBCT09MU1RSKGJfc3RhdGljX2RteCkpOworICAgICAgICAgICAgICAgIGlmICghYl9zdGF0aWNfZG14KSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg0KTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbl9kbXhfb2JqZWN0c19taW51czEgPSBtQml0UmVhZGVyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldS4ldS4ldTogbl9kbXhfb2JqZWN0c19taW51czEgPSAldVxuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksCisgICAgICAgICAgICAgICAgICAgICAgICBuX2RteF9vYmplY3RzX21pbnVzMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg2KTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBuX3VteF9vYmplY3RzX21pbnVzMSA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg2KTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IG5fdW14X29iamVjdHNfbWludXMxID0gJXVcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLAorICAgICAgICAgICAgICAgICAgICBuX3VteF9vYmplY3RzX21pbnVzMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNCk7CisgICAgICAgICAgICBtQml0UmVhZGVyLnNraXBCaXRzKDQpOyAvLyBvYmplY3RzX2Fzc2lnbm1lbnRfbWFzaworICAgICAgICB9CisgICAgfQorCisgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgIGJvb2wgYl9jb250ZW50X3R5cGUgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgIEFMT0dWKCIldS4ldTogYl9jb250ZW50X3R5cGUgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIEJPT0xTVFIoYl9jb250ZW50X3R5cGUpKTsKKyAgICBpZiAoYl9jb250ZW50X3R5cGUpIHsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDMpOworICAgICAgICB1aW50MzJfdCBjb250ZW50X2NsYXNzaWZpZXIgPSBtQml0UmVhZGVyLmdldEJpdHMoMyk7CisgICAgICAgIEFMT0dWKCIldS4ldTogY29udGVudF9jbGFzc2lmaWVyID0gJXMgKCV1KVxuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsCisgICAgICAgICAgICBDb250ZW50Q2xhc3NpZmllcltjb250ZW50X2NsYXNzaWZpZXJdLCBjb250ZW50X2NsYXNzaWZpZXIpOworCisgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbklEXS5tQ29udGVudENsYXNzaWZpZXIgPSBjb250ZW50X2NsYXNzaWZpZXI7CisKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICBib29sIGJfbGFuZ3VhZ2VfaW5kaWNhdG9yID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1OiBiX2xhbmd1YWdlX2luZGljYXRvciA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwKKyAgICAgICAgICAgIEJPT0xTVFIoYl9sYW5ndWFnZV9pbmRpY2F0b3IpKTsKKworICAgICAgICBpZiAoYl9sYW5ndWFnZV9pbmRpY2F0b3IpIHsKKyAgICAgICAgICAgIGlmICghcGFyc2VMYW5ndWFnZVRhZyhwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBQzREU0lQYXJzZXI6OnBhcnNlQml0cmF0ZURzaSgpIHsKKyAgICBDSEVDS19CSVRTX0xFRlQoMiArIDMyICsgMzIpOworICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoMik7IC8vIGJpdF9yYXRlX21vZGUKKyAgICBtQml0UmVhZGVyLnNraXBCaXRzKDMyKTsgLy8gYml0X3JhdGUKKyAgICBtQml0UmVhZGVyLnNraXBCaXRzKDMyKTsgLy8gYml0X3JhdGVfcHJlY2lzaW9uCisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVFMgMTAzIDE5MC0xIHNlY3Rpb24gRS40IChhYzRfZHNpKSBhbmQgVFMgMTAzIDE5MC0yIHNlY3Rpb24gRS42IChhYzRfZHNpX3YxKQorYm9vbCBBQzREU0lQYXJzZXI6OnBhcnNlKCkgeworICAgIENIRUNLX0JJVFNfTEVGVCgzKTsKKyAgICB1aW50MzJfdCBhYzRfZHNpX3ZlcnNpb24gPSBtQml0UmVhZGVyLmdldEJpdHMoMyk7CisgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA+IDEpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIHdoaWxlIHBhcnNpbmcgYWMtNCBkc2k6IG9ubHkgdmVyc2lvbnMgMCBhbmQgMSBhcmUgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDSEVDS19CSVRTX0xFRlQoNyArIDEgKyA0ICsgOSk7CisgICAgdWludDMyX3QgYml0c3RyZWFtX3ZlcnNpb24gPSBtQml0UmVhZGVyLmdldEJpdHMoNyk7CisgICAgbUJpdFJlYWRlci5za2lwQml0cygxKTsgLy8gZnNfaW5kZXgKKyAgICBtQml0UmVhZGVyLnNraXBCaXRzKDQpOyAvLyBmcmFtZV9yYXRlX2luZGV4CisgICAgdWludDMyX3Qgbl9wcmVzZW50YXRpb25zID0gbUJpdFJlYWRlci5nZXRCaXRzKDkpOworCisgICAgaW50MzJfdCBzaG9ydF9wcm9ncmFtX2lkID0gLTE7CisgICAgaWYgKGJpdHN0cmVhbV92ZXJzaW9uID4gMSkgeworICAgICAgICBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIGFjNCBkc2kiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgIGJvb2wgYl9wcm9ncmFtX2lkID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgaWYgKGJfcHJvZ3JhbV9pZCkgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDE2ICsgMSk7CisgICAgICAgICAgICBzaG9ydF9wcm9ncmFtX2lkID0gbUJpdFJlYWRlci5nZXRCaXRzKDE2KTsKKyAgICAgICAgICAgIGJvb2wgYl91dWlkID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgIGlmIChiX3V1aWQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBrQUM0VVVJRFNpemVJbkJ5dGVzID0gMTY7CisgICAgICAgICAgICAgICAgY2hhciBwcm9ncmFtX3V1aWRba0FDNFVVSURTaXplSW5CeXRlc107CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKGtBQzRVVUlEU2l6ZUluQnl0ZXMgKiA4KTsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwga0FDNFVVSURTaXplSW5CeXRlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2dyYW1fdXVpZFtpXSA9IChjaGFyKShtQml0UmVhZGVyLmdldEJpdHMoOCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiVVVJRCA9ICVzIiwgcHJvZ3JhbV91dWlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPT0gMSkgeworICAgICAgICBpZiAoIXBhcnNlQml0cmF0ZURzaSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgQllURV9BTElHTjsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IHByZXNlbnRhdGlvbiA9IDA7IHByZXNlbnRhdGlvbiA8IG5fcHJlc2VudGF0aW9uczsgcHJlc2VudGF0aW9uKyspIHsKKyAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tUHJvZ3JhbUlEID0gc2hvcnRfcHJvZ3JhbV9pZDsKKyAgICAgICAgLy8ga25vd24gYXMgYl9zaW5nbGVfc3Vic3RyZWFtIGluIGFjNF9kc2lfdmVyc2lvbiAwCisgICAgICAgIGJvb2wgYl9zaW5nbGVfc3Vic3RyZWFtX2dyb3VwID0gZmFsc2U7CisgICAgICAgIHVpbnQzMl90IHByZXNlbnRhdGlvbl9jb25maWcgPSAwLCBwcmVzZW50YXRpb25fdmVyc2lvbiA9IDA7CisgICAgICAgIHVpbnQzMl90IHByZXNfYnl0ZXMgPSAwOworICAgICAgICB1aW50NjRfdCBzdGFydCA9IDA7CisKKyAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSArIDUgKyA1KTsKKyAgICAgICAgICAgIGJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICBwcmVzZW50YXRpb25fY29uZmlnID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgcHJlc2VudGF0aW9uX3ZlcnNpb24gPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgIH0gZWxzZSBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg4ICsgOCk7CisgICAgICAgICAgICBwcmVzZW50YXRpb25fdmVyc2lvbiA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgIHByZXNfYnl0ZXMgPSBtQml0UmVhZGVyLmdldEJpdHMoOCk7CisgICAgICAgICAgICBpZiAocHJlc19ieXRlcyA9PSAweGZmKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDE2KTsKKyAgICAgICAgICAgICAgICBwcmVzX2J5dGVzICs9IG1CaXRSZWFkZXIuZ2V0Qml0cygxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiJXU6IHByZXNfYnl0ZXMgPSAldVxuIiwgcHJlc2VudGF0aW9uLCBwcmVzX2J5dGVzKTsKKyAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA+IDIpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQocHJlc19ieXRlcyAqIDgpOworICAgICAgICAgICAgICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMocHJlc19ieXRlcyAqIDgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogcmVjb3JkIGEgbWFya2VyLCBsZXNzIHRoZSBzaXplIG9mIHRoZSBwcmVzZW50YXRpb25fY29uZmlnICovCisgICAgICAgICAgICBzdGFydCA9IChtRFNJU2l6ZSAtIG1CaXRSZWFkZXIubnVtQml0c0xlZnQoKSkgLyA4OworICAgICAgICAgICAgLy8gYWM0X3ByZXNlbnRhdGlvbl92MF9kc2koKSwgYWM0X3ByZXNlbnRhdGlvbl92MV9kc2koKSBhbmQgYWM0X3ByZXNlbnRhdGlvbl92Ml9kc2koKQorICAgICAgICAgICAgLy8gYWxsIHN0YXJ0IHdpdGggYSBwcmVzZW50YXRpb25fY29uZmlnIG9mIDUgYml0cworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgICAgICAgICAgcHJlc2VudGF0aW9uX2NvbmZpZyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgIGJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCA9IChwcmVzZW50YXRpb25fY29uZmlnID09IDB4MWYpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKlByZXNlbnRhdGlvbkNvbmZpZ1tdID0geworICAgICAgICAgICAgIk11c2ljJkVmZmVjdHMgKyBEaWFsb2ciLAorICAgICAgICAgICAgIk1haW4gKyBERSIsCisgICAgICAgICAgICAiTWFpbiArIEFzc29jaWF0ZSIsCisgICAgICAgICAgICAiTXVzaWMmRWZmZWN0cyArIERpYWxvZyArIEFzc29jaWF0ZSIsCisgICAgICAgICAgICAiTWFpbiArIERFICsgQXNzb2NpYXRlIiwKKyAgICAgICAgICAgICJBcmJpdHJhcnkgc3Vic3RyZWFtIGdyb3VwcyIsCisgICAgICAgICAgICAiRU1ERiBvbmx5IgorICAgICAgICB9OworICAgICAgICBBTE9HVigiJXU6IGJfc2luZ2xlX3N1YnN0cmVhbS9ncm91cCA9ICVzXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICBCT09MU1RSKGJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCkpOworICAgICAgICBBTE9HVigiJXU6IHByZXNlbnRhdGlvbl92ZXJzaW9uID0gJXVcbiIsIHByZXNlbnRhdGlvbiwgcHJlc2VudGF0aW9uX3ZlcnNpb24pOworICAgICAgICBBTE9HVigiJXU6IHByZXNlbnRhdGlvbl9jb25maWcgPSAldSAoJXMpXG4iLCBwcmVzZW50YXRpb24sIHByZXNlbnRhdGlvbl9jb25maWcsCisgICAgICAgICAgICAocHJlc2VudGF0aW9uX2NvbmZpZyA+PSBORUxFTShQcmVzZW50YXRpb25Db25maWcpID8KKyAgICAgICAgICAgICJyZXNlcnZlZCIgOiBQcmVzZW50YXRpb25Db25maWdbcHJlc2VudGF0aW9uX2NvbmZpZ10pKTsKKworICAgICAgICBib29sIGJfYWRkX2VtZGZfc3Vic3RyZWFtcyA9IGZhbHNlOworICAgICAgICBpZiAoIWJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCAmJiBwcmVzZW50YXRpb25fY29uZmlnID09IDYpIHsKKyAgICAgICAgICAgIGJfYWRkX2VtZGZfc3Vic3RyZWFtcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigiJXU6IGJfYWRkX2VtZGZfc3Vic3RyZWFtcyA9ICVzXG4iLCBwcmVzZW50YXRpb24sIEJPT0xTVFIoYl9hZGRfZW1kZl9zdWJzdHJlYW1zKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMyArIDEpOworICAgICAgICAgICAgdWludDMyX3QgbWRjb21wYXQgPSBtQml0UmVhZGVyLmdldEJpdHMoMyk7CisgICAgICAgICAgICBBTE9HVigiJXU6IG1kY29tcGF0ID0gJWRcbiIsIHByZXNlbnRhdGlvbiwgbWRjb21wYXQpOworCisgICAgICAgICAgICBib29sIGJfcHJlc2VudGF0aW9uX2dyb3VwX2luZGV4ID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgIEFMT0dWKCIldTogYl9wcmVzZW50YXRpb25fZ3JvdXBfaW5kZXggPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgIEJPT0xTVFIoYl9wcmVzZW50YXRpb25fZ3JvdXBfaW5kZXgpKTsKKyAgICAgICAgICAgIGlmIChiX3ByZXNlbnRhdGlvbl9ncm91cF9pbmRleCkgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1KTsKKyAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1Hcm91cEluZGV4ID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgICAgIEFMT0dWKCIldTogcHJlc2VudGF0aW9uX2dyb3VwX2luZGV4ID0gJWRcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tR3JvdXBJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMik7CisgICAgICAgICAgICB1aW50MzJfdCBkc2lfZnJhbWVfcmF0ZV9tdWx0aXBseV9pbmZvID0gbUJpdFJlYWRlci5nZXRCaXRzKDIpOworICAgICAgICAgICAgQUxPR1YoIiV1OiBkc2lfZnJhbWVfcmF0ZV9tdWx0aXBseV9pbmZvID0gJWRcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICBkc2lfZnJhbWVfcmF0ZV9tdWx0aXBseV9pbmZvKTsKKyAgICAgICAgICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPT0gMSAmJiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMSB8fCBwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAyKSkgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgyKTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBkc2lfZnJhbWVfcmF0ZV9mcmFjdGlvbl9pbmZvID0gbUJpdFJlYWRlci5nZXRCaXRzKDIpOworICAgICAgICAgICAgICAgIEFMT0dWKCIldTogZHNpX2ZyYW1lX3JhdGVfZnJhY3Rpb25faW5mbyA9ICVkXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgIGRzaV9mcmFtZV9yYXRlX2ZyYWN0aW9uX2luZm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUgKyAxMCk7CisgICAgICAgICAgICB1aW50MzJfdCBwcmVzZW50YXRpb25fZW1kZl92ZXJzaW9uID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgdWludDMyX3QgcHJlc2VudGF0aW9uX2tleV9pZCA9IG1CaXRSZWFkZXIuZ2V0Qml0cygxMCk7CisgICAgICAgICAgICBBTE9HVigiJXU6IHByZXNlbnRhdGlvbl9lbWRmX3ZlcnNpb24gPSAlZFxuIiwgcHJlc2VudGF0aW9uLCBwcmVzZW50YXRpb25fZW1kZl92ZXJzaW9uKTsKKyAgICAgICAgICAgIEFMT0dWKCIldTogcHJlc2VudGF0aW9uX2tleV9pZCA9ICVkXG4iLCBwcmVzZW50YXRpb24sIHByZXNlbnRhdGlvbl9rZXlfaWQpOworCisgICAgICAgICAgICBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgICAgICBib29sIGJfcHJlc2VudGF0aW9uX2NoYW5uZWxfY29kZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBiX3ByZXNlbnRhdGlvbl9jaGFubmVsX2NvZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICAgICAgICAgIGJfcHJlc2VudGF0aW9uX2NoYW5uZWxfY29kZWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGJfcHJlc2VudGF0aW9uX2NoYW5uZWxfY29kZWQgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICBCT09MU1RSKGJfcHJlc2VudGF0aW9uX2NoYW5uZWxfY29kZWQpKTsKKyAgICAgICAgICAgICAgICBpZiAoYl9wcmVzZW50YXRpb25fY2hhbm5lbF9jb2RlZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMSB8fCBwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc2lfcHJlc2VudGF0aW9uX2NoX21vZGUgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1DaGFubmVsTW9kZSA9IGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlID0gJWQgKCVzKVxuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc2lfcHJlc2VudGF0aW9uX2NoX21vZGUgPCBORUxFTShDaGFubmVsTW9kZXMpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsTW9kZXNbZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlXSA6ICJyZXNlcnZlZCIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlID49IDExICYmIGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZSA8PSAxNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxICsgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlc19iXzRfYmFja19jaGFubmVsc19wcmVzZW50ID0gbUJpdFJlYWRlci5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZXNfdG9wX2NoYW5uZWxfcGFpcnMgPSBtQml0UmVhZGVyLmdldEJpdHMoMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzX2JfNF9iYWNrX2NoYW5uZWxzX3ByZXNlbnQgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MU1RSKHByZXNfYl80X2JhY2tfY2hhbm5lbHNfcHJlc2VudCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogcHJlc190b3BfY2hhbm5lbF9wYWlycyA9ICVkXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNfdG9wX2NoYW5uZWxfcGFpcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIHByZXNlbnRhdGlvbl9jaGFubmVsX21hc2sgaW4gYWM0X3ByZXNlbnRhdGlvbl92MF9kc2koKQorICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMjQpOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVzZW50YXRpb25fY2hhbm5lbF9tYXNrX3YxID0gbUJpdFJlYWRlci5nZXRCaXRzKDI0KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzZW50YXRpb25fY2hhbm5lbF9tYXNrX3YxID0gMHglMDZ4XG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25fY2hhbm5lbF9tYXNrX3YxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDEgfHwgcHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMikgeworICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9wcmVzZW50YXRpb25fY29yZV9kaWZmZXJzID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBiX3ByZXNlbnRhdGlvbl9jb3JlX2RpZmZlcnMgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgQk9PTFNUUihiX3ByZXNlbnRhdGlvbl9jb3JlX2RpZmZlcnMpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJfcHJlc2VudGF0aW9uX2NvcmVfZGlmZmVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX3ByZXNlbnRhdGlvbl9jb3JlX2NoYW5uZWxfY29kZWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJfcHJlc2VudGF0aW9uX2NvcmVfY2hhbm5lbF9jb2RlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQml0UmVhZGVyLnNraXBCaXRzKDIpOyAvLyBkc2lfcHJlc2VudGF0aW9uX2NoYW5uZWxfbW9kZV9jb3JlCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICBib29sIGJfcHJlc2VudGF0aW9uX2ZpbHRlciA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9wcmVzZW50YXRpb25fZmlsdGVyID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xTVFIoYl9wcmVzZW50YXRpb25fZmlsdGVyKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChiX3ByZXNlbnRhdGlvbl9maWx0ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxICsgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZW5hYmxlX3ByZXNlbnRhdGlvbiA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJfZW5hYmxlX3ByZXNlbnRhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbl0ubUVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9lbmFibGVfcHJlc2VudGF0aW9uID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MU1RSKGJfZW5hYmxlX3ByZXNlbnRhdGlvbikpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbl9maWx0ZXJfYnl0ZXMgPSBtQml0UmVhZGVyLmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQobl9maWx0ZXJfYnl0ZXMgKiA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuX2ZpbHRlcl9ieXRlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cyg4KTsgLy8gZmlsdGVyX2RhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLyogYWM0X2RzaV92ZXJzaW9uID09IDEgKi8KKworICAgICAgICAgICAgaWYgKGJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCkgeworICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1EU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiX211bHRpX3BpZCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9tdWx0aV9waWQgPSAlc1xuIiwgcHJlc2VudGF0aW9uLCBCT09MU1RSKGJfbXVsdGlfcGlkKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICBib29sIGJfaHNmX2V4dCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9oc2ZfZXh0ID0gJXNcbiIsIHByZXNlbnRhdGlvbiwgQk9PTFNUUihiX2hzZl9leHQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoIChwcmVzZW50YXRpb25fY29uZmlnKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtR3JvdXBEU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtR3JvdXBEU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHByZXNlbnRhdGlvbiwgMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbURTSShwcmVzZW50YXRpb24sIDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbl9zdWJzdHJlYW1fZ3JvdXBzX21pbnVzMiA9IG1CaXRSZWFkZXIuZ2V0Qml0cygzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogbl9zdWJzdHJlYW1fZ3JvdXBzX21pbnVzMiA9ICVkXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9zdWJzdHJlYW1fZ3JvdXBzX21pbnVzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHNnID0gMDsgc2cgPCBuX3N1YnN0cmVhbV9ncm91cHNfbWludXMyICsgMjsgc2crKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIHNnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg3KTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbl9za2lwX2J5dGVzID0gbUJpdFJlYWRlci5nZXRCaXRzKDcpOworICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQobl9za2lwX2J5dGVzICogOCkKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IG5fc2tpcF9ieXRlczsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQml0UmVhZGVyLmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEgKyAxKTsKKyAgICAgICAgICAgIGJvb2wgYl9wcmVfdmlydHVhbGl6ZWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tUHJlVmlydHVhbGl6ZWQgPSBiX3ByZV92aXJ0dWFsaXplZDsKKyAgICAgICAgICAgIGJfYWRkX2VtZGZfc3Vic3RyZWFtcyA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICBBTE9HVigiJXU6IGJfcHJlX3ZpcnR1YWxpemVkID0gJXNcbiIsIHByZXNlbnRhdGlvbiwgQk9PTFNUUihiX3ByZV92aXJ0dWFsaXplZCkpOworICAgICAgICAgICAgQUxPR1YoIiV1OiBiX2FkZF9lbWRmX3N1YnN0cmVhbXMgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgIEJPT0xTVFIoYl9hZGRfZW1kZl9zdWJzdHJlYW1zKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJfYWRkX2VtZGZfc3Vic3RyZWFtcykgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDcpOworICAgICAgICAgICAgdWludDMyX3Qgbl9hZGRfZW1kZl9zdWJzdHJlYW1zID0gbUJpdFJlYWRlci5nZXRCaXRzKDcpOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IG5fYWRkX2VtZGZfc3Vic3RyZWFtczsgaisrKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUgKyAxMCk7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc3Vic3RyZWFtX2VtZGZfdmVyc2lvbiA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzdWJzdHJlYW1fa2V5X2lkID0gbUJpdFJlYWRlci5nZXRCaXRzKDEwKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGVtZGZfc3Vic3RyZWFtWyVkXTogdmVyc2lvbj0lZCwga2V5X2lkPSVkXG4iLCBwcmVzZW50YXRpb24sIGosCisgICAgICAgICAgICAgICAgICAgIHN1YnN0cmVhbV9lbWRmX3ZlcnNpb24sIHN1YnN0cmVhbV9rZXlfaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYm9vbCBiX3ByZXNlbnRhdGlvbl9iaXRyYXRlX2luZm8gPSBmYWxzZTsKKyAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID4gMCkgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgYl9wcmVzZW50YXRpb25fYml0cmF0ZV9pbmZvID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJiX3ByZXNlbnRhdGlvbl9iaXRyYXRlX2luZm8gPSAlc1xuIiwgQk9PTFNUUihiX3ByZXNlbnRhdGlvbl9iaXRyYXRlX2luZm8pKTsKKyAgICAgICAgaWYgKGJfcHJlc2VudGF0aW9uX2JpdHJhdGVfaW5mbykgeworICAgICAgICAgICAgaWYgKCFwYXJzZUJpdHJhdGVEc2koKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA+IDApIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgIGJvb2wgYl9hbHRlcm5hdGl2ZSA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICBBTE9HVigiYl9hbHRlcm5hdGl2ZSA9ICVzXG4iLCBCT09MU1RSKGJfYWx0ZXJuYXRpdmUpKTsKKyAgICAgICAgICAgIGlmIChiX2FsdGVybmF0aXZlKSB7CisgICAgICAgICAgICAgICAgQllURV9BTElHTjsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMTYpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IG5hbWVfbGVuID0gbUJpdFJlYWRlci5nZXRCaXRzKDE2KTsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQobmFtZV9sZW4gKiA4KTsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmcHJlc2VudGF0aW9uX25hbWUgPQorICAgICAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1EZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25fbmFtZS5jbGVhcigpOworICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbl9uYW1lLnJlc2l6ZShuYW1lX2xlbik7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5hbWVfbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uX25hbWVbaV0gPSAoY2hhcikobUJpdFJlYWRlci5nZXRCaXRzKDgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IG5fdGFyZ2V0cyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQobl90YXJnZXRzICogKDMgKyA4KSk7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5fdGFyZ2V0czsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cygzKTsgLy8gdGFyZ2V0X21kX2NvbXBhdAorICAgICAgICAgICAgICAgICAgICBtQml0UmVhZGVyLnNraXBCaXRzKDgpOyAvLyB0YXJnZXRfZGV2aWNlX2NhdGVnb3J5CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQllURV9BTElHTjsKKworICAgICAgICBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IGVuZCA9IChtRFNJU2l6ZSAtIG1CaXRSZWFkZXIubnVtQml0c0xlZnQoKSkgLyA4OworICAgICAgICAgICAgdWludDY0X3QgcHJlc2VudGF0aW9uX2J5dGVzID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICB1aW50NjRfdCBza2lwX2J5dGVzID0gcHJlc19ieXRlcyAtIHByZXNlbnRhdGlvbl9ieXRlczsKKyAgICAgICAgICAgIEFMT0dWKCJza2lwcGluZyA9ICUiIFBSSXU2NCAiIGJ5dGVzIiwgc2tpcF9ieXRlcyk7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoc2tpcF9ieXRlcyAqIDgpOworICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cyhza2lwX2J5dGVzICogOCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB3ZSBzaG91bGQga25vdyB0aGlzIG9yIHNvbWV0aGluZyBpcyBwcm9iYWJseSB3cm9uZworICAgICAgICAvLyB3aXRoIHRoZSBiaXRzdHJlYW0gKG9yIHdlIGRvbid0IHN1cHBvcnQgaXQpCisgICAgICAgIGlmIChtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1DaGFubmVsTW9kZSA9PSAtMSkgeworICAgICAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBkZXRlcm1pbmcgY2hhbm5lbCBtb2RlIG9mIHByZXNlbnRhdGlvbiAlZCIsIHByZXNlbnRhdGlvbik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IC8qIGVhY2ggcHJlc2VudGF0aW9uICovCisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FDNFBhcnNlci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQUM0UGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiNmUzMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FDNFBhcnNlci5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBQzRfUEFSU0VSX0hfCisjZGVmaW5lIEFDNF9QQVJTRVJfSF8KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEFDNFBhcnNlciB7CitwdWJsaWM6CisgICAgQUM0UGFyc2VyKCk7CisgICAgdmlydHVhbCB+QUM0UGFyc2VyKCkgeyB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcGFyc2UoKSA9IDA7CisKKyAgICBzdHJ1Y3QgQUM0UHJlc2VudGF0aW9uIHsKKyAgICAgICAgaW50MzJfdCBtQ2hhbm5lbE1vZGUgPSAtMTsKKyAgICAgICAgaW50MzJfdCBtUHJvZ3JhbUlEID0gLTE7CisgICAgICAgIGludDMyX3QgbUdyb3VwSW5kZXggPSAtMTsKKworICAgICAgICAvLyBUUyAxMDMgMTkwLTEgdjEuMi4xIDQuMy4zLjguMQorICAgICAgICBlbnVtIENvbnRlbnRDbGFzc2lmaWVycyB7CisgICAgICAgICAgICBrQ29tcGxldGVNYWluLAorICAgICAgICAgICAga011c2ljQW5kRWZmZWN0cywKKyAgICAgICAgICAgIGtWaXN1YWxseUltcGFpcmVkLAorICAgICAgICAgICAga0hlYXJpbmdJbXBhaXJlZCwKKyAgICAgICAgICAgIGtEaWFsb2csCisgICAgICAgICAgICBrQ29tbWVudGFyeSwKKyAgICAgICAgICAgIGtFbWVyZ2VuY3ksCisgICAgICAgICAgICBrVm9pY2VPdmVyCisgICAgICAgIH07CisKKyAgICAgICAgdWludDMyX3QgbUNvbnRlbnRDbGFzc2lmaWVyID0ga0NvbXBsZXRlTWFpbjsKKworICAgICAgICAvLyBFVFNJIFRTIDEwMyAxOTAtMiBWMS4xLjEgKDIwMTUtMDkpIFRhYmxlIDc5OiBjaGFubmVsX21vZGUKKyAgICAgICAgZW51bSBJbnB1dENoYW5uZWxNb2RlIHsKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV9Nb25vLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlX1N0ZXJlbywKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV8zXzAsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfNV8wLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzVfMSwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzBfMzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18xXzM0LAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMF81MiwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzFfNTIsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18wXzMyMiwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzFfMzIyLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMF80LAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMV80LAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzlfMF80LAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzlfMV80LAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzIyXzIsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfUmVzZXJ2ZWQsCisgICAgICAgIH07CisKKyAgICAgICAgYm9vbCBtSGFzRGlhbG9nRW5oYW5jZW1lbnRzID0gZmFsc2U7CisgICAgICAgIGJvb2wgbVByZVZpcnR1YWxpemVkID0gZmFsc2U7CisgICAgICAgIGJvb2wgbUVuYWJsZWQgPSB0cnVlOworCisgICAgICAgIHN0ZDo6c3RyaW5nIG1MYW5ndWFnZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbURlc2NyaXB0aW9uOworICAgIH07CisgICAgdHlwZWRlZiBzdGQ6Om1hcDx1aW50MzJfdCwgQUM0UHJlc2VudGF0aW9uPiBBQzRQcmVzZW50YXRpb25zOworCisgICAgY29uc3QgQUM0UHJlc2VudGF0aW9ucyYgZ2V0UHJlc2VudGF0aW9ucygpIGNvbnN0IHsgcmV0dXJuIG1QcmVzZW50YXRpb25zOyB9CisKK3Byb3RlY3RlZDoKKyAgICBBQzRQcmVzZW50YXRpb25zIG1QcmVzZW50YXRpb25zOworfTsKKworY2xhc3MgQUM0RFNJUGFyc2VyOiBwdWJsaWMgQUM0UGFyc2VyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBBQzREU0lQYXJzZXIoQUJpdFJlYWRlciAmYnIpOworICAgIHZpcnR1YWwgfkFDNERTSVBhcnNlcigpIHsgfQorCisgICAgYm9vbCBwYXJzZSgpOworCitwcml2YXRlOgorICAgIGJvb2wgcGFyc2VTdWJzdHJlYW1EU0kodWludDMyX3QgcHJlc2VudGF0aW9uSUQsIHVpbnQzMl90IHN1YnN0cmVhbUlEKTsKKyAgICBib29sIHBhcnNlU3Vic3RyZWFtR3JvdXBEU0kodWludDMyX3QgcHJlc2VudGF0aW9uSUQsIHVpbnQzMl90IGdyb3VwSUQpOworICAgIGJvb2wgcGFyc2VMYW5ndWFnZVRhZyh1aW50MzJfdCBwcmVzZW50YXRpb25JRCwgdWludDMyX3Qgc3Vic3RyZWFtSUQpOworICAgIGJvb2wgcGFyc2VCaXRyYXRlRHNpKCk7CisKKyAgICB1aW50NjRfdCBtRFNJU2l6ZTsKKyAgICBBQml0UmVhZGVyJiBtQml0UmVhZGVyOworfTsKKworfTsKKworI2VuZGlmICAvLyBBQzRfUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icAppbmRleCBmMzE2ZGY2Li4xYjMwOGFhIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAKQEAgLTIsNiArMiw3IEBACiAgICAgbmFtZTogImxpYm1wNGV4dHJhY3Rvcl9kZWZhdWx0cyIsCiAKICAgICBzcmNzOiBbCisgICAgICAgICJBQzRQYXJzZXIuY3BwIiwKICAgICAgICAgIkl0ZW1UYWJsZS5jcHAiLAogICAgICAgICAiTVBFRzRFeHRyYWN0b3IuY3BwIiwKICAgICAgICAgIlNhbXBsZUl0ZXJhdG9yLmNwcCIsCkBAIC0xNCw3ICsxNSw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIgogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5jcHAKaW5kZXggYTQ2MmRlOS4uZDU2YWJhYSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwCkBAIC0xNyw4ICsxNywxMSBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJJdGVtVGFibGUiCiAKKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCiAjaW5jbHVkZSA8SXRlbVRhYmxlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgpAQCAtOTIsNyArOTUsNyBAQAogCiBzdHJ1Y3QgQm94IHsKIHByb3RlY3RlZDoKLSAgICBCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdWludDMyX3QgdHlwZSkgOgorICAgIEJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIHVpbnQzMl90IHR5cGUpIDoKICAgICAgICAgbURhdGFTb3VyY2Uoc291cmNlKSwgbVR5cGUodHlwZSkge30KIAogICAgIHZpcnR1YWwgfkJveCgpIHt9CkBAIC0xMDQsMTQgKzEwNywxNCBAQAogCiAgICAgaW5saW5lIHVpbnQzMl90IHR5cGUoKSBjb25zdCB7IHJldHVybiBtVHlwZTsgfQogCi0gICAgaW5saW5lIERhdGFTb3VyY2VCYXNlICpzb3VyY2UoKSBjb25zdCB7IHJldHVybiBtRGF0YVNvdXJjZTsgfQorICAgIGlubGluZSBEYXRhU291cmNlSGVscGVyICpzb3VyY2UoKSBjb25zdCB7IHJldHVybiBtRGF0YVNvdXJjZTsgfQogCiAgICAgc3RhdHVzX3QgcGFyc2VDaHVuayhvZmY2NF90ICpvZmZzZXQpOwogCiAgICAgc3RhdHVzX3QgcGFyc2VDaHVua3Mob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgdWludDMyX3QgbVR5cGU7CiB9OwogCkBAIC0xODYsNyArMTg5LDcgQEAKIAogc3RydWN0IEZ1bGxCb3ggOiBwdWJsaWMgQm94IHsKIHByb3RlY3RlZDoKLSAgICBGdWxsQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIHVpbnQzMl90IHR5cGUpIDoKKyAgICBGdWxsQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgdWludDMyX3QgdHlwZSkgOgogICAgICAgICBCb3goc291cmNlLCB0eXBlKSwgbVZlcnNpb24oMCksIG1GbGFncygwKSB7fQogCiAgICAgaW5saW5lIHVpbnQ4X3QgdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1WZXJzaW9uOyB9CkBAIC0yMjEsNyArMjI0LDcgQEAKIC8vCiAKIHN0cnVjdCBQaXRtQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIFBpdG1Cb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgOgorICAgIFBpdG1Cb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKSA6CiAgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoInBpdG0iKSkge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdWludDMyX3QgKnByaW1hcnlJdGVtSWQpOwpAQCAtMzAxLDcgKzMwNCw3IEBACiB9OwogCiBzdHJ1Y3QgSWxvY0JveCA6IHB1YmxpYyBGdWxsQm94IHsKLSAgICBJbG9jQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJdGVtTG9jPiAqaXRlbUxvY3MpIDoKKyAgICBJbG9jQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEl0ZW1Mb2M+ICppdGVtTG9jcykgOgogICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCJpbG9jIikpLAogICAgICAgICBtSXRlbUxvY3MoaXRlbUxvY3MpLCBtSGFzQ29uc3RydWN0TWV0aG9kMShmYWxzZSkge30KIApAQCAtNDcxLDcgKzQ3NCw3IEBACiAvLwogCiBzdHJ1Y3QgSXRlbVJlZmVyZW5jZSA6IHB1YmxpYyBCb3gsIHB1YmxpYyBSZWZCYXNlIHsKLSAgICBJdGVtUmVmZXJlbmNlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IGl0ZW1JZFNpemUpIDoKKyAgICBJdGVtUmVmZXJlbmNlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgdWludDMyX3QgdHlwZSwgdWludDMyX3QgaXRlbUlkU2l6ZSkgOgogICAgICAgICBCb3goc291cmNlLCB0eXBlKSwgbUl0ZW1JZCgwKSwgbVJlZklkU2l6ZShpdGVtSWRTaXplKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKQEAgLTYyNiw3ICs2MjksNyBAQAogfQogCiBzdHJ1Y3QgSXJlZkJveCA6IHB1YmxpYyBGdWxsQm94IHsKLSAgICBJcmVmQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIFZlY3RvcjxzcDxJdGVtUmVmZXJlbmNlPiA+ICppdGVtUmVmcykgOgorICAgIElyZWZCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBWZWN0b3I8c3A8SXRlbVJlZmVyZW5jZT4gPiAqaXRlbVJlZnMpIDoKICAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygiaXJlZiIpKSwgbVJlZklkU2l6ZSgwKSwgbUl0ZW1SZWZzKGl0ZW1SZWZzKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKQEAgLTY4OCw3ICs2OTEsNyBAQAogfTsKIAogc3RydWN0IElzcGVCb3ggOiBwdWJsaWMgRnVsbEJveCwgcHVibGljIEl0ZW1Qcm9wZXJ0eSB7Ci0gICAgSXNwZUJveChEYXRhU291cmNlQmFzZSAqc291cmNlKSA6CisgICAgSXNwZUJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UpIDoKICAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygiaXNwZSIpKSwgbVdpZHRoKDApLCBtSGVpZ2h0KDApIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwpAQCAtNzI0LDcgKzcyNyw3IEBACiB9CiAKIHN0cnVjdCBIdmNjQm94IDogcHVibGljIEJveCwgcHVibGljIEl0ZW1Qcm9wZXJ0eSB7Ci0gICAgSHZjY0JveChEYXRhU291cmNlQmFzZSAqc291cmNlKSA6CisgICAgSHZjY0JveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UpIDoKICAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCJodmNDIikpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwpAQCAtNzU3LDcgKzc2MCw3IEBACiB9CiAKIHN0cnVjdCBJcm90Qm94IDogcHVibGljIEJveCwgcHVibGljIEl0ZW1Qcm9wZXJ0eSB7Ci0gICAgSXJvdEJveChEYXRhU291cmNlQmFzZSAqc291cmNlKSA6CisgICAgSXJvdEJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UpIDoKICAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCJpcm90IikpLCBtQW5nbGUoMCkge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CkBAIC03ODYsNyArNzg5LDcgQEAKIH0KIAogc3RydWN0IENvbHJCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKLSAgICBDb2xyQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICBDb2xyQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgogICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoImNvbHIiKSkge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CkBAIC04MzQsNyArODM3LDcgQEAKIH0KIAogc3RydWN0IElwbWFCb3ggOiBwdWJsaWMgRnVsbEJveCB7Ci0gICAgSXBtYUJveChEYXRhU291cmNlQmFzZSAqc291cmNlLCBWZWN0b3I8QXNzb2NpYXRpb25FbnRyeT4gKmFzc29jaWF0aW9ucykgOgorICAgIElwbWFCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBWZWN0b3I8QXNzb2NpYXRpb25FbnRyeT4gKmFzc29jaWF0aW9ucykgOgogICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCJpcG1hIikpLCBtQXNzb2NpYXRpb25zKGFzc29jaWF0aW9ucykge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CkBAIC05MDgsNyArOTExLDcgQEAKIH0KIAogc3RydWN0IElwY29Cb3ggOiBwdWJsaWMgQm94IHsKLSAgICBJcGNvQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIFZlY3RvcjxzcDxJdGVtUHJvcGVydHk+ID4gKnByb3BlcnRpZXMpIDoKKyAgICBJcGNvQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgVmVjdG9yPHNwPEl0ZW1Qcm9wZXJ0eT4gPiAqcHJvcGVydGllcykgOgogICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoImlwY28iKSksIG1JdGVtUHJvcGVydGllcyhwcm9wZXJ0aWVzKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKQEAgLTk2NSw3ICs5NjgsNyBAQAogfQogCiBzdHJ1Y3QgSXBycEJveCA6IHB1YmxpYyBCb3ggewotICAgIElwcnBCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICBJcHJwQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwKICAgICAgICAgICAgIFZlY3RvcjxzcDxJdGVtUHJvcGVydHk+ID4gKnByb3BlcnRpZXMsCiAgICAgICAgICAgICBWZWN0b3I8QXNzb2NpYXRpb25FbnRyeT4gKmFzc29jaWF0aW9ucykgOgogICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoImlwcnAiKSksCkBAIC0xMDIyLDcgKzEwMjUsNyBAQAogfTsKIAogc3RydWN0IEluZmVCb3ggOiBwdWJsaWMgRnVsbEJveCB7Ci0gICAgSW5mZUJveChEYXRhU291cmNlQmFzZSAqc291cmNlKSA6CisgICAgSW5mZUJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UpIDoKICAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygiaW5mZSIpKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBJdGVtSW5mbyAqaXRlbUluZm8pOwpAQCAtMTEyNywyMCArMTEzMCwxOSBAQAogfQogCiBzdHJ1Y3QgSWluZkJveCA6IHB1YmxpYyBGdWxsQm94IHsKLSAgICBJaW5mQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIFZlY3RvcjxJdGVtSW5mbz4gKml0ZW1JbmZvcykgOgotICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCJpaW5mIikpLAotICAgICAgICBtSXRlbUluZm9zKGl0ZW1JbmZvcyksIG1IYXNHcmlkcyhmYWxzZSkge30KKyAgICBJaW5mQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgVmVjdG9yPEl0ZW1JbmZvPiAqaXRlbUluZm9zKSA6CisgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoImlpbmYiKSksIG1JdGVtSW5mb3MoaXRlbUluZm9zKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKIAotICAgIGJvb2wgaGFzR3JpZHMoKSB7IHJldHVybiBtSGFzR3JpZHM7IH0KKyAgICBib29sIGhhc0ZvdXJDQyh1aW50MzJfdCB0eXBlKSB7IHJldHVybiBtRm91ckNDU2Vlbi5jb3VudCh0eXBlKSA+IDA7IH0KIAogcHJvdGVjdGVkOgogICAgIHN0YXR1c190IG9uQ2h1bmtEYXRhKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAgICAgVmVjdG9yPEl0ZW1JbmZvPiAqbUl0ZW1JbmZvczsKLSAgICBib29sIG1IYXNHcmlkczsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDMyX3Q+IG1Gb3VyQ0NTZWVuOwogfTsKIAogc3RhdHVzX3QgSWluZkJveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CkBAIC0xMTg3LDcgKzExODksNyBAQAogICAgIHN0YXR1c190IGVyciA9IGluZmVCb3gucGFyc2Uob2Zmc2V0LCBzaXplLCAmaXRlbUluZm8pOwogICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgbUl0ZW1JbmZvcy0+cHVzaF9iYWNrKGl0ZW1JbmZvKTsKLSAgICAgICAgbUhhc0dyaWRzIHw9IChpdGVtSW5mby5pdGVtVHlwZSA9PSBGT1VSQ0MoImdyaWQiKSk7CisgICAgICAgIG1Gb3VyQ0NTZWVuLmluc2VydChpdGVtSW5mby5pdGVtVHlwZSk7CiAgICAgfQogICAgIC8vIEluZmVCb3ggcGFyc2UgcmV0dXJucyBFUlJPUl9VTlNVUFBPUlRFRCBpZiB0aGUgYm94IGlmIGFuIHVuc3VwcG9ydGVkCiAgICAgLy8gdmVyc2lvbi4gSWdub3JlIHRoaXMgZXJyb3IgYXMgaXQncyBub3QgZmF0YWwuCkBAIC0xMTk2LDcgKzExOTgsNyBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotSXRlbVRhYmxlOjpJdGVtVGFibGUoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK0l0ZW1UYWJsZTo6SXRlbVRhYmxlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtUHJpbWFyeUl0ZW1JZCgwKSwKICAgICAgIG1JZGF0T2Zmc2V0KDApLApAQCAtMTI3Niw3ICsxMjc4LDcgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICBpZiAoaWluZkJveC5oYXNHcmlkcygpKSB7CisgICAgaWYgKGlpbmZCb3guaGFzRm91ckNDKEZPVVJDQygiZ3JpZCIpKSB8fCBpaW5mQm94Lmhhc0ZvdXJDQyhGT1VSQ0MoIkV4aWYiKSkpIHsKICAgICAgICAgbVJlcXVpcmVkQm94ZXMuaW5zZXJ0KCdpcmVmJyk7CiAgICAgfQogCkBAIC0xNDc2LDcgKzE0NzgsNyBAQAogICAgIHJldHVybiBtSW1hZ2VJdGVtc1ZhbGlkID8gbURpc3BsYXlhYmxlcy5zaXplKCkgOiAwOwogfQogCi1zcDxNZXRhRGF0YT4gSXRlbVRhYmxlOjpnZXRJbWFnZU1ldGEoY29uc3QgdWludDMyX3QgaW1hZ2VJbmRleCkgeworQU1lZGlhRm9ybWF0ICpJdGVtVGFibGU6OmdldEltYWdlTWV0YShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4KSB7CiAgICAgaWYgKCFtSW1hZ2VJdGVtc1ZhbGlkKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTE1MDEsNjQgKzE1MDMsODAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKTsKIAogICAgIGlmIChpbWFnZS0+aXRlbUlkID09IG1QcmltYXJ5SXRlbUlkKSB7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUcmFja0lzRGVmYXVsdCwgMSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX0RFRkFVTFQsIDEpOwogICAgIH0KIAogICAgIEFMT0dWKCJpbWFnZVsldV06IHNpemUgJWR4JWQiLCBpbWFnZUluZGV4LCBpbWFnZS0+d2lkdGgsIGltYWdlLT5oZWlnaHQpOwogCi0gICAgbWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBpbWFnZS0+d2lkdGgpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGltYWdlLT5oZWlnaHQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCBpbWFnZS0+d2lkdGgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgaW1hZ2UtPmhlaWdodCk7CiAgICAgaWYgKGltYWdlLT5yb3RhdGlvbiAhPSAwKSB7CiAgICAgICAgIC8vIFJvdGF0aW9uIGFuZ2xlIGluIEhFSUYgaXMgQ0NXLCBjb252ZXJ0IHRvIENXIGhlcmUgdG8gYmUKICAgICAgICAgLy8gY29uc2lzdGVudCB3aXRoIHRoZSBvdGhlciBtZWRpYSBmb3JtYXRzLgogICAgICAgICBzd2l0Y2goaW1hZ2UtPnJvdGF0aW9uKSB7Ci0gICAgICAgICAgICBjYXNlIDkwOiBtZXRhLT5zZXRJbnQzMihrS2V5Um90YXRpb24sIDI3MCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxODA6IG1ldGEtPnNldEludDMyKGtLZXlSb3RhdGlvbiwgMTgwKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI3MDogbWV0YS0+c2V0SW50MzIoa0tleVJvdGF0aW9uLCA5MCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA5MDoKKyAgICAgICAgICAgIGNhc2UgMTgwOgorICAgICAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfUk9UQVRJT04sIDM2MCAtIGltYWdlLT5yb3RhdGlvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OiBicmVhazsgLy8gZG9uJ3Qgc2V0IGlmIGludmFsaWQKICAgICAgICAgfQogICAgIH0KLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBpbWFnZS0+d2lkdGggKiBpbWFnZS0+aGVpZ2h0ICogMS41KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQgKiAxLjUpOwogCiAgICAgaWYgKCFpbWFnZS0+dGh1bWJuYWlscy5lbXB0eSgpKSB7CiAgICAgICAgIHNzaXplX3QgdGh1bWJJdGVtSW5kZXggPSBtSXRlbUlkVG9JdGVtTWFwLmluZGV4T2ZLZXkoaW1hZ2UtPnRodW1ibmFpbHNbMF0pOwogICAgICAgICBpZiAodGh1bWJJdGVtSW5kZXggPj0gMCkgewogICAgICAgICAgICAgY29uc3QgSW1hZ2VJdGVtICZ0aHVtYm5haWwgPSBtSXRlbUlkVG9JdGVtTWFwW3RodW1iSXRlbUluZGV4XTsKIAotICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRodW1ibmFpbFdpZHRoLCB0aHVtYm5haWwud2lkdGgpOwotICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRodW1ibmFpbEhlaWdodCwgdGh1bWJuYWlsLmhlaWdodCk7Ci0gICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlUaHVtYm5haWxIVkNDLCBrVHlwZUhWQ0MsCi0gICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbC5odmNjLT5kYXRhKCksIHRodW1ibmFpbC5odmNjLT5zaXplKCkpOwotICAgICAgICAgICAgQUxPR1YoImltYWdlWyV1XTogdGh1bWJuYWlsOiBzaXplICVkeCVkLCBpdGVtIGluZGV4ICV6ZCIsCi0gICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgsIHRodW1ibmFpbC53aWR0aCwgdGh1bWJuYWlsLmhlaWdodCwgdGh1bWJJdGVtSW5kZXgpOworICAgICAgICAgICAgaWYgKHRodW1ibmFpbC5odmNjICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1dJRFRILCB0aHVtYm5haWwud2lkdGgpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfSEVJR0hULCB0aHVtYm5haWwuaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9DU0RfSEVWQywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbC5odmNjLT5kYXRhKCksIHRodW1ibmFpbC5odmNjLT5zaXplKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCJpbWFnZVsldV06IHRodW1ibmFpbDogc2l6ZSAlZHglZCwgaXRlbSBpbmRleCAlemQiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCwgdGh1bWJuYWlsLndpZHRoLCB0aHVtYm5haWwuaGVpZ2h0LCB0aHVtYkl0ZW1JbmRleCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogdGh1bWJuYWlsIGRhdGEgaXMgbWlzc2luZyBmb3IgaW1hZ2VbJXVdISIsIF9fRlVOQ1RJT05fXywgaW1hZ2VJbmRleCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVygiJXM6IFJlZmVyZW5jZWQgdGh1bWJuYWlsIGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoaW1hZ2UtPmlzR3JpZCgpKSB7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlHcmlkUm93cywgaW1hZ2UtPnJvd3MpOwotICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5R3JpZENvbHMsIGltYWdlLT5jb2x1bW5zKTsKLQorICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfUk9XUywgaW1hZ2UtPnJvd3MpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfQ09MVU1OUywgaW1hZ2UtPmNvbHVtbnMpOwogICAgICAgICAvLyBwb2ludCBpbWFnZSB0byB0aGUgZmlyc3QgdGlsZSBmb3IgZ3JpZCBzaXplIGFuZCBIVkNDCiAgICAgICAgIGltYWdlID0gJm1JdGVtSWRUb0l0ZW1NYXAuZWRpdFZhbHVlQXQodGlsZUl0ZW1JbmRleCk7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaWxlV2lkdGgsIGltYWdlLT53aWR0aCk7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaWxlSGVpZ2h0LCBpbWFnZS0+aGVpZ2h0KTsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCAqIDEuNSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVElMRV9XSURUSCwgaW1hZ2UtPndpZHRoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USUxFX0hFSUdIVCwgaW1hZ2UtPmhlaWdodCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQgKiAxLjUpOwogICAgIH0KIAogICAgIGlmIChpbWFnZS0+aHZjYyA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCIlczogaHZjYyBpcyBtaXNzaW5nIGZvciBpbWFnZVsldV0hIiwgX19GVU5DVElPTl9fLCBpbWFnZUluZGV4KTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgaW1hZ2UtPmh2Y2MtPmRhdGEoKSwgaW1hZ2UtPmh2Y2MtPnNpemUoKSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgaW1hZ2UtPmh2Y2MtPmRhdGEoKSwgaW1hZ2UtPmh2Y2MtPnNpemUoKSk7CiAKICAgICBpZiAoaW1hZ2UtPmljYyAhPSBOVUxMKSB7Ci0gICAgICAgIG1ldGEtPnNldERhdGEoa0tleUljY1Byb2ZpbGUsIDAsIGltYWdlLT5pY2MtPmRhdGEoKSwgaW1hZ2UtPmljYy0+c2l6ZSgpKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfSUNDX1BST0ZJTEUsIGltYWdlLT5pY2MtPmRhdGEoKSwgaW1hZ2UtPmljYy0+c2l6ZSgpKTsKICAgICB9CiAgICAgcmV0dXJuIG1ldGE7CiB9CkBAIC0xNjcxLDggKzE2ODksMzEgQEAKICAgICB9CiAKICAgICAvLyBza2lwIHRoZSBmaXJzdCA0LWJ5dGUgb2YgdGhlIG9mZnNldCB0byBUSUZGIGhlYWRlcgotICAgICpvZmZzZXQgPSBtSXRlbUlkVG9FeGlmTWFwW2V4aWZJbmRleF0ub2Zmc2V0ICsgNDsKLSAgICAqc2l6ZSA9IG1JdGVtSWRUb0V4aWZNYXBbZXhpZkluZGV4XS5zaXplIC0gNDsKKyAgICB1aW50MzJfdCB0aWZmT2Zmc2V0OworICAgIGlmICghbURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgIG1JdGVtSWRUb0V4aWZNYXBbZXhpZkluZGV4XS5vZmZzZXQsICZ0aWZmT2Zmc2V0LCA0KSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgLy8gV2UgbmVlZCAnRXhpZlwwXDAnIGJlZm9yZSB0aGUgdGlmZiBoZWFkZXIKKyAgICB0aWZmT2Zmc2V0ID0gbnRvaGwodGlmZk9mZnNldCk7CisgICAgaWYgKHRpZmZPZmZzZXQgPCA2KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIC8vIFRoZSBmaXJzdCA0LWJ5dGUgb2YgdGhlIGl0ZW0gaXMgdGhlIG9mZnNldCBvZiB0aGUgdGlmZiBoZWFkZXIgd2l0aGluIHRoZQorICAgIC8vIGV4aWYgZGF0YS4gVGhlIHNpemUgb2YgdGhlIGl0ZW0gc2hvdWxkIGJlID4gNCBmb3IgYSBub24tZW1wdHkgZXhpZiAodGhpcworICAgIC8vIHdhcyBhbHJlYWR5IGNoZWNrZWQgd2hlbiB0aGUgaXRlbSB3YXMgYWRkZWQpLiBBbHNvIGNoZWNrIHRoYXQgdGhlIHRpZmYKKyAgICAvLyBoZWFkZXIgb2Zmc2V0IGlzIHZhbGlkLgorICAgIGlmIChtSXRlbUlkVG9FeGlmTWFwW2V4aWZJbmRleF0uc2l6ZSA8PSA0IHx8CisgICAgICAgICAgICB0aWZmT2Zmc2V0ID4gbUl0ZW1JZFRvRXhpZk1hcFtleGlmSW5kZXhdLnNpemUgLSA0KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgLy8gT2Zmc2V0IG9mICdFeGlmXDBcMCcgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiAnRXhpZicgaXRlbQorICAgIC8vIChmaXJzdCA0LWJ5dGUgaXMgdGhlIHRpZmYgaGVhZGVyIG9mZnNldCkKKyAgICB1aW50MzJfdCBleGlmT2Zmc2V0ID0gNCArIHRpZmZPZmZzZXQgLSA2OworICAgICpvZmZzZXQgPSBtSXRlbUlkVG9FeGlmTWFwW2V4aWZJbmRleF0ub2Zmc2V0ICsgZXhpZk9mZnNldDsKKyAgICAqc2l6ZSA9IG1JdGVtSWRUb0V4aWZNYXBbZXhpZkluZGV4XS5zaXplIC0gZXhpZk9mZnNldDsKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmgKaW5kZXggNTM2ZGNiMC4uYmU4MWI1OSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmgKQEAgLTE5LDEzICsxOSwxNSBAQAogCiAjaW5jbHVkZSA8c2V0PgogCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKwogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBEYXRhU291cmNlSGVscGVyOwogY2xhc3MgTWV0YURhdGE7CiAKIG5hbWVzcGFjZSBoZWlmIHsKQEAgLTQ1LDEzICs0NywxMyBAQAogCiBjbGFzcyBJdGVtVGFibGUgOiBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgSXRlbVRhYmxlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworICAgIGV4cGxpY2l0IEl0ZW1UYWJsZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgc3RhdHVzX3QgcGFyc2UodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKIAogICAgIGJvb2wgaXNWYWxpZCgpIHsgcmV0dXJuIG1JbWFnZUl0ZW1zVmFsaWQ7IH0KICAgICB1aW50MzJfdCBjb3VudEltYWdlcygpIGNvbnN0OwotICAgIHNwPE1ldGFEYXRhPiBnZXRJbWFnZU1ldGEoY29uc3QgdWludDMyX3QgaW1hZ2VJbmRleCk7CisgICAgQU1lZGlhRm9ybWF0ICpnZXRJbWFnZU1ldGEoY29uc3QgdWludDMyX3QgaW1hZ2VJbmRleCk7CiAgICAgc3RhdHVzX3QgZmluZEltYWdlSXRlbShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4LCB1aW50MzJfdCAqaXRlbUluZGV4KTsKICAgICBzdGF0dXNfdCBmaW5kVGh1bWJuYWlsSXRlbShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4LCB1aW50MzJfdCAqaXRlbUluZGV4KTsKICAgICBzdGF0dXNfdCBnZXRJbWFnZU9mZnNldEFuZFNpemUoCkBAIC02Miw3ICs2NCw3IEBACiAgICAgfkl0ZW1UYWJsZSgpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKIAogICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJdGVtTG9jPiBtSXRlbUxvY3M7CiAgICAgVmVjdG9yPEl0ZW1JbmZvPiBtSXRlbUluZm9zOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMDE0MjMzMy4uMjI4MTljYgotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCkBAIC0yNiwyNiArMjYsMjcgQEAKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSAiQUM0UGFyc2VyLmgiCiAjaW5jbHVkZSAiTVBFRzRFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJTYW1wbGVUYWJsZS5oIgogI2luY2x1ZGUgIkl0ZW1UYWJsZS5oIgogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgogCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRyYWN0b3JVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CkBAIC02OCwzNyArNjksMzggQEAKICAgICBrTWF4QXRvbVNpemUgPSA2NCAqIDEwMjQgKiAxMDI0LAogfTsKIAorY2xhc3MgTVBFRzRTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiBzdGF0aWMgY29uc3Qgc2l6ZV90ICBrTWF4UGNtRnJhbWVTaXplID0gODE5MjsKLQotY2xhc3MgTVBFRzRTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CiBwdWJsaWM6CiAgICAgLy8gQ2FsbGVyIHJldGFpbnMgb3duZXJzaGlwIG9mIGJvdGggImRhdGFTb3VyY2UiIGFuZCAic2FtcGxlVGFibGUiLgotICAgIE1QRUc0U291cmNlKE1ldGFEYXRhQmFzZSAmZm9ybWF0LAotICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAorICAgIE1QRUc0U291cmNlKEFNZWRpYUZvcm1hdCAqZm9ybWF0LAorICAgICAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCiAgICAgICAgICAgICAgICAgaW50MzJfdCB0aW1lU2NhbGUsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U2FtcGxlVGFibGU+ICZzYW1wbGVUYWJsZSwKICAgICAgICAgICAgICAgICBWZWN0b3I8U2lkeEVudHJ5PiAmc2lkeCwKICAgICAgICAgICAgICAgICBjb25zdCBUcmV4ICp0cmV4LAogICAgICAgICAgICAgICAgIG9mZjY0X3QgZmlyc3RNb29mT2Zmc2V0LAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPEl0ZW1UYWJsZT4gJml0ZW1UYWJsZSk7CisgICAgICAgICAgICAgICAgY29uc3Qgc3A8SXRlbVRhYmxlPiAmaXRlbVRhYmxlLAorICAgICAgICAgICAgICAgIGludDMyX3QgZWxzdFNoaWZ0U3RhcnRUaWNrcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0KCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBib29sIHN1cHBvcnROb25ibG9ja2luZ1JlYWQoKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBmcmFnbWVudGVkUmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIGJvb2wgc3VwcG9ydHNOb25CbG9ja2luZ1JlYWQoKSBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBmcmFnbWVudGVkUmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiAgICAgdmlydHVhbCB+TVBFRzRTb3VyY2UoKTsKIAogcHJpdmF0ZToKICAgICBNdXRleCBtTG9jazsKIAotICAgIE1ldGFEYXRhQmFzZSAmbUZvcm1hdDsKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptRm9ybWF0OworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIGludDMyX3QgbVRpbWVzY2FsZTsKICAgICBzcDxTYW1wbGVUYWJsZT4gbVNhbXBsZVRhYmxlOwogICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlSW5kZXg7CkBAIC0xMDgsNyArMTEwLDcgQEAKICAgICBvZmY2NF90IG1GaXJzdE1vb2ZPZmZzZXQ7CiAgICAgb2ZmNjRfdCBtQ3VycmVudE1vb2ZPZmZzZXQ7CiAgICAgb2ZmNjRfdCBtTmV4dE1vb2ZPZmZzZXQ7Ci0gICAgdWludDMyX3QgbUN1cnJlbnRUaW1lOworICAgIHVpbnQzMl90IG1DdXJyZW50VGltZTsgLy8gaW4gbWVkaWEgdGltZXNjYWxlIHRpY2tzCiAgICAgaW50MzJfdCBtTGFzdFBhcnNlZFRyYWNrSWQ7CiAgICAgaW50MzJfdCBtVHJhY2tJZDsKIApAQCAtMTI5LDE2ICsxMzEsMTMgQEAKIAogICAgIGJvb2wgbUlzQVZDOwogICAgIGJvb2wgbUlzSEVWQzsKKyAgICBib29sIG1Jc0FDNDsKICAgICBib29sIG1Jc1BjbTsKICAgICBzaXplX3QgbU5BTExlbmd0aFNpemU7CiAKICAgICBib29sIG1TdGFydGVkOwogCi0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwotCi0gICAgTWVkaWFCdWZmZXJCYXNlICptQnVmZmVyOwotCi0gICAgYm9vbCBtV2FudHNOQUxGcmFnbWVudHM7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKm1CdWZmZXI7CiAKICAgICB1aW50OF90ICptU3JjQnVmZmVyOwogCkBAIC0xNDYsNiArMTQ1LDEwIEBACiAgICAgYm9vbCBtSXNBdWRpbzsKICAgICBzcDxJdGVtVGFibGU+IG1JdGVtVGFibGU7CiAKKyAgICAvLyBTdGFydCBvZmZzZXQgZnJvbSBjb21wb3NpdGlvbiB0aW1lIHRvIHByZXNlbnRhdGlvbiB0aW1lLgorICAgIC8vIFN1cHBvcnQgc2hpZnQgb25seSBmb3IgdmlkZW8gdHJhY2tzIHRocm91Z2ggbUVsc3RTaGlmdFN0YXJ0VGlja3MgZm9yIG5vdy4KKyAgICBpbnQzMl90IG1FbHN0U2hpZnRTdGFydFRpY2tzOworCiAgICAgc2l6ZV90IHBhcnNlTkFMU2l6ZShjb25zdCB1aW50OF90ICpkYXRhKSBjb25zdDsKICAgICBzdGF0dXNfdCBwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCk7CiAgICAgc3RhdHVzX3QgcGFyc2VUcmFja0ZyYWdtZW50SGVhZGVyKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IHNpemUpOwpAQCAtMTU0LDYgKzE1Nyw4IEBACiAgICAgc3RhdHVzX3QgcGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSk7CiAgICAgc3RhdHVzX3QgcGFyc2VDbGVhckVuY3J5cHRlZFNpemVzKG9mZjY0X3Qgb2Zmc2V0LCBib29sIGlzU3Vic2FtcGxlRW5jcnlwdGlvbiwgdWludDMyX3QgZmxhZ3MpOwogICAgIHN0YXR1c190IHBhcnNlU2FtcGxlRW5jcnlwdGlvbihvZmY2NF90IG9mZnNldCk7CisgICAgLy8gcmV0dXJucyAtMSBmb3IgaW52YWxpZCBsYXllciBJRAorICAgIGludDMyX3QgcGFyc2VIRVZDTGF5ZXJJZChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKICAgICBzdHJ1Y3QgVHJhY2tGcmFnbWVudEhlYWRlckluZm8gewogICAgICAgICBlbnVtIEZsYWdzIHsKQEAgLTE5OSwxNCArMjA0LDE0IEBACiAvLyBwb3NzaWJseSB3cmFwcGluZyBtdWx0aXBsZSB0aW1lcyB0byBjb3ZlciBhbGwgdHJhY2tzLCBpLmUuCiAvLyBFYWNoIENhY2hlZFJhbmdlZERhdGFTb3VyY2UgY2FjaGVzIHRoZSBzYW1wbGV0YWJsZSBtZXRhZGF0YSBmb3IgYSBzaW5nbGUgdHJhY2suCiAKLXN0cnVjdCBDYWNoZWRSYW5nZWREYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2VCYXNlIHsKLSAgICBleHBsaWNpdCBDYWNoZWRSYW5nZWREYXRhU291cmNlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworY2xhc3MgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDYWNoZWRSYW5nZWREYXRhU291cmNlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAgICAgdmlydHVhbCB+Q2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKKyAgICBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSkgb3ZlcnJpZGU7CisgICAgdWludDMyX3QgZmxhZ3MoKSBvdmVycmlkZTsKIAogICAgIHN0YXR1c190IHNldENhY2hlZFJhbmdlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgYm9vbCBhc3N1bWVTb3VyY2VPd25lcnNoaXBPblN1Y2Nlc3MpOwogCkBAIC0yMTQsNyArMjE5LDcgQEAKIHByaXZhdGU6CiAgICAgTXV0ZXggbUxvY2s7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptU291cmNlOwogICAgIGJvb2wgbU93bnNEYXRhU291cmNlOwogICAgIG9mZjY0X3QgbUNhY2hlZE9mZnNldDsKICAgICBzaXplX3QgbUNhY2hlZFNpemU7CkBAIC0yMjYsOCArMjMxLDkgQEAKICAgICBDYWNoZWRSYW5nZWREYXRhU291cmNlICZvcGVyYXRvcj0oY29uc3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSAmKTsKIH07CiAKLUNhY2hlZFJhbmdlZERhdGFTb3VyY2U6OkNhY2hlZFJhbmdlZERhdGFTb3VyY2UoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKLSAgICA6IG1Tb3VyY2Uoc291cmNlKSwKK0NhY2hlZFJhbmdlZERhdGFTb3VyY2U6OkNhY2hlZFJhbmdlZERhdGFTb3VyY2UoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQorICAgIDogRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpLAorICAgICAgbVNvdXJjZShzb3VyY2UpLAogICAgICAgbU93bnNEYXRhU291cmNlKGZhbHNlKSwKICAgICAgIG1DYWNoZWRPZmZzZXQoMCksCiAgICAgICBtQ2FjaGVkU2l6ZSgwKSwKQEAgLTIzNyw3ICsyNDMsNyBAQAogQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6fkNhY2hlZFJhbmdlZERhdGFTb3VyY2UoKSB7CiAgICAgY2xlYXJDYWNoZSgpOwogICAgIGlmIChtT3duc0RhdGFTb3VyY2UpIHsKLSAgICAgICAgZGVsZXRlIChDYWNoZWRSYW5nZWREYXRhU291cmNlKiltU291cmNlOworICAgICAgICBkZWxldGUgbVNvdXJjZTsKICAgICB9CiB9CiAKQEAgLTI1MSwxMCArMjU3LDYgQEAKICAgICBtQ2FjaGVkU2l6ZSA9IDA7CiB9CiAKLXN0YXR1c190IENhY2hlZFJhbmdlZERhdGFTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNvdXJjZS0+aW5pdENoZWNrKCk7Ci19Ci0KIHNzaXplX3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKQEAgLTMxNiw2ICszMTgsOSBAQAogICAgICAgICBjYXNlIEZPVVJDQygic2F3YiIpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQjsKIAorICAgICAgICBjYXNlIEZPVVJDQygiZWMtMyIpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzM7CisKICAgICAgICAgY2FzZSBGT1VSQ0MoIm1wNHYiKToKICAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKIApAQCAtMzMwLDYgKzMzNSw4IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCJodmMxIik6CiAgICAgICAgIGNhc2UgRk9VUkNDKCJoZXYxIik6CiAgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQzsKKyAgICAgICAgY2FzZSBGT1VSQ0MoImFjLTQiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQ7CiAKICAgICAgICAgY2FzZSBGT1VSQ0MoInR3b3MiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoInNvd3QiKToKQEAgLTMzNyw2ICszNDQsMTEgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoImFsYWMiKToKICAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDOwogCisgICAgICAgIGNhc2UgRk9VUkNDKCJhdjAxIik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fQVYxOworICAgICAgICBjYXNlIEZPVVJDQygiLm1wMyIpOgorICAgICAgICBjYXNlIDB4NkQ3MzAwNTU6IC8vICJtcyBVIiBtcDMgYXVkaW8KKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR1coIlVua25vd24gZm91cmNjOiAlYyVjJWMlYyIsCiAgICAgICAgICAgICAgICAgICAgKGZvdXJjYyA+PiAyNCkgJiAweGZmLApAQCAtMzYzLDEyICszNzUsMTEgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLU1QRUc0RXh0cmFjdG9yOjpNUEVHNEV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlLCBjb25zdCBjaGFyICptaW1lKQorTVBFRzRFeHRyYWN0b3I6Ok1QRUc0RXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkKICAgICA6IG1Nb29mT2Zmc2V0KDApLAogICAgICAgbU1vb2ZGb3VuZChmYWxzZSksCiAgICAgICBtTWRhdEZvdW5kKGZhbHNlKSwKICAgICAgIG1EYXRhU291cmNlKHNvdXJjZSksCi0gICAgICBtQ2FjaGVkU291cmNlKE5VTEwpLAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1IZWFkZXJUaW1lc2NhbGUoMCksCiAgICAgICBtSXNRVChmYWxzZSksCkBAIC0zNzgsNiArMzg5LDcgQEAKICAgICAgIG1GaXJzdFRyYWNrKE5VTEwpLAogICAgICAgbUxhc3RUcmFjayhOVUxMKSB7CiAgICAgQUxPR1YoIm1pbWU9JXMsIG1QcmVmZXJIZWlmPSVkIiwgbWltZSwgbVByZWZlckhlaWYpOworICAgIG1GaWxlTWV0YURhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiB9CiAKIE1QRUc0RXh0cmFjdG9yOjp+TVBFRzRFeHRyYWN0b3IoKSB7CkBAIC0zODUsNiArMzk3LDcgQEAKICAgICB3aGlsZSAodHJhY2spIHsKICAgICAgICAgVHJhY2sgKm5leHQgPSB0cmFjay0+bmV4dDsKIAorICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHRyYWNrLT5tZXRhKTsKICAgICAgICAgZGVsZXRlIHRyYWNrOwogICAgICAgICB0cmFjayA9IG5leHQ7CiAgICAgfQpAQCAtMzk1LDcgKzQwOCw4IEBACiAgICAgfQogICAgIG1Qc3NoLmNsZWFyKCk7CiAKLSAgICBkZWxldGUgbUNhY2hlZFNvdXJjZTsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtRmlsZU1ldGFEYXRhKTsKIH0KIAogdWludDMyX3QgTVBFRzRFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewpAQCAtNDA0LDEzICs0MTgsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgKENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLKSA6IDApOwogfQogCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGlmICgoZXJyID0gcmVhZE1ldGFEYXRhKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQotICAgIG1ldGEgPSBtRmlsZU1ldGFEYXRhOwotICAgIHJldHVybiBPSzsKKyAgICBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtRmlsZU1ldGFEYXRhKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzaXplX3QgTVBFRzRFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewpAQCAtNDMxLDE4ICs0NDUsMTggQEAKICAgICByZXR1cm4gbjsKIH0KIAotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgaWYgKChlcnIgPSByZWFkTWV0YURhdGEoKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBUcmFjayAqdHJhY2sgPSBtRmlyc3RUcmFjazsKICAgICB3aGlsZSAoaW5kZXggPiAwKSB7CiAgICAgICAgIGlmICh0cmFjayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogCiAgICAgICAgIHRyYWNrID0gdHJhY2stPm5leHQ7CkBAIC00NTAsMTcgKzQ2NCwxOCBAQAogICAgIH0KIAogICAgIGlmICh0cmFjayA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgWz1dIHsKICAgICAgICAgaW50NjRfdCBkdXJhdGlvbjsKICAgICAgICAgaW50MzJfdCBzYW1wbGVyYXRlOworICAgICAgICAvLyBPbmx5IGZvciBhdWRpbyB0cmFjay4KICAgICAgICAgaWYgKHRyYWNrLT5oYXNfZWxzdCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDAgJiYKLSAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pICYmCi0gICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50NjQodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZkdXJhdGlvbikgJiYKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZzYW1wbGVyYXRlKSkgewogCi0gICAgICAgICAgICAvLyBlbHN0IGhhcyB0byBiZSBwcm9jZXNzZWQgb25seSB0aGUgZmlyc3QgdGltZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAorICAgICAgICAgICAgLy8gRWxzdCBoYXMgdG8gYmUgcHJvY2Vzc2VkIG9ubHkgdGhlIGZpcnN0IHRpbWUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCiAgICAgICAgICAgICB0cmFjay0+aGFzX2Vsc3QgPSBmYWxzZTsKIAogICAgICAgICAgICAgaWYgKHRyYWNrLT5lbHN0X3NlZ21lbnRfZHVyYXRpb24gPiBJTlQ2NF9NQVgpIHsKQEAgLTQ3Niw3NyArNDkxLDc2IEBACiAgICAgICAgICAgICAgICAgICBoYWxmc2NhbGUsIG1IZWFkZXJUaW1lc2NhbGUsIHRyYWNrLT50aW1lc2NhbGUpOwogCiAgICAgICAgICAgICBpZiAoKHVpbnQzMl90KXNhbXBsZXJhdGUgIT0gdHJhY2stPnRpbWVzY2FsZSl7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNhbXBsZXJhdGU6JSIgUFJJZDMyICIsIHRyYWNrLT50aW1lc2NhbGUgYW5kIHNhbXBsZXJhdGUgYXJlIGRpZmZlcmVudCEiLCBzYW1wbGVyYXRlKTsKKyAgICAgICAgICAgICAgICBBTE9HVigic2FtcGxlcmF0ZTolIiBQUklkMzIgIiwgdHJhY2stPnRpbWVzY2FsZSBhbmQgc2FtcGxlcmF0ZSBhcmUgZGlmZmVyZW50ISIsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZXJhdGUpOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQ2NF90IGRlbGF5OwotICAgICAgICAgICAgLy8gZGVsYXkgPSAoKG1lZGlhX3RpbWUgKiBzYW1wbGVyYXRlKSArIGhhbGZzY2FsZSkgLyB0cmFjay0+dGltZXNjYWxlOwotICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobWVkaWFfdGltZSwgc2FtcGxlcmF0ZSwgJmRlbGF5KSB8fAotICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KGRlbGF5LCBoYWxmc2NhbGUsICZkZWxheSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKGRlbGF5IC89IG1IZWFkZXJUaW1lc2NhbGUsIGZhbHNlKSB8fAotICAgICAgICAgICAgICAgICAgICAvKiB0aGUgY2FsY3VsYXRlZCBkZWxheSBzaG91bGQgYmUgc21hbGwsIGJ1dCBzb21lIGFwcHMKLSAgICAgICAgICAgICAgICAgICAgICogYXBwZWFyIHRvIHdyaXRlIGEgYm9ndXMgZWRpdCBsaXN0IHRoYXQgY2F1c2VzIGEgcmVhbGx5Ci0gICAgICAgICAgICAgICAgICAgICAqIGxhcmdlIGRlbGF5LCByZXN1bHRpbmcgaW4gcGxheWJhY2sgcHJvYmxlbXMuCi0gICAgICAgICAgICAgICAgICAgICAqIElnbm9yZSBzdWNoIGVkaXQgbGlzdHMuCi0gICAgICAgICAgICAgICAgICAgICAqICg0MDk2IGlzIGVub3VnaCB0byBkcm9wIDQgZnVsbCBzYW1wbGVzKQotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgZGVsYXkgPiA0MDk2IHx8Ci0gICAgICAgICAgICAgICAgICAgIGRlbGF5IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyBlZGl0IGxpc3Qgd2l0aCBib2d1cyB2YWx1ZXMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiZGVsYXkgPSAlIiBQUklkNjQsIGRlbGF5KTsKLSAgICAgICAgICAgIHRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFbmNvZGVyRGVsYXksIGRlbGF5KTsKLQotICAgICAgICAgICAgaW50NjRfdCBzY2FsZWRfZHVyYXRpb247Ci0gICAgICAgICAgICAvLyBzY2FsZWRfZHVyYXRpb24gPSBkdXJhdGlvbiAqIG1IZWFkZXJUaW1lc2NhbGU7Ci0gICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhkdXJhdGlvbiwgbUhlYWRlclRpbWVzY2FsZSwgJnNjYWxlZF9kdXJhdGlvbikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigic2NhbGVkX2R1cmF0aW9uID0gJSIgUFJJZDY0LCBzY2FsZWRfZHVyYXRpb24pOwotCi0gICAgICAgICAgICBpbnQ2NF90IHNlZ21lbnRfZW5kOwotICAgICAgICAgICAgaW50NjRfdCBwYWRkaW5nOwotICAgICAgICAgICAgaW50NjRfdCBzZWdtZW50X2R1cmF0aW9uX2U2OwotICAgICAgICAgICAgaW50NjRfdCBtZWRpYV90aW1lX3NjYWxlZF9lNjsKLSAgICAgICAgICAgIGludDY0X3QgbWVkaWFfdGltZV9zY2FsZWQ7Ci0gICAgICAgICAgICAvLyBwYWRkaW5nID0gc2NhbGVkX2R1cmF0aW9uIC0gKChzZWdtZW50X2R1cmF0aW9uICogMTAwMDAwMCkgKwotICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAoKG1lZGlhX3RpbWUgKiBtSGVhZGVyVGltZVNjYWxlICogMTAwMDAwMCkvdHJhY2stPnRpbWVzY2FsZSkgKQotICAgICAgICAgICAgLy8gc2VnbWVudF9kdXJhdGlvbiBpcyBiYXNlZCBvbiB0aW1lc2NhbGUgaW4gbW92aWUgaGVhZGVyIGJveChtZGhkKQotICAgICAgICAgICAgLy8gbWVkaWFfdGltZSBpcyBiYXNlZCBvbiB0aW1lc2NhbGUgdHJhY2sgaGVhZGVyL21lZGlhIHRpbWVzY2FsZQotICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coc2VnbWVudF9kdXJhdGlvbiwgMTAwMDAwMCwgJnNlZ21lbnRfZHVyYXRpb25fZTYpIHx8Ci0gICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtZWRpYV90aW1lLCBtSGVhZGVyVGltZXNjYWxlLCAmbWVkaWFfdGltZV9zY2FsZWQpIHx8Ci0gICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtZWRpYV90aW1lX3NjYWxlZCwgMTAwMDAwMCwgJm1lZGlhX3RpbWVfc2NhbGVkX2U2KSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lZGlhX3RpbWVfc2NhbGVkX2U2IC89IHRyYWNrLT50aW1lc2NhbGU7Ci0gICAgICAgICAgICBpZihfX2J1aWx0aW5fYWRkX292ZXJmbG93KHNlZ21lbnRfZHVyYXRpb25fZTYsIG1lZGlhX3RpbWVfc2NhbGVkX2U2LCAmc2VnbWVudF9lbmQpIHx8Ci0gICAgICAgICAgICAgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdyhzY2FsZWRfZHVyYXRpb24sIHNlZ21lbnRfZW5kLCAmcGFkZGluZykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigic2VnbWVudF9lbmQgPSAlIiBQUklkNjQgIiwgcGFkZGluZyA9ICUiIFBSSWQ2NCwgc2VnbWVudF9lbmQsIHBhZGRpbmcpOwotICAgICAgICAgICAgaW50NjRfdCBwYWRkaW5nc2FtcGxlcyA9IDA7Ci0gICAgICAgICAgICBpZiAocGFkZGluZyA8IDApIHsKLSAgICAgICAgICAgICAgICAvLyB0cmFjayBkdXJhdGlvbiBmcm9tIG1lZGlhIGhlYWRlciAod2hpY2ggaXMgd2hhdCBrS2V5RHVyYXRpb24gaXMpIG1pZ2h0Ci0gICAgICAgICAgICAgICAgLy8gYmUgc2xpZ2h0bHkgc2hvcnRlciB0aGFuIHRoZSBzZWdtZW50IGR1cmF0aW9uLCB3aGljaCB3b3VsZCBtYWtlIHRoZQotICAgICAgICAgICAgICAgIC8vIHBhZGRpbmcgbmVnYXRpdmUuIENsYW1wIHRvIHplcm8uCi0gICAgICAgICAgICAgICAgcGFkZGluZyA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludDY0X3QgaGFsZnNjYWxlX2U2OwotICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXNjYWxlX2U2OwotICAgICAgICAgICAgICAgIC8vIHBhZGRpbmdzYW1wbGVzID0gKChwYWRkaW5nICogc2FtcGxlcmF0ZSkgKyAoaGFsZnNjYWxlICogMTAwMDAwMCkpCi0gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgLyAobUhlYWRlclRpbWVzY2FsZSAqIDEwMDAwMDApOwotICAgICAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KHBhZGRpbmcsIHNhbXBsZXJhdGUsICZwYWRkaW5nc2FtcGxlcykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coaGFsZnNjYWxlLCAxMDAwMDAwLCAmaGFsZnNjYWxlX2U2KSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtSGVhZGVyVGltZXNjYWxlLCAxMDAwMDAwLCAmdGltZXNjYWxlX2U2KSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhwYWRkaW5nc2FtcGxlcywgaGFsZnNjYWxlX2U2LCAmcGFkZGluZ3NhbXBsZXMpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAocGFkZGluZ3NhbXBsZXMgLz0gdGltZXNjYWxlX2U2LCBmYWxzZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdzYW1wbGVzID4gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAvLyBCb3RoIGRlbGF5IGFuZCBwYWRkaW5nc2FtcGxlcyBoYXZlIHRvIGJlIHNldCBpbm9yZGVyIGZvciBlaXRoZXIgdG8gYmUKKyAgICAgICAgICAgIC8vIGVmZmVjdGl2ZSBpbiB0aGUgbG93ZXIgbGF5ZXJzLgorICAgICAgICAgICAgaW50NjRfdCBkZWxheSA9IDA7CisgICAgICAgICAgICBpZiAobWVkaWFfdGltZSA+IDApIHsgLy8gR2FwbGVzcyBwbGF5YmFjaworICAgICAgICAgICAgICAgIC8vIGRlbGF5ID0gKChtZWRpYV90aW1lICogc2FtcGxlcmF0ZSkgKyBoYWxmc2NhbGUpIC8gdHJhY2stPnRpbWVzY2FsZTsKKyAgICAgICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhtZWRpYV90aW1lLCBzYW1wbGVyYXRlLCAmZGVsYXkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KGRlbGF5LCBoYWxmc2NhbGUsICZkZWxheSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChkZWxheSAvPSB0cmFjay0+dGltZXNjYWxlLCBmYWxzZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5ID4gSU5UMzJfTUFYIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxheSA8IElOVDMyX01JTikgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgZWRpdCBsaXN0IHdpdGggYm9ndXMgdmFsdWVzIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiZGVsYXkgPSAlIiBQUklkNjQsIGRlbGF5KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZLCBkZWxheSk7CisKKyAgICAgICAgICAgIGludDY0X3QgcGFkZGluZ3NhbXBsZXMgPSAwOworICAgICAgICAgICAgaWYgKHNlZ21lbnRfZHVyYXRpb24gPiAwKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBzY2FsZWRfZHVyYXRpb247CisgICAgICAgICAgICAgICAgLy8gc2NhbGVkX2R1cmF0aW9uID0gZHVyYXRpb24gKiBtSGVhZGVyVGltZXNjYWxlOworICAgICAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KGR1cmF0aW9uLCBtSGVhZGVyVGltZXNjYWxlLCAmc2NhbGVkX2R1cmF0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJzY2FsZWRfZHVyYXRpb24gPSAlIiBQUklkNjQsIHNjYWxlZF9kdXJhdGlvbik7CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNlZ21lbnRfZW5kOworICAgICAgICAgICAgICAgIGludDY0X3QgcGFkZGluZzsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNlZ21lbnRfZHVyYXRpb25fZTY7CisgICAgICAgICAgICAgICAgaW50NjRfdCBtZWRpYV90aW1lX3NjYWxlZF9lNjsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG1lZGlhX3RpbWVfc2NhbGVkOworICAgICAgICAgICAgICAgIC8vIHBhZGRpbmcgPSBzY2FsZWRfZHVyYXRpb24gLSAoKHNlZ21lbnRfZHVyYXRpb24gKiAxMDAwMDAwKSArCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAoKG1lZGlhX3RpbWUgKiBtSGVhZGVyVGltZXNjYWxlICogMTAwMDAwMCkvdHJhY2stPnRpbWVzY2FsZSkgKQorICAgICAgICAgICAgICAgIC8vIHNlZ21lbnRfZHVyYXRpb24gaXMgYmFzZWQgb24gdGltZXNjYWxlIGluIG1vdmllIGhlYWRlciBib3gobWRoZCkKKyAgICAgICAgICAgICAgICAvLyBtZWRpYV90aW1lIGlzIGJhc2VkIG9uIHRpbWVzY2FsZSB0cmFjayBoZWFkZXIvbWVkaWEgdGltZXNjYWxlCisgICAgICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coc2VnbWVudF9kdXJhdGlvbiwgMTAwMDAwMCwgJnNlZ21lbnRfZHVyYXRpb25fZTYpIHx8CisgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobWVkaWFfdGltZSwgbUhlYWRlclRpbWVzY2FsZSwgJm1lZGlhX3RpbWVfc2NhbGVkKSB8fAorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1lZGlhX3RpbWVfc2NhbGVkLCAxMDAwMDAwLCAmbWVkaWFfdGltZV9zY2FsZWRfZTYpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVkaWFfdGltZV9zY2FsZWRfZTYgLz0gdHJhY2stPnRpbWVzY2FsZTsKKyAgICAgICAgICAgICAgICBpZiAoX19idWlsdGluX2FkZF9vdmVyZmxvdyhzZWdtZW50X2R1cmF0aW9uX2U2LCBtZWRpYV90aW1lX3NjYWxlZF9lNiwgJnNlZ21lbnRfZW5kKQorICAgICAgICAgICAgICAgICAgICB8fCBfX2J1aWx0aW5fc3ViX292ZXJmbG93KHNjYWxlZF9kdXJhdGlvbiwgc2VnbWVudF9lbmQsICZwYWRkaW5nKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJzZWdtZW50X2VuZCA9ICUiIFBSSWQ2NCAiLCBwYWRkaW5nID0gJSIgUFJJZDY0LCBzZWdtZW50X2VuZCwgcGFkZGluZyk7CisgICAgICAgICAgICAgICAgLy8gdHJhY2sgZHVyYXRpb24gZnJvbSBtZWRpYSBoZWFkZXIgKHdoaWNoIGlzIHdoYXQgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiBpcykKKyAgICAgICAgICAgICAgICAvLyBtaWdodCBiZSBzbGlnaHRseSBzaG9ydGVyIHRoYW4gdGhlIHNlZ21lbnQgZHVyYXRpb24sIHdoaWNoIHdvdWxkIG1ha2UgdGhlCisgICAgICAgICAgICAgICAgLy8gcGFkZGluZyBuZWdhdGl2ZS4gQ2xhbXAgdG8gemVyby4KKyAgICAgICAgICAgICAgICBpZiAocGFkZGluZyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBoYWxmc2NhbGVfbWh0ID0gbUhlYWRlclRpbWVzY2FsZSAvIDI7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgaGFsZnNjYWxlX2U2OworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzY2FsZV9lNjsKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFkZGluZ3NhbXBsZXMgPSAoKHBhZGRpbmcgKiBzYW1wbGVyYXRlKSArIChoYWxmc2NhbGVfbWh0ICogMTAwMDAwMCkpCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIC8gKG1IZWFkZXJUaW1lc2NhbGUgKiAxMDAwMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cocGFkZGluZywgc2FtcGxlcmF0ZSwgJnBhZGRpbmdzYW1wbGVzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coaGFsZnNjYWxlX21odCwgMTAwMDAwMCwgJmhhbGZzY2FsZV9lNikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1IZWFkZXJUaW1lc2NhbGUsIDEwMDAwMDAsICZ0aW1lc2NhbGVfZTYpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhwYWRkaW5nc2FtcGxlcywgaGFsZnNjYWxlX2U2LCAmcGFkZGluZ3NhbXBsZXMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZGRpbmdzYW1wbGVzIC89IHRpbWVzY2FsZV9lNiwgZmFsc2UpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ3NhbXBsZXMgPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJwYWRkaW5nc2FtcGxlcyA9ICUiIFBSSWQ2NCwgcGFkZGluZ3NhbXBsZXMpOwotICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBwYWRkaW5nc2FtcGxlcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HLCBwYWRkaW5nc2FtcGxlcyk7CiAgICAgICAgIH0KICAgICB9KCk7CiAKQEAgLTU1NSw3ICs1NjksNyBAQAogICAgICAgICB0cmFjay0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhID0gdHJ1ZTsKIAogICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBDSEVDSyh0cmFjay0+bWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpIHsKICAgICAgICAgICAgIC8vIE1QRUcyIHRyYWNrcyBkbyBub3QgcHJvdmlkZSBDU0QsIHNvIHJlYWQgdGhlIHN0cmVhbSBoZWFkZXIKICAgICAgICAgICAgIGlmICghc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKSkgewpAQCAtNTY4LDM2ICs1ODIsMzggQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB1aW50OF90IGhlYWRlcltrTWF4VHJhY2tIZWFkZXJTaXplXTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAmaGVhZGVyLCBzaXplKSA9PSAoc3NpemVfdClzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXREYXRhKGtLZXlTdHJlYW1IZWFkZXIsICdtZGF0JywgaGVhZGVyLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIodHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFRzJfU1RSRUFNX0hFQURFUiwgaGVhZGVyLCBzaXplKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1Nb29mT2Zmc2V0ID4gMCkgewogICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tZXRhLmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikpIHsKKyAgICAgICAgICAgICAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDY0KHRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJmR1cmF0aW9uKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIGZhbmN5LCBqdXN0IHBpY2sgYSBmcmFtZSBuZWFyIDEvNHRoIG9mIHRoZSBkdXJhdGlvbgotICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGh1bWJuYWlsVGltZSwgZHVyYXRpb24gLyA0KTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KHRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUsIGR1cmF0aW9uIC8gNCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleDsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVUaW1lOworICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNhbXBsZVRpbWU7CiAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT50aW1lc2NhbGUgIT0gMCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNhbXBsZVRhYmxlLT5maW5kVGh1bWJuYWlsU2FtcGxlKCZzYW1wbGVJbmRleCkgPT0gT0sKICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRyYWNrLT5zYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlSW5kZXgsIE5VTEwgLyogb2Zmc2V0ICovLCBOVUxMIC8qIHNpemUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tZXRhLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUaHVtYm5haWxUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50NjRfdClzYW1wbGVUaW1lICogMTAwMDAwMCkgLyB0cmFjay0+dGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCh0cmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfVElNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQ2NF90KXNhbXBsZVRpbWUgKiAxMDAwMDAwKSAvIHRyYWNrLT50aW1lc2NhbGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIG1ldGEgPSB0cmFjay0+bWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgdHJhY2stPm1ldGEpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpyZWFkTWV0YURhdGEoKSB7CkBAIC02MzIsMTIgKzY0OCwxNCBAQAogICAgICAgICBvZmY2NF90IGV4aWZPZmZzZXQ7CiAgICAgICAgIHNpemVfdCBleGlmU2l6ZTsKICAgICAgICAgaWYgKG1JdGVtVGFibGUtPmdldEV4aWZPZmZzZXRBbmRTaXplKCZleGlmT2Zmc2V0LCAmZXhpZlNpemUpID09IE9LKSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEludDY0KGtLZXlFeGlmT2Zmc2V0LCAoaW50NjRfdClleGlmT2Zmc2V0KTsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0SW50NjQoa0tleUV4aWZTaXplLCAoaW50NjRfdClleGlmU2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9FWElGX09GRlNFVCwgKGludDY0X3QpZXhpZk9mZnNldCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9FWElGX1NJWkUsIChpbnQ2NF90KWV4aWZTaXplKTsKICAgICAgICAgfQogICAgICAgICBmb3IgKHVpbnQzMl90IGltYWdlSW5kZXggPSAwOwogICAgICAgICAgICAgICAgIGltYWdlSW5kZXggPCBtSXRlbVRhYmxlLT5jb3VudEltYWdlcygpOyBpbWFnZUluZGV4KyspIHsKLSAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbUl0ZW1UYWJsZS0+Z2V0SW1hZ2VNZXRhKGltYWdlSW5kZXgpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gbUl0ZW1UYWJsZS0+Z2V0SW1hZ2VNZXRhKGltYWdlSW5kZXgpOwogICAgICAgICAgICAgaWYgKG1ldGEgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJoZWlmIGltYWdlICV1IGhhcyBubyBtZXRhISIsIGltYWdlSW5kZXgpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNjYyLDI2ICs2ODAsMjkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1MYXN0VHJhY2sgPSB0cmFjazsKIAotICAgICAgICAgICAgdHJhY2stPm1ldGEgPSAqKG1ldGEuZ2V0KCkpOwotICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVRyYWNrSUQsIGltYWdlSW5kZXgpOworICAgICAgICAgICAgdHJhY2stPm1ldGEgPSBtZXRhOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCBpbWFnZUluZGV4KTsKICAgICAgICAgICAgIHRyYWNrLT5pbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGEgPSBmYWxzZTsKICAgICAgICAgICAgIHRyYWNrLT5za2lwVHJhY2sgPSBmYWxzZTsKICAgICAgICAgICAgIHRyYWNrLT50aW1lc2NhbGUgPSAxMDAwMDAwOworICAgICAgICAgICAgdHJhY2stPmVsc3RTaGlmdFN0YXJ0VGlja3MgPSAwOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKICAgICAgICAgaWYgKGZpbmRUcmFja0J5TWltZVByZWZpeCgidmlkZW8vIikgIT0gTlVMTCkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0KTsKICAgICAgICAgfSBlbHNlIGlmIChmaW5kVHJhY2tCeU1pbWVQcmVmaXgoImF1ZGlvLyIpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICJhdWRpby9tcDQiKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAiYXVkaW8vbXA0Iik7CiAgICAgICAgIH0gZWxzZSBpZiAoZmluZFRyYWNrQnlNaW1lUHJlZml4KAogICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykgIT0gTlVMTCkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9IRUlGKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfSEVJRik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUluaXRDaGVjayA9IGVycjsKQEAgLTcwNiw3ICs3MjcsNyBAQAogICAgICAgICAgICAgbWVtY3B5KHB0ciArIDIwLCBtUHNzaFtpXS5kYXRhLCBtUHNzaFtpXS5kYXRhbGVuKTsKICAgICAgICAgICAgIHB0ciArPSAoMjAgKyBtUHNzaFtpXS5kYXRhbGVuKTsKICAgICAgICAgfQotICAgICAgICBtRmlsZU1ldGFEYXRhLnNldERhdGEoa0tleVBzc2gsICdwc3NoJywgYnVmLCBwc3Noc2l6ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9QU1NILCBidWYsIHBzc2hzaXplKTsKICAgICAgICAgZnJlZShidWYpOwogICAgIH0KIApAQCAtOTIyLDggKzk0Myw4IEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZFNvdXJjZS0+c2V0Q2FjaGVkUmFuZ2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9mZnNldCwgY2h1bmtfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGVkU291cmNlICE9IE5VTEwgLyogYXNzdW1lIG93bmVyc2hpcCBvbiBzdWNjZXNzICovKSA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBtQ2FjaGVkU291cmNlID0gY2FjaGVkU291cmNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogYXNzdW1lIG93bmVyc2hpcCBvbiBzdWNjZXNzICovKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBjYWNoZWRTb3VyY2U7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVkU291cmNlOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC05NTcsMTQgKzk3OCwzMyBAQAogICAgICAgICAgICAgICAgIHRyYWNrLT5pbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGEgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB0cmFjay0+c2tpcFRyYWNrID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgdHJhY2stPnRpbWVzY2FsZSA9IDA7Ci0gICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICAgICAgICAgICAgICB0cmFjay0+bWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKHRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CiAgICAgICAgICAgICAgICAgdHJhY2stPmhhc19lbHN0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgdHJhY2stPnN1YnNhbXBsZV9lbmNyeXB0aW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdHJhY2stPmVsc3RTaGlmdFN0YXJ0VGlja3MgPSAwOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CiAgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CiAgICAgICAgICAgICB3aGlsZSAoKm9mZnNldCA8IHN0b3Bfb2Zmc2V0KSB7CisKKyAgICAgICAgICAgICAgICAvLyBwYXNzIHVkYXRhIHRlcm1pbmF0ZQorICAgICAgICAgICAgICAgIGlmIChtSXNRVCAmJiBzdG9wX29mZnNldCAtICpvZmZzZXQgPT0gNCAmJiBjaHVua190eXBlID09IEZPVVJDQygidWR0YSIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB0aGF0IHVkdGEgdGVybWluYXRlcyB3aXRoIHRlcm1pbmF0ZSBjb2RlIHgwMDAwMDAwMAorICAgICAgICAgICAgICAgICAgICAvLyBub3RlIHRoYXQgMCB0ZXJtaW5hdG9yIGlzIG9wdGlvbmFsIGFuZCB3ZSBqdXN0IGhhbmRsZSB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRlcm1pbmF0ZV9jb2RlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCAmdGVybWluYXRlX2NvZGUsIDQpOworICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSB0ZXJtaW5hdGVfY29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgKm9mZnNldCArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlRlcm1pbmFsIGNvZGUgZm9yIHVkdGEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImludmFsaWQgdWR0YSBUZXJtaW5hbCBjb2RlIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKG9mZnNldCwgZGVwdGggKyAxKTsKICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpc1RyYWNrKSB7CkBAIC05ODEsOCArMTAyMSwxMCBAQAogCiAgICAgICAgICAgICBpZiAoaXNUcmFjaykgewogICAgICAgICAgICAgICAgIGludDMyX3QgdHJhY2tJZDsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGV4YWN0IG9uZSB0cmFjayBoZWFkZXIgcGVyIHRyYWNrLgotICAgICAgICAgICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleVRyYWNrSUQsICZ0cmFja0lkKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIG11c3QgYmUgZXhhY3RseSBvbmUgdHJhY2sgaGVhZGVyIHBlciB0cmFjay4KKworICAgICAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmdHJhY2tJZCkpIHsKICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2tpcFRyYWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTEwNTgsNyArMTEwMCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1vZGUgIT0ga0NyeXB0b01vZGVVbmVuY3J5cHRlZCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIG1vZGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCBtb2RlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMDg1LDYgKzExMjcsNyBAQAogCiAgICAgICAgICAgICBpZiAoZW50cnlfY291bnQgIT0gMSkgewogICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCBhIHNpbmdsZSBlbnRyeSBhdCB0aGUgbW9tZW50LCBmb3IgZ2FwbGVzcyBwbGF5YmFjaworICAgICAgICAgICAgICAgIC8vIG9yIHN0YXJ0IG9mZnNldAogICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyBlZGl0IGxpc3Qgd2l0aCAlZCBlbnRyaWVzIiwgZW50cnlfY291bnQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBvZmY2NF90IGVudHJpZXNvZmZzZXQgPSBkYXRhX29mZnNldCArIDg7CkBAIC0xMTM0LDEyICsxMTc3LDE1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUob3JpZ2luYWxfZm91cmNjKSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgRm91ckNDMk1JTUUob3JpZ2luYWxfZm91cmNjKSk7CiAgICAgICAgICAgICB1aW50MzJfdCBudW1fY2hhbm5lbHMgPSAwOwogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlX3JhdGUgPSAwOwogICAgICAgICAgICAgaWYgKEFkanVzdENoYW5uZWxzQW5kUmF0ZShvcmlnaW5hbF9mb3VyY2MsICZudW1fY2hhbm5lbHMsICZzYW1wbGVfcmF0ZSkpIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bV9jaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBudW1fY2hhbm5lbHMpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlX3JhdGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBJZiBmb3JtYXQgdHlwZSBpcyAnYWxhYycsIGl0IGlzIG5lY2Vzc2FyeSB0byBnZXQgdGhlIHBhcmFtZXRlcnMKQEAgLTExNjgsMTEgKzEyMTQsMTQgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICB1aW50OF90IGJpdHNQZXJTYW1wbGUgPSBjb29raWVbNV07Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgYml0c1BlclNhbXBsZSk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjb29raWVbOV0pOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIFUzMl9BVCgmY29va2llWzIwXSkpOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUFsYWNNYWdpY0Nvb2tpZSwgTWV0YURhdGE6OlRZUEVfTk9ORSwgY29va2llLCBzaXplb2YoY29va2llKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgYml0c1BlclNhbXBsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNvb2tpZVs5XSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBVMzJfQVQoJmNvb2tpZVsyMF0pKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjb29raWUsIHNpemVvZihjb29raWUpKTsKIAogICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgc2l6ZSBvZiBBTEFDIFNwZWNpZmljIEluZm8gKDM2IGJ5dGVzKSBhbmQgdGVybWluYXRvcgogICAgICAgICAgICAgICAgIC8vIGF0b20gKDggYnl0ZXMpLgpAQCAtMTI3MywxNiArMTMyMiwyMyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQzMl90IHRtcEFsZ29yaXRobUlkOwotICAgICAgICAgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgJnRtcEFsZ29yaXRobUlkKSkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIGRlZmF1bHRBbGdvcml0aG1JZCk7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCAmdG1wQWxnb3JpdGhtSWQpKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCBkZWZhdWx0QWxnb3JpdGhtSWQpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCBkZWZhdWx0SVZTaXplKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAndGVuYycsIGRlZmF1bHRLZXlJZCwgMTYpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrLCBkZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNraXBCeXRlQmxvY2ssIGRlZmF1bHRTa2lwQnl0ZUJsb2NrKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUsIGRlZmF1bHRJVlNpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIGRlZmF1bHRLZXlJZCwgMTYpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9CWVRFX0JMT0NLLCBkZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0ssIGRlZmF1bHRTa2lwQnl0ZUJsb2NrKTsKICAgICAgICAgICAgIGlmIChkZWZhdWx0Q29uc3RhbnRJdiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwgJ2RjaXYnLCBkZWZhdWx0Q29uc3RhbnRJdi0+ZGF0YSgpLCBkZWZhdWx0Q29uc3RhbnRJdi0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENvbnN0YW50SXYtPmRhdGEoKSwgZGVmYXVsdENvbnN0YW50SXYtPnNpemUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTQzMSw4ICsxNDg3LDEzIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IDAgJiYgbUxhc3RUcmFjay0+dGltZXNjYWxlICE9IDApIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1MYXN0VHJhY2stPnRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUgZHVyYXRpb25VcyA9ICgobG9uZyBkb3VibGUpZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1MYXN0VHJhY2stPnRpbWVzY2FsZTsKKyAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb25VcyA8IDAgfHwgZHVyYXRpb25VcyA+IElOVDY0X01BWCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY2Fubm90IHJlcHJlc2VudCAlbGxkICogMTAwMDAwMCAvICVsbGQgaW4gNjQgYml0cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIGR1cmF0aW9uLCAobG9uZyBsb25nKSBtTGFzdFRyYWNrLT50aW1lc2NhbGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZHVyYXRpb25Vcyk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHVpbnQ4X3QgbGFuZ1syXTsKQEAgLTE0NTksOCArMTUyMCw3IEBACiAgICAgICAgICAgICBsYW5nX2NvZGVbMl0gPSAobGFuZ1sxXSAmIDB4MWYpICsgMHg2MDsKICAgICAgICAgICAgIGxhbmdfY29kZVszXSA9ICdcMCc7CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAga0tleU1lZGlhTGFuZ3VhZ2UsIGxhbmdfY29kZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTEFOR1VBR0UsIGxhbmdfY29kZSk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNDk0LDcgKzE1NTQsNyBAQAogICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgICAgICAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKICAgICAgICAgICAgICAgICBpZiAoc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjYXNlY21wKG1pbWUsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCBhIHNpbmdsZSB0eXBlIG9mIG1lZGlhIHBlciB0cmFjay4KQEAgLTE1MzQsOSArMTU5NCw0MCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgU3RyaW5nOCBtaW1lRm9ybWF0KChjb25zdCBjaGFyICopKGJ1ZmZlci5nZXQoKSksIGNodW5rX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lRm9ybWF0LnN0cmluZygpKTsKKyAgICAgICAgICAgIC8vIFByaW9yIHRvIEFQSSAyOSwgdGhlIG1ldGFkYXRhIHRyYWNrIHdhcyBub3QgY29tcGxpYW50IHdpdGggSVNPL0lFQworICAgICAgICAgICAgLy8gMTQ0OTYtMTItMjAxNS4gVGhpcyBsZWQgdG8gc29tZSBJU08tY29tcGxpYW50IHBhcnNlcnMgZmFpbGluZyB0byByZWFkIHRoZQorICAgICAgICAgICAgLy8gbWV0YXRyYWNrLiBBcyBvZiBBUEkgMjkgYW5kIG9ud2FyZHMsIGEgY2hhbmdlIHdhcyBtYWRlIHRvIG1ldGFkYXRhIHRyYWNrIHRvCisgICAgICAgICAgICAvLyBtYWtlIGl0IGNvbXBsaWFudCB3aXRoIHRoZSBzdGFuZGFyZC4gVGhlIHdvcmthcm91bmQgaXMgdG8gd3JpdGUgdGhlCisgICAgICAgICAgICAvLyBudWxsLXRlcm1pbmF0ZWQgbWltZV9mb3JtYXQgc3RyaW5nIHR3aWNlLiBUaGlzIGFsbG93cyBjb21wbGlhbnQgcGFyc2VycyB0bworICAgICAgICAgICAgLy8gcmVhZCB0aGUgbWlzc2luZyByZXNlcnZlZCwgZGF0YV9yZWZlcmVuY2VfaW5kZXgsIGFuZCBjb250ZW50X2VuY29kaW5nIGZpZWxkcworICAgICAgICAgICAgLy8gZnJvbSB0aGUgZmlyc3QgbWltZV90eXBlIHN0cmluZy4gVGhlIGFjdHVhbCBtaW1lX2Zvcm1hdCBmaWVsZCB3b3VsZCB0aGVuIGJlCisgICAgICAgICAgICAvLyByZWFkIGNvcnJlY3RseSBmcm9tIHRoZSBzZWNvbmQgc3RyaW5nLiBUaGUgbm9uLWNvbXBsaWFudCBBbmRyb2lkIGZyYW1ld29ya3MKKyAgICAgICAgICAgIC8vIGZyb20gQVBJIDI4IGFuZCBlYXJsaWVyIHdvdWxkIHN0aWxsIGJlIGFibGUgdG8gcmVhZCB0aGUgbWltZV9mb3JtYXQgY29ycmVjdGx5CisgICAgICAgICAgICAvLyBhcyBpdCB3b3VsZCBvbmx5IHJlYWQgdGhlIGZpcnN0IG51bGwtdGVybWluYXRlZCBtaW1lX2Zvcm1hdCBzdHJpbmcuIFRvIGVuYWJsZQorICAgICAgICAgICAgLy8gcmVhZGluZyBtZXRhZGF0YSB0cmFja3MgZ2VuZXJhdGVkIGZyb20gYm90aCB0aGUgbm9uLWNvbXBsaWFudCBhbmQgY29tcGxpYW50CisgICAgICAgICAgICAvLyBmb3JtYXRzLCBhIGNoZWNrIG5lZWRzIHRvIGJlIGRvbmUgdG8gc2VlIHdoaWNoIGZvcm1hdCBpcyB1c2VkLgorICAgICAgICAgICAgaW50IG51bGxfcG9zID0gMDsKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0ciA9IGJ1ZmZlci5nZXQoKTsKKyAgICAgICAgICAgIHdoaWxlIChudWxsX3BvcyA8IGNodW5rX2RhdGFfc2l6ZSkgeworICAgICAgICAgICAgICBpZiAoKihzdHIgKyBudWxsX3BvcykgPT0gJ1wwJykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICsrbnVsbF9wb3M7CisgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChudWxsX3BvcyA9PSBjaHVua19kYXRhX3NpemUgLSAxKSB7CisgICAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgc3RhbmRhcmQgb21wbGlhbnQgbWV0YWRhdGEgdHJhY2suCisgICAgICAgICAgICAgIFN0cmluZzggbWltZUZvcm1hdCgoY29uc3QgY2hhciAqKShidWZmZXIuZ2V0KCkpLCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIG1pbWVGb3JtYXQuc3RyaW5nKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHN0YW5kYXJkIGNvbXBsaWFudCBtZXRhZGF0YSB0cmFjay4KKyAgICAgICAgICAgICAgU3RyaW5nOCBjb250ZW50RW5jb2RpbmcoKGNvbnN0IGNoYXIgKikoYnVmZmVyLmdldCgpICsgOCkpOworICAgICAgICAgICAgICBTdHJpbmc4IG1pbWVGb3JtYXQoKGNvbnN0IGNoYXIgKikoYnVmZmVyLmdldCgpICsgOCArIGNvbnRlbnRFbmNvZGluZy5zaXplKCkgKyAxKSwKKyAgICAgICAgICAgICAgICAgIGNodW5rX2RhdGFfc2l6ZSAtIDggLSBjb250ZW50RW5jb2Rpbmcuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgbWltZUZvcm1hdC5zdHJpbmcoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xNTQ3LDEwICsxNjM4LDExIEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCJ0d29zIik6CiAgICAgICAgIGNhc2UgRk9VUkNDKCJzb3d0Iik6CiAgICAgICAgIGNhc2UgRk9VUkNDKCJhbGFjIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCIubXAzIik6CisgICAgICAgIGNhc2UgMHg2RDczMDA1NTogLy8gIm1zIFUiIG1wMyBhdWRpbwogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobUlzUVQgJiYgY2h1bmtfdHlwZSA9PSBGT1VSQ0MoIm1wNGEiKQotICAgICAgICAgICAgICAgICAgICAmJiBkZXB0aCA+PSAxICYmIG1QYXRoW2RlcHRoIC0gMV0gPT0gRk9VUkNDKCJ3YXZlIikpIHsKLSAgICAgICAgICAgICAgICAvLyBJZ25vcmUgbXA0YSBlbWJlZGRlZCBpbiBRVCB3YXZlIGF0b20KKyAgICAgICAgICAgIGlmIChtSXNRVCAmJiBkZXB0aCA+PSAxICYmIG1QYXRoW2RlcHRoIC0gMV0gPT0gRk9VUkNDKCJ3YXZlIikpIHsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUgYWxsIGF0b21zIGVtYmVkZGVkIGluIFFUIHdhdmUgYXRvbQogICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTE1NzksNyArMTY3MSw3IEBACiAgICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CiAgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQgKyBzaXplb2YoYnVmZmVyKTsKIAotICAgICAgICAgICAgaWYgKG1Jc1FUICYmIGNodW5rX3R5cGUgPT0gRk9VUkNDKCJtcDRhIikpIHsKKyAgICAgICAgICAgIGlmIChtSXNRVCkgewogICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgYnVmZmVyLCAxNikgPCAxNikgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwpAQCAtMTYxNCwyMCArMTcwNiwyMyBAQAogCiAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSAhPSBGT1VSQ0MoImVuY2EiKSkgewogICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjaHVuayB0eXBlIGlzIGVuY2EsIHdlJ2xsIGdldCB0aGUgdHlwZSBmcm9tIHRoZSBmcm1hIGJveCBsYXRlcgotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIEZvdXJDQzJNSU1FKGNodW5rX3R5cGUpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIEZvdXJDQzJNSU1FKGNodW5rX3R5cGUpKTsKICAgICAgICAgICAgICAgICBBZGp1c3RDaGFubmVsc0FuZFJhdGUoY2h1bmtfdHlwZSwgJm51bV9jaGFubmVscywgJnNhbXBsZV9yYXRlKTsKIAogICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19SQVcsIEZvdXJDQzJNSU1FKGNodW5rX3R5cGUpKSkgewotICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCBzYW1wbGVfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFLCBzYW1wbGVfc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygidHdvcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlQY21CaWdFbmRpYW4sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfUENNX0JJR19FTkRJQU4sIDEpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoIioqKiBjb2Rpbmc9JyVzJyAlZCBjaGFubmVscywgc2l6ZSAlZCwgcmF0ZSAlZFxuIiwKICAgICAgICAgICAgICAgICAgICBjaHVuaywgbnVtX2NoYW5uZWxzLCBzYW1wbGVfc2l6ZSwgc2FtcGxlX3JhdGUpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1fY2hhbm5lbHMpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbnVtX2NoYW5uZWxzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBzYW1wbGVfcmF0ZSk7CiAKICAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygiYWxhYyIpKSB7CiAKQEAgLTE2NTMsMTEgKzE3NDgsMTQgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICB1aW50OF90IGJpdHNQZXJTYW1wbGUgPSBjb29raWVbNV07Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgYml0c1BlclNhbXBsZSk7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjb29raWVbOV0pOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIFUzMl9BVCgmY29va2llWzIwXSkpOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlBbGFjTWFnaWNDb29raWUsIE1ldGFEYXRhOjpUWVBFX05PTkUsIGNvb2tpZSwgc2l6ZW9mKGNvb2tpZSkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsIGJpdHNQZXJTYW1wbGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBjb29raWVbOV0pOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgVTMyX0FUKCZjb29raWVbMjBdKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgY29va2llLCBzaXplb2YoY29va2llKSk7CiAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gc2l6ZW9mKGNvb2tpZSk7CiAgICAgICAgICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0OwogICAgICAgICAgICAgICAgIENIRUNLX0VRKCpvZmZzZXQsIHN0b3Bfb2Zmc2V0KTsKQEAgLTE2ODQsNiArMTc4Miw3IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCJhdmMxIik6CiAgICAgICAgIGNhc2UgRk9VUkNDKCJodmMxIik6CiAgICAgICAgIGNhc2UgRk9VUkNDKCJoZXYxIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJhdjAxIik6CiAgICAgICAgIHsKICAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzc4XTsKICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAoc3NpemVfdClzaXplb2YoYnVmZmVyKSkgewpAQCAtMTcxNSwxMCArMTgxNCwxMSBAQAogCiAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSAhPSBGT1VSQ0MoImVuY3YiKSkgewogICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjaHVuayB0eXBlIGlzIGVuY3YsIHdlJ2xsIGdldCB0aGUgdHlwZSBmcm9tIHRoZSBmcm1hIGJveCBsYXRlcgotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIEZvdXJDQzJNSU1FKGNodW5rX3R5cGUpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIEZvdXJDQzJNSU1FKGNodW5rX3R5cGUpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgd2lkdGgpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCBoZWlnaHQpOwogCiAgICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CiAgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQgKyBzaXplb2YoYnVmZmVyKTsKQEAgLTE4MDYsMTIgKzE5MDYsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm1heCBzYW1wbGUgc2l6ZSB0b28gYmlnOiAlenUiLCBtYXhfc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4X3NpemUgKyAxMCAqIDIpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgbWF4X3NpemUgKyAxMCAqIDIpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBObyBzaXplIHdhcyBzcGVjaWZpZWQuIFBpY2sgYSBjb25zZXJ2YXRpdmVseSBsYXJnZSBzaXplLgogICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5V2lkdGgsIChpbnQzMl90Kikmd2lkdGgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICFtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5SGVpZ2h0LChpbnQzMl90KikgJmhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgKGludDMyX3QqKSZ3aWR0aCkgfHwKKyAgICAgICAgICAgICAgICAgICAgIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULChpbnQzMl90KikgJmhlaWdodCkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vIHdpZHRoIG9yIGhlaWdodCwgYXNzdW1pbmcgd29yc3QgY2FzZSAxMDgwcCIpOwogICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDE5MjA7CiAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IDEwODA7CkBAIC0xODI2LDcgKzE5MjksNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAgICAgICAgICAgICAgICAgaWYgKCFzdHJuY21wKG1pbWUsICJhdWRpby8iLCA2KSkgewogICAgICAgICAgICAgICAgICAgICAvLyBmb3IgYXVkaW8sIHVzZSAxMjhLQgogICAgICAgICAgICAgICAgICAgICBtYXhfc2l6ZSA9IDEwMjQgKiAxMjg7CkBAIC0xODQzLDI2ICsxOTQ2LDI4IEBACiAgICAgICAgICAgICAgICAgLy8gSEFDSzogYWxsb3cgMTAlIG92ZXJoZWFkCiAgICAgICAgICAgICAgICAgLy8gVE9ETzogcmVhZCBzYW1wbGUgc2l6ZSBmcm9tIHRyYWYgYXRvbSBmb3IgZnJhZ21lbnRlZCBNUEVHNC4KICAgICAgICAgICAgICAgICBtYXhfc2l6ZSArPSBtYXhfc2l6ZSAvIDEwOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4X3NpemUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBtYXhfc2l6ZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIE5PVEU6IHNldHRpbmcgYW5vdGhlciBwaWVjZSBvZiBtZXRhZGF0YSBpbnZhbGlkYXRlcyBhbnkgcG9pbnRlcnMgKHN1Y2ggYXMgdGhlCiAgICAgICAgICAgICAvLyBtaW1ldHlwZSkgcHJldmlvdXNseSBvYnRhaW5lZCwgc28gZG9uJ3QgY2FjaGUgdGhlbS4KICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgICAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICAgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGF2ZXJhZ2UgZnJhbWUgcmF0ZS4KICAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKSB7CiAgICAgICAgICAgICAgICAgc2l6ZV90IG5TYW1wbGVzID0gbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPmNvdW50U2FtcGxlcygpOwogICAgICAgICAgICAgICAgIGlmIChuU2FtcGxlcyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHJhY2tJZDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlUcmFja0lELCAmdHJhY2tJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQsICZ0cmFja0lkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJleC5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZXggKnQgPSAmbVRyZXguZWRpdEl0ZW1BdChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC0+dHJhY2tfSUQgPT0gKHVpbnQzMl90KSB0cmFja0lkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LT5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbiA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVSYXRlID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+dGltZXNjYWxlIC8gdC0+ZGVmYXVsdF9zYW1wbGVfZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlGcmFtZVJhdGUsIGZyYW1lUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLCBmcmFtZVJhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTE4NzAsMTUgKzE5NzUsMTggQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2stPm1ldGEuZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0SW50NjQobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmZHVyYXRpb25VcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvblVzID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVSYXRlID0gKG5TYW1wbGVzICogMTAwMDAwMExMICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZHVyYXRpb25VcyA+PiAxKSkgLyBkdXJhdGlvblVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUZyYW1lUmF0ZSwgZnJhbWVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSwgZnJhbWVSYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBBTE9HVigic2V0dGluZyBmcmFtZSBjb3VudCAlenUiLCBuU2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUZyYW1lQ291bnQsIG5TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9DT1VOVCwgblNhbXBsZXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtMTg5Miw2ICsyMDAwLDEzIEBACiAKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKIAorICAgICAgICAgICAgaWYgKGRlcHRoID49IDEgJiYgbVBhdGhbZGVwdGggLSAxXSAhPSBGT1VSQ0MoInN0YmwiKSkgeworICAgICAgICAgICAgICAgIGNoYXIgY2h1bmtbNV07CisgICAgICAgICAgICAgICAgTWFrZUZvdXJDQ1N0cmluZyhtUGF0aFtkZXB0aCAtIDFdLCBjaHVuayk7CisgICAgICAgICAgICAgICAgQUxPR1coInN0dHMncyBwYXJlbnQgYm94ICglcykgaXMgbm90IHN0YmwsIHNraXAgaXQuIiwgY2h1bmspOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRUaW1lVG9TYW1wbGVQYXJhbXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKQEAgLTE5ODYsNyArMjEwMSw3IEBACiAgICAgICAgICAgICBpZiAoYnVmZmVyW2xlbiAtIDFdICE9ICcvJykgewogICAgICAgICAgICAgICAgIGJ1ZmZlcltsZW5dID0gJy8nOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlMb2NhdGlvbiwgJmJ1ZmZlclswXSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfTE9DQVRJT04sICZidWZmZXJbMF0pOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTk5OCw5ICsyMTEzLDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgdWludDhfdCBidWZmZXJbMjU2XTsKLSAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPiAob2ZmNjRfdClzaXplb2YoYnVmZmVyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9CVUZGRVJfVE9PX1NNQUxMOworICAgICAgICAgICAgYXV0byB0bXAgPSBoZWFwYnVmZmVyPHVpbnQ4X3Q+KGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICB1aW50OF90ICpidWZmZXIgPSB0bXAuZ2V0KCk7CisgICAgICAgICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCkBAIC0yMDE2LDggKzIxMzIsOCBAQAogICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlFU0RTLCBrVHlwZUVTRFMsICZidWZmZXJbNF0sIGNodW5rX2RhdGFfc2l6ZSAtIDQpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLCAKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9FU0RTLCAmYnVmZmVyWzRdLCBjaHVua19kYXRhX3NpemUgLSA0KTsKIAogICAgICAgICAgICAgaWYgKG1QYXRoLnNpemUoKSA+PSAyCiAgICAgICAgICAgICAgICAgICAgICYmIG1QYXRoW21QYXRoLnNpemUoKSAtIDJdID09IEZPVVJDQygibXA0YSIpKSB7CkBAIC0yMDQxLDcgKzIxNTcsOCBAQAogICAgICAgICAgICAgICAgIHVpbnQ4X3Qgb2JqZWN0VHlwZUluZGljYXRpb247CiAgICAgICAgICAgICAgICAgaWYgKGVzZHMuZ2V0T2JqZWN0VHlwZUluZGljYXRpb24oJm9iamVjdFR5cGVJbmRpY2F0aW9uKSA9PSBPSykgewogICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0VHlwZUluZGljYXRpb24gPj0gMHg2MCAmJiBvYmplY3RUeXBlSW5kaWNhdGlvbiA8PSAweDY1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjA2OCwxMCArMjE4NSwxMiBAQAogICAgICAgICAgICAgdWludDMyX3QgbWF4Qml0cmF0ZSA9IFUzMl9BVCgmYnVmZmVyWzRdKTsKICAgICAgICAgICAgIHVpbnQzMl90IGF2Z0JpdHJhdGUgPSBVMzJfQVQoJmJ1ZmZlcls4XSk7CiAgICAgICAgICAgICBpZiAobWF4Qml0cmF0ZSA+IDAgJiYgbWF4Qml0cmF0ZSA8IElOVDMyX01BWCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleU1heEJpdFJhdGUsIChpbnQzMl90KW1heEJpdHJhdGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfQklUX1JBVEUsIChpbnQzMl90KW1heEJpdHJhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGF2Z0JpdHJhdGUgPiAwICYmIGF2Z0JpdHJhdGUgPCBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlCaXRSYXRlLCAoaW50MzJfdClhdmdCaXRyYXRlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIChpbnQzMl90KWF2Z0JpdHJhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTIwOTUsOCArMjIxNCw4IEBACiAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUFWQ0MsIGtUeXBlQVZDQywgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLCAKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yMTE3LDEzICsyMjM2LDM1IEBACiAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUhWQ0MsIGtUeXBlSFZDQywgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLCAKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOwogCiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygiYXYxQyIpOgorICAgICAgICB7CisgICAgICAgICAgICBhdXRvIGJ1ZmZlciA9IGhlYXBidWZmZXI8dWludDhfdD4oY2h1bmtfZGF0YV9zaXplKTsKIAorICAgICAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjg0NzEyMDYiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSkgPCBjaHVua19kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKTsKKworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoImQyNjMiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwpAQCAtMjE1Myw3ICsyMjk0LDggQEAKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKGtLZXlEMjYzLCBrVHlwZUQyNjMsIGJ1ZmZlciwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EMjYzLCBidWZmZXIsIGNodW5rX2RhdGFfc2l6ZSk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yMjgxLDE1ICsyNDIzLDE1IEBACiAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBkMzI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDAgJiYgZHVyYXRpb24gPCBVSU5UNjRfTUFYIC8gMTAwMDAwMCkgewotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmc4IHM7CiAgICAgICAgICAgICBpZiAoY29udmVydFRpbWVUb0RhdGUoY3JlYXRpb25UaW1lLCAmcykpIHsKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleURhdGUsIHMuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9EQVRFLCBzLnN0cmluZygpKTsKICAgICAgICAgICAgIH0KIAotCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yMzMxLDcgKzI0NzMsOCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDApIHsKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24gKiAxMDAwMDAwIC8gbUhlYWRlclRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnJlYWs7CkBAIC0yMzY1LDcgKzI1MDgsOCBAQAogICAgICAgICAgICAgLy8gZm9yIGEgcHJhY3RpY2FsIHJlYXNvbiBhcyB2YXJpb3VzIE1QRUc0IGNvbnRhaW5lcnMgdXNlIGl0LgogICAgICAgICAgICAgaWYgKHR5cGUgPT0gRk9VUkNDKCJ0ZXh0IikgfHwgdHlwZSA9PSBGT1VSQ0MoInNidGwiKSkgewogICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTI0MDksMTEgKzI1NTMsMTAgQEAKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgICAgICB2b2lkICpkYXRhOwogICAgICAgICAgICAgc2l6ZV90IHNpemUgPSAwOwotICAgICAgICAgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLmZpbmREYXRhKAotICAgICAgICAgICAgICAgICAgICBrS2V5VGV4dEZvcm1hdERhdGEsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9URVhUX0ZPUk1BVF9EQVRBLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgICAgICAgICAgc2l6ZSA9IDA7CiAgICAgICAgICAgICB9CiAKQEAgLTI0NDAsOCArMjU4Myw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSwgMCwgYnVmZmVyLCBzaXplICsgY2h1bmtfc2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEVYVF9GT1JNQVRfREFUQSwgYnVmZmVyLCBzaXplICsgY2h1bmtfc2l6ZSk7CiAKICAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKIApAQCAtMjQ3Myw4ICsyNjE2LDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAga0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtRmlsZU1ldGFEYXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQsCiAgICAgICAgICAgICAgICAgYnVmZmVyLmdldCgpICsga1NraXBCeXRlc09mRGF0YUJveCwgY2h1bmtfZGF0YV9zaXplIC0ga1NraXBCeXRlc09mRGF0YUJveCk7CiAKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjU0OCw3ICsyNjkxLDQwIEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCJhYy0zIik6CiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKLSAgICAgICAgICAgIHJldHVybiBwYXJzZUFDM1NhbXBsZUVudHJ5KGRhdGFfb2Zmc2V0KTsKKyAgICAgICAgICAgIC8vIGJ5cGFzcyBhYy0zIGlmIHBhcnNlIGZhaWwKKyAgICAgICAgICAgIGlmIChwYXJzZUFDM1NwZWNpZmljQm94KGRhdGFfb2Zmc2V0KSAhPSBPSykgeworICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZhaWwgdG8gcGFyc2UgYWMtMyIpOworICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5za2lwVHJhY2sgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCJlYy0zIik6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIC8vIGJ5cGFzcyBlYy0zIGlmIHBhcnNlIGZhaWwKKyAgICAgICAgICAgIGlmIChwYXJzZUVBQzNTcGVjaWZpY0JveChkYXRhX29mZnNldCkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJGYWlsIHRvIHBhcnNlIGVjLTMiKTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2tpcFRyYWNrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygiYWMtNCIpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAvLyBieXBhc3MgYWMtNCBpZiBwYXJzZSBmYWlsCisgICAgICAgICAgICBpZiAocGFyc2VBQzRTcGVjaWZpY0JveChkYXRhX29mZnNldCkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJGYWlsIHRvIHBhcnNlIGFjLTQiKTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2tpcFRyYWNrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZPVVJDQygiZnR5cCIpOgpAQCAtMjYyMiwzNiArMjc5OCwzMzAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUFDM1NhbXBsZUVudHJ5KG9mZjY0X3Qgb2Zmc2V0KSB7CitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VDaGFubmVsQ291bnRTYW1wbGVSYXRlKAorICAgICAgICBvZmY2NF90ICpvZmZzZXQsIHVpbnQxNl90ICpjaGFubmVsQ291bnQsIHVpbnQxNl90ICpzYW1wbGVSYXRlKSB7CiAgICAgLy8gc2tpcCAxNiBieXRlczoKICAgICAvLyAgKyA2LWJ5dGUgcmVzZXJ2ZWQsCiAgICAgLy8gICsgMi1ieXRlIGRhdGEgcmVmZXJlbmNlIGluZGV4LAogICAgIC8vICArIDgtYnl0ZSByZXNlcnZlZAotICAgIG9mZnNldCArPSAxNjsKLSAgICB1aW50MTZfdCBjaGFubmVsQ291bnQ7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KG9mZnNldCwgJmNoYW5uZWxDb3VudCkpIHsKKyAgICAqb2Zmc2V0ICs9IDE2OworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNigqb2Zmc2V0LCBjaGFubmVsQ291bnQpKSB7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBzYW1wbGUgZW50cnkgYm94OiBjYW5ub3QgcmVhZCBjaGFubmVsIGNvdW50Iik7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogICAgIC8vIHNraXAgOCBieXRlczoKICAgICAvLyAgKyAyLWJ5dGUgY2hhbm5lbENvdW50LAogICAgIC8vICArIDItYnl0ZSBzYW1wbGUgc2l6ZSwKICAgICAvLyAgKyA0LWJ5dGUgcmVzZXJ2ZWQKLSAgICBvZmZzZXQgKz0gODsKLSAgICB1aW50MTZfdCBzYW1wbGVSYXRlOwotICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNihvZmZzZXQsICZzYW1wbGVSYXRlKSkgewotICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgYWMtMyBibG9jazogY2Fubm90IHJlYWQgc2FtcGxlIHJhdGUiKTsKKyAgICAqb2Zmc2V0ICs9IDg7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KCpvZmZzZXQsIHNhbXBsZVJhdGUpKSB7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBzYW1wbGUgZW50cnkgYm94OiBjYW5ub3QgcmVhZCBzYW1wbGUgcmF0ZSIpOwogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KLQogICAgIC8vIHNraXAgNCBieXRlczoKICAgICAvLyAgKyAyLWJ5dGUgc2FtcGxlUmF0ZSwKICAgICAvLyAgKyAyLWJ5dGUgcmVzZXJ2ZWQKLSAgICBvZmZzZXQgKz0gNDsKLSAgICByZXR1cm4gcGFyc2VBQzNTcGVjaWZpY0JveChvZmZzZXQsIHNhbXBsZVJhdGUpOworICAgICpvZmZzZXQgKz0gNDsKKyAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUFDM1NwZWNpZmljQm94KAotICAgICAgICBvZmY2NF90IG9mZnNldCwgdWludDE2X3Qgc2FtcGxlUmF0ZSkgeworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQUM0U3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDE2X3Qgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50OworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcnNlQ2hhbm5lbENvdW50U2FtcGxlUmF0ZSgmb2Zmc2V0LCAmY2hhbm5lbENvdW50LCAmc2FtcGxlUmF0ZSkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHVpbnQzMl90IHNpemU7CisgICAgLy8gKyA0LWJ5dGUgc2l6ZQorICAgIC8vICsgNC1ieXRlIHR5cGUKKyAgICAvLyArIDMtYnl0ZSBwYXlsb2FkCisgICAgY29uc3QgdWludDMyX3Qga0FDNE1pbmltdW1Cb3hTaXplID0gNCArIDQgKyAzOworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZzaXplKSB8fCBzaXplIDwga0FDNE1pbmltdW1Cb3hTaXplKSB7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBhYy00IGJsb2NrOiBjYW5ub3QgcmVhZCBzcGVjaWZpYyBib3ggc2l6ZSIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIC8vICsgNC1ieXRlIHNpemUKKyAgICBvZmZzZXQgKz0gNDsKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZ0eXBlKSB8fCB0eXBlICE9IEZPVVJDQygiZGFjNCIpKSB7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBhYy00IHNwZWNpZmljIGJsb2NrOiBoZWFkZXIgbm90IGRhYzQiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICAvLyArIDQtYnl0ZSB0eXBlCisgICAgb2Zmc2V0ICs9IDQ7CisgICAgY29uc3QgdWludDMyX3Qga0FDNFNwZWNpZmljQm94UGF5bG9hZFNpemUgPSAxMTc2OworICAgIHVpbnQ4X3QgY2h1bmtba0FDNFNwZWNpZmljQm94UGF5bG9hZFNpemVdOworICAgIHNzaXplX3QgZHNpU2l6ZSA9IHNpemUgLSA4OyAvLyBzaXplIG9mIGJveCAtIHNpemUgYW5kIHR5cGUgZmllbGRzCisgICAgaWYgKGRzaVNpemUgPj0gKHNzaXplX3Qpa0FDNFNwZWNpZmljQm94UGF5bG9hZFNpemUgfHwKKyAgICAgICAgbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGNodW5rLCBkc2lTaXplKSAhPSBkc2lTaXplKSB7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBhYy00IHNwZWNpZmljIGJsb2NrOiBiaXRzdHJlYW0gZmllbGRzIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIC8vICsgc2l6ZS1ieXRlIHBheWxvYWQKKyAgICBvZmZzZXQgKz0gZHNpU2l6ZTsKKyAgICBBQml0UmVhZGVyIGJyKGNodW5rLCBkc2lTaXplKTsKKyAgICBBQzREU0lQYXJzZXIgcGFyc2VyKGJyKTsKKyAgICBpZiAoIXBhcnNlci5wYXJzZSgpKXsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSBwYXJzaW5nIGFjLTQgc3BlY2lmaWMgYmxvY2siKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBjaGFubmVsQ291bnQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBzYW1wbGVSYXRlKTsKKworICAgIEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiBwcmVzZW50YXRpb25zOworICAgIC8vIHRyYW5zbGF0ZSB0aGUgQUM0IHByZXNlbnRhdGlvbiBpbmZvcm1hdGlvbiB0byBhdWRpbyBwcmVzZW50YXRpb25zIGZvciB0aGlzIHRyYWNrCisgICAgQUM0RFNJUGFyc2VyOjpBQzRQcmVzZW50YXRpb25zIGFjNFByZXNlbnRhdGlvbnMgPSBwYXJzZXIuZ2V0UHJlc2VudGF0aW9ucygpOworICAgIGlmICghYWM0UHJlc2VudGF0aW9ucy5lbXB0eSgpKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgYWM0UHJlc2VudGF0aW9uIDogYWM0UHJlc2VudGF0aW9ucykgeworICAgICAgICAgICAgYXV0byYgcHJlc2VudGF0aW9uID0gYWM0UHJlc2VudGF0aW9uLnNlY29uZDsKKyAgICAgICAgICAgIGlmICghcHJlc2VudGF0aW9uLm1FbmFibGVkKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBdWRpb1ByZXNlbnRhdGlvblYxIGFwOworICAgICAgICAgICAgYXAubVByZXNlbnRhdGlvbklkID0gcHJlc2VudGF0aW9uLm1Hcm91cEluZGV4OworICAgICAgICAgICAgYXAubVByb2dyYW1JZCA9IHByZXNlbnRhdGlvbi5tUHJvZ3JhbUlEOworICAgICAgICAgICAgYXAubUxhbmd1YWdlID0gcHJlc2VudGF0aW9uLm1MYW5ndWFnZTsKKyAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb24ubVByZVZpcnR1YWxpemVkKSB7CisgICAgICAgICAgICAgICAgYXAubU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJFRF9GT1JfSEVBRFBIT05FOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHByZXNlbnRhdGlvbi5tQ2hhbm5lbE1vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlX01vbm86CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV9TdGVyZW86CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbiA9IE1BU1RFUkVEX0ZPUl9TVEVSRU87CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzNfMDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzVfMDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzVfMToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzdfMF8zNDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzdfMV8zNDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzdfMF81MjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzdfMV81MjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uID0gTUFTVEVSRURfRk9SX1NVUlJPVU5EOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzBfMzIyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18xXzMyMjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzdfMF80OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18xXzQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV85XzBfNDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzlfMV80OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfMjJfMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uID0gTUFTVEVSRURfRk9SXzNEOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjaGFubmVsIG1vZGUgaW4gQUM0IHByZXNlbnRhdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFwLm1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlID0gKHByZXNlbnRhdGlvbi5tQ29udGVudENsYXNzaWZpZXIgPT0KKyAgICAgICAgICAgICAgICAgICAgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtWaXN1YWxseUltcGFpcmVkKTsKKyAgICAgICAgICAgIGFwLm1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUgPSAocHJlc2VudGF0aW9uLm1Db250ZW50Q2xhc3NpZmllciA9PQorICAgICAgICAgICAgICAgICAgICBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a1ZvaWNlT3Zlcik7CisgICAgICAgICAgICBhcC5tRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSA9IHByZXNlbnRhdGlvbi5tSGFzRGlhbG9nRW5oYW5jZW1lbnRzOworICAgICAgICAgICAgaWYgKCFhcC5tTGFuZ3VhZ2UuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGFwLm1MYWJlbHMuZW1wbGFjZShhcC5tTGFuZ3VhZ2UsIHByZXNlbnRhdGlvbi5tRGVzY3JpcHRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJlc2VudGF0aW9ucy5wdXNoX2JhY2soc3RkOjptb3ZlKGFwKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHJlc2VudGF0aW9ucy5lbXB0eSgpKSB7CisgICAgICAgIC8vIENsZWFyIGF1ZGlvIHByZXNlbnRhdGlvbiBpbmZvIGluIG1ldGFkYXRhLgorICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKAorICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8sIG51bGxwdHIsIDApOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXRTdHJlYW0oc3RkOjppb3M6Om91dCk7CisgICAgICAgIHNlcmlhbGl6ZUF1ZGlvUHJlc2VudGF0aW9ucyhwcmVzZW50YXRpb25zLCAmb3V0U3RyZWFtKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcigKKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9JTkZPLAorICAgICAgICAgICAgICAgIG91dFN0cmVhbS5zdHIoKS5kYXRhKCksIG91dFN0cmVhbS5zdHIoKS5zaXplKCkpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUVBQzNTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCkgeworICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50MTZfdCBzYW1wbGVSYXRlLCBjaGFubmVsczsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKChzdGF0dXMgPSBwYXJzZUNoYW5uZWxDb3VudFNhbXBsZVJhdGUoJm9mZnNldCwgJmNoYW5uZWxzLCAmc2FtcGxlUmF0ZSkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHVpbnQzMl90IHNpemU7CisgICAgLy8gKyA0LWJ5dGUgc2l6ZQorICAgIC8vICsgNC1ieXRlIHR5cGUKKyAgICAvLyArIDMtYnl0ZSBwYXlsb2FkCisgICAgY29uc3QgdWludDMyX3Qga0VBQzNTcGVjaWZpY0JveE1pblNpemUgPSAxMTsKKyAgICAvLyAxMyArIDMgKyAoOCAqICgyICsgNSArIDUgKyAzICsgMSArIDMgKyA0ICsgKDE0ICogOSArIDEpKSkgYml0cyA9PSAxNTIgYnl0ZXMgdGhlb3JldGljYWwgbWF4CisgICAgLy8gY2FsY3VsYXRlZCBmcm9tIHRoZSByZXF1aXJlZCBiaXRzIHJlYWQgYmVsb3cgYXMgd2VsbCBhcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW5kZXBlbmRlbnQKKyAgICAvLyBhbmQgZGVwZW5kYW50IHN1YiBzdHJlYW1zIHlvdSBjYW4gaGF2ZQorICAgIGNvbnN0IHVpbnQzMl90IGtFQUMzU3BlY2lmaWNCb3hNYXhTaXplID0gMTUyOworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZzaXplKSB8fAorICAgICAgICBzaXplIDwga0VBQzNTcGVjaWZpY0JveE1pblNpemUgfHwKKyAgICAgICAgc2l6ZSA+IGtFQUMzU3BlY2lmaWNCb3hNYXhTaXplKSB7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBlYWMtMyBibG9jazogY2Fubm90IHJlYWQgc3BlY2lmaWMgYm94IHNpemUiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBvZmZzZXQgKz0gNDsKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZ0eXBlKSB8fCB0eXBlICE9IEZPVVJDQygiZGVjMyIpKSB7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBlYWMtMyBzcGVjaWZpYyBibG9jazogaGVhZGVyIG5vdCBkZWMzIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgb2Zmc2V0ICs9IDQ7CisgICAgdWludDhfdCogY2h1bmsgPSBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtzaXplXTsKKyAgICBpZiAoY2h1bmsgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgY2h1bmssIHNpemUpICE9IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGVhYy0zIHNwZWNpZmljIGJsb2NrOiBiaXRzdHJlYW0gZmllbGRzIik7CisgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIEFCaXRSZWFkZXIgYnIoY2h1bmssIHNpemUpOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFubmVsQ291bnRUYWJsZVtdID0gezIsIDEsIDIsIDMsIDMsIDQsIDQsIDV9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGVSYXRlVGFibGVbXSA9IHs0ODAwMCwgNDQxMDAsIDMyMDAwfTsKKworICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMTYpIHsKKyAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHVuc2lnbmVkIGRhdGFfcmF0ZSA9IGJyLmdldEJpdHMoMTMpOworICAgIEFMT0dWKCJFQUMzIGRhdGEgcmF0ZSA9ICVkIiwgZGF0YV9yYXRlKTsKKworICAgIHVuc2lnbmVkIG51bV9pbmRfc3ViID0gYnIuZ2V0Qml0cygzKSArIDE7CisgICAgQUxPR1YoIkVBQzMgaW5kZXBlbmRhbnQgc3Vic3RyZWFtcyA9ICVkIiwgbnVtX2luZF9zdWIpOworICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgKG51bV9pbmRfc3ViICogMjMpKSB7CisgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bV9pbmRfc3ViOyBpKyspIHsKKyAgICAgICAgdW5zaWduZWQgZnNjb2QgPSBici5nZXRCaXRzKDIpOworICAgICAgICBpZiAoZnNjb2QgPT0gMykgeworICAgICAgICAgICAgQUxPR0UoIkluY29ycmVjdCBmc2NvZCAoMykgaW4gRUFDMyBoZWFkZXIiKTsKKyAgICAgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICB1bnNpZ25lZCBib3hTYW1wbGVSYXRlID0gc2FtcGxlUmF0ZVRhYmxlW2ZzY29kXTsKKyAgICAgICAgaWYgKGJveFNhbXBsZVJhdGUgIT0gc2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgQUxPR0UoInNhbXBsZSByYXRlIG1pc21hdGNoOiBib3hTYW1wbGVSYXRlID0gJWQsIHNhbXBsZVJhdGUgPSAlZCIsCisgICAgICAgICAgICAgICAgYm94U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICB1bnNpZ25lZCBic2lkID0gYnIuZ2V0Qml0cyg1KTsKKyAgICAgICAgaWYgKGJzaWQgPT0gOSB8fCBic2lkID09IDEwKSB7CisgICAgICAgICAgICBBTE9HVygiRUFDMyBzdHJlYW0gKGJzaWQ9JWQpIG1heSBiZSBzaWxlbmNlZCBieSB0aGUgZGVjb2RlciIsIGJzaWQpOworICAgICAgICB9IGVsc2UgaWYgKGJzaWQgPiAxNikgeworICAgICAgICAgICAgQUxPR0UoIkVBQzMgc3RyZWFtIChic2lkPSVkKSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIEVUU0kgVFMgMTAyIDM2NiB2MS40LjEiLCBic2lkKTsKKyAgICAgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNraXAKKyAgICAgICAgYnIuc2tpcEJpdHMoMik7CisgICAgICAgIHVuc2lnbmVkIGJzbW9kID0gYnIuZ2V0Qml0cygzKTsKKyAgICAgICAgdW5zaWduZWQgYWNtb2QgPSBici5nZXRCaXRzKDMpOworICAgICAgICB1bnNpZ25lZCBsZmVvbiA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgIC8vIHdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgdGhlIGZpcnN0IHN0cmVhbQorICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50VGFibGVbYWNtb2RdICsgbGZlb247CisgICAgICAgIEFMT0dWKCJic21vZCA9ICVkLCBhY21vZCA9ICVkLCBsZmVvbiA9ICVkIiwgYnNtb2QsIGFjbW9kLCBsZmVvbik7CisKKyAgICAgICAgYnIuc2tpcEJpdHMoMyk7CisgICAgICAgIHVuc2lnbmVkIG51bV9kZXBfc3ViID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgQUxPR1YoIkVBQzMgZGVwZW5kYW50IHN1YnN0cmVhbXMgPSAlZCIsIG51bV9kZXBfc3ViKTsKKyAgICAgICAgaWYgKG51bV9kZXBfc3ViICE9IDApIHsKKyAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgOSkgeworICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogY2hhbl9sb2NfdGJsW10gPSB7ICJMYy9SYyIsIkxycy9ScnMiLCJDcyIsIlRzIiwiTHNkL1JzZCIsCisgICAgICAgICAgICAgICAgIkx3L1J3IiwiTHZoL1J2aCIsIkN2aCIsIkxmZTIiIH07CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFuX2xvYyA9IGJyLmdldEJpdHMoOSk7CisgICAgICAgICAgICB1bnNpZ25lZCBtYXNrID0gMTsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCA5OyBqKyssIG1hc2sgPDw9IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGNoYW5fbG9jICYgbWFzaykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IHRoZSBmaXJzdCBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSBhcmUgMiBjaGFubmVscyBpbiB0aGUgbWFzaworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gMCB8fCBqID09IDEgfHwgaiA9PSA0IHx8IGogPT0gNSB8fCBqID09IDYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBBTE9HVigiICVzIiwgY2hhbl9sb2NfdGJsW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyLnNraXBCaXRzKDEpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgIT0gMCkgeworICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDgpIHsKKyAgICAgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICB1bnNpZ25lZCBtYXNrID0gYnIuZ2V0Qml0cyg4KTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgaWYgKCgoMHgxIDw8IGkpICYmIG1hc2spID09IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgOCkgeworICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IHsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY29tcGxleGl0eSA9IGJyLmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJGb3VuZCBhIEpPQyBzdHJlYW0gd2l0aCBjb21wbGV4aXR5ID0gJWQiLCBjb21wbGV4aXR5KTsKKyAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgICAgICBici5za2lwQml0cyg4KTsKKyAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNoYW5uZWxDb3VudCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZVJhdGUpOworCisgICAgZGVsZXRlW10gY2h1bms7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VBQzNTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCkgeworICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50MTZfdCBzYW1wbGVSYXRlLCBjaGFubmVsczsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKChzdGF0dXMgPSBwYXJzZUNoYW5uZWxDb3VudFNhbXBsZVJhdGUoJm9mZnNldCwgJmNoYW5uZWxzLCAmc2FtcGxlUmF0ZSkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQogICAgIHVpbnQzMl90IHNpemU7CiAgICAgLy8gKyA0LWJ5dGUgc2l6ZQogICAgIC8vICsgNC1ieXRlIHR5cGUKQEAgLTI3MDYsMTIgKzMxNzYsOSBAQAogICAgIHVuc2lnbmVkIGxmZW9uID0gYnIuZ2V0Qml0cygxKTsKICAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnRUYWJsZVthY21vZF0gKyBsZmVvbjsKIAotICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICB9Ci0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzKTsKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNoYW5uZWxDb3VudCk7Ci0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDMyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgY2hhbm5lbENvdW50KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlUmF0ZSk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yODMxLDggKzMyOTgsOSBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCiAgICAgaW50NjRfdCBtZXRhRHVyYXRpb247Ci0gICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZtZXRhRHVyYXRpb24pIHx8IG1ldGFEdXJhdGlvbiA9PSAwKSB7Ci0gICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBzaWR4RHVyYXRpb24pOworICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDY0KG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJm1ldGFEdXJhdGlvbikgfHwgbWV0YUR1cmF0aW9uID09IDApIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIHNpZHhEdXJhdGlvbik7CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KQEAgLTI5MzAsNyArMzM5OCw3IEBACiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgICAgIGlmICghc3RyY2FzZWNtcChtTWV0YUtleU1hcFtpbmRleF0uY19zdHIoKSwgImNvbS5hbmRyb2lkLmNhcHR1cmUuZnBzIikpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RmxvYXQoa0tleUNhcHR1cmVGcmFtZXJhdGUsICooZmxvYXQgKikmdmFsKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRGbG9hdChtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0NBUFRVUkVfUkFURSwgKihmbG9hdCAqKSZ2YWwpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChkYXRhVHlwZSA9PSA2NyAmJiBkYXRhU2l6ZSA+PSA0KSB7CiAgICAgICAgIC8vIEJFIHNpZ25lZCBpbnQzMgpAQCAtMjkzOSw3ICszNDA3LDggQEAKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1NZXRhS2V5TWFwW2luZGV4XS5jX3N0cigpLCAiY29tLmFuZHJvaWQudmlkZW8udGVtcG9yYWxfbGF5ZXJzX2NvdW50IikpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJDb3VudCwgdmFsKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRmlsZU1ldGFEYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0NPVU5ULCB2YWwpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gYWRkIG1vcmUga2V5cyBpZiBuZWVkZWQKQEAgLTI5OTMsNyArMzQ2Miw3IEBACiAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVRyYWNrSUQsIGlkKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCwgaWQpOwogCiAgICAgc2l6ZV90IG1hdHJpeE9mZnNldCA9IGR5blNpemUgKyAxNjsKICAgICBpbnQzMl90IGEwMCA9IFUzMl9BVCgmYnVmZmVyW21hdHJpeE9mZnNldF0pOwpAQCAtMzAyOSwxNSArMzQ5OCwxNSBAQAogICAgIH0KIAogICAgIGlmIChyb3RhdGlvbkRlZ3JlZXMgIT0gMCkgewotICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlSb3RhdGlvbiwgcm90YXRpb25EZWdyZWVzKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfUk9UQVRJT04sIHJvdGF0aW9uRGVncmVlcyk7CiAgICAgfQogCiAgICAgLy8gSGFuZGxlIHByZXNlbnRhdGlvbiBkaXNwbGF5IHNpemUsIHdoaWNoIGNvdWxkIGJlIGRpZmZlcmVudAotICAgIC8vIGZyb20gdGhlIGltYWdlIHNpemUgaW5kaWNhdGVkIGJ5IGtLZXlXaWR0aCBhbmQga0tleUhlaWdodC4KKyAgICAvLyBmcm9tIHRoZSBpbWFnZSBzaXplIGluZGljYXRlZCBieSBBTUVESUFGT1JNQVRfS0VZX1dJRFRIIGFuZCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVC4KICAgICB1aW50MzJfdCB3aWR0aCA9IFUzMl9BVCgmYnVmZmVyW2R5blNpemUgKyA1Ml0pOwogICAgIHVpbnQzMl90IGhlaWdodCA9IFUzMl9BVCgmYnVmZmVyW2R5blNpemUgKyA1Nl0pOwotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlXaWR0aCwgd2lkdGggPj4gMTYpOwotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlIZWlnaHQsIGhlaWdodCA+PiAxNik7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9XSURUSCwgd2lkdGggPj4gMTYpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfSEVJR0hULCBoZWlnaHQgPj4gMTYpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMzA2NSw1MCArMzUzNCw1MCBAQAogCiAgICAgdWludDMyX3QgZmxhZ3MgPSBVMzJfQVQoYnVmZmVyKTsKIAotICAgIHVpbnQzMl90IG1ldGFkYXRhS2V5ID0gMDsKKyAgICBjb25zdCBjaGFyICptZXRhZGF0YUtleSA9IG51bGxwdHI7CiAgICAgY2hhciBjaHVua1s1XTsKICAgICBNYWtlRm91ckNDU3RyaW5nKG1QYXRoWzRdLCBjaHVuayk7CiAgICAgQUxPR1YoIm1ldGE6ICVzIEAgJWxsZCIsIGNodW5rLCAobG9uZyBsb25nKW9mZnNldCk7CiAgICAgc3dpdGNoICgoaW50MzJfdCltUGF0aFs0XSkgewogICAgICAgICBjYXNlIEZPVVJDQygiXDI1MWFsYiIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bTsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFsYnVtIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJcMjUxQVJUIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFydGlzdDsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFydGlzdCI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygiYUFSVCIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bUFydGlzdDsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFsYnVtYXJ0aXN0IjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJcMjUxZGF5Iik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVllYXI7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJ5ZWFyIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJcMjUxbmFtIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVRpdGxlOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAidGl0bGUiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoIlwyNTF3cnQiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5V3JpdGVyOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAid3JpdGVyIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJjb3ZyIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFsYnVtQXJ0OworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYWxidW1hcnQiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoImducmUiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoIlwyNTFnZW4iKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5R2VucmU7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJnZW5yZSI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygiY3BpbCIpOgpAQCAtMzExOCw3ICszNTg3LDcgQEAKICAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpYnVmZmVyW3NpemUgLSAxXSk7CiAKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleUNvbXBpbGF0aW9uLCB0bXApOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9DT01QSUxBVElPTiwgdG1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zMTMwLDcgKzM1OTksNyBAQAogICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwVG90YWxUcmFja3MgPSAodWludDE2X3QqKSZidWZmZXJbMTJdOwogICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWQvJWQiLCBudG9ocygqcFRyYWNrKSwgbnRvaHMoKnBUb3RhbFRyYWNrcykpOwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlDRFRyYWNrTnVtYmVyLCB0bXApOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSLCB0bXApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTMxNDIsNyArMzYxMSw3IEBACiAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBUb3RhbERpc2NzID0gKHVpbnQxNl90KikmYnVmZmVyWzEyXTsKICAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiVkLyVkIiwgbnRvaHMoKnBEaXNjKSwgbnRvaHMoKnBUb3RhbERpc2NzKSk7CiAKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleURpc2NOdW1iZXIsIHRtcCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIsIHRtcCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzE4Niw4ICszNjU1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgcGFkZGluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZLCBkZWxheSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX1BBRERJTkcsIHBhZGRpbmcpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCkBAIC0zMjAyLDEyICszNjczLDE0IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBpZiAoc2l6ZSA+PSA4ICYmIG1ldGFkYXRhS2V5ICYmICFtRmlsZU1ldGFEYXRhLmhhc0RhdGEobWV0YWRhdGFLZXkpKSB7Ci0gICAgICAgIGlmIChtZXRhZGF0YUtleSA9PSBrS2V5QWxidW1BcnQpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLAorICAgIHZvaWQgKnRtcERhdGE7CisgICAgc2l6ZV90IHRtcERhdGFTaXplOworICAgIGlmIChzaXplID49IDggJiYgbWV0YWRhdGFLZXkgJiYKKyAgICAgICAgICAgICFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKG1GaWxlTWV0YURhdGEsIG1ldGFkYXRhS2V5LCAmdG1wRGF0YSwgJnRtcERhdGFTaXplKSkgeworICAgICAgICBpZiAoIXN0cmNtcChtZXRhZGF0YUtleSwgImFsYnVtYXJ0IikpIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwgbWV0YWRhdGFLZXksCiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciArIDgsIHNpemUgLSA4KTsKLSAgICAgICAgfSBlbHNlIGlmIChtZXRhZGF0YUtleSA9PSBrS2V5R2VucmUpIHsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG1ldGFkYXRhS2V5LCAiZ2VucmUiKSkgewogICAgICAgICAgICAgaWYgKGZsYWdzID09IDApIHsKICAgICAgICAgICAgICAgICAvLyB1aW50OF90IGdlbnJlIGNvZGUsIGlUdW5lcyBnZW5yZSBjb2RlcyBhcmUKICAgICAgICAgICAgICAgICAvLyB0aGUgc3RhbmRhcmQgaWQzIGNvZGVzLCBleGNlcHQgdGhleSBzdGFydApAQCAtMzIyMSwxOCArMzY5NCwxOCBAQAogICAgICAgICAgICAgICAgIGNoYXIgZ2VucmVbMTBdOwogICAgICAgICAgICAgICAgIHNwcmludGYoZ2VucmUsICIlZCIsIGdlbnJlY29kZSk7CiAKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcobWV0YWRhdGFLZXksIGdlbnJlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIG1ldGFkYXRhS2V5LCBnZW5yZSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWdzID09IDEpIHsKICAgICAgICAgICAgICAgICAvLyBjdXN0b20gZ2VucmUgc3RyaW5nCiAgICAgICAgICAgICAgICAgYnVmZmVyW3NpemVdID0gJ1wwJzsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZygKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFLZXksIChjb25zdCBjaGFyICopYnVmZmVyICsgOCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBidWZmZXJbc2l6ZV0gPSAnXDAnOwogCi0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoCisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIAogICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUtleSwgKGNvbnN0IGNoYXIgKilidWZmZXIgKyA4KTsKICAgICAgICAgfQogICAgIH0KQEAgLTMyNjIsMjEgKzM3MzUsMzEgQEAKICAgICBpbnQzMl90IHR5cGUgPSBVMzJfQVQoJmJ1ZmZlclswXSk7CiAgICAgaWYgKCh0eXBlID09IEZPVVJDQygibmNseCIpICYmIHNpemUgPj0gMTEpCiAgICAgICAgICAgICB8fCAodHlwZSA9PSBGT1VSQ0MoIm5jbGMiKSAmJiBzaXplID49IDEwKSkgewotICAgICAgICBpbnQzMl90IHByaW1hcmllcyA9IFUxNl9BVCgmYnVmZmVyWzRdKTsKLSAgICAgICAgaW50MzJfdCB0cmFuc2ZlciA9IFUxNl9BVCgmYnVmZmVyWzZdKTsKLSAgICAgICAgaW50MzJfdCBjb2VmZnMgPSBVMTZfQVQoJmJ1ZmZlcls4XSk7Ci0gICAgICAgIGJvb2wgZnVsbFJhbmdlID0gKHR5cGUgPT0gRk9VUkNDKCJuY2x4IikpICYmIChidWZmZXJbMTBdICYgMTI4KTsKLQotICAgICAgICBDb2xvckFzcGVjdHMgYXNwZWN0czsKLSAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAotICAgICAgICAgICAgICAgIHByaW1hcmllcywgdHJhbnNmZXIsIGNvZWZmcywgZnVsbFJhbmdlLCBhc3BlY3RzKTsKLQogICAgICAgICAvLyBvbmx5IHN0b3JlIHRoZSBmaXJzdCBjb2xvciBzcGVjaWZpY2F0aW9uCi0gICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5oYXNEYXRhKGtLZXlDb2xvclByaW1hcmllcykpIHsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNvbG9yUHJpbWFyaWVzLCBhc3BlY3RzLm1QcmltYXJpZXMpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5VHJhbnNmZXJGdW5jdGlvbiwgYXNwZWN0cy5tVHJhbnNmZXIpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q29sb3JNYXRyaXgsIGFzcGVjdHMubU1hdHJpeENvZWZmcyk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDb2xvclJhbmdlLCBhc3BlY3RzLm1SYW5nZSk7CisgICAgICAgIGludDMyX3QgZXhpc3RpbmdDb2xvcjsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFLCAmZXhpc3RpbmdDb2xvcikpIHsKKyAgICAgICAgICAgIGludDMyX3QgcHJpbWFyaWVzID0gVTE2X0FUKCZidWZmZXJbNF0pOworICAgICAgICAgICAgaW50MzJfdCBpc290cmFuc2ZlciA9IFUxNl9BVCgmYnVmZmVyWzZdKTsKKyAgICAgICAgICAgIGludDMyX3QgY29lZmZzID0gVTE2X0FUKCZidWZmZXJbOF0pOworICAgICAgICAgICAgYm9vbCBmdWxsUmFuZ2UgPSAodHlwZSA9PSBGT1VSQ0MoIm5jbHgiKSkgJiYgKGJ1ZmZlclsxMF0gJiAxMjgpOworCisgICAgICAgICAgICBpbnQzMl90IHJhbmdlID0gMDsKKyAgICAgICAgICAgIGludDMyX3Qgc3RhbmRhcmQgPSAwOworICAgICAgICAgICAgaW50MzJfdCB0cmFuc2ZlciA9IDA7CisgICAgICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoCisgICAgICAgICAgICAgICAgICAgIHByaW1hcmllcywgaXNvdHJhbnNmZXIsIGNvZWZmcywgZnVsbFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAmcmFuZ2UsICZzdGFuZGFyZCwgJnRyYW5zZmVyKTsKKworICAgICAgICAgICAgaWYgKHJhbmdlICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRSwgcmFuZ2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YW5kYXJkICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9TVEFOREFSRCwgc3RhbmRhcmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyYW5zZmVyICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUiwgdHJhbnNmZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0zMzAzLDI2ICszNzg2LDI2IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICB9CiAKLSAgICB1aW50MzJfdCBtZXRhZGF0YUtleSA9IDA7CisgICAgY29uc3QgY2hhciAqbWV0YWRhdGFLZXkgPSBudWxscHRyOwogICAgIHN3aXRjaCAobVBhdGhbZGVwdGhdKSB7CiAgICAgICAgIGNhc2UgRk9VUkNDKCJ0aXRsIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVRpdGxlOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAidGl0bGUiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoInBlcmYiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QXJ0aXN0OworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYXJ0aXN0IjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJhdXRoIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVdyaXRlcjsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gIndyaXRlciI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygiZ25yZSIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlHZW5yZTsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImdlbnJlIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJhbGJtIik6CkBAIC0zMzMxLDEwICszODE0LDEwIEBACiAgICAgICAgICAgICAgIGNoYXIgdG1wWzRdOwogICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiV1IiwgYnVmZmVyW3NpemUgLSAxXSk7CiAKLSAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlDRFRyYWNrTnVtYmVyLCB0bXApOworICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiwgdG1wKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QWxidW07CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJhbGJ1bSI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygieXJyYyIpOgpAQCAtMzM1Miw3ICszODM1LDcgQEAKICAgICAgICAgICAgIGlmICh5ZWFyIDwgMTAwMDApIHsKICAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiV1IiwgeWVhcik7CiAKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleVllYXIsIHRtcCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX1lFQVIsIHRtcCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzM2MSw3ICszODQ0LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGlmIChtZXRhZGF0YUtleSA+IDApIHsKKyAgICBpZiAobWV0YWRhdGFLZXkpIHsKICAgICAgICAgYm9vbCBpc1VURjggPSB0cnVlOyAvLyBDb21tb24gY2FzZQogICAgICAgICBjaGFyMTZfdCAqZnJhbWVkYXRhID0gTlVMTDsKICAgICAgICAgaW50IGxlbjE2ID0gMDsgLy8gTnVtYmVyIG9mIFVURi0xNiBjaGFyYWN0ZXJzCkBAIC0zMzk3LDExICszODgwLDExIEBACiAKICAgICAgICAgaWYgKGlzVVRGOCkgewogICAgICAgICAgICAgYnVmZmVyW3NpemVdID0gMDsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhtZXRhZGF0YUtleSwgKGNvbnN0IGNoYXIgKilidWZmZXIgKyA2KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgbWV0YWRhdGFLZXksIChjb25zdCBjaGFyICopYnVmZmVyICsgNik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBDb252ZXJ0IGZyb20gVVRGLTE2IHN0cmluZyB0byBVVEYtOCBzdHJpbmcuCiAgICAgICAgICAgICBTdHJpbmc4IHRtcFVURjhzdHIoZnJhbWVkYXRhLCBsZW4xNik7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcobWV0YWRhdGFLZXksIHRtcFVURjhzdHIuc3RyaW5nKCkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBtZXRhZGF0YUtleSwgdG1wVVRGOHN0ci5zdHJpbmcoKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM0MTYsMjcgKzM4OTksMjkgQEAKIAogICAgIGlmIChpZDMuaXNWYWxpZCgpKSB7CiAgICAgICAgIHN0cnVjdCBNYXAgewotICAgICAgICAgICAgaW50IGtleTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZzE7CiAgICAgICAgICAgICBjb25zdCBjaGFyICp0YWcyOwogICAgICAgICB9OwogICAgICAgICBzdGF0aWMgY29uc3QgTWFwIGtNYXBbXSA9IHsKLSAgICAgICAgICAgIHsga0tleUFsYnVtLCAiVEFMQiIsICJUQUwiIH0sCi0gICAgICAgICAgICB7IGtLZXlBcnRpc3QsICJUUEUxIiwgIlRQMSIgfSwKLSAgICAgICAgICAgIHsga0tleUFsYnVtQXJ0aXN0LCAiVFBFMiIsICJUUDIiIH0sCi0gICAgICAgICAgICB7IGtLZXlDb21wb3NlciwgIlRDT00iLCAiVENNIiB9LAotICAgICAgICAgICAgeyBrS2V5R2VucmUsICJUQ09OIiwgIlRDTyIgfSwKLSAgICAgICAgICAgIHsga0tleVRpdGxlLCAiVElUMiIsICJUVDIiIH0sCi0gICAgICAgICAgICB7IGtLZXlZZWFyLCAiVFlFIiwgIlRZRVIiIH0sCi0gICAgICAgICAgICB7IGtLZXlBdXRob3IsICJUWFQiLCAiVEVYVCIgfSwKLSAgICAgICAgICAgIHsga0tleUNEVHJhY2tOdW1iZXIsICJUUksiLCAiVFJDSyIgfSwKLSAgICAgICAgICAgIHsga0tleURpc2NOdW1iZXIsICJUUEEiLCAiVFBPUyIgfSwKLSAgICAgICAgICAgIHsga0tleUNvbXBpbGF0aW9uLCAiVENQIiwgIlRDTVAiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQUxCVU0sICJUQUxCIiwgIlRBTCIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9BUlRJU1QsICJUUEUxIiwgIlRQMSIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVElTVCwgIlRQRTIiLCAiVFAyIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSLCAiVENPTSIsICJUQ00iIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfR0VOUkUsICJUQ09OIiwgIlRDTyIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9USVRMRSwgIlRJVDIiLCAiVFQyIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX1lFQVIsICJUWUUiLCAiVFlFUiIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9BVVRIT1IsICJUWFQiLCAiVEVYVCIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSLCAiVFJLIiwgIlRSQ0siIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiwgIlRQQSIsICJUUE9TIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OLCAiVENQIiwgIlRDTVAiIH0sCiAgICAgICAgIH07CiAgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bU1hcEVudHJpZXMgPSBzaXplb2Yoa01hcCkgLyBzaXplb2Yoa01hcFswXSk7CiAKKyAgICAgICAgdm9pZCAqdG1wRGF0YTsKKyAgICAgICAgc2l6ZV90IHRtcERhdGFTaXplOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1NYXBFbnRyaWVzOyArK2kpIHsKLSAgICAgICAgICAgIGlmICghbUZpbGVNZXRhRGF0YS5oYXNEYXRhKGtNYXBbaV0ua2V5KSkgeworICAgICAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKG1GaWxlTWV0YURhdGEsIGtNYXBbaV0ua2V5LCAmdG1wRGF0YSwgJnRtcERhdGFTaXplKSkgewogICAgICAgICAgICAgICAgIElEMzo6SXRlcmF0b3IgKml0ID0gbmV3IElEMzo6SXRlcmF0b3IoaWQzLCBrTWFwW2ldLnRhZzEpOwogICAgICAgICAgICAgICAgIGlmIChpdC0+ZG9uZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpdDsKQEAgLTM0NTIsNyArMzkzNyw3IEBACiAgICAgICAgICAgICAgICAgaXQtPmdldFN0cmluZygmcyk7CiAgICAgICAgICAgICAgICAgZGVsZXRlIGl0OwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtNYXBbaV0ua2V5LCBzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIGtNYXBbaV0ua2V5LCBzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0zNDYxLDEzICszOTQ2LDEyIEBACiAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBpZDMuZ2V0QWxidW1BcnQoJmRhdGFTaXplLCAmbWltZSk7CiAKICAgICAgICAgaWYgKGRhdGEpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RGF0YShrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsIGRhdGEsIGRhdGFTaXplKTsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCBtaW1lLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCwgZGF0YSwgZGF0YVNpemUpOwogICAgICAgICB9CiAgICAgfQogfQogCi1NZWRpYVRyYWNrICpNUEVHNEV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNUEVHNEV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGlmICgoZXJyID0gcmVhZE1ldGFEYXRhKCkpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzQ5MCw3ICszOTc0LDcgQEAKIAogICAgIFRyZXggKnRyZXggPSBOVUxMOwogICAgIGludDMyX3QgdHJhY2tJZDsKLSAgICBpZiAodHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlUcmFja0lELCAmdHJhY2tJZCkpIHsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmdHJhY2tJZCkpIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJleC5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgVHJleCAqdCA9ICZtVHJleC5lZGl0SXRlbUF0KGkpOwogICAgICAgICAgICAgaWYgKHQtPnRyYWNrX0lEID09ICh1aW50MzJfdCkgdHJhY2tJZCkgewpAQCAtMzUwNiwxNiArMzk5MCwxNSBAQAogICAgIEFMT0dWKCJnZXRUcmFjayBjYWxsZWQsIHBzc2g6ICV6dSIsIG1Qc3NoLnNpemUoKSk7CiAKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIGlmICghdHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpIHsKKyAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHNwPEl0ZW1UYWJsZT4gaXRlbVRhYmxlOwogICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIApAQCAtMzUyNiwxMCArNDAwOSw5IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKQEAgLTM1NDEsMTEgKzQwMjMsMjkgQEAKICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykpIHsKICAgICAgICAgICAgIGl0ZW1UYWJsZSA9IG1JdGVtVGFibGU7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSkpIHsKKyAgICAgICAgdm9pZCAqZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisKKyAgICAgICAgaWYgKHNpemUgPCA1IHx8IHB0clswXSAhPSAweDgxKSB7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0cmFjay0+aGFzX2Vsc3QgYW5kICFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikgYW5kIHRyYWNrLT5lbHN0X21lZGlhX3RpbWUgPiAwKSB7CisgICAgICAgIHRyYWNrLT5lbHN0U2hpZnRTdGFydFRpY2tzID0gdHJhY2stPmVsc3RfbWVkaWFfdGltZTsKKyAgICAgICAgQUxPR1YoInZpZGVvIHRyYWNrLT5lbHN0U2hpZnRTdGFydFRpY2tzIDolIiBQUklkNjQsIHRyYWNrLT5lbHN0X21lZGlhX3RpbWUpOwogICAgIH0KIAogICAgIE1QRUc0U291cmNlICpzb3VyY2UgPSAgbmV3IE1QRUc0U291cmNlKAogICAgICAgICAgICAgdHJhY2stPm1ldGEsIG1EYXRhU291cmNlLCB0cmFjay0+dGltZXNjYWxlLCB0cmFjay0+c2FtcGxlVGFibGUsCi0gICAgICAgICAgICBtU2lkeEVudHJpZXMsIHRyZXgsIG1Nb29mT2Zmc2V0LCBpdGVtVGFibGUpOworICAgICAgICAgICAgbVNpZHhFbnRyaWVzLCB0cmV4LCBtTW9vZk9mZnNldCwgaXRlbVRhYmxlLAorICAgICAgICAgICAgdHJhY2stPmVsc3RTaGlmdFN0YXJ0VGlja3MpOwogICAgIGlmIChzb3VyY2UtPmluaXQoKSAhPSBPSykgewogICAgICAgICBkZWxldGUgc291cmNlOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTM1NTYsMjYgKzQwNTYsMjYgQEAKIC8vIHN0YXRpYwogc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnZlcmlmeVRyYWNrKFRyYWNrICp0cmFjaykgewogICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgQ0hFQ0sodHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKIAotICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICB2b2lkICpkYXRhOwogICAgIHNpemVfdCBzaXplOwogICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7Ci0gICAgICAgIGlmICghdHJhY2stPm1ldGEuZmluZERhdGEoa0tleUFWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpCi0gICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBrVHlwZUFWQ0MpIHsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpKSB7Ci0gICAgICAgIGlmICghdHJhY2stPm1ldGEuZmluZERhdGEoa0tleUhWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpCi0gICAgICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0ga1R5cGVIVkNDKSB7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVYxKSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KQogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7Ci0gICAgICAgIGlmICghdHJhY2stPm1ldGEuZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpCi0gICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBrVHlwZUVTRFMpIHsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VTRFMsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICB9CkBAIC0zNjYwLDE2ICs0MTYwLDE0IEBACiAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIGlmIChvYmplY3RUeXBlSW5kaWNhdGlvbiAgPT0gMHg2YikgewotICAgICAgICAvLyBUaGUgbWVkaWEgc3VidHlwZSBpcyBNUDMgYXVkaW8KLSAgICAgICAgLy8gT3VyIHNvZnR3YXJlIE1QMyBhdWRpbyBkZWNvZGVyIG1heSBub3QgYmUgYWJsZSB0byBoYW5kbGUKLSAgICAgICAgLy8gcGFja2V0aXplZCBNUDMgYXVkaW87IGZvciBub3csIGxldHMganVzdCByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQKLSAgICAgICAgQUxPR0UoIk1QMyB0cmFjayBpbiBNUDQvM0dQUCBmaWxlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIGlmIChvYmplY3RUeXBlSW5kaWNhdGlvbiA9PSAweDZCIHx8IG9iamVjdFR5cGVJbmRpY2F0aW9uID09IDB4NjkpIHsKKyAgICAgICAgLy8gbXAzIGF1ZGlvCisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSxBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOworICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCiAgICAgaWYgKG1MYXN0VHJhY2sgIT0gTlVMTCkgewpAQCAtMzY3NywxMCArNDE3NSwxMiBAQAogICAgICAgICB1aW50MzJfdCBhdmdCaXRyYXRlID0gMDsKICAgICAgICAgZXNkcy5nZXRCaXRSYXRlKCZtYXhCaXRyYXRlLCAmYXZnQml0cmF0ZSk7CiAgICAgICAgIGlmIChtYXhCaXRyYXRlID4gMCAmJiBtYXhCaXRyYXRlIDwgSU5UMzJfTUFYKSB7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlNYXhCaXRSYXRlLCAoaW50MzJfdCltYXhCaXRyYXRlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9CSVRfUkFURSwgKGludDMyX3QpbWF4Qml0cmF0ZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGF2Z0JpdHJhdGUgPiAwICYmIGF2Z0JpdHJhdGUgPCBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUJpdFJhdGUsIChpbnQzMl90KWF2Z0JpdHJhdGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIChpbnQzMl90KWF2Z0JpdHJhdGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNzI0LDcgKzQyMjQsNyBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCiAgICAgLy9rZWVwIEFPVCB0eXBlCi0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5QUFDQU9ULCBvYmplY3RUeXBlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRSwgb2JqZWN0VHlwZSk7CiAKICAgICB1aW50MzJfdCBmcmVxSW5kZXggPSBici5nZXRCaXRzKDQpOwogCkBAIC0zNzQ1LDcgKzQyNDUsNyBAQAogICAgICAgICBzYW1wbGVSYXRlID0ga1NhbXBsaW5nUmF0ZVtmcmVxSW5kZXhdOwogICAgIH0KIAotICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9TQlIgfHwgb2JqZWN0VHlwZSA9PSBBT1RfUFMpIHsvL1NCUiBzcGVjaWZpYyBjb25maWcgcGVyIDE0NDk2LTMgdGFibGUgMS4xMworICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9TQlIgfHwgb2JqZWN0VHlwZSA9PSBBT1RfUFMpIHsvL1NCUiBzcGVjaWZpYyBjb25maWcgcGVyIDE0NDk2LTMgdGJsIDEuMTMKICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB1aW50MzJfdCBleHRGcmVxSW5kZXggPSBici5nZXRCaXRzKDQpOwogICAgICAgICBpbnQzMl90IGV4dFNhbXBsZVJhdGUgX191bnVzZWQ7CkBAIC0zNzYyLDcgKzQyNjIsNyBAQAogICAgICAgICAgICAgZXh0U2FtcGxlUmF0ZSA9IGtTYW1wbGluZ1JhdGVbZXh0RnJlcUluZGV4XTsKICAgICAgICAgfQogICAgICAgICAvL1RPRE86IHNhdmUgdGhlIGV4dGVuc2lvbiBzYW1wbGluZyByYXRlIHZhbHVlIGluIG1ldGEgZGF0YSA9PgotICAgICAgICAvLyAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUV4dFNhbXBsZVJhdGUsIGV4dFNhbXBsZVJhdGUpOworICAgICAgICAvLyAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBrS2V5RXh0U2FtcGxlUmF0ZSwgZXh0U2FtcGxlUmF0ZSk7CiAgICAgfQogCiAgICAgc3dpdGNoIChudW1DaGFubmVscykgewpAQCAtMzkxNSwyNCArNDQxNSwyNSBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCiAgICAgaW50MzJfdCBwcmV2U2FtcGxlUmF0ZTsKLSAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnByZXZTYW1wbGVSYXRlKSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZwcmV2U2FtcGxlUmF0ZSkpOwogCiAgICAgaWYgKHByZXZTYW1wbGVSYXRlICE9IHNhbXBsZVJhdGUpIHsKICAgICAgICAgQUxPR1YoIm1wZWc0IGF1ZGlvIHNhbXBsZSByYXRlIGRpZmZlcmVudCBmcm9tIHByZXZpb3VzIHNldHRpbmcuICIKICAgICAgICAgICAgICAid2FzOiAlZCwgbm93OiAlZCIsIHByZXZTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKICAgICB9CiAKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlUmF0ZSk7CiAKICAgICBpbnQzMl90IHByZXZDaGFubmVsQ291bnQ7Ci0gICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJnByZXZDaGFubmVsQ291bnQpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgJnByZXZDaGFubmVsQ291bnQpKTsKIAogICAgIGlmIChwcmV2Q2hhbm5lbENvdW50ICE9IG51bUNoYW5uZWxzKSB7CiAgICAgICAgIEFMT0dWKCJtcGVnNCBhdWRpbyBjaGFubmVsIGNvdW50IGRpZmZlcmVudCBmcm9tIHByZXZpb3VzIHNldHRpbmcuICIKICAgICAgICAgICAgICAid2FzOiAlZCwgbm93OiAlZCIsIHByZXZDaGFubmVsQ291bnQsIG51bUNoYW5uZWxzKTsKICAgICB9CiAKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bUNoYW5uZWxzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBudW1DaGFubmVscyk7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0zOTQwLDE0ICs0NDQxLDE1IEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBNUEVHNFNvdXJjZTo6TVBFRzRTb3VyY2UoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmZm9ybWF0LAotICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCiAgICAgICAgIGludDMyX3QgdGltZVNjYWxlLAogICAgICAgICBjb25zdCBzcDxTYW1wbGVUYWJsZT4gJnNhbXBsZVRhYmxlLAogICAgICAgICBWZWN0b3I8U2lkeEVudHJ5PiAmc2lkeCwKICAgICAgICAgY29uc3QgVHJleCAqdHJleCwKICAgICAgICAgb2ZmNjRfdCBmaXJzdE1vb2ZPZmZzZXQsCi0gICAgICAgIGNvbnN0IHNwPEl0ZW1UYWJsZT4gJml0ZW1UYWJsZSkKKyAgICAgICAgY29uc3Qgc3A8SXRlbVRhYmxlPiAmaXRlbVRhYmxlLAorICAgICAgICBpbnQzMl90IGVsc3RTaGlmdFN0YXJ0VGlja3MpCiAgICAgOiBtRm9ybWF0KGZvcm1hdCksCiAgICAgICBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKICAgICAgIG1UaW1lc2NhbGUodGltZVNjYWxlKSwKQEAgLTM5NjgsNDYgKzQ0NzAsNTAgQEAKICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMoTlVMTCksCiAgICAgICBtSXNBVkMoZmFsc2UpLAogICAgICAgbUlzSEVWQyhmYWxzZSksCisgICAgICBtSXNBQzQoZmFsc2UpLAogICAgICAgbUlzUGNtKGZhbHNlKSwKICAgICAgIG1OQUxMZW5ndGhTaXplKDApLAogICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUdyb3VwKE5VTEwpLAogICAgICAgbUJ1ZmZlcihOVUxMKSwKLSAgICAgIG1XYW50c05BTEZyYWdtZW50cyhmYWxzZSksCiAgICAgICBtU3JjQnVmZmVyKE5VTEwpLAogICAgICAgbUlzSGVpZihpdGVtVGFibGUgIT0gTlVMTCksCi0gICAgICBtSXRlbVRhYmxlKGl0ZW1UYWJsZSkgeworICAgICAgbUl0ZW1UYWJsZShpdGVtVGFibGUpLAorICAgICAgbUVsc3RTaGlmdFN0YXJ0VGlja3MoZWxzdFNoaWZ0U3RhcnRUaWNrcykgewogCiAgICAgbWVtc2V0KCZtVHJhY2tGcmFnbWVudEhlYWRlckluZm8sIDAsIHNpemVvZihtVHJhY2tGcmFnbWVudEhlYWRlckluZm8pKTsKIAotICAgIG1Gb3JtYXQuZmluZEludDMyKGtLZXlDcnlwdG9Nb2RlLCAmbUNyeXB0b01vZGUpOworICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSwgJm1DcnlwdG9Nb2RlKTsKICAgICBtRGVmYXVsdElWU2l6ZSA9IDA7Ci0gICAgbUZvcm1hdC5maW5kSW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsICZtRGVmYXVsdElWU2l6ZSk7Ci0gICAgdWludDMyX3Qga2V5dHlwZTsKLSAgICBjb25zdCB2b2lkICprZXk7CisgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUsICZtRGVmYXVsdElWU2l6ZSk7CisgICAgdm9pZCAqa2V5OwogICAgIHNpemVfdCBrZXlzaXplOwotICAgIGlmIChtRm9ybWF0LmZpbmREYXRhKGtLZXlDcnlwdG9LZXksICZrZXl0eXBlLCAma2V5LCAma2V5c2l6ZSkpIHsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihtRm9ybWF0LAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLCAma2V5LCAma2V5c2l6ZSkpIHsKICAgICAgICAgQ0hFQ0soa2V5c2l6ZSA8PSAxNik7CiAgICAgICAgIG1lbXNldChtQ3J5cHRvS2V5LCAwLCAxNik7CiAgICAgICAgIG1lbWNweShtQ3J5cHRvS2V5LCBrZXksIGtleXNpemUpOwogICAgIH0KIAotICAgIG1Gb3JtYXQuZmluZEludDMyKGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2ssICZtRGVmYXVsdEVuY3J5cHRlZEJ5dGVCbG9jayk7Ci0gICAgbUZvcm1hdC5maW5kSW50MzIoa0tleVNraXBCeXRlQmxvY2ssICZtRGVmYXVsdFNraXBCeXRlQmxvY2spOworICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0ssICZtRGVmYXVsdEVuY3J5cHRlZEJ5dGVCbG9jayk7CisgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0ssICZtRGVmYXVsdFNraXBCeXRlQmxvY2spOwogCiAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBib29sIHN1Y2Nlc3MgPSBtRm9ybWF0LmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOworICAgIGJvb2wgc3VjY2VzcyA9IEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7CiAgICAgQ0hFQ0soc3VjY2Vzcyk7CiAKICAgICBtSXNBVkMgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwogICAgIG1Jc0hFVkMgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSB8fAogICAgICAgICAgICAgICAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpOworICAgIG1Jc0FDNCA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCk7CiAKICAgICBpZiAobUlzQVZDKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBDSEVDSyhmb3JtYXQuZmluZERhdGEoa0tleUFWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKTsKKyAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgJmRhdGEsICZzaXplKSk7CiAKICAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwogCkBAIC00MDE3LDEwICs0NTIzLDkgQEAKICAgICAgICAgLy8gVGhlIG51bWJlciBvZiBieXRlcyB1c2VkIHRvIGVuY29kZSB0aGUgbGVuZ3RoIG9mIGEgTkFMIHVuaXQuCiAgICAgICAgIG1OQUxMZW5ndGhTaXplID0gMSArIChwdHJbNF0gJiAzKTsKICAgICB9IGVsc2UgaWYgKG1Jc0hFVkMpIHsKLSAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgdm9pZCAqZGF0YTsKICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIENIRUNLKGZvcm1hdC5maW5kRGF0YShrS2V5SFZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOworICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgJmRhdGEsICZzaXplKSk7CiAKICAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwogCkBAIC00MDM2LDMyICs0NTQxLDU0IEBACiAgICAgaWYgKG1Jc1BjbSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzID0gMDsKICAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlID0gMDsKLSAgICAgICAgQ0hFQ0sobUZvcm1hdC5maW5kSW50MzIoa0tleUJpdHNQZXJTYW1wbGUsICZiaXRzUGVyU2FtcGxlKSk7Ci0gICAgICAgIENIRUNLKG1Gb3JtYXQuZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZudW1DaGFubmVscykpOworICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsICZiaXRzUGVyU2FtcGxlKSk7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsICZudW1DaGFubmVscykpOwogCiAgICAgICAgIGludDMyX3QgYnl0ZXNQZXJTYW1wbGUgPSBiaXRzUGVyU2FtcGxlID4+IDM7CiAgICAgICAgIGludDMyX3QgcGNtU2FtcGxlU2l6ZSA9IGJ5dGVzUGVyU2FtcGxlICogbnVtQ2hhbm5lbHM7CiAKICAgICAgICAgc2l6ZV90IG1heFNhbXBsZVNpemU7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG1TYW1wbGVUYWJsZS0+Z2V0TWF4U2FtcGxlU2l6ZSgmbWF4U2FtcGxlU2l6ZSk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0sgfHwgbWF4U2FtcGxlU2l6ZSAhPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBjbVNhbXBsZVNpemUpIHx8IGJpdHNQZXJTYW1wbGUgIT0gMTYpIHsKKyAgICAgICAgaWYgKGVyciAhPSBPSyB8fCBtYXhTYW1wbGVTaXplICE9IHN0YXRpY19jYXN0PHNpemVfdD4ocGNtU2FtcGxlU2l6ZSkKKyAgICAgICAgICAgICAgIHx8IGJpdHNQZXJTYW1wbGUgIT0gMTYpIHsKICAgICAgICAgICAgIC8vIE5vdCBzdXBwb3J0ZWQKICAgICAgICAgICAgIG1Jc1BjbSA9IGZhbHNlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUZvcm1hdC5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBwY21TYW1wbGVTaXplICoga01heFBjbUZyYW1lU2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgcGNtU2FtcGxlU2l6ZSAqIGtNYXhQY21GcmFtZVNpemUpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgQ0hFQ0soZm9ybWF0LmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJm1UcmFja0lkKSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCwgJm1UcmFja0lkKSk7CiAKIH0KIAogc3RhdHVzX3QgTVBFRzRTb3VyY2U6OmluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKICAgICBpZiAobUZpcnN0TW9vZk9mZnNldCAhPSAwKSB7CiAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gbUZpcnN0TW9vZk9mZnNldDsKLSAgICAgICAgcmV0dXJuIHBhcnNlQ2h1bmsoJm9mZnNldCk7CisgICAgICAgIGVyciA9IHBhcnNlQ2h1bmsoJm9mZnNldCk7CisgICAgICAgIGlmKGVyciA9PSBPSyAmJiAhc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpCisgICAgICAgICAgICAmJiAhbUN1cnJlbnRTYW1wbGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgLy8gU3RhcnQgb2Zmc2V0IHNob3VsZCBiZSBsZXNzIG9yIGVxdWFsIHRvIGNvbXBvc2l0aW9uIHRpbWUgb2YgZmlyc3Qgc2FtcGxlLgorICAgICAgICAgICAgLy8gSVNPIDogc2FtcGxlX2NvbXBvc2l0aW9uX3RpbWVfb2Zmc2V0LCB2ZXJzaW9uIDAgKHVuc2lnbmVkKSBmb3IgbWFqb3IgYnJhbmRzLgorICAgICAgICAgICAgbUVsc3RTaGlmdFN0YXJ0VGlja3MgPSBzdGQ6Om1pbihtRWxzdFNoaWZ0U3RhcnRUaWNrcywKKyAgICAgICAgICAgICAgICAoKm1DdXJyZW50U2FtcGxlcy5iZWdpbigpKS5jb21wb3NpdGlvbk9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKICAgICB9Ci0gICAgcmV0dXJuIE9LOworCisgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpIHsKKyAgICAgICAgdWludDY0X3QgZmlyc3RTYW1wbGVDVFMgPSAwOworICAgICAgICBlcnIgPSBtU2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKDAsIE5VTEwsIE5VTEwsICZmaXJzdFNhbXBsZUNUUyk7CisgICAgICAgIC8vIFN0YXJ0IG9mZnNldCBzaG91bGQgYmUgbGVzcyBvciBlcXVhbCB0byBjb21wb3NpdGlvbiB0aW1lIG9mIGZpcnN0IHNhbXBsZS4KKyAgICAgICAgLy8gQ29tcG9zaXRpb24gdGltZSBzdGFtcCBvZiBmaXJzdCBzYW1wbGUgY2Fubm90IGJlIG5lZ2F0aXZlLgorICAgICAgICBtRWxzdFNoaWZ0U3RhcnRUaWNrcyA9IHN0ZDo6bWluKG1FbHN0U2hpZnRTdGFydFRpY2tzLCAoaW50MzJfdClmaXJzdFNhbXBsZUNUUyk7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKIH0KIAogTVBFRzRTb3VyY2U6On5NUEVHNFNvdXJjZSgpIHsKQEAgLTQwNzIsMjEgKzQ1OTksMTMgQEAKICAgICBmcmVlKG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMpOwogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpIHsKK21lZGlhX3N0YXR1c190IE1QRUc0U291cmNlOjpzdGFydCgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAotICAgIGludDMyX3QgdmFsOwotICAgIGlmIChwYXJhbXMgJiYgcGFyYW1zLT5maW5kSW50MzIoa0tleVdhbnRzTkFMRnJhZ21lbnRzLCAmdmFsKQotICAgICAgICAmJiB2YWwgIT0gMCkgewotICAgICAgICBtV2FudHNOQUxGcmFnbWVudHMgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1XYW50c05BTEZyYWdtZW50cyA9IGZhbHNlOwotICAgIH0KLQogICAgIGludDMyX3QgdG1wOwotICAgIENIRUNLKG1Gb3JtYXQuZmluZEludDMyKGtLZXlNYXhJbnB1dFNpemUsICZ0bXApKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgJnRtcCkpOwogICAgIHNpemVfdCBtYXhfc2l6ZSA9IHRtcDsKIAogICAgIC8vIEEgc29tZXdoYXQgYXJiaXRyYXJ5IGxpbWl0IHRoYXQgc2hvdWxkIGJlIHN1ZmZpY2llbnQgZm9yIDhrIHZpZGVvIGZyYW1lcwpAQCAtNDA5NCwzMiArNDYxMywzMCBAQAogICAgIGNvbnN0IHNpemVfdCBrTWF4QnVmZmVyU2l6ZSA9IDY0ICogMTAyNCAqIDEwMjQ7CiAgICAgaWYgKG1heF9zaXplID4ga01heEJ1ZmZlclNpemUpIHsKICAgICAgICAgQUxPR0UoImJvZ3VzIG1heCBpbnB1dCBzaXplOiAlenUgPiAlenUiLCBtYXhfc2l6ZSwga01heEJ1ZmZlclNpemUpOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgaWYgKG1heF9zaXplID09IDApIHsKICAgICAgICAgQUxPR0UoInplcm8gbWF4IGlucHV0IHNpemUiKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgLy8gQWxsb3cgdXAgdG8ga01heEJ1ZmZlcnMsIGJ1dCBub3QgaWYgdGhlIHRvdGFsIGV4Y2VlZHMga01heEJ1ZmZlclNpemUuCiAgICAgY29uc3Qgc2l6ZV90IGtJbml0aWFsQnVmZmVycyA9IDI7CiAgICAgY29uc3Qgc2l6ZV90IGtNYXhCdWZmZXJzID0gODsKICAgICBjb25zdCBzaXplX3QgcmVhbE1heEJ1ZmZlcnMgPSBtaW4oa01heEJ1ZmZlclNpemUgLyBtYXhfc2l6ZSwga01heEJ1ZmZlcnMpOwotICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwKGtJbml0aWFsQnVmZmVycywgbWF4X3NpemUsIHJlYWxNYXhCdWZmZXJzKTsKKyAgICBtQnVmZmVyR3JvdXAtPmluaXQoa0luaXRpYWxCdWZmZXJzLCBtYXhfc2l6ZSwgcmVhbE1heEJ1ZmZlcnMpOwogICAgIG1TcmNCdWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFttYXhfc2l6ZV07CiAgICAgaWYgKG1TcmNCdWZmZXIgPT0gTlVMTCkgewogICAgICAgICAvLyBmaWxlIHByb2JhYmx5IHNwZWNpZmllZCBhIGJhZCBtYXggc2l6ZQotICAgICAgICBkZWxldGUgbUdyb3VwOwotICAgICAgICBtR3JvdXAgPSBOVUxMOwotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHNFNvdXJjZTo6c3RvcCgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwpAQCAtNDEzMiwxMyArNDY0OSwxMCBAQAogICAgIGRlbGV0ZVtdIG1TcmNCdWZmZXI7CiAgICAgbVNyY0J1ZmZlciA9IE5VTEw7CiAKLSAgICBkZWxldGUgbUdyb3VwOwotICAgIG1Hcm91cCA9IE5VTEw7Ci0KICAgICBtU3RhcnRlZCA9IGZhbHNlOwogICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHN0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCkgewpAQCAtNDI1Niw3ICs0NzcwLDggQEAKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygic2FpbyIpOiB7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgICAgICBpZiAoKGVyciA9IHBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXRzKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpKSAhPSBPSykgeworICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uT2Zmc2V0cyhkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKSkKKyAgICAgICAgICAgICAgICAgICAgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwpAQCAtNDM4Nyw3ICs0OTAyLDggQEAKICAgICBpZiAoZW50cnljb3VudCA+IG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHNBbGxvY1NpemUpIHsKICAgICAgICAgdWludDY0X3QgKm5ld1B0ciA9ICh1aW50NjRfdCAqKXJlYWxsb2MobUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cywgZW50cnljb3VudCAqIDgpOwogICAgICAgICBpZiAobmV3UHRyID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcmVhbGxvYyAldSAtPiAldSIsIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHNBbGxvY1NpemUsIGVudHJ5Y291bnQgKiA4KTsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcmVhbGxvYyAldSAtPiAldSIsCisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHNBbGxvY1NpemUsIGVudHJ5Y291bnQgKiA4KTsKICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgIH0KICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cyA9IG5ld1B0cjsKQEAgLTQ0MjYsMTAgKzQ5NDIsMTMgQEAKICAgICByZXR1cm4gcGFyc2VDbGVhckVuY3J5cHRlZFNpemVzKGRybW9mZnNldCwgZmFsc2UsIDApOwogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VDbGVhckVuY3J5cHRlZFNpemVzKG9mZjY0X3Qgb2Zmc2V0LCBib29sIGlzU3Vic2FtcGxlRW5jcnlwdGlvbiwgdWludDMyX3QgZmxhZ3MpIHsKK3N0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZUNsZWFyRW5jcnlwdGVkU2l6ZXMoCisgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBib29sIGlzU3Vic2FtcGxlRW5jcnlwdGlvbiwgdWludDMyX3QgZmxhZ3MpIHsKIAotICAgIGludCBpdmxlbmd0aDsKLSAgICBDSEVDSyhtRm9ybWF0LmZpbmRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgJml2bGVuZ3RoKSk7CisgICAgaW50MzJfdCBpdmxlbmd0aDsKKyAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUsICZpdmxlbmd0aCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CiAKICAgICAvLyBvbmx5IDAsIDggYW5kIDE2IGJ5dGUgaW5pdGlhbGl6YXRpb24gdmVjdG9ycyBhcmUgc3VwcG9ydGVkCiAgICAgaWYgKGl2bGVuZ3RoICE9IDAgJiYgaXZsZW5ndGggIT0gOCAmJiBpdmxlbmd0aCAhPSAxNikgewpAQCAtNDYxMiw3ICs1MTMxLDcgQEAKIAogc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlVHJhY2tGcmFnbWVudFJ1bihvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplKSB7CiAKLSAgICBBTE9HVigiTVBFRzRFeHRyYWN0b3I6OnBhcnNlVHJhY2tGcmFnbWVudFJ1biIpOworICAgIEFMT0dWKCJNUEVHNFNvdXJjZTo6cGFyc2VUcmFja0ZyYWdtZW50UnVuIik7CiAgICAgaWYgKHNpemUgPCA4KSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KQEAgLTQ3MTksNyArNTIzOCw3IEBACiAgICAgICAgIHNhbXBsZUN0c09mZnNldCA9IDA7CiAgICAgfQogCi0gICAgaWYgKHNpemUgPCAob2ZmNjRfdCkoc2FtcGxlQ291bnQgKiBieXRlc1BlclNhbXBsZSkpIHsKKyAgICBpZiAoc2l6ZSA8IChvZmY2NF90KXNhbXBsZUNvdW50ICogYnl0ZXNQZXJTYW1wbGUpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCkBAIC00NzU0LDEwICs1MjczLDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICBBTE9HVigiYWRkaW5nIHNhbXBsZSAlZCBhdCBvZmZzZXQgMHglMDgiIFBSSXg2NCAiLCBzaXplICV1LCBkdXJhdGlvbiAldSwgIgotICAgICAgICAgICAgICAiIGZsYWdzIDB4JTA4eCIsIGkgKyAxLAorICAgICAgICAgICAgICAiIGZsYWdzIDB4JTA4eCBjdHNPZmZzZXQgJSIgUFJJdTMyLCBpICsgMSwKICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LCBzYW1wbGVTaXplLCBzYW1wbGVEdXJhdGlvbiwKICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBrRmlyc3RTYW1wbGVGbGFnc1ByZXNlbnQpICYmIGkgPT0gMAotICAgICAgICAgICAgICAgICAgICA/IGZpcnN0U2FtcGxlRmxhZ3MgOiBzYW1wbGVGbGFncyk7CisgICAgICAgICAgICAgICAgICAgID8gZmlyc3RTYW1wbGVGbGFncyA6IHNhbXBsZUZsYWdzLCBzYW1wbGVDdHNPZmZzZXQpOwogICAgICAgICB0bXAub2Zmc2V0ID0gZGF0YU9mZnNldDsKICAgICAgICAgdG1wLnNpemUgPSBzYW1wbGVTaXplOwogICAgICAgICB0bXAuZHVyYXRpb24gPSBzYW1wbGVEdXJhdGlvbjsKQEAgLTQ3NzMsMTAgKzUyOTIsMTAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1QRUc0U291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHNFNvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbWV0YSA9IG1Gb3JtYXQ7Ci0gICAgcmV0dXJuIE9LOworICAgIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1Gb3JtYXQpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBNUEVHNFNvdXJjZTo6cGFyc2VOQUxTaXplKGNvbnN0IHVpbnQ4X3QgKmRhdGEpIGNvbnN0IHsKQEAgLTQ3OTgsMTUgKzUzMTcsNDQgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK2ludDMyX3QgTVBFRzRTb3VyY2U6OnBhcnNlSEVWQ0xheWVySWQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBDSEVDSyhkYXRhICE9IG51bGxwdHIgJiYgc2l6ZSA+PSAobU5BTExlbmd0aFNpemUgKyAyKSk7CisKKyAgICAvLyBIRVZDIE5BTC1oZWFkZXIgKDE2LWJpdCkKKyAgICAvLyAgMSAgIDYgICAgICA2ICAgICAzCisgICAgLy8gfC18dXV1dXV1fC0tLS0tLXxpaWl8CisgICAgLy8gICAgICBeICAgICAgICAgICAgXgorICAgIC8vICBOQUxfdHlwZSAgICAgICAgbGF5ZXJfaWQgKyAxCisgICAgLy8KKyAgICAvLyBMYXllci1pZCBpcyBub24temVybyBvbmx5IGZvciBUZW1wb3JhbCBTdWItbGF5ZXIgQWNjZXNzIHBpY3R1cmVzIChUU0EpCisgICAgZW51bSB7CisgICAgICAgIFRTQV9OID0gMiwKKyAgICAgICAgVFNBX1IgPSAzLAorICAgICAgICBTVFNBX04gPSA0LAorICAgICAgICBTVFNBX1IgPSA1LAorICAgIH07CisKKyAgICBkYXRhICs9IG1OQUxMZW5ndGhTaXplOworICAgIHVpbnQxNl90IG5hbEhlYWRlciA9IGRhdGFbMF0gPDwgOCB8IGRhdGFbMV07CisKKyAgICB1aW50MTZfdCBuYWxUeXBlID0gKG5hbEhlYWRlciA+PiA5KSAmIDB4M0Z1OworICAgIGlmIChuYWxUeXBlID09IFRTQV9OIHx8IG5hbFR5cGUgPT0gVFNBX1IgfHwgbmFsVHlwZSA9PSBTVFNBX04gfHwgbmFsVHlwZSA9PSBTVFNBX1IpIHsKKyAgICAgICAgaW50MzJfdCBsYXllcklkUGx1c09uZSA9IG5hbEhlYWRlciAmIDB4N3U7CisgICAgICAgIEFMT0dEX0lGKGxheWVySWRQbHVzT25lID09IDAsICJnb3QgbGF5ZXJJZCAwIGZvciBUU0EgcGljdHVyZSIpOworICAgICAgICByZXR1cm4gbGF5ZXJJZFBsdXNPbmUgLSAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworbWVkaWFfc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBDSEVDSyhtU3RhcnRlZCk7CiAKLSAgICBpZiAob3B0aW9ucyAhPSBudWxscHRyICYmIG9wdGlvbnMtPmdldE5vbkJsb2NraW5nKCkgJiYgIW1Hcm91cC0+aGFzX2J1ZmZlcnMoKSkgeworICAgIGlmIChvcHRpb25zICE9IG51bGxwdHIgJiYgb3B0aW9ucy0+Z2V0Tm9uQmxvY2tpbmcoKSAmJiAhbUJ1ZmZlckdyb3VwLT5oYXNfYnVmZmVycygpKSB7CiAgICAgICAgICpvdXQgPSBudWxscHRyOwotICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfV09VTERfQkxPQ0s7CiAgICAgfQogCiAgICAgaWYgKG1GaXJzdE1vb2ZPZmZzZXQgPiAwKSB7CkBAIC00ODIwLDEyICs1MzY4LDEzIEBACiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwogICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CisKICAgICAgICAgaWYgKG1Jc0hlaWYpIHsKICAgICAgICAgICAgIENIRUNLKG1TYW1wbGVUYWJsZSA9PSBOVUxMKTsKICAgICAgICAgICAgIENIRUNLKG1JdGVtVGFibGUgIT0gTlVMTCk7CiAgICAgICAgICAgICBpbnQzMl90IGltYWdlSW5kZXg7Ci0gICAgICAgICAgICBpZiAoIW1Gb3JtYXQuZmluZEludDMyKGtLZXlUcmFja0lELCAmaW1hZ2VJbmRleCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCwgJmltYWdlSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHN0YXR1c190IGVycjsKQEAgLTQ4MzUsNyArNTM4NCw3IEBACiAgICAgICAgICAgICAgICAgZXJyID0gbUl0ZW1UYWJsZS0+ZmluZFRodW1ibmFpbEl0ZW0oaW1hZ2VJbmRleCwgJm1DdXJyZW50U2FtcGxlSW5kZXgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdWludDMyX3QgZmluZEZsYWdzID0gMDsKQEAgLTQ4NTcsNiArNTQwNiw5IEBACiAgICAgICAgICAgICAgICAgICAgIENIRUNLKCEiU2hvdWxkIG5vdCBiZSBoZXJlLiIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBtb2RlICE9IFJlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYKSB7CisgICAgICAgICAgICAgICAgc2Vla1RpbWVVcyArPSAoKGxvbmcgZG91YmxlKW1FbHN0U2hpZnRTdGFydFRpY2tzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleDsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1TYW1wbGVUYWJsZS0+ZmluZFNhbXBsZUF0VGltZSgKQEAgLTQ4ODAsNyArNTQzMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVJbmRleCwgJnN5bmNTYW1wbGVJbmRleCwgZmluZEZsYWdzKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlVGltZTsKKyAgICAgICAgICAgIHVpbnQ2NF90IHNhbXBsZVRpbWU7CiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICAgICAgZXJyID0gbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4LCBOVUxMLCBOVUxMLCAmc2FtcGxlVGltZSk7CkBAIC00ODkzLDE0ICs1NDQ1LDE1IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgYWxsIHRoZSB3YXkgdG8gdGhlIE1lZGlhUGxheWVyIHdvdWxkIGNhdXNlIGFibm9ybWFsCiAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm1pbmF0aW9uLiBMZWdhY3kgYmVoYXZpb3VyIGFwcGVhcnMgdG8gYmUgdG8gYmVoYXZlIGFzIGlmCiAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhZCBzZWVrZWQgdG8gdGhlIGVuZCBvZiBzdHJlYW0sIGVuZGluZyBub3JtYWxseS4KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HVigiZW5kIG9mIHN0cmVhbSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUCiAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19GUkFNRV9JTkRFWCkgeworICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgLT0gbUVsc3RTaGlmdFN0YXJ0VGlja3M7CiAgICAgICAgICAgICAgICAgdGFyZ2V0U2FtcGxlVGltZVVzID0gKHNhbXBsZVRpbWUgKiAxMDAwMDAwbGwpIC8gbVRpbWVzY2FsZTsKICAgICAgICAgICAgIH0KIApAQCAtNDkyOSw3ICs1NDgyLDcgQEAKIAogICAgIG9mZjY0X3Qgb2Zmc2V0ID0gMDsKICAgICBzaXplX3Qgc2l6ZSA9IDA7Ci0gICAgdWludDMyX3QgY3RzLCBzdHRzOworICAgIHVpbnQ2NF90IGN0cywgc3R0czsKICAgICBib29sIGlzU3luY1NhbXBsZTsKICAgICBib29sIG5ld0J1ZmZlciA9IGZhbHNlOwogICAgIGlmIChtQnVmZmVyID09IE5VTEwpIHsKQEAgLTQ5MzksNiArNTQ5MiwxMCBAQAogICAgICAgICBpZiAoIW1Jc0hlaWYpIHsKICAgICAgICAgICAgIGVyciA9IG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCiAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXgsICZvZmZzZXQsICZzaXplLCAmY3RzLCAmaXNTeW5jU2FtcGxlLCAmc3R0cyk7CisgICAgICAgICAgICBpZihlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBjdHMgLT0gbUVsc3RTaGlmdFN0YXJ0VGlja3M7CisgICAgICAgICAgICB9CisKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGVyciA9IG1JdGVtVGFibGUtPmdldEltYWdlT2Zmc2V0QW5kU2l6ZSgKICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSA/CkBAIC00OTUwLDI0ICs1NTA3LDI3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAKLSAgICAgICAgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmbUJ1ZmZlcik7CisgICAgICAgIGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgPT0gTlVMTCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAgICAgICAgIGlmIChzaXplID4gbUJ1ZmZlci0+c2l6ZSgpKSB7CiAgICAgICAgICAgICBBTE9HRSgiYnVmZmVyIHRvbyBzbWFsbDogJXp1ID4gJXp1Iiwgc2l6ZSwgbUJ1ZmZlci0+c2l6ZSgpKTsKICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0JVRkZFUl9UT09fU01BTEw7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047IC8vIEVSUk9SX0JVRkZFUl9UT09fU01BTEwKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICgoIW1Jc0FWQyAmJiAhbUlzSEVWQykgfHwgbVdhbnRzTkFMRnJhZ21lbnRzKSB7CisgICAgaWYgKCFtSXNBVkMgJiYgIW1Jc0hFVkMgJiYgIW1Jc0FDNCkgewogICAgICAgICBpZiAobmV3QnVmZmVyKSB7CiAgICAgICAgICAgICBpZiAobUlzUGNtKSB7CiAgICAgICAgICAgICAgICAgLy8gVGhlIHR3b3MnIFBDTSBibG9jayByZWFkZXIgYXNzdW1lcyB0aGF0IGFsbCBzYW1wbGVzIGhhcyB0aGUgc2FtZSBzaXplLgpAQCAtNDk4MiwyMiArNTU0MiwyNSBAQAogICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNUb1JlYWQsIHNpemUsIG1DdXJyZW50U2FtcGxlSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVRhYmxlLT5nZXRMYXN0U2FtcGxlSW5kZXhJbkNodW5rKCkpOwogCi0gICAgICAgICAgICAgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IHNhbXBsZXNUb1JlYWQgKiBzaXplOworICAgICAgICAgICAgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IHNhbXBsZXNUb1JlYWQgKiBzaXplOwogICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZiA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOwogICAgICAgICAgICAgICAgIHNzaXplX3QgYnl0ZXNSZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGJ1ZiwgdG90YWxTaXplKTsKICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkIDwgKHNzaXplX3QpdG90YWxTaXplKSB7CiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICgobG9uZyBkb3VibGUpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKIAogICAgICAgICAgICAgICAgIGludDMyX3QgYnl0ZU9yZGVyOwotICAgICAgICAgICAgICAgIG1Gb3JtYXQuZmluZEludDMyKGtLZXlQY21CaWdFbmRpYW4sICZieXRlT3JkZXIpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fQklHX0VORElBTiwgJmJ5dGVPcmRlcik7CiAKICAgICAgICAgICAgICAgICBpZiAoYnl0ZU9yZGVyID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gQmlnLWVuZGlhbiAtPiBsaXR0bGUtZW5kaWFuCkBAIC01MDE5LDE2NiArNTU4Miw4MSBAQAogICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwogICAgICAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgKChsb25nIGRvdWJsZSljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICgobG9uZyBkb3VibGUpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CiAKICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAgICAgICAgICAgICAgICAgfQotCisgCiAgICAgICAgICAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFtSXNBVkMgJiYgIW1Jc0hFVkMpIHsKLSAgICAgICAgICAgICpvdXQgPSBtQnVmZmVyOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICpvdXQgPSBtQnVmZmVyOworICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAKLSAgICAgICAgLy8gRWFjaCBOQUwgdW5pdCBpcyBzcGxpdCB1cCBpbnRvIGl0cyBjb25zdGl0dWVudCBmcmFnbWVudHMgYW5kCi0gICAgICAgIC8vIGVhY2ggb25lIG9mIHRoZW0gcmV0dXJuZWQgaW4gaXRzIG93biBidWZmZXIuCi0KLSAgICAgICAgQ0hFQ0sobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPj0gbU5BTExlbmd0aFNpemUpOwotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9Ci0gICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnJhbmdlX29mZnNldCgpOwotCi0gICAgICAgIHNpemVfdCBuYWxfc2l6ZSA9IHBhcnNlTkFMU2l6ZShzcmMpOwotICAgICAgICBpZiAobU5BTExlbmd0aFNpemUgPiBTSVpFX01BWCAtIG5hbF9zaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYi8yNDQ0MTU1MywgYi8yNDQ0NTEyMiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIG1OQUxMZW5ndGhTaXplIDwgbmFsX3NpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJpbmNvbXBsZXRlIE5BTCB1bml0LiIpOwotCi0gICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqY2xvbmUgPSBtQnVmZmVyLT5jbG9uZSgpOwotICAgICAgICBDSEVDSyhjbG9uZSAhPSBOVUxMKTsKLSAgICAgICAgY2xvbmUtPnNldF9yYW5nZShtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG1OQUxMZW5ndGhTaXplLCBuYWxfc2l6ZSk7Ci0KKyAgICB9IGVsc2UgaWYgKG1Jc0FDNCkgewogICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBtTkFMTGVuZ3RoU2l6ZSArIG5hbF9zaXplLAotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gbU5BTExlbmd0aFNpemUgLSBuYWxfc2l6ZSk7Ci0KLSAgICAgICAgaWYgKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgKm91dCA9IGNsb25lOwotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBXaG9sZSBOQUwgdW5pdHMgYXJlIHJldHVybmVkIGJ1dCBlYWNoIGZyYWdtZW50IGlzIHByZWZpeGVkIGJ5Ci0gICAgICAgIC8vIHRoZSBzdGFydCBjb2RlICgweDAwIDAwIDAwIDAxKS4KLSAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9IDA7Ci0gICAgICAgIGludDMyX3QgZHJtID0gMDsKLSAgICAgICAgYm9vbCB1c2VzRFJNID0gKG1Gb3JtYXQuZmluZEludDMyKGtLZXlJc0RSTSwgJmRybSkgJiYgZHJtICE9IDApOwotICAgICAgICBpZiAodXNlc0RSTSkgewotICAgICAgICAgICAgbnVtX2J5dGVzX3JlYWQgPQotICAgICAgICAgICAgICAgIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAodWludDhfdCopbUJ1ZmZlci0+ZGF0YSgpLCBzaXplKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG51bV9ieXRlc19yZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIG1TcmNCdWZmZXIsIHNpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG51bV9ieXRlc19yZWFkIDwgKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIHRoZSBzeW5jIGhlYWRlciBhbmQgdGhlIHJhdyBmcmFtZQorICAgICAgICBpZiAobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPCAoNyArIHNpemUpKSB7CiAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh1c2VzRFJNKSB7Ci0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOworICAgICAgICB1aW50OF90ICpkc3REYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7CisgICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOworICAgICAgICAvLyBBZGQgQUMtNCBzeW5jIGhlYWRlciB0byBNUEVHNCBlbmNhcHN1bGF0ZWQgQUMtNCByYXcgZnJhbWUKKyAgICAgICAgLy8gQUM0MCBzeW5jIHdvcmQsIG1lYW5pbmcgbm8gQ1JDIGF0IHRoZSBlbmQgb2YgdGhlIGZyYW1lCisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMHhBQzsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAweDQwOworICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDB4RkY7CisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMHhGRjsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAodWludDhfdCkoKHNpemUgPj4gMTYpICYgMHhGRik7CisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gKHVpbnQ4X3QpKChzaXplID4+IDgpICYgMHhGRik7CisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gKHVpbnQ4X3QpKChzaXplID4+IDApICYgMHhGRik7CiAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKLSAgICAgICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOwotICAgICAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CisgICAgICAgIHNzaXplX3QgbnVtQnl0ZXNSZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRzdERhdGEgKyBkc3RPZmZzZXQsIHNpemUpOworICAgICAgICBpZiAobnVtQnl0ZXNSZWFkICE9IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICAgICAgICAgIGJvb2wgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOwotICAgICAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSAwOwotICAgICAgICAgICAgICAgIGlmICghaXNNYWxGb3JtZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOwotICAgICAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzTWFsRm9ybWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJWaWRlbyBpcyBtYWxmb3JtZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFsTGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGRzdE9mZnNldCA+IFNJWkVfTUFYIC0gNCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCA+IFNJWkVfTUFYIC0gbmFsTGVuZ3RoIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ICsgbmFsTGVuZ3RoID4gbUJ1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI3MjA4NjIxIDogJXp1ICV6dSIsIGRzdE9mZnNldCwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzIwODYyMSIpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOwotICAgICAgICAgICAgICAgIGRzdE9mZnNldCArPSBuYWxMZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOwotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgfQogCi0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLmNsZWFyKCk7Ci0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQgKyBzaXplKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgKChsb25nIGRvdWJsZSljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgKChsb25nIGRvdWJsZSlzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKIAogICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSXNBVkMpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IGxheWVySWQgPSBGaW5kQVZDTGF5ZXJJZCgKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlUZW1wb3JhbExheWVySWQsIGxheWVySWQpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGlzU3luY1NhbXBsZSkgewotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogICAgICAgICB9CiAKICAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OwpAQCAtNTE4NiwxMiArNTY2NCwxMDUgQEAKICAgICAgICAgKm91dCA9IG1CdWZmZXI7CiAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBXaG9sZSBOQUwgdW5pdHMgYXJlIHJldHVybmVkIGJ1dCBlYWNoIGZyYWdtZW50IGlzIHByZWZpeGVkIGJ5CisgICAgICAgIC8vIHRoZSBzdGFydCBjb2RlICgweDAwIDAwIDAwIDAxKS4KKyAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9IDA7CisgICAgICAgIG51bV9ieXRlc19yZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIG1TcmNCdWZmZXIsIHNpemUpOworCisgICAgICAgIGlmIChudW1fYnl0ZXNfcmVhZCA8IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworCisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOworICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKKyAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CisKKyAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNpemUpIHsKKyAgICAgICAgICAgIGJvb2wgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOworICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IDA7CisgICAgICAgICAgICBpZiAoIWlzTWFsRm9ybWVkKSB7CisgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOworICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMTGVuZ3RoU2l6ZTsKKyAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBuYWxMZW5ndGgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaXNNYWxGb3JtZWQpIHsKKyAgICAgICAgICAgICAgICAvL2lmIG5hbGxlbmd0aCBhYm5vcm1hbCxpZ25vcmUgaXQuCisgICAgICAgICAgICAgICAgQUxPR1coImFibm9ybWFsIG5hbGxlbmd0aCwgaWdub3JlIHRoaXMgTkFMIik7CisgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ID0gc2l6ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5hbExlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkc3RPZmZzZXQgPiBTSVpFX01BWCAtIDQgfHwKKyAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCA+IFNJWkVfTUFYIC0gbmFsTGVuZ3RoIHx8CisgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgKyBuYWxMZW5ndGggPiBtQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNzIwODYyMSA6ICV6dSAlenUiLCBkc3RPZmZzZXQsIG1CdWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzIwODYyMSIpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAxOworICAgICAgICAgICAgbWVtY3B5KCZkc3REYXRhW2RzdE9mZnNldF0sICZtU3JjQnVmZmVyW3NyY09mZnNldF0sIG5hbExlbmd0aCk7CisgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgfQorICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOworICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOworICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0T2Zmc2V0KTsKKworICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGxvbmcgZG91YmxlKWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoKGxvbmcgZG91YmxlKXN0dHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworCisgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Jc0FWQykgeworICAgICAgICAgICAgdWludDMyX3QgbGF5ZXJJZCA9IEZpbmRBVkNMYXllcklkKAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQsIGxheWVySWQpOworICAgICAgICB9IGVsc2UgaWYgKG1Jc0hFVkMpIHsKKyAgICAgICAgICAgIGludDMyX3QgbGF5ZXJJZCA9IHBhcnNlSEVWQ0xheWVySWQoCisgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICBpZiAobGF5ZXJJZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQsIGxheWVySWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzU3luY1NhbXBsZSkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CisgICAgICAgIH0KKworICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CisKKyAgICAgICAgKm91dCA9IG1CdWZmZXI7CisgICAgICAgIG1CdWZmZXIgPSBOVUxMOworCisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgfQogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6ZnJhZ21lbnRlZFJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IE1QRUc0U291cmNlOjpmcmFnbWVudGVkUmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAKICAgICBBTE9HVigiTVBFRzRTb3VyY2U6OmZyYWdtZW50ZWRSZWFkIik7CiAKQEAgLTUyMDUsNiArNTc3NiwxMCBAQAogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwogICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAKKyAgICAgICAgc2Vla1RpbWVVcyArPSAoKGxvbmcgZG91YmxlKW1FbHN0U2hpZnRTdGFydFRpY2tzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlOworICAgICAgICBBTE9HVigic2hpZnRlZCBzZWVrVGltZVVzIDolIiBQUklkNjQgIiwgbUVsc3RTaGlmdFN0YXJ0VGlja3M6JSIgUFJJZDMyLCBzZWVrVGltZVVzLAorICAgICAgICAgICAgICAgIG1FbHN0U2hpZnRTdGFydFRpY2tzKTsKKwogICAgICAgICBpbnQgbnVtU2lkeEVudHJpZXMgPSBtU2VnbWVudHMuc2l6ZSgpOwogICAgICAgICBpZiAobnVtU2lkeEVudHJpZXMgIT0gMCkgewogICAgICAgICAgICAgaW50NjRfdCB0b3RhbFRpbWUgPSAwOwpAQCAtNTIzMiw3ICs1ODA3LDcgQEAKICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmdG90YWxPZmZzZXQpOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUN1cnJlbnRUaW1lID0gdG90YWxUaW1lICogbVRpbWVzY2FsZSAvIDEwMDAwMDBsbDsKICAgICAgICAgfSBlbHNlIHsKQEAgLTUyNDQsNyArNTgxOSw3IEBACiAgICAgICAgICAgICBvZmY2NF90IHRtcCA9IG1DdXJyZW50TW9vZk9mZnNldDsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsoJnRtcCk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQ3VycmVudFRpbWUgPSAwOwogICAgICAgICB9CkBAIC01MjYyLDEzICs1ODM3LDE3IEBACiAgICAgdWludDMyX3QgY3RzID0gMDsKICAgICBib29sIGlzU3luY1NhbXBsZSA9IGZhbHNlOwogICAgIGJvb2wgbmV3QnVmZmVyID0gZmFsc2U7Ci0gICAgaWYgKG1CdWZmZXIgPT0gTlVMTCkgeworICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgbUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7CiAgICAgICAgIG5ld0J1ZmZlciA9IHRydWU7CiAKKyAgICAgICAgaWYgKG1CdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgIH0KICAgICAgICAgaWYgKG1DdXJyZW50U2FtcGxlSW5kZXggPj0gbUN1cnJlbnRTYW1wbGVzLnNpemUoKSkgewogICAgICAgICAgICAgLy8gbW92ZSB0byBuZXh0IGZyYWdtZW50IGlmIHRoZXJlIGlzIG9uZQogICAgICAgICAgICAgaWYgKG1OZXh0TW9vZk9mZnNldCA8PSBtQ3VycmVudE1vb2ZPZmZzZXQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvZmY2NF90IG5leHRNb29mID0gbU5leHRNb29mT2Zmc2V0OwogICAgICAgICAgICAgbUN1cnJlbnRNb29mT2Zmc2V0ID0gbmV4dE1vb2Y7CkBAIC01Mjc2LDEwICs1ODU1LDEwIEBACiAgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4ID0gMDsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsoJm5leHRNb29mKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtQ3VycmVudFNhbXBsZUluZGV4ID49IG1DdXJyZW50U2FtcGxlcy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNTI4Nyw1OSArNTg2Niw2MSBAQAogICAgICAgICBvZmZzZXQgPSBzbXBsLT5vZmZzZXQ7CiAgICAgICAgIHNpemUgPSBzbXBsLT5zaXplOwogICAgICAgICBjdHMgPSBtQ3VycmVudFRpbWUgKyBzbXBsLT5jb21wb3NpdGlvbk9mZnNldDsKLSAgICAgICAgbUN1cnJlbnRUaW1lICs9IHNtcGwtPmR1cmF0aW9uOwotICAgICAgICBpc1N5bmNTYW1wbGUgPSAobUN1cnJlbnRTYW1wbGVJbmRleCA9PSAwKTsgLy8gWFhYCisgICAgICAgIGN0cyAtPSBtRWxzdFNoaWZ0U3RhcnRUaWNrczsKIAotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZtQnVmZmVyKTsKKyAgICAgICAgbUN1cnJlbnRUaW1lICs9IHNtcGwtPmR1cmF0aW9uOworICAgICAgICBpc1N5bmNTYW1wbGUgPSAobUN1cnJlbnRTYW1wbGVJbmRleCA9PSAwKTsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZtQnVmZmVyKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBDSEVDSyhtQnVmZmVyID09IE5VTEwpOwogICAgICAgICAgICAgQUxPR1YoImFjcXVpcmVfYnVmZmVyIHJldHVybmVkICVkIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNpemUgPiBtQnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgICAgIEFMT0dFKCJidWZmZXIgdG9vIHNtYWxsOiAlenUgPiAlenUiLCBzaXplLCBtQnVmZmVyLT5zaXplKCkpOwogICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfQlVGRkVSX1RPT19TTUFMTDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogICAgIH0KIAogICAgIGNvbnN0IFNhbXBsZSAqc21wbCA9ICZtQ3VycmVudFNhbXBsZXNbbUN1cnJlbnRTYW1wbGVJbmRleF07Ci0gICAgTWV0YURhdGFCYXNlICZidWZtZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7Ci0gICAgYnVmbWV0YS5jbGVhcigpOworICAgIEFNZWRpYUZvcm1hdCAqYnVmbWV0YSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihidWZtZXRhKTsKICAgICBpZiAoc21wbC0+ZW5jcnlwdGVkc2l6ZXMuc2l6ZSgpKSB7CiAgICAgICAgIC8vIHN0b3JlIGNsZWFyL2VuY3J5cHRlZCBsZW5ndGhzIGluIG1ldGFkYXRhCi0gICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUywKICAgICAgICAgICAgICAgICBzbXBsLT5jbGVhcnNpemVzLmFycmF5KCksIHNtcGwtPmNsZWFyc2l6ZXMuc2l6ZSgpICogNCk7Ci0gICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsIDAsCisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLAogICAgICAgICAgICAgICAgIHNtcGwtPmVuY3J5cHRlZHNpemVzLmFycmF5KCksIHNtcGwtPmVuY3J5cHRlZHNpemVzLnNpemUoKSAqIDQpOwotICAgICAgICBidWZtZXRhLnNldEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCBtRGVmYXVsdElWU2l6ZSk7Ci0gICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIG1DcnlwdG9Nb2RlKTsKLSAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9LZXksIDAsIG1DcnlwdG9LZXksIDE2KTsKLSAgICAgICAgYnVmbWV0YS5zZXRJbnQzMihrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrLCBtRGVmYXVsdEVuY3J5cHRlZEJ5dGVCbG9jayk7Ci0gICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleVNraXBCeXRlQmxvY2ssIG1EZWZhdWx0U2tpcEJ5dGVCbG9jayk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUsIG1EZWZhdWx0SVZTaXplKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsIG1DcnlwdG9Nb2RlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIG1DcnlwdG9LZXksIDE2KTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0ssIG1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fU0tJUF9CWVRFX0JMT0NLLCBtRGVmYXVsdFNraXBCeXRlQmxvY2spOwogCi0gICAgICAgIHVpbnQzMl90IHR5cGUgPSAwOwotICAgICAgICBjb25zdCB2b2lkICppdiA9IE5VTEw7CisgICAgICAgIHZvaWQgKml2ID0gTlVMTDsKICAgICAgICAgc2l6ZV90IGl2bGVuZ3RoID0gMDsKLSAgICAgICAgaWYgKCFtRm9ybWF0LmZpbmREYXRhKAotICAgICAgICAgICAgICAgIGtLZXlDcnlwdG9JViwgJnR5cGUsICZpdiwgJml2bGVuZ3RoKSkgewotICAgICAgICAgICAgaXYgPSBzbXBsLT5pdjsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgImNyeXB0by1pdiIsICZpdiwgJml2bGVuZ3RoKSkgeworICAgICAgICAgICAgaXYgPSAodm9pZCAqKSBzbXBsLT5pdjsKICAgICAgICAgICAgIGl2bGVuZ3RoID0gMTY7IC8vIHVzZSAxNiBvciB0aGUgYWN0dWFsIHNpemU/CiAgICAgICAgIH0KLSAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwgMCwgaXYsIGl2bGVuZ3RoKTsKLQorICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWLCBpdiwgaXZsZW5ndGgpOwogICAgIH0KIAotICAgIGlmICgoIW1Jc0FWQyAmJiAhbUlzSEVWQyl8fCBtV2FudHNOQUxGcmFnbWVudHMpIHsKKyAgICBpZiAoIW1Jc0FWQyAmJiAhbUlzSEVWQykgewogICAgICAgICBpZiAobmV3QnVmZmVyKSB7CiAgICAgICAgICAgICBpZiAoIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIHNpemUpKSB7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCiAgICAgICAgICAgICAgICAgQUxPR0UoImZyYWdtZW50ZWRSZWFkIEVSUk9SX01BTEZPUk1FRCBzaXplICV6dSIsIHNpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPQpAQCAtNTM1MCwxMDMgKzU5MzEsNTcgQEAKICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAogICAgICAgICAgICAgICAgIEFMT0dFKCJpL28gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKICAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1Zm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgKChsb25nIGRvdWJsZSljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1Zm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICgobG9uZyBkb3VibGUpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwogCiAgICAgICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobUlzQVZDKSB7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgbGF5ZXJJZCA9IEZpbmRBVkNMYXllcklkKAogICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllcklkLCBsYXllcklkKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRCwgbGF5ZXJJZCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1Jc0hFVkMpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGxheWVySWQgPSBwYXJzZUhFVkNMYXllcklkKAorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBpZiAobGF5ZXJJZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lELCBsYXllcklkKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIW1Jc0FWQyAmJiAhbUlzSEVWQykgewotICAgICAgICAgICAgKm91dCA9IG1CdWZmZXI7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgKm91dCA9IG1CdWZmZXI7CisgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKIAotICAgICAgICAvLyBFYWNoIE5BTCB1bml0IGlzIHNwbGl0IHVwIGludG8gaXRzIGNvbnN0aXR1ZW50IGZyYWdtZW50cyBhbmQKLSAgICAgICAgLy8gZWFjaCBvbmUgb2YgdGhlbSByZXR1cm5lZCBpbiBpdHMgb3duIGJ1ZmZlci4KLQotICAgICAgICBDSEVDSyhtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+PSBtTkFMTGVuZ3RoU2l6ZSk7Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjID0KLSAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpICsgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0KLSAgICAgICAgc2l6ZV90IG5hbF9zaXplID0gcGFyc2VOQUxTaXplKHNyYyk7Ci0gICAgICAgIGlmIChtTkFMTGVuZ3RoU2l6ZSA+IFNJWkVfTUFYIC0gbmFsX3NpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJiLzI0NDQxNTUzLCBiLzI0NDQ1MTIyIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBtTkFMTGVuZ3RoU2l6ZSA8IG5hbF9zaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiaW5jb21wbGV0ZSBOQUwgdW5pdC4iKTsKLQotICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmNsb25lID0gbUJ1ZmZlci0+Y2xvbmUoKTsKLSAgICAgICAgQ0hFQ0soY2xvbmUgIT0gTlVMTCk7Ci0gICAgICAgIGNsb25lLT5zZXRfcmFuZ2UobUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBtTkFMTGVuZ3RoU2l6ZSwgbmFsX3NpemUpOwotCi0gICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG1OQUxMZW5ndGhTaXplICsgbmFsX3NpemUsCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBtTkFMTGVuZ3RoU2l6ZSAtIG5hbF9zaXplKTsKLQotICAgICAgICBpZiAobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAqb3V0ID0gY2xvbmU7Ci0KLSAgICAgICAgcmV0dXJuIE9LOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCJ3aG9sZSBOQUwiKTsKICAgICAgICAgLy8gV2hvbGUgTkFMIHVuaXRzIGFyZSByZXR1cm5lZCBidXQgZWFjaCBmcmFnbWVudCBpcyBwcmVmaXhlZCBieQogICAgICAgICAvLyB0aGUgc3RhcnQgY29kZSAoMHgwMCAwMCAwMCAwMSkuCiAgICAgICAgIHNzaXplX3QgbnVtX2J5dGVzX3JlYWQgPSAwOwotICAgICAgICBpbnQzMl90IGRybSA9IDA7Ci0gICAgICAgIGJvb2wgdXNlc0RSTSA9IChtRm9ybWF0LmZpbmRJbnQzMihrS2V5SXNEUk0sICZkcm0pICYmIGRybSAhPSAwKTsKICAgICAgICAgdm9pZCAqZGF0YSA9IE5VTEw7CiAgICAgICAgIGJvb2wgaXNNYWxGb3JtZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKHVzZXNEUk0pIHsKLSAgICAgICAgICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIHNpemUpKSB7Ci0gICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkYXRhID0gbUJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICAgICAgfQorICAgICAgICBpbnQzMl90IG1heF9zaXplOworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCAmbWF4X3NpemUpCisgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCAoc2l6ZV90KW1heF9zaXplLCBzaXplKSkgeworICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSB0cnVlOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50MzJfdCBtYXhfc2l6ZTsKLSAgICAgICAgICAgIGlmICghbUZvcm1hdC5maW5kSW50MzIoa0tleU1heElucHV0U2l6ZSwgJm1heF9zaXplKQotICAgICAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIChzaXplX3QpbWF4X3NpemUsIHNpemUpKSB7Ci0gICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkYXRhID0gbVNyY0J1ZmZlcjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGEgPSBtU3JjQnVmZmVyOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGlzTWFsRm9ybWVkIHx8IGRhdGEgPT0gTlVMTCkgewpAQCAtNTQ1NSw3ICs1OTkwLDcgQEAKICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICAgICAgbnVtX2J5dGVzX3JlYWQgPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgZGF0YSwgc2l6ZSk7CiAKQEAgLTU0NjQsNzUgKzU5OTksNjkgQEAKICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCiAgICAgICAgICAgICBBTE9HRSgiaS9vIGVycm9yIik7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHVzZXNEUk0pIHsKLSAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgc2l6ZSk7CisgICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKKyAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7CisgICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOwogCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1aW50OF90ICpkc3REYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7Ci0gICAgICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOwotCi0gICAgICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG1OQUxMZW5ndGhTaXplKTsKLSAgICAgICAgICAgICAgICBzaXplX3QgbmFsTGVuZ3RoID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoIWlzTWFsRm9ybWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbExlbmd0aCA9IHBhcnNlTkFMU2l6ZSgmbVNyY0J1ZmZlcltzcmNPZmZzZXRdKTsKLSAgICAgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxMZW5ndGhTaXplOwotICAgICAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBuYWxMZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIGRzdE9mZnNldCwgKHNpemVfdCk0dSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgZHN0T2Zmc2V0ICsgNCwgbmFsTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNNYWxGb3JtZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlZpZGVvIGlzIG1hbGZvcm1lZDsgbmFsTGVuZ3RoICV6dSIsIG5hbExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5hbExlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChkc3RPZmZzZXQgPiBTSVpFX01BWCAtIDQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgPiBTSVpFX01BWCAtIG5hbExlbmd0aCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCArIG5hbExlbmd0aCA+IG1CdWZmZXItPnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNjM2NTM0OSA6ICV6dSAlenUiLCBkc3RPZmZzZXQsIG1CdWZmZXItPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjYzNjUzNDkiKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDE7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KCZkc3REYXRhW2RzdE9mZnNldF0sICZtU3JjQnVmZmVyW3NyY09mZnNldF0sIG5hbExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG5hbExlbmd0aDsKLSAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2l6ZSkgeworICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOworICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IDA7CisgICAgICAgICAgICBpZiAoIWlzTWFsRm9ybWVkKSB7CisgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOworICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMTGVuZ3RoU2l6ZTsKKyAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBuYWxMZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgZHN0T2Zmc2V0LCAoc2l6ZV90KTR1KQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIGRzdE9mZnNldCArIDQsIG5hbExlbmd0aCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOwotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOwotICAgICAgICB9CiAKLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwotICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzbXBsLT5kdXJhdGlvbiAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICBpZiAoaXNNYWxGb3JtZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiVmlkZW8gaXMgbWFsZm9ybWVkOyBuYWxMZW5ndGggJXp1IiwgbmFsTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuYWxMZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZHN0T2Zmc2V0ID4gU0laRV9NQVggLSA0IHx8CisgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgPiBTSVpFX01BWCAtIG5hbExlbmd0aCB8fAorICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ICsgbmFsTGVuZ3RoID4gbUJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjYzNjUzNDkgOiAlenUgJXp1IiwgZHN0T2Zmc2V0LCBtQnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjYzNjUzNDkiKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMTsKKyAgICAgICAgICAgIG1lbWNweSgmZHN0RGF0YVtkc3RPZmZzZXRdLCAmbVNyY0J1ZmZlcltzcmNPZmZzZXRdLCBuYWxMZW5ndGgpOworICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgICAgIGRzdE9mZnNldCArPSBuYWxMZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgQ0hFQ0tfRVEoc3JjT2Zmc2V0LCBzaXplKTsKKyAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRzdE9mZnNldCk7CisKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpidWZtZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChidWZtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgKChsb25nIGRvdWJsZSljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoKGxvbmcgZG91YmxlKXNtcGwtPmR1cmF0aW9uICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKIAogICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGlzU3luY1NhbXBsZSkgewotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogICAgICAgICB9CiAKICAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OwpAQCAtNTU0MCwxNSArNjA2OSwxNyBAQAogICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgIH0KKworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIE1QRUc0RXh0cmFjdG9yOjpUcmFjayAqTVBFRzRFeHRyYWN0b3I6OmZpbmRUcmFja0J5TWltZVByZWZpeCgKICAgICAgICAgY29uc3QgY2hhciAqbWltZVByZWZpeCkgewogICAgIGZvciAoVHJhY2sgKnRyYWNrID0gbUZpcnN0VHJhY2s7IHRyYWNrICE9IE5VTEw7IHRyYWNrID0gdHJhY2stPm5leHQpIHsKICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgaWYgKHRyYWNrLT5tZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpCisgICAgICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKQogICAgICAgICAgICAgICAgICYmICFzdHJuY2FzZWNtcChtaW1lLCBtaW1lUHJlZml4LCBzdHJsZW4obWltZVByZWZpeCkpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJhY2s7CiAgICAgICAgIH0KQEAgLTU1NTcsNyArNjA4OCw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBib29sIExlZ2FjeVNuaWZmTVBFRzQoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKK3N0YXRpYyBib29sIExlZ2FjeVNuaWZmTVBFRzQoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgewogICAgIHVpbnQ4X3QgaGVhZGVyWzhdOwogCiAgICAgc3NpemVfdCBuID0gc291cmNlLT5yZWFkQXQoNCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7CkBAIC01NTg4LDYgKzYxMTksNyBAQAogICAgICAgICBGT1VSQ0MoImF2YzEiKSwKICAgICAgICAgRk9VUkNDKCJodmMxIiksCiAgICAgICAgIEZPVVJDQygiaGV2MSIpLAorICAgICAgICBGT1VSQ0MoImF2MDEiKSwKICAgICAgICAgRk9VUkNDKCIzZ3A0IiksCiAgICAgICAgIEZPVVJDQygibXA0MSIpLAogICAgICAgICBGT1VSQ0MoIm1wNDIiKSwKQEAgLTU1OTgsNiArNjEzMCw3IEBACiAgICAgICAgIC8vIEp1c3QgZ2l2ZSB0aGVzZSBmaWxlIHR5cGVzIGEgY2hhbmNlLgogICAgICAgICBGT1VSQ0MoInF0ICAiKSwgIC8vIEFwcGxlJ3MgUXVpY2tUaW1lCiAgICAgICAgIEZPVVJDQygiTVNOViIpLCAgLy8gU29ueSdzIFBTUAorICAgICAgICBGT1VSQ0MoIndtZiAiKSwKIAogICAgICAgICBGT1VSQ0MoIjNnMmEiKSwgIC8vIDNHUFAyCiAgICAgICAgIEZPVVJDQygiM2cyYiIpLApAQCAtNTYyMyw3ICs2MTU2LDcgQEAKIC8vIEFsc28gdHJ5IHRvIGlkZW50aWZ5IHdoZXJlIHRoaXMgZmlsZSdzIG1ldGFkYXRhIGVuZHMKIC8vIChlbmQgb2YgdGhlICdtb292JyBhdG9tKSBhbmQgcmVwb3J0IGl0IHRvIHRoZSBjYWxsZXIgYXMgcGFydCBvZgogLy8gdGhlIG1ldGFkYXRhLgotc3RhdGljIGJvb2wgQmV0dGVyU25pZmZNUEVHNChEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworc3RhdGljIGJvb2wgQmV0dGVyU25pZmZNUEVHNChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgLy8gV2Ugc2NhbiB1cCB0byAxMjggYnl0ZXMgdG8gaWRlbnRpZnkgdGhpcyBmaWxlIGFzIGFuIE1QNC4KICAgICBzdGF0aWMgY29uc3Qgb2ZmNjRfdCBrTWF4U2Nhbk9mZnNldCA9IDEyOGxsOwogCkBAIC01NjY5LDcgKzYyMDIsOCBAQAogCiAgICAgICAgIGNoYXIgY2h1bmtzdHJpbmdbNV07CiAgICAgICAgIE1ha2VGb3VyQ0NTdHJpbmcoY2h1bmtUeXBlLCBjaHVua3N0cmluZyk7Ci0gICAgICAgIEFMT0dWKCJzYXcgY2h1bmsgdHlwZSAlcywgc2l6ZSAlIiBQUkl1NjQgIiBAICVsbGQiLCBjaHVua3N0cmluZywgY2h1bmtTaXplLCAobG9uZyBsb25nKW9mZnNldCk7CisgICAgICAgIEFMT0dWKCJzYXcgY2h1bmsgdHlwZSAlcywgc2l6ZSAlIiBQUkl1NjQgIiBAICVsbGQiLAorICAgICAgICAgICAgICAgIGNodW5rc3RyaW5nLCBjaHVua1NpemUsIChsb25nIGxvbmcpb2Zmc2V0KTsKICAgICAgICAgc3dpdGNoIChjaHVua1R5cGUpIHsKICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCJmdHlwIik6CiAgICAgICAgICAgICB7CkBAIC01NzMwLDE4ICs2MjY0LDE5IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIHZvaWQgKikgewotICAgIHJldHVybiBuZXcgTVBFRzRFeHRyYWN0b3Ioc291cmNlKTsKK3N0YXRpYyBDTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcihDRGF0YVNvdXJjZSAqc291cmNlLCB2b2lkICopIHsKKyAgICByZXR1cm4gd3JhcChuZXcgTVBFRzRFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKiwKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSB7Ci0gICAgaWYgKEJldHRlclNuaWZmTVBFRzQoc291cmNlLCBjb25maWRlbmNlKSkgeworc3RhdGljIENyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKiwKKyAgICAgICAgRnJlZU1ldGFGdW5jICopIHsKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOworICAgIGlmIChCZXR0ZXJTbmlmZk1QRUc0KCZoZWxwZXIsIGNvbmZpZGVuY2UpKSB7CiAgICAgICAgIHJldHVybiBDcmVhdGVFeHRyYWN0b3I7CiAgICAgfQogCi0gICAgaWYgKExlZ2FjeVNuaWZmTVBFRzQoc291cmNlLCBjb25maWRlbmNlKSkgeworICAgIGlmIChMZWdhY3lTbmlmZk1QRUc0KCZoZWxwZXIsIGNvbmZpZGVuY2UpKSB7CiAgICAgICAgIEFMT0dXKCJJZGVudGlmaWVkIHN1cHBvcnRlZCBtcGVnNCB0aHJvdWdoIExlZ2FjeVNuaWZmTVBFRzQuIik7CiAgICAgICAgIHJldHVybiBDcmVhdGVFeHRyYWN0b3I7CiAgICAgfQpAQCAtNTc0OSwxNiArNjI4NCwzMSBAQAogICAgIHJldHVybiBOVUxMOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZW5zaW9uc1tdID0geworICAgICIzZzIiLAorICAgICIzZ2EiLAorICAgICIzZ3AiLAorICAgICIzZ3BwIiwKKyAgICAiM2dwcDIiLAorICAgICJtNGEiLAorICAgICJtNHIiLAorICAgICJtNHYiLAorICAgICJtb3YiLAorICAgICJtcDQiLAorICAgICJxdCIsCisgICAgTlVMTAorfTsKKwogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgVVVJRCgiMjc1NzVjNjctNDQxNy00YzU0LThkM2QtOGU2MjY5ODVhMTY0IiksCi0gICAgICAgIDEsIC8vIHZlcnNpb24KKyAgICAgICAgMiwgLy8gdmVyc2lvbgogICAgICAgICAiTVA0IEV4dHJhY3RvciIsCi0gICAgICAgIFNuaWZmCisgICAgICAgIHsgLnYzID0ge1NuaWZmLCBleHRlbnNpb25zfSB9LAogICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oCmluZGV4IDNlYTA5NjMuLmZhZGZiNTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuaApAQCAtMjAsOSArMjAsOSBAQAogCiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CkBAIC0zMSw4ICszMSw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIHN0cnVjdCBBTWVzc2FnZTsKLWNsYXNzIERhdGFTb3VyY2VCYXNlOwotc3RydWN0IENhY2hlZFJhbmdlZERhdGFTb3VyY2U7CitzdHJ1Y3QgQ0RhdGFTb3VyY2U7CitjbGFzcyBEYXRhU291cmNlSGVscGVyOwogY2xhc3MgU2FtcGxlVGFibGU7CiBjbGFzcyBTdHJpbmc4OwogbmFtZXNwYWNlIGhlaWYgewpAQCAtNTMsMTUgKzUzLDE1IEBACiAgICAgdWludDMyX3QgZGVmYXVsdF9zYW1wbGVfZmxhZ3M7CiB9OwogCi1jbGFzcyBNUEVHNEV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitjbGFzcyBNUEVHNEV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgTVBFRzRFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSA9IE5VTEwpOworICAgIGV4cGxpY2l0IE1QRUc0RXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSA9IE5VTEwpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJNUEVHNEV4dHJhY3RvciI7IH0KIApAQCAtNzcsNyArNzcsNyBAQAogICAgIH07CiAgICAgc3RydWN0IFRyYWNrIHsKICAgICAgICAgVHJhY2sgKm5leHQ7Ci0gICAgICAgIE1ldGFEYXRhQmFzZSBtZXRhOworICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGE7CiAgICAgICAgIHVpbnQzMl90IHRpbWVzY2FsZTsKICAgICAgICAgc3A8U2FtcGxlVGFibGU+IHNhbXBsZVRhYmxlOwogICAgICAgICBib29sIGluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YTsKQEAgLTg1LDYgKzg1LDcgQEAKICAgICAgICAgYm9vbCBoYXNfZWxzdDsKICAgICAgICAgaW50NjRfdCBlbHN0X21lZGlhX3RpbWU7CiAgICAgICAgIHVpbnQ2NF90IGVsc3Rfc2VnbWVudF9kdXJhdGlvbjsKKyAgICAgICAgaW50MzJfdCBlbHN0U2hpZnRTdGFydFRpY2tzOwogICAgICAgICBib29sIHN1YnNhbXBsZV9lbmNyeXB0aW9uOwogICAgIH07CiAKQEAgLTk3LDggKzk4LDcgQEAKIAogICAgIFZlY3RvcjxUcmV4PiBtVHJleDsKIAotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBDYWNoZWRSYW5nZWREYXRhU291cmNlICptQ2FjaGVkU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgdWludDMyX3QgbUhlYWRlclRpbWVzY2FsZTsKICAgICBib29sIG1Jc1FUOwpAQCAtMTA4LDcgKzEwOCw3IEBACiAKICAgICBUcmFjayAqbUZpcnN0VHJhY2ssICptTGFzdFRyYWNrOwogCi0gICAgTWV0YURhdGFCYXNlIG1GaWxlTWV0YURhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptRmlsZU1ldGFEYXRhOwogCiAgICAgVmVjdG9yPHVpbnQzMl90PiBtUGF0aDsKICAgICBTdHJpbmc4IG1MYXN0Q29tbWVudE1lYW47CkBAIC0xMzksMTcgKzEzOSwxNiBAQAogCiAgICAgVHJhY2sgKmZpbmRUcmFja0J5TWltZVByZWZpeChjb25zdCBjaGFyICptaW1lUHJlZml4KTsKIAotICAgIHN0YXR1c190IHBhcnNlQUMzU2FtcGxlRW50cnkob2ZmNjRfdCBvZmZzZXQpOwotICAgIHN0YXR1c190IHBhcnNlQUMzU3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90IHNhbXBsZVJhdGUpOworICAgIHN0YXR1c190IHBhcnNlQ2hhbm5lbENvdW50U2FtcGxlUmF0ZSgKKyAgICAgICAgICAgIG9mZjY0X3QgKm9mZnNldCwgdWludDE2X3QgKmNoYW5uZWxDb3VudCwgdWludDE2X3QgKnNhbXBsZVJhdGUpOworICAgIHN0YXR1c190IHBhcnNlQUMzU3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQpOworICAgIHN0YXR1c190IHBhcnNlRUFDM1NwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0KTsKKyAgICBzdGF0dXNfdCBwYXJzZUFDNFNwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0KTsKIAogICAgIE1QRUc0RXh0cmFjdG9yKGNvbnN0IE1QRUc0RXh0cmFjdG9yICYpOwogICAgIE1QRUc0RXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTVBFRzRFeHRyYWN0b3IgJik7CiB9OwogCi1ib29sIFNuaWZmTVBFRzQoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgc3A8QU1lc3NhZ2U+ICopOwotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIE1QRUc0X0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuY3BwCmluZGV4IDkzZWU3YzYuLjI4OTBiMjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5jcHAKQEAgLTExMSw4ICsxMTEsMTUgQEAKICAgICAgICAgICAgIGlmICgoZXJyID0gZ2V0U2FtcGxlU2l6ZURpcmVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENodW5rU2FtcGxlSW5kZXggKyBpLCAmc2FtcGxlU2l6ZSkpICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImdldFNhbXBsZVNpemVEaXJlY3QgcmV0dXJuIGVycm9yIik7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRDaHVua1NhbXBsZVNpemVzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICAvLyBzdHNjIHNhbXBsZSBjb3VudCBpcyBub3Qgc3luYyB3aXRoIHN0c3ogc2FtcGxlIGNvdW50CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9PVVRfT0ZfUkFOR0UpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coInN0c2Mgc2FtcGxlcyglZCkgbm90IHN5bmMgd2l0aCBzdHN6IHNhbXBsZXMoJWQpIiwgbVNhbXBsZXNQZXJDaHVuaywgaSk7CisgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVzUGVyQ2h1bmsgPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50Q2h1bmtTYW1wbGVTaXplcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbUN1cnJlbnRDaHVua1NhbXBsZVNpemVzLnB1c2goc2FtcGxlU2l6ZSk7CkBAIC0zMDEsNyArMzA4LDcgQEAKIH0KIAogc3RhdHVzX3QgU2FtcGxlSXRlcmF0b3I6OmZpbmRTYW1wbGVUaW1lQW5kRHVyYXRpb24oCi0gICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4LCB1aW50MzJfdCAqdGltZSwgdWludDMyX3QgKmR1cmF0aW9uKSB7CisgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4LCB1aW50NjRfdCAqdGltZSwgdWludDY0X3QgKmR1cmF0aW9uKSB7CiAgICAgaWYgKHNhbXBsZUluZGV4ID49IG1UYWJsZS0+bU51bVNhbXBsZVNpemVzKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQpAQCAtMzE0LDggKzMyMSw4IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpZiAobVRpbWVUb1NhbXBsZUluZGV4ID09IG1UYWJsZS0+bVRpbWVUb1NhbXBsZUNvdW50IHx8Ci0gICAgICAgICAgICAobVRUU0R1cmF0aW9uICE9IDAgJiYgbVRUU0NvdW50ID4gVUlOVDMyX01BWCAvIG1UVFNEdXJhdGlvbikgfHwKLSAgICAgICAgICAgIG1UVFNTYW1wbGVUaW1lID4gVUlOVDMyX01BWCAtIChtVFRTQ291bnQgKiBtVFRTRHVyYXRpb24pKSB7CisgICAgICAgICAgICAobVRUU0R1cmF0aW9uICE9IDAgJiYgbVRUU0NvdW50ID4gVUlOVDY0X01BWCAvIG1UVFNEdXJhdGlvbikgfHwKKyAgICAgICAgICAgIG1UVFNTYW1wbGVUaW1lID4gVUlOVDY0X01BWCAtIChtVFRTQ291bnQgKiBtVFRTRHVyYXRpb24pKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwogICAgICAgICB9CiAKQEAgLTMyOCwxOSArMzM1LDI3IEBACiAgICAgICAgICsrbVRpbWVUb1NhbXBsZUluZGV4OwogICAgIH0KIAotICAgICp0aW1lID0gbVRUU1NhbXBsZVRpbWUgKyBtVFRTRHVyYXRpb24gKiAoc2FtcGxlSW5kZXggLSBtVFRTU2FtcGxlSW5kZXgpOworICAgIC8vIGJlbG93IGlzIGVxdWl2YWxlbnQgdG86CisgICAgLy8gKnRpbWUgPSBtVFRTU2FtcGxlVGltZSArIG1UVFNEdXJhdGlvbiAqIChzYW1wbGVJbmRleCAtIG1UVFNTYW1wbGVJbmRleCk7CisgICAgdWludDY0X3QgdG1wOworICAgIGlmIChfX2J1aWx0aW5fc3ViX292ZXJmbG93KHNhbXBsZUluZGV4LCBtVFRTU2FtcGxlSW5kZXgsICZ0bXApIHx8CisgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1UVFNEdXJhdGlvbiwgdG1wLCAmdG1wKSB8fAorICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhtVFRTU2FtcGxlVGltZSwgdG1wLCAmdG1wKSkgeworICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgIH0KKyAgICAqdGltZSA9IHRtcDsKIAogICAgIGludDMyX3Qgb2Zmc2V0ID0gbVRhYmxlLT5nZXRDb21wb3NpdGlvblRpbWVPZmZzZXQoc2FtcGxlSW5kZXgpOwogICAgIGlmICgob2Zmc2V0IDwgMCAmJiAqdGltZSA8IChvZmZzZXQgPT0gSU5UMzJfTUlOID8KLSAgICAgICAgICAgIElOVDMyX01BWCA6IHVpbnQzMl90KC1vZmZzZXQpKSkgfHwKLSAgICAgICAgICAgIChvZmZzZXQgPiAwICYmICp0aW1lID4gVUlOVDMyX01BWCAtIG9mZnNldCkpIHsKLSAgICAgICAgQUxPR0UoIiV1ICsgJWQgd291bGQgb3ZlcmZsb3ciLCAqdGltZSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIElOVDY0X01BWCA6IHVpbnQ2NF90KC1vZmZzZXQpKSkgfHwKKyAgICAgICAgICAgIChvZmZzZXQgPiAwICYmICp0aW1lID4gVUlOVDY0X01BWCAtIG9mZnNldCkpIHsKKyAgICAgICAgQUxPR0UoIiVsbHUgKyAlZCB3b3VsZCBvdmVyZmxvdyIsICh1bnNpZ25lZCBsb25nIGxvbmcpICp0aW1lLCBvZmZzZXQpOwogICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KICAgICBpZiAob2Zmc2V0ID4gMCkgewogICAgICAgICAqdGltZSArPSBvZmZzZXQ7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgKnRpbWUgLT0gKG9mZnNldCA9PSBJTlQzMl9NSU4gPyBJTlQzMl9NQVggOiAoLW9mZnNldCkpOworICAgICAgICAqdGltZSAtPSAob2Zmc2V0ID09IElOVDY0X01JTiA/IElOVDY0X01BWCA6ICgtb2Zmc2V0KSk7CiAgICAgfQogCiAgICAgKmR1cmF0aW9uID0gbVRUU0R1cmF0aW9uOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmgKaW5kZXggNmU0ZjYwZS4uNWEwZWE3NiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5oCkBAIC0zMyw4ICszMyw4IEBACiAgICAgdWludDMyX3QgZ2V0RGVzY0luZGV4KCkgY29uc3QgeyByZXR1cm4gbUNodW5rRGVzYzsgfQogICAgIG9mZjY0X3QgZ2V0U2FtcGxlT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbUN1cnJlbnRTYW1wbGVPZmZzZXQ7IH0KICAgICBzaXplX3QgZ2V0U2FtcGxlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50U2FtcGxlU2l6ZTsgfQotICAgIHVpbnQzMl90IGdldFNhbXBsZVRpbWUoKSBjb25zdCB7IHJldHVybiBtQ3VycmVudFNhbXBsZVRpbWU7IH0KLSAgICB1aW50MzJfdCBnZXRTYW1wbGVEdXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50U2FtcGxlRHVyYXRpb247IH0KKyAgICB1aW50NjRfdCBnZXRTYW1wbGVUaW1lKCkgY29uc3QgeyByZXR1cm4gbUN1cnJlbnRTYW1wbGVUaW1lOyB9CisgICAgdWludDY0X3QgZ2V0U2FtcGxlRHVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtQ3VycmVudFNhbXBsZUR1cmF0aW9uOyB9CiAKICAgICB1aW50MzJfdCBnZXRMYXN0U2FtcGxlSW5kZXhJbkNodW5rKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbUN1cnJlbnRTYW1wbGVJbmRleCArIG1TYW1wbGVzUGVyQ2h1bmsgLQpAQCAtNjMsMjAgKzYzLDIwIEBACiAKICAgICB1aW50MzJfdCBtVGltZVRvU2FtcGxlSW5kZXg7CiAgICAgdWludDMyX3QgbVRUU1NhbXBsZUluZGV4OwotICAgIHVpbnQzMl90IG1UVFNTYW1wbGVUaW1lOworICAgIHVpbnQ2NF90IG1UVFNTYW1wbGVUaW1lOwogICAgIHVpbnQzMl90IG1UVFNDb3VudDsKLSAgICB1aW50MzJfdCBtVFRTRHVyYXRpb247CisgICAgdWludDY0X3QgbVRUU0R1cmF0aW9uOwogCiAgICAgdWludDMyX3QgbUN1cnJlbnRTYW1wbGVJbmRleDsKICAgICBvZmY2NF90IG1DdXJyZW50U2FtcGxlT2Zmc2V0OwogICAgIHNpemVfdCBtQ3VycmVudFNhbXBsZVNpemU7Ci0gICAgdWludDMyX3QgbUN1cnJlbnRTYW1wbGVUaW1lOwotICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlRHVyYXRpb247CisgICAgdWludDY0X3QgbUN1cnJlbnRTYW1wbGVUaW1lOworICAgIHVpbnQ2NF90IG1DdXJyZW50U2FtcGxlRHVyYXRpb247CiAKICAgICB2b2lkIHJlc2V0KCk7CiAgICAgc3RhdHVzX3QgZmluZENodW5rUmFuZ2UodWludDMyX3Qgc2FtcGxlSW5kZXgpOwogICAgIHN0YXR1c190IGdldENodW5rT2Zmc2V0KHVpbnQzMl90IGNodW5rLCBvZmY2NF90ICpvZmZzZXQpOwotICAgIHN0YXR1c190IGZpbmRTYW1wbGVUaW1lQW5kRHVyYXRpb24odWludDMyX3Qgc2FtcGxlSW5kZXgsIHVpbnQzMl90ICp0aW1lLCB1aW50MzJfdCAqZHVyYXRpb24pOworICAgIHN0YXR1c190IGZpbmRTYW1wbGVUaW1lQW5kRHVyYXRpb24odWludDMyX3Qgc2FtcGxlSW5kZXgsIHVpbnQ2NF90ICp0aW1lLCB1aW50NjRfdCAqZHVyYXRpb24pOwogCiAgICAgU2FtcGxlSXRlcmF0b3IoY29uc3QgU2FtcGxlSXRlcmF0b3IgJik7CiAgICAgU2FtcGxlSXRlcmF0b3IgJm9wZXJhdG9yPShjb25zdCBTYW1wbGVJdGVyYXRvciAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmNwcAppbmRleCAyNWY4ZTJhLi5iZjI5YmYxIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuY3BwCkBAIC0yNSw3ICsyNSw3IEBACiAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAKQEAgLTExNCw3ICsxMTQsNyBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1TYW1wbGVUYWJsZTo6U2FtcGxlVGFibGUoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK1NhbXBsZVRhYmxlOjpTYW1wbGVUYWJsZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbUNodW5rT2Zmc2V0T2Zmc2V0KC0xKSwKICAgICAgIG1DaHVua09mZnNldFR5cGUoMCksCkBAIC02MTQsNyArNjE0LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXVpbnQzMl90IGFic19kaWZmZXJlbmNlKHVpbnQzMl90IHRpbWUxLCB1aW50MzJfdCB0aW1lMikgewordWludDMyX3QgYWJzX2RpZmZlcmVuY2UodWludDY0X3QgdGltZTEsIHVpbnQ2NF90IHRpbWUyKSB7CiAgICAgcmV0dXJuIHRpbWUxID4gdGltZTIgPyB0aW1lMSAtIHRpbWUyIDogdGltZTIgLSB0aW1lMTsKIH0KIApAQCAtNjYyLDcgKzY2Miw3IEBACiAgICAgfQogCiAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXggPSAwOwotICAgIHVpbnQzMl90IHNhbXBsZVRpbWUgPSAwOworICAgIHVpbnQ2NF90IHNhbXBsZVRpbWUgPSAwOwogCiAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1UaW1lVG9TYW1wbGVDb3VudDsgKytpKSB7CiAgICAgICAgIHVpbnQzMl90IG4gPSBtVGltZVRvU2FtcGxlWzIgKiBpXTsKQEAgLTY4NCwxMyArNjg0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcFRpbWVEZWx0YSA9PSBJTlQzMl9NSU4gPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMl9NQVggOiB1aW50MzJfdCgtY29tcFRpbWVEZWx0YSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGNvbXBUaW1lRGVsdGEgPiAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgPiBVSU5UMzJfTUFYIC0gY29tcFRpbWVEZWx0YSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiV1ICsgJWQgd291bGQgb3ZlcmZsb3csIGNsYW1waW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLCBjb21wVGltZURlbHRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSA+IFVJTlQ2NF9NQVggLSBjb21wVGltZURlbHRhKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJWxsdSArICVkIHdvdWxkIG92ZXJmbG93LCBjbGFtcGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2FtcGxlVGltZSwgY29tcFRpbWVEZWx0YSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wVGltZURlbHRhIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID0gVUlOVDMyX01BWDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgPSBVSU5UNjRfTUFYOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGNvbXBUaW1lRGVsdGEgPSAwOwogICAgICAgICAgICAgICAgIH0KQEAgLTcwMSwxMCArNzAxLDEwIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICsrc2FtcGxlSW5kZXg7Ci0gICAgICAgICAgICBpZiAoc2FtcGxlVGltZSA+IFVJTlQzMl9NQVggLSBkZWx0YSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIldSArICV1IHdvdWxkIG92ZXJmbG93LCBjbGFtcGluZyIsCi0gICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUsIGRlbHRhKTsKLSAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID0gVUlOVDMyX01BWDsKKyAgICAgICAgICAgIGlmIChzYW1wbGVUaW1lID4gVUlOVDY0X01BWCAtIGRlbHRhKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVsbHUgKyAldSB3b3VsZCBvdmVyZmxvdywgY2xhbXBpbmciLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzYW1wbGVUaW1lLCBkZWx0YSk7CisgICAgICAgICAgICAgICAgc2FtcGxlVGltZSA9IFVJTlQ2NF9NQVg7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgKz0gZGVsdGE7CiAgICAgICAgICAgICB9CkBAIC04NzAsMTkgKzg3MCwxOSBAQAogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOworICAgICAgICAgICAgdWludDY0X3Qgc2FtcGxlX3RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKIAogICAgICAgICAgICAgZXJyID0gbVNhbXBsZUl0ZXJhdG9yLT5zZWVrVG8obVN5bmNTYW1wbGVzW2xlZnRdKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDMyX3QgdXBwZXJfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOworICAgICAgICAgICAgdWludDY0X3QgdXBwZXJfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOwogCiAgICAgICAgICAgICBlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyhtU3luY1NhbXBsZXNbbGVmdCAtIDFdKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDMyX3QgbG93ZXJfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOworICAgICAgICAgICAgdWludDY0X3QgbG93ZXJfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOwogCiAgICAgICAgICAgICAvLyB1c2UgYWJzX2RpZmZlcmVuY2UgZm9yIHNhZmV0eQogICAgICAgICAgICAgaWYgKGFic19kaWZmZXJlbmNlKHVwcGVyX3RpbWUsIHNhbXBsZV90aW1lKSA+CkBAIC05NTUsOSArOTU1LDkgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsCiAgICAgICAgIG9mZjY0X3QgKm9mZnNldCwKICAgICAgICAgc2l6ZV90ICpzaXplLAotICAgICAgICB1aW50MzJfdCAqY29tcG9zaXRpb25UaW1lLAorICAgICAgICB1aW50NjRfdCAqY29tcG9zaXRpb25UaW1lLAogICAgICAgICBib29sICppc1N5bmNTYW1wbGUsCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVEdXJhdGlvbikgeworICAgICAgICB1aW50NjRfdCAqc2FtcGxlRHVyYXRpb24pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgc3RhdHVzX3QgZXJyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmgKaW5kZXggZGQ2ODg2MC4uNTdmNmU2MiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5oCkBAIC0yMSwxOCArMjEsMTkgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KIAorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIERhdGFTb3VyY2VCYXNlOworY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKIHN0cnVjdCBTYW1wbGVJdGVyYXRvcjsKIAogY2xhc3MgU2FtcGxlVGFibGUgOiBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgU2FtcGxlVGFibGUoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisgICAgZXhwbGljaXQgU2FtcGxlVGFibGUoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKIAogICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0OwogCkBAIC02NSw5ICs2Niw5IEBACiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwKICAgICAgICAgICAgIG9mZjY0X3QgKm9mZnNldCwKICAgICAgICAgICAgIHNpemVfdCAqc2l6ZSwKLSAgICAgICAgICAgIHVpbnQzMl90ICpjb21wb3NpdGlvblRpbWUsCisgICAgICAgICAgICB1aW50NjRfdCAqY29tcG9zaXRpb25UaW1lLAogICAgICAgICAgICAgYm9vbCAqaXNTeW5jU2FtcGxlID0gTlVMTCwKLSAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVEdXJhdGlvbiA9IE5VTEwpOworICAgICAgICAgICAgdWludDY0X3QgKnNhbXBsZUR1cmF0aW9uID0gTlVMTCk7CiAKICAgICAvLyBjYWxsIG9ubHkgYWZ0ZXIgZ2V0TWV0YURhdGFGb3JTYW1wbGUgaGFzIGJlZW4gY2FsbGVkIHN1Y2Nlc3NmdWxseS4KICAgICB1aW50MzJfdCBnZXRMYXN0U2FtcGxlSW5kZXhJbkNodW5rKCk7CkBAIC0xMDIsNyArMTAzLDcgQEAKICAgICAvLyBMaW1pdCB0aGUgdG90YWwgc2l6ZSBvZiBhbGwgaW50ZXJuYWwgdGFibGVzIHRvIDIwME1pQi4KICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhUb3RhbFNpemUgPSAyMDAgKiAoMSA8PCAyMCk7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgTXV0ZXggbUxvY2s7CiAKICAgICBvZmY2NF90IG1DaHVua09mZnNldE9mZnNldDsKQEAgLTEyMyw3ICsxMjQsNyBAQAogCiAgICAgc3RydWN0IFNhbXBsZVRpbWVFbnRyeSB7CiAgICAgICAgIHVpbnQzMl90IG1TYW1wbGVJbmRleDsKLSAgICAgICAgdWludDMyX3QgbUNvbXBvc2l0aW9uVGltZTsKKyAgICAgICAgdWludDY0X3QgbUNvbXBvc2l0aW9uVGltZTsKICAgICB9OwogICAgIFNhbXBsZVRpbWVFbnRyeSAqbVNhbXBsZVRpbWVFbnRyaWVzOwogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAKaW5kZXggMzhjODZlYi4uMGYwYzcyYyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icApAQCAtMTUsMjMgKzE1LDI2IEBACiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhc0AxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJjcnlwdG8iLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliY3J5cHRvIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fd2l0aG91dF9pbWVtb3J5IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydCIsCiAgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMmV4dHJhY3RvciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKICAgICBdLAogCiAgICAgbmFtZTogImxpYm1wZWcyZXh0cmFjdG9yIiwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvRXh0cmFjdG9yQnVuZGxlLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvRXh0cmFjdG9yQnVuZGxlLmNwcAppbmRleCA4YTBmYTAzLi45NDZhMmE5IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0V4dHJhY3RvckJ1bmRsZS5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9FeHRyYWN0b3JCdW5kbGUuY3BwCkBAIC0xOCwzOSArMTgsNTQgQEAKICNkZWZpbmUgTE9HX1RBRyAiTVBFRzJFeHRyYWN0b3JCdW5kbGUiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSAiTVBFRzJQU0V4dHJhY3Rvci5oIgogI2luY2x1ZGUgIk1QRUcyVFNFeHRyYWN0b3IuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgQ0RhdGFTb3VyY2U7CisKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAibTJwIiwKKyAgICJ0cyIsCisgICBOVUxMCit9OworCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCIzZDFkY2ZlYi1lNDBhLTQzNmQtYTU3NC1jMjQzOGE1NTVlNWYiKSwKICAgICAgICAgMSwKICAgICAgICAgIk1QRUcyLVBTL1RTIEV4dHJhY3RvciIsCi0gICAgICAgIFtdKAotICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgICAgICAgICAgdm9pZCAqKiwKLSAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIC0+IE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyB7Ci0gICAgICAgICAgICBpZiAoU25pZmZNUEVHMlRTKHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gW10oCi0gICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBNZWRpYUV4dHJhY3RvciogewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1QRUcyVFNFeHRyYWN0b3Ioc291cmNlKTt9OwotICAgICAgICAgICAgfSBlbHNlIGlmIChTbmlmZk1QRUcyUFMoc291cmNlLCBjb25maWRlbmNlKSkgeworICAgICAgICB7CisgICAgICAgICAgICAudjMgPSB7CisgICAgICAgICAgICAgICAgW10oCisgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICAgICAgICAgICAgICB2b2lkICoqLAorICAgICAgICAgICAgICAgICAgICBGcmVlTWV0YUZ1bmMgKikgLT4gQ3JlYXRvckZ1bmMgeworICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICBpZiAoU25pZmZNUEVHMlRTKCZoZWxwZXIsIGNvbmZpZGVuY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gTWVkaWFFeHRyYWN0b3IqIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1QRUcyUFNFeHRyYWN0b3Ioc291cmNlKTt9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IENNZWRpYUV4dHJhY3RvciogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKG5ldyBNUEVHMlRTRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSkpKTt9OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFNuaWZmTVBFRzJQUygmaGVscGVyLCBjb25maWRlbmNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IENNZWRpYUV4dHJhY3RvciogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKG5ldyBNUEVHMlBTRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSkpKTt9OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KKyAgICAgICAgfSwKICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmNwcAppbmRleCA2OTgwYjgyLi43MzE1ODRkIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5jcHAKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlICJtcGVnMnRzL0VTUXVldWUuaCIKIAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0zNCwyMiArMzMsMjMgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjayA6IHB1YmxpYyBNZWRpYVRyYWNrLCBwdWJsaWMgUmVmQmFzZSB7CitzdHJ1Y3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2sgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAgICAgVHJhY2soTVBFRzJQU0V4dHJhY3RvciAqZXh0cmFjdG9yLAogICAgICAgICAgIHVuc2lnbmVkIHN0cmVhbV9pZCwgdW5zaWduZWQgc3RyZWFtX3R5cGUpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+VHJhY2soKTsKQEAgLTcyLDI5ICs3MiwyOSBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRyYWNrKTsKIH07CiAKLXN0cnVjdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2sgOiBwdWJsaWMgTWVkaWFUcmFjayB7Ci0gICAgV3JhcHBlZFRyYWNrKE1QRUcyUFNFeHRyYWN0b3IgKmV4dHJhY3RvciwgY29uc3Qgc3A8VHJhY2s+ICZ0cmFjayk7CitzdHJ1Y3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgeworICAgIFdyYXBwZWRUcmFjayhNUEVHMlBTRXh0cmFjdG9yICpleHRyYWN0b3IsIFRyYWNrICp0cmFjayk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5XcmFwcGVkVHJhY2soKTsKIAogcHJpdmF0ZToKICAgICBNUEVHMlBTRXh0cmFjdG9yICptRXh0cmFjdG9yOwotICAgIHNwPE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrPiBtVHJhY2s7CisgICAgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2sgKm1UcmFjazsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFdyYXBwZWRUcmFjayk7CiB9OwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1NUEVHMlBTRXh0cmFjdG9yOjpNUEVHMlBTRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitNUEVHMlBTRXh0cmFjdG9yOjpNUEVHMlBTRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtT2Zmc2V0KDApLAogICAgICAgbUZpbmFsUmVzdWx0KE9LKSwKQEAgLTEwOCwyNSArMTA4LDI3IEBACiAgICAgfQogCiAgICAgLy8gUmVtb3ZlIGFsbCB0cmFja3MgdGhhdCB3ZXJlIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlaXIgZm9ybWF0LgotICAgIE1ldGFEYXRhQmFzZSBtZXRhOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICBmb3IgKHNpemVfdCBpID0gbVRyYWNrcy5zaXplKCk7IGkgPiAwOykgewogICAgICAgICBpLS07Ci0gICAgICAgIGlmIChtVHJhY2tzLnZhbHVlQXQoaSktPmdldEZvcm1hdChtZXRhKSAhPSBPSykgeworICAgICAgICBpZiAobVRyYWNrcy52YWx1ZUF0KGkpLT5nZXRGb3JtYXQobWV0YSkgIT0gQU1FRElBX09LKSB7CiAgICAgICAgICAgICBtVHJhY2tzLnJlbW92ZUl0ZW1zQXQoaSk7CiAgICAgICAgIH0KICAgICB9CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtZXRhKTsKIAogICAgIG1TY2FubmluZyA9IGZhbHNlOwogfQogCiBNUEVHMlBTRXh0cmFjdG9yOjp+TVBFRzJQU0V4dHJhY3RvcigpIHsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CiB9CiAKIHNpemVfdCBNUEVHMlBTRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKICAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7CiB9CiAKLU1lZGlhVHJhY2sgKk1QRUcyUFNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworTWVkaWFUcmFja0hlbHBlciAqTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKGluZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTEzNCwyMCArMTM2LDIwIEBACiAgICAgcmV0dXJuIG5ldyBXcmFwcGVkVHJhY2sodGhpcywgbVRyYWNrcy52YWx1ZUF0KGluZGV4KSk7CiB9CiAKLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChpbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIHJldHVybiBtVHJhY2tzLnZhbHVlQXQoaW5kZXgpLT5nZXRGb3JtYXQobWV0YSk7CiB9CiAKLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlBTKTsKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJQUyk7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogdWludDMyX3QgTVBFRzJQU0V4dHJhY3Rvcjo6ZmxhZ3MoKSBjb25zdCB7CkBAIC02MzUsNDIgKzYzNyw1NSBAQAogICAgIG1RdWV1ZSA9IE5VTEw7CiB9CiAKLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpzdGFydChNZXRhRGF0YUJhc2UgKikgeworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OnN0YXJ0KCkgewogICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKLSAgICByZXR1cm4gbVNvdXJjZS0+c3RhcnQoTlVMTCk7IC8vIEFub3RoZXJQYWNrZXRTb3VyY2U6OnN0YXJ0IGRvZXNuJ3QgdXNlIGl0cyBhcmd1bWVudAorICAgIC8vIGluaXRpYWxpemUgd2l0aCBvbmUgc21hbGwgYnVmZmVyLCBidXQgYWxsb3cgZ3Jvd3RoCisgICAgbUJ1ZmZlckdyb3VwLT5pbml0KDEgLyogb25lIGJ1ZmZlciAqLywgMjU2IC8qIGJ1ZmZlciBzaXplICovLCA2NCAvKiBtYXggbnVtYmVyIG9mIGJ1ZmZlcnMgKi8pOworCisgICAgaWYgKG1Tb3VyY2UtPnN0YXJ0KE5VTEwpID09IE9LKSB7IC8vIEFub3RoZXJQYWNrZXRTb3VyY2U6OnN0YXJ0IGRvZXNuJ3QgdXNlIGl0cyBhcmd1bWVudAorICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0KKyAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiB9CiAKLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OnN0b3AoKSB7CiAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAotICAgIHJldHVybiBtU291cmNlLT5zdG9wKCk7CisgICAgaWYgKG1Tb3VyY2UtPnN0b3AoKSA9PSBPSykgeworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0KKyAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiB9CiAKLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7Cit2b2lkIGNvcHlBTWVzc2FnZVRvQU1lZGlhRm9ybWF0KEFNZWRpYUZvcm1hdCAqZm9ybWF0LCBzcDxBTWVzc2FnZT4gbXNnKTsKKworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgc3A8TWV0YURhdGE+IHNvdXJjZU1ldGEgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKLSAgICBtZXRhID0gKnNvdXJjZU1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHNwPEFNZXNzYWdlPiBtc2c7CisgICAgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKHNvdXJjZU1ldGEsICZtc2cpOworICAgIGNvcHlBTWVzc2FnZVRvQU1lZGlhRm9ybWF0KG1ldGEsIG1zZyk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7CiAgICAgd2hpbGUgKCFtU291cmNlLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgewogICAgICAgICBpZiAoZmluYWxSZXN1bHQgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICB9CiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+ZmVlZE1vcmUoKTsKQEAgLTY4MCw3ICs2OTUsNTAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBtU291cmNlLT5yZWFkKGJ1ZmZlciwgb3B0aW9ucyk7CisgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmOworICAgIG1Tb3VyY2UtPnJlYWQoJm1idWYsIChNZWRpYVRyYWNrOjpSZWFkT3B0aW9ucyopIG9wdGlvbnMpOworICAgIHNpemVfdCBsZW5ndGggPSBtYnVmLT5yYW5nZV9sZW5ndGgoKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqb3V0YnVmOworICAgIG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJm91dGJ1ZiwgZmFsc2UsIGxlbmd0aCk7CisgICAgbWVtY3B5KG91dGJ1Zi0+ZGF0YSgpLCBtYnVmLT5kYXRhKCksIGxlbmd0aCk7CisgICAgb3V0YnVmLT5zZXRfcmFuZ2UoMCwgbGVuZ3RoKTsKKyAgICAqYnVmZmVyID0gb3V0YnVmOworICAgIE1ldGFEYXRhQmFzZSAmaW5NZXRhID0gbWJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0ICpvdXRNZXRhID0gb3V0YnVmLT5tZXRhX2RhdGEoKTsKKyAgICBpbnQ2NF90IHZhbDY0OworICAgIGlmIChpbk1ldGEuZmluZEludDY0KGtLZXlUaW1lLCAmdmFsNjQpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHZhbDY0KTsKKyAgICB9CisgICAgaW50MzJfdCB2YWwzMjsKKyAgICBpZiAoaW5NZXRhLmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZ2YWwzMikpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgdmFsMzIpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgJnZhbDMyKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSwgdmFsMzIpOworICAgIH0KKyAgICB1aW50MzJfdCBidWZUeXBlOworICAgIGNvbnN0IHZvaWQgKmJ1ZkRhdGE7CisgICAgc2l6ZV90IGJ1ZlNpemU7CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5Q3J5cHRvSVYsICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYsIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlDcnlwdG9LZXksICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5UGxhaW5TaXplcywgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUywgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9TSVpFUywgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleVNFSSwgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NFSSwgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleUF1ZGlvUHJlc2VudGF0aW9uSW5mbywgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9JTkZPLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgbWJ1Zi0+cmVsZWFzZSgpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjphcHBlbmRQRVNEYXRhKApAQCAtNzI2LDcgKzc4NCw3IEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OldyYXBwZWRUcmFjaygKLSAgICAgICAgTVBFRzJQU0V4dHJhY3RvciAqZXh0cmFjdG9yLCBjb25zdCBzcDxUcmFjaz4gJnRyYWNrKQorICAgICAgICBNUEVHMlBTRXh0cmFjdG9yICpleHRyYWN0b3IsIFRyYWNrICp0cmFjaykKICAgICA6IG1FeHRyYWN0b3IoZXh0cmFjdG9yKSwKICAgICAgIG1UcmFjayh0cmFjaykgewogfQpAQCAtNzM0LDI3ICs3OTIsMjggQEAKIE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6fldyYXBwZWRUcmFjaygpIHsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcykgewotICAgIHJldHVybiBtVHJhY2stPnN0YXJ0KHBhcmFtcyk7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OnN0YXJ0KCkgeworICAgIG1UcmFjay0+bUJ1ZmZlckdyb3VwID0gbUJ1ZmZlckdyb3VwOworICAgIHJldHVybiBtVHJhY2stPnN0YXJ0KCk7CiB9CiAKLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6c3RvcCgpIHsKICAgICByZXR1cm4gbVRyYWNrLT5zdG9wKCk7CiB9CiAKLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgeworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgcmV0dXJuIG1UcmFjay0+Z2V0Rm9ybWF0KG1ldGEpOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgcmV0dXJuIG1UcmFjay0+cmVhZChidWZmZXIsIG9wdGlvbnMpOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBib29sIFNuaWZmTVBFRzJQUygKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgewogICAgIHVpbnQ4X3QgaGVhZGVyWzVdOwogICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmgKaW5kZXggOGI5ZGFkOS4uZTVkNTkxZiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmgKQEAgLTE5LDcgKzE5LDggQEAKICNkZWZpbmUgTVBFRzJfUFNfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CkBAIC0zMSwxNCArMzIsMTQgQEAKIHN0cnVjdCBUcmFjazsKIGNsYXNzIFN0cmluZzg7CiAKLXN0cnVjdCBNUEVHMlBTRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKLSAgICBleHBsaWNpdCBNUEVHMlBTRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworc3RydWN0IE1QRUcyUFNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgeworICAgIGV4cGxpY2l0IE1QRUcyUFNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJNUEVHMlBTRXh0cmFjdG9yIjsgfQpAQCAtNTEsMTIgKzUyLDEyIEBACiAgICAgc3RydWN0IFdyYXBwZWRUcmFjazsKIAogICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogCiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogICAgIHN0YXR1c190IG1GaW5hbFJlc3VsdDsKICAgICBzcDxBQnVmZmVyPiBtQnVmZmVyOwotICAgIEtleWVkVmVjdG9yPHVuc2lnbmVkLCBzcDxUcmFjaz4gPiBtVHJhY2tzOworICAgIEtleWVkVmVjdG9yPHVuc2lnbmVkLCBUcmFjayogPiBtVHJhY2tzOwogICAgIGJvb2wgbVNjYW5uaW5nOwogCiAgICAgYm9vbCBtUHJvZ3JhbVN0cmVhbU1hcFZhbGlkOwpAQCAtNzIsNyArNzMsNyBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1QRUcyUFNFeHRyYWN0b3IpOwogfTsKIAotYm9vbCBTbmlmZk1QRUcyUFMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworYm9vbCBTbmlmZk1QRUcyUFMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuY3BwCmluZGV4IDI2MGM4OGUuLjQ5ZGQwYjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcApAQCAtMjYsNyArMjYsNiBAQAogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JU3RyZWFtU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CkBAIC0zNSw2ICszNCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiAjaW5jbHVkZSAibXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgiCkBAIC01MSwxOSArNTEsMTkgQEAKIHN0YXRpYyBjb25zdCBpbnQga01heER1cmF0aW9uUmVhZFNpemUgPSAyNTAwMDBMTDsKIHN0YXRpYyBjb25zdCBpbnQga01heER1cmF0aW9uUmV0cnkgPSA2OwogCi1zdHJ1Y3QgTVBFRzJUU1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK3N0cnVjdCBNUEVHMlRTU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogICAgIE1QRUcyVFNTb3VyY2UoCiAgICAgICAgICAgICBNUEVHMlRTRXh0cmFjdG9yICpleHRyYWN0b3IsCiAgICAgICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCwKICAgICAgICAgICAgIGJvb2wgZG9lc1NlZWspOwogICAgIHZpcnR1YWwgfk1QRUcyVFNTb3VyY2UoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogcHJpdmF0ZToKICAgICBNUEVHMlRTRXh0cmFjdG9yICptRXh0cmFjdG9yOwpAQCAtODgsNDQgKzg4LDE1MiBAQAogTVBFRzJUU1NvdXJjZTo6fk1QRUcyVFNTb3VyY2UoKSB7CiB9CiAKLXN0YXR1c190IE1QRUcyVFNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqKSB7Ci0gICAgcmV0dXJuIG1JbXBsLT5zdGFydChOVUxMKTsgLy8gQW5vdGhlclBhY2tldFNvdXJjZTo6c3RhcnQoKSBkb2Vzbid0IHVzZSBpdHMgYXJndW1lbnQKK21lZGlhX3N0YXR1c190IE1QRUcyVFNTb3VyY2U6OnN0YXJ0KCkgeworICAgIC8vIGluaXRpYWxpemUgd2l0aCBvbmUgc21hbGwgYnVmZmVyLCBidXQgYWxsb3cgZ3Jvd3RoCisgICAgbUJ1ZmZlckdyb3VwLT5pbml0KDEgLyogb25lIGJ1ZmZlciAqLywgMjU2IC8qIGJ1ZmZlciBzaXplICovLCA2NCAvKiBtYXggbnVtYmVyIG9mIGJ1ZmZlcnMgKi8pOworCisgICAgaWYgKCFtSW1wbC0+c3RhcnQoTlVMTCkpIHsgLy8gQW5vdGhlclBhY2tldFNvdXJjZTo6c3RhcnQoKSBkb2Vzbid0IHVzZSBpdHMgYXJndW1lbnQKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogfQogCi1zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpzdG9wKCkgewotICAgIHJldHVybiBtSW1wbC0+c3RvcCgpOworbWVkaWFfc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6c3RvcCgpIHsKKyAgICBpZiAoIW1JbXBsLT5zdG9wKCkpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogfQogCi1zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7Cit2b2lkIGNvcHlBTWVzc2FnZVRvQU1lZGlhRm9ybWF0KEFNZWRpYUZvcm1hdCAqZm9ybWF0LCBzcDxBTWVzc2FnZT4gbXNnKSB7CisgICAgc2l6ZV90IG51bUVudHJpZXMgPSBtc2ctPmNvdW50RW50cmllcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtRW50cmllczsgaSsrKSB7CisgICAgICAgIEFNZXNzYWdlOjpUeXBlIHR5cGU7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBtc2ctPmdldEVudHJ5TmFtZUF0KGksICZ0eXBlKTsKKyAgICAgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIGlkID0gbXNnLT5nZXRFbnRyeUF0KGkpOworCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVJbnQzMjoKKyAgICAgICAgICAgICAgICBpbnQzMl90IHZhbDMyOworICAgICAgICAgICAgICAgIGlmIChpZC5maW5kKCZ2YWwzMikpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZvcm1hdCwgbmFtZSwgdmFsMzIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50NjQ6CisgICAgICAgICAgICAgICAgaW50NjRfdCB2YWw2NDsKKyAgICAgICAgICAgICAgICBpZiAoaWQuZmluZCgmdmFsNjQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChmb3JtYXQsIG5hbWUsIHZhbDY0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUZsb2F0OgorICAgICAgICAgICAgICAgIGZsb2F0IHZhbGZsb2F0OworICAgICAgICAgICAgICAgIGlmIChpZC5maW5kKCZ2YWxmbG9hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEZsb2F0KGZvcm1hdCwgbmFtZSwgdmFsZmxvYXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRG91YmxlOgorICAgICAgICAgICAgICAgIGRvdWJsZSB2YWxkb3VibGU7CisgICAgICAgICAgICAgICAgaWYgKGlkLmZpbmQoJnZhbGRvdWJsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldERvdWJsZShmb3JtYXQsIG5hbWUsIHZhbGRvdWJsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVTdHJpbmc6CisgICAgICAgICAgICAgICAgaWYgKEFTdHJpbmcgczsgaWQuZmluZCgmcykpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhmb3JtYXQsIG5hbWUsIHMuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVCdWZmZXI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgICAgICAgICAgICAgIGlmIChpZC5maW5kKCZidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoZm9ybWF0LCBuYW1lLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIHVuc3VwcG9ydGVkIHR5cGUgJWQgJyVzJyIsIHR5cGUsIG5hbWUpOworICAgICAgICB9CisgICAgfQorfQorCittZWRpYV9zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgc3A8TWV0YURhdGE+IGltcGxNZXRhID0gbUltcGwtPmdldEZvcm1hdCgpOwotICAgIG1ldGEgPSAqaW1wbE1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHNwPEFNZXNzYWdlPiBtc2c7CisgICAgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKGltcGxNZXRhLCAmbXNnKTsKKyAgICBjb3B5QU1lc3NhZ2VUb0FNZWRpYUZvcm1hdChtZXRhLCBtc2cpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1QRUcyVFNTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IE1QRUcyVFNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZTsKICAgICBpZiAobURvZXNTZWVrICYmIG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmc2Vla01vZGUpKSB7CiAgICAgICAgIC8vIHNlZWsgaXMgbmVlZGVkCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPnNlZWsoc2Vla1RpbWVVcywgc2Vla01vZGUpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5zZWVrKHNlZWtUaW1lVXMsIChSZWFkT3B0aW9uczo6U2Vla01vZGUpc2Vla01vZGUpOworICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChtRXh0cmFjdG9yLT5mZWVkVW50aWxCdWZmZXJBdmFpbGFibGUobUltcGwpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCi0gICAgcmV0dXJuIG1JbXBsLT5yZWFkKG91dCwgb3B0aW9ucyk7CisgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmOworICAgIG1JbXBsLT5yZWFkKCZtYnVmLCAoTWVkaWFUcmFjazo6UmVhZE9wdGlvbnMqKSBvcHRpb25zKTsKKyAgICBzaXplX3QgbGVuZ3RoID0gbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKm91dGJ1ZjsKKyAgICBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZvdXRidWYsIGZhbHNlLCBsZW5ndGgpOworICAgIG1lbWNweShvdXRidWYtPmRhdGEoKSwgbWJ1Zi0+ZGF0YSgpLCBsZW5ndGgpOworICAgIG91dGJ1Zi0+c2V0X3JhbmdlKDAsIGxlbmd0aCk7CisgICAgKm91dCA9IG91dGJ1ZjsKKyAgICBNZXRhRGF0YUJhc2UgJmluTWV0YSA9IG1idWYtPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdCAqb3V0TWV0YSA9IG91dGJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG91dE1ldGEpOworICAgIGludDY0X3QgdmFsNjQ7CisgICAgaWYgKGluTWV0YS5maW5kSW50NjQoa0tleVRpbWUsICZ2YWw2NCkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdmFsNjQpOworICAgIH0KKyAgICBpbnQzMl90IHZhbDMyOworICAgIGlmIChpbk1ldGEuZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJnZhbDMyKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCB2YWwzMik7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZEludDMyKGtLZXlDcnlwdG9Nb2RlLCAmdmFsMzIpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCB2YWwzMik7CisgICAgfQorICAgIHVpbnQzMl90IGJ1ZlR5cGU7CisgICAgY29uc3Qgdm9pZCAqYnVmRGF0YTsKKyAgICBzaXplX3QgYnVmU2l6ZTsKKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlDcnlwdG9JViwgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19JViwgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlQbGFpblNpemVzLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5U0VJLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0VJLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5QXVkaW9QcmVzZW50YXRpb25JbmZvLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8sIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBtYnVmLT5yZWxlYXNlKCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotTVBFRzJUU0V4dHJhY3Rvcjo6TVBFRzJUU0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorTVBFRzJUU0V4dHJhY3Rvcjo6TVBFRzJUU0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbVBhcnNlcihuZXcgQVRTUGFyc2VyKSwKICAgICAgIG1MYXN0U3luY0V2ZW50KDApLApAQCAtMTMzLDExICsyNDEsMTUgQEAKICAgICBpbml0KCk7CiB9CiAKK01QRUcyVFNFeHRyYWN0b3I6On5NUEVHMlRTRXh0cmFjdG9yKCkgeworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKK30KKwogc2l6ZV90IE1QRUcyVFNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtU291cmNlSW1wbHMuc2l6ZSgpOwogfQogCi1NZWRpYVRyYWNrICpNUEVHMlRTRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXIgKk1QRUcyVFNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChpbmRleCA+PSBtU291cmNlSW1wbHMuc2l6ZSgpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTE0OCwyMiArMjYwLDIzIEBACiAgICAgICAgICAgICAobVNlZWtTeW5jUG9pbnRzID09ICZtU3luY1BvaW50cy5lZGl0SXRlbUF0KGluZGV4KSkpOwogfQogCi1zdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCittZWRpYV9zdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBzcDxNZXRhRGF0YT4gaW1wbE1ldGEgPSBpbmRleCA8IG1Tb3VyY2VJbXBscy5zaXplKCkKICAgICAgICAgPyBtU291cmNlSW1wbHMuZWRpdEl0ZW1BdChpbmRleCktPmdldEZvcm1hdCgpIDogTlVMTDsKICAgICBpZiAoaW1wbE1ldGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhID0gKmltcGxNZXRhOwotICAgIHJldHVybiBPSzsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlOworICAgIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShpbXBsTWV0YSwgJm1zZyk7CisgICAgY29weUFNZXNzYWdlVG9BTWVkaWFGb3JtYXQobWV0YSwgbXNnKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUyk7Ci0KLSAgICByZXR1cm4gT0s7CittZWRpYV9zdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFMpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vc3RhdGljCkBAIC0xNzQsNyArMjg3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVELCBtaW1lKSk7CiB9CiAKLXN0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OnNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIGNhc1Rva2VuLCBzaXplX3Qgc2l6ZSkgeworbWVkaWFfc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6c2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogY2FzVG9rZW4sIHNpemVfdCBzaXplKSB7CiAgICAgSGFsVG9rZW4gaGFsVG9rZW47CiAgICAgaGFsVG9rZW4uc2V0VG9FeHRlcm5hbCgodWludDhfdCopY2FzVG9rZW4sIHNpemUpOwogICAgIHNwPElDYXM+IGNhcyA9IElDYXM6OmNhc3RGcm9tKHJldHJpZXZlSGFsSW50ZXJmYWNlKGhhbFRva2VuKSk7CkBAIC0xODQsMjAgKzI5NywyNiBAQAogICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgQUxPR0koIkFsbCB0cmFja3Mgbm93IGhhdmUgZGVzY3JhbWJsZXJzIik7CiAgICAgICAgIGluaXQoKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICB9Ci0gICAgcmV0dXJuIGVycjsKKyAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047Cit9CisKK3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmZpbmRJbmRleE9mU291cmNlKGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsLCBzaXplX3QgKmluZGV4KSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU291cmNlSW1wbHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1Tb3VyY2VJbXBsc1tpXSA9PSBpbXBsKSB7CisgICAgICAgICAgICAqaW5kZXggPSBpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKIH0KIAogdm9pZCBNUEVHMlRTRXh0cmFjdG9yOjphZGRTb3VyY2UoY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwpIHsKLSAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU291cmNlSW1wbHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1Tb3VyY2VJbXBsc1tpXSA9PSBpbXBsKSB7Ci0gICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIWZvdW5kKSB7CisgICAgc2l6ZV90IGluZGV4OworICAgIGlmIChmaW5kSW5kZXhPZlNvdXJjZShpbXBsLCAmaW5kZXgpICE9IE9LKSB7CiAgICAgICAgIG1Tb3VyY2VJbXBscy5wdXNoKGltcGwpOworICAgICAgICBtU3luY1BvaW50cy5wdXNoKCk7CiAgICAgfQogfQogCkBAIC0yMDUsNiArMzI0LDcgQEAKICAgICBib29sIGhhdmVBdWRpbyA9IGZhbHNlOwogICAgIGJvb2wgaGF2ZVZpZGVvID0gZmFsc2U7CiAgICAgaW50NjRfdCBzdGFydFRpbWUgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIHNpemVfdCBpbmRleDsKIAogICAgIHN0YXR1c190IGVycjsKICAgICB3aGlsZSAoKGVyciA9IGZlZWRNb3JlKHRydWUgLyogaXNJbml0ICovKSkgPT0gT0sKQEAgLTIyMyw4ICszNDMsOSBAQAogICAgICAgICAgICAgICAgICAgICBoYXZlVmlkZW8gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBhZGRTb3VyY2UoaW1wbCk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghaXNTY3JhbWJsZWRGb3JtYXQoKihmb3JtYXQuZ2V0KCkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNQb2ludHMucHVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtTeW5jUG9pbnRzID0gJm1TeW5jUG9pbnRzLmVkaXRUb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5kSW5kZXhPZlNvdXJjZShpbXBsLCAmaW5kZXgpID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtTeW5jUG9pbnRzID0gJm1TeW5jUG9pbnRzLmVkaXRJdGVtQXQoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjM4LDEwICszNTksOSBAQAogICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBhZGRTb3VyY2UoaW1wbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXNTY3JhbWJsZWRGb3JtYXQoKihmb3JtYXQuZ2V0KCkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNQb2ludHMucHVzaCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXZlVmlkZW8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1N5bmNQb2ludHMgPSAmbVN5bmNQb2ludHMuZWRpdFRvcCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2NyYW1ibGVkRm9ybWF0KCooZm9ybWF0LmdldCgpKSkgJiYgIWhhdmVWaWRlbykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRJbmRleE9mU291cmNlKGltcGwsICZpbmRleCkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1N5bmNQb2ludHMgPSAmbVN5bmNQb2ludHMuZWRpdEl0ZW1BdChpbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC00OTEsNyArNjExLDcgQEAKIH0KIAogc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6c2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsCi0gICAgICAgIGNvbnN0IE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSAmc2Vla01vZGUpIHsKKyAgICAgICAgY29uc3QgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlICZzZWVrTW9kZSkgewogICAgIGlmIChtU2Vla1N5bmNQb2ludHMgPT0gTlVMTCB8fCBtU2Vla1N5bmNQb2ludHMtPmlzRW1wdHkoKSkgewogICAgICAgICBBTE9HVygiTm8gc3luYyBwb2ludCB0byBzZWVrIHRvLiIpOwogICAgICAgICAvLyAuLi4gYW5kIHRoZXJlZm9yZSB3ZSBoYXZlIG5vdGhpbmcgdXNlZnVsIHRvIGRvIGhlcmUuCkBAIC01MTIsMTggKzYzMiwxOCBAQAogICAgIH0KIAogICAgIHN3aXRjaCAoc2Vla01vZGUpIHsKLSAgICAgICAgY2FzZSBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkM6CisgICAgICAgIGNhc2UgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DOgogICAgICAgICAgICAgaWYgKGluZGV4ID09IG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIk5leHQgc3luYyBub3QgZm91bmQ7IHN0YXJ0aW5nIGZyb20gdGhlIGxhdGVzdCBzeW5jLiIpOwogICAgICAgICAgICAgICAgIC0taW5kZXg7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkM6Ci0gICAgICAgIGNhc2UgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVDoKKyAgICAgICAgY2FzZSBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkM6CisgICAgICAgIGNhc2UgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVDoKICAgICAgICAgICAgIEFMT0dXKCJzZWVrTW9kZSBub3Qgc3VwcG9ydGVkOiAlZDsgZmFsbGluZyBiYWNrIHRvIFBSRVZJT1VTX1NZTkMiLAogICAgICAgICAgICAgICAgICAgICBzZWVrTW9kZSk7CiAgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKLSAgICAgICAgY2FzZSBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOgorICAgICAgICBjYXNlIE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM6CiAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkgewogICAgICAgICAgICAgICAgIEFMT0dXKCJQcmV2aW91cyBzeW5jIG5vdCBmb3VuZDsgc3RhcnRpbmcgZnJvbSB0aGUgZWFybGllc3QgIgogICAgICAgICAgICAgICAgICAgICAgICAgInN5bmMuIik7CkBAIC02NjYsNyArNzg2LDcgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotYm9vbCBTbmlmZk1QRUcyVFMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKK2Jvb2wgU25pZmZNUEVHMlRTKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgewogICAgICAgICBjaGFyIGhlYWRlcjsKICAgICAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KGtUU1BhY2tldFNpemUgKiBpLCAmaGVhZGVyLCAxKSAhPSAxCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5oCmluZGV4IGNiZGQzY2IuLjI1MzdkM2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5oCkBAIC0yMCw4ICsyMCw4IEBACiAjZGVmaW5lIE1QRUcyX1RTX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KQEAgLTM0LDMwICszNCwzMyBAQAogc3RydWN0IEFNZXNzYWdlOwogc3RydWN0IEFub3RoZXJQYWNrZXRTb3VyY2U7CiBzdHJ1Y3QgQVRTUGFyc2VyOwotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitzdHJ1Y3QgQ0RhdGFTb3VyY2U7CiBzdHJ1Y3QgTVBFRzJUU1NvdXJjZTsKIGNsYXNzIFN0cmluZzg7CiAKLXN0cnVjdCBNUEVHMlRTRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKLSAgICBleHBsaWNpdCBNUEVHMlRTRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworc3RydWN0IE1QRUcyVFNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgeworICAgIGV4cGxpY2l0IE1QRUcyVFNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIC8qY2FzVG9rZW4qLywgc2l6ZV90IC8qc2l6ZSovKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIC8qY2FzVG9rZW4qLywgc2l6ZV90IC8qc2l6ZSovKSBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QRUcyVFNFeHRyYWN0b3IiOyB9CiAKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NUEVHMlRTRXh0cmFjdG9yKCk7CisKIHByaXZhdGU6CiAgICAgZnJpZW5kIHN0cnVjdCBNUEVHMlRTU291cmNlOwogCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKIAotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKIAogICAgIHNwPEFUU1BhcnNlcj4gbVBhcnNlcjsKIApAQCAtODEsMTcgKzg0LDE4IEBACiAgICAgLy8gVHJ5IHRvIGZlZWQgbW9yZSBkYXRhIGZyb20gc291cmNlIHRvIHBhcnNlci4KICAgICAvLyB8aXNJbml0fCBtZWFucyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbnNpZGUgaW5pdCgpLiBUaGlzIGlzIGEgc2lnbmFsIHRvCiAgICAgLy8gc2F2ZSBTeW5jRXZlbnQgc28gdGhhdCBpbml0KCkgY2FuIGFkZCBTeW5jUG9pbnQgYWZ0ZXIgaXQgdXBkYXRlcyB8bVNvdXJjZUltcGxzfC4KLSAgICAvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgT0sgaWYgZXhwZWN0ZWQgYW1vdW50IG9mIGRhdGEgaXMgZmVkIGZyb20gRGF0YVNvdXJjZUJhc2UgdG8KKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgT0sgaWYgZXhwZWN0ZWQgYW1vdW50IG9mIGRhdGEgaXMgZmVkIGZyb20gRGF0YVNvdXJjZUhlbHBlciB0bwogICAgIC8vIHBhcnNlciBhbmQgaXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZC4gT3RoZXJ3aXNlLCB2YXJpb3VzIGVycm9yIGNvZGVzIGNvdWxkIGJlCi0gICAgLy8gcmV0dXJuZWQsIGUuZy4sIEVSUk9SX0VORF9PRl9TVFJFQU0sIG9yIG5vIGRhdGEgYXZhaWxhbGJlIGZyb20gRGF0YVNvdXJjZUJhc2UsIG9yCisgICAgLy8gcmV0dXJuZWQsIGUuZy4sIEVSUk9SX0VORF9PRl9TVFJFQU0sIG9yIG5vIGRhdGEgYXZhaWxhbGJlIGZyb20gRGF0YVNvdXJjZUhlbHBlciwgb3IKICAgICAvLyB0aGUgZGF0YSBoYXMgc3ludGF4IGVycm9yIGR1cmluZyBwYXJzaW5nLCBldGMuCiAgICAgc3RhdHVzX3QgZmVlZE1vcmUoYm9vbCBpc0luaXQgPSBmYWxzZSk7CiAgICAgc3RhdHVzX3Qgc2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsCi0gICAgICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlJiBzZWVrTW9kZSk7CisgICAgICAgICAgICBjb25zdCBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U2Vla01vZGUmIHNlZWtNb2RlKTsKICAgICBzdGF0dXNfdCBxdWV1ZURpc2NvbnRpbnVpdHlGb3JTZWVrKGludDY0X3QgYWN0dWFsU2Vla1RpbWVVcyk7CiAgICAgc3RhdHVzX3Qgc2Vla0JleW9uZChpbnQ2NF90IHNlZWtUaW1lVXMpOwogCiAgICAgc3RhdHVzX3QgZmVlZFVudGlsQnVmZmVyQXZhaWxhYmxlKGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsKTsKKyAgICBzdGF0dXNfdCBmaW5kSW5kZXhPZlNvdXJjZShjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCwgc2l6ZV90ICppbmRleCk7CiAKICAgICAvLyBBZGQgYSBTeW5Qb2ludCBkZXJpdmVkIGZyb20gfGV2ZW50fC4KICAgICB2b2lkIGFkZFN5bmNQb2ludF9sKGNvbnN0IEFUU1BhcnNlcjo6U3luY0V2ZW50ICZldmVudCk7CkBAIC0xMDEsNyArMTA1LDcgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNUEVHMlRTRXh0cmFjdG9yKTsKIH07CiAKLWJvb2wgU25pZmZNUEVHMlRTKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKK2Jvb2wgU25pZmZNUEVHMlRTKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icAppbmRleCBmM2QyNzk0Li42MDRlYzU5IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAKQEAgLTcsMTMgKzcsMTggQEAKICAgICAgICAgImV4dGVybmFsL3RyZW1vbG8iLAogICAgIF0sCiAKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiLAorICAgIF0sCisKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWV0YWRhdGF1dGlscyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJ2b3JiaXNpZGVjIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5jcHAKaW5kZXggYjJmZTY5Yy4uZDk5NDkzZCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuY3BwCkBAIC0yMSwxOSArMjEsMTcgQEAKICNpbmNsdWRlICJPZ2dFeHRyYWN0b3IuaCIKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRyYWN0b3JVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KLSNpbmNsdWRlIDxtZWRpYS9Wb3JiaXNDb21tZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogZXh0ZXJuICJDIiB7CkBAIC00NywxNiArNDUsMTYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgT2dnU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworc3RydWN0IE9nZ1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKICAgICBleHBsaWNpdCBPZ2dTb3VyY2UoT2dnRXh0cmFjdG9yICpleHRyYWN0b3IpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5PZ2dTb3VyY2UoKTsKQEAgLTcxLDI4ICs2OSwzMCBAQAogCiBzdHJ1Y3QgTXlPZ2dFeHRyYWN0b3IgewogICAgIE15T2dnRXh0cmFjdG9yKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlLAogICAgICAgICAgICAgc2l6ZV90IG51bUhlYWRlcnMsCiAgICAgICAgICAgICBpbnQ2NF90IHNlZWtQcmVSb2xsVXMpOwogICAgIHZpcnR1YWwgfk15T2dnRXh0cmFjdG9yKCk7CiAKLSAgICBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpIGNvbnN0OworICAgIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKikgY29uc3Q7CiAKICAgICAvLyBSZXR1cm5zIGFuIGFwcHJveGltYXRlIGJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kLgogICAgIHZpcnR1YWwgdWludDY0X3QgYXBwcm94Qml0cmF0ZSgpIGNvbnN0ID0gMDsKIAogICAgIHN0YXR1c190IHNlZWtUb1RpbWUoaW50NjRfdCB0aW1lVXMpOwogICAgIHN0YXR1c190IHNlZWtUb09mZnNldChvZmY2NF90IG9mZnNldCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIpID0gMDsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyKSA9IDA7CiAKICAgICBzdGF0dXNfdCBpbml0KCk7CiAKLSAgICBzdGF0dXNfdCBnZXRGaWxlTWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgICAgIG1ldGEgPSBtRmlsZU1ldGE7Ci0gICAgICAgIHJldHVybiBPSzsKKyAgICBtZWRpYV9zdGF0dXNfdCBnZXRGaWxlTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtRmlsZU1ldGEpOwogICAgIH0KIAorICAgIHZvaWQgc2V0QnVmZmVyR3JvdXAoTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqZ3JvdXApIHsKKyAgICAgICAgbUJ1ZmZlckdyb3VwID0gZ3JvdXA7CisgICAgfQogcHJvdGVjdGVkOgogICAgIHN0cnVjdCBQYWdlIHsKICAgICAgICAgdWludDY0X3QgbUdyYW51bGVQb3NpdGlvbjsKQEAgLTExMCw3ICsxMTAsOCBAQAogICAgICAgICBpbnQ2NF90IG1UaW1lVXM7CiAgICAgfTsKIAotICAgIERhdGFTb3VyY2VCYXNlICptU291cmNlOworICAgIE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKm1CdWZmZXJHcm91cDsKKyAgICBEYXRhU291cmNlSGVscGVyICptU291cmNlOwogICAgIG9mZjY0X3QgbU9mZnNldDsKICAgICBQYWdlIG1DdXJyZW50UGFnZTsKICAgICB1aW50NjRfdCBtQ3VyR3JhbnVsZVBvc2l0aW9uOwpAQCAtMTI5LDExICsxMzAsMTMgQEAKICAgICB2b3JiaXNfaW5mbyBtVmk7CiAgICAgdm9yYmlzX2NvbW1lbnQgbVZjOwogCi0gICAgTWV0YURhdGFCYXNlIG1NZXRhOwotICAgIE1ldGFEYXRhQmFzZSBtRmlsZU1ldGE7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1GaWxlTWV0YTsKIAogICAgIFZlY3RvcjxUT0NFbnRyeT4gbVRhYmxlT2ZDb250ZW50czsKIAorICAgIGludDMyX3QgbUhhcHRpY0NoYW5uZWxDb3VudDsKKwogICAgIHNzaXplX3QgcmVhZFBhZ2Uob2ZmNjRfdCBvZmZzZXQsIFBhZ2UgKnBhZ2UpOwogICAgIHN0YXR1c190IGZpbmROZXh0UGFnZShvZmY2NF90IHN0YXJ0T2Zmc2V0LCBvZmY2NF90ICpwYWdlT2Zmc2V0KTsKIApAQCAtMTQ2LDcgKzE0OSw3IEBACiAgICAgLy8gMSAtIGJpdHN0cmVhbSBpZGVudGlmaWNhdGlvbiBoZWFkZXIKICAgICAvLyAzIC0gY29tbWVudCBoZWFkZXIKICAgICAvLyA1IC0gY29kZWMgc2V0dXAgaGVhZGVyIChWb3JiaXMgb25seSkKLSAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSA9IDA7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCB2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSA9IDA7CiAKICAgICAvLyBSZWFkIHRoZSBuZXh0IG9nZyBwYWNrZXQgZnJvbSB0aGUgdW5kZXJseWluZyBkYXRhIHNvdXJjZTsgb3B0aW9uYWxseQogICAgIC8vIGNhbGN1bGF0ZSB0aGUgdGltZXN0YW1wIGZvciB0aGUgb3V0cHV0IHBhY2tldCB3aGlsc3QgcHJldGVuZGluZwpAQCAtMTU0LDkgKzE1Nyw5IEBACiAgICAgLy8KICAgICAvLyAqYnVmZmVyIGlzIE5VTEwnZWQgb3V0IGltbWVkaWF0ZWx5IHVwb24gZW50cnksIGFuZCBpZiBzdWNjZXNzZnVsIGEgbmV3IGJ1ZmZlciBpcyBhbGxvY2F0ZWQ7CiAgICAgLy8gY2xpZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyB0aGUgb3JpZ2luYWwgYnVmZmVyLgotICAgIHN0YXR1c190IF9yZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCk7CisgICAgbWVkaWFfc3RhdHVzX3QgX3JlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBib29sIGNhbGNWb3JiaXNUaW1lc3RhbXApOwogCi0gICAgaW50MzJfdCBnZXRQYWNrZXRCbG9ja1NpemUoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOworICAgIGludDMyX3QgZ2V0UGFja2V0QmxvY2tTaXplKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpOwogCiAgICAgdm9pZCBwYXJzZUZpbGVNZXRhRGF0YSgpOwogCkBAIC0xNjQsMTIgKzE2NywxNCBAQAogCiAgICAgdm9pZCBidWlsZFRhYmxlT2ZDb250ZW50cygpOwogCisgICAgdm9pZCBzZXRDaGFubmVsTWFzayhpbnQgY2hhbm5lbENvdW50KTsKKwogICAgIE15T2dnRXh0cmFjdG9yKGNvbnN0IE15T2dnRXh0cmFjdG9yICYpOwogICAgIE15T2dnRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTXlPZ2dFeHRyYWN0b3IgJik7CiB9OwogCiBzdHJ1Y3QgTXlWb3JiaXNFeHRyYWN0b3IgOiBwdWJsaWMgTXlPZ2dFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE15Vm9yYmlzRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgZXhwbGljaXQgTXlWb3JiaXNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgICAgICA6IE15T2dnRXh0cmFjdG9yKHNvdXJjZSwKICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsCiAgICAgICAgICAgICAgICAgLyogbnVtSGVhZGVycyAqLyAzLApAQCAtMTc4LDcgKzE4Myw3IEBACiAKICAgICB2aXJ0dWFsIHVpbnQ2NF90IGFwcHJveEJpdHJhdGUoKSBjb25zdDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyKSB7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlcikgewogICAgICAgICByZXR1cm4gX3JlYWROZXh0UGFja2V0KGJ1ZmZlciwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovIHRydWUpOwogICAgIH0KIApAQCAtMTkwLDE0ICsxOTUsMTQgQEAKICAgICAgICAgcmV0dXJuIGdyYW51bGVQb3MgKiAxMDAwMDAwbGwgLyBtVmkucmF0ZTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDhfdCB0eXBlKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpOwogfTsKIAogc3RydWN0IE15T3B1c0V4dHJhY3RvciA6IHB1YmxpYyBNeU9nZ0V4dHJhY3RvciB7CiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga09wdXNTYW1wbGVSYXRlID0gNDgwMDA7CiAgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga09wdXNTZWVrUHJlUm9sbFVzID0gODAwMDA7IC8vIDgwIG1zCiAKLSAgICBleHBsaWNpdCBNeU9wdXNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKKyAgICBleHBsaWNpdCBNeU9wdXNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgICAgICA6IE15T2dnRXh0cmFjdG9yKHNvdXJjZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUywgLypudW1IZWFkZXJzKi8gMiwga09wdXNTZWVrUHJlUm9sbFVzKSwKICAgICAgICAgICBtQ2hhbm5lbENvdW50KDApLAogICAgICAgICAgIG1Db2RlY0RlbGF5KDApLApAQCAtMjA4LDE2ICsyMTMsMTYgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCBpbnQ2NF90IGdldFRpbWVVc09mR3JhbnVsZSh1aW50NjRfdCBncmFudWxlUG9zKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDhfdCB0eXBlKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpOwogCiBwcml2YXRlOgotICAgIHN0YXR1c190IHZlcmlmeU9wdXNIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOwotICAgIHN0YXR1c190IHZlcmlmeU9wdXNDb21tZW50cyhNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7Ci0gICAgdWludDMyX3QgZ2V0TnVtU2FtcGxlc0luUGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSBjb25zdDsKKyAgICBtZWRpYV9zdGF0dXNfdCB2ZXJpZnlPcHVzSGVhZGVyKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpOworICAgIG1lZGlhX3N0YXR1c190IHZlcmlmeU9wdXNDb21tZW50cyhNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKTsKKyAgICB1aW50MzJfdCBnZXROdW1TYW1wbGVzSW5QYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcikgY29uc3Q7CiAKICAgICB1aW50OF90IG1DaGFubmVsQ291bnQ7CiAgICAgdWludDE2X3QgbUNvZGVjRGVsYXk7CkBAIC0yMzcsMjggKzI0MiwzMCBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgT2dnU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBPZ2dTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICByZXR1cm4gbUV4dHJhY3Rvci0+bUltcGwtPmdldEZvcm1hdChtZXRhKTsKIH0KIAotc3RhdHVzX3QgT2dnU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pIHsKK21lZGlhX3N0YXR1c190IE9nZ1NvdXJjZTo6c3RhcnQoKSB7CiAgICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0KKyAgICAvLyBpbml0aWFsaXplIGJ1ZmZlciBncm91cCB3aXRoIGEgc2luZ2xlIHNtYWxsIGJ1ZmZlciwgYnV0IGEgZ2VuZXJvdXMgdXBwZXIgbGltaXQKKyAgICBtQnVmZmVyR3JvdXAtPmluaXQoMSAvKiBudW1iZXIgb2YgYnVmZmVycyAqLywgMTI4IC8qIHNpemUgKi8sIDY0IC8qIG1heCBudW1iZXIgb2YgYnVmZmVycyAqLyk7CisgICAgbUV4dHJhY3Rvci0+bUltcGwtPnNldEJ1ZmZlckdyb3VwKG1CdWZmZXJHcm91cCk7CiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE9nZ1NvdXJjZTo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IE9nZ1NvdXJjZTo6c3RvcCgpIHsKICAgICBtU3RhcnRlZCA9IGZhbHNlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE9nZ1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgT2dnU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKQEAgLTI2Niw0MSArMjczLDQzIEBACiAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+bUltcGwtPnNlZWtUb1RpbWUoc2Vla1RpbWVVcyk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKnBhY2tldDsKLSAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5tSW1wbC0+cmVhZE5leHRQYWNrZXQoJnBhY2tldCk7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKnBhY2tldDsKKyAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5tSW1wbC0+cmVhZE5leHRQYWNrZXQoJnBhY2tldCk7CiAKLSAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgaWYgKGVyciAhPSBBTUVESUFfT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBwYWNrZXQtPm1ldGFfZGF0YSgpOwogI2lmIDAKICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBpZiAocGFja2V0LT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKSB7CisgICAgaWYgKEFNZWRpYUZvcm1hdF9maW5kSW50NjQobWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB0aW1lU3RhbXBVcykpIHsKICAgICAgICAgQUxPR0koImZvdW5kIHRpbWUgPSAlbGxkIHVzIiwgdGltZVVzKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HSSgiTk8gdGltZSIpOwogICAgIH0KICNlbmRpZgogCi0gICAgcGFja2V0LT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCiAgICAgKm91dCA9IHBhY2tldDsKLQotICAgIHJldHVybiBPSzsKKyAgICBBTE9HVigicmV0dXJuaW5nIGJ1ZmZlciAlcCIsIHBhY2tldCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogTXlPZ2dFeHRyYWN0b3I6Ok15T2dnRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlLAogICAgICAgICBzaXplX3QgbnVtSGVhZGVycywKICAgICAgICAgaW50NjRfdCBzZWVrUHJlUm9sbFVzKQotICAgIDogbVNvdXJjZShzb3VyY2UpLAorICAgIDogbUJ1ZmZlckdyb3VwKE5VTEwpLAorICAgICAgbVNvdXJjZShzb3VyY2UpLAogICAgICAgbU9mZnNldCgwKSwKICAgICAgIG1DdXJHcmFudWxlUG9zaXRpb24oMCksCiAgICAgICBtUHJldkdyYW51bGVQb3NpdGlvbigwKSwKQEAgLTMxMSwyMSArMzIwLDI1IEBACiAgICAgICBtTWltZVR5cGUobWltZVR5cGUpLAogICAgICAgbU51bUhlYWRlcnMobnVtSGVhZGVycyksCiAgICAgICBtU2Vla1ByZVJvbGxVcyhzZWVrUHJlUm9sbFVzKSwKLSAgICAgIG1GaXJzdERhdGFPZmZzZXQoLTEpIHsKKyAgICAgIG1GaXJzdERhdGFPZmZzZXQoLTEpLAorICAgICAgbUhhcHRpY0NoYW5uZWxDb3VudCgwKSB7CiAgICAgbUN1cnJlbnRQYWdlLm1OdW1TZWdtZW50cyA9IDA7CiAKICAgICB2b3JiaXNfaW5mb19pbml0KCZtVmkpOwogICAgIHZvcmJpc19jb21tZW50X2luaXQoJm1WYyk7CisgICAgbU1ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgbUZpbGVNZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOwogfQogCiBNeU9nZ0V4dHJhY3Rvcjo6fk15T2dnRXh0cmFjdG9yKCkgeworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobUZpbGVNZXRhKTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1NZXRhKTsKICAgICB2b3JiaXNfY29tbWVudF9jbGVhcigmbVZjKTsKICAgICB2b3JiaXNfaW5mb19jbGVhcigmbVZpKTsKIH0KIAotc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIGNvbnN0IHsKLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworbWVkaWFfc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIGNvbnN0IHsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOwogfQogCiBzdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6ZmluZE5leHRQYWdlKApAQCAtMzUxLDcgKzM2NCwxMyBAQAogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKLSAgICAgICAgKysqcGFnZU9mZnNldDsKKyAgICAgICAgLy8gc2VlIGhvdyBmYXIgYWhlYWQgdG8gc2tpcDsgYXZvaWQgc29tZSBmcnVpdGxlc3MgY29tcGFyaXNvbnMKKyAgICAgICAgdW5zaWduZWQgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCA0IDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc2lnbmF0dXJlW2ldID09ICdPJykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAqcGFnZU9mZnNldCArPSBpOwogICAgIH0KIH0KIApAQCAtNTAyLDMwICs1MjEsMzAgQEAKICAgICAgICAgQUxPR1YoImZhaWxlZCB0byByZWFkICV6dSBieXRlcyBhdCBvZmZzZXQgJSMwMTZsbHgsIGdvdCAlemQgYnl0ZXMiLAogICAgICAgICAgICAgICAgIHNpemVvZihoZWFkZXIpLCAobG9uZyBsb25nKW9mZnNldCwgbik7CiAKLSAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbjsKLSAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICBpZiAobiA9PSAwIHx8IG4gPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9IGVsc2UgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG1lbWNtcChoZWFkZXIsICJPZ2dTIiwgNCkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgaWYgKGhlYWRlcls0XSAhPSAwKSB7CiAgICAgICAgIC8vIFdyb25nIHZlcnNpb24uCiAKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIAogICAgIHBhZ2UtPm1GbGFncyA9IGhlYWRlcls1XTsKIAogICAgIGlmIChwYWdlLT5tRmxhZ3MgJiB+NykgewogICAgICAgICAvLyBPbmx5IGJpdHMgMC0yIGFyZSBkZWZpbmVkIGluIHZlcnNpb24gMC4KLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgcGFnZS0+bUdyYW51bGVQb3NpdGlvbiA9IFU2NExFX0FUKCZoZWFkZXJbNl0pOwpAQCAtNTQyLDcgKzU2MSw3IEBACiAgICAgaWYgKG1Tb3VyY2UtPnJlYWRBdCgKICAgICAgICAgICAgICAgICBvZmZzZXQgKyBzaXplb2YoaGVhZGVyKSwgcGFnZS0+bUxhY2UsIHBhZ2UtPm1OdW1TZWdtZW50cykKICAgICAgICAgICAgIDwgKHNzaXplX3QpcGFnZS0+bU51bVNlZ21lbnRzKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICB9CiAKICAgICBzaXplX3QgdG90YWxTaXplID0gMDs7CkBAIC01NjUsMjIgKzU4NCwyMiBAQAogICAgIHJldHVybiBzaXplb2YoaGVhZGVyKSArIHBhZ2UtPm1OdW1TZWdtZW50cyArIHRvdGFsU2l6ZTsKIH0KIAotc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjpyZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipvdXQpIHsKK21lZGlhX3N0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6cmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQpIHsKICAgICBpZiAobU9mZnNldCA8PSBtRmlyc3REYXRhT2Zmc2V0ICYmIG1TdGFydEdyYW51bGVQb3NpdGlvbiA8IDApIHsKICAgICAgICAgLy8gVGhlIGZpcnN0IHNhbXBsZSBtaWdodCBub3Qgc3RhcnQgYXQgdGltZSAwOyBmaW5kIG91dCB3aGVyZSBieSBzdWJ0cmFjdGluZwogICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb24gdGhlIGZpcnN0IHBhZ2UgZnJvbSB0aGUgZ3JhbnVsZSBwb3NpdGlvbgogICAgICAgICAvLyAocG9zaXRpb24gb2YgbGFzdCBjb21wbGV0ZSBzYW1wbGUpIG9mIHRoZSBmaXJzdCBwYWdlLiBUaGlzIGhhcHBlbnMKICAgICAgICAgLy8gdGhlIGZpcnN0IHRpbWUgYmVmb3JlIHdlIGF0dGVtcHQgdG8gcmVhZCBhIHBhY2tldCBmcm9tIHRoZSBmaXJzdCBwYWdlLgotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1CdWY7CisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICptQnVmOwogICAgICAgICB1aW50MzJfdCBudW1TYW1wbGVzID0gMDsKICAgICAgICAgdWludDY0X3QgY3VyR3JhbnVsZVBvc2l0aW9uID0gMDsKICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IF9yZWFkTmV4dFBhY2tldCgmbUJ1ZiwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovZmFsc2UpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gX3JlYWROZXh0UGFja2V0KCZtQnVmLCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi9mYWxzZSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEFNRURJQV9PSyAmJiBlcnIgIT0gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0pIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gRmlyc3QgdHdvIHBhZ2VzIGFyZSBoZWFkZXIgcGFnZXMuCi0gICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0gfHwgbUN1cnJlbnRQYWdlLm1QYWdlTm8gPiAyKSB7CisgICAgICAgICAgICBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNIHx8IG1DdXJyZW50UGFnZS5tUGFnZU5vID4gMikgewogICAgICAgICAgICAgICAgIGlmIChtQnVmICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgbUJ1Zi0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgICAgICBtQnVmID0gTlVMTDsKQEAgLTYwMSwzMiArNjIwLDMzIEBACiAgICAgICAgIHNlZWtUb09mZnNldCgwKTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBfcmVhZE5leHRQYWNrZXQob3V0LCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi9mYWxzZSk7Ci0gICAgaWYgKGVyciAhPSBPSykgeworICAgIG1lZGlhX3N0YXR1c190IGVyciA9IF9yZWFkTmV4dFBhY2tldChvdXQsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqL2ZhbHNlKTsKKyAgICBpZiAoZXJyICE9IEFNRURJQV9PSykgewogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAogICAgIGludDMyX3QgY3VycmVudFBhZ2VTYW1wbGVzOwogICAgIC8vIENhbGN1bGF0ZSB0aW1lc3RhbXBzIGJ5IGFjY3VtdWxhdGluZyBkdXJhdGlvbnMgc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3Qgc2FtcGxlIG9mIGEgcGFnZTsKICAgICAvLyBXZSBhc3N1bWUgdGhhdCB3ZSBvbmx5IHNlZWsgdG8gcGFnZSBib3VuZGFyaWVzLgotICAgIGlmICgoKm91dCktPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5VmFsaWRTYW1wbGVzLCAmY3VycmVudFBhZ2VTYW1wbGVzKSkgeworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9ICgqb3V0KS0+bWV0YV9kYXRhKCk7CisgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMsICZjdXJyZW50UGFnZVNhbXBsZXMpKSB7CiAgICAgICAgIC8vIGZpcnN0IHBhY2tldCBpbiBwYWdlCiAgICAgICAgIGlmIChtT2Zmc2V0ID09IG1GaXJzdERhdGFPZmZzZXQpIHsKICAgICAgICAgICAgIGN1cnJlbnRQYWdlU2FtcGxlcyAtPSBtU3RhcnRHcmFudWxlUG9zaXRpb247Ci0gICAgICAgICAgICAoKm91dCktPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlWYWxpZFNhbXBsZXMsIGN1cnJlbnRQYWdlU2FtcGxlcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTLCBjdXJyZW50UGFnZVNhbXBsZXMpOwogICAgICAgICB9CiAgICAgICAgIG1DdXJHcmFudWxlUG9zaXRpb24gPSBtQ3VycmVudFBhZ2UubUdyYW51bGVQb3NpdGlvbiAtIGN1cnJlbnRQYWdlU2FtcGxlczsKICAgICB9CiAKICAgICBpbnQ2NF90IHRpbWVVcyA9IGdldFRpbWVVc09mR3JhbnVsZShtQ3VyR3JhbnVsZVBvc2l0aW9uKTsKLSAgICAoKm91dCktPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVVcyk7CiAKICAgICB1aW50MzJfdCBmcmFtZXMgPSBnZXROdW1TYW1wbGVzSW5QYWNrZXQoKm91dCk7CiAgICAgbUN1ckdyYW51bGVQb3NpdGlvbiArPSBmcmFtZXM7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXVpbnQzMl90IE15T3B1c0V4dHJhY3Rvcjo6Z2V0TnVtU2FtcGxlc0luUGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSBjb25zdCB7Cit1aW50MzJfdCBNeU9wdXNFeHRyYWN0b3I6OmdldE51bVNhbXBsZXNJblBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKSBjb25zdCB7CiAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMIHx8IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPCAxKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTY3MiwxMCArNjkyLDY2IEBACiAgICAgcmV0dXJuIG51bVNhbXBsZXM7CiB9CiAKLXN0YXR1c190IE15T2dnRXh0cmFjdG9yOjpfcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBib29sIGNhbGNWb3JiaXNUaW1lc3RhbXApIHsKKy8qCisgKiBiYXNpYyBtZWRpYWJ1ZmZlciBpbXBsZW1lbnRhdGlvbiB1c2VkIGR1cmluZyBpbml0aWFsIHBhcnNpbmcgb2YgdGhlCisgKiBoZWFkZXIgcGFja2V0cywgd2hpY2ggaGFwcGVucyBiZWZvcmUgd2UgaGF2ZSBhIGJ1ZmZlciBncm91cAorICovCitjbGFzcyBTdGFuZEFsb25lTWVkaWFCdWZmZXIgOiBwdWJsaWMgTWVkaWFCdWZmZXJIZWxwZXIgeworcHJpdmF0ZToKKyAgICB2b2lkICptRGF0YTsKKyAgICBzaXplX3QgbVNpemU7CisgICAgc2l6ZV90IG1PZmZzZXQ7CisgICAgc2l6ZV90IG1MZW5ndGg7CisgICAgQU1lZGlhRm9ybWF0ICptRm9ybWF0OworcHVibGljOgorICAgIFN0YW5kQWxvbmVNZWRpYUJ1ZmZlcihzaXplX3Qgc2l6ZSkgOiBNZWRpYUJ1ZmZlckhlbHBlcihOVUxMKSB7CisgICAgICAgIG1TaXplID0gc2l6ZTsKKyAgICAgICAgbURhdGEgPSBtYWxsb2MobVNpemUpOworICAgICAgICBtT2Zmc2V0ID0gMDsKKyAgICAgICAgbUxlbmd0aCA9IG1TaXplOworICAgICAgICBtRm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgICAgICBBTE9HVigiY3JlYXRlZCBzdGFuZGFsb25lIG1lZGlhIGJ1ZmZlciAlcCBvZiBzaXplICV6dSIsIHRoaXMsIG1TaXplKTsKKyAgICB9CisKKyAgICB+U3RhbmRBbG9uZU1lZGlhQnVmZmVyKCkgb3ZlcnJpZGUgeworICAgICAgICBmcmVlKG1EYXRhKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtRm9ybWF0KTsKKyAgICAgICAgQUxPR1YoImRlbGV0ZWQgc3RhbmRhbG9uZSBtZWRpYSBidWZmZXIgJXAgb2Ygc2l6ZSAlenUiLCB0aGlzLCBtU2l6ZSk7CisgICAgfQorCisgICAgdm9pZCByZWxlYXNlKCkgb3ZlcnJpZGUgeworICAgICAgICBkZWxldGUgdGhpczsKKyAgICB9CisKKyAgICB2b2lkKiBkYXRhKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbURhdGE7CisgICAgfQorCisgICAgc2l6ZV90IHNpemUoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtU2l6ZTsKKyAgICB9CisKKyAgICBzaXplX3QgcmFuZ2Vfb2Zmc2V0KCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbU9mZnNldDsKKyAgICB9CisKKyAgICBzaXplX3QgcmFuZ2VfbGVuZ3RoKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUxlbmd0aDsKKyAgICB9CisKKyAgICB2b2lkIHNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKSBvdmVycmlkZSB7CisgICAgICAgIG1PZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIG1MZW5ndGggPSBsZW5ndGg7CisgICAgfQorICAgIEFNZWRpYUZvcm1hdCAqbWV0YV9kYXRhKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUZvcm1hdDsKKyAgICB9Cit9OworCittZWRpYV9zdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6X3JlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBib29sIGNhbGNWb3JiaXNUaW1lc3RhbXApIHsKICAgICAqb3V0ID0gTlVMTDsKIAotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyID0gTlVMTDsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyID0gTlVMTDsKICAgICBpbnQ2NF90IHRpbWVVcyA9IC0xOwogCiAgICAgZm9yICg7OykgewpAQCAtNzA5LDE2ICs3ODUsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dFKCJiLzM2NTkyMjAyIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqdG1wID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoZnVsbFNpemUpOworICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKnRtcDsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyR3JvdXApIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZ0bXAsIGZhbHNlLCBmdWxsU2l6ZSk7CisgICAgICAgICAgICAgICAgQUxPR1YoImFjcXVpcmVkIGJ1ZmZlciAlcCBmcm9tIGdyb3VwIiwgdG1wKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdG1wID0gbmV3IFN0YW5kQWxvbmVNZWRpYUJ1ZmZlcihmdWxsU2l6ZSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dFKCJiLzM2NTkyMjAyIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9jbGVhcih0bXAtPm1ldGFfZGF0YSgpKTsKICAgICAgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIG1lbWNweSh0bXAtPmRhdGEoKSwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwogICAgICAgICAgICAgICAgIHRtcC0+c2V0X3JhbmdlKDAsIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwpAQCAtNzM3LDcgKzgyMCw3IEBACiAgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgQUxPR1YoImZhaWxlZCB0byByZWFkICV6dSBieXRlcyBhdCAlIzAxNmxseCwgZ290ICV6ZCBieXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXRTaXplLCAobG9uZyBsb25nKWRhdGFPZmZzZXQsIG4pOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBmdWxsU2l6ZSk7CkBAIC03NDgsOCArODMxLDkgQEAKICAgICAgICAgICAgICAgICAvLyBXZSd2ZSBqdXN0IHJlYWQgdGhlIGVudGlyZSBwYWNrZXQuCiAKICAgICAgICAgICAgICAgICBpZiAobUZpcnN0UGFja2V0SW5QYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVZhbGlkU2FtcGxlcywgbUN1cnJlbnRQYWdlU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMsIG1DdXJyZW50UGFnZVNhbXBsZXMpOwogICAgICAgICAgICAgICAgICAgICBtRmlyc3RQYWNrZXRJblBhZ2UgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTc3MCwxMSArODU0LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFBhZ2UubVByZXZQYWNrZXRQb3MgKz0gYWN0dWFsQmxvY2tTaXplIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UGFnZS5tUHJldlBhY2tldFNpemUgPSBjdXJCbG9ja1NpemU7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVVzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgKm91dCA9IGJ1ZmZlcjsKIAotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gsIHRoZSBidWZmZXIgbm93IGNvbnRhaW5zIHRoZSBzdGFydCBvZiB0aGUgcGFja2V0LgpAQCAtNzkzLDcgKzg3OCw3IEBACiAKICAgICAgICAgICAgIEFMT0dWKCJyZWFkUGFnZSByZXR1cm5lZCAlemQiLCBuKTsKIAotICAgICAgICAgICAgcmV0dXJuIG4gPCAwID8gbiA6IChzdGF0dXNfdClFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgcmV0dXJuIChtZWRpYV9zdGF0dXNfdCkgbjsKICAgICAgICAgfQogCiAgICAgICAgIC8vIFByZXZlbnQgYSBoYXJtbGVzcyB1bnNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93IGJ5IGNsYW1waW5nIHRvIDAKQEAgLTgxNiwzNiArOTAxLDM4IEBACiAgICAgICAgICAgICAgICAgLy8gaXMgYWxyZWFkeSBjb21wbGV0ZS4KIAogICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB0aW1lVXMpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5VmFsaWRTYW1wbGVzLCBtQ3VycmVudFBhZ2VTYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUywgbUN1cnJlbnRQYWdlU2FtcGxlcyk7CiAgICAgICAgICAgICAgICAgbUZpcnN0UGFja2V0SW5QYWdlID0gZmFsc2U7CiAKICAgICAgICAgICAgICAgICAqb3V0ID0gYnVmZmVyOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHN0YXR1c190IE15T2dnRXh0cmFjdG9yOjppbml0KCkgewotICAgIG1NZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtTWltZVR5cGUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgbU1pbWVUeXBlKTsKIAotICAgIHN0YXR1c190IGVycjsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKnBhY2tldDsKKyAgICBtZWRpYV9zdGF0dXNfdCBlcnI7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKnBhY2tldDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1IZWFkZXJzOyArK2kpIHsKICAgICAgICAgLy8gaWdub3JlIHRpbWVzdGFtcCBmb3IgY29uZmlndXJhdGlvbiBwYWNrZXRzCi0gICAgICAgIGlmICgoZXJyID0gX3JlYWROZXh0UGFja2V0KCZwYWNrZXQsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqLyBmYWxzZSkpICE9IE9LKSB7CisgICAgICAgIGlmICgoZXJyID0gX3JlYWROZXh0UGFja2V0KCZwYWNrZXQsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqLyBmYWxzZSkpICE9IEFNRURJQV9PSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgICAgICBBTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlenVcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOwogICAgICAgICBlcnIgPSB2ZXJpZnlIZWFkZXIocGFja2V0LCAvKiB0eXBlID0gKi8gaSAqIDIgKyAxKTsKICAgICAgICAgcGFja2V0LT5yZWxlYXNlKCk7CiAgICAgICAgIHBhY2tldCA9IE5VTEw7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgaWYgKGVyciAhPSBBTUVESUFfT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CkBAIC04NjUsMTIgKzk1MiwxMiBAQAogCiAgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IGdldFRpbWVVc09mR3JhbnVsZShsYXN0R3JhbnVsZVBvc2l0aW9uKTsKIAotICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uVXMpOwogCiAgICAgICAgIGJ1aWxkVGFibGVPZkNvbnRlbnRzKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHZvaWQgTXlPZ2dFeHRyYWN0b3I6OmJ1aWxkVGFibGVPZkNvbnRlbnRzKCkgewpAQCAtOTAyLDcgKzk4OSw3IEBACiAgICAgICAgIHNpemVfdCBkZW5vbSA9IG51bWVyYXRvciAtIGtNYXhOdW1UT0NFbnRyaWVzOwogCiAgICAgICAgIHNpemVfdCBhY2N1bSA9IDA7Ci0gICAgICAgIGZvciAoc3NpemVfdCBpID0gbVRhYmxlT2ZDb250ZW50cy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICBmb3IgKHNzaXplX3QgaSA9IG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpOyBpID4gMDsgLS1pKSB7CiAgICAgICAgICAgICBhY2N1bSArPSBkZW5vbTsKICAgICAgICAgICAgIGlmIChhY2N1bSA+PSBudW1lcmF0b3IpIHsKICAgICAgICAgICAgICAgICBtVGFibGVPZkNvbnRlbnRzLnJlbW92ZUF0KGkpOwpAQCAtOTEyLDcgKzk5OSw3IEBACiAgICAgfQogfQogCi1pbnQzMl90IE15T2dnRXh0cmFjdG9yOjpnZXRQYWNrZXRCbG9ja1NpemUoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKK2ludDMyX3QgTXlPZ2dFeHRyYWN0b3I6OmdldFBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKSB7CiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9CiAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwogCkBAIC05NTIsNyArMTAzOSw3IEBACiAgICAgcmV0dXJuIHBjbVNhbXBsZVBvc2l0aW9uICogMTAwMDAwMGxsIC8ga09wdXNTYW1wbGVSYXRlOwogfQogCi1zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSB7CittZWRpYV9zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpIHsKICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgLy8gdGhlcmUgYXJlIGFjdHVhbGx5IG5vIGhlYWRlciB0eXBlcyBkZWZpbmVkIGluIHRoZSBPcHVzIHNwZWM7IHdlIGNob29zZSAxIGFuZCAzIHRvIG1lYW4KICAgICAgICAgLy8gaGVhZGVyIGFuZCBjb21tZW50cyBzdWNoIHRoYXQgd2UgY2FuIHNoYXJlIGNvZGUgd2l0aCBNeVZvcmJpc0V4dHJhY3Rvci4KQEAgLTk2MSwxMSArMTA0OCwxMSBAQAogICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICByZXR1cm4gdmVyaWZ5T3B1c0NvbW1lbnRzKGJ1ZmZlcik7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIH0KIAotc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlPcHVzSGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSB7CittZWRpYV9zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeU9wdXNIZWFkZXIoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcikgewogICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlclNpemUgPSAxOTsKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0KICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CkBAIC05NzUsMjkgKzEwNjIsMzEgQEAKICAgICBpZiAoc2l6ZSA8IGtPcHVzSGVhZGVyU2l6ZQogICAgICAgICAgICAgfHwgbWVtY21wKGRhdGEsICJPcHVzSGVhZCIsIDgpCiAgICAgICAgICAgICB8fCAvKiB2ZXJzaW9uID0gKi8gZGF0YVs4XSAhPSAxKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIG1DaGFubmVsQ291bnQgPSBkYXRhWzldOwogICAgIG1Db2RlY0RlbGF5ID0gVTE2TEVfQVQoJmRhdGFbMTBdKTsKIAotICAgIG1NZXRhLnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIGRhdGEsIHNpemUpOwotICAgIG1NZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBrT3B1c1NhbXBsZVJhdGUpOwotICAgIG1NZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG1DaGFubmVsQ291bnQpOwotICAgIG1NZXRhLnNldEludDY0KGtLZXlPcHVzU2Vla1ByZVJvbGwgLyogbnMgKi8sIGtPcHVzU2Vla1ByZVJvbGxVcyAqIDEwMDAgLyogPSA4MCBtcyovKTsKLSAgICBtTWV0YS5zZXRJbnQ2NChrS2V5T3B1c0NvZGVjRGVsYXkgLyogbnMgKi8sCi0gICAgICAgICAgICBtQ29kZWNEZWxheSAvKiBzYW1wbGUvcyAqLyAqIDEwMDAwMDAwMDBsbCAvIGtPcHVzU2FtcGxlUmF0ZSk7CisgICAgLy8ga0tleU9wdXNIZWFkZXIgaXMgY3NkLTAKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBkYXRhLCBzaXplKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIGtPcHVzU2FtcGxlUmF0ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIG1DaGFubmVsQ291bnQpOworICAgIGludDY0X3QgY29kZWNkZWxheSA9IG1Db2RlY0RlbGF5IC8qIHNhbXBsZS9zICovICogMTAwMDAwMDAwMGxsIC8ga09wdXNTYW1wbGVSYXRlOworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzEsICZjb2RlY2RlbGF5LCBzaXplb2YoY29kZWNkZWxheSkpOworICAgIGludDY0X3QgcHJlcm9sbCA9IGtPcHVzU2Vla1ByZVJvbGxVcyAqIDEwMDAgLyogPSA4MCBtcyovOworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzIsICZwcmVyb2xsLCBzaXplb2YocHJlcm9sbCkpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSB7CittZWRpYV9zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeU9wdXNDb21tZW50cyhNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKSB7CiAgICAgLy8gYWRkIGFydGlmaWNpYWwgZnJhbWluZyBiaXQgc28gd2UgY2FuIHJldXNlIF92b3JiaXNfdW5wYWNrX2NvbW1lbnQKICAgICBpbnQzMl90IGNvbW1lbnRTaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSArIDE7CiAgICAgYXV0byB0bXAgPSBoZWFwYnVmZmVyPHVpbnQ4X3Q+KGNvbW1lbnRTaXplKTsKICAgICB1aW50OF90ICpjb21tZW50RGF0YSA9IHRtcC5nZXQoKTsKICAgICBpZiAoY29tbWVudERhdGEgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBtZW1jcHkoY29tbWVudERhdGEsCkBAIC0xMDI2LDE0ICsxMTE1LDE0IEBACiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXJMZW47ICsraSkgewogICAgICAgICBjaGFyIGNociA9IG9nZ3BhY2tfcmVhZCgmYml0cywgOCk7CiAgICAgICAgIGlmIChjaHIgIT0gT3B1c1RhZ3NbaV0pIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgIH0KIAogICAgIGludDMyX3QgdmVuZG9yTGVuID0gb2dncGFja19yZWFkKCZiaXRzLCAzMik7CiAgICAgZnJhbWluZ0JpdE9mZnNldCArPSA0OwogICAgIGlmICh2ZW5kb3JMZW4gPCAwIHx8IHZlbmRvckxlbiA+IGNvbW1lbnRTaXplIC0gOCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgLy8gc2tpcCB2ZW5kb3Igc3RyaW5nCiAgICAgZnJhbWluZ0JpdE9mZnNldCArPSB2ZW5kb3JMZW47CkBAIC0xMDQ0LDEzICsxMTMzLDEzIEBACiAgICAgaW50MzJfdCBuID0gb2dncGFja19yZWFkKCZiaXRzLCAzMik7CiAgICAgZnJhbWluZ0JpdE9mZnNldCArPSA0OwogICAgIGlmIChuIDwgMCB8fCBuID4gKChjb21tZW50U2l6ZSAtIG9nZ3BhY2tfYnl0ZXMoJmJpdHMpKSA+PiAyKSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgaW50MzJfdCBsZW4gPSBvZ2dwYWNrX3JlYWQoJmJpdHMsIDMyKTsKICAgICAgICAgZnJhbWluZ0JpdE9mZnNldCArPSA0OwogICAgICAgICBpZiAobGVuICA8IDAgfHwgbGVuICA+IChjb21tZW50U2l6ZSAtIG9nZ3BhY2tfYnl0ZXMoJmJpdHMpKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gbGVuOwogICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbjsgKytqKSB7CkBAIC0xMDU4LDcgKzExNDcsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChmcmFtaW5nQml0T2Zmc2V0IDwgMCB8fCBmcmFtaW5nQml0T2Zmc2V0ID49IGNvbW1lbnRTaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICBjb21tZW50RGF0YVtmcmFtaW5nQml0T2Zmc2V0XSA9IDE7CiAKQEAgLTEwNzUsMjIgKzExNjQsMjMgQEAKICAgICBvZ2dwYWNrX3JlYWRpbml0KCZiaXRzLCAmcmVmKTsKICAgICBpbnQgZXJyID0gX3ZvcmJpc191bnBhY2tfY29tbWVudCgmbVZjLCAmYml0cyk7CiAgICAgaWYgKDAgIT0gZXJyKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIHBhcnNlRmlsZU1ldGFEYXRhKCk7Ci0gICAgcmV0dXJuIE9LOworICAgIHNldENoYW5uZWxNYXNrKG1DaGFubmVsQ291bnQpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE15Vm9yYmlzRXh0cmFjdG9yOjp2ZXJpZnlIZWFkZXIoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpIHsKK21lZGlhX3N0YXR1c190IE15Vm9yYmlzRXh0cmFjdG9yOjp2ZXJpZnlIZWFkZXIoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgewogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQogICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKIAogICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKIAogICAgIGlmIChzaXplIDwgNyB8fCBkYXRhWzBdICE9IHR5cGUgfHwgbWVtY21wKCZkYXRhWzFdLCAidm9yYmlzIiwgNikpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgb2dnX2J1ZmZlciBidWY7CkBAIC0xMTA5LDcgKzExOTksNyBAQAogICAgIG9nZ3BhY2tfcmVhZGluaXQoJmJpdHMsICZyZWYpOwogCiAgICAgaWYgKG9nZ3BhY2tfcmVhZCgmYml0cywgOCkgIT0gdHlwZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA2OyArK2kpIHsKICAgICAgICAgb2dncGFja19yZWFkKCZiaXRzLCA4KTsgIC8vIHNraXAgJ3ZvcmJpcycKQEAgLTExMTksMTMgKzEyMDksMTMgQEAKICAgICAgICAgY2FzZSAxOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19pbmZvKCZtVmksICZiaXRzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1NZXRhLnNldERhdGEoa0tleVZvcmJpc0luZm8sIDAsIGRhdGEsIHNpemUpOwotICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1WaS5yYXRlKTsKLSAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG1WaS5jaGFubmVscyk7Ci0gICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgbVZpLmJpdHJhdGVfbm9taW5hbCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgbVZpLnJhdGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIG1WaS5jaGFubmVscyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIG1WaS5iaXRyYXRlX25vbWluYWwpOwogCiAgICAgICAgICAgICBBTE9HVigibG93ZXItYml0cmF0ZSA9ICVsZCIsIG1WaS5iaXRyYXRlX2xvd2VyKTsKICAgICAgICAgICAgIEFMT0dWKCJ1cHBlci1iaXRyYXRlID0gJWxkIiwgbVZpLmJpdHJhdGVfdXBwZXIpOwpAQCAtMTE0MCw3ICsxMjMwLDcgQEAKICAgICAgICAgICAgIGlmIChtU291cmNlLT5nZXRTaXplKCZzaXplKSA9PSBPSykgewogICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJwcyA9IGFwcHJveEJpdHJhdGUoKTsKICAgICAgICAgICAgICAgICBpZiAoYnBzICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbU1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBzaXplICogODAwMDAwMGxsIC8gYnBzKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBzaXplICogODAwMDAwMGxsIC8gYnBzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTExNDksMjUgKzEyMzksMjYgQEAKICAgICAgICAgY2FzZSAzOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19jb21tZW50KCZtVmMsICZiaXRzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHBhcnNlRmlsZU1ldGFEYXRhKCk7CisgICAgICAgICAgICBzZXRDaGFubmVsTWFzayhtVmkuY2hhbm5lbHMpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIDU6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2Jvb2tzKCZtVmksICZiaXRzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1NZXRhLnNldERhdGEoa0tleVZvcmJpc0Jvb2tzLCAwLCBkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzEsIGRhdGEsIHNpemUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogdWludDY0X3QgTXlWb3JiaXNFeHRyYWN0b3I6OmFwcHJveEJpdHJhdGUoKSBjb25zdCB7CkBAIC0xMTgwLDIwICsxMjcxLDQzIEBACiAKIAogdm9pZCBNeU9nZ0V4dHJhY3Rvcjo6cGFyc2VGaWxlTWV0YURhdGEoKSB7Ci0gICAgbUZpbGVNZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHKTsKIAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVZjLmNvbW1lbnRzOyArK2kpIHsKICAgICAgICAgY29uc3QgY2hhciAqY29tbWVudCA9IG1WYy51c2VyX2NvbW1lbnRzW2ldOwogICAgICAgICBzaXplX3QgY29tbWVudExlbmd0aCA9IG1WYy5jb21tZW50X2xlbmd0aHNbaV07Ci0gICAgICAgIHBhcnNlVm9yYmlzQ29tbWVudCgmbUZpbGVNZXRhLCBjb21tZW50LCBjb21tZW50TGVuZ3RoKTsKKyAgICAgICAgcGFyc2VWb3JiaXNDb21tZW50KG1GaWxlTWV0YSwgY29tbWVudCwgY29tbWVudExlbmd0aCk7CiAgICAgICAgIC8vQUxPR0koImNvbW1lbnQgIyVkOiAnJXMnIiwgaSArIDEsIG1WYy51c2VyX2NvbW1lbnRzW2ldKTsKICAgICB9CisKKyAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZpbGVNZXRhLCAiaGFwdGljIiwgJm1IYXB0aWNDaGFubmVsQ291bnQpOworfQorCit2b2lkIE15T2dnRXh0cmFjdG9yOjpzZXRDaGFubmVsTWFzayhpbnQgY2hhbm5lbENvdW50KSB7CisgICAgLy8gU2V0IGNoYW5uZWwgbWFzayBhY2NvcmRpbmcgdG8gY2hhbm5lbCBjb3VudC4gV2hlbiBoYXB0aWMgY2hhbm5lbCBjb3VudCBpcyBmb3VuZCBpbgorICAgIC8vIGZpbGUgbWV0YSwgc2V0IGhhcHRpYyBjaGFubmVsIG1hc2sgdG8gdHJ5IGhhcHRpYyBwbGF5YmFjay4KKyAgICBpZiAobUhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKKyAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaGFwdGljQ2hhbm5lbE1hc2sgPQorICAgICAgICAgICAgICAgIGhhcHRpY19jaGFubmVsX21hc2tfZnJvbV9jb3VudChtSGFwdGljQ2hhbm5lbENvdW50KTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBhdWRpb0NoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudCAtIG1IYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIGlmIChoYXB0aWNDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOVkFMSUQKKyAgICAgICAgICAgICAgICB8fCBhdWRpb0NoYW5uZWxDb3VudCA8PSAwIHx8IGF1ZGlvQ2hhbm5lbENvdW50ID4gRkNDXzgpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGhhcHRpYyBjaGFubmVsIGNvdW50IGZvdW5kIGluIG1ldGFkYXRhOiAlZCIsIG1IYXB0aWNDaGFubmVsQ291bnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvQ2hhbm5lbENvdW50KSB8IGhhcHRpY0NoYW5uZWxNYXNrOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfTUFTSywgY2hhbm5lbE1hc2spOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KSk7CisgICAgfQogfQogCiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLU9nZ0V4dHJhY3Rvcjo6T2dnRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitPZ2dFeHRyYWN0b3I6Ok9nZ0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1JbXBsKE5VTEwpIHsKQEAgLTEyMjAsMTMgKzEzMzQsMTQgQEAKIE9nZ0V4dHJhY3Rvcjo6fk9nZ0V4dHJhY3RvcigpIHsKICAgICBkZWxldGUgbUltcGw7CiAgICAgbUltcGwgPSBOVUxMOworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKIH0KIAogc2l6ZV90IE9nZ0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CiAgICAgcmV0dXJuIG1Jbml0Q2hlY2sgIT0gT0sgPyAwIDogMTsKIH0KIAotTWVkaWFUcmFjayAqT2dnRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXIgKk9nZ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKGluZGV4ID49IDEpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTIzNCwzMyArMTM0OSwzNCBAQAogICAgIHJldHVybiBuZXcgT2dnU291cmNlKHRoaXMpOwogfQogCi1zdGF0dXNfdCBPZ2dFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE9nZ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKGluZGV4ID49IDEpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICByZXR1cm4gbUltcGwtPmdldEZvcm1hdChtZXRhKTsKIH0KIAotc3RhdHVzX3QgT2dnRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK21lZGlhX3N0YXR1c190IE9nZ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgcmV0dXJuIG1JbXBsLT5nZXRGaWxlTWV0YURhdGEobWV0YSk7CiB9CiAKLXN0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICB2b2lkICopIHsKLSAgICByZXR1cm4gbmV3IE9nZ0V4dHJhY3Rvcihzb3VyY2UpOworICAgIHJldHVybiB3cmFwKG5ldyBPZ2dFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKICAgICAgICAgdm9pZCAqKiwKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSB7CisgICAgICAgIEZyZWVNZXRhRnVuYyAqKSB7CisgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIoc291cmNlKTsKICAgICBjaGFyIHRtcFs0XTsKLSAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgdG1wLCA0KSA8IDQgfHwgbWVtY21wKHRtcCwgIk9nZ1MiLCA0KSkgeworICAgIGlmIChoZWxwZXIucmVhZEF0KDAsIHRtcCwgNCkgPCA0IHx8IG1lbWNtcCh0bXAsICJPZ2dTIiwgNCkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC0xMjY5LDE2ICsxMzg1LDIzIEBACiAgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAib2dhIiwKKyAgICAib2dnIiwKKyAgICAib3B1cyIsCisgICAgTlVMTAorfTsKKwogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgVVVJRCgiOGNjNWNkMDYtZjc3Mi00OTVlLThhNjItY2JhOTY0OTM3NGU5IiksCiAgICAgICAgIDEsIC8vIHZlcnNpb24KICAgICAgICAgIk9nZyBFeHRyYWN0b3IiLAotICAgICAgICBTbmlmZgorICAgICAgICB7IC52MyA9IHtTbmlmZiwgZXh0ZW5zaW9uc30gfSwKICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5oCmluZGV4IDlmZTI5NDQuLmM3NWRmYTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5oCkBAIC0xOSwyNSArMTksMjYgQEAKICNkZWZpbmUgT0dHX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7Ci1jbGFzcyBEYXRhU291cmNlQmFzZTsKIGNsYXNzIFN0cmluZzg7CiAKIHN0cnVjdCBNeU9nZ0V4dHJhY3RvcjsKIHN0cnVjdCBPZ2dTb3VyY2U7CiAKLXN0cnVjdCBPZ2dFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE9nZ0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKK3N0cnVjdCBPZ2dFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgeworICAgIGV4cGxpY2l0IE9nZ0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk9nZ0V4dHJhY3RvciI7IH0KIAogcHJvdGVjdGVkOgpAQCAtNDYsNyArNDcsNyBAQAogcHJpdmF0ZToKICAgICBmcmllbmQgc3RydWN0IE9nZ1NvdXJjZTsKIAotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogCiAgICAgTXlPZ2dFeHRyYWN0b3IgKm1JbXBsOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAKaW5kZXggZGQwNDViOS4uN2U4OTI3MSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwCkBAIC03LDExICs3LDEzIEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKICAgICAgICAgImxpYmZpZm8iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuY3BwCmluZGV4IGZlNTA5YmYuLjAyMDk1MWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmNwcApAQCAtMjAsMjEgKzIwLDMyIEBACiAKICNpbmNsdWRlICJXQVZFeHRyYWN0b3IuaCIKIAorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2liaW5kZXIuaD4gLy8gZm9yIEFJQmluZGVyX2dldENhbGxpbmdVaWQKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPiAvLyBmb3IgQUlEX01FRElBCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPGN1dGlscy9iaXRvcHMuaD4KIAogI2RlZmluZSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIgMAogCisvLyBOT1RFOiBUaGlzIGNvZGUgYXNzdW1lcyB0aGUgZGV2aWNlIHByb2Nlc3NvciBpcyBsaXR0bGUgZW5kaWFuLgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKKy8vIE1lZGlhU2VydmVyIGlzIGNhcGFibGUgb2YgaGFuZGxpbmcgZmxvYXQgZXh0cmFjdG9yIG91dHB1dCwgYnV0IGdlbmVyYWwgcHJvY2Vzc2VzCisvLyBtYXkgbm90IGJlIGFibGUgdG8gZG8gc28uCisvLyBUT0RPOiBJbXByb3ZlIEFQSSB0byBzZXQgZXh0cmFjdG9yIGZsb2F0IG91dHB1dC4KKy8vIChOb3RlOiBkdXBsaWNhdGVkIHdpdGggRkxBQ0V4dHJhY3Rvci5jcHApCitzdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxkRXh0cmFjdG9yT3V0cHV0RmxvYXQoaW50IGJpdHNQZXJTYW1wbGUpCit7CisgICAgcmV0dXJuIGJpdHNQZXJTYW1wbGUgPiAxNiAmJiBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkKCkgPT0gQUlEX01FRElBOworfQorCiBlbnVtIHsKICAgICBXQVZFX0ZPUk1BVF9QQ00gICAgICAgID0gMHgwMDAxLAogICAgIFdBVkVfRk9STUFUX0lFRUVfRkxPQVQgPSAweDAwMDMsCkBAIC01NSwyMiArNjYsMjIgQEAKICAgICByZXR1cm4gcHRyWzFdIDw8IDggfCBwdHJbMF07CiB9CiAKLXN0cnVjdCBXQVZTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitzdHJ1Y3QgV0FWU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogICAgIFdBVlNvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgICAgIHVpbnQxNl90IHdhdmVGb3JtYXQsCi0gICAgICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGUsCisgICAgICAgICAgICBib29sIG91dHB1dEZsb2F0LAogICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCi0gICAgdmlydHVhbCBib29sIHN1cHBvcnROb25ibG9ja2luZ1JlYWQoKSB7IHJldHVybiB0cnVlOyB9CisgICAgYm9vbCBzdXBwb3J0c05vbkJsb2NraW5nUmVhZCgpIG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5XQVZTb3VyY2UoKTsKQEAgLTc4LDY0ICs4OSw3MiBAQAogcHJpdmF0ZToKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhGcmFtZVNpemU7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlICZtTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogICAgIHVpbnQxNl90IG1XYXZlRm9ybWF0OworICAgIGNvbnN0IGJvb2wgbU91dHB1dEZsb2F0OwogICAgIGludDMyX3QgbVNhbXBsZVJhdGU7CiAgICAgaW50MzJfdCBtTnVtQ2hhbm5lbHM7CiAgICAgaW50MzJfdCBtQml0c1BlclNhbXBsZTsKICAgICBvZmY2NF90IG1PZmZzZXQ7CiAgICAgc2l6ZV90IG1TaXplOwogICAgIGJvb2wgbVN0YXJ0ZWQ7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwogICAgIG9mZjY0X3QgbUN1cnJlbnRQb3M7CiAKICAgICBXQVZTb3VyY2UoY29uc3QgV0FWU291cmNlICYpOwogICAgIFdBVlNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IFdBVlNvdXJjZSAmKTsKIH07CiAKLVdBVkV4dHJhY3Rvcjo6V0FWRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitXQVZFeHRyYWN0b3I6OldBVkV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbVZhbGlkRm9ybWF0KGZhbHNlKSwKICAgICAgIG1DaGFubmVsTWFzayhDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIpIHsKKyAgICBtVHJhY2tNZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOwogICAgIG1Jbml0Q2hlY2sgPSBpbml0KCk7CiB9CiAKIFdBVkV4dHJhY3Rvcjo6fldBVkV4dHJhY3RvcigpIHsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtVHJhY2tNZXRhKTsKIH0KIAotc3RhdHVzX3QgV0FWRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLmNsZWFyKCk7CittZWRpYV9zdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV0FWKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVYpOwogICAgIH0KIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzaXplX3QgV0FWRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKICAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOwogfQogCi1NZWRpYVRyYWNrICpXQVZFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworTWVkaWFUcmFja0hlbHBlciAqV0FWRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgcmV0dXJuIG5ldyBXQVZTb3VyY2UoCiAgICAgICAgICAgICBtRGF0YVNvdXJjZSwgbVRyYWNrTWV0YSwKLSAgICAgICAgICAgIG1XYXZlRm9ybWF0LCBtQml0c1BlclNhbXBsZSwgbURhdGFPZmZzZXQsIG1EYXRhU2l6ZSk7CisgICAgICAgICAgICBtV2F2ZUZvcm1hdCwgc2hvdWxkRXh0cmFjdG9yT3V0cHV0RmxvYXQobUJpdHNQZXJTYW1wbGUpLCBtRGF0YU9mZnNldCwgbURhdGFTaXplKTsKIH0KIAotc3RhdHVzX3QgV0FWRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCittZWRpYV9zdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAotICAgIG1ldGEgPSBtVHJhY2tNZXRhOwotICAgIHJldHVybiBPSzsKKyAgICBjb25zdCBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtVHJhY2tNZXRhKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORywKKyAgICAgICAgICAgICAgICBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChtQml0c1BlclNhbXBsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgID8ga0F1ZGlvRW5jb2RpbmdQY21GbG9hdCA6IGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmluaXQoKSB7CkBAIC0xODUsNyArMjA0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgJiYgbVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfTVVMQVcKICAgICAgICAgICAgICAgICAgICAgJiYgbVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfTVNHU00KICAgICAgICAgICAgICAgICAgICAgJiYgbVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfRVhURU5TSUJMRSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB1aW50OF90IGZtdFNpemUgPSAxNjsKQEAgLTE5OCwxMyArMjE3LDEzIEBACiAKICAgICAgICAgICAgIG1OdW1DaGFubmVscyA9IFUxNl9MRV9BVCgmZm9ybWF0U3BlY1syXSk7CiAKLSAgICAgICAgICAgIGlmIChtTnVtQ2hhbm5lbHMgPCAxIHx8IG1OdW1DaGFubmVscyA+IDgpIHsKKyAgICAgICAgICAgIGlmIChtTnVtQ2hhbm5lbHMgPCAxIHx8IG1OdW1DaGFubmVscyA+IEZDQ184KSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscyAoJWQpIiwgbU51bUNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX0VYVEVOU0lCTEUpIHsKLSAgICAgICAgICAgICAgICBpZiAobU51bUNoYW5uZWxzICE9IDEgJiYgbU51bUNoYW5uZWxzICE9IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAobU51bUNoYW5uZWxzICE9IDEgJiYgbU51bUNoYW5uZWxzICE9IEZDQ18yKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJNb3JlIHRoYW4gMiBjaGFubmVscyAoJWQpIGluIG5vbi1XQVZFX0VYVCwgdW5rbm93biBjaGFubmVsIG1hc2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1DaGFubmVscyk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjI0LDcgKzI0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZEJpdHNQZXJTYW1wbGUgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInZhbGlkQml0cyglZCkgIT0gYml0c1BlclNhbXBsZSglZCkgYXJlIG5vdCBzdXBwb3J0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZEJpdHNQZXJTYW1wbGUsIG1CaXRzUGVyU2FtcGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IHN1cHBvcnQgdmFsaXRCaXRzUGVyU2FtcGxlID09IGJpdHNQZXJTYW1wbGUgYnV0IHNvbWUgV0FWX0VYVAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVycyBkb24ndCBjb3JyZWN0bHkgc2V0IHRoZSB2YWxpZCBiaXRzIHZhbHVlLCBhbmQgbGVhdmUgaXQgYXQgMC4KQEAgLTI4NCwzNSArMzAzLDMzIEBACiAgICAgICAgICAgICAgICAgbURhdGFPZmZzZXQgPSBvZmZzZXQ7CiAgICAgICAgICAgICAgICAgbURhdGFTaXplID0gY2h1bmtTaXplOwogCi0gICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5jbGVhcigpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtVHJhY2tNZXRhKTsKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAobVdhdmVGb3JtYXQpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXQVZFX0ZPUk1BVF9QQ006CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0FWRV9GT1JNQVRfSUVFRV9GTE9BVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtVHJhY2tNZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXQVZFX0ZPUk1BVF9BTEFXOgotICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1UcmFja01ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX01TR1NNOgotICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobVRyYWNrTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1XYXZlRm9ybWF0LCAodWludDE2X3QpV0FWRV9GT1JNQVRfTVVMQVcpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1UcmFja01ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbU51bUNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDMyKGtLZXlDaGFubmVsTWFzaywgbUNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgbUJpdHNQZXJTYW1wbGUpOwotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50MzIoa0tleVBjbUVuY29kaW5nLCBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKLQorICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIG1OdW1DaGFubmVscyk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9NQVNLLCBtQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFLCBtQml0c1BlclNhbXBsZSk7CiAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gMDsKICAgICAgICAgICAgICAgICBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfTVNHU00pIHsKICAgICAgICAgICAgICAgICAgICAgLy8gNjUgYnl0ZXMgZGVjb2RlIHRvIDMyMCA4a0h6IHNhbXBsZXMKQEAgLTMyMiwxOCArMzM5LDE4IEBACiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlc1BlclNhbXBsZSA9IG1CaXRzUGVyU2FtcGxlID4+IDM7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFieXRlc1BlclNhbXBsZSB8fCAhbU51bUNoYW5uZWxzKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogCiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fc2FtcGxlcyA9IG1EYXRhU2l6ZSAvIChtTnVtQ2hhbm5lbHMgKiBieXRlc1BlclNhbXBsZSk7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFtU2FtcGxlUmF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKIAogICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblVzID0KICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBMTCAqIG51bV9zYW1wbGVzIC8gbVNhbXBsZVJhdGU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtVHJhY2tNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBkdXJhdGlvblVzKTsKIAogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgIH0KQEAgLTM0OCwyNSArMzY1LDIxIEBACiBjb25zdCBzaXplX3QgV0FWU291cmNlOjprTWF4RnJhbWVTaXplID0gMzI3Njg7CiAKIFdBVlNvdXJjZTo6V0FWU291cmNlKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHVpbnQxNl90IHdhdmVGb3JtYXQsCi0gICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZSwKKyAgICAgICAgYm9vbCBvdXRwdXRGbG9hdCwKICAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKQogICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCiAgICAgICBtTWV0YShtZXRhKSwKICAgICAgIG1XYXZlRm9ybWF0KHdhdmVGb3JtYXQpLAotICAgICAgbVNhbXBsZVJhdGUoMCksCi0gICAgICBtTnVtQ2hhbm5lbHMoMCksCi0gICAgICBtQml0c1BlclNhbXBsZShiaXRzUGVyU2FtcGxlKSwKKyAgICAgIG1PdXRwdXRGbG9hdChvdXRwdXRGbG9hdCksCiAgICAgICBtT2Zmc2V0KG9mZnNldCksCiAgICAgICBtU2l6ZShzaXplKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgIG1Hcm91cChOVUxMKSB7Ci0gICAgQ0hFQ0sobU1ldGEuZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmbVNhbXBsZVJhdGUpKTsKLSAgICBDSEVDSyhtTWV0YS5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm1OdW1DaGFubmVscykpOwotCi0gICAgbU1ldGEuc2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwga01heEZyYW1lU2l6ZSk7CisgICAgICBtU3RhcnRlZChmYWxzZSkgeworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgJm1TYW1wbGVSYXRlKSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsICZtTnVtQ2hhbm5lbHMpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFLCAmbUJpdHNQZXJTYW1wbGUpKTsKIH0KIAogV0FWU291cmNlOjp+V0FWU291cmNlKCkgewpAQCAtMzc1LDUyICszODgsNTEgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IFdBVlNvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICogLyogcGFyYW1zICovKSB7CittZWRpYV9zdGF0dXNfdCBXQVZTb3VyY2U6OnN0YXJ0KCkgewogICAgIEFMT0dWKCJXQVZTb3VyY2U6OnN0YXJ0Iik7CiAKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCiAgICAgLy8gc29tZSBXQVYgZmlsZXMgbWF5IGhhdmUgbGFyZ2UgYXVkaW8gYnVmZmVycyB0aGF0IHVzZSBzaGFyZWQgbWVtb3J5IHRyYW5zZmVyLgotICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwKDQgLyogYnVmZmVycyAqLywga01heEZyYW1lU2l6ZSk7Ci0KLSAgICBpZiAobUJpdHNQZXJTYW1wbGUgPT0gOCkgewotICAgICAgICAvLyBBcyBhIHRlbXBvcmFyeSBidWZmZXIgZm9yIDgtPjE2IGJpdCBjb252ZXJzaW9uLgotICAgICAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoa01heEZyYW1lU2l6ZSkpOworICAgIGlmICghbUJ1ZmZlckdyb3VwLT5pbml0KDQgLyogYnVmZmVycyAqLywga01heEZyYW1lU2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIG1DdXJyZW50UG9zID0gbU9mZnNldDsKIAogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBXQVZTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBXQVZTb3VyY2U6OnN0b3AoKSB7CiAgICAgQUxPR1YoIldBVlNvdXJjZTo6c3RvcCIpOwogCiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBXQVZTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK21lZGlhX3N0YXR1c190IFdBVlNvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIEFMT0dWKCJXQVZTb3VyY2U6OmdldEZvcm1hdCIpOwogCi0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKKyAgICBjb25zdCBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwga01heEZyYW1lU2l6ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORywKKyAgICAgICAgICAgICAgICBtT3V0cHV0RmxvYXQgPyBrQXVkaW9FbmNvZGluZ1BjbUZsb2F0IDoga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IFdBVlNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgV0FWU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIAotICAgIGlmIChvcHRpb25zICE9IG51bGxwdHIgJiYgb3B0aW9ucy0+Z2V0Tm9uQmxvY2tpbmcoKSAmJiAhbUdyb3VwLT5oYXNfYnVmZmVycygpKSB7Ci0gICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICBpZiAob3B0aW9ucyAhPSBudWxscHRyICYmIG9wdGlvbnMtPmdldE5vbkJsb2NraW5nKCkgJiYgIW1CdWZmZXJHcm91cC0+aGFzX2J1ZmZlcnMoKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1dPVUxEX0JMT0NLOwogICAgIH0KIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKQEAgLTQ0MiwxOCArNDU0LDIyIEBACiAgICAgICAgIG1DdXJyZW50UG9zID0gcG9zICsgbU9mZnNldDsKICAgICB9CiAKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CisgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgLy8gbWFrZSBzdXJlIHRoYXQgbWF4Qnl0ZXNUb1JlYWQgaXMgbXVsdGlwbGUgb2YgMywgaW4gMjQtYml0IGNhc2UKLSAgICBzaXplX3QgbWF4Qnl0ZXNUb1JlYWQgPQotICAgICAgICBtQml0c1BlclNhbXBsZSA9PSA4ID8ga01heEZyYW1lU2l6ZSAvIDIgOiAKLSAgICAgICAgKG1CaXRzUGVyU2FtcGxlID09IDI0ID8gMyooa01heEZyYW1lU2l6ZS8zKToga01heEZyYW1lU2l6ZSk7CisgICAgLy8gbWF4Qnl0ZXNUb1JlYWQgbWF5IGJlIHJlZHVjZWQgc28gdGhhdCBpbi1wbGFjZSBkYXRhIGNvbnZlcnNpb24gd2lsbCBmaXQgaW4gYnVmZmVyIHNpemUuCisgICAgY29uc3Qgc2l6ZV90IGJ1ZmZlclNpemUgPSBidWZmZXItPnNpemUoKTsKKyAgICBzaXplX3QgbWF4Qnl0ZXNUb1JlYWQ7CisgICAgaWYgKG1PdXRwdXRGbG9hdCkgeyAvLyBkZXN0aW5hdGlvbiBpcyBmbG9hdCBhdCA0IGJ5dGVzIHBlciBzYW1wbGUsIHNvdXJjZSBtYXkgYmUgbGVzcy4KKyAgICAgICAgbWF4Qnl0ZXNUb1JlYWQgPSAobUJpdHNQZXJTYW1wbGUgLyA4KSAqIChidWZmZXJTaXplIC8gNCk7CisgICAgfSBlbHNlIHsgLy8gZGVzdGluYXRpb24gaXMgaW50MTZfdCBhdCAyIGJ5dGVzIHBlciBzYW1wbGUsIG9ubHkgc291cmNlIG9mIDggYml0cyBpcyBsZXNzLgorICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IG1CaXRzUGVyU2FtcGxlID09IDggPyBidWZmZXJTaXplIC8gMiA6IGJ1ZmZlclNpemU7CisgICAgfQogCi0gICAgc2l6ZV90IG1heEJ5dGVzQXZhaWxhYmxlID0KKyAgICBjb25zdCBzaXplX3QgbWF4Qnl0ZXNBdmFpbGFibGUgPQogICAgICAgICAobUN1cnJlbnRQb3MgLSBtT2Zmc2V0ID49IChvZmY2NF90KW1TaXplKQogICAgICAgICAgICAgPyAwIDogbVNpemUgLSAobUN1cnJlbnRQb3MgLSBtT2Zmc2V0KTsKIApAQCAtNDgyLDQ1ICs0OTgsNjQgQEAKICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBuKTsKIAogICAgIC8vIFRPRE86IGFkZCBjYXBhYmlsaXR5IHRvIHJldHVybiBkYXRhIGFzIGZsb2F0IFBDTSBpbnN0ZWFkIG9mIDE2IGJpdCBQQ00uCiAgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX1BDTSkgewotICAgICAgICBpZiAobUJpdHNQZXJTYW1wbGUgPT0gOCkgewotICAgICAgICAgICAgLy8gQ29udmVydCA4LWJpdCB1bnNpZ25lZCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQuCi0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgYnVmZmVyIHdpdGggMiBieXRlIHdpZGUgc2FtcGxlcwotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICp0bXA7Ci0gICAgICAgICAgICBDSEVDS19FUShtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZ0bXApLCAoc3RhdHVzX3QpT0spOwotICAgICAgICAgICAgdG1wLT5zZXRfcmFuZ2UoMCwgMiAqIG4pOwotCi0gICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fdTgoKGludDE2X3QgKil0bXAtPmRhdGEoKSwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgbik7Ci0gICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIGJ1ZmZlciA9IHRtcDsKLSAgICAgICAgfSBlbHNlIGlmIChtQml0c1BlclNhbXBsZSA9PSAyNCkgewotICAgICAgICAgICAgLy8gQ29udmVydCAyNC1iaXQgc2lnbmVkIHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZCBpbiBwbGFjZQotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gMzsKLQotICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX3AyNCgoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBudW1TYW1wbGVzKTsKLSAgICAgICAgfSAgZWxzZSBpZiAobUJpdHNQZXJTYW1wbGUgPT0gMzIpIHsKLSAgICAgICAgICAgIC8vIENvbnZlcnQgMzItYml0IHNpZ25lZCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQgaW4gcGxhY2UKLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDQ7Ci0KLSAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9pMzIoKGludDE2X3QgKilidWZmZXItPmRhdGEoKSwgKGNvbnN0IGludDMyX3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCAyICogbnVtU2FtcGxlcyk7CisgICAgICAgIGlmIChtT3V0cHV0RmxvYXQpIHsKKyAgICAgICAgICAgIGZsb2F0ICpmZGVzdCA9IChmbG9hdCAqKWJ1ZmZlci0+ZGF0YSgpOworICAgICAgICAgICAgc3dpdGNoIChtQml0c1BlclNhbXBsZSkgeworICAgICAgICAgICAgY2FzZSA4OiB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgNCAqIG4pOworICAgICAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX3U4KGZkZXN0LCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBuKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2OiB7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gMjsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCA0ICogbnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KGZkZXN0LCAoY29uc3QgaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0OiB7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gMzsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCA0ICogbnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21fcDI0KGZkZXN0LCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyOiB7IC8vIGJ1ZmZlciByYW5nZSBpcyBjb3JyZWN0CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gNDsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMzIoZmRlc3QsIChjb25zdCBpbnQzMl90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludDE2X3QgKmlkZXN0ID0gKGludDE2X3QgKilidWZmZXItPmRhdGEoKTsKKyAgICAgICAgICAgIHN3aXRjaCAobUJpdHNQZXJTYW1wbGUpIHsKKyAgICAgICAgICAgIGNhc2UgODogeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBuKTsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fdTgoaWRlc3QsIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG4pOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgYnJlYWs7IC8vIG5vIHRyYW5zbGF0aW9uIG5lZWRlZAorICAgICAgICAgICAgY2FzZSAyNDogeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDM7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMiAqIG51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9wMjQoaWRlc3QsIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzI6IHsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyA0OworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21faTMyKGlkZXN0LCAoY29uc3QgaW50MzJfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX0lFRUVfRkxPQVQpIHsKLSAgICAgICAgaWYgKG1CaXRzUGVyU2FtcGxlID09IDMyKSB7Ci0gICAgICAgICAgICAvLyBDb252ZXJ0IDMyLWJpdCBmbG9hdCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQgaW4gcGxhY2UKKyAgICAgICAgaWYgKCFtT3V0cHV0RmxvYXQpIHsgLy8gbUJpdHNQZXJTYW1wbGUgPT0gMzIKKyAgICAgICAgICAgIGludDE2X3QgKmlkZXN0ID0gKGludDE2X3QgKilidWZmZXItPmRhdGEoKTsKICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDQ7Ci0KLSAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdCgoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCAoY29uc3QgZmxvYXQgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoaWRlc3QsIChjb25zdCBmbG9hdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBudW1TYW1wbGVzKTsKICAgICAgICAgfQorICAgICAgICAvLyBOb3RlOiBpZiBvdXRwdXQgZW5jb2RpbmcgaXMgZmxvYXQsIG5vIG5lZWQgdG8gY29udmVydCBpZiBzb3VyY2UgaXMgZmxvYXQuCiAgICAgfQogCiAgICAgaW50NjRfdCB0aW1lU3RhbXBVcyA9IDA7CkBAIC01MzMsMzkgKzU2OCw0MyBAQAogICAgICAgICAgICAgICAgIC8gKG1OdW1DaGFubmVscyAqIGJ5dGVzUGVyU2FtcGxlKSAvIG1TYW1wbGVSYXRlOwogICAgIH0KIAotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVTdGFtcFVzKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVTdGFtcFVzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKIAotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKICAgICBtQ3VycmVudFBvcyArPSBuOwogCiAgICAgKm91dCA9IGJ1ZmZlcjsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBDTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgdm9pZCAqKSB7Ci0gICAgcmV0dXJuIG5ldyBXQVZFeHRyYWN0b3Ioc291cmNlKTsKKyAgICByZXR1cm4gd3JhcChuZXcgV0FWRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSkpKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBDcmVhdG9yRnVuYyBTbmlmZigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCiAgICAgICAgIHZvaWQgKiosCi0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgeworICAgICAgICBGcmVlTWV0YUZ1bmMgKikgeworICAgIERhdGFTb3VyY2VIZWxwZXIgKmhlbHBlciA9IG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSk7CiAgICAgY2hhciBoZWFkZXJbMTJdOwotICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7CisgICAgaWYgKGhlbHBlci0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKKyAgICAgICAgZGVsZXRlIGhlbHBlcjsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgaWYgKG1lbWNtcChoZWFkZXIsICJSSUZGIiwgNCkgfHwgbWVtY21wKCZoZWFkZXJbOF0sICJXQVZFIiwgNCkpIHsKKyAgICAgICAgZGVsZXRlIGhlbHBlcjsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciA9IG5ldyBXQVZFeHRyYWN0b3Ioc291cmNlKTsKKyAgICBXQVZFeHRyYWN0b3IgKmV4dHJhY3RvciA9IG5ldyBXQVZFeHRyYWN0b3IoaGVscGVyKTsgLy8gZXh0cmFjdG9yIG93bnMgdGhlIGhlbHBlcgogICAgIGludCBudW1UcmFja3MgPSBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CiAgICAgZGVsZXRlIGV4dHJhY3RvcjsKICAgICBpZiAobnVtVHJhY2tzID09IDApIHsKQEAgLTU3NywxNiArNjE2LDIxIEBACiAgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAid2F2IiwKKyAgICBOVUxMCit9OworCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCI3ZDYxMzg1OC01ODM3LTRhMzgtODRjNS0zMzJkMWNkZGVlMjciKSwKICAgICAgICAgMSwgLy8gdmVyc2lvbgogICAgICAgICAiV0FWIEV4dHJhY3RvciIsCi0gICAgICAgIFNuaWZmCisgICAgICAgIHsgLnYzID0ge1NuaWZmLCBleHRlbnNpb25zfSB9LAogICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmgKaW5kZXggNDY3ZDBiNy4uYjUxNDE5NiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmgKQEAgLTE5LDMwICsxOSwzMSBAQAogI2RlZmluZSBXQVZfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTWVzc2FnZTsKLWNsYXNzIERhdGFTb3VyY2VCYXNlOworc3RydWN0IENEYXRhU291cmNlOwogY2xhc3MgU3RyaW5nODsKIAotY2xhc3MgV0FWRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK2NsYXNzIFdBVkV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgV0FWRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworICAgIGV4cGxpY2l0IFdBVkV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIldBVkV4dHJhY3RvciI7IH0KIAogICAgIHZpcnR1YWwgfldBVkV4dHJhY3RvcigpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogICAgIGJvb2wgbVZhbGlkRm9ybWF0OwogICAgIHVpbnQxNl90IG1XYXZlRm9ybWF0OwpAQCAtNTIsNyArNTMsNyBAQAogICAgIHVpbnQxNl90IG1CaXRzUGVyU2FtcGxlOwogICAgIG9mZjY0X3QgbURhdGFPZmZzZXQ7CiAgICAgc2l6ZV90IG1EYXRhU2l6ZTsKLSAgICBNZXRhRGF0YUJhc2UgbVRyYWNrTWV0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1UcmFja01ldGE7CiAKICAgICBzdGF0dXNfdCBpbml0KCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmgKaW5kZXggZGU4ZjEyMC4uODgxOWY4NyAxMDA2NDQKLS0tIGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmgKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmgKQEAgLTQ5LDYgKzQ5LDcgQEAKICAgICAgICAgICAgIENGQV9SR0dCLAogICAgICAgICAgICAgQ0ZBX0JHR1IsCiAgICAgICAgICAgICBDRkFfR0JSRywKKyAgICAgICAgICAgIENGQV9OT05FLAogICAgICAgICB9OwogCiAgICAgICAgIE9wY29kZUxpc3RCdWlsZGVyKCk7CkBAIC04OSw3ICs5MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZmFMYXlvdXQgY2ZhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKTsKIAotCiAgICAgICAgIC8qKgogICAgICAgICAgKiBBZGQgYSBHYWluTWFwIG9wY29kZSB3aXRoIHRoZSBnaXZlbiBmaWVsZHMuICBUaGUgbWFwR2FpbnMgYXJyYXkKICAgICAgICAgICogbXVzdCBoYXZlIG1hcFBvaW50c1YgKiBtYXBQb2ludHNIICogbWFwUGxhbmVzIGVsZW1lbnRzLgpAQCAtMTk3LDYgKzE5NywzMyBAQAogCiAgICAgICAgIHN0YXR1c190IGFkZE9wY29kZVByZWFtYmxlKHVpbnQzMl90IG9wY29kZUlkKTsKIAorICAgIHByaXZhdGU6CisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgQmF5ZXIgR2Fpbk1hcCBvcGNvZGUocykgZm9yIHRoZSBnaXZlbiBtZXRhZGF0YSBwYXJhbWV0ZXJzLgorICAgICAgICAgKiBDRkEgbGF5b3V0IG11c3QgbWF0Y2ggdGhlIGxheW91dCBvZiB0aGUgc2hhZGluZyBtYXAgcGFzc2VkIGludG8gdGhlCisgICAgICAgICAqIGxlbnNTaGFkaW5nTWFwIHBhcmFtZXRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBzdGF0dXNfdCBhZGRCYXllckdhaW5NYXBzRm9yTWV0YWRhdGEodWludDMyX3QgbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2ZhTGF5b3V0IGNmYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBCYXllciBHYWluTWFwIG9wY29kZShzKSBmb3IgdGhlIGdpdmVuIG1ldGFkYXRhIHBhcmFtZXRlcnMuCisgICAgICAgICAqIENGQSBsYXlvdXQgbXVzdCBtYXRjaCB0aGUgbGF5b3V0IG9mIHRoZSBzaGFkaW5nIG1hcCBwYXNzZWQgaW50byB0aGUKKyAgICAgICAgICogbGVuc1NoYWRpbmdNYXAgcGFyYW1ldGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXR1c190IGFkZE1vbm9jaHJvbWVHYWluTWFwc0Zvck1ldGFkYXRhKHVpbnQzMl90IGxzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCk7CiB9OwogCiB9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwCmluZGV4IDlhYzdlMmEuLjkzMDRmNTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwCkBAIC02MCwzNCArNjAsMzYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFSaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENmYUxheW91dCBjZmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGggPSBhY3RpdmVBcmVhUmlnaHQgLSBhY3RpdmVBcmVhTGVmdDsKICAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0ID0gYWN0aXZlQXJlYUJvdHRvbSAtIGFjdGl2ZUFyZWFUb3A7Ci0gICAgZG91YmxlIHNwYWNpbmdWID0gMS4wIC8gc3RkOjptYXgoMXUsIGxzbUhlaWdodCAtIDEpOwotICAgIGRvdWJsZSBzcGFjaW5nSCA9IDEuMCAvIHN0ZDo6bWF4KDF1LCBsc21XaWR0aCAtIDEpOwogCi0gICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHJlZE1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7Ci0gICAgZmxvYXQgKnJlZE1hcCA9IHJlZE1hcFZlY3Rvci5kYXRhKCk7Ci0KLSAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gZ3JlZW5FdmVuTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKLSAgICBmbG9hdCAqZ3JlZW5FdmVuTWFwID0gZ3JlZW5FdmVuTWFwVmVjdG9yLmRhdGEoKTsKLQotICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBncmVlbk9kZE1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7Ci0gICAgZmxvYXQgKmdyZWVuT2RkTWFwID0gZ3JlZW5PZGRNYXBWZWN0b3IuZGF0YSgpOwotCi0gICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGJsdWVNYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOwotICAgIGZsb2F0ICpibHVlTWFwID0gYmx1ZU1hcFZlY3Rvci5kYXRhKCk7Ci0KLSAgICBzaXplX3QgbHNtTWFwU2l6ZSA9IGxzbVdpZHRoICogbHNtSGVpZ2h0ICogNDsKLQotICAgIC8vIFNwbGl0IGxlbnMgc2hhZGluZyBtYXAgY2hhbm5lbHMgaW50byBzZXBhcmF0ZSBhcnJheXMKLSAgICBzaXplX3QgaiA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsc21NYXBTaXplOyBpICs9IDQsICsraikgewotICAgICAgICByZWRNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX1JfSU5EXTsKLSAgICAgICAgZ3JlZW5FdmVuTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9HRV9JTkRdOwotICAgICAgICBncmVlbk9kZE1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fR09fSU5EXTsKLSAgICAgICAgYmx1ZU1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fQl9JTkRdOworICAgIHN3aXRjaCAoY2ZhKSB7CisgICAgICAgIGNhc2UgQ0ZBX1JHR0I6CisgICAgICAgIGNhc2UgQ0ZBX0dSQkc6CisgICAgICAgIGNhc2UgQ0ZBX0dCUkc6CisgICAgICAgIGNhc2UgQ0ZBX0JHR1I6CisgICAgICAgICAgICBlcnIgPSBhZGRCYXllckdhaW5NYXBzRm9yTWV0YWRhdGEobHNtV2lkdGgsIGxzbUhlaWdodCwgYWN0aXZlQXJlYVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBhY3RpdmVBcmVhSGVpZ2h0LCBjZmEsIGxlbnNTaGFkaW5nTWFwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENGQV9OT05FOgorICAgICAgICAgICAgZXJyID0gYWRkTW9ub2Nocm9tZUdhaW5NYXBzRm9yTWV0YWRhdGEobHNtV2lkdGgsIGxzbUhlaWdodCwgYWN0aXZlQXJlYVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBhY3RpdmVBcmVhSGVpZ2h0LCBsZW5zU2hhZGluZ01hcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5rbm93biBDRkEgbGF5b3V0ICVkIiwgX19GVU5DVElPTl9fLCBjZmEpOworICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQorICAgIHJldHVybiBlcnI7Cit9CiAKK3N0YXR1c190IE9wY29kZUxpc3RCdWlsZGVyOjphZGRCYXllckdhaW5NYXBzRm9yTWV0YWRhdGEodWludDMyX3QgbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2ZhTGF5b3V0IGNmYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCkgewogICAgIHVpbnQzMl90IHJlZFRvcCA9IDA7CiAgICAgdWludDMyX3QgcmVkTGVmdCA9IDA7CiAgICAgdWludDMyX3QgZ3JlZW5FdmVuVG9wID0gMDsKQEAgLTE0Myw2ICsxNDUsMzIgQEAKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHJlZE1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7CisgICAgZmxvYXQgKnJlZE1hcCA9IHJlZE1hcFZlY3Rvci5kYXRhKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gZ3JlZW5FdmVuTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKKyAgICBmbG9hdCAqZ3JlZW5FdmVuTWFwID0gZ3JlZW5FdmVuTWFwVmVjdG9yLmRhdGEoKTsKKworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBncmVlbk9kZE1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7CisgICAgZmxvYXQgKmdyZWVuT2RkTWFwID0gZ3JlZW5PZGRNYXBWZWN0b3IuZGF0YSgpOworCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGJsdWVNYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOworICAgIGZsb2F0ICpibHVlTWFwID0gYmx1ZU1hcFZlY3Rvci5kYXRhKCk7CisKKyAgICBkb3VibGUgc3BhY2luZ1YgPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtSGVpZ2h0IC0gMSk7CisgICAgZG91YmxlIHNwYWNpbmdIID0gMS4wIC8gc3RkOjptYXgoMXUsIGxzbVdpZHRoIC0gMSk7CisKKyAgICBzaXplX3QgbHNtTWFwU2l6ZSA9IGxzbVdpZHRoICogbHNtSGVpZ2h0ICogNDsKKworICAgIC8vIFNwbGl0IGxlbnMgc2hhZGluZyBtYXAgY2hhbm5lbHMgaW50byBzZXBhcmF0ZSBhcnJheXMKKyAgICBzaXplX3QgaiA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsc21NYXBTaXplOyBpICs9IDQsICsraikgeworICAgICAgICByZWRNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX1JfSU5EXTsKKyAgICAgICAgZ3JlZW5FdmVuTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9HRV9JTkRdOworICAgICAgICBncmVlbk9kZE1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fR09fSU5EXTsKKyAgICAgICAgYmx1ZU1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fQl9JTkRdOworICAgIH0KKwogICAgIHN0YXR1c190IGVyciA9IGFkZEdhaW5NYXAoLyp0b3AqL3JlZFRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbGVmdCovcmVkTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYm90dG9tKi9hY3RpdmVBcmVhSGVpZ2h0IC0gMSwKQEAgLTIxNiw2ICsyNDQsNDYgQEAKICAgICByZXR1cm4gZXJyOwogfQogCitzdGF0dXNfdCBPcGNvZGVMaXN0QnVpbGRlcjo6YWRkTW9ub2Nocm9tZUdhaW5NYXBzRm9yTWV0YWRhdGEodWludDMyX3QgbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKSB7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7CisgICAgZmxvYXQgKm1hcCA9IG1hcFZlY3Rvci5kYXRhKCk7CisKKyAgICBkb3VibGUgc3BhY2luZ1YgPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtSGVpZ2h0IC0gMSk7CisgICAgZG91YmxlIHNwYWNpbmdIID0gMS4wIC8gc3RkOjptYXgoMXUsIGxzbVdpZHRoIC0gMSk7CisKKyAgICBzaXplX3QgbHNtTWFwU2l6ZSA9IGxzbVdpZHRoICogbHNtSGVpZ2h0ICogNDsKKworICAgIC8vIFNwbGl0IGxlbnMgc2hhZGluZyBtYXAgY2hhbm5lbHMgaW50byBzZXBhcmF0ZSBhcnJheXMKKyAgICBzaXplX3QgaiA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsc21NYXBTaXplOyBpICs9IDQsICsraikgeworICAgICAgICBtYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpXTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBhZGRHYWluTWFwKC8qdG9wKi8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypsZWZ0Ki8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypyaWdodCovYWN0aXZlQXJlYVdpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmUqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lcyovMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcm93UGl0Y2gqLzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvbFBpdGNoKi8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBQb2ludHNWKi9sc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c0gqL2xzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBTcGFjaW5nViovc3BhY2luZ1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdIKi9zcGFjaW5nSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luViovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luSCovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwUGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBHYWlucyovbWFwKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgcmV0dXJuIGVycjsKK30KKwogc3RhdHVzX3QgT3Bjb2RlTGlzdEJ1aWxkZXI6OmFkZEdhaW5NYXAodWludDMyX3QgdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJvdHRvbSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivam5pL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYjk4MWMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivam5pL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYyBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMKLQotIyBOREsgcmVjb21tZW5kcyB1c2luZyB0aGlzIGtpbmQgb2YgcmVsYXRpdmUgcGF0aCBpbnN0ZWFkIG9mIGFuIGFic29sdXRlIHBhdGguCi1MT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvaW5wdXRfbW9uaXRvci5jcHAKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwotTE9DQUxfTU9EVUxFIDo9IGlucHV0X21vbml0b3IKLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscwotCi1MT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvaW5wdXRfbW9uaXRvcl9jYWxsYmFjay5jcHAKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwotTE9DQUxfTU9EVUxFIDo9IGlucHV0X21vbml0b3JfY2FsbGJhY2sKLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBsaWJhYXVkaW9fcHJlYnVpbHQKLUxPQ0FMX1NSQ19GSUxFUyA6PSBsaWJhYXVkaW8uc28KLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvaW5jbHVkZQotaW5jbHVkZSAkKFBSRUJVSUxUX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivam5pL0FwcGxpY2F0aW9uLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivam5pL0FwcGxpY2F0aW9uLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQ0NzVjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BcHBsaWNhdGlvbi5taworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyBUT0RPIHJlbW92ZSB0aGVuIHdoZW4gd2Ugc3VwcG9ydCBvdGhlciBhcmNoaXRlY3R1cmVzCi1BUFBfQUJJIDo9IGFybTY0LXY4YQotQVBQX0NQUEZMQUdTICs9IC1zdGQ9YysrMTEKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQW5kcm9pZC5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViZTg3Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzCi0KLSMgTkRLIHJlY29tbWVuZHMgdXNpbmcgdGhpcyBraW5kIG9mIHJlbGF0aXZlIHBhdGggaW5zdGVhZCBvZiBhbiBhYnNvbHV0ZSBwYXRoLgotTE9DQUxfU1JDX0ZJTEVTOj0gLi4vc3JjL2xvb3BiYWNrLmNwcAotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlic25kZmlsZQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8gbGliYXVkaW91dGlscwotTE9DQUxfTU9EVUxFIDo9IGFhdWRpb19sb29wYmFjawotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FwcGxpY2F0aW9uLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BcHBsaWNhdGlvbi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0NGYzNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FwcGxpY2F0aW9uLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotQVBQX0NQUEZMQUdTICs9IC1zdGQ9YysrMTEKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvTG9vcGJhY2tBbmFseXplci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9Mb29wYmFja0FuYWx5emVyLmgKaW5kZXggOTcxMWI4Ni4uOGViNzBiMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9Mb29wYmFja0FuYWx5emVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9Mb29wYmFja0FuYWx5emVyLmgKQEAgLTMxMCw3ICszMTAsNyBAQAogICAgIH0KIAogICAgIC8vIFdyaXRlIFNIT1JUIGRhdGEgZnJvbSB0aGUgZmlyc3QgY2hhbm5lbC4KLSAgICBpbnQgd3JpdGUoaW50MTZfdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsIGludCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90IHdyaXRlKGludDE2X3QgKmlucHV0RGF0YSwgaW50MzJfdCBpbnB1dENoYW5uZWxDb3VudCwgaW50MzJfdCBudW1GcmFtZXMpIHsKICAgICAgICAgLy8gc3RvcCBhdCBlbmQgb2YgYnVmZmVyCiAgICAgICAgIGlmICgobUZyYW1lQ291bnRlciArIG51bUZyYW1lcykgPiBtTWF4RnJhbWVzKSB7CiAgICAgICAgICAgICBudW1GcmFtZXMgPSBtTWF4RnJhbWVzIC0gbUZyYW1lQ291bnRlcjsKQEAgLTMyMiw3ICszMjIsNyBAQAogICAgIH0KIAogICAgIC8vIFdyaXRlIEZMT0FUIGRhdGEgZnJvbSB0aGUgZmlyc3QgY2hhbm5lbC4KLSAgICBpbnQgd3JpdGUoZmxvYXQgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LCBpbnQgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCB3cml0ZShmbG9hdCAqaW5wdXREYXRhLCBpbnQzMl90IGlucHV0Q2hhbm5lbENvdW50LCBpbnQzMl90IG51bUZyYW1lcykgewogICAgICAgICAvLyBzdG9wIGF0IGVuZCBvZiBidWZmZXIKICAgICAgICAgaWYgKChtRnJhbWVDb3VudGVyICsgbnVtRnJhbWVzKSA+IG1NYXhGcmFtZXMpIHsKICAgICAgICAgICAgIG51bUZyYW1lcyA9IG1NYXhGcmFtZXMgLSBtRnJhbWVDb3VudGVyOwpAQCAtMzMzLDcgKzMzMyw3IEBACiAgICAgICAgIHJldHVybiBudW1GcmFtZXM7CiAgICAgfQogCi0gICAgaW50IHNpemUoKSB7CisgICAgaW50MzJfdCBzaXplKCkgewogICAgICAgICByZXR1cm4gbUZyYW1lQ291bnRlcjsKICAgICB9CiAKQEAgLTQ0Myw5ICs0NDMsMTQgQEAKICAgICB2aXJ0dWFsIH5Mb29wYmFja1Byb2Nlc3NvcigpID0gZGVmYXVsdDsKIAogCisgICAgZW51bSBwcm9jZXNzX3Jlc3VsdCB7CisgICAgICAgIFBST0NFU1NfUkVTVUxUX09LLAorICAgICAgICBQUk9DRVNTX1JFU1VMVF9HTElUQ0gKKyAgICB9OworCiAgICAgdmlydHVhbCB2b2lkIHJlc2V0KCkge30KIAotICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKGZsb2F0ICppbnB1dERhdGEsIGludCBpbnB1dENoYW5uZWxDb3VudCwKKyAgICB2aXJ0dWFsIHByb2Nlc3NfcmVzdWx0IHByb2Nlc3MoZmxvYXQgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICBmbG9hdCAqb3V0cHV0RGF0YSwgaW50IG91dHB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgaW50IG51bUZyYW1lcykgPSAwOwogCkBAIC02MzksNyArNjQ0LDcgQEAKICAgICAgICAgcmV0dXJuIGdldFNhbXBsZVJhdGUoKSAvIDg7CiAgICAgfQogCi0gICAgdm9pZCBwcm9jZXNzKGZsb2F0ICppbnB1dERhdGEsIGludCBpbnB1dENoYW5uZWxDb3VudCwKKyAgICBwcm9jZXNzX3Jlc3VsdCBwcm9jZXNzKGZsb2F0ICppbnB1dERhdGEsIGludCBpbnB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgZmxvYXQgKm91dHB1dERhdGEsIGludCBvdXRwdXRDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgIGludCBudW1GcmFtZXMpIG92ZXJyaWRlIHsKICAgICAgICAgaW50IGNoYW5uZWxzVmFsaWQgPSBzdGQ6Om1pbihpbnB1dENoYW5uZWxDb3VudCwgb3V0cHV0Q2hhbm5lbENvdW50KTsKQEAgLTc1MCw2ICs3NTUsNyBAQAogCiAgICAgICAgIG1TdGF0ZSA9IG5leHRTdGF0ZTsKICAgICAgICAgbUxvb3BDb3VudGVyKys7CisgICAgICAgIHJldHVybiBQUk9DRVNTX1JFU1VMVF9PSzsKICAgICB9CiAKICAgICBpbnQgc2F2ZShjb25zdCBjaGFyICpmaWxlTmFtZSkgb3ZlcnJpZGUgewpAQCAtODk2LDkgKzkwMiwxMCBAQAogICAgICAqIEBwYXJhbSBpbnB1dERhdGEgY29udGFpbnMgbWljcm9waG9uZSBkYXRhIHdpdGggc2luZSBzaWduYWwgZmVlZGJhY2sKICAgICAgKiBAcGFyYW0gb3V0cHV0RGF0YSBjb250YWlucyB0aGUgcmVmZXJlbmNlIHNpbmUgd2F2ZQogICAgICAqLwotICAgIHZvaWQgcHJvY2VzcyhmbG9hdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsCisgICAgcHJvY2Vzc19yZXN1bHQgcHJvY2VzcyhmbG9hdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgIGZsb2F0ICpvdXRwdXREYXRhLCBpbnQgb3V0cHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICBpbnQgbnVtRnJhbWVzKSBvdmVycmlkZSB7CisgICAgICAgIHByb2Nlc3NfcmVzdWx0IHJlc3VsdCA9IFBST0NFU1NfUkVTVUxUX09LOwogICAgICAgICBtUHJvY2Vzc0NvdW50Kys7CiAKICAgICAgICAgZmxvYXQgcGVhayA9IG1lYXN1cmVQZWFrQW1wbGl0dWRlKGlucHV0RGF0YSwgaW5wdXRDaGFubmVsQ291bnQsIG51bUZyYW1lcyk7CkBAIC05NzgsNiArOTg1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbU1heEdsaXRjaERlbHRhID0gc3RkOjptYXgobU1heEdsaXRjaERlbHRhLCBhYnNEaWZmKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGFic0RpZmYgPiBtVG9sZXJhbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtR2xpdGNoQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFBST0NFU1NfUkVTVUxUX0dMSVRDSDsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCIlNWQ6IEdvdCBhIGdsaXRjaCAjICVkLCBwcmVkaWN0ZWQgPSAlZiwgYWN0dWFsID0gJWZcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBtRnJhbWVDb3VudGVyLCBtR2xpdGNoQ291bnQsIHByZWRpY3RlZCwgc2FtcGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0lNTVVORTsKQEAgLTEwMTgsNiArMTAyNiw3IEBACiAKICAgICAgICAgICAgIG1GcmFtZUNvdW50ZXIrKzsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIHZvaWQgcmVzZXRBY2N1bXVsYXRvcigpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9sb29wYmFjay5jcHAKaW5kZXggMmEwMmIyMC4uYzdjNDJlYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9sb29wYmFjay5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9sb29wYmFjay5jcHAKQEAgLTM0LDkgKzM0LDEzIEBACiAjaW5jbHVkZSAiQUF1ZGlvU2ltcGxlUmVjb3JkZXIuaCIKICNpbmNsdWRlICJBQXVkaW9FeGFtcGxlVXRpbHMuaCIKICNpbmNsdWRlICJMb29wYmFja0FuYWx5emVyLmgiCisjaW5jbHVkZSAiLi4vLi4vdXRpbHMvQUF1ZGlvRXhhbXBsZVV0aWxzLmgiCiAKLS8vIFYwLjQuMDAgPSByZWN0aWZ5IGFuZCBsb3ctcGFzcyBmaWx0ZXIgdGhlIGVjaG9zLCB1c2UgYXV0by1jb3JyZWxhdGlvbiBvbiBlbnRpcmUgZWNobwotI2RlZmluZSBBUFBfVkVSU0lPTiAgICAgICAgICAgICAiMC40LjAwIgorLy8gVjAuNC4wMCA9IHJlY3RpZnkgYW5kIGxvdy1wYXNzIGZpbHRlciB0aGUgZWNob3MsIGF1dG8tY29ycmVsYXRlIGVudGlyZSBlY2hvCisvLyBWMC40LjAxID0gYWRkIC1oIGhhbmcgb3B0aW9uCisvLyAgICAgICAgICAgZml4IC1uIG9wdGlvbiB0byBzZXQgb3V0cHV0IGJ1ZmZlciBmb3IgLXRtCisvLyAgICAgICAgICAgcGxvdCBmaXJzdCBnbGl0Y2gKKyNkZWZpbmUgQVBQX1ZFUlNJT04gICAgICAgICAgICAgIjAuNC4wMSIKIAogLy8gVGFnIGZvciBtYWNoaW5lIHJlYWRhYmxlIHJlc3VsdHMgYXMgcHJvcGVydHkgPSB2YWx1ZSBwYWlycwogI2RlZmluZSBSRVNVTFRfVEFHICAgICAgICAgICAgICAiUkVTVUxUOiAiCkBAIC00NywxMCArNTEsMTQgQEAKIGNvbnN0ZXhwciBpbnQga0xvZ1BlcmlvZE1pbGxpcyAgICAgICA9IDEwMDA7CiBjb25zdGV4cHIgaW50IGtOdW1JbnB1dENoYW5uZWxzICAgICAgPSAxOwogY29uc3RleHByIGludCBrTnVtQ2FsbGJhY2tzVG9EcmFpbiAgID0gMjA7Citjb25zdGV4cHIgaW50IGtOdW1DYWxsYmFja3NUb05vdFJlYWQgPSAwOyAvLyBsZXQgaW5wdXQgZmlsbCBiYWNrIHVwCiBjb25zdGV4cHIgaW50IGtOdW1DYWxsYmFja3NUb0Rpc2NhcmQgPSAyMDsKK2NvbnN0ZXhwciBpbnQga0RlZmF1bHRIYW5nVGltZU1pbGxpcyA9IDUwOworY29uc3RleHByIGludCBrTWF4R2xpdGNoRXZlbnRzVG9TYXZlID0gMzI7CiAKIHN0cnVjdCBMb29wYmFja0RhdGEgewogICAgIEFBdWRpb1N0cmVhbSAgICAgICppbnB1dFN0cmVhbSA9IG51bGxwdHI7CisgICAgQUF1ZGlvU3RyZWFtICAgICAgKm91dHB1dFN0cmVhbSA9IG51bGxwdHI7CiAgICAgaW50MzJfdCAgICAgICAgICAgIGlucHV0RnJhbWVzTWF4aW11bSA9IDA7CiAgICAgaW50MTZfdCAgICAgICAgICAgKmlucHV0U2hvcnREYXRhID0gbnVsbHB0cjsKICAgICBmbG9hdCAgICAgICAgICAgICAqaW5wdXRGbG9hdERhdGEgPSBudWxscHRyOwpAQCAtNTgsNiArNjYsNyBAQAogICAgIGludDMyX3QgICAgICAgICAgICBhY3R1YWxJbnB1dENoYW5uZWxDb3VudCA9IDA7CiAgICAgaW50MzJfdCAgICAgICAgICAgIGFjdHVhbE91dHB1dENoYW5uZWxDb3VudCA9IDA7CiAgICAgaW50MzJfdCAgICAgICAgICAgIG51bUNhbGxiYWNrc1RvRHJhaW4gPSBrTnVtQ2FsbGJhY2tzVG9EcmFpbjsKKyAgICBpbnQzMl90ICAgICAgICAgICAgbnVtQ2FsbGJhY2tzVG9Ob3RSZWFkID0ga051bUNhbGxiYWNrc1RvTm90UmVhZDsKICAgICBpbnQzMl90ICAgICAgICAgICAgbnVtQ2FsbGJhY2tzVG9EaXNjYXJkID0ga051bUNhbGxiYWNrc1RvRGlzY2FyZDsKICAgICBpbnQzMl90ICAgICAgICAgICAgbWluTnVtRnJhbWVzID0gSU5UMzJfTUFYOwogICAgIGludDMyX3QgICAgICAgICAgICBtYXhOdW1GcmFtZXMgPSAwOwpAQCAtNjUsNiArNzQsOSBAQAogICAgIGludDMyX3QgICAgICAgICAgICBpbnN1ZmZpY2llbnRSZWFkRnJhbWVzID0gMDsKICAgICBpbnQzMl90ICAgICAgICAgICAgZnJhbWVzUmVhZFRvdGFsID0gMDsKICAgICBpbnQzMl90ICAgICAgICAgICAgZnJhbWVzV3JpdHRlblRvdGFsID0gMDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgaGFuZ1BlcmlvZE1pbGxpcyA9IDUgKiAxMDAwOyAvLyB0aW1lIGJldHdlZW4gaGFuZ3MKKyAgICBpbnQzMl90ICAgICAgICAgICAgaGFuZ0NvdW50ZG93bkZyYW1lcyA9IDUgKiA0ODAwMDsgLy8gZnJhbWVzIHRpbCBuZXh0IGhhbmcKKyAgICBpbnQzMl90ICAgICAgICAgICAgaGFuZ1RpbWVNaWxsaXMgPSAwOyAvLyAwIGZvciBubyBoYW5nCiAgICAgYm9vbCAgICAgICAgICAgICAgIGlzRG9uZSA9IGZhbHNlOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90ICAgIGlucHV0RXJyb3IgPSBBQVVESU9fT0s7CkBAIC03NCw2ICs4NiwyOSBAQAogICAgIEVjaG9BbmFseXplciAgICAgICBlY2hvQW5hbHl6ZXI7CiAgICAgQXVkaW9SZWNvcmRpbmcgICAgIGF1ZGlvUmVjb3JkaW5nOwogICAgIExvb3BiYWNrUHJvY2Vzc29yICpsb29wYmFja1Byb2Nlc3NvcjsKKworICAgIGludDMyX3QgICAgICAgICAgICBnbGl0Y2hGcmFtZXNba01heEdsaXRjaEV2ZW50c1RvU2F2ZV07CisgICAgaW50MzJfdCAgICAgICAgICAgIG51bUdsaXRjaEV2ZW50cyA9IDA7CisKKyAgICB2b2lkIGhhbmdJZlJlcXVlc3RlZChpbnQzMl90IG51bUZyYW1lcykgeworICAgICAgICBpZiAoaGFuZ1RpbWVNaWxsaXMgPiAwKSB7CisgICAgICAgICAgICBoYW5nQ291bnRkb3duRnJhbWVzIC09IG51bUZyYW1lczsKKyAgICAgICAgICAgIGlmIChoYW5nQ291bnRkb3duRnJhbWVzIDw9IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHN0YXJ0TmFub3MgPSBnZXROYW5vc2Vjb25kcygpOworICAgICAgICAgICAgICAgIHVzbGVlcChoYW5nVGltZU1pbGxpcyAqIDEwMDApOworICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgZW5kTmFub3MgPSBnZXROYW5vc2Vjb25kcygpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZWxhcHNlZE1pY3JvcyA9IChpbnQzMl90KQorICAgICAgICAgICAgICAgICAgICAgICAgKChlbmROYW5vcyAtIHN0YXJ0TmFub3MpIC8gMTAwMCk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJjYWxsYmFjayBoYW5naW5nIGZvciAlZCBtaWxsaXMsIGFjdHVhbCA9ICVkIG1pY3Jvc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaGFuZ1RpbWVNaWxsaXMsIGVsYXBzZWRNaWNyb3MpOworICAgICAgICAgICAgICAgIGhhbmdDb3VudGRvd25GcmFtZXMgPSAoaW50NjRfdCkgaGFuZ1BlcmlvZE1pbGxpcworICAgICAgICAgICAgICAgICAgICAgICAgKiBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlUmF0ZShvdXRwdXRTdHJlYW0pCisgICAgICAgICAgICAgICAgICAgICAgICAvIDEwMDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgfQogfTsKIAogc3RhdGljIHZvaWQgY29udmVydFBjbTE2VG9GbG9hdChjb25zdCBpbnQxNl90ICpzb3VyY2UsCkBAIC0xMDUsOSArMTQwLDE0IEBACiAgICAgICAgIGFzc2VydChmYWxzZSk7CiAgICAgfQogICAgIGlmIChmcmFtZXNSZWFkIDwgMCkgewotICAgICAgICBteURhdGEtPmlucHV0RXJyb3IgPSBmcmFtZXNSZWFkOwotICAgICAgICBwcmludGYoIkVSUk9SIGluIHJlYWQgPSAlZCA9ICVzXG4iLCBmcmFtZXNSZWFkLAotICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQoZnJhbWVzUmVhZCkpOworICAgICAgICAvLyBFeHBlY3QgSU5WQUxJRF9TVEFURSBpZiBTVEFURV9TVEFSVElORworICAgICAgICBpZiAobXlEYXRhLT5mcmFtZXNSZWFkVG90YWwgPiAwKSB7CisgICAgICAgICAgICBteURhdGEtPmlucHV0RXJyb3IgPSBmcmFtZXNSZWFkOworICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiBpbiByZWFkID0gJWQgPSAlc1xuIiwgZnJhbWVzUmVhZCwKKyAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChmcmFtZXNSZWFkKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcmFtZXNSZWFkID0gMDsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIG15RGF0YS0+ZnJhbWVzUmVhZFRvdGFsICs9IGZyYW1lc1JlYWQ7CiAgICAgfQpAQCAtMTQ5LDggKzE4OSwxMCBAQAogICAgICAgICBpbnQzMl90IHRvdGFsRnJhbWVzUmVhZCA9IDA7CiAgICAgICAgIGRvIHsKICAgICAgICAgICAgIGFjdHVhbEZyYW1lc1JlYWQgPSByZWFkRm9ybWF0dGVkRGF0YShteURhdGEsIG51bUZyYW1lcyk7Ci0gICAgICAgICAgICBpZiAoYWN0dWFsRnJhbWVzUmVhZCkgeworICAgICAgICAgICAgaWYgKGFjdHVhbEZyYW1lc1JlYWQgPiAwKSB7CiAgICAgICAgICAgICAgICAgdG90YWxGcmFtZXNSZWFkICs9IGFjdHVhbEZyYW1lc1JlYWQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdHVhbEZyYW1lc1JlYWQgPCAwKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gSWdub3JlIGVycm9ycyBiZWNhdXNlIGlucHV0IHN0cmVhbSBtYXkgbm90IGJlIHN0YXJ0ZWQgeWV0LgogICAgICAgICB9IHdoaWxlIChhY3R1YWxGcmFtZXNSZWFkID4gMCk7CkBAIC0xNTksNiArMjAxLDkgQEAKICAgICAgICAgICAgIG15RGF0YS0+bnVtQ2FsbGJhY2tzVG9EcmFpbi0tOwogICAgICAgICB9CiAKKyAgICB9IGVsc2UgaWYgKG15RGF0YS0+bnVtQ2FsbGJhY2tzVG9Ob3RSZWFkID4gMCkgeworICAgICAgICAvLyBMZXQgdGhlIGlucHV0IGZpbGwgdXAgYSBiaXQgc28gd2UgYXJlIG5vdCBzbyBjbG9zZSB0byB0aGUgd3JpdGUgcG9pbnRlci4KKyAgICAgICAgbXlEYXRhLT5udW1DYWxsYmFja3NUb05vdFJlYWQtLTsKICAgICB9IGVsc2UgaWYgKG15RGF0YS0+bnVtQ2FsbGJhY2tzVG9EaXNjYXJkID4gMCkgewogICAgICAgICAvLyBJZ25vcmUuIEFsbG93IHRoZSBpbnB1dCB0byBmaWxsIGJhY2sgdXAgdG8gZXF1aWxpYnJpdW0gd2l0aCB0aGUgb3V0cHV0LgogICAgICAgICBhY3R1YWxGcmFtZXNSZWFkID0gcmVhZEZvcm1hdHRlZERhdGEobXlEYXRhLCBudW1GcmFtZXMpOwpAQCAtMTY4LDYgKzIxMyw3IEBACiAgICAgICAgIG15RGF0YS0+bnVtQ2FsbGJhY2tzVG9EaXNjYXJkLS07CiAKICAgICB9IGVsc2UgeworICAgICAgICBteURhdGEtPmhhbmdJZlJlcXVlc3RlZChudW1GcmFtZXMpOwogCiAgICAgICAgIGludDMyX3QgbnVtSW5wdXRCeXRlcyA9IG51bUZyYW1lcyAqIG15RGF0YS0+YWN0dWFsSW5wdXRDaGFubmVsQ291bnQgKiBzaXplb2YoZmxvYXQpOwogICAgICAgICBtZW1zZXQobXlEYXRhLT5pbnB1dEZsb2F0RGF0YSwgMCAvKiB2YWx1ZSAqLywgbnVtSW5wdXRCeXRlcyk7CkBAIC0xODQsNyArMjMwLDcgQEAKIAogICAgICAgICAgICAgaWYgKGFjdHVhbEZyYW1lc1JlYWQgPCBudW1GcmFtZXMpIHsKICAgICAgICAgICAgICAgICBpZihhY3R1YWxGcmFtZXNSZWFkIDwgKGludDMyX3QpIGZyYW1lc0F2YWlsYWJsZSkgewotICAgICAgICAgICAgICAgICAgICBwcmludGYoImluc3VmZmljaWVudCBidXQgbnVtRnJhbWVzID0gJWQiCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiaW5zdWZmaWNpZW50IGZvciBubyByZWFzb24sIG51bUZyYW1lcyA9ICVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBhY3R1YWxGcmFtZXNSZWFkID0gJWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGlucHV0RnJhbWVzV3JpdHRlbiA9ICVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBpbnB1dEZyYW1lc1JlYWQgPSAlZCIKQEAgLTIwNSwxNiArMjUxLDI1IEBACiAgICAgICAgICAgICBpZiAobXlEYXRhLT5hY3R1YWxJbnB1dEZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKICAgICAgICAgICAgICAgICBjb252ZXJ0UGNtMTZUb0Zsb2F0KG15RGF0YS0+aW5wdXRTaG9ydERhdGEsIG15RGF0YS0+aW5wdXRGbG9hdERhdGEsIG51bVNhbXBsZXMpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gU2F2ZSBmb3IgbGF0ZXIuCi0gICAgICAgICAgICBteURhdGEtPmF1ZGlvUmVjb3JkaW5nLndyaXRlKG15RGF0YS0+aW5wdXRGbG9hdERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15RGF0YS0+YWN0dWFsSW5wdXRDaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcyk7CisKICAgICAgICAgICAgIC8vIEFuYWx5emUgdGhlIGRhdGEuCi0gICAgICAgICAgICBteURhdGEtPmxvb3BiYWNrUHJvY2Vzc29yLT5wcm9jZXNzKG15RGF0YS0+aW5wdXRGbG9hdERhdGEsCisgICAgICAgICAgICBMb29wYmFja1Byb2Nlc3Nvcjo6cHJvY2Vzc19yZXN1bHQgcHJvY1Jlc3VsdCA9IG15RGF0YS0+bG9vcGJhY2tQcm9jZXNzb3ItPnByb2Nlc3MobXlEYXRhLT5pbnB1dEZsb2F0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlEYXRhLT5hY3R1YWxJbnB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlEYXRhLT5hY3R1YWxPdXRwdXRDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcyk7CisKKyAgICAgICAgICAgIGlmIChwcm9jUmVzdWx0ID09IExvb3BiYWNrUHJvY2Vzc29yOjpQUk9DRVNTX1JFU1VMVF9HTElUQ0gpIHsKKyAgICAgICAgICAgICAgICBpZiAobXlEYXRhLT5udW1HbGl0Y2hFdmVudHMgPCBrTWF4R2xpdGNoRXZlbnRzVG9TYXZlKSB7CisgICAgICAgICAgICAgICAgICAgIG15RGF0YS0+Z2xpdGNoRnJhbWVzW215RGF0YS0+bnVtR2xpdGNoRXZlbnRzKytdID0gbXlEYXRhLT5hdWRpb1JlY29yZGluZy5zaXplKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTYXZlIGZvciBsYXRlci4KKyAgICAgICAgICAgIG15RGF0YS0+YXVkaW9SZWNvcmRpbmcud3JpdGUobXlEYXRhLT5pbnB1dEZsb2F0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlEYXRhLT5hY3R1YWxJbnB1dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsRnJhbWVzUmVhZCk7CisKICAgICAgICAgICAgIG15RGF0YS0+aXNEb25lID0gbXlEYXRhLT5sb29wYmFja1Byb2Nlc3Nvci0+aXNEb25lKCk7CiAgICAgICAgICAgICBpZiAobXlEYXRhLT5pc0RvbmUpIHsKICAgICAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7CkBAIC0yNDAsOCArMjk1LDEwIEBACiAgICAgQUF1ZGlvQXJnc1BhcnNlcjo6dXNhZ2UoKTsKICAgICBwcmludGYoIiAgICAgIC1Ce2ZyYW1lc30gICAgICAgIGlucHV0IGNhcGFjaXR5IGluIGZyYW1lc1xuIik7CiAgICAgcHJpbnRmKCIgICAgICAtQ3tjaGFubmVsc30gICAgICBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHNcbiIpOworICAgIHByaW50ZigiICAgICAgLUR7ZGV2aWNlSWR9ICAgICAgaW5wdXQgZGV2aWNlIElEXG4iKTsKICAgICBwcmludGYoIiAgICAgIC1GezAsMSwyfSAgICAgICAgIGlucHV0IGZvcm1hdCwgMT1JMTYsIDI9RkxPQVRcbiIpOwogICAgIHByaW50ZigiICAgICAgLWd7Z2Fpbn0gICAgICAgICAgcmVjaXJjdWxhdGluZyBsb29wYmFjayBnYWluXG4iKTsKKyAgICBwcmludGYoIiAgICAgIC1oe2hhbmdNaWxsaXN9ICAgIG9jY2FzaW9uYWxseSBoYW5nIGluIHRoZSBjYWxsYmFja1xuIik7CiAgICAgcHJpbnRmKCIgICAgICAtUHtpblBlcmZ9ICAgICAgICBzZXQgaW5wdXQgQUFVRElPX1BFUkZPUk1BTkNFX01PREUqXG4iKTsKICAgICBwcmludGYoIiAgICAgICAgICBuIGZvciBfTk9ORVxuIik7CiAgICAgcHJpbnRmKCIgICAgICAgICAgbCBmb3IgX0xBVEVOQ1lcbiIpOwpAQCAtMzAwLDkgKzM1Nyw3IEBACiAgICAgcmV0dXJuIHRlc3RNb2RlOwogfQogCi12b2lkIHByaW50QXVkaW9HcmFwaChBdWRpb1JlY29yZGluZyAmcmVjb3JkaW5nLCBpbnQgbnVtU2FtcGxlcykgewotICAgIGludDMyX3Qgc3RhcnQgPSByZWNvcmRpbmcuc2l6ZSgpIC8gMjsKLSAgICBpbnQzMl90IGVuZCA9IHN0YXJ0ICsgbnVtU2FtcGxlczsKK3ZvaWQgcHJpbnRBdWRpb0dyYXBoUmVnaW9uKEF1ZGlvUmVjb3JkaW5nICZyZWNvcmRpbmcsIGludDMyX3Qgc3RhcnQsIGludDMyX3QgZW5kKSB7CiAgICAgaWYgKGVuZCA+PSByZWNvcmRpbmcuc2l6ZSgpKSB7CiAgICAgICAgIGVuZCA9IHJlY29yZGluZy5zaXplKCkgLSAxOwogICAgIH0KQEAgLTMzOSwxMyArMzk0LDE0IEBACiAgICAgQUF1ZGlvU3RyZWFtICAgICAgICAgKm91dHB1dFN0cmVhbSAgICAgICAgICAgICAgID0gbnVsbHB0cjsKIAogICAgIGFhdWRpb19yZXN1bHRfdCAgICAgICByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgIHJlcXVlc3RlZElucHV0RGV2aWNlSWQgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCByZXF1ZXN0ZWRJbnB1dFNoYXJpbmdNb2RlICA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwogICAgIGludCAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRJbnB1dENoYW5uZWxDb3VudCA9IGtOdW1JbnB1dENoYW5uZWxzOwogICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICByZXF1ZXN0ZWRJbnB1dEZvcm1hdCAgICAgICA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgIHJlcXVlc3RlZElucHV0Q2FwYWNpdHkgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgaW5wdXRQZXJmb3JtYW5jZUxldmVsICA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZOwogCi0gICAgaW50MzJfdCAgICAgICAgICAgICAgIG91dHB1dEZyYW1lc1BlckJ1cnN0ID0gMDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgb3V0cHV0RnJhbWVzUGVyQnVyc3QgICAgICAgPSAwOwogCiAgICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgIGFjdHVhbE91dHB1dEZvcm1hdCAgICAgICAgID0gQUFVRElPX0ZPUk1BVF9JTlZBTElEOwogICAgIGludDMyX3QgICAgICAgICAgICAgICBhY3R1YWxTYW1wbGVSYXRlICAgICAgICAgICA9IDA7CkBAIC0zNTMsNiArNDA5LDcgQEAKIAogICAgIGludCAgICAgICAgICAgICAgICAgICB0ZXN0TW9kZSAgICAgICAgICAgICAgICAgICA9IFRFU1RfRUNIT19MQVRFTkNZOwogICAgIGRvdWJsZSAgICAgICAgICAgICAgICBnYWluICAgICAgICAgICAgICAgICAgICAgICA9IDEuMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgaGFuZ1RpbWVNaWxsaXMgICAgICAgICAgICAgPSAwOwogCiAgICAgLy8gTWFrZSBwcmludGYgcHJpbnQgaW1tZWRpYXRlbHkgc28gdGhhdCBkZWJ1ZyBpbmZvIGlzIG5vdCBzdHVjawogICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCkBAIC0zNzYsMTIgKzQzMywyNCBAQAogICAgICAgICAgICAgICAgICAgICBjYXNlICdDJzoKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZElucHV0Q2hhbm5lbENvdW50ID0gYXRvaSgmYXJnWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdEJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZElucHV0RGV2aWNlSWQgPSBhdG9pKCZhcmdbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0YnOgogICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkSW5wdXRGb3JtYXQgPSBhdG9pKCZhcmdbMl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2cnOgogICAgICAgICAgICAgICAgICAgICAgICAgZ2FpbiA9IGF0b2YoJmFyZ1syXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXYXMgdGhlcmUgYSBudW1iZXIgYWZ0ZXIgdGhlICItaCI/CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnWzJdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZ1RpbWVNaWxsaXMgPSBhdG9pKCZhcmdbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBubyBudW1iZXIgdGhlbiB1c2UgdGhlIGRlZmF1bHQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZ1RpbWVNaWxsaXMgPSBrRGVmYXVsdEhhbmdUaW1lTWlsbGlzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1AnOgogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQZXJmb3JtYW5jZUxldmVsID0gcGFyc2VQZXJmb3JtYW5jZU1vZGUoYXJnWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNDE1LDYgKzQ4NCw4IEBACiAgICAgaW50MzJfdCB0aW1lTWlsbGlzID0gMDsKICAgICBpbnQzMl90IHJlY29yZGluZ0R1cmF0aW9uID0gc3RkOjptaW4oNjAgKiA1LCByZXF1ZXN0ZWREdXJhdGlvbik7CiAKKyAgICBpbnQzMl90IHJlcXVlc3RlZE91dHB1dEJ1cnN0cyA9IGFyZ1BhcnNlci5nZXROdW1iZXJPZkJ1cnN0cygpOworCiAgICAgc3dpdGNoKHRlc3RNb2RlKSB7CiAgICAgICAgIGNhc2UgVEVTVF9TSU5FX01BR05JVFVERToKICAgICAgICAgICAgIGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3NvciA9ICZsb29wYmFja0RhdGEuc2luZUFuYWx5emVyOwpAQCAtNDQ2LDcgKzUxNyw3IEBACiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSAgcGxheWVyLm9wZW4oKSByZXR1cm5lZCAlZFxuIiwgcmVzdWx0KTsKICAgICAgICAgZXhpdCgxKTsKICAgICB9Ci0gICAgb3V0cHV0U3RyZWFtID0gcGxheWVyLmdldFN0cmVhbSgpOworICAgIG91dHB1dFN0cmVhbSA9IGxvb3BiYWNrRGF0YS5vdXRwdXRTdHJlYW0gPSBwbGF5ZXIuZ2V0U3RyZWFtKCk7CiAKICAgICBhY3R1YWxPdXRwdXRGb3JtYXQgPSBBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KG91dHB1dFN0cmVhbSk7CiAgICAgaWYgKGFjdHVhbE91dHB1dEZvcm1hdCAhPSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewpAQCAtNDYzLDYgKzUzNCw3IEBACiAKICAgICBwcmludGYoIklOUFVUICBzdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICAgLy8gVXNlIGRpZmZlcmVudCBwYXJhbWV0ZXJzIGZvciB0aGUgaW5wdXQuCisgICAgYXJnUGFyc2VyLnNldERldmljZUlkKHJlcXVlc3RlZElucHV0RGV2aWNlSWQpOwogICAgIGFyZ1BhcnNlci5zZXROdW1iZXJPZkJ1cnN0cyhBQVVESU9fVU5TUEVDSUZJRUQpOwogICAgIGFyZ1BhcnNlci5zZXRGb3JtYXQocmVxdWVzdGVkSW5wdXRGb3JtYXQpOwogICAgIGFyZ1BhcnNlci5zZXRQZXJmb3JtYW5jZU1vZGUoaW5wdXRQZXJmb3JtYW5jZUxldmVsKTsKQEAgLTQ4MiwyNCArNTU0LDI5IEBACiAKICAgICB7CiAgICAgICAgIGludDMyX3QgYWN0dWFsQ2FwYWNpdHkgPSBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhpbnB1dFN0cmVhbSk7Ci0gICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoaW5wdXRTdHJlYW0sIGFjdHVhbENhcGFjaXR5KTsKLSAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSAgQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcygpIHJldHVybmVkICVkXG4iLCByZXN1bHQpOwotICAgICAgICAgICAgZ290byBmaW5pc2g7Ci0gICAgICAgIH0gZWxzZSB7fQotICAgIH0KKyAgICAgICAgKHZvaWQpIEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoaW5wdXRTdHJlYW0sIGFjdHVhbENhcGFjaXR5KTsKIAotICAgIGFyZ1BhcnNlci5jb21wYXJlV2l0aFN0cmVhbShpbnB1dFN0cmVhbSk7CisgICAgICAgIGlmICh0ZXN0TW9kZSA9PSBURVNUX1NJTkVfTUFHTklUVURFCisgICAgICAgICAgICAgICAgJiYgcmVxdWVzdGVkT3V0cHV0QnVyc3RzID09IEFBVURJT19VTlNQRUNJRklFRCkgeworICAgICAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhvdXRwdXRTdHJlYW0sIGFjdHVhbENhcGFjaXR5KTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtICBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKG91dHB1dCkgcmV0dXJuZWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIk91dHB1dCBidWZmZXIgc2l6ZSBzZXQgdG8gbWF0Y2ggaW5wdXQgY2FwYWNpdHkgPSAlZCBmcmFtZXMhXG4iLCByZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLSAgICAvLyBJZiB0aGUgaW5wdXQgc3RyZWFtIGlzIHRvbyBzbWFsbCB0aGVuIHdlIGNhbm5vdCBzYXRpc2Z5IHRoZSBvdXRwdXQgY2FsbGJhY2suCi0gICAgewotICAgICAgICBpbnQzMl90IGFjdHVhbENhcGFjaXR5ID0gQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoaW5wdXRTdHJlYW0pOworICAgICAgICAvLyBJZiB0aGUgaW5wdXQgc3RyZWFtIGlzIHRvbyBzbWFsbCB0aGVuIHdlIGNhbm5vdCBzYXRpc2Z5IHRoZSBvdXRwdXQgY2FsbGJhY2suCiAgICAgICAgIGlmIChhY3R1YWxDYXBhY2l0eSA8IDIgKiBvdXRwdXRGcmFtZXNQZXJCdXJzdCkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtIGlucHV0IGNhcGFjaXR5IDwgMiAqIG91dHB1dEZyYW1lc1BlckJ1cnN0XG4iKTsKICAgICAgICAgICAgIGdvdG8gZmluaXNoOwogICAgICAgICB9CiAgICAgfQogCisgICAgYXJnUGFyc2VyLmNvbXBhcmVXaXRoU3RyZWFtKGlucHV0U3RyZWFtKTsKKwogICAgIC8vIC0tLS0tLS0gU2V0dXAgbG9vcGJhY2tEYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgbG9vcGJhY2tEYXRhLmFjdHVhbElucHV0Rm9ybWF0ID0gQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChpbnB1dFN0cmVhbSk7CiAKQEAgLTUxOCw2ICs1OTUsOCBAQAogCiAgICAgbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5yZXNldCgpOwogCisgICAgbG9vcGJhY2tEYXRhLmhhbmdUaW1lTWlsbGlzID0gaGFuZ1RpbWVNaWxsaXM7CisKICAgICAvLyBTdGFydCBPVVRQVVQgZmlyc3Qgc28gSU5QVVQgZG9lcyBub3Qgb3ZlcmZsb3cuCiAgICAgcmVzdWx0ID0gcGxheWVyLnN0YXJ0KCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKQEAgLTYwNCw3ICs2ODMsMTcgQEAKIAogICAgIGlmIChsb29wYmFja0RhdGEuaW5wdXRFcnJvciA9PSBBQVVESU9fT0spIHsKICAgICAgICAgaWYgKHRlc3RNb2RlID09IFRFU1RfU0lORV9NQUdOSVRVREUpIHsKLSAgICAgICAgICAgIHByaW50QXVkaW9HcmFwaChsb29wYmFja0RhdGEuYXVkaW9SZWNvcmRpbmcsIDIwMCk7CisgICAgICAgICAgICBpZiAobG9vcGJhY2tEYXRhLm51bUdsaXRjaEV2ZW50cyA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBHcmFwaCBhcm91bmQgdGhlIGZpcnN0IGdsaXRjaCBpZiB0aGVyZSBpcyBvbmUuCisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzdGFydCA9IGxvb3BiYWNrRGF0YS5nbGl0Y2hGcmFtZXNbMF0gLSA4OworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZW5kID0gc3RhcnQgKyBvdXRwdXRGcmFtZXNQZXJCdXJzdCArIDggKyA4OworICAgICAgICAgICAgICAgIHByaW50QXVkaW9HcmFwaFJlZ2lvbihsb29wYmFja0RhdGEuYXVkaW9SZWNvcmRpbmcsIHN0YXJ0LCBlbmQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBPciBncmFwaCB0aGUgbWlkZGxlIG9mIHRoZSBzaWduYWwuCisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzdGFydCA9IGxvb3BiYWNrRGF0YS5hdWRpb1JlY29yZGluZy5zaXplKCkgLyAyOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZW5kID0gc3RhcnQgKyAyMDA7CisgICAgICAgICAgICAgICAgcHJpbnRBdWRpb0dyYXBoUmVnaW9uKGxvb3BiYWNrRGF0YS5hdWRpb1JlY29yZGluZywgc3RhcnQsIGVuZCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPnJlcG9ydCgpOwpAQCAtNjU0LDYgKzc0MywxMSBAQAogICAgIGRlbGV0ZVtdIGxvb3BiYWNrRGF0YS5pbnB1dFNob3J0RGF0YTsKIAogcmVwb3J0X3Jlc3VsdDoKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9vcGJhY2tEYXRhLm51bUdsaXRjaEV2ZW50czsgaSsrKSB7CisgICAgICAgIHByaW50ZigiICBnbGl0Y2ggYXQgZnJhbWUgJWRcbiIsIGxvb3BiYWNrRGF0YS5nbGl0Y2hGcmFtZXNbaV0pOworICAgIH0KKwogICAgIHdyaXR0ZW4gPSBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPnNhdmUoRklMRU5BTUVfUFJPQ0VTU0VEKTsKICAgICBpZiAod3JpdHRlbiA+IDApIHsKICAgICAgICAgcHJpbnRmKCJtYWluKCkgd3JvdGUgJThkIHByb2Nlc3NlZCBzYW1wbGVzIHRvIFwiJXNcIiBvbiBBbmRyb2lkIGRldmljZVxuIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvQXJnc1BhcnNlci5oCmluZGV4IGEyYjkxNzcuLmY1ZWQ3YWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaApAQCAtMTMwLDEyICsxMzAsMTAgQEAKICAgICB9CiAKICAgICBpbnQzMl90IGdldEJ1ZmZlckNhcGFjaXR5KCkgY29uc3QgewotICAgICAgICBwcmludGYoIiVzKCkgcmV0dXJucyAlZFxuIiwgX19mdW5jX18sIG1CdWZmZXJDYXBhY2l0eSk7CiAgICAgICAgIHJldHVybiBtQnVmZmVyQ2FwYWNpdHk7CiAgICAgfQogCiAgICAgdm9pZCBzZXRCdWZmZXJDYXBhY2l0eShpbnQzMl90IGZyYW1lcykgewotICAgICAgICBwcmludGYoIiVzKCVkKVxuIiwgX19mdW5jX18sIGZyYW1lcyk7CiAgICAgICAgIG1CdWZmZXJDYXBhY2l0eSA9IGZyYW1lczsKICAgICB9CiAKQEAgLTI4Myw3ICsyODEsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKGFyZykgPiAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3kgPSBhdG9pKCZhcmdbMl0pOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghQUF1ZGlvX3NldE1NYXBQb2xpY3kocG9saWN5KSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoQUF1ZGlvX3NldE1NYXBQb2xpY3kocG9saWN5KSAhPSBBQVVESU9fT0spIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1I6IGludmFsaWQgTU1BUCBwb2xpY3kgbW9kZSAlaVxuIiwgcG9saWN5KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmgKaW5kZXggMTY0NTk4Ni4uNDM3M2ZhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaApAQCAtMzIsOCArMzIsNiBAQAogCiAvLyBBcmJpdHJhcnkgcGVyaW9kIGZvciBnbGl0Y2hlcwogI2RlZmluZSBGT1JDRURfVU5ERVJSVU5fUEVSSU9EX0ZSQU1FUyAgICAoMiAqIDQ4MDAwKQotLy8gSG93IGxvbmcgdG8gc2xlZXAgaW4gYSBjYWxsYmFjayB0byBjYXVzZSBhbiBpbnRlbnRpb25hbCBnbGl0Y2guIEZvciB0ZXN0aW5nLgotI2RlZmluZSBGT1JDRURfVU5ERVJSVU5fU0xFRVBfTUlDUk9TICAgICAoMTAgKiAxMDAwKQogCiAjZGVmaW5lIE1BWF9USU1FU1RBTVBTICAgICAgICAgICAgICAgICAgIDE2CiAKQEAgLTI3NSw3ICsyNzMsNyBAQAogCiAgICAgaW50ICAgICAgICAgICAgICAgIHNjaGVkdWxlciA9IDA7CiAgICAgYm9vbCAgICAgICAgICAgICAgIHNjaGVkdWxlckNoZWNrZWQgPSBmYWxzZTsKLSAgICBib29sICAgICAgICAgICAgICAgZm9yY2VVbmRlcnJ1bnMgPSBmYWxzZTsKKyAgICBpbnQzMl90ICAgICAgICAgICAgaGFuZ1RpbWVNU2VjID0gMDsKIAogICAgIEFBdWRpb1NpbXBsZVBsYXllciBzaW1wbGVQbGF5ZXI7CiAgICAgaW50MzJfdCAgICAgICAgICAgIGNhbGxiYWNrQ291bnQgPSAwOwpAQCAtMzI3LDEwICszMjUsMTIgQEAKICAgICAgICAgc2luZURhdGEtPnNldHVwU2luZVN3ZWVwcygpOwogICAgIH0KIAotICAgIGlmIChzaW5lRGF0YS0+Zm9yY2VVbmRlcnJ1bnMpIHsKKyAgICBpZiAoc2luZURhdGEtPmhhbmdUaW1lTVNlYyA+IDApIHsKICAgICAgICAgaWYgKHNpbmVEYXRhLT5mcmFtZXNUb3RhbCA+IHNpbmVEYXRhLT5uZXh0RnJhbWVUb0dsaXRjaCkgewotICAgICAgICAgICAgdXNsZWVwKEZPUkNFRF9VTkRFUlJVTl9TTEVFUF9NSUNST1MpOwotICAgICAgICAgICAgcHJpbnRmKCJTaW11bGF0ZSBnbGl0Y2ggYXQgJWxsZFxuIiwgKGxvbmcgbG9uZykgc2luZURhdGEtPmZyYW1lc1RvdGFsKTsKKyAgICAgICAgICAgIHVzbGVlcChzaW5lRGF0YS0+aGFuZ1RpbWVNU2VjICogMTAwMCk7CisgICAgICAgICAgICBwcmludGYoIkhhbmcgY2FsbGJhY2sgYXQgJWxsZCBmcmFtZXMgZm9yICVkIG1zZWNcbiIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHNpbmVEYXRhLT5mcmFtZXNUb3RhbCwKKyAgICAgICAgICAgICAgICAgICBzaW5lRGF0YS0+aGFuZ1RpbWVNU2VjKTsKICAgICAgICAgICAgIHNpbmVEYXRhLT5uZXh0RnJhbWVUb0dsaXRjaCArPSBGT1JDRURfVU5ERVJSVU5fUEVSSU9EX0ZSQU1FUzsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMWJkNDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYyBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMKLQotIyBOREsgcmVjb21tZW5kcyB1c2luZyB0aGlzIGtpbmQgb2YgcmVsYXRpdmUgcGF0aCBpbnN0ZWFkIG9mIGFuIGFic29sdXRlIHBhdGguCi1MT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvd3JpdGVfc2luZS5jcHAKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwotTE9DQUxfTU9EVUxFIDo9IHdyaXRlX3NpbmUKLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscwotCi1MT0NBTF9TUkNfRklMRVM6PSAuLi9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmFhdWRpbwotTE9DQUxfTU9EVUxFIDo9IHdyaXRlX3NpbmVfY2FsbGJhY2sKLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBsaWJhYXVkaW9fcHJlYnVpbHQKLUxPQ0FMX1NSQ19GSUxFUyA6PSBsaWJhYXVkaW8uc28KLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvaW5jbHVkZQotaW5jbHVkZSAkKFBSRUJVSUxUX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FwcGxpY2F0aW9uLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvam5pL0FwcGxpY2F0aW9uLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTQ0ZjM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BcHBsaWNhdGlvbi5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUFQUF9DUFBGTEFHUyArPSAtc3RkPWMrKzExCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKaW5kZXggN2E0ODE1My4uMmIwNWYxMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcApAQCAtMjYsMTEgKzI2LDE0IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKwogI2luY2x1ZGUgIkFBdWRpb0V4YW1wbGVVdGlscy5oIgogI2luY2x1ZGUgIkFBdWRpb1NpbXBsZVBsYXllci5oIgogI2luY2x1ZGUgIkFBdWRpb0FyZ3NQYXJzZXIuaCIKIAotI2RlZmluZSBBUFBfVkVSU0lPTiAgIjAuMS41IgorI2RlZmluZSBBUFBfVkVSU0lPTiAgIjAuMS42IgorCitjb25zdGV4cHIgaW50MzJfdCBrRGVmYXVsdEhhbmdUaW1lTVNlYyA9IDEwOwogCiAvKioKICAqIE9wZW4gc3RyZWFtLCBwbGF5IHNvbWUgc2luZSB3YXZlcywgdGhlbiBjbG9zZSB0aGUgc3RyZWFtLgpAQCAtNDEsNyArNDQsNyBAQAogc3RhdGljIGFhdWRpb19yZXN1bHRfdCB0ZXN0T3BlblBsYXlDbG9zZShBQXVkaW9BcmdzUGFyc2VyICZhcmdQYXJzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbG9vcENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByZWZpeFRvbmVNc2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlVW5kZXJydW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhhbmdUaW1lTVNlYykKIHsKICAgICBTaW5lVGhyZWFkZWREYXRhX3QgbXlEYXRhOwogICAgIEFBdWRpb1NpbXBsZVBsYXllciAmcGxheWVyID0gbXlEYXRhLnNpbXBsZVBsYXllcjsKQEAgLTUzLDEwICs1NiwxMiBAQAogICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcnVuIGNvbXBsZXRlIHRlc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogICAgIG15RGF0YS5zY2hlZHVsZXJDaGVja2VkID0gZmFsc2U7CiAgICAgbXlEYXRhLmNhbGxiYWNrQ291bnQgPSAwOwotICAgIG15RGF0YS5mb3JjZVVuZGVycnVucyA9IGZvcmNlVW5kZXJydW5zOyAvLyB0ZXN0IEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQoKQorICAgIG15RGF0YS5oYW5nVGltZU1TZWMgPSBoYW5nVGltZU1TZWM7IC8vIHRlc3QgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudCgpCiAKICAgICByZXN1bHQgPSBwbGF5ZXIub3BlbihhcmdQYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxlUGxheWVyRGF0YUNhbGxiYWNrUHJvYywgU2ltcGxlUGxheWVyRXJyb3JDYWxsYmFja1Byb2MsICZteURhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZVBsYXllckRhdGFDYWxsYmFja1Byb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxlUGxheWVyRXJyb3JDYWxsYmFja1Byb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm15RGF0YSk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtICBwbGF5ZXIub3BlbigpIHJldHVybmVkICVzXG4iLAogICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwpAQCAtMTE1LDEyICsxMjAsMTcgQEAKICAgICAgICAgICAgIGludDY0X3QgbWlsbGlzID0KICAgICAgICAgICAgICAgICAgICAgKGdldE5hbm9zZWNvbmRzKENMT0NLX01PTk9UT05JQykgLSBzdGFydGVkQXROYW5vcykgLyBOQU5PU19QRVJfTUlMTElTRUNPTkQ7CiAgICAgICAgICAgICByZXN1bHQgPSBteURhdGEud2FrZXIuZ2V0KCk7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IGZyYW1lc1dyaXR0ZW4gPSAoaW50MzJfdCkgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4ocGxheWVyLmdldFN0cmVhbSgpKTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZnJhbWVzUmVhZCA9IChpbnQzMl90KSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChwbGF5ZXIuZ2V0U3RyZWFtKCkpOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB4cnVucyA9IEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQocGxheWVyLmdldFN0cmVhbSgpKTsKICAgICAgICAgICAgIHByaW50ZigiIHdha2VyIHJlc3VsdCA9ICVkLCBhdCAlNmQgbWlsbGlzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgc2Vjb25kID0gJTNkLCBmcmFtZXNXcml0dGVuID0gJThkLCB1bmRlcnJ1bnMgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIHNlY29uZCA9ICUzZCwgZnJhbWVzIHdyaXR0ZW4gJThkIC0gcmVhZCAlOGQgPSAlOGQsIHVuZGVycnVucyA9ICVkXG4iLAogICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgKGludCkgbWlsbGlzLAogICAgICAgICAgICAgICAgICAgIHNlY29uZCwKLSAgICAgICAgICAgICAgICAgICAoaW50KSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihwbGF5ZXIuZ2V0U3RyZWFtKCkpLAotICAgICAgICAgICAgICAgICAgIChpbnQpIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQocGxheWVyLmdldFN0cmVhbSgpKSk7CisgICAgICAgICAgICAgICAgICAgZnJhbWVzV3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICBmcmFtZXNSZWFkLAorICAgICAgICAgICAgICAgICAgIGZyYW1lc1dyaXR0ZW4gLSBmcmFtZXNSZWFkLAorICAgICAgICAgICAgICAgICAgIHhydW5zKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgICAgICAgICAgZGlzY29ubmVjdGVkID0gKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEKTsKICAgICAgICAgICAgICAgICBiYWlsT3V0ID0gdHJ1ZTsKQEAgLTIxMCw3ICsyMjAsOSBAQAogICAgIEFBdWRpb0FyZ3NQYXJzZXI6OnVzYWdlKCk7CiAgICAgcHJpbnRmKCIgICAgICAtbHtjb3VudH0gbG9vcENvdW50IHN0YXJ0L3N0b3AsIGV2ZXJ5IG90aGVyIG9uZSBpcyBzaWxlbnRcbiIpOwogICAgIHByaW50ZigiICAgICAgLXR7bXNlY30gIHBsYXkgYSBoaWdoIHBpdGNoZWQgdG9uZSBhdCB0aGUgYmVnaW5uaW5nXG4iKTsKLSAgICBwcmludGYoIiAgICAgIC16ICAgICAgICBmb3JjZSBwZXJpb2RpYyB1bmRlcnJ1bnMgYnkgc2xlZXBpbmcgaW4gY2FsbGJhY2tcbiIpOworICAgIHByaW50ZigiICAgICAgLWh7bXNlY30gIGZvcmNlIHBlcmlvZGljIHVuZGVycnVucyBieSBoYW5naW5nIGluIGNhbGxiYWNrXG4iKTsKKyAgICBwcmludGYoIiAgICAgICAgICAgICAgICBJZiBubyB2YWx1ZSBzcGVjaWZpZWQgdGhlbiAlZCB1c2VkLlxuIiwKKyAgICAgICAgICAgIGtEZWZhdWx0SGFuZ1RpbWVNU2VjKTsKIH0KIAogaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQpAQCAtMjE5LDEzICsyMzEsMTQgQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgICAgcmVzdWx0OwogICAgIGludDMyX3QgICAgICAgICAgICBsb29wQ291bnQgPSAxOwogICAgIGludDMyX3QgICAgICAgICAgICBwcmVmaXhUb25lTXNlYyA9IDA7Ci0gICAgYm9vbCAgICAgICAgICAgICAgIGZvcmNlVW5kZXJydW5zID0gZmFsc2U7CisgICAgaW50MzJfdCAgICAgICAgICAgIGhhbmdUaW1lTVNlYyA9IDA7CiAKICAgICAvLyBNYWtlIHByaW50ZiBwcmludCBpbW1lZGlhdGVseSBzbyB0aGF0IGRlYnVnIGluZm8gaXMgbm90IHN0dWNrCiAgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KICAgICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTkJGLCAoc2l6ZV90KSAwKTsKIAotICAgIHByaW50ZigiJXMgLSBQbGF5IGEgc2luZSBzd2VlcCB1c2luZyBhbiBBQXVkaW8gY2FsbGJhY2sgViVzXG4iLCBhcmd2WzBdLCBBUFBfVkVSU0lPTik7CisgICAgcHJpbnRmKCIlcyAtIFBsYXkgYSBzaW5lIHN3ZWVwIHVzaW5nIGFuIEFBdWRpbyBjYWxsYmFjayBWJXNcbiIsCisgICAgICAgIGFyZ3ZbMF0sIEFQUF9WRVJTSU9OKTsKIAogICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CkBAIC0yNDAsOCArMjUzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgogICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4VG9uZU1zZWMgPSBhdG9pKCZhcmdbMl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3onOgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VVbmRlcnJ1bnMgPSB0cnVlOyAgLy8gWnp6enp6egorICAgICAgICAgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmdUaW1lTVNlYyA9IChhcmdbMl0pIC8vIHZhbHVlIHNwZWNpZmllZD8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhdG9pKCZhcmdbMl0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoga0RlZmF1bHRIYW5nVGltZU1TZWM7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlKCk7CkBAIC0yNTcsNyArMjcyLDggQEAKICAgICB9CiAKICAgICAvLyBLZWVwIGxvb3BpbmcgdW50aWwgd2UgY2FuIGNvbXBsZXRlIHRoZSB0ZXN0IHdpdGhvdXQgZGlzY29ubmVjdGluZy4KLSAgICB3aGlsZSgocmVzdWx0ID0gdGVzdE9wZW5QbGF5Q2xvc2UoYXJnUGFyc2VyLCBsb29wQ291bnQsIHByZWZpeFRvbmVNc2VjLCBmb3JjZVVuZGVycnVucykpCisgICAgd2hpbGUoKHJlc3VsdCA9IHRlc3RPcGVuUGxheUNsb3NlKGFyZ1BhcnNlciwgbG9vcENvdW50LAorICAgICAgICAgICAgcHJlZml4VG9uZU1zZWMsIGhhbmdUaW1lTVNlYykpCiAgICAgICAgICAgICA9PSBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEKTsKIAogICAgIHJldHVybiAocmVzdWx0KSA/IEVYSVRfRkFJTFVSRSA6IEVYSVRfU1VDQ0VTUzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaCBiL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaAppbmRleCAxNDkzYjI2Li44ZTM2Yzc3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCkBAIC0zNzMsNiArMzczLDEzIEBACiAgICAgICogc28gdGhlIHJlY29yZGVkIHZvbHVtZSBtYXkgYmUgdmVyeSBsb3cuCiAgICAgICovCiAgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9VTlBST0NFU1NFRCA9IDksCisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhpcyBwcmVzZXQgZm9yIGNhcHR1cmluZyBhdWRpbyBtZWFudCB0byBiZSBwcm9jZXNzZWQgaW4gcmVhbCB0aW1lCisgICAgICogYW5kIHBsYXllZCBiYWNrIGZvciBsaXZlIHBlcmZvcm1hbmNlIChlLmcga2FyYW9rZSkuCisgICAgICogVGhlIGNhcHR1cmUgcGF0aCB3aWxsIG1pbmltaXplIGxhdGVuY3kgYW5kIGNvdXBsaW5nIHdpdGggcGxheWJhY2sgcGF0aC4KKyAgICAgKi8KKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1BFUkZPUk1BTkNFID0gMTAsCiB9OwogdHlwZWRlZiBpbnQzMl90IGFhdWRpb19pbnB1dF9wcmVzZXRfdDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwCmluZGV4IGI5ZTI4YTAuLjQwOTAyODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAKQEAgLTYsNiArNiw3IEBACiAgICAgICAgICJjbGllbnQiLAogICAgICAgICAiY29yZSIsCiAgICAgICAgICJmaWZvIiwKKyAgICAgICAgImZsb3dncmFwaCIsCiAgICAgICAgICJsZWdhY3kiLAogICAgICAgICAidXRpbGl0eSIsCiAgICAgXSwKQEAgLTI1LDkgKzI2LDkgQEAKICAgICAgICAgInV0aWxpdHkvRml4ZWRCbG9ja0FkYXB0ZXIuY3BwIiwKICAgICAgICAgInV0aWxpdHkvRml4ZWRCbG9ja1JlYWRlci5jcHAiLAogICAgICAgICAidXRpbGl0eS9GaXhlZEJsb2NrV3JpdGVyLmNwcCIsCi0gICAgICAgICJ1dGlsaXR5L0xpbmVhclJhbXAuY3BwIiwKICAgICAgICAgImZpZm8vRmlmb0J1ZmZlci5jcHAiLAogICAgICAgICAiZmlmby9GaWZvQ29udHJvbGxlckJhc2UuY3BwIiwKKyAgICAgICAgImNsaWVudC9BQXVkaW9GbG93R3JhcGguY3BwIiwKICAgICAgICAgImNsaWVudC9BdWRpb0VuZHBvaW50LmNwcCIsCiAgICAgICAgICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAiLAogICAgICAgICAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcCIsCkBAIC00Miw2ICs0MywxNiBAQAogICAgICAgICAiYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5jcHAiLAogICAgICAgICAiYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcCIsCiAgICAgICAgICJiaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvUmFtcExpbmVhci5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NpbmtGbG9hdC5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NpbmtJMTYuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9TaW5rSTI0LmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvU291cmNlRmxvYXQuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VJMTYuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VJMjQuY3BwIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAKaW5kZXggOTU5ZGI2MS4uM2QxYmM5YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcApAQCAtMTQsNiArMTQsMTAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwogI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KQEAgLTM2LDYgKzQwLDcgQEAKIAogc3RhdHVzX3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbjo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewogICAgIHN0YXR1c190IHN0YXR1czsKKwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihnZXREZXZpY2VJZCgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihnZXRTYW1wbGVSYXRlKCkpOwpAQCAtNDYsNiArNTEsNyBAQAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBnZXRGb3JtYXQoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCkgZ2V0RGlyZWN0aW9uKCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGdldEJ1ZmZlckNhcGFjaXR5KCkpOwpAQCAtNjAsNyArNjYsNyBAQAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogZXJyb3I6Ci0gICAgQUxPR0UoIkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24ud3JpdGVUb1BhcmNlbCgpOiB3cml0ZSBmYWlsZWQgPSAlZCIsIHN0YXR1cyk7CisgICAgQUxPR0UoIiVzKCk6IHdyaXRlIGZhaWxlZCA9ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtODAsNyArODYsOCBAQAogICAgIHNldFNoYXJpbmdNb2RlKChhYXVkaW9fc2hhcmluZ19tb2RlX3QpIHZhbHVlKTsKICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc2V0Rm9ybWF0KChhYXVkaW9fZm9ybWF0X3QpIHZhbHVlKTsKKyAgICBzZXRGb3JtYXQoKGF1ZGlvX2Zvcm1hdF90KSB2YWx1ZSk7CisKICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc2V0RGlyZWN0aW9uKChhYXVkaW9fZGlyZWN0aW9uX3QpIHZhbHVlKTsKQEAgLTk5LDggKzEwNiw5IEBACiAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHNldFNlc3Npb25JZCh2YWx1ZSk7CisKICAgICByZXR1cm4gTk9fRVJST1I7CiBlcnJvcjoKLSAgICBBTE9HRSgiQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5yZWFkRnJvbVBhcmNlbCgpOiByZWFkIGZhaWxlZCA9ICVkIiwgc3RhdHVzKTsKKyAgICBBTE9HRSgiJXMoKTogcmVhZCBmYWlsZWQgPSAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmNwcAppbmRleCA2MjBlZGM3Li45YjMyNTQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvU2VydmljZS5jcHAKQEAgLTcyLDcgKzcyLDYgQEAKICAgICAgICAgICAgIEFMT0dFKCJCcEFBdWRpb1NlcnZpY2U6OmNsaWVudCB0cmFuc2FjdChPUEVOX1NUUkVBTSkgcmVhZEludCAlZCIsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0gPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQnBBQXVkaW9TZXJ2aWNlOjpjbGllbnQgT1BFTl9TVFJFQU0gcGFzc2VkIHN0cmVhbSAlZCIsIHN0cmVhbSk7CiAgICAgICAgICAgICByZXR1cm4gc3RyZWFtOwogICAgICAgICB9CiAgICAgICAgIGVyciA9IGNvbmZpZ3VyYXRpb25PdXRwdXQucmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcAppbmRleCAwYjBjZjc3Li42Nzk1NWU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwCkBAIC00Myw3ICs0Myw3IEBACiAKIHZvaWQgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6c2V0dXAoY29uc3QgdW5pcXVlX2ZkJiBmZCwgaW50MzJfdCBzaXplSW5CeXRlcykgewogICAgIG1GZC5yZXNldChkdXAoZmQuZ2V0KCkpKTsgLy8gc3RvcmUgYSBkdXBsaWNhdGUgZmQKLSAgICBBTE9HVigic2V0dXAoJWQgLT4gJWQsICVkKSB0aGlzID0gJXBcbiIsIGZkLmdldCgpLCBtRmQuZ2V0KCksIHNpemVJbkJ5dGVzLCB0aGlzKTsKKyAgICBBTE9HVigic2V0dXAoZmQgPSAlZCAtPiAlZCwgc2l6ZSA9ICVkKSB0aGlzID0gJXBcbiIsIGZkLmdldCgpLCBtRmQuZ2V0KCksIHNpemVJbkJ5dGVzLCB0aGlzKTsKICAgICBtU2l6ZUluQnl0ZXMgPSBzaXplSW5CeXRlczsKIH0KIApAQCAtMTA0LDcgKzEwNCw4IEBACiAgICAgbVJlc29sdmVkQWRkcmVzcyA9ICh1aW50OF90ICopIG1tYXAoMCwgbVNpemVJbkJ5dGVzLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsIGZkLmdldCgpLCAwKTsKICAgICBpZiAobVJlc29sdmVkQWRkcmVzcyA9PSBNTUFQX1VOUkVTT0xWRURfQUREUkVTUykgewotICAgICAgICBBTE9HRSgibW1hcCgpIGZhaWxlZCBmb3IgZmQgPSAlZCwgZXJybm8gPSAlcyIsIGZkLmdldCgpLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBBTE9HRSgibW1hcCgpIGZhaWxlZCBmb3IgZmQgPSAlZCwgbkJ5dGVzID0gJWQsIGVycm5vID0gJXMiLAorICAgICAgICAgICAgICBmZC5nZXQoKSwgbVNpemVJbkJ5dGVzLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOwogICAgIH0KICAgICByZXR1cm4gQUFVRElPX09LOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKaW5kZXggODJjMjI0MC4uNGVjMzhjNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oCkBAIC03MCw4ICs3MCw4IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc29sdmVTaGFyZWRNZW1vcnkoY29uc3QgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkJiBmZCk7CiAKICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgICBtRmQ7Ci0gICAgaW50MzJfdCAgICAgbVNpemVJbkJ5dGVzID0gMDsKLSAgICB1aW50OF90ICAgICptUmVzb2x2ZWRBZGRyZXNzID0gTU1BUF9VTlJFU09MVkVEX0FERFJFU1M7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbVNpemVJbkJ5dGVzID0gMDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICptUmVzb2x2ZWRBZGRyZXNzID0gTU1BUF9VTlJFU09MVkVEX0FERFJFU1M7CiAKIHByaXZhdGU6CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNDNjNmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguY3BwCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBQXVkaW9GbG93R3JhcGgiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJBQXVkaW9GbG93R3JhcGguaCIKKworI2luY2x1ZGUgPGZsb3dncmFwaC9DbGlwVG9SYW5nZS5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9SYW1wTGluZWFyLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1NpbmtGbG9hdC5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9TaW5rSTE2Lmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1NpbmtJMjQuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvU291cmNlRmxvYXQuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvU291cmNlSTE2Lmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1NvdXJjZUkyNC5oPgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvRmxvd0dyYXBoOjpjb25maWd1cmUoYXVkaW9fZm9ybWF0X3Qgc291cmNlRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNvdXJjZUNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3Qgc2lua0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzaW5rQ2hhbm5lbENvdW50KSB7CisgICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgKmxhc3RPdXRwdXQgPSBudWxscHRyOworCisgICAgQUxPR0QoIiVzKCkgc291cmNlIGZvcm1hdCA9IDB4JTA4eCwgY2hhbm5lbHMgPSAlZCwgc2luayBmb3JtYXQgPSAweCUwOHgsIGNoYW5uZWxzID0gJWQiLAorICAgICAgICAgIF9fZnVuY19fLCBzb3VyY2VGb3JtYXQsIHNvdXJjZUNoYW5uZWxDb3VudCwgc2lua0Zvcm1hdCwgc2lua0NoYW5uZWxDb3VudCk7CisKKyAgICBzd2l0Y2ggKHNvdXJjZUZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICBtU291cmNlID0gc3RkOjptYWtlX3VuaXF1ZTxTb3VyY2VGbG9hdD4oc291cmNlQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgbVNvdXJjZSA9IHN0ZDo6bWFrZV91bmlxdWU8U291cmNlSTE2Pihzb3VyY2VDaGFubmVsQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOgorICAgICAgICAgICAgbVNvdXJjZSA9IHN0ZDo6bWFrZV91bmlxdWU8U291cmNlSTI0Pihzb3VyY2VDaGFubmVsQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vIFRPRE8gYWRkIEkzMgorICAgICAgICAgICAgQUxPR0UoIiVzKCkgVW5zdXBwb3J0ZWQgc291cmNlIGZvcm1hdCA9ICVkIiwgX19mdW5jX18sIHNvdXJjZUZvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQ7CisgICAgfQorICAgIGxhc3RPdXRwdXQgPSAmbVNvdXJjZS0+b3V0cHV0OworCisgICAgLy8gQXBwbHkgdm9sdW1lIGFzIGEgcmFtcCB0byBhdm9pZCBwb3BzLgorICAgIG1Wb2x1bWVSYW1wID0gc3RkOjptYWtlX3VuaXF1ZTxSYW1wTGluZWFyPihzb3VyY2VDaGFubmVsQ291bnQpOworICAgIGxhc3RPdXRwdXQtPmNvbm5lY3QoJm1Wb2x1bWVSYW1wLT5pbnB1dCk7CisgICAgbGFzdE91dHB1dCA9ICZtVm9sdW1lUmFtcC0+b3V0cHV0OworCisgICAgLy8gRm9yIGEgcHVyZSBmbG9hdCBncmFwaCwgdGhlcmUgaXMgY2hhbmNlIHRoYXQgdGhlIGRhdGEgcmFuZ2UgbWF5IGJlIHZlcnkgbGFyZ2UuCisgICAgLy8gU28gd2Ugc2hvdWxkIGNsaXAgdG8gYSByZWFzb25hYmxlIHZhbHVlIHRoYXQgYWxsb3dzIGEgbGl0dGxlIGhlYWRyb29tLgorICAgIGlmIChzb3VyY2VGb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCAmJiBzaW5rRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgbUNsaXBwZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENsaXBUb1JhbmdlPihzb3VyY2VDaGFubmVsQ291bnQpOworICAgICAgICBsYXN0T3V0cHV0LT5jb25uZWN0KCZtQ2xpcHBlci0+aW5wdXQpOworICAgICAgICBsYXN0T3V0cHV0ID0gJm1DbGlwcGVyLT5vdXRwdXQ7CisgICAgfQorCisgICAgLy8gRXhwYW5kIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaWYgcmVxdWlyZWQuCisgICAgaWYgKHNvdXJjZUNoYW5uZWxDb3VudCA9PSAxICYmIHNpbmtDaGFubmVsQ291bnQgPiAxKSB7CisgICAgICAgIG1DaGFubmVsQ29udmVydGVyID0gc3RkOjptYWtlX3VuaXF1ZTxNb25vVG9NdWx0aUNvbnZlcnRlcj4oc2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgIGxhc3RPdXRwdXQtPmNvbm5lY3QoJm1DaGFubmVsQ29udmVydGVyLT5pbnB1dCk7CisgICAgICAgIGxhc3RPdXRwdXQgPSAmbUNoYW5uZWxDb252ZXJ0ZXItPm91dHB1dDsKKyAgICB9IGVsc2UgaWYgKHNvdXJjZUNoYW5uZWxDb3VudCAhPSBzaW5rQ2hhbm5lbENvdW50KSB7CisgICAgICAgIEFMT0dFKCIlcygpIENoYW5uZWwgcmVkdWN0aW9uIG5vdCBzdXBwb3J0ZWQuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQ7CisgICAgfQorCisgICAgc3dpdGNoIChzaW5rRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIG1TaW5rID0gc3RkOjptYWtlX3VuaXF1ZTxTaW5rRmxvYXQ+KHNpbmtDaGFubmVsQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICBtU2luayA9IHN0ZDo6bWFrZV91bmlxdWU8U2lua0kxNj4oc2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQ6CisgICAgICAgICAgICBtU2luayA9IHN0ZDo6bWFrZV91bmlxdWU8U2lua0kyND4oc2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy8gVE9ETyBhZGQgSTMyCisgICAgICAgICAgICBBTE9HRSgiJXMoKSBVbnN1cHBvcnRlZCBzaW5rIGZvcm1hdCA9ICVkIiwgX19mdW5jX18sIHNpbmtGb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEOworICAgIH0KKyAgICBsYXN0T3V0cHV0LT5jb25uZWN0KCZtU2luay0+aW5wdXQpOworCisgICAgcmV0dXJuIEFBVURJT19PSzsKK30KKwordm9pZCBBQXVkaW9GbG93R3JhcGg6OnByb2Nlc3MoY29uc3Qgdm9pZCAqc291cmNlLCB2b2lkICpkZXN0aW5hdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBtU291cmNlLT5zZXREYXRhKHNvdXJjZSwgbnVtRnJhbWVzKTsKKyAgICBtU2luay0+cmVhZChkZXN0aW5hdGlvbiwgbnVtRnJhbWVzKTsKK30KKworLyoqCisgKiBAcGFyYW0gdm9sdW1lIGJldHdlZW4gMC4wIGFuZCAxLjAKKyAqLwordm9pZCBBQXVkaW9GbG93R3JhcGg6OnNldFRhcmdldFZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBtVm9sdW1lUmFtcC0+c2V0VGFyZ2V0KHZvbHVtZSk7Cit9CisKK3ZvaWQgQUF1ZGlvRmxvd0dyYXBoOjpzZXRSYW1wTGVuZ3RoSW5GcmFtZXMoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBtVm9sdW1lUmFtcC0+c2V0TGVuZ3RoSW5GcmFtZXMobnVtRnJhbWVzKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5ZjY0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQUFVRElPX0ZMT1dfR1JBUEhfSAorI2RlZmluZSBBTkRST0lEX0FBVURJT19GTE9XX0dSQVBIX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvUmFtcExpbmVhci5oPgorCitjbGFzcyBBQXVkaW9GbG93R3JhcGggeworcHVibGljOgorICAgIC8qKiBDb25uZWN0IHNldmVyYWwgbW9kdWxlcyB0b2dldGhlciB0byBjb252ZXJ0IGZyb20gc291cmNlIHRvIHNpbmsuCisgICAgICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2VGb3JtYXQKKyAgICAgKiBAcGFyYW0gc291cmNlQ2hhbm5lbENvdW50CisgICAgICogQHBhcmFtIHNpbmtGb3JtYXQKKyAgICAgKiBAcGFyYW0gc2lua0NoYW5uZWxDb3VudAorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBhYXVkaW9fcmVzdWx0X3QgY29uZmlndXJlKGF1ZGlvX2Zvcm1hdF90IHNvdXJjZUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc291cmNlQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3Qgc2lua0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2lua0NoYW5uZWxDb3VudCk7CisKKyAgICB2b2lkIHByb2Nlc3MoY29uc3Qgdm9pZCAqc291cmNlLCB2b2lkICpkZXN0aW5hdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpOworCisgICAgLyoqCisgICAgICogQHBhcmFtIHZvbHVtZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCisgICAgICovCisgICAgdm9pZCBzZXRUYXJnZXRWb2x1bWUoZmxvYXQgdm9sdW1lKTsKKworICAgIHZvaWQgc2V0UmFtcExlbmd0aEluRnJhbWVzKGludDMyX3QgbnVtRnJhbWVzKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpBdWRpb1NvdXJjZT4gICAgICAgICAgbVNvdXJjZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpSYW1wTGluZWFyPiAgICAgICAgICAgbVZvbHVtZVJhbXA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6Q2xpcFRvUmFuZ2U+ICAgICAgICAgIG1DbGlwcGVyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6Ok1vbm9Ub011bHRpQ29udmVydGVyPiBtQ2hhbm5lbENvbnZlcnRlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpBdWRpb1Npbms+ICAgICAgICAgICAgbVNpbms7Cit9OworCisKKyNlbmRpZiAvL0FORFJPSURfQUFVRElPX0ZMT1dfR1JBUEhfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcAppbmRleCBmOGUzNGQxLi4yMTRmODg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcApAQCAtMTk2LDcgKzE5Niw3IEBACiAKIGludDMyX3QgQXVkaW9FbmRwb2ludDo6Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKQogewotICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKIH0KIAogaW50MzJfdCBBdWRpb0VuZHBvaW50OjpnZXRGdWxsRnJhbWVzQXZhaWxhYmxlKFdyYXBwaW5nQnVmZmVyICp3cmFwcGluZ0J1ZmZlcikKQEAgLTIwNiwxNSArMjA2LDE1IEBACiAKIGludDMyX3QgQXVkaW9FbmRwb2ludDo6Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpCiB7Ci0gICAgcmV0dXJuIG1EYXRhUXVldWUtPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgcmV0dXJuIG1EYXRhUXVldWUtPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKIH0KIAogdm9pZCBBdWRpb0VuZHBvaW50OjphZHZhbmNlV3JpdGVJbmRleChpbnQzMl90IGRlbHRhRnJhbWVzKSB7Ci0gICAgbURhdGFRdWV1ZS0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmFkdmFuY2VXcml0ZUluZGV4KGRlbHRhRnJhbWVzKTsKKyAgICBtRGF0YVF1ZXVlLT5hZHZhbmNlV3JpdGVJbmRleChkZWx0YUZyYW1lcyk7CiB9CiAKIHZvaWQgQXVkaW9FbmRwb2ludDo6YWR2YW5jZVJlYWRJbmRleChpbnQzMl90IGRlbHRhRnJhbWVzKSB7Ci0gICAgbURhdGFRdWV1ZS0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmFkdmFuY2VSZWFkSW5kZXgoZGVsdGFGcmFtZXMpOworICAgIG1EYXRhUXVldWUtPmFkdmFuY2VSZWFkSW5kZXgoZGVsdGFGcmFtZXMpOwogfQogCiB2b2lkIEF1ZGlvRW5kcG9pbnQ6OnNldERhdGFSZWFkQ291bnRlcihmaWZvX2NvdW50ZXJfdCBmcmFtZXNSZWFkKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcAppbmRleCA5MjA0ODI0Li5lYzI3MGYzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcApAQCAtMzksNyArMzksNiBAQAogI2luY2x1ZGUgImNvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmgiCiAjaW5jbHVkZSAiZmlmby9GaWZvQnVmZmVyLmgiCiAjaW5jbHVkZSAidXRpbGl0eS9BdWRpb0Nsb2NrLmgiCi0jaW5jbHVkZSAidXRpbGl0eS9MaW5lYXJSYW1wLmgiCiAKICNpbmNsdWRlICJBdWRpb1N0cmVhbUludGVybmFsLmgiCiAKQEAgLTYzLDcgKzYyLDcgQEAKICAgICAgICAgLCBtU2VydmljZVN0cmVhbUhhbmRsZShBQVVESU9fSEFORExFX0lOVkFMSUQpCiAgICAgICAgICwgbUluU2VydmljZShpblNlcnZpY2UpCiAgICAgICAgICwgbVNlcnZpY2VJbnRlcmZhY2Uoc2VydmljZUludGVyZmFjZSkKLSAgICAgICAgLCBtQXRvbWljVGltZXN0YW1wKCkKKyAgICAgICAgLCBtQXRvbWljSW50ZXJuYWxUaW1lc3RhbXAoKQogICAgICAgICAsIG1XYWtldXBEZWxheU5hbm9zKEFBdWRpb1Byb3BlcnR5X2dldFdha2V1cERlbGF5TWljcm9zKCkgKiBBQVVESU9fTkFOT1NfUEVSX01JQ1JPU0VDT05EKQogICAgICAgICAsIG1NaW5pbXVtU2xlZXBOYW5vcyhBQXVkaW9Qcm9wZXJ0eV9nZXRNaW5pbXVtU2xlZXBNaWNyb3MoKSAqIEFBVURJT19OQU5PU19QRVJfTUlDUk9TRUNPTkQpCiAgICAgICAgIHsKQEAgLTkyLDExICs5MSwxMSBAQAogICAgIH0KIAogICAgIC8vIFdlIGhhdmUgdG8gZG8gdm9sdW1lIHNjYWxpbmcuIFNvIHdlIHByZWZlciBGTE9BVCBmb3JtYXQuCi0gICAgaWYgKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgc2V0Rm9ybWF0KEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgc2V0Rm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOwogICAgIH0KICAgICAvLyBSZXF1ZXN0IEZMT0FUIGZvciB0aGUgc2hhcmVkIG1peGVyLgotICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldEZvcm1hdChBQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CisgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0Rm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOwogCiAgICAgLy8gQnVpbGQgdGhlIHJlcXVlc3QgdG8gc2VuZCB0byB0aGUgc2VydmVyLgogICAgIHJlcXVlc3Quc2V0VXNlcklkKGdldHVpZCgpKTsKQEAgLTEyNiwxMyArMTI1LDEyIEBACiAgICAgICAgIC8vIGlmIHRoYXQgZmFpbGVkIHRoZW4gdHJ5IHN3aXRjaGluZyBmcm9tIG1vbm8gdG8gc3RlcmVvIGlmIE9VVFBVVC4KICAgICAgICAgLy8gT25seSBkbyB0aGlzIGluIHRoZSBjbGllbnQuIE90aGVyd2lzZSB3ZSBlbmQgdXAgd2l0aCBhIG1vbm8gbWl4ZXIgaW4gdGhlIHNlcnZpY2UKICAgICAgICAgLy8gdGhhdCB3cml0ZXMgdG8gYSBzdGVyZW8gTU1BUCBzdHJlYW0uCi0gICAgICAgIEFMT0dEKCIlcyAtIG9wZW5TdHJlYW0oKSByZXR1cm5lZCAlZCwgdHJ5IHN3aXRjaGluZyBmcm9tIE1PTk8gdG8gU1RFUkVPIiwKKyAgICAgICAgQUxPR0QoIiVzKCkgLSBvcGVuU3RyZWFtKCkgcmV0dXJuZWQgJWQsIHRyeSBzd2l0Y2hpbmcgZnJvbSBNT05PIHRvIFNURVJFTyIsCiAgICAgICAgICAgICAgIF9fZnVuY19fLCBtU2VydmljZVN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldFNhbXBsZXNQZXJGcmFtZSgyKTsgLy8gc3RlcmVvCiAgICAgICAgIG1TZXJ2aWNlU3RyZWFtSGFuZGxlID0gbVNlcnZpY2VJbnRlcmZhY2Uub3BlblN0cmVhbShyZXF1ZXN0LCBjb25maWd1cmF0aW9uT3V0cHV0KTsKICAgICB9CiAgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlIDwgMCkgewotICAgICAgICBBTE9HRSgiJXMgLSBvcGVuU3RyZWFtKCkgcmV0dXJuZWQgJWQiLCBfX2Z1bmNfXywgbVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gbVNlcnZpY2VTdHJlYW1IYW5kbGU7CiAgICAgfQogCkBAIC0yMTIsOSArMjEwLDcgQEAKICAgICAgICAgICAgIG1DYWxsYmFja0ZyYW1lcyA9IG1GcmFtZXNQZXJCdXJzdDsKICAgICAgICAgfQogCi0gICAgICAgIGludDMyX3QgYnl0ZXNQZXJGcmFtZSA9IGdldFNhbXBsZXNQZXJGcmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGdldEZvcm1hdCgpKTsKLSAgICAgICAgaW50MzJfdCBjYWxsYmFja0J1ZmZlclNpemUgPSBtQ2FsbGJhY2tGcmFtZXMgKiBieXRlc1BlckZyYW1lOworICAgICAgICBjb25zdCBpbnQzMl90IGNhbGxiYWNrQnVmZmVyU2l6ZSA9IG1DYWxsYmFja0ZyYW1lcyAqIGdldEJ5dGVzUGVyRnJhbWUoKTsKICAgICAgICAgbUNhbGxiYWNrQnVmZmVyID0gbmV3IHVpbnQ4X3RbY2FsbGJhY2tCdWZmZXJTaXplXTsKICAgICB9CiAKQEAgLTM1Myw4ICszNDksNyBAQAogICAgIH0KIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnJlcXVlc3RTdG9wKCkKLXsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpyZXF1ZXN0U3RvcCgpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc3RvcENhbGxiYWNrKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTM2OCw3ICszNjMsNyBAQAogCiAgICAgbUNsb2NrTW9kZWwuc3RvcChBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HKTsKLSAgICBtQXRvbWljVGltZXN0YW1wLmNsZWFyKCk7CisgICAgbUF0b21pY0ludGVybmFsVGltZXN0YW1wLmNsZWFyKCk7CiAKICAgICByZXR1cm4gbVNlcnZpY2VJbnRlcmZhY2Uuc3RvcFN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7CiB9CkBAIC00MTcsOCArNDEyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmZyYW1lUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3NlY29uZHMpIHsKICAgICAvLyBHZW5lcmF0ZWQgaW4gc2VydmVyIGFuZCBwYXNzZWQgdG8gY2xpZW50LiBSZXR1cm4gbGF0ZXN0LgotICAgIGlmIChtQXRvbWljVGltZXN0YW1wLmlzVmFsaWQoKSkgewotICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1RpbWVzdGFtcC5yZWFkKCk7CisgICAgaWYgKG1BdG9taWNJbnRlcm5hbFRpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKKyAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNJbnRlcm5hbFRpbWVzdGFtcC5yZWFkKCk7CiAgICAgICAgIGludDY0X3QgcG9zaXRpb24gPSB0aW1lc3RhbXAuZ2V0UG9zaXRpb24oKSArIG1GcmFtZXNPZmZzZXRGcm9tU2VydmljZTsKICAgICAgICAgaWYgKHBvc2l0aW9uID49IDApIHsKICAgICAgICAgICAgICpmcmFtZVBvc2l0aW9uID0gcG9zaXRpb247CkBAIC00NjUsNyArNDYwLDcgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9uVGltZXN0YW1wSGFyZHdhcmUoQUF1ZGlvU2VydmljZU1lc3NhZ2UgKm1lc3NhZ2UpIHsKICAgICBUaW1lc3RhbXAgdGltZXN0YW1wKG1lc3NhZ2UtPnRpbWVzdGFtcC5wb3NpdGlvbiwgbWVzc2FnZS0+dGltZXN0YW1wLnRpbWVzdGFtcCk7Ci0gICAgbUF0b21pY1RpbWVzdGFtcC53cml0ZSh0aW1lc3RhbXApOworICAgIG1BdG9taWNJbnRlcm5hbFRpbWVzdGFtcC53cml0ZSh0aW1lc3RhbXApOwogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKQEAgLTY5Niw3ICs2OTEsNiBAQAogICAgIH0KIAogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBtQXVkaW9FbmRwb2ludC5zZXRCdWZmZXJTaXplSW5GcmFtZXMoYWRqdXN0ZWRGcmFtZXMsICZhY3R1YWxGcmFtZXMpOwotICAgIEFMT0dEKCJzZXRCdWZmZXJTaXplKCkgcmVxID0gJWQgPT4gJWQiLCByZXF1ZXN0ZWRGcmFtZXMsIGFjdHVhbEZyYW1lcyk7CiAgICAgaWYgKHJlc3VsdCA8IDApIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9IGVsc2UgewpAQCAtNzE5LDMgKzcxMyw3IEBACiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6am9pblRocmVhZCh2b2lkKiogcmV0dXJuQXJnKSB7CiAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtOjpqb2luVGhyZWFkKHJldHVybkFyZywgY2FsY3VsYXRlUmVhc29uYWJsZVRpbWVvdXQoZ2V0RnJhbWVzUGVyQnVyc3QoKSkpOwogfQorCitib29sIEF1ZGlvU3RyZWFtSW50ZXJuYWw6OmlzQ2xvY2tNb2RlbEluQ29udHJvbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNBY3RpdmUoKSAmJiBtQXVkaW9FbmRwb2ludC5pc0ZyZWVSdW5uaW5nKCkgJiYgbUNsb2NrTW9kZWwuaXNSdW5uaW5nKCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgKaW5kZXggMDQyNWNkNS4uODZjNDY5OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaApAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgImNsaWVudC9BdWRpb0VuZHBvaW50LmgiCiAjaW5jbHVkZSAiY29yZS9BdWRpb1N0cmVhbS5oIgogI2luY2x1ZGUgInV0aWxpdHkvQXVkaW9DbG9jay5oIgotI2luY2x1ZGUgInV0aWxpdHkvTGluZWFyUmFtcC5oIgogCiB1c2luZyBhbmRyb2lkOjpzcDsKIHVzaW5nIGFuZHJvaWQ6OklBQXVkaW9TZXJ2aWNlOwpAQCAtMTQ1LDYgKzE0NCwxNCBAQAogICAgICAqLwogICAgIGJvb2wgaXNJblNlcnZpY2UoKSBjb25zdCB7IHJldHVybiBtSW5TZXJ2aWNlOyB9CiAKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgc2VydmljZSBGSUZPIHBvc2l0aW9uIGN1cnJlbnRseSBjb250cm9sbGVkIGJ5IHRoZSBBQXVkaW8gc2VydmljZSBvciBIQUwsCisgICAgICogb3Igc2V0IGJhc2VkIG9uIHRoZSBDbG9jayBNb2RlbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgQ2xvY2tNb2RlbCBpcyBjdXJyZW50bHkgZGV0ZXJtaW5pbmcgdGhlIEZJRk8gcG9zaXRpb24KKyAgICAgKi8KKyAgICBib29sIGlzQ2xvY2tNb2RlbEluQ29udHJvbCgpIGNvbnN0OworCiAgICAgSXNvY2hyb25vdXNDbG9ja01vZGVsICAgIG1DbG9ja01vZGVsOyAgICAgIC8vIHRpbWluZyBtb2RlbCBmb3IgY2hhc2luZyB0aGUgSEFMCiAKICAgICBBdWRpb0VuZHBvaW50ICAgICAgICAgICAgbUF1ZGlvRW5kcG9pbnQ7ICAgLy8gc291cmNlIGZvciByZWFkcyBvciBzaW5rIGZvciB3cml0ZXMKQEAgLTE2NCw3ICsxNzEsNyBAQAogCiAgICAgQUF1ZGlvU2VydmljZUludGVyZmFjZSAgJm1TZXJ2aWNlSW50ZXJmYWNlOyAgIC8vIGFic3RyYWN0IGludGVyZmFjZSB0byB0aGUgc2VydmljZQogCi0gICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNUaW1lc3RhbXA7CisgICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNJbnRlcm5hbFRpbWVzdGFtcDsKIAogICAgIEF0b21pY1JlcXVlc3RvciAgICAgICAgICBtTmVlZENhdGNoVXA7ICAgLy8gQXNrIHJlYWQoKSBvciB3cml0ZSgpIHRvIHN5bmMgb24gZmlyc3QgdGltZXN0YW1wLgogCkBAIC0xOTMsNiArMjAwLDggQEAKIAogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICBtU2VydmljZUxhdGVuY3lOYW5vcyA9IDA7CiAKKyAgICAvLyBTb21ldGltZXMgdGhlIGhhcmR3YXJlIGlzIG9wZXJhdGluZyB3aXRoIGEgZGlmZmVyZW50IGNoYW5uZWwgY291bnQgZnJvbSB0aGUgYXBwLgorICAgIC8vIFRoZW4gd2UgcmVxdWlyZSBjb252ZXJzaW9uIGluIEFBdWRpby4KICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgbURldmljZUNoYW5uZWxDb3VudCA9IDA7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAKaW5kZXggMDcxOWZlMS4uYTZjYzQ1YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKICNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuaCIKQEAgLTE2NSwzNSArMTY2LDM2IEBACiAgICAgLy8gUmVhZCBkYXRhIGluIG9uZSBvciB0d28gcGFydHMuCiAgICAgZm9yIChpbnQgcGFydEluZGV4ID0gMDsgZnJhbWVzTGVmdCA+IDAgJiYgcGFydEluZGV4IDwgV3JhcHBpbmdCdWZmZXI6OlNJWkU7IHBhcnRJbmRleCsrKSB7CiAgICAgICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gZnJhbWVzTGVmdDsKLSAgICAgICAgaW50MzJfdCBmcmFtZXNBdmFpbGFibGUgPSB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbcGFydEluZGV4XTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBmcmFtZXNBdmFpbGFibGUgPSB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbcGFydEluZGV4XTsKICAgICAgICAgaWYgKGZyYW1lc0F2YWlsYWJsZSA8PSAwKSBicmVhazsKIAogICAgICAgICBpZiAoZnJhbWVzVG9Qcm9jZXNzID4gZnJhbWVzQXZhaWxhYmxlKSB7CiAgICAgICAgICAgICBmcmFtZXNUb1Byb2Nlc3MgPSBmcmFtZXNBdmFpbGFibGU7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQzMl90IG51bUJ5dGVzID0gZ2V0Qnl0ZXNQZXJGcmFtZSgpICogZnJhbWVzVG9Qcm9jZXNzOwotICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBudW1CeXRlcyA9IGdldEJ5dGVzUGVyRnJhbWUoKSAqIGZyYW1lc1RvUHJvY2VzczsKKyAgICAgICAgY29uc3QgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogZ2V0U2FtcGxlc1BlckZyYW1lKCk7CiAKKyAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3Qgc291cmNlRm9ybWF0ID0gZ2V0RGV2aWNlRm9ybWF0KCk7CisgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGRlc3RpbmF0aW9uRm9ybWF0ID0gZ2V0Rm9ybWF0KCk7CiAgICAgICAgIC8vIFRPRE8gZmFjdG9yIHRoaXMgb3V0IGludG8gYSB1dGlsaXR5IGZ1bmN0aW9uCi0gICAgICAgIGlmIChnZXREZXZpY2VGb3JtYXQoKSA9PSBnZXRGb3JtYXQoKSkgeworICAgICAgICBpZiAoc291cmNlRm9ybWF0ID09IGRlc3RpbmF0aW9uRm9ybWF0KSB7CiAgICAgICAgICAgICBtZW1jcHkoZGVzdGluYXRpb24sIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwgbnVtQnl0ZXMpOwotICAgICAgICB9IGVsc2UgaWYgKGdldERldmljZUZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0kxNgotICAgICAgICAgICAgICAgICAgICYmIGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdCgKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAorICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgICAgICAgICAgICAgICAgICYmIGRlc3RpbmF0aW9uRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNigKICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAxLjBmKTsKLSAgICAgICAgfSBlbHNlIGlmIChnZXREZXZpY2VGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVAotICAgICAgICAgICAgICAgICAgICYmIGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCisgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyk7CisgICAgICAgIH0gZWxzZSBpZiAoc291cmNlRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKKyAgICAgICAgICAgICAgICAgICAmJiBkZXN0aW5hdGlvbkZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgeworICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KAogICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgMS4wZik7CisgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCisgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIkZvcm1hdCBjb252ZXJzaW9uIG5vdCBzdXBwb3J0ZWQhIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoKSAtIEZvcm1hdCBjb252ZXJzaW9uIG5vdCBzdXBwb3J0ZWQhIGF1ZGlvX2Zvcm1hdF90IHNvdXJjZSA9ICV1LCBkZXN0ID0gJXUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzb3VyY2VGb3JtYXQsIGRlc3RpbmF0aW9uRm9ybWF0KTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9GT1JNQVQ7CiAgICAgICAgIH0KICAgICAgICAgZGVzdGluYXRpb24gKz0gbnVtQnl0ZXM7CkBAIC0yMDgsMTcgKzIxMCwxMiBAQAogfQogCiBpbnQ2NF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlOjpnZXRGcmFtZXNXcml0dGVuKCkgewotICAgIGludDY0X3QgZnJhbWVzV3JpdHRlbkhhcmR3YXJlOwotICAgIGlmIChpc0FjdGl2ZSgpKSB7Ci0gICAgICAgIGZyYW1lc1dyaXR0ZW5IYXJkd2FyZSA9IG1DbG9ja01vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcmFtZXNXcml0dGVuSGFyZHdhcmUgPSBtQXVkaW9FbmRwb2ludC5nZXREYXRhV3JpdGVDb3VudGVyKCk7Ci0gICAgfQotICAgIC8vIFByZXZlbnQgcmV0cm9ncmFkZSBtb3Rpb24uCisgICAgY29uc3QgaW50NjRfdCBmcmFtZXNXcml0dGVuSGFyZHdhcmUgPSBpc0Nsb2NrTW9kZWxJbkNvbnRyb2woKQorICAgICAgICAgICAgPyBtQ2xvY2tNb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24oQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSkKKyAgICAgICAgICAgIDogbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVdyaXRlQ291bnRlcigpOworICAgIC8vIEFkZCBzZXJ2aWNlIG9mZnNldCBhbmQgcHJldmVudCByZXRyb2dyYWRlIG1vdGlvbi4KICAgICBtTGFzdEZyYW1lc1dyaXR0ZW4gPSBzdGQ6Om1heChtTGFzdEZyYW1lc1dyaXR0ZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzV3JpdHRlbkhhcmR3YXJlICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlKTsKLSAgICAvL0FMT0dEKCJnZXRGcmFtZXNXcml0dGVuKCkgcmV0dXJucyAlbGxkIiwKLSAgICAvLyAgICAgIChsb25nIGxvbmcpbUxhc3RGcmFtZXNXcml0dGVuKTsKICAgICByZXR1cm4gbUxhc3RGcmFtZXNXcml0dGVuOwogfQogCkBAIC0yNTYsNyArMjUzLDggQEAKICAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSBtYXliZUNhbGxEYXRhQ2FsbGJhY2sobUNhbGxiYWNrQnVmZmVyLCBtQ2FsbGJhY2tGcmFtZXMpOwogCiAgICAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1ApIHsKLSAgICAgICAgICAgIEFMT0dEKCJjYWxsYmFjayByZXR1cm5lZCBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AiKTsKKyAgICAgICAgICAgIEFMT0dEKCIlcygpOiBjYWxsYmFjayByZXR1cm5lZCBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXN1bHQgPSBzeXN0ZW1TdG9wRnJvbUNhbGxiYWNrKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcAppbmRleCA3OTViYTJjLi5lMTQ0M2Q5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwCkBAIC00Myw5ICs0MywxNyBAQAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpvcGVuKGNvbnN0IEF1ZGlvU3RyZWFtQnVpbGRlciAmYnVpbGRlcikgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBdWRpb1N0cmVhbUludGVybmFsOjpvcGVuKGJ1aWxkZXIpOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIHJlc3VsdCA9IG1GbG93R3JhcGguY29uZmlndXJlKGdldEZvcm1hdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTYW1wbGVzUGVyRnJhbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9ybWF0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUNoYW5uZWxDb3VudCgpKTsKKworICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgfQogICAgICAgICAvLyBTYW1wbGUgcmF0ZSBpcyBjb25zdHJhaW5lZCB0byBjb21tb24gdmFsdWVzIGJ5IG5vdyBhbmQgc2hvdWxkIG5vdCBvdmVyZmxvdy4KICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMgPSBrUmFtcE1TZWMgKiBnZXRTYW1wbGVSYXRlKCkgLyBBQVVESU9fTUlMTElTX1BFUl9TRUNPTkQ7Ci0gICAgICAgIG1Wb2x1bWVSYW1wLnNldExlbmd0aEluRnJhbWVzKG51bUZyYW1lcyk7CisgICAgICAgIG1GbG93R3JhcGguc2V0UmFtcExlbmd0aEluRnJhbWVzKG51bUZyYW1lcyk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CkBAIC02Myw3ICs3MSw3IEBACiAKICAgICBtQ2xvY2tNb2RlbC5zdG9wKEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOwogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lORyk7Ci0gICAgbUF0b21pY1RpbWVzdGFtcC5jbGVhcigpOworICAgIG1BdG9taWNJbnRlcm5hbFRpbWVzdGFtcC5jbGVhcigpOwogICAgIHJldHVybiBtU2VydmljZUludGVyZmFjZS5wYXVzZVN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7CiB9CiAKQEAgLTIxNiwyMiArMjI0LDEwIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDMyX3QgbnVtQnl0ZXMgPSBnZXRCeXRlc1BlckZyYW1lKCkgKiBmcmFtZXNUb1dyaXRlOwotICAgICAgICAgICAgLy8gRGF0YSBjb252ZXJzaW9uLgotICAgICAgICAgICAgZmxvYXQgbGV2ZWxGcm9tOwotICAgICAgICAgICAgZmxvYXQgbGV2ZWxUbzsKLSAgICAgICAgICAgIG1Wb2x1bWVSYW1wLm5leHRTZWdtZW50KGZyYW1lc1RvV3JpdGUsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKIAotICAgICAgICAgICAgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Rm9ybWF0dGVkRGF0YSBzb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICh2b2lkICopYnl0ZUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgZ2V0Rm9ybWF0KCksCi0gICAgICAgICAgICAgICAgICAgIGdldFNhbXBsZXNQZXJGcmFtZSgpKTsKLSAgICAgICAgICAgIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OkZvcm1hdHRlZERhdGEgZGVzdGluYXRpb24oCi0gICAgICAgICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9ybWF0KCksCi0gICAgICAgICAgICAgICAgICAgIGdldERldmljZUNoYW5uZWxDb3VudCgpKTsKLQotICAgICAgICAgICAgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Y29udmVydChzb3VyY2UsIGRlc3RpbmF0aW9uLCBmcmFtZXNUb1dyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sIGxldmVsVG8pOworICAgICAgICAgICAgbUZsb3dHcmFwaC5wcm9jZXNzKCh2b2lkICopYnl0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzVG9Xcml0ZSk7CiAKICAgICAgICAgICAgIGJ5dGVCdWZmZXIgKz0gbnVtQnl0ZXM7CiAgICAgICAgICAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1RvV3JpdGU7CkBAIC0yNDYsMjcgKzI0MiwxNyBAQAogICAgIHJldHVybiBmcmFtZXNXcml0dGVuOwogfQogCi1pbnQ2NF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpnZXRGcmFtZXNSZWFkKCkKLXsKLSAgICBpbnQ2NF90IGZyYW1lc1JlYWRIYXJkd2FyZTsKLSAgICBpZiAoaXNBY3RpdmUoKSkgewotICAgICAgICBmcmFtZXNSZWFkSGFyZHdhcmUgPSBtQ2xvY2tNb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24oQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnJhbWVzUmVhZEhhcmR3YXJlID0gbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVJlYWRDb3VudGVyKCk7Ci0gICAgfQotICAgIGludDY0X3QgZnJhbWVzUmVhZCA9IGZyYW1lc1JlYWRIYXJkd2FyZSArIG1GcmFtZXNPZmZzZXRGcm9tU2VydmljZTsKLSAgICAvLyBQcmV2ZW50IHJldHJvZ3JhZGUgbW90aW9uLgotICAgIGlmIChmcmFtZXNSZWFkIDwgbUxhc3RGcmFtZXNSZWFkKSB7Ci0gICAgICAgIGZyYW1lc1JlYWQgPSBtTGFzdEZyYW1lc1JlYWQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUxhc3RGcmFtZXNSZWFkID0gZnJhbWVzUmVhZDsKLSAgICB9Ci0gICAgcmV0dXJuIGZyYW1lc1JlYWQ7CitpbnQ2NF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpnZXRGcmFtZXNSZWFkKCkgeworICAgIGNvbnN0IGludDY0X3QgZnJhbWVzUmVhZEhhcmR3YXJlID0gaXNDbG9ja01vZGVsSW5Db250cm9sKCkKKyAgICAgICAgICAgID8gbUNsb2NrTW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpCisgICAgICAgICAgICA6IG1BdWRpb0VuZHBvaW50LmdldERhdGFSZWFkQ291bnRlcigpOworICAgIC8vIEFkZCBzZXJ2aWNlIG9mZnNldCBhbmQgcHJldmVudCByZXRyb2dyYWRlIG1vdGlvbi4KKyAgICBtTGFzdEZyYW1lc1JlYWQgPSBzdGQ6Om1heChtTGFzdEZyYW1lc1JlYWQsIGZyYW1lc1JlYWRIYXJkd2FyZSArIG1GcmFtZXNPZmZzZXRGcm9tU2VydmljZSk7CisgICAgcmV0dXJuIG1MYXN0RnJhbWVzUmVhZDsKIH0KIAotaW50NjRfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6Z2V0RnJhbWVzV3JpdHRlbigpCi17Ci0gICAgaW50NjRfdCBmcmFtZXNXcml0dGVuID0gbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVdyaXRlQ291bnRlcigpCitpbnQ2NF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpnZXRGcmFtZXNXcml0dGVuKCkgeworICAgIGNvbnN0IGludDY0X3QgZnJhbWVzV3JpdHRlbiA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFXcml0ZUNvdW50ZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlOwogICAgIHJldHVybiBmcmFtZXNXcml0dGVuOwogfQpAQCAtMjk3LDcgKzI4Myw4IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoY2FsbGJhY2tSZXN1bHQgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMoKTogY2FsbGJhY2sgcmV0dXJuZWQgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QIiwgX19mdW5jX18pOworICAgICAgICAgICAgQUxPR0QoIiVzKCk6IGNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHN5c3RlbVN0b3BGcm9tQ2FsbGJhY2soKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtMzEzLDYgKzMwMCw2IEBACiAgICAgZmxvYXQgY29tYmluZWRWb2x1bWUgPSBtU3RyZWFtVm9sdW1lICogZ2V0RHVja0FuZE11dGVWb2x1bWUoKTsKICAgICBBTE9HRCgiJXMoKSBtU3RyZWFtVm9sdW1lICogZHVja0FuZE11dGVWb2x1bWUgPSAlZiAqICVmID0gJWYiLAogICAgICAgICAgIF9fZnVuY19fLCBtU3RyZWFtVm9sdW1lLCBnZXREdWNrQW5kTXV0ZVZvbHVtZSgpLCBjb21iaW5lZFZvbHVtZSk7Ci0gICAgbVZvbHVtZVJhbXAuc2V0VGFyZ2V0KGNvbWJpbmVkVm9sdW1lKTsKKyAgICBtRmxvd0dyYXBoLnNldFRhcmdldFZvbHVtZShjb21iaW5lZFZvbHVtZSk7CiAgICAgcmV0dXJuIGFuZHJvaWQ6Ok5PX0VSUk9SOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgKaW5kZXggOTc3YTkwOS4uY2FiMjk0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlSW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5oIgogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgiCiAKIHVzaW5nIGFuZHJvaWQ6OnNwOwpAQCAtOTMsNyArOTQsNyBAQAogCiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgIG1MYXN0RnJhbWVzUmVhZCA9IDA7IC8vIHVzZWQgdG8gcHJldmVudCByZXRyb2dyYWRlIG1vdGlvbgogCi0gICAgTGluZWFyUmFtcCAgICAgICAgICAgICAgIG1Wb2x1bWVSYW1wOworICAgIEFBdWRpb0Zsb3dHcmFwaCAgICAgICAgICBtRmxvd0dyYXBoOwogCiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcAppbmRleCA5NWI1MmJlLi43NDdkMGUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAKQEAgLTYwLDEwICs2MCwxNCBAQAogICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7CiB9CiAKLWJvb2wgSXNvY2hyb25vdXNDbG9ja01vZGVsOjppc1N0YXJ0aW5nKCkgeworYm9vbCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OmlzU3RhcnRpbmcoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9TVEFSVElORzsKIH0KIAorYm9vbCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OmlzUnVubmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX1JVTk5JTkc7Cit9CisKIHZvaWQgSXNvY2hyb25vdXNDbG9ja01vZGVsOjpwcm9jZXNzVGltZXN0YW1wKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50NjRfdCBuYW5vVGltZSkgewogLy8gICAgQUxPR0QoInByb2Nlc3NUaW1lc3RhbXAoKSAtIGZyYW1lUG9zaXRpb24gPSAlbGxkIGF0IG5hbm9UaW1lICVsbHUiLAogLy8gICAgICAgICAobG9uZyBsb25nKWZyYW1lUG9zaXRpb24sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5oCmluZGV4IDcxODIzNzYuLjQ2Y2E0OGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5oCkBAIC0zNiw3ICszNiwxNSBAQAogICAgIHZvaWQgc3RhcnQoaW50NjRfdCBuYW5vVGltZSk7CiAgICAgdm9pZCBzdG9wKGludDY0X3QgbmFub1RpbWUpOwogCi0gICAgYm9vbCBpc1N0YXJ0aW5nKCk7CisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtb2RlbCBpcyBzdGFydGluZyB1cAorICAgICAqLworICAgIGJvb2wgaXNTdGFydGluZygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtb2RlbCBpcyBydW5uaW5nIGFuZCBwcm9kdWNpbmcgdmFsaWQgcmVzdWx0cworICAgICAqLworICAgIGJvb2wgaXNSdW5uaW5nKCkgY29uc3Q7CiAKICAgICB2b2lkIHByb2Nlc3NUaW1lc3RhbXAoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQ2NF90IG5hbm9UaW1lKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKaW5kZXggZGYwZGI3OS4uMGQ3MWVmYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCkBAIC0xNDYsMTQgKzE0NiwxNCBAQAogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbENvdW50KEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQpCiB7Ci0gICAgQXVkaW9TdHJlYW1CdWlsZGVyICpzdHJlYW1CdWlsZGVyID0gY29udmVydEFBdWRpb0J1aWxkZXJUb1N0cmVhbUJ1aWxkZXIoYnVpbGRlcik7Ci0gICAgc3RyZWFtQnVpbGRlci0+c2V0U2FtcGxlc1BlckZyYW1lKGNoYW5uZWxDb3VudCk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVzUGVyRnJhbWUoYnVpbGRlciwgY2hhbm5lbENvdW50KTsKIH0KIAogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlc1BlckZyYW1lKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpCiB7Ci0gICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnQoYnVpbGRlciwgY2hhbm5lbENvdW50KTsKKyAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKKyAgICBzdHJlYW1CdWlsZGVyLT5zZXRTYW1wbGVzUGVyRnJhbWUoc2FtcGxlc1BlckZyYW1lKTsKIH0KIAogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGlyZWN0aW9uKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCkBAIC0xNjcsNyArMTY3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpCiB7CiAgICAgQXVkaW9TdHJlYW1CdWlsZGVyICpzdHJlYW1CdWlsZGVyID0gY29udmVydEFBdWRpb0J1aWxkZXJUb1N0cmVhbUJ1aWxkZXIoYnVpbGRlcik7Ci0gICAgc3RyZWFtQnVpbGRlci0+c2V0Rm9ybWF0KGZvcm1hdCk7CisgICAgLy8gVXNlIGF1ZGlvX2Zvcm1hdF90IGV2ZXJ5d2hlcmUgaW50ZXJuYWxseS4KKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBpbnRlcm5hbEZvcm1hdCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChmb3JtYXQpOworICAgIHN0cmVhbUJ1aWxkZXItPnNldEZvcm1hdChpbnRlcm5hbEZvcm1hdCk7CiB9CiAKIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNoYXJpbmdNb2RlKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCkBAIC0yMzksNyArMjQxLDcgQEAKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBudWxscHRyOwogICAgIC8vIFBsZWFzZSBsZWF2ZSB0aGVzZSBsb2dzIGJlY2F1c2UgdGhleSBhcmUgdmVyeSBoZWxwZnVsIHdoZW4gZGVidWdnaW5nLgotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKSBjYWxsZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgIEFMT0dEKCIlcygpIGNhbGxlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiwgX19mdW5jX18pOwogICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IENPTU1PTl9HRVRfRlJPTV9CVUlMREVSX09SX1JFVFVSTihzdHJlYW1QdHIpOwogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzdHJlYW1CdWlsZGVyLT5idWlsZCgmYXVkaW9TdHJlYW0pOwogICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKSByZXR1cm5zICVkID0gJXMgZm9yICglcCkgLS0tLS0tLS0tLS0tLS0tLSIsCkBAIC0yNjcsNyArMjY5LDcgQEAKIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX0VSUk9SX05VTEw7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX2Nsb3NlKCVwKSBjYWxsZWQgLS0tLS0tLS0tLS0tLS0tIiwgc3RyZWFtKTsKKyAgICBBTE9HRCgiJXMoJXApIGNhbGxlZCAtLS0tLS0tLS0tLS0tLS0iLCBfX2Z1bmNfXywgc3RyZWFtKTsKICAgICBpZiAoYXVkaW9TdHJlYW0gIT0gbnVsbHB0cikgewogICAgICAgICByZXN1bHQgPSBhdWRpb1N0cmVhbS0+c2FmZUNsb3NlKCk7CiAgICAgICAgIC8vIENsb3NlIHdpbGwgb25seSBmYWlsIGlmIGNhbGxlZCBpbGxlZ2FsbHksIGZvciBleGFtcGxlLCBmcm9tIGEgY2FsbGJhY2suCkBAIC0yODIsNyArMjg0LDcgQEAKICAgICAvLyBXZSdyZSBwb3RlbnRpYWxseSBmcmVlaW5nIGBzdHJlYW1gIGFib3ZlLCBzbyBpdHMgdXNlIGhlcmUgbWFrZXMgc29tZQogICAgIC8vIHN0YXRpYyBhbmFseXNpcyB0b29scyB1bmhhcHB5LiBDYXN0aW5nIHRvIHVpbnRwdHJfdCBoZWxwcyBhc3N1cmUKICAgICAvLyBzYWlkIHRvb2xzIHRoYXQgd2UncmUgbm90IGRvaW5nIGFueXRoaW5nIGJhZCBoZXJlLgotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fY2xvc2UoJSMiIFBSSXhQVFIgIikgcmV0dXJuZWQgJWQgLS0tLS0tLS0tIiwKKyAgICBBTE9HRCgiJXMoJSMiIFBSSXhQVFIgIikgcmV0dXJuZWQgJWQgLS0tLS0tLS0tIiwgX19mdW5jX18sCiAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHN0cmVhbSksIHJlc3VsdCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTI5MCwzMSArMjkyLDMxIEBACiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KCVwKSBjYWxsZWQgLS0tLS0tLS0tLS0tLS0iLCBzdHJlYW0pOworICAgIEFMT0dEKCIlcyglcCkgY2FsbGVkIC0tLS0tLS0tLS0tLS0tIiwgX19mdW5jX18sIHN0cmVhbSk7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGF1ZGlvU3RyZWFtLT5zeXN0ZW1TdGFydCgpOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KCVwKSByZXR1cm5lZCAlZCAtLS0tLS0tLS0iLCBzdHJlYW0sIHJlc3VsdCk7CisgICAgQUxPR0QoIiVzKCVwKSByZXR1cm5lZCAlZCAtLS0tLS0tLS0iLCBfX2Z1bmNfXywgc3RyZWFtLCByZXN1bHQpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UoJXApIiwgc3RyZWFtKTsKKyAgICBBTE9HRCgiJXMoJXApIGNhbGxlZCIsIF9fZnVuY19fLCBzdHJlYW0pOwogICAgIHJldHVybiBhdWRpb1N0cmVhbS0+c3lzdGVtUGF1c2UoKTsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0Rmx1c2goQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaCglcCkiLCBzdHJlYW0pOworICAgIEFMT0dEKCIlcyglcCkgY2FsbGVkIiwgX19mdW5jX18sIHN0cmVhbSk7CiAgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5zYWZlRmx1c2goKTsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoJXApIiwgc3RyZWFtKTsKLSAgICByZXR1cm4gYXVkaW9TdHJlYW0tPnN5c3RlbVN0b3AoKTsKKyAgICBBTE9HRCgiJXMoJXApIGNhbGxlZCIsIF9fZnVuY19fLCBzdHJlYW0pOworICAgIHJldHVybiBhdWRpb1N0cmVhbS0+c3lzdGVtU3RvcEZyb21BcHAoKTsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZShBQXVkaW9TdHJlYW0qIHN0cmVhbSwKQEAgLTQwOCw3ICs0MTAsOSBAQAogQUFVRElPX0FQSSBhYXVkaW9fZm9ybWF0X3QgQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIHJldHVybiBhdWRpb1N0cmVhbS0+Z2V0Rm9ybWF0KCk7CisgICAgLy8gVXNlIGF1ZGlvX2Zvcm1hdF90IGludGVybmFsbHkuCisgICAgYXVkaW9fZm9ybWF0X3QgaW50ZXJuYWxGb3JtYXQgPSBhdWRpb1N0cmVhbS0+Z2V0Rm9ybWF0KCk7CisgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdChpbnRlcm5hbEZvcm1hdCk7CiB9CiAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoQUF1ZGlvU3RyZWFtKiBzdHJlYW0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAKaW5kZXggZDU2NzAxYi4uODhkYTUzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcApAQCAtNDgsNiArNDgsMjAgQEAKICAgICBtSW5wdXRQcmVzZXQgICAgID0gb3RoZXIubUlucHV0UHJlc2V0OwogfQogCitzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IGlzRm9ybWF0VmFsaWQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfREVGQVVMVDoKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgYnJlYWs7IC8vIHZhbGlkCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiYXVkaW9Gb3JtYXQgbm90IHZhbGlkLCBhdWRpb19mb3JtYXRfdCA9IDB4JTA4eCIsIGZvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfRk9STUFUOworICAgICAgICAgICAgLy8gYnJlYWs7CisgICAgfQorICAgIHJldHVybiBBQVVESU9fT0s7Cit9CisKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzOjp2YWxpZGF0ZSgpIGNvbnN0IHsKICAgICBpZiAobVNhbXBsZXNQZXJGcmFtZSAhPSBBQVVESU9fVU5TUEVDSUZJRUQKICAgICAgICAgJiYgKG1TYW1wbGVzUGVyRnJhbWUgPCBTQU1QTEVTX1BFUl9GUkFNRV9NSU4gfHwgbVNhbXBsZXNQZXJGcmFtZSA+IFNBTVBMRVNfUEVSX0ZSQU1FX01BWCkpIHsKQEAgLTc5LDE2ICs5Myw4IEBACiAgICAgICAgICAgICAvLyBicmVhazsKICAgICB9CiAKLSAgICBzd2l0Y2ggKG1BdWRpb0Zvcm1hdCkgewotICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ6Ci0gICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTE2OgotICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUOgotICAgICAgICAgICAgYnJlYWs7IC8vIHZhbGlkCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiYXVkaW9Gb3JtYXQgbm90IHZhbGlkID0gJWQiLCBtQXVkaW9Gb3JtYXQpOwotICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0ZPUk1BVDsKLSAgICAgICAgICAgIC8vIGJyZWFrOwotICAgIH0KKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gaXNGb3JtYXRWYWxpZCAobUF1ZGlvRm9ybWF0KTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgcmV0dXJuIHJlc3VsdDsKIAogICAgIGlmIChtU2FtcGxlUmF0ZSAhPSBBQVVESU9fVU5TUEVDSUZJRUQKICAgICAgICAgJiYgKG1TYW1wbGVSYXRlIDwgU0FNUExFX1JBVEVfSFpfTUlOIHx8IG1TYW1wbGVSYXRlID4gU0FNUExFX1JBVEVfSFpfTUFYKSkgewpAQCAtMTUyLDYgKzE1OCw3IEBACiAgICAgICAgIGNhc2UgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9DT01NVU5JQ0FUSU9OOgogICAgICAgICBjYXNlIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT046CiAgICAgICAgIGNhc2UgQUFVRElPX0lOUFVUX1BSRVNFVF9VTlBST0NFU1NFRDoKKyAgICAgICAgY2FzZSBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1BFUkZPUk1BTkNFOgogICAgICAgICAgICAgYnJlYWs7IC8vIHZhbGlkCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRSgiaW5wdXQgcHJlc2V0IG5vdCB2YWxpZCA9ICVkIiwgbUlucHV0UHJlc2V0KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oCmluZGV4IGNlNWRhY2QuLjZiZWI0YjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaApAQCAtNTYsMTEgKzU2LDExIEBACiAgICAgICAgIG1TYW1wbGVzUGVyRnJhbWUgPSBzYW1wbGVzUGVyRnJhbWU7CiAgICAgfQogCi0gICAgYWF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpIGNvbnN0IHsKKyAgICBhdWRpb19mb3JtYXRfdCBnZXRGb3JtYXQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtQXVkaW9Gb3JtYXQ7CiAgICAgfQogCi0gICAgdm9pZCBzZXRGb3JtYXQoYWF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0KSB7CisgICAgdm9pZCBzZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQpIHsKICAgICAgICAgbUF1ZGlvRm9ybWF0ID0gYXVkaW9Gb3JtYXQ7CiAgICAgfQogCkBAIC0xMjAsOCArMTIwLDExIEBACiAgICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQHJldHVybiBieXRlcyBwZXIgZnJhbWUgb2YgZ2V0Rm9ybWF0KCkKKyAgICAgKi8KICAgICBpbnQzMl90IGNhbGN1bGF0ZUJ5dGVzUGVyRnJhbWUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBnZXRTYW1wbGVzUGVyRnJhbWUoKSAqIEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhnZXRGb3JtYXQoKSk7CisgICAgICAgIHJldHVybiBnZXRTYW1wbGVzUGVyRnJhbWUoKSAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZ2V0Rm9ybWF0KCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM5LDcgKzE0Miw3IEBACiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtRGV2aWNlSWQgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCAgICAgIG1TaGFyaW5nTW9kZSAgICAgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKLSAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICBtQXVkaW9Gb3JtYXQgICAgID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKKyAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICBtQXVkaW9Gb3JtYXQgICAgID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CiAgICAgYWF1ZGlvX2RpcmVjdGlvbl90ICAgICAgICAgbURpcmVjdGlvbiAgICAgICA9IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUOwogICAgIGFhdWRpb191c2FnZV90ICAgICAgICAgICAgIG1Vc2FnZSAgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90ICAgICAgbUNvbnRlbnRUeXBlICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uY3BwCmluZGV4IDM1ODAyMWIuLmUzOWEwNzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcApAQCAtMzcsNyArMzcsNiBAQAogfQogCiBBdWRpb1N0cmVhbTo6fkF1ZGlvU3RyZWFtKCkgewotICAgIEFMT0dEKCJkZXN0cm95aW5nICVwLCBzdGF0ZSA9ICVzIiwgdGhpcywgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChnZXRTdGF0ZSgpKSk7CiAgICAgLy8gSWYgdGhlIHN0cmVhbSBpcyBkZWxldGVkIHdoZW4gT1BFTiBvciBpbiB1c2UgdGhlbiBhdWRpbyByZXNvdXJjZXMgd2lsbCBsZWFrLgogICAgIC8vIFRoaXMgd291bGQgaW5kaWNhdGUgYW4gaW50ZXJuYWwgZXJyb3IuIFNvIHdlIHdhbnQgdG8gZmluZCB0aGlzIEFTQVAuCiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQKQEAgLTEyMCwyMSArMTE5LDI5IEBACiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzYWZlU3RhcnQoKSB7CithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnN5c3RlbVN0YXJ0KCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKKwogICAgIGlmIChjb2xsaWRlc1dpdGhDYWxsYmFjaygpKSB7CiAgICAgICAgIEFMT0dFKCIlcyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gYSBjYWxsYmFjayEiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9Ci0gICAgcmV0dXJuIHJlcXVlc3RTdGFydCgpOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHJlcXVlc3RTdGFydCgpOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIC8vIFdlIG9ubHkgY2FsbCB0aGlzIGZvciBsb2dnaW5nIGluICJkdW1wc3lzIGF1ZGlvIi4gU28gaWdub3JlIHJldHVybiBjb2RlLgorICAgICAgICAodm9pZCkgbVBsYXllckJhc2UtPnN0YXJ0KCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZVBhdXNlKCkgeworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzeXN0ZW1QYXVzZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTG9jayk7CisKICAgICBpZiAoIWlzUGF1c2VTdXBwb3J0ZWQoKSkgewogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQ7CiAgICAgfQogCi0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOwogICAgIGlmIChjb2xsaWRlc1dpdGhDYWxsYmFjaygpKSB7CiAgICAgICAgIEFMT0dFKCIlcyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gYSBjYWxsYmFjayEiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKQEAgLTE3MCw3ICsxNzcsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKLSAgICByZXR1cm4gcmVxdWVzdFBhdXNlKCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHJlcXVlc3RQYXVzZSgpOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIC8vIFdlIG9ubHkgY2FsbCB0aGlzIGZvciBsb2dnaW5nIGluICJkdW1wc3lzIGF1ZGlvIi4gU28gaWdub3JlIHJldHVybiBjb2RlLgorICAgICAgICAodm9pZCkgbVBsYXllckJhc2UtPnBhdXNlKCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZUZsdXNoKCkgewpAQCAtMTkzLDEyICsyMDUsMzEgQEAKICAgICByZXR1cm4gcmVxdWVzdEZsdXNoKCk7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZVN0b3AoKSB7CithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnN5c3RlbVN0b3BGcm9tQ2FsbGJhY2soKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzYWZlU3RvcCgpOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIC8vIFdlIG9ubHkgY2FsbCB0aGlzIGZvciBsb2dnaW5nIGluICJkdW1wc3lzIGF1ZGlvIi4gU28gaWdub3JlIHJldHVybiBjb2RlLgorICAgICAgICAodm9pZCkgbVBsYXllckJhc2UtPnN0b3AoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzeXN0ZW1TdG9wRnJvbUFwcCgpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTG9jayk7CiAgICAgaWYgKGNvbGxpZGVzV2l0aENhbGxiYWNrKCkpIHsKLSAgICAgICAgQUxPR0UoInN0cmVhbSBjYW5ub3QgYmUgc3RvcHBlZCBmcm9tIGEgY2FsbGJhY2shIik7CisgICAgICAgIEFMT0dFKCJzdHJlYW0gY2Fubm90IGJlIHN0b3BwZWQgYnkgY2FsbGluZyBmcm9tIGEgY2FsbGJhY2shIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNhZmVTdG9wKCk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgLy8gV2Ugb25seSBjYWxsIHRoaXMgZm9yIGxvZ2dpbmcgaW4gImR1bXBzeXMgYXVkaW8iLiBTbyBpZ25vcmUgcmV0dXJuIGNvZGUuCisgICAgICAgICh2b2lkKSBtUGxheWVyQmFzZS0+c3RvcCgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnNhZmVTdG9wKCkgewogCiAgICAgc3dpdGNoIChnZXRTdGF0ZSgpKSB7CiAgICAgICAgIC8vIFByb2NlZWQgd2l0aCBzdG9wcGluZy4KQEAgLTIyNSw3ICsyNTYsNyBAQAogICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0lORzoKICAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRDoKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCJyZXF1ZXN0U3RvcCgpIHN0cmVhbSBub3QgcnVubmluZywgc3RhdGUgPSAlcyIsCisgICAgICAgICAgICBBTE9HVygiJXMoKSBzdHJlYW0gbm90IHJ1bm5pbmcsIHN0YXRlID0gJXMiLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoZ2V0U3RhdGUoKSkpOwogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KQEAgLTM1MCwyMSArMzgxLDMzIEBACiAgICAgfQogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OmpvaW5UaHJlYWQodm9pZCoqIHJldHVybkFyZywgaW50NjRfdCB0aW1lb3V0TmFub3NlY29uZHMpCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OmpvaW5UaHJlYWQodm9pZCoqIHJldHVybkFyZywgaW50NjRfdCB0aW1lb3V0TmFub3NlY29uZHMgX191bnVzZWQpCiB7CiAgICAgaWYgKCFtSGFzVGhyZWFkKSB7CiAgICAgICAgIEFMT0dFKCJqb2luVGhyZWFkKCkgLSBidXQgaGFzIG5vIHRocmVhZCIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgLy8gSWYgdGhlIGNhbGxiYWNrIGlzIHN0b3BwaW5nIHRoZSBzdHJlYW0gYmVjYXVzZSB0aGUgYXBwIHBhc3NlZCBiYWNrIFNUT1AKKyAgICAvLyB0aGVuIHdlIGRvbid0IG5lZWQgdG8gam9pbigpLiBUaGUgdGhyZWFkIGlzIGFscmVhZHkgYWJvdXQgdG8gZXhpdC4KKyAgICBpZiAocHRocmVhZF9zZWxmKCkgIT0gbVRocmVhZCkgeworICAgICAgICAvLyBDYWxsZWQgZnJvbSBhbiBhcHAgdGhyZWFkLiBOb3QgdGhlIGNhbGxiYWNrLgogI2lmIDAKLSAgICAvLyBUT0RPIGltcGxlbWVudCBlcXVpdmFsZW50IG9mIHB0aHJlYWRfdGltZWRqb2luX25wKCkKLSAgICBzdHJ1Y3QgdGltZXNwZWMgYWJzdGltZTsKLSAgICBpbnQgZXJyID0gcHRocmVhZF90aW1lZGpvaW5fbnAobVRocmVhZCwgcmV0dXJuQXJnLCAmYWJzdGltZSk7CisgICAgICAgIC8vIFRPRE8gaW1wbGVtZW50IGVxdWl2YWxlbnQgb2YgcHRocmVhZF90aW1lZGpvaW5fbnAoKQorICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgYWJzdGltZTsKKyAgICAgICAgaW50IGVyciA9IHB0aHJlYWRfdGltZWRqb2luX25wKG1UaHJlYWQsIHJldHVybkFyZywgJmFic3RpbWUpOwogI2Vsc2UKLSAgICBpbnQgZXJyID0gcHRocmVhZF9qb2luKG1UaHJlYWQsIHJldHVybkFyZyk7CisgICAgICAgIGludCBlcnIgPSBwdGhyZWFkX2pvaW4obVRocmVhZCwgcmV0dXJuQXJnKTsKICNlbmRpZgorICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMoKSBwdGhyZWFkX2pvaW4oKSByZXR1cm5zIGVyciA9ICVkIiwgX19mdW5jX18sIGVycik7CisgICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdCgtZXJyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBUaGlzIG11c3QgYmUgc2V0IGZhbHNlIHNvIHRoYXQgdGhlIGNhbGxiYWNrIHRocmVhZCBjYW4gYmUgY3JlYXRlZAorICAgIC8vIHdoZW4gdGhlIHN0cmVhbSBpcyByZXN0YXJ0ZWQuCiAgICAgbUhhc1RocmVhZCA9IGZhbHNlOwotICAgIHJldHVybiBlcnIgPyBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdCgtZXJybm8pIDogbVRocmVhZFJlZ2lzdHJhdGlvblJlc3VsdDsKKyAgICByZXR1cm4gKHJlc3VsdCAhPSBBQVVESU9fT0spID8gcmVzdWx0IDogbVRocmVhZFJlZ2lzdHJhdGlvblJlc3VsdDsKIH0KIAogYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgQXVkaW9TdHJlYW06Om1heWJlQ2FsbERhdGFDYWxsYmFjayh2b2lkICphdWRpb0RhdGEsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCmluZGV4IDMxYjg5NWMuLjQ2OTUxZjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oCkBAIC01MSwyMSArNTEsNiBAQAogCiAgICAgdmlydHVhbCB+QXVkaW9TdHJlYW0oKTsKIAotICAgIC8qKgotICAgICAqIExvY2sgYSBtdXRleCBhbmQgbWFrZSBzdXJlIHdlIGFyZSBub3QgY2FsbGluZyBmcm9tIGEgY2FsbGJhY2sgZnVuY3Rpb24uCi0gICAgICogQHJldHVybiByZXN1bHQgb2YgcmVxdWVzdFN0YXJ0KCk7Ci0gICAgICovCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVTdGFydCgpOwotCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVQYXVzZSgpOwotCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVGbHVzaCgpOwotCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVTdG9wKCk7Ci0KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZUNsb3NlKCk7Ci0KLSAgICAvLyA9PT09PT09PT09PSBCZWdpbiBBQlNUUkFDVCBtZXRob2RzID09PT09PT09PT09PT09PT09PT09PT09PT09PQogcHJvdGVjdGVkOgogCiAgICAgLyogQXN5bmNocm9ub3VzIHJlcXVlc3RzLgpAQCAtNzQsNyArNTksNyBAQAogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RTdGFydCgpID0gMDsKIAogICAgIC8qKgotICAgICAqIENoZWNrIHRoZSBzdGF0ZSB0byBzZWUgaWYgUGF1c2UgaWYgY3VycmVudGx5IGxlZ2FsLgorICAgICAqIENoZWNrIHRoZSBzdGF0ZSB0byBzZWUgaWYgUGF1c2UgaXMgY3VycmVudGx5IGxlZ2FsLgogICAgICAqCiAgICAgICogQHBhcmFtIHJlc3VsdCBwb2ludGVyIHRvIHJldHVybiBjb2RlCiAgICAgICogQHJldHVybiB0cnVlIGlmIE9LIHRvIGNvbnRpbnVlLCBpZiBmYWxzZSB0aGVuIHJldHVybiByZXN1bHQKQEAgLTE5Miw3ICsxNzcsNyBAQAogICAgICAgICByZXR1cm4gbVNhbXBsZVJhdGU7CiAgICAgfQogCi0gICAgYWF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpICBjb25zdCB7CisgICAgYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1Gb3JtYXQ7CiAgICAgfQogCkBAIC0yNDksMjEgKzIzNCwxNCBAQAogICAgICAqIFRoaXMgaXMgb25seSB2YWxpZCBhZnRlciBzZXRGb3JtYXQoKSBoYXMgYmVlbiBjYWxsZWQuCiAgICAgICovCiAgICAgaW50MzJfdCBnZXRCeXRlc1BlclNhbXBsZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhtRm9ybWF0KTsKKyAgICAgICAgcmV0dXJuIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVGhpcyBpcyBvbmx5IHZhbGlkIGFmdGVyIHNldFNhbXBsZXNQZXJGcmFtZSgpIGFuZCBzZXREZXZpY2VGb3JtYXQoKSBoYXZlIGJlZW4gY2FsbGVkLgogICAgICAqLwogICAgIGludDMyX3QgZ2V0Qnl0ZXNQZXJEZXZpY2VGcmFtZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1TYW1wbGVzUGVyRnJhbWUgKiBnZXRCeXRlc1BlckRldmljZVNhbXBsZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgb25seSB2YWxpZCBhZnRlciBzZXREZXZpY2VGb3JtYXQoKSBoYXMgYmVlbiBjYWxsZWQuCi0gICAgICovCi0gICAgaW50MzJfdCBnZXRCeXRlc1BlckRldmljZVNhbXBsZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhnZXREZXZpY2VGb3JtYXQoKSk7CisgICAgICAgIHJldHVybiBnZXRTYW1wbGVzUGVyRnJhbWUoKSAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZ2V0RGV2aWNlRm9ybWF0KCkpOwogICAgIH0KIAogICAgIHZpcnR1YWwgaW50NjRfdCBnZXRGcmFtZXNXcml0dGVuKCkgPSAwOwpAQCAtMzYzLDMzICszNDEsMjggQEAKICAgICAgICAgbVBsYXllckJhc2UtPnVucmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKCk7CiAgICAgfQogCi0gICAgLy8gUGFzcyBzdGFydCByZXF1ZXN0IHRocm91Z2ggUGxheWVyQmFzZSBmb3IgdHJhY2tpbmcuCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVN0YXJ0KCkgewotICAgICAgICBtUGxheWVyQmFzZS0+c3RhcnQoKTsKLSAgICAgICAgLy8gUGFzcyBhYXVkaW9fcmVzdWx0X3QgYXJvdW5kIHRoZSBQbGF5ZXJCYXNlIGludGVyZmFjZSwgd2hpY2ggdXNlcyBzdGF0dXNfX3QuCi0gICAgICAgIHJldHVybiBtUGxheWVyQmFzZS0+Z2V0UmVzdWx0KCk7Ci0gICAgfQorICAgIGFhdWRpb19yZXN1bHRfdCBzeXN0ZW1TdGFydCgpOwogCi0gICAgLy8gUGFzcyBwYXVzZSByZXF1ZXN0IHRocm91Z2ggUGxheWVyQmFzZSBmb3IgdHJhY2tpbmcuCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVBhdXNlKCkgewotICAgICAgICBtUGxheWVyQmFzZS0+cGF1c2UoKTsKLSAgICAgICAgcmV0dXJuIG1QbGF5ZXJCYXNlLT5nZXRSZXN1bHQoKTsKLSAgICB9CisgICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVBhdXNlKCk7CiAKLSAgICAvLyBQYXNzIHN0b3AgcmVxdWVzdCB0aHJvdWdoIFBsYXllckJhc2UgZm9yIHRyYWNraW5nLgotICAgIGFhdWRpb19yZXN1bHRfdCBzeXN0ZW1TdG9wKCkgewotICAgICAgICBtUGxheWVyQmFzZS0+c3RvcCgpOwotICAgICAgICByZXR1cm4gbVBsYXllckJhc2UtPmdldFJlc3VsdCgpOwotICAgIH0KKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZUZsdXNoKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGFuIGFwcCBjYWxscyBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoKTsKKyAgICAgKiBJdCBwcmV2ZW50cyBjYWxscyBmcm9tIGEgY2FsbGJhY2suCisgICAgICovCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVN0b3BGcm9tQXBwKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGNhbGxlZCBpbnRlcm5hbGx5IHdoZW4gYW4gYXBwIGNhbGxiYWNrIHJldHVybnMgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QLgorICAgICAqLworICAgIGFhdWRpb19yZXN1bHRfdCBzeXN0ZW1TdG9wRnJvbUNhbGxiYWNrKCk7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZUNsb3NlKCk7CiAKIHByb3RlY3RlZDoKIAotICAgIC8vIFBsYXllckJhc2UgYWxsb3dzIHRoZSBzeXN0ZW0gdG8gY29udHJvbCB0aGUgc3RyZWFtLgotICAgIC8vIENhbGxpbmcgdGhyb3VnaCBQbGF5ZXJCYXNlLT5zdGFydCgpIG5vdGlmaWVzIHRoZSBBdWRpb01hbmFnZXIgb2YgdGhlIHBsYXllciBzdGF0ZS4KLSAgICAvLyBUaGUgQXVkaW9NYW5hZ2VyIGFsc28gY2FuIHN0YXJ0L3N0b3AgYSBzdHJlYW0gYnkgY2FsbGluZyBtUGxheWVyQmFzZS0+cGxheWVyU3RhcnQoKS4KLSAgICAvLyBzeXN0ZW1TdGFydCgpID09PiBtUGxheWVyQmFzZS0+c3RhcnQoKSAgIG1QbGF5ZXJCYXNlLT5wbGF5ZXJTdGFydCgpID09PiByZXF1ZXN0U3RhcnQoKQotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8KLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0gQXVkaW9NYW5hZ2VyIC0tLS0tLS0KKyAgICAvLyBQbGF5ZXJCYXNlIGFsbG93cyB0aGUgc3lzdGVtIHRvIGNvbnRyb2wgdGhlIHN0cmVhbSB2b2x1bWUuCiAgICAgY2xhc3MgTXlQbGF5ZXJCYXNlIDogcHVibGljIGFuZHJvaWQ6OlBsYXllckJhc2UgewogICAgIHB1YmxpYzoKICAgICAgICAgZXhwbGljaXQgTXlQbGF5ZXJCYXNlKEF1ZGlvU3RyZWFtICpwYXJlbnQpOwpAQCAtNDEzLDIwICszODYsMTkgQEAKIAogICAgICAgICB2b2lkIGNsZWFyUGFyZW50UmVmZXJlbmNlKCkgeyBtUGFyZW50ID0gbnVsbHB0cjsgfQogCisgICAgICAgIC8vIEp1c3QgYSBzdHViLiBUaGUgYWJpbGl0eSB0byBzdGFydCBhdWRpbyB0aHJvdWdoIFBsYXllckJhc2UgaXMgYmVpbmcgZGVwcmVjYXRlZC4KICAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGxheWVyU3RhcnQoKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICAvLyBtUGFyZW50IHNob3VsZCBOT1QgYmUgbnVsbC4gU28gZ28gYWhlYWQgYW5kIGNyYXNoIGlmIGl0IGlzLgotICAgICAgICAgICAgbVJlc3VsdCA9IG1QYXJlbnQtPnNhZmVTdGFydCgpOwotICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKG1SZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6Ok5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gSnVzdCBhIHN0dWIuIFRoZSBhYmlsaXR5IHRvIHBhdXNlIGF1ZGlvIHRocm91Z2ggUGxheWVyQmFzZSBpcyBiZWluZyBkZXByZWNhdGVkLgogICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCBwbGF5ZXJQYXVzZSgpIG92ZXJyaWRlIHsKLSAgICAgICAgICAgIG1SZXN1bHQgPSBtUGFyZW50LT5zYWZlUGF1c2UoKTsKLSAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhtUmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIC8vIEp1c3QgYSBzdHViLiBUaGUgYWJpbGl0eSB0byBzdG9wIGF1ZGlvIHRocm91Z2ggUGxheWVyQmFzZSBpcyBiZWluZyBkZXByZWNhdGVkLgogICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCBwbGF5ZXJTdG9wKCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgbVJlc3VsdCA9IG1QYXJlbnQtPnNhZmVTdG9wKCk7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXMobVJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6Tk9fRVJST1I7CiAgICAgICAgIH0KIAogICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCBwbGF5ZXJTZXRWb2x1bWUoKSBvdmVycmlkZSB7CkBAIC00NzgsMTggKzQ1MCwxOCBAQAogICAgIC8qKgogICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgogICAgICAqLwotICAgIHZvaWQgc2V0Rm9ybWF0KGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICB2b2lkIHNldEZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKICAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBvcGVuKCkgY2FsbC4KICAgICAgKi8KLSAgICB2b2lkIHNldERldmljZUZvcm1hdChhYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgdm9pZCBzZXREZXZpY2VGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CiAgICAgICAgIG1EZXZpY2VGb3JtYXQgPSBmb3JtYXQ7CiAgICAgfQogCi0gICAgYWF1ZGlvX2Zvcm1hdF90IGdldERldmljZUZvcm1hdCgpIGNvbnN0IHsKKyAgICBhdWRpb19mb3JtYXRfdCBnZXREZXZpY2VGb3JtYXQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtRGV2aWNlRm9ybWF0OwogICAgIH0KIApAQCAtNTU1LDYgKzUyNyw4IEBACiAKIHByaXZhdGU6CiAKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZVN0b3AoKTsKKwogICAgIHN0ZDo6bXV0ZXggICAgICAgICAgICAgICAgIG1TdHJlYW1Mb2NrOwogCiAgICAgY29uc3QgYW5kcm9pZDo6c3A8TXlQbGF5ZXJCYXNlPiAgIG1QbGF5ZXJCYXNlOwpAQCAtNTY1LDcgKzUzOSw3IEBACiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VJZCA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgICAgICAgbVNoYXJpbmdNb2RlID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQgPSBmYWxzZTsgLy8gbXVzdCBtYXRjaCBzaGFyaW5nIG1vZGUgcmVxdWVzdGVkCi0gICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgIG1Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOworICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgICBtRm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CiAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90ICAgICAgIG1TdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfVU5JTklUSUFMSVpFRDsKICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90ICAgbVBlcmZvcm1hbmNlTW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU7CiAKQEAgLTU3Nyw3ICs1NTEsNyBAQAogCiAgICAgLy8gU29tZXRpbWVzIHRoZSBoYXJkd2FyZSBpcyBvcGVyYXRpbmcgd2l0aCBhIGRpZmZlcmVudCBmb3JtYXQgZnJvbSB0aGUgYXBwLgogICAgIC8vIFRoZW4gd2UgcmVxdWlyZSBjb252ZXJzaW9uIGluIEFBdWRpby4KLSAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgbURldmljZUZvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CisgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgIG1EZXZpY2VGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKIAogICAgIC8vIGNhbGxiYWNrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwCmluZGV4IGIwOTI1OGUuLmY1MTEzZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAKQEAgLTIzLDMwICsyMywyNiBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgIkZpZm9Db250cm9sbGVyQmFzZS5oIgogI2luY2x1ZGUgIkZpZm9Db250cm9sbGVyLmgiCiAjaW5jbHVkZSAiRmlmb0NvbnRyb2xsZXJJbmRpcmVjdC5oIgogI2luY2x1ZGUgIkZpZm9CdWZmZXIuaCIKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7IC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCit1c2luZyBhbmRyb2lkOjpGaWZvQnVmZmVyOwordXNpbmcgYW5kcm9pZDo6Zmlmb19mcmFtZXNfdDsKIAogRmlmb0J1ZmZlcjo6Rmlmb0J1ZmZlcihpbnQzMl90IGJ5dGVzUGVyRnJhbWUsIGZpZm9fZnJhbWVzX3QgY2FwYWNpdHlJbkZyYW1lcykKLSAgICAgICAgOiBtRnJhbWVDYXBhY2l0eShjYXBhY2l0eUluRnJhbWVzKQotICAgICAgICAsIG1CeXRlc1BlckZyYW1lKGJ5dGVzUGVyRnJhbWUpCi0gICAgICAgICwgbVN0b3JhZ2UobnVsbHB0cikKLSAgICAgICAgLCBtRnJhbWVzUmVhZENvdW50KDApCi0gICAgICAgICwgbUZyYW1lc1VuZGVycnVuQ291bnQoMCkKLSAgICAgICAgLCBtVW5kZXJydW5Db3VudCgwKQorICAgICAgICA6IG1CeXRlc1BlckZyYW1lKGJ5dGVzUGVyRnJhbWUpCiB7Ci0gICAgLy8gVE9ETyBIYW5kbGUgcG9zc2libGUgZmFpbHVyZXMgdG8gYWxsb2NhdGUuIE1vdmUgb3V0IG9mIGNvbnN0cnVjdG9yPwotICAgIG1GaWZvID0gbmV3IEZpZm9Db250cm9sbGVyKGNhcGFjaXR5SW5GcmFtZXMsIGNhcGFjaXR5SW5GcmFtZXMpOworICAgIG1GaWZvID0gc3RkOjptYWtlX3VuaXF1ZTxGaWZvQ29udHJvbGxlcj4oY2FwYWNpdHlJbkZyYW1lcywgY2FwYWNpdHlJbkZyYW1lcyk7CiAgICAgLy8gYWxsb2NhdGUgYnVmZmVyCiAgICAgaW50MzJfdCBieXRlc1BlckJ1ZmZlciA9IGJ5dGVzUGVyRnJhbWUgKiBjYXBhY2l0eUluRnJhbWVzOwogICAgIG1TdG9yYWdlID0gbmV3IHVpbnQ4X3RbYnl0ZXNQZXJCdWZmZXJdOwogICAgIG1TdG9yYWdlT3duZWQgPSB0cnVlOwotICAgIEFMT0dWKCJjYXBhY2l0eUluRnJhbWVzID0gJWQsIGJ5dGVzUGVyRnJhbWUgPSAlZCIsCi0gICAgICAgICAgY2FwYWNpdHlJbkZyYW1lcywgYnl0ZXNQZXJGcmFtZSk7CisgICAgQUxPR1YoIiVzKCkgY2FwYWNpdHlJbkZyYW1lcyA9ICVkLCBieXRlc1BlckZyYW1lID0gJWQiLAorICAgICAgICAgIF9fZnVuY19fLCBjYXBhY2l0eUluRnJhbWVzLCBieXRlc1BlckZyYW1lKTsKIH0KIAogRmlmb0J1ZmZlcjo6Rmlmb0J1ZmZlciggaW50MzJfdCAgIGJ5dGVzUGVyRnJhbWUsCkBAIC01NSwxNCArNTEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZpZm9fY291bnRlcl90ICogIHdyaXRlSW5kZXhBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqICBkYXRhU3RvcmFnZUFkZHJlc3MKICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgOiBtRnJhbWVDYXBhY2l0eShjYXBhY2l0eUluRnJhbWVzKQotICAgICAgICAsIG1CeXRlc1BlckZyYW1lKGJ5dGVzUGVyRnJhbWUpCisgICAgICAgIDogbUJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSkKICAgICAgICAgLCBtU3RvcmFnZShzdGF0aWNfY2FzdDx1aW50OF90ICo+KGRhdGFTdG9yYWdlQWRkcmVzcykpCi0gICAgICAgICwgbUZyYW1lc1JlYWRDb3VudCgwKQotICAgICAgICAsIG1GcmFtZXNVbmRlcnJ1bkNvdW50KDApCi0gICAgICAgICwgbVVuZGVycnVuQ291bnQoMCkKIHsKLSAgICBtRmlmbyA9IG5ldyBGaWZvQ29udHJvbGxlckluZGlyZWN0KGNhcGFjaXR5SW5GcmFtZXMsCisgICAgbUZpZm8gPSBzdGQ6Om1ha2VfdW5pcXVlPEZpZm9Db250cm9sbGVySW5kaXJlY3Q+KGNhcGFjaXR5SW5GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eUluRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEluZGV4QWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSW5kZXhBZGRyZXNzKTsKQEAgLTczLDEwICs2NSw4IEBACiAgICAgaWYgKG1TdG9yYWdlT3duZWQpIHsKICAgICAgICAgZGVsZXRlW10gbVN0b3JhZ2U7CiAgICAgfQotICAgIGRlbGV0ZSBtRmlmbzsKIH0KIAotCiBpbnQzMl90IEZpZm9CdWZmZXI6OmNvbnZlcnRGcmFtZXNUb0J5dGVzKGZpZm9fZnJhbWVzX3QgZnJhbWVzKSB7CiAgICAgcmV0dXJuIGZyYW1lcyAqIG1CeXRlc1BlckZyYW1lOwogfQpAQCAtODcsMTEgKzc3LDEyIEBACiAgICAgd3JhcHBpbmdCdWZmZXItPmRhdGFbMV0gPSBudWxscHRyOwogICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMV0gPSAwOwogICAgIGlmIChmcmFtZXNBdmFpbGFibGUgPiAwKSB7CisgICAgICAgIGZpZm9fZnJhbWVzX3QgY2FwYWNpdHkgPSBtRmlmby0+Z2V0Q2FwYWNpdHkoKTsKICAgICAgICAgdWludDhfdCAqc291cmNlID0gJm1TdG9yYWdlW2NvbnZlcnRGcmFtZXNUb0J5dGVzKHN0YXJ0SW5kZXgpXTsKICAgICAgICAgLy8gRG9lcyB0aGUgYXZhaWxhYmxlIGRhdGEgY3Jvc3MgdGhlIGVuZCBvZiB0aGUgRklGTz8KLSAgICAgICAgaWYgKChzdGFydEluZGV4ICsgZnJhbWVzQXZhaWxhYmxlKSA+IG1GcmFtZUNhcGFjaXR5KSB7CisgICAgICAgIGlmICgoc3RhcnRJbmRleCArIGZyYW1lc0F2YWlsYWJsZSkgPiBjYXBhY2l0eSkgewogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPmRhdGFbMF0gPSBzb3VyY2U7Ci0gICAgICAgICAgICBmaWZvX2ZyYW1lc190IGZpcnN0RnJhbWVzID0gbUZyYW1lQ2FwYWNpdHkgLSBzdGFydEluZGV4OworICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBmaXJzdEZyYW1lcyA9IGNhcGFjaXR5IC0gc3RhcnRJbmRleDsKICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMF0gPSBmaXJzdEZyYW1lczsKICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5kYXRhWzFdID0gJm1TdG9yYWdlWzBdOwogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPm51bUZyYW1lc1sxXSA9IGZyYW1lc0F2YWlsYWJsZSAtIGZpcnN0RnJhbWVzOwpAQCAtMTA3LDcgKzk4LDggQEAKIAogZmlmb19mcmFtZXNfdCBGaWZvQnVmZmVyOjpnZXRGdWxsRGF0YUF2YWlsYWJsZShXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIpIHsKICAgICAvLyBUaGUgRklGTyBtaWdodCBiZSBvdmVyZnVsbCBzbyBjbGlwIHRvIGNhcGFjaXR5LgotICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0gc3RkOjptaW4obUZpZm8tPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKSwgbUZyYW1lQ2FwYWNpdHkpOworICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0gc3RkOjptaW4obUZpZm8tPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GaWZvLT5nZXRDYXBhY2l0eSgpKTsKICAgICBmaWZvX2ZyYW1lc190IHN0YXJ0SW5kZXggPSBtRmlmby0+Z2V0UmVhZEluZGV4KCk7CiAgICAgZmlsbFdyYXBwaW5nQnVmZmVyKHdyYXBwaW5nQnVmZmVyLCBmcmFtZXNBdmFpbGFibGUsIHN0YXJ0SW5kZXgpOwogICAgIHJldHVybiBmcmFtZXNBdmFpbGFibGU7CkBAIC0xMTUsNyArMTA3LDggQEAKIAogZmlmb19mcmFtZXNfdCBGaWZvQnVmZmVyOjpnZXRFbXB0eVJvb21BdmFpbGFibGUoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyKSB7CiAgICAgLy8gVGhlIEZJRk8gbWlnaHQgaGF2ZSB1bmRlcnJ1biBzbyBjbGlwIHRvIGNhcGFjaXR5LgotICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0gc3RkOjptaW4obUZpZm8tPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCksIG1GcmFtZUNhcGFjaXR5KTsKKyAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9IHN0ZDo6bWluKG1GaWZvLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpZm8tPmdldENhcGFjaXR5KCkpOwogICAgIGZpZm9fZnJhbWVzX3Qgc3RhcnRJbmRleCA9IG1GaWZvLT5nZXRXcml0ZUluZGV4KCk7CiAgICAgZmlsbFdyYXBwaW5nQnVmZmVyKHdyYXBwaW5nQnVmZmVyLCBmcmFtZXNBdmFpbGFibGUsIHN0YXJ0SW5kZXgpOwogICAgIHJldHVybiBmcmFtZXNBdmFpbGFibGU7CkBAIC0xODMsMjMgKzE3Niw2IEBACiAgICAgcmV0dXJuIGZyYW1lc1dyaXR0ZW47CiB9CiAKLWZpZm9fZnJhbWVzX3QgRmlmb0J1ZmZlcjo6cmVhZE5vdyh2b2lkICpidWZmZXIsIGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7Ci0gICAgbUxhc3RSZWFkU2l6ZSA9IG51bUZyYW1lczsKLSAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0xlZnQgPSBudW1GcmFtZXM7Ci0gICAgZmlmb19mcmFtZXNfdCBmcmFtZXNSZWFkID0gcmVhZChidWZmZXIsIG51bUZyYW1lcyk7Ci0gICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNSZWFkOwotICAgIG1GcmFtZXNSZWFkQ291bnQgKz0gZnJhbWVzUmVhZDsKLSAgICBtRnJhbWVzVW5kZXJydW5Db3VudCArPSBmcmFtZXNMZWZ0OwotICAgIC8vIFplcm8gb3V0IGFueSBzYW1wbGVzIHdlIGNvdWxkIG5vdCBzZXQuCi0gICAgaWYgKGZyYW1lc0xlZnQgPiAwKSB7Ci0gICAgICAgIG1VbmRlcnJ1bkNvdW50Kys7Ci0gICAgICAgIGludDMyX3QgYnl0ZXNUb1plcm8gPSBjb252ZXJ0RnJhbWVzVG9CeXRlcyhmcmFtZXNMZWZ0KTsKLSAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMCwgYnl0ZXNUb1plcm8pOwotICAgIH0KLQotICAgIHJldHVybiBmcmFtZXNSZWFkOwotfQotCiBmaWZvX2ZyYW1lc190IEZpZm9CdWZmZXI6OmdldFRocmVzaG9sZCgpIHsKICAgICByZXR1cm4gbUZpZm8tPmdldFRocmVzaG9sZCgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmgKaW5kZXggZjVhOWUyNy4uMGQxODhjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaWZuZGVmIEZJRk9fRklGT19CVUZGRVJfSAogI2RlZmluZSBGSUZPX0ZJRk9fQlVGRkVSX0gKIAorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgIkZpZm9Db250cm9sbGVyQmFzZS5oIgpAQCAtNzcsMjQgKzc4LDEyIEBACiAgICAgICovCiAgICAgZmlmb19mcmFtZXNfdCBnZXRFbXB0eVJvb21BdmFpbGFibGUoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyKTsKIAotICAgIC8qKgotICAgICAqIENvcHkgZGF0YSBmcm9tIHRoZSBGSUZPIGludG8gdGhlIGJ1ZmZlci4KLSAgICAgKiBAcGFyYW0gYnVmZmVyCi0gICAgICogQHBhcmFtIG51bUZyYW1lcwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBmaWZvX2ZyYW1lc190IHJlYWROb3codm9pZCAqYnVmZmVyLCBmaWZvX2ZyYW1lc190IG51bUZyYW1lcyk7Ci0KLSAgICBpbnQ2NF90IGdldE5leHRSZWFkVGltZShpbnQzMl90IGZyYW1lUmF0ZSk7Ci0KLSAgICBpbnQzMl90IGdldFVuZGVycnVuQ291bnQoKSBjb25zdCB7IHJldHVybiBtVW5kZXJydW5Db3VudDsgfQotCi0gICAgRmlmb0NvbnRyb2xsZXJCYXNlICpnZXRGaWZvQ29udHJvbGxlckJhc2UoKSB7IHJldHVybiBtRmlmbzsgfQotCiAgICAgaW50MzJfdCBnZXRCeXRlc1BlckZyYW1lKCkgewogICAgICAgICByZXR1cm4gbUJ5dGVzUGVyRnJhbWU7CiAgICAgfQogCisgICAgLy8gUHJveHkgbWV0aG9kcyBmb3IgdGhlIGludGVybmFsIEZpZm9Db250cm9sbGVyCisKICAgICBmaWZvX2NvdW50ZXJfdCBnZXRSZWFkQ291bnRlcigpIHsKICAgICAgICAgcmV0dXJuIG1GaWZvLT5nZXRSZWFkQ291bnRlcigpOwogICAgIH0KQEAgLTExMSw2ICsxMDAsMjIgQEAKICAgICAgICAgbUZpZm8tPnNldFdyaXRlQ291bnRlcihuKTsKICAgICB9CiAKKyAgICB2b2lkIGFkdmFuY2VSZWFkSW5kZXgoZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKKyAgICAgICAgbUZpZm8tPmFkdmFuY2VSZWFkSW5kZXgobnVtRnJhbWVzKTsKKyAgICB9CisKKyAgICB2b2lkIGFkdmFuY2VXcml0ZUluZGV4KGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7CisgICAgICAgIG1GaWZvLT5hZHZhbmNlV3JpdGVJbmRleChudW1GcmFtZXMpOworICAgIH0KKworICAgIGZpZm9fZnJhbWVzX3QgZ2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSB7CisgICAgICAgIHJldHVybiBtRmlmby0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICB9CisKKyAgICBmaWZvX2ZyYW1lc190IGdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKSB7CisgICAgICAgIHJldHVybiBtRmlmby0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgIH0KKwogICAgIC8qCiAgICAgICogVGhpcyBpcyBnZW5lcmFsbHkgb25seSBjYWxsZWQgYmVmb3JlIG9yIGFmdGVyIHRoZSBidWZmZXIgaXMgdXNlZC4KICAgICAgKi8KQEAgLTEyMSwxNSArMTI2LDEyIEBACiAgICAgdm9pZCBmaWxsV3JhcHBpbmdCdWZmZXIoV3JhcHBpbmdCdWZmZXIgKndyYXBwaW5nQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzQXZhaWxhYmxlLCBpbnQzMl90IHN0YXJ0SW5kZXgpOwogCi0gICAgY29uc3QgZmlmb19mcmFtZXNfdCBtRnJhbWVDYXBhY2l0eTsKLSAgICBjb25zdCBpbnQzMl90IG1CeXRlc1BlckZyYW1lOwotICAgIHVpbnQ4X3QgKm1TdG9yYWdlOwotICAgIGJvb2wgbVN0b3JhZ2VPd25lZDsgLy8gZGlkIHRoaXMgb2JqZWN0IGFsbG9jYXRlIHRoZSBzdG9yYWdlPwotICAgIEZpZm9Db250cm9sbGVyQmFzZSAqbUZpZm87Ci0gICAgZmlmb19jb3VudGVyX3QgbUZyYW1lc1JlYWRDb3VudDsKLSAgICBmaWZvX2NvdW50ZXJfdCBtRnJhbWVzVW5kZXJydW5Db3VudDsKLSAgICBpbnQzMl90IG1VbmRlcnJ1bkNvdW50OyAvLyBuZWVkPyBqdXN0IHVzZSBmcmFtZXMKLSAgICBpbnQzMl90IG1MYXN0UmVhZFNpemU7CisgICAgY29uc3QgaW50MzJfdCAgICAgICAgICAgICBtQnl0ZXNQZXJGcmFtZTsKKyAgICAvLyBXZSBkbyBub3QgdXNlIGEgc3RkOjp1bmlxdWVfcHRyIGZvciBtU3RvcmFnZSBiZWNhdXNlIGl0IGlzIG9mdGVuIGEgcG9pbnRlciB0bworICAgIC8vIG1lbW9yeSBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMgYW5kIGNhbm5vdCBiZSBkZWxldGVkIHRyaXZpYWxseS4KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgKm1TdG9yYWdlID0gbnVsbHB0cjsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgIG1TdG9yYWdlT3duZWQgPSBmYWxzZTsgLy8gZGlkIHRoaXMgb2JqZWN0IGFsbG9jYXRlIHRoZSBzdG9yYWdlPworICAgIHN0ZDo6dW5pcXVlX3B0cjxGaWZvQ29udHJvbGxlckJhc2U+IG1GaWZve307CiB9OwogCiB9ICAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlci5oCmluZGV4IDc5ZDk4YTEuLjA1N2E5NGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlci5oCkBAIC0zMCw3ICszMCw3IEBACiBjbGFzcyBGaWZvQ29udHJvbGxlciA6IHB1YmxpYyBGaWZvQ29udHJvbGxlckJhc2UKIHsKIHB1YmxpYzoKLSAgICBGaWZvQ29udHJvbGxlcihmaWZvX2NvdW50ZXJfdCBidWZmZXJTaXplLCBmaWZvX2NvdW50ZXJfdCB0aHJlc2hvbGQpCisgICAgRmlmb0NvbnRyb2xsZXIoZmlmb19mcmFtZXNfdCBidWZmZXJTaXplLCBmaWZvX2ZyYW1lc190IHRocmVzaG9sZCkKICAgICA6IEZpZm9Db250cm9sbGVyQmFzZShidWZmZXJTaXplLCB0aHJlc2hvbGQpCiAgICAgLCBtUmVhZENvdW50ZXIoMCkKICAgICAsIG1Xcml0ZUNvdW50ZXIoMCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAKaW5kZXggNTFhOGUzNC4uNjZlMjQ3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAKQEAgLTU5LDUgKzU5LDEwIEBACiB9CiAKIHZvaWQgRmlmb0NvbnRyb2xsZXJCYXNlOjpzZXRUaHJlc2hvbGQoZmlmb19mcmFtZXNfdCB0aHJlc2hvbGQpIHsKKyAgICBpZiAodGhyZXNob2xkID4gbUNhcGFjaXR5KSB7CisgICAgICAgIHRocmVzaG9sZCA9IG1DYXBhY2l0eTsKKyAgICB9IGVsc2UgaWYgKHRocmVzaG9sZCA8IDApIHsKKyAgICAgICAgdGhyZXNob2xkID0gMDsKKyAgICB9CiAgICAgbVRocmVzaG9sZCA9IHRocmVzaG9sZDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuaAppbmRleCA2NGFmNzc3Li4xZWRiOGEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5oCkBAIC0xMDIsNiArMTAyLDkgQEAKICAgICAvKioKICAgICAgKiBZb3UgY2FuIHJlcXVlc3QgdGhhdCB0aGUgYnVmZmVyIG5vdCBiZSBmaWxsZWQgYWJvdmUgYSBtYXhpbXVtCiAgICAgICogbnVtYmVyIG9mIGZyYW1lcy4KKyAgICAgKgorICAgICAqIFRoZSB0aHJlc2hvbGQgd2lsbCBiZSBjbGlwcGVkIGJldHdlZW4gemVybyBhbmQgdGhlIGJ1ZmZlciBjYXBhY2l0eS4KKyAgICAgKgogICAgICAqIEBwYXJhbSB0aHJlc2hvbGQgZWZmZWN0aXZlIHNpemUgb2YgdGhlIGJ1ZmZlcgogICAgICAqLwogICAgIHZvaWQgc2V0VGhyZXNob2xkKGZpZm9fZnJhbWVzX3QgdGhyZXNob2xkKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NjdmZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuY3BwCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IEF1ZGlvUHJvY2Vzc29yQmFzZTo6cHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGlmIChmcmFtZVBvc2l0aW9uID4gbUxhc3RGcmFtZVBvc2l0aW9uKSB7CisgICAgICAgIG1MYXN0RnJhbWVQb3NpdGlvbiA9IGZyYW1lUG9zaXRpb247CisgICAgICAgIG1GcmFtZXNWYWxpZCA9IG9uUHJvY2VzcyhmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOworICAgIH0KKyAgICByZXR1cm4gbUZyYW1lc1ZhbGlkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQXVkaW9GbG9hdEJsb2NrUG9ydDo6QXVkaW9GbG9hdEJsb2NrUG9ydChBdWRpb1Byb2Nlc3NvckJhc2UgJnBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lc1BlckJsb2NrKQorICAgICAgICA6IEF1ZGlvUG9ydChwYXJlbnQsIHNhbXBsZXNQZXJGcmFtZSkKKyAgICAgICAgLCBtRnJhbWVzUGVyQmxvY2soZnJhbWVzUGVyQmxvY2spCisgICAgICAgICwgbVNhbXBsZUJsb2NrKE5VTEwpIHsKKyAgICBpbnQzMl90IG51bUZsb2F0cyA9IGZyYW1lc1BlckJsb2NrICogZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgbVNhbXBsZUJsb2NrID0gbmV3IGZsb2F0W251bUZsb2F0c117MC4wZn07Cit9CisKK0F1ZGlvRmxvYXRCbG9ja1BvcnQ6On5BdWRpb0Zsb2F0QmxvY2tQb3J0KCkgeworICAgIGRlbGV0ZVtdIG1TYW1wbGVCbG9jazsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgQXVkaW9GbG9hdE91dHB1dFBvcnQ6OnB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBudW1GcmFtZXMgPSBzdGQ6Om1pbihnZXRGcmFtZXNQZXJCbG9jaygpLCBudW1GcmFtZXMpOworICAgIHJldHVybiBtUGFyZW50LnB1bGxEYXRhKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7Cit9CisKKy8vIFRoZXNlIG5lZWQgdG8gYmUgaW4gdGhlIC5jcHAgZmlsZSBiZWNhdXNlIG9mIGZvcndhcmQgY3Jvc3MgcmVmZXJlbmNlcy4KK3ZvaWQgQXVkaW9GbG9hdE91dHB1dFBvcnQ6OmNvbm5lY3QoQXVkaW9GbG9hdElucHV0UG9ydCAqcG9ydCkgeworICAgIHBvcnQtPmNvbm5lY3QodGhpcyk7Cit9CisKK3ZvaWQgQXVkaW9GbG9hdE91dHB1dFBvcnQ6OmRpc2Nvbm5lY3QoQXVkaW9GbG9hdElucHV0UG9ydCAqcG9ydCkgeworICAgIHBvcnQtPmRpc2Nvbm5lY3QodGhpcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IEF1ZGlvRmxvYXRJbnB1dFBvcnQ6OnB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICByZXR1cm4gKG1Db25uZWN0ZWQgPT0gTlVMTCkKKyAgICAgICAgICAgID8gc3RkOjptaW4oZ2V0RnJhbWVzUGVyQmxvY2soKSwgbnVtRnJhbWVzKQorICAgICAgICAgICAgOiBtQ29ubmVjdGVkLT5wdWxsRGF0YShmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOworfQorCitmbG9hdCAqQXVkaW9GbG9hdElucHV0UG9ydDo6Z2V0QmxvY2soKSB7CisgICAgaWYgKG1Db25uZWN0ZWQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQXVkaW9GbG9hdEJsb2NrUG9ydDo6Z2V0QmxvY2soKTsgLy8gbG9hZGVkIHVzaW5nIHNldFZhbHVlKCkKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbUNvbm5lY3RlZC0+Z2V0QmxvY2soKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IEF1ZGlvU2luazo6cHVsbChpbnQzMl90IG51bUZyYW1lcykgeworICAgIGludDMyX3QgYWN0dWFsRnJhbWVzID0gaW5wdXQucHVsbERhdGEobUZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7CisgICAgbUZyYW1lUG9zaXRpb24gKz0gYWN0dWFsRnJhbWVzOworICAgIHJldHVybiBhY3R1YWxGcmFtZXM7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGE0NmFlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmgKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBBdWRpb1Byb2Nlc3NvckJhc2UuaAorICoKKyAqIEF1ZGlvIHByb2Nlc3Npbmcgbm9kZSBhbmQgcG9ydHMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHNpbXBsZSBkYXRhIGZsb3cgZ3JhcGguCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfQVVESU9fUFJPQ0VTU09SX0JBU0VfSAorI2RlZmluZSBGTE9XR1JBUEhfQVVESU9fUFJPQ0VTU09SX0JBU0VfSAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKy8vIFRPRE8gY29uc2lkZXIgcHVibGlzaGluZyBhbGwgaGVhZGVyIGZpbGVzIHVuZGVyICJpbmNsdWRlL2xpYmFhdWRpby9GbG93R3JhcGguaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKKy8vIERlZmF1bHQgYmxvY2sgc2l6ZSB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIHdoZW4gdGhlIEF1ZGlvRmxvYXRCbG9ja1BvcnQgaXMgY3JlYXRlZC4KKy8vIElmIGl0IGlzIHRvbyBzbWFsbCB0aGVuIHdlIHdpbGwgaGF2ZSB0b28gbXVjaCBvdmVyaGVhZCBmcm9tIHN3aXRjaGluZyBiZXR3ZWVuIG5vZGVzLgorLy8gSWYgaXQgaXMgdG9vIGhpZ2ggdGhlbiB3ZSB3aWxsIHRocmFzaCB0aGUgY2FjaGVzLgorY29uc3RleHByIGludCBrRGVmYXVsdEJsb2NrU2l6ZSA9IDg7IC8vIGFyYml0cmFyeQorCitjbGFzcyBBdWRpb0Zsb2F0SW5wdXRQb3J0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2xhc3MgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5BdWRpb1Byb2Nlc3NvckJhc2UoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGN1c3RvbSBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFtZVBvc2l0aW9uIGluZGV4IG9mIGZpcnN0IGZyYW1lIHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSBudW1GcmFtZXMgbWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIHJlcXVlc3RlZCBmb3IgcHJvY2Vzc2luZworICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGZyYW1lcyBhY3R1YWxseSBwcm9jZXNzZWQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpID0gMDsKKworICAgIC8qKgorICAgICAqIElmIHRoZSBmcmFtZVBvc2l0aW9uIGlzIGF0IG9yIGFmdGVyIHRoZSBsYXN0IGZyYW1lIHBvc2l0aW9uIHRoZW4gY2FsbCBvblByb2Nlc3MoKS4KKyAgICAgKiBUaGlzIHByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbiBpbiBjYXNlIG9mIGN5Y2xpYyBncmFwaHMuCisgICAgICogSXQgYWxzbyBwcmV2ZW50cyBub2RlcyB1cHN0cmVhbSBmcm9tIGEgYnJhbmNoIGZyb20gYmVpbmcgZXhlY3V0ZWQgdHdpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhbWVQb3NpdGlvbgorICAgICAqIEBwYXJhbSBudW1GcmFtZXMKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgaW50MzJfdCBwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKTsKKworcHJvdGVjdGVkOgorICAgIGludDY0X3QgIG1MYXN0RnJhbWVQb3NpdGlvbiA9IC0xOyAvLyBTdGFydCBhdCAtMSBzbyB0aGF0IHRoZSBmaXJzdCBwdWxsIHdvcmtzLgorCitwcml2YXRlOgorICAgIGludDMyX3QgIG1GcmFtZXNWYWxpZCA9IDA7IC8vIG51bSB2YWxpZCBmcmFtZXMgaW4gdGhlIGJsb2NrCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgICogVGhpcyBpcyBhIGNvbm5lY3RvciB0aGF0IGFsbG93cyBkYXRhIHRvIGZsb3cgYmV0d2VlbiBtb2R1bGVzLgorICAqLworY2xhc3MgQXVkaW9Qb3J0IHsKK3B1YmxpYzoKKyAgICBBdWRpb1BvcnQoQXVkaW9Qcm9jZXNzb3JCYXNlICZwYXJlbnQsIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQorICAgICAgICAgICAgOiBtUGFyZW50KHBhcmVudCkKKyAgICAgICAgICAgICwgbVNhbXBsZXNQZXJGcmFtZShzYW1wbGVzUGVyRnJhbWUpIHsKKyAgICB9CisKKyAgICAvLyBQb3J0cyBhcmUgb2Z0ZW4gZGVjbGFyZWQgcHVibGljLiBTbyBsZXQncyBtYWtlIHRoZW0gbm9uLWNvcHlhYmxlLgorICAgIEF1ZGlvUG9ydChjb25zdCBBdWRpb1BvcnQmKSA9IGRlbGV0ZTsKKyAgICBBdWRpb1BvcnQmIG9wZXJhdG9yPShjb25zdCBBdWRpb1BvcnQmKSA9IGRlbGV0ZTsKKworICAgIGludDMyX3QgZ2V0U2FtcGxlc1BlckZyYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVNhbXBsZXNQZXJGcmFtZTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBBdWRpb1Byb2Nlc3NvckJhc2UgJm1QYXJlbnQ7CisKK3ByaXZhdGU6CisgICAgY29uc3QgaW50MzJfdCAgICBtU2FtcGxlc1BlckZyYW1lID0gMTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIFRoaXMgcG9ydCBjb250YWlucyBhIGZsb2F0IHR5cGUgYnVmZmVyLgorICogVGhlIHNpemUgaXMgZnJhbWVzUGVyQmxvY2sgKiBzYW1wbGVzUGVyRnJhbWUpLgorICovCitjbGFzcyBBdWRpb0Zsb2F0QmxvY2tQb3J0ICA6IHB1YmxpYyBBdWRpb1BvcnQgeworcHVibGljOgorICAgIEF1ZGlvRmxvYXRCbG9ja1BvcnQoQXVkaW9Qcm9jZXNzb3JCYXNlICZtUGFyZW50LAorICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzUGVyQmxvY2sgPSBrRGVmYXVsdEJsb2NrU2l6ZQorICAgICAgICAgICAgICAgICk7CisKKyAgICB2aXJ0dWFsIH5BdWRpb0Zsb2F0QmxvY2tQb3J0KCk7CisKKyAgICBpbnQzMl90IGdldEZyYW1lc1BlckJsb2NrKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUZyYW1lc1BlckJsb2NrOworICAgIH0KKworcHJvdGVjdGVkOgorCisgICAgLyoqCisgICAgICogQHJldHVybiBidWZmZXIgaW50ZXJuYWwgdG8gdGhlIHBvcnQgb3IgZnJvbSBhIGNvbm5lY3RlZCBwb3J0CisgICAgICovCisgICAgdmlydHVhbCBmbG9hdCAqZ2V0QmxvY2soKSB7CisgICAgICAgIHJldHVybiBtU2FtcGxlQmxvY2s7CisgICAgfQorCisKK3ByaXZhdGU6CisgICAgY29uc3QgaW50MzJfdCAgICBtRnJhbWVzUGVyQmxvY2sgPSAxOworICAgIGZsb2F0ICAgICAgICAgICAqbVNhbXBsZUJsb2NrID0gbnVsbHB0cjsgLy8gYWxsb2NhdGVkIGluIGNvbnN0cnVjdG9yCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgICogVGhlIHJlc3VsdHMgb2YgYSBtb2R1bGUgYXJlIHN0b3JlZCBpbiB0aGUgYnVmZmVyIG9mIHRoZSBvdXRwdXQgcG9ydHMuCisgICovCitjbGFzcyBBdWRpb0Zsb2F0T3V0cHV0UG9ydCA6IHB1YmxpYyBBdWRpb0Zsb2F0QmxvY2tQb3J0IHsKK3B1YmxpYzoKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydChBdWRpb1Byb2Nlc3NvckJhc2UgJnBhcmVudCwgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpCisgICAgICAgICAgICA6IEF1ZGlvRmxvYXRCbG9ja1BvcnQocGFyZW50LCBzYW1wbGVzUGVyRnJhbWUpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5BdWRpb0Zsb2F0T3V0cHV0UG9ydCgpID0gZGVmYXVsdDsKKworICAgIHVzaW5nIEF1ZGlvRmxvYXRCbG9ja1BvcnQ6OmdldEJsb2NrOworCisgICAgLyoqCisgICAgICogQ2FsbCB0aGUgcGFyZW50IG1vZHVsZSdzIG9uUHJvY2VzcygpIG1ldGhvZC4KKyAgICAgKiBUaGF0IG1heSBwdWxsIGRhdGEgZnJvbSBpdHMgaW5wdXRzIGFuZCByZWN1cnNpdmVseQorICAgICAqIHByb2Nlc3MgdGhlIGVudGlyZSBncmFwaC4KKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgcHVsbGVkCisgICAgICovCisgICAgaW50MzJfdCBwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKTsKKworICAgIC8qKgorICAgICAqIENvbm5lY3QgdG8gdGhlIGlucHV0IG9mIGFub3RoZXIgbW9kdWxlLgorICAgICAqIEFuIGlucHV0IHBvcnQgY2FuIG9ubHkgaGF2ZSBvbmUgY29ubmVjdGlvbi4KKyAgICAgKiBBbiBvdXRwdXQgcG9ydCBjYW4gaGF2ZSBtdWx0aXBsZSBjb25uZWN0aW9ucy4KKyAgICAgKiBJZiB5b3UgY29ubmVjdCBhIHNlY29uZCBvdXRwdXQgcG9ydCB0byBhbiBpbnB1dCBwb3J0CisgICAgICogdGhlbiBpdCBvdmVyd3JpdGVzIHRoZSBwcmV2aW91cyBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogVGhpcyBub3QgdGhyZWFkIHNhZmUuIERvIG5vdCBtb2RpZnkgdGhlIGdyYXBoIHRvcG9sb2d5IGZvcm0gYW5vdGhlciB0aHJlYWQgd2hpbGUgcnVubmluZy4KKyAgICAgKi8KKyAgICB2b2lkIGNvbm5lY3QoQXVkaW9GbG9hdElucHV0UG9ydCAqcG9ydCk7CisKKyAgICAvKioKKyAgICAgKiBEaXNjb25uZWN0IGZyb20gdGhlIGlucHV0IG9mIGFub3RoZXIgbW9kdWxlLgorICAgICAqIFRoaXMgbm90IHRocmVhZCBzYWZlLgorICAgICAqLworICAgIHZvaWQgZGlzY29ubmVjdChBdWRpb0Zsb2F0SW5wdXRQb3J0ICpwb3J0KTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjbGFzcyBBdWRpb0Zsb2F0SW5wdXRQb3J0IDogcHVibGljIEF1ZGlvRmxvYXRCbG9ja1BvcnQgeworcHVibGljOgorICAgIEF1ZGlvRmxvYXRJbnB1dFBvcnQoQXVkaW9Qcm9jZXNzb3JCYXNlICZwYXJlbnQsIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQorICAgICAgICAgICAgOiBBdWRpb0Zsb2F0QmxvY2tQb3J0KHBhcmVudCwgc2FtcGxlc1BlckZyYW1lKSB7CisgICAgfQorCisgICAgdmlydHVhbCB+QXVkaW9GbG9hdElucHV0UG9ydCgpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIElmIGNvbm5lY3RlZCB0byBhbiBvdXRwdXQgcG9ydCB0aGVuIHRoaXMgd2lsbCByZXR1cm4KKyAgICAgKiB0aGF0IG91dHB1dCBwb3J0cyBidWZmZXJzLgorICAgICAqIElmIG5vdCBjb25uZWN0ZWQgdGhlbiBpdCByZXR1cm5zIHRoZSBpbnB1dCBwb3J0cyBvd24gYnVmZmVyCisgICAgICogd2hpY2ggY2FuIGJlIGxvYWRlZCB1c2luZyBzZXRWYWx1ZSgpLgorICAgICAqLworICAgIGZsb2F0ICpnZXRCbG9jaygpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogUHVsbCBkYXRhIGZyb20gYW55IG91dHB1dCBwb3J0IHRoYXQgaXMgY29ubmVjdGVkLgorICAgICAqLworICAgIGludDMyX3QgcHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcyk7CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBldmVyeSB2YWx1ZSBvZiB0aGUgZmxvYXQgYnVmZmVyLgorICAgICAqIFRoaXMgdmFsdWUgd2lsbCBiZSBpZ25vcmVkIGlmIGFuIG91dHB1dCBwb3J0IGlzIGNvbm5lY3RlZAorICAgICAqIHRvIHRoaXMgcG9ydC4KKyAgICAgKi8KKyAgICB2b2lkIHNldFZhbHVlKGZsb2F0IHZhbHVlKSB7CisgICAgICAgIGludCBudW1GbG9hdHMgPSBrRGVmYXVsdEJsb2NrU2l6ZSAqIGdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgICAgICBmbG9hdCAqYnVmZmVyID0gZ2V0QmxvY2soKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GbG9hdHM7IGkrKykgeworICAgICAgICAgICAgKmJ1ZmZlcisrID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0IHRvIHRoZSBvdXRwdXQgb2YgYW5vdGhlciBtb2R1bGUuCisgICAgICogQW4gaW5wdXQgcG9ydCBjYW4gb25seSBoYXZlIG9uZSBjb25uZWN0aW9uLgorICAgICAqIEFuIG91dHB1dCBwb3J0IGNhbiBoYXZlIG11bHRpcGxlIGNvbm5lY3Rpb25zLgorICAgICAqIFRoaXMgbm90IHRocmVhZCBzYWZlLgorICAgICAqLworICAgIHZvaWQgY29ubmVjdChBdWRpb0Zsb2F0T3V0cHV0UG9ydCAqcG9ydCkgeworICAgICAgICBhc3NlcnQoZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gcG9ydC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOworICAgICAgICBtQ29ubmVjdGVkID0gcG9ydDsKKyAgICB9CisKKyAgICB2b2lkIGRpc2Nvbm5lY3QoQXVkaW9GbG9hdE91dHB1dFBvcnQgKnBvcnQpIHsKKyAgICAgICAgYXNzZXJ0KG1Db25uZWN0ZWQgPT0gcG9ydCk7CisgICAgICAgICh2b2lkKSBwb3J0OworICAgICAgICBtQ29ubmVjdGVkID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICB2b2lkIGRpc2Nvbm5lY3QoKSB7CisgICAgICAgIG1Db25uZWN0ZWQgPSBudWxscHRyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCAqbUNvbm5lY3RlZCA9IG51bGxwdHI7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2xhc3MgQXVkaW9Tb3VyY2UgOiBwdWJsaWMgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBBdWRpb1NvdXJjZShpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgIDogb3V0cHV0KCp0aGlzLCBjaGFubmVsQ291bnQpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5BdWRpb1NvdXJjZSgpID0gZGVmYXVsdDsKKworICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0IG91dHB1dDsKKworICAgIHZvaWQgc2V0RGF0YShjb25zdCB2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgICAgICBtRGF0YSA9IGRhdGE7CisgICAgICAgIG1TaXplSW5GcmFtZXMgPSBudW1GcmFtZXM7CisgICAgICAgIG1GcmFtZUluZGV4ID0gMDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBjb25zdCB2b2lkICptRGF0YSA9IG51bGxwdHI7CisgICAgaW50MzJfdCAgICAgbVNpemVJbkZyYW1lcyA9IDA7IC8vIG51bWJlciBvZiBmcmFtZXMgaW4gbURhdGEKKyAgICBpbnQzMl90ICAgICBtRnJhbWVJbmRleCA9IDA7IC8vIGluZGV4IG9mIG5leHQgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2xhc3MgQXVkaW9TaW5rIDogcHVibGljIEF1ZGlvUHJvY2Vzc29yQmFzZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQXVkaW9TaW5rKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgOiBpbnB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7CisgICAgfQorCisgICAgdmlydHVhbCB+QXVkaW9TaW5rKCkgPSBkZWZhdWx0OworCisgICAgQXVkaW9GbG9hdElucHV0UG9ydCBpbnB1dDsKKworICAgIC8qKgorICAgICAqIER1bW15IHByb2Nlc3Nvci4gVGhlIHdvcmsgaGFwcGVucyBpbiB0aGUgcmVhZCgpIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFtZVBvc2l0aW9uIGluZGV4IG9mIGZpcnN0IGZyYW1lIHRvIGJlIHByb2Nlc3NlZAorICAgICAqIEBwYXJhbSBudW1GcmFtZXMKKyAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgcHJvY2Vzc2VkCisgICAgICovCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGUgeworICAgICAgICAodm9pZCkgZnJhbWVQb3NpdGlvbjsKKyAgICAgICAgKHZvaWQpIG51bUZyYW1lczsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsKKworICAgIHZpcnR1YWwgaW50MzJfdCByZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICBpbnQzMl90IHB1bGwoaW50MzJfdCBudW1GcmFtZXMpOworCitwcml2YXRlOgorICAgIGludDY0X3QgbUZyYW1lUG9zaXRpb24gPSAwOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvKiBGTE9XR1JBUEhfQVVESU9fUFJPQ0VTU09SX0JBU0VfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOWMyMmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJDbGlwVG9SYW5nZS5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitDbGlwVG9SYW5nZTo6Q2xpcFRvUmFuZ2UoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogaW5wdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkKKyAgICAgICAgLCBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworfQorCitpbnQzMl90IENsaXBUb1JhbmdlOjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gaW5wdXQucHVsbERhdGEoZnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKKyAgICBjb25zdCBmbG9hdCAqaW5wdXRCdWZmZXIgPSBpbnB1dC5nZXRCbG9jaygpOworICAgIGZsb2F0ICpvdXRwdXRCdWZmZXIgPSBvdXRwdXQuZ2V0QmxvY2soKTsKKworICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gc3RkOjptaW4obU1heGltdW0sIHN0ZDo6bWF4KG1NaW5pbXVtLCAqaW5wdXRCdWZmZXIrKykpOworICAgIH0KKworICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWVmMjU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9DTElQX1RPX1JBTkdFX0gKKyNkZWZpbmUgRkxPV0dSQVBIX0NMSVBfVE9fUkFOR0VfSAorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCisvLyBUaGlzIGlzIDMgZEIsICgxMF4oMy8yMCkpLCB0byBtYXRjaCB0aGUgbWF4aW11bSBoZWFkcm9vbSBpbiBBdWRpb1RyYWNrIGZvciBmbG9hdCBkYXRhLgorLy8gSXQgaXMgZGVzaWduZWQgdG8gYWxsb3cgb2NjYXNpb25hbCB0cmFuc2llbnQgcGVha3MuCitjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRNYXhIZWFkcm9vbSA9IDEuNDEyNTM3NTRmOworY29uc3RleHByIGZsb2F0IGtEZWZhdWx0TWluSGVhZHJvb20gPSAta0RlZmF1bHRNYXhIZWFkcm9vbTsKKworY2xhc3MgQ2xpcFRvUmFuZ2UgOiBwdWJsaWMgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDbGlwVG9SYW5nZShpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICB2aXJ0dWFsIH5DbGlwVG9SYW5nZSgpID0gZGVmYXVsdDsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRNaW5pbXVtKGZsb2F0IG1pbikgeworICAgICAgICBtTWluaW11bSA9IG1pbjsKKyAgICB9CisKKyAgICBmbG9hdCBnZXRNaW5pbXVtKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU1pbmltdW07CisgICAgfQorCisgICAgdm9pZCBzZXRNYXhpbXVtKGZsb2F0IG1pbikgeworICAgICAgICBtTWF4aW11bSA9IG1pbjsKKyAgICB9CisKKyAgICBmbG9hdCBnZXRNYXhpbXVtKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU1heGltdW07CisgICAgfQorCisgICAgQXVkaW9GbG9hdElucHV0UG9ydCBpbnB1dDsKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCBvdXRwdXQ7CisKK3ByaXZhdGU6CisgICAgZmxvYXQgbU1pbmltdW0gPSBrRGVmYXVsdE1pbkhlYWRyb29tOworICAgIGZsb2F0IG1NYXhpbXVtID0ga0RlZmF1bHRNYXhIZWFkcm9vbTsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfQ0xJUF9UT19SQU5HRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhYWQ1MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJNb25vVG9NdWx0aUNvbnZlcnRlci5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitNb25vVG9NdWx0aUNvbnZlcnRlcjo6TW9ub1RvTXVsdGlDb252ZXJ0ZXIoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogaW5wdXQoKnRoaXMsIDEpCisgICAgICAgICwgb3V0cHV0KCp0aGlzLCBjaGFubmVsQ291bnQpIHsKK30KKworTW9ub1RvTXVsdGlDb252ZXJ0ZXI6On5Nb25vVG9NdWx0aUNvbnZlcnRlcigpIHsgfQorCitpbnQzMl90IE1vbm9Ub011bHRpQ29udmVydGVyOjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gaW5wdXQucHVsbERhdGEoZnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKKworICAgIGNvbnN0IGZsb2F0ICppbnB1dEJ1ZmZlciA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCbG9jaygpOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgIC8vIFRPRE8gbWF5YmUgbW92ZSB0byBhdWRpb191dGlsIGFzIGF1ZGlvX21vbm9fdG9fbXVsdGkoKQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzVG9Qcm9jZXNzOyBpKyspIHsKKyAgICAgICAgLy8gcmVhZCBvbmUsIHdyaXRlIG1hbnkKKyAgICAgICAgZmxvYXQgc2FtcGxlID0gKmlucHV0QnVmZmVyKys7CisgICAgICAgIGZvciAoaW50IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY2hhbm5lbENvdW50OyBjaGFubmVsKyspIHsKKyAgICAgICAgICAgICpvdXRwdXRCdWZmZXIrKyA9IHNhbXBsZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGQ1M2M3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpZm5kZWYgRkxPV0dSQVBIX01PTk9fVE9fTVVMVElfQ09OVkVSVEVSX0gKKyNkZWZpbmUgRkxPV0dSQVBIX01PTk9fVE9fTVVMVElfQ09OVkVSVEVSX0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBNb25vVG9NdWx0aUNvbnZlcnRlciA6IHB1YmxpYyBBdWRpb1Byb2Nlc3NvckJhc2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IE1vbm9Ub011bHRpQ29udmVydGVyKGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIHZpcnR1YWwgfk1vbm9Ub011bHRpQ29udmVydGVyKCk7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworICAgIEF1ZGlvRmxvYXRJbnB1dFBvcnQgaW5wdXQ7CisgICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgb3V0cHV0OworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9NT05PX1RPX01VTFRJX0NPTlZFUlRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNjA4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmNwcApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlJhbXBMaW5lYXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiUmFtcExpbmVhci5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitSYW1wTGluZWFyOjpSYW1wTGluZWFyKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IGlucHV0KCp0aGlzLCBjaGFubmVsQ291bnQpCisgICAgICAgICwgb3V0cHV0KCp0aGlzLCBjaGFubmVsQ291bnQpIHsKKyAgICBtVGFyZ2V0LnN0b3JlKDEuMGYpOworfQorCit2b2lkIFJhbXBMaW5lYXI6OnNldExlbmd0aEluRnJhbWVzKGludDMyX3QgZnJhbWVzKSB7CisgICAgbUxlbmd0aEluRnJhbWVzID0gZnJhbWVzOworfQorCit2b2lkIFJhbXBMaW5lYXI6OnNldFRhcmdldChmbG9hdCB0YXJnZXQpIHsKKyAgICBtVGFyZ2V0LnN0b3JlKHRhcmdldCk7Cit9CisKK2Zsb2F0IFJhbXBMaW5lYXI6OmludGVycG9sYXRlQ3VycmVudCgpIHsKKyAgICByZXR1cm4gbUxldmVsVG8gLSAobVJlbWFpbmluZyAqIG1TY2FsZXIpOworfQorCitpbnQzMl90IFJhbXBMaW5lYXI6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBpbnB1dC5wdWxsRGF0YShmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOworICAgIGNvbnN0IGZsb2F0ICppbnB1dEJ1ZmZlciA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCbG9jaygpOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgZmxvYXQgdGFyZ2V0ID0gZ2V0VGFyZ2V0KCk7CisgICAgaWYgKHRhcmdldCAhPSBtTGV2ZWxUbykgeworICAgICAgICAvLyBTdGFydCBuZXcgcmFtcC4gQ29udGludWUgZnJvbSBwcmV2aW91cyBsZXZlbC4KKyAgICAgICAgbUxldmVsRnJvbSA9IGludGVycG9sYXRlQ3VycmVudCgpOworICAgICAgICBtTGV2ZWxUbyA9IHRhcmdldDsKKyAgICAgICAgbVJlbWFpbmluZyA9IG1MZW5ndGhJbkZyYW1lczsKKyAgICAgICAgQUxPR1YoIiVzKCkgbUxldmVsRnJvbSA9ICVmLCBtTGV2ZWxUbyA9ICVmLCBtUmVtYWluaW5nID0gJWQsIG1TY2FsZXIgPSAlZiIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBtTGV2ZWxGcm9tLCBtTGV2ZWxUbywgbVJlbWFpbmluZywgbVNjYWxlcik7CisgICAgICAgIG1TY2FsZXIgPSAobUxldmVsVG8gLSBtTGV2ZWxGcm9tKSAvIG1MZW5ndGhJbkZyYW1lczsgLy8gZm9yIGludGVycG9sYXRpb24KKyAgICB9CisKKyAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBmcmFtZXNUb1Byb2Nlc3M7CisKKyAgICBpZiAobVJlbWFpbmluZyA+IDApIHsgLy8gUmFtcGluZz8gVGhpcyBkb2Vzbid0IGhhcHBlbiB2ZXJ5IG9mdGVuLgorICAgICAgICBpbnQzMl90IGZyYW1lc1RvUmFtcCA9IHN0ZDo6bWluKGZyYW1lc0xlZnQsIG1SZW1haW5pbmcpOworICAgICAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1RvUmFtcDsKKyAgICAgICAgd2hpbGUgKGZyYW1lc1RvUmFtcCA+IDApIHsKKyAgICAgICAgICAgIGZsb2F0IGN1cnJlbnRMZXZlbCA9IGludGVycG9sYXRlQ3VycmVudCgpOworICAgICAgICAgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IGNoYW5uZWxDb3VudDsgY2grKykgeworICAgICAgICAgICAgICAgICpvdXRwdXRCdWZmZXIrKyA9ICppbnB1dEJ1ZmZlcisrICogY3VycmVudExldmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJlbWFpbmluZy0tOworICAgICAgICAgICAgZnJhbWVzVG9SYW1wLS07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBQcm9jZXNzIGFueSBmcmFtZXMgYWZ0ZXIgdGhlIHJhbXAuCisgICAgaW50MzJfdCBzYW1wbGVzTGVmdCA9IGZyYW1lc0xlZnQgKiBjaGFubmVsQ291bnQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzYW1wbGVzTGVmdDsgaSsrKSB7CisgICAgICAgICpvdXRwdXRCdWZmZXIrKyA9ICppbnB1dEJ1ZmZlcisrICogbUxldmVsVG87CisgICAgfQorCisgICAgcmV0dXJuIGZyYW1lc1RvUHJvY2VzczsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGM4ZjQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX1JBTVBfTElORUFSX0gKKyNkZWZpbmUgRkxPV0dSQVBIX1JBTVBfTElORUFSX0gKKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgUmFtcExpbmVhciA6IHB1YmxpYyBBdWRpb1Byb2Nlc3NvckJhc2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IFJhbXBMaW5lYXIoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgdmlydHVhbCB+UmFtcExpbmVhcigpID0gZGVmYXVsdDsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogVGhpcyBpcyB1c2VkIGZvciB0aGUgbmV4dCByYW1wLgorICAgICAqIENhbGxpbmcgdGhpcyBkb2VzIG5vdCBhZmZlY3QgYSByYW1wIHRoYXQgaXMgaW4gcHJvZ3Jlc3MuCisgICAgICovCisgICAgdm9pZCBzZXRMZW5ndGhJbkZyYW1lcyhpbnQzMl90IGZyYW1lcyk7CisKKyAgICBpbnQzMl90IGdldExlbmd0aEluRnJhbWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUxlbmd0aEluRnJhbWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWF5IGJlIHNhZmVseSBjYWxsZWQgYnkgYW5vdGhlciB0aHJlYWQuCisgICAgICogQHBhcmFtIHRhcmdldAorICAgICAqLworICAgIHZvaWQgc2V0VGFyZ2V0KGZsb2F0IHRhcmdldCk7CisKKyAgICBmbG9hdCBnZXRUYXJnZXQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVGFyZ2V0LmxvYWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb3JjZSB0aGUgbmV4dFNlZ21lbnQgdG8gc3RhcnQgZnJvbSB0aGlzIGxldmVsLgorICAgICAqCisgICAgICogV0FSTklORzogdGhpcyBjYW4gY2F1c2UgYSBkaXNjb250aW51aXR5IGlmIGNhbGxlZCB3aGlsZSB0aGUgcmFtcCBpcyBiZWluZyB1c2VkLgorICAgICAqIE9ubHkgY2FsbCB0aGlzIHdoZW4gc2V0dGluZyB0aGUgaW5pdGlhbCByYW1wLgorICAgICAqCisgICAgICogQHBhcmFtIGxldmVsCisgICAgICovCisgICAgdm9pZCBmb3JjZUN1cnJlbnQoZmxvYXQgbGV2ZWwpIHsKKyAgICAgICAgbUxldmVsRnJvbSA9IGxldmVsOworICAgICAgICBtTGV2ZWxUbyA9IGxldmVsOworICAgIH0KKworICAgIEF1ZGlvRmxvYXRJbnB1dFBvcnQgaW5wdXQ7CisgICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgb3V0cHV0OworCitwcml2YXRlOgorCisgICAgZmxvYXQgaW50ZXJwb2xhdGVDdXJyZW50KCk7CisKKyAgICBzdGQ6OmF0b21pYzxmbG9hdD4gIG1UYXJnZXQ7CisKKyAgICBpbnQzMl90ICAgICAgICAgICAgIG1MZW5ndGhJbkZyYW1lcyAgPSA0ODAwMC4wZiAvIDEwMC4wZiA7IC8vIDEwIG1zZWMgYXQgNDgwMDAgSHo7CisgICAgaW50MzJfdCAgICAgICAgICAgICBtUmVtYWluaW5nICAgICAgID0gMDsKKyAgICBmbG9hdCAgICAgICAgICAgICAgIG1TY2FsZXIgICAgICAgICAgPSAwLjBmOworICAgIGZsb2F0ICAgICAgICAgICAgICAgbUxldmVsRnJvbSAgICAgICA9IDAuMGY7CisgICAgZmxvYXQgICAgICAgICAgICAgICBtTGV2ZWxUbyAgICAgICAgID0gMC4wZjsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfUkFNUF9MSU5FQVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtGbG9hdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzZGNiYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtGbG9hdC5jcHAKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJTaW5rRmxvYXQuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworU2lua0Zsb2F0OjpTaW5rRmxvYXQoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9TaW5rKGNoYW5uZWxDb3VudCkgeworfQorCitpbnQzMl90IFNpbmtGbG9hdDo6cmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGZsb2F0ICpmbG9hdERhdGEgPSAoZmxvYXQgKikgZGF0YTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IGlucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOworICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgeworICAgICAgICAvLyBSdW4gdGhlIGdyYXBoIGFuZCBwdWxsIGRhdGEgdGhyb3VnaCB0aGUgaW5wdXQgcG9ydC4KKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbChmcmFtZXNMZWZ0KTsKKyAgICAgICAgaWYgKGZyYW1lc1JlYWQgPD0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgZmxvYXQgKnNpZ25hbCA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1JlYWQgKiBjaGFubmVsQ291bnQ7CisgICAgICAgIG1lbWNweShmbG9hdERhdGEsIHNpZ25hbCwgbnVtU2FtcGxlcyAqIHNpemVvZihmbG9hdCkpOworICAgICAgICBmbG9hdERhdGEgKz0gbnVtU2FtcGxlczsKKyAgICAgICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNSZWFkOworICAgIH0KKyAgICByZXR1cm4gbnVtRnJhbWVzIC0gZnJhbWVzTGVmdDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtGbG9hdC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3NWMwOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtGbG9hdC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBGTE9XR1JBUEhfU0lOS19GTE9BVF9ICisjZGVmaW5lIEZMT1dHUkFQSF9TSU5LX0ZMT0FUX0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTaW5rRmxvYXQgOiBwdWJsaWMgQXVkaW9TaW5rIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTaW5rRmxvYXQoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgaW50MzJfdCByZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKKworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9TSU5LX0ZMT0FUX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZlYzhmNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuY3BwCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiU2lua0kxNi5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitTaW5rSTE2OjpTaW5rSTE2KGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IEF1ZGlvU2luayhjaGFubmVsQ291bnQpIHt9CisKK2ludDMyX3QgU2lua0kxNjo6cmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGludDE2X3QgKnNob3J0RGF0YSA9IChpbnQxNl90ICopIGRhdGE7CisgICAgY29uc3QgaW50MzJfdCBjaGFubmVsQ291bnQgPSBpbnB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG51bUZyYW1lczsKKyAgICB3aGlsZSAoZnJhbWVzTGVmdCA+IDApIHsKKyAgICAgICAgLy8gUnVuIHRoZSBncmFwaCBhbmQgcHVsbCBkYXRhIHRocm91Z2ggdGhlIGlucHV0IHBvcnQuCisgICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IHB1bGwoZnJhbWVzTGVmdCk7CisgICAgICAgIGlmIChmcmFtZXNSZWFkIDw9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGZsb2F0ICpzaWduYWwgPSBpbnB1dC5nZXRCbG9jaygpOworICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNSZWFkICogY2hhbm5lbENvdW50OworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChzaG9ydERhdGEsIHNpZ25hbCwgbnVtU2FtcGxlcyk7CisgICAgICAgIHNob3J0RGF0YSArPSBudW1TYW1wbGVzOworICAgICAgICBzaWduYWwgKz0gbnVtU2FtcGxlczsKKyNlbHNlCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IG4gPSAoaW50MzJfdCkgKCpzaWduYWwrKyAqIDMyNzY4LjBmKTsKKyAgICAgICAgICAgICpzaG9ydERhdGErKyA9IHN0ZDo6bWluKElOVDE2X01BWCwgc3RkOjptYXgoSU5UMTZfTUlOLCBuKSk7IC8vIGNsaXAKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzUmVhZDsKKyAgICB9CisgICAgcmV0dXJuIG51bUZyYW1lcyAtIGZyYW1lc0xlZnQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ4NjI2NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9TSU5LX0kxNl9ICisjZGVmaW5lIEZMT1dHUkFQSF9TSU5LX0kxNl9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgU2lua0kxNiA6IHB1YmxpYyBBdWRpb1NpbmsgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNpbmtJMTYoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgaW50MzJfdCByZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfU0lOS19JMTZfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTkyODI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5jcHAKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJTaW5rSTI0LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKKworU2lua0kyNDo6U2lua0kyNChpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBBdWRpb1NpbmsoY2hhbm5lbENvdW50KSB7fQorCitpbnQzMl90IFNpbmtJMjQ6OnJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICB1aW50OF90ICpieXRlRGF0YSA9ICh1aW50OF90ICopIGRhdGE7CisgICAgY29uc3QgaW50MzJfdCBjaGFubmVsQ291bnQgPSBpbnB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG51bUZyYW1lczsKKyAgICB3aGlsZSAoZnJhbWVzTGVmdCA+IDApIHsKKyAgICAgICAgLy8gUnVuIHRoZSBncmFwaCBhbmQgcHVsbCBkYXRhIHRocm91Z2ggdGhlIGlucHV0IHBvcnQuCisgICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IHB1bGwoZnJhbWVzTGVmdCk7CisgICAgICAgIGlmIChmcmFtZXNSZWFkIDw9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGZsb2F0ICpmbG9hdERhdGEgPSBpbnB1dC5nZXRCbG9jaygpOworICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNSZWFkICogY2hhbm5lbENvdW50OworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgICAgIG1lbWNweV90b19wMjRfZnJvbV9mbG9hdChieXRlRGF0YSwgZmxvYXREYXRhLCBudW1TYW1wbGVzKTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQnl0ZXNQZXJJMjRQYWNrZWQgPSAzOworICAgICAgICBieXRlRGF0YSArPSBudW1TYW1wbGVzICoga0J5dGVzUGVySTI0UGFja2VkOworICAgICAgICBmbG9hdERhdGEgKz0gbnVtU2FtcGxlczsKKyNlbHNlCisgICAgICAgIGNvbnN0IGludDMyX3Qga0kyNFBhY2tlZE1heCA9IDB4MDA3RkZGRkY7CisgICAgICAgIGNvbnN0IGludDMyX3Qga0kyNFBhY2tlZE1pbiA9IDB4RkY4MDAwMDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IG4gPSAoaW50MzJfdCkgKCpmbG9hdERhdGErKyAqIDB4MDA4MDAwMDApOworICAgICAgICAgICAgbiA9IHN0ZDo6bWluKGtJMjRQYWNrZWRNYXgsIHN0ZDo6bWF4KGtJMjRQYWNrZWRNaW4sIG4pKTsgLy8gY2xpcAorICAgICAgICAgICAgLy8gV3JpdGUgYXMgYSBwYWNrZWQgMjQtYml0IGludGVnZXIgaW4gTGl0dGxlIEVuZGlhbiBmb3JtYXQuCisgICAgICAgICAgICAqYnl0ZURhdGErKyA9ICh1aW50OF90KSBuOworICAgICAgICAgICAgKmJ5dGVEYXRhKysgPSAodWludDhfdCkgKG4gPj4gOCk7CisgICAgICAgICAgICAqYnl0ZURhdGErKyA9ICh1aW50OF90KSAobiA+PiAxNik7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1JlYWQ7CisgICAgfQorICAgIHJldHVybiBudW1GcmFtZXMgLSBmcmFtZXNMZWZ0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOWI1MDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfU0lOS19JMjRfSAorI2RlZmluZSBGTE9XR1JBUEhfU0lOS19JMjRfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIFNpbmtJMjQgOiBwdWJsaWMgQXVkaW9TaW5rIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTaW5rSTI0KGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIGludDMyX3QgcmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1NJTktfSTI0X0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmI2NzRmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuY3BwCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiU291cmNlRmxvYXQuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworU291cmNlRmxvYXQ6OlNvdXJjZUZsb2F0KGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IEF1ZGlvU291cmNlKGNoYW5uZWxDb3VudCkgeworfQorCitpbnQzMl90IFNvdXJjZUZsb2F0OjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworCisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCbG9jaygpOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbVNpemVJbkZyYW1lcyAtIG1GcmFtZUluZGV4OworICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gc3RkOjptaW4obnVtRnJhbWVzLCBmcmFtZXNMZWZ0KTsKKyAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBjaGFubmVsQ291bnQ7CisKKyAgICBjb25zdCBmbG9hdCAqZmxvYXRCYXNlID0gKGZsb2F0ICopIG1EYXRhOworICAgIGNvbnN0IGZsb2F0ICpmbG9hdERhdGEgPSAmZmxvYXRCYXNlW21GcmFtZUluZGV4ICogY2hhbm5lbENvdW50XTsKKyAgICBtZW1jcHkob3V0cHV0QnVmZmVyLCBmbG9hdERhdGEsIG51bVNhbXBsZXMgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBtRnJhbWVJbmRleCArPSBmcmFtZXNUb1Byb2Nlc3M7CisgICAgcmV0dXJuIGZyYW1lc1RvUHJvY2VzczsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZlZWQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfU09VUkNFX0ZMT0FUX0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NPVVJDRV9GTE9BVF9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgU291cmNlRmxvYXQgOiBwdWJsaWMgQXVkaW9Tb3VyY2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNvdXJjZUZsb2F0KGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9TT1VSQ0VfRkxPQVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNmY2VjMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJTb3VyY2VJMTYuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworU291cmNlSTE2OjpTb3VyY2VJMTYoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9Tb3VyY2UoY2hhbm5lbENvdW50KSB7Cit9CisKK2ludDMyX3QgU291cmNlSTE2OjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGZsb2F0ICpmbG9hdERhdGEgPSBvdXRwdXQuZ2V0QmxvY2soKTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG1TaXplSW5GcmFtZXMgLSBtRnJhbWVJbmRleDsKKyAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IHN0ZDo6bWluKG51bUZyYW1lcywgZnJhbWVzTGVmdCk7CisgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogY2hhbm5lbENvdW50OworCisgICAgY29uc3QgaW50MTZfdCAqc2hvcnRCYXNlID0gc3RhdGljX2Nhc3Q8Y29uc3QgaW50MTZfdCAqPihtRGF0YSk7CisgICAgY29uc3QgaW50MTZfdCAqc2hvcnREYXRhID0gJnNob3J0QmFzZVttRnJhbWVJbmRleCAqIGNoYW5uZWxDb3VudF07CisKKyNpZmRlZiBfX0FORFJPSURfXworICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNihmbG9hdERhdGEsIHNob3J0RGF0YSwgbnVtU2FtcGxlcyk7CisjZWxzZQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICpmbG9hdERhdGErKyA9ICpzaG9ydERhdGErKyAqICgxLjBmIC8gMzI3NjgpOworICAgIH0KKyNlbmRpZgorCisgICAgbUZyYW1lSW5kZXggKz0gZnJhbWVzVG9Qcm9jZXNzOworICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjExNmNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfU09VUkNFX0kxNl9ICisjZGVmaW5lIEZMT1dHUkFQSF9TT1VSQ0VfSTE2X0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTb3VyY2VJMTYgOiBwdWJsaWMgQXVkaW9Tb3VyY2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNvdXJjZUkxNihpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfU09VUkNFX0kxNl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzE5ODgwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmNwcApAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlNvdXJjZUkyNC5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitjb25zdGV4cHIgaW50IGtCeXRlc1BlckkyNFBhY2tlZCA9IDM7CisKK1NvdXJjZUkyNDo6U291cmNlSTI0KGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IEF1ZGlvU291cmNlKGNoYW5uZWxDb3VudCkgeworfQorCitpbnQzMl90IFNvdXJjZUkyNDo6b25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBmbG9hdCAqZmxvYXREYXRhID0gb3V0cHV0LmdldEJsb2NrKCk7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBtU2l6ZUluRnJhbWVzIC0gbUZyYW1lSW5kZXg7CisgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBzdGQ6Om1pbihudW1GcmFtZXMsIGZyYW1lc0xlZnQpOworICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIGNoYW5uZWxDb3VudDsKKworICAgIGNvbnN0IHVpbnQ4X3QgKmJ5dGVCYXNlID0gKHVpbnQ4X3QgKikgbURhdGE7CisgICAgY29uc3QgdWludDhfdCAqYnl0ZURhdGEgPSAmYnl0ZUJhc2VbbUZyYW1lSW5kZXggKiBjaGFubmVsQ291bnQgKiBrQnl0ZXNQZXJJMjRQYWNrZWRdOworCisjaWZkZWYgX19BTkRST0lEX18KKyAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9wMjQoZmxvYXREYXRhLCBieXRlRGF0YSwgbnVtU2FtcGxlcyk7CisjZWxzZQorICAgIHN0YXRpYyBjb25zdCBmbG9hdCBzY2FsZSA9IDEuIC8gKGZsb2F0KSgxVUwgPDwgMzEpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgIC8vIEFzc2VtYmxlIHRoZSBkYXRhIGFzc3VtaW5nIExpdHRsZSBFbmRpYW4gZm9ybWF0LgorICAgICAgICBpbnQzMl90IHBhZCA9IGJ5dGVEYXRhWzJdOworICAgICAgICBwYWQgPDw9IDg7CisgICAgICAgIHBhZCB8PSBieXRlRGF0YVsxXTsKKyAgICAgICAgcGFkIDw8PSA4OworICAgICAgICBwYWQgfD0gYnl0ZURhdGFbMF07CisgICAgICAgIHBhZCA8PD0gODsgLy8gU2hpZnQgdG8gMzIgYml0IGRhdGEgc28gdGhlIHNpZ24gaXMgY29ycmVjdC4KKyAgICAgICAgYnl0ZURhdGEgKz0ga0J5dGVzUGVySTI0UGFja2VkOworICAgICAgICAqZmxvYXREYXRhKysgPSBwYWQgKiBzY2FsZTsgLy8gc2NhbGUgdG8gcmFuZ2UgLTEuMCB0byAxLjAKKyAgICB9CisjZW5kaWYKKworICAgIG1GcmFtZUluZGV4ICs9IGZyYW1lc1RvUHJvY2VzczsKKyAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlmMTRkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX1NPVVJDRV9JMjRfSAorI2RlZmluZSBGTE9XR1JBUEhfU09VUkNFX0kyNF9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgU291cmNlSTI0IDogcHVibGljIEF1ZGlvU291cmNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBTb3VyY2VJMjQoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1NPVVJDRV9JMjRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwCmluZGV4IGE2YjlmNWQuLjJlZGFiNTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAKQEAgLTc4LDggKzc4LDkgQEAKIAogdm9pZCBBdWRpb1N0cmVhbUxlZ2FjeTo6cHJvY2Vzc0NhbGxiYWNrQ29tbW9uKGFhdWRpb19jYWxsYmFja19vcGVyYXRpb25fdCBvcGNvZGUsIHZvaWQgKmluZm8pIHsKICAgICBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBjYWxsYmFja1Jlc3VsdDsKLSAgICAvLyBUaGlzIGlsbGVnYWwgc2l6ZSBjYW4gYmUgdXNlZCB0byB0ZWxsIEF1ZGlvRmxpbmdlciB0byBzdG9wIGNhbGxpbmcgdXMuCi0gICAgLy8gVGhpcyB0YWtlcyBhZHZhbnRhZ2Ugb2YgQXVkaW9GbGluZ2VyIGtpbGxpbmcgdGhlIHN0cmVhbS4KKyAgICAvLyBUaGlzIGlsbGVnYWwgc2l6ZSBjYW4gYmUgdXNlZCB0byB0ZWxsIEF1ZGlvUmVjb3JkIG9yIEF1ZGlvVHJhY2sgdG8gc3RvcCBjYWxsaW5nIHVzLgorICAgIC8vIFRoaXMgdGFrZXMgYWR2YW50YWdlIG9mIHRoZW0ga2lsbGluZyB0aGUgc3RyZWFtIHdoZW4gdGhleSBzZWUgYSBzaXplIG91dCBvZiByYW5nZS4KKyAgICAvLyBUaGF0IGlzIGFuIHVuZG9jdW1lbnRlZCBiZWhhdmlvci4KICAgICAvLyBUT0RPIGFkZCB0byBBUEkgaW4gQXVkaW9SZWNvcmQgYW5kIEF1ZGlvVHJhY2sKICAgICBjb25zdCBzaXplX3QgU0laRV9TVE9QX0NBTExCQUNLUyA9IFNJWkVfTUFYOwogCkBAIC05NSw3ICs5Niw3IEBACiAgICAgICAgICAgICAgICAgQUxPR1coInByb2Nlc3NDYWxsYmFja0NvbW1vbigpIGRhdGEsIHN0cmVhbSBkaXNjb25uZWN0ZWQiKTsKICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IFNJWkVfU1RPUF9DQUxMQkFDS1M7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtQ2FsbGJhY2tFbmFibGVkLmxvYWQoKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJwcm9jZXNzQ2FsbGJhY2tDb21tb24oKSBzdG9wcGluZyBiZWNhdXNlIGNhbGxiYWNrIGRpc2FibGVkIik7CisgICAgICAgICAgICAgICAgQUxPR1coInByb2Nlc3NDYWxsYmFja0NvbW1vbigpIG5vIGRhdGEgYmVjYXVzZSBjYWxsYmFjayBkaXNhYmxlZCIpOwogICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gU0laRV9TVE9QX0NBTExCQUNLUzsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ID09IDApIHsKQEAgLTExNSwxMCArMTE2LDE2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFKSB7CiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgKiBnZXRCeXRlc1BlckRldmljZUZyYW1lKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gU1RPUCBvciBpbnZhbGlkIHJlc3VsdAotICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBjYWxsYmFjayByZXF1ZXN0ZWQgc3RvcCwgZmFrZSBhbiBlcnJvciIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSBTSVpFX1NUT1BfQ0FMTEJBQ0tTOwotICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBjYWxsYmFjayBqdXN0IGluIGNhc2UgQXVkaW9GbGluZ2VyIGtlZXBzIHRyeWluZyB0byBjYWxsIHVzLgorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCIlcygpIGNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGNhbGxiYWNrIHJldHVybmVkIGludmFsaWQgcmVzdWx0ID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNhbGxiYWNrUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHN5c3RlbVN0b3BGcm9tQ2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSB0aGUgY2FsbGJhY2sganVzdCBpbiBjYXNlIHRoZSBzeXN0ZW0ga2VlcHMgdHJ5aW5nIHRvIGNhbGwgdXMuCiAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOwogICAgICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgKaW5kZXggNDk0ZWRiYy4uOGU3ODU1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oCkBAIC03Nyw3ICs3Nyw2IEBACiAKICAgICB2aXJ0dWFsIGludDY0X3QgaW5jcmVtZW50Q2xpZW50RnJhbWVDb3VudGVyKGludDMyX3QgZnJhbWVzKSAgPSAwOwogCi0KICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0RnJhbWVzV3JpdHRlbigpIG92ZXJyaWRlIHsKICAgICAgICAgcmV0dXJuIG1GcmFtZXNXcml0dGVuLmdldCgpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcAppbmRleCA1MDVmMmVlLi40YTY1ZmM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwCkBAIC01Nyw2ICs1Nyw5IEBACiAKICAgICAvLyBUcnkgdG8gY3JlYXRlIGFuIEF1ZGlvUmVjb3JkCiAKKyAgICBjb25zdCBhYXVkaW9fc2Vzc2lvbl9pZF90IHJlcXVlc3RlZFNlc3Npb25JZCA9IGJ1aWxkZXIuZ2V0U2Vzc2lvbklkKCk7CisgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKHJlcXVlc3RlZFNlc3Npb25JZCk7CisKICAgICAvLyBUT0RPIFN1cHBvcnQgVU5TUEVDSUZJRUQgaW4gQXVkaW9SZWNvcmQuIEZvciBub3csIHVzZSBzdGVyZW8gaWYgdW5zcGVjaWZpZWQuCiAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSAoZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAyIDogZ2V0U2FtcGxlc1BlckZyYW1lKCk7CkBAIC02NiwyMyArNjksMjcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIDogYnVpbGRlci5nZXRCdWZmZXJDYXBhY2l0eSgpOwogCiAKLSAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FOworICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3M7CiAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSA9IGdldFBlcmZvcm1hbmNlTW9kZSgpOwogICAgIHN3aXRjaCAocGVyZk1vZGUpIHsKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWToKLSAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChBVURJT19JTlBVVF9GTEFHX0ZBU1QgfCBBVURJT19JTlBVVF9GTEFHX1JBVyk7CisgICAgICAgICAgICAvLyBJZiB0aGUgYXBwIGFza3MgZm9yIGEgc2Vzc2lvbklkIHRoZW4gaXQgbWVhbnMgdGhleSB3YW50IHRvIHVzZSBlZmZlY3RzLgorICAgICAgICAgICAgLy8gU28gZG9uJ3QgdXNlIFJBVyBmbGFnLgorICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKChyZXF1ZXN0ZWRTZXNzaW9uSWQgPT0gQUFVRElPX1NFU1NJT05fSURfTk9ORSkKKyAgICAgICAgICAgICAgICAgICAgPyAoQVVESU9fSU5QVVRfRkxBR19GQVNUIHwgQVVESU9fSU5QVVRfRkxBR19SQVcpCisgICAgICAgICAgICAgICAgICAgIDogKEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkc6CiAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORToKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIE5vIGZsYWdzLgorICAgICAgICAgICAgZmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkU7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKICAgICAvLyBQcmVzZXJ2ZSBiZWhhdmlvciBvZiBBUEkgMjYKLSAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRCkgewotICAgICAgICBzZXRGb3JtYXQoQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOworICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICBzZXRGb3JtYXQoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CiAgICAgfQogCiAgICAgLy8gTWF5YmUgY2hhbmdlIGRldmljZSBmb3JtYXQgdG8gZ2V0IGEgRkFTVCBwYXRoLgpAQCAtOTksMTIgKzEwNiwxMiBAQAogICAgIC8vIFdlIGp1c3QgbWF5IG5vdCBnZXQgYSBGQVNUIHRyYWNrLgogICAgIC8vIEJ1dCB3ZSB3b3VsZG4ndCBoYXZlIGFueXdheSB3aXRob3V0IHRoaXMgaGFjay4KICAgICBjb25zdGV4cHIgaW50MzJfdCBrTW9zdExpa2VseVNhbXBsZVJhdGVGb3JGYXN0ID0gNDgwMDA7Ci0gICAgaWYgKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUCisgICAgaWYgKGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKICAgICAgICAgICAgICYmIHBlcmZNb2RlID09IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZCiAgICAgICAgICAgICAmJiAoc2FtcGxlc1BlckZyYW1lIDw9IDIpIC8vIEZBU1Qgb25seSBmb3IgbW9ubyBhbmQgc3RlcmVvCiAgICAgICAgICAgICAmJiAoZ2V0U2FtcGxlUmF0ZSgpID09IGtNb3N0TGlrZWx5U2FtcGxlUmF0ZUZvckZhc3QKICAgICAgICAgICAgICAgICB8fCBnZXRTYW1wbGVSYXRlKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSkgewotICAgICAgICBzZXREZXZpY2VGb3JtYXQoQUFVRElPX0ZPUk1BVF9QQ01fSTE2KTsKKyAgICAgICAgc2V0RGV2aWNlRm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKICAgICB9IGVsc2UgewogICAgICAgICBzZXREZXZpY2VGb3JtYXQoZ2V0Rm9ybWF0KCkpOwogICAgIH0KQEAgLTE0MSwxNCArMTQ4LDEwIEBACiAgICAgICAgICAgICAudGFncyA9ICIiCiAgICAgfTsKIAotICAgIGFhdWRpb19zZXNzaW9uX2lkX3QgcmVxdWVzdGVkU2Vzc2lvbklkID0gYnVpbGRlci5nZXRTZXNzaW9uSWQoKTsKLSAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQocmVxdWVzdGVkU2Vzc2lvbklkKTsKLQogICAgIC8vIC0tLS0tLS0tLS0tIG9wZW4gdGhlIEF1ZGlvUmVjb3JkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vIE1pZ2h0IHJldHJ5LCBidXQgbmV2ZXIgbW9yZSB0aGFuIG9uY2UuCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpICsrKSB7Ci0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IHJlcXVlc3RlZEludGVybmFsRm9ybWF0ID0KLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoZ2V0RGV2aWNlRm9ybWF0KCkpOworICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCByZXF1ZXN0ZWRJbnRlcm5hbEZvcm1hdCA9IGdldERldmljZUZvcm1hdCgpOwogCiAgICAgICAgIG1BdWRpb1JlY29yZCA9IG5ldyBBdWRpb1JlY29yZCgKICAgICAgICAgICAgICAgICBtT3BQYWNrYWdlTmFtZSAvLyBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSBUT0RPIGRvZXMgbm90IGNvbXBpbGUKQEAgLTIxNCw4ICsyMTcsOCBAQAogICAgIH0KIAogICAgIC8vIEFsbG9jYXRlIGZvcm1hdCBjb252ZXJzaW9uIGJ1ZmZlciBpZiBuZWVkZWQuCi0gICAgaWYgKGdldERldmljZUZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0kxNgotICAgICAgICAmJiBnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgIGlmIChnZXREZXZpY2VGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgICAgICAmJiBnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CiAKICAgICAgICAgaWYgKGJ1aWxkZXIuZ2V0RGF0YUNhbGxiYWNrUHJvYygpICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBjYWxsYmFjayB0aGVuIHdlIG5lZWQgdG8gY29udmVydCB0aGUgZGF0YSBpbnRvIGFuIGludGVybmFsIGZsb2F0CkBAIC0zMjMsMTYgKzMyNiwxMyBAQAogICAgIGlmIChtQXVkaW9SZWNvcmQuZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQotICAgIC8vIEdldCBjdXJyZW50IHBvc2l0aW9uIHNvIHdlIGNhbiBkZXRlY3Qgd2hlbiB0aGUgdHJhY2sgaXMgcmVjb3JkaW5nLgotICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1JlY29yZC0+Z2V0UG9zaXRpb24oJm1Qb3NpdGlvbldoZW5TdGFydGluZyk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKLSAgICB9CiAKLSAgICAvLyBFbmFibGUgY2FsbGJhY2sgYmVmb3JlIHN0YXJ0aW5nIEF1ZGlvVHJhY2sgdG8gYXZvaWQgc2h1dHRpbmcKKyAgICAvLyBFbmFibGUgY2FsbGJhY2sgYmVmb3JlIHN0YXJ0aW5nIEF1ZGlvUmVjb3JkIHRvIGF2b2lkIHNodXR0aW5nCiAgICAgLy8gZG93biBiZWNhdXNlIG9mIGEgcmFjZSBjb25kaXRpb24uCiAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZSh0cnVlKTsKLSAgICBlcnIgPSBtQXVkaW9SZWNvcmQtPnN0YXJ0KCk7CisgICAgbUZyYW1lc1dyaXR0ZW4ucmVzZXQzMigpOyAvLyBzZXJ2aWNlIHdyaXRlcyBmcmFtZXMKKyAgICBtVGltZXN0YW1wUG9zaXRpb24ucmVzZXQzMigpOworICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1JlY29yZC0+c3RhcnQoKTsgLy8gcmVzZXRzIHBvc2l0aW9uIHRvIHplcm8KICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwogICAgIH0gZWxzZSB7CkBAIC0zNDYsMTIgKzM0NiwxMCBAQAogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpOwotICAgIGluY3JlbWVudEZyYW1lc1dyaXR0ZW4oZ2V0RnJhbWVzUmVhZCgpIC0gZ2V0RnJhbWVzV3JpdHRlbigpKTsgLy8gVE9ETyByZXZpZXcKLSAgICBtVGltZXN0YW1wUG9zaXRpb24uc2V0KGdldEZyYW1lc1JlYWQoKSk7CisgICAgbUZyYW1lc1dyaXR0ZW4uY2F0Y2hVcFRvKGdldEZyYW1lc1JlYWQoKSk7CisgICAgbVRpbWVzdGFtcFBvc2l0aW9uLmNhdGNoVXBUbyhnZXRGcmFtZXNSZWFkKCkpOwogICAgIG1BdWRpb1JlY29yZC0+c3RvcCgpOwogICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOwotICAgIG1GcmFtZXNXcml0dGVuLnJlc2V0MzIoKTsgLy8gc2VydmljZSB3cml0ZXMgZnJhbWVzLCBzZXJ2aWNlIHBvc2l0aW9uIHJlc2V0IG9uIGZsdXNoCi0gICAgbVRpbWVzdGFtcFBvc2l0aW9uLnJlc2V0MzIoKTsKICAgICAvLyBQYXNzIGZhbHNlIHRvIHByZXZlbnQgZXJyb3JDYWxsYmFjayBmcm9tIGJlaW5nIGNhbGxlZCBhZnRlciBkaXNjb25uZWN0CiAgICAgLy8gd2hlbiBhcHAgaGFzIGFscmVhZHkgcmVxdWVzdGVkIGEgc3RvcCgpLgogICAgIHJldHVybiBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KGZhbHNlKTsKQEAgLTM2NSwxMCArMzYzLDEyIEBACiAgICAgc3dpdGNoIChnZXRTdGF0ZSgpKSB7CiAgICAgLy8gVE9ETyBhZGQgYmV0dGVyIHN0YXRlIHZpc2liaWxpdHkgdG8gQXVkaW9SZWNvcmQKICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkc6CisgICAgICAgIC8vIFdoZW4gc3RhcnRpbmcsIHRoZSBwb3NpdGlvbiB3aWxsIGJlZ2luIGF0IHplcm8gYW5kIHRoZW4gZ28gcG9zaXRpdmUuCisgICAgICAgIC8vIFRoZSBwb3NpdGlvbiBjYW4gd3JhcCBidXQgYnkgdGhhdCB0aW1lIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBTVEFSVElORy4KICAgICAgICAgZXJyID0gbUF1ZGlvUmVjb3JkLT5nZXRQb3NpdGlvbigmcG9zaXRpb24pOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwotICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uICE9IG1Qb3NpdGlvbldoZW5TdGFydGluZykgeworICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID4gMCkgewogICAgICAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKQEAgLTQ4Myw2ICs0ODMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpmcmFtZVBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3NlY29uZHMpIHsKICAgICBFeHRlbmRlZFRpbWVzdGFtcCBleHRlbmRlZFRpbWVzdGFtcDsKKyAgICBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9SZWNvcmQtPmdldFRpbWVzdGFtcCgmZXh0ZW5kZWRUaW1lc3RhbXApOwogICAgIGlmIChzdGF0dXMgPT0gV09VTERfQkxPQ0spIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwpAQCAtNDk4LDEyICs1MDEsMTIgQEAKICAgICBzd2l0Y2ggKGdldFN0YXRlKCkpIHsKICAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJUSU5HOgogICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRDoKLSAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HOgogICAgICAgICAgICAgcmVzdWx0ID0gbUF1ZGlvUmVjb3JkLT5nZXRQb3NpdGlvbigmcG9zaXRpb24pOwogICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgewogICAgICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuLnVwZGF0ZTMyKHBvc2l0aW9uKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkc6CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwCmluZGV4IDUwNWNkNzcuLmZmOTVhZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwCkBAIC01OSwxOCArNTksMjUgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKKyAgICBjb25zdCBhYXVkaW9fc2Vzc2lvbl9pZF90IHJlcXVlc3RlZFNlc3Npb25JZCA9IGJ1aWxkZXIuZ2V0U2Vzc2lvbklkKCk7CisgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKHJlcXVlc3RlZFNlc3Npb25JZCk7CisKICAgICAvLyBUcnkgdG8gY3JlYXRlIGFuIEF1ZGlvVHJhY2sKICAgICAvLyBVc2Ugc3RlcmVvIGlmIHVuc3BlY2lmaWVkLgogICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gKGdldFNhbXBsZXNQZXJGcmFtZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMiA6IGdldFNhbXBsZXNQZXJGcmFtZSgpOwogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KHNhbXBsZXNQZXJGcmFtZSk7CiAKLSAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3M7CiAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSA9IGdldFBlcmZvcm1hbmNlTW9kZSgpOwogICAgIHN3aXRjaChwZXJmTW9kZSkgewogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZOgogICAgICAgICAgICAgLy8gQnlwYXNzIHRoZSBub3JtYWwgbWl4ZXIgYW5kIGdvIHN0cmFpZ2h0IHRvIHRoZSBGQVNUIG1peGVyLgotICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgfCBBVURJT19PVVRQVVRfRkxBR19SQVcpOworICAgICAgICAgICAgLy8gSWYgdGhlIGFwcCBhc2tzIGZvciBhIHNlc3Npb25JZCB0aGVuIGl0IG1lYW5zIHRoZXkgd2FudCB0byB1c2UgZWZmZWN0cy4KKyAgICAgICAgICAgIC8vIFNvIGRvbid0IHVzZSBSQVcgZmxhZy4KKyAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAoKHJlcXVlc3RlZFNlc3Npb25JZCA9PSBBQVVESU9fU0VTU0lPTl9JRF9OT05FKQorICAgICAgICAgICAgICAgICAgICA/IChBVURJT19PVVRQVVRfRkxBR19GQVNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfUkFXKQorICAgICAgICAgICAgICAgICAgICA6IChBVURJT19PVVRQVVRfRkxBR19GQVNUKSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX1BPV0VSX1NBVklORzoKQEAgLTgxLDYgKzg4LDcgQEAKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOgogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgLy8gTm8gZmxhZ3MuIFVzZSBhIG5vcm1hbCBtaXhlciBpbiBmcm9udCBvZiB0aGUgRkFTVCBtaXhlci4KKyAgICAgICAgICAgIGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtODgsOSArOTYsOSBAQAogCiAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwOwogCi0gICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQpCisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKQogICAgICAgICAgICAgPyBBVURJT19GT1JNQVRfUENNX0ZMT0FUCi0gICAgICAgICAgICA6IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChnZXRGb3JtYXQoKSk7CisgICAgICAgICAgICA6IGdldEZvcm1hdCgpOwogCiAgICAgLy8gU2V0dXAgdGhlIGNhbGxiYWNrIGlmIHRoZXJlIGlzIG9uZS4KICAgICBBdWRpb1RyYWNrOjpjYWxsYmFja190IGNhbGxiYWNrID0gbnVsbHB0cjsKQEAgLTEzNSwxMSArMTQzLDYgQEAKICAgICAgICAgICAgIC50YWdzID0gIiIKICAgICB9OwogCi0gICAgc3RhdGljX2Fzc2VydChBQVVESU9fVU5TUEVDSUZJRUQgPT0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwgIlNlc3Npb24gSURzIHNob3VsZCBtYXRjaCIpOwotCi0gICAgYWF1ZGlvX3Nlc3Npb25faWRfdCByZXF1ZXN0ZWRTZXNzaW9uSWQgPSBidWlsZGVyLmdldFNlc3Npb25JZCgpOwotICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFNlc3Npb25JZChyZXF1ZXN0ZWRTZXNzaW9uSWQpOwotCiAgICAgbUF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjaygpOwogICAgIG1BdWRpb1RyYWNrLT5zZXQoCiAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgIC8vIGlnbm9yZWQgYmVjYXVzZSB3ZSBwYXNzIGF0dHJpYnV0ZXMgYmVsb3cKQEAgLTE3OCwxMCArMTgxLDggQEAKIAogICAgIC8vIEdldCB0aGUgYWN0dWFsIHZhbHVlcyBmcm9tIHRoZSBBdWRpb1RyYWNrLgogICAgIHNldFNhbXBsZXNQZXJGcmFtZShtQXVkaW9UcmFjay0+Y2hhbm5lbENvdW50KCkpOwotICAgIGFhdWRpb19mb3JtYXRfdCBhYXVkaW9Gb3JtYXQgPQotICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9EYXRhRm9ybWF0KG1BdWRpb1RyYWNrLT5mb3JtYXQoKSk7Ci0gICAgc2V0Rm9ybWF0KGFhdWRpb0Zvcm1hdCk7Ci0gICAgc2V0RGV2aWNlRm9ybWF0KGFhdWRpb0Zvcm1hdCk7CisgICAgc2V0Rm9ybWF0KG1BdWRpb1RyYWNrLT5mb3JtYXQoKSk7CisgICAgc2V0RGV2aWNlRm9ybWF0KG1BdWRpb1RyYWNrLT5mb3JtYXQoKSk7CiAKICAgICBpbnQzMl90IGFjdHVhbFNhbXBsZVJhdGUgPSBtQXVkaW9UcmFjay0+Z2V0U2FtcGxlUmF0ZSgpOwogICAgIEFMT0dXX0lGKGFjdHVhbFNhbXBsZVJhdGUgIT0gZ2V0U2FtcGxlUmF0ZSgpLApAQCAtMjg3LDcgKzI4OCw3IEBACiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0UGF1c2UoKSB7CiAgICAgaWYgKG1BdWRpb1RyYWNrLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoInJlcXVlc3RQYXVzZSgpIG5vIEF1ZGlvVHJhY2siKTsKKyAgICAgICAgQUxPR0UoIiVzKCkgbm8gQXVkaW9UcmFjayIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIApAQCAtMzAzLDcgKzMwNCw3IEBACiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0Rmx1c2goKSB7CiAgICAgaWYgKG1BdWRpb1RyYWNrLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoInJlcXVlc3RGbHVzaCgpIG5vIEF1ZGlvVHJhY2siKTsKKyAgICAgICAgQUxPR0UoIiVzKCkgbm8gQXVkaW9UcmFjayIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIApAQCAtMzE3LDEzICszMTgsMTMgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RTdG9wKCkgewogICAgIGlmIChtQXVkaW9UcmFjay5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJyZXF1ZXN0U3RvcCgpIG5vIEF1ZGlvVHJhY2siKTsKKyAgICAgICAgQUxPR0UoIiVzKCkgbm8gQXVkaW9UcmFjayIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIAogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpOwotICAgIGluY3JlbWVudEZyYW1lc1JlYWQoZ2V0RnJhbWVzV3JpdHRlbigpIC0gZ2V0RnJhbWVzUmVhZCgpKTsgLy8gVE9ETyByZXZpZXcKLSAgICBtVGltZXN0YW1wUG9zaXRpb24uc2V0KGdldEZyYW1lc1dyaXR0ZW4oKSk7CisgICAgbUZyYW1lc1JlYWQuY2F0Y2hVcFRvKGdldEZyYW1lc1dyaXR0ZW4oKSk7CisgICAgbVRpbWVzdGFtcFBvc2l0aW9uLmNhdGNoVXBUbyhnZXRGcmFtZXNXcml0dGVuKCkpOwogICAgIG1GcmFtZXNSZWFkLnJlc2V0MzIoKTsgLy8gc2VydmljZSByZWFkcyBmcmFtZXMsIHNlcnZpY2UgcG9zaXRpb24gcmVzZXQgb24gc3RvcAogICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5yZXNldDMyKCk7CiAgICAgbUF1ZGlvVHJhY2stPnN0b3AoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKaW5kZXggNDBlYmI3Ni4uNzIzY2JmMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKQEAgLTMzLDM5NSArMzMsNiBAQAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotLy8gVGhpcyBpcyAzIGRCLCAoMTBeKDMvMjApKSwgdG8gbWF0Y2ggdGhlIG1heGltdW0gaGVhZHJvb20gaW4gQXVkaW9UcmFjayBmb3IgZmxvYXQgZGF0YS4KLS8vIEl0IGlzIGRlc2lnbmVkIHRvIGFsbG93IG9jY2FzaW9uYWwgdHJhbnNpZW50IHBlYWtzLgotI2RlZmluZSBNQVhfSEVBRFJPT00gKDEuNDEyNTM3NTRmKQotI2RlZmluZSBNSU5fSEVBRFJPT00gKDAgLSBNQVhfSEVBRFJPT00pCi0KLWludDMyX3QgQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKLSAgICBpbnQzMl90IHNpemUgPSBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKLSAgICBzd2l0Y2ggKGZvcm1hdCkgewotICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kxNjoKLSAgICAgICAgICAgIHNpemUgPSBzaXplb2YoaW50MTZfdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKLSAgICAgICAgICAgIHNpemUgPSBzaXplb2YoZmxvYXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLS8vIFRPRE8gZXhwb3NlIGFuZCBjYWxsIGNsYW1wMTZfZnJvbV9mbG9hdCBmdW5jdGlvbiBpbiBwcmltaXRpdmVzLmgKLXN0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2X2Zyb21fZmxvYXQoZmxvYXQgZikgewotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBzY2FsZSA9IDEgPDwgMTU7Ci0gICAgcmV0dXJuIChpbnQxNl90KSByb3VuZGYoZm1heGYoZm1pbmYoZiAqIHNjYWxlLCBzY2FsZSAtIDEuZiksIC1zY2FsZSkpOwotfQotCi0vLyBDbGlwIHRvIHZhbGlkIHJhbmdlIG9mIGEgZmxvYXQgc2FtcGxlIHRvIHByZXZlbnQgZXhjZXNzaXZlIHZvbHVtZS4KLS8vIEJ5IHVzaW5nIGZtaW4gYW5kIGZtYXggd2UgYWxzbyBwcm90ZWN0IGFnYWluc3QgTmFOLgotc3RhdGljIGZsb2F0IGNsaXBUb01pbk1heEhlYWRyb29tKGZsb2F0IGlucHV0KSB7Ci0gICAgcmV0dXJuIGZtaW4oTUFYX0hFQURST09NLCBmbWF4KE1JTl9IRUFEUk9PTSwgaW5wdXQpKTsKLX0KLQotc3RhdGljIGZsb2F0IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihmbG9hdCBzYW1wbGUsIGZsb2F0IHNjYWxlcikgewotICAgIC8vIENsaXAgdG8gdmFsaWQgcmFuZ2Ugb2YgYSBmbG9hdCBzYW1wbGUgdG8gcHJldmVudCBleGNlc3NpdmUgdm9sdW1lLgotICAgIHNhbXBsZSA9IGNsaXBUb01pbk1heEhlYWRyb29tKHNhbXBsZSk7Ci0KLSAgICAvLyBTY2FsZSBhbmQgY29udmVydCB0byBhIHNob3J0LgotICAgIGZsb2F0IGZ2YWwgPSBzYW1wbGUgKiBzY2FsZXI7Ci0gICAgcmV0dXJuIGNsYW1wMTZfZnJvbV9mbG9hdChmdmFsKTsKLX0KLQotdm9pZCBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNihjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpIHsKLSAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKLSAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihzYW1wbGUsIHNjYWxlcik7Ci0gICAgfQotfQotCi12b2lkIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxOwotICAgIC8vIGRpdmlkZSBieSBudW1GcmFtZXMgc28gdGhhdCB3ZSBhbG1vc3QgcmVhY2ggYW1wbGl0dWRlMgotICAgIGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHNhbXBsZUluZGV4ID0gMDsgc2FtcGxlSW5kZXggPCBzYW1wbGVzUGVyRnJhbWU7IHNhbXBsZUluZGV4KyspIHsKLSAgICAgICAgICAgIGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKLSAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gY2xpcEFuZENsYW1wRmxvYXRUb1BjbTE2KHNhbXBsZSwgc2NhbGVyKTsKLSAgICAgICAgfQotICAgICAgICBzY2FsZXIgKz0gZGVsdGE7Ci0gICAgfQotfQotCi0jZGVmaW5lIFNIT1JUX1NDQUxFICAzMjc2OAotCi12b2lkIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSkgewotICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZSAvIFNIT1JUX1NDQUxFOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7Ci0gICAgICAgIGRlc3RpbmF0aW9uW2ldID0gc291cmNlW2ldICogc2NhbGVyOwotICAgIH0KLX0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdChjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMSAvIFNIT1JUX1NDQUxFOwotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIChTSE9SVF9TQ0FMRSAqIChmbG9hdCkgbnVtRnJhbWVzKTsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHNhbXBsZUluZGV4ID0gMDsgc2FtcGxlSW5kZXggPCBzYW1wbGVzUGVyRnJhbWU7IHNhbXBsZUluZGV4KyspIHsKLSAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gKnNvdXJjZSsrICogc2NhbGVyOwotICAgICAgICB9Ci0gICAgICAgIHNjYWxlciArPSBkZWx0YTsKLSAgICB9Ci19Ci0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9fbGluZWFyUmFtcChjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTE7Ci0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgZm9yIChpbnQgc2FtcGxlSW5kZXggPSAwOyBzYW1wbGVJbmRleCA8IHNhbXBsZXNQZXJGcmFtZTsgc2FtcGxlSW5kZXgrKykgewotICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotICAgICAgICAgICAgLy8gQ2xpcCB0byB2YWxpZCByYW5nZSBvZiBhIGZsb2F0IHNhbXBsZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSB2b2x1bWUuCi0gICAgICAgICAgICBzYW1wbGUgPSBjbGlwVG9NaW5NYXhIZWFkcm9vbShzYW1wbGUpOwotCi0gICAgICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZSAqIHNjYWxlcjsKLSAgICAgICAgfQotICAgICAgICBzY2FsZXIgKz0gZGVsdGE7Ci0gICAgfQotfQotCi0vLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCi12b2lkIEFBdWRpb19saW5lYXJSYW1wKGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIC8vIEJlY2F1c2Ugd2UgYXJlIGNvbnZlcnRpbmcgZnJvbSBpbnQxNiB0byAxbnQxNiwgd2UgZG8gbm90IGhhdmUgdG8gc2NhbGUgYnkgMS8zMjc2OC4KLSAgICBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxOwotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHNhbXBsZUluZGV4ID0gMDsgc2FtcGxlSW5kZXggPCBzYW1wbGVzUGVyRnJhbWU7IHNhbXBsZUluZGV4KyspIHsKLSAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gY2xpcCBiZWNhdXNlIGludDE2X3QgcmFuZ2UgaXMgaW5oZXJlbnRseSBsaW1pdGVkLgotICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gICpzb3VyY2UrKyAqIHNjYWxlcjsKLSAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gKGludDE2X3QpIHJvdW5kZihzYW1wbGUpOwotICAgICAgICB9Ci0gICAgICAgIHNjYWxlciArPSBkZWx0YTsKLSAgICB9Ci19Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvbnZlcnQgTW9ubyBUbyBTdGVyZW8gYXQgdGhlIHNhbWUgdGltZSBhcyBjb252ZXJ0aW5nIGZvcm1hdC4KLXZvaWQgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpIHsKLSAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgewotICAgICAgICBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7Ci0gICAgICAgIGludDE2X3Qgc2FtcGxlMTYgPSBjbGlwQW5kQ2xhbXBGbG9hdFRvUGNtMTYoc2FtcGxlLCBzY2FsZXIpOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTE2OwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTE2OwotICAgIH0KLX0KLQotdm9pZCBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbyhjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICAvLyBkaXZpZGUgYnkgbnVtRnJhbWVzIHNvIHRoYXQgd2UgYWxtb3N0IHJlYWNoIGFtcGxpdHVkZTIKLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyBudW1GcmFtZXM7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxICsgKGZyYW1lSW5kZXggKiBkZWx0YSk7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKLSAgICAgICAgaW50MTZfdCBzYW1wbGUxNiA9IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihzYW1wbGUsIHNjYWxlcik7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgfQotfQotCi12b2lkIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKSB7Ci0gICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlIC8gU0hPUlRfU0NBTEU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgewotICAgICAgICBmbG9hdCBzYW1wbGUgPSBzb3VyY2VbaV0gKiBzY2FsZXI7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTsKLSAgICB9Ci19Ci0KLS8vIFRoaXMgY29kZSBhc3N1bWVzIGFtcGxpdHVkZTEgYW5kIGFtcGxpdHVkZTIgYXJlIGJldHdlZW4gMC4wIGFuZCAxLjAKLXZvaWQgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgY29uc3QgZmxvYXQgc2NhbGVyMSA9IGFtcGxpdHVkZTEgLyBTSE9SVF9TQ0FMRTsKLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyAoU0hPUlRfU0NBTEUgKiAoZmxvYXQpIG51bUZyYW1lcyk7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBmbG9hdCBzY2FsZXIgPSBzY2FsZXIxICsgKGZyYW1lSW5kZXggKiBkZWx0YSk7Ci0gICAgICAgIGZsb2F0IHNhbXBsZSA9IHNvdXJjZVtmcmFtZUluZGV4XSAqIHNjYWxlcjsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGU7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlOwotICAgIH0KLX0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9fbGluZWFyUmFtcE1vbm9Ub1N0ZXJlbyhjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotCi0gICAgICAgIC8vIENsaXAgdG8gdmFsaWQgcmFuZ2Ugb2YgYSBmbG9hdCBzYW1wbGUgdG8gcHJldmVudCBleGNlc3NpdmUgdm9sdW1lLgotICAgICAgICBzYW1wbGUgPSBjbGlwVG9NaW5NYXhIZWFkcm9vbShzYW1wbGUpOwotCi0gICAgICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTEgKyAoZnJhbWVJbmRleCAqIGRlbHRhKTsKLSAgICAgICAgZmxvYXQgc2FtcGxlU2NhbGVkID0gc2FtcGxlICogc2NhbGVyOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZVNjYWxlZDsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGVTY2FsZWQ7Ci0gICAgfQotfQotCi0vLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCi12b2lkIEFBdWRpb19saW5lYXJSYW1wTW9ub1RvU3RlcmVvKGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgLy8gQmVjYXVzZSB3ZSBhcmUgY29udmVydGluZyBmcm9tIGludDE2IHRvIDFudDE2LCB3ZSBkbyBub3QgaGF2ZSB0byBzY2FsZSBieSAxLzMyNzY4LgotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTEgKyAoZnJhbWVJbmRleCAqIGRlbHRhKTsKLSAgICAgICAgLy8gTm8gbmVlZCB0byBjbGlwIGJlY2F1c2UgaW50MTZfdCByYW5nZSBpcyBpbmhlcmVudGx5IGxpbWl0ZWQuCi0gICAgICAgIGNvbnN0IGZsb2F0IHNhbXBsZSA9ICAqc291cmNlKysgKiBzY2FsZXI7Ci0gICAgICAgIGludDE2X3Qgc2FtcGxlMTYgPSAoaW50MTZfdCkgcm91bmRmKHNhbXBsZSk7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgfQotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi12b2lkIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OmNvbnZlcnQoCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCi0gICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgIGZsb2F0IGxldmVsVG8pIHsKLQotICAgIGlmIChzb3VyY2UuY2hhbm5lbENvdW50ID09IDEgJiYgZGVzdGluYXRpb24uY2hhbm5lbENvdW50ID09IDIpIHsKLSAgICAgICAgY29udmVydE1vbm9Ub1N0ZXJlbyhzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBXZSBvbmx5IHN1cHBvcnQgbW9ubyB0byBzdGVyZW8gY29udmVyc2lvbi4gT3RoZXJ3aXNlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KLSAgICAgICAgLy8gbXVzdCBtYXRjaC4KLSAgICAgICAgYXNzZXJ0KHNvdXJjZS5jaGFubmVsQ291bnQgPT0gZGVzdGluYXRpb24uY2hhbm5lbENvdW50KTsKLSAgICAgICAgY29udmVydENoYW5uZWxzTWF0Y2goc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgIH0KLX0KLQotdm9pZCBBQXVkaW9EYXRhQ29udmVydGVyOjpjb252ZXJ0TW9ub1RvU3RlcmVvKAotICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAotICAgICAgICBmbG9hdCBsZXZlbFRvKSB7Ci0KLSAgICAvLyBUaGUgZm9ybWF0cyBhcmUgdmFsaWRhdGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBvcGVuZWQgc28gd2UgZG8gbm90IGhhdmUgdG8KLSAgICAvLyBjaGVjayBmb3IgaWxsZWdhbCBjb21iaW5hdGlvbnMgaGVyZS4KLSAgICBpZiAoc291cmNlLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICBBQXVkaW9fbGluZWFyUmFtcE1vbm9Ub1N0ZXJlbygKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgIGlmIChsZXZlbEZyb20gIT0gbGV2ZWxUbykgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbygKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc291cmNlLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICAgICAgaWYgKGxldmVsRnJvbSAhPSBsZXZlbFRvKSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wTW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OmNvbnZlcnRDaGFubmVsc01hdGNoKAotICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAotICAgICAgICBmbG9hdCBsZXZlbFRvKSB7Ci0gICAgY29uc3QgaW50MzJfdCBudW1TYW1wbGVzID0gbnVtRnJhbWVzICogc291cmNlLmNoYW5uZWxDb3VudDsKLQotICAgIC8vIFRoZSBmb3JtYXRzIGFyZSB2YWxpZGF0ZWQgd2hlbiB0aGUgc3RyZWFtIGlzIG9wZW5lZCBzbyB3ZSBkbyBub3QgaGF2ZSB0bwotICAgIC8vIGNoZWNrIGZvciBpbGxlZ2FsIGNvbWJpbmF0aW9ucyBoZXJlLgotICAgIGlmIChzb3VyY2UuZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICAgICAgaWYgKGxldmVsRnJvbSAhPSBsZXZlbFRvKSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNigKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHNvdXJjZS5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIGlmIChsZXZlbEZyb20gIT0gbGV2ZWxUbykgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICBzb3VyY2UuY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICB9Ci0gICAgfQotfQotCiBzdGF0dXNfdCBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhhYXVkaW9fcmVzdWx0X3QgcmVzdWx0KSB7CiAgICAgLy8gVGhpcyBjb3ZlcnMgdGhlIGNhc2UgZm9yIEFBVURJT19PSyBhbmQgZm9yIHBvc2l0aXZlIHJlc3VsdHMuCiAgICAgaWYgKHJlc3VsdCA+PSAwKSB7CkBAIC01MTMsNiArMTI0LDkgQEAKIGF1ZGlvX2Zvcm1hdF90IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0KSB7CiAgICAgYXVkaW9fZm9ybWF0X3QgYW5kcm9pZEZvcm1hdDsKICAgICBzd2l0Y2ggKGFhdWRpb0Zvcm1hdCkgeworICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDoKKyAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOworICAgICAgICBicmVhazsKICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kxNjoKICAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgICAgICBicmVhazsKQEAgLTUyMCwxNiArMTM0LDE5IEBACiAgICAgICAgIGFuZHJvaWRGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBhbmRyb2lkRm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQgMHglMDhYIHVucmVjb2duaXplZCIsIGFhdWRpb0Zvcm1hdCk7CisgICAgICAgIGFuZHJvaWRGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICAgICAgQUxPR0UoIiVzKCkgMHglMDhYIHVucmVjb2duaXplZCIsIF9fZnVuY19fLCBhYXVkaW9Gb3JtYXQpOwogICAgICAgICBicmVhazsKICAgICB9CiAgICAgcmV0dXJuIGFuZHJvaWRGb3JtYXQ7CiB9CiAKIGFhdWRpb19mb3JtYXRfdCBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0RhdGFGb3JtYXQoYXVkaW9fZm9ybWF0X3QgYW5kcm9pZEZvcm1hdCkgewotICAgIGFhdWRpb19mb3JtYXRfdCBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgYWF1ZGlvX2Zvcm1hdF90IGFhdWRpb0Zvcm1hdDsKICAgICBzd2l0Y2ggKGFuZHJvaWRGb3JtYXQpIHsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOworICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgogICAgICAgICBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1BDTV9JMTY7CiAgICAgICAgIGJyZWFrOwpAQCAtNTM4LDcgKzE1NSw3IEBACiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICAgICAgQUxPR0UoIkFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdCAweCUwOFggdW5yZWNvZ25pemVkIiwgYW5kcm9pZEZvcm1hdCk7CisgICAgICAgIEFMT0dFKCIlcygpIDB4JTA4WCB1bnJlY29nbml6ZWQiLCBfX2Z1bmNfXywgYW5kcm9pZEZvcm1hdCk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gYWF1ZGlvRm9ybWF0OwpAQCAtNTkzLDYgKzIxMCw3IEBACiAgICAgU1RBVElDX0FTU0VSVChBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1JFQ09HTklUSU9OID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTik7CiAgICAgU1RBVElDX0FTU0VSVChBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT04gPT0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04pOwogICAgIFNUQVRJQ19BU1NFUlQoQUFVRElPX0lOUFVUX1BSRVNFVF9VTlBST0NFU1NFRCA9PSBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQpOworICAgIFNUQVRJQ19BU1NFUlQoQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9QRVJGT1JNQU5DRSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0UpOwogICAgIGlmIChwcmVzZXQgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CiAgICAgICAgIHByZXNldCA9IEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT047CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCmluZGV4IDRiOTc1ZTguLmRjMmIxOTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKQEAgLTQ1LDE1NiArNDUsNiBAQAogYXVkaW9fc2Vzc2lvbl90IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKGFhdWRpb19zZXNzaW9uX2lkX3Qgc2Vzc2lvbklkKTsKIAogLyoqCi0gKiBDb252ZXJ0IGFuIGFycmF5IG9mIGZsb2F0cyB0byBhbiBhcnJheSBvZiBpbnQxNl90LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bVNhbXBsZXMgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGUgYXJyYXkKLSAqIEBwYXJhbSBhbXBsaXR1ZGUgbGV2ZWwgYmV0d2VlbiAwLjAgYW5kIDEuMAotICovCi12b2lkIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSk7Ci0KLS8qKgotICogQ29udmVydCBmbG9hdHMgdG8gaW50MTZfdCBhbmQgc2NhbGUgYnkgYSBsaW5lYXIgcmFtcC4KLSAqCi0gKiBUaGUgcmFtcCBzdG9wcyBqdXN0IHNob3J0IG9mIHJlYWNoaW5nIGFtcGxpdHVkZTIgc28gdGhhdCB0aGUgbmV4dAotICogcmFtcCBjYW4gc3RhcnQgYXQgYW1wbGl0dWRlMiB3aXRob3V0IGNhdXNpbmcgYSBkaXNjb250aW51aXR5LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bUZyYW1lcwotICogQHBhcmFtIHNhbXBsZXNQZXJGcmFtZSBBS0EgbnVtYmVyIG9mIGNoYW5uZWxzCi0gKiBAcGFyYW0gYW1wbGl0dWRlMSBsZXZlbCBhdCBzdGFydCBvZiByYW1wLCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKiBAcGFyYW0gYW1wbGl0dWRlMiBsZXZlbCBwYXN0IGVuZCBvZiByYW1wLCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKi8KLXZvaWQgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci0KLS8qKgotICogQ29udmVydCBpbnQxNl90IGFycmF5IHRvIGZsb2F0IGFycmF5IHJhbmdpbmcgZnJvbSAtMS4wIHRvICsxLjAuCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1TYW1wbGVzCi0gKi8KLS8vdm9pZCBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdChjb25zdCBpbnQxNl90ICpzb3VyY2UsIGludDMyX3QgbnVtU2FtcGxlcywKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24pOwotCi0vKioKLSAqCi0gKiBDb252ZXJ0IGludDE2X3QgYXJyYXkgdG8gZmxvYXQgYXJyYXkgcmFuZ2luZyBmcm9tICsvLSBhbXBsaXR1ZGUuCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1TYW1wbGVzCi0gKiBAcGFyYW0gYW1wbGl0dWRlCi0gKi8KLXZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKTsKLQotLyoqCi0gKiBDb252ZXJ0IGZsb2F0cyB0byBpbnQxNl90IGFuZCBzY2FsZSBieSBhIGxpbmVhciByYW1wLgotICoKLSAqIFRoZSByYW1wIHN0b3BzIGp1c3Qgc2hvcnQgb2YgcmVhY2hpbmcgYW1wbGl0dWRlMiBzbyB0aGF0IHRoZSBuZXh0Ci0gKiByYW1wIGNhbiBzdGFydCBhdCBhbXBsaXR1ZGUyIHdpdGhvdXQgY2F1c2luZyBhIGRpc2NvbnRpbnVpdHkuCi0gKgotICogQHBhcmFtIHNvdXJjZQotICogQHBhcmFtIGRlc3RpbmF0aW9uCi0gKiBAcGFyYW0gbnVtRnJhbWVzCi0gKiBAcGFyYW0gc2FtcGxlc1BlckZyYW1lIEFLQSBudW1iZXIgb2YgY2hhbm5lbHMKLSAqIEBwYXJhbSBhbXBsaXR1ZGUxIGxldmVsIGF0IHN0YXJ0IG9mIHJhbXAsIGJldHdlZW4gMC4wIGFuZCAxLjAKLSAqIEBwYXJhbSBhbXBsaXR1ZGUyIGxldmVsIGF0IGVuZCBvZiByYW1wLCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKi8KLXZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci0KLS8qKgotICogU2NhbGUgZmxvYXRzIGJ5IGEgbGluZWFyIHJhbXAuCi0gKgotICogVGhlIHJhbXAgc3RvcHMganVzdCBzaG9ydCBvZiByZWFjaGluZyBhbXBsaXR1ZGUyIHNvIHRoYXQgdGhlIG5leHQKLSAqIHJhbXAgY2FuIHN0YXJ0IGF0IGFtcGxpdHVkZTIgd2l0aG91dCBjYXVzaW5nIGEgZGlzY29udGludWl0eS4KLSAqCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1GcmFtZXMKLSAqIEBwYXJhbSBzYW1wbGVzUGVyRnJhbWUKLSAqIEBwYXJhbSBhbXBsaXR1ZGUxCi0gKiBAcGFyYW0gYW1wbGl0dWRlMgotICovCi12b2lkIEFBdWRpb19saW5lYXJSYW1wKGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKTsKLQotLyoqCi0gKiBTY2FsZSBpbnQxNl90J3MgYnkgYSBsaW5lYXIgcmFtcC4KLSAqCi0gKiBUaGUgcmFtcCBzdG9wcyBqdXN0IHNob3J0IG9mIHJlYWNoaW5nIGFtcGxpdHVkZTIgc28gdGhhdCB0aGUgbmV4dAotICogcmFtcCBjYW4gc3RhcnQgYXQgYW1wbGl0dWRlMiB3aXRob3V0IGNhdXNpbmcgYSBkaXNjb250aW51aXR5LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bUZyYW1lcwotICogQHBhcmFtIHNhbXBsZXNQZXJGcmFtZQotICogQHBhcmFtIGFtcGxpdHVkZTEKLSAqIEBwYXJhbSBhbXBsaXR1ZGUyCi0gKi8KLXZvaWQgQUF1ZGlvX2xpbmVhclJhbXAoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKTsKLQotY2xhc3MgQUF1ZGlvRGF0YUNvbnZlcnRlciB7Ci1wdWJsaWM6Ci0KLSAgICBzdHJ1Y3QgRm9ybWF0dGVkRGF0YSB7Ci0KLSAgICAgICAgRm9ybWF0dGVkRGF0YSh2b2lkICpkYXRhLCBhYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQzMl90IGNoYW5uZWxDb3VudCkKLSAgICAgICAgICAgIDogZGF0YShkYXRhKQotICAgICAgICAgICAgLCBmb3JtYXQoZm9ybWF0KQotICAgICAgICAgICAgLCBjaGFubmVsQ291bnQoY2hhbm5lbENvdW50KSB7fQotCi0gICAgICAgIGNvbnN0IHZvaWQgICAgICAgICAgICAqZGF0YSA9IG51bGxwdHI7Ci0gICAgICAgIGNvbnN0IGFhdWRpb19mb3JtYXRfdCAgZm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKLSAgICAgICAgY29uc3QgaW50MzJfdCAgICAgICAgICBjaGFubmVsQ291bnQgPSAxOwotICAgIH07Ci0KLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0KGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbFRvKTsKLQotcHJpdmF0ZToKLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0TW9ub1RvU3RlcmVvKGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbFRvKTsKLQotICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRDaGFubmVsc01hdGNoKGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGV2ZWxUbyk7Ci19OwotCi0vKioKICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFuZCBwcmV2ZW50IG51bWVyaWMgb3ZlcmZsb3cuCiAgKiBUaGUgKnNpemVJbkJ5dGVzIHdpbGwgYmUgc2V0IHRvIHplcm8gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAgKgpAQCAtMjM0LDEyICs4NCw2IEBACiAgKi8KIGF1ZGlvX3NvdXJjZV90IEFBdWRpb0NvbnZlcnRfaW5wdXRQcmVzZXRUb0F1ZGlvU291cmNlKGFhdWRpb19pbnB1dF9wcmVzZXRfdCBwcmVzZXQpOwogCi0vKioKLSAqIEByZXR1cm4gdGhlIHNpemUgb2YgYSBzYW1wbGUgb2YgdGhlIGdpdmVuIGZvcm1hdCBpbiBieXRlcyBvciBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVAotICovCi1pbnQzMl90IEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhhYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKLQotCiAvLyBOb3RlIHRoYXQgdGhpcyBjb2RlIG1heSBiZSByZXBsYWNlZCBieSBTZXR0aW5ncyBvciBieSBzb21lIG90aGVyIHN5c3RlbSBjb25maWd1cmF0aW9uIHRvb2wuCiAKICNkZWZpbmUgQUFVRElPX1BST1BfTU1BUF9QT0xJQ1kgICAgICAgICAgICJhYXVkaW8ubW1hcF9wb2xpY3kiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MTRiYmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0xpbmVhclJhbXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkxpbmVhclJhbXAuaCIKLQotYm9vbCBMaW5lYXJSYW1wOjppc1JhbXBpbmcoKSB7Ci0gICAgZmxvYXQgdGFyZ2V0ID0gbVRhcmdldC5sb2FkKCk7Ci0gICAgaWYgKHRhcmdldCAhPSBtTGV2ZWxUbykgewotICAgICAgICAvLyBVcGRhdGUgdGFyZ2V0LiBDb250aW51ZSBmcm9tIHByZXZpb3VzIGxldmVsLgotICAgICAgICBtTGV2ZWxUbyA9IHRhcmdldDsKLSAgICAgICAgbVJlbWFpbmluZyA9IG1MZW5ndGhJbkZyYW1lczsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1SZW1haW5pbmcgPiAwOwotICAgIH0KLX0KLQotYm9vbCBMaW5lYXJSYW1wOjpuZXh0U2VnbWVudChpbnQzMl90IGZyYW1lcywgZmxvYXQgKmxldmVsRnJvbSwgZmxvYXQgKmxldmVsVG8pIHsKLSAgICBib29sIHJhbXBpbmcgPSBpc1JhbXBpbmcoKTsKLSAgICAqbGV2ZWxGcm9tID0gbUxldmVsRnJvbTsKLSAgICBpZiAocmFtcGluZykgewotICAgICAgICBmbG9hdCBsZXZlbDsKLSAgICAgICAgaWYgKGZyYW1lcyA+PSBtUmVtYWluaW5nKSB7Ci0gICAgICAgICAgICBsZXZlbCA9IG1MZXZlbFRvOwotICAgICAgICAgICAgbVJlbWFpbmluZyA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBJbnRlcnBvbGF0ZSB0byBhIHBvaW50IGFsb25nIHRoZSBmdWxsIHJhbXAuCi0gICAgICAgICAgICBsZXZlbCA9IG1MZXZlbEZyb20gKyAoZnJhbWVzICogKG1MZXZlbFRvIC0gbUxldmVsRnJvbSkgLyBtUmVtYWluaW5nKTsKLSAgICAgICAgICAgIG1SZW1haW5pbmcgLT0gZnJhbWVzOwotICAgICAgICB9Ci0gICAgICAgIG1MZXZlbEZyb20gPSBsZXZlbDsgLy8gZm9yIG5leHQgcmFtcAotICAgICAgICAqbGV2ZWxUbyA9IGxldmVsOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpsZXZlbFRvID0gbUxldmVsVG87Ci0gICAgfQotICAgIHJldHVybiByYW1waW5nOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjFiOGUwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFBVURJT19MSU5FQVJfUkFNUF9ICi0jZGVmaW5lIEFBVURJT19MSU5FQVJfUkFNUF9ICi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLS8qKgotICogR2VuZXJhdGUgc2VnbWVudHMgYWxvbmcgYSBsaW5lYXIgcmFtcC4KLSAqIFRoZSByYW1wIHRhcmdldCBjYW4gYmUgdXBkYXRlZCBmcm9tIGFub3RoZXIgdGhyZWFkLgotICogV2hlbiB0aGUgdGFyZ2V0IGlzIHVwZGF0ZWQsIGEgbmV3IHJhbXAgaXMgc3RhcnRlZCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uLgotICoKLSAqIFRoZSBmaXJzdCByYW1wIHN0YXJ0cyBhdCAwLjAuCi0gKgotICovCi1jbGFzcyBMaW5lYXJSYW1wIHsKLXB1YmxpYzoKLSAgICBMaW5lYXJSYW1wKCkgewotICAgICAgICBtVGFyZ2V0LnN0b3JlKDEuMGYpOwotICAgIH0KLQotICAgIHZvaWQgc2V0TGVuZ3RoSW5GcmFtZXMoaW50MzJfdCBmcmFtZXMpIHsKLSAgICAgICAgbUxlbmd0aEluRnJhbWVzID0gZnJhbWVzOwotICAgIH0KLQotICAgIGludDMyX3QgZ2V0TGVuZ3RoSW5GcmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBtTGVuZ3RoSW5GcmFtZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtYXkgYmUgY2FsbGVkIGJ5IGFub3RoZXIgdGhyZWFkLgotICAgICAqIEBwYXJhbSB0YXJnZXQKLSAgICAgKi8KLSAgICB2b2lkIHNldFRhcmdldChmbG9hdCB0YXJnZXQpIHsKLSAgICAgICAgbVRhcmdldC5zdG9yZSh0YXJnZXQpOwotICAgIH0KLQotICAgIGZsb2F0IGdldFRhcmdldCgpIHsKLSAgICAgICAgcmV0dXJuIG1UYXJnZXQubG9hZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvcmNlIHRoZSBuZXh0U2VnbWVudCB0byBzdGFydCBmcm9tIHRoaXMgbGV2ZWwuCi0gICAgICoKLSAgICAgKiBXQVJOSU5HOiB0aGlzIGNhbiBjYXVzZSBhIGRpc2NvbnRpbnVpdHkgaWYgY2FsbGVkIHdoaWxlIHRoZSByYW1wIGlzIGJlaW5nIHVzZWQuCi0gICAgICogT25seSBjYWxsIHRoaXMgd2hlbiBzZXR0aW5nIHRoZSBpbml0aWFsIHJhbXAuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGV2ZWwKLSAgICAgKi8KLSAgICB2b2lkIGZvcmNlQ3VycmVudChmbG9hdCBsZXZlbCkgewotICAgICAgICBtTGV2ZWxGcm9tID0gbGV2ZWw7Ci0gICAgICAgIG1MZXZlbFRvID0gbGV2ZWw7IC8vIGZvcmNlcyBhIHJhbXAgaWYgaXQgZG9lcyBub3QgbWF0Y2ggdGFyZ2V0Ci0gICAgfQotCi0gICAgZmxvYXQgZ2V0Q3VycmVudCgpIHsKLSAgICAgICAgcmV0dXJuIG1MZXZlbEZyb207Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGxldmVscyBmb3IgbmV4dCByYW1wIHNlZ21lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZnJhbWVzIG51bWJlciBvZiBmcmFtZXMgaW4gdGhlIHNlZ21lbnQKLSAgICAgKiBAcGFyYW0gbGV2ZWxGcm9tIHBvaW50ZXIgdG8gc3RhcnRpbmcgYW1wbGl0dWRlCi0gICAgICogQHBhcmFtIGxldmVsVG8gcG9pbnRlciB0byBlbmRpbmcgYW1wbGl0dWRlCi0gICAgICogQHJldHVybiB0cnVlIGlmIHJhbXAgaXMgc3RpbGwgbW92aW5nIHRvd2FyZHMgdGhlIHRhcmdldAotICAgICAqLwotICAgIGJvb2wgbmV4dFNlZ21lbnQoaW50MzJfdCBmcmFtZXMsIGZsb2F0ICpsZXZlbEZyb20sIGZsb2F0ICpsZXZlbFRvKTsKLQotcHJpdmF0ZToKLQotICAgIGJvb2wgaXNSYW1waW5nKCk7Ci0KLSAgICBzdGQ6OmF0b21pYzxmbG9hdD4gICBtVGFyZ2V0OwotCi0gICAgaW50MzJfdCBtTGVuZ3RoSW5GcmFtZXMgID0gNDgwMDAgLyAxMDA7IC8vIDEwIG1zZWMgYXQgNDgwMDAgSHoKLSAgICBpbnQzMl90IG1SZW1haW5pbmcgICAgICAgPSAwOwotICAgIGZsb2F0ICAgbUxldmVsRnJvbSAgICAgICA9IDAuMGY7Ci0gICAgZmxvYXQgICBtTGV2ZWxUbyAgICAgICAgID0gMC4wZjsKLX07Ci0KLQotI2VuZGlmIC8vQUFVRElPX0xJTkVBUl9SQU1QX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9Nb25vdG9uaWNDb3VudGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oCmluZGV4IDU4MzNlYWIuLjYzYWRkNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9Nb25vdG9uaWNDb3VudGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaApAQCAtNDEsMTAgKzQxLDEyIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogc2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBjb3VudGVyCisgICAgICogYWR2YW5jZSB0aGUgY3VycmVudCB2YWx1ZSB0byBtYXRjaCB0aGUgY291bnRlcgogICAgICAqLwotICAgIHZvaWQgc2V0KGludDY0X3QgY291bnRlcikgewotICAgICAgICBtQ291bnRlcjY0ID0gY291bnRlcjsKKyAgICB2b2lkIGNhdGNoVXBUbyhpbnQ2NF90IGNvdW50ZXIpIHsKKyAgICAgICAgaWYgKChjb3VudGVyIC0gbUNvdW50ZXI2NCkgPiAwKSB7CisgICAgICAgICAgICBtQ291bnRlcjY0ID0gY291bnRlcjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icAppbmRleCA2ODE5NGRiLi5jYjI0M2EwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icApAQCAtMTksNiArMTksMTggQEAKIH0KIAogY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3RfY2xvY2tfbW9kZWwiLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9jbG9ja19tb2RlbC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKICAgICBuYW1lOiAidGVzdF9ibG9ja19hZGFwdGVyIiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3RfYmxvY2tfYWRhcHRlci5jcHAiXSwKQEAgLTM0LDEzICs0Niw2IEBACiB9CiAKIGNjX3Rlc3QgewotICAgIG5hbWU6ICJ0ZXN0X2xpbmVhcl9yYW1wIiwKLSAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbInRlc3RfbGluZWFyX3JhbXAuY3BwIl0sCi0gICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCi19Ci0KLWNjX3Rlc3QgewogICAgIG5hbWU6ICJ0ZXN0X29wZW5fcGFyYW1zIiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3Rfb3Blbl9wYXJhbXMuY3BwIl0sCkBAIC0xNjcsMyArMTcyLDI3IEBACiAgICAgc3JjczogWyJ0ZXN0X2F0b21pY19maWZvLmNwcCJdLAogICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAogfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9mbG93Z3JhcGgiLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9mbG93Z3JhcGguY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9yZXR1cm5fc3RvcCIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X3JldHVybl9zdG9wLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW8iLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0b21pY19maWZvLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0b21pY19maWZvLmNwcAppbmRleCAwZWRmZWJlLi4xMzBlZjQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdG9taWNfZmlmby5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXRvbWljX2ZpZm8uY3BwCkBAIC0xNTgsMTQgKzE1OCwxNCBAQAogICAgICAgICAvLyBEb2VzIHRoZSBzdW0gb2YgdGhlIHR3byBwYXJ0cyBtYXRjaCB0aGUgYXZhaWxhYmxlIHZhbHVlIHJldHVybmVkPwogICAgICAgICAvLyBGb3IgRW1wdHlSb29tCiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0KLSAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICBmaWZvX2ZyYW1lc190IHdyYXBBdmFpbGFibGUgPSBtRmlmb0J1ZmZlci5nZXRFbXB0eVJvb21BdmFpbGFibGUoJndyYXBwaW5nQnVmZmVyKTsKICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc0F2YWlsYWJsZSwgd3JhcEF2YWlsYWJsZSk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgYm90aEF2YWlsYWJsZSA9IHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1swXSArIHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1sxXTsKICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc0F2YWlsYWJsZSwgYm90aEF2YWlsYWJsZSk7CiAgICAgICAgIC8vIEZvciBGdWxsRGF0YQogICAgICAgICBmcmFtZXNBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICB3cmFwQXZhaWxhYmxlID0gbUZpZm9CdWZmZXIuZ2V0RnVsbERhdGFBdmFpbGFibGUoJndyYXBwaW5nQnVmZmVyKTsKICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc0F2YWlsYWJsZSwgd3JhcEF2YWlsYWJsZSk7CiAgICAgICAgIGJvdGhBdmFpbGFibGUgPSB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMF0gKyB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMV07CkBAIC0xOTgsNyArMTk4LDcgQEAKICAgICAvLyBXcml0ZSBkYXRhIGJ1dCBkbyBub3Qgb3ZlcmZsb3cuCiAgICAgdm9pZCB3cml0ZU11bHRpcGxlRGF0YUZyYW1lcyhmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgewogICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9Ci0gICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNUb1dyaXRlID0gc3RkOjptaW4oZnJhbWVzQXZhaWxhYmxlLCBudW1GcmFtZXMpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lc1RvV3JpdGU7IGkrKykgewogICAgICAgICAgICAgbURhdGFbaV0gPSBtTmV4dFdyaXRlSW5kZXgrKzsKQEAgLTIxMCw3ICsyMTAsNyBAQAogICAgIC8vIFJlYWQgd2hhdGV2ZXIgZGF0YSBpcyBhdmFpbGFibGUsIERvIG5vdCB1bmRlcmZsb3cuCiAgICAgdm9pZCB2ZXJpZnlNdWx0aXBsZURhdGFGcmFtZXMoZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc1RvUmVhZCA9IHN0ZDo6bWluKGZyYW1lc0F2YWlsYWJsZSwgbnVtRnJhbWVzKTsKICAgICAgICAgZmlmb19mcmFtZXNfdCBhY3R1YWwgPSBtRmlmb0J1ZmZlci5yZWFkKG1EYXRhLCBmcmFtZXNUb1JlYWQpOwogICAgICAgICBBU1NFUlRfRVEoZnJhbWVzVG9SZWFkLCBhY3R1YWwpOwpAQCAtMjIyLDcgKzIyMiw3IEBACiAgICAgLy8gUmVhZCBzcGVjaWZpZWQgbnVtYmVyIG9mIGZyYW1lcwogICAgIHZvaWQgdmVyaWZ5UmVxdWVzdGVkRGF0YShmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgewogICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9Ci0gICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgIEFTU0VSVF9MRShudW1GcmFtZXMsIGZyYW1lc0F2YWlsYWJsZSk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzVG9SZWFkID0gc3RkOjptaW4oZnJhbWVzQXZhaWxhYmxlLCBudW1GcmFtZXMpOwogICAgICAgICBmaWZvX2ZyYW1lc190IGFjdHVhbCA9IG1GaWZvQnVmZmVyLnJlYWQobURhdGEsIGZyYW1lc1RvUmVhZCk7CkBAIC0yODIsMTIgKzI4MiwxMiBAQAogICAgIHZvaWQgY2hlY2tSYW5kb21Xcml0ZVJlYWQoKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewogICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNFbXB0eSA9Ci0gICAgICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBudW1GcmFtZXMgPSAoZmlmb19mcmFtZXNfdCkoZHJhbmQ0OCgpICogZnJhbWVzRW1wdHkpOwogICAgICAgICAgICAgd3JpdGVNdWx0aXBsZURhdGFGcmFtZXMobnVtRnJhbWVzKTsKIAogICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNGdWxsID0KLSAgICAgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICAgICAgbnVtRnJhbWVzID0gKGZpZm9fZnJhbWVzX3QpKGRyYW5kNDgoKSAqIGZyYW1lc0Z1bGwpOwogICAgICAgICAgICAgdmVyaWZ5TXVsdGlwbGVEYXRhRnJhbWVzKG51bUZyYW1lcyk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0dHJpYnV0ZXMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXR0cmlidXRlcy5jcHAKaW5kZXggYjAxYWYyNS4uZGJmODcxMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXR0cmlidXRlcy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXR0cmlidXRlcy5jcHAKQEAgLTEzMCw2ICsxMzAsNyBAQAogICAgIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT04sCiAgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9DT01NVU5JQ0FUSU9OLAogICAgIEFBVURJT19JTlBVVF9QUkVTRVRfVU5QUk9DRVNTRUQsCisgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9QRVJGT1JNQU5DRSwKIH07CiAKIHN0YXRpYyB2b2lkIGNoZWNrQXR0cmlidXRlc1VzYWdlKGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Nsb2NrX21vZGVsLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Nsb2NrX21vZGVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjdhYmJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfY2xvY2tfbW9kZWwuY3BwCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVW5pdCB0ZXN0cyBmb3IgSXNvY2hyb25vdXMgQ2xvY2sgTW9kZWwKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CisjaW5jbHVkZSA8Y2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhYXVkaW87CisKKy8vIFdlIGNhbiB1c2UgYXJiaXRyYXJ5IHZhbHVlcyBoZXJlIGJlY2F1c2Ugd2UgYXJlIG5vdCBvcGVuaW5nIGEgcmVhbCBhdWRpbyBzdHJlYW0uCisjZGVmaW5lIFNBTVBMRV9SQVRFICAgICAgICAgICAgIDQ4MDAwCisjZGVmaW5lIEhXX0ZSQU1FU19QRVJfQlVSU1QgICAgIDQ4CisjZGVmaW5lIE5BTk9TX1BFUl9CVVJTVCAgICAgICAgIChOQU5PU19QRVJfU0VDT05EICogSFdfRlJBTUVTX1BFUl9CVVJTVCAvIFNBTVBMRV9SQVRFKQorCitjbGFzcyBDbG9ja01vZGVsVGVzdEZpeHR1cmU6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIENsb2NrTW9kZWxUZXN0Rml4dHVyZSgpIHsKKyAgICB9CisKKyAgICB2b2lkIFNldFVwKCkgeworICAgICAgICBtb2RlbC5zZXRTYW1wbGVSYXRlKFNBTVBMRV9SQVRFKTsKKyAgICAgICAgbW9kZWwuc2V0RnJhbWVzUGVyQnVyc3QoSFdfRlJBTUVTX1BFUl9CVVJTVCk7CisgICAgfQorCisgICAgdm9pZCBUZWFyRG93bigpIHsKKyAgICB9CisKKyAgICB+Q2xvY2tNb2RlbFRlc3RGaXh0dXJlKCkgIHsKKyAgICAgICAgLy8gY2xlYW51cCBhbnkgcGVuZGluZyBzdHVmZiwgYnV0IG5vIGV4Y2VwdGlvbnMgYWxsb3dlZAorICAgIH0KKworICAgIC8vIFRlc3QgcHJvY2Vzc2luZyBvZiB0aW1lc3RhbXBzIHdoZW4gdGhlIGhhcmR3YXJlIG1heSBiZSBzbGlnaHRseSBvZmYgZnJvbQorICAgIC8vIHRoZSBleHBlY3RlZCBzYW1wbGUgcmF0ZS4KKyAgICB2b2lkIGNoZWNrRHJpZnRpbmdDbG9jayhkb3VibGUgaGFyZHdhcmVGcmFtZXNQZXJTZWNvbmQsIGludCBudW1Mb29wcykgeworICAgICAgICBjb25zdCBpbnQ2NF90IHN0YXJ0VGltZU5hbm9zID0gNTAwMDAwMDAwOyAvLyBhcmJpdHJhcnkKKyAgICAgICAgbW9kZWwuc3RhcnQoc3RhcnRUaW1lTmFub3MpOworCisgICAgICAgIGNvbnN0IGludDY0X3Qgc3RhcnRQb3NpdGlvbkZyYW1lcyA9IEhXX0ZSQU1FU19QRVJfQlVSU1Q7IC8vIGhhcmR3YXJlCisgICAgICAgIC8vIGFyYml0cmFyeSB0aW1lIGZvciBmaXJzdCBidXJzdAorICAgICAgICBjb25zdCBpbnQ2NF90IG1hcmtlclRpbWUgPSBzdGFydFRpbWVOYW5vcyArIE5BTk9TX1BFUl9NSUxMSVNFQ09ORAorICAgICAgICAgICAgICAgICsgKDIwMCAqIE5BTk9TX1BFUl9NSUNST1NFQ09ORCk7CisKKyAgICAgICAgLy8gU2hvdWxkIHNldCBpbml0aWFsIG1hcmtlci4KKyAgICAgICAgbW9kZWwucHJvY2Vzc1RpbWVzdGFtcChzdGFydFBvc2l0aW9uRnJhbWVzLCBtYXJrZXJUaW1lKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXJ0UG9zaXRpb25GcmFtZXMsIG1vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihtYXJrZXJUaW1lKSk7CisKKyAgICAgICAgZG91YmxlIGVsYXBzZWRUaW1lU2Vjb25kcyA9IHN0YXJ0VGltZU5hbm9zIC8gKGRvdWJsZSkgTkFOT1NfUEVSX1NFQ09ORDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Mb29wczsgaSsrKSB7CisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgcmFuZG9tIGRlbGF5IG92ZXIgc2V2ZXJhbCBidXJzdHMuCisgICAgICAgICAgICBjb25zdCBkb3VibGUgdGltZURlbGF5U2Vjb25kcyA9IDEwLjAgKiBkcmFuZDQ4KCkgKiBOQU5PU19QRVJfQlVSU1QgLyBOQU5PU19QRVJfU0VDT05EOworICAgICAgICAgICAgZWxhcHNlZFRpbWVTZWNvbmRzICs9IHRpbWVEZWxheVNlY29uZHM7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGVsYXBzZWRUaW1lTmFub3MgPSAoaW50NjRfdCkoZWxhcHNlZFRpbWVTZWNvbmRzICogTkFOT1NfUEVSX1NFQ09ORCk7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGN1cnJlbnRUaW1lTmFub3MgPSBzdGFydFRpbWVOYW5vcyArIGVsYXBzZWRUaW1lTmFub3M7CisgICAgICAgICAgICAvLyBTaW11bGF0ZSBEU1AgcnVubmluZyBhdCB0aGUgc3BlY2lmaWVkIHJhdGUuCisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGN1cnJlbnRUaW1lRnJhbWVzID0gc3RhcnRQb3NpdGlvbkZyYW1lcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpKGhhcmR3YXJlRnJhbWVzUGVyU2Vjb25kICogZWxhcHNlZFRpbWVTZWNvbmRzKTsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbnVtQnVyc3RzID0gY3VycmVudFRpbWVGcmFtZXMgLyBIV19GUkFNRVNfUEVSX0JVUlNUOworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBhbGlnbmVkUG9zaXRpb24gPSBzdGFydFBvc2l0aW9uRnJhbWVzICsgKG51bUJ1cnN0cyAqIEhXX0ZSQU1FU19QRVJfQlVSU1QpOworCisgICAgICAgICAgICAvLyBBcHBseSBkcmlmdGluZyB0aW1lc3RhbXAuCisgICAgICAgICAgICBtb2RlbC5wcm9jZXNzVGltZXN0YW1wKGFsaWduZWRQb3NpdGlvbiwgY3VycmVudFRpbWVOYW5vcyk7CisKKyAgICAgICAgICAgIEFTU0VSVF9FUShhbGlnbmVkUG9zaXRpb24sIG1vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihjdXJyZW50VGltZU5hbm9zKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJc29jaHJvbm91c0Nsb2NrTW9kZWwgbW9kZWw7Cit9OworCisvLyBDaGVjayBkZWZhdWx0IHNldHVwLgorVEVTVF9GKENsb2NrTW9kZWxUZXN0Rml4dHVyZSwgY2xvY2tfc2V0dXApIHsKKyAgICBBU1NFUlRfRVEoU0FNUExFX1JBVEUsIG1vZGVsLmdldFNhbXBsZVJhdGUoKSk7CisgICAgQVNTRVJUX0VRKEhXX0ZSQU1FU19QRVJfQlVSU1QsIG1vZGVsLmdldEZyYW1lc1BlckJ1cnN0KCkpOworfQorCisvLyBUZXN0IGRlbHRhIGNhbGN1bGF0aW9ucy4KK1RFU1RfRihDbG9ja01vZGVsVGVzdEZpeHR1cmUsIGNsb2NrX2RlbHRhcykgeworICAgIGludDY0X3QgcG9zaXRpb24gPSBtb2RlbC5jb252ZXJ0RGVsdGFUaW1lVG9Qb3NpdGlvbihOQU5PU19QRVJfU0VDT05EKTsKKyAgICBBU1NFUlRfRVEoU0FNUExFX1JBVEUsIHBvc2l0aW9uKTsKKworICAgIC8vIERlbHRhcyBhcmUgbm90IHF1YW50aXplZC4KKyAgICAvLyBDb21wYXJlIHRpbWUgdG8gdGhlIGVxdWl2YWxlbnQgcG9zaXRpb24gaW4gZnJhbWVzLgorICAgIGNvbnN0ZXhwciBpbnQ2NF90IGtOYW5vc1BlckJ1cnN0ID0gSFdfRlJBTUVTX1BFUl9CVVJTVCAqIE5BTk9TX1BFUl9TRUNPTkQgLyBTQU1QTEVfUkFURTsKKyAgICBwb3NpdGlvbiA9IG1vZGVsLmNvbnZlcnREZWx0YVRpbWVUb1Bvc2l0aW9uKE5BTk9TX1BFUl9TRUNPTkQgKyAoa05hbm9zUGVyQnVyc3QgLyAyKSk7CisgICAgQVNTRVJUX0VRKFNBTVBMRV9SQVRFICsgKEhXX0ZSQU1FU19QRVJfQlVSU1QgLyAyKSwgcG9zaXRpb24pOworCisgICAgaW50NjRfdCB0aW1lID0gbW9kZWwuY29udmVydERlbHRhUG9zaXRpb25Ub1RpbWUoU0FNUExFX1JBVEUpOworICAgIEFTU0VSVF9FUShOQU5PU19QRVJfU0VDT05ELCB0aW1lKTsKKworICAgIC8vIENvbXBhcmUgcG9zaXRpb24gaW4gZnJhbWVzIHRvIHRoZSBlcXVpdmFsZW50IHRpbWUuCisgICAgdGltZSA9IG1vZGVsLmNvbnZlcnREZWx0YVBvc2l0aW9uVG9UaW1lKFNBTVBMRV9SQVRFICsgKEhXX0ZSQU1FU19QRVJfQlVSU1QgLyAyKSk7CisgICAgQVNTRVJUX0VRKE5BTk9TX1BFUl9TRUNPTkQgKyAoa05hbm9zUGVyQnVyc3QgLyAyKSwgdGltZSk7Cit9CisKKy8vIHN0YXJ0KCkgc2hvdWxkIGZvcmNlIHRoZSBpbnRlcm5hbCBtYXJrZXJzCitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja19zdGFydCkgeworICAgIGNvbnN0IGludDY0X3Qgc3RhcnRUaW1lID0gMTAwMDAwOworICAgIG1vZGVsLnN0YXJ0KHN0YXJ0VGltZSk7CisKKyAgICBpbnQ2NF90IHBvc2l0aW9uID0gbW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKHN0YXJ0VGltZSk7CisgICAgRVhQRUNUX0VRKDAsIHBvc2l0aW9uKTsKKworICAgIGludDY0X3QgdGltZSA9IG1vZGVsLmNvbnZlcnRQb3NpdGlvblRvVGltZShwb3NpdGlvbik7CisgICAgRVhQRUNUX0VRKHN0YXJ0VGltZSwgdGltZSk7CisKKyAgICB0aW1lID0gc3RhcnRUaW1lICsgKDUwMCAqIE5BTk9TX1BFUl9NSUNST1NFQ09ORCk7CisgICAgcG9zaXRpb24gPSBtb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24odGltZSk7CisgICAgRVhQRUNUX0VRKDAsIHBvc2l0aW9uKTsKK30KKworLy8gdGltZXN0YW1wcyBtb3ZlcyB0aGUgd2luZG93IGlmIG91dHNpZGUgdGhlIGJvdW5kcworVEVTVF9GKENsb2NrTW9kZWxUZXN0Rml4dHVyZSwgY2xvY2tfdGltZXN0YW1wKSB7CisgICAgY29uc3QgaW50NjRfdCBzdGFydFRpbWUgPSAxMDAwMDAwMDA7CisgICAgbW9kZWwuc3RhcnQoc3RhcnRUaW1lKTsKKworICAgIGNvbnN0IGludDY0X3QgcG9zaXRpb24gPSBIV19GUkFNRVNfUEVSX0JVUlNUOyAvLyBoYXJkd2FyZQorICAgIGludDY0X3QgbWFya2VyVGltZSA9IHN0YXJ0VGltZSArIE5BTk9TX1BFUl9NSUxMSVNFQ09ORCArICgyMDAgKiBOQU5PU19QRVJfTUlDUk9TRUNPTkQpOworCisgICAgLy8gU2hvdWxkIHNldCBtYXJrZXIuCisgICAgbW9kZWwucHJvY2Vzc1RpbWVzdGFtcChwb3NpdGlvbiwgbWFya2VyVGltZSk7CisgICAgRVhQRUNUX0VRKHBvc2l0aW9uLCBtb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24obWFya2VyVGltZSkpOworCisgICAgLy8gY29udmVydFRpbWVUb1Bvc2l0aW9uIHJvdW5kcyBkb3duCisgICAgRVhQRUNUX0VRKHBvc2l0aW9uLCBtb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24obWFya2VyVGltZSArICg3MyAqIE5BTk9TX1BFUl9NSUNST1NFQ09ORCkpKTsKKworICAgIC8vIGNvbnZlcnRQb3NpdGlvblRvVGltZSByb3VuZHMgdXAKKyAgICBFWFBFQ1RfRVEobWFya2VyVGltZSArIE5BTk9TX1BFUl9CVVJTVCwgbW9kZWwuY29udmVydFBvc2l0aW9uVG9UaW1lKHBvc2l0aW9uICsgMTcpKTsKK30KKworI2RlZmluZSBOVU1fTE9PUFNfRFJJRlQgICAxMDAwMAorCisvLyB0ZXN0IG51ZGdpbmcgdGhlIHdpbmRvdyBieSB1c2luZyBhIGRyaWZ0aW5nIEhXIGNsb2NrCitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja19ub19kcmlmdCkgeworICAgIGNoZWNrRHJpZnRpbmdDbG9jayhTQU1QTEVfUkFURSwgTlVNX0xPT1BTX0RSSUZUKTsKK30KKworLy8gVGhlc2Ugc2xvdyBkcmlmdCByYXRlcyBjYXVzZWQgZXJyb3JzIHdoZW4gSSBkaXNhYmxlZCB0aGUgY29kZSB0aGF0IGhhbmRsZXMKKy8vIGRyaWZ0aW5nIGluIHRoZSBjbG9jayBtb2RlbC4gU28gSSB0aGluayB0aGUgdGVzdCBpcyB2YWxpZC4KKy8vIEl0IGlzIHVubGlrZWx5IHRoYXQgcmVhbCBoYXJkd2FyZSB3b3VsZCBiZSBvZmYgYnkgbW9yZSB0aGFuIHRoaXMgYW1vdW50LgorVEVTVF9GKENsb2NrTW9kZWxUZXN0Rml4dHVyZSwgY2xvY2tfc2xvd19kcmlmdCkgeworICAgIGNoZWNrRHJpZnRpbmdDbG9jaygwLjk5OCAqIFNBTVBMRV9SQVRFLCBOVU1fTE9PUFNfRFJJRlQpOworfQorCitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja19mYXN0X2RyaWZ0KSB7CisgICAgY2hlY2tEcmlmdGluZ0Nsb2NrKDEuMDAyICogU0FNUExFX1JBVEUsIE5VTV9MT09QU19EUklGVCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfZmxvd2dyYXBoLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Zsb3dncmFwaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU2M2E3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Zsb3dncmFwaC5jcHAKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUZXN0IEZsb3dHcmFwaAorICovCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJmbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvU291cmNlRmxvYXQuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvUmFtcExpbmVhci5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9TaW5rRmxvYXQuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvU2lua0kxNi5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9TaW5rSTI0LmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL1NvdXJjZUkxNi5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9Tb3VyY2VJMjQuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworY29uc3RleHByIGludCBrQnl0ZXNQZXJJMjRQYWNrZWQgPSAzOworCitURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfc2lua2kxNikgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBpbnB1dFtdID0gezEuMGYsIDAuNWYsIC0wLjI1ZiwgLTEuMGYsIDAuMGYsIDUzLjlmLCAtODcuMmZ9OworICAgIHN0YXRpYyBjb25zdCBpbnQxNl90IGV4cGVjdGVkW10gPSB7MzI3NjcsIDE2Mzg0LCAtODE5MiwgLTMyNzY4LCAwLCAzMjc2NywgLTMyNzY4fTsKKyAgICBpbnQxNl90IG91dHB1dFsyMF07CisgICAgU291cmNlRmxvYXQgc291cmNlRmxvYXR7MX07CisgICAgU2lua0kxNiBzaW5rSTE2ezF9OworCisgICAgaW50IG51bUlucHV0RnJhbWVzID0gc2l6ZW9mKGlucHV0KSAvIHNpemVvZihpbnB1dFswXSk7CisgICAgc291cmNlRmxvYXQuc2V0RGF0YShpbnB1dCwgbnVtSW5wdXRGcmFtZXMpOworICAgIHNvdXJjZUZsb2F0Lm91dHB1dC5jb25uZWN0KCZzaW5rSTE2LmlucHV0KTsKKworICAgIGludCBudW1PdXRwdXRGcmFtZXMgPSBzaXplb2Yob3V0cHV0KSAvIHNpemVvZihpbnQxNl90KTsKKyAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rSTE2LnJlYWQob3V0cHV0LCBudW1PdXRwdXRGcmFtZXMpOworICAgIEFTU0VSVF9FUShudW1JbnB1dEZyYW1lcywgbnVtUmVhZCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZWFkOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkW2ldLCBvdXRwdXRbaV0pOworICAgIH0KK30KKworVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX21vbm9fdG9fc3RlcmVvKSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGlucHV0W10gPSB7MS4wZiwgMi4wZiwgMy4wZn07CisgICAgZmxvYXQgb3V0cHV0WzEwMF0gPSB7fTsKKyAgICBTb3VyY2VGbG9hdCBzb3VyY2VGbG9hdHsxfTsKKyAgICBNb25vVG9NdWx0aUNvbnZlcnRlciBtb25vVG9TdGVyZW97Mn07CisgICAgU2lua0Zsb2F0IHNpbmtGbG9hdHsyfTsKKworICAgIHNvdXJjZUZsb2F0LnNldERhdGEoaW5wdXQsIDMpOworCisgICAgc291cmNlRmxvYXQub3V0cHV0LmNvbm5lY3QoJm1vbm9Ub1N0ZXJlby5pbnB1dCk7CisgICAgbW9ub1RvU3RlcmVvLm91dHB1dC5jb25uZWN0KCZzaW5rRmxvYXQuaW5wdXQpOworCisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0Zsb2F0LnJlYWQob3V0cHV0LCA4KTsKKyAgICBBU1NFUlRfRVEoMywgbnVtUmVhZCk7CisgICAgRVhQRUNUX0VRKGlucHV0WzBdLCBvdXRwdXRbMF0pOworICAgIEVYUEVDVF9FUShpbnB1dFswXSwgb3V0cHV0WzFdKTsKKyAgICBFWFBFQ1RfRVEoaW5wdXRbMV0sIG91dHB1dFsyXSk7CisgICAgRVhQRUNUX0VRKGlucHV0WzFdLCBvdXRwdXRbM10pOworfQorCitURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfcmFtcF9saW5lYXIpIHsKKyAgICBjb25zdGV4cHIgaW50IHJhbXBTaXplID0gNTsKKyAgICBjb25zdGV4cHIgaW50IG51bU91dHB1dCA9IDEwMDsKKyAgICBjb25zdGV4cHIgZmxvYXQgdmFsdWUgPSAxLjBmOworICAgIGNvbnN0ZXhwciBmbG9hdCB0YXJnZXQgPSAxMDAuMGY7CisgICAgZmxvYXQgb3V0cHV0W251bU91dHB1dF0gPSB7fTsKKyAgICBSYW1wTGluZWFyIHJhbXBMaW5lYXJ7MX07CisgICAgU2lua0Zsb2F0IHNpbmtGbG9hdHsxfTsKKworICAgIHJhbXBMaW5lYXIuaW5wdXQuc2V0VmFsdWUodmFsdWUpOworICAgIHJhbXBMaW5lYXIuc2V0TGVuZ3RoSW5GcmFtZXMocmFtcFNpemUpOworICAgIHJhbXBMaW5lYXIuc2V0VGFyZ2V0KHRhcmdldCk7CisgICAgcmFtcExpbmVhci5mb3JjZUN1cnJlbnQoMC4wZik7CisKKyAgICByYW1wTGluZWFyLm91dHB1dC5jb25uZWN0KCZzaW5rRmxvYXQuaW5wdXQpOworCisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0Zsb2F0LnJlYWQob3V0cHV0LCBudW1PdXRwdXQpOworICAgIEFTU0VSVF9FUShudW1PdXRwdXQsIG51bVJlYWQpOworICAgIGNvbnN0ZXhwciBmbG9hdCB0b2xlcmFuY2UgPSAwLjAwMDFmOyAvLyBhcmJpdHJhcnkKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yICg7IGkgPCByYW1wU2l6ZTsgaSsrKSB7CisgICAgICAgIGZsb2F0IGV4cGVjdGVkID0gaSAqIHZhbHVlICogdGFyZ2V0IC8gcmFtcFNpemU7CisgICAgICAgIEVYUEVDVF9ORUFSKGV4cGVjdGVkLCBvdXRwdXRbaV0sIHRvbGVyYW5jZSk7CisgICAgfQorICAgIGZvciAoOyBpIDwgbnVtT3V0cHV0OyBpKyspIHsKKyAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSB2YWx1ZSAqIHRhcmdldDsKKyAgICAgICAgRVhQRUNUX05FQVIoZXhwZWN0ZWQsIG91dHB1dFtpXSwgdG9sZXJhbmNlKTsKKyAgICB9Cit9CisKKy8vIEl0IGlzIGVhc2llc3QgdG8gcmVwcmVzZW50IHBhY2tlZCAyNC1iaXQgZGF0YSBhcyBhIGJ5dGUgYXJyYXkuCisvLyBUaGlzIHRlc3Qgd2lsbCByZWFkIGZyb20gaW5wdXQsIGNvbnZlcnQgdG8gZmxvYXQsIHRoZW4gd3JpdGUKKy8vIGJhY2sgdG8gb3V0cHV0IGFzIGJ5dGVzLgorVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX3BhY2tlZF8yNCkgeworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGlucHV0W10gPSB7MHgwMSwgMHgyMywgMHg0NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjcsIDB4ODksIDB4QUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweENELCAweEVGLCAweDVBfTsKKyAgICB1aW50OF90IG91dHB1dFs5OV0gPSB7fTsKKyAgICBTb3VyY2VJMjQgc291cmNlSTI0ezF9OworICAgIFNpbmtJMjQgc2lua0kyNHsxfTsKKworICAgIGludCBudW1JbnB1dEZyYW1lcyA9IHNpemVvZihpbnB1dCkgLyBrQnl0ZXNQZXJJMjRQYWNrZWQ7CisgICAgc291cmNlSTI0LnNldERhdGEoaW5wdXQsIG51bUlucHV0RnJhbWVzKTsKKyAgICBzb3VyY2VJMjQub3V0cHV0LmNvbm5lY3QoJnNpbmtJMjQuaW5wdXQpOworCisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0kyNC5yZWFkKG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLyBrQnl0ZXNQZXJJMjRQYWNrZWQpOworICAgIEFTU0VSVF9FUShudW1JbnB1dEZyYW1lcywgbnVtUmVhZCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoaW5wdXQpOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKGlucHV0W2ldLCBvdXRwdXRbaV0pOworICAgIH0KK30KKworVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX2NsaXBfdG9fcmFuZ2UpIHsKKyAgICBjb25zdGV4cHIgZmxvYXQgbXlNaW4gPSAtMi4wZjsKKyAgICBjb25zdGV4cHIgZmxvYXQgbXlNYXggPSAxLjVmOworCisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGlucHV0W10gPSB7LTkuNywgMC41ZiwgLTAuMjUsIDEuMGYsIDEyLjN9OworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBleHBlY3RlZFtdID0ge215TWluLCAwLjVmLCAtMC4yNSwgMS4wZiwgbXlNYXh9OworICAgIGZsb2F0IG91dHB1dFsxMDBdOworICAgIFNvdXJjZUZsb2F0IHNvdXJjZUZsb2F0ezF9OworICAgIENsaXBUb1JhbmdlIGNsaXBwZXJ7MX07CisgICAgU2lua0Zsb2F0IHNpbmtGbG9hdHsxfTsKKworICAgIGludCBudW1JbnB1dEZyYW1lcyA9IHNpemVvZihpbnB1dCkgLyBzaXplb2YoaW5wdXRbMF0pOworICAgIHNvdXJjZUZsb2F0LnNldERhdGEoaW5wdXQsIG51bUlucHV0RnJhbWVzKTsKKworICAgIGNsaXBwZXIuc2V0TWluaW11bShteU1pbik7CisgICAgY2xpcHBlci5zZXRNYXhpbXVtKG15TWF4KTsKKworICAgIHNvdXJjZUZsb2F0Lm91dHB1dC5jb25uZWN0KCZjbGlwcGVyLmlucHV0KTsKKyAgICBjbGlwcGVyLm91dHB1dC5jb25uZWN0KCZzaW5rRmxvYXQuaW5wdXQpOworCisgICAgaW50IG51bU91dHB1dEZyYW1lcyA9IHNpemVvZihvdXRwdXQpIC8gc2l6ZW9mKG91dHB1dFswXSk7CisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0Zsb2F0LnJlYWQob3V0cHV0LCBudW1PdXRwdXRGcmFtZXMpOworICAgIEFTU0VSVF9FUShudW1JbnB1dEZyYW1lcywgbnVtUmVhZCk7CisgICAgY29uc3RleHByIGZsb2F0IHRvbGVyYW5jZSA9IDAuMDAwMDAxZjsgLy8gYXJiaXRyYXJ5CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZWFkOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX05FQVIoZXhwZWN0ZWRbaV0sIG91dHB1dFtpXSwgdG9sZXJhbmNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9saW5lYXJfcmFtcC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9saW5lYXJfcmFtcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMjI2YmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfbGluZWFyX3JhbXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgInV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgiCi0jaW5jbHVkZSAidXRpbGl0eS9MaW5lYXJSYW1wLmgiCi0KLVRFU1QodGVzdF9saW5lYXJfcmFtcCwgbGluZWFyX3JhbXBfc2VnbWVudHMpIHsKLSAgICBMaW5lYXJSYW1wIHJhbXA7Ci0gICAgY29uc3QgZmxvYXQgc291cmNlWzRdID0gezEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLSAgICBmbG9hdCBkZXN0aW5hdGlvbls0XSA9IHsxLjBmLCAxLjBmLCAxLjBmLCAxLjBmIH07Ci0KLSAgICBmbG9hdCBsZXZlbEZyb20gPSAtMS4wZjsKLSAgICBmbG9hdCBsZXZlbFRvID0gLTEuMGY7Ci0gICAgcmFtcC5zZXRMZW5ndGhJbkZyYW1lcyg4KTsKLSAgICByYW1wLnNldFRhcmdldCg4LjBmKTsKLQotICAgIEVYUEVDVF9FUSg4LCByYW1wLmdldExlbmd0aEluRnJhbWVzKCkpOwotCi0gICAgYm9vbCByYW1waW5nID0gcmFtcC5uZXh0U2VnbWVudCg0LCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDEsIHJhbXBpbmcpOwotICAgIEVYUEVDVF9FUSgwLjBmLCBsZXZlbEZyb20pOwotICAgIEVYUEVDVF9FUSg0LjBmLCBsZXZlbFRvKTsKLQotICAgIEFBdWRpb19saW5lYXJSYW1wKHNvdXJjZSwgZGVzdGluYXRpb24sIDQsIDEsIGxldmVsRnJvbSwgbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDAuMGYsIGRlc3RpbmF0aW9uWzBdKTsKLSAgICBFWFBFQ1RfRVEoMS4wZiwgZGVzdGluYXRpb25bMV0pOwotICAgIEVYUEVDVF9FUSgyLjBmLCBkZXN0aW5hdGlvblsyXSk7Ci0gICAgRVhQRUNUX0VRKDMuMGYsIGRlc3RpbmF0aW9uWzNdKTsKLQotICAgIHJhbXBpbmcgPSByYW1wLm5leHRTZWdtZW50KDQsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoMSwgcmFtcGluZyk7Ci0gICAgRVhQRUNUX0VRKDQuMGYsIGxldmVsRnJvbSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGxldmVsVG8pOwotCi0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoNC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEVYUEVDVF9FUSg1LjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgRVhQRUNUX0VRKDYuMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBFWFBFQ1RfRVEoNy4wZiwgZGVzdGluYXRpb25bM10pOwotCi0gICAgcmFtcGluZyA9IHJhbXAubmV4dFNlZ21lbnQoNCwgJmxldmVsRnJvbSwgJmxldmVsVG8pOwotICAgIEVYUEVDVF9FUSgwLCByYW1waW5nKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxGcm9tKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxUbyk7Ci0KLSAgICBBQXVkaW9fbGluZWFyUmFtcChzb3VyY2UsIGRlc3RpbmF0aW9uLCA0LCAxLCBsZXZlbEZyb20sIGxldmVsVG8pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblswXSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzFdKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMl0pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblszXSk7Ci0KLX07Ci0KLQotVEVTVCh0ZXN0X2xpbmVhcl9yYW1wLCBsaW5lYXJfcmFtcF9mb3JjZWQpIHsKLSAgICBMaW5lYXJSYW1wIHJhbXA7Ci0gICAgY29uc3QgZmxvYXQgc291cmNlWzRdID0gezEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLSAgICBmbG9hdCBkZXN0aW5hdGlvbls0XSA9IHsxLjBmLCAxLjBmLCAxLjBmLCAxLjBmIH07Ci0KLSAgICBmbG9hdCBsZXZlbEZyb20gPSAtMS4wZjsKLSAgICBmbG9hdCBsZXZlbFRvID0gLTEuMGY7Ci0gICAgcmFtcC5zZXRMZW5ndGhJbkZyYW1lcyg0KTsKLSAgICByYW1wLnNldFRhcmdldCg4LjBmKTsKLSAgICByYW1wLmZvcmNlQ3VycmVudCg0LjBmKTsKLSAgICBFWFBFQ1RfRVEoNC4wZiwgcmFtcC5nZXRDdXJyZW50KCkpOwotCi0gICAgYm9vbCByYW1waW5nID0gcmFtcC5uZXh0U2VnbWVudCg0LCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDEsIHJhbXBpbmcpOwotICAgIEVYUEVDVF9FUSg0LjBmLCBsZXZlbEZyb20pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBsZXZlbFRvKTsKLQotICAgIEFBdWRpb19saW5lYXJSYW1wKHNvdXJjZSwgZGVzdGluYXRpb24sIDQsIDEsIGxldmVsRnJvbSwgbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDQuMGYsIGRlc3RpbmF0aW9uWzBdKTsKLSAgICBFWFBFQ1RfRVEoNS4wZiwgZGVzdGluYXRpb25bMV0pOwotICAgIEVYUEVDVF9FUSg2LjBmLCBkZXN0aW5hdGlvblsyXSk7Ci0gICAgRVhQRUNUX0VRKDcuMGYsIGRlc3RpbmF0aW9uWzNdKTsKLQotICAgIHJhbXBpbmcgPSByYW1wLm5leHRTZWdtZW50KDQsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoMCwgcmFtcGluZyk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGxldmVsRnJvbSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGxldmVsVG8pOwotCi0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bM10pOwotCi19OwotCi1jb25zdGV4cHIgaW50MTZfdCBrTWF4STE2ID0gSU5UMTZfTUFYOwotY29uc3RleHByIGludDE2X3Qga01pbkkxNiA9IElOVDE2X01JTjsKLWNvbnN0ZXhwciBpbnQxNl90IGtIYWxmSTE2ID0gMTYzODQ7Ci1jb25zdGV4cHIgaW50MTZfdCBrVGVudGhJMTYgPSAzMjc3OwotCi0vL3ZvaWQgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoY29uc3QgZmxvYXQgKnNvdXJjZSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKTsKLVRFU1QodGVzdF9saW5lYXJfcmFtcCwgZmxvYXRfdG9faTE2KSB7Ci0gICAgY29uc3QgZmxvYXQgc291cmNlW10gPSB7MTIzNDUuNmYsIDEuMGYsIDAuNWYsIDAuMWYsIDAuMGYsIC0wLjFmLCAtMC41ZiwgLTEuMGYsIC0xMjM0NS42Zn07Ci0gICAgY29uc3RleHByIHNpemVfdCBjb3VudCA9IHNpemVvZihzb3VyY2UpIC8gc2l6ZW9mKHNvdXJjZVswXSk7Ci0gICAgaW50MTZfdCBkZXN0aW5hdGlvbltjb3VudF07Ci0gICAgY29uc3QgaW50MTZfdCBleHBlY3RlZFtjb3VudF0gPSB7a01heEkxNiwga01heEkxNiwga0hhbGZJMTYsIGtUZW50aEkxNiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAta1RlbnRoSTE2LCAta0hhbGZJMTYsIGtNaW5JMTYsIGtNaW5JMTZ9OwotCi0gICAgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoc291cmNlLCBkZXN0aW5hdGlvbiwgY291bnQsIDEuMGYpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIGRlc3RpbmF0aW9uW2ldKTsKLSAgICB9Ci0KLX0KLQotLy92b2lkIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSk7Ci1URVNUKHRlc3RfbGluZWFyX3JhbXAsIGkxNl90b19mbG9hdCkgewotICAgIGNvbnN0IGludDE2X3Qgc291cmNlW10gPSB7a01heEkxNiwga0hhbGZJMTYsIGtUZW50aEkxNiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1rVGVudGhJMTYsIC1rSGFsZkkxNiwga01pbkkxNn07Ci0gICAgY29uc3RleHByIHNpemVfdCBjb3VudCA9IHNpemVvZihzb3VyY2UpIC8gc2l6ZW9mKHNvdXJjZVswXSk7Ci0gICAgZmxvYXQgZGVzdGluYXRpb25bY291bnRdOwotICAgIGNvbnN0IGZsb2F0IGV4cGVjdGVkW2NvdW50XSA9IHsoMzI3NjcuMGYgLyAzMjc2OC4wZiksIDAuNWYsIDAuMWYsIDAuMGYsIC0wLjFmLCAtMC41ZiwgLTEuMGZ9OwotCi0gICAgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoc291cmNlLCBkZXN0aW5hdGlvbiwgY291bnQsIDEuMGYpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZFtpXSwgZGVzdGluYXRpb25baV0sIDAuMDAwMWYpOwotICAgIH0KLQotfQotCi0vL3ZvaWQgQUF1ZGlvX2xpbmVhclJhbXAoY29uc3QgaW50MTZfdCAqc291cmNlLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci1URVNUKHRlc3RfbGluZWFyX3JhbXAsIHJhbXBfaTE2X3RvX2kxNikgewotICAgIGNvbnN0IGludDE2X3Qgc291cmNlW10gPSB7MSwgMSwgMSwgMSwgMSwgMSwgMSwgMX07Ci0gICAgY29uc3RleHByIHNpemVfdCBjb3VudCA9IHNpemVvZihzb3VyY2UpIC8gc2l6ZW9mKHNvdXJjZVswXSk7Ci0gICAgaW50MTZfdCBkZXN0aW5hdGlvbltjb3VudF07Ci0gICAgLy8gUmFtcCB3aWxsIHN3ZWVwIGZyb20gLTEgdG8gYWxtb3N0ICsxCi0gICAgY29uc3QgaW50MTZfdCBleHBlY3RlZFtjb3VudF0gPSB7Ci0gICAgICAgICAgICAtMSwgLy8gZnJvbSAtMS4wMAotICAgICAgICAgICAgLTEsIC8vIGZyb20gLTAuNzUKLSAgICAgICAgICAgIC0xLCAvLyBmcm9tIC0wLjU1LCByb3VuZCBhd2F5IGZyb20gemVybwotICAgICAgICAgICAgMCwgIC8vIGZyb20gLTAuMjUsIHJvdW5kIHVwIHRvIHplcm8KLSAgICAgICAgICAgIDAsICAvLyBmcm9tICAwLjAwCi0gICAgICAgICAgICAwLCAgLy8gZnJvbSAgMC4yNSwgcm91bmQgZG93biB0byB6ZXJvCi0gICAgICAgICAgICAxLCAgLy8gZnJvbSAgMC41MCwgcm91bmQgYXdheSBmcm9tIHplcm8KLSAgICAgICAgICAgIDEgICAvLyBmcm9tICAwLjc1Ci0gICAgfTsKLQotICAgIC8vIHN3ZWVwIGFjcm9zcyB6ZXJvIHRvIHRlc3Qgc3ltbWV0cnkKLSAgICBjb25zdGV4cHIgZmxvYXQgYW1wbGl0dWRlMSA9IC0xLjA7Ci0gICAgY29uc3RleHByIGZsb2F0IGFtcGxpdHVkZTIgPSAxLjA7Ci0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgY291bnQsIDEsIGFtcGxpdHVkZTEsIGFtcGxpdHVkZTIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIGRlc3RpbmF0aW9uW2ldKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3JldHVybl9zdG9wLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3JldHVybl9zdG9wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjUyZGQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfcmV0dXJuX3N0b3AuY3BwCkBAIC0wLDAgKzEsMzAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBSZXR1cm4gc3RvcCBmcm9tIHRoZSBjYWxsYmFjay4KKyAqIEV4cGVjdCB0aGUgY2FsbGJhY2sgdG8gY2Vhc2UuCisgKiBDaGVjayB0aGUgbG9nY2F0IGZvciBiYWQgYmVoYXZpb3IuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorCisjZGVmaW5lIERFRkFVTFRfVElNRU9VVF9OQU5PUyAgKChpbnQ2NF90KTEwMDAwMDAwMDApCisjZGVmaW5lIFNUT1BfQVRfTVNFQyAgICAgICAgICAxMDAwCisjZGVmaW5lIExPT1BfRFVSQVRJT05fTVNFQyAgICA0MDAwCisjZGVmaW5lIFNMRUVQX0RVUkFUSU9OX01TRUMgICAgMjAwCisKK3N0YXRpYyB2b2lkIHNfbXlFcnJvckNhbGxiYWNrUHJvYygKKyAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0sCisgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZXJyb3IpOworCitzdHJ1Y3QgQXVkaW9FbmdpbmUgeworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmJ1aWxkZXIgPSBudWxscHRyOworICAgIEFBdWRpb1N0cmVhbSAgICAgICAgKnN0cmVhbSA9IG51bGxwdHI7CisgICAgc3RkOjp0aHJlYWQgICAgICAgICAqdGhyZWFkID0gbnVsbHB0cjsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICBzdG9wQXRGcmFtZSA9IDA7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgc3RvcHBlZCA9IGZhbHNlOworICAgIC8vIFRoZXNlIGNvdW50ZXJzIGFyZSByZWFkIGFuZCB3cml0dGVuIGJ5IHRoZSBjYWxsYmFjayBhbmQgdGhlIG1haW4gdGhyZWFkLgorICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+IGZyYW1lc1JlYWR7fTsKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiBzdGFydGluZ0ZyYW1lc1JlYWR7fTsKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiBmcmFtZXNDYWxsZWR7fTsKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiBjYWxsYmFja0NvdW50e307CisgICAgc3RkOjphdG9taWM8aW50MzJfdD4gY2FsbGJhY2tDb3VudEFmdGVyU3RvcHt9OworCisgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgZnJhbWVzUmVhZC5zdG9yZSgwKTsKKyAgICAgICAgc3RhcnRpbmdGcmFtZXNSZWFkLnN0b3JlKDApOworICAgICAgICBmcmFtZXNDYWxsZWQuc3RvcmUoMCk7CisgICAgICAgIGNhbGxiYWNrQ291bnQuc3RvcmUoMCk7CisgICAgICAgIGNhbGxiYWNrQ291bnRBZnRlclN0b3Auc3RvcmUoMCk7CisgICAgICAgIHN0b3BwZWQgPSBmYWxzZTsKKyAgICB9Cit9OworCisvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgorc3RhdGljIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IHNfbXlEYXRhQ2FsbGJhY2tQcm9jKAorICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgIHZvaWQgKmF1ZGlvRGF0YSwKKyAgICAgICAgaW50MzJfdCBudW1GcmFtZXMKKykgeworICAgICh2b2lkKSBhdWRpb0RhdGE7CisgICAgKHZvaWQpIG51bUZyYW1lczsKKyAgICBBdWRpb0VuZ2luZSAqZW5naW5lID0gKHN0cnVjdCBBdWRpb0VuZ2luZSAqKXVzZXJEYXRhOworICAgIGVuZ2luZS0+Y2FsbGJhY2tDb3VudCsrOworICAgIGlmIChlbmdpbmUtPnN0b3BwZWQpIHsKKyAgICAgICAgZW5naW5lLT5jYWxsYmFja0NvdW50QWZ0ZXJTdG9wKys7CisgICAgfQorCisgICAgZW5naW5lLT5mcmFtZXNSZWFkID0gKGludDMyX3QpQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoc3RyZWFtKTsKKyAgICBpZiAoZW5naW5lLT5zdGFydGluZ0ZyYW1lc1JlYWQgPT0gMCkgeworICAgICAgICBlbmdpbmUtPnN0YXJ0aW5nRnJhbWVzUmVhZC5zdG9yZShlbmdpbmUtPmZyYW1lc1JlYWQubG9hZCgpKTsKKyAgICB9CisgICAgZW5naW5lLT5mcmFtZXNDYWxsZWQgKz0gbnVtRnJhbWVzOworICAgIGlmIChlbmdpbmUtPmZyYW1lc0NhbGxlZCA+PSBlbmdpbmUtPnN0b3BBdEZyYW1lKSB7CisgICAgICAgIGVuZ2luZS0+c3RvcHBlZCA9IHRydWU7CisgICAgICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUU7CisgICAgfQorfQorCitzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IHNfT3BlbkF1ZGlvU3RyZWFtKHN0cnVjdCBBdWRpb0VuZ2luZSAqZW5naW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUpIHsKKyAgICAvLyBVc2UgYW4gQUF1ZGlvU3RyZWFtQnVpbGRlciB0byBjb250YWluIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLgorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigmZW5naW5lLT5idWlsZGVyKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBwcmludGYoIkFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyIHJldHVybmVkICVzIiwKKyAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8vIFJlcXVlc3Qgc3RyZWFtIHByb3BlcnRpZXMuCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGb3JtYXQoZW5naW5lLT5idWlsZGVyLCBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQZXJmb3JtYW5jZU1vZGUoZW5naW5lLT5idWlsZGVyLCBwZXJmTW9kZSk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTaGFyaW5nTW9kZShlbmdpbmUtPmJ1aWxkZXIsIHNoYXJpbmdNb2RlKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERpcmVjdGlvbihlbmdpbmUtPmJ1aWxkZXIsIGRpcmVjdGlvbik7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREYXRhQ2FsbGJhY2soZW5naW5lLT5idWlsZGVyLCBzX215RGF0YUNhbGxiYWNrUHJvYywgZW5naW5lKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEVycm9yQ2FsbGJhY2soZW5naW5lLT5idWlsZGVyLCBzX215RXJyb3JDYWxsYmFja1Byb2MsIGVuZ2luZSk7CisKKyAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShlbmdpbmUtPmJ1aWxkZXIsICZlbmdpbmUtPnN0cmVhbSk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0gcmV0dXJuZWQgJXMiLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGFhdWRpb19yZXN1bHRfdCBzX0Nsb3NlQXVkaW9TdHJlYW0oc3RydWN0IEF1ZGlvRW5naW5lICplbmdpbmUpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworICAgIGlmIChlbmdpbmUtPnN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9jbG9zZShlbmdpbmUtPnN0cmVhbSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9jbG9zZSByZXR1cm5lZCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgfQorICAgICAgICBlbmdpbmUtPnN0cmVhbSA9IG51bGxwdHI7CisgICAgfQorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKGVuZ2luZS0+YnVpbGRlcik7CisgICAgZW5naW5lLT5idWlsZGVyID0gbnVsbHB0cjsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBzX215RXJyb3JDYWxsYmFja1Byb2MoCisgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtIF9fdW51c2VkLAorICAgICAgICB2b2lkICp1c2VyRGF0YSBfX3VudXNlZCwKKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IGVycm9yKSB7CisgICAgcHJpbnRmKCIlcygpIC0gZXJyb3IgPSAlZFxuIiwgX19mdW5jX18sIGVycm9yKTsKK30KKworc3RhdGljIHZvaWQgc191c2FnZSgpIHsKKyAgICBwcmludGYoInRlc3RfcmV0dXJuX3N0b3AgWy1pXSBbLXhdIFstbl0gWy1jXVxuIik7CisgICAgcHJpbnRmKCIgICAgIC1pIGRpcmVjdGlvbiBJTlBVVCwgb3RoZXJ3aXNlIE9VVFBVVFxuIik7CisgICAgcHJpbnRmKCIgICAgIC14IHNoYXJpbmcgbW9kZSBFWENMVVNJVkUsIG90aGVyd2lzZSBTSEFSRURcbiIpOworICAgIHByaW50ZigiICAgICAtbiBwZXJmb3JtYW5jZSBtb2RlIE5PTkUsIG90aGVyd2lzZSBMT1dfTEFURU5DWVxuIik7CisgICAgcHJpbnRmKCIgICAgIC1jIGFsd2F5cyByZXR1cm4gQ09OVElOVUUgZnJvbSBjYWxsYmFjaywgbm90IFNUT1BcbiIpOworfQorCisvKioKKyAqIEByZXR1cm4gMCBpcyBPSywgLTEgZm9yIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgc19jaGVja0VuZ2luZVBvc2l0aW9ucyhBdWRpb0VuZ2luZSAqZW5naW5lKSB7CisgICAgY29uc3QgaW50NjRfdCBmcmFtZXNSZWFkID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoZW5naW5lLT5zdHJlYW0pOworICAgIGNvbnN0IGludDY0X3QgZnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKGVuZ2luZS0+c3RyZWFtKTsKKyAgICBjb25zdCBpbnQzMl90IGRlbHRhID0gKGludDMyX3QpKGZyYW1lc1dyaXR0ZW4gLSBmcmFtZXNSZWFkKTsKKyAgICBwcmludGYoInBsYXlpbmcgZnJhbWVzUmVhZCA9ICU3ZCwgZnJhbWVzV3JpdHRlbiA9ICU3ZCIKKyAgICAgICAgICAgIiwgZGVsdGEgPSAlNGQsIGZyYW1lc0NhbGxlZCA9ICU2ZCwgY2FsbGJhY2tDb3VudCA9ICU0ZFxuIiwKKyAgICAgICAgICAgKGludDMyX3QpIGZyYW1lc1JlYWQsCisgICAgICAgICAgIChpbnQzMl90KSBmcmFtZXNXcml0dGVuLAorICAgICAgICAgICBkZWx0YSwKKyAgICAgICAgICAgZW5naW5lLT5mcmFtZXNDYWxsZWQubG9hZCgpLAorICAgICAgICAgICBlbmdpbmUtPmNhbGxiYWNrQ291bnQubG9hZCgpCisgICAgKTsKKyAgICBpZiAoZGVsdGEgPiBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhlbmdpbmUtPnN0cmVhbSkpIHsKKyAgICAgICAgcHJpbnRmKCJFUlJPUiAtIGRlbHRhID4gY2FwYWNpdHlcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICAodm9pZCkgYXJnYzsKKyAgICAodm9pZCkgYXJndjsKKyAgICBzdHJ1Y3QgQXVkaW9FbmdpbmUgZW5naW5lOworICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOworICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWTsKKyAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uID0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICBib29sIGFsd2F5c0NvbnRpbnVlID0gZmFsc2U7CisgICAgaW50IGVycm9yQ291bnQgPSAwOworICAgIGludCBjYWxsYmFja1Jlc3VsdCA9IEVYSVRfU1VDQ0VTUzsKKworICAgIC8vIE1ha2UgcHJpbnRmIHByaW50IGltbWVkaWF0ZWx5IHNvIHRoYXQgZGVidWcgaW5mbyBpcyBub3Qgc3R1Y2sKKyAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgorICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOworCisgICAgcHJpbnRmKCJUZXN0IFJldHVybiBTdG9wIFYxLjBcbiIpOworICAgIHByaW50ZigiV2FpdCBmb3IgYSBmZXcgc2Vjb25kcy5cbiIpOworICAgIHByaW50ZigiWW91IHNob3VsZCBzZWUgY2FsbGJhY2tDb3VudCBhbmQgZnJhbWVzUmVhZCBzdG9wIGFkdmFuY2luZ1xuIik7CisgICAgcHJpbnRmKCJ3aGVuIGNhbGxiYWNrQ291bnQgcmVhY2hlcyAlZCBtc2VjXG4iLCBTVE9QX0FUX01TRUMpOworICAgIHByaW50ZigiXG4iKTsKKworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisgICAgICAgIGlmIChhcmdbMF0gPT0gJy0nKSB7CisgICAgICAgICAgICBjaGFyIG9wdGlvbiA9IGFyZ1sxXTsKKyAgICAgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgICAgICAgICAgIGFsd2F5c0NvbnRpbnVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IEFBVURJT19ESVJFQ1RJT05fSU5QVVQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ24nOgorICAgICAgICAgICAgICAgICAgICBwZXJmTW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3gnOgorICAgICAgICAgICAgICAgICAgICBzaGFyaW5nTW9kZSA9IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBzX3VzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzX3VzYWdlKCk7CisgICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdCA9IHNfT3BlbkF1ZGlvU3RyZWFtKCZlbmdpbmUsIGRpcmVjdGlvbiwgc2hhcmluZ01vZGUsIHBlcmZNb2RlKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBwcmludGYoInNfT3BlbkF1ZGlvU3RyZWFtIHJldHVybmVkICVzXG4iLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICB9CisKKyAgICBpbnQzMl90IGZyYW1lc1BlckJ1cnN0ID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1BlckJ1cnN0KGVuZ2luZS5zdHJlYW0pOworICAgIC8vIFVzZSBkb3VibGUgYnVmZmVyZWQgc3RyZWFtLgorICAgIGNvbnN0IGludDMyX3QgYnVmZmVyU2l6ZSA9IEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoZW5naW5lLnN0cmVhbSwgMiAqIGZyYW1lc1BlckJ1cnN0KTsKKyAgICBpZiAoYnVmZmVyU2l6ZSA8IDApIHsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzIHJldHVybmVkICVzXG4iLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQoYnVmZmVyU2l6ZSkpOworICAgICAgICBlcnJvckNvdW50Kys7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdG8gc2VlIHdoYXQga2luZCBvZiBzdHJlYW0gd2UgYWN0dWFsbHkgZ290LgorICAgIGludDMyX3QgZGV2aWNlSWQgPSBBQXVkaW9TdHJlYW1fZ2V0RGV2aWNlSWQoZW5naW5lLnN0cmVhbSk7CisgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBhY3R1YWxQZXJmTW9kZSA9IEFBdWRpb1N0cmVhbV9nZXRQZXJmb3JtYW5jZU1vZGUoZW5naW5lLnN0cmVhbSk7CisgICAgcHJpbnRmKCItLS0tLS0tLSBvcGVuZWQ6IGRldmljZUlkID0gJTNkLCBmcmFtZXNQZXJCdXJzdCA9ICUzZCwgcGVyZk1vZGUgPSAlZFxuIiwKKyAgICAgICAgICAgZGV2aWNlSWQsIGZyYW1lc1BlckJ1cnN0LCBhY3R1YWxQZXJmTW9kZSk7CisKKyAgICAvLyBDYWxjdWxhdGUgaG93IG1hbnkgY2FsbGJhY2tzIG5lZWRlZC4KKyAgICBpZiAoYWx3YXlzQ29udGludWUpIHsKKyAgICAgICAgZW5naW5lLnN0b3BBdEZyYW1lID0gSU5UMzJfTUFYOworICAgIH0gZWxzZSB7CisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVSYXRlKGVuZ2luZS5zdHJlYW0pOworICAgICAgICBlbmdpbmUuc3RvcEF0RnJhbWUgPSBTVE9QX0FUX01TRUMgKiBzYW1wbGVSYXRlIC8gMTAwMDsKKyAgICB9CisKKyAgICBmb3IgKGludCBsb29wcyA9IDA7IGxvb3BzIDwgMiAmJiByZXN1bHQgPT0gQUFVRElPX09LOyBsb29wcysrKSB7CisgICAgICAgIGVuZ2luZS5yZXNldCgpOworCisgICAgICAgIC8vIFN0YXJ0IHN0cmVhbS4KKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChlbmdpbmUuc3RyZWFtKTsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KCkgcmV0dXJuZWQgJWQgPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PlxuIiwgcmVzdWx0KTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB3YXRjaExvb3BzID0gTE9PUF9EVVJBVElPTl9NU0VDIC8gU0xFRVBfRFVSQVRJT05fTVNFQzsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSB3YXRjaExvb3BzOyBpID4gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgZXJyb3JDb3VudCArPSBzX2NoZWNrRW5naW5lUG9zaXRpb25zKCZlbmdpbmUpID8gMSA6IDA7CisgICAgICAgICAgICAgICAgdXNsZWVwKFNMRUVQX0RVUkFUSU9OX01TRUMgKiAxMDAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmdpbmUuc3RvcEF0RnJhbWUgIT0gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICBjYWxsYmFja1Jlc3VsdCA9IChlbmdpbmUuY2FsbGJhY2tDb3VudEFmdGVyU3RvcCA9PSAwKSA/IEVYSVRfU1VDQ0VTUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBFWElUX0ZBSUxVUkU7CisgICAgICAgICAgICBpZiAoY2FsbGJhY2tSZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gQ2FsbGJhY2sgY291bnQgYWZ0ZXIgU1RPUCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmUuY2FsbGJhY2tDb3VudEFmdGVyU3RvcC5sb2FkKCkpOworICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmdpbmUuc3RhcnRpbmdGcmFtZXNSZWFkLmxvYWQoKSA9PSBlbmdpbmUuZnJhbWVzUmVhZC5sb2FkKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBmcmFtZXNSZWFkIGRpZCBub3QgYWR2YW5jZSBhY3Jvc3MgY2FsbGJhY2tzXG4iKTsKKyAgICAgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChlbmdpbmUuc3RyZWFtKTsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoKSByZXR1cm5lZCAlZCA8PDw8PDw8PDw8PDw8PDw8PDw8PDxcbiIsIHJlc3VsdCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBlcnJvckNvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgdXNsZWVwKFNMRUVQX0RVUkFUSU9OX01TRUMgKiAxMDAwKTsKKyAgICAgICAgZXJyb3JDb3VudCArPSBzX2NoZWNrRW5naW5lUG9zaXRpb25zKCZlbmdpbmUpID8gMSA6IDA7CisgICAgfQorCisgICAgc19DbG9zZUF1ZGlvU3RyZWFtKCZlbmdpbmUpOworCisgICAgcHJpbnRmKCJhYXVkaW8gcmVzdWx0ID0gJWQgPSAlc1xuIiwgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICBwcmludGYoInRlc3QgJXNcbiIsIGVycm9yQ291bnQgPyAiRkFJTEVEIiA6ICJQQVNTRUQiKTsKKworICAgIHJldHVybiBlcnJvckNvdW50ID8gRVhJVF9GQUlMVVJFIDogRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfdGltZXN0YW1wcy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF90aW1lc3RhbXBzLmNwcAppbmRleCBkZmE3ODE1Li43YjFkZmQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF90aW1lc3RhbXBzLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF90aW1lc3RhbXBzLmNwcApAQCAtMzUsNiArMzUsNyBAQAogCiAjZGVmaW5lIE5VTV9TRUNPTkRTICAgICAgICAgICAgIDEKICNkZWZpbmUgTlVNX0xPT1BTICAgICAgICAgICAgICAgNAorI2RlZmluZSBNQVhfVEVTVFMgICAgICAgICAgICAgICAyMAogCiB0eXBlZGVmIHN0cnVjdCBUaW1lc3RhbXBJbmZvIHsKICAgICBpbnQ2NF90ICAgICAgICAgZnJhbWVzVG90YWw7CkBAIC01Myw2ICs1NCw0OSBAQAogICAgIGJvb2wgICAgICAgICAgIGZvcmNlVW5kZXJydW5zID0gZmFsc2U7CiB9IFRpbWVzdGFtcENhbGxiYWNrRGF0YV90OwogCitzdHJ1Y3QgVGltZVN0YW1wVGVzdExvZyB7CisgICAgYWF1ZGlvX3BvbGljeV90ICAgICAgICAgICBpc01tYXA7CisgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90ICAgICBzaGFyaW5nTW9kZTsKKyAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZvcm1hbmNlTW9kZTsKKyAgICBhYXVkaW9fZGlyZWN0aW9uX3QgICAgICAgIGRpcmVjdGlvbjsKKyAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgICAgIHJlc3VsdDsKK307CisKK3N0YXRpYyBpbnQgc19udW1UZXN0cyA9IDA7CisvLyBVc2UgYSBwbGFpbiBvbGQgYXJyYXkgYmVjYXVzZSB3ZSByZWZlcmVuY2UgdGhpcyBmcm9tIHRoZSBjYWxsYmFjayBhbmQgZG8gbm90IHdhbnQgYW55CisvLyBhdXRvbWF0aWMgbWVtb3J5IGFsbG9jYXRpb24uCitzdGF0aWMgVGltZVN0YW1wVGVzdExvZyBzX3Rlc3RMb2dzW01BWF9URVNUU117fTsKKworc3RhdGljIHZvaWQgbG9nVGVzdFJlc3VsdChib29sIGlzTW1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZvcm1hbmNlTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCkgeworICAgIGlmKHNfbnVtVGVzdHMgPj0gTUFYX1RFU1RTKSB7CisgICAgICAgIHByaW50ZigiRVJST1IgLSBNQVhfVEVTVFMgdG9vIHNtYWxsID0gJWRcbiIsIE1BWF9URVNUUyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc190ZXN0TG9nc1tzX251bVRlc3RzXS5pc01tYXAgPSBpc01tYXA7CisgICAgc190ZXN0TG9nc1tzX251bVRlc3RzXS5zaGFyaW5nTW9kZSA9IHNoYXJpbmdNb2RlOworICAgIHNfdGVzdExvZ3Nbc19udW1UZXN0c10ucGVyZm9ybWFuY2VNb2RlID0gcGVyZm9ybWFuY2VNb2RlOworICAgIHNfdGVzdExvZ3Nbc19udW1UZXN0c10uZGlyZWN0aW9uID0gZGlyZWN0aW9uOworICAgIHNfdGVzdExvZ3Nbc19udW1UZXN0c10ucmVzdWx0ID0gcmVzdWx0OworICAgIHNfbnVtVGVzdHMrKzsKK30KKworc3RhdGljIHZvaWQgcHJpbnRUZXN0UmVzdWx0cygpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNfbnVtVGVzdHM7IGkrKykgeworICAgICAgICBUaW1lU3RhbXBUZXN0TG9nICpsb2cgPSAmc190ZXN0TG9nc1tpXTsKKyAgICAgICAgcHJpbnRmKCIlMmQ6IG1tYXAgPSAlM3MsIHNoYXJpbmcgPSAlOXMsIHBlcmYgPSAlMTFzLCBkaXIgPSAlNnMgLS0tLSAlNHNcbiIsCisgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgbG9nLT5pc01tYXAgPyAieWVzIiA6ICJubyIsCisgICAgICAgICAgICAgICBnZXRTaGFyaW5nTW9kZVRleHQobG9nLT5zaGFyaW5nTW9kZSksCisgICAgICAgICAgICAgICBnZXRQZXJmb3JtYW5jZU1vZGVUZXh0KGxvZy0+cGVyZm9ybWFuY2VNb2RlKSwKKyAgICAgICAgICAgICAgIGdldERpcmVjdGlvblRleHQobG9nLT5kaXJlY3Rpb24pLAorICAgICAgICAgICAgICAgbG9nLT5yZXN1bHQgPyAiRkFJTCIgOiAicGFzcyIpOworICAgIH0KK30KKwogLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBmaWxscyB0aGUgYXVkaW8gb3V0cHV0IGJ1ZmZlci4KIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IHRpbWVzdGFtcERhdGFDYWxsYmFja1Byb2MoCiAgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtLApAQCAtMTE1LDYgKzE1OSw3IEBACiAgICAgaW50MzJfdCBvcmlnaW5hbEJ1ZmZlclNpemUgPSAwOwogICAgIGludDMyX3QgcmVxdWVzdGVkQnVmZmVyU2l6ZSA9IDA7CiAgICAgaW50MzJfdCBmaW5hbEJ1ZmZlclNpemUgPSAwOworICAgIGJvb2wgICAgaXNNbWFwID0gZmFsc2U7CiAgICAgYWF1ZGlvX2Zvcm1hdF90IGFjdHVhbERhdGFGb3JtYXQgPSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgYWN0dWFsU2hhcmluZ01vZGUgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgYWN0dWFsUGVyZm9ybWFuY2VNb2RlID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORTsKQEAgLTEyNCw3ICsxNjksOCBAQAogCiAgICAgbWVtc2V0KCZzVGltZXN0YW1wRGF0YSwgMCwgc2l6ZW9mKHNUaW1lc3RhbXBEYXRhKSk7CiAKLSAgICBwcmludGYoIi0tLS0tLS0tLS0tLSB0ZXN0VGltZVN0YW1wcyhwb2xpY3kgPSAlZCwgc2hhcmluZyA9ICVzLCBwZXJmID0gJXMsIGRpciA9ICVzKSAtLS0tLS0tLS0tLVxuIiwKKyAgICBwcmludGYoIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKyAgICBwcmludGYoIi0tLS0tLS0tLSB0ZXN0VGltZVN0YW1wcyhwb2xpY3kgPSAlZCwgc2hhcmluZyA9ICVzLCBwZXJmID0gJXMsIGRpciA9ICVzKSAtLS0tLS0tLVxuIiwKICAgICAgICAgICAgbW1hcFBvbGljeSwKICAgICAgICAgICAgZ2V0U2hhcmluZ01vZGVUZXh0KHNoYXJpbmdNb2RlKSwKICAgICAgICAgICAgZ2V0UGVyZm9ybWFuY2VNb2RlVGV4dChwZXJmb3JtYW5jZU1vZGUpLApAQCAtMTc3LDggKzIyMyw4IEBACiAKICAgICBwcmludGYoIiAgICBjaGFucyA9ICUzZCwgcmF0ZSA9ICU2ZCBmb3JtYXQgPSAlZFxuIiwKICAgICAgICAgICAgYWN0dWFsQ2hhbm5lbENvdW50LCBhY3R1YWxTYW1wbGVSYXRlLCBhY3R1YWxEYXRhRm9ybWF0KTsKLSAgICBwcmludGYoIiAgICBJcyBNTUFQIHVzZWQ/ICVzXG4iLCBBQXVkaW9TdHJlYW1faXNNTWFwVXNlZChhYXVkaW9TdHJlYW0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAieWVzIiA6ICJubyIpOworICAgIGlzTW1hcCA9IEFBdWRpb1N0cmVhbV9pc01NYXBVc2VkKGFhdWRpb1N0cmVhbSk7CisgICAgcHJpbnRmKCIgICAgSXMgTU1BUCB1c2VkPyAlc1xuIiwgaXNNbWFwID8gInllcyIgOiAibm8iKTsKIAogICAgIC8vIFRoaXMgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgdGhhdCBhcmUgcmVhZCBpbiBvbmUgY2h1bmsgYnkgYSBETUEgY29udHJvbGxlcgogICAgIC8vIG9yIGEgRFNQIG9yIGEgbWl4ZXIuCkBAIC0yMTgsNyArMjY0LDcgQEAKIAogICAgICAgICBmb3IgKGludCBzZWNvbmQgPSAwOyBzZWNvbmQgPCBOVU1fU0VDT05EUzsgc2Vjb25kKyspIHsKICAgICAgICAgICAgIC8vIEdpdmUgQUF1ZGlvIGNhbGxiYWNrIHRpbWUgdG8gcnVuIGluIHRoZSBiYWNrZ3JvdW5kLgotICAgICAgICAgICAgc2xlZXAoMSk7CisgICAgICAgICAgICB1c2xlZXAoMjAwICogMTAwMCk7CiAKICAgICAgICAgICAgIC8vIFBlcmlvZGljYWxseSBwcmludCB0aGUgcHJvZ3Jlc3Mgc28gd2Uga25vdyBpdCBoYXNuJ3QgZGllZC4KICAgICAgICAgICAgIHByaW50ZigiZnJhbWVzV3JpdHRlbiA9ICVkLCBYUnVucyA9ICVkXG4iLApAQCAtMjM0LDE4ICsyODAsMjUgQEAKICAgICAgICAgfQogCiAgICAgICAgIHByaW50ZigidGltZXN0YW1wQ291bnQgPSAlZFxuIiwgc1RpbWVzdGFtcERhdGEudGltZXN0YW1wQ291bnQpOwotICAgICAgICBpbnQgcHJpbnRlZCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc1RpbWVzdGFtcERhdGEudGltZXN0YW1wQ291bnQ7IGkrKykgeworICAgICAgICBpbnQgcHJpbnRlZEdvb2QgPSAwOworICAgICAgICBpbnQgcHJpbnRlZEJhZCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc1RpbWVzdGFtcERhdGEudGltZXN0YW1wQ291bnQ7IGkrKykgewogICAgICAgICAgICAgVGltZXN0YW1wSW5mbyAqdGltZXN0YW1wID0gJnNUaW1lc3RhbXBEYXRhLnRpbWVzdGFtcHNbaV07Ci0gICAgICAgICAgICBib29sIHBvc0NoYW5nZWQgPSAodGltZXN0YW1wLT50aW1lc3RhbXBQb3NpdGlvbiAhPSAodGltZXN0YW1wIC0gMSktPnRpbWVzdGFtcFBvc2l0aW9uKTsKLSAgICAgICAgICAgIGJvb2wgdGltZUNoYW5nZWQgPSAodGltZXN0YW1wLT50aW1lc3RhbXBOYW5vcyAhPSAodGltZXN0YW1wIC0gMSktPnRpbWVzdGFtcE5hbm9zKTsKLSAgICAgICAgICAgIGlmICgocHJpbnRlZCA8IDIwKSAmJiAoKGkgPCAxMCkgfHwgcG9zQ2hhbmdlZCB8fCB0aW1lQ2hhbmdlZCkpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIiAgJTNkIDogZnJhbWVzICU4bGxkLCB4ZmVyZCAlOGxsZCIsIGksCi0gICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVzdGFtcC0+ZnJhbWVzVG90YWwsCi0gICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVzdGFtcC0+YXBwUG9zaXRpb24pOwotICAgICAgICAgICAgICAgIGlmICh0aW1lc3RhbXAtPnJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIHJlc3VsdCA9ICVzXG4iLCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dCh0aW1lc3RhbXAtPnJlc3VsdCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAodGltZXN0YW1wLT5yZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICAgICAgaWYgKHByaW50ZWRCYWQgPCA1KSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICAlM2QgOiBmcmFtZXMgJThsbGQsIHhmZXJkICU4bGxkLCByZXN1bHQgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSB0aW1lc3RhbXAtPmZyYW1lc1RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT5hcHBQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHRpbWVzdGFtcC0+cmVzdWx0KSk7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZWRCYWQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgcG9zQ2hhbmdlZCA9ICh0aW1lc3RhbXAtPnRpbWVzdGFtcFBvc2l0aW9uICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aW1lc3RhbXAgLSAxKS0+dGltZXN0YW1wUG9zaXRpb24pOworICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgdGltZUNoYW5nZWQgPSAodGltZXN0YW1wLT50aW1lc3RhbXBOYW5vcworICAgICAgICAgICAgICAgICAgICAgICAgIT0gKHRpbWVzdGFtcCAtIDEpLT50aW1lc3RhbXBOYW5vcyk7CisgICAgICAgICAgICAgICAgaWYgKChwcmludGVkR29vZCA8IDIwKSAmJiAocG9zQ2hhbmdlZCB8fCB0aW1lQ2hhbmdlZCkpIHsKICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWdhdGl2ZSA9IHRpbWVzdGFtcC0+dGltZXN0YW1wUG9zaXRpb24gPCAwOwogICAgICAgICAgICAgICAgICAgICBib29sIHJldHJvID0gKGkgPiAwICYmICh0aW1lc3RhbXAtPnRpbWVzdGFtcFBvc2l0aW9uIDwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpbWVzdGFtcCAtIDEpLT50aW1lc3RhbXBQb3NpdGlvbikpOwpAQCAtMjUzLDE3ICszMDYsMzkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHJldHJvID8gIiAgPD0gUkVUUk9HUkFERSEiIDogIiIpOwogCiAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsYXRlbmN5ID0gY2FsY3VsYXRlTGF0ZW5jeU1pbGxpcyh0aW1lc3RhbXAtPnRpbWVzdGFtcFBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50aW1lc3RhbXBOYW5vcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+YXBwUG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPmFwcE5hbm9zZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsU2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCBTVEFNUDogcG9zID0gJThsbGQsIG5hbm9zID0gJThsbGQsIGxhdCA9ICU3LjFmIG1zZWMgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnRpbWVzdGFtcE5hbm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5hcHBQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+YXBwTmFub3NlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxTYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICUzZCA6IGZyYW1lcyAlOGxsZCwgeGZlcmQgJThsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVzdGFtcC0+ZnJhbWVzVG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSB0aW1lc3RhbXAtPmFwcFBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgU1RBTVA6IHBvcyA9ICU4bGxkLCBuYW5vcyA9ICU4bGxkLCBsYXQgPSAlNy4xZiBtc2VjICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT50aW1lc3RhbXBQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVzdGFtcC0+dGltZXN0YW1wTmFub3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlbmN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZWRHb29kKys7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHByaW50ZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcmludGVkR29vZCA9PSAwKSB7CisgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX2dldFRpbWVzdGFtcCgpIG5ldmVyIGdhdmUgdXMgYSB2YWxpZCB0aW1lc3RhbXBcbiIpOworICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvIG5vdCBnZXQgdGltZXN0YW1wcyB3aGVuIHN0b3BwZWQuCisgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uOworICAgICAgICAgICAgaW50NjRfdCB0aW1lOworICAgICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHRlbXBSZXN1bHQgPSBBQXVkaW9TdHJlYW1fZ2V0VGltZXN0YW1wKGFhdWRpb1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTE9DS19NT05PVE9OSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uLCAmdGltZSk7CisgICAgICAgICAgICBpZiAodGVtcFJlc3VsdCAhPSBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9TdHJlYW1fZ2V0VGltZXN0YW1wKCkgc2hvdWxkIHJldHVybiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiBJTlZBTElEX1NUQVRFIHdoZW4gc3RvcHBlZCEgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHRlbXBSZXN1bHQpKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjczLDEyICszNDgsMTQgQEAKICAgICB9CiAKIGZpbmlzaDoKKworICAgIGxvZ1Rlc3RSZXN1bHQoaXNNbWFwLCBzaGFyaW5nTW9kZSwgcGVyZm9ybWFuY2VNb2RlLCBkaXJlY3Rpb24sIHJlc3VsdCk7CisKICAgICBpZiAoYWF1ZGlvU3RyZWFtICE9IG51bGxwdHIpIHsKICAgICAgICAgQUF1ZGlvU3RyZWFtX2Nsb3NlKGFhdWRpb1N0cmVhbSk7CiAgICAgfQogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKGFhdWRpb0J1aWxkZXIpOwogICAgIHByaW50ZigicmVzdWx0ID0gJWQgPSAlc1xuIiwgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKLQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTI5Miw3ICszNjksNyBAQAogICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCiAgICAgc2V0dmJ1ZihzdGRvdXQsIG51bGxwdHIsIF9JT05CRiwgKHNpemVfdCkgMCk7CiAKLSAgICBwcmludGYoIlRlc3QgVGltZXN0YW1wcyBWMC4xLjNcbiIpOworICAgIHByaW50ZigiVGVzdCBUaW1lc3RhbXBzIFYwLjEuNFxuIik7CiAKICAgICAvLyBMZWdhY3kKICAgICBhYXVkaW9fcG9saWN5X3QgcG9saWN5ID0gQUFVRElPX1BPTElDWV9ORVZFUjsKQEAgLTMzMiw1ICs0MDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKTsKIAorICAgIHByaW50VGVzdFJlc3VsdHMoKTsKKwogICAgIHJldHVybiAocmVzdWx0ID09IEFBVURJT19PSykgPyBFWElUX1NVQ0NFU1MgOiBFWElUX0ZBSUxVUkU7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icAppbmRleCAwMTE5NzllLi5lOWI2ZmIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAKQEAgLTUsNiArNSwyOSBAQAogfQogCiBjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJBdWRpb0F0dHJpYnV0ZXMuY3BwIiwKKyAgICAgICAgIkF1ZGlvUG9saWN5LmNwcCIsCisgICAgICAgICJBdWRpb1Byb2R1Y3RTdHJhdGVneS5jcHAiLAorICAgICAgICAiQXVkaW9Wb2x1bWVHcm91cC5jcHAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorICAgIGluY2x1ZGVfZGlyczogWyJzeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHMvaW5jbHVkZSJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmF1ZGlvY2xpZW50IiwKIAogICAgIGFpZGw6IHsKQEAgLTIzLDcgKzQ2LDYgQEAKICAgICAgICAgIjpsaWJhdWRpb2NsaWVudF9haWRsIiwKIAogICAgICAgICAiQXVkaW9FZmZlY3QuY3BwIiwKLSAgICAgICAgIkF1ZGlvUG9saWN5LmNwcCIsCiAgICAgICAgICJBdWRpb1JlY29yZC5jcHAiLAogICAgICAgICAiQXVkaW9TeXN0ZW0uY3BwIiwKICAgICAgICAgIkF1ZGlvVHJhY2suY3BwIiwKQEAgLTQwLDE2ICs2MiwyMCBAQAogICAgICAgICAiVHJhY2tQbGF5ZXJCYXNlLmNwcCIsCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmRsIiwKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYXVkaW9wb2xpY3kiLAogICAgICAgICAibGliYXVkaW9tYW5hZ2VyIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZGwiLAorICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJuYmxvZyIsCisgICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlidmlicmF0b3IiLAogICAgIF0sCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWyJsaWJiaW5kZXIiXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9BdHRyaWJ1dGVzLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvQXR0cmlidXRlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVlNjkzMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvQXR0cmlidXRlcy5jcHAKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9BdHRyaWJ1dGVzIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdHVzX3QgQXVkaW9BdHRyaWJ1dGVzOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkKK3sKKyAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKKyAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBzdGF0aWNfY2FzdDxhdWRpb19jb250ZW50X3R5cGVfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgbUF0dHJpYnV0ZXMudXNhZ2UgPSBzdGF0aWNfY2FzdDxhdWRpb191c2FnZV90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKKyAgICBtQXR0cmlidXRlcy5zb3VyY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19zb3VyY2VfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgbUF0dHJpYnV0ZXMuZmxhZ3MgPSBzdGF0aWNfY2FzdDxhdWRpb19mbGFnc19tYXNrX3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOworICAgIGNvbnN0IGJvb2wgaGFzRmxhdHRlbmVkVGFnID0gKHBhcmNlbC0+cmVhZEludDMyKCkgPT0gMSk7CisgICAgaWYgKGhhc0ZsYXR0ZW5lZFRhZykgeworICAgICAgICBzdGQ6OnN0cmluZyB0YWdzOworICAgICAgICByZXQgPSBwYXJjZWwtPnJlYWRVdGY4RnJvbVV0ZjE2KCZ0YWdzKTsKKyAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cm5jcHkobUF0dHJpYnV0ZXMudGFncywgdGFncy5jX3N0cigpLCBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdHJjcHkobUF0dHJpYnV0ZXMudGFncywgIiIpOworICAgIH0KKyAgICBtU3RyZWFtVHlwZSA9IHN0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOworICAgIG1Hcm91cElkID0gc3RhdGljX2Nhc3Q8dm9sdW1lX2dyb3VwX3Q+KHBhcmNlbC0+cmVhZFVpbnQzMigpKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvQXR0cmlidXRlczo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QKK3sKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUF0dHJpYnV0ZXMuY29udGVudF90eXBlKSk7CisgICAgcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1BdHRyaWJ1dGVzLnVzYWdlKSk7CisgICAgcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1BdHRyaWJ1dGVzLnNvdXJjZSkpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihtQXR0cmlidXRlcy5mbGFncykpOworICAgIGlmIChzdHJsZW4obUF0dHJpYnV0ZXMudGFncykgPT0gMCkgeworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKDEpOworICAgICAgICBwYXJjZWwtPndyaXRlVXRmOEFzVXRmMTYobUF0dHJpYnV0ZXMudGFncyk7CisgICAgfQorICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihtU3RyZWFtVHlwZSkpOworICAgIHBhcmNlbC0+d3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1Hcm91cElkKSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAKaW5kZXggYjQwZjBkYi4uY2YxMTkzNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcApAQCAtNDMyLDE0ICs0MzIsMTUgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OmdldEVmZmVjdERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikgLypjb25zdCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKQogewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFmLT5nZXRFZmZlY3REZXNjcmlwdG9yKHV1aWQsIGRlc2NyaXB0b3IpOworICAgIHJldHVybiBhZi0+Z2V0RWZmZWN0RGVzY3JpcHRvcih1dWlkLCB0eXBlLCBwcmVmZXJyZWRUeXBlRmxhZywgZGVzY3JpcHRvcik7CiB9CiAKLQogc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KQpAQCAtNDQ4LDYgKzQ0OSw5NSBAQAogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIHJldHVybiBhcHMtPnF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoYXVkaW9TZXNzaW9uLCBkZXNjcmlwdG9ycywgY291bnQpOwogfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6bmV3RWZmZWN0VW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQoreworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgKmlkID0gYWYtPm5ld0F1ZGlvVW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9FRkZFQ1QpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OmFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgY2hhciAqdHlwZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXVpZFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCAqaWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIGlmICh0eXBlU3RyID09IE5VTEwgJiYgdXVpZFN0ciA9PSBOVUxMKSByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgLy8gQ29udmVydCB0eXBlICYgdXVpZCBmcm9tIHN0cmluZyB0byBlZmZlY3RfdXVpZF90LgorICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKKyAgICBpZiAodHlwZVN0ciAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHN0cmluZ1RvR3VpZCh0eXBlU3RyLCAmdHlwZSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHlwZSA9ICpFRkZFQ1RfVVVJRF9OVUxMOworICAgIH0KKworICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKKyAgICBpZiAodXVpZFN0ciAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHN0cmluZ1RvR3VpZCh1dWlkU3RyLCAmdXVpZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdXVpZCA9ICpFRkZFQ1RfVVVJRF9OVUxMOworICAgIH0KKworICAgIHJldHVybiBhcHMtPmFkZFNvdXJjZURlZmF1bHRFZmZlY3QoJnR5cGUsIG9wUGFja2FnZU5hbWUsICZ1dWlkLCBwcmlvcml0eSwgc291cmNlLCBpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjphZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGNoYXIgKnR5cGVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90ICppZCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgaWYgKHR5cGVTdHIgPT0gTlVMTCAmJiB1dWlkU3RyID09IE5VTEwpIHJldHVybiBCQURfVkFMVUU7CisKKyAgICAvLyBDb252ZXJ0IHR5cGUgJiB1dWlkIGZyb20gc3RyaW5nIHRvIGVmZmVjdF91dWlkX3QuCisgICAgZWZmZWN0X3V1aWRfdCB0eXBlOworICAgIGlmICh0eXBlU3RyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gc3RyaW5nVG9HdWlkKHR5cGVTdHIsICZ0eXBlKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICB9IGVsc2UgeworICAgICAgICB0eXBlID0gKkVGRkVDVF9VVUlEX05VTEw7CisgICAgfQorCisgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworICAgIGlmICh1dWlkU3RyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gc3RyaW5nVG9HdWlkKHV1aWRTdHIsICZ1dWlkKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICB9IGVsc2UgeworICAgICAgICB1dWlkID0gKkVGRkVDVF9VVUlEX05VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGFwcy0+YWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgmdHlwZSwgb3BQYWNrYWdlTmFtZSwgJnV1aWQsIHByaW9yaXR5LCB1c2FnZSwgaWQpOworfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6cmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgcmV0dXJuIGFwcy0+cmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjpyZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICByZXR1cm4gYXBzLT5yZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGlkKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0dXNfdCBBdWRpb0VmZmVjdDo6c3RyaW5nVG9HdWlkKGNvbnN0IGNoYXIgKnN0ciwgZWZmZWN0X3V1aWRfdCAqZ3VpZCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUG9saWN5LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUG9saWN5LmNwcAppbmRleCBkMWY3NTI1Li4zYWIzOGNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1BvbGljeS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qb2xpY3kuY3BwCkBAIC0yMiw2ICsyMiwyMiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLworLy8gIEF1ZGlvRGV2aWNlVHlwZUFkZHIgaW1wbGVtZW50YXRpb24KKy8vCitzdGF0dXNfdCBBdWRpb0RldmljZVR5cGVBZGRyOjpyZWFkRnJvbVBhcmNlbChQYXJjZWwgKnBhcmNlbCkgeworICAgIG1UeXBlID0gKGF1ZGlvX2RldmljZXNfdCkgcGFyY2VsLT5yZWFkSW50MzIoKTsKKyAgICBtQWRkcmVzcyA9IHBhcmNlbC0+cmVhZFN0cmluZzgoKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvRGV2aWNlVHlwZUFkZHI6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IHsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIG1UeXBlKTsKKyAgICBwYXJjZWwtPndyaXRlU3RyaW5nOChtQWRkcmVzcyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKKy8vCiAvLyAgQXVkaW9NaXhNYXRjaENyaXRlcmlvbiBpbXBsZW1lbnRhdGlvbgogLy8KIEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb246OkF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24oYXVkaW9fdXNhZ2VfdCB1c2FnZSwKQEAgLTQwLDExICs1NiwyMiBAQAogc3RhdHVzX3QgQXVkaW9NaXhNYXRjaENyaXRlcmlvbjo6cmVhZEZyb21QYXJjZWwoUGFyY2VsICpwYXJjZWwpCiB7CiAgICAgbVJ1bGUgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwotICAgIGlmIChtUnVsZSA9PSBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRSB8fAotICAgICAgICAgICAgbVJ1bGUgPT0gUlVMRV9FWENMVURFX0FUVFJJQlVURV9VU0FHRSkgewotICAgICAgICBtVmFsdWUubVVzYWdlID0gKGF1ZGlvX3VzYWdlX3QpcGFyY2VsLT5yZWFkSW50MzIoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtVmFsdWUubVNvdXJjZSA9IChhdWRpb19zb3VyY2VfdClwYXJjZWwtPnJlYWRJbnQzMigpOworICAgIHN3aXRjaCAobVJ1bGUpIHsKKyAgICBjYXNlIFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFOgorICAgIGNhc2UgUlVMRV9FWENMVURFX0FUVFJJQlVURV9VU0FHRToKKyAgICAgICAgbVZhbHVlLm1Vc2FnZSA9IChhdWRpb191c2FnZV90KSBwYXJjZWwtPnJlYWRJbnQzMigpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJVTEVfTUFUQ0hfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUOgorICAgIGNhc2UgUlVMRV9FWENMVURFX0FUVFJJQlVURV9DQVBUVVJFX1BSRVNFVDoKKyAgICAgICAgbVZhbHVlLm1Tb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIHBhcmNlbC0+cmVhZEludDMyKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlVMRV9NQVRDSF9VSUQ6CisgICAgY2FzZSBSVUxFX0VYQ0xVREVfVUlEOgorICAgICAgICBtVmFsdWUubVVpZCA9ICh1aWRfdCkgcGFyY2VsLT5yZWFkSW50MzIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIlRyeWluZyB0byBidWlsZCBBdWRpb01peE1hdGNoQ3JpdGVyaW9uIGZyb20gdW5rbm93biBydWxlICVkIiwgbVJ1bGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0xMTYsNCArMTQzLDE4IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCit2b2lkIEF1ZGlvTWl4OjpzZXRFeGNsdWRlVWlkKHVpZF90IHVpZCkgY29uc3QgeworICAgIEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24gY3JpdDsKKyAgICBjcml0Lm1SdWxlID0gUlVMRV9FWENMVURFX1VJRDsKKyAgICBjcml0Lm1WYWx1ZS5tVWlkID0gdWlkOworICAgIG1Dcml0ZXJpYS5hZGQoY3JpdCk7Cit9CisKK3ZvaWQgQXVkaW9NaXg6OnNldE1hdGNoVWlkKHVpZF90IHVpZCkgY29uc3QgeworICAgIEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24gY3JpdDsKKyAgICBjcml0Lm1SdWxlID0gUlVMRV9NQVRDSF9VSUQ7CisgICAgY3JpdC5tVmFsdWUubVVpZCA9IHVpZDsKKyAgICBtQ3JpdGVyaWEuYWRkKGNyaXQpOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1Byb2R1Y3RTdHJhdGVneS5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1Byb2R1Y3RTdHJhdGVneS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRhMTExNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmNwcApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb1Byb2R1Y3RTdHJhdGVneSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQXR0cmlidXRlcy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdHVzX3QgQXVkaW9Qcm9kdWN0U3RyYXRlZ3k6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKQoreworICAgIG1JZCA9IHN0YXRpY19jYXN0PHByb2R1Y3Rfc3RyYXRlZ3lfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgc3RhdHVzX3QgcmV0ID0gcGFyY2VsLT5yZWFkVXRmOEZyb21VdGYxNigmbU5hbWUpOworICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGU7CisgICAgICAgIHJldCA9IGF0dHJpYnV0ZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzLmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMucHVzaF9iYWNrKGF0dHJpYnV0ZSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qcm9kdWN0U3RyYXRlZ3k6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0Cit7CisgICAgcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1JZCkpOworICAgIHBhcmNlbC0+d3JpdGVVdGY4QXNVdGYxNihtTmFtZSk7CisgICAgc2l6ZV90IHNpemUgPSBtQXVkaW9BdHRyaWJ1dGVzLnNpemUoKTsKKyAgICBzaXplX3Qgc2l6ZVBvc2l0aW9uID0gcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoc2l6ZSk7CisgICAgc2l6ZV90IGZpbmFsU2l6ZSA9IHNpemU7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBwYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICAgICAgICBBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlKG1BdWRpb0F0dHJpYnV0ZXNbaV0pOworICAgICAgICBzdGF0dXNfdCByZXQgPSBhdHRyaWJ1dGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBwYXJjZWwtPnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICBmaW5hbFNpemUtLTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc2l6ZSAhPSBmaW5hbFNpemUpIHsKKyAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oc2l6ZVBvc2l0aW9uKTsKKyAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKGZpbmFsU2l6ZSk7CisgICAgICAgIHBhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitib29sIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5OjphdHRyaWJ1dGVzTWF0Y2hlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgcmVmQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgY2xpZW50QXR0cml0dWJlcykKK3sKKyAgICBpZiAocmVmQXR0cmlidXRlcyA9PSBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSKSB7CisgICAgICAgIC8vIFRoZSBkZWZhdWx0IHByb2R1Y3Qgc3RyYXRlZ3kgaXMgdGhlIHN0cmF0ZWd5IHRoYXQgaG9sZHMgZGVmYXVsdCBhdHRyaWJ1dGVzIGJ5IGNvbnZlbnRpb24uCisgICAgICAgIC8vIEFsbCBhdHRyaWJ1dGVzIHRoYXQgZmFpbCB0byBtYXRjaCB3aWxsIGZvbGxvdyB0aGUgZGVmYXVsdCBzdHJhdGVneSBmb3Igcm91dGluZy4KKyAgICAgICAgLy8gQ2hvb3NpbmcgdGhlIGRlZmF1bHQgbXVzdCBiZSBkb25lIGFzIGEgZmFsbGJhY2ssIHRoZSBhdHRyaWJ1dGVzIG1hdGNoIHNoYWxsIG5vdAorICAgICAgICAvLyBzZWxlY3QgdGhlIGRlZmF1bHQuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuICgocmVmQXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9VTktOT1dOKSB8fAorICAgICAgICAgICAgKGNsaWVudEF0dHJpdHViZXMudXNhZ2UgPT0gcmVmQXR0cmlidXRlcy51c2FnZSkpICYmCisgICAgICAgICAgICAoKHJlZkF0dHJpYnV0ZXMuY29udGVudF90eXBlID09IEFVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOKSB8fAorICAgICAgICAgICAgIChjbGllbnRBdHRyaXR1YmVzLmNvbnRlbnRfdHlwZSA9PSByZWZBdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSkpICYmCisgICAgICAgICAgICAoKHJlZkF0dHJpYnV0ZXMuZmxhZ3MgPT0gQVVESU9fRkxBR19OT05FKSB8fAorICAgICAgICAgICAgIChjbGllbnRBdHRyaXR1YmVzLmZsYWdzICE9IEFVRElPX0ZMQUdfTk9ORSAmJgorICAgICAgICAgICAgKGNsaWVudEF0dHJpdHViZXMuZmxhZ3MgJiByZWZBdHRyaWJ1dGVzLmZsYWdzKSA9PSBjbGllbnRBdHRyaXR1YmVzLmZsYWdzKSkgJiYKKyAgICAgICAgICAgICgoc3RybGVuKHJlZkF0dHJpYnV0ZXMudGFncykgPT0gMCkgfHwKKyAgICAgICAgICAgICAoc3RkOjpzdHJjbXAoY2xpZW50QXR0cml0dWJlcy50YWdzLCByZWZBdHRyaWJ1dGVzLnRhZ3MpID09IDApKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCmluZGV4IDhlMmRhOWUuLjU4NTE1MzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKQEAgLTUwLDggKzUwLDkgQEAKICAgICBzaXplX3Qgc2l6ZTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRCdWZmZXJTaXplKHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssICZzaXplKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb1N5c3RlbSBjb3VsZCBub3QgcXVlcnkgdGhlIGlucHV0IGJ1ZmZlciBzaXplIGZvciBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCAiCi0gICAgICAgICAgICAgICJjaGFubmVsTWFzayAlI3g7IHN0YXR1cyAlZCIsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcygpOiBBdWRpb1N5c3RlbSBjb3VsZCBub3QgcXVlcnkgdGhlIGlucHV0IGJ1ZmZlciBzaXplIGZvciIKKyAgICAgICAgICAgICAgIiBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3g7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICBfX2Z1bmNfXywgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKQEAgLTU5LDggKzYwLDggQEAKICAgICAvLyBBc3N1bWVzIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KQogICAgIGlmICgoKmZyYW1lQ291bnQgPSAoc2l6ZSAqIDIpIC8gKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKSAqCiAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkpKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBjb25maWd1cmF0aW9uOiBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3giLAotICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7CisgICAgICAgIEFMT0dFKCIlcygpOiBVbnN1cHBvcnRlZCBjb25maWd1cmF0aW9uOiBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3giLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTY5LDcwICs3MCwzNCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3RhdGljIHN0ZDo6c3RyaW5nIGF1ZGlvRm9ybWF0VHlwZVN0cmluZyhhdWRpb19mb3JtYXRfdCB2YWx1ZSkgewotICAgIHN0ZDo6c3RyaW5nIGZvcm1hdFR5cGU7Ci0gICAgaWYgKEZvcm1hdENvbnZlcnRlcjo6dG9TdHJpbmcodmFsdWUsIGZvcm1hdFR5cGUpKSB7Ci0gICAgICAgIHJldHVybiBmb3JtYXRUeXBlOwotICAgIH0KLSAgICBjaGFyIHJhd2J1ZmZlclsxNl07ICAvLyByb29tIGZvciAiJWQiCi0gICAgc25wcmludGYocmF3YnVmZmVyLCBzaXplb2YocmF3YnVmZmVyKSwgIiVkIiwgdmFsdWUpOwotICAgIHJldHVybiByYXdidWZmZXI7Ci19Ci0KLXN0YXRpYyBzdGQ6OnN0cmluZyBhdWRpb1NvdXJjZVN0cmluZyhhdWRpb19zb3VyY2VfdCB2YWx1ZSkgewotICAgIHN0ZDo6c3RyaW5nIHNvdXJjZTsKLSAgICBpZiAoU291cmNlVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcodmFsdWUsIHNvdXJjZSkpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZTsKLSAgICB9Ci0gICAgY2hhciByYXdidWZmZXJbMTZdOyAgLy8gcm9vbSBmb3IgIiVkIgotICAgIHNucHJpbnRmKHJhd2J1ZmZlciwgc2l6ZW9mKHJhd2J1ZmZlciksICIlZCIsIHZhbHVlKTsKLSAgICByZXR1cm4gcmF3YnVmZmVyOwotfQotCiB2b2lkIEF1ZGlvUmVjb3JkOjpNZWRpYU1ldHJpY3M6OmdhdGhlcihjb25zdCBBdWRpb1JlY29yZCAqcmVjb3JkKQogewotICAgIC8vIGtleSBmb3IgbWVkaWEgc3RhdGlzdGljcyBpcyBkZWZpbmVkIGluIHRoZSBoZWFkZXIKLSAgICAvLyBhdHRycyBmb3IgbWVkaWEgc3RhdGlzdGljcwotICAgIC8vIE5COiB0aGVzZSBhcmUgbWF0Y2hlZCB3aXRoIHB1YmxpYyBKYXZhIEFQSSBjb25zdGFudHMgZGVmaW5lZAotICAgIC8vIGluIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9SZWNvcmQuamF2YQotICAgIC8vIFRoZXNlIG11c3QgYmUga2VwdCBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgY29uc3RhbnRzIHRoZXJlLgotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9SZWNvcmRFbmNvZGluZ1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuZW5jb2RpbmciOwotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9SZWNvcmRTb3VyY2VbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLnNvdXJjZSI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1JlY29yZExhdGVuY3lbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmxhdGVuY3kiOwotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9SZWNvcmRTYW1wbGVSYXRlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5zYW1wbGVyYXRlIjsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUmVjb3JkQ2hhbm5lbENvdW50W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5jaGFubmVscyI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1JlY29yZENyZWF0ZWRbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmNyZWF0ZWRNcyI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1JlY29yZER1cmF0aW9uW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5kdXJhdGlvbk1zIjsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUmVjb3JkQ291bnRbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLm4iOwotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9SZWNvcmRFcnJvcltdID0gImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuZXJyY29kZSI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1JlY29yZEVycm9yRnVuY3Rpb25bXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmVycmZ1bmMiOworI2RlZmluZSBNTV9QUkVGSVggImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuIiAvLyBhdm9pZCBjdXQtbi1wYXN0ZSBlcnJvcnMuCiAKLSAgICAvLyBjb25zdHJ1Y3RvciBndWFyYW50ZWVzIG1BbmFseXRpY3NJdGVtIGlzIHZhbGlkCisgICAgLy8gSmF2YSBBUEkgMjggZW50cmllcywgZG8gbm90IGNoYW5nZS4KKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggImVuY29kaW5nIiwgdG9TdHJpbmcocmVjb3JkLT5tRm9ybWF0KS5jX3N0cigpKTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggInNvdXJjZSIsIHRvU3RyaW5nKHJlY29yZC0+bUF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJsYXRlbmN5IiwgKGludDMyX3QpcmVjb3JkLT5tTGF0ZW5jeSk7IC8vIGJhZCBlc3RpbWF0ZS4KKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJzYW1wbGVyYXRlIiwgKGludDMyX3QpcmVjb3JkLT5tU2FtcGxlUmF0ZSk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAiY2hhbm5lbHMiLCAoaW50MzJfdClyZWNvcmQtPm1DaGFubmVsQ291bnQpOwogCi0gICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtBdWRpb1JlY29yZExhdGVuY3ksIHJlY29yZC0+bUxhdGVuY3kpOwotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQXVkaW9SZWNvcmRTYW1wbGVSYXRlLCByZWNvcmQtPm1TYW1wbGVSYXRlKTsKLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0F1ZGlvUmVjb3JkQ2hhbm5lbENvdW50LCByZWNvcmQtPm1DaGFubmVsQ291bnQpOwotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1JlY29yZEVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0VHlwZVN0cmluZyhyZWNvcmQtPm1Gb3JtYXQpLmNfc3RyKCkpOwotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1JlY29yZFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1NvdXJjZVN0cmluZyhyZWNvcmQtPm1BdHRyaWJ1dGVzLnNvdXJjZSkuY19zdHIoKSk7CisgICAgLy8gTm9uLUFQSSBlbnRyaWVzLCB0aGVzZSBjYW4gY2hhbmdlLgorICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggInBvcnRJZCIsIChpbnQzMl90KXJlY29yZC0+bVBvcnRJZCk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAiZnJhbWVDb3VudCIsIChpbnQzMl90KXJlY29yZC0+bUZyYW1lQ291bnQpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAiYXR0cmlidXRlcyIsIHRvU3RyaW5nKHJlY29yZC0+bUF0dHJpYnV0ZXMpLmNfc3RyKCkpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChNTV9QUkVGSVggImNoYW5uZWxNYXNrIiwgKGludDY0X3QpcmVjb3JkLT5tQ2hhbm5lbE1hc2spOwogCi0gICAgLy8gbG9nIHRvdGFsIGR1cmF0aW9uIHJlY29yZGluZywgaW5jbHVkaW5nIGFueXRoaW5nIGN1cnJlbnRseSBydW5uaW5nIFthbmQgY291bnRdLgotICAgIG5zZWNzX3QgYWN0aXZlID0gMDsKKyAgICAvLyBsb2cgdG90YWwgZHVyYXRpb24gcmVjb3JkaW5nLCBpbmNsdWRpbmcgYW55dGhpbmcgY3VycmVudGx5IHJ1bm5pbmcuCisgICAgaW50NjRfdCBhY3RpdmVOcyA9IDA7CiAgICAgaWYgKG1TdGFydGVkTnMgIT0gMCkgewotICAgICAgICBhY3RpdmUgPSBzeXN0ZW1UaW1lKCkgLSBtU3RhcnRlZE5zOworICAgICAgICBhY3RpdmVOcyA9IHN5c3RlbVRpbWUoKSAtIG1TdGFydGVkTnM7CiAgICAgfQotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrQXVkaW9SZWNvcmREdXJhdGlvbiwgKG1EdXJhdGlvbk5zICsgYWN0aXZlKSAvICgxMDAwICogMTAwMCkpOwotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQXVkaW9SZWNvcmRDb3VudCwgbUNvdW50KTsKLQotICAgIC8vIFhYWCBJIGRvbid0IGtub3cgdGhhdCB0aGlzIGFkZHMgYSBsb3Qgb2YgdmFsdWUsIGxvbmcgdGVybQotICAgIGlmIChtQ3JlYXRlZE5zICE9IDApIHsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtBdWRpb1JlY29yZENyZWF0ZWQsIG1DcmVhdGVkTnMgLyAoMTAwMCAqIDEwMDApKTsKLSAgICB9CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggImR1cmF0aW9uTXMiLCAobUR1cmF0aW9uTnMgKyBhY3RpdmVOcykgKiAxZS02KTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoTU1fUFJFRklYICJzdGFydENvdW50IiwgKGludDY0X3QpbUNvdW50KTsKIAogICAgIGlmIChtTGFzdEVycm9yICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQXVkaW9SZWNvcmRFcnJvciwgbUxhc3RFcnJvcik7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1JlY29yZEVycm9yRnVuY3Rpb24sIG1MYXN0RXJyb3JGdW5jLmNfc3RyKCkpOworICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJsYXN0RXJyb3IuY29kZSIsIChpbnQzMl90KW1MYXN0RXJyb3IpOworICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggImxhc3RFcnJvci5hdCIsIG1MYXN0RXJyb3JGdW5jLmNfc3RyKCkpOwogICAgIH0KIH0KIApAQCAtMTUyLDcgKzExNyw5IEBACiAgICAgOiBtQWN0aXZlKGZhbHNlKSwgbVN0YXR1cyhOT19JTklUKSwgbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSksCiAgICAgICBtU2Vzc2lvbklkKEFVRElPX1NFU1NJT05fQUxMT0NBVEUpLAogICAgICAgbVByZXZpb3VzUHJpb3JpdHkoQU5EUk9JRF9QUklPUklUWV9OT1JNQUwpLCBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCksCi0gICAgICBtU2VsZWN0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwgbVJvdXRlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpCisgICAgICBtU2VsZWN0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwgbVJvdXRlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAorICAgICAgbVNlbGVjdGVkTWljRGlyZWN0aW9uKE1JQ19ESVJFQ1RJT05fVU5TUEVDSUZJRUQpLAorICAgICAgbVNlbGVjdGVkTWljRmllbGREaW1lbnNpb24oTUlDX0ZJRUxEX0RJTUVOU0lPTl9ERUZBVUxUKQogewogfQogCkBAIC0xNzIsNyArMTM5LDkgQEAKICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsCi0gICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCkKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAorICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IHNlbGVjdGVkTWljRGlyZWN0aW9uLAorICAgICAgICBmbG9hdCBtaWNyb3Bob25lRmllbGREaW1lbnNpb24pCiAgICAgOiBtQWN0aXZlKGZhbHNlKSwKICAgICAgIG1TdGF0dXMoTk9fSU5JVCksCiAgICAgICBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwKQEAgLTE4Myw3ICsxNTIsOCBAQAogewogICAgICh2b2lkKXNldChpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgY2JmLCB1c2VyLAogICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBmbGFncywKLSAgICAgICAgICAgIHVpZCwgcGlkLCBwQXR0cmlidXRlcywgc2VsZWN0ZWREZXZpY2VJZCk7CisgICAgICAgICAgICB1aWQsIHBpZCwgcEF0dHJpYnV0ZXMsIHNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICBzZWxlY3RlZE1pY0RpcmVjdGlvbiwgbWljcm9waG9uZUZpZWxkRGltZW5zaW9uKTsKIH0KIAogQXVkaW9SZWNvcmQ6On5BdWRpb1JlY29yZCgpCkBAIC0yMTAsOCArMTgwLDggQEAKICAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKICAgICAgICAgbUJ1ZmZlck1lbW9yeS5jbGVhcigpOwogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgICAgIEFMT0dWKCJ+QXVkaW9SZWNvcmQsIHJlbGVhc2luZyBzZXNzaW9uIGlkICVkIiwKLSAgICAgICAgICAgICAgICBtU2Vzc2lvbklkKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogcmVsZWFzaW5nIHNlc3Npb24gaWQgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtU2Vzc2lvbklkKTsKICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkLCAtMSAvKnBpZCovKTsKICAgICB9CiB9CkBAIC0yMzIsMjAgKzIwMiwyNiBAQAogICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKLSAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkKQorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3Qgc2VsZWN0ZWRNaWNEaXJlY3Rpb24sCisgICAgICAgIGZsb2F0IG1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbikKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQ7CiAgICAgcGlkX3QgY2FsbGluZ1BpZDsKICAgICBwaWRfdCBteVBpZDsKIAotICAgIEFMT0dWKCJzZXQoKTogaW5wdXRTb3VyY2UgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKKyAgICAvLyBOb3RlIG1Qb3J0SWQgaXMgbm90IHZhbGlkIHVudGlsIHRoZSB0cmFjayBpcyBjcmVhdGVkLCBzbyBvbWl0IG1Qb3J0SWQgaW4gQUxPRyBmb3Igc2V0LgorICAgIEFMT0dWKCIlcygpOiBpbnB1dFNvdXJjZSAlZCwgc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV6dSwgIgogICAgICAgICAgICJub3RpZmljYXRpb25GcmFtZXMgJXUsIHNlc3Npb25JZCAlZCwgdHJhbnNmZXJUeXBlICVkLCBmbGFncyAlI3gsIG9wUGFja2FnZU5hbWUgJXMgIgogICAgICAgICAgICJ1aWQgJWQsIHBpZCAlZCIsCisgICAgICAgICAgX19mdW5jX18sCiAgICAgICAgICAgaW5wdXRTb3VyY2UsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgZmxhZ3MsIFN0cmluZzgobU9wUGFja2FnZU5hbWUpLnN0cmluZygpLCB1aWQsIHBpZCk7CiAKICAgICBtU2VsZWN0ZWREZXZpY2VJZCA9IHNlbGVjdGVkRGV2aWNlSWQ7CisgICAgbVNlbGVjdGVkTWljRGlyZWN0aW9uID0gc2VsZWN0ZWRNaWNEaXJlY3Rpb247CisgICAgbVNlbGVjdGVkTWljRmllbGREaW1lbnNpb24gPSBtaWNyb3Bob25lRmllbGREaW1lbnNpb247CiAKICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewogICAgIGNhc2UgVFJBTlNGRVJfREVGQVVMVDoKQEAgLTI1Nyw3ICsyMzMsNyBAQAogICAgICAgICBicmVhazsKICAgICBjYXNlIFRSQU5TRkVSX0NBTExCQUNLOgogICAgICAgICBpZiAoY2JmID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX0NBTExCQUNLIGJ1dCBjYmYgPT0gTlVMTCIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IFRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfQ0FMTEJBQ0sgYnV0IGNiZiA9PSBOVUxMIiwgX19mdW5jX18pOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CkBAIC0yNjYsNyArMjQyLDcgQEAKICAgICBjYXNlIFRSQU5TRkVSX1NZTkM6CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIHRyYW5zZmVyIHR5cGUgJWQiLCB0cmFuc2ZlclR5cGUpOworICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwgX19mdW5jX18sIHRyYW5zZmVyVHlwZSk7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTI3NCw3ICsyNTAsNyBAQAogCiAgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvUmVjb3JkICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1JlY29yZCAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJUcmFjayBhbHJlYWR5IGluIHVzZSIpOworICAgICAgICBBTE9HRSgiJXMoKTogVHJhY2sgYWxyZWFkeSBpbiB1c2UiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtMjg1LDggKzI2MSw4IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gc3RyZWFtIHR5cGUgc2hvdWxkbid0IGJlIGxvb2tlZCBhdCwgdGhpcyB0cmFjayBoYXMgYXVkaW8gYXR0cmlidXRlcwogICAgICAgICBtZW1jcHkoJm1BdHRyaWJ1dGVzLCBwQXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICBBTE9HVigiQnVpbGRpbmcgQXVkaW9SZWNvcmQgd2l0aCBhdHRyaWJ1dGVzOiBzb3VyY2U9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAotICAgICAgICAgICAgICBtQXR0cmlidXRlcy5zb3VyY2UsIG1BdHRyaWJ1dGVzLmZsYWdzLCBtQXR0cmlidXRlcy50YWdzKTsKKyAgICAgICAgQUxPR1YoIiVzKCk6IEJ1aWxkaW5nIEF1ZGlvUmVjb3JkIHdpdGggYXR0cmlidXRlczogc291cmNlPSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUF0dHJpYnV0ZXMuc291cmNlLCBtQXR0cmlidXRlcy5mbGFncywgbUF0dHJpYnV0ZXMudGFncyk7CiAgICAgfQogCiAgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOwpAQCAtMjk5LDE0ICsyNzUsMTQgQEAKICAgICAvLyB2YWxpZGF0ZSBwYXJhbWV0ZXJzCiAgICAgLy8gQXVkaW9GbGluZ2VyIGNhcHR1cmUgb25seSBzdXBwb3J0cyBsaW5lYXIgUENNCiAgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSB8fCAhYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7Ci0gICAgICAgIEFMT0dFKCJGb3JtYXQgJSN4IGlzIG5vdCBsaW5lYXIgcGNtIiwgZm9ybWF0KTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEZvcm1hdCAlI3ggaXMgbm90IGxpbmVhciBwY20iLCBfX2Z1bmNfXywgZm9ybWF0KTsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CiAKICAgICBpZiAoIWF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBjaGFubmVsTWFzayk7CisgICAgICAgIEFMT0dFKCIlcygpOiBJbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBfX2Z1bmNfXywgY2hhbm5lbE1hc2spOwogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC0zMjcsNyArMzAzLDcgQEAKICAgICAvLyBtTm90aWZpY2F0aW9uRnJhbWVzQWN0IGlzIGluaXRpYWxpemVkIGluIGNyZWF0ZVJlY29yZF9sCiAKICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwotICAgIEFMT0dWKCJzZXQoKTogbVNlc3Npb25JZCAlZCIsIG1TZXNzaW9uSWQpOworICAgIEFMT0dWKCIlcygpOiBtU2Vzc2lvbklkICVkIiwgX19mdW5jX18sIG1TZXNzaW9uSWQpOwogCiAgICAgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICBteVBpZCA9IGdldHBpZCgpOwpAQCAtMzQ2LDEzICszMjIsMTggQEAKICAgICBtQ2JmID0gY2JmOwogCiAgICAgaWYgKGNiZiAhPSBOVUxMKSB7Ci0gICAgICAgIG1BdWRpb1JlY29yZFRocmVhZCA9IG5ldyBBdWRpb1JlY29yZFRocmVhZCgqdGhpcywgdGhyZWFkQ2FuQ2FsbEphdmEpOworICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQgPSBuZXcgQXVkaW9SZWNvcmRUaHJlYWQoKnRoaXMpOwogICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnJ1bigiQXVkaW9SZWNvcmQiLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKICAgICAgICAgLy8gdGhyZWFkIGJlZ2lucyBpbiBwYXVzZWQgc3RhdGUsIGFuZCB3aWxsIG5vdCByZWZlcmVuY2UgdXMgdW50aWwgc3RhcnQoKQogICAgIH0KIAogICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvUmVjb3JkCi0gICAgc3RhdHVzID0gY3JlYXRlUmVjb3JkX2woMCAvKmVwb2NoKi8sIG1PcFBhY2thZ2VOYW1lKTsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgc3RhdHVzID0gY3JlYXRlUmVjb3JkX2woMCAvKmVwb2NoKi8sIG1PcFBhY2thZ2VOYW1lKTsKKyAgICB9CisKKyAgICBBTE9HVigiJXMoJWQpOiBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKG1BdWRpb1JlY29yZFRocmVhZCAhPSAwKSB7CkBAIC0zODksNyArMzcwLDcgQEAKIAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbikKIHsKLSAgICBBTE9HVigic3RhcnQsIHN5bmMgZXZlbnQgJWQgdHJpZ2dlciBzZXNzaW9uICVkIiwgZXZlbnQsIHRyaWdnZXJTZXNzaW9uKTsKKyAgICBBTE9HVigiJXMoJWQpOiBzeW5jIGV2ZW50ICVkIHRyaWdnZXIgc2Vzc2lvbiAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCBldmVudCwgdHJpZ2dlclNlc3Npb24pOwogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtQWN0aXZlKSB7CkBAIC00MjgsOSArNDA5LDEzIEBACiAgICAgICAgIHN0YXR1cyA9IHJlc3RvcmVSZWNvcmRfbCgic3RhcnQiKTsKICAgICB9CiAKKyAgICAvLyBDYWxsIHRoZXNlIGRpcmVjdGx5IGJlY2F1c2Ugd2UgYXJlIGFscmVhZHkgaG9sZGluZyB0aGUgbG9jay4KKyAgICBtQXVkaW9SZWNvcmQtPnNldE1pY3JvcGhvbmVEaXJlY3Rpb24obVNlbGVjdGVkTWljRGlyZWN0aW9uKTsKKyAgICBtQXVkaW9SZWNvcmQtPnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihtU2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbik7CisKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIG1BY3RpdmUgPSBmYWxzZTsKLSAgICAgICAgQUxPR0UoInN0YXJ0KCkgc3RhdHVzICVkIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogc3RhdHVzICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgc3A8QXVkaW9SZWNvcmRUaHJlYWQ+IHQgPSBtQXVkaW9SZWNvcmRUaHJlYWQ7CiAgICAgICAgIGlmICh0ICE9IDApIHsKQEAgLTQ1NCw2ICs0MzksNyBAQAogdm9pZCBBdWRpb1JlY29yZDo6c3RvcCgpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyglZCk6IG1BY3RpdmU6JWRcbiIsIF9fZnVuY19fLCBtUG9ydElkLCBtQWN0aXZlKTsKICAgICBpZiAoIW1BY3RpdmUpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTYzMiw4ICs2MTgsOCBAQAogICAgIFN0cmluZzggcmVzdWx0OwogCiAgICAgcmVzdWx0LmFwcGVuZCgiIEF1ZGlvUmVjb3JkOjpkdW1wXG4iKTsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0YXR1cyglZCksIGFjdGl2ZSglZCksIHNlc3Npb24gSWQoJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1cywgbUFjdGl2ZSwgbVNlc3Npb25JZCk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBpZCglZCkgc3RhdHVzKCVkKSwgYWN0aXZlKCVkKSwgc2Vzc2lvbiBJZCglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtUG9ydElkLCBtU3RhdHVzLCBtQWN0aXZlLCBtU2Vzc2lvbklkKTsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGZsYWdzKCUjeCksIHJlcS4gZmxhZ3MoJSN4KSwgYXVkaW8gc291cmNlKCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncywgbU9yaWdGbGFncywgbUF0dHJpYnV0ZXMuc291cmNlKTsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGZvcm1hdCglI3gpLCBjaGFubmVsIG1hc2soJSN4KSwgY2hhbm5lbCBjb3VudCgldSksIHNhbXBsZSByYXRlKCV1KVxuIiwKQEAgLTY0NCw2ICs2MzAsOCBAQAogICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QsIG1Ob3RpZmljYXRpb25GcmFtZXNSZXEpOwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgaW5wdXQoJWQpLCBsYXRlbmN5KCV1KSwgc2VsZWN0ZWQgZGV2aWNlIElkKCVkKSwgcm91dGVkIGRldmljZSBJZCglZClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXQsIG1MYXRlbmN5LCBtU2VsZWN0ZWREZXZpY2VJZCwgbVJvdXRlZERldmljZUlkKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIG1pYyBkaXJlY3Rpb24oJWQpIG1pYyBmaWVsZCBkaW1lbnNpb24oJWYpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZE1pY0RpcmVjdGlvbiwgbVNlbGVjdGVkTWljRmllbGREaW1lbnNpb24pOwogICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtNjc1LDcgKzY2Myw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogCiAgICAgaWYgKGF1ZGlvRmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTcwMiw3ICs2OTAsOCBAQAogICAgICAgICAgICAgLy8gdXNlIGNhc2UgMzogb2J0YWluL3JlbGVhc2UgbW9kZQogICAgICAgICAgICAgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9PQlRBSU4pOwogICAgICAgICBpZiAoIXVzZUNhc2VBbGxvd2VkKSB7Ci0gICAgICAgICAgICBBTE9HVygiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCwgaW5jb21wYXRpYmxlIHRyYW5zZmVyID0gJXMiLAorICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCwgaW5jb21wYXRpYmxlIHRyYW5zZmVyID0gJXMiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgICBjb252ZXJ0VHJhbnNmZXJUb1RleHQobVRyYW5zZmVyKSk7CiAgICAgICAgICAgICBtRmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH4oQVVESU9fSU5QVVRfRkxBR19GQVNUIHwKICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19SQVcpKTsKQEAgLTczNyw3ICs3MjYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvRmxpbmdlciBjb3VsZCBub3QgY3JlYXRlIHJlY29yZCB0cmFjaywgc3RhdHVzOiAlZCIsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IEF1ZGlvRmxpbmdlciBjb3VsZCBub3QgY3JlYXRlIHJlY29yZCB0cmFjaywgc3RhdHVzOiAlZCIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMpOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIEFMT0dfQVNTRVJUKHJlY29yZCAhPSAwKTsKQEAgLTc0Nyw3ICs3MzcsOCBAQAogCiAgICAgbUF3YWl0Qm9vc3QgPSBmYWxzZTsKICAgICBpZiAob3V0cHV0LmZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSB7Ci0gICAgICAgIEFMT0dJKCJBVURJT19JTlBVVF9GTEFHX0ZBU1Qgc3VjY2Vzc2Z1bDsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwKKyAgICAgICAgQUxPR0koIiVzKCVkKTogQVVESU9fSU5QVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICBtUmVxRnJhbWVDb3VudCwgb3V0cHV0LmZyYW1lQ291bnQpOwogICAgICAgICBtQXdhaXRCb29zdCA9IHRydWU7CiAgICAgfQpAQCAtNzU3LDEzICs3NDgsMTMgQEAKICAgICBtU2FtcGxlUmF0ZSA9IG91dHB1dC5zYW1wbGVSYXRlOwogCiAgICAgaWYgKG91dHB1dC5jYmxrID09IDApIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAgICAgaU1lbVBvaW50ZXIgPSBvdXRwdXQuY2JsayAtPnBvaW50ZXIoKTsKICAgICBpZiAoaU1lbVBvaW50ZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIHBvaW50ZXIiKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIHBvaW50ZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC03NzgsNyArNzY5LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBidWZmZXJzID0gb3V0cHV0LmJ1ZmZlcnMtPnBvaW50ZXIoKTsKICAgICAgICAgaWYgKGJ1ZmZlcnMgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgYnVmZmVyIHBvaW50ZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CkBAIC03OTIsMTkgKzc4MywyMiBAQAogICAgIG1BdWRpb1JlY29yZCA9IHJlY29yZDsKICAgICBtQ2Jsa01lbW9yeSA9IG91dHB1dC5jYmxrOwogICAgIG1CdWZmZXJNZW1vcnkgPSBvdXRwdXQuYnVmZmVyczsKKyAgICBtUG9ydElkID0gb3V0cHV0LnBvcnRJZDsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiAKICAgICBtQ2JsayA9IGNibGs7CiAgICAgLy8gbm90ZSB0aGF0IG91dHB1dC5mcmFtZUNvdW50IGlzIHRoZSAocG9zc2libHkgcmV2aXNlZCkgdmFsdWUgb2YgbVJlcUZyYW1lQ291bnQKICAgICBpZiAob3V0cHV0LmZyYW1lQ291bnQgPCBtUmVxRnJhbWVDb3VudCB8fCAobVJlcUZyYW1lQ291bnQgPT0gMCAmJiBvdXRwdXQuZnJhbWVDb3VudCA9PSAwKSkgewotICAgICAgICBBTE9HVygiUmVxdWVzdGVkIGZyYW1lQ291bnQgJXp1IGJ1dCByZWNlaXZlZCBmcmFtZUNvdW50ICV6dSIsCisgICAgICAgIEFMT0dXKCIlcyglZCk6IFJlcXVlc3RlZCBmcmFtZUNvdW50ICV6dSBidXQgcmVjZWl2ZWQgZnJhbWVDb3VudCAlenUiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgbVJlcUZyYW1lQ291bnQsICBvdXRwdXQuZnJhbWVDb3VudCk7CiAgICAgfQogCiAgICAgLy8gTWFrZSBzdXJlIHRoYXQgYXBwbGljYXRpb24gaXMgbm90aWZpZWQgd2l0aCBzdWZmaWNpZW50IG1hcmdpbiBiZWZvcmUgb3ZlcnJ1bi4KICAgICAvLyBUaGUgY29tcHV0YXRpb24gaXMgZG9uZSBvbiBzZXJ2ZXIgc2lkZS4KICAgICBpZiAobU5vdGlmaWNhdGlvbkZyYW1lc1JlcSA+IDAgJiYgb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQgIT0gbU5vdGlmaWNhdGlvbkZyYW1lc1JlcSkgewotICAgICAgICBBTE9HVygiU2VydmVyIGFkanVzdGVkIG5vdGlmaWNhdGlvbkZyYW1lcyBmcm9tICV1IHRvICV6dSBmb3IgZnJhbWVDb3VudCAlenUiLAorICAgICAgICBBTE9HVygiJXMoJWQpOiBTZXJ2ZXIgYWRqdXN0ZWQgbm90aWZpY2F0aW9uRnJhbWVzIGZyb20gJXUgdG8gJXp1IGZvciBmcmFtZUNvdW50ICV6dSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc1JlcSwgb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQsIG91dHB1dC5mcmFtZUNvdW50KTsKICAgICB9CiAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9ICh1aW50MzJfdClvdXRwdXQubm90aWZpY2F0aW9uRnJhbWVDb3VudDsKQEAgLTg3Miw3ICs4NjYsNyBAQAogICAgICAgICB0aW1lb3V0LnR2X25zZWMgPSAobG9uZykgKG1zICUgMTAwMCkgKiAxMDAwMDAwOwogICAgICAgICByZXF1ZXN0ZWQgPSAmdGltZW91dDsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCB3YWl0Q291bnQgJWQiLCBfX2Z1bmNfXywgd2FpdENvdW50KTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogaW52YWxpZCB3YWl0Q291bnQgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgd2FpdENvdW50KTsKICAgICAgICAgcmVxdWVzdGVkID0gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIG9idGFpbkJ1ZmZlcihhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMIC8qZWxhcHNlZCovLCBub25Db250aWcpOwpAQCAtOTgxLDcgKzk3NSw4IEBACiAgICAgaWYgKHNzaXplX3QodXNlclNpemUpIDwgMCB8fCAoYnVmZmVyID09IE5VTEwgJiYgdXNlclNpemUgIT0gMCkpIHsKICAgICAgICAgLy8gc2FuaXR5LWNoZWNrLiB1c2VyIGlzIG1vc3QtbGlrZWx5IHBhc3NpbmcgYW4gZXJyb3IgY29kZSwgYW5kIGl0IHdvdWxkCiAgICAgICAgIC8vIG1ha2UgdGhlIHJldHVybiB2YWx1ZSBhbWJpZ3VvdXMgKGFjdHVhbFNpemUgdnMgZXJyb3IpLgotICAgICAgICBBTE9HRSgiQXVkaW9SZWNvcmQ6OnJlYWQoYnVmZmVyPSVwLCBzaXplPSV6dSAoJXp1KSIsIGJ1ZmZlciwgdXNlclNpemUsIHVzZXJTaXplKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKSAoYnVmZmVyPSVwLCBzaXplPSV6dSAoJXp1KSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIGJ1ZmZlciwgdXNlclNpemUsIHVzZXJTaXplKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTEwMzgsNyArMTAzMyw3IEBACiAgICAgICAgICAgICBwb2xsVXMgPDw9IDE7CiAgICAgICAgIH0gd2hpbGUgKHRyeUNvdW50ZXItLSA+IDApOwogICAgICAgICBpZiAodHJ5Q291bnRlciA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJkaWQgbm90IHJlY2VpdmUgZXhwZWN0ZWQgcHJpb3JpdHkgYm9vc3Qgb24gdGltZSIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogZGlkIG5vdCByZWNlaXZlIGV4cGVjdGVkIHByaW9yaXR5IGJvb3N0IG9uIHRpbWUiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gUnVuIGFnYWluIGltbWVkaWF0ZWx5CiAgICAgICAgIHJldHVybiAwOwpAQCAtMTE2MSw3ICsxMTU2LDggQEAKICAgICBpZiAobnMgIT0gTlNfV0hFTkVWRVIpIHsKICAgICAgICAgdGltZW91dC50dl9zZWMgPSBucyAvIDEwMDAwMDAwMDBMTDsKICAgICAgICAgdGltZW91dC50dl9uc2VjID0gbnMgJSAxMDAwMDAwMDAwTEw7Ci0gICAgICAgIEFMT0dWKCJ0aW1lb3V0ICVsZC4lMDNkIiwgdGltZW91dC50dl9zZWMsIChpbnQpIHRpbWVvdXQudHZfbnNlYyAvIDEwMDAwMDApOworICAgICAgICBBTE9HVigiJXMoJWQpOiB0aW1lb3V0ICVsZC4lMDNkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgdGltZW91dC50dl9zZWMsIChpbnQpIHRpbWVvdXQudHZfbnNlYyAvIDEwMDAwMDApOwogICAgICAgICByZXF1ZXN0ZWQgPSAmdGltZW91dDsKICAgICB9CiAKQEAgLTExNzMsMTYgKzExNjksMTggQEAKICAgICAgICAgc2l6ZV90IG5vbkNvbnRpZzsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gb2J0YWluQnVmZmVyKCZhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMLCAmbm9uQ29udGlnKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigoZXJyICE9IE5PX0VSUk9SKSAhPSAoYXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSwKLSAgICAgICAgICAgICAgICAib2J0YWluQnVmZmVyKCkgZXJyPSVkIGZyYW1lQ291bnQ9JXp1IiwgZXJyLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiBvYnRhaW5CdWZmZXIoKSBlcnI9JWQgZnJhbWVDb3VudD0lenUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICByZXF1ZXN0ZWQgPSAmQ2xpZW50UHJveHk6OmtOb25CbG9ja2luZzsKICAgICAgICAgc2l6ZV90IGF2YWlsID0gYXVkaW9CdWZmZXIuZnJhbWVDb3VudCArIG5vbkNvbnRpZzsKLSAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXp1ID0gJXp1ICsgJXp1IGVyciAlZCIsCi0gICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogb2J0YWluQnVmZmVyKCV1KSByZXR1cm5lZCAlenUgPSAlenUgKyAlenUgZXJyICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKGVyciA9PSBUSU1FRF9PVVQgfHwgZXJyID09IFdPVUxEX0JMT0NLIHx8IGVyciA9PSAtRUlOVFIpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dFKCJFcnJvciAlZCBvYnRhaW5pbmcgYW4gYXVkaW8gYnVmZmVyLCBnaXZpbmcgdXAuIiwgZXJyKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IEVycm9yICVkIG9idGFpbmluZyBhbiBhdWRpbyBidWZmZXIsIGdpdmluZyB1cC4iLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgZXJyKTsKICAgICAgICAgICAgIHJldHVybiBOU19ORVZFUjsKICAgICAgICAgfQogCkBAIC0xMjA0LDggKzEyMDIsOCBAQAogCiAgICAgICAgIC8vIFNhbml0eSBjaGVjayBvbiByZXR1cm5lZCBzaXplCiAgICAgICAgIGlmIChzc2l6ZV90KHJlYWRTaXplKSA8IDAgfHwgcmVhZFNpemUgPiByZXFTaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgIHJlcVNpemUsIHNzaXplX3QocmVhZFNpemUpKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6ICBFVkVOVF9NT1JFX0RBVEEgcmVxdWVzdGVkICV6dSBieXRlcyBidXQgY2FsbGJhY2sgcmV0dXJuZWQgJXpkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHJlcVNpemUsIHNzaXplX3QocmVhZFNpemUpKTsKICAgICAgICAgICAgIHJldHVybiBOU19ORVZFUjsKICAgICAgICAgfQogCkBAIC0xMjY1LDcgKzEyNjMsNyBAQAogCiBzdGF0dXNfdCBBdWRpb1JlY29yZDo6cmVzdG9yZVJlY29yZF9sKGNvbnN0IGNoYXIgKmZyb20pCiB7Ci0gICAgQUxPR1coImRlYWQgSUF1ZGlvUmVjb3JkLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcygpIiwgZnJvbSk7CisgICAgQUxPR1coIiVzKCVkKTogZGVhZCBJQXVkaW9SZWNvcmQsIGNyZWF0aW5nIGEgbmV3IG9uZSBmcm9tICVzKCkiLCBfX2Z1bmNfXywgbVBvcnRJZCwgZnJvbSk7CiAgICAgKyttU2VxdWVuY2U7CiAKICAgICBjb25zdCBpbnQgSU5JVElBTF9SRVRSSUVTID0gMzsKQEAgLTEyODUsMTAgKzEyODMsNyBAQAogICAgIG1OZXdQb3NpdGlvbiA9IHBvc2l0aW9uICsgbVVwZGF0ZVBlcmlvZDsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjcmVhdGVSZWNvcmRfbChwb3NpdGlvbiwgbU9wUGFja2FnZU5hbWUpOwogCi0gICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygiJXMoKTogY3JlYXRlUmVjb3JkX2wgZmFpbGVkLCBkbyBub3QgcmV0cnkiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHJpZXMgPSAwOwotICAgIH0gZWxzZSB7CisgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewogICAgICAgICBpZiAobUFjdGl2ZSkgewogICAgICAgICAgICAgLy8gY2FsbGJhY2sgdGhyZWFkIG9yIHN5bmMgZXZlbnQgaGFzbid0IGNoYW5nZWQKICAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgZmFpbHMgaWYgd2UgaGF2ZSBhIG5ldyBBdWRpb0ZsaW5nZXIgaW5zdGFuY2UKQEAgLTEyOTksMTUgKzEyOTQsMTcgQEAKICAgICB9CiAKICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCIlcygpIGZhaWxlZCBzdGF0dXMgJWQsIHJldHJpZXMgJWQiLCBfX2Z1bmNfXywgcmVzdWx0LCByZXRyaWVzKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogZmFpbGVkIHN0YXR1cyAlZCwgcmV0cmllcyAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCByZXN1bHQsIHJldHJpZXMpOwogICAgICAgICBpZiAoLS1yZXRyaWVzID4gMCkgeworICAgICAgICAgICAgLy8gbGVhdmUgdGltZSBmb3IgYW4gZXZlbnR1YWwgcmFjZSBjb25kaXRpb24gdG8gY2xlYXIgYmVmb3JlIHJldHJ5aW5nCisgICAgICAgICAgICB1c2xlZXAoNTAwMDAwKTsKICAgICAgICAgICAgIGdvdG8gcmV0cnk7CiAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCJyZXN0b3JlUmVjb3JkX2woKSBmYWlsZWQgc3RhdHVzICVkIiwgcmVzdWx0KTsKLSAgICAgICAgbUFjdGl2ZSA9IGZhbHNlOworICAgICAgICAvLyBpZiBubyByZXRyaWVzIGxlZnQsIHNldCBpbnZhbGlkIGJpdCB0byBmb3JjZSByZXN0b3JpbmcgYXQgbmV4dCBvY2Nhc2lvbgorICAgICAgICAvLyBhbmQgYXZvaWQgaW5jb25zaXN0ZW50IGFjdGl2ZSBzdGF0ZSBvbiBjbGllbnQgYW5kIHNlcnZlciBzaWRlcworICAgICAgICBpZiAobUNibGsgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlZBTElELCAmbUNibGstPm1GbGFncyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMTMxNiwxOCArMTMxMywxOCBAQAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaykKIHsKICAgICBpZiAoY2FsbGJhY2sgPT0gMCkgewotICAgICAgICBBTE9HVygiJXMgYWRkaW5nIE5VTEwgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogYWRkaW5nIE5VTEwgY2FsbGJhY2shIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgaWYgKG1EZXZpY2VDYWxsYmFjay51bnNhZmVfZ2V0KCkgPT0gY2FsbGJhY2suZ2V0KCkpIHsKLSAgICAgICAgQUxPR1coIiVzIGFkZGluZyBzYW1lIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGFkZGluZyBzYW1lIGNhbGxiYWNrISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICBpZiAobUlucHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICAgICAgQUxPR1coIiVzIGNhbGxiYWNrIGFscmVhZHkgcHJlc2VudCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogY2FsbGJhY2sgYWxyZWFkeSBwcmVzZW50ISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1JbnB1dCk7CiAgICAgICAgIH0KICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbUlucHV0KTsKQEAgLTEzNDAsMTIgKzEzMzcsMTIgQEAKICAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaykKIHsKICAgICBpZiAoY2FsbGJhY2sgPT0gMCkgewotICAgICAgICBBTE9HVygiJXMgcmVtb3ZpbmcgTlVMTCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HVygiJXMoJWQpOiByZW1vdmluZyBOVUxMIGNhbGxiYWNrISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sudW5zYWZlX2dldCgpICE9IGNhbGxiYWNrLmdldCgpKSB7Ci0gICAgICAgIEFMT0dXKCIlcyByZW1vdmluZyBkaWZmZXJlbnQgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogcmVtb3ZpbmcgZGlmZmVyZW50IGNhbGxiYWNrISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBtRGV2aWNlQ2FsbGJhY2suY2xlYXIoKTsKQEAgLTEzODQsNiArMTM4MSwzOSBAQAogICAgIHJldHVybiBtQXVkaW9SZWNvcmQtPmdldEFjdGl2ZU1pY3JvcGhvbmVzKGFjdGl2ZU1pY3JvcGhvbmVzKS50cmFuc2FjdGlvbkVycm9yKCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvUmVjb3JkOjpzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKQoreworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVNlbGVjdGVkTWljRGlyZWN0aW9uID09IGRpcmVjdGlvbikgeworICAgICAgICAvLyBOT1AKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIG1TZWxlY3RlZE1pY0RpcmVjdGlvbiA9IGRpcmVjdGlvbjsKKyAgICBpZiAobUF1ZGlvUmVjb3JkID09IDApIHsKKyAgICAgICAgLy8gdGhlIGludGVybmFsIEF1ZGlvUmVjb3JkIGhhc24ndCBiZSBjcmVhdGVkIHlldCwgc28ganVzdCBzdGFzaCB0aGUgYXR0cmlidXRlLgorICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb1JlY29yZC0+c2V0TWljcm9waG9uZURpcmVjdGlvbihkaXJlY3Rpb24pLnRyYW5zYWN0aW9uRXJyb3IoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUmVjb3JkOjpzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgeworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVNlbGVjdGVkTWljRmllbGREaW1lbnNpb24gPT0gem9vbSkgeworICAgICAgICAvLyBOT1AKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIG1TZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uID0gem9vbTsKKyAgICBpZiAobUF1ZGlvUmVjb3JkID09IDApIHsKKyAgICAgICAgLy8gdGhlIGludGVybmFsIEF1ZGlvUmVjb3JkIGhhc24ndCBiZSBjcmVhdGVkIHlldCwgc28ganVzdCBzdGFzaCB0aGUgYXR0cmlidXRlLgorICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb1JlY29yZC0+c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKHpvb20pLnRyYW5zYWN0aW9uRXJyb3IoKTsKKyAgICB9Cit9CisKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogdm9pZCBBdWRpb1JlY29yZDo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQpAQCAtMTM5Nyw4ICsxNDI3LDkgQEAKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1BdWRpb1JlY29yZDo6QXVkaW9SZWNvcmRUaHJlYWQ6OkF1ZGlvUmVjb3JkVGhyZWFkKEF1ZGlvUmVjb3JkJiByZWNlaXZlciwgYm9vbCBiQ2FuQ2FsbEphdmEpCi0gICAgOiBUaHJlYWQoYkNhbkNhbGxKYXZhKSwgbVJlY2VpdmVyKHJlY2VpdmVyKSwgbVBhdXNlZCh0cnVlKSwgbVBhdXNlZEludChmYWxzZSksIG1QYXVzZWROcygwTEwpLAorQXVkaW9SZWNvcmQ6OkF1ZGlvUmVjb3JkVGhyZWFkOjpBdWRpb1JlY29yZFRocmVhZChBdWRpb1JlY29yZCYgcmVjZWl2ZXIpCisgICAgOiBUaHJlYWQodHJ1ZSAvKiBiQ2FuQ2FsbEphdmEgKi8pICAvLyBiaW5kZXIgcmVjdXJzaW9uIG9uIHJlc3RvcmVSZWNvcmRfbCgpIG1heSBjYWxsIEphdmEuCisgICAgLCBtUmVjZWl2ZXIocmVjZWl2ZXIpLCBtUGF1c2VkKHRydWUpLCBtUGF1c2VkSW50KGZhbHNlKSwgbVBhdXNlZE5zKDBMTCksCiAgICAgICBtSWdub3JlTmV4dFBhdXNlZEludChmYWxzZSkKIHsKIH0KQEAgLTE0NTAsNyArMTQ4MSw3IEBACiAgICAgICAgIG5zID0gSU5UNjRfTUFYOwogICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgInByb2Nlc3NBdWRpb0J1ZmZlcigpIHJldHVybmVkICUiIFBSSWQ2NCwgbnMpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgIiVzKCkgcmV0dXJuZWQgJWxsZCIsIF9fZnVuY19fLCAobG9uZyBsb25nKW5zKTsKICAgICAgICAgcGF1c2VJbnRlcm5hbChucyk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAppbmRleCBjMDcyOTAxLi4wY2UyNTEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KQEAgLTUyMSwxMCArNTIyLDEyIEBACiAgICAgaWYgKGlvRGVzYyA9PSAwIHx8IGlvRGVzYy0+bUlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSByZXR1cm47CiAKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICBWZWN0b3IgPCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiA+IGNhbGxiYWNrczsKLQorICAgIFZlY3RvcjxzcDxBdWRpb0RldmljZUNhbGxiYWNrPj4gY2FsbGJhY2tzVG9DYWxsOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgYm9vbCBkZXZpY2VWYWxpZE9yQ2hhbmdlZCA9IGZhbHNlOworICAgICAgICBib29sIHNlbmRDYWxsYmFja3MgPSBmYWxzZTsKKyAgICAgICAgc3NpemVfdCBpb0luZGV4ID0gLTE7CiAKICAgICAgICAgc3dpdGNoIChldmVudCkgewogICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9PUEVORUQ6CkBAIC01NDIsMTEgKzU0NSwxNyBAQAogICAgICAgICAgICAgaWYgKGlvRGVzYy0+Z2V0RGV2aWNlSWQoKSAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBpb0Rlc2MtPmdldERldmljZUlkKCk7CiAgICAgICAgICAgICAgICAgaWYgKGV2ZW50ID09IEFVRElPX09VVFBVVF9PUEVORUQgfHwgZXZlbnQgPT0gQVVESU9fSU5QVVRfT1BFTkVEKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW9JbmRleCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5pbmRleE9mS2V5KGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgaW9JbmRleCA9IG1BdWRpb0RldmljZUNhbGxiYWNrUHJveGllcy5pbmRleE9mS2V5KGlvRGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGlvSW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnZhbHVlQXQoaW9JbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kQ2FsbGJhY2tzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVZhbGlkT3JDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gQVVESU9fT1VUUFVUX1JFR0lTVEVSRUQgfHwgZXZlbnQgPT0gQVVESU9fSU5QVVRfUkVHSVNURVJFRCkgeworICAgICAgICAgICAgICAgICAgICBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzLmluZGV4T2ZLZXkoaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBzZW5kQ2FsbGJhY2tzID0gKGlvSW5kZXggPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhbUF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzLnZhbHVlQXQoaW9JbmRleCkubm90aWZpZWRPbmNlKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG5ldyAlcyAlcyAlZCBzYW1wbGluZ1JhdGUgJXUsIGZvcm1hdCAlI3ggY2hhbm5lbCBtYXNrICUjeCAiCiAgICAgICAgICAgICAgICAgICAgICJmcmFtZUNvdW50ICV6dSBkZXZpY2VJZCAlZCIsCkBAIC01NjgsNyArNTc3LDcgQEAKICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9DTE9TRUQgPyAib3V0cHV0IiA6ICJpbnB1dCIsIGlvRGVzYy0+bUlvSGFuZGxlKTsKIAogICAgICAgICAgICAgbUlvRGVzY3JpcHRvcnMucmVtb3ZlSXRlbShpb0Rlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja3MucmVtb3ZlSXRlbShpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMucmVtb3ZlSXRlbShpb0Rlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEOgpAQCAtNTgzLDExICs1OTIsMTAgQEAKICAgICAgICAgICAgIG1Jb0Rlc2NyaXB0b3JzLnJlcGxhY2VWYWx1ZUZvcihpb0Rlc2MtPm1Jb0hhbmRsZSwgaW9EZXNjKTsKIAogICAgICAgICAgICAgaWYgKGRldmljZUlkICE9IGlvRGVzYy0+Z2V0RGV2aWNlSWQoKSkgeworICAgICAgICAgICAgICAgIGRldmljZVZhbGlkT3JDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBkZXZpY2VJZCA9IGlvRGVzYy0+Z2V0RGV2aWNlSWQoKTsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IGlvSW5kZXggPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuaW5kZXhPZktleShpb0Rlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlvSW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MudmFsdWVBdChpb0luZGV4KTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW9JbmRleCA9IG1BdWRpb0RldmljZUNhbGxiYWNrUHJveGllcy5pbmRleE9mS2V5KGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBzZW5kQ2FsbGJhY2tzID0gaW9JbmRleCA+PSAwOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG5ldyBjb25maWcgZm9yICVzICVkIHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCAiCiAgICAgICAgICAgICAgICAgICAgICJjaGFubmVsIG1hc2sgJSN4IGZyYW1lQ291bnQgJXp1IGZyYW1lQ291bnRIQUwgJXp1IGRldmljZUlkICVkIiwKQEAgLTU5OCwyNCArNjA2LDM0IEBACiAKICAgICAgICAgfSBicmVhazsKICAgICAgICAgfQotICAgIH0KLSAgICBib29sIGNhbGxiYWNrUmVtb3ZlZCA9IGZhbHNlOwotICAgIC8vIGNhbGxiYWNrcy5zaXplKCkgIT0gMCA9PiAgaW9EZXNjLT5tSW9IYW5kbGUgYW5kIGRldmljZUlkIGFyZSB2YWxpZAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgKSB7Ci0gICAgICAgIHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gY2FsbGJhY2tzW2ldLnByb21vdGUoKTsKLSAgICAgICAgaWYgKGNhbGxiYWNrLmdldCgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbkF1ZGlvRGV2aWNlVXBkYXRlKGlvRGVzYy0+bUlvSGFuZGxlLCBkZXZpY2VJZCk7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjYWxsYmFja3MucmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICBjYWxsYmFja1JlbW92ZWQgPSB0cnVlOworCisgICAgICAgIC8vIHNlbmRDYWxsYmFja3MgdHJ1ZSA9PiAgaW9EZXNjLT5tSW9IYW5kbGUgYW5kIGRldmljZUlkIGFyZSB2YWxpZAorICAgICAgICBpZiAoc2VuZENhbGxiYWNrcykgeworICAgICAgICAgICAgQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMgJmNhbGxiYWNrUHJveGllcyA9CisgICAgICAgICAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzLmVkaXRWYWx1ZUF0KGlvSW5kZXgpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYWxsYmFja1Byb3hpZXMuc2l6ZSgpOyApIHsKKyAgICAgICAgICAgICAgICBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiBjYWxsYmFjayA9IGNhbGxiYWNrUHJveGllc1tpXS0+Y2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2suZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAvLyBDYWxsIHRoZSBjYWxsYmFjayBvbmx5IGlmIHRoZSBkZXZpY2UgYWN0dWFsbHkgY2hhbmdlZCwgdGhlIGlucHV0IG9yIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAvLyB3YXMgb3BlbmVkIG9yIGNsb3NlZCBvciB0aGUgY2xpZW50IHdhcyBuZXdseSByZWdpc3RlcmVkIGFuZCB0aGUgY2FsbGJhY2sKKyAgICAgICAgICAgICAgICAgICAgLy8gd2FzIG5ldmVyIGNhbGxlZAorICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbGxiYWNrUHJveGllc1tpXS0+bm90aWZpZWRPbmNlKCkgfHwgZGV2aWNlVmFsaWRPckNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrc1RvQ2FsbC5hZGQoY2FsbGJhY2spOworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tQcm94aWVzW2ldLT5zZXROb3RpZmllZE9uY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tQcm94aWVzLnJlbW92ZUF0KGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhbGxiYWNrUHJveGllcy5zZXROb3RpZmllZE9uY2UoKTsKICAgICAgICAgfQogICAgIH0KLSAgICAvLyBjbGVhbiB1cCBjYWxsYmFjayBsaXN0IHdoaWxlIHdlIGFyZSBoZXJlIGlmIHNvbWUgY2xpZW50cyBoYXZlIGRpc2FwcGVhcmVkIHdpdGhvdXQKLSAgICAvLyB1bnJlZ2lzdGVyaW5nIHRoZWlyIGNhbGxiYWNrCi0gICAgaWYgKGNhbGxiYWNrUmVtb3ZlZCkgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja3MucmVwbGFjZVZhbHVlRm9yKGlvRGVzYy0+bUlvSGFuZGxlLCBjYWxsYmFja3MpOworCisgICAgLy8gQ2FsbGJhY2tzIG11c3QgYmUgY2FsbGVkIHdpdGhvdXQgbUxvY2sgaGVsZC4gTWF5IGxlYWQgdG8gZGVhZCBsb2NrIGlmIGNhbGxpbmcgZm9yCisgICAgLy8gZXhhbXBsZSBnZXRSb3V0ZWREZXZpY2UgdGhhdCB1cGRhdGVzIHRoZSBkZXZpY2UgYW5kIHRyaWVzIHRvIGFjcXVpcmUgbUxvY2suCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYWxsYmFja3NUb0NhbGwuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY2FsbGJhY2tzVG9DYWxsW2ldLT5vbkF1ZGlvRGV2aWNlVXBkYXRlKGlvRGVzYy0+bUlvSGFuZGxlLCBkZXZpY2VJZCk7CiAgICAgfQogfQogCkBAIC02NzEsMjAgKzY4OSwyMSBAQAogICAgICAgICBjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBWZWN0b3IgPCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiA+IGNhbGxiYWNrczsKLSAgICBzc2l6ZV90IGlvSW5kZXggPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuaW5kZXhPZktleShhdWRpb0lvKTsKKyAgICBBdWRpb0RldmljZUNhbGxiYWNrUHJveGllcyBjYWxsYmFja1Byb3hpZXM7CisgICAgc3NpemVfdCBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzLmluZGV4T2ZLZXkoYXVkaW9Jbyk7CiAgICAgaWYgKGlvSW5kZXggPj0gMCkgewotICAgICAgICBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MudmFsdWVBdChpb0luZGV4KTsKKyAgICAgICAgY2FsbGJhY2tQcm94aWVzID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzLnZhbHVlQXQoaW9JbmRleCk7CiAgICAgfQogCi0gICAgZm9yIChzaXplX3QgY2JJbmRleCA9IDA7IGNiSW5kZXggPCBjYWxsYmFja3Muc2l6ZSgpOyBjYkluZGV4KyspIHsKLSAgICAgICAgaWYgKGNhbGxiYWNrc1tjYkluZGV4XS51bnNhZmVfZ2V0KCkgPT0gY2FsbGJhY2sudW5zYWZlX2dldCgpKSB7CisgICAgZm9yIChzaXplX3QgY2JJbmRleCA9IDA7IGNiSW5kZXggPCBjYWxsYmFja1Byb3hpZXMuc2l6ZSgpOyBjYkluZGV4KyspIHsKKyAgICAgICAgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gY2JrID0gY2FsbGJhY2tQcm94aWVzW2NiSW5kZXhdLT5jYWxsYmFjaygpOworICAgICAgICBpZiAoY2JrLmdldCgpID09IGNhbGxiYWNrLnVuc2FmZV9nZXQoKSkgewogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CiAgICAgfQotICAgIGNhbGxiYWNrcy5hZGQoY2FsbGJhY2spOwotCi0gICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnJlcGxhY2VWYWx1ZUZvcihhdWRpb0lvLCBjYWxsYmFja3MpOworICAgIGNhbGxiYWNrUHJveGllcy5hZGQobmV3IEF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94eShjYWxsYmFjaykpOworICAgIGNhbGxiYWNrUHJveGllcy5yZXNldE5vdGlmaWVkT25jZSgpOworICAgIG1BdWRpb0RldmljZUNhbGxiYWNrUHJveGllcy5yZXBsYWNlVmFsdWVGb3IoYXVkaW9JbywgY2FsbGJhY2tQcm94aWVzKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTY5MiwyNiArNzExLDI2IEBACiAgICAgICAgIGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbykKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHNzaXplX3QgaW9JbmRleCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5pbmRleE9mS2V5KGF1ZGlvSW8pOworICAgIHNzaXplX3QgaW9JbmRleCA9IG1BdWRpb0RldmljZUNhbGxiYWNrUHJveGllcy5pbmRleE9mS2V5KGF1ZGlvSW8pOwogICAgIGlmIChpb0luZGV4IDwgMCkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIFZlY3RvciA8IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+ID4gY2FsbGJhY2tzID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnZhbHVlQXQoaW9JbmRleCk7Ci0KKyAgICBBdWRpb0RldmljZUNhbGxiYWNrUHJveGllcyBjYWxsYmFja1Byb3hpZXMgPSBtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMudmFsdWVBdChpb0luZGV4KTsKICAgICBzaXplX3QgY2JJbmRleDsKLSAgICBmb3IgKGNiSW5kZXggPSAwOyBjYkluZGV4IDwgY2FsbGJhY2tzLnNpemUoKTsgY2JJbmRleCsrKSB7Ci0gICAgICAgIGlmIChjYWxsYmFja3NbY2JJbmRleF0udW5zYWZlX2dldCgpID09IGNhbGxiYWNrLnVuc2FmZV9nZXQoKSkgeworICAgIGZvciAoY2JJbmRleCA9IDA7IGNiSW5kZXggPCBjYWxsYmFja1Byb3hpZXMuc2l6ZSgpOyBjYkluZGV4KyspIHsKKyAgICAgICAgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gY2JrID0gY2FsbGJhY2tQcm94aWVzW2NiSW5kZXhdLT5jYWxsYmFjaygpOworICAgICAgICBpZiAoY2JrLmdldCgpID09IGNhbGxiYWNrLnVuc2FmZV9nZXQoKSkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKGNiSW5kZXggPT0gY2FsbGJhY2tzLnNpemUoKSkgeworICAgIGlmIChjYkluZGV4ID09IGNhbGxiYWNrUHJveGllcy5zaXplKCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBjYWxsYmFja3MucmVtb3ZlQXQoY2JJbmRleCk7Ci0gICAgaWYgKGNhbGxiYWNrcy5zaXplKCkgIT0gMCkgewotICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja3MucmVwbGFjZVZhbHVlRm9yKGF1ZGlvSW8sIGNhbGxiYWNrcyk7CisgICAgY2FsbGJhY2tQcm94aWVzLnJlbW92ZUF0KGNiSW5kZXgpOworICAgIGlmIChjYWxsYmFja1Byb3hpZXMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tQcm94aWVzLnJlcGxhY2VWYWx1ZUZvcihhdWRpb0lvLCBjYWxsYmFja1Byb3hpZXMpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrcy5yZW1vdmVJdGVtKGF1ZGlvSW8pOworICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXMucmVtb3ZlSXRlbShhdWRpb0lvKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtNzczLDYgKzc5Miw3IEBACiAgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICBhcC0+cmVnaXN0ZXJDbGllbnQoYXBjKTsKICAgICAgICAgYXAtPnNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoYXBjLT5pc0F1ZGlvUG9ydENiRW5hYmxlZCgpKTsKKyAgICAgICAgYXAtPnNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGFwYy0+aXNBdWRpb1ZvbHVtZUdyb3VwQ2JFbmFibGVkKCkpOwogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKICAgICB9CiAKQEAgLTc4NCw3ICs4MDQsOCBAQAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBjb25zdCBjaGFyICphZGRyZXNzID0gIiI7CkBAIC03OTgsNyArODE5LDcgQEAKICAgICBpZiAoZGV2aWNlX25hbWUgIT0gTlVMTCkgewogICAgICAgICBuYW1lID0gZGV2aWNlX25hbWU7CiAgICAgfQotICAgIHJldHVybiBhcHMtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLCBhZGRyZXNzLCBuYW1lKTsKKyAgICByZXR1cm4gYXBzLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwgYWRkcmVzcywgbmFtZSwgZW5jb2RlZEZvcm1hdCk7CiB9CiAKIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCkBAIC04MTIsNyArODMzLDggQEAKIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgY29uc3QgY2hhciAqYWRkcmVzcyA9ICIiOwpAQCAtODI2LDcgKzg0OCw3IEBACiAgICAgaWYgKGRldmljZV9uYW1lICE9IE5VTEwpIHsKICAgICAgICAgbmFtZSA9IGRldmljZV9uYW1lOwogICAgIH0KLSAgICByZXR1cm4gYXBzLT5oYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoZGV2aWNlLCBhZGRyZXNzLCBuYW1lKTsKKyAgICByZXR1cm4gYXBzLT5oYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoZGV2aWNlLCBhZGRyZXNzLCBuYW1lLCBlbmNvZGVkRm9ybWF0KTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKQpAQCAtODY5LDQwICs4OTEsMzUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBhcHMtPmdldE91dHB1dEZvckF0dHIoYXR0ciwgb3V0cHV0LCBzZXNzaW9uLCBzdHJlYW0sIHBpZCwgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkLCBzZWNvbmRhcnlPdXRwdXRzKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0YXJ0T3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICByZXR1cm4gYXBzLT5zdGFydE91dHB1dChwb3J0SWQpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zdG9wT3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICByZXR1cm4gYXBzLT5zdG9wT3V0cHV0KHBvcnRJZCk7CiB9CiAKLXZvaWQgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm47Ci0gICAgYXBzLT5yZWxlYXNlT3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBhcHMtPnJlbGVhc2VPdXRwdXQocG9ydElkKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCkBAIC05MjMsMTEgKzk0MCwxMSBAQAogICAgICAgICAgICAgY29uZmlnLCBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIGJvb2wgKnNpbGVuY2VkKQorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zdGFydElucHV0KHBvcnRJZCwgc2lsZW5jZWQpOworICAgIHJldHVybiBhcHMtPnN0YXJ0SW5wdXQocG9ydElkKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKQEAgLTk3MSwxMCArOTg4LDQyIEBACiAgICAgcmV0dXJuIGFwcy0+Z2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtLCBpbmRleCwgZGV2aWNlKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPnNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyLCBpbmRleCwgZGV2aWNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5nZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0ciwgaW5kZXgsIGRldmljZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+Z2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHIsIGluZGV4KTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5nZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0ciwgaW5kZXgpOworfQorCiB1aW50MzJfdCBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKLSAgICBpZiAoYXBzID09IDApIHJldHVybiAwOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBST0RVQ1RfU1RSQVRFR1lfTk9ORTsKICAgICByZXR1cm4gYXBzLT5nZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pOwogfQogCkBAIC0xMTc0LDYgKzEyMjMsMzggQEAKICAgICByZXR1cm4gKHJldCA8IDApID8gSU5WQUxJRF9PUEVSQVRJT04gOiBOT19FUlJPUjsKIH0KIAorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmFkZEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayhjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrQVBTKTsKKyAgICBpZiAoZ0F1ZGlvUG9saWN5U2VydmljZUNsaWVudCA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpbnQgcmV0ID0gZ0F1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+YWRkQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKGNhbGxiYWNrKTsKKyAgICBpZiAocmV0ID09IDEpIHsKKyAgICAgICAgYXBzLT5zZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZCh0cnVlKTsKKyAgICB9CisgICAgcmV0dXJuIChyZXQgPCAwKSA/IElOVkFMSURfT1BFUkFUSU9OIDogTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9ja0FQUyk7CisgICAgaWYgKGdBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaW50IHJldCA9IGdBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPnJlbW92ZUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayhjYWxsYmFjayk7CisgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIGFwcy0+c2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoZmFsc2UpOworICAgIH0KKyAgICByZXR1cm4gKHJldCA8IDApID8gSU5WQUxJRF9PUEVSQVRJT04gOiBOT19FUlJPUjsKK30KKwogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soCiAgICAgICAgIGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbykKIHsKQEAgLTEyNDIsMjAgKzEzMjMsMzMgQEAKICAgICByZXR1cm4gYXBzLT5yZWdpc3RlclBvbGljeU1peGVzKG1peGVzLCByZWdpc3RyYXRpb24pOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0YXJ0QXVkaW9Tb3VyY2Uoc291cmNlLCBhdHRyaWJ1dGVzLCBoYW5kbGUpOworICAgIHJldHVybiBhcHMtPnNldFVpZERldmljZUFmZmluaXRpZXModWlkLCBkZXZpY2VzKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6cmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpIHsKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPnJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zdG9wQXVkaW9Tb3VyY2UoaGFuZGxlKTsKKyAgICByZXR1cm4gYXBzLT5zdGFydEF1ZGlvU291cmNlKHNvdXJjZSwgYXR0cmlidXRlcywgcG9ydElkKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPnN0b3BBdWRpb1NvdXJjZShwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0TWFzdGVyTW9ubyhib29sIG1vbm8pCkBAIC0xMjcyLDYgKzEzNjYsMjAgQEAKICAgICByZXR1cm4gYXBzLT5nZXRNYXN0ZXJNb25vKG1vbm8pOwogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKQoreworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFmLT5zZXRNYXN0ZXJCYWxhbmNlKGJhbGFuY2UpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0TWFzdGVyQmFsYW5jZShmbG9hdCAqYmFsYW5jZSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhZi0+Z2V0TWFzdGVyQmFsYW5jZShiYWxhbmNlKTsKK30KKwogZmxvYXQgQXVkaW9TeXN0ZW06OmdldFN0cmVhbVZvbHVtZURCKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKQEAgLTEzMDQsNiArMTQxMiwxMDggQEAKICAgICByZXR1cm4gYXBzLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9Gb3JtYXQsIGVuYWJsZWQpOwogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCkKK3sKKyAgICBjb25zdCBzcCA8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIHJldHVybiBhcHMtPnNldEFzc2lzdGFudFVpZCh1aWQpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpCit7CisgICAgY29uc3Qgc3AgPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICByZXR1cm4gYXBzLT5zZXRBMTF5U2VydmljZXNVaWRzKHVpZHMpOworfQorCitib29sIEF1ZGlvU3lzdGVtOjppc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBhcHMtPmlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cykgeworICAgIGNvbnN0IHNwIDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPgorICAgICAgICAmIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5nZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKGZvcm1hdHMpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6bGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5saXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhzdHJhdGVnaWVzKTsKK30KKworYXVkaW9fYXR0cmlidXRlc190IEF1ZGlvU3lzdGVtOjpzdHJlYW1UeXBlVG9BdHRyaWJ1dGVzKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yIHN0cmF0ZWdpZXM7CisgICAgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoc3RyYXRlZ2llcyk7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJhdGVneSA6IHN0cmF0ZWdpZXMpIHsKKyAgICAgICAgYXV0byBhdHRyVmVjdCA9IHN0cmF0ZWd5LmdldEF1ZGlvQXR0cmlidXRlcygpOworICAgICAgICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoYmVnaW4oYXR0clZlY3QpLCBlbmQoYXR0clZlY3QpLCBbJnN0cmVhbV0oY29uc3QgYXV0byAmYXR0cmlidXRlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLmdldFN0cmVhbVR5cGUoKSA9PSBzdHJlYW07IH0pOworICAgICAgICBpZiAoaXRlciAhPSBlbmQoYXR0clZlY3QpKSB7CisgICAgICAgICAgICByZXR1cm4gaXRlci0+Z2V0QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dFKCJpbnZhbGlkIHN0cmVhbSB0eXBlICVzIHdoZW4gY29udmVydGluZyB0byBhdHRyaWJ1dGVzIiwgIHRvU3RyaW5nKHN0cmVhbSkuY19zdHIoKSk7CisgICAgcmV0dXJuIEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7Cit9CisKK2F1ZGlvX3N0cmVhbV90eXBlX3QgQXVkaW9TeXN0ZW06OmF0dHJpYnV0ZXNUb1N0cmVhbVR5cGUoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKQoreworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBwc0lkOworICAgIHN0YXR1c190IHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKEF1ZGlvQXR0cmlidXRlcyhhdHRyKSwgcHNJZCk7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgibm8gc3RyYXRlZ3kgZm91bmQgZm9yIGF0dHJpYnV0ZXMgJXMiLCAgdG9TdHJpbmcoYXR0cikuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgfQorICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yIHN0cmF0ZWdpZXM7CisgICAgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoc3RyYXRlZ2llcyk7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJhdGVneSA6IHN0cmF0ZWdpZXMpIHsKKyAgICAgICAgaWYgKHN0cmF0ZWd5LmdldElkKCkgPT0gcHNJZCkgeworICAgICAgICAgICAgYXV0byBhdHRyVmVjdCA9IHN0cmF0ZWd5LmdldEF1ZGlvQXR0cmlidXRlcygpOworICAgICAgICAgICAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGJlZ2luKGF0dHJWZWN0KSwgZW5kKGF0dHJWZWN0KSwgWyZhdHRyXShjb25zdCBhdXRvICZyZWZBdHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBdWRpb1Byb2R1Y3RTdHJhdGVneTo6YXR0cmlidXRlc01hdGNoZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZBdHRyLmdldEF0dHJpYnV0ZXMoKSwgYXR0cik7IH0pOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gZW5kKGF0dHJWZWN0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpdGVyLT5nZXRTdHJlYW1UeXBlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR0UoImludmFsaWQgYXR0cmlidXRlcyAlcyB3aGVuIGNvbnZlcnRpbmcgdG8gc3RyZWFtIiwgIHRvU3RyaW5nKGF0dHIpLmNfc3RyKCkpOworICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoYWEscHJvZHVjdFN0cmF0ZWd5KTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06Omxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5saXN0QXVkaW9Wb2x1bWVHcm91cHMoZ3JvdXBzKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCAmdm9sdW1lR3JvdXApCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5nZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoYWEsIHZvbHVtZUdyb3VwKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGludCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjphZGRBdWRpb1BvcnRDYWxsYmFjaygKQEAgLTEzNTMsNiArMTU2Myw0NyBAQAogICAgIH0KIH0KIAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmFkZEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tbaV0gPT0gY2FsbGJhY2spIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrLmFkZChjYWxsYmFjayk7CisgICAgcmV0dXJuIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suc2l6ZSgpOworfQorCitpbnQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6cmVtb3ZlQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKAorICAgICAgICBjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNpemVfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrW2ldID09IGNhbGxiYWNrKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA9PSBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrLnNpemUoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2sucmVtb3ZlQXQoaSk7CisgICAgcmV0dXJuIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suc2l6ZSgpOworfQorCit2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tbaV0tPm9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQoZ3JvdXAsIGZsYWdzKTsKKyAgICB9Cit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIHZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoCiAgICAgICAgIFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpCiB7CkBAIC0xMzY5LDkgKzE2MjAsMTQgQEAKIH0KIAogdm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCi0gICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKSB7CiAgICAgcmVjb3JkX2NvbmZpZ19jYWxsYmFjayBjYiA9IE5VTEw7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woQXVkaW9TeXN0ZW06OmdMb2NrKTsKQEAgLTEzNzksNyArMTYzNSw4IEBACiAgICAgfQogCiAgICAgaWYgKGNiICE9IE5VTEwpIHsKLSAgICAgICAgY2IoZXZlbnQsIGNsaWVudEluZm8sIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CisgICAgICAgIGNiKGV2ZW50LCBjbGllbnRJbmZvLCBjbGllbnRDb25maWcsIGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgIGRldmljZUNvbmZpZywgZWZmZWN0cywgcGF0Y2hIYW5kbGUsIHNvdXJjZSk7CiAgICAgfQogfQogCkBAIC0xMzkwLDYgKzE2NDcsOSBAQAogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1BvcnRDYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIG1BdWRpb1BvcnRDYWxsYmFja3NbaV0tPm9uU2VydmljZURpZWQoKTsKICAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tbaV0tPm9uU2VydmljZURpZWQoKTsKKyAgICAgICAgfQogICAgIH0KICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9ja0FQUyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCmluZGV4IGEzNDEzZTEuLmU1OWY3ZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCkBAIC0zMSw5ICszMSwxMCBAQAogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgogI2luY2x1ZGUgPHByb2Nlc3Nncm91cC9zY2hlZF9wb2xpY3kuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgogCkBAIC0xMjEsMjIgKzEyMiwyMiBAQAogICAgIHN0YXR1c190IHN0YXR1czsKICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCZhZlNhbXBsZVJhdGUsIHN0cmVhbVR5cGUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBxdWVyeSBvdXRwdXQgc2FtcGxlIHJhdGUgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcygpOiBVbmFibGUgdG8gcXVlcnkgb3V0cHV0IHNhbXBsZSByYXRlIGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RyZWFtVHlwZSwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBzdHJlYW1UeXBlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcXVlcnkgb3V0cHV0IGZyYW1lIGNvdW50IGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoKTogVW5hYmxlIHRvIHF1ZXJ5IG91dHB1dCBmcmFtZSBjb3VudCBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0cmVhbVR5cGUsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIHVpbnQzMl90IGFmTGF0ZW5jeTsKICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0TGF0ZW5jeSgmYWZMYXRlbmN5LCBzdHJlYW1UeXBlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcXVlcnkgb3V0cHV0IGxhdGVuY3kgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcygpOiBVbmFibGUgdG8gcXVlcnkgb3V0cHV0IGxhdGVuY3kgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdHJlYW1UeXBlLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIApAQCAtMTQ5LDg1ICsxNTAsNTIgQEAKICAgICAvLyBBdWRpb1RyYWNrLlNBTVBMRV9SQVRFX0haX01JTiA8PSBzYW1wbGVSYXRlIDw9IEF1ZGlvVHJhY2suU0FNUExFX1JBVEVfSFpfTUFYLgogICAgIC8vIFJldHVybiBlcnJvciBpbiB0aGUgdW5saWtlbHkgZXZlbnQgdGhhdCBpdCBkb2VzIG5vdCwgYXMgdGhhdCdzIHBhcnQgb2YgdGhlIEFQSSBjb250cmFjdC4KICAgICBpZiAoKmZyYW1lQ291bnQgPT0gMCkgewotICAgICAgICBBTE9HRSgiQXVkaW9UcmFjazo6Z2V0TWluRnJhbWVDb3VudCBmYWlsZWQgZm9yIHN0cmVhbVR5cGUgJWQsIHNhbXBsZVJhdGUgJXUiLAotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUpOworICAgICAgICBBTE9HRSgiJXMoKTogZmFpbGVkIGZvciBzdHJlYW1UeXBlICVkLCBzYW1wbGVSYXRlICV1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIEFMT0dWKCJnZXRNaW5GcmFtZUNvdW50PSV6dTogYWZGcmFtZUNvdW50PSV6dSwgYWZTYW1wbGVSYXRlPSV1LCBhZkxhdGVuY3k9JXUiLAotICAgICAgICAgICAgKmZyYW1lQ291bnQsIGFmRnJhbWVDb3VudCwgYWZTYW1wbGVSYXRlLCBhZkxhdGVuY3kpOworICAgIEFMT0dWKCIlcygpOiBnZXRNaW5GcmFtZUNvdW50PSV6dTogYWZGcmFtZUNvdW50PSV6dSwgYWZTYW1wbGVSYXRlPSV1LCBhZkxhdGVuY3k9JXUiLAorICAgICAgICAgICAgX19mdW5jX18sICpmcmFtZUNvdW50LCBhZkZyYW1lQ291bnQsIGFmU2FtcGxlUmF0ZSwgYWZMYXRlbmN5KTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKKy8vIHN0YXRpYworYm9vbCBBdWRpb1RyYWNrOjppc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgeworICAgIEFMT0dWKCIlcygpIiwgX19GVU5DVElPTl9fKTsKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBhcHMtPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbmZpZywgYXR0cmlidXRlcyk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zdGF0aWMgc3RkOjpzdHJpbmcgYXVkaW9Db250ZW50VHlwZVN0cmluZyhhdWRpb19jb250ZW50X3R5cGVfdCB2YWx1ZSkgewotICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRUeXBlOwotICAgIGlmIChBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOjp0b1N0cmluZyh2YWx1ZSwgY29udGVudFR5cGUpKSB7Ci0gICAgICAgIHJldHVybiBjb250ZW50VHlwZTsKLSAgICB9Ci0gICAgY2hhciByYXdidWZmZXJbMTZdOyAgLy8gcm9vbSBmb3IgIiVkIgotICAgIHNucHJpbnRmKHJhd2J1ZmZlciwgc2l6ZW9mKHJhd2J1ZmZlciksICIlZCIsIHZhbHVlKTsKLSAgICByZXR1cm4gcmF3YnVmZmVyOwotfQotCi1zdGF0aWMgc3RkOjpzdHJpbmcgYXVkaW9Vc2FnZVN0cmluZyhhdWRpb191c2FnZV90IHZhbHVlKSB7Ci0gICAgc3RkOjpzdHJpbmcgdXNhZ2U7Ci0gICAgaWYgKFVzYWdlVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcodmFsdWUsIHVzYWdlKSkgewotICAgICAgICByZXR1cm4gdXNhZ2U7Ci0gICAgfQotICAgIGNoYXIgcmF3YnVmZmVyWzE2XTsgIC8vIHJvb20gZm9yICIlZCIKLSAgICBzbnByaW50ZihyYXdidWZmZXIsIHNpemVvZihyYXdidWZmZXIpLCAiJWQiLCB2YWx1ZSk7Ci0gICAgcmV0dXJuIHJhd2J1ZmZlcjsKLX0KLQogdm9pZCBBdWRpb1RyYWNrOjpNZWRpYU1ldHJpY3M6OmdhdGhlcihjb25zdCBBdWRpb1RyYWNrICp0cmFjaykKIHsKLQotICAgIC8vIGtleSBmb3IgbWVkaWEgc3RhdGlzdGljcyBpcyBkZWZpbmVkIGluIHRoZSBoZWFkZXIKLSAgICAvLyBhdHRycyBmb3IgbWVkaWEgc3RhdGlzdGljcwotICAgIC8vIE5COiB0aGVzZSBhcmUgbWF0Y2hlZCB3aXRoIHB1YmxpYyBKYXZhIEFQSSBjb25zdGFudHMgZGVmaW5lZAotICAgIC8vIGluIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9UcmFjay5qYXZhCi0gICAgLy8gVGhlc2UgbXVzdCBiZSBrZXB0IHN5bmNocm9uaXplZCB3aXRoIHRoZSBjb25zdGFudHMgdGhlcmUuCi0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1RyYWNrU3RyZWFtVHlwZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay5zdHJlYW10eXBlIjsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tDb250ZW50VHlwZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay50eXBlIjsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tVc2FnZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay51c2FnZSI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1RyYWNrU2FtcGxlUmF0ZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay5zYW1wbGVyYXRlIjsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tDaGFubmVsTWFza1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay5jaGFubmVsbWFzayI7Ci0KLSAgICAvLyBOQjogVGhlc2UgYXJlIG5vdCB5ZXQgZXhwb3NlZCBhcyBwdWJsaWMgSmF2YSBBUEkgY29uc3RhbnRzLgotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1VuZGVycnVuRnJhbWVzW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnVuZGVycnVuZnJhbWVzIjsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tTdGFydHVwR2xpdGNoW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLmdsaXRjaC5zdGFydHVwIjsKLQogICAgIC8vIG9ubHkgaWYgd2UncmUgaW4gYSBnb29kIHN0YXRlLi4uCiAgICAgLy8gWFhYOiBzaGFsbCB3ZSBnYXRoZXIgYWx0ZXJuYXRpdmUgaW5mbyBpZiBmYWlsaW5nPwogICAgIGNvbnN0IHN0YXR1c190IGxzdGF0dXMgPSB0cmFjay0+aW5pdENoZWNrKCk7CiAgICAgaWYgKGxzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0QoIm5vIG1ldHJpY3MgZ2F0aGVyZWQsIHRyYWNrIHN0YXR1cz0lZCIsIChpbnQpIGxzdGF0dXMpOworICAgICAgICBBTE9HRCgiJXMoKTogbm8gbWV0cmljcyBnYXRoZXJlZCwgdHJhY2sgc3RhdHVzPSVkIiwgX19mdW5jX18sIChpbnQpIGxzdGF0dXMpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgLy8gY29uc3RydWN0b3IgZ3VhcmFudGVlcyBtQW5hbHl0aWNzSXRlbSBpcyB2YWxpZAorI2RlZmluZSBNTV9QUkVGSVggImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay4iIC8vIGF2b2lkIGN1dC1uLXBhc3RlIGVycm9ycy4KIAotICAgIGNvbnN0IGludDMyX3QgdW5kZXJydW5GcmFtZXMgPSB0cmFjay0+Z2V0VW5kZXJydW5GcmFtZXMoKTsKLSAgICBpZiAodW5kZXJydW5GcmFtZXMgIT0gMCkgewotICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0F1ZGlvVHJhY2tVbmRlcnJ1bkZyYW1lcywgdW5kZXJydW5GcmFtZXMpOwotICAgIH0KKyAgICAvLyBKYXZhIEFQSSAyOCBlbnRyaWVzLCBkbyBub3QgY2hhbmdlLgorICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAic3RyZWFtdHlwZSIsIHRvU3RyaW5nKHRyYWNrLT5zdHJlYW1UeXBlKCkpLmNfc3RyKCkpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAidHlwZSIsCisgICAgICAgICAgICB0b1N0cmluZyh0cmFjay0+bUF0dHJpYnV0ZXMuY29udGVudF90eXBlKS5jX3N0cigpKTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggInVzYWdlIiwgdG9TdHJpbmcodHJhY2stPm1BdHRyaWJ1dGVzLnVzYWdlKS5jX3N0cigpKTsKIAotICAgIGlmICh0cmFjay0+bVRpbWVzdGFtcFN0YXJ0dXBHbGl0Y2hSZXBvcnRlZCkgewotICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0F1ZGlvVHJhY2tTdGFydHVwR2xpdGNoLCAxKTsKLSAgICB9Ci0KLSAgICBpZiAodHJhY2stPm1TdHJlYW1UeXBlICE9IC0xKSB7Ci0gICAgICAgIC8vIGRlcHJlY2F0ZWQsIGJ1dCB0aGlzIHdpbGwgdGVsbCB1cyB3aG8gc3RpbGwgdXNlcyBpdC4KLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtBdWRpb1RyYWNrU3RyZWFtVHlwZSwgdHJhY2stPm1TdHJlYW1UeXBlKTsKLSAgICB9Ci0gICAgLy8gWFhYOiBjb25zaWRlciBpbmNsdWRpbmcgZnJvbSBtQXR0cmlidXRlczogc291cmNlIHR5cGUKLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9UcmFja0NvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQ29udGVudFR5cGVTdHJpbmcodHJhY2stPm1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSkuY19zdHIoKSk7Ci0gICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa0F1ZGlvVHJhY2tVc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1VzYWdlU3RyaW5nKHRyYWNrLT5tQXR0cmlidXRlcy51c2FnZSkuY19zdHIoKSk7Ci0gICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtBdWRpb1RyYWNrU2FtcGxlUmF0ZSwgdHJhY2stPm1TYW1wbGVSYXRlKTsKLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa0F1ZGlvVHJhY2tDaGFubmVsTWFzaywgdHJhY2stPm1DaGFubmVsTWFzayk7CisgICAgLy8gTm9uLUFQSSBlbnRyaWVzLCB0aGVzZSBjYW4gY2hhbmdlIGR1ZSB0byBhIEphdmEgc3RyaW5nIG1pc3Rha2UuCisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAic2FtcGxlUmF0ZSIsIChpbnQzMl90KXRyYWNrLT5tU2FtcGxlUmF0ZSk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KE1NX1BSRUZJWCAiY2hhbm5lbE1hc2siLCAoaW50NjRfdCl0cmFjay0+bUNoYW5uZWxNYXNrKTsKKyAgICAvLyBOb24tQVBJIGVudHJpZXMsIHRoZXNlIGNhbiBjaGFuZ2UuCisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAicG9ydElkIiwgKGludDMyX3QpdHJhY2stPm1Qb3J0SWQpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAiZW5jb2RpbmciLCB0b1N0cmluZyh0cmFjay0+bUZvcm1hdCkuY19zdHIoKSk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAiZnJhbWVDb3VudCIsIChpbnQzMl90KXRyYWNrLT5tRnJhbWVDb3VudCk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJhdHRyaWJ1dGVzIiwgdG9TdHJpbmcodHJhY2stPm1BdHRyaWJ1dGVzKS5jX3N0cigpKTsKIH0KIAogLy8gaGFuZCB0aGUgdXNlciBhIHNuYXBzaG90IG9mIHRoZSBtZXRyaWNzLgpAQCAtMzU0LDcgKzMyMiw4IEBACiAgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgIG1TaGFyZWRCdWZmZXIuY2xlYXIoKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgICAgICBBTE9HVigifkF1ZGlvVHJhY2ssIHJlbGVhc2luZyBzZXNzaW9uIGlkICVkIGZyb20gJWQgb24gYmVoYWxmIG9mICVkIiwKKyAgICAgICAgQUxPR1YoIiVzKCVkKSwgcmVsZWFzaW5nIHNlc3Npb24gaWQgJWQgZnJvbSAlZCBvbiBiZWhhbGYgb2YgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CiAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgbUNsaWVudFBpZCk7CiAgICAgfQpAQCAtMzg3LDggKzM1NiwxMCBAQAogICAgIHBpZF90IGNhbGxpbmdQaWQ7CiAgICAgcGlkX3QgbXlQaWQ7CiAKLSAgICBBTE9HVigic2V0KCk6IHN0cmVhbVR5cGUgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKKyAgICAvLyBOb3RlIG1Qb3J0SWQgaXMgbm90IHZhbGlkIHVudGlsIHRoZSB0cmFjayBpcyBjcmVhdGVkLCBzbyBvbWl0IG1Qb3J0SWQgaW4gQUxPRyBmb3Igc2V0LgorICAgIEFMT0dWKCIlcygpOiBzdHJlYW1UeXBlICVkLCBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXp1LCAiCiAgICAgICAgICAgImZsYWdzICMleCwgbm90aWZpY2F0aW9uRnJhbWVzICVkLCBzZXNzaW9uSWQgJWQsIHRyYW5zZmVyVHlwZSAlZCwgdWlkICVkLCBwaWQgJWQiLAorICAgICAgICAgIF9fZnVuY19fLAogICAgICAgICAgIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGZsYWdzLCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIHVpZCwgcGlkKTsKIApAQCAtNDA3LDggKzM3OCwxMCBAQAogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgVFJBTlNGRVJfQ0FMTEJBQ0s6CisgICAgY2FzZSBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLOgogICAgICAgICBpZiAoY2JmID09IE5VTEwgfHwgc2hhcmVkQnVmZmVyICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX0NBTExCQUNLIGJ1dCBjYmYgPT0gTlVMTCB8fCBzaGFyZWRCdWZmZXIgIT0gMCIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IFRyYW5zZmVyIHR5cGUgJXMgYnV0IGNiZiA9PSBOVUxMIHx8IHNoYXJlZEJ1ZmZlciAhPSAwIiwKKyAgICAgICAgICAgICAgICAgICAgY29udmVydFRyYW5zZmVyVG9UZXh0KHRyYW5zZmVyVHlwZSksIF9fZnVuY19fKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtNDE2LDIwICszODksMjEgQEAKICAgICBjYXNlIFRSQU5TRkVSX09CVEFJTjoKICAgICBjYXNlIFRSQU5TRkVSX1NZTkM6CiAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIlRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfT0JUQUlOIGJ1dCBzaGFyZWRCdWZmZXIgIT0gMCIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IFRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfT0JUQUlOIGJ1dCBzaGFyZWRCdWZmZXIgIT0gMCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBjYXNlIFRSQU5TRkVSX1NIQVJFRDoKICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9TSEFSRUQgYnV0IHNoYXJlZEJ1ZmZlciA9PSAwIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoKTogVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9TSEFSRUQgYnV0IHNoYXJlZEJ1ZmZlciA9PSAwIiwgX19mdW5jX18pOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIHRyYW5zZmVyIHR5cGUgJWQiLCB0cmFuc2ZlclR5cGUpOworICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdHJhbnNmZXJUeXBlKTsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtNDM3LDE0ICs0MTEsMTUgQEAKICAgICBtVHJhbnNmZXIgPSB0cmFuc2ZlclR5cGU7CiAgICAgbURvTm90UmVjb25uZWN0ID0gZG9Ob3RSZWNvbm5lY3Q7CiAKLSAgICBBTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgInNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICV6dSIsIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLAotICAgICAgICAgICAgc2hhcmVkQnVmZmVyLT5zaXplKCkpOworICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAiJXMoKTogc2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJXp1IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwgc2hhcmVkQnVmZmVyLT5zaXplKCkpOwogCi0gICAgQUxPR1YoInNldCgpIHN0cmVhbVR5cGUgJWQgZnJhbWVDb3VudCAlenUgZmxhZ3MgJTA0eCIsIHN0cmVhbVR5cGUsIGZyYW1lQ291bnQsIGZsYWdzKTsKKyAgICBBTE9HVigiJXMoKTogc3RyZWFtVHlwZSAlZCBmcmFtZUNvdW50ICV6dSBmbGFncyAlMDR4IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBzdHJlYW1UeXBlLCBmcmFtZUNvdW50LCBmbGFncyk7CiAKICAgICAvLyBpbnZhcmlhbnQgdGhhdCBtQXVkaW9UcmFjayAhPSAwIGlzIHRydWUgb25seSBhZnRlciBzZXQoKSByZXR1cm5zIHN1Y2Nlc3NmdWxseQogICAgIGlmIChtQXVkaW9UcmFjayAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJUcmFjayBhbHJlYWR5IGluIHVzZSIpOworICAgICAgICBBTE9HRSgiJXMoKTogVHJhY2sgYWxyZWFkeSBpbiB1c2UiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtNDU1LDcgKzQzMCw3IEBACiAgICAgfQogICAgIGlmIChwQXR0cmlidXRlcyA9PSBOVUxMKSB7CiAgICAgICAgIGlmICh1aW50MzJfdChzdHJlYW1UeXBlKSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewotICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgc3RyZWFtIHR5cGUgJWQiLCBzdHJlYW1UeXBlKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpOiBJbnZhbGlkIHN0cmVhbSB0eXBlICVkIiwgX19mdW5jX18sIHN0cmVhbVR5cGUpOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CkBAIC00NjQsMTkgKzQzOSwxMiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIHN0cmVhbSB0eXBlIHNob3VsZG4ndCBiZSBsb29rZWQgYXQsIHRoaXMgdHJhY2sgaGFzIGF1ZGlvIGF0dHJpYnV0ZXMKICAgICAgICAgbWVtY3B5KCZtQXR0cmlidXRlcywgcEF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgQUxPR1YoIkJ1aWxkaW5nIEF1ZGlvVHJhY2sgd2l0aCBhdHRyaWJ1dGVzOiB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKLSAgICAgICAgICAgICAgICBtQXR0cmlidXRlcy51c2FnZSwgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlLCBtQXR0cmlidXRlcy5mbGFncywgbUF0dHJpYnV0ZXMudGFncyk7CisgICAgICAgIEFMT0dWKCIlcygpOiBCdWlsZGluZyBBdWRpb1RyYWNrIHdpdGggYXR0cmlidXRlczoiCisgICAgICAgICAgICAgICAgIiB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMudXNhZ2UsIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSwgbUF0dHJpYnV0ZXMuZmxhZ3MsIG1BdHRyaWJ1dGVzLnRhZ3MpOwogICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOwotICAgICAgICBpZiAoKG1BdHRyaWJ1dGVzLmZsYWdzICYgQVVESU9fRkxBR19IV19BVl9TWU5DKSAhPSAwKSB7Ci0gICAgICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKG1BdHRyaWJ1dGVzLmZsYWdzICYgQVVESU9fRkxBR19MT1dfTEFURU5DWSkgIT0gMCkgewotICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNoZWNrIGRlZXAgYnVmZmVyIGFmdGVyIGZsYWdzIGhhdmUgYmVlbiBtb2RpZmllZCBhYm92ZQotICAgICAgICBpZiAoZmxhZ3MgPT0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSAmJiAobUF0dHJpYnV0ZXMuZmxhZ3MgJiBBVURJT19GTEFHX0RFRVBfQlVGRkVSKSAhPSAwKSB7Ci0gICAgICAgICAgICBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOwotICAgICAgICB9CisgICAgICAgIGF1ZGlvX2ZsYWdzX3RvX2F1ZGlvX291dHB1dF9mbGFncyhtQXR0cmlidXRlcy5mbGFncywgJmZsYWdzKTsKICAgICB9CiAKICAgICAvLyB0aGVzZSBiZWxvdyBzaG91bGQgcHJvYmFibHkgY29tZSBmcm9tIHRoZSBhdWRpb0ZsaW5nZXIgdG9vLi4uCkBAIC00ODgsMTQgKzQ1NiwxNCBAQAogCiAgICAgLy8gdmFsaWRhdGUgcGFyYW1ldGVycwogICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkpIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgZm9ybWF0ICUjeCIsIGZvcm1hdCk7CisgICAgICAgIEFMT0dFKCIlcygpOiBJbnZhbGlkIGZvcm1hdCAlI3giLCBfX2Z1bmNfXywgZm9ybWF0KTsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CiAKICAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgY2hhbm5lbE1hc2spOworICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgIF9fZnVuY19fLCBjaGFubmVsTWFzayk7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTUwOCw4ICs0NzYsOSBAQAogICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKQogICAgICAgICAgICAgfHwgIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewogICAgICAgICBBTE9HViggKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkKLSAgICAgICAgICAgICAgICAgICAgPyAiT2ZmbG9hZCByZXF1ZXN0LCBmb3JjaW5nIHRvIERpcmVjdCBPdXRwdXQiCi0gICAgICAgICAgICAgICAgICAgIDogIk5vdCBsaW5lYXIgUENNLCBmb3JjaW5nIHRvIERpcmVjdCBPdXRwdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgPyAiJXMoKTogT2ZmbG9hZCByZXF1ZXN0LCBmb3JjaW5nIHRvIERpcmVjdCBPdXRwdXQiCisgICAgICAgICAgICAgICAgICAgIDogIiVzKCk6IE5vdCBsaW5lYXIgUENNLCBmb3JjaW5nIHRvIERpcmVjdCBPdXRwdXQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CiAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KQogICAgICAgICAgICAgICAgIC8vIEZJWE1FIHdoeSBjYW4ndCB3ZSBhbGxvdyBkaXJlY3QgQU5EIGZhc3Q/CiAgICAgICAgICAgICAgICAgKChmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7CkBAIC01NjUsMTQgKzUzNCwxNCBAQAogICAgICAgICBtTm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSA9IDA7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKCEoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSkgewotICAgICAgICAgICAgQUxPR0UoIm5vdGlmaWNhdGlvbkZyYW1lcz0lZCBub3QgcGVybWl0dGVkIGZvciBub24tZmFzdCB0cmFjayIsCi0gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcyk7CisgICAgICAgICAgICBBTE9HRSgiJXMoKTogbm90aWZpY2F0aW9uRnJhbWVzPSVkIG5vdCBwZXJtaXR0ZWQgZm9yIG5vbi1mYXN0IHRyYWNrIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG5vdGlmaWNhdGlvbkZyYW1lcyk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZyYW1lQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgibm90aWZpY2F0aW9uRnJhbWVzPSVkIG5vdCBwZXJtaXR0ZWQgd2l0aCBub24temVybyBmcmFtZUNvdW50PSV6dSIsCi0gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgZnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HRSgiJXMoKTogbm90aWZpY2F0aW9uRnJhbWVzPSVkIG5vdCBwZXJtaXR0ZWQgd2l0aCBub24temVybyBmcmFtZUNvdW50PSV6dSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBub3RpZmljYXRpb25GcmFtZXMsIGZyYW1lQ291bnQpOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CkBAIC01ODIsNyArNTUxLDggQEAKICAgICAgICAgbU5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEgPSBtaW4obWF4Tm90aWZpY2F0aW9uc1BlckJ1ZmZlciwKICAgICAgICAgICAgICAgICBtYXgoKHVpbnQzMl90KSAtbm90aWZpY2F0aW9uRnJhbWVzLCBtaW5Ob3RpZmljYXRpb25zUGVyQnVmZmVyKSk7CiAgICAgICAgIEFMT0dXX0lGKG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxICE9ICh1aW50MzJfdCkgLW5vdGlmaWNhdGlvbkZyYW1lcywKLSAgICAgICAgICAgICAgICAibm90aWZpY2F0aW9uRnJhbWVzPSVkIGNsYW1wZWQgdG8gdGhlIHJhbmdlIC0ldSB0byAtJXUiLAorICAgICAgICAgICAgICAgICIlcygpOiBub3RpZmljYXRpb25GcmFtZXM9JWQgY2xhbXBlZCB0byB0aGUgcmFuZ2UgLSV1IHRvIC0ldSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCBtaW5Ob3RpZmljYXRpb25zUGVyQnVmZmVyLCBtYXhOb3RpZmljYXRpb25zUGVyQnVmZmVyKTsKICAgICB9CiAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IDA7CkBAIC02MDMsMTQgKzU3MywxNiBAQAogICAgIG1DYmYgPSBjYmY7CiAKICAgICBpZiAoY2JmICE9IE5VTEwpIHsKLSAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQgPSBuZXcgQXVkaW9UcmFja1RocmVhZCgqdGhpcywgdGhyZWFkQ2FuQ2FsbEphdmEpOworICAgICAgICBtQXVkaW9UcmFja1RocmVhZCA9IG5ldyBBdWRpb1RyYWNrVGhyZWFkKCp0aGlzKTsKICAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQtPnJ1bigiQXVkaW9UcmFjayIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8sIDAgLypzdGFjayovKTsKICAgICAgICAgLy8gdGhyZWFkIGJlZ2lucyBpbiBwYXVzZWQgc3RhdGUsIGFuZCB3aWxsIG5vdCByZWZlcmVuY2UgdXMgdW50aWwgc3RhcnQoKQogICAgIH0KIAogICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvVHJhY2sKLSAgICBzdGF0dXMgPSBjcmVhdGVUcmFja19sKCk7Ci0KKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgc3RhdHVzID0gY3JlYXRlVHJhY2tfbCgpOworICAgIH0KICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIGlmIChtQXVkaW9UcmFja1RocmVhZCAhPSAwKSB7CiAgICAgICAgICAgICBtQXVkaW9UcmFja1RocmVhZC0+cmVxdWVzdEV4aXQoKTsgICAvLyBzZWUgY29tbWVudCBpbiBBdWRpb1RyYWNrLmgKQEAgLTY1OCw2ICs2MzAsNyBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c3RhcnQoKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBwcmlvciBzdGF0ZTolcyIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0ZVRvU3RyaW5nKG1TdGF0ZSkpOwogCiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtNjk3LDcgKzY3MCw4IEBACiAgICAgICAgICAgICAvLyBTZXJ2ZXIgc2lkZSBoYXMgY29uc3VtZWQgc29tZXRoaW5nLCBidXQgaXMgaXQgZmluaXNoZWQgY29uc3VtaW5nPwogICAgICAgICAgICAgLy8gSXQgaXMgcG9zc2libGUgc2luY2UgZmx1c2ggYW5kIHN0b3AgYXJlIGFzeW5jaHJvbm91cyB0aGF0IHRoZSBzZXJ2ZXIKICAgICAgICAgICAgIC8vIGlzIHN0aWxsIGFjdGl2ZSBhdCB0aGlzIHBvaW50LgotICAgICAgICAgICAgQUxPR1YoInN0YXJ0OiBzZXJ2ZXIgcmVhZDolbGxkICBjdW11bGF0aXZlIGZsdXNoZWQ6JWxsZCAgY2xpZW50IHdyaXR0ZW46JWxsZCIsCisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBzZXJ2ZXIgcmVhZDolbGxkICBjdW11bGF0aXZlIGZsdXNoZWQ6JWxsZCAgY2xpZW50IHdyaXR0ZW46JWxsZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKShtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVN0YXJ0RXRzLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSksCiAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVN0YXJ0RXRzLm1GbHVzaGVkLApAQCAtNzU4LDcgKzczMiw3IEBACiAgICAgICAgIC8vIFN0YXJ0IG91ciBsb2NhbCBWb2x1bWVIYW5kbGVyIGZvciByZXN0b3JhdGlvbiBwdXJwb3Nlcy4KICAgICAgICAgbVZvbHVtZUhhbmRsZXItPnNldFN0YXJ0ZWQoKTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgic3RhcnQoKSBzdGF0dXMgJWQiLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKICAgICAgICAgbVN0YXRlID0gcHJldmlvdXNTdGF0ZTsKICAgICAgICAgaWYgKHQgIT0gMCkgewogICAgICAgICAgICAgaWYgKHByZXZpb3VzU3RhdGUgIT0gU1RBVEVfU1RPUFBJTkcpIHsKQEAgLTc3Niw2ICs3NTAsOCBAQAogdm9pZCBBdWRpb1RyYWNrOjpzdG9wKCkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzKCVkKTogcHJpb3Igc3RhdGU6JXMiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdGVUb1N0cmluZyhtU3RhdGUpKTsKKwogICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQUNUSVZFICYmIG1TdGF0ZSAhPSBTVEFURV9QQVVTRUQpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTc4NSw3ICs3NjEsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7CiAgICAgICAgIEFMT0dEX0lGKG1TaGFyZWRCdWZmZXIgPT0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAic3RvcCgpIGNhbGxlZCB3aXRoICV1IGZyYW1lcyBkZWxpdmVyZWQiLCBtUmVsZWFzZWQudmFsdWUoKSk7CisgICAgICAgICAgICAgICAgIiVzKCVkKTogY2FsbGVkIHdpdGggJXUgZnJhbWVzIGRlbGl2ZXJlZCIsIF9fZnVuY19fLCBtUG9ydElkLCBtUmVsZWFzZWQudmFsdWUoKSk7CiAgICAgICAgIG1SZWxlYXNlZCA9IDA7CiAgICAgfQogCkBAIC04MDYsNiArNzgyLDEwIEBACiAgICAgaWYgKHQgIT0gMCkgewogICAgICAgICBpZiAoIWlzT2ZmbG9hZGVkX2woKSkgewogICAgICAgICAgICAgdC0+cGF1c2UoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgeworICAgICAgICAgICAgLy8gY2F1c2VzIHdha2UgdXAgb2YgdGhlIHBsYXliYWNrIHRocmVhZCwgdGhhdCB3aWxsIGNhbGxiYWNrIHRoZSBjbGllbnQgZm9yCisgICAgICAgICAgICAvLyBFVkVOVF9TVFJFQU1fRU5EIGluIHByb2Nlc3NBdWRpb0J1ZmZlcigpCisgICAgICAgICAgICB0LT53YWtlKCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIG1QcmV2aW91c1ByaW9yaXR5KTsKQEAgLTgyMSwxMCArODAxLDEyIEBACiAKIHZvaWQgQXVkaW9UcmFjazo6Zmx1c2goKQogeworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBwcmlvciBzdGF0ZTolcyIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0ZVRvU3RyaW5nKG1TdGF0ZSkpOworCiAgICAgaWYgKG1TaGFyZWRCdWZmZXIgIT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FDVElWRSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtODUzLDYgKzgzNSw4IEBACiB2b2lkIEF1ZGlvVHJhY2s6OnBhdXNlKCkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzKCVkKTogcHJpb3Igc3RhdGU6JXMiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdGVUb1N0cmluZyhtU3RhdGUpKTsKKwogICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQUNUSVZFKSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9TVE9QUElORykgewpAQCAtODc4LDcgKzg2Miw4IEBACiAKICAgICAgICAgICAgIHVpbnQzMl90IGhhbEZyYW1lczsKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpnZXRSZW5kZXJQb3NpdGlvbihtT3V0cHV0LCAmaGFsRnJhbWVzLCAmbVBhdXNlZFBvc2l0aW9uKTsKLSAgICAgICAgICAgIEFMT0dWKCJBdWRpb1RyYWNrOjpwYXVzZSBmb3Igb2ZmbG9hZCwgY2FjaGUgY3VycmVudCBwb3NpdGlvbiAldSIsIG1QYXVzZWRQb3NpdGlvbik7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBmb3Igb2ZmbG9hZCwgY2FjaGUgY3VycmVudCBwb3NpdGlvbiAldSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtUGF1c2VkUG9zaXRpb24pOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtOTMyLDEwICs5MTcsMTMgQEAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldFNhbXBsZVJhdGUodWludDMyX3QgcmF0ZSkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzKCVkKTogcHJpb3Igc3RhdGU6JXMgcmF0ZToldSIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0ZVRvU3RyaW5nKG1TdGF0ZSksIHJhdGUpOworCiAgICAgaWYgKHJhdGUgPT0gbVNhbXBsZVJhdGUpIHsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KLSAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgfHwgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpKSB7CisgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpIHx8IChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKQorICAgICAgICAgICAgfHwgKG1DaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBpZiAobU91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewpAQCAtOTk3LDggKzk4NSw4IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBBTE9HVigic2V0UGxheWJhY2tSYXRlIChpbnB1dCk6IG1TYW1wbGVSYXRlOiV1ICBtU3BlZWQ6JWYgIG1QaXRjaDolZiIsCi0gICAgICAgICAgICBtU2FtcGxlUmF0ZSwgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CisgICAgQUxPR1YoIiVzKCVkKTogbVNhbXBsZVJhdGU6JXUgIG1TcGVlZDolZiAgbVBpdGNoOiVmIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtU2FtcGxlUmF0ZSwgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CiAgICAgLy8gcGl0Y2ggaXMgZW11bGF0ZWQgYnkgYWRqdXN0aW5nIHNwZWVkIGFuZCBzYW1wbGVSYXRlCiAgICAgY29uc3QgdWludDMyX3QgZWZmZWN0aXZlUmF0ZSA9IGFkanVzdFNhbXBsZVJhdGUobVNhbXBsZVJhdGUsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOwogICAgIGNvbnN0IGZsb2F0IGVmZmVjdGl2ZVNwZWVkID0gYWRqdXN0U3BlZWQocGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CkBAIC0xMDA3LDMyICs5OTUsMzIgQEAKICAgICBwbGF5YmFja1JhdGVUZW1wLm1TcGVlZCA9IGVmZmVjdGl2ZVNwZWVkOwogICAgIHBsYXliYWNrUmF0ZVRlbXAubVBpdGNoID0gZWZmZWN0aXZlUGl0Y2g7CiAKLSAgICBBTE9HVigic2V0UGxheWJhY2tSYXRlIChlZmZlY3RpdmUpOiBtU2FtcGxlUmF0ZToldSAgbVNwZWVkOiVmICBtUGl0Y2g6JWYiLAotICAgICAgICAgICAgZWZmZWN0aXZlUmF0ZSwgZWZmZWN0aXZlU3BlZWQsIGVmZmVjdGl2ZVBpdGNoKTsKKyAgICBBTE9HVigiJXMoJWQpIChlZmZlY3RpdmUpIG1TYW1wbGVSYXRlOiV1ICBtU3BlZWQ6JWYgIG1QaXRjaDolZiIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgZWZmZWN0aXZlUmF0ZSwgZWZmZWN0aXZlU3BlZWQsIGVmZmVjdGl2ZVBpdGNoKTsKIAogICAgIGlmICghaXNBdWRpb1BsYXliYWNrUmF0ZVZhbGlkKHBsYXliYWNrUmF0ZVRlbXApKSB7Ci0gICAgICAgIEFMT0dXKCJzZXRQbGF5YmFja1JhdGUoJWYsICVmKSBmYWlsZWQgKGVmZmVjdGl2ZSByYXRlIG91dCBvZiBib3VuZHMpIiwKLSAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQgKGVmZmVjdGl2ZSByYXRlIG91dCBvZiBib3VuZHMpIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIC8vIENoZWNrIGlmIHRoZSBidWZmZXIgc2l6ZSBpcyBjb21wYXRpYmxlLgogICAgIGlmICghaXNTYW1wbGVSYXRlU3BlZWRBbGxvd2VkX2woZWZmZWN0aXZlUmF0ZSwgZWZmZWN0aXZlU3BlZWQpKSB7Ci0gICAgICAgIEFMT0dXKCJzZXRQbGF5YmFja1JhdGUoJWYsICVmKSBmYWlsZWQgKGJ1ZmZlciBzaXplKSIsCi0gICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CisgICAgICAgIEFMT0dXKCIlcyglZCkgKCVmLCAlZikgZmFpbGVkIChidWZmZXIgc2l6ZSkiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICAvLyBDaGVjayByZXNhbXBsZXIgcmF0aW9zIGFyZSB3aXRoaW4gYm91bmRzCiAgICAgaWYgKCh1aW50NjRfdCllZmZlY3RpdmVSYXRlID4gKHVpbnQ2NF90KW1TYW1wbGVSYXRlICoKICAgICAgICAgICAgICh1aW50NjRfdClBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVgpIHsKLSAgICAgICAgQUxPR1coInNldFBsYXliYWNrUmF0ZSglZiwgJWYpIGZhaWxlZC4gUmVzYW1wbGUgcmF0ZSBleGNlZWRzIG1heCBhY2NlcHRlZCB2YWx1ZSIsCi0gICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CisgICAgICAgIEFMT0dXKCIlcyglZCkgKCVmLCAlZikgZmFpbGVkLiBSZXNhbXBsZSByYXRlIGV4Y2VlZHMgbWF4IGFjY2VwdGVkIHZhbHVlIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgaWYgKCh1aW50NjRfdCllZmZlY3RpdmVSYXRlICogKHVpbnQ2NF90KUFVRElPX1JFU0FNUExFUl9VUF9SQVRJT19NQVggPCAodWludDY0X3QpbVNhbXBsZVJhdGUpIHsKLSAgICAgICAgQUxPR1coInNldFBsYXliYWNrUmF0ZSglZiwgJWYpIGZhaWxlZC4gUmVzYW1wbGUgcmF0ZSBiZWxvdyBtaW4gYWNjZXB0ZWQgdmFsdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CisgICAgICAgIEFMT0dXKCIlcyglZCkgKCVmLCAlZikgZmFpbGVkLiBSZXNhbXBsZSByYXRlIGJlbG93IG1pbiBhY2NlcHRlZCB2YWx1ZSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBtUGxheWJhY2tSYXRlID0gcGxheWJhY2tSYXRlOwpAQCAtMTIzMyw3ICsxMjIxLDggQEAKICAgICAgICAgdWludDMyX3QgZHNwRnJhbWVzID0gMDsKIAogICAgICAgICBpZiAoaXNPZmZsb2FkZWRfbCgpICYmICgobVN0YXRlID09IFNUQVRFX1BBVVNFRCkgfHwgKG1TdGF0ZSA9PSBTVEFURV9QQVVTRURfU1RPUFBJTkcpKSkgewotICAgICAgICAgICAgQUxPR1YoImdldFBvc2l0aW9uIGNhbGxlZCBpbiBwYXVzZWQgc3RhdGUsIHJldHVybiBjYWNoZWQgcG9zaXRpb24gJXUiLCBtUGF1c2VkUG9zaXRpb24pOworICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogY2FsbGVkIGluIHBhdXNlZCBzdGF0ZSwgcmV0dXJuIGNhY2hlZCBwb3NpdGlvbiAldSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIG1QYXVzZWRQb3NpdGlvbik7CiAgICAgICAgICAgICAqcG9zaXRpb24gPSBtUGF1c2VkUG9zaXRpb247CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KQEAgLTEzNjAsNyArMTM0OSw3IEBACiBhdWRpb19zdHJlYW1fdHlwZV90IEF1ZGlvVHJhY2s6OnN0cmVhbVR5cGUoKSBjb25zdAogewogICAgIGlmIChtU3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgewotICAgICAgICByZXR1cm4gYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZSgmbUF0dHJpYnV0ZXMpOworICAgICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmF0dHJpYnV0ZXNUb1N0cmVhbVR5cGUobUF0dHJpYnV0ZXMpOwogICAgIH0KICAgICByZXR1cm4gbVN0cmVhbVR5cGU7CiB9CkBAIC0xMzc5LDcgKzEzNjgsNyBAQAogewogICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRMYXRlbmN5KG1PdXRwdXQsICZtQWZMYXRlbmN5KTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCJnZXRMYXRlbmN5KCVkKSBmYWlsZWQgc3RhdHVzICVkIiwgbU91dHB1dCwgc3RhdHVzKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogZ2V0TGF0ZW5jeSglZCkgZmFpbGVkIHN0YXR1cyAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCBtT3V0cHV0LCBzdGF0dXMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIEZJWE1FIGRvbid0IGJlbGlldmUgdGhpcyBsaWUKICAgICAgICAgbUxhdGVuY3kgPSBtQWZMYXRlbmN5ICsgKDEwMDBMTCAqIG1GcmFtZUNvdW50KSAvIG1TYW1wbGVSYXRlOwpAQCAtMTM5NSw2ICsxMzg0LDcgQEAKICAgICAgICAgTUVESUFfQ0FTRV9FTlVNKFRSQU5TRkVSX09CVEFJTik7CiAgICAgICAgIE1FRElBX0NBU0VfRU5VTShUUkFOU0ZFUl9TWU5DKTsKICAgICAgICAgTUVESUFfQ0FTRV9FTlVNKFRSQU5TRkVSX1NIQVJFRCk7CisgICAgICAgIE1FRElBX0NBU0VfRU5VTShUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLKTsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiAiVU5SRUNPR05JWkVEIjsKICAgICB9CkBAIC0xNDA3LDcgKzEzOTcsOCBAQAogCiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhdWRpb0ZsaW5nZXIgPT0gMCkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBhdWRpb2ZsaW5nZXIiKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBhdWRpb2ZsaW5nZXIiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTE0MjYsMTEgKzE0MTcsMTQgQEAKICAgICAgICAgICAgIC8vIHVzZSBjYXNlIDM6IG9idGFpbi9yZWxlYXNlIG1vZGUKICAgICAgICAgICAgIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfT0JUQUlOKSB8fAogICAgICAgICAgICAgLy8gdXNlIGNhc2UgNDogc3luY2hyb25vdXMgd3JpdGUKLSAgICAgICAgICAgICgobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkMpICYmIG1UaHJlYWRDYW5DYWxsSmF2YSk7CisgICAgICAgICAgICAoKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9TWU5DIHx8IG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLKQorICAgICAgICAgICAgICAgICAgICAmJiBtVGhyZWFkQ2FuQ2FsbEphdmEpOwogCiAgICAgICAgIGJvb2wgZmFzdEFsbG93ZWQgPSBzaGFyZWRCdWZmZXIgfHwgdHJhbnNmZXJBbGxvd2VkOwogICAgICAgICBpZiAoIWZhc3RBbGxvd2VkKSB7Ci0gICAgICAgICAgICBBTE9HVygiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBkZW5pZWQgYnkgY2xpZW50LCBub3Qgc2hhcmVkIGJ1ZmZlciBhbmQgdHJhbnNmZXIgPSAlcyIsCisgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiBBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBjbGllbnQsIgorICAgICAgICAgICAgICAgICAgIiBub3Qgc2hhcmVkIGJ1ZmZlciBhbmQgdHJhbnNmZXIgPSAlcyIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUcmFuc2ZlclRvVGV4dChtVHJhbnNmZXIpKTsKICAgICAgICAgICAgIG1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19GQVNUKTsKICAgICAgICAgfQpAQCAtMTQzOCw3ICsxNDMyLDcgQEAKIAogICAgIElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVRyYWNrSW5wdXQgaW5wdXQ7CiAgICAgaWYgKG1TdHJlYW1UeXBlICE9IEFVRElPX1NUUkVBTV9ERUZBVUxUKSB7Ci0gICAgICAgIHN0cmVhbV90eXBlX3RvX2F1ZGlvX2F0dHJpYnV0ZXMobVN0cmVhbVR5cGUsICZpbnB1dC5hdHRyKTsKKyAgICAgICAgaW5wdXQuYXR0ciA9IEF1ZGlvU3lzdGVtOjpzdHJlYW1UeXBlVG9BdHRyaWJ1dGVzKG1TdHJlYW1UeXBlKTsKICAgICB9IGVsc2UgewogICAgICAgICBpbnB1dC5hdHRyID0gbUF0dHJpYnV0ZXM7CiAgICAgfQpAQCAtMTQ3OSw3ICsxNDczLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwogCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCBvdXRwdXQub3V0cHV0SWQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvRmxpbmdlciBjb3VsZCBub3QgY3JlYXRlIHRyYWNrLCBzdGF0dXM6ICVkIG91dHB1dCAlZCIsIHN0YXR1cywgb3V0cHV0Lm91dHB1dElkKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgdHJhY2ssIHN0YXR1czogJWQgb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzLCBvdXRwdXQub3V0cHV0SWQpOwogICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICB9CkBAIC0xNTAwLDYgKzE0OTUsNyBAQAogICAgIG1BZkZyYW1lQ291bnQgPSBvdXRwdXQuYWZGcmFtZUNvdW50OwogICAgIG1BZlNhbXBsZVJhdGUgPSBvdXRwdXQuYWZTYW1wbGVSYXRlOwogICAgIG1BZkxhdGVuY3kgPSBvdXRwdXQuYWZMYXRlbmN5TXM7CisgICAgbVBvcnRJZCA9IG91dHB1dC5wb3J0SWQ7CiAKICAgICBtTGF0ZW5jeSA9IG1BZkxhdGVuY3kgKyAoMTAwMExMICogbUZyYW1lQ291bnQpIC8gbVNhbXBsZVJhdGU7CiAKQEAgLTE1MDksMTMgKzE1MDUsMTMgQEAKICAgICAvLyBGSVhNRSBjb21wYXJlIHRvIEF1ZGlvUmVjb3JkCiAgICAgc3A8SU1lbW9yeT4gaU1lbSA9IHRyYWNrLT5nZXRDYmxrKCk7CiAgICAgaWYgKGlNZW0gPT0gMCkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIik7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICB2b2lkICppTWVtUG9pbnRlciA9IGlNZW0tPnBvaW50ZXIoKTsKICAgICBpZiAoaU1lbVBvaW50ZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIHBvaW50ZXIiKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIHBvaW50ZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC0xNTM0LDE0ICsxNTMwLDE0IEBACiAgICAgbUF3YWl0Qm9vc3QgPSBmYWxzZTsKICAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICBpZiAob3V0cHV0LmZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewotICAgICAgICAgICAgQUxPR0koIkFVRElPX09VVFBVVF9GTEFHX0ZBU1Qgc3VjY2Vzc2Z1bDsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwKLSAgICAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50LCBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HSSgiJXMoJWQpOiBBVURJT19PVVRQVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVJlcUZyYW1lQ291bnQsIG1GcmFtZUNvdW50KTsKICAgICAgICAgICAgIGlmICghbVRocmVhZENhbkNhbGxKYXZhKSB7CiAgICAgICAgICAgICAgICAgbUF3YWl0Qm9vc3QgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coIkFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IHNlcnZlcjsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwgbVJlcUZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiBBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBzZXJ2ZXI7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVJlcUZyYW1lQ291bnQsIG1GcmFtZUNvdW50KTsKICAgICAgICAgfQogICAgIH0KICAgICBtRmxhZ3MgPSBvdXRwdXQuZmxhZ3M7CkBAIC0xNTY5LDcgKzE1NjUsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGJ1ZmZlcnMgPSBtU2hhcmVkQnVmZmVyLT5wb2ludGVyKCk7CiAgICAgICAgIGlmIChidWZmZXJzID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGJ1ZmZlciBwb2ludGVyIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGJ1ZmZlciBwb2ludGVyIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtMTY1OCw3ICsxNjU0LDcgQEAKICAgICAgICAgdGltZW91dC50dl9uc2VjID0gKGxvbmcpIChtcyAlIDEwMDApICogMTAwMDAwMDsKICAgICAgICAgcmVxdWVzdGVkID0gJnRpbWVvdXQ7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgd2FpdENvdW50ICVkIiwgX19mdW5jX18sIHdhaXRDb3VudCk7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IGludmFsaWQgd2FpdENvdW50ICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIHdhaXRDb3VudCk7CiAgICAgICAgIHJlcXVlc3RlZCA9IE5VTEw7CiAgICAgfQogICAgIHJldHVybiBvYnRhaW5CdWZmZXIoYXVkaW9CdWZmZXIsIHJlcXVlc3RlZCwgTlVMTCAvKmVsYXBzZWQqLywgbm9uQ29udGlnKTsKQEAgLTE3NjgsNyArMTc2NCw4IEBACiB7CiAgICAgaW50MzJfdCBmbGFncyA9IGFuZHJvaWRfYXRvbWljX2FuZCh+Q0JMS19ESVNBQkxFRCwgJm1DYmxrLT5tRmxhZ3MpOwogICAgIGlmICgobVN0YXRlID09IFNUQVRFX0FDVElWRSkgJiYgKGZsYWdzICYgQ0JMS19ESVNBQkxFRCkpIHsKLSAgICAgICAgQUxPR1coInJlbGVhc2VCdWZmZXIoKSB0cmFjayAlcCBkaXNhYmxlZCBkdWUgdG8gcHJldmlvdXMgdW5kZXJydW4sIHJlc3RhcnRpbmciLCB0aGlzKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogcmVsZWFzZUJ1ZmZlcigpIHRyYWNrICVwIGRpc2FibGVkIGR1ZSB0byBwcmV2aW91cyB1bmRlcnJ1biwgcmVzdGFydGluZyIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHRoaXMpOwogICAgICAgICAvLyBGSVhNRSBpZ25vcmluZyBzdGF0dXMKICAgICAgICAgbUF1ZGlvVHJhY2stPnN0YXJ0KCk7CiAgICAgfQpAQCAtMTc3OCw3ICsxNzc1LDcgQEAKIAogc3NpemVfdCBBdWRpb1RyYWNrOjp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCB1c2VyU2l6ZSwgYm9vbCBibG9ja2luZykKIHsKLSAgICBpZiAobVRyYW5zZmVyICE9IFRSQU5TRkVSX1NZTkMpIHsKKyAgICBpZiAobVRyYW5zZmVyICE9IFRSQU5TRkVSX1NZTkMgJiYgbVRyYW5zZmVyICE9IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtMTc5NSw3ICsxNzkyLDggQEAKICAgICBpZiAoc3NpemVfdCh1c2VyU2l6ZSkgPCAwIHx8IChidWZmZXIgPT0gTlVMTCAmJiB1c2VyU2l6ZSAhPSAwKSkgewogICAgICAgICAvLyBTYW5pdHktY2hlY2s6IHVzZXIgaXMgbW9zdC1saWtlbHkgcGFzc2luZyBhbiBlcnJvciBjb2RlLCBhbmQgaXQgd291bGQKICAgICAgICAgLy8gbWFrZSB0aGUgcmV0dXJuIHZhbHVlIGFtYmlndW91cyAoYWN0dWFsU2l6ZSB2cyBlcnJvcikuCi0gICAgICAgIEFMT0dFKCJBdWRpb1RyYWNrOjp3cml0ZShidWZmZXI9JXAsIHNpemU9JXp1ICglemQpIiwgYnVmZmVyLCB1c2VyU2l6ZSwgdXNlclNpemUpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBBdWRpb1RyYWNrOjp3cml0ZShidWZmZXI9JXAsIHNpemU9JXp1ICglemQpIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgYnVmZmVyLCB1c2VyU2l6ZSwgdXNlclNpemUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtMTgyOCw3ICsxODI2LDE3IEBACiAKICAgICBpZiAod3JpdHRlbiA+IDApIHsKICAgICAgICAgbUZyYW1lc1dyaXR0ZW4gKz0gd3JpdHRlbiAvIG1GcmFtZVNpemU7CisKKyAgICAgICAgaWYgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLKSB7CisgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1RyYWNrVGhyZWFkPiB0ID0gbUF1ZGlvVHJhY2tUaHJlYWQ7CisgICAgICAgICAgICBpZiAodCAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gY2F1c2VzIHdha2UgdXAgb2YgdGhlIHBsYXliYWNrIHRocmVhZCwgdGhhdCB3aWxsIGNhbGxiYWNrIHRoZSBjbGllbnQgZm9yCisgICAgICAgICAgICAgICAgLy8gbW9yZSBkYXRhICh3aXRoIEVWRU5UX0NBTl9XUklURV9NT1JFX0RBVEEpIGluIHByb2Nlc3NBdWRpb0J1ZmZlcigpCisgICAgICAgICAgICAgICAgdC0+d2FrZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQorCiAgICAgcmV0dXJuIHdyaXR0ZW47CiB9CiAKQEAgLTE4NTcsNyArMTg2NSw4IEBACiAgICAgICAgICAgICBwb2xsVXMgPDw9IDE7CiAgICAgICAgIH0gd2hpbGUgKHRyeUNvdW50ZXItLSA+IDApOwogICAgICAgICBpZiAodHJ5Q291bnRlciA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJkaWQgbm90IHJlY2VpdmUgZXhwZWN0ZWQgcHJpb3JpdHkgYm9vc3Qgb24gdGltZSIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogZGlkIG5vdCByZWNlaXZlIGV4cGVjdGVkIHByaW9yaXR5IGJvb3N0IG9uIHRpbWUiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gUnVuIGFnYWluIGltbWVkaWF0ZWx5CiAgICAgICAgIHJldHVybiAwOwpAQCAtMjA4MSw4ICsyMDkwLDggQEAKICAgICAgICAgaWYgKG5zIDwgMCkgbnMgPSAwOwogICAgIH0KIAotICAgIC8vIElmIG5vdCBzdXBwbHlpbmcgZGF0YSBieSBFVkVOVF9NT1JFX0RBVEEsIHRoZW4gd2UncmUgZG9uZQotICAgIGlmIChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfQ0FMTEJBQ0spIHsKKyAgICAvLyBJZiBub3Qgc3VwcGx5aW5nIGRhdGEgYnkgRVZFTlRfTU9SRV9EQVRBIG9yIEVWRU5UX0NBTl9XUklURV9NT1JFX0RBVEEsIHRoZW4gd2UncmUgZG9uZQorICAgIGlmIChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfQ0FMTEJBQ0sgJiYgbVRyYW5zZmVyICE9IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spIHsKICAgICAgICAgcmV0dXJuIG5zOwogICAgIH0KIApAQCAtMjA5OCw3ICsyMTA3LDggQEAKICAgICBpZiAobnMgIT0gTlNfV0hFTkVWRVIpIHsKICAgICAgICAgdGltZW91dC50dl9zZWMgPSBucyAvIDEwMDAwMDAwMDBMTDsKICAgICAgICAgdGltZW91dC50dl9uc2VjID0gbnMgJSAxMDAwMDAwMDAwTEw7Ci0gICAgICAgIEFMT0dWKCJ0aW1lb3V0ICVsZC4lMDNkIiwgdGltZW91dC50dl9zZWMsIChpbnQpIHRpbWVvdXQudHZfbnNlYyAvIDEwMDAwMDApOworICAgICAgICBBTE9HVigiJXMoJWQpOiB0aW1lb3V0ICVsZC4lMDNkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgdGltZW91dC50dl9zZWMsIChpbnQpIHRpbWVvdXQudHZfbnNlYyAvIDEwMDAwMDApOwogICAgICAgICByZXF1ZXN0ZWQgPSAmdGltZW91dDsKICAgICB9CiAKQEAgLTIxMTAsMTggKzIxMjAsMjAgQEAKICAgICAgICAgc2l6ZV90IG5vbkNvbnRpZzsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gb2J0YWluQnVmZmVyKCZhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMLCAmbm9uQ29udGlnKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigoZXJyICE9IE5PX0VSUk9SKSAhPSAoYXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSwKLSAgICAgICAgICAgICAgICAib2J0YWluQnVmZmVyKCkgZXJyPSVkIGZyYW1lQ291bnQ9JXp1IiwgZXJyLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiBvYnRhaW5CdWZmZXIoKSBlcnI9JWQgZnJhbWVDb3VudD0lenUiLAorICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgZXJyLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50KTsKICAgICAgICAgcmVxdWVzdGVkID0gJkNsaWVudFByb3h5OjprTm9uQmxvY2tpbmc7CiAgICAgICAgIHNpemVfdCBhdmFpbCA9IGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgKyBub25Db250aWc7Ci0gICAgICAgIEFMT0dWKCJvYnRhaW5CdWZmZXIoJXUpIHJldHVybmVkICV6dSA9ICV6dSArICV6dSBlcnIgJWQiLAotICAgICAgICAgICAgICAgIG1SZW1haW5pbmdGcmFtZXMsIGF2YWlsLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50LCBub25Db250aWcsIGVycik7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IG9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXp1ID0gJXp1ICsgJXp1IGVyciAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIG1SZW1haW5pbmdGcmFtZXMsIGF2YWlsLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50LCBub25Db250aWcsIGVycik7CiAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGlmIChlcnIgPT0gVElNRURfT1VUIHx8IGVyciA9PSBXT1VMRF9CTE9DSyB8fCBlcnIgPT0gLUVJTlRSIHx8CiAgICAgICAgICAgICAgICAgICAgIChpc09mZmxvYWRlZCgpICYmIChlcnIgPT0gREVBRF9PQkpFQ1QpKSkgewogICAgICAgICAgICAgICAgIC8vIEZJWE1FIGJ1ZyAyNTE5NTc1OQogICAgICAgICAgICAgICAgIHJldHVybiAxMDAwMDAwOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR0UoIkVycm9yICVkIG9idGFpbmluZyBhbiBhdWRpbyBidWZmZXIsIGdpdmluZyB1cC4iLCBlcnIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogRXJyb3IgJWQgb2J0YWluaW5nIGFuIGF1ZGlvIGJ1ZmZlciwgZ2l2aW5nIHVwLiIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBlcnIpOwogICAgICAgICAgICAgcmV0dXJuIE5TX05FVkVSOwogICAgICAgICB9CiAKQEAgLTIxNDEsMTcgKzIxNTMsMzEgQEAKICAgICAgICAgfQogCiAgICAgICAgIHNpemVfdCByZXFTaXplID0gYXVkaW9CdWZmZXIuc2l6ZTsKLSAgICAgICAgbUNiZihFVkVOVF9NT1JFX0RBVEEsIG1Vc2VyRGF0YSwgJmF1ZGlvQnVmZmVyKTsKKyAgICAgICAgaWYgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLKSB7CisgICAgICAgICAgICAvLyB3aGVuIG5vdGlmeWluZyBjbGllbnQgaXQgY2FuIHdyaXRlIG1vcmUgZGF0YSwgcGFzcyB0aGUgdG90YWwgc2l6ZSB0aGF0IGNhbiBiZQorICAgICAgICAgICAgLy8gd3JpdHRlbiBpbiB0aGUgbmV4dCB3cml0ZSgpIGNhbGwsIHNpbmNlIGl0J3Mgbm90IHBhc3NlZCB0aHJvdWdoIHRoZSBjYWxsYmFjaworICAgICAgICAgICAgYXVkaW9CdWZmZXIuc2l6ZSArPSBub25Db250aWc7CisgICAgICAgIH0KKyAgICAgICAgbUNiZihtVHJhbnNmZXIgPT0gVFJBTlNGRVJfQ0FMTEJBQ0sgPyBFVkVOVF9NT1JFX0RBVEEgOiBFVkVOVF9DQU5fV1JJVEVfTU9SRV9EQVRBLAorICAgICAgICAgICAgICAgIG1Vc2VyRGF0YSwgJmF1ZGlvQnVmZmVyKTsKICAgICAgICAgc2l6ZV90IHdyaXR0ZW5TaXplID0gYXVkaW9CdWZmZXIuc2l6ZTsKIAogICAgICAgICAvLyBTYW5pdHkgY2hlY2sgb24gcmV0dXJuZWQgc2l6ZQogICAgICAgICBpZiAoc3NpemVfdCh3cml0dGVuU2l6ZSkgPCAwIHx8IHdyaXR0ZW5TaXplID4gcmVxU2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoIkVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXp1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlemQgYnl0ZXMiLAotICAgICAgICAgICAgICAgICAgICByZXFTaXplLCBzc2l6ZV90KHdyaXR0ZW5TaXplKSk7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBFVkVOVF9NT1JFX0RBVEEgcmVxdWVzdGVkICV6dSBieXRlcyBidXQgY2FsbGJhY2sgcmV0dXJuZWQgJXpkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHJlcVNpemUsIHNzaXplX3Qod3JpdHRlblNpemUpKTsKICAgICAgICAgICAgIHJldHVybiBOU19ORVZFUjsKICAgICAgICAgfQogCiAgICAgICAgIGlmICh3cml0dGVuU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBpZiAobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgY2FsbGJhY2sgRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSB3YXMgcHJvY2Vzc2VkIGluIHRoZSBKTkkgb2YKKyAgICAgICAgICAgICAgICAvLyBhbmRyb2lkLm1lZGlhLkF1ZGlvVHJhY2suIFRoZSBKTkkgaXMgbm90IHVzaW5nIHRoZSBjYWxsYmFjayB0byBwcm92aWRlIGRhdGEsCisgICAgICAgICAgICAgICAgLy8gaXQgb25seSBzaWduYWxzIHRvIHRoZSBKYXZhIGNsaWVudCB0aGF0IGl0IGNhbiBwcm92aWRlIG1vcmUgZGF0YSwgd2hpY2gKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHRyYWNrIGlzIHJlYWQgdG8gYWNjZXB0IG5vdy4KKyAgICAgICAgICAgICAgICAvLyBUaGUgcGxheWJhY2sgdGhyZWFkIHdpbGwgYmUgYXdha2VuIGF0IHRoZSBuZXh0IDo6d3JpdGUoKQorICAgICAgICAgICAgICAgIHJldHVybiBOU19XSEVORVZFUjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFRoZSBjYWxsYmFjayBpcyBkb25lIGZpbGxpbmcgYnVmZmVycwogICAgICAgICAgICAgLy8gS2VlcCB0aGlzIHRocmVhZCBnb2luZyB0byBoYW5kbGUgdGltZWQgZXZlbnRzIGFuZAogICAgICAgICAgICAgLy8gc3RpbGwgdHJ5IHRvIGdldCBtb3JlIGRhdGEgaW4gaW50ZXJ2YWxzIG9mIFdBSVRfUEVSSU9EX01TCkBAIC0yMjQyLDggKzIyNjgsOCBAQAogCiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpyZXN0b3JlVHJhY2tfbChjb25zdCBjaGFyICpmcm9tKQogewotICAgIEFMT0dXKCJkZWFkIElBdWRpb1RyYWNrLCAlcywgY3JlYXRpbmcgYSBuZXcgb25lIGZyb20gJXMoKSIsCi0gICAgICAgICAgaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgPyAiT2ZmbG9hZGVkIG9yIERpcmVjdCIgOiAiUENNIiwgZnJvbSk7CisgICAgQUxPR1coIiVzKCVkKTogZGVhZCBJQXVkaW9UcmFjaywgJXMsIGNyZWF0aW5nIGEgbmV3IG9uZSBmcm9tICVzKCkiLAorICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpID8gIk9mZmxvYWRlZCBvciBEaXJlY3QiIDogIlBDTSIsIGZyb20pOwogICAgICsrbVNlcXVlbmNlOwogCiAgICAgLy8gcmVmcmVzaCB0aGUgYXVkaW8gY29uZmlndXJhdGlvbiBjYWNoZSBpbiB0aGlzIHByb2Nlc3MgdG8gbWFrZSBzdXJlIHdlIGdldCBuZXcKQEAgLTIyODYsMTAgKzIzMTIsNyBAQAogICAgIC8vIElmIGEgbmV3IElBdWRpb1RyYWNrIGNhbm5vdCBiZSBjcmVhdGVkLCB0aGUgcHJldmlvdXMgKGRlYWQpIGluc3RhbmNlIHdpbGwgYmUgbGVmdCBpbnRhY3QuCiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY3JlYXRlVHJhY2tfbCgpOwogCi0gICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygiJXMoKTogY3JlYXRlVHJhY2tfbCBmYWlsZWQsIGRvIG5vdCByZXRyeSIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0cmllcyA9IDA7Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CiAgICAgICAgIC8vIHRha2UgdGhlIGZyYW1lcyB0aGF0IHdpbGwgYmUgbG9zdCBieSB0cmFjayByZWNyZWF0aW9uIGludG8gYWNjb3VudCBpbiBzYXZlZCBwb3NpdGlvbgogICAgICAgICAvLyBGb3Igc3RyZWFtaW5nIHRyYWNrcywgdGhpcyBpcyB0aGUgYW1vdW50IHdlIG9idGFpbmVkIGZyb20gdGhlIHVzZXIvY2xpZW50CiAgICAgICAgIC8vIChub3QgdGhlIG51bWJlciBhY3R1YWxseSBjb25zdW1lZCBhdCB0aGUgc2VydmVyIC0gdGhvc2UgYXJlIGFscmVhZHkgbG9zdCkuCkBAIC0yMzA0LDcgKzIzMjcsNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtU3RhdGljUHJveHktPnNldEJ1ZmZlclBvc2l0aW9uKGJ1ZmZlclBvc2l0aW9uKTsKICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyUG9zaXRpb24gPT0gbUZyYW1lQ291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0QoInJlc3RvcmluZyB0cmFjayBhdCBlbmQgb2Ygc3RhdGljIGJ1ZmZlciIpOworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiJXMoJWQpOiByZXN0b3JpbmcgdHJhY2sgYXQgZW5kIG9mIHN0YXRpYyBidWZmZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMzM0LDE0ICsyMzU3LDE4IEBACiAgICAgICAgIG1GcmFtZXNXcml0dGVuQXRSZXN0b3JlID0gbUZyYW1lc1dyaXR0ZW5TZXJ2ZXJPZmZzZXQ7CiAgICAgfQogICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1coIiVzKCkgZmFpbGVkIHN0YXR1cyAlZCwgcmV0cmllcyAlZCIsIF9fZnVuY19fLCByZXN1bHQsIHJldHJpZXMpOworICAgICAgICBBTE9HVygiJXMoJWQpOiBmYWlsZWQgc3RhdHVzICVkLCByZXRyaWVzICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIHJlc3VsdCwgcmV0cmllcyk7CiAgICAgICAgIGlmICgtLXJldHJpZXMgPiAwKSB7CisgICAgICAgICAgICAvLyBsZWF2ZSB0aW1lIGZvciBhbiBldmVudHVhbCByYWNlIGNvbmRpdGlvbiB0byBjbGVhciBiZWZvcmUgcmV0cnlpbmcKKyAgICAgICAgICAgIHVzbGVlcCg1MDAwMDApOwogICAgICAgICAgICAgZ290byByZXRyeTsKICAgICAgICAgfQotICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOwotICAgICAgICBtUmVsZWFzZWQgPSAwOworICAgICAgICAvLyBpZiBubyByZXRyaWVzIGxlZnQsIHNldCBpbnZhbGlkIGJpdCB0byBmb3JjZSByZXN0b3JpbmcgYXQgbmV4dCBvY2Nhc2lvbgorICAgICAgICAvLyBhbmQgYXZvaWQgaW5jb25zaXN0ZW50IGFjdGl2ZSBzdGF0ZSBvbiBjbGllbnQgYW5kIHNlcnZlciBzaWRlcworICAgICAgICBpZiAobUNibGsgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlZBTElELCAmbUNibGstPm1GbGFncyk7CisgICAgICAgIH0KICAgICB9Ci0KICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC0yMzU5LDggKzIzODYsOCBAQAogICAgIC8vICAgICAgdW5sZXNzIHRoZSBzZXJ2ZXIgaGFzIG1vcmUgdGhhbiAyXjMxIGZyYW1lcyBpbiBpdHMgYnVmZmVyLAogICAgIC8vICAgICAgaW4gd2hpY2ggY2FzZSB0aGUgdXNlIG9mIHVpbnQzMl90IGZvciB0aGVzZSBjb3VudGVycyBoYXMgYmlnZ2VyIGlzc3Vlcy4KICAgICBBTE9HRV9JRihkZWx0YSA8IDAsCi0gICAgICAgICAgICAiZGV0ZWN0ZWQgaWxsZWdhbCByZXRyb2dyYWRlIG1vdGlvbiBieSB0aGUgc2VydmVyOiBtU2VydmVyIGFkdmFuY2VkIGJ5ICVkIiwKLSAgICAgICAgICAgIGRlbHRhKTsKKyAgICAgICAgICAgICIlcyglZCk6IGRldGVjdGVkIGlsbGVnYWwgcmV0cm9ncmFkZSBtb3Rpb24gYnkgdGhlIHNlcnZlcjogbVNlcnZlciBhZHZhbmNlZCBieSAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgZGVsdGEpOwogICAgIG1TZXJ2ZXIgPSBuZXdTZXJ2ZXI7CiAgICAgaWYgKGRlbHRhID4gMCkgeyAvLyBhdm9pZCByZXRyb2dyYWRlCiAgICAgICAgIG1Qb3NpdGlvbiArPSBkZWx0YTsKQEAgLTIzODAsOSArMjQwNywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBzcGVlZCAvKiwgMCBtTm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSovKTsKICAgICBjb25zdCBib29sIGFsbG93ZWQgPSBtRnJhbWVDb3VudCA+PSBtaW5GcmFtZUNvdW50OwogICAgIEFMT0dEX0lGKCFhbGxvd2VkLAotICAgICAgICAgICAgImlzU2FtcGxlUmF0ZVNwZWVkQWxsb3dlZF9sIGRlbmllZCAiCisgICAgICAgICAgICAiJXMoJWQpOiBkZW5pZWQgIgogICAgICAgICAgICAgIm1BZkxhdGVuY3k6JXUgIG1BZkZyYW1lQ291bnQ6JXp1ICBtQWZTYW1wbGVSYXRlOiV1ICBzYW1wbGVSYXRlOiV1ICBzcGVlZDolZiAiCiAgICAgICAgICAgICAibUZyYW1lQ291bnQ6JXp1IDwgbWluRnJhbWVDb3VudDolenUiLAorICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICBtQWZMYXRlbmN5LCBtQWZGcmFtZUNvdW50LCBtQWZTYW1wbGVSYXRlLCBzYW1wbGVSYXRlLCBzcGVlZCwKICAgICAgICAgICAgIG1GcmFtZUNvdW50LCBtaW5GcmFtZUNvdW50KTsKICAgICByZXR1cm4gYWxsb3dlZDsKQEAgLTI0MDAsNyArMjQyOCw4IEBACiAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwogICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlQcmVzZW50YXRpb25JZCksIHByZXNlbnRhdGlvbklkKTsKICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5UHJvZ3JhbUlkKSwgcHJvZ3JhbUlkKTsKLSAgICBBTE9HVigiUHJlc2VudGF0aW9uSWQvUHJvZ3JhbUlkWyVzXSIscGFyYW0udG9TdHJpbmcoKS5zdHJpbmcoKSk7CisgICAgQUxPR1YoIiVzKCVkKTogUHJlc2VudGF0aW9uSWQvUHJvZ3JhbUlkWyVzXSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgcGFyYW0udG9TdHJpbmcoKS5zdHJpbmcoKSk7CiAKICAgICByZXR1cm4gbUF1ZGlvVHJhY2stPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CiB9CkBAIC0yNDI3LDcgKzI0NTYsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIHdhcm4gb25seSBpZiBub3QgYW4gZXhwZWN0ZWQgcmVzdG9yZSBmYWlsdXJlLgogICAgICAgICBBTE9HV19JRighKChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSB8fCBtRG9Ob3RSZWNvbm5lY3QpICYmIHN0YXR1cyA9PSBERUFEX09CSkVDVCksCi0gICAgICAgICAgICAgICAgImFwcGx5Vm9sdW1lU2hhcGVyIGZhaWxlZDogJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICIlcyglZCk6IGFwcGx5Vm9sdW1lU2hhcGVyIGZhaWxlZDogJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTI0NjgsNyArMjQ5Nyw4IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgLy8gbm90IHN1cHBvcnRlZAogICAgIH0KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUHJveHktPmdldFRpbWVzdGFtcCh0aW1lc3RhbXApOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdHVzICE9IE9LLCAic3RhdHVzICVkIG5vdCBhbGxvd2VkIGZyb20gcHJveHkgZ2V0VGltZXN0YW1wIiwgc3RhdHVzKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0YXR1cyAhPSBPSywgIiVzKCVkKTogc3RhdHVzICVkIG5vdCBhbGxvd2VkIGZyb20gcHJveHkgZ2V0VGltZXN0YW1wIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMpOwogICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKICAgICB0aW1lc3RhbXAtPm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fQ0xJRU5UXSA9IG1GcmFtZXNXcml0dGVuOwogICAgIHRpbWVzdGFtcC0+bVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fQ0xJRU5UXSA9IDA7CkBAIC0yNTExLDcgKzI1NDEsOCBAQAogICAgICAgICB9CiAgICAgICAgIGJyZWFrOyAvLyBvZmZsb2FkZWQgdHJhY2tzIGhhbmRsZWQgYmVsb3cKICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJJbnZhbGlkIG1TdGF0ZSBpbiBnZXRUaW1lc3RhbXAoKTogJWQiLCBtU3RhdGUpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglZCk6IEludmFsaWQgbVN0YXRlIGluIGdldFRpbWVzdGFtcCgpOiAlZCIsCisgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVN0YXRlKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogCkBAIC0yNTQ1LDcgKzI1NzYsOCBAQAogICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBhZGp1c3QgdGhlIHBvc2l0aW9uIGZyb20gdGhlIHByZXZpb3VzIGNvbXB1dGVkIGxhdGVuY3kuCiAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uID09IEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVIpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1dfSUYobVByZXZpb3VzTG9jYXRpb24gPT0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0VGltZXN0YW1wKCkgbG9jYXRpb24gbW92ZWQgZnJvbSBrZXJuZWwgdG8gc2VydmVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVkKTogbG9jYXRpb24gbW92ZWQgZnJvbSBrZXJuZWwgdG8gc2VydmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIGxhc3Qga2VybmVsIE9LIHRpbWUgaW5mbyBleGlzdHMgYW5kIHRoZSBwb3NpdGlvbnMKICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHZhbGlkIChpZiB0aGV5IHByZWRhdGUgdGhlIGN1cnJlbnQgdHJhY2ssIHRoZSBwb3NpdGlvbnMgbWF5CiAgICAgICAgICAgICAgICAgICAgIC8vIGJlIHplcm8gb3IgbmVnYXRpdmUpLgpAQCAtMjU2MCw4ICsyNTkyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV0cy5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl9MQVNUS0VSTkVMT0tdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBldHMubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxfTEFTVEtFUk5FTE9LXSk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmcmFtZSBhZGp1c3RtZW50OiVsbGQgIHRpbWVzdGFtcDolcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylmcmFtZXMsIGV0cy50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBmcmFtZSBhZGp1c3RtZW50OiVsbGQgIHRpbWVzdGFtcDolcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIChsb25nIGxvbmcpZnJhbWVzLCBldHMudG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lcyA+PSBldHMubVBvc2l0aW9uW2xvY2F0aW9uXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0yNTY5LDcgKzI2MDEsOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhdGlvbiA9PSBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWX0lGKG1QcmV2aW91c0xvY2F0aW9uID09IEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFRpbWVzdGFtcCgpIGxvY2F0aW9uIG1vdmVkIGZyb20gc2VydmVyIHRvIGtlcm5lbCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglZCk6IGxvY2F0aW9uIG1vdmVkIGZyb20gc2VydmVyIHRvIGtlcm5lbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIFdlIHVwZGF0ZSB0aGUgdGltZXN0YW1wIHRpbWUgZXZlbiB3aGVuIHBhdXNlZC4KQEAgLTI1OTMsNyArMjYyNiw3IEBACiAgICAgICAgICAgICAgICAgbVByZXZpb3VzTG9jYXRpb24gPSBsb2NhdGlvbjsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gcmlnaHQgYWZ0ZXIgQXVkaW9UcmFjayBpcyBzdGFydGVkLCBvbmUgbWF5IG5vdCBmaW5kIGEgdGltZXN0YW1wCi0gICAgICAgICAgICAgICAgQUxPR1YoImdldEJlc3RUaW1lc3RhbXAgZGlkIG5vdCBmaW5kIHRpbWVzdGFtcCIpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IGdldEJlc3RUaW1lc3RhbXAgZGlkIG5vdCBmaW5kIHRpbWVzdGFtcCIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7CkBAIC0yNjAzLDcgKzI2MzYsOCBAQAogICAgICAgICAgICAgLy8gdG8gYmUgemVybyB3ZSBjb252ZXJ0IHRoaXMgdG8gV09VTERfQkxPQ0sgKHdpdGggdGhlIGltcGxpY2l0IG1lYW5pbmcgb2YKICAgICAgICAgICAgIC8vICJ6ZXJvIiBmb3IgTnVQbGF5ZXIpLiAgV2UgZG9uJ3QgY29udmVydCBmb3IgdHJhY2sgcmVzdG9yYXRpb24gYXMgcG9zaXRpb24KICAgICAgICAgICAgIC8vIGRvZXMgbm90IHJlc2V0LgotICAgICAgICAgICAgQUxPR1YoInRpbWVzdGFtcCBzZXJ2ZXIgb2Zmc2V0OiVsbGQgcmVzdG9yZSBmcmFtZXM6JWxsZCIsCisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiB0aW1lc3RhbXAgc2VydmVyIG9mZnNldDolbGxkIHJlc3RvcmUgZnJhbWVzOiVsbGQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldCwgKGxvbmcgbG9uZyltRnJhbWVzV3JpdHRlbkF0UmVzdG9yZSk7CiAgICAgICAgICAgICBpZiAobUZyYW1lc1dyaXR0ZW5TZXJ2ZXJPZmZzZXQgIT0gbUZyYW1lc1dyaXR0ZW5BdFJlc3RvcmUpIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBXT1VMRF9CTE9DSzsKQEAgLTI2MTEsNyArMjY0NSw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVl9JRihzdGF0dXMgIT0gV09VTERfQkxPQ0ssICJnZXRUaW1lc3RhbXAgZXJyb3I6JSN4Iiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR1ZfSUYoc3RhdHVzICE9IFdPVUxEX0JMT0NLLCAiJXMoJWQpOiBnZXRUaW1lc3RhbXAgZXJyb3I6JSN4IiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgewpAQCAtMjY1MCw4ICsyNjg0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIHN0YXJ0IHRpbWUuICBJZiBncmVhdGVyLCB0aGVuIHRoYXQgbWVhbnMgd2UgbWF5IGhhdmUgZmFpbGVkCiAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGNvbXBsZXRlbHkgZmx1c2ggb3Igc3RvcCB0aGUgcHJldmlvdXMgcGxheWluZyB0cmFjay4KICAgICAgICAgICAgICAgICAgICAgQUxPR1dfSUYoIW1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFRpbWVzdGFtcCBzdGFydHVwIGdsaXRjaCBkZXRlY3RlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJWQpOiBzdGFydHVwIGdsaXRjaCBkZXRlY3RlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRlbHRhVGltZVVzKCVsbGQpIGRlbHRhUG9zaXRpb25VcyglbGxkKSB0c21Qb3NpdGlvbigldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGVsdGFUaW1lVXMsIChsb25nIGxvbmcpZGVsdGFQb3NpdGlvbkJ5VXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQgPSB0cnVlOwpAQCAtMjcxOSw4ICsyNzU0LDkgQEAKICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbGFnTnMgPSBpbnQ2NF90KG1BZkxhdGVuY3kgKiAxMDAwMDAwTEwpOwogICAgICAgICAgICAgY29uc3QgaW50NjRfdCBsaW1pdE5zID0gbVN0YXJ0TnMgLSBsYWdOczsKICAgICAgICAgICAgIGlmIChjdXJyZW50VGltZU5hbm9zIDwgbGltaXROcykgewotICAgICAgICAgICAgICAgIEFMT0dEKCJjb3JyZWN0aW5nIHRpbWVzdGFtcCB0aW1lIGZvciBwYXVzZSwgIgorICAgICAgICAgICAgICAgIEFMT0dEKCIlcyglZCk6IGNvcnJlY3RpbmcgdGltZXN0YW1wIHRpbWUgZm9yIHBhdXNlLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAiY3VycmVudFRpbWVOYW5vczogJWxsZCA8IGxpbWl0TnM6ICVsbGQgPCBtU3RhcnROczogJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpY3VycmVudFRpbWVOYW5vcywgKGxvbmcgbG9uZylsaW1pdE5zLCAobG9uZyBsb25nKW1TdGFydE5zKTsKICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWUgPSBjb252ZXJ0TnNUb1RpbWVzcGVjKGxpbWl0TnMpOwogICAgICAgICAgICAgICAgIGN1cnJlbnRUaW1lTmFub3MgPSBsaW1pdE5zOwpAQCAtMjcyOCw3ICsyNzY0LDggQEAKIAogICAgICAgICAgICAgLy8gcmV0cm9ncmFkZSBjaGVjawogICAgICAgICAgICAgaWYgKGN1cnJlbnRUaW1lTmFub3MgPCBwcmV2aW91c1RpbWVOYW5vcykgewotICAgICAgICAgICAgICAgIEFMT0dXKCJyZXRyb2dyYWRlIHRpbWVzdGFtcCB0aW1lIGNvcnJlY3RlZCwgJWxsZCA8ICVsbGQiLAorICAgICAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IHJldHJvZ3JhZGUgdGltZXN0YW1wIHRpbWUgY29ycmVjdGVkLCAlbGxkIDwgJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpY3VycmVudFRpbWVOYW5vcywgKGxvbmcgbG9uZylwcmV2aW91c1RpbWVOYW5vcyk7CiAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lID0gbVByZXZpb3VzVGltZXN0YW1wLm1UaW1lOwogICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRUaW1lTmFub3Mgbm90IHVzZWQgYmVsb3cuCkBAIC0yNzQxLDcgKzI3NzgsOCBAQAogICAgICAgICAgICAgaWYgKGRlbHRhUG9zaXRpb24gPCAwKSB7CiAgICAgICAgICAgICAgICAgLy8gT25seSByZXBvcnQgb25jZSBwZXIgcG9zaXRpb24gaW5zdGVhZCBvZiBzcGFtbWluZyB0aGUgbG9nLgogICAgICAgICAgICAgICAgIGlmICghbVJldHJvZ3JhZGVNb3Rpb25SZXBvcnRlZCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygicmV0cm9ncmFkZSB0aW1lc3RhbXAgcG9zaXRpb24gY29ycmVjdGVkLCAlZCA9ICV1IC0gJXUiLAorICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiByZXRyb2dyYWRlIHRpbWVzdGFtcCBwb3NpdGlvbiBjb3JyZWN0ZWQsICVkID0gJXUgLSAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c1RpbWVzdGFtcC5tUG9zaXRpb24pOwpAQCAtMjc2MSw3ICsyNzk5LDggQEAKICAgICAgICAgICAgIGlmIChkZWx0YVRpbWUgIT0gMCkgewogICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgY29tcHV0ZWRTYW1wbGVSYXRlID0KICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhUG9zaXRpb24gKiAobG9uZyBsb25nKU5BTk9TX1BFUl9TRUNPTkQgLyBkZWx0YVRpbWU7Ci0gICAgICAgICAgICAgICAgQUxPR0QoImNvbXB1dGVkU2FtcGxlUmF0ZToldSAgc2FtcGxlUmF0ZToldSIsCisgICAgICAgICAgICAgICAgQUxPR0QoIiVzKCVkKTogY29tcHV0ZWRTYW1wbGVSYXRlOiV1ICBzYW1wbGVSYXRlOiV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKWNvbXB1dGVkU2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUpOwogICAgICAgICAgICAgfQogI2VuZGlmCkBAIC0yODA3LDExICsyODQ2LDEyIEBACiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKICAgICByZXN1bHQuYXBwZW5kKCIgQXVkaW9UcmFjazo6ZHVtcFxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBzdGF0dXMoJWQpLCBzdGF0ZSglZCksIHNlc3Npb24gSWQoJWQpLCBmbGFncyglI3gpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1cywgbVN0YXRlLCBtU2Vzc2lvbklkLCBtRmxhZ3MpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgaWQoJWQpIHN0YXR1cyglZCksIHN0YXRlKCVkKSwgc2Vzc2lvbiBJZCglZCksIGZsYWdzKCUjeClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtUG9ydElkLCBtU3RhdHVzLCBtU3RhdGUsIG1TZXNzaW9uSWQsIG1GbGFncyk7CiAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBzdHJlYW0gdHlwZSglZCksIGxlZnQgLSByaWdodCB2b2x1bWUoJWYsICVmKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIChtU3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKCZtQXR0cmlidXRlcykgOiBtU3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6YXR0cmlidXRlc1RvU3RyZWFtVHlwZShtQXR0cmlidXRlcykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX0xFRlRdLCBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfUklHSFRdKTsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGZvcm1hdCglI3gpLCBjaGFubmVsIG1hc2soJSN4KSwgY2hhbm5lbCBjb3VudCgldSlcbiIsCiAgICAgICAgICAgICAgICAgICBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1DaGFubmVsQ291bnQpOwpAQCAtMjg1MCwxOCArMjg5MCwxOCBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKQogewogICAgIGlmIChjYWxsYmFjayA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBhZGRpbmcgTlVMTCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HVygiJXMoJWQpOiBhZGRpbmcgTlVMTCBjYWxsYmFjayEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBpZiAobURldmljZUNhbGxiYWNrLnVuc2FmZV9nZXQoKSA9PSBjYWxsYmFjay5nZXQoKSkgewotICAgICAgICBBTE9HVygiJXMgYWRkaW5nIHNhbWUgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogYWRkaW5nIHNhbWUgY2FsbGJhY2shIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIGlmIChtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICAgICAgQUxPR1coIiVzIGNhbGxiYWNrIGFscmVhZHkgcHJlc2VudCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogY2FsbGJhY2sgYWxyZWFkeSBwcmVzZW50ISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1PdXRwdXQpOwogICAgICAgICB9CiAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1PdXRwdXQpOwpAQCAtMjg3NCw3ICsyOTE0LDcgQEAKICAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaykKIHsKICAgICBpZiAoY2FsbGJhY2sgPT0gMCkgewotICAgICAgICBBTE9HVygiJXMgcmVtb3ZpbmcgTlVMTCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HVygiJXMoJWQpOiByZW1vdmluZyBOVUxMIGNhbGxiYWNrISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwpAQCAtMjk4NSw3ICszMDI1LDcgQEAKICAgICBjYXNlIFNUQVRFX0ZMVVNIRUQ6CiAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIHdlJ3JlIG5vdCBhY3RpdmUKICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJJbnZhbGlkIG1TdGF0ZSBpbiBoYXNTdGFydGVkKCk6ICVkIiwgbVN0YXRlKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXMoJWQpOiBJbnZhbGlkIG1TdGF0ZSBpbiBoYXNTdGFydGVkKCk6ICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIG1TdGF0ZSk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtMzAwMSw3ICszMDQxLDggQEAKICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gT0spIHsKICAgICAgICAgICAgIHdhaXQgPSAodHMubVBvc2l0aW9uID09IDAgfHwgdHMubVBvc2l0aW9uID09IG1TdGFydFRzLm1Qb3NpdGlvbik7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoImhhc1N0YXJ0ZWQgd2FpdDolZCAgdHM6JXUgIHN0YXJ0IHBvc2l0aW9uOiVsbGQiLAorICAgICAgICBBTE9HVigiJXMoJWQpOiBoYXNTdGFydGVkIHdhaXQ6JWQgIHRzOiV1ICBzdGFydCBwb3NpdGlvbjolbGxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAoaW50KXdhaXQsCiAgICAgICAgICAgICAgICAgdHMubVBvc2l0aW9uLAogICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVN0YXJ0VHMubVBvc2l0aW9uKTsKQEAgLTMwMjIsNyArMzA2Myw4IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoImhhc1N0YXJ0ZWQgd2FpdDolZCAgZXRzOiVsbGQgIHN0YXJ0IHBvc2l0aW9uOiVsbGQiLAorICAgICAgICBBTE9HVigiJXMoJWQpOiBoYXNTdGFydGVkIHdhaXQ6JWQgIGV0czolbGxkICBzdGFydCBwb3NpdGlvbjolbGxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAoaW50KXdhaXQsCiAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylldHMubVBvc2l0aW9uW2xvY2F0aW9uXSwKICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1TdGFydEV0cy5tUG9zaXRpb25bbG9jYXRpb25dKTsKQEAgLTMwNDMsOCArMzA4NSw5IEBACiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotQXVkaW9UcmFjazo6QXVkaW9UcmFja1RocmVhZDo6QXVkaW9UcmFja1RocmVhZChBdWRpb1RyYWNrJiByZWNlaXZlciwgYm9vbCBiQ2FuQ2FsbEphdmEpCi0gICAgOiBUaHJlYWQoYkNhbkNhbGxKYXZhKSwgbVJlY2VpdmVyKHJlY2VpdmVyKSwgbVBhdXNlZCh0cnVlKSwgbVBhdXNlZEludChmYWxzZSksIG1QYXVzZWROcygwTEwpLAorQXVkaW9UcmFjazo6QXVkaW9UcmFja1RocmVhZDo6QXVkaW9UcmFja1RocmVhZChBdWRpb1RyYWNrJiByZWNlaXZlcikKKyAgICA6IFRocmVhZCh0cnVlIC8qIGJDYW5DYWxsSmF2YSAqLykgIC8vIGJpbmRlciByZWN1cnNpb24gb24gcmVzdG9yZVRyYWNrX2woKSBtYXkgY2FsbCBKYXZhLgorICAgICwgbVJlY2VpdmVyKHJlY2VpdmVyKSwgbVBhdXNlZCh0cnVlKSwgbVBhdXNlZEludChmYWxzZSksIG1QYXVzZWROcygwTEwpLAogICAgICAgbUlnbm9yZU5leHRQYXVzZWRJbnQoZmFsc2UpCiB7CiB9CkBAIC0zMDk3LDcgKzMxNDAsOCBAQAogICAgICAgICBucyA9IElOVDY0X01BWDsKICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihucyA8IDAsICJwcm9jZXNzQXVkaW9CdWZmZXIoKSByZXR1cm5lZCAlIiBQUklkNjQsIG5zKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihucyA8IDAsICIlcyglZCk6IHByb2Nlc3NBdWRpb0J1ZmZlcigpIHJldHVybmVkICVsbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUmVjZWl2ZXIubVBvcnRJZCwgKGxvbmcgbG9uZylucyk7CiAgICAgICAgIHBhdXNlSW50ZXJuYWwobnMpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwCmluZGV4IDAxZjQwMGQuLmM5OTdjZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwCkBAIC0yNiw2ICsyNiwyNCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKKy8vIFRPRE86IGNvbnNpZGVyIHB1bGxpbmcgdGhpcyBpbnRvIGEgc2hhcmVkIGhlYWRlci4KKy8vIHNhZmVfc3ViX292ZXJmbG93IGlzIHVzZWQgZW5zdXJlIHRoYXQgc3VidHJhY3Rpb24gb2NjdXJzIGluIHRoZSBzYW1lIG5hdGl2ZSB0eXBlCisvLyB3aXRoIHByb3BlciAyJ3MgY29tcGxlbWVudCBvdmVyZmxvdy4gIFdpdGhvdXQgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCBpdCBpcyBwb3NzaWJsZSwKKy8vIGZvciBleGFtcGxlLCB0aGF0IG9wdGltaXppbmcgY29tcGlsZXJzIG1heSBlbGVjdCB0byB0cmVhdCAzMiBiaXQgc3VidHJhY3Rpb24KKy8vIGFzIDY0IGJpdCBzdWJ0cmFjdGlvbiB3aGVuIHN0b3JpbmcgaW50byBhIDY0IGJpdCBkZXN0aW5hdGlvbiBhcyBpbnRlZ2VyIG92ZXJmbG93IGlzCisvLyB0ZWNobmljYWxseSB1bmRlZmluZWQuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULAorICAgICAgICAgdHlwZW5hbWUgVSwKKyAgICAgICAgIHR5cGVuYW1lID0gc3RkOjplbmFibGVfaWZfdDxzdGQ6OmlzX3NhbWU8c3RkOjpkZWNheV90PFQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpkZWNheV90PFU+Pnt9Pj4KKyAgICAgICAgIC8vIGVuc3VyZSBhcmd1bWVudHMgYXJlIHNhbWUgdHlwZSAoaWdub3Jpbmcgdm9sYXRpbGUsIHdoaWNoIGlzIHVzZWQgaW4gY2JsayB2YXJpYWJsZXMpLgorYXV0byBzYWZlX3N1Yl9vdmVyZmxvdyhjb25zdCBUJiBhLCBjb25zdCBVJiBiKSB7CisgICAgc3RkOjpkZWNheV90PFQ+IHJlc3VsdDsKKyAgICAodm9pZClfX2J1aWx0aW5fc3ViX292ZXJmbG93KGEsIGIsICZyZXN1bHQpOworICAgIC8vIG5vdGUgaWYgX19idWlsdGluX3N1Yl9vdmVyZmxvdyByZXR1cm5zIHRydWUsIGFuIG92ZXJmbG93IG9jY3VycmVkLgorICAgIHJldHVybiByZXN1bHQ7Cit9CisKIC8vIHVzZWQgdG8gY2xhbXAgYSB2YWx1ZSB0byBzaXplX3QuICBUT0RPOiBtb3ZlIHRvIGFub3RoZXIgZmlsZS4KIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogc2l6ZV90IGNsYW1wVG9TaXplKFQgeCkgewpAQCAtMTg2LDcgKzIwNCw3IEBACiAgICAgICAgICAgICBmcm9udCA9IGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQ7CiAgICAgICAgIH0KICAgICAgICAgLy8gd3JpdGUgdG8gcmVhciwgcmVhZCBmcm9tIGZyb250Ci0gICAgICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGZyb250OworICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IHNhZmVfc3ViX292ZXJmbG93KHJlYXIsIGZyb250KTsKICAgICAgICAgLy8gcGlwZSBzaG91bGQgbm90IGJlIG92ZXJmdWxsCiAgICAgICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKICAgICAgICAgICAgIGlmIChtSXNPdXQpIHsKQEAgLTY4NCw3ICs3MDIsNyBAQAogICAgICAgICBjb25zdCBzaXplX3Qgb3ZlcmZsb3dCaXQgPSBtRnJhbWVDb3VudFAyIDw8IDE7CiAgICAgICAgIGNvbnN0IHNpemVfdCBtYXNrID0gb3ZlcmZsb3dCaXQgLSAxOwogICAgICAgICBpbnQzMl90IG5ld0Zyb250ID0gKGZyb250ICYgfm1hc2spIHwgKGZsdXNoICYgbWFzayk7Ci0gICAgICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIG5ld0Zyb250OworICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IHNhZmVfc3ViX292ZXJmbG93KHJlYXIsIG5ld0Zyb250KTsKICAgICAgICAgaWYgKGZpbGxlZCA+PSAoc3NpemVfdClvdmVyZmxvd0JpdCkgewogICAgICAgICAgICAgLy8gZnJvbnQgYW5kIHJlYXIgb2Zmc2V0cyBzcGFuIHRoZSBvdmVyZmxvdyBiaXQgb2YgdGhlIHAyIG1hc2sKICAgICAgICAgICAgIC8vIHNvIHJlYmFzaW5nIG5ld0Zyb250IG9uIHRoZSBmcm9udCBvZmZzZXQgaXMgb2ZmIGJ5IHRoZSBvdmVyZmxvdyBiaXQuCkBAIC03MjYsNyArNzQ0LDcgQEAKICAgICAgICAgY29uc3Qgc2l6ZV90IG92ZXJmbG93Qml0ID0gbUZyYW1lQ291bnRQMiA8PCAxOwogICAgICAgICBjb25zdCBzaXplX3QgbWFzayA9IG92ZXJmbG93Qml0IC0gMTsKICAgICAgICAgaW50MzJfdCBuZXdSZWFyID0gKHJlYXIgJiB+bWFzaykgfCAoc3RvcCAmIG1hc2spOwotICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IG5ld1JlYXIgLSBmcm9udDsKKyAgICAgICAgc3NpemVfdCBmaWxsZWQgPSBzYWZlX3N1Yl9vdmVyZmxvdyhuZXdSZWFyLCBmcm9udCk7CiAgICAgICAgIC8vIG92ZXJmbG93Qml0IGlzIHVuc2lnbmVkLCBzbyBjYXN0IHRvIHNpZ25lZCBmb3IgY29tcGFyaXNvbi4KICAgICAgICAgaWYgKGZpbGxlZCA+PSAoc3NpemVfdClvdmVyZmxvd0JpdCkgewogICAgICAgICAgICAgLy8gZnJvbnQgYW5kIHJlYXIgb2Zmc2V0cyBzcGFuIHRoZSBvdmVyZmxvdyBiaXQgb2YgdGhlIHAyIG1hc2sKQEAgLTc3OCw3ICs3OTYsNyBAQAogICAgICAgICBmcm9udCA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udCk7CiAgICAgICAgIHJlYXIgPSBjYmxrLT51Lm1TdHJlYW1pbmcubVJlYXI7CiAgICAgfQotICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGZyb250OworICAgIHNzaXplX3QgZmlsbGVkID0gc2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgZnJvbnQpOwogICAgIC8vIHBpcGUgc2hvdWxkIG5vdCBhbHJlYWR5IGJlIG92ZXJmdWxsCiAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewogICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lemQsIG1GcmFtZUNvdW50PSV6dSk7IHNodXR0aW5nIGRvd24iLApAQCAtOTA1LDcgKzkyMyw3IEBACiAgICAgICAgIHJldHVybiBtRnJhbWVDb3VudDsKICAgICB9CiAgICAgY29uc3QgaW50MzJfdCByZWFyID0gZ2V0UmVhcigpOwotICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQ7CisgICAgc3NpemVfdCBmaWxsZWQgPSBzYWZlX3N1Yl9vdmVyZmxvdyhyZWFyLCBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250KTsKICAgICAvLyBwaXBlIHNob3VsZCBub3QgYWxyZWFkeSBiZSBvdmVyZnVsbAogICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKICAgICAgICAgQUxPR0UoIlNoYXJlZCBtZW1vcnkgY29udHJvbCBibG9jayBpcyBjb3JydXB0IChmaWxsZWQ9JXpkLCBtRnJhbWVDb3VudD0lenUpOyBzaHV0dGluZyBkb3duIiwKQEAgLTkzMSw3ICs5NDksNyBAQAogICAgICAgICByZXR1cm4gbUZyYW1lQ291bnQ7CiAgICAgfQogICAgIGNvbnN0IGludDMyX3QgcmVhciA9IGdldFJlYXIoKTsKLSAgICBjb25zdCBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250OworICAgIGNvbnN0IHNzaXplX3QgZmlsbGVkID0gc2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udCk7CiAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewogICAgICAgICByZXR1cm4gMDsgLy8gZXJyb3IgY29uZGl0aW9uLCBzaWxlbnRseSByZXR1cm4gMC4KICAgICB9CkBAIC0xMjMzLDYgKzEyNTEsMjEgQEAKICAgICByZXR1cm4gMDsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCitzaXplX3QgQXVkaW9SZWNvcmRTZXJ2ZXJQcm94eTo6ZnJhbWVzUmVhZHlTYWZlKCkgY29uc3QKK3sKKyAgICBpZiAobUlzU2h1dGRvd24pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGNvbnN0IGludDMyX3QgZnJvbnQgPSBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJm1DYmxrLT51Lm1TdHJlYW1pbmcubUZyb250KTsKKyAgICBjb25zdCBpbnQzMl90IHJlYXIgPSBtQ2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyOworICAgIGNvbnN0IHNzaXplX3QgZmlsbGVkID0gc2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgZnJvbnQpOworICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKKyAgICAgICAgcmV0dXJuIDA7IC8vIGVycm9yIGNvbmRpdGlvbiwgc2lsZW50bHkgcmV0dXJuIDAuCisgICAgfQorICAgIHJldHVybiBmaWxsZWQ7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVm9sdW1lR3JvdXAuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Wb2x1bWVHcm91cC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc5YTM2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVm9sdW1lR3JvdXAuY3BwCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvVm9sdW1lR3JvdXAiCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBBdWRpb1ZvbHVtZUdyb3VwOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkKK3sKKyAgICBzdGF0dXNfdCByZXQgPSBwYXJjZWwtPnJlYWRVdGY4RnJvbVV0ZjE2KCZtTmFtZSk7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBtR3JvdXBJZCA9IHN0YXRpY19jYXN0PHZvbHVtZV9ncm91cF90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKKyAgICBzaXplX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZTsKKyAgICAgICAgYXR0cmlidXRlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgbUF1ZGlvQXR0cmlidXRlcy5wdXNoX2JhY2soYXR0cmlidXRlLmdldEF0dHJpYnV0ZXMoKSk7CisgICAgfQorICAgIHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgICAgIG1TdHJlYW1zLnB1c2hfYmFjayhzdHJlYW0pOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvVm9sdW1lR3JvdXA6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0Cit7CisgICAgcGFyY2VsLT53cml0ZVV0ZjhBc1V0ZjE2KG1OYW1lKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUdyb3VwSWQpKTsKKyAgICBzaXplX3Qgc2l6ZSA9IG1BdWRpb0F0dHJpYnV0ZXMuc2l6ZSgpOworICAgIHNpemVfdCBzaXplUG9zaXRpb24gPSBwYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzaXplKTsKKyAgICBzaXplX3QgZmluYWxTaXplID0gc2l6ZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHJpYnV0ZXMgOiBtQXVkaW9BdHRyaWJ1dGVzKSB7CisgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IHBhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgICAgICAgIEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGUoYXR0cmlidXRlcyk7CisgICAgICAgIHN0YXR1c190IHJldCA9IGF0dHJpYnV0ZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHBhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGZpbmFsU2l6ZS0tOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzaXplICE9IGZpbmFsU2l6ZSkgeworICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBwYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICAgICAgICBwYXJjZWwtPnNldERhdGFQb3NpdGlvbihzaXplUG9zaXRpb24pOworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoZmluYWxTaXplKTsKKyAgICAgICAgcGFyY2VsLT5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgIH0KKyAgICBwYXJjZWwtPndyaXRlSW50MzIobVN0cmVhbXMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmVhbSA6IG1TdHJlYW1zKSB7CisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihzdHJlYW0pKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDlmM2I3NDIuLjgyNWNkNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCkBAIC0yNCwxMCArMjQsOCBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9UaW1lQ2hlY2suaD4KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KLQorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgIklBdWRpb0ZsaW5nZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtODksNiArODcsOCBAQAogICAgIFNZU1RFTV9SRUFEWSwKICAgICBGUkFNRV9DT1VOVF9IQUwsCiAgICAgR0VUX01JQ1JPUEhPTkVTLAorICAgIFNFVF9NQVNURVJfQkFMQU5DRSwKKyAgICBHRVRfTUFTVEVSX0JBTEFOQ0UsCiB9OwogCiAjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CkBAIC0yNDQsNiArMjQ0LDM0IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpIG92ZXJyaWRlCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlRmxvYXQoYmFsYW5jZSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTUFTVEVSX0JBTEFOQ0UsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKworICAgIHN0YXR1c190IGdldE1hc3RlckJhbGFuY2UoZmxvYXQgKmJhbGFuY2UpIGNvbnN0IG92ZXJyaWRlCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX01BU1RFUl9CQUxBTkNFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICAqYmFsYW5jZSA9IHJlcGx5LnJlYWRGbG9hdCgpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGZsb2F0IHZhbHVlLAogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQogICAgIHsKQEAgLTYwMCwxNCArNjI4LDE4IEBACiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBVdWlkLAotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIGNvbnN0CiAgICAgewotICAgICAgICBpZiAocFV1aWQgPT0gTlVMTCB8fCBwRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIGlmIChwVXVpZCA9PSBOVUxMIHx8IHBUeXBlID09IE5VTEwgfHwgcERlc2NyaXB0b3IgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlKHBVdWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlKHBUeXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlVWludDMyKHByZWZlcnJlZFR5cGVGbGFnKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9FRkZFQ1RfREVTQ1JJUFRPUiwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTYzNiwxMCArNjY4LDEwIEBACiAgICAgICAgIHNwPElFZmZlY3Q+IGVmZmVjdDsKIAogICAgICAgICBpZiAocERlc2MgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGVmZmVjdDsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICpzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZWZmZWN0OwogICAgICAgICB9CiAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC05MTIsNyArOTQ0LDcgQEAKICAgICAgICAgY2FzZSBTRVRfTUlDX01VVEU6CiAgICAgICAgIGNhc2UgU0VUX0xPV19SQU1fREVWSUNFOgogICAgICAgICBjYXNlIFNZU1RFTV9SRUFEWTogewotICAgICAgICAgICAgaWYgKG11bHRpdXNlcl9nZXRfYXBwX2lkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkgPj0gQUlEX0FQUF9TVEFSVCkgeworICAgICAgICAgICAgaWYgKCFpc1NlcnZpY2VVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICAgICAgICAgIEFMT0dXKCIlczogdHJhbnNhY3Rpb24gJWQgcmVjZWl2ZWQgZnJvbSBQSUQgJWQgdW5hdXRob3JpemVkIFVJRCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvZGUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwpAQCAtOTUxLDkgKzk4Myw4IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBjaGFyIHRpbWVDaGVja1N0cmluZ1s2NF07Ci0gICAgc25wcmludGYodGltZUNoZWNrU3RyaW5nLCBzaXplb2YodGltZUNoZWNrU3RyaW5nKSwgIklBdWRpb0ZsaW5nZXI6ICVkIiwgY29kZSk7Ci0gICAgVGltZUNoZWNrIGNoZWNrKHRpbWVDaGVja1N0cmluZyk7CisgICAgc3RkOjpzdHJpbmcgdGFnKCJJQXVkaW9GbGluZ2VyIGNvbW1hbmQgIiArIHN0ZDo6dG9fc3RyaW5nKGNvZGUpKTsKKyAgICBUaW1lQ2hlY2sgY2hlY2sodGFnLmNfc3RyKCkpOwogCiAgICAgc3dpdGNoIChjb2RlKSB7CiAgICAgICAgIGNhc2UgQ1JFQVRFX1RSQUNLOiB7CkBAIC0xMDQ5LDYgKzEwODAsMjEgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBtYXN0ZXJNdXRlKCkgKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfTUFTVEVSX0JBTEFOQ0U6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggc2V0TWFzdGVyQmFsYW5jZShkYXRhLnJlYWRGbG9hdCgpKSApOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEdFVF9NQVNURVJfQkFMQU5DRTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGZsb2F0IGY7CisgICAgICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBnZXRNYXN0ZXJCYWxhbmNlKCZmKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KXN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpcmVwbHktPndyaXRlRmxvYXQoZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU0VUX1NUUkVBTV9WT0xVTUU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBpbnQgc3RyZWFtID0gZGF0YS5yZWFkSW50MzIoKTsKQEAgLTEyODAsOCArMTMyNiwxMSBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKICAgICAgICAgICAgIGRhdGEucmVhZCgmdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmdHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnID0gZGF0YS5yZWFkVWludDMyKCk7CiAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2MgPSB7fTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEVmZmVjdERlc2NyaXB0b3IoJnV1aWQsICZkZXNjKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEVmZmVjdERlc2NyaXB0b3IoJnV1aWQsICZ0eXBlLCBwcmVmZXJyZWRUeXBlRmxhZywgJmRlc2MpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IDhjZDRhODUuLjNiYWM0NGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC0yNCwxMSArMjQsMTAgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvVGltZUNoZWNrLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTUyLDYgKzUxLDEwIEBACiAgICAgSU5JVF9TVFJFQU1fVk9MVU1FLAogICAgIFNFVF9TVFJFQU1fVk9MVU1FLAogICAgIEdFVF9TVFJFQU1fVk9MVU1FLAorICAgIFNFVF9WT0xVTUVfQVRUUklCVVRFUywKKyAgICBHRVRfVk9MVU1FX0FUVFJJQlVURVMsCisgICAgR0VUX01JTl9WT0xVTUVfRk9SX0FUVFJJQlVURVMsCisgICAgR0VUX01BWF9WT0xVTUVfRk9SX0FUVFJJQlVURVMsCiAgICAgR0VUX1NUUkFURUdZX0ZPUl9TVFJFQU0sCiAgICAgR0VUX09VVFBVVF9GT1JfRUZGRUNULAogICAgIFJFR0lTVEVSX0VGRkVDVCwKQEAgLTYzLDYgKzY2LDcgQEAKICAgICBTRVRfRUZGRUNUX0VOQUJMRUQsCiAgICAgSVNfU1RSRUFNX0FDVElWRV9SRU1PVEVMWSwKICAgICBJU19PRkZMT0FEX1NVUFBPUlRFRCwKKyAgICBJU19ESVJFQ1RfT1VUUFVUX1NVUFBPUlRFRCwKICAgICBMSVNUX0FVRElPX1BPUlRTLAogICAgIEdFVF9BVURJT19QT1JULAogICAgIENSRUFURV9BVURJT19QQVRDSCwKQEAgLTc4LDExICs4MiwyNiBAQAogICAgIFNUQVJUX0FVRElPX1NPVVJDRSwKICAgICBTVE9QX0FVRElPX1NPVVJDRSwKICAgICBTRVRfQVVESU9fUE9SVF9DQUxMQkFDS19FTkFCTEVELAorICAgIFNFVF9BVURJT19WT0xVTUVfR1JPVVBfQ0FMTEJBQ0tfRU5BQkxFRCwKICAgICBTRVRfTUFTVEVSX01PTk8sCiAgICAgR0VUX01BU1RFUl9NT05PLAogICAgIEdFVF9TVFJFQU1fVk9MVU1FX0RCLAogICAgIEdFVF9TVVJST1VORF9GT1JNQVRTLAotICAgIFNFVF9TVVJST1VORF9GT1JNQVRfRU5BQkxFRAorICAgIFNFVF9TVVJST1VORF9GT1JNQVRfRU5BQkxFRCwKKyAgICBBRERfU1RSRUFNX0RFRkFVTFRfRUZGRUNULAorICAgIFJFTU9WRV9TVFJFQU1fREVGQVVMVF9FRkZFQ1QsCisgICAgQUREX1NPVVJDRV9ERUZBVUxUX0VGRkVDVCwKKyAgICBSRU1PVkVfU09VUkNFX0RFRkFVTFRfRUZGRUNULAorICAgIFNFVF9BU1NJU1RBTlRfVUlELAorICAgIFNFVF9BMTFZX1NFUlZJQ0VTX1VJRFMsCisgICAgSVNfSEFQVElDX1BMQVlCQUNLX1NVUFBPUlRFRCwKKyAgICBTRVRfVUlEX0RFVklDRV9BRkZJTklUWSwKKyAgICBSRU1PVkVfVUlEX0RFVklDRV9BRkZJTklUWSwKKyAgICBHRVRfT0ZGTE9BRF9GT1JNQVRTX0EyRFAsCisgICAgTElTVF9BVURJT19QUk9EVUNUX1NUUkFURUdJRVMsCisgICAgR0VUX1NUUkFURUdZX0ZPUl9BVFRSSUJVVEVTLAorICAgIExJU1RfQVVESU9fVk9MVU1FX0dST1VQUywKKyAgICBHRVRfVk9MVU1FX0dST1VQX0ZPUl9BVFRSSUJVVEVTCiB9OwogCiAjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CkBAIC05OSw3ICsxMTgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtMTA3LDYgKzEyNyw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXRlKSk7CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKGRldmljZV9hZGRyZXNzKTsKICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcoZGV2aWNlX25hbWUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihlbmNvZGVkRm9ybWF0KSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEUsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQpAQCAtMTI1LDEzICsxNDYsMTUgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGRldmljZSkpOwogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhkZXZpY2VfYWRkcmVzcyk7CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKGRldmljZV9uYW1lKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZW5jb2RlZEZvcm1hdCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSEFORExFX0RFVklDRV9DT05GSUdfQ0hBTkdFLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KQEAgLTE3MywxNiArMTk2LDE3IEBACiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCisgICAgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKSBvdmVycmlkZQogICAgICAgICB7CiAgICAgICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTIwOCw2ICsyMzIsMTAgQEAKICAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0ciBOVUxMIHBvcnRJZCAtIHNob3VsZG4ndCBoYXBwZW4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlY29uZGFyeU91dHB1dHMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyIE5VTEwgc2Vjb25kYXJ5T3V0cHV0cyAtIHNob3VsZG4ndCBoYXBwZW4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGF0dHIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0yNDIsNDQgKzI3MCwzNCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgICpwb3J0SWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICBzZWNvbmRhcnlPdXRwdXRzLT5yZXNpemUocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWQoc2Vjb25kYXJ5T3V0cHV0cy0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5T3V0cHV0cy0+c2l6ZSgpICogc2l6ZW9mKGF1ZGlvX2lvX2hhbmRsZV90KSk7CiAgICAgICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG91dHB1dCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc3RyZWFtKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzZXNzaW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXBvcnRJZCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9PVVRQVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihvdXRwdXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHN0cmVhbSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClwb3J0SWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUF9PVVRQVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG91dHB1dCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClzdHJlYW0pOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpc2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClwb3J0SWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9PVVRQVVQsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCkBAIC0zMzYsMTYgKzM1NCwxMyBAQAogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzaWxlbmNlZCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydElkKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKCpzaWxlbmNlZCA/IDEgOiAwKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUQVJUX0lOUFVULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICpzaWxlbmNlZCA9IHJlcGx5LnJlYWRJbnQzMigpID09IDE7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCkBAIC00MDcsMTMgKzQyMiw3NyBAQAogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbmRleCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGRldmljZSkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1ZPTFVNRV9BVFRSSUJVVEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50ICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihkZXZpY2UpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9WT0xVTUVfQVRUUklCVVRFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTUlOX1ZPTFVNRV9GT1JfQVRUUklCVVRFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTUFYX1ZPTFVNRV9GT1JfQVRUUklCVVRFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RyZWFtKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU1RSQVRFR1lfRk9SX1NUUkVBTSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZFVpbnQzMigpOwogICAgIH0KIAogICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCkBAIC01MzMsNiArNjEyLDE2IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIGJvb2wgaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX2Jhc2VfdCkpOworICAgICAgICBkYXRhLndyaXRlKCZhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChJU19ESVJFQ1RfT1VUUFVUX1NVUFBPUlRFRCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSBOT19FUlJPUiA/IHN0YXRpY19jYXN0PGJvb2w+KHJlcGx5LnJlYWRJbnQzMigpKSA6IGZhbHNlOworICAgIH0KKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKQEAgLTY3NCw2ICs3NjMsMTQgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BVURJT19QT1JUX0NBTExCQUNLX0VOQUJMRUQsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCisgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihlbmFibGVkID8gMSA6IDApOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0FVRElPX1ZPTFVNRV9HUk9VUF9DQUxMQkFDS19FTkFCTEVELCBkYXRhLCAmcmVwbHkpOworICAgIH0KKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKQpAQCAtNzUzLDExICs4NTAsMTEgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBpZiAoc291cmNlID09IE5VTEwgfHwgYXR0cmlidXRlcyA9PSBOVUxMIHx8IGhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCB8fCBhdHRyaWJ1dGVzID09IE5VTEwgfHwgcG9ydElkID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgZGF0YS53cml0ZShzb3VyY2UsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcpKTsKQEAgLTc3MCwxNSArODY3LDE1IEBACiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KLSAgICAgICAgKmhhbmRsZSA9IChhdWRpb19wYXRjaF9oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgKnBvcnRJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihoYW5kbGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydElkKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNUT1BfQVVESU9fU09VUkNFLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwpAQCAtODc5LDYgKzk3NiwyNzkgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cykKKyAgICB7CisgICAgICAgIGlmIChmb3JtYXRzID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX09GRkxPQURfRk9STUFUU19BMkRQLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8IChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGxpc3Rfc2l6ZSA9IHJlcGx5LnJlYWRVaW50MzIoKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3Rfc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBmb3JtYXRzLT5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KHJlcGx5LnJlYWRJbnQzMigpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworCisgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSh0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYob3BQYWNrYWdlTmFtZSk7CisgICAgICAgIGRhdGEud3JpdGUodXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHByaW9yaXR5KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSB1c2FnZSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChBRERfU1RSRUFNX0RFRkFVTFRfRUZGRUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgKmlkID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGlkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTU9WRV9TVFJFQU1fREVGQVVMVF9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSh0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYob3BQYWNrYWdlTmFtZSk7CisgICAgICAgIGRhdGEud3JpdGUodXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHByaW9yaXR5KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzb3VyY2UpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQUREX1NPVVJDRV9ERUZBVUxUX0VGRkVDVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgICppZCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihpZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfU09VUkNFX0RFRkFVTFRfRUZGRUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHVpZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQVNTSVNUQU5UX1VJRCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIodWlkcy5zaXplKCkpOworICAgICAgICBmb3IgKGF1dG8gdWlkIDogdWlkcykgeworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHVpZCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BMTFZX1NFUlZJQ0VTX1VJRFMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoSVNfSEFQVElDX1BMQVlCQUNLX1NVUFBPUlRFRCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkQm9vbCgpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSB1aWQpOworICAgICAgICBzaXplX3Qgc2l6ZSA9IGRldmljZXMuc2l6ZSgpOworICAgICAgICBzaXplX3Qgc2l6ZVBvc2l0aW9uID0gZGF0YS5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzaXplKTsKKyAgICAgICAgc2l6ZV90IGZpbmFsU2l6ZSA9IHNpemU7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBkYXRhLmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgaWYgKGRldmljZXNbaV0ud3JpdGVUb1BhcmNlbCgmZGF0YSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBkYXRhLnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgZmluYWxTaXplLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgIT0gZmluYWxTaXplKSB7CisgICAgICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBkYXRhLmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgZGF0YS5zZXREYXRhUG9zaXRpb24oc2l6ZVBvc2l0aW9uKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmaW5hbFNpemUpOworICAgICAgICAgICAgZGF0YS5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9VSURfREVWSUNFX0FGRklOSVRZLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSB1aWQpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX1VJRF9ERVZJQ0VfQUZGSU5JVFksIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCkgcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9BVURJT19QUk9EVUNUX1NUUkFURUdJRVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogcGVybWlzc2lvbiBkZW5pZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgdWludDMyX3QgbnVtU3RyYXRlZ2llcyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3RyYXRlZ2llczsgaSsrKSB7CisgICAgICAgICAgICBBdWRpb1Byb2R1Y3RTdHJhdGVneSBzdHJhdGVneTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHN0cmF0ZWd5LnJlYWRGcm9tUGFyY2VsKCZyZXBseSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gcmVhZCBzdHJhdGVnaWVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBzdHJhdGVnaWVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmF0ZWdpZXMucHVzaF9iYWNrKHN0cmF0ZWd5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5KQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWEud3JpdGVUb1BhcmNlbCgmZGF0YSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9TVFJBVEVHWV9GT1JfQVRUUklCVVRFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHByb2R1Y3RTdHJhdGVneSA9IHN0YXRpY19jYXN0PHByb2R1Y3Rfc3RyYXRlZ3lfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9BVURJT19WT0xVTUVfR1JPVVBTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgdWludDMyX3QgbnVtR3JvdXBzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1Hcm91cHM7IGkrKykgeworICAgICAgICAgICAgQXVkaW9Wb2x1bWVHcm91cCBncm91cDsKKyAgICAgICAgICAgIHN0YXR1cyA9IGdyb3VwLnJlYWRGcm9tUGFyY2VsKCZyZXBseSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gcmVhZCB2b2x1bWUgZ3JvdXBzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBncm91cHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ3JvdXBzLnB1c2hfYmFjayhncm91cCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgJnZvbHVtZUdyb3VwKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWEud3JpdGVUb1BhcmNlbCgmZGF0YSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9WT0xVTUVfR1JPVVBfRk9SX0FUVFJJQlVURVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICB2b2x1bWVHcm91cCA9IHN0YXRpY19jYXN0PHZvbHVtZV9ncm91cF90PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQXVkaW9Qb2xpY3lTZXJ2aWNlLCAiYW5kcm9pZC5tZWRpYS5JQXVkaW9Qb2xpY3lTZXJ2aWNlIik7CkBAIC04OTcsNyArMTI2Nyw2IEBACiAgICAgICAgIGNhc2UgU1RBUlRfSU5QVVQ6CiAgICAgICAgIGNhc2UgU1RPUF9JTlBVVDoKICAgICAgICAgY2FzZSBSRUxFQVNFX0lOUFVUOgotICAgICAgICBjYXNlIEdFVF9TVFJBVEVHWV9GT1JfU1RSRUFNOgogICAgICAgICBjYXNlIEdFVF9PVVRQVVRfRk9SX0VGRkVDVDoKICAgICAgICAgY2FzZSBSRUdJU1RFUl9FRkZFQ1Q6CiAgICAgICAgIGNhc2UgVU5SRUdJU1RFUl9FRkZFQ1Q6CkBAIC05MzIsMTEgKzEzMDEsMTYgQEAKICAgICAgICAgY2FzZSBTRVRfU1RSRUFNX1ZPTFVNRToKICAgICAgICAgY2FzZSBSRUdJU1RFUl9QT0xJQ1lfTUlYRVM6CiAgICAgICAgIGNhc2UgU0VUX01BU1RFUl9NT05POgotICAgICAgICBjYXNlIFNUQVJUX0FVRElPX1NPVVJDRToKLSAgICAgICAgY2FzZSBTVE9QX0FVRElPX1NPVVJDRToKICAgICAgICAgY2FzZSBHRVRfU1VSUk9VTkRfRk9STUFUUzoKLSAgICAgICAgY2FzZSBTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQ6IHsKLSAgICAgICAgICAgIGlmIChtdWx0aXVzZXJfZ2V0X2FwcF9pZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpID49IEFJRF9BUFBfU1RBUlQpIHsKKyAgICAgICAgY2FzZSBTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQ6CisgICAgICAgIGNhc2UgU0VUX0FTU0lTVEFOVF9VSUQ6CisgICAgICAgIGNhc2UgU0VUX0ExMVlfU0VSVklDRVNfVUlEUzoKKyAgICAgICAgY2FzZSBTRVRfVUlEX0RFVklDRV9BRkZJTklUWToKKyAgICAgICAgY2FzZSBSRU1PVkVfVUlEX0RFVklDRV9BRkZJTklUWToKKyAgICAgICAgY2FzZSBHRVRfT0ZGTE9BRF9GT1JNQVRTX0EyRFA6CisgICAgICAgIGNhc2UgTElTVF9BVURJT19WT0xVTUVfR1JPVVBTOgorICAgICAgICBjYXNlIEdFVF9WT0xVTUVfR1JPVVBfRk9SX0FUVFJJQlVURVM6IHsKKyAgICAgICAgICAgIGlmICghaXNTZXJ2aWNlVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IHRyYW5zYWN0aW9uICVkIHJlY2VpdmVkIGZyb20gUElEICVkIHVuYXV0aG9yaXplZCBVSUQgJWQiLAogICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjb2RlLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKQEAgLTk0OCw5ICsxMzIyLDggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGNoYXIgdGltZUNoZWNrU3RyaW5nWzY0XTsKLSAgICBzbnByaW50Zih0aW1lQ2hlY2tTdHJpbmcsIHNpemVvZih0aW1lQ2hlY2tTdHJpbmcpLCAiSUF1ZGlvUG9saWN5U2VydmljZTogJWQiLCBjb2RlKTsKLSAgICBUaW1lQ2hlY2sgY2hlY2sodGltZUNoZWNrU3RyaW5nKTsKKyAgICBzdGQ6OnN0cmluZyB0YWcoIklBdWRpb1BvbGljeVNlcnZpY2UgY29tbWFuZCAiICsgc3RkOjp0b19zdHJpbmcoY29kZSkpOworICAgIFRpbWVDaGVjayBjaGVjayh0YWcuY19zdHIoKSk7CiAKICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgY2FzZSBTRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEU6IHsKQEAgLTk2MSw2ICsxMzM0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyA9IGRhdGEucmVhZENTdHJpbmcoKTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lID0gZGF0YS5yZWFkQ1N0cmluZygpOworICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgY29kZWNGb3JtYXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fZm9ybWF0X3Q+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgaWYgKGRldmljZV9hZGRyZXNzID09IG51bGxwdHIgfHwgZGV2aWNlX25hbWUgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJCYWQgQmluZGVyIHRyYW5zYWN0aW9uOiBTRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEUgZm9yIGRldmljZSAldSIsIGRldmljZSk7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4gKEJBRF9WQUxVRSkpOwpAQCAtOTY4LDcgKzEzNDIsOCBAQAogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PiAoc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0Zvcm1hdCkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTk5NCwxMyArMTM2OSwxNiBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fZGV2aWNlc190PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzID0gZGF0YS5yZWFkQ1N0cmluZygpOwogICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBjb2RlY0Zvcm1hdCA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19mb3JtYXRfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBpZiAoZGV2aWNlX2FkZHJlc3MgPT0gbnVsbHB0ciB8fCBkZXZpY2VfbmFtZSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIkJhZCBCaW5kZXIgdHJhbnNhY3Rpb246IEhBTkRMRV9ERVZJQ0VfQ09ORklHX0NIQU5HRSBmb3IgZGV2aWNlICV1IiwgZGV2aWNlKTsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PiAoQkFEX1ZBTFVFKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PiAoaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0Zvcm1hdCkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTEwNjMsNDggKzE0NDEsMzkgQEAKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSAwOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNlY29uZGFyeU91dHB1dHM7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRPdXRwdXRGb3JBdHRyKGhhc0F0dHJpYnV0ZXMgPyAmYXR0ciA6IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsIHNlc3Npb24sICZzdHJlYW0sIHBpZCwgdWlkLAogICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICBmbGFncywgJnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICBmbGFncywgJnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQsICZzZWNvbmRhcnlPdXRwdXRzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihvdXRwdXQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RyZWFtKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlbGVjdGVkRGV2aWNlSWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocG9ydElkKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlY29uZGFyeU91dHB1dHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiByZXBseS0+d3JpdGUoc2Vjb25kYXJ5T3V0cHV0cy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeU91dHB1dHMuc2l6ZSgpICogc2l6ZW9mKGF1ZGlvX2lvX2hhbmRsZV90KSk7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBTVEFSVF9PVVRQVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fc3RyZWFtX3R5cGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhcnRPdXRwdXQob3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24pKSk7CisgICAgICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IHN0YXRpY19jYXN0IDxhdWRpb19wb3J0X2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhcnRPdXRwdXQocG9ydElkKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgU1RPUF9PVVRQVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fc3RyZWFtX3R5cGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RvcE91dHB1dChvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24pKSk7CisgICAgICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IHN0YXRpY19jYXN0IDxhdWRpb19wb3J0X2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RvcE91dHB1dChwb3J0SWQpKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBSRUxFQVNFX09VVFBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlbGVhc2VPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgICAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9ydF9oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTExMzksMTAgKzE1MDgsOCBAQAogICAgICAgICBjYXNlIFNUQVJUX0lOUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9ydF9oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBib29sIHNpbGVuY2VkID0gZGF0YS5yZWFkSW50MzIoKSA9PSAxOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRJbnB1dChwb3J0SWQsICZzaWxlbmNlZCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydElucHV0KHBvcnRJZCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXR1cykpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2lsZW5jZWQgPyAxIDogMCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTExOTgsNyArMTU2NSw3NCBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVVaW50MzIoZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBTRVRfVk9MVU1FX0FUVFJJQlVURVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHt9OworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkKCZhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBpbmRleCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2RldmljZXNfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgZGV2aWNlKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgR0VUX1ZPTFVNRV9BVFRSSUJVVEVTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2RldmljZXNfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBzdGF0dXMgPSBnZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgsIGRldmljZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXR1cykpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEdFVF9NSU5fVk9MVU1FX0ZPUl9BVFRSSUJVVEVTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBzdGF0dXMgPSBnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGF0dXMpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBHRVRfTUFYX1ZPTFVNRV9GT1JfQVRUUklCVVRFUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0ge307CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJmF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICAgICAgc3RhdHVzID0gZ2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIGluZGV4KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhdHVzKSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW5kZXgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCkBAIC0xMzEzLDYgKzE3NDcsMTggQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgSVNfRElSRUNUX09VVFBVVF9TVVBQT1JURUQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IHt9OworICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX2Jhc2VfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbmZpZywgYXR0cmlidXRlcykpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBMSVNUX0FVRElPX1BPUlRTOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSA9IChhdWRpb19wb3J0X3JvbGVfdClkYXRhLnJlYWRJbnQzMigpOwpAQCAtMTQzOCw2ICsxODg0LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKKyAgICAgICAgY2FzZSBTRVRfQVVESU9fVk9MVU1FX0dST1VQX0NBTExCQUNLX0VOQUJMRUQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChkYXRhLnJlYWRJbnQzMigpID09IDEpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCiAgICAgICAgIGNhc2UgQUNRVUlSRV9TT1VORFRSSUdHRVJfU0VTU0lPTjogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+IGNsaWVudCA9IGludGVyZmFjZV9jYXN0PElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+KApAQCAtMTQ5OCwxNyArMTk1MCwxNyBAQAogICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKICAgICAgICAgICAgIGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwogICAgICAgICAgICAgc2FuZXRpemVBdWRpb0F0dHJpYnV0ZXMoJmF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydEF1ZGlvU291cmNlKCZzb3VyY2UsICZhdHRyaWJ1dGVzLCAmaGFuZGxlKTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0QXVkaW9Tb3VyY2UoJnNvdXJjZSwgJmF0dHJpYnV0ZXMsICZwb3J0SWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGhhbmRsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihwb3J0SWQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgU1RPUF9BVURJT19TT1VSQ0U6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wQXVkaW9Tb3VyY2UoaGFuZGxlKTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wQXVkaW9Tb3VyY2UocG9ydElkKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC0xNTg3LDYgKzIwMzksMjUyIEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEdFVF9PRkZMT0FEX0ZPUk1BVFNfQTJEUDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiBlbmNvZGluZ0Zvcm1hdHM7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKCZlbmNvZGluZ0Zvcm1hdHMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGVuY29kaW5nRm9ybWF0cy5zaXplKCkpKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW5jb2RpbmdGb3JtYXRzLnNpemUoKTsgaSsrKQorICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGVuY29kaW5nRm9ybWF0c1tpXSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKworICAgICAgICBjYXNlIEFERF9TVFJFQU1fREVGQVVMVF9FRkZFQ1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBlZmZlY3RfdXVpZF90IHR5cGU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJnR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZzE2IG9wUGFja2FnZU5hbWU7CisgICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWRTdHJpbmcxNigmb3BQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZCgmdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlID0gKGF1ZGlvX3VzYWdlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCA9IDA7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oYWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgmdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQpKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpZCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFJFTU9WRV9TVFJFQU1fREVGQVVMVF9FRkZFQ1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCA9IHN0YXRpY19jYXN0PGF1ZGlvX3VuaXF1ZV9pZF90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihyZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGlkKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBBRERfU09VUkNFX0RFRkFVTFRfRUZGRUNUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB0eXBlOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkKCZ0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lOworICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkU3RyaW5nMTYoJm9wUGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWQoJnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgaWQgPSAwOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoJnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZCkpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlkKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgUkVNT1ZFX1NPVVJDRV9ERUZBVUxUX0VGRkVDVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGlkID0gc3RhdGljX2Nhc3Q8YXVkaW9fdW5pcXVlX2lkX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoaWQpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFVF9BU1NJU1RBTlRfVUlEOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50MzJfdCB1aWQ7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmdWlkKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gc2V0QXNzaXN0YW50VWlkKHVpZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFVF9BMTFZX1NFUlZJQ0VTX1VJRFM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aWRfdD4gdWlkczsKKyAgICAgICAgICAgIGludDMyX3Qgc2l6ZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZEludDMyKCZzaXplKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpemUgPiBNQVhfSVRFTVNfUEVSX0xJU1QpIHsKKyAgICAgICAgICAgICAgICBzaXplID0gTUFYX0lURU1TX1BFUl9MSVNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB1aWQ7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gIGRhdGEucmVhZEludDMyKCZ1aWQpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdWlkcy5wdXNoX2JhY2sodWlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IHNldEExMXlTZXJ2aWNlc1VpZHModWlkcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElTX0hBUFRJQ19QTEFZQkFDS19TVVBQT1JURUQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBib29sIGlzU3VwcG9ydGVkID0gaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlQm9vbChpc1N1cHBvcnRlZCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7ICAgIAorICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTRVRfVUlEX0RFVklDRV9BRkZJTklUWTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGNvbnN0IHVpZF90IHVpZCA9ICh1aWRfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiBkZXZpY2VzOworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSAoc2l6ZV90KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgZGV2aWNlOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UucmVhZEZyb21QYXJjZWwoKFBhcmNlbCopJmRhdGEpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIGRldmljZXMuYWRkKGRldmljZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWQsIGRldmljZXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgUkVNT1ZFX1VJRF9ERVZJQ0VfQUZGSU5JVFk6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBjb25zdCB1aWRfdCB1aWQgPSAodWlkX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBMSVNUX0FVRElPX1BST0RVQ1RfU1RSQVRFR0lFUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yIHN0cmF0ZWdpZXM7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhzdHJhdGVnaWVzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBzdHJhdGVnaWVzLnNpemUoKTsKKyAgICAgICAgICAgIHNpemVfdCBzaXplUG9zaXRpb24gPSByZXBseS0+ZGF0YVBvc2l0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgICAgIHNpemVfdCBmaW5hbFNpemUgPSBzaXplOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgcG9zaXRpb24gPSByZXBseS0+ZGF0YVBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0cmF0ZWdpZXNbaV0ud3JpdGVUb1BhcmNlbChyZXBseSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHktPnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsU2l6ZS0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaXplICE9IGZpbmFsU2l6ZSkgeworICAgICAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IHJlcGx5LT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICByZXBseS0+c2V0RGF0YVBvc2l0aW9uKHNpemVQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmluYWxTaXplKTsKKyAgICAgICAgICAgICAgICByZXBseS0+c2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgR0VUX1NUUkFURUdZX0ZPUl9BVFRSSUJVVEVTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdHRyaWJ1dGVzLnJlYWRGcm9tUGFyY2VsKCZkYXRhKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5OworICAgICAgICAgICAgc3RhdHVzID0gZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBzdHJhdGVneSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDxpbnQ+KHN0cmF0ZWd5KSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIExJU1RfQVVESU9fVk9MVU1FX0dST1VQUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgZ3JvdXBzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGlzdEF1ZGlvVm9sdW1lR3JvdXBzKGdyb3Vwcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gZ3JvdXBzLnNpemUoKTsKKyAgICAgICAgICAgIHNpemVfdCBzaXplUG9zaXRpb24gPSByZXBseS0+ZGF0YVBvc2l0aW9uKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgICAgIHNpemVfdCBmaW5hbFNpemUgPSBzaXplOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgcG9zaXRpb24gPSByZXBseS0+ZGF0YVBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKGdyb3Vwc1tpXS53cml0ZVRvUGFyY2VsKHJlcGx5KSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICByZXBseS0+c2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWxTaXplLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpemUgIT0gZmluYWxTaXplKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gcmVwbHktPmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgICAgIHJlcGx5LT5zZXREYXRhUG9zaXRpb24oc2l6ZVBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmaW5hbFNpemUpOworICAgICAgICAgICAgICAgIHJlcGx5LT5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHRVRfVk9MVU1FX0dST1VQX0ZPUl9BVFRSSUJVVEVTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdHRyaWJ1dGVzLnJlYWRGcm9tUGFyY2VsKCZkYXRhKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgZ3JvdXA7CisgICAgICAgICAgICBzdGF0dXMgPSBnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoYXR0cmlidXRlcywgZ3JvdXApOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8aW50Pihncm91cCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcAppbmRleCBhZDdmMWRlLi41MmQ4Y2NkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcApAQCAtMzEsNyArMzEsOCBAQAogICAgIFBPUlRfTElTVF9VUERBVEUgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAogICAgIFBBVENIX0xJU1RfVVBEQVRFLAogICAgIE1JWF9TVEFURV9VUERBVEUsCi0gICAgUkVDT1JESU5HX0NPTkZJR1VSQVRJT05fVVBEQVRFCisgICAgUkVDT1JESU5HX0NPTkZJR1VSQVRJT05fVVBEQVRFLAorICAgIFZPTFVNRV9HUk9VUF9DSEFOR0VELAogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNTIsMTIgKzUzLDM3IEBACiAgICAgY2xpZW50SW5mby0+dWlkID0gKHVpZF90KSBkYXRhLnJlYWRVaW50MzIoKTsKICAgICBjbGllbnRJbmZvLT5zZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICBjbGllbnRJbmZvLT5zb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgZGF0YS5yZWFkKCZjbGllbnRJbmZvLT5wb3J0X2lkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOworICAgIGNsaWVudEluZm8tPnNpbGVuY2VkID0gZGF0YS5yZWFkQm9vbCgpOwogfQogCi1pbmxpbmUgdm9pZCB3cml0ZVJlY29yZENsaWVudEluZm9Gcm9tUGFyY2VsKFBhcmNlbCYgZGF0YSwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8pIHsKK2lubGluZSB2b2lkIHdyaXRlUmVjb3JkQ2xpZW50SW5mb1RvUGFyY2VsKFBhcmNlbCYgZGF0YSwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8pIHsKICAgICBkYXRhLndyaXRlVWludDMyKCh1aW50MzJfdCkgY2xpZW50SW5mby0+dWlkKTsKICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGNsaWVudEluZm8tPnNlc3Npb24pOwogICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgY2xpZW50SW5mby0+c291cmNlKTsKKyAgICBkYXRhLndyaXRlKCZjbGllbnRJbmZvLT5wb3J0X2lkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOworICAgIGRhdGEud3JpdGVCb29sKGNsaWVudEluZm8tPnNpbGVuY2VkKTsKK30KKworaW5saW5lIHZvaWQgcmVhZEVmZmVjdFZlY3RvckZyb21QYXJjZWwoY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gKmVmZmVjdHMpIHsKKyAgICBpbnQzMl90IG51bUVmZmVjdHMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bUVmZmVjdHM7IGkrKykgeworICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGVmZmVjdDsKKyAgICAgICAgaWYgKGRhdGEucmVhZCgmZWZmZWN0LCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAoKmVmZmVjdHMpLnB1c2hfYmFjayhlZmZlY3QpOworICAgIH0KK30KKworaW5saW5lIHZvaWQgd3JpdGVFZmZlY3RWZWN0b3JUb1BhcmNlbChQYXJjZWwmIGRhdGEsIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMpIHsKKyAgICBkYXRhLndyaXRlVWludDMyKCh1aW50MzJfdCkgZWZmZWN0cy5zaXplKCkpOworICAgIGZvciAoY29uc3QgYXV0byYgZWZmZWN0IDogZWZmZWN0cykgeworICAgICAgICBpZiAoZGF0YS53cml0ZSgmZWZmZWN0LCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtODMsNiArMTA5LDE1IEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChQQVRDSF9MSVNUX1VQREFURSwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgfQogCisgICAgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlVWludDMyKGdyb3VwKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGZsYWdzKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFZPTFVNRV9HUk9VUF9DSEFOR0VELCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKKyAgICB9CisKICAgICB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC05MiwxNiArMTI3LDI0IEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChNSVhfU1RBVEVfVVBEQVRFLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKICAgICB9CiAKLSAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkgeworICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGV2ZW50KTsKLSAgICAgICAgd3JpdGVSZWNvcmRDbGllbnRJbmZvRnJvbVBhcmNlbChkYXRhLCBjbGllbnRJbmZvKTsKKyAgICAgICAgd3JpdGVSZWNvcmRDbGllbnRJbmZvVG9QYXJjZWwoZGF0YSwgY2xpZW50SW5mbyk7CiAgICAgICAgIHdyaXRlQXVkaW9Db25maWdCYXNlVG9QYXJjZWwoZGF0YSwgY2xpZW50Q29uZmlnKTsKKyAgICAgICAgd3JpdGVFZmZlY3RWZWN0b3JUb1BhcmNlbChkYXRhLCBjbGllbnRFZmZlY3RzKTsKICAgICAgICAgd3JpdGVBdWRpb0NvbmZpZ0Jhc2VUb1BhcmNlbChkYXRhLCBkZXZpY2VDb25maWcpOworICAgICAgICB3cml0ZUVmZmVjdFZlY3RvclRvUGFyY2VsKGRhdGEsIGVmZmVjdHMpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocGF0Y2hIYW5kbGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNvdXJjZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEUsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KIH07CkBAIC0xMjQsNiArMTY3LDEzIEBACiAgICAgICAgICAgICBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgY2FzZSBWT0xVTUVfR1JPVVBfQ0hBTkdFRDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHZvbHVtZV9ncm91cF90IGdyb3VwID0gc3RhdGljX2Nhc3Q8dm9sdW1lX2dyb3VwX3Q+KGRhdGEucmVhZFVpbnQzMigpKTsKKyAgICAgICAgICAgIGludCBmbGFncyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKGdyb3VwLCBmbGFncyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgY2FzZSBNSVhfU1RBVEVfVVBEQVRFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgU3RyaW5nOCByZWdJZCA9IGRhdGEucmVhZFN0cmluZzgoKTsKQEAgLTEzOSwxMCArMTg5LDE1IEBACiAgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGRldmljZUNvbmZpZzsKICAgICAgICAgICAgIHJlYWRSZWNvcmRDbGllbnRJbmZvRnJvbVBhcmNlbChkYXRhLCAmY2xpZW50SW5mbyk7CiAgICAgICAgICAgICByZWFkQXVkaW9Db25maWdCYXNlRnJvbVBhcmNlbChkYXRhLCAmY2xpZW50Q29uZmlnKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHM7CisgICAgICAgICAgICByZWFkRWZmZWN0VmVjdG9yRnJvbVBhcmNlbChkYXRhLCAmY2xpZW50RWZmZWN0cyk7CiAgICAgICAgICAgICByZWFkQXVkaW9Db25maWdCYXNlRnJvbVBhcmNlbChkYXRhLCAmZGV2aWNlQ29uZmlnKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHM7CisgICAgICAgICAgICByZWFkRWZmZWN0VmVjdG9yRnJvbVBhcmNlbChkYXRhLCAmZWZmZWN0cyk7CiAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSA9IChhdWRpb19wYXRjaF9oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgJmNsaWVudEluZm8sICZjbGllbnRDb25maWcsICZkZXZpY2VDb25maWcsCi0gICAgICAgICAgICAgICAgICAgIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgJmNsaWVudEluZm8sICZjbGllbnRDb25maWcsIGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZUNvbmZpZywgZWZmZWN0cywgcGF0Y2hIYW5kbGUsIHNvdXJjZSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1RyYWNrLmNwcAppbmRleCBhZGZmMDU3Li44M2E1NjhhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvVHJhY2suY3BwCkBAIC0zOSw2ICszOSw3IEBACiAgICAgUEFVU0UsCiAgICAgQVRUQUNIX0FVWF9FRkZFQ1QsCiAgICAgU0VUX1BBUkFNRVRFUlMsCisgICAgU0VMRUNUX1BSRVNFTlRBVElPTiwKICAgICBHRVRfVElNRVNUQU1QLAogICAgIFNJR05BTCwKICAgICBBUFBMWV9WT0xVTUVfU0hBUEVSLApAQCAtMTI3LDYgKzEyOCwxOSBAQAogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAorICAgIC8qIFNlbGVjdHMgdGhlIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKSAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHByZXNlbnRhdGlvbklkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHByb2dyYW1JZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRUxFQ1RfUFJFU0VOVEFUSU9OLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvVHJhY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0yMzksNiArMjUzLDExIEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRUxFQ1RfUFJFU0VOVEFUSU9OOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvVHJhY2ssIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlbGVjdFByZXNlbnRhdGlvbihkYXRhLnJlYWRJbnQzMigpLCBkYXRhLnJlYWRJbnQzMigpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgR0VUX1RJTUVTVEFNUDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1RyYWNrLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBBdWRpb1RpbWVzdGFtcCB0aW1lc3RhbXA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9Ub25lR2VuZXJhdG9yLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RvbmVHZW5lcmF0b3IuY3BwCmluZGV4IDVjNWRiZDYuLjUzNmIwMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RvbmVHZW5lcmF0b3IuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RvbmVHZW5lcmF0b3IuY3BwCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KICNpbmNsdWRlICJtZWRpYS9Ub25lR2VuZXJhdG9yLmgiCiAKIApAQCAtMTI0Miw3ICsxMjQxLDcgQEAKICAgICBpZiAobVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpIHsKICAgICAgICAgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9EVE1GOwogICAgIH0KLSAgICBzdHJlYW1fdHlwZV90b19hdWRpb19hdHRyaWJ1dGVzKHN0cmVhbVR5cGUsICZhdHRyKTsKKyAgICBhdHRyID0gQXVkaW9TeXN0ZW06OnN0cmVhbVR5cGVUb0F0dHJpYnV0ZXMoc3RyZWFtVHlwZSk7CiAKICAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IG1Qcm9jZXNzU2l6ZTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcEF1ZGlvVHJhY2stPnNldCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbAppbmRleCAwMWUwYTcxLi5jZjljN2Y0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUmVjb3JkLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5haWRsCkBAIC0zNiw0ICszNiwxMiBAQAogICAvKiBHZXQgYSBsaXN0IG9mIGN1cnJlbnQgYWN0aXZlIG1pY3JvcGhvbmVzLgogICAgKi8KICAgdm9pZCBnZXRBY3RpdmVNaWNyb3Bob25lcyhvdXQgTWljcm9waG9uZUluZm9bXSBhY3RpdmVNaWNyb3Bob25lcyk7CisKKyAgLyogU2V0IHRoZSBtaWNyb3Bob25lIGRpcmVjdGlvbiAoZm9yIHByb2Nlc3NpbmcpLgorICAgKi8KKyAgdm9pZCBzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGludCAvKmF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QqLyBkaXJlY3Rpb24pOworCisgIC8qIFNldCB0aGUgbWljcm9waG9uZSB6b29tIChmb3IgcHJvY2Vzc2luZykuCisgICAqLworICB2b2lkIHNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMzVlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db21tb25UeXBlcy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvQXR0cmlidXRlcyA6IHB1YmxpYyBQYXJjZWxhYmxlCit7CitwdWJsaWM6CisgICAgQXVkaW9BdHRyaWJ1dGVzKCkgPSBkZWZhdWx0OworICAgIEF1ZGlvQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMpIDogbUF0dHJpYnV0ZXMoYXR0cmlidXRlcykge30KKyAgICBBdWRpb0F0dHJpYnV0ZXModm9sdW1lX2dyb3VwX3QgZ3JvdXBJZCwKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcykgOgorICAgICAgICAgbUF0dHJpYnV0ZXMoYXR0cmlidXRlcyksIG1TdHJlYW1UeXBlKHN0cmVhbSksIG1Hcm91cElkKGdyb3VwSWQpIHt9CisKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgZ2V0QXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1BdHRyaWJ1dGVzOyB9CisKKyAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IGdldFN0cmVhbVR5cGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZTsgfQorICAgIHZvbHVtZV9ncm91cF90IGdldEdyb3VwSWQoKSBjb25zdCB7IHJldHVybiBtR3JvdXBJZDsgfQorCitwcml2YXRlOgorICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBtQXR0cmlidXRlcyA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CisgICAgLyoqCisgICAgICogQGJyaWVmIG1TdHJlYW1UeXBlOiBmb3IgbGVnYWN5IHZvbHVtZSBtYW5hZ2VtZW50LCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gY29udmVydCBhbiBhdHRyaWJ1dGUKKyAgICAgKiB0byBhIGdpdmVuIHN0cmVhbSB0eXBlLgorICAgICAqLworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fREVGQVVMVDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBtR3JvdXBJZDogZm9yIGZ1dHVyZSB2b2x1bWUgbWFuYWdlbWVudCwgZGVmaW5lIGdyb3VwcyB3aXRoaW4gYSBzdHJhdGVneSB0aGF0IGZvbGxvd3MKKyAgICAgKiB0aGUgc2FtZSBjdXJ2ZXMgb2Ygdm9sdW1lIChleHRlbnNpb24gb2Ygc3RyZWFtIHR5cGVzIHRvIG1hbmFnZSB2b2x1bWUpCisgICAgICovCisgICAgdm9sdW1lX2dyb3VwX3QgbUdyb3VwSWQgPSBWT0xVTUVfR1JPVVBfTk9ORTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Db21tb25UeXBlcy5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0NvbW1vblR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0NDZlYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Db21tb25UeXBlcy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSBwcm9kdWN0X3N0cmF0ZWd5X3QgOiB1aW50MzJfdDsKK2NvbnN0IHByb2R1Y3Rfc3RyYXRlZ3lfdCBQUk9EVUNUX1NUUkFURUdZX05PTkUgPSBzdGF0aWNfY2FzdDxwcm9kdWN0X3N0cmF0ZWd5X3Q+KC0xKTsKKwordXNpbmcgQXR0cmlidXRlc1ZlY3RvciA9IHN0ZDo6dmVjdG9yPGF1ZGlvX2F0dHJpYnV0ZXNfdD47Cit1c2luZyBTdHJlYW1UeXBlVmVjdG9yID0gc3RkOjp2ZWN0b3I8YXVkaW9fc3RyZWFtX3R5cGVfdD47CisKK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yPT0oY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZsaHMsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmcmhzKQoreworICAgIHJldHVybiBsaHMudXNhZ2UgPT0gcmhzLnVzYWdlICYmIGxocy5jb250ZW50X3R5cGUgPT0gcmhzLmNvbnRlbnRfdHlwZSAmJgorICAgICAgICAgICAgbGhzLmZsYWdzID09IHJocy5mbGFncyAmJiAoc3RkOjpzdHJjbXAobGhzLnRhZ3MsIHJocy50YWdzKSA9PSAwKTsKK30KK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZsaHMsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmcmhzKQoreworICAgIHJldHVybiAhKGxocz09cmhzKTsKK30KKworZW51bSB2b2x1bWVfZ3JvdXBfdCA6IHVpbnQzMl90Oworc3RhdGljIGNvbnN0IHZvbHVtZV9ncm91cF90IFZPTFVNRV9HUk9VUF9OT05FID0gc3RhdGljX2Nhc3Q8dm9sdW1lX2dyb3VwX3Q+KC0xKTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKaW5kZXggMzI0YmNiOS4uNmJkNDEzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaApAQCAtOTAsMjcgKzkwLDM0IEBACiAgICAgICovCiAgICAgc3RhdGljIHN0YXR1c190IHF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKTsKIAotCiAgICAgLyoKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIGVmZmVjdCB1dWlkLgorICAgICAqIFJldHVybnMgYSBkZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIGVmZmVjdCB1dWlkIG9yIHR5cGUuCisgICAgICoKKyAgICAgKiBMb29rdXAgYW4gZWZmZWN0IGJ5IHV1aWQsIG9yIGlmIHRoYXQncyB1bnNwZWNpZmllZCAoRUZGRUNUX1VVSURfTlVMTCksCisgICAgICogZG8gc28gYnkgdHlwZSBhbmQgcHJlZmVycmVkIGZsYWdzIGluc3RlYWQuCiAgICAgICoKICAgICAgKiBQYXJhbWV0ZXJzOgogICAgICAqICAgICAgdXVpZDogICAgICAgcG9pbnRlciB0byBlZmZlY3QgdXVpZC4KKyAgICAgKiAgICAgIHR5cGU6ICAgICAgIHBvaW50ZXIgdG8gZWZmZWN0IHR5cGUgdXVpZC4KKyAgICAgKiAgICAgIHByZWZlcnJlZFR5cGVGbGFnczogaWYgbXVsdGlwbGUgZWZmZWN0cyBvZiB0aGUgZ2l2ZW4gdHlwZSBleGlzdCwKKyAgICAgKiAgICAgICAgICAgICAgICAgIG9uZSB3aXRoIGEgbWF0Y2hpbmcgdHlwZSBmbGFnIHdpbGwgYmUgY2hvc2VuIG92ZXIgb25lIHdpdGhvdXQuCisgICAgICogICAgICAgICAgICAgICAgICBVc2UgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLIHRvIGluZGljYXRlIG5vIHByZWZlcmVuY2UuCiAgICAgICogICAgICBkZXNjcmlwdG9yOiBhZGRyZXNzIHdoZXJlIHRoZSBlZmZlY3QgZGVzY3JpcHRvciBzaG91bGQgYmUgcmV0dXJuZWQuCiAgICAgICoKICAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKICAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KICAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQogICAgICAqICAgICAgTk9fSU5JVCAgICAgICAgIGVmZmVjdCBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplCi0gICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCB1dWlkIG9yIGRlc2NyaXB0b3IgcG9pbnRlcnMKKyAgICAgKiAgICAgIEJBRF9WQUxVRSAgICAgICBpbnZhbGlkIHR5cGUgb3IgZGVzY3JpcHRvciBwb2ludGVycwogICAgICAqICAgICAgTkFNRV9OT1RfRk9VTkQgIG5vIGVmZmVjdCB3aXRoIHRoaXMgdXVpZCBmb3VuZAogICAgICAqCiAgICAgICogUmV0dXJuZWQgdmFsdWUKICAgICAgKiAgICpkZXNjcmlwdG9yIHVwZGF0ZWQgd2l0aCBlZmZlY3QgZGVzY3JpcHRvcgogICAgICAqLwogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikgLypjb25zdCovOwotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKTsKIAogICAgIC8qCiAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZGVzY3JpcHRvcnMgY29ycmVzcG9uZGluZyB0byB0aGUgcHJlIHByb2Nlc3NpbmdzIGVuYWJsZWQgYnkgZGVmYXVsdApAQCAtMTQ0LDYgKzE1MSwxMzIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpOwogCiAgICAgLyoKKyAgICAgKiBHZXRzIGEgbmV3IHN5c3RlbS13aWRlIHVuaXF1ZSBlZmZlY3QgaWQuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICAgICAgaWQ6IFRoZSBhZGRyZXNzIHRvIHJldHVybiB0aGUgZ2VuZXJhdGVkIGlkLgorICAgICAqCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogICAgICBOT19FUlJPUiAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNhbGxlciBsYWNrcyByZXF1aXJlZCBwZXJtaXNzaW9ucy4KKyAgICAgKiBSZXR1cm5lZCB2YWx1ZQorICAgICAqICAgKmlkOiAgVGhlIG5ldyB1bmlxdWUgc3lzdGVtLXdpZGUgZWZmZWN0IGlkLgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCBuZXdFZmZlY3RVbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdCogaWQpOworCisgICAgLyoKKyAgICAgKiBTdGF0aWMgbWV0aG9kcyBmb3IgYWRkaW5nL3JlbW92aW5nIHN5c3RlbS13aWRlIGVmZmVjdHMuCisgICAgICovCisKKyAgICAvKgorICAgICAqIEFkZHMgYW4gZWZmZWN0IHRvIHRoZSBsaXN0IG9mIGRlZmF1bHQgb3V0cHV0IGVmZmVjdHMgZm9yIGEgZ2l2ZW4gc291cmNlIHR5cGUuCisgICAgICoKKyAgICAgKiBJZiB0aGUgZWZmZWN0IGlzIG5vIGxvbmdlciBhdmFpbGFibGUgd2hlbiBhIHNvdXJjZSBvZiB0aGUgZ2l2ZW4gdHlwZQorICAgICAqIGlzIGNyZWF0ZWQsIHRoZSBzeXN0ZW0gd2lsbCBjb250aW51ZSB3aXRob3V0IGFkZGluZyBpdC4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogICB0eXBlU3RyOiAgVHlwZSB1dWlkIG9mIGVmZmVjdCB0byBiZSBhIGRlZmF1bHQ6IGNhbiBiZSBudWxsIGlmIHV1aWRTdHIgaXMgc3BlY2lmaWVkLgorICAgICAqICAgICAgICAgICAgIFRoaXMgbWF5IGNvcnJlc3BvbmQgdG8gdGhlIE9wZW5TTCBFUyBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhpcyBlZmZlY3QsCisgICAgICogICAgICAgICAgICAgb3IgY291bGQgYmUgc29tZSB2ZW5kb3ItZGVmaW5lZCB0eXBlLgorICAgICAqICAgb3BQYWNrYWdlTmFtZTogVGhlIHBhY2thZ2UgbmFtZSB1c2VkIGZvciBhcHAgb3AgY2hlY2tzLgorICAgICAqICAgdXVpZFN0cjogIFV1aWQgb2YgZWZmZWN0IHRvIGJlIGEgZGVmYXVsdDogY2FuIGJlIG51bGwgaWYgdHlwZSBpcyBzcGVjaWZpZWQuCisgICAgICogICAgICAgICAgICAgVGhpcyB1dWlkIGNvcnJlc3BvbmRzIHRvIGEgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiBvZiBhbiBlZmZlY3QgdHlwZS4KKyAgICAgKiAgICAgICAgICAgICBOb3RlIGlmIGJvdGggdXVpZFN0ciBhbmQgdHlwZVN0ciBhcmUgc3BlY2lmaWVkLCB0eXBlU3RyIGlzIGlnbm9yZWQuCisgICAgICogICBwcmlvcml0eTogUmVxdWVzdGVkIHByaW9yaXR5IGZvciBlZmZlY3QgY29udHJvbDogdGhlIHByaW9yaXR5IGxldmVsIGNvcnJlc3BvbmRzIHRvIHRoZQorICAgICAqICAgICAgICAgICAgIHZhbHVlIG9mIHByaW9yaXR5IHBhcmFtZXRlcjogbmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGxvd2VyIHByaW9yaXRpZXMsIHBvc2l0aXZlCisgICAgICogICAgICAgICAgICAgdmFsdWVzIGhpZ2hlciBwcmlvcml0aWVzLCAwIGJlaW5nIHRoZSBub3JtYWwgcHJpb3JpdHkuCisgICAgICogICBzb3VyY2U6ICAgVGhlIHNvdXJjZSB0aGlzIGVmZmVjdCBzaG91bGQgYmUgYSBkZWZhdWx0IGZvci4KKyAgICAgKiAgIGlkOiAgICAgICBBZGRyZXNzIHdoZXJlIHRoZSBzeXN0ZW0td2lkZSB1bmlxdWUgaWQgb2YgdGhlIGRlZmF1bHQgZWZmZWN0IHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgorICAgICAqICAgICAgTk9fRVJST1IgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICAgICAqICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBjYWxsZXIgbGFja3MgcmVxdWlyZWQgcGVybWlzc2lvbnMuCisgICAgICogICAgICBOT19JTklUICAgICAgICAgZWZmZWN0IGxpYnJhcnkgZmFpbGVkIHRvIGluaXRpYWxpemUuCisgICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCBzb3VyY2UsIHR5cGUgdXVpZCBvciBpbXBsZW1lbnRhdGlvbiB1dWlkLgorICAgICAqICAgICAgTkFNRV9OT1RfRk9VTkQgIG5vIGVmZmVjdCB3aXRoIHRoaXMgdXVpZCBvciB0eXBlIGZvdW5kLgorICAgICAqCisgICAgICogUmV0dXJuZWQgdmFsdWUKKyAgICAgKiAgICppZDogIFRoZSBzeXN0ZW0td2lkZSB1bmlxdWUgaWQgb2YgdGhlIGFkZGVkIGRlZmF1bHQgZWZmZWN0LgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGNoYXIqIHR5cGVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXVpZFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOworCisgICAgLyoKKyAgICAgKiBBZGRzIGFuIGVmZmVjdCB0byB0aGUgbGlzdCBvZiBkZWZhdWx0IG91dHB1dCBlZmZlY3RzIGZvciBhIGdpdmVuIHN0cmVhbSB0eXBlLgorICAgICAqCisgICAgICogSWYgdGhlIGVmZmVjdCBpcyBubyBsb25nZXIgYXZhaWxhYmxlIHdoZW4gYSBzdHJlYW0gb2YgdGhlIGdpdmVuIHR5cGUKKyAgICAgKiBpcyBjcmVhdGVkLCB0aGUgc3lzdGVtIHdpbGwgY29udGludWUgd2l0aG91dCBhZGRpbmcgaXQuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICAgdHlwZVN0cjogIFR5cGUgdXVpZCBvZiBlZmZlY3QgdG8gYmUgYSBkZWZhdWx0OiBjYW4gYmUgbnVsbCBpZiB1dWlkU3RyIGlzIHNwZWNpZmllZC4KKyAgICAgKiAgICAgICAgICAgICBUaGlzIG1heSBjb3JyZXNwb25kIHRvIHRoZSBPcGVuU0wgRVMgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoaXMgZWZmZWN0LAorICAgICAqICAgICAgICAgICAgIG9yIGNvdWxkIGJlIHNvbWUgdmVuZG9yLWRlZmluZWQgdHlwZS4KKyAgICAgKiAgIG9wUGFja2FnZU5hbWU6IFRoZSBwYWNrYWdlIG5hbWUgdXNlZCBmb3IgYXBwIG9wIGNoZWNrcy4KKyAgICAgKiAgIHV1aWRTdHI6ICBVdWlkIG9mIGVmZmVjdCB0byBiZSBhIGRlZmF1bHQ6IGNhbiBiZSBudWxsIGlmIHR5cGUgaXMgc3BlY2lmaWVkLgorICAgICAqICAgICAgICAgICAgIFRoaXMgdXVpZCBjb3JyZXNwb25kcyB0byBhIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gb2YgYW4gZWZmZWN0IHR5cGUuCisgICAgICogICAgICAgICAgICAgTm90ZSBpZiBib3RoIHV1aWRTdHIgYW5kIHR5cGVTdHIgYXJlIHNwZWNpZmllZCwgdHlwZVN0ciBpcyBpZ25vcmVkLgorICAgICAqICAgcHJpb3JpdHk6IFJlcXVlc3RlZCBwcmlvcml0eSBmb3IgZWZmZWN0IGNvbnRyb2w6IHRoZSBwcmlvcml0eSBsZXZlbCBjb3JyZXNwb25kcyB0byB0aGUKKyAgICAgKiAgICAgICAgICAgICB2YWx1ZSBvZiBwcmlvcml0eSBwYXJhbWV0ZXI6IG5lZ2F0aXZlIHZhbHVlcyBpbmRpY2F0ZSBsb3dlciBwcmlvcml0aWVzLCBwb3NpdGl2ZQorICAgICAqICAgICAgICAgICAgIHZhbHVlcyBoaWdoZXIgcHJpb3JpdGllcywgMCBiZWluZyB0aGUgbm9ybWFsIHByaW9yaXR5LgorICAgICAqICAgdXNhZ2U6ICAgIFRoZSB1c2FnZSB0aGlzIGVmZmVjdCBzaG91bGQgYmUgYSBkZWZhdWx0IGZvci4gVW5yZWNvZ25pemVkIHZhbHVlcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgdHJlYXRlZCBhcyBBVURJT19VU0FHRV9VTktOT1dOLgorICAgICAqICAgaWQ6ICAgICAgIEFkZHJlc3Mgd2hlcmUgdGhlIHN5c3RlbS13aWRlIHVuaXF1ZSBpZCBvZiB0aGUgZGVmYXVsdCBlZmZlY3Qgc2hvdWxkIGJlIHJldHVybmVkLgorICAgICAqCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogICAgICBOT19FUlJPUiAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNhbGxlciBsYWNrcyByZXF1aXJlZCBwZXJtaXNzaW9ucy4KKyAgICAgKiAgICAgIE5PX0lOSVQgICAgICAgICBlZmZlY3QgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4KKyAgICAgKiAgICAgIEJBRF9WQUxVRSAgICAgICBpbnZhbGlkIHR5cGUgdXVpZCBvciBpbXBsZW1lbnRhdGlvbiB1dWlkLgorICAgICAqICAgICAgTkFNRV9OT1RfRk9VTkQgIG5vIGVmZmVjdCB3aXRoIHRoaXMgdXVpZCBvciB0eXBlIGZvdW5kLgorICAgICAqCisgICAgICogUmV0dXJuZWQgdmFsdWUKKyAgICAgKiAgICppZDogIFRoZSBzeXN0ZW0td2lkZSB1bmlxdWUgaWQgb2YgdGhlIGFkZGVkIGRlZmF1bHQgZWZmZWN0LgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGNoYXIqIHR5cGVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXVpZFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKTsKKworICAgIC8qCisgICAgICogUmVtb3ZlcyBhbiBlZmZlY3QgZnJvbSB0aGUgbGlzdCBvZiBkZWZhdWx0IG91dHB1dCBlZmZlY3RzIGZvciBhIGdpdmVuIHNvdXJjZSB0eXBlLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgICAgIGlkOiBUaGUgc3lzdGVtLXdpZGUgdW5pcXVlIGlkIG9mIHRoZSBlZmZlY3QgdGhhdCBzaG91bGQgbm8gbG9uZ2VyIGJlIGEgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgorICAgICAqICAgICAgTk9fRVJST1IgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICAgICAqICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBjYWxsZXIgbGFja3MgcmVxdWlyZWQgcGVybWlzc2lvbnMuCisgICAgICogICAgICBOT19JTklUICAgICAgICAgZWZmZWN0IGxpYnJhcnkgZmFpbGVkIHRvIGluaXRpYWxpemUuCisgICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCBpZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCk7CisKKyAgICAvKgorICAgICAqIFJlbW92ZXMgYW4gZWZmZWN0IGZyb20gdGhlIGxpc3Qgb2YgZGVmYXVsdCBvdXRwdXQgZWZmZWN0cyBmb3IgYSBnaXZlbiBzdHJlYW0gdHlwZS4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogICAgICBpZDogVGhlIHN5c3RlbS13aWRlIHVuaXF1ZSBpZCBvZiB0aGUgZWZmZWN0IHRoYXQgc2hvdWxkIG5vIGxvbmdlciBiZSBhIGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb3IgY2FsbGVyIGxhY2tzIHJlcXVpcmVkIHBlcm1pc3Npb25zLgorICAgICAqICAgICAgTk9fSU5JVCAgICAgICAgIGVmZmVjdCBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplLgorICAgICAqICAgICAgQkFEX1ZBTFVFICAgICAgIGludmFsaWQgaWQuCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworCisgICAgLyoKICAgICAgKiBFdmVudHMgdXNlZCBieSBjYWxsYmFjayBmdW5jdGlvbiAoZWZmZWN0X2NhbGxiYWNrX3QpLgogICAgICAqLwogICAgIGVudW0gZXZlbnRfdHlwZSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlci5oCmluZGV4IGNmN2Q5MGYuLjc4M2VlZjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlci5oCkBAIC0xOCwxNyArMTgsMTkgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19NSVhFUl9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fTUlYRVJfSAogCisjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSA8YW5kcm9pZC9vcy9JRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0J1ZmZlclByb3ZpZGVycy5oPgotI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvQ29tcGF0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgpAQCAtNDEsNiArNDMsMTAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCituYW1lc3BhY2UgTkJMb2cgeworY2xhc3MgV3JpdGVyOworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNsYXNzIEF1ZGlvTWl4ZXIKQEAgLTczLDYgKzc5LDkgQEAKICAgICAgICAgRE9XTk1JWF9UWVBFICAgID0gMFg0MDA0LAogICAgICAgICBNSVhFUl9GT1JNQVQgICAgPSAweDQwMDUsIC8vIEFVRElPX0ZPUk1BVF9QQ01fKEZMT0FUfDE2X0JJVCkKICAgICAgICAgTUlYRVJfQ0hBTk5FTF9NQVNLID0gMHg0MDA2LCAvLyBDaGFubmVsIG1hc2sgZm9yIG1peGVyIG91dHB1dAorICAgICAgICAvLyBmb3IgaGFwdGljCisgICAgICAgIEhBUFRJQ19FTkFCTEVEICA9IDB4NDAwNywgLy8gU2V0IGhhcHRpYyBkYXRhIGZyb20gdGhpcyB0cmFjayBzaG91bGQgYmUgcGxheWVkIG9yIG5vdC4KKyAgICAgICAgSEFQVElDX0lOVEVOU0lUWSA9IDB4NDAwOCwgLy8gU2V0IHRoZSBpbnRlbnNpdHkgdG8gcGxheSBoYXB0aWMgZGF0YS4KICAgICAgICAgLy8gZm9yIHRhcmdldCBSRVNBTVBMRQogICAgICAgICBTQU1QTEVfUkFURSAgICAgPSAweDQxMDAsIC8vIENvbmZpZ3VyZSBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uIG9uIHRoaXMgdHJhY2sgbmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgJ3ZhbHVlJyBpcyB0aGUgbmV3IHNhbXBsZSByYXRlIGluIEh6LgpAQCAtOTUsNiArMTA0LDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyICd2YWx1ZScgaXMgYSBwb2ludGVyIHRvIHRoZSBuZXcgcGxheWJhY2sgcmF0ZS4KICAgICB9OwogCisgICAgdHlwZWRlZiBlbnVtIHsgLy8gSGFwdGljIGludGVuc2l0eSwgc2hvdWxkIGtlZXAgY29uc2lzdGVudCB3aXRoIFZpYnJhdG9yU2VydmljZQorICAgICAgICBIQVBUSUNfU0NBTEVfTVVURSA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX01VVEUsCisgICAgICAgIEhBUFRJQ19TQ0FMRV9WRVJZX0xPVyA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX1ZFUllfTE9XLAorICAgICAgICBIQVBUSUNfU0NBTEVfTE9XID0gb3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZTo6U0NBTEVfTE9XLAorICAgICAgICBIQVBUSUNfU0NBTEVfTk9ORSA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX05PTkUsCisgICAgICAgIEhBUFRJQ19TQ0FMRV9ISUdIID0gb3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZTo6U0NBTEVfSElHSCwKKyAgICAgICAgSEFQVElDX1NDQUxFX1ZFUllfSElHSCA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX1ZFUllfSElHSCwKKyAgICB9IGhhcHRpY19pbnRlbnNpdHlfdDsKKyAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IEhBUFRJQ19TQ0FMRV9WRVJZX0xPV19SQVRJTyA9IDIuMGYgLyAzLjBmOworICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQgSEFQVElDX1NDQUxFX0xPV19SQVRJTyA9IDMuMGYgLyA0LjBmOworICAgIHN0YXRpYyBjb25zdCBjb25zdGV4cHIgZmxvYXQgSEFQVElDX01BWF9BTVBMSVRVREVfRkxPQVQgPSAxLjBmOworCisgICAgc3RhdGljIGlubGluZSBib29sIGlzVmFsaWRIYXB0aWNJbnRlbnNpdHkoaGFwdGljX2ludGVuc2l0eV90IGhhcHRpY0ludGVuc2l0eSkgeworICAgICAgICBzd2l0Y2ggKGhhcHRpY0ludGVuc2l0eSkgeworICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9NVVRFOgorICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9WRVJZX0xPVzoKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfTE9XOgorICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9OT05FOgorICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9ISUdIOgorICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9WRVJZX0hJR0g6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEF1ZGlvTWl4ZXIoc2l6ZV90IGZyYW1lQ291bnQsIHVpbnQzMl90IHNhbXBsZVJhdGUpCiAgICAgICAgIDogbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSkKICAgICAgICAgLCBtRnJhbWVDb3VudChmcmFtZUNvdW50KSB7CkBAIC0xMzIsNyArMTY3LDE1IEBACiAgICAgdm9pZCAgICAgICAgc2V0QnVmZmVyUHJvdmlkZXIoaW50IG5hbWUsIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIGJ1ZmZlclByb3ZpZGVyKTsKIAogICAgIHZvaWQgICAgICAgIHByb2Nlc3MoKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcGFpciA6IG1UcmFja3MpIHsKKyAgICAgICAgICAgIC8vIENsZWFyIGNvbnRyYWN0ZWQgYnVmZmVyIGJlZm9yZSBwcm9jZXNzaW5nIGlmIGNvbnRyYWN0ZWQgY2hhbm5lbHMgYXJlIHNhdmVkCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0ID0gcGFpci5zZWNvbmQ7CisgICAgICAgICAgICBpZiAodC0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICB0LT5jbGVhckNvbnRyYWN0ZWRCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICAodGhpcy0+Km1Ib29rKSgpOworICAgICAgICBwcm9jZXNzSGFwdGljRGF0YSgpOwogICAgIH0KIAogICAgIHNpemVfdCAgICAgIGdldFVucmVsZWFzZWRGcmFtZXMoaW50IG5hbWUpIGNvbnN0OwpAQCAtMjMwLDYgKzI3Myw4IEBACiAgICAgICAgICAgICBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOwogICAgICAgICAgICAgbURvd25taXhlckJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOwogICAgICAgICAgICAgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CisgICAgICAgICAgICBtQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CisgICAgICAgICAgICBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKICAgICAgICAgfQogCiAgICAgICAgIGJvb2wgICAgICAgIG5lZWRzUmFtcCgpIHsgcmV0dXJuICh2b2x1bWVJbmNbMF0gfCB2b2x1bWVJbmNbMV0gfCBhdXhJbmMpICE9IDA7IH0KQEAgLTI0NCw2ICsyODksMTEgQEAKICAgICAgICAgdm9pZCAgICAgICAgdW5wcmVwYXJlRm9yRG93bm1peCgpOwogICAgICAgICBzdGF0dXNfdCAgICBwcmVwYXJlRm9yUmVmb3JtYXQoKTsKICAgICAgICAgdm9pZCAgICAgICAgdW5wcmVwYXJlRm9yUmVmb3JtYXQoKTsKKyAgICAgICAgc3RhdHVzX3QgICAgcHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CisgICAgICAgIHZvaWQgICAgICAgIHVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CisgICAgICAgIHN0YXR1c190ICAgIHByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKHNpemVfdCBmcmFtZXMpOworICAgICAgICB2b2lkICAgICAgICB1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKCk7CisgICAgICAgIHZvaWQgICAgICAgIGNsZWFyQ29udHJhY3RlZEJ1ZmZlcigpOwogICAgICAgICBib29sICAgICAgICBzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSk7CiAgICAgICAgIHZvaWQgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CiAKQEAgLTI5NywxNyArMzQ3LDI3IEBACiAgICAgICAgICAqIGFsbCBwcmUtbWl4ZXIgdHJhY2sgYnVmZmVyIGNvbnZlcnNpb25zIG91dHNpZGUgdGhlIEF1ZGlvTWl4ZXIgY2xhc3MuCiAgICAgICAgICAqCiAgICAgICAgICAqIDEpIG1JbnB1dEJ1ZmZlclByb3ZpZGVyOiBUaGUgQXVkaW9UcmFjayBidWZmZXIgcHJvdmlkZXIuCi0gICAgICAgICAqIDIpIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgdGhlIGF1ZGlvIHJlZm9ybWF0IHRvCisgICAgICAgICAqIDIpIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyOiBFeHBhbmRzIG9yIGNvbnRyYWN0cyBzYW1wbGUgZGF0YSBmcm9tIG9uZSBpbnRlcmxlYXZlZAorICAgICAgICAgKiAgICBjaGFubmVsIGZvcm1hdCB0byBhbm90aGVyLiBFeHBhbmRlZCBjaGFubmVscyBhcmUgZmlsbGVkIHdpdGggemVyb3MgYW5kIHB1dCBhdCB0aGUgZW5kCisgICAgICAgICAqICAgIG9mIGVhY2ggYXVkaW8gZnJhbWUuIENvbnRyYWN0ZWQgY2hhbm5lbHMgYXJlIGNvcGllZCB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAqIDMpIG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlcjogTm9uLWRlc3RydWN0aXZlbHkgY29udHJhY3Qgc2FtcGxlIGRhdGEuCisgICAgICAgICAqICAgIFRoaXMgaXMgY3VycmVudGx5IHVzaW5nIGF0IGF1ZGlvLWhhcHRpYyBjb3VwbGVkIHBsYXliYWNrIHRvIHNlcGFyYXRlIGF1ZGlvIGFuZCBoYXB0aWMKKyAgICAgICAgICogICAgZGF0YS4gQ29udHJhY3RlZCBjaGFubmVscyBjb3VsZCBiZSB3cml0dGVuIHRvIGdpdmVuIGJ1ZmZlci4KKyAgICAgICAgICogNCkgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgYXVkaW8gcmVmb3JtYXQgdG8KICAgICAgICAgICogICAgbWF0Y2ggZWl0aGVyIG1NaXhlckluRm9ybWF0IG9yIG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQsIGlmIHRoZSBkb3dubWl4ZXIKICAgICAgICAgICogICAgcmVxdWlyZXMgcmVmb3JtYXQuIEZvciBleGFtcGxlLCBpdCBtYXkgY29udmVydCBmbG9hdGluZyBwb2ludCBpbnB1dCB0bwogICAgICAgICAgKiAgICBQQ01fMTZfYml0IGlmIHRoYXQncyByZXF1aXJlZCBieSB0aGUgZG93bm1peGVyLgotICAgICAgICAgKiAzKSBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgY2hhbm5lbCByZW1peGluZyB0byBtYXRjaAorICAgICAgICAgKiA1KSBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgY2hhbm5lbCByZW1peGluZyB0byBtYXRjaAogICAgICAgICAgKiAgICB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHJlcXVpcmVkIGJ5IHRoZSBtaXhlciBzaW5rLgotICAgICAgICAgKiA0KSBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgcmVmb3JtYXR0aW5nIGZyb20KKyAgICAgICAgICogNikgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHJlZm9ybWF0dGluZyBmcm9tCiAgICAgICAgICAqICAgIHRoZSBkb3dubWl4ZXIgcmVxdWlyZW1lbnRzIHRvIHRoZSBtaXhlciBlbmdpbmUgaW5wdXQgcmVxdWlyZW1lbnRzLgotICAgICAgICAgKiA1KSBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjogQWRkcyB0aW1lc3RyZXRjaGluZyBmb3IgcGxheWJhY2sgcmF0ZQorICAgICAgICAgKiA3KSBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjogQWRkcyB0aW1lc3RyZXRjaGluZyBmb3IgcGxheWJhY2sgcmF0ZQogICAgICAgICAgKi8KICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogICAgIG1JbnB1dEJ1ZmZlclByb3ZpZGVyOyAgICAvLyBleHRlcm5hbGx5IHByb3ZpZGVkIGJ1ZmZlciBwcm92aWRlci4KKyAgICAgICAgLy8gVE9ETzogY29tYmluZSBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlciBhbmQKKyAgICAgICAgLy8gbUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXNzdGhydUJ1ZmZlclByb3ZpZGVyPiBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcjsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI+IG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlcjsKICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI+IG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOwogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbURvd25taXhlckJ1ZmZlclByb3ZpZGVyOwogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcjsKQEAgLTMzNiw2ICszOTYsNTEgQEAKIAogICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSAgICBtUGxheWJhY2tSYXRlOwogCisgICAgICAgIC8vIEhhcHRpYworICAgICAgICBib29sICAgICAgICAgICAgICAgICBtSGFwdGljUGxheWJhY2tFbmFibGVkOworICAgICAgICBoYXB0aWNfaW50ZW5zaXR5X3QgICBtSGFwdGljSW50ZW5zaXR5OworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtSGFwdGljQ2hhbm5lbE1hc2s7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1IYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1NaXhlckhhcHRpY0NoYW5uZWxNYXNrOworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1BZGp1c3RJbkNoYW5uZWxDb3VudDsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUFkanVzdE91dENoYW5uZWxDb3VudDsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudDsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgbUtlZXBDb250cmFjdGVkQ2hhbm5lbHM7CisKKyAgICAgICAgZmxvYXQgZ2V0SGFwdGljU2NhbGVHYW1tYSgpIGNvbnN0IHsKKyAgICAgICAgLy8gTmVlZCB0byBrZWVwIGNvbnNpc3RlbnQgd2l0aCB0aGUgdmFsdWUgaW4gVmlicmF0b3JTZXJ2aWNlLgorICAgICAgICBzd2l0Y2ggKG1IYXB0aWNJbnRlbnNpdHkpIHsKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfVkVSWV9MT1c6CisgICAgICAgICAgICByZXR1cm4gMi4wZjsKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfTE9XOgorICAgICAgICAgICAgcmV0dXJuIDEuNWY7CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX0hJR0g6CisgICAgICAgICAgICByZXR1cm4gMC41ZjsKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfVkVSWV9ISUdIOgorICAgICAgICAgICAgcmV0dXJuIDAuMjVmOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDEuMGY7CisgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGdldEhhcHRpY01heEFtcGxpdHVkZVJhdGlvKCkgY29uc3QgeworICAgICAgICAvLyBOZWVkIHRvIGtlZXAgY29uc2lzdGVudCB3aXRoIHRoZSB2YWx1ZSBpbiBWaWJyYXRvclNlcnZpY2UuCisgICAgICAgIHN3aXRjaCAobUhhcHRpY0ludGVuc2l0eSkgeworICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9WRVJZX0xPVzoKKyAgICAgICAgICAgIHJldHVybiBIQVBUSUNfU0NBTEVfVkVSWV9MT1dfUkFUSU87CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX0xPVzoKKyAgICAgICAgICAgIHJldHVybiBIQVBUSUNfU0NBTEVfTE9XX1JBVElPOworICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9OT05FOgorICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9ISUdIOgorICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9WRVJZX0hJR0g6CisgICAgICAgICAgICByZXR1cm4gMS4wZjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwLjBmOworICAgICAgICB9CisgICAgICAgIH0KKwogICAgIHByaXZhdGU6CiAgICAgICAgIC8vIGhvb2tzCiAgICAgICAgIHZvaWQgdHJhY2tfX2dlbmVyaWNSZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCk7CkBAIC0zNzIsNiArNDc3LDggQEAKICAgICB0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+CiAgICAgdm9pZCBwcm9jZXNzX19ub1Jlc2FtcGxlT25lVHJhY2soKTsKIAorICAgIHZvaWQgcHJvY2Vzc0hhcHRpY0RhdGEoKTsKKwogICAgIHN0YXRpYyBwcm9jZXNzX2hvb2tfdCBnZXRQcm9jZXNzSG9vayhpbnQgcHJvY2Vzc1R5cGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1peGVySW5Gb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0KTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oCmluZGV4IDk2N2Q4OTUuLjI0ODM3ZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9QYXJhbWV0ZXIuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUGFyYW1ldGVyLmgKQEAgLTY0LDYgKzY0LDkgQEAKICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVByZXNlbnRhdGlvbklkOwogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5UHJvZ3JhbUlkOwogCisgICAgLy8gIGtleUF1ZGlvTGFuZ3VhZ2VQcmVmZXJyZWQ6IFByZWZlcnJlZCBhdWRpbyBsYW5ndWFnZQorICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5QXVkaW9MYW5ndWFnZVByZWZlcnJlZDsKKwogICAgIC8vICBrZXlTdHJlYW1Db25uZWN0IC8gRGlzY29ubmVjdDogdmFsdWUgaXMgYW4gaW50IGluIGF1ZGlvX2RldmljZXNfdAogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5U3RyZWFtQ29ubmVjdDsKICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVN0cmVhbURpc2Nvbm5lY3Q7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5LmgKaW5kZXggOGRhMDA2OS4uYmY4ZDYyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3kuaApAQCAtNDksMTMgKzQ5LDMwIEBACiAjZGVmaW5lIE1JWF9TVEFURV9JRExFIDAKICNkZWZpbmUgTUlYX1NUQVRFX01JWElORyAxCiAKKy8qKiBDb250cm9sIHRvIHdoaWNoIGRldmljZSBzb21lIGF1ZGlvIGlzIHJlbmRlcmVkICovCiAjZGVmaW5lIE1JWF9ST1VURV9GTEFHX1JFTkRFUiAweDEKKy8qKiBMb29wIGJhY2sgc29tZSBhdWRpbyBpbnN0ZWFkIG9mIHJlbmRlcmluZyBpdCAqLwogI2RlZmluZSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0sgKDB4MSA8PCAxKQorLyoqIExvb3AgYmFjayBzb21lIGF1ZGlvIHdoaWxlIGl0IGlzIHJlbmRlcmVkICovCisjZGVmaW5lIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDS19BTkRfUkVOREVSIChNSVhfUk9VVEVfRkxBR19SRU5ERVIgfCBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spCiAjZGVmaW5lIE1JWF9ST1VURV9GTEFHX0FMTCAoTUlYX1JPVVRFX0ZMQUdfUkVOREVSIHwgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKQogCiAjZGVmaW5lIE1BWF9NSVhFU19QRVJfUE9MSUNZIDEwCiAjZGVmaW5lIE1BWF9DUklURVJJQV9QRVJfTUlYIDIwCiAKK2NsYXNzIEF1ZGlvRGV2aWNlVHlwZUFkZHIgeworcHVibGljOgorICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIoKSB7fQorICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIoYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcykgOgorICAgICAgICBtVHlwZSh0eXBlKSwgbUFkZHJlc3MoYWRkcmVzcykge30KKworICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKFBhcmNlbCAqcGFyY2VsKTsKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdDsKKworICAgIGF1ZGlvX2RldmljZXNfdCBtVHlwZTsKKyAgICBTdHJpbmc4IG1BZGRyZXNzOworfTsKKwogY2xhc3MgQXVkaW9NaXhNYXRjaENyaXRlcmlvbiB7CiBwdWJsaWM6CiAgICAgQXVkaW9NaXhNYXRjaENyaXRlcmlvbigpIHt9CkBAIC04Nyw3ICsxMDQsMTAgQEAKICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChQYXJjZWwgKnBhcmNlbCk7CiAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Q7CiAKLSAgICBWZWN0b3I8QXVkaW9NaXhNYXRjaENyaXRlcmlvbj4gbUNyaXRlcmlhOworICAgIHZvaWQgc2V0RXhjbHVkZVVpZCh1aWRfdCB1aWQpIGNvbnN0OworICAgIHZvaWQgc2V0TWF0Y2hVaWQodWlkX3QgdWlkKSBjb25zdDsKKworICAgIG11dGFibGUgVmVjdG9yPEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24+IG1Dcml0ZXJpYTsKICAgICB1aW50MzJfdCAgICAgICAgbU1peFR5cGU7CiAgICAgYXVkaW9fY29uZmlnX3QgIG1Gb3JtYXQ7CiAgICAgdWludDMyX3QgICAgICAgIG1Sb3V0ZUZsYWdzOwpAQCAtMTAzLDYgKzEyMywxMSBAQAogI2RlZmluZSBSRUNPUkRfQ09ORklHX0VWRU5UX1NUQVJUIDEKICNkZWZpbmUgUkVDT1JEX0NPTkZJR19FVkVOVF9TVE9QICAwCiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19taXhfbG9vcGJhY2tfcmVuZGVyKHVpbnQzMl90IHJvdXRlRmxhZ3MpIHsKKyAgICByZXR1cm4gKHJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0tfQU5EX1JFTkRFUikKKyAgICAgICAgICAgPT0gTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLX0FORF9SRU5ERVI7Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19QT0xJQ1lfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmU5NTQ2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpZm5kZWYgQVVESU9fUE9MSUNZX0hFTFBFUl9IXwotI2RlZmluZSBBVURJT19QT0xJQ1lfSEVMUEVSX0hfCi0KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLXN0YXRpYyBpbmxpbmUKLWF1ZGlvX3N0cmVhbV90eXBlX3QgYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpCi17Ci0gICAgLy8gZmxhZ3MgdG8gc3RyZWFtIHR5cGUgbWFwcGluZwotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpID09IEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgewotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU7Ci0gICAgfQotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX1NDTykgPT0gQVVESU9fRkxBR19TQ08pIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOwotICAgIH0KLQotICAgIC8vIHVzYWdlIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKLSAgICBzd2l0Y2ggKGF0dHItPnVzYWdlKSB7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTlQ6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1NZU1RFTTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0RUTUY7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FMQVJNOwotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9SSU5HOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5lCi12b2lkIHN0cmVhbV90eXBlX3RvX2F1ZGlvX2F0dHJpYnV0ZXMoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikgewotICAgIG1lbXNldChhdHRyLCAwLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0KLSAgICBzd2l0Y2ggKHN0cmVhbVR5cGUpIHsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9ERUZBVUxUOgotICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgotICAgICAgICBhdHRyLT5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfTVVTSUM7Ci0gICAgICAgIGF0dHItPnVzYWdlID0gQVVESU9fVVNBR0VfTUVESUE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw6Ci0gICAgICAgIGF0dHItPmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0g7Ci0gICAgICAgIGF0dHItPnVzYWdlID0gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRToKLSAgICAgICAgYXR0ci0+ZmxhZ3MgIHw9IEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRDsKLSAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7IC8vIGF0dHJpYnV0ZXMgaW4gY29tbW9uIHdpdGggU1RSRUFNX1NZU1RFTQotICAgIGNhc2UgQVVESU9fU1RSRUFNX1NZU1RFTToKLSAgICAgICAgYXR0ci0+Y29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fUklORzoKLSAgICAgICAgYXR0ci0+Y29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9BTEFSTToKLSAgICAgICAgYXR0ci0+Y29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9BTEFSTTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOgotICAgICAgICBhdHRyLT5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOwotICAgICAgICBhdHRyLT51c2FnZSA9IEFVRElPX1VTQUdFX05PVElGSUNBVElPTjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzoKLSAgICAgICAgYXR0ci0+Y29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOwotICAgICAgICBhdHRyLT5mbGFncyB8PSBBVURJT19GTEFHX1NDTzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fRFRNRjoKLSAgICAgICAgYXR0ci0+Y29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX1RUUzoKLSAgICAgICAgYXR0ci0+Y29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dFKCJpbnZhbGlkIHN0cmVhbSB0eXBlICVkIHdoZW4gY29udmVydGluZyB0byBhdHRyaWJ1dGVzIiwgc3RyZWFtVHlwZSk7Ci0gICAgfQotfQotCi0jZW5kaWYgLy9BVURJT19QT0xJQ1lfSEVMUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ0MTA5NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBdWRpb1Byb2R1Y3RTdHJhdGVneSA6IHB1YmxpYyBQYXJjZWxhYmxlCit7CitwdWJsaWM6CisgICAgQXVkaW9Qcm9kdWN0U3RyYXRlZ3koKSB7fQorICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBjb25zdCBzdGQ6OnZlY3RvcjxBdWRpb0F0dHJpYnV0ZXM+ICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBpZCkgOgorICAgICAgICBtTmFtZShuYW1lKSwgbUF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwgbUlkKGlkKSB7fQorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorICAgIHN0ZDo6dmVjdG9yPEF1ZGlvQXR0cmlidXRlcz4gZ2V0QXVkaW9BdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gbUF1ZGlvQXR0cmlidXRlczsgfQorICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRJZCgpIGNvbnN0IHsgcmV0dXJuIG1JZDsgfQorCisgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGF0dHJpYnV0ZXNNYXRjaGVzOiBjaGVja3MgaWYgY2xpZW50IGF0dHJpYnV0ZXMgbWF0Y2hlcyB3aXRoIGEgcmVmZXJlbmNlIGF0dHJpYnV0ZXMKKyAgICAgKiAibWF0Y2hpbmciIG1lYW5zIHRoZSB1c2FnZSBzaGFsbCBtYXRjaCBpZiByZWZlcmVuY2UgYXR0cmlidXRlcyBoYXMgYSBkZWZpbmVkIHVzYWdlLCBBTkQKKyAgICAgKiBjb250ZW50IHR5cGUgc2hhbGwgbWF0Y2ggaWYgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgaGFzIGEgZGVmaW5lZCBjb250ZW50IHR5cGUgQU5ECisgICAgICogZmxhZ3Mgc2hhbGwgbWF0Y2ggaWYgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgaGFzIGRlZmluZWQgZmxhZ3MgQU5ECisgICAgICogdGFncyBzaGFsbCBtYXRjaCBpZiByZWZlcmVuY2UgYXR0cmlidXRlcyBoYXMgZGVmaW5lZCB0YWdzLgorICAgICAqIFJlZmVyZW5jZSBhdHRyaWJ1dGVzICJkZWZhdWx0IiBzaGFsbCBub3QgYmUgY29uc2lkZXJlZCBhcyBhICJ0cnVlIiBjYXNlLiBUaGlzIGNvbnZlbnRpb24KKyAgICAgKiBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBkZWZhdWx0IHN0cmF0ZWd5LgorICAgICAqIEBwYXJhbSByZWZBdHRyaWJ1dGVzIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gY2xpZW50QXR0cml0dWJlcyB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiB0cnVlIGlmIG1hdGNoaW5nLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbCBhdHRyaWJ1dGVzTWF0Y2hlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgcmVmQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgY2xpZW50QXR0cml0dWJlcyk7Citwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1OYW1lOworICAgIHN0ZDo6dmVjdG9yPEF1ZGlvQXR0cmlidXRlcz4gbUF1ZGlvQXR0cmlidXRlczsKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgbUlkOworfTsKKwordXNpbmcgQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgPSBzdGQ6OnZlY3RvcjxBdWRpb1Byb2R1Y3RTdHJhdGVneT47CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCmluZGV4IDgwNjI4MGEuLmI0ZGRiNjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKQEAgLTE4OSw3ICsxODksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCA9IEFVRElPX1VJRF9JTlZBTElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkID0gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE1pY0RpcmVjdGlvbiA9IE1JQ19ESVJFQ1RJT05fVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uID0gTUlDX0ZJRUxEX0RJTUVOU0lPTl9ERUZBVUxUKTsKIAogICAgIC8qIFRlcm1pbmF0ZXMgdGhlIEF1ZGlvUmVjb3JkIGFuZCB1bnJlZ2lzdGVycyBpdCBmcm9tIEF1ZGlvRmxpbmdlci4KICAgICAgKiBBbHNvIGRlc3Ryb3lzIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBBdWRpb1JlY29yZC4KQEAgLTIyOCw3ICsyMzEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQgPSBBVURJT19VSURfSU5WQUxJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRNaWNEaXJlY3Rpb24gPSBNSUNfRElSRUNUSU9OX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNlbGVjdGVkTWljRmllbGREaW1lbnNpb24gPSBNSUNfRklFTERfRElNRU5TSU9OX0RFRkFVTFQpOwogCiAgICAgLyogUmVzdWx0IG9mIGNvbnN0cnVjdGluZyB0aGUgQXVkaW9SZWNvcmQuIFRoaXMgbXVzdCBiZSBjaGVja2VkIGZvciBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uCiAgICAgICogYmVmb3JlIHVzaW5nIGFueSBBdWRpb1JlY29yZCBBUEkgKGV4Y2VwdCBmb3Igc2V0KCkpLCBiZWNhdXNlIHVzaW5nCkBAIC01MzQsOSArNTQwLDIzIEBACiAgICAgICovCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CiAKLSAgICAvKgotICAgICAqIER1bXBzIHRoZSBzdGF0ZSBvZiBhbiBhdWRpbyByZWNvcmQuCisgICAgLyogU2V0IHRoZSBNaWNyb3Bob25lIGRpcmVjdGlvbiAoZm9yIHByb2Nlc3NpbmcgcHVycG9zZXMpLgogICAgICAqLworICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7CisKKyAgICAvKiBTZXQgdGhlIE1pY3JvcGhvbmUgem9vbSBmYWN0b3IgKGZvciBwcm9jZXNzaW5nIHB1cnBvc2VzKS4KKyAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKKworICAgICAvKiBHZXQgdGhlIHVuaXF1ZSBwb3J0IElEIGFzc2lnbmVkIHRvIHRoaXMgQXVkaW9SZWNvcmQgaW5zdGFuY2UgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIuCisgICAgICAqIFRoZSBJRCBpcyB1bmlxdWUgYWNyb3NzIGFsbCBhdWRpb3NlcnZlciBjbGllbnRzIGFuZCBjYW4gY2hhbmdlIGR1cmluZyB0aGUgbGlmZSBjeWNsZQorICAgICAgKiBvZiBhIGdpdmVuIEF1ZGlvUmVjb3JkIGluc3RhbmNlIGlmIHRoZSBjb25uZWN0aW9uIHRvIGF1ZGlvc2VydmVyIGlzIHJlc3RvcmVkLgorICAgICAgKi8KKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0UG9ydElkKCkgY29uc3QgeyByZXR1cm4gbVBvcnRJZDsgfTsKKworICAgICAvKgorICAgICAgKiBEdW1wcyB0aGUgc3RhdGUgb2YgYW4gYXVkaW8gcmVjb3JkLgorICAgICAgKi8KICAgICAgICAgICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKIAogcHJpdmF0ZToKQEAgLTU0OCw3ICs1NjgsNyBAQAogICAgIGNsYXNzIEF1ZGlvUmVjb3JkVGhyZWFkIDogcHVibGljIFRocmVhZAogICAgIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIEF1ZGlvUmVjb3JkVGhyZWFkKEF1ZGlvUmVjb3JkJiByZWNlaXZlciwgYm9vbCBiQ2FuQ2FsbEphdmEgPSBmYWxzZSk7CisgICAgICAgIEF1ZGlvUmVjb3JkVGhyZWFkKEF1ZGlvUmVjb3JkJiByZWNlaXZlcik7CiAKICAgICAgICAgLy8gRG8gbm90IGNhbGwgVGhyZWFkOjpyZXF1ZXN0RXhpdEFuZFdhaXQoKSB3aXRob3V0IGZpcnN0IGNhbGxpbmcgcmVxdWVzdEV4aXQoKS4KICAgICAgICAgLy8gVGhyZWFkOjpyZXF1ZXN0RXhpdEFuZFdhaXQoKSBpcyBub3QgdmlydHVhbCwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGRvIGVub3VnaC4KQEAgLTY1NCw2ICs2NzQsNyBAQAogICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgICAgIG1PcmlnRmxhZ3M7ICAgICAgICAgICAgIC8vIGFzIHNwZWNpZmllZCBpbiBjb25zdHJ1Y3RvciBvciBzZXQoKSwgY29uc3QKIAogICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgIG1TZXNzaW9uSWQ7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbVBvcnRJZDsgICAgICAgICAgICAgICAgICAgIC8vIElkIGZyb20gQXVkaW8gUG9saWN5IE1hbmFnZXIKICAgICB0cmFuc2Zlcl90eXBlICAgICAgICAgICBtVHJhbnNmZXI7CiAKICAgICAvLyBOZXh0IDUgZmllbGRzIG1heSBiZSBjaGFuZ2VkIGlmIElBdWRpb1JlY29yZCBpcyByZS1jcmVhdGVkLCBidXQgYWx3YXlzICE9IDAKQEAgLTY2Miw3ICs2ODMsNyBAQAogICAgIHNwPElNZW1vcnk+ICAgICAgICAgICAgIG1DYmxrTWVtb3J5OwogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogICAgIG1DYmxrOyAgICAgICAgICAgICAgLy8gcmUtbG9hZCBhZnRlciBtTG9jay51bmxvY2soKQogICAgIHNwPElNZW1vcnk+ICAgICAgICAgICAgIG1CdWZmZXJNZW1vcnk7Ci0gICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgbUlucHV0OyAgICAgICAgICAgICAvLyByZXR1cm5lZCBieSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXQoKQorICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1JbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOyAvLyBmcm9tIEF1ZGlvU3lzdGVtOjpnZXRJbnB1dGZvckF0dHIoKQogCiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzUHJpb3JpdHk7ICAvLyBiZWZvcmUgc3RhcnQoKQogICAgIFNjaGVkUG9saWN5ICAgICAgICAgICAgIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cDsKQEAgLTcwMSwxMCArNzIyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWN0aXZpdHkgYW5kIGNvbm5lY3RlZCBkZXZpY2VzCiAgICAgd3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+IG1EZXZpY2VDYWxsYmFjazsKIAorICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgbVNlbGVjdGVkTWljRGlyZWN0aW9uOworICAgIGZsb2F0IG1TZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uOworCiBwcml2YXRlOgogICAgIGNsYXNzIE1lZGlhTWV0cmljcyB7CiAgICAgICBwdWJsaWM6Ci0gICAgICAgIE1lZGlhTWV0cmljcygpIDogbUFuYWx5dGljc0l0ZW0obmV3IE1lZGlhQW5hbHl0aWNzSXRlbSgiYXVkaW9yZWNvcmQiKSksCisgICAgICAgIE1lZGlhTWV0cmljcygpIDogbUFuYWx5dGljc0l0ZW0oTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoImF1ZGlvcmVjb3JkIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1DcmVhdGVkTnMoc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydGVkTnMoMCksIG1EdXJhdGlvbk5zKDApLCBtQ291bnQoMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RFcnJvcihOT19FUlJPUikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCmluZGV4IDRjMGY3OTYuLmU2NGYyODUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKQEAgLTIwLDYgKzIwLDggQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oPgpAQCAtMzUsOSArMzcsMTQgQEAKIAogdHlwZWRlZiB2b2lkICgqYXVkaW9fZXJyb3JfY2FsbGJhY2spKHN0YXR1c190IGVycik7CiB0eXBlZGVmIHZvaWQgKCpkeW5hbWljX3BvbGljeV9jYWxsYmFjaykoaW50IGV2ZW50LCBTdHJpbmc4IHJlZ0lkLCBpbnQgdmFsKTsKLXR5cGVkZWYgdm9pZCAoKnJlY29yZF9jb25maWdfY2FsbGJhY2spKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOwordHlwZWRlZiB2b2lkICgqcmVjb3JkX2NvbmZpZ19jYWxsYmFjaykoaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKIAogY2xhc3MgSUF1ZGlvRmxpbmdlcjsKIGNsYXNzIElBdWRpb1BvbGljeVNlcnZpY2U7CkBAIC0yMDQsMTIgKzIxMSwxNCBAQAogICAgIC8vIElBdWRpb1BvbGljeVNlcnZpY2UgaW50ZXJmYWNlIChzZWUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgZm9yIG1ldGhvZCBkZXNjcmlwdGlvbnMpCiAgICAgLy8KICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLCBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KTsKICAgICBzdGF0aWMgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgc3RhdGljIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7CiAgICAgc3RhdGljIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKTsKQEAgLTIyMywxNiArMjMyLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCk7Ci0gICAgc3RhdGljIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cyk7CisgICAgc3RhdGljIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgc3RhdGljIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKICAgICAvLyBDbGllbnQgbXVzdCBzdWNjZXNzZnVsbHkgaGFuZCBvZmYgdGhlIGhhbmRsZSByZWZlcmVuY2UgdG8gQXVkaW9GbGluZ2VyIHZpYSBjcmVhdGVSZWNvcmQoKSwKICAgICAvLyBvciByZWxlYXNlIGl0IHdpdGggcmVsZWFzZUlucHV0KCkuCkBAIC0yNDcsOCArMjUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOwogCi0gICAgc3RhdGljIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqc2lsZW5jZWQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICBzdGF0aWMgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLApAQCAtMjYxLDYgKzI2NCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKIAorICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisgICAgc3RhdGljIHN0YXR1c190IGdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50ICZpbmRleCk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50ICZpbmRleCk7CisKICAgICBzdGF0aWMgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogICAgIHN0YXRpYyBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CiAKQEAgLTMyNywxOSArMzQxLDI5IEBACiAKICAgICBzdGF0aWMgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcywgYm9vbCByZWdpc3RyYXRpb24pOwogCisgICAgc3RhdGljIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworCisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKTsKKwogICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubyk7CiAgICAgc3RhdGljIHN0YXR1c190IGdldE1hc3Rlck1vbm8oYm9vbCAqbW9ubyk7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWFzdGVyQmFsYW5jZShmbG9hdCAqYmFsYW5jZSk7CisKICAgICBzdGF0aWMgZmxvYXQgICAgZ2V0U3RyZWFtVm9sdW1lREIoCiAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cyk7CisKICAgICAvLyBudW1TdXJyb3VuZEZvcm1hdHMgaG9sZHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZvcm1hdHMgYW5kIGJvb2wgdmFsdWUgYWxsb3dlZCBpbiB0aGUgYXJyYXkuCiAgICAgLy8gV2hlbiBudW1TdXJyb3VuZEZvcm1hdHMgaXMgMCwgc3Vycm91bmRGb3JtYXRzIGFuZCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkIHdpbGwgbm90IGJlCiAgICAgLy8gcG9wdWxhdGVkLiBUaGUgYWN0dWFsIG51bWJlciBvZiBzdXJyb3VuZCBmb3JtYXRzIHNob3VsZCBiZSByZXR1cm5lZCBhdCBudW1TdXJyb3VuZEZvcm1hdHMuCkBAIC0zNDksOCArMzczLDQwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpOwogCisgICAgc3RhdGljIHN0YXR1c190IHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcyk7CisKKyAgICBzdGF0aWMgYm9vbCAgICAgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworCisgICAgc3RhdGljIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSk7CisKKyAgICBzdGF0aWMgYXVkaW9fYXR0cmlidXRlc190IHN0cmVhbVR5cGVUb0F0dHJpYnV0ZXMoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgIHN0YXRpYyBhdWRpb19zdHJlYW1fdHlwZV90IGF0dHJpYnV0ZXNUb1N0cmVhbVR5cGUoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90ICZ2b2x1bWVHcm91cCk7CisKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKKyAgICBjbGFzcyBBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2sgOiBwdWJsaWMgUmVmQmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKCkge30KKyAgICAgICAgdmlydHVhbCB+QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKCkge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBvblNlcnZpY2VEaWVkKCkgPSAwOworCisgICAgfTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spOworICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spOworCiAgICAgY2xhc3MgQXVkaW9Qb3J0Q2FsbGJhY2sgOiBwdWJsaWMgUmVmQmFzZQogICAgIHsKICAgICBwdWJsaWM6CkBAIC0zNzgsNiArNDM0LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpID0gMDsKICAgICB9OwogCisgICAgY2xhc3MgQXVkaW9EZXZpY2VDYWxsYmFja1Byb3h5IDogcHVibGljIFJlZkJhc2UKKyAgICB7CisgICAgcHVibGljOgorCisgICAgICAgICAgQXVkaW9EZXZpY2VDYWxsYmFja1Byb3h5KHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+IGNhbGxiYWNrKQorICAgICAgICAgICAgICA6IG1DYWxsYmFjayhjYWxsYmFjaykge30KKyAgICAgICAgICB+QXVkaW9EZXZpY2VDYWxsYmFja1Byb3h5KCkgb3ZlcnJpZGUge30KKworICAgICAgICAgIHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+IGNhbGxiYWNrKCkgY29uc3QgeyByZXR1cm4gbUNhbGxiYWNrLnByb21vdGUoKTsgfTsKKworICAgICAgICAgIGJvb2wgbm90aWZpZWRPbmNlKCkgY29uc3QgeyByZXR1cm4gbU5vdGlmaWVkT25jZTsgfQorICAgICAgICAgIHZvaWQgc2V0Tm90aWZpZWRPbmNlKCkgeyBtTm90aWZpZWRPbmNlID0gdHJ1ZTsgfQorICAgIHByaXZhdGU6CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgbU5vdGlmaWVkT25jZSBpdCBmb3JjZXMgdGhlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlIHdoZW4KKyAgICAgICAgICogcmVnaXN0ZXJlZCB3aXRoIGEgVkFMSUQgQXVkaW9EZXZpY2UsIGFuZCBhbGxvd3Mgbm90IHRvIGZsb29kIG90aGVyIGxpc3RlbmVycworICAgICAgICAgKiBvbiB0aGlzIGlvaGFuZGxlIHRoYXQgYWxyZWFkeSBrbm93IHRoZSB2YWxpZCBkZXZpY2UuCisgICAgICAgICAqLworICAgICAgICAgYm9vbCBtTm90aWZpZWRPbmNlID0gZmFsc2U7CisgICAgICAgICB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiBtQ2FsbGJhY2s7CisgICAgfTsKKwogICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCkBAIC00MjEsOCArNDk5LDI3IEBACiAgICAgcHJpdmF0ZToKICAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CiAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+ID4gICBtSW9EZXNjcmlwdG9yczsKLSAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBWZWN0b3IgPCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiA+ID4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrczsKKworICAgICAgICBjbGFzcyBBdWRpb0RldmljZUNhbGxiYWNrUHJveGllcyA6IHB1YmxpYyBWZWN0b3I8c3A8QXVkaW9EZXZpY2VDYWxsYmFja1Byb3h5Pj4KKyAgICAgICAgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEBicmllZiBub3RpZmllZE9uY2UgZW5zdXJlcyB0aGF0IGlmIGEgY2xpZW50IGFkZHMgYSBjYWxsYmFjaywgaXQgbXVzdCBhdCBsZWFzdCBiZQorICAgICAgICAgICAgICogY2FsbGVkIG9uY2Ugd2l0aCB0aGUgZGV2aWNlIG9uIHdoaWNoIGl0IHdpbGwgYmUgcm91dGVkIHRvLgorICAgICAgICAgICAgICogQHJldHVybiB0cnVlIGlmIGFscmVhZHkgbm90aWZpZWQgb3Igbm9ib2R5IHdhaXRzIGZvciBhIGNhbGxiYWNrLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGJvb2wgbm90aWZpZWRPbmNlKCkgY29uc3QgeyByZXR1cm4gKHNpemUoKSA9PSAwKSB8fCBtTm90aWZpZWRPbmNlOyB9CisgICAgICAgICAgICB2b2lkIHNldE5vdGlmaWVkT25jZSgpIHsgbU5vdGlmaWVkT25jZSA9IHRydWU7IH0KKyAgICAgICAgICAgIHZvaWQgcmVzZXROb3RpZmllZE9uY2UoKSB7IG1Ob3RpZmllZE9uY2UgPSBmYWxzZTsgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBAYnJpZWYgbU5vdGlmaWVkT25jZSBpdCBmb3JjZXMgZWFjaCBjYWxsYmFjayB0byBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZSB3aGVuCisgICAgICAgICAgICAgKiByZWdpc3RlcmVkIHdpdGggYSBWQUxJRCBBdWRpb0RldmljZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBib29sIG1Ob3RpZmllZE9uY2UgPSBmYWxzZTsKKyAgICAgICAgfTsKKyAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBBdWRpb0RldmljZUNhbGxiYWNrUHJveGllcz4KKyAgICAgICAgICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja1Byb3hpZXM7CiAgICAgICAgIC8vIGNhY2hlZCB2YWx1ZXMgZm9yIHJlY29yZGluZyBnZXRJbnB1dEJ1ZmZlclNpemUoKSBxdWVyaWVzCiAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbkJ1ZmZTaXplOyAgICAvLyB6ZXJvIGluZGljYXRlcyBjYWNoZSBpcyBpbnZhbGlkCiAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JblNhbXBsaW5nUmF0ZTsKQEAgLTQ0MiwyMSArNTM5LDMxIEBACiAgICAgICAgIGludCByZW1vdmVBdWRpb1BvcnRDYWxsYmFjayhjb25zdCBzcDxBdWRpb1BvcnRDYWxsYmFjaz4mIGNhbGxiYWNrKTsKICAgICAgICAgYm9vbCBpc0F1ZGlvUG9ydENiRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIChtQXVkaW9Qb3J0Q2FsbGJhY2tzLnNpemUoKSAhPSAwKTsgfQogCisgICAgICAgIGludCBhZGRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spOworICAgICAgICBpbnQgcmVtb3ZlQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKyAgICAgICAgYm9vbCBpc0F1ZGlvVm9sdW1lR3JvdXBDYkVuYWJsZWQoKSBjb25zdCB7IHJldHVybiAobUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjay5zaXplKCkgIT0gMCk7IH0KKwogICAgICAgICAvLyBEZWF0aFJlY2lwaWVudAogICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKIAogICAgICAgICAvLyBJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncyk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CiAKICAgICBwcml2YXRlOgogICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKICAgICAgICAgVmVjdG9yIDxzcCA8QXVkaW9Qb3J0Q2FsbGJhY2s+ID4gICAgbUF1ZGlvUG9ydENhbGxiYWNrczsKKyAgICAgICAgVmVjdG9yIDxzcCA8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiA+IG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s7CiAgICAgfTsKIAogICAgIHN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oCmluZGV4IDQ5OGRlOGUuLmU1OTI1ZGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UaW1lc3RhbXAuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmgKQEAgLTEzNSw4ICsxMzUsMjMgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAorICAgIGRvdWJsZSBnZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXModWludDMyX3Qgc2FtcGxlUmF0ZSkgY29uc3QgeworICAgICAgICByZXR1cm4gZ2V0TGF0ZW5jeU1zKHNhbXBsZVJhdGUsIExPQ0FUSU9OX1NFUlZFUiwgTE9DQVRJT05fS0VSTkVMKTsKKyAgICB9CisKKyAgICBkb3VibGUgZ2V0TGF0ZW5jeU1zKHVpbnQzMl90IHNhbXBsZVJhdGUsIExvY2F0aW9uIGxvY2F0aW9uMSwgTG9jYXRpb24gbG9jYXRpb24yKSBjb25zdCB7CisgICAgICAgIGlmIChzYW1wbGVSYXRlID4gMCAmJiBtVGltZU5zW2xvY2F0aW9uMV0gPiAwICYmIG1UaW1lTnNbbG9jYXRpb24yXSA+IDApIHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgZnJhbWVEaWZmZXJlbmNlID0KKyAgICAgICAgICAgICAgICAgICAgbVBvc2l0aW9uW2xvY2F0aW9uMV0gLSBtUG9zaXRpb25bbG9jYXRpb24yXTsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdGltZURpZmZlcmVuY2VOcyA9CisgICAgICAgICAgICAgICAgICAgIG1UaW1lTnNbbG9jYXRpb24xXSAtIG1UaW1lTnNbbG9jYXRpb24yXTsKKyAgICAgICAgICAgIHJldHVybiAoKGRvdWJsZSlmcmFtZURpZmZlcmVuY2UgKiAxZTkgLyBzYW1wbGVSYXRlIC0gdGltZURpZmZlcmVuY2VOcykgKiAxZS02OworICAgICAgICB9CisgICAgICAgIHJldHVybiAwLjsKKyAgICB9CisKICAgICAvLyBjb252ZXJ0IGZpZWxkcyB0byBhIHByaW50YWJsZSBzdHJpbmcKLSAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIHsKKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CiAKICAgICAgICAgc3MgPDwgIkJPT1RUSU1FIG9mZnNldCAiIDw8IG1UaW1lYmFzZU9mZnNldFtUSU1FQkFTRV9CT09UVElNRV0gPDwgIlxuIjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmgKaW5kZXggNTljNmY0Yy4uMzkyNmVhZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmgKQEAgLTc0LDYgKzc0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBtYXBwaW5nIGZyb20gZnJhbWUgcG9zaXRpb24gdG8gcHJlc2VudGF0aW9uIHRpbWUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWUgQXVkaW9UaW1lc3RhbXAgZm9yIHRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlZCB3aXRoIGV2ZW50LgogI2VuZGlmCisgICAgICAgIEVWRU5UX0NBTl9XUklURV9NT1JFX0RBVEEgPSA5LC8vIE5vdGlmaWNhdGlvbiB0aGF0IG1vcmUgZGF0YSBjYW4gYmUgZ2l2ZW4gYnkgd3JpdGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBldmVudCBvbmx5IG9jY3VycyBmb3IgVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSy4KICAgICB9OwogCiAgICAgLyogQ2xpZW50IHNob3VsZCBkZWNsYXJlIGEgQnVmZmVyIGFuZCBwYXNzIHRoZSBhZGRyZXNzIHRvIG9idGFpbkJ1ZmZlcigpCkBAIC0xNDUsNiArMTQ3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUpOwogCisgICAgLyogQ2hlY2sgaWYgZGlyZWN0IHBsYXliYWNrIGlzIHBvc3NpYmxlIGZvciB0aGUgZ2l2ZW4gYXVkaW8gY29uZmlndXJhdGlvbiBhbmQgYXR0cmlidXRlcy4KKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBvdXRwdXQgaXMgcG9zc2libGUgZm9yIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiBPdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKTsKKwogICAgIC8qIEhvdyBkYXRhIGlzIHRyYW5zZmVycmVkIHRvIEF1ZGlvVHJhY2sKICAgICAgKi8KICAgICBlbnVtIHRyYW5zZmVyX3R5cGUgewpAQCAtMTUzLDYgKzE2MSw3IEBACiAgICAgICAgIFRSQU5TRkVSX09CVEFJTiwgICAgLy8gY2FsbCBvYnRhaW5CdWZmZXIoKSBhbmQgcmVsZWFzZUJ1ZmZlcigpCiAgICAgICAgIFRSQU5TRkVSX1NZTkMsICAgICAgLy8gc3luY2hyb25vdXMgd3JpdGUoKQogICAgICAgICBUUkFOU0ZFUl9TSEFSRUQsICAgIC8vIHNoYXJlZCBtZW1vcnkKKyAgICAgICAgVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSywgLy8gc3luY2hyb25vdXMgd3JpdGUoKSwgbm90aWYgRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQQogICAgIH07CiAKICAgICAvKiBDb25zdHJ1Y3RzIGFuIHVuaW5pdGlhbGl6ZWQgQXVkaW9UcmFjay4gTm8gY29ubmVjdGlvbiB3aXRoCkBAIC0yOTUsNiArMzA0LDggQEAKICAgICAgKiBQYXJhbWV0ZXJzIG5vdCBsaXN0ZWQgaW4gdGhlIEF1ZGlvVHJhY2sgY29uc3RydWN0b3JzIGFib3ZlOgogICAgICAqCiAgICAgICogdGhyZWFkQ2FuQ2FsbEphdmE6ICBXaGV0aGVyIGNhbGxiYWNrcyBhcmUgbWFkZSBmcm9tIGFuIGF0dGFjaGVkIHRocmVhZCBhbmQgdGh1cyBjYW4gY2FsbCBKTkkuCisgICAgICogICAgICBPbmx5IHNldCB0byB0cnVlIHdoZW4gQXVkaW9UcmFjayBvYmplY3QgaXMgdXNlZCBmb3IgYSBqYXZhIGFuZHJvaWQubWVkaWEuQXVkaW9UcmFjaworICAgICAqICAgICAgaW4gaXRzIEpOSSBjb2RlLgogICAgICAqCiAgICAgICogSW50ZXJuYWwgc3RhdGUgcG9zdCBjb25kaXRpb246CiAgICAgICogICAgICAobVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIGltcGxpZXMgdGhpcyBBdWRpb1RyYWNrIGhhcyB2YWxpZCBhdHRyaWJ1dGVzCkBAIC05MDcsNyArOTE4LDE0IEBACiAgICAgICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgICAgICAgICAgICAgIHJldHVybiBtU3RhdGUgPT0gU1RBVEVfQUNUSVZFIHx8IG1TdGF0ZSA9PSBTVEFURV9TVE9QUElORzsKICAgICAgICAgICAgIH0KLXByb3RlY3RlZDoKKworICAgIC8qIEdldCB0aGUgdW5pcXVlIHBvcnQgSUQgYXNzaWduZWQgdG8gdGhpcyBBdWRpb1RyYWNrIGluc3RhbmNlIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgorICAgICAqIFRoZSBJRCBpcyB1bmlxdWUgYWNyb3NzIGFsbCBhdWRpb3NlcnZlciBjbGllbnRzIGFuZCBjYW4gY2hhbmdlIGR1cmluZyB0aGUgbGlmZSBjeWNsZQorICAgICAqIG9mIGEgZ2l2ZW4gQXVkaW9UcmFjayBpbnN0YW5jZSBpZiB0aGUgY29ubmVjdGlvbiB0byBhdWRpb3NlcnZlciBpcyByZXN0b3JlZC4KKyAgICAgKi8KKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0UG9ydElkKCkgY29uc3QgeyByZXR1cm4gbVBvcnRJZDsgfTsKKworIHByb3RlY3RlZDoKICAgICAvKiBjb3B5aW5nIGF1ZGlvIHRyYWNrcyBpcyBub3QgYWxsb3dlZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayhjb25zdCBBdWRpb1RyYWNrJiBvdGhlcik7CiAgICAgICAgICAgICBBdWRpb1RyYWNrJiBvcGVyYXRvciA9IChjb25zdCBBdWRpb1RyYWNrJiBvdGhlcik7CkBAIC05MTYsNyArOTM0LDcgQEAKICAgICBjbGFzcyBBdWRpb1RyYWNrVGhyZWFkIDogcHVibGljIFRocmVhZAogICAgIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIEF1ZGlvVHJhY2tUaHJlYWQoQXVkaW9UcmFjayYgcmVjZWl2ZXIsIGJvb2wgYkNhbkNhbGxKYXZhID0gZmFsc2UpOworICAgICAgICBBdWRpb1RyYWNrVGhyZWFkKEF1ZGlvVHJhY2smIHJlY2VpdmVyKTsKIAogICAgICAgICAvLyBEbyBub3QgY2FsbCBUaHJlYWQ6OnJlcXVlc3RFeGl0QW5kV2FpdCgpIHdpdGhvdXQgZmlyc3QgY2FsbGluZyByZXF1ZXN0RXhpdCgpLgogICAgICAgICAvLyBUaHJlYWQ6OnJlcXVlc3RFeGl0QW5kV2FpdCgpIGlzIG5vdCB2aXJ0dWFsLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgZG8gZW5vdWdoLgpAQCAtMTAwMyw3ICsxMDIxLDcgQEAKICAgICBzcDxJQXVkaW9UcmFjaz4gICAgICAgICBtQXVkaW9UcmFjazsKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQ2Jsa01lbW9yeTsKICAgICBhdWRpb190cmFja19jYmxrX3QqICAgICBtQ2JsazsgICAgICAgICAgICAgICAgICAvLyByZS1sb2FkIGFmdGVyIG1Mb2NrLnVubG9jaygpCi0gICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgbU91dHB1dDsgICAgICAgICAgICAgICAgLy8gcmV0dXJuZWQgYnkgQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoKQorICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1PdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsgLy8gZnJvbSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigpCiAKICAgICBzcDxBdWRpb1RyYWNrVGhyZWFkPiAgICBtQXVkaW9UcmFja1RocmVhZDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICBtVGhyZWFkQ2FuQ2FsbEphdmE7CkBAIC0xMDU4LDYgKzEwNzYsMTkgQEAKICAgICAgICAgU1RBVEVfU1RPUFBJTkcsCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlOwogCisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzdGF0ZVRvU3RyaW5nKFN0YXRlIHN0YXRlKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICBjYXNlIFNUQVRFX0FDVElWRTogICAgICAgICAgcmV0dXJuICJTVEFURV9BQ1RJVkUiOworICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6ICAgICAgICAgcmV0dXJuICJTVEFURV9TVE9QUEVEIjsKKyAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6ICAgICAgICAgIHJldHVybiAiU1RBVEVfUEFVU0VEIjsKKyAgICAgICAgY2FzZSBTVEFURV9QQVVTRURfU1RPUFBJTkc6IHJldHVybiAiU1RBVEVfUEFVU0VEX1NUT1BQSU5HIjsKKyAgICAgICAgY2FzZSBTVEFURV9GTFVTSEVEOiAgICAgICAgIHJldHVybiAiU1RBVEVfRkxVU0hFRCI7CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBJTkc6ICAgICAgICByZXR1cm4gIlNUQVRFX1NUT1BQSU5HIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgIHJldHVybiAiVU5LTk9XTiI7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBmb3IgY2xpZW50IGNhbGxiYWNrIGhhbmRsZXIKICAgICBjYWxsYmFja190ICAgICAgICAgICAgICBtQ2JmOyAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFjayBoYW5kbGVyIGZvciBldmVudHMsIG9yIE5VTEwKICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBtVXNlckRhdGE7CkBAIC0xMTQ4LDYgKzExNzksNyBAQAogCiAgICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgbVNlc3Npb25JZDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtQXV4RWZmZWN0SWQ7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbVBvcnRJZDsgICAgICAgICAgICAgICAgICAgIC8vIElkIGZyb20gQXVkaW8gUG9saWN5IE1hbmFnZXIKIAogICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgIG1Mb2NrOwogCkBAIC0xMTk1LDcgKzEyMjcsNyBAQAogcHJpdmF0ZToKICAgICBjbGFzcyBNZWRpYU1ldHJpY3MgewogICAgICAgcHVibGljOgotICAgICAgICBNZWRpYU1ldHJpY3MoKSA6IG1BbmFseXRpY3NJdGVtKG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oImF1ZGlvdHJhY2siKSkgeworICAgICAgICBNZWRpYU1ldHJpY3MoKSA6IG1BbmFseXRpY3NJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKCJhdWRpb3RyYWNrIikpIHsKICAgICAgICAgfQogICAgICAgICB+TWVkaWFNZXRyaWNzKCkgewogICAgICAgICAgICAgLy8gbUFuYWx5dGljc0l0ZW0gYWxsb2MgZmFpbHVyZSB3aWxsIGJlIGZsYWdnZWQgaW4gdGhlIGNvbnN0cnVjdG9yCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNmVhMDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQXVkaW9Wb2x1bWVHcm91cCA6IHB1YmxpYyBQYXJjZWxhYmxlCit7CitwdWJsaWM6CisgICAgQXVkaW9Wb2x1bWVHcm91cCgpIHt9CisgICAgQXVkaW9Wb2x1bWVHcm91cChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90IGdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlc1ZlY3RvciAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbXMpIDoKKyAgICAgICAgbU5hbWUobmFtZSksIG1Hcm91cElkKGdyb3VwKSwgbUF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwgbVN0cmVhbXMoc3RyZWFtcykge30KKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKyAgICB2b2x1bWVfZ3JvdXBfdCBnZXRJZCgpIGNvbnN0IHsgcmV0dXJuIG1Hcm91cElkOyB9CisgICAgQXR0cmlidXRlc1ZlY3RvciBnZXRBdWRpb0F0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBtQXVkaW9BdHRyaWJ1dGVzOyB9CisgICAgU3RyZWFtVHlwZVZlY3RvciBnZXRTdHJlYW1UeXBlcygpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1zOyB9CisKKyAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgbU5hbWU7CisgICAgdm9sdW1lX2dyb3VwX3QgbUdyb3VwSWQgPSBWT0xVTUVfR1JPVVBfTk9ORTsKKyAgICBBdHRyaWJ1dGVzVmVjdG9yIG1BdWRpb0F0dHJpYnV0ZXM7CisgICAgU3RyZWFtVHlwZVZlY3RvciBtU3RyZWFtczsKK307CisKK3VzaW5nIEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgPSBzdGQ6OnZlY3RvcjxBdWRpb1ZvbHVtZUdyb3VwPjsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaAppbmRleCBlNmJmNzJmLi5lZjBlZDBjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaApAQCAtMTQ2LDYgKzE0Niw3IEBACiAgICAgICAgICAgICBhZlNhbXBsZVJhdGUgPSBwYXJjZWwtPnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgYWZMYXRlbmN5TXMgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwogICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZvdXRwdXRJZCwgc2l6ZW9mKGF1ZGlvX2lvX2hhbmRsZV90KSk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJnBvcnRJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCkBAIC0xNjMsNiArMTY0LDcgQEAKICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQ2NChhZlNhbXBsZVJhdGUpOwogICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDMyKGFmTGF0ZW5jeU1zKTsKICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJm91dHB1dElkLCBzaXplb2YoYXVkaW9faW9faGFuZGxlX3QpKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJnBvcnRJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCkBAIC0xNzksNiArMTgxLDcgQEAKICAgICAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwogICAgICAgICB1aW50MzJfdCBhZkxhdGVuY3lNczsKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0SWQ7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkOwogICAgIH07CiAKICAgICAvKiBDcmVhdGVSZWNvcmRJbnB1dCBjb250YWlucyBhbGwgaW5wdXQgYXJndW1lbnRzIHNlbnQgYnkgQXVkaW9SZWNvcmQgdG8gQXVkaW9GbGluZ2VyCkBAIC0yNzEsNiArMjc0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJnBvcnRJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCkBAIC0yOTcsNiArMzAxLDcgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDMyKDApOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmcG9ydElkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwogCiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KQEAgLTMxMyw2ICszMTgsNyBAQAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dElkOwogICAgICAgICBzcDxJTWVtb3J5PiBjYmxrOwogICAgICAgICBzcDxJTWVtb3J5PiBidWZmZXJzOworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZDsKICAgICB9OwogCiAgICAgLy8gaW52YXJpYW50IG9uIGV4aXQgZm9yIGFsbCBBUElzIHRoYXQgcmV0dXJuIGFuIHNwPD46CkBAIC0zNTMsNiArMzU5LDkgQEAKICAgICB2aXJ0dWFsICAgICBmbG9hdCAgICAgICBtYXN0ZXJWb2x1bWUoKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgbWFzdGVyTXV0ZSgpIGNvbnN0ID0gMDsKIAorICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSkgPSAwOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGdldE1hc3RlckJhbGFuY2UoZmxvYXQgKmJhbGFuY2UpIGNvbnN0ID0gMDsKKwogICAgIC8qIHNldC9nZXQgc3RyZWFtIHR5cGUgc3RhdGUuIFRoaXMgd2lsbCBwcm9iYWJseSBiZSB1c2VkIGJ5CiAgICAgICogdGhlIHByZWZlcmVuY2UgcGFuZWwsIG1vc3RseS4KICAgICAgKi8KQEAgLTQyOCw3ICs0MzcsOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSBjb25zdCA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVmZmVjdERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFVVSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIGNvbnN0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcFR5cGVVVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIGNvbnN0ID0gMDsKIAogICAgIHZpcnR1YWwgc3A8SUVmZmVjdD4gY3JlYXRlRWZmZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2MsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCmluZGV4IGMzODc2YWYuLjM1NTQwZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0yMCwxNSArMjAsMTQgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KLQogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50Lmg+Ci0KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ1LDEyICs0NCwxNCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgPSAwOwogICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKSA9IDA7CkBAIC02NSwxNiArNjYsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgIGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKQEAgLTg1LDggKzgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzaWxlbmNlZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKQEAgLTk4LDYgKzkzLDE3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpID0gMDsKKwogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykgPSAwOwpAQCAtMTE1LDEwICsxMjEsMjggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpID0gMDsKICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaXMgcG9zc2libGUgZm9yIGdpdmVuIGZvcm1hdCwgc3RyZWFtIHR5cGUsIHNhbXBsZSByYXRlLAogICAgIC8vIGJpdCByYXRlLCBkdXJhdGlvbiwgdmlkZW8gYW5kIHN0cmVhbWluZyBvciBvZmZsb2FkIHByb3BlcnR5IGlzIGVuYWJsZWQKICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBpbmZvKSA9IDA7CiAKKyAgICAvLyBDaGVjayBpZiBkaXJlY3QgcGxheWJhY2sgaXMgcG9zc2libGUgZm9yIGdpdmVuIGZvcm1hdCwgc2FtcGxlIHJhdGUsIGNoYW5uZWwgbWFzayBhbmQgZmxhZ3MuCisgICAgdmlydHVhbCBib29sIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKSA9IDA7CisKICAgICAvKiBMaXN0IGF2YWlsYWJsZSBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCkBAIC0xNDcsNiArMTcxLDggQEAKIAogICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCkgPSAwOwogCisgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCkgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKSA9IDA7CkBAIC0xNTcsMTAgKzE4MywxNSBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzLCBib29sIHJlZ2lzdHJhdGlvbikgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQorICAgICAgICAgICAgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCkgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTW9ubyhib29sIG1vbm8pID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck1vbm8oYm9vbCAqbW9ubykgPSAwOwpAQCAtMTcxLDcgKzIwMiwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpzdXJyb3VuZEZvcm1hdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqc3Vycm91bmRGb3JtYXRzRW5hYmxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCAgICAgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5KSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90ICZ2b2x1bWVHcm91cCkgPSAwOwogfTsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCmluZGV4IGUwZDI0OTUuLjc5MDA4YzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCkBAIC0xNywxMCArMTcsMTQgQEAKICNpZm5kZWYgQU5EUk9JRF9JQVVESU9QT0xJQ1lTRVJWSUNFQ0xJRU5UX0gKICNkZWZpbmUgQU5EUk9JRF9JQVVESU9QT0xJQ1lTRVJWSUNFQ0xJRU5UX0gKIAorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMCw2ICszNCw4IEBACiAgICAgdWlkX3QgdWlkOwogICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uOwogICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRfaWQ7CisgICAgYm9vbCBzaWxlbmNlZDsKIH07CiAKIHR5cGVkZWYgc3RydWN0IHJlY29yZF9jbGllbnRfaW5mbyByZWNvcmRfY2xpZW50X2luZm9fdDsKQEAgLTQxLDYgKzQ3LDggQEAKIHB1YmxpYzoKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEF1ZGlvUG9saWN5U2VydmljZUNsaWVudCk7CiAKKyAgICAvLyBOb3RpZmllcyBhIGNoYW5nZSBvZiB2b2x1bWUgZ3JvdXAKKyAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKSA9IDA7CiAgICAgLy8gTm90aWZpZXMgYSBjaGFuZ2Ugb2YgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgogICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKSA9IDA7CiAgICAgLy8gTm90aWZpZXMgYSBjaGFuZ2Ugb2YgYXVkaW8gcGF0Y2ggY29uZmlndXJhdGlvbi4KQEAgLTUxLDggKzU5LDExIEBACiAgICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCiAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCiAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkgPSAwOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaAppbmRleCA5NGFmZTNjLi4wNmU3ODZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oCkBAIC03MCw2ICs3MCw5IEBACiAgICAgLyogU2VuZCBwYXJhbWV0ZXJzIHRvIHRoZSBhdWRpbyBoYXJkd2FyZSAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKSA9IDA7CiAKKyAgICAvKiBTZWxlY3RzIHRoZSBwcmVzZW50YXRpb24gKGlmIGF2YWlsYWJsZSkgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpID0gMDsKKwogICAgIC8qIFJldHVybiBOT19FUlJPUiBpZiB0aW1lc3RhbXAgaXMgdmFsaWQuICB0aW1lc3RhbXAgaXMgdW5kZWZpbmVkIG90aGVyd2lzZS4gKi8KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKSA9IDA7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NGI0MzUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi1jY19saWJyYXJ5X3NoYXJlZCB7Ci0gICAgbmFtZTogImxpYmF1ZGlvaGFsQDIuMCIsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJEZXZpY2VIYWxMb2NhbC5jcHAiLAotICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIiwKLSAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIiwKLSAgICAgICAgIlN0cmVhbUhhbExvY2FsLmNwcCIsCi0KLSAgICAgICAgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCIsCi0gICAgICAgICJEZXZpY2VIYWxIaWRsLmNwcCIsCi0gICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkVmZmVjdEhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAiLAotICAgICAgICAiU3RyZWFtSGFsSGlkbC5jcHAiLAotICAgIF0sCi0KLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYXVkaW9oYWxfZGVhdGhoYW5kbGVyIiwKLSAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJoYXJkd2FyZSIsCi0gICAgICAgICJsaWJiYXNlIiwKLSAgICAgICAgImxpYmZtcSIsCi0gICAgICAgICJsaWJod2JpbmRlciIsCi0gICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICJsaWJoaWRsbWVtb3J5IiwKLSAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0AyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDIuMC11dGlsIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCi0gICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCi0gICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAotICAgICAgICAibGlibWVkaWF1dGlscyIsCi0gICAgXSwKLSAgICBoZWFkZXJfbGliczogWwotICAgICAgICAibGliYXVkaW9oYWxfaGVhZGVycyIKLSAgICBdLAotCi0gICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwotICAgICAgICAibGliZm1xIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MGJmOGIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIExPR19UQUcgIkhhbEhpZGwiCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RhdGljCi1zdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6a2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cykgewotICAgIEF1ZGlvUGFyYW1ldGVyIGhhbEtleXMoa2V5cyk7Ci0gICAgaWYgKGhhbEtleXMuc2l6ZSgpID09IDApIHJldHVybiBCQURfVkFMVUU7Ci0gICAgaGlkbEtleXMtPnJlc2l6ZShoYWxLZXlzLnNpemUoKSk7Ci0gICAgLy9GSVhNRTogIGtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzIGFuZCBrZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzIGNvbWUgd2l0aCBhCi0gICAgLy8gImtleUZvcm1hdD08dmFsdWU+IiBwYWlyLiBXZSBuZWVkIHRvIHRyYW5zZm9ybSBpdCBpbnRvIGEgc2luZ2xlIGtleSBzdHJpbmcgc28gdGhhdCBpdCBpcwotICAgIC8vIGNhcnJpZWQgb3ZlciB0byB0aGUgbGVnYWN5IEhBTCB2aWEgSElETC4KLSAgICBTdHJpbmc4IHZhbHVlOwotICAgIGJvb2wga2VlcEZvcm1hdFZhbHVlID0gaGFsS2V5cy5zaXplKCkgPT0gMiAmJgotICAgICAgICAgKGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SIHx8Ci0gICAgICAgICBoYWxLZXlzLmdldChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzKSwgdmFsdWUpID09IE5PX0VSUk9SKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGFsS2V5cy5zaXplKCk7ICsraSkgewotICAgICAgICBTdHJpbmc4IGtleTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaGFsS2V5cy5nZXRBdChpLCBrZXkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgICAgICBpZiAoa2VlcEZvcm1hdFZhbHVlICYmIGtleSA9PSBBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0KSB7Ci0gICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBmb3JtYXRQYXJhbTsKLSAgICAgICAgICAgIGhhbEtleXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICBmb3JtYXRQYXJhbS5hZGQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICBrZXkgPSBmb3JtYXRQYXJhbS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgICgqaGlkbEtleXMpW2ldID0ga2V5LnN0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNGcm9tSGFsKAotICAgICAgICBjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpIHsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXMoa3ZQYWlycyk7Ci0gICAgaWYgKHBhcmFtcy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICBoaWRsUGFyYW1zLT5yZXNpemUocGFyYW1zLnNpemUoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgU3RyaW5nOCBrZXksIHZhbHVlOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICgqaGlkbFBhcmFtcylbaV0ua2V5ID0ga2V5LnN0cmluZygpOwotICAgICAgICAoKmhpZGxQYXJhbXMpW2ldLnZhbHVlID0gdmFsdWUuc3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotLy8gc3RhdGljCi12b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzVG9IYWwoCi0gICAgICAgIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW1zOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5zaXplKCk7ICsraSkgewotICAgICAgICBwYXJhbXMuYWRkKFN0cmluZzgocGFyYW1ldGVyc1tpXS5rZXkuY19zdHIoKSksIFN0cmluZzgocGFyYW1ldGVyc1tpXS52YWx1ZS5jX3N0cigpKSk7Ci0gICAgfQotICAgIHZhbHVlcy0+c2V0VG8ocGFyYW1zLnRvU3RyaW5nKCkpOwotfQotCi1Db252ZXJzaW9uSGVscGVySGlkbDo6Q29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKQotICAgICAgICA6IG1DbGFzc05hbWUoY2xhc3NOYW1lKSB7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKLSAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOwotICAgIH0KLX0KLQotdm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6ZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbikgewotICAgIEFMT0dFKCIlcyAlcCAlczogJXMgKGZyb20gcnBjKSIsIG1DbGFzc05hbWUsIHRoaXMsIGZ1bmNOYW1lLCBkZXNjcmlwdGlvbik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9Db252ZXJzaW9uSGVscGVySGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzU2ZjM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9Db252ZXJzaW9uSGVscGVySGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBDb252ZXJzaW9uSGVscGVySGlkbCB7Ci0gIHByb3RlY3RlZDoKLSAgICBzdGF0aWMgc3RhdHVzX3Qga2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cyk7Ci0gICAgc3RhdGljIHN0YXR1c190IHBhcmFtZXRlcnNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcyk7Ci0gICAgc3RhdGljIHZvaWQgcGFyYW1ldGVyc1RvSGFsKGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIENvbnZlcnNpb25IZWxwZXJIaWRsKGNvbnN0IGNoYXIqIGNsYXNzTmFtZSk7Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBUPgotICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxSPiYgcmV0LCBUICpyZXR2YWwpIHsKLSAgICAgICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgd2F5IGl0IGFsc28gd29ya3MgZm9yIGVudW0gY2xhc3MgdG8gdW5zY29wZWQgZW51bSBjb252ZXJzaW9uLgotICAgICAgICAgICAgKnJldHZhbCA9IHN0YXRpY19jYXN0PFQ+KHN0YXRpY19jYXN0PFI+KHJldCkpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKGZ1bmNOYW1lLCByZXQpOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFQ+JiByZXQpIHsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gT0sgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPGhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UmVzdWx0PiYgcmV0KSB7Ci0gICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFQ+JiByZXQsIGhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UmVzdWx0IHJldHZhbCkgewotICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgY29uc3QgY2hhciogbUNsYXNzTmFtZTsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IGhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UmVzdWx0JiByZXN1bHQpOwotCi0gICAgdm9pZCBlbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yjk5ZDcwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlSGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lQcmltYXJ5RGV2aWNlLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLSNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Db25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0RldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvSW5wdXRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9PdXRwdXRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9QYXRjaEhhbmRsZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvUG9ydDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvUG9ydENvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvTW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvU291cmNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6SGlkbFV0aWxzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OkRldmljZUFkZHJlc3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVByaW1hcnlEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UGFyYW1ldGVyVmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1uYW1lc3BhY2UgewotCi1zdGF0dXNfdCBkZXZpY2VBZGRyZXNzRnJvbUhhbCgKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgY2hhciogaGFsQWRkcmVzcywgRGV2aWNlQWRkcmVzcyogYWRkcmVzcykgewotICAgIGFkZHJlc3MtPmRldmljZSA9IEF1ZGlvRGV2aWNlKGRldmljZSk7Ci0KLSAgICBpZiAoaGFsQWRkcmVzcyA9PSBudWxscHRyIHx8IHN0cm5sZW4oaGFsQWRkcmVzcywgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IChkZXZpY2UgJiBBVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwOwotICAgIGlmIChpc0lucHV0KSBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47Ci0gICAgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCkgIT0gMCkKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApICE9IDApKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiJWhoWDolaGhYOiVoaFg6JWhoWDolaGhYOiVoaFgiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLm1hY1swXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzFdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMl0sCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzNdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbNF0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s1XSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gNiA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0lQKSAhPSAwKQotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9JUCkgIT0gMCkpIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAotICAgICAgICAgICAgICAgICIlaGh1LiVoaHUuJWhodS4laGh1IiwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzFdLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMl0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbM10pOwotICAgICAgICByZXR1cm4gc3RhdHVzID09IDQgPyBPSyA6IEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSkgIT0gMAotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9BTExfVVNCKSkgIT0gMCkgewotICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgImNhcmQ9JWQ7ZGV2aWNlPSVkIiwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5hbHNhLmNhcmQsICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuZGV2aWNlKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSAyID8gT0sgOiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQlVTKSAhPSAwKQotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CVVMpICE9IDApKSB7Ci0gICAgICAgIGlmIChoYWxBZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGFkZHJlc3MtPmJ1c0FkZHJlc3MgPSBoYWxBZGRyZXNzOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCkpICE9IDAKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgIT0gMCkpIHsKLSAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgewotICAgICAgICAgICAgYWRkcmVzcy0+clN1Ym1peEFkZHJlc3MgPSBoYWxBZGRyZXNzOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLURldmljZUhhbEhpZGw6OkRldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSkKLSAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRGV2aWNlIiksIG1EZXZpY2UoZGV2aWNlKSwKLSAgICAgICAgICBtUHJpbWFyeURldmljZShJUHJpbWFyeURldmljZTo6Y2FzdEZyb20oZGV2aWNlKSkgewotfQotCi1EZXZpY2VIYWxIaWRsOjp+RGV2aWNlSGFsSGlkbCgpIHsKLSAgICBpZiAobURldmljZSAhPSAwKSB7Ci0gICAgICAgIG1EZXZpY2UuY2xlYXIoKTsKLSAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QqKSB7Ci0gICAgLy8gT2Jzb2xldGUuCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjppbml0Q2hlY2soKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImluaXRDaGVjayIsIG1EZXZpY2UtPmluaXRDaGVjaygpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9pY2VWb2x1bWUiLCBtUHJpbWFyeURldmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJWb2x1bWUiLCBtUHJpbWFyeURldmljZS0+c2V0TWFzdGVyVm9sdW1lKHZvbHVtZSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVByaW1hcnlEZXZpY2UtPmdldE1hc3RlclZvbHVtZSgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgZmxvYXQgdikgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICp2b2x1bWUgPSB2OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNYXN0ZXJWb2x1bWUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNb2RlIiwgbVByaW1hcnlEZXZpY2UtPnNldE1vZGUoQXVkaW9Nb2RlKG1vZGUpKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNaWNNdXRlIiwgbURldmljZS0+c2V0TWljTXV0ZShzdGF0ZSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWljTXV0ZSgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgYm9vbCBtdXRlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnN0YXRlID0gbXV0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWljTXV0ZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3Rlck11dGUiLCBtRGV2aWNlLT5zZXRNYXN0ZXJNdXRlKHN0YXRlKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNYXN0ZXJNdXRlKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNYXN0ZXJNdXRlIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsIG1EZXZpY2UtPnNldFBhcmFtZXRlcnMoaGlkbFBhcmFtcykpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gaGlkbEtleXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0ga2V5c0Zyb21IYWwoa2V5cywgJmhpZGxLZXlzKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldFBhcmFtZXRlcnMoCi0gICAgICAgICAgICBoaWRsS2V5cywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1RvSGFsKHBhcmFtZXRlcnMsIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFBhcmFtZXRlcnMiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLCBzaXplX3QgKnNpemUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRJbnB1dEJ1ZmZlclNpemUoCi0gICAgICAgICAgICBoaWRsQ29uZmlnLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBidWZmZXJTaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGJ1ZmZlclNpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRJbnB1dEJ1ZmZlclNpemUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIERldmljZUFkZHJlc3MgaGlkbERldmljZTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2VBZGRyZXNzRnJvbUhhbChkZXZpY2VzLCBhZGRyZXNzLCAmaGlkbERldmljZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgICAgICBoYW5kbGUsCi0gICAgICAgICAgICBoaWRsRGV2aWNlLAotICAgICAgICAgICAgaGlkbENvbmZpZywKLSAgICAgICAgICAgIEF1ZGlvT3V0cHV0RmxhZyhmbGFncyksCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1PdXQ+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbEhpZGwocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuT3V0cHV0U3RyZWFtIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgaGFuZGxlLAotICAgICAgICAgICAgaGlkbERldmljZSwKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBBdWRpb0lucHV0RmxhZyhmbGFncyksCi0gICAgICAgICAgICBBdWRpb1NvdXJjZShzb3VyY2UpLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJU3RyZWFtSW4+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqaW5TdHJlYW0gPSBuZXcgU3RyZWFtSW5IYWxIaWRsKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdUb0hhbChzdWdnZXN0ZWRDb25maWcsIGNvbmZpZyk7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigib3BlbklucHV0U3RyZWFtIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNBdWRpb1BhdGNoZXMiLCBtRGV2aWNlLT5zdXBwb3J0c0F1ZGlvUGF0Y2hlcygpLCBzdXBwb3J0c1BhdGNoZXMpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8QXVkaW9Qb3J0Q29uZmlnPiBoaWRsU291cmNlcywgaGlkbFNpbmtzOwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnc0Zyb21IYWwobnVtX3NvdXJjZXMsIHNvdXJjZXMsICZoaWRsU291cmNlcyk7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdzRnJvbUhhbChudW1fc2lua3MsIHNpbmtzLCAmaGlkbFNpbmtzKTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5jcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICAgICAgaGlkbFNvdXJjZXMsIGhpZGxTaW5rcywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgQXVkaW9QYXRjaEhhbmRsZSBoaWRsUGF0Y2gpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqcGF0Y2ggPSBzdGF0aWNfY2FzdDxhdWRpb19wYXRjaF9oYW5kbGVfdD4oaGlkbFBhdGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiY3JlYXRlQXVkaW9QYXRjaCIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVsZWFzZUF1ZGlvUGF0Y2giLCBtRGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaCkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBBdWRpb1BvcnQgaGlkbFBvcnQ7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRGcm9tSGFsKCpwb3J0LCAmaGlkbFBvcnQpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldEF1ZGlvUG9ydCgKLSAgICAgICAgICAgIGhpZGxQb3J0LAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBBdWRpb1BvcnQmIHApIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydFRvSGFsKHAsIHBvcnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBdWRpb1BvcnQiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvUG9ydENvbmZpZyBoaWRsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldEF1ZGlvUG9ydENvbmZpZyIsIG1EZXZpY2UtPnNldEF1ZGlvUG9ydENvbmZpZyhoaWRsQ29uZmlnKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY3JvcGhvbmVzKAotICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8gX191bnVzZWQpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5kZWJ1Z0R1bXAoaGlkbEhhbmRsZSk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MxY2I1OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSURldmljZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lQcmltYXJ5RGV2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJUHJpbWFyeURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VIYWxIaWRsIDogcHVibGljIERldmljZUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXRzIHRoZSB2YWx1ZSBvZiAnZGV2aWNlcycgdG8gYSBiaXRtYXNrIG9mIDEgb3IgbW9yZSB2YWx1ZXMgb2YgYXVkaW9fZGV2aWNlc190LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcyk7Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgb2YgYSB2b2ljZSBjYWxsLiBSYW5nZSBpcyBiZXR3ZWVuIDAuMCBhbmQgMS4wLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIGZvciBhbGwgYXVkaW8gYWN0aXZpdGllcyBvdGhlciB0aGFuIHZvaWNlIGNhbGwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIEdldCB0aGUgY3VycmVudCBtYXN0ZXIgdm9sdW1lIHZhbHVlIGZvciB0aGUgSEFMLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpOwotCi0gICAgLy8gTXV0aW5nIGNvbnRyb2wuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljTXV0ZShib29sICpzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSk7Ci0KLSAgICAvLyBTZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gUmV0dXJucyBhdWRpbyBpbnB1dCBidWZmZXIgc2l6ZSBhY2NvcmRpbmcgdG8gcGFyYW1ldGVycyBwYXNzZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUoY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKTsKLQotICAgIC8vIENyZWF0ZXMgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCk7Ci0KLSAgICAvLyBSZWxlYXNlcyBhbiBhdWRpbyBwYXRjaC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKTsKLQotICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAvLyBMaXN0IG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGw7Ci0gICAgc3A8SURldmljZT4gbURldmljZTsKLSAgICBzcDxJUHJpbWFyeURldmljZT4gbVByaW1hcnlEZXZpY2U7ICAvLyBOdWxsIGlmIGl0J3Mgbm90IGEgcHJpbWFyeSBkZXZpY2UuCi0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgRGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCi0gICAgdmlydHVhbCB+RGV2aWNlSGFsSGlkbCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxMb2NhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjM2JmNzguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxMb2NhbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJTdHJlYW1IYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLURldmljZUhhbExvY2FsOjpEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KQotICAgICAgICA6IG1EZXYoZGV2KSB7Ci19Ci0KLURldmljZUhhbExvY2FsOjp+RGV2aWNlSGFsTG9jYWwoKSB7Ci0gICAgaW50IHN0YXR1cyA9IGF1ZGlvX2h3X2RldmljZV9jbG9zZShtRGV2KTsKLSAgICBBTE9HV19JRihzdGF0dXMsICJFcnJvciBjbG9zaW5nIGF1ZGlvIGh3IGRldmljZSAlcDogJXMiLCBtRGV2LCBzdHJlcnJvcigtc3RhdHVzKSk7Ci0gICAgbURldiA9IDA7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgKmRldmljZXMgPSBtRGV2LT5nZXRfc3VwcG9ydGVkX2RldmljZXMobURldik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6aW5pdENoZWNrKCkgewotICAgIHJldHVybiBtRGV2LT5pbml0X2NoZWNrKG1EZXYpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF92b2ljZV92b2x1bWUobURldiwgdm9sdW1lKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBpZiAobURldi0+c2V0X21hc3Rlcl92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpIHsKLSAgICBpZiAobURldi0+Z2V0X21hc3Rlcl92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgewotICAgIHJldHVybiBtRGV2LT5zZXRfbW9kZShtRGV2LCBtb2RlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgewotICAgIHJldHVybiBtRGV2LT5zZXRfbWljX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljTXV0ZShib29sICpzdGF0ZSkgewotICAgIHJldHVybiBtRGV2LT5nZXRfbWljX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgaWYgKG1EZXYtPnNldF9tYXN0ZXJfbXV0ZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9tYXN0ZXJfbXV0ZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X3BhcmFtZXRlcnMobURldiwga3ZQYWlycy5zdHJpbmcoKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIGNoYXIgKmhhbFZhbHVlcyA9IG1EZXYtPmdldF9wYXJhbWV0ZXJzKG1EZXYsIGtleXMuc3RyaW5nKCkpOwotICAgIGlmIChoYWxWYWx1ZXMgIT0gTlVMTCkgewotICAgICAgICB2YWx1ZXMtPnNldFRvKGhhbFZhbHVlcyk7Ci0gICAgICAgIGZyZWUoaGFsVmFsdWVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLCBzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IG1EZXYtPmdldF9pbnB1dF9idWZmZXJfc2l6ZShtRGV2LCBjb25maWcpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6Om9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSkgewotICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqaGFsU3RyZWFtOwotICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gaGFuZGxlOiAlZCBkZXZpY2VzOiAleCBmbGFnczogJSN4IgotICAgICAgICAgICAgInNyYXRlOiAlZCBmb3JtYXQgJSN4IGNoYW5uZWxzICV4IGFkZHJlc3MgJXMiLAotICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKLSAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIGFkZHJlc3MpOwotICAgIGludCBvcGVuUmVzdXQgPSBtRGV2LT5vcGVuX291dHB1dF9zdHJlYW0oCi0gICAgICAgICAgICBtRGV2LCBoYW5kbGUsIGRldmljZXMsIGZsYWdzLCBjb25maWcsICZoYWxTdHJlYW0sIGFkZHJlc3MpOwotICAgIGlmIChvcGVuUmVzdXQgPT0gT0spIHsKLSAgICAgICAgKm91dFN0cmVhbSA9IG5ldyBTdHJlYW1PdXRIYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOwotICAgIH0KLSAgICBBTE9HVigib3Blbl9vdXRwdXRfc3RyZWFtIHN0YXR1cyAlZCBzdHJlYW0gJXAiLCBvcGVuUmVzdXQsIGhhbFN0cmVhbSk7Ci0gICAgcmV0dXJuIG9wZW5SZXN1dDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKLSAgICBhdWRpb19zdHJlYW1faW5fdCAqaGFsU3RyZWFtOwotICAgIEFMT0dWKCJvcGVuX2lucHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3ggIgotICAgICAgICAgICAgInNyYXRlOiAlZCBmb3JtYXQgJSN4IGNoYW5uZWxzICV4IGFkZHJlc3MgJXMgc291cmNlICVkIiwKLSAgICAgICAgICAgIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsCi0gICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICBhZGRyZXNzLCBzb3VyY2UpOwotICAgIGludCBvcGVuUmVzdWx0ID0gbURldi0+b3Blbl9pbnB1dF9zdHJlYW0oCi0gICAgICAgICAgICBtRGV2LCBoYW5kbGUsIGRldmljZXMsIGNvbmZpZywgJmhhbFN0cmVhbSwgZmxhZ3MsIGFkZHJlc3MsIHNvdXJjZSk7Ci0gICAgaWYgKG9wZW5SZXN1bHQgPT0gT0spIHsKLSAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsTG9jYWwoaGFsU3RyZWFtLCB0aGlzKTsKLSAgICB9Ci0gICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIHN0YXR1cyAlZCBzdHJlYW0gJXAiLCBvcGVuUmVzdWx0LCBpblN0cmVhbSk7Ci0gICAgcmV0dXJuIG9wZW5SZXN1bHQ7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpIHsKLSAgICAqc3VwcG9ydHNQYXRjaGVzID0gdmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzA7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Y3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgewotICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewotICAgICAgICByZXR1cm4gbURldi0+Y3JlYXRlX2F1ZGlvX3BhdGNoKAotICAgICAgICAgICAgICAgIG1EZXYsIG51bV9zb3VyY2VzLCBzb3VyY2VzLCBudW1fc2lua3MsIHNpbmtzLCBwYXRjaCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgIHJldHVybiBtRGV2LT5yZWxlYXNlX2F1ZGlvX3BhdGNoKG1EZXYsIHBhdGNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9hdWRpb19wb3J0KG1EZXYsIHBvcnQpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKQotICAgICAgICByZXR1cm4gbURldi0+c2V0X2F1ZGlvX3BvcnRfY29uZmlnKG1EZXYsIGNvbmZpZyk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNyb3Bob25lcygKLSAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpkdW1wKGludCBmZCkgewotICAgIHJldHVybiBtRGV2LT5kdW1wKG1EZXYsIGZkKTsKLX0KLQotdm9pZCBEZXZpY2VIYWxMb2NhbDo6Y2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpIHsKLSAgICBtRGV2LT5jbG9zZV9vdXRwdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9vdXQpOwotfQotCi12b2lkIERldmljZUhhbExvY2FsOjpjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbikgewotICAgIG1EZXYtPmNsb3NlX2lucHV0X3N0cmVhbShtRGV2LCBzdHJlYW1faW4pOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxMb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWMyMDFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZUhhbExvY2FsIDogcHVibGljIERldmljZUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgJ2RldmljZXMnIHRvIGEgYml0bWFzayBvZiAxIG9yIG1vcmUgdmFsdWVzIG9mIGF1ZGlvX2RldmljZXNfdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpOwotCi0gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIG9mIGEgdm9pY2UgY2FsbC4gUmFuZ2UgaXMgYmV0d2VlbiAwLjAgYW5kIDEuMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBmb3IgYWxsIGF1ZGlvIGFjdGl2aXRpZXMgb3RoZXIgdGhhbiB2b2ljZSBjYWxsLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbWFzdGVyIHZvbHVtZSB2YWx1ZSBmb3IgdGhlIEhBTC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKTsKLQotICAgIC8vIE11dGluZyBjb250cm9sLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY011dGUoYm9vbCAqc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpOwotCi0gICAgLy8gU2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIFJldHVybnMgYXVkaW8gaW5wdXQgYnVmZmVyIHNpemUgYWNjb3JkaW5nIHRvIHBhcmFtZXRlcnMgcGFzc2VkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJTaXplKGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOwotCi0gICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7Ci0KLSAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKLQotICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwotCi0gICAgLy8gTGlzdCBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgICB2b2lkIGNsb3NlT3V0cHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0ICpzdHJlYW1fb3V0KTsKLSAgICB2b2lkIGNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX2h3X2RldmljZV90ICptRGV2OwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWw7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgRGV2aWNlSGFsTG9jYWwoYXVkaW9faHdfZGV2aWNlX3QgKmRldik7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgotICAgIHZpcnR1YWwgfkRldmljZUhhbExvY2FsKCk7Ci0KLSAgICB1aW50MzJfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbURldi0+Y29tbW9uLnZlcnNpb247IH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjMzNTkyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSB7Ci0gICAgbURldmljZXNGYWN0b3J5ID0gSURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7Ci0gICAgaWYgKG1EZXZpY2VzRmFjdG9yeSAhPSAwKSB7Ci0gICAgICAgIC8vIEl0IGlzIGFzc3VtZWQgdGhhdCBEZXZpY2VzRmFjdG9yeSBpcyBvd25lZCBieSBBdWRpb0ZsaW5nZXIKLSAgICAgICAgLy8gYW5kIHRodXMgaGF2ZSB0aGUgc2FtZSBsaWZlc3Bhbi4KLSAgICAgICAgbURldmljZXNGYWN0b3J5LT5saW5rVG9EZWF0aChIYWxEZWF0aEhhbmRsZXI6OmdldEluc3RhbmNlKCksIDAgLypjb29raWUqLyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvYnRhaW4gSURldmljZXNGYWN0b3J5IHNlcnZpY2UsIHRlcm1pbmF0aW5nIHByb2Nlc3MuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIC8vIFRoZSBNU0QgZmFjdG9yeSBpcyBvcHRpb25hbAotICAgIG1EZXZpY2VzRmFjdG9yeU1zZCA9IElEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZShBVURJT19IQUxfU0VSVklDRV9OQU1FX01TRCk7Ci0gICAgLy8gVE9ETzogUmVnaXN0ZXIgZGVhdGggaGFuZGxlciwgYW5kIGFkZCAncmVzdGFydCcgZGlyZWN0aXZlIHRvIGF1ZGlvc2VydmVyLnJjCi19Ci0KLURldmljZXNGYWN0b3J5SGFsSGlkbDo6fkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEhpZGw6Om5hbWVGcm9tSGFsKGNvbnN0IGNoYXIgKm5hbWUsIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlICpkZXZpY2UpIHsKLSAgICBpZiAoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKSA9PSAwKSB7Ci0gICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6UFJJTUFSWTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0EyRFApID09IDApIHsKLSAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpBMkRQOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfVVNCKSA9PSAwKSB7Ci0gICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6VVNCOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUkVNT1RFX1NVQk1JWCkgPT0gMCkgewotICAgICAgICAqZGV2aWNlID0gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlJfU1VCTUlYOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfU1RVQikgPT0gMCkgewotICAgICAgICAqZGV2aWNlID0gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlNUVUI7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgQUxPR0UoIkludmFsaWQgZGV2aWNlIG5hbWUgJXMiLCBuYW1lKTsKLSAgICByZXR1cm4gQkFEX1ZBTFVFOwotfQotCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEhpZGw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgaWYgKG1EZXZpY2VzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZSBoaWRsRGV2aWNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG5hbWVGcm9tSGFsKG5hbWUsICZoaWRsRGV2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZXNGYWN0b3J5LT5vcGVuRGV2aWNlKAotICAgICAgICAgICAgaGlkbERldmljZSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SURldmljZT4mIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsSGlkbChyZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOwotICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzQ4ODQ5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSURldmljZXNGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlc0ZhY3Rvcnk7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKLSAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ7Ci0KLSAgICBzcDxJRGV2aWNlc0ZhY3Rvcnk+IG1EZXZpY2VzRmFjdG9yeTsKLSAgICBzcDxJRGV2aWNlc0ZhY3Rvcnk+IG1EZXZpY2VzRmFjdG9yeU1zZDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBuYW1lRnJvbUhhbChjb25zdCBjaGFyICpuYW1lLCBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZSAqZGV2aWNlKTsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKTsKLQotICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsSGlkbCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNGJlNzQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6OkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCkKLSAgICAgICAgOiBtTG9jYWxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkpLAotICAgICAgICAgIG1IaWRsRmFjdG9yeShuZXcgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkpIHsKLX0KLQotRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6On5EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpIHsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgaWYgKG1IaWRsRmFjdG9yeSAhPSAwICYmIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCwgbmFtZSkgIT0gMCAmJgotICAgICAgICBzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0hFQVJJTkdfQUlELCBuYW1lKSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtSGlkbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1Mb2NhbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkNTdkNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEX0gKLQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKLSAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKLQotICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7Ci0KLSAgICBzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gbUxvY2FsRmFjdG9yeTsKLSAgICBzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gbUhpZGxGYWN0b3J5OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYTlhY2QuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBzdGF0dXNfdCBsb2FkX2F1ZGlvX2ludGVyZmFjZShjb25zdCBjaGFyICppZl9uYW1lLCBhdWRpb19od19kZXZpY2VfdCAqKmRldikKLXsKLSAgICBjb25zdCBod19tb2R1bGVfdCAqbW9kOwotICAgIGludCByYzsKLQotICAgIHJjID0gaHdfZ2V0X21vZHVsZV9ieV9jbGFzcyhBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsICZtb2QpOwotICAgIGlmIChyYykgewotICAgICAgICBBTE9HRSgiJXMgY291bGRuJ3QgbG9hZCBhdWRpbyBodyBtb2R1bGUgJXMuJXMgKCVzKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICByYyA9IGF1ZGlvX2h3X2RldmljZV9vcGVuKG1vZCwgZGV2KTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgQUxPR0UoIiVzIGNvdWxkbid0IG9wZW4gYXVkaW8gaHcgZGV2aWNlIGluICVzLiVzICglcykiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsIHN0cmVycm9yKC1yYykpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgaWYgKCgqZGV2KS0+Y29tbW9uLnZlcnNpb24gPCBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fTUlOKSB7Ci0gICAgICAgIEFMT0dFKCIlcyB3cm9uZyBhdWRpbyBodyBkZXZpY2UgdmVyc2lvbiAlMDR4IiwgX19mdW5jX18sICgqZGV2KS0+Y29tbW9uLnZlcnNpb24pOwotICAgICAgICByYyA9IEJBRF9WQUxVRTsKLSAgICAgICAgYXVkaW9faHdfZGV2aWNlX2Nsb3NlKCpkZXYpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotCi1vdXQ6Ci0gICAgKmRldiA9IE5VTEw7Ci0gICAgcmV0dXJuIHJjOwotfQotCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbExvY2FsOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgewotICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXY7Ci0gICAgc3RhdHVzX3QgcmMgPSBsb2FkX2F1ZGlvX2ludGVyZmFjZShuYW1lLCAmZGV2KTsKLSAgICBpZiAocmMgPT0gT0spIHsKLSAgICAgICAgKmRldmljZSA9IG5ldyBEZXZpY2VIYWxMb2NhbChkZXYpOwotICAgIH0KLSAgICByZXR1cm4gcmM7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWQxOGFiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkge30KLQotICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2YTUwMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0QnVmZmVySGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9hbGxvY2F0b3IvMS4wL0lBbGxvY2F0b3IuaD4KLSNpbmNsdWRlIDxoaWRsbWVtb3J5L21hcHBpbmcuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhpZGw6OmFsbG9jYXRvcjo6VjFfMDo6SUFsbG9jYXRvcjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdGF0aWMKLXVpbnQ2NF90IEVmZmVjdEJ1ZmZlckhhbEhpZGw6Om1ha2VVbmlxdWVJZCgpIHsKLSAgICBzdGF0aWMgc3RkOjphdG9taWM8dWludDY0X3Q+IGNvdW50ZXJ7MX07Ci0gICAgcmV0dXJuIGNvdW50ZXIrKzsKLX0KLQotc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6YWxsb2NhdGUoCi0gICAgICAgIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKLSAgICByZXR1cm4gbWlycm9yKG51bGxwdHIsIHNpemUsIGJ1ZmZlcik7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6Om1pcnJvcigKLSAgICAgICAgdm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IHRlbXBCdWZmZXIgPSBuZXcgRWZmZWN0QnVmZmVySGFsSGlkbChzaXplKTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4odGVtcEJ1ZmZlci5nZXQoKSktPmluaXQoKTsKLSAgICBpZiAocmVzdWx0ID09IE9LKSB7Ci0gICAgICAgIHRlbXBCdWZmZXItPnNldEV4dGVybmFsRGF0YShleHRlcm5hbCk7Ci0gICAgICAgICpidWZmZXIgPSB0ZW1wQnVmZmVyOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1FZmZlY3RCdWZmZXJIYWxIaWRsOjpFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemVfdCBzaXplKQotICAgICAgICA6IG1CdWZmZXJTaXplKHNpemUpLCBtRnJhbWVDb3VudENoYW5nZWQoZmFsc2UpLAotICAgICAgICAgIG1FeHRlcm5hbERhdGEobnVsbHB0ciksIG1BdWRpb0J1ZmZlcnswLCB7bnVsbHB0cn19IHsKLSAgICBtSGlkbEJ1ZmZlci5pZCA9IG1ha2VVbmlxdWVJZCgpOwotICAgIG1IaWRsQnVmZmVyLmZyYW1lQ291bnQgPSAwOwotfQotCi1FZmZlY3RCdWZmZXJIYWxIaWRsOjp+RWZmZWN0QnVmZmVySGFsSGlkbCgpIHsKLX0KLQotc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6aW5pdCgpIHsKLSAgICBzcDxJQWxsb2NhdG9yPiBhc2htZW0gPSBJQWxsb2NhdG9yOjpnZXRTZXJ2aWNlKCJhc2htZW0iKTsKLSAgICBpZiAoYXNobWVtID09IDApIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXRyaWV2ZSBhc2htZW0gYWxsb2NhdG9yIHNlcnZpY2UiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHN0YXR1c190IHJldHZhbCA9IE5PX01FTU9SWTsKLSAgICBSZXR1cm48dm9pZD4gcmVzdWx0ID0gYXNobWVtLT5hbGxvY2F0ZSgKLSAgICAgICAgICAgIG1CdWZmZXJTaXplLAotICAgICAgICAgICAgWyZdKGJvb2wgc3VjY2VzcywgY29uc3QgaGlkbF9tZW1vcnkmIG1lbW9yeSkgewotICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1IaWRsQnVmZmVyLmRhdGEgPSBtZW1vcnk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IE9LOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXN1bHQuaXNPaygpICYmIHJldHZhbCA9PSBPSykgewotICAgICAgICBtTWVtb3J5ID0gaGFyZHdhcmU6Om1hcE1lbW9yeShtSGlkbEJ1ZmZlci5kYXRhKTsKLSAgICAgICAgaWYgKG1NZW1vcnkgIT0gMCkgewotICAgICAgICAgICAgbU1lbW9yeS0+dXBkYXRlKCk7Ci0gICAgICAgICAgICBtQXVkaW9CdWZmZXIucmF3ID0gc3RhdGljX2Nhc3Q8dm9pZCo+KG1NZW1vcnktPmdldFBvaW50ZXIoKSk7Ci0gICAgICAgICAgICBtZW1zZXQobUF1ZGlvQnVmZmVyLnJhdywgMCwgbU1lbW9yeS0+Z2V0U2l6ZSgpKTsKLSAgICAgICAgICAgIG1NZW1vcnktPmNvbW1pdCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBtYXAgYWxsb2NhdGVkIGFzaG1lbSIpOwotICAgICAgICAgICAgcmV0dmFsID0gTk9fTUVNT1JZOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmcm9tIGFzaG1lbSIsIChpbnQpbUJ1ZmZlclNpemUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0LmlzT2soKSA/IHJldHZhbCA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotYXVkaW9fYnVmZmVyX3QqIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmF1ZGlvQnVmZmVyKCkgewotICAgIHJldHVybiAmbUF1ZGlvQnVmZmVyOwotfQotCi12b2lkKiBFZmZlY3RCdWZmZXJIYWxIaWRsOjpleHRlcm5hbERhdGEoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1FeHRlcm5hbERhdGE7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6c2V0RnJhbWVDb3VudChzaXplX3QgZnJhbWVDb3VudCkgewotICAgIG1IaWRsQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwotICAgIG1BdWRpb0J1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKLSAgICBtRnJhbWVDb3VudENoYW5nZWQgPSB0cnVlOwotfQotCi1ib29sIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNoZWNrRnJhbWVDb3VudENoYW5nZSgpIHsKLSAgICBib29sIHJlc3VsdCA9IG1GcmFtZUNvdW50Q2hhbmdlZDsKLSAgICBtRnJhbWVDb3VudENoYW5nZWQgPSBmYWxzZTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnNldEV4dGVybmFsRGF0YSh2b2lkKiBleHRlcm5hbCkgewotICAgIG1FeHRlcm5hbERhdGEgPSBleHRlcm5hbDsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjp1cGRhdGUoKSB7Ci0gICAgdXBkYXRlKG1CdWZmZXJTaXplKTsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjb21taXQoKSB7Ci0gICAgY29tbWl0KG1CdWZmZXJTaXplKTsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjp1cGRhdGUoc2l6ZV90IHNpemUpIHsKLSAgICBpZiAobUV4dGVybmFsRGF0YSA9PSBudWxscHRyKSByZXR1cm47Ci0gICAgbU1lbW9yeS0+dXBkYXRlKCk7Ci0gICAgaWYgKHNpemUgPiBtQnVmZmVyU2l6ZSkgc2l6ZSA9IG1CdWZmZXJTaXplOwotICAgIG1lbWNweShtQXVkaW9CdWZmZXIucmF3LCBtRXh0ZXJuYWxEYXRhLCBzaXplKTsKLSAgICBtTWVtb3J5LT5jb21taXQoKTsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjb21taXQoc2l6ZV90IHNpemUpIHsKLSAgICBpZiAobUV4dGVybmFsRGF0YSA9PSBudWxscHRyKSByZXR1cm47Ci0gICAgaWYgKHNpemUgPiBtQnVmZmVyU2l6ZSkgc2l6ZSA9IG1CdWZmZXJTaXplOwotICAgIG1lbWNweShtRXh0ZXJuYWxEYXRhLCBtQXVkaW9CdWZmZXIucmF3LCBzaXplKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZTAwODcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC8yLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KLQotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkF1ZGlvQnVmZmVyOwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwotdXNpbmcgYW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEVmZmVjdEJ1ZmZlckhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICBzdGF0aWMgc3RhdHVzX3QgYWxsb2NhdGUoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7Ci0gICAgc3RhdGljIHN0YXR1c190IG1pcnJvcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX2J1ZmZlcl90KiBhdWRpb0J1ZmZlcigpOwotICAgIHZpcnR1YWwgdm9pZCogZXh0ZXJuYWxEYXRhKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHNpemVfdCBnZXRTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUJ1ZmZlclNpemU7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KTsKLSAgICB2aXJ0dWFsIGJvb2wgY2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKCk7Ci0gICAgdmlydHVhbCB2b2lkIGNvbW1pdCgpOwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoc2l6ZV90IHNpemUpOwotICAgIHZpcnR1YWwgdm9pZCBjb21taXQoc2l6ZV90IHNpemUpOwotCi0gICAgY29uc3QgQXVkaW9CdWZmZXImIGhpZGxCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtSGlkbEJ1ZmZlcjsgfQotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZTsKLQotICAgIHN0YXRpYyB1aW50NjRfdCBtYWtlVW5pcXVlSWQoKTsKLQotICAgIGNvbnN0IHNpemVfdCBtQnVmZmVyU2l6ZTsKLSAgICBib29sIG1GcmFtZUNvdW50Q2hhbmdlZDsKLSAgICB2b2lkKiBtRXh0ZXJuYWxEYXRhOwotICAgIEF1ZGlvQnVmZmVyIG1IaWRsQnVmZmVyOwotICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7Ci0gICAgYXVkaW9fYnVmZmVyX3QgbUF1ZGlvQnVmZmVyOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpOwotCi0gICAgdmlydHVhbCB+RWZmZWN0QnVmZmVySGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgaW5pdCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiMDMyYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0SGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6QXVkaW9CdWZmZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3RCdWZmZXJBY2Nlc3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3RDb25maWdQYXJhbWV0ZXJzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6TWVzc2FnZVF1ZXVlRmxhZ0JpdHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpIaWRsVXRpbHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0NoYW5uZWxNYXNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9Gb3JtYXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotRWZmZWN0SGFsSGlkbDo6RWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCkKLSAgICAgICAgOiBtRWZmZWN0KGVmZmVjdCksIG1FZmZlY3RJZChlZmZlY3RJZCksIG1CdWZmZXJzQ2hhbmdlZCh0cnVlKSwgbUVmR3JvdXAobnVsbHB0cikgewotfQotCi1FZmZlY3RIYWxIaWRsOjp+RWZmZWN0SGFsSGlkbCgpIHsKLSAgICBpZiAobUVmZmVjdCAhPSAwKSB7Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIG1FZmZlY3QuY2xlYXIoKTsKLSAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICB9Ci0gICAgaWYgKG1FZkdyb3VwKSB7Ci0gICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKAotICAgICAgICBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBoYWxEZXNjcmlwdG9yKSB7Ci0gICAgSGlkbFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci50eXBlLCAmaGFsRGVzY3JpcHRvci0+dHlwZSk7Ci0gICAgSGlkbFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci51dWlkLCAmaGFsRGVzY3JpcHRvci0+dXVpZCk7Ci0gICAgaGFsRGVzY3JpcHRvci0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZGVzY3JpcHRvci5mbGFncyk7Ci0gICAgaGFsRGVzY3JpcHRvci0+Y3B1TG9hZCA9IGRlc2NyaXB0b3IuY3B1TG9hZDsKLSAgICBoYWxEZXNjcmlwdG9yLT5tZW1vcnlVc2FnZSA9IGRlc2NyaXB0b3IubWVtb3J5VXNhZ2U7Ci0gICAgbWVtY3B5KGhhbERlc2NyaXB0b3ItPm5hbWUsIGRlc2NyaXB0b3IubmFtZS5kYXRhKCksIGRlc2NyaXB0b3IubmFtZS5zaXplKCkpOwotICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5pbXBsZW1lbnRvciwKLSAgICAgICAgICAgIGRlc2NyaXB0b3IuaW1wbGVtZW50b3IuZGF0YSgpLCBkZXNjcmlwdG9yLmltcGxlbWVudG9yLnNpemUoKSk7Ci19Ci0KLS8vIFRPRE8obW5hZ2Fub3YpOiBUaGVzZSBidWZmZXIgY29udmVyc2lvbiBmdW5jdGlvbnMgc2hvdWxkIGJlIHNoYXJlZCB3aXRoIEVmZmVjdCB3cmFwcGVyCi0vLyB2aWEgSGlkbFV0aWxzLiBNb3ZlIHRoZW0gdGhlcmUgd2hlbiBoYXJkd2FyZS9pbnRlcmZhY2VzIHdpbGwgZ2V0IHVuLWZyb3plbiBhZ2Fpbi4KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoCi0gICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZykgewotICAgIGNvbmZpZy0+c2FtcGxpbmdSYXRlSHogPSBoYWxDb25maWcuc2FtcGxpbmdSYXRlOwotICAgIGNvbmZpZy0+Y2hhbm5lbHMgPSBBdWRpb0NoYW5uZWxNYXNrKGhhbENvbmZpZy5jaGFubmVscyk7Ci0gICAgY29uZmlnLT5mb3JtYXQgPSBBdWRpb0Zvcm1hdChoYWxDb25maWcuZm9ybWF0KTsKLSAgICBjb25maWctPmFjY2Vzc01vZGUgPSBFZmZlY3RCdWZmZXJBY2Nlc3MoaGFsQ29uZmlnLmFjY2Vzc01vZGUpOwotICAgIGNvbmZpZy0+bWFzayA9IEVmZmVjdENvbmZpZ1BhcmFtZXRlcnMoaGFsQ29uZmlnLm1hc2spOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCi0gICAgICAgIGNvbnN0IEVmZmVjdEJ1ZmZlckNvbmZpZyYgY29uZmlnLCBidWZmZXJfY29uZmlnX3QqIGhhbENvbmZpZykgewotICAgIGhhbENvbmZpZy0+YnVmZmVyLmZyYW1lQ291bnQgPSAwOwotICAgIGhhbENvbmZpZy0+YnVmZmVyLnJhdyA9IE5VTEw7Ci0gICAgaGFsQ29uZmlnLT5zYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxpbmdSYXRlSHo7Ci0gICAgaGFsQ29uZmlnLT5jaGFubmVscyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb25maWcuY2hhbm5lbHMpOwotICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKLSAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKLSAgICBoYWxDb25maWctPmZvcm1hdCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5mb3JtYXQpOwotICAgIGhhbENvbmZpZy0+YWNjZXNzTW9kZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5hY2Nlc3NNb2RlKTsKLSAgICBoYWxDb25maWctPm1hc2sgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcubWFzayk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdGcm9tSGFsKGNvbnN0IGVmZmVjdF9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RDb25maWcqIGNvbmZpZykgewotICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoaGFsQ29uZmlnLmlucHV0Q2ZnLCAmY29uZmlnLT5pbnB1dENmZyk7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcub3V0cHV0Q2ZnLCAmY29uZmlnLT5vdXRwdXRDZmcpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0Q29uZmlnVG9IYWwoY29uc3QgRWZmZWN0Q29uZmlnJiBjb25maWcsIGVmZmVjdF9jb25maWdfdCogaGFsQ29uZmlnKSB7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoY29uZmlnLmlucHV0Q2ZnLCAmaGFsQ29uZmlnLT5pbnB1dENmZyk7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoY29uZmlnLm91dHB1dENmZywgJmhhbENvbmZpZy0+b3V0cHV0Q2ZnKTsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjphbmFseXplUmVzdWx0KGNvbnN0IFJlc3VsdCYgcmVzdWx0KSB7Ci0gICAgc3dpdGNoIChyZXN1bHQpIHsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUzogcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfU1RBVEU6IHJldHVybiBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6IHJldHVybiBOT19JTklUOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX1NVUFBPUlRFRDogcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICBjYXNlIFJlc3VsdDo6UkVTVUxUX1RPT19CSUc6IHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7Ci0gICAgaWYgKCFtQnVmZmVyc0NoYW5nZWQpIHsKLSAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBudWxscHRyIHx8IG1JbkJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbUluQnVmZmVyLmdldCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLT5hdWRpb0J1ZmZlcigpICE9IG1JbkJ1ZmZlci0+YXVkaW9CdWZmZXIoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtSW5CdWZmZXIgPSBidWZmZXI7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRPdXRCdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7Ci0gICAgaWYgKCFtQnVmZmVyc0NoYW5nZWQpIHsKLSAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBudWxscHRyIHx8IG1PdXRCdWZmZXIuZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLmdldCgpICE9IG1PdXRCdWZmZXIuZ2V0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbU91dEJ1ZmZlci0+YXVkaW9CdWZmZXIoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtT3V0QnVmZmVyID0gYnVmZmVyOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2VzcygpIHsKLSAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1MpKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2Vzc1JldmVyc2UoKSB7Ci0gICAgcmV0dXJuIHByb2Nlc3NJbXBsKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6UkVRVUVTVF9QUk9DRVNTX1JFVkVSU0UpKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJlcGFyZUZvclByb2Nlc3NpbmcoKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+cHJlcGFyZUZvclByb2Nlc3NpbmcoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1RRGVzY3JpcHRvclN5bmM8UmVzdWx0PiYgc3RhdHVzTVEpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSAmJiB0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcFN0YXR1c01RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotICAgIGlmICghdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fCAhbUVmR3JvdXApIHsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIGVmZmVjdHMiKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIGVmZmVjdHMgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciBlZmZlY3RzIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1ib29sIEVmZmVjdEhhbEhpZGw6Om5lZWRUb1Jlc2V0QnVmZmVycygpIHsKLSAgICBpZiAobUJ1ZmZlcnNDaGFuZ2VkKSByZXR1cm4gdHJ1ZTsKLSAgICBib29sIGluQnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgPSBtSW5CdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOwotICAgIGJvb2wgb3V0QnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgPSBtT3V0QnVmZmVyLT5jaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKLSAgICByZXR1cm4gaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCB8fCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2Vzc0ltcGwodWludDMyX3QgbXFGbGFnKSB7Ci0gICAgaWYgKG1FZmZlY3QgPT0gMCB8fCBtSW5CdWZmZXIgPT0gMCB8fCBtT3V0QnVmZmVyID09IDApIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAoIW1TdGF0dXNNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclByb2Nlc3NpbmcoKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgaWYgKG5lZWRUb1Jlc2V0QnVmZmVycygpICYmIChzdGF0dXMgPSBzZXRQcm9jZXNzQnVmZmVycygpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICAvLyBUaGUgZGF0YSBpcyBhbHJlYWR5IGluIHRoZSBidWZmZXJzLCBqdXN0IG5lZWQgdG8gZmx1c2ggaXQgYW5kIHdha2UgdXAgdGhlIHNlcnZlciBzaWRlLgotICAgIHN0ZDo6YXRvbWljX3RocmVhZF9mZW5jZShzdGQ6Om1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKLSAgICBtRWZHcm91cC0+d2FrZShtcUZsYWcpOwotICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOwotcmV0cnk6Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OkRPTkVfUFJPQ0VTU0lORyksICZlZlN0YXRlKTsKLSAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSkgewotICAgICAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgICAgIG1TdGF0dXNNUS0+cmVhZCgmcmV0dmFsKTsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LIHx8IHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfU1RBVEUpIHsKLSAgICAgICAgICAgIC8vIFN5bmMgYmFjayB0aGUgY2hhbmdlZCBjb250ZW50cyBvZiB0aGUgYnVmZmVyLgotICAgICAgICAgICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbmFseXplUmVzdWx0KHJldHZhbCk7Ci0gICAgfQotICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7Ci0gICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgotICAgICAgICBnb3RvIHJldHJ5OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRQcm9jZXNzQnVmZmVycygpIHsKLSAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5zZXRQcm9jZXNzQnVmZmVycygKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtSW5CdWZmZXIuZ2V0KCkpLT5oaWRsQnVmZmVyKCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4obU91dEJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSk7Ci0gICAgaWYgKHJldC5pc09rKCkgJiYgcmV0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmNvbW1hbmQodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCi0gICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLQotICAgIC8vIFNwZWNpYWwgY2FzZXMuCi0gICAgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0UpIHsKLSAgICAgICAgcmV0dXJuIHNldENvbmZpZ0ltcGwoY21kQ29kZSwgY21kU2l6ZSwgcENtZERhdGEsIHJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7Ci0gICAgfSBlbHNlIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRyB8fCBjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJR19SRVZFUlNFKSB7Ci0gICAgICAgIHJldHVybiBnZXRDb25maWdJbXBsKGNtZENvZGUsIHJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7Ci0gICAgfQotCi0gICAgLy8gQ29tbW9uIGNhc2UuCi0gICAgaGlkbF92ZWM8dWludDhfdD4gaGlkbERhdGE7Ci0gICAgaWYgKHBDbWREYXRhICE9IG51bGxwdHIgJiYgY21kU2l6ZSA+IDApIHsKLSAgICAgICAgaGlkbERhdGEuc2V0VG9FeHRlcm5hbChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwQ21kRGF0YSksIGNtZFNpemUpOwotICAgIH0KLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgdWludDMyX3QgcmVwbHlTaXplU3R1YiA9IDA7Ci0gICAgaWYgKHJlcGx5U2l6ZSA9PSBudWxscHRyIHx8IHBSZXBseURhdGEgPT0gbnVsbHB0cikgcmVwbHlTaXplID0gJnJlcGx5U2l6ZVN0dWI7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPmNvbW1hbmQoY21kQ29kZSwgaGlkbERhdGEsICpyZXBseVNpemUsCi0gICAgICAgICAgICBbJl0oaW50MzJfdCBzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCpyZXBseVNpemUgPiByZXN1bHQuc2l6ZSgpKSAqcmVwbHlTaXplID0gcmVzdWx0LnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgIT0gbnVsbHB0ciAmJiAqcmVwbHlTaXplID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsICZyZXN1bHRbMF0sICpyZXBseVNpemUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHJldC5pc09rKCkgPyBzdGF0dXMgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmdldERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPmdldERlc2NyaXB0b3IoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y2xvc2UoKSB7Ci0gICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gbUVmZmVjdC0+Y2xvc2UoKTsKLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0Q29uZmlnSW1wbCgKLSAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewotICAgIGlmIChyZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzdGF0dXNfdCByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgUmV0dXJuPHZvaWQ+IHJldDsKLSAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUcpIHsKLSAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnKFsmXSAoUmVzdWx0IHIsIGNvbnN0IEVmZmVjdENvbmZpZyAmaGlkbENvbmZpZykgewotICAgICAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyKTsKLSAgICAgICAgICAgIGlmIChyID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICBlZmZlY3RDb25maWdUb0hhbChoaWRsQ29uZmlnLCBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwUmVwbHlEYXRhKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldCA9IG1FZmZlY3QtPmdldENvbmZpZ1JldmVyc2UoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOwotICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldENvbmZpZ0ltcGwoCi0gICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7Ci0gICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fAotICAgICAgICAgICAgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGNvbnN0IGVmZmVjdF9jb25maWdfdCAqaGFsQ29uZmlnID0gc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocENtZERhdGEpOwotICAgIGlmIChoYWxDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAhPSBOVUxMIHx8Ci0gICAgICAgICAgICBoYWxDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgIT0gTlVMTCB8fAotICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKLSAgICAgICAgICAgIGhhbENvbmZpZy0+b3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiQnVmZmVyIHByb3ZpZGVyIGNhbGxiYWNrcyBhcmUgbm90IHN1cHBvcnRlZCIpOwotICAgIH0KLSAgICBFZmZlY3RDb25maWcgaGlkbENvbmZpZzsKLSAgICBlZmZlY3RDb25maWdGcm9tSGFsKCpoYWxDb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJRyA/Ci0gICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWcoaGlkbENvbmZpZywgbnVsbHB0ciwgbnVsbHB0cikgOgotICAgICAgICAgICAgbUVmZmVjdC0+c2V0Q29uZmlnUmV2ZXJzZShoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyZXQpOwotICAgICAgICAqc3RhdGljX2Nhc3Q8aW50MzJfdCo+KHBSZXBseURhdGEpID0gcmVzdWx0OwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZmZGFmMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0SGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL0lFZmZlY3QuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxmbXEvRXZlbnRGbGFnLmg+Ci0jaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6RWZmZWN0QnVmZmVyQ29uZmlnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6RWZmZWN0Q29uZmlnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6RWZmZWN0RGVzY3JpcHRvcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OklFZmZlY3Q7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRWZmZWN0SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIFNldCB0aGUgaW5wdXQgYnVmZmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKTsKLQotICAgIC8vIFNldCB0aGUgb3V0cHV0IGJ1ZmZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpOwotCi0gICAgLy8gRWZmZWN0IHByb2Nlc3MgZnVuY3Rpb24uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzKCk7Ci0KLSAgICAvLyBQcm9jZXNzIHJldmVyc2Ugc3RyZWFtIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGFzcwotICAgIC8vIGEgcmVmZXJlbmNlIHN0cmVhbSB0byB0aGUgZWZmZWN0IGVuZ2luZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3NSZXZlcnNlKCk7Ci0KLSAgICAvLyBTZW5kIGEgY29tbWFuZCBhbmQgcmVjZWl2ZSBhIHJlc3BvbnNlIHRvL2Zyb20gZWZmZWN0IGVuZ2luZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbW1hbmQodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCi0gICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKLQotICAgIC8vIFJldHVybnMgdGhlIGVmZmVjdCBkZXNjcmlwdG9yLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7Ci0KLSAgICAvLyBGcmVlIHJlc291cmNlcyBvbiB0aGUgcmVtb3RlIHNpZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpOwotCi0gICAgLy8gV2hldGhlciBpdCdzIGEgbG9jYWwgaW1wbGVtZW50YXRpb24uCi0gICAgdmlydHVhbCBib29sIGlzTG9jYWwoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgdWludDY0X3QgZWZmZWN0SWQoKSBjb25zdCB7IHJldHVybiBtRWZmZWN0SWQ7IH0KLQotICAgIHN0YXRpYyB2b2lkIGVmZmVjdERlc2NyaXB0b3JUb0hhbCgKLSAgICAgICAgICAgIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIGhhbERlc2NyaXB0b3IpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbDsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTwKLSAgICAgICAgaGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OlJlc3VsdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROwotCi0gICAgc3A8SUVmZmVjdD4gbUVmZmVjdDsKLSAgICBjb25zdCB1aW50NjRfdCBtRWZmZWN0SWQ7Ci0gICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBtSW5CdWZmZXI7Ci0gICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBtT3V0QnVmZmVyOwotICAgIGJvb2wgbUJ1ZmZlcnNDaGFuZ2VkOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwotICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgYW5hbHl6ZVJlc3VsdChjb25zdCBoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6UmVzdWx0JiByZXN1bHQpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoCi0gICAgICAgICAgICBjb25zdCBidWZmZXJfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0QnVmZmVyQ29uZmlnKiBjb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKAotICAgICAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RDb25maWdGcm9tSGFsKGNvbnN0IGVmZmVjdF9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RDb25maWcqIGNvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0Q29uZmlnVG9IYWwoY29uc3QgRWZmZWN0Q29uZmlnJiBjb25maWcsIGVmZmVjdF9jb25maWdfdCogaGFsQ29uZmlnKTsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBFZmZlY3RIYWxIaWRsKGNvbnN0IHNwPElFZmZlY3Q+JiBlZmZlY3QsIHVpbnQ2NF90IGVmZmVjdElkKTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgcmVsZWFzZXMgdGhlIGVmZmVjdC4KLSAgICB2aXJ0dWFsIH5FZmZlY3RIYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBnZXRDb25maWdJbXBsKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOwotICAgIHN0YXR1c190IHByZXBhcmVGb3JQcm9jZXNzaW5nKCk7Ci0gICAgYm9vbCBuZWVkVG9SZXNldEJ1ZmZlcnMoKTsKLSAgICBzdGF0dXNfdCBwcm9jZXNzSW1wbCh1aW50MzJfdCBtcUZsYWcpOwotICAgIHN0YXR1c190IHNldENvbmZpZ0ltcGwoCi0gICAgICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOwotICAgIHN0YXR1c190IHNldFByb2Nlc3NCdWZmZXJzKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDQwZTZkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkhpZGxVdGlsczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OlV1aWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpJRWZmZWN0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRWZmZWN0c0ZhY3RvcnkiKSB7Ci0gICAgbUVmZmVjdHNGYWN0b3J5ID0gSUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb2J0YWluIElFZmZlY3RzRmFjdG9yeSBzZXJ2aWNlLCB0ZXJtaW5hdGluZyBwcm9jZXNzLiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLX0KLQotRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjp+RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgewotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5QWxsRGVzY3JpcHRvcnMoKSB7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Z2V0QWxsRGVzY3JpcHRvcnMoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBtTGFzdERlc2NyaXB0b3JzID0gcmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIHJldHVybiByZXR2YWwgPT0gUmVzdWx0OjpPSyA/IE9LIDogTk9fSU5JVDsKLSAgICB9Ci0gICAgbUxhc3REZXNjcmlwdG9ycy5yZXNpemUoMCk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpIHsKLSAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKLSAgICBpZiAocXVlcnlSZXN1bHQgPT0gT0spIHsKLSAgICAgICAgKnBOdW1FZmZlY3RzID0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCk7Ci0gICAgfQotICAgIHJldHVybiBxdWVyeVJlc3VsdDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAotICAgICAgICB1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICAvLyBUT0RPOiBXZSBuZWVkIHNvbWVob3cgdG8gdHJhY2sgdGhlIGNoYW5nZXMgb24gdGhlIHNlcnZlciBzaWRlCi0gICAgLy8gb3IgZmlndXJlIG91dCBob3cgdG8gY29udmVydCBldmVyeWJvZHkgdG8gcXVlcnkgYWxsIHRoZSBkZXNjcmlwdG9ycyBhdCBvbmNlLgotICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCi0gICAgaWYgKG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Ci0gICAgICAgIGlmIChxdWVyeVJlc3VsdCAhPSBPSykgcmV0dXJuIHF1ZXJ5UmVzdWx0OwotICAgIH0KLSAgICBpZiAoaW5kZXggPj0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCkpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwobUxhc3REZXNjcmlwdG9yc1tpbmRleF0sIHBEZXNjcmlwdG9yKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0gICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFV1aWQgaGlkbFV1aWQ7Ci0gICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldERlc2NyaXB0b3IoaGlkbFV1aWQsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKLSAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmNyZWF0ZUVmZmVjdCgKLSAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCi0gICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCkgewotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgVXVpZCBoaWRsVXVpZDsKLSAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Y3JlYXRlRWZmZWN0KAotICAgICAgICAgICAgaGlkbFV1aWQsIHNlc3Npb25JZCwgaW9JZCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SUVmZmVjdD4mIHJlc3VsdCwgdWludDY0X3QgZWZmZWN0SWQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqZWZmZWN0ID0gbmV3IEVmZmVjdEhhbEhpZGwocmVzdWx0LCBlZmZlY3RJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7Ci0gICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpkdW1wRWZmZWN0cyhpbnQgZmQpIHsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5kZWJ1Z0R1bXAoaGlkbEhhbmRsZSk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKLSAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6YWxsb2NhdGUoc2l6ZSwgYnVmZmVyKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjptaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKLSAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKGV4dGVybmFsLCBzaXplLCBidWZmZXIpOwotfQotCi0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJiNTQ4MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC9JRWZmZWN0c0ZhY3RvcnkuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC8yLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpFZmZlY3REZXNjcmlwdG9yOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6SUVmZmVjdHNGYWN0b3J5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci0KLWNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGVmZmVjdHMgaW4gYWxsIGxvYWRlZCBsaWJyYXJpZXMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKTsKLQotICAgIC8vIFJldHVybnMgYSBkZXNjcmlwdG9yIG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBlZmZlY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKHVpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBlZmZlY3QgZW5naW5lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLSAgICAvLyBUbyByZWxlYXNlIHRoZSBlZmZlY3QgZW5naW5lLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzCi0gICAgLy8gdG8gdGhlIHJldHVybmVkIGVmZmVjdCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAotICAgICAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcEVmZmVjdHMoaW50IGZkKTsKLQotICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIG92ZXJyaWRlOwotICAgIHN0YXR1c190IG1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U7Ci0KLSAgICBzcDxJRWZmZWN0c0ZhY3Rvcnk+IG1FZmZlY3RzRmFjdG9yeTsKLSAgICBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiBtTGFzdERlc2NyaXB0b3JzOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOwotICAgIHZpcnR1YWwgfkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgcXVlcnlBbGxEZXNjcmlwdG9ycygpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmNiZDQ1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVN0cmVhbU91dENhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9DaGFubmVsTWFzazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvRm9ybWF0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6VGhyZWFkSW5mbzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpBdWRpb0RyYWluOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1PdXRDYWxsYmFjazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpNZXNzYWdlUXVldWVGbGFnQml0czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpNbWFwQnVmZmVySW5mbzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpNbWFwUG9zaXRpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UGFyYW1ldGVyVmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlRpbWVTcGVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Ci11c2luZyBSZWFkQ29tbWFuZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtSW46OlJlYWRDb21tYW5kOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVN0cmVhbUhhbEhpZGw6OlN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKQotICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJTdHJlYW0iKSwKLSAgICAgICAgICBtU3RyZWFtKHN0cmVhbSksCi0gICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5KEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCksCi0gICAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUoMCl7Ci0KLSAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgotICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCi0gICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKLSAgICAgICAgLy8gT2J0YWluIGF1ZGlvIHByb3BlcnRpZXMgKHNlZSBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoKSBiZWxvdykuCi0gICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICAgICAgWyZdKHVpbnQzMl90IHNyLCBBdWRpb0NoYW5uZWxNYXNrIG0sIEF1ZGlvRm9ybWF0IGYpIHsKLSAgICAgICAgICAgICAgICBtU3RyZWFtUG93ZXJMb2cuaW5pdChzciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihmKSk7Ci0gICAgICAgICAgICB9KTsKLSAgICB9Ci19Ci0KLVN0cmVhbUhhbEhpZGw6On5TdHJlYW1IYWxIaWRsKCkgewotICAgIG1TdHJlYW0gPSBudWxscHRyOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0U2FtcGxlUmF0ZSIsIG1TdHJlYW0tPmdldFNhbXBsZVJhdGUoKSwgcmF0ZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm9jZXNzUmV0dXJuKCJnZXRCdWZmZXJTaXplIiwgbVN0cmVhbS0+Z2V0QnVmZmVyU2l6ZSgpLCBzaXplKTsKLSAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgIG1DYWNoZWRCdWZmZXJTaXplID0gKnNpemU7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2hhbm5lbE1hc2siLCBtU3RyZWFtLT5nZXRDaGFubmVsTWFzaygpLCBtYXNrKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGb3JtYXQiLCBtU3RyZWFtLT5nZXRGb3JtYXQoKSwgZm9ybWF0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICBbJl0odWludDMyX3Qgc3IsIEF1ZGlvQ2hhbm5lbE1hc2sgbSwgQXVkaW9Gb3JtYXQgZikgewotICAgICAgICAgICAgICAgICpzYW1wbGVSYXRlID0gc3I7Ci0gICAgICAgICAgICAgICAgKm1hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obSk7Ci0gICAgICAgICAgICAgICAgKmZvcm1hdCA9IHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihmKTsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBdWRpb1Byb3BlcnRpZXMiLCByZXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQYXJhbWV0ZXJzIiwgbVN0cmVhbS0+c2V0UGFyYW1ldGVycyhoaWRsUGFyYW1zKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgdmFsdWVzLT5jbGVhcigpOwotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGtleXNGcm9tSGFsKGtleXMsICZoaWRsS2V5cyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRQYXJhbWV0ZXJzKAotICAgICAgICAgICAgaGlkbEtleXMsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNUb0hhbChwYXJhbWV0ZXJzLCB2YWx1ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQYXJhbWV0ZXJzIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjphZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJhZGRFZmZlY3QiLCBtU3RyZWFtLT5hZGRFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbW92ZUVmZmVjdCIsIG1TdHJlYW0tPnJlbW92ZUVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RhbmRieSgpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdGFuZGJ5IiwgbVN0cmVhbS0+c3RhbmRieSgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6ZHVtcChpbnQgZmQpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+ZGVidWdEdW1wKGhpZGxIYW5kbGUpOwotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOwotICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YXJ0KCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YXJ0IiwgbVN0cmVhbS0+c3RhcnQoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0b3AoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RvcCIsIG1TdHJlYW0tPnN0b3AoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Y3JlYXRlTW1hcEJ1ZmZlcigKLSAgICAgICAgICAgIG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBCdWZmZXJJbmZvJiBoaWRsSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGUgKmhhbmRsZSA9IGhpZGxJbmZvLnNoYXJlZE1lbW9yeS5oYW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+bnVtRmRzID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9mZCA9IGhhbmRsZS0+ZGF0YVswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyA9IGhpZGxJbmZvLmJ1ZmZlclNpemVGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWdhdGl2ZSBidWZmZXIgc2l6ZSBmcmFtZSB3YXMgYSBoYWNrIGluIE8gYW5kIFAgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRoYXQgdGhlIGJ1ZmZlciBpcyBzaGFyZWFibGUgdG8gYXBwbGljYXRpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyAqPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyA9IGF1ZGlvX21tYXBfYnVmZmVyX2ZsYWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyB8IEFVRElPX01NQVBfQVBQTElDQVRJT05fU0hBUkVBQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1cnN0X3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVyc3RTaXplRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mby0+c2hhcmVkX21lbW9yeV9hZGRyZXNzIGlzIG5vdCBuZWVkZWQgaW4gSElETCBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiY3JlYXRlTW1hcEJ1ZmZlciIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgewotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE1tYXBQb3NpdGlvbigKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcFBvc2l0aW9uJiBoaWRsUG9zaXRpb24pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi0+dGltZV9uYW5vc2Vjb25kcyA9IGhpZGxQb3NpdGlvbi50aW1lTmFub3NlY29uZHM7Ci0gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT5wb3NpdGlvbl9mcmFtZXMgPSBoaWRsUG9zaXRpb24ucG9zaXRpb25GcmFtZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1tYXBQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KSB7Ci0gICAgbUhhbFRocmVhZFByaW9yaXR5ID0gcHJpb3JpdHk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtQ2FjaGVkQnVmZmVyU2l6ZSAhPSAwKSB7Ci0gICAgICAgICpzaXplID0gbUNhY2hlZEJ1ZmZlclNpemU7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgcmV0dXJuIGdldEJ1ZmZlclNpemUoc2l6ZSk7Ci19Ci0KLWJvb2wgU3RyZWFtSGFsSGlkbDo6cmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpIHsKLSAgICBpZiAobUhhbFRocmVhZFByaW9yaXR5ID09IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaW50IGVyciA9IHJlcXVlc3RQcmlvcml0eSgKLSAgICAgICAgICAgIHRocmVhZFBpZCwgdGhyZWFkSWQsCi0gICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIGZhbHNlIC8qaXNGb3JBcHAqLywgdHJ1ZSAvKmFzeW5jaHJvbm91cyovKTsKLSAgICBBTE9HRV9JRihlcnIsICJmYWlsZWQgdG8gc2V0IHByaW9yaXR5ICVkIGZvciBwaWQgJWQgdGlkICVkOyBlcnJvciAlZCIsCi0gICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIHRocmVhZFBpZCwgdGhyZWFkSWQsIGVycik7Ci0gICAgLy8gQXVkaW8gd2lsbCBzdGlsbCB3b3JrLCBidXQgbGF0ZW5jeSB3aWxsIGJlIGhpZ2hlciBhbmQgc29tZXRpbWVzIHVuYWNjZXB0YWJsZS4KLSAgICByZXR1cm4gZXJyID09IDA7Ci19Ci0KLW5hbWVzcGFjZSB7Ci0KLS8qIE5vdGVzIG9uIGNhbGxiYWNrIG93bmVyc2hpcC4KLQotVGhpcyBpcyBob3cgKEh3KUJpbmRlciBvd25lcnNoaXAgbW9kZWwgbG9va3MgbGlrZS4gVGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotaXMgb3duZWQgYnkgQmluZGVyIGZyYW1ld29yayAodmlhIHNwPD4pLiBQcm94aWVzIGFyZSBvd25lZCBieSBjbGllbnRzLgotV2hlbiB0aGUgbGFzdCBwcm94eSBkaXNhcHBlYXJzLCBCaW5kZXIgZnJhbWV3b3JrIHJlbGVhc2VzIHRoZSBzZXJ2ZXIgaW1wbC4KLQotVGh1cywgaXQgaXMgbm90IG5lZWRlZCB0byBrZWVwIGFueSByZWZlcmVuY2VzIHRvIFN0cmVhbU91dENhbGxiYWNrICh0aGlzIGlzCi10aGUgc2VydmVyIGltcGwpIC0tIGl0IHdpbGwgbGl2ZSBhcyBsb25nIGFzIEhBTCBzZXJ2ZXIgaG9sZHMgYSBzdHJvbmcgcmVmIHRvCi1JU3RyZWFtT3V0Q2FsbGJhY2sgcHJveHkuIFdlIGNsZWFyIHRoYXQgcmVmZXJlbmNlIGJ5IGNhbGxpbmcgJ2NsZWFyQ2FsbGJhY2snCi1mcm9tIHRoZSBkZXN0cnVjdG9yIG9mIFN0cmVhbU91dEhhbEhpZGwuCi0KLVRoZSBjYWxsYmFjayBvbmx5IGtlZXBzIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBvd25lZAotYnkgQXVkaW9GbGluZ2VyLgotCi0qLwotCi1zdHJ1Y3QgU3RyZWFtT3V0Q2FsbGJhY2sgOiBwdWJsaWMgSVN0cmVhbU91dENhbGxiYWNrIHsKLSAgICBTdHJlYW1PdXRDYWxsYmFjayhjb25zdCB3cDxTdHJlYW1PdXRIYWxIaWRsPiYgc3RyZWFtKSA6IG1TdHJlYW0oc3RyZWFtKSB7fQotCi0gICAgLy8gSVN0cmVhbU91dENhbGxiYWNrIGltcGxlbWVudGF0aW9uCi0gICAgUmV0dXJuPHZvaWQ+IG9uV3JpdGVSZWFkeSgpICBvdmVycmlkZSB7Ci0gICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKLSAgICAgICAgICAgIHN0cmVhbS0+b25Xcml0ZVJlYWR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gb25EcmFpblJlYWR5KCkgIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChzdHJlYW0gIT0gMCkgewotICAgICAgICAgICAgc3RyZWFtLT5vbkRyYWluUmVhZHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBvbkVycm9yKCkgIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChzdHJlYW0gIT0gMCkgewotICAgICAgICAgICAgc3RyZWFtLT5vbkVycm9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICB3cDxTdHJlYW1PdXRIYWxIaWRsPiBtU3RyZWFtOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLVN0cmVhbU91dEhhbEhpZGw6OlN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSkKLSAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVdyaXRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgewotfQotCi1TdHJlYW1PdXRIYWxIaWRsOjp+U3RyZWFtT3V0SGFsSGlkbCgpIHsKLSAgICBpZiAobVN0cmVhbSAhPSAwKSB7Ci0gICAgICAgIGlmIChtQ2FsbGJhY2sudW5zYWZlX2dldCgpKSB7Ci0gICAgICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbGVhckNhbGxiYWNrIiwgbVN0cmVhbS0+Y2xlYXJDYWxsYmFjaygpKTsKLSAgICAgICAgfQotICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOwotICAgICAgICBtU3RyZWFtLmNsZWFyKCk7Ci0gICAgfQotICAgIG1DYWxsYmFjay5jbGVhcigpOwotICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgaWYgKG1FZkdyb3VwKSB7Ci0gICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfTEFURU5DWSwgImdldExhdGVuY3kiLCBudWxscHRyLCAwLAotICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKmxhdGVuY3kgPSB3cml0ZVN0YXR1cy5yZXBseS5sYXRlbmN5TXM7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldExhdGVuY3kiLCBtU3RyZWFtLT5nZXRMYXRlbmN5KCksIGxhdGVuY3kpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvbHVtZSIsIG1TdHJlYW0tPnNldFZvbHVtZShsZWZ0LCByaWdodCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgKndyaXR0ZW4gPSAwOwotCi0gICAgaWYgKGJ5dGVzID09IDAgJiYgIW1EYXRhTVEpIHsKLSAgICAgICAgLy8gQ2FuJ3QgZGV0ZXJtaW5lIHRoZSBzaXplIGZvciB0aGUgTVEgYnVmZmVyLiBXYWl0IGZvciBhIG5vbi1lbXB0eSB3cml0ZSByZXF1ZXN0LgotICAgICAgICBBTE9HV19JRihtQ2FsbGJhY2sudW5zYWZlX2dldCgpLCAiRmlyc3QgY2FsbCB0byBhc3luYyB3cml0ZSB3aXRoIDAgYnl0ZXMiKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAoIW1EYXRhTVEpIHsKLSAgICAgICAgLy8gSW4gY2FzZSBpZiBwbGF5YmFjayBzdGFydHMgY2xvc2UgdG8gdGhlIGVuZCBvZiBhIGNvbXByZXNzZWQgdHJhY2ssIHRoZSBieXRlcwotICAgICAgICAvLyB0aGF0IG5lZWQgdG8gYmUgd3JpdHRlbiBpcyBsZXNzIHRoYW4gdGhlIGFjdHVhbCBidWZmZXIgc2l6ZS4gTmVlZCB0byB1c2UKLSAgICAgICAgLy8gZnVsbCBidWZmZXIgc2l6ZSBmb3IgdGhlIE1RIHNpbmNlIG90aGVyd2lzZSBhZnRlciBzZWVraW5nIGJhY2sgdG8gdGhlIG1pZGRsZQotICAgICAgICAvLyBkYXRhIHdpbGwgYmUgdHJ1bmNhdGVkLgotICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZTsKLSAgICAgICAgaWYgKChzdGF0dXMgPSBnZXRDYWNoZWRCdWZmZXJTaXplKCZidWZmZXJTaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ5dGVzID4gYnVmZmVyU2l6ZSkgYnVmZmVyU2l6ZSA9IGJ5dGVzOwotICAgICAgICBpZiAoKHN0YXR1cyA9IHByZXBhcmVGb3JXcml0aW5nKGJ1ZmZlclNpemUpKSAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXR1cyA9IGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OldSSVRFLCAid3JpdGUiLCBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyKSwgYnl0ZXMsCi0gICAgICAgICAgICBbJl0gKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgewotICAgICAgICAgICAgICAgICp3cml0dGVuID0gd3JpdGVTdGF0dXMucmVwbHkud3JpdHRlbjsKLSAgICAgICAgICAgICAgICAvLyBEaWFnbm9zdGljcyBvZiB0aGUgY2F1c2Ugb2YgYi8zNTgxMzExMy4KLSAgICAgICAgICAgICAgICBBTE9HRV9JRigqd3JpdHRlbiA+IGJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgImhhbCByZXBvcnRzIG1vcmUgYnl0ZXMgd3JpdHRlbiB0aGFuIGFza2VkIGZvcjogJWxsZCA+ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykqd3JpdHRlbiwgKGxvbmcgbG9uZylieXRlcyk7Ci0gICAgICAgICAgICB9KTsKLSAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgIFdyaXRlQ29tbWFuZCBjbWQsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwgU3RyZWFtT3V0SGFsSGlkbDo6V3JpdGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZjbWQpKSB7Ci0gICAgICAgIEFMT0dFKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKLSAgICAgICAgcmV0dXJuIC1FQUdBSU47Ci0gICAgfQotICAgIGlmIChkYXRhICE9IG51bGxwdHIpIHsKLSAgICAgICAgc2l6ZV90IGF2YWlsYWJsZVRvV3JpdGUgPSBtRGF0YU1RLT5hdmFpbGFibGVUb1dyaXRlKCk7Ci0gICAgICAgIGlmIChkYXRhU2l6ZSA+IGF2YWlsYWJsZVRvV3JpdGUpIHsKLSAgICAgICAgICAgIEFMT0dXKCJ0cnVuY2F0aW5nIHdyaXRlIGRhdGEgZnJvbSAlbGxkIHRvICVsbGQgZHVlIHRvIGluc3VmZmljaWVudCBkYXRhIHF1ZXVlIHNwYWNlIiwKLSAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkYXRhU2l6ZSwgKGxvbmcgbG9uZylhdmFpbGFibGVUb1dyaXRlKTsKLSAgICAgICAgICAgIGRhdGFTaXplID0gYXZhaWxhYmxlVG9Xcml0ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1EYXRhTVEtPndyaXRlKGRhdGEsIGRhdGFTaXplKSkgewotICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1FZkdyb3VwLT53YWtlKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSk7Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgotICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOwotcmV0cnk6Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCksICZlZlN0YXRlKTsKLSAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpKSB7Ci0gICAgICAgIFdyaXRlU3RhdHVzIHdyaXRlU3RhdHVzOwotICAgICAgICB3cml0ZVN0YXR1cy5yZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgaWYgKCFtU3RhdHVzTVEtPnJlYWQoJndyaXRlU3RhdHVzKSkgewotICAgICAgICAgICAgQUxPR0UoInN0YXR1cyBtZXNzYWdlIHJlYWQgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZiAod3JpdGVTdGF0dXMucmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgIHJldCA9IE9LOwotICAgICAgICAgICAgY2FsbGJhY2sod3JpdGVTdGF0dXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCB3cml0ZVN0YXR1cy5yZXR2YWwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7Ci0gICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgotICAgICAgICBnb3RvIHJldHJ5OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpwcmVwYXJlRm9yV3JpdGluZyhzaXplX3QgYnVmZmVyU2l6ZSkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IHRlbXBDb21tYW5kTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gdGVtcERhdGFNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIHBpZF90IGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5wcmVwYXJlRm9yV3JpdGluZygKLSAgICAgICAgICAgIDEsIGJ1ZmZlclNpemUsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1hbmRNUTo6RGVzY3JpcHRvciYgY29tbWFuZE1RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTVE6OkRlc2NyaXB0b3ImIGRhdGFNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdHVzTVE6OkRlc2NyaXB0b3ImIHN0YXR1c01RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWRJbmZvJiBoYWxUaHJlYWRJbmZvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcENvbW1hbmRNUS5yZXNldChuZXcgQ29tbWFuZE1RKGNvbW1hbmRNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wRGF0YU1RLnJlc2V0KG5ldyBEYXRhTVEoZGF0YU1RKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBEYXRhTVEtPmlzVmFsaWQoKSAmJiB0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRQaWQgPSBoYWxUaHJlYWRJbmZvLnBpZDsKLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkVGlkID0gaGFsVGhyZWFkSW5mby50aWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwcmVwYXJlRm9yV3JpdGluZyIsIHJldCwgcmV0dmFsKTsKLSAgICB9Ci0gICAgaWYgKCF0ZW1wQ29tbWFuZE1RIHx8ICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICF0ZW1wRGF0YU1RIHx8ICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhbUVmR3JvdXApIHsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBDb21tYW5kTVEsICJGYWlsZWQgdG8gb2J0YWluIGNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wQ29tbWFuZE1RICYmICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIkNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wRGF0YU1RLCAiRmFpbGVkIHRvIG9idGFpbiBkYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcERhdGFNUSAmJiAhdGVtcERhdGFNUS0+aXNWYWxpZCgpLCAiRGF0YSBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciB3cml0aW5nIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkKTsKLQotICAgIG1Db21tYW5kTVEgPSBzdGQ6Om1vdmUodGVtcENvbW1hbmRNUSk7Ci0gICAgbURhdGFNUSA9IHN0ZDo6bW92ZSh0ZW1wRGF0YU1RKTsKLSAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKLSAgICBtV3JpdGVyQ2xpZW50ID0gZ2V0dGlkKCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UmVuZGVyUG9zaXRpb24oCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQzMl90IGQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqZHNwRnJhbWVzID0gZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UmVuZGVyUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXROZXh0V3JpdGVUaW1lc3RhbXAoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGludDY0X3QgdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICp0aW1lc3RhbXAgPSB0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZW5kZXJQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigKLSAgICAgICAgICAgICJzZXRDYWxsYmFjayIsIG1TdHJlYW0tPnNldENhbGxiYWNrKG5ldyBTdHJlYW1PdXRDYWxsYmFjayh0aGlzKSkpOwotICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+c3VwcG9ydHNQYXVzZUFuZFJlc3VtZSgKLSAgICAgICAgICAgIFsmXShib29sIHAsIGJvb2wgcikgewotICAgICAgICAgICAgICAgICpzdXBwb3J0c1BhdXNlID0gcDsKLSAgICAgICAgICAgICAgICAqc3VwcG9ydHNSZXN1bWUgPSByOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzUGF1c2VBbmRSZXN1bWUiLCByZXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpwYXVzZSgpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5wYXVzZSgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cmVzdW1lKCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPnJlc3VtZSgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzRHJhaW4iLCBtU3RyZWFtLT5zdXBwb3J0c0RyYWluKCksIHN1cHBvcnRzRHJhaW4pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oCi0gICAgICAgICAgICAiZHJhaW4iLCBtU3RyZWFtLT5kcmFpbihlYXJseU5vdGlmeSA/IEF1ZGlvRHJhaW46OkVBUkxZX05PVElGWSA6IEF1ZGlvRHJhaW46OkFMTCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpmbHVzaCgpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5mbHVzaCgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVdyaXRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7Ci0gICAgICAgIHJldHVybiBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6R0VUX1BSRVNFTlRBVElPTl9QT1NJVElPTiwgImdldFByZXNlbnRhdGlvblBvc2l0aW9uIiwgbnVsbHB0ciwgMCwKLSAgICAgICAgICAgICAgICBbJl0oY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi5mcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfc2VjID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24udGltZVN0YW1wLnR2U2VjOwotICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X25zZWMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi50aW1lU3RhbXAudHZOU2VjOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbigKLSAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGhpZGxGcmFtZXMsIGNvbnN0IFRpbWVTcGVjJiBoaWRsVGltZVN0YW1wKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IGhpZGxGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X3NlYyA9IGhpZGxUaW1lU3RhbXAudHZTZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X25zZWMgPSBoaWRsVGltZVN0YW1wLnR2TlNlYzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgLyogc291cmNlTWV0YWRhdGEgKi8pIHsKLSAgICAvLyBBdWRpbyBIQUwgVjIuMCBkb2VzIG5vdCBzdXBwb3J0IHByb3BhZ2F0aW5nIHNvdXJjZSBtZXRhZGF0YQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbldyaXRlUmVhZHkoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uV3JpdGVSZWFkeSIpOwotICAgIGNhbGxiYWNrLT5vbldyaXRlUmVhZHkoKTsKLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbkRyYWluUmVhZHkoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRHJhaW5SZWFkeSIpOwotICAgIGNhbGxiYWNrLT5vbkRyYWluUmVhZHkoKTsKLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbkVycm9yKCkgewotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKLSAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbkVycm9yIik7Ci0gICAgY2FsbGJhY2stPm9uRXJyb3IoKTsKLX0KLQotCi1TdHJlYW1JbkhhbEhpZGw6OlN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pCi0gICAgICAgIDogU3RyZWFtSGFsSGlkbChzdHJlYW0uZ2V0KCkpLCBtU3RyZWFtKHN0cmVhbSksIG1SZWFkZXJDbGllbnQoMCksIG1FZkdyb3VwKG51bGxwdHIpIHsKLX0KLQotU3RyZWFtSW5IYWxIaWRsOjp+U3RyZWFtSW5IYWxIaWRsKCkgewotICAgIGlmIChtU3RyZWFtICE9IDApIHsKLSAgICAgICAgcHJvY2Vzc1JldHVybigiY2xvc2UiLCBtU3RyZWFtLT5jbG9zZSgpKTsKLSAgICAgICAgbVN0cmVhbS5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLSAgICBpZiAobUVmR3JvdXApIHsKLSAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGcmFtZVNpemUiLCBtU3RyZWFtLT5nZXRGcmFtZVNpemUoKSwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0R2FpbihmbG9hdCBnYWluKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldEdhaW4iLCBtU3RyZWFtLT5zZXRHYWluKGdhaW4pKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICAqcmVhZCA9IDA7Ci0KLSAgICBpZiAoYnl0ZXMgPT0gMCAmJiAhbURhdGFNUSkgewotICAgICAgICAvLyBDYW4ndCBkZXRlcm1pbmUgdGhlIHNpemUgZm9yIHRoZSBNUSBidWZmZXIuIFdhaXQgZm9yIGEgbm9uLWVtcHR5IHJlYWQgcmVxdWVzdC4KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAoIW1EYXRhTVEgJiYgKHN0YXR1cyA9IHByZXBhcmVGb3JSZWFkaW5nKGJ5dGVzKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBSZWFkUGFyYW1ldGVycyBwYXJhbXM7Ci0gICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6UkVBRDsKLSAgICBwYXJhbXMucGFyYW1zLnJlYWQgPSBieXRlczsKLSAgICBzdGF0dXMgPSBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgInJlYWQiLAotICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgYXZhaWxUb1JlYWQgPSBtRGF0YU1RLT5hdmFpbGFibGVUb1JlYWQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1EYXRhTVEtPnJlYWQoc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJ1ZmZlciksIHN0ZDo6bWluKGJ5dGVzLCBhdmFpbFRvUmVhZCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJkYXRhIG1lc3NhZ2UgcXVldWUgcmVhZCBmYWlsZWQgZm9yIFwicmVhZFwiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dXX0lGKGF2YWlsVG9SZWFkICE9IHJlYWRTdGF0dXMucmVwbHkucmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJIQUwgcmVhZCByZXBvcnQgaW5jb25zaXN0ZW50OiBtcSA9ICVkLCBzdGF0dXMgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClhdmFpbFRvUmVhZCwgKGludDMyX3QpcmVhZFN0YXR1cy5yZXBseS5yZWFkKTsKLSAgICAgICAgICAgICAgICAqcmVhZCA9IHJlYWRTdGF0dXMucmVwbHkucmVhZDsKLSAgICAgICAgICAgIH0pOwotICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqcmVhZCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpjYWxsUmVhZGVyVGhyZWFkKAotICAgICAgICBjb25zdCBSZWFkUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBjaGFyKiBjbWROYW1lLAotICAgICAgICBTdHJlYW1JbkhhbEhpZGw6OlJlYWRlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgaWYgKCFtQ29tbWFuZE1RLT53cml0ZSgmcGFyYW1zKSkgewotICAgICAgICBBTE9HVygiY29tbWFuZCBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0gICAgbUVmR3JvdXAtPndha2Uoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCkpOwotCi0gICAgLy8gVE9ETzogUmVtb3ZlIG1hbnVhbCBldmVudCBmbGFnIGhhbmRsaW5nIG9uY2UgYmxvY2tpbmcgTVEgaXMgaW1wbGVtZW50ZWQuIGIvMzM4MTU0MjIKLSAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKLXJldHJ5OgotICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpKSB7Ci0gICAgICAgIFJlYWRTdGF0dXMgcmVhZFN0YXR1czsKLSAgICAgICAgcmVhZFN0YXR1cy5yZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgaWYgKCFtU3RhdHVzTVEtPnJlYWQoJnJlYWRTdGF0dXMpKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhdHVzIG1lc3NhZ2UgcmVhZCBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgICBpZiAocmVhZFN0YXR1cy5yZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgcmV0ID0gT0s7Ci0gICAgICAgICAgICBjYWxsYmFjayhyZWFkU3RhdHVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IHByb2Nlc3NSZXR1cm4oY21kTmFtZSwgcmVhZFN0YXR1cy5yZXR2YWwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7Ci0gICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgotICAgICAgICBnb3RvIHJldHJ5OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnByZXBhcmVGb3JSZWFkaW5nKHNpemVfdCBidWZmZXJTaXplKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gdGVtcENvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiB0ZW1wRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgcGlkX3QgaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnByZXBhcmVGb3JSZWFkaW5nKAotICAgICAgICAgICAgMSwgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE1ROjpEZXNjcmlwdG9yJiBjb21tYW5kTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFNUTo6RGVzY3JpcHRvciYgZGF0YU1RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNNUTo6RGVzY3JpcHRvciYgc3RhdHVzTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEluZm8mIGhhbFRocmVhZEluZm8pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wQ29tbWFuZE1RLnJlc2V0KG5ldyBDb21tYW5kTVEoY29tbWFuZE1RKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhTVEucmVzZXQobmV3IERhdGFNUShkYXRhTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOwotICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInByZXBhcmVGb3JSZWFkaW5nIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLSAgICBpZiAoIXRlbXBDb21tYW5kTVEgfHwgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBEYXRhTVEgfHwgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcENvbW1hbmRNUSwgIkZhaWxlZCB0byBvYnRhaW4gY29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBDb21tYW5kTVEgJiYgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiQ29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBEYXRhTVEsICJGYWlsZWQgdG8gb2J0YWluIGRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wRGF0YU1RICYmICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCksICJEYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIHJlYWRpbmcgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkoaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQpOwotCi0gICAgbUNvbW1hbmRNUSA9IHN0ZDo6bW92ZSh0ZW1wQ29tbWFuZE1RKTsKLSAgICBtRGF0YU1RID0gc3RkOjptb3ZlKHRlbXBEYXRhTVEpOwotICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOwotICAgIG1SZWFkZXJDbGllbnQgPSBnZXR0aWQoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0RnJhbWVzTG9zdCIsIG1TdHJlYW0tPmdldElucHV0RnJhbWVzTG9zdCgpLCBmcmFtZXNMb3N0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1SZWFkZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgewotICAgICAgICBSZWFkUGFyYW1ldGVycyBwYXJhbXM7Ci0gICAgICAgIHBhcmFtcy5jb21tYW5kID0gUmVhZENvbW1hbmQ6OkdFVF9DQVBUVVJFX1BPU0lUSU9OOwotICAgICAgICByZXR1cm4gY2FsbFJlYWRlclRocmVhZChwYXJhbXMsICJnZXRDYXB0dXJlUG9zaXRpb24iLAotICAgICAgICAgICAgICAgIFsmXShjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi5mcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICp0aW1lID0gcmVhZFN0YXR1cy5yZXBseS5jYXB0dXJlUG9zaXRpb24udGltZTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICBSZXN1bHQgcmV0dmFsOwotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0Q2FwdHVyZVBvc2l0aW9uKAotICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgaGlkbEZyYW1lcywgdWludDY0X3QgaGlkbFRpbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gaGlkbEZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgICp0aW1lID0gaGlkbFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldENhcHR1cmVQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIC8qIHNpbmtNZXRhZGF0YSAqLykgewotICAgIC8vIEF1ZGlvIEhBTCBWMi4wIGRvZXMgbm90IHN1cHBvcnQgcHJvcGFnYXRpbmcgc2luayBtZXRhZGF0YQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYWQ4YWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPGF0b21pYz4KLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lTdHJlYW0uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JU3RyZWFtSW4uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JU3RyZWFtT3V0Lmg+Ci0jaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgotI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW07Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbUluOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1PdXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyBSZWFkUGFyYW1ldGVycyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtSW46OlJlYWRQYXJhbWV0ZXJzOwotdXNpbmcgUmVhZFN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtSW46OlJlYWRTdGF0dXM7Ci11c2luZyBXcml0ZUNvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbU91dDo6V3JpdGVDb21tYW5kOwotdXNpbmcgV3JpdGVTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbU91dDo6V3JpdGVTdGF0dXM7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlSGFsSGlkbDsKLQotY2xhc3MgU3RyZWFtSGFsSGlkbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKTsKLQotICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgbWFzay4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZWZmZWN0IG9uIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLQotICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOwotCi0gICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAotICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7Ci0KLSAgcHJvdGVjdGVkOgotICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IFN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCB+U3RyZWFtSGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgZ2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgYm9vbCByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCk7Ci0KLSAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOwotCi0gIHByaXZhdGU6Ci0gICAgY29uc3QgaW50IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCA9IC0xOwotICAgIElTdHJlYW0gKm1TdHJlYW07Ci0gICAgaW50IG1IYWxUaHJlYWRQcmlvcml0eTsKLSAgICBzaXplX3QgbUNhY2hlZEJ1ZmZlclNpemU7Ci19OwotCi1jbGFzcyBTdHJlYW1PdXRIYWxIaWRsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOwotCi0gICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKLQotICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKTsKLQotICAgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIGJ5IHRoZSBhdWRpbyBkc3AgdG8gREFDIHNpbmNlCi0gICAgLy8gdGhlIG91dHB1dCBoYXMgZXhpdGVkIHN0YW5kYnkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKTsKLQotICAgIC8vIEdldCB0aGUgbG9jYWwgdGltZSBhdCB3aGljaCB0aGUgbmV4dCB3cml0ZSB0byB0aGUgYXVkaW8gZHJpdmVyIHdpbGwgYmUgcHJlc2VudGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBTZXQgdGhlIGNhbGxiYWNrIGZvciBub3RpZnlpbmcgY29tcGxldGlvbiBvZiBub24tYmxvY2tpbmcgd3JpdGUgYW5kIGRyYWluLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBwYXVzZSBhbmQgcmVzdW1lIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBkcmFpbiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKTsKLQotICAgIC8vIFJlcXVlc3RzIG5vdGlmaWNhdGlvbiB3aGVuIGRhdGEgYnVmZmVyZWQgYnkgdGhlIGRyaXZlci9oYXJkd2FyZSBoYXMgYmVlbiBwbGF5ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkcmFpbihib29sIGVhcmx5Tm90aWZ5KTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gZmx1c2ggdGhlIHF1ZXVlZCBkYXRhLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKLQotICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBwcmVzZW50ZWQgdG8gYW4gZXh0ZXJuYWwgb2JzZXJ2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgICAvLyBNZXRob2RzIHVzZWQgYnkgU3RyZWFtT3V0Q2FsbGJhY2sgKEhJREwpLgotICAgIHZvaWQgb25Xcml0ZVJlYWR5KCk7Ci0gICAgdm9pZCBvbkRyYWluUmVhZHkoKTsKLSAgICB2b2lkIG9uRXJyb3IoKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxIaWRsOwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFdyaXRlQ29tbWFuZCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IENvbW1hbmRNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gRGF0YU1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFdyaXRlU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOwotICAgIHNwPElTdHJlYW1PdXQ+IG1TdHJlYW07Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwotICAgIHN0ZDo6YXRvbWljPHBpZF90PiBtV3JpdGVyQ2xpZW50OwotICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtT3V0SGFsSGlkbChjb25zdCBzcDxJU3RyZWFtT3V0PiYgc3RyZWFtKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbU91dEhhbEhpZGwoKTsKLQotICAgIHVzaW5nIFdyaXRlckNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cyk+OwotICAgIHN0YXR1c190IGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICBXcml0ZUNvbW1hbmQgY21kLCBjb25zdCBjaGFyKiBjbWROYW1lLAotICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFTaXplLCBXcml0ZXJDYWxsYmFjayBjYWxsYmFjayk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvcldyaXRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpOwotfTsKLQotY2xhc3MgU3RyZWFtSW5IYWxIaWRsIDogcHVibGljIFN0cmVhbUluSGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsSGlkbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKLQotICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKLQotICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAotICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7Ci0KLSAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFBhcmFtZXRlcnMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICBzcDxJU3RyZWFtSW4+IG1TdHJlYW07Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwotICAgIHN0ZDo6YXRvbWljPHBpZF90PiBtUmVhZGVyQ2xpZW50OwotICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbEhpZGwoKTsKLQotICAgIHVzaW5nIFJlYWRlckNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpPjsKLSAgICBzdGF0dXNfdCBjYWxsUmVhZGVyVGhyZWFkKAotICAgICAgICAgICAgY29uc3QgUmVhZFBhcmFtZXRlcnMmIHBhcmFtcywgY29uc3QgY2hhciogY21kTmFtZSwgUmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spOwotICAgIHN0YXR1c190IHByZXBhcmVGb3JSZWFkaW5nKHNpemVfdCBidWZmZXJTaXplKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODEwN2U1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsTG9jYWwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJTdHJlYW1IYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLVN0cmVhbUhhbExvY2FsOjpTdHJlYW1IYWxMb2NhbChhdWRpb19zdHJlYW1fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQotICAgICAgICA6IG1EZXZpY2UoZGV2aWNlKSwKLSAgICAgICAgICBtU3RyZWFtKHN0cmVhbSkgewotICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KLSAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgewotICAgICAgICBtU3RyZWFtUG93ZXJMb2cuaW5pdChtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSksCi0gICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pLAotICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSkpOwotICAgIH0KLX0KLQotU3RyZWFtSGFsTG9jYWw6On5TdHJlYW1IYWxMb2NhbCgpIHsKLSAgICBtU3RyZWFtID0gMDsKLSAgICBtRGV2aWNlLmNsZWFyKCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKSB7Ci0gICAgKnJhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IG1TdHJlYW0tPmdldF9idWZmZXJfc2l6ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaykgewotICAgICptYXNrID0gbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7Ci0gICAgKmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICAqc2FtcGxlUmF0ZSA9IG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKTsKLSAgICAqbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKLSAgICAqZm9ybWF0ID0gbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3BhcmFtZXRlcnMobVN0cmVhbSwga3ZQYWlycy5zdHJpbmcoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIGNoYXIgKmhhbFZhbHVlcyA9IG1TdHJlYW0tPmdldF9wYXJhbWV0ZXJzKG1TdHJlYW0sIGtleXMuc3RyaW5nKCkpOwotICAgIGlmIChoYWxWYWx1ZXMgIT0gTlVMTCkgewotICAgICAgICB2YWx1ZXMtPnNldFRvKGhhbFZhbHVlcyk7Ci0gICAgICAgIGZyZWUoaGFsVmFsdWVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+KSB7Ci0gICAgTE9HX0FMV0FZU19GQVRBTCgiTG9jYWwgc3RyZWFtcyBjYW4gbm90IGhhdmUgZWZmZWN0cyIpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+KSB7Ci0gICAgTE9HX0FMV0FZU19GQVRBTCgiTG9jYWwgc3RyZWFtcyBjYW4gbm90IGhhdmUgZWZmZWN0cyIpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnN0YW5kYnkoKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0YW5kYnkobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpkdW1wKGludCBmZCkgewotICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW0tPmR1bXAobVN0cmVhbSwgZmQpOwotICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50KSB7Ci0gICAgLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBhcyBsb2NhbCBoYWwgaXMgZXhlY3V0ZWQgYnkgYXVkaW9mbGluZ2VyIGRpcmVjdGx5Ci0gICAgLy8gb24gdGhlIHNhbWUgdGhyZWFkLgotICAgIHJldHVybiBPSzsKLX0KLQotU3RyZWFtT3V0SGFsTG9jYWw6OlN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQotICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKLX0KLQotU3RyZWFtT3V0SGFsTG9jYWw6On5TdHJlYW1PdXRIYWxMb2NhbCgpIHsKLSAgICBtQ2FsbGJhY2suY2xlYXIoKTsKLSAgICBtRGV2aWNlLT5jbG9zZU91dHB1dFN0cmVhbShtU3RyZWFtKTsKLSAgICBtU3RyZWFtID0gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IGF1ZGlvX3N0cmVhbV9vdXRfZnJhbWVfc2l6ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KSB7Ci0gICAgKmxhdGVuY3kgPSBtU3RyZWFtLT5nZXRfbGF0ZW5jeShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLSAgICBpZiAobVN0cmVhbS0+c2V0X3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF92b2x1bWUobVN0cmVhbSwgbGVmdCwgcmlnaHQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgewotICAgIHNzaXplX3Qgd3JpdGVSZXN1bHQgPSBtU3RyZWFtLT53cml0ZShtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKLSAgICBpZiAod3JpdGVSZXN1bHQgPiAwKSB7Ci0gICAgICAgICp3cml0dGVuID0gd3JpdGVSZXN1bHQ7Ci0gICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgewotICAgICAgICAqd3JpdHRlbiA9IDA7Ci0gICAgICAgIHJldHVybiB3cml0ZVJlc3VsdDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9yZW5kZXJfcG9zaXRpb24obVN0cmVhbSwgZHNwRnJhbWVzKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X25leHRfd3JpdGVfdGltZXN0YW1wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X25leHRfd3JpdGVfdGltZXN0YW1wKG1TdHJlYW0sIHRpbWVzdGFtcCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKLSAgICBpZiAobVN0cmVhbS0+c2V0X2NhbGxiYWNrID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBtU3RyZWFtLT5zZXRfY2FsbGJhY2sobVN0cmVhbSwgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2ssIHRoaXMpOwotICAgIGlmIChyZXN1bHQgPT0gT0spIHsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIHN0YXRpYwotaW50IFN0cmVhbU91dEhhbExvY2FsOjphc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkKiwgdm9pZCAqY29va2llKSB7Ci0gICAgLy8gV2UgYWN0IGFzIGlmIHdlIGdhdmUgYSB3cDxTdHJlYW1PdXRIYWxMb2NhbD4gdG8gSEFMLiBUaGlzIHdheSB3ZSBzaG91bGQgaGFuZGxlCi0gICAgLy8gY29ycmVjdGx5IHRoZSBjYXNlIHdoZW4gdGhlIGNhbGxiYWNrIGlzIGludm9rZWQgd2hpbGUgU3RyZWFtT3V0SGFsTG9jYWwncyBkZXN0cnVjdG9yIGlzCi0gICAgLy8gYWxyZWFkeSBydW5uaW5nLCBiZWNhdXNlIHRoZSBkZXN0cnVjdG9yIGlzIGludm9rZWQgYWZ0ZXIgdGhlIHJlZmNvdW50IGhhcyBiZWVuIGF0b21pY2FsbHkKLSAgICAvLyBkZWNyZW1lbnRlZC4KLSAgICB3cDxTdHJlYW1PdXRIYWxMb2NhbD4gd2Vha1NlbGYoc3RhdGljX2Nhc3Q8U3RyZWFtT3V0SGFsTG9jYWwqPihjb29raWUpKTsKLSAgICBzcDxTdHJlYW1PdXRIYWxMb2NhbD4gc2VsZiA9IHdlYWtTZWxmLnByb21vdGUoKTsKLSAgICBpZiAoc2VsZiA9PSAwKSByZXR1cm4gMDsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBzZWxmLT5tQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm4gMDsKLSAgICBBTE9HVigiYXN5bmNDYWxsYmFjaygpIGV2ZW50ICVkIiwgZXZlbnQpOwotICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX1dSSVRFX1JFQURZOgotICAgICAgICAgICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9EUkFJTl9SRUFEWToKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbkRyYWluUmVhZHkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfRVJST1I6Ci0gICAgICAgICAgICBjYWxsYmFjay0+b25FcnJvcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygiYXN5bmNDYWxsYmFjaygpIHVua25vd24gZXZlbnQgJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKSB7Ci0gICAgKnN1cHBvcnRzUGF1c2UgPSBtU3RyZWFtLT5wYXVzZSAhPSBOVUxMOwotICAgICpzdXBwb3J0c1Jlc3VtZSA9IG1TdHJlYW0tPnJlc3VtZSAhPSBOVUxMOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnBhdXNlKCkgewotICAgIGlmIChtU3RyZWFtLT5wYXVzZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnBhdXNlKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cmVzdW1lKCkgewotICAgIGlmIChtU3RyZWFtLT5yZXN1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5yZXN1bWUobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pIHsKLSAgICAqc3VwcG9ydHNEcmFpbiA9IG1TdHJlYW0tPmRyYWluICE9IE5VTEw7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6ZHJhaW4oYm9vbCBlYXJseU5vdGlmeSkgewotICAgIGlmIChtU3RyZWFtLT5kcmFpbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmRyYWluKG1TdHJlYW0sIGVhcmx5Tm90aWZ5ID8gQVVESU9fRFJBSU5fRUFSTFlfTk9USUZZIDogQVVESU9fRFJBSU5fQUxMKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmZsdXNoKCkgewotICAgIGlmIChtU3RyZWFtLT5mbHVzaCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmZsdXNoKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lc3RhbXApOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6dXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIGNvbnN0IHNvdXJjZV9tZXRhZGF0YV90IG1ldGFkYXRhIHsKLSAgICAgICAgLnRyYWNrX2NvdW50ID0gc291cmNlTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKLSAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCi0gICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHBsYXliYWNrX3RyYWNrX21ldGFkYXRhKj4oc291cmNlTWV0YWRhdGEudHJhY2tzLmRhdGEoKSksCi0gICAgfTsKLSAgICBtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhKG1TdHJlYW0sICZtZXRhZGF0YSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3RhcnQoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0YXJ0ID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RhcnQobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdG9wKCkgewotICAgIGlmIChtU3RyZWFtLT5zdG9wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RvcChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbihtU3RyZWFtLCBwb3NpdGlvbik7Ci19Ci0KLVN0cmVhbUluSGFsTG9jYWw6OlN0cmVhbUluSGFsTG9jYWwoYXVkaW9fc3RyZWFtX2luX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBTdHJlYW1IYWxMb2NhbCgmc3RyZWFtLT5jb21tb24sIGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7Ci19Ci0KLVN0cmVhbUluSGFsTG9jYWw6On5TdHJlYW1JbkhhbExvY2FsKCkgewotICAgIG1EZXZpY2UtPmNsb3NlSW5wdXRTdHJlYW0obVN0cmVhbSk7Ci0gICAgbVN0cmVhbSA9IDA7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IGF1ZGlvX3N0cmVhbV9pbl9mcmFtZV9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0R2FpbihmbG9hdCBnYWluKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF9nYWluKG1TdHJlYW0sIGdhaW4pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpIHsKLSAgICBzc2l6ZV90IHJlYWRSZXN1bHQgPSBtU3RyZWFtLT5yZWFkKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOwotICAgIGlmIChyZWFkUmVzdWx0ID4gMCkgewotICAgICAgICAqcmVhZCA9IHJlYWRSZXN1bHQ7Ci0gICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coIGJ1ZmZlciwgKnJlYWQpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKnJlYWQgPSAwOwotICAgICAgICByZXR1cm4gcmVhZFJlc3VsdDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCkgewotICAgICpmcmFtZXNMb3N0ID0gbVN0cmVhbS0+Z2V0X2lucHV0X2ZyYW1lc19sb3N0KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfY2FwdHVyZV9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uKG1TdHJlYW0sIGZyYW1lcywgdGltZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgewotICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgY29uc3Qgc2lua19tZXRhZGF0YV90IG1ldGFkYXRhIHsKLSAgICAgICAgLnRyYWNrX2NvdW50ID0gc2lua01ldGFkYXRhLnRyYWNrcy5zaXplKCksCi0gICAgICAgIC8vIGNvbnN0IGNhc3QgaXMgZmluZSBhcyBpdCBpcyBpbiBhIGNvbnN0IHN0cnVjdHVyZQotICAgICAgICAudHJhY2tzID0gY29uc3RfY2FzdDxyZWNvcmRfdHJhY2tfbWV0YWRhdGEqPihzaW5rTWV0YWRhdGEudHJhY2tzLmRhdGEoKSksCi0gICAgfTsKLSAgICBtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YShtU3RyZWFtLCAmbWV0YWRhdGEpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RhcnQoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0YXJ0ID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RhcnQobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnN0b3AoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgewotICAgIGlmIChtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIobVN0cmVhbSwgbWluU2l6ZUZyYW1lcywgaW5mbyk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbihtU3RyZWFtLCBwb3NpdGlvbik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAotICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyBfX3VudXNlZCkgewotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RhOGQwYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VIYWxMb2NhbDsKLQotY2xhc3MgU3RyZWFtSGFsTG9jYWwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOwotCi0gICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotCi0gICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSA9IDA7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgPSAwOwotCi0gICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAotICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7Ci0KLSAgcHJvdGVjdGVkOgotICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIH5TdHJlYW1IYWxMb2NhbCgpOwotCi0gICAgc3A8RGV2aWNlSGFsTG9jYWw+IG1EZXZpY2U7Ci0KLSAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9fc3RyZWFtX3QgKm1TdHJlYW07Ci19OwotCi1jbGFzcyBTdHJlYW1PdXRIYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1PdXRIYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7Ci0KLSAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwotCi0gICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOwotCi0gICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKLSAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOwotCi0gICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKLQotICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOwotCi0gICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19zdHJlYW1fb3V0X3QgKm1TdHJlYW07Ci0gICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKLQotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxMb2NhbCgpOwotCi0gICAgc3RhdGljIGludCBhc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkICpwYXJhbSwgdm9pZCAqY29va2llKTsKLX07Ci0KLWNsYXNzIFN0cmVhbUluSGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKLQotICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKLQotICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAotICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOwotCi0gICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICptU3RyZWFtOwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbUluSGFsTG9jYWwoYXVkaW9fc3RyZWFtX2luX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbExvY2FsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbVBvd2VyTG9nLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtUG93ZXJMb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc4YjFhYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtUG93ZXJMb2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfSAotCi0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KLSNpbmNsdWRlIDxhdWRpb191dGlscy9Qb3dlckxvZy5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3RyZWFtUG93ZXJMb2cgewotcHVibGljOgotICAgIFN0cmVhbVBvd2VyTG9nKCkgOgotICAgICAgICBtSXNVc2VyRGVidWdPckVuZ0J1aWxkKGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSksCi0gICAgICAgIG1Qb3dlckxvZyhudWxscHRyKSwKLSAgICAgICAgbUZyYW1lU2l6ZSgwKSB7Ci0gICAgICAgIC8vIHVzZSBpbml0KCkgdG8gc2V0IHVwIHRoZSBwb3dlciBsb2cuCi0gICAgfQotCi0gICAgflN0cmVhbVBvd2VyTG9nKCkgewotICAgICAgICBwb3dlcl9sb2dfZGVzdHJveShtUG93ZXJMb2cpOyAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKLSAgICAgICAgbVBvd2VyTG9nID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICAvLyBBIG9uZS10aW1lIGluaXRpYWxpemF0aW9uIChkbyBub3QgY2FsbCB0d2ljZSkgYmVmb3JlIHVzaW5nIFN0cmVhbVBvd2VyTG9nLgotICAgIHZvaWQgaW5pdCh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7Ci0gICAgICAgIGlmIChtUG93ZXJMb2cgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgLy8gTm90ZTogQSB3YXkgdG8gZ2V0IGNoYW5uZWwgY291bnQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBjaGFubmVsIG1hc2tzCi0gICAgICAgICAgICAvLyBidXQgZG9lcyBub3QgY2hlY2sgdmFsaWRpdHkgb2YgdGhlIGNoYW5uZWwgbWFzay4KLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykpOwotICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKLSAgICAgICAgICAgIGlmIChtRnJhbWVTaXplID4gMCkgewotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNhbXBsZVJhdGUgKiBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgLyAxMDAwOwotICAgICAgICAgICAgICAgIG1Qb3dlckxvZyA9IHBvd2VyX2xvZ19jcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRW50cmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBtUG93ZXJMb2cgbWF5IGJlIE5VTEwgKG5vdCB0aGUgcmlnaHQgYnVpbGQsIGZvcm1hdCBub3QgYWNjZXB0ZWQsIGV0Yy4pLgotICAgIH0KLQotICAgIC8vIER1bXAgdGhlIHBvd2VyIGxvZyB0byBmZC4KLSAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdCB7Ci0gICAgICAgIC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZwotICAgICAgICAodm9pZClwb3dlcl9sb2dfZHVtcCgKLSAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGZkLCAiICAgICAgIiAvKiBwcmVmaXggKi8sIGtQb3dlckxvZ0xpbmVzLCAwIC8qIGxpbWl0X25zICovKTsKLSAgICB9Ci0KLSAgICAvLyBMb2cgdGhlIGF1ZGlvIGRhdGEgY29udGFpbmVkIGluIGJ1ZmZlci4KLSAgICB2b2lkIGxvZyhjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplSW5CeXRlcykgY29uc3QgewotICAgICAgICBpZiAobVBvd2VyTG9nICE9IG51bGxwdHIpIHsgLy8gbUZyYW1lU2l6ZSBpcyBhbHdheXMgbm9uemVybyBpZiBtUG93ZXJMb2cgZXhpc3RzLgotICAgICAgICAgICAgcG93ZXJfbG9nX2xvZygKLSAgICAgICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBidWZmZXIsIHNpemVJbkJ5dGVzIC8gbUZyYW1lU2l6ZSwgYXVkaW9fdXRpbHNfZ2V0X3JlYWxfdGltZV9ucygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2wgaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKLSAgICB9Ci0KLXByaXZhdGU6Ci0KLSAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpIHsKLSAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICAgICAodm9pZClwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLnR5cGUiLCB2YWx1ZSwgInVua25vd24iKTsgLy8gaWdub3JlIGFjdHVhbCBsZW5ndGgKLSAgICAgICAgcmV0dXJuIHN0cmNtcCh2YWx1ZSwgInVzZXJkZWJ1ZyIpID09IDAgfHwgc3RyY21wKHZhbHVlLCAiZW5nIikgPT0gMDsKLSAgICB9Ci0KLSAgICAvLyBBdWRpbyBzaWduYWwgcG93ZXIgbG9nIGNvbmZpZ3VyYXRpb24uCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dMaW5lcyA9IDQwOwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zID0gNTA7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dFbnRyaWVzID0gKDEgLyogbWludXRlcyAqLyAqIDYwIC8qIHNlY29uZHMgKi8gKiAxMDAwIC8qIG1zZWMgKi8KLSAgICAgICAgICAgIC8ga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zKTsKLQotICAgIGNvbnN0IGJvb2wgbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKLSAgICBwb3dlcl9sb2dfdCAqbVBvd2VyTG9nOwotICAgIHNpemVfdCBtRnJhbWVTaXplOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzM2RlZmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1jY19saWJyYXJ5X3NoYXJlZCB7Ci0gICAgbmFtZTogImxpYmF1ZGlvaGFsQDQuMCIsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJEZXZpY2VIYWxMb2NhbC5jcHAiLAotICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIiwKLSAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIiwKLSAgICAgICAgIlN0cmVhbUhhbExvY2FsLmNwcCIsCi0KLSAgICAgICAgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCIsCi0gICAgICAgICJEZXZpY2VIYWxIaWRsLmNwcCIsCi0gICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkVmZmVjdEhhbEhpZGwuY3BwIiwKLSAgICAgICAgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAiLAotICAgICAgICAiU3RyZWFtSGFsSGlkbC5jcHAiLAotICAgIF0sCi0KLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdleHRyYSIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhdWRpb2hhbF9kZWF0aGhhbmRsZXIiLAotICAgICAgICAibGliYXVkaW91dGlscyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJoYXJkd2FyZSIsCi0gICAgICAgICJsaWJiYXNlIiwKLSAgICAgICAgImxpYmZtcSIsCi0gICAgICAgICJsaWJod2JpbmRlciIsCi0gICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICJsaWJoaWRsbWVtb3J5IiwKLSAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A0LjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb24tdXRpbCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA0LjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANC4wLXV0aWwiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANC4wIiwKLSAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKLSAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCi0gICAgICAgICJsaWJtZWRpYXV0aWxzIiwKLSAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbi51dGlsQGFsbC12ZXJzaW9ucyIsCi0gICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIgotICAgIF0sCi0KLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCi0gICAgICAgICJsaWJmbXEiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyNzUwNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiSGFsSGlkbCIKLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkRldmljZUFkZHJlc3M7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TWljcm9waG9uZUluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVzdWx0OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OmtleXNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpIHsKLSAgICBBdWRpb1BhcmFtZXRlciBoYWxLZXlzKGtleXMpOwotICAgIGlmIChoYWxLZXlzLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgIGhpZGxLZXlzLT5yZXNpemUoaGFsS2V5cy5zaXplKCkpOwotICAgIC8vRklYTUU6ICBrZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyBhbmQga2V5U3RyZWFtU3VwcG9ydGVkU2FtcGxpbmdSYXRlcyBjb21lIHdpdGggYQotICAgIC8vICJrZXlGb3JtYXQ9PHZhbHVlPiIgcGFpci4gV2UgbmVlZCB0byB0cmFuc2Zvcm0gaXQgaW50byBhIHNpbmdsZSBrZXkgc3RyaW5nIHNvIHRoYXQgaXQgaXMKLSAgICAvLyBjYXJyaWVkIG92ZXIgdG8gdGhlIGxlZ2FjeSBIQUwgdmlhIEhJREwuCi0gICAgU3RyaW5nOCB2YWx1ZTsKLSAgICBib29sIGtlZXBGb3JtYXRWYWx1ZSA9IGhhbEtleXMuc2l6ZSgpID09IDIgJiYKLSAgICAgICAgIChoYWxLZXlzLmdldChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyksIHZhbHVlKSA9PSBOT19FUlJPUiB8fAotICAgICAgICAgaGFsS2V5cy5nZXQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkU2FtcGxpbmdSYXRlcyksIHZhbHVlKSA9PSBOT19FUlJPUik7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhhbEtleXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgU3RyaW5nOCBrZXk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGhhbEtleXMuZ2V0QXQoaSwga2V5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgaWYgKGtlZXBGb3JtYXRWYWx1ZSAmJiBrZXkgPT0gQXVkaW9QYXJhbWV0ZXI6OmtleUZvcm1hdCkgewotICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgZm9ybWF0UGFyYW07Ci0gICAgICAgICAgICBoYWxLZXlzLmdldEF0KGksIGtleSwgdmFsdWUpOwotICAgICAgICAgICAgZm9ybWF0UGFyYW0uYWRkKGtleSwgdmFsdWUpOwotICAgICAgICAgICAga2V5ID0gZm9ybWF0UGFyYW0udG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICAoKmhpZGxLZXlzKVtpXSA9IGtleS5zdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzRnJvbUhhbCgKLSAgICAgICAgY29uc3QgU3RyaW5nOCYga3ZQYWlycywgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+ICpoaWRsUGFyYW1zKSB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW1zKGt2UGFpcnMpOwotICAgIGlmIChwYXJhbXMuc2l6ZSgpID09IDApIHJldHVybiBCQURfVkFMVUU7Ci0gICAgaGlkbFBhcmFtcy0+cmVzaXplKHBhcmFtcy5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFN0cmluZzgga2V5LCB2YWx1ZTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1zLmdldEF0KGksIGtleSwgdmFsdWUpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgICAgICAoKmhpZGxQYXJhbXMpW2ldLmtleSA9IGtleS5zdHJpbmcoKTsKLSAgICAgICAgKCpoaWRsUGFyYW1zKVtpXS52YWx1ZSA9IHZhbHVlLnN0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6cGFyYW1ldGVyc1RvSGFsKAotICAgICAgICBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMsIFN0cmluZzggKnZhbHVlcykgewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtZXRlcnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgcGFyYW1zLmFkZChTdHJpbmc4KHBhcmFtZXRlcnNbaV0ua2V5LmNfc3RyKCkpLCBTdHJpbmc4KHBhcmFtZXRlcnNbaV0udmFsdWUuY19zdHIoKSkpOwotICAgIH0KLSAgICB2YWx1ZXMtPnNldFRvKHBhcmFtcy50b1N0cmluZygpKTsKLX0KLQotQ29udmVyc2lvbkhlbHBlckhpZGw6OkNvbnZlcnNpb25IZWxwZXJIaWRsKGNvbnN0IGNoYXIqIGNsYXNzTmFtZSkKLSAgICAgICAgOiBtQ2xhc3NOYW1lKGNsYXNzTmFtZSkgewotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjphbmFseXplUmVzdWx0KGNvbnN0IFJlc3VsdCYgcmVzdWx0KSB7Ci0gICAgc3dpdGNoIChyZXN1bHQpIHsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUzogcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfU1RBVEU6IHJldHVybiBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6IHJldHVybiBOT19JTklUOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX1NVUFBPUlRFRDogcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci19Ci0KLXZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6OmVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pIHsKLSAgICBBTE9HRSgiJXMgJXAgJXM6ICVzIChmcm9tIHJwYykiLCBtQ2xhc3NOYW1lLCB0aGlzLCBmdW5jTmFtZSwgZGVzY3JpcHRpb24pOwotfQotCi0vLyBUT0RPOiBVc2UgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gaW4gdGhlIGhhbCB3aGVuIGl0IG1vdmVzIHRvIGEgdXRpbCBsaWJyYXJ5Lgotc3RkOjpzdHJpbmcgZGV2aWNlQWRkcmVzc1RvSGFsKGNvbnN0IERldmljZUFkZHJlc3MmIGFkZHJlc3MpIHsKLSAgICAvLyBIQUwgYXNzdW1lcyB0aGF0IHRoZSBhZGRyZXNzIGlzIE5VTC10ZXJtaW5hdGVkLgotICAgIGNoYXIgaGFsQWRkcmVzc1tBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOXTsKLSAgICBtZW1zZXQoaGFsQWRkcmVzcywgMCwgc2l6ZW9mKGhhbEFkZHJlc3MpKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgaGFsRGV2aWNlID0gc3RhdGljX2Nhc3Q8YXVkaW9fZGV2aWNlc190PihhZGRyZXNzLmRldmljZSk7Ci0gICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7Ci0gICAgaWYgKGlzSW5wdXQpIGhhbERldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKSB8fAotICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSAhPSAwKSkgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCi0gICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5tYWNbMF0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbMV0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbMl0sCi0gICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5tYWNbM10sIGFkZHJlc3MuYWRkcmVzcy5tYWNbNF0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbNV0pOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0lQKSAhPSAwKSB8fAotICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9JUCkgIT0gMCkpIHsKLSAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJWQuJWQuJWQuJWQiLCBhZGRyZXNzLmFkZHJlc3MuaXB2NFswXSwKLSAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLmlwdjRbMV0sIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzJdLCBhZGRyZXNzLmFkZHJlc3MuaXB2NFszXSk7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX1VTQikgIT0gMCkgfHwKLSAgICAgICAgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQUxMX1VTQikgIT0gMCkpIHsKLSAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiY2FyZD0lZDtkZXZpY2U9JWQiLCBhZGRyZXNzLmFkZHJlc3MuYWxzYS5jYXJkLAotICAgICAgICAgICAgICAgICBhZGRyZXNzLmFkZHJlc3MuYWxzYS5kZXZpY2UpOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0JVUykgIT0gMCkgfHwKLSAgICAgICAgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQlVTKSAhPSAwKSkgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuYnVzQWRkcmVzcy5jX3N0cigpKTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMCB8fAotICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuclN1Ym1peEFkZHJlc3MuY19zdHIoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJXMiLCBhZGRyZXNzLmJ1c0FkZHJlc3MuY19zdHIoKSk7Ci0gICAgfQotICAgIHJldHVybiBoYWxBZGRyZXNzOwotfQotCi0vL2xvY2FsIGNvbnZlcnNpb24gaGVscGVycwotCi1hdWRpb19taWNyb3Bob25lX2NoYW5uZWxfbWFwcGluZ190ICBjaGFubmVsTWFwcGluZ1RvSGFsKEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nIG1hcHBpbmcpIHsKLSAgICBzd2l0Y2ggKG1hcHBpbmcpIHsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6VU5VU0VEOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1VOVVNFRDsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6RElSRUNUOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX0RJUkVDVDsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzo6UFJPQ0VTU0VEOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1BST0NFU1NFRDsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gY2hhbm5lbE1hcHBpbmdUb0hhbCBjb252ZXJzaW9uICVkIiwgbWFwcGluZyk7Ci0gICAgfQotfQotCi1hdWRpb19taWNyb3Bob25lX2xvY2F0aW9uX3QgbG9jYXRpb25Ub0hhbChBdWRpb01pY3JvcGhvbmVMb2NhdGlvbiBsb2NhdGlvbikgewotICAgIHN3aXRjaCAobG9jYXRpb24pIHsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6VU5LTk9XTjoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX1VOS05PV047Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246Ok1BSU5CT0RZOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fTUFJTkJPRFk7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246Ok1BSU5CT0RZX01PVkFCTEU6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9NQUlOQk9EWV9NT1ZBQkxFOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpQRVJJUEhFUkFMOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fUEVSSVBIRVJBTDsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gbG9jYXRpb25Ub0hhbCBjb252ZXJzaW9uICVkIiwgbG9jYXRpb24pOwotICAgIH0KLX0KLWF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uYWxpdHlfdCBkaXJlY3Rpb25hbGl0eVRvSGFsKEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5IGRpcikgewotICAgIHN3aXRjaCAoZGlyKSB7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6OlVOS05PV046Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9VTktOT1dOOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpPTU5JOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfRElSRUNUSU9OQUxJVFlfT01OSTsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6QklfRElSRUNUSU9OQUw6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9CSV9ESVJFQ1RJT05BTDsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6Q0FSRElPSUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9DQVJESU9JRDsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6SFlQRVJfQ0FSRElPSUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9IWVBFUl9DQVJESU9JRDsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6U1VQRVJfQ0FSRElPSUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9TVVBFUl9DQVJESU9JRDsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gZGlyZWN0aW9uYWxpdHlUb0hhbCBjb252ZXJzaW9uICVkIiwgZGlyKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6bWljcm9waG9uZUluZm9Ub0hhbChjb25zdCBNaWNyb3Bob25lSW5mbyYgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgKnBEc3QpIHsKLSAgICBpZiAocERzdCAhPSBOVUxMKSB7Ci0gICAgICAgIHNucHJpbnRmKHBEc3QtPmRldmljZV9pZCwgc2l6ZW9mKHBEc3QtPmRldmljZV9pZCksCi0gICAgICAgICAgICAgICAgICIlcyIsIHNyYy5kZXZpY2VJZC5jX3N0cigpKTsKLSAgICAgICAgcERzdC0+ZGV2aWNlID0gc3RhdGljX2Nhc3Q8YXVkaW9fZGV2aWNlc190PihzcmMuZGV2aWNlQWRkcmVzcy5kZXZpY2UpOwotICAgICAgICBzbnByaW50ZihwRHN0LT5hZGRyZXNzLCBzaXplb2YocERzdC0+YWRkcmVzcyksCi0gICAgICAgICAgICAgICAgICIlcyIsIGRldmljZUFkZHJlc3NUb0hhbChzcmMuZGV2aWNlQWRkcmVzcykuY19zdHIoKSk7Ci0gICAgICAgIGlmIChzcmMuY2hhbm5lbE1hcHBpbmcuc2l6ZSgpID4gQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVgpIHsKLSAgICAgICAgICAgIEFMT0dXKCJtaWNyb3Bob25lSW5mb1RvU3RydWN0IGZvdW5kICV6dSBjaGFubmVsTWFwcGluZyBlbGVtZW50cy4gTWF4IGV4cGVjdGVkIGlzICVkIiwKLSAgICAgICAgICAgICAgICAgIHNyYy5jaGFubmVsTWFwcGluZy5zaXplKCksIEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYKTsKLSAgICAgICAgfQotICAgICAgICBzaXplX3QgY2g7Ci0gICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHNyYy5jaGFubmVsTWFwcGluZy5zaXplKCkgJiYgY2ggPCBBVURJT19DSEFOTkVMX0NPVU5UX01BWDsgY2grKykgewotICAgICAgICAgICAgcERzdC0+Y2hhbm5lbF9tYXBwaW5nW2NoXSA9IGNoYW5uZWxNYXBwaW5nVG9IYWwoc3JjLmNoYW5uZWxNYXBwaW5nW2NoXSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICg7IGNoIDwgQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVg7IGNoKyspIHsKLSAgICAgICAgICAgIHBEc3QtPmNoYW5uZWxfbWFwcGluZ1tjaF0gPSBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19VTlVTRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcERzdC0+bG9jYXRpb24gPSBsb2NhdGlvblRvSGFsKHNyYy5sb2NhdGlvbik7Ci0gICAgICAgIHBEc3QtPmdyb3VwID0gKGF1ZGlvX21pY3JvcGhvbmVfZ3JvdXBfdClzcmMuZ3JvdXA7Ci0gICAgICAgIHBEc3QtPmluZGV4X2luX3RoZV9ncm91cCA9ICh1bnNpZ25lZCBpbnQpc3JjLmluZGV4SW5UaGVHcm91cDsKLSAgICAgICAgcERzdC0+c2Vuc2l0aXZpdHkgPSBzcmMuc2Vuc2l0aXZpdHk7Ci0gICAgICAgIHBEc3QtPm1heF9zcGwgPSBzcmMubWF4U3BsOwotICAgICAgICBwRHN0LT5taW5fc3BsID0gc3JjLm1pblNwbDsKLSAgICAgICAgcERzdC0+ZGlyZWN0aW9uYWxpdHkgPSBkaXJlY3Rpb25hbGl0eVRvSGFsKHNyYy5kaXJlY3Rpb25hbGl0eSk7Ci0gICAgICAgIHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzID0gKHVuc2lnbmVkIGludClzcmMuZnJlcXVlbmN5UmVzcG9uc2Uuc2l6ZSgpOwotICAgICAgICBpZiAocERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMgPiBBVURJT19NSUNST1BIT05FX01BWF9GUkVRVUVOQ1lfUkVTUE9OU0VTKSB7Ci0gICAgICAgICAgICBBTE9HVygibWljcm9waG9uZUluZm9Ub1N0cnVjdCBmb3VuZCAlZCBmcmVxdWVuY3kgcmVzcG9uc2VzLiBNYXggZXhwZWN0ZWQgaXMgJWQiLAotICAgICAgICAgICAgICAgICAgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMsIEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVMpOwotICAgICAgICAgICAgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMgPSBBVURJT19NSUNST1BIT05FX01BWF9GUkVRVUVOQ1lfUkVTUE9OU0VTOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXM7IGsrKykgewotICAgICAgICAgICAgcERzdC0+ZnJlcXVlbmN5X3Jlc3BvbnNlc1swXVtrXSA9IHNyYy5mcmVxdWVuY3lSZXNwb25zZVtrXS5mcmVxdWVuY3k7Ci0gICAgICAgICAgICBwRHN0LT5mcmVxdWVuY3lfcmVzcG9uc2VzWzFdW2tdID0gc3JjLmZyZXF1ZW5jeVJlc3BvbnNlW2tdLmxldmVsOwotICAgICAgICB9Ci0gICAgICAgIHBEc3QtPmdlb21ldHJpY19sb2NhdGlvbi54ID0gc3JjLnBvc2l0aW9uLng7Ci0gICAgICAgIHBEc3QtPmdlb21ldHJpY19sb2NhdGlvbi55ID0gc3JjLnBvc2l0aW9uLnk7Ci0gICAgICAgIHBEc3QtPmdlb21ldHJpY19sb2NhdGlvbi56ID0gc3JjLnBvc2l0aW9uLno7Ci0gICAgICAgIHBEc3QtPm9yaWVudGF0aW9uLnggPSBzcmMub3JpZW50YXRpb24ueDsKLSAgICAgICAgcERzdC0+b3JpZW50YXRpb24ueSA9IHNyYy5vcmllbnRhdGlvbi55OwotICAgICAgICBwRHN0LT5vcmllbnRhdGlvbi56ID0gc3JjLm9yaWVudGF0aW9uLno7Ci0gICAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgVjRfMAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9Db252ZXJzaW9uSGVscGVySGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MjNhOGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NPTlZFUlNJT05fSEVMUEVSX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMXzRfMF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC90eXBlcy5oPgotI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpNaWNyb3Bob25lSW5mbzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgQ29udmVyc2lvbkhlbHBlckhpZGwgewotICBwcm90ZWN0ZWQ6Ci0gICAgc3RhdGljIHN0YXR1c190IGtleXNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBwYXJhbWV0ZXJzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpOwotICAgIHN0YXRpYyB2b2lkIHBhcmFtZXRlcnNUb0hhbChjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMsIFN0cmluZzggKnZhbHVlcyk7Ci0gICAgc3RhdGljIHZvaWQgbWljcm9waG9uZUluZm9Ub0hhbChjb25zdCBNaWNyb3Bob25lSW5mbyYgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190ICpwRHN0KTsKLQotICAgIENvbnZlcnNpb25IZWxwZXJIaWRsKGNvbnN0IGNoYXIqIGNsYXNzTmFtZSk7Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBUPgotICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxSPiYgcmV0LCBUICpyZXR2YWwpIHsKLSAgICAgICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgd2F5IGl0IGFsc28gd29ya3MgZm9yIGVudW0gY2xhc3MgdG8gdW5zY29wZWQgZW51bSBjb252ZXJzaW9uLgotICAgICAgICAgICAgKnJldHZhbCA9IHN0YXRpY19jYXN0PFQ+KHN0YXRpY19jYXN0PFI+KHJldCkpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKGZ1bmNOYW1lLCByZXQpOwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFQ+JiByZXQpIHsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gT0sgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVzdWx0PiYgcmV0KSB7Ci0gICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFQ+JiByZXQsIGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVzdWx0IHJldHZhbCkgewotICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgY29uc3QgY2hhciogbUNsYXNzTmFtZTsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IGhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVzdWx0JiByZXN1bHQpOwotCi0gICAgdm9pZCBlbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBWNF8wCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYWNjYTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVByaW1hcnlEZXZpY2UuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25VdGlscy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbEhpZGwuaCIKLSNpbmNsdWRlICJWZXJzaW9uVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Db25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0RldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvSW5wdXRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9PdXRwdXRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9QYXRjaEhhbmRsZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvUG9ydDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvUG9ydENvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvTW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvU291cmNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6SGlkbFV0aWxzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6dXRpbHM6Om1rRW51bUNvbnZlcnRlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpEZXZpY2VBZGRyZXNzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklQcmltYXJ5RGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpTaW5rTWV0YWRhdGE7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLW5hbWVzcGFjZSB7Ci0KLXN0YXR1c190IGRldmljZUFkZHJlc3NGcm9tSGFsKAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBjaGFyKiBoYWxBZGRyZXNzLCBEZXZpY2VBZGRyZXNzKiBhZGRyZXNzKSB7Ci0gICAgYWRkcmVzcy0+ZGV2aWNlID0gQXVkaW9EZXZpY2UoZGV2aWNlKTsKLQotICAgIGlmIChoYWxBZGRyZXNzID09IG51bGxwdHIgfHwgc3RybmxlbihoYWxBZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7Ci0gICAgaWYgKGlzSW5wdXQpIGRldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKQotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgIT0gMCkpIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAotICAgICAgICAgICAgICAgICIlaGhYOiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWCIsCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMV0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1syXSwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbM10sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s0XSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzVdKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA2ID8gT0sgOiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSVApICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0lQKSAhPSAwKSkgewotICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgIiVoaHUuJWhodS4laGh1LiVoaHUiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMF0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMV0sCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsyXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFszXSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gNCA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpKSAhPSAwCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0FMTF9VU0IpKSAhPSAwKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiY2FyZD0lZDtkZXZpY2U9JWQiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuY2FyZCwgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5kZXZpY2UpOwotICAgICAgICByZXR1cm4gc3RhdHVzID09IDIgPyBPSyA6IEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9CVVMpICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JVUykgIT0gMCkpIHsKLSAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgewotICAgICAgICAgICAgYWRkcmVzcy0+YnVzQWRkcmVzcyA9IGhhbEFkZHJlc3M7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMAotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgewotICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBhZGRyZXNzLT5yU3VibWl4QWRkcmVzcyA9IGhhbEFkZHJlc3M7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotRGV2aWNlSGFsSGlkbDo6RGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKQotICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJEZXZpY2UiKSwgbURldmljZShkZXZpY2UpLAotICAgICAgICAgIG1QcmltYXJ5RGV2aWNlKElQcmltYXJ5RGV2aWNlOjpjYXN0RnJvbShkZXZpY2UpKSB7Ci19Ci0KLURldmljZUhhbEhpZGw6On5EZXZpY2VIYWxIaWRsKCkgewotICAgIGlmIChtRGV2aWNlICE9IDApIHsKLSAgICAgICAgbURldmljZS5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCopIHsKLSAgICAvLyBPYnNvbGV0ZS4KLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmluaXRDaGVjaygpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiaW5pdENoZWNrIiwgbURldmljZS0+aW5pdENoZWNrKCkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3RlclZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtUHJpbWFyeURldmljZS0+Z2V0TWFzdGVyVm9sdW1lKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBmbG9hdCB2KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnZvbHVtZSA9IHY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3RlclZvbHVtZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBtUHJpbWFyeURldmljZS0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1pY011dGUiLCBtRGV2aWNlLT5zZXRNaWNNdXRlKHN0YXRlKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNNdXRlKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNaWNNdXRlIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyTXV0ZSIsIG1EZXZpY2UtPnNldE1hc3Rlck11dGUoc3RhdGUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1hc3Rlck11dGUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3Rlck11dGUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIC8vIFRPRE86IGNoYW5nZSB0aGUgQVBJIHNvIHRoYXQgY29udGV4dCBhbmQga3ZQYWlycyBhcmUgc2VwYXJhdGVkCi0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzOjpzZXRQYXJhbWV0ZXJzKG1EZXZpY2UsIHt9IC8qIGNvbnRleHQgKi8sIGhpZGxQYXJhbXMpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGtleXNGcm9tSGFsKGtleXMsICZoaWRsS2V5cyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSB1dGlsczo6Z2V0UGFyYW1ldGVycyhtRGV2aWNlLAotICAgICAgICAgICAge30gLyogY29udGV4dCAqLywKLSAgICAgICAgICAgIGhpZGxLZXlzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGJ1ZmZlclNpemUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0QnVmZmVyU2l6ZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgIGhpZGxEZXZpY2UsCi0gICAgICAgICAgICBoaWRsQ29uZmlnLAotICAgICAgICAgICAgbWtFbnVtQ29udmVydGVyPEF1ZGlvT3V0cHV0RmxhZz4oZmxhZ3MpLAotICAgICAgICAgICAge30gLyogbWV0YWRhdGEgKi8sCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1PdXQ+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbEhpZGwocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuT3V0cHV0U3RyZWFtIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAvLyBUT0RPOiBjb3JyZWN0bHkgcHJvcGFnYXRlIHRoZSB0cmFja3Mgc291cmNlcyBhbmQgdm9sdW1lCi0gICAgLy8gICAgICAgZm9yIG5vdywgb25seSBzZW5kIHRoZSBtYWluIHNvdXJjZSBhdCAxZGJmcwotICAgIFNpbmtNZXRhZGF0YSBtZXRhZGF0YSA9IHt7e0F1ZGlvU291cmNlKHNvdXJjZSksIDF9fX07Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgIGhpZGxEZXZpY2UsCi0gICAgICAgICAgICBoaWRsQ29uZmlnLAotICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICBtZXRhZGF0YSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbUluPiYgcmVzdWx0LCBjb25zdCBBdWRpb0NvbmZpZyYgc3VnZ2VzdGVkQ29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsSGlkbChyZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5JbnB1dFN0cmVhbSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzQXVkaW9QYXRjaGVzIiwgbURldmljZS0+c3VwcG9ydHNBdWRpb1BhdGNoZXMoKSwgc3VwcG9ydHNQYXRjaGVzKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Y3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPEF1ZGlvUG9ydENvbmZpZz4gaGlkbFNvdXJjZXMsIGhpZGxTaW5rczsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zb3VyY2VzLCBzb3VyY2VzLCAmaGlkbFNvdXJjZXMpOwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnc0Zyb21IYWwobnVtX3NpbmtzLCBzaW5rcywgJmhpZGxTaW5rcyk7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Y3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIGhpZGxTb3VyY2VzLCBoaWRsU2lua3MsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIEF1ZGlvUGF0Y2hIYW5kbGUgaGlkbFBhdGNoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnBhdGNoID0gc3RhdGljX2Nhc3Q8YXVkaW9fcGF0Y2hfaGFuZGxlX3Q+KGhpZGxQYXRjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImNyZWF0ZUF1ZGlvUGF0Y2giLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbGVhc2VBdWRpb1BhdGNoIiwgbURldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgQXVkaW9Qb3J0IGhpZGxQb3J0OwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0RnJvbUhhbCgqcG9ydCwgJmhpZGxQb3J0KTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRBdWRpb1BvcnQoCi0gICAgICAgICAgICBoaWRsUG9ydCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgQXVkaW9Qb3J0JiBwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRUb0hhbChwLCBwb3J0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qb3J0IiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBBdWRpb1BvcnRDb25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRBdWRpb1BvcnRDb25maWciLCBtRGV2aWNlLT5zZXRBdWRpb1BvcnRDb25maWcoaGlkbENvbmZpZykpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8pIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNyb3Bob25lcygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaGlkbF92ZWM8TWljcm9waG9uZUluZm8+IG1pY0FycmF5SGFsKSB7Ci0gICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbWljQXJyYXlIYWwuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBkc3Q7Ci0gICAgICAgICAgICAvL2NvbnZlcnQKLSAgICAgICAgICAgIG1pY3JvcGhvbmVJbmZvVG9IYWwobWljQXJyYXlIYWxba10sICZkc3QpOwotICAgICAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmUgPSBtZWRpYTo6TWljcm9waG9uZUluZm8oZHN0KTsKLSAgICAgICAgICAgIG1pY3JvcGhvbmVzSW5mby0+cHVzaF9iYWNrKG1pY3JvcGhvbmUpOwotICAgICAgICB9Ci0gICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1pY3JvcGhvbmVzIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpkdW1wKGludCBmZCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJkMjE3NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMXzRfMF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JRGV2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVByaW1hcnlEZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJRGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklQcmltYXJ5RGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIERldmljZUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKLXsKLSAgcHVibGljOgotICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKLQotICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7Ci0KLSAgICAvLyBNdXRpbmcgY29udHJvbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKLQotICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBzaXplX3QgKnNpemUpOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKLQotICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOwotCi0gICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKLQotICAgIC8vIExpc3QgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbDsKLSAgICBzcDxJRGV2aWNlPiBtRGV2aWNlOwotICAgIHNwPElQcmltYXJ5RGV2aWNlPiBtUHJpbWFyeURldmljZTsgIC8vIE51bGwgaWYgaXQncyBub3QgYSBwcmltYXJ5IGRldmljZS4KLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KLSAgICB2aXJ0dWFsIH5EZXZpY2VIYWxIaWRsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxMb2NhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNDVkZDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxMb2NhbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJTdHJlYW1IYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLURldmljZUhhbExvY2FsOjpEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KQotICAgICAgICA6IG1EZXYoZGV2KSB7Ci19Ci0KLURldmljZUhhbExvY2FsOjp+RGV2aWNlSGFsTG9jYWwoKSB7Ci0gICAgaW50IHN0YXR1cyA9IGF1ZGlvX2h3X2RldmljZV9jbG9zZShtRGV2KTsKLSAgICBBTE9HV19JRihzdGF0dXMsICJFcnJvciBjbG9zaW5nIGF1ZGlvIGh3IGRldmljZSAlcDogJXMiLCBtRGV2LCBzdHJlcnJvcigtc3RhdHVzKSk7Ci0gICAgbURldiA9IDA7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgKmRldmljZXMgPSBtRGV2LT5nZXRfc3VwcG9ydGVkX2RldmljZXMobURldik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6aW5pdENoZWNrKCkgewotICAgIHJldHVybiBtRGV2LT5pbml0X2NoZWNrKG1EZXYpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF92b2ljZV92b2x1bWUobURldiwgdm9sdW1lKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBpZiAobURldi0+c2V0X21hc3Rlcl92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpIHsKLSAgICBpZiAobURldi0+Z2V0X21hc3Rlcl92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZShtRGV2LCB2b2x1bWUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgewotICAgIHJldHVybiBtRGV2LT5zZXRfbW9kZShtRGV2LCBtb2RlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgewotICAgIHJldHVybiBtRGV2LT5zZXRfbWljX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljTXV0ZShib29sICpzdGF0ZSkgewotICAgIHJldHVybiBtRGV2LT5nZXRfbWljX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgaWYgKG1EZXYtPnNldF9tYXN0ZXJfbXV0ZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9tYXN0ZXJfbXV0ZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfbXV0ZShtRGV2LCBzdGF0ZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X3BhcmFtZXRlcnMobURldiwga3ZQYWlycy5zdHJpbmcoKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIGNoYXIgKmhhbFZhbHVlcyA9IG1EZXYtPmdldF9wYXJhbWV0ZXJzKG1EZXYsIGtleXMuc3RyaW5nKCkpOwotICAgIGlmIChoYWxWYWx1ZXMgIT0gTlVMTCkgewotICAgICAgICB2YWx1ZXMtPnNldFRvKGhhbFZhbHVlcyk7Ci0gICAgICAgIGZyZWUoaGFsVmFsdWVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLCBzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IG1EZXYtPmdldF9pbnB1dF9idWZmZXJfc2l6ZShtRGV2LCBjb25maWcpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6Om9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSkgewotICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqaGFsU3RyZWFtOwotICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gaGFuZGxlOiAlZCBkZXZpY2VzOiAleCBmbGFnczogJSN4IgotICAgICAgICAgICAgInNyYXRlOiAlZCBmb3JtYXQgJSN4IGNoYW5uZWxzICV4IGFkZHJlc3MgJXMiLAotICAgICAgICAgICAgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywKLSAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgIGFkZHJlc3MpOwotICAgIGludCBvcGVuUmVzdXQgPSBtRGV2LT5vcGVuX291dHB1dF9zdHJlYW0oCi0gICAgICAgICAgICBtRGV2LCBoYW5kbGUsIGRldmljZXMsIGZsYWdzLCBjb25maWcsICZoYWxTdHJlYW0sIGFkZHJlc3MpOwotICAgIGlmIChvcGVuUmVzdXQgPT0gT0spIHsKLSAgICAgICAgKm91dFN0cmVhbSA9IG5ldyBTdHJlYW1PdXRIYWxMb2NhbChoYWxTdHJlYW0sIHRoaXMpOwotICAgIH0KLSAgICBBTE9HVigib3Blbl9vdXRwdXRfc3RyZWFtIHN0YXR1cyAlZCBzdHJlYW0gJXAiLCBvcGVuUmVzdXQsIGhhbFN0cmVhbSk7Ci0gICAgcmV0dXJuIG9wZW5SZXN1dDsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6Om9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKLSAgICBhdWRpb19zdHJlYW1faW5fdCAqaGFsU3RyZWFtOwotICAgIEFMT0dWKCJvcGVuX2lucHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3ggIgotICAgICAgICAgICAgInNyYXRlOiAlZCBmb3JtYXQgJSN4IGNoYW5uZWxzICV4IGFkZHJlc3MgJXMgc291cmNlICVkIiwKLSAgICAgICAgICAgIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsCi0gICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICBhZGRyZXNzLCBzb3VyY2UpOwotICAgIGludCBvcGVuUmVzdWx0ID0gbURldi0+b3Blbl9pbnB1dF9zdHJlYW0oCi0gICAgICAgICAgICBtRGV2LCBoYW5kbGUsIGRldmljZXMsIGNvbmZpZywgJmhhbFN0cmVhbSwgZmxhZ3MsIGFkZHJlc3MsIHNvdXJjZSk7Ci0gICAgaWYgKG9wZW5SZXN1bHQgPT0gT0spIHsKLSAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsTG9jYWwoaGFsU3RyZWFtLCB0aGlzKTsKLSAgICB9Ci0gICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIHN0YXR1cyAlZCBzdHJlYW0gJXAiLCBvcGVuUmVzdWx0LCBpblN0cmVhbSk7Ci0gICAgcmV0dXJuIG9wZW5SZXN1bHQ7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpIHsKLSAgICAqc3VwcG9ydHNQYXRjaGVzID0gdmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzA7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Y3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgewotICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewotICAgICAgICByZXR1cm4gbURldi0+Y3JlYXRlX2F1ZGlvX3BhdGNoKAotICAgICAgICAgICAgICAgIG1EZXYsIG51bV9zb3VyY2VzLCBzb3VyY2VzLCBudW1fc2lua3MsIHNpbmtzLCBwYXRjaCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgIHJldHVybiBtRGV2LT5yZWxlYXNlX2F1ZGlvX3BhdGNoKG1EZXYsIHBhdGNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7Ci0gICAgcmV0dXJuIG1EZXYtPmdldF9hdWRpb19wb3J0KG1EZXYsIHBvcnQpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7Ci0gICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKQotICAgICAgICByZXR1cm4gbURldi0+c2V0X2F1ZGlvX3BvcnRfY29uZmlnKG1EZXYsIGNvbmZpZyk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgewotICAgIGlmIChtRGV2LT5nZXRfbWljcm9waG9uZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHNpemVfdCBhY3R1YWxfbWljcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UOwotICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBtaWNfYXJyYXlbQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlRdOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1EZXYtPmdldF9taWNyb3Bob25lcyhtRGV2LCAmbWljX2FycmF5WzBdLCAmYWN0dWFsX21pY3MpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0dWFsX21pY3M7IGkrKykgewotICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZUluZm8gPSBtZWRpYTo6TWljcm9waG9uZUluZm8obWljX2FycmF5W2ldKTsKLSAgICAgICAgbWljcm9waG9uZXMtPnB1c2hfYmFjayhtaWNyb3Bob25lSW5mbyk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpkdW1wKGludCBmZCkgewotICAgIHJldHVybiBtRGV2LT5kdW1wKG1EZXYsIGZkKTsKLX0KLQotdm9pZCBEZXZpY2VIYWxMb2NhbDo6Y2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpIHsKLSAgICBtRGV2LT5jbG9zZV9vdXRwdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9vdXQpOwotfQotCi12b2lkIERldmljZUhhbExvY2FsOjpjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbikgewotICAgIG1EZXYtPmNsb3NlX2lucHV0X3N0cmVhbShtRGV2LCBzdHJlYW1faW4pOwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxMb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODM0MWE0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF80XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfNF8wX0gKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRGV2aWNlSGFsTG9jYWwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXRzIHRoZSB2YWx1ZSBvZiAnZGV2aWNlcycgdG8gYSBiaXRtYXNrIG9mIDEgb3IgbW9yZSB2YWx1ZXMgb2YgYXVkaW9fZGV2aWNlc190LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcyk7Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgb2YgYSB2b2ljZSBjYWxsLiBSYW5nZSBpcyBiZXR3ZWVuIDAuMCBhbmQgMS4wLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIGZvciBhbGwgYXVkaW8gYWN0aXZpdGllcyBvdGhlciB0aGFuIHZvaWNlIGNhbGwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIEdldCB0aGUgY3VycmVudCBtYXN0ZXIgdm9sdW1lIHZhbHVlIGZvciB0aGUgSEFMLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpOwotCi0gICAgLy8gTXV0aW5nIGNvbnRyb2wuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljTXV0ZShib29sICpzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSk7Ci0KLSAgICAvLyBTZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gUmV0dXJucyBhdWRpbyBpbnB1dCBidWZmZXIgc2l6ZSBhY2NvcmRpbmcgdG8gcGFyYW1ldGVycyBwYXNzZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUoY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKTsKLQotICAgIC8vIENyZWF0ZXMgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCk7Ci0KLSAgICAvLyBSZWxlYXNlcyBhbiBhdWRpbyBwYXRjaC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKTsKLQotICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAvLyBMaXN0IG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIHZvaWQgY2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpOwotICAgIHZvaWQgY2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKm1EZXY7Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCi0gICAgdmlydHVhbCB+RGV2aWNlSGFsTG9jYWwoKTsKLQotICAgIHVpbnQzMl90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtRGV2LT5jb21tb24udmVyc2lvbjsgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODMxOTRlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JRGV2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSB7Ci0gICAgbURldmljZXNGYWN0b3J5ID0gSURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7Ci0gICAgaWYgKG1EZXZpY2VzRmFjdG9yeSAhPSAwKSB7Ci0gICAgICAgIC8vIEl0IGlzIGFzc3VtZWQgdGhhdCBEZXZpY2VzRmFjdG9yeSBpcyBvd25lZCBieSBBdWRpb0ZsaW5nZXIKLSAgICAgICAgLy8gYW5kIHRodXMgaGF2ZSB0aGUgc2FtZSBsaWZlc3Bhbi4KLSAgICAgICAgbURldmljZXNGYWN0b3J5LT5saW5rVG9EZWF0aChIYWxEZWF0aEhhbmRsZXI6OmdldEluc3RhbmNlKCksIDAgLypjb29raWUqLyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvYnRhaW4gSURldmljZXNGYWN0b3J5IHNlcnZpY2UsIHRlcm1pbmF0aW5nIHByb2Nlc3MuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIC8vIFRoZSBNU0QgZmFjdG9yeSBpcyBvcHRpb25hbAotICAgIG1EZXZpY2VzRmFjdG9yeU1zZCA9IElEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZShBVURJT19IQUxfU0VSVklDRV9OQU1FX01TRCk7Ci0gICAgLy8gVE9ETzogUmVnaXN0ZXIgZGVhdGggaGFuZGxlciwgYW5kIGFkZCAncmVzdGFydCcgZGlyZWN0aXZlIHRvIGF1ZGlvc2VydmVyLnJjCi19Ci0KLURldmljZXNGYWN0b3J5SGFsSGlkbDo6fkRldmljZXNGYWN0b3J5SGFsSGlkbCgpIHsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgewotICAgIGlmIChtRGV2aWNlc0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlc0ZhY3RvcnktPm9wZW5EZXZpY2UoCi0gICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRGV2aWNlPiYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmRldmljZSA9IG5ldyBEZXZpY2VIYWxIaWRsKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7Ci0gICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNDg4OWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lEZXZpY2VzRmFjdG9yeS5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SURldmljZXNGYWN0b3J5OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCi0gICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkOwotCi0gICAgc3A8SURldmljZXNGYWN0b3J5PiBtRGV2aWNlc0ZhY3Rvcnk7Ci0gICAgc3A8SURldmljZXNGYWN0b3J5PiBtRGV2aWNlc0ZhY3RvcnlNc2Q7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCk7Ci0KLSAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbEhpZGwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZmMWVjN2QuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8bGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmg+Ci0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLURldmljZXNGYWN0b3J5SGFsSHlicmlkOjpEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpCi0gICAgICAgIDogbUxvY2FsRmFjdG9yeShuZXcgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpKSwKLSAgICAgICAgICBtSGlkbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsSGlkbCgpKSB7Ci19Ci0KLURldmljZXNGYWN0b3J5SGFsSHlicmlkOjp+RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKSB7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsSHlicmlkOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgewotICAgIGlmIChtSGlkbEZhY3RvcnkgIT0gMCAmJiBzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0EyRFAsIG5hbWUpICE9IDAgJiYKLSAgICAgICAgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9IRUFSSU5HX0FJRCwgbmFtZSkgIT0gMCkgewotICAgICAgICByZXR1cm4gbUhpZGxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7Ci0gICAgfQotICAgIHJldHVybiBtTG9jYWxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0ZWRkNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotc3RhdGljIHN0YXR1c190IGxvYWRfYXVkaW9faW50ZXJmYWNlKGNvbnN0IGNoYXIgKmlmX25hbWUsIGF1ZGlvX2h3X2RldmljZV90ICoqZGV2KQotewotICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7Ci0gICAgaW50IHJjOwotCi0gICAgcmMgPSBod19nZXRfbW9kdWxlX2J5X2NsYXNzKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgJm1vZCk7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBsb2FkIGF1ZGlvIGh3IG1vZHVsZSAlcy4lcyAoJXMpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIHJjID0gYXVkaW9faHdfZGV2aWNlX29wZW4obW9kLCBkZXYpOwotICAgIGlmIChyYykgewotICAgICAgICBBTE9HRSgiJXMgY291bGRuJ3Qgb3BlbiBhdWRpbyBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICBpZiAoKCpkZXYpLT5jb21tb24udmVyc2lvbiA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4pIHsKLSAgICAgICAgQUxPR0UoIiVzIHdyb25nIGF1ZGlvIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBfX2Z1bmNfXywgKCpkZXYpLT5jb21tb24udmVyc2lvbik7Ci0gICAgICAgIHJjID0gQkFEX1ZBTFVFOwotICAgICAgICBhdWRpb19od19kZXZpY2VfY2xvc2UoKmRldik7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci0KLW91dDoKLSAgICAqZGV2ID0gTlVMTDsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsTG9jYWw6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7Ci0gICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldjsKLSAgICBzdGF0dXNfdCByYyA9IGxvYWRfYXVkaW9faW50ZXJmYWNlKG5hbWUsICZkZXYpOwotICAgIGlmIChyYyA9PSBPSykgewotICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbExvY2FsKGRldik7Ci0gICAgfQotICAgIHJldHVybiByYzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMWM1MjEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF80XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfNF8wX0gKLQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKLSAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpIHt9Ci0KLSAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkge30KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTdjODlmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGF0b21pYz4KLQotI2RlZmluZSBMT0dfVEFHICJFZmZlY3RCdWZmZXJIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oaWRsL2FsbG9jYXRvci8xLjAvSUFsbG9jYXRvci5oPgotI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6YWxsb2NhdG9yOjpWMV8wOjpJQWxsb2NhdG9yOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLS8vIHN0YXRpYwotdWludDY0X3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWFrZVVuaXF1ZUlkKCkgewotICAgIHN0YXRpYyBzdGQ6OmF0b21pYzx1aW50NjRfdD4gY291bnRlcnsxfTsKLSAgICByZXR1cm4gY291bnRlcisrOwotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZSgKLSAgICAgICAgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBtaXJyb3IobnVsbHB0ciwgc2l6ZSwgYnVmZmVyKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKAotICAgICAgICB2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gdGVtcEJ1ZmZlciA9IG5ldyBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemUpOwotICAgIHN0YXR1c190IHJlc3VsdCA9IHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPih0ZW1wQnVmZmVyLmdldCgpKS0+aW5pdCgpOwotICAgIGlmIChyZXN1bHQgPT0gT0spIHsKLSAgICAgICAgdGVtcEJ1ZmZlci0+c2V0RXh0ZXJuYWxEYXRhKGV4dGVybmFsKTsKLSAgICAgICAgKmJ1ZmZlciA9IHRlbXBCdWZmZXI7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUVmZmVjdEJ1ZmZlckhhbEhpZGw6OkVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpCi0gICAgICAgIDogbUJ1ZmZlclNpemUoc2l6ZSksIG1GcmFtZUNvdW50Q2hhbmdlZChmYWxzZSksCi0gICAgICAgICAgbUV4dGVybmFsRGF0YShudWxscHRyKSwgbUF1ZGlvQnVmZmVyezAsIHtudWxscHRyfX0gewotICAgIG1IaWRsQnVmZmVyLmlkID0gbWFrZVVuaXF1ZUlkKCk7Ci0gICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IDA7Ci19Ci0KLUVmZmVjdEJ1ZmZlckhhbEhpZGw6On5FZmZlY3RCdWZmZXJIYWxIaWRsKCkgewotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjppbml0KCkgewotICAgIHNwPElBbGxvY2F0b3I+IGFzaG1lbSA9IElBbGxvY2F0b3I6OmdldFNlcnZpY2UoImFzaG1lbSIpOwotICAgIGlmIChhc2htZW0gPT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGFzaG1lbSBhbGxvY2F0b3Igc2VydmljZSIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgc3RhdHVzX3QgcmV0dmFsID0gTk9fTUVNT1JZOwotICAgIFJldHVybjx2b2lkPiByZXN1bHQgPSBhc2htZW0tPmFsbG9jYXRlKAotICAgICAgICAgICAgbUJ1ZmZlclNpemUsCi0gICAgICAgICAgICBbJl0oYm9vbCBzdWNjZXNzLCBjb25zdCBoaWRsX21lbW9yeSYgbWVtb3J5KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgbUhpZGxCdWZmZXIuZGF0YSA9IG1lbW9yeTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gT0s7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJlc3VsdC5pc09rKCkgJiYgcmV0dmFsID09IE9LKSB7Ci0gICAgICAgIG1NZW1vcnkgPSBoYXJkd2FyZTo6bWFwTWVtb3J5KG1IaWRsQnVmZmVyLmRhdGEpOwotICAgICAgICBpZiAobU1lbW9yeSAhPSAwKSB7Ci0gICAgICAgICAgICBtTWVtb3J5LT51cGRhdGUoKTsKLSAgICAgICAgICAgIG1BdWRpb0J1ZmZlci5yYXcgPSBzdGF0aWNfY2FzdDx2b2lkKj4obU1lbW9yeS0+Z2V0UG9pbnRlcigpKTsKLSAgICAgICAgICAgIG1lbXNldChtQXVkaW9CdWZmZXIucmF3LCAwLCBtTWVtb3J5LT5nZXRTaXplKCkpOwotICAgICAgICAgICAgbU1lbW9yeS0+Y29tbWl0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG1hcCBhbGxvY2F0ZWQgYXNobWVtIik7Ci0gICAgICAgICAgICByZXR2YWwgPSBOT19NRU1PUlk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZyb20gYXNobWVtIiwgKGludCltQnVmZmVyU2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQuaXNPaygpID8gcmV0dmFsIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1hdWRpb19idWZmZXJfdCogRWZmZWN0QnVmZmVySGFsSGlkbDo6YXVkaW9CdWZmZXIoKSB7Ci0gICAgcmV0dXJuICZtQXVkaW9CdWZmZXI7Ci19Ci0KLXZvaWQqIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmV4dGVybmFsRGF0YSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUV4dGVybmFsRGF0YTsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KSB7Ci0gICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgbUF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwotICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IHRydWU7Ci19Ci0KLWJvb2wgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCkgewotICAgIGJvb2wgcmVzdWx0ID0gbUZyYW1lQ291bnRDaGFuZ2VkOwotICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IGZhbHNlOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6c2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKSB7Ci0gICAgbUV4dGVybmFsRGF0YSA9IGV4dGVybmFsOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZSgpIHsKLSAgICB1cGRhdGUobUJ1ZmZlclNpemUpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdCgpIHsKLSAgICBjb21taXQobUJ1ZmZlclNpemUpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZShzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKLSAgICBtTWVtb3J5LT51cGRhdGUoKTsKLSAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7Ci0gICAgbWVtY3B5KG1BdWRpb0J1ZmZlci5yYXcsIG1FeHRlcm5hbERhdGEsIHNpemUpOwotICAgIG1NZW1vcnktPmNvbW1pdCgpOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdChzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKLSAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7Ci0gICAgbWVtY3B5KG1FeHRlcm5hbERhdGEsIG1BdWRpb0J1ZmZlci5yYXcsIHNpemUpOwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ1NzhjNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF80XzBfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvNC4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+Ci0KLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpBdWRpb0J1ZmZlcjsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKLXVzaW5nIGFuZHJvaWQ6OmhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBFZmZlY3RCdWZmZXJIYWxIaWRsIDogcHVibGljIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgc3RhdGljIHN0YXR1c190IGFsbG9jYXRlKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBtaXJyb3Iodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpOwotCi0gICAgdmlydHVhbCBhdWRpb19idWZmZXJfdCogYXVkaW9CdWZmZXIoKTsKLSAgICB2aXJ0dWFsIHZvaWQqIGV4dGVybmFsRGF0YSgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1CdWZmZXJTaXplOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0RnJhbWVDb3VudChzaXplX3QgZnJhbWVDb3VudCk7Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRnJhbWVDb3VudENoYW5nZSgpOwotCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZSgpOwotICAgIHZpcnR1YWwgdm9pZCBjb21taXQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKHNpemVfdCBzaXplKTsKLSAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KHNpemVfdCBzaXplKTsKLQotICAgIGNvbnN0IEF1ZGlvQnVmZmVyJiBoaWRsQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUhpZGxCdWZmZXI7IH0KLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U7Ci0KLSAgICBzdGF0aWMgdWludDY0X3QgbWFrZVVuaXF1ZUlkKCk7Ci0KLSAgICBjb25zdCBzaXplX3QgbUJ1ZmZlclNpemU7Ci0gICAgYm9vbCBtRnJhbWVDb3VudENoYW5nZWQ7Ci0gICAgdm9pZCogbUV4dGVybmFsRGF0YTsKLSAgICBBdWRpb0J1ZmZlciBtSGlkbEJ1ZmZlcjsKLSAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OwotICAgIGF1ZGlvX2J1ZmZlcl90IG1BdWRpb0J1ZmZlcjsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemVfdCBzaXplKTsKLQotICAgIHZpcnR1YWwgfkVmZmVjdEJ1ZmZlckhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IGluaXQoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTljNGM4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJFZmZlY3RIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8Y29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uVXRpbHMuaD4KLSNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkF1ZGlvQnVmZmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6RWZmZWN0QnVmZmVyQWNjZXNzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6RWZmZWN0Q29uZmlnUGFyYW1ldGVyczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6Ok1lc3NhZ2VRdWV1ZUZsYWdCaXRzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6SGlkbFV0aWxzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9DaGFubmVsTWFzazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvRm9ybWF0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6dXRpbHM6Om1rRW51bUNvbnZlcnRlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1FZmZlY3RIYWxIaWRsOjpFZmZlY3RIYWxIaWRsKGNvbnN0IHNwPElFZmZlY3Q+JiBlZmZlY3QsIHVpbnQ2NF90IGVmZmVjdElkKQotICAgICAgICA6IG1FZmZlY3QoZWZmZWN0KSwgbUVmZmVjdElkKGVmZmVjdElkKSwgbUJ1ZmZlcnNDaGFuZ2VkKHRydWUpLCBtRWZHcm91cChudWxscHRyKSB7Ci19Ci0KLUVmZmVjdEhhbEhpZGw6On5FZmZlY3RIYWxIaWRsKCkgewotICAgIGlmIChtRWZmZWN0ICE9IDApIHsKLSAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgbUVmZmVjdC5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLSAgICBpZiAobUVmR3JvdXApIHsKLSAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwoCi0gICAgICAgIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIGhhbERlc2NyaXB0b3IpIHsKLSAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnR5cGUsICZoYWxEZXNjcmlwdG9yLT50eXBlKTsKLSAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnV1aWQsICZoYWxEZXNjcmlwdG9yLT51dWlkKTsKLSAgICBoYWxEZXNjcmlwdG9yLT5mbGFncyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkZXNjcmlwdG9yLmZsYWdzKTsKLSAgICBoYWxEZXNjcmlwdG9yLT5jcHVMb2FkID0gZGVzY3JpcHRvci5jcHVMb2FkOwotICAgIGhhbERlc2NyaXB0b3ItPm1lbW9yeVVzYWdlID0gZGVzY3JpcHRvci5tZW1vcnlVc2FnZTsKLSAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+bmFtZSwgZGVzY3JpcHRvci5uYW1lLmRhdGEoKSwgZGVzY3JpcHRvci5uYW1lLnNpemUoKSk7Ci0gICAgbWVtY3B5KGhhbERlc2NyaXB0b3ItPmltcGxlbWVudG9yLAotICAgICAgICAgICAgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5kYXRhKCksIGRlc2NyaXB0b3IuaW1wbGVtZW50b3Iuc2l6ZSgpKTsKLX0KLQotLy8gVE9ETyhtbmFnYW5vdik6IFRoZXNlIGJ1ZmZlciBjb252ZXJzaW9uIGZ1bmN0aW9ucyBzaG91bGQgYmUgc2hhcmVkIHdpdGggRWZmZWN0IHdyYXBwZXIKLS8vIHZpYSBIaWRsVXRpbHMuIE1vdmUgdGhlbSB0aGVyZSB3aGVuIGhhcmR3YXJlL2ludGVyZmFjZXMgd2lsbCBnZXQgdW4tZnJvemVuIGFnYWluLgotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKLSAgICAgICAgY29uc3QgYnVmZmVyX2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdEJ1ZmZlckNvbmZpZyogY29uZmlnKSB7Ci0gICAgY29uZmlnLT5zYW1wbGluZ1JhdGVIeiA9IGhhbENvbmZpZy5zYW1wbGluZ1JhdGU7Ci0gICAgY29uZmlnLT5jaGFubmVscyA9IG1rRW51bUNvbnZlcnRlcjxBdWRpb0NoYW5uZWxNYXNrPihoYWxDb25maWcuY2hhbm5lbHMpOwotICAgIGNvbmZpZy0+Zm9ybWF0ID0gQXVkaW9Gb3JtYXQoaGFsQ29uZmlnLmZvcm1hdCk7Ci0gICAgY29uZmlnLT5hY2Nlc3NNb2RlID0gRWZmZWN0QnVmZmVyQWNjZXNzKGhhbENvbmZpZy5hY2Nlc3NNb2RlKTsKLSAgICBjb25maWctPm1hc2sgPSBta0VudW1Db252ZXJ0ZXI8RWZmZWN0Q29uZmlnUGFyYW1ldGVycz4oaGFsQ29uZmlnLm1hc2spOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCi0gICAgICAgIGNvbnN0IEVmZmVjdEJ1ZmZlckNvbmZpZyYgY29uZmlnLCBidWZmZXJfY29uZmlnX3QqIGhhbENvbmZpZykgewotICAgIGhhbENvbmZpZy0+YnVmZmVyLmZyYW1lQ291bnQgPSAwOwotICAgIGhhbENvbmZpZy0+YnVmZmVyLnJhdyA9IE5VTEw7Ci0gICAgaGFsQ29uZmlnLT5zYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxpbmdSYXRlSHo7Ci0gICAgaGFsQ29uZmlnLT5jaGFubmVscyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb25maWcuY2hhbm5lbHMpOwotICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKLSAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKLSAgICBoYWxDb25maWctPmZvcm1hdCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5mb3JtYXQpOwotICAgIGhhbENvbmZpZy0+YWNjZXNzTW9kZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5hY2Nlc3NNb2RlKTsKLSAgICBoYWxDb25maWctPm1hc2sgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcubWFzayk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdGcm9tSGFsKGNvbnN0IGVmZmVjdF9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RDb25maWcqIGNvbmZpZykgewotICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoaGFsQ29uZmlnLmlucHV0Q2ZnLCAmY29uZmlnLT5pbnB1dENmZyk7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcub3V0cHV0Q2ZnLCAmY29uZmlnLT5vdXRwdXRDZmcpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0Q29uZmlnVG9IYWwoY29uc3QgRWZmZWN0Q29uZmlnJiBjb25maWcsIGVmZmVjdF9jb25maWdfdCogaGFsQ29uZmlnKSB7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoY29uZmlnLmlucHV0Q2ZnLCAmaGFsQ29uZmlnLT5pbnB1dENmZyk7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoY29uZmlnLm91dHB1dENmZywgJmhhbENvbmZpZy0+b3V0cHV0Q2ZnKTsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjphbmFseXplUmVzdWx0KGNvbnN0IFJlc3VsdCYgcmVzdWx0KSB7Ci0gICAgc3dpdGNoIChyZXN1bHQpIHsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUzogcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfU1RBVEU6IHJldHVybiBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6IHJldHVybiBOT19JTklUOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX1NVUFBPUlRFRDogcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICBjYXNlIFJlc3VsdDo6UkVTVUxUX1RPT19CSUc6IHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7Ci0gICAgaWYgKCFtQnVmZmVyc0NoYW5nZWQpIHsKLSAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBudWxscHRyIHx8IG1JbkJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbUluQnVmZmVyLmdldCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLT5hdWRpb0J1ZmZlcigpICE9IG1JbkJ1ZmZlci0+YXVkaW9CdWZmZXIoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtSW5CdWZmZXIgPSBidWZmZXI7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRPdXRCdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7Ci0gICAgaWYgKCFtQnVmZmVyc0NoYW5nZWQpIHsKLSAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBudWxscHRyIHx8IG1PdXRCdWZmZXIuZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLmdldCgpICE9IG1PdXRCdWZmZXIuZ2V0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbU91dEJ1ZmZlci0+YXVkaW9CdWZmZXIoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtT3V0QnVmZmVyID0gYnVmZmVyOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2VzcygpIHsKLSAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1MpKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2Vzc1JldmVyc2UoKSB7Ci0gICAgcmV0dXJuIHByb2Nlc3NJbXBsKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6UkVRVUVTVF9QUk9DRVNTX1JFVkVSU0UpKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJlcGFyZUZvclByb2Nlc3NpbmcoKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+cHJlcGFyZUZvclByb2Nlc3NpbmcoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1RRGVzY3JpcHRvclN5bmM8UmVzdWx0PiYgc3RhdHVzTVEpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSAmJiB0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcFN0YXR1c01RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotICAgIGlmICghdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fCAhbUVmR3JvdXApIHsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIGVmZmVjdHMiKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIGVmZmVjdHMgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciBlZmZlY3RzIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1ib29sIEVmZmVjdEhhbEhpZGw6Om5lZWRUb1Jlc2V0QnVmZmVycygpIHsKLSAgICBpZiAobUJ1ZmZlcnNDaGFuZ2VkKSByZXR1cm4gdHJ1ZTsKLSAgICBib29sIGluQnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgPSBtSW5CdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOwotICAgIGJvb2wgb3V0QnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgPSBtT3V0QnVmZmVyLT5jaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKLSAgICByZXR1cm4gaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCB8fCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2Vzc0ltcGwodWludDMyX3QgbXFGbGFnKSB7Ci0gICAgaWYgKG1FZmZlY3QgPT0gMCB8fCBtSW5CdWZmZXIgPT0gMCB8fCBtT3V0QnVmZmVyID09IDApIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAoIW1TdGF0dXNNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclByb2Nlc3NpbmcoKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgaWYgKG5lZWRUb1Jlc2V0QnVmZmVycygpICYmIChzdGF0dXMgPSBzZXRQcm9jZXNzQnVmZmVycygpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICAvLyBUaGUgZGF0YSBpcyBhbHJlYWR5IGluIHRoZSBidWZmZXJzLCBqdXN0IG5lZWQgdG8gZmx1c2ggaXQgYW5kIHdha2UgdXAgdGhlIHNlcnZlciBzaWRlLgotICAgIHN0ZDo6YXRvbWljX3RocmVhZF9mZW5jZShzdGQ6Om1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKLSAgICBtRWZHcm91cC0+d2FrZShtcUZsYWcpOwotICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOwotcmV0cnk6Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OkRPTkVfUFJPQ0VTU0lORyksICZlZlN0YXRlKTsKLSAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSkgewotICAgICAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgICAgIG1TdGF0dXNNUS0+cmVhZCgmcmV0dmFsKTsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LIHx8IHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfU1RBVEUpIHsKLSAgICAgICAgICAgIC8vIFN5bmMgYmFjayB0aGUgY2hhbmdlZCBjb250ZW50cyBvZiB0aGUgYnVmZmVyLgotICAgICAgICAgICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbmFseXplUmVzdWx0KHJldHZhbCk7Ci0gICAgfQotICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7Ci0gICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgotICAgICAgICBnb3RvIHJldHJ5OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRQcm9jZXNzQnVmZmVycygpIHsKLSAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5zZXRQcm9jZXNzQnVmZmVycygKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtSW5CdWZmZXIuZ2V0KCkpLT5oaWRsQnVmZmVyKCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4obU91dEJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSk7Ci0gICAgaWYgKHJldC5pc09rKCkgJiYgcmV0ID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmNvbW1hbmQodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCi0gICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLQotICAgIC8vIFNwZWNpYWwgY2FzZXMuCi0gICAgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0UpIHsKLSAgICAgICAgcmV0dXJuIHNldENvbmZpZ0ltcGwoY21kQ29kZSwgY21kU2l6ZSwgcENtZERhdGEsIHJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7Ci0gICAgfSBlbHNlIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRyB8fCBjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJR19SRVZFUlNFKSB7Ci0gICAgICAgIHJldHVybiBnZXRDb25maWdJbXBsKGNtZENvZGUsIHJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7Ci0gICAgfQotCi0gICAgLy8gQ29tbW9uIGNhc2UuCi0gICAgaGlkbF92ZWM8dWludDhfdD4gaGlkbERhdGE7Ci0gICAgaWYgKHBDbWREYXRhICE9IG51bGxwdHIgJiYgY21kU2l6ZSA+IDApIHsKLSAgICAgICAgaGlkbERhdGEuc2V0VG9FeHRlcm5hbChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwQ21kRGF0YSksIGNtZFNpemUpOwotICAgIH0KLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgdWludDMyX3QgcmVwbHlTaXplU3R1YiA9IDA7Ci0gICAgaWYgKHJlcGx5U2l6ZSA9PSBudWxscHRyIHx8IHBSZXBseURhdGEgPT0gbnVsbHB0cikgcmVwbHlTaXplID0gJnJlcGx5U2l6ZVN0dWI7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPmNvbW1hbmQoY21kQ29kZSwgaGlkbERhdGEsICpyZXBseVNpemUsCi0gICAgICAgICAgICBbJl0oaW50MzJfdCBzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCpyZXBseVNpemUgPiByZXN1bHQuc2l6ZSgpKSAqcmVwbHlTaXplID0gcmVzdWx0LnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgIT0gbnVsbHB0ciAmJiAqcmVwbHlTaXplID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsICZyZXN1bHRbMF0sICpyZXBseVNpemUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHJldC5pc09rKCkgPyBzdGF0dXMgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmdldERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPmdldERlc2NyaXB0b3IoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y2xvc2UoKSB7Ci0gICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gbUVmZmVjdC0+Y2xvc2UoKTsKLSAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0Q29uZmlnSW1wbCgKLSAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewotICAgIGlmIChyZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzdGF0dXNfdCByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgUmV0dXJuPHZvaWQ+IHJldDsKLSAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUcpIHsKLSAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnKFsmXSAoUmVzdWx0IHIsIGNvbnN0IEVmZmVjdENvbmZpZyAmaGlkbENvbmZpZykgewotICAgICAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyKTsKLSAgICAgICAgICAgIGlmIChyID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICBlZmZlY3RDb25maWdUb0hhbChoaWRsQ29uZmlnLCBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwUmVwbHlEYXRhKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldCA9IG1FZmZlY3QtPmdldENvbmZpZ1JldmVyc2UoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOwotICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldENvbmZpZ0ltcGwoCi0gICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7Ci0gICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fAotICAgICAgICAgICAgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGNvbnN0IGVmZmVjdF9jb25maWdfdCAqaGFsQ29uZmlnID0gc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocENtZERhdGEpOwotICAgIGlmIChoYWxDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAhPSBOVUxMIHx8Ci0gICAgICAgICAgICBoYWxDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgIT0gTlVMTCB8fAotICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKLSAgICAgICAgICAgIGhhbENvbmZpZy0+b3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiQnVmZmVyIHByb3ZpZGVyIGNhbGxiYWNrcyBhcmUgbm90IHN1cHBvcnRlZCIpOwotICAgIH0KLSAgICBFZmZlY3RDb25maWcgaGlkbENvbmZpZzsKLSAgICBlZmZlY3RDb25maWdGcm9tSGFsKCpoYWxDb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJRyA/Ci0gICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWcoaGlkbENvbmZpZywgbnVsbHB0ciwgbnVsbHB0cikgOgotICAgICAgICAgICAgbUVmZmVjdC0+c2V0Q29uZmlnUmV2ZXJzZShoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyZXQpOwotICAgICAgICAqc3RhdGljX2Nhc3Q8aW50MzJfdCo+KHBSZXBseURhdGEpID0gcmVzdWx0OwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE0ZGFiMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMXzRfMF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvSUVmZmVjdC5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KLSNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3RCdWZmZXJDb25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3RDb25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpFZmZlY3REZXNjcmlwdG9yOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6SUVmZmVjdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBFZmZlY3RIYWxIaWRsIDogcHVibGljIEVmZmVjdEhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gU2V0IHRoZSBpbnB1dCBidWZmZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpOwotCi0gICAgLy8gU2V0IHRoZSBvdXRwdXQgYnVmZmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7Ci0KLSAgICAvLyBFZmZlY3QgcHJvY2VzcyBmdW5jdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3MoKTsKLQotICAgIC8vIFByb2Nlc3MgcmV2ZXJzZSBzdHJlYW0gZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwYXNzCi0gICAgLy8gYSByZWZlcmVuY2Ugc3RyZWFtIHRvIHRoZSBlZmZlY3QgZW5naW5lLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc1JldmVyc2UoKTsKLQotICAgIC8vIFNlbmQgYSBjb21tYW5kIGFuZCByZWNlaXZlIGEgcmVzcG9uc2UgdG8vZnJvbSBlZmZlY3QgZW5naW5lLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOwotCi0gICAgLy8gUmV0dXJucyB0aGUgZWZmZWN0IGRlc2NyaXB0b3IuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKLQotICAgIC8vIEZyZWUgcmVzb3VyY2VzIG9uIHRoZSByZW1vdGUgc2lkZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7Ci0KLSAgICAvLyBXaGV0aGVyIGl0J3MgYSBsb2NhbCBpbXBsZW1lbnRhdGlvbi4KLSAgICB2aXJ0dWFsIGJvb2wgaXNMb2NhbCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICB1aW50NjRfdCBlZmZlY3RJZCgpIGNvbnN0IHsgcmV0dXJuIG1FZmZlY3RJZDsgfQotCi0gICAgc3RhdGljIHZvaWQgZWZmZWN0RGVzY3JpcHRvclRvSGFsKAotICAgICAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcik7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPAotICAgICAgICBoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6UmVzdWx0LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7Ci0KLSAgICBzcDxJRWZmZWN0PiBtRWZmZWN0OwotICAgIGNvbnN0IHVpbnQ2NF90IG1FZmZlY3RJZDsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1JbkJ1ZmZlcjsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1PdXRCdWZmZXI7Ci0gICAgYm9vbCBtQnVmZmVyc0NoYW5nZWQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7Ci0gICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpSZXN1bHQmIHJlc3VsdCk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKLSAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCi0gICAgICAgICAgICBjb25zdCBFZmZlY3RCdWZmZXJDb25maWcmIGNvbmZpZywgYnVmZmVyX2NvbmZpZ190KiBoYWxDb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIEVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSByZWxlYXNlcyB0aGUgZWZmZWN0LgotICAgIHZpcnR1YWwgfkVmZmVjdEhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IGdldENvbmZpZ0ltcGwodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvclByb2Nlc3NpbmcoKTsKLSAgICBib29sIG5lZWRUb1Jlc2V0QnVmZmVycygpOwotICAgIHN0YXR1c190IHByb2Nlc3NJbXBsKHVpbnQzMl90IG1xRmxhZyk7Ci0gICAgc3RhdHVzX3Qgc2V0Q29uZmlnSW1wbCgKLSAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0gICAgc3RhdHVzX3Qgc2V0UHJvY2Vzc0J1ZmZlcnMoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmVkNzg0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+Ci0jaW5jbHVkZSA8bGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpIaWRsVXRpbHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpVdWlkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6SUVmZmVjdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1FZmZlY3RzRmFjdG9yeUhhbEhpZGw6OkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkVmZmVjdHNGYWN0b3J5IikgewotICAgIG1FZmZlY3RzRmFjdG9yeSA9IElFZmZlY3RzRmFjdG9yeTo6Z2V0U2VydmljZSgpOwotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRWZmZWN0c0ZhY3Rvcnkgc2VydmljZSwgdGVybWluYXRpbmcgcHJvY2Vzcy4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci19Ci0KLUVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6fkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpIHsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeUFsbERlc2NyaXB0b3JzKCkgewotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldEFsbERlc2NyaXB0b3JzKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3REZXNjcmlwdG9ycyA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICByZXR1cm4gcmV0dmFsID09IFJlc3VsdDo6T0sgPyBPSyA6IE5PX0lOSVQ7Ci0gICAgfQotICAgIG1MYXN0RGVzY3JpcHRvcnMucmVzaXplKDApOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKSB7Ci0gICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Ci0gICAgaWYgKHF1ZXJ5UmVzdWx0ID09IE9LKSB7Ci0gICAgICAgICpwTnVtRWZmZWN0cyA9IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpOwotICAgIH0KLSAgICByZXR1cm4gcXVlcnlSZXN1bHQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgdWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0gICAgLy8gVE9ETzogV2UgbmVlZCBzb21laG93IHRvIHRyYWNrIHRoZSBjaGFuZ2VzIG9uIHRoZSBzZXJ2ZXIgc2lkZQotICAgIC8vIG9yIGZpZ3VyZSBvdXQgaG93IHRvIGNvbnZlcnQgZXZlcnlib2R5IHRvIHF1ZXJ5IGFsbCB0aGUgZGVzY3JpcHRvcnMgYXQgb25jZS4KLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgbnVsbHB0cgotICAgIGlmIChtTGFzdERlc2NyaXB0b3JzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHN0YXR1c190IHF1ZXJ5UmVzdWx0ID0gcXVlcnlBbGxEZXNjcmlwdG9ycygpOwotICAgICAgICBpZiAocXVlcnlSZXN1bHQgIT0gT0spIHJldHVybiBxdWVyeVJlc3VsdDsKLSAgICB9Ci0gICAgaWYgKGluZGV4ID49IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKG1MYXN0RGVzY3JpcHRvcnNbaW5kZXhdLCBwRGVzY3JpcHRvcik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmdldERlc2NyaXB0b3IoCi0gICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCi0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBVdWlkIGhpZGxVdWlkOwotICAgIEhpZGxVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5nZXREZXNjcmlwdG9yKGhpZGxVdWlkLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7Ci0gICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpjcmVhdGVFZmZlY3QoCi0gICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAotICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpIHsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFV1aWQgaGlkbFV1aWQ7Ci0gICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmNyZWF0ZUVmZmVjdCgKLSAgICAgICAgICAgIGhpZGxVdWlkLCBzZXNzaW9uSWQsIGlvSWQsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElFZmZlY3Q+JiByZXN1bHQsIHVpbnQ2NF90IGVmZmVjdElkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmVmZmVjdCA9IG5ldyBFZmZlY3RIYWxIaWRsKHJlc3VsdCwgZWZmZWN0SWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOwotICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6ZHVtcEVmZmVjdHMoaW50IGZkKSB7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKLSAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6YWxsb2NhdGUoc2l6ZSwgYnVmZmVyKTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjptaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKLSAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKGV4dGVybmFsLCBzaXplLCBidWZmZXIpOwotfQotCi0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEyZjVmNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lTdHJlYW1PdXRDYWxsYmFjay5oPgotI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKLSNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCi0jaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvQ2hhbm5lbE1hc2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0NvbnRlbnRUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Gb3JtYXQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb1NvdXJjZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvVXNhZ2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpUaHJlYWRJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OkF1ZGlvRHJhaW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbU91dENhbGxiYWNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6Ok1lc3NhZ2VRdWV1ZUZsYWdCaXRzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6Ok1pY3JvcGhvbmVJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6Ok1tYXBCdWZmZXJJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6Ok1tYXBQb3NpdGlvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpQbGF5YmFja1RyYWNrTWV0YWRhdGE7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVjb3JkVHJhY2tNZXRhZGF0YTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6VGltZVNwZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIFJlYWRDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1Jbjo6UmVhZENvbW1hbmQ7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotU3RyZWFtSGFsSGlkbDo6U3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pCi0gICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIlN0cmVhbSIpLAotICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSwKLSAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHkoSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSwKLSAgICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSgwKXsKLQotICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KLSAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgewotICAgICAgICAvLyBPYnRhaW4gYXVkaW8gcHJvcGVydGllcyAoc2VlIFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygpIGJlbG93KS4KLSAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICBbJl0oYXV0byBzciwgYXV0byBtLCBhdXRvIGYpIHsKLSAgICAgICAgICAgICAgICBtU3RyZWFtUG93ZXJMb2cuaW5pdChzciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihmKSk7Ci0gICAgICAgICAgICB9KTsKLSAgICB9Ci19Ci0KLVN0cmVhbUhhbEhpZGw6On5TdHJlYW1IYWxIaWRsKCkgewotICAgIG1TdHJlYW0gPSBudWxscHRyOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0U2FtcGxlUmF0ZSIsIG1TdHJlYW0tPmdldFNhbXBsZVJhdGUoKSwgcmF0ZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm9jZXNzUmV0dXJuKCJnZXRCdWZmZXJTaXplIiwgbVN0cmVhbS0+Z2V0QnVmZmVyU2l6ZSgpLCBzaXplKTsKLSAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgIG1DYWNoZWRCdWZmZXJTaXplID0gKnNpemU7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2hhbm5lbE1hc2siLCBtU3RyZWFtLT5nZXRDaGFubmVsTWFzaygpLCBtYXNrKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGb3JtYXQiLCBtU3RyZWFtLT5nZXRGb3JtYXQoKSwgZm9ybWF0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICBbJl0odWludDMyX3Qgc3IsIGF1dG8gbSwgYXV0byBmKSB7Ci0gICAgICAgICAgICAgICAgKnNhbXBsZVJhdGUgPSBzcjsKLSAgICAgICAgICAgICAgICAqbWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKTsKLSAgICAgICAgICAgICAgICAqZm9ybWF0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUHJvcGVydGllcyIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGhpZGxQYXJhbXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1ldGVyc0Zyb21IYWwoa3ZQYWlycywgJmhpZGxQYXJhbXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzOjpzZXRQYXJhbWV0ZXJzKG1TdHJlYW0sIGhpZGxQYXJhbXMsIHt9IC8qIG9wdGlvbnMgKi8pKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gaGlkbEtleXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0ga2V5c0Zyb21IYWwoa2V5cywgJmhpZGxLZXlzKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IHV0aWxzOjpnZXRQYXJhbWV0ZXJzKAotICAgICAgICAgICAgbVN0cmVhbSwKLSAgICAgICAgICAgIHt9IC8qIGNvbnRleHQgKi8sCi0gICAgICAgICAgICBoaWRsS2V5cywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1RvSGFsKHBhcmFtZXRlcnMsIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFBhcmFtZXRlcnMiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImFkZEVmZmVjdCIsIG1TdHJlYW0tPmFkZEVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVtb3ZlRWZmZWN0IiwgbVN0cmVhbS0+cmVtb3ZlRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdGFuZGJ5KCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YW5kYnkiLCBtU3RyZWFtLT5zdGFuZGJ5KCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpkdW1wKGludCBmZCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdGFydCgpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdGFydCIsIG1TdHJlYW0tPnN0YXJ0KCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdG9wKCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0b3AiLCBtU3RyZWFtLT5zdG9wKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgewotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmNyZWF0ZU1tYXBCdWZmZXIoCi0gICAgICAgICAgICBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNbWFwQnVmZmVySW5mbyYgaGlkbEluZm8pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlICpoYW5kbGUgPSBoaWRsSW5mby5zaGFyZWRNZW1vcnkuaGFuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUtPm51bUZkcyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNoYXJlZF9tZW1vcnlfZmQgPSBoYW5kbGUtPmRhdGFbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyA9IGF1ZGlvX21tYXBfYnVmZmVyX2ZsYWcoaGlkbEluZm8uZmxhZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVmZmVyU2l6ZUZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlIGJ1ZmZlciBzaXplIGZyYW1lIHdhcyBhIGhhY2sgaW4gTyBhbmQgUCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgdGhhdCB0aGUgYnVmZmVyIGlzIHNoYXJlYWJsZSB0byBhcHBsaWNhdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzICo9IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzID0gYXVkaW9fbW1hcF9idWZmZXJfZmxhZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzIHwgQVVESU9fTU1BUF9BUFBMSUNBVElPTl9TSEFSRUFCTEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+YnVyc3Rfc2l6ZV9mcmFtZXMgPSBoaWRsSW5mby5idXJzdFNpemVGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgaXMgbm90IG5lZWRlZCBpbiBISURMIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNoYXJlZF9tZW1vcnlfYWRkcmVzcyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJjcmVhdGVNbWFwQnVmZmVyIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0TW1hcFBvc2l0aW9uKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNbWFwUG9zaXRpb24mIGhpZGxQb3NpdGlvbikgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT50aW1lX25hbm9zZWNvbmRzID0gaGlkbFBvc2l0aW9uLnRpbWVOYW5vc2Vjb25kczsKLSAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24tPnBvc2l0aW9uX2ZyYW1lcyA9IGhpZGxQb3NpdGlvbi5wb3NpdGlvbkZyYW1lczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TW1hcFBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpIHsKLSAgICBtSGFsVGhyZWFkUHJpb3JpdHkgPSBwcmlvcml0eTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1DYWNoZWRCdWZmZXJTaXplICE9IDApIHsKLSAgICAgICAgKnNpemUgPSBtQ2FjaGVkQnVmZmVyU2l6ZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICByZXR1cm4gZ2V0QnVmZmVyU2l6ZShzaXplKTsKLX0KLQotYm9vbCBTdHJlYW1IYWxIaWRsOjpyZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCkgewotICAgIGlmIChtSGFsVGhyZWFkUHJpb3JpdHkgPT0gSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpbnQgZXJyID0gcmVxdWVzdFByaW9yaXR5KAotICAgICAgICAgICAgdGhyZWFkUGlkLCB0aHJlYWRJZCwKLSAgICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eSwgZmFsc2UgLyppc0ZvckFwcCovLCB0cnVlIC8qYXN5bmNocm9ub3VzKi8pOwotICAgIEFMT0dFX0lGKGVyciwgImZhaWxlZCB0byBzZXQgcHJpb3JpdHkgJWQgZm9yIHBpZCAlZCB0aWQgJWQ7IGVycm9yICVkIiwKLSAgICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eSwgdGhyZWFkUGlkLCB0aHJlYWRJZCwgZXJyKTsKLSAgICAvLyBBdWRpbyB3aWxsIHN0aWxsIHdvcmssIGJ1dCBsYXRlbmN5IHdpbGwgYmUgaGlnaGVyIGFuZCBzb21ldGltZXMgdW5hY2NlcHRhYmxlLgotICAgIHJldHVybiBlcnIgPT0gMDsKLX0KLQotbmFtZXNwYWNlIHsKLQotLyogTm90ZXMgb24gY2FsbGJhY2sgb3duZXJzaGlwLgotCi1UaGlzIGlzIGhvdyAoSHcpQmluZGVyIG93bmVyc2hpcCBtb2RlbCBsb29rcyBsaWtlLiBUaGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi1pcyBvd25lZCBieSBCaW5kZXIgZnJhbWV3b3JrICh2aWEgc3A8PikuIFByb3hpZXMgYXJlIG93bmVkIGJ5IGNsaWVudHMuCi1XaGVuIHRoZSBsYXN0IHByb3h5IGRpc2FwcGVhcnMsIEJpbmRlciBmcmFtZXdvcmsgcmVsZWFzZXMgdGhlIHNlcnZlciBpbXBsLgotCi1UaHVzLCBpdCBpcyBub3QgbmVlZGVkIHRvIGtlZXAgYW55IHJlZmVyZW5jZXMgdG8gU3RyZWFtT3V0Q2FsbGJhY2sgKHRoaXMgaXMKLXRoZSBzZXJ2ZXIgaW1wbCkgLS0gaXQgd2lsbCBsaXZlIGFzIGxvbmcgYXMgSEFMIHNlcnZlciBob2xkcyBhIHN0cm9uZyByZWYgdG8KLUlTdHJlYW1PdXRDYWxsYmFjayBwcm94eS4gV2UgY2xlYXIgdGhhdCByZWZlcmVuY2UgYnkgY2FsbGluZyAnY2xlYXJDYWxsYmFjaycKLWZyb20gdGhlIGRlc3RydWN0b3Igb2YgU3RyZWFtT3V0SGFsSGlkbC4KLQotVGhlIGNhbGxiYWNrIG9ubHkga2VlcHMgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIG93bmVkCi1ieSBBdWRpb0ZsaW5nZXIuCi0KLSovCi0KLXN0cnVjdCBTdHJlYW1PdXRDYWxsYmFjayA6IHB1YmxpYyBJU3RyZWFtT3V0Q2FsbGJhY2sgewotICAgIFN0cmVhbU91dENhbGxiYWNrKGNvbnN0IHdwPFN0cmVhbU91dEhhbEhpZGw+JiBzdHJlYW0pIDogbVN0cmVhbShzdHJlYW0pIHt9Ci0KLSAgICAvLyBJU3RyZWFtT3V0Q2FsbGJhY2sgaW1wbGVtZW50YXRpb24KLSAgICBSZXR1cm48dm9pZD4gb25Xcml0ZVJlYWR5KCkgIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChzdHJlYW0gIT0gMCkgewotICAgICAgICAgICAgc3RyZWFtLT5vbldyaXRlUmVhZHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBvbkRyYWluUmVhZHkoKSAgb3ZlcnJpZGUgewotICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7Ci0gICAgICAgICAgICBzdHJlYW0tPm9uRHJhaW5SZWFkeSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IG9uRXJyb3IoKSAgb3ZlcnJpZGUgewotICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7Ci0gICAgICAgICAgICBzdHJlYW0tPm9uRXJyb3IoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIHdwPFN0cmVhbU91dEhhbEhpZGw+IG1TdHJlYW07Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotU3RyZWFtT3V0SGFsSGlkbDo6U3RyZWFtT3V0SGFsSGlkbChjb25zdCBzcDxJU3RyZWFtT3V0PiYgc3RyZWFtKQotICAgICAgICA6IFN0cmVhbUhhbEhpZGwoc3RyZWFtLmdldCgpKSwgbVN0cmVhbShzdHJlYW0pLCBtV3JpdGVyQ2xpZW50KDApLCBtRWZHcm91cChudWxscHRyKSB7Ci19Ci0KLVN0cmVhbU91dEhhbEhpZGw6On5TdHJlYW1PdXRIYWxIaWRsKCkgewotICAgIGlmIChtU3RyZWFtICE9IDApIHsKLSAgICAgICAgaWYgKG1DYWxsYmFjay51bnNhZmVfZ2V0KCkpIHsKLSAgICAgICAgICAgIHByb2Nlc3NSZXR1cm4oImNsZWFyQ2FsbGJhY2siLCBtU3RyZWFtLT5jbGVhckNhbGxiYWNrKCkpOwotICAgICAgICB9Ci0gICAgICAgIHByb2Nlc3NSZXR1cm4oImNsb3NlIiwgbVN0cmVhbS0+Y2xvc2UoKSk7Ci0gICAgICAgIG1TdHJlYW0uY2xlYXIoKTsKLSAgICB9Ci0gICAgbUNhbGxiYWNrLmNsZWFyKCk7Ci0gICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICBpZiAobUVmR3JvdXApIHsKLSAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0RnJhbWVTaXplIiwgbVN0cmVhbS0+Z2V0RnJhbWVTaXplKCksIHNpemUpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1Xcml0ZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgewotICAgICAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OkdFVF9MQVRFTkNZLCAiZ2V0TGF0ZW5jeSIsIG51bGxwdHIsIDAsCi0gICAgICAgICAgICAgICAgWyZdKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAqbGF0ZW5jeSA9IHdyaXRlU3RhdHVzLnJlcGx5LmxhdGVuY3lNczsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TGF0ZW5jeSIsIG1TdHJlYW0tPmdldExhdGVuY3koKSwgbGF0ZW5jeSk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9sdW1lIiwgbVN0cmVhbS0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICAqd3JpdHRlbiA9IDA7Ci0KLSAgICBpZiAoYnl0ZXMgPT0gMCAmJiAhbURhdGFNUSkgewotICAgICAgICAvLyBDYW4ndCBkZXRlcm1pbmUgdGhlIHNpemUgZm9yIHRoZSBNUSBidWZmZXIuIFdhaXQgZm9yIGEgbm9uLWVtcHR5IHdyaXRlIHJlcXVlc3QuCi0gICAgICAgIEFMT0dXX0lGKG1DYWxsYmFjay51bnNhZmVfZ2V0KCksICJGaXJzdCBjYWxsIHRvIGFzeW5jIHdyaXRlIHdpdGggMCBieXRlcyIpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmICghbURhdGFNUSkgewotICAgICAgICAvLyBJbiBjYXNlIGlmIHBsYXliYWNrIHN0YXJ0cyBjbG9zZSB0byB0aGUgZW5kIG9mIGEgY29tcHJlc3NlZCB0cmFjaywgdGhlIGJ5dGVzCi0gICAgICAgIC8vIHRoYXQgbmVlZCB0byBiZSB3cml0dGVuIGlzIGxlc3MgdGhhbiB0aGUgYWN0dWFsIGJ1ZmZlciBzaXplLiBOZWVkIHRvIHVzZQotICAgICAgICAvLyBmdWxsIGJ1ZmZlciBzaXplIGZvciB0aGUgTVEgc2luY2Ugb3RoZXJ3aXNlIGFmdGVyIHNlZWtpbmcgYmFjayB0byB0aGUgbWlkZGxlCi0gICAgICAgIC8vIGRhdGEgd2lsbCBiZSB0cnVuY2F0ZWQuCi0gICAgICAgIHNpemVfdCBidWZmZXJTaXplOwotICAgICAgICBpZiAoKHN0YXR1cyA9IGdldENhY2hlZEJ1ZmZlclNpemUoJmJ1ZmZlclNpemUpKSAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnl0ZXMgPiBidWZmZXJTaXplKSBidWZmZXJTaXplID0gYnl0ZXM7Ci0gICAgICAgIGlmICgoc3RhdHVzID0gcHJlcGFyZUZvcldyaXRpbmcoYnVmZmVyU2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdHVzID0gY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6V1JJVEUsICJ3cml0ZSIsIHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIpLCBieXRlcywKLSAgICAgICAgICAgIFsmXSAoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVN0YXR1cy5yZXBseS53cml0dGVuOwotICAgICAgICAgICAgICAgIC8vIERpYWdub3N0aWNzIG9mIHRoZSBjYXVzZSBvZiBiLzM1ODEzMTEzLgotICAgICAgICAgICAgICAgIEFMT0dFX0lGKCp3cml0dGVuID4gYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAiaGFsIHJlcG9ydHMgbW9yZSBieXRlcyB3cml0dGVuIHRoYW4gYXNrZWQgZm9yOiAlbGxkID4gJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSp3cml0dGVuLCAobG9uZyBsb25nKWJ5dGVzKTsKLSAgICAgICAgICAgIH0pOwotICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Y2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKLSAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFTaXplLCBTdHJlYW1PdXRIYWxIaWRsOjpXcml0ZXJDYWxsYmFjayBjYWxsYmFjaykgewotICAgIGlmICghbUNvbW1hbmRNUS0+d3JpdGUoJmNtZCkpIHsKLSAgICAgICAgQUxPR0UoImNvbW1hbmQgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0gICAgaWYgKGRhdGEgIT0gbnVsbHB0cikgewotICAgICAgICBzaXplX3QgYXZhaWxhYmxlVG9Xcml0ZSA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvV3JpdGUoKTsKLSAgICAgICAgaWYgKGRhdGFTaXplID4gYXZhaWxhYmxlVG9Xcml0ZSkgewotICAgICAgICAgICAgQUxPR1coInRydW5jYXRpbmcgd3JpdGUgZGF0YSBmcm9tICVsbGQgdG8gJWxsZCBkdWUgdG8gaW5zdWZmaWNpZW50IGRhdGEgcXVldWUgc3BhY2UiLAotICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWRhdGFTaXplLCAobG9uZyBsb25nKWF2YWlsYWJsZVRvV3JpdGUpOwotICAgICAgICAgICAgZGF0YVNpemUgPSBhdmFpbGFibGVUb1dyaXRlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbURhdGFNUS0+d3JpdGUoZGF0YSwgZGF0YVNpemUpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZGF0YSBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbUVmR3JvdXAtPndha2Uoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpKTsKLQotICAgIC8vIFRPRE86IFJlbW92ZSBtYW51YWwgZXZlbnQgZmxhZyBoYW5kbGluZyBvbmNlIGJsb2NraW5nIE1RIGlzIGltcGxlbWVudGVkLiBiLzMzODE1NDIyCi0gICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7Ci1yZXRyeToKLSAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCkpIHsKLSAgICAgICAgV3JpdGVTdGF0dXMgd3JpdGVTdGF0dXM7Ci0gICAgICAgIHdyaXRlU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmd3JpdGVTdGF0dXMpKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhdHVzIG1lc3NhZ2UgcmVhZCBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3cml0ZVN0YXR1cy5yZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgcmV0ID0gT0s7Ci0gICAgICAgICAgICBjYWxsYmFjayh3cml0ZVN0YXR1cyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBwcm9jZXNzUmV0dXJuKGNtZE5hbWUsIHdyaXRlU3RhdHVzLnJldHZhbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKLSAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gdGVtcENvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiB0ZW1wRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgcGlkX3QgaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnByZXBhcmVGb3JXcml0aW5nKAotICAgICAgICAgICAgMSwgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE1ROjpEZXNjcmlwdG9yJiBjb21tYW5kTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFNUTo6RGVzY3JpcHRvciYgZGF0YU1RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNNUTo6RGVzY3JpcHRvciYgc3RhdHVzTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEluZm8mIGhhbFRocmVhZEluZm8pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wQ29tbWFuZE1RLnJlc2V0KG5ldyBDb21tYW5kTVEoY29tbWFuZE1RKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhTVEucmVzZXQobmV3IERhdGFNUShkYXRhTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOwotICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInByZXBhcmVGb3JXcml0aW5nIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLSAgICBpZiAoIXRlbXBDb21tYW5kTVEgfHwgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBEYXRhTVEgfHwgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcENvbW1hbmRNUSwgIkZhaWxlZCB0byBvYnRhaW4gY29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBDb21tYW5kTVEgJiYgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiQ29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBEYXRhTVEsICJGYWlsZWQgdG8gb2J0YWluIGRhdGEgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wRGF0YU1RICYmICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCksICJEYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIHdyaXRpbmcgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkoaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQpOwotCi0gICAgbUNvbW1hbmRNUSA9IHN0ZDo6bW92ZSh0ZW1wQ29tbWFuZE1RKTsKLSAgICBtRGF0YU1RID0gc3RkOjptb3ZlKHRlbXBEYXRhTVEpOwotICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOwotICAgIG1Xcml0ZXJDbGllbnQgPSBnZXR0aWQoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRSZW5kZXJQb3NpdGlvbigKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDMyX3QgZCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkc3BGcmFtZXMgPSBkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZW5kZXJQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE5leHRXcml0ZVRpbWVzdGFtcCgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaW50NjRfdCB0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnRpbWVzdGFtcCA9IHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFJlbmRlclBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm9jZXNzUmV0dXJuKAotICAgICAgICAgICAgInNldENhbGxiYWNrIiwgbVN0cmVhbS0+c2V0Q2FsbGJhY2sobmV3IFN0cmVhbU91dENhbGxiYWNrKHRoaXMpKSk7Ci0gICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5zdXBwb3J0c1BhdXNlQW5kUmVzdW1lKAotICAgICAgICAgICAgWyZdKGJvb2wgcCwgYm9vbCByKSB7Ci0gICAgICAgICAgICAgICAgKnN1cHBvcnRzUGF1c2UgPSBwOwotICAgICAgICAgICAgICAgICpzdXBwb3J0c1Jlc3VtZSA9IHI7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNQYXVzZUFuZFJlc3VtZSIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnBhdXNlKCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPnBhdXNlKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpyZXN1bWUoKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cmVzdW1lKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNEcmFpbiIsIG1TdHJlYW0tPnN1cHBvcnRzRHJhaW4oKSwgc3VwcG9ydHNEcmFpbik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigKLSAgICAgICAgICAgICJkcmFpbiIsIG1TdHJlYW0tPmRyYWluKGVhcmx5Tm90aWZ5ID8gQXVkaW9EcmFpbjo6RUFSTFlfTk9USUZZIDogQXVkaW9EcmFpbjo6QUxMKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmZsdXNoKCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPmZsdXNoKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfUFJFU0VOVEFUSU9OX1BPU0lUSU9OLCAiZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24iLCBudWxscHRyLCAwLAotICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLmZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9zZWMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi50aW1lU3RhbXAudHZTZWM7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLnRpbWVTdGFtcC50dk5TZWM7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgUmVzdWx0IHJldHZhbDsKLSAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFByZXNlbnRhdGlvblBvc2l0aW9uKAotICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgaGlkbEZyYW1lcywgY29uc3QgVGltZVNwZWMmIGhpZGxUaW1lU3RhbXApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gaGlkbEZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfc2VjID0gaGlkbFRpbWVTdGFtcC50dlNlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IGhpZGxUaW1lU3RhbXAudHZOU2VjOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLSAgICB9Ci19Ci0KLS8qKiBUcmFuc2Zvcm0gYSBzdGFuZGFyZCBjb2xsZWN0aW9uIHRvIGFuIEhJREwgdmVjdG9yLiAqLwotdGVtcGxhdGUgPGNsYXNzIFZhbHVlcywgY2xhc3MgRWxlbWVudENvbnZlcnRlcj4KLXN0YXRpYyBhdXRvIHRyYW5zZm9ybVRvSGlkbFZlYyhjb25zdCBWYWx1ZXMmIHZhbHVlcywgRWxlbWVudENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLSAgICBoaWRsX3ZlYzxkZWNsdHlwZShjb252ZXJ0ZXIoKnZhbHVlcy5iZWdpbigpKSk+IHJlc3VsdHt2YWx1ZXMuc2l6ZSgpfTsKLSAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwotICAgIHRyYW5zZm9ybShiZWdpbih2YWx1ZXMpLCBlbmQodmFsdWVzKSwgYmVnaW4ocmVzdWx0KSwgY29udmVydGVyKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKLSAgICBoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlNvdXJjZU1ldGFkYXRhIGhhbE1ldGFkYXRhID0gewotICAgICAgICAudHJhY2tzID0gdHJhbnNmb3JtVG9IaWRsVmVjKHNvdXJjZU1ldGFkYXRhLnRyYWNrcywKLSAgICAgICAgICAgICAgW10oY29uc3QgcGxheWJhY2tfdHJhY2tfbWV0YWRhdGEmIG1ldGFkYXRhKSAtPiBQbGF5YmFja1RyYWNrTWV0YWRhdGEgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKLSAgICAgICAgICAgICAgICAgICAgLnVzYWdlPXN0YXRpY19jYXN0PEF1ZGlvVXNhZ2U+KG1ldGFkYXRhLnVzYWdlKSwKLSAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRUeXBlPXN0YXRpY19jYXN0PEF1ZGlvQ29udGVudFR5cGU+KG1ldGFkYXRhLmNvbnRlbnRfdHlwZSksCi0gICAgICAgICAgICAgICAgICAgIC5nYWluPW1ldGFkYXRhLmdhaW4sCi0gICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICB9KX07Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInVwZGF0ZVNvdXJjZU1ldGFkYXRhIiwgbVN0cmVhbS0+dXBkYXRlU291cmNlTWV0YWRhdGEoaGFsTWV0YWRhdGEpKTsKLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbldyaXRlUmVhZHkoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uV3JpdGVSZWFkeSIpOwotICAgIGNhbGxiYWNrLT5vbldyaXRlUmVhZHkoKTsKLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbkRyYWluUmVhZHkoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRHJhaW5SZWFkeSIpOwotICAgIGNhbGxiYWNrLT5vbkRyYWluUmVhZHkoKTsKLX0KLQotdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbkVycm9yKCkgewotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKLSAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbkVycm9yIik7Ci0gICAgY2FsbGJhY2stPm9uRXJyb3IoKTsKLX0KLQotCi1TdHJlYW1JbkhhbEhpZGw6OlN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pCi0gICAgICAgIDogU3RyZWFtSGFsSGlkbChzdHJlYW0uZ2V0KCkpLCBtU3RyZWFtKHN0cmVhbSksIG1SZWFkZXJDbGllbnQoMCksIG1FZkdyb3VwKG51bGxwdHIpIHsKLX0KLQotU3RyZWFtSW5IYWxIaWRsOjp+U3RyZWFtSW5IYWxIaWRsKCkgewotICAgIGlmIChtU3RyZWFtICE9IDApIHsKLSAgICAgICAgcHJvY2Vzc1JldHVybigiY2xvc2UiLCBtU3RyZWFtLT5jbG9zZSgpKTsKLSAgICAgICAgbVN0cmVhbS5jbGVhcigpOwotICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIH0KLSAgICBpZiAobUVmR3JvdXApIHsKLSAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGcmFtZVNpemUiLCBtU3RyZWFtLT5nZXRGcmFtZVNpemUoKSwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0R2FpbihmbG9hdCBnYWluKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldEdhaW4iLCBtU3RyZWFtLT5zZXRHYWluKGdhaW4pKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICAqcmVhZCA9IDA7Ci0KLSAgICBpZiAoYnl0ZXMgPT0gMCAmJiAhbURhdGFNUSkgewotICAgICAgICAvLyBDYW4ndCBkZXRlcm1pbmUgdGhlIHNpemUgZm9yIHRoZSBNUSBidWZmZXIuIFdhaXQgZm9yIGEgbm9uLWVtcHR5IHJlYWQgcmVxdWVzdC4KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAoIW1EYXRhTVEgJiYgKHN0YXR1cyA9IHByZXBhcmVGb3JSZWFkaW5nKGJ5dGVzKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBSZWFkUGFyYW1ldGVycyBwYXJhbXM7Ci0gICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6UkVBRDsKLSAgICBwYXJhbXMucGFyYW1zLnJlYWQgPSBieXRlczsKLSAgICBzdGF0dXMgPSBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgInJlYWQiLAotICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgYXZhaWxUb1JlYWQgPSBtRGF0YU1RLT5hdmFpbGFibGVUb1JlYWQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1EYXRhTVEtPnJlYWQoc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJ1ZmZlciksIHN0ZDo6bWluKGJ5dGVzLCBhdmFpbFRvUmVhZCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJkYXRhIG1lc3NhZ2UgcXVldWUgcmVhZCBmYWlsZWQgZm9yIFwicmVhZFwiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dXX0lGKGF2YWlsVG9SZWFkICE9IHJlYWRTdGF0dXMucmVwbHkucmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJIQUwgcmVhZCByZXBvcnQgaW5jb25zaXN0ZW50OiBtcSA9ICVkLCBzdGF0dXMgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClhdmFpbFRvUmVhZCwgKGludDMyX3QpcmVhZFN0YXR1cy5yZXBseS5yZWFkKTsKLSAgICAgICAgICAgICAgICAqcmVhZCA9IHJlYWRTdGF0dXMucmVwbHkucmVhZDsKLSAgICAgICAgICAgIH0pOwotICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqcmVhZCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpjYWxsUmVhZGVyVGhyZWFkKAotICAgICAgICBjb25zdCBSZWFkUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBjaGFyKiBjbWROYW1lLAotICAgICAgICBTdHJlYW1JbkhhbEhpZGw6OlJlYWRlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgaWYgKCFtQ29tbWFuZE1RLT53cml0ZSgmcGFyYW1zKSkgewotICAgICAgICBBTE9HVygiY29tbWFuZCBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0gICAgbUVmR3JvdXAtPndha2Uoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCkpOwotCi0gICAgLy8gVE9ETzogUmVtb3ZlIG1hbnVhbCBldmVudCBmbGFnIGhhbmRsaW5nIG9uY2UgYmxvY2tpbmcgTVEgaXMgaW1wbGVtZW50ZWQuIGIvMzM4MTU0MjIKLSAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKLXJldHJ5OgotICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSwgJmVmU3RhdGUpOwotICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpKSB7Ci0gICAgICAgIFJlYWRTdGF0dXMgcmVhZFN0YXR1czsKLSAgICAgICAgcmVhZFN0YXR1cy5yZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgaWYgKCFtU3RhdHVzTVEtPnJlYWQoJnJlYWRTdGF0dXMpKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RhdHVzIG1lc3NhZ2UgcmVhZCBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICB9Ci0gICAgICAgICBpZiAocmVhZFN0YXR1cy5yZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgcmV0ID0gT0s7Ci0gICAgICAgICAgICBjYWxsYmFjayhyZWFkU3RhdHVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IHByb2Nlc3NSZXR1cm4oY21kTmFtZSwgcmVhZFN0YXR1cy5yZXR2YWwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7Ci0gICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgotICAgICAgICBnb3RvIHJldHJ5OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnByZXBhcmVGb3JSZWFkaW5nKHNpemVfdCBidWZmZXJTaXplKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gdGVtcENvbW1hbmRNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiB0ZW1wRGF0YU1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgcGlkX3QgaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnByZXBhcmVGb3JSZWFkaW5nKAotICAgICAgICAgICAgMSwgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE1ROjpEZXNjcmlwdG9yJiBjb21tYW5kTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFNUTo6RGVzY3JpcHRvciYgZGF0YU1RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNNUTo6RGVzY3JpcHRvciYgc3RhdHVzTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEluZm8mIGhhbFRocmVhZEluZm8pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICB0ZW1wQ29tbWFuZE1RLnJlc2V0KG5ldyBDb21tYW5kTVEoY29tbWFuZE1RKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhTVEucmVzZXQobmV3IERhdGFNUShkYXRhTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOwotICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInByZXBhcmVGb3JSZWFkaW5nIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLSAgICBpZiAoIXRlbXBDb21tYW5kTVEgfHwgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBEYXRhTVEgfHwgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICFtRWZHcm91cCkgewotICAgICAgICBBTE9HRV9JRighdGVtcENvbW1hbmRNUSwgIkZhaWxlZCB0byBvYnRhaW4gY29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBDb21tYW5kTVEgJiYgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiQ29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBEYXRhTVEsICJGYWlsZWQgdG8gb2J0YWluIGRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wRGF0YU1RICYmICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCksICJEYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIHJlYWRpbmcgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkoaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQpOwotCi0gICAgbUNvbW1hbmRNUSA9IHN0ZDo6bW92ZSh0ZW1wQ29tbWFuZE1RKTsKLSAgICBtRGF0YU1RID0gc3RkOjptb3ZlKHRlbXBEYXRhTVEpOwotICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOwotICAgIG1SZWFkZXJDbGllbnQgPSBnZXR0aWQoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0RnJhbWVzTG9zdCIsIG1TdHJlYW0tPmdldElucHV0RnJhbWVzTG9zdCgpLCBmcmFtZXNMb3N0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1SZWFkZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgewotICAgICAgICBSZWFkUGFyYW1ldGVycyBwYXJhbXM7Ci0gICAgICAgIHBhcmFtcy5jb21tYW5kID0gUmVhZENvbW1hbmQ6OkdFVF9DQVBUVVJFX1BPU0lUSU9OOwotICAgICAgICByZXR1cm4gY2FsbFJlYWRlclRocmVhZChwYXJhbXMsICJnZXRDYXB0dXJlUG9zaXRpb24iLAotICAgICAgICAgICAgICAgIFsmXShjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi5mcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICp0aW1lID0gcmVhZFN0YXR1cy5yZXBseS5jYXB0dXJlUG9zaXRpb24udGltZTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICBSZXN1bHQgcmV0dmFsOwotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0Q2FwdHVyZVBvc2l0aW9uKAotICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgaGlkbEZyYW1lcywgdWludDY0X3QgaGlkbFRpbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gaGlkbEZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgICp0aW1lID0gaGlkbFRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldENhcHR1cmVQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLSAgICB9Ci19Ci0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKLSAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXNJbmZvKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBY3RpdmVNaWNyb3Bob25lcygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaGlkbF92ZWM8TWljcm9waG9uZUluZm8+IG1pY0FycmF5SGFsKSB7Ci0gICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbWljQXJyYXlIYWwuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBkc3Q7Ci0gICAgICAgICAgICAvLyBjb252ZXJ0Ci0gICAgICAgICAgICBtaWNyb3Bob25lSW5mb1RvSGFsKG1pY0FycmF5SGFsW2tdLCAmZHN0KTsKLSAgICAgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKGRzdCk7Ci0gICAgICAgICAgICBtaWNyb3Bob25lc0luZm8tPnB1c2hfYmFjayhtaWNyb3Bob25lKTsKLSAgICAgICAgfQotICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBY3RpdmVNaWNyb3Bob25lcyIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjp1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKLSAgICBoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlNpbmtNZXRhZGF0YSBoYWxNZXRhZGF0YSA9IHsKLSAgICAgICAgLnRyYWNrcyA9IHRyYW5zZm9ybVRvSGlkbFZlYyhzaW5rTWV0YWRhdGEudHJhY2tzLAotICAgICAgICAgICAgICBbXShjb25zdCByZWNvcmRfdHJhY2tfbWV0YWRhdGEmIG1ldGFkYXRhKSAtPiBSZWNvcmRUcmFja01ldGFkYXRhIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiB7Ci0gICAgICAgICAgICAgICAgICAgIC5zb3VyY2U9c3RhdGljX2Nhc3Q8QXVkaW9Tb3VyY2U+KG1ldGFkYXRhLnNvdXJjZSksCi0gICAgICAgICAgICAgICAgICAgIC5nYWluPW1ldGFkYXRhLmdhaW4sCi0gICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICB9KX07Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInVwZGF0ZVNpbmtNZXRhZGF0YSIsIG1TdHJlYW0tPnVwZGF0ZVNpbmtNZXRhZGF0YShoYWxNZXRhZGF0YSkpOwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkYTBmOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMXzRfMF9ICi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JU3RyZWFtLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVN0cmVhbUluLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVN0cmVhbU91dC5oPgotI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KLSNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1JbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtT3V0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgUmVhZFBhcmFtZXRlcnMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbUluOjpSZWFkUGFyYW1ldGVyczsKLXVzaW5nIFJlYWRTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbUluOjpSZWFkU3RhdHVzOwotdXNpbmcgV3JpdGVDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1PdXQ6OldyaXRlQ29tbWFuZDsKLXVzaW5nIFdyaXRlU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1PdXQ6OldyaXRlU3RhdHVzOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIERldmljZUhhbEhpZGw7Ci0KLWNsYXNzIFN0cmVhbUhhbEhpZGwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAotewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7Ci0KLSAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0KLSAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKLQotICAgIC8vIFNldCB0aGUgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBIQUwKLSAgICAvLyAobXVzdCBtYXRjaCB0aGUgcHJpb3JpdHkgb2YgdGhlIGF1ZGlvZmxpbmdlcidzIHRocmVhZCB0aGF0IGNhbGxzICdyZWFkJyAvICd3cml0ZScpCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpOwotCi0gIHByb3RlY3RlZDoKLSAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgflN0cmVhbUhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IGdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIGJvb2wgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpOwotCi0gICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgotICAgIFN0cmVhbVBvd2VyTG9nIG1TdHJlYW1Qb3dlckxvZzsKLQotICBwcml2YXRlOgotICAgIGNvbnN0IGludCBIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQgPSAtMTsKLSAgICBJU3RyZWFtICptU3RyZWFtOwotICAgIGludCBtSGFsVGhyZWFkUHJpb3JpdHk7Ci0gICAgc2l6ZV90IG1DYWNoZWRCdWZmZXJTaXplOwotfTsKLQotY2xhc3MgU3RyZWFtT3V0SGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1PdXRIYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxIaWRsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKLQotICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7Ci0KLSAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQotICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7Ci0KLSAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOwotCi0gICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7Ci0KLSAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gICAgLy8gTWV0aG9kcyB1c2VkIGJ5IFN0cmVhbU91dENhbGxiYWNrIChISURMKS4KLSAgICB2b2lkIG9uV3JpdGVSZWFkeSgpOwotICAgIHZvaWQgb25EcmFpblJlYWR5KCk7Ci0gICAgdm9pZCBvbkVycm9yKCk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZUNvbW1hbmQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZVN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROwotCi0gICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKLSAgICBzcDxJU3RyZWFtT3V0PiBtU3RyZWFtOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKLSAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVdyaXRlckNsaWVudDsKLSAgICBFdmVudEZsYWcqIG1FZkdyb3VwOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxIaWRsKCk7Ci0KLSAgICB1c2luZyBXcml0ZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpPjsKLSAgICBzdGF0dXNfdCBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwgV3JpdGVyQ2FsbGJhY2sgY2FsbGJhY2spOwotICAgIHN0YXR1c190IHByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKTsKLX07Ci0KLWNsYXNzIFN0cmVhbUluSGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFNldCB0aGUgaW5wdXQgZ2FpbiBmb3IgdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEdhaW4oZmxvYXQgZ2Fpbik7Ci0KLSAgICAvLyBSZWFkIGF1ZGlvIGJ1ZmZlciBpbiBmcm9tIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBpbnB1dCBmcmFtZXMgbG9zdCBpbiB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KTsKLQotICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyByZWNlaXZlZCBhbmQKLSAgICAvLyB0aGUgY2xvY2sgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmcmFtZSBjb3VudC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpOwotCi0gICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxIaWRsOwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRQYXJhbWV0ZXJzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROwotCi0gICAgc3A8SVN0cmVhbUluPiBtU3RyZWFtOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKLSAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVJlYWRlckNsaWVudDsKLSAgICBFdmVudEZsYWcqIG1FZkdyb3VwOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pOwotCi0gICAgdmlydHVhbCB+U3RyZWFtSW5IYWxIaWRsKCk7Ci0KLSAgICB1c2luZyBSZWFkZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKT47Ci0gICAgc3RhdHVzX3QgY2FsbFJlYWRlclRocmVhZCgKLSAgICAgICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsIFJlYWRlckNhbGxiYWNrIGNhbGxiYWNrKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUmVhZGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxMb2NhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZDk2YmYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxMb2NhbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotU3RyZWFtSGFsTG9jYWw6OlN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogbURldmljZShkZXZpY2UpLAotICAgICAgICAgIG1TdHJlYW0oc3RyZWFtKSB7Ci0gICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgotICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7Ci0gICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKSwKLSAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSksCi0gICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKSk7Ci0gICAgfQotfQotCi1TdHJlYW1IYWxMb2NhbDo6flN0cmVhbUhhbExvY2FsKCkgewotICAgIG1TdHJlYW0gPSAwOwotICAgIG1EZXZpY2UuY2xlYXIoKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKLSAgICAqcmF0ZSA9IG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gbVN0cmVhbS0+Z2V0X2J1ZmZlcl9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKSB7Ci0gICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICAqZm9ybWF0ID0gbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgICpzYW1wbGVSYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOwotICAgICptYXNrID0gbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pOwotICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgewotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrdlBhaXJzLnN0cmluZygpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgY2hhciAqaGFsVmFsdWVzID0gbVN0cmVhbS0+Z2V0X3BhcmFtZXRlcnMobVN0cmVhbSwga2V5cy5zdHJpbmcoKSk7Ci0gICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKLSAgICAgICAgZnJlZShoYWxWYWx1ZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6cmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4pIHsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCJMb2NhbCBzdHJlYW1zIGNhbiBub3QgaGF2ZSBlZmZlY3RzIik7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c3RhbmRieSgpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RhbmRieShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmR1bXAoaW50IGZkKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbS0+ZHVtcChtU3RyZWFtLCBmZCk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQpIHsKLSAgICAvLyBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGFzIGxvY2FsIGhhbCBpcyBleGVjdXRlZCBieSBhdWRpb2ZsaW5nZXIgZGlyZWN0bHkKLSAgICAvLyBvbiB0aGUgc2FtZSB0aHJlYWQuCi0gICAgcmV0dXJuIE9LOwotfQotCi1TdHJlYW1PdXRIYWxMb2NhbDo6U3RyZWFtT3V0SGFsTG9jYWwoYXVkaW9fc3RyZWFtX291dF90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgewotfQotCi1TdHJlYW1PdXRIYWxMb2NhbDo6flN0cmVhbU91dEhhbExvY2FsKCkgewotICAgIG1DYWxsYmFjay5jbGVhcigpOwotICAgIG1EZXZpY2UtPmNsb3NlT3V0cHV0U3RyZWFtKG1TdHJlYW0pOwotICAgIG1TdHJlYW0gPSAwOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gYXVkaW9fc3RyZWFtX291dF9mcmFtZV9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpIHsKLSAgICAqbGF0ZW5jeSA9IG1TdHJlYW0tPmdldF9sYXRlbmN5KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgewotICAgIGlmIChtU3RyZWFtLT5zZXRfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3ZvbHVtZShtU3RyZWFtLCBsZWZ0LCByaWdodCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7Ci0gICAgc3NpemVfdCB3cml0ZVJlc3VsdCA9IG1TdHJlYW0tPndyaXRlKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOwotICAgIGlmICh3cml0ZVJlc3VsdCA+IDApIHsKLSAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVJlc3VsdDsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICp3cml0dGVuID0gMDsKLSAgICAgICAgcmV0dXJuIHdyaXRlUmVzdWx0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3JlbmRlcl9wb3NpdGlvbihtU3RyZWFtLCBkc3BGcmFtZXMpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAobVN0cmVhbSwgdGltZXN0YW1wKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgewotICAgIGlmIChtU3RyZWFtLT5zZXRfY2FsbGJhY2sgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHN0YXR1c190IHJlc3VsdCA9IG1TdHJlYW0tPnNldF9jYWxsYmFjayhtU3RyZWFtLCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjaywgdGhpcyk7Ci0gICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gc3RhdGljCi1pbnQgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQqLCB2b2lkICpjb29raWUpIHsKLSAgICAvLyBXZSBhY3QgYXMgaWYgd2UgZ2F2ZSBhIHdwPFN0cmVhbU91dEhhbExvY2FsPiB0byBIQUwuIFRoaXMgd2F5IHdlIHNob3VsZCBoYW5kbGUKLSAgICAvLyBjb3JyZWN0bHkgdGhlIGNhc2Ugd2hlbiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGlsZSBTdHJlYW1PdXRIYWxMb2NhbCdzIGRlc3RydWN0b3IgaXMKLSAgICAvLyBhbHJlYWR5IHJ1bm5pbmcsIGJlY2F1c2UgdGhlIGRlc3RydWN0b3IgaXMgaW52b2tlZCBhZnRlciB0aGUgcmVmY291bnQgaGFzIGJlZW4gYXRvbWljYWxseQotICAgIC8vIGRlY3JlbWVudGVkLgotICAgIHdwPFN0cmVhbU91dEhhbExvY2FsPiB3ZWFrU2VsZihzdGF0aWNfY2FzdDxTdHJlYW1PdXRIYWxMb2NhbCo+KGNvb2tpZSkpOwotICAgIHNwPFN0cmVhbU91dEhhbExvY2FsPiBzZWxmID0gd2Vha1NlbGYucHJvbW90ZSgpOwotICAgIGlmIChzZWxmID09IDApIHJldHVybiAwOwotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IHNlbGYtPm1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybiAwOwotICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrKCkgZXZlbnQgJWQiLCBldmVudCk7Ci0gICAgc3dpdGNoIChldmVudCkgewotICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfV1JJVEVfUkVBRFk6Ci0gICAgICAgICAgICBjYWxsYmFjay0+b25Xcml0ZVJlYWR5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0RSQUlOX1JFQURZOgotICAgICAgICAgICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9FUlJPUjoKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbkVycm9yKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCJhc3luY0NhbGxiYWNrKCkgdW5rbm93biBldmVudCAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKLSAgICAqc3VwcG9ydHNQYXVzZSA9IG1TdHJlYW0tPnBhdXNlICE9IE5VTEw7Ci0gICAgKnN1cHBvcnRzUmVzdW1lID0gbVN0cmVhbS0+cmVzdW1lICE9IE5VTEw7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cGF1c2UoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnBhdXNlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+cGF1c2UobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpyZXN1bWUoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnJlc3VtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnJlc3VtZShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgewotICAgICpzdXBwb3J0c0RyYWluID0gbVN0cmVhbS0+ZHJhaW4gIT0gTlVMTDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7Ci0gICAgaWYgKG1TdHJlYW0tPmRyYWluID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+ZHJhaW4obVN0cmVhbSwgZWFybHlOb3RpZnkgPyBBVURJT19EUkFJTl9FQVJMWV9OT1RJRlkgOiBBVURJT19EUkFJTl9BTEwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Zmx1c2goKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmZsdXNoID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Zmx1c2gobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWVzdGFtcCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKLSAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgY29uc3Qgc291cmNlX21ldGFkYXRhX3QgbWV0YWRhdGEgewotICAgICAgICAudHJhY2tfY291bnQgPSBzb3VyY2VNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAotICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKLSAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cGxheWJhY2tfdHJhY2tfbWV0YWRhdGEqPihzb3VyY2VNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKLSAgICB9OwotICAgIG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdGFydCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0b3AoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKLX0KLQotU3RyZWFtSW5IYWxMb2NhbDo6U3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQotICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKLX0KLQotU3RyZWFtSW5IYWxMb2NhbDo6flN0cmVhbUluSGFsTG9jYWwoKSB7Ci0gICAgbURldmljZS0+Y2xvc2VJbnB1dFN0cmVhbShtU3RyZWFtKTsKLSAgICBtU3RyZWFtID0gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgICpzaXplID0gYXVkaW9fc3RyZWFtX2luX2ZyYW1lX3NpemUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X2dhaW4obVN0cmVhbSwgZ2Fpbik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgewotICAgIHNzaXplX3QgcmVhZFJlc3VsdCA9IG1TdHJlYW0tPnJlYWQobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7Ci0gICAgaWYgKHJlYWRSZXN1bHQgPiAwKSB7Ci0gICAgICAgICpyZWFkID0gcmVhZFJlc3VsdDsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyggYnVmZmVyLCAqcmVhZCk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgewotICAgICAgICAqcmVhZCA9IDA7Ci0gICAgICAgIHJldHVybiByZWFkUmVzdWx0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7Ci0gICAgKmZyYW1lc0xvc3QgPSBtU3RyZWFtLT5nZXRfaW5wdXRfZnJhbWVzX2xvc3QobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBjb25zdCBzaW5rX21ldGFkYXRhX3QgbWV0YWRhdGEgewotICAgICAgICAudHJhY2tfY291bnQgPSBzaW5rTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKLSAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCi0gICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHJlY29yZF90cmFja19tZXRhZGF0YSo+KHNpbmtNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKLSAgICB9OwotICAgIG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhKG1TdHJlYW0sICZtZXRhZGF0YSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdGFydCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RvcCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgewotICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X2FjdGl2ZV9taWNyb3Bob25lcyA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc2l6ZV90IGFjdHVhbF9taWNzID0gQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlQ7Ci0gICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190IG1pY19hcnJheVtBVURJT19NSUNST1BIT05FX01BWF9DT1VOVF07Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0cmVhbS0+Z2V0X2FjdGl2ZV9taWNyb3Bob25lcyhtU3RyZWFtLCAmbWljX2FycmF5WzBdLCAmYWN0dWFsX21pY3MpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0dWFsX21pY3M7IGkrKykgewotICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZUluZm8gPSBtZWRpYTo6TWljcm9waG9uZUluZm8obWljX2FycmF5W2ldKTsKLSAgICAgICAgbWljcm9waG9uZXMtPnB1c2hfYmFjayhtaWNyb3Bob25lSW5mbyk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMzc1MDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbExvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF80XzBfSAotCi0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBEZXZpY2VIYWxMb2NhbDsKLQotY2xhc3MgU3RyZWFtSGFsTG9jYWwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOwotCi0gICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotCi0gICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSA9IDA7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgPSAwOwotCi0gICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAotICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7Ci0KLSAgcHJvdGVjdGVkOgotICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbUhhbExvY2FsKGF1ZGlvX3N0cmVhbV90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIH5TdHJlYW1IYWxMb2NhbCgpOwotCi0gICAgc3A8RGV2aWNlSGFsTG9jYWw+IG1EZXZpY2U7Ci0KLSAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9fc3RyZWFtX3QgKm1TdHJlYW07Ci19OwotCi1jbGFzcyBTdHJlYW1PdXRIYWxMb2NhbCA6IHB1YmxpYyBTdHJlYW1PdXRIYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7Ci0KLSAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwotCi0gICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOwotCi0gICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKLSAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOwotCi0gICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKLQotICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOwotCi0gICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19zdHJlYW1fb3V0X3QgKm1TdHJlYW07Ci0gICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKLQotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxMb2NhbCgpOwotCi0gICAgc3RhdGljIGludCBhc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkICpwYXJhbSwgdm9pZCAqY29va2llKTsKLX07Ci0KLWNsYXNzIFN0cmVhbUluSGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKLQotICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKLQotICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAotICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOwotCi0gICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV9pbl90ICptU3RyZWFtOwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbUluSGFsTG9jYWwoYXVkaW9fc3RyZWFtX2luX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbExvY2FsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1Qb3dlckxvZy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbVBvd2VyTG9nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YjcyMDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbVBvd2VyTG9nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR180XzBfSAotCi0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KLSNpbmNsdWRlIDxhdWRpb191dGlscy9Qb3dlckxvZy5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgU3RyZWFtUG93ZXJMb2cgewotcHVibGljOgotICAgIFN0cmVhbVBvd2VyTG9nKCkgOgotICAgICAgICBtSXNVc2VyRGVidWdPckVuZ0J1aWxkKGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSksCi0gICAgICAgIG1Qb3dlckxvZyhudWxscHRyKSwKLSAgICAgICAgbUZyYW1lU2l6ZSgwKSB7Ci0gICAgICAgIC8vIHVzZSBpbml0KCkgdG8gc2V0IHVwIHRoZSBwb3dlciBsb2cuCi0gICAgfQotCi0gICAgflN0cmVhbVBvd2VyTG9nKCkgewotICAgICAgICBwb3dlcl9sb2dfZGVzdHJveShtUG93ZXJMb2cpOyAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKLSAgICAgICAgbVBvd2VyTG9nID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICAvLyBBIG9uZS10aW1lIGluaXRpYWxpemF0aW9uIChkbyBub3QgY2FsbCB0d2ljZSkgYmVmb3JlIHVzaW5nIFN0cmVhbVBvd2VyTG9nLgotICAgIHZvaWQgaW5pdCh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7Ci0gICAgICAgIGlmIChtUG93ZXJMb2cgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgLy8gTm90ZTogQSB3YXkgdG8gZ2V0IGNoYW5uZWwgY291bnQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBjaGFubmVsIG1hc2tzCi0gICAgICAgICAgICAvLyBidXQgZG9lcyBub3QgY2hlY2sgdmFsaWRpdHkgb2YgdGhlIGNoYW5uZWwgbWFzay4KLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykpOwotICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKLSAgICAgICAgICAgIGlmIChtRnJhbWVTaXplID4gMCkgewotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNhbXBsZVJhdGUgKiBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgLyAxMDAwOwotICAgICAgICAgICAgICAgIG1Qb3dlckxvZyA9IHBvd2VyX2xvZ19jcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRW50cmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBtUG93ZXJMb2cgbWF5IGJlIE5VTEwgKG5vdCB0aGUgcmlnaHQgYnVpbGQsIGZvcm1hdCBub3QgYWNjZXB0ZWQsIGV0Yy4pLgotICAgIH0KLQotICAgIC8vIER1bXAgdGhlIHBvd2VyIGxvZyB0byBmZC4KLSAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdCB7Ci0gICAgICAgIC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZwotICAgICAgICAodm9pZClwb3dlcl9sb2dfZHVtcCgKLSAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGZkLCAiICAgICAgIiAvKiBwcmVmaXggKi8sIGtQb3dlckxvZ0xpbmVzLCAwIC8qIGxpbWl0X25zICovKTsKLSAgICB9Ci0KLSAgICAvLyBMb2cgdGhlIGF1ZGlvIGRhdGEgY29udGFpbmVkIGluIGJ1ZmZlci4KLSAgICB2b2lkIGxvZyhjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplSW5CeXRlcykgY29uc3QgewotICAgICAgICBpZiAobVBvd2VyTG9nICE9IG51bGxwdHIpIHsgLy8gbUZyYW1lU2l6ZSBpcyBhbHdheXMgbm9uemVybyBpZiBtUG93ZXJMb2cgZXhpc3RzLgotICAgICAgICAgICAgcG93ZXJfbG9nX2xvZygKLSAgICAgICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBidWZmZXIsIHNpemVJbkJ5dGVzIC8gbUZyYW1lU2l6ZSwgYXVkaW9fdXRpbHNfZ2V0X3JlYWxfdGltZV9ucygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2wgaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKLSAgICB9Ci0KLXByaXZhdGU6Ci0KLSAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpIHsKLSAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICAgICAodm9pZClwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLnR5cGUiLCB2YWx1ZSwgInVua25vd24iKTsgLy8gaWdub3JlIGFjdHVhbCBsZW5ndGgKLSAgICAgICAgcmV0dXJuIHN0cmNtcCh2YWx1ZSwgInVzZXJkZWJ1ZyIpID09IDAgfHwgc3RyY21wKHZhbHVlLCAiZW5nIikgPT0gMDsKLSAgICB9Ci0KLSAgICAvLyBBdWRpbyBzaWduYWwgcG93ZXIgbG9nIGNvbmZpZ3VyYXRpb24uCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dMaW5lcyA9IDQwOwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zID0gNTA7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dFbnRyaWVzID0gKDEgLyogbWludXRlcyAqLyAqIDYwIC8qIHNlY29uZHMgKi8gKiAxMDAwIC8qIG1zZWMgKi8KLSAgICAgICAgICAgIC8ga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zKTsKLQotICAgIGNvbnN0IGJvb2wgbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKLSAgICBwb3dlcl9sb2dfdCAqbVBvd2VyTG9nOwotICAgIHNpemVfdCBtRnJhbWVTaXplOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvVmVyc2lvblV0aWxzLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvVmVyc2lvblV0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNDZjMmUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1ZlcnNpb25VdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfVkVSU0lPTl9VVElMU180XzBfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci1uYW1lc3BhY2UgdXRpbHMgewotCi10ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQ2FsbGJhY2s+Ci1SZXR1cm48dm9pZD4gZ2V0UGFyYW1ldGVycyhUJiBvYmplY3QsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGtleXMsIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgcmV0dXJuIG9iamVjdC0+Z2V0UGFyYW1ldGVycyhjb250ZXh0LCBrZXlzLCBjYWxsYmFjayk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotUmV0dXJuPFJlc3VsdD4gc2V0UGFyYW1ldGVycyhUJiBvYmplY3QsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4ga2V5cykgewotICAgIHJldHVybiBvYmplY3QtPnNldFBhcmFtZXRlcnMoY29udGV4dCwga2V5cyk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIHV0aWxzCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9pbmNsdWRlL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZjZkZTAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfNF8wX0gKLQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKLSAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKLQotICAgIHZpcnR1YWwgfkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7Ci0KLSAgICBzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gbUxvY2FsRmFjdG9yeTsKLSAgICBzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gbUhpZGxGYWN0b3J5OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL2luY2x1ZGUvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODBiN2ExLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9pbmNsdWRlL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMXzRfMF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvSUVmZmVjdHNGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvNC4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6RWZmZWN0RGVzY3JpcHRvcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OklFZmZlY3RzRmFjdG9yeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotCi1jbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAotewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBlZmZlY3RzIGluIGFsbCBsb2FkZWQgbGlicmFyaWVzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cyk7Ci0KLSAgICAvLyBSZXR1cm5zIGEgZGVzY3JpcHRvciBvZiB0aGUgbmV4dCBhdmFpbGFibGUgZWZmZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcih1aW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKLSAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKLQotICAgIC8vIENyZWF0ZXMgYW4gZWZmZWN0IGVuZ2luZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0gICAgLy8gVG8gcmVsZWFzZSB0aGUgZWZmZWN0IGVuZ2luZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcwotICAgIC8vIHRvIHRoZSByZXR1cm5lZCBlZmZlY3Qgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKLSAgICAgICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBFZmZlY3RzKGludCBmZCk7Ci0KLSAgICBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcihzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCBtaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOwotCi0gICAgc3A8SUVmZmVjdHNGYWN0b3J5PiBtRWZmZWN0c0ZhY3Rvcnk7Ci0gICAgaGlkbF92ZWM8RWZmZWN0RGVzY3JpcHRvcj4gbUxhc3REZXNjcmlwdG9yczsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKLSAgICB2aXJ0dWFsIH5FZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5icAppbmRleCAzYTVkZjI3Li41ODRjMmMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAKQEAgLTgsMTYgKzgsMjAgQEAKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDIuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA0LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9AMi4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANC4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANS4wIiwKICAgICAgICAgImxpYmF1ZGlvaGFsQDIuMCIsCiAgICAgICAgICJsaWJhdWRpb2hhbEA0LjAiLAorICAgICAgICAibGliYXVkaW9oYWxANS4wIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKaW5kZXggNGM4ZWFmNi4uZjg2MDA5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcApAQCAtMTYsMTkgKzE2LDIyIEBACiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JRGV2aWNlc0ZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JRGV2aWNlc0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzUuMC9JRGV2aWNlc0ZhY3RvcnkuaD4KIAotI2luY2x1ZGUgPERldmljZXNGYWN0b3J5SGFsSHlicmlkLmg+Ci0jaW5jbHVkZSA8bGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmg+CisjaW5jbHVkZSA8bGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyBzdGF0aWMKIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZTo6Y3JlYXRlKCkgeworICAgIGlmIChoYXJkd2FyZTo6YXVkaW86OlY1XzA6OklEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZSgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIFY1XzA6OmNyZWF0ZURldmljZXNGYWN0b3J5SGFsKCk7CisgICAgfQogICAgIGlmIChoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZSgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBWNF8wOjpEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOworICAgICAgICByZXR1cm4gVjRfMDo6Y3JlYXRlRGV2aWNlc0ZhY3RvcnlIYWwoKTsKICAgICB9CiAgICAgaWYgKGhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gbmV3IERldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7CisgICAgICAgIHJldHVybiBWMl8wOjpjcmVhdGVEZXZpY2VzRmFjdG9yeUhhbCgpOwogICAgIH0KICAgICByZXR1cm4gbnVsbHB0cjsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcAppbmRleCBlYWQxZmEyLi5iZDNlZjYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCkBAIC0xNiwyMCArMTYsMjIgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC9JRWZmZWN0c0ZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC80LjAvSUVmZmVjdHNGYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvNS4wL0lFZmZlY3RzRmFjdG9yeS5oPgogCi0jaW5jbHVkZSA8RWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmg+Ci0jaW5jbHVkZSA8bGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oPgotCisjaW5jbHVkZSA8bGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyBzdGF0aWMKIHNwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6Y3JlYXRlKCkgeworICAgIGlmIChoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjVfMDo6SUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZWZmZWN0OjpWNV8wOjpjcmVhdGVFZmZlY3RzRmFjdG9yeUhhbCgpOworICAgIH0KICAgICBpZiAoaGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OklFZmZlY3RzRmFjdG9yeTo6Z2V0U2VydmljZSgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBWNF8wOjpFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKKyAgICAgICAgcmV0dXJuIGVmZmVjdDo6VjRfMDo6Y3JlYXRlRWZmZWN0c0ZhY3RvcnlIYWwoKTsKICAgICB9CiAgICAgaWYgKGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpJRWZmZWN0c0ZhY3Rvcnk6OmdldFNlcnZpY2UoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7CisgICAgICAgIHJldHVybiBlZmZlY3Q6OlYyXzA6OmNyZWF0ZUVmZmVjdHNGYWN0b3J5SGFsKCk7CiAgICAgfQogICAgIHJldHVybiBudWxscHRyOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NTMzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMDIgQEAKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliYXVkaW9oYWxfZGVmYXVsdCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJEZXZpY2VIYWxMb2NhbC5jcHAiLAorICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIiwKKyAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIiwKKyAgICAgICAgIlN0cmVhbUhhbExvY2FsLmNwcCIsCisKKyAgICAgICAgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCIsCisgICAgICAgICJEZXZpY2VIYWxIaWRsLmNwcCIsCisgICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkVmZmVjdEhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAiLAorICAgICAgICAiU3RyZWFtSGFsSGlkbC5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbi11dGlsIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKKyAgICAgICAgImxpYmF1ZGlvaGFsX2RlYXRoaGFuZGxlciIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb24udXRpbEBhbGwtdmVyc2lvbnMiLAorICAgICAgICAibGliYXVkaW9oYWxfaGVhZGVycyIKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliZm1xIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsQDIuMCIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9oYWxfZGVmYXVsdCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9AMi4wIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURNQUpPUl9WRVJTSU9OPTIiLAorICAgICAgICAiLURNSU5PUl9WRVJTSU9OPTAiLAorICAgICAgICAiLWluY2x1ZGUgY29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uTWFjcm8uaCIsCisgICAgXQorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsQDQuMCIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9oYWxfZGVmYXVsdCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA0LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANC4wLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANC4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANC4wIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURNQUpPUl9WRVJTSU9OPTQiLAorICAgICAgICAiLURNSU5PUl9WRVJTSU9OPTAiLAorICAgICAgICAiLWluY2x1ZGUgY29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uTWFjcm8uaCIsCisgICAgXQorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsQDUuMCIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9oYWxfZGVmYXVsdCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA1LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANS4wLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANS4wIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURNQUpPUl9WRVJTSU9OPTUiLAorICAgICAgICAiLURNSU5PUl9WRVJTSU9OPTAiLAorICAgICAgICAiLWluY2x1ZGUgY29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uTWFjcm8uaCIsCisgICAgXQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjhhNTIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgTE9HX1RBRyAiSGFsSGlkbCIKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjsKKworLy8gc3RhdGljCitzdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6a2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cykgeworICAgIEF1ZGlvUGFyYW1ldGVyIGhhbEtleXMoa2V5cyk7CisgICAgaWYgKGhhbEtleXMuc2l6ZSgpID09IDApIHJldHVybiBCQURfVkFMVUU7CisgICAgaGlkbEtleXMtPnJlc2l6ZShoYWxLZXlzLnNpemUoKSk7CisgICAgLy9GSVhNRTogIGtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzIGFuZCBrZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzIGNvbWUgd2l0aCBhCisgICAgLy8gImtleUZvcm1hdD08dmFsdWU+IiBwYWlyLiBXZSBuZWVkIHRvIHRyYW5zZm9ybSBpdCBpbnRvIGEgc2luZ2xlIGtleSBzdHJpbmcgc28gdGhhdCBpdCBpcworICAgIC8vIGNhcnJpZWQgb3ZlciB0byB0aGUgbGVnYWN5IEhBTCB2aWEgSElETC4KKyAgICBTdHJpbmc4IHZhbHVlOworICAgIGJvb2wga2VlcEZvcm1hdFZhbHVlID0gaGFsS2V5cy5zaXplKCkgPT0gMiAmJgorICAgICAgICAgKGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SIHx8CisgICAgICAgICBoYWxLZXlzLmdldChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzKSwgdmFsdWUpID09IE5PX0VSUk9SKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGFsS2V5cy5zaXplKCk7ICsraSkgeworICAgICAgICBTdHJpbmc4IGtleTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaGFsS2V5cy5nZXRBdChpLCBrZXkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgICAgICBpZiAoa2VlcEZvcm1hdFZhbHVlICYmIGtleSA9PSBBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0KSB7CisgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBmb3JtYXRQYXJhbTsKKyAgICAgICAgICAgIGhhbEtleXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBmb3JtYXRQYXJhbS5hZGQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBrZXkgPSBmb3JtYXRQYXJhbS50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgICgqaGlkbEtleXMpW2ldID0ga2V5LnN0cmluZygpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIHN0YXRpYworc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNGcm9tSGFsKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpIHsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXMoa3ZQYWlycyk7CisgICAgaWYgKHBhcmFtcy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBoaWRsUGFyYW1zLT5yZXNpemUocGFyYW1zLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgU3RyaW5nOCBrZXksIHZhbHVlOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbXMuZ2V0QXQoaSwga2V5LCB2YWx1ZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgICAgICgqaGlkbFBhcmFtcylbaV0ua2V5ID0ga2V5LnN0cmluZygpOworICAgICAgICAoKmhpZGxQYXJhbXMpW2ldLnZhbHVlID0gdmFsdWUuc3RyaW5nKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLy8gc3RhdGljCit2b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzVG9IYWwoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW1zOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5zaXplKCk7ICsraSkgeworICAgICAgICBwYXJhbXMuYWRkKFN0cmluZzgocGFyYW1ldGVyc1tpXS5rZXkuY19zdHIoKSksIFN0cmluZzgocGFyYW1ldGVyc1tpXS52YWx1ZS5jX3N0cigpKSk7CisgICAgfQorICAgIHZhbHVlcy0+c2V0VG8ocGFyYW1zLnRvU3RyaW5nKCkpOworfQorCitDb252ZXJzaW9uSGVscGVySGlkbDo6Q29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKQorICAgICAgICA6IG1DbGFzc05hbWUoY2xhc3NOYW1lKSB7Cit9CisKKy8vIHN0YXRpYworc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKKyAgICBzd2l0Y2ggKHJlc3VsdCkgeworICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOworICAgIH0KK30KKwordm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6ZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbikgeworICAgIEFMT0dFKCIlcyAlcCAlczogJXMgKGZyb20gcnBjKSIsIG1DbGFzc05hbWUsIHRoaXMsIGZ1bmNOYW1lLCBkZXNjcmlwdGlvbik7Cit9CisKKyNpZiBNQUpPUl9WRVJTSU9OID49IDQKKy8vIFRPRE86IFVzZSB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgaGFsIHdoZW4gaXQgbW92ZXMgdG8gYSB1dGlsIGxpYnJhcnkuCitzdGF0aWMgc3RkOjpzdHJpbmcgZGV2aWNlQWRkcmVzc1RvSGFsKGNvbnN0IERldmljZUFkZHJlc3MmIGFkZHJlc3MpIHsKKyAgICAvLyBIQUwgYXNzdW1lcyB0aGF0IHRoZSBhZGRyZXNzIGlzIE5VTC10ZXJtaW5hdGVkLgorICAgIGNoYXIgaGFsQWRkcmVzc1tBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOXTsKKyAgICBtZW1zZXQoaGFsQWRkcmVzcywgMCwgc2l6ZW9mKGhhbEFkZHJlc3MpKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgaGFsRGV2aWNlID0gc3RhdGljX2Nhc3Q8YXVkaW9fZGV2aWNlc190PihhZGRyZXNzLmRldmljZSk7CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0gKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDA7CisgICAgaWYgKGlzSW5wdXQpIGhhbERldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKSB8fAorICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCisgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5tYWNbMF0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbMV0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbMl0sCisgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5tYWNbM10sIGFkZHJlc3MuYWRkcmVzcy5tYWNbNF0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbNV0pOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0lQKSAhPSAwKSB8fAorICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9JUCkgIT0gMCkpIHsKKyAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJWQuJWQuJWQuJWQiLCBhZGRyZXNzLmFkZHJlc3MuaXB2NFswXSwKKyAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLmlwdjRbMV0sIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzJdLCBhZGRyZXNzLmFkZHJlc3MuaXB2NFszXSk7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX1VTQikgIT0gMCkgfHwKKyAgICAgICAgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQUxMX1VTQikgIT0gMCkpIHsKKyAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiY2FyZD0lZDtkZXZpY2U9JWQiLCBhZGRyZXNzLmFkZHJlc3MuYWxzYS5jYXJkLAorICAgICAgICAgICAgICAgICBhZGRyZXNzLmFkZHJlc3MuYWxzYS5kZXZpY2UpOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0JVUykgIT0gMCkgfHwKKyAgICAgICAgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQlVTKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuYnVzQWRkcmVzcy5jX3N0cigpKTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgIT0gMCB8fAorICAgICAgICAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSAhPSAwKSkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuclN1Ym1peEFkZHJlc3MuY19zdHIoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJXMiLCBhZGRyZXNzLmJ1c0FkZHJlc3MuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBoYWxBZGRyZXNzOworfQorCisvL2xvY2FsIGNvbnZlcnNpb24gaGVscGVycworCitzdGF0aWMgYXVkaW9fbWljcm9waG9uZV9jaGFubmVsX21hcHBpbmdfdCAgY2hhbm5lbE1hcHBpbmdUb0hhbChBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZyBtYXBwaW5nKSB7CisgICAgc3dpdGNoIChtYXBwaW5nKSB7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc6OlVOVVNFRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19VTlVTRUQ7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc6OkRJUkVDVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19ESVJFQ1Q7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc6OlBST0NFU1NFRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19QUk9DRVNTRUQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIGNoYW5uZWxNYXBwaW5nVG9IYWwgY29udmVyc2lvbiAlZCIsIG1hcHBpbmcpOworICAgIH0KK30KKworc3RhdGljIGF1ZGlvX21pY3JvcGhvbmVfbG9jYXRpb25fdCBsb2NhdGlvblRvSGFsKEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgc3dpdGNoIChsb2NhdGlvbikgeworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpVTktOT1dOOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fVU5LTk9XTjsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFk6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9NQUlOQk9EWTsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFlfTU9WQUJMRToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX01BSU5CT0RZX01PVkFCTEU7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246OlBFUklQSEVSQUw6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9QRVJJUEhFUkFMOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBsb2NhdGlvblRvSGFsIGNvbnZlcnNpb24gJWQiLCBsb2NhdGlvbik7CisgICAgfQorfQorc3RhdGljIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uYWxpdHlfdCBkaXJlY3Rpb25hbGl0eVRvSGFsKEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5IGRpcikgeworICAgIHN3aXRjaCAoZGlyKSB7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6OlVOS05PV046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9VTktOT1dOOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpPTU5JOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfRElSRUNUSU9OQUxJVFlfT01OSTsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6QklfRElSRUNUSU9OQUw6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9CSV9ESVJFQ1RJT05BTDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6Q0FSRElPSUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9DQVJESU9JRDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6SFlQRVJfQ0FSRElPSUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9IWVBFUl9DQVJESU9JRDsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6U1VQRVJfQ0FSRElPSUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9TVVBFUl9DQVJESU9JRDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gZGlyZWN0aW9uYWxpdHlUb0hhbCBjb252ZXJzaW9uICVkIiwgZGlyKTsKKyAgICB9Cit9CisKK3ZvaWQgbWljcm9waG9uZUluZm9Ub0hhbChjb25zdCBNaWNyb3Bob25lSW5mbyYgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCAqcERzdCkgeworICAgIGlmIChwRHN0ICE9IE5VTEwpIHsKKyAgICAgICAgc25wcmludGYocERzdC0+ZGV2aWNlX2lkLCBzaXplb2YocERzdC0+ZGV2aWNlX2lkKSwKKyAgICAgICAgICAgICAgICAgIiVzIiwgc3JjLmRldmljZUlkLmNfc3RyKCkpOworICAgICAgICBwRHN0LT5kZXZpY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KHNyYy5kZXZpY2VBZGRyZXNzLmRldmljZSk7CisgICAgICAgIHNucHJpbnRmKHBEc3QtPmFkZHJlc3MsIHNpemVvZihwRHN0LT5hZGRyZXNzKSwKKyAgICAgICAgICAgICAgICAgIiVzIiwgZGV2aWNlQWRkcmVzc1RvSGFsKHNyYy5kZXZpY2VBZGRyZXNzKS5jX3N0cigpKTsKKyAgICAgICAgaWYgKHNyYy5jaGFubmVsTWFwcGluZy5zaXplKCkgPiBBVURJT19DSEFOTkVMX0NPVU5UX01BWCkgeworICAgICAgICAgICAgQUxPR1coIm1pY3JvcGhvbmVJbmZvVG9TdHJ1Y3QgZm91bmQgJXp1IGNoYW5uZWxNYXBwaW5nIGVsZW1lbnRzLiBNYXggZXhwZWN0ZWQgaXMgJWQiLAorICAgICAgICAgICAgICAgICAgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSwgQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVgpOworICAgICAgICB9CisgICAgICAgIHNpemVfdCBjaDsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSAmJiBjaCA8IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYOyBjaCsrKSB7CisgICAgICAgICAgICBwRHN0LT5jaGFubmVsX21hcHBpbmdbY2hdID0gY2hhbm5lbE1hcHBpbmdUb0hhbChzcmMuY2hhbm5lbE1hcHBpbmdbY2hdKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDsgY2ggPCBBVURJT19DSEFOTkVMX0NPVU5UX01BWDsgY2grKykgeworICAgICAgICAgICAgcERzdC0+Y2hhbm5lbF9tYXBwaW5nW2NoXSA9IEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1VOVVNFRDsKKyAgICAgICAgfQorICAgICAgICBwRHN0LT5sb2NhdGlvbiA9IGxvY2F0aW9uVG9IYWwoc3JjLmxvY2F0aW9uKTsKKyAgICAgICAgcERzdC0+Z3JvdXAgPSAoYXVkaW9fbWljcm9waG9uZV9ncm91cF90KXNyYy5ncm91cDsKKyAgICAgICAgcERzdC0+aW5kZXhfaW5fdGhlX2dyb3VwID0gKHVuc2lnbmVkIGludClzcmMuaW5kZXhJblRoZUdyb3VwOworICAgICAgICBwRHN0LT5zZW5zaXRpdml0eSA9IHNyYy5zZW5zaXRpdml0eTsKKyAgICAgICAgcERzdC0+bWF4X3NwbCA9IHNyYy5tYXhTcGw7CisgICAgICAgIHBEc3QtPm1pbl9zcGwgPSBzcmMubWluU3BsOworICAgICAgICBwRHN0LT5kaXJlY3Rpb25hbGl0eSA9IGRpcmVjdGlvbmFsaXR5VG9IYWwoc3JjLmRpcmVjdGlvbmFsaXR5KTsKKyAgICAgICAgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMgPSAodW5zaWduZWQgaW50KXNyYy5mcmVxdWVuY3lSZXNwb25zZS5zaXplKCk7CisgICAgICAgIGlmIChwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA+IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJtaWNyb3Bob25lSW5mb1RvU3RydWN0IGZvdW5kICVkIGZyZXF1ZW5jeSByZXNwb25zZXMuIE1heCBleHBlY3RlZCBpcyAlZCIsCisgICAgICAgICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcywgQVVESU9fTUlDUk9QSE9ORV9NQVhfRlJFUVVFTkNZX1JFU1BPTlNFUyk7CisgICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVM7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlczsgaysrKSB7CisgICAgICAgICAgICBwRHN0LT5mcmVxdWVuY3lfcmVzcG9uc2VzWzBdW2tdID0gc3JjLmZyZXF1ZW5jeVJlc3BvbnNlW2tdLmZyZXF1ZW5jeTsKKyAgICAgICAgICAgIHBEc3QtPmZyZXF1ZW5jeV9yZXNwb25zZXNbMV1ba10gPSBzcmMuZnJlcXVlbmN5UmVzcG9uc2Vba10ubGV2ZWw7CisgICAgICAgIH0KKyAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnggPSBzcmMucG9zaXRpb24ueDsKKyAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnkgPSBzcmMucG9zaXRpb24ueTsKKyAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnogPSBzcmMucG9zaXRpb24uejsKKyAgICAgICAgcERzdC0+b3JpZW50YXRpb24ueCA9IHNyYy5vcmllbnRhdGlvbi54OworICAgICAgICBwRHN0LT5vcmllbnRhdGlvbi55ID0gc3JjLm9yaWVudGF0aW9uLnk7CisgICAgICAgIHBEc3QtPm9yaWVudGF0aW9uLnogPSBzcmMub3JpZW50YXRpb24uejsKKyAgICB9Cit9CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiM2JiOWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi90eXBlcy5oKQorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6UGFyYW1ldGVyVmFsdWU7Cit1c2luZyBDb3JlUmVzdWx0ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpSZXN1bHQ7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIENvbnZlcnNpb25IZWxwZXJIaWRsIHsKKyAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyBzdGF0dXNfdCBrZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgcGFyYW1ldGVyc0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga3ZQYWlycywgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+ICpoaWRsUGFyYW1zKTsKKyAgICBzdGF0aWMgdm9pZCBwYXJhbWV0ZXJzVG9IYWwoY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpOworCisgICAgQ29udmVyc2lvbkhlbHBlckhpZGwoY29uc3QgY2hhciogY2xhc3NOYW1lKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQ+CisgICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFI+JiByZXQsIFQgKnJldHZhbCkgeworICAgICAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICAgICAgLy8gVGhpcyB3YXkgaXQgYWxzbyB3b3JrcyBmb3IgZW51bSBjbGFzcyB0byB1bnNjb3BlZCBlbnVtIGNvbnZlcnNpb24uCisgICAgICAgICAgICAqcmV0dmFsID0gc3RhdGljX2Nhc3Q8VD4oc3RhdGljX2Nhc3Q8Uj4ocmV0KSk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oZnVuY05hbWUsIHJldCk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCkgeworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBPSyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48Q29yZVJlc3VsdD4mIHJldCkgeworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKAorICAgICAgICAgICAgY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxUPiYgcmV0LCBDb3JlUmVzdWx0IHJldHZhbCkgeworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorCisgIHByaXZhdGU6CisgICAgY29uc3QgY2hhciogbUNsYXNzTmFtZTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBhbmFseXplUmVzdWx0KGNvbnN0IENvcmVSZXN1bHQmIHJlc3VsdCk7CisKKyAgICB2b2lkIGVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pOworfTsKKworI2lmIE1BSk9SX1ZFUlNJT04gPj0gNAordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpNaWNyb3Bob25lSW5mbzsKK3ZvaWQgbWljcm9waG9uZUluZm9Ub0hhbChjb25zdCBNaWNyb3Bob25lSW5mbyYgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCAqcERzdCk7CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNWY4MmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsNDAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlSGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JUHJpbWFyeURldmljZS5oKQorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGNvbW1vbi9hbGwtdmVyc2lvbnMvVmVyc2lvblV0aWxzLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCisjaW5jbHVkZSAiSGlkbFV0aWxzLmgiCisjaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgorI2luY2x1ZGUgIlZlcnNpb25VdGlscy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkhpZGxVdGlsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OnV0aWxzOjpFbnVtQml0ZmllbGQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOworCituYW1lc3BhY2UgeworCitzdGF0dXNfdCBkZXZpY2VBZGRyZXNzRnJvbUhhbCgKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgY2hhciogaGFsQWRkcmVzcywgRGV2aWNlQWRkcmVzcyogYWRkcmVzcykgeworICAgIGFkZHJlc3MtPmRldmljZSA9IEF1ZGlvRGV2aWNlKGRldmljZSk7CisKKyAgICBpZiAoaGFsQWRkcmVzcyA9PSBudWxscHRyIHx8IHN0cm5sZW4oaGFsQWRkcmVzcywgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IChkZXZpY2UgJiBBVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwOworICAgIGlmIChpc0lucHV0KSBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCkgIT0gMCkKKyAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApICE9IDApKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKKyAgICAgICAgICAgICAgICAiJWhoWDolaGhYOiVoaFg6JWhoWDolaGhYOiVoaFgiLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLm1hY1swXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzFdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMl0sCisgICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzNdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbNF0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s1XSk7CisgICAgICAgIHJldHVybiBzdGF0dXMgPT0gNiA/IE9LIDogQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0lQKSAhPSAwKQorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9JUCkgIT0gMCkpIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAorICAgICAgICAgICAgICAgICIlaGh1LiVoaHUuJWhodS4laGh1IiwKKyAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzFdLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMl0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbM10pOworICAgICAgICByZXR1cm4gc3RhdHVzID09IDQgPyBPSyA6IEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSkgIT0gMAorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9BTExfVVNCKSkgIT0gMCkgeworICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgImNhcmQ9JWQ7ZGV2aWNlPSVkIiwKKyAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5hbHNhLmNhcmQsICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSAyID8gT0sgOiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQlVTKSAhPSAwKQorICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CVVMpICE9IDApKSB7CisgICAgICAgIGlmIChoYWxBZGRyZXNzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGFkZHJlc3MtPmJ1c0FkZHJlc3MgPSBoYWxBZGRyZXNzOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCkpICE9IDAKKyAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgIT0gMCkpIHsKKyAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgeworICAgICAgICAgICAgYWRkcmVzcy0+clN1Ym1peEFkZHJlc3MgPSBoYWxBZGRyZXNzOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0RldmljZUhhbEhpZGw6OkRldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSkKKyAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRGV2aWNlIiksIG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgICBtUHJpbWFyeURldmljZShJUHJpbWFyeURldmljZTo6Y2FzdEZyb20oZGV2aWNlKSkgeworfQorCitEZXZpY2VIYWxIaWRsOjp+RGV2aWNlSGFsSGlkbCgpIHsKKyAgICBpZiAobURldmljZSAhPSAwKSB7CisgICAgICAgIG1EZXZpY2UuY2xlYXIoKTsKKyAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QqKSB7CisgICAgLy8gT2Jzb2xldGUuCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjppbml0Q2hlY2soKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImluaXRDaGVjayIsIG1EZXZpY2UtPmluaXRDaGVjaygpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9pY2VWb2x1bWUiLCBtUHJpbWFyeURldmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyVm9sdW1lIiwgbURldmljZS0+c2V0TWFzdGVyVm9sdW1lKHZvbHVtZSkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1hc3RlclZvbHVtZSgKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgZmxvYXQgdikgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICp2b2x1bWUgPSB2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNYXN0ZXJWb2x1bWUiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNb2RlIiwgbVByaW1hcnlEZXZpY2UtPnNldE1vZGUoQXVkaW9Nb2RlKG1vZGUpKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNaWNNdXRlIiwgbURldmljZS0+c2V0TWljTXV0ZShzdGF0ZSkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWljTXV0ZSgKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgYm9vbCBtdXRlKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnN0YXRlID0gbXV0ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWljTXV0ZSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3Rlck11dGUiLCBtRGV2aWNlLT5zZXRNYXN0ZXJNdXRlKHN0YXRlKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNYXN0ZXJNdXRlKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNYXN0ZXJNdXRlIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICAvLyBUT0RPOiBjaGFuZ2UgdGhlIEFQSSBzbyB0aGF0IGNvbnRleHQgYW5kIGt2UGFpcnMgYXJlIHNlcGFyYXRlZAorICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsczo6c2V0UGFyYW1ldGVycyhtRGV2aWNlLCB7fSAvKiBjb250ZXh0ICovLCBoaWRsUGFyYW1zKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgdmFsdWVzLT5jbGVhcigpOworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gdXRpbHM6OmdldFBhcmFtZXRlcnMobURldmljZSwKKyAgICAgICAgICAgIHt9IC8qIGNvbnRleHQgKi8sCisgICAgICAgICAgICBoaWRsS2V5cywKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1RvSGFsKHBhcmFtZXRlcnMsIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFBhcmFtZXRlcnMiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldElucHV0QnVmZmVyU2l6ZSgKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLCBzaXplX3QgKnNpemUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOworICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRJbnB1dEJ1ZmZlclNpemUoCisgICAgICAgICAgICBoaWRsQ29uZmlnLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBidWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRJbnB1dEJ1ZmZlclNpemUiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIERldmljZUFkZHJlc3MgaGlkbERldmljZTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2VBZGRyZXNzRnJvbUhhbChkZXZpY2VzLCBhZGRyZXNzLCAmaGlkbERldmljZSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOworICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5PdXRwdXRTdHJlYW0oCisgICAgICAgICAgICBoYW5kbGUsCisgICAgICAgICAgICBoaWRsRGV2aWNlLAorICAgICAgICAgICAgaGlkbENvbmZpZywKKyAgICAgICAgICAgIEVudW1CaXRmaWVsZDxBdWRpb091dHB1dEZsYWc+KGZsYWdzKSwKKyNpZiBNQUpPUl9WRVJTSU9OID49IDQKKyAgICAgICAgICAgIHt9IC8qIG1ldGFkYXRhICovLAorI2VuZGlmCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1PdXQ+JiByZXN1bHQsIGNvbnN0IEF1ZGlvQ29uZmlnJiBzdWdnZXN0ZWRDb25maWcpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbEhpZGwocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuT3V0cHV0U3RyZWFtIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpvcGVuSW5wdXRTdHJlYW0oCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLAorICAgICAgICBjb25zdCBjaGFyICpvdXRwdXREZXZpY2VBZGRyZXNzLAorICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZXMsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKKyAgICBhdXRvIHNpbmtNZXRhZGF0YSA9IEF1ZGlvU291cmNlKHNvdXJjZSk7CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKKyAgICAvLyBUT0RPOiBjb3JyZWN0bHkgcHJvcGFnYXRlIHRoZSB0cmFja3Mgc291cmNlcyBhbmQgdm9sdW1lCisgICAgLy8gICAgICAgZm9yIG5vdywgb25seSBzZW5kIHRoZSBtYWluIHNvdXJjZSBhdCAxZGJmcworICAgIFNpbmtNZXRhZGF0YSBzaW5rTWV0YWRhdGEgPSB7e3sgLnNvdXJjZSA9IEF1ZGlvU291cmNlKHNvdXJjZSksIC5nYWluID0gMSB9fX07CisjZW5kaWYKKyNpZiBNQUpPUl9WRVJTSU9OIDwgNQorICAgICh2b2lkKW91dHB1dERldmljZTsKKyAgICAodm9pZClvdXRwdXREZXZpY2VBZGRyZXNzOworI2Vsc2UKKyAgICBpZiAob3V0cHV0RGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIERldmljZUFkZHJlc3MgaGlkbE91dHB1dERldmljZTsKKyAgICAgICAgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwob3V0cHV0RGV2aWNlLCBvdXRwdXREZXZpY2VBZGRyZXNzLCAmaGlkbE91dHB1dERldmljZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgICAgIHNpbmtNZXRhZGF0YS50cmFja3NbMF0uZGVzdGluYXRpb24uZGV2aWNlKHN0ZDo6bW92ZShoaWRsT3V0cHV0RGV2aWNlKSk7CisgICAgfQorI2VuZGlmCisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgIGhpZGxEZXZpY2UsCisgICAgICAgICAgICBoaWRsQ29uZmlnLAorICAgICAgICAgICAgRW51bUJpdGZpZWxkPEF1ZGlvSW5wdXRGbGFnPihmbGFncyksCisgICAgICAgICAgICBzaW5rTWV0YWRhdGEsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1Jbj4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbEhpZGwocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuSW5wdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0F1ZGlvUGF0Y2hlcyIsIG1EZXZpY2UtPnN1cHBvcnRzQXVkaW9QYXRjaGVzKCksIHN1cHBvcnRzUGF0Y2hlcyk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBoaWRsX3ZlYzxBdWRpb1BvcnRDb25maWc+IGhpZGxTb3VyY2VzLCBoaWRsU2lua3M7CisgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdzRnJvbUhhbChudW1fc291cmNlcywgc291cmNlcywgJmhpZGxTb3VyY2VzKTsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zaW5rcywgc2lua3MsICZoaWRsU2lua3MpOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgICAgICBoaWRsU291cmNlcywgaGlkbFNpbmtzLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBBdWRpb1BhdGNoSGFuZGxlIGhpZGxQYXRjaCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpwYXRjaCA9IHN0YXRpY19jYXN0PGF1ZGlvX3BhdGNoX2hhbmRsZV90PihoaWRsUGF0Y2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJjcmVhdGVBdWRpb1BhdGNoIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZWxlYXNlQXVkaW9QYXRjaCIsIG1EZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIEF1ZGlvUG9ydCBoaWRsUG9ydDsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydEZyb21IYWwoKnBvcnQsICZoaWRsUG9ydCk7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0QXVkaW9Qb3J0KAorICAgICAgICAgICAgaGlkbFBvcnQsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEF1ZGlvUG9ydCYgcCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0VG9IYWwocCwgcG9ydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUG9ydCIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgQXVkaW9Qb3J0Q29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0QXVkaW9Qb3J0Q29uZmlnIiwgbURldmljZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKGhpZGxDb25maWcpKTsKK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzSW5mbyBfX3VudXNlZCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKyNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAorc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXNJbmZvKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWljcm9waG9uZXMoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGhpZGxfdmVjPE1pY3JvcGhvbmVJbmZvPiBtaWNBcnJheUhhbCkgeworICAgICAgICByZXR2YWwgPSByOworICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IG1pY0FycmF5SGFsLnNpemUoKTsgaysrKSB7CisgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgZHN0OworICAgICAgICAgICAgLy9jb252ZXJ0CisgICAgICAgICAgICBtaWNyb3Bob25lSW5mb1RvSGFsKG1pY0FycmF5SGFsW2tdLCAmZHN0KTsKKyAgICAgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKGRzdCk7CisgICAgICAgICAgICBtaWNyb3Bob25lc0luZm8tPnB1c2hfYmFjayhtaWNyb3Bob25lKTsKKyAgICAgICAgfQorICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNaWNyb3Bob25lcyIsIHJldCwgcmV0dmFsKTsKK30KKyNlbmRpZgorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpkdW1wKGludCBmZCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOworICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2Q0NjVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lEZXZpY2UuaCkKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVByaW1hcnlEZXZpY2UuaCkKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVByaW1hcnlEZXZpY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKK3sKKyAgcHVibGljOgorICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7CisKKyAgICAvLyBNdXRpbmcgY29udHJvbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKKworICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBzaXplX3QgKnNpemUpOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCisgICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqb3V0cHV0RGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7CisKKyAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOworCisgICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7CisKKyAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKworICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCisgICAgLy8gTGlzdCBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOworICAgIHNwPElEZXZpY2U+IG1EZXZpY2U7CisgICAgc3A8SVByaW1hcnlEZXZpY2U+IG1QcmltYXJ5RGV2aWNlOyAgLy8gTnVsbCBpZiBpdCdzIG5vdCBhIHByaW1hcnkgZGV2aWNlLgorCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIGV4cGxpY2l0IERldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSk7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgorICAgIHZpcnR1YWwgfkRldmljZUhhbEhpZGwoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNjgyNTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmNwcApAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlSGFsTG9jYWwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCisjaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworRGV2aWNlSGFsTG9jYWw6OkRldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpCisgICAgICAgIDogbURldihkZXYpIHsKK30KKworRGV2aWNlSGFsTG9jYWw6On5EZXZpY2VIYWxMb2NhbCgpIHsKKyAgICBpbnQgc3RhdHVzID0gYXVkaW9faHdfZGV2aWNlX2Nsb3NlKG1EZXYpOworICAgIEFMT0dXX0lGKHN0YXR1cywgIkVycm9yIGNsb3NpbmcgYXVkaW8gaHcgZGV2aWNlICVwOiAlcyIsIG1EZXYsIHN0cmVycm9yKC1zdGF0dXMpKTsKKyAgICBtRGV2ID0gMDsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpIHsKKyAgICBpZiAobURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAqZGV2aWNlcyA9IG1EZXYtPmdldF9zdXBwb3J0ZWRfZGV2aWNlcyhtRGV2KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjppbml0Q2hlY2soKSB7CisgICAgcmV0dXJuIG1EZXYtPmluaXRfY2hlY2sobURldik7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICByZXR1cm4gbURldi0+c2V0X3ZvaWNlX3ZvbHVtZShtRGV2LCB2b2x1bWUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgeworICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7CisgICAgcmV0dXJuIG1EZXYtPnNldF9tb2RlKG1EZXYsIG1vZGUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7CisgICAgcmV0dXJuIG1EZXYtPnNldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7CisgICAgcmV0dXJuIG1EZXYtPmdldF9taWNfbXV0ZShtRGV2LCBzdGF0ZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICBpZiAobURldi0+c2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKKyAgICBpZiAobURldi0+Z2V0X21hc3Rlcl9tdXRlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl9tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgeworICAgIHJldHVybiBtRGV2LT5zZXRfcGFyYW1ldGVycyhtRGV2LCBrdlBhaXJzLnN0cmluZygpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7CisgICAgY2hhciAqaGFsVmFsdWVzID0gbURldi0+Z2V0X3BhcmFtZXRlcnMobURldiwga2V5cy5zdHJpbmcoKSk7CisgICAgaWYgKGhhbFZhbHVlcyAhPSBOVUxMKSB7CisgICAgICAgIHZhbHVlcy0+c2V0VG8oaGFsVmFsdWVzKTsKKyAgICAgICAgZnJlZShoYWxWYWx1ZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHZhbHVlcy0+Y2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgeworICAgICpzaXplID0gbURldi0+Z2V0X2lucHV0X2J1ZmZlcl9zaXplKG1EZXYsIGNvbmZpZyk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7CisgICAgYXVkaW9fc3RyZWFtX291dF90ICpoYWxTdHJlYW07CisgICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3giCisgICAgICAgICAgICAic3JhdGU6ICVkIGZvcm1hdCAlI3ggY2hhbm5lbHMgJXggYWRkcmVzcyAlcyIsCisgICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAorICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgYWRkcmVzcyk7CisgICAgaW50IG9wZW5SZXN1dCA9IG1EZXYtPm9wZW5fb3V0cHV0X3N0cmVhbSgKKyAgICAgICAgICAgIG1EZXYsIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsIGNvbmZpZywgJmhhbFN0cmVhbSwgYWRkcmVzcyk7CisgICAgaWYgKG9wZW5SZXN1dCA9PSBPSykgeworICAgICAgICAqb3V0U3RyZWFtID0gbmV3IFN0cmVhbU91dEhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7CisgICAgfQorICAgIEFMT0dWKCJvcGVuX291dHB1dF9zdHJlYW0gc3RhdHVzICVkIHN0cmVhbSAlcCIsIG9wZW5SZXN1dCwgaGFsU3RyZWFtKTsKKyAgICByZXR1cm4gb3BlblJlc3V0OworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6b3BlbklucHV0U3RyZWFtKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IC8qb3V0cHV0RGV2aWNlKi8sCisgICAgICAgIGNvbnN0IGNoYXIgKi8qb3V0cHV0RGV2aWNlQWRkcmVzcyovLAorICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7CisgICAgYXVkaW9fc3RyZWFtX2luX3QgKmhhbFN0cmVhbTsKKyAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gaGFuZGxlOiAlZCBkZXZpY2VzOiAleCBmbGFnczogJSN4ICIKKyAgICAgICAgICAgICJzcmF0ZTogJWQgZm9ybWF0ICUjeCBjaGFubmVscyAleCBhZGRyZXNzICVzIHNvdXJjZSAlZCIsCisgICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAorICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgYWRkcmVzcywgc291cmNlKTsKKyAgICBpbnQgb3BlblJlc3VsdCA9IG1EZXYtPm9wZW5faW5wdXRfc3RyZWFtKAorICAgICAgICAgICAgbURldiwgaGFuZGxlLCBkZXZpY2VzLCBjb25maWcsICZoYWxTdHJlYW0sIGZsYWdzLCBhZGRyZXNzLCBzb3VyY2UpOworICAgIGlmIChvcGVuUmVzdWx0ID09IE9LKSB7CisgICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7CisgICAgfQorICAgIEFMT0dWKCJvcGVuX2lucHV0X3N0cmVhbSBzdGF0dXMgJWQgc3RyZWFtICVwIiwgb3BlblJlc3VsdCwgaW5TdHJlYW0pOworICAgIHJldHVybiBvcGVuUmVzdWx0OworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7CisgICAgKnN1cHBvcnRzUGF0Y2hlcyA9IHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKKyAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgcmV0dXJuIG1EZXYtPmNyZWF0ZV9hdWRpb19wYXRjaCgKKyAgICAgICAgICAgICAgICBtRGV2LCBudW1fc291cmNlcywgc291cmNlcywgbnVtX3NpbmtzLCBzaW5rcywgcGF0Y2gpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgeworICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICByZXR1cm4gbURldi0+cmVsZWFzZV9hdWRpb19wYXRjaChtRGV2LCBwYXRjaCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgeworICAgIHJldHVybiBtRGV2LT5nZXRfYXVkaW9fcG9ydChtRGV2LCBwb3J0KTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgeworICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkKKyAgICAgICAgcmV0dXJuIG1EZXYtPnNldF9hdWRpb19wb3J0X2NvbmZpZyhtRGV2LCBjb25maWcpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpIHsKKyAgICBpZiAobURldi0+Z2V0X21pY3JvcGhvbmVzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzaXplX3QgYWN0dWFsX21pY3MgPSBBVURJT19NSUNST1BIT05FX01BWF9DT1VOVDsKKyAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgbWljX2FycmF5W0FVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UXTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtRGV2LT5nZXRfbWljcm9waG9uZXMobURldiwgJm1pY19hcnJheVswXSwgJmFjdHVhbF9taWNzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdHVhbF9taWNzOyBpKyspIHsKKyAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmVJbmZvID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKG1pY19hcnJheVtpXSk7CisgICAgICAgIG1pY3JvcGhvbmVzLT5wdXNoX2JhY2sobWljcm9waG9uZUluZm8pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmCisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpkdW1wKGludCBmZCkgeworICAgIHJldHVybiBtRGV2LT5kdW1wKG1EZXYsIGZkKTsKK30KKwordm9pZCBEZXZpY2VIYWxMb2NhbDo6Y2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpIHsKKyAgICBtRGV2LT5jbG9zZV9vdXRwdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9vdXQpOworfQorCit2b2lkIERldmljZUhhbExvY2FsOjpjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbikgeworICAgIG1EZXYtPmNsb3NlX2lucHV0X3N0cmVhbShtRGV2LCBzdHJlYW1faW4pOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZGI3MmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICisKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7CisKKyAgICAvLyBNdXRpbmcgY29udHJvbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKKworICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBzaXplX3QgKnNpemUpOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCisgICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqb3V0cHV0RGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7CisKKyAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOworCisgICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7CisKKyAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKworICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCisgICAgLy8gTGlzdCBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICB2b2lkIGNsb3NlT3V0cHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0ICpzdHJlYW1fb3V0KTsKKyAgICB2b2lkIGNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKTsKKworICBwcml2YXRlOgorICAgIGF1ZGlvX2h3X2RldmljZV90ICptRGV2OworCisgICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWw7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgZXhwbGljaXQgRGV2aWNlSGFsTG9jYWwoYXVkaW9faHdfZGV2aWNlX3QgKmRldik7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgorICAgIHZpcnR1YWwgfkRldmljZUhhbExvY2FsKCk7CisKKyAgICB1aW50MzJfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbURldi0+Y29tbW9uLnZlcnNpb247IH0KK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMDFlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JRGV2aWNlLmgpCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSB7CisgICAgc3A8SURldmljZXNGYWN0b3J5PiBkZWZhdWx0RmFjdG9yeXtJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKX07CisgICAgaWYgKCFkZWZhdWx0RmFjdG9yeSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRGV2aWNlc0ZhY3RvcnkvZGVmYXVsdCBzZXJ2aWNlLCB0ZXJtaW5hdGluZyBwcm9jZXNzLiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBtRGV2aWNlRmFjdG9yaWVzLnB1c2hfYmFjayhkZWZhdWx0RmFjdG9yeSk7CisgICAgaWYgKE1BSk9SX1ZFUlNJT04gPj0gNCkgeworICAgICAgICAvLyBUaGUgTVNEIGZhY3RvcnkgaXMgb3B0aW9uYWwgYW5kIG9ubHkgYXZhaWxhYmxlIHN0YXJ0aW5nIGF0IEhBTCA0LjAKKyAgICAgICAgc3A8SURldmljZXNGYWN0b3J5PiBtc2RGYWN0b3J5e0lEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZShBVURJT19IQUxfU0VSVklDRV9OQU1FX01TRCl9OworICAgICAgICBpZiAobXNkRmFjdG9yeSkgeworICAgICAgICAgICAgbURldmljZUZhY3Rvcmllcy5wdXNoX2JhY2sobXNkRmFjdG9yeSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBmYWN0b3J5IDogbURldmljZUZhY3RvcmllcykgeworICAgICAgICAvLyBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlIGluc3RhbmNlIGlzIG93bmVkCisgICAgICAgIC8vIGJ5IEF1ZGlvRmxpbmdlciBhbmQgdGh1cyBoYXZlIHRoZSBzYW1lIGxpZmVzcGFuLgorICAgICAgICBmYWN0b3J5LT5saW5rVG9EZWF0aChIYWxEZWF0aEhhbmRsZXI6OmdldEluc3RhbmNlKCksIDAgLypjb29raWUqLyk7CisgICAgfQorfQorCisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKK3N0YXRpYyBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZSBpZEZyb21IYWwoY29uc3QgY2hhciAqbmFtZSwgc3RhdHVzX3QqIHN0YXR1cykgeworICAgICpzdGF0dXMgPSBPSzsKKyAgICBpZiAoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6UFJJTUFSWTsKKyAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6QTJEUDsKKyAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9VU0IpID09IDApIHsKKyAgICAgICAgcmV0dXJuIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpVU0I7CisgICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUkVNT1RFX1NVQk1JWCkgPT0gMCkgeworICAgICAgICByZXR1cm4gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlJfU1VCTUlYOworICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1NUVUIpID09IDApIHsKKyAgICAgICAgcmV0dXJuIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpTVFVCOworICAgIH0KKyAgICBBTE9HRSgiSW52YWxpZCBkZXZpY2UgbmFtZSAlcyIsIG5hbWUpOworICAgICpzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgcmV0dXJuIHt9OworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0aWMgY29uc3QgY2hhciogaWRGcm9tSGFsKGNvbnN0IGNoYXIgKm5hbWUsIHN0YXR1c190KiBzdGF0dXMpIHsKKyAgICAqc3RhdHVzID0gT0s7CisgICAgcmV0dXJuIG5hbWU7Cit9CisjZW5kaWYKKworc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgeworICAgIGlmIChtRGV2aWNlRmFjdG9yaWVzLmVtcHR5KCkpIHJldHVybiBOT19JTklUOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBhdXRvIGhpZGxJZCA9IGlkRnJvbUhhbChuYW1lLCAmc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZhY3RvcnkgOiBtRGV2aWNlRmFjdG9yaWVzKSB7CisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBmYWN0b3J5LT5vcGVuRGV2aWNlKAorICAgICAgICAgICAgICAgIGhpZGxJZCwKKyAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElEZXZpY2U+JiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbEhpZGwocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgICAgIHN3aXRjaCAocmV0dmFsKSB7CisgICAgICAgICAgICAvLyBEZXZpY2Ugd2FzIGZvdW5kIGFuZCB3YXMgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7CisgICAgICAgICAgICAvLyBEZXZpY2Ugd2FzIGZvdW5kIGJ1dCBmYWlsZWQgdG8gaW5pdGFsaXplLgorICAgICAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgICAgICAvLyBPdGhlcndpc2UgY29udGludWUgaXRlcmF0aW5nLgorICAgICAgICAgICAgZGVmYXVsdDogOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dXKCJUaGUgc3BlY2lmaWVkIGRldmljZSBuYW1lIGlzIG5vdCByZWNvZ25pemVkOiBcIiVzXCIiLCBuYW1lKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdlMDY0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSURldmljZXNGYWN0b3J5LmgpCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZXNGYWN0b3J5OworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcworICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKKworICAgIHN0ZDo6dmVjdG9yPHNwPElEZXZpY2VzRmFjdG9yeT4+IG1EZXZpY2VGYWN0b3JpZXM7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCk7CisKKyAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSA9IGRlZmF1bHQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzM3YThiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oIgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKKyNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6OkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCkKKyAgICAgICAgOiBtTG9jYWxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkpLAorICAgICAgICAgIG1IaWRsRmFjdG9yeShuZXcgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkpIHsKK30KKworc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ6Om9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKSB7CisgICAgaWYgKG1IaWRsRmFjdG9yeSAhPSAwICYmIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCwgbmFtZSkgIT0gMCAmJgorICAgICAgICBzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0hFQVJJTkdfQUlELCBuYW1lKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBtSGlkbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKKyAgICB9CisgICAgcmV0dXJuIG1Mb2NhbEZhY3RvcnktPm9wZW5EZXZpY2UobmFtZSwgZGV2aWNlKTsKK30KKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWMwZDBkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEX0gKKworI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKKworICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcworICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKKworICBwcml2YXRlOgorICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtTG9jYWxGYWN0b3J5OworICAgIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtSGlkbEZhY3Rvcnk7Cit9OworCitzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRGV2aWNlc0ZhY3RvcnlIYWwoKSB7CisgICAgcmV0dXJuIG5ldyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjY3ZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKKyNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3N0YXRpYyBzdGF0dXNfdCBsb2FkX2F1ZGlvX2ludGVyZmFjZShjb25zdCBjaGFyICppZl9uYW1lLCBhdWRpb19od19kZXZpY2VfdCAqKmRldikKK3sKKyAgICBjb25zdCBod19tb2R1bGVfdCAqbW9kOworICAgIGludCByYzsKKworICAgIHJjID0gaHdfZ2V0X21vZHVsZV9ieV9jbGFzcyhBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsICZtb2QpOworICAgIGlmIChyYykgeworICAgICAgICBBTE9HRSgiJXMgY291bGRuJ3QgbG9hZCBhdWRpbyBodyBtb2R1bGUgJXMuJXMgKCVzKSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgc3RyZXJyb3IoLXJjKSk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICByYyA9IGF1ZGlvX2h3X2RldmljZV9vcGVuKG1vZCwgZGV2KTsKKyAgICBpZiAocmMpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNvdWxkbid0IG9wZW4gYXVkaW8gaHcgZGV2aWNlIGluICVzLiVzICglcykiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsIHN0cmVycm9yKC1yYykpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgaWYgKCgqZGV2KS0+Y29tbW9uLnZlcnNpb24gPCBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fTUlOKSB7CisgICAgICAgIEFMT0dFKCIlcyB3cm9uZyBhdWRpbyBodyBkZXZpY2UgdmVyc2lvbiAlMDR4IiwgX19mdW5jX18sICgqZGV2KS0+Y29tbW9uLnZlcnNpb24pOworICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgYXVkaW9faHdfZGV2aWNlX2Nsb3NlKCpkZXYpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworCitvdXQ6CisgICAgKmRldiA9IE5VTEw7CisgICAgcmV0dXJuIHJjOworfQorCitzdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbExvY2FsOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgeworICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXY7CisgICAgc3RhdHVzX3QgcmMgPSBsb2FkX2F1ZGlvX2ludGVyZmFjZShuYW1lLCAmZGV2KTsKKyAgICBpZiAocmMgPT0gT0spIHsKKyAgICAgICAgKmRldmljZSA9IG5ldyBEZXZpY2VIYWxMb2NhbChkZXYpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMTA4ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfSAorCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKKyAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpIHt9CisKKyAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkge30KK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2Nzk3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YXRvbWljPgorCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdEJ1ZmZlckhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvYWxsb2NhdG9yLzEuMC9JQWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoaWRsOjphbGxvY2F0b3I6OlYxXzA6OklBbGxvY2F0b3I7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlZmZlY3QgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworLy8gc3RhdGljCit1aW50NjRfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptYWtlVW5pcXVlSWQoKSB7CisgICAgc3RhdGljIHN0ZDo6YXRvbWljPHVpbnQ2NF90PiBjb3VudGVyezF9OworICAgIHJldHVybiBjb3VudGVyKys7Cit9CisKK3N0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmFsbG9jYXRlKAorICAgICAgICBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7CisgICAgcmV0dXJuIG1pcnJvcihudWxscHRyLCBzaXplLCBidWZmZXIpOworfQorCitzdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoCisgICAgICAgIHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7CisgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiB0ZW1wQnVmZmVyID0gbmV3IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZSk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KHRlbXBCdWZmZXIuZ2V0KCkpLT5pbml0KCk7CisgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICB0ZW1wQnVmZmVyLT5zZXRFeHRlcm5hbERhdGEoZXh0ZXJuYWwpOworICAgICAgICAqYnVmZmVyID0gdGVtcEJ1ZmZlcjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworRWZmZWN0QnVmZmVySGFsSGlkbDo6RWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBtQnVmZmVyU2l6ZShzaXplKSwgbUZyYW1lQ291bnRDaGFuZ2VkKGZhbHNlKSwKKyAgICAgICAgICBtRXh0ZXJuYWxEYXRhKG51bGxwdHIpLCBtQXVkaW9CdWZmZXJ7MCwge251bGxwdHJ9fSB7CisgICAgbUhpZGxCdWZmZXIuaWQgPSBtYWtlVW5pcXVlSWQoKTsKKyAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKK30KKworRWZmZWN0QnVmZmVySGFsSGlkbDo6fkVmZmVjdEJ1ZmZlckhhbEhpZGwoKSB7Cit9CisKK3N0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmluaXQoKSB7CisgICAgc3A8SUFsbG9jYXRvcj4gYXNobWVtID0gSUFsbG9jYXRvcjo6Z2V0U2VydmljZSgiYXNobWVtIik7CisgICAgaWYgKGFzaG1lbSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgYXNobWVtIGFsbG9jYXRvciBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBzdGF0dXNfdCByZXR2YWwgPSBOT19NRU1PUlk7CisgICAgUmV0dXJuPHZvaWQ+IHJlc3VsdCA9IGFzaG1lbS0+YWxsb2NhdGUoCisgICAgICAgICAgICBtQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgIFsmXShib29sIHN1Y2Nlc3MsIGNvbnN0IGhpZGxfbWVtb3J5JiBtZW1vcnkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICBtSGlkbEJ1ZmZlci5kYXRhID0gbWVtb3J5OworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmVzdWx0LmlzT2soKSAmJiByZXR2YWwgPT0gT0spIHsKKyAgICAgICAgbU1lbW9yeSA9IGhhcmR3YXJlOjptYXBNZW1vcnkobUhpZGxCdWZmZXIuZGF0YSk7CisgICAgICAgIGlmIChtTWVtb3J5ICE9IDApIHsKKyAgICAgICAgICAgIG1NZW1vcnktPnVwZGF0ZSgpOworICAgICAgICAgICAgbUF1ZGlvQnVmZmVyLnJhdyA9IHN0YXRpY19jYXN0PHZvaWQqPihtTWVtb3J5LT5nZXRQb2ludGVyKCkpOworICAgICAgICAgICAgbWVtc2V0KG1BdWRpb0J1ZmZlci5yYXcsIDAsIG1NZW1vcnktPmdldFNpemUoKSk7CisgICAgICAgICAgICBtTWVtb3J5LT5jb21taXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFwIGFsbG9jYXRlZCBhc2htZW0iKTsKKyAgICAgICAgICAgIHJldHZhbCA9IE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZnJvbSBhc2htZW0iLCAoaW50KW1CdWZmZXJTaXplKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdC5pc09rKCkgPyByZXR2YWwgOiBGQUlMRURfVFJBTlNBQ1RJT047Cit9CisKK2F1ZGlvX2J1ZmZlcl90KiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphdWRpb0J1ZmZlcigpIHsKKyAgICByZXR1cm4gJm1BdWRpb0J1ZmZlcjsKK30KKwordm9pZCogRWZmZWN0QnVmZmVySGFsSGlkbDo6ZXh0ZXJuYWxEYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtRXh0ZXJuYWxEYXRhOworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpIHsKKyAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICBtQXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gdHJ1ZTsKK30KKworYm9vbCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKSB7CisgICAgYm9vbCByZXN1bHQgPSBtRnJhbWVDb3VudENoYW5nZWQ7CisgICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gZmFsc2U7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpIHsKKyAgICBtRXh0ZXJuYWxEYXRhID0gZXh0ZXJuYWw7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKCkgeworICAgIHVwZGF0ZShtQnVmZmVyU2l6ZSk7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KCkgeworICAgIGNvbW1pdChtQnVmZmVyU2l6ZSk7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOworICAgIG1NZW1vcnktPnVwZGF0ZSgpOworICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKKyAgICBtZW1jcHkobUF1ZGlvQnVmZmVyLnJhdywgbUV4dGVybmFsRGF0YSwgc2l6ZSk7CisgICAgbU1lbW9yeS0+Y29tbWl0KCk7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOworICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKKyAgICBtZW1jcHkobUV4dGVybmFsRGF0YSwgbUF1ZGlvQnVmZmVyLnJhdywgc2l6ZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGVmZmVjdAorfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RCdWZmZXJIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgyNjgxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF9ICisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvRklMRV9WRVJTSU9OL3R5cGVzLmgpCisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVmZmVjdCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT047CisKK2NsYXNzIEVmZmVjdEJ1ZmZlckhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgc3RhdHVzX3QgYWxsb2NhdGUoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7CisgICAgc3RhdGljIHN0YXR1c190IG1pcnJvcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcik7CisKKyAgICB2aXJ0dWFsIGF1ZGlvX2J1ZmZlcl90KiBhdWRpb0J1ZmZlcigpOworICAgIHZpcnR1YWwgdm9pZCogZXh0ZXJuYWxEYXRhKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBnZXRTaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUJ1ZmZlclNpemU7IH0KKworICAgIHZpcnR1YWwgdm9pZCBzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpOworICAgIHZpcnR1YWwgdm9pZCBzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KTsKKyAgICB2aXJ0dWFsIGJvb2wgY2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKCk7CisgICAgdmlydHVhbCB2b2lkIGNvbW1pdCgpOworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoc2l6ZV90IHNpemUpOworICAgIHZpcnR1YWwgdm9pZCBjb21taXQoc2l6ZV90IHNpemUpOworCisgICAgY29uc3QgQXVkaW9CdWZmZXImIGhpZGxCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtSGlkbEJ1ZmZlcjsgfQorCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZTsKKworICAgIHN0YXRpYyB1aW50NjRfdCBtYWtlVW5pcXVlSWQoKTsKKworICAgIGNvbnN0IHNpemVfdCBtQnVmZmVyU2l6ZTsKKyAgICBib29sIG1GcmFtZUNvdW50Q2hhbmdlZDsKKyAgICB2b2lkKiBtRXh0ZXJuYWxEYXRhOworICAgIEF1ZGlvQnVmZmVyIG1IaWRsQnVmZmVyOworICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7CisgICAgYXVkaW9fYnVmZmVyX3QgbUF1ZGlvQnVmZmVyOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIGV4cGxpY2l0IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpOworCisgICAgdmlydHVhbCB+RWZmZWN0QnVmZmVySGFsSGlkbCgpOworCisgICAgc3RhdHVzX3QgaW5pdCgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGVmZmVjdAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfQlVGRkVSX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZjU3NWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsMzQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RIYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uVXRpbHMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCisjaW5jbHVkZSAiSGlkbFV0aWxzLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6dXRpbHM6OkVudW1CaXRmaWVsZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVmZmVjdCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT047CisKK0VmZmVjdEhhbEhpZGw6OkVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpCisgICAgICAgIDogbUVmZmVjdChlZmZlY3QpLCBtRWZmZWN0SWQoZWZmZWN0SWQpLCBtQnVmZmVyc0NoYW5nZWQodHJ1ZSksIG1FZkdyb3VwKG51bGxwdHIpIHsKK30KKworRWZmZWN0SGFsSGlkbDo6fkVmZmVjdEhhbEhpZGwoKSB7CisgICAgaWYgKG1FZmZlY3QgIT0gMCkgeworICAgICAgICBjbG9zZSgpOworICAgICAgICBtRWZmZWN0LmNsZWFyKCk7CisgICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgfQorICAgIGlmIChtRWZHcm91cCkgeworICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOworICAgIH0KK30KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbCgKKyAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcikgeworICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudHlwZSwgJmhhbERlc2NyaXB0b3ItPnR5cGUpOworICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudXVpZCwgJmhhbERlc2NyaXB0b3ItPnV1aWQpOworICAgIGhhbERlc2NyaXB0b3ItPmZsYWdzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRlc2NyaXB0b3IuZmxhZ3MpOworICAgIGhhbERlc2NyaXB0b3ItPmNwdUxvYWQgPSBkZXNjcmlwdG9yLmNwdUxvYWQ7CisgICAgaGFsRGVzY3JpcHRvci0+bWVtb3J5VXNhZ2UgPSBkZXNjcmlwdG9yLm1lbW9yeVVzYWdlOworICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5uYW1lLCBkZXNjcmlwdG9yLm5hbWUuZGF0YSgpLCBkZXNjcmlwdG9yLm5hbWUuc2l6ZSgpKTsKKyAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+aW1wbGVtZW50b3IsCisgICAgICAgICAgICBkZXNjcmlwdG9yLmltcGxlbWVudG9yLmRhdGEoKSwgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5zaXplKCkpOworfQorCisvLyBUT0RPKG1uYWdhbm92KTogVGhlc2UgYnVmZmVyIGNvbnZlcnNpb24gZnVuY3Rpb25zIHNob3VsZCBiZSBzaGFyZWQgd2l0aCBFZmZlY3Qgd3JhcHBlcgorLy8gdmlhIEhpZGxVdGlscy4gTW92ZSB0aGVtIHRoZXJlIHdoZW4gaGFyZHdhcmUvaW50ZXJmYWNlcyB3aWxsIGdldCB1bi1mcm96ZW4gYWdhaW4uCisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAorICAgICAgICBjb25zdCBidWZmZXJfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0QnVmZmVyQ29uZmlnKiBjb25maWcpIHsKKyAgICBjb25maWctPnNhbXBsaW5nUmF0ZUh6ID0gaGFsQ29uZmlnLnNhbXBsaW5nUmF0ZTsKKyAgICBjb25maWctPmNoYW5uZWxzID0gRW51bUJpdGZpZWxkPEF1ZGlvQ2hhbm5lbE1hc2s+KGhhbENvbmZpZy5jaGFubmVscyk7CisgICAgY29uZmlnLT5mb3JtYXQgPSBBdWRpb0Zvcm1hdChoYWxDb25maWcuZm9ybWF0KTsKKyAgICBjb25maWctPmFjY2Vzc01vZGUgPSBFZmZlY3RCdWZmZXJBY2Nlc3MoaGFsQ29uZmlnLmFjY2Vzc01vZGUpOworICAgIGNvbmZpZy0+bWFzayA9IEVudW1CaXRmaWVsZDxFZmZlY3RDb25maWdQYXJhbWV0ZXJzPihoYWxDb25maWcubWFzayk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKKyAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKSB7CisgICAgaGFsQ29uZmlnLT5idWZmZXIuZnJhbWVDb3VudCA9IDA7CisgICAgaGFsQ29uZmlnLT5idWZmZXIucmF3ID0gTlVMTDsKKyAgICBoYWxDb25maWctPnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGluZ1JhdGVIejsKKyAgICBoYWxDb25maWctPmNoYW5uZWxzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbmZpZy5jaGFubmVscyk7CisgICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICAgIGhhbENvbmZpZy0+Zm9ybWF0ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmZvcm1hdCk7CisgICAgaGFsQ29uZmlnLT5hY2Nlc3NNb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmFjY2Vzc01vZGUpOworICAgIGhhbENvbmZpZy0+bWFzayA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5tYXNrKTsKK30KKworLy8gc3RhdGljCit2b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKSB7CisgICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcuaW5wdXRDZmcsICZjb25maWctPmlucHV0Q2ZnKTsKKyAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5vdXRwdXRDZmcsICZjb25maWctPm91dHB1dENmZyk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpIHsKKyAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcuaW5wdXRDZmcsICZoYWxDb25maWctPmlucHV0Q2ZnKTsKKyAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcub3V0cHV0Q2ZnLCAmaGFsQ29uZmlnLT5vdXRwdXRDZmcpOworfQorCisvLyBzdGF0aWMKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKKyAgICBzd2l0Y2ggKHJlc3VsdCkgeworICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTOiByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9TVEFURTogcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDogcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfU1VQUE9SVEVEOiByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGNhc2UgUmVzdWx0OjpSRVNVTFRfVE9PX0JJRzogcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRJbkJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKKyAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgeworICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbUluQnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtSW5CdWZmZXIuZ2V0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbUluQnVmZmVyLT5hdWRpb0J1ZmZlcigpOworICAgICAgICB9CisgICAgfQorICAgIG1JbkJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpIHsKKyAgICBpZiAoIW1CdWZmZXJzQ2hhbmdlZCkgeworICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IG51bGxwdHIgfHwgbU91dEJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbU91dEJ1ZmZlci5nZXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtT3V0QnVmZmVyLT5hdWRpb0J1ZmZlcigpOworICAgICAgICB9CisgICAgfQorICAgIG1PdXRCdWZmZXIgPSBidWZmZXI7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzKCkgeworICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTUykpOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzUmV2ZXJzZSgpIHsKKyAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1NfUkVWRVJTRSkpOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcmVwYXJlRm9yUHJvY2Vzc2luZygpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5wcmVwYXJlRm9yUHJvY2Vzc2luZygKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTVFEZXNjcmlwdG9yU3luYzxSZXN1bHQ+JiBzdGF0dXNNUSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpICYmIHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgeworICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisgICAgaWYgKCF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8ICFtRWZHcm91cCkgeworICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3IgZWZmZWN0cyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIGVmZmVjdHMgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgRWZmZWN0SGFsSGlkbDo6bmVlZFRvUmVzZXRCdWZmZXJzKCkgeworICAgIGlmIChtQnVmZmVyc0NoYW5nZWQpIHJldHVybiB0cnVlOworICAgIGJvb2wgaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1JbkJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7CisgICAgYm9vbCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZCA9IG1PdXRCdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOworICAgIHJldHVybiBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkIHx8IG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpwcm9jZXNzSW1wbCh1aW50MzJfdCBtcUZsYWcpIHsKKyAgICBpZiAobUVmZmVjdCA9PSAwIHx8IG1JbkJ1ZmZlciA9PSAwIHx8IG1PdXRCdWZmZXIgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghbVN0YXR1c01RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yUHJvY2Vzc2luZygpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAobmVlZFRvUmVzZXRCdWZmZXJzKCkgJiYgKHN0YXR1cyA9IHNldFByb2Nlc3NCdWZmZXJzKCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgaW4gdGhlIGJ1ZmZlcnMsIGp1c3QgbmVlZCB0byBmbHVzaCBpdCBhbmQgd2FrZSB1cCB0aGUgc2VydmVyIHNpZGUuCisgICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOworICAgIG1FZkdyb3VwLT53YWtlKG1xRmxhZyk7CisgICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7CityZXRyeToKKyAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSwgJmVmU3RhdGUpOworICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpKSB7CisgICAgICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICAgICAgbVN0YXR1c01RLT5yZWFkKCZyZXR2YWwpOworICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0sgfHwgcmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9TVEFURSkgeworICAgICAgICAgICAgLy8gU3luYyBiYWNrIHRoZSBjaGFuZ2VkIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuYWx5emVSZXN1bHQocmV0dmFsKTsKKyAgICB9CisgICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKKyAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldFByb2Nlc3NCdWZmZXJzKCkgeworICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPnNldFByb2Nlc3NCdWZmZXJzKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1JbkJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtT3V0QnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpKTsKKyAgICBpZiAocmV0LmlzT2soKSAmJiByZXQgPT0gUmVzdWx0OjpPSykgeworICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKKyAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgeworICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOworCisgICAgLy8gU3BlY2lhbCBjYXNlcy4KKyAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRSkgeworICAgICAgICByZXR1cm4gc2V0Q29uZmlnSW1wbChjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKyAgICB9IGVsc2UgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0UpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbmZpZ0ltcGwoY21kQ29kZSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKyAgICB9CisKKyAgICAvLyBDb21tb24gY2FzZS4KKyAgICBoaWRsX3ZlYzx1aW50OF90PiBoaWRsRGF0YTsKKyAgICBpZiAocENtZERhdGEgIT0gbnVsbHB0ciAmJiBjbWRTaXplID4gMCkgeworICAgICAgICBoaWRsRGF0YS5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHBDbWREYXRhKSwgY21kU2l6ZSk7CisgICAgfQorICAgIHN0YXR1c190IHN0YXR1czsKKyAgICB1aW50MzJfdCByZXBseVNpemVTdHViID0gMDsKKyAgICBpZiAocmVwbHlTaXplID09IG51bGxwdHIgfHwgcFJlcGx5RGF0YSA9PSBudWxscHRyKSByZXBseVNpemUgPSAmcmVwbHlTaXplU3R1YjsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Y29tbWFuZChjbWRDb2RlLCBoaWRsRGF0YSwgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgIFsmXShpbnQzMl90IHMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKnJlcGx5U2l6ZSA+IHJlc3VsdC5zaXplKCkpICpyZXBseVNpemUgPSByZXN1bHQuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSAhPSBudWxscHRyICYmICpyZXBseVNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgJnJlc3VsdFswXSwgKnJlcGx5U2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcmV0LmlzT2soKSA/IHN0YXR1cyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+Z2V0RGVzY3JpcHRvcigKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjbG9zZSgpIHsKKyAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5jbG9zZSgpOworICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpkdW1wKGludCBmZCkgeworICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOworICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgcmV0dXJuIHJldC5pc09rKCkgPyBPSyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Z2V0Q29uZmlnSW1wbCgKKyAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgeworICAgIGlmIChyZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGF0dXNfdCByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgUmV0dXJuPHZvaWQ+IHJldDsKKyAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUcpIHsKKyAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnKFsmXSAoUmVzdWx0IHIsIGNvbnN0IEVmZmVjdENvbmZpZyAmaGlkbENvbmZpZykgeworICAgICAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyKTsKKyAgICAgICAgICAgIGlmIChyID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICBlZmZlY3RDb25maWdUb0hhbChoaWRsQ29uZmlnLCBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwUmVwbHlEYXRhKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IG1FZmZlY3QtPmdldENvbmZpZ1JldmVyc2UoWyZdIChSZXN1bHQgciwgY29uc3QgRWZmZWN0Q29uZmlnICZoaWRsQ29uZmlnKSB7CisgICAgICAgICAgICByZXN1bHQgPSBhbmFseXplUmVzdWx0KHIpOworICAgICAgICAgICAgaWYgKHIgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgIGVmZmVjdENvbmZpZ1RvSGFsKGhpZGxDb25maWcsIHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBSZXBseURhdGEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldENvbmZpZ0ltcGwoCisgICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CisgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fAorICAgICAgICAgICAgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGNvbnN0IGVmZmVjdF9jb25maWdfdCAqaGFsQ29uZmlnID0gc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocENtZERhdGEpOworICAgIGlmIChoYWxDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAhPSBOVUxMIHx8CisgICAgICAgICAgICBoYWxDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgIT0gTlVMTCB8fAorICAgICAgICAgICAgaGFsQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICE9IE5VTEwgfHwKKyAgICAgICAgICAgIGhhbENvbmZpZy0+b3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQnVmZmVyIHByb3ZpZGVyIGNhbGxiYWNrcyBhcmUgbm90IHN1cHBvcnRlZCIpOworICAgIH0KKyAgICBFZmZlY3RDb25maWcgaGlkbENvbmZpZzsKKyAgICBlZmZlY3RDb25maWdGcm9tSGFsKCpoYWxDb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJRyA/CisgICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWcoaGlkbENvbmZpZywgbnVsbHB0ciwgbnVsbHB0cikgOgorICAgICAgICAgICAgbUVmZmVjdC0+c2V0Q29uZmlnUmV2ZXJzZShoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyZXQpOworICAgICAgICAqc3RhdGljX2Nhc3Q8aW50MzJfdCo+KHBSZXBseURhdGEpID0gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgZWZmZWN0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMjM4YzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF9ICisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvRklMRV9WRVJTSU9OL0lFZmZlY3QuaCkKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxmbXEvRXZlbnRGbGFnLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0IHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjsKKworY2xhc3MgRWZmZWN0SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIFNldCB0aGUgaW5wdXQgYnVmZmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKTsKKworICAgIC8vIFNldCB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpOworCisgICAgLy8gRWZmZWN0IHByb2Nlc3MgZnVuY3Rpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzKCk7CisKKyAgICAvLyBQcm9jZXNzIHJldmVyc2Ugc3RyZWFtIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGFzcworICAgIC8vIGEgcmVmZXJlbmNlIHN0cmVhbSB0byB0aGUgZWZmZWN0IGVuZ2luZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3NSZXZlcnNlKCk7CisKKyAgICAvLyBTZW5kIGEgY29tbWFuZCBhbmQgcmVjZWl2ZSBhIHJlc3BvbnNlIHRvL2Zyb20gZWZmZWN0IGVuZ2luZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbW1hbmQodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKKworICAgIC8vIFJldHVybnMgdGhlIGVmZmVjdCBkZXNjcmlwdG9yLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7CisKKyAgICAvLyBGcmVlIHJlc291cmNlcyBvbiB0aGUgcmVtb3RlIHNpZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpOworCisgICAgLy8gV2hldGhlciBpdCdzIGEgbG9jYWwgaW1wbGVtZW50YXRpb24uCisgICAgdmlydHVhbCBib29sIGlzTG9jYWwoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICB1aW50NjRfdCBlZmZlY3RJZCgpIGNvbnN0IHsgcmV0dXJuIG1FZmZlY3RJZDsgfQorCisgICAgc3RhdGljIHZvaWQgZWZmZWN0RGVzY3JpcHRvclRvSGFsKAorICAgICAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcik7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlc3VsdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROworCisgICAgc3A8SUVmZmVjdD4gbUVmZmVjdDsKKyAgICBjb25zdCB1aW50NjRfdCBtRWZmZWN0SWQ7CisgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBtSW5CdWZmZXI7CisgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBtT3V0QnVmZmVyOworICAgIGJvb2wgbUJ1ZmZlcnNDaGFuZ2VkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROworICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgYW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCk7CisgICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKKyAgICAgICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZyk7CisgICAgc3RhdGljIHZvaWQgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCisgICAgICAgICAgICBjb25zdCBFZmZlY3RCdWZmZXJDb25maWcmIGNvbmZpZywgYnVmZmVyX2NvbmZpZ190KiBoYWxDb25maWcpOworICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKTsKKyAgICBzdGF0aWMgdm9pZCBlZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIEVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpOworCisgICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSByZWxlYXNlcyB0aGUgZWZmZWN0LgorICAgIHZpcnR1YWwgfkVmZmVjdEhhbEhpZGwoKTsKKworICAgIHN0YXR1c190IGdldENvbmZpZ0ltcGwodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7CisgICAgc3RhdHVzX3QgcHJlcGFyZUZvclByb2Nlc3NpbmcoKTsKKyAgICBib29sIG5lZWRUb1Jlc2V0QnVmZmVycygpOworICAgIHN0YXR1c190IHByb2Nlc3NJbXBsKHVpbnQzMl90IG1xRmxhZyk7CisgICAgc3RhdHVzX3Qgc2V0Q29uZmlnSW1wbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAorICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7CisgICAgc3RhdHVzX3Qgc2V0UHJvY2Vzc0J1ZmZlcnMoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBlZmZlY3QKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmQ2YmRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorCisjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgiCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgorI2luY2x1ZGUgIkhpZGxVdGlscy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkhpZGxVdGlsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVmZmVjdCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT047CisKK0VmZmVjdHNGYWN0b3J5SGFsSGlkbDo6RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCkgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRWZmZWN0c0ZhY3RvcnkiKSB7CisgICAgbUVmZmVjdHNGYWN0b3J5ID0gSUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7CisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb2J0YWluIElFZmZlY3RzRmFjdG9yeSBzZXJ2aWNlLCB0ZXJtaW5hdGluZyBwcm9jZXNzLiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeUFsbERlc2NyaXB0b3JzKCkgeworICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldEFsbERlc2NyaXB0b3JzKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3REZXNjcmlwdG9ycyA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICByZXR1cm4gcmV0dmFsID09IFJlc3VsdDo6T0sgPyBPSyA6IE5PX0lOSVQ7CisgICAgfQorICAgIG1MYXN0RGVzY3JpcHRvcnMucmVzaXplKDApOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKSB7CisgICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7CisgICAgaWYgKHF1ZXJ5UmVzdWx0ID09IE9LKSB7CisgICAgICAgICpwTnVtRWZmZWN0cyA9IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpOworICAgIH0KKyAgICByZXR1cm4gcXVlcnlSZXN1bHQ7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKKyAgICAgICAgdWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgLy8gVE9ETzogV2UgbmVlZCBzb21laG93IHRvIHRyYWNrIHRoZSBjaGFuZ2VzIG9uIHRoZSBzZXJ2ZXIgc2lkZQorICAgIC8vIG9yIGZpZ3VyZSBvdXQgaG93IHRvIGNvbnZlcnQgZXZlcnlib2R5IHRvIHF1ZXJ5IGFsbCB0aGUgZGVzY3JpcHRvcnMgYXQgb25jZS4KKyAgICAvLyBUT0RPOiBjaGVjayBmb3IgbnVsbHB0cgorICAgIGlmIChtTGFzdERlc2NyaXB0b3JzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHN0YXR1c190IHF1ZXJ5UmVzdWx0ID0gcXVlcnlBbGxEZXNjcmlwdG9ycygpOworICAgICAgICBpZiAocXVlcnlSZXN1bHQgIT0gT0spIHJldHVybiBxdWVyeVJlc3VsdDsKKyAgICB9CisgICAgaWYgKGluZGV4ID49IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKG1MYXN0RGVzY3JpcHRvcnNbaW5kZXhdLCBwRGVzY3JpcHRvcik7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmdldERlc2NyaXB0b3IoCisgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBVdWlkIGhpZGxVdWlkOworICAgIEhpZGxVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5nZXREZXNjcmlwdG9yKGhpZGxVdWlkLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7CisgICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpjcmVhdGVFZmZlY3QoCisgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAorICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpIHsKKyAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOworICAgIFV1aWQgaGlkbFV1aWQ7CisgICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmNyZWF0ZUVmZmVjdCgKKyAgICAgICAgICAgIGhpZGxVdWlkLCBzZXNzaW9uSWQsIGlvSWQsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElFZmZlY3Q+JiByZXN1bHQsIHVpbnQ2NF90IGVmZmVjdElkKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmVmZmVjdCA9IG5ldyBFZmZlY3RIYWxIaWRsKHJlc3VsdCwgZWZmZWN0SWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOworICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6ZHVtcEVmZmVjdHMoaW50IGZkKSB7CisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6YWxsb2NhdGUoc2l6ZSwgYnVmZmVyKTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjptaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKGV4dGVybmFsLCBzaXplLCBidWZmZXIpOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgZWZmZWN0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTE3OGZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMX0gKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC9GSUxFX1ZFUlNJT04vSUVmZmVjdHNGYWN0b3J5LmgpCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0L0ZJTEVfVkVSU0lPTi90eXBlcy5oKQorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0IHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpDUFBfVkVSU0lPTjo6Q29udmVyc2lvbkhlbHBlckhpZGw7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT047CisKK2NsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCit7CisgIHB1YmxpYzoKKyAgICBFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgZWZmZWN0cyBpbiBhbGwgbG9hZGVkIGxpYnJhcmllcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpOworCisgICAgLy8gUmV0dXJucyBhIGRlc2NyaXB0b3Igb2YgdGhlIG5leHQgYXZhaWxhYmxlIGVmZmVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IodWludDMyX3QgaW5kZXgsCisgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCisgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7CisKKyAgICAvLyBDcmVhdGVzIGFuIGVmZmVjdCBlbmdpbmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgorICAgIC8vIFRvIHJlbGVhc2UgdGhlIGVmZmVjdCBlbmdpbmUsIGl0IGlzIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMKKyAgICAvLyB0byB0aGUgcmV0dXJuZWQgZWZmZWN0IG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKKyAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCisgICAgICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wRWZmZWN0cyhpbnQgZmQpOworCisgICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgbWlycm9yQnVmZmVyKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIHNwPElFZmZlY3RzRmFjdG9yeT4gbUVmZmVjdHNGYWN0b3J5OworICAgIGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+IG1MYXN0RGVzY3JpcHRvcnM7CisKKyAgICBzdGF0dXNfdCBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Cit9OworCitzcDxFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRWZmZWN0c0ZhY3RvcnlIYWwoKSB7CisgICAgcmV0dXJuIG5ldyBFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGVmZmVjdAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM5NmNmMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5jcHAKQEAgLTAsMCArMSw4ODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbU91dENhbGxiYWNrLmgpCisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCisjaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgorI2luY2x1ZGUgIlZlcnNpb25VdGlscy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKwordXNpbmcgRWZmZWN0SGFsSGlkbCA9IDo6YW5kcm9pZDo6ZWZmZWN0OjpDUFBfVkVSU0lPTjo6RWZmZWN0SGFsSGlkbDsKK3VzaW5nIFJlYWRDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtSW46OlJlYWRDb21tYW5kOworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOworCitTdHJlYW1IYWxIaWRsOjpTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSkKKyAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiU3RyZWFtIiksCisgICAgICAgICAgbVN0cmVhbShzdHJlYW0pLAorICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eShIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpLAorICAgICAgICAgIG1DYWNoZWRCdWZmZXJTaXplKDApeworCisgICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgorICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7CisgICAgICAgIC8vIE9idGFpbiBhdWRpbyBwcm9wZXJ0aWVzIChzZWUgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKCkgYmVsb3cpLgorICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgICAgIFsmXShhdXRvIHNyLCBhdXRvIG0sIGF1dG8gZikgeworICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKKyAgICAgICAgICAgIH0pOworICAgIH0KK30KKworU3RyZWFtSGFsSGlkbDo6flN0cmVhbUhhbEhpZGwoKSB7CisgICAgbVN0cmVhbSA9IG51bGxwdHI7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRTYW1wbGVSYXRlIiwgbVN0cmVhbS0+Z2V0U2FtcGxlUmF0ZSgpLCByYXRlKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oImdldEJ1ZmZlclNpemUiLCBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCksIHNpemUpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUgPSAqc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDaGFubmVsTWFzayIsIG1TdHJlYW0tPmdldENoYW5uZWxNYXNrKCksIG1hc2spOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZvcm1hdCIsIG1TdHJlYW0tPmdldEZvcm1hdCgpLCBmb3JtYXQpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgYXV0byBtLCBhdXRvIGYpIHsKKyAgICAgICAgICAgICAgICAqc2FtcGxlUmF0ZSA9IHNyOworICAgICAgICAgICAgICAgICptYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pOworICAgICAgICAgICAgICAgICpmb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZik7CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qcm9wZXJ0aWVzIiwgcmV0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHM6OnNldFBhcmFtZXRlcnMobVN0cmVhbSwge30gLyogY29udGV4dCAqLywgaGlkbFBhcmFtcykpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgeworICAgIHZhbHVlcy0+Y2xlYXIoKTsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gdXRpbHM6OmdldFBhcmFtZXRlcnMoCisgICAgICAgICAgICBtU3RyZWFtLAorICAgICAgICAgICAge30gLyogY29udGV4dCAqLywKKyAgICAgICAgICAgIGhpZGxLZXlzLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiYWRkRWZmZWN0IiwgbVN0cmVhbS0+YWRkRWZmZWN0KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZW1vdmVFZmZlY3QiLCBtU3RyZWFtLT5yZW1vdmVFZmZlY3QoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YW5kYnkoKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhbmRieSIsIG1TdHJlYW0tPnN0YW5kYnkoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmRlYnVnKGhpZGxIYW5kbGUsIHt9IC8qIG9wdGlvbnMgKi8pOworICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOworICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YXJ0KCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YXJ0IiwgbVN0cmVhbS0+c3RhcnQoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0b3AoKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RvcCIsIG1TdHJlYW0tPnN0b3AoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Y3JlYXRlTW1hcEJ1ZmZlcigKKyAgICAgICAgICAgIG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBCdWZmZXJJbmZvJiBoaWRsSW5mbykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGUgKmhhbmRsZSA9IGhpZGxJbmZvLnNoYXJlZE1lbW9yeS5oYW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+bnVtRmRzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9mZCA9IGhhbmRsZS0+ZGF0YVswXTsKKyNpZiBNQUpPUl9WRVJTSU9OID49IDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzID0gYXVkaW9fbW1hcF9idWZmZXJfZmxhZyhoaWRsSW5mby5mbGFncyk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyA9IGhpZGxJbmZvLmJ1ZmZlclNpemVGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWdhdGl2ZSBidWZmZXIgc2l6ZSBmcmFtZSB3YXMgYSBoYWNrIGluIE8gYW5kIFAgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRoYXQgdGhlIGJ1ZmZlciBpcyBzaGFyZWFibGUgdG8gYXBwbGljYXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyAqPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyA9IGF1ZGlvX21tYXBfYnVmZmVyX2ZsYWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyB8IEFVRElPX01NQVBfQVBQTElDQVRJT05fU0hBUkVBQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1cnN0X3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVyc3RTaXplRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mby0+c2hhcmVkX21lbW9yeV9hZGRyZXNzIGlzIG5vdCBuZWVkZWQgaW4gSElETCBjb250ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiY3JlYXRlTW1hcEJ1ZmZlciIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgeworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE1tYXBQb3NpdGlvbigKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcFBvc2l0aW9uJiBoaWRsUG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi0+dGltZV9uYW5vc2Vjb25kcyA9IGhpZGxQb3NpdGlvbi50aW1lTmFub3NlY29uZHM7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT5wb3NpdGlvbl9mcmFtZXMgPSBoaWRsUG9zaXRpb24ucG9zaXRpb25GcmFtZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1tYXBQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KSB7CisgICAgbUhhbFRocmVhZFByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgeworICAgIGlmIChtQ2FjaGVkQnVmZmVyU2l6ZSAhPSAwKSB7CisgICAgICAgICpzaXplID0gbUNhY2hlZEJ1ZmZlclNpemU7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIGdldEJ1ZmZlclNpemUoc2l6ZSk7Cit9CisKK2Jvb2wgU3RyZWFtSGFsSGlkbDo6cmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpIHsKKyAgICBpZiAobUhhbFRocmVhZFByaW9yaXR5ID09IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaW50IGVyciA9IHJlcXVlc3RQcmlvcml0eSgKKyAgICAgICAgICAgIHRocmVhZFBpZCwgdGhyZWFkSWQsCisgICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIGZhbHNlIC8qaXNGb3JBcHAqLywgdHJ1ZSAvKmFzeW5jaHJvbm91cyovKTsKKyAgICBBTE9HRV9JRihlcnIsICJmYWlsZWQgdG8gc2V0IHByaW9yaXR5ICVkIGZvciBwaWQgJWQgdGlkICVkOyBlcnJvciAlZCIsCisgICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIHRocmVhZFBpZCwgdGhyZWFkSWQsIGVycik7CisgICAgLy8gQXVkaW8gd2lsbCBzdGlsbCB3b3JrLCBidXQgbGF0ZW5jeSB3aWxsIGJlIGhpZ2hlciBhbmQgc29tZXRpbWVzIHVuYWNjZXB0YWJsZS4KKyAgICByZXR1cm4gZXJyID09IDA7Cit9CisKK25hbWVzcGFjZSB7CisKKy8qIE5vdGVzIG9uIGNhbGxiYWNrIG93bmVyc2hpcC4KKworVGhpcyBpcyBob3cgKEh3KUJpbmRlciBvd25lcnNoaXAgbW9kZWwgbG9va3MgbGlrZS4gVGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgoraXMgb3duZWQgYnkgQmluZGVyIGZyYW1ld29yayAodmlhIHNwPD4pLiBQcm94aWVzIGFyZSBvd25lZCBieSBjbGllbnRzLgorV2hlbiB0aGUgbGFzdCBwcm94eSBkaXNhcHBlYXJzLCBCaW5kZXIgZnJhbWV3b3JrIHJlbGVhc2VzIHRoZSBzZXJ2ZXIgaW1wbC4KKworVGh1cywgaXQgaXMgbm90IG5lZWRlZCB0byBrZWVwIGFueSByZWZlcmVuY2VzIHRvIFN0cmVhbU91dENhbGxiYWNrICh0aGlzIGlzCit0aGUgc2VydmVyIGltcGwpIC0tIGl0IHdpbGwgbGl2ZSBhcyBsb25nIGFzIEhBTCBzZXJ2ZXIgaG9sZHMgYSBzdHJvbmcgcmVmIHRvCitJU3RyZWFtT3V0Q2FsbGJhY2sgcHJveHkuIFdlIGNsZWFyIHRoYXQgcmVmZXJlbmNlIGJ5IGNhbGxpbmcgJ2NsZWFyQ2FsbGJhY2snCitmcm9tIHRoZSBkZXN0cnVjdG9yIG9mIFN0cmVhbU91dEhhbEhpZGwuCisKK1RoZSBjYWxsYmFjayBvbmx5IGtlZXBzIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBvd25lZAorYnkgQXVkaW9GbGluZ2VyLgorCisqLworCitzdHJ1Y3QgU3RyZWFtT3V0Q2FsbGJhY2sgOiBwdWJsaWMgSVN0cmVhbU91dENhbGxiYWNrIHsKKyAgICBTdHJlYW1PdXRDYWxsYmFjayhjb25zdCB3cDxTdHJlYW1PdXRIYWxIaWRsPiYgc3RyZWFtKSA6IG1TdHJlYW0oc3RyZWFtKSB7fQorCisgICAgLy8gSVN0cmVhbU91dENhbGxiYWNrIGltcGxlbWVudGF0aW9uCisgICAgUmV0dXJuPHZvaWQ+IG9uV3JpdGVSZWFkeSgpICBvdmVycmlkZSB7CisgICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOworICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKKyAgICAgICAgICAgIHN0cmVhbS0+b25Xcml0ZVJlYWR5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gb25EcmFpblJlYWR5KCkgIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzdHJlYW0gIT0gMCkgeworICAgICAgICAgICAgc3RyZWFtLT5vbkRyYWluUmVhZHkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBvbkVycm9yKCkgIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzdHJlYW0gIT0gMCkgeworICAgICAgICAgICAgc3RyZWFtLT5vbkVycm9yKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB3cDxTdHJlYW1PdXRIYWxIaWRsPiBtU3RyZWFtOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK1N0cmVhbU91dEhhbEhpZGw6OlN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSkKKyAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVdyaXRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgeworfQorCitTdHJlYW1PdXRIYWxIaWRsOjp+U3RyZWFtT3V0SGFsSGlkbCgpIHsKKyAgICBpZiAobVN0cmVhbSAhPSAwKSB7CisgICAgICAgIGlmIChtQ2FsbGJhY2sudW5zYWZlX2dldCgpKSB7CisgICAgICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbGVhckNhbGxiYWNrIiwgbVN0cmVhbS0+Y2xlYXJDYWxsYmFjaygpKTsKKyAgICAgICAgfQorICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOworICAgICAgICBtU3RyZWFtLmNsZWFyKCk7CisgICAgfQorICAgIG1DYWxsYmFjay5jbGVhcigpOworICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgaWYgKG1FZkdyb3VwKSB7CisgICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKKyAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCisgICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfTEFURU5DWSwgImdldExhdGVuY3kiLCBudWxscHRyLCAwLAorICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKmxhdGVuY3kgPSB3cml0ZVN0YXR1cy5yZXBseS5sYXRlbmN5TXM7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldExhdGVuY3kiLCBtU3RyZWFtLT5nZXRMYXRlbmN5KCksIGxhdGVuY3kpOworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvbHVtZSIsIG1TdHJlYW0tPnNldFZvbHVtZShsZWZ0LCByaWdodCkpOworfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RkOjp2ZWN0b3I8UGFyYW1ldGVyVmFsdWU+IHBhcmFtZXRlcnM7CisgICAgU3RyaW5nOCBoYWxQYXJhbWV0ZXJzOworICAgIHBhcmFtZXRlcnMucHVzaF9iYWNrKHtBdWRpb1BhcmFtZXRlcjo6a2V5UHJlc2VudGF0aW9uSWQsIHN0ZDo6dG9fc3RyaW5nKHByZXNlbnRhdGlvbklkKX0pOworICAgIHBhcmFtZXRlcnMucHVzaF9iYWNrKHtBdWRpb1BhcmFtZXRlcjo6a2V5UHJvZ3JhbUlkLCBzdGQ6OnRvX3N0cmluZyhwcm9ncmFtSWQpfSk7CisgICAgcGFyYW1ldGVyc1RvSGFsKGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPihwYXJhbWV0ZXJzKSwgJmhhbFBhcmFtZXRlcnMpOworICAgIHJldHVybiBzZXRQYXJhbWV0ZXJzKGhhbFBhcmFtZXRlcnMpOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNlbGVjdFByZXNlbnRhdGlvbiIsCisgICAgICAgICAgICBtU3RyZWFtLT5zZWxlY3RQcmVzZW50YXRpb24ocHJlc2VudGF0aW9uSWQsIHByb2dyYW1JZCkpOworfQorI2VuZGlmCisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICAqd3JpdHRlbiA9IDA7CisKKyAgICBpZiAoYnl0ZXMgPT0gMCAmJiAhbURhdGFNUSkgeworICAgICAgICAvLyBDYW4ndCBkZXRlcm1pbmUgdGhlIHNpemUgZm9yIHRoZSBNUSBidWZmZXIuIFdhaXQgZm9yIGEgbm9uLWVtcHR5IHdyaXRlIHJlcXVlc3QuCisgICAgICAgIEFMT0dXX0lGKG1DYWxsYmFjay51bnNhZmVfZ2V0KCksICJGaXJzdCBjYWxsIHRvIGFzeW5jIHdyaXRlIHdpdGggMCBieXRlcyIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghbURhdGFNUSkgeworICAgICAgICAvLyBJbiBjYXNlIGlmIHBsYXliYWNrIHN0YXJ0cyBjbG9zZSB0byB0aGUgZW5kIG9mIGEgY29tcHJlc3NlZCB0cmFjaywgdGhlIGJ5dGVzCisgICAgICAgIC8vIHRoYXQgbmVlZCB0byBiZSB3cml0dGVuIGlzIGxlc3MgdGhhbiB0aGUgYWN0dWFsIGJ1ZmZlciBzaXplLiBOZWVkIHRvIHVzZQorICAgICAgICAvLyBmdWxsIGJ1ZmZlciBzaXplIGZvciB0aGUgTVEgc2luY2Ugb3RoZXJ3aXNlIGFmdGVyIHNlZWtpbmcgYmFjayB0byB0aGUgbWlkZGxlCisgICAgICAgIC8vIGRhdGEgd2lsbCBiZSB0cnVuY2F0ZWQuCisgICAgICAgIHNpemVfdCBidWZmZXJTaXplOworICAgICAgICBpZiAoKHN0YXR1cyA9IGdldENhY2hlZEJ1ZmZlclNpemUoJmJ1ZmZlclNpemUpKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnl0ZXMgPiBidWZmZXJTaXplKSBidWZmZXJTaXplID0gYnl0ZXM7CisgICAgICAgIGlmICgoc3RhdHVzID0gcHJlcGFyZUZvcldyaXRpbmcoYnVmZmVyU2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzID0gY2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6V1JJVEUsICJ3cml0ZSIsIHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIpLCBieXRlcywKKyAgICAgICAgICAgIFsmXSAoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVN0YXR1cy5yZXBseS53cml0dGVuOworICAgICAgICAgICAgICAgIC8vIERpYWdub3N0aWNzIG9mIHRoZSBjYXVzZSBvZiBiLzM1ODEzMTEzLgorICAgICAgICAgICAgICAgIEFMT0dFX0lGKCp3cml0dGVuID4gYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAiaGFsIHJlcG9ydHMgbW9yZSBieXRlcyB3cml0dGVuIHRoYW4gYXNrZWQgZm9yOiAlbGxkID4gJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSp3cml0dGVuLCAobG9uZyBsb25nKWJ5dGVzKTsKKyAgICAgICAgICAgIH0pOworICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Y2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKKyAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFTaXplLCBTdHJlYW1PdXRIYWxIaWRsOjpXcml0ZXJDYWxsYmFjayBjYWxsYmFjaykgeworICAgIGlmICghbUNvbW1hbmRNUS0+d3JpdGUoJmNtZCkpIHsKKyAgICAgICAgQUxPR0UoImNvbW1hbmQgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CisgICAgaWYgKGRhdGEgIT0gbnVsbHB0cikgeworICAgICAgICBzaXplX3QgYXZhaWxhYmxlVG9Xcml0ZSA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgaWYgKGRhdGFTaXplID4gYXZhaWxhYmxlVG9Xcml0ZSkgeworICAgICAgICAgICAgQUxPR1coInRydW5jYXRpbmcgd3JpdGUgZGF0YSBmcm9tICVsbGQgdG8gJWxsZCBkdWUgdG8gaW5zdWZmaWNpZW50IGRhdGEgcXVldWUgc3BhY2UiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWRhdGFTaXplLCAobG9uZyBsb25nKWF2YWlsYWJsZVRvV3JpdGUpOworICAgICAgICAgICAgZGF0YVNpemUgPSBhdmFpbGFibGVUb1dyaXRlOworICAgICAgICB9CisgICAgICAgIGlmICghbURhdGFNUS0+d3JpdGUoZGF0YSwgZGF0YVNpemUpKSB7CisgICAgICAgICAgICBBTE9HRSgiZGF0YSBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUVmR3JvdXAtPndha2Uoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpKTsKKworICAgIC8vIFRPRE86IFJlbW92ZSBtYW51YWwgZXZlbnQgZmxhZyBoYW5kbGluZyBvbmNlIGJsb2NraW5nIE1RIGlzIGltcGxlbWVudGVkLiBiLzMzODE1NDIyCisgICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7CityZXRyeToKKyAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSwgJmVmU3RhdGUpOworICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCkpIHsKKyAgICAgICAgV3JpdGVTdGF0dXMgd3JpdGVTdGF0dXM7CisgICAgICAgIHdyaXRlU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmd3JpdGVTdGF0dXMpKSB7CisgICAgICAgICAgICBBTE9HRSgic3RhdHVzIG1lc3NhZ2UgcmVhZCBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmICh3cml0ZVN0YXR1cy5yZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgcmV0ID0gT0s7CisgICAgICAgICAgICBjYWxsYmFjayh3cml0ZVN0YXR1cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBwcm9jZXNzUmV0dXJuKGNtZE5hbWUsIHdyaXRlU3RhdHVzLnJldHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKKyAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gdGVtcENvbW1hbmRNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiB0ZW1wRGF0YU1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROworICAgIFJlc3VsdCByZXR2YWw7CisgICAgcGlkX3QgaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnByZXBhcmVGb3JXcml0aW5nKAorICAgICAgICAgICAgMSwgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE1ROjpEZXNjcmlwdG9yJiBjb21tYW5kTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFNUTo6RGVzY3JpcHRvciYgZGF0YU1RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNNUTo6RGVzY3JpcHRvciYgc3RhdHVzTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEluZm8mIGhhbFRocmVhZEluZm8pIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICB0ZW1wQ29tbWFuZE1RLnJlc2V0KG5ldyBDb21tYW5kTVEoY29tbWFuZE1RKSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhTVEucmVzZXQobmV3IERhdGFNUShkYXRhTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOworICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInByZXBhcmVGb3JXcml0aW5nIiwgcmV0LCByZXR2YWwpOworICAgIH0KKyAgICBpZiAoIXRlbXBDb21tYW5kTVEgfHwgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIXRlbXBEYXRhTVEgfHwgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICFtRWZHcm91cCkgeworICAgICAgICBBTE9HRV9JRighdGVtcENvbW1hbmRNUSwgIkZhaWxlZCB0byBvYnRhaW4gY29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBDb21tYW5kTVEgJiYgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSwKKyAgICAgICAgICAgICAgICAiQ29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBEYXRhTVEsICJGYWlsZWQgdG8gb2J0YWluIGRhdGEgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wRGF0YU1RICYmICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCksICJEYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIHdyaXRpbmcgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkoaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQpOworCisgICAgbUNvbW1hbmRNUSA9IHN0ZDo6bW92ZSh0ZW1wQ29tbWFuZE1RKTsKKyAgICBtRGF0YU1RID0gc3RkOjptb3ZlKHRlbXBEYXRhTVEpOworICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOworICAgIG1Xcml0ZXJDbGllbnQgPSBnZXR0aWQoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRSZW5kZXJQb3NpdGlvbigKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDMyX3QgZCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpkc3BGcmFtZXMgPSBkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZW5kZXJQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE5leHRXcml0ZVRpbWVzdGFtcCgKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaW50NjRfdCB0KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnRpbWVzdGFtcCA9IHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFJlbmRlclBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm9jZXNzUmV0dXJuKAorICAgICAgICAgICAgInNldENhbGxiYWNrIiwgbVN0cmVhbS0+c2V0Q2FsbGJhY2sobmV3IFN0cmVhbU91dENhbGxiYWNrKHRoaXMpKSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5zdXBwb3J0c1BhdXNlQW5kUmVzdW1lKAorICAgICAgICAgICAgWyZdKGJvb2wgcCwgYm9vbCByKSB7CisgICAgICAgICAgICAgICAgKnN1cHBvcnRzUGF1c2UgPSBwOworICAgICAgICAgICAgICAgICpzdXBwb3J0c1Jlc3VtZSA9IHI7CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNQYXVzZUFuZFJlc3VtZSIsIHJldCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnBhdXNlKCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPnBhdXNlKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpyZXN1bWUoKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cmVzdW1lKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNEcmFpbiIsIG1TdHJlYW0tPnN1cHBvcnRzRHJhaW4oKSwgc3VwcG9ydHNEcmFpbik7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigKKyAgICAgICAgICAgICJkcmFpbiIsIG1TdHJlYW0tPmRyYWluKGVhcmx5Tm90aWZ5ID8gQXVkaW9EcmFpbjo6RUFSTFlfTk9USUZZIDogQXVkaW9EcmFpbjo6QUxMKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmZsdXNoKCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPmZsdXNoKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKKyAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCisgICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfUFJFU0VOVEFUSU9OX1BPU0lUSU9OLCAiZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24iLCBudWxscHRyLCAwLAorICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLmZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9zZWMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi50aW1lU3RhbXAudHZTZWM7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLnRpbWVTdGFtcC50dk5TZWM7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUmVzdWx0IHJldHZhbDsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFByZXNlbnRhdGlvblBvc2l0aW9uKAorICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgaGlkbEZyYW1lcywgY29uc3QgVGltZVNwZWMmIGhpZGxUaW1lU3RhbXApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gaGlkbEZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfc2VjID0gaGlkbFRpbWVTdGFtcC50dlNlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IGhpZGxUaW1lU3RhbXAudHZOU2VjOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKKyAgICB9Cit9CisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKAorICAgICAgICBjb25zdCBTdHJlYW1PdXRIYWxJbnRlcmZhY2U6OlNvdXJjZU1ldGFkYXRhJiAvKiBzb3VyY2VNZXRhZGF0YSAqLykgeworICAgIC8vIEF1ZGlvIEhBTCBWMi4wIGRvZXMgbm90IHN1cHBvcnQgcHJvcGFnYXRpbmcgc291cmNlIG1ldGFkYXRhCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CisvKiogVHJhbnNmb3JtIGEgc3RhbmRhcmQgY29sbGVjdGlvbiB0byBhbiBISURMIHZlY3Rvci4gKi8KK3RlbXBsYXRlIDxjbGFzcyBWYWx1ZXMsIGNsYXNzIEVsZW1lbnRDb252ZXJ0ZXI+CitzdGF0aWMgYXV0byB0cmFuc2Zvcm1Ub0hpZGxWZWMoY29uc3QgVmFsdWVzJiB2YWx1ZXMsIEVsZW1lbnRDb252ZXJ0ZXIgY29udmVydGVyKSB7CisgICAgaGlkbF92ZWM8ZGVjbHR5cGUoY29udmVydGVyKCp2YWx1ZXMuYmVnaW4oKSkpPiByZXN1bHR7dmFsdWVzLnNpemUoKX07CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICB0cmFuc2Zvcm0oYmVnaW4odmFsdWVzKSwgZW5kKHZhbHVlcyksIGJlZ2luKHJlc3VsdCksIGNvbnZlcnRlcik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6dXBkYXRlU291cmNlTWV0YWRhdGEoCisgICAgICAgIGNvbnN0IFN0cmVhbU91dEhhbEludGVyZmFjZTo6U291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSB7CisgICAgQ1BQX1ZFUlNJT046OlNvdXJjZU1ldGFkYXRhIGhhbE1ldGFkYXRhID0geworICAgICAgICAudHJhY2tzID0gdHJhbnNmb3JtVG9IaWRsVmVjKHNvdXJjZU1ldGFkYXRhLnRyYWNrcywKKyAgICAgICAgICAgICAgW10oY29uc3QgcGxheWJhY2tfdHJhY2tfbWV0YWRhdGEmIG1ldGFkYXRhKSAtPiBQbGF5YmFja1RyYWNrTWV0YWRhdGEgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAgICAgLnVzYWdlPXN0YXRpY19jYXN0PEF1ZGlvVXNhZ2U+KG1ldGFkYXRhLnVzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRUeXBlPXN0YXRpY19jYXN0PEF1ZGlvQ29udGVudFR5cGU+KG1ldGFkYXRhLmNvbnRlbnRfdHlwZSksCisgICAgICAgICAgICAgICAgICAgIC5nYWluPW1ldGFkYXRhLmdhaW4sCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICB9KX07CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInVwZGF0ZVNvdXJjZU1ldGFkYXRhIiwgbVN0cmVhbS0+dXBkYXRlU291cmNlTWV0YWRhdGEoaGFsTWV0YWRhdGEpKTsKK30KKyNlbmRpZgorCit2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uV3JpdGVSZWFkeSgpIHsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25Xcml0ZVJlYWR5Iik7CisgICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOworfQorCit2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRHJhaW5SZWFkeSgpIHsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25EcmFpblJlYWR5Iik7CisgICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOworfQorCit2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRXJyb3IoKSB7CisgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOworICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRXJyb3IiKTsKKyAgICBjYWxsYmFjay0+b25FcnJvcigpOworfQorCisKK1N0cmVhbUluSGFsSGlkbDo6U3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSkKKyAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVJlYWRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgeworfQorCitTdHJlYW1JbkhhbEhpZGw6On5TdHJlYW1JbkhhbEhpZGwoKSB7CisgICAgaWYgKG1TdHJlYW0gIT0gMCkgeworICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOworICAgICAgICBtU3RyZWFtLmNsZWFyKCk7CisgICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgfQorICAgIGlmIChtRWZHcm91cCkgeworICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0R2FpbiIsIG1TdHJlYW0tPnNldEdhaW4oZ2FpbikpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgICpyZWFkID0gMDsKKworICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7CisgICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgcmVhZCByZXF1ZXN0LgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghbURhdGFNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclJlYWRpbmcoYnl0ZXMpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKKyAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpSRUFEOworICAgIHBhcmFtcy5wYXJhbXMucmVhZCA9IGJ5dGVzOworICAgIHN0YXR1cyA9IGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAicmVhZCIsCisgICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhdmFpbFRvUmVhZCA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvUmVhZCgpOworICAgICAgICAgICAgICAgIGlmICghbURhdGFNUS0+cmVhZChzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSwgc3RkOjptaW4oYnl0ZXMsIGF2YWlsVG9SZWFkKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSByZWFkIGZhaWxlZCBmb3IgXCJyZWFkXCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1dfSUYoYXZhaWxUb1JlYWQgIT0gcmVhZFN0YXR1cy5yZXBseS5yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgIkhBTCByZWFkIHJlcG9ydCBpbmNvbnNpc3RlbnQ6IG1xID0gJWQsIHN0YXR1cyA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWF2YWlsVG9SZWFkLCAoaW50MzJfdClyZWFkU3RhdHVzLnJlcGx5LnJlYWQpOworICAgICAgICAgICAgICAgICpyZWFkID0gcmVhZFN0YXR1cy5yZXBseS5yZWFkOworICAgICAgICAgICAgfSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICpyZWFkKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmNhbGxSZWFkZXJUaHJlYWQoCisgICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCisgICAgICAgIFN0cmVhbUluSGFsSGlkbDo6UmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZwYXJhbXMpKSB7CisgICAgICAgIEFMT0dXKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIik7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKyAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSk7CisKKyAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgorICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOworcmV0cnk6CisgICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpLCAmZWZTdGF0ZSk7CisgICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpIHsKKyAgICAgICAgUmVhZFN0YXR1cyByZWFkU3RhdHVzOworICAgICAgICByZWFkU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmcmVhZFN0YXR1cykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgIGlmIChyZWFkU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICByZXQgPSBPSzsKKyAgICAgICAgICAgIGNhbGxiYWNrKHJlYWRTdGF0dXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCByZWFkU3RhdHVzLnJldHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKKyAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvclJlYWRpbmcoCisgICAgICAgICAgICAxLCBidWZmZXJTaXplLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOworICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7CisgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgeworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvclJlYWRpbmciLCByZXQsIHJldHZhbCk7CisgICAgfQorICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIW1FZkdyb3VwKSB7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgcmVhZGluZyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7CisKKyAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOworICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7CisgICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7CisgICAgbVJlYWRlckNsaWVudCA9IGdldHRpZCgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRGcmFtZXNMb3N0IiwgbVN0cmVhbS0+Z2V0SW5wdXRGcmFtZXNMb3N0KCksIGZyYW1lc0xvc3QpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVJlYWRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7CisgICAgICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKKyAgICAgICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6R0VUX0NBUFRVUkVfUE9TSVRJT047CisgICAgICAgIHJldHVybiBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgImdldENhcHR1cmVQb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLmZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi50aW1lOworICAgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIFJlc3VsdCByZXR2YWw7CisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oCisgICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCB1aW50NjRfdCBoaWRsVGltZSkgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSBoaWRsVGltZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworICAgIH0KK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6dXBkYXRlU2lua01ldGFkYXRhKAorICAgICAgICBjb25zdCBTdHJlYW1JbkhhbEludGVyZmFjZTo6U2lua01ldGFkYXRhJiAvKiBzaW5rTWV0YWRhdGEgKi8pIHsKKyAgICAvLyBBdWRpbyBIQUwgVjIuMCBkb2VzIG5vdCBzdXBwb3J0IHByb3BhZ2F0aW5nIHNpbmsgbWV0YWRhdGEKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKKyNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAorc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXNJbmZvKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaGlkbF92ZWM8TWljcm9waG9uZUluZm8+IG1pY0FycmF5SGFsKSB7CisgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbWljQXJyYXlIYWwuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBkc3Q7CisgICAgICAgICAgICAvLyBjb252ZXJ0CisgICAgICAgICAgICBtaWNyb3Bob25lSW5mb1RvSGFsKG1pY0FycmF5SGFsW2tdLCAmZHN0KTsKKyAgICAgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKGRzdCk7CisgICAgICAgICAgICBtaWNyb3Bob25lc0luZm8tPnB1c2hfYmFjayhtaWNyb3Bob25lKTsKKyAgICAgICAgfQorICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBY3RpdmVNaWNyb3Bob25lcyIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjp1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QKKyAgICAgICAgU3RyZWFtSW5IYWxJbnRlcmZhY2U6OlNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7CisgICAgQ1BQX1ZFUlNJT046OlNpbmtNZXRhZGF0YSBoYWxNZXRhZGF0YSA9IHsKKyAgICAgICAgLnRyYWNrcyA9IHRyYW5zZm9ybVRvSGlkbFZlYyhzaW5rTWV0YWRhdGEudHJhY2tzLAorICAgICAgICAgICAgICBbXShjb25zdCByZWNvcmRfdHJhY2tfbWV0YWRhdGEmIG1ldGFkYXRhKSAtPiBSZWNvcmRUcmFja01ldGFkYXRhIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAgICAgICAgIC5zb3VyY2U9c3RhdGljX2Nhc3Q8QXVkaW9Tb3VyY2U+KG1ldGFkYXRhLnNvdXJjZSksCisgICAgICAgICAgICAgICAgICAgIC5nYWluPW1ldGFkYXRhLmdhaW4sCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICB9KX07CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInVwZGF0ZVNpbmtNZXRhZGF0YSIsIG1TdHJlYW0tPnVwZGF0ZVNpbmtNZXRhZGF0YShoYWxNZXRhZGF0YSkpOworfQorI2VuZGlmCisKKyNpZiBNQUpPUl9WRVJTSU9OIDwgNQorc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uIF9fdW51c2VkKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tIF9fdW51c2VkKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorI2Vsc2UKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1pY3JvcGhvbmVEaXJlY3Rpb24iLAorICAgICAgICAgICAgICAgIG1TdHJlYW0tPnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oc3RhdGljX2Nhc3Q8TWljcm9waG9uZURpcmVjdGlvbj4oZGlyZWN0aW9uKSkpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uIiwKKyAgICAgICAgICAgICAgICBtU3RyZWFtLT5zZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSkpOworfQorI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYzEwNjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuaApAQCAtMCwwICsxLDI1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICisKKyNpbmNsdWRlIDxhdG9taWM+CisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbS5oKQorI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JU3RyZWFtSW4uaCkKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbU91dC5oKQorI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbUluOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtT3V0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgUmVhZFBhcmFtZXRlcnMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1Jbjo6UmVhZFBhcmFtZXRlcnM7Cit1c2luZyBSZWFkU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtSW46OlJlYWRTdGF0dXM7Cit1c2luZyBXcml0ZUNvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1PdXQ6OldyaXRlQ29tbWFuZDsKK3VzaW5nIFdyaXRlU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtT3V0OjpXcml0ZVN0YXR1czsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgRGV2aWNlSGFsSGlkbDsKKworY2xhc3MgU3RyZWFtSGFsSGlkbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCit7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKTsKKworICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgbWFzay4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKTsKKworICAgIC8vIFJldHVybiB0aGUgYXVkaW8gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKKworICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7CisKKyAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOworCisgICAgLy8gR2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOworCisgICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZWZmZWN0IG9uIHRoZSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKKworICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKworICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOworCisgICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOworCisgICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAorICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIGV4cGxpY2l0IFN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCisgICAgdmlydHVhbCB+U3RyZWFtSGFsSGlkbCgpOworCisgICAgc3RhdHVzX3QgZ2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgYm9vbCByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCk7CisKKyAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOworCisgIHByaXZhdGU6CisgICAgY29uc3QgaW50IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCA9IC0xOworICAgIElTdHJlYW0gKm1TdHJlYW07CisgICAgaW50IG1IYWxUaHJlYWRQcmlvcml0eTsKKyAgICBzaXplX3QgbUNhY2hlZEJ1ZmZlclNpemU7Cit9OworCitjbGFzcyBTdHJlYW1PdXRIYWxIaWRsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgeworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOworCisgICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKKworICAgIC8vIFNlbGVjdHMgdGhlIGF1ZGlvIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpOworCisgICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOworCisgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKKyAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOworCisgICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKKworICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOworCisgICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCisgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOworCisgICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKKworICAgIC8vIE1ldGhvZHMgdXNlZCBieSBTdHJlYW1PdXRDYWxsYmFjayAoSElETCkuCisgICAgdm9pZCBvbldyaXRlUmVhZHkoKTsKKyAgICB2b2lkIG9uRHJhaW5SZWFkeSgpOworICAgIHZvaWQgb25FcnJvcigpOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVDb21tYW5kLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKKworICAgIHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBtQ2FsbGJhY2s7CisgICAgc3A8SVN0cmVhbU91dD4gbVN0cmVhbTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7CisgICAgc3RkOjphdG9taWM8cGlkX3Q+IG1Xcml0ZXJDbGllbnQ7CisgICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1PdXQ+JiBzdHJlYW0pOworCisgICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsSGlkbCgpOworCisgICAgdXNpbmcgV3JpdGVyQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKT47CisgICAgc3RhdHVzX3QgY2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgICAgIFdyaXRlQ29tbWFuZCBjbWQsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsIFdyaXRlckNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlRm9yV3JpdGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Cit9OworCitjbGFzcyBTdHJlYW1JbkhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxIaWRsIHsKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOworCisgICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOworCisgICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7CisKKyAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCisgICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKKworICAgIC8vIEdldCBhY3RpdmUgbWljcm9waG9uZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKKworICAgIC8vIFNldCBtaWNyb3Bob25lIGRpcmVjdGlvbiAoZm9yIHByb2Nlc3NpbmcpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSBvdmVycmlkZTsKKworICAgIC8vIFNldCBtaWNyb3Bob25lIHpvb20gKGZvciBwcm9jZXNzaW5nKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIG92ZXJyaWRlOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxIaWRsOworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRQYXJhbWV0ZXJzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROworCisgICAgc3A8SVN0cmVhbUluPiBtU3RyZWFtOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKKyAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVJlYWRlckNsaWVudDsKKyAgICBFdmVudEZsYWcqIG1FZkdyb3VwOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pOworCisgICAgdmlydHVhbCB+U3RyZWFtSW5IYWxIaWRsKCk7CisKKyAgICB1c2luZyBSZWFkZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKT47CisgICAgc3RhdHVzX3QgY2FsbFJlYWRlclRocmVhZCgKKyAgICAgICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsIFJlYWRlckNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUmVhZGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2I4MDliCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5jcHAKQEAgLTAsMCArMSwzOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbExvY2FsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxMb2NhbC5oIgorI2luY2x1ZGUgIlZlcnNpb25VdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitTdHJlYW1IYWxMb2NhbDo6U3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKKyAgICAgICAgOiBtRGV2aWNlKGRldmljZSksCisgICAgICAgICAgbVN0cmVhbShzdHJlYW0pIHsKKyAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCisgICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQobVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pLAorICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pKTsKKyAgICB9Cit9CisKK1N0cmVhbUhhbExvY2FsOjp+U3RyZWFtSGFsTG9jYWwoKSB7CisgICAgbVN0cmVhbSA9IDA7CisgICAgbURldmljZS5jbGVhcigpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgeworICAgICpyYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBtU3RyZWFtLT5nZXRfYnVmZmVyX3NpemUobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKKyAgICAqbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7CisgICAgKnNhbXBsZVJhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7CisgICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7CisgICAgKmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgcmV0dXJuIG1TdHJlYW0tPnNldF9wYXJhbWV0ZXJzKG1TdHJlYW0sIGt2UGFpcnMuc3RyaW5nKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICBjaGFyICpoYWxWYWx1ZXMgPSBtU3RyZWFtLT5nZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrZXlzLnN0cmluZygpKTsKKyAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKKyAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOworICAgICAgICBmcmVlKGhhbFZhbHVlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWVzLT5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjphZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgeworICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgeworICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzdGFuZGJ5KCkgeworICAgIHJldHVybiBtU3RyZWFtLT5zdGFuZGJ5KG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6ZHVtcChpbnQgZmQpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5kdW1wKG1TdHJlYW0sIGZkKTsKKyAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCkgeworICAgIC8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYXMgbG9jYWwgaGFsIGlzIGV4ZWN1dGVkIGJ5IGF1ZGlvZmxpbmdlciBkaXJlY3RseQorICAgIC8vIG9uIHRoZSBzYW1lIHRocmVhZC4KKyAgICByZXR1cm4gT0s7Cit9CisKK1N0cmVhbU91dEhhbExvY2FsOjpTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKKyAgICAgICAgOiBTdHJlYW1IYWxMb2NhbCgmc3RyZWFtLT5jb21tb24sIGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7Cit9CisKK1N0cmVhbU91dEhhbExvY2FsOjp+U3RyZWFtT3V0SGFsTG9jYWwoKSB7CisgICAgbUNhbGxiYWNrLmNsZWFyKCk7CisgICAgbURldmljZS0+Y2xvc2VPdXRwdXRTdHJlYW0obVN0cmVhbSk7CisgICAgbVN0cmVhbSA9IDA7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgeworICAgICpsYXRlbmN5ID0gbVN0cmVhbS0+Z2V0X2xhdGVuY3kobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7CisgICAgaWYgKG1TdHJlYW0tPnNldF92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfdm9sdW1lKG1TdHJlYW0sIGxlZnQsIHJpZ2h0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpIHsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKKyAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5UHJlc2VudGF0aW9uSWQpLCBwcmVzZW50YXRpb25JZCk7CisgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVByb2dyYW1JZCksIHByb2dyYW1JZCk7CisgICAgcmV0dXJuIHNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7CisgICAgc3NpemVfdCB3cml0ZVJlc3VsdCA9IG1TdHJlYW0tPndyaXRlKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOworICAgIGlmICh3cml0ZVJlc3VsdCA+IDApIHsKKyAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVJlc3VsdDsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgICp3cml0dGVuID0gMDsKKyAgICAgICAgcmV0dXJuIHdyaXRlUmVzdWx0OworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3JlbmRlcl9wb3NpdGlvbihtU3RyZWFtLCBkc3BGcmFtZXMpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAobVN0cmVhbSwgdGltZXN0YW1wKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgeworICAgIGlmIChtU3RyZWFtLT5zZXRfY2FsbGJhY2sgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1TdHJlYW0tPnNldF9jYWxsYmFjayhtU3RyZWFtLCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjaywgdGhpcyk7CisgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gc3RhdGljCitpbnQgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQqLCB2b2lkICpjb29raWUpIHsKKyAgICAvLyBXZSBhY3QgYXMgaWYgd2UgZ2F2ZSBhIHdwPFN0cmVhbU91dEhhbExvY2FsPiB0byBIQUwuIFRoaXMgd2F5IHdlIHNob3VsZCBoYW5kbGUKKyAgICAvLyBjb3JyZWN0bHkgdGhlIGNhc2Ugd2hlbiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGlsZSBTdHJlYW1PdXRIYWxMb2NhbCdzIGRlc3RydWN0b3IgaXMKKyAgICAvLyBhbHJlYWR5IHJ1bm5pbmcsIGJlY2F1c2UgdGhlIGRlc3RydWN0b3IgaXMgaW52b2tlZCBhZnRlciB0aGUgcmVmY291bnQgaGFzIGJlZW4gYXRvbWljYWxseQorICAgIC8vIGRlY3JlbWVudGVkLgorICAgIHdwPFN0cmVhbU91dEhhbExvY2FsPiB3ZWFrU2VsZihzdGF0aWNfY2FzdDxTdHJlYW1PdXRIYWxMb2NhbCo+KGNvb2tpZSkpOworICAgIHNwPFN0cmVhbU91dEhhbExvY2FsPiBzZWxmID0gd2Vha1NlbGYucHJvbW90ZSgpOworICAgIGlmIChzZWxmID09IDApIHJldHVybiAwOworICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IHNlbGYtPm1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybiAwOworICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrKCkgZXZlbnQgJWQiLCBldmVudCk7CisgICAgc3dpdGNoIChldmVudCkgeworICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfV1JJVEVfUkVBRFk6CisgICAgICAgICAgICBjYWxsYmFjay0+b25Xcml0ZVJlYWR5KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0RSQUlOX1JFQURZOgorICAgICAgICAgICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9FUlJPUjoKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vbkVycm9yKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJhc3luY0NhbGxiYWNrKCkgdW5rbm93biBldmVudCAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKKyAgICAqc3VwcG9ydHNQYXVzZSA9IG1TdHJlYW0tPnBhdXNlICE9IE5VTEw7CisgICAgKnN1cHBvcnRzUmVzdW1lID0gbVN0cmVhbS0+cmVzdW1lICE9IE5VTEw7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cGF1c2UoKSB7CisgICAgaWYgKG1TdHJlYW0tPnBhdXNlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+cGF1c2UobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpyZXN1bWUoKSB7CisgICAgaWYgKG1TdHJlYW0tPnJlc3VtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnJlc3VtZShtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgeworICAgICpzdXBwb3J0c0RyYWluID0gbVN0cmVhbS0+ZHJhaW4gIT0gTlVMTDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7CisgICAgaWYgKG1TdHJlYW0tPmRyYWluID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+ZHJhaW4obVN0cmVhbSwgZWFybHlOb3RpZnkgPyBBVURJT19EUkFJTl9FQVJMWV9OT1RJRlkgOiBBVURJT19EUkFJTl9BTEwpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Zmx1c2goKSB7CisgICAgaWYgKG1TdHJlYW0tPmZsdXNoID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Zmx1c2gobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWVzdGFtcCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKKyAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgY29uc3Qgc291cmNlX21ldGFkYXRhX3QgbWV0YWRhdGEgeworICAgICAgICAudHJhY2tfY291bnQgPSBzb3VyY2VNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAorICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKKyAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cGxheWJhY2tfdHJhY2tfbWV0YWRhdGEqPihzb3VyY2VNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKKyAgICB9OworICAgIG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdGFydCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0b3AoKSB7CisgICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKKyAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgeworICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKK30KKworU3RyZWFtSW5IYWxMb2NhbDo6U3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQorICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKK30KKworU3RyZWFtSW5IYWxMb2NhbDo6flN0cmVhbUluSGFsTG9jYWwoKSB7CisgICAgbURldmljZS0+Y2xvc2VJbnB1dFN0cmVhbShtU3RyZWFtKTsKKyAgICBtU3RyZWFtID0gMDsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgeworICAgICpzaXplID0gYXVkaW9fc3RyZWFtX2luX2ZyYW1lX3NpemUobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKKyAgICByZXR1cm4gbVN0cmVhbS0+c2V0X2dhaW4obVN0cmVhbSwgZ2Fpbik7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgeworICAgIHNzaXplX3QgcmVhZFJlc3VsdCA9IG1TdHJlYW0tPnJlYWQobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7CisgICAgaWYgKHJlYWRSZXN1bHQgPiAwKSB7CisgICAgICAgICpyZWFkID0gcmVhZFJlc3VsdDsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyggYnVmZmVyLCAqcmVhZCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICAqcmVhZCA9IDA7CisgICAgICAgIHJldHVybiByZWFkUmVzdWx0OworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7CisgICAgKmZyYW1lc0xvc3QgPSBtU3RyZWFtLT5nZXRfaW5wdXRfZnJhbWVzX2xvc3QobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7CisgICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBjb25zdCBzaW5rX21ldGFkYXRhX3QgbWV0YWRhdGEgeworICAgICAgICAudHJhY2tfY291bnQgPSBzaW5rTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKKyAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCisgICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHJlY29yZF90cmFja19tZXRhZGF0YSo+KHNpbmtNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKKyAgICB9OworICAgIG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhKG1TdHJlYW0sICZtZXRhZGF0YSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdGFydCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RvcCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7CisgICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgeworICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgeworICAgIGlmIChtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzaXplX3QgYWN0dWFsX21pY3MgPSBBVURJT19NSUNST1BIT05FX01BWF9DT1VOVDsKKyAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgbWljX2FycmF5W0FVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UXTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzKG1TdHJlYW0sICZtaWNfYXJyYXlbMF0sICZhY3R1YWxfbWljcyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3R1YWxfbWljczsgaSsrKSB7CisgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lSW5mbyA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhtaWNfYXJyYXlbaV0pOworICAgICAgICBtaWNyb3Bob25lcy0+cHVzaF9iYWNrKG1pY3JvcGhvbmVJbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCisjaWYgTUFKT1JfVkVSU0lPTiA8IDUKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24gX191bnVzZWQpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tIF9fdW51c2VkKSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorI2Vsc2UKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICBpZiAobVN0cmVhbS0+c2V0X21pY3JvcGhvbmVfZGlyZWN0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c2V0X21pY3JvcGhvbmVfZGlyZWN0aW9uKG1TdHJlYW0sIGRpcmVjdGlvbik7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgaWYgKG1TdHJlYW0tPnNldF9taWNyb3Bob25lX2ZpZWxkX2RpbWVuc2lvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnNldF9taWNyb3Bob25lX2ZpZWxkX2RpbWVuc2lvbihtU3RyZWFtLCB6b29tKTsKKworfQorI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q2YzUwZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuaApAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMX0gKKworI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZUhhbExvY2FsOworCitjbGFzcyBTdHJlYW1IYWxMb2NhbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7CisKKyAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7CisKKyAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworCisgICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKKworICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKKworICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7CisKKyAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworCisgICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOworCisgICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKKworICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pID0gMDsKKworICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSA9IDA7CisKKyAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCisgICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgU3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgorICAgIHZpcnR1YWwgflN0cmVhbUhhbExvY2FsKCk7CisKKyAgICBzcDxEZXZpY2VIYWxMb2NhbD4gbURldmljZTsKKworICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7CisKKyAgcHJpdmF0ZToKKyAgICBhdWRpb19zdHJlYW1fdCAqbVN0cmVhbTsKK307CisKK2NsYXNzIFN0cmVhbU91dEhhbExvY2FsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKKworICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CisKKyAgICAvLyBTZWxlY3RzIHRoZSBhdWRpbyBwcmVzZW50YXRpb24gKGlmIGF2YWlsYWJsZSkuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKTsKKworICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKTsKKworICAgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIGJ5IHRoZSBhdWRpbyBkc3AgdG8gREFDIHNpbmNlCisgICAgLy8gdGhlIG91dHB1dCBoYXMgZXhpdGVkIHN0YW5kYnkuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKTsKKworICAgIC8vIEdldCB0aGUgbG9jYWwgdGltZSBhdCB3aGljaCB0aGUgbmV4dCB3cml0ZSB0byB0aGUgYXVkaW8gZHJpdmVyIHdpbGwgYmUgcHJlc2VudGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCk7CisKKyAgICAvLyBTZXQgdGhlIGNhbGxiYWNrIGZvciBub3RpZnlpbmcgY29tcGxldGlvbiBvZiBub24tYmxvY2tpbmcgd3JpdGUgYW5kIGRyYWluLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKTsKKworICAgIC8vIFJldHVybnMgd2hldGhlciBwYXVzZSBhbmQgcmVzdW1lIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCisgICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKTsKKworICAgIC8vIFJldHVybnMgd2hldGhlciBkcmFpbiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKTsKKworICAgIC8vIFJlcXVlc3RzIG5vdGlmaWNhdGlvbiB3aGVuIGRhdGEgYnVmZmVyZWQgYnkgdGhlIGRyaXZlci9oYXJkd2FyZSBoYXMgYmVlbiBwbGF5ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBkcmFpbihib29sIGVhcmx5Tm90aWZ5KTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gZmx1c2ggdGhlIHF1ZXVlZCBkYXRhLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKKworICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBwcmVzZW50ZWQgdG8gYW4gZXh0ZXJuYWwgb2JzZXJ2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCk7CisKKyAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKworICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOworCisgICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICBzdGF0dXNfdCB1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgYXVkaW9fc3RyZWFtX291dF90ICptU3RyZWFtOworICAgIHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBtQ2FsbGJhY2s7CisKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgU3RyZWFtT3V0SGFsTG9jYWwoYXVkaW9fc3RyZWFtX291dF90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOworCisgICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsTG9jYWwoKTsKKworICAgIHN0YXRpYyBpbnQgYXN5bmNDYWxsYmFjayhzdHJlYW1fY2FsbGJhY2tfZXZlbnRfdCBldmVudCwgdm9pZCAqcGFyYW0sIHZvaWQgKmNvb2tpZSk7Cit9OworCitjbGFzcyBTdHJlYW1JbkhhbExvY2FsIDogcHVibGljIFN0cmVhbUluSGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsTG9jYWwgeworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFNldCB0aGUgaW5wdXQgZ2FpbiBmb3IgdGhlIGF1ZGlvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEdhaW4oZmxvYXQgZ2Fpbik7CisKKyAgICAvLyBSZWFkIGF1ZGlvIGJ1ZmZlciBpbiBmcm9tIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBpbnB1dCBmcmFtZXMgbG9zdCBpbiB0aGUgYXVkaW8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KTsKKworICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyByZWNlaXZlZCBhbmQKKyAgICAvLyB0aGUgY2xvY2sgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmcmFtZSBjb3VudC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpOworCisgICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisKKyAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisKKyAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKKworICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKKworICAgIC8vIEdldCBhY3RpdmUgbWljcm9waG9uZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKKworICAgIC8vIFNldHMgbWljcm9waG9uZSBkaXJlY3Rpb24gKGZvciBwcm9jZXNzaW5nKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7CisKKyAgICAvLyBTZXRzIG1pY3JvcGhvbmUgem9vbSAoZm9yIHByb2Nlc3NpbmcpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgYXVkaW9fc3RyZWFtX2luX3QgKm1TdHJlYW07CisKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgU3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKKworICAgIHZpcnR1YWwgflN0cmVhbUluSGFsTG9jYWwoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1Qb3dlckxvZy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1Qb3dlckxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZDM5MTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1Bvd2VyTG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgU3RyZWFtUG93ZXJMb2cgeworcHVibGljOgorICAgIFN0cmVhbVBvd2VyTG9nKCkgOgorICAgICAgICBtSXNVc2VyRGVidWdPckVuZ0J1aWxkKGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSksCisgICAgICAgIG1Qb3dlckxvZyhudWxscHRyKSwKKyAgICAgICAgbUZyYW1lU2l6ZSgwKSB7CisgICAgICAgIC8vIHVzZSBpbml0KCkgdG8gc2V0IHVwIHRoZSBwb3dlciBsb2cuCisgICAgfQorCisgICAgflN0cmVhbVBvd2VyTG9nKCkgeworICAgICAgICBwb3dlcl9sb2dfZGVzdHJveShtUG93ZXJMb2cpOyAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKKyAgICAgICAgbVBvd2VyTG9nID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLyBBIG9uZS10aW1lIGluaXRpYWxpemF0aW9uIChkbyBub3QgY2FsbCB0d2ljZSkgYmVmb3JlIHVzaW5nIFN0cmVhbVBvd2VyTG9nLgorICAgIHZvaWQgaW5pdCh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgICAgIGlmIChtUG93ZXJMb2cgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gTm90ZTogQSB3YXkgdG8gZ2V0IGNoYW5uZWwgY291bnQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBjaGFubmVsIG1hc2tzCisgICAgICAgICAgICAvLyBidXQgZG9lcyBub3QgY2hlY2sgdmFsaWRpdHkgb2YgdGhlIGNoYW5uZWwgbWFzay4KKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykpOworICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKKyAgICAgICAgICAgIGlmIChtRnJhbWVTaXplID4gMCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSA9CisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNhbXBsZVJhdGUgKiBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgLyAxMDAwOworICAgICAgICAgICAgICAgIG1Qb3dlckxvZyA9IHBvd2VyX2xvZ19jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBtUG93ZXJMb2cgbWF5IGJlIE5VTEwgKG5vdCB0aGUgcmlnaHQgYnVpbGQsIGZvcm1hdCBub3QgYWNjZXB0ZWQsIGV0Yy4pLgorICAgIH0KKworICAgIC8vIER1bXAgdGhlIHBvd2VyIGxvZyB0byBmZC4KKyAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdCB7CisgICAgICAgIC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZworICAgICAgICAodm9pZClwb3dlcl9sb2dfZHVtcCgKKyAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGZkLCAiICAgICAgIiAvKiBwcmVmaXggKi8sIGtQb3dlckxvZ0xpbmVzLCAwIC8qIGxpbWl0X25zICovKTsKKyAgICB9CisKKyAgICAvLyBMb2cgdGhlIGF1ZGlvIGRhdGEgY29udGFpbmVkIGluIGJ1ZmZlci4KKyAgICB2b2lkIGxvZyhjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplSW5CeXRlcykgY29uc3QgeworICAgICAgICBpZiAobVBvd2VyTG9nICE9IG51bGxwdHIpIHsgLy8gbUZyYW1lU2l6ZSBpcyBhbHdheXMgbm9uemVybyBpZiBtUG93ZXJMb2cgZXhpc3RzLgorICAgICAgICAgICAgcG93ZXJfbG9nX2xvZygKKyAgICAgICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBidWZmZXIsIHNpemVJbkJ5dGVzIC8gbUZyYW1lU2l6ZSwgYXVkaW9fdXRpbHNfZ2V0X3JlYWxfdGltZV9ucygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpIHsKKyAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICAodm9pZClwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLnR5cGUiLCB2YWx1ZSwgInVua25vd24iKTsgLy8gaWdub3JlIGFjdHVhbCBsZW5ndGgKKyAgICAgICAgcmV0dXJuIHN0cmNtcCh2YWx1ZSwgInVzZXJkZWJ1ZyIpID09IDAgfHwgc3RyY21wKHZhbHVlLCAiZW5nIikgPT0gMDsKKyAgICB9CisKKyAgICAvLyBBdWRpbyBzaWduYWwgcG93ZXIgbG9nIGNvbmZpZ3VyYXRpb24uCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dMaW5lcyA9IDQwOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zID0gNTA7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dFbnRyaWVzID0gKDEgLyogbWludXRlcyAqLyAqIDYwIC8qIHNlY29uZHMgKi8gKiAxMDAwIC8qIG1zZWMgKi8KKyAgICAgICAgICAgIC8ga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zKTsKKworICAgIGNvbnN0IGJvb2wgbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKKyAgICBwb3dlcl9sb2dfdCAqbVBvd2VyTG9nOworICAgIHNpemVfdCBtRnJhbWVTaXplOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1ZlcnNpb25VdGlscy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9WZXJzaW9uVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjBhNDJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9WZXJzaW9uVXRpbHMuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfSAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL3R5cGVzLmgpCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlBhcmFtZXRlclZhbHVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpSZXN1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworbmFtZXNwYWNlIHV0aWxzIHsKKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENhbGxiYWNrPgorUmV0dXJuPHZvaWQ+IGdldFBhcmFtZXRlcnMoVCYgb2JqZWN0LCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gLypjb250ZXh0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4ga2V5cywgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICByZXR1cm4gb2JqZWN0LT5nZXRQYXJhbWV0ZXJzKGtleXMsIGNhbGxiYWNrKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitSZXR1cm48UmVzdWx0PiBzZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IC8qY29udGV4dCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4ga2V5cykgeworICAgIHJldHVybiBvYmplY3QtPnNldFBhcmFtZXRlcnMoa2V5cyk7Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDYWxsYmFjaz4KK1JldHVybjx2b2lkPiBnZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4ga2V5cywgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICByZXR1cm4gb2JqZWN0LT5nZXRQYXJhbWV0ZXJzKGNvbnRleHQsIGtleXMsIGNhbGxiYWNrKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitSZXR1cm48UmVzdWx0PiBzZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBrZXlzKSB7CisgICAgcmV0dXJuIG9iamVjdC0+c2V0UGFyYW1ldGVycyhjb250ZXh0LCBrZXlzKTsKK30KKyNlbmRpZgorCit9IC8vIG5hbWVzcGFjZSB1dGlscworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfVkVSU0lPTl9VVElMU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL2luY2x1ZGUvbGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvaW5jbHVkZS9saWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MzE5ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL2luY2x1ZGUvbGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0ZBQ1RPUllfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0ZBQ1RPUllfSEFMX0hJRExfSAorCisvKiogQGZpbGUgTGlicmFyeSBlbnRyeSBwb2ludHMgdG8gY3JlYXRlIHRoZSBIQUwgZmFjdG9yaWVzLiAqLworCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgZWZmZWN0IHsKK25hbWVzcGFjZSBWMl8wIHsKK3NwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVFZmZlY3RzRmFjdG9yeUhhbCgpOworfSAvLyBuYW1lc3BhY2UgVjJfMAorCituYW1lc3BhY2UgVjRfMCB7CitzcDxFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRWZmZWN0c0ZhY3RvcnlIYWwoKTsKK30gLy8gbmFtZXNwYWNlIFY0XzAKKworbmFtZXNwYWNlIFY1XzAgeworc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZUVmZmVjdHNGYWN0b3J5SGFsKCk7Cit9IC8vIG5hbWVzcGFjZSBWNV8wCit9IC8vIG5hbWVzcGFjZSBlZmZlY3QKKworbmFtZXNwYWNlIFYyXzAgeworc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZURldmljZXNGYWN0b3J5SGFsKCk7Cit9IC8vIG5hbWVzcGFjZSBWMl8wCisKK25hbWVzcGFjZSBWNF8wIHsKK3NwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVEZXZpY2VzRmFjdG9yeUhhbCgpOworfSAvLyBuYW1lc3BhY2UgVjRfMAorCituYW1lc3BhY2UgVjVfMCB7CitzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRGV2aWNlc0ZhY3RvcnlIYWwoKTsKK30gLy8gbmFtZXNwYWNlIFY1XzAKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9GQUNUT1JZX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oCmluZGV4IDdkZThlYjMuLmU1NjUyMzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaApAQCAtODQsNiArODQsOCBAQAogICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCiAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqb3V0cHV0RGV2aWNlQWRkcmVzcywKICAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pID0gMDsKIAogICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaAppbmRleCA5MjYyMmFhLi4wMzE2NWJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmgKQEAgLTU1LDYgKzU1LDggQEAKICAgICAvLyBXaGV0aGVyIGl0J3MgYSBsb2NhbCBpbXBsZW1lbnRhdGlvbi4KICAgICB2aXJ0dWFsIGJvb2wgaXNMb2NhbCgpIGNvbnN0ID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpID0gMDsKKwogICBwcm90ZWN0ZWQ6CiAgICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCiAgICAgRWZmZWN0SGFsSW50ZXJmYWNlKCkge30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oCmluZGV4IGM5NjllMjguLmVkODI4MmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaApAQCAtMTA5LDYgKzEwOSw5IEBACiAgICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSA9IDA7CiAKKyAgICAvLyBTZWxlY3RzIHRoZSBhdWRpbyBwcmVzZW50YXRpb24gKGlmIGF2YWlsYWJsZSkuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSA9IDA7CisKICAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgPSAwOwogCkBAIC0xNzYsNiArMTc5LDEyIEBACiAgICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpID0gMDsKIAorICAgIC8vIFNldCBkaXJlY3Rpb24gZm9yIGNhcHR1cmUgcHJvY2Vzc2luZworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90KSA9IDA7CisKKyAgICAvLyBTZXQgem9vbSBmYWN0b3IgZm9yIGNhcHR1cmUgc3RyZWFtCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgPSAwOworCiAgICAgc3RydWN0IFNpbmtNZXRhZGF0YSB7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHJlY29yZF90cmFja19tZXRhZGF0YV90PiB0cmFja3M7CiAgICAgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0FuZHJvaWQuYnAKaW5kZXggODE3ZmIwYi4uY2I3ODA2MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0FuZHJvaWQuYnAKQEAgLTEyLDYgKzEyLDExIEBACiAgICAgICAgICJsaWJuYmxvZyIsCiAgICAgICAgICJsaWJzb25pYyIsCiAgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ2aWJyYXRvciIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyLmNwcAppbmRleCBmM2VhODI2Li5mN2NjMDk2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwCkBAIC0xMTMsMTAgKzExMywxMCBAQAogICAgICAgICAvLyBJbnRlZ2VyIHZvbHVtZS4KICAgICAgICAgLy8gQ3VycmVudGx5IGludGVnZXIgdm9sdW1lIGlzIGtlcHQgZm9yIHRoZSBsZWdhY3kgaW50ZWdlciBtaXhlci4KICAgICAgICAgLy8gV2lsbCBiZSByZW1vdmVkIHdoZW4gdGhlIGxlZ2FjeSBtaXhlciBwYXRoIGlzIHJlbW92ZWQuCi0gICAgICAgIHQtPnZvbHVtZVswXSA9IFVOSVRZX0dBSU5fSU5UOwotICAgICAgICB0LT52b2x1bWVbMV0gPSBVTklUWV9HQUlOX0lOVDsKLSAgICAgICAgdC0+cHJldlZvbHVtZVswXSA9IFVOSVRZX0dBSU5fSU5UIDw8IDE2OwotICAgICAgICB0LT5wcmV2Vm9sdW1lWzFdID0gVU5JVFlfR0FJTl9JTlQgPDwgMTY7CisgICAgICAgIHQtPnZvbHVtZVswXSA9IDA7CisgICAgICAgIHQtPnZvbHVtZVsxXSA9IDA7CisgICAgICAgIHQtPnByZXZWb2x1bWVbMF0gPSAwIDw8IDE2OworICAgICAgICB0LT5wcmV2Vm9sdW1lWzFdID0gMCA8PCAxNjsKICAgICAgICAgdC0+dm9sdW1lSW5jWzBdID0gMDsKICAgICAgICAgdC0+dm9sdW1lSW5jWzFdID0gMDsKICAgICAgICAgdC0+YXV4TGV2ZWwgPSAwOwpAQCAtMTI0LDEwICsxMjQsMTAgQEAKICAgICAgICAgdC0+cHJldkF1eExldmVsID0gMDsKIAogICAgICAgICAvLyBGbG9hdGluZyBwb2ludCB2b2x1bWUuCi0gICAgICAgIHQtPm1Wb2x1bWVbMF0gPSBVTklUWV9HQUlOX0ZMT0FUOwotICAgICAgICB0LT5tVm9sdW1lWzFdID0gVU5JVFlfR0FJTl9GTE9BVDsKLSAgICAgICAgdC0+bVByZXZWb2x1bWVbMF0gPSBVTklUWV9HQUlOX0ZMT0FUOwotICAgICAgICB0LT5tUHJldlZvbHVtZVsxXSA9IFVOSVRZX0dBSU5fRkxPQVQ7CisgICAgICAgIHQtPm1Wb2x1bWVbMF0gPSAwLmY7CisgICAgICAgIHQtPm1Wb2x1bWVbMV0gPSAwLmY7CisgICAgICAgIHQtPm1QcmV2Vm9sdW1lWzBdID0gMC5mOworICAgICAgICB0LT5tUHJldlZvbHVtZVsxXSA9IDAuZjsKICAgICAgICAgdC0+bVZvbHVtZUluY1swXSA9IDAuOwogICAgICAgICB0LT5tVm9sdW1lSW5jWzFdID0gMC47CiAgICAgICAgIHQtPm1BdXhMZXZlbCA9IDAuOwpAQCAtMTM2LDYgKzEzNiw5IEBACiAKICAgICAgICAgLy8gbm8gaW5pdGlhbGl6YXRpb24gbmVlZGVkCiAgICAgICAgIC8vIHQtPmZyYW1lQ291bnQKKyAgICAgICAgdC0+bUhhcHRpY0NoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7CisgICAgICAgIHQtPm1IYXB0aWNDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sodC0+bUhhcHRpY0NoYW5uZWxNYXNrKTsKKyAgICAgICAgY2hhbm5lbE1hc2sgJj0gfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKICAgICAgICAgdC0+Y2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKICAgICAgICAgdC0+ZW5hYmxlZCA9IGZhbHNlOwogICAgICAgICBBTE9HVl9JRihhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoY2hhbm5lbE1hc2spICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKQEAgLTE2Miw2ICsxNjUsMTYgQEAKICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX1BPU0lUSU9OLCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOwogICAgICAgICB0LT5tTWl4ZXJDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sodC0+bU1peGVyQ2hhbm5lbE1hc2spOwogICAgICAgICB0LT5tUGxheWJhY2tSYXRlID0gQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUOworICAgICAgICAvLyBoYXB0aWMKKyAgICAgICAgdC0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IGZhbHNlOworICAgICAgICB0LT5tSGFwdGljSW50ZW5zaXR5ID0gSEFQVElDX1NDQUxFX05PTkU7CisgICAgICAgIHQtPm1NaXhlckhhcHRpY0NoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgICAgICB0LT5tTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQgPSAwOworICAgICAgICB0LT5tQWRqdXN0SW5DaGFubmVsQ291bnQgPSB0LT5jaGFubmVsQ291bnQgKyB0LT5tSGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICB0LT5tQWRqdXN0T3V0Q2hhbm5lbENvdW50ID0gdC0+Y2hhbm5lbENvdW50ICsgdC0+bU1peGVySGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICB0LT5tQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudCA9IHQtPm1BZGp1c3RPdXRDaGFubmVsQ291bnQ7CisgICAgICAgIHQtPm1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCA9IHQtPmNoYW5uZWxDb3VudDsKKyAgICAgICAgdC0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMgPSBmYWxzZTsKICAgICAgICAgLy8gQ2hlY2sgdGhlIGRvd25taXhpbmcgKG9yIHVwbWl4aW5nKSByZXF1aXJlbWVudHMuCiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHQtPnByZXBhcmVGb3JEb3dubWl4KCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKQEAgLTE3MSw2ICsxODQsOCBAQAogICAgICAgICAvLyBwcmVwYXJlRm9yRG93bm1peCgpIG1heSBjaGFuZ2UgbURvd25taXhSZXF1aXJlc0Zvcm1hdAogICAgICAgICBBTE9HVlYoIm1NaXhlckZvcm1hdDolI3ggIG1NaXhlckluRm9ybWF0OiUjeFxuIiwgdC0+bU1peGVyRm9ybWF0LCB0LT5tTWl4ZXJJbkZvcm1hdCk7CiAgICAgICAgIHQtPnByZXBhcmVGb3JSZWZvcm1hdCgpOworICAgICAgICB0LT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZShtRnJhbWVDb3VudCk7CisgICAgICAgIHQtPnByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpOwogCiAgICAgICAgIG1UcmFja3NbbmFtZV0gPSB0OwogICAgICAgICByZXR1cm4gT0s7CkBAIC0xODUsMTMgKzIwMCwyMCBAQAogICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWV4aXN0cyhuYW1lKSwgImludmFsaWQgbmFtZTogJWQiLCBuYW1lKTsKICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0cmFjayA9IG1UcmFja3NbbmFtZV07CiAKLSAgICBpZiAodHJhY2tDaGFubmVsTWFzayA9PSB0cmFjay0+Y2hhbm5lbE1hc2sKLSAgICAgICAgICAgICYmIG1peGVyQ2hhbm5lbE1hc2sgPT0gdHJhY2stPm1NaXhlckNoYW5uZWxNYXNrKSB7CisgICAgaWYgKHRyYWNrQ2hhbm5lbE1hc2sgPT0gKHRyYWNrLT5jaGFubmVsTWFzayB8IHRyYWNrLT5tSGFwdGljQ2hhbm5lbE1hc2spCisgICAgICAgICAgICAmJiBtaXhlckNoYW5uZWxNYXNrID09ICh0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2sgfCB0cmFjay0+bU1peGVySGFwdGljQ2hhbm5lbE1hc2spKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIG5vIG5lZWQgdG8gY2hhbmdlCiAgICAgfQorICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGhhcHRpY0NoYW5uZWxNYXNrID0gdHJhY2tDaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICB0cmFja0NoYW5uZWxNYXNrICY9IH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7CisgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWl4ZXJIYXB0aWNDaGFubmVsTWFzayA9IG1peGVyQ2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7CisgICAgbWl4ZXJDaGFubmVsTWFzayAmPSB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOwogICAgIC8vIGFsd2F5cyByZWNvbXB1dGUgZm9yIGJvdGggY2hhbm5lbCBtYXNrcyBldmVuIGlmIG9ubHkgb25lIGhhcyBjaGFuZ2VkLgogICAgIGNvbnN0IHVpbnQzMl90IHRyYWNrQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHRyYWNrQ2hhbm5lbE1hc2spOwogICAgIGNvbnN0IHVpbnQzMl90IG1peGVyQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1peGVyQ2hhbm5lbE1hc2spOworICAgIGNvbnN0IHVpbnQzMl90IGhhcHRpY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhoYXB0aWNDaGFubmVsTWFzayk7CisgICAgY29uc3QgdWludDMyX3QgbWl4ZXJIYXB0aWNDaGFubmVsQ291bnQgPQorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1peGVySGFwdGljQ2hhbm5lbE1hc2spOwogCiAgICAgQUxPR19BU1NFUlQoKHRyYWNrQ2hhbm5lbENvdW50IDw9IE1BWF9OVU1fQ0hBTk5FTFNfVE9fRE9XTk1JWCkKICAgICAgICAgICAgICYmIHRyYWNrQ2hhbm5lbENvdW50CkBAIC0yMDAsNiArMjIyLDI0IEBACiAgICAgdHJhY2stPmNoYW5uZWxDb3VudCA9IHRyYWNrQ2hhbm5lbENvdW50OwogICAgIHRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzayA9IG1peGVyQ2hhbm5lbE1hc2s7CiAgICAgdHJhY2stPm1NaXhlckNoYW5uZWxDb3VudCA9IG1peGVyQ2hhbm5lbENvdW50OworICAgIHRyYWNrLT5tSGFwdGljQ2hhbm5lbE1hc2sgPSBoYXB0aWNDaGFubmVsTWFzazsKKyAgICB0cmFjay0+bUhhcHRpY0NoYW5uZWxDb3VudCA9IGhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICB0cmFjay0+bU1peGVySGFwdGljQ2hhbm5lbE1hc2sgPSBtaXhlckhhcHRpY0NoYW5uZWxNYXNrOworICAgIHRyYWNrLT5tTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQgPSBtaXhlckhhcHRpY0NoYW5uZWxDb3VudDsKKworICAgIGlmICh0cmFjay0+bUhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKKyAgICAgICAgdHJhY2stPm1BZGp1c3RJbkNoYW5uZWxDb3VudCA9IHRyYWNrLT5jaGFubmVsQ291bnQgKyB0cmFjay0+bUhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgdHJhY2stPm1BZGp1c3RPdXRDaGFubmVsQ291bnQgPSB0cmFjay0+Y2hhbm5lbENvdW50ICsgdHJhY2stPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgdHJhY2stPm1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50ID0gdHJhY2stPm1BZGp1c3RPdXRDaGFubmVsQ291bnQ7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQgPSB0cmFjay0+Y2hhbm5lbENvdW50OworICAgICAgICB0cmFjay0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMgPSB0cmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZDsKKyAgICB9IGVsc2UgeworICAgICAgICB0cmFjay0+bUFkanVzdEluQ2hhbm5lbENvdW50ID0gMDsKKyAgICAgICAgdHJhY2stPm1BZGp1c3RPdXRDaGFubmVsQ291bnQgPSAwOworICAgICAgICB0cmFjay0+bUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQgPSAwOworICAgICAgICB0cmFjay0+bUFkanVzdE5vbkRlc3RydWN0aXZlT3V0Q2hhbm5lbENvdW50ID0gMDsKKyAgICAgICAgdHJhY2stPm1LZWVwQ29udHJhY3RlZENoYW5uZWxzID0gZmFsc2U7CisgICAgfQogCiAgICAgLy8gY2hhbm5lbCBtYXNrcyBoYXZlIGNoYW5nZWQsIGRvZXMgdGhpcyB0cmFjayBuZWVkIGEgZG93bm1peGVyPwogICAgIC8vIHVwZGF0ZSB0byB0cnkgdXNpbmcgb3VyIGRlc2lyZWQgZm9ybWF0IChpZiB3ZSBhcmVuJ3QgYWxyZWFkeSB1c2luZyBpdCkKQEAgLTIxMiw2ICsyNTIsOSBAQAogICAgIC8vIGRvIGl0IGFmdGVyIGRvd25taXggc2luY2UgdHJhY2sgZm9ybWF0IG1heSBjaGFuZ2UhCiAgICAgdHJhY2stPnByZXBhcmVGb3JSZWZvcm1hdCgpOwogCisgICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKKyAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CisKICAgICBpZiAodHJhY2stPm1SZXNhbXBsZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICAvLyByZXNhbXBsZXIgY2hhbm5lbHMgbWF5IGhhdmUgY2hhbmdlZC4KICAgICAgICAgY29uc3QgdWludDMyX3QgcmVzZXRUb1NhbXBsZVJhdGUgPSB0cmFjay0+c2FtcGxlUmF0ZTsKQEAgLTI2MCwxNCArMzAzLDE5IEBACiAgICAgaWYgKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24oY2hhbm5lbE1hc2spCiAgICAgICAgICAgICAgICAgPT0gQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9QT1NJVElPTgogICAgICAgICAgICAgJiYgRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmlzTXVsdGljaGFubmVsQ2FwYWJsZSgpKSB7Ci0gICAgICAgIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5yZXNldChuZXcgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgbU1peGVyQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgLyogVE9ETzogdXNlIG1NaXhlckluRm9ybWF0LCBub3cgb25seSBQQ00gMTYgKi8sCi0gICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgc2Vzc2lvbklkLCBrQ29weUJ1ZmZlckZyYW1lQ291bnQpKTsKLSAgICAgICAgaWYgKHN0YXRpY19jYXN0PERvd25taXhlckJ1ZmZlclByb3ZpZGVyICo+KG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5nZXQoKSktPmlzVmFsaWQoKSkgewotICAgICAgICAgICAgbURvd25taXhSZXF1aXJlc0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOyAvLyBQQ00gMTYgYml0IHJlcXVpcmVkIGZvciBkb3dubWl4Ci0gICAgICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworCisgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBmbG9hdCBvciBpbnQxNiBkb3dubWl4ZXIsIGluIHRoYXQgb3JkZXIuCisgICAgICAgIGZvciAoY29uc3QgYXVkaW9fZm9ybWF0X3QgZm9ybWF0IDogeyBBVURJT19GT1JNQVRfUENNX0ZMT0FULCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCB9KSB7CisgICAgICAgICAgICBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIucmVzZXQobmV3IERvd25taXhlckJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgbU1peGVyQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgc2Vzc2lvbklkLCBrQ29weUJ1ZmZlckZyYW1lQ291bnQpKTsKKyAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxEb3dubWl4ZXJCdWZmZXJQcm92aWRlciAqPihtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIuZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgIC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgbURvd25taXhSZXF1aXJlc0Zvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgcmVzZXQgYmVsb3cuCiAgICAgfQpAQCAtMzM1LDkgKzM4Myw4MiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAordm9pZCBBdWRpb01peGVyOjpUcmFjazo6dW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKQoreworICAgIEFMT0dWKCJBVURJT01JWEVSOjp1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVscyIpOworICAgIGlmIChtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOworICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9NaXhlcjo6VHJhY2s6OnByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpCit7CisgICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnByZXBhcmVGb3JBZGp1c3RDaGFubmVscyglcCkgd2l0aCBpbkNoYW5uZWxDb3VudDogJXUsIG91dENoYW5uZWxDb3VudDogJXUiLAorICAgICAgICAgICAgdGhpcywgbUFkanVzdEluQ2hhbm5lbENvdW50LCBtQWRqdXN0T3V0Q2hhbm5lbENvdW50KTsKKyAgICB1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpOworICAgIGlmIChtQWRqdXN0SW5DaGFubmVsQ291bnQgIT0gbUFkanVzdE91dENoYW5uZWxDb3VudCkgeworICAgICAgICBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5yZXNldChuZXcgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICBtRm9ybWF0LCBtQWRqdXN0SW5DaGFubmVsQ291bnQsIG1BZGp1c3RPdXRDaGFubmVsQ291bnQsIGtDb3B5QnVmZmVyRnJhbWVDb3VudCkpOworICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OnVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUoKQoreworICAgIEFMT0dWKCJBVURJT01JWEVSOjp1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlIik7CisgICAgaWYgKG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKKyAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvTWl4ZXI6OlRyYWNrOjpwcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZShzaXplX3QgZnJhbWVzKQoreworICAgIEFMT0dWKCJBdWRpb01peGVyOjpwcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZSglcCkgd2l0aCBpbkNoYW5uZWxDb3VudDogJXUsICIKKyAgICAgICAgICAib3V0Q2hhbm5lbENvdW50OiAldSwga2VlcENvbnRyYWN0ZWRDaGFubmVsczogJWQiLAorICAgICAgICAgICAgdGhpcywgbUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQsIG1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIG1LZWVwQ29udHJhY3RlZENoYW5uZWxzKTsKKyAgICB1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKCk7CisgICAgaWYgKG1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50ICE9IG1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCkgeworICAgICAgICB1aW50OF90KiBidWZmZXIgPSBtS2VlcENvbnRyYWN0ZWRDaGFubmVscworICAgICAgICAgICAgICAgID8gKHVpbnQ4X3QqKW1haW5CdWZmZXIgKyBmcmFtZXMgKiBhdWRpb19ieXRlc19wZXJfZnJhbWUoCisgICAgICAgICAgICAgICAgICAgICAgICBtTWl4ZXJDaGFubmVsQ291bnQsIG1NaXhlckZvcm1hdCkKKyAgICAgICAgICAgICAgICA6IE5VTEw7CisgICAgICAgIG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5yZXNldCgKKyAgICAgICAgICAgICAgICBuZXcgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1LZWVwQ29udHJhY3RlZENoYW5uZWxzID8gbU1peGVyRm9ybWF0IDogQVVESU9fRk9STUFUX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpKTsKKyAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjpjbGVhckNvbnRyYWN0ZWRCdWZmZXIoKQoreworICAgIGlmIChtQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBzdGF0aWNfY2FzdDxBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKj4oCisgICAgICAgICAgICAgICAgbUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLmdldCgpKS0+Y2xlYXJDb250cmFjdGVkRnJhbWVzKCk7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjpyZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpCiB7CisgICAgLy8gY29uZmlndXJlIGZyb20gdXBzdHJlYW0gdG8gZG93bnN0cmVhbSBidWZmZXIgcHJvdmlkZXJzLgogICAgIGJ1ZmZlclByb3ZpZGVyID0gbUlucHV0QnVmZmVyUHJvdmlkZXI7CisgICAgaWYgKG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgYnVmZmVyUHJvdmlkZXIgPSBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5nZXQoKTsKKyAgICB9CisgICAgaWYgKG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIoYnVmZmVyUHJvdmlkZXIpOworICAgICAgICBidWZmZXJQcm92aWRlciA9IG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKTsKKyAgICB9CiAgICAgaWYgKG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKGJ1ZmZlclByb3ZpZGVyKTsKICAgICAgICAgYnVmZmVyUHJvdmlkZXIgPSBtUmVmb3JtYXRCdWZmZXJQcm92aWRlci5nZXQoKTsKQEAgLTUzMiw3ICs2NTMsOCBAQAogICAgICAgICBjYXNlIENIQU5ORUxfTUFTSzogewogICAgICAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdHJhY2tDaGFubmVsTWFzayA9CiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHZhbHVlSW50KTsKLSAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgdHJhY2tDaGFubmVsTWFzaywgdHJhY2stPm1NaXhlckNoYW5uZWxNYXNrKSkgeworICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCB0cmFja0NoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAodHJhY2stPm1NaXhlckNoYW5uZWxNYXNrIHwgdHJhY2stPm1NaXhlckhhcHRpY0NoYW5uZWxNYXNrKSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBDSEFOTkVMX01BU0ssICV4KSIsIHRyYWNrQ2hhbm5lbE1hc2spOwogICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICAgICAgICAgIH0KQEAgLTU0MSw2ICs2NjMsOSBAQAogICAgICAgICAgICAgaWYgKHRyYWNrLT5tYWluQnVmZmVyICE9IHZhbHVlQnVmKSB7CiAgICAgICAgICAgICAgICAgdHJhY2stPm1haW5CdWZmZXIgPSB2YWx1ZUJ1ZjsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNQUlOX0JVRkZFUiwgJXApIiwgdmFsdWVCdWYpOworICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC01NzAsMTYgKzY5NSwzNSBAQAogICAgICAgICAgICAgaWYgKHRyYWNrLT5tTWl4ZXJGb3JtYXQgIT0gZm9ybWF0KSB7CiAgICAgICAgICAgICAgICAgdHJhY2stPm1NaXhlckZvcm1hdCA9IGZvcm1hdDsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNSVhFUl9GT1JNQVQsICUjeCkiLCBmb3JtYXQpOworICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIE1JWEVSX0NIQU5ORUxfTUFTSzogewogICAgICAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWl4ZXJDaGFubmVsTWFzayA9CiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190Pih2YWx1ZUludCk7Ci0gICAgICAgICAgICBpZiAoc2V0Q2hhbm5lbE1hc2tzKG5hbWUsIHRyYWNrLT5jaGFubmVsTWFzaywgbWl4ZXJDaGFubmVsTWFzaykpIHsKKyAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgdHJhY2stPmNoYW5uZWxNYXNrIHwgdHJhY2stPm1IYXB0aWNDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgbWl4ZXJDaGFubmVsTWFzaykpIHsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNSVhFUl9DSEFOTkVMX01BU0ssICUjeCkiLCBtaXhlckNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEhBUFRJQ19FTkFCTEVEOiB7CisgICAgICAgICAgICBjb25zdCBib29sIGhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IHN0YXRpY19jYXN0PGJvb2w+KHZhbHVlSW50KTsKKyAgICAgICAgICAgIGlmICh0cmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCAhPSBoYXB0aWNQbGF5YmFja0VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICB0cmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IGhhcHRpY1BsYXliYWNrRW5hYmxlZDsKKyAgICAgICAgICAgICAgICB0cmFjay0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMgPSBoYXB0aWNQbGF5YmFja0VuYWJsZWQ7CisgICAgICAgICAgICAgICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEhBUFRJQ19JTlRFTlNJVFk6IHsKKyAgICAgICAgICAgIGNvbnN0IGhhcHRpY19pbnRlbnNpdHlfdCBoYXB0aWNJbnRlbnNpdHkgPSBzdGF0aWNfY2FzdDxoYXB0aWNfaW50ZW5zaXR5X3Q+KHZhbHVlSW50KTsKKyAgICAgICAgICAgIGlmICh0cmFjay0+bUhhcHRpY0ludGVuc2l0eSAhPSBoYXB0aWNJbnRlbnNpdHkpIHsKKyAgICAgICAgICAgICAgICB0cmFjay0+bUhhcHRpY0ludGVuc2l0eSA9IGhhcHRpY0ludGVuc2l0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJzZXRQYXJhbWV0ZXIgdHJhY2s6IGJhZCBwYXJhbSAlZCIsIHBhcmFtKTsKICAgICAgICAgfQpAQCAtODEzLDE0ICs5NTcsMTkgQEAKICAgICBpZiAodHJhY2stPm1JbnB1dEJ1ZmZlclByb3ZpZGVyID09IGJ1ZmZlclByb3ZpZGVyKSB7CiAgICAgICAgIHJldHVybjsgLy8gZG9uJ3QgcmVzZXQgYW55IGJ1ZmZlciBwcm92aWRlcnMgaWYgaWRlbnRpY2FsLgogICAgIH0KLSAgICBpZiAodHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgdHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwotICAgIH0gZWxzZSBpZiAodHJhY2stPm1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlciAhPSBudWxscHRyKSB7Ci0gICAgICAgIHRyYWNrLT5tRG93bm1peGVyQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CisgICAgLy8gcmVzZXQgb3JkZXIgZnJvbSBkb3duc3RyZWFtIHRvIHVwc3RyZWFtIGJ1ZmZlciBwcm92aWRlcnMuCisgICAgaWYgKHRyYWNrLT5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHRyYWNrLT5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKICAgICB9IGVsc2UgaWYgKHRyYWNrLT5tUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgdHJhY2stPm1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7Ci0gICAgfSBlbHNlIGlmICh0cmFjay0+bVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICB0cmFjay0+bVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CisgICAgfSBlbHNlIGlmICh0cmFjay0+bURvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgdHJhY2stPm1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5tQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICB0cmFjay0+bUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgIH0gZWxzZSBpZiAodHJhY2stPm1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgdHJhY2stPm1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwogICAgIH0KIAogICAgIHRyYWNrLT5tSW5wdXRCdWZmZXJQcm92aWRlciA9IGJ1ZmZlclByb3ZpZGVyOwpAQCAtMTI2NCw4ICsxNDEzLDggQEAKIAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0ID0gbVRyYWNrc1tncm91cFswXV07CiAgICAgICAgIG1lbXNldCh0LT5tYWluQnVmZmVyLCAwLAotICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50ICogdC0+bU1peGVyQ2hhbm5lbENvdW50Ci0gICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHQtPm1NaXhlckZvcm1hdCkpOworICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50ICogYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgdC0+bU1peGVyQ2hhbm5lbENvdW50ICsgdC0+bU1peGVySGFwdGljQ2hhbm5lbENvdW50LCB0LT5tTWl4ZXJGb3JtYXQpKTsKIAogICAgICAgICAvLyBub3cgY29uc3VtZSBkYXRhCiAgICAgICAgIGZvciAoY29uc3QgaW50IG5hbWUgOiBncm91cCkgewpAQCAtMTcwNCw2ICsxODUzLDQwIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NIYXB0aWNEYXRhKCkKK3sKKyAgICAvLyBOZWVkIHRvIGtlZXAgY29uc2lzdGVudCB3aXRoIFZpYnJhdGlvbkVmZmVjdC5zY2FsZShpbnQsIGZsb2F0LCBpbnQpCisgICAgZm9yIChjb25zdCBhdXRvICZwYWlyIDogbUdyb3VwcykgeworICAgICAgICAvLyBwcm9jZXNzIGJ5IGdyb3VwIG9mIHRyYWNrcyB3aXRoIHNhbWUgb3V0cHV0IG1haW4gYnVmZmVyLgorICAgICAgICBjb25zdCBhdXRvICZncm91cCA9IHBhaXIuc2Vjb25kOworICAgICAgICBmb3IgKGNvbnN0IGludCBuYW1lIDogZ3JvdXApIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnQgPSBtVHJhY2tzW25hbWVdOworICAgICAgICAgICAgaWYgKHQtPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc2FtcGxlQ291bnQgPSBtRnJhbWVDb3VudCAqIHQtPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgICAgICAgICBmbG9hdCBnYW1tYSA9IHQtPmdldEhhcHRpY1NjYWxlR2FtbWEoKTsKKyAgICAgICAgICAgICAgICBmbG9hdCBtYXhBbXBsaXR1ZGVSYXRpbyA9IHQtPmdldEhhcHRpY01heEFtcGxpdHVkZVJhdGlvKCk7CisgICAgICAgICAgICAgICAgdWludDhfdCogYnVmZmVyID0gKHVpbnQ4X3QqKXBhaXIuZmlyc3QgKyBtRnJhbWVDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1NaXhlckNoYW5uZWxDb3VudCwgdC0+bU1peGVyRm9ybWF0KTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHQtPm1NaXhlckZvcm1hdCkgeworICAgICAgICAgICAgICAgIC8vIE1peGVyIGZvcm1hdCBzaG91bGQgYmUgQVVESU9fRk9STUFUX1BDTV9GTE9BVC4KKyAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6IHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZvdXQgPSAoZmxvYXQqKSBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2FtcGxlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbXVsID0gZm91dFtpXSA+PSAwID8gMS4wIDogLTEuMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdXRbaV0gPSBwb3dmKGZhYnNmKGZvdXRbaV0gLyBIQVBUSUNfTUFYX0FNUExJVFVERV9GTE9BVCksIGdhbW1hKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1heEFtcGxpdHVkZVJhdGlvICogSEFQVElDX01BWF9BTVBMSVRVREVfRkxPQVQgKiBtdWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtTWl4ZXJGb3JtYXQ6ICUjeCIsIHQtPm1NaXhlckZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwogLyogVGhpcyB0cmFjayBob29rIGlzIGNhbGxlZCB0byBkbyByZXNhbXBsaW5nIHRoZW4gbWl4aW5nLAogICogcHVsbGluZyBmcm9tIHRoZSB0cmFjaydzIHVwc3RyZWFtIEF1ZGlvQnVmZmVyUHJvdmlkZXIuCiAgKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uaAppbmRleCA5MjE0NGQwLi40NzkxNDJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uaApAQCAtNTUsNiArNTUsMTEgQEAKICAgICB2aXJ0dWFsIHNpemVfdCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOwogCisgICAgdm9pZCByZXNldCgpIG92ZXJyaWRlIHsKKyAgICAgICAgQXVkaW9SZXNhbXBsZXI6OnJlc2V0KCk7CisgICAgICAgIG1JbkJ1ZmZlci5yZXNldCgpOworICAgIH0KKwogICAgIC8vIE1ha2UgYXZhaWxhYmxlIGtleSBkZXNpZ24gY3JpdGVyaWEgZm9yIHRlc3RpbmcKICAgICBpbnQgZ2V0SGFsZkxlbmd0aCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1Db25zdGFudHMubUhhbGZOdW1Db2VmczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaAppbmRleCBhNzQxNjc3Li45YjcwYTFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCkBAIC05MCw3ICs5MCw3IEBACiAgICAgICAgIEFjY3VtdWxhdG9yPENIQU5ORUxTLTEsIFRPPjo6YWNjKGNvZWYsIGRhdGEpOwogICAgIH0KICAgICBpbmxpbmUgdm9pZCB2b2x1bWUoVE8qJiBvdXQsIFRPIGdhaW4pIHsKLSAgICAgICAgKm91dCsrID0gdm9sdW1lQWRqdXN0KHZhbHVlLCBnYWluKTsKKyAgICAgICAgKm91dCsrICs9IHZvbHVtZUFkanVzdCh2YWx1ZSwgZ2Fpbik7CiAgICAgICAgIEFjY3VtdWxhdG9yPENIQU5ORUxTLTEsIFRPPjo6dm9sdW1lKG91dCwgZ2Fpbik7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCmluZGV4IDMyMGI4Y2YuLjVhMDNhMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAKICNkZWZpbmUgX19TVERDX0NPTlNUQU5UX01BQ1JPUwogI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxkbGZjbi5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0J1ZmZlclByb3ZpZGVycy5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQnVmZmVyUHJvdmlkZXJzLmNwcAppbmRleCBkNjA1NjBiLi4yMWQyNWUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQnVmZmVyUHJvdmlkZXJzLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQnVmZmVyUHJvdmlkZXJzLmNwcApAQCAtMTcsOCArMTcsMTEgQEAKICNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUHJvdmlkZXIiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KICNpbmNsdWRlIDxzb25pYy5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgpAQCAtMzUsMTMgKzM4LDYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0YXRpYyBpbmxpbmUgVCBtaW4oY29uc3QgVCYgYSwgY29uc3QgVCYgYikKLXsKLSAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKLX0KLQogQ29weUJ1ZmZlclByb3ZpZGVyOjpDb3B5QnVmZmVyUHJvdmlkZXIoc2l6ZV90IGlucHV0RnJhbWVTaXplLAogICAgICAgICBzaXplX3Qgb3V0cHV0RnJhbWVTaXplLCBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCkgOgogICAgICAgICBtSW5wdXRGcmFtZVNpemUoaW5wdXRGcmFtZVNpemUpLApAQCAtNjMsNyArNTksOCBAQAogCiBDb3B5QnVmZmVyUHJvdmlkZXI6On5Db3B5QnVmZmVyUHJvdmlkZXIoKQogewotICAgIEFMT0dWKCJ+Q29weUJ1ZmZlclByb3ZpZGVyKCVwKSIsIHRoaXMpOworICAgIEFMT0dWKCIlcyglcCkgJXp1ICVwICVwIiwKKyAgICAgICAgICAgX19mdW5jX18sIHRoaXMsIG1CdWZmZXIuZnJhbWVDb3VudCwgbVRyYWNrQnVmZmVyUHJvdmlkZXIsIG1Mb2NhbEJ1ZmZlckRhdGEpOwogICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgIT0gMCkgewogICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CiAgICAgfQpAQCAtOTgsOCArOTUsOCBAQAogICAgICAgICBtQ29uc3VtZWQgPSAwOwogICAgIH0KICAgICBBTE9HX0FTU0VSVChtQ29uc3VtZWQgPCBtQnVmZmVyLmZyYW1lQ291bnQpOwotICAgIHNpemVfdCBjb3VudCA9IG1pbihtTG9jYWxCdWZmZXJGcmFtZUNvdW50LCBtQnVmZmVyLmZyYW1lQ291bnQgLSBtQ29uc3VtZWQpOwotICAgIGNvdW50ID0gbWluKGNvdW50LCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICBzaXplX3QgY291bnQgPSBzdGQ6Om1pbihtTG9jYWxCdWZmZXJGcmFtZUNvdW50LCBtQnVmZmVyLmZyYW1lQ291bnQgLSBtQ29uc3VtZWQpOworICAgIGNvdW50ID0gc3RkOjptaW4oY291bnQsIHBCdWZmZXItPmZyYW1lQ291bnQpOwogICAgIHBCdWZmZXItPnJhdyA9IG1Mb2NhbEJ1ZmZlckRhdGE7CiAgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IGNvdW50OwogICAgIGNvcHlGcmFtZXMocEJ1ZmZlci0+cmF3LCAodWludDhfdCopbUJ1ZmZlci5yYXcgKyBtQ29uc3VtZWQgKiBtSW5wdXRGcmFtZVNpemUsCkBAIC0xMzMsNiArMTMwLDE2IEBACiAgICAgbUNvbnN1bWVkID0gMDsKIH0KIAordm9pZCBDb3B5QnVmZmVyUHJvdmlkZXI6OnNldEJ1ZmZlclByb3ZpZGVyKEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnApIHsKKyAgICBBTE9HVigiJXMoJXApOiBtVHJhY2tCdWZmZXJQcm92aWRlcjolcCAgbUJ1ZmZlci5mcmFtZUNvdW50OiV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgcCwgbVRyYWNrQnVmZmVyUHJvdmlkZXIsIG1CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgaWYgKG1UcmFja0J1ZmZlclByb3ZpZGVyID09IHApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSAwOworICAgIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI6OnNldEJ1ZmZlclByb3ZpZGVyKHApOworfQorCiBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXIoCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGlucHV0Q2hhbm5lbE1hc2ssCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dHB1dENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCkBAIC00NzksNyArNDg2LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIHRpbWUtc3RyZXRjaCB0aGUgZGF0YQotICAgICAgICBkc3RBdmFpbGFibGUgPSBtaW4obUxvY2FsQnVmZmVyRnJhbWVDb3VudCAtIG1SZW1haW5pbmcsIG91dHB1dERlc2lyZWQpOworICAgICAgICBkc3RBdmFpbGFibGUgPSBzdGQ6Om1pbihtTG9jYWxCdWZmZXJGcmFtZUNvdW50IC0gbVJlbWFpbmluZywgb3V0cHV0RGVzaXJlZCk7CiAgICAgICAgIHNpemVfdCBzcmNBdmFpbGFibGUgPSBtQnVmZmVyLmZyYW1lQ291bnQ7CiAgICAgICAgIHByb2Nlc3NGcmFtZXMoKHVpbnQ4X3QqKW1Mb2NhbEJ1ZmZlckRhdGEgKyBtUmVtYWluaW5nICogbUZyYW1lU2l6ZSwgJmRzdEF2YWlsYWJsZSwKICAgICAgICAgICAgICAgICBtQnVmZmVyLnJhdywgJnNyY0F2YWlsYWJsZSk7CkBAIC01MjgsNiArNTM1LDE2IEBACiAgICAgbVJlbWFpbmluZyA9IDA7CiB9CiAKK3ZvaWQgVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjo6c2V0QnVmZmVyUHJvdmlkZXIoQXVkaW9CdWZmZXJQcm92aWRlciAqcCkgeworICAgIEFMT0dWKCIlcyglcCk6IG1UcmFja0J1ZmZlclByb3ZpZGVyOiVwICBtQnVmZmVyLmZyYW1lQ291bnQ6JXp1IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBwLCBtVHJhY2tCdWZmZXJQcm92aWRlciwgbUJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICBpZiAobVRyYWNrQnVmZmVyUHJvdmlkZXIgPT0gcCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IDA7CisgICAgUGFzc3RocnVCdWZmZXJQcm92aWRlcjo6c2V0QnVmZmVyUHJvdmlkZXIocCk7Cit9CisKIHN0YXR1c190IFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI6OnNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKQogewogICAgIG1QbGF5YmFja1JhdGUgPSBwbGF5YmFja1JhdGU7CkBAIC01NjcsNyArNTg0LDcgQEAKICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgLy8gY3ljbGljYWxseSByZXBlYXQgdGhlIHNvdXJjZS4KICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBjb3VudCA9IDA7IGNvdW50IDwgKmRzdEZyYW1lczsgY291bnQgKz0gKnNyY0ZyYW1lcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVtYWluaW5nID0gbWluKCpzcmNGcmFtZXMsICpkc3RGcmFtZXMgLSBjb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZW1haW5pbmcgPSBzdGQ6Om1pbigqc3JjRnJhbWVzLCAqZHN0RnJhbWVzIC0gY291bnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHVpbnQ4X3QqKWRzdEJ1ZmZlciArIG1GcmFtZVNpemUgKiBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNCdWZmZXIsIG1GcmFtZVNpemUgKiByZW1haW5pbmcpOwogICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTYwOSw1ICs2MjYsNzIgQEAKICAgICAgICAgfQogICAgIH0KIH0KKworQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcjo6QWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcigKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBzaXplX3QgaW5DaGFubmVsQ291bnQsIHNpemVfdCBvdXRDaGFubmVsQ291bnQsCisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LCBhdWRpb19mb3JtYXRfdCBjb250cmFjdGVkRm9ybWF0LCB2b2lkKiBjb250cmFjdGVkQnVmZmVyKSA6CisgICAgICAgIENvcHlCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfZnJhbWUoaW5DaGFubmVsQ291bnQsIGZvcm1hdCksCisgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKHN0ZDo6bWF4KGluQ2hhbm5lbENvdW50LCBvdXRDaGFubmVsQ291bnQpLCBmb3JtYXQpLAorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQpLAorICAgICAgICBtRm9ybWF0KGZvcm1hdCksCisgICAgICAgIG1JbkNoYW5uZWxDb3VudChpbkNoYW5uZWxDb3VudCksCisgICAgICAgIG1PdXRDaGFubmVsQ291bnQob3V0Q2hhbm5lbENvdW50KSwKKyAgICAgICAgbVNhbXBsZVNpemVJbkJ5dGVzKGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSksCisgICAgICAgIG1GcmFtZUNvdW50KGZyYW1lQ291bnQpLAorICAgICAgICBtQ29udHJhY3RlZENoYW5uZWxDb3VudChpbkNoYW5uZWxDb3VudCAtIG91dENoYW5uZWxDb3VudCksCisgICAgICAgIG1Db250cmFjdGVkRm9ybWF0KGNvbnRyYWN0ZWRGb3JtYXQpLAorICAgICAgICBtQ29udHJhY3RlZEJ1ZmZlcihjb250cmFjdGVkQnVmZmVyKSwKKyAgICAgICAgbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzKDApCit7CisgICAgQUxPR1YoIkFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoJXApKCUjeCwgJXp1LCAlenUsICV6dSwgJSN4LCAlcCkiLCB0aGlzLCBmb3JtYXQsCisgICAgICAgICAgICBpbkNoYW5uZWxDb3VudCwgb3V0Q2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBjb250cmFjdGVkRm9ybWF0LCBjb250cmFjdGVkQnVmZmVyKTsKKyAgICBpZiAobUNvbnRyYWN0ZWRGb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQgJiYgbUluQ2hhbm5lbENvdW50ID4gbU91dENoYW5uZWxDb3VudCkgeworICAgICAgICBtQ29udHJhY3RlZEZyYW1lU2l6ZSA9IGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShtQ29udHJhY3RlZENoYW5uZWxDb3VudCwgbUNvbnRyYWN0ZWRGb3JtYXQpOworICAgIH0KK30KKworc3RhdHVzX3QgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIHBCdWZmZXIpCit7CisgICAgaWYgKG1Db250cmFjdGVkQnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gUmVzdHJpY3QgZnJhbWUgY291bnQgb25seSB3aGVuIGl0IGlzIG5lZWRlZCB0byBzYXZlIGNvbnRyYWN0ZWQgZnJhbWVzLgorICAgICAgICBjb25zdCBzaXplX3Qgb3V0RnJhbWVzTGVmdCA9IG1GcmFtZUNvdW50IC0gbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzOworICAgICAgICBpZiAob3V0RnJhbWVzTGVmdCA8IHBCdWZmZXItPmZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIC8vIFJlc3RyaWN0IHRoZSBmcmFtZSBjb3VudCBzbyB0aGF0IHdlIGRvbid0IHdyaXRlIG92ZXIgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIuCisgICAgICAgICAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gb3V0RnJhbWVzTGVmdDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQ29weUJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKHBCdWZmZXIpOworfQorCit2b2lkIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXI6OmNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpCit7CisgICAgaWYgKG1JbkNoYW5uZWxDb3VudCA+IG1PdXRDaGFubmVsQ291bnQpIHsKKyAgICAgICAgLy8gRm9yIGNhc2UgbXVsdGkgdG8gbW9ubywgYWRqdXN0X2NoYW5uZWxzIGhhcyBzcGVjaWFsIGxvZ2ljIHRoYXQgd2lsbCBtaXggZmlyc3QgdHdvIGlucHV0CisgICAgICAgIC8vIGNoYW5uZWxzIGludG8gYSBzaW5nbGUgb3V0cHV0IGNoYW5uZWwuIEluIHRoYXQgY2FzZSwgdXNlIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUKKyAgICAgICAgLy8gdG8ga2VlcCBvbmx5IG9uZSBjaGFubmVsIGRhdGEgZXZlbiB3aGVuIGNvbnRyYWN0aW5nIHRvIG1vbm8uCisgICAgICAgIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUoc3JjLCBtSW5DaGFubmVsQ291bnQsIGRzdCwgbU91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICBtU2FtcGxlU2l6ZUluQnl0ZXMsIGZyYW1lcyAqIG1JbkNoYW5uZWxDb3VudCAqIG1TYW1wbGVTaXplSW5CeXRlcyk7CisgICAgICAgIGlmIChtQ29udHJhY3RlZEZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRAorICAgICAgICAgICAgJiYgbUNvbnRyYWN0ZWRCdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGNvbnRyYWN0ZWRJZHggPSBmcmFtZXMgKiBtT3V0Q2hhbm5lbENvdW50ICogbVNhbXBsZVNpemVJbkJ5dGVzOworICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKSBtQ29udHJhY3RlZEJ1ZmZlciArIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcyAqIG1Db250cmFjdGVkRnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICBtQ29udHJhY3RlZEZvcm1hdCwgKHVpbnQ4X3QqKSBkc3QgKyBjb250cmFjdGVkSWR4LCBtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBtQ29udHJhY3RlZENoYW5uZWxDb3VudCAqIGZyYW1lcyk7CisgICAgICAgICAgICBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXMgKz0gZnJhbWVzOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUHJlZmVyIGV4cGFuZGluZyBkYXRhIGZyb20gdGhlIGVuZCBvZiBlYWNoIGF1ZGlvIGZyYW1lLgorICAgICAgICBhZGp1c3RfY2hhbm5lbHMoc3JjLCBtSW5DaGFubmVsQ291bnQsIGRzdCwgbU91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICBtU2FtcGxlU2l6ZUluQnl0ZXMsIGZyYW1lcyAqIG1JbkNoYW5uZWxDb3VudCAqIG1TYW1wbGVTaXplSW5CeXRlcyk7CisgICAgfQorfQorCit2b2lkIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXI6OnJlc2V0KCkKK3sKKyAgICBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXMgPSAwOworICAgIENvcHlCdWZmZXJQcm92aWRlcjo6cmVzZXQoKTsKK30KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCmluZGV4IDA1NWY3MjQuLjUwY2EzM2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaApAQCAtMTA0LDggKzEwNCw4IEBACiAgICAgICAgIGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwcjIpIHsKICAgICByZXR1cm4gZmFicyhwcjEubVNwZWVkIC0gcHIyLm1TcGVlZCkgPCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NSU5fREVMVEEgJiYKICAgICAgICAgICAgZmFicyhwcjEubVBpdGNoIC0gcHIyLm1QaXRjaCkgPCBBVURJT19USU1FU1RSRVRDSF9QSVRDSF9NSU5fREVMVEEgJiYKLSAgICAgICAgICAgcHIyLm1TdHJldGNoTW9kZSA9PSBwcjIubVN0cmV0Y2hNb2RlICYmCi0gICAgICAgICAgIHByMi5tRmFsbGJhY2tNb2RlID09IHByMi5tRmFsbGJhY2tNb2RlOworICAgICAgICAgICBwcjEubVN0cmV0Y2hNb2RlID09IHByMi5tU3RyZXRjaE1vZGUgJiYKKyAgICAgICAgICAgcHIxLm1GYWxsYmFja01vZGUgPT0gcHIyLm1GYWxsYmFja01vZGU7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0F1ZGlvUGxheWJhY2tSYXRlVmFsaWQoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvQW5kcm9pZC5icAppbmRleCA4MTFjMTZiLi4wYzhlNWJiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvQW5kcm9pZC5icApAQCAtMTAsNiArMTAsNyBAQAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ2aWJyYXRvciIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvc3JjL0VmZmVjdHNDb25maWcuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvc3JjL0VmZmVjdHNDb25maWcuY3BwCmluZGV4IDc2YjRhZGMuLmYzOWViMGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAKQEAgLTExNSw2ICsxMTUsNyBAQAogICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OLCAidm9pY2VfcmVjb2duaXRpb24ifSwKICAgICAgICAge0FVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OLCAidm9pY2VfY29tbXVuaWNhdGlvbiJ9LAogICAgICAgICB7QVVESU9fU09VUkNFX1VOUFJPQ0VTU0VELCAidW5wcm9jZXNzZWQifSwKKyAgICAgICAge0FVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRSwgInZvaWNlX3BlcmZvcm1hbmNlIn0sCiB9OwogCiAvKiogRmluZCB0aGUgc3RyZWFtIHR5cGUgZW51bSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdHJlYW0gdHlwZSBuYW1lIG9yIHJldHVybiBmYWxzZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5icAppbmRleCAyMjdmMmExLi45YzgyYjFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5icApAQCAtMTMsNyArMTMsNyBAQAogICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogInNvdW5kZngiLAogCiAgICAgY2ZsYWdzOiBbCi0gICAgICAgIC8vIi1EQlVJTERfRkxPQVQiLAorICAgICAgICAiLURCVUlMRF9GTE9BVCIsCiAgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXJyb3IiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKaW5kZXggYjRhMWQ3Ny4uOTlhYzRmNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCkBAIC0zMSwxMCArMzEsMTIgQEAKIC8vIERvIG5vdCBzdWJtaXQgd2l0aCBET1dOTUlYX0FMV0FZU19VU0VfR0VORVJJQ19ET1dOTUlYRVIgZGVmaW5lZCwgc3RyaWN0bHkgZm9yIHRlc3RpbmcKIC8vI2RlZmluZSBET1dOTUlYX0FMV0FZU19VU0VfR0VORVJJQ19ET1dOTUlYRVIgMAogCi0jZGVmaW5lIE1JTlVTXzNfREJfSU5fUTE5XzEyIDI4OTYgLy8gLTNkQiA9IDAuNzA3ICogMl4xMiA9IDI4OTYKLQogI2lmZGVmIEJVSUxEX0ZMT0FUCiAjZGVmaW5lIE1JTlVTXzNfREJfSU5fRkxPQVQgMC43MDcxMDY3OGYgLy8gLTNkQiA9IDAuNzA3MTA2NzhmCitjb25zdCBhdWRpb19mb3JtYXRfdCBnVGFyZ2V0Rm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKyNlbHNlCisjZGVmaW5lIE1JTlVTXzNfREJfSU5fUTE5XzEyIDI4OTYgLy8gLTNkQiA9IDAuNzA3ICogMl4xMiA9IDI4OTYKK2NvbnN0IGF1ZGlvX2Zvcm1hdF90IGdUYXJnZXRGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICNlbmRpZgogCiAvLyBzdWJzZXQgb2YgcG9zc2libGUgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdmFsdWVzLCBhbmQgQVVESU9fQ0hBTk5FTF9PVVRfKiByZW5hbWVkIHRvIENIQU5ORUxfTUFTS18qCkBAIC03MDMsNyArNzA1LDcgQEAKICAgICBtZW1zZXQoJnBEd21Nb2R1bGUtPmNvbnRleHQsIDAsIHNpemVvZihkb3dubWl4X29iamVjdF90KSk7CiAKICAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7Ci0gICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBnVGFyZ2V0Rm9ybWF0OwogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDE7CiAgICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwpAQCAtNzE1LDcgKzcxNyw3IEBACiAKICAgICAvLyBzZXQgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYWNjZXNzIG1vZGUsIGJ1dCBzaG91bGQgYmUgb3ZlcndyaXR0ZW4gYnkgY2FsbGVyCiAgICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKLSAgICBwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gZ1RhcmdldEZvcm1hdDsKICAgICBwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwpAQCAtNzYyLDggKzc2NCw4IEBACiAgICAgLy8gQ2hlY2sgY29uZmlndXJhdGlvbiBjb21wYXRpYmlsaXR5IHdpdGggYnVpbGQgb3B0aW9ucywgYW5kIGVmZmVjdCBjYXBhYmlsaXRpZXMKICAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlICE9IHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUKICAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzICE9IERPV05NSVhfT1VUUFVUX0NIQU5ORUxTCi0gICAgICAgIHx8IHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVAotICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CisgICAgICAgIHx8IHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBnVGFyZ2V0Rm9ybWF0CisgICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQgIT0gZ1RhcmdldEZvcm1hdCkgewogICAgICAgICBBTE9HRSgiRG93bm1peF9Db25maWd1cmUgZXJyb3I6IGludmFsaWQgY29uZmlnIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KQEAgLTExODUsOCArMTE4Nyw4IEBACiAgICAgaWYgKGFjY3VtdWxhdGUpIHsKICAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgewogICAgICAgICAgICAgLy8gY2VudGVyUGx1c0xmZUNvbnRyaWIgPSBGQygtM2RCKSArIExGRSgtM2RCKQotICAgICAgICAgICAgY2VudGVyUGx1c0xmZUNvbnRyaWIgPSAocFNyY1syXSAqIE1JTlVTXzNfREJfSU5fUTE5XzEyKQotICAgICAgICAgICAgICAgICAgICArIChwU3JjWzNdICogTUlOVVNfM19EQl9JTl9RMTlfMTIpOworICAgICAgICAgICAgY2VudGVyUGx1c0xmZUNvbnRyaWIgPSAocFNyY1syXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpCisgICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKTsKICAgICAgICAgICAgIC8vIEZMICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBTTCArIFJMCiAgICAgICAgICAgICBsdCA9IHBTcmNbMF0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNl0gKyBwU3JjWzRdOwogICAgICAgICAgICAgLy8gRlIgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNSICsgUlIKQEAgLTE0MjcsNCArMTQyOSw0IEBACiAgICAgfQogICAgIHJldHVybiB0cnVlOwogfQotI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYWZjNTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDMwIEBACisvLyBCdWlsZCB0ZXN0YmVuY2ggZm9yIGRvd25taXggbW9kdWxlLgorY2NfdGVzdCB7CisgICAgbmFtZToiZG93bm1peHRlc3QiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiBmYWxzZSwKKyAgICBwcm9wcmlldGFyeTogdHJ1ZSwKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4IiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmRvd25taXgiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic291bmRmeCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJkb3dubWl4dGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDBmYWViZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCkBAIC0wLDAgKzEsNjkgQEAKKyMhL2Jpbi9iYXNoCisjCisjUnVuIHRlc3RzIGluIHRoaXMgZGlyZWN0b3J5LgorIworCitpZiBbIC16ICIkQU5EUk9JRF9CVUlMRF9UT1AiIF07IHRoZW4KKyAgICBlY2hvICJBbmRyb2lkIGJ1aWxkIGVudmlyb25tZW50IG5vdCBzZXQiCisgICAgZXhpdCAtMQorZmkKKyNlbnN1cmUgd2UgaGF2ZSBtbQorLiAkQU5EUk9JRF9CVUlMRF9UT1AvYnVpbGQvZW52c2V0dXAuc2gKKworbW0gLWoKKworZWNobyAid2FpdGluZyBmb3IgZGV2aWNlIgorCithZGIgcm9vdCAmJiBhZGIgd2FpdC1mb3ItZGV2aWNlIHJlbW91bnQKKworI2xvY2F0aW9uIG9mIHRlc3QgZmlsZXMKK3Rlc3RkaXI9Ii9kYXRhL2xvY2FsL3RtcC9kb3dubWl4dGVzdCIKKworZnNfYXJyPSgKKyAgICA4MDAwCisgICAgMTEwMjUKKyAgICAxMjAwMAorICAgIDE2MDAwCisgICAgMjIwNTAKKyAgICAyNDAwMAorICAgIDMyMDAwCisgICAgNDQxMDAKKyAgICA0ODAwMAorICAgIDg4MjAwCisgICAgOTYwMDAKKyAgICAxNzY0MDAKKyAgICAxOTIwMDAKKykKKworZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKK2VjaG8gInRlc3RpbmcgRG93bm1peCIKK2FkYiBzaGVsbCBta2RpciAkdGVzdGRpcgorCithZGIgcHVzaCAkQU5EUk9JRF9CVUlMRF9UT1AvY3RzL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvc2luZXN3ZWVwcmF3LnJhdyBcCiskdGVzdGRpcgorYWRiIHB1c2ggJE9VVC90ZXN0Y2FzZXMvZG93bm1peHRlc3QvYXJtNjQvZG93bm1peHRlc3QgJHRlc3RkaXIKKworI3J1biB0aGUgZG93bm1peCB0ZXN0IGFwcGxpY2F0aW9uIGZvciB0ZXN0LgorZm9yIGZzIGluICR7ZnNfYXJyWypdfQorZG8KKyAgICBmb3IgZl9jaCBpbiB7MS4uOH0KKyAgICBkbworICAgICAgICBmb3IgY2hfZm10IGluIHswLi40fQorICAgICAgICBkbworICAgICAgICAgICAgYWRiIHNoZWxsICBMRF9MSUJSQVJZX1BBVEg9L3ZlbmRvci9saWI2NC9zb3VuZGZ4IFwKKyAgICAgICAgICAgICR0ZXN0ZGlyL2Rvd25taXh0ZXN0ICR0ZXN0ZGlyL3NpbmVzd2VlcHJhdy5yYXcgXAorICAgICAgICAgICAgJHRlc3RkaXIvc2luZXN3ZWVwX2ZtdF8kKChjaF9mbXQpKV9mY2hfJCgoZl9jaCkpXyQoKGZzKSkucmF3IFwKKyAgICAgICAgICAgIC1jaF9mbXQ6JGNoX2ZtdCAtZmNoOiRmX2NoIC1mczokZnMKKworICAgICAgICAgICAgIyBJbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgdGVzdDoKKyAgICAgICAgICAgICMgY2hlY2sgdGhhdCBoaWdoZXIgZnJlcXVlbmNpZXMgbWF0Y2ggOCBrSHogcmVzdWx0LgorICAgICAgICAgICAgaWYgWyAkZnMgIT0gODAwMCBdCisgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgYWRiIHNoZWxsIGNtcCBcCisgICAgICAgICAgICAgICAgJHRlc3RkaXIvc2luZXN3ZWVwX2ZtdF8kKChjaF9mbXQpKV9mY2hfJCgoZl9jaCkpXzgwMDAucmF3IFwKKyAgICAgICAgICAgICAgICAkdGVzdGRpci9zaW5lc3dlZXBfZm10XyQoKGNoX2ZtdCkpX2ZjaF8kKChmX2NoKSlfJCgoZnMpKS5yYXcKKyAgICAgICAgICAgIGZpCisgICAgICAgIGRvbmUKKyAgICBkb25lCitkb25lCithZGIgc2hlbGwgcm0gLXIgJHRlc3RkaXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9kb3dubWl4dGVzdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvZG93bm1peHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZjgzZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvZG93bm1peHRlc3QuY3BwCkBAIC0wLDAgKzEsMzA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X2Rvd25taXguaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJFZmZlY3REb3dubWl4LmgiCisjZGVmaW5lIEZSQU1FX0xFTkdUSCAyNTYKKyNkZWZpbmUgTUFYX05VTV9DSEFOTkVMUyA4CisKK3N0cnVjdCBkb3dubWl4X2NudHh0X3MgeworICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2M7CisgIGVmZmVjdF9oYW5kbGVfdCBoYW5kbGU7CisgIGVmZmVjdF9jb25maWdfdCBjb25maWc7CisKKyAgaW50IG51bUZpbGVDaGFubmVsczsKKyAgaW50IG51bVByb2Nlc3NDaGFubmVsczsKK307CisKK2V4dGVybiBhdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNOworCit2b2lkIHByaW50VXNhZ2UoKSB7CisgIHByaW50ZigiXG5Vc2FnZToiKTsKKyAgcHJpbnRmKCJcbiAgICAgZG93bm1peHRlc3QgPGlucHV0X2ZpbGU+IDxvdXRfZmlsZT4gW29wdGlvbnNdXG4iKTsKKyAgcHJpbnRmKCJcbndoZXJlLCIpOworICBwcmludGYoIlxuICAgICA8aW5wdXRfZmlsZT4gIGlzIHRoZSBpbnB1dCBmaWxlIG5hbWUiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgICAgICAgIG9uIHdoaWNoIExWTSBlZmZlY3RzIGFyZSBhcHBsaWVkIik7CisgIHByaW50ZigiXG4gICAgIDxvdXRwdXRfZmlsZT4gcHJvY2Vzc2VkIG91dHB1dCBmaWxlIik7CisgIHByaW50ZigiXG4gICAgIGFuZCBvcHRpb25zIGFyZSBtZW50aW9uZWQgYmVsb3ciKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAgLWgiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgUHJpbnRzIHRoaXMgdXNhZ2UgaW5mb3JtYXRpb24iKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtY2hfZm10Ojxmb3JtYXRfb2ZfaW5wdXRfYXVkaW8+Iik7CisgIHByaW50ZigiXG4gICAgICAgICAwOkFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEoZGVmYXVsdCkiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDE6QVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFIik7CisgIHByaW50ZigiXG4gICAgICAgICAyOkFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSyIpOworICBwcmludGYoIlxuICAgICAgICAgMzpBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREUiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDQ6QVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9CQUNLIik7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgLWZjaDo8ZmlsZV9jaGFubmVscz4gKDEgdGhyb3VnaCA4KSIpOworICBwcmludGYoIlxuIik7Cit9CisKK2ludDMyX3QgRG93bm1peERlZmF1bHRDb25maWcoZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKSB7CisgIHBDb25maWctPmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOworICBwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICBwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDE7CisgIHBDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IG51bGxwdHI7CisgIHBDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBudWxscHRyOworICBwQ29uZmlnLT5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBudWxscHRyOworICBwQ29uZmlnLT5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisKKyAgcENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CisgIHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSBwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGU7CisKKyAgLy8gc2V0IGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGFjY2VzcyBtb2RlLCBidXQgc2hvdWxkIGJlIG92ZXJ3cml0dGVuIGJ5IGNhbGxlcgorICBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFOworICBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKyAgcENvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICBwQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gbnVsbHB0cjsKKyAgcENvbmZpZy0+b3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBudWxscHRyOworICBwQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gbnVsbHB0cjsKKyAgcENvbmZpZy0+b3V0cHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKworICByZXR1cm4gMDsKK30KKworaW50MzJfdCBEb3dubWl4Q29uZml1cmVBbmRFbmFibGUoZG93bm1peF9jbnR4dF9zICpwRGVzY3JpcHRvcikgeworICBlZmZlY3RfaGFuZGxlX3QgKmVmZmVjdEhhbmRsZSA9ICZwRGVzY3JpcHRvci0+aGFuZGxlOworICBkb3dubWl4X21vZHVsZV90ICpkb3dubWl4RWZmZWN0SGFuZGxlID0gKGRvd25taXhfbW9kdWxlX3QgKikqZWZmZWN0SGFuZGxlOworICBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICpEb3dubWl4X2FwaSA9IGRvd25taXhFZmZlY3RIYW5kbGUtPml0ZmU7CisgIGludDMyX3QgZXJyID0gMDsKKyAgdWludDMyX3QgcmVwbHlTaXplID0gKHVpbnQzMl90KXNpemVvZihlcnIpOworCisgIGVyciA9IChEb3dubWl4X2FwaS0+Y29tbWFuZCkoKmVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfY29uZmlnX3QpLCAmKHBEZXNjcmlwdG9yLT5jb25maWcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseVNpemUsICZlcnIpOworICBpZiAoZXJyICE9IDApIHsKKyAgICBBTE9HRSgiRG93bm1peCBjb21tYW5kIHRvIGNvbmZpZ3VyZSByZXR1cm5lZCBhbiBlcnJvciAlZCIsIGVycik7CisgICAgcmV0dXJuIGVycjsKKyAgfQorCisgIGVyciA9ICgoRG93bm1peF9hcGktPmNvbW1hbmQpKSgqZWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX0VOQUJMRSwgMCwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseVNpemUsICZlcnIpOworICBpZiAoZXJyICE9IDApIHsKKyAgICBBTE9HRSgiRG93bm1peCBjb21tYW5kIHRvIGVuYWJsZSBlZmZlY3QgcmV0dXJuZWQgYW4gZXJyb3IgJWQiLCBlcnIpOworICAgIHJldHVybiBlcnI7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgRG93bm1peEV4ZWN1dGUoZG93bm1peF9jbnR4dF9zICpwRGVzY3JpcHRvciwgRklMRSAqZmlucCwKKyAgICAgICAgICAgICAgICAgICAgICAgRklMRSAqZm91dCkgeworICBlZmZlY3RfaGFuZGxlX3QgKmVmZmVjdEhhbmRsZSA9ICZwRGVzY3JpcHRvci0+aGFuZGxlOworICBkb3dubWl4X21vZHVsZV90ICpkb3dubWl4RWZmZWN0SGFuZGxlID0gKGRvd25taXhfbW9kdWxlX3QgKikqZWZmZWN0SGFuZGxlOworICBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICpEb3dubWl4X2FwaSA9IGRvd25taXhFZmZlY3RIYW5kbGUtPml0ZmU7CisKKyAgY29uc3QgaW50IG51bUZpbGVDaGFubmVscyA9IHBEZXNjcmlwdG9yLT5udW1GaWxlQ2hhbm5lbHM7CisgIGNvbnN0IGludCBudW1Qcm9jZXNzQ2hhbm5lbHMgPSBwRGVzY3JpcHRvci0+bnVtUHJvY2Vzc0NoYW5uZWxzOworICBjb25zdCBpbnQgZmlsZUZyYW1lU2l6ZSA9IG51bUZpbGVDaGFubmVscyAqIHNpemVvZihzaG9ydCk7CisgIGNvbnN0IHVuc2lnbmVkIGludCBvdXRwdXRDaGFubmVscyA9CisgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKKworICBzdGQ6OnZlY3RvcjxmbG9hdD4gb3V0RmxvYXQoRlJBTUVfTEVOR1RIICogTUFYX05VTV9DSEFOTkVMUyk7CisgIHN0ZDo6dmVjdG9yPGZsb2F0PiBpbkZsb2F0KEZSQU1FX0xFTkdUSCAqIE1BWF9OVU1fQ0hBTk5FTFMpOworCisgIGF1ZGlvX2J1ZmZlcl90IGluYnVmZmVyLCBvdXRidWZmZXI7CisgIGluYnVmZmVyLmYzMiA9IGluRmxvYXQuZGF0YSgpOworICBvdXRidWZmZXIuZjMyID0gb3V0RmxvYXQuZGF0YSgpOworICBpbmJ1ZmZlci5mcmFtZUNvdW50ID0gRlJBTUVfTEVOR1RIOworICBvdXRidWZmZXIuZnJhbWVDb3VudCA9IEZSQU1FX0xFTkdUSDsKKworICBhdWRpb19idWZmZXJfdCAqcGluYnVmLCAqcG91dGJ1ZjsKKyAgcGluYnVmID0gJmluYnVmZmVyOworICBwb3V0YnVmID0gJm91dGJ1ZmZlcjsKKworICBpbnQgZnJhbWVDb3VudGVyID0gMDsKKyAgc3RkOjp2ZWN0b3I8c2hvcnQ+IGluUzE2KEZSQU1FX0xFTkdUSCAqIE1BWF9OVU1fQ0hBTk5FTFMpOworICBzdGQ6OnZlY3RvcjxzaG9ydD4gb3V0UzE2KEZSQU1FX0xFTkdUSCAqIE1BWF9OVU1fQ0hBTk5FTFMpOworCisgIHdoaWxlIChmcmVhZChpblMxNi5kYXRhKCksIGZpbGVGcmFtZVNpemUsIEZSQU1FX0xFTkdUSCwgZmlucCkgPT0KKyAgICAgICAgIEZSQU1FX0xFTkdUSCkgeworICAgIGlmIChudW1GaWxlQ2hhbm5lbHMgIT0gbnVtUHJvY2Vzc0NoYW5uZWxzKSB7CisgICAgICBhZGp1c3RfY2hhbm5lbHMoaW5TMTYuZGF0YSgpLCBudW1GaWxlQ2hhbm5lbHMsIGluUzE2LmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICBudW1Qcm9jZXNzQ2hhbm5lbHMsIHNpemVvZihzaG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfTEVOR1RIICogZmlsZUZyYW1lU2l6ZSk7CisgICAgfQorCisgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KGluRmxvYXQuZGF0YSgpLCBpblMxNi5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0xFTkdUSCAqIG51bVByb2Nlc3NDaGFubmVscyk7CisKKyAgICBjb25zdCBpbnQzMl90IGVyciA9IChEb3dubWl4X2FwaS0+cHJvY2VzcykoKmVmZmVjdEhhbmRsZSwgcGluYnVmLCBwb3V0YnVmKTsKKyAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgIEFMT0dFKCJEb3dubWl4UHJvY2VzcyByZXR1cm5lZCBhbiBlcnJvciAlZCIsIGVycik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KG91dFMxNi5kYXRhKCksIG91dEZsb2F0LmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfTEVOR1RIICogb3V0cHV0Q2hhbm5lbHMpOworICAgIGZ3cml0ZShvdXRTMTYuZGF0YSgpLCBzaXplb2Yoc2hvcnQpLCAoRlJBTUVfTEVOR1RIICogb3V0cHV0Q2hhbm5lbHMpLAorICAgICAgICAgICBmb3V0KTsKKyAgICBmcmFtZUNvdW50ZXIrKzsKKyAgfQorICBwcmludGYoImZyYW1lQ291bnRlcjogWyVkXVxuIiwgZnJhbWVDb3VudGVyKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgRG93bWl4TWFpblByb2Nlc3MoZG93bm1peF9jbnR4dF9zICpwRGVzY3JpcHRvciwgRklMRSAqZmlucCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRSAqZm91dCkgeworICBlZmZlY3RfaGFuZGxlX3QgKmVmZmVjdEhhbmRsZSA9ICZwRGVzY3JpcHRvci0+aGFuZGxlOworICBpbnQzMl90IHNlc3Npb25JZCA9IDAsIGlvSWQgPSAwOworICBjb25zdCBlZmZlY3RfdXVpZF90IGRvd25taXhfdXVpZCA9IHsKKyAgICAgIDB4OTNmMDQ0NTIsIDB4ZTRmZSwgMHg0MWNjLCAweDkxZjksIHsweGU0LCAweDc1LCAweGI2LCAweGQxLCAweGQ2LCAweDlmfX07CisKKyAgaW50MzJfdCBlcnIgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTS5jcmVhdGVfZWZmZWN0KAorICAgICAgJmRvd25taXhfdXVpZCwgc2Vzc2lvbklkLCBpb0lkLAorICAgICAgZWZmZWN0SGFuZGxlKTsKKyAgaWYgKGVyciAhPSAwKSB7CisgICAgQUxPR0UoIkRvd25taXhMaWJfQ3JlYXRlIHJldHVybmVkIGFuIGVycm9yICVkIiwgZXJyKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvLyBQYXNzaW5nIHRoZSBpbml0IGNvbmZpZyBmb3IgdGltZSBiZWluZy4KKyAgZXJyID0gRG93bm1peENvbmZpdXJlQW5kRW5hYmxlKHBEZXNjcmlwdG9yKTsKKyAgaWYgKGVyciAhPSAwKSB7CisgICAgQUxPR0UoIkRvd25taXhDb25maWd1cmVBbmRFbmFibGUgcmV0dXJuZWQgYW4gZXJyb3IgJWQiLCBlcnIpOworICAgIHJldHVybiAtMTsKKyAgfQorICAvLyBleGVjdXRlIGNhbGwgZm9yIGRvd25taXguCisgIGVyciA9IERvd25taXhFeGVjdXRlKHBEZXNjcmlwdG9yLCBmaW5wLCBmb3V0KTsKKyAgaWYgKGVyciAhPSAwKSB7CisgICAgQUxPR0UoIkRvd25taXhFeGVjdXRlIHJldHVybmVkIGFuIGVycm9yICVkIiwgZXJyKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgLy8gUmVsZWFzZSB0aGUgbGlicmFyeSBmdW5jdGlvbi4KKyAgZXJyID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0ucmVsZWFzZV9lZmZlY3QoKmVmZmVjdEhhbmRsZSk7CisgIGlmIChlcnIgIT0gMCkgeworICAgIEFMT0dFKCJEb3dubWl4UmVsZWFzZSByZXR1cm5lZCBhbiBlcnJvciAlZCIsIGVycik7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgIGludCBudW1GaWxlQ2hhbm5lbHMgPSAxLCBudW1Qcm9jZXNzQ2hhbm5lbHMgPSA4OworICBkb3dubWl4X2NudHh0X3MgZGVzY3JpcHRvciA9IHt9OworICBEb3dubWl4RGVmYXVsdENvbmZpZygmKGRlc2NyaXB0b3IuY29uZmlnKSk7CisKKyAgY29uc3QgY2hhciAqaW5maWxlID0gbnVsbHB0cjsKKyAgY29uc3QgY2hhciAqb3V0ZmlsZSA9IG51bGxwdHI7CisgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgcHJpbnRmKCIlcyAiLCBhcmd2W2ldKTsKKyAgICBpZiAoYXJndltpXVswXSAhPSAnLScpIHsKKyAgICAgIGlmIChpbmZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICBpbmZpbGUgPSBhcmd2W2ldOworICAgICAgfSBlbHNlIGlmIChvdXRmaWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgb3V0ZmlsZSA9IGFyZ3ZbaV07CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItZnM6IiwgNCkpIHsKKyAgICAgIC8vIEFkZCBhIGNoZWNrIGZvciBhbGwgdGhlIHN1cHBvcnRlZCBzdHJlYW1zLgorICAgICAgY29uc3QgaW50IHNhbXBsaW5nRnJlcSA9IGF0b2koYXJndltpXSArIDQpOworICAgICAgaWYgKHNhbXBsaW5nRnJlcSAhPSA4MDAwICYmIHNhbXBsaW5nRnJlcSAhPSAxMTAyNSAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAxMjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMTYwMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMjIwNTAgJiYgc2FtcGxpbmdGcmVxICE9IDI0MDAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDMyMDAwICYmIHNhbXBsaW5nRnJlcSAhPSA0NDEwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSA0ODAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gODgyMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gOTYwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDE3NjQwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAxOTIwMDApIHsKKyAgICAgICAgcHJpbnRmKCJVbnN1cHBvcnRlZCBTYW1wbGluZyBGcmVxdWVuY3kgOiAlZCIsIHNhbXBsaW5nRnJlcSk7CisgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorCisgICAgICBkZXNjcmlwdG9yLmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSBzYW1wbGluZ0ZyZXE7CisgICAgICBkZXNjcmlwdG9yLmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gc2FtcGxpbmdGcmVxOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1jaF9mbXQ6IiwgOCkpIHsKKyAgICAgIGNvbnN0IGludCBmb3JtYXQgPSBhdG9pKGFyZ3ZbaV0gKyA4KTsKKyAgICAgIHVpbnQzMl90ICphdWRpb1R5cGUgPSAmZGVzY3JpcHRvci5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHM7CisgICAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgKmF1ZGlvVHlwZSA9IEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAqYXVkaW9UeXBlID0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgKmF1ZGlvVHlwZSA9IEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICphdWRpb1R5cGUgPSBBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAqYXVkaW9UeXBlID0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9CQUNLOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICphdWRpb1R5cGUgPSBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVzY3JpcHRvci5udW1Qcm9jZXNzQ2hhbm5lbHMgPQorICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzaygqYXVkaW9UeXBlKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItZmNoOiIsIDUpKSB7CisgICAgICBjb25zdCBpbnQgZkNoYW5uZWxzID0gYXRvaShhcmd2W2ldICsgNSk7CisgICAgICBpZiAoZkNoYW5uZWxzID4gOCB8fCBmQ2hhbm5lbHMgPCAxKSB7CisgICAgICAgIHByaW50ZigiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGZpbGUgY2hhbm5lbHMgOiAlZCIsIGZDaGFubmVscyk7CisgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgZGVzY3JpcHRvci5udW1GaWxlQ2hhbm5lbHMgPSBmQ2hhbm5lbHM7CisKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItaCIsIDIpKSB7CisgICAgICBwcmludFVzYWdlKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBpZiAoLyppbmZpbGUgPT0gbnVsbHB0ciB8fCAqLyBvdXRmaWxlID09IG51bGxwdHIpIHsKKyAgICBwcmludFVzYWdlKCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgRklMRSAqZmlucCA9IGZvcGVuKGluZmlsZSwgInJiIik7CisgIGlmIChmaW5wID09IG51bGxwdHIpIHsKKyAgICBwcmludGYoIkNhbm5vdCBvcGVuIGlucHV0IGZpbGUgJXMiLCBpbmZpbGUpOworICAgIHJldHVybiAtMTsKKyAgfQorICBGSUxFICpmb3V0ID0gZm9wZW4ob3V0ZmlsZSwgIndiIik7CisgIGlmIChmb3V0ID09IG51bGxwdHIpIHsKKyAgICBwcmludGYoIkNhbm5vdCBvcGVuIG91dHB1dCBmaWxlICVzIiwgb3V0ZmlsZSk7CisgICAgZmNsb3NlKGZpbnApOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGNvbnN0IGludCBlcnIgPSBEb3dtaXhNYWluUHJvY2VzcygmZGVzY3JpcHRvciwgZmlucCwgZm91dCk7CisgIC8vIGNsb3NlIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMuCisgIGZjbG9zZShmaW5wKTsKKyAgZmNsb3NlKGZvdXQpOworICBpZiAoZXJyICE9IDApIHsKKyAgICBwcmludGYoIkVycm9yOiAlZFxuIiwgZXJyKTsKKyAgfQorICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9FZmZlY3RMb3VkbmVzc0VuaGFuY2VyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvRWZmZWN0TG91ZG5lc3NFbmhhbmNlci5jcHAKaW5kZXggOWQyOWNmMS4uZDYxZWZkMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9FZmZlY3RMb3VkbmVzc0VuaGFuY2VyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0VmZmVjdExvdWRuZXNzRW5oYW5jZXIuY3BwCkBAIC0zMCw2ICszMCwyNiBAQAogI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X2xvdWRuZXNzZW5oYW5jZXIuaD4KICNpbmNsdWRlICJkc3AvY29yZS9keW5hbWljX3JhbmdlX2NvbXByZXNzaW9uLmgiCiAKKy8vIEJVSUxEX0ZMT0FUIHRhcmdldHMgYnVpbGRpbmcgYSBmbG9hdCBlZmZlY3QgaW5zdGVhZCBvZiB0aGUgbGVnYWN5IGludDE2X3QgZWZmZWN0LgorI2RlZmluZSBCVUlMRF9GTE9BVAorCisjaWZkZWYgQlVJTERfRkxPQVQKKworc3RhdGljIGNvbnN0ZXhwciBhdWRpb19mb3JtYXRfdCBrUHJvY2Vzc0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisKKyNlbHNlCisKK3N0YXRpYyBjb25zdGV4cHIgYXVkaW9fZm9ybWF0X3Qga1Byb2Nlc3NGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKworc3RhdGljIGlubGluZSBpbnQxNl90IGNsYW1wMTYoaW50MzJfdCBzYW1wbGUpCit7CisgICAgaWYgKChzYW1wbGU+PjE1KSBeIChzYW1wbGU+PjMxKSkKKyAgICAgICAgc2FtcGxlID0gMHg3RkZGIF4gKHNhbXBsZT4+MzEpOworICAgIHJldHVybiBzYW1wbGU7Cit9CisKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAorCiBleHRlcm4gIkMiIHsKIAogLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgTEUgZWZmZWN0CkBAIC04MCwxMyArMTAwLDYgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2KGludDMyX3Qgc2FtcGxlKQotewotICAgIGlmICgoc2FtcGxlPj4xNSkgXiAoc2FtcGxlPj4zMSkpCi0gICAgICAgIHNhbXBsZSA9IDB4N0ZGRiBeIChzYW1wbGU+PjMxKTsKLSAgICByZXR1cm4gc2FtcGxlOwotfQotCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIExFX3NldENvbmZpZygpCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTExMSw3ICsxMjQsNyBAQAogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pIHJldHVybiAtRUlOVkFMOwogICAgIGlmIChwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSAhPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSAmJgogICAgICAgICAgICAgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgIT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgcmV0dXJuIC1FSU5WQUw7Ci0gICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBrUHJvY2Vzc0Zvcm1hdCkgcmV0dXJuIC1FSU5WQUw7CiAKICAgICBwQ29udGV4dC0+bUNvbmZpZyA9ICpwQ29uZmlnOwogCkBAIC0xNTksNyArMTcyLDcgQEAKIAogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGtQcm9jZXNzRm9ybWF0OwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC0xNjcsNyArMTgwLDcgQEAKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IGtQcm9jZXNzRm9ybWF0OwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC0yODQsMTggKzI5Nyw0MSBAQAogCiAgICAgLy9BTE9HVigiTEUgYWJvdXQgdG8gcHJvY2VzcyAlZCBzYW1wbGVzIiwgaW5CdWZmZXItPmZyYW1lQ291bnQpOwogICAgIHVpbnQxNl90IGluSWR4OworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgY29uc3RleHByIGZsb2F0IHNjYWxlID0gMSA8PCAxNTsgLy8gcG93ZXIgb2YgMiBpcyBsb3NzbGVzcyBjb252ZXJzaW9uIHRvIGludDE2X3QgcmFuZ2UKKyAgICBjb25zdGV4cHIgZmxvYXQgaW52ZXJzZVNjYWxlID0gMS5mIC8gc2NhbGU7CisgICAgY29uc3QgZmxvYXQgaW5wdXRBbXAgPSBwb3coMTAsIHBDb250ZXh0LT5tVGFyZ2V0R2Fpbm1CLzIwMDAuMGYpICogc2NhbGU7CisjZWxzZQogICAgIGZsb2F0IGlucHV0QW1wID0gcG93KDEwLCBwQ29udGV4dC0+bVRhcmdldEdhaW5tQi8yMDAwLjBmKTsKKyNlbmRpZgogICAgIGZsb2F0IGxlZnRTYW1wbGUsIHJpZ2h0U2FtcGxlOwogICAgIGZvciAoaW5JZHggPSAwIDsgaW5JZHggPCBpbkJ1ZmZlci0+ZnJhbWVDb3VudCA7IGluSWR4KyspIHsKICAgICAgICAgLy8gbWFrZXVwIGdhaW4gaXMgYXBwbGllZCBvbiB0aGUgaW5wdXQgb2YgdGhlIGNvbXByZXNzb3IKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBsZWZ0U2FtcGxlICA9IGlucHV0QW1wICogaW5CdWZmZXItPmYzMlsyKmluSWR4XTsKKyAgICAgICAgcmlnaHRTYW1wbGUgPSBpbnB1dEFtcCAqIGluQnVmZmVyLT5mMzJbMippbklkeCArMV07CisgICAgICAgIHBDb250ZXh0LT5tQ29tcHJlc3Nvci0+Q29tcHJlc3MoJmxlZnRTYW1wbGUsICZyaWdodFNhbXBsZSk7CisgICAgICAgIGluQnVmZmVyLT5mMzJbMippbklkeF0gICAgPSBsZWZ0U2FtcGxlICogaW52ZXJzZVNjYWxlOworICAgICAgICBpbkJ1ZmZlci0+ZjMyWzIqaW5JZHggKzFdID0gcmlnaHRTYW1wbGUgKiBpbnZlcnNlU2NhbGU7CisjZWxzZQogICAgICAgICBsZWZ0U2FtcGxlICA9IGlucHV0QW1wICogKGZsb2F0KWluQnVmZmVyLT5zMTZbMippbklkeF07CiAgICAgICAgIHJpZ2h0U2FtcGxlID0gaW5wdXRBbXAgKiAoZmxvYXQpaW5CdWZmZXItPnMxNlsyKmluSWR4ICsxXTsKICAgICAgICAgcENvbnRleHQtPm1Db21wcmVzc29yLT5Db21wcmVzcygmbGVmdFNhbXBsZSwgJnJpZ2h0U2FtcGxlKTsKICAgICAgICAgaW5CdWZmZXItPnMxNlsyKmluSWR4XSAgICA9IChpbnQxNl90KSBsZWZ0U2FtcGxlOwogICAgICAgICBpbkJ1ZmZlci0+czE2WzIqaW5JZHggKzFdID0gKGludDE2X3QpIHJpZ2h0U2FtcGxlOworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAgICAgfQogCiAgICAgaWYgKGluQnVmZmVyLT5yYXcgIT0gb3V0QnVmZmVyLT5yYXcpIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBpZiAocENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRCdWZmZXItPmZyYW1lQ291bnQqMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mMzJbaV0gKz0gaW5CdWZmZXItPmYzMltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnJhdywgaW5CdWZmZXItPnJhdywgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMiAqIHNpemVvZihmbG9hdCkpOworICAgICAgICB9CisjZWxzZQogICAgICAgICBpZiAocENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgewogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRCdWZmZXItPmZyYW1lQ291bnQqMjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5zMTZbaV0gPSBjbGFtcDE2KG91dEJ1ZmZlci0+czE2W2ldICsgaW5CdWZmZXItPnMxNltpXSk7CkBAIC0zMDMsNiArMzM5LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnJhdywgaW5CdWZmZXItPnJhdywgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMiAqIHNpemVvZihpbnQxNl90KSk7CiAgICAgICAgIH0KKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogICAgIH0KICAgICBpZiAocENvbnRleHQtPm1TdGF0ZSAhPSBMT1VETkVTU19FTkhBTkNFUl9TVEFURV9BQ1RJVkUpIHsKICAgICAgICAgcmV0dXJuIC1FTk9EQVRBOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5icAppbmRleCA1YzU3YzQzLi43YTMyZDNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5icApAQCAtMTI5LDExICsxMjksMTQgQEAKICAgICAgICAgIkNvbW1vbi9saWIiLAogICAgICAgICAiQnVuZGxlL2xpYiIsCiAgICAgXSwKLQorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKICAgICAgICAgIi1EQlVJTERfRkxPQVQiLAogICAgICAgICAiLURISUdIRVJfRlMiLAorICAgICAgICAiLURTVVBQT1JUX01DIiwKIAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCmluZGV4IDRjMmI5NTQuLmNjMDY2YjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCkBAIC0xOTksOCArMTk5LDEwIEBACiAjZGVmaW5lIExWREJFX0NBUF9GU180NDEwMCAgICAgICAgICAgICAgIDEyOAogI2RlZmluZSBMVkRCRV9DQVBfRlNfNDgwMDAgICAgICAgICAgICAgICAyNTYKICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzk2MDAwICAgICAgICAgICAgICAgNTEyCi0jZGVmaW5lIExWREJFX0NBUF9GU18xOTIwMDAgICAgICAgICAgICAgIDEwMjQKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzg4MjAwICAgICAgICAgICAgICAgNTEyCisjZGVmaW5lIExWREJFX0NBUF9GU185NjAwMCAgICAgICAgICAgICAgIDEwMjQKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzE3NjQwMCAgICAgICAgICAgICAgMjA0OAorI2RlZmluZSBMVkRCRV9DQVBfRlNfMTkyMDAwICAgICAgICAgICAgICA0MDk2CiAjZW5kaWYKIAogdHlwZWRlZiBlbnVtCkBAIC0yMTUsOCArMjE3LDEwIEBACiAgICAgTFZEQkVfRlNfNDQxMDAgPSA3LAogICAgIExWREJFX0ZTXzQ4MDAwID0gOCwKICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSAgICBMVkRCRV9GU185NjAwMCA9IDksCi0gICAgTFZEQkVfRlNfMTkyMDAwID0gMTAsCisgICAgTFZEQkVfRlNfODgyMDAgPSA5LAorICAgIExWREJFX0ZTXzk2MDAwID0gMTAsCisgICAgTFZEQkVfRlNfMTc2NDAwID0gMTEsCisgICAgTFZEQkVfRlNfMTkyMDAwID0gMTIsCiAjZW5kaWYKICAgICBMVkRCRV9GU19NQVggICA9IExWTV9NQVhJTlRfMzIKIH0gTFZEQkVfRnNfZW47CkBAIC0yNTYsNiArMjYwLDkgQEAKICAgICBMVkRCRV9Wb2x1bWVfZW4gICAgICAgICBWb2x1bWVDb250cm9sOwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFZvbHVtZWRCOwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEhlYWRyb29tZEI7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHM7CisjZW5kaWYKIAogfSBMVkRCRV9QYXJhbXNfdDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oCmluZGV4IDRlY2FmMTQuLjhmMDU4ZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKQEAgLTU4MCwxMiArNTgwLDI0IEBACiAjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg5ODgyZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1ODE4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcxNjM2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODU4MThmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTQ0NjZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5NDQ4MWYKKwogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NjA0MGYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MjA4MGYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg2MDQwZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk0OTE1ZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTQ5MjhmCiAKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODcxODNmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzQzNjZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzE4M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NzIzM2YpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk3MjM3ZgorCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg3Mjk0ZgogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTc0NTg4ZikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODcyOTRmCkBAIC02NDIsMTIgKzY1NCwyNCBAQAogI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4Nzg3MWYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTI3M2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MDU0NmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1MjczZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkzMzU5ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTMzODFmCisKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODU1MzlmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzEwNzdmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTUzOWYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5Mzg5OGYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkzOTE3ZgogCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg2OTEwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTczODIwZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODY5MTBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTY2NzlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NjY4NWYKKwogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NzA0M2YKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3NDA4NmYpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MDQzZgpAQCAtNzAzLDEyICs3MjcsMjQgQEAKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODU2ODFmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ2NzhmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NjkzNTZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDY3OGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MjE1MWYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkyMTgyZgorCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0OTkyZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY5OTg0ZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ5OTJmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTI3ODlmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjgxNWYKIAorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjYxMmYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MzIyNGYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NjEyZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2MDc2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTYwODNmCisKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY3NjlmCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzM1MzlmKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4Njc2OWYKQEAgLTc2NCwxMiArODAwLDI0IEBACiAjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODM0OTdmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODQwODRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NjgxNjhmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDA4NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MDk0NGYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkwOTg1ZgorCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NDQ2ZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY4ODkyZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0NDZmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTE2ODBmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MTcxNGYKIAorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjMxNGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MjYyOWYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2MzE0ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk1NDcyZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTU0ODJmCisKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY0OTZmCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzI5OTJmKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjQ5NmYKQEAgLTgzMSwxMiArODc5LDI0IEBACiAjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY4NzVmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMDgzMWYKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwODMxZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk4MzIxZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5ODMzOGYKKwogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAwNzYyZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDA3NjJmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTg0NjFmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk4NDc3ZgogCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDA0MTZmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDQxNmYpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5OTE2NGYpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTkxNjlmCisKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMDM4MWYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMzgxZikKQEAgLTg5MiwxMiArOTUyLDI0IEBACiAjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5NTY5MGYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDExNDZmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDExNDZmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NzY4NGYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5NzcwOGYKKwogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDEwNTVmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDEwNTVmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5Nzg2OGYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5Nzg5MWYKIAorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDA1NzNmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMDA1NzNmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjk5ODg0N2YpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAwLjk5ODg1M2YKKwogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDA1MjhmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgKC0wLjAwMDUyOGYpCkBAIC05NTMsMTIgKzEwMjUsMjQgQEAKICNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkzNjM5ZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAxNjkzZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTY5M2YpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICgtMS45OTY1ODJmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAwLjk5NjYxNWYKKwogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDE1NTVmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTU1NTVmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAoLTEuOTk2ODYwZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk2ODkxZgogCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMDg0N2YKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDg0N2YpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAoLTEuOTk4Mjk4ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk4MzA2ZgorCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMDc3OGYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAoLTAuMDAwNzc4ZikKQEAgLTEwMTQsMTIgKzEwOTgsMjQgQEAKICNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5MjE3N2YKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBCUEZfRnM4ODIwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAyMDgzZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDIwODNmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTU3OTFmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk1ODM1ZgorCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDE5MTNmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxOTEzZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTYxMzRmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2MTc0ZgogCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDEwNDJmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTA0MmYpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NzkwNGYpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgMC45OTc5MTVmCisKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMDk1OGYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMDA5NThmKQpAQCAtMTA0NSw3ICsxMTQxLDkgQEAKICNkZWZpbmUgQUdDX0FUVEFDS19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTcxNjI4ZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnM4ODIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0NThmCiAjZGVmaW5lIEFHQ19BVFRBQ0tfRnM5NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45ODU3MTJmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxNzY0MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTIxOTlmCiAjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTI4MzBmCiAjZW5kaWYKIApAQCAtMTA2Miw3ICsxMTYwLDkgQEAKICNkZWZpbmUgQUdDX0RFQ0FZX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDA3ZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEFHQ19ERUNBWV9Gczg4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAzOGYKICNkZWZpbmUgQUdDX0RFQ0FZX0ZTOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDM1ZgorI2RlZmluZSBBR0NfREVDQVlfRnMxNzY0MDAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAxODhmCiAjZGVmaW5lIEFHQ19ERUNBWV9GUzE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDE3NWYKICNlbmRpZgogCkBAIC0xMTI1LDcgKzEyMjUsOSBAQAogI2RlZmluZSBWT0xfVENfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwNDUyNWYKICNkZWZpbmUgVk9MX1RDX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDQxNThmCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIFZPTF9UQ19Gczg4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAyMjYzZgogI2RlZmluZSBWT0xfVENfRnM5NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMjA3OWYKKyNkZWZpbmUgVk9MX1RDX0ZzMTc2NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDExMzFmCiAjZGVmaW5lIFZPTF9UQ19GczE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxMDM5ZgogI2VuZGlmCiAjZGVmaW5lIE1JWF9UQ19GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5MzY1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC44OTYxNTEgKi8KQEAgLTExMzgsOSArMTI0MCwxMyBAQAogI2RlZmluZSBNSVhfVENfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjA5NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc5NTE1ICovCiAjZGVmaW5lIE1JWF9UQ19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMTUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODExNTAgKi8KICNpZmRlZiBISUdIRVJfRlMKKy8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTg5NzA0ICovCisjZGVmaW5lIE1JWF9UQ19Gczg4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNDMwCiAjZGVmaW5lIE1JWF9UQ19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNDU2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTA1MzAgKi8KKy8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk0ODM4ICovCisjZGVmaW5lIE1JWF9UQ19GczE3NjQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNTk4CiAjZGVmaW5lIE1JWF9UQ19GczE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNjExICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTI1MjQgKi8KICNlbmRpZgogCiAjZW5kaWYgLypCVUlMRF9GTE9BVCovCi0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jCmluZGV4IGZkNDAxNmIuLjBiYTJjODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYwpAQCAtMTE4LDcgKzExOCw3IEBACiAgICAgICogQ2FsY3VsYXRlIHRoZSB0YWJsZSBvZmZzZXRzCiAgICAgICovCiAgICAgTFZNX1VJTlQxNiBPZmZzZXQgPSAoTFZNX1VJTlQxNikoKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZSArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShwUGFyYW1zLT5DZW50cmVGcmVxdWVuY3kgKiAoMStMVkRCRV9GU180ODAwMCkpKTsgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikocFBhcmFtcy0+Q2VudHJlRnJlcXVlbmN5ICogKDErTFZEQkVfRlNfNDgwMDApKSk7CiAjZW5kaWYKIAogICAgIC8qCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYwppbmRleCAzZmZmMmEyLi4yOTQ2NzM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKQEAgLTk1LDcgKzk1LDcgQEAKICNpZmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgPSBzaXplb2YoTFZEQkVfQ29lZl9GTE9BVF90KTsKICNlbHNlCi0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICAgICAgICA9IHNpemVvZihMVkRCRV9Db2VmX3QpOyAgIAorICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgICAgICAgPSBzaXplb2YoTFZEQkVfQ29lZl90KTsKICNlbmRpZgogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5BbGlnbm1lbnQgICAgPSBMVkRCRV9QRVJTSVNURU5UX0NPRUZfQUxJR047CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlR5cGUgICAgICAgICA9IExWREJFX1BFUlNJU1RFTlRfQ09FRjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCmluZGV4IDRlNTIwN2YuLjQyMjVhMzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaApAQCAtNjQsNyArNjQsMTIgQEAKICNkZWZpbmUgTFZEQkVfUEVSU0lTVEVOVF9DT0VGX0FMSUdOICAgICAgNCAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBjb2VmICovCiAjZGVmaW5lIExWREJFX1NDUkFUQ0hfQUxJR04gICAgICAgICAgICAgIDQgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyBkYXRhICovCiAKKyNpZmRlZiBTVVBQT1JUX01DCisvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCisjZGVmaW5lIExWREJFX1NDUkFUQ0hCVUZGRVJTX0lOUExBQ0UgICAgIChMVk1fTUFYX0NIQU5ORUxTICogMykKKyNlbHNlCiAjZGVmaW5lIExWREJFX1NDUkFUQ0hCVUZGRVJTX0lOUExBQ0UgICAgIDYgICAgICAgLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworI2VuZGlmCiAKICNkZWZpbmUgTFZEQkVfTUlYRVJfVEMgICAgICAgICAgICAgICAgICAgNSAgICAgICAvKiBNaXhlciB0aW1lICAqLwogI2RlZmluZSBMVkRCRV9CWVBBU1NfTUlYRVJfVEMgICAgICAgICAgICAxMDAgICAgIC8qIEJ5cGFzcyBtaXhlciB0aW1lICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYwppbmRleCAxMGVhNzAwLi5jNGQzNDAzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMKQEAgLTIxLDExICsyMSwxMyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2luY2x1ZGUgPHN0cmluZy5oPiAvLyBtZW1zZXQKICNpbmNsdWRlICJMVkRCRS5oIgogI2luY2x1ZGUgIkxWREJFX1ByaXZhdGUuaCIKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAjaW5jbHVkZSAiQUdDLmgiCiAjaW5jbHVkZSAiTFZEQkVfQ29lZmZzLmgiICAgICAgICAgICAgICAgLyogRmlsdGVyIGNvZWZmaWNpZW50cyAqLworI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTg3LDQyICsxODksNDkgQEAKIExWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Qcm9jZXNzKExWREJFX0hhbmRsZV90IGhJbnN0YW5jZSwKICAgICBjb25zdCBMVk1fRkxPQVQgKnBJbkRhdGEsCiAgICAgTFZNX0ZMT0FUICpwT3V0RGF0YSwKLSAgICBMVk1fVUlOVDE2IE51bVNhbXBsZXMpCisgICAgY29uc3QgTFZNX1VJTlQxNiBOckZyYW1lcykgLy8gdXBkYXRlZCB0byB1c2Ugc2FtcGxlcyA9IGZyYW1lcyAqIGNoYW5uZWxzLgogewotCiAgIExWREJFX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgKiloSW5zdGFuY2U7Ci0gIExWTV9GTE9BVCAqcFNjcmF0Y2hfaW4gPSAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb24KLSAgW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3M7Ci0gIExWTV9GTE9BVCAqcFNjcmF0Y2ggPSBwU2NyYXRjaF9pbiArIDIgKiBOdW1TYW1wbGVzOwotICBMVk1fRkxPQVQgKnBNb25vOwotICBMVk1fSU5UMzIgaWkgPSAwOwogCi0gIC8qIFNjcmF0Y2ggZm9yIFZvbHVtZSBDb250cm9sIHN0YXJ0cyBhdCBvZmZzZXQgb2YgNCpOdW1TYW1wbGVzIGZsb2F0IHZhbHVlcyBmcm9tIHBTY3JhdGNoICovCi0gIExWTV9GTE9BVCAgICAgICAgICAgKnBTY3JhdGNoVm9sID0gKExWTV9GTE9BVCAqKSgmcFNjcmF0Y2hfaW5bNCAqIE51bVNhbXBsZXNdKTsKLS8vICBMVk1fSU5UMTYgKnBTY3JhdGNoVm9sX2ludCA9IChMVk1fSU5UMTYgKikocFNjcmF0Y2hWb2wpOworICAvKkV4dHJhY3QgbnVtYmVyIG9mIENoYW5uZWxzIGluZm8qLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgLy8gTW9ubyBwYXNzZWQgaW4gYXMgc3RlcmVvCisgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscyA9PSAxCisgICAgICA/IDIgOiBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOworI2Vsc2UKKyAgY29uc3QgTFZNX0lOVDMyIE5yQ2hhbm5lbHMgPSAyOyAvLyBGQ0NfMgorI2VuZGlmCisgIGNvbnN0IExWTV9JTlQzMiBOclNhbXBsZXMgPSBOckNoYW5uZWxzICogTnJGcmFtZXM7CiAKLSAgLyogU2NyYXRjaCBmb3IgTW9ubyBwYXRoIHN0YXJ0cyBhdCBvZmZzZXQgb2YgNipOdW1TYW1wbGVzIDMyLWJpdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaCAqLwotICBwTW9ubyA9ICZwU2NyYXRjaF9pbls0ICogTnVtU2FtcGxlc107CisgIC8qIFNwYWNlIHRvIHN0b3JlIERCRSBwYXRoIGNvbXB1dGF0aW9uICovCisgIExWTV9GTE9BVCAqIGNvbnN0IHBTY3JhdGNoID0KKyAgICAgICAgICAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKIAogICAvKgotICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQorICAgKiBTY3JhdGNoIGZvciBNb25vIHBhdGggc3RhcnRzIGF0IG9mZnNldCBvZgorICAgKiBOclNhbXBsZXMgZmxvYXQgdmFsdWVzIGZyb20gcFNjcmF0Y2guCiAgICAqLwotICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKKyAgTFZNX0ZMT0FUICogY29uc3QgcE1vbm8gPSBwU2NyYXRjaCArIE5yU2FtcGxlczsKKworICAvKgorICAgKiBUUklDS1k6IHBNb25vIGlzIHVzZWQgYW5kIGRpc2NhcmRlZCBieSB0aGUgREJFIHBhdGguCisgICAqICAgICAgICAgc28gaXQgaXMgYXZhaWxhYmxlIGZvciB1c2UgZm9yIHRoZSBwU2NyYXRjaFZvbAorICAgKiAgICAgICAgIHBhdGggd2hpY2ggaXMgY29tcHV0ZWQgYWZ0ZXJ3YXJkcy4KKyAgICoKKyAgICogU3BhY2UgdG8gc3RvcmUgVm9sdW1lIENvbnRyb2wgcGF0aCBjb21wdXRhdGlvbi4KKyAgICogVGhpcyBpcyBpZGVudGljYWwgdG8gcE1vbm8gKHNlZSBUUklDS1kgY29tbWVudCkuCisgICAqLworICBMVk1fRkxPQVQgKiBjb25zdCBwU2NyYXRjaFZvbCA9IHBNb25vOworCisgIC8qCisgICAqIENoZWNrIHRoZSBudW1iZXIgb2YgZnJhbWVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICovCisgIGlmIChOckZyYW1lcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKICAgewotICAgIHJldHVybihMVkRCRV9UT09NQU5ZU0FNUExFUyk7CisgICAgcmV0dXJuIExWREJFX1RPT01BTllTQU1QTEVTOwogICB9CiAKICAgLyoKLSAgICogQ29udmVydCAxNi1iaXQgc2FtcGxlcyB0byBGbG9hdAotICAgKi8KLSAgQ29weV9GbG9hdChwSW5EYXRhLCAvKiBTb3VyY2UgMTYtYml0IGRhdGEgICAgKi8KLSAgICAgIHBTY3JhdGNoX2luLCAvKiBEZXN0LiAzMi1iaXQgZGF0YSAgICAgKi8KLSAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAqLwotCi0gIGZvciAoaWkgPSAwOyBpaSA8IDIgKiBOdW1TYW1wbGVzOyBpaSsrKSB7Ci0gICAgcFNjcmF0Y2hbaWldID0gcFNjcmF0Y2hfaW5baWldOwotICB9Ci0gIC8qCiAgICAqIENoZWNrIGlmIHRoZSBhbGdvcml0aG0gaXMgZW5hYmxlZAogICAgKi8KICAgLyogREJFIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9OIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KQEAgLTIzMCw1MCArMjM5LDgxIEBACiAgICAgICAoTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKQogICAgICAgICAgICE9TFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pKSkKICAgeworICAgIC8vIG1ha2UgY29weSBvZiBpbnB1dCBkYXRhCisgICAgQ29weV9GbG9hdChwSW5EYXRhLAorICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOwogCiAgICAgLyoKICAgICAgKiBBcHBseSB0aGUgaGlnaCBwYXNzIGZpbHRlciBpZiBzZWxlY3RlZAogICAgICAqLwogICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5IUEZTZWxlY3QgPT0gTFZEQkVfSFBGX09OKQogICAgIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICBCUV9NQ19EMzJGMzJDMzBfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsIC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICovCisgICAgICAgICAgcFNjcmF0Y2gsIC8qIFNvdXJjZSAgICAgICAgICAgICAgICovCisgICAgICAgICAgcFNjcmF0Y2gsIC8qIERlc3RpbmF0aW9uICAgICAgICAgICovCisgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywKKyAgICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworI2Vsc2UKICAgICAgIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAqLwotICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwgLyogU291cmNlICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsIC8qIERlc3RpbmF0aW9uICAgICAgICAgICovCi0gICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgKi8KKyAgICAgICAgICBwU2NyYXRjaCwgLyogU291cmNlICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICBwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KKyAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzKTsKKyNlbmRpZgogICAgIH0KIAogICAgIC8qCiAgICAgICogQ3JlYXRlIHRoZSBtb25vIHN0cmVhbQogICAgICAqLwotICAgIEZyb20yaVRvTW9ub19GbG9hdCgoTFZNX0ZMT0FUICopcFNjcmF0Y2gsIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBGcm9tTWNUb01vbm9fRmxvYXQocFNjcmF0Y2gsIC8qIFNvdXJjZSAqLworICAgICAgICBwTW9ubywgLyogTW9ubyBkZXN0aW5hdGlvbiAqLworICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLCAgLyogTnVtYmVyIG9mIGZyYW1lcyAqLworICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworI2Vsc2UKKyAgICBGcm9tMmlUb01vbm9fRmxvYXQocFNjcmF0Y2gsIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLwogICAgICAgICBwTW9ubywgLyogTW9ubyBkZXN0aW5hdGlvbiAgICAgICovCi0gICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLworICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzKTsKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBBcHBseSB0aGUgYmFuZCBwYXNzIGZpbHRlcgogICAgICAqLwogICAgIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyKCZwSW5zdGFuY2UtPnBDb2VmLT5CUEZJbnN0YW5jZSwgLyogRmlsdGVyIGluc3RhbmNlICAgICAgICovCi0gICAgICAgIChMVk1fRkxPQVQgKilwTW9ubywgLyogU291cmNlICAgICAgICAgICAgICAgICovCi0gICAgICAgIChMVk1fRkxPQVQgKilwTW9ubywgLyogRGVzdGluYXRpb24gICAgICAgICAgICovCi0gICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLworICAgICAgICBwTW9ubywgLyogU291cmNlICAgICAgICAgICAgICAgICovCisgICAgICAgIHBNb25vLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAgKi8KKyAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcyk7CiAKICAgICAvKgogICAgICAqIEFwcGx5IHRoZSBBR0MgYW5kIG1peAogICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBBR0NfTUlYX1ZPTF9NYzFNb25fRDMyX1dSQSgmcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UsIC8qIEluc3RhbmNlIHBvaW50ZXIgICAgICAqLworICAgICAgICBwU2NyYXRjaCwgLyogU291cmNlICAgICAgICAgKi8KKyAgICAgICAgcE1vbm8sIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAqLworICAgICAgICBwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgKi8KKyAgICAgICAgTnJGcmFtZXMsIC8qIE51bWJlciBvZiBmcmFtZXMgICAgICovCisgICAgICAgIE5yQ2hhbm5lbHMpOyAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgICAgICovCisjZWxzZQogICAgIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQSgmcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UsIC8qIEluc3RhbmNlIHBvaW50ZXIgICAgICAqLwogICAgICAgICBwU2NyYXRjaCwgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCiAgICAgICAgIHBNb25vLCAvKiBNb25vIGJhbmQgcGFzcyBzb3VyY2UgKi8KICAgICAgICAgcFNjcmF0Y2gsIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAgICAqLwotICAgICAgICBOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCisgICAgICAgIE5yRnJhbWVzKTsKKyNlbmRpZgogCi0gICAgZm9yIChpaSA9IDA7IGlpIDwgMiAqIE51bVNhbXBsZXM7IGlpKyspIHsKKyAgICBmb3IgKExWTV9JTlQzMiBpaSA9IDA7IGlpIDwgTnJTYW1wbGVzOyArK2lpKSB7CiAgICAgICAvL1RPRE86IHJlcGxhY2Ugd2l0aCBleGlzdGluZyBjbGFtcGluZyBmdW5jdGlvbgotICAgICAgaWYocFNjcmF0Y2hbaWldIDwgLTEuMCkgeworICAgICAgaWYgKHBTY3JhdGNoW2lpXSA8IC0xLjApIHsKICAgICAgICAgcFNjcmF0Y2hbaWldID0gLTEuMDsKLSAgICAgIH0gZWxzZSBpZihwU2NyYXRjaFtpaV0gPiAxLjApIHsKKyAgICAgIH0gZWxzZSBpZiAocFNjcmF0Y2hbaWldID4gMS4wKSB7CiAgICAgICAgIHBTY3JhdGNoW2lpXSA9IDEuMDsKICAgICAgIH0KICAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gY2xlYXIgREJFIHByb2Nlc3NlZCBwYXRoCisgICAgbWVtc2V0KHBTY3JhdGNoLCAwLCBzaXplb2YoKnBTY3JhdGNoKSAqIE5yU2FtcGxlcyk7CiAgIH0KIAogICAvKiBCeXBhc3MgVm9sdW1lIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9GRiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCkBAIC0yODYsMjEgKzMyNiw0MCBAQAogICAgICAqIFRoZSBhbGdvcml0aG0gaXMgZGlzYWJsZWQgYnV0IHZvbHVtZSBtYW5hZ2VtZW50IGlzIHJlcXVpcmVkIHRvIGNvbXBlbnNhdGUgZm9yCiAgICAgICogaGVhZHJvb20gYW5kIHZvbHVtZSAoaWYgZW5hYmxlZCkKICAgICAgKi8KLSAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLAotICAgICAgICBwU2NyYXRjaF9pbiwKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLAorICAgICAgICBwSW5EYXRhLAogICAgICAgICBwU2NyYXRjaFZvbCwKLSAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgLyogTGVmdCBhbmQgcmlnaHQgKi8KKyAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywKKyAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyNlbHNlCisgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwKKyAgICAgICAgcEluRGF0YSwKKyAgICAgICAgcFNjcmF0Y2hWb2wsCisgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsgLyogTGVmdCBhbmQgcmlnaHQsIHJlYWxseSAjIHNhbXBsZXMgKi8KKyNlbmRpZgorICB9IGVsc2UgeworICAgIC8vIGNsZWFyIGJ5cGFzcyB2b2x1bWUgcGF0aAorICAgIG1lbXNldChwU2NyYXRjaFZvbCwgMCwgc2l6ZW9mKCpwU2NyYXRjaFZvbCkgKiBOclNhbXBsZXMpOwogICB9CiAKICAgLyoKICAgICogTWl4IERCRSBwcm9jZXNzZWQgcGF0aCBhbmQgYnlwYXNzIHZvbHVtZSBwYXRoCiAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgTFZDX01peFNvZnRfMk1jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLAorICAgICAgcFNjcmF0Y2gsCisgICAgICBwU2NyYXRjaFZvbCwKKyAgICAgIHBPdXREYXRhLAorICAgICAgKExWTV9JTlQxNilOckZyYW1lcywKKyAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQogICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIsCiAgICAgICBwU2NyYXRjaCwKICAgICAgIHBTY3JhdGNoVm9sLAogICAgICAgcE91dERhdGEsCi0gICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOwotCi0gIHJldHVybihMVkRCRV9TVUNDRVNTKTsKKyAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsKKyNlbmRpZgorICByZXR1cm4gTFZEQkVfU1VDQ0VTUzsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jCmluZGV4IGM0YTliMTQuLmEyY2U0MDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmMKQEAgLTg4LDExICs4OCwyMSBAQAogICAgICAtSFBGX0ZzNDgwMDBfRmM1NV9CMiwKICAgICAgLUhQRl9GczQ4MDAwX0ZjNTVfQjF9LAogI2lmZGVmIEhJR0hFUl9GUworICAgIHtIUEZfRnM4ODIwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczg4MjAwX0ZjNTVfQTEsCisgICAgIEhQRl9Gczg4MjAwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnM4ODIwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzODgyMDBfRmM1NV9CMX0sCiAgICAge0hQRl9Gczk2MDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgSFBGX0ZzOTYwMDBfRmM1NV9BMSwKICAgICAgSFBGX0ZzOTYwMDBfRmM1NV9BMCwKICAgICAgLUhQRl9Gczk2MDAwX0ZjNTVfQjIsCiAgICAgIC1IUEZfRnM5NjAwMF9GYzU1X0IxfSwKKyAgICB7SFBGX0ZzMTc2NDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE3NjQwMF9GYzU1X0ExLAorICAgICBIUEZfRnMxNzY0MDBfRmM1NV9BMCwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjNTVfQjF9LAogICAgIHtIUEZfRnMxOTIwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgSFBGX0ZzMTkyMDAwX0ZjNTVfQTEsCiAgICAgIEhQRl9GczE5MjAwMF9GYzU1X0EwLApAQCAtMTQ3LDExICsxNTcsMjEgQEAKICAgICAgLUhQRl9GczQ4MDAwX0ZjNjZfQjIsCiAgICAgIC1IUEZfRnM0ODAwMF9GYzY2X0IxfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICB7SFBGX0ZzODgyMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM4ODIwMF9GYzY2X0ExLAorICAgICBIUEZfRnM4ODIwMF9GYzY2X0EwLAorICAgICAtSFBGX0ZzODgyMDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjNjZfQjF9LAogICAgIHtIUEZfRnM5NjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9Gczk2MDAwX0ZjNjZfQTEsCiAgICAgIEhQRl9Gczk2MDAwX0ZjNjZfQTAsCiAgICAgIC1IUEZfRnM5NjAwMF9GYzY2X0IyLAogICAgICAtSFBGX0ZzOTYwMDBfRmM2Nl9CMX0sCisgICAge0hQRl9GczE3NjQwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxNzY0MDBfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzMTc2NDAwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzY2X0IxfSwKICAgICB7SFBGX0ZzMTkyMDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9GczE5MjAwMF9GYzY2X0ExLAogICAgICBIUEZfRnMxOTIwMDBfRmM2Nl9BMCwKQEAgLTIwNywxMSArMjI3LDIxIEBACiAgICAgIC1IUEZfRnM0ODAwMF9GYzc4X0IyLAogICAgICAtSFBGX0ZzNDgwMDBfRmM3OF9CMX0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAge0hQRl9Gczg4MjAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzODgyMDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzODgyMDBfRmM3OF9BMCwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjNzhfQjIsCisgICAgIC1IUEZfRnM4ODIwMF9GYzc4X0IxfSwKICAgICB7SFBGX0ZzOTYwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnM5NjAwMF9GYzc4X0ExLAogICAgICBIUEZfRnM5NjAwMF9GYzc4X0EwLAogICAgICAtSFBGX0ZzOTYwMDBfRmM3OF9CMiwKICAgICAgLUhQRl9Gczk2MDAwX0ZjNzhfQjF9LAorICAgIHtIUEZfRnMxNzY0MDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTc2NDAwX0ZjNzhfQTEsCisgICAgIEhQRl9GczE3NjQwMF9GYzc4X0EwLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjNzhfQjIsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM3OF9CMX0sCiAgICAge0hQRl9GczE5MjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnMxOTIwMDBfRmM3OF9BMSwKICAgICAgSFBGX0ZzMTkyMDAwX0ZjNzhfQTAsCkBAIC0yNjksMTEgKzI5OSwyMSBAQAogCiAjaWZkZWYgSElHSEVSX0ZTCiAgICAgLAorICAgIHtIUEZfRnM4ODIwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczg4MjAwX0ZjOTBfQTEsCisgICAgIEhQRl9Gczg4MjAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnM4ODIwMF9GYzkwX0IyLAorICAgICAtSFBGX0ZzODgyMDBfRmM5MF9CMX0sCiAgICAge0hQRl9Gczk2MDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgSFBGX0ZzOTYwMDBfRmM5MF9BMSwKICAgICAgSFBGX0ZzOTYwMDBfRmM5MF9BMCwKICAgICAgLUhQRl9Gczk2MDAwX0ZjOTBfQjIsCiAgICAgIC1IUEZfRnM5NjAwMF9GYzkwX0IxfSwKKyAgICB7SFBGX0ZzMTc2NDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE3NjQwMF9GYzkwX0ExLAorICAgICBIUEZfRnMxNzY0MDBfRmM5MF9BMCwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzkwX0IyLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjOTBfQjF9LAogICAgIHtIUEZfRnMxOTIwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgSFBGX0ZzMTkyMDAwX0ZjOTBfQTEsCiAgICAgIEhQRl9GczE5MjAwMF9GYzkwX0EwLApAQCAtMzIwLDkgKzM2MCwxNSBAQAogICAgICAtQlBGX0ZzNDgwMDBfRmM1NV9CMiwKICAgICAgLUJQRl9GczQ4MDAwX0ZjNTVfQjF9LAogI2lmZGVmIEhJR0hFUl9GUworICAgICB7QlBGX0ZzODgyMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgLUJQRl9Gczg4MjAwX0ZjNTVfQjIsCisgICAgICAtQlBGX0ZzODgyMDBfRmM1NV9CMX0sCiAgICAgIHtCUEZfRnM5NjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM5NjAwMF9GYzU1X0IyLAogICAgICAtQlBGX0ZzOTYwMDBfRmM1NV9CMX0sCisgICAgIHtCUEZfRnMxNzY0MDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgIC1CUEZfRnMxNzY0MDBfRmM1NV9CMiwKKyAgICAgIC1CUEZfRnMxNzY0MDBfRmM1NV9CMX0sCiAgICAgIHtCUEZfRnMxOTIwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9GczE5MjAwMF9GYzU1X0IyLAogICAgICAtQlBGX0ZzMTkyMDAwX0ZjNTVfQjF9LApAQCAtMzU3LDkgKzQwMywxNSBAQAogICAgICAtQlBGX0ZzNDgwMDBfRmM2Nl9CMiwKICAgICAgLUJQRl9GczQ4MDAwX0ZjNjZfQjF9LAogI2lmZGVmIEhJR0hFUl9GUworICAgIHtCUEZfRnM4ODIwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM4ODIwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzODgyMDBfRmM2Nl9CMX0sCiAgICAge0JQRl9Gczk2MDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9Gczk2MDAwX0ZjNjZfQjIsCiAgICAgIC1CUEZfRnM5NjAwMF9GYzY2X0IxfSwKKyAgICB7QlBGX0ZzMTc2NDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9GczE3NjQwMF9GYzY2X0IxfSwKICAgICB7QlBGX0ZzMTkyMDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnMxOTIwMDBfRmM2Nl9CMiwKICAgICAgLUJQRl9GczE5MjAwMF9GYzY2X0IxfSwKQEAgLTM5NCw5ICs0NDYsMTUgQEAKICAgICAgLUJQRl9GczQ4MDAwX0ZjNzhfQjIsCiAgICAgIC1CUEZfRnM0ODAwMF9GYzc4X0IxfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICB7QlBGX0ZzODgyMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzODgyMDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9Gczg4MjAwX0ZjNjZfQjF9LAogICAgIHtCUEZfRnM5NjAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM5NjAwMF9GYzc4X0IyLAogICAgICAtQlBGX0ZzOTYwMDBfRmM3OF9CMX0sCisgICAge0JQRl9GczE3NjQwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTc2NDAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMX0sCiAgICAge0JQRl9GczE5MjAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzMTkyMDAwX0ZjNzhfQjIsCiAgICAgIC1CUEZfRnMxOTIwMDBfRmM3OF9CMX0sCkBAIC00MzIsOSArNDkwLDE1IEBACiAgICAgIC1CUEZfRnM0ODAwMF9GYzkwX0IxfQogI2lmZGVmIEhJR0hFUl9GUwogICAgICwKKyAgICB7QlBGX0ZzODgyMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzODgyMDBfRmM5MF9CMiwKKyAgICAgLUJQRl9Gczg4MjAwX0ZjOTBfQjF9LAogICAgIHtCUEZfRnM5NjAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM5NjAwMF9GYzkwX0IyLAogICAgICAtQlBGX0ZzOTYwMDBfRmM5MF9CMX0sCisgICAge0JQRl9GczE3NjQwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTc2NDAwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnMxNzY0MDBfRmM5MF9CMX0sCiAgICAge0JQRl9GczE5MjAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzMTkyMDAwX0ZjOTBfQjIsCiAgICAgIC1CUEZfRnMxOTIwMDBfRmM5MF9CMX0KQEAgLTQ2Niw3ICs1MzAsOSBAQAogICAgIEFHQ19BVFRBQ0tfRnM0NDEwMCwKICAgICBBR0NfQVRUQUNLX0ZzNDgwMDAKICNpZmRlZiBISUdIRVJfRlMKKyAgICAsQUdDX0FUVEFDS19Gczg4MjAwCiAgICAgLEFHQ19BVFRBQ0tfRnM5NjAwMAorICAgICxBR0NfQVRUQUNLX0ZzMTc2NDAwCiAgICAgLEFHQ19BVFRBQ0tfRnMxOTIwMDAKICNlbmRpZgogCkBAIC00ODgsNyArNTU0LDkgQEAKICAgICBBR0NfREVDQVlfRnM0NDEwMCwKICAgICBBR0NfREVDQVlfRnM0ODAwMAogI2lmZGVmIEhJR0hFUl9GUworICAgICxBR0NfREVDQVlfRnM4ODIwMAogICAgICxBR0NfREVDQVlfRlM5NjAwMAorICAgICxBR0NfREVDQVlfRnMxNzY0MDAKICAgICAsQUdDX0RFQ0FZX0ZTMTkyMDAwCiAjZW5kaWYKIApAQCAtNTgzLDcgKzY1MSw5IEBACiAgICAgVk9MX1RDX0ZzNDQxMDAsCiAgICAgVk9MX1RDX0ZzNDgwMDAKICNpZmRlZiBISUdIRVJfRlMKKyAgICAsVk9MX1RDX0ZzODgyMDAKICAgICAsVk9MX1RDX0ZzOTYwMDAKKyAgICAsVk9MX1RDX0ZzMTc2NDAwCiAgICAgLFZPTF9UQ19GczE5MjAwMAogI2VuZGlmCiB9OwpAQCAtNjAyLDcgKzY3Miw5IEBACiAgICAgTUlYX1RDX0ZzNDQxMDAsCiAgICAgTUlYX1RDX0ZzNDgwMDAKICNpZmRlZiBISUdIRVJfRlMKKyAgICAsTUlYX1RDX0ZzODgyMDAKICAgICAsTUlYX1RDX0ZzOTYwMDAKKyAgICAsTUlYX1RDX0ZzMTc2NDAwCiAgICAgLE1JWF9UQ19GczE5MjAwMAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmgKaW5kZXggOWI2ZGEzMS4uODNlY2FlMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmgKQEAgLTI5Niw2ICsyOTYsOSBAQAogICAgIC8qIFNwZWN0cnVtIEFuYWx5emVyIHBhcmFtZXRlcnMgQ29udHJvbCAqLwogICAgIExWTV9QU0FfTW9kZV9lbiAgICAgICAgICAgICBQU0FfRW5hYmxlOwogICAgIExWTV9QU0FfRGVjYXlTcGVlZF9lbiAgICAgICBQU0FfUGVha0RlY2F5UmF0ZTsgICAgICAvKiBQZWFrIHZhbHVlIGRlY2F5IHJhdGUqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgTnJDaGFubmVsczsKKyNlbmRpZgogCiB9IExWTV9Db250cm9sUGFyYW1zX3Q7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jCmluZGV4IDBhM2MzMGUuLjM3MjcyZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYwpAQCAtMjUsNiArMjUsOCBAQAogI2luY2x1ZGUgIkxWTV9Qcml2YXRlLmgiCiAjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgogCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVk1fQnVmZmVyTWFuYWdlZEluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02Miw4ICs2NCwxMSBAQAogICAgIExWTV9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CiAgICAgTFZNX0J1ZmZlcl90ICAgICAqcEJ1ZmZlcjsKICAgICBMVk1fRkxPQVQgICAgICAgICpwRGVzdDsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDE2ICAgICAgICBOdW1DaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKKyNlbHNlCiAgICAgTFZNX0lOVDE2ICAgICAgICBOdW1DaGFubmVscyA9IDI7Ci0KKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIHByb2Nlc3NpbmcgYWRkcmVzcyBwb2ludGVycwpAQCAtMjA3LDggKzIxMiw3IEBACiAgICAgTFZNX0luc3RhbmNlX3QgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKICAgICBMVk1fQnVmZmVyX3QgICAgICpwQnVmZmVyOwogICAgIExWTV9JTlQxNiAgICAgICAgKnBEZXN0OwotICAgIExWTV9JTlQxNiAgICAgICAgTnVtQ2hhbm5lbHMgPTI7Ci0KKyAgICBMVk1fSU5UMTYgICAgICAgIE51bUNoYW5uZWxzID0gMjsKIAogICAgIC8qCiAgICAgICogU2V0IHRoZSBwcm9jZXNzaW5nIGFkZHJlc3MgcG9pbnRlcnMKQEAgLTQ5OSw3ICs1MDMsNyBAQAogICAgICAgICBpZiAocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzICE9IDApCiAgICAgICAgIHsKICAgICAgICAgICAgIENvcHlfMTYoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCiAgICAgICAgICAgICBwRGVzdCArPSAyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzOyAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgb3V0cHV0IHBvaW50ZXIgKi8KICAgICAgICAgICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCA9IChMVk1fSU5UMTYpKHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCAtIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyk7IC8qIFVwZGF0ZSB0aGUgbnVtYnIgb2Ygc2FtcGxlcyB0byBvdXRwdXQgKi8KQEAgLTc1MCw3ICs3NTQsMTEgQEAKICAgICBMVk1fSU5UMTYgICAgICAgTnVtU2FtcGxlczsKICAgICBMVk1fRkxPQVQgICAgICAgKnBTdGFydDsKICAgICBMVk1fRkxPQVQgICAgICAgKnBEZXN0OwotCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQzMiAgICAgICBOckNoYW5uZWxzID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOworI2RlZmluZSBOckZyYW1lcyBOdW1TYW1wbGVzICAvLyBhbGlhcyBmb3IgY2xhcml0eQorI2RlZmluZSBGcmFtZUNvdW50IFNhbXBsZUNvdW50CisjZW5kaWYKIAogICAgIC8qCiAgICAgICogU2V0IHRoZSBwb2ludGVycwpAQCAtNzU4LDcgKzc2Niw2IEBACiAgICAgTnVtU2FtcGxlcyA9IHBCdWZmZXItPlNhbXBsZXNUb091dHB1dDsKICAgICBwU3RhcnQgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CiAKLQogICAgIC8qCiAgICAgICogY2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgb2YgYSBibG9jawogICAgICAgKi8KQEAgLTc4NiwxNCArNzkzLDI1IEBACiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQ29weSBhbGwgb3V0cHV0IGRlbGF5IHNhbXBsZXMgdG8gdGhlIG91dHB1dAogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOworI2Vsc2UKKyAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7IC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCisjZW5kaWYKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cwogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgcERlc3QgKz0gTnJDaGFubmVscyAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZWxzZQogICAgICAgICAgICAgcERlc3QgKz0gMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZW5kaWYKICAgICAgICAgICAgIE51bVNhbXBsZXMgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKTsgLyogU2FtcGxlcyBsZWZ0IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2VuZCAqLwogICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gMDsgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KQEAgLTgwMywyMyArODIxLDQwIEBACiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQ29weSBvbmx5IHNvbWUgb2YgdGhlIG91cHV0IGRlbGF5IHNhbXBsZXMgdG8gdGhlIG91dHB1dAogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIE5yRnJhbWVzKSk7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCisjZWxzZQorICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKyNlbmRpZgogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVyIGFuZCBzYW1wbGUgY291bnRzCiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBwRGVzdCArPSBOckNoYW5uZWxzICogTnJGcmFtZXM7IC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2Vsc2UKICAgICAgICAgICAgIHBEZXN0ICs9IDIgKiBOdW1TYW1wbGVzOyAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbmRpZgogICAgICAgICAgICAgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KICAgICAgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IChMVk1fSU5UMTYpKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyAtIE51bVNhbXBsZXMpOwogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogUmVhbGlnbiB0aGUgZGVsYXkgYnVmZmVyIGRhdGEgdG8gYXZvaWQgdXNpbmcgY2lyY3VsYXIgYnVmZmVyIG1hbmFnZW1lbnQKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyW05yQ2hhbm5lbHMgKiBOckZyYW1lc10sICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIG1vdmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOworI2Vsc2UKICAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzIgKiBOdW1TYW1wbGVzXSwgICAgICAgICAvKiBTb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBtb3ZlICovCisjZW5kaWYKICAgICAgICAgICAgIE51bVNhbXBsZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KICAgICAgICAgfQogICAgIH0KQEAgLTgzNiwxMyArODcxLDIzIEBACiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQ29weSBhbGwgcHJvY2Vzc2VkIHNhbXBsZXMgdG8gdGhlIG91dHB1dAogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIEZyYW1lQ291bnQpKTsgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisjZWxzZQorICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7IC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworI2VuZGlmCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVyIGFuZCBzYW1wbGUgY291bnRzCiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBwRGVzdCAgICAgICs9IE5yQ2hhbm5lbHMgKiBGcmFtZUNvdW50OyAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZWxzZQogICAgICAgICAgICAgcERlc3QgICAgICArPSAyICogU2FtcGxlQ291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbmRpZgogICAgICAgICAgICAgTnVtU2FtcGxlcyAgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gU2FtcGxlQ291bnQpOyAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLwogICAgICAgICAgICAgU2FtcGxlQ291bnQgPSAwOyAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLwogICAgICAgICB9CkBAIC04NTEsMTQgKzg5NiwyNSBAQAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIHByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBOckZyYW1lcykpOyAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisjZWxzZQogICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgIC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworI2VuZGlmCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVycyBhbmQgc2FtcGxlIGNvdW50cwogICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBwU3RhcnQgICAgICArPSBOckNoYW5uZWxzICogTnJGcmFtZXM7ICAgICAgICAgICAgICAgLyogUHJvY2Vzc2VkIHNhbXBsZSBwb2ludGVyICovCisgICAgICAgICAgICBwRGVzdCAgICAgICArPSBOckNoYW5uZWxzICogTnJGcmFtZXM7ICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZWxzZQogICAgICAgICAgICAgcFN0YXJ0ICAgICAgKz0gMiAqIE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvY2Vzc2VkIHNhbXBsZSBwb2ludGVyICovCiAgICAgICAgICAgICBwRGVzdCAgICAgICArPSAyICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbmRpZgogICAgICAgICAgICAgU2FtcGxlQ291bnQgID0gKExWTV9JTlQxNikoU2FtcGxlQ291bnQgLSBOdW1TYW1wbGVzKTsgLyogUHJvY2Vzc2VkIHNhbXBsZXMgbGVmdCAqLwogICAgICAgICAgICAgTnVtU2FtcGxlcyAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIHNhbXBsZSBjb3VudCAqLwogICAgICAgICB9CkBAIC04NzAsOSArOTI2LDE2IEBACiAgICAgICovCiAgICAgaWYgKFNhbXBsZUNvdW50ICE9IDApCiAgICAgeworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyW05yQ2hhbm5lbHMgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBGcmFtZUNvdW50KSk7ICAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisjZWxzZQogICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCiAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXNdLCAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworI2VuZGlmCiAgICAgICAgIC8qIFVwZGF0ZSB0aGUgYnVmZmVyIGNvdW50ICovCiAgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IChMVk1fSU5UMTYpKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyArIFNhbXBsZUNvdW50KTsKICAgICB9CkBAIC0xMDYzLDE0ICsxMTI2LDI0IEBACiB7CiAKICAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzID0yOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOworI3VuZGVmIE5yRnJhbWVzCisjZGVmaW5lIE5yRnJhbWVzICgqcE51bVNhbXBsZXMpIC8vIGFsaWFzIGZvciBjbGFyaXR5CisjZWxzZQorICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMgPSAyOworI2VuZGlmCiAKIAogICAgIC8qCiAgICAgICogVXBkYXRlIHNhbXBsZSBjb3VudHMKICAgICAgKi8KICAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgKz0gKExWTV9JTlQxNikoKnBOdW1TYW1wbGVzICogTnVtQ2hhbm5lbHMpOyAvKiBVcGRhdGUgdGhlIEkvTyBwb2ludGVycyAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzICAgKz0gKExWTV9JTlQxNikoTnJGcmFtZXMgKiBOdW1DaGFubmVscyk7CisjZWxzZQogICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgICArPSAoTFZNX0lOVDE2KSgqcE51bVNhbXBsZXMgKiAyKTsKKyNlbmRpZgogICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgLSAqcE51bVNhbXBsZXMpOyAvKiBVcGRhdGUgdGhlIHNhbXBsZSBjb3VudCAqLwogCiAgICAgLyoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaAppbmRleCA4YzA0ODQ3Li5iYWI0MDQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oCkBAIC00ODcsNiArNDg3LDk3IEBACiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogCiAjaWZkZWYgSElHSEVSX0ZTCisvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDg4MjAwICovCisvKiBHYWluID0gMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDk0Mzc0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjY0MTI1NmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjAwMjY0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0NzE0NmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzE5MDc0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjg2NTk1NmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDUyMzgwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjk5OTI2M2YpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjAxOTUzZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjE0ODgzNmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gNi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzY5Nzc3ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjMxNjY1OWYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTU4MDc4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjUwNDk2MGYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTY5MzU1ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjcxNjIzOGYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNDA2NDEyZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1MzI5NWYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi42NzIzOTVmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjIxOTI3N2YpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi45NzA4MzJmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjUxNzcxNGYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4zMDU2ODRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjg1MjU2NmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy42ODEzOTRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjIyODI3NmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNC4xMDI5NDdmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjY0OTgzMGYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNC41NzU5MzhmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC00LjEyMjgyMGYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAKIC8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgOTYwMDBIeiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCkBAIC01ODAsNiArNjcxLDk4IEBACiAjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKIAorLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAxNzY0MDAgKi8KKy8qIEdhaW4gPSAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTA2NzExZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC44NTU4MDdmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMjY0NDNmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjk3NTUzOWYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM2MDc4NGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMTA5ODgwZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTExNTE3ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4yNjA2MTNmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS42ODA2NDNmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjQyOTczOWYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gNi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjg3MDQwNWYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNjE5NTAxZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDgzMzIxZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS44MzI0MTdmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4zMjIyMTdmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjA3MTMxM2YpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjU5MDI2M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMzM5MzU5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi44OTEwMTZmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi42NDAxMTJmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjIyODQ2NWYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjk3NzU2MWYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNjA3MDkwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuMzU2MTg2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNC4wMzE5MTRmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy43ODEwMTBmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICA0LjUwODU3NWYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC00LjI1NzY3MWYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuMDQzMzk3ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTQuNzkyNDkzZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKwogLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAxOTIwMDBIeiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLwogI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTA3ODIzCkBAIC0xMjE2LDQgKzEzOTksNCBAQAogCiAKICNlbmRpZgotI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYwppbmRleCBjZmU1M2I4Li42MmI0YzczIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmMKQEAgLTI4LDYgKzI4LDggQEAKICNpbmNsdWRlICJMVk1fVGFibGVzLmgiCiAjaW5jbHVkZSAiTFZNX1ByaXZhdGUuaCIKIAorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjksMTggKzcxLDI5IEBACiAgICAgKChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTEwMjUpICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgICAgICAgJiYKICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE2MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjIwNTApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yNDAwMCkgICAgICAmJgogICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMzIwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180NDEwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ4MDAwKSAgICAgICYmCi0gICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU185NjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE5MjAwMCkpICAgICAgfHwKKyAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzg4MjAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfOTYwMDApICYmCisgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNzY0MDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xOTIwMDApKSAgICAgIHx8CiAjZWxzZQogICAgICAgICAoKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgogICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAgICAgICAmJgogICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMzIwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180NDEwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ4MDAwKSkgICAgICB8fAogI2VuZGlmCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAoKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJgorICAgICAgICAgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJgorICAgICAgICAgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykgJiYKKyAgICAgICAgIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01VTFRJQ0hBTk5FTCkpIHx8CisjZWxzZQogICAgICAgICAoKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJiAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pKSB8fAorI2VuZGlmCiAgICAgICAgIChwUGFyYW1zLT5TcGVha2VyVHlwZSA+IExWTV9FWF9IRUFEUEhPTkVTKSkKICAgICB7CiAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwogICAgIH0KIAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzID0gcFBhcmFtcy0+TnJDaGFubmVsczsKKyNlbmRpZgogICAgIC8qCiAgICAgICogQ2luZW1hIFNvdW5kIHBhcmFtZXRlcnMKICAgICAgKi8KQEAgLTU2OSw2ICs1ODIsMTAgQEAKICAgICB9IHdoaWxlICgocEluc3RhbmNlLT5Db250cm9sUGVuZGluZyAhPSBMVk1fRkFMU0UpICYmCiAgICAgICAgICAgICAgKENvdW50ID4gMCkpOwogCisjaWZkZWYgU1VQUE9SVF9NQworICAgIHBJbnN0YW5jZS0+TnJDaGFubmVscyA9IExvY2FsUGFyYW1zLk5yQ2hhbm5lbHM7CisjZW5kaWYKKwogICAgIC8qIENsZWFyIGFsbCBpbnRlcm5hbCBkYXRhIGlmIGZvcm1hdCBjaGFuZ2UqLwogICAgIGlmKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCAhPSBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQpCiAgICAgewpAQCAtNzE5LDYgKzczNiw5IEBACiAgICAgICAgIERCRV9QYXJhbXMuSGVhZHJvb21kQiAgICAgICA9IDA7CiAgICAgICAgIERCRV9QYXJhbXMuVm9sdW1lQ29udHJvbCAgICA9IExWREJFX1ZPTFVNRV9PRkY7CiAgICAgICAgIERCRV9QYXJhbXMuVm9sdW1lZEIgICAgICAgICA9IDA7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICBEQkVfUGFyYW1zLk5yQ2hhbm5lbHMgICAgICAgICA9IExvY2FsUGFyYW1zLk5yQ2hhbm5lbHM7CisjZW5kaWYKIAogICAgICAgICAvKgogICAgICAgICAgKiBNYWtlIHRoZSBjaGFuZ2VzCkBAIC03NzUsNyArNzk1LDkgQEAKICAgICAgICAgewogICAgICAgICAgICAgRVFOQl9QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZFUU5CX01PTk9JTlNURVJFTzsgICAgIC8qIEZvcmNlIHRvIE1vbm8taW4tU3RlcmVvIG1vZGUgKi8KICAgICAgICAgfQotCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICBFUU5CX1BhcmFtcy5OckNoYW5uZWxzICAgICAgICAgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOworI2VuZGlmCiAKICAgICAgICAgLyoKICAgICAgICAgICogU2V0IHRoZSBjb250cm9sIGZsYWcKQEAgLTg0OSw3ICs4NzEsOSBAQAogICAgICAgICBDU19QYXJhbXMuU2FtcGxlUmF0ZSAgPSBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlOwogICAgICAgICBDU19QYXJhbXMuUmV2ZXJiTGV2ZWwgPSBMb2NhbFBhcmFtcy5WaXJ0dWFsaXplclJldmVyYkxldmVsOwogICAgICAgICBDU19QYXJhbXMuRWZmZWN0TGV2ZWwgPSBMb2NhbFBhcmFtcy5DU19FZmZlY3RMZXZlbDsKLQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgQ1NfUGFyYW1zLk5yQ2hhbm5lbHMgID0gTG9jYWxQYXJhbXMuTnJDaGFubmVsczsKKyNlbmRpZgogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgY29udHJvbCBmbGFnCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYwppbmRleCAyNmMxYzRmLi5jNTc0OThlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMKQEAgLTYxLDYgKzYxLDcyIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisvKgorICogNCBUeXBlcyBvZiBNZW1vcnkgUmVnaW9ucyBvZiBMVk0KKyAqIFRPRE86IEFsbG9jYXRlIG9uIHRoZSBmbHkuCisgKiBpKSAgIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEEgLSBGb3IgSW5zdGFuY2UgSGFuZGxlcworICogaWkpICBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBIC0gUGVyc2lzdGVudCBCdWZmZXJzCisgKiBpaWkpIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUYgLSBGb3IgSG9sZGluZyBTdHJ1Y3R1cmUgdmFsdWVzCisgKiBpdikgIExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QgICAgICAgLSBGb3IgSG9sZGluZyBTdHJ1Y3R1cmUgdmFsdWVzCisgKgorICogTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQToKKyAqICAgVG90YWwgTWVtb3J5IHNpemU6CisgKiAgICAgc2l6ZW9mKExWTV9JbnN0YW5jZV90KSArIFwKKyAqICAgICBzaXplb2YoTFZNX0J1ZmZlcl90KSArIFwKKyAqICAgICBzaXplb2YoTFZQU0FfSW5zdGFuY2VQcl90KSArIFwKKyAqICAgICBzaXplb2YoTFZNX0J1ZmZlcl90KSAtIG5lZWRlZCBpZiBidWZmZXIgbW9kZSBpcyBMVk1fTUFOQUdFRF9CVUZGRVIKKyAqCisgKiBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBOgorICogICBUb3RhbCBNZW1vcnkgc2l6ZToKKyAqICAgICBzaXplb2YoTFZNX1RFX0RhdGFfdCkgKyBcCisgKiAgICAgMiAqIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWTV9FUU5CX0JhbmREZWZfdCkgKyBcCisgKiAgICAgc2l6ZW9mKExWQ1NfRGF0YV90KSArIFwKKyAqICAgICBzaXplb2YoTFZEQkVfRGF0YV9GTE9BVF90KSArIFwKKyAqICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpICsgXAorICogICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkgKyBcCisgKiAgICAgcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpICsgXAorICogICAgIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpICsgXAorICogICAgIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWRVFOQl9CaXF1YWRUeXBlX2VuKSArIFwKKyAqICAgICAyICogTFZNX0hFQURST09NX01BWF9OQkFORFMgKiBzaXplb2YoTFZNX0hlYWRyb29tQmFuZERlZl90KSArIFwKKyAqICAgICBQU0FfSW5pdFBhcmFtcy5uQmFuZHMgKiBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QpICsgXAorICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihRUERfVGFwc190KQorICoKKyAqIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUY6CisgKiAgIFRvdGFsIE1lbW9yeSBzaXplOgorICogICAgIHNpemVvZihMVk1fVEVfQ29lZnNfdCkgKyBcCisgKiAgICAgc2l6ZW9mKExWQ1NfQ29lZmZpY2llbnRfdCkgKyBcCisgKiAgICAgc2l6ZW9mKExWREJFX0NvZWZfRkxPQVRfdCkgKyBcCisgKiAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSArIFwKKyAqICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpICsgXAorICogICAgIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSArIFwKKyAqICAgICBQU0FfSW5pdFBhcmFtcy5uQmFuZHMgKiBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpICsgXAorICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihRUERfU3RhdGVfdCkKKyAqCisgKiBMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUIChTY3JhdGNoKToKKyAqICAgVG90YWwgTWVtb3J5IFNpemU6CisgKiAgICAgQnVuZGxlU2NyYXRjaFNpemUgKyBcCisgKiAgICAgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSAqIHNpemVvZihMVk1fRkxPQVQpICsgXAorICogICAgIE1heFNjcmF0Y2hPZiAoQ1MsIEVRTkIsIERCRSwgUFNBKQorICoKKyAqICAgICBhKUJ1bmRsZVNjcmF0Y2hTaXplOgorICogICAgICAgICAzICogTFZNX01BWF9DSEFOTkVMUyBcCisgKiAgICAgICAgICogKE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKyBJbnRlcm5hbEJsb2NrU2l6ZSkgKiBzaXplb2YoTFZNX0ZMT0FUKQorICogICAgICAgVGhpcyBNZW1vcnkgaXMgYWxsb2NhdGVkIG9ubHkgd2hlbiBCdWZmZXIgbW9kZSBpcyBMVk1fTUFOQUdFRF9CVUZGRVIuCisgKiAgICAgYilNYXhTY3JhdGNoT2YgKENTLCBFUU5CLCBEQkUsIFBTQSkKKyAqICAgICAgIFRoaXMgTWVtb3J5IGlzIG5lZWRlZCBmb3Igc2NyYXRjaCB1c2FnZSBmb3IgQ1MsIEVRTkIsIERCRSwgUFNBLgorICogICAgICAgQ1MgICA9IChMVkNTX1NDUkFUQ0hCVUZGRVJTICogc2l6ZW9mKExWTV9GTE9BVCkKKyAqICAgICAgICAgICAgICAgKiBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpCisgKiAgICAgICBFUU5CID0gKExWRVFOQl9TQ1JBVENIQlVGRkVSUyAqIHNpemVvZihMVk1fRkxPQVQpCisgKiAgICAgICAgICAgICAgICogcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKQorICogICAgICAgREJFICA9IChMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFKnNpemVvZihMVk1fRkxPQVQpCisgKiAgICAgICAgICAgICAgICogcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKQorICogICAgICAgUFNBICA9ICgyICogcEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplICogc2l6ZW9mKExWTV9GTE9BVCkpCisgKiAgICAgICAgICAgICAgb25lIE1heElucHV0QmxvY2tTaXplIGZvciBpbnB1dCBhbmQgYW5vdGhlciBmb3IgZmlsdGVyIG91dHB1dAorICogICAgIGMpTUFYX0lOVEVSTkFMX0JMT0NLU0laRQorICogICAgICAgVGhpcyBNZW1vcnkgaXMgbmVlZGVkIGZvciBQU0FJbnB1dCAtIFRlbXAgbWVtb3J5IHRvIHN0b3JlIG91dHB1dAorICogICAgICAgZnJvbSBNY1RvTW9ubyBibG9jayBhbmQgZ2l2ZW4gYXMgaW5wdXQgdG8gUFNBIGJsb2NrCisgKi8KKwogTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0TWVtb3J5VGFibGUoTFZNX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01lbVRhYl90ICAgICAgICAgKnBNZW1vcnlUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JbnN0UGFyYW1zX3QgICAgICpwSW5zdFBhcmFtcykKQEAgLTE2OCw3ICsyMzQsMTMgQEAKICAgICBBbGdTY3JhdGNoU2l6ZSAgICA9IDA7CiAgICAgaWYgKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpCiAgICAgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplID0gMyAqIExWTV9NQVhfQ0hBTk5FTFMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKyBJbnRlcm5hbEJsb2NrU2l6ZSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKExWTV9GTE9BVCk7CisjZWxzZQogICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSA9IDYgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSAqIHNpemVvZihMVk1fSU5UMTYpOworI2VuZGlmCiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLCAgICAgICAgLyogU2NyYXRjaCBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSk7CiAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLApAQCAtMjMzLDcgKzMwNSwxMyBAQAogICAgICAgICAgKiBTZXQgdGhlIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU185NjAwMCB8IExWREJFX0NBUF9GU18xOTIwMDA7CisgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU184ODIwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE3NjQwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKICNlbHNlCiAgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfCBMVkRCRV9DQVBfRlNfMTIwMDAgfCBMVkRCRV9DQVBfRlNfMTYwMDAgfCBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfCBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfCBMVkRCRV9DQVBfRlNfNDgwMDA7CiAjZW5kaWYKQEAgLTI3MCw3ICszNDgsMTMgQEAKICAgICAgICAgICogU2V0IHRoZSBjYXBhYmlsaXRpZXMKICAgICAgICAgICovCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi0gICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU185NjAwMCB8IExWRVFOQl9DQVBfRlNfMTkyMDAwOworICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU180ODAwMCB8IExWRVFOQl9DQVBfRlNfODgyMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzk2MDAwIHwgTFZFUU5CX0NBUF9GU18xNzY0MDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzE5MjAwMDsKICNlbHNlCiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwOwogI2VuZGlmCkBAIC0zNTcsOCArNDQxLDEzIEBACiAgICAgICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKIAogICAgICAgICAgICAgLyogRmFzdCBUZW1wb3JhcnkgKi8KKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX1RFTVBPUkFSWV9GQVNUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSAqIHNpemVvZihMVk1fRkxPQVQpKTsKKyNlbHNlCiAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fVEVNUE9SQVJZX0ZBU1RdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogc2l6ZW9mKExWTV9JTlQxNikpOworI2VuZGlmCiAKICAgICAgICAgICAgIGlmIChQU0FfTWVtVGFiLlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlNpemUgPiBBbGdTY3JhdGNoU2l6ZSkKICAgICAgICAgICAgIHsKQEAgLTU0NywxMyArNjM2LDIwIEBACiAgICAgICAgICAqLwogICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50ID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fQnVmZmVyX3QpKTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSA9IChMVk1fSU5UMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMgKiBMVk1fTUFYX0NIQU5ORUxTIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKExWTV9GTE9BVCkpOworI2Vsc2UKICAgICAgICAgQnVuZGxlU2NyYXRjaFNpemUgPSAoTFZNX0lOVDMyKSg2ICogKE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKyBJbnRlcm5hbEJsb2NrU2l6ZSkgKiBzaXplb2YoTFZNX0lOVDE2KSk7CisjZW5kaWYKICAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+cFNjcmF0Y2ggPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwgICAvKiBTY3JhdGNoIDEgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQzMilCdW5kbGVTY3JhdGNoU2l6ZSk7CiAjaWZkZWYgQlVJTERfRkxPQVQKICAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopJnBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkluRGVsYXlCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkpOworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTFZNX01BWF9DSEFOTkVMUyAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUpKTsKICNlbHNlCiAgICAgICAgIExvYWRDb25zdF8xNigwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGlucHV0IGRlbGF5IGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKSZwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5JbkRlbGF5QnVmZmVyLApAQCAtNTg0LDggKzY4MCwxMSBAQAogICAgIC8qCiAgICAgICogREMgcmVtb3ZhbCBmaWx0ZXIKICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgRENfTWNfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOworI2Vsc2UKICAgICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSk7Ci0KKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBUcmVibGUgRW5oYW5jZW1lbnQKQEAgLTc0NCw3ICs4NDMsMTMgQEAKICAgICAgICAgICogU2V0IHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMKICAgICAgICAgICovCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi0gICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfCBMVkRCRV9DQVBfRlNfMTIwMDAgfCBMVkRCRV9DQVBfRlNfMTYwMDAgfCBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfCBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfCBMVkRCRV9DQVBfRlNfNDgwMDAgfCBMVkRCRV9DQVBfRlNfOTYwMDAgfCBMVkRCRV9DQVBfRlNfMTkyMDAwOworICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMTIwMDAgfCBMVkRCRV9DQVBfRlNfMTYwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfNDgwMDAgfCBMVkRCRV9DQVBfRlNfODgyMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU185NjAwMCB8IExWREJFX0NBUF9GU18xNzY0MDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18xOTIwMDA7CiAjZWxzZQogICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwOwogI2VuZGlmCkBAIC04MDIsNyArOTA3LDEzIEBACiAgICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzCiAgICAgICAgICAqLwogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8IExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwgTFZFUU5CX0NBUF9GU180ODAwMCB8IExWRVFOQl9DQVBfRlNfOTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE5MjAwMDsKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfNDgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzg4MjAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU185NjAwMCB8IExWRVFOQl9DQVBfRlNfMTc2NDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18xOTIwMDA7CiAjZWxzZQogICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8IExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwgTFZFUU5CX0NBUF9GU180ODAwMDsKICNlbmRpZgpAQCAtMTAzOSw3ICsxMTUwLDExIEBACiAgICAgTFZNX1NldEhlYWRyb29tUGFyYW1zKGhJbnN0YW5jZSwgJkhlYWRyb29tUGFyYW1zKTsKIAogICAgIC8qIERDIHJlbW92YWwgZmlsdGVyICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKKyNlbHNlCiAgICAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOworI2VuZGlmCiAKICAgICByZXR1cm4gTFZNX1NVQ0NFU1M7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaAppbmRleCBiNDUzMjIyLi4xOWQxNTMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKQEAgLTE0NCwxMiArMTQ0LDE5IEBACiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBTY3JhdGNoOyAgICAgICAgICAvKiBCdW5kbGUgc2NyYXRjaCBidWZmZXIgKi8KIAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJ1ZmZlclN0YXRlOyAgICAgICAgLyogQnVmZmVyIHN0YXR1cyAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBJbkRlbGF5QnVmZmVyWzMgKiBMVk1fTUFYX0NIQU5ORUxTICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07CisjZWxzZQogICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIEluRGVsYXlCdWZmZXJbNiAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOyAvKiBJbnB1dCBidWZmZXIgZGVsYXkgbGluZSwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBhbmQgcmlnaHQgKi8KKyNlbmRpZgogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEluRGVsYXlTYW1wbGVzOyAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGRlbGF5IGJ1ZmZlciAqLwotCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIE91dERlbGF5QnVmZmVyW0xWTV9NQVhfQ0hBTk5FTFMgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsKKyNlbHNlCiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgT3V0RGVsYXlCdWZmZXJbMiAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOyAvKiBPdXRwdXQgYnVmZmVyIGRlbGF5IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSAqLworI2VuZGlmCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgT3V0RGVsYXlTYW1wbGVzOyAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgb3V0cHV0IGRlbGF5IGJ1ZmZlciwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGFuZCByaWdodCAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFNhbXBsZXNUb091dHB1dDsgICAgLyogU2FtcGxlcyB0byB3cml0ZSB0byB0aGUgb3V0cHV0ICovCkBAIC0yODIsNiArMjg5LDEwIEBACiAKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgIE5vU21vb3RoVm9sdW1lOyAgICAgIC8qIEVuYWJsZSBvciBkaXNhYmxlIHNtb290aCB2b2x1bWUgY2hhbmdlcyovCiAKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICBOckNoYW5uZWxzOworI2VuZGlmCisKIH0gTFZNX0luc3RhbmNlX3Q7CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKaW5kZXggNGExOWExMy4uOTRiYTI3OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jCkBAIC02NSw2ICs2NSwxMCBAQAogICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBUb1Byb2Nlc3MgPSAoTFZNX0ZMT0FUICopcEluRGF0YTsKICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwUHJvY2Vzc2VkID0gcE91dERhdGE7CiAgICAgTFZNX1JldHVyblN0YXR1c19lbiAgU3RhdHVzOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIE5yQ2hhbm5lbHMgID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOworI2RlZmluZSBOckZyYW1lcyBTYW1wbGVDb3VudCAgLy8gYWxpYXMgZm9yIGNsYXJpdHkKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBDaGVjayBpZiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgemVybwpAQCAtMTEyLDYgKzExNiwxMCBAQAogICAgIGlmIChwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKQogICAgIHsKICAgICAgICAgU3RhdHVzID0gTFZNX0FwcGx5TmV3U2V0dGluZ3MoaEluc3RhbmNlKTsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIC8qIFVwZGF0ZSB0aGUgbG9jYWwgdmFyaWFibGUgTnJDaGFubmVscyBmcm9tIHBJbnN0YW5jZS0+TnJDaGFubmVscyB2YWx1ZSAqLworICAgICAgICBOckNoYW5uZWxzID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOworI2VuZGlmCiAKICAgICAgICAgaWYoU3RhdHVzICE9IExWTV9TVUNDRVNTKQogICAgICAgICB7CkBAIC0xMzAsNiArMTM4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCiAgICAgICAgIHBJbnB1dCAgICAgPSBwT3V0RGF0YTsKICAgICAgICAgcFRvUHJvY2VzcyA9IHBPdXREYXRhOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgTnJDaGFubmVscyA9IDI7CisjZW5kaWYKICAgICB9CiAKIApAQCAtMTUzLDcgKzE2NCw2IEBACiAgICAgICAgICAqLwogICAgICAgICBpZiAoU2FtcGxlQ291bnQgIT0gMCkKICAgICAgICAgewotCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQXBwbHkgQ29uY2VydFNvdW5kIGlmIHJlcXVpcmVkCiAgICAgICAgICAgICAgKi8KQEAgLTE3MSwxMCArMTgxLDE4IEBACiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPlZDX0FjdGl2ZSE9MCkKICAgICAgICAgICAgIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yRnJhbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2Vsc2UKICAgICAgICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAgICAgLyogTGVmdCBhbmQgcmlnaHQqLworI2VuZGlmCiAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7CiAgICAgICAgICAgICB9CiAKQEAgLTIyMSwyMCArMjM5LDMzIEBACiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgZmlsdGVyCiAgICAgICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgICAgIEZPX01jX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cFRFX1N0YXRlLT5UcmVibGVCb29zdF9TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworI2Vsc2UKICAgICAgICAgICAgICAgICBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBURV9TdGF0ZS0+VHJlYmxlQm9vc3RfU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpU2FtcGxlQ291bnQpOworI2VuZGlmCiAKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFZvbHVtZSBiYWxhbmNlCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAvKiBUT0RPIC0gTXVsdGljaGFubmVsIHN1cHBvcnQgdG8gYmUgYWRkZWQgKi8KKyAgICAgICAgICAgIGlmIChOckNoYW5uZWxzID09IDIpCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFZvbHVtZSBiYWxhbmNlCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogUGVyZm9ybSBQYXJhbWV0cmljIFNwZWN0dW0gQW5hbHlzaXMKQEAgLTI0MiwyOCArMjczLDM5IEBACiAgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlBTQV9FbmFibGUgPT0gTFZNX1BTQV9PTikgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgPT0gTFZNX1BTQV9PTikpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZyb20yaVRvTW9ub19GbG9hdChwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShTYW1wbGVDb3VudCkpOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgICAgICBGcm9tTWNUb01vbm9fRmxvYXQocFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yRnJhbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZWxzZQorICAgICAgICAgICAgICAgIEZyb20yaVRvTW9ub19GbG9hdChwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoU2FtcGxlQ291bnQpKTsKKyNlbmRpZgogCi0gICAgICAgICAgICAgICAgICAgIExWUFNBX1Byb2Nlc3MocEluc3RhbmNlLT5oUFNBSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKFNhbXBsZUNvdW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpOworICAgICAgICAgICAgICAgIExWUFNBX1Byb2Nlc3MocEluc3RhbmNlLT5oUFNBSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShTYW1wbGVDb3VudCksCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpOwogICAgICAgICAgICAgfQogCi0KICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBEQyByZW1vdmFsCiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBEQ19NY19EMTZfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyNlbHNlCiAgICAgICAgICAgICBEQ18ySV9EMTZfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpU2FtcGxlQ291bnQpOwotCi0KKyNlbmRpZgogICAgICAgICB9Ci0KICAgICAgICAgLyoKICAgICAgICAgICogTWFuYWdlIHRoZSBvdXRwdXQgYnVmZmVyCiAgICAgICAgICAqLwpAQCAtNDk3LDQgKzUzOSw0IEBACiAKICAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOwogfQotI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMKaW5kZXggMTk5ZGRkZS4uYTUzNTZkMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYwpAQCAtMjY5LDYgKzI2OSw1MyBAQAogICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xNV9CMX0KICNpZmRlZiBISUdIRVJfRlMKICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgICAvKiA4OGtIeiBTYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4yX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA0ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW41X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluNl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA3ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgOCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW44X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluOV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEyICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDE1ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xNV9CMX0sCisKICAgICAgICAgICAgICAgICAgICAgLyogOTZrSHogc2FtcGxpbmcgcmF0ZSAqLwogICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCiAgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xX0EwLApAQCAtMzE2LDYgKzM2Myw1MyBAQAogICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTVfQTAsCiAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTVfQjF9LAogCisgICAgICAgICAgICAgICAgICAgIC8qIDE3NmtIeiBTYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4yX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAzICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW41X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA2ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluNl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDggKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW44X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA5ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluOV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEwICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEzICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxNSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xNV9CMX0sCisKICAgICAgICAgICAgICAgICAgICAgLyogMTkya0h6IHNhbXBsaW5nIHJhdGUgKi8KICAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xX0EwLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaAppbmRleCA5YTNkMzVkLi4wNmU3NDJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaApAQCAtNzgsNiArNzgsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTW9ub1NyYywgICAgICAvKiBNb25vIHNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsICAgICAgICAgIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgbik7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBBR0NfTUlYX1ZPTF9NYzFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QgICpwSW5zdGFuY2UsICAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcFN0U3JjLCAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBNb25vU3JjLCAgICAvKiBNb25vIHNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnJGcmFtZXMsICAgICAvKiBOdW1iZXIgb2YgZnJhbWVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsgIC8qIE51bWJlciBvZiBjaGFubmVscyAqLworI2VuZGlmCisKICNlbHNlCiB2b2lkIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl90ICAqcEluc3RhbmNlLCAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAgICAgICAgKnBTdFNyYywgICAgICAgIC8qIFN0ZXJlbyBzb3VyY2UgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmgKaW5kZXggM2VlN2Y2My4uMDE1MzliMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmgKQEAgLTMwLDggKzMwLDE3IEBACiAjaWZkZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0CiB7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIC8qIFRoZSBtZW1vcnkgcmVnaW9uIGNyZWF0ZWQgYnkgdGhpcyBzdHJ1Y3R1cmUgaW5zdGFuY2UgaXMgdHlwZWNhc3QKKyAgICAgKiBpbnRvIGFub3RoZXIgc3RydWN0dXJlIGNvbnRhaW5pbmcgYSBwb2ludGVyIGFuZCBhbiBhcnJheSBvZiBmaWx0ZXIKKyAgICAgKiBjb2VmZmljaWVudHMuIEluIG9uZSBjYXNlIHRoaXMgbWVtb3J5IHJlZ2lvbiBpcyB1c2VkIGZvciBzdG9yaW5nCisgICAgICogREMgY29tcG9uZW50IG9mIGNoYW5uZWxzCisgICAgICovCisgICAgTFZNX0ZMT0FUICpwU3RvcmFnZTsKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVtMVk1fTUFYX0NIQU5ORUxTXTsKKyNlbHNlCiAgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbNl07Ci0KKyNlbmRpZgogfSBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdDsKICNlbHNlCiB0eXBlZGVmIHN0cnVjdApAQCAtMTc5LDcgKzE4OCwxMiBAQAogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMiAqIDIpIF07ICAvKiBUd28gY2hhbm5lbHMsIHR3byB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIC8qIExWTV9NQVhfQ0hBTk5FTFMgY2hhbm5lbHMsIHR3byB0YXBzIG9mIHNpemUgTFZNX0ZMT0FUICovCisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbIChMVk1fTUFYX0NIQU5ORUxTICogMikgXTsKKyNlbHNlCisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgyICogMikgXTsgIC8qIFR3byBjaGFubmVscywgdHdvIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KKyNlbmRpZgogfSBCaXF1YWRfMklfT3JkZXIxX0ZMT0FUX1RhcHNfdDsKICNlbHNlCiB0eXBlZGVmIHN0cnVjdApAQCAtMTk3LDEyICsyMTEsMTcgQEAKICNpZmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDEgKiA0KSBdOyAgLyogT25lIGNoYW5uZWwsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMSAqIDQpIF07ICAvKiBPbmUgY2hhbm5lbCwgZm91ciB0YXBzIG9mIHNpemUgTFZNX0ZMT0FUICovCiB9IEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190OwogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMiAqIDQpIF07ICAvKiBUd28gY2hhbm5lbHMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAvKiBMVk1fTUFYX0NIQU5ORUxTLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKExWTV9NQVhfQ0hBTk5FTFMgKiA0KSBdOworI2Vsc2UKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiA0KSBdOyAgLyogVHdvIGNoYW5uZWxzLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KKyNlbmRpZgogfSBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdDsKICNlbHNlCiB0eXBlZGVmIHN0cnVjdApAQCAtMzY2LDYgKzM4NSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgQlFfTUNfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyNlbmRpZgogI2Vsc2UKIHZvaWQgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLApAQCAtNDM0LDYgKzQ2MCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgRk9fTWNfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCAqcFRhcHMsCkBAIC01MjcsNiArNTYwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBQS19NY19EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCkBAIC01NDAsMTIgKzU4MCwyMiBAQAogCiAvKioqIDE2IGJpdCBkYXRhIHBhdGggU1RFUkVPICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZmRlZiBCVUlMRF9GTE9BVAorI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgRENfTWNfRDE2X1RSQ19XUkFfMDFfSW5pdCAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSk7CisKK3ZvaWQgRENfTWNfRDE2X1RSQ19XUkFfMDEgICAgICAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2Vsc2UKIHZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSk7CiAKIHZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEgICAgICAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbmRpZgogI2Vsc2UKIHZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCAgICAgKCAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UaW1lci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmgKaW5kZXggODFlMjg4Yy4uYTc2MzU0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmgKQEAgLTQ0LDcgKzQ0LDE1IEBACiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgTFZNX0lOVDMyIFN0b3JhZ2VbNl07CisgICAgLyoKKyAgICAgKiBUaGUgbWVtb3J5IGFyZWEgY3JlYXRlZCB1c2luZyB0aGlzIHN0cnVjdHVyZSBpcyBpbnRlcm5hbGx5CisgICAgICogdHlwZWNhc3QgdG8gTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCBhbmQgdXNlZC4KKyAgICAgKiBUaGUgTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCBzdHJ1Y3R1cmUgaGFzIDMgcG9pbnRlciB0eXBlIGVsZW1lbnRzCisgICAgICogMiBlbGVtZW50cyBvZiB0eXBlIExWTV9JTlQzMiBhbmQgb25lIGVsZW1lbnQgb2YgdHlwZSBMVk1fSU5UMTYuCisgICAgICogSW5vcmRlciB0byBjYXRlciBib3RoIDMyIGFuZCA2NCBiaXQgYnVpbGRzLCBTdG9yYWdlIGFycmF5IHNob3VsZAorICAgICAqIGhhdmUgYSBtaW5pbXVtIG9mIDkgZWxlbWVudHMgb2YgdHlwZSBMVk1fSU5UMzIuCisgICAgICovCisgICAgTFZNX0lOVDMyIFN0b3JhZ2VbOV07CiAKIH0gTFZNX1RpbWVyX0luc3RhbmNlX3Q7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmgKaW5kZXggZWExNjA3Mi4uNTk1ODZlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmgKQEAgLTEyMiw2ICsxMjIsMTIgQEAKIAogI2VuZGlmIC8vIE5BVElWRV9GTE9BVF9CVUZGRVIKIAorI2lmZGVmIFNVUFBPUlRfTUMKKyNkZWZpbmUgTFZNX01BWF9DSEFOTkVMUyA4IC8vIEZDQ184CisjZWxzZQorI2RlZmluZSBMVk1fTUFYX0NIQU5ORUxTIDIgLy8gRkNDXzIKKyNlbmRpZgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFN0YW5kYXJkIEVudW1lcmF0ZWQgdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNDMsNiArMTQ5LDkgQEAKICAgICBMVk1fU1RFUkVPICAgICAgICAgID0gMCwKICAgICBMVk1fTU9OT0lOU1RFUkVPICAgID0gMSwKICAgICBMVk1fTU9OTyAgICAgICAgICAgID0gMiwKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX01VTFRJQ0hBTk5FTCAgICA9IDMsCisjZW5kaWYKICAgICBMVk1fU09VUkNFX0RVTU1ZICAgID0gTFZNX01BWEVOVU0KIH0gTFZNX0Zvcm1hdF9lbjsKIApAQCAtMTYwLDggKzE2OSwxMCBAQAogICAgIExWTV9GU180NDEwMCA9IDcsCiAgICAgTFZNX0ZTXzQ4MDAwID0gOCwKICNpZmRlZiBISUdIRVJfRlMKLSAgICBMVk1fRlNfOTYwMDAgPSA5LAotICAgIExWTV9GU18xOTIwMDAgPSAxMCwKKyAgICBMVk1fRlNfODgyMDAgPSA5LAorICAgIExWTV9GU185NjAwMCA9IDEwLAorICAgIExWTV9GU18xNzY0MDAgPSAxMSwKKyAgICBMVk1fRlNfMTkyMDAwID0gMTIsCiAjZW5kaWYKICAgICBMVk1fRlNfSU5WQUxJRCA9IExWTV9NQVhFTlVNLTEsCiAgICAgTFZNX0ZTX0RVTU1ZID0gTFZNX01BWEVOVU0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaAppbmRleCAwYmEyMGEzLi43NDY4YTkwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCkBAIC00Nyw2ICs0NywxNiBAQAogdm9pZCBDb3B5X0Zsb2F0KCAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBDb3B5X0Zsb2F0X01jX1N0ZXJlbyggICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBOckNoYW5uZWxzKTsKK3ZvaWQgQ29weV9GbG9hdF9TdGVyZW9fTWMoICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIENvcHlfMTYoICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LApAQCAtMTgxLDYgKzE5MSwxMiBAQAogdm9pZCBGcm9tMmlUb01vbm9fRmxvYXQoICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgRnJvbU1jVG9Nb25vX0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIEZyb20yaVRvTW9ub18zMiggICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jCmluZGV4IGZhOWYwMWYuLjVjODY1NWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jCkBAIC0zMDUsNCArMzA1LDE1MCBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICBBR0NfTUlYX1ZPTF9NYzFNb25fRDMyX1dSQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBcHBseSBBR0MgYW5kIG1peCBzaWduYWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTWNTcmMgICAtLS0tLS0tLS0tLS0tLS0tLS18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIF9fX19fXyAgICAgICBffF8gICAgICAgIF9fX19fX19fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgIHwgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb25vU3JjIC0tPnwgQUdDICB8LS0tLT58ICsgfC0tLS0tPnwgVm9sdW1lIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tPiAgICAqLworLyogICAgICAgICAgICAgfCBHYWluIHwgICAgIHxfX198ICAgICAgfCBHYWluICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICovCisvKiAgICAgICAgICAgICB8X19fX19ffCAgICAgICAgICAgICAgICB8X19fX19fX198ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgIC98XCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX19fX19fX19fICAgICBfX19fX19fXyAgICB8ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgfCAgICAgICAgfCAgIHwgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IEFHQyBHYWluIHw8LS18IFBlYWsgICB8PC0tfCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVXBkYXRlICAgfCAgIHwgRGV0ZWN0IHwgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX19fX198ICAgfF9fX19fX19ffCAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWNTcmMgICAgICAgICAgICAgICAgICBNdWx0aWNoYW5uZWwgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNb25vU3JjICAgICAgICAgICAgICAgIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcERzdCAgICAgICAgICAgICAgICAgICAgTXVsdGljaGFubmVsIGRlc3RpbmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOckZyYW1lcyAgICAgICAgICAgICAgICBOdW1iZXIgb2YgZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5yQ2hhbm5lbHMgICAgICAgICAgICAgIE51bWJlciBvZiBjaGFubmVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQUdDX01JWF9WT0xfTWMxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90ICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBNY1NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTW9ub1NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICpwRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKQoreworCisgICAgLyoKKyAgICAgKiBHZW5lcmFsIHZhcmlhYmxlcworICAgICAqLworICAgIExWTV9VSU5UMTYgICAgICBpLCBqajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZSBpbmRleCAqLworICAgIExWTV9GTE9BVCAgICAgICBTYW1wbGVWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZSB2YWx1ZSAqLworICAgIExWTV9GTE9BVCAgICAgICBNb25vOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vbm8gc2FtcGxlICovCisgICAgTFZNX0ZMT0FUICAgICAgIEFic1BlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWJzb2x1dGUgcGVhayBzaWduYWwgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgQUdDX011bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgICBWb2xfTXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IHZvbHVtZSAqLworCisKKyAgICAvKgorICAgICAqIEluc3RhbmNlIGNvbnRyb2wgdmFyaWFibGVzCisgICAgICovCisgICAgTFZNX0ZMT0FUICAgICAgQUdDX0dhaW4gICAgICA9IHBJbnN0YW5jZS0+QUdDX0dhaW47ICAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgQUdDX01heEdhaW4gICA9IHBJbnN0YW5jZS0+QUdDX01heEdhaW47ICAgICAgLyogR2V0IG1heGltdW0gQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfQXR0YWNrICAgID0gcEluc3RhbmNlLT5BR0NfQXR0YWNrOyAgICAgICAvKiBBdHRhY2sgc2NhbGVyICovCisgICAgLyogRGVjYXkgc2NhbGVyICovCisgICAgTFZNX0ZMT0FUICAgICAgQUdDX0RlY2F5ICAgICA9IChwSW5zdGFuY2UtPkFHQ19EZWNheSAqICgxIDw8IChERUNBWV9TSElGVCkpKTsKKyAgICBMVk1fRkxPQVQgICAgICBBR0NfVGFyZ2V0ICAgID0gcEluc3RhbmNlLT5BR0NfVGFyZ2V0OyAgICAgICAvKiBHZXQgdGhlIHRhcmdldCBsZXZlbCAqLworICAgIExWTV9GTE9BVCAgICAgIFZvbF9DdXJyZW50ICAgPSBwSW5zdGFuY2UtPlZvbHVtZTsgICAgICAgICAgIC8qIEFjdHVhbCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9GTE9BVCAgICAgIFZvbF9UYXJnZXQgICAgPSBwSW5zdGFuY2UtPlRhcmdldDsgICAgICAgICAgIC8qIFRhcmdldCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9GTE9BVCAgICAgIFZvbF9UQyAgICAgICAgPSBwSW5zdGFuY2UtPlZvbHVtZVRDOyAgICAgICAgIC8qIFRpbWUgY29uc3RhbnQgKi8KKworCisgICAgLyoKKyAgICAgKiBQcm9jZXNzIG9uIGEgc2FtcGxlIGJ5IHNhbXBsZSBiYXNpcworICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOckZyYW1lczsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgZWFjaCBmcmFtZSAqLworICAgIHsKKworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIHNjYWxlcnMKKyAgICAgICAgICovCisgICAgICAgIEFHQ19NdWx0ICAgID0gKExWTV9GTE9BVCkoQUdDX0dhaW4pOyAgICAgICAgICAgICAgLyogR2V0IHRoZSBBR0MgZ2FpbiAqLworICAgICAgICBWb2xfTXVsdCAgICA9IChMVk1fRkxPQVQpKFZvbF9DdXJyZW50KTsgICAgICAgICAgIC8qIEdldCB0aGUgdm9sdW1lIGdhaW4gKi8KKworICAgICAgICBBYnNQZWFrID0gMC4wZjsKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBpbnB1dCBzYW1wbGVzCisgICAgICAgICAqLworICAgICAgICBmb3IgKGpqID0gMDsgamogPCBOckNoYW5uZWxzOyBqaisrKQorICAgICAgICB7CisgICAgICAgICAgICBTYW1wbGVWYWwgID0gKnBNY1NyYysrOyAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBzYW1wbGUgdmFsdWUgb2YgamogQ2hhbm5lbCovCisgICAgICAgICAgICBNb25vICAgICAgID0gKnBNb25vU3JjOyAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBtb25vIHNhbXBsZSAqLworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgdGhlIEFHQyBnYWluIHRvIHRoZSBtb25vIGlucHV0IGFuZCBtaXggd2l0aCB0aGUgaW5wdXQgc2lnbmFsCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFNhbXBsZVZhbCAgKz0gKE1vbm8gKiBBR0NfTXVsdCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTWl4IGluIHRoZSBtb25vIHNpZ25hbCAqLworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgdGhlIHZvbHVtZSBhbmQgd3JpdGUgdG8gdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgU2FtcGxlVmFsICA9IFNhbXBsZVZhbCAgKiBWb2xfTXVsdDsKKworICAgICAgICAgICAgKnBEc3QrKyA9IFNhbXBsZVZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgdGhlIHJlc3VsdHMgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgQUdDIGdhaW4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQWJzUGVhayA9IEFic19GbG9hdChTYW1wbGVWYWwpID4gQWJzUGVhayA/IEFic19GbG9hdChTYW1wbGVWYWwpIDogQWJzUGVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoQWJzUGVhayA+IEFHQ19UYXJnZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgc2lnbmFsIGlzIHRvbyBsYXJnZSBzbyBkZWNyZWFzZSB0aGUgZ2FpbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBBR0NfR2FpbiA9IEFHQ19HYWluICogQUdDX0F0dGFjazsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgc2lnbmFsIGlzIHRvbyBzbWFsbCBzbyBpbmNyZWFzZSB0aGUgZ2FpbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoQUdDX0dhaW4gPiBBR0NfTWF4R2FpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBR0NfR2FpbiAtPSAoQUdDX0RlY2F5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBR0NfR2FpbiArPSAoQUdDX0RlY2F5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwTW9ub1NyYysrOworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIGdhaW4KKyAgICAgICAgICovCisgICAgICAgIFZvbF9DdXJyZW50ICs9ICAoVm9sX1RhcmdldCAtIFZvbF9DdXJyZW50KSAqICgoTFZNX0ZMT0FUKVZvbF9UQyAvIFZPTF9UQ19GTE9BVCk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgcGFyYW1ldGVycworICAgICAqLworICAgIHBJbnN0YW5jZS0+Vm9sdW1lID0gVm9sX0N1cnJlbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFjdHVhbCB2b2x1bWUgc2V0dGluZyAqLworICAgIHBJbnN0YW5jZS0+QUdDX0dhaW4gPSBBR0NfR2FpbjsKKworICAgIHJldHVybjsKK30KKyNlbmRpZiAvKlNVUFBPUlRfTUMqLwogI2VuZGlmIC8qQlVJTERfRkxPQVQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMKaW5kZXggOTYwZGU3OS4uZDYzMzY1YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jCkBAIC0xMjMsNiArMTIzLDg3IEBACiAgICAgICAgIH0KIAogICAgIH0KKworI2lmZGVmIFNVUFBPUlRfTUMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEFTU1VNUFRJT05TOgorIENPRUZTLQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTIsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTEKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIEEwLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIC1CMgorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gaXMgLUIxCisKKyBERUxBWVMtCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIHRvCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgLSAxXSBpcyB4KG4tMSkgZm9yIGFsbCBOckNoYW5uZWxzCisKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVsc10gdG8KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMipOckNoYW5uZWxzIC0gMV0gaXMgeChuLTIpIGZvciBhbGwgTnJDaGFubmVscworCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqTnJDaGFubmVsc10gdG8KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMypOckNoYW5uZWxzIC0gMV0gaXMgeShuLTEpIGZvciBhbGwgTnJDaGFubmVscworCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzMqTnJDaGFubmVsc10gdG8KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNCpOckNoYW5uZWxzIC0gMV0gaXMgeShuLTIpIGZvciBhbGwgTnJDaGFubmVscworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBCUV9NQ19EMzJGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpCisKKworICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUIHluLCB0ZW1wOworICAgICAgICBMVk1fSU5UMTYgaWksIGpqOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgQ0hBTk5FTC1XSVNFCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBmb3IgKGpqID0gMDsgamogPCBOckNoYW5uZWxzOyBqaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHluPSAoQTIgICogeChuLTIpKSAqLworICAgICAgICAgICAgICAgIHluID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICsgampdOworCisgICAgICAgICAgICAgICAgLyogeW4rPSAoQTEgICogeChuLTEpKSAqLworICAgICAgICAgICAgICAgIHRlbXAgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzW2pqXTsKKyAgICAgICAgICAgICAgICB5biArPSB0ZW1wOworCisgICAgICAgICAgICAgICAgLyogeW4rPSAoQTAgICogeChuKSkgKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisgICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKKworICAgICAgICAgICAgICAgICAvKiB5bis9ICgtQjIgICogeShuLTIpKSAqLworICAgICAgICAgICAgICAgIHRlbXAgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMqMyArIGpqXTsKKyAgICAgICAgICAgICAgICB5biArPSB0ZW1wOworCisgICAgICAgICAgICAgICAgLyogeW4rPSAoLUIxICAqIHkobi0xKSkgKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzKjIgKyBqal07CisgICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKKworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMyArIGpqXSA9CisgICAgICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMiArIGpqXTsgLyogeShuLTIpPXkobi0xKSovCisgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAxICsgampdID0KKyAgICAgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW2pqXTsgLyogeChuLTIpPXgobi0xKSovCisgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAyICsgampdID0gKExWTV9GTE9BVCl5bjsgLyogVXBkYXRlIHkobi0xKSovCisgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW2pqXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSkqLworICAgICAgICAgICAgICAgIHBEYXRhSW4rKzsKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpeW47IC8qIFdyaXRlIGpqIENoYW5uZWwgb3V0cHV0ICovCisgICAgICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorI2VuZGlmIC8qU1VQUE9SVF9NQyovCisKICNlbHNlCiB2b2lkIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMKaW5kZXggZTQ4OTAzMS4uMzg1ODQ1MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYwpAQCAtODQsNSArODQsNjUgQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBTVVBQT1JUX01DCisvLyBFeHRyYWN0IG91dCB0aGUgc3RlcmVvIGNoYW5uZWwgcGFpciBmcm9tIG11bHRpY2hhbm5lbCBzb3VyY2UuCit2b2lkIENvcHlfRmxvYXRfTWNfU3RlcmVvKGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLCAvKiBOdW1iZXIgb2YgZnJhbWVzICovCisgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBOckNoYW5uZWxzKQoreworICAgIExWTV9JTlQxNiBpaTsKKworICAgIGlmIChOckNoYW5uZWxzID49IDIpCisgICAgeworICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdFswXSA9IHNyY1swXTsKKyAgICAgICAgICAgIGRzdFsxXSA9IHNyY1sxXTsKKyAgICAgICAgICAgIGRzdCArPSAyOworICAgICAgICAgICAgc3JjICs9IE5yQ2hhbm5lbHM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoTnJDaGFubmVscyA9PSAxKQorICAgIHsgICAvLyBub3QgZXhwZWN0ZWQgdG8gb2NjdXIsIHByb3ZpZGVkIGZvciBjb21wbGV0ZW5lc3MuCisgICAgICAgIHNyYyArPSAoTnJGcmFtZXMgLSAxKTsKKyAgICAgICAgZHN0ICs9IDIgKiAoTnJGcmFtZXMgLSAxKTsKKyAgICAgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICBkc3RbMF0gPSBzcmNbMF07CisgICAgICAgICAgICBkc3RbMV0gPSBzcmNbMF07CisgICAgICAgICAgICBkc3QgLT0gMjsKKyAgICAgICAgICAgIHNyYyAtLTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gTWVyZ2UgYSBtdWx0aWNoYW5uZWwgc291cmNlIHdpdGggc3RlcmVvIGNvbnRhaW5lZCBpbiBkc3QsIHRvIGRzdC4KK3ZvaWQgQ29weV9GbG9hdF9TdGVyZW9fTWMoY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsIC8qIE51bWJlciBvZiBmcmFtZXMqLworICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgTnJDaGFubmVscykKK3sKKyAgICBMVk1fSU5UMTYgaWksIGpqOworICAgIExWTV9GTE9BVCAqc3JjX3N0ID0gZHN0ICsgMiAqIChOckZyYW1lcyAtIDEpOworCisgICAgLy8gcmVwYWNrIGRzdCB3aGljaCBjYXJyaWVzIHN0ZXJlbyBpbmZvcm1hdGlvbgorICAgIC8vIHRvZ2V0aGVyIHdpdGggdGhlIHVwcGVyIGNoYW5uZWxzIG9mIHNyYy4KKyAgICBkc3QgKz0gTnJDaGFubmVscyAqIChOckZyYW1lcyAtIDEpOworICAgIHNyYyArPSBOckNoYW5uZWxzICogKE5yRnJhbWVzIC0gMSk7CisgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgZHN0WzFdID0gc3JjX3N0WzFdOworICAgICAgICBkc3RbMF0gPSBzcmNfc3RbMF07IC8vIGNvcHkgMSBiZWZvcmUgMCBpcyByZXF1aXJlZCBmb3IgTnJDaGFubmVscyA9PSAzLgorICAgICAgICBmb3IgKGpqID0gMjsgamogPCBOckNoYW5uZWxzOyBqaisrKQorICAgICAgICB7CisgICAgICAgICAgICBkc3RbampdID0gc3JjW2pqXTsKKyAgICAgICAgfQorICAgICAgICBkc3QgICAgLT0gTnJDaGFubmVsczsKKyAgICAgICAgc3JjICAgIC09IE5yQ2hhbm5lbHM7CisgICAgICAgIHNyY19zdCAtPSAyOworICAgIH0KK30KKyNlbmRpZgogI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jCmluZGV4IGQyNjFjOWUuLjEzZmFjNWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYwpAQCAtMzMsNyArMzMsNyBAQAogICAgICAgICBSaWdodERDID0gcEJpcXVhZFN0YXRlLT5SaWdodERDOwogICAgICAgICBmb3IoaiA9IE5yU2FtcGxlcy0xOyBqID49IDA7IGotLSkKICAgICAgICAgewotICAgICAgICAgICAgLyogU3VidHJhY3QgREMgYW4gc2F0dXJhdGUgKi8KKyAgICAgICAgICAgIC8qIFN1YnRyYWN0IERDIGFuZCBzYXR1cmF0ZSAqLwogICAgICAgICAgICAgRGlmZiA9KiAocERhdGFJbisrKSAtIChMZWZ0REMpOwogICAgICAgICAgICAgaWYgKERpZmYgPiAxLjBmKSB7CiAgICAgICAgICAgICAgICAgRGlmZiA9IDEuMGY7IH0KQEAgLTY0LDYgKzY0LDU4IEBACiAKIAogICAgIH0KKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIERDX01jX0QxNl9UUkNfV1JBXzAxCisgKgorICogREVTQ1JJUFRJT046CisgKiAgREMgcmVtb3ZhbCBmcm9tIGFsbCBjaGFubmVscyBvZiBhIG11bHRpY2hhbm5lbCBpbnB1dAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcEluc3RhbmNlICAgICAgSW5zdGFuY2UgcG9pbnRlcgorICogIHBEYXRhSW4gICAgICAgIElucHV0L1NvdXJjZQorICogIHBEYXRhT3V0ICAgICAgIE91dHB1dC9EZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgRENfTWNfRDE2X1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgKkNoREM7CisgICAgICAgIExWTV9GTE9BVCBEaWZmOworICAgICAgICBMVk1fSU5UMzIgajsKKyAgICAgICAgTFZNX0lOVDMyIGk7CisgICAgICAgIFBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMpIHBJbnN0YW5jZTsKKworICAgICAgICBDaERDID0gJnBCaXF1YWRTdGF0ZS0+Q2hEQ1swXTsKKyAgICAgICAgZm9yIChqID0gTnJGcmFtZXMgLSAxOyBqID49IDA7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogU3VidHJhY3QgREMgYW5kIHNhdHVyYXRlICovCisgICAgICAgICAgICBmb3IgKGkgPSBOckNoYW5uZWxzIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGlmZiA9ICoocERhdGFJbisrKSAtIChDaERDW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoRGlmZiA+IDEuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgRGlmZiA9IDEuMGY7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChEaWZmIDwgLTEuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgRGlmZiA9IC0xLjBmOyB9CisgICAgICAgICAgICAgICAgKihwRGF0YU91dCsrKSA9IChMVk1fRkxPQVQpRGlmZjsKKyAgICAgICAgICAgICAgICBpZiAoRGlmZiA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hEQ1tpXSAtPSBEQ19GTE9BVF9TVEVQOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIENoRENbaV0gKz0gRENfRkxPQVRfU1RFUDsgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgIH0KKyNlbmRpZgogI2Vsc2UKIHZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYwppbmRleCA0ZjRmY2Q4Li4wZjk0MWEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0yNCw2ICsyNCwxNyBAQAogICAgIHBCaXF1YWRTdGF0ZS0+TGVmdERDICAgICAgICA9IDAuMGY7CiAgICAgcEJpcXVhZFN0YXRlLT5SaWdodERDICAgICAgID0gMC4wZjsKIH0KKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkICBEQ19NY19EMTZfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSkKK3sKKyAgICBQRmlsdGVyX0ZMT0FUX1N0YXRlX01jIHBCaXF1YWRTdGF0ZSAgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYykgcEluc3RhbmNlOworICAgIExWTV9JTlQzMiBpOworICAgIGZvciAoaSA9IDA7IGkgPCBMVk1fTUFYX0NIQU5ORUxTOyBpKyspCisgICAgeworICAgICAgICBwQmlxdWFkU3RhdGUtPkNoRENbaV0gPSAwLjBmOworICAgIH0KK30KKyNlbmRpZgogI2Vsc2UKIHZvaWQgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0luc3RhbmNlX3QgICAqcEluc3RhbmNlKQogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IGZhNmI3MjkuLmRiM2E2ZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTM0LDYgKzM0LDEzIEBACiAgICAgTFZNX0ZMT0FUICBSaWdodERDOyAgICAvKiBSaWdodERDICAqLwogfUZpbHRlcl9GTE9BVF9TdGF0ZTsKIHR5cGVkZWYgRmlsdGVyX0ZMT0FUX1N0YXRlICogUEZpbHRlcl9GTE9BVF9TdGF0ZSA7CisjaWZkZWYgU1VQUE9SVF9NQwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9GTE9BVF9TdGF0ZV9NY18KK3sKKyAgICBMVk1fRkxPQVQgIENoRENbTFZNX01BWF9DSEFOTkVMU107ICAgICAvKiBDaGFubmVsREMgICovCit9IEZpbHRlcl9GTE9BVF9TdGF0ZV9NYzsKK3R5cGVkZWYgRmlsdGVyX0ZMT0FUX1N0YXRlX01jICogUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYyA7CisjZW5kaWYKICNlbHNlCiB0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jCmluZGV4IDE5MjkyN2MuLjJhNTBmMTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMKQEAgLTExNyw2ICsxMTcsOTMgQEAKICAgICAgICAgfQogCiAgICAgfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQVNTVU1QVElPTlM6CitDT0VGUy0KK3BCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTEsCitwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEEwLAorcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyAtQjEsCitERUxBWVMtCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMipjaCArIDBdIGlzIHgobi0xKSBvZiB0aGUgJ2NoJyAtIGNoYW5uZWwKK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1syKmNoICsgMV0gaXMgeShuLTEpIG9mIHRoZSAnY2gnIC0gY2hhbm5lbAorVGhlIGluZGV4ICdjaCcgcnVucyBmcm9tIDAgdG8gKE5yQ2hhbm5lbHMgLSAxKQorCitQQVJBTUVURVJTOgorIHBJbnN0YW5jZSAgICAgICAgUG9pbnRlciBJbnN0YW5jZQorIHBEYXRhSW4gICAgICAgICAgSW5wdXQvU291cmNlCisgcERhdGFPdXQgICAgICAgICBPdXRwdXQvRGVzdGluYXRpb24KKyBOckZyYW1lcyAgICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyBOckNoYW5uZWxzICAgICAgIE51bWJlciBvZiBjaGFubmVscworCitSRVRVUk5TOgorIHZvaWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRk9fTWNfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICAgeW47CisgICAgICAgIExWTV9GTE9BVCAgIFRlbXA7CisgICAgICAgIExWTV9JTlQxNiAgIGlpOworICAgICAgICBMVk1fSU5UMTYgICBjaDsKKyAgICAgICAgUEZpbHRlcl9GbG9hdF9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GbG9hdF9TdGF0ZSkgcEluc3RhbmNlOworCisgICAgICAgIExWTV9GTE9BVCAgICpwRGVsYXlzID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzOworICAgICAgICBMVk1fRkxPQVQgICAqcENvZWZzICA9ICZwQmlxdWFkU3RhdGUtPmNvZWZzWzBdOworICAgICAgICBMVk1fRkxPQVQgICBBMCA9IHBDb2Vmc1sxXTsKKyAgICAgICAgTFZNX0ZMT0FUICAgQTEgPSBwQ29lZnNbMF07CisgICAgICAgIExWTV9GTE9BVCAgIEIxID0gcENvZWZzWzJdOworCisKKworCisgICAgICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBDSEFOTkVMUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgTnJDaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB5biA9QTEgICogeChuLTEpCisgICAgICAgICAgICAgICAgeW4gPSAoTFZNX0ZMT0FUKUExICogcERlbGF5c1swXTsKKworICAgICAgICAgICAgICAgIC8vIHluKz1BMCAgKiB4KG4pCisgICAgICAgICAgICAgICAgeW4gKz0gKExWTV9GTE9BVClBMCAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgICAgICAvLyB5biArPSAgKC1CMSAgKiB5KG4tMSkpCisgICAgICAgICAgICAgICAgVGVtcCA9IEIxICogcERlbGF5c1sxXTsKKyAgICAgICAgICAgICAgICB5biArPSBUZW1wOworCisKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICBwRGVsYXlzWzFdID0geW47IC8vIFVwZGF0ZSB5KG4tMSkKKyAgICAgICAgICAgICAgICBwRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpCisKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICAgICAgLypTYXR1cmF0ZSByZXN1bHRzKi8KKyAgICAgICAgICAgICAgICBpZiAoeW4gPiAxLjBmKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeW4gPSAxLjBmOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeW4gPCAtMS4wZikgeworICAgICAgICAgICAgICAgICAgICB5biA9IC0xLjBmOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bjsKKyAgICAgICAgICAgICAgICBwRGVsYXlzICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwRGVsYXlzIC09IE5yQ2hhbm5lbHMgKiAyOworICAgICAgICB9CisgICAgfQorI2VuZGlmCiAjZWxzZQogdm9pZCBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCmluZGV4IGFjMWVlYTguLmQwMmFmODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCkBAIC02OCw1ICs2OCw0NyBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBGVU5DVElPTjogICAgICAgRnJvbU1jVG9Nb25vX0Zsb2F0CisgKgorICogREVTQ1JJUFRJT046CisgKiAgQ3JlYXRlcyBhIG1vbm8gc3RyZWFtIGZyb20gYSBtdWx0aWNoYW5uZWwgaW5wdXQgdGFraW5nIHRoZSBhdmVyZ2FlIG9mCisgKiAgc2FtcGxlIHZhbHVlcyBvZiBhbGwgY2hhbm5lbHMKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHNyYyAgICAgICAgICAgIFNvdXJjZQorICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBGcm9tTWNUb01vbm9fRmxvYXQoY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckNoYW5uZWxzKQoreworICAgIExWTV9JTlQxNiBpaSwgamo7CisgICAgTFZNX0ZMT0FUIFRlbXA7CisKKyAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBUZW1wID0gMC4wZjsKKyAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9MDsgamotLSkKKyAgICAgICAgeworICAgICAgICAgICAgVGVtcCArPSAoKnNyYyk7CisgICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgfQorICAgICAgICAqZHN0ID0gVGVtcCAvIE5yQ2hhbm5lbHM7CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKyNlbmRpZgorCiAjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmMKaW5kZXggZDI2OTRjYy4uNDE5YzdjNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jCkBAIC0yNiwxMCArMjYsMTAgQEAKICAgIEZVTkNUSU9OIExWQ29yZV9NSVhTT0ZUXzFTVF9EMTZDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQordm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVChMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIG4pCiB7CiAKICAgICBMVk1fSU5UMTYgICBPdXRMb29wOwpAQCAtMTE0LDYgKzExNCwxMzkgQEAKICAgICB9CiAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gQ3VycmVudDsKIH0KKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIExWQ19Db3JlX01peEluU29mdF9NY19EMTZDMzFfU0FUCisgKgorICogREVTQ1JJUFRJT046CisgKiAgTWl4ZXIgZnVuY3Rpb24gd2l0aCBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIG11bHRpY2hhbm5lbCBpbnB1dC4KKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMgICAgICAgICAgICBTb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgTnJDaGFubmVscykKK3sKKworICAgIExWTV9JTlQxNiAgIE91dExvb3A7CisgICAgTFZNX0lOVDE2ICAgSW5Mb29wOworICAgIExWTV9JTlQzMiAgIGlpLCBqajsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+UHJpdmF0ZVBhcmFtcyk7CisgICAgTFZNX0ZMT0FUICAgRGVsdGEgPSBwSW5zdGFuY2UtPkRlbHRhOworICAgIExWTV9GTE9BVCAgIEN1cnJlbnQgPSBwSW5zdGFuY2UtPkN1cnJlbnQ7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgTFZNX0ZMT0FUICAgVGVtcDsKKworICAgIC8qCisgICAgICogU2FtZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIG9uIGNvbnNlY3V0aXZlIGZyYW1lcy4KKyAgICAgKiBTbyB0d28gZnJhbWVzIGFyZSBwcm9jZXNzZWQgaW4gb25lIGl0ZXJhdGlvbiBhbmQKKyAgICAgKiB0aGUgbG9vcCB3aWxsIHJ1biBvbmx5IGZvciBoYWxmIHRoZSBOckZyYW1lcyB2YWx1ZSB0aW1lcy4KKyAgICAgKi8KKyAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShOckZyYW1lcyA+PiAxKTsKKyAgICAvKiBPdXRMb29wIGlzIGNhbGN1bGF0ZWQgdG8gaGFuZGxlIGNhc2VzIHdoZXJlIE5yRnJhbWVzIHZhbHVlIGNhbiBiZSBvZGQuKi8KKyAgICBPdXRMb29wID0gKExWTV9JTlQxNikoTnJGcmFtZXMgLSAoSW5Mb29wIDw8IDEpKTsKKworICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KSB7CisgICAgICAgIGlmIChPdXRMb29wKSB7CisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wKk5yQ2hhbm5lbHM7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKCpkc3QpICsgKCooc3JjKyspICogQ3VycmVudCk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSBUZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKKyAgICAgICAgICAgIEN1cnJlbnQgPSBUZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9IDAgOyBqai0tKSB7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKKworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNleworICAgICAgICBpZiAoT3V0TG9vcCkgeworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wKk5yQ2hhbm5lbHM7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKCpkc3QpICsgKCooc3JjKyspICogQ3VycmVudCk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSBUZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwIDsgamotLSkgeworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisKKyAgICAgICAgICAgICAgICBUZW1wID0gKCpkc3QpICsgKCooc3JjKyspICogQ3VycmVudCk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSBUZW1wOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gQ3VycmVudDsKK30KKworI2VuZGlmCiAjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jCmluZGV4IGI1ZTdmNWMuLjViZmRhZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMKQEAgLTI3LDEwICsyNywxMCBAQAogICAgRlVOQ1RJT04gTFZDb3JlX01JWFNPRlRfMVNUX0QxNkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQShMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIG4pCiB7CiAgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKICAgICBMVk1fSU5UMTYgICBJbkxvb3A7CkBAIC0xMDUsNiArMTA1LDExOSBAQAogICAgIH0KICAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKIH0KKworCisjaWZkZWYgU1VQUE9SVF9NQworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBMVkNfQ29yZV9NaXhTb2Z0X01jX0QxNkMzMV9XUkEKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBNaXhlciBmdW5jdGlvbiB3aXRoIHN1cHBvcnQgZm9yIHByb2Nlc3NpbmcgbXVsdGljaGFubmVsIGlucHV0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBwdHJJbnN0YW5jZSAgICBJbnN0YW5jZSBwb2ludGVyCisgKiAgc3JjICAgICAgICAgICAgU291cmNlCisgKiAgZHN0ICAgICAgICAgICAgRGVzdGluYXRpb24KKyAqICBOckZyYW1lcyAgICAgICBOdW1iZXIgb2YgZnJhbWVzCisgKiAgTnJDaGFubmVscyAgICAgTnVtYmVyIG9mIGNoYW5uZWxzCisgKgorICogUkVUVVJOUzoKKyAqICB2b2lkCisgKgorICovCit2b2lkIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQShMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgTnJDaGFubmVscykKK3sKKyAgICBMVk1fSU5UMTYgICBPdXRMb29wOworICAgIExWTV9JTlQxNiAgIEluTG9vcDsKKyAgICBMVk1fSU5UMzIgICBpaSwgamo7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2U9KE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fRkxPQVQgICBEZWx0YT0gKExWTV9GTE9BVClwSW5zdGFuY2UtPkRlbHRhOworICAgIExWTV9GTE9BVCAgIEN1cnJlbnQgPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXQ9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgTFZNX0ZMT0FUICAgVGVtcDsKKworICAgIC8qCisgICAgICogU2FtZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIG9uIGNvbnNlY3V0aXZlIGZyYW1lcy4KKyAgICAgKiBTbyB0d28gZnJhbWVzIGFyZSBwcm9jZXNzZWQgaW4gb25lIGl0ZXJhdGlvbiBhbmQKKyAgICAgKiB0aGUgbG9vcCB3aWxsIHJ1biBvbmx5IGZvciBoYWxmIHRoZSBOckZyYW1lcyB2YWx1ZSB0aW1lcy4KKyAgICAgKi8KKyAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShOckZyYW1lcyA+PiAxKTsKKyAgICAvKiBPdXRMb29wIGlzIGNhbGN1bGF0ZWQgdG8gaGFuZGxlIGNhc2VzIHdoZXJlIE5yRnJhbWVzIHZhbHVlIGNhbiBiZSBvZGQuKi8KKyAgICBPdXRMb29wID0gKExWTV9JTlQxNikoTnJGcmFtZXMgLSAoSW5Mb29wIDw8IDEpKTsKKworICAgIGlmIChDdXJyZW50PFRhcmdldCkgeworICAgICAgICBpZiAoT3V0TG9vcCkgeworCisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAxLjBmOworICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAtMS4wZjsKKworICAgICAgICAgICAgQ3VycmVudD1UZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0wOyBqai0tKSB7CisgICAgICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgeworCisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworCisgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgVGVtcCA9IDEuMGY7CisgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgVGVtcCA9IC0xLjBmOworCisgICAgICAgICAgICBDdXJyZW50PVRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMCA7IGpqLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZXsKKyAgICAgICAgaWYgKE91dExvb3ApIHsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPTA7IGpqLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9IDAgOyBqai0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHBJbnN0YW5jZS0+Q3VycmVudD1DdXJyZW50OworfQorI2VuZGlmCisKICNlbHNlCiB2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMKaW5kZXggMTkyZjEyNi4uNjU5NTZmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMKQEAgLTM0LDEwICszNCwxMCBAQAogICAgRlVOQ1RJT04gTUlYSU5TT0ZUX0QxNkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbikKK3ZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIG4pCiB7CiAgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CiAgICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKQEAgLTEwNiw2ICsxMDYsMTEwIEBACiAgICAgfQogCiB9CisKKworCisjaWZkZWYgU1VQUE9SVF9NQworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBNaXhlciBmdW5jdGlvbiB3aXRoIHN1cHBvcnQgZm9yIHByb2Nlc3NpbmcgbXVsdGljaGFubmVsIGlucHV0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBwdHJJbnN0YW5jZSAgICBJbnN0YW5jZSBwb2ludGVyCisgKiAgc3JjICAgICAgICAgICAgU291cmNlCisgKiAgZHN0ICAgICAgICAgICAgRGVzdGluYXRpb24KKyAqICBOckZyYW1lcyAgICAgICBOdW1iZXIgb2YgZnJhbWVzCisgKiAgTnJDaGFubmVscyAgICAgTnVtYmVyIG9mIGNoYW5uZWxzCisgKgorICogUkVUVVJOUzoKKyAqICB2b2lkCisgKgorICovCit2b2lkIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckNoYW5uZWxzKQoreworICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CisKKyAgICBpZiAoTnJGcmFtZXMgPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQorICAgIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+RGVsdGEgPT0gMS4wZikgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIExWQ19Db3JlX01peEluU29mdF9NY19EMTZDMzFfU0FUKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ICE9IDApIHsgLyogTm90aGluZyB0byBkbyBpbiBjYXNlIFRhcmdldCA9IDAgKi8KKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQpID09IDEuMGYpIHsKKyAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChzcmMsIGRzdCwgTnJGcmFtZXMqTnJDaGFubmVscyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPlRhcmdldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAvKiBJbiBjYXNlIHRoZSBMVkNvcmUgZnVuY3Rpb24gd291bGQgaGF2ZSBjaGFuZ2VkIHRoZSBDdXJyZW50IHZhbHVlICovCisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCkgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW0sIFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKSB7CisgICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSAoXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KKyNlbmRpZgorCisKICNlbHNlCiB2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMKaW5kZXggMTAxN2RlMy4uMDY3OGFlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jCkBAIC0xMDMsNiArMTAzLDEwMSBAQAogICAgICAgICB9CiAgICAgfQogfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBGVU5DVElPTjogICAgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVAorICoKKyAqIERFU0NSSVBUSU9OOgorICogIE1peGVyIGZ1bmN0aW9uIHdpdGggc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBtdWx0aWNoYW5uZWwgaW5wdXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMgICAgICAgICAgICBTb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBGcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICBOckNoYW5uZWxzKQoreworICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CisKKyAgICBpZiAoTnJGcmFtZXMgPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQorICAgIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+RGVsdGEgPT0gMS4wZikgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQSgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZykgeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPT0gMCkKKyAgICAgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLjAsIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSAhPSAxLjBmKQorICAgICAgICAgICAgICAgIE11bHQzc19GbG9hdChzcmMsIChwSW5zdGFuY2UtPlRhcmdldCksIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHNyYyAhPSBkc3QpCisgICAgICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KSB7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spIChcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworI2VuZGlmCisKICNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKaW5kZXggM2M5MDA3MS4uOGE4OWRlMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCkBAIC0yNiwxMSArMjYsMTEgQEAKICAgIEZVTkNUSU9OIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICAgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKQordm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKQogewogICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKQEAgLTY3LDYgKzY3LDcwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIHNyYzIsIGRzdCwgbik7CiAgICAgfQogfQorCisjaWZkZWYgU1VQUE9SVF9NQworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVAorICoKKyAqIERFU0NSSVBUSU9OOgorICogIDIgc3RyZWFtIE1peGVyIGZ1bmN0aW9uIHdpdGggc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBtdWx0aWNoYW5uZWwgaW5wdXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMxICAgICAgICAgICBGaXJzdCBtdWx0aWNoYW5uZWwgc291cmNlCisgKiAgc3JjMiAgICAgICAgICAgU2Vjb25kIG11bHRpY2hhbm5lbCBzb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX01peFNvZnRfMk1jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckNoYW5uZWxzKQoreworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uUHJpdmF0ZVBhcmFtcyk7CisKKyAgICBpZiAoTnJGcmFtZXMgPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgPT0gcEluc3RhbmNlMS0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMS0+Q3VycmVudCA9PSAwKSkgeworICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHBJbnN0YW5jZTItPkN1cnJlbnQgPT0gcEluc3RhbmNlMi0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMi0+Q3VycmVudCA9PSAwKSkgeworICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgIT0gcEluc3RhbmNlMS0+VGFyZ2V0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlMi0+Q3VycmVudCAhPSBwSW5zdGFuY2UyLT5UYXJnZXQpKQorICAgIHsKKyAgICAgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICAgICAgTFZDX01peEluU29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgIH0KKyAgICBlbHNleworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgIEhBUkQgTUlYSU5HCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIHNyYzIsIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICB9Cit9CisjZW5kaWYKKwogI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9JTlQxNiAgICAgICAqc3JjMSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKaW5kZXggZjkwNDkxNS4uN2YxODc0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKQEAgLTE1NywxMCArMTU3LDE4IEBACiAvKioqIDE2IGJpdCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7Cit2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckNoYW5uZWxzKTsKKyNlbmRpZgorCiAjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLApAQCAtMTY5LDEwICsxNzcsMTggQEAKICNlbmRpZgogCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7Cit2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgbik7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCisKICNlbHNlCiB2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLApAQCAtMTgxLDExICsxOTcsMTkgQEAKICNlbmRpZgogCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsICAvKiBkc3QgY2Fubm90IGJlIGVxdWFsIHRvIHNyYzIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsKK3ZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbik7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgLyogZHN0IGNhbm5vdCBiZSBlcXVhbCB0byBzcmMyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjMSwKQEAgLTIwMCwxMCArMjI0LDEwIEBACiAvKiBHYWluIHZhbHVlcyBzaG91bGQgbm90IGJlIG1vcmUgdGhhdCAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3RfRkxPQVRfc3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpkc3QsICAgLyogZHN0IGNhbiBiZSBlcXVhbCB0byBzcmMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgbik7ICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KK3ZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbik7ICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KICNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3Rfc3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9JTlQxNiAgICAgICAgICAgKnNyYywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYwppbmRleCBjNjc0NTVhLi41MDdlZWZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jCkBAIC0zNSw3ICszNSw3IEBACiB7CiAgICAgTFZNX0ZMT0FUICAgICAgIFRhcmdldEdhaW47CiAgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOwotICAgIAorCiAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAgLy8gVGFyZ2V0R2FpbgogICAgIHJldHVybiBUYXJnZXRHYWluOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmgKaW5kZXggZDBkMGUxZi4uZjEwMDk0YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oCkBAIC02Miw2ICs2MiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19Db3JlX01peEluU29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKQEAgLTczLDYgKzgwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF9NY19EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCBMVk1peGVyM19zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRpbWVDb25zdGFudC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRpbWVDb25zdGFudC5jCmluZGV4IDQ4ZjVkNTQuLjlkM2VlODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMKQEAgLTUxLDcgKzUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzKQogewogI2lmZGVmIEhJR0hFUl9GUwotICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbMTFdID0gezAuNTAwMDAwZiwvKjgwMDAqLworICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbMTNdID0gezAuNTAwMDAwZiwvKjgwMDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzYyODEyZiwvKjExMDI1Ki8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMzMzM2YsLyoxMjAwMCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLC8qMTYwMDAqLwpAQCAtNjAsNyArNjAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTI1MDAwZiwvKjMyMDAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA5MDcwM2YsLyo0NDEwMCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODMzMzNmLC8qNDgwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQ1MzUyZiwvKjg4MjAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA0MTY2N2YsLyo5NjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjI2NzZmLC8qMTc2NDAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMDgzM2Z9Oy8qMTkyMDAwKi8KICNlbHNlCiAgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVs5XSA9IHswLjUwMDAwMGYsLyo4MDAwKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYwppbmRleCA5ZGM3ZDIxLi4wZTBhY2YxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jCkBAIC01Miw3ICs1Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpCiB7CiAjaWZkZWYgSElHSEVSX0ZTCi0gICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbMTFdID0gezAuNTAwMDAwZiwvKjgwMDAqLworICAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzEzXSA9IHswLjUwMDAwMGYsLyo4MDAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjI4MTJmLC8qMTEwMjUqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMzMzM2YsLyoxMjAwMCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjUwMDAwZiwvKjE2MDAwKi8KQEAgLTYxLDcgKzYxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLC8qMzIwMDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA5MDcwM2YsLyo0NDEwMCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDgzMzMzZiwvKjQ4MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDUzNTJmLC8qODgyMDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA0MTY2NmYsLyo5NjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIyNjc2ZiwvKjE3NjQwMCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIwODMzZn07LyoxOTIwMDAqLwogI2Vsc2UKICAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzldID0gezAuNTAwMDAwZiwvKjgwMDAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0dldE9tZWdhLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuYwppbmRleCA3ODQ2Y2EwLi42MzA3ZTY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuYwpAQCAtNTMsNyArNTMsOSBAQAogI2RlZmluZSBMVlZETF8yUGlCeV80ODAwMF9mICAgICAgIDAuMDAwMTMwOTAwZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIExWVkRMXzJQaUJ5Xzg4MjAwX2YgICAgICAgMC4wMDAwNzEyMzhmCiAjZGVmaW5lIExWVkRMXzJQaUJ5Xzk2MDAwX2YgICAgICAgMC4wMDAwNjU0NTBmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzE3NjQwMF9mICAgICAgMC4wMDAwMzU2MTlmCiAjZGVmaW5lIExWVkRMXzJQaUJ5XzE5MjAwMF9mICAgICAgMC4wMDAwMzI3MjVmCiAjZW5kaWYKIGNvbnN0IExWTV9GTE9BVCAgICAgTFZWRExfMlBpT25Gc1RhYmxlW10gPSAge0xWVkRMXzJQaUJ5XzgwMDBfZiwKQEAgLTY2LDcgKzY4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzQ0MTAwX2YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV80ODAwMF9mCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVlZETF8yUGlCeV84ODIwMF9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVlZETF8yUGlCeV85NjAwMF9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVlZETF8yUGlCeV8xNzY0MDBfZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZWRExfMlBpQnlfMTkyMDAwX2YKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYwppbmRleCA5YzE3YTA1Li42YzhiMmRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMKQEAgLTExOSw2ICsxMTksODAgQEAKICAgICAgICAgfQogCiAgICAgfQorCisjaWZkZWYgU1VQUE9SVF9NQworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERUxBWVMtCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gdG8KK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzIC0gMV0gaXMgeChuLTEpIGZvciBhbGwgTnJDaGFubmVscworCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVsc10gdG8KK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1syKk5yQ2hhbm5lbHMgLSAxXSBpcyB4KG4tMikgZm9yIGFsbCBOckNoYW5uZWxzCisKK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1syKk5yQ2hhbm5lbHNdIHRvCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMypOckNoYW5uZWxzIC0gMV0gaXMgeShuLTEpIGZvciBhbGwgTnJDaGFubmVscworCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMypOckNoYW5uZWxzXSB0bworcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzQqTnJDaGFubmVscyAtIDFdIGlzIHkobi0yKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBQS19NY19EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUIHluLCB5bk8sIHRlbXA7CisgICAgICAgIExWTV9JTlQxNiBpaSwgamo7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRmxvYXQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRmxvYXQpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisgICAgICAgICAgICBmb3IgKGpqID0gMDsgamogPCBOckNoYW5uZWxzOyBqaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBqaiBDSEFOTkVMCisgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8qIHluPSAoQTAgICogKHgobikgLSB4KG4tMikpKSovCisgICAgICAgICAgICAgICAgdGVtcCA9ICgqcERhdGFJbikgLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyArIGpqXTsKKyAgICAgICAgICAgICAgICB5biA9IHRlbXAgKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdOworCisgICAgICAgICAgICAgICAgLyogeW4rPSAoKC1CMiAgKiB5KG4tMikpKSAqLworICAgICAgICAgICAgICAgIHRlbXAgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyozICsgampdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXTsKKyAgICAgICAgICAgICAgICB5biArPSB0ZW1wOworCisgICAgICAgICAgICAgICAgLyogeW4rPSAoKC1CMSAqIHkobi0xKSkpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzKjIgKyBqal0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAvKiB5bk89ICgoR2FpbiAqIHluKSkgKi8KKyAgICAgICAgICAgICAgICB5bk8gPSB5biAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKyAgICAgICAgICAgICAgICAvKiB5bk89KHluTyArIHgobikpKi8KKyAgICAgICAgICAgICAgICB5bk8gKz0gKCpwRGF0YUluKTsKKworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMyArIGpqXSA9CisgICAgICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMiArIGpqXTsgLyogeShuLTIpPXkobi0xKSovCisgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAxICsgampdID0KKyAgICAgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW2pqXTsgLyogeChuLTIpPXgobi0xKSovCisgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAyICsgampdID0geW47IC8qIFVwZGF0ZSB5KG4tMSkgKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKSovCisgICAgICAgICAgICAgICAgcERhdGFJbisrOworCisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAqcERhdGFPdXQgPSB5bk87IC8qIFdyaXRlIG91dHB1dCovCisgICAgICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorI2VuZGlmCiAjZWxzZQogdm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhSW4sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaAppbmRleCA4ZTBiNzM4Li4zODVkYmNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmgKQEAgLTIwMSw4ICsyMDEsMTAgQEAKICNkZWZpbmUgTFZFUU5CX0NBUF9GU180NDEwMCAgICAgICAgICAgICAgICAxMjgKICNkZWZpbmUgTFZFUU5CX0NBUF9GU180ODAwMCAgICAgICAgICAgICAgICAyNTYKICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSNkZWZpbmUgTFZFUU5CX0NBUF9GU185NjAwMCAgICAgICAgICAgICAgICA1MTIKLSNkZWZpbmUgTFZFUU5CX0NBUF9GU18xOTIwMDAgICAgICAgICAgICAgICAxMDI0CisjZGVmaW5lIExWRVFOQl9DQVBfRlNfODgyMDAgICAgICAgICAgICAgICAgNTEyCisjZGVmaW5lIExWRVFOQl9DQVBfRlNfOTYwMDAgICAgICAgICAgICAgICAgMTAyNAorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzE3NjQwMCAgICAgICAgICAgICAgIDIwNDgKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU18xOTIwMDAgICAgICAgICAgICAgICA0MDk2CiAjZW5kaWYKIAogdHlwZWRlZiBlbnVtCkBAIC0yMTcsOCArMjE5LDEwIEBACiAgICAgTFZFUU5CX0ZTXzQ0MTAwID0gNywKICAgICBMVkVRTkJfRlNfNDgwMDAgPSA4LAogI2lmZGVmIEhJR0hFUl9GUwotICAgIExWRVFOQl9GU185NjAwMCA9IDksCi0gICAgTFZFUU5CX0ZTXzE5MjAwMCA9IDEwLAorICAgIExWRVFOQl9GU184ODIwMCA9IDksCisgICAgTFZFUU5CX0ZTXzk2MDAwID0gMTAsCisgICAgTFZFUU5CX0ZTXzE3NjQwMCA9IDExLAorICAgIExWRVFOQl9GU18xOTIwMDAgPSAxMiwKICNlbmRpZgogICAgIExWRVFOQl9GU19NQVggICA9IExWTV9NQVhJTlRfMzIKIH0gTFZFUU5CX0ZzX2VuOwpAQCAtMjY3LDcgKzI3MSw5IEBACiAgICAgLyogRXF1YWxpc2VyIHBhcmFtZXRlcnMgKi8KICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTkJhbmRzOyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJhbmRzICovCiAgICAgTFZFUU5CX0JhbmREZWZfdCAgICAgICAgICAgICpwQmFuZERlZmluaXRpb247ICAgICAgIC8qIFBvaW50ZXIgdG8gZXF1YWxpc2VyIGRlZmluaXRpb25zICovCi0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHM7CisjZW5kaWYKIH0gTFZFUU5CX1BhcmFtc190OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmgKaW5kZXggNDJlYTQ2Zi4uNzU1MTQxZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmgKQEAgLTEwOSw3ICsxMDksOSBAQAogI2RlZmluZSBMVkVRTkJfMlBpT25fNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAxMzFmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzg4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDcxZgogI2RlZmluZSBMVkVRTkJfMlBpT25fOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwNjVmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8xNzY0MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAzNmYKICNkZWZpbmUgTFZFUU5CXzJQaU9uXzE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDMzZgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaAppbmRleCA1NmIwMmUwLi5hOWNkNWZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCkBAIC00Niw3ICs0NiwxMiBAQAogI2RlZmluZSBMVkVRTkJfSU5TVEFOQ0VfQUxJR04gICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBpbnN0YW5jZSBzdHJ1Y3R1cmVzICovCiAjZGVmaW5lIExWRVFOQl9EQVRBX0FMSUdOICAgICAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIHN0cnVjdHVyZXMgKi8KICNkZWZpbmUgTFZFUU5CX0NPRUZfQUxJR04gICAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyB3b3JkcyAqLworI2lmZGVmIFNVUFBPUlRfTUMKKy8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KKyNkZWZpbmUgTFZFUU5CX1NDUkFUQ0hCVUZGRVJTICAgICAgIChMVk1fTUFYX0NIQU5ORUxTICogMikKKyNlbHNlCiAjZGVmaW5lIExWRVFOQl9TQ1JBVENIQlVGRkVSUyAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KKyNlbmRpZgogI2RlZmluZSBMVkVRTkJfU0NSQVRDSF9BTElHTiAgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBsb25nIGRhdGEgKi8KIAogI2RlZmluZSBMVkVRTkJfQllQQVNTX01JWEVSX1RDICAgICAgMTAwICAgICAgICAgICAgICAgICAvKiBCeXBhc3MgTWl4ZXIgVEMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYwppbmRleCA2MzI4MTgxLi5kMTg4YzBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgogI2luY2x1ZGUgIkJJUVVBRC5oIgogCisjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjEsMTQgKzYyLDE4IEBACiBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Qcm9jZXNzKExWRVFOQl9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpCi17Ci0KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgIGk7Ci0gICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAqcEJpcXVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX1VJTlQxNiAgICAgIE5yRnJhbWVzKQoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVkIHRvIHVzZSBzYW1wbGVzID0gZnJhbWVzICogY2hhbm5lbHMuCiAgICAgTFZFUU5CX0luc3RhbmNlX3QgICAqcEluc3RhbmNlID0gKExWRVFOQl9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICpwU2NyYXRjaDsKIAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAvLyBNb25vIHBhc3NlZCBpbiBhcyBzdGVyZW8KKyAgICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMgPT0gMQorICAgICAgICA/IDIgOiBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOworI2Vsc2UKKyAgICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9IDI7IC8vIEZDQ18yCisjZW5kaWYKKyAgICBjb25zdCBMVk1fSU5UMzIgTnJTYW1wbGVzID0gTnJDaGFubmVscyAqIE5yRnJhbWVzOwogCiAgICAgIC8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzICovCiAgICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBJbkRhdGEgPT0gTFZNX05VTEwpIHx8IChwT3V0RGF0YSA9PSBMVk1fTlVMTCkpCkBAIC04MiwxNCArODcsMTQgQEAKICAgICAgICAgcmV0dXJuIExWRVFOQl9BTElHTk1FTlRFUlJPUjsKICAgICB9CiAKLSAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5wRmFzdFRlbXBvcmFyeTsKKyAgICBMVk1fRkxPQVQgKiBjb25zdCBwU2NyYXRjaCA9IChMVk1fRkxPQVQgKilwSW5zdGFuY2UtPnBGYXN0VGVtcG9yYXJ5OwogCiAgICAgLyoKLSAgICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCisgICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIGZyYW1lcyBpcyBub3QgdG9vIGxhcmdlCiAgICAgKi8KLSAgICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKKyAgICBpZiAoTnJGcmFtZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCiAgICAgewotICAgICAgICByZXR1cm4oTFZFUU5CX1RPT01BTllTQU1QTEVTKTsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9UT09NQU5ZU0FNUExFUzsKICAgICB9CiAKICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkVRTkJfT04pCkBAIC05NywxNiArMTAyLDE2IEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIENvcHkgaW5wdXQgZGF0YSBpbiB0byBzY3JhdGNoIGJ1ZmZlcgogICAgICAgICAgKi8KKyAgICAgICAgQ29weV9GbG9hdChwSW5EYXRhLCAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOwogCi0gICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCBSaWdodCAqLwogICAgICAgICAvKgogICAgICAgICAgKiBGb3IgZWFjaCBzZWN0aW9uIGV4ZWN0ZSB0aGUgZmlsdGVyIHVubGVzcyB0aGUgZ2FpbiBpcyAwZEIKICAgICAgICAgICovCiAgICAgICAgIGlmIChwSW5zdGFuY2UtPk5CYW5kcyAhPSAwKQogICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEluc3RhbmNlLT5OQmFuZHM7IGkrKykKKyAgICAgICAgICAgIGZvciAoTFZNX1VJTlQxNiBpID0gMDsgaSA8IHBJbnN0YW5jZS0+TkJhbmRzOyBpKyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBDaGVjayBpZiBiYW5kIGlzIG5vbi16ZXJvIGRCIGdhaW4KQEAgLTExNiw3ICsxMjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGJpcXVhZCBpbnN0YW5jZQogICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcEJpcXVhZCA9ICZwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0W2ldOworICAgICAgICAgICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAqcEJpcXVhZCA9ICZwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0W2ldOwogCiAKICAgICAgICAgICAgICAgICAgICAgLyoKQEAgLTEyNiwxMCArMTMxLDE4IEBACiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdDoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfTWNfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEocEJpcXVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxKHBCaXF1YWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMpOworI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtMTQxLDE5ICsxNTQsMjkgQEAKIAogCiAgICAgICAgIGlmKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPT0gTFZNX1RSVUUpeworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyNlbHNlCiAgICAgICAgICAgICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsKLSAgICAgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCopcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgUmlnaHQgc2FtcGxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7CisjZW5kaWYKKyAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSB3aXRoIGVsc2UgY2xhdXNlKHMpCisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsgICAgICAgICAgICAvKiBBbGwgY2hhbm5lbCBzYW1wbGVzICovCiAgICAgICAgIH0KICAgICAgICAgZWxzZXsKICAgICAgICAgICAgIENvcHlfRmxvYXQocFNjcmF0Y2gsICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICkoMiAqIE51bVNhbXBsZXMpKTsgLyogTGVmdCBhbmQgUmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOyAvKiBBbGwgY2hhbm5lbCBzYW1wbGVzICovCiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZQpAQCAtMTYzLDEyICsxODYsMTIgQEAKICAgICAgICAgICovCiAgICAgICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKQogICAgICAgICB7Ci0gICAgICAgICAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgIC8qIExlZnQgYW5kIFJpZ2h0IHNhbXBsZXMgKi8KKyAgICAgICAgICAgIENvcHlfRmxvYXQocEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOyAgICAgICAgICAgIC8qIEFsbCBjaGFubmVsIHNhbXBsZXMgKi8KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOworICAgIHJldHVybiBMVkVRTkJfU1VDQ0VTUzsKIAogfQogI2Vsc2UKQEAgLTMxMiw0ICszMzUsNCBAQAogICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7CiAKIH0KLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYwppbmRleCA1NjMxODFjLi40NTNjNDJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYwpAQCAtNDYsNyArNDYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3NjQwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTIwMDAKIH07CiAjZWxzZQpAQCAtODIsNyArODQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fNDQxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl80ODAwMAogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVkVRTkJfMlBpT25fODgyMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZFUU5CXzJQaU9uXzk2MDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWRVFOQl8yUGlPbl8xNzY0MDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZFUU5CXzJQaU9uXzE5MjAwMAogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CkBAIC0yNDksMzAgKzI1Myw0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjU4NiwgICAgICAgICAgICAgICAgICAgICAgIC8qIGEyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDR9OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEzICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5cGFzcyBtaXhlciB0aW1lIGNvbnN0YW50cyAoMTAwbXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnM4MDAwICAgIDMyNTgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTQyNjI2OTUgKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczExMDI1ICAgMzI2MzIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NTg0OTYwOSAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMTIwMDAgICAzMjY0MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk2MTg1MzAzICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnMxNjAwMCAgIDMyNjc0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTcxMzEzNDggKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczIyMDUwICAgMzI3MDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzkyNDgwNSAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMjQwMDAgICAzMjcwNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4MDc3MzkzICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnMzMjAwMCAgIDMyNzIxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg1NjU2NzQgKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczQ0MTAwICAgMzI3MzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODk2MjQwMiAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzNDgwMDAgICAzMjczNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5MDUzOTU1ICovCi0KLQotY29uc3QgTFZNX0lOVDE2IExWRVFOQl9NaXhlclRDVGFibGVbXSA9IHsKLSAgICBMVkVRTkJfTUlYX1RDX0ZzODAwMCwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzMTEwMjUsCi0gICAgTFZFUU5CX01JWF9UQ19GczEyMDAwLAotICAgIExWRVFOQl9NSVhfVENfRnMxNjAwMCwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzMjIwNTAsCi0gICAgTFZFUU5CX01JWF9UQ19GczI0MDAwLAotICAgIExWRVFOQl9NSVhfVENfRnMzMjAwMCwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzNDQxMDAsCi0gICAgTFZFUU5CX01JWF9UQ19GczQ4MDAwfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaAppbmRleCBmZjc0NzVlLi5jOTE1YWMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oCkBAIC0xMjMsNyArMTIzLDcgQEAKICNpZm5kZWYgSElHSEVSX0ZTCiAjZGVmaW5lIExWUkVWX05VTV9GUyAgICAgICAgICAgICAgICAgICAgICAgIDkgICAgICAgICAgIC8qIE51bWJlciBvZiBzdXBwb3J0ZWQgc2FtcGxlIHJhdGVzICovCiAjZWxzZQotI2RlZmluZSBMVlJFVl9OVU1fRlMgICAgICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIHNhbXBsZSByYXRlcyAqLworI2RlZmluZSBMVlJFVl9OVU1fRlMgICAgICAgICAgICAgICAgICAgICAgIDEzICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIHNhbXBsZSByYXRlcyAqLwogI2VuZGlmCiAKICNkZWZpbmUgTFZSRVZfTUFYQkxLU0laRV9MSU1JVCAgICAgICAgICAgICA2NCAgICAgICAgICAgLyogTWF4aW11bSBibG9jayBzaXplIGxvdyBsaW1pdCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jCmluZGV4IDU2NmQ4NGYuLjFkMTI4M2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMKQEAgLTU3OSw3ICs1NzksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0gICAgCisKICAgICAvKgogICAgICAqICBQcm9jZXNzIGFsbCBkZWxheSBsaW5lcwogICAgICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmMKaW5kZXggYTcxOTA1My4uZGZlZDI4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jCkBAIC02NCwxMiArNjQsMjIgQEAKICAgICAgICAgKAogICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCiAgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzIyMDUwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjQwMDApICAgICAgICYmCi0gICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApICAgICAgCisgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYKKyAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJgorICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApCiAjaWZkZWYgSElHSEVSX0ZTCi0gICAgICAgICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU185NjAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE5MjAwMCkKKyAgICAgICAgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzg4MjAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfOTYwMDApCisgICAgICAgICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNzY0MDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xOTIwMDApCiAjZW5kaWYKICAgICAgICAgKQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgfHwgKChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX1NURVJFTykgICAgICAgJiYKKyAgICAgICAgICAgIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYKKyAgICAgICAgICAgIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pICAgICAgICAgJiYKKyAgICAgICAgICAgIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01VTFRJQ0hBTk5FTCkpKQorI2Vsc2UKICAgICAgICAgfHwgKChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX1NURVJFTykgJiYgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJiAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSkgKQorI2VuZGlmCiAgICAgewogICAgICAgICByZXR1cm4gKExWUkVWX09VVE9GUkFOR0UpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMKaW5kZXggYjNlZGM2MC4uMTA1ODc0MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMKQEAgLTUyLDcgKzUyLDkgQEAKICAgICAzMjAwMCwKICAgICA0NDEwMCwKICAgICA0ODAwMCwKKyAgICA4ODIwMCwKICAgICA5NjAwMCwKKyAgICAxNzY0MDAsCiAgICAgMTkyMDAwCiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaAppbmRleCBhNzUwYmIwLi5lZTA3ZTJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmgKQEAgLTQ2LDcgKzQ2LDcgQEAKICNpZm5kZWYgSElHSEVSX0ZTCiAjZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFICAgICAgICAgIDkgICAgICAvKiBGcm9tIDgwMDBIeiB0byA0ODAwMEh6Ki8KICNlbHNlCi0jZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFICAgICAgICAgIDExICAgICAgLyogRnJvbSA4MDAwSHogdG8gMTkyMDAwSHoqLworI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfUkFURSAgICAgICAgICAxMyAgICAgIC8qIEZyb20gODAwMEh6IHRvIDE5MjAwMEh6Ki8KICNlbmRpZgogI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfU1BFRUQgICAgICAgICAzICAgICAgLyogTE9XLCBNRURJVU0sIEhJR0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMKaW5kZXggMTI4NzUwMy4uZjhhZjQ5NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYwpAQCAtNTQsNyArNTQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc2NDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTIwMDB9OyAgICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgKi8KICNlbmRpZgogCkBAIC03OCw3ICs4MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDg2OTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQ3MzkKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMjQzNDgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMjIzNjkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTIxNzQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTExODUgICAgICAgICAgICAgICAgICAvKiAxOTJrUy9zICovCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKQEAgLTEwNSw3ICsxMDksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ODIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MAogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTc2NAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTkyMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMzUyOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMzg0MCAgICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgKi8KICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CkBAIC0xMjgsNyArMTM0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsICAgICAgICAgICAgICAgICAgIC8qIDQ0MTAwIFMvcyAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICAgIC8qIDQ4MDAwIFMvcyAgKi8KICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsNjAgICAgICAgICAgICAgICAgICAgLyogODgyMDAgUy9zICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICw2NCAgICAgICAgICAgICAgICAgICAvKiA5NjAwMCBTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEyMCAgICAgICAgICAgICAgICAgIC8qIDE3NjQwMCBTL3MgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEyOCAgICAgICAgICAgICAgICAgIC8qMTkyMDAwIFMvcyAgKi8KICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwpAQCAtMTUzLDcgKzE2MSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDc4MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MzkyCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMjM5MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDIxOTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMTk1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTA5OCAgICAvKiAxOTJrUy9zICovCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CkBAIC0xNjksNyArMTc5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTQ1OTA4OWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEzNDAzNzJmCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwLjA3Mjk0NzZmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwLjA2NzAxODZmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwLjAzNjQ3MzhmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwLjAzMzUwOTNmICAgIC8qIDE5MmtTL3MgKi8KICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKQEAgLTM1Miw3ICszNjQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzEyNjk2MTg2ODI1NjNmLDAuMDA2NzU5MjY0OTcyMDYwOWZ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMxMjY5NjE4NjgyNTYzZiwwLjAwNjc1OTI2NDk3MjA2MDlmfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLyAgICAvKiBMVlBTQV9TUEVFRF9NRURJVU0gICAgICAqLwpAQCAtMzY4LDcgKzM4Miw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsMC4wNDUzOTk1MjM4MDU4MjY5Zn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1MzEwMTE5MTIwNDA0MTJmLDAuMDQ1Mzk5NTIzODA1ODI2OWZ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLyAgIC8qIExWUFNBX1NQRUVEX0hJR0ggICAgICAqLwpAQCAtMzgzLDcgKzM5OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfQogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx7LTAuNzIyOTcwNjMxOTA0OTAwMWYsMC4yMzg4OTg3MjI0NTQ5MDU1Zn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43MjI5NzA2MzE5MDQ5MDAxZiwwLjIzODg5ODcyMjQ1NDkwNTVmfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0KICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oCmluZGV4IGU3NTY5NWUuLmU1MDdhN2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oCkBAIC0yMDUsNiArMjA1LDkgQEAKICAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICBTYW1wbGVSYXRlOyAgICAgICAgICAgICAvKiBTYW1wbGluZyByYXRlICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgRWZmZWN0TGV2ZWw7ICAgICAgICAgICAgLyogRWZmZWN0IGxldmVsICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgUmV2ZXJiTGV2ZWw7ICAgICAgICAgICAgLyogUmV2ZXJiIGxldmVsIGluICUgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgTnJDaGFubmVsczsKKyNlbmRpZgogfSBMVkNTX1BhcmFtc190OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oCmluZGV4IDBjMmZlNTMuLmJhMDU1NzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaApAQCAtMTUyLDYgKzE1MiwyNCBAQAogI2RlZmluZSBDU19TSURFXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAogCiAjaWZkZWYgSElHSEVSX0ZTCisvKiBDb2VmZmljaWVudHMgZm9yIDg4MjAwSHogc2FtcGxlIHJhdGUuCisgKiBUaGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhcmUgb2J0YWluZWQgYnkgY2Fycnlpbmcgb3V0CisgKiBzdGF0ZS1zcGFjZSBhbmFseXNpcyB1c2luZyB0aGUgY29lZmZpY2llbnRzIGF2YWlsYWJsZQorICogZm9yIDQ0MTAwSHouCisgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMzM4NDZmCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9BMSAgICAgICAgICAgICAgICAgICAgICgtMC4yMzI2NTdmKQorI2RlZmluZSBDU19NSURETEVfODgyMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0IxICAgICAgICAgICAgICAgICAgICAgKC0wLjk5Mjc0N2YpCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBDU19NSURETEVfODgyMDBfU0NBTEUgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjIzMTU0MWYKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI4OTU4NmYpCisjZGVmaW5lIENTX1NJREVfODgyMDBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuMDU4MDQ1ZgorI2RlZmluZSBDU19TSURFXzg4MjAwX0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuNzY1MzAwZikKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC43Njk4MTZmCisjZGVmaW5lIENTX1NJREVfODgyMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgIDE0CisKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDk2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoICAwLjE2NSovCiAvKiBoaWdoIHBhc3MgZmlsdGVyIHdpdGggY3V0b2ZmIGZyZXF1ZW5jeSAxMDIuMTggSHoqLwogI2RlZmluZSBDU19NSURETEVfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzNTUzMgpAQCAtMTYwLDEzICsxNzgsMzMgQEAKICNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTAuOTkzMzM0KQogI2RlZmluZSBDU19NSURETEVfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBDU19NSURETEVfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQotLyogYmFuZHBhc3MgZmlsdGVyIHdpdGggZmMxIDI3MCBhbmQgZmMyIDM3MDMsIGRlc2lnbmVkIHVzaW5nIDJuZCBvcmRlciBidXR0ZXJ3b3J0aCAqLwotI2RlZmluZSBDU19TSURFXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4wMTY3MjcKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1NJREVfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMTY3MjcpCi0jZGVmaW5lIENTX1NJREVfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMS43OTMzNzIpCi0jZGVmaW5lIENTX1NJREVfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjc5NzIzNgotI2RlZmluZSBDU19TSURFXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKKy8qIENvZWZmaWNpZW50cyBjYWxjdWxhdGVkIHVzaW5nIHRmMnNzIGFuZCBzczJ0ZiBmdW5jdGlvbnMgYmFzZWQgb24KKyAqIGNvZWZmaWNpZW50cyBhdmFpbGFibGUgZm9yIDQ4MDAwSHogc2FtcGxpbmcgZnJlcXVlbmN5CisgKi8KKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjI0MzI2ZgorI2RlZmluZSBDU19TSURFXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgKC0wLjI5NDkzN2YpCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjA3MDYxMWYKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS43OTIxNjZmKQorI2RlZmluZSBDU19TSURFXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC43OTU4MzBmCisjZGVmaW5lIENTX1NJREVfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAxNAorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxNzY0MDBIeiBzYW1wbGUgcmF0ZS4KKyAqIFRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFyZSBvYnRhaW5lZCBieSBjYXJyeWluZyBvdXQKKyAqIHN0YXRlLXNwYWNlIGFuYWx5c2lzIHVzaW5nIHRoZSBjb2VmZmljaWVudHMgYXZhaWxhYmxlCisgKiBmb3IgNDQxMDBIei4KKyAqLworI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMzM5NzNmCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAgICAoLTAuMjMzMzc4ZikKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgICAgKC0wLjk5NjM2N2YpCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9TQ0FMRSAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfMTc2NDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE5OTgzNmYKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMC4zMDc1NDRmKQorI2RlZmluZSBDU19TSURFXzE3NjQwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC4xMDc3MDhmCisjZGVmaW5lIENTX1NJREVfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuODc2NTcyZikKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuODc3NzcxZgorI2RlZmluZSBDU19TSURFXzE3NjQwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMTQKIAogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTkyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoICAwLjE2ODkqLwogI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yNDEyMTkKQEAgLTE3NSwxMyArMjEzLDE1IEBACiAjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMC45OTY2NjEpCiAjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBDU19NSURETEVfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKLS8qIGJhbmRwYXNzIGZpbHRlciB3aXRoIGZjMSAyNzAgYW5kIGZjMiAzNzAzLCBkZXNpZ25lZCB1c2luZyAybmQgb3JkZXIgYnV0dGVyd29ydGggKi8KLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwODk5MQotI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMDg5OTEpCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTEuODkyNTA5KQotI2RlZmluZSBDU19TSURFXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuODkzNTI0Ci0jZGVmaW5lIENTX1NJREVfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAxNAorLyogQ29lZmZpY2llbnRzIGNhbGN1bGF0ZWQgdXNpbmcgdGYyc3MgYW5kIHNzMnRmIGZ1bmN0aW9ucyBiYXNlZCBvbgorICogY29lZmZpY2llbnRzIGF2YWlsYWJsZSBmb3IgNDgwMDBIeiBzYW1wbGluZyBmcmVxdWVuY3kKKyAqLworI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgMC4xOTYwMzlmCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICAoLTAuMzExMDI3ZikKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAgIDAuMTE0OTg4ZgorI2RlZmluZSBDU19TSURFXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjg5MTM4MGYpCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAwLjg5MjM0NjBmCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAxNAogI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xOTksNyArMjM5LDEyIEBACiAjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjRLSFogICAgICAgICAgICAgICAgICAgMjc5ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMjRrUy9zICovCiAjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMzJLSFogICAgICAgICAgICAgICAgICAgMzcyICAgICAgICAgLyogU2FtcGxlIHJhdGUgMzJrUy9zICovCiAjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDRLSFogICAgICAgICAgICAgICAgICAgNTEyICAgICAgICAgLyogU2FtcGxlIHJhdGUgNDRrUy9zICovCi0jZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFogICAgICAgICAgICAgICAgICAgNTEyICAgICAgICAgLyogU2FtcGxlIHJhdGUgNDhrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFogICAgICAgICAgICAgICAgICAgNTU3ICAgICAgICAgLyogU2FtcGxlIHJhdGUgNDhrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfODhLSFogICAgICAgICAgICAgICAgICAgMTAyNCAgICAgICAgLyogU2FtcGxlIHJhdGUgODguMmtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU185NktIWiAgICAgICAgICAgICAgICAgICAxMTE1ICAgICAgICAvKiBTYW1wbGUgcmF0ZSA5NmtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18xNzZLSFogICAgICAgICAgICAgICAgICAyMDQ4ICAgICAgICAvKiBTYW1wbGUgcmF0ZSAxNzYuNGtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18xOTJLSFogICAgICAgICAgICAgICAgICAyMjI5ICAgICAgICAvKiBTYW1wbGUgcmF0ZSAxOTZrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfTUFYX1ZBTCAgICAgICAgICAgICAgICAgTFZDU19TVEVSRU9ERUxBWV9DU18xOTJLSFoKIAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgODAwMCBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KICNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNjY3MjcxCkBAIC0yNzUsNiArMzIwLDE0IEBACiAjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CiAKICNpZmRlZiBISUdIRVJfRlMKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDg4MjAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuOCAqLworLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwICovCisjZGVmaW5lIENTX1JFVkVSQl84ODIwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4xNzE5MDFmCisjZGVmaW5lIENTX1JFVkVSQl84ODIwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIENTX1JFVkVSQl84ODIwMF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMTcxOTAxZikKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS41NTM5NDhmKQorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfQjIgICAgICAgICAgICAgICAgICAgICAgKDAuNTcwMjQ4ZikKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgIDE0CiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA5NjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjggKi8KIC8qIEJhbmQgcGFzcyBmaWx0ZXIgd2l0aCBmYzE9NTAwIGFuZCBmYzI9ODAwMCovCiAjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4xNjAyNDg4CkBAIC0yODQsNiArMzM3LDE0IEBACiAjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC41OTkzNzcKICNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKIAorLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMTc2NDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuOCAqLworLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwICovCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDk0NzYzZgorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDk0NzYzZikKKyNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuNzU4NTkzZikKKyNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9CMiAgICAgICAgICAgICAgICAgICAgICAoMC43NjMwOTFmKQorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgIDE0CiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxOTIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC44ICovCiAvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAqLwogI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjA4NzgzNjkKQEAgLTQ0Niw2ICs1MDcsMjQgQEAKIAogCiAjaWZkZWYgSElHSEVSX0ZTCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciA4ODIwMEh6IHNhbXBsZSByYXRlLgorICogVGhlIGZpbHRlciBjb2VmZmljaWVudHMgYXJlIG9idGFpbmVkIGJ5IGNhcnJ5aW5nIG91dAorICogc3RhdGUtc3BhY2UgYW5hbHlzaXMgdXNpbmcgdGhlIGNvZWZmaWNpZW50cyBhdmFpbGFibGUKKyAqIGZvciA0NDEwMEh6LgorICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9BMCAgICAgICAgICAgICAgICAgICAxLjc3MTg5OWYKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0ExICAgICAgICAgICAgICAgICAgICgtMi45MzA3NjJmKQorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQTIgICAgICAgICAgICAgICAgICAgMS4xNzIxNzVmCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9CMSAgICAgICAgICAgICAgICAgICAoLTEuNDM4MzQ5ZikKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0IyICAgICAgICAgICAgICAgICAgIDAuNDQyNTIwZgorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfU0NBTEUgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTAgICAgICAgICAgICAgICAgIDIuNjc1MjQxZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMSAgICAgICAgICAgICAgICAgKC00LjQ2NjE1NGYpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0EyICAgICAgICAgICAgICAgICAxLjgxMDMwNWYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfQjEgICAgICAgICAgICAgICAgICgtMC45MjUzNTBmKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMiAgICAgICAgICAgICAgICAgKC0wLjA2NjYxNmYpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX1NDQUxFICAgICAgICAgICAgICAxMworCiAjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgMS43ODQ0OTcKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICgtMy4wMDE0MzUpCiAjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgMS4yMjg0MjIKQEAgLTQ1OCw2ICs1MzcsMjMgQEAKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjEgICAgICAgICAgICAgICAgICgtMC45NzE3MTgpCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IyICAgICAgICAgICAgICAgICAoLTAuMDIxMjE2KQogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMTc2NDAwSHogc2FtcGxlIHJhdGUuCisgKiBUaGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhcmUgb2J0YWluZWQgYnkgY2Fycnlpbmcgb3V0CisgKiBzdGF0ZS1zcGFjZSBhbmFseXNpcyB1c2luZyB0aGUgY29lZmZpY2llbnRzIGF2YWlsYWJsZQorICogZm9yIDQ0MTAwSHouCisgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAgIDEuODgzNDQwZgorI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0ExICAgICAgICAgICAgICAgICAgKC0zLjQxNDI3MmYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQTIgICAgICAgICAgICAgICAgICAxLjUzNDcwMmYKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9CMSAgICAgICAgICAgICAgICAgICgtMS42NzQ2MTRmKQorI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0IyICAgICAgICAgICAgICAgICAgMC42NzU4MjdmCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTAgICAgICAgICAgICAgICAgMy4zNTUwNjhmCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMSAgICAgICAgICAgICAgICAoLTYuMTEyNTc4ZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0EyICAgICAgICAgICAgICAgIDIuNzY0MTM1ZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQjEgICAgICAgICAgICAgICAgKC0xLjI2ODUzM2YpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMiAgICAgICAgICAgICAgICAwLjI3MTI3N2YKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX1NDQUxFICAgICAgICAgICAgIDEzCiAKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgMS44ODk1ODIKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAoLTMuNDU2MTQwKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKaW5kZXggYTk3ZTRmMC4uYWI4Y2NkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oCkBAIC02MSw2ICs2MSwxNSBAQAogCiAvKiBNZW1vcnkgKi8KICNkZWZpbmUgTFZDU19TQ1JBVENIQlVGRkVSUyAgICAgICAgICAgICAgNiAgICAgIC8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogVGhlIENvbmNlcnQgU3Vycm91bmQgbW9kdWxlIGFwcGxpZXMgcHJvY2Vzc2luZyBvbmx5IG9uIHRoZSBmaXJzdCB0d28KKyAqIGNoYW5uZWxzIG9mIGEgbXVsdGljaGFubmVsIGlucHV0LiBUaGUgZGF0YSBvZiBmaXJzdCB0d28gY2hhbm5lbHMgaXMgY29waWVkCisgKiBmcm9tIHRoZSBtdWx0aWNoYW5uZWwgaW5wdXQgaW50byBzY3JhdGNoIGJ1ZmZlci4gVGhlIGJ1ZmZlcnMgYWRkZWQgaGVyZQorICogYXJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZQorICovCisjZGVmaW5lIExWQ1NfTUNfU0NSQVRDSEJVRkZFUlMgICAgICAgICAgIDIKKyNlbmRpZgogCiAvKiBHZW5lcmFsICovCiAjZGVmaW5lIExWQ1NfSU5WQUxJRCAgICAgICAgICAgICAgICAweEZGRkYgICAgICAvKiBJbnZhbGlkIGluaXQgcGFyYW1ldGVyICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYwppbmRleCAzOTU2ZDRkLi5lZjFkOWViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMKQEAgLTc2LDYgKzc2LDIyIEBACiAgICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFNjcmF0Y2g7CiAgICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gZXJyOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICpwU3RJbjsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIGNoYW5uZWxzID0gcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKKyNkZWZpbmUgTnJGcmFtZXMgTnVtU2FtcGxlcyAgLy8gYWxpYXMgZm9yIGNsYXJpdHkKKworICAgIC8qSW4gY2FzZSBvZiBtb25vIHByb2Nlc3NpbmcsIHN0ZXJlbyBpbnB1dCBpcyBjcmVhdGVkIGZyb20gbW9ubworICAgICAqYW5kIHN0b3JlZCBpbiBwSW5EYXRhIGJlZm9yZSBhcHBseWluZyBhbnkgb2YgdGhlIGVmZmVjdHMuCisgICAgICpIb3dldmVyIHdlIGRvIG5vdCB1cGRhdGUgdGhlIHZhbHVlIHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMKKyAgICAgKmF0IHRoaXMgcG9pbnQuCisgICAgICpTbyB0byB0cmVhdCB0aGUgcEluRGF0YSBhcyBzdGVyZW8gd2UgYXJlIHNldHRpbmcgY2hhbm5lbHMgdG8gMgorICAgICAqLworICAgIGlmIChjaGFubmVscyA9PSAxKQorICAgIHsKKyAgICAgICAgY2hhbm5lbHMgPSAyOworICAgIH0KKyNlbmRpZgogCiAgICAgcFNjcmF0Y2ggID0gKExWTV9GTE9BVCAqKSBcCiAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOwpAQCAtODMsNiArOTksMjUgQEAKICAgICAvKgogICAgICAqIENoZWNrIGlmIHRoZSBwcm9jZXNzaW5nIGlzIGlucGxhY2UKICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgLyoKKyAgICAgKiBUaGUgcElucHV0IGJ1ZmZlciBob2xkcyB0aGUgZmlyc3QgMiAoTGVmdCwgUmlnaHQpIGNoYW5uZWxzIGluZm9ybWF0aW9uLgorICAgICAqIEhlbmNlIHRoZSBtZW1vcnkgcmVxdWlyZWQgYnkgdGhpcyBidWZmZXIgaXMgMiAqIE51bUZyYW1lcy4KKyAgICAgKiBUaGUgQ29uY2VydCBTdXJyb3VuZCBtb2R1bGUgY2FycmllcyBvdXQgcHJvY2Vzc2luZyBvbmx5IG9uIEwsIFIuCisgICAgICovCisgICAgcElucHV0ID0gcFNjcmF0Y2ggKyAoMiAqIE5yRnJhbWVzKTsKKyAgICBwU3RJbiAgPSBwU2NyYXRjaCArIChMVkNTX1NDUkFUQ0hCVUZGRVJTICogTnJGcmFtZXMpOworICAgIC8qIFRoZSBmaXJzdCB0d28gY2hhbm5lbCBkYXRhIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBpbnB1dCBkYXRhIGFuZAorICAgICAqIGNvcGllZCBpbnRvIHBJbnB1dCBidWZmZXIKKyAgICAgKi8KKyAgICBDb3B5X0Zsb2F0X01jX1N0ZXJlbygoTFZNX0ZMT0FUICopcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzKTsKKyAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5wdXQsCisgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFN0SW4sCisgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnJGcmFtZXMpKTsKKyNlbHNlCiAgICAgaWYgKHBJbkRhdGEgPT0gcE91dERhdGEpCiAgICAgewogICAgICAgICAvKiBQcm9jZXNzaW5nIGlucGxhY2UgKi8KQEAgLTk2LDE0ICsxMzEsMjEgQEAKICAgICAgICAgLyogUHJvY2Vzc2luZyBvdXRwbGFjZSAqLwogICAgICAgICBwSW5wdXQgPSBwSW5EYXRhOwogICAgIH0KLQorI2VuZGlmCiAgICAgLyoKICAgICAgKiBDYWxsIHRoZSBzdGVyZW8gZW5oYW5jZXIKICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgZXJyID0gTFZDU19TdGVyZW9FbmhhbmNlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdEluLCAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcyk7ICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZnJhbWVzIHRvIHByb2Nlc3MgKi8KKyNlbHNlCiAgICAgZXJyID0gTFZDU19TdGVyZW9FbmhhbmNlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisjZW5kaWYKIAogICAgIC8qCiAgICAgICogQ2FsbCB0aGUgcmV2ZXJiIGdlbmVyYXRvcgpAQCAtMTEyLDcgKzE1NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLwotICAgIAorCiAgICAgLyoKICAgICAgKiBDYWxsIHRoZSBlcXVhbGlzZXIKICAgICAgKi8KQEAgLTIzOSw3ICsyODEsMTUgQEAKIAogICAgIExWQ1NfSW5zdGFuY2VfdCAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CiAgICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gZXJyOwotCisjaWZkZWYgU1VQUE9SVF9NQworICAgIC8qRXh0cmFjdCBudW1iZXIgb2YgQ2hhbm5lbHMgaW5mbyovCisgICAgTFZNX0lOVDMyIGNoYW5uZWxzID0gcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKKyNkZWZpbmUgTnJGcmFtZXMgTnVtU2FtcGxlcyAgLy8gYWxpYXMgZm9yIGNsYXJpdHkKKyAgICBpZiAoY2hhbm5lbHMgPT0gMSkKKyAgICB7CisgICAgICAgIGNoYW5uZWxzID0gMjsKKyAgICB9CisjZW5kaWYKICAgICAvKgogICAgICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCiAgICAgICovCkBAIC0yNjAsOCArMzEwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKKworCiAgICAgICAgIC8qCiAgICAgICAgICAqIENvbXByZXNzIHRvIHJlZHVjZSBleHBhbnNpb24gZWZmZWN0IG9mIENvbmNlcnQgU291bmQgYW5kIGNvcnJlY3Qgdm9sdW1lCiAgICAgICAgICAqIGRpZmZlcmVuY2VzIGZvciBkaWZmZXJlbmNlIHNldHRpbmdzLiBOb3QgYXBwbGllZCBpbiB0ZXN0IG1vZGVzCkBAIC0zNzYsMTcgKzQyNiwzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIENvcHlfRmxvYXRfU3RlcmVvX01jKHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMpOworI2VuZGlmCiAgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKQogICAgICAgICB7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBhbGdvcml0aG0gaXMgZGlzYWJsZWQgc28ganVzdCBjb3B5IHRoZSBkYXRhCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShjaGFubmVscyAqIE5yRnJhbWVzKSk7ICAgIC8qIEFsbCBDaGFubmVscyovCisjZWxzZQogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFRoZSBhbGdvcml0aG0gaXMgZGlzYWJsZWQgc28ganVzdCBjb3B5IHRoZSBkYXRhCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAgICAgLyogU291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworI2VuZGlmCiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaAppbmRleCA2OTg5MmI2Li5mOTRkNGU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oCkBAIC02NSw3ICs2NSw3IEBACiAgICAgLyogRmlsdGVyICovCiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrKSAoQmlxdWFkX0luc3RhbmNlX3QqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYpOwogI2Vsc2UKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgU3RlcmVvU2FtcGxlc1syICogTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWl07CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgIFN0ZXJlb1NhbXBsZXNbMiAqIExWQ1NfU1RFUkVPREVMQVlfQ1NfTUFYX1ZBTF07CiAgICAgLyogUmV2ZXJiIExldmVsICovCiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgIFJldmVyYkxldmVsOwogICAgIC8qIEZpbHRlciAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jCmluZGV4IGUxNTRlMjkuLmExZmI0OGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMKQEAgLTc0LDEwICs3NCwxOCBAQAogICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzQ4MDAwX1NDQUxFfQogI2lmZGVmIEhJR0hFUl9GUwogICAgICwKKyAgICB7Q1NfTUlERExFXzg4MjAwX0EwLCAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfODgyMDBfQTEsCisgICAgIENTX01JRERMRV84ODIwMF9CMSwKKyAgICAgKExWTV9VSU5UMTYpQ1NfTUlERExFXzg4MjAwX1NDQUxFfSwKICAgICB7Q1NfTUlERExFXzk2MDAwX0EwLCAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19NSURETEVfOTYwMDBfQTEsCiAgICAgIENTX01JRERMRV85NjAwMF9CMSwKICAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV85NjAwMF9TQ0FMRX0sCisgICAge0NTX01JRERMRV8xNzY0MDBfQTAsICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfMTc2NDAwX0ExLAorICAgICBDU19NSURETEVfMTc2NDAwX0IxLAorICAgICAoTFZNX1VJTlQxNilDU19NSURETEVfMTc2NDAwX1NDQUxFfSwKICAgICB7Q1NfTUlERExFXzE5MjAwMF9BMCwgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTX01JRERMRV8xOTIwMDBfQTEsCiAgICAgIENTX01JRERMRV8xOTIwMDBfQjEsCkBAIC0xNDQsMTIgKzE1MiwyNCBAQAogICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV80ODAwMF9TQ0FMRX0KICNpZmRlZiBISUdIRVJfRlMKICAgICAgLAorICAgIHtDU19TSURFXzg4MjAwX0EwLCAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfODgyMDBfQTEsCisgICAgIENTX1NJREVfODgyMDBfQTIsCisgICAgIENTX1NJREVfODgyMDBfQjEsCisgICAgIENTX1NJREVfODgyMDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX1NJREVfODgyMDBfU0NBTEV9LAogICAgICB7Q1NfU0lERV85NjAwMF9BMCwgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19TSURFXzk2MDAwX0ExLAogICAgICBDU19TSURFXzk2MDAwX0EyLAogICAgICBDU19TSURFXzk2MDAwX0IxLAogICAgICBDU19TSURFXzk2MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV85NjAwMF9TQ0FMRX0sCisgICAge0NTX1NJREVfMTc2NDAwX0EwLCAgICAgICAgICAvKjE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfMTc2NDAwX0ExLAorICAgICBDU19TSURFXzE3NjQwMF9BMiwKKyAgICAgQ1NfU0lERV8xNzY0MDBfQjEsCisgICAgIENTX1NJREVfMTc2NDAwX0IyLAorICAgICAoTFZNX1VJTlQxNilDU19TSURFXzE3NjQwMF9TQ0FMRX0sCiAgICAgIHtDU19TSURFXzE5MjAwMF9BMCwgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfU0lERV8xOTIwMDBfQTEsCiAgICAgIENTX1NJREVfMTkyMDAwX0EyLApAQCAtMjIzLDEyICsyNDMsMjQgQEAKICAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICB7Q1NfRVFVQUxJU0VSXzg4MjAwX0EwLCAgICAgLyogODhrUy9zIGNvZWZmaWVpZW50cyAqLworICAgICBDU19FUVVBTElTRVJfODgyMDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl84ODIwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzg4MjAwX0IxLAorICAgICBDU19FUVVBTElTRVJfODgyMDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl84ODIwMF9TQ0FMRX0sCiAgICAge0NTX0VRVUFMSVNFUl85NjAwMF9BMCwgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0ExLAogICAgICBDU19FUVVBTElTRVJfOTYwMDBfQTIsCiAgICAgIENTX0VRVUFMSVNFUl85NjAwMF9CMSwKICAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfRVFVQUxJU0VSXzE3NjQwMF9BMCwgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQTIsCisgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQjEsCisgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEV9LAogICAgIHtDU19FUVVBTElTRVJfMTkyMDAwX0EwLCAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMSwKICAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMiwKQEAgLTI5NCwxMiArMzI2LDI0IEBACiAgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl80ODAwMF9TQ0FMRX0KICNpZmRlZiBISUdIRVJfRlMKICAgICAsCisgICAge0NTRVhfRVFVQUxJU0VSXzg4MjAwX0EwLCAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzg4MjAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfODgyMDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzg4MjAwX1NDQUxFfSwKICAgICB7Q1NFWF9FUVVBTElTRVJfOTYwMDBfQTAsICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMSwKICAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTIsCiAgICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IxLAogICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMiwKICAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NFWF9FUVVBTElTRVJfMTc2NDAwX0EwLCAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NFWF9FUVVBTElTRVJfMTc2NDAwX1NDQUxFfSwKICAgICAge0NTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMCwgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTEsCiAgICAgIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMiwKQEAgLTMyNiw3ICszNzAsMTIgQEAKICAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzI0S0haLAogICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMzJLSFosCiAgICAgTFZDU19TVEVSRU9ERUxBWV9DU180NEtIWiwKLSAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0hafTsKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfODhLSFosCisgICAgTFZDU19TVEVSRU9ERUxBWV9DU185NktIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzE3NktIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzE5MktIWiwKK307CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzkyLDEyICs0NDEsMjQgQEAKICAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl80ODAwMF9TQ0FMRX0KICNpZmRlZiBISUdIRVJfRlMKICAgICAsCisgICAge0NTX1JFVkVSQl84ODIwMF9BMCwgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl84ODIwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzg4MjAwX0EyLAorICAgICBDU19SRVZFUkJfODgyMDBfQjEsCisgICAgIENTX1JFVkVSQl84ODIwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NfUkVWRVJCXzg4MjAwX1NDQUxFfSwKICAgICB7Q1NfUkVWRVJCXzk2MDAwX0EwLCAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfUkVWRVJCXzk2MDAwX0ExLAogICAgICBDU19SRVZFUkJfOTYwMDBfQTIsCiAgICAgIENTX1JFVkVSQl85NjAwMF9CMSwKICAgICAgQ1NfUkVWRVJCXzk2MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfUkVWRVJCXzE3NjQwMF9BMCwgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfMTc2NDAwX0ExLAorICAgICBDU19SRVZFUkJfMTc2NDAwX0EyLAorICAgICBDU19SRVZFUkJfMTc2NDAwX0IxLAorICAgICBDU19SRVZFUkJfMTc2NDAwX0IyLAorICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfMTc2NDAwX1NDQUxFfSwKICAgICAge0NTX1JFVkVSQl8xOTIwMDBfQTAsICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfUkVWRVJCXzE5MjAwMF9BMSwKICAgICAgQ1NfUkVWRVJCXzE5MjAwMF9BMiwKQEAgLTUwOSwyMiArNTcwLDI2IEBACiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzNDQxMDAgICAgIDMyNzM0ICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4OTYyNDAyICovCiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzNDgwMDAgICAgIDMyNzM3ICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5MDUzOTU1ICovCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzODgyMDAgICAgIDMyNzUxICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5NDgxMDY2ICovCiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzOTYwMDAgICAgIDMyNzUxICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5NTExNzAzICovICAgLyogVG9kbyBAIG5lZWQgdG8gcmUgY2hlY2sgdGhpcyB2YWx1ZSovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMTc2NDAwICAgIDMyNzU5ICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5NzQwNDk5ICovCiAjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMTkyMDAwICAgIDMyNzYzICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5ODc3OTI1ICovICAvKiBUb2RvIEAgbmVlZCB0byByZSBjaGVjayB0aGlzIHZhbHVlKi8KICNlbmRpZgogCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi1jb25zdCBMVk1fSU5UMTYgTFZDU19Wb2x1bWVUQ1RhYmxlWzExXSA9IHtMVkNTX1ZPTF9UQ19GczgwMDAsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczExMDI1LAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMxMjAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMTYwMDAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczIyMDUwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMyNDAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMzIwMDAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczQ0MTAwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnM0ODAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzOTYwMDAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczE5MjAwMAorY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVsxM10gPSB7TFZDU19WT0xfVENfRnM4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMTAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMyMjA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0NDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19Gczg4MjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM5NjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTc2NDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxOTIwMDAKIH07CiAjZWxzZQogY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVs5XSA9IHtMVkNTX1ZPTF9UQ19GczgwMDAsCkBAIC01NDUsMTcgKzYxMCwxOSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi1jb25zdCBMVk1fSU5UMzIgICBMVkNTX1NhbXBsZVJhdGVUYWJsZVsxMV0gPSB7ODAwMCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKLQkJCQkJCQkJCQkJICAxMjAwMCwKLQkJCQkJCQkJCQkJICAxNjAwMCwKLQkJCQkJCQkJCQkJICAyMjA1MCwKLQkJCQkJCQkJCQkJICAyNDAwMCwKLQkJCQkJCQkJCQkJICAzMjAwMCwKLQkJCQkJCQkJCQkJICA0NDEwMCwKLQkJCQkJCQkJCQkJICA0ODAwMCwKLQkJCQkJCQkJCQkJICA5NjAwMCwKLQkJCQkJCQkJCQkJICAxOTIwMDAKK2NvbnN0IExWTV9JTlQzMiAgIExWQ1NfU2FtcGxlUmF0ZVRhYmxlWzEzXSA9IHs4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3NjQwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTIwMDAKIH07CiAjZWxzZQogY29uc3QgTFZNX0lOVDE2ICAgTFZDU19TYW1wbGVSYXRlVGFibGVbOV0gPSB7ODAwMCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwM2NlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTkgQEAKKy8vIEJ1aWxkIHRoZSB1bml0IHRlc3RzIGZvciBlZmZlY3RzCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJsdm10ZXN0IiwKKyAgICBob3N0X3N1cHBvcnRlZDogZmFsc2UsCisgICAgcHJvcHJpZXRhcnk6IHRydWUsCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYyIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYiIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZSIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibXVzaWNidW5kbGUiLAorICAgIF0sCisKKyAgICBzcmNzOiBbImx2bXRlc3QuY3BwIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQlVJTERfRkxPQVQiLAorICAgICAgICAiLURISUdIRVJfRlMiLAorICAgICAgICAiLURTVVBQT1JUX01DIiwKKworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAic25yIiwKKyAgICBob3N0X3N1cHBvcnRlZDogZmFsc2UsCisKKyAgICBzcmNzOiBbInNuci5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWE4NzRhMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKQEAgLTAsMCArMSw4NSBAQAorIyEvYmluL2Jhc2gKKyMKKyMgUnVuIHRlc3RzIGluIHRoaXMgZGlyZWN0b3J5LgorIworCitpZiBbIC16ICIkQU5EUk9JRF9CVUlMRF9UT1AiIF07IHRoZW4KKyAgICBlY2hvICJBbmRyb2lkIGJ1aWxkIGVudmlyb25tZW50IG5vdCBzZXQiCisgICAgZXhpdCAtMQorZmkKKworIyBlbnN1cmUgd2UgaGF2ZSBtbQorLiAkQU5EUk9JRF9CVUlMRF9UT1AvYnVpbGQvZW52c2V0dXAuc2gKKworbW0gLWoKKworZWNobyAid2FpdGluZyBmb3IgZGV2aWNlIgorCithZGIgcm9vdCAmJiBhZGIgd2FpdC1mb3ItZGV2aWNlIHJlbW91bnQKKworIyBsb2NhdGlvbiBvZiB0ZXN0IGZpbGVzCit0ZXN0ZGlyPSIvZGF0YS9sb2NhbC90bXAvbHZtVGVzdCIKKworZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKK2VjaG8gInRlc3RpbmcgbHZtIgorYWRiIHNoZWxsIG1rZGlyIC1wICR0ZXN0ZGlyCithZGIgcHVzaCAkQU5EUk9JRF9CVUlMRF9UT1AvY3RzL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvc2luZXN3ZWVwcmF3LnJhdyAkdGVzdGRpcgorYWRiIHB1c2ggJE9VVC90ZXN0Y2FzZXMvbHZtdGVzdC9hcm02NC9sdm10ZXN0ICR0ZXN0ZGlyCithZGIgcHVzaCAkT1VUL3Rlc3RjYXNlcy9zbnIvYXJtNjQvc25yICR0ZXN0ZGlyCisKK2ZsYWdzX2Fycj0oCisgICAgIi1jc0UiCisgICAgIi1lcUUiCisgICAgIi10RSIKKyAgICAiLWNzRSAtdEUgLWVxRSIKKyAgICAiLWJFIC1NIgorICAgICItY3NFIC10RSIKKyAgICAiLWNzRSAtZXFFIiAiLXRFIC1lcUUiCisgICAgIi1jc0UgLXRFIC1iRSAtTSAtZXFFIgorKQorCitmc19hcnI9KAorICAgIDgwMDAKKyAgICAxMTAyNQorICAgIDEyMDAwCisgICAgMTYwMDAKKyAgICAyMjA1MAorICAgIDI0MDAwCisgICAgMzIwMDAKKyAgICA0NDEwMAorICAgIDQ4MDAwCisgICAgODgyMDAKKyAgICA5NjAwMAorICAgIDE3NjQwMAorICAgIDE5MjAwMAorKQorCisjIHJ1biBtdWx0aWNoYW5uZWwgZWZmZWN0cyBhdCBkaWZmZXJlbnQgY29uZmlncywgc2F2aW5nIG9ubHkgdGhlIHN0ZXJlbyBjaGFubmVsCisjIHBhaXIuCitmb3IgZmxhZ3MgaW4gIiR7ZmxhZ3NfYXJyW0BdfSIKK2RvCisgICAgZm9yIGZzIGluICR7ZnNfYXJyWypdfQorICAgIGRvCisgICAgICAgIGZvciBjaCBpbiB7MS4uOH0KKyAgICAgICAgZG8KKyAgICAgICAgICAgIGFkYiBzaGVsbCAkdGVzdGRpci9sdm10ZXN0IC1pOiR0ZXN0ZGlyL3NpbmVzd2VlcHJhdy5yYXcgXAorICAgICAgICAgICAgICAgIC1vOiR0ZXN0ZGlyL3NpbmVzd2VlcF8kKChjaCkpXyQoKGZzKSkucmF3IC1jaDokY2ggLWZzOiRmcyAkZmxhZ3MKKworICAgICAgICAgICAgIyB0d28gY2hhbm5lbCBmaWxlcyBzaG91bGQgYmUgaWRlbnRpY2FsIHRvIGhpZ2hlciBjaGFubmVsCisgICAgICAgICAgICAjIGNvbXB1dGF0aW9uIChmaXJzdCAyIGNoYW5uZWxzKS4KKyAgICAgICAgICAgICMgRG8gbm90IGNvbXBhcmUgY2FzZXMgd2hlcmUgLWJFIGlzIGluIGZsYWdzIChkdWUgdG8gbW9ubyBjb21wdXRhdGlvbikKKyAgICAgICAgICAgIGlmIFtbICRmbGFncyAhPSAqIi1iRSIqIF1dICYmIFsgIiRjaCIgLWd0IDIgXQorICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgIGFkYiBzaGVsbCBjbXAgJHRlc3RkaXIvc2luZXN3ZWVwXzJfJCgoZnMpKS5yYXcgXAorICAgICAgICAgICAgICAgICAgICAkdGVzdGRpci9zaW5lc3dlZXBfJCgoY2gpKV8kKChmcykpLnJhdworICAgICAgICAgICAgZWxpZiBbWyAkZmxhZ3MgPT0gKiItYkUiKiBdXSAmJiBbICIkY2giIC1ndCAyIF0KKyAgICAgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICBhZGIgc2hlbGwgJHRlc3RkaXIvc25yICR0ZXN0ZGlyL3NpbmVzd2VlcF8yXyQoKGZzKSkucmF3IFwKKyAgICAgICAgICAgICAgICAgICAgJHRlc3RkaXIvc2luZXN3ZWVwXyQoKGNoKSlfJCgoZnMpKS5yYXcgLXRocjo5MC4zMDg5OTgKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgZG9uZQorICAgIGRvbmUKK2RvbmUKKworYWRiIHNoZWxsIHJtIC1yICR0ZXN0ZGlyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9sdm10ZXN0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNmJkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9sdm10ZXN0LmNwcApAQCAtMCwwICsxLDc2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSAiRWZmZWN0QnVuZGxlLmgiCisjaW5jbHVkZSAiTFZNX1ByaXZhdGUuaCIKKworI2lmZGVmIFZFUllfVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNkZWZpbmUgQUxPR1ZWIEFMT0dWCisjZWxzZQorI2RlZmluZSBBTE9HVlYoYS4uLikgXAorICBkbyB7ICAgICAgICAgICAgICAgXAorICB9IHdoaWxlIChmYWxzZSkKKyNlbmRpZgorCisjZGVmaW5lIENIRUNLX0FSRyhjb25kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIShjb25kKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBTE9HRSgiXHRMVk1fRVJST1IgOiBJbnZhbGlkIGFyZ3VtZW50OiAiICNjb25kKTsgXAorICAgICAgcmV0dXJuIC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFwKK30KKworI2RlZmluZSBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYykgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9OVUxMQUREUkVTUykgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIm51bGwgcG9pbnRlciByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgICAgICAgICAgXAorICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9BTElHTk1FTlRFUlJPUikgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgImJhZCBhbGlnbm1lbnQgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsICAgICAgICAgXAorICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9JTlZBTElETlVNU0FNUExFUykgeyAgICAgICAgICAgICAgICAgXAorICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgImJhZCBudW1iZXIgb2Ygc2FtcGxlcyByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgXAorICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9PVVRPRlJBTkdFKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIm91dCBvZiByYW5nZSByZXR1cm5lZCBieSAlcyBpbiAlc1xuIiwgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworc3RydWN0IGx2bUNvbmZpZ1BhcmFtc190IHsKKyAgaW50ICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgICAgPSA0NDEwMDsKKyAgaW50ICAgICAgICAgICAgICBuckNoYW5uZWxzICAgICAgPSAyOworICBpbnQgICAgICAgICAgICAgIGZDaGFubmVscyAgICAgICA9IDI7CisgIGJvb2wgICAgICAgICAgICAgbW9ub01vZGUgICAgICAgID0gZmFsc2U7CisgIGludCAgICAgICAgICAgICAgYmFzc0VmZmVjdExldmVsID0gMDsKKyAgaW50ICAgICAgICAgICAgICBlcVByZXNldExldmVsICAgPSAwOworICBpbnQgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoICAgICA9IDI1NjsKKyAgTFZNX0JFX01vZGVfZW4gICBiYXNzRW5hYmxlICAgICAgPSBMVk1fQkVfT0ZGOworICBMVk1fVEVfTW9kZV9lbiAgIHRyZWJsZUVuYWJsZSAgICA9IExWTV9URV9PRkY7CisgIExWTV9FUU5CX01vZGVfZW4gZXFFbmFibGUgICAgICAgID0gTFZNX0VRTkJfT0ZGOworICBMVk1fTW9kZV9lbiAgICAgIGNzRW5hYmxlICAgICAgICA9IExWTV9NT0RFX09GRjsKK307CisKK3ZvaWQgcHJpbnRVc2FnZSgpIHsKKyAgcHJpbnRmKCJcblVzYWdlOiAiKTsKKyAgcHJpbnRmKCJcbiAgICAgPGV4Y2V1dGFibGU+IC1pOjxpbnB1dF9maWxlPiAtbzo8b3V0X2ZpbGU+IFtvcHRpb25zXVxuIik7CisgIHByaW50ZigiXG53aGVyZSwgXG4gICAgIDxpbnB1dGZpbGU+ICBpcyB0aGUgaW5wdXQgZmlsZSBuYW1lIik7CisgIHByaW50ZigiXG4gICAgICAgICAgICAgICAgICBvbiB3aGljaCBMVk0gZWZmZWN0cyBhcmUgYXBwbGllZCIpOworICBwcmludGYoIlxuICAgICA8b3V0cHV0ZmlsZT4gcHJvY2Vzc2VkIG91dHB1dCBmaWxlIik7CisgIHByaW50ZigiXG4gICAgIGFuZCBvcHRpb25zIGFyZSBtZW50aW9uZWQgYmVsb3ciKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtaGVscCAob3IpIC1oIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIFByaW50cyB0aGlzIHVzYWdlIGluZm9ybWF0aW9uIik7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgLWNoOjxwcm9jZXNzX2NoYW5uZWxzPiAoMSB0aHJvdWdoIDgpXG5cbiIpOworICBwcmludGYoIlxuICAgICAtZmNoOjxmaWxlX2NoYW5uZWxzPiAoMSB0aHJvdWdoIDgpXG5cbiIpOworICBwcmludGYoIlxuICAgICAtTSIpOworICBwcmludGYoIlxuICAgICAgICAgICBNb25vIG1vZGUgKGZvcmNlIGFsbCBpbnB1dCBhdWRpbyBjaGFubmVscyB0byBiZSBpZGVudGljYWwpIik7CisgIHByaW50ZigiXG4gICAgIC1iYXNzbHZsOjxlZmZlY3RfbGV2ZWw+Iik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEEgdmFsdWUgdGhhdCByYW5nZXMgYmV0d2VlbiAlZCAtICVkIGRlZmF1bHQgMCIsIExWTV9CRV9NSU5fRUZGRUNUTEVWRUwsCisgICAgTFZNX0JFX01BWF9FRkZFQ1RMRVZFTCk7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgLWVxUHJlc2V0OjxwcmVzZXQgVmFsdWU+Iik7CisgIGNvbnN0IHNpemVfdCBudW1QcmVzZXRMdmxzICA9IHN0ZDo6c2l6ZShnRXF1YWxpemVyUHJlc2V0cyk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUHJlc2V0THZsczsgKytpKSB7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgJXp1IC0gJXMiLCBpLCBnRXF1YWxpemVyUHJlc2V0c1tpXS5uYW1lKTsKKyAgfQorICBwcmludGYoIlxuICAgICAgICAgICBkZWZhdWx0IC0gMCIpOworICBwcmludGYoIlxuICAgICAtYkUgIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQiKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtdEUgIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBUcmVibGUgQm9vc3QiKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtY3NFICIpOworICBwcmludGYoIlxuICAgICAgICAgICBFbmFibGUgQ29uY2VydCBTdXJyb3VuZCIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1lcUUgIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBFcXVhbGl6ZXIiKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMdm1FZmZlY3RfZnJlZSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IEZyZWUgYWxsIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIEJ1bmRsZS4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8gT3V0cHV0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBMdm1FZmZlY3RfZnJlZShzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQpIHsKKyAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgTFZNX01lbVRhYl90IE1lbVRhYjsKKworICAvKiBGcmVlIHRoZSBhbGdvcml0aG0gbWVtb3J5ICovCisgIEx2bVN0YXR1cyA9IExWTV9HZXRNZW1vcnlUYWJsZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZNZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRNZW1vcnlUYWJsZSIsICJMdm1FZmZlY3RfZnJlZSIpCisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykgeworICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCkgeworICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2ZyZWUgLSBTVEFSVCBmcmVlaW5nICUiIFBSSXUzMgorICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworCisgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworCisgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9mcmVlIC0gRU5EICAgZnJlZWluZyAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKAorICAgICAgICAgICAgIlx0TFZNX0VSUk9SIDogTHZtRWZmZWN0X2ZyZWUgLSB0cnlpbmcgdG8gZnJlZSB3aXRoIE5VTEwgcG9pbnRlciAiCisgICAgICAgICAgICAiJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcCBFUlJPUlxuIiwKKyAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgfQorfSAvKiBlbmQgTHZtRWZmZWN0X2ZyZWUgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMdm1CdW5kbGVfaW5pdCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IEluaXRpYWxpemUgZW5naW5lIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uLCBjcmVhdGVzIGluc3RhbmNlCisvLyB3aXRoIGFsbCBlZmZlY3RzIGRpc2FibGVkLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgTHZtQnVuZGxlX2luaXQoc3RydWN0IEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBMVk1fQ29udHJvbFBhcmFtc190ICpwYXJhbXMpIHsKKyAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgc3RhcnQiKTsKKworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworCisgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgIT0gTlVMTCkgeworICAgIEFMT0dWKAorICAgICAgICAiXHRMdm1CdW5kbGVfaW5pdCBwQ29udGV4dC0+cEJhc3NCb29zdCAhPSBOVUxMICIKKyAgICAgICAgIi0+IENhbGxpbmcgcENvbnRleHQtPnBCYXNzQm9vc3QtPmZyZWUoKSIpOworCisgICAgTHZtRWZmZWN0X2ZyZWUocENvbnRleHQpOworCisgICAgQUxPR1YoCisgICAgICAgICJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgorICAgICAgICAiLT4gQ2FsbGVkIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKKyAgfQorCisgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgIExWTV9JbnN0UGFyYW1zX3QgSW5zdFBhcmFtczsgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgTFZNX0VRTkJfQmFuZERlZl90IEJhbmREZWZzW01BWF9OVU1fQkFORFNdOyAgLyogRXF1YWxpc2VyIGJhbmQgZGVmaW5pdGlvbnMgKi8KKyAgTFZNX0hlYWRyb29tUGFyYW1zX3QgSGVhZHJvb21QYXJhbXM7ICAgICAgICAgLyogSGVhZHJvb20gcGFyYW1ldGVycyAqLworICBMVk1fSGVhZHJvb21CYW5kRGVmX3QgSGVhZHJvb21CYW5kRGVmW0xWTV9IRUFEUk9PTV9NQVhfTkJBTkRTXTsKKyAgTFZNX01lbVRhYl90IE1lbVRhYjsgLyogTWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KKyAgYm9vbCBiTWFsbG9jRmFpbHVyZSA9IExWTV9GQUxTRTsKKworICAvKiBTZXQgdGhlIGNhcGFiaWxpdGllcyAqLworICBJbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlM7CisgIEluc3RQYXJhbXMuTWF4QmxvY2tTaXplID0gTUFYX0NBTExfU0laRTsKKyAgSW5zdFBhcmFtcy5FUU5CX051bUJhbmRzID0gTUFYX05VTV9CQU5EUzsKKyAgSW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgPSBMVk1fUFNBX09OOworCisgIC8qIEFsbG9jYXRlIG1lbW9yeSwgZm9yY2luZyBhbGlnbm1lbnQgKi8KKyAgTHZtU3RhdHVzID0gTFZNX0dldE1lbW9yeVRhYmxlKExWTV9OVUxMLCAmTWVtVGFiLCAmSW5zdFBhcmFtcyk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRNZW1vcnlUYWJsZSIsICJMdm1CdW5kbGVfaW5pdCIpOworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICBBTE9HVigiXHRDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX0dldE1lbW9yeVRhYmxlXG4iKTsKKworICAvKiBBbGxvY2F0ZSBtZW1vcnkgKi8KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykgeworICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCkgeworICAgICAgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPSBtYWxsb2MoTWVtVGFiLlJlZ2lvbltpXS5TaXplKTsKKworICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID09IExWTV9OVUxMKSB7CisgICAgICAgIEFMT0dFKAorICAgICAgICAgICAgIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgIgorICAgICAgICAgICAgIiUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXVcbiIsCisgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkpOworICAgICAgICBiTWFsbG9jRmFpbHVyZSA9IExWTV9UUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIGFsbG9jYXRlZCAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBJZiBvbmUgb3IgbW9yZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbnMgZmFpbGVkIHRvIGFsbG9jYXRlLCBmcmVlIHRoZSByZWdpb25zCisgICAqIHRoYXQgd2VyZQorICAgKiBzdWNjZXNmdWxseSBhbGxvY2F0ZWQgYW5kIHJldHVybiB3aXRoIGFuIGVycm9yCisgICAqLworICBpZiAoYk1hbGxvY0ZhaWx1cmUgPT0gTFZNX1RSVUUpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKSB7CisgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgQUxPR0UoCisgICAgICAgICAgICAiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAiCisgICAgICAgICAgICAiJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBOb3QgZnJlZWluZ1xuIiwKKyAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgKKyAgICAgICAgICAgICJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkOiBidXQgYWxsb2NhdGVkICIKKyAgICAgICAgICAgICIlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwLSBmcmVlXG4iLAorICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLUVJTlZBTDsKKyAgfQorICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBtYWxsb2MnZCBtZW1vcnlcbiIpOworCisgIC8qIEluaXRpYWxpc2UgKi8KKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlID0gTFZNX05VTEw7CisKKyAgLyogSW5pdCBzZXRzIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgTHZtU3RhdHVzID0gTFZNX0dldEluc3RhbmNlSGFuZGxlKCZwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLCAmSW5zdFBhcmFtcyk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRJbnN0YW5jZUhhbmRsZSIsICJMdm1CdW5kbGVfaW5pdCIpOworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICBBTE9HVigKKyAgICAgICJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCAiCisgICAgICAiTFZNX0dldEluc3RhbmNlSGFuZGxlXG4iKTsKKworICAvKiBTZXQgdGhlIGluaXRpYWwgcHJvY2VzcyBwYXJhbWV0ZXJzICovCisgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPk9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PTjsKKyAgcGFyYW1zLT5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9TVEVSRU87CisgIHBhcmFtcy0+U3BlYWtlclR5cGUgPSBMVk1fSEVBRFBIT05FUzsKKworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworCisgIC8qIENvbmNlcnQgU291bmQgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09GRjsKKyAgcGFyYW1zLT5WaXJ0dWFsaXplclR5cGUgPSBMVk1fQ09OQ0VSVFNPVU5EOworICBwYXJhbXMtPlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgPSAxMDA7CisgIHBhcmFtcy0+Q1NfRWZmZWN0TGV2ZWwgPSBMVk1fQ1NfRUZGRUNUX05PTkU7CisKKyAgLyogTi1CYW5kIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlID0gTFZNX0VRTkJfT047CisgIHBhcmFtcy0+RVFOQl9OQmFuZHMgPSBGSVZFQkFORF9OVU1CQU5EUzsKKyAgcGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9ICZCYW5kRGVmc1swXTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICBCYW5kRGVmc1tpXS5GcmVxdWVuY3kgPSBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW2ldOworICAgIEJhbmREZWZzW2ldLlFGYWN0b3IgPSBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW2ldOworICAgIEJhbmREZWZzW2ldLkdhaW4gPSBFUU5CXzVCYW5kU29mdFByZXNldHNbaV07CisgIH0KKworICAvKiBWb2x1bWUgQ29udHJvbCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+VkNfRWZmZWN0TGV2ZWwgPSAwOworICBwYXJhbXMtPlZDX0JhbGFuY2UgPSAwOworCisgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+VEVfT3BlcmF0aW5nTW9kZSA9IExWTV9URV9PRkY7CisgIHBhcmFtcy0+VEVfRWZmZWN0TGV2ZWwgPSAwOworCisgIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5QU0FfRW5hYmxlID0gTFZNX1BTQV9PRkY7CisgIHBhcmFtcy0+UFNBX1BlYWtEZWNheVJhdGUgPSAoTFZNX1BTQV9EZWNheVNwZWVkX2VuKTA7CisKKyAgLyogQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+QkVfT3BlcmF0aW5nTW9kZSA9IExWTV9CRV9PTjsKKyAgcGFyYW1zLT5CRV9FZmZlY3RMZXZlbCA9IDA7CisgIHBhcmFtcy0+QkVfQ2VudHJlRnJlcSA9IExWTV9CRV9DRU5UUkVfOTBIejsKKyAgcGFyYW1zLT5CRV9IUEYgPSBMVk1fQkVfSFBGX09OOworCisgIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5QU0FfRW5hYmxlID0gTFZNX1BTQV9PRkY7CisgIHBhcmFtcy0+UFNBX1BlYWtEZWNheVJhdGUgPSBMVk1fUFNBX1NQRUVEX01FRElVTTsKKworICAvKiBURSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID0gTFZNX1RFX09GRjsKKyAgcGFyYW1zLT5URV9FZmZlY3RMZXZlbCA9IDA7CisKKyAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgTHZtU3RhdHVzID0KKyAgICAgIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIHBhcmFtcyk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJMdm1CdW5kbGVfaW5pdCIpOworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICBBTE9HVigKKyAgICAgICJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCAiCisgICAgICAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKworICAvKiBTZXQgdGhlIGhlYWRyb29tIHBhcmFtZXRlcnMgKi8KKyAgSGVhZHJvb21CYW5kRGVmWzBdLkxpbWl0X0xvdyA9IDIwOworICBIZWFkcm9vbUJhbmREZWZbMF0uTGltaXRfSGlnaCA9IDQ5OTk7CisgIEhlYWRyb29tQmFuZERlZlswXS5IZWFkcm9vbV9PZmZzZXQgPSAwOworICBIZWFkcm9vbUJhbmREZWZbMV0uTGltaXRfTG93ID0gNTAwMDsKKyAgSGVhZHJvb21CYW5kRGVmWzFdLkxpbWl0X0hpZ2ggPSAyNDAwMDsKKyAgSGVhZHJvb21CYW5kRGVmWzFdLkhlYWRyb29tX09mZnNldCA9IDA7CisgIEhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb24gPSAmSGVhZHJvb21CYW5kRGVmWzBdOworICBIZWFkcm9vbVBhcmFtcy5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlID0gTFZNX0hFQURST09NX09OOworICBIZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kcyA9IDI7CisKKyAgTHZtU3RhdHVzID0gTFZNX1NldEhlYWRyb29tUGFyYW1zKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIZWFkcm9vbVBhcmFtcyk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRIZWFkcm9vbVBhcmFtcyIsICJMdm1CdW5kbGVfaW5pdCIpOworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICBBTE9HVigKKyAgICAgICJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCAiCisgICAgICAiTFZNX1NldEhlYWRyb29tUGFyYW1zXG4iKTsKKyAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgRW5kIik7CisgIHJldHVybiAwOworfSAvKiBlbmQgTHZtQnVuZGxlX2luaXQgKi8KKworaW50IGx2bUNyZWF0ZShzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtc190ICAgICpwbHZtQ29uZmlnUGFyYW1zLAorICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAqcGFyYW1zKSB7CisgIGludCByZXQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0ID0gTlVMTDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCA9IChCdW5kbGVkRWZmZWN0Q29udGV4dCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IEJ1bmRsZWRFZmZlY3RDb250ZXh0KSk7CisgIGlmIChOVUxMID09IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQpIHsKKyAgICByZXR1cm4gLUVJTlZBTDsKKyAgfQorCisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25ObyA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25JZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSA9IE5VTEw7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWb2x1bWVFbmFibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iRXF1YWxpemVyRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NFbmFibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc1RlbXBEaXNhYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uT3V0cHV0RGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5WaXJ0dWFsaXplckZvcmNlZERldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5maXJzdFZvbHVtZSA9IExWTV9UUlVFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT52b2x1bWUgPSAwOworCisgIC8qIFNhdmVkIHN0cmVuZ3RoIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBleGFjdCBzdHJlbmd0aCB0aGF0IHdhcyB1c2VkIGluIHRoZQorICAgKiBzZXQgdG8gdGhlIGdldAorICAgKiBiZWNhdXNlIHdlIG1hcCB0aGUgb3JpZ2luYWwgc3RyZW5ndGggcmFuZ2Ugb2YgMDoxMDAwIHRvIDE6MTUsIGFuZCB0aGlzIHdpbGwKKyAgICogYXZvaWQKKyAgICogcXVhbnRpc2F0aW9uIGxpa2UgZWZmZWN0IHdoZW4gcmV0dXJuaW5nCisgICAqLworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlZpcnRTdHJlbmd0aFNhdmVkID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q3VyUHJlc2V0ID0gUFJFU0VUX0NVU1RPTTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bGV2ZWxTYXZlZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPSBOVUxMOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50ID0gLTE7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxID0gMDsKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiAhZGVmaW5lZChOQVRJVkVfRkxPQVRfQlVGRkVSKQorICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPSBOVUxMOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID0gTlVMTDsKKyNlbmRpZgorICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldID0gRVFOQl81QmFuZFNvZnRQcmVzZXRzW2ldOworICB9CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBwbHZtQ29uZmlnUGFyYW1zLT5uckNoYW5uZWxzOworICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBDYWxsaW5nIEx2bUJ1bmRsZV9pbml0Iik7CisgIHJldCA9IEx2bUJ1bmRsZV9pbml0KHBDb250ZXh0LCBwYXJhbXMpOworCisgIGlmIChyZXQgPCAwKSB7CisgICAgQUxPR0UoIlx0TFZNX0VSUk9SIDogbHZtQ3JlYXRlKCkgQnVuZGxlIGluaXQgZmFpbGVkIik7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IGx2bUNvbnRyb2woc3RydWN0IEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zX3QgICAgKnBsdm1Db25maWdQYXJhbXMsCisgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAqcGFyYW1zKSB7CisgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKyAgLyogU2V0IHRoZSBpbml0aWFsIHByb2Nlc3MgcGFyYW1ldGVycyAqLworICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5PcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT047CisgIHBhcmFtcy0+U3BlYWtlclR5cGUgPSBMVk1fSEVBRFBIT05FUzsKKworICBjb25zdCBpbnQgbnJDaGFubmVscyA9IHBsdm1Db25maWdQYXJhbXMtPm5yQ2hhbm5lbHM7CisgIHBhcmFtcy0+TnJDaGFubmVscyA9IG5yQ2hhbm5lbHM7CisgIGlmIChuckNoYW5uZWxzID09IDEpIHsKKyAgICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9NT05POworICB9IGVsc2UgaWYgKG5yQ2hhbm5lbHMgPT0gMikgeworICAgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX1NURVJFTzsKKyAgfSBlbHNlIGlmIChuckNoYW5uZWxzID4gMiAmJiBuckNoYW5uZWxzIDw9IDgpIHsgLy8gRkNDXzIgRkNDXzgKKyAgICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9NVUxUSUNIQU5ORUw7CisgIH0gZWxzZSB7CisgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgfQorCisgIExWTV9Gc19lbiBzYW1wbGVSYXRlOworICBzd2l0Y2ggKHBsdm1Db25maWdQYXJhbXMtPnNhbXBsaW5nRnJlcSkgeworICAgIGNhc2UgODAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfODAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTEwMjU6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzExMDI1OworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMTIwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE2MDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18xNjAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjIwNTA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzIyMDUwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMjQwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDMyMDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18zMjAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDQxMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0ODAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfNDgwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDg4MjAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU184ODIwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgOTYwMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzk2MDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNzY0MDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzE3NjQwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTkyMDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18xOTIwMDA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIC1FSU5WQUw7CisgIH0KKyAgcGFyYW1zLT5TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKworICAvKiBDb25jZXJ0IFNvdW5kIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT5jc0VuYWJsZTsKKyAgcGFyYW1zLT5WaXJ0dWFsaXplclR5cGUgPSBMVk1fQ09OQ0VSVFNPVU5EOworICBwYXJhbXMtPlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgPSAxMDA7CisgIHBhcmFtcy0+Q1NfRWZmZWN0TGV2ZWwgPSBMVk1fQ1NfRUZGRUNUX05PTkU7CisKKyAgLyogTi1CYW5kIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCisgIGNvbnN0IGludCBlcVByZXNldExldmVsID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZXFQcmVzZXRMZXZlbDsKKyAgTFZNX0VRTkJfQmFuZERlZl90IEJhbmREZWZzW01BWF9OVU1fQkFORFNdOyAgLyogRXF1YWxpc2VyIGJhbmQgZGVmaW5pdGlvbnMgKi8KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7CisgICAgQmFuZERlZnNbaV0uRnJlcXVlbmN5ID0gRVFOQl81QmFuZFByZXNldHNGcmVxdWVuY2llc1tpXTsKKyAgICBCYW5kRGVmc1tpXS5RRmFjdG9yID0gRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tpXTsKKyAgICBCYW5kRGVmc1tpXS5HYWluID0KKyAgICAgICAgRVFOQl81QmFuZFNvZnRQcmVzZXRzWyhGSVZFQkFORF9OVU1CQU5EUyAqIGVxUHJlc2V0TGV2ZWwpICsgaV07CisgIH0KKyAgcGFyYW1zLT5FUU5CX09wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT5lcUVuYWJsZTsKKyAvLyBDYXV0aW9uOiByYXcgcG9pbnRlciB0byBzdGFjayBkYXRhLCBzdG9yZWQgaW4gaW5zdGFuY2UgYnkgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzLgorICBwYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uID0gJkJhbmREZWZzWzBdOworCisgIC8qIFZvbHVtZSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA9IDA7CisgIHBhcmFtcy0+VkNfQmFsYW5jZSA9IDA7CisKKyAgLyogVHJlYmxlIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID0gcGx2bUNvbmZpZ1BhcmFtcy0+dHJlYmxlRW5hYmxlOworCisgIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5QU0FfRW5hYmxlID0gTFZNX1BTQV9PTjsKKworICAvKiBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlID0gcGx2bUNvbmZpZ1BhcmFtcy0+YmFzc0VuYWJsZTsKKworICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworICBMdm1TdGF0dXMgPQorICAgICAgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgcGFyYW1zKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUJ1bmRsZV9pbml0Iik7CisgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgIEx2bVN0YXR1cyA9IExWTV9BcHBseU5ld1NldHRpbmdzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSk7CisKKyAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBsdm1FeGVjdXRlKGZsb2F0ICpmbG9hdEluLCBmbG9hdCAqZmxvYXRPdXQsIHN0cnVjdCBFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtc190ICpwbHZtQ29uZmlnUGFyYW1zKSB7CisgIGNvbnN0IGludCBmcmFtZUxlbmd0aCA9IHBsdm1Db25maWdQYXJhbXMtPmZyYW1lTGVuZ3RoOworICByZXR1cm4KKyAgICAgIExWTV9Qcm9jZXNzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICBmbG9hdEluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgZmxvYXRPdXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNilmcmFtZUxlbmd0aCwgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCAqLworICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIEF1ZGlvIFRpbWUgKi8KK30KKworaW50IGx2bU1haW5Qcm9jZXNzKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgKnBQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zX3QgKnBsdm1Db25maWdQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgRklMRSAqZmlucCwKKyAgICAgICAgICAgICAgICAgICBGSUxFICpmb3V0KSB7CisgIGludCBlcnJDb2RlID0gbHZtQ29udHJvbChwQ29udGV4dCwgcGx2bUNvbmZpZ1BhcmFtcywgcFBhcmFtcyk7CisgIGlmIChlcnJDb2RlKSB7CisgICAgQUxPR0UoIkVycm9yOiBsdm1Db250cm9sIHJldHVybmVkIHdpdGggJWRcbiIsIGVyckNvZGUpOworICAgIHJldHVybiBlcnJDb2RlOworICB9CisKKyAgY29uc3QgaW50IGNoYW5uZWxDb3VudCA9IHBsdm1Db25maWdQYXJhbXMtPm5yQ2hhbm5lbHM7CisgIGNvbnN0IGludCBmcmFtZUxlbmd0aCA9IHBsdm1Db25maWdQYXJhbXMtPmZyYW1lTGVuZ3RoOworICBjb25zdCBpbnQgZnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogc2l6ZW9mKGZsb2F0KTsgIC8vIHByb2Nlc3Npbmcgc2l6ZQorICBjb25zdCBpbnQgaW9DaGFubmVsQ291bnQgPSBwbHZtQ29uZmlnUGFyYW1zLT5mQ2hhbm5lbHM7CisgIGNvbnN0IGludCBpb0ZyYW1lU2l6ZSA9IGlvQ2hhbm5lbENvdW50ICogc2l6ZW9mKHNob3J0KTsgLy8gZmlsZSBsb2FkIHNpemUKKyAgY29uc3QgaW50IG1heENoYW5uZWxDb3VudCA9IHN0ZDo6bWF4KGNoYW5uZWxDb3VudCwgaW9DaGFubmVsQ291bnQpOworICAvKgorICAgKiBNb25vIGlucHV0IHdpbGwgYmUgY29udmVydGVkIHRvIDIgY2hhbm5lbHMgaW50ZXJuYWxseSBpbiB0aGUgcHJvY2VzcyBjYWxsCisgICAqIGJ5IGNvcHlpbmcgdGhlIHNhbWUgZGF0YSBpbnRvIHRoZSBzZWNvbmQgY2hhbm5lbC4KKyAgICogSGVuY2Ugd2hlbiBjaGFubmVsQ291bnQgaXMgMSwgb3V0cHV0IGJ1ZmZlciBzaG91bGQgYmUgYWxsb2NhdGVkIGZvcgorICAgKiAyIGNoYW5uZWxzLiBUaGUgbWVtQWxsb2NDaENvdW50IHRha2VzIGNhcmUgb2YgYWxsb2NhdGlvbiBvZiBzdWZmaWNpZW50CisgICAqIG1lbW9yeSBmb3IgdGhlIG91dHB1dCBidWZmZXIuCisgICAqLworICBjb25zdCBpbnQgbWVtQWxsb2NDaENvdW50ID0gKGNoYW5uZWxDb3VudCA9PSAxID8gMiA6IGNoYW5uZWxDb3VudCk7CisKKyAgc3RkOjp2ZWN0b3I8c2hvcnQ+IGluKGZyYW1lTGVuZ3RoICogbWF4Q2hhbm5lbENvdW50KTsKKyAgc3RkOjp2ZWN0b3I8c2hvcnQ+IG91dChmcmFtZUxlbmd0aCAqIG1heENoYW5uZWxDb3VudCk7CisgIHN0ZDo6dmVjdG9yPGZsb2F0PiBmbG9hdEluKGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGZsb2F0T3V0KGZyYW1lTGVuZ3RoICogbWVtQWxsb2NDaENvdW50KTsKKworICBpbnQgZnJhbWVDb3VudGVyID0gMDsKKyAgd2hpbGUgKGZyZWFkKGluLmRhdGEoKSwgaW9GcmFtZVNpemUsIGZyYW1lTGVuZ3RoLCBmaW5wKSA9PSAoc2l6ZV90KWZyYW1lTGVuZ3RoKSB7CisgICAgaWYgKGlvQ2hhbm5lbENvdW50ICE9IGNoYW5uZWxDb3VudCkgeworICAgICAgICBhZGp1c3RfY2hhbm5lbHMoaW4uZGF0YSgpLCBpb0NoYW5uZWxDb3VudCwgaW4uZGF0YSgpLCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICBzaXplb2Yoc2hvcnQpLCBmcmFtZUxlbmd0aCAqIGlvRnJhbWVTaXplKTsKKyAgICB9CisgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KGZsb2F0SW4uZGF0YSgpLCBpbi5kYXRhKCksIGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKKworICAgIC8vIE1vbm8gbW9kZSB3aWxsIHJlcGxpY2F0ZSB0aGUgZmlyc3QgY2hhbm5lbCB0byBhbGwgb3RoZXIgY2hhbm5lbHMuCisgICAgLy8gVGhpcyBlbnN1cmVzIGFsbCBhdWRpbyBjaGFubmVscyBhcmUgaWRlbnRpY2FsLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGVzdGluZworICAgIC8vIEJhc3MgQm9vc3QsIHdoaWNoIGV4dHJhY3RzIGEgbW9ubyBzaWduYWwgZm9yIHByb2Nlc3NpbmcuCisgICAgaWYgKHBsdm1Db25maWdQYXJhbXMtPm1vbm9Nb2RlICYmIGNoYW5uZWxDb3VudCA+IDEpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBhdXRvICpmcCA9ICZmbG9hdEluW2kgKiBjaGFubmVsQ291bnRdOworICAgICAgICAgICAgc3RkOjpmaWxsKGZwICsgMSwgZnAgKyBjaGFubmVsQ291bnQsICpmcCk7IC8vIHJlcGxpY2F0ZSBjaCAwCisgICAgICAgIH0KKyAgICB9CisjaWZuZGVmIEJZUEFTU19FWEVDCisgICAgZXJyQ29kZSA9IGx2bUV4ZWN1dGUoZmxvYXRJbi5kYXRhKCksIGZsb2F0T3V0LmRhdGEoKSwgcENvbnRleHQsIHBsdm1Db25maWdQYXJhbXMpOworICAgIGlmIChlcnJDb2RlKSB7CisgICAgICBwcmludGYoIlxuRXJyb3I6IGx2bUV4ZWN1dGUgcmV0dXJuZWQgd2l0aCAlZFxuIiwgZXJyQ29kZSk7CisgICAgICByZXR1cm4gZXJyQ29kZTsKKyAgICB9CisKKyAgICAodm9pZClmcmFtZVNpemU7IC8vIGVsaW1pbmF0ZSB3YXJuaW5nCisjZWxzZQorICAgIG1lbWNweShmbG9hdE91dC5kYXRhKCksIGZsb2F0SW4uZGF0YSgpLCBmcmFtZUxlbmd0aCAqIGZyYW1lU2l6ZSk7CisjZW5kaWYKKyAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQob3V0LmRhdGEoKSwgZmxvYXRPdXQuZGF0YSgpLCBmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7CisgICAgaWYgKGlvQ2hhbm5lbENvdW50ICE9IGNoYW5uZWxDb3VudCkgeworICAgICAgICBhZGp1c3RfY2hhbm5lbHMob3V0LmRhdGEoKSwgY2hhbm5lbENvdW50LCBvdXQuZGF0YSgpLCBpb0NoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgIHNpemVvZihzaG9ydCksIGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50ICogc2l6ZW9mKHNob3J0KSk7CisgICAgfQorICAgICh2b2lkKSBmd3JpdGUob3V0LmRhdGEoKSwgaW9GcmFtZVNpemUsIGZyYW1lTGVuZ3RoLCBmb3V0KTsKKyAgICBmcmFtZUNvdW50ZXIgKz0gZnJhbWVMZW5ndGg7CisgIH0KKyAgcHJpbnRmKCJmcmFtZUNvdW50ZXI6IFslZF1cbiIsIGZyYW1lQ291bnRlcik7CisgIHJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgIGlmIChhcmdjID09IDEpIHsKKyAgICBwcmludFVzYWdlKCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgbHZtQ29uZmlnUGFyYW1zX3QgbHZtQ29uZmlnUGFyYW1ze307IC8vIGRlZmF1bHQgaW5pdGlhbGl6ZQorICBjb25zdCBjaGFyICppbmZpbGUgPSBudWxscHRyOworICBjb25zdCBjaGFyICpvdXRmaWxlID0gbnVsbHB0cjsKKworICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICAgIHByaW50ZigiJXMgIiwgYXJndltpXSk7CisgICAgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItaToiLCAzKSkgeworICAgICAgaW5maWxlID0gYXJndltpXSArIDM7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLW86IiwgMykpIHsKKyAgICAgIG91dGZpbGUgPSBhcmd2W2ldICsgMzsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItZnM6IiwgNCkpIHsKKyAgICAgIGNvbnN0IGludCBzYW1wbGluZ0ZyZXEgPSBhdG9pKGFyZ3ZbaV0gKyA0KTsKKyAgICAgIGlmIChzYW1wbGluZ0ZyZXEgIT0gODAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMTEwMjUgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMTIwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDE2MDAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDIyMDUwICYmIHNhbXBsaW5nRnJlcSAhPSAyNDAwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAzMjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gNDQxMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gNDgwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDg4MjAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDk2MDAwICYmIHNhbXBsaW5nRnJlcSAhPSAxNzY0MDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMTkyMDAwKSB7CisgICAgICAgIHByaW50ZigiRXJyb3I6IFVuc3VwcG9ydGVkIFNhbXBsaW5nIEZyZXF1ZW5jeSA6ICVkXG4iLCBzYW1wbGluZ0ZyZXEpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBsdm1Db25maWdQYXJhbXMuc2FtcGxpbmdGcmVxID0gc2FtcGxpbmdGcmVxOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1jaDoiLCA0KSkgeworICAgICAgY29uc3QgaW50IG5yQ2hhbm5lbHMgPSBhdG9pKGFyZ3ZbaV0gKyA0KTsKKyAgICAgIGlmIChuckNoYW5uZWxzID4gOCB8fCBuckNoYW5uZWxzIDwgMSkgeworICAgICAgICBwcmludGYoIkVycm9yOiBVbnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHMgOiAlZFxuIiwgbnJDaGFubmVscyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy5uckNoYW5uZWxzID0gbnJDaGFubmVsczsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItZmNoOiIsIDUpKSB7CisgICAgICBjb25zdCBpbnQgZkNoYW5uZWxzID0gYXRvaShhcmd2W2ldICsgNSk7CisgICAgICBpZiAoZkNoYW5uZWxzID4gOCB8fCBmQ2hhbm5lbHMgPCAxKSB7CisgICAgICAgICAgICAgcHJpbnRmKCJFcnJvcjogVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGZpbGUgY2hhbm5lbHMgOiAlZFxuIiwgZkNoYW5uZWxzKTsKKyAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLmZDaGFubmVscyA9IGZDaGFubmVsczsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwiLU0iKSkgeworICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtcy5tb25vTW9kZSA9IHRydWU7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWJhc3Nsdmw6IiwgOSkpIHsKKyAgICAgIGNvbnN0IGludCBiYXNzRWZmZWN0TGV2ZWwgPSBhdG9pKGFyZ3ZbaV0gKyA5KTsKKyAgICAgIGlmIChiYXNzRWZmZWN0TGV2ZWwgPiBMVk1fQkVfTUFYX0VGRkVDVExFVkVMIHx8IGJhc3NFZmZlY3RMZXZlbCA8IExWTV9CRV9NSU5fRUZGRUNUTEVWRUwpIHsKKyAgICAgICAgcHJpbnRmKCJFcnJvcjogVW5zdXBwb3J0ZWQgQmFzcyBFZmZlY3QgTGV2ZWwgOiAlZFxuIiwKKyAgICAgICAgICAgICAgIGJhc3NFZmZlY3RMZXZlbCk7CisgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgbHZtQ29uZmlnUGFyYW1zLmJhc3NFZmZlY3RMZXZlbCA9IGJhc3NFZmZlY3RMZXZlbDsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItZXFQcmVzZXQ6IiwgMTApKSB7CisgICAgICBjb25zdCBpbnQgZXFQcmVzZXRMZXZlbCA9IGF0b2koYXJndltpXSArIDEwKTsKKyAgICAgIGNvbnN0IGludCBudW1QcmVzZXRMdmxzID0gc3RkOjpzaXplKGdFcXVhbGl6ZXJQcmVzZXRzKTsKKyAgICAgIGlmIChlcVByZXNldExldmVsID49IG51bVByZXNldEx2bHMgfHwgZXFQcmVzZXRMZXZlbCA8IDApIHsKKyAgICAgICAgcHJpbnRmKCJFcnJvcjogVW5zdXBwb3J0ZWQgRXF1YWxpemVyIFByZXNldCA6ICVkXG4iLCBlcVByZXNldExldmVsKTsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBsdm1Db25maWdQYXJhbXMuZXFQcmVzZXRMZXZlbCA9IGVxUHJlc2V0TGV2ZWw7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItYkUiKSkgeworICAgICAgbHZtQ29uZmlnUGFyYW1zLmJhc3NFbmFibGUgPSBMVk1fQkVfT047CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItZXFFIikpIHsKKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy5lcUVuYWJsZSA9IExWTV9FUU5CX09OOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXRFIikpIHsKKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy50cmVibGVFbmFibGUgPSBMVk1fVEVfT047CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItY3NFIikpIHsKKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy5jc0VuYWJsZSA9IExWTV9NT0RFX09OOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWgiKSkgeworICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaWYgKGluZmlsZSA9PSBudWxscHRyIHx8IG91dGZpbGUgPT0gbnVsbHB0cikgeworICAgIHByaW50ZigiRXJyb3I6IG1pc3NpbmcgaW5wdXQvb3V0cHV0IGZpbGVzXG4iKTsKKyAgICBwcmludFVzYWdlKCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgRklMRSAqZmlucCA9IGZvcGVuKGluZmlsZSwgInJiIik7CisgIGlmIChmaW5wID09IG51bGxwdHIpIHsKKyAgICBwcmludGYoIkNhbm5vdCBvcGVuIGlucHV0IGZpbGUgJXMiLCBpbmZpbGUpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIEZJTEUgKmZvdXQgPSBmb3BlbihvdXRmaWxlLCAid2IiKTsKKyAgaWYgKGZvdXQgPT0gbnVsbHB0cikgeworICAgIHByaW50ZigiQ2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXMiLCBvdXRmaWxlKTsKKyAgICBmY2xvc2UoZmlucCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgRWZmZWN0Q29udGV4dCBjb250ZXh0OworICBMVk1fQ29udHJvbFBhcmFtc190IHBhcmFtczsKKyAgaW50IGVyckNvZGUgPSBsdm1DcmVhdGUoJmNvbnRleHQsICZsdm1Db25maWdQYXJhbXMsICZwYXJhbXMpOworICBpZiAoZXJyQ29kZSA9PSAwKSB7CisgICAgZXJyQ29kZSA9IGx2bU1haW5Qcm9jZXNzKCZjb250ZXh0LCAmcGFyYW1zLCAmbHZtQ29uZmlnUGFyYW1zLCBmaW5wLCBmb3V0KTsKKyAgICBpZiAoZXJyQ29kZSAhPSAwKSB7CisgICAgICBwcmludGYoIkVycm9yOiBsdm1NYWluUHJvY2VzcyByZXR1cm5lZCB3aXRoIHRoZSBlcnJvcjogJWQiLGVyckNvZGUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkVycm9yOiBsdm1DcmVhdGUgcmV0dXJuZWQgd2l0aCB0aGUgZXJyb3I6ICVkIiwgZXJyQ29kZSk7CisgIH0KKyAgZmNsb3NlKGZpbnApOworICBmY2xvc2UoZm91dCk7CisgIC8qIEZyZWUgdGhlIGFsbG9jYXRlZCBidWZmZXJzICovCisgIGlmIChjb250ZXh0LnBCdW5kbGVkQ29udGV4dCAhPSBudWxscHRyKSB7CisgICAgaWYgKGNvbnRleHQucEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgIT0gbnVsbHB0cikgeworICAgICAgTHZtRWZmZWN0X2ZyZWUoJmNvbnRleHQpOworICAgIH0KKyAgICBmcmVlKGNvbnRleHQucEJ1bmRsZWRDb250ZXh0KTsKKyAgfQorCisgIGlmIChlcnJDb2RlKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvc25yLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL3Nuci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxMTBjMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL3Nuci5jcHAKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQSA9IGZsb2F0Pgorc3RkOjpwYWlyPEEsIEE+IGdldFNpZ25hbE5vaXNlKEZJTEUgKmZpbnAsIEZJTEUgKmZyZWYpIHsKKyAgY29uc3RleHByIHNpemVfdCBmcmFtZXNpemUgPSAyNTY7CisgIHN0ZDo6dmVjdG9yPFQ+IGluKGZyYW1lc2l6ZSk7CisgIHN0ZDo6dmVjdG9yPFQ+IHJlZihmcmFtZXNpemUpOworICBBIHNpZ25hbHt9OworICBBIG5vaXNle307CisKKyAgZm9yICg7OykgeworICAgIHNpemVfdCByZWFkX3NhbXBsZXNfaW4gPSBmcmVhZCgmaW5bMF0sIHNpemVvZihUKSwgZnJhbWVzaXplLCBmaW5wKTsKKyAgICBjb25zdCBzaXplX3QgcmVhZF9zYW1wbGVzX3JlZiA9IGZyZWFkKCZyZWZbMF0sIHNpemVvZihUKSwgZnJhbWVzaXplLCBmcmVmKTsKKyAgICBpZiAocmVhZF9zYW1wbGVzX2luICE9IHJlYWRfc2FtcGxlc19yZWYpIHsKKyAgICAgIHByaW50ZigiZmlsZSBzaXplcyBkbyBub3QgbWF0Y2ggKGxhc3QgJXp1ICV6dSkiLCByZWFkX3NhbXBsZXNfaW4sIHJlYWRfc2FtcGxlc19yZWYpOworICAgICAgcmVhZF9zYW1wbGVzX2luID0gc3RkOjptaW4ocmVhZF9zYW1wbGVzX2luLCByZWFkX3NhbXBsZXNfcmVmKTsKKyAgICB9CisgICAgaWYgKHJlYWRfc2FtcGxlc19pbiA9PSAwKSB7CisgICAgICAgIHJldHVybiB7IHNpZ25hbCwgbm9pc2UgfTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWFkX3NhbXBsZXNfaW47ICsraSkgeworICAgICAgIGNvbnN0IEEgdmFsdWUocmVmW2ldKTsKKyAgICAgICBjb25zdCBBIGRpZmYoQShpbltpXSkgLSB2YWx1ZSk7CisgICAgICAgc2lnbmFsICs9IHZhbHVlICogdmFsdWU7CisgICAgICAgbm9pc2UgKz0gZGlmZiAqIGRpZmY7CisgICAgfQorICB9Cit9CisKK3ZvaWQgcHJpbnRVc2FnZSgpIHsKKyAgcHJpbnRmKCJcblVzYWdlOiAiKTsKKyAgcHJpbnRmKCJcbiAgICAgc25yIDxyZWZfZmlsZT4gPHRlc3RfZmlsZT4gW29wdGlvbnNdXG4iKTsKKyAgcHJpbnRmKCJcbndoZXJlLCBcbiAgICAgPHJlZl9maWxlPiAgaXMgdGhlIHJlZmVyZW5jZSBmaWxlIG5hbWUiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgICAgICAgIG9uIHdoaWNoIHdpbGwgYmUgdGFrZW4gYXMgcHVyZSBzaWduYWwiKTsKKyAgcHJpbnRmKCJcbiAgICAgPHRlc3RfZmlsZT4gaXMgdGVzdCBmaWxlIGZvciBzbnIgY2FsY3VsYXRpb24iKTsKKyAgcHJpbnRmKCJcbiAgICAgYW5kIG9wdGlvbnMgYXJlIG1lbnRpb25lZCBiZWxvdyIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1wY21fZm9ybWF0OjxwY20gZm9ybWF0IG9mIGlucHV0IGZpbGVzPiIpOworICBwcmludGYoIlxuICAgICAgICAgICAwIC0gMTYgYml0IHBjbSIpOworICBwcmludGYoIlxuICAgICAgICAgICAxIC0gMzIgYml0IGZsb2F0Iik7CisgIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgMCIpOworICBwcmludGYoIlxuICAgICAtdGhyOjx0aHJlc2hvbGQgdmFsdWU+Iik7CisgIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgLSBuZWdhdGl2ZSBpbmZpbml0eVxuXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgeworICBpZiAoYXJnYyA8IDMpIHsKKyAgICBwcmludFVzYWdlKCk7CisgICAgcmV0dXJuIC0xOworICB9CisgIGludCBwY21fZm9ybWF0ID0gMDsKKyAgZmxvYXQgdGhyID0gLSBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKTsKKyAgRklMRSAqZnJlZiA9IGZvcGVuKGFyZ3ZbMV0sICJyYiIpOworICBGSUxFICpmaW5wID0gZm9wZW4oYXJndlsyXSwgInJiIik7CisgIGZvciAoaW50IGkgPSAzOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItcGNtX2Zvcm1hdDoiLCAxMikpIHsKKyAgICAgIHBjbV9mb3JtYXQgPSBhdG9pKGFyZ3ZbaV0gKyAxMik7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLXRocjoiLCA1KSkgeworICAgICAgdGhyID0gYXRvZihhcmd2W2ldICsgNSk7CisgICAgfQorICB9CisgIGlmIChmaW5wID09IG51bGxwdHIgfHwgZnJlZiA9PSBudWxscHRyKSB7CisgICAgcHJpbnRmKCJcbkVycm9yOiBtaXNzaW5nIGlucHV0L3JlZmVyZW5jZSBmaWxlc1xuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGF1dG8gc24gPSBwY21fZm9ybWF0ID09IDAKKyAgICAgID8gZ2V0U2lnbmFsTm9pc2U8c2hvcnQ+KGZpbnAsIGZyZWYpCisgICAgICA6IGdldFNpZ25hbE5vaXNlPGZsb2F0PihmaW5wLCBmcmVmKTsKKyAgaWYgKHNuLmZpcnN0ID4gMC5mICYmIHNuLnNlY29uZCA+IDAuZikgeworICAgIGZsb2F0IHNuciA9IDEwLmYgKiBsb2coc24uZmlyc3QgLyBzbi5zZWNvbmQpOworICAgIC8vIGNvbXBhcmUgdGhlIG1lYXN1cmVkIHNuciB2YWx1ZSB3aXRoIHRocmVzaG9sZAorICAgIGlmIChzbnIgPCB0aHIpIHsKKyAgICAgIHByaW50ZigiJS42ZiBsZXNzIHRoYW4gdGhyZXNob2xkICUuNmZcbiIsIHNuciwgdGhyKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRmKCIlLjZmXG4iLCBzbnIpOworICAgIH0KKyAgfQorICBmY2xvc2UoZmlucCk7CisgIGZjbG9zZShmcmVmKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5icAppbmRleCAxMGZkOTcwLi4xNmZhMTI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwCkBAIC0xOCw2ICsxOCw3IEBACiAgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKICAgICAgICAgIi1EQlVJTERfRkxPQVQiLAogICAgICAgICAiLURISUdIRVJfRlMiLAorICAgICAgICAiLURTVVBQT1JUX01DIiwKIAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAppbmRleCA1M2QyNjZhLi4wYzZmOGRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKQEAgLTQzNSw3ICs0MzUsNyBAQAogICAgICAgICAgICAgKHBTZXNzaW9uQ29udGV4dC0+YkVxdWFsaXplckluc3RhbnRpYXRlZCA9PUxWTV9GQUxTRSkgJiYKICAgICAgICAgICAgIChwU2Vzc2lvbkNvbnRleHQtPmJWaXJ0dWFsaXplckluc3RhbnRpYXRlZD09TFZNX0ZBTFNFKSkKICAgICB7Ci0gICAgICAgICNpZmRlZiBMVk1fUENNCisjaWZkZWYgTFZNX1BDTQogICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIgIT0gTlVMTCkgewogICAgICAgICAgICAgZmNsb3NlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyID0gTlVMTDsKQEAgLTQ0NCw3ICs0NDQsNyBAQAogICAgICAgICAgICAgZmNsb3NlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21PdXRQdHIgPSBOVUxMOwogICAgICAgICB9Ci0gICAgICAgICNlbmRpZgorI2VuZGlmCiAKIAogICAgICAgICAvLyBDbGVhciB0aGUgU2Vzc2lvbkluZGV4CkBAIC03NTEsMTkgKzc1MSwyMSBAQAogCiAgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7ICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAgICAgZWZmZWN0X2J1ZmZlcl90ICAgICAgICAgKnBPdXRUbXA7CisgICAgY29uc3QgTFZNX0lOVDMyIE5yQ2hhbm5lbHMgPQorICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyk7CiAjaWZuZGVmIE5BVElWRV9GTE9BVF9CVUZGRVIKICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyID09IG51bGxwdHIgfHwKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPCBmcmFtZUNvdW50KSB7CiAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyKTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyID0KLSAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihMVk1fRkxPQVQpICogRkNDXzIpOworICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKExWTV9GTE9BVCkgKiBOckNoYW5uZWxzKTsKICAgICB9CiAKICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciA9PSBudWxscHRyIHx8CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50IDwgZnJhbWVDb3VudCkgewogICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIpOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID0KLSAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihMVk1fRkxPQVQpICogRkNDXzIpOworICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKExWTV9GTE9BVCkgKiBOckNoYW5uZWxzKTsKICAgICB9CiAKICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyID09IG51bGxwdHIgfHwKQEAgLTc4NCw3ICs3ODYsNyBAQAogICAgICAgICAgICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgKGVmZmVjdF9idWZmZXJfdCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIEZDQ18yKTsKKyAgICAgICAgICAgICAgICAgICAgKGVmZmVjdF9idWZmZXJfdCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIE5yQ2hhbm5lbHMpOwogICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwogICAgICAgICAgICAgfQpAQCAtNzk4LDEzICs4MDAsMTUgQEAKIAogI2lmZGVmIExWTV9QQ00KICAgICBmd3JpdGUocEluLAotICAgICAgICAgICAgZnJhbWVDb3VudCpzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIEZDQ18yLCAxLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0cik7CisgICAgICAgICAgIGZyYW1lQ291bnQgKiBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIE5yQ2hhbm5lbHMsCisgICAgICAgICAgIDEsCisgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKICAgICBmZmx1c2gocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOwogI2VuZGlmCiAKICNpZm5kZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgogICAgIC8qIENvbnZlcnRpbmcgaW5wdXQgZGF0YSBmcm9tIGZpeGVkIHBvaW50IHRvIGZsb2F0IHBvaW50ICovCi0gICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KHBJbnB1dEJ1ZmYsIHBJbiwgZnJhbWVDb3VudCAqIEZDQ18yKTsKKyAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYocElucHV0QnVmZiwgcEluLCBmcmFtZUNvdW50ICogTnJDaGFubmVscyk7CiAKICAgICAvKiBQcm9jZXNzIHRoZSBzYW1wbGVzICovCiAgICAgTHZtU3RhdHVzID0gTFZNX1Byb2Nlc3MocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KQEAgLTgxNCw3ICs4MTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXVkaW8gVGltZSAqLwogCiAgICAgLyogQ29udmVydGluZyBvdXRwdXQgZGF0YSBmcm9tIGZsb2F0IHBvaW50IHRvIGZpeGVkIHBvaW50ICovCi0gICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KHBPdXRUbXAsIHBPdXRwdXRCdWZmLCBmcmFtZUNvdW50ICogRkNDXzIpOworICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChwT3V0VG1wLCBwT3V0cHV0QnVmZiwgZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHMpOwogCiAjZWxzZQogICAgIC8qIFByb2Nlc3MgdGhlIHNhbXBsZXMgKi8KQEAgLTgyOSwxMiArODMzLDE0IEBACiAKICNpZmRlZiBMVk1fUENNCiAgICAgZndyaXRlKHBPdXRUbXAsCi0gICAgICAgICAgICBmcmFtZUNvdW50KnNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogRkNDXzIsIDEsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CisgICAgICAgICAgIGZyYW1lQ291bnQgKiBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIE5yQ2hhbm5lbHMsCisgICAgICAgICAgIDEsCisgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CiAgICAgZmZsdXNoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0cik7CiAjZW5kaWYKIAogICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQgKiBGQ0NfMjsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHM7IGkrKykgewogI2lmbmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCiAgICAgICAgICAgICBwT3V0W2ldID0gY2xhbXAxNigoTFZNX0lOVDMyKXBPdXRbaV0gKyAoTFZNX0lOVDMyKXBPdXRUbXBbaV0pOwogI2Vsc2UKQEAgLTEyMzIsNDUgKzEyMzgsNTggQEAKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlID09IHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCk7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIENIRUNLX0FSRyhhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpIDw9IExWTV9NQVhfQ0hBTk5FTFMpOworI2Vsc2UKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKKyNlbmRpZgogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURQogICAgICAgICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IEVGRkVDVF9CVUZGRVJfRk9STUFUKTsKICAgICBwQ29udGV4dC0+Y29uZmlnID0gKnBDb25maWc7CisgICAgY29uc3QgTFZNX0lOVDE2IE5yQ2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOwogCiAgICAgc3dpdGNoIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpIHsKICAgICBjYXNlIDgwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfODAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDgwMDAqMjsgLy8gMiBzZWNzIFN0ZXJlbworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gODAwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMTYwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTYwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAxNjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAxNjAwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMjIwNTA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMjIwNTA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAyMjA1MCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAyMjA1MCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMzIwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMzIwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAzMjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAzMjAwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgNDQxMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0NDEwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0NDEwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgNDgwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfNDgwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0ODAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0ODAwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgIGNhc2UgODgyMDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfODgyMDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA4ODIwMCAqIE5yQ2hhbm5lbHM7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgOTYwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfOTYwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA5NjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA5NjAwMCAqIE5yQ2hhbm5lbHM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTc2NDAwOgorICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE3NjQwMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE3NjQwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMTkyMDAwOgogICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE5MjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE5MjAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAxOTIwMDAgKiBOckNoYW5uZWxzOwogICAgICAgICBicmVhazsKICNlbmRpZgogICAgIGRlZmF1bHQ6CkBAIC0xMjk0LDYgKzEzMTMsMTAgQEAKIAogICAgICAgICBBY3RpdmVQYXJhbXMuU2FtcGxlUmF0ZSA9IFNhbXBsZVJhdGU7CiAKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIEFjdGl2ZVBhcmFtcy5OckNoYW5uZWxzID0gTnJDaGFubmVsczsKKyNlbmRpZgorCiAgICAgICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogCiAgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiRWZmZWN0X3NldENvbmZpZyIpCkBAIC0xNDk4LDYgKzE1MjEsNyBAQAogICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU6CiAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM6CiAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VUOgorICAgIC8vIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOiAgLy8gRm9yIFVTQiB0ZXN0aW5nIG9mIHRoZSB2aXJ0dWFsaXplciBvbmx5LgogICAgICAgICByZXR1cm4gMDsKICAgICBkZWZhdWx0IDoKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC0xNTIwLDEwICsxNTQ0LDkgQEAKIGludCBWaXJ0dWFsaXplcklzQ29uZmlndXJhdGlvblN1cHBvcnRlZChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUpIHsKICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOwotICAgIGlmICgoY2hhbm5lbENvdW50ID09IDApIHx8IChjaGFubmVsQ291bnQgPiAyKSkgeworICAgIGlmIChjaGFubmVsQ291bnQgPCAxIHx8IGNoYW5uZWxDb3VudCA+IEZDQ18yKSB7IC8vIFRPRE86IHVwZGF0ZSB0byA4IGNoYW5uZWxzIHdoZW4gc3VwcG9ydGVkLgogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9Ci0KICAgICByZXR1cm4gVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZChkZXZpY2VUeXBlKTsKIH0KIApAQCAtMzIxNiw2ICszMjM5LDcgQEAKICAgICBFZmZlY3RDb250ZXh0ICogcENvbnRleHQgPSAoRWZmZWN0Q29udGV4dCAqKSBzZWxmOwogICAgIGludCAgICBzdGF0dXMgPSAwOwogICAgIGludCAgICBwcm9jZXNzU3RhdHVzID0gMDsKKyAgICBjb25zdCBpbnQgTnJDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKIAogLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzcyBTdGFydCA6IEVuYWJsZWQgPSAlZCAgICAgQ2FsbGVkID0gJWQgKCU4ZCAlOGQgJThkKSIsCiAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQsCkBAIC0zMjQ2LDcgKzMyNzAsNyBAQAogICAgICAgICAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpKXsKICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIExWTV9CQVNTX0JPT1NUIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOwogICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA+IDApewotICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMjsgLy8gU1RFUkVPCisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBOckNoYW5uZWxzOwogICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzczogV2FpdGluZyB0byB0dXJuIG9mZiBCQVNTX0JPT1NULCAlZCBzYW1wbGVzIGxlZnQiLAogICAgICAgICAgICAgLy8gICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIpOwogICAgICAgICB9CkBAIC0zMjY2LDcgKzMyOTAsNyBAQAogICAgICAgICAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUikpewogICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgTFZNX0VRVUFMSVpFUiBFZmZlY3QgaXMgbm90IGVuYWJsZWQiKTsKICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPiAwKXsKLSAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxIC09IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIDI7IC8vIFNURVJFTworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogTnJDaGFubmVsczsKICAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3M6IFdhaXRpbmcgdG8gdHVybiBvZmYgRVFVQUxJWkVSLCAlZCBzYW1wbGVzIGxlZnQiLAogICAgICAgICAgICAgLy8gICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEpOwogICAgICAgICB9CkBAIC0zMjgwLDcgKzMzMDQsOCBAQAogICAgICAgICAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSl7CiAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBMVk1fVklSVFVBTElaRVIgRWZmZWN0IGlzIG5vdCBlbmFibGVkIik7CiAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPiAwKXsKLSAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMjsvLyBTVEVSRU8KKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgLT0KKyAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBOckNoYW5uZWxzOwogICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzczogV2FpdGluZyBmb3IgdG8gdHVybiBvZmYgVklSVFVBTElaRVIsICVkIHNhbXBsZXMgbGVmdCIsCiAgICAgICAgICAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0KTsKICAgICAgICAgfQpAQCAtMzMzMSw3ICszMzU2LDcgQEAKICAgICAgICAgLy9wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkLCBwQ29udGV4dC0+RWZmZWN0VHlwZSk7CiAKICAgICAgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBGQ0NfMjsgKytpKXsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogTnJDaGFubmVsczsgKytpKSB7CiAjaWZkZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgogICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZjMyW2ldICs9IGluQnVmZmVyLT5mMzJbaV07CiAjZWxzZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKaW5kZXggZDU1ODE2OS4uNjAyZjYwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCkBAIC02NzUsOSArNjc1LDE1IEBACiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfNDgwMDA7CiAgICAgICAgIGJyZWFrOwogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQorICAgIGNhc2UgODgyMDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfODgyMDA7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgOTYwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfOTYwMDA7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTc2NDAwOgorICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE3NjQwMDsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAxOTIwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTkyMDAwOwogICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKaW5kZXggNzA0MDlkZS4uMzVlMmYzZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsKQEAgLTksNiArOSw3IEBACiAKIExPQ0FMX0NGTEFHUys9IC1PMiAtZnZpc2liaWxpdHk9aGlkZGVuCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1EQlVJTERfRkxPQVQgLURTVVBQT1JUX01DCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYmN1dGlscyBcCkBAIC0xOSw3ICsyMCw4IEBACiBMT0NBTF9NT0RVTEU6PSBsaWJ2aXN1YWxpemVyCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAotCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKQorCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCisJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQogCiAKIExPQ0FMX0hFQURFUl9MSUJSQVJJRVMgKz0gbGliaGFyZHdhcmVfaGVhZGVycwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCmluZGV4IDgwN2YyNGQuLjAwYmMzNzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKQEAgLTI0LDExICsyNCwyMyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHRpbWUuaD4KIAorI2luY2x1ZGUgPGFsZ29yaXRobT4gLy8gbWF4CiAjaW5jbHVkZSA8bmV3PgogCiAjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiAjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfdmlzdWFsaXplci5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKworI2lmZGVmIEJVSUxEX0ZMT0FUCisKK3N0YXRpYyBjb25zdGV4cHIgYXVkaW9fZm9ybWF0X3Qga1Byb2Nlc3NGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworCisjZWxzZQorCitzdGF0aWMgY29uc3RleHByIGF1ZGlvX2Zvcm1hdF90IGtQcm9jZXNzRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogCiBleHRlcm4gIkMiIHsKIApAQCAtMTQzLDEwICsxNTUsMTUgQEAKICAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlICE9IHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUpIHJldHVybiAtRUlOVkFMOwogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyAhPSBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMpIHJldHVybiAtRUlOVkFMOwogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCkgcmV0dXJuIC1FSU5WQUw7Ci0gICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgcmV0dXJuIC1FSU5WQUw7CisgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgaWYgKGNoYW5uZWxDb3VudCA8IDEgfHwgY2hhbm5lbENvdW50ID4gRkNDXzgpIHJldHVybiAtRUlOVkFMOworI2Vsc2UKKyAgICBpZiAoY2hhbm5lbENvdW50ICE9IEZDQ18yKSByZXR1cm4gLUVJTlZBTDsKKyNlbmRpZgogICAgIGlmIChwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSAhPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSAmJgogICAgICAgICAgICAgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgIT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgcmV0dXJuIC1FSU5WQUw7Ci0gICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBrUHJvY2Vzc0Zvcm1hdCkgcmV0dXJuIC1FSU5WQUw7CiAKICAgICBwQ29udGV4dC0+bUNvbmZpZyA9ICpwQ29uZmlnOwogCkBAIC0xOTIsNyArMjA5LDcgQEAKIHsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBrUHJvY2Vzc0Zvcm1hdDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwpAQCAtMjAwLDcgKzIxNyw3IEBACiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBrUHJvY2Vzc0Zvcm1hdDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwpAQCAtMzAxLDE1ICszMTgsOCBAQAogLy8tLS0gRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uCiAvLwogCi1zdGF0aWMgaW5saW5lIGludDE2X3QgY2xhbXAxNihpbnQzMl90IHNhbXBsZSkKLXsKLSAgICBpZiAoKHNhbXBsZT4+MTUpIF4gKHNhbXBsZT4+MzEpKQotICAgICAgICBzYW1wbGUgPSAweDdGRkYgXiAoc2FtcGxlPj4zMSk7Ci0gICAgcmV0dXJuIHNhbXBsZTsKLX0KLQogaW50IFZpc3VhbGl6ZXJfcHJvY2VzcygKLSAgICAgICAgZWZmZWN0X2hhbmRsZV90IHNlbGYsYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKQorICAgICAgICBlZmZlY3RfaGFuZGxlX3Qgc2VsZiwgYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKQogewogICAgIFZpc3VhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoVmlzdWFsaXplckNvbnRleHQgKilzZWxmOwogCkBAIC0zMjQsNzEgKzMzNCwxMTggQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCisgICAgY29uc3Qgc2l6ZV90IHNhbXBsZUxlbiA9IGluQnVmZmVyLT5mcmFtZUNvdW50ICogcENvbnRleHQtPm1DaGFubmVsQ291bnQ7CisKICAgICAvLyBwZXJmb3JtIG1lYXN1cmVtZW50cyBpZiBuZWVkZWQKICAgICBpZiAocENvbnRleHQtPm1NZWFzdXJlbWVudE1vZGUgJiBNRUFTVVJFTUVOVF9NT0RFX1BFQUtfUk1TKSB7CiAgICAgICAgIC8vIGZpbmQgdGhlIHBlYWsgYW5kIFJNUyBzcXVhcmVkIGZvciB0aGUgbmV3IGJ1ZmZlcgotICAgICAgICB1aW50MzJfdCBpbklkeDsKLSAgICAgICAgaW50MTZfdCBtYXhTYW1wbGUgPSAwOwogICAgICAgICBmbG9hdCBybXNTcUFjYyA9IDA7Ci0gICAgICAgIGZvciAoaW5JZHggPSAwIDsgaW5JZHggPCBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAqIHBDb250ZXh0LT5tQ2hhbm5lbENvdW50IDsgaW5JZHgrKykgewotICAgICAgICAgICAgaWYgKGluQnVmZmVyLT5zMTZbaW5JZHhdID4gbWF4U2FtcGxlKSB7Ci0gICAgICAgICAgICAgICAgbWF4U2FtcGxlID0gaW5CdWZmZXItPnMxNltpbklkeF07Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKC1pbkJ1ZmZlci0+czE2W2luSWR4XSA+IG1heFNhbXBsZSkgewotICAgICAgICAgICAgICAgIG1heFNhbXBsZSA9IC1pbkJ1ZmZlci0+czE2W2luSWR4XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJtc1NxQWNjICs9IChpbkJ1ZmZlci0+czE2W2luSWR4XSAqIGluQnVmZmVyLT5zMTZbaW5JZHhdKTsKKworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGZsb2F0IG1heFNhbXBsZSA9IDAuZjsKKyAgICAgICAgZm9yIChzaXplX3QgaW5JZHggPSAwOyBpbklkeCA8IHNhbXBsZUxlbjsgKytpbklkeCkgeworICAgICAgICAgICAgbWF4U2FtcGxlID0gZm1heChtYXhTYW1wbGUsIGZhYnMoaW5CdWZmZXItPmYzMltpbklkeF0pKTsKKyAgICAgICAgICAgIHJtc1NxQWNjICs9IGluQnVmZmVyLT5mMzJbaW5JZHhdICogaW5CdWZmZXItPmYzMltpbklkeF07CiAgICAgICAgIH0KKyAgICAgICAgbWF4U2FtcGxlICo9IDEgPDwgMTU7IC8vIHNjYWxlIHRvIGludDE2X3QsIHdpdGggZXhhY3RseSAxIDw8IDE1IHJlcHJlc2VudGluZyBwb3NpdGl2ZSBudW0uCisgICAgICAgIHJtc1NxQWNjICo9IDEgPDwgMzA7IC8vIHNjYWxlIHRvIGludDE2X3QgKiAyCisjZWxzZQorICAgICAgICBpbnQgbWF4U2FtcGxlID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaW5JZHggPSAwOyBpbklkeCA8IHNhbXBsZUxlbjsgKytpbklkeCkgeworICAgICAgICAgICAgbWF4U2FtcGxlID0gc3RkOjptYXgobWF4U2FtcGxlLCBzdGQ6OmFicyhpbnQzMl90KGluQnVmZmVyLT5zMTZbaW5JZHhdKSkpOworICAgICAgICAgICAgcm1zU3FBY2MgKz0gaW5CdWZmZXItPnMxNltpbklkeF0gKiBpbkJ1ZmZlci0+czE2W2luSWR4XTsKKyAgICAgICAgfQorI2VuZGlmCiAgICAgICAgIC8vIHN0b3JlIHRoZSBtZWFzdXJlbWVudAogICAgICAgICBwQ29udGV4dC0+bVBhc3RNZWFzdXJlbWVudHNbcENvbnRleHQtPm1NZWFzdXJlbWVudEJ1ZmZlcklkeF0ubVBlYWtVMTYgPSAodWludDE2X3QpbWF4U2FtcGxlOwogICAgICAgICBwQ29udGV4dC0+bVBhc3RNZWFzdXJlbWVudHNbcENvbnRleHQtPm1NZWFzdXJlbWVudEJ1ZmZlcklkeF0ubVJtc1NxdWFyZWQgPQotICAgICAgICAgICAgICAgIHJtc1NxQWNjIC8gKGluQnVmZmVyLT5mcmFtZUNvdW50ICogcENvbnRleHQtPm1DaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgIHJtc1NxQWNjIC8gc2FtcGxlTGVuOwogICAgICAgICBwQ29udGV4dC0+bVBhc3RNZWFzdXJlbWVudHNbcENvbnRleHQtPm1NZWFzdXJlbWVudEJ1ZmZlcklkeF0ubUlzVmFsaWQgPSB0cnVlOwogICAgICAgICBpZiAoKytwQ29udGV4dC0+bU1lYXN1cmVtZW50QnVmZmVySWR4ID49IHBDb250ZXh0LT5tTWVhc3VyZW1lbnRXaW5kb3dTaXplSW5CdWZmZXJzKSB7CiAgICAgICAgICAgICBwQ29udGV4dC0+bU1lYXN1cmVtZW50QnVmZmVySWR4ID0gMDsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIGFsbCBjb2RlIGJlbG93IGFzc3VtZXMgc3RlcmVvIDE2IGJpdCBQQ00gb3V0cHV0IGFuZCBpbnB1dAorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgZmxvYXQgZnNjYWxlOyAvLyBtdWx0aXBsaWNhdGl2ZSBzY2FsZQorI2Vsc2UKICAgICBpbnQzMl90IHNoaWZ0OworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAKICAgICBpZiAocENvbnRleHQtPm1TY2FsaW5nTW9kZSA9PSBWSVNVQUxJWkVSX1NDQUxJTkdfTU9ERV9OT1JNQUxJWkVEKSB7CiAgICAgICAgIC8vIGRlcml2ZSBjYXB0dXJlIHNjYWxpbmcgZmFjdG9yIGZyb20gcGVhayB2YWx1ZSBpbiBjdXJyZW50IGJ1ZmZlcgogICAgICAgICAvLyB0aGlzIGdpdmVzIG1vcmUgaW50ZXJlc3RpbmcgY2FwdHVyZXMgZm9yIGRpc3BsYXkuCi0gICAgICAgIHNoaWZ0ID0gMzI7Ci0gICAgICAgIGludCBsZW4gPSBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAqIDI7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGZsb2F0IG1heFNhbXBsZSA9IDAuZjsKKyAgICAgICAgZm9yIChzaXplX3QgaW5JZHggPSAwOyBpbklkeCA8IHNhbXBsZUxlbjsgKSB7CisgICAgICAgICAgICAvLyB3ZSByZWNvbnN0cnVjdCB0aGUgYWN0dWFsIHN1bW1lZCB2YWx1ZSB0byBlbnN1cmUgcHJvcGVyIG5vcm1hbGl6YXRpb24KKyAgICAgICAgICAgIC8vIGZvciBtdWx0aWNoYW5uZWwgb3V0cHV0cyAoY2hhbm5lbHMgPiAyIG1heSBvZnRlbiBiZSAwKS4KKyAgICAgICAgICAgIGZsb2F0IHNtcCA9IDAuZjsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcENvbnRleHQtPm1DaGFubmVsQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIHNtcCArPSBpbkJ1ZmZlci0+ZjMyW2luSWR4KytdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF4U2FtcGxlID0gZm1heChtYXhTYW1wbGUsIGZhYnMoc21wKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1heFNhbXBsZSA+IDAuZikgeworICAgICAgICAgICAgZnNjYWxlID0gMTI3LmYgLyBtYXhTYW1wbGU7CisgICAgICAgICAgICBpbnQgZXhwOyAvLyB1bnVzZWQKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHNpZ25pZmljYW5kID0gZnJleHAoZnNjYWxlLCAmZXhwKTsKKyAgICAgICAgICAgIGlmIChzaWduaWZpY2FuZCA9PSAwLjVmKSB7CisgICAgICAgICAgICAgICAgZnNjYWxlICo9IDI1NS5mIC8gMjU2LmY7IC8vIGF2b2lkIHJldHVybmluZyB1bmFsdGVyZWQgUENNIHNpZ25hbAorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc2NhbGUgZG9lc24ndCBtYXR0ZXIsIHRoZSB2YWx1ZXMgYXJlIGFsbCAwLgorICAgICAgICAgICAgZnNjYWxlID0gMS5mOworICAgICAgICB9CisjZWxzZQorICAgICAgICBpbnQzMl90IG9yQWNjdW0gPSAwOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNhbXBsZUxlbjsgKytpKSB7CiAgICAgICAgICAgICBpbnQzMl90IHNtcCA9IGluQnVmZmVyLT5zMTZbaV07CiAgICAgICAgICAgICBpZiAoc21wIDwgMCkgc21wID0gLXNtcCAtIDE7IC8vIHRha2UgY2FyZSB0byBrZWVwIHRoZSBtYXggbmVnYXRpdmUgaW4gcmFuZ2UKLSAgICAgICAgICAgIGludDMyX3QgY2x6ID0gX19idWlsdGluX2NseihzbXApOwotICAgICAgICAgICAgaWYgKHNoaWZ0ID4gY2x6KSBzaGlmdCA9IGNsejsKKyAgICAgICAgICAgIG9yQWNjdW0gfD0gc21wOwogICAgICAgICB9CisKICAgICAgICAgLy8gQSBtYXhpbXVtIGFtcGxpdHVkZSBzaWduYWwgd2lsbCBoYXZlIDE3IGxlYWRpbmcgemVyb3MsIHdoaWNoIHdlIHdhbnQgdG8KICAgICAgICAgLy8gdHJhbnNsYXRlIHRvIGEgc2hpZnQgb2YgOCAoZm9yIGNvbnZlcnRpbmcgMTYgYml0IHRvIDggYml0KQotICAgICAgICBzaGlmdCA9IDI1IC0gc2hpZnQ7CisgICAgICAgIHNoaWZ0ID0gMjUgLSBfX2J1aWx0aW5fY2x6KG9yQWNjdW0pOworCiAgICAgICAgIC8vIE5ldmVyIHNjYWxlIGJ5IGxlc3MgdGhhbiA4IHRvIGF2b2lkIHJldHVybmluZyB1bmFsdGVyZWQgUENNIHNpZ25hbC4KICAgICAgICAgaWYgKHNoaWZ0IDwgMykgewogICAgICAgICAgICAgc2hpZnQgPSAzOwogICAgICAgICB9CiAgICAgICAgIC8vIGFkZCBvbmUgdG8gY29tYmluZSB0aGUgZGl2aXNpb24gYnkgMiBuZWVkZWQgYWZ0ZXIgc3VtbWluZyBsZWZ0IGFuZCByaWdodCBjaGFubmVscyBiZWxvdwogICAgICAgICBzaGlmdCsrOworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAgICAgfSBlbHNlIHsKICAgICAgICAgYXNzZXJ0KHBDb250ZXh0LT5tU2NhbGluZ01vZGUgPT0gVklTVUFMSVpFUl9TQ0FMSU5HX01PREVfQVNfUExBWUVEKTsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICAvLyBOb3RlOiBpZiBjaGFubmVscyBhcmUgdW5jb3JyZWxhdGVkLCAxL3NxcnQoTikgY291bGQgYmUgdXNlZCBhdCB0aGUgcmlzayBvZiBjbGlwcGluZy4KKyAgICAgICAgZnNjYWxlID0gMS5mIC8gcENvbnRleHQtPm1DaGFubmVsQ291bnQ7ICAvLyBhY2NvdW50IGZvciBzdW1taW5nIGFsbCB0aGUgY2hhbm5lbHMgdG9nZXRoZXIuCisjZWxzZQogICAgICAgICBzaGlmdCA9IDk7CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKICAgICB9CiAKICAgICB1aW50MzJfdCBjYXB0SWR4OwogICAgIHVpbnQzMl90IGluSWR4OwogICAgIHVpbnQ4X3QgKmJ1ZiA9IHBDb250ZXh0LT5tQ2FwdHVyZUJ1ZjsKICAgICBmb3IgKGluSWR4ID0gMCwgY2FwdElkeCA9IHBDb250ZXh0LT5tQ2FwdHVyZUlkeDsKLSAgICAgICAgIGluSWR4IDwgaW5CdWZmZXItPmZyYW1lQ291bnQ7Ci0gICAgICAgICBpbklkeCsrLCBjYXB0SWR4KyspIHsKLSAgICAgICAgaWYgKGNhcHRJZHggPj0gQ0FQVFVSRV9CVUZfU0laRSkgewotICAgICAgICAgICAgLy8gd3JhcCBhcm91bmQKLSAgICAgICAgICAgIGNhcHRJZHggPSAwOworICAgICAgICAgaW5JZHggPCBzYW1wbGVMZW47CisgICAgICAgICBjYXB0SWR4KyspIHsKKyAgICAgICAgaWYgKGNhcHRJZHggPj0gQ0FQVFVSRV9CVUZfU0laRSkgY2FwdElkeCA9IDA7IC8vIHdyYXAKKworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGZsb2F0IHNtcCA9IDAuZjsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBDb250ZXh0LT5tQ2hhbm5lbENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHNtcCArPSBpbkJ1ZmZlci0+ZjMyW2luSWR4KytdOwogICAgICAgICB9Ci0gICAgICAgIGludDMyX3Qgc21wID0gaW5CdWZmZXItPnMxNlsyICogaW5JZHhdICsgaW5CdWZmZXItPnMxNlsyICogaW5JZHggKyAxXTsKLSAgICAgICAgc21wID0gc21wID4+IHNoaWZ0OworICAgICAgICBidWZbY2FwdElkeF0gPSBjbGFtcDhfZnJvbV9mbG9hdChzbXAgKiBmc2NhbGUpOworI2Vsc2UKKyAgICAgICAgY29uc3QgaW50MzJfdCBzbXAgPSAoaW5CdWZmZXItPnMxNltpbklkeF0gKyBpbkJ1ZmZlci0+czE2W2luSWR4ICsgMV0pID4+IHNoaWZ0OworICAgICAgICBpbklkeCArPSBGQ0NfMjsgIC8vIGludGVnZXIgc3VwcG9ydHMgc3RlcmVvIG9ubHkuCiAgICAgICAgIGJ1ZltjYXB0SWR4XSA9ICgodWludDhfdClzbXApXjB4ODA7CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKICAgICB9CiAKICAgICAvLyBYWFggdGhlIGZvbGxvd2luZyB0d28gc2hvdWxkIHJlYWxseSBiZSBhdG9taWMsIHRob3VnaCBpdCBwcm9iYWJseSBkb2Vzbid0CkBAIC00MDAsNiArNDU3LDE1IEBACiAgICAgfQogCiAgICAgaWYgKGluQnVmZmVyLT5yYXcgIT0gb3V0QnVmZmVyLT5yYXcpIHsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBpZiAocENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzYW1wbGVMZW47ICsraSkgeworICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZjMyW2ldICs9IGluQnVmZmVyLT5mMzJbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5yYXcsIGluQnVmZmVyLT5yYXcsIHNhbXBsZUxlbiAqIHNpemVvZihmbG9hdCkpOworICAgICAgICB9CisjZWxzZQogICAgICAgICBpZiAocENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgewogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRCdWZmZXItPmZyYW1lQ291bnQqMjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5zMTZbaV0gPSBjbGFtcDE2KG91dEJ1ZmZlci0+czE2W2ldICsgaW5CdWZmZXItPnMxNltpXSk7CkBAIC00MDcsNiArNDczLDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnJhdywgaW5CdWZmZXItPnJhdywgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMiAqIHNpemVvZihpbnQxNl90KSk7CiAgICAgICAgIH0KKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogICAgIH0KICAgICBpZiAocENvbnRleHQtPm1TdGF0ZSAhPSBWSVNVQUxJWkVSX1NUQVRFX0FDVElWRSkgewogICAgICAgICByZXR1cm4gLUVOT0RBVEE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAgYi9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAKaW5kZXggMDFmMDE0Zi4uYTk3NzMwMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuY3BwCisrKyBiL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcApAQCAtODYsNyArODYsNyBAQAogICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7CiAgICAgc3RkOjp1bmlxdWVfcHRyPEhlaWZTdHJlYW0+IG1TdHJlYW07CiAgICAgYm9vbCBtRU9TOwotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90PiBtQ2FjaGU7CisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gbUNhY2hlOwogICAgIG9mZjY0X3QgbUNhY2hlZE9mZnNldDsKICAgICBzaXplX3QgbUNhY2hlZFNpemU7CiAgICAgc2l6ZV90IG1DYWNoZUJ1ZmZlclNpemU7CkBAIC0xNjUsNyArMTY1LDcgQEAKICAgICAgICAgLy8gaXQncyByZWFjaGluZyBtYXggY2FjaGUgYnVmZmVyIHNpemUsIG5lZWQgdG8gcm9sbCB3aW5kb3csIGFuZCBwb3NzaWJseQogICAgICAgICAvLyBleHBhbmQgdGhlIGNhY2hlIGJ1ZmZlci4KICAgICAgICAgc2l6ZV90IG5ld0NhY2hlQnVmZmVyU2l6ZSA9IG1DYWNoZUJ1ZmZlclNpemU7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90PiBuZXdDYWNoZTsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gbmV3Q2FjaGU7CiAgICAgICAgIHVpbnQ4X3QqIGRzdCA9IG1DYWNoZS5nZXQoKTsKICAgICAgICAgaWYgKG5ld0NhY2hlQnVmZmVyU2l6ZSA8IGtNYXhDYWNoZUJ1ZmZlclNpemUpIHsKICAgICAgICAgICAgIG5ld0NhY2hlQnVmZmVyU2l6ZSA9IGtNYXhDYWNoZUJ1ZmZlclNpemU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWlmL2luY2x1ZGUvSGVpZkRlY29kZXJBUEkuaCBiL21lZGlhL2xpYmhlaWYvaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oCmluZGV4IDUxODNjMzkuLmFhMTBmMzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmhlaWYvaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oCisrKyBiL21lZGlhL2xpYmhlaWYvaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oCkBAIC03NCw3ICs3NCw3IEBACiAgICAgaW50MzJfdCAgbVJvdGF0aW9uQW5nbGU7ICAgICAgICAgICAvLyBSb3RhdGlvbiBhbmdsZSwgY2xvY2t3aXNlLCBzaG91bGQgYmUgbXVsdGlwbGUgb2YgOTAKICAgICB1aW50MzJfdCBtQnl0ZXNQZXJQaXhlbDsgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBmb3Igb25lIHBpeGVsCiAgICAgdWludDMyX3QgbUljY1NpemU7ICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgaW4gbUljY0RhdGEKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdD4gbUljY0RhdGE7IC8vIEFjdHVhbCBJQ0MgZGF0YSwgbWVtb3J5IGlzIG93bmVkIGJ5IHRoaXMgc3RydWN0dXJlCisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gbUljY0RhdGE7IC8vIEFjdHVhbCBJQ0MgZGF0YSwgbWVtb3J5IGlzIG93bmVkIGJ5IHRoaXMgc3RydWN0dXJlCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKaW5kZXggN2RlYWIwNS4uOTc5OWNhZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgfSwKICAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCi0gICAgc3JjczogWyJBdWRpb1BhcmFtZXRlci5jcHAiLCAiVHlwZUNvbnZlcnRlci5jcHAiLCAiVGltZUNoZWNrLmNwcCJdLAorICAgIHNyY3M6IFsiQXVkaW9QYXJhbWV0ZXIuY3BwIiwgIlR5cGVDb252ZXJ0ZXIuY3BwIl0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLApAQCAtMzQsNiArMzQsOSBAQAogICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCiAgICAgICAgICJsaWJhdWRpb19zeXN0ZW1faGVhZGVycyIsCiAgICAgXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAogICAgIGNsYW5nOiB0cnVlLAogfQogCkBAIC0xMjMsNiArMTI2LDEwIEBACiAgICAgICAgICJsaWJzb25pdm94IiwKICAgICBdLAogCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLApAQCAtMTM4LDE4ICsxNDUsMTAgQEAKICAgICB9LAogfQogCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJtZWRpYXVwZGF0ZXNlcnZpY2VfYWlkbCIsCi0gICAgc3JjczogWwotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuYWlkbCIsCi0gICAgXSwKLX0KLQogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm1lZGlhIiwKIAogICAgIHNyY3M6IFsKLSAgICAgICAgIjptZWRpYXVwZGF0ZXNlcnZpY2VfYWlkbCIsCiAgICAgICAgICJJRGF0YVNvdXJjZS5jcHAiLAogICAgICAgICAiQnVmZmVyaW5nU2V0dGluZ3MuY3BwIiwKICAgICAgICAgIm1lZGlhcGxheWVyLmNwcCIsCkBAIC0xODQsNiArMTgzLDggQEAKICAgICAgICAgIk1lZGlhUmVzb3VyY2VQb2xpY3kuY3BwIiwKICAgICAgICAgIlZpc3VhbGl6ZXIuY3BwIiwKICAgICAgICAgIlN0cmluZ0FycmF5LmNwcCIsCisgICAgICAgICJOZGtNZWRpYUZvcm1hdFByaXYuY3BwIiwKKyAgICAgICAgIk5ka01lZGlhRXJyb3JQcml2LmNwcCIsCiAgICAgXSwKIAogICAgIGFpZGw6IHsKQEAgLTE5MywxMCArMTk0LDEyIEBACiAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtMjExLDcgKzIxNCw2IEBACiAgICAgICAgICJsaWJleHBhdCIsCiAgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYmRsIiwKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLApAQCAtMjUzLDE4ICsyNTUsMTQgQEAKICAgICB9LAogfQogCi1jY19saWJyYXJ5IHsKK2NjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlibWVkaWFfcGxheWVyMl91dGlsIiwKIAogICAgIHNyY3M6IFsKKyAgICAgICAgIkF1ZGlvUGFyYW1ldGVyLmNwcCIsCiAgICAgICAgICJCdWZmZXJpbmdTZXR0aW5ncy5jcHAiLAogICAgICAgICAiRGF0YVNvdXJjZURlc2MuY3BwIiwKLSAgICAgICAgIklEYXRhU291cmNlLmNwcCIsCi0gICAgICAgICJJTWVkaWFFeHRyYWN0b3IuY3BwIiwKLSAgICAgICAgIklNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwIiwKLSAgICAgICAgIklNZWRpYVNvdXJjZS5jcHAiLAogICAgICAgICAiTWVkaWFDb2RlY0J1ZmZlci5jcHAiLAotICAgICAgICAiTWVkaWFVdGlscy5jcHAiLAogICAgICAgICAiTWV0YWRhdGEuY3BwIiwKICAgICAgICAgIk5ka1dyYXBwZXIuY3BwIiwKICAgICBdLApAQCAtMjczLDEwICsyNzEsOSBAQAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlibWVkaWFuZGsiLAogICAgICAgICAibGlibmF0aXZld2luZG93IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYm1lZGlhbmRrX3V0aWxzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidWkiLAogICAgICAgICAibGlidXRpbHMiLApAQCAtMjkxLDYgKzI4OCwxMCBAQAogICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbmRrIiwKKyAgICBdLAorCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3J0c3AiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUGFyYW1ldGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvUGFyYW1ldGVyLmNwcAppbmRleCAwMzRmN2MyLi4xYzk1ZTI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1BhcmFtZXRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9QYXJhbWV0ZXIuY3BwCkBAIC0zNiw2ICszNiw4IEBACiBjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleUh3QXZTeW5jID0gQVVESU9fUEFSQU1FVEVSX0hXX0FWX1NZTkM7CiBjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVByZXNlbnRhdGlvbklkID0gQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9QUkVTRU5UQVRJT05fSUQ7CiBjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVByb2dyYW1JZCA9IEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUFJPR1JBTV9JRDsKK2NvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5QXVkaW9MYW5ndWFnZVByZWZlcnJlZCA9CisgICAgICAgIEFVRElPX1BBUkFNRVRFUl9LRVlfQVVESU9fTEFOR1VBR0VfUFJFRkVSUkVEOwogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlNb25vT3V0cHV0ID0gQVVESU9fUEFSQU1FVEVSX01PTk9fT1VUUFVUOwogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1Id0F2U3luYyA9IEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fSFdfQVZfU1lOQzsKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtQ29ubmVjdCA9IEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfQ09OTkVDVDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmNwcCBiL21lZGlhL2xpYm1lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmNwcAppbmRleCAyNzFhMjM4Li4xY2MzMGMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuY3BwCkBAIC0yNywyNiArMjcsNiBAQAogICAgICAgICA6IG1Jbml0aWFsTWFya01zKGtOb01hcmspLAogICAgICAgICAgIG1SZXN1bWVQbGF5YmFja01hcmtNcyhrTm9NYXJrKSB7IH0KIAotc3RhdHVzX3QgQnVmZmVyaW5nU2V0dGluZ3M6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gICAgaWYgKHBhcmNlbCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIG1Jbml0aWFsTWFya01zID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKLSAgICBtUmVzdW1lUGxheWJhY2tNYXJrTXMgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBCdWZmZXJpbmdTZXR0aW5nczo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICAgIGlmIChwYXJjZWwgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBwYXJjZWwtPndyaXRlSW50MzIobUluaXRpYWxNYXJrTXMpOwotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtUmVzdW1lUGxheWJhY2tNYXJrTXMpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCiBTdHJpbmc4IEJ1ZmZlcmluZ1NldHRpbmdzOjp0b1N0cmluZygpIGNvbnN0IHsKICAgICBTdHJpbmc4IHM7CiAgICAgcy5hcHBlbmRGb3JtYXQoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCBlOWE2MjMwLi5mYjZkM2EyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgpAQCAtMjE5LDEwICsyMjAsMTYgQEAKICAgICBWZWN0b3I8d3A8SU1lZGlhU291cmNlPj4gdHJhY2tzOwogICAgIFZlY3RvcjxTdHJpbmc4PiB0cmFja0Rlc2NyaXB0aW9uczsKICAgICBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3Q7CisgICAgdGltZV90IHdoZW47CiB9IEV4dHJhY3Rvckluc3RhbmNlOwogCiBTdHJpbmc4IEV4dHJhY3Rvckluc3RhbmNlOjp0b1N0cmluZygpIGNvbnN0IHsKLSAgICBTdHJpbmc4IHN0ciA9IG5hbWU7CisgICAgU3RyaW5nOCBzdHI7CisgICAgY2hhciB0aW1lU3RyaW5nWzMyXTsKKyAgICBzdHJmdGltZSh0aW1lU3RyaW5nLCBzaXplb2YodGltZVN0cmluZyksICIlbS0lZCAlVCIsIGxvY2FsdGltZSgmd2hlbikpOworICAgIHN0ci5hcHBlbmQodGltZVN0cmluZyk7CisgICAgc3RyLmFwcGVuZCgiOiAiKTsKKyAgICBzdHIuYXBwZW5kKG5hbWUpOwogICAgIHN0ci5hcHBlbmQoIiBmb3IgbWltZSAiKTsKICAgICBzdHIuYXBwZW5kKG1pbWUpOwogICAgIHN0ci5hcHBlbmQoIiwgc291cmNlICIpOwpAQCAtMjg3LDYgKzI5NCw3IEBACiAgICAgZXguc291cmNlRGVzY3JpcHRpb24gPSBzb3VyY2UtPnRvU3RyaW5nKCk7CiAgICAgZXgub3duZXIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgZXguZXh0cmFjdG9yID0gZXh0cmFjdG9yOworICAgIGV4LndoZW4gPSB0aW1lKE5VTEwpOwogCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhzRXh0cmFjdG9yc0xvY2spOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAppbmRleCBkNzUzM2NhLi4yNDNiMDlkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcApAQCAtMjMsMTMgKzIzLDEzIEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGVudW0gewogICAgIE1BS0VfRVhUUkFDVE9SID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKICAgICBNQUtFX0lEQVRBX1NPVVJDRV9GRCwKKyAgICBHRVRfU1VQUE9SVEVEX1RZUEVTLAogfTsKIAogY2xhc3MgQnBNZWRpYUV4dHJhY3RvclNlcnZpY2UgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lZGlhRXh0cmFjdG9yU2VydmljZT4KQEAgLTY5LDYgKzY5LDI0IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGdldFN1cHBvcnRlZFR5cGVzKCkgeworICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IHN1cHBvcnRlZFR5cGVzOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCByZXQgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1NVUFBPUlRFRF9UWVBFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgLy8gcHJvY2VzcyByZXBseQorICAgICAgICAgICAgd2hpbGUodHJ1ZSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmV4dCA9IHJlcGx5LnJlYWRDU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKCFleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN1cHBvcnRlZFR5cGVzLmluc2VydChzdGQ6OnN0cmluZyhleHQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwcG9ydGVkVHlwZXM7CisgICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE1lZGlhRXh0cmFjdG9yU2VydmljZSwgImFuZHJvaWQubWVkaWEuSU1lZGlhRXh0cmFjdG9yU2VydmljZSIpOwpAQCAtMTE0LDYgKzEzMiwxNSBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBHRVRfU1VQUE9SVEVEX1RZUEVTOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhRXh0cmFjdG9yU2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBzdXBwb3J0ZWRUeXBlcyA9IGdldFN1cHBvcnRlZFR5cGVzKCk7CisgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBzdXBwb3J0ZWRUeXBlcy5iZWdpbigpOyBpdCAhPSBzdXBwb3J0ZWRUeXBlcy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUNTdHJpbmcoKCppdCkuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKaW5kZXggZTJlY2NkZC4uZWEwNjY2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCkBAIC0xNzksNyArMTc5LDggQEAKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgYnVmZmVyaW5nLndyaXRlVG9QYXJjZWwoJmRhdGEpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoYnVmZmVyaW5nLm1Jbml0aWFsTWFya01zKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGJ1ZmZlcmluZy5tUmVzdW1lUGxheWJhY2tNYXJrTXMpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0JVRkZFUklOR19TRVRUSU5HUywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTE5NCw3ICsxOTUsOCBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0JVRkZFUklOR19TRVRUSU5HUywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgIGVyciA9IGJ1ZmZlcmluZy0+cmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKKyAgICAgICAgICAgIGJ1ZmZlcmluZy0+bUluaXRpYWxNYXJrTXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGJ1ZmZlcmluZy0+bVJlc3VtZVBsYXliYWNrTWFya01zID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CkBAIC02OTYsNyArNjk4LDggQEAKICAgICAgICAgY2FzZSBTRVRfQlVGRkVSSU5HX1NFVFRJTkdTOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyBidWZmZXJpbmc7Ci0gICAgICAgICAgICBidWZmZXJpbmcucmVhZEZyb21QYXJjZWwoJmRhdGEpOworICAgICAgICAgICAgYnVmZmVyaW5nLm1Jbml0aWFsTWFya01zID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGJ1ZmZlcmluZy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC03MDYsNyArNzA5LDggQEAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGdldEJ1ZmZlcmluZ1NldHRpbmdzKCZidWZmZXJpbmcpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBidWZmZXJpbmcud3JpdGVUb1BhcmNlbChyZXBseSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoYnVmZmVyaW5nLm1Jbml0aWFsTWFya01zKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihidWZmZXJpbmcubVJlc3VtZVBsYXliYWNrTWFya01zKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggYWNhN2FkOS4uYmQxOGE0MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KICNpbmNsdWRlIDxtZWRpYS9JUmVtb3RlRGlzcGxheS5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCmluZGV4IGIyYzkxYzQuLmYyODM1NjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKQEAgLTY1LDcgKzY1LDkgQEAKICAgICBHRVRfUk9VVEVEX0RFVklDRV9JRCwKICAgICBFTkFCTEVfQVVESU9fREVWSUNFX0NBTExCQUNLLAogICAgIEdFVF9BQ1RJVkVfTUlDUk9QSE9ORVMsCi0KKyAgICBHRVRfUE9SVF9JRCwKKyAgICBTRVRfTUlDUk9QSE9ORV9ESVJFQ1RJT04sCisgICAgU0VUX01JQ1JPUEhPTkVfRklFTERfRElNRU5TSU9OCiB9OwogCiBjbGFzcyBCcE1lZGlhUmVjb3JkZXI6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFSZWNvcmRlcj4KQEAgLTQwNyw2ICs0MDksNDEgQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CisgICAgICAgIEFMT0dWKCJzZXRNaWNyb3Bob25lRGlyZWN0aW9uKCVkKSIsIGRpcmVjdGlvbik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVJlY29yZGVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoZGlyZWN0aW9uKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9NSUNST1BIT05FX0RJUkVDVElPTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSBOT19FUlJPUiA/IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSA6IHN0YXR1czsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgeworICAgICAgICBBTE9HVigic2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKCVmKSIsIHpvb20pOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZWNvcmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUZsb2F0KHpvb20pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX01JQ1JPUEhPTkVfRklFTERfRElNRU5TSU9OLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gc3RhdHVzID09IE5PX0VSUk9SID8gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpIDogc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1c190IGdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCisgICAgeworICAgICAgICBBTE9HVigiZ2V0UG9ydElkIik7CisgICAgICAgIGlmIChwb3J0SWQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZWNvcmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QT1JUX0lELCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LCisgICAgICAgICAgICAgICAgfHwgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICpwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICAqcG9ydElkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTWVkaWFSZWNvcmRlciwgImFuZHJvaWQubWVkaWEuSU1lZGlhUmVjb3JkZXIiKTsKQEAgLTY2MSw2ICs2OTgsMzQgQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKIAogICAgICAgICB9CisgICAgICAgIGNhc2UgR0VUX1BPUlRfSUQ6IHsKKyAgICAgICAgICAgIEFMT0dWKCJHRVRfUE9SVF9JRCIpOworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZDsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldFBvcnRJZCgmcG9ydElkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocG9ydElkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNFVF9NSUNST1BIT05FX0RJUkVDVElPTjogeworICAgICAgICAgICAgQUxPR1YoIlNFVF9NSUNST1BIT05FX0RJUkVDVElPTiIpOworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBpbnQgZGlyZWN0aW9uID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgc2V0TWljcm9waG9uZURpcmVjdGlvbihzdGF0aWNfY2FzdDxhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90PihkaXJlY3Rpb24pKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTRVRfTUlDUk9QSE9ORV9GSUVMRF9ESU1FTlNJT046IHsKKyAgICAgICAgICAgIEFMT0dWKCJTRVRfTUlDUk9QSE9ORV9GSUVMRF9ESU1FTlNJT04iKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgZmxvYXQgem9vbSA9IGRhdGEucmVhZEZsb2F0KCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFTb3VyY2UuY3BwCmluZGV4IGYxODVmZDQuLjRkZWNlOTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhU291cmNlLmNwcApAQCAtMTA3LDYgKzEwNyw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihCcE1lZGlhU291cmNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBzdGF0dXNfdCByZXQgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VURk9STUFULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwogICAgICAgICAgICAgbU1ldGFEYXRhID0gTWV0YURhdGE6OmNyZWF0ZUZyb21QYXJjZWwocmVwbHkpOwogICAgICAgICAgICAgcmV0dXJuIG1NZXRhRGF0YTsKICAgICAgICAgfQpAQCAtMTg2LDYgKzE4Nyw5IEBACiAgICAgICAgIHJldCA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICBBTE9HVigicmVhZE11bHRpcGxlIHN0YXR1cyAlZCwgYnVmZmVyQ291bnQgJXUsIHNpbmNlU3RvcCAldSIsCiAgICAgICAgICAgICAgICAgcmV0LCBidWZmZXJDb3VudCwgbUJ1ZmZlcnNTaW5jZVN0b3ApOworICAgICAgICBpZiAoYnVmZmVyQ291bnQgJiYgcmV0ID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICByZXQgPSBPSzsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIApAQCAtMjE5LDYgKzIyMyw4IEBACiAgICAgLy8gTnVQbGF5ZXIgcGFzc2VzIHBvaW50ZXJzLXRvLW1ldGFkYXRhIGFyb3VuZCwgc28gd2UgdXNlIHRoaXMgdG8ga2VlcCB0aGUgbWV0YWRhdGEgYWxpdmUKICAgICAvLyBYWFg6IGNvdWxkIHdlIHVzZSB0aGlzIGZvciBjYWNoaW5nLCBvciBkb2VzIG1ldGFkYXRhIGNoYW5nZSBvbiB0aGUgZmx5PwogICAgIHNwPE1ldGFEYXRhPiBtTWV0YURhdGE7CisgICAgLy8gZW5zdXJlIHN5bmNocm9uaXplIGFjY2VzcyB0byBtTWV0YURhdGEKKyAgICBNdXRleCBtTG9jazsKIAogICAgIC8vIENhY2hlIGFsbCBJTWVtb3J5IG9iamVjdHMgcmVjZWl2ZWQgZnJvbSBNZWRpYUV4dHJhY3Rvci4KICAgICAvLyBXZSBnYyBJTWVtb3J5IG9iamVjdHMgdGhhdCBhcmUgbm8gbG9uZ2VyIGFjdGl2ZSAocmVmZXJlbmNlZCBieSBhIE1lZGlhQnVmZmVyKS4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKaW5kZXggYTA3MzA4MS4uNzQ3Yjg4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKQEAgLTU1Miw3ICs1NTIsNyBAQAogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE9NWCwgImFuZHJvaWQuaGFyZHdhcmUuSU9NWCIpOwotSU1QTEVNRU5UX0hZQlJJRF9NRVRBX0lOVEVSRkFDRShPTVhOb2RlLCBJT214Tm9kZSwgImFuZHJvaWQuaGFyZHdhcmUuSU9NWE5vZGUiKTsKK0lNUExFTUVOVF9IWUJSSURfTUVUQV9JTlRFUkZBQ0UoT01YTm9kZSwgImFuZHJvaWQuaGFyZHdhcmUuSU9NWE5vZGUiKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0luZm8uY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0luZm8uY3BwCmluZGV4IDUzMDhlMWMuLjg2YWQ5OTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNJbmZvLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAKQEAgLTI4LDYgKzI4LDE1IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLyoqIFRoaXMgcmVkdW5kYW50IHJlZGVjbGFyYXRpb24gaXMgbmVlZGVkIGZvciBDKysgcHJlIDE0ICovCitjb25zdGV4cHIgY2hhciBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGRUFUVVJFX0FEQVBUSVZFX1BMQVlCQUNLW107Citjb25zdGV4cHIgY2hhciBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGRUFUVVJFX0RZTkFNSUNfVElNRVNUQU1QW107Citjb25zdGV4cHIgY2hhciBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGRUFUVVJFX0ZSQU1FX1BBUlNJTkdbXTsKK2NvbnN0ZXhwciBjaGFyIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfSU5UUkFfUkVGUkVTSFtdOworY29uc3RleHByIGNoYXIgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6RkVBVFVSRV9NVUxUSVBMRV9GUkFNRVNbXTsKK2NvbnN0ZXhwciBjaGFyIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfU0VDVVJFX1BMQVlCQUNLW107Citjb25zdGV4cHIgY2hhciBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGRUFUVVJFX1RVTk5FTEVEX1BMQVlCQUNLW107CisKIHZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Z2V0U3VwcG9ydGVkUHJvZmlsZUxldmVscygKICAgICAgICAgVmVjdG9yPFByb2ZpbGVMZXZlbD4gKnByb2ZpbGVMZXZlbHMpIGNvbnN0IHsKICAgICBwcm9maWxlTGV2ZWxzLT5jbGVhcigpOwpAQCAtNDAsMTYgKzQ5LDExIEBACiAgICAgY29sb3JGb3JtYXRzLT5hcHBlbmRWZWN0b3IobUNvbG9yRm9ybWF0cyk7CiB9CiAKLXVpbnQzMl90IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmdldEZsYWdzKCkgY29uc3QgewotICAgIHJldHVybiBtRmxhZ3M7Ci19Ci0KIGNvbnN0IHNwPEFNZXNzYWdlPiBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpnZXREZXRhaWxzKCkgY29uc3QgewogICAgIHJldHVybiBtRGV0YWlsczsKIH0KIAotTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Q2FwYWJpbGl0aWVzKCkKLSAgOiBtRmxhZ3MoMCkgeworTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Q2FwYWJpbGl0aWVzKCkgewogICAgIG1EZXRhaWxzID0gbmV3IEFNZXNzYWdlOwogfQogCkBAIC03MywxMiArNzcsMTAgQEAKICAgICAgICAgICAgIGNhcHMtPm1Db2xvckZvcm1hdHMucHVzaF9iYWNrKGNvbG9yKTsKICAgICAgICAgfQogICAgIH0KLSAgICB1aW50MzJfdCBmbGFncyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihwYXJjZWwucmVhZEludDMyKCkpOwogICAgIHNwPEFNZXNzYWdlPiBkZXRhaWxzID0gQU1lc3NhZ2U6OkZyb21QYXJjZWwocGFyY2VsKTsKICAgICBpZiAoZGV0YWlscyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpZiAoY2FwcyAhPSBOVUxMKSB7Ci0gICAgICAgIGNhcHMtPm1GbGFncyA9IGZsYWdzOwogICAgICAgICBjYXBzLT5tRGV0YWlscyA9IGRldGFpbHM7CiAgICAgfQogICAgIHJldHVybiBjYXBzOwpAQCAtOTYsNyArOTgsNiBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbG9yRm9ybWF0cy5zaXplKCk7IGkrKykgewogICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIobUNvbG9yRm9ybWF0cy5pdGVtQXQoaSkpOwogICAgIH0KLSAgICBwYXJjZWwtPndyaXRlSW50MzIobUZsYWdzKTsKICAgICBtRGV0YWlscy0+d3JpdGVUb1BhcmNlbChwYXJjZWwpOwogICAgIHJldHVybiBPSzsKIH0KQEAgLTExMSw2ICsxMTIsMTQgQEAKICAgICBtQ2FwLT5tRGV0YWlscy0+c2V0SW50MzIoa2V5LCB2YWx1ZSk7CiB9CiAKK3ZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcjo6cmVtb3ZlRGV0YWlsKGNvbnN0IGNoYXIqIGtleSkgeworICAgIGlmIChtQ2FwLT5tRGV0YWlscy0+cmVtb3ZlRW50cnlBdChtQ2FwLT5tRGV0YWlscy0+ZmluZEVudHJ5QnlOYW1lKGtleSkpID09IE9LKSB7CisgICAgICAgIEFMT0dEKCJzdWNjZXNzZnVsbHkgcmVtb3ZlZCBkZXRhaWwgJXMiLCBrZXkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCJkZXRhaWwgJXMgd2Fzbid0IHByZXNlbnQgdG8gcmVtb3ZlIiwga2V5KTsKKyAgICB9Cit9CisKIHZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcjo6YWRkUHJvZmlsZUxldmVsKAogICAgICAgICB1aW50MzJfdCBwcm9maWxlLCB1aW50MzJfdCBsZXZlbCkgewogICAgIFByb2ZpbGVMZXZlbCBwcm9maWxlTGV2ZWw7CkBAIC0xMjksMzIgKzEzOCwzMiBAQAogICAgIH0KIH0KIAotdm9pZCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyOjphZGRGbGFncyh1aW50MzJfdCBmbGFncykgewotICAgIG1DYXAtPm1GbGFncyB8PSBmbGFnczsKLX0KLQogTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcjo6Q2FwYWJpbGl0aWVzV3JpdGVyKAogICAgICAgICBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzKiBjYXApIDogbUNhcChjYXApIHsKIH0KIAotYm9vbCBNZWRpYUNvZGVjSW5mbzo6aXNFbmNvZGVyKCkgY29uc3QgewotICAgIHJldHVybiBtSXNFbmNvZGVyOworTWVkaWFDb2RlY0luZm86OkF0dHJpYnV0ZXMgTWVkaWFDb2RlY0luZm86OmdldEF0dHJpYnV0ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1BdHRyaWJ1dGVzOwogfQogCi11aW50MzJfdCBNZWRpYUNvZGVjSW5mbzo6cmFuaygpIGNvbnN0IHsKK3VpbnQzMl90IE1lZGlhQ29kZWNJbmZvOjpnZXRSYW5rKCkgY29uc3QgewogICAgIHJldHVybiBtUmFuazsKIH0KIAotdm9pZCBNZWRpYUNvZGVjSW5mbzo6Z2V0U3VwcG9ydGVkTWltZXMoVmVjdG9yPEFTdHJpbmc+ICptaW1lcykgY29uc3QgewotICAgIG1pbWVzLT5jbGVhcigpOwordm9pZCBNZWRpYUNvZGVjSW5mbzo6Z2V0QWxpYXNlcyhWZWN0b3I8QVN0cmluZz4gKmFsaWFzZXMpIGNvbnN0IHsKKyAgICAqYWxpYXNlcyA9IG1BbGlhc2VzOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjpnZXRTdXBwb3J0ZWRNZWRpYVR5cGVzKFZlY3RvcjxBU3RyaW5nPiAqbWVkaWFUeXBlcykgY29uc3QgeworICAgIG1lZGlhVHlwZXMtPmNsZWFyKCk7CiAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1DYXBzLnNpemUoKTsgaXgrKykgewotICAgICAgICBtaW1lcy0+cHVzaF9iYWNrKG1DYXBzLmtleUF0KGl4KSk7CisgICAgICAgIG1lZGlhVHlwZXMtPnB1c2hfYmFjayhtQ2Fwcy5rZXlBdChpeCkpOwogICAgIH0KIH0KIAogY29uc3Qgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4KLU1lZGlhQ29kZWNJbmZvOjpnZXRDYXBhYmlsaXRpZXNGb3IoY29uc3QgY2hhciAqbWltZSkgY29uc3QgewotICAgIHNzaXplX3QgaXggPSBnZXRDYXBhYmlsaXR5SW5kZXgobWltZSk7CitNZWRpYUNvZGVjSW5mbzo6Z2V0Q2FwYWJpbGl0aWVzRm9yKGNvbnN0IGNoYXIgKm1lZGlhVHlwZSkgY29uc3QgeworICAgIHNzaXplX3QgaXggPSBnZXRDYXBhYmlsaXR5SW5kZXgobWVkaWFUeXBlKTsKICAgICBpZiAoaXggPj0gMCkgewogICAgICAgICByZXR1cm4gbUNhcHMudmFsdWVBdChpeCk7CiAgICAgfQpAQCAtMTczLDIxICsxODIsMjYgQEAKIHNwPE1lZGlhQ29kZWNJbmZvPiBNZWRpYUNvZGVjSW5mbzo6RnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCkgewogICAgIEFTdHJpbmcgbmFtZSA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKICAgICBBU3RyaW5nIG93bmVyID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOwotICAgIGJvb2wgaXNFbmNvZGVyID0gc3RhdGljX2Nhc3Q8Ym9vbD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBzdGF0aWNfY2FzdDxBdHRyaWJ1dGVzPihwYXJjZWwucmVhZEludDMyKCkpOwogICAgIHVpbnQzMl90IHJhbmsgPSBwYXJjZWwucmVhZFVpbnQzMigpOwogICAgIHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbmV3IE1lZGlhQ29kZWNJbmZvOwogICAgIGluZm8tPm1OYW1lID0gbmFtZTsKICAgICBpbmZvLT5tT3duZXIgPSBvd25lcjsKLSAgICBpbmZvLT5tSXNFbmNvZGVyID0gaXNFbmNvZGVyOworICAgIGluZm8tPm1BdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKICAgICBpbmZvLT5tUmFuayA9IHJhbms7CisgICAgc2l6ZV90IG51bUFsaWFzZXMgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1BbGlhc2VzOyBpKyspIHsKKyAgICAgICAgQVN0cmluZyBhbGlhcyA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgaW5mby0+bUFsaWFzZXMuYWRkKGFsaWFzKTsKKyAgICB9CiAgICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgQVN0cmluZyBtaW1lID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOworICAgICAgICBBU3RyaW5nIG1lZGlhVHlwZSA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKICAgICAgICAgc3A8Q2FwYWJpbGl0aWVzPiBjYXBzID0gQ2FwYWJpbGl0aWVzOjpGcm9tUGFyY2VsKHBhcmNlbCk7CiAgICAgICAgIGlmIChjYXBzID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgaWYgKGluZm8gIT0gTlVMTCkgewotICAgICAgICAgICAgaW5mby0+bUNhcHMuYWRkKG1pbWUsIGNhcHMpOworICAgICAgICAgICAgaW5mby0+bUNhcHMuYWRkKG1lZGlhVHlwZSwgY2Fwcyk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGluZm87CkBAIC0xOTYsOCArMjEwLDEyIEBACiBzdGF0dXNfdCBNZWRpYUNvZGVjSW5mbzo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgewogICAgIG1OYW1lLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKICAgICBtT3duZXIud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtSXNFbmNvZGVyKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIobUF0dHJpYnV0ZXMpOwogICAgIHBhcmNlbC0+d3JpdGVVaW50MzIobVJhbmspOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtQWxpYXNlcy5zaXplKCkpOworICAgIGZvciAoY29uc3QgQVN0cmluZyAmYWxpYXMgOiBtQWxpYXNlcykgeworICAgICAgICBhbGlhcy53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgfQogICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtQ2Fwcy5zaXplKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNhcHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgbUNhcHMua2V5QXQoaSkud3JpdGVUb1BhcmNlbChwYXJjZWwpOwpAQCAtMjA2LDEwICsyMjQsMTAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXNzaXplX3QgTWVkaWFDb2RlY0luZm86OmdldENhcGFiaWxpdHlJbmRleChjb25zdCBjaGFyICptaW1lKSBjb25zdCB7Ci0gICAgaWYgKG1pbWUpIHsKK3NzaXplX3QgTWVkaWFDb2RlY0luZm86OmdldENhcGFiaWxpdHlJbmRleChjb25zdCBjaGFyICptZWRpYVR5cGUpIGNvbnN0IHsKKyAgICBpZiAobWVkaWFUeXBlKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBtQ2Fwcy5zaXplKCk7IGl4KyspIHsKLSAgICAgICAgICAgIGlmIChtQ2Fwcy5rZXlBdChpeCkuZXF1YWxzSWdub3JlQ2FzZShtaW1lKSkgeworICAgICAgICAgICAgaWYgKG1DYXBzLmtleUF0KGl4KS5lcXVhbHNJZ25vcmVDYXNlKG1lZGlhVHlwZSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gaXg7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIxNywxOSArMjM1LDI2IEBACiAgICAgcmV0dXJuIC0xOwogfQogCi1NZWRpYUNvZGVjSW5mbzo6TWVkaWFDb2RlY0luZm8oKSA6IG1SYW5rKDB4MTAwKSB7CitNZWRpYUNvZGVjSW5mbzo6TWVkaWFDb2RlY0luZm8oKQorICAgIDogbUF0dHJpYnV0ZXMoKE1lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzKTApLAorICAgICAgbVJhbmsoMHgxMDApIHsKIH0KIAogdm9pZCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6c2V0TmFtZShjb25zdCBjaGFyKiBuYW1lKSB7CiAgICAgbUluZm8tPm1OYW1lID0gbmFtZTsKIH0KIAordm9pZCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6YWRkQWxpYXMoY29uc3QgY2hhciogbmFtZSkgeworICAgIG1JbmZvLT5tQWxpYXNlcy5hZGQobmFtZSk7Cit9CisKIHZvaWQgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnNldE93bmVyKGNvbnN0IGNoYXIqIG93bmVyKSB7CiAgICAgbUluZm8tPm1Pd25lciA9IG93bmVyOwogfQogCi12b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpzZXRFbmNvZGVyKGJvb2wgaXNFbmNvZGVyKSB7Ci0gICAgbUluZm8tPm1Jc0VuY29kZXIgPSBpc0VuY29kZXI7Cit2b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpzZXRBdHRyaWJ1dGVzKAorICAgICAgICB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxNZWRpYUNvZGVjSW5mbzo6QXR0cmlidXRlcz46OnR5cGUgYXR0cmlidXRlcykgeworICAgIG1JbmZvLT5tQXR0cmlidXRlcyA9IChNZWRpYUNvZGVjSW5mbzo6QXR0cmlidXRlcylhdHRyaWJ1dGVzOwogfQogCiB2b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpzZXRSYW5rKHVpbnQzMl90IHJhbmspIHsKQEAgLTIzNywyMSArMjYyLDIxIEBACiB9CiAKIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyPgotICAgICAgICBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6YWRkTWltZShjb25zdCBjaGFyICptaW1lKSB7Ci0gICAgc3NpemVfdCBpeCA9IG1JbmZvLT5nZXRDYXBhYmlsaXR5SW5kZXgobWltZSk7CisgICAgICAgIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjphZGRNZWRpYVR5cGUoY29uc3QgY2hhciAqbWVkaWFUeXBlKSB7CisgICAgc3NpemVfdCBpeCA9IG1JbmZvLT5nZXRDYXBhYmlsaXR5SW5kZXgobWVkaWFUeXBlKTsKICAgICBpZiAoaXggPj0gMCkgewogICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+KAogICAgICAgICAgICAgICAgIG5ldyBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyKAogICAgICAgICAgICAgICAgIG1JbmZvLT5tQ2Fwcy52YWx1ZUF0KGl4KS5nZXQoKSkpOwogICAgIH0KICAgICBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBjYXBzID0gbmV3IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXMoKTsKLSAgICBtSW5mby0+bUNhcHMuYWRkKEFTdHJpbmcobWltZSksIGNhcHMpOworICAgIG1JbmZvLT5tQ2Fwcy5hZGQoQVN0cmluZyhtZWRpYVR5cGUpLCBjYXBzKTsKICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+KAogICAgICAgICAgICAgbmV3IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXIoY2Fwcy5nZXQoKSkpOwogfQogCi1ib29sIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpyZW1vdmVNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKLSAgICBzc2l6ZV90IGl4ID0gbUluZm8tPmdldENhcGFiaWxpdHlJbmRleChtaW1lKTsKK2Jvb2wgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnJlbW92ZU1lZGlhVHlwZShjb25zdCBjaGFyICptZWRpYVR5cGUpIHsKKyAgICBzc2l6ZV90IGl4ID0gbUluZm8tPmdldENhcGFiaWxpdHlJbmRleChtZWRpYVR5cGUpOwogICAgIGlmIChpeCA+PSAwKSB7CiAgICAgICAgIG1JbmZvLT5tQ2Fwcy5yZW1vdmVJdGVtc0F0KGl4KTsKICAgICAgICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCmluZGV4IGUwZjVhNDAuLjk4YzU0OTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCkBAIC00OCw3ICs0OCw4IEBACiAgICAgeyJhbXJ3YiIsICBBVURJT19FTkNPREVSX0FNUl9XQn0sCiAgICAgeyJhYWMiLCAgICBBVURJT19FTkNPREVSX0FBQ30sCiAgICAgeyJoZWFhYyIsICBBVURJT19FTkNPREVSX0hFX0FBQ30sCi0gICAgeyJhYWNlbGQiLCBBVURJT19FTkNPREVSX0FBQ19FTER9CisgICAgeyJhYWNlbGQiLCBBVURJT19FTkNPREVSX0FBQ19FTER9LCAKKyAgICB7Im9wdXMiLCAgIEFVRElPX0VOQ09ERVJfT1BVU30KIH07CiAKIGNvbnN0IE1lZGlhUHJvZmlsZXM6Ok5hbWVUb1RhZ01hcCBNZWRpYVByb2ZpbGVzOjpzRmlsZUZvcm1hdE1hcFtdID0gewpAQCAtOTEsNiArOTIsMTkgQEAKICAgICB7ImhpZ2hzcGVlZDcyMHAiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzcyMFB9LAogICAgIHsiaGlnaHNwZWVkMTA4MHAiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzEwODBQfSwKICAgICB7ImhpZ2hzcGVlZDIxNjBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF8yMTYwUH0sCisKKyAgICAvLyBWZW5kb3Itc3BlY2lmaWMgcHJvZmlsZXMKKyAgICB7InZnYSIsIENBTUNPUkRFUl9RVUFMSVRZX1ZHQX0sCisgICAgeyI0a2RjaSIsIENBTUNPUkRFUl9RVUFMSVRZXzRLRENJfSwKKyAgICB7InRpbWVsYXBzZXZnYSIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfVkdBfSwKKyAgICB7InRpbWVsYXBzZTRrZGNpIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV80S0RDSX0sCisgICAgeyJoaWdoc3BlZWRjaWYiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0NJRn0sCisgICAgeyJoaWdoc3BlZWR2Z2EiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX1ZHQX0sCisgICAgeyJoaWdoc3BlZWQ0a2RjaSIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfNEtEQ0l9LAorICAgIHsicWhkIiwgQ0FNQ09SREVSX1FVQUxJVFlfUUhEfSwKKyAgICB7IjJrIiwgQ0FNQ09SREVSX1FVQUxJVFlfMmt9LAorICAgIHsidGltZWxhcHNlcWhkIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9RSER9LAorICAgIHsidGltZWxhcHNlMmsiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzJrfSwKIH07CiAKICNpZiBMT0dfTkRFQlVHCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NaWRpSW9XcmFwcGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCmluZGV4IDVjYTNiNDguLmQ4ZWY5Y2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8ZmNudGwuaD4KIAogI2luY2x1ZGUgPG1lZGlhL01pZGlJb1dyYXBwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgogCiBzdGF0aWMgaW50IHJlYWRBdCh2b2lkICpoYW5kbGUsIHZvaWQgKmJ1ZmZlciwgaW50IHBvcywgaW50IHNpemUpIHsKICAgICByZXR1cm4gKChhbmRyb2lkOjpNaWRpSW9XcmFwcGVyKiloYW5kbGUpLT5yZWFkQXQoYnVmZmVyLCBwb3MsIHNpemUpOwpAQCAtNDksMTAgKzUwLDQ3IEBACiAgICAgbURhdGFTb3VyY2UgPSBudWxscHRyOwogfQogCi1NaWRpSW9XcmFwcGVyOjpNaWRpSW9XcmFwcGVyKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIHsKLSAgICBBTE9HVigiTWlkaUlvV3JhcHBlcihEYXRhU291cmNlKSIpOworY2xhc3MgRGF0YVNvdXJjZVVud3JhcHBlciA6IHB1YmxpYyBEYXRhU291cmNlQmFzZSB7CisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBEYXRhU291cmNlVW53cmFwcGVyKENEYXRhU291cmNlICpjc291cmNlKSB7CisgICAgICAgIG1Tb3VyY2UgPSBjc291cmNlOworICAgIH0KKworICAgIHZpcnR1YWwgfkRhdGFTb3VyY2VVbndyYXBwZXIoKSB7fQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCB7IHJldHVybiBPSzsgfQorCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIC0xIG9uIGZhaWx1cmUuIEl0J3Mgbm90IGFuIGVycm9yIGlmCisgICAgLy8gdGhpcyByZXR1cm5zIHplcm87IGl0IGp1c3QgbWVhbnMgdGhlIGdpdmVuIG9mZnNldCBpcyBlcXVhbCB0bywgb3IKKyAgICAvLyBiZXlvbmQsIHRoZSBlbmQgb2YgdGhlIHNvdXJjZS4KKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICByZXR1cm4gbVNvdXJjZS0+cmVhZEF0KG1Tb3VyY2UtPmhhbmRsZSwgb2Zmc2V0LCBkYXRhLCBzaXplKTsKKyAgICB9CisKKyAgICAvLyBNYXkgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVELgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5nZXRTaXplKG1Tb3VyY2UtPmhhbmRsZSwgc2l6ZSk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGdldFVyaShjaGFyICogLyp1cmlTdHJpbmcqLywgc2l6ZV90IC8qYnVmZmVyU2l6ZSovKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSB7fTsKK3ByaXZhdGU6CisgICAgQ0RhdGFTb3VyY2UgKm1Tb3VyY2U7Cit9OworCitNaWRpSW9XcmFwcGVyOjpNaWRpSW9XcmFwcGVyKENEYXRhU291cmNlICpjc291cmNlKSB7CisgICAgQUxPR1YoIk1pZGlJb1dyYXBwZXIoQ0RhdGFTb3VyY2UpIik7CiAgICAgbUZkID0gLTE7Ci0gICAgbURhdGFTb3VyY2UgPSBzb3VyY2U7CisgICAgbUJhc2UgPSAwOworICAgIG1EYXRhU291cmNlID0gbmV3IERhdGFTb3VyY2VVbndyYXBwZXIoY3NvdXJjZSk7CiAgICAgb2ZmNjRfdCBsOwogICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmbCkgPT0gT0spIHsKICAgICAgICAgbUxlbmd0aCA9IGw7CkBAIC02Niw2ICsxMDQsNyBAQAogICAgIGlmIChtRmQgPj0gMCkgewogICAgICAgICBjbG9zZShtRmQpOwogICAgIH0KKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CiB9CiAKIGludCBNaWRpSW9XcmFwcGVyOjpyZWFkQXQodm9pZCAqYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTmRrTWVkaWFFcnJvclByaXYuY3BwIGIvbWVkaWEvbGlibWVkaWEvTmRrTWVkaWFFcnJvclByaXYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhM2I5MTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5jcHAKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK21lZGlhX3N0YXR1c190IHRyYW5zbGF0ZV9lcnJvcihzdGF0dXNfdCBlcnIpIHsKKworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9JTykgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOworICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX01BTEZPUk1FRCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBJTlZBTElEX09QRVJBVElPTikgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0gZWxzZSBpZiAoZXJyID09IFVOS05PV05fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIEFMT0dFKCJzZiBlcnJvciBjb2RlOiAlZCIsIGVycik7CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworfQorCitzdGF0dXNfdCByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcihtZWRpYV9zdGF0dXNfdCBlcnIpIHsKKworICAgIGlmIChlcnIgPT0gQU1FRElBX09LKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFfRVJST1JfSU8pIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9XT1VMRF9CTE9DSykgeworICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX01BTEZPUk1FRCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX1VOS05PV04pIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgQUxPR0UoIm5kayBlcnJvciBjb2RlOiAlZCIsIGVycik7CisgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuY3BwIGIvbWVkaWEvbGlibWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTlmYjhiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmNwcApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOZGtNZWRpYUZvcm1hdCIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSA8am5pLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHByaXZhdGUgZnVuY3Rpb25zIGZvciBjb252ZXJzaW9uIHRvL2Zyb20gQU1lc3NhZ2UKK0FNZWRpYUZvcm1hdCogQU1lZGlhRm9ybWF0X2Zyb21Nc2coc3A8QU1lc3NhZ2U+ICpkYXRhKSB7CisgICAgQUxPR1YoInByaXZhdGUgY3RvciIpOworICAgIEFNZWRpYUZvcm1hdCogbURhdGEgPSBuZXcgQU1lZGlhRm9ybWF0KCk7CisgICAgbURhdGEtPm1Gb3JtYXQgPSAqZGF0YTsKKyAgICBpZiAobURhdGEtPm1Gb3JtYXQgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiZ290IE5VTEwgZm9ybWF0Iik7CisgICAgICAgIG1EYXRhLT5tRm9ybWF0ID0gbmV3IEFNZXNzYWdlOworICAgIH0KKyAgICByZXR1cm4gbURhdGE7Cit9CisKK3ZvaWQgQU1lZGlhRm9ybWF0X2dldEZvcm1hdChjb25zdCBBTWVkaWFGb3JtYXQqIG1EYXRhLCBzcDxBTWVzc2FnZT4gKmRlc3QpIHsKKyAgICAqZGVzdCA9IG1EYXRhLT5tRm9ybWF0OworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTmRrV3JhcHBlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9OZGtXcmFwcGVyLmNwcAppbmRleCAxMTg0MDdlLi5lYTA1NDdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9OZGtXcmFwcGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9OZGtXcmFwcGVyLmNwcApAQCAtMjcsMjMgKzI3LDExIEBACiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAKLS8vIFRlbXBvcmFyaWx5IGtlZXBpbmcgQU1lZGlhRXh0cmFjdG9yX2Rpc2Nvbm5lY3QoKSB3aGVyZSBpdCBpcyB1c2VkLgotLy8gV2lsbCBiZSByZW1vdmVkIHNvb24gaW4gZmF2b3Igb2Ygb2ZmaWNpYWwgcHVibGljIEFQSXMuCi1zdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yIHsKLSAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpOdU1lZGlhRXh0cmFjdG9yPiBtSW1wbDsKLSAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpBQnVmZmVyPiBtUHNzaEJ1ZjsKLX07Ci0KLW1lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9kaXNjb25uZWN0KEFNZWRpYUV4dHJhY3RvciAqIGV4KSB7Ci0gICAgZXgtPm1JbXBsLT5kaXNjb25uZWN0KCk7Ci0gICAgcmV0dXJuIEFNRURJQV9PSzsKLX0KKyNpbmNsdWRlICJOZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3NQcml2LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNjksNiArNTcsMTEgQEAKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJELAogICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfVFJBTlNGRVIsCiAgICAgQU1FRElBRk9STUFUX0tFWV9DT01QTEVYSVRZLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JFQVRFX0lOUFVUX1NVUkZBQ0VfU1VTUEVOREVELAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSywKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1NLSVBfQllURV9CTE9DSywKICAgICBBTUVESUFGT1JNQVRfS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUwsCiAgICAgQU1FRElBRk9STUFUX0tFWV9HUklEX0NPTFVNTlMsCiAgICAgQU1FRElBRk9STUFUX0tFWV9HUklEX1JPV1MsCkBAIC0xMDMsNiArOTYsNyBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqQU1lZGlhRm9ybWF0S2V5R3JvdXBJbnQ2NFtdID0gewogICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sCisgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSLAogICAgIEFNRURJQUZPUk1BVF9LRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSLAogICAgIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywKIH07CkBAIC0xMTQsNiArMTA4LDggQEAKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpBTWVkaWFGb3JtYXRLZXlHcm91cEJ1ZmZlcltdID0geworICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwKICAgICBBTUVESUFGT1JNQVRfS0VZX0hEUl9TVEFUSUNfSU5GTywKICAgICBBTUVESUFGT1JNQVRfS0VZX1NFSSwKICAgICBBTUVESUFGT1JNQVRfS0VZX01QRUdfVVNFUl9EQVRBLApAQCAtMTMyLDYgKzEyOCw3IEBACiBzdGF0aWMgY29uc3QgY2hhciAqQU1lZGlhRm9ybWF0S2V5R3JvdXBGbG9hdEludDMyW10gPSB7CiAgICAgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLAogICAgIEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9GUFNfVE9fRU5DT0RFUiwKICAgICBBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFLAogfTsKIApAQCAtMTA4MiwxNCArMTA3OSw2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpkaXNjb25uZWN0KCkgewotICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yICE9IE5VTEwpIHsKLSAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gQU1lZGlhRXh0cmFjdG9yX2Rpc2Nvbm5lY3QobUFNZWRpYUV4dHJhY3Rvcik7Ci0gICAgICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIERFQURfT0JKRUNUOwotfQotCiBBTWVkaWFFeHRyYWN0b3IgKkFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmdldEFNZWRpYUV4dHJhY3RvcigpIGNvbnN0IHsKICAgICByZXR1cm4gbUFNZWRpYUV4dHJhY3RvcjsKIH0KQEAgLTEyNjMsNDAgKzEyNTIsMjggQEAKICAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICByZXR1cm4gbmV3IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXIoQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUNyeXB0b0luZm8obUFNZWRpYUV4dHJhY3RvcikpOwotfQotCi1zc2l6ZV90IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9nZXRTaXplKHZvaWQgKnVzZXJkYXRhKSB7Ci0gICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7Ci0gICAgb2ZmNjRfdCBzaXplID0gLTE7Ci0gICAgc291cmNlLT5nZXRTaXplKCZzaXplKTsKLSAgICByZXR1cm4gc2l6ZTsKLX0KLQotc3NpemVfdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfcmVhZEF0KHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCwgdm9pZCAqIGJ1Ziwgc2l6ZV90IHNpemUpIHsKLSAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKLSAgICByZXR1cm4gc291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWYsIHNpemUpOwotfQotCi12b2lkIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9jbG9zZSh2b2lkICp1c2VyZGF0YSkgewotICAgIERhdGFTb3VyY2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PERhdGFTb3VyY2UgKj4odXNlcmRhdGEpOwotICAgIHNvdXJjZS0+Y2xvc2UoKTsKKyAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm8gKmNyeXB0b0luZm8gPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlQ3J5cHRvSW5mbyhtQU1lZGlhRXh0cmFjdG9yKTsKKyAgICBpZiAoY3J5cHRvSW5mbyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbmV3IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXIoY3J5cHRvSW5mbyk7CiB9CiAKIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpBTWVkaWFEYXRhU291cmNlV3JhcHBlcihjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAotICAgICAgbUFNZWRpYURhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZV9uZXcoKSkgewotICAgIEFMT0dWKCJzZXREYXRhU291cmNlIChzb3VyY2U6ICVwKSIsIGRhdGFTb3VyY2UuZ2V0KCkpOwotICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0VXNlcmRhdGEobUFNZWRpYURhdGFTb3VyY2UsIGRhdGFTb3VyY2UuZ2V0KCkpOwotICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0KG1BTWVkaWFEYXRhU291cmNlLCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9yZWFkQXQpOwotICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0U2l6ZShtQU1lZGlhRGF0YVNvdXJjZSwgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfZ2V0U2l6ZSk7Ci0gICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRDbG9zZShtQU1lZGlhRGF0YVNvdXJjZSwgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfY2xvc2UpOworICAgICAgbUFNZWRpYURhdGFTb3VyY2UoY29udmVydERhdGFTb3VyY2VUb0FNZWRpYURhdGFTb3VyY2UoZGF0YVNvdXJjZSkpIHsKK30KKworQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKEFNZWRpYURhdGFTb3VyY2UgKmFEYXRhU291cmNlKQorICAgIDogbURhdGFTb3VyY2UoTlVMTCksCisgICAgICBtQU1lZGlhRGF0YVNvdXJjZShhRGF0YVNvdXJjZSkgewogfQogCiBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6fkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKCkgewogICAgIGlmIChtQU1lZGlhRGF0YVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgQU1lZGlhRGF0YVNvdXJjZV9jbG9zZShtQU1lZGlhRGF0YVNvdXJjZSk7CiAgICAgQU1lZGlhRGF0YVNvdXJjZV9kZWxldGUobUFNZWRpYURhdGFTb3VyY2UpOwogICAgIG1BTWVkaWFEYXRhU291cmNlID0gTlVMTDsKIH0KQEAgLTEzMDUsNCArMTI4Miw4IEBACiAgICAgcmV0dXJuIG1BTWVkaWFEYXRhU291cmNlOwogfQogCit2b2lkIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpjbG9zZSgpIHsKKyAgICBBTWVkaWFEYXRhU291cmNlX2Nsb3NlKG1BTWVkaWFEYXRhU291cmNlKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1RpbWVDaGVjay5jcHAgYi9tZWRpYS9saWJtZWRpYS9UaW1lQ2hlY2suY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWI1ZDRmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL1RpbWVDaGVjay5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaW5jbHVkZSA8bWVkaWEvVGltZUNoZWNrLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyogc3RhdGljICovCi1zcDxUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZD4gVGltZUNoZWNrOjpnZXRUaW1lQ2hlY2tUaHJlYWQoKQotewotICAgIHN0YXRpYyBzcDxUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZD4gc1RpbWVDaGVja1RocmVhZCA9IG5ldyBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZCgpOwotICAgIHJldHVybiBzVGltZUNoZWNrVGhyZWFkOwotfQotCi1UaW1lQ2hlY2s6OlRpbWVDaGVjayhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcykKLSAgICA6IG1FbmRUaW1lTnMoZ2V0VGltZUNoZWNrVGhyZWFkKCktPnN0YXJ0TW9uaXRvcmluZyh0YWcsIHRpbWVvdXRNcykpCi17Ci19Ci0KLVRpbWVDaGVjazo6flRpbWVDaGVjaygpIHsKLSAgICBnZXRUaW1lQ2hlY2tUaHJlYWQoKS0+c3RvcE1vbml0b3JpbmcobUVuZFRpbWVOcyk7Ci19Ci0KLVRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjp+VGltZUNoZWNrVGhyZWFkKCkKLXsKLSAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKLSAgICByZXF1ZXN0RXhpdCgpOwotICAgIG1Nb25pdG9yUmVxdWVzdHMuY2xlYXIoKTsKLSAgICBtQ29uZC5zaWduYWwoKTsKLX0KLQotbnNlY3NfdCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6c3RhcnRNb25pdG9yaW5nKGNvbnN0IGNoYXIgKnRhZywgdWludDMyX3QgdGltZW91dE1zKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7Ci0gICAgbnNlY3NfdCBlbmRUaW1lTnMgPSBzeXN0ZW1UaW1lKCkgKyBtaWxsaXNlY29uZHModGltZW91dE1zKTsKLSAgICBmb3IgKDsgbU1vbml0b3JSZXF1ZXN0cy5pbmRleE9mS2V5KGVuZFRpbWVOcykgPj0gMDsgKytlbmRUaW1lTnMpOwotICAgIG1Nb25pdG9yUmVxdWVzdHMuYWRkKGVuZFRpbWVOcywgdGFnKTsKLSAgICBtQ29uZC5zaWduYWwoKTsKLSAgICByZXR1cm4gZW5kVGltZU5zOwotfQotCi12b2lkIFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjpzdG9wTW9uaXRvcmluZyhuc2Vjc190IGVuZFRpbWVOcykgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOwotICAgIG1Nb25pdG9yUmVxdWVzdHMucmVtb3ZlSXRlbShlbmRUaW1lTnMpOwotICAgIG1Db25kLnNpZ25hbCgpOwotfQotCi1ib29sIFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjp0aHJlYWRMb29wKCkKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBUSU1FRF9PVVQ7Ci0gICAgY29uc3QgY2hhciAqdGFnOwotICAgIHsKLSAgICAgICAgQXV0b011dGV4IF9sKG1NdXRleCk7Ci0KLSAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIG5zZWNzX3QgZW5kVGltZU5zID0gSU5UNjRfTUFYOwotICAgICAgICAvLyBLZXllZFZlY3RvciBtTW9uaXRvclJlcXVlc3RzIGlzIG9yZGVyZWQgc28gdGFrZSBmaXJzdCBlbnRyeSBhcyBuZXh0IHRpbWVvdXQKLSAgICAgICAgaWYgKG1Nb25pdG9yUmVxdWVzdHMuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgICAgIGVuZFRpbWVOcyA9IG1Nb25pdG9yUmVxdWVzdHMua2V5QXQoMCk7Ci0gICAgICAgICAgICB0YWcgPSBtTW9uaXRvclJlcXVlc3RzLnZhbHVlQXQoMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBuc2Vjc190IHdhaXRUaW1lTnMgPSBlbmRUaW1lTnMgLSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgIGlmICh3YWl0VGltZU5zID4gMCkgewotICAgICAgICAgICAgc3RhdHVzID0gbUNvbmQud2FpdFJlbGF0aXZlKG1NdXRleCwgd2FpdFRpbWVOcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdGF0dXMgIT0gTk9fRVJST1IsICJUaW1lQ2hlY2sgdGltZW91dCBmb3IgJXMiLCB0YWcpOwotICAgIHJldHVybiB0cnVlOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvVHlwZUNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9UeXBlQ29udmVydGVyLmNwcAppbmRleCA4NmRlZjAyLi4wMzAxYjIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9UeXBlQ29udmVydGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9UeXBlQ29udmVydGVyLmNwcApAQCAtNzQsNiArNzQsNyBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9BVVhfRElHSVRBTCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9IRE1JKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0hETUlfQVJDKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSwKQEAgLTkzLDYgKzk0LDggQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0JVUyksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9QUk9YWSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQkxFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0VDSE9fUkVGRVJFTkNFKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0RFRkFVTFQpLAogICAgIC8vIFNUVUIgbXVzdCBiZSBhZnRlciBERUZBVUxULCBzbyB0aGUgbGF0dGVyIGlzIHBpY2tlZCB1cCBieSB0b1N0cmluZyBmaXJzdC4KICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1NUVUIpLApAQCAtMTMyLDYgKzEzNSw3IEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfVk9JUF9UWCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUKSwKICAgICBURVJNSU5BVE9SCiB9OwogCkBAIC0yMDUsNiArMjA5LDE0IEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9NQVRfMV8wKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX01BVF8yXzApLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTUFUXzJfMSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEFUTSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEFUTV9MQyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEFUTV9IRV9WMSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEFUTV9IRV9WMiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9DRUxUKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FQVFhfQURBUFRJVkUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTEhEQyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9MSERDX0xMKSwKICAgICBURVJNSU5BVE9SCiB9OwogCkBAIC0yMzUsNiArMjQ3LDEyIEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxUE9JTlQyKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMVBPSU5UNCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX0hBUFRJQ19BKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfTU9OT19IQVBUSUNfQSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFT19IQVBUSUNfQSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX0hBUFRJQ19BQiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX01PTk9fSEFQVElDX0FCKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPX0hBUFRJQ19BQiksCiAgICAgVEVSTUlOQVRPUgogfTsKIApAQCAtMjgxLDYgKzI5OSw3IEBACiAKIHRlbXBsYXRlIDw+CiBjb25zdCBTdHJlYW1UeXBlQ29udmVydGVyOjpUYWJsZSBTdHJlYW1UeXBlQ29udmVydGVyOjptVGFibGVbXSA9IHsKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX0RFRkFVTFQpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9TWVNURU0pLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fUklORyksCkBAIC0zNTIsMTEgKzM3MSwzMCBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX1ZPSUNFX1BFUkZPUk1BTkNFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX0ZNX1RVTkVSKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX0hPVFdPUkQpLAogICAgIFRFUk1JTkFUT1IKIH07CiAKK3RlbXBsYXRlIDw+Citjb25zdCBBdWRpb0ZsYWdDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvRmxhZ0NvbnZlcnRlcjo6bVRhYmxlW10gPSB7CisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfTk9ORSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfU0VDVVJFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19TQ08pLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX0JFQUNPTiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfSFdfQVZfU1lOQyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfSFdfSE9UV09SRCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfQllQQVNTX0lOVEVSUlVQVElPTl9QT0xJQ1kpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX0JZUEFTU19NVVRFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19MT1dfTEFURU5DWSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfREVFUF9CVUZGRVIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX05PX0NBUFRVUkUpLAorICAgIFRFUk1JTkFUT1IKK307CisKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8T3V0cHV0RGV2aWNlVHJhaXRzPjsKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8SW5wdXREZXZpY2VUcmFpdHM+OwogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxPdXRwdXRGbGFnVHJhaXRzPjsKQEAgLTM3MCwyMCArNDA4LDEzIEBACiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPEF1ZGlvTW9kZVRyYWl0cz47CiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPFVzYWdlVHJhaXRzPjsKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8U291cmNlVHJhaXRzPjsKK3RlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8QXVkaW9GbGFnVHJhaXRzPjsKIAogYm9vbCBkZXZpY2VGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaXRlcmFsRGV2aWNlLCBhdWRpb19kZXZpY2VzX3QmIGRldmljZSkgewogICAgIHJldHVybiBJbnB1dERldmljZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhsaXRlcmFsRGV2aWNlLCBkZXZpY2UpIHx8CiAgICAgICAgICAgICBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcobGl0ZXJhbERldmljZSwgZGV2aWNlKTsKIH0KIAotYm9vbCBkZXZpY2VUb1N0cmluZyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBzdGQ6OnN0cmluZyYgbGl0ZXJhbERldmljZSkgewotICAgIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfQklUX0lOKSB7Ci0gICAgICAgIHJldHVybiBJbnB1dERldmljZUNvbnZlcnRlcjo6dG9TdHJpbmcoZGV2aWNlLCBsaXRlcmFsRGV2aWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gT3V0cHV0RGV2aWNlQ29udmVydGVyOjp0b1N0cmluZyhkZXZpY2UsIGxpdGVyYWxEZXZpY2UpOwotICAgIH0KLX0KLQogU2FtcGxlUmF0ZVRyYWl0czo6Q29sbGVjdGlvbiBzYW1wbGluZ1JhdGVzRnJvbVN0cmluZygKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNhbXBsaW5nUmF0ZXMsIGNvbnN0IGNoYXIgKmRlbCkKIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmFpZGwgYi9tZWRpYS9saWJtZWRpYS9haWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2IxYmM5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLS8qKgotICogU2VydmljZSB0byByZWxvYWQgZXh0cmFjdG9yIHBsdWdpbnMgd2hlbiB1cGRhdGUgcGFja2FnZSBpcyBpbnN0YWxsZWQvdW5pbnN0YWxsZWQuCi0gKiBAaGlkZQotICovCi1pbnRlcmZhY2UgSU1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZSB7Ci0gICAgdm9pZCBsb2FkUGx1Z2lucyhAdXRmOEluQ3BwIFN0cmluZyBhcGtQYXRoKTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyUHJvdmlkZXJzLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlclByb3ZpZGVycy5oCmluZGV4IGQ2YTljZmIuLmIwMzg4NTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyUHJvdmlkZXJzLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJQcm92aWRlcnMuaApAQCAtNzgsNiArNzgsNyBAQAogCiAgICAgLy8gT3ZlcnJpZGVzIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIKICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKyAgICB2b2lkIHNldEJ1ZmZlclByb3ZpZGVyKEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnApIG92ZXJyaWRlOwogCiAgICAgLy8gdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgc3VwcGxpZWQgYnkgdGhlIGRlcml2ZWQgY2xhc3MuICBJdCBjb252ZXJ0cwogICAgIC8vICNmcmFtZXMgaW4gdGhlICpzcmMgcG9pbnRlciB0byB0aGUgKmRzdCBwb2ludGVyLiAgSXQgaXMgcHVibGljIGJlY2F1c2UKQEAgLTE4Niw2ICsxODcsNyBAQAogCiAgICAgLy8gT3ZlcnJpZGVzIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIKICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKyAgICB2b2lkIHNldEJ1ZmZlclByb3ZpZGVyKEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnApIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSk7CiAKQEAgLTIxNiw2ICsyMTgsNDEgQEAKICAgICBib29sICAgICAgICAgICAgICAgICBtQXVkaW9QbGF5YmFja1JhdGVWYWxpZDsgLy8gZmxhZyBmb3IgY3VycmVudCBwYXJhbWV0ZXJzIHZhbGlkaXR5CiB9OwogCisvLyBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyIGRlcml2ZXMgZnJvbSBDb3B5QnVmZmVyUHJvdmlkZXIgdG8gYWRqdXN0IHNhbXBsZSBkYXRhLgorLy8gRXhwYW5kcyBvciBjb250cmFjdHMgc2FtcGxlIGRhdGEgZnJvbSBvbmUgaW50ZXJsZWF2ZWQgY2hhbm5lbCBmb3JtYXQgdG8gYW5vdGhlci4KKy8vIEV4dHJhIGV4cGFuZGVkIGNoYW5uZWxzIGFyZSBmaWxsZWQgd2l0aCB6ZXJvcyBhbmQgcHV0IGF0IHRoZSBlbmQgb2YgZWFjaCBhdWRpbyBmcmFtZS4KKy8vIENvbnRyYWN0ZWQgY2hhbm5lbHMgYXJlIGNvcGllZCB0byB0aGUgZW5kIG9mIHRoZSBvdXRwdXQgYnVmZmVyKHN0b3JhZ2Ugc2hvdWxkIGJlCisvLyBhbGxvY2F0ZWQgYXBwcm9wcmlhdGVseSkuCisvLyBDb250cmFjdGVkIGNoYW5uZWxzIGNvdWxkIGJlIHdyaXR0ZW4gdG8gb3V0cHV0IGJ1ZmZlci4KK2NsYXNzIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKK3B1YmxpYzoKKyAgICBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgc2l6ZV90IGluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgc2l6ZV90IG91dENoYW5uZWxDb3VudCwgc2l6ZV90IGZyYW1lQ291bnQpIDogQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBpbkNoYW5uZWxDb3VudCwgb3V0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBBVURJT19GT1JNQVRfSU5WQUxJRCwgbnVsbHB0cikgeyB9CisgICAgLy8gQ29udHJhY3RlZCBkYXRhIGlzIGNvbnZlcnRlZCB0byBjb250cmFjdGVkRm9ybWF0IGFuZCBwdXQgaW50byBjb250cmFjdGVkQnVmZmVyLgorICAgIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBzaXplX3QgaW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICBzaXplX3Qgb3V0Q2hhbm5lbENvdW50LCBzaXplX3QgZnJhbWVDb3VudCwgYXVkaW9fZm9ybWF0X3QgY29udHJhY3RlZEZvcm1hdCwKKyAgICAgICAgICAgIHZvaWQqIGNvbnRyYWN0ZWRCdWZmZXIpOworICAgIC8vT3ZlcnJpZGVzCisgICAgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIHBCdWZmZXIpIG92ZXJyaWRlOworICAgIHZvaWQgY29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykgb3ZlcnJpZGU7CisgICAgdm9pZCByZXNldCgpIG92ZXJyaWRlOworCisgICAgdm9pZCBjbGVhckNvbnRyYWN0ZWRGcmFtZXMoKSB7IG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcyA9IDA7IH0KKworcHJvdGVjdGVkOgorICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUluQ2hhbm5lbENvdW50OworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1PdXRDaGFubmVsQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbVNhbXBsZVNpemVJbkJ5dGVzOworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1GcmFtZUNvdW50OworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1Db250cmFjdGVkQ2hhbm5lbENvdW50OworICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IG1Db250cmFjdGVkRm9ybWF0OworICAgIHZvaWQgICAgICAgICAgICAgICAgKm1Db250cmFjdGVkQnVmZmVyOworICAgIHNpemVfdCAgICAgICAgICAgICAgIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lczsKKyAgICBzaXplX3QgICAgICAgICAgICAgICBtQ29udHJhY3RlZEZyYW1lU2l6ZTsKK307CiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaAppbmRleCBkMmEzZTQwLi5kOTdjYzAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oCkBAIC0xNywxMSArMTcsMTEgQEAKICNpZm5kZWYgQU5EUk9JRF9CVUZGRVJJTkdfU0VUVElOR1NfSAogI2RlZmluZSBBTkRST0lEX0JVRkZFUklOR19TRVRUSU5HU19ICiAKLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgQnVmZmVyaW5nU2V0dGluZ3MgOiBwdWJsaWMgUGFyY2VsYWJsZSB7CitzdHJ1Y3QgQnVmZmVyaW5nU2V0dGluZ3MgewogICAgIHN0YXRpYyBjb25zdCBpbnQga05vTWFyayA9IC0xOwogCiAgICAgaW50IG1Jbml0aWFsTWFya01zOwpAQCAtMzIsOSArMzIsNiBAQAogCiAgICAgQnVmZmVyaW5nU2V0dGluZ3MoKTsKIAotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKLQogICAgIFN0cmluZzggdG9TdHJpbmcoKSBjb25zdDsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ3J5cHRvSGFsLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NyeXB0b0hhbC5oCmluZGV4IGZmODc4OWQuLjczYzAyOWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ3J5cHRvSGFsLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9DcnlwdG9IYWwuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvRmFjdG9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvUGx1Z2luLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lDcnlwdG9GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lDcnlwdG9QbHVnaW4uaD4KIAogI2luY2x1ZGUgPG1lZGlhZHJtL0lDcnlwdG8uaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgpAQCAtNzIsNiArNzMsNyBAQAogCiAgICAgY29uc3QgVmVjdG9yPHNwPElDcnlwdG9GYWN0b3J5Pj4gbUZhY3RvcmllczsKICAgICBzcDxJQ3J5cHRvUGx1Z2luPiBtUGx1Z2luOworICAgIHNwPGRybTo6VjFfMjo6SUNyeXB0b1BsdWdpbj4gbVBsdWdpblYxXzI7CiAKICAgICAvKioKICAgICAgKiBtSW5pdENoZWNrIGlzOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlRGVzYy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlRGVzYy5oCmluZGV4IGMxOTAyNjEuLjQzMzY3NjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZURlc2MuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VEZXNjLmgKQEAgLTMwLDYgKzMwLDExIEBACiAvLyBBIGJpbmRlciBpbnRlcmZhY2UgZm9yIGltcGxlbWVudGluZyBhIHN0YWdlZnJpZ2h0IERhdGFTb3VyY2UgcmVtb3RlbHkuCiBzdHJ1Y3QgRGF0YVNvdXJjZURlc2MgOiBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6CisgICAgLy8gaW50ZW50aW9uYWxseSBsZXNzIHRoYW4gSU5UNjRfTUFYCisgICAgLy8ga2VlcCBjb25zaXN0ZW50IHdpdGggSkFWQSBjb2RlCisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01heFRpbWVNcyA9IDB4N2ZmZmZmZmZmZmZmZmZmbGwgLyAxMDAwOworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhUaW1lVXMgPSBrTWF4VGltZU1zICogMTAwMDsKKwogICAgIGVudW0gewogICAgICAgICAvKiBObyBkYXRhIHNvdXJjZSBoYXMgYmVlbiBzZXQgeWV0ICovCiAgICAgICAgIFRZUEVfTk9ORSAgICAgPSAwLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtSGFsLmgKaW5kZXggZjI2N2Y3Ni4uYTYzMGJmZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oCkBAIC0yMCw5ICsyMCwxMSBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lEcm1GYWN0b3J5Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lEcm1QbHVnaW4uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSURybVBsdWdpbkxpc3RlbmVyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lEcm1GYWN0b3J5Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lEcm1QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSURybUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSURybVBsdWdpbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtUGx1Z2luTGlzdGVuZXIuaD4KIAogI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgogI2luY2x1ZGUgPG1lZGlhZHJtL0RybU1ldHJpY3MuaD4KQEAgLTM2LDEwICszOCwxNCBAQAogdXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luOwogdXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luTGlzdGVuZXI7CiB1c2luZyBkcm06OlYxXzA6OktleVN0YXR1czsKK3VzaW5nIGRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKK3VzaW5nIGRybTo6VjFfMjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKIAordHlwZWRlZiBkcm06OlYxXzI6OklEcm1QbHVnaW5MaXN0ZW5lciBJRHJtUGx1Z2luTGlzdGVuZXJfVjFfMjsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZTsKQEAgLTUxLDEzICs1NywxNiBAQAogCiBzdHJ1Y3QgRHJtSGFsIDogcHVibGljIEJuRHJtLAogICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwKLSAgICAgICAgICAgICBwdWJsaWMgSURybVBsdWdpbkxpc3RlbmVyIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgSURybVBsdWdpbkxpc3RlbmVyX1YxXzIgewogICAgIERybUhhbCgpOwogICAgIHZpcnR1YWwgfkRybUhhbCgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKIAotICAgIHZpcnR1YWwgYm9vbCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBsdWdpbihjb25zdCB1aW50OF90IHV1aWRbMTZdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJmFwcFBhY2thZ2VOYW1lKTsKQEAgLTExMyw2ICsxMjIsMTEgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyaXR5TGV2ZWwoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgKmxldmVsKSBjb25zdDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZrZXlTZXRJZHMpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlT2ZmbGluZUxpY2Vuc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPZmZsaW5lTGljZW5zZVN0YXRlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQsCisgICAgICAgICAgICBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUgKmxpY2Vuc2VTdGF0ZSkgY29uc3Q7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlICkgY29uc3Q7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSApIGNvbnN0OwpAQCAtMTY4LDYgKzE4Miw4IEBACiAgICAgUmV0dXJuPHZvaWQ+IHNlbmRLZXlzQ2hhbmdlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCiAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXM+JiBrZXlTdGF0dXNMaXN0LCBib29sIGhhc05ld1VzYWJsZUtleSk7CiAKKyAgICBSZXR1cm48dm9pZD4gc2VuZFNlc3Npb25Mb3N0U3RhdGUoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCk7CisKICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmdGhlX2xhdGVfd2hvKTsKIAogcHJpdmF0ZToKQEAgLTE4Miw2ICsxOTgsNyBAQAogICAgIGNvbnN0IFZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IG1GYWN0b3JpZXM7CiAgICAgc3A8SURybVBsdWdpbj4gbVBsdWdpbjsKICAgICBzcDxkcm06OlYxXzE6OklEcm1QbHVnaW4+IG1QbHVnaW5WMV8xOworICAgIHNwPGRybTo6VjFfMjo6SURybVBsdWdpbj4gbVBsdWdpblYxXzI7CiAgICAgU3RyaW5nOCBtQXBwUGFja2FnZU5hbWU7CiAKICAgICAvLyBNdXRhYmxlIHRvIGFsbG93IG1vZGlmaWNhdGlvbiB3aXRoaW4gR2V0UHJvcGVydHlCeXRlQXJyYXkuCkBAIC0yMTAsNiArMjI3LDExIEBACiAgICAgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSkgY29uc3Q7CiAgICAgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSkgY29uc3Q7CisgICAgc3RhdHVzX3QgbWF0Y2hNaW1lVHlwZUFuZFNlY3VyaXR5TGV2ZWwoY29uc3Qgc3A8SURybUZhY3Rvcnk+ICZmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmlzU3VwcG9ydGVkKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERybUhhbCk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRHJtLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEcm0uaAppbmRleCA4ZTllYjNhLi5mYmU4MGM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEcm0uaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEcm0uaApAQCAtMzQsNyArMzQsMTAgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnJlc3VsdCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZhcHBQYWNrYWdlTmFtZSkgPSAwOwpAQCAtNzUsOCArNzgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmY2VydGlmaWNhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ3cmFwcGVkS2V5KSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BzKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wSWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BJZHMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcHMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZzZWN1cmVTdG9wSWRzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NpZCwgVmVjdG9yPHVpbnQ4X3Q+ICZzZWN1cmVTdG9wKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTZWN1cmVTdG9wcyhWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzUmVsZWFzZSkgPSAwOwpAQCAtOTEsNiArOTQsMTEgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyaXR5TGV2ZWwoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgKmxldmVsKSBjb25zdCA9IDA7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAma2V5U2V0SWRzKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPZmZsaW5lTGljZW5zZVN0YXRlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQsCisgICAgICAgICAgICBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUgKmxpY2Vuc2VTdGF0ZSkgY29uc3QgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUpIGNvbnN0ID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgKaW5kZXggNDVlOTYyMC4uNWNlMmNkYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgKQEAgLTE3LDYgKzE3LDggQEAKICNpZm5kZWYgQU5EUk9JRF9JTUVESUFFWFRSQUNUT1JTRVJWSUNFX0gKICNkZWZpbmUgQU5EUk9JRF9JTUVESUFFWFRSQUNUT1JTRVJWSUNFX0gKIAorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgpAQCAtMzMsNiArMzUsOCBAQAogICAgIHZpcnR1YWwgc3A8SU1lZGlhRXh0cmFjdG9yPiBtYWtlRXh0cmFjdG9yKGNvbnN0IHNwPElEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBjaGFyICptaW1lKSA9IDA7CiAKICAgICB2aXJ0dWFsIHNwPElEYXRhU291cmNlPiBtYWtlSURhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpID0gMDsKKworICAgIHZpcnR1YWwgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBnZXRTdXBwb3J0ZWRUeXBlcygpID0gMDsKIH07CiAKIGNsYXNzIEJuTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOiBwdWJsaWMgQm5JbnRlcmZhY2U8SU1lZGlhRXh0cmFjdG9yU2VydmljZT4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKaW5kZXggMjE3ZGUxNC4uZjJlMjA2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKQEAgLTI2LDExICsyNiwxMSBAQAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjbGFzcyBJTWVkaWFQbGF5ZXI7CiBjbGFzcyBJTWVkaWFDb2RlY0xpc3Q7CiBzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBjbGFzcyBJTWVkaWFSZWNvcmRlcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaAppbmRleCAzNzkwMDBlLi4wYjA5NDIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCkBAIC03Myw3ICs3Myw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcykgPSAwOwotCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgPSAwOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhU291cmNlLmgKaW5kZXggN2E0YjFiOS4uNWFiNmUzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVNvdXJjZS5oCkBAIC0xMjYsOCArMTI2LDggQEAKIAogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0JpbmRlck1lZGlhQnVmZmVycyA9IDQ7IC8vIGJ1ZmZlcnMgbWFuYWdlZCBieSBCbk1lZGlhU291cmNlCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVHJhbnNmZXJTaGFyZWRBc1NoYXJlZFRocmVzaG9sZCA9IDQgKiAxMDI0OyAgLy8gaWYgPj0gc2hhcmVkLCBlbHNlIGlubGluZQotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RyYW5zZmVySW5saW5lQXNTaGFyZWRUaHJlc2hvbGQgPSA2NCAqIDEwMjQ7IC8vIGlmID49IHNoYXJlZCwgZWxzZSBpbmxpbmUKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtJbmxpbmVNYXhUcmFuc2ZlciA9IDI1NiAqIDEwMjQ7IC8vIEJpbmRlciBzaXplIGxpbWl0ZWQgdG8gQklOREVSX1ZNX1NJWkUuCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVHJhbnNmZXJJbmxpbmVBc1NoYXJlZFRocmVzaG9sZCA9IDggKiAxMDI0OyAvLyBpZiA+PSBzaGFyZWQsIGVsc2UgaW5saW5lCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrSW5saW5lTWF4VHJhbnNmZXIgPSA2NCAqIDEwMjQ7IC8vIEJpbmRlciBzaXplIGxpbWl0ZWQgdG8gQklOREVSX1ZNX1NJWkUuCiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5Cbk1lZGlhU291cmNlKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0pBdWRpb0F0dHJpYnV0ZXMuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSkF1ZGlvQXR0cmlidXRlcy5oCmluZGV4IGZiMTE0MzUuLmVhMGFhYTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSkF1ZGlvQXR0cmlidXRlcy5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSkF1ZGlvQXR0cmlidXRlcy5oCkBAIC0yNiw4ICsyNiw3IEBACiBwdWJsaWM6CiAgICAgLyogQ3JlYXRlcyBhIEphdmEgQXVkaW9BdHRyaWJ1dGVzIG9iamVjdC4gKi8KICAgICBzdGF0aWMgam9iamVjdCBjcmVhdGVBdWRpb0F0dHJpYnV0ZXNPYmooSk5JRW52ICplbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzKSB7CiAKICAgICAgICAgamNsYXNzIGpCdWlsZGVyQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzJEJ1aWxkZXIiKTsKICAgICAgICAgam1ldGhvZElEIGpCdWlsZGVyQ3RvciA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICI8aW5pdD4iLCAiKClWIik7CkBAIC01OCwxMSArNTcsNiBAQAogICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIHRoZSAndGFncycgKGNoYXJbXSB0byBIYXNoU2V0PFN0cmluZz4pLgogICAgICAgICAgICAgLy8gSG93IHRvIHBhcnNlIHRoZSBjaGFyW10/IElzIHRoZXJlIGFueSBleGFtcGxlIG9mIGl0PwogICAgICAgICAgICAgLy8gQWxzbywgdGhlIGFkZFRhZ3MoKSBtZXRob2QgaXMgaGlkZGVuLgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gQ2FsbCBBdWRpb0F0dHJpYnV0ZXMuQnVpbGRlci5zZXRMZWdhY3lTdHJlYW1UeXBlKCkuYnVpbGQoKQotICAgICAgICAgICAgam1ldGhvZElEIGpTZXRMZWdhY3lTdHJlYW1UeXBlID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldExlZ2FjeVN0cmVhbVR5cGUiLAotICAgICAgICAgICAgICAgICAgICAiKEkpTGFuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzJEJ1aWxkZXI7Iik7Ci0gICAgICAgICAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgalNldExlZ2FjeVN0cmVhbVR5cGUsIHN0cmVhbVR5cGUpOwogICAgICAgICB9CiAKICAgICAgICAgam1ldGhvZElEIGpCdWlsZCA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJidWlsZCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNJbmZvLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNJbmZvLmgKaW5kZXggYjM3NzdkMy4uNTRmNTY1YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaApAQCAtMzAsNiArMzAsOCBAQAogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KIAorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTWVzc2FnZTsKQEAgLTUxLDIxICs1Myw0NyBAQAogCiAgICAgc3RydWN0IENhcGFiaWxpdGllc1dyaXRlcjsKIAorICAgIGVudW0gQXR0cmlidXRlcyA6IGludDMyX3QgeworICAgICAgICAvLyBhdHRyaWJ1dGUgZmxhZ3MKKyAgICAgICAga0ZsYWdJc0VuY29kZXIgPSAxIDw8IDAsCisgICAgICAgIGtGbGFnSXNWZW5kb3IgPSAxIDw8IDEsCisgICAgICAgIGtGbGFnSXNTb2Z0d2FyZU9ubHkgPSAxIDw8IDIsCisgICAgICAgIGtGbGFnSXNIYXJkd2FyZUFjY2VsZXJhdGVkID0gMSA8PCAzLAorICAgIH07CisKICAgICBzdHJ1Y3QgQ2FwYWJpbGl0aWVzIDogcHVibGljIFJlZkJhc2UgewotICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgIC8vIGRlY29kZXIgZmxhZ3MKLSAgICAgICAgICAgIGtGbGFnU3VwcG9ydHNBZGFwdGl2ZVBsYXliYWNrID0gMSA8PCAwLAotICAgICAgICAgICAga0ZsYWdTdXBwb3J0c1NlY3VyZVBsYXliYWNrID0gMSA8PCAxLAotICAgICAgICAgICAga0ZsYWdTdXBwb3J0c1R1bm5lbGVkUGxheWJhY2sgPSAxIDw8IDIsCisgICAgICAgIGNvbnN0ZXhwciBzdGF0aWMgY2hhciBGRUFUVVJFX0FEQVBUSVZFX1BMQVlCQUNLW10gPSAiZmVhdHVyZS1hZGFwdGl2ZS1wbGF5YmFjayI7CisgICAgICAgIGNvbnN0ZXhwciBzdGF0aWMgY2hhciBGRUFUVVJFX0RZTkFNSUNfVElNRVNUQU1QW10gPSAiZmVhdHVyZS1keW5hbWljLXRpbWVzdGFtcCI7CisgICAgICAgIGNvbnN0ZXhwciBzdGF0aWMgY2hhciBGRUFUVVJFX0ZSQU1FX1BBUlNJTkdbXSA9ICJmZWF0dXJlLWZyYW1lLXBhcnNpbmciOworICAgICAgICBjb25zdGV4cHIgc3RhdGljIGNoYXIgRkVBVFVSRV9JTlRSQV9SRUZSRVNIW10gPSAiZmVhdHVyZS1mcmFtZS1wYXJzaW5nIjsKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBjaGFyIEZFQVRVUkVfTVVMVElQTEVfRlJBTUVTW10gPSAiZmVhdHVyZS1tdWx0aXBsZS1mcmFtZXMiOworICAgICAgICBjb25zdGV4cHIgc3RhdGljIGNoYXIgRkVBVFVSRV9TRUNVUkVfUExBWUJBQ0tbXSA9ICJmZWF0dXJlLXNlY3VyZS1wbGF5YmFjayI7CisgICAgICAgIGNvbnN0ZXhwciBzdGF0aWMgY2hhciBGRUFUVVJFX1RVTk5FTEVEX1BMQVlCQUNLW10gPSAiZmVhdHVyZS10dW5uZWxlZC1wbGF5YmFjayI7CiAKLSAgICAgICAgICAgIC8vIGVuY29kZXIgZmxhZ3MKLSAgICAgICAgICAgIGtGbGFnU3VwcG9ydHNJbnRyYVJlZnJlc2ggPSAxIDw8IDAsCi0KLSAgICAgICAgfTsKLQorICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgc3VwcG9ydGVkIGxldmVscyBmb3IgZWFjaCBzdXBwb3J0ZWQgcHJvZmlsZSBpbiBhIHRhcmdldCBhcnJheS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHByb2ZpbGVMZXZlbHMgdGFyZ2V0IGFycmF5IGZvciB0aGUgcHJvZmlsZSBsZXZlbHMuCisgICAgICAgICAqLwogICAgICAgICB2b2lkIGdldFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoVmVjdG9yPFByb2ZpbGVMZXZlbD4gKnByb2ZpbGVMZXZlbHMpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdXBwb3J0ZWQgY29sb3IgZm9ybWF0cyBpbiBhIHRhcmdldCBhcnJheS4gT25seSB1c2VkIGZvciB2aWRlby9pbWFnZQorICAgICAgICAgKiBjb21wb25lbnRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29sb3JGb3JtYXRzIHRhcmdldCBhcnJheSBmb3IgdGhlIGNvbG9yIGZvcm1hdHMuCisgICAgICAgICAqLwogICAgICAgICB2b2lkIGdldFN1cHBvcnRlZENvbG9yRm9ybWF0cyhWZWN0b3I8dWludDMyX3Q+ICpjb2xvckZvcm1hdHMpIGNvbnN0OwotICAgICAgICB1aW50MzJfdCBnZXRGbGFncygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvZGVjIGNhcGFiaWxpdHkuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgY29udGFpbnM6CisgICAgICAgICAqIC0gZmVhdHVyZXMsCisgICAgICAgICAqIC0gcGVyZm9ybWFuY2UgZGF0YS4KKyAgICAgICAgICoKKyAgICAgICAgICogVE9ETzogZXhwb3NlIHRoaXMgYXMgc2VwYXJhdGUgQVBJLXMgYW5kIHdyYXAgaGVyZS4KKyAgICAgICAgICovCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiBnZXREZXRhaWxzKCkgY29uc3Q7CiAKICAgICBwcm90ZWN0ZWQ6CkBAIC03Myw3ICsxMDEsNiBAQAogICAgICAgICBTb3J0ZWRWZWN0b3I8UHJvZmlsZUxldmVsPiBtUHJvZmlsZUxldmVsc1NvcnRlZDsKICAgICAgICAgVmVjdG9yPHVpbnQzMl90PiBtQ29sb3JGb3JtYXRzOwogICAgICAgICBTb3J0ZWRWZWN0b3I8dWludDMyX3Q+IG1Db2xvckZvcm1hdHNTb3J0ZWQ7Ci0gICAgICAgIHVpbnQzMl90IG1GbGFnczsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1EZXRhaWxzOwogCiAgICAgICAgIENhcGFiaWxpdGllcygpOwpAQCAtOTMsOCArMTIwLDcgQEAKICAgICAvKioKICAgICAgKiBUaGlzIGNsYXNzIGlzIHVzZWQgZm9yIG1vZGlmeWluZyBpbmZvcm1hdGlvbiBpbnNpZGUgYSBgQ2FwYWJpbGl0aWVzYAogICAgICAqIG9iamVjdC4gQW4gb2JqZWN0IG9mIHR5cGUgYENhcGFiaWxpdGllc1dyaXRlcmAgY2FuIGJlIG9idGFpbmVkIGJ5IGNhbGxpbmcKLSAgICAgKiBgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OmFkZE1pbWUoKWAgb3IKLSAgICAgKiBgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnVwZGF0ZU1pbWUoKWAuCisgICAgICogYE1lZGlhQ29kZWNJbmZvV3JpdGVyOjphZGRNZWRpYVR5cGUoKWAuCiAgICAgICovCiAgICAgc3RydWN0IENhcGFiaWxpdGllc1dyaXRlciB7CiAgICAgICAgIC8qKgpAQCAtMTIyLDYgKzE0OCwxMyBAQAogICAgICAgICAgKi8KICAgICAgICAgdm9pZCBhZGREZXRhaWwoY29uc3QgY2hhcioga2V5LCBpbnQzMl90IHZhbHVlKTsKICAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZXMgYSBrZXktdmFsdWUgcGFpciBmcm9tIHRoZSBsaXN0IG9mIGRldGFpbHMuIElmIHRoZSBrZXkgaXMgbm90CisgICAgICAgICAqIHByZXNlbnQsIHRoaXMgY2FsbCBkb2VzIG5vdGhpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgcmVtb3ZlRGV0YWlsKGNvbnN0IGNoYXIqIGtleSk7CisgICAgICAgIC8qKgogICAgICAgICAgKiBBZGQgYSBwcm9maWxlLWxldmVsIHBhaXIuIElmIHRoaXMgcHJvZmlsZS1sZXZlbCBwYWlyIGFscmVhZHkgZXhpc3RzLAogICAgICAgICAgKiBpdCB3aWxsIGJlIGlnbm9yZWQuCiAgICAgICAgICAqCkBAIC0xMzYsMTMgKzE2OSw3IEBACiAgICAgICAgICAqIEBwYXJhbSBmb3JtYXQgVGhlIGNvbG9yIGZvcm1hdC4KICAgICAgICAgICovCiAgICAgICAgIHZvaWQgYWRkQ29sb3JGb3JtYXQodWludDMyX3QgZm9ybWF0KTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZCBmbGFncy4gVGhlIHVuZGVybHlpbmcgb3BlcmF0aW9uIGlzIGJpdHdpc2Utb3IuIEluIG90aGVyIHdvcmRzLAotICAgICAgICAgKiBiaXRzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0IHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGZsYWdzIFRoZSBhZGRpdGlvbmFsIGZsYWdzLgotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBhZGRGbGFncyh1aW50MzJfdCBmbGFncyk7CisKICAgICBwcml2YXRlOgogICAgICAgICAvKioKICAgICAgICAgICogVGhlIGFzc29jaWF0ZWQgYENhcGFiaWxpdGllc2Agb2JqZWN0LgpAQCAtMTU4LDE5ICsxODUsNDIgQEAKICAgICAgICAgZnJpZW5kIE1lZGlhQ29kZWNJbmZvV3JpdGVyOwogICAgIH07CiAKLSAgICBib29sIGlzRW5jb2RlcigpIGNvbnN0OwotICAgIHZvaWQgZ2V0U3VwcG9ydGVkTWltZXMoVmVjdG9yPEFTdHJpbmc+ICptaW1lcykgY29uc3Q7Ci0gICAgY29uc3Qgc3A8Q2FwYWJpbGl0aWVzPiBnZXRDYXBhYmlsaXRpZXNGb3IoY29uc3QgY2hhciAqbWltZSkgY29uc3Q7CisgICAgaW5saW5lIGJvb2wgaXNFbmNvZGVyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gZ2V0QXR0cmlidXRlcygpICYga0ZsYWdJc0VuY29kZXI7CisgICAgfQorCisgICAgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKCkgY29uc3Q7CisgICAgdm9pZCBnZXRTdXBwb3J0ZWRNZWRpYVR5cGVzKFZlY3RvcjxBU3RyaW5nPiAqbWVkaWFUeXBlcykgY29uc3Q7CisgICAgY29uc3Qgc3A8Q2FwYWJpbGl0aWVzPiBnZXRDYXBhYmlsaXRpZXNGb3IoY29uc3QgY2hhciAqbWVkaWFUeXBlKSBjb25zdDsKICAgICBjb25zdCBjaGFyICpnZXRDb2RlY05hbWUoKSBjb25zdDsKIAogICAgIC8qKgorICAgICAqIFJldHVybnMgYSB2ZWN0b3IgY29udGFpbmluZyBhbHRlcm5hdGUgbmFtZXMgZm9yIHRoZSBjb2RlYy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhbGlhc2VzIHRoZSBkZXN0aW5hdGlvbiBhcnJheSBmb3IgdGhlIGFsaWFzZXMuIFRoaXMgaXMgY2xlYXJlZC4KKyAgICAgKgorICAgICAqIE11bHRpcGxlIGNvZGVjcyBtYXkgc2hhcmUgYWx0ZXJuYXRlIG5hbWVzIGFzIGxvbmcgYXMgdGhlaXIgc3VwcG9ydGVkIG1lZGlhIHR5cGVzIGFyZQorICAgICAqIGRpc3RpbmN0OyBob3dldmVyLCB0aGVzZSB3aWxsIHJlc3VsdCBpbiBkaWZmZXJlbnQgYWxpYXNlcyBmb3IgdGhlIE1lZGlhQ29kZWMgdXNlciBhcworICAgICAqIHRoZSBjYW5vbmljYWwgY29kZWMgaGFzIHRvIGJlIHJlc29sdmVkIHdpdGhvdXQga25vd2luZyB0aGUgbWVkaWEgdHlwZSBpbgorICAgICAqIE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZS4KKyAgICAgKi8KKyAgICB2b2lkIGdldEFsaWFzZXMoVmVjdG9yPEFTdHJpbmc+ICphbGlhc2VzKSBjb25zdDsKKworICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgc2VydmljZSB0aGF0IGhvc3RzIHRoZSBjb2RlYy4gVGhpcyB2YWx1ZSBpcyBub3QKICAgICAgKiB2aXNpYmxlIGF0IHRoZSBKYXZhIGxldmVsLgogICAgICAqCiAgICAgICogQ3VycmVudGx5LCB0aGlzIGlzIHRoZSAiaW5zdGFuY2UgbmFtZSIgb2YgdGhlIElPbXggc2VydmljZS4KICAgICAgKi8KICAgICBjb25zdCBjaGFyICpnZXRPd25lck5hbWUoKSBjb25zdDsKLSAgICB1aW50MzJfdCByYW5rKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSByYW5rIG9mIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUZWNobmljYWxseSB0aGlzIGlzIGRlZmluZWQgdG8gYmUgcGVyIG1lZGlhIHR5cGUsIGJ1dCB0aGF0IG1ha2VzIG9yZGVyaW5nIHRoZSBNZWRpYUNvZGVjTGlzdAorICAgICAqIGltcG9zc2libGUgYXMgTWVkaWFDb2RlY0xpc3QgaXMgb3JkZXJlZCBieSBjb2RlYyBuYW1lLgorICAgICAqLworICAgIHVpbnQzMl90IGdldFJhbmsoKSBjb25zdDsKIAogICAgIC8qKgogICAgICAqIFNlcmlhbGl6YXRpb24gb3ZlciBCaW5kZXIKQEAgLTE4MSwxMSArMjMxLDEyIEBACiBwcml2YXRlOgogICAgIEFTdHJpbmcgbU5hbWU7CiAgICAgQVN0cmluZyBtT3duZXI7Ci0gICAgYm9vbCBtSXNFbmNvZGVyOworICAgIEF0dHJpYnV0ZXMgbUF0dHJpYnV0ZXM7CiAgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgc3A8Q2FwYWJpbGl0aWVzPiA+IG1DYXBzOworICAgIFZlY3RvcjxBU3RyaW5nPiBtQWxpYXNlczsKICAgICB1aW50MzJfdCBtUmFuazsKIAotICAgIHNzaXplX3QgZ2V0Q2FwYWJpbGl0eUluZGV4KGNvbnN0IGNoYXIgKm1pbWUpIGNvbnN0OworICAgIHNzaXplX3QgZ2V0Q2FwYWJpbGl0eUluZGV4KGNvbnN0IGNoYXIgKm1lZGlhVHlwZSkgY29uc3Q7CiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgYW4gYE1lZGlhQ29kZWNJbmZvYCBvYmplY3QuIEFmdGVyIHRoZSBjb25zdHJ1Y3Rpb24sIGl0cwpAQCAtMjE5LDYgKzI3MCwxMyBAQAogICAgICAqLwogICAgIHZvaWQgc2V0TmFtZShjb25zdCBjaGFyKiBuYW1lKTsKICAgICAvKioKKyAgICAgKiBBZGRzIGFuIGFsaWFzIChhbHRlcm5hdGUgbmFtZSkgZm9yIHRoZSBjb2RlYy4gTXVsdGlwbGUgY29kZWNzIGNhbiBzaGFyZSBhbiBhbHRlcm5hdGUgbmFtZQorICAgICAqIGFzIGxvbmcgYXMgdGhlaXIgc3VwcG9ydGVkIG1lZGlhIHR5cGVzIGFyZSBkaXN0aW5jdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIGFuIGFsdGVybmF0ZSBuYW1lLgorICAgICAqLworICAgIHZvaWQgYWRkQWxpYXMoY29uc3QgY2hhciogbmFtZSk7CisgICAgLyoqCiAgICAgICogU2V0IHRoZSBvd25lciBuYW1lIG9mIHRoZSBjb2RlYy4KICAgICAgKgogICAgICAqIFRoaXMgIm93bmVyIG5hbWUiIGlzIHRoZSBuYW1lIG9mIHRoZSBgSU9teGAgaW5zdGFuY2UgdGhhdCBzdXBwb3J0cyB0aGlzCkBAIC0yMjgsMzIgKzI4NiwzMiBAQAogICAgICAqLwogICAgIHZvaWQgc2V0T3duZXIoY29uc3QgY2hhciogb3duZXIpOwogICAgIC8qKgotICAgICAqIFNldCB3aGV0aGVyIHRoaXMgY29kZWMgaXMgYW4gZW5jb2RlciBvciBhIGRlY29kZXIuCisgICAgICogU2V0cyBjb2RlYyBhdHRyaWJ1dGVzLgogICAgICAqCi0gICAgICogQHBhcmFtIGlzRW5jb2RlciBXaGV0aGVyIHRoaXMgY29kZWMgaXMgYW4gZW5jb2RlciBvciBhIGRlY29kZXIuCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgQ29kZWMgYXR0cmlidXRlcy4KICAgICAgKi8KLSAgICB2b2lkIHNldEVuY29kZXIoYm9vbCBpc0VuY29kZXIgPSB0cnVlKTsKKyAgICB2b2lkIHNldEF0dHJpYnV0ZXModHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8TWVkaWFDb2RlY0luZm86OkF0dHJpYnV0ZXM+Ojp0eXBlIGF0dHJpYnV0ZXMpOwogICAgIC8qKgotICAgICAqIEFkZCBhIG1pbWUgdG8gYW4gaW5kZXhlZCBsaXN0IGFuZCByZXR1cm4gYSBgQ2FwYWJpbGl0aWVzV3JpdGVyYCBvYmplY3QKKyAgICAgKiBBZGQgYSBtZWRpYSB0eXBlIHRvIGFuIGluZGV4ZWQgbGlzdCBhbmQgcmV0dXJuIGEgYENhcGFiaWxpdGllc1dyaXRlcmAgb2JqZWN0CiAgICAgICogdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kaWZ5aW5nIHRoZSBhc3NvY2lhdGVkIGBDYXBhYmlsaXRpZXNgLgogICAgICAqCi0gICAgICogSWYgdGhlIG1pbWUgYWxyZWFkeSBleGlzdHMsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlCi0gICAgICogYENhcGFiaWxpdGllc1dyaXRlcmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBtaW1lLgorICAgICAqIElmIHRoZSBtZWRpYSB0eXBlIGFscmVhZHkgZXhpc3RzLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZQorICAgICAqIGBDYXBhYmlsaXRpZXNXcml0ZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVkaWEgdHlwZS4KICAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gbWltZSBUaGUgbmFtZSBvZiBhIG5ldyBtaW1lIHRvIGFkZC4KKyAgICAgKiBAcGFyYW1baW5dIG1lZGlhVHlwZSBUaGUgbmFtZSBvZiBhIG5ldyBtZWRpYSB0eXBlIHRvIGFkZC4KICAgICAgKiBAcmV0dXJuIHdyaXRlciBUaGUgYENhcGFiaWxpdGllc1dyaXRlcmAgb2JqZWN0IGZvciBtb2RpZnlpbmcgdGhlCi0gICAgICogYENhcGFiaWxpdGllc2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBtaW1lLiBgd3JpdGVyYCB3aWxsIGJlIHZhbGlkCi0gICAgICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGBtaW1lYCBhbHJlYWR5IGV4aXN0cyBvciBub3QuCisgICAgICogYENhcGFiaWxpdGllc2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZWRpYSB0eXBlLiBgd3JpdGVyYCB3aWxsIGJlIHZhbGlkCisgICAgICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGBtZWRpYVR5cGVgIGFscmVhZHkgZXhpc3RzIG9yIG5vdC4KICAgICAgKi8KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4gYWRkTWltZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1pbWUpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyPiBhZGRNZWRpYVR5cGUoCisgICAgICAgICAgICBjb25zdCBjaGFyKiBtZWRpYVR5cGUpOwogICAgIC8qKgotICAgICAqIFJlbW92ZSBhIG1pbWUuCisgICAgICogUmVtb3ZlIGEgbWVkaWEgdHlwZS4KICAgICAgKgotICAgICAqIEBwYXJhbSBtaW1lIFRoZSBuYW1lIG9mIHRoZSBtaW1lIHRvIHJlbW92ZS4KLSAgICAgKiBAcmV0dXJuIGB0cnVlYCBpZiBgbWltZWAgaXMgcmVtb3ZlZDsgYGZhbHNlYCBpZiBgbWltZWAgaXMgbm90IGZvdW5kLgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgVGhlIG5hbWUgb2YgdGhlIG1lZGlhIHR5cGUgdG8gcmVtb3ZlLgorICAgICAqIEByZXR1cm4gYHRydWVgIGlmIGBtZWRpYVR5cGVgIGlzIHJlbW92ZWQ7IGBmYWxzZWAgaWYgYG1lZGlhVHlwZWAgaXMgbm90IGZvdW5kLgogICAgICAqLwotICAgIGJvb2wgcmVtb3ZlTWltZShjb25zdCBjaGFyKiBtaW1lKTsKKyAgICBib29sIHJlbW92ZU1lZGlhVHlwZShjb25zdCBjaGFyKiBtZWRpYVR5cGUpOwogICAgIC8qKgogICAgICAqIFNldCByYW5rIG9mIHRoZSBjb2RlYy4gTWVkaWFDb2RlY0xpc3Qgd2lsbCBzdGFibGUtc29ydCB0aGUgbGlzdCBhY2NvcmRpbmcKICAgICAgKiB0byByYW5rIGluIG5vbi1kZXNjZW5kaW5nIG9yZGVyLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaAppbmRleCAwZmViNGYzLi4zZThlN2M4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaApAQCAtMzQsNyArMzQsMTEgQEAKICAgICBDQU1DT1JERVJfUVVBTElUWV8xMDgwUCA9IDYsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfUVZHQSA9IDcsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfMjE2MFAgPSA4LAotICAgIENBTUNPUkRFUl9RVUFMSVRZX0xJU1RfRU5EID0gOCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9WR0EgPSA5LAorICAgIENBTUNPUkRFUl9RVUFMSVRZXzRLRENJID0gMTAsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfUUhEID0gMTEsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfMmsgPSAxMiwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9MSVNUX0VORCA9IDEyLAogCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MSVNUX1NUQVJUID0gMTAwMCwKICAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xPVyAgPSAxMDAwLApAQCAtNDYsNyArNTAsMTEgQEAKICAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzEwODBQID0gMTAwNiwKICAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX1FWR0EgPSAxMDA3LAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMjE2MFAgPSAxMDA4LAotICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTElTVF9FTkQgPSAxMDA4LAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfVkdBID0gMTAwOSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzRLRENJID0gMTAxMCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX1FIRCA9IDEwMTEsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV8yayA9IDEwMTIsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MSVNUX0VORCA9IDEwMTIsCiAKICAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0xJU1RfU1RBUlQgPSAyMDAwLAogICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfTE9XICA9IDIwMDAsCkBAIC01NSw3ICs2MywxMCBAQAogICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfNzIwUCA9IDIwMDMsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF8xMDgwUCA9IDIwMDQsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF8yMTYwUCA9IDIwMDUsCi0gICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MSVNUX0VORCA9IDIwMDUsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9DSUYgPSAyMDA2LAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfVkdBID0gMjAwNywKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzRLRENJID0gMjAwOCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0xJU1RfRU5EID0gMjAwOCwKIH07CiAKIGVudW0gdmlkZW9fZGVjb2RlciB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKaW5kZXggNTM0MGRkZS4uODgyODJhYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaApAQCAtNzIsNiArNzIsOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKAogICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBjb25zdCA9IDA7CiAKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWlkaUlvV3JhcHBlci5oCmluZGV4IGI1ZTU2NWUuLmIxOWQ0OWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWlkaUlvV3JhcHBlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWlkaUlvV3JhcHBlci5oCkBAIC0yMywxMSArMjMsMTQgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgQ0RhdGFTb3VyY2U7CitjbGFzcyBEYXRhU291cmNlVW53cmFwcGVyOworCiBjbGFzcyBNaWRpSW9XcmFwcGVyIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBNaWRpSW9XcmFwcGVyKGNvbnN0IGNoYXIgKnBhdGgpOwogICAgIGV4cGxpY2l0IE1pZGlJb1dyYXBwZXIoaW50IGZkLCBvZmY2NF90IG9mZnNldCwgaW50NjRfdCBzaXplKTsKLSAgICBleHBsaWNpdCBNaWRpSW9XcmFwcGVyKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworICAgIGV4cGxpY2l0IE1pZGlJb1dyYXBwZXIoQ0RhdGFTb3VyY2UgKmNzb3VyY2UpOwogCiAgICAgfk1pZGlJb1dyYXBwZXIoKTsKIApAQCAtNDAsNyArNDMsNyBAQAogICAgIGludCBtRmQ7CiAgICAgb2ZmNjRfdCBtQmFzZTsKICAgICBpbnQ2NF90ICBtTGVuZ3RoOwotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlVW53cmFwcGVyICptRGF0YVNvdXJjZTsKICAgICBFQVNfRklMRSBtRWFzRmlsZTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTmRrV3JhcHBlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9OZGtXcmFwcGVyLmgKaW5kZXggYzk3ZDE3MS4uOGE0MTdmNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9OZGtXcmFwcGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9OZGtXcmFwcGVyLmgKQEAgLTI3OCw2ICsyNzgsMjUgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVkaWFDb2RlY1dyYXBwZXIpOwogfTsKIAorc3RydWN0IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgeworCisgICAgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoY29uc3Qgc3A8RGF0YVNvdXJjZT4mKTsKKyAgICBBTWVkaWFEYXRhU291cmNlV3JhcHBlcihBTWVkaWFEYXRhU291cmNlKik7CisKKyAgICBBTWVkaWFEYXRhU291cmNlICpnZXRBTWVkaWFEYXRhU291cmNlKCk7CisKKyAgICB2b2lkIGNsb3NlKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BTWVkaWFEYXRhU291cmNlV3JhcHBlcigpOworCitwcml2YXRlOgorICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOworICAgIEFNZWRpYURhdGFTb3VyY2UgKm1BTWVkaWFEYXRhU291cmNlOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIpOworfTsKKwogc3RydWN0IEFNZWRpYUV4dHJhY3RvcldyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiAKICAgICBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyKEFNZWRpYUV4dHJhY3RvciAqYU1lZGlhRXh0cmFjdG9yKTsKQEAgLTI4Nyw4ICszMDYsNiBAQAogCiAgICAgc3RhdHVzX3QgcmVsZWFzZSgpOwogCi0gICAgc3RhdHVzX3QgZGlzY29ubmVjdCgpOwotCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCk7CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IGNoYXIgKmxvY2F0aW9uKTsKQEAgLTMzOSwzMSArMzU2LDYgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVkaWFFeHRyYWN0b3JXcmFwcGVyKTsKIH07CiAKLXN0cnVjdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3IobWVkaWFfc3RhdHVzX3QgZXJyKTsKLQotICAgIHN0YXRpYyBzc2l6ZV90IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2dldFNpemUodm9pZCAqdXNlcmRhdGEpOwotCi0gICAgc3RhdGljIHNzaXplX3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfcmVhZEF0KHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCwgdm9pZCAqIGJ1Ziwgc2l6ZV90IHNpemUpOwotCi0gICAgc3RhdGljIHZvaWQgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfY2xvc2Uodm9pZCAqdXNlcmRhdGEpOwotCi0gICAgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UpOwotCi0gICAgQU1lZGlhRGF0YVNvdXJjZSAqZ2V0QU1lZGlhRGF0YVNvdXJjZSgpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoKTsKLQotcHJpdmF0ZToKLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLQotICAgIEFNZWRpYURhdGFTb3VyY2UgKm1BTWVkaWFEYXRhU291cmNlOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIpOwotfTsKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBOREtfV1JBUFBFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9QYXRjaEJ1aWxkZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUGF0Y2hCdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI3MjJhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUGF0Y2hCdWlsZGVyLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfUEFUQ0hfQlVJTERFUl9ICisjZGVmaW5lIEFORFJPSURfUEFUQ0hfQlVJTERFUl9ICisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKKy8vIFRoaXMgaXMgYSBoZWFkZXItb25seSB1dGlsaXR5LgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFBhdGNoQnVpbGRlciB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBtaXhfdXNlY2FzZV90ID0gZGVjbHR5cGUoYXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dDo6dXNlY2FzZSk7CisKKyAgICBQYXRjaEJ1aWxkZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBBbGwgZXhpc3RpbmcgbWV0aG9kcyBvcGVyYXRpbmcgb24gYXVkaW8gcGF0Y2hlcyB0YWtlIGEgcG9pbnRlciB0byBjb25zdC4KKyAgICAvLyBJdCdzIE9LIHRvIGNvbnN0cnVjdCBhIHRlbXBvcmFyeSBQYXRjaEJ1aWxkZXIgd2hpbGUgcHJlcGFyaW5nIGEgcGFyYW1ldGVyCisgICAgLy8gdG8gc3VjaCBhIGZ1bmN0aW9uIGJlY2F1c2UgdGhlIEJ1aWxkZXIgd2lsbCBiZSBrZXB0IGFsaXZlIHVudGlsIHRoZSBjb2RlCisgICAgLy8gZXhlY3V0aW9uIHJlYWNoZXMgdGhlIGZ1bmN0aW9uIGNhbGwgc3RhdGVtZW50IHNlbWljb2xvbi4KKyAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2gqIHBhdGNoKCkgY29uc3QgeyByZXR1cm4gJm1QYXRjaDsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gUz4KKyAgICBQYXRjaEJ1aWxkZXImIGFkZFNpbmsoVCYmIHQsIFMmJi4uLiBzKSB7CisgICAgICAgIHNpbmtzKCkuYWRkKHN0ZDo6Zm9yd2FyZDxUPih0KSwgc3RkOjpmb3J3YXJkPFM+KHMpLi4uKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICAvLyBFeHBsaWNpdCB0eXBlIG9mIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGFsbG93cyBjbGllbnRzIHRvIHByb3ZpZGUgdGhlIHN0cnVjdCBpbmxpbmUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBQYXRjaEJ1aWxkZXImIGFkZFNpbmsoVCYmIHQsIGNvbnN0IG1peF91c2VjYXNlX3QmIHVwZGF0ZSkgeworICAgICAgICBzaW5rcygpLmFkZChzdGQ6OmZvcndhcmQ8VD4odCksIHVwZGF0ZSk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gUz4KKyAgICBQYXRjaEJ1aWxkZXImIGFkZFNvdXJjZShUJiYgdCwgUyYmLi4uIHMpIHsKKyAgICAgICAgc291cmNlcygpLmFkZChzdGQ6OmZvcndhcmQ8VD4odCksIHN0ZDo6Zm9yd2FyZDxTPihzKS4uLik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgLy8gRXhwbGljaXQgdHlwZSBvZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBhbGxvd3MgY2xpZW50cyB0byBwcm92aWRlIHRoZSBzdHJ1Y3QgaW5saW5lLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgUGF0Y2hCdWlsZGVyJiBhZGRTb3VyY2UoVCYmIHQsIGNvbnN0IG1peF91c2VjYXNlX3QmIHVwZGF0ZSkgeworICAgICAgICBzb3VyY2VzKCkuYWRkKHN0ZDo6Zm9yd2FyZDxUPih0KSwgdXBkYXRlKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICBwcml2YXRlOgorICAgIHN0cnVjdCBQb3J0Q2ZncyB7CisgICAgICAgIFBvcnRDZmdzKHVuc2lnbmVkIGludCAqY291bnRQdHIsIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqcG9ydENmZ3MpCisgICAgICAgICAgICAgICAgOiBtQ291bnRQdHIoY291bnRQdHIpLCBtUG9ydENmZ3MocG9ydENmZ3MpIHt9CisgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnJiBhZGQoY29uc3QgYXVkaW9fcG9ydF9jb25maWcmIHBvcnRDZmcpIHsKKyAgICAgICAgICAgIHJldHVybiAqYWR2YW5jZSgpID0gcG9ydENmZzsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyYgYWRkKGNvbnN0IHNwPFQ+JiBlbnRpdHkpIHsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnKiBhZGRlZCA9IGFkdmFuY2UoKTsKKyAgICAgICAgICAgIGVudGl0eS0+dG9BdWRpb1BvcnRDb25maWcoYWRkZWQpOworICAgICAgICAgICAgcmV0dXJuICphZGRlZDsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICB2b2lkIGFkZChjb25zdCBzcDxUPiYgZW50aXR5LCBjb25zdCBtaXhfdXNlY2FzZV90JiB1c2VjYXNlVXBkYXRlKSB7CisgICAgICAgICAgICBhZGQoZW50aXR5KS5leHQubWl4LnVzZWNhc2UgPSB1c2VjYXNlVXBkYXRlOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHZvaWQgYWRkKGNvbnN0IHNwPFQ+JiBlbnRpdHksCisgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxtaXhfdXNlY2FzZV90KGNvbnN0IG1peF91c2VjYXNlX3QmKT4gdXNlY2FzZVVwZGF0ZXIpIHsKKyAgICAgICAgICAgIG1peF91c2VjYXNlX3QqIHVzZWNhc2UgPSAmYWRkKGVudGl0eSkuZXh0Lm1peC51c2VjYXNlOworICAgICAgICAgICAgKnVzZWNhc2UgPSB1c2VjYXNlVXBkYXRlcigqdXNlY2FzZSk7CisgICAgICAgIH0KKyAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnKiBhZHZhbmNlKCkgeworICAgICAgICAgICAgcmV0dXJuICZtUG9ydENmZ3NbKCptQ291bnRQdHIpKytdOworICAgICAgICB9CisgICAgICAgIHVuc2lnbmVkIGludCAqbUNvdW50UHRyOworICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKm1Qb3J0Q2ZnczsKKyAgICB9OworCisgICAgUG9ydENmZ3Mgc2lua3MoKSB7IHJldHVybiBQb3J0Q2ZncygmbVBhdGNoLm51bV9zaW5rcywgbVBhdGNoLnNpbmtzKTsgfQorICAgIFBvcnRDZmdzIHNvdXJjZXMoKSB7IHJldHVybiBQb3J0Q2ZncygmbVBhdGNoLm51bV9zb3VyY2VzLCBtUGF0Y2guc291cmNlcyk7IH0KKworICAgIHN0cnVjdCBhdWRpb19wYXRjaCBtUGF0Y2ggPSB7fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9QQVRDSF9CVUlMREVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmgKaW5kZXggZDQyMzk2Mi4uYzI3NjFjYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmgKQEAgLTk5LDYgKzk5LDEzIEBACiAgICAgICAgICAgICByZXR1cm4gbVNoYXJlZC0+bUFjayAtIHNlcXVlbmNlID49IDA7CiAgICAgICAgIH0KIAorICAgICAgICAvLyByZXR1cm5zIHRoZSBsYXN0IHZhbHVlIHdyaXR0ZW4gKG9yIHRoZSBjb250ZW50cyBvZiB0aGUgc2hhcmVkIGJ1ZmZlciBhZnRlciBpbml0aWFsaXphdGlvbgorICAgICAgICAvLyBpZiBubyB2YWx1ZSB3YXMgd3JpdHRlbikuCisgICAgICAgIFQgbGFzdCgpIGNvbnN0CisgICAgICAgIHsgICAvLyBhc3N1bWUgbm8gc2VxdWVuY2UgY2hlY2sgcmVxdWlyZWQgLSB3ZSBhcmUgdGhlIHdyaXRlci4KKyAgICAgICAgICAgIHJldHVybiBtU2hhcmVkLT5tVmFsdWU7CisgICAgICAgIH0KKwogICAgIHByaXZhdGU6CiAgICAgICAgIGludDMyX3QgICAgIG1TZXF1ZW5jZTsKICAgICAgICAgU2hhcmVkICogY29uc3QgbVNoYXJlZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UeXBlQ29udmVydGVyLmgKaW5kZXggODZmMGQ0Yy4uM2FjZmU5OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UeXBlQ29udmVydGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UeXBlQ29udmVydGVyLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKKyNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CkBAIC0zMCw3NyArMzEsNTUgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgU2FtcGxlUmF0ZVRyYWl0cwotewotICAgIHR5cGVkZWYgdWludDMyX3QgVHlwZTsKLSAgICB0eXBlZGVmIFNvcnRlZFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBEZXZpY2VUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX2RldmljZXNfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IE91dHB1dERldmljZVRyYWl0cyA6IHB1YmxpYyBEZXZpY2VUcmFpdHMge307Ci1zdHJ1Y3QgSW5wdXREZXZpY2VUcmFpdHMgOiBwdWJsaWMgRGV2aWNlVHJhaXRzIHt9Owotc3RydWN0IE91dHB1dEZsYWdUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX291dHB1dF9mbGFnc190IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgSW5wdXRGbGFnVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19pbnB1dF9mbGFnc190IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgRm9ybWF0VHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19mb3JtYXRfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IENoYW5uZWxUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX2NoYW5uZWxfbWFza190IFR5cGU7Ci0gICAgdHlwZWRlZiBTb3J0ZWRWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgT3V0cHV0Q2hhbm5lbFRyYWl0cyA6IHB1YmxpYyBDaGFubmVsVHJhaXRzIHt9Owotc3RydWN0IElucHV0Q2hhbm5lbFRyYWl0cyA6IHB1YmxpYyBDaGFubmVsVHJhaXRzIHt9Owotc3RydWN0IENoYW5uZWxJbmRleFRyYWl0cyA6IHB1YmxpYyBDaGFubmVsVHJhaXRzIHt9Owotc3RydWN0IEdhaW5Nb2RlVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19nYWluX21vZGVfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IFN0cmVhbVRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fc3RyZWFtX3R5cGVfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IEF1ZGlvTW9kZVRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fbW9kZV90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgQXVkaW9Db250ZW50VHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19jb250ZW50X3R5cGVfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IFVzYWdlVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb191c2FnZV90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgU291cmNlVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19zb3VyY2VfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19OwogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBzdHJ1Y3QgRGVmYXVsdFRyYWl0cwogewogICAgIHR5cGVkZWYgVCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247CisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOworICAgIHN0YXRpYyB2b2lkIGFkZChDb2xsZWN0aW9uICZjb2xsZWN0aW9uLCBUeXBlIHZhbHVlKQorICAgIHsKKyAgICAgICAgY29sbGVjdGlvbi5wdXNoX2JhY2sodmFsdWUpOworICAgIH0KIH07Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBWZWN0b3JUcmFpdHMKK3sKKyAgICB0eXBlZGVmIFQgVHlwZTsKKyAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOworICAgIHN0YXRpYyB2b2lkIGFkZChDb2xsZWN0aW9uICZjb2xsZWN0aW9uLCBUeXBlIHZhbHVlKQorICAgIHsKKyAgICAgICAgY29sbGVjdGlvbi5hZGQodmFsdWUpOworICAgIH0KK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBTb3J0ZWRWZWN0b3JUcmFpdHMKK3sKKyAgICB0eXBlZGVmIFQgVHlwZTsKKyAgICB0eXBlZGVmIFNvcnRlZFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOworICAgIHN0YXRpYyB2b2lkIGFkZChDb2xsZWN0aW9uICZjb2xsZWN0aW9uLCBUeXBlIHZhbHVlKQorICAgIHsKKyAgICAgICAgY29sbGVjdGlvbi5hZGQodmFsdWUpOworICAgIH0KK307CisKK3VzaW5nIFNhbXBsZVJhdGVUcmFpdHMgPSBTb3J0ZWRWZWN0b3JUcmFpdHM8dWludDMyX3Q+OwordXNpbmcgRGV2aWNlVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb19kZXZpY2VzX3Q+Oworc3RydWN0IE91dHB1dERldmljZVRyYWl0cyA6IHB1YmxpYyBEZXZpY2VUcmFpdHMge307CitzdHJ1Y3QgSW5wdXREZXZpY2VUcmFpdHMgOiBwdWJsaWMgRGV2aWNlVHJhaXRzIHt9OwordXNpbmcgQ2hhbm5lbFRyYWl0cyA9IFNvcnRlZFZlY3RvclRyYWl0czxhdWRpb19jaGFubmVsX21hc2tfdD47CitzdHJ1Y3QgT3V0cHV0Q2hhbm5lbFRyYWl0cyA6IHB1YmxpYyBDaGFubmVsVHJhaXRzIHt9Oworc3RydWN0IElucHV0Q2hhbm5lbFRyYWl0cyA6IHB1YmxpYyBDaGFubmVsVHJhaXRzIHt9Oworc3RydWN0IENoYW5uZWxJbmRleFRyYWl0cyA6IHB1YmxpYyBDaGFubmVsVHJhaXRzIHt9OwordXNpbmcgSW5wdXRGbGFnVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb19pbnB1dF9mbGFnc190PjsKK3VzaW5nIE91dHB1dEZsYWdUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX291dHB1dF9mbGFnc190PjsKK3VzaW5nIEZvcm1hdFRyYWl0cyA9IFZlY3RvclRyYWl0czxhdWRpb19mb3JtYXRfdD47Cit1c2luZyBHYWluTW9kZVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fZ2Fpbl9tb2RlX3Q+OwordXNpbmcgU3RyZWFtVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb19zdHJlYW1fdHlwZV90PjsKK3VzaW5nIEF1ZGlvTW9kZVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fbW9kZV90PjsKK3VzaW5nIEF1ZGlvQ29udGVudFRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fY29udGVudF90eXBlX3Q+OwordXNpbmcgVXNhZ2VUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX3VzYWdlX3Q+OwordXNpbmcgU291cmNlVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb19zb3VyY2VfdD47CitzdHJ1Y3QgQXVkaW9GbGFnVHJhaXRzIDogcHVibGljIERlZmF1bHRUcmFpdHM8YXVkaW9fZmxhZ3NfbWFza190PiB7fTsKIAogdGVtcGxhdGUgPGNsYXNzIFRyYWl0cz4KIHN0YXRpYyB2b2lkIGNvbGxlY3Rpb25Gcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIHR5cGVuYW1lIFRyYWl0czo6Q29sbGVjdGlvbiAmY29sbGVjdGlvbiwKQEAgLTExMCw3ICs4OSw3IEBACiAgICAgZm9yIChjb25zdCBjaGFyICpjc3RyID0gc3RydG9rKGxpdGVyYWwsIGRlbCk7IGNzdHIgIT0gTlVMTDsgY3N0ciA9IHN0cnRvayhOVUxMLCBkZWwpKSB7CiAgICAgICAgIHR5cGVuYW1lIFRyYWl0czo6VHlwZSB2YWx1ZTsKICAgICAgICAgaWYgKHV0aWxpdGllczo6Y29udmVydFRvPHN0ZDo6c3RyaW5nLCB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgPihjc3RyLCB2YWx1ZSkpIHsKLSAgICAgICAgICAgIGNvbGxlY3Rpb24uYWRkKHZhbHVlKTsKKyAgICAgICAgICAgIFRyYWl0czo6YWRkKGNvbGxlY3Rpb24sIHZhbHVlKTsKICAgICAgICAgfQogICAgIH0KICAgICBmcmVlKGxpdGVyYWwpOwpAQCAtMTgxLDcgKzE2MCw3IEBACiAgICAgZm9yIChjb25zdCBjaGFyICpjc3RyID0gc3RydG9rKGxpdGVyYWwsIGRlbCk7IGNzdHIgIT0gTlVMTDsgY3N0ciA9IHN0cnRvayhOVUxMLCBkZWwpKSB7CiAgICAgICAgIHR5cGVuYW1lIFRyYWl0czo6VHlwZSB2YWx1ZTsKICAgICAgICAgaWYgKGZyb21TdHJpbmcoY3N0ciwgdmFsdWUpKSB7Ci0gICAgICAgICAgICBjb2xsZWN0aW9uLmFkZCh2YWx1ZSk7CisgICAgICAgICAgICBUcmFpdHM6OmFkZChjb2xsZWN0aW9uLCB2YWx1ZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgZnJlZShsaXRlcmFsKTsKQEAgLTIzNCw2ICsyMTMsNyBAQAogdHlwZWRlZiBUeXBlQ29udmVydGVyPEF1ZGlvQ29udGVudFRyYWl0cz4gQXVkaW9Db250ZW50VHlwZUNvbnZlcnRlcjsKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxVc2FnZVRyYWl0cz4gVXNhZ2VUeXBlQ29udmVydGVyOwogdHlwZWRlZiBUeXBlQ29udmVydGVyPFNvdXJjZVRyYWl0cz4gU291cmNlVHlwZUNvbnZlcnRlcjsKK3R5cGVkZWYgVHlwZUNvbnZlcnRlcjxBdWRpb0ZsYWdUcmFpdHM+IEF1ZGlvRmxhZ0NvbnZlcnRlcjsKIAogdGVtcGxhdGU8PiBjb25zdCBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OlRhYmxlIE91dHB1dERldmljZUNvbnZlcnRlcjo6bVRhYmxlW107CiB0ZW1wbGF0ZTw+IGNvbnN0IElucHV0RGV2aWNlQ29udmVydGVyOjpUYWJsZSBJbnB1dERldmljZUNvbnZlcnRlcjo6bVRhYmxlW107CkBAIC0yNDksMTEgKzIyOSwxMCBAQAogdGVtcGxhdGU8PiBjb25zdCBBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOjpUYWJsZSBBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOjptVGFibGVbXTsKIHRlbXBsYXRlPD4gY29uc3QgVXNhZ2VUeXBlQ29udmVydGVyOjpUYWJsZSBVc2FnZVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwogdGVtcGxhdGU8PiBjb25zdCBTb3VyY2VUeXBlQ29udmVydGVyOjpUYWJsZSBTb3VyY2VUeXBlQ29udmVydGVyOjptVGFibGVbXTsKK3RlbXBsYXRlPD4gY29uc3QgQXVkaW9GbGFnQ29udmVydGVyOjpUYWJsZSBBdWRpb0ZsYWdDb252ZXJ0ZXI6Om1UYWJsZVtdOwogCiBib29sIGRldmljZUZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGxpdGVyYWxEZXZpY2UsIGF1ZGlvX2RldmljZXNfdCYgZGV2aWNlKTsKIAotYm9vbCBkZXZpY2VUb1N0cmluZyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBzdGQ6OnN0cmluZyYgbGl0ZXJhbERldmljZSk7Ci0KIFNhbXBsZVJhdGVUcmFpdHM6OkNvbGxlY3Rpb24gc2FtcGxpbmdSYXRlc0Zyb21TdHJpbmcoCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzYW1wbGluZ1JhdGVzLCBjb25zdCBjaGFyICpkZWwgPSBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKTsKIApAQCAtMjc0LDYgKzI1Myw2NSBAQAogT3V0cHV0Q2hhbm5lbFRyYWl0czo6Q29sbGVjdGlvbiBvdXRwdXRDaGFubmVsTWFza3NGcm9tU3RyaW5nKAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmb3V0Q2hhbm5lbHMsIGNvbnN0IGNoYXIgKmRlbCA9IEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IpOwogCisvLyBjb3VudGluZyBlbnVtZXJhdGlvbnMKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OmVuYWJsZV9pZl90PHN0ZDo6aXNfc2FtZTxULCBhdWRpb19jb250ZW50X3R5cGVfdD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8VCwgYXVkaW9fbW9kZV90Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxULCBhdWRpb19zb3VyY2VfdD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8VCwgYXVkaW9fc3RyZWFtX3R5cGVfdD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8VCwgYXVkaW9fdXNhZ2VfdD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGludD4gPSAwPgorc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBUJiB2YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgcmV0dXJuIFR5cGVDb252ZXJ0ZXI8RGVmYXVsdFRyYWl0czxUPj46OnRvU3RyaW5nKHZhbHVlLCByZXN1bHQpCisgICAgICAgICAgICA/IHJlc3VsdCA6IHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludD4odmFsdWUpKTsKKworfQorCisvLyBmbGFnIGVudW1lcmF0aW9ucwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHN0ZDo6ZW5hYmxlX2lmX3Q8c3RkOjppc19zYW1lPFQsIGF1ZGlvX2dhaW5fbW9kZV90Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxULCBhdWRpb19pbnB1dF9mbGFnc190Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxULCBhdWRpb19vdXRwdXRfZmxhZ3NfdD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGludD4gPSAwPgorc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBUJiB2YWx1ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgVHlwZUNvbnZlcnRlcjxEZWZhdWx0VHJhaXRzPFQ+Pjo6bWFza1RvU3RyaW5nKHZhbHVlLCByZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoY29uc3QgYXVkaW9fZGV2aWNlc190JiBkZXZpY2VzKQoreworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICBpZiAoKGRldmljZXMgJiBBVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSB7CisgICAgICAgIElucHV0RGV2aWNlQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZGV2aWNlcywgcmVzdWx0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhkZXZpY2VzLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBUT0RPOiBSZW1vdmUgd2hlbiBGb3JtYXRUcmFpdHMgdXNlcyBEZWZhdWx0VHJhaXRzLgorc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBhdWRpb19mb3JtYXRfdCYgZm9ybWF0KQoreworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICByZXR1cm4gVHlwZUNvbnZlcnRlcjxWZWN0b3JUcmFpdHM8YXVkaW9fZm9ybWF0X3Q+Pjo6dG9TdHJpbmcoZm9ybWF0LCByZXN1bHQpCisgICAgICAgICAgICA/IHJlc3VsdCA6IHN0ZDo6dG9fc3RyaW5nKHN0YXRpY19jYXN0PGludD4oZm9ybWF0KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKQoreworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXN1bHQ7CisgICAgcmVzdWx0IDw8ICJ7IENvbnRlbnQgdHlwZTogIiA8PCB0b1N0cmluZyhhdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSkKKyAgICAgICAgICAgPDwgIiBVc2FnZTogIiA8PCB0b1N0cmluZyhhdHRyaWJ1dGVzLnVzYWdlKQorICAgICAgICAgICA8PCAiIFNvdXJjZTogIiA8PCB0b1N0cmluZyhhdHRyaWJ1dGVzLnNvdXJjZSkKKyAgICAgICAgICAgPDwgIiBGbGFnczogIiA8PCBhdHRyaWJ1dGVzLmZsYWdzCisgICAgICAgICAgIDw8ICIgVGFnczogIiA8PCBhdHRyaWJ1dGVzLnRhZ3MKKyAgICAgICAgICAgPDwgIiB9IjsKKworICAgIHJldHVybiByZXN1bHQuc3RyKCk7Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLypBTkRST0lEX1RZUEVfQ09OVkVSVEVSX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKaW5kZXggZDhiMGZlNy4uODU4MDQzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKQEAgLTY3LDcgKzY3LDcgQEAKICAgICBPVVRQVVRfRk9STUFUX0FBQ19BRFRTID0gNiwKIAogICAgIE9VVFBVVF9GT1JNQVRfQVVESU9fT05MWV9FTkQgPSA3LCAvLyBVc2VkIGluIHZhbGlkYXRpbmcgdGhlIG91dHB1dCBmb3JtYXQuICBTaG91bGQgYmUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICBhdCB0aGUgZW5kIG9mIHRoZSBhdWRpbyBvbmx5IG91dHB1dCBmb3JtYXRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBhdWRpbyBvbmx5IG91dHB1dCBmb3JtYXRzLgogCiAgICAgLyogU3RyZWFtIG92ZXIgYSBzb2NrZXQsIGxpbWl0ZWQgdG8gYSBzaW5nbGUgc3RyZWFtICovCiAgICAgT1VUUFVUX0ZPUk1BVF9SVFBfQVZQID0gNywKQEAgLTgxLDYgKzgxLDkgQEAKICAgICAvKiBIRUlDIGRhdGEgaW4gYSBIRUlGIGNvbnRhaW5lciAqLwogICAgIE9VVFBVVF9GT1JNQVRfSEVJRiA9IDEwLAogCisgICAgLyogT3B1cyBkYXRhIGluIGEgT0dHIGNvbnRhaW5lciAqLworICAgIE9VVFBVVF9GT1JNQVRfT0dHID0gMTEsCisKICAgICBPVVRQVVRfRk9STUFUX0xJU1RfRU5EIC8vIG11c3QgYmUgbGFzdCAtIHVzZWQgdG8gdmFsaWRhdGUgZm9ybWF0IHR5cGUKIH07CiAKQEAgLTkyLDYgKzk1LDcgQEAKICAgICBBVURJT19FTkNPREVSX0hFX0FBQyA9IDQsCiAgICAgQVVESU9fRU5DT0RFUl9BQUNfRUxEID0gNSwKICAgICBBVURJT19FTkNPREVSX1ZPUkJJUyA9IDYsCisgICAgQVVESU9fRU5DT0RFUl9PUFVTID0gNywKIAogICAgIEFVRElPX0VOQ09ERVJfTElTVF9FTkQgLy8gbXVzdCBiZSB0aGUgbGFzdCAtIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGF1ZGlvIGVuY29kZXIgdHlwZQogfTsKQEAgLTExMSw5ICsxMTUsNiBAQAogICogVGhlIHN0YXRlIG1hY2hpbmUgb2YgdGhlIG1lZGlhX3JlY29yZGVyLgogICovCiBlbnVtIG1lZGlhX3JlY29yZGVyX3N0YXRlcyB7Ci0gICAgLy8gRXJyb3Igc3RhdGUuCi0gICAgTUVESUFfUkVDT1JERVJfRVJST1IgICAgICAgICAgICAgICAgID0gICAgICAwLAotCiAgICAgLy8gUmVjb3JkZXIgd2FzIGp1c3QgY3JlYXRlZC4KICAgICBNRURJQV9SRUNPUkRFUl9JRExFICAgICAgICAgICAgICAgICAgPSAxIDw8IDAsCiAKQEAgLTEyOCw2ICsxMjksOSBAQAogCiAgICAgLy8gUmVjb3JkaW5nIGlzIGluIHByb2dyZXNzLgogICAgIE1FRElBX1JFQ09SREVSX1JFQ09SRElORyAgICAgICAgICAgICA9IDEgPDwgNCwKKworICAgIC8vIEVycm9yIHN0YXRlLgorICAgIE1FRElBX1JFQ09SREVSX0VSUk9SICAgICAgICAgICAgICAgICA9IDEgPDwgNSwKIH07CiAKIC8vIFRoZSAibXNnIiBjb2RlIHBhc3NlZCB0byB0aGUgbGlzdGVuZXIgaW4gbm90aWZ5LgpAQCAtMjYwLDYgKzI2NCwxMCBAQAogICAgIHN0YXR1c190ICAgIGdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmRldmljZUlkKTsKICAgICBzdGF0dXNfdCAgICBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CiAgICAgc3RhdHVzX3QgICAgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOworICAgIHN0YXR1c190ICAgIHNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOworICAgIHN0YXR1c190ICAgIHNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKKworICAgIHN0YXR1c190ICAgIGdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGRvQ2xlYW5VcCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE5vZGUuaAppbmRleCBlZWJjOGM2Li4xZGI0MjQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE5vZGUuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE5vZGUuaApAQCAtNTksNyArNTksNyBAQAogICogLSBUVyA9IFRyZWJsZSBXcmFwcGVyIC0tLSBJdCB3cmFwcyBhIGxlZ2FjeSBvYmplY3QgaW5zaWRlIGEgVHJlYmxlIG9iamVjdC4KICAqLwogCi1zdHJ1Y3QgTFdPbXhOb2RlIDogcHVibGljIEgyQkNvbnZlcnRlcjxJT214Tm9kZSwgSU9NWE5vZGUsIEJuT01YTm9kZT4geworc3RydWN0IExXT214Tm9kZSA6IHB1YmxpYyBIMkJDb252ZXJ0ZXI8SU9teE5vZGUsIEJuT01YTm9kZT4gewogICAgIExXT214Tm9kZShzcDxJT214Tm9kZT4gY29uc3QmIGJhc2UpIDogQ0Jhc2UoYmFzZSkge30KICAgICBzdGF0dXNfdCBmcmVlTm9kZSgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IHNlbmRDb21tYW5kKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAppbmRleCA5MmNmYjFjLi42YzU5YTI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcApAQCAtODQyLDQgKzg0MiwyNSBAQAogICAgIHJldHVybiBtTWVkaWFSZWNvcmRlci0+Z2V0QWN0aXZlTWljcm9waG9uZXMoYWN0aXZlTWljcm9waG9uZXMpOwogfQogCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyOjpzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CisgICAgQUxPR1YoInNldE1pY3JvcGhvbmVEaXJlY3Rpb24oJWQpIiwgZGlyZWN0aW9uKTsKKyAgICByZXR1cm4gbU1lZGlhUmVjb3JkZXItPnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oZGlyZWN0aW9uKTsKK30KKworc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIHsKKyAgICBBTE9HVigic2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKCVmKSIsIHpvb20pOworICAgIHJldHVybiBtTWVkaWFSZWNvcmRlci0+c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKHpvb20pOworfQorCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyOjpnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBjb25zdAoreworICAgIEFMT0dWKCJnZXRQb3J0SWQiKTsKKworICAgIGlmIChtTWVkaWFSZWNvcmRlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJtZWRpYSByZWNvcmRlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgcmV0dXJuIG1NZWRpYVJlY29yZGVyLT5nZXRQb3J0SWQocG9ydElkKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmNwcAppbmRleCAzMWQxZGY5Li4xZWQxZDA3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmNwcApAQCAtMzIsNyArMzIsNyBAQAogCiBCblN0YXR1cyBMV0dyYXBoaWNCdWZmZXJTb3VyY2U6OmNvbmZpZ3VyZSgKICAgICAgICAgY29uc3Qgc3A8SU9NWE5vZGU+JiBvbXhOb2RlLCBpbnQzMl90IGRhdGFTcGFjZSkgewotICAgIHNwPElPbXhOb2RlPiBoT214Tm9kZSA9IG9teE5vZGUtPmdldEhhbEludGVyZmFjZSgpOworICAgIHNwPElPbXhOb2RlPiBoT214Tm9kZSA9IG9teE5vZGUtPmdldEhhbEludGVyZmFjZTxJT214Tm9kZT4oKTsKICAgICByZXR1cm4gdG9CaW5kZXJTdGF0dXMobUJhc2UtPmNvbmZpZ3VyZSgKICAgICAgICAgICAgIGhPbXhOb2RlID09IG51bGxwdHIgPyBuZXcgVFdPbXhOb2RlKG9teE5vZGUpIDogaE9teE5vZGUsCiAgICAgICAgICAgICB0b0hhcmR3YXJlRGF0YXNwYWNlKGRhdGFTcGFjZSkpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDNiOGY2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi1jY19saWJyYXJ5IHsKLSAgICBuYW1lOiAibGlibWVkaWFleHRyYWN0b3IiLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlIiwKLSAgICBdLAotCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1Xbm8tbXVsdGljaGFyIiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLVdhbGwiLAotICAgIF0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgIkRhdGFTb3VyY2VCYXNlLmNwcCIsCi0gICAgICAgICJNZWRpYUJ1ZmZlci5jcHAiLAotICAgICAgICAiTWVkaWFCdWZmZXJCYXNlLmNwcCIsCi0gICAgICAgICJNZWRpYUJ1ZmZlckdyb3VwLmNwcCIsCi0gICAgICAgICJNZWRpYVNvdXJjZS5jcHAiLAotICAgICAgICAiTWVkaWFUcmFjay5jcHAiLAotICAgICAgICAiTWVkaWFFeHRyYWN0b3IuY3BwIiwKLSAgICAgICAgIk1ldGFEYXRhLmNwcCIsCi0gICAgICAgICJNZXRhRGF0YUJhc2UuY3BwIiwKLSAgICAgICAgIlZvcmJpc0NvbW1lbnQuY3BwIiwKLSAgICBdLAotCi0gICAgY2xhbmc6IHRydWUsCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgXSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlci5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOTdiM2YuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhQnVmZmVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKiBzdGF0aWMgKi8KLXN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgTWVkaWFCdWZmZXI6Om1Vc2VTaGFyZWRNZW1vcnkoMCk7Ci0KLU1lZGlhQnVmZmVyOjpNZWRpYUJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkKLSAgICA6IG1PYnNlcnZlcihOVUxMKSwKLSAgICAgIG1SZWZDb3VudCgwKSwKLSAgICAgIG1EYXRhKGRhdGEpLAotICAgICAgbVNpemUoc2l6ZSksCi0gICAgICBtUmFuZ2VPZmZzZXQoMCksCi0gICAgICBtUmFuZ2VMZW5ndGgoc2l6ZSksCi0gICAgICBtT3duc0RhdGEoZmFsc2UpLAotICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YUJhc2UpLAotICAgICAgbU9yaWdpbmFsKE5VTEwpIHsKLX0KLQotTWVkaWFCdWZmZXI6Ok1lZGlhQnVmZmVyKHNpemVfdCBzaXplKQotICAgIDogbU9ic2VydmVyKE5VTEwpLAotICAgICAgbVJlZkNvdW50KDApLAotICAgICAgbURhdGEoTlVMTCksCi0gICAgICBtU2l6ZShzaXplKSwKLSAgICAgIG1SYW5nZU9mZnNldCgwKSwKLSAgICAgIG1SYW5nZUxlbmd0aChzaXplKSwKLSAgICAgIG1Pd25zRGF0YSh0cnVlKSwKLSAgICAgIG1NZXRhRGF0YShuZXcgTWV0YURhdGFCYXNlKSwKLSAgICAgIG1PcmlnaW5hbChOVUxMKSB7Ci0gICAgaWYgKHNpemUgPCBrU2hhcmVkTWVtVGhyZXNob2xkCi0gICAgICAgICAgICB8fCBzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCZtVXNlU2hhcmVkTWVtb3J5LCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KSA9PSAwKSB7Ci0gICAgICAgIG1EYXRhID0gbWFsbG9jKHNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJjcmVhdGluZyBtZW1vcnlEZWFsZXIiKTsKLSAgICAgICAgc3A8TWVtb3J5RGVhbGVyPiBtZW1vcnlEZWFsZXIgPQotICAgICAgICAgICAgICAgIG5ldyBNZW1vcnlEZWFsZXIoc2l6ZSArIHNpemVvZihTaGFyZWRDb250cm9sKSwgIk1lZGlhQnVmZmVyIik7Ci0gICAgICAgIG1NZW1vcnkgPSBtZW1vcnlEZWFsZXItPmFsbG9jYXRlKHNpemUgKyBzaXplb2YoU2hhcmVkQ29udHJvbCkpOwotICAgICAgICBpZiAobU1lbW9yeSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGFsbG9jYXRlIHNoYXJlZCBtZW1vcnksIHRyeWluZyByZWd1bGFyIGFsbG9jYXRpb24hIik7Ci0gICAgICAgICAgICBtRGF0YSA9IG1hbGxvYyhzaXplKTsKLSAgICAgICAgICAgIGlmIChtRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIk91dCBvZiBtZW1vcnkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdldFNoYXJlZENvbnRyb2woKS0+Y2xlYXIoKTsKLSAgICAgICAgICAgIG1EYXRhID0gKHVpbnQ4X3QgKiltTWVtb3J5LT5wb2ludGVyKCkgKyBzaXplb2YoU2hhcmVkQ29udHJvbCk7Ci0gICAgICAgICAgICBBTE9HVigiQWxsb2NhdGVkIHNoYXJlZCBtZW0gYnVmZmVyIG9mIHNpemUgJXp1IEAgJXAiLCBzaXplLCBtRGF0YSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLU1lZGlhQnVmZmVyOjpNZWRpYUJ1ZmZlcihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKQotICAgIDogbU9ic2VydmVyKE5VTEwpLAotICAgICAgbVJlZkNvdW50KDApLAotICAgICAgbURhdGEoYnVmZmVyLT5kYXRhKCkpLAotICAgICAgbVNpemUoYnVmZmVyLT5zaXplKCkpLAotICAgICAgbVJhbmdlT2Zmc2V0KDApLAotICAgICAgbVJhbmdlTGVuZ3RoKG1TaXplKSwKLSAgICAgIG1CdWZmZXIoYnVmZmVyKSwKLSAgICAgIG1Pd25zRGF0YShmYWxzZSksCi0gICAgICBtTWV0YURhdGEobmV3IE1ldGFEYXRhQmFzZSksCi0gICAgICBtT3JpZ2luYWwoTlVMTCkgewotfQotCi12b2lkIE1lZGlhQnVmZmVyOjpyZWxlYXNlKCkgewotICAgIGlmIChtT2JzZXJ2ZXIgPT0gTlVMTCkgewotICAgICAgICAvLyBMZWdhY3kgY29udHJhY3QgZm9yIE1lZGlhQnVmZmVyIHdpdGhvdXQgYSBNZWRpYUJ1ZmZlckdyb3VwLgotICAgICAgICBDSEVDS19FUShtUmVmQ291bnQsIDApOwotICAgICAgICBkZWxldGUgdGhpczsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGludCBwcmV2Q291bnQgPSBtUmVmQ291bnQuZmV0Y2hfc3ViKDEpOwotICAgIGlmIChwcmV2Q291bnQgPT0gMSkgewotICAgICAgICBpZiAobU9ic2VydmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGRlbGV0ZSB0aGlzOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbU9ic2VydmVyLT5zaWduYWxCdWZmZXJSZXR1cm5lZCh0aGlzKTsKLSAgICB9Ci0gICAgQ0hFQ0socHJldkNvdW50ID4gMCk7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXI6OmNsYWltKCkgewotICAgIENIRUNLKG1PYnNlcnZlciAhPSBOVUxMKTsKLSAgICBDSEVDS19FUShtUmVmQ291bnQubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSwgMSk7Ci0KLSAgICBtUmVmQ291bnQuc3RvcmUoMCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXI6OmFkZF9yZWYoKSB7Ci0gICAgKHZvaWQpIG1SZWZDb3VudC5mZXRjaF9hZGQoMSk7Ci19Ci0KLXZvaWQgKk1lZGlhQnVmZmVyOjpkYXRhKCkgY29uc3QgewotICAgIHJldHVybiBtRGF0YTsKLX0KLQotc2l6ZV90IE1lZGlhQnVmZmVyOjpzaXplKCkgY29uc3QgewotICAgIHJldHVybiBtU2l6ZTsKLX0KLQotc2l6ZV90IE1lZGlhQnVmZmVyOjpyYW5nZV9vZmZzZXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1SYW5nZU9mZnNldDsKLX0KLQotc2l6ZV90IE1lZGlhQnVmZmVyOjpyYW5nZV9sZW5ndGgoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1SYW5nZUxlbmd0aDsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlcjo6c2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpIHsKLSAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID4gbVNpemUpIHsKLSAgICAgICAgQUxPR0UoIm9mZnNldCA9ICV6dSwgbGVuZ3RoID0gJXp1LCBtU2l6ZSA9ICV6dSIsIG9mZnNldCwgbGVuZ3RoLCBtU2l6ZSk7Ci0gICAgfQotICAgIENIRUNLKG9mZnNldCArIGxlbmd0aCA8PSBtU2l6ZSk7Ci0KLSAgICBtUmFuZ2VPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgbVJhbmdlTGVuZ3RoID0gbGVuZ3RoOwotfQotCi1NZXRhRGF0YUJhc2UmIE1lZGlhQnVmZmVyOjptZXRhX2RhdGEoKSB7Ci0gICAgcmV0dXJuICptTWV0YURhdGE7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXI6OnJlc2V0KCkgewotICAgIG1NZXRhRGF0YS0+Y2xlYXIoKTsKLSAgICBzZXRfcmFuZ2UoMCwgbVNpemUpOwotfQotCi1NZWRpYUJ1ZmZlcjo6fk1lZGlhQnVmZmVyKCkgewotICAgIENIRUNLKG1PYnNlcnZlciA9PSBOVUxMKTsKLQotICAgIGlmIChtT3duc0RhdGEgJiYgbURhdGEgIT0gTlVMTCAmJiBtTWVtb3J5ID09IE5VTEwpIHsKLSAgICAgICAgZnJlZShtRGF0YSk7Ci0gICAgICAgIG1EYXRhID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobU9yaWdpbmFsICE9IE5VTEwpIHsKLSAgICAgICAgbU9yaWdpbmFsLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1PcmlnaW5hbCA9IE5VTEw7Ci0gICAgfQotCi0gICBpZiAobU1lbW9yeS5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgZ2V0U2hhcmVkQ29udHJvbCgpLT5zZXREZWFkT2JqZWN0KCk7Ci0gICB9Ci0gICBkZWxldGUgbU1ldGFEYXRhOwotfQotCi12b2lkIE1lZGlhQnVmZmVyOjpzZXRPYnNlcnZlcihNZWRpYUJ1ZmZlck9ic2VydmVyICpvYnNlcnZlcikgewotICAgIENIRUNLKG9ic2VydmVyID09IE5VTEwgfHwgbU9ic2VydmVyID09IE5VTEwpOwotICAgIG1PYnNlcnZlciA9IG9ic2VydmVyOwotfQotCi1NZWRpYUJ1ZmZlckJhc2UgKk1lZGlhQnVmZmVyOjpjbG9uZSgpIHsKLSAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKG1EYXRhLCBtU2l6ZSk7Ci0gICAgYnVmZmVyLT5zZXRfcmFuZ2UobVJhbmdlT2Zmc2V0LCBtUmFuZ2VMZW5ndGgpOwotICAgIGJ1ZmZlci0+bU1ldGFEYXRhID0gbmV3IE1ldGFEYXRhQmFzZSgqbU1ldGFEYXRhKTsKLQotICAgIGFkZF9yZWYoKTsKLSAgICBidWZmZXItPm1PcmlnaW5hbCA9IHRoaXM7Ci0KLSAgICByZXR1cm4gYnVmZmVyOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXJHcm91cC5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlckdyb3VwLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE4ZGQ0MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlckdyb3VwLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJNZWRpYUJ1ZmZlckdyb3VwIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8bGlzdD4KLQotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdGQ6Om1pbiBpcyBub3QgY29uc3RleHByIGluIEMrKzExCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotY29uc3RleHByIFQgTUlOKGNvbnN0IFQgJmEsIGNvbnN0IFQgJmIpIHsgcmV0dXJuIGEgPD0gYiA/IGEgOiBiOyB9Ci0KLS8vIE1lZGlhQnVmZmVyR3JvdXAgbWF5IGNyZWF0ZSBzaGFyZWQgbWVtb3J5IGJ1ZmZlcnMgYXQgYQotLy8gc21hbGxlciB0aHJlc2hvbGQgdGhhbiBhbiBpc29sYXRlZCBuZXcgTWVkaWFCdWZmZXIuCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtTaGFyZWRNZW1vcnlUaHJlc2hvbGQgPSBNSU4oCi0gICAgICAgIChzaXplX3QpTWVkaWFCdWZmZXI6OmtTaGFyZWRNZW1UaHJlc2hvbGQsIChzaXplX3QpKDQgKiAxMDI0KSk7Ci0KLXN0cnVjdCBNZWRpYUJ1ZmZlckdyb3VwOjpJbnRlcm5hbERhdGEgewotICAgIE11dGV4IG1Mb2NrOwotICAgIENvbmRpdGlvbiBtQ29uZGl0aW9uOwotICAgIHNpemVfdCBtR3Jvd3RoTGltaXQ7ICAvLyBEbyBub3QgYXV0b21hdGljYWxseSBncm93IGdyb3VwIGxhcmdlciB0aGFuIHRoaXMuCi0gICAgc3RkOjpsaXN0PE1lZGlhQnVmZmVyQmFzZSAqPiBtQnVmZmVyczsKLX07Ci0KLU1lZGlhQnVmZmVyR3JvdXA6Ok1lZGlhQnVmZmVyR3JvdXAoc2l6ZV90IGdyb3d0aExpbWl0KQotICAgIDogbUludGVybmFsKG5ldyBJbnRlcm5hbERhdGEoKSkgewotICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID0gZ3Jvd3RoTGltaXQ7Ci19Ci0KLU1lZGlhQnVmZmVyR3JvdXA6Ok1lZGlhQnVmZmVyR3JvdXAoc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0KQotICAgIDogbUludGVybmFsKG5ldyBJbnRlcm5hbERhdGEoKSkgewotICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID0gZ3Jvd3RoTGltaXQ7Ci0KLSAgICBpZiAobUludGVybmFsLT5tR3Jvd3RoTGltaXQgPiAwICYmIGJ1ZmZlcnMgPiBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCkgewotICAgICAgICBBTE9HVygiUHJlYWxsb2NhdGVkIGJ1ZmZlcnMgJXp1ID4gZ3Jvd3RoTGltaXQgJXp1LCBpbmNyZWFzaW5nIGdyb3d0aExpbWl0IiwKLSAgICAgICAgICAgICAgICBidWZmZXJzLCBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCk7Ci0gICAgICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID0gYnVmZmVyczsKLSAgICB9Ci0KLSAgICBpZiAoYnVmZmVyX3NpemUgPj0ga1NoYXJlZE1lbW9yeVRocmVzaG9sZCkgewotICAgICAgICBBTE9HRCgiY3JlYXRpbmcgTWVtb3J5RGVhbGVyIik7Ci0gICAgICAgIC8vIFVzaW5nIGEgc2luZ2xlIE1lbW9yeURlYWxlciBpcyBlZmZpY2llbnQgZm9yIGEgZ3JvdXAgb2Ygc2hhcmVkIG1lbW9yeSBvYmplY3RzLgotICAgICAgICAvLyBUaGlzIGxvb3AgZ3VhcmFudGVlcyB0aGF0IHdlIHVzZSBzaGFyZWQgbWVtb3J5IChubyBmYWxsYmFjayB0byBtYWxsb2MpLgotCi0gICAgICAgIHNpemVfdCBhbGlnbm1lbnQgPSBNZW1vcnlEZWFsZXI6OmdldEFsbG9jYXRpb25BbGlnbm1lbnQoKTsKLSAgICAgICAgc2l6ZV90IGF1Z21lbnRlZF9zaXplID0gYnVmZmVyX3NpemUgKyBzaXplb2YoTWVkaWFCdWZmZXI6OlNoYXJlZENvbnRyb2wpOwotICAgICAgICBzaXplX3QgdG90YWwgPSAoYXVnbWVudGVkX3NpemUgKyBhbGlnbm1lbnQgLSAxKSAvIGFsaWdubWVudCAqIGFsaWdubWVudCAqIGJ1ZmZlcnM7Ci0gICAgICAgIHNwPE1lbW9yeURlYWxlcj4gbWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcih0b3RhbCwgIk1lZGlhQnVmZmVyR3JvdXAiKTsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcnM7ICsraSkgewotICAgICAgICAgICAgc3A8SU1lbW9yeT4gbWVtID0gbWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShhdWdtZW50ZWRfc2l6ZSk7Ci0gICAgICAgICAgICBpZiAobWVtLmdldCgpID09IG51bGxwdHIgfHwgbWVtLT5wb2ludGVyKCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dXKCJPbmx5IGFsbG9jYXRlZCAlenUgc2hhcmVkIGJ1ZmZlcnMgb2Ygc2l6ZSAlenUiLCBpLCBidWZmZXJfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKG1lbSk7Ci0gICAgICAgICAgICBidWZmZXItPmdldFNoYXJlZENvbnRyb2woKS0+Y2xlYXIoKTsKLSAgICAgICAgICAgIGFkZF9idWZmZXIoYnVmZmVyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gTm9uLXNoYXJlZCBtZW1vcnkgYWxsb2NhdGlvbi4KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcnM7ICsraSkgewotICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGJ1ZmZlcl9zaXplKTsKLSAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBidWZmZXI7IC8vIGRvbid0IGNhbGwgcmVsZWFzZSwgaXQncyBub3QgcHJvcGVybHkgZm9ybWVkCi0gICAgICAgICAgICBBTE9HVygiT25seSBhbGxvY2F0ZWQgJXp1IG1hbGxvYyBidWZmZXJzIG9mIHNpemUgJXp1IiwgaSwgYnVmZmVyX3NpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkX2J1ZmZlcihidWZmZXIpOwotICAgIH0KLX0KLQotTWVkaWFCdWZmZXJHcm91cDo6fk1lZGlhQnVmZmVyR3JvdXAoKSB7Ci0gICAgZm9yIChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA6IG1JbnRlcm5hbC0+bUJ1ZmZlcnMpIHsKLSAgICAgICAgaWYgKGJ1ZmZlci0+cmVmY291bnQoKSAhPSAwKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgbG9jYWxSZWZjb3VudCA9IGJ1ZmZlci0+bG9jYWxSZWZjb3VudCgpOwotICAgICAgICAgICAgY29uc3QgaW50IHJlbW90ZVJlZmNvdW50ID0gYnVmZmVyLT5yZW1vdGVSZWZjb3VudCgpOwotCi0gICAgICAgICAgICAvLyBGYXRhbCBpZiB3ZSBoYXZlIGEgbG9jYWwgcmVmY291bnQuCi0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGxvY2FsUmVmY291bnQgIT0gMCwKLSAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciglcCkgbG9jYWxSZWZjb3VudCAlZCAhPSAwLCByZW1vdGVSZWZjb3VudCAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgbG9jYWxSZWZjb3VudCwgcmVtb3RlUmVmY291bnQpOwotCi0gICAgICAgICAgICAvLyBMb2cgYW4gZXJyb3IgaWYgd2UgaGF2ZSBhIHJlbWFpbmluZyByZW1vdGUgcmVmY291bnQsCi0gICAgICAgICAgICAvLyBhcyB0aGUgcmVtb3RlIHByb2Nlc3MgbWF5IGhhdmUgZGllZCBvciBtYXkgaGF2ZSBpbmFwcHJvcHJpYXRlIGJlaGF2aW9yLgotICAgICAgICAgICAgLy8gVGhlIHNoYXJlZCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBNZWRpYUJ1ZmZlciB3aWxsCi0gICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGJlIHJlY2xhaW1lZCB3aGVuIHRoZXJlIGFyZSBubyByZW1haW5pbmcgZmRzCi0gICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggaXQuCi0gICAgICAgICAgICBBTE9HRSgiYnVmZmVyKCVwKSBoYXMgcmVzaWR1YWwgcmVtb3RlUmVmY291bnQgJWQiLAotICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHJlbW90ZVJlZmNvdW50KTsKLSAgICAgICAgfQotICAgICAgICAvLyBncmFjZWZ1bGx5IGRlbGV0ZS4KLSAgICAgICAgYnVmZmVyLT5zZXRPYnNlcnZlcihudWxscHRyKTsKLSAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgfQotICAgIGRlbGV0ZSBtSW50ZXJuYWw7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXJHcm91cDo6YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtSW50ZXJuYWwtPm1Mb2NrKTsKLQotICAgIC8vIGlmIHdlJ3JlIGFib3ZlIG91ciBncm93dGggbGltaXQsIHJlbGVhc2UgYnVmZmVycyBpZiB3ZSBjYW4KLSAgICBmb3IgKGF1dG8gaXQgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmJlZ2luKCk7Ci0gICAgICAgICAgICBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA+IDAKLSAgICAgICAgICAgICYmIG1JbnRlcm5hbC0+bUJ1ZmZlcnMuc2l6ZSgpID49IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0Ci0gICAgICAgICAgICAmJiBpdCAhPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpOykgewotICAgICAgICBpZiAoKCppdCktPnJlZmNvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgKCppdCktPnNldE9ic2VydmVyKG51bGxwdHIpOwotICAgICAgICAgICAgKCppdCktPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIGl0ID0gbUludGVybmFsLT5tQnVmZmVycy5lcmFzZShpdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICArK2l0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYnVmZmVyLT5zZXRPYnNlcnZlcih0aGlzKTsKLSAgICBtSW50ZXJuYWwtPm1CdWZmZXJzLmVtcGxhY2VfYmFjayhidWZmZXIpOwotfQotCi1ib29sIE1lZGlhQnVmZmVyR3JvdXA6Omhhc19idWZmZXJzKCkgewotICAgIGlmIChtSW50ZXJuYWwtPm1CdWZmZXJzLnNpemUoKSA8IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KSB7Ci0gICAgICAgIHJldHVybiB0cnVlOyAvLyBXZSBjYW4gYWRkIG1vcmUgYnVmZmVycyBpbnRlcm5hbGx5LgotICAgIH0KLSAgICBmb3IgKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyIDogbUludGVybmFsLT5tQnVmZmVycykgewotICAgICAgICBpZiAoYnVmZmVyLT5yZWZjb3VudCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdHVzX3QgTWVkaWFCdWZmZXJHcm91cDo6YWNxdWlyZV9idWZmZXIoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgYm9vbCBub25CbG9ja2luZywgc2l6ZV90IHJlcXVlc3RlZFNpemUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUludGVybmFsLT5tTG9jayk7Ci0gICAgZm9yICg7OykgewotICAgICAgICBzaXplX3Qgc21hbGxlc3QgPSByZXF1ZXN0ZWRTaXplOwotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA9IG51bGxwdHI7Ci0gICAgICAgIGF1dG8gZnJlZSA9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCk7Ci0gICAgICAgIGZvciAoYXV0byBpdCA9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgaWYgKCgqaXQpLT5yZWZjb3VudCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9ICgqaXQpLT5zaXplKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNpemUgPj0gcmVxdWVzdGVkU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSAqaXQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IHNtYWxsZXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHNtYWxsZXN0ID0gc2l6ZTsgLy8gYWx3YXlzIGZyZWUgdGhlIHNtYWxsZXN0IGJ1ZgotICAgICAgICAgICAgICAgICAgICBmcmVlID0gaXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cgotICAgICAgICAgICAgICAgICYmIChmcmVlICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCkKLSAgICAgICAgICAgICAgICAgICAgfHwgbUludGVybmFsLT5tQnVmZmVycy5zaXplKCkgPCBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCkpIHsKLSAgICAgICAgICAgIC8vIFdlIGFsbG9jIGJlZm9yZSB3ZSBmcmVlIHNvIGZhaWx1cmUgbGVhdmVzIGdyb3VwIHVuY2hhbmdlZC4KLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY2F0ZVNpemUgPSByZXF1ZXN0ZWRTaXplIDwgU0laRV9NQVggLyAzICogMiAvKiBOQjogb3JkZXJpbmcgKi8gPwotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRTaXplICogMyAvIDIgOiByZXF1ZXN0ZWRTaXplOwotICAgICAgICAgICAgYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGFsbG9jYXRlU2l6ZSk7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgZm9yIHNpemUgJXp1IiwgYWxsb2NhdGVTaXplKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgYnVmZmVyOyAvLyBJbnZhbGlkIGFsbG9jLCBwcmVmZXIgbm90IHRvIGNhbGwgcmVsZWFzZS4KLSAgICAgICAgICAgICAgICBidWZmZXIgPSBudWxscHRyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKHRoaXMpOwotICAgICAgICAgICAgICAgIGlmIChmcmVlICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJlYWxsb2NhdGUgYnVmZmVyLCByZXF1ZXN0ZWQgc2l6ZSAlenUgdnMgYXZhaWxhYmxlICV6dSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkU2l6ZSwgKCpmcmVlKS0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgKCpmcmVlKS0+c2V0T2JzZXJ2ZXIobnVsbHB0cik7Ci0gICAgICAgICAgICAgICAgICAgICgqZnJlZSktPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgKmZyZWUgPSBidWZmZXI7IC8vIGluLXBsYWNlIHJlcGxhY2UKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiYWxsb2NhdGUgYnVmZmVyLCByZXF1ZXN0ZWQgc2l6ZSAlenUiLCByZXF1ZXN0ZWRTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgbUludGVybmFsLT5tQnVmZmVycy5lbXBsYWNlX2JhY2soYnVmZmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBidWZmZXItPmFkZF9yZWYoKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+cmVzZXQoKTsKLSAgICAgICAgICAgICpvdXQgPSBidWZmZXI7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5vbkJsb2NraW5nKSB7Ci0gICAgICAgICAgICAqb3V0ID0gbnVsbHB0cjsKLSAgICAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKLSAgICAgICAgfQotICAgICAgICAvLyBBbGwgYnVmZmVycyBhcmUgaW4gdXNlLCBibG9jayB1bnRpbCBvbmUgb2YgdGhlbSBpcyByZXR1cm5lZC4KLSAgICAgICAgbUludGVybmFsLT5tQ29uZGl0aW9uLndhaXQobUludGVybmFsLT5tTG9jayk7Ci0gICAgfQotICAgIC8vIE5ldmVyIGdldHMgaGVyZS4KLX0KLQotc2l6ZV90IE1lZGlhQnVmZmVyR3JvdXA6OmJ1ZmZlcnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1JbnRlcm5hbC0+bUJ1ZmZlcnMuc2l6ZSgpOwotfQotCi12b2lkIE1lZGlhQnVmZmVyR3JvdXA6OnNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1JbnRlcm5hbC0+bUxvY2spOwotICAgIG1JbnRlcm5hbC0+bUNvbmRpdGlvbi5zaWduYWwoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiM2RjOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3Rvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNZWRpYUV4dHJhY3RvciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxwd2QuaD4KLQotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLU1lZGlhRXh0cmFjdG9yOjpNZWRpYUV4dHJhY3RvcigpIHsKLSAgICBpZiAoIUxPR19OREVCVUcpIHsKLSAgICAgICAgdWlkX3QgdWlkID0gZ2V0dWlkKCk7Ci0gICAgICAgIHN0cnVjdCBwYXNzd2QgKnB3ID0gZ2V0cHd1aWQodWlkKTsKLSAgICAgICAgQUxPR1YoImV4dHJhY3RvciBjcmVhdGVkIGluIHVpZDogJWQgKCVzKSIsIGdldHVpZCgpLCBwdy0+cHdfbmFtZSk7Ci0gICAgfQotfQotCi1NZWRpYUV4dHJhY3Rvcjo6fk1lZGlhRXh0cmFjdG9yKCkge30KLQotdWludDMyX3QgTWVkaWFFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewotICAgIHJldHVybiBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fUEFVU0UgfCBDQU5fU0VFSzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhVHJhY2suY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFUcmFjay5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NjNmNTguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFUcmFjay5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1NZWRpYVRyYWNrOjpNZWRpYVRyYWNrKCkge30KLQotTWVkaWFUcmFjazo6fk1lZGlhVHJhY2soKSB7fQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1NZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6UmVhZE9wdGlvbnMoKSB7Ci0gICAgcmVzZXQoKTsKLX0KLQotdm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6cmVzZXQoKSB7Ci0gICAgbU9wdGlvbnMgPSAwOwotICAgIG1TZWVrVGltZVVzID0gMDsKLSAgICBtTm9uQmxvY2tpbmcgPSBmYWxzZTsKLX0KLQotdm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6c2V0Tm9uQmxvY2tpbmcoKSB7Ci0gICAgbU5vbkJsb2NraW5nID0gdHJ1ZTsKLX0KLQotdm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Y2xlYXJOb25CbG9ja2luZygpIHsKLSAgICBtTm9uQmxvY2tpbmcgPSBmYWxzZTsKLX0KLQotYm9vbCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Z2V0Tm9uQmxvY2tpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Ob25CbG9ja2luZzsKLX0KLQotdm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6c2V0U2Vla1RvKGludDY0X3QgdGltZV91cywgU2Vla01vZGUgbW9kZSkgewotICAgIG1PcHRpb25zIHw9IGtTZWVrVG9fT3B0aW9uOwotICAgIG1TZWVrVGltZVVzID0gdGltZV91czsKLSAgICBtU2Vla01vZGUgPSBtb2RlOwotfQotCi12b2lkIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpjbGVhclNlZWtUbygpIHsKLSAgICBtT3B0aW9ucyAmPSB+a1NlZWtUb19PcHRpb247Ci0gICAgbVNlZWtUaW1lVXMgPSAwOwotICAgIG1TZWVrTW9kZSA9IFNFRUtfQ0xPU0VTVF9TWU5DOwotfQotCi1ib29sIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpnZXRTZWVrVG8oCi0gICAgICAgIGludDY0X3QgKnRpbWVfdXMsIFNlZWtNb2RlICptb2RlKSBjb25zdCB7Ci0gICAgKnRpbWVfdXMgPSBtU2Vla1RpbWVVczsKLSAgICAqbW9kZSA9IG1TZWVrTW9kZTsKLSAgICByZXR1cm4gKG1PcHRpb25zICYga1NlZWtUb19PcHRpb24pICE9IDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9Wb3JiaXNDb21tZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL1ZvcmJpc0NvbW1lbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWJhZjUxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL1ZvcmJpc0NvbW1lbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlZvcmJpc0NvbW1lbnQiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJtZWRpYS9Wb3JiaXNDb21tZW50LmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIHZvaWQgZXh0cmFjdEFsYnVtQXJ0KAotICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIEFMT0dWKCJleHRyYWN0QWxidW1BcnQgZnJvbSAnJXMnIiwgKGNvbnN0IGNoYXIgKilkYXRhKTsKLQotICAgIHNwPEFCdWZmZXI+IGZsYWNCdWZmZXIgPSBkZWNvZGVCYXNlNjQoQVN0cmluZygoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpKTsKLSAgICBpZiAoZmxhY0J1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJtYWxmb3JtZWQgYmFzZTY0IGVuY29kZWQgZGF0YS4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNpemVfdCBmbGFjU2l6ZSA9IGZsYWNCdWZmZXItPnNpemUoKTsKLSAgICB1aW50OF90ICpmbGFjID0gZmxhY0J1ZmZlci0+ZGF0YSgpOwotICAgIEFMT0dWKCJnb3QgZmxhYyBvZiBzaXplICV6dSIsIGZsYWNTaXplKTsKLQotICAgIHVpbnQzMl90IHBpY1R5cGU7Ci0gICAgdWludDMyX3QgdHlwZUxlbjsKLSAgICB1aW50MzJfdCBkZXNjTGVuOwotICAgIHVpbnQzMl90IGRhdGFMZW47Ci0gICAgY2hhciB0eXBlWzEyOF07Ci0KLSAgICBpZiAoZmxhY1NpemUgPCA4KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwaWNUeXBlID0gVTMyX0FUKGZsYWMpOwotCi0gICAgaWYgKHBpY1R5cGUgIT0gMykgewotICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGZyb250IGNvdmVyLgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdHlwZUxlbiA9IFUzMl9BVCgmZmxhY1s0XSk7Ci0gICAgaWYgKHR5cGVMZW4gPiBzaXplb2YodHlwZSkgLSAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgYWJvdmUgdGhhdCBmbGFjU2l6ZSA+PSA4Ci0gICAgaWYgKGZsYWNTaXplIC0gOCA8IHR5cGVMZW4pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1lbWNweSh0eXBlLCAmZmxhY1s4XSwgdHlwZUxlbik7Ci0gICAgdHlwZVt0eXBlTGVuXSA9ICdcMCc7Ci0KLSAgICBBTE9HVigicGljVHlwZSA9ICVkLCB0eXBlID0gJyVzJyIsIHBpY1R5cGUsIHR5cGUpOwotCi0gICAgaWYgKCFzdHJjbXAodHlwZSwgIi0tPiIpKSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgbm90IGlubGluZSBjb3ZlciBhcnQsIGJ1dCBhbiBleHRlcm5hbCB1cmwgaW5zdGVhZC4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChmbGFjU2l6ZSA8IDMyIHx8IGZsYWNTaXplIC0gMzIgPCB0eXBlTGVuKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBkZXNjTGVuID0gVTMyX0FUKCZmbGFjWzggKyB0eXBlTGVuXSk7Ci0gICAgaWYgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIDwgZGVzY0xlbikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZGF0YUxlbiA9IFUzMl9BVCgmZmxhY1s4ICsgdHlwZUxlbiArIDQgKyBkZXNjTGVuICsgMTZdKTsKLQotICAgIC8vIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBhYm92ZSB0aGF0IChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4pID49IDAKLSAgICBpZiAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuIDwgZGF0YUxlbikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQUxPR1YoImdvdCBpbWFnZSBkYXRhLCAlenUgdHJhaWxpbmcgYnl0ZXMiLAotICAgICAgICAgZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuIC0gZGF0YUxlbik7Ci0KLSAgICBmaWxlTWV0YS0+c2V0RGF0YSgKLSAgICAgICAgICAgIGtLZXlBbGJ1bUFydCwgMCwgJmZsYWNbOCArIHR5cGVMZW4gKyA0ICsgZGVzY0xlbiArIDIwXSwgZGF0YUxlbik7Ci0KLSAgICBmaWxlTWV0YS0+c2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCB0eXBlKTsKLX0KLQotdm9pZCBwYXJzZVZvcmJpc0NvbW1lbnQoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGEsIGNvbnN0IGNoYXIgKmNvbW1lbnQsIHNpemVfdCBjb21tZW50TGVuZ3RoKQotewotICAgIHN0cnVjdCB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IG1UYWc7Ci0gICAgICAgIHVpbnQzMl90IG1LZXk7Ci0gICAgfSBrTWFwW10gPSB7Ci0gICAgICAgIHsgIlRJVExFIiwga0tleVRpdGxlIH0sCi0gICAgICAgIHsgIkFSVElTVCIsIGtLZXlBcnRpc3QgfSwKLSAgICAgICAgeyAiQUxCVU1BUlRJU1QiLCBrS2V5QWxidW1BcnRpc3QgfSwKLSAgICAgICAgeyAiQUxCVU0gQVJUSVNUIiwga0tleUFsYnVtQXJ0aXN0IH0sCi0gICAgICAgIHsgIkNPTVBJTEFUSU9OIiwga0tleUNvbXBpbGF0aW9uIH0sCi0gICAgICAgIHsgIkFMQlVNIiwga0tleUFsYnVtIH0sCi0gICAgICAgIHsgIkNPTVBPU0VSIiwga0tleUNvbXBvc2VyIH0sCi0gICAgICAgIHsgIkdFTlJFIiwga0tleUdlbnJlIH0sCi0gICAgICAgIHsgIkFVVEhPUiIsIGtLZXlBdXRob3IgfSwKLSAgICAgICAgeyAiVFJBQ0tOVU1CRVIiLCBrS2V5Q0RUcmFja051bWJlciB9LAotICAgICAgICB7ICJESVNDTlVNQkVSIiwga0tleURpc2NOdW1iZXIgfSwKLSAgICAgICAgeyAiREFURSIsIGtLZXlEYXRlIH0sCi0gICAgICAgIHsgIllFQVIiLCBrS2V5WWVhciB9LAotICAgICAgICB7ICJMWVJJQ0lTVCIsIGtLZXlXcml0ZXIgfSwKLSAgICAgICAgeyAiTUVUQURBVEFfQkxPQ0tfUElDVFVSRSIsIGtLZXlBbGJ1bUFydCB9LAotICAgICAgICB7ICJBTkRST0lEX0xPT1AiLCBrS2V5QXV0b0xvb3AgfSwKLSAgICB9OwotCi0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOyArK2opIHsKLSAgICAgICAgICAgIHNpemVfdCB0YWdMZW4gPSBzdHJsZW4oa01hcFtqXS5tVGFnKTsKLSAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoa01hcFtqXS5tVGFnLCBjb21tZW50LCB0YWdMZW4pCi0gICAgICAgICAgICAgICAgICAgICYmIGNvbW1lbnRbdGFnTGVuXSA9PSAnPScpIHsKLSAgICAgICAgICAgICAgICBpZiAoa01hcFtqXS5tS2V5ID09IGtLZXlBbGJ1bUFydCkgewotICAgICAgICAgICAgICAgICAgICBleHRyYWN0QWxidW1BcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU1ldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1lbnRbdGFnTGVuICsgMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudExlbmd0aCAtIHRhZ0xlbiAtIDEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa01hcFtqXS5tS2V5ID09IGtLZXlBdXRvTG9vcCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoJmNvbW1lbnRbdGFnTGVuICsgMV0sICJ0cnVlIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVNZXRhLT5zZXRJbnQzMihrS2V5QXV0b0xvb3AsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZU1ldGEtPnNldENTdHJpbmcoa01hcFtqXS5tS2V5LCAmY29tbWVudFt0YWdMZW4gKyAxXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNTlmMzkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBEQVRBX1NPVVJDRV9IXwotCi0jZGVmaW5lIERBVEFfU09VUkNFX0hfCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSURhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdHJpbmc4OwotCi1jbGFzcyBEYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2VCYXNlLCBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKLXB1YmxpYzoKLSAgICBEYXRhU291cmNlKCkge30KLQotICAgIC8vIHJldHVybnMgYSBwb2ludGVyIHRvIElEYXRhU291cmNlIGlmIGl0IGlzIHdyYXBwZWQuCi0gICAgdmlydHVhbCBzcDxJRGF0YVNvdXJjZT4gZ2V0SURhdGFTb3VyY2UoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoIjx1bnNwZWNpZmllZD4iKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3QgLypvZmZzZXQqLykgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgLy8gZm9yIERSTQotICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqIC8qbWltZSovID0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCkgewotICAgICAgICByZXR1cm4gU3RyaW5nOCgpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBnZXRVcmkoY2hhciAqdXJpU3RyaW5nLCBzaXplX3QgYnVmZmVyU2l6ZSkgZmluYWwgewotICAgICAgICBpbnQgcmV0ID0gc25wcmludGYodXJpU3RyaW5nLCBidWZmZXJTaXplLCAiJXMiLCBnZXRVcmkoKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIHJldCA+PSAwICYmIHN0YXRpY19jYXN0PHNpemVfdD4ocmV0KSA8IGJ1ZmZlclNpemU7Ci0gICAgfQotCi0gICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+RGF0YVNvdXJjZSgpIHt9Ci0KLXByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZShjb25zdCBEYXRhU291cmNlICYpOwotICAgIERhdGFTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBEQVRBX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTk5M2RhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZUJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIERBVEFfU09VUkNFX0JBU0VfSF8KLQotI2RlZmluZSBEQVRBX1NPVVJDRV9CQVNFX0hfCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdHJpbmc4OwotCi1jbGFzcyBEYXRhU291cmNlQmFzZSB7Ci1wdWJsaWM6Ci0gICAgZW51bSBGbGFncyB7Ci0gICAgICAgIGtXYW50c1ByZWZldGNoaW5nICAgICAgPSAxLAotICAgICAgICBrU3RyZWFtZWRGcm9tTG9jYWxIb3N0ID0gMiwKLSAgICAgICAga0lzQ2FjaGluZ0RhdGFTb3VyY2UgICA9IDQsCi0gICAgICAgIGtJc0hUVFBCYXNlZFNvdXJjZSAgICAgPSA4LAotICAgICAgICBrSXNMb2NhbEZpbGVTb3VyY2UgICAgID0gMTYsCi0gICAgfTsKLQotICAgIERhdGFTb3VyY2VCYXNlKCkge30KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgPSAwOwotCi0gICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIC0xIG9uIGZhaWx1cmUuIEl0J3Mgbm90IGFuIGVycm9yIGlmCi0gICAgLy8gdGhpcyByZXR1cm5zIHplcm87IGl0IGp1c3QgbWVhbnMgdGhlIGdpdmVuIG9mZnNldCBpcyBlcXVhbCB0bywgb3IKLSAgICAvLyBiZXlvbmQsIHRoZSBlbmQgb2YgdGhlIHNvdXJjZS4KLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgPSAwOwotCi0gICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kczoKLSAgICBib29sIGdldFVJbnQxNihvZmY2NF90IG9mZnNldCwgdWludDE2X3QgKngpOwotICAgIGJvb2wgZ2V0VUludDI0KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCk7IC8vIDMgYnl0ZSBpbnQsIHJldHVybmVkIGFzIGEgMzItYml0IGludAotICAgIGJvb2wgZ2V0VUludDMyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCk7Ci0gICAgYm9vbCBnZXRVSW50NjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQ2NF90ICp4KTsKLQotICAgIC8vIHJlYWQgZWl0aGVyIGludDxOPiBvciBpbnQ8Mk4+IGludG8gYSB1aW50PDJOPl90LCBzaXplIGlzIHRoZSBpbnQgc2l6ZSBpbiBieXRlcy4KLSAgICBib29sIGdldFVJbnQxNlZhcihvZmY2NF90IG9mZnNldCwgdWludDE2X3QgKngsIHNpemVfdCBzaXplKTsKLSAgICBib29sIGdldFVJbnQzMlZhcihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngsIHNpemVfdCBzaXplKTsKLSAgICBib29sIGdldFVJbnQ2NFZhcihvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngsIHNpemVfdCBzaXplKTsKLQotICAgIC8vIE1heSByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwotCi0gICAgdmlydHVhbCBib29sIGdldFVyaShjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKTsKLQotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIHt9OwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+RGF0YVNvdXJjZUJhc2UoKSB7fQotCi1wcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlKGNvbnN0IERhdGFTb3VyY2VCYXNlICYpOwotICAgIERhdGFTb3VyY2VCYXNlICZvcGVyYXRvcj0oY29uc3QgRGF0YVNvdXJjZUJhc2UgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIERBVEFfU09VUkNFX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJhOThkYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfRVhUUkFDVE9SX0hfCi0KLSNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX0hfCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEYXRhU291cmNlQmFzZTsKLWNsYXNzIE1ldGFEYXRhQmFzZTsKLXN0cnVjdCBNZWRpYVRyYWNrOwotCi0KLWNsYXNzIEV4dHJhY3RvckFsbG9jVHJhY2tlciB7Ci1wdWJsaWM6Ci0gICAgRXh0cmFjdG9yQWxsb2NUcmFja2VyKCkgewotICAgICAgICBBTE9HRCgiZXh0cmFjdG9yIGFsbG9jYXRlZDogJXAiLCB0aGlzKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+RXh0cmFjdG9yQWxsb2NUcmFja2VyKCkgewotICAgICAgICBBTE9HRCgiZXh0cmFjdG9yIGZyZWVkOiAlcCIsIHRoaXMpOwotICAgIH0KLX07Ci0KLQotY2xhc3MgTWVkaWFFeHRyYWN0b3IKLS8vIDogcHVibGljIEV4dHJhY3RvckFsbG9jVHJhY2tlcgotewotcHVibGljOgotICAgIHZpcnR1YWwgfk1lZGlhRXh0cmFjdG9yKCk7Ci0gICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKSA9IDA7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpID0gMDsKLQotICAgIGVudW0gR2V0VHJhY2tNZXRhRGF0YUZsYWdzIHsKLSAgICAgICAga0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSA9IDEKLSAgICB9OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSYgbWV0YSwKLSAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKSA9IDA7Ci0KLSAgICAvLyBSZXR1cm4gY29udGFpbmVyIHNwZWNpZmljIG1ldGEtZGF0YS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLSAgICAvLyByZXR1cm5zIGFuIGVtcHR5IG1ldGFkYXRhIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSkgPSAwOwotCi0gICAgZW51bSBGbGFncyB7Ci0gICAgICAgIENBTl9TRUVLX0JBQ0tXQVJEICA9IDEsICAvLyB0aGUgInNlZWsgMTBzZWNzIGJhY2sgYnV0dG9uIgotICAgICAgICBDQU5fU0VFS19GT1JXQVJEICAgPSAyLCAgLy8gdGhlICJzZWVrIDEwc2VjcyBmb3J3YXJkIGJ1dHRvbiIKLSAgICAgICAgQ0FOX1BBVVNFICAgICAgICAgID0gNCwKLSAgICAgICAgQ0FOX1NFRUsgICAgICAgICAgID0gOCwgIC8vIHRoZSAic2VlayBiYXIiCi0gICAgfTsKLQotICAgIC8vIElmIHN1YmNsYXNzZXMgZG8gX25vdF8gb3ZlcnJpZGUgdGhpcywgdGhlIGRlZmF1bHQgaXMKLSAgICAvLyBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSyB8IENBTl9QQVVTRQotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogLypjYXNUb2tlbiovLCBzaXplX3QgLypzaXplKi8pIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiPHVuc3BlY2lmaWVkPiI7IH0KLQotICAgIHR5cGVkZWYgTWVkaWFFeHRyYWN0b3IqICgqQ3JlYXRvckZ1bmMpKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdm9pZCAqbWV0YSk7Ci0gICAgdHlwZWRlZiB2b2lkICgqRnJlZU1ldGFGdW5jKSh2b2lkICptZXRhKTsKLQotICAgIC8vIFRoZSBzbmlmZmVyIGNhbiBvcHRpb25hbGx5IGZpbGwgaW4gYW4gb3BhcXVlIG9iamVjdCwgIm1ldGEiLCB0aGF0IGhlbHBzCi0gICAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgZXh0cmFjdG9yIGluaXRpYWxpemUgaXRzIHN0YXRlIHdpdGhvdXQgZHVwbGljYXRpbmcKLSAgICAvLyBlZmZvcnQgYWxyZWFkeSBleGVydGVkIGJ5IHRoZSBzbmlmZmVyLiBJZiAiZnJlZU1ldGEiIGlzIGdpdmVuLCBpdCB3aWxsIGJlCi0gICAgLy8gY2FsbGVkIGFnYWluc3QgdGhlIG9wYXF1ZSBvYmplY3Qgd2hlbiBpdCBpcyBubyBsb25nZXIgdXNlZC4KLSAgICB0eXBlZGVmIENyZWF0b3JGdW5jICgqU25pZmZlckZ1bmMpKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgICAgICB2b2lkICoqbWV0YSwgRnJlZU1ldGFGdW5jICpmcmVlTWV0YSk7Ci0KLSAgICB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgYlsxNl07Ci0gICAgfSB1dWlkX3Q7Ci0KLSAgICB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIC8vIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgc3RydWN0dXJlCi0gICAgICAgIGNvbnN0IHVpbnQzMl90IGRlZl92ZXJzaW9uOwotCi0gICAgICAgIC8vIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yLgotICAgICAgICAvLyBTZWUgYmVsb3cgZm9yIGEgY29udmVuaWVuY2UgbWFjcm8gdG8gY3JlYXRlIHRoaXMgZnJvbSBhIHN0cmluZy4KLSAgICAgICAgdXVpZF90IGV4dHJhY3Rvcl91dWlkOwotCi0gICAgICAgIC8vIFZlcnNpb24gbnVtYmVyIG9mIHRoaXMgZXh0cmFjdG9yLiBXaGVuIHR3byBleHRyYWN0b3JzIHdpdGggdGhlIHNhbWUKLSAgICAgICAgLy8gdXVpZCBhcmUgZW5jb3VudGVyZWQsIHRoZSBvbmUgd2l0aCB0aGUgbGFyZ2VzdCB2ZXJzaW9uIG51bWJlciB3aWxsCi0gICAgICAgIC8vIGJlIHVzZWQuCi0gICAgICAgIGNvbnN0IHVpbnQzMl90IGV4dHJhY3Rvcl92ZXJzaW9uOwotCi0gICAgICAgIC8vIGEgaHVtYW4gcmVhZGFibGUgbmFtZQotICAgICAgICBjb25zdCBjaGFyICpleHRyYWN0b3JfbmFtZTsKLQotICAgICAgICAvLyB0aGUgc25pZmZlciBmdW5jdGlvbgotICAgICAgICBjb25zdCBTbmlmZmVyRnVuYyBzbmlmZjsKLSAgICB9IEV4dHJhY3RvckRlZjsKLQotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBFWFRSQUNUT1JERUZfVkVSU0lPTiA9IDE7Ci0KLSAgICB0eXBlZGVmIEV4dHJhY3RvckRlZiAoKkdldEV4dHJhY3RvckRlZikoKTsKLQotcHJvdGVjdGVkOgotICAgIE1lZGlhRXh0cmFjdG9yKCk7Ci0KLXByaXZhdGU6Ci0gICAgTWVkaWFFeHRyYWN0b3IoY29uc3QgTWVkaWFFeHRyYWN0b3IgJik7Ci0gICAgTWVkaWFFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNZWRpYUV4dHJhY3RvciAmKTsKLX07Ci0KLS8vIHB1cnBvc2VseSBub3QgZGVmaW5lZCBhbnl3aGVyZSBzbyB0aGF0IHRoaXMgd2lsbCBmYWlsIHRvIGxpbmsgaWYKLS8vIGV4cHJlc3Npb25zIGJlbG93IGFyZSBub3QgZXZhbHVhdGVkIGF0IGNvbXBpbGUgdGltZQotaW50IGludmFsaWRfdXVpZF9zdHJpbmcoY29uc3QgY2hhciAqKTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgotY29uc3RleHByIHVpbnQ4X3QgX2RpZ2l0QXRfKGNvbnN0IFQgKCZzKVtOXSwgY29uc3Qgc2l6ZV90IG4pIHsKLSAgICByZXR1cm4gc1tuXSA+PSAnMCcgJiYgc1tuXSA8PSAnOScgPyBzW25dIC0gJzAnCi0gICAgICAgICAgICA6IHNbbl0gPj0gJ2EnICYmIHNbbl0gPD0gJ2YnID8gc1tuXSAtICdhJyArIDEwCi0gICAgICAgICAgICAgICAgICAgIDogc1tuXSA+PSAnQScgJiYgc1tuXSA8PSAnRicgPyBzW25dIC0gJ0EnICsgMTAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludmFsaWRfdXVpZF9zdHJpbmcoInV1aWQ6IGJhZCBkaWdpdHMiKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgotY29uc3RleHByIHVpbnQ4X3QgX2hleEJ5dGVBdF8oY29uc3QgVCAoJnMpW05dLCBzaXplX3QgbikgewotICAgIHJldHVybiAoX2RpZ2l0QXRfKHMsIG4pIDw8IDQpICsgX2RpZ2l0QXRfKHMsIG4gKyAxKTsKLX0KLQotY29uc3RleHByIGJvb2wgX2Fzc2VydElzRGFzaF8oY2hhciBjKSB7Ci0gICAgcmV0dXJuIGMgPT0gJy0nID8gdHJ1ZSA6IGludmFsaWRfdXVpZF9zdHJpbmcoIldyb25nIGZvcm1hdCIpOwotfQotCi10ZW1wbGF0ZSA8c2l6ZV90IE4+Ci1jb25zdGV4cHIgTWVkaWFFeHRyYWN0b3I6OnV1aWRfdCBjb25zdFVVSUQoY29uc3QgY2hhciAoJnMpIFtOXSkgewotICAgIHN0YXRpY19hc3NlcnQoTiA9PSAzNywgInV1aWQ6IHdyb25nIGxlbmd0aCIpOwotICAgIHJldHVybgotICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1s4XSksCi0gICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzEzXSksCi0gICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzE4XSksCi0gICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzIzXSksCi0gICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6dXVpZF90IHt7Ci0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMiksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgNCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgNiksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgOSksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTEpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDE0KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxNiksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTkpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDIxKSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyNCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjYpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDI4KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAzMCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMzIpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDM0KSwKLSAgICAgICAgICAgIH19OwotfQotLy8gQ29udmVuaWVuY2UgbWFjcm8gdG8gY3JlYXRlIGEgdXVpZF90IGZyb20gYSBzdHJpbmcgbGl0ZXJhbCwgd2hpY2ggc2hvdWxkCi0vLyBiZSBmb3JtYXR0ZWQgYXMgIjEyMzQ1Njc4LTEyMzQtMTIzNC0xMjM0LTEyMzQ1Njc4OWFiYyIsIGFzIGdlbmVyYXRlZCBieQotLy8gZS5nLiBodHRwczovL3d3dy51dWlkZ2VuZXJhdG9yLm5ldC8gb3IgdGhlICd1dWlkZ2VuJyBsaW51eCBjb21tYW5kLgotLy8gSGV4IGRpZ2l0cyBtYXkgYmUgdXBwZXIgb3IgbG93ZXIgY2FzZS4KLS8vCi0vLyBUaGUgbWFjcm8gY2FsbCBpcyBvdGhlcndpc2UgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nIHRoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkKLS8vIChlLmcuIFVVSUQoIjdkNjEzODU4LTU4MzctNGEzOC04NGM1LTMzMmQxY2RkZWUyNyIpIGlzIHRoZSBzYW1lIGFzCi0vLyAgICAgICB7ezB4N2QsIDB4NjEsIDB4MzgsIDB4NTgsIDB4NTgsIDB4MzcsIDB4NGEsIDB4MzgsCi0vLyAgICAgICAgIDB4ODQsIDB4YzUsIDB4MzMsIDB4MmQsIDB4MWMsIDB4ZGQsIDB4ZWUsIDB4Mjd9fSkKLQotI2RlZmluZSBVVUlEKHN0cikgW117IGNvbnN0ZXhwciBNZWRpYUV4dHJhY3Rvcjo6dXVpZF90IHV1aWQgPSBjb25zdFVVSUQoc3RyKTsgcmV0dXJuIHV1aWQ7IH0oKQotCi0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRURJQV9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZWE2MWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfU09VUkNFX0JBU0VfSF8KLQotI2RlZmluZSBNRURJQV9TT1VSQ0VfQkFTRV9IXwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1lZGlhQnVmZmVyQmFzZTsKLQotY2xhc3MgU291cmNlQmFzZUFsbG9jVHJhY2tlciB7Ci1wdWJsaWM6Ci0gICAgU291cmNlQmFzZUFsbG9jVHJhY2tlcigpIHsKLSAgICAgICAgQUxPR0QoInNvdXJjZWJhc2UgYWxsb2NhdGVkOiAlcCIsIHRoaXMpOwotICAgIH0KLSAgICB2aXJ0dWFsIH5Tb3VyY2VCYXNlQWxsb2NUcmFja2VyKCkgewotICAgICAgICBBTE9HRCgic291cmNlYmFzZSBmcmVlZDogJXAiLCB0aGlzKTsKLSAgICB9Ci19OwotCi1zdHJ1Y3QgTWVkaWFUcmFjawotLy8gICAgOiBwdWJsaWMgU291cmNlQmFzZUFsbG9jVHJhY2tlcgotewotICAgIE1lZGlhVHJhY2soKTsKLQotICAgIC8vIFRvIGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIG1ldGhvZHMgb24gdGhpcyBvYmplY3QsIGV4Y2VwdAotICAgIC8vIGdldEZvcm1hdCgpLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKSA9IDA7Ci0KLSAgICAvLyBBbnkgYmxvY2tpbmcgcmVhZCBjYWxsIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCBhIHJlc3VsdCBvZiBOT19JTklULgotICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgYW55IG1ldGhvZHMgb3RoZXIgdGhhbiBzdGFydCBhZnRlciB0aGlzIGNhbGwKLSAgICAvLyByZXR1cm5zLiBBbnkgYnVmZmVycyB0aGUgb2JqZWN0IG1heSBiZSBob2xkaW5nIG9udG8gYXQgdGhlIHRpbWUgb2YKLSAgICAvLyB0aGUgc3RvcCgpIGNhbGwgYXJlIHJlbGVhc2VkLgotICAgIC8vIEFsc28sIGl0IGlzIGltcGVyYXRpdmUgdGhhdCBhbnkgYnVmZmVycyBvdXRwdXQgYnkgdGhpcyBvYmplY3QgYW5kCi0gICAgLy8gaGVsZCBvbnRvIGJ5IGNhbGxlcnMgYmUgcmVsZWFzZWQgYmVmb3JlIGEgY2FsbCB0byBzdG9wKCkgISEhCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOwotCi0gICAgLy8gUmV0dXJucyB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIG91dHB1dCBieSB0aGlzIG1lZGlhIHRyYWNrLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYgZm9ybWF0KSA9IDA7Ci0KLSAgICAvLyBPcHRpb25zIHRoYXQgbW9kaWZ5IHJlYWQoKSBiZWhhdmlvdXIuIFRoZSBkZWZhdWx0IGlzIHRvCi0gICAgLy8gYSkgbm90IHJlcXVlc3QgYSBzZWVrCi0gICAgLy8gYikgbm90IGJlIGxhdGUsIGkuZS4gbGF0ZW5lc3NfdXMgPSAwCi0gICAgc3RydWN0IFJlYWRPcHRpb25zIHsKLSAgICAgICAgZW51bSBTZWVrTW9kZSA6IGludDMyX3QgewotICAgICAgICAgICAgU0VFS19QUkVWSU9VU19TWU5DLAotICAgICAgICAgICAgU0VFS19ORVhUX1NZTkMsCi0gICAgICAgICAgICBTRUVLX0NMT1NFU1RfU1lOQywKLSAgICAgICAgICAgIFNFRUtfQ0xPU0VTVCwKLSAgICAgICAgICAgIFNFRUtfRlJBTUVfSU5ERVgsCi0gICAgICAgIH07Ci0KLSAgICAgICAgUmVhZE9wdGlvbnMoKTsKLQotICAgICAgICAvLyBSZXNldCBldmVyeXRoaW5nIGJhY2sgdG8gZGVmYXVsdHMuCi0gICAgICAgIHZvaWQgcmVzZXQoKTsKLQotICAgICAgICB2b2lkIHNldFNlZWtUbyhpbnQ2NF90IHRpbWVfdXMsIFNlZWtNb2RlIG1vZGUgPSBTRUVLX0NMT1NFU1RfU1lOQyk7Ci0gICAgICAgIHZvaWQgY2xlYXJTZWVrVG8oKTsKLSAgICAgICAgYm9vbCBnZXRTZWVrVG8oaW50NjRfdCAqdGltZV91cywgU2Vla01vZGUgKm1vZGUpIGNvbnN0OwotCi0gICAgICAgIHZvaWQgc2V0Tm9uQmxvY2tpbmcoKTsKLSAgICAgICAgdm9pZCBjbGVhck5vbkJsb2NraW5nKCk7Ci0gICAgICAgIGJvb2wgZ2V0Tm9uQmxvY2tpbmcoKSBjb25zdDsKLQotICAgICAgICAvLyBVc2VkIHRvIGNsZWFyIGFsbCBub24tcGVyc2lzdGVudCBvcHRpb25zIGZvciBtdWx0aXBsZSBidWZmZXIgcmVhZHMuCi0gICAgICAgIHZvaWQgY2xlYXJOb25QZXJzaXN0ZW50KCkgewotICAgICAgICAgICAgY2xlYXJTZWVrVG8oKTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgZW51bSBPcHRpb25zIHsKLSAgICAgICAgICAgIGtTZWVrVG9fT3B0aW9uICAgICAgPSAxLAotICAgICAgICB9OwotCi0gICAgICAgIHVpbnQzMl90IG1PcHRpb25zOwotICAgICAgICBpbnQ2NF90IG1TZWVrVGltZVVzOwotICAgICAgICBTZWVrTW9kZSBtU2Vla01vZGU7Ci0gICAgICAgIGJvb2wgbU5vbkJsb2NraW5nOwotICAgIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7IC8vIHNlbnQgdGhyb3VnaCBCaW5kZXIKLQotICAgIC8vIFJldHVybnMgYSBuZXcgYnVmZmVyIG9mIGRhdGEuIENhbGwgYmxvY2tzIHVudGlsIGEKLSAgICAvLyBidWZmZXIgaXMgYXZhaWxhYmxlLCBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCBvZiB0aGUgZW5kIG9mIHRoZSBzdHJlYW0KLSAgICAvLyBpcyByZWFjaGVkLgotICAgIC8vIEVuZCBvZiBzdHJlYW0gaXMgc2lnbmFsbGVkIGJ5IGEgcmVzdWx0IG9mIEVSUk9SX0VORF9PRl9TVFJFQU0uCi0gICAgLy8gQSByZXN1bHQgb2YgSU5GT19GT1JNQVRfQ0hBTkdFRCBpbmRpY2F0ZXMgdGhhdCB0aGUgZm9ybWF0IG9mIHRoaXMKLSAgICAvLyBNZWRpYVNvdXJjZSBoYXMgY2hhbmdlZCBtaWQtc3RyZWFtLCB0aGUgY2xpZW50IGNhbiBjb250aW51ZSByZWFkaW5nCi0gICAgLy8gYnV0IHNob3VsZCBiZSBwcmVwYXJlZCBmb3IgYnVmZmVycyBvZiB0aGUgbmV3IGNvbmZpZ3VyYXRpb24uCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpID0gMDsKLQotICAgIHZpcnR1YWwgfk1lZGlhVHJhY2soKTsKLQotcHJpdmF0ZToKLSAgICBNZWRpYVRyYWNrKGNvbnN0IE1lZGlhVHJhY2sgJik7Ci0gICAgTWVkaWFUcmFjayAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhVHJhY2sgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FRElBX1NPVVJDRV9CQVNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmEzMjk1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotI2lmbmRlZiBWT1JCSVNfQ09NTUVOVF9IXwotI2RlZmluZSBWT1JCSVNfQ09NTUVOVF9IXwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1ldGFEYXRhQmFzZTsKLQotdm9pZCBwYXJzZVZvcmJpc0NvbW1lbnQoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGEsIGNvbnN0IGNoYXIgKmNvbW1lbnQsIHNpemVfdCBjb21tZW50TGVuZ3RoKTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIFZPUkJJU19DT01NRU5UX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMjU5NjUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX0JVRkZFUl9IXwotCi0jZGVmaW5lIE1FRElBX0JVRkZFUl9IXwotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBQnVmZmVyOwotY2xhc3MgTWVkaWFCdWZmZXI7Ci1jbGFzcyBNZWRpYUJ1ZmZlck9ic2VydmVyOwotY2xhc3MgTWV0YURhdGFCYXNlOwotCi1jbGFzcyBNZWRpYUJ1ZmZlciA6IHB1YmxpYyBNZWRpYUJ1ZmZlckJhc2UgewotcHVibGljOgotICAgIC8vIGFsbG9jYXRpb25zIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIHRoaXMgd2lsbCB1c2Ugc2hhcmVkIG1lbW9yeS4KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtTaGFyZWRNZW1UaHJlc2hvbGQgPSA2NCAqIDEwMjQ7Ci0KLSAgICAvLyBUaGUgdW5kZXJseWluZyBkYXRhIHJlbWFpbnMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIhCi0gICAgTWVkaWFCdWZmZXIodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgZXhwbGljaXQgTWVkaWFCdWZmZXIoc2l6ZV90IHNpemUpOwotCi0gICAgZXhwbGljaXQgTWVkaWFCdWZmZXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7Ci0KLSAgICBNZWRpYUJ1ZmZlcihjb25zdCBzcDxJTWVtb3J5PiAmbWVtKSA6Ci0gICAgICAgIE1lZGlhQnVmZmVyKCh1aW50OF90ICopbWVtLT5wb2ludGVyKCkgKyBzaXplb2YoU2hhcmVkQ29udHJvbCksIG1lbS0+c2l6ZSgpKSB7Ci0gICAgICAgIC8vIGRlbGVnYXRlIGFuZCBvdmVycmlkZSBtTWVtb3J5Ci0gICAgICAgIG1NZW1vcnkgPSBtZW07Ci0gICAgfQotCi0gICAgLy8gSWYgTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIGRlY3JlbWVudCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50OwotICAgIC8vIGlmIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gMCwgcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlCi0gICAgLy8gYXNzb2NpYXRlZCBNZWRpYUJ1ZmZlckdyb3VwLgotICAgIC8vCi0gICAgLy8gSWYgbm8gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSB6ZXJvCi0gICAgLy8gd2hlbiBjYWxsZWQsIHdoZXJldXBvbiB0aGUgTWVkaWFCdWZmZXIgaXMgZGVsZXRlZC4KLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpOwotCi0gICAgLy8gSW5jcmVtZW50cyB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50LgotICAgIC8vIFVzZSBvbmx5IHdoZW4gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQuCi0gICAgdmlydHVhbCB2b2lkIGFkZF9yZWYoKTsKLQotICAgIHZpcnR1YWwgdm9pZCAqZGF0YSgpIGNvbnN0OwotICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX29mZnNldCgpIGNvbnN0OwotICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX2xlbmd0aCgpIGNvbnN0OwotCi0gICAgdmlydHVhbCB2b2lkIHNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKTsKLQotICAgIE1ldGFEYXRhQmFzZSYgbWV0YV9kYXRhKCk7Ci0KLSAgICAvLyBDbGVhcnMgbWV0YSBkYXRhIGFuZCByZXNldHMgdGhlIHJhbmdlIHRvIHRoZSBmdWxsIGV4dGVudC4KLSAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXRPYnNlcnZlcihNZWRpYUJ1ZmZlck9ic2VydmVyICpncm91cCk7Ci0KLSAgICAvLyBSZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyBNZWRpYUJ1ZmZlciBpbmNyZWFzaW5nIGl0cyByZWZlcmVuY2UgY291bnQuCi0gICAgLy8gVGhlIGNsb25lIHJlZmVyZW5jZXMgdGhlIHNhbWUgZGF0YSBidXQgaGFzIGl0cyBvd24gcmFuZ2UgYW5kCi0gICAgLy8gTWV0YURhdGEuCi0gICAgdmlydHVhbCBNZWRpYUJ1ZmZlckJhc2UgKmNsb25lKCk7Ci0KLSAgICAvLyBzdW0gb2YgbG9jYWxSZWZjb3VudCgpIGFuZCByZW1vdGVSZWZjb3VudCgpCi0gICAgLy8gUmVzdWx0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGFwcHJveGltYXRlIHVubGVzcyB0aGUgcmVzdWx0IHByZWNsdWRlcyBjb25jdXJyZW50IGFjY2Vzc2VzLgotICAgIHZpcnR1YWwgaW50IHJlZmNvdW50KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbG9jYWxSZWZjb3VudCgpICsgcmVtb3RlUmVmY291bnQoKTsKLSAgICB9Ci0KLSAgICAvLyBSZXN1bHQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYXBwcm94aW1hdGUgdW5sZXNzIHRoZSByZXN1bHQgcHJlY2x1ZGVzIGNvbmN1cnJlbnQgYWNjZXNzZXMuCi0gICAgdmlydHVhbCBpbnQgbG9jYWxSZWZjb3VudCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1SZWZDb3VudC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOwotICAgIH0KLQotICAgIHZpcnR1YWwgaW50IHJlbW90ZVJlZmNvdW50KCkgY29uc3QgewotICAgICAgICBpZiAobU1lbW9yeS5nZXQoKSA9PSBudWxscHRyIHx8IG1NZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSByZXR1cm4gMDsKLSAgICAgICAgaW50MzJfdCByZW1vdGVSZWZjb3VudCA9Ci0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1NZW1vcnktPnBvaW50ZXIoKSktPmdldFJlbW90ZVJlZmNvdW50KCk7Ci0gICAgICAgIC8vIFNhbml0eSBjaGVjayBzbyB0aGF0IHJlbW90ZVJlZkNvdW50KCkgaXMgbm9uLW5lZ2F0aXZlLgotICAgICAgICByZXR1cm4gcmVtb3RlUmVmY291bnQgPj0gMCA/IHJlbW90ZVJlZmNvdW50IDogMDsgLy8gZG8gbm90IGFsbG93IGNvcnJ1cHRlZCBkYXRhLgotICAgIH0KLQotICAgIC8vIHJldHVybnMgb2xkIHZhbHVlCi0gICAgaW50IGFkZFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKG1NZW1vcnkuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtTWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obU1lbW9yeS0+cG9pbnRlcigpKS0+YWRkUmVtb3RlUmVmY291bnQodmFsdWUpOwotICAgIH0KLQotICAgIGJvb2wgaXNEZWFkT2JqZWN0KCkgY29uc3QgewotICAgICAgICByZXR1cm4gaXNEZWFkT2JqZWN0KG1NZW1vcnkpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sIGlzRGVhZE9iamVjdChjb25zdCBzcDxJTWVtb3J5PiAmbWVtb3J5KSB7Ci0gICAgICAgIGlmIChtZW1vcnkuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obWVtb3J5LT5wb2ludGVyKCkpLT5pc0RlYWRPYmplY3QoKTsKLSAgICB9Ci0KLSAgICAvLyBTdGlja3kgb24gZW5hYmxpbmcgb2Ygc2hhcmVkIG1lbW9yeSBNZWRpYUJ1ZmZlcnMuIEJ5IGRlZmF1bHQgd2UgZG9uJ3QgdXNlCi0gICAgLy8gc2hhcmVkIG1lbW9yeSBmb3IgTWVkaWFCdWZmZXJzLCBidXQgd2UgZW5hYmxlIHRoaXMgZm9yIHRob3NlIHByb2Nlc3NlcwotICAgIC8vIHRoYXQgZXhwb3J0IE1lZGlhQnVmZmVycy4KLSAgICBzdGF0aWMgdm9pZCB1c2VTaGFyZWRNZW1vcnkoKSB7Ci0gICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAotICAgICAgICAgICAgICAgICZtVXNlU2hhcmVkTWVtb3J5LCAoaW50X2xlYXN0MzJfdCkxLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICAvLyB0cnVlIGlmIE1lZGlhQnVmZmVyIGlzIG9ic2VydmVkIChwYXJ0IG9mIGEgTWVkaWFCdWZmZXJHcm91cCkuCi0gICAgaW5saW5lIGJvb2wgaXNPYnNlcnZlZCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1PYnNlcnZlciAhPSBudWxscHRyOwotICAgIH0KLQotICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyKCk7Ci0KLSAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBNZWRpYUJ1ZmZlckdyb3VwOwotICAgIGZyaWVuZCBjbGFzcyBPTVhEZWNvZGVyOwotICAgIGZyaWVuZCBjbGFzcyBCbk1lZGlhU291cmNlOwotICAgIGZyaWVuZCBjbGFzcyBCcE1lZGlhU291cmNlOwotCi0gICAgLy8gRm9yIHVzZSBieSBPTVhEZWNvZGVyLCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSAxLCBkcm9wIHJlZmVyZW5jZQotICAgIC8vIGNvdW50IHRvIDAgd2l0aG91dCBzaWduYWxsaW5nIHRoZSBvYnNlcnZlci4KLSAgICB2b2lkIGNsYWltKCk7Ci0KLSAgICBNZWRpYUJ1ZmZlck9ic2VydmVyICptT2JzZXJ2ZXI7Ci0gICAgc3RkOjphdG9taWM8aW50PiBtUmVmQ291bnQ7Ci0KLSAgICB2b2lkICptRGF0YTsKLSAgICBzaXplX3QgbVNpemUsIG1SYW5nZU9mZnNldCwgbVJhbmdlTGVuZ3RoOwotICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7Ci0KLSAgICBib29sIG1Pd25zRGF0YTsKLQotICAgIE1ldGFEYXRhQmFzZSogbU1ldGFEYXRhOwotCi0gICAgTWVkaWFCdWZmZXIgKm1PcmlnaW5hbDsKLQotICAgIHN0YXRpYyBzdGQ6OmF0b21pY19pbnRfbGVhc3QzMl90IG1Vc2VTaGFyZWRNZW1vcnk7Ci0KLSAgICBNZWRpYUJ1ZmZlcihjb25zdCBNZWRpYUJ1ZmZlciAmKTsKLSAgICBNZWRpYUJ1ZmZlciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhQnVmZmVyICYpOwotCi0gICAgLy8gU2hhcmVkQ29udHJvbCBibG9jayBhdCB0aGUgc3RhcnQgb2YgSU1lbW9yeS4KLSAgICBzdHJ1Y3QgU2hhcmVkQ29udHJvbCB7Ci0gICAgICAgIGVudW0gewotICAgICAgICAgICAgRkxBR19ERUFEX09CSkVDVCA9ICgxIDw8IDApLAotICAgICAgICB9OwotCi0gICAgICAgIC8vIHJldHVybnMgb2xkIHZhbHVlCi0gICAgICAgIGlubGluZSBpbnQzMl90IGFkZFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGQ6OmF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQoCi0gICAgICAgICAgICAgICAgICAgICZtUmVtb3RlUmVmY291bnQsIChpbnRfbGVhc3QzMl90KXZhbHVlLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSBpbnQzMl90IGdldFJlbW90ZVJlZmNvdW50KCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoJm1SZW1vdGVSZWZjb3VudCwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgdm9pZCBzZXRSZW1vdGVSZWZjb3VudChpbnQzMl90IHZhbHVlKSB7Ci0gICAgICAgICAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCgKLSAgICAgICAgICAgICAgICAgICAgJm1SZW1vdGVSZWZjb3VudCwgKGludF9sZWFzdDMyX3QpdmFsdWUsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5saW5lIGJvb2wgaXNEZWFkT2JqZWN0KCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIChzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KAotICAgICAgICAgICAgICAgICAgICAmbUZsYWdzLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KSAmIEZMQUdfREVBRF9PQkpFQ1QpICE9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgdm9pZCBzZXREZWFkT2JqZWN0KCkgewotICAgICAgICAgICAgKHZvaWQpc3RkOjphdG9taWNfZmV0Y2hfb3JfZXhwbGljaXQoCi0gICAgICAgICAgICAgICAgICAgICZtRmxhZ3MsIChpbnRfbGVhc3QzMl90KUZMQUdfREVBRF9PQkpFQ1QsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCgKLSAgICAgICAgICAgICAgICAgICAgJm1GbGFncywgKGludF9sZWFzdDMyX3QpMCwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7Ci0gICAgICAgICAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCgKLSAgICAgICAgICAgICAgICAgICAgJm1SZW1vdGVSZWZjb3VudCwgKGludF9sZWFzdDMyX3QpMCwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIENhdXRpb246IGF0b21pY19pbnRfZmFzdDMyX3QgaXMgNjQgYml0cyBvbiBMUDY0LgotICAgICAgICBzdGQ6OmF0b21pY19pbnRfbGVhc3QzMl90IG1GbGFnczsKLSAgICAgICAgc3RkOjphdG9taWNfaW50X2xlYXN0MzJfdCBtUmVtb3RlUmVmY291bnQ7Ci0gICAgICAgIGludDMyX3QgdW51c2VkWzZdIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKTsgLy8gYWRkaXRpb25hbCBidWZmZXIgc3BhY2UKLSAgICB9OwotCi0gICAgaW5saW5lIFNoYXJlZENvbnRyb2wgKmdldFNoYXJlZENvbnRyb2woKSBjb25zdCB7Ci0gICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1NZW1vcnktPnBvaW50ZXIoKSk7Ci0gICAgIH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4ZDk0YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQlVGRkVSX0JBU0VfSF8KLQotI2RlZmluZSBNRURJQV9CVUZGRVJfQkFTRV9IXwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1lZGlhQnVmZmVyQmFzZTsKLWNsYXNzIE1ldGFEYXRhQmFzZTsKLQotY2xhc3MgTWVkaWFCdWZmZXJPYnNlcnZlciB7Ci1wdWJsaWM6Ci0gICAgTWVkaWFCdWZmZXJPYnNlcnZlcigpIHt9Ci0gICAgdmlydHVhbCB+TWVkaWFCdWZmZXJPYnNlcnZlcigpIHt9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpID0gMDsKLQotcHJpdmF0ZToKLSAgICBNZWRpYUJ1ZmZlck9ic2VydmVyKGNvbnN0IE1lZGlhQnVmZmVyT2JzZXJ2ZXIgJik7Ci0gICAgTWVkaWFCdWZmZXJPYnNlcnZlciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhQnVmZmVyT2JzZXJ2ZXIgJik7Ci19OwotCi1jbGFzcyBNZWRpYUJ1ZmZlckJhc2UgewotcHVibGljOgotICAgIHN0YXRpYyBNZWRpYUJ1ZmZlckJhc2UgKkNyZWF0ZShzaXplX3Qgc2l6ZSk7Ci0KLSAgICAvLyBJZiBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldCwgZGVjcmVtZW50IHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQ7Ci0gICAgLy8gaWYgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byAwLCByZXR1cm4gdGhlIGJ1ZmZlciB0byB0aGUKLSAgICAvLyBhc3NvY2lhdGVkIE1lZGlhQnVmZmVyR3JvdXAuCi0gICAgLy8KLSAgICAvLyBJZiBubyBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldCwgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudCBtdXN0IGJlIHplcm8KLSAgICAvLyB3aGVuIGNhbGxlZCwgd2hlcmV1cG9uIHRoZSBNZWRpYUJ1ZmZlciBpcyBkZWxldGVkLgotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgPSAwOwotCi0gICAgLy8gSW5jcmVtZW50cyB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50LgotICAgIC8vIFVzZSBvbmx5IHdoZW4gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQuCi0gICAgdmlydHVhbCB2b2lkIGFkZF9yZWYoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgKmRhdGEoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX29mZnNldCgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9sZW5ndGgoKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpID0gMDsKLQotICAgIHZpcnR1YWwgTWV0YURhdGFCYXNlJiBtZXRhX2RhdGEoKSA9IDA7Ci0KLSAgICAvLyBDbGVhcnMgbWV0YSBkYXRhIGFuZCByZXNldHMgdGhlIHJhbmdlIHRvIHRoZSBmdWxsIGV4dGVudC4KLSAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0T2JzZXJ2ZXIoTWVkaWFCdWZmZXJPYnNlcnZlciAqZ3JvdXApID0gMDsKLQotICAgIC8vIFJldHVybnMgYSBjbG9uZSBvZiB0aGlzIE1lZGlhQnVmZmVyQmFzZSBpbmNyZWFzaW5nIGl0cyByZWZlcmVuY2UKLSAgICAvLyBjb3VudC4gVGhlIGNsb25lIHJlZmVyZW5jZXMgdGhlIHNhbWUgZGF0YSBidXQgaGFzIGl0cyBvd24gcmFuZ2UgYW5kCi0gICAgLy8gTWV0YURhdGEuCi0gICAgdmlydHVhbCBNZWRpYUJ1ZmZlckJhc2UgKmNsb25lKCkgPSAwOwotCi0gICAgdmlydHVhbCBpbnQgcmVmY291bnQoKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIGludCBsb2NhbFJlZmNvdW50KCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgaW50IHJlbW90ZVJlZmNvdW50KCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCB+TWVkaWFCdWZmZXJCYXNlKCkge307Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FRElBX0JVRkZFUl9CQVNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWQ1ZGY3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQlVGRkVSX0dST1VQX0hfCi0KLSNkZWZpbmUgTUVESUFfQlVGRkVSX0dST1VQX0hfCi0KLSNpbmNsdWRlIDxsaXN0PgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1lZGlhQnVmZmVyQmFzZTsKLQotY2xhc3MgTWVkaWFCdWZmZXJHcm91cCA6IHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKLXB1YmxpYzoKLSAgICBNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBncm93dGhMaW1pdCA9IDApOwotCi0gICAgLy8gY3JlYXRlIGEgbWVkaWEgYnVmZmVyIGdyb3VwIHdpdGggcHJlYWxsb2NhdGVkIGJ1ZmZlcnMKLSAgICBNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCA9IDApOwotCi0gICAgfk1lZGlhQnVmZmVyR3JvdXAoKTsKLQotICAgIHZvaWQgYWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7Ci0KLSAgICBib29sIGhhc19idWZmZXJzKCk7Ci0KLSAgICAvLyBJZiBub25CbG9ja2luZyBpcyBmYWxzZSwgaXQgYmxvY2tzIHVudGlsIGEgYnVmZmVyIGlzIGF2YWlsYWJsZSBhbmQKLSAgICAvLyBwYXNzZXMgaXQgdG8gdGhlIGNhbGxlciBpbiAqYnVmZmVyLCB3aGlsZSByZXR1cm5pbmcgT0suCi0gICAgLy8gVGhlIHJldHVybmVkIGJ1ZmZlciB3aWxsIGhhdmUgYSByZWZlcmVuY2UgY291bnQgb2YgMS4KLSAgICAvLyBJZiBub25CbG9ja2luZyBpcyB0cnVlIGFuZCBhIGJ1ZmZlciBpcyBub3QgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLAotICAgIC8vIGJ1ZmZlciBpcyBzZXQgdG8gTlVMTCBhbmQgaXQgcmV0dXJucyBXT1VMRF9CTE9DSy4KLSAgICAvLyBJZiByZXF1ZXN0ZWRTaXplIGlzIDAsIGFueSBmcmVlIE1lZGlhQnVmZmVyIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgLy8gSWYgcmVxdWVzdGVkU2l6ZSBpcyA+IDAsIHRoZSByZXR1cm5lZCBNZWRpYUJ1ZmZlciBzaG91bGQgaGF2ZSBidWZmZXIKLSAgICAvLyBzaXplIG9mIGF0IGxlYXN0IHJlcXVzdGVkU2l6ZS4KLSAgICBzdGF0dXNfdCBhY3F1aXJlX2J1ZmZlcigKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgYm9vbCBub25CbG9ja2luZyA9IGZhbHNlLCBzaXplX3QgcmVxdWVzdGVkU2l6ZSA9IDApOwotCi0gICAgc2l6ZV90IGJ1ZmZlcnMoKSBjb25zdDsKLQotICAgIC8vIElmIGJ1ZmZlciBpcyBudWxscHRyLCBoYXZlIGFjcXVpcmVfYnVmZmVyKCkgY2hlY2sgZm9yIHJlbW90ZSByZWxlYXNlLgotICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IEludGVybmFsRGF0YTsKLSAgICBJbnRlcm5hbERhdGEgKm1JbnRlcm5hbDsKLQotICAgIE1lZGlhQnVmZmVyR3JvdXAoY29uc3QgTWVkaWFCdWZmZXJHcm91cCAmKTsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXJHcm91cCAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0dST1VQX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0ZTg2Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FVEFfREFUQV9CQVNFX0hfCi0KLSNkZWZpbmUgTUVUQV9EQVRBX0JBU0VfSF8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIFRoZSBmb2xsb3dpbmcga2V5cyBtYXAgdG8gaW50MzJfdCBkYXRhIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotZW51bSB7Ci0gICAga0tleU1JTUVUeXBlICAgICAgICAgID0gJ21pbWUnLCAgLy8gY3N0cmluZwotICAgIGtLZXlXaWR0aCAgICAgICAgICAgICA9ICd3aWR0JywgIC8vIGludDMyX3QsIGltYWdlIHBpeGVsCi0gICAga0tleUhlaWdodCAgICAgICAgICAgID0gJ2hlaWcnLCAgLy8gaW50MzJfdCwgaW1hZ2UgcGl4ZWwKLSAgICBrS2V5RGlzcGxheVdpZHRoICAgICAgPSAnZFdpZCcsICAvLyBpbnQzMl90LCBkaXNwbGF5L3ByZXNlbnRhdGlvbgotICAgIGtLZXlEaXNwbGF5SGVpZ2h0ICAgICA9ICdkSGd0JywgIC8vIGludDMyX3QsIGRpc3BsYXkvcHJlc2VudGF0aW9uCi0gICAga0tleVNBUldpZHRoICAgICAgICAgID0gJ3NhclcnLCAgLy8gaW50MzJfdCwgc2FtcGxlQXNwZWN0UmF0aW8gd2lkdGgKLSAgICBrS2V5U0FSSGVpZ2h0ICAgICAgICAgPSAnc2FySCcsICAvLyBpbnQzMl90LCBzYW1wbGVBc3BlY3RSYXRpbyBoZWlnaHQKLSAgICBrS2V5VGh1bWJuYWlsV2lkdGggICAgPSAndGhiVycsICAvLyBpbnQzMl90LCB0aHVtYm5haWwgd2lkdGgKLSAgICBrS2V5VGh1bWJuYWlsSGVpZ2h0ICAgPSAndGhiSCcsICAvLyBpbnQzMl90LCB0aHVtYm5haWwgaGVpZ2h0Ci0KLSAgICAvLyBhIHJlY3RhbmdsZSwgaWYgYWJzZW50IGFzc3VtZWQgdG8gYmUgKDAsIDAsIHdpZHRoIC0gMSwgaGVpZ2h0IC0gMSkKLSAgICBrS2V5Q3JvcFJlY3QgICAgICAgICAgPSAnY3JvcCcsCi0KLSAgICBrS2V5Um90YXRpb24gICAgICAgICAgPSAncm90QScsICAvLyBpbnQzMl90IChhbmdsZSBpbiBkZWdyZWVzKQotICAgIGtLZXlJRnJhbWVzSW50ZXJ2YWwgICA9ICdpZml2JywgIC8vIGludDMyX3QKLSAgICBrS2V5U3RyaWRlICAgICAgICAgICAgPSAnc3RyZCcsICAvLyBpbnQzMl90Ci0gICAga0tleVNsaWNlSGVpZ2h0ICAgICAgID0gJ3NsaHQnLCAgLy8gaW50MzJfdAotICAgIGtLZXlDaGFubmVsQ291bnQgICAgICA9ICcjY2huJywgIC8vIGludDMyX3QKLSAgICBrS2V5Q2hhbm5lbE1hc2sgICAgICAgPSAnY2hubScsICAvLyBpbnQzMl90Ci0gICAga0tleVNhbXBsZVJhdGUgICAgICAgID0gJ3NydGUnLCAgLy8gaW50MzJfdCAoYXVkaW8gc2FtcGxpbmcgcmF0ZSBIeikKLSAgICBrS2V5UGNtRW5jb2RpbmcgICAgICAgPSAnUENNZScsICAvLyBpbnQzMl90IChhdWRpbyBlbmNvZGluZyBlbnVtKQotICAgIGtLZXlGcmFtZVJhdGUgICAgICAgICA9ICdmcm1SJywgIC8vIGludDMyX3QgKHZpZGVvIGZyYW1lIHJhdGUgZnBzKQotICAgIGtLZXlCaXRSYXRlICAgICAgICAgICA9ICdicnRlJywgIC8vIGludDMyX3QgKGJwcykKLSAgICBrS2V5TWF4Qml0UmF0ZSAgICAgICAgPSAnbXhCcicsICAvLyBpbnQzMl90IChicHMpCi0gICAga0tleUJpdHNQZXJTYW1wbGUgICAgID0gJ2JpdHMnLCAgLy8gaW50MzJfdCAoYml0cyBwZXIgc2FtcGxlKQotICAgIGtLZXlTdHJlYW1IZWFkZXIgICAgICA9ICdzdEhkJywgIC8vIHJhdyBkYXRhCi0gICAga0tleUVTRFMgICAgICAgICAgICAgID0gJ2VzZHMnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5QUFDUHJvZmlsZSAgICAgICAgPSAnYWFjcCcsICAvLyBpbnQzMl90Ci0gICAga0tleUFWQ0MgICAgICAgICAgICAgID0gJ2F2Y2MnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5SFZDQyAgICAgICAgICAgICAgPSAnaHZjYycsICAvLyByYXcgZGF0YQotICAgIGtLZXlUaHVtYm5haWxIVkNDICAgICA9ICd0aHZjJywgIC8vIHJhdyBkYXRhCi0gICAga0tleUQyNjMgICAgICAgICAgICAgID0gJ2QyNjMnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5Vm9yYmlzSW5mbyAgICAgICAgPSAndmluZicsICAvLyByYXcgZGF0YQotICAgIGtLZXlWb3JiaXNCb29rcyAgICAgICA9ICd2Ym9vJywgIC8vIHJhdyBkYXRhCi0gICAga0tleU9wdXNIZWFkZXIgICAgICAgID0gJ29oZHInLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5T3B1c0NvZGVjRGVsYXkgICAgPSAnb2NvZCcsICAvLyB1aW50NjRfdCAoY29kZWMgZGVsYXkgaW4gbnMpCi0gICAga0tleU9wdXNTZWVrUHJlUm9sbCAgID0gJ29zcHInLCAgLy8gdWludDY0X3QgKHNlZWsgcHJlcm9sbCBpbiBucykKLSAgICBrS2V5RmxhY01ldGFkYXRhICAgICAgPSAnZmxNZCcsICAvLyByYXcgZGF0YQotICAgIGtLZXlWcDlDb2RlY1ByaXZhdGUgICA9ICd2cDlwJywgIC8vIHJhdyBkYXRhICh2cDkgY3NkIGluZm9ybWF0aW9uKQotICAgIGtLZXlXYW50c05BTEZyYWdtZW50cyA9ICdOQUxmJywKLSAgICBrS2V5SXNTeW5jRnJhbWUgICAgICAgPSAnc3luYycsICAvLyBpbnQzMl90IChib29sKQotICAgIGtLZXlJc0NvZGVjQ29uZmlnICAgICA9ICdjb25mJywgIC8vIGludDMyX3QgKGJvb2wpCi0gICAga0tleUlzTXV4ZXJEYXRhICAgICAgID0gJ211eGQnLCAgLy8gaW50MzJfdCAoYm9vbCkKLSAgICBrS2V5VGltZSAgICAgICAgICAgICAgPSAndGltZScsICAvLyBpbnQ2NF90ICh1c2VjcykKLSAgICBrS2V5RGVjb2RpbmdUaW1lICAgICAgPSAnZGVjVCcsICAvLyBpbnQ2NF90IChkZWNvZGluZyB0aW1lc3RhbXAgaW4gdXNlY3MpCi0gICAga0tleU5UUFRpbWUgICAgICAgICAgID0gJ250cFQnLCAgLy8gdWludDY0X3QgKG50cC10aW1lc3RhbXApCi0gICAga0tleVRhcmdldFRpbWUgICAgICAgID0gJ3RhclQnLCAgLy8gaW50NjRfdCAodXNlY3MpCi0gICAga0tleURyaWZ0VGltZSAgICAgICAgID0gJ2RmdFQnLCAgLy8gaW50NjRfdCAodXNlY3MpCi0gICAga0tleUFuY2hvclRpbWUgICAgICAgID0gJ2FuY1QnLCAgLy8gaW50NjRfdCAodXNlY3MpCi0gICAga0tleUR1cmF0aW9uICAgICAgICAgID0gJ2R1cmEnLCAgLy8gaW50NjRfdCAodXNlY3MpCi0gICAga0tleVBpeGVsRm9ybWF0ICAgICAgID0gJ3BpeGYnLCAgLy8gaW50MzJfdAotICAgIGtLZXlDb2xvckZvcm1hdCAgICAgICA9ICdjb2xmJywgIC8vIGludDMyX3QKLSAgICBrS2V5Q29sb3JTcGFjZSAgICAgICAgPSAnY29scycsICAvLyBpbnQzMl90Ci0gICAga0tleVBsYXRmb3JtUHJpdmF0ZSAgID0gJ3ByaXYnLCAgLy8gcG9pbnRlcgotICAgIGtLZXlEZWNvZGVyQ29tcG9uZW50ICA9ICdkZWNDJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5QnVmZmVySUQgICAgICAgICAgPSAnYmZJRCcsCi0gICAga0tleU1heElucHV0U2l6ZSAgICAgID0gJ2lucFMnLAotICAgIGtLZXlNYXhXaWR0aCAgICAgICAgICA9ICdtYXhXJywKLSAgICBrS2V5TWF4SGVpZ2h0ICAgICAgICAgPSAnbWF4SCcsCi0gICAga0tleVRodW1ibmFpbFRpbWUgICAgID0gJ3RoYlQnLCAgLy8gaW50NjRfdCAodXNlY3MpCi0gICAga0tleVRyYWNrSUQgICAgICAgICAgID0gJ3RySUQnLAotICAgIGtLZXlJc0RSTSAgICAgICAgICAgICA9ICdpZHJtJywgIC8vIGludDMyX3QgKGJvb2wpCi0gICAga0tleUVuY29kZXJEZWxheSAgICAgID0gJ2VuY2QnLCAgLy8gaW50MzJfdCAoZnJhbWVzKQotICAgIGtLZXlFbmNvZGVyUGFkZGluZyAgICA9ICdlbmNwJywgIC8vIGludDMyX3QgKGZyYW1lcykKLQotICAgIGtLZXlBbGJ1bSAgICAgICAgICAgICA9ICdhbGJ1JywgIC8vIGNzdHJpbmcKLSAgICBrS2V5QXJ0aXN0ICAgICAgICAgICAgPSAnYXJ0aScsICAvLyBjc3RyaW5nCi0gICAga0tleUFsYnVtQXJ0aXN0ICAgICAgID0gJ2FhcnQnLCAgLy8gY3N0cmluZwotICAgIGtLZXlDb21wb3NlciAgICAgICAgICA9ICdjb21wJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5R2VucmUgICAgICAgICAgICAgPSAnZ2VucicsICAvLyBjc3RyaW5nCi0gICAga0tleVRpdGxlICAgICAgICAgICAgID0gJ3RpdGwnLCAgLy8gY3N0cmluZwotICAgIGtLZXlZZWFyICAgICAgICAgICAgICA9ICd5ZWFyJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5QWxidW1BcnQgICAgICAgICAgPSAnYWxiQScsICAvLyBjb21wcmVzc2VkIGltYWdlIGRhdGEKLSAgICBrS2V5QWxidW1BcnRNSU1FICAgICAgPSAnYWxBTScsICAvLyBjc3RyaW5nCi0gICAga0tleUF1dGhvciAgICAgICAgICAgID0gJ2F1dGgnLCAgLy8gY3N0cmluZwotICAgIGtLZXlDRFRyYWNrTnVtYmVyICAgICA9ICdjZHRyJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5RGlzY051bWJlciAgICAgICAgPSAnZG51bScsICAvLyBjc3RyaW5nCi0gICAga0tleURhdGUgICAgICAgICAgICAgID0gJ2RhdGUnLCAgLy8gY3N0cmluZwotICAgIGtLZXlXcml0ZXIgICAgICAgICAgICA9ICd3cml0JywgIC8vIGNzdHJpbmcKLSAgICBrS2V5Q29tcGlsYXRpb24gICAgICAgPSAnY3BpbCcsICAvLyBjc3RyaW5nCi0gICAga0tleUxvY2F0aW9uICAgICAgICAgID0gJ2xvYyAnLCAgLy8gY3N0cmluZwotICAgIGtLZXlUaW1lU2NhbGUgICAgICAgICA9ICd0bXNsJywgIC8vIGludDMyX3QKLSAgICBrS2V5Q2FwdHVyZUZyYW1lcmF0ZSAgPSAnY2FwRicsICAvLyBmbG9hdCAoY2FwdHVyZSBmcHMpCi0KLSAgICAvLyB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbAotICAgIGtLZXlWaWRlb1Byb2ZpbGUgICAgICA9ICd2cHJmJywgIC8vIGludDMyX3QKLSAgICBrS2V5VmlkZW9MZXZlbCAgICAgICAgPSAndmxldicsICAvLyBpbnQzMl90Ci0KLSAgICAvLyBTZXQgdGhpcyBrZXkgdG8gZW5hYmxlIGF1dGhvcmluZyBmaWxlcyBpbiA2NC1iaXQgb2Zmc2V0Ci0gICAga0tleTY0Qml0RmlsZU9mZnNldCAgID0gJ2ZvYnQnLCAgLy8gaW50MzJfdCAoYm9vbCkKLSAgICBrS2V5MkJ5dGVOYWxMZW5ndGggICAgPSAnMk5BTCcsICAvLyBpbnQzMl90IChib29sKQotCi0gICAgLy8gSWRlbnRpZnkgdGhlIGZpbGUgb3V0cHV0IGZvcm1hdCBmb3IgYXV0aG9yaW5nCi0gICAgLy8gUGxlYXNlIHNlZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPiBmb3IgdGhlIHN1cHBvcnRlZAotICAgIC8vIGZpbGUgb3V0cHV0IGZvcm1hdHMuCi0gICAga0tleUZpbGVUeXBlICAgICAgICAgID0gJ2Z0eXAnLCAgLy8gaW50MzJfdAotCi0gICAgLy8gVHJhY2sgYXV0aG9yaW5nIHByb2dyZXNzIHN0YXR1cwotICAgIC8vIGtLZXlUcmFja1RpbWVTdGF0dXMgaXMgdXNlZCB0byB0cmFjayBwcm9ncmVzcyBpbiBlbGFwc2VkIHRpbWUKLSAgICBrS2V5VHJhY2tUaW1lU3RhdHVzICAgPSAndGt0bScsICAvLyBpbnQ2NF90Ci0KLSAgICBrS2V5UmVhbFRpbWVSZWNvcmRpbmcgPSAncnRyYycsICAvLyBib29sIChpbnQzMl90KQotICAgIGtLZXlOdW1CdWZmZXJzICAgICAgICA9ICduYmJmJywgIC8vIGludDMyX3QKLQotICAgIC8vIE9nZyBmaWxlcyBjYW4gYmUgdGFnZ2VkIHRvIGJlIGF1dG9tYXRpY2FsbHkgbG9vcGluZy4uLgotICAgIGtLZXlBdXRvTG9vcCAgICAgICAgICA9ICdhdXRMJywgIC8vIGJvb2wgKGludDMyX3QpCi0KLSAgICBrS2V5VmFsaWRTYW1wbGVzICAgICAgPSAndmFsRCcsICAvLyBpbnQzMl90Ci0KLSAgICBrS2V5SXNVbnJlYWRhYmxlICAgICAgPSAndW5yZScsICAvLyBib29sIChpbnQzMl90KQotCi0gICAgLy8gQW4gaW5kaWNhdGlvbiB0aGF0IGEgdmlkZW8gYnVmZmVyIGhhcyBiZWVuIHJlbmRlcmVkLgotICAgIGtLZXlSZW5kZXJlZCAgICAgICAgICA9ICdyZW5kJywgIC8vIGJvb2wgKGludDMyX3QpCi0KLSAgICAvLyBUaGUgbGFuZ3VhZ2UgY29kZSBmb3IgdGhpcyBtZWRpYQotICAgIGtLZXlNZWRpYUxhbmd1YWdlICAgICA9ICdsYW5nJywgIC8vIGNzdHJpbmcKLQotICAgIC8vIFRvIHN0b3JlIHRoZSB0aW1lZCB0ZXh0IGZvcm1hdCBkYXRhCi0gICAga0tleVRleHRGb3JtYXREYXRhICAgID0gJ3RleHQnLCAgLy8gcmF3IGRhdGEKLQotICAgIGtLZXlSZXF1aXJlc1NlY3VyZUJ1ZmZlcnMgPSAnc2VjdScsICAvLyBib29sIChpbnQzMl90KQotCi0gICAga0tleUlzQURUUyAgICAgICAgICAgID0gJ2FkdHMnLCAgLy8gYm9vbCAoaW50MzJfdCkKLSAgICBrS2V5QUFDQU9UICAgICAgICAgICAgPSAnYWFvdCcsICAvLyBpbnQzMl90Ci0KLSAgICAvLyBJZiBhIE1lZGlhQnVmZmVyJ3MgZGF0YSByZXByZXNlbnRzIChhdCBsZWFzdCBwYXJ0aWFsbHkpIGVuY3J5cHRlZAotICAgIC8vIGRhdGEsIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFpZCBpbiBkZWNyeXB0aW9uLgotICAgIC8vIFRoZSBkYXRhIGNhbiBiZSB0aG91Z2h0IG9mIGFzIHBhaXJzIG9mIHBsYWluIGFuZCBlbmNyeXB0ZWQgZGF0YQotICAgIC8vIGZyYWdtZW50cywgaS5lLiBwbGFpbiBhbmQgZW5jcnlwdGVkIGRhdGEgYWx0ZXJuYXRlLgotICAgIC8vIFRoZSBmaXJzdCBmcmFnbWVudCBpcyBieSBjb252ZW50aW9uIHBsYWluIGRhdGEgKGlmIHRoYXQncyBub3QgdGhlCi0gICAgLy8gY2FzZSwgc2ltcGx5IHNwZWNpZnkgcGxhaW4gZnJhZ21lbnQgc2l6ZSBvZiAwKS4KLSAgICAvLyBrS2V5RW5jcnlwdGVkU2l6ZXMgYW5kIGtLZXlQbGFpblNpemVzIGVhY2ggbWFwIHRvIGFuIGFycmF5IG9mCi0gICAgLy8gc2l6ZV90IHZhbHVlcy4gVGhlIHN1bSB0b3RhbCBvZiBhbGwgc2l6ZV90IHZhbHVlcyBvZiBib3RoIGFycmF5cwotICAgIC8vIG11c3QgZXF1YWwgdGhlIGFtb3VudCBvZiBkYXRhIChpLmUuIE1lZGlhQnVmZmVyJ3MgcmFuZ2VfbGVuZ3RoKCkpLgotICAgIC8vIElmIGJvdGggYXJyYXlzIGFyZSBwcmVzZW50LCB0aGV5IG11c3QgYmUgb2YgdGhlIHNhbWUgc2l6ZS4KLSAgICAvLyBJZiBvbmx5IGVuY3J5cHRlZCBzaXplcyBhcmUgcHJlc2VudCBpdCBpcyBhc3N1bWVkIHRoYXQgYWxsCi0gICAgLy8gcGxhaW4gc2l6ZXMgYXJlIDAsIGkuZS4gYWxsIGZyYWdtZW50cyBhcmUgZW5jcnlwdGVkLgotICAgIC8vIFRvIHByb2dyYW1tYXRpY2FsbHkgc2V0IHRoZXNlIGFycmF5LCB1c2UgdGhlIE1ldGFEYXRhQmFzZTo6c2V0RGF0YSBBUEksIGkuZS4KLSAgICAvLyBjb25zdCBzaXplX3QgZW5jU2l6ZXNbXTsKLSAgICAvLyBtZXRhLT5zZXREYXRhKAotICAgIC8vICBrS2V5RW5jcnlwdGVkU2l6ZXMsIDAgLyogdHlwZSAqLywgZW5jU2l6ZXMsIHNpemVvZihlbmNTaXplcykpOwotICAgIC8vIEEgcGxhaW4gc2l6ZXMgYXJyYXkgYnkgaXRzZWxmIG1ha2VzIG5vIHNlbnNlLgotICAgIGtLZXlFbmNyeXB0ZWRTaXplcyAgICA9ICdlbmNyJywgIC8vIHNpemVfdFtdCi0gICAga0tleVBsYWluU2l6ZXMgICAgICAgID0gJ3BsYWknLCAgLy8gc2l6ZV90W10KLSAgICBrS2V5Q3J5cHRvS2V5ICAgICAgICAgPSAnY3J5SycsICAvLyB1aW50OF90WzE2XQotICAgIGtLZXlDcnlwdG9JViAgICAgICAgICA9ICdjcnlJJywgIC8vIHVpbnQ4X3RbMTZdCi0gICAga0tleUNyeXB0b01vZGUgICAgICAgID0gJ2NyeU0nLCAgLy8gaW50MzJfdAotCi0gICAga0tleUNyeXB0b0RlZmF1bHRJVlNpemUgPSAnY3J5UycsICAvLyBpbnQzMl90Ci0KLSAgICBrS2V5UHNzaCAgICAgICAgICAgICAgPSAncHNzaCcsICAvLyByYXcgZGF0YQotICAgIGtLZXlDQVN5c3RlbUlEICAgICAgICA9ICdjYWlkJywgIC8vIGludDMyX3QKLSAgICBrS2V5Q0FTZXNzaW9uSUQgICAgICAgPSAnc2VpZCcsICAvLyByYXcgZGF0YQotCi0gICAga0tleUVuY3J5cHRlZEJ5dGVCbG9jayA9ICdjYmxrJywgIC8vIHVpbnQ4X3QKLSAgICBrS2V5U2tpcEJ5dGVCbG9jayAgICAgPSAnc2JsaycsICAvLyB1aW50OF90Ci0KLSAgICAvLyBQbGVhc2Ugc2VlIE1lZGlhRm9ybWF0LktFWV9JU19BVVRPU0VMRUNULgotICAgIGtLZXlUcmFja0lzQXV0b3NlbGVjdCA9ICdhdXRvJywgLy8gYm9vbCAoaW50MzJfdCkKLSAgICAvLyBQbGVhc2Ugc2VlIE1lZGlhRm9ybWF0LktFWV9JU19ERUZBVUxULgotICAgIGtLZXlUcmFja0lzRGVmYXVsdCAgICA9ICdkZmx0JywgLy8gYm9vbCAoaW50MzJfdCkKLSAgICAvLyBTaW1pbGFyIHRvIE1lZGlhRm9ybWF0LktFWV9JU19GT1JDRURfU1VCVElUTEUgYnV0IHBlcnRhaW5zIHRvIGF2IHRyYWNrcyBhcyB3ZWxsLgotICAgIGtLZXlUcmFja0lzRm9yY2VkICAgICA9ICdmcmNkJywgLy8gYm9vbCAoaW50MzJfdCkKLQotICAgIC8vIEgyNjQgc3VwcGxlbWVudGFsIGVuaGFuY2VtZW50IGluZm9ybWF0aW9uIG9mZnNldHMvc2l6ZXMKLSAgICBrS2V5U0VJICAgICAgICAgICAgICAgPSAnc2VpICcsIC8vIHJhdyBkYXRhCi0KLSAgICAvLyBNUEVHIHVzZXIgZGF0YSBvZmZzZXRzCi0gICAga0tleU1wZWdVc2VyRGF0YSAgICAgID0gJ21wdWQnLCAvLyBzaXplX3RbXQotCi0gICAgLy8gU2l6ZSBvZiBOQUxVIGxlbmd0aCBpbiBta3YvbXA0Ci0gICAga0tleU5hbExlbmd0aFNpemUgICAgID0gJ25hbHMnLCAvLyBpbnQzMl90Ci0KLSAgICAvLyBIRFIgcmVsYXRlZAotICAgIGtLZXlIZHJTdGF0aWNJbmZvICAgID0gJ2hkclMnLCAvLyBIRFJTdGF0aWNJbmZvCi0KLSAgICAvLyBjb2xvciBhc3BlY3RzCi0gICAga0tleUNvbG9yUmFuZ2UgICAgICAgPSAnY1JuZycsIC8vIGludDMyX3QsIGNvbG9yIHJhbmdlLCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5SYW5nZQotICAgIGtLZXlDb2xvclByaW1hcmllcyAgID0gJ2NQcm0nLCAvLyBpbnQzMl90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xvciBQcmltYXJpZXMsIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLlByaW1hcmllcwotICAgIGtLZXlUcmFuc2ZlckZ1bmN0aW9uID0gJ3RGdW4nLCAvLyBpbnQzMl90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2ZlciBGdW5jdGlvbiwgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuVHJhbnNmZXIuCi0gICAga0tleUNvbG9yTWF0cml4ICAgICAgPSAnY010eCcsIC8vIGludDMyX3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbG9yIE1hdHJpeCwgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuTWF0cml4Q29lZmZzLgotICAgIGtLZXlUZW1wb3JhbExheWVySWQgID0gJ2lMeXInLCAvLyBpbnQzMl90LCB0ZW1wb3JhbCBsYXllci1pZC4gMC1iYXNlZCAoMCA9PiBiYXNlIGxheWVyKQotICAgIGtLZXlUZW1wb3JhbExheWVyQ291bnQgPSAnY0x5cicsIC8vIGludDMyX3QsIG51bWJlciBvZiB0ZW1wb3JhbCBsYXllcnMgZW5jb2RlZAotCi0gICAga0tleVRpbGVXaWR0aCAgICAgICAgPSAndGlsVycsIC8vIGludDMyX3QsIEhFSUYgdGlsZSB3aWR0aAotICAgIGtLZXlUaWxlSGVpZ2h0ICAgICAgID0gJ3RpbEgnLCAvLyBpbnQzMl90LCBIRUlGIHRpbGUgaGVpZ2h0Ci0gICAga0tleUdyaWRSb3dzICAgICAgICAgPSAnZ3JkUicsIC8vIGludDMyX3QsIEhFSUYgZ3JpZCByb3dzCi0gICAga0tleUdyaWRDb2xzICAgICAgICAgPSAnZ3JkQycsIC8vIGludDMyX3QsIEhFSUYgZ3JpZCBjb2x1bW5zCi0gICAga0tleUljY1Byb2ZpbGUgICAgICAgPSAncHJvZicsIC8vIHJhdyBkYXRhLCBJQ0MgcHJvZmlsZSBkYXRhCi0gICAga0tleUlzUHJpbWFyeUltYWdlICAgPSAncHJpbScsIC8vIGJvb2wgKGludDMyX3QpLCBpbWFnZSB0cmFjayBpcyB0aGUgcHJpbWFyeSBpbWFnZQotICAgIGtLZXlGcmFtZUNvdW50ICAgICAgID0gJ25mcm0nLCAvLyBpbnQzMl90LCB0b3RhbCBudW1iZXIgb2YgZnJhbWUgaW4gdmlkZW8gdHJhY2sKLSAgICBrS2V5RXhpZk9mZnNldCAgICAgICA9ICdleG9mJywgLy8gaW50NjRfdCwgRXhpZiBkYXRhIG9mZnNldAotICAgIGtLZXlFeGlmU2l6ZSAgICAgICAgID0gJ2V4c3onLCAvLyBpbnQ2NF90LCBFeGlmIGRhdGEgc2l6ZQotICAgIGtLZXlJc0V4aWYgICAgICAgICAgID0gJ2V4aWYnLCAvLyBib29sIChpbnQzMl90KSBidWZmZXIgY29udGFpbnMgZXhpZiBkYXRhIGJsb2NrCi0KLSAgICBrS2V5UGNtQmlnRW5kaWFuICAgICA9ICdwY21iJywgLy8gYm9vbCAoaW50MzJfdCkKLQotICAgIC8vIEtleSBmb3IgQUxBQyBNYWdpYyBDb29raWUKLSAgICBrS2V5QWxhY01hZ2ljQ29va2llICA9ICdhbG1jJywgLy8gcmF3IGRhdGEKLX07Ci0KLWVudW0gewotICAgIGtUeXBlRVNEUyAgICAgICAgPSAnZXNkcycsCi0gICAga1R5cGVBVkNDICAgICAgICA9ICdhdmNjJywKLSAgICBrVHlwZUhWQ0MgICAgICAgID0gJ2h2Y2MnLAotICAgIGtUeXBlRDI2MyAgICAgICAgPSAnZDI2MycsCi19OwotCi1lbnVtIHsKLSAgICBrQ3J5cHRvTW9kZVVuZW5jcnlwdGVkID0gMCwKLSAgICBrQ3J5cHRvTW9kZUFlc0N0ciAgICAgID0gMSwKLSAgICBrQ3J5cHRvTW9kZUFlc0NiYyAgICAgID0gMiwKLX07Ci0KLWNsYXNzIFBhcmNlbDsKLQotY2xhc3MgTWV0YURhdGFCYXNlIHsKLXB1YmxpYzoKLSAgICBNZXRhRGF0YUJhc2UoKTsKLSAgICBNZXRhRGF0YUJhc2UoY29uc3QgTWV0YURhdGFCYXNlICZmcm9tKTsKLSAgICBNZXRhRGF0YUJhc2UmIG9wZXJhdG9yID0gKGNvbnN0IE1ldGFEYXRhQmFzZSAmKTsKLQotICAgIHZpcnR1YWwgfk1ldGFEYXRhQmFzZSgpOwotCi0gICAgZW51bSBUeXBlIHsKLSAgICAgICAgVFlQRV9OT05FICAgICA9ICdub25lJywKLSAgICAgICAgVFlQRV9DX1NUUklORyA9ICdjc3RyJywKLSAgICAgICAgVFlQRV9JTlQzMiAgICA9ICdpbjMyJywKLSAgICAgICAgVFlQRV9JTlQ2NCAgICA9ICdpbjY0JywKLSAgICAgICAgVFlQRV9GTE9BVCAgICA9ICdmbG9hJywKLSAgICAgICAgVFlQRV9QT0lOVEVSICA9ICdwdHIgJywKLSAgICAgICAgVFlQRV9SRUNUICAgICA9ICdyZWN0JywKLSAgICB9OwotCi0gICAgdm9pZCBjbGVhcigpOwotICAgIGJvb2wgcmVtb3ZlKHVpbnQzMl90IGtleSk7Ci0KLSAgICBib29sIHNldENTdHJpbmcodWludDMyX3Qga2V5LCBjb25zdCBjaGFyICp2YWx1ZSk7Ci0gICAgYm9vbCBzZXRJbnQzMih1aW50MzJfdCBrZXksIGludDMyX3QgdmFsdWUpOwotICAgIGJvb2wgc2V0SW50NjQodWludDMyX3Qga2V5LCBpbnQ2NF90IHZhbHVlKTsKLSAgICBib29sIHNldEZsb2F0KHVpbnQzMl90IGtleSwgZmxvYXQgdmFsdWUpOwotICAgIGJvb2wgc2V0UG9pbnRlcih1aW50MzJfdCBrZXksIHZvaWQgKnZhbHVlKTsKLQotICAgIGJvb2wgc2V0UmVjdCgKLSAgICAgICAgICAgIHVpbnQzMl90IGtleSwKLSAgICAgICAgICAgIGludDMyX3QgbGVmdCwgaW50MzJfdCB0b3AsCi0gICAgICAgICAgICBpbnQzMl90IHJpZ2h0LCBpbnQzMl90IGJvdHRvbSk7Ci0KLSAgICBib29sIGZpbmRDU3RyaW5nKHVpbnQzMl90IGtleSwgY29uc3QgY2hhciAqKnZhbHVlKSBjb25zdDsKLSAgICBib29sIGZpbmRJbnQzMih1aW50MzJfdCBrZXksIGludDMyX3QgKnZhbHVlKSBjb25zdDsKLSAgICBib29sIGZpbmRJbnQ2NCh1aW50MzJfdCBrZXksIGludDY0X3QgKnZhbHVlKSBjb25zdDsKLSAgICBib29sIGZpbmRGbG9hdCh1aW50MzJfdCBrZXksIGZsb2F0ICp2YWx1ZSkgY29uc3Q7Ci0gICAgYm9vbCBmaW5kUG9pbnRlcih1aW50MzJfdCBrZXksIHZvaWQgKip2YWx1ZSkgY29uc3Q7Ci0KLSAgICBib29sIGZpbmRSZWN0KAotICAgICAgICAgICAgdWludDMyX3Qga2V5LAotICAgICAgICAgICAgaW50MzJfdCAqbGVmdCwgaW50MzJfdCAqdG9wLAotICAgICAgICAgICAgaW50MzJfdCAqcmlnaHQsIGludDMyX3QgKmJvdHRvbSkgY29uc3Q7Ci0KLSAgICBib29sIHNldERhdGEodWludDMyX3Qga2V5LCB1aW50MzJfdCB0eXBlLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICBib29sIGZpbmREYXRhKHVpbnQzMl90IGtleSwgdWludDMyX3QgKnR5cGUsCi0gICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICoqZGF0YSwgc2l6ZV90ICpzaXplKSBjb25zdDsKLQotICAgIGJvb2wgaGFzRGF0YSh1aW50MzJfdCBrZXkpIGNvbnN0OwotCi0gICAgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0OwotICAgIHZvaWQgZHVtcFRvTG9nKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEJwTWVkaWFTb3VyY2U7Ci0gICAgZnJpZW5kIGNsYXNzIEJuTWVkaWFTb3VyY2U7Ci0gICAgZnJpZW5kIGNsYXNzIEJuTWVkaWFFeHRyYWN0b3I7Ci0gICAgZnJpZW5kIGNsYXNzIE1ldGFEYXRhOwotCi0gICAgc3RydWN0IHR5cGVkX2RhdGE7Ci0gICAgc3RydWN0IFJlY3Q7Ci0gICAgc3RydWN0IE1ldGFEYXRhSW50ZXJuYWw7Ci0gICAgTWV0YURhdGFJbnRlcm5hbCAqbUludGVybmFsRGF0YTsKLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAmcGFyY2VsKTsKLSAgICBzdGF0dXNfdCB1cGRhdGVGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVUQV9EQVRBX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwCmluZGV4IDBhMzQyYjguLjE1ZWE1NzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwCkBAIC0xLDIwICsxLDE3IEBACi0vLyBUT0RPOiBjaGFuZ2UgaXQgYmFjayB0byBjY19saWJyYXJ5X3NoYXJlZCB3aGVuIHRoZXJlIGlzIGEgd2F5IHRvCi0vLyBleHBvc2UgbWVkaWEgbWV0cmljcyBhcyBzdGFibGUgQVBJLgotY2NfbGlicmFyeSB7CitjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYm1lZGlhbWV0cmljcyIsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJJTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcCIsCiAgICAgICAgICJNZWRpYUFuYWx5dGljc0l0ZW0uY3BwIiwKKyAgICAgICAgIk1lZGlhTWV0cmljcy5jcHAiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKQEAgLTMyLDQgKzI5LDE0IEBACiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAorCisgICAgLy8gZW51bWVyYXRlIHN0YWJsZSBlbnRyeSBwb2ludHMsIGZvciBhcGV4IHVzZQorICAgIHN0dWJzOiB7CisgICAgICAgIHN5bWJvbF9maWxlOiAibGlibWVkaWFtZXRyaWNzLm1hcC50eHQiLAorICAgICAgICB2ZXJzaW9uczogWworICAgICAgICAgICAgIjEiICwKKyAgICAgICAgXQorICAgIH0sCiB9CisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCmluZGV4IDI4YTc3NDYuLjkxMTQ5MjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKQEAgLTE0Miw3ICsxNDIsNyBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYUFuYWx5dGljc1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKIAogICAgICAgICAgICAgYm9vbCBmb3JjZW5ldzsKLSAgICAgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW07CisgICAgICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSBNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZSgpOwogCiAgICAgICAgICAgICBkYXRhLnJlYWRCb29sKCZmb3JjZW5ldyk7CiAgICAgICAgICAgICBpdGVtLT5yZWFkRnJvbVBhcmNlbChkYXRhKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYUFuYWx5dGljc0l0ZW0uY3BwIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhQW5hbHl0aWNzSXRlbS5jcHAKaW5kZXggMTM1YzliNi4uMDJjMjNiMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhQW5hbHl0aWNzSXRlbS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhQW5hbHl0aWNzSXRlbS5jcHAKQEAgLTUyLDYgKzUyLDE3IEBACiBjb25zdCBjaGFyICogY29uc3QgTWVkaWFBbmFseXRpY3NJdGVtOjpFbmFibGVkUHJvcGVydHlQZXJzaXN0ICA9ICJwZXJzaXN0Lm1lZGlhLm1ldHJpY3MuZW5hYmxlZCI7CiBjb25zdCBpbnQgTWVkaWFBbmFseXRpY3NJdGVtOjpFbmFibGVkUHJvcGVydHlfZGVmYXVsdCAgPSAxOwogCisvLyBTbyBjYWxsZXIgZG9lc24ndCBuZWVkIHRvIGtub3cgc2l6ZSBvZiBhbGxvY2F0ZWQgc3BhY2UKK01lZGlhQW5hbHl0aWNzSXRlbSAqTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoKQoreworICAgIHJldHVybiBNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShrS2V5Tm9uZSk7Cit9CisKK01lZGlhQW5hbHl0aWNzSXRlbSAqTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoTWVkaWFBbmFseXRpY3NJdGVtOjpLZXkga2V5KQoreworICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa2V5KTsKKyAgICByZXR1cm4gaXRlbTsKK30KIAogLy8gYWNjZXNzIGZ1bmN0aW9ucyBmb3IgdGhlIGNsYXNzCiBNZWRpYUFuYWx5dGljc0l0ZW06Ok1lZGlhQW5hbHl0aWNzSXRlbSgpCkBAIC00NzgsNyArNDg5LDcgQEAKIC8vIGNhbGxlciByZXNwb25zaWJsZSBmb3IgdGhlIHJldHVybmVkIHN0cmluZwogYm9vbCBNZWRpYUFuYWx5dGljc0l0ZW06OmdldENTdHJpbmcoTWVkaWFBbmFseXRpY3NJdGVtOjpBdHRyIG5hbWUsIGNoYXIgKip2YWx1ZSkgewogICAgIFByb3AgKnByb3AgPSBmaW5kUHJvcChuYW1lKTsKLSAgICBpZiAocHJvcCA9PSBOVUxMIHx8IHByb3AtPm1UeXBlICE9IGtUeXBlRG91YmxlKSB7CisgICAgaWYgKHByb3AgPT0gTlVMTCB8fCBwcm9wLT5tVHlwZSAhPSBrVHlwZUNTdHJpbmcpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBpZiAodmFsdWUgIT0gTlVMTCkgewpAQCAtNDg3LDYgKzQ5OCwxOCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitib29sIE1lZGlhQW5hbHl0aWNzSXRlbTo6Z2V0U3RyaW5nKE1lZGlhQW5hbHl0aWNzSXRlbTo6QXR0ciBuYW1lLCBzdGQ6OnN0cmluZyAqdmFsdWUpIHsKKyAgICBQcm9wICpwcm9wID0gZmluZFByb3AobmFtZSk7CisgICAgaWYgKHByb3AgPT0gTlVMTCB8fCBwcm9wLT5tVHlwZSAhPSBrVHlwZUNTdHJpbmcpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAvLyBzdGQ6OnN0cmluZyBtYWtlcyBhIGNvcHkgZm9yIHVzCisgICAgICAgICp2YWx1ZSA9IHByb3AtPnUuQ1N0cmluZ1ZhbHVlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogLy8gcmVtb3ZlIGluZGljYXRlZCBrZXlzIGFuZCB0aGVpciB2YWx1ZXMKIC8vIHJldHVybiB2YWx1ZSBpcyAjIGtleXMgcmVtb3ZlZAogaW50MzJfdCBNZWRpYUFuYWx5dGljc0l0ZW06OmZpbHRlcihpbnQgbiwgTWVkaWFBbmFseXRpY3NJdGVtOjpBdHRyIGF0dHJzW10pIHsKQEAgLTYzMCw2ICs2NTMsMTkgQEAKIC8vCiAKIGludDMyX3QgTWVkaWFBbmFseXRpY3NJdGVtOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwmIGRhdGEpIHsKKyAgICBpbnQzMl90IHZlcnNpb24gPSBkYXRhLnJlYWRJbnQzMigpOworCisgICAgc3dpdGNoKHZlcnNpb24pIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgIHJldHVybiByZWFkRnJvbVBhcmNlbDAoZGF0YSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIE1lZGlhQW5hbHl0aWNzSXRlbSBQYXJjZWwgdmVyc2lvbjogJWQiLCB2ZXJzaW9uKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitpbnQzMl90IE1lZGlhQW5hbHl0aWNzSXRlbTo6cmVhZEZyb21QYXJjZWwwKGNvbnN0IFBhcmNlbCYgZGF0YSkgewogICAgIC8vIGludG8gJ3RoaXMnIG9iamVjdAogICAgIC8vIC4uIHdlIG1ha2UgYSBjb3B5IG9mIHRoZSBzdHJpbmcgdG8gcHV0IGF3YXkuCiAgICAgbUtleSA9IGRhdGEucmVhZENTdHJpbmcoKTsKQEAgLTY3OSw4ICs3MTUsMjMgQEAKIH0KIAogaW50MzJfdCBNZWRpYUFuYWx5dGljc0l0ZW06OndyaXRlVG9QYXJjZWwoUGFyY2VsICpkYXRhKSB7CisKICAgICBpZiAoZGF0YSA9PSBOVUxMKSByZXR1cm4gLTE7CiAKKyAgICBpbnQzMl90IHZlcnNpb24gPSAwOworICAgIGRhdGEtPndyaXRlSW50MzIodmVyc2lvbik7CisKKyAgICBzd2l0Y2godmVyc2lvbikgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgcmV0dXJuIHdyaXRlVG9QYXJjZWwwKGRhdGEpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBNZWRpYUFuYWx5dGljc0l0ZW0gUGFyY2VsIHZlcnNpb246ICVkIiwgdmVyc2lvbik7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworaW50MzJfdCBNZWRpYUFuYWx5dGljc0l0ZW06OndyaXRlVG9QYXJjZWwwKFBhcmNlbCAqZGF0YSkgewogCiAgICAgZGF0YS0+d3JpdGVDU3RyaW5nKG1LZXkuY19zdHIoKSk7CiAgICAgZGF0YS0+d3JpdGVJbnQzMihtUGlkKTsKQEAgLTcyNSw2ICs3NzYsMTQgQEAKICAgICByZXR1cm4gMDsKIH0KIAorY29uc3QgY2hhciAqTWVkaWFBbmFseXRpY3NJdGVtOjp0b0NTdHJpbmcoKSB7CisgICByZXR1cm4gdG9DU3RyaW5nKFBST1RPX0xBU1QpOworfQorCitjb25zdCBjaGFyICogTWVkaWFBbmFseXRpY3NJdGVtOjp0b0NTdHJpbmcoaW50IHZlcnNpb24pIHsKKyAgICBzdGQ6OnN0cmluZyB2YWwgPSB0b1N0cmluZyh2ZXJzaW9uKTsKKyAgICByZXR1cm4gc3RyZHVwKHZhbC5jX3N0cigpKTsKK30KIAogc3RkOjpzdHJpbmcgTWVkaWFBbmFseXRpY3NJdGVtOjp0b1N0cmluZygpIHsKICAgIHJldHVybiB0b1N0cmluZyhQUk9UT19MQVNUKTsKQEAgLTg1NSw4ICs5MTQsNiBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHAgPSB0aGlzLT50b1N0cmluZygpOwotICAgICAgICBBTE9HVygiVW5hYmxlIHRvIHJlY29yZDogJXMgW2ZvcmNlbmV3PSVkXSIsIHAuY19zdHIoKSwgZm9yY2VuZXcpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogfQpAQCAtMTAxNCw1ICsxMDcxLDE3MCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCisvLyBhIGJ5dGUgYXJyYXk7IGNvbnRlbnRzIGFyZQorLy8gb3ZlcmFsbCBsZW5ndGggKHVpbnQzMikgaW5jbHVkaW5nIHRoZSBsZW5ndGggZmllbGQgaXRzZWxmCisvLyBlbmNvZGluZyB2ZXJzaW9uICh1aW50MzIpCisvLyBjb3VudCBvZiBwcm9wZXJ0aWVzICh1aW50MzIpCisvLyBOIGNvcGllcyBvZjoKKy8vICAgICBwcm9wZXJ0eSBuYW1lIGFzIGxlbmd0aChpbnQxNiksIGJ5dGVzCisvLyAgICAgICAgIHRoZSBieXRlcyBXSUxMIGluY2x1ZGUgdGhlIG51bGwgdGVybWluYXRvciBvZiB0aGUgbmFtZQorLy8gICAgIHR5cGUgKHVpbnQ4IC0tIDEgYnl0ZSkKKy8vICAgICBzaXplIG9mIHZhbHVlIGZpZWxkIChpbnQxNiAtLSAyIGJ5dGVzKQorLy8gICAgIHZhbHVlIChzaXplIGJhc2VkIG9uIHR5cGUpCisvLyAgICAgICBpbnQzMiwgaW50NjQsIGRvdWJsZSAtLSBsaXR0bGUgZW5kaWFuIDQvOC84IGJ5dGVzIHJlc3BlY3RpdmVseQorLy8gICAgICAgY3N0cmluZyAtLSBOIGJ5dGVzIG9mIHZhbHVlIFtXSVRIIHRlcm1pbmF0b3JdCisKK2VudW0geyBrSW50MzIgPSAwLCBrSW50NjQsIGtEb3VibGUsIGtSYXRlLCBrQ1N0cmluZ307CisKK2Jvb2wgTWVkaWFBbmFseXRpY3NJdGVtOjpkdW1wQXR0cmlidXRlcyhjaGFyICoqcGJ1ZmZlciwgc2l6ZV90ICpwbGVuZ3RoKSB7CisKKyAgICBjaGFyICpidWlsZCA9IE5VTEw7CisKKyAgICBpZiAocGJ1ZmZlciA9PSBOVUxMIHx8IHBsZW5ndGggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gY29uc2lzdGVuY3kgZm9yIHRoZSBjYWxsZXIsIHdobyBvd25zIHdoYXRldmVyIGNvbWVzIGJhY2sgaW4gdGhpcyBwb2ludGVyLgorICAgICpwYnVmZmVyID0gTlVMTDsKKworICAgIC8vIGZpcnN0LCBsZXQncyBjYWxjdWxhdGUgc2l6ZXMKKyAgICBpbnQzMl90IGdvYWwgPSAwOworICAgIGludDMyX3QgdmVyc2lvbiA9IDA7CisKKyAgICBnb2FsICs9IHNpemVvZih1aW50MzJfdCk7ICAgLy8gb3ZlcmFsbCBsZW5ndGgsIGluY2x1ZGluZyB0aGUgbGVuZ3RoIGZpZWxkCisgICAgZ29hbCArPSBzaXplb2YodWludDMyX3QpOyAgIC8vIGVuY29kaW5nIHZlcnNpb24KKyAgICBnb2FsICs9IHNpemVvZih1aW50MzJfdCk7ICAgLy8gIyBwcm9wZXJ0aWVzCisKKyAgICBpbnQzMl90IGNvdW50ID0gbVByb3BDb3VudDsKKyAgICBmb3IgKGludCBpID0gMCA7IGkgPCBjb3VudDsgaSsrICkgeworICAgICAgICBQcm9wICpwcm9wID0gJm1Qcm9wc1tpXTsKKyAgICAgICAgZ29hbCArPSBzaXplb2YodWludDE2X3QpOyAgICAgICAgICAgLy8gbmFtZSBsZW5ndGgKKyAgICAgICAgZ29hbCArPSBzdHJsZW4ocHJvcC0+bU5hbWUpICsgMTsgICAgLy8gc3RyaW5nICsgbnVsbAorICAgICAgICBnb2FsICs9IHNpemVvZih1aW50OF90KTsgICAgICAgICAgICAvLyB0eXBlCisgICAgICAgIGdvYWwgKz0gc2l6ZW9mKHVpbnQxNl90KTsgICAgICAgICAgIC8vIHNpemUgb2YgdmFsdWUKKyAgICAgICAgc3dpdGNoIChwcm9wLT5tVHlwZSkgeworICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlSW50MzI6CisgICAgICAgICAgICAgICAgICAgIGdvYWwgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1lZGlhQW5hbHl0aWNzSXRlbTo6a1R5cGVJbnQ2NDoKKyAgICAgICAgICAgICAgICAgICAgZ29hbCArPSBzaXplb2YodWludDY0X3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZURvdWJsZToKKyAgICAgICAgICAgICAgICAgICAgZ29hbCArPSBzaXplb2YoZG91YmxlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1lZGlhQW5hbHl0aWNzSXRlbTo6a1R5cGVSYXRlOgorICAgICAgICAgICAgICAgICAgICBnb2FsICs9IDIgKiBzaXplb2YodWludDY0X3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZUNTdHJpbmc6CisgICAgICAgICAgICAgICAgICAgIC8vIGxlbmd0aCArIGFjdHVhbCBzdHJpbmcgKyBudWxsCisgICAgICAgICAgICAgICAgICAgIGdvYWwgKz0gc3RybGVuKHByb3AtPnUuQ1N0cmluZ1ZhbHVlKSArIDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZvdW5kIGJhZCBQcm9wIHR5cGU6ICVkLCBpZHggJWQsIG5hbWUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLT5tVHlwZSwgaSwgcHJvcC0+bU5hbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBub3cgdGhhdCB3ZSBoYXZlIGEgc2l6ZS4uLiBsZXQncyBhbGxvY2F0ZSBhbmQgZmlsbAorICAgIGJ1aWxkID0gKGNoYXIgKiltYWxsb2MoZ29hbCk7CisgICAgaWYgKGJ1aWxkID09IE5VTEwpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIG1lbXNldChidWlsZCwgMCwgZ29hbCk7CisKKyAgICBjaGFyICpmaWxsaW5nID0gYnVpbGQ7CisKKyNkZWZpbmUgX0lOU0VSVCh2YWwsIHNpemUpIFwKKyAgICB7IG1lbWNweShmaWxsaW5nLCAmKHZhbCksIChzaXplKSk7IGZpbGxpbmcgKz0gKHNpemUpO30KKyNkZWZpbmUgX0lOU0VSVFNUUklORyh2YWwsIHNpemUpIFwKKyAgICB7IG1lbWNweShmaWxsaW5nLCAodmFsKSwgKHNpemUpKTsgZmlsbGluZyArPSAoc2l6ZSk7fQorCisgICAgX0lOU0VSVChnb2FsLCBzaXplb2YoaW50MzJfdCkpOworICAgIF9JTlNFUlQodmVyc2lvbiwgc2l6ZW9mKGludDMyX3QpKTsKKyAgICBfSU5TRVJUKGNvdW50LCBzaXplb2YoaW50MzJfdCkpOworCisgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgY291bnQ7IGkrKyApIHsKKyAgICAgICAgUHJvcCAqcHJvcCA9ICZtUHJvcHNbaV07CisgICAgICAgIGludDE2X3QgYXR0ck5hbWVMZW4gPSBzdHJsZW4ocHJvcC0+bU5hbWUpICsgMTsKKyAgICAgICAgX0lOU0VSVChhdHRyTmFtZUxlbiwgc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgX0lOU0VSVFNUUklORyhwcm9wLT5tTmFtZSwgYXR0ck5hbWVMZW4pOyAgICAvLyB0ZXJtaW5hdGlvbiBpbmNsdWRlZAorICAgICAgICBpbnQ4X3QgZWxlbXR5cGU7CisgICAgICAgIGludDE2X3QgZWxlbXNpemU7CisgICAgICAgIHN3aXRjaCAocHJvcC0+bVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZUludDMyOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZWxlbXR5cGUgPSBrSW50MzI7CisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQoZWxlbXR5cGUsIHNpemVvZihpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxlbXNpemUgPSBzaXplb2YoaW50MzJfdCk7CisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQoZWxlbXNpemUsIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChwcm9wLT51LmludDMyVmFsdWUsIHNpemVvZihpbnQzMl90KSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZUludDY0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZWxlbXR5cGUgPSBrSW50NjQ7CisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQoZWxlbXR5cGUsIHNpemVvZihpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxlbXNpemUgPSBzaXplb2YoaW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQoZWxlbXNpemUsIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChwcm9wLT51LmludDY0VmFsdWUsIHNpemVvZihpbnQ2NF90KSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZURvdWJsZToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVsZW10eXBlID0ga0RvdWJsZTsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtdHlwZSwgc2l6ZW9mKGludDhfdCkpOworICAgICAgICAgICAgICAgICAgICBlbGVtc2l6ZSA9IHNpemVvZihkb3VibGUpOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKGVsZW1zaXplLCBzaXplb2YoaW50MTZfdCkpOworCisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQocHJvcC0+dS5kb3VibGVWYWx1ZSwgc2l6ZW9mKGRvdWJsZSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1lZGlhQW5hbHl0aWNzSXRlbTo6a1R5cGVSYXRlOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZWxlbXR5cGUgPSBrUmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtdHlwZSwgc2l6ZW9mKGludDhfdCkpOworICAgICAgICAgICAgICAgICAgICBlbGVtc2l6ZSA9IDIgKiBzaXplb2YodWludDY0X3QpOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKGVsZW1zaXplLCBzaXplb2YoaW50MTZfdCkpOworCisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQocHJvcC0+dS5yYXRlLmNvdW50LCBzaXplb2YodWludDY0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChwcm9wLT51LnJhdGUuZHVyYXRpb24sIHNpemVvZih1aW50NjRfdCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1lZGlhQW5hbHl0aWNzSXRlbTo6a1R5cGVDU3RyaW5nOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZWxlbXR5cGUgPSBrQ1N0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtdHlwZSwgc2l6ZW9mKGludDhfdCkpOworICAgICAgICAgICAgICAgICAgICBlbGVtc2l6ZSA9IHN0cmxlbihwcm9wLT51LkNTdHJpbmdWYWx1ZSkgKyAxOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKGVsZW1zaXplLCBzaXplb2YoaW50MTZfdCkpOworCisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlRTVFJJTkcocHJvcC0+dS5DU3RyaW5nVmFsdWUsIGVsZW1zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3IgaWYgY2FuJ3QgZW5jb2RlOyB3YXJuaW5nIGlmIGNhbid0IGRlY29kZQorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZm91bmQgYmFkIFByb3AgdHlwZTogJWQsIGlkeCAlZCwgbmFtZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AtPm1UeXBlLCBpLCBwcm9wLT5tTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkbmVzczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChidWlsZCArIGdvYWwgIT0gZmlsbGluZykgeworICAgICAgICBBTE9HRSgicHJvYmxlbXMgcG9wdWxhdGluZzsgd3JvdGU9JWQgcGxhbm5lZD0lZCIsCisgICAgICAgICAgICAgIChpbnQpKGZpbGxpbmctYnVpbGQpLCBnb2FsKTsKKyAgICAgICAgZ290byBiYWRuZXNzOworICAgIH0KKworICAgICpwYnVmZmVyID0gYnVpbGQ7CisgICAgKnBsZW5ndGggPSBnb2FsOworCisgICAgcmV0dXJuIHRydWU7CisKKyAgYmFkbmVzczoKKyAgICBmcmVlKGJ1aWxkKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhTWV0cmljcy5jcHAgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTA5MTkwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhTWV0cmljcy5jcHAKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk1lZGlhTWV0cmljcyIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldHJpY3MuaD4KKworLy8KKy8vIHByb3ZpZGUgYSBDLWlzaCBpbnRlcmZhY2UgdGhhdCBpcyBlYXNpZXIgdG8gc3RhYmlsaXplIHRoYW4gdGhlIGV4aXN0aW5nIEMrKworLy8gaW50ZXJmYWNlCisvLworLy8gQUxMIGZ1bmN0aW9ucyByZXR1cm5pbmcgYSBjaGFyICogZ2l2ZSByZXNwb25zaWJpbGl0eSBmb3IgdGhlIGFsbG9jYXRlZCBidWZmZXIKKy8vIHRvIHRoZSBjYWxsZXIuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgdG8gY2FsbCBmcmVlKCkgb24gdGhhdCBwb2ludGVyLgorLy8KKworLy8gbWFuYWdlIHRoZSBvdmVyYWxsIHJlY29yZAorbWVkaWFtZXRyaWNzX2hhbmRsZV90IG1lZGlhbWV0cmljc19jcmVhdGUobWVkaWFtZXRyaWNza2V5X3Qga2V5KSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoa2V5KTsKKyAgICByZXR1cm4gKG1lZGlhbWV0cmljc19oYW5kbGVfdCkgaXRlbTsKK30KKwordm9pZCBtZWRpYW1ldHJpY3NfZGVsZXRlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm47CisgICAgZGVsZXRlIGl0ZW07Cit9CisKK21lZGlhbWV0cmljc2tleV90IG1lZGlhbWV0cmljc19nZXRLZXkobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIHJldHVybiBzdHJkdXAoaXRlbS0+Z2V0S2V5KCkuY19zdHIoKSk7Cit9CisKKy8vIG51cGxheWVyLCBldCBhbCB1c2UgaXQgd2hlbiBhY3RpbmcgYXMgcHJveGllcwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0VWlkKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIHVpZF90IHVpZCkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPnNldFVpZCh1aWQpOworfQorCisvLyBzZXQgYXR0cmlidXRlcworLy8KKwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5zZXRJbnQzMihhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldEludDY0KG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgaXRlbS0+c2V0SW50NjQoYXR0ciwgdmFsdWUpOworfQorCit2b2lkIG1lZGlhbWV0cmljc19zZXREb3VibGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5zZXREb3VibGUoYXR0ciwgdmFsdWUpOworfQorCit2b2lkIG1lZGlhbWV0cmljc19zZXRSYXRlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY291bnQsIGludDY0X3QgZHVyYXRpb24pIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5zZXRSYXRlKGF0dHIsIGNvdW50LCBkdXJhdGlvbik7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPnNldENTdHJpbmcoYXR0ciwgdmFsdWUpOworfQorCisvLyBmdXNlZCBnZXQvYWRkL3NldDsgaWYgYXR0ciB3YXNuJ3QgdGhlcmUsIGl0J3MgYSBzaW1wbGUgc2V0LgorLy8KKwordm9pZCBtZWRpYW1ldHJpY3NfYWRkSW50MzIobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5hZGRJbnQzMihhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZEludDY0KG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgaXRlbS0+YWRkSW50NjQoYXR0ciwgdmFsdWUpOworfQorCit2b2lkIG1lZGlhbWV0cmljc19hZGREb3VibGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5hZGREb3VibGUoYXR0ciwgdmFsdWUpOworfQorCit2b2lkIG1lZGlhbWV0cmljc19hZGRSYXRlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY291bnQsIGludDY0X3QgZHVyYXRpb24pIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5hZGRSYXRlKGF0dHIsIGNvdW50LCBkdXJhdGlvbik7Cit9CisKKy8vIGZpbmQgJiBleHRyYWN0IHZhbHVlcworLy8gcmV0dXJuIGluZGljYXRlcyB3aGV0aGVyIGF0dHIgZXhpc3RzIChhbmQgdGh1cyB3aGV0aGVyIHZhbHVlIGZpbGxlZCBpbikKKy8vIE5VTEwgcGFyYW1ldGVyIHZhbHVlIHN1cHByZXNzZXMgc3RvcmFnZSBvZiB2YWx1ZS4KKy8vCisKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldEludDMyKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICogdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGl0ZW0tPmdldEludDMyKGF0dHIsIHZhbHVlKTsKK30KKworYm9vbCBtZWRpYW1ldHJpY3NfZ2V0SW50NjQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKiB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gaXRlbS0+Z2V0SW50NjQoYXR0ciwgdmFsdWUpOworfQorCitib29sIG1lZGlhbWV0cmljc19nZXREb3VibGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgKnZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBpdGVtLT5nZXREb3VibGUoYXR0ciwgdmFsdWUpOworfQorCitib29sIG1lZGlhbWV0cmljc19nZXRSYXRlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKiBjb3VudCwgaW50NjRfdCAqIGR1cmF0aW9uLCBkb3VibGUgKnJhdGUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGl0ZW0tPmdldFJhdGUoYXR0ciwgY291bnQsIGR1cmF0aW9uLCByYXRlKTsKK30KKworLy8gTkI6IGNhbGxlciBvd25zIHRoZSBzdHJpbmcgdGhhdCBjb21lcyBiYWNrLCBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyBpdAorYm9vbCBtZWRpYW1ldHJpY3NfZ2V0Q1N0cmluZyhtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKip2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBpdGVtLT5nZXRDU3RyaW5nKGF0dHIsIHZhbHVlKTsKK30KKworLy8gdG8gcmVsZWFzZSBzdHJpbmdzIHJldHVybmVkIHZpYSBnZXRDU3RyaW5nKCkKK3ZvaWQgbWVkaWFtZXRyaWNzX2ZyZWVDU3RyaW5nKGNoYXIgKnZhbHVlKSB7CisgICAgZnJlZSh2YWx1ZSk7Cit9CisKK2Jvb2wgbWVkaWFtZXRyaWNzX3NlbGZSZWNvcmQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gaXRlbS0+c2VsZnJlY29yZCgpOworfQorCisKK2NvbnN0IGNoYXIgKm1lZGlhbWV0cmljc19yZWFkYWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuICIiOworICAgIHJldHVybiBpdGVtLT50b0NTdHJpbmcoKTsKK30KKworaW50MzJfdCBtZWRpYW1ldHJpY3NfY291bnQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiAwOworICAgIHJldHVybiBpdGVtLT5jb3VudCgpOworfQorCitib29sIG1lZGlhbWV0cmljc19pc0VuYWJsZWQoKSB7CisgICAgLy8gc3RhdGljLCBzbyBkb2Vzbid0IG5lZWQgYW4gaW5zdGFuY2UKKyAgICByZXR1cm4gYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtOjppc0VuYWJsZWQoKTsKK30KKworYm9vbCBtZWRpYW1ldHJpY3NfZ2V0QXR0cmlidXRlcyhtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBjaGFyICoqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gaXRlbS0+ZHVtcEF0dHJpYnV0ZXMoYnVmZmVyLCBsZW5ndGgpOworCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYUFuYWx5dGljc0l0ZW0uaCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhQW5hbHl0aWNzSXRlbS5oCmluZGV4IDI2M2NkZTcuLjRhMzZmNmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhQW5hbHl0aWNzSXRlbS5oCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhQW5hbHl0aWNzSXRlbS5oCkBAIC0xNyw5ICsxNywxMCBAQAogI2lmbmRlZiBBTkRST0lEX01FRElBX01FRElBQU5BTFlUSUNTSVRFTV9ICiAjZGVmaW5lIEFORFJPSURfTUVESUFfTUVESUFBTkFMWVRJQ1NJVEVNX0gKIAotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KQEAgLTgxLDEyICs4MiwxOSBAQAogICAgICAgICAgICAgUFJPVE9fTEFTVCA9IFBST1RPX1YxLAogICAgICAgICB9OwogCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gdXNlIHRoZSA6OmNyZWF0ZSgpIG1ldGhvZCBpbnN0ZWFkCisgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSgpOworICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0oS2V5KTsKKyAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtKGNvbnN0IE1lZGlhQW5hbHl0aWNzSXRlbSYpOworICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gJm9wZXJhdG9yPShjb25zdCBNZWRpYUFuYWx5dGljc0l0ZW0mKTsKIAogICAgIHB1YmxpYzoKIAorICAgICAgICBzdGF0aWMgTWVkaWFBbmFseXRpY3NJdGVtKiBjcmVhdGUoS2V5IGtleSk7CisgICAgICAgIHN0YXRpYyBNZWRpYUFuYWx5dGljc0l0ZW0qIGNyZWF0ZSgpOworCiAgICAgICAgIC8vIGFjY2VzcyBmdW5jdGlvbnMgZm9yIHRoZSBjbGFzcwotICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0oKTsKLSAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtKEtleSk7CiAgICAgICAgIH5NZWRpYUFuYWx5dGljc0l0ZW0oKTsKIAogICAgICAgICAvLyBTZXNzaW9uSUQgdGllcyBtdWx0aXBsZSBzdWJtaXNzaW9ucyBmb3Igc2FtZSBrZXkgdG9nZXRoZXIKQEAgLTEzNCw2ICsxNDIsNyBAQAogICAgICAgICBib29sIGdldFJhdGUoQXR0ciwgaW50NjRfdCAqY291bnQsIGludDY0X3QgKmR1cmF0aW9uLCBkb3VibGUgKnJhdGUpOwogICAgICAgICAvLyBDYWxsZXIgb3ducyB0aGUgcmV0dXJuZWQgc3RyaW5nCiAgICAgICAgIGJvb2wgZ2V0Q1N0cmluZyhBdHRyLCBjaGFyICoqdmFsdWUpOworICAgICAgICBib29sIGdldFN0cmluZyhBdHRyLCBzdGQ6OnN0cmluZyAqdmFsdWUpOwogCiAgICAgICAgIC8vIHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlciB0byBjbG9zZSBhbnkgZXhpc3Rpbmcgb3BlbgogICAgICAgICAvLyByZWNvcmQgd2l0aCBzYW1lIGtleSBiZWZvcmUgZXN0YWJsaXNoaW5nIGEgbmV3IHJlY29yZApAQCAtMTc0LDEyICsxODMsMjIgQEAKICAgICAgICAgaW50MzJfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqKTsKICAgICAgICAgaW50MzJfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwmKTsKIAorICAgICAgICAvLyBzdXBwb3J0cyB0aGUgc3RhYmxlIGludGVyZmFjZQorICAgICAgICBib29sIGR1bXBBdHRyaWJ1dGVzKGNoYXIgKipwYnVmZmVyLCBzaXplX3QgKnBsZW5ndGgpOworCiAgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCk7CiAgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGludCB2ZXJzaW9uKTsKKyAgICAgICAgY29uc3QgY2hhciAqdG9DU3RyaW5nKCk7CisgICAgICAgIGNvbnN0IGNoYXIgKnRvQ1N0cmluZyhpbnQgdmVyc2lvbik7CiAKICAgICAgICAgLy8gYXJlIHdlIGNvbGxlY3RpbmcgYW5hbHl0aWNzIGRhdGEKICAgICAgICAgc3RhdGljIGJvb2wgaXNFbmFibGVkKCk7CiAKKyAgICBwcml2YXRlOgorICAgICAgICAvLyBoYW5kbGUgUGFyY2VsIHZlcnNpb24gMAorICAgICAgICBpbnQzMl90IHdyaXRlVG9QYXJjZWwwKFBhcmNlbCAqKTsKKyAgICAgICAgaW50MzJfdCByZWFkRnJvbVBhcmNlbDAoY29uc3QgUGFyY2VsJik7CisKICAgICBwcm90ZWN0ZWQ6CiAKICAgICAgICAgLy8gbWVyZ2UgZmllbGRzIGZyb20gYXJnIGludG8gdGhpcwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFNZXRyaWNzLmggYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYU1ldHJpY3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGUxZWQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFNZXRyaWNzLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9NRURJQU1FVFJJQ1NfSAorI2RlZmluZSBBTkRST0lEX01FRElBX01FRElBTUVUUklDU19ICisKKy8vCisvLyBkZWZpbmUgYSBDIGludGVyZmFjZSB0byB0aGUgbWVkaWEgbWV0cmljcyBmdW5jdGlvbmFsaXR5CisvLworLy8gQWxsIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBhIGNoYXIgKiBvciBjb25zdCBjaGFyICogYWxzbyBnaXZlIHJlc3BvbnNpYmlsaXR5CisvLyBmb3IgdGhhdCBzdHJpbmcgdG8gdGhlIGNhbGxlci4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBmcmVlKCkKKy8vIG9uIHRoYXQgcG9pbnRlciB3aGVuIGRvbmUgdXNpbmcgdGhlIHZhbHVlLgorCitfX0JFR0lOX0RFQ0xTCisKKy8vIGludGVybmFsbHkgcmUtY2FzdCB0byB0aGUgYmVoaW5kLXRoZS1zY2VuZXMgQysrIGNsYXNzIGluc3RhbmNlCit0eXBlZGVmIGludDY0X3QgbWVkaWFtZXRyaWNzX2hhbmRsZV90OwordHlwZWRlZiBjb25zdCBjaGFyICptZWRpYW1ldHJpY3NrZXlfdDsKK3R5cGVkZWYgY29uc3QgY2hhciAqYXR0cl90OworCittZWRpYW1ldHJpY3NfaGFuZGxlX3QgbWVkaWFtZXRyaWNzX2NyZWF0ZShtZWRpYW1ldHJpY3NrZXlfdCBrZXkpOwordm9pZCBtZWRpYW1ldHJpY3NfZGVsZXRlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpOworCittZWRpYW1ldHJpY3NrZXlfdCBtZWRpYW1ldHJpY3NfZ2V0S2V5KG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpOworCisKKy8vIHNldAordm9pZCBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldEludDY0KG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB2YWx1ZSk7Cit2b2lkIG1lZGlhbWV0cmljc19zZXREb3VibGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbHVlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY291bnQsIGludDY0X3QgZHVyYXRpb24pOwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogdmFsdWUpOworCisvLyBmdXNlZCBnZXQvYWRkL3NldDsgaWYgYXR0ciB3YXNuJ3QgdGhlcmUsIGl0J3MgYSBzaW1wbGUgc2V0LgorLy8gdGhlc2UgZG8gbm90IHByb3ZpZGUgYXRvbWljaXR5IG9yIG11dHVhbCBleGNsdXNpb24sIG9ubHkgc2ltcGxlciBjb2RlIHNlcXVlbmNlcy4KK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZEludDMyKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSk7Cit2b2lkIG1lZGlhbWV0cmljc19hZGRJbnQ2NChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWUpOwordm9pZCBtZWRpYW1ldHJpY3NfYWRkRG91YmxlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSk7Cit2b2lkIG1lZGlhbWV0cmljc19hZGRSYXRlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGNvdW50LCBpbnQ2NF90IGR1cmF0aW9uKTsKKworLy8gZmluZCAmIGV4dHJhY3QgdmFsdWVzCisvLyByZXR1cm4gaW5kaWNhdGVzIHdoZXRoZXIgYXR0ciBleGlzdHMgKGFuZCB0aHVzIHdoZXRoZXIgdmFsdWUgZmlsbGVkIGluKQorLy8gTlVMTCBwYXJhbWV0ZXIgdmFsdWUgc3VwcHJlc3NlcyBzdG9yYWdlIG9mIHZhbHVlLgorYm9vbCBtZWRpYW1ldHJpY3NfZ2V0SW50MzIobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICogdmFsdWUpOworYm9vbCBtZWRpYW1ldHJpY3NfZ2V0SW50NjQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICogdmFsdWUpOworYm9vbCBtZWRpYW1ldHJpY3NfZ2V0RG91YmxlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqdmFsdWUpOworYm9vbCBtZWRpYW1ldHJpY3NfZ2V0UmF0ZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqIGNvdW50LCBpbnQ2NF90ICogZHVyYXRpb24sIGRvdWJsZSAqcmF0ZSk7Citib29sIG1lZGlhbWV0cmljc19nZXRDU3RyaW5nKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKip2YWx1ZSk7CisvLyB0byByZWxlYXNlIHN0cmluZ3MgcmV0dXJuZWQgdmlhIGdldENTdHJpbmcoKQordm9pZCBtZWRpYW1ldHJpY3NfZnJlZUNTdHJpbmcoY2hhciAqdmFsdWUpOworCisvLyAjIG9mIGF0dHJpYnV0ZXMgc2V0IHdpdGhpbiB0aGlzIHJlY29yZC4KK2ludDMyX3QgbWVkaWFtZXRyaWNzX2NvdW50KG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpOworCitib29sIG1lZGlhbWV0cmljc19zZWxmUmVjb3JkKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpOworCitjb25zdCBjaGFyICptZWRpYW1ldHJpY3NfcmVhZGFibGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSk7Cit2b2lkIG1lZGlhbWV0cmljc19zZXRVaWQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgdWlkX3QgdWlkKTsKK2Jvb2wgbWVkaWFtZXRyaWNzX2lzRW5hYmxlZCgpOworCisvLyBzZXJpYWxpemVkIGNvcHkgb2YgdGhlIGF0dHJpYnV0ZXMvdmFsdWVzLCBtb3N0bHkgZm9yIHVwc3RyZWFtIGdldE1ldHJpY3MoKSBjYWxscworLy8gY2FsbGVyIG93bnMgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgYXMgcGFydCBvZiB0aGlzIGNhbGwuCitib29sIG1lZGlhbWV0cmljc19nZXRBdHRyaWJ1dGVzKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGNoYXIgKipidWZmZXIsIHNpemVfdCAqbGVuZ3RoKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvbGlibWVkaWFtZXRyaWNzLm1hcC50eHQgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvbGlibWVkaWFtZXRyaWNzLm1hcC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ2MjgxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9saWJtZWRpYW1ldHJpY3MubWFwLnR4dApAQCAtMCwwICsxLDI5IEBACitMSUJNRURJQU1FVFJJQ1NfMSB7CisgIGdsb2JhbDoKKyAgICBtZWRpYW1ldHJpY3NfYWRkRG91YmxlOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfYWRkSW50MzI7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19hZGRJbnQ2NDsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2FkZFJhdGU7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19jb3VudDsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2NyZWF0ZTsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2RlbGV0ZTsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2ZyZWVDU3RyaW5nOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfZ2V0QXR0cmlidXRlczsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2dldENTdHJpbmc7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19nZXREb3VibGU7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19nZXRJbnQzMjsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2dldEludDY0OyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfZ2V0S2V5OyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfZ2V0UmF0ZTsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2lzRW5hYmxlZDsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX3JlYWRhYmxlOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3Nfc2VsZlJlY29yZDsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmc7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19zZXREb3VibGU7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMjsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX3NldEludDY0OyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3Nfc2V0UmF0ZTsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX3NldFVpZDsgIyBhcGV4CisgIGxvY2FsOgorICAgICo7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvQW5kcm9pZC5icAppbmRleCBjZDI3YmQxLi4wODUxOWNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvQW5kcm9pZC5icApAQCAtNCwxMSArNCwxMCBAQAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQogCi1jY19saWJyYXJ5IHsKK2NjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlibWVkaWFwbGF5ZXIyIiwKIAogICAgIHNyY3M6IFsKLSAgICAgICAgIkpBdWRpb1RyYWNrLmNwcCIsCiAgICAgICAgICJNZWRpYVBsYXllcjJBdWRpb091dHB1dC5jcHAiLAogICAgICAgICAibWVkaWFwbGF5ZXIyLmNwcCIsCiAgICAgXSwKQEAgLTE3LDI2ICsxNiwyMyBAQAogICAgICAgICAibGliYW5kcm9pZF9ydW50aW1lIiwKICAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKICAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhX29teCIsCi0gICAgICAgICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAKICAgICAgICAgImxpYmNyeXB0byIsCi0gICAgICAgICJsaWJtZWRpYWRybSIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlibWVkaWFuZGtfdXRpbHMiLAogICAgICAgICAibGlibWVkaWF1dGlscyIsCiAgICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCiAgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAogICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3BsYXllcjIiLAogICAgIF0sCiAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCkBAIC00OSwxMSArNDUsMjEgQEAKICAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKICAgICBdLAogCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkiLAorICAgIF0sCisKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYm1lZGlhcGxheWVyMi1wcm90b3MiLAorICAgICAgICAibGlibWVkaWFfcGxheWVyMl91dGlsIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fd2l0aG91dF9pbWVtb3J5IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X251cGxheWVyMiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9wbGF5ZXIyIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3J0c3AiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dDIiLAorICAgICAgICAibGlibWVkaWEyX2puaV9jb3JlIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwpAQCAtNzQsMyArODAsNDkgQEAKICAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCiB9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJtZWRpYTJfam5pX2NvcmUiLAorCisgICAgc3JjczogWworICAgICAgICAiSmF2YVZNSGVscGVyLmNwcCIsCisgICAgICAgICJKQXVkaW9UcmFjay5jcHAiLAorICAgICAgICAiSk1lZGlhMkhUVFBTZXJ2aWNlLmNwcCIsCisgICAgICAgICJKTWVkaWEySFRUUENvbm5lY3Rpb24uY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlcl9oZWFkZXJzIiwKKyAgICAgICAgImxpYm5hdGl2ZWhlbHBlcl9oZWFkZXJfb25seSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliZGwiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWEvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suY3BwCmluZGV4IGFjMGNjNTcuLmZhYjZjNjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmNwcApAQCAtMjEsMjcgKzIxLDI4IEBACiAjaW5jbHVkZSAibWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkX21lZGlhX0F1ZGlvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIFRPRE86IFN0b3JlIEphdmEgY2xhc3MvbWV0aG9kSUQgYXMgYSBtZW1iZXIgdmFyaWFibGUgaW4gdGhlIGNsYXNzLgogLy8gVE9ETzogQWRkIE5VTEwgJiYgRXhjZXB0aW9uIGNoZWNrcyBhZnRlciBldmVyeSBKTkkgY2FsbC4KIEpBdWRpb1RyYWNrOjpKQXVkaW9UcmFjayggICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwgVXNhZ2VzIG9mIHRoZSBhcmd1bWVudHMgYXJlIGJlbG93ID4KLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLCAgICAgICAgICAgICAgIC8vIEF1ZGlvQXVkaW9BdHRyaWJ1dGVzCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb0Zvcm1hdCAmJiBidWZmZXJTaXplSW5CeXRlcwogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9Gb3JtYXQgJiYgYnVmZmVyU2l6ZUluQnl0ZXMKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssICAgICAgICAgICAgIC8vIEF1ZGlvRm9ybWF0ICYmIGJ1ZmZlclNpemVJbkJ5dGVzCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPZmZsb2FkCiAgICAgICAgIHZvaWQqIHVzZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPZmZsb2FkCiAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXJTaXplSW5CeXRlcwotICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9UcmFjawotICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzLCAgICAgICAgLy8gQXVkaW9BdHRyaWJ1dGVzCisgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb1RyYWNrCisgICAgICAgIGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcywgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb0F0dHJpYnV0ZXMKICAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCkgeyAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlclNpemVJbkJ5dGVzCiAKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisKICAgICBqY2xhc3MgakF1ZGlvVHJhY2tDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrIik7Ci0gICAgbUF1ZGlvVHJhY2tDbHMgPSAoamNsYXNzKSBlbnYtPk5ld0dsb2JhbFJlZihqQXVkaW9UcmFja0Nscyk7CisgICAgbUF1ZGlvVHJhY2tDbHMgPSByZWludGVycHJldF9jYXN0PGpjbGFzcz4oZW52LT5OZXdHbG9iYWxSZWYoakF1ZGlvVHJhY2tDbHMpKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGpBdWRpb1RyYWNrQ2xzKTsKIAogICAgIG1heFJlcXVpcmVkU3BlZWQgPSBzdGQ6Om1pbihzdGQ6Om1heChtYXhSZXF1aXJlZFNwZWVkLCAxLjBmKSwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUFYKTsKIApAQCAtNjQsMTAgKzY1LDE5IEBACiAgICAgam1ldGhvZElEIGpCdWlsZGVyQ3RvciA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICI8aW5pdD4iLCAiKClWIik7CiAgICAgam9iamVjdCBqQnVpbGRlck9iaiA9IGVudi0+TmV3T2JqZWN0KGpCdWlsZGVyQ2xzLCBqQnVpbGRlckN0b3IpOwogCi0gICAgam1ldGhvZElEIGpTZXRBdWRpb0F0dHJpYnV0ZXMgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0QXVkaW9BdHRyaWJ1dGVzIiwKLSAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzOylMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrJEJ1aWxkZXI7Iik7Ci0gICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpTZXRBdWRpb0F0dHJpYnV0ZXMsCi0gICAgICAgICAgICBKQXVkaW9BdHRyaWJ1dGVzOjpjcmVhdGVBdWRpb0F0dHJpYnV0ZXNPYmooZW52LCBwQXR0cmlidXRlcywgc3RyZWFtVHlwZSkpOworICAgIHsKKyAgICAgICAgc3A8Sk9iamVjdEhvbGRlcj4gYXVkaW9BdHRyaWJ1dGVzT2JqOworICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBhdWRpb0F0dHJpYnV0ZXNPYmogPSBuZXcgSk9iamVjdEhvbGRlcihhdHRyaWJ1dGVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF1ZGlvQXR0cmlidXRlc09iaiA9IG5ldyBKT2JqZWN0SG9sZGVyKAorICAgICAgICAgICAgICAgICAgICBKQXVkaW9BdHRyaWJ1dGVzOjpjcmVhdGVBdWRpb0F0dHJpYnV0ZXNPYmooZW52LCBOVUxMKSk7CisgICAgICAgIH0KKyAgICAgICAgam1ldGhvZElEIGpTZXRBdWRpb0F0dHJpYnV0ZXMgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0QXVkaW9BdHRyaWJ1dGVzIiwKKyAgICAgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlczspTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjayRCdWlsZGVyOyIpOworICAgICAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwKKyAgICAgICAgICAgICAgICBqU2V0QXVkaW9BdHRyaWJ1dGVzLCBhdWRpb0F0dHJpYnV0ZXNPYmotPmdldEpPYmplY3QoKSk7CisgICAgfQogCiAgICAgam1ldGhvZElEIGpTZXRBdWRpb0Zvcm1hdCA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRBdWRpb0Zvcm1hdCIsCiAgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL0F1ZGlvRm9ybWF0OylMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrJEJ1aWxkZXI7Iik7CkBAIC05Miw2ICsxMDIsNyBAQAogICAgICAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgalNldFNlc3Npb25JZCwgc2Vzc2lvbklkKTsKICAgICB9CiAKKyAgICBtRmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOwogICAgIGlmIChjYmYgIT0gTlVMTCkgewogICAgICAgICBqbWV0aG9kSUQgalNldE9mZmxvYWRlZFBsYXliYWNrID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldE9mZmxvYWRlZFBsYXliYWNrIiwKICAgICAgICAgICAgICAgICAiKFopTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjayRCdWlsZGVyOyIpOwpAQCAtMTAwLDcgKzExMSw5IEBACiAgICAgfQogCiAgICAgam1ldGhvZElEIGpCdWlsZCA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJidWlsZCIsICIoKUxhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2s7Iik7Ci0gICAgbUF1ZGlvVHJhY2tPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpCdWlsZCk7CisgICAgam9iamVjdCBqQXVkaW9UcmFja09iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgakJ1aWxkKTsKKyAgICBtQXVkaW9UcmFja09iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8am9iamVjdD4oZW52LT5OZXdHbG9iYWxSZWYoakF1ZGlvVHJhY2tPYmopKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGpCdWlsZGVyT2JqKTsKIAogICAgIGlmIChjYmYgIT0gTlVMTCkgewogICAgICAgICAvLyBTZXQgb2ZmbG9hZCBtb2RlIGNhbGxiYWNrCkBAIC0xMTYsMTkgKzEyOSwyMCBAQAogfQogCiBKQXVkaW9UcmFjazo6fkpBdWRpb1RyYWNrKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQXVkaW9UcmFja0Nscyk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUF1ZGlvVHJhY2tPYmopOwogfQogCiBzaXplX3QgSkF1ZGlvVHJhY2s6OmZyYW1lQ291bnQoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0QnVmZmVyU2l6ZUluRnJhbWVzID0gZW52LT5HZXRNZXRob2RJRCgKICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2xzLCAiZ2V0QnVmZmVyU2l6ZUluRnJhbWVzIiwgIigpSSIpOwogICAgIHJldHVybiBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRCdWZmZXJTaXplSW5GcmFtZXMpOwogfQogCiBzaXplX3QgSkF1ZGlvVHJhY2s6OmNoYW5uZWxDb3VudCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRDaGFubmVsQ291bnQgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0Q2hhbm5lbENvdW50IiwgIigpSSIpOwogICAgIHJldHVybiBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRDaGFubmVsQ291bnQpOwogfQpAQCAtMTQzLDcgKzE1Nyw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0UGxheWJhY2tIZWFkUG9zaXRpb24gPSBlbnYtPkdldE1ldGhvZElEKAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tDbHMsICJnZXRQbGF5YmFja0hlYWRQb3NpdGlvbiIsICIoKUkiKTsKICAgICAqcG9zaXRpb24gPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRQbGF5YmFja0hlYWRQb3NpdGlvbik7CkBAIC0xNTEsMjEgKzE2NSwyMSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotYm9vbCBKQXVkaW9UcmFjazo6Z2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKK3N0YXR1c190IEpBdWRpb1RyYWNrOjpnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKIAogICAgIGpjbGFzcyBqQXVkaW9UaW1lU3RhbXBDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb1RpbWVzdGFtcCIpOwogICAgIGpvYmplY3QgakF1ZGlvVGltZVN0YW1wT2JqID0gZW52LT5BbGxvY09iamVjdChqQXVkaW9UaW1lU3RhbXBDbHMpOwogCi0gICAgamZpZWxkSUQgakZyYW1lUG9zaXRpb24gPSBlbnYtPkdldEZpZWxkSUQoakF1ZGlvVGltZVN0YW1wQ2xzLCAiZnJhbWVQb3NpdGlvbiIsICJMIik7Ci0gICAgamZpZWxkSUQgak5hbm9UaW1lID0gZW52LT5HZXRGaWVsZElEKGpBdWRpb1RpbWVTdGFtcENscywgIm5hbm9UaW1lIiwgIkwiKTsKKyAgICBqZmllbGRJRCBqRnJhbWVQb3NpdGlvbiA9IGVudi0+R2V0RmllbGRJRChqQXVkaW9UaW1lU3RhbXBDbHMsICJmcmFtZVBvc2l0aW9uIiwgIkoiKTsKKyAgICBqZmllbGRJRCBqTmFub1RpbWUgPSBlbnYtPkdldEZpZWxkSUQoakF1ZGlvVGltZVN0YW1wQ2xzLCAibmFub1RpbWUiLCAiSiIpOwogCiAgICAgam1ldGhvZElEIGpHZXRUaW1lc3RhbXAgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLAotICAgICAgICAgICAgImdldFRpbWVzdGFtcCIsICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9UaW1lc3RhbXApQiIpOworICAgICAgICAgICAgImdldFRpbWVzdGFtcCIsICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9UaW1lc3RhbXA7KVoiKTsKICAgICBib29sIHN1Y2Nlc3MgPSBlbnYtPkNhbGxCb29sZWFuTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0VGltZXN0YW1wLCBqQXVkaW9UaW1lU3RhbXBPYmopOwogCiAgICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogCiAgICAgbG9uZyBsb25nIGZyYW1lUG9zaXRpb24gPSBlbnYtPkdldExvbmdGaWVsZChqQXVkaW9UaW1lU3RhbXBPYmosIGpGcmFtZVBvc2l0aW9uKTsKQEAgLTE3OCw3ICsxOTIsNyBAQAogICAgIHRpbWVzdGFtcC5tVGltZSA9IHRzOwogICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSAodWludDMyX3QpIGZyYW1lUG9zaXRpb247CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpnZXRUaW1lc3RhbXAoRXh0ZW5kZWRUaW1lc3RhbXAgKnRpbWVzdGFtcCBfX3VudXNlZCkgewpAQCAtMTg5LDcgKzIwMyw3IEBACiBzdGF0dXNfdCBKQXVkaW9UcmFjazo6c2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpIHsKICAgICAvLyBUT0RPOiBleGlzdGluZyBuYXRpdmUgQXVkaW9UcmFjayByZXR1cm5zIElOVkFMSURfT1BFUkFUSU9OIG9uIG9mZmxvYWQvZGlyZWN0L2Zhc3QgdHJhY2tzLgogICAgIC8vIFNob3VsZCB3ZSBkbyB0aGUgc2FtZSB0aGluZz8KLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAKICAgICBqY2xhc3MgalBsYXliYWNrUGFyYW1zQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvUGxheWJhY2tQYXJhbXMiKTsKICAgICBqbWV0aG9kSUQgalBsYXliYWNrUGFyYW1zQ3RvciA9IGVudi0+R2V0TWV0aG9kSUQoalBsYXliYWNrUGFyYW1zQ2xzLCAiPGluaXQ+IiwgIigpViIpOwpAQCAtMjI0LDcgKzIzOCw3IEBACiB9CiAKIGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlIEpBdWRpb1RyYWNrOjpnZXRQbGF5YmFja1JhdGUoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogCiAgICAgam1ldGhvZElEIGpHZXRQbGF5YmFja1BhcmFtcyA9IGVudi0+R2V0TWV0aG9kSUQoCiAgICAgICAgICAgICBtQXVkaW9UcmFja0NscywgImdldFBsYXliYWNrUGFyYW1zIiwgIigpTGFuZHJvaWQvbWVkaWEvUGxheWJhY2tQYXJhbXM7Iik7CkBAIC0yNjYsNyArMjgwLDcgQEAKICAgICAgICAgcmV0dXJuIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyhCQURfVkFMVUUpOwogICAgIH0KIAotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKIAogICAgIGptZXRob2RJRCBqQ3JlYXRlVm9sdW1lU2hhcGVyID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImNyZWF0ZVZvbHVtZVNoYXBlciIsCiAgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciRDb25maWd1cmF0aW9uOylMYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXI7Iik7CkBAIC0yODIsNyArMjk2LDcgQEAKIH0KIAogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgalNldEF1eEVmZmVjdFNlbmRMZXZlbCA9IGVudi0+R2V0TWV0aG9kSUQoCiAgICAgICAgICAgICBtQXVkaW9UcmFja0NscywgInNldEF1eEVmZmVjdFNlbmRMZXZlbCIsICIoRilJIik7CiAgICAgaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgalNldEF1eEVmZmVjdFNlbmRMZXZlbCwgbGV2ZWwpOwpAQCAtMjkwLDE0ICszMDQsMTQgQEAKIH0KIAogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpBdHRhY2hBdXhFZmZlY3QgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiYXR0YWNoQXV4RWZmZWN0IiwgIihJKUkiKTsKICAgICBpbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqQXR0YWNoQXV4RWZmZWN0LCBlZmZlY3RJZCk7CiAgICAgcmV0dXJuIGphdmFUb05hdGl2ZVN0YXR1cyhyZXN1bHQpOwogfQogCiBzdGF0dXNfdCBKQXVkaW9UcmFjazo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIC8vIFRPRE86IEphdmEgc2V0U3RlcmVvVm9sdW1lIGlzIGRlcHJlY2F0ZWQuIERvIHdlIHJlYWxseSBuZWVkIHRoaXMgbWV0aG9kPwogICAgIGptZXRob2RJRCBqU2V0U3RlcmVvVm9sdW1lID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgInNldFN0ZXJlb1ZvbHVtZSIsICIoRkYpSSIpOwogICAgIGludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpTZXRTdGVyZW9Wb2x1bWUsIGxlZnQsIHJpZ2h0KTsKQEAgLTMwNSwxNCArMzE5LDE0IEBACiB9CiAKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqU2V0Vm9sdW1lID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgInNldFZvbHVtZSIsICIoRilJIik7CiAgICAgaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgalNldFZvbHVtZSwgdm9sdW1lKTsKICAgICByZXR1cm4gamF2YVRvTmF0aXZlU3RhdHVzKHJlc3VsdCk7CiB9CiAKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpzdGFydCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpQbGF5ID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgInBsYXkiLCAiKClWIik7CiAgICAgLy8gVE9ETzogU2hvdWxkIHdlIGNhdGNoIHRoZSBKYXZhIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBmcm9tIHBsYXkoKT8KICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqUGxheSk7CkBAIC0zMjQsNyArMzM4LDcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgamJ5dGVBcnJheSBqQXVkaW9EYXRhID0gZW52LT5OZXdCeXRlQXJyYXkoc2l6ZSk7CiAgICAgZW52LT5TZXRCeXRlQXJyYXlSZWdpb24oakF1ZGlvRGF0YSwgMCwgc2l6ZSwgKGpieXRlICopIGJ1ZmZlcik7CiAKQEAgLTM1Myw3ICszNjcsNyBAQAogfQogCiB2b2lkIEpBdWRpb1RyYWNrOjpzdG9wKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgalN0b3AgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAic3RvcCIsICIoKVYiKTsKICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqU3RvcCk7CiAgICAgLy8gVE9ETzogU2hvdWxkIHdlIGNhdGNoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbj8KQEAgLTM2NSwyMCArMzc5LDIwIEBACiB9CiAKIHZvaWQgSkF1ZGlvVHJhY2s6OmZsdXNoKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakZsdXNoID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImZsdXNoIiwgIigpViIpOwogICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpGbHVzaCk7CiB9CiAKIHZvaWQgSkF1ZGlvVHJhY2s6OnBhdXNlKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgalBhdXNlID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgInBhdXNlIiwgIigpViIpOwogICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpQYXVzZSk7CiAgICAgLy8gVE9ETzogU2hvdWxkIHdlIGNhdGNoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbj8KIH0KIAogYm9vbCBKQXVkaW9UcmFjazo6aXNQbGF5aW5nKCkgY29uc3QgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakdldFBsYXlTdGF0ZSA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRQbGF5U3RhdGUiLCAiKClJIik7CiAgICAgaW50IGN1cnJlbnRQbGF5U3RhdGUgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRQbGF5U3RhdGUpOwogCkBAIC0zOTMsNyArNDA3LDcgQEAKIH0KIAogdWludDMyX3QgSkF1ZGlvVHJhY2s6OmdldFNhbXBsZVJhdGUoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0U2FtcGxlUmF0ZSA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRTYW1wbGVSYXRlIiwgIigpSSIpOwogICAgIHJldHVybiBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRTYW1wbGVSYXRlKTsKIH0KQEAgLTQwMyw3ICs0MTcsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakdldEJ1ZmZlclNpemVJbkZyYW1lcyA9IGVudi0+R2V0TWV0aG9kSUQoCiAgICAgICAgICAgICBtQXVkaW9UcmFja0NscywgImdldEJ1ZmZlclNpemVJbkZyYW1lcyIsICIoKUkiKTsKICAgICBpbnQgYnVmZmVyU2l6ZUluRnJhbWVzID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0QnVmZmVyU2l6ZUluRnJhbWVzKTsKQEAgLTQxNywxMiArNDMxLDI2IEBACiB9CiAKIGF1ZGlvX2Zvcm1hdF90IEpBdWRpb1RyYWNrOjpmb3JtYXQoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0QXVkaW9Gb3JtYXQgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0QXVkaW9Gb3JtYXQiLCAiKClJIik7CiAgICAgaW50IGphdmFGb3JtYXQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRBdWRpb0Zvcm1hdCk7CiAgICAgcmV0dXJuIGF1ZGlvRm9ybWF0VG9OYXRpdmUoamF2YUZvcm1hdCk7CiB9CiAKK3NpemVfdCBKQXVkaW9UcmFjazo6ZnJhbWVTaXplKCkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgakdldEZvcm1hdCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsCisgICAgICAgICAgICAiZ2V0Rm9ybWF0IiwgIigpTGFuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQ7Iik7CisgICAgam9iamVjdCBqQXVkaW9Gb3JtYXRPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRGb3JtYXQpOworCisgICAgamNsYXNzIGpBdWRpb0Zvcm1hdENscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL0F1ZGlvRm9ybWF0Iik7CisgICAgam1ldGhvZElEIGpHZXRGcmFtZVNpemVJbkJ5dGVzID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIGpBdWRpb0Zvcm1hdENscywgImdldEZyYW1lU2l6ZUluQnl0ZXMiLCAiKClJIik7CisgICAgamludCBqYXZhRnJhbWVTaXplSW5CeXRlcyA9IGVudi0+Q2FsbEludE1ldGhvZChqQXVkaW9Gb3JtYXRPYmosIGpHZXRGcmFtZVNpemVJbkJ5dGVzKTsKKworICAgIHJldHVybiAoc2l6ZV90KWphdmFGcmFtZVNpemVJbkJ5dGVzOworfQorCiBzdGF0dXNfdCBKQXVkaW9UcmFjazo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpIGNvbnN0CiB7CiAgICAgU3RyaW5nOCByZXN1bHQ7CkBAIC00MzIsMTAgKzQ2MCw2IEBACiAgICAgLy8gVE9ETzogUmVtb3ZlIGxvZ3MgdGhhdCBpbmNsdWRlcyB1bmF2YWlsYWJsZSBpbmZvcm1hdGlvbiBmcm9tIGJlbG93LgogLy8gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBzdGF0dXMoJWQpLCBzdGF0ZSglZCksIHNlc3Npb24gSWQoJWQpLCBmbGFncyglI3gpXG4iLAogLy8gICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzLCBtU3RhdGUsIG1TZXNzaW9uSWQsIG1GbGFncyk7Ci0vLyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0cmVhbSB0eXBlKCVkKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSglZiwgJWYpXG4iLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAobVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpID8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKCZtQXR0cmlidXRlcykgOiBtU3RyZWFtVHlwZSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX0xFRlRdLCBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfUklHSFRdKTsKIC8vICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgZm9ybWF0KCUjeCksIGNoYW5uZWwgbWFzayglI3gpLCBjaGFubmVsIGNvdW50KCV1KVxuIiwKIC8vICAgICAgICAgICAgICAgICAgZm9ybWF0KCksIG1DaGFubmVsTWFzaywgY2hhbm5lbENvdW50KCkpOwogLy8gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBzYW1wbGUgcmF0ZSgldSksIG9yaWdpbmFsIHNhbXBsZSByYXRlKCV1KSwgc3BlZWQoJWYpXG4iLApAQCAtNDUzLDM4ICs0NzcsNDAgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWF1ZGlvX3BvcnRfaGFuZGxlX3QgSkF1ZGlvVHJhY2s6OmdldFJvdXRlZERldmljZUlkKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworam9iamVjdCBKQXVkaW9UcmFjazo6Z2V0Um91dGVkRGV2aWNlKCkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakdldFJvdXRlZERldmljZSA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRSb3V0ZWREZXZpY2UiLAogICAgICAgICAgICAgIigpTGFuZHJvaWQvbWVkaWEvQXVkaW9EZXZpY2VJbmZvOyIpOwotICAgIGpvYmplY3QgakF1ZGlvRGV2aWNlSW5mb09iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFJvdXRlZERldmljZSk7Ci0gICAgaWYgKGVudi0+SXNTYW1lT2JqZWN0KGpBdWRpb0RldmljZUluZm9PYmosIE5VTEwpKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgIH0KLQotICAgIGpjbGFzcyBqQXVkaW9EZXZpY2VJbmZvQ2xzID0gZW52LT5GaW5kQ2xhc3MoIkxhbmRyb2lkL21lZGlhL0F1ZGlvRGV2aWNlSW5mbyIpOwotICAgIGptZXRob2RJRCBqR2V0SWQgPSBlbnYtPkdldE1ldGhvZElEKGpBdWRpb0RldmljZUluZm9DbHMsICJnZXRJZCIsICIoKUkiKTsKLSAgICBqaW50IHJvdXRlZERldmljZUlkID0gZW52LT5DYWxsSW50TWV0aG9kKGpBdWRpb0RldmljZUluZm9PYmosIGpHZXRJZCk7Ci0gICAgcmV0dXJuIHJvdXRlZERldmljZUlkOworICAgIHJldHVybiBlbnYtPkNhbGxPYmplY3RNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRSb3V0ZWREZXZpY2UpOwogfQogCi1hdWRpb19zZXNzaW9uX3QgSkF1ZGlvVHJhY2s6OmdldEF1ZGlvU2Vzc2lvbklkKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworaW50MzJfdCBKQXVkaW9UcmFjazo6Z2V0QXVkaW9TZXNzaW9uSWQoKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0QXVkaW9TZXNzaW9uSWQgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0QXVkaW9TZXNzaW9uSWQiLCAiKClJIik7CiAgICAgamludCBzZXNzaW9uSWQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRBdWRpb1Nlc3Npb25JZCk7Ci0gICAgcmV0dXJuIChhdWRpb19zZXNzaW9uX3QpIHNlc3Npb25JZDsKKyAgICByZXR1cm4gc2Vzc2lvbklkOwogfQogCi1zdGF0dXNfdCBKQXVkaW9UcmFjazo6c2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqY2xhc3Mgak1QMkltcGxDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjJJbXBsIik7Ci0gICAgam1ldGhvZElEIGpTZXRBdWRpb091dHB1dERldmljZUJ5SWQgPSBlbnYtPkdldE1ldGhvZElEKAotICAgICAgICAgICAgak1QMkltcGxDbHMsICJzZXRBdWRpb091dHB1dERldmljZUJ5SWQiLCAiKExhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2s7SSlaIik7Ci0gICAgamJvb2xlYW4gcmVzdWx0ID0gZW52LT5DYWxsU3RhdGljQm9vbGVhbk1ldGhvZCgKLSAgICAgICAgICAgIGpNUDJJbXBsQ2xzLCBqU2V0QXVkaW9PdXRwdXREZXZpY2VCeUlkLCBtQXVkaW9UcmFja09iaiwgZGV2aWNlSWQpOworc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnNldFByZWZlcnJlZERldmljZShqb2JqZWN0IGRldmljZSkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgalNldFByZWZlcnJlZERldmljZUlkID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgInNldFByZWZlcnJlZERldmljZSIsCisgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL0F1ZGlvRGV2aWNlSW5mbzspWiIpOworICAgIGpib29sZWFuIHJlc3VsdCA9IGVudi0+Q2FsbEJvb2xlYW5NZXRob2QobUF1ZGlvVHJhY2tPYmosIGpTZXRQcmVmZXJyZWREZXZpY2VJZCwgZGV2aWNlKTsKICAgICByZXR1cm4gcmVzdWx0ID09IHRydWUgPyBOT19FUlJPUiA6IEJBRF9WQUxVRTsKIH0KIAorYXVkaW9fc3RyZWFtX3R5cGVfdCBKQXVkaW9UcmFjazo6Z2V0QXVkaW9TdHJlYW1UeXBlKCkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgakdldEF1ZGlvQXR0cmlidXRlcyA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRBdWRpb0F0dHJpYnV0ZXMiLAorICAgICAgICAgICAgIigpTGFuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzOyIpOworICAgIGpvYmplY3QgakF1ZGlvQXR0cmlidXRlcyA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEF1ZGlvQXR0cmlidXRlcyk7CisgICAgamNsYXNzIGpBdWRpb0F0dHJpYnV0ZXNDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMiKTsKKyAgICBqbWV0aG9kSUQgakdldFZvbHVtZUNvbnRyb2xTdHJlYW0gPSBlbnYtPkdldE1ldGhvZElEKGpBdWRpb0F0dHJpYnV0ZXNDbHMsCisgICAgICAgICAgICAiZ2V0Vm9sdW1lQ29udHJvbFN0cmVhbSIsICIoKUkiKTsKKyAgICBpbnQgamF2YUF1ZGlvU3RyZWFtVHlwZSA9IGVudi0+Q2FsbEludE1ldGhvZChqQXVkaW9BdHRyaWJ1dGVzLCBqR2V0Vm9sdW1lQ29udHJvbFN0cmVhbSk7CisgICAgcmV0dXJuIChhdWRpb19zdHJlYW1fdHlwZV90KWphdmFBdWRpb1N0cmVhbVR5cGU7Cit9CisKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpwZW5kaW5nRHVyYXRpb24oaW50MzJfdCAqbXNlYykgewogICAgIGlmIChtc2VjID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTUyNiwxOCArNTUyLDcyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBKQXVkaW9UcmFjazo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjaygKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayBfX3VudXNlZCkgewotICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIGFmdGVyIGFwcHJvcHJpYXRlIEphdmEgQXVkaW9UcmFjayBtZXRob2QgaXMgYXZhaWxhYmxlLgorc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lciwgam9iamVjdCBoYW5kbGVyKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqQWRkT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywKKyAgICAgICAgICAgICJhZGRPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIiLAorICAgICAgICAgICAgIihMYW5kcm9pZC9tZWRpYS9BdWRpb1JvdXRpbmckT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyO0xhbmRyb2lkL29zL0hhbmRsZXI7KVYiKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqQWRkT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyLCBsaXN0ZW5lciwgaGFuZGxlcik7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBKQXVkaW9UcmFjazo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjaygKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayBfX3VudXNlZCkgewotICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIGFmdGVyIGFwcHJvcHJpYXRlIEphdmEgQXVkaW9UcmFjayBtZXRob2QgaXMgYXZhaWxhYmxlLgorc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lcikgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgalJlbW92ZU9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lciA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsCisgICAgICAgICAgICAicmVtb3ZlT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyIiwKKyAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9Sb3V0aW5nJE9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lcjspViIpOworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpSZW1vdmVPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIsIGxpc3RlbmVyKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3ZvaWQgSkF1ZGlvVHJhY2s6OnJlZ2lzdGVyUm91dGluZ0RlbGVnYXRlcygKKyAgICAgICAgVmVjdG9yPHN0ZDo6cGFpcjxzcDxKT2JqZWN0SG9sZGVyPiwgc3A8Sk9iamVjdEhvbGRlcj4+PiYgcm91dGluZ0RlbGVnYXRlcykgeworICAgIGZvciAoYXV0byBpdCA9IHJvdXRpbmdEZWxlZ2F0ZXMuYmVnaW4oKTsgaXQgIT0gcm91dGluZ0RlbGVnYXRlcy5lbmQoKTsgaXQrKykgeworICAgICAgICBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGl0LT5zZWNvbmQtPmdldEpPYmplY3QoKSwgZ2V0SGFuZGxlcihpdC0+c2Vjb25kLT5nZXRKT2JqZWN0KCkpKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLyAgICAgICAgICAgICAgICBTdGF0aWMgbWV0aG9kcyBiZWdpbiAgICAgICAgICAgICAgICAgICAvLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK2pvYmplY3QgSkF1ZGlvVHJhY2s6OmdldExpc3RlbmVyKGNvbnN0IGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlT2JqKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpjbGFzcyBqUm91dGluZ0RlbGVnYXRlQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvUm91dGluZ0RlbGVnYXRlIik7CisgICAgam1ldGhvZElEIGpHZXRMaXN0ZW5lciA9IGVudi0+R2V0TWV0aG9kSUQoalJvdXRpbmdEZWxlZ2F0ZUNscywKKyAgICAgICAgICAgICJnZXRMaXN0ZW5lciIsICIoKUxhbmRyb2lkL21lZGlhL0F1ZGlvUm91dGluZyRPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXI7Iik7CisgICAgcmV0dXJuIGVudi0+Q2FsbE9iamVjdE1ldGhvZChyb3V0aW5nRGVsZWdhdGVPYmosIGpHZXRMaXN0ZW5lcik7Cit9CisKK2pvYmplY3QgSkF1ZGlvVHJhY2s6OmdldEhhbmRsZXIoY29uc3Qgam9iamVjdCByb3V0aW5nRGVsZWdhdGVPYmopIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgamNsYXNzIGpSb3V0aW5nRGVsZWdhdGVDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9Sb3V0aW5nRGVsZWdhdGUiKTsKKyAgICBqbWV0aG9kSUQgakdldEhhbmRsZXIgPSBlbnYtPkdldE1ldGhvZElEKGpSb3V0aW5nRGVsZWdhdGVDbHMsCisgICAgICAgICJnZXRIYW5kbGVyIiwgIigpTGFuZHJvaWQvb3MvSGFuZGxlcjsiKTsKKyAgICByZXR1cm4gZW52LT5DYWxsT2JqZWN0TWV0aG9kKHJvdXRpbmdEZWxlZ2F0ZU9iaiwgakdldEhhbmRsZXIpOworfQorCitqb2JqZWN0IEpBdWRpb1RyYWNrOjpmaW5kQnlLZXkoCisgICAgICAgIFZlY3RvcjxzdGQ6OnBhaXI8c3A8Sk9iamVjdEhvbGRlcj4sIHNwPEpPYmplY3RIb2xkZXI+Pj4mIG1wLCBjb25zdCBqb2JqZWN0IGtleSkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBtcC5iZWdpbigpOyBpdCAhPSBtcC5lbmQoKTsgaXQrKykgeworICAgICAgICBpZiAoZW52LT5Jc1NhbWVPYmplY3QoaXQtPmZpcnN0LT5nZXRKT2JqZWN0KCksIGtleSkpIHsKKyAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kLT5nZXRKT2JqZWN0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3ZvaWQgSkF1ZGlvVHJhY2s6OmVyYXNlQnlLZXkoCisgICAgICAgIFZlY3RvcjxzdGQ6OnBhaXI8c3A8Sk9iamVjdEhvbGRlcj4sIHNwPEpPYmplY3RIb2xkZXI+Pj4mIG1wLCBjb25zdCBqb2JqZWN0IGtleSkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBtcC5iZWdpbigpOyBpdCAhPSBtcC5lbmQoKTsgaXQrKykgeworICAgICAgICBpZiAoZW52LT5Jc1NhbWVPYmplY3QoaXQtPmZpcnN0LT5nZXRKT2JqZWN0KCksIGtleSkpIHsKKyAgICAgICAgICAgIG1wLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8vICAgICAgICAgICAgICAgIFByaXZhdGUgbWV0aG9kIGJlZ2lucyAgICAgICAgICAgICAgICAgIC8vLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNTUwLDcgKzYzMCw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKIAogICAgIC8vIFJlZmVyZW5jZWQgImFuZHJvaWRfbWVkaWFfVm9sdW1lU2hhcGVyLmgiLgogICAgIGpmbG9hdEFycmF5IHhhcnJheSA9IG51bGxwdHI7CkBAIC01OTUsNyArNjc1LDcgQEAKIGpvYmplY3QgSkF1ZGlvVHJhY2s6OmNyZWF0ZVZvbHVtZVNoYXBlck9wZXJhdGlvbk9iaigKICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSB7CiAKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAKICAgICBqY2xhc3MgakJ1aWxkZXJDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIkT3BlcmF0aW9uJEJ1aWxkZXIiKTsKICAgICBqbWV0aG9kSUQgakJ1aWxkZXJDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgIjxpbml0PiIsICIoKVYiKTsKQEAgLTY0NywxNSArNzI3LDE1IEBACiB9CiAKIGpvYmplY3QgSkF1ZGlvVHJhY2s6OmNyZWF0ZVN0cmVhbUV2ZW50Q2FsbGJhY2soY2FsbGJhY2tfdCBjYmYsIHZvaWQqIHVzZXIpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqY2xhc3MgakNhbGxiYWNrQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIySW1wbCRTdHJlYW1FdmVudENhbGxiYWNrIik7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpjbGFzcyBqQ2FsbGJhY2tDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjIkU3RyZWFtRXZlbnRDYWxsYmFjayIpOwogICAgIGptZXRob2RJRCBqQ2FsbGJhY2tDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQ2FsbGJhY2tDbHMsICI8aW5pdD4iLCAiKEpKSilWIik7CiAgICAgam9iamVjdCBqQ2FsbGJhY2tPYmogPSBlbnYtPk5ld09iamVjdChqQ2FsbGJhY2tDbHMsIGpDYWxsYmFja0N0b3IsIHRoaXMsIGNiZiwgdXNlcik7CiAgICAgcmV0dXJuIGpDYWxsYmFja09iajsKIH0KIAogam9iamVjdCBKQXVkaW9UcmFjazo6Y3JlYXRlQ2FsbGJhY2tFeGVjdXRvcigpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgamNsYXNzIGpFeGVjdXRvcnNDbHMgPSBlbnYtPkZpbmRDbGFzcygiamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JzIik7CiAgICAgam1ldGhvZElEIGpOZXdTaW5nbGVUaHJlYWRFeGVjdXRvciA9IGVudi0+R2V0U3RhdGljTWV0aG9kSUQoakV4ZWN1dG9yc0NscywKICAgICAgICAgICAgICJuZXdTaW5nbGVUaHJlYWRFeGVjdXRvciIsICIoKUxqYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRvclNlcnZpY2U7Iik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KTWVkaWEySFRUUENvbm5lY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYmFhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmNwcApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJKTWVkaWEySFRUUENvbm5lY3Rpb24iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL3Njb3BlZF9sb2NhbF9yZWYuaD4KKworI2luY2x1ZGUgImxvZy9sb2cuaCIKKyNpbmNsdWRlICJqbmkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtCdWZmZXJTaXplID0gMzI3Njg7CisKK0pNZWRpYTJIVFRQQ29ubmVjdGlvbjo6Sk1lZGlhMkhUVFBDb25uZWN0aW9uKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopIHsKKyAgICBtTWVkaWEySFRUUENvbm5lY3Rpb25PYmogPSBlbnYtPk5ld0dsb2JhbFJlZih0aGl6KTsKKyAgICBDSEVDSyhtTWVkaWEySFRUUENvbm5lY3Rpb25PYmogIT0gTlVMTCk7CisKKyAgICBTY29wZWRMb2NhbFJlZjxqY2xhc3M+IG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MoCisgICAgICAgICAgICBlbnYsIGVudi0+R2V0T2JqZWN0Q2xhc3MobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqKSk7CisgICAgQ0hFQ0sobWVkaWEySFRUUENvbm5lY3Rpb25DbGFzcy5nZXQoKSAhPSBOVUxMKTsKKworICAgIG1Db25uZWN0TWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAiY29ubmVjdCIsCisgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylaIik7CisgICAgQ0hFQ0sobUNvbm5lY3RNZXRob2QgIT0gTlVMTCk7CisKKyAgICBtRGlzY29ubmVjdE1ldGhvZCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzLmdldCgpLAorICAgICAgICAgICAgImRpc2Nvbm5lY3QiLAorICAgICAgICAgICAgIigpViIpOworICAgIENIRUNLKG1EaXNjb25uZWN0TWV0aG9kICE9IE5VTEwpOworCisgICAgbVJlYWRBdE1ldGhvZCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzLmdldCgpLAorICAgICAgICAgICAgInJlYWRBdCIsCisgICAgICAgICAgICAiKEpbQkkpSSIpOworICAgIENIRUNLKG1SZWFkQXRNZXRob2QgIT0gTlVMTCk7CisKKyAgICBtR2V0U2l6ZU1ldGhvZCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzLmdldCgpLAorICAgICAgICAgICAgImdldFNpemUiLAorICAgICAgICAgICAgIigpSiIpOworICAgIENIRUNLKG1HZXRTaXplTWV0aG9kICE9IE5VTEwpOworCisgICAgbUdldE1JTUVUeXBlTWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAiZ2V0TUlNRVR5cGUiLAorICAgICAgICAgICAgIigpTGphdmEvbGFuZy9TdHJpbmc7Iik7CisgICAgQ0hFQ0sobUdldE1JTUVUeXBlTWV0aG9kICE9IE5VTEwpOworCisgICAgbUdldFVyaU1ldGhvZCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzLmdldCgpLAorICAgICAgICAgICAgImdldFVyaSIsCisgICAgICAgICAgICAiKClMamF2YS9sYW5nL1N0cmluZzsiKTsKKyAgICBDSEVDSyhtR2V0VXJpTWV0aG9kICE9IE5VTEwpOworCisgICAgU2NvcGVkTG9jYWxSZWY8amJ5dGVBcnJheT4gdG1wKAorICAgICAgICBlbnYsIGVudi0+TmV3Qnl0ZUFycmF5KGtCdWZmZXJTaXplKSk7CisgICAgbUJ5dGVBcnJheU9iaiA9IChqYnl0ZUFycmF5KWVudi0+TmV3R2xvYmFsUmVmKHRtcC5nZXQoKSk7CisgICAgQ0hFQ0sobUJ5dGVBcnJheU9iaiAhPSBOVUxMKTsKK30KKworSk1lZGlhMkhUVFBDb25uZWN0aW9uOjp+Sk1lZGlhMkhUVFBDb25uZWN0aW9uKCkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtTWVkaWEySFRUUENvbm5lY3Rpb25PYmopOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1CeXRlQXJyYXlPYmopOworfQorCitib29sIEpNZWRpYTJIVFRQQ29ubmVjdGlvbjo6Y29ubmVjdCgKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgIFN0cmluZzggdG1wKCIiKTsKKyAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVhZGVycy0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHRtcC5hcHBlbmQoaGVhZGVycy0+a2V5QXQoaSkpOworICAgICAgICAgICAgdG1wLmFwcGVuZChTdHJpbmc4KCI6ICIpKTsKKyAgICAgICAgICAgIHRtcC5hcHBlbmQoaGVhZGVycy0+dmFsdWVBdChpKSk7CisgICAgICAgICAgICB0bXAuYXBwZW5kKFN0cmluZzgoIlxyXG4iKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBKTklFbnYqIGVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAganN0cmluZyBqdXJpID0gZW52LT5OZXdTdHJpbmdVVEYodXJpKTsKKyAgICBqc3RyaW5nIGpoZWFkZXJzID0gZW52LT5OZXdTdHJpbmdVVEYodG1wLnN0cmluZygpKTsKKworICAgIGpib29sZWFuIHJldCA9CisgICAgICAgIGVudi0+Q2FsbEJvb2xlYW5NZXRob2QobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtQ29ubmVjdE1ldGhvZCwganVyaSwgamhlYWRlcnMpOworCisgICAgZW52LT5EZWxldGVMb2NhbFJlZihqdXJpKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGpoZWFkZXJzKTsKKworICAgIHJldHVybiAoYm9vbClyZXQ7Cit9CisKK3ZvaWQgSk1lZGlhMkhUVFBDb25uZWN0aW9uOjpkaXNjb25uZWN0KCkgeworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaiwgbURpc2Nvbm5lY3RNZXRob2QpOworfQorCitzc2l6ZV90IEpNZWRpYTJIVFRQQ29ubmVjdGlvbjo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKworICAgIGlmIChzaXplID4ga0J1ZmZlclNpemUpIHsKKyAgICAgICAgc2l6ZSA9IGtCdWZmZXJTaXplOworICAgIH0KKworICAgIGppbnQgbiA9IGVudi0+Q2FsbEludE1ldGhvZCgKKyAgICAgICAgICAgIG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaiwgbVJlYWRBdE1ldGhvZCwgKGpsb25nKW9mZnNldCwgbUJ5dGVBcnJheU9iaiwgKGppbnQpc2l6ZSk7CisKKyAgICBpZiAobiA+IDApIHsKKyAgICAgICAgZW52LT5HZXRCeXRlQXJyYXlSZWdpb24oCisgICAgICAgICAgICAgICAgbUJ5dGVBcnJheU9iaiwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIG4sCisgICAgICAgICAgICAgICAgKGpieXRlICopZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIG47Cit9CisKK29mZjY0X3QgSk1lZGlhMkhUVFBDb25uZWN0aW9uOjpnZXRTaXplKCkgeworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICByZXR1cm4gKG9mZjY0X3QpKGVudi0+Q2FsbExvbmdNZXRob2QobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtR2V0U2l6ZU1ldGhvZCkpOworfQorCitzdGF0dXNfdCBKTWVkaWEySFRUUENvbm5lY3Rpb246OmdldE1JTUVUeXBlKFN0cmluZzggKm1pbWVUeXBlKSB7CisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpzdHJpbmcgam1pbWUgPSAoanN0cmluZyllbnYtPkNhbGxPYmplY3RNZXRob2QobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtR2V0TUlNRVR5cGVNZXRob2QpOworICAgIGpib29sZWFuIGZsYWcgPSBlbnYtPkV4Y2VwdGlvbkNoZWNrKCk7CisgICAgaWYgKGZsYWcpIHsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpzdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGptaW1lLCAwKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgKm1pbWVUeXBlID0gU3RyaW5nOChzdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgICptaW1lVHlwZSA9ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOworICAgIH0KKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqbWltZSwgc3RyKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEpNZWRpYTJIVFRQQ29ubmVjdGlvbjo6Z2V0VXJpKFN0cmluZzggKnVyaSkgeworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqc3RyaW5nIGp1cmkgPSAoanN0cmluZyllbnYtPkNhbGxPYmplY3RNZXRob2QobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtR2V0VXJpTWV0aG9kKTsKKyAgICBqYm9vbGVhbiBmbGFnID0gZW52LT5FeGNlcHRpb25DaGVjaygpOworICAgIGlmIChmbGFnKSB7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgY29uc3QgY2hhciAqc3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqdXJpLCAwKTsKKyAgICAqdXJpID0gU3RyaW5nOChzdHIpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGp1cmksIHN0cik7CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGUzNTczCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQU2VydmljZS5jcHAKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJKTWVkaWEySFRUUFNlcnZpY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxqbmkuaD4KKworI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisKKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvc2NvcGVkX2xvY2FsX3JlZi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0pNZWRpYTJIVFRQU2VydmljZTo6Sk1lZGlhMkhUVFBTZXJ2aWNlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopIHsKKyAgICBtTWVkaWEySFRUUFNlcnZpY2VPYmogPSBlbnYtPk5ld0dsb2JhbFJlZih0aGl6KTsKKyAgICBDSEVDSyhtTWVkaWEySFRUUFNlcnZpY2VPYmogIT0gTlVMTCk7CisKKyAgICBTY29wZWRMb2NhbFJlZjxqY2xhc3M+IG1lZGlhMkhUVFBTZXJ2aWNlQ2xhc3MoZW52LCBlbnYtPkdldE9iamVjdENsYXNzKG1NZWRpYTJIVFRQU2VydmljZU9iaikpOworICAgIENIRUNLKG1lZGlhMkhUVFBTZXJ2aWNlQ2xhc3MuZ2V0KCkgIT0gTlVMTCk7CisKKyAgICBtTWFrZUhUVFBDb25uZWN0aW9uTWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBTZXJ2aWNlQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAibWFrZUhUVFBDb25uZWN0aW9uIiwKKyAgICAgICAgICAgICIoKUxhbmRyb2lkL21lZGlhL01lZGlhMkhUVFBDb25uZWN0aW9uOyIpOworICAgIENIRUNLKG1NYWtlSFRUUENvbm5lY3Rpb25NZXRob2QgIT0gTlVMTCk7Cit9CisKK0pNZWRpYTJIVFRQU2VydmljZTo6fkpNZWRpYTJIVFRQU2VydmljZSgpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobU1lZGlhMkhUVFBTZXJ2aWNlT2JqKTsKK30KKworc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gSk1lZGlhMkhUVFBTZXJ2aWNlOjptYWtlSFRUUENvbm5lY3Rpb24oKSB7CisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpvYmplY3QgbWVkaWEySFRUUENvbm5lY3Rpb25PYmogPQorICAgICAgICBlbnYtPkNhbGxPYmplY3RNZXRob2QobU1lZGlhMkhUVFBTZXJ2aWNlT2JqLCBtTWFrZUhUVFBDb25uZWN0aW9uTWV0aG9kKTsKKworICAgIHJldHVybiBuZXcgSk1lZGlhMkhUVFBDb25uZWN0aW9uKGVudiwgbWVkaWEySFRUUENvbm5lY3Rpb25PYmopOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDAzZWQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5jcHAKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiSmF2YVZNSGVscGVyIgorCisjaW5jbHVkZSAibWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK3N0ZDo6YXRvbWljPEphdmFWTSAqPiBKYXZhVk1IZWxwZXI6OnNKYXZhVk0oTlVMTCk7CisKKy8qCisgKiBNYWtlcyB0aGUgY3VycmVudCB0aHJlYWQgdmlzaWJsZSB0byB0aGUgVk0uCisgKgorICogVGhlIEpOSUVudiBwb2ludGVyIHJldHVybmVkIGlzIG9ubHkgdmFsaWQgZm9yIHRoZSBjdXJyZW50IHRocmVhZCwgYW5kCisgKiB0aHVzIG11c3QgYmUgdHVja2VkIGludG8gdGhyZWFkLWxvY2FsIHN0b3JhZ2UuCisgKi8KK3N0YXRpYyBpbnQgamF2YUF0dGFjaFRocmVhZChjb25zdCBjaGFyKiB0aHJlYWROYW1lLCBKTklFbnYqKiBwRW52KSB7CisgICAgSmF2YVZNQXR0YWNoQXJncyBhcmdzOworICAgIEphdmFWTSogdm07CisgICAgamludCByZXN1bHQ7CisKKyAgICB2bSA9IEphdmFWTUhlbHBlcjo6Z2V0SmF2YVZNKCk7CisgICAgaWYgKHZtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEpOSV9FUlI7CisgICAgfQorCisgICAgYXJncy52ZXJzaW9uID0gSk5JX1ZFUlNJT05fMV80OworICAgIGFyZ3MubmFtZSA9IChjaGFyKikgdGhyZWFkTmFtZTsKKyAgICBhcmdzLmdyb3VwID0gTlVMTDsKKworICAgIHJlc3VsdCA9IHZtLT5BdHRhY2hDdXJyZW50VGhyZWFkKHBFbnYsICh2b2lkKikgJmFyZ3MpOworICAgIGlmIChyZXN1bHQgIT0gSk5JX09LKSB7CisgICAgICAgIEFMT0dJKCJOT1RFOiBhdHRhY2ggb2YgdGhyZWFkICclcycgZmFpbGVkXG4iLCB0aHJlYWROYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKgorICogRGV0YWNoIHRoZSBjdXJyZW50IHRocmVhZCBmcm9tIHRoZSBzZXQgdmlzaWJsZSB0byB0aGUgVk0uCisgKi8KK3N0YXRpYyBpbnQgamF2YURldGFjaFRocmVhZCh2b2lkKSB7CisgICAgSmF2YVZNKiB2bTsKKyAgICBqaW50IHJlc3VsdDsKKworICAgIHZtID0gSmF2YVZNSGVscGVyOjpnZXRKYXZhVk0oKTsKKyAgICBpZiAodm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gSk5JX0VSUjsKKyAgICB9CisKKyAgICByZXN1bHQgPSB2bS0+RGV0YWNoQ3VycmVudFRocmVhZCgpOworICAgIGlmIChyZXN1bHQgIT0gSk5JX09LKSB7CisgICAgICAgIEFMT0dFKCJFUlJPUjogdGhyZWFkIGRldGFjaCBmYWlsZWRcbiIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKgorICogV2hlbiBzdGFydGluZyBhIG5hdGl2ZSB0aHJlYWQgdGhhdCB3aWxsIGJlIHZpc2libGUgZnJvbSB0aGUgVk0sIHdlCisgKiBib3VuY2UgdGhyb3VnaCB0aGlzIHRvIGdldCB0aGUgcmlnaHQgYXR0YWNoL2RldGFjaCBhY3Rpb24uCisgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBjYWxscyBmcmVlKGFyZ3MpCisgKi8KK3N0YXRpYyBpbnQgamF2YVRocmVhZFNoZWxsKHZvaWQqIGFyZ3MpIHsKKyAgICB2b2lkKiBzdGFydCA9ICgodm9pZCoqKWFyZ3MpWzBdOworICAgIHZvaWQqIHVzZXJEYXRhID0gKCh2b2lkICoqKWFyZ3MpWzFdOworICAgIGNoYXIqIG5hbWUgPSAoY2hhciopICgodm9pZCAqKilhcmdzKVsyXTsgICAgICAgIC8vIHdlIG93biB0aGlzIHN0b3JhZ2UKKyAgICBmcmVlKGFyZ3MpOworICAgIEpOSUVudiogZW52OworICAgIGludCByZXN1bHQ7CisKKyAgICAvKiBob29rIHVzIGludG8gdGhlIFZNICovCisgICAgaWYgKGphdmFBdHRhY2hUaHJlYWQobmFtZSwgJmVudikgIT0gSk5JX09LKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBzdGFydCB0aGUgdGhyZWFkIHJ1bm5pbmcgKi8KKyAgICByZXN1bHQgPSAoKihhbmRyb2lkX3RocmVhZF9mdW5jX3Qpc3RhcnQpKHVzZXJEYXRhKTsKKworICAgIC8qIHVuaG9vayB1cyAqLworICAgIGphdmFEZXRhY2hUaHJlYWQoKTsKKyAgICBmcmVlKG5hbWUpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFRoaXMgaXMgaW52b2tlZCBmcm9tIGFuZHJvaWRDcmVhdGVUaHJlYWRFdGMoKSB2aWEgdGhlIGNhbGxiYWNrCisgKiBzZXQgd2l0aCBhbmRyb2lkU2V0Q3JlYXRlVGhyZWFkRnVuYygpLgorICoKKyAqIFdlIG5lZWQgdG8gY3JlYXRlIHRoZSBuZXcgdGhyZWFkIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBnZXRzIGhvb2tlZAorICogaW50byB0aGUgVk0gYmVmb3JlIGl0IHJlYWxseSBzdGFydHMgZXhlY3V0aW5nLgorICovCitzdGF0aWMgaW50IGphdmFDcmVhdGVUaHJlYWRFdGMoCisgICAgICAgIGFuZHJvaWRfdGhyZWFkX2Z1bmNfdCBlbnRyeUZ1bmN0aW9uLAorICAgICAgICB2b2lkKiB1c2VyRGF0YSwKKyAgICAgICAgY29uc3QgY2hhciogdGhyZWFkTmFtZSwKKyAgICAgICAgaW50MzJfdCB0aHJlYWRQcmlvcml0eSwKKyAgICAgICAgc2l6ZV90IHRocmVhZFN0YWNrU2l6ZSwKKyAgICAgICAgYW5kcm9pZF90aHJlYWRfaWRfdCogdGhyZWFkSWQpIHsKKyAgICB2b2lkKiogYXJncyA9ICh2b2lkKiopIG1hbGxvYygzICogc2l6ZW9mKHZvaWQqKSk7ICAgLy8gamF2YVRocmVhZFNoZWxsIG11c3QgZnJlZQorICAgIGludCByZXN1bHQ7CisKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHRocmVhZE5hbWUgPT0gbnVsbHB0ciwgInRocmVhZE5hbWUgbm90IHByb3ZpZGVkIHRvIGphdmFDcmVhdGVUaHJlYWRFdGMiKTsKKworICAgIGFyZ3NbMF0gPSAodm9pZCopIGVudHJ5RnVuY3Rpb247CisgICAgYXJnc1sxXSA9IHVzZXJEYXRhOworICAgIGFyZ3NbMl0gPSAodm9pZCopIHN0cmR1cCh0aHJlYWROYW1lKTsgICAvLyBqYXZhVGhyZWFkU2hlbGwgbXVzdCBmcmVlCisKKyAgICByZXN1bHQgPSBhbmRyb2lkQ3JlYXRlUmF3VGhyZWFkRXRjKGphdmFUaHJlYWRTaGVsbCwgYXJncywKKyAgICAgICAgdGhyZWFkTmFtZSwgdGhyZWFkUHJpb3JpdHksIHRocmVhZFN0YWNrU2l6ZSwgdGhyZWFkSWQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIHN0YXRpYworSk5JRW52ICpKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpIHsKKyAgICBKTklFbnYgKmVudjsKKyAgICBKYXZhVk0gKnZtID0gc0phdmFWTS5sb2FkKCk7CisgICAgQ0hFQ0sodm0gIT0gTlVMTCk7CisKKyAgICBpZiAodm0tPkdldEVudigodm9pZCAqKikmZW52LCBKTklfVkVSU0lPTl8xXzQpICE9IEpOSV9PSykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gZW52OworfQorCisvL3N0YXRpYworSmF2YVZNICpKYXZhVk1IZWxwZXI6OmdldEphdmFWTSgpIHsKKyAgICByZXR1cm4gc0phdmFWTS5sb2FkKCk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBKYXZhVk1IZWxwZXI6OnNldEphdmFWTShKYXZhVk0gKnZtKSB7CisgICAgc0phdmFWTS5zdG9yZSh2bSk7CisKKyAgICAvLyBFbnN1cmUgdGhhdCBUaHJlYWQoLypjYW5DYWxsSmF2YSovIHRydWUpIGluIGxpYnV0aWxzIGlzIGF0dGFjaGVkIHRvIHRoZSBWTS4KKyAgICAvLyBUaGlzIGlzIHN1cHBvc2VkIHRvIGJlIGRvbmUgYnkgcnVudGltZSwgYnV0IHdoZW4gbGlidXRpbHMgaXMgdXNlZCB3aXRoIGxpbmtlcgorICAgIC8vIG5hbWVzcGFjZSwgQ3JlYXRlVGhyZWFkRnVuYyBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgc2VwYXJhdGVseSB3aXRoaW4gdGhlIG5hbWVzcGFjZS4KKyAgICBhbmRyb2lkU2V0Q3JlYXRlVGhyZWFkRnVuYygoYW5kcm9pZF9jcmVhdGVfdGhyZWFkX2ZuKSBqYXZhQ3JlYXRlVGhyZWFkRXRjKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuY3BwCmluZGV4IGE4ZTFkMWYuLmI0ZmEwYzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmNwcApAQCAtMjIsOCArMjIsNiBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAKIG5hbWVzcGFjZSB7CkBAIC00NCwzMSArNDIsMjggQEAKICAgICBTdHJpbmc4IHJlc3VsdDsKIAogICAgIHJlc3VsdC5hcHBlbmQoIiBNZWRpYVBsYXllcjJBdWRpb091dHB1dFxuIik7Ci0gICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIHN0cmVhbSB0eXBlKCVkKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSglZiwgJWYpXG4iLAotICAgICAgICAgICAgbVN0cmVhbVR5cGUsIG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICB2b2x1bWUoJWYpXG4iLCBtVm9sdW1lKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIG1zZWMgcGVyIGZyYW1lKCVmKSwgbGF0ZW5jeSAoJWQpXG4iLAotICAgICAgICAgICAgbU1zZWNzUGVyRnJhbWUsIChtVHJhY2sgIT0gMCkgPyBtVHJhY2stPmxhdGVuY3koKSA6IC0xKTsKKyAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lLCAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpID8gbUpBdWRpb1RyYWNrLT5sYXRlbmN5KCkgOiAtMSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBhdXggZWZmZWN0IGlkKCVkKSwgc2VuZCBsZXZlbCAoJWYpXG4iLAogICAgICAgICAgICAgbUF1eEVmZmVjdElkLCBtU2VuZExldmVsKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAKICAgICA6OndyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPmR1bXAoZmQsIGFyZ3MpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPmR1bXAoZmQsIGFyZ3MpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLU1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpNZWRpYVBsYXllcjJBdWRpb091dHB1dChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCB1aWRfdCB1aWQsIGludCBwaWQsCi0gICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0ciwgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBkZXZpY2VDYWxsYmFjaykKLSAgICA6IG1DYWxsYmFjayhOVUxMKSwKLSAgICAgIG1DYWxsYmFja0Nvb2tpZShOVUxMKSwKLSAgICAgIG1DYWxsYmFja0RhdGEoTlVMTCksCi0gICAgICBtU3RyZWFtVHlwZShBVURJT19TVFJFQU1fTVVTSUMpLAotICAgICAgbUxlZnRWb2x1bWUoMS4wKSwKLSAgICAgIG1SaWdodFZvbHVtZSgxLjApLAorTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6Ok1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KGludDMyX3Qgc2Vzc2lvbklkLCB1aWRfdCB1aWQsIGludCBwaWQsCisgICAgICAgIGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcykKKyAgICA6IG1DYWxsYmFjayhudWxscHRyKSwKKyAgICAgIG1DYWxsYmFja0Nvb2tpZShudWxscHRyKSwKKyAgICAgIG1DYWxsYmFja0RhdGEobnVsbHB0ciksCisgICAgICBtVm9sdW1lKDEuMCksCiAgICAgICBtUGxheWJhY2tSYXRlKEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVCksCiAgICAgICBtU2FtcGxlUmF0ZUh6KDApLAogICAgICAgbU1zZWNzUGVyRnJhbWUoMCksCkBAIC03OCwyOCArNzMsMTkgQEAKICAgICAgIG1QaWQocGlkKSwKICAgICAgIG1TZW5kTGV2ZWwoMC4wKSwKICAgICAgIG1BdXhFZmZlY3RJZCgwKSwKLSAgICAgIG1GbGFncyhBVURJT19PVVRQVVRfRkxBR19OT05FKSwKLSAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAotICAgICAgbVJvdXRlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAotICAgICAgbURldmljZUNhbGxiYWNrRW5hYmxlZChmYWxzZSksCi0gICAgICBtRGV2aWNlQ2FsbGJhY2soZGV2aWNlQ2FsbGJhY2spIHsKKyAgICAgIG1GbGFncyhBVURJT19PVVRQVVRfRkxBR19OT05FKSB7CiAgICAgQUxPR1YoIk1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KCVkKSIsIHNlc3Npb25JZCk7Ci0gICAgaWYgKGF0dHIgIT0gTlVMTCkgewotICAgICAgICBtQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgaWYgKG1BdHRyaWJ1dGVzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1lbWNweShtQXR0cmlidXRlcywgYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICAgICAgbVN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGF0dHIpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUF0dHJpYnV0ZXMgPSBOVUxMOworCisgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbHB0cikgeworICAgICAgICBtQXR0cmlidXRlcyA9IG5ldyBKT2JqZWN0SG9sZGVyKGF0dHJpYnV0ZXMpOwogICAgIH0KIAogICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7CisgICAgbVJvdXRpbmdEZWxlZ2F0ZXMuY2xlYXIoKTsKIH0KIAogTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6On5NZWRpYVBsYXllcjJBdWRpb091dHB1dCgpIHsKICAgICBjbG9zZSgpOwotICAgIGZyZWUobUF0dHJpYnV0ZXMpOwogICAgIGRlbGV0ZSBtQ2FsbGJhY2tEYXRhOwogfQogCkBAIC0xMjYsMzEgKzExMiwzMSBAQAogCiBzc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpidWZmZXJTaXplKCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtVHJhY2stPmZyYW1lQ291bnQoKSAqIG1GcmFtZVNpemU7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+ZnJhbWVDb3VudCgpICogbUZyYW1lU2l6ZTsKIH0KIAogc3NpemVfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6ZnJhbWVDb3VudCgpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5mcmFtZUNvdW50KCk7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+ZnJhbWVDb3VudCgpOwogfQogCiBzc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpjaGFubmVsQ291bnQoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+Y2hhbm5lbENvdW50KCk7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+Y2hhbm5lbENvdW50KCk7CiB9CiAKIHNzaXplX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmZyYW1lU2l6ZSgpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICByZXR1cm4gbUZyYW1lU2l6ZTsKQEAgLTE1OCwxMCArMTQ0LDEwIEBACiAKIHVpbnQzMl90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpsYXRlbmN5ICgpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5sYXRlbmN5KCk7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+bGF0ZW5jeSgpOwogfQogCiBmbG9hdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6bXNlY3NQZXJGcmFtZSgpIGNvbnN0IHsKQEAgLTE3MSwxOCArMTU3LDE4IEBACiAKIHN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5nZXRQb3NpdGlvbihwb3NpdGlvbik7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+Z2V0UG9zaXRpb24ocG9zaXRpb24pOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtVHJhY2stPmdldFRpbWVzdGFtcCh0cyk7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+Z2V0VGltZXN0YW1wKHRzKTsKIH0KIAogLy8gVE9ETzogUmVtb3ZlIHVubmVjZXNzYXJ5IGNhbGxzIHRvIGdldFBsYXllZE91dER1cmF0aW9uVXMoKQpAQCAtMTk1LDcgKzE4MSw3IEBACiAvLyBDYWxjdWxhdGUgZHVyYXRpb24gb2YgcGxheWVkIHNhbXBsZXMgaWYgcGxheWVkIGF0IG5vcm1hbCByYXRlIChpLmUuLCAxLjApLgogaW50NjRfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0UGxheWVkT3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCB8fCBtU2FtcGxlUmF0ZUh6ID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIgfHwgbVNhbXBsZVJhdGVIeiA9PSAwKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtMjAzLDIyICsxODksMTggQEAKICAgICBpbnQ2NF90IG51bUZyYW1lc1BsYXllZEF0VXM7CiAgICAgQXVkaW9UaW1lc3RhbXAgdHM7CiAKLSAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2stPmdldFRpbWVzdGFtcCh0cyk7CisgICAgc3RhdHVzX3QgcmVzID0gbUpBdWRpb1RyYWNrLT5nZXRUaW1lc3RhbXAodHMpOworCiAgICAgaWYgKHJlcyA9PSBPSykgeyAgICAgICAgICAgICAgICAgLy8gY2FzZSAxOiBtaXhpbmcgYXVkaW8gdHJhY2tzIGFuZCBvZmZsb2FkZWQgdHJhY2tzLgogICAgICAgICBudW1GcmFtZXNQbGF5ZWQgPSB0cy5tUG9zaXRpb247CiAgICAgICAgIG51bUZyYW1lc1BsYXllZEF0VXMgPSB0cy5tVGltZS50dl9zZWMgKiAxMDAwMDAwTEwgKyB0cy5tVGltZS50dl9uc2VjIC8gMTAwMDsKICAgICAgICAgLy9BTE9HRCgiZ2V0VGltZXN0YW1wOiBPSyAlZCAlbGxkIiwgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0VXMpOwotICAgIH0gZWxzZSBpZiAocmVzID09IFdPVUxEX0JMT0NLKSB7IC8vIGNhc2UgMjogdHJhbnNpdG9yeSBzdGF0ZSBvbiBzdGFydCBvZiBhIG5ldyB0cmFjaworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgMjogdHJhbnNpdG9yeSBzdGF0ZSBvbiBzdGFydCBvZiBhIG5ldyB0cmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgMzogdHJhbnNpdG9yeSBhdCBuZXcgdHJhY2sgb3IgYXVkaW8gZmFzdCB0cmFja3MuCiAgICAgICAgIG51bUZyYW1lc1BsYXllZCA9IDA7CiAgICAgICAgIG51bUZyYW1lc1BsYXllZEF0VXMgPSBub3dVczsKICAgICAgICAgLy9BTE9HRCgiZ2V0VGltZXN0YW1wOiBXT1VMRF9CTE9DSyAlZCAlbGxkIiwKICAgICAgICAgLy8gICAgICAgIG51bUZyYW1lc1BsYXllZCwgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdFVzKTsKLSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDM6IHRyYW5zaXRvcnkgYXQgbmV3IHRyYWNrIG9yIGF1ZGlvIGZhc3QgdHJhY2tzLgotICAgICAgICByZXMgPSBtVHJhY2stPmdldFBvc2l0aW9uKCZudW1GcmFtZXNQbGF5ZWQpOwotICAgICAgICBDSEVDS19FUShyZXMsIChzdGF0dXNfdClPSyk7Ci0gICAgICAgIG51bUZyYW1lc1BsYXllZEF0VXMgPSBub3dVczsKLSAgICAgICAgbnVtRnJhbWVzUGxheWVkQXRVcyArPSAxMDAwTEwgKiBtVHJhY2stPmxhdGVuY3koKSAvIDI7IC8qIFhYWCAqLwotICAgICAgICAvL0FMT0dEKCJnZXRQb3NpdGlvbjogJXUgJWxsZCIsIG51bUZyYW1lc1BsYXllZCwgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdFVzKTsKICAgICB9CiAKICAgICAvLyBDSEVDS19FUShudW1GcmFtZXNQbGF5ZWQgJiAoMSA8PCAzMSksIDApOyAgLy8gY2FuJ3QgYmUgbmVnYXRpdmUgdW50aWwgMTIuNCBocnMsIHRlc3QKQEAgLTI0NCwxMDggKzIyNiw1NSBAQAogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIEV4dGVuZGVkVGltZXN0YW1wIGV0czsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtVHJhY2stPmdldFRpbWVzdGFtcCgmZXRzKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtSkF1ZGlvVHJhY2stPmdldFRpbWVzdGFtcCgmZXRzKTsKICAgICBpZiAoc3RhdHVzID09IE9LIHx8IHN0YXR1cyA9PSBXT1VMRF9CTE9DSykgewogICAgICAgICAqZnJhbWVzd3JpdHRlbiA9ICh1aW50MzJfdClldHMubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9DTElFTlRdOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKSB7Cit2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKKyAgICBtQXR0cmlidXRlcyA9IChhdHRyaWJ1dGVzID09IG51bGxwdHIpID8gbnVsbHB0ciA6IG5ldyBKT2JqZWN0SG9sZGVyKGF0dHJpYnV0ZXMpOwogfQogCi1TdHJpbmc4ICBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKSB7CithdWRpb19zdHJlYW1fdHlwZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCB7CisgICAgQUxPR1YoImdldEF1ZGlvU3RyZWFtVHlwZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fREVGQVVMVDsKICAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+Z2V0UGFyYW1ldGVycyhrZXlzKTsKLX0KLQotdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHJpYnV0ZXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKGF0dHJpYnV0ZXMgPT0gTlVMTCkgewotICAgICAgICBmcmVlKG1BdHRyaWJ1dGVzKTsKLSAgICAgICAgbUF0dHJpYnV0ZXMgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtQXR0cmlidXRlcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkobUF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgbVN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGF0dHJpYnV0ZXMpOwotICAgIH0KLX0KLQotdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICAvLyBkbyBub3QgYWxsb3cgZGlyZWN0IHN0cmVhbSB0eXBlIG1vZGlmaWNhdGlvbiBpZiBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBzZXQKLSAgICBpZiAobUF0dHJpYnV0ZXMgPT0gTlVMTCkgewotICAgICAgICBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgfQorICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmdldEF1ZGlvU3RyZWFtVHlwZSgpOwogfQogCiB2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpjbG9zZV9sKCkgewotICAgIG1UcmFjay5jbGVhcigpOworICAgIG1KQXVkaW9UcmFjay5jbGVhcigpOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6b3BlbigKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGJ1ZmZlckNvdW50LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSwKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKLSAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCwKICAgICAgICAgdWludDMyX3Qgc3VnZ2VzdGVkRnJhbWVDb3VudCkgewotICAgIEFMT0dWKCJvcGVuKCV1LCAlZCwgMHgleCwgMHgleCwgJWQsICVkIDB4JXgpIiwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBmb3JtYXQsIGJ1ZmZlckNvdW50LCBtU2Vzc2lvbklkLCBmbGFncyk7CisgICAgQUxPR1YoIm9wZW4oJXUsICVkLCAweCV4LCAweCV4LCAlZCAweCV4KSIsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgZm9ybWF0LCBtU2Vzc2lvbklkLCBmbGFncyk7CiAKICAgICAvLyBvZmZsb2FkaW5nIGlzIG9ubHkgc3VwcG9ydGVkIGluIGNhbGxiYWNrIG1vZGUgZm9yIG5vdy4KICAgICAvLyBvZmZsb2FkSW5mbyBtdXN0IGJlIHByZXNlbnQgaWYgb2ZmbG9hZCBmbGFnIGlzIHNldAogICAgIGlmICgoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgJiYKLSAgICAgICAgICAgICgoY2IgPT0gTlVMTCkgfHwgKG9mZmxvYWRJbmZvID09IE5VTEwpKSkgeworICAgICAgICAgICAgKChjYiA9PSBudWxscHRyKSB8fCAob2ZmbG9hZEluZm8gPT0gbnVsbHB0cikpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgLy8gY29tcHV0ZSBmcmFtZSBjb3VudCBmb3IgdGhlIEF1ZGlvVHJhY2sgaW50ZXJuYWwgYnVmZmVyCi0gICAgc2l6ZV90IGZyYW1lQ291bnQ7Ci0gICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKLSAgICAgICAgZnJhbWVDb3VudCA9IDA7IC8vIEF1ZGlvVHJhY2sgd2lsbCBnZXQgZnJhbWUgY291bnQgZnJvbSBBdWRpb0ZsaW5nZXIKLSAgICB9IGVsc2UgewotICAgICAgICAvLyB0cnkgdG8gZXN0aW1hdGUgdGhlIGJ1ZmZlciBwcm9jZXNzaW5nIGZldGNoIHNpemUgZnJvbSBBdWRpb0ZsaW5nZXIuCi0gICAgICAgIC8vIGZyYW1lc1BlckJ1ZmZlciBpcyBhcHByb3hpbWF0ZSBhbmQgZ2VuZXJhbGx5IGNvcnJlY3QsIGV4Y2VwdCB3aGVuIGl0J3Mgbm90IDotKS4KLSAgICAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwotICAgICAgICBzaXplX3QgYWZGcmFtZUNvdW50OwotICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoJmFmRnJhbWVDb3VudCwgbVN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBtU3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHNpemVfdCBmcmFtZXNQZXJCdWZmZXIgPQotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGFmRnJhbWVDb3VudCAvIGFmU2FtcGxlUmF0ZTsKLQotICAgICAgICBpZiAoYnVmZmVyQ291bnQgPT0gMCkgewotICAgICAgICAgICAgLy8gdXNlIHN1Z2dlc3RlZEZyYW1lQ291bnQKLSAgICAgICAgICAgIGJ1ZmZlckNvdW50ID0gKHN1Z2dlc3RlZEZyYW1lQ291bnQgKyBmcmFtZXNQZXJCdWZmZXIgLSAxKSAvIGZyYW1lc1BlckJ1ZmZlcjsKLSAgICAgICAgfQotICAgICAgICAvLyBDaGVjayBhcmd1bWVudCBidWZmZXJDb3VudCBhZ2FpbnN0IHRoZSBtaW5pbnVtIGJ1ZmZlciBjb3VudAotICAgICAgICBpZiAoYnVmZmVyQ291bnQgIT0gMCAmJiBidWZmZXJDb3VudCA8IG1NaW5CdWZmZXJDb3VudCkgewotICAgICAgICAgICAgQUxPR1YoImJ1ZmZlckNvdW50ICglZCkgaW5jcmVhc2VkIHRvICVkIiwgYnVmZmVyQ291bnQsIG1NaW5CdWZmZXJDb3VudCk7Ci0gICAgICAgICAgICBidWZmZXJDb3VudCA9IG1NaW5CdWZmZXJDb3VudDsKLSAgICAgICAgfQotICAgICAgICAvLyBpZiBmcmFtZUNvdW50IGlzIDAsIHRoZW4gQXVkaW9UcmFjayB3aWxsIGdldCBmcmFtZSBjb3VudCBmcm9tIEF1ZGlvRmxpbmdlcgotICAgICAgICAvLyB3aGljaCB3aWxsIGJlIHRoZSBtaW5pbXVtIHNpemUgcGVybWl0dGVkLgotICAgICAgICBmcmFtZUNvdW50ID0gYnVmZmVyQ291bnQgKiBmcmFtZXNQZXJCdWZmZXI7Ci0gICAgfQorICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0KKyAgICAgICAgICAgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApID8gMCA6IHN1Z2dlc3RlZEZyYW1lQ291bnQ7CiAKICAgICBpZiAoY2hhbm5lbE1hc2sgPT0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSKSB7CiAgICAgICAgIGNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7CkBAIC0zNTksMzIgKzI4OCwyMyBAQAogICAgIG1DYWxsYmFjayA9IGNiOwogICAgIG1DYWxsYmFja0Nvb2tpZSA9IGNvb2tpZTsKIAotICAgIHNwPEF1ZGlvVHJhY2s+IHQ7Ci0gICAgQ2FsbGJhY2tEYXRhICpuZXdjYmQgPSBOVUxMOworICAgIHNwPEpBdWRpb1RyYWNrPiBqVDsKKyAgICBDYWxsYmFja0RhdGEgKm5ld2NiZCA9IG51bGxwdHI7CiAKLSAgICBBTE9HVigiY3JlYXRpbmcgbmV3IEF1ZGlvVHJhY2siKTsKKyAgICBBTE9HVigiY3JlYXRpbmcgbmV3IEpBdWRpb1RyYWNrIik7CiAKLSAgICBpZiAobUNhbGxiYWNrICE9IE5VTEwpIHsKKyAgICBpZiAobUNhbGxiYWNrICE9IG51bGxwdHIpIHsKICAgICAgICAgbmV3Y2JkID0gbmV3IENhbGxiYWNrRGF0YSh0aGlzKTsKLSAgICAgICAgdCA9IG5ldyBBdWRpb1RyYWNrKAotICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgQ2FsbGJhY2tXcmFwcGVyLAotICAgICAgICAgICAgICAgIG5ld2NiZCwKLSAgICAgICAgICAgICAgICAwLCAgLy8gbm90aWZpY2F0aW9uIGZyYW1lcwotICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgQXVkaW9UcmFjazo6VFJBTlNGRVJfQ0FMTEJBQ0ssCi0gICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8sCi0gICAgICAgICAgICAgICAgbVVpZCwKLSAgICAgICAgICAgICAgICBtUGlkLAotICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0LAotICAgICAgICAgICAgICAgIDEuMGYsICAvLyBkZWZhdWx0IHZhbHVlIGZvciBtYXhSZXF1aXJlZFNwZWVkCi0gICAgICAgICAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQpOworICAgICAgICBqVCA9IG5ldyBKQXVkaW9UcmFjaygKKyAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgQ2FsbGJhY2tXcmFwcGVyLAorICAgICAgICAgICAgICAgICBuZXdjYmQsCisgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzICE9IG51bGxwdHIgPyBtQXR0cmlidXRlcy0+Z2V0Sk9iamVjdCgpIDogbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgMS4wZik7ICAvLyBkZWZhdWx0IHZhbHVlIGZvciBtYXhSZXF1aXJlZFNwZWVkCiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gVE9ETzogRHVlIHRvIGJ1ZmZlciBtZW1vcnkgY29uY2VybnMsIHdlIHVzZSBhIG1heCB0YXJnZXQgcGxheWJhY2sgc3BlZWQKICAgICAgICAgLy8gYmFzZWQgb24gbVBsYXliYWNrUmF0ZSBhdCB0aGUgdGltZSBvZiBvcGVuIChpbnN0ZWFkIG9mIGtNYXhSZXF1aXJlZFNwZWVkKSwKQEAgLTM5NCw3MyArMzE0LDYyIEBACiAgICAgICAgIEFMT0dXX0lGKHRhcmdldFNwZWVkICE9IG1QbGF5YmFja1JhdGUubVNwZWVkLAogICAgICAgICAgICAgICAgICJ0cmFjayB0YXJnZXQgc3BlZWQ6JWYgY2xhbXBlZCBmcm9tIHBsYXliYWNrIHNwZWVkOiVmIiwKICAgICAgICAgICAgICAgICB0YXJnZXRTcGVlZCwgbVBsYXliYWNrUmF0ZS5tU3BlZWQpOwotICAgICAgICB0ID0gbmV3IEF1ZGlvVHJhY2soCi0gICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICBOVUxMLCAvLyBjYWxsYmFjawotICAgICAgICAgICAgICAgIE5VTEwsIC8vIHVzZXIgZGF0YQotICAgICAgICAgICAgICAgIDAsIC8vIG5vdGlmaWNhdGlvbiBmcmFtZXMKLSAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAotICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgTlVMTCwgLy8gb2ZmbG9hZCBpbmZvCi0gICAgICAgICAgICAgICAgbVVpZCwKLSAgICAgICAgICAgICAgICBtUGlkLAotICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0LAotICAgICAgICAgICAgICAgIHRhcmdldFNwZWVkLAotICAgICAgICAgICAgICAgIG1TZWxlY3RlZERldmljZUlkKTsKKyAgICAgICAgalQgPSBuZXcgSkF1ZGlvVHJhY2soCisgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzICE9IG51bGxwdHIgPyBtQXR0cmlidXRlcy0+Z2V0Sk9iamVjdCgpIDogbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgdGFyZ2V0U3BlZWQpOwogICAgIH0KIAotICAgIGlmICgodCA9PSAwKSB8fCAodC0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpKSB7CisgICAgaWYgKGpUID09IDApIHsKICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjcmVhdGUgYXVkaW8gdHJhY2siKTsKICAgICAgICAgZGVsZXRlIG5ld2NiZDsKICAgICAgICAgLy8gdCBnb2VzIG91dCBvZiBzY29wZSwgc28gcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvIHplcm8KICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gc3VjY2Vzc2Z1bCBBdWRpb1RyYWNrIGluaXRpYWxpemF0aW9uIGltcGxpZXMgYSBsZWdhY3kgc3RyZWFtIHR5cGUgd2FzIGdlbmVyYXRlZAotICAgICAgICAvLyBmcm9tIHRoZSBhdWRpbyBhdHRyaWJ1dGVzCi0gICAgICAgIG1TdHJlYW1UeXBlID0gdC0+c3RyZWFtVHlwZSgpOwogICAgIH0KIAotICAgIENIRUNLKCh0ICE9IE5VTEwpICYmICgobUNhbGxiYWNrID09IE5VTEwpIHx8IChuZXdjYmQgIT0gTlVMTCkpKTsKKyAgICBDSEVDSygoalQgIT0gbnVsbHB0cikgJiYgKChtQ2FsbGJhY2sgPT0gbnVsbHB0cikgfHwgKG5ld2NiZCAhPSBudWxscHRyKSkpOwogCiAgICAgbUNhbGxiYWNrRGF0YSA9IG5ld2NiZDsKICAgICBBTE9HVigic2V0Vm9sdW1lIik7Ci0gICAgdC0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOworICAgIGpULT5zZXRWb2x1bWUobVZvbHVtZSk7CiAKICAgICBtU2FtcGxlUmF0ZUh6ID0gc2FtcGxlUmF0ZTsKICAgICBtRmxhZ3MgPSBmbGFnczsKICAgICBtTXNlY3NQZXJGcmFtZSA9IDFFM2YgLyAobVBsYXliYWNrUmF0ZS5tU3BlZWQgKiBzYW1wbGVSYXRlKTsKLSAgICBtRnJhbWVTaXplID0gdC0+ZnJhbWVTaXplKCk7Ci0gICAgbVRyYWNrID0gdDsKKyAgICBtRnJhbWVTaXplID0galQtPmZyYW1lU2l6ZSgpOworICAgIG1KQXVkaW9UcmFjayA9IGpUOwogCiAgICAgcmV0dXJuIHVwZGF0ZVRyYWNrX2woKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnVwZGF0ZVRyYWNrX2woKSB7Ci0gICAgaWYgKG1UcmFjayA9PSBOVUxMKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKICAgICBzdGF0dXNfdCByZXMgPSBOT19FUlJPUjsKICAgICAvLyBOb3RlIHNvbWUgb3V0cHV0IGRldmljZXMgbWF5IGdpdmUgdXMgYSBkaXJlY3QgdHJhY2sgZXZlbiB0aG91Z2ggd2UgZG9uJ3Qgc3BlY2lmeSBpdC4KICAgICAvLyBFeGFtcGxlOiBMaW5lIGFwcGxpY2F0aW9uIGIvMTc0NTk5ODIuCi0gICAgaWYgKChtVHJhY2stPmdldEZsYWdzKCkKKyAgICBpZiAoKG1KQXVkaW9UcmFjay0+Z2V0RmxhZ3MoKQogICAgICAgICAgICAgJiAoQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkpID09IDApIHsKLSAgICAgICAgcmVzID0gbVRyYWNrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CisgICAgICAgIHJlcyA9IG1KQXVkaW9UcmFjay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1JhdGUpOwogICAgICAgICBpZiAocmVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChtU2VuZExldmVsKTsKLSAgICAgICAgICAgIHJlcyA9IG1UcmFjay0+YXR0YWNoQXV4RWZmZWN0KG1BdXhFZmZlY3RJZCk7CisgICAgICAgICAgICBtSkF1ZGlvVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChtU2VuZExldmVsKTsKKyAgICAgICAgICAgIHJlcyA9IG1KQXVkaW9UcmFjay0+YXR0YWNoQXV4RWZmZWN0KG1BdXhFZmZlY3RJZCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbVRyYWNrLT5zZXRPdXRwdXREZXZpY2UobVNlbGVjdGVkRGV2aWNlSWQpOwotICAgIGlmIChtRGV2aWNlQ2FsbGJhY2tFbmFibGVkKSB7Ci0gICAgICAgIG1UcmFjay0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2sucHJvbW90ZSgpKTsKKyAgICBpZiAobVByZWZlcnJlZERldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIG1KQXVkaW9UcmFjay0+c2V0UHJlZmVycmVkRGV2aWNlKG1QcmVmZXJyZWREZXZpY2UtPmdldEpPYmplY3QoKSk7CiAgICAgfQorCisgICAgbUpBdWRpb1RyYWNrLT5yZWdpc3RlclJvdXRpbmdEZWxlZ2F0ZXMobVJvdXRpbmdEZWxlZ2F0ZXMpOworCiAgICAgQUxPR1YoInVwZGF0ZVRyYWNrX2woKSBET05FIHN0YXR1cyAlZCIsIHJlcyk7CiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTQ2OCwxMyArMzc3LDEzIEBACiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c3RhcnQoKSB7CiAgICAgQUxPR1YoInN0YXJ0Iik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtQ2FsbGJhY2tEYXRhICE9IE5VTEwpIHsKKyAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBudWxscHRyKSB7CiAgICAgICAgIG1DYWxsYmFja0RhdGEtPmVuZFRyYWNrU3dpdGNoKCk7CiAgICAgfQotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPnNldFZvbHVtZShtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKLSAgICAgICAgbVRyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1UcmFjay0+c3RhcnQoKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUpBdWRpb1RyYWNrLT5zZXRWb2x1bWUobVZvbHVtZSk7CisgICAgICAgIG1KQXVkaW9UcmFjay0+c2V0QXV4RWZmZWN0U2VuZExldmVsKG1TZW5kTGV2ZWwpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtSkF1ZGlvVHJhY2stPnN0YXJ0KCk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIHJldHVybiBOT19JTklUOwpAQCAtNDgyLDExICszOTEsMTEgQEAKIAogc3NpemVfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6d3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBibG9ja2luZykgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DYWxsYmFjayAhPSBOVUxMLCAiRG9uJ3QgY2FsbCB3cml0ZSBpZiBzdXBwbHlpbmcgYSBjYWxsYmFjay4iKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DYWxsYmFjayAhPSBudWxscHRyLCAiRG9uJ3QgY2FsbCB3cml0ZSBpZiBzdXBwbHlpbmcgYSBjYWxsYmFjay4iKTsKIAogICAgIC8vQUxPR1YoIndyaXRlKCVwLCAldSkiLCBidWZmZXIsIHNpemUpOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICByZXR1cm4gbVRyYWNrLT53cml0ZShidWZmZXIsIHNpemUsIGJsb2NraW5nKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+d3JpdGUoYnVmZmVyLCBzaXplLCBibG9ja2luZyk7CiAgICAgfQogICAgIHJldHVybiBOT19JTklUOwogfQpAQCAtNDk0LDQ1ICs0MDMsNDQgQEAKIHZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnN0b3AoKSB7CiAgICAgQUxPR1YoInN0b3AiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+c3RvcCgpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPnN0b3AoKTsKICAgICB9CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmZsdXNoKCkgewogICAgIEFMT0dWKCJmbHVzaCIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5mbHVzaCgpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPmZsdXNoKCk7CiAgICAgfQogfQogCiB2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpwYXVzZSgpIHsKICAgICBBTE9HVigicGF1c2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+cGF1c2UoKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUpBdWRpb1RyYWNrLT5wYXVzZSgpOwogICAgIH0KIH0KIAogdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Y2xvc2UoKSB7CiAgICAgQUxPR1YoImNsb3NlIik7Ci0gICAgc3A8QXVkaW9UcmFjaz4gdHJhY2s7CisgICAgc3A8SkF1ZGlvVHJhY2s+IHRyYWNrOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgICAgICB0cmFjayA9IG1UcmFjazsKLSAgICAgICAgY2xvc2VfbCgpOyAvLyBjbGVhcnMgbVRyYWNrCisgICAgICAgIHRyYWNrID0gbUpBdWRpb1RyYWNrOworICAgICAgICBjbG9zZV9sKCk7IC8vIGNsZWFycyBtSkF1ZGlvVHJhY2sKICAgICB9CiAgICAgLy8gZGVzdHJ1Y3Rpb24gb2YgdGhlIHRyYWNrIG9jY3VycyBvdXRzaWRlIG9mIG11dGV4LgogfQogCi12b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLSAgICBBTE9HVigic2V0Vm9sdW1lKCVmLCAlZikiLCBsZWZ0LCByaWdodCk7Cit2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgQUxPR1YoInNldFZvbHVtZSglZikiLCB2b2x1bWUpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBtTGVmdFZvbHVtZSA9IGxlZnQ7Ci0gICAgbVJpZ2h0Vm9sdW1lID0gcmlnaHQ7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KTsKKyAgICBtVm9sdW1lID0gdm9sdW1lOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPnNldFZvbHVtZSh2b2x1bWUpOwogICAgIH0KIH0KIApAQCAtNTQwLDEyICs0NDgsMTIgQEAKICAgICBBTE9HVigic2V0UGxheWJhY2tSYXRlKCVmICVmICVkICVkKSIsCiAgICAgICAgICAgICAgICAgcmF0ZS5tU3BlZWQsIHJhdGUubVBpdGNoLCByYXRlLm1GYWxsYmFja01vZGUsIHJhdGUubVN0cmV0Y2hNb2RlKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSAwKSB7CiAgICAgICAgIC8vIHJlbWVtYmVyIHJhdGUgc28gdGhhdCB3ZSBjYW4gc2V0IGl0IHdoZW4gdGhlIHRyYWNrIGlzIG9wZW5lZAogICAgICAgICBtUGxheWJhY2tSYXRlID0gcmF0ZTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KLSAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2stPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKKyAgICBzdGF0dXNfdCByZXMgPSBtSkF1ZGlvVHJhY2stPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKICAgICBpZiAocmVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQpAQCAtNTU5LDEyICs0NjcsMTIgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFBsYXliYWNrUmF0ZShBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSkgewotICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUiKTsKKyAgICBBTE9HVigiZ2V0UGxheWJhY2tSYXRlIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgKnJhdGUgPSBtVHJhY2stPmdldFBsYXliYWNrUmF0ZSgpOworICAgICpyYXRlID0gbUpBdWRpb1RyYWNrLT5nZXRQbGF5YmFja1JhdGUoKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTU3Miw4ICs0ODAsOCBAQAogICAgIEFMT0dWKCJzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoJWYpIiwgbGV2ZWwpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBtU2VuZExldmVsID0gbGV2ZWw7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChsZXZlbCk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChsZXZlbCk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTU4Miw0NCArNDkwLDYzIEBACiAgICAgQUxPR1YoImF0dGFjaEF1eEVmZmVjdCglZCkiLCBlZmZlY3RJZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIG1BdXhFZmZlY3RJZCA9IGVmZmVjdElkOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICByZXR1cm4gbVRyYWNrLT5hdHRhY2hBdXhFZmZlY3QoZWZmZWN0SWQpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5hdHRhY2hBdXhFZmZlY3QoZWZmZWN0SWQpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgewotICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoJWQpIiwgZGV2aWNlSWQpOworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldFByZWZlcnJlZERldmljZShqb2JqZWN0IGRldmljZSkgeworICAgIEFMT0dWKCJzZXRQcmVmZXJyZWREZXZpY2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgbVNlbGVjdGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1UcmFjay0+c2V0T3V0cHV0RGV2aWNlKGRldmljZUlkKTsKKyAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0ID0gbUpBdWRpb1RyYWNrLT5zZXRQcmVmZXJyZWREZXZpY2UoZGV2aWNlKTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbVByZWZlcnJlZERldmljZSA9IG5ldyBKT2JqZWN0SG9sZGVyKGRldmljZSk7CisgICAgfQorICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCkgewotICAgIEFMT0dWKCJnZXRSb3V0ZWREZXZpY2VJZCIpOworam9iamVjdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0Um91dGVkRGV2aWNlKCkgeworICAgIEFMT0dWKCJnZXRSb3V0ZWREZXZpY2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1Sb3V0ZWREZXZpY2VJZCA9IG1UcmFjay0+Z2V0Um91dGVkRGV2aWNlSWQoKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+Z2V0Um91dGVkRGV2aWNlKCk7CiAgICAgfQotICAgICpkZXZpY2VJZCA9IG1Sb3V0ZWREZXZpY2VJZDsKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjplbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkgewotICAgIEFMT0dWKCJlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrLCAlZCIsIGVuYWJsZWQpOworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBqUm91dGluZ0RlbGVnYXRlKSB7CisgICAgQUxPR1YoImFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2siKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgbURldmljZUNhbGxiYWNrRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1czsKLSAgICAgICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG1UcmFjay0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2sucHJvbW90ZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG1UcmFjay0+cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2sucHJvbW90ZSgpKTsKKyAgICBqb2JqZWN0IGxpc3RlbmVyID0gSkF1ZGlvVHJhY2s6OmdldExpc3RlbmVyKGpSb3V0aW5nRGVsZWdhdGUpOworICAgIGlmIChKQXVkaW9UcmFjazo6ZmluZEJ5S2V5KG1Sb3V0aW5nRGVsZWdhdGVzLCBsaXN0ZW5lcikgPT0gbnVsbHB0cikgeworICAgICAgICBzcDxKT2JqZWN0SG9sZGVyPiBsaXN0ZW5lckhvbGRlciA9IG5ldyBKT2JqZWN0SG9sZGVyKGxpc3RlbmVyKTsKKyAgICAgICAgam9iamVjdCBoYW5kbGVyID0gSkF1ZGlvVHJhY2s6OmdldEhhbmRsZXIoalJvdXRpbmdEZWxlZ2F0ZSk7CisgICAgICAgIHNwPEpPYmplY3RIb2xkZXI+IHJvdXRpbmdEZWxlZ2F0ZUhvbGRlciA9IG5ldyBKT2JqZWN0SG9sZGVyKGpSb3V0aW5nRGVsZWdhdGUpOworCisgICAgICAgIG1Sb3V0aW5nRGVsZWdhdGVzLnB1c2hfYmFjayhzdGQ6OnBhaXI8c3A8Sk9iamVjdEhvbGRlcj4sIHNwPEpPYmplY3RIb2xkZXI+PigKKyAgICAgICAgICAgICAgICBsaXN0ZW5lckhvbGRlciwgcm91dGluZ0RlbGVnYXRlSG9sZGVyKSk7CisKKyAgICAgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5hZGRBdWRpb0RldmljZUNhbGxiYWNrKAorICAgICAgICAgICAgICAgICAgICByb3V0aW5nRGVsZWdhdGVIb2xkZXItPmdldEpPYmplY3QoKSwgaGFuZGxlcik7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyKSB7CisgICAgQUxPR1YoInJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2siKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgam9iamVjdCByb3V0aW5nRGVsZWdhdGUgPSBudWxscHRyOworICAgIGlmICgocm91dGluZ0RlbGVnYXRlID0gSkF1ZGlvVHJhY2s6OmZpbmRCeUtleShtUm91dGluZ0RlbGVnYXRlcywgbGlzdGVuZXIpKSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUpBdWRpb1RyYWNrLT5yZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHJvdXRpbmdEZWxlZ2F0ZSk7CisgICAgICAgIH0KKyAgICAgICAgSkF1ZGlvVHJhY2s6OmVyYXNlQnlLZXkobVJvdXRpbmdEZWxlZ2F0ZXMsIGxpc3RlbmVyKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtNjMyLDIxICs1NTksMjEgQEAKICAgICAvLyBsb2NrIHRvIGVuc3VyZSB3ZSBhcmVuJ3QgY2F1Z2h0IGluIHRoZSBtaWRkbGUgb2YgYSB0cmFjayBzd2l0Y2guCiAgICAgZGF0YS0+bG9jaygpOwogICAgIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0ICptZSA9IGRhdGEtPmdldE91dHB1dCgpOwotICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciAqYnVmZmVyID0gKEF1ZGlvVHJhY2s6OkJ1ZmZlciAqKWluZm87Ci0gICAgaWYgKG1lID09IE5VTEwpIHsKKyAgICBKQXVkaW9UcmFjazo6QnVmZmVyICpidWZmZXIgPSAoSkF1ZGlvVHJhY2s6OkJ1ZmZlciAqKWluZm87CisgICAgaWYgKG1lID09IG51bGxwdHIpIHsKICAgICAgICAgLy8gbm8gb3V0cHV0IHNldCwgbGlrZWx5IGJlY2F1c2UgdGhlIHRyYWNrIHdhcyBzY2hlZHVsZWQgdG8gYmUgcmV1c2VkCiAgICAgICAgIC8vIGJ5IGFub3RoZXIgcGxheWVyLCBidXQgdGhlIGZvcm1hdCB0dXJuZWQgb3V0IHRvIGJlIGluY29tcGF0aWJsZS4KICAgICAgICAgZGF0YS0+dW5sb2NrKCk7Ci0gICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgYnVmZmVyLT5zaXplID0gMDsKKyAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBidWZmZXItPm1TaXplID0gMDsKICAgICAgICAgfQogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgc3dpdGNoKGV2ZW50KSB7Ci0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEE6IHsKKyAgICBjYXNlIEpBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEE6IHsKICAgICAgICAgc2l6ZV90IGFjdHVhbFNpemUgPSAoKm1lLT5tQ2FsbGJhY2spKAotICAgICAgICAgICAgICAgIG1lLCBidWZmZXItPnJhdywgYnVmZmVyLT5zaXplLCBtZS0+bUNhbGxiYWNrQ29va2llLAorICAgICAgICAgICAgICAgIG1lLCBidWZmZXItPm1EYXRhLCBidWZmZXItPm1TaXplLCBtZS0+bUNhbGxiYWNrQ29va2llLAogICAgICAgICAgICAgICAgIENCX0VWRU5UX0ZJTExfQlVGRkVSKTsKIAogICAgICAgICAvLyBMb2cgd2hlbiBubyBkYXRhIGlzIHJldHVybmVkIGZyb20gdGhlIGNhbGxiYWNrLgpAQCAtNjU4LDI1ICs1ODUsMjUgQEAKICAgICAgICAgLy8gVGhpcyBpcyBhIGJlbmlnbiBidXN5LXdhaXQsIHdpdGggdGhlIG5leHQgZGF0YSByZXF1ZXN0IGdlbmVyYXRlZCAxMCBtcyBvciBtb3JlIGxhdGVyOwogICAgICAgICAvLyBuZXZlcnRoZWxlc3MgZm9yIHBvd2VyIHJlYXNvbnMsIHdlIGRvbid0IHdhbnQgdG8gc2VlIHRvbyBtYW55IG9mIHRoZXNlLgogCi0gICAgICAgIEFMT0dWX0lGKGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPnNpemUgPiAwLCAiY2FsbGJhY2t3cmFwcGVyOiBlbXB0eSBidWZmZXIgcmV0dXJuZWQiKTsKKyAgICAgICAgQUxPR1ZfSUYoYWN0dWFsU2l6ZSA9PSAwICYmIGJ1ZmZlci0+bVNpemUgPiAwLCAiY2FsbGJhY2t3cmFwcGVyOiBlbXB0eSBidWZmZXIgcmV0dXJuZWQiKTsKIAotICAgICAgICBidWZmZXItPnNpemUgPSBhY3R1YWxTaXplOworICAgICAgICBidWZmZXItPm1TaXplID0gYWN0dWFsU2l6ZTsKICAgICAgICAgfSBicmVhazsKIAotICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfU1RSRUFNX0VORDoKKyAgICBjYXNlIEpBdWRpb1RyYWNrOjpFVkVOVF9TVFJFQU1fRU5EOgogICAgICAgICAvLyBjdXJyZW50bHkgb25seSBvY2N1cnMgZm9yIG9mZmxvYWRlZCBjYWxsYmFja3MKICAgICAgICAgQUxPR1YoImNhbGxiYWNrd3JhcHBlcjogZGVsaXZlciBFVkVOVF9TVFJFQU1fRU5EIik7Ci0gICAgICAgICgqbWUtPm1DYWxsYmFjaykobWUsIE5VTEwgLyogYnVmZmVyICovLCAwIC8qIHNpemUgKi8sCisgICAgICAgICgqbWUtPm1DYWxsYmFjaykobWUsIG51bGxwdHIgLyogYnVmZmVyICovLCAwIC8qIHNpemUgKi8sCiAgICAgICAgICAgICAgICAgbWUtPm1DYWxsYmFja0Nvb2tpZSwgQ0JfRVZFTlRfU1RSRUFNX0VORCk7CiAgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9ORVdfSUFVRElPVFJBQ0sgOgorICAgIGNhc2UgSkF1ZGlvVHJhY2s6OkVWRU5UX05FV19JQVVESU9UUkFDSyA6CiAgICAgICAgIEFMT0dWKCJjYWxsYmFja3dyYXBwZXI6IGRlbGl2ZXIgRVZFTlRfVEVBUl9ET1dOIik7Ci0gICAgICAgICgqbWUtPm1DYWxsYmFjaykobWUsICBOVUxMIC8qIGJ1ZmZlciAqLywgMCAvKiBzaXplICovLAorICAgICAgICAoKm1lLT5tQ2FsbGJhY2spKG1lLCAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIDAgLyogc2l6ZSAqLywKICAgICAgICAgICAgICAgICBtZS0+bUNhbGxiYWNrQ29va2llLCBDQl9FVkVOVF9URUFSX0RPV04pOwogICAgICAgICBicmVhazsKIAotICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfVU5ERVJSVU46CisgICAgY2FzZSBKQXVkaW9UcmFjazo6RVZFTlRfVU5ERVJSVU46CiAgICAgICAgIC8vIFRoaXMgb2NjdXJzIHdoZW4gdGhlcmUgaXMgbm8gZGF0YSBhdmFpbGFibGUsIHR5cGljYWxseQogICAgICAgICAvLyB3aGVuIHRoZXJlIGlzIGEgZmFpbHVyZSB0byBzdXBwbHkgZGF0YSB0byB0aGUgQXVkaW9UcmFjay4gIEl0IGNhbiBhbHNvCiAgICAgICAgIC8vIG9jY3VyIGluIG5vbi1vZmZsb2FkZWQgbW9kZSB3aGVuIHRoZSBhdWRpbyBkZXZpY2UgY29tZXMgb3V0IG9mIHN0YW5kYnkuCkBAIC02OTYsMjkgKzYyMywzMSBAQAogICAgIGRhdGEtPnVubG9jaygpOwogfQogCi1hdWRpb19zZXNzaW9uX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFNlc3Npb25JZCgpIGNvbnN0Ci17CitpbnQzMl90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRTZXNzaW9uSWQoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIHJldHVybiBtU2Vzc2lvbklkOwogfQogCi11aW50MzJfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0U2FtcGxlUmF0ZSgpIGNvbnN0Ci17Cit2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRTZXNzaW9uSWQoY29uc3QgaW50MzJfdCBzZXNzaW9uSWQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5nZXRTYW1wbGVSYXRlKCk7CisgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKIH0KIAotaW50NjRfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0QnVmZmVyRHVyYXRpb25JblVzKCkgY29uc3QKLXsKK3VpbnQzMl90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRTYW1wbGVSYXRlKCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmdldFNhbXBsZVJhdGUoKTsKK30KKworaW50NjRfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0QnVmZmVyRHVyYXRpb25JblVzKCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IDApIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGludDY0X3QgZHVyYXRpb247Ci0gICAgaWYgKG1UcmFjay0+Z2V0QnVmZmVyRHVyYXRpb25JblVzKCZkdXJhdGlvbikgIT0gT0spIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrLT5nZXRCdWZmZXJEdXJhdGlvbkluVXMoJmR1cmF0aW9uKSAhPSBPSykgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgcmV0dXJuIGR1cmF0aW9uOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaAppbmRleCAzMDE4MjViLi4yZWQ0NjMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaApAQCAtMTcsMTkgKzE3LDIxIEBACiAjaWZuZGVmIEFORFJPSURfSkFVRElPVFJBQ0tfSAogI2RlZmluZSBBTkRST0lEX0pBVURJT1RSQUNLX0gKIAorI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8am5pLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL1ZvbHVtZVNoYXBlci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RpbWVzdGFtcC5oPiAgIC8vIEl0IGhhcyBkZXBlbmRlbmN5IG9uIGF1ZGlvLmgvRXJyb3JzLmgsIGJ1dCBkb2Vzbid0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIHRoZW0gaW4gaXQuIFRoZXJlZm9yZSBpdCBpcyBpbmNsdWRlZCBoZXJlIGF0IGxhc3QuCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgSkF1ZGlvVHJhY2sgeworY2xhc3MgSkF1ZGlvVHJhY2sgOiBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6CiAKICAgICAvKiBFdmVudHMgdXNlZCBieSBBdWRpb1RyYWNrIGNhbGxiYWNrIGZ1bmN0aW9uIChjYWxsYmFja190KS4KQEAgLTM3LDYgKzM5LDggQEAKICAgICAgKi8KICAgICBlbnVtIGV2ZW50X3R5cGUgewogICAgICAgICBFVkVOVF9NT1JFX0RBVEEgPSAwLCAgICAgICAgLy8gUmVxdWVzdCB0byB3cml0ZSBtb3JlIGRhdGEgdG8gYnVmZmVyLgorICAgICAgICBFVkVOVF9VTkRFUlJVTiA9IDEsICAgICAgICAgLy8gQnVmZmVyIHVuZGVycnVuIG9jY3VycmVkLiBUaGlzIHdpbGwgbm90IG9jY3VyIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdGljIHRyYWNrcy4KICAgICAgICAgRVZFTlRfTkVXX0lBVURJT1RSQUNLID0gNiwgIC8vIElBdWRpb1RyYWNrIHdhcyByZS1jcmVhdGVkLCBlaXRoZXIgZHVlIHRvIHJlLXJvdXRpbmcgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2b2x1bnRhcnkgaW52YWxpZGF0aW9uIGJ5IG1lZGlhc2VydmVyLCBvciBtZWRpYXNlcnZlciBjcmFzaC4KICAgICAgICAgRVZFTlRfU1RSRUFNX0VORCA9IDcsICAgICAgIC8vIFNlbnQgYWZ0ZXIgYWxsIHRoZSBidWZmZXJzIHF1ZXVlZCBpbiBBRiBhbmQgSFcgYXJlIHBsYXllZApAQCAtMTA0LDE1ICsxMDgsMTQgQEAKICAgICAgKgogICAgICAqIFRPRE86IFJldml2ZSByZW1vdmVkIGFyZ3VtZW50cyBhZnRlciBvZmZsb2FkIG1vZGUgaXMgc3VwcG9ydGVkLgogICAgICAqLwotICAgIEpBdWRpb1RyYWNrKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgIEpBdWRpb1RyYWNrKHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmLAogICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIsCiAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAwLAotICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKLSAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKKyAgICAgICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAorICAgICAgICAgICAgICAgIGNvbnN0IGpvYmplY3QgcEF0dHJpYnV0ZXMgPSBOVUxMLAogICAgICAgICAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQgPSAxLjBmKTsKIAogICAgIC8qCkBAIC0xNTgsMTAgKzE2MSwxMCBAQAogICAgICAqIENhdXRpb246IGNhbGxpbmcgdGhpcyBtZXRob2QgdG9vIG9mdGVuIG1heSBiZSBpbmVmZmljaWVudDsKICAgICAgKiBpZiB5b3UgbmVlZCBhIGhpZ2ggcmVzb2x1dGlvbiBtYXBwaW5nIGJldHdlZW4gZnJhbWUgcG9zaXRpb24gYW5kIHByZXNlbnRhdGlvbiB0aW1lLAogICAgICAqIGNvbnNpZGVyIGltcGxlbWVudGluZyB0aGF0IGF0IGFwcGxpY2F0aW9uIGxldmVsLCBiYXNlZCBvbiB0aGUgbG93IHJlc29sdXRpb24gdGltZXN0YW1wcy4KLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGltZXN0YW1wIGlzIHZhbGlkLgotICAgICAqIFRoZSB0aW1lc3RhbXAgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCBvbiByZXR1cm4sIGlmIGZhbHNlIGlzIHJldHVybmVkLgorICAgICAqIFJldHVybnMgTk9fRVJST1IgaWYgdGltZXN0YW1wIGlzIHZhbGlkLgorICAgICAqICAgICAgICAgTk9fSU5JVCBpZiBmaW5kcyBlcnJvciwgYW5kIHRpbWVzdGFtcCBwYXJhbWV0ZXIgd2lsbCBiZSB1bmRlZmluZWQgb24gcmV0dXJuLgogICAgICAqLwotICAgIGJvb2wgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApOworICAgIHN0YXR1c190IGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKTsKIAogICAgIC8vIFRPRE86IFRoaXMgZG9jIGlzIGp1c3QgY29waWVkIGZyb20gQXVkaW9UcmFjay5oLiBSZXZpc2UgaXQgYWZ0ZXIgaW1wbGVtZW5hdGlvbi4KICAgICAvKiBSZXR1cm4gdGhlIGV4dGVuZGVkIHRpbWVzdGFtcCwgd2l0aCBhZGRpdGlvbmFsIHRpbWViYXNlIGluZm8gYW5kIGltcHJvdmVkIGRyYWluIGJlaGF2aW9yLgpAQCAtMzI0LDM3ICszMjcsNDMgQEAKIAogICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCgpOwogCisgICAgc2l6ZV90IGZyYW1lU2l6ZSgpOworCiAgICAgLyoKICAgICAgKiBEdW1wcyB0aGUgc3RhdGUgb2YgYW4gYXVkaW8gdHJhY2suCiAgICAgICogTm90IGEgZ2VuZXJhbC1wdXJwb3NlIEFQSTsgaW50ZW5kZWQgb25seSBmb3IgdXNlIGJ5IG1lZGlhIHBsYXllciBzZXJ2aWNlIHRvIGR1bXAgaXRzIHRyYWNrcy4KICAgICAgKi8KICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAKLSAgICAvKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgYXVkaW8gZGV2aWNlIGFjdHVhbGx5IHVzZWQgYnkgdGhlIG91dHB1dCB0byB3aGljaCB0aGlzIEF1ZGlvVHJhY2sgaXMKLSAgICAgKiBhdHRhY2hlZC4gV2hlbiB0aGUgQXVkaW9UcmFjayBpcyBpbmFjdGl2ZSwgaXQgd2lsbCByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORS4KKyAgICAvKiBSZXR1cm5zIHRoZSBBdWRpb0RldmljZUluZm8gdXNlZCBieSB0aGUgb3V0cHV0IHRvIHdoaWNoIHRoaXMgQXVkaW9UcmFjayBpcworICAgICAqIGF0dGFjaGVkLgogICAgICAqLwotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0Um91dGVkRGV2aWNlSWQoKTsKKyAgICBqb2JqZWN0IGdldFJvdXRlZERldmljZSgpOwogCiAgICAgLyogUmV0dXJucyB0aGUgSUQgb2YgdGhlIGF1ZGlvIHNlc3Npb24gdGhpcyBBdWRpb1RyYWNrIGJlbG9uZ3MgdG8uICovCi0gICAgYXVkaW9fc2Vzc2lvbl90IGdldEF1ZGlvU2Vzc2lvbklkKCk7CisgICAgaW50MzJfdCBnZXRBdWRpb1Nlc3Npb25JZCgpOwogCi0gICAgLyogU2VsZWN0cyB0aGUgYXVkaW8gZGV2aWNlIHRvIHVzZSBmb3Igb3V0cHV0IG9mIHRoaXMgQXVkaW9UcmFjay4gQSB2YWx1ZSBvZgotICAgICAqIEFVRElPX1BPUlRfSEFORExFX05PTkUgaW5kaWNhdGVzIGRlZmF1bHQgcm91dGluZy4KKyAgICAvKiBTZXRzIHRoZSBwcmVmZXJyZWQgYXVkaW8gZGV2aWNlIHRvIHVzZSBmb3Igb3V0cHV0IG9mIHRoaXMgQXVkaW9UcmFjay4KICAgICAgKgogICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogIFRoZSBkZXZpY2UgSUQgb2YgdGhlIHNlbGVjdGVkIGRldmljZSAoYXMgcmV0dXJuZWQgYnkgdGhlIEF1ZGlvRGV2aWNlc01hbmFnZXIgQVBJKS4KKyAgICAgKiBEZXZpY2U6IGFuIEF1ZGlvRGV2aWNlSW5mbyBvYmplY3QuCiAgICAgICoKICAgICAgKiBSZXR1cm5lZCB2YWx1ZToKICAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24KLSAgICAgKiAgLSBCQURfVkFMVUU6IGZhaWxlZCB0byBmaW5kIHRoZSB2YWxpZCBvdXRwdXQgZGV2aWNlIHdpdGggZ2l2ZW4gZGV2aWNlIElkLgorICAgICAqICAtIEJBRF9WQUxVRTogZmFpbGVkIHRvIHNldCB0aGUgZGV2aWNlCiAgICAgICovCi0gICAgc3RhdHVzX3Qgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOworICAgIHN0YXR1c190IHNldFByZWZlcnJlZERldmljZShqb2JqZWN0IGRldmljZSk7CiAKICAgICAvLyBUT0RPOiBBZGQgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHdoZW4gaXQgaXMgcG9zc2libGUgdG8gY2hlY2suCiAgICAgLy8gVE9ETzogQWRkIEFVRElPX0ZMQUdfSFdfQVZfU1lOQyB3aGVuIGl0IGlzIHBvc3NpYmxlIHRvIGNoZWNrLgogICAgIC8qIFJldHVybnMgdGhlIGZsYWdzICovCiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KIAorICAgIC8qIFdlIGRvbid0IGtlZXAgc3RyZWFtIHR5cGUgaGVyZSwKKyAgICAgKiBpbnN0ZWFkLCB3ZSBrZWVwIGF0dHJpYnV0ZXMgYW5kIGNhbGwgZ2V0Vm9sdW1lQ29udHJvbFN0cmVhbSgpIHRvIGdldCBzdHJlYW0gdHlwZQorICAgICAqLworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCk7CisKICAgICAvKiBPYnRhaW4gdGhlIHBlbmRpbmcgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIGZvciBwbGF5YmFjayBvZiBwdXJlIFBDTSBkYXRhIHJlbWFpbmluZyBpbgogICAgICAqIEF1ZGlvVHJhY2suCiAgICAgICoKQEAgLTM2OSwyNyArMzc4LDYwIEBACiAgICAgICogUmVwbGFjZXMgYW55IHByZXZpb3VzbHkgaW5zdGFsbGVkIGNhbGxiYWNrLgogICAgICAqCiAgICAgICogUGFyYW1ldGVyczoKLSAgICAgKgotICAgICAqIGNhbGxiYWNrOiBUaGUgY2FsbGJhY2sgaW50ZXJmYWNlCisgICAgICogTGlzdGVuZXI6IHRoZSBsaXN0ZW5lciB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiByZXJvdXRpbmcgZXZlbnRzLgorICAgICAqIEhhbmRsZXI6IHRoZSBoYW5kbGVyIHRvIGhhbmRsZXIgdGhlIHJlcm91dGluZyBldmVudHMuCiAgICAgICoKICAgICAgKiBSZXR1cm5zIE5PX0VSUk9SIGlmIHN1Y2Nlc3NmdWwuCi0gICAgICogICAgICAgICBJTlZBTElEX09QRVJBVElPTiBpZiB0aGUgc2FtZSBjYWxsYmFjayBpcyBhbHJlYWR5IGluc3RhbGxlZC4KLSAgICAgKiAgICAgICAgIE5PX0lOSVQgb3IgUFJFTUlTU0lPTl9ERU5JRUQgaWYgQXVkaW9GbGluZ2VyIHNlcnZpY2UgaXMgbm90IHJlYWNoYWJsZQotICAgICAqICAgICAgICAgQkFEX1ZBTFVFIGlmIHRoZSBjYWxsYmFjayBpcyBOVUxMCisgICAgICogICAgICAgICAoVE9ETykgSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlIHNhbWUgY2FsbGJhY2sgaXMgYWxyZWFkeSBpbnN0YWxsZWQuCisgICAgICogICAgICAgICAoVE9ETykgTk9fSU5JVCBvciBQUkVNSVNTSU9OX0RFTklFRCBpZiBBdWRpb0ZsaW5nZXIgc2VydmljZSBpcyBub3QgcmVhY2hhYmxlCisgICAgICogICAgICAgICAoVE9ETykgQkFEX1ZBTFVFIGlmIHRoZSBjYWxsYmFjayBpcyBOVUxMCiAgICAgICovCi0gICAgc3RhdHVzX3QgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIsIGpvYmplY3QgcmQpOwogCiAgICAgLyogUmVtb3ZlcyBhbiBBdWRpb0RldmljZUNhbGxiYWNrLgogICAgICAqCiAgICAgICogUGFyYW1ldGVyczoKLSAgICAgKgotICAgICAqIGNhbGxiYWNrOiBUaGUgY2FsbGJhY2sgaW50ZXJmYWNlCisgICAgICogTGlzdGVuZXI6IHRoZSBsaXN0ZW5lciB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiByZXJvdXRpbmcgZXZlbnRzLgogICAgICAqCiAgICAgICogUmV0dXJucyBOT19FUlJPUiBpZiBzdWNjZXNzZnVsLgotICAgICAqICAgICAgICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlIGNhbGxiYWNrIGlzIG5vdCBpbnN0YWxsZWQKLSAgICAgKiAgICAgICAgIEJBRF9WQUxVRSBpZiB0aGUgY2FsbGJhY2sgaXMgTlVMTAorICAgICAqICAgICAgICAgKFRPRE8pIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBjYWxsYmFjayBpcyBub3QgaW5zdGFsbGVkCisgICAgICogICAgICAgICAoVE9ETykgQkFEX1ZBTFVFIGlmIHRoZSBjYWxsYmFjayBpcyBOVUxMCiAgICAgICovCi0gICAgc3RhdHVzX3QgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIpOworCisgICAgLyogUmVnaXN0ZXIgYWxsIGJhY2tlZC11cCByb3V0aW5nIGRlbGVnYXRlcy4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogcm91dGluZ0RlbGVnYXRlczogYmFja2VkLXVwIHJvdXRpbmcgZGVsZWdhdGVzCisgICAgICoKKyAgICAgKi8KKyAgICB2b2lkIHJlZ2lzdGVyUm91dGluZ0RlbGVnYXRlcygKKyAgICAgICAgICAgIFZlY3RvcjxzdGQ6OnBhaXI8c3A8Sk9iamVjdEhvbGRlcj4sIHNwPEpPYmplY3RIb2xkZXI+Pj4mIHJvdXRpbmdEZWxlZ2F0ZXMpOworCisgICAgLyogZ2V0IGxpc3RlbmVyIGZyb20gUm91dGluZ0RlbGVnYXRlIG9iamVjdAorICAgICAqLworICAgIHN0YXRpYyBqb2JqZWN0IGdldExpc3RlbmVyKGNvbnN0IGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlT2JqKTsKKworICAgIC8qIGdldCBoYW5kbGVyIGZyb20gUm91dGluZ0RlbGVnYXRlIG9iamVjdAorICAgICAqLworICAgIHN0YXRpYyBqb2JqZWN0IGdldEhhbmRsZXIoY29uc3Qgam9iamVjdCByb3V0aW5nRGVsZWdhdGVPYmopOworCisgICAgLyoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqIG1hcCBhbmQga2V5CisgICAgICoKKyAgICAgKiBSZXR1cm5zIHZhbHVlIGlmIGtleSBpcyBpbiB0aGUgbWFwCisgICAgICogICAgICAgICBudWxscHRyIGlmIGtleSBpcyBub3QgaW4gdGhlIG1hcAorICAgICAqLworICAgIHN0YXRpYyBqb2JqZWN0IGZpbmRCeUtleSgKKyAgICAgICAgICAgIFZlY3RvcjxzdGQ6OnBhaXI8c3A8Sk9iamVjdEhvbGRlcj4sIHNwPEpPYmplY3RIb2xkZXI+Pj4mIG1wLCBjb25zdCBqb2JqZWN0IGtleSk7CisKKyAgICAvKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogbWFwIGFuZCBrZXkKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBlcmFzZUJ5S2V5KAorICAgICAgICAgICAgVmVjdG9yPHN0ZDo6cGFpcjxzcDxKT2JqZWN0SG9sZGVyPiwgc3A8Sk9iamVjdEhvbGRlcj4+PiYgbXAsIGNvbnN0IGpvYmplY3Qga2V5KTsKIAogcHJpdmF0ZToKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBtRmxhZ3M7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmN2Y4MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KTWVkaWEySFRUUENvbm5lY3Rpb24uaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9KX01FRElBMl9IVFRQX0NPTk5FQ1RJT05fSF8KKyNkZWZpbmUgX0pfTUVESUEyX0hUVFBfQ09OTkVDVElPTl9IXworCisjaW5jbHVkZSAiam5pLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBKTWVkaWEySFRUUENvbm5lY3Rpb24gOiBwdWJsaWMgTWVkaWFIVFRQQ29ubmVjdGlvbiB7CisgICAgSk1lZGlhMkhUVFBDb25uZWN0aW9uKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopOworCisgICAgdmlydHVhbCBib29sIGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgb2ZmNjRfdCBnZXRTaXplKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNSU1FVHlwZShTdHJpbmc4ICptaW1lVHlwZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVcmkoU3RyaW5nOCAqdXJpKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkpNZWRpYTJIVFRQQ29ubmVjdGlvbigpOworCitwcml2YXRlOgorICAgIGpvYmplY3QgbU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqOworICAgIGptZXRob2RJRCBtQ29ubmVjdE1ldGhvZDsKKyAgICBqbWV0aG9kSUQgbURpc2Nvbm5lY3RNZXRob2Q7CisgICAgam1ldGhvZElEIG1SZWFkQXRNZXRob2Q7CisgICAgam1ldGhvZElEIG1HZXRTaXplTWV0aG9kOworICAgIGptZXRob2RJRCBtR2V0TUlNRVR5cGVNZXRob2Q7CisgICAgam1ldGhvZElEIG1HZXRVcmlNZXRob2Q7CisKKyAgICBqYnl0ZUFycmF5IG1CeXRlQXJyYXlPYmo7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhKTWVkaWEySFRUUENvbm5lY3Rpb24pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBfSl9NRURJQTJfSFRUUF9DT05ORUNUSU9OX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY2MWE3ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9KX01FRElBMl9IVFRQX1NFUlZJQ0VfSF8KKyNkZWZpbmUgX0pfTUVESUEyX0hUVFBfU0VSVklDRV9IXworCisjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEpNZWRpYTJIVFRQU2VydmljZSA6IHB1YmxpYyBNZWRpYUhUVFBTZXJ2aWNlIHsKKyAgICBKTWVkaWEySFRUUFNlcnZpY2UoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeik7CisKKyAgICB2aXJ0dWFsIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IG1ha2VIVFRQQ29ubmVjdGlvbigpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Sk1lZGlhMkhUVFBTZXJ2aWNlKCk7CisKK3ByaXZhdGU6CisgICAgam9iamVjdCBtTWVkaWEySFRUUFNlcnZpY2VPYmo7CisKKyAgICBqbWV0aG9kSUQgbU1ha2VIVFRQQ29ubmVjdGlvbk1ldGhvZDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEpNZWRpYTJIVFRQU2VydmljZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIF9KX01FRElBMl9IVFRQX1NFUlZJQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZDhiNDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSk9CSkVDVF9IT0xERVJfSF8KKworI2RlZmluZSBKT0JKRUNUX0hPTERFUl9IXworCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBIZWxwZXIgY2xhc3MgZm9yIG1hbmFnaW5nIGdsb2JhbCByZWZlcmVuY2Ugb2Ygam9iamVjdC4KK3N0cnVjdCBKT2JqZWN0SG9sZGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIEpPYmplY3RIb2xkZXIoam9iamVjdCBvYmopIHsKKyAgICAgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgICAgICBtSk9iamVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8am9iamVjdD4oZW52LT5OZXdHbG9iYWxSZWYob2JqKSk7CisgICAgfQorCisgICAgdmlydHVhbCB+Sk9iamVjdEhvbGRlcigpIHsKKyAgICAgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgICAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtSk9iamVjdCk7CisgICAgfQorCisgICAgam9iamVjdCBnZXRKT2JqZWN0KCkgeyByZXR1cm4gbUpPYmplY3Q7IH0KKworcHJpdmF0ZToKKyAgICBqb2JqZWN0IG1KT2JqZWN0OworfTsKKworfSAgLy8iIGFuZHJvaWQKKworI2VuZGlmICAvLyBKT0JKRUNUX0hPTERFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNTZhY2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBKQVZBX1ZNX0hFTFBFUl9IXworCisjZGVmaW5lIEpBVkFfVk1fSEVMUEVSX0hfCisKKyNpbmNsdWRlICJqbmkuaCIKKworI2luY2x1ZGUgPGF0b21pYz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgSmF2YVZNSGVscGVyIHsKKyAgICBzdGF0aWMgSk5JRW52ICpnZXRKTklFbnYoKTsKKyAgICBzdGF0aWMgSmF2YVZNICpnZXRKYXZhVk0oKTsKKyAgICBzdGF0aWMgdm9pZCBzZXRKYXZhVk0oSmF2YVZNICp2bSk7CisKK3ByaXZhdGU6CisgICAgLy8gT25jZSBhIHZhbGlkIEphdmFWTSBoYXMgYmVlbiBzZXQsIGl0IHNob3VsZCBuZXZlciBiZSByZXNldCBvciBjaGFuZ2VkLgorICAgIC8vIEhvd2V2ZXIsIGFzIGl0IG1heSBiZSBhY2Nlc3NlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMsIGFjY2VzcyBuZWVkcyB0byBiZQorICAgIC8vIHN5bmNocm9uaXplZC4KKyAgICBzdGF0aWMgc3RkOjphdG9taWM8SmF2YVZNICo+IHNKYXZhVk07Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEpBVkFfVk1fSEVMUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5oCmluZGV4IDVkNWI4ZTQuLmYzOGI3Y2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5oCkBAIC0xOSwxMCArMTksMTUgQEAKICNkZWZpbmUgQU5EUk9JRF9NRURJQVBMQVlFUjJBVURJT09VVFBVVF9ICiAKICNpbmNsdWRlIDxtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaD4KIAorI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAorI2luY2x1ZGUgImpuaS5oIgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIEF1ZGlvVHJhY2s7CkBAIC0zMiwxNSArMzcsMTQgQEAKICAgICBjbGFzcyBDYWxsYmFja0RhdGE7CiAKIHB1YmxpYzoKLSAgICBNZWRpYVBsYXllcjJBdWRpb091dHB1dChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KGludDMyX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBkZXZpY2VDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzKTsKICAgICB2aXJ0dWFsIH5NZWRpYVBsYXllcjJBdWRpb091dHB1dCgpOwogCiAgICAgdmlydHVhbCBib29sIHJlYWR5KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVRyYWNrICE9IDA7CisgICAgICAgIHJldHVybiBtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cjsKICAgICB9CiAgICAgdmlydHVhbCBzc2l6ZV90IGJ1ZmZlclNpemUoKSBjb25zdDsKICAgICB2aXJ0dWFsIHNzaXplX3QgZnJhbWVDb3VudCgpIGNvbnN0OwpAQCAtNTIsMTcgKzU2LDE3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdDsKICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0UGxheWVkT3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSBjb25zdDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0OwotICAgIHZpcnR1YWwgYXVkaW9fc2Vzc2lvbl90IGdldFNlc3Npb25JZCgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50MzJfdCBnZXRTZXNzaW9uSWQoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0U2Vzc2lvbklkKGNvbnN0IGludDMyX3QgaWQpOwogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgaW50NjRfdCBnZXRCdWZmZXJEdXJhdGlvbkluVXMoKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgYnVmZmVyQ291bnQsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsCiAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAotICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCA9IGZhbHNlLAogICAgICAgICAgICAgdWludDMyX3Qgc3VnZ2VzdGVkRnJhbWVDb3VudCA9IDApOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwpAQCAtNzEsMTMgKzc1LDEwIEBACiAgICAgdmlydHVhbCB2b2lkIGZsdXNoKCk7CiAgICAgdmlydHVhbCB2b2lkIHBhdXNlKCk7CiAgICAgdmlydHVhbCB2b2lkIGNsb3NlKCk7Ci0gICAgdm9pZCBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKTsKLSAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVN0cmVhbVR5cGU7Ci0gICAgfQotICAgIHZvaWQgc2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHJpYnV0ZXMpOworICAgIHZvaWQgc2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcyk7CisgICAgdmlydHVhbCBhdWRpb19zdHJlYW1fdHlwZV90IGdldEF1ZGlvU3RyZWFtVHlwZSgpIGNvbnN0OwogCi0gICAgdm9pZCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOworICAgIHZvaWQgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGxheWJhY2tSYXRlKEF1ZGlvUGxheWJhY2tSYXRlKiByYXRlIC8qIG5vbm51bGwgKi8pOwogCkBAIC05MiwxMyArOTMsMTEgQEAKICAgICAgICAgLy8gVE9ETzogcmV0dXJuIGNvcnJlY3QgdmFsdWUuCiAgICAgICAgIC8vcmV0dXJuIG1OZXh0T3V0cHV0ID09IE5VTEw7CiAgICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLQogICAgIC8vIEF1ZGlvUm91dGluZwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkRGV2aWNlKGpvYmplY3QgZGV2aWNlKTsKKyAgICB2aXJ0dWFsIGpvYmplY3QgZ2V0Um91dGVkRGV2aWNlKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lcik7CiAKIHByaXZhdGU6CiAgICAgc3RhdGljIHZvaWQgc2V0TWluQnVmZmVyQ291bnQoKTsKQEAgLTEwNywzMCArMTA2LDI4IEBACiAgICAgdm9pZCBjbG9zZV9sKCk7CiAgICAgc3RhdHVzX3QgdXBkYXRlVHJhY2tfbCgpOwogCi0gICAgc3A8QXVkaW9UcmFjaz4gICAgICAgICAgbVRyYWNrOworICAgIHNwPEpBdWRpb1RyYWNrPiAgICAgICAgIG1KQXVkaW9UcmFjazsKICAgICBBdWRpb0NhbGxiYWNrICAgICAgICAgICBtQ2FsbGJhY2s7CiAgICAgdm9pZCAqICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrQ29va2llOwogICAgIENhbGxiYWNrRGF0YSAqICAgICAgICAgIG1DYWxsYmFja0RhdGE7Ci0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgbVN0cmVhbVR5cGU7Ci0gICAgYXVkaW9fYXR0cmlidXRlc190ICogICAgbUF0dHJpYnV0ZXM7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbUxlZnRWb2x1bWU7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVJpZ2h0Vm9sdW1lOworICAgIHNwPEpPYmplY3RIb2xkZXI+ICAgICAgIG1BdHRyaWJ1dGVzOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1Wb2x1bWU7CiAgICAgQXVkaW9QbGF5YmFja1JhdGUgICAgICAgbVBsYXliYWNrUmF0ZTsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZUh6OyAvLyBzYW1wbGUgcmF0ZSBvZiB0aGUgY29udGVudCwgYXMgc2V0IGluIG9wZW4oKQogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lOwogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemU7Ci0gICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgbVNlc3Npb25JZDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOwogICAgIHVpZF90ICAgICAgICAgICAgICAgICAgIG1VaWQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbVBpZDsKICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1BdXhFZmZlY3RJZDsKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAgICBtRmxhZ3M7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbVNlbGVjdGVkRGV2aWNlSWQ7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbVJvdXRlZERldmljZUlkOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQ7Ci0gICAgd3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+ICAgICAgICBtRGV2aWNlQ2FsbGJhY2s7CisgICAgc3A8Sk9iamVjdEhvbGRlcj4gICAgICAgbVByZWZlcnJlZERldmljZTsKICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICBtTG9jazsKIAorICAgIC8vIDxsaXN0ZW5lciwgcm91dGluZ0RlbGVnYXRlPgorICAgIFZlY3RvcjxzdGQ6OnBhaXI8c3A8Sk9iamVjdEhvbGRlcj4sIHNwPEpPYmplY3RIb2xkZXI+Pj4gbVJvdXRpbmdEZWxlZ2F0ZXM7CisKICAgICAvLyBzdGF0aWMgdmFyaWFibGVzIGJlbG93IG5vdCBwcm90ZWN0ZWQgYnkgbXV0ZXgKICAgICBzdGF0aWMgYm9vbCAgICAgICAgICAgICBtSXNPbkVtdWxhdG9yOwogICAgIHN0YXRpYyBpbnQgICAgICAgICAgICAgIG1NaW5CdWZmZXJDb3VudDsgIC8vIDEyIGZvciBlbXVsYXRvcjsgb3RoZXJ3aXNlIDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaAppbmRleCAwMmJmODkxLi43ODA0YTYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oCkBAIC0yMywxNiArMjMsMjEgQEAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGpuaS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvQVZTeW5jU2V0dGluZ3MuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UaW1lc3RhbXAuaD4KICNpbmNsdWRlIDxtZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oPgotI2luY2x1ZGUgPG1lZGlhL01ldGFkYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgogI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oPgogCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAibWVkaWFwbGF5ZXIyLnBiLmgiCisKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjpNZWRpYVBsYXllcjJQcm90bzo6UGxheWVyTWVzc2FnZTsKKwogLy8gRndkIGRlY2wgdG8gbWFrZSBzdXJlIGV2ZXJ5b25lIGFncmVlcyB0aGF0IHRoZSBzY29wZSBvZiBzdHJ1Y3Qgc29ja2FkZHJfaW4gaXMKIC8vIGdsb2JhbCwgYW5kIG5vdCBpbiBhbmRyb2lkOjoKIHN0cnVjdCBzb2NrYWRkcl9pbjsKQEAgLTQzLDcgKzQ4LDYgQEAKIGNsYXNzIFBhcmNlbDsKIHN0cnVjdCBBTmF0aXZlV2luZG93V3JhcHBlcjsKIAotI2RlZmluZSBERUZBVUxUX0FVRElPU0lOS19CVUZGRVJDT1VOVCA0CiAjZGVmaW5lIERFRkFVTFRfQVVESU9TSU5LX0JVRkZFUlNJWkUgMTIwMAogI2RlZmluZSBERUZBVUxUX0FVRElPU0lOS19TQU1QTEVSQVRFIDQ0MTAwCiAKQEAgLTU2LDcgKzYwLDggQEAKIGNsYXNzIE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyOiBwdWJsaWMgUmVmQmFzZQogewogcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLAorICAgICAgICAgICBjb25zdCBQbGF5ZXJNZXNzYWdlICpvYmopID0gMDsKIH07CiAKIGNsYXNzIE1lZGlhUGxheWVyMkludGVyZmFjZSA6IHB1YmxpYyBBSGFuZGxlciB7CkBAIC04OCw3ICs5Myw3IEBACiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3QgPSAwOwogICAgICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0UGxheWVkT3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3QgPSAwOwotICAgICAgICB2aXJ0dWFsIGF1ZGlvX3Nlc3Npb25fdCBnZXRTZXNzaW9uSWQoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgaW50MzJfdCBnZXRTZXNzaW9uSWQoKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBpbnQ2NF90IGdldEJ1ZmZlckR1cmF0aW9uSW5VcygpIGNvbnN0ID0gMDsKQEAgLTk4LDEyICsxMDMsMTAgQEAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuKAogICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdD1BVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICBpbnQgYnVmZmVyQ291bnQ9REVGQVVMVF9BVURJT1NJTktfQlVGRkVSQ09VTlQsCiAgICAgICAgICAgICAgICAgQXVkaW9DYWxsYmFjayBjYiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llID0gTlVMTCwKICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKLSAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3VnZ2VzdGVkRnJhbWVDb3VudCA9IDApID0gMDsKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOwpAQCAtMTM5LDkgKzE0MiwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gQXVkaW9Sb3V0aW5nCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UHJlZmVycmVkRGV2aWNlKGpvYmplY3QgZGV2aWNlKTsKKyAgICAgICAgdmlydHVhbCBqb2JqZWN0ICAgICBnZXRSb3V0ZWREZXZpY2UoKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIpOwogICAgIH07CiAKICAgICBNZWRpYVBsYXllcjJJbnRlcmZhY2UoKSA6IG1MaXN0ZW5lcihOVUxMKSB7IH0KQEAgLTE3MSw3ICsxNzUsNiBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgaXNQbGF5aW5nKCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSkgewpAQCAtMjExLDYgKzIxNCw4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRyaWNzKGNoYXIgKipidWZmZXIsIHNpemVfdCAqbGVuZ3RoKSA9IDA7CisKICAgICAvLyBJbnZva2UgYSBnZW5lcmljIG1ldGhvZCBvbiB0aGUgcGxheWVyIGJ5IHVzaW5nIG9wYXF1ZSBwYXJjZWxzCiAgICAgLy8gZm9yIHRoZSByZXF1ZXN0IGFuZCByZXBseS4KICAgICAvLwpAQCAtMjE4LDI2ICsyMjMsMTQgQEAKICAgICAvLyAgICAgICAgICAgICAgICBkYXRhIHNlbnQgYnkgdGhlIGphdmEgbGF5ZXIuCiAgICAgLy8gQHBhcmFtW291dF0gcmVwbHkgUGFyY2VsIHRvIGhvbGQgdGhlIHJlcGx5IGRhdGEuIENhbm5vdCBiZSBudWxsLgogICAgIC8vIEByZXR1cm4gT0sgaWYgdGhlIGNhbGwgd2FzIHN1Y2Nlc3NmdWwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbnZva2UoY29uc3QgUGFyY2VsJiByZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KSA9IDA7Ci0KLSAgICAvLyBUaGUgQ2xpZW50IGluIHRoZSBNZXRhZGF0YVBsYXllclNlcnZpY2UgY2FsbHMgdGhpcyBtZXRob2Qgb24KLSAgICAvLyB0aGUgbmF0aXZlIHBsYXllciB0byByZXRyaWV2ZSBhbGwgb3IgYSBzdWJzZXQgb2YgbWV0YWRhdGEuCi0gICAgLy8KLSAgICAvLyBAcGFyYW0gaWRzIFNvcnRlZExpc3Qgb2YgbWV0YWRhdGEgSUQgdG8gYmUgZmV0Y2guIElmIGVtcHR5LCBhbGwKLSAgICAvLyAgICAgICAgICAgIHRoZSBrbm93biBtZXRhZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuCi0gICAgLy8gQHBhcmFtW2lub3V0XSByZWNvcmRzIFBhcmNlbCB3aGVyZSB0aGUgcGxheWVyIGFwcGVuZHMgaXRzIG1ldGFkYXRhLgotICAgIC8vIEByZXR1cm4gT0sgaWYgdGhlIGNhbGwgd2FzIHN1Y2Nlc3NmdWwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhZGF0YShjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgLyogaWRzICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiAvKiByZWNvcmRzICovKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9OworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52b2tlKGNvbnN0IFBsYXllck1lc3NhZ2UgJnJlcXVlc3QsIFBsYXllck1lc3NhZ2UgKnJlcGx5KSA9IDA7CiAKICAgICB2b2lkIHNldExpc3RlbmVyKGNvbnN0IHNwPE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyPiAmbGlzdGVuZXIpIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1MaXN0ZW5lckxvY2spOwogICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKICAgICB9CiAKLSAgICB2b2lkIHNlbmRFdmVudChpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MT0wLCBpbnQgZXh0Mj0wLCBjb25zdCBQYXJjZWwgKm9iaj1OVUxMKSB7CisgICAgdm9pZCBzZW5kRXZlbnQoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDE9MCwgaW50IGV4dDI9MCwgY29uc3QgUGxheWVyTWVzc2FnZSAqb2JqPU5VTEwpIHsKICAgICAgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlTGlzdGVuZXI+IGxpc3RlbmVyOwogICAgICAgICB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxpc3RlbmVyTG9jayk7CkBAIC0yNTYsMTEgKzI0OSwxMSBAQAogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJiAvKiBtc2cgKi8pIG92ZXJyaWRlIHsgfQogCiAgICAgLy8gTW9kdWxhciBEUk0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVEcm0oY29uc3QgdWludDhfdCAvKiB1dWlkICovWzE2XSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVEcm0oaW50NjRfdCAvKnNyY0lkKi8sIGNvbnN0IHVpbnQ4X3QgLyogdXVpZCAqL1sxNl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgLyogZHJtU2Vzc2lvbklkICovKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlRHJtKCkgeworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZURybShpbnQ2NF90IC8qc3JjSWQqLykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyVHlwZXMuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oCmluZGV4IDM5MDViNTUuLjI0MzAyODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oCkBAIC0zNCw4ICszNCw3IEBACiAgICAgTUVESUEyX1NFVF9WSURFT19TSVpFICAgID0gNSwKICAgICBNRURJQTJfU1RBUlRFRCAgICAgICAgICAgPSA2LAogICAgIE1FRElBMl9QQVVTRUQgICAgICAgICAgICA9IDcsCi0gICAgTUVESUEyX1NUT1BQRUQgICAgICAgICAgID0gOCwKLSAgICBNRURJQTJfU0tJUFBFRCAgICAgICAgICAgPSA5LAorICAgIE1FRElBMl9TS0lQUEVEICAgICAgICAgICA9IDgsCiAgICAgTUVESUEyX05PVElGWV9USU1FICAgICAgID0gOTgsCiAgICAgTUVESUEyX1RJTUVEX1RFWFQgICAgICAgID0gOTksCiAgICAgTUVESUEyX0VSUk9SICAgICAgICAgICAgID0gMTAwLApAQCAtNDMsNyArNDIsNiBAQAogICAgIE1FRElBMl9TVUJUSVRMRV9EQVRBICAgICA9IDIwMSwKICAgICBNRURJQTJfTUVUQV9EQVRBICAgICAgICAgPSAyMDIsCiAgICAgTUVESUEyX0RSTV9JTkZPICAgICAgICAgID0gMjEwLAotICAgIE1FRElBMl9BVURJT19ST1VUSU5HX0NIQU5HRUQgPSAxMDAwMCwKIH07CiAKIC8vIEdlbmVyaWMgZXJyb3IgY29kZXMgZm9yIHRoZSBtZWRpYSBwbGF5ZXIgZnJhbWV3b3JrLiAgRXJyb3JzIGFyZSBmYXRhbCwgdGhlCkBAIC05NiwxNyArOTQsMjAgQEAKIGVudW0gbWVkaWEyX2luZm9fdHlwZSB7CiAgICAgLy8gMHh4CiAgICAgTUVESUEyX0lORk9fVU5LTk9XTiA9IDEsCi0gICAgLy8gVGhlIHBsYXllciB3YXMgc3RhcnRlZCBiZWNhdXNlIGl0IHdhcyB1c2VkIGFzIHRoZSBuZXh0IHBsYXllciBmb3IgYW5vdGhlcgotICAgIC8vIHBsYXllciwgd2hpY2gganVzdCBjb21wbGV0ZWQgcGxheWJhY2sKLSAgICBNRURJQTJfSU5GT19TVEFSVEVEX0FTX05FWFQgPSAyLAorICAgIC8vIFRoZSBwbGF5ZXIganVzdCBzdGFydGVkIHRoZSBwbGF5YmFjayBvZiB0aGlzIGRhdGEgc291cmNlLgorICAgIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX1NUQVJUID0gMiwKICAgICAvLyBUaGUgcGxheWVyIGp1c3QgcHVzaGVkIHRoZSB2ZXJ5IGZpcnN0IHZpZGVvIGZyYW1lIGZvciByZW5kZXJpbmcKICAgICBNRURJQTJfSU5GT19WSURFT19SRU5ERVJJTkdfU1RBUlQgPSAzLAogICAgIC8vIFRoZSBwbGF5ZXIganVzdCBwdXNoZWQgdGhlIHZlcnkgZmlyc3QgYXVkaW8gZnJhbWUgZm9yIHJlbmRlcmluZwogICAgIE1FRElBMl9JTkZPX0FVRElPX1JFTkRFUklOR19TVEFSVCA9IDQsCiAgICAgLy8gVGhlIHBsYXllciBqdXN0IGNvbXBsZXRlZCB0aGUgcGxheWJhY2sgb2YgdGhpcyBkYXRhIHNvdXJjZQotICAgIE1FRElBMl9JTkZPX1BMQVlCQUNLX0NPTVBMRVRFID0gNSwKLSAgICAvLyBUaGUgcGxheWVyIGp1c3QgY29tcGxldGVkIHRoZSBwbGF5YmFjayBvZiB0aGUgZnVsbCBwbGF5IGxpc3QKLSAgICBNRURJQTJfSU5GT19QTEFZTElTVF9FTkQgPSA2LAorICAgIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX0VORCA9IDUsCisgICAgLy8gVGhlIHBsYXllciBqdXN0IGNvbXBsZXRlZCB0aGUgcGxheWJhY2sgb2YgYWxsIGRhdGEgc291cmNlcy4KKyAgICAvLyBCdXQgdGhpcyBpcyBub3QgdmlzaWJsZSBpbiBuYXRpdmUgY29kZS4gSnVzdCBrZWVwIHRoaXMgZW50cnkgZm9yIGNvbXBsZXRlbmVzcy4KKyAgICBNRURJQTJfSU5GT19EQVRBX1NPVVJDRV9MSVNUX0VORCA9IDYsCisgICAgLy8gVGhlIHBsYXllciBqdXN0IGNvbXBsZXRlZCBhbiBpdGVyYXRpb24gb2YgcGxheWJhY2sgbG9vcC4gVGhpcyBldmVudCBpcyBzZW50IG9ubHkgd2hlbgorICAgIC8vIGxvb3BpbmcgaXMgZW5hYmxlZC4KKyAgICBNRURJQTJfSU5GT19EQVRBX1NPVVJDRV9SRVBFQVQgPSA3LAogCiAgICAgLy8xeHgKICAgICAvLyBUaGUgcGxheWVyIGp1c3QgcHJlcGFyZWQgYSBkYXRhIHNvdXJjZS4KQEAgLTE1MCwxMSArMTUxLDExIEBACiAKIC8vIERvIG5vdCBjaGFuZ2UgdGhlc2UgdmFsdWVzIHdpdGhvdXQgdXBkYXRpbmcgdGhlaXIgY291bnRlcnBhcnRzIGluIE1lZGlhUGxheWVyMi5qYXZhCiBlbnVtIG1lZGlhcGxheWVyMl9zdGF0ZXMgewotICAgIE1FRElBUExBWUVSMl9TVEFURV9JRExFICAgICAgICAgPSAxLAotICAgIE1FRElBUExBWUVSMl9TVEFURV9QUkVQQVJFRCAgICAgPSAyLAotICAgIE1FRElBUExBWUVSMl9TVEFURV9QTEFZSU5HICAgICAgPSAzLAotICAgIE1FRElBUExBWUVSMl9TVEFURV9QQVVTRUQgICAgICAgPSA0LAotICAgIE1FRElBUExBWUVSMl9TVEFURV9FUlJPUiAgICAgICAgPSA1LAorICAgIE1FRElBUExBWUVSMl9TVEFURV9JRExFICAgICAgICAgPSAxMDAxLAorICAgIE1FRElBUExBWUVSMl9TVEFURV9QUkVQQVJFRCAgICAgPSAxMDAyLAorICAgIE1FRElBUExBWUVSMl9TVEFURV9QQVVTRUQgICAgICAgPSAxMDAzLAorICAgIE1FRElBUExBWUVSMl9TVEFURV9QTEFZSU5HICAgICAgPSAxMDA0LAorICAgIE1FRElBUExBWUVSMl9TVEFURV9FUlJPUiAgICAgICAgPSAxMDA1LAogfTsKIAogZW51bSBtZWRpYV9wbGF5ZXIyX2ludGVybmFsX3N0YXRlcyB7CkBAIC0xNjUsOCArMTY2LDcgQEAKICAgICBNRURJQV9QTEFZRVIyX1BSRVBBUkVEICAgICAgICAgICA9IDEgPDwgMywKICAgICBNRURJQV9QTEFZRVIyX1NUQVJURUQgICAgICAgICAgICA9IDEgPDwgNCwKICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCAgICAgICAgICAgICA9IDEgPDwgNSwKLSAgICBNRURJQV9QTEFZRVIyX1NUT1BQRUQgICAgICAgICAgICA9IDEgPDwgNiwKLSAgICBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFICA9IDEgPDwgNworICAgIE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUgID0gMSA8PCA2CiB9OwogCiAvLyBLZWVwIEtFWV9QQVJBTUVURVJfKiBpbiBzeW5jIHdpdGggTWVkaWFQbGF5ZXIyLmphdmEuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmgKaW5kZXggZDU4NjE5Mi4uMjk5M2FiMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuaApAQCAtMjAsMTEgKzIwLDEyIEBACiAjaW5jbHVkZSA8bWVkaWEvQVZTeW5jU2V0dGluZ3MuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllcl9jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMlR5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaD4KIAorI2luY2x1ZGUgPGpuaS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgpAQCAtMzIsNiArMzMsOCBAQAogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby1iYXNlLmg+CiAKKyNpbmNsdWRlICJqbmkuaCIKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU5hdGl2ZVdpbmRvd1dyYXBwZXI7CkBAIC00Miw3ICs0NSw4IEBACiBjbGFzcyBNZWRpYVBsYXllcjJMaXN0ZW5lcjogdmlydHVhbCBwdWJsaWMgUmVmQmFzZQogewogcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLAorICAgICAgICAgICAgY29uc3QgUGxheWVyTWVzc2FnZSAqb2JqID0gTlVMTCkgPSAwOwogfTsKIAogY2xhc3MgTWVkaWFQbGF5ZXIyIDogcHVibGljIE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyCkBAIC01MCw3ICs1NCw3IEBACiBwdWJsaWM6CiAgICAgfk1lZGlhUGxheWVyMigpOwogCi0gICAgc3RhdGljIHNwPE1lZGlhUGxheWVyMj4gQ3JlYXRlKCk7CisgICAgc3RhdGljIHNwPE1lZGlhUGxheWVyMj4gQ3JlYXRlKGludDMyX3Qgc2Vzc2lvbklkLCBqb2JqZWN0IGNvbnRleHQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBEdW1wQWxsKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBkaXNjb25uZWN0KCk7CkBAIC02NSwxMCArNjksOSBAQAogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHByZXBhcmVBc3luYygpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHN0YXJ0KCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc3RvcCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHBhdXNlKCk7CiAgICAgICAgICAgICBib29sICAgICAgICAgICAgaXNQbGF5aW5nKCk7Ci0gICAgICAgICAgICBtZWRpYXBsYXllcjJfc3RhdGVzIGdldE1lZGlhUGxheWVyMlN0YXRlKCk7CisgICAgICAgICAgICBtZWRpYXBsYXllcjJfc3RhdGVzIGdldFN0YXRlKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSogcmF0ZSAvKiBub25udWxsICovKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MmIHN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCk7CkBAIC04Miw2MCArODUsNTMgQEAKICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIG5vdGlmeUF0KGludDY0X3QgbWVkaWFUaW1lVXMpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptc2VjKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXREdXJhdGlvbihpbnQ2NF90ICptc2VjKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXREdXJhdGlvbihpbnQ2NF90IHNyY0lkLCBpbnQ2NF90ICptc2VjKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZXNldCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHR5cGUpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90ICp0eXBlKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRMb29waW5nKGludCBsb29wKTsKICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBpc0xvb3BpbmcoKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFZvbHVtZShmbG9hdCB2b2x1bWUpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIG5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCAqb2JqID0gTlVMTCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgaW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0TWV0YWRhdGFGaWx0ZXIoY29uc3QgUGFyY2VsJiBmaWx0ZXIpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldE1ldGFkYXRhKGJvb2wgdXBkYXRlX29ubHksIGJvb2wgYXBwbHlfZmlsdGVyLCBQYXJjZWwgKm1ldGFkYXRhKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdWRpb1Nlc3Npb25JZChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBnZXRBdWRpb1Nlc3Npb25JZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF5ZXJNZXNzYWdlICpvYmogPSBOVUxMKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBpbnZva2UoY29uc3QgUGxheWVyTWVzc2FnZSAmcmVxdWVzdCwgUGxheWVyTWVzc2FnZSAqcmVwbHkpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvU2Vzc2lvbklkKGludDMyX3Qgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGludDMyX3QgICAgICAgICBnZXRBdWRpb1Nlc3Npb25JZCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgYXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCYgcmVxdWVzdCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcyk7CisgICAgICAgICAgICBqb2JqZWN0ICAgICAgICAgZ2V0QXVkaW9BdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCogcmVwbHkpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldE1ldHJpY3MoY2hhciAqKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgpOwogCiAgICAgICAgICAgICAvLyBNb2R1bGFyIERSTQotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBkcm1TZXNzaW9uSWQpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHJlbGVhc2VEcm0oKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwcmVwYXJlRHJtKGludDY0X3Qgc3JjSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBkcm1TZXNzaW9uSWQpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHJlbGVhc2VEcm0oaW50NjRfdCBzcmNJZCk7CiAgICAgICAgICAgICAvLyBBdWRpb1JvdXRpbmcKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7Ci0gICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFJvdXRlZERldmljZUlkKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFByZWZlcnJlZERldmljZShqb2JqZWN0IGRldmljZSk7CisgICAgICAgICAgICBqb2JqZWN0ICAgICAgICAgZ2V0Um91dGVkRGV2aWNlKCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZSk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogcHJpdmF0ZToKLSAgICBNZWRpYVBsYXllcjIoKTsKKyAgICBNZWRpYVBsYXllcjIoaW50MzJfdCBzZXNzaW9uSWQsIGpvYmplY3QgY29udGV4dCk7CiAgICAgYm9vbCBpbml0KCk7CiAKLSAgICAvLyBAcGFyYW0gdHlwZSBPZiB0aGUgbWV0YWRhdGEgdG8gYmUgdGVzdGVkLgotICAgIC8vIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0YWRhdGEgc2hvdWxkIGJlIGRyb3BwZWQgYWNjb3JkaW5nIHRvCi0gICAgLy8gICAgICAgICAgICAgIHRoZSBmaWx0ZXJzLgotICAgIGJvb2wgc2hvdWxkRHJvcE1ldGFkYXRhKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSB0eXBlKSBjb25zdDsKLQotICAgIC8vIEFkZCBhIG5ldyBlbGVtZW50IHRvIHRoZSBzZXQgb2YgbWV0YWRhdGEgdXBkYXRlZC4gTm9vcCBpZgotICAgIC8vIHRoZSBlbGVtZW50IGV4aXN0cyBhbHJlYWR5LgotICAgIC8vIEBwYXJhbSB0eXBlIE9mIHRoZSBtZXRhZGF0YSB0byBiZSByZWNvcmRlZC4KLSAgICB2b2lkIGFkZE5ld01ldGFkYXRhVXBkYXRlKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSB0eXBlKTsKLQogICAgIC8vIERpc2Nvbm5lY3QgZnJvbSB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCBBTmF0aXZlV2luZG93LgogICAgIHZvaWQgZGlzY29ubmVjdE5hdGl2ZVdpbmRvd19sKCk7CiAKLSAgICBzdGF0dXNfdCBzZXRBdWRpb0F0dHJpYnV0ZXNfbChjb25zdCBQYXJjZWwgJnJlcXVlc3QpOworICAgIHN0YXR1c190IHNldEF1ZGlvQXR0cmlidXRlc19sKGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcyk7CiAKICAgICB2b2lkIGNsZWFyX2woKTsKICAgICBzdGF0dXNfdCBzZWVrVG9fbChpbnQ2NF90IG1zZWMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpOwogICAgIHN0YXR1c190IHByZXBhcmVBc3luY19sKCk7CiAgICAgc3RhdHVzX3QgZ2V0RHVyYXRpb25fbChpbnQ2NF90ICptc2VjKTsKICAgICBzdGF0dXNfdCByZXNldF9sKCk7Ci0gICAgc3RhdHVzX3QgY2hlY2tTdGF0ZUZvcktleVNldF9sKGludCBrZXkpOworICAgIHN0YXR1c190IGNoZWNrU3RhdGVfbCgpOwogCiAgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgICAgIG1QaWQ7CiAgICAgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgIG1VaWQ7CkBAIC0xNTIsMjcgKzE0OCwxNSBAQAogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICBtU2Vla1Bvc2l0aW9uOwogICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlICAgICAgICBtU2Vla01vZGU7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgICAgIG1TdHJlYW1UeXBlOwotICAgIFBhcmNlbCogICAgICAgICAgICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtTG9vcDsKLSAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbUxlZnRWb2x1bWU7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1SaWdodFZvbHVtZTsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZTsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGg7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodDsKLSAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICAgICAgbUF1ZGlvU2Vzc2lvbklkOwotICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtQXVkaW9TZXNzaW9uSWQ7CisgICAgc3A8Sk9iamVjdEhvbGRlcj4gICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXM7CisgICAgc3A8Sk9iamVjdEhvbGRlcj4gICAgICAgICAgIG1Db250ZXh0OwogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwotCiAgICAgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICAgIG1Db25uZWN0ZWRXaW5kb3c7Ci0KLSAgICAvLyBNZXRhZGF0YSBmaWx0ZXJzLgotICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIG1NZXRhZGF0YUFsbG93OyAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCi0gICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgbU1ldGFkYXRhRHJvcDsgIC8vIHByb3RlY3RlZCBieSBtTG9jawotCi0gICAgLy8gTWV0YWRhdGEgdXBkYXRlZC4gRm9yIGVhY2ggTUVESUFfSU5GT19NRVRBREFUQV9VUERBVEUKLSAgICAvLyBub3RpZmljYXRpb24gd2UgdHJ5IHRvIHVwZGF0ZSBtTWV0YWRhdGFVcGRhdGVkIHdoaWNoIGlzIGEKLSAgICAvLyBzZXQ6IG5vIGR1cGxpY2F0ZS4KLSAgICAvLyBnZXRNZXRhZGF0YSBjbGVhcnMgdGhpcyBzZXQuCi0gICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgbU1ldGFkYXRhVXBkYXRlZDsgIC8vIHByb3RlY3RlZCBieSBtTG9jawogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5jcHAKaW5kZXggZTU1NjdkYy4uYWU3YWM1OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5jcHAKQEAgLTE4LDE0ICsxOCwxMCBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNZWRpYVBsYXllcjJOYXRpdmUiCiAKLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlRGVzYy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgogI2luY2x1ZGUgPG1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL05ka1dyYXBwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5oPgpAQCAtNTMsMTY5ICs0OSw2IEBACiBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOwogY29uc3QgaW50IGtEdW1wTG9ja1NsZWVwVXMgPSAyMDAwMDsKIAotLy8gTWF4IG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBmaWx0ZXIuCi1jb25zdCBpbnQga01heEZpbHRlclNpemUgPSA2NDsgIC8vIEkgcHVsbGVkIHRoYXQgb3V0IG9mIHRoaW4gYWlyLgotCi0vLyBGSVhNRTogTW92ZSBhbGwgdGhlIG1ldGFkYXRhIHJlbGF0ZWQgZnVuY3Rpb24gaW4gdGhlIE1ldGFkYXRhLmNwcAotCi0vLyBVbm1hcnNoYWxsIGEgZmlsdGVyIGZyb20gYSBQYXJjZWwuCi0vLyBGaWx0ZXIgZm9ybWF0IGluIGEgcGFyY2VsOgotLy8KLS8vICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgZW50cmllcyAobikgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhIHR5cGUgMSAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgdHlwZSAyICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyAgLi4uLgotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhIHR5cGUgbiAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8KLS8vIEBwYXJhbSBwIFBhcmNlbCB0aGF0IHNob3VsZCBzdGFydCB3aXRoIGEgZmlsdGVyLgotLy8gQHBhcmFtW291dF0gZmlsdGVyIE9uIGV4aXQgY29udGFpbnMgdGhlIGxpc3Qgb2YgbWV0YWRhdGEgdHlwZSB0byBiZQotLy8gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLgotLy8gQHBhcmFtW291dF0gc3RhdHVzIE9uIGV4aXQgY29udGFpbnMgdGhlIHN0YXR1cyBjb2RlIHRvIGJlIHJldHVybmVkLgotLy8gQHJldHVybiB0cnVlIGlmIHRoZSBwYXJjZWwgc3RhcnRzIHdpdGggYSB2YWxpZCBmaWx0ZXIuCi1ib29sIHVubWFyc2hhbGxGaWx0ZXIoY29uc3QgUGFyY2VsJiBwLAotICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyICpmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykgewotICAgIGludDMyX3QgdmFsOwotICAgIGlmIChwLnJlYWRJbnQzMigmdmFsKSAhPSBPSykgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlYWQgZmlsdGVyJ3MgbGVuZ3RoIik7Ci0gICAgICAgICpzdGF0dXMgPSBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAodmFsID4ga01heEZpbHRlclNpemUgfHwgdmFsIDwgMCkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBmaWx0ZXIgbGVuICVkIiwgdmFsKTsKLSAgICAgICAgKnN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNvbnN0IHNpemVfdCBudW0gPSB2YWw7Ci0KLSAgICBmaWx0ZXItPmNsZWFyKCk7Ci0gICAgZmlsdGVyLT5zZXRDYXBhY2l0eShudW0pOwotCi0gICAgc2l6ZV90IHNpemUgPSBudW0gKiBzaXplb2YobWVkaWE6Ok1ldGFkYXRhOjpUeXBlKTsKLQotCi0gICAgaWYgKHAuZGF0YUF2YWlsKCkgPCBzaXplKSB7Ci0gICAgICAgIEFMT0dFKCJGaWx0ZXIgdG9vIHNob3J0IGV4cGVjdGVkICV6dSBidXQgZ290ICV6dSIsIHNpemUsIHAuZGF0YUF2YWlsKCkpOwotICAgICAgICAqc3RhdHVzID0gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpUeXBlICpkYXRhID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpUeXBlKj4ocC5yZWFkSW5wbGFjZShzaXplKSk7Ci0KLSAgICBpZiAoTlVMTCA9PSBkYXRhKSB7Ci0gICAgICAgIEFMT0dFKCJGaWx0ZXIgaGFkIG5vIGRhdGEiKTsKLSAgICAgICAgKnN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIFRPRE86IFRoZSBzdGwgaW1wbCBvZiB2ZWN0b3Igd291bGQgYmUgbW9yZSBlZmZpY2llbnQgaGVyZQotICAgIC8vIGJlY2F1c2UgaXQgZGVnZW5lcmF0ZXMgaW50byBhIG1lbWNweSBvbiBwb2QgdHlwZXMuIFRyeSB0bwotICAgIC8vIHJlcGxhY2UgbGF0ZXIgb3IgdXNlIHN0bDo6c2V0LgotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKLSAgICAgICAgZmlsdGVyLT5hZGQoKmRhdGEpOwotICAgICAgICArK2RhdGE7Ci0gICAgfQotICAgICpzdGF0dXMgPSBPSzsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gQHBhcmFtIGZpbHRlciBPZiBtZXRhZGF0YSB0eXBlLgotLy8gQHBhcmFtIHZhbCBUbyBiZSBzZWFyY2hlZC4KLS8vIEByZXR1cm4gdHJ1ZSBpZiBhIG1hdGNoIHdhcyBmb3VuZC4KLWJvb2wgZmluZE1ldGFkYXRhKGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiBmaWx0ZXIsIGNvbnN0IGludDMyX3QgdmFsKSB7Ci0gICAgLy8gRGVhbCB3aXRoIGVtcHR5IGFuZCBBTlkgcmlnaHQgYXdheQotICAgIGlmIChmaWx0ZXIuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGZpbHRlclswXSA9PSBtZWRpYTo6TWV0YWRhdGE6OmtBbnkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpbHRlci5pbmRleE9mKHZhbCkgPj0gMDsKLX0KLQotLy8gbWFyc2hhbGxpbmcgdGFnIGluZGljYXRpbmcgZmxhdHRlbmVkIHV0ZjE2IHRhZ3MKLS8vIGtlZXAgaW4gc3luYyB3aXRoIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmphdmEKLWNvbnN0IGludDMyX3Qga0F1ZGlvQXR0cmlidXRlc01hcnNoYWxsVGFnRmxhdHRlblRhZ3MgPSAxOwotCi0vLyBBdWRpbyBhdHRyaWJ1dGVzIGZvcm1hdCBpbiBhIHBhcmNlbDoKLS8vCi0vLyAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCi0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9BdHRyaWJ1dGVzTWFyc2hhbGxUYWdGbGF0dGVuVGFncyAgfCAvLyBpZ25vcmUgdGFncyBpZiBub3QgZm91bmQKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBmbGF0dGVuZWQgdGFncyBpbiBVVEYxNiAgICAgICAgICAgICAgICAgfAotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLwotLy8gQHBhcmFtIHAgUGFyY2VsIHRoYXQgY29udGFpbnMgYXVkaW8gYXR0cmlidXRlcy4KLS8vIEBwYXJhbVtvdXRdIGF0dHJpYnV0ZXMgT24gZXhpdCBwb2ludHMgdG8gYW4gaW5pdGlhbGl6ZWQgYXVkaW9fYXR0cmlidXRlc190IHN0cnVjdHVyZQotLy8gQHBhcmFtW291dF0gc3RhdHVzIE9uIGV4aXQgY29udGFpbnMgdGhlIHN0YXR1cyBjb2RlIHRvIGJlIHJldHVybmVkLgotdm9pZCB1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IFBhcmNlbCYgcGFyY2VsLCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMpIHsKLSAgICBhdHRyaWJ1dGVzLT51c2FnZSA9IChhdWRpb191c2FnZV90KSBwYXJjZWwucmVhZEludDMyKCk7Ci0gICAgYXR0cmlidXRlcy0+Y29udGVudF90eXBlID0gKGF1ZGlvX2NvbnRlbnRfdHlwZV90KSBwYXJjZWwucmVhZEludDMyKCk7Ci0gICAgYXR0cmlidXRlcy0+c291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBwYXJjZWwucmVhZEludDMyKCk7Ci0gICAgYXR0cmlidXRlcy0+ZmxhZ3MgPSAoYXVkaW9fZmxhZ3NfbWFza190KSBwYXJjZWwucmVhZEludDMyKCk7Ci0gICAgY29uc3QgYm9vbCBoYXNGbGF0dGVuZWRUYWcgPSAocGFyY2VsLnJlYWRJbnQzMigpID09IGtBdWRpb0F0dHJpYnV0ZXNNYXJzaGFsbFRhZ0ZsYXR0ZW5UYWdzKTsKLSAgICBpZiAoaGFzRmxhdHRlbmVkVGFnKSB7Ci0gICAgICAgIC8vIHRoZSB0YWdzIGFyZSBVVEYxNiwgY29udmVydCB0byBVVEY4Ci0gICAgICAgIFN0cmluZzE2IHRhZ3MgPSBwYXJjZWwucmVhZFN0cmluZzE2KCk7Ci0gICAgICAgIHNzaXplX3QgcmVhbFRhZ1NpemUgPSB1dGYxNl90b191dGY4X2xlbmd0aCh0YWdzLnN0cmluZygpLCB0YWdzLnNpemUoKSk7Ci0gICAgICAgIGlmIChyZWFsVGFnU2l6ZSA8PSAwKSB7Ci0gICAgICAgICAgICBzdHJjcHkoYXR0cmlidXRlcy0+dGFncywgIiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gY29weSB0aGUgZmxhdHRlbmVkIHN0cmluZyBpbnRvIHRoZSBhdHRyaWJ1dGVzIGFzIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIGNvbnZlcnNpb246Ci0gICAgICAgICAgICAvLyBjb3B5aW5nIGFycmF5IHNpemUgLTEsIGFycmF5IGZvciB0YWdzIHdhcyBjYWxsb2MnZCwgbm8gbmVlZCB0byBOVUxMLXRlcm1pbmF0ZSBpdAotICAgICAgICAgICAgc2l6ZV90IHRhZ1NpemUgPSByZWFsVGFnU2l6ZSA+IEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIDEgPwotICAgICAgICAgICAgICAgICAgICBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxIDogcmVhbFRhZ1NpemU7Ci0gICAgICAgICAgICB1dGYxNl90b191dGY4KHRhZ3Muc3RyaW5nKCksIHRhZ1NpemUsIGF0dHJpYnV0ZXMtPnRhZ3MsCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihhdHRyaWJ1dGVzLT50YWdzKSAvIHNpemVvZihhdHRyaWJ1dGVzLT50YWdzWzBdKSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgidW5tYXJzaGFsbEF1ZGlvQXR0cmlidXRlcygpIHJlY2VpdmVkIHVuZmxhdHRlbmVkIHRhZ3MsIGlnbm9yaW5nIHRhZyB2YWx1ZXMiKTsKLSAgICAgICAgc3RyY3B5KGF0dHJpYnV0ZXMtPnRhZ3MsICIiKTsKLSAgICB9Ci19Ci0KLWNsYXNzIEF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyOiBwdWJsaWMgQXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2sgewotcHVibGljOgotICAgIEF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyKGNvbnN0IHNwPE1lZGlhUGxheWVyMkludGVyZmFjZT4mIGxpc3RlbmVyKQotICAgICAgICA6IG1MaXN0ZW5lcihsaXN0ZW5lcikgeyB9Ci0KLSAgICB+QXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIoKSB7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgb3ZlcnJpZGUgewotICAgICAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKLSAgICAgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGxpc3RlbmVyLT5zZW5kRXZlbnQoMCwgTUVESUEyX0FVRElPX1JPVVRJTkdfQ0hBTkdFRCwgYXVkaW9JbywgZGV2aWNlSWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coImxpc3RlbmVyIGZvciBwcm9jZXNzICVkIGRlYXRoIGlzIGdvbmUiLCBNRURJQTJfQVVESU9fUk9VVElOR19DSEFOR0VEKTsKLSAgICAgICAgfQotICAgIH0KLQotcHJpdmF0ZToKLSAgICB3cDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+IG1MaXN0ZW5lcjsKLX07Ci0KIGNsYXNzIHByb3h5TGlzdGVuZXIgOiBwdWJsaWMgTWVkaWFQbGF5ZXIySW50ZXJmYWNlTGlzdGVuZXIgewogcHVibGljOgogICAgIHByb3h5TGlzdGVuZXIoY29uc3Qgd3A8TWVkaWFQbGF5ZXIyPiAmcGxheWVyKQpAQCAtMjIzLDcgKzU2LDggQEAKIAogICAgIH5wcm94eUxpc3RlbmVyKCkgeyB9OwogCi0gICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKSBvdmVycmlkZSB7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsCisgICAgICAgICAgICBjb25zdCBQbGF5ZXJNZXNzYWdlICpvYmopIG92ZXJyaWRlIHsKICAgICAgICAgc3A8TWVkaWFQbGF5ZXIyPiBwbGF5ZXIgPSBtUGxheWVyLnByb21vdGUoKTsKICAgICAgICAgaWYgKHBsYXllciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBwbGF5ZXItPm5vdGlmeShzcmNJZCwgbXNnLCBleHQxLCBleHQyLCBvYmopOwpAQCAtMjY1LDExNCArOTksMTEwIEBACiAgICAgU3RyaW5nOCByZXN1bHQ7CiAgICAgU29ydGVkVmVjdG9yPCBzcDxNZWRpYVBsYXllcjI+ID4gcGxheWVyczsgLy90byBzZXJpYWxpc2UgdGhlIG11dGV4IHVubG9jayAmIGNsaWVudCBkZXN0cnVjdGlvbi4KIAotICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpKSA9PSBmYWxzZSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBNZWRpYVBsYXllcjJcbiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhzUmVjb3JkTG9jayk7CisgICAgICAgIGVuc3VyZUluaXRfbCgpOworICAgICAgICBmb3IgKGludCBpID0gMCwgbiA9IHNQbGF5ZXJzLT5zaXplKCk7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgIHNwPE1lZGlhUGxheWVyMj4gcCA9ICgqc1BsYXllcnMpW2ldLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChwICE9IDApIHsKKyAgICAgICAgICAgICAgICBwLT5kdW1wKGZkLCBhcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBsYXllcnMuYWRkKHApOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0LmFwcGVuZCgiIEZpbGVzIG9wZW5lZCBhbmQvb3IgbWFwcGVkOlxuIik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvbWFwcyIsIGdldHBpZCgpKTsKKyAgICBGSUxFICpmID0gZm9wZW4oYnVmZmVyLCAiciIpOworICAgIGlmIChmKSB7CisgICAgICAgIHdoaWxlICghZmVvZihmKSkgeworICAgICAgICAgICAgZmdldHMoYnVmZmVyLCBTSVpFLCBmKTsKKyAgICAgICAgICAgIGlmIChzdHJzdHIoYnVmZmVyLCAiIC9zdG9yYWdlLyIpIHx8CisgICAgICAgICAgICAgICAgc3Ryc3RyKGJ1ZmZlciwgIiAvc3lzdGVtL3NvdW5kcy8iKSB8fAorICAgICAgICAgICAgICAgIHN0cnN0cihidWZmZXIsICIgL2RhdGEvIikgfHwKKyAgICAgICAgICAgICAgICBzdHJzdHIoYnVmZmVyLCAiIC9zeXN0ZW0vbWVkaWEvIikpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgICIpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmY2xvc2UoZik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soc1JlY29yZExvY2spOwotICAgICAgICAgICAgZW5zdXJlSW5pdF9sKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgbiA9IHNQbGF5ZXJzLT5zaXplKCk7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgICAgICBzcDxNZWRpYVBsYXllcjI+IHAgPSAoKnNQbGF5ZXJzKVtpXS5wcm9tb3RlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHAgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBwLT5kdW1wKGZkLCBhcmdzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGxheWVycy5hZGQocCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiY291bGRuJ3Qgb3BlbiAiKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIH0KIAotICAgICAgICByZXN1bHQuYXBwZW5kKCIgRmlsZXMgb3BlbmVkIGFuZC9vciBtYXBwZWQ6XG4iKTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvbWFwcyIsIGdldHBpZCgpKTsKLSAgICAgICAgRklMRSAqZiA9IGZvcGVuKGJ1ZmZlciwgInIiKTsKLSAgICAgICAgaWYgKGYpIHsKLSAgICAgICAgICAgIHdoaWxlICghZmVvZihmKSkgewotICAgICAgICAgICAgICAgIGZnZXRzKGJ1ZmZlciwgU0laRSwgZik7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cnN0cihidWZmZXIsICIgL3N0b3JhZ2UvIikgfHwKLSAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGJ1ZmZlciwgIiAvc3lzdGVtL3NvdW5kcy8iKSB8fAotICAgICAgICAgICAgICAgICAgICBzdHJzdHIoYnVmZmVyLCAiIC9kYXRhLyIpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHN0cnN0cihidWZmZXIsICIgL3N5c3RlbS9tZWRpYS8iKSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgICIpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmNsb3NlKGYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiY291bGRuJ3Qgb3BlbiAiKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9mZCIsIGdldHBpZCgpKTsKLSAgICAgICAgRElSICpkID0gb3BlbmRpcihidWZmZXIpOwotICAgICAgICBpZiAoZCkgewotICAgICAgICAgICAgc3RydWN0IGRpcmVudCAqZW50OwotICAgICAgICAgICAgd2hpbGUoKGVudCA9IHJlYWRkaXIoZCkpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGVudC0+ZF9uYW1lLCIuIikgJiYgc3RyY21wKGVudC0+ZF9uYW1lLCIuLiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL2ZkLyVzIiwgZ2V0cGlkKCksIGVudC0+ZF9uYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN0YXQgczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxzdGF0KGJ1ZmZlciwgJnMpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocy5zdF9tb2RlICYgU19JRk1UKSA9PSBTX0lGTE5LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBsaW5rdG9bMjU2XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gcmVhZGxpbmsoYnVmZmVyLCBsaW5rdG8sIHNpemVvZihsaW5rdG8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsZW4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxlbiA+IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1Ml0gPSAnLic7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjUzXSA9ICcuJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTRdID0gJy4nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1NV0gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvW2xlbl0gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJzdHIobGlua3RvLCAiL3N0b3JhZ2UvIikgPT0gbGlua3RvIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIobGlua3RvLCAiL3N5c3RlbS9zb3VuZHMvIikgPT0gbGlua3RvIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIobGlua3RvLCAiL2RhdGEvIikgPT0gbGlua3RvIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIobGlua3RvLCAiL3N5c3RlbS9tZWRpYS8iKSA9PSBsaW5rdG8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgLT4gIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGxpbmt0byk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQiLCBnZXRwaWQoKSk7CisgICAgRElSICpkID0gb3BlbmRpcihidWZmZXIpOworICAgIGlmIChkKSB7CisgICAgICAgIHN0cnVjdCBkaXJlbnQgKmVudDsKKyAgICAgICAgd2hpbGUoKGVudCA9IHJlYWRkaXIoZCkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChzdHJjbXAoZW50LT5kX25hbWUsIi4iKSAmJiBzdHJjbXAoZW50LT5kX25hbWUsIi4uIikpIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9mZC8lcyIsIGdldHBpZCgpLCBlbnQtPmRfbmFtZSk7CisgICAgICAgICAgICAgICAgc3RydWN0IHN0YXQgczsKKyAgICAgICAgICAgICAgICBpZiAobHN0YXQoYnVmZmVyLCAmcykgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHMuc3RfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkxOSykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBsaW5rdG9bMjU2XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSByZWFkbGluayhidWZmZXIsIGxpbmt0bywgc2l6ZW9mKGxpbmt0bykpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYobGVuID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxlbiA+IDI1NSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjUyXSA9ICcuJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1M10gPSAnLic7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTRdID0gJy4nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjU1XSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvW2xlbl0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICB1bmV4cGVjdGVkIHR5cGUgZm9yICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJzdHIobGlua3RvLCAiL3N0b3JhZ2UvIikgPT0gbGlua3RvIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihsaW5rdG8sICIvc3lzdGVtL3NvdW5kcy8iKSA9PSBsaW5rdG8gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGxpbmt0bywgIi9kYXRhLyIpID09IGxpbmt0byB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIobGlua3RvLCAiL3N5c3RlbS9tZWRpYS8iKSA9PSBsaW5rdG8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgLT4gIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobGlua3RvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgIHVuZXhwZWN0ZWQgdHlwZSBmb3IgIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xvc2VkaXIoZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJjb3VsZG4ndCBvcGVuICIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKICAgICAgICAgfQorICAgICAgICBjbG9zZWRpcihkKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kKCJjb3VsZG4ndCBvcGVuICIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgfQogCi0gICAgICAgIGdMb29wZXJSb3N0ZXIuZHVtcChmZCwgYXJncyk7CisgICAgZ0xvb3BlclJvc3Rlci5kdW1wKGZkLCBhcmdzKTsKIAotICAgICAgICBib29sIGR1bXBNZW0gPSBmYWxzZTsKLSAgICAgICAgYm9vbCB1bnJlYWNoYWJsZU1lbW9yeSA9IGZhbHNlOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhcmdzW2ldID09IFN0cmluZzE2KCItbSIpKSB7Ci0gICAgICAgICAgICAgICAgZHVtcE1lbSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0gPT0gU3RyaW5nMTYoIi0tdW5yZWFjaGFibGUiKSkgewotICAgICAgICAgICAgICAgIHVucmVhY2hhYmxlTWVtb3J5ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZHVtcE1lbSkgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG5EdW1waW5nIG1lbW9yeTpcbiIpOwotICAgICAgICAgICAgc3RkOjpzdHJpbmcgcyA9IGR1bXBNZW1vcnlBZGRyZXNzZXMoMTAwIC8qIGxpbWl0ICovKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocy5jX3N0cigpLCBzLnNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVucmVhY2hhYmxlTWVtb3J5KSB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbkR1bXBpbmcgdW5yZWFjaGFibGUgbWVtb3J5OlxuIik7Ci0gICAgICAgICAgICAvLyBUT0RPIC0gc2hvdWxkIGxpbWl0IGJlIGFuIGFyZ3VtZW50IHBhcmFtZXRlcj8KLSAgICAgICAgICAgIC8vIFRPRE86IGVuYWJsZSBHZXRVbnJlYWNoYWJsZU1lbW9yeVN0cmluZyBpZiBpdCdzIHBhcnQgb2Ygc3RhYmxlIEFQSQotICAgICAgICAgICAgLy9zdGQ6OnN0cmluZyBzID0gR2V0VW5yZWFjaGFibGVNZW1vcnlTdHJpbmcodHJ1ZSAvKiBjb250ZW50cyAqLywgMTAwMDAgLyogbGltaXQgKi8pOwotICAgICAgICAgICAgLy9yZXN1bHQuYXBwZW5kKHMuY19zdHIoKSwgcy5zaXplKCkpOworICAgIGJvb2wgZHVtcE1lbSA9IGZhbHNlOworICAgIGJvb2wgdW5yZWFjaGFibGVNZW1vcnkgPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGFyZ3NbaV0gPT0gU3RyaW5nMTYoIi1tIikpIHsKKyAgICAgICAgICAgIGR1bXBNZW0gPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0gPT0gU3RyaW5nMTYoIi0tdW5yZWFjaGFibGUiKSkgeworICAgICAgICAgICAgdW5yZWFjaGFibGVNZW1vcnkgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQorICAgIGlmIChkdW1wTWVtKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuRHVtcGluZyBtZW1vcnk6XG4iKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcyA9IGR1bXBNZW1vcnlBZGRyZXNzZXMoMTAwIC8qIGxpbWl0ICovKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChzLmNfc3RyKCksIHMuc2l6ZSgpKTsKKyAgICB9CisgICAgaWYgKHVucmVhY2hhYmxlTWVtb3J5KSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuRHVtcGluZyB1bnJlYWNoYWJsZSBtZW1vcnk6XG4iKTsKKyAgICAgICAgLy8gVE9ETyAtIHNob3VsZCBsaW1pdCBiZSBhbiBhcmd1bWVudCBwYXJhbWV0ZXI/CisgICAgICAgIC8vIFRPRE86IGVuYWJsZSBHZXRVbnJlYWNoYWJsZU1lbW9yeVN0cmluZyBpZiBpdCdzIHBhcnQgb2Ygc3RhYmxlIEFQSQorICAgICAgICAvL3N0ZDo6c3RyaW5nIHMgPSBHZXRVbnJlYWNoYWJsZU1lbW9yeVN0cmluZyh0cnVlIC8qIGNvbnRlbnRzICovLCAxMDAwMCAvKiBsaW1pdCAqLyk7CisgICAgICAgIC8vcmVzdWx0LmFwcGVuZChzLmNfc3RyKCksIHMuc2l6ZSgpKTsKKyAgICB9CisKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0zODAsOCArMjEwLDggQEAKIH0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKIAogLy9zdGF0aWMKLXNwPE1lZGlhUGxheWVyMj4gTWVkaWFQbGF5ZXIyOjpDcmVhdGUoKSB7Ci0gICAgc3A8TWVkaWFQbGF5ZXIyPiBwbGF5ZXIgPSBuZXcgTWVkaWFQbGF5ZXIyKCk7CitzcDxNZWRpYVBsYXllcjI+IE1lZGlhUGxheWVyMjo6Q3JlYXRlKGludDMyX3Qgc2Vzc2lvbklkLCBqb2JqZWN0IGNvbnRleHQpIHsKKyAgICBzcDxNZWRpYVBsYXllcjI+IHBsYXllciA9IG5ldyBNZWRpYVBsYXllcjIoc2Vzc2lvbklkLCBjb250ZXh0KTsKIAogICAgIGlmICghcGxheWVyLT5pbml0KCkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0zOTgsNDQgKzIyOCwzNCBAQAogICAgIHJldHVybiBkdW1wUGxheWVycyhmZCwgYXJncyk7CiB9CiAKLU1lZGlhUGxheWVyMjo6TWVkaWFQbGF5ZXIyKCkgeworTWVkaWFQbGF5ZXIyOjpNZWRpYVBsYXllcjIoaW50MzJfdCBzZXNzaW9uSWQsIGpvYmplY3QgY29udGV4dCkgewogICAgIEFMT0dWKCJjb25zdHJ1Y3RvciIpOwogICAgIG1TcmNJZCA9IDA7CiAgICAgbUxvY2tUaHJlYWRJZCA9IDA7CiAgICAgbUxpc3RlbmVyID0gTlVMTDsKICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKLSAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsID0gTlVMTDsKKyAgICBtQXVkaW9BdHRyaWJ1dGVzID0gTlVMTDsKKyAgICBtQ29udGV4dCA9IG5ldyBKT2JqZWN0SG9sZGVyKGNvbnRleHQpOwogICAgIG1DdXJyZW50UG9zaXRpb24gPSAtMTsKICAgICBtQ3VycmVudFNlZWtNb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQzsKICAgICBtU2Vla1Bvc2l0aW9uID0gLTE7CiAgICAgbVNlZWtNb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQzsKICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9JRExFOwogICAgIG1Mb29wID0gZmFsc2U7Ci0gICAgbUxlZnRWb2x1bWUgPSBtUmlnaHRWb2x1bWUgPSAxLjA7CisgICAgbVZvbHVtZSA9IDEuMDsKICAgICBtVmlkZW9XaWR0aCA9IG1WaWRlb0hlaWdodCA9IDA7Ci0gICAgbUF1ZGlvU2Vzc2lvbklkID0gKGF1ZGlvX3Nlc3Npb25fdCkgQXVkaW9TeXN0ZW06Om5ld0F1ZGlvVW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9TRVNTSU9OKTsKLSAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1BdWRpb1Nlc3Npb25JZCwgLTEpOwogICAgIG1TZW5kTGV2ZWwgPSAwOwogCi0gICAgLy8gVE9ETzogZ2V0IHBpZCBhbmQgdWlkIGZyb20gSkFWQQotICAgIG1QaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgbVVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBtUGlkID0gQUlCaW5kZXJfZ2V0Q2FsbGluZ1BpZCgpOworICAgIG1VaWQgPSBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkKCk7CiAKLSAgICBtQXVkaW9BdHRyaWJ1dGVzID0gTlVMTDsKKyAgICBtQXVkaW9PdXRwdXQgPSBuZXcgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQoc2Vzc2lvbklkLCBtVWlkLCBtUGlkLCBOVUxMIC8qYXR0cmlidXRlcyovKTsKIH0KIAogTWVkaWFQbGF5ZXIyOjp+TWVkaWFQbGF5ZXIyKCkgewogICAgIEFMT0dWKCJkZXN0cnVjdG9yIik7Ci0gICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbDsKLSAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbCA9IE5VTEw7Ci0gICAgfQotICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkLCAtMSk7CiAgICAgZGlzY29ubmVjdCgpOwogICAgIHJlbW92ZVBsYXllcih0aGlzKTsKLSAgICBpZiAobUF1ZGlvQXR0cmlidXRlcyAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUF1ZGlvQXR0cmlidXRlcyk7Ci0gICAgfQogfQogCiBib29sIE1lZGlhUGxheWVyMjo6aW5pdCgpIHsKQEAgLTQ5MywxOSArMzEzLDI4IEBACiAgICAgaWYgKGRzZCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorICAgIC8vIE1pY3Jvc2Vjb25kIGlzIHVzZWQgaW4gTnVQbGF5ZXIyLgorICAgIGlmIChkc2QtPm1TdGFydFBvc2l0aW9uTXMgPiBEYXRhU291cmNlRGVzYzo6a01heFRpbWVNcykgeworICAgICAgICBkc2QtPm1TdGFydFBvc2l0aW9uTXMgPSBEYXRhU291cmNlRGVzYzo6a01heFRpbWVNczsKKyAgICAgICAgQUxPR1coInNldERhdGFTb3VyY2UsIHN0YXJ0IHBvaXN0aW9uIGNsYW1wZWQgdG8gJWxsZCBtcyIsIChsb25nIGxvbmcpZHNkLT5tU3RhcnRQb3NpdGlvbk1zKTsKKyAgICB9CisgICAgaWYgKGRzZC0+bUVuZFBvc2l0aW9uTXMgPiBEYXRhU291cmNlRGVzYzo6a01heFRpbWVNcykgeworICAgICAgICBkc2QtPm1FbmRQb3NpdGlvbk1zID0gRGF0YVNvdXJjZURlc2M6OmtNYXhUaW1lTXM7CisgICAgICAgIEFMT0dXKCJzZXREYXRhU291cmNlLCBlbmQgcG9pc3Rpb24gY2xhbXBlZCB0byAlbGxkIG1zIiwgKGxvbmcgbG9uZylkc2QtPm1TdGFydFBvc2l0aW9uTXMpOworICAgIH0KICAgICBBTE9HVigic2V0RGF0YVNvdXJjZSB0eXBlKCVkKSwgc3JjSWQoJWxsZCkiLCBkc2QtPm1UeXBlLCAobG9uZyBsb25nKWRzZC0+bUlkKTsKIAogICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZT4gb2xkUGxheWVyOwogCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIGlmICghKChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9JRExFKQogICAgICAgICAgICAgICB8fCBtQ3VycmVudFN0YXRlID09IE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1IpKSB7CiAgICAgICAgICAgICBBTE9HRSgic2V0RGF0YVNvdXJjZSBjYWxsZWQgaW4gd3Jvbmcgc3RhdGUgJWQiLCBtQ3VycmVudFN0YXRlKTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogCi0gICAgICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZT4gcGxheWVyID0gbmV3IE51UGxheWVyMkRyaXZlcihtUGlkLCBtVWlkKTsKKyAgICAgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBwbGF5ZXIgPSBuZXcgTnVQbGF5ZXIyRHJpdmVyKG1QaWQsIG1VaWQsIG1Db250ZXh0KTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGxheWVyLT5pbml0Q2hlY2soKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgcGxheWVyIG9iamVjdCwgaW5pdENoZWNrIGZhaWxlZCglZCkiLCBlcnIpOwpAQCAtNTE1LDggKzM0NCw2IEBACiAgICAgICAgIGNsZWFyX2woKTsKIAogICAgICAgICBwbGF5ZXItPnNldExpc3RlbmVyKG5ldyBwcm94eUxpc3RlbmVyKHRoaXMpKTsKLSAgICAgICAgbUF1ZGlvT3V0cHV0ID0gbmV3IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KG1BdWRpb1Nlc3Npb25JZCwgbVVpZCwKLSAgICAgICAgICAgICAgICBtUGlkLCBtQXVkaW9BdHRyaWJ1dGVzLCBuZXcgQXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIocGxheWVyKSk7CiAgICAgICAgIHBsYXllci0+c2V0QXVkaW9TaW5rKG1BdWRpb091dHB1dCk7CiAKICAgICAgICAgZXJyID0gcGxheWVyLT5zZXREYXRhU291cmNlKGRzZCk7CkBAIC01NjUsNzkgKzM5MiwxOCBAQAogICAgIHJldHVybiBtUGxheWVyLT5wbGF5TmV4dERhdGFTb3VyY2Uoc3JjSWQpOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6Omludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpIHsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6aW52b2tlKGNvbnN0IFBsYXllck1lc3NhZ2UgJnJlcXVlc3QsIFBsYXllck1lc3NhZ2UgKnJlcGx5KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBjb25zdCBib29sIGhhc0JlZW5Jbml0aWFsaXplZCA9CiAgICAgICAgICAgICAobUN1cnJlbnRTdGF0ZSAhPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SKSAmJgogICAgICAgICAgICAgKChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9JRExFKSAhPSBNRURJQV9QTEFZRVIyX0lETEUpOwogICAgIGlmICgobVBsYXllciA9PSBOVUxMKSB8fCAhaGFzQmVlbkluaXRpYWxpemVkKSB7Ci0gICAgICAgIEFMT0dFKCJpbnZva2UgZmFpbGVkOiB3cm9uZyBzdGF0ZSAlWCwgbVBsYXllciglcCkiLCBtQ3VycmVudFN0YXRlLCBtUGxheWVyLmdldCgpKTsKKyAgICAgICAgQUxPR0UoImludm9rZSgpIGZhaWxlZDogd3Jvbmcgc3RhdGUgJVgsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgQUxPR1YoImludm9rZSAlenUiLCByZXF1ZXN0LmRhdGFTaXplKCkpOwogICAgIHJldHVybiBtUGxheWVyLT5pbnZva2UocmVxdWVzdCwgcmVwbHkpOwogfQogCi0vLyBUaGlzIGNhbGwgZG9lc24ndCBuZWVkIHRvIGFjY2VzcyB0aGUgbmF0aXZlIHBsYXllci4KLXN0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0TWV0YWRhdGFGaWx0ZXIoY29uc3QgUGFyY2VsJiBmaWx0ZXIpIHsKLSAgICBBTE9HRCgic2V0TWV0YWRhdGFGaWx0ZXIiKTsKLQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBhbGxvdywgZHJvcDsKLQotICAgIGlmICh1bm1hcnNoYWxsRmlsdGVyKGZpbHRlciwgJmFsbG93LCAmc3RhdHVzKSAmJgotICAgICAgICB1bm1hcnNoYWxsRmlsdGVyKGZpbHRlciwgJmRyb3AsICZzdGF0dXMpKSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLQotICAgICAgICBtTWV0YWRhdGFBbGxvdyA9IGFsbG93OwotICAgICAgICBtTWV0YWRhdGFEcm9wID0gZHJvcDsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRNZXRhZGF0YShib29sIHVwZGF0ZV9vbmx5LCBib29sIC8qIGFwcGx5X2ZpbHRlciAqLywgUGFyY2VsICpyZXBseSkgewotICAgIEFMT0dEKCJnZXRNZXRhZGF0YSIpOwotICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZT4gcGxheWVyOwotICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIGlkczsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgewotICAgICAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotCi0gICAgICAgIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIC8vIFBsYWNlaG9sZGVyIGZvciB0aGUgcmV0dXJuIGNvZGUsIHVwZGF0ZWQgYnkgdGhlIGNhbGxlci4KLSAgICAgICAgcmVwbHktPndyaXRlSW50MzIoLTEpOwotCi0gICAgICAgIC8vIFdlIGRvbid0IGJsb2NrIG5vdGlmaWNhdGlvbnMgd2hpbGUgd2UgZmV0Y2ggdGhlIGRhdGEuIFdlIGNsZWFyCi0gICAgICAgIC8vIG1NZXRhZGF0YVVwZGF0ZWQgZmlyc3Qgc28gd2UgZG9uJ3QgbG9zZSBub3RpZmljYXRpb25zIGhhcHBlbmluZwotICAgICAgICAvLyBkdXJpbmcgdGhlIHJlc3Qgb2YgdGhpcyBjYWxsLgotICAgICAgICBpZiAodXBkYXRlX29ubHkpIHsKLSAgICAgICAgICAgIGlkcyA9IG1NZXRhZGF0YVVwZGF0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgbU1ldGFkYXRhVXBkYXRlZC5jbGVhcigpOwotICAgIH0KLQotICAgIG1lZGlhOjpNZXRhZGF0YSBtZXRhZGF0YShyZXBseSk7Ci0KLSAgICBtZXRhZGF0YS5hcHBlbmRIZWFkZXIoKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwbGF5ZXItPmdldE1ldGFkYXRhKGlkcywgcmVwbHkpOwotCi0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBtZXRhZGF0YS5yZXNldFBhcmNlbCgpOwotICAgICAgICBBTE9HRSgiZ2V0TWV0YWRhdGEgZmFpbGVkICVkIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogZW1lbnQgZmlsdGVyaW5nIG9uIHRoZSByZXN1bHQuIE5vdCBjcml0aWNhbCBzaW5jZQotICAgIC8vIGZpbHRlcmluZyB0YWtlcyBwbGFjZSBvbiB0aGUgdXBkYXRlIG5vdGlmaWNhdGlvbnMgYWxyZWFkeS4gVGhpcwotICAgIC8vIHdvdWxkIGJlIHdoZW4gYWxsIHRoZSBtZXRhZGF0YSBhcmUgZmV0Y2ggYW5kIGEgZmlsdGVyIGlzIHNldC4KLQotICAgIC8vIEV2ZXJ5dGhpbmcgaXMgZmluZSwgdXBkYXRlIHRoZSBtZXRhZGF0YSBsZW5ndGguCi0gICAgbWV0YWRhdGEudXBkYXRlTGVuZ3RoKCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCiB2b2lkIE1lZGlhUGxheWVyMjo6ZGlzY29ubmVjdE5hdGl2ZVdpbmRvd19sKCkgewogICAgIGlmIChtQ29ubmVjdGVkV2luZG93ICE9IE5VTEwgJiYgbUNvbm5lY3RlZFdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpICE9IE5VTEwpIHsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdCgKQEAgLTcyNywyMiArNDkzLDkgQEAKICAgICByZXR1cm4gbVBsYXllci0+c2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb0F0dHJpYnV0ZXNfbChjb25zdCBQYXJjZWwgJnBhcmNlbCkgewotICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShtQXVkaW9BdHRyaWJ1dGVzKTsKLSAgICB9Ci0gICAgbUF1ZGlvQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICBpZiAobUF1ZGlvQXR0cmlidXRlcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotICAgIHVubWFyc2hhbGxBdWRpb0F0dHJpYnV0ZXMocGFyY2VsLCBtQXVkaW9BdHRyaWJ1dGVzKTsKLQotICAgIEFMT0dWKCJzZXRBdWRpb0F0dHJpYnV0ZXNfbCgpIHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPSVzIiwKLSAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMtPnVzYWdlLCBtQXVkaW9BdHRyaWJ1dGVzLT5jb250ZW50X3R5cGUsIG1BdWRpb0F0dHJpYnV0ZXMtPmZsYWdzLAotICAgICAgICAgICAgbUF1ZGlvQXR0cmlidXRlcy0+dGFncyk7Ci0KLSAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHsKLSAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRBdWRpb0F0dHJpYnV0ZXMobUF1ZGlvQXR0cmlidXRlcyk7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1ZGlvQXR0cmlidXRlc19sKGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcykgeworICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gTlVMTCkgeworICAgICAgICBtQXVkaW9PdXRwdXQtPnNldEF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtNzUwLDE0ICs1MDMsMTIgQEAKIHN0YXR1c190IE1lZGlhUGxheWVyMjo6cHJlcGFyZUFzeW5jKCkgewogICAgIEFMT0dWKCJwcmVwYXJlQXN5bmMiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmICgobVBsYXllciAhPSAwKSAmJiAobUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX0lOSVRJQUxJWkVEIHwgTUVESUFfUExBWUVSMl9TVE9QUEVEKSkpIHsKLSAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0QXVkaW9BdHRyaWJ1dGVzX2woKm1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwpOworICAgIGlmICgobVBsYXllciAhPSAwKSAmJiAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfSU5JVElBTElaRUQpKSB7CisgICAgICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNldEF1ZGlvQXR0cmlidXRlc19sKG1BdWRpb0F0dHJpYnV0ZXMtPmdldEpPYmplY3QoKSk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgewotICAgICAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRBdWRpb1N0cmVhbVR5cGUobVN0cmVhbVR5cGUpOwogICAgICAgICB9CiAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1BSRVBBUklORzsKICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnByZXBhcmVBc3luYygpOwpAQCAtNzgxLDcgKzUzMiw3IEBACiAgICAgICAgIG1QbGF5ZXItPnNldExvb3BpbmcobUxvb3ApOwogCiAgICAgICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgewotICAgICAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7CisgICAgICAgICAgICBtQXVkaW9PdXRwdXQtPnNldFZvbHVtZShtVm9sdW1lKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgewpAQCAtODA2LDMwICs1NTcsMTIgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnN0b3AoKSB7Ci0gICAgQUxPR1YoInN0b3AiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9TVE9QUEVEKSByZXR1cm4gTk9fRVJST1I7Ci0gICAgaWYgKCAobVBsYXllciAhPSAwKSAmJiAoIG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8IE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfAotICAgICAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUgKSApICkgewotICAgICAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5zdG9wKCk7Ci0gICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfU1RPUFBFRDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBBTE9HRSgic3RvcCBjYWxsZWQgaW4gc3RhdGUgJWQsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCiBzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnBhdXNlKCkgewogICAgIEFMT0dWKCJwYXVzZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9QQVVTRUR8TUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpCiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICBpZiAoKG1QbGF5ZXIgIT0gMCkgJiYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUQVJURUQpKSB7CisgICAgaWYgKChtUGxheWVyICE9IDApICYmIChtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8IE1FRElBX1BMQVlFUjJfUFJFUEFSRUQpKSkgewogICAgICAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5wYXVzZSgpOwogICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUjsKQEAgLTg2MCw3ICs1OTMsNyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotbWVkaWFwbGF5ZXIyX3N0YXRlcyBNZWRpYVBsYXllcjI6OmdldE1lZGlhUGxheWVyMlN0YXRlKCkgeworbWVkaWFwbGF5ZXIyX3N0YXRlcyBNZWRpYVBsYXllcjI6OmdldFN0YXRlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBNRURJQVBMQVlFUjJfU1RBVEVfRVJST1I7CkBAIC04NzMsOCArNjA2LDcgQEAKICAgICBpZiAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RBUlRFRCkgewogICAgICAgICByZXR1cm4gTUVESUFQTEFZRVIyX1NUQVRFX1BMQVlJTkc7CiAgICAgfQotICAgIGlmIChtQ3VycmVudFN0YXRlCi0gICAgICAgICYgKE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9TVE9QUEVEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpIHsKKyAgICBpZiAobUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpKSB7CiAgICAgICAgIHJldHVybiBNRURJQVBMQVlFUjJfU1RBVEVfUEFVU0VEOwogICAgIH0KICAgICAvLyBub3cgb25seSBtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9QUkVQQVJFRCBpcyB0cnVlCkBAIC04OTAsNyArNjIyLDcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBsYXllciA9PSAwIHx8IChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9TVE9QUEVEKSkgeworICAgIGlmIChtUGxheWVyID09IDApIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtOTc4LDExICs3MTAsMTggQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OmdldER1cmF0aW9uKGludDY0X3QgKm1zZWMpIHsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0RHVyYXRpb24oaW50NjRfdCBzcmNJZCwgaW50NjRfdCAqbXNlYykgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgLy8gVE9ETzogY2FjaGUgZHVyYXRpb24gZm9yIGN1cnJlbnRTcmNJZCBhbmQgbmV4dFNyY0lkLCBhbmQgcmV0dXJuIGNvcnJlY3QKKyAgICAvLyB2YWx1ZSBmb3IgbmV4dFNyY0lkLgorICAgIGlmIChzcmNJZCAhPSBtU3JjSWQpIHsKKyAgICAgICAgKm1zZWMgPSAtMTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKwogICAgIEFMT0dWKCJnZXREdXJhdGlvbl9sIik7CiAgICAgYm9vbCBpc1ZhbGlkU3RhdGUgPSAobUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX1BSRVBBUkVEIHwgTUVESUFfUExBWUVSMl9TVEFSVEVEIHwKLSAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9TVE9QUEVEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpOworICAgICAgICAgICAgTUVESUFfUExBWUVSMl9QQVVTRUQgfCBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFKSk7CiAgICAgaWYgKG1QbGF5ZXIgPT0gMCB8fCAhaXNWYWxpZFN0YXRlKSB7CiAgICAgICAgIEFMT0dFKCJBdHRlbXB0IHRvIGNhbGwgZ2V0RHVyYXRpb24gaW4gd3Jvbmcgc3RhdGU6IG1QbGF5ZXI9JXAsIG1DdXJyZW50U3RhdGU9JXUiLAogICAgICAgICAgICAgICAgIG1QbGF5ZXIuZ2V0KCksIG1DdXJyZW50U3RhdGUpOwpAQCAtMTEzOCwxOCArODc3LDE3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldFZvbHVtZShmbG9hdCBsZWZ0Vm9sdW1lLCBmbG9hdCByaWdodFZvbHVtZSkgewotICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OnNldFZvbHVtZSglZiwgJWYpIiwgbGVmdFZvbHVtZSwgcmlnaHRWb2x1bWUpOworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6c2V0Vm9sdW1lKCVmKSIsIHZvbHVtZSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtTGVmdFZvbHVtZSA9IGxlZnRWb2x1bWU7Ci0gICAgbVJpZ2h0Vm9sdW1lID0gcmlnaHRWb2x1bWU7CisgICAgbVZvbHVtZSA9IHZvbHVtZTsKICAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHsKLSAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRWb2x1bWUobGVmdFZvbHVtZSwgcmlnaHRWb2x1bWUpOworICAgICAgICBtQXVkaW9PdXRwdXQtPnNldFZvbHVtZSh2b2x1bWUpOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QXVkaW9TZXNzaW9uSWQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgeworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb1Nlc3Npb25JZChpbnQzMl90IHNlc3Npb25JZCkgewogICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OnNldEF1ZGlvU2Vzc2lvbklkKCVkKSIsIHNlc3Npb25JZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAoIShtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9JRExFKSkgewpAQCAtMTE1OSwxNyArODk3LDE4IEBACiAgICAgaWYgKHNlc3Npb25JZCA8IDApIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgaWYgKHNlc3Npb25JZCAhPSBtQXVkaW9TZXNzaW9uSWQpIHsKLSAgICAgICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChzZXNzaW9uSWQsIC0xKTsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQsIC0xKTsKLSAgICAgICAgbUF1ZGlvU2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gTlVMTCAmJiBzZXNzaW9uSWQgIT0gbUF1ZGlvT3V0cHV0LT5nZXRTZXNzaW9uSWQoKSkgeworICAgICAgICBtQXVkaW9PdXRwdXQtPnNldFNlc3Npb25JZChzZXNzaW9uSWQpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWF1ZGlvX3Nlc3Npb25fdCBNZWRpYVBsYXllcjI6OmdldEF1ZGlvU2Vzc2lvbklkKCkgeworaW50MzJfdCBNZWRpYVBsYXllcjI6OmdldEF1ZGlvU2Vzc2lvbklkKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1BdWRpb1Nlc3Npb25JZDsKKyAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb091dHB1dC0+Z2V0U2Vzc2lvbklkKCk7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCkgewpAQCAtMTE5Niw2NyArOTM1LDM3IEBACiB9CiAKIC8vIGFsd2F5cyBjYWxsIHdpdGggbG9jayBoZWxkCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OmNoZWNrU3RhdGVGb3JLZXlTZXRfbChpbnQga2V5KSB7Ci0gICAgc3dpdGNoKGtleSkgewotICAgIGNhc2UgTUVESUEyX0tFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKLSAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfCBNRURJQV9QTEFZRVIyX1NUQVJURUQgfAotICAgICAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkgKSB7Ci0gICAgICAgICAgICAvLyBDYW4ndCBjaGFuZ2UgdGhlIGF1ZGlvIGF0dHJpYnV0ZXMgYWZ0ZXIgcHJlcGFyZQotICAgICAgICAgICAgQUxPR0UoInRyeWluZyB0byBzZXQgYXVkaW8gYXR0cmlidXRlcyBjYWxsZWQgaW4gc3RhdGUgJWQiLCBtQ3VycmVudFN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICAvLyBwYXJhbWV0ZXIgZG9lc24ndCByZXF1aXJlIHBsYXllciBzdGF0ZSBjaGVjawotICAgICAgICBicmVhazsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6Y2hlY2tTdGF0ZV9sKCkgeworICAgIGlmIChtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVIyX1BSRVBBUkVEIHwgTUVESUFfUExBWUVSMl9TVEFSVEVEIHwKKyAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkgKSB7CisgICAgICAgIC8vIENhbid0IGNoYW5nZSB0aGUgYXVkaW8gYXR0cmlidXRlcyBhZnRlciBwcmVwYXJlCisgICAgICAgIEFMT0dFKCJ0cnlpbmcgdG8gc2V0IGF1ZGlvIGF0dHJpYnV0ZXMgY2FsbGVkIGluIHN0YXRlICVkIiwgbUN1cnJlbnRTdGF0ZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwmIHJlcXVlc3QpIHsKLSAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRQYXJhbWV0ZXIoJWQpIiwga2V5KTsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcykgeworICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OnNldEF1ZGlvQXR0cmlidXRlcyIpOwogICAgIHN0YXR1c190IHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKGNoZWNrU3RhdGVGb3JLZXlTZXRfbChrZXkpICE9IE9LKSB7CisgICAgaWYgKGNoZWNrU3RhdGVfbCgpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotICAgIHN3aXRjaCAoa2V5KSB7Ci0gICAgY2FzZSBNRURJQTJfS0VZX1BBUkFNRVRFUl9BVURJT19BVFRSSUJVVEVTOgotICAgICAgICAvLyBzYXZlIHRoZSBtYXJzaGFsbGVkIGF1ZGlvIGF0dHJpYnV0ZXMKLSAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgewotICAgICAgICAgICAgZGVsZXRlIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWw7Ci0gICAgICAgIH0KLSAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbCA9IG5ldyBQYXJjZWwoKTsKLSAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbC0+YXBwZW5kRnJvbSgmcmVxdWVzdCwgMCwgcmVxdWVzdC5kYXRhU2l6ZSgpKTsKLSAgICAgICAgc3RhdHVzID0gc2V0QXVkaW9BdHRyaWJ1dGVzX2wocmVxdWVzdCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1ZfSUYobVBsYXllciA9PSBOVUxMLCAic2V0UGFyYW1ldGVyOiBubyBhY3RpdmUgcGxheWVyIik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChtUGxheWVyICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzID0gbVBsYXllci0+c2V0UGFyYW1ldGVyKGtleSwgcmVxdWVzdCk7Ci0gICAgfQorICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSBuZXcgSk9iamVjdEhvbGRlcihhdHRyaWJ1dGVzKTsKKyAgICBzdGF0dXMgPSBzZXRBdWRpb0F0dHJpYnV0ZXNfbChhdHRyaWJ1dGVzKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCitqb2JqZWN0IE1lZGlhUGxheWVyMjo6Z2V0QXVkaW9BdHRyaWJ1dGVzKCkgeworICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OmdldEF1ZGlvQXR0cmlidXRlcykiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9BdHRyaWJ1dGVzICE9IE5VTEwgPyBtQXVkaW9BdHRyaWJ1dGVzLT5nZXRKT2JqZWN0KCkgOiBOVUxMOworfQorCiBzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7CiAgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6Z2V0UGFyYW1ldGVyKCVkKSIsIGtleSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAoa2V5ID09IE1FRElBMl9LRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVMpIHsKLSAgICAgICAgaWYgKHJlcGx5ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgewotICAgICAgICAgICAgcmVwbHktPmFwcGVuZEZyb20obUF1ZGlvQXR0cmlidXRlc1BhcmNlbCwgMCwgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbC0+ZGF0YVNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQogICAgIGlmIChtUGxheWVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR1YoImdldFBhcmFtZXRlcjogbm8gYWN0aXZlIHBsYXllciIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0xMjY5LDQ0ICs5NzgsMjYgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1ib29sIE1lZGlhUGxheWVyMjo6c2hvdWxkRHJvcE1ldGFkYXRhKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSBjb2RlKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotCi0gICAgaWYgKGZpbmRNZXRhZGF0YShtTWV0YWRhdGFEcm9wLCBjb2RlKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKy8vIGZvciBtZWRpYW1ldHJpY3MKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0TWV0cmljcyhjaGFyICoqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCkgeworICAgIEFMT0dEKCJNZWRpYVBsYXllcjI6OmdldE1ldHJpY3MoKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigiZ2V0TWV0cmljczogbm8gYWN0aXZlIHBsYXllciIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgaWYgKG1NZXRhZGF0YUFsbG93LmlzRW1wdHkoKSB8fCBmaW5kTWV0YWRhdGEobU1ldGFkYXRhQWxsb3csIGNvZGUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSAgbVBsYXllci0+Z2V0TWV0cmljcyhidWZmZXIsIGxlbmd0aCk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBBTE9HRCgiZ2V0TWV0cmljcyByZXR1cm5zICVkIiwgc3RhdHVzKTsKICAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotCi12b2lkIE1lZGlhUGxheWVyMjo6YWRkTmV3TWV0YWRhdGFVcGRhdGUobWVkaWE6Ok1ldGFkYXRhOjpUeXBlIG1ldGFkYXRhX3R5cGUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1NZXRhZGF0YVVwZGF0ZWQuaW5kZXhPZihtZXRhZGF0YV90eXBlKSA8IDApIHsKLSAgICAgICAgbU1ldGFkYXRhVXBkYXRlZC5hZGQobWV0YWRhdGFfdHlwZSk7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhUGxheWVyMjo6bm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopIHsKK3ZvaWQgTWVkaWFQbGF5ZXIyOjpub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQbGF5ZXJNZXNzYWdlICpvYmopIHsKICAgICBBTE9HVigibWVzc2FnZSByZWNlaXZlZCBzcmNJZD0lbGxkLCBtc2c9JWQsIGV4dDE9JWQsIGV4dDI9JWQiLAogICAgICAgICAgIChsb25nIGxvbmcpc3JjSWQsIG1zZywgZXh0MSwgZXh0Mik7CiAKLSAgICBpZiAoTUVESUEyX0lORk8gPT0gbXNnICYmIE1FRElBMl9JTkZPX01FVEFEQVRBX1VQREFURSA9PSBleHQxKSB7Ci0gICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6VHlwZSBtZXRhZGF0YV90eXBlID0gZXh0MjsKLQotICAgICAgICBpZihzaG91bGREcm9wTWV0YWRhdGEobWV0YWRhdGFfdHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFVwZGF0ZSB0aGUgbGlzdCBvZiBtZXRhZGF0YSB0aGF0IGhhdmUgY2hhbmdlZC4gZ2V0TWV0YWRhdGEKLSAgICAgICAgLy8gYWxzbyBhY2Nlc3MgbU1ldGFkYXRhVXBkYXRlZCBhbmQgY2xlYXJzIGl0LgotICAgICAgICBhZGROZXdNZXRhZGF0YVVwZGF0ZShtZXRhZGF0YV90eXBlKTsKLSAgICB9Ci0KICAgICBib29sIHNlbmQgPSB0cnVlOwogICAgIGJvb2wgbG9ja2VkID0gZmFsc2U7CiAKQEAgLTE0MTgsNyArMTEwOSw4IEBACiB9CiAKIC8vIE1vZHVsYXIgRFJNCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBkcm1TZXNzaW9uSWQpIHsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6cHJlcGFyZURybSgKKyAgICAgICAgaW50NjRfdCBzcmNJZCwgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBkcm1TZXNzaW9uSWQpIHsKICAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgogICAgIEFMT0dEKCJwcmVwYXJlRHJtOiB1dWlkOiAlcCAgZHJtU2Vzc2lvbklkOiAlcCglenUpIiwgdXVpZCwKICAgICAgICAgICAgIGRybVNlc3Npb25JZC5hcnJheSgpLCBkcm1TZXNzaW9uSWQuc2l6ZSgpKTsKQEAgLTE0MzIsOCArMTEyNCwxMCBAQAogICAgIC8vIGNvbXBsZXRlZCkgc28gdGhlIHN0YXRlIGNoYW5nZSB0byAicHJlcGFyZWQiIG1pZ2h0IG5vdCBoYXZlIGhhcHBlbmVkIHlldCAoZS5nLiwgYnVmZmVyaW5nKS4KICAgICAvLyBTdGlsbCwgd2UgY2FuIGFsbG93IHByZXBhcmVEcm0gZm9yIHRoZSB1c2UgY2FzZSBvZiBiZWluZyBjYWxsZWQgaW4gT25Ecm1JbmZvTGlzdGVuZXIuCiAgICAgaWYgKCEobUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX1BSRVBBUklORyB8IE1FRElBX1BMQVlFUjJfUFJFUEFSRUQpKSkgewotICAgICAgICBBTE9HRSgicHJlcGFyZURybSBpcyBjYWxsZWQgaW4gdGhlIHdyb25nIHN0YXRlICglZCkuIiwgbUN1cnJlbnRTdGF0ZSk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgQUxPR1coInByZXBhcmVEcm0oJWxsZCkgY2FsbGVkIGluIG5vbi1wcmVwYXJlIHN0YXRlKCVkKSIsIChsb25nIGxvbmcpc3JjSWQsIG1DdXJyZW50U3RhdGUpOworICAgICAgICBpZiAoc3JjSWQgPT0gbVNyY0lkKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoZHJtU2Vzc2lvbklkLmlzRW1wdHkoKSkgewpAQCAtMTQ0Miw3ICsxMTM2LDcgQEAKICAgICB9CiAKICAgICAvLyBQYXNzaW5nIGRvd24gdG8gbWVkaWFzZXJ2ZXIgbWFpbmx5IGZvciBjcmVhdGluZyB0aGUgY3J5cHRvCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBsYXllci0+cHJlcGFyZURybSh1dWlkLCBkcm1TZXNzaW9uSWQpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1QbGF5ZXItPnByZXBhcmVEcm0oc3JjSWQsIHV1aWQsIGRybVNlc3Npb25JZCk7CiAgICAgQUxPR0VfSUYoc3RhdHVzICE9IE9LLCAicHJlcGFyZURybTogRmFpbGVkIGF0IG1lZGlhc2VydmVyIHdpdGggcmV0OiAlZCIsIHN0YXR1cyk7CiAKICAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgpAQCAtMTQ1MSw3ICsxMTQ1LDcgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnJlbGVhc2VEcm0oKSB7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnJlbGVhc2VEcm0oaW50NjRfdCBzcmNJZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1QbGF5ZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTE0NjYsNyArMTE2MCw3IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGxheWVyLT5yZWxlYXNlRHJtKCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBsYXllci0+cmVsZWFzZURybShzcmNJZCk7CiAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKICAgICBBTE9HRCgicmVsZWFzZURybTogbWVkaWFzZXJ2ZXI6OnJlbGVhc2VEcm0gcmV0OiAlZCIsIHN0YXR1cyk7CiAgICAgaWYgKHN0YXR1cyAhPSBPSykgewpAQCAtMTQ3OSwzNiArMTE3Myw0MCBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0UHJlZmVycmVkRGV2aWNlKGpvYmplY3QgZGV2aWNlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUF1ZGlvT3V0cHV0ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoInNldE91dHB1dERldmljZTogYXVkaW8gc2luayBub3QgaW5pdCIpOworICAgICAgICBBTE9HVigic2V0UHJlZmVycmVkRGV2aWNlOiBhdWRpbyBzaW5rIG5vdCBpbml0Iik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5zZXRPdXRwdXREZXZpY2UoZGV2aWNlSWQpOworICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPnNldFByZWZlcnJlZERldmljZShkZXZpY2UpOwogfQogCi1hdWRpb19wb3J0X2hhbmRsZV90IE1lZGlhUGxheWVyMjo6Z2V0Um91dGVkRGV2aWNlSWQoKSB7Citqb2JqZWN0IE1lZGlhUGxheWVyMjo6Z2V0Um91dGVkRGV2aWNlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1BdWRpb091dHB1dCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJnZXRSb3V0ZWREZXZpY2VJZDogYXVkaW8gc2luayBub3QgaW5pdCIpOwotICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgQUxPR1YoImdldFJvdXRlZERldmljZTogYXVkaW8gc2luayBub3QgaW5pdCIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9PdXRwdXQtPmdldFJvdXRlZERldmljZUlkKCZkZXZpY2VJZCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICB9Ci0gICAgcmV0dXJuIGRldmljZUlkOworICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPmdldFJvdXRlZERldmljZSgpOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSB7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCByb3V0aW5nRGVsZWdhdGUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtQXVkaW9PdXRwdXQgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiYWRkQXVkaW9EZXZpY2VDYWxsYmFjazogcGxheWVyIG5vdCBpbml0Iik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5lbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGVuYWJsZWQpOworICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2socm91dGluZ0RlbGVnYXRlKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtQXVkaW9PdXRwdXQgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigiYWRkQXVkaW9EZXZpY2VDYWxsYmFjazogcGxheWVyIG5vdCBpbml0Iik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5yZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGxpc3RlbmVyKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9BbmRyb2lkLmJwCmluZGV4IDliM2FhZDIuLjBmNjliMmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0FuZHJvaWQuYnAKQEAgLTEsNiArMSw3IEBACiBjY19saWJyYXJ5X3N0YXRpYyB7CiAKICAgICBzcmNzOiBbCisgICAgICAgICJKTWVkaWFQbGF5ZXIyVXRpbHMuY3BwIiwKICAgICAgICAgIkpXYWtlTG9jay5jcHAiLAogICAgICAgICAiR2VuZXJpY1NvdXJjZTIuY3BwIiwKICAgICAgICAgIkhUVFBMaXZlU291cmNlMi5jcHAiLApAQCAtMjgsNiArMjksOCBAQAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzIiwKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcCIsCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dCIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL25kayIsCisgICAgICAgICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTQ4LDEzICs1MSwxNiBAQAogICAgICAgICAibGlidWkiLAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYm1lZGlhIiwKLSAgICAgICAgImxpYm1lZGlhZHJtIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJtZWRpYW5ka191dGlscyIsCiAgICAgICAgICJsaWJwb3dlcm1hbmFnZXIiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYm1lZGlhcGxheWVyMi1wcm90b3MiLAorICAgICAgICAibGlibWVkaWEyX2puaV9jb3JlIiwKICAgICBdLAogCiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X251cGxheWVyMiIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuY3BwCmluZGV4IDE5NmIxMDMuLjk1NTI1ODAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuY3BwCkBAIC0yMSwzMCArMjEsMTkgQEAKICNpbmNsdWRlICJOdVBsYXllcjJEcm0uaCIKIAogI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFCdWZmZXJIb2xkZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtXcmFwcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTmRrVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCi0jaW5jbHVkZSAiLi4vLi4vbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTg5LDggKzc4LDYgQEAKIHZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6cmVzZXREYXRhU291cmNlKCkgewogICAgIEFMT0dWKCJyZXNldERhdGFTb3VyY2UiKTsKIAotICAgIG1IVFRQU2VydmljZS5jbGVhcigpOwotICAgIG1IdHRwU291cmNlLmNsZWFyKCk7CiAgICAgbURpc2Nvbm5lY3RlZCA9IGZhbHNlOwogICAgIG1VcmkuY2xlYXIoKTsKICAgICBtVXJpSGVhZGVycy5jbGVhcigpOwpAQCAtMTEwLDcgKzk3LDYgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAogICAgICAgICBjb25zdCBjaGFyICp1cmwsCiAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTExOCw3ICsxMDQsNiBAQAogCiAgICAgcmVzZXREYXRhU291cmNlKCk7CiAKLSAgICBtSFRUUFNlcnZpY2UgPSBodHRwU2VydmljZTsKICAgICBtVXJpID0gdXJsOwogCiAgICAgaWYgKGhlYWRlcnMpIHsKQEAgLTE1MSw3ICsxMzYsNyBAQAogICAgIEFMT0dWKCJzZXREYXRhU291cmNlIChzb3VyY2U6ICVwKSIsIHNvdXJjZS5nZXQoKSk7CiAKICAgICByZXNldERhdGFTb3VyY2UoKTsKLSAgICBtRGF0YVNvdXJjZSA9IHNvdXJjZTsKKyAgICBtRGF0YVNvdXJjZVdyYXBwZXIgPSBuZXcgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoc291cmNlKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE2MiwyNCArMTQ3LDIxIEBACiAKIHN0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmluaXRGcm9tRGF0YVNvdXJjZSgpIHsKICAgICBtRXh0cmFjdG9yID0gbmV3IEFNZWRpYUV4dHJhY3RvcldyYXBwZXIoQU1lZGlhRXh0cmFjdG9yX25ldygpKTsKLSAgICBDSEVDSyhtRGF0YVNvdXJjZSAhPSBOVUxMIHx8IG1GZCAhPSAtMSk7Ci0gICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IG1EYXRhU291cmNlOworICAgIENIRUNLKG1GZCA+PTAgfHwgbURhdGFTb3VyY2VXcmFwcGVyICE9IE5VTEwpOworICAgIHNwPEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyPiBhU291cmNlV3JhcHBlciA9IG1EYXRhU291cmNlV3JhcHBlcjsKICAgICBjb25zdCBpbnQgZmQgPSBtRmQ7Ci0gICAgY29uc3QgaW50NjRfdCBvZmZzZXQgPSBtT2Zmc2V0OwotICAgIGNvbnN0IGludDY0X3QgbGVuZ3RoID0gbUxlbmd0aDsKIAogICAgIG1Mb2NrLnVubG9jaygpOwogICAgIC8vIFRoaXMgbWlnaHQgdGFrZSBsb25nIHRpbWUgaWYgZGF0YSBzb3VyY2UgaXMgbm90IHJlbGlhYmxlLgogICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAoZGF0YVNvdXJjZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIG1EYXRhU291cmNlV3JhcHBlciA9IG5ldyBBTWVkaWFEYXRhU291cmNlV3JhcHBlcihkYXRhU291cmNlKTsKLSAgICAgICAgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShtRGF0YVNvdXJjZVdyYXBwZXItPmdldEFNZWRpYURhdGFTb3VyY2UoKSk7CisgICAgaWYgKGFTb3VyY2VXcmFwcGVyICE9IE5VTEwpIHsKKyAgICAgICAgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShhU291cmNlV3JhcHBlci0+Z2V0QU1lZGlhRGF0YVNvdXJjZSgpKTsKICAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBtRXh0cmFjdG9yLT5zZXREYXRhU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UoZmQsIG1PZmZzZXQsIG1MZW5ndGgpOwogICAgIH0KIAogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoImluaXRGcm9tRGF0YVNvdXJjZSwgZmFpbGVkIHRvIGNyZWF0ZSBkYXRhIHNvdXJjZSEiKTsKKyAgICAgICAgQUxPR0UoImluaXRGcm9tRGF0YVNvdXJjZSwgZmFpbGVkIHRvIHNldCBleHRyYWN0b3IgZGF0YSBzb3VyY2UhIik7CiAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQpAQCAtMTkxLDEwICsxNzMsOCBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICBtTG9jay5sb2NrKCk7Ci0gICAgbUZkID0gLTE7Ci0gICAgbURhdGFTb3VyY2UgPSBkYXRhU291cmNlOwogICAgIG1GaWxlTWV0YSA9IGNvbnZlcnRNZWRpYUZvcm1hdFdyYXBwZXJUb01ldGFEYXRhKG1FeHRyYWN0b3ItPmdldEZvcm1hdCgpKTsKKyAgICBtTG9jay5sb2NrKCk7CiAgICAgaWYgKG1GaWxlTWV0YSAhPSBOVUxMKSB7CiAgICAgICAgIGludDY0X3QgZHVyYXRpb247CiAgICAgICAgIGlmIChtRmlsZU1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikpIHsKQEAgLTIxNSwxMCArMTk1LDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICBzcDxBTWVkaWFFeHRyYWN0b3JXcmFwcGVyPiB0cmFja0V4dHJhY3RvciA9IG5ldyBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyKEFNZWRpYUV4dHJhY3Rvcl9uZXcoKSk7Ci0gICAgICAgIGlmIChtRGF0YVNvdXJjZVdyYXBwZXIgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgZXJyID0gdHJhY2tFeHRyYWN0b3ItPnNldERhdGFTb3VyY2UobURhdGFTb3VyY2VXcmFwcGVyLT5nZXRBTWVkaWFEYXRhU291cmNlKCkpOworICAgICAgICBpZiAoYVNvdXJjZVdyYXBwZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgdHJhY2tFeHRyYWN0b3ItPnNldERhdGFTb3VyY2UoYVNvdXJjZVdyYXBwZXItPmdldEFNZWRpYURhdGFTb3VyY2UoKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlcnIgPSB0cmFja0V4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICAgICAgdHJhY2tFeHRyYWN0b3ItPnNldERhdGFTb3VyY2UoZmQsIG1PZmZzZXQsIG1MZW5ndGgpOwogICAgICAgICB9CiAKICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKQEAgLTMzMCwxOSArMzEwLDE5IEBACiAgICAgICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKGlkKCkpOwogICAgICAgICBtTG9vcGVyLT5zdG9wKCk7CiAgICAgfQotICAgIGlmIChtRGF0YVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1EYXRhU291cmNlLT5jbG9zZSgpOworICAgIGlmIChtRGF0YVNvdXJjZVdyYXBwZXIgIT0gTlVMTCkgeworICAgICAgICBtRGF0YVNvdXJjZVdyYXBwZXItPmNsb3NlKCk7CiAgICAgfQogICAgIHJlc2V0RGF0YVNvdXJjZSgpOwogfQogCi12b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnByZXBhcmVBc3luYygpIHsKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6cHJlcGFyZUFzeW5jKGludDY0X3Qgc3RhcnRUaW1lVXMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEFMT0dWKCJwcmVwYXJlQXN5bmM6IChsb29wZXI6ICVkKSIsIChtTG9vcGVyICE9IE5VTEwpKTsKIAogICAgIGlmIChtTG9vcGVyID09IE5VTEwpIHsKICAgICAgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgICAgICBtTG9vcGVyLT5zZXROYW1lKCJnZW5lcmljIik7CisgICAgICAgIG1Mb29wZXItPnNldE5hbWUoImdlbmVyaWMyIik7CiAgICAgICAgIG1Mb29wZXItPnN0YXJ0KGZhbHNlLCAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8qIGNhbkNhbGxKYXZhICovCiAgICAgICAgICAgICAgICAgICAgICAgIFBSSU9SSVRZX0RFRkFVTFQpOwpAQCAtMzUxLDU5ICszMzEsNDUgQEAKICAgICB9CiAKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UHJlcGFyZUFzeW5jLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDY0KCJzdGFydFRpbWVVcyIsIHN0YXJ0VGltZVVzKTsKKwogICAgIG1zZy0+cG9zdCgpOwogfQogCi12b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6Om9uUHJlcGFyZUFzeW5jKCkgewotICAgIEFMT0dWKCJvblByZXBhcmVBc3luYzogbURhdGFTb3VyY2U6ICVkIiwgKG1EYXRhU291cmNlICE9IE5VTEwpKTsKK3ZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6b25QcmVwYXJlQXN5bmMoaW50NjRfdCBzdGFydFRpbWVVcykgeworICAgIEFMT0dWKCJvblByZXBhcmVBc3luYzogbUZkICVkIG1VcmkgJXMgbURhdGFTb3VyY2VXcmFwcGVyOiAlcCIsCisgICAgICAgICAgICBtRmQsIG1VcmkuY19zdHIoKSwgbURhdGFTb3VyY2VXcmFwcGVyLmdldCgpKTsKIAotICAgIC8vIGRlbGF5ZWQgZGF0YSBzb3VyY2UgY3JlYXRpb24KLSAgICBpZiAobURhdGFTb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAvLyBzZXQgdG8gZmFsc2UgZmlyc3QsIGlmIHRoZSBleHRyYWN0b3IKLSAgICAgICAgLy8gY29tZXMgYmFjayBhcyBzZWN1cmUsIHNldCBpdCB0byB0cnVlIHRoZW4uCi0gICAgICAgIG1Jc1NlY3VyZSA9IGZhbHNlOwotCi0gICAgICAgIGlmICghbVVyaS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiB1cmkgPSBtVXJpLmNfc3RyKCk7Ci0gICAgICAgICAgICBTdHJpbmc4IGNvbnRlbnRUeXBlOwotCi0gICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgdXJpLCA3KSB8fCAhc3RybmNhc2VjbXAoImh0dHBzOi8vIiwgdXJpLCA4KSkgewotICAgICAgICAgICAgICAgIG1IdHRwU291cmNlID0gRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZU1lZGlhSFRUUChtSFRUUFNlcnZpY2UpOwotICAgICAgICAgICAgICAgIGlmIChtSHR0cFNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIGh0dHAgc291cmNlISIpOwotICAgICAgICAgICAgICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoVU5LTk9XTl9FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgLy8gVGhpcyBtaWdodCB0YWtlIGxvbmcgdGltZSBpZiBjb25uZWN0aW9uIGhhcyBzb21lIGlzc3VlLgotICAgICAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVGcm9tVVJJKAotICAgICAgICAgICAgICAgICAgIG1IVFRQU2VydmljZSwgdXJpLCAmbVVyaUhlYWRlcnMsICZjb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihtSHR0cFNvdXJjZS5nZXQoKSkpOwotICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgaWYgKCFtRGlzY29ubmVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBkYXRhU291cmNlOwotICAgICAgICAgICAgfQorICAgIGlmICghbVVyaS5lbXB0eSgpKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHVyaSA9IG1VcmkuY19zdHIoKTsKKyAgICAgICAgc2l6ZV90IG51bWhlYWRlcnMgPSBtVXJpSGVhZGVycy5zaXplKCk7CisgICAgICAgIGNvbnN0IGNoYXIgKiprZXlfdmFsdWVzID0gbnVtaGVhZGVycyA/IG5ldyBjb25zdCBjaGFyICpbbnVtaGVhZGVycyAqIDJdIDogTlVMTDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1oZWFkZXJzOyArK2kpIHsKKyAgICAgICAgICAgIGtleV92YWx1ZXNbaSAqIDJdID0gbVVyaUhlYWRlcnMua2V5QXQoaSkuY19zdHIoKTsKKyAgICAgICAgICAgIGtleV92YWx1ZXNbaSAqIDIgKyAxXSA9ICBtVXJpSGVhZGVycy52YWx1ZUF0KGkpLmNfc3RyKCk7CiAgICAgICAgIH0KLQotICAgICAgICBpZiAobUZkID09IC0xICYmIG1EYXRhU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIGRhdGEgc291cmNlISIpOwotICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKFVOS05PV05fRVJST1IpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICBBTWVkaWFEYXRhU291cmNlICphU291cmNlID0gQU1lZGlhRGF0YVNvdXJjZV9uZXdVcmkodXJpLCBudW1oZWFkZXJzLCBrZXlfdmFsdWVzKTsKKyAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICBtRGF0YVNvdXJjZVdyYXBwZXIgPSBhU291cmNlID8gbmV3IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKGFTb3VyY2UpIDogTlVMTDsKKyAgICAgICAgZGVsZXRlW10ga2V5X3ZhbHVlczsKKyAgICAgICAgLy8gRm9yIGNhY2hlZCBzdHJlYW1pbmcgY2FzZXMsIHdlIG5lZWQgdG8gd2FpdCBmb3IgZW5vdWdoCisgICAgICAgIC8vIGJ1ZmZlcmluZyBiZWZvcmUgcmVwb3J0aW5nIHByZXBhcmVkLgorICAgICAgICBtSXNTdHJlYW1pbmcgPSAhc3RybmNhc2VjbXAoImh0dHA6Ly8iLCB1cmksIDcpIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCB1cmksIDgpOwogICAgIH0KIAotICAgIGlmIChtRGF0YVNvdXJjZSAhPSBudWxscHRyICYmIG1EYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpIHsKLSAgICAgICAgbUNhY2hlZFNvdXJjZSA9IHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihtRGF0YVNvdXJjZS5nZXQoKSk7CisgICAgaWYgKG1EaXNjb25uZWN0ZWQgfHwgKG1GZCA8IDAgJiYgbURhdGFTb3VyY2VXcmFwcGVyID09IE5VTEwpKSB7CisgICAgICAgIEFMT0dFKCJtRGlzY29ubmVjdGVkKCVkKSBvciBGYWlsZWQgdG8gY3JlYXRlIGRhdGEgc291cmNlISIsIG1EaXNjb25uZWN0ZWQpOworICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoVU5LTk9XTl9FUlJPUik7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICAvLyBGb3IgY2FjaGVkIHN0cmVhbWluZyBjYXNlcywgd2UgbmVlZCB0byB3YWl0IGZvciBlbm91Z2gKLSAgICAvLyBidWZmZXJpbmcgYmVmb3JlIHJlcG9ydGluZyBwcmVwYXJlZC4KLSAgICBtSXNTdHJlYW1pbmcgPSAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKTsKLQogICAgIC8vIGluaXQgZXh0cmFjdG9yIGZyb20gZGF0YSBzb3VyY2UKICAgICBzdGF0dXNfdCBlcnIgPSBpbml0RnJvbURhdGFTb3VyY2UoKTsKKyAgICBpZiAobUZkID49IDApIHsKKyAgICAgICAgY2xvc2UobUZkKTsKKyAgICAgICAgbUZkID0gLTE7CisgICAgfQogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgZnJvbSBkYXRhIHNvdXJjZSEiKTsKQEAgLTQzMCw2ICszOTYsNyBAQAogICAgICAgICAgICAgRkxBR19DQU5fU0VFS19GT1JXQVJEIHwKICAgICAgICAgICAgIEZMQUdfQ0FOX1NFRUspOwogCisgICAgZG9TZWVrKHN0YXJ0VGltZVVzLCBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19DTE9TRVNUKTsKICAgICBmaW5pc2hQcmVwYXJlQXN5bmMoKTsKIAogICAgIEFMT0dWKCJvblByZXBhcmVBc3luYzogRG9uZSIpOwpAQCAtNDM5LDggKzQwNiw4IEBACiAgICAgQUxPR1YoImZpbmlzaFByZXBhcmVBc3luYyIpOwogCiAgICAgaWYgKG1Jc1N0cmVhbWluZykgewotICAgICAgICBtQ2FjaGVkU291cmNlLT5yZXN1bWVGZXRjaGluZ0lmTmVjZXNzYXJ5KCk7CiAgICAgICAgIG1QcmVwYXJpbmcgPSB0cnVlOworICAgICAgICArK21Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbjsKICAgICAgICAgc2NoZWR1bGVQb2xsQnVmZmVyaW5nKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbm90aWZ5UHJlcGFyZWQoKTsKQEAgLTQ1Nyw5ICs0MjQsNyBAQAogCiB2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6Om5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChzdGF0dXNfdCBlcnIpIHsKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIG1EYXRhU291cmNlLmNsZWFyKCk7Ci0gICAgICAgIG1DYWNoZWRTb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgbUh0dHBTb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgbURhdGFTb3VyY2VXcmFwcGVyLmNsZWFyKCk7CiAKICAgICAgICAgbUJpdHJhdGUgPSAtMTsKICAgICAgICAgbVByZXZCdWZmZXJQZXJjZW50YWdlID0gLTE7CkBAIC00OTksNTMgKzQ2NCwyNyBAQAogfQogCiB2b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmRpc2Nvbm5lY3QoKSB7Ci0gICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSwgaHR0cFNvdXJjZTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIGRhdGFTb3VyY2UgPSBtRGF0YVNvdXJjZTsKLSAgICAgICAgaHR0cFNvdXJjZSA9IG1IdHRwU291cmNlOwogICAgICAgICBtRGlzY29ubmVjdGVkID0gdHJ1ZTsKICAgICB9Ci0KLSAgICBpZiAoZGF0YVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIGRpc2Nvbm5lY3QgZGF0YSBzb3VyY2UKLSAgICAgICAgaWYgKGRhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkgewotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KGRhdGFTb3VyY2UuZ2V0KCkpLT5kaXNjb25uZWN0KCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGh0dHBTb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihodHRwU291cmNlLmdldCgpKS0+ZGlzY29ubmVjdCgpOworICAgIGlmIChtRGF0YVNvdXJjZVdyYXBwZXIgIT0gTlVMTCkgeworICAgICAgICBtRGF0YVNvdXJjZVdyYXBwZXItPmNsb3NlKCk7CiAgICAgfQotCi0gICAgbURhdGFTb3VyY2VXcmFwcGVyID0gTlVMTDsKLQogfQogCiBzdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpmZWVkTW9yZVRTRGF0YSgpIHsKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6c2VuZENhY2hlU3RhdHMoKSB7Ci0gICAgaW50MzJfdCBrYnBzID0gMDsKLSAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwotCi0gICAgaWYgKG1DYWNoZWRTb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBlcnIgPSBtQ2FjaGVkU291cmNlLT5nZXRFc3RpbWF0ZWRCYW5kd2lkdGhLYnBzKCZrYnBzKTsKLSAgICB9Ci0KLSAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKLSAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Q2FjaGVTdGF0cyk7Ci0gICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImJhbmR3aWR0aCIsIGticHMpOwotICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICB9Ci19Ci0KIHZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgIGNhc2Uga1doYXRQcmVwYXJlQXN5bmM6CiAgICAgICB7Ci0gICAgICAgICAgb25QcmVwYXJlQXN5bmMoKTsKKyAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzOworICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzdGFydFRpbWVVcyIsICZzdGFydFRpbWVVcykpOworICAgICAgICAgIG9uUHJlcGFyZUFzeW5jKHN0YXJ0VGltZVVzKTsKICAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIGNhc2Uga1doYXRGZXRjaFN1YnRpdGxlRGF0YToKQEAgLTgzNSw4ICs3NzQsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHRyYWNrLT5tUGFja2V0cy0+Z2V0QXZhaWxhYmxlQnVmZmVyQ291bnQoJmZpbmFsUmVzdWx0KSA8IDIKICAgICAgICAgICAgICAgICAmJiAhbVNlbnRQYXVzZU9uQnVmZmVyaW5nICYmICFtUHJlcGFyaW5nKSB7Ci0gICAgICAgICAgICAgICAgbUNhY2hlZFNvdXJjZS0+cmVzdW1lRmV0Y2hpbmdJZk5lY2Vzc2FyeSgpOwotICAgICAgICAgICAgICAgIHNlbmRDYWNoZVN0YXRzKCk7CiAgICAgICAgICAgICAgICAgbVNlbnRQYXVzZU9uQnVmZmVyaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CiAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UGF1c2VPbkJ1ZmZlcmluZ1N0YXJ0KTsKQEAgLTEzNDksNiArMTI4NiwxMSBAQAogICAgICAgICAgICAgbVZpZGVvVGltZVVzID0gdGltZVVzOwogICAgICAgICB9CiAKKyAgICAgICAgc3A8QU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcj4gY3J5cHRJbmZvID0gZXh0cmFjdG9yLT5nZXRTYW1wbGVDcnlwdG9JbmZvKCk7CisgICAgICAgIGlmIChjcnlwdEluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgbWV0YS0+c2V0T2JqZWN0KCJjcnlwdEluZm8iLCBjcnlwdEluZm8pOworICAgICAgICB9CisKICAgICAgICAgcXVldWVEaXNjb250aW51aXR5SWZOZWVkZWQoc2Vla2luZywgZm9ybWF0Q2hhbmdlLCB0cmFja1R5cGUsIHRyYWNrKTsKIAogICAgICAgICBpZiAobnVtQnVmZmVycyA9PSAwICYmIGFjdHVhbFRpbWVVcyAhPSBudWxscHRyKSB7CkBAIC0xMzkyLDcgKzEzMzQsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVwYXJpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRDYWNoZVN0YXRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU2VudFBhdXNlT25CdWZmZXJpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFJlc3VtZU9uQnVmZmVyaW5nRW5kKTsKQEAgLTE0NDQsNDcgKzEzODUsMzEgQEAKIH0KIAogdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxCdWZmZXJpbmcsIHRoaXMpOwotICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24pOwotICAgIC8vIEVucXVpcmVzIGJ1ZmZlcmluZyBzdGF0dXMgZXZlcnkgc2Vjb25kLgotICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOworICAgIGlmIChtSXNTdHJlYW1pbmcpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxCdWZmZXJpbmcsIHRoaXMpOworICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKTsKKyAgICAgICAgLy8gRW5xdWlyZXMgYnVmZmVyaW5nIHN0YXR1cyBldmVyeSBzZWNvbmQuCisgICAgICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOworICAgIH0KIH0KIAogdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpvblBvbGxCdWZmZXJpbmcoKSB7Ci0gICAgc3RhdHVzX3QgZmluYWxTdGF0dXMgPSBVTktOT1dOX0VSUk9SOwogICAgIGludDY0X3QgY2FjaGVkRHVyYXRpb25VcyA9IC0xbGw7Ci0gICAgc3NpemVfdCBjYWNoZWREYXRhUmVtYWluaW5nID0gLTE7CiAKLSAgICBpZiAobUNhY2hlZFNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIGNhY2hlZERhdGFSZW1haW5pbmcgPSBtQ2FjaGVkU291cmNlLT5hcHByb3hEYXRhUmVtYWluaW5nKCZmaW5hbFN0YXR1cyk7Ci0KLSAgICAgICAgaWYgKGZpbmFsU3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBvZmY2NF90IHNpemU7Ci0gICAgICAgICAgICBpbnQ2NF90IGJpdHJhdGUgPSAwbGw7Ci0gICAgICAgICAgICBpZiAobUR1cmF0aW9uVXMgPiAwICYmIG1DYWNoZWRTb3VyY2UtPmdldFNpemUoJnNpemUpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgLy8gfGJpdHJhdGV8IHVzZXMgYml0cy9zZWNvbmQgdW5pdCwgd2hpbGUgc2l6ZSBpcyBudW1iZXIgb2YgYnl0ZXMuCi0gICAgICAgICAgICAgICAgYml0cmF0ZSA9IHNpemUgKiA4MDAwMDAwbGwgLyBtRHVyYXRpb25VczsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUJpdHJhdGUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgYml0cmF0ZSA9IG1CaXRyYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJpdHJhdGUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY2FjaGVkRHVyYXRpb25VcyA9IGNhY2hlZERhdGFSZW1haW5pbmcgKiA4MDAwMDAwbGwgLyBiaXRyYXRlOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgc3A8QU1lZGlhRXh0cmFjdG9yV3JhcHBlcj4gZXh0cmFjdG9yOworICAgIGlmIChtVmlkZW9UcmFjay5tRXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgZXh0cmFjdG9yID0gbVZpZGVvVHJhY2subUV4dHJhY3RvcjsKKyAgICB9IGVsc2UgaWYgKG1BdWRpb1RyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTCkgeworICAgICAgICBleHRyYWN0b3IgPSBtQXVkaW9UcmFjay5tRXh0cmFjdG9yOwogICAgIH0KIAotICAgIGlmIChmaW5hbFN0YXR1cyAhPSBPSykgewotICAgICAgICBBTE9HVigib25Qb2xsQnVmZmVyaW5nOiBFT1MgKGZpbmFsU3RhdHVzID0gJWQpIiwgZmluYWxTdGF0dXMpOwotCi0gICAgICAgIGlmIChmaW5hbFN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUoMTAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybjsKKyAgICBpZiAoZXh0cmFjdG9yICE9IE5VTEwpIHsKKyAgICAgICAgY2FjaGVkRHVyYXRpb25VcyA9IGV4dHJhY3Rvci0+Z2V0Q2FjaGVkRHVyYXRpb24oKTsKICAgICB9CiAKICAgICBpZiAoY2FjaGVkRHVyYXRpb25VcyA+PSAwbGwpIHsKLSAgICAgICAgaWYgKG1EdXJhdGlvblVzID4gMGxsKSB7CisgICAgICAgIHNzaXplX3Qgc2FtcGxlU2l6ZSA9IGV4dHJhY3Rvci0+Z2V0U2FtcGxlU2l6ZSgpOworICAgICAgICBpZiAoc2FtcGxlU2l6ZSA+PSAwbGwpIHsKICAgICAgICAgICAgIGludDY0X3QgY2FjaGVkUG9zVXMgPSBnZXRMYXN0UmVhZFBvc2l0aW9uKCkgKyBjYWNoZWREdXJhdGlvblVzOwogICAgICAgICAgICAgaW50IHBlcmNlbnRhZ2UgPSAxMDAuMCAqIGNhY2hlZFBvc1VzIC8gbUR1cmF0aW9uVXM7CiAgICAgICAgICAgICBpZiAocGVyY2VudGFnZSA+IDEwMCkgewpAQCAtMTQ5Miw5ICsxNDE3LDExIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShwZXJjZW50YWdlKTsKKyAgICAgICAgICAgIEFMT0dWKCJvblBvbGxCdWZmZXJpbmc6IGNhY2hlZER1cmF0aW9uVXMgJS4xZiBzZWMiLCBjYWNoZWREdXJhdGlvblVzIC8gMTAwMDAwMC4wZik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUoMTAwKTsKKyAgICAgICAgICAgIEFMT0dWKCJvblBvbGxCdWZmZXJpbmc6IEVPUyIpOwogICAgICAgICB9Ci0KLSAgICAgICAgQUxPR1YoIm9uUG9sbEJ1ZmZlcmluZzogY2FjaGVkRHVyYXRpb25VcyAlLjFmIHNlYyIsIGNhY2hlZER1cmF0aW9uVXMgLyAxMDAwMDAwLjBmKTsKICAgICB9CiAKICAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKQEAgLTE1OTEsMTUgKzE1MTgsMjAgQEAKICAgICAgICAgcmV0dXJuIE9LOyAvLyBzb3VyY2Ugd2l0aG91dCBEUk0gaW5mbwogICAgIH0KIAotICAgIHNwPEFCdWZmZXI+IGRybUluZm9CdWZmZXIgPSBOdVBsYXllcjJEcm06OnJldHJpZXZlRHJtSW5mbyhwc3NoSW5mbyk7Ci0gICAgQUxPR1YoImNoZWNrRHJtSW5mbzogTUVESUFfRFJNX0lORk8gUFNTSCBkcm0gaW5mbyBzaXplOiAlZCIsIChpbnQpZHJtSW5mb0J1ZmZlci0+c2l6ZSgpKTsKKyAgICBQbGF5ZXJNZXNzYWdlIHBsYXllck1zZzsKKyAgICBzdGF0dXNfdCByZXQgPSBOdVBsYXllcjJEcm06OnJldHJpZXZlRHJtSW5mbyhwc3NoSW5mbywgJnBsYXllck1zZyk7CisgICAgQUxPR1YoImNoZWNrRHJtSW5mbzogTUVESUFfRFJNX0lORk8gUFNTSCBkcm0gaW5mbyBzaXplOiAlZCIsIChpbnQpcGxheWVyTXNnLkJ5dGVTaXplKCkpOwogCi0gICAgaWYgKGRybUluZm9CdWZmZXItPnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJjaGVja0RybUluZm86IFVuZXhwZWN0ZWQgcGFyY2VsIHNpemU6IDAiKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJjaGVja0RybUluZm86IGZhaWxlZCB0byByZXRyaXZlIERybUluZm8gJWQiLCByZXQpOwogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICBub3RpZnlEcm1JbmZvKGRybUluZm9CdWZmZXIpOworICAgIGludCBzaXplID0gcGxheWVyTXNnLkJ5dGVTaXplKCk7CisgICAgc3A8QUJ1ZmZlcj4gZHJtSW5mb0J1ZiA9IG5ldyBBQnVmZmVyKHNpemUpOworICAgIHBsYXllck1zZy5TZXJpYWxpemVUb0FycmF5KGRybUluZm9CdWYtPmRhdGEoKSwgc2l6ZSk7CisgICAgZHJtSW5mb0J1Zi0+c2V0UmFuZ2UoMCwgc2l6ZSk7CisgICAgbm90aWZ5RHJtSW5mbyhkcm1JbmZvQnVmKTsKIAogICAgIHJldHVybiBPSzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuaAppbmRleCA5YmM1MTgyLi5hZGUxYWEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0dlbmVyaWNTb3VyY2UyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5oCkBAIC0zNywxMSArMzcsOSBAQAogY2xhc3MgRGF0YVNvdXJjZTsKIGNsYXNzIElEYXRhU291cmNlOwogY2xhc3MgSU1lZGlhU291cmNlOwotc3RydWN0IE1lZGlhSFRUUFNlcnZpY2U7CiBzdHJ1Y3QgTWVkaWFTb3VyY2U7CiBjbGFzcyBNZWRpYUJ1ZmZlcjsKIHN0cnVjdCBNZWRpYUNsb2NrOwotc3RydWN0IE51Q2FjaGVkU291cmNlMjsKIAogc3RydWN0IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTIgOiBwdWJsaWMgTnVQbGF5ZXIyOjpTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIC8vIE1vZHVsYXIgRFJNCkBAIC01MCw3ICs0OCw2IEBACiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2spOwogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKIApAQCAtNjIsNyArNTksNyBAQAogICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYygpOworICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoaW50NjRfdCBzdGFydFRpbWVVcyk7CiAKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKICAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpOwpAQCAtMTUxLDcgKzE0OCw2IEBACiAgICAgYm9vbCBtSXNTdHJlYW1pbmc7CiAgICAgdWlkX3QgbVVJRDsKICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiBtTWVkaWFDbG9jazsKLSAgICBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBtSFRUUFNlcnZpY2U7CiAgICAgQVN0cmluZyBtVXJpOwogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1VcmlIZWFkZXJzOwogICAgIGludCBtRmQ7CkBAIC0xNTksOSArMTU1LDYgQEAKICAgICBpbnQ2NF90IG1MZW5ndGg7CiAKICAgICBib29sIG1EaXNjb25uZWN0ZWQ7Ci0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0gICAgc3A8TnVDYWNoZWRTb3VyY2UyPiBtQ2FjaGVkU291cmNlOwotICAgIHNwPERhdGFTb3VyY2U+IG1IdHRwU291cmNlOwogICAgIHNwPE1ldGFEYXRhPiBtRmlsZU1ldGE7CiAgICAgc3A8QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI+IG1EYXRhU291cmNlV3JhcHBlcjsKICAgICBzcDxBTWVkaWFFeHRyYWN0b3JXcmFwcGVyPiBtRXh0cmFjdG9yOwpAQCAtMTk0LDcgKzE4Nyw3IEBACiAgICAgdm9pZCBvblNlZWsoY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpOwogICAgIHN0YXR1c190IGRvU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpOwogCi0gICAgdm9pZCBvblByZXBhcmVBc3luYygpOworICAgIHZvaWQgb25QcmVwYXJlQXN5bmMoaW50NjRfdCBzdGFydFRpbWVVcyk7CiAKICAgICB2b2lkIGZldGNoVGV4dERhdGEoCiAgICAgICAgICAgICB1aW50MzJfdCB3aGF0LCBtZWRpYV90cmFja190eXBlIHR5cGUsCkBAIC0yMzIsOCArMjI1LDYgQEAKICAgICB2b2lkIG9uUG9sbEJ1ZmZlcmluZygpOwogICAgIHZvaWQgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKGludDMyX3QgcGVyY2VudGFnZSk7CiAKLSAgICB2b2lkIHNlbmRDYWNoZVN0YXRzKCk7Ci0KICAgICBzcDxBTWVzc2FnZT4gZ2V0Rm9ybWF0X2woYm9vbCBhdWRpbyk7CiAgICAgc3A8TWV0YURhdGE+IGdldEZvcm1hdE1ldGFfbChib29sIGF1ZGlvKTsKICAgICBpbnQzMl90IGdldERhdGFHZW5lcmF0aW9uKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3Q7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5jcHAKaW5kZXggOGVkYmNiZi4uZTUzOTAwYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmNwcApAQCAtOTksMTAgKzk5LDExIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpwcmVwYXJlQXN5bmMoKSB7CisvLyBUT0RPOiBmZXRjaCBkYXRhIHN0YXJ0aW5nIGZyb20gfHN0YXJ0VGltZVVzfAordm9pZCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6cHJlcGFyZUFzeW5jKGludDY0X3QgLyogc3RhcnRUaW1lVXMgKi8pIHsKICAgICBpZiAobUxpdmVMb29wZXIgPT0gTlVMTCkgewogICAgICAgICBtTGl2ZUxvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgICAgICBtTGl2ZUxvb3Blci0+c2V0TmFtZSgiaHR0cCBsaXZlIik7CisgICAgICAgIG1MaXZlTG9vcGVyLT5zZXROYW1lKCJodHRwIGxpdmUyIik7CiAgICAgICAgIG1MaXZlTG9vcGVyLT5zdGFydChmYWxzZSwgLyogcnVuT25DYWxsaW5nVGhyZWFkICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGNhbkNhbGxKYXZhICovKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmgKaW5kZXggOTdkMzY1My4uOGZjNzFlMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5oCkBAIC0zOCw3ICszOCw3IEBACiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKCk7CisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYyhpbnQ2NF90IHN0YXJ0VGltZVVzKTsKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVxdWV1ZUFjY2Vzc1VuaXQoYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KTWVkaWFQbGF5ZXIyVXRpbHMuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KTWVkaWFQbGF5ZXIyVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NzAzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pNZWRpYVBsYXllcjJVdGlscy5jcHAKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJKTWVkaWFQbGF5ZXIyVXRpbHMiCisKKyNpbmNsdWRlICJKTWVkaWFQbGF5ZXIyVXRpbHMuaCIKKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAibG9nL2xvZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtPZmZsb2FkTWluRHVyYXRpb25TZWMgPSA2MDsKKworLy8gc3RhdGljCitib29sIEpNZWRpYVBsYXllcjJVdGlsczo6aXNPZmZsb2FkZWRBdWRpb1BsYXliYWNrU3VwcG9ydGVkKAorICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKK3sKKyAgICBpZiAoaGFzVmlkZW8gfHwgc3RyZWFtVHlwZSAhPSBBVURJT19TVFJFQU1fTVVTSUMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IGluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgIGlmIChPSyAhPSBnZXRBdWRpb09mZmxvYWRJbmZvKG1ldGEsIGhhc1ZpZGVvLCBpc1N0cmVhbWluZywgc3RyZWFtVHlwZSwgJmluZm8pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoaW5mby5kdXJhdGlvbl91cyA8IGtPZmZsb2FkTWluRHVyYXRpb25TZWMgKiAxMDAwMDAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IGF1ZGlvRm9ybWF0ID0gYXVkaW9Gb3JtYXRGcm9tTmF0aXZlKGluZm8uZm9ybWF0KTsKKyAgICBpbnQzMl90IGNoYW5uZWxNYXNrID0gb3V0Q2hhbm5lbE1hc2tGcm9tTmF0aXZlKGluZm8uY2hhbm5lbF9tYXNrKTsKKyAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gRU5DT0RJTkdfSU5WQUxJRCB8fCBjaGFubmVsTWFzayA9PSBDSEFOTkVMX0lOVkFMSUQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqY2xhc3Mgak1QMlV0aWxzQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIyVXRpbHMiKTsKKyAgICBqbWV0aG9kSUQgalNldEF1ZGlvT3V0cHV0RGV2aWNlQnlJZCA9IGVudi0+R2V0U3RhdGljTWV0aG9kSUQoCisgICAgICAgICAgICBqTVAyVXRpbHNDbHMsICJpc09mZmxvYWRlZEF1ZGlvUGxheWJhY2tTdXBwb3J0ZWQiLCAiKElJSSlaIik7CisgICAgamJvb2xlYW4gcmVzdWx0ID0gZW52LT5DYWxsU3RhdGljQm9vbGVhbk1ldGhvZCgKKyAgICAgICAgICAgIGpNUDJVdGlsc0NscywgalNldEF1ZGlvT3V0cHV0RGV2aWNlQnlJZCwgYXVkaW9Gb3JtYXQsIGluZm8uc2FtcGxlX3JhdGUsIGNoYW5uZWxNYXNrKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KTWVkaWFQbGF5ZXIyVXRpbHMuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSk1lZGlhUGxheWVyMlV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiZDQzYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSk1lZGlhUGxheWVyMlV0aWxzLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfSl9NRURJQVBMQVlFUjJfVVRJTFMyX0hfCisjZGVmaW5lIF9KX01FRElBUExBWUVSMl9VVElMUzJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJhbmRyb2lkX21lZGlhX0F1ZGlvRm9ybWF0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEpNZWRpYVBsYXllcjJVdGlscyB7CisgICAgc3RhdGljIGJvb2wgaXNPZmZsb2FkZWRBdWRpb1BsYXliYWNrU3VwcG9ydGVkKAorICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLCBib29sIGlzU3RyZWFtaW5nLAorICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gX0pfTUVESUFQTEFZRVIyX1VUSUxTMl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KV2FrZUxvY2suY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KV2FrZUxvY2suY3BwCmluZGV4IGM5YTEwNzEuLjk4M2Q3N2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5jcHAKQEAgLTIwLDU1ICsyMCw1MCBAQAogCiAjaW5jbHVkZSAiSldha2VMb2NrLmgiCiAKLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxwb3dlcm1hbmFnZXIvUG93ZXJNYW5hZ2VyLmg+Ci0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vL1RPRE86IHVzZSBKQVZBIFBvd2VyTWFuYWdlciwgaW5zdGVhZCBvZiBiaW5kZXIKLUpXYWtlTG9jazo6Sldha2VMb2NrKCkgOgotICAgIG1Qb3dlck1hbmFnZXIoTlVMTCksCi0gICAgbVdha2VMb2NrVG9rZW4oTlVMTCksCitKV2FrZUxvY2s6OkpXYWtlTG9jayhjb25zdCBzcDxKT2JqZWN0SG9sZGVyPiAmY29udGV4dCkgOgogICAgIG1XYWtlTG9ja0NvdW50KDApLAotICAgIG1EZWF0aFJlY2lwaWVudChuZXcgUE1EZWF0aFJlY2lwaWVudCh0aGlzKSkge30KKyAgICBtV2FrZUxvY2soTlVMTCksCisgICAgbUNvbnRleHQoY29udGV4dCkge30KIAogSldha2VMb2NrOjp+Sldha2VMb2NrKCkgewotICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IE5VTEwpIHsKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIobVBvd2VyTWFuYWdlcik7Ci0gICAgICAgIGJpbmRlci0+dW5saW5rVG9EZWF0aChtRGVhdGhSZWNpcGllbnQpOwotICAgIH0KLSAgICBjbGVhclBvd2VyTWFuYWdlcigpOworICAgIGNsZWFySmF2YVdha2VMb2NrKCk7CiB9CiAKIGJvb2wgSldha2VMb2NrOjphY3F1aXJlKCkgewogICAgIGlmIChtV2FrZUxvY2tDb3VudCA9PSAwKSB7Ci0gICAgICAgIENIRUNLKG1XYWtlTG9ja1Rva2VuID09IE5VTEwpOwotICAgICAgICBpZiAobVBvd2VyTWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyB1c2UgY2hlY2tTZXJ2aWNlKCkgdG8gYXZvaWQgYmxvY2tpbmcgaWYgcG93ZXIgc2VydmljZSBpcyBub3QgdXAgeWV0Ci0gICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPQotICAgICAgICAgICAgICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5jaGVja1NlcnZpY2UoU3RyaW5nMTYoInBvd2VyIikpOwotICAgICAgICAgICAgaWYgKGJpbmRlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNvdWxkIG5vdCBnZXQgdGhlIHBvd2VyIG1hbmFnZXIgc2VydmljZSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyID0gaW50ZXJmYWNlX2Nhc3Q8SVBvd2VyTWFuYWdlcj4oYmluZGVyKTsKLSAgICAgICAgICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChtV2FrZUxvY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgICAgICAgICAgamNsYXNzIGpDb250ZXh0Q2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvY29udGVudC9Db250ZXh0Iik7CisgICAgICAgICAgICBqY2xhc3MgalBvd2VyTWFuYWdlckNscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL29zL1Bvd2VyTWFuYWdlciIpOworCisgICAgICAgICAgICBqbWV0aG9kSUQgakdldFN5c3RlbVNlcnZpY2UgPSBlbnYtPkdldE1ldGhvZElEKGpDb250ZXh0Q2xzLAorICAgICAgICAgICAgICAgICAgICAiZ2V0U3lzdGVtU2VydmljZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OyIpOworICAgICAgICAgICAgam9iamVjdCBqYXZhUG93ZXJNYW5hZ2VyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKG1Db250ZXh0LT5nZXRKT2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgIGpHZXRTeXN0ZW1TZXJ2aWNlLCBlbnYtPk5ld1N0cmluZ1VURigicG93ZXIiKSk7CisKKyAgICAgICAgICAgIGpmaWVsZElEIGpQQVJUSUFMX1dBS0VfTE9DSyA9IGVudi0+R2V0U3RhdGljRmllbGRJRChqUG93ZXJNYW5hZ2VyQ2xzLAorICAgICAgICAgICAgICAgICAgICAiUEFSVElBTF9XQUtFX0xPQ0siLCAiSSIpOworICAgICAgICAgICAgamludCBQQVJUSUFMX1dBS0VfTE9DSyA9IGVudi0+R2V0U3RhdGljSW50RmllbGQoalBvd2VyTWFuYWdlckNscywgalBBUlRJQUxfV0FLRV9MT0NLKTsKKworICAgICAgICAgICAgam1ldGhvZElEIGpOZXdXYWtlTG9jayA9IGVudi0+R2V0TWV0aG9kSUQoalBvd2VyTWFuYWdlckNscywKKyAgICAgICAgICAgICAgICAgICAgIm5ld1dha2VMb2NrIiwgIihJTGphdmEvbGFuZy9TdHJpbmc7KUxhbmRyb2lkL29zL1Bvd2VyTWFuYWdlciRXYWtlTG9jazsiKTsKKyAgICAgICAgICAgIGpvYmplY3QgamF2YVdha2VMb2NrID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGphdmFQb3dlck1hbmFnZXJPYmosCisgICAgICAgICAgICAgICAgICAgIGpOZXdXYWtlTG9jaywgUEFSVElBTF9XQUtFX0xPQ0ssIGVudi0+TmV3U3RyaW5nVVRGKCJKV2FrZUxvY2siKSk7CisgICAgICAgICAgICBtV2FrZUxvY2sgPSBuZXcgSk9iamVjdEhvbGRlcihqYXZhV2FrZUxvY2spOworICAgICAgICAgICAgZW52LT5EZWxldGVMb2NhbFJlZihqYXZhUG93ZXJNYW5hZ2VyT2JqKTsKKyAgICAgICAgICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoamF2YVdha2VMb2NrKTsKICAgICAgICAgfQotICAgICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBuZXcgQkJpbmRlcigpOwotICAgICAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUG93ZXJNYW5hZ2VyLT5hY3F1aXJlV2FrZUxvY2soCi0gICAgICAgICAgICAgICAgICAgIFBPV0VSTUFOQUdFUl9QQVJUSUFMX1dBS0VfTE9DSywKLSAgICAgICAgICAgICAgICAgICAgYmluZGVyLCBTdHJpbmcxNigiSldha2VMb2NrIiksIFN0cmluZzE2KCJtZWRpYSIpKTsKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIG1XYWtlTG9ja1Rva2VuID0gYmluZGVyOwotICAgICAgICAgICAgICAgIG1XYWtlTG9ja0NvdW50Kys7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChtV2FrZUxvY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgICAgICAgICAgamNsYXNzIHdha2VMb2NrQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvb3MvUG93ZXJNYW5hZ2VyJFdha2VMb2NrIik7CisgICAgICAgICAgICBqbWV0aG9kSUQgakFjcXVpcmUgPSBlbnYtPkdldE1ldGhvZElEKHdha2VMb2NrQ2xzLCAiYWNxdWlyZSIsICIoKVYiKTsKKyAgICAgICAgICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobVdha2VMb2NrLT5nZXRKT2JqZWN0KCksIGpBY3F1aXJlKTsKKyAgICAgICAgICAgIG1XYWtlTG9ja0NvdW50Kys7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIG1XYWtlTG9ja0NvdW50Kys7CkBAIC04NiwyNSArODEsMTcgQEAKICAgICAgICAgbVdha2VMb2NrQ291bnQgPSAxOwogICAgIH0KICAgICBpZiAoLS1tV2FrZUxvY2tDb3VudCA9PSAwKSB7Ci0gICAgICAgIENIRUNLKG1XYWtlTG9ja1Rva2VuICE9IE5VTEwpOwotICAgICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgICAgIG1Qb3dlck1hbmFnZXItPnJlbGVhc2VXYWtlTG9jayhtV2FrZUxvY2tUb2tlbiwgMCAvKiBmbGFncyAqLyk7Ci0gICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICAgICAgaWYgKG1XYWtlTG9jayAhPSBOVUxMKSB7CisgICAgICAgICAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgICAgICAgICBqY2xhc3Mgd2FrZUxvY2tDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9vcy9Qb3dlck1hbmFnZXIkV2FrZUxvY2siKTsKKyAgICAgICAgICAgIGptZXRob2RJRCBqUmVsZWFzZSA9IGVudi0+R2V0TWV0aG9kSUQod2FrZUxvY2tDbHMsICJyZWxlYXNlIiwgIigpViIpOworICAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtV2FrZUxvY2stPmdldEpPYmplY3QoKSwgalJlbGVhc2UpOwogICAgICAgICB9Ci0gICAgICAgIG1XYWtlTG9ja1Rva2VuLmNsZWFyKCk7CiAgICAgfQogfQogCi12b2lkIEpXYWtlTG9jazo6Y2xlYXJQb3dlck1hbmFnZXIoKSB7Cit2b2lkIEpXYWtlTG9jazo6Y2xlYXJKYXZhV2FrZUxvY2soKSB7CiAgICAgcmVsZWFzZSh0cnVlKTsKLSAgICBtUG93ZXJNYW5hZ2VyLmNsZWFyKCk7Ci19Ci0KLXZvaWQgSldha2VMb2NrOjpQTURlYXRoUmVjaXBpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKLSAgICBpZiAobVdha2VMb2NrICE9IE5VTEwpIHsKLSAgICAgICAgbVdha2VMb2NrLT5jbGVhclBvd2VyTWFuYWdlcigpOwotICAgIH0KIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5oCmluZGV4IGVhY2U4N2UuLjM2YzU0MmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KV2FrZUxvY2suaApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBKX1dBS0VMT0NLX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL0lQb3dlck1hbmFnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMjYsNyArMjYsNyBAQAogY2xhc3MgSldha2VMb2NrIDogcHVibGljIFJlZkJhc2UgewogCiBwdWJsaWM6Ci0gICAgSldha2VMb2NrKCk7CisgICAgSldha2VMb2NrKGNvbnN0IHNwPEpPYmplY3RIb2xkZXI+ICZjb250ZXh0KTsKIAogICAgIC8vIE5PVEU6IGFjcXVpcmUgYW5kIHJlbGVhc2UgYXJlIG5vdCB0aHJlYWQgc2FmZQogCkBAIC0zNywyOCArMzcsMTEgQEAKICAgICB2aXJ0dWFsIH5KV2FrZUxvY2soKTsKIAogcHJpdmF0ZToKLSAgICBzcDxJUG93ZXJNYW5hZ2VyPiBtUG93ZXJNYW5hZ2VyOwotICAgIHNwPElCaW5kZXI+ICAgICAgIG1XYWtlTG9ja1Rva2VuOwotICAgIHVpbnQzMl90ICAgICAgICAgIG1XYWtlTG9ja0NvdW50OworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1XYWtlTG9ja0NvdW50OworICAgIHNwPEpPYmplY3RIb2xkZXI+ICAgICAgIG1XYWtlTG9jazsKKyAgICBjb25zdCBzcDxKT2JqZWN0SG9sZGVyPiBtQ29udGV4dDsKIAotICAgIGNsYXNzIFBNRGVhdGhSZWNpcGllbnQgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgewotICAgIHB1YmxpYzoKLSAgICAgICAgZXhwbGljaXQgUE1EZWF0aFJlY2lwaWVudChKV2FrZUxvY2sgKndha2VMb2NrKSA6IG1XYWtlTG9jayh3YWtlTG9jaykge30KLSAgICAgICAgdmlydHVhbCB+UE1EZWF0aFJlY2lwaWVudCgpIHt9Ci0KLSAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKLSAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJndobyk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBQTURlYXRoUmVjaXBpZW50KGNvbnN0IFBNRGVhdGhSZWNpcGllbnQmKTsKLSAgICAgICAgUE1EZWF0aFJlY2lwaWVudCYgb3BlcmF0b3I9IChjb25zdCBQTURlYXRoUmVjaXBpZW50Jik7Ci0KLSAgICAgICAgSldha2VMb2NrICptV2FrZUxvY2s7Ci0gICAgfTsKLQotICAgIGNvbnN0IHNwPFBNRGVhdGhSZWNpcGllbnQ+IG1EZWF0aFJlY2lwaWVudDsKLQotICAgIHZvaWQgY2xlYXJQb3dlck1hbmFnZXIoKTsKKyAgICB2b2lkIGNsZWFySmF2YVdha2VMb2NrKCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhKV2FrZUxvY2spOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmNwcAppbmRleCA4MzdiYmM4Li5kNjA4ZDRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuY3BwCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAiTnVQbGF5ZXIyLmgiCiAKICNpbmNsdWRlICJIVFRQTGl2ZVNvdXJjZTIuaCIKKyNpbmNsdWRlICJKTWVkaWFQbGF5ZXIyVXRpbHMuaCIKICNpbmNsdWRlICJOdVBsYXllcjJDQ0RlY29kZXIuaCIKICNpbmNsdWRlICJOdVBsYXllcjJEZWNvZGVyLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXIyRGVjb2RlckJhc2UuaCIKQEAgLTMzLDcgKzM0LDcgQEAKICNpbmNsdWRlICJOdVBsYXllcjJTb3VyY2UuaCIKICNpbmNsdWRlICJSVFNQU291cmNlMi5oIgogI2luY2x1ZGUgIkdlbmVyaWNTb3VyY2UyLmgiCi0jaW5jbHVkZSAiVGV4dERlc2NyaXB0aW9ucy5oIgorI2luY2x1ZGUgIlRleHREZXNjcmlwdGlvbnMyLmgiCiAKICNpbmNsdWRlICJBVFNQYXJzZXIuaCIKIApAQCAtMjA4LDE1ICsyMDksMTYgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotTnVQbGF5ZXIyOjpOdVBsYXllcjIocGlkX3QgcGlkLCB1aWRfdCB1aWQsIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrKQorTnVQbGF5ZXIyOjpOdVBsYXllcjIoCisgICAgICAgIHBpZF90IHBpZCwgdWlkX3QgdWlkLCBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jaywgY29uc3Qgc3A8Sk9iamVjdEhvbGRlcj4gJmNvbnRleHQpCiAgICAgOiBtUElEKHBpZCksCiAgICAgICBtVUlEKHVpZCksCiAgICAgICBtTWVkaWFDbG9jayhtZWRpYUNsb2NrKSwKLSAgICAgIG1Tb3VyY2VGbGFncygwKSwKICAgICAgIG1PZmZsb2FkQXVkaW8oZmFsc2UpLAogICAgICAgbUF1ZGlvRGVjb2RlckdlbmVyYXRpb24oMCksCiAgICAgICBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbigwKSwKICAgICAgIG1SZW5kZXJlckdlbmVyYXRpb24oMCksCisgICAgICBtRU9TTW9uaXRvckdlbmVyYXRpb24oMCksCiAgICAgICBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zKDApLAogICAgICAgbVByZXZpb3VzU2Vla1RpbWVVcygwKSwKICAgICAgIG1BdWRpb0VPUyhmYWxzZSksCkBAIC0yNDAsOCArMjQyLDcgQEAKICAgICAgIG1QYXVzZWQoZmFsc2UpLAogICAgICAgbVBhdXNlZEJ5Q2xpZW50KHRydWUpLAogICAgICAgbVBhdXNlZEZvckJ1ZmZlcmluZyhmYWxzZSksCi0gICAgICBtSXNEcm1Qcm90ZWN0ZWQoZmFsc2UpLAotICAgICAgbURhdGFTb3VyY2VUeXBlKERBVEFfU09VUkNFX1RZUEVfTk9ORSkgeworICAgICAgbUNvbnRleHQoY29udGV4dCkgewogICAgIENIRUNLKG1lZGlhQ2xvY2sgIT0gTlVMTCk7CiAgICAgY2xlYXJGbHVzaENvbXBsZXRlKCk7CiB9CkBAIC0zMDksNyArMzEwLDcgQEAKICAgICAgICAgICAgICAgICBzcDxHZW5lcmljU291cmNlMj4gZ2VuZXJpY1NvdXJjZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgR2VuZXJpY1NvdXJjZTIobm90aWZ5LCBtVUlELCBtTWVkaWFDbG9jayk7CiAKLSAgICAgICAgICAgICAgICBlcnIgPSBnZW5lcmljU291cmNlLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMpOworICAgICAgICAgICAgICAgIGVyciA9IGdlbmVyaWNTb3VyY2UtPnNldERhdGFTb3VyY2UodXJsLCBoZWFkZXJzKTsKIAogICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgKnNvdXJjZSA9IGdlbmVyaWNTb3VyY2U7CkBAIC0zOTMsMTEgKzM5NCwxMyBAQAogICAgIC8vIE5vdywgc291cmNlICE9IE5VTEwuCiAgICAgKi8KIAotICAgIG1EYXRhU291cmNlVHlwZSA9IGRhdGFTb3VyY2VUeXBlOworICAgIG1DdXJyZW50U291cmNlSW5mby5tRGF0YVNvdXJjZVR5cGUgPSBkYXRhU291cmNlVHlwZTsKIAogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXREYXRhU291cmNlLCB0aGlzKTsKICAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgc291cmNlKTsKICAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIGRzZC0+bUlkKTsKKyAgICBtc2ctPnNldEludDY0KCJzdGFydFRpbWVVcyIsIGRzZC0+bVN0YXJ0UG9zaXRpb25NcyAqIDEwMDApOworICAgIG1zZy0+c2V0SW50NjQoImVuZFRpbWVVcyIsIGRzZC0+bUVuZFBvc2l0aW9uTXMgKiAxMDAwKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIApAQCAtNDE1LDExICs0MTgsMTMgQEAKICAgICAvLyBOb3csIHNvdXJjZSAhPSBOVUxMLgogICAgICovCiAKLSAgICBtTmV4dERhdGFTb3VyY2VUeXBlID0gZGF0YVNvdXJjZVR5cGU7CisgICAgbU5leHRTb3VyY2VJbmZvLm1EYXRhU291cmNlVHlwZSA9IGRhdGFTb3VyY2VUeXBlOwogCiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFByZXBhcmVOZXh0RGF0YVNvdXJjZSwgdGhpcyk7CiAgICAgbXNnLT5zZXRPYmplY3QoInNvdXJjZSIsIHNvdXJjZSk7CiAgICAgbXNnLT5zZXRJbnQ2NCgic3JjSWQiLCBkc2QtPm1JZCk7CisgICAgbXNnLT5zZXRJbnQ2NCgic3RhcnRUaW1lVXMiLCBkc2QtPm1TdGFydFBvc2l0aW9uTXMgKiAxMDAwKTsKKyAgICBtc2ctPnNldEludDY0KCJlbmRUaW1lVXMiLCBkc2QtPm1FbmRQb3NpdGlvbk1zICogMTAwMCk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKQEAgLTQ4Nyw3ICs0OTIsNyBAQAogc3RhdHVzX3QgTnVQbGF5ZXIyOjpzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKSB7CiAgICAgLy8gZG8gc29tZSBjdXJzb3J5IHZhbGlkYXRpb24gb2YgdGhlIHNldHRpbmdzIGhlcmUuIGF1ZGlvIG1vZGVzIGFyZQogICAgIC8vIG9ubHkgdmFsaWRhdGVkIHdoZW4gc2V0IG9uIHRoZSBhdWRpb3NpbmsuCi0gICAgIGlmICgocmF0ZS5tU3BlZWQgIT0gMC5mICYmIHJhdGUubVNwZWVkIDwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOKQorICAgICBpZiAocmF0ZS5tU3BlZWQgPCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NSU4KICAgICAgICAgICAgIHx8IHJhdGUubVNwZWVkID4gQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUFYCiAgICAgICAgICAgICB8fCByYXRlLm1QaXRjaCA8IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01JTgogICAgICAgICAgICAgfHwgcmF0ZS5tUGl0Y2ggPiBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NQVgpIHsKQEAgLTU1NCw3ICs1NTksNyBAQAogICAgIHNwPFNvdXJjZT4gc291cmNlOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Tb3VyY2VMb2NrKTsKLSAgICAgICAgc291cmNlID0gbVNvdXJjZTsKKyAgICAgICAgc291cmNlID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2U7CiAgICAgfQogCiAgICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7CkBAIC01ODQsOSArNTg5LDEzIEBACiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKK3ZvaWQgTnVQbGF5ZXIyOjpyZXdpbmQoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJld2luZCwgdGhpcyk7CisgICAgbXNnLT5wb3N0KCk7Cit9CiAKIHZvaWQgTnVQbGF5ZXIyOjp3cml0ZVRyYWNrSW5mbygKLSAgICAgICAgUGFyY2VsKiByZXBseSwgY29uc3Qgc3A8QU1lc3NhZ2U+JiBmb3JtYXQpIGNvbnN0IHsKKyAgICAgICAgUGxheWVyTWVzc2FnZSogcmVwbHksIGNvbnN0IHNwPEFNZXNzYWdlPiYgZm9ybWF0KSBjb25zdCB7CiAgICAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJOVUxMIGZvcm1hdCIpOwogICAgICAgICByZXR1cm47CkBAIC02MTksMTAgKzYyOCw5IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICByZXBseS0+d3JpdGVJbnQzMigyKTsgLy8gd3JpdGUgc29tZXRoaW5nIG5vbi16ZXJvCi0gICAgcmVwbHktPndyaXRlSW50MzIodHJhY2tUeXBlKTsKLSAgICByZXBseS0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNihtaW1lLmNfc3RyKCkpKTsKLSAgICByZXBseS0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNihsYW5nLmNfc3RyKCkpKTsKKyAgICByZXBseS0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUodHJhY2tUeXBlKTsKKyAgICByZXBseS0+YWRkX3ZhbHVlcygpLT5zZXRfc3RyaW5nX3ZhbHVlKG1pbWUuY19zdHIoKSk7CisgICAgcmVwbHktPmFkZF92YWx1ZXMoKS0+c2V0X3N0cmluZ192YWx1ZShsYW5nLmNfc3RyKCkpOwogCiAgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7CiAgICAgICAgIGludDMyX3QgaXNBdXRvLCBpc0RlZmF1bHQsIGlzRm9yY2VkOwpAQCAtNjMwLDI3ICs2MzgsMzAgQEAKICAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoImRlZmF1bHQiLCAmaXNEZWZhdWx0KSk7CiAgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJmb3JjZWQiLCAmaXNGb3JjZWQpKTsKIAotICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpc0F1dG8pOwotICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpc0RlZmF1bHQpOwotICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpc0ZvcmNlZCk7CisgICAgICAgIHJlcGx5LT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShpc0F1dG8pOworICAgICAgICByZXBseS0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoaXNEZWZhdWx0KTsKKyAgICAgICAgcmVwbHktPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKGlzRm9yY2VkKTsKICAgICB9CiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworCiAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewogICAgICAgICBjYXNlIGtXaGF0U2V0RGF0YVNvdXJjZToKICAgICAgICAgewogICAgICAgICAgICAgQUxPR1YoImtXaGF0U2V0RGF0YVNvdXJjZSIpOwogCi0gICAgICAgICAgICBDSEVDSyhtU291cmNlID09IE5VTEwpOworICAgICAgICAgICAgQ0hFQ0sobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgPT0gTlVMTCk7CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzb3VyY2UiLCAmb2JqKSk7CiAgICAgICAgICAgICBpZiAob2JqICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVNvdXJjZUxvY2spOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsICZtU3JjSWQpKTsKLSAgICAgICAgICAgICAgICBtU291cmNlID0gc3RhdGljX2Nhc3Q8U291cmNlICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgJm1DdXJyZW50U291cmNlSW5mby5tU3JjSWQpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3RhcnRUaW1lVXMiLCAmbUN1cnJlbnRTb3VyY2VJbmZvLm1TdGFydFRpbWVVcykpOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJlbmRUaW1lVXMiLCAmbUN1cnJlbnRTb3VyY2VJbmZvLm1FbmRUaW1lVXMpKTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSA9IHN0YXRpY19jYXN0PFNvdXJjZSAqPihvYmouZ2V0KCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOwogICAgICAgICAgICAgICAgIEFMT0dFKCJrV2hhdFNldERhdGFTb3VyY2UsIHNvdXJjZSBzaG91bGQgbm90IGJlIE5VTEwiKTsKQEAgLTY1OSw3ICs2NzAsNyBAQAogICAgICAgICAgICAgQ0hFQ0sobURyaXZlciAhPSBOVUxMKTsKICAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CiAgICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNldERhdGFTb3VyY2VDb21wbGV0ZWQobVNyY0lkLCBlcnIpOworICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5U2V0RGF0YVNvdXJjZUNvbXBsZXRlZChtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBlcnIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTY3Myw5ICs2ODQsMTEgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic291cmNlIiwgJm9iaikpOwogICAgICAgICAgICAgaWYgKG9iaiAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Tb3VyY2VMb2NrKTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmbU5leHRTcmNJZCkpOwotICAgICAgICAgICAgICAgIG1OZXh0U291cmNlID0gc3RhdGljX2Nhc3Q8U291cmNlICo+KG9iai5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgbU5leHRTb3VyY2UtPnByZXBhcmVBc3luYygpOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsICZtTmV4dFNvdXJjZUluZm8ubVNyY0lkKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInN0YXJ0VGltZVVzIiwgJm1OZXh0U291cmNlSW5mby5tU3RhcnRUaW1lVXMpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgiZW5kVGltZVVzIiwgJm1OZXh0U291cmNlSW5mby5tRW5kVGltZVVzKSk7CisgICAgICAgICAgICAgICAgbU5leHRTb3VyY2VJbmZvLm1Tb3VyY2UgPSBzdGF0aWNfY2FzdDxTb3VyY2UgKj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgICAgICBtTmV4dFNvdXJjZUluZm8ubVNvdXJjZS0+cHJlcGFyZUFzeW5jKG1OZXh0U291cmNlSW5mby5tU3RhcnRUaW1lVXMpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOwogICAgICAgICAgICAgfQpAQCAtNjg4LDcgKzcwMSw3IEBACiAgICAgICAgICAgICBBTE9HVigia1doYXRQbGF5TmV4dERhdGFTb3VyY2UiKTsKICAgICAgICAgICAgIGludDY0X3Qgc3JjSWQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmc3JjSWQpKTsKLSAgICAgICAgICAgIGlmIChzcmNJZCAhPSBtTmV4dFNyY0lkKSB7CisgICAgICAgICAgICBpZiAoc3JjSWQgIT0gbU5leHRTb3VyY2VJbmZvLm1TcmNJZCkgewogICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKHNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCAwKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CkBAIC03MDksNiArNzIyLDIyIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRFT1NNb25pdG9yOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpbnQzMl90IHJlYXNvbjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZWFzb24iLCAmcmVhc29uKSk7CisKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1FT1NNb25pdG9yR2VuZXJhdGlvbiB8fCByZWFzb24gIT0gTWVkaWFDbG9jazo6VElNRVJfUkVBU09OX1JFQUNIRUQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsgIC8vIHN0YWxlIG9yIHJlc2V0CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdEVPU01vbml0b3IiKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9QTEFZQkFDS19DT01QTEVURSwgMCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2Uga1doYXRHZXRCdWZmZXJpbmdTZXR0aW5nczoKICAgICAgICAgewogICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CkBAIC03MTcsOCArNzQ2LDggQEAKICAgICAgICAgICAgIEFMT0dWKCJrV2hhdEdldEJ1ZmZlcmluZ1NldHRpbmdzIik7CiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyBidWZmZXJpbmc7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBtU291cmNlLT5nZXRCdWZmZXJpbmdTZXR0aW5ncygmYnVmZmVyaW5nKTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEJ1ZmZlcmluZ1NldHRpbmdzKCZidWZmZXJpbmcpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KQEAgLTc0MCw4ICs3NjksOCBAQAogICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MgYnVmZmVyaW5nOwogICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShtc2csICZidWZmZXJpbmcpOwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+c2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnNldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGVyciA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQpAQCAtNzU1LDcgKzc4NCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEFMT0dWKCJvbk1lc3NhZ2VSZWNlaXZlZCBrV2hhdFByZXBhcmUiKTsKIAotICAgICAgICAgICAgbVNvdXJjZS0+cHJlcGFyZUFzeW5jKCk7CisgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+cHJlcGFyZUFzeW5jKG1DdXJyZW50U291cmNlSW5mby5tU3RhcnRUaW1lVXMpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNzY0LDEyICs3OTMsMTYgQEAKICAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCi0gICAgICAgICAgICBQYXJjZWwqIHJlcGx5OworICAgICAgICAgICAgaW50NjRfdCBzcmNJZDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsIChpbnQ2NF90Kikmc3JjSWQpKTsKKworICAgICAgICAgICAgUGxheWVyTWVzc2FnZSogcmVwbHk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7CiAKKyAgICAgICAgICAgIC8vIFRPRE86IHVzZSBjb3JyZWN0IHNvdXJjZSBpbmZvIGJhc2VkIG9uIHNyY0lkLgogICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzaXplX3QgY2NUcmFja3MgPSAwOwpAQCAtNzc4LDExICs4MTEsMTEgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gdG90YWwgdHJhY2sgY291bnQKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGluYmFuZFRyYWNrcyArIGNjVHJhY2tzKTsKKyAgICAgICAgICAgIHJlcGx5LT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShpbmJhbmRUcmFja3MgKyBjY1RyYWNrcyk7CiAKICAgICAgICAgICAgIC8vIHdyaXRlIGluYmFuZCB0cmFja3MKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5iYW5kVHJhY2tzOyArK2kpIHsKLSAgICAgICAgICAgICAgICB3cml0ZVRyYWNrSW5mbyhyZXBseSwgbVNvdXJjZS0+Z2V0VHJhY2tJbmZvKGkpKTsKKyAgICAgICAgICAgICAgICB3cml0ZVRyYWNrSW5mbyhyZXBseSwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldFRyYWNrSW5mbyhpKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIHdyaXRlIENDIHRyYWNrCkBAIC03OTcsMjAgKzgzMCwzNSBAQAogCiAgICAgICAgIGNhc2Uga1doYXRHZXRTZWxlY3RlZFRyYWNrOgogICAgICAgICB7CisgICAgICAgICAgICBpbnQ2NF90IHNyY0lkOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgKGludDY0X3QqKSZzcmNJZCkpOworCisgICAgICAgICAgICBpbnQzMl90IHR5cGUzMjsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgKGludDMyX3QqKSZ0eXBlMzIpKTsKKyAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSA9IChtZWRpYV90cmFja190eXBlKXR5cGUzMjsKKworICAgICAgICAgICAgLy8gVE9ETzogdXNlIGNvcnJlY3Qgc291cmNlIGluZm8gYmFzZWQgb24gc3JjSWQuCisgICAgICAgICAgICBzaXplX3QgaW5iYW5kVHJhY2tzID0gMDsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgc3NpemVfdCBzZWxlY3RlZFRyYWNrID0gLTE7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGVyciA9IE9LOwotCi0gICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlMzI7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInR5cGUiLCAoaW50MzJfdCopJnR5cGUzMikpOwotICAgICAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSA9IChtZWRpYV90cmFja190eXBlKXR5cGUzMjsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IHNlbGVjdGVkVHJhY2sgPSBtU291cmNlLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOwotCi0gICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2VsZWN0ZWRUcmFjayk7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgICAgICBzZWxlY3RlZFRyYWNrID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldFNlbGVjdGVkVHJhY2sodHlwZSk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChzZWxlY3RlZFRyYWNrID09IC0xICYmIG1DQ0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgICAgIHNlbGVjdGVkVHJhY2sgPSBtQ0NEZWNvZGVyLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOworICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFRyYWNrICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVHJhY2sgKz0gaW5iYW5kVHJhY2tzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUGxheWVyTWVzc2FnZSogcmVwbHk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7CisgICAgICAgICAgICByZXBseS0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoc2VsZWN0ZWRUcmFjayk7CisKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKIApAQCAtODI1LDE4ICs4NzMsMjEgQEAKICAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCisgICAgICAgICAgICBpbnQ2NF90IHNyY0lkOwogICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXg7CiAgICAgICAgICAgICBpbnQzMl90IHNlbGVjdDsKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgKGludDY0X3QqKSZzcmNJZCkpOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic2VsZWN0IiwgJnNlbGVjdCkpOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CiAKKyAgICAgICAgICAgIC8vIFRPRE86IHVzZSBjb3JyZWN0IHNvdXJjZSBpbmZvIGJhc2VkIG9uIHNyY0lkLgogICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2l6ZV90IGNjVHJhY2tzID0gMDsKICAgICAgICAgICAgIGlmIChtQ0NEZWNvZGVyICE9IE5VTEwpIHsKQEAgLTg0NCwxMSArODk1LDExIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmICh0cmFja0luZGV4IDwgaW5iYW5kVHJhY2tzKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgc2VsZWN0LCB0aW1lVXMpOworICAgICAgICAgICAgICAgIGVyciA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBzZWxlY3QsIHRpbWVVcyk7CiAKICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdCAmJiBlcnIgPT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlOwotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gaW5mbyA9IG1Tb3VyY2UtPmdldFRyYWNrSW5mbyh0cmFja0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGluZm8gPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0VHJhY2tJbmZvKHRyYWNrSW5kZXgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbyAhPSBOVUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5mby0+ZmluZEludDMyKCJ0eXBlIiwgJnR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCkgewpAQCAtODgxLDEwICs5MzIsMTAgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCAmJiBtU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0spIHsKKyAgICAgICAgICAgIGlmIChtRHJpdmVyICE9IE5VTEwgJiYgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSA9PSBPSykgewogICAgICAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CiAgICAgICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RHVyYXRpb24obVNyY0lkLCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBkdXJhdGlvblVzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTkwMSwxMyArOTUyLDE1IEBACiAKICAgICAgICAgICAgIEFMT0dEKCJvblNldFZpZGVvU3VyZmFjZSglcCwgJXMgdmlkZW8gZGVjb2RlcikiLAogICAgICAgICAgICAgICAgICAgICAobnd3ID09IE5VTEwgPyBOVUxMIDogbnd3LT5nZXRBTmF0aXZlV2luZG93KCkpLAotICAgICAgICAgICAgICAgICAgICAobVNvdXJjZSAhPSBOVUxMICYmIG1TdGFydGVkICYmIG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCAmJiBtU3RhcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pICE9IE5VTEwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtVmlkZW9EZWNvZGVyICE9IE5VTEwpID8gImhhdmUiIDogIm5vIik7CiAKLSAgICAgICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgbVN0YXJ0ZWQgYmVmb3JlIGNhbGxpbmcgbVNvdXJjZS0+Z2V0Rm9ybWF0IGJlY2F1c2UgTnVQbGF5ZXIyIG1pZ2h0Ci0gICAgICAgICAgICAvLyBiZSBpbiBwcmVwYXJpbmcgc3RhdGUgYW5kIGl0IGNvdWxkIHRha2UgbG9uZyB0aW1lLgotICAgICAgICAgICAgLy8gV2hlbiBtU3RhcnRlZCBpcyB0cnVlLCBtU291cmNlIG11c3QgaGF2ZSBiZWVuIHNldC4KLSAgICAgICAgICAgIGlmIChtU291cmNlID09IE5VTEwgfHwgIW1TdGFydGVkIHx8IG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgPT0gTlVMTAorICAgICAgICAgICAgLy8gTmVlZCB0byBjaGVjayBtU3RhcnRlZCBiZWZvcmUgY2FsbGluZyBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0CisgICAgICAgICAgICAvLyBiZWNhdXNlIE51UGxheWVyMiBtaWdodCBiZSBpbiBwcmVwYXJpbmcgc3RhdGUgYW5kIGl0IGNvdWxkIHRha2UgbG9uZyB0aW1lLgorICAgICAgICAgICAgLy8gV2hlbiBtU3RhcnRlZCBpcyB0cnVlLCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSBtdXN0IGhhdmUgYmVlbiBzZXQuCisgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgPT0gTlVMTCB8fCAhbVN0YXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgfHwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgPT0gTlVMTAogICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBtVmlkZW9EZWNvZGVyJ3MgbU5hdGl2ZVdpbmRvdyBpcyBhbHdheXMgbm9uLW51bGwKICAgICAgICAgICAgICAgICAgICAgfHwgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCAmJiBtVmlkZW9EZWNvZGVyLT5zZXRWaWRlb1N1cmZhY2Uobnd3KSA9PSBPSykpIHsKICAgICAgICAgICAgICAgICBwZXJmb3JtU2V0U3VyZmFjZShud3cpOwpAQCAtOTcxLDEwICsxMDI0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIG9uUmVzdW1lKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvblN0YXJ0KCk7CisgICAgICAgICAgICAgICAgb25TdGFydCh0cnVlIC8qIHBsYXkgKi8pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVBhdXNlZEJ5Q2xpZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9TVEFSVEVELCAwLCAwKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9TVEFSVEVELCAwLCAwKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTk4OCw4ICsxMDQxLDcgQEAKICAgICAgICAgICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIC8vIEF1ZGlvU2luayBhbGxvd3Mgb25seSAxLmYgYW5kIDAuZiBmb3Igb2ZmbG9hZCBtb2RlLgogICAgICAgICAgICAgICAgIC8vIEZvciBvdGhlciBzcGVlZCwgc3dpdGNoIHRvIG5vbi1vZmZsb2FkIG1vZGUuCi0gICAgICAgICAgICAgICAgaWYgKG1PZmZsb2FkQXVkaW8gJiYgKChyYXRlLm1TcGVlZCAhPSAwLmYgJiYgcmF0ZS5tU3BlZWQgIT0gMS5mKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgcmF0ZS5tUGl0Y2ggIT0gMS5mKSkgeworICAgICAgICAgICAgICAgIGlmIChtT2ZmbG9hZEF1ZGlvICYmIChyYXRlLm1TcGVlZCAhPSAxLmYgfHwgcmF0ZS5tUGl0Y2ggIT0gMS5mKSkgewogICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGN1cnJlbnRQb3NpdGlvblVzOwogICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0Q3VycmVudFBvc2l0aW9uKCZjdXJyZW50UG9zaXRpb25VcykgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvblVzID0gbVByZXZpb3VzU2Vla1RpbWVVczsKQEAgLTEwMTIsMzYgKzEwNjQsMTUgQEAKICAgICAgICAgICAgICAgICBlcnIgPSBtUmVuZGVyZXItPnNldFBsYXliYWNrU2V0dGluZ3MocmF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJhdGUubVNwZWVkID09IDAuZikgewotICAgICAgICAgICAgICAgICAgICBvblBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1BBVVNFRCwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1QYXVzZWRCeUNsaWVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgYWxsIG90aGVyIHNldHRpbmdzICh1c2luZyBub24tcGF1c2VkIHNwZWVkKQotICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBjYW4gcmVzdG9yZSB0aGVtIG9uIHN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIG5ld1JhdGUgPSByYXRlOwotICAgICAgICAgICAgICAgICAgICBuZXdSYXRlLm1TcGVlZCA9IG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZDsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSBuZXdSYXRlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8qIHJhdGUubVNwZWVkICE9IDAuZiAqLwotICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IHJlc3VtZSB5ZXQgaWYgdGhlIHNvdXJjZSBpcyBzdGlsbCBidWZmZXJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbVBhdXNlZEZvckJ1ZmZlcmluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uUmVzdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVByZXBhcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvblN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IHJhdGU7CiAKLSAgICAgICAgICAgICAgICAgICAgbVBhdXNlZEJ5Q2xpZW50ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInBsYXliYWNrLXNwZWVkIiwgbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkKTsKKyAgICAgICAgICAgICAgICAgICAgbVZpZGVvRGVjb2Rlci0+c2V0UGFyYW1ldGVycyhwYXJhbXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJwbGF5YmFjay1zcGVlZCIsIG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCk7Ci0gICAgICAgICAgICAgICAgbVZpZGVvRGVjb2Rlci0+c2V0UGFyYW1ldGVycyhwYXJhbXMpOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CiAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwpAQCAtMTA2MSw5ICsxMDkyLDYgQEAKICAgICAgICAgICAgICAgICAvLyBnZXQgcGxheWJhY2sgc2V0dGluZ3MgdXNlZCBieSByZW5kZXJlciwgYXMgaXQgbWF5IGJlCiAgICAgICAgICAgICAgICAgLy8gc2xpZ2h0bHkgb2ZmIGR1ZSB0byBhdWRpb3Npbmsgbm90IHRha2luZyBzbWFsbCBjaGFuZ2VzLgogICAgICAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gcmF0ZTsKLSAgICAgICAgICAgICAgICBpZiAobVBhdXNlZCkgewotICAgICAgICAgICAgICAgICAgICByYXRlLm1TcGVlZCA9IDAuZjsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CkBAIC0xMTU3LDIxICsxMTg1LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICYmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwgfHwgbVZpZGVvRGVjb2RlciAhPSBOVUxMKSkgewogICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UndmUgZm91bmQgYW55dGhpbmcgcGxheWFibGUuCiAKLSAgICAgICAgICAgICAgICBpZiAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pIHsKKyAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKSB7CiAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlUG9sbER1cmF0aW9uKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgICAgICBpZiAoKGVyciA9IG1Tb3VyY2UtPmZlZWRNb3JlVFNEYXRhKCkpICE9IE9LKSB7CisgICAgICAgICAgICBpZiAoKGVyciA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5mZWVkTW9yZVRTRGF0YSgpKSAhPSBPSykgewogICAgICAgICAgICAgICAgIGlmIChtQXVkaW9EZWNvZGVyID09IE5VTEwgJiYgbVZpZGVvRGVjb2RlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBjdXJyZW50bHkgZGVjb2RpbmcgYW55dGhpbmcgKG5vIGF1ZGlvIG9yCiAgICAgICAgICAgICAgICAgICAgIC8vIHZpZGVvIHRyYWNrcyBmb3VuZCkgYW5kIHdlIGp1c3QgcmFuIG91dCBvZiBpbnB1dCBkYXRhLgogCiAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEUsIDAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1BMQVlCQUNLX0NPTVBMRVRFLCAwLCAwKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTI1MywxMyArMTI4MiwxNCBAQAogICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKIAogICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBpbnB1dEZvcm1hdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOworICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLyk7CiAKICAgICAgICAgICAgICAgICBzZXRWaWRlb1NjYWxpbmdNb2RlKG1WaWRlb1NjYWxpbmdNb2RlKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVWaWRlb1NpemUobVNyY0lkLCBpbnB1dEZvcm1hdCwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICB1cGRhdGVWaWRlb1NpemUobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgaW5wdXRGb3JtYXQsIGZvcm1hdCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gRGVjb2RlckJhc2U6OmtXaGF0U2h1dGRvd25Db21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiJXMgc2h1dGRvd24gY29tcGxldGVkIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CiAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRGVjb2RlckxvY2spOwogICAgICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXJFcnJvciA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICArK21BdWRpb0RlY29kZXJHZW5lcmF0aW9uOwpAQCAtMTI2Nyw2ICsxMjk3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltRmx1c2hpbmdBdWRpbywgKGludClTSFVUVElOR19ET1dOX0RFQ09ERVIpOwogICAgICAgICAgICAgICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IFNIVVRfRE9XTjsKICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobURlY29kZXJMb2NrKTsKICAgICAgICAgICAgICAgICAgICAgbVZpZGVvRGVjb2Rlci5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBtVmlkZW9EZWNvZGVyRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgKyttVmlkZW9EZWNvZGVyR2VuZXJhdGlvbjsKQEAgLTEzMjMsMjggKzEzNTQsMzkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOyAgLy8gU2hvdWxkIG5vdCBvY2N1ci4KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgLy8gRmluaXNoIGFueXdheXMuCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtU291cmNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9EZWNvZGVyRXJyb3IgfHwgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSA9PSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1OYXRpdmVXaW5kb3cgPT0gTlVMTCB8fCBtTmF0aXZlV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCkgPT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXJFcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSA9PSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1OYXRpdmVXaW5kb3cgPT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtTmF0aXZlV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCkgPT0gTlVMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtVmlkZW9EZWNvZGVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGJvdGggYXVkaW8gYW5kIHZpZGVvIGhhdmUgZXJyb3IsIG9yIHRoaXMgc3RyZWFtIGhhcyBvbmx5IGF1ZGlvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaGFzIGVycm9yLCBub3RpZnkgY2xpZW50IG9mIGVycm9yLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGF1ZGlvIHRyYWNrIGhhcyBlcnJvci4gVmlkZW8gdHJhY2sgY291bGQgYmUgc3RpbGwgZ29vZCB0byBwbGF5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX1BMQVlfQVVESU9fRVJST1IsIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBMl9JTkZPX1BMQVlfQVVESU9fRVJST1IsIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0RlY29kZXJFcnJvciB8fCBtU291cmNlLT5nZXRGb3JtYXQodHJ1ZSAvKiBhdWRpbyAqLykgPT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0RlY29kZXJFcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KHRydWUgLyogYXVkaW8gKi8pID09IE5VTEwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbUF1ZGlvU2luayA9PSBOVUxMIHx8IG1BdWRpb0RlY29kZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gYm90aCBhdWRpbyBhbmQgdmlkZW8gaGF2ZSBlcnJvciwgb3IgdGhpcyBzdHJlYW0gaGFzIG9ubHkgdmlkZW8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBoYXMgZXJyb3IsIG5vdGlmeSBjbGllbnQgb2YgZXJyb3IuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdmlkZW8gdHJhY2sgaGFzIGVycm9yLiBBdWRpbyB0cmFjayBjb3VsZCBiZSBzdGlsbCBnb29kIHRvIHBsYXkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fUExBWV9WSURFT19FUlJPUiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUEyX0lORk9fUExBWV9WSURFT19FUlJPUiwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0RlY29kZXJFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEzOTQsMTIgKzE0MzYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLCBmaW5hbFJlc3VsdCk7CiAKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBmaW5hbFJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBMl9FUlJPUl9VTktOT1dOLCBmaW5hbFJlc3VsdCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKChtQXVkaW9FT1MgfHwgbUF1ZGlvRGVjb2RlciA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1WaWRlb0VPUyB8fCBtVmlkZW9EZWNvZGVyID09IE5VTEwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1BMQVlCQUNLX0NPTVBMRVRFLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1BMQVlCQUNLX0NPTVBMRVRFLCAwLCAwKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0Rmx1c2hDb21wbGV0ZSkgewogICAgICAgICAgICAgICAgIGludDMyX3QgYXVkaW87CkBAIC0xNDIwLDEwICsxNDYzLDExIEBACiAgICAgICAgICAgICAgICAgaGFuZGxlRmx1c2hDb21wbGV0ZShhdWRpbywgZmFsc2UgLyogaXNEZWNvZGVyICovKTsKICAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRWaWRlb1JlbmRlcmluZ1N0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fVklERU9fUkVOREVSSU5HX1NUQVJULCAwKTsKKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQTJfSU5GT19WSURFT19SRU5ERVJJTkdfU1RBUlQsIDApOwogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdE1lZGlhUmVuZGVyaW5nU3RhcnQpIHsKICAgICAgICAgICAgICAgICBBTE9HVigibWVkaWEgcmVuZGVyaW5nIHN0YXJ0ZWQiKTsKLSAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9TVEFSVEVELCAwLCAwKTsKKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfU1RBUlRFRCwgMCwgMCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0QXVkaW9UZWFyRG93bikgewogICAgICAgICAgICAgICAgIGludDMyX3QgcmVhc29uOwogICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZWFzb24iLCAmcmVhc29uKSk7CkBAIC0xNDc2LDcgKzE1MjAsNyBAQAogICAgICAgICAgICAgaW50NjRfdCB0aW1lclVzOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVyVXMiLCAmdGltZXJVcykpOwogCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9OT1RJRllfVElNRSwgdGltZXJVcywgMCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfTk9USUZZX1RJTUUsIHRpbWVyVXMsIDApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTQ5NSwyMCArMTUzOSwyMCBAQAogICAgICAgICAgICAgaWYgKCFtU3RhcnRlZCkgewogICAgICAgICAgICAgICAgIGlmICghbVNvdXJjZVN0YXJ0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c3RhcnQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHNlZWtUaW1lVXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1TZWVrKHNlZWtUaW1lVXMsIChNZWRpYVBsYXllcjJTZWVrTW9kZSltb2RlKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAobmVlZE5vdGlmeSkgewotICAgICAgICAgICAgICAgICAgICBub3RpZnlEcml2ZXJTZWVrQ29tcGxldGUobVNyY0lkKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5RHJpdmVyU2Vla0NvbXBsZXRlKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gc2Vla3MgY2FuIHRha2UgYSB3aGlsZSwgc28gd2UgZXNzZW50aWFsbHkgcGF1c2VkCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9QQVVTRUQsIDAsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1BBVVNFRCwgMCwgMCk7CiAKICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAogICAgICAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKEZMVVNIX0NNRF9GTFVTSCAvKiBhdWRpbyAqLywKQEAgLTE1MjcsMTAgKzE1NzEsNDkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdFJld2luZDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1YoImtXaGF0UmV3aW5kIik7CisKKyAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcyA9IG1DdXJyZW50U291cmNlSW5mby5tU3RhcnRUaW1lVXM7CisgICAgICAgICAgICBpbnQzMl90IG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19DTE9TRVNUOworCisgICAgICAgICAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtU291cmNlU3RhcnRlZCkgeworICAgICAgICAgICAgICAgICAgICBtU291cmNlU3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZXJmb3JtU2VlayhzZWVrVGltZVVzLCAoTWVkaWFQbGF5ZXIyU2Vla01vZGUpbW9kZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNlZWtzIGNhbiB0YWtlIGEgd2hpbGUsIHNvIHdlIGVzc2VudGlhbGx5IHBhdXNlZAorICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1BBVVNFRCwgMCwgMCk7CisKKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKEZMVVNIX0NNRF9GTFVTSCAvKiBhdWRpbyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTFVTSF9DTURfRkxVU0ggLyogdmlkZW8gKi8pKTsKKworICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIG5ldyBTZWVrQWN0aW9uKHNlZWtUaW1lVXMsIChNZWRpYVBsYXllcjJTZWVrTW9kZSltb2RlKSk7CisKKyAgICAgICAgICAgIC8vIEFmdGVyIGEgZmx1c2ggd2l0aG91dCBzaHV0ZG93biwgZGVjb2RlciBpcyBwYXVzZWQuCisgICAgICAgICAgICAvLyBEb24ndCByZXN1bWUgaXQgdW50aWwgc291cmNlIHNlZWsgaXMgZG9uZSwgb3RoZXJ3aXNlIGl0IGNvdWxkCisgICAgICAgICAgICAvLyBzdGFydCBwdWxsaW5nIHN0YWxlIGRhdGEgdG9vIHNvb24uCisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbmV3IFJlc3VtZURlY29kZXJBY3Rpb24oZmFsc2UgLyogbmVlZE5vdGlmeSAqLykpOworCisgICAgICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2Uga1doYXRQYXVzZToKICAgICAgICAgeworICAgICAgICAgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIG9uU3RhcnQoZmFsc2UgLyogcGxheSAqLyk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBvblBhdXNlKCk7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9QQVVTRUQsIDAsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1BBVVNFRCwgMCwgMCk7CiAgICAgICAgICAgICBtUGF1c2VkQnlDbGllbnQgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE1NjEsNyArMTY0NCw3IEBACiAKICAgICAgICAgY2FzZSBrV2hhdFJlbGVhc2VEcm06CiAgICAgICAgIHsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG9uUmVsZWFzZURybSgpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb25SZWxlYXNlRHJtKG1zZyk7CiAKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigic3RhdHVzIiwgc3RhdHVzKTsKQEAgLTE1ODMsOCArMTY2Niw4IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgbVBhdXNlZCA9IGZhbHNlOwotICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbVNvdXJjZS0+cmVzdW1lKCk7CisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnJlc3VtZSgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dXKCJyZXN1bWUgY2FsbGVkIHdoZW4gc291cmNlIGlzIGdvbmUgb3Igbm90IHNldCIpOwogICAgIH0KQEAgLTE2MDIsMTIgKzE2ODUsMTIgQEAKICAgICBzdGFydFBsYXliYWNrVGltZXIoIm9ucmVzdW1lIik7CiB9CiAKLXZvaWQgTnVQbGF5ZXIyOjpvblN0YXJ0KCkgewotICAgIEFMT0dWKCJvblN0YXJ0OiBtQ3J5cHRvOiAlcCIsIG1DcnlwdG8uZ2V0KCkpOwordm9pZCBOdVBsYXllcjI6Om9uU3RhcnQoYm9vbCBwbGF5KSB7CisgICAgQUxPR1YoIm9uU3RhcnQ6IG1DcnlwdG86ICVwIiwgbUN1cnJlbnRTb3VyY2VJbmZvLm1DcnlwdG8uZ2V0KCkpOwogCiAgICAgaWYgKCFtU291cmNlU3RhcnRlZCkgewogICAgICAgICBtU291cmNlU3RhcnRlZCA9IHRydWU7Ci0gICAgICAgIG1Tb3VyY2UtPnN0YXJ0KCk7CisgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zdGFydCgpOwogICAgIH0KIAogICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKQEAgLTE2MTgsMjIgKzE3MDEsMjMgQEAKIAogICAgIHVpbnQzMl90IGZsYWdzID0gMDsKIAotICAgIGlmIChtU291cmNlLT5pc1JlYWxUaW1lKCkpIHsKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmlzUmVhbFRpbWUoKSkgewogICAgICAgICBmbGFncyB8PSBSZW5kZXJlcjo6RkxBR19SRUFMX1RJTUU7CiAgICAgfQogCi0gICAgYm9vbCBoYXNBdWRpbyA9IChtU291cmNlLT5nZXRGb3JtYXQodHJ1ZSAvKiBhdWRpbyAqLykgIT0gTlVMTCk7Ci0gICAgYm9vbCBoYXNWaWRlbyA9IChtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pICE9IE5VTEwpOworICAgIGJvb2wgaGFzQXVkaW8gPSAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qIGF1ZGlvICovKSAhPSBOVUxMKTsKKyAgICBib29sIGhhc1ZpZGVvID0gKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pICE9IE5VTEwpOwogICAgIGlmICghaGFzQXVkaW8gJiYgIWhhc1ZpZGVvKSB7CiAgICAgICAgIEFMT0dFKCJubyBtZXRhZGF0YSBmb3IgZWl0aGVyIGF1ZGlvIG9yIHZpZGVvIHNvdXJjZSIpOwotICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zdG9wKCk7CiAgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gZmFsc2U7Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgRVJST1JfTUFMRk9STUVEKTsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICBNRURJQTJfRVJST1JfVU5LTk9XTiwgRVJST1JfTUFMRk9STUVEKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBBTE9HVl9JRighaGFzQXVkaW8sICJubyBtZXRhZGF0YSBmb3IgYXVkaW8gc291cmNlIik7ICAvLyB2aWRlbyBvbmx5IHN0cmVhbQogCi0gICAgc3A8TWV0YURhdGE+IGF1ZGlvTWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdE1ldGEodHJ1ZSAvKiBhdWRpbyAqLyk7CisgICAgc3A8TWV0YURhdGE+IGF1ZGlvTWV0YSA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXRNZXRhKHRydWUgLyogYXVkaW8gKi8pOwogCiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOwogICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKQEAgLTE2NDEsMTEgKzE3MjUsMTIgQEAKICAgICB9CiAKICAgICBtT2ZmbG9hZEF1ZGlvID0KLSAgICAgICAgY2FuT2ZmbG9hZFN0cmVhbShhdWRpb01ldGEsIGhhc1ZpZGVvLCBtU291cmNlLT5pc1N0cmVhbWluZygpLCBzdHJlYW1UeXBlKQorICAgICAgICBKTWVkaWFQbGF5ZXIyVXRpbHM6OmlzT2ZmbG9hZGVkQXVkaW9QbGF5YmFja1N1cHBvcnRlZCgKKyAgICAgICAgICAgICAgICBhdWRpb01ldGEsIGhhc1ZpZGVvLCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+aXNTdHJlYW1pbmcoKSwgc3RyZWFtVHlwZSkKICAgICAgICAgICAgICAgICAmJiAobVBsYXliYWNrU2V0dGluZ3MubVNwZWVkID09IDEuZiAmJiBtUGxheWJhY2tTZXR0aW5ncy5tUGl0Y2ggPT0gMS5mKTsKIAogICAgIC8vIE1vZHVsYXIgRFJNOiBEaXNhYmxpbmcgYXVkaW8gb2ZmbG9hZCBpZiB0aGUgc291cmNlIGlzIHByb3RlY3RlZAotICAgIGlmIChtT2ZmbG9hZEF1ZGlvICYmIG1Jc0RybVByb3RlY3RlZCkgeworICAgIGlmIChtT2ZmbG9hZEF1ZGlvICYmIG1DdXJyZW50U291cmNlSW5mby5tSXNEcm1Qcm90ZWN0ZWQpIHsKICAgICAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOwogICAgICAgICBBTE9HVigib25TdGFydDogRGlzYWJsaW5nIG1PZmZsb2FkQXVkaW8gbm93IHRoYXQgdGhlIHNvdXJjZSBpcyBwcm90ZWN0ZWQuIik7CiAgICAgfQpAQCAtMTY1NywxNyArMTc0MiwxNyBAQAogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZW5kZXJlck5vdGlmeSwgdGhpcyk7CiAgICAgKyttUmVuZGVyZXJHZW5lcmF0aW9uOwogICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUmVuZGVyZXJHZW5lcmF0aW9uKTsKLSAgICBtUmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIobUF1ZGlvU2luaywgbU1lZGlhQ2xvY2ssIG5vdGlmeSwgZmxhZ3MpOworICAgIG1SZW5kZXJlciA9IG5ldyBSZW5kZXJlcihtQXVkaW9TaW5rLCBtTWVkaWFDbG9jaywgbm90aWZ5LCBtQ29udGV4dCwgZmxhZ3MpOwogICAgIG1SZW5kZXJlckxvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgIG1SZW5kZXJlckxvb3Blci0+c2V0TmFtZSgiTnVQbGF5ZXJSZW5kZXJlciIpOwotICAgIG1SZW5kZXJlckxvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKKyAgICBtUmVuZGVyZXJMb29wZXItPnNldE5hbWUoIk51UGxheWVyMlJlbmRlcmVyIik7CisgICAgbVJlbmRlcmVyTG9vcGVyLT5zdGFydChmYWxzZSwgdHJ1ZSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CiAgICAgbVJlbmRlcmVyTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJlbmRlcmVyKTsKIAogICAgIHN0YXR1c190IGVyciA9IG1SZW5kZXJlci0+c2V0UGxheWJhY2tTZXR0aW5ncyhtUGxheWJhY2tTZXR0aW5ncyk7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zdG9wKCk7CiAgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gZmFsc2U7Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMTY3Niw2ICsxNzYxLDEyIEBACiAgICAgICAgIG1SZW5kZXJlci0+c2V0VmlkZW9GcmFtZVJhdGUocmF0ZSk7CiAgICAgfQogCisgICAgYWRkRW5kVGltZU1vbml0b3IoKTsKKyAgICAvLyBSZW5kZXJlciBpcyBjcmVhdGVkIGluIHBhdXNlZCBzdGF0ZS4KKyAgICBpZiAocGxheSkgeworICAgICAgICBtUmVuZGVyZXItPnJlc3VtZSgpOworICAgIH0KKwogICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKICAgICAgICAgbVZpZGVvRGVjb2Rlci0+c2V0UmVuZGVyZXIobVJlbmRlcmVyKTsKICAgICB9CkBAIC0xNjg0LDEwICsxNzc1LDIzIEBACiAgICAgfQogCiAgICAgc3RhcnRQbGF5YmFja1RpbWVyKCJvbnN0YXJ0Iik7CisgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX1NUQVJULCAwKTsKIAogICAgIHBvc3RTY2FuU291cmNlcygpOwogfQogCit2b2lkIE51UGxheWVyMjo6YWRkRW5kVGltZU1vbml0b3IoKSB7CisgICAgKyttRU9TTW9uaXRvckdlbmVyYXRpb247CisKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1FbmRUaW1lVXMgPT0gRGF0YVNvdXJjZURlc2M6OmtNYXhUaW1lVXMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRFT1NNb25pdG9yLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUVPU01vbml0b3JHZW5lcmF0aW9uKTsKKyAgICBtTWVkaWFDbG9jay0+YWRkVGltZXIobXNnLCBtQ3VycmVudFNvdXJjZUluZm8ubUVuZFRpbWVVcyk7Cit9CisKIHZvaWQgTnVQbGF5ZXIyOjpzdGFydFBsYXliYWNrVGltZXIoY29uc3QgY2hhciAqd2hlcmUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVBsYXlpbmdUaW1lTG9jayk7CiAgICAgaWYgKG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMgPT0gMCkgewpAQCAtMTcwOSw3ICsxODEzLDcgQEAKICAgICAgICAgICAgIEFMT0dWKCJzdG9wUGxheWJhY2tUaW1lcigpICBsb2cgICUyMCIgUFJJZDY0ICIiLCBwbGF5ZWQpOwogCiAgICAgICAgICAgICBpZiAocGxheWVkID4gMCkgewotICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5TW9yZVBsYXlpbmdUaW1lVXMobVNyY0lkLCAocGxheWVkKzUwMCkvMTAwMCk7CisgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlNb3JlUGxheWluZ1RpbWVVcyhtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCAocGxheWVkKzUwMCkvMTAwMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcyA9IDA7CkBAIC0xNzI3LDcgKzE4MzEsOCBAQAogdm9pZCBOdVBsYXllcjI6OnN0b3BSZWJ1ZmZlcmluZ1RpbWVyKGJvb2wgZXhpdGluZ1BsYXliYWNrKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1QbGF5aW5nVGltZUxvY2spOwogCi0gICAgQUxPR1YoInN0b3BSZWJ1ZmZlclRpbWVyKCkgIHRpbWUgJTIwIiBQUklkNjQgIiAoZXhpdGluZyAlZCkiLCBtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOcywgZXhpdGluZ1BsYXliYWNrKTsKKyAgICBBTE9HVigic3RvcFJlYnVmZmVyVGltZXIoKSAgdGltZSAlMjAiIFBSSWQ2NCAiIChleGl0aW5nICVkKSIsCisgICAgICAgICAgbUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMsIGV4aXRpbmdQbGF5YmFjayk7CiAKICAgICBpZiAobUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMgIT0gMCkgewogICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwpAQCAtMTczNyw5ICsxODQyLDEwIEBACiAgICAgICAgICAgICBBTE9HVigic3RvcFJlYnVmZmVyaW5nVGltZXIoKSAgbG9nICAlMjAiIFBSSWQ2NCAiIiwgcmVidWZmZXJlZCk7CiAKICAgICAgICAgICAgIGlmIChyZWJ1ZmZlcmVkID4gMCkgewotICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5TW9yZVJlYnVmZmVyaW5nVGltZVVzKG1TcmNJZCwgKHJlYnVmZmVyZWQrNTAwKS8xMDAwKTsKKyAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeU1vcmVSZWJ1ZmZlcmluZ1RpbWVVcygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIChyZWJ1ZmZlcmVkKzUwMCkvMTAwMCk7CiAgICAgICAgICAgICAgICAgaWYgKGV4aXRpbmdQbGF5YmFjaykgewotICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVJlYnVmZmVyaW5nV2hlbkV4aXQobVNyY0lkLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlSZWJ1ZmZlcmluZ1doZW5FeGl0KG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIHRydWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTc1NSw4ICsxODYxLDggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtUGF1c2VkID0gdHJ1ZTsKLSAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1Tb3VyY2UtPnBhdXNlKCk7CisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnBhdXNlKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1coInBhdXNlIGNhbGxlZCB3aGVuIHNvdXJjZSBpcyBnb25lIG9yIG5vdCBzZXQiKTsKICAgICB9CkBAIC0xODQ2LDcgKzE5NTIsNyBAQAogCiAgICAgc3RhdHVzX3QgZXJyID0gbVJlbmRlcmVyLT5vcGVuQXVkaW9TaW5rKAogICAgICAgICAgICAgZm9ybWF0LCB0cnVlIC8qIG9mZmxvYWRPbmx5ICovLCBoYXNWaWRlbywKLSAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZtT2ZmbG9hZEF1ZGlvLCBtU291cmNlLT5pc1N0cmVhbWluZygpKTsKKyAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZtT2ZmbG9hZEF1ZGlvLCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+aXNTdHJlYW1pbmcoKSk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAvLyBBbnkgZmFpbHVyZSB3ZSB0dXJuIG9mZiBtT2ZmbG9hZEF1ZGlvLgogICAgICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7CkBAIC0xODYzLDYgKzE5NjksNyBAQAogICAgICAgICBpbnQ2NF90IGN1cnJlbnRQb3NpdGlvblVzLCBib29sIGZvcmNlTm9uT2ZmbG9hZCwgYm9vbCBuZWVkc1RvQ3JlYXRlQXVkaW9EZWNvZGVyKSB7CiAgICAgaWYgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCkgewogICAgICAgICBtQXVkaW9EZWNvZGVyLT5wYXVzZSgpOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobURlY29kZXJMb2NrKTsKICAgICAgICAgbUF1ZGlvRGVjb2Rlci5jbGVhcigpOwogICAgICAgICBtQXVkaW9EZWNvZGVyRXJyb3IgPSBmYWxzZTsKICAgICAgICAgKyttQXVkaW9EZWNvZGVyR2VuZXJhdGlvbjsKQEAgLTE5MDksNyArMjAxNiw3IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpkZXRlcm1pbmVBdWRpb01vZGVDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZhdWRpb0Zvcm1hdCkgewotICAgIGlmIChtU291cmNlID09IE5VTEwgfHwgbUF1ZGlvU2luayA9PSBOVUxMKSB7CisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlID09IE5VTEwgfHwgbUF1ZGlvU2luayA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTE5MTksMTYgKzIwMjYsMTYgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHNwPE1ldGFEYXRhPiBhdWRpb01ldGEgPSBtU291cmNlLT5nZXRGb3JtYXRNZXRhKHRydWUgLyogYXVkaW8gKi8pOwotICAgIHNwPEFNZXNzYWdlPiB2aWRlb0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLyk7CisgICAgc3A8TWV0YURhdGE+IGF1ZGlvTWV0YSA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXRNZXRhKHRydWUgLyogYXVkaW8gKi8pOworICAgIHNwPEFNZXNzYWdlPiB2aWRlb0Zvcm1hdCA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOwogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IG1BdWRpb1NpbmstPmdldEF1ZGlvU3RyZWFtVHlwZSgpOwogICAgIGNvbnN0IGJvb2wgaGFzVmlkZW8gPSAodmlkZW9Gb3JtYXQgIT0gTlVMTCk7Ci0gICAgYm9vbCBjYW5PZmZsb2FkID0gY2FuT2ZmbG9hZFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvTWV0YSwgaGFzVmlkZW8sIG1Tb3VyY2UtPmlzU3RyZWFtaW5nKCksIHN0cmVhbVR5cGUpCisgICAgYm9vbCBjYW5PZmZsb2FkID0gSk1lZGlhUGxheWVyMlV0aWxzOjppc09mZmxvYWRlZEF1ZGlvUGxheWJhY2tTdXBwb3J0ZWQoCisgICAgICAgICAgICBhdWRpb01ldGEsIGhhc1ZpZGVvLCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+aXNTdHJlYW1pbmcoKSwgc3RyZWFtVHlwZSkKICAgICAgICAgICAgICAgICAgICAgJiYgKG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCA9PSAxLmYgJiYgbVBsYXliYWNrU2V0dGluZ3MubVBpdGNoID09IDEuZik7CiAKICAgICAvLyBNb2R1bGFyIERSTTogRGlzYWJsaW5nIGF1ZGlvIG9mZmxvYWQgaWYgdGhlIHNvdXJjZSBpcyBwcm90ZWN0ZWQKLSAgICBpZiAoY2FuT2ZmbG9hZCAmJiBtSXNEcm1Qcm90ZWN0ZWQpIHsKKyAgICBpZiAoY2FuT2ZmbG9hZCAmJiBtQ3VycmVudFNvdXJjZUluZm8ubUlzRHJtUHJvdGVjdGVkKSB7CiAgICAgICAgIGNhbk9mZmxvYWQgPSBmYWxzZTsKICAgICAgICAgQUxPR1YoImRldGVybWluZUF1ZGlvTW9kZUNoYW5nZTogRGlzYWJsaW5nIG1PZmZsb2FkQXVkaW8gYi9jIHRoZSBzb3VyY2UgaXMgcHJvdGVjdGVkLiIpOwogICAgIH0KQEAgLTE5NTUsNyArMjA2Miw3IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KGF1ZGlvKTsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdChhdWRpbyk7CiAKICAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CkBAIC0xOTc3LDExICsyMDg0LDExIEBACiAgICAgICAgICAgICBtQ0NEZWNvZGVyID0gbmV3IENDRGVjb2RlcihjY05vdGlmeSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgeworICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpIHsKICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInNlY3VyZSIsIHRydWUpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19QUk9URUNURUQpIHsKKyAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfUFJPVEVDVEVEKSB7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwcm90ZWN0ZWQiLCB0cnVlKTsKICAgICAgICAgfQogCkBAIC0xOTkxLDYgKzIwOTgsOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1EZWNvZGVyTG9jayk7CisKICAgICBpZiAoYXVkaW8pIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEF1ZGlvTm90aWZ5LCB0aGlzKTsKICAgICAgICAgKyttQXVkaW9EZWNvZGVyR2VuZXJhdGlvbjsKQEAgLTIwMDAsMTYgKzIxMDksMTYgQEAKICAgICAgICAgICAgIGRldGVybWluZUF1ZGlvTW9kZUNoYW5nZShmb3JtYXQpOwogICAgICAgICB9CiAgICAgICAgIGlmIChtT2ZmbG9hZEF1ZGlvKSB7Ci0gICAgICAgICAgICBtU291cmNlLT5zZXRPZmZsb2FkQXVkaW8odHJ1ZSAvKiBvZmZsb2FkICovKTsKKyAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zZXRPZmZsb2FkQXVkaW8odHJ1ZSAvKiBvZmZsb2FkICovKTsKIAotICAgICAgICAgICAgY29uc3QgYm9vbCBoYXNWaWRlbyA9IChtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyphdWRpbyAqLykgIT0gTlVMTCk7CisgICAgICAgICAgICBjb25zdCBib29sIGhhc1ZpZGVvID0gKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyphdWRpbyAqLykgIT0gTlVMTCk7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJoYXMtdmlkZW8iLCBoYXNWaWRlbyk7Ci0gICAgICAgICAgICAqZGVjb2RlciA9IG5ldyBEZWNvZGVyUGFzc1Rocm91Z2gobm90aWZ5LCBtU291cmNlLCBtUmVuZGVyZXIpOworICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2RlclBhc3NUaHJvdWdoKG5vdGlmeSwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UsIG1SZW5kZXJlcik7CiAgICAgICAgICAgICBBTE9HVigiaW5zdGFudGlhdGVEZWNvZGVyIGF1ZGlvIERlY29kZXJQYXNzVGhyb3VnaCAgaGFzVmlkZW86ICVkIiwgaGFzVmlkZW8pOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNvdXJjZS0+c2V0T2ZmbG9hZEF1ZGlvKGZhbHNlIC8qIG9mZmxvYWQgKi8pOworICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnNldE9mZmxvYWRBdWRpbyhmYWxzZSAvKiBvZmZsb2FkICovKTsKIAotICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2Rlcihub3RpZnksIG1Tb3VyY2UsIG1QSUQsIG1VSUQsIG1SZW5kZXJlcik7CisgICAgICAgICAgICAqZGVjb2RlciA9IG5ldyBEZWNvZGVyKG5vdGlmeSwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UsIG1QSUQsIG1VSUQsIG1SZW5kZXJlcik7CiAgICAgICAgICAgICBBTE9HVigiaW5zdGFudGlhdGVEZWNvZGVyIGF1ZGlvIERlY29kZXIiKTsKICAgICAgICAgfQogICAgICAgICBtQXVkaW9EZWNvZGVyRXJyb3IgPSBmYWxzZTsKQEAgLTIwMTksNyArMjEyOCw4IEBACiAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbik7CiAKICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2RlcigKLSAgICAgICAgICAgICAgICBub3RpZnksIG1Tb3VyY2UsIG1QSUQsIG1VSUQsIG1SZW5kZXJlciwgbU5hdGl2ZVdpbmRvdywgbUNDRGVjb2Rlcik7CisgICAgICAgICAgICAgICAgbm90aWZ5LCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSwgbVBJRCwgbVVJRCwgbVJlbmRlcmVyLCBtTmF0aXZlV2luZG93LAorICAgICAgICAgICAgICAgIG1DQ0RlY29kZXIpOwogICAgICAgICBtVmlkZW9EZWNvZGVyRXJyb3IgPSBmYWxzZTsKIAogICAgICAgICAvLyBlbmFibGUgRlJDIGlmIGhpZ2gtcXVhbGl0eSBBViBzeW5jIGlzIHJlcXVlc3RlZCwgZXZlbiBpZiBub3QKQEAgLTIwMzQsMTAgKzIxNDQsMTEgQEAKICAgICAoKmRlY29kZXIpLT5pbml0KCk7CiAKICAgICAvLyBNb2R1bGFyIERSTQotICAgIGlmIChtSXNEcm1Qcm90ZWN0ZWQpIHsKLSAgICAgICAgZm9ybWF0LT5zZXRPYmplY3QoImNyeXB0byIsIG1DcnlwdG8pOwotICAgICAgICBBTE9HVigiaW5zdGFudGlhdGVEZWNvZGVyOiBtQ3J5cHRvOiAlcCBpc1NlY3VyZTogJWQiLCBtQ3J5cHRvLmdldCgpLAotICAgICAgICAgICAgICAgIChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSAhPSAwKTsKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Jc0RybVByb3RlY3RlZCkgeworICAgICAgICBmb3JtYXQtPnNldE9iamVjdCgiY3J5cHRvIiwgbUN1cnJlbnRTb3VyY2VJbmZvLm1DcnlwdG8pOworICAgICAgICBBTE9HVigiaW5zdGFudGlhdGVEZWNvZGVyOiBtQ3J5cHRvOiAlcCBpc1NlY3VyZTogJWQiLAorICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tQ3J5cHRvLmdldCgpLAorICAgICAgICAgICAgICAgIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgIT0gMCk7CiAgICAgfQogCiAgICAgKCpkZWNvZGVyKS0+Y29uZmlndXJlKGZvcm1hdCk7CkBAIC0yMTU2LDcgKzIyNjcsOCBAQAogICAgICAgICAgICAgZGlzcGxheUhlaWdodCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXIyOjpub3RpZnlMaXN0ZW5lcihpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKK3ZvaWQgTnVQbGF5ZXIyOjpub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQbGF5ZXJNZXNzYWdlICppbikgewogICAgIGlmIChtRHJpdmVyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTIyNDAsOCArMjM1Miw5IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjI6OmdldFRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5KSBjb25zdCB7CitzdGF0dXNfdCBOdVBsYXllcjI6OmdldFRyYWNrSW5mbyhpbnQ2NF90IHNyY0lkLCBQbGF5ZXJNZXNzYWdlKiByZXBseSkgY29uc3QgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRUcmFja0luZm8sIHRoaXMpOworICAgIG1zZy0+c2V0SW50NjQoInNyY0lkIiwgc3JjSWQpOwogICAgIG1zZy0+c2V0UG9pbnRlcigicmVwbHkiLCByZXBseSk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CkBAIC0yMjQ5LDkgKzIzNjIsMTAgQEAKICAgICByZXR1cm4gZXJyOwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjI6OmdldFNlbGVjdGVkVHJhY2soaW50MzJfdCB0eXBlLCBQYXJjZWwqIHJlcGx5KSBjb25zdCB7CitzdGF0dXNfdCBOdVBsYXllcjI6OmdldFNlbGVjdGVkVHJhY2soaW50NjRfdCBzcmNJZCwgaW50MzJfdCB0eXBlLCBQbGF5ZXJNZXNzYWdlKiByZXBseSkgY29uc3QgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRTZWxlY3RlZFRyYWNrLCB0aGlzKTsKICAgICBtc2ctPnNldFBvaW50ZXIoInJlcGx5IiwgcmVwbHkpOworICAgIG1zZy0+c2V0SW50NjQoInNyY0lkIiwgc3JjSWQpOwogICAgIG1zZy0+c2V0SW50MzIoInR5cGUiLCB0eXBlKTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKQEAgLTIyNjIsOCArMjM3Niw5IEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyOjpzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKSB7CitzdGF0dXNfdCBOdVBsYXllcjI6OnNlbGVjdFRyYWNrKGludDY0X3Qgc3JjSWQsIHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCwgaW50NjRfdCB0aW1lVXMpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VsZWN0VHJhY2ssIHRoaXMpOworICAgIG1zZy0+c2V0SW50NjQoInNyY0lkIiwgc3JjSWQpOwogICAgIG1zZy0+c2V0U2l6ZSgidHJhY2tJbmRleCIsIHRyYWNrSW5kZXgpOwogICAgIG1zZy0+c2V0SW50MzIoInNlbGVjdCIsIHNlbGVjdCk7CiAgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKQEAgLTIyOTUsNiArMjQxMCw4IEBACiAgICAgQ0hFQ0sobVRyYWNrU3RhdHMgIT0gTlVMTCk7CiAKICAgICBtVHJhY2tTdGF0cy0+Y2xlYXIoKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRGVjb2RlckxvY2spOwogICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKICAgICAgICAgbVRyYWNrU3RhdHMtPnB1c2hfYmFjayhtVmlkZW9EZWNvZGVyLT5nZXRTdGF0cygpKTsKICAgICB9CkBAIC0yMzA0LDExICsyNDIxLDExIEBACiB9CiAKIHNwPE1ldGFEYXRhPiBOdVBsYXllcjI6OmdldEZpbGVNZXRhKCkgewotICAgIHJldHVybiBtU291cmNlLT5nZXRGaWxlRm9ybWF0TWV0YSgpOworICAgIHJldHVybiBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0RmlsZUZvcm1hdE1ldGEoKTsKIH0KIAogZmxvYXQgTnVQbGF5ZXIyOjpnZXRGcmFtZVJhdGUoKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtU291cmNlLT5nZXRGb3JtYXRNZXRhKGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXRNZXRhKGZhbHNlIC8qIGF1ZGlvICovKTsKICAgICBpZiAobWV0YSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTIzNjYsMTYgKzI0ODMsMTYgQEAKICAgICBBTE9HVigicGVyZm9ybVNlZWsgc2Vla1RpbWVVcz0lbGxkIHVzICglLjJmIHNlY3MpLCBtb2RlPSVkIiwKICAgICAgICAgICAobG9uZyBsb25nKXNlZWtUaW1lVXMsIHNlZWtUaW1lVXMgLyAxRTYsIG1vZGUpOwogCi0gICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIHJlc2V0IG9jY3VycyByaWdodCBiZWZvcmUgdGhlIGxvb3AgbW9kZQogICAgICAgICAvLyBhc3luY2hyb25vdXNseSBzZWVrcyB0byB0aGUgc3RhcnQgb2YgdGhlIHN0cmVhbS4KICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQXVkaW9EZWNvZGVyICE9IE5VTEwgfHwgbVZpZGVvRGVjb2RlciAhPSBOVUxMLAotICAgICAgICAgICAgICAgICJtU291cmNlIGlzIE5VTEwgYW5kIGRlY29kZXJzIG5vdCBOVUxMIGF1ZGlvKCVwKSB2aWRlbyglcCkiLAorICAgICAgICAgICAgICAgICJtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSBpcyBOVUxMIGFuZCBkZWNvZGVycyBub3QgTlVMTCBhdWRpbyglcCkgdmlkZW8oJXApIiwKICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyLmdldCgpLCBtVmlkZW9EZWNvZGVyLmdldCgpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtUHJldmlvdXNTZWVrVGltZVVzID0gc2Vla1RpbWVVczsKLSAgICBtU291cmNlLT5zZWVrVG8oc2Vla1RpbWVVcywgbW9kZSk7CisgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnNlZWtUbyhzZWVrVGltZVVzLCBtb2RlKTsKICAgICArK21UaW1lZFRleHRHZW5lcmF0aW9uOwogCiAgICAgLy8gZXZlcnl0aGluZydzIGZsdXNoZWQsIGNvbnRpbnVlIHBsYXliYWNrLgpAQCAtMjQyMiwxNyArMjUzOSwxMyBAQAogICAgIG1SZW5kZXJlci5jbGVhcigpOwogICAgICsrbVJlbmRlcmVyR2VuZXJhdGlvbjsKIAotICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbVNvdXJjZS0+c3RvcCgpOwotCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7Ci0gICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKLSAgICB9CisgICAgcmVzZXRTb3VyY2VJbmZvKG1DdXJyZW50U291cmNlSW5mbyk7CisgICAgcmVzZXRTb3VyY2VJbmZvKG1OZXh0U291cmNlSW5mbyk7CiAKICAgICBpZiAobURyaXZlciAhPSBOVUxMKSB7CiAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlSZXNldENvbXBsZXRlKG1TcmNJZCk7CisgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVJlc2V0Q29tcGxldGUobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI0NDEsMTQgKzI1NTQsNiBAQAogICAgIG1SZXNldHRpbmcgPSBmYWxzZTsKICAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOwogCi0gICAgLy8gTW9kdWxhciBEUk0KLSAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIGRlY29kZXJzIHdpbGwgYmUgZmx1c2hlZCBiZWZvcmUgdGhpcyBzbyB0aGVpciBtQ3J5cHRvIHdvdWxkIGdvIGF3YXkgb24gdGhlaXIgb3duCi0gICAgICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCi0gICAgICAgIEFMT0dEKCJwZXJmb3JtUmVzZXQgbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKLSAgICAgICAgbUNyeXB0by5jbGVhcigpOwotICAgIH0KLSAgICBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKIH0KIAogdm9pZCBOdVBsYXllcjI6OnBlcmZvcm1QbGF5TmV4dERhdGFTb3VyY2UoKSB7CkBAIC0yNDY3LDI1ICsyNTcyLDMxIEBACiAKICAgICArK21SZW5kZXJlckdlbmVyYXRpb247CiAKLSAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c3RvcCgpOwogICAgIH0KIAogICAgIGxvbmcgcHJldmlvdXNTcmNJZDsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7Ci0gICAgICAgIG1Tb3VyY2UgPSBtTmV4dFNvdXJjZTsKLSAgICAgICAgbU5leHRTb3VyY2UgPSBOVUxMOwotICAgICAgICBwcmV2aW91c1NyY0lkID0gbVNyY0lkOwotICAgICAgICBtU3JjSWQgPSBtTmV4dFNyY0lkOwotICAgICAgICArK21OZXh0U3JjSWQ7ICAvLyB0byBkaXN0aW5ndWlzaCB0aGUgdHdvIHNvdXJjZXMuCisgICAgICAgIHByZXZpb3VzU3JjSWQgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkOworCisgICAgICAgIG1DdXJyZW50U291cmNlSW5mbyA9IG1OZXh0U291cmNlSW5mbzsKKyAgICAgICAgbU5leHRTb3VyY2VJbmZvID0gU291cmNlSW5mbygpOworICAgICAgICBtTmV4dFNvdXJjZUluZm8ubVNyY0lkID0gfm1DdXJyZW50U291cmNlSW5mby5tU3JjSWQ7ICAvLyB0byBkaXN0aW5ndWlzaCB0aGUgdHdvIHNvdXJjZXMuCiAgICAgfQogCiAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgewogICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKHByZXZpb3VzU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19QTEFZQkFDS19DT01QTEVURSwgMCk7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19TVEFSVEVEX0FTX05FWFQsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIocHJldmlvdXNTcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX0VORCwgMCk7CisKKyAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7CisgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfU1RBUlQsIDApOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNDk0LDIyICsyNjA1LDE1IEBACiAgICAgbVJlc2V0dGluZyA9IGZhbHNlOwogICAgIG1Tb3VyY2VTdGFydGVkID0gZmFsc2U7CiAKLSAgICAvLyBNb2R1bGFyIERSTQotICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKLSAgICAgICAgLy8gZGVjb2RlcnMgd2lsbCBiZSBmbHVzaGVkIGJlZm9yZSB0aGlzIHNvIHRoZWlyIG1DcnlwdG8gd291bGQgZ28gYXdheSBvbiB0aGVpciBvd24KLSAgICAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKLSAgICAgICAgQUxPR0QoInBlcmZvcm1SZXNldCBtQ3J5cHRvOiAlcCIsIG1DcnlwdG8uZ2V0KCkpOwotICAgICAgICBtQ3J5cHRvLmNsZWFyKCk7Ci0gICAgfQotICAgIG1Jc0RybVByb3RlY3RlZCA9IGZhbHNlOworICAgIGFkZEVuZFRpbWVNb25pdG9yKCk7CiAKICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKICAgICAgICAgbVJlbmRlcmVyLT5yZXN1bWUoKTsKICAgICB9CiAKLSAgICBvblN0YXJ0KCk7CisgICAgb25TdGFydCh0cnVlIC8qIHBsYXkgKi8pOwogICAgIG1QYXVzZWRCeUNsaWVudCA9IGZhbHNlOwotICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1NUQVJURUQsIDAsIDApOworICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9TVEFSVEVELCAwLCAwKTsKIH0KIAogdm9pZCBOdVBsYXllcjI6OnBlcmZvcm1TY2FuU291cmNlcygpIHsKQEAgLTI1MzUsNyArMjYzOSw3IEBACiAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgewogICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5U2V0U3VyZmFjZUNvbXBsZXRlKG1TcmNJZCk7CisgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNldFN1cmZhY2VDb21wbGV0ZShtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTI1NjcsNyArMjY3MSw3IEBACiB2b2lkIE51UGxheWVyMjo6ZmluaXNoUmVzdW1lKCkgewogICAgIGlmIChtUmVzdW1lUGVuZGluZykgewogICAgICAgICBtUmVzdW1lUGVuZGluZyA9IGZhbHNlOwotICAgICAgICBub3RpZnlEcml2ZXJTZWVrQ29tcGxldGUobVNyY0lkKTsKKyAgICAgICAgbm90aWZ5RHJpdmVyU2Vla0NvbXBsZXRlKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQpOwogICAgIH0KIH0KIApAQCAtMjU4OSwzNiArMjY5Myw1MCBAQAogICAgIHN3aXRjaCAod2hhdCkgewogICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRQcmVwYXJlZDoKICAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoIk51UGxheWVyMjo6b25Tb3VyY2VOb3RpZnkgU291cmNlOjprV2hhdFByZXBhcmVkIHNvdXJjZTogJXAiLCBtU291cmNlLmdldCgpKTsKLSAgICAgICAgICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3RhbGUgbm90aWZpY2F0aW9uIGZyb20gYSBzb3VyY2UgdGhhdCB3YXMKLSAgICAgICAgICAgICAgICAvLyBhc3luY2hyb25vdXNseSBwcmVwYXJpbmcgd2hlbiB0aGUgY2xpZW50IGNhbGxlZCByZXNldCgpLgotICAgICAgICAgICAgICAgIC8vIFdlIGhhbmRsZWQgdGhlIHJlc2V0LCB0aGUgc291cmNlIGlzIGdvbmUuCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDMyX3QgZXJyOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIC8vIHNodXQgZG93biBwb3RlbnRpYWwgc2VjdXJlIGNvZGVjcyBpbiBjYXNlIGNsaWVudCBuZXZlciBjYWxscyByZXNldAotICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbihGTFVTSF9DTURfU0hVVERPV04gLyogYXVkaW8gKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9TSFVURE9XTiAvKiB2aWRlbyAqLykpOwotICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVByZXBhcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKLSAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBkdXJhdGlvbiBmaXJzdCwgc28gdGhhdCBpdCdzIGRlZmluaXRlbHkgc2V0IHdoZW4KLSAgICAgICAgICAgICAgICAvLyB0aGUgYXBwIHJlY2VpdmVkIHRoZSAicHJlcGFyZSBjb21wbGV0ZSIgY2FsbGJhY2suCi0gICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICAgICAgICAgIGlmIChtU291cmNlLT5nZXREdXJhdGlvbigmZHVyYXRpb25VcykgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihzcmNJZCwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICBBTE9HVigiTnVQbGF5ZXIyOjpvblNvdXJjZU5vdGlmeSBTb3VyY2U6OmtXaGF0UHJlcGFyZWQgc291cmNlOiVwLCBJZCglbGxkKSIsCisgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS5nZXQoKSwgKGxvbmcgbG9uZylzcmNJZCk7CisgICAgICAgICAgICBpZiAoc3JjSWQgPT0gbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCkgeworICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzdGFsZSBub3RpZmljYXRpb24gZnJvbSBhIHNvdXJjZSB0aGF0IHdhcworICAgICAgICAgICAgICAgICAgICAvLyBhc3luY2hyb25vdXNseSBwcmVwYXJpbmcgd2hlbiB0aGUgY2xpZW50IGNhbGxlZCByZXNldCgpLgorICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYW5kbGVkIHRoZSByZXNldCwgdGhlIHNvdXJjZSBpcyBnb25lLgorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlQcmVwYXJlQ29tcGxldGVkKHNyY0lkLCBlcnIpOworCisgICAgICAgICAgICAgICAgaW50MzJfdCBlcnI7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2h1dCBkb3duIHBvdGVudGlhbCBzZWN1cmUgY29kZWNzIGluIGNhc2UgY2xpZW50IG5ldmVyIGNhbGxzIHJlc2V0CisgICAgICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oRkxVU0hfQ01EX1NIVVRET1dOIC8qIGF1ZGlvICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxVU0hfQ01EX1NIVVRET1dOIC8qIHZpZGVvICovKSk7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtUHJlcGFyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBkdXJhdGlvbiBmaXJzdCwgc28gdGhhdCBpdCdzIGRlZmluaXRlbHkgc2V0IHdoZW4KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFwcCByZWNlaXZlZCB0aGUgInByZXBhcmUgY29tcGxldGUiIGNhbGxiYWNrLgorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUR1cmF0aW9uKHNyY0lkLCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVByZXBhcmVDb21wbGV0ZWQoc3JjSWQsIGVycik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNJZCA9PSBtTmV4dFNvdXJjZUluZm8ubVNyY0lkKSB7CisgICAgICAgICAgICAgICAgaWYgKG1OZXh0U291cmNlSW5mby5tU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBzdGFsZQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXJyOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVByZXBhcmVDb21wbGV0ZWQoc3JjSWQsIGVycik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBicmVhazsKQEAgLTI2MjcsMTUgKzI3NDUsMTUgQEAKICAgICAgICAgLy8gTW9kdWxhciBEUk0KICAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0RHJtSW5mbzoKICAgICAgICAgewotICAgICAgICAgICAgUGFyY2VsIHBhcmNlbDsKKyAgICAgICAgICAgIFBsYXllck1lc3NhZ2UgcGxheWVyTXNnOwogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gZHJtSW5mbzsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiZHJtSW5mbyIsICZkcm1JbmZvKSk7Ci0gICAgICAgICAgICBwYXJjZWwuc2V0RGF0YShkcm1JbmZvLT5kYXRhKCksIGRybUluZm8tPnNpemUoKSk7CisgICAgICAgICAgICBwbGF5ZXJNc2cuUGFyc2VGcm9tQXJyYXkoZHJtSW5mby0+ZGF0YSgpLCBkcm1JbmZvLT5zaXplKCkpOwogCi0gICAgICAgICAgICBBTE9HVigib25Tb3VyY2VOb3RpZnkoKSBrV2hhdERybUluZm8gTUVESUEyX0RSTV9JTkZPIGRybUluZm86ICVwICBwYXJjZWwgc2l6ZTogJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgZHJtSW5mby5nZXQoKSwgcGFyY2VsLmRhdGFTaXplKCkpOworICAgICAgICAgICAgQUxPR1YoIm9uU291cmNlTm90aWZ5KCkga1doYXREcm1JbmZvIE1FRElBMl9EUk1fSU5GTyBkcm1JbmZvOiAlcCAgcGxheWVyTXNnIHNpemU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgZHJtSW5mby5nZXQoKSwgcGxheWVyTXNnLkJ5dGVTaXplKCkpOwogCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0RSTV9JTkZPLCAwIC8qIGV4dDEgKi8sIDAgLyogZXh0MiAqLywgJnBhcmNlbCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0RSTV9JTkZPLCAwIC8qIGV4dDEgKi8sIDAgLyogZXh0MiAqLywgJnBsYXllck1zZyk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNjY0LDE5ICsyNzgyLDI2IEBACiAgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5TGlzdGVuZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19OT1RfU0VFS0FCTEUsIDApOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUZsYWdzQ2hhbmdlZChzcmNJZCwgZmxhZ3MpOworICAgICAgICAgICAgICAgIGlmIChzcmNJZCA9PSBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkKSB7CisgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RmxhZ3NDaGFuZ2VkKHNyY0lkLCBmbGFncyk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKQotICAgICAgICAgICAgICAgICAgICAmJiAoIShmbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKSkpIHsKLSAgICAgICAgICAgICAgICBjYW5jZWxQb2xsRHVyYXRpb24oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIShtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikKLSAgICAgICAgICAgICAgICAgICAgJiYgKGZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pCi0gICAgICAgICAgICAgICAgICAgICYmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwgfHwgbVZpZGVvRGVjb2RlciAhPSBOVUxMKSkgewotICAgICAgICAgICAgICAgIHNjaGVkdWxlUG9sbER1cmF0aW9uKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3JjSWQgPT0gbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCkgeworICAgICAgICAgICAgICAgIGlmICgobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCEoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbmNlbFBvbGxEdXJhdGlvbigpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIShtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwgfHwgbVZpZGVvRGVjb2RlciAhPSBOVUxMKSkgeworICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVBvbGxEdXJhdGlvbigpOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbVNvdXJjZUZsYWdzID0gZmxhZ3M7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyA9IGZsYWdzOworICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNJZCA9PSBtTmV4dFNvdXJjZUluZm8ubVNyY0lkKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGR1cmF0aW9uIHBvbGxpbmcgZm9yIG5leHQgc291cmNlLgorICAgICAgICAgICAgICAgIG1OZXh0U291cmNlSW5mby5tU291cmNlRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTI4MjcsOCArMjk1Miw4IEBACiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpKTsKIAogICAgICAgICAgICAgc2l6ZV90IGluYmFuZFRyYWNrcyA9IDA7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0VHJhY2tDb3VudCgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzZW5kU3VidGl0bGVEYXRhKGJ1ZmZlciwgaW5iYW5kVHJhY2tzKTsKQEAgLTI4MzcsNyArMjk2Miw3IEBACiAKICAgICAgICAgY2FzZSBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6a1doYXRUcmFja0FkZGVkOgogICAgICAgICB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19NRVRBREFUQV9VUERBVEUsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX01FVEFEQVRBX1VQREFURSwgMCk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yODU2LDM1ICsyOTgxLDMxIEBACiAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpOwogCi0gICAgUGFyY2VsIGluOwotICAgIGluLndyaXRlSW50MzIodHJhY2tJbmRleCArIGJhc2VJbmRleCk7Ci0gICAgaW4ud3JpdGVJbnQ2NCh0aW1lVXMpOwotICAgIGluLndyaXRlSW50NjQoZHVyYXRpb25Vcyk7Ci0gICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7Ci0gICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7Ci0gICAgaW4ud3JpdGUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBQbGF5ZXJNZXNzYWdlIHBsYXllck1zZzsKKyAgICBwbGF5ZXJNc2cuYWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUodHJhY2tJbmRleCArIGJhc2VJbmRleCk7CisgICAgcGxheWVyTXNnLmFkZF92YWx1ZXMoKS0+c2V0X2ludDY0X3ZhbHVlKHRpbWVVcyk7CisgICAgcGxheWVyTXNnLmFkZF92YWx1ZXMoKS0+c2V0X2ludDY0X3ZhbHVlKGR1cmF0aW9uVXMpOworICAgIHBsYXllck1zZy5hZGRfdmFsdWVzKCktPnNldF9ieXRlc192YWx1ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwogCi0gICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfU1VCVElUTEVfREFUQSwgMCwgMCwgJmluKTsKKyAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfU1VCVElUTEVfREFUQSwgMCwgMCwgJnBsYXllck1zZyk7CiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpzZW5kVGltZWRNZXRhRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CiAgICAgaW50NjRfdCB0aW1lVXM7CiAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogCi0gICAgUGFyY2VsIGluOwotICAgIGluLndyaXRlSW50NjQodGltZVVzKTsKLSAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKLSAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKLSAgICBpbi53cml0ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworICAgIFBsYXllck1lc3NhZ2UgcGxheWVyTXNnOworICAgIHBsYXllck1zZy5hZGRfdmFsdWVzKCktPnNldF9pbnQ2NF92YWx1ZSh0aW1lVXMpOworICAgIHBsYXllck1zZy5hZGRfdmFsdWVzKCktPnNldF9ieXRlc192YWx1ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwogCi0gICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfTUVUQV9EQVRBLCAwLCAwLCAmaW4pOworICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9NRVRBX0RBVEEsIDAsIDAsICZwbGF5ZXJNc2cpOwogfQogCiB2b2lkIE51UGxheWVyMjo6c2VuZFRpbWVkVGV4dERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewogICAgIGNvbnN0IHZvaWQgKmRhdGE7CiAgICAgc2l6ZV90IHNpemUgPSAwOwogICAgIGludDY0X3QgdGltZVVzOwotICAgIGludDMyX3QgZmxhZyA9IFRleHREZXNjcmlwdGlvbnM6OklOX0JBTkRfVEVYVF8zR1BQOworICAgIGludDMyX3QgZmxhZyA9IFRleHREZXNjcmlwdGlvbnMyOjpJTl9CQU5EX1RFWFRfM0dQUDsKIAogICAgIEFTdHJpbmcgbWltZTsKICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CkBAIC0yODkzLDI4ICszMDE0LDI4IEBACiAgICAgZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOwogICAgIHNpemUgPSBidWZmZXItPnNpemUoKTsKIAotICAgIFBhcmNlbCBwYXJjZWw7CisgICAgUGxheWVyTWVzc2FnZSBwbGF5ZXJNc2c7CiAgICAgaWYgKHNpemUgPiAwKSB7CiAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKICAgICAgICAgaW50MzJfdCBnbG9iYWwgPSAwOwogICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZ2xvYmFsIiwgJmdsb2JhbCkgJiYgZ2xvYmFsKSB7Ci0gICAgICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnM6OkdMT0JBTF9ERVNDUklQVElPTlM7CisgICAgICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnMyOjpHTE9CQUxfREVTQ1JJUFRJT05TOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmxhZyB8PSBUZXh0RGVzY3JpcHRpb25zOjpMT0NBTF9ERVNDUklQVElPTlM7CisgICAgICAgICAgICBmbGFnIHw9IFRleHREZXNjcmlwdGlvbnMyOjpMT0NBTF9ERVNDUklQVElPTlM7CiAgICAgICAgIH0KLSAgICAgICAgVGV4dERlc2NyaXB0aW9uczo6Z2V0UGFyY2VsT2ZEZXNjcmlwdGlvbnMoCi0gICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhLCBzaXplLCBmbGFnLCB0aW1lVXMgLyAxMDAwLCAmcGFyY2VsKTsKKyAgICAgICAgVGV4dERlc2NyaXB0aW9uczI6OmdldFBsYXllck1lc3NhZ2VPZkRlc2NyaXB0aW9ucygKKyAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWRhdGEsIHNpemUsIGZsYWcsIHRpbWVVcyAvIDEwMDAsICZwbGF5ZXJNc2cpOwogICAgIH0KIAotICAgIGlmICgocGFyY2VsLmRhdGFTaXplKCkgPiAwKSkgewotICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9USU1FRF9URVhULCAwLCAwLCAmcGFyY2VsKTsKKyAgICBpZiAocGxheWVyTXNnLnZhbHVlc19zaXplKCkgPiAwKSB7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9USU1FRF9URVhULCAwLCAwLCAmcGxheWVyTXNnKTsKICAgICB9IGVsc2UgeyAgLy8gc2VuZCBhbiBlbXB0eSB0aW1lZCB0ZXh0Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1RJTUVEX1RFWFQsIDAsIDApOworICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfVElNRURfVEVYVCwgMCwgMCk7CiAgICAgfQogfQogCiBjb25zdCBjaGFyICpOdVBsYXllcjI6OmdldERhdGFTb3VyY2VUeXBlKCkgewotICAgIHN3aXRjaCAobURhdGFTb3VyY2VUeXBlKSB7CisgICAgc3dpdGNoIChtQ3VycmVudFNvdXJjZUluZm8ubURhdGFTb3VyY2VUeXBlKSB7CiAgICAgICAgIGNhc2UgREFUQV9TT1VSQ0VfVFlQRV9IVFRQX0xJVkU6CiAgICAgICAgICAgICByZXR1cm4gIkhUVFBMaXZlIjsKIApAQCAtMjkzNiw4ICszMDU3LDM0IEBACiAgICAgfQogIH0KIAorTnVQbGF5ZXIyOjpTb3VyY2VJbmZvKiBOdVBsYXllcjI6OmdldFNvdXJjZUluZm9CeUlkSW5Nc2coY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQ2NF90IHNyY0lkOworICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJzcmNJZCIsICZzcmNJZCkpOworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkID09IHNyY0lkKSB7CisgICAgICAgIHJldHVybiAmbUN1cnJlbnRTb3VyY2VJbmZvOworICAgIH0gZWxzZSBpZiAobU5leHRTb3VyY2VJbmZvLm1TcmNJZCA9PSBzcmNJZCkgeworICAgICAgICByZXR1cm4gJm1OZXh0U291cmNlSW5mbzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXIyOjpyZXNldFNvdXJjZUluZm8oTnVQbGF5ZXIyOjpTb3VyY2VJbmZvICZzcmNJbmZvKSB7CisgICAgaWYgKHNyY0luZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIHNyY0luZm8ubVNvdXJjZS0+c3RvcCgpOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7CisgICAgICAgIHNyY0luZm8ubVNvdXJjZS5jbGVhcigpOworICAgIH0KKyAgICAvLyBNb2R1bGFyIERSTQorICAgIEFMT0dEKCJwZXJmb3JtUmVzZXQgbUNyeXB0bzogJXAiLCBzcmNJbmZvLm1DcnlwdG8uZ2V0KCkpOworICAgIHNyY0luZm8ubUNyeXB0by5jbGVhcigpOworICAgIHNyY0luZm8ubUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7Cit9CisKIC8vIE1vZHVsYXIgRFJNIGJlZ2luCi1zdGF0dXNfdCBOdVBsYXllcjI6OnByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpCitzdGF0dXNfdCBOdVBsYXllcjI6OnByZXBhcmVEcm0oCisgICAgICAgIGludDY0X3Qgc3JjSWQsIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKQogewogICAgIEFMT0dWKCJwcmVwYXJlRHJtICIpOwogCkBAIC0yOTQ3LDYgKzMwOTQsNyBAQAogICAgIHVpbnQ4X3QgVVVJRFsxNl07CiAgICAgbWVtY3B5KFVVSUQsIHV1aWQsIHNpemVvZihVVUlEKSk7CiAgICAgVmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZCA9IGRybVNlc3Npb25JZDsKKyAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIHNyY0lkKTsKICAgICBtc2ctPnNldFBvaW50ZXIoInV1aWQiLCAodm9pZCopVVVJRCk7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJkcm1TZXNzaW9uSWQiLCAodm9pZCopJnNlc3Npb25JZCk7CiAKQEAgLTI5NjMsMTEgKzMxMTEsMTIgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBOdVBsYXllcjI6OnJlbGVhc2VEcm0oKQorc3RhdHVzX3QgTnVQbGF5ZXIyOjpyZWxlYXNlRHJtKGludDY0X3Qgc3JjSWQpCiB7CiAgICAgQUxPR1YoInJlbGVhc2VEcm0gIik7CiAKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVsZWFzZURybSwgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQ2NCgic3JjSWQiLCBzcmNJZCk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwpAQCAtMjk4OCw4ICszMTM3LDE1IEBACiAgICAgQUxPR0QoIm9uUHJlcGFyZURybSAiKTsKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogTm8gc291cmNlLiBvblByZXBhcmVEcm0gZmFpbGVkIHdpdGggJWQuIiwgc3RhdHVzKTsKKyAgICBTb3VyY2VJbmZvICpzcmNJbmZvID0gZ2V0U291cmNlSW5mb0J5SWRJbk1zZyhtc2cpOworICAgIGlmIChzcmNJbmZvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpbnQ2NF90IHNyY0lkID0gc3JjSW5mby0+bVNyY0lkOworICAgIGlmIChzcmNJbmZvLT5tU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogc3JjSW5mbyglbGxkKSBObyBzb3VyY2UuIG9uUHJlcGFyZURybSBmYWlsZWQgd2l0aCAlZC4iLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc3JjSWQsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCkBAIC0zMDAxLDQyICszMTU3LDUwIEBACiAgICAgc3RhdHVzID0gT0s7CiAgICAgc3A8QU1lZGlhQ3J5cHRvV3JhcHBlcj4gY3J5cHRvID0gTlVMTDsKIAotICAgIHN0YXR1cyA9IG1Tb3VyY2UtPnByZXBhcmVEcm0odXVpZCwgKmRybVNlc3Npb25JZCwgJmNyeXB0byk7CisgICAgc3RhdHVzID0gc3JjSW5mby0+bVNvdXJjZS0+cHJlcGFyZURybSh1dWlkLCAqZHJtU2Vzc2lvbklkLCAmY3J5cHRvKTsKICAgICBpZiAoY3J5cHRvID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogbVNvdXJjZS0+cHJlcGFyZURybSBmYWlsZWQuIHN0YXR1czogJWQiLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgib25QcmVwYXJlRHJtOiBzcmNJbmZvKCVsbGQpLm1Tb3VyY2UtPnByZXBhcmVEcm0gZmFpbGVkLiBzdGF0dXM6ICVkIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNyY0lkLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICBBTE9HVigib25QcmVwYXJlRHJtOiBtU291cmNlLT5wcmVwYXJlRHJtIHN1Y2NlZWRlZCIpOworICAgIEFMT0dWKCJvblByZXBhcmVEcm06IHNyY0luZm8oJWxsZCkubVNvdXJjZS0+cHJlcGFyZURybSBzdWNjZWVkZWQiLCAobG9uZyBsb25nKXNyY0lkKTsKIAotICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogVW5leHBlY3RlZC4gQWxyZWFkeSBoYXZpbmcgbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKLSAgICAgICAgbUNyeXB0by5jbGVhcigpOworICAgIGlmIChzcmNJbmZvLT5tQ3J5cHRvICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogc3JjSW5mbyglbGxkKSBVbmV4cGVjdGVkLiBBbHJlYWR5IGhhdmluZyBtQ3J5cHRvOiAlcCIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzcmNJZCwgc3JjSW5mby0+bUNyeXB0by5nZXQoKSk7CisgICAgICAgIHNyY0luZm8tPm1DcnlwdG8uY2xlYXIoKTsKICAgICB9CiAKLSAgICBtQ3J5cHRvID0gY3J5cHRvOwotICAgIG1Jc0RybVByb3RlY3RlZCA9IHRydWU7CisgICAgc3JjSW5mby0+bUNyeXB0byA9IGNyeXB0bzsKKyAgICBzcmNJbmZvLT5tSXNEcm1Qcm90ZWN0ZWQgPSB0cnVlOwogICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCi0gICAgQUxPR0QoIm9uUHJlcGFyZURybTogbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKKyAgICBBTE9HRCgib25QcmVwYXJlRHJtOiBtQ3J5cHRvOiAlcCIsIHNyY0luZm8tPm1DcnlwdG8uZ2V0KCkpOwogCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyOjpvblJlbGVhc2VEcm0oKQorc3RhdHVzX3QgTnVQbGF5ZXIyOjpvblJlbGVhc2VEcm0oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpCiB7CiAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKICAgICBBTE9HRCgib25SZWxlYXNlRHJtICIpOwotCi0gICAgaWYgKCFtSXNEcm1Qcm90ZWN0ZWQpIHsKLSAgICAgICAgQUxPR1coIm9uUmVsZWFzZURybTogVW5leHBlY3RlZC4gbUlzRHJtUHJvdGVjdGVkIGlzIGFscmVhZHkgZmFsc2UuIik7CisgICAgU291cmNlSW5mbyAqc3JjSW5mbyA9IGdldFNvdXJjZUluZm9CeUlkSW5Nc2cobXNnKTs7CisgICAgaWYgKHNyY0luZm8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgbUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7CisgICAgaW50NjRfdCBzcmNJZCA9IHNyY0luZm8tPm1TcmNJZDsKKyAgICBpZiAoIXNyY0luZm8tPm1Jc0RybVByb3RlY3RlZCkgeworICAgICAgICBBTE9HVygib25SZWxlYXNlRHJtOiBzcmNJbmZvKCVsbGQpIFVuZXhwZWN0ZWQuIG1Jc0RybVByb3RlY3RlZCBpcyBhbHJlYWR5IGZhbHNlLiIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzcmNJZCk7CisgICAgfQorCisgICAgc3JjSW5mby0+bUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7CiAKICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKG1DcnlwdG8gIT0gTlVMTCkgeworICAgIGlmIChzcmNJbmZvLT5tQ3J5cHRvICE9IE5VTEwpIHsKICAgICAgICAgLy8gbm90aWZ5aW5nIHRoZSBzb3VyY2UgZmlyc3QgYmVmb3JlIHJlbW92aW5nIGNyeXB0byBmcm9tIGNvZGVjCi0gICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1Tb3VyY2UtPnJlbGVhc2VEcm0oKTsKKyAgICAgICAgaWYgKHNyY0luZm8tPm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgc3JjSW5mby0+bVNvdXJjZS0+cmVsZWFzZURybSgpOwogICAgICAgICB9CiAKICAgICAgICAgc3RhdHVzPU9LOwpAQCAtMzA1Nyw5ICszMjIxLDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCi0gICAgICAgIEFMT0dEKCJvblJlbGVhc2VEcm06IG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7Ci0gICAgICAgIG1DcnlwdG8uY2xlYXIoKTsKLSAgICB9IGVsc2UgeyAgIC8vIG1DcnlwdG8gPT0gTlVMTAorICAgICAgICBBTE9HRCgib25SZWxlYXNlRHJtOiBtQ3J5cHRvOiAlcCIsIHNyY0luZm8tPm1DcnlwdG8uZ2V0KCkpOworICAgICAgICBzcmNJbmZvLT5tQ3J5cHRvLmNsZWFyKCk7CisgICAgfSBlbHNlIHsgICAvLyBzcmNJbmZvLT5tQ3J5cHRvID09IE5VTEwKICAgICAgICAgQUxPR0UoIm9uUmVsZWFzZURybTogVW5leHBlY3RlZC4gVGhlcmUgaXMgbm8gY3J5cHRvLiIpOwogICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CkBAIC0zMTIxLDQgKzMyODUsMjQgQEAKICAgICBUUkVTUEFTUygpOwogfQogCitOdVBsYXllcjI6OlNvdXJjZUluZm86OlNvdXJjZUluZm8oKQorICAgIDogbURhdGFTb3VyY2VUeXBlKERBVEFfU09VUkNFX1RZUEVfTk9ORSksCisgICAgICBtU3JjSWQoMCksCisgICAgICBtU291cmNlRmxhZ3MoMCksCisgICAgICBtU3RhcnRUaW1lVXMoMCksCisgICAgICBtRW5kVGltZVVzKERhdGFTb3VyY2VEZXNjOjprTWF4VGltZVVzKSB7Cit9CisKK051UGxheWVyMjo6U291cmNlSW5mbyAmIE51UGxheWVyMjo6U291cmNlSW5mbzo6b3BlcmF0b3I9KGNvbnN0IE51UGxheWVyMjo6U291cmNlSW5mbyAmb3RoZXIpIHsKKyAgICBtU291cmNlID0gb3RoZXIubVNvdXJjZTsKKyAgICBtQ3J5cHRvID0gb3RoZXIubUNyeXB0bzsKKyAgICBtRGF0YVNvdXJjZVR5cGUgPSAoREFUQV9TT1VSQ0VfVFlQRSlvdGhlci5tRGF0YVNvdXJjZVR5cGU7CisgICAgbVNyY0lkID0gb3RoZXIubVNyY0lkOworICAgIG1Tb3VyY2VGbGFncyA9IG90aGVyLm1Tb3VyY2VGbGFnczsKKyAgICBtU3RhcnRUaW1lVXMgPSBvdGhlci5tU3RhcnRUaW1lVXM7CisgICAgbUVuZFRpbWVVcyA9IG90aGVyLm1FbmRUaW1lVXM7CisgICAgbUlzRHJtUHJvdGVjdGVkID0gb3RoZXIubUlzRHJtUHJvdGVjdGVkOworICAgIHJldHVybiAqdGhpczsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5oCmluZGV4IDk2Zjg1ZjkuLmI4ZmI5ODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuaApAQCAtMjIsNiArMjIsMTEgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CiAKICNpbmNsdWRlIDxtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaD4KKworI2luY2x1ZGUgIm1lZGlhcGxheWVyMi5wYi5oIgorCit1c2luZyBhbmRyb2lkOjptZWRpYTo6TWVkaWFQbGF5ZXIyUHJvdG86OlBsYXllck1lc3NhZ2U7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzgsNyArNDMsOCBAQAogc3RydWN0IE51UGxheWVyMkRyaXZlcjsKIAogc3RydWN0IE51UGxheWVyMiA6IHB1YmxpYyBBSGFuZGxlciB7Ci0gICAgZXhwbGljaXQgTnVQbGF5ZXIyKHBpZF90IHBpZCwgdWlkX3QgdWlkLCBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jayk7CisgICAgZXhwbGljaXQgTnVQbGF5ZXIyKHBpZF90IHBpZCwgdWlkX3QgdWlkLAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2ssIGNvbnN0IHNwPEpPYmplY3RIb2xkZXI+ICZjb250ZXh0KTsKIAogICAgIHZvaWQgc2V0RHJpdmVyKGNvbnN0IHdwPE51UGxheWVyMkRyaXZlcj4gJmRyaXZlcik7CiAKQEAgLTc1LDExICs4MSwxMiBAQAogICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzLAogICAgICAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMsCiAgICAgICAgICAgICBib29sIG5lZWROb3RpZnkgPSBmYWxzZSk7CisgICAgdm9pZCByZXdpbmQoKTsKIAogICAgIHN0YXR1c190IHNldFZpZGVvU2NhbGluZ01vZGUoaW50MzJfdCBtb2RlKTsKLSAgICBzdGF0dXNfdCBnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgZ2V0U2VsZWN0ZWRUcmFjayhpbnQzMl90IHR5cGUsIFBhcmNlbCogcmVwbHkpIGNvbnN0OwotICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCwgaW50NjRfdCB0aW1lVXMpOworICAgIHN0YXR1c190IGdldFRyYWNrSW5mbyhpbnQ2NF90IHNyY0lkLCBQbGF5ZXJNZXNzYWdlKiByZXBseSkgY29uc3Q7CisgICAgc3RhdHVzX3QgZ2V0U2VsZWN0ZWRUcmFjayhpbnQ2NF90IHNyY0lkLCBpbnQzMl90IHR5cGUsIFBsYXllck1lc3NhZ2UqIHJlcGx5KSBjb25zdDsKKyAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhpbnQ2NF90IHNyY0lkLCBzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKTsKICAgICBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbWVkaWFVcyk7CiAgICAgdm9pZCBnZXRTdGF0cyhWZWN0b3I8c3A8QU1lc3NhZ2U+ID4gKm1UcmFja1N0YXRzKTsKIApAQCAtODcsOCArOTQsOCBAQAogICAgIGZsb2F0IGdldEZyYW1lUmF0ZSgpOwogCiAgICAgLy8gTW9kdWxhciBEUk0KLSAgICBzdGF0dXNfdCBwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKTsKLSAgICBzdGF0dXNfdCByZWxlYXNlRHJtKCk7CisgICAgc3RhdHVzX3QgcHJlcGFyZURybShpbnQ2NF90IHNyY0lkLCBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCk7CisgICAgc3RhdHVzX3QgcmVsZWFzZURybShpbnQ2NF90IHNyY0lkKTsKIAogICAgIGNvbnN0IGNoYXIgKmdldERhdGFTb3VyY2VUeXBlKCk7CiAKQEAgLTE1MCw2ICsxNTcsMzIgQEAKICAgICAgICAga1doYXRTZXRCdWZmZXJpbmdTZXR0aW5ncyAgICAgICA9ICdzQnVTJywKICAgICAgICAga1doYXRQcmVwYXJlRHJtICAgICAgICAgICAgICAgICA9ICdwRHJtJywKICAgICAgICAga1doYXRSZWxlYXNlRHJtICAgICAgICAgICAgICAgICA9ICdyRHJtJywKKyAgICAgICAga1doYXRSZXdpbmQgICAgICAgICAgICAgICAgICAgICA9ICdyZVdkJywKKyAgICAgICAga1doYXRFT1NNb25pdG9yICAgICAgICAgICAgICAgICA9ICdlb3NNJywKKyAgICB9OworCisgICAgdHlwZWRlZiBlbnVtIHsKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9OT05FLAorICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX0hUVFBfTElWRSwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9SVFNQLAorICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX0dFTkVSSUNfVVJMLAorICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX0dFTkVSSUNfRkQsCisgICAgICAgIERBVEFfU09VUkNFX1RZUEVfTUVESUEsCisgICAgfSBEQVRBX1NPVVJDRV9UWVBFOworCisgICAgc3RydWN0IFNvdXJjZUluZm8geworICAgICAgICBTb3VyY2VJbmZvKCk7CisgICAgICAgIFNvdXJjZUluZm8gJm9wZXJhdG9yPShjb25zdCBTb3VyY2VJbmZvICYpOworCisgICAgICAgIHNwPFNvdXJjZT4gbVNvdXJjZTsKKyAgICAgICAgc3RkOjphdG9taWM8REFUQV9TT1VSQ0VfVFlQRT4gbURhdGFTb3VyY2VUeXBlOworICAgICAgICBpbnQ2NF90IG1TcmNJZDsKKyAgICAgICAgdWludDMyX3QgbVNvdXJjZUZsYWdzOworICAgICAgICBpbnQ2NF90IG1TdGFydFRpbWVVczsKKyAgICAgICAgaW50NjRfdCBtRW5kVGltZVVzOworICAgICAgICAvLyBNb2R1bGFyIERSTQorICAgICAgICBzcDxBTWVkaWFDcnlwdG9XcmFwcGVyPiBtQ3J5cHRvOworICAgICAgICBib29sIG1Jc0RybVByb3RlY3RlZCA9IGZhbHNlOwogICAgIH07CiAKICAgICB3cDxOdVBsYXllcjJEcml2ZXI+IG1Ecml2ZXI7CkBAIC0xNTcsMjMgKzE5MCwyMSBAQAogICAgIHVpZF90IG1VSUQ7CiAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gbU1lZGlhQ2xvY2s7CiAgICAgTXV0ZXggbVNvdXJjZUxvY2s7ICAvLyBndWFyZCB8bVNvdXJjZXwuCi0gICAgc3A8U291cmNlPiBtU291cmNlOwotICAgIGludDY0X3QgbVNyY0lkOwotICAgIHVpbnQzMl90IG1Tb3VyY2VGbGFnczsKLSAgICBzcDxTb3VyY2U+IG1OZXh0U291cmNlOwotICAgIGludDY0X3QgbU5leHRTcmNJZDsKLSAgICB1aW50MzJfdCBtTmV4dFNvdXJjZUZsYWdzOworICAgIFNvdXJjZUluZm8gbUN1cnJlbnRTb3VyY2VJbmZvOworICAgIFNvdXJjZUluZm8gbU5leHRTb3VyY2VJbmZvOwogICAgIHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiBtTmF0aXZlV2luZG93OwogICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwogICAgIHNwPERlY29kZXJCYXNlPiBtVmlkZW9EZWNvZGVyOwogICAgIGJvb2wgbU9mZmxvYWRBdWRpbzsKICAgICBzcDxEZWNvZGVyQmFzZT4gbUF1ZGlvRGVjb2RlcjsKKyAgICBNdXRleCBtRGVjb2RlckxvY2s7ICAvLyBndWFyZCB8bUF1ZGlvRGVjb2RlcnwgYW5kIHxtVmlkZW9EZWNvZGVyfC4KICAgICBzcDxDQ0RlY29kZXI+IG1DQ0RlY29kZXI7CiAgICAgc3A8UmVuZGVyZXI+IG1SZW5kZXJlcjsKICAgICBzcDxBTG9vcGVyPiBtUmVuZGVyZXJMb29wZXI7CiAgICAgaW50MzJfdCBtQXVkaW9EZWNvZGVyR2VuZXJhdGlvbjsKICAgICBpbnQzMl90IG1WaWRlb0RlY29kZXJHZW5lcmF0aW9uOwogICAgIGludDMyX3QgbVJlbmRlcmVyR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1FT1NNb25pdG9yR2VuZXJhdGlvbjsKIAogICAgIE11dGV4IG1QbGF5aW5nVGltZUxvY2s7CiAgICAgaW50NjRfdCBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zOwpAQCAtMjQ0LDIxICsyNzUsOCBAQAogICAgIC8vIFBhdXNlIHN0YXRlIGFzIHJlcXVlc3RlZCBieSBzb3VyY2UgKGludGVybmFsbHkpIGR1ZSB0byBidWZmZXJpbmcKICAgICBib29sIG1QYXVzZWRGb3JCdWZmZXJpbmc7CiAKLSAgICAvLyBNb2R1bGFyIERSTQotICAgIHNwPEFNZWRpYUNyeXB0b1dyYXBwZXI+IG1DcnlwdG87Ci0gICAgYm9vbCBtSXNEcm1Qcm90ZWN0ZWQ7Ci0KLSAgICB0eXBlZGVmIGVudW0gewotICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX05PTkUsCi0gICAgICAgIERBVEFfU09VUkNFX1RZUEVfSFRUUF9MSVZFLAotICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX1JUU1AsCi0gICAgICAgIERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19VUkwsCi0gICAgICAgIERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19GRCwKLSAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9NRURJQSwKLSAgICB9IERBVEFfU09VUkNFX1RZUEU7Ci0KLSAgICBzdGQ6OmF0b21pYzxEQVRBX1NPVVJDRV9UWVBFPiBtRGF0YVNvdXJjZVR5cGU7Ci0gICAgc3RkOjphdG9taWM8REFUQV9TT1VSQ0VfVFlQRT4gbU5leHREYXRhU291cmNlVHlwZTsKKyAgICAvLyBQYXNzZWQgZnJvbSBKQVZBCisgICAgY29uc3Qgc3A8Sk9iamVjdEhvbGRlcj4gbUNvbnRleHQ7CiAKICAgICBpbmxpbmUgY29uc3Qgc3A8RGVjb2RlckJhc2U+ICZnZXREZWNvZGVyKGJvb2wgYXVkaW8pIHsKICAgICAgICAgcmV0dXJuIGF1ZGlvID8gbUF1ZGlvRGVjb2RlciA6IG1WaWRlb0RlY29kZXI7CkBAIC0yOTIsMTIgKzMxMCwxNCBAQAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZpbnB1dEZvcm1hdCwKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0ID0gTlVMTCk7CiAKLSAgICB2b2lkIG5vdGlmeUxpc3RlbmVyKGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbiA9IE5VTEwpOworICAgIHZvaWQgbm90aWZ5TGlzdGVuZXIoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQbGF5ZXJNZXNzYWdlICppbiA9IE5VTEwpOworCisgICAgdm9pZCBhZGRFbmRUaW1lTW9uaXRvcigpOwogCiAgICAgdm9pZCBoYW5kbGVGbHVzaENvbXBsZXRlKGJvb2wgYXVkaW8sIGJvb2wgaXNEZWNvZGVyKTsKICAgICB2b2lkIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOwogCi0gICAgdm9pZCBvblN0YXJ0KCk7CisgICAgdm9pZCBvblN0YXJ0KGJvb2wgcGxheSk7CiAgICAgdm9pZCBvblJlc3VtZSgpOwogICAgIHZvaWQgb25QYXVzZSgpOwogCkBAIC0zMzMsMTAgKzM1MywxMyBAQAogICAgIHZvaWQgc2VuZFRpbWVkTWV0YURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAgICAgdm9pZCBzZW5kVGltZWRUZXh0RGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKIAotICAgIHZvaWQgd3JpdGVUcmFja0luZm8oUGFyY2VsKiByZXBseSwgY29uc3Qgc3A8QU1lc3NhZ2U+JiBmb3JtYXQpIGNvbnN0OworICAgIHZvaWQgd3JpdGVUcmFja0luZm8oUGxheWVyTWVzc2FnZSogcmVwbHksIGNvbnN0IHNwPEFNZXNzYWdlPiYgZm9ybWF0KSBjb25zdDsKIAogICAgIHN0YXR1c190IG9uUHJlcGFyZURybShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgc3RhdHVzX3Qgb25SZWxlYXNlRHJtKCk7CisgICAgc3RhdHVzX3Qgb25SZWxlYXNlRHJtKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIFNvdXJjZUluZm8qIGdldFNvdXJjZUluZm9CeUlkSW5Nc2coY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgcmVzZXRTb3VyY2VJbmZvKFNvdXJjZUluZm8gJnNyY0luZm8pOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTnVQbGF5ZXIyKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5jcHAKaW5kZXggYTIzNTQ2YS4uOThjMzQwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmNwcApAQCAtMTk5LDYgKzE5OSwxOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3NpemVfdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Z2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0IHsKKyAgICBpZiAobVNlbGVjdGVkVHJhY2sgIT0gLTEpIHsKKyAgICAgICAgQ0NUcmFjayB0cmFjayA9IG1UcmFja3NbbVNlbGVjdGVkVHJhY2tdOworICAgICAgICBpZiAodHJhY2subVRyYWNrVHlwZSA9PSBrVHJhY2tUeXBlQ0VBNjA4IHx8IHRyYWNrLm1UcmFja1R5cGUgPT0ga1RyYWNrVHlwZUNFQTcwOCkgeworICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUgPyBtU2VsZWN0ZWRUcmFjayA6IC0xKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHR5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9VTktOT1dOID8gbVNlbGVjdGVkVHJhY2sgOiAtMSk7CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCiBib29sIE51UGxheWVyMjo6Q0NEZWNvZGVyOjppc1NlbGVjdGVkKCkgY29uc3QgewogICAgIHJldHVybiBtU2VsZWN0ZWRUcmFjayA+PSAwICYmIG1TZWxlY3RlZFRyYWNrIDwgKGludDMyX3QpZ2V0VHJhY2tDb3VudCgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmgKaW5kZXggNTdkNWVhMi4uOTc4MzRkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5oCkBAIC0zOCw2ICszOCw3IEBACiAgICAgc2l6ZV90IGdldFRyYWNrQ291bnQoKSBjb25zdDsKICAgICBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCBpbmRleCkgY29uc3Q7CiAgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IGluZGV4LCBib29sIHNlbGVjdCk7CisgICAgc3NpemVfdCBnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3Q7CiAgICAgYm9vbCBpc1NlbGVjdGVkKCkgY29uc3Q7CiAgICAgdm9pZCBkZWNvZGUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOwogICAgIHZvaWQgZGlzcGxheShpbnQ2NF90IHRpbWVVcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyLmNwcAppbmRleCBmNTcxOGUxLi42NmJmYWU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2Rlci5jcHAKQEAgLTEwNyw3ICsxMDcsMTIgQEAKICAgICBtU3RhdHMtPnNldEludDY0KCJmcmFtZXMtdG90YWwiLCBtTnVtRnJhbWVzVG90YWwpOwogICAgIG1TdGF0cy0+c2V0SW50NjQoImZyYW1lcy1kcm9wcGVkLWlucHV0IiwgbU51bUlucHV0RnJhbWVzRHJvcHBlZCk7CiAgICAgbVN0YXRzLT5zZXRJbnQ2NCgiZnJhbWVzLWRyb3BwZWQtb3V0cHV0IiwgbU51bU91dHB1dEZyYW1lc0Ryb3BwZWQpOwotICAgIHJldHVybiBtU3RhdHM7CisgICAgbVN0YXRzLT5zZXRGbG9hdCgiZnJhbWUtcmF0ZS10b3RhbCIsIG1GcmFtZVJhdGVUb3RhbCk7CisKKyAgICAvLyBpJ20gbXV0ZXhlZCByaWdodCBub3cuCisgICAgLy8gbWFrZSBvdXIgb3duIGNvcHksIHNvIHdlIGFyZW4ndCB2aWN0aW0gdG8gYW55IGxhdGVyIGNoYW5nZXMuCisgICAgc3A8QU1lc3NhZ2U+IGNvcGllZFN0YXRzID0gbVN0YXRzLT5kdXAoKTsKKyAgICByZXR1cm4gY29waWVkU3RhdHM7CiB9CiAKIHN0YXR1c190IE51UGxheWVyMjo6RGVjb2Rlcjo6c2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbnd3KSB7CkBAIC0xMDg4LDYgKzEwOTMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE1lZGlhQnVmZmVySG9sZGVyKj4oaG9sZGVyLmdldCgpKS0+bWVkaWFCdWZmZXIoKSA6IG51bGxwdHI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChtZWRpYUJ1ZiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUJ1Zi0+c2l6ZSgpID4gY29kZWNCdWZmZXItPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKEVSUk9SX0JVRkZFUl9UT09fU01BTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgbURlcXVldWVkSW5wdXRCdWZmZXJzLnB1c2hfYmFjayhidWZmZXJJeCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2V0UmFuZ2UoMCwgbWVkaWFCdWYtPnNpemUoKSk7CiAgICAgICAgICAgICAgICAgICAgIG1lbWNweShjb2RlY0J1ZmZlci0+ZGF0YSgpLCBtZWRpYUJ1Zi0+ZGF0YSgpLCBtZWRpYUJ1Zi0+c2l6ZSgpKTsKIApAQCAtMTEwMiw2ICsxMTEzLDExIEBACiAgICAgICAgICAgICB9IC8vIGJ1ZmZlci0+ZGF0YSgpCiAgICAgICAgIH0gLy8gbmVlZHNDb3B5CiAKKyAgICAgICAgc3A8UmVmQmFzZT4gY3J5cHRJbmZvT2JqOworICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRPYmplY3QoImNyeXB0SW5mbyIsICZjcnlwdEluZm9PYmopKSB7CisgICAgICAgICAgICBjcnlwdEluZm8gPSBzdGF0aWNfY2FzdDxBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyICo+KGNyeXB0SW5mb09iai5nZXQoKSk7CisgICAgICAgIH0KKwogICAgICAgICBzdGF0dXNfdCBlcnI7CiAgICAgICAgIGlmIChjcnlwdEluZm8gIT0gTlVMTCkgewogICAgICAgICAgICAgZXJyID0gbUNvZGVjLT5xdWV1ZVNlY3VyZUlucHV0QnVmZmVyKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyQmFzZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJCYXNlLmNwcAppbmRleCA4NzkzMGM3Li45MTRmMjlmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJCYXNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJCYXNlLmNwcApAQCAtMzgsNyArMzgsNyBAQAogICAgIC8vIEV2ZXJ5IGRlY29kZXIgaGFzIGl0cyBvd24gbG9vcGVyIGJlY2F1c2UgTWVkaWFDb2RlYyBvcGVyYXRpb25zCiAgICAgLy8gYXJlIGJsb2NraW5nLCBidXQgTnVQbGF5ZXIyIG5lZWRzIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLgogICAgIG1EZWNvZGVyTG9vcGVyID0gbmV3IEFMb29wZXI7Ci0gICAgbURlY29kZXJMb29wZXItPnNldE5hbWUoIk5QRGVjb2RlciIpOworICAgIG1EZWNvZGVyTG9vcGVyLT5zZXROYW1lKCJOUDJEZWNvZGVyIik7CiAgICAgbURlY29kZXJMb29wZXItPnN0YXJ0KGZhbHNlLCAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8qIGNhbkNhbGxKYXZhICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuY3BwCmluZGV4IDM5OGMyNDYuLjE4NzY0OTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5jcHAKQEAgLTM3LDQ5ICszNyw1MSBAQAogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5oPgogCit1c2luZyBnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkOwordXNpbmcgYW5kcm9pZDo6bWVkaWE6Ok1lZGlhUGxheWVyMlByb3RvOjpWYWx1ZTsKKwogc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7CiBzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1NsZWVwVXMgPSAyMDAwMDsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgUGFyY2VsV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBzdGF0aWMgc3A8UGFyY2VsV3JhcHBlcj4gQ3JlYXRlKGNvbnN0IFBhcmNlbCAqcCkgeworc3RydWN0IFBsYXllck1lc3NhZ2VXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIHN0YXRpYyBzcDxQbGF5ZXJNZXNzYWdlV3JhcHBlcj4gQ3JlYXRlKGNvbnN0IFBsYXllck1lc3NhZ2UgKnApIHsKICAgICAgICAgaWYgKHAgIT0gTlVMTCkgewotICAgICAgICAgICAgc3A8UGFyY2VsV3JhcHBlcj4gcHcgPSBuZXcgUGFyY2VsV3JhcHBlcigpOwotICAgICAgICAgICAgaWYgKHB3LT5hcHBlbmRGcm9tKHApID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHB3OwotICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8UGxheWVyTWVzc2FnZVdyYXBwZXI+IHB3ID0gbmV3IFBsYXllck1lc3NhZ2VXcmFwcGVyKCk7CisgICAgICAgICAgICBwdy0+Y29weUZyb20ocCk7CisgICAgICAgICAgICByZXR1cm4gcHc7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgY29uc3QgUGFyY2VsICpnZXRQYXJjZWwoKSB7Ci0gICAgICAgIHJldHVybiBtUGFyY2VsOworICAgIGNvbnN0IFBsYXllck1lc3NhZ2UgKmdldFBsYXllck1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtUGxheWVyTWVzc2FnZTsKICAgICB9CiAKIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5QYXJjZWxXcmFwcGVyKCkgewotICAgICAgICBpZiAobVBhcmNlbCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBkZWxldGUgbVBhcmNlbDsKKyAgICB2aXJ0dWFsIH5QbGF5ZXJNZXNzYWdlV3JhcHBlcigpIHsKKyAgICAgICAgaWYgKG1QbGF5ZXJNZXNzYWdlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBtUGxheWVyTWVzc2FnZTsKICAgICAgICAgfQogICAgIH0KIAogcHJpdmF0ZToKLSAgICBQYXJjZWxXcmFwcGVyKCkKLSAgICAgICAgOiBtUGFyY2VsKE5VTEwpIHsgfQorICAgIFBsYXllck1lc3NhZ2VXcmFwcGVyKCkKKyAgICAgICAgOiBtUGxheWVyTWVzc2FnZShOVUxMKSB7IH0KIAotICAgIHN0YXR1c190IGFwcGVuZEZyb20oY29uc3QgUGFyY2VsICpwKSB7Ci0gICAgICAgIGlmIChtUGFyY2VsID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1QYXJjZWwgPSBuZXcgUGFyY2VsOworICAgIHZvaWQgY29weUZyb20oY29uc3QgUGxheWVyTWVzc2FnZSAqcCkgeworICAgICAgICBpZiAobVBsYXllck1lc3NhZ2UgPT0gTlVMTCkgeworICAgICAgICAgICAgbVBsYXllck1lc3NhZ2UgPSBuZXcgUGxheWVyTWVzc2FnZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbVBhcmNlbC0+YXBwZW5kRnJvbShwLCAwIC8qIHN0YXJ0ICovLCBwLT5kYXRhU2l6ZSgpKTsKKyAgICAgICAgbVBsYXllck1lc3NhZ2UtPkNvcHlGcm9tKCpwKTsKICAgICB9CiAKLSAgICBQYXJjZWwgKm1QYXJjZWw7CisgICAgUGxheWVyTWVzc2FnZSAqbVBsYXllck1lc3NhZ2U7CiB9OwogCiAvLyBrZXkgZm9yIG1lZGlhIHN0YXRpc3RpY3MKLXN0YXRpYyBjb25zdCBjaGFyICprS2V5UGxheWVyID0gIm51cGxheWVyIjsKK3N0YXRpYyBjb25zdCBjaGFyICprS2V5UGxheWVyID0gIm51cGxheWVyMiI7CiAvLyBhdHRycyBmb3IgbWVkaWEgc3RhdGlzdGljcwogICAgIC8vIE5COiB0aGVzZSBhcmUgbWF0Y2hlZCB3aXRoIHB1YmxpYyBKYXZhIEFQSSBjb25zdGFudHMgZGVmaW5lZAogICAgIC8vIGluIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIyLmphdmEKQEAgLTkwLDYgKzkyLDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVySGVpZ2h0ID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuaGVpZ2h0IjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRnJhbWVzID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZnJhbWVzIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRnJhbWVzRHJvcHBlZCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmRyb3BwZWQiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJGcmFtZVJhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcHMiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJBTWltZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmF1ZGlvLm1pbWUiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJBQ29kZWMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5hdWRpby5jb2RlYyI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckR1cmF0aW9uID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHVyYXRpb25NcyI7CkBAIC0xMDUsOCArMTA4LDEwIEBACiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllclJlYnVmZmVyaW5nQ291bnQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5yZWJ1ZmZlcnMiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJSZWJ1ZmZlcmluZ0F0RXhpdCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnJlYnVmZmVyRXhpdCI7CiAKK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyVmVyc2lvbiA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnZlcnNpb24iOwogCi1OdVBsYXllcjJEcml2ZXI6Ok51UGxheWVyMkRyaXZlcihwaWRfdCBwaWQsIHVpZF90IHVpZCkKKworTnVQbGF5ZXIyRHJpdmVyOjpOdVBsYXllcjJEcml2ZXIocGlkX3QgcGlkLCB1aWRfdCB1aWQsIGNvbnN0IHNwPEpPYmplY3RIb2xkZXI+ICZjb250ZXh0KQogICAgIDogbVN0YXRlKFNUQVRFX0lETEUpLAogICAgICAgbUFzeW5jUmVzdWx0KFVOS05PV05fRVJST1IpLAogICAgICAgbVNyY0lkKDApLApAQCAtMTIxLDkgKzEyNiwxMCBAQAogICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCiAgICAgICBtTnVQbGF5ZXIyTG9vcGVyKG5ldyBBTG9vcGVyKSwKICAgICAgIG1NZWRpYUNsb2NrKG5ldyBNZWRpYUNsb2NrKSwKLSAgICAgIG1QbGF5ZXIobmV3IE51UGxheWVyMihwaWQsIHVpZCwgbU1lZGlhQ2xvY2spKSwKKyAgICAgIG1QbGF5ZXIobmV3IE51UGxheWVyMihwaWQsIHVpZCwgbU1lZGlhQ2xvY2ssIGNvbnRleHQpKSwKICAgICAgIG1QbGF5ZXJGbGFncygwKSwKLSAgICAgIG1BbmFseXRpY3NJdGVtKE5VTEwpLAorICAgICAgbU1ldHJpY3NIYW5kbGUoMCksCisgICAgICBtUGxheWVyVmVyc2lvbigwKSwKICAgICAgIG1DbGllbnRVaWQodWlkKSwKICAgICAgIG1BdEVPUyhmYWxzZSksCiAgICAgICBtTG9vcGluZyhmYWxzZSksCkBAIC0xMzQsOSArMTQwLDEzIEBACiAKICAgICBtTWVkaWFDbG9jay0+aW5pdCgpOwogCi0gICAgLy8gc2V0IHVwIGFuIGFuYWx5dGljcyByZWNvcmQKLSAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0tleVBsYXllcik7Ci0gICAgbUFuYWx5dGljc0l0ZW0tPnNldFVpZChtQ2xpZW50VWlkKTsKKyAgICAvLyBYWFg6IHdoYXQgdmVyc2lvbiBhcmUgd2U/CisgICAgLy8gSWRlYWxseSwgdGhpcyB0aWNrcyB3aXRoIHRoZSBhcGsgdmVyc2lvbiBpbmZvIGZvciB0aGUgQVBFWCBwYWNrYWdpbmcKKworICAgIC8vIHNldCB1cCBtZWRpYSBtZXRyaWNzIHJlY29yZAorICAgIG1NZXRyaWNzSGFuZGxlID0gbWVkaWFtZXRyaWNzX2NyZWF0ZShrS2V5UGxheWVyKTsKKyAgICBtZWRpYW1ldHJpY3Nfc2V0VWlkKG1NZXRyaWNzSGFuZGxlLCBtQ2xpZW50VWlkKTsKKyAgICBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJWZXJzaW9uLCBtUGxheWVyVmVyc2lvbik7CiAKICAgICBtTnVQbGF5ZXIyTG9vcGVyLT5zdGFydCgKICAgICAgICAgICAgIGZhbHNlLCAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8KQEAgLTE1NywxMCArMTY3LDcgQEAKICAgICB1cGRhdGVNZXRyaWNzKCJkZXN0cnVjdG9yIik7CiAgICAgbG9nTWV0cmljcygiZGVzdHJ1Y3RvciIpOwogCi0gICAgaWYgKG1BbmFseXRpY3NJdGVtICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1BbmFseXRpY3NJdGVtOwotICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IE5VTEw7Ci0gICAgfQorICAgIG1lZGlhbWV0cmljc19kZWxldGUobU1ldHJpY3NIYW5kbGUpOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmluaXRDaGVjaygpIHsKQEAgLTI3MywxMyArMjgwLDYgQEAKICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BSRVBBUklORzsKICAgICAgICAgICAgIG1QbGF5ZXItPnByZXBhcmVBc3luYygpOwogICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6Ci0gICAgICAgICAgICAvLyB0aGlzIGlzIHJlYWxseSBqdXN0IHBhdXNlZC4gaGFuZGxlIGFzIHNlZWsgdG8gc3RhcnQKLSAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOwotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOwotICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCwgTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyAvKiBtb2RlICovLAotICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIG5lZWROb3RpZnkgKi8pOwotICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH07CkBAIC0yOTQsNyArMjk0LDYgQEAKIHN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c3RhcnRfbCgpIHsKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDoKICAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKICAgICAgICAgewogICAgICAgICAgICAgbVBsYXllci0+c3RhcnQoKTsKQEAgLTMwNCw3ICszMDMsNyBAQAogICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChtQXRFT1MpIHsKLSAgICAgICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYygwKTsKKyAgICAgICAgICAgICAgICBtUGxheWVyLT5yZXdpbmQoKTsKICAgICAgICAgICAgICAgICBtQXRFT1MgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBtUG9zaXRpb25VcyA9IC0xOwogICAgICAgICAgICAgfQpAQCAtMzIwLDM0ICszMTksNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpzdG9wKCkgewotICAgIEFMT0dEKCJzdG9wKCVwKSIsIHRoaXMpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBzd2l0Y2ggKG1TdGF0ZSkgewotICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6Ci0gICAgICAgICAgICBtUGxheWVyLT5wYXVzZSgpOwotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCi0KLSAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOwotICAgICAgICAgICAgLy9ub3RpZnlMaXN0ZW5lcl9sKE1FRElBMl9TVE9QUEVEKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDoKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkc6Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KIHN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6cGF1c2UoKSB7CiAgICAgQUxPR0QoInBhdXNlKCVwKSIsIHRoaXMpOwogICAgIC8vIFRoZSBOdVBsYXllclJlbmRlcmVyIG1heSBnZXQgZmx1c2hlZCBpZiBwYXVzZSBmb3IgbG9uZyBlbm91Z2gsIGUuZy4gdGhlIHBhdXNlIHRpbWVvdXQgdGVhcgpAQCAtMzYxLDkgKzMzMiw5IEBACiAKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKLSAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKICAgICAgICAgICAgIHJldHVybiBPSzsKIAorICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgogICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6CiAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7CiAgICAgICAgICAgICBtUGxheWVyLT5wYXVzZSgpOwpAQCAtMzg2LDE1ICszNTcsNiBAQAogICAgICAgICAvLyB0cnkgdG8gdXBkYXRlIHBvc2l0aW9uCiAgICAgICAgIGludDY0X3QgdW51c2VkOwogICAgICAgICBnZXRDdXJyZW50UG9zaXRpb24oJnVudXNlZCk7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChyYXRlLm1TcGVlZCA9PSAwLmYgJiYgbVN0YXRlID09IFNUQVRFX1JVTk5JTkcpIHsKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKLSAgICAgICAgfSBlbHNlIGlmIChyYXRlLm1TcGVlZCAhPSAwLmYKLSAgICAgICAgICAgICAgICAmJiAobVN0YXRlID09IFNUQVRFX1BBVVNFRAotICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQKLSAgICAgICAgICAgICAgICAgICAgfHwgbVN0YXRlID09IFNUQVRFX1BSRVBBUkVEKSkgewotICAgICAgICAgICAgZXJyID0gc3RhcnRfbCgpOwotICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBlcnI7CiB9CkBAIC00MTksNyArMzgxLDYgQEAKIAogICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6CiAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgogICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6CiAgICAgICAgIHsKQEAgLTQ5NywxNSArNDU4LDE1IEBACiAKICAgICAgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJWTWltZSwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtTWV0cmljc0hhbmRsZSwga1BsYXllclZNaW1lLCBtaW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIGlmICghbmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJWQ29kZWMsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyVkNvZGVjLCBuYW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChzdGF0cy0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICYmIHN0YXRzLT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyV2lkdGgsIHdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJIZWlnaHQsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga1BsYXllcldpZHRoLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga1BsYXllckhlaWdodCwgaGVpZ2h0KTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpbnQ2NF90IG51bUZyYW1lc1RvdGFsID0gMDsKQEAgLTUxMywxNCArNDc0LDE4IEBACiAgICAgICAgICAgICAgICAgc3RhdHMtPmZpbmRJbnQ2NCgiZnJhbWVzLXRvdGFsIiwgJm51bUZyYW1lc1RvdGFsKTsKICAgICAgICAgICAgICAgICBzdGF0cy0+ZmluZEludDY0KCJmcmFtZXMtZHJvcHBlZC1vdXRwdXQiLCAmbnVtRnJhbWVzRHJvcHBlZCk7CiAKLSAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllckZyYW1lcywgbnVtRnJhbWVzVG90YWwpOwotICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyRnJhbWVzRHJvcHBlZCwgbnVtRnJhbWVzRHJvcHBlZCk7CisgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyRnJhbWVzLCBudW1GcmFtZXNUb3RhbCk7CisgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyRnJhbWVzRHJvcHBlZCwgbnVtRnJhbWVzRHJvcHBlZCk7CiAKKyAgICAgICAgICAgICAgICBmbG9hdCBmcmFtZVJhdGUgPSAwOworICAgICAgICAgICAgICAgIGlmIChzdGF0cy0+ZmluZEZsb2F0KCJmcmFtZS1yYXRlLW91dHB1dCIsICZmcmFtZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQ2NChtTWV0cmljc0hhbmRsZSwga1BsYXllckZyYW1lUmF0ZSwgZnJhbWVSYXRlKTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIH0gZWxzZSBpZiAobWltZS5zdGFydHNXaXRoKCJhdWRpby8iKSkgewotICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJBTWltZSwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtTWV0cmljc0hhbmRsZSwga1BsYXllckFNaW1lLCBtaW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIGlmICghbmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJBQ29kZWMsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyQUNvZGVjLCBuYW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTMxLDE3ICs0OTYsMTcgQEAKICAgICAvLyBnZXREdXJhdGlvbigpIHVzZXMgbUxvY2sgZm9yIG11dGV4IC0tIGNhcmVmdWwgd2hlcmUgd2UgdXNlIGl0LgogICAgIGludDY0X3QgZHVyYXRpb25fbXMgPSAtMTsKICAgICBnZXREdXJhdGlvbigmZHVyYXRpb25fbXMpOwotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyRHVyYXRpb24sIGR1cmF0aW9uX21zKTsKKyAgICBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJEdXJhdGlvbiwgZHVyYXRpb25fbXMpOwogCi0gICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJQbGF5aW5nLCAobVBsYXlpbmdUaW1lVXMrNTAwKS8xMDAwICk7CisgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyUGxheWluZywgKG1QbGF5aW5nVGltZVVzKzUwMCkvMTAwMCApOwogCiAgICAgaWYgKG1SZWJ1ZmZlcmluZ0V2ZW50cyAhPSAwKSB7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyUmVidWZmZXJpbmcsIChtUmVidWZmZXJpbmdUaW1lVXMrNTAwKS8xMDAwICk7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyUmVidWZmZXJpbmdDb3VudCwgbVJlYnVmZmVyaW5nRXZlbnRzKTsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJSZWJ1ZmZlcmluZ0F0RXhpdCwgbVJlYnVmZmVyaW5nQXRFeGl0KTsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyUmVidWZmZXJpbmcsIChtUmVidWZmZXJpbmdUaW1lVXMrNTAwKS8xMDAwICk7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga1BsYXllclJlYnVmZmVyaW5nQ291bnQsIG1SZWJ1ZmZlcmluZ0V2ZW50cyk7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga1BsYXllclJlYnVmZmVyaW5nQXRFeGl0LCBtUmVidWZmZXJpbmdBdEV4aXQpOwogICAgIH0KIAotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJEYXRhU291cmNlVHlwZSwgbVBsYXllci0+Z2V0RGF0YVNvdXJjZVR5cGUoKSk7CisgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJEYXRhU291cmNlVHlwZSwgbVBsYXllci0+Z2V0RGF0YVNvdXJjZVR5cGUoKSk7CiB9CiAKIApAQCAtNTUxLDcgKzUxNiw3IEBACiAgICAgfQogICAgIEFMT0dWKCJsb2dNZXRyaWNzKCVwKSBmcm9tICVzIGF0IHN0YXRlICVkIiwgdGhpcywgd2hlcmUsIG1TdGF0ZSk7CiAKLSAgICBpZiAobUFuYWx5dGljc0l0ZW0gPT0gTlVMTCB8fCBtQW5hbHl0aWNzSXRlbS0+aXNFbmFibGVkKCkgPT0gZmFsc2UpIHsKKyAgICBpZiAobU1ldHJpY3NIYW5kbGUgPT0gMCB8fCBtZWRpYW1ldHJpY3NfaXNFbmFibGVkKCkgPT0gZmFsc2UpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNTYwLDE2ICs1MjUsMTMgQEAKICAgICAvLyBhbmQgdGhhdCBhbHdheXMgaW5qZWN0cyAzIGZpZWxkcyAoZHVyYXRpb24sIHBsYXlpbmcgdGltZSwgYW5kCiAgICAgLy8gZGF0YXNvdXJjZSkgaW50byB0aGUgcmVjb3JkLgogICAgIC8vIFNvIHRoZSBjYW5vbmljYWwgImVtcHR5IiByZWNvcmQgaGFzIDMgZWxlbWVudHMgaW4gaXQuCi0gICAgaWYgKG1BbmFseXRpY3NJdGVtLT5jb3VudCgpID4gMykgewotCi0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZWxmcmVjb3JkKCk7Ci0KKyAgICBpZiAobWVkaWFtZXRyaWNzX2NvdW50KG1NZXRyaWNzSGFuZGxlKSA+IDMpIHsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NlbGZSZWNvcmQobU1ldHJpY3NIYW5kbGUpOwogICAgICAgICAvLyByZS1pbml0IGluIGNhc2Ugd2UgcHJlcGFyZSgpIGFuZCBzdGFydCgpIGFnYWluLgotICAgICAgICBkZWxldGUgbUFuYWx5dGljc0l0ZW0gOwotICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0tleVBsYXllcik7Ci0gICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbSkgewotICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldFVpZChtQ2xpZW50VWlkKTsKLSAgICAgICAgfQorICAgICAgICBtZWRpYW1ldHJpY3NfZGVsZXRlKG1NZXRyaWNzSGFuZGxlKTsKKyAgICAgICAgbU1ldHJpY3NIYW5kbGUgPSBtZWRpYW1ldHJpY3NfY3JlYXRlKGtLZXlQbGF5ZXIpOworICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0VWlkKG1NZXRyaWNzSGFuZGxlLCBtQ2xpZW50VWlkKTsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyVmVyc2lvbiwgbVBsYXllclZlcnNpb24pOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCJkaWQgbm90IGhhdmUgYW55dGhpbmcgdG8gcmVjb3JkIik7CiAgICAgfQpAQCAtNjAxLDEwICs1NjMsNiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9TVE9QUEVEKSB7Ci0gICAgICAgIC8vIG5vdGlmeUxpc3RlbmVyX2woTUVESUEyX1NUT1BQRUQpOwotICAgIH0KLQogICAgIG1TdGF0ZSA9IFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTOwogICAgIG1QbGF5ZXItPnJlc2V0QXN5bmMoKTsKIApAQCAtNjMzLDUwICs1OTEsNTEgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6aW52b2tlKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCwgUGFyY2VsICpyZXBseSkgewotICAgIGlmIChyZXBseSA9PSBOVUxMKSB7CitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6Omludm9rZShjb25zdCBQbGF5ZXJNZXNzYWdlICZyZXF1ZXN0LCBQbGF5ZXJNZXNzYWdlICpyZXNwb25zZSkgeworICAgIGlmIChyZXNwb25zZSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJyZXBseSBpcyBhIE5VTEwgcG9pbnRlciIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGludDMyX3QgbWV0aG9kSWQ7Ci0gICAgc3RhdHVzX3QgcmV0ID0gcmVxdWVzdC5yZWFkSW50MzIoJm1ldGhvZElkKTsKLSAgICBpZiAocmV0ICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgdGhlIHJlcXVlc3RlZCBtZXRob2QgdG8gaW52b2tlLCBlcnIoJWQpIiwgcmV0KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9CisgICAgUmVwZWF0ZWRQdHJGaWVsZDxjb25zdCBWYWx1ZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcmVxdWVzdC52YWx1ZXMoKS5jYmVnaW4oKTsKKyAgICBpbnQzMl90IG1ldGhvZElkID0gKGl0KyspLT5pbnQzMl92YWx1ZSgpOwogCiAgICAgc3dpdGNoIChtZXRob2RJZCkgewogICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1NFVF9WSURFT19TQ0FMSU5HX01PREU6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBtb2RlID0gcmVxdWVzdC5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBtb2RlID0gKGl0KyspLT5pbnQzMl92YWx1ZSgpOwogICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNldFZpZGVvU2NhbGluZ01vZGUobW9kZSk7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX0dFVF9UUkFDS19JTkZPOgogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXllci0+Z2V0VHJhY2tJbmZvKHJlcGx5KTsKKyAgICAgICAgICAgIGludDY0X3Qgc3JjSWQgPSAoaXQrKyktPmludDY0X3ZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gbVBsYXllci0+Z2V0VHJhY2tJbmZvKHNyY0lkLCByZXNwb25zZSk7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1NFTEVDVF9UUkFDSzoKICAgICAgICAgewotICAgICAgICAgICAgaW50IHRyYWNrSW5kZXggPSByZXF1ZXN0LnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50NjRfdCBzcmNJZCA9IChpdCsrKS0+aW50NjRfdmFsdWUoKTsKKyAgICAgICAgICAgIGludCB0cmFja0luZGV4ID0gKGl0KyspLT5pbnQzMl92YWx1ZSgpOwogICAgICAgICAgICAgaW50NjRfdCBtc2VjID0gMDsKICAgICAgICAgICAgIC8vIGdldEN1cnJlbnRQb3NpdGlvbiBzaG91bGQgYWx3YXlzIHJldHVybiBPSwogICAgICAgICAgICAgZ2V0Q3VycmVudFBvc2l0aW9uKCZtc2VjKTsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCB0cnVlIC8qIHNlbGVjdCAqLywgbXNlYyAqIDEwMDBMTCk7CisgICAgICAgICAgICByZXR1cm4gbVBsYXllci0+c2VsZWN0VHJhY2soc3JjSWQsIHRyYWNrSW5kZXgsIHRydWUgLyogc2VsZWN0ICovLCBtc2VjICogMTAwMExMKTsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfVU5TRUxFQ1RfVFJBQ0s6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCB0cmFja0luZGV4ID0gcmVxdWVzdC5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBmYWxzZSAvKiBzZWxlY3QgKi8sIDB4ZGVhZGJlZWYgLyogbm90IHVzZWQgKi8pOworICAgICAgICAgICAgaW50NjRfdCBzcmNJZCA9IChpdCsrKS0+aW50NjRfdmFsdWUoKTsKKyAgICAgICAgICAgIGludCB0cmFja0luZGV4ID0gKGl0KyspLT5pbnQzMl92YWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNlbGVjdFRyYWNrKAorICAgICAgICAgICAgICAgICAgICBzcmNJZCwgdHJhY2tJbmRleCwgZmFsc2UgLyogc2VsZWN0ICovLCAweGRlYWRiZWVmIC8qIG5vdCB1c2VkICovKTsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfR0VUX1NFTEVDVEVEX1RSQUNLOgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHR5cGUgPSByZXF1ZXN0LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPmdldFNlbGVjdGVkVHJhY2sodHlwZSwgcmVwbHkpOworICAgICAgICAgICAgaW50NjRfdCBzcmNJZCA9IChpdCsrKS0+aW50NjRfdmFsdWUoKTsKKyAgICAgICAgICAgIGludDMyX3QgdHlwZSA9IChpdCsrKS0+aW50MzJfdmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5nZXRTZWxlY3RlZFRyYWNrKHNyY0lkLCB0eXBlLCByZXNwb25zZSk7CiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgpAQCAtNjk2LDQ0ICs2NTUsMTYgQEAKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIHsKLQotICAgIGlmIChrZXkgPT0gRk9VUkNDKCdtJywndCcsJ3InLCdYJykpIHsKLSAgICAgICAgLy8gbXRyWCAtLSBhIHBsYXkgb24gJ21ldHJpY3MnIChub3QgbWF0cml4KQotICAgICAgICAvLyBnYXRoZXIgY3VycmVudCBpbmZvIGFsbCB0b2dldGhlciwgcGFyY2VsIGl0LCBhbmQgc2VuZCBpdCBiYWNrCi0gICAgICAgIHVwZGF0ZU1ldHJpY3MoImFwaSIpOwotICAgICAgICBtQW5hbHl0aWNzSXRlbS0+d3JpdGVUb1BhcmNlbChyZXBseSk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0UGFyYW1ldGVyKGludCBrZXkgX191bnVzZWQsIFBhcmNlbCAqcmVwbHkgX191bnVzZWQpIHsKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0TWV0YWRhdGEoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiAvKiBpZHMgKi8sIFBhcmNlbCAqcmVjb3JkcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICB1c2luZyBtZWRpYTo6TWV0YWRhdGE7Ci0KLSAgICBNZXRhZGF0YSBtZXRhKHJlY29yZHMpOwotCi0gICAgbWV0YS5hcHBlbmRCb29sKAotICAgICAgICAgICAgTWV0YWRhdGE6OmtQYXVzZUF2YWlsYWJsZSwKLSAgICAgICAgICAgIG1QbGF5ZXJGbGFncyAmIE51UGxheWVyMjo6U291cmNlOjpGTEFHX0NBTl9QQVVTRSk7Ci0KLSAgICBtZXRhLmFwcGVuZEJvb2woCi0gICAgICAgICAgICBNZXRhZGF0YTo6a1NlZWtCYWNrd2FyZEF2YWlsYWJsZSwKLSAgICAgICAgICAgIG1QbGF5ZXJGbGFncyAmIE51UGxheWVyMjo6U291cmNlOjpGTEFHX0NBTl9TRUVLX0JBQ0tXQVJEKTsKLQotICAgIG1ldGEuYXBwZW5kQm9vbCgKLSAgICAgICAgICAgIE1ldGFkYXRhOjprU2Vla0ZvcndhcmRBdmFpbGFibGUsCi0gICAgICAgICAgICBtUGxheWVyRmxhZ3MgJiBOdVBsYXllcjI6OlNvdXJjZTo6RkxBR19DQU5fU0VFS19GT1JXQVJEKTsKLQotICAgIG1ldGEuYXBwZW5kQm9vbCgKLSAgICAgICAgICAgIE1ldGFkYXRhOjprU2Vla0F2YWlsYWJsZSwKLSAgICAgICAgICAgIG1QbGF5ZXJGbGFncyAmIE51UGxheWVyMjo6U291cmNlOjpGTEFHX0NBTl9TRUVLKTsKLQotICAgIHJldHVybiBPSzsKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0TWV0cmljcyhjaGFyICoqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCkgeworICAgIHVwZGF0ZU1ldHJpY3MoImFwaSIpOworICAgIGlmIChtZWRpYW1ldHJpY3NfZ2V0QXR0cmlidXRlcyhtTWV0cmljc0hhbmRsZSwgYnVmZmVyLCBsZW5ndGgpKQorICAgICAgICByZXR1cm4gT0s7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFJTEVEX1RSQU5TQUNUSU9OOwogfQogCiB2b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5UmVzZXRDb21wbGV0ZShpbnQ2NF90IC8qIHNyY0lkICovKSB7CkBAIC03ODAsMjAgKzcxMSw3IEBACiAgICAgQUxPR1YoIm5vdGlmeVNlZWtDb21wbGV0ZSglcCkiLCB0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIG1TZWVrSW5Qcm9ncmVzcyA9IGZhbHNlOwotICAgIG5vdGlmeVNlZWtDb21wbGV0ZV9sKHNyY0lkKTsKLX0KLQotdm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeVNlZWtDb21wbGV0ZV9sKGludDY0X3Qgc3JjSWQpIHsKLSAgICBib29sIHdhc1NlZWtpbmcgPSB0cnVlOwotICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HKSB7Ci0gICAgICAgIHdhc1NlZWtpbmcgPSBmYWxzZTsKLSAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ7Ci0gICAgICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7Ci0gICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAvLyBubyBuZWVkIHRvIG5vdGlmeSBsaXN0ZW5lcgotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG5vdGlmeUxpc3RlbmVyX2woc3JjSWQsIHdhc1NlZWtpbmcgPyBNRURJQTJfU0VFS19DT01QTEVURSA6IE1FRElBMl9QUkVQQVJFRCk7CisgICAgbm90aWZ5TGlzdGVuZXJfbChzcmNJZCwgTUVESUEyX1NFRUtfQ09NUExFVEUpOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmR1bXAoCkBAIC04ODQsMTIgKzgwMiwxMiBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIm1lc3NhZ2VJZCIsICZtc2dJZCkpOwogICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoImV4dDEiLCAmZXh0MSk7CiAgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigiZXh0MiIsICZleHQyKTsKLSAgICAgICAgICAgIHNwPFBhcmNlbFdyYXBwZXI+IGluOworICAgICAgICAgICAgc3A8UGxheWVyTWVzc2FnZVdyYXBwZXI+IGluOwogICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwotICAgICAgICAgICAgaWYgKG1zZy0+ZmluZE9iamVjdCgicGFyY2VsIiwgJm9iaikgJiYgb2JqICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpbiA9IHN0YXRpY19jYXN0PFBhcmNlbFdyYXBwZXIgKj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRPYmplY3QoIm9iaiIsICZvYmopICYmIG9iaiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW4gPSBzdGF0aWNfY2FzdDxQbGF5ZXJNZXNzYWdlV3JhcHBlciAqPihvYmouZ2V0KCkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VuZEV2ZW50KHNyY0lkLCBtc2dJZCwgZXh0MSwgZXh0MiwgKGluID09IE5VTEwgPyBOVUxMIDogaW4tPmdldFBhcmNlbCgpKSk7CisgICAgICAgICAgICBzZW5kRXZlbnQoc3JjSWQsIG1zZ0lkLCBleHQxLCBleHQyLCAoaW4gPT0gTlVMTCA/IE5VTEwgOiBpbi0+Z2V0UGxheWVyTWVzc2FnZSgpKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgpAQCAtODk4LDE2ICs4MTYsMTYgQEAKIH0KIAogdm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeUxpc3RlbmVyKAotICAgICAgICBpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKKyAgICAgICAgaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQbGF5ZXJNZXNzYWdlICppbikgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgbm90aWZ5TGlzdGVuZXJfbChzcmNJZCwgbXNnLCBleHQxLCBleHQyLCBpbik7CiB9CiAKIHZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlMaXN0ZW5lcl9sKAotICAgICAgICBpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKKyAgICAgICAgaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQbGF5ZXJNZXNzYWdlICppbikgewogICAgIEFMT0dEKCJub3RpZnlMaXN0ZW5lcl9sKCVwKSwgKCVsbGQsICVkLCAlZCwgJWQsICVkKSwgbG9vcCBzZXR0aW5nKCVkLCAlZCkiLAogICAgICAgICAgICAgdGhpcywgKGxvbmcgbG9uZylzcmNJZCwgbXNnLCBleHQxLCBleHQyLAotICAgICAgICAgICAgKGluID09IE5VTEwgPyAtMSA6IChpbnQpaW4tPmRhdGFTaXplKCkpLCBtQXV0b0xvb3AsIG1Mb29waW5nKTsKKyAgICAgICAgICAgIChpbiA9PSBOVUxMID8gLTEgOiAoaW50KWluLT5CeXRlU2l6ZSgpKSwgbUF1dG9Mb29wLCBtTG9vcGluZyk7CiAgICAgaWYgKHNyY0lkID09IG1TcmNJZCkgewogICAgICAgICBzd2l0Y2ggKG1zZykgewogICAgICAgICAgICAgY2FzZSBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEU6CkBAIC05MjQsMTMgKzg0MiwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChtTG9vcGluZyB8fCBtQXV0b0xvb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKDApOworICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXllci0+cmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlbmRlcmVyIGhhcyBzdG9wcGVkIHRoZSBzaW5rIGF0IHRoZSBlbmQgaW4gb3JkZXIgdG8gcGxheSBvdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbGFzdCBsaXR0bGUgYml0IG9mIGF1ZGlvLiBJbiBsb29waW5nIG1vZGUsIHdlIG5lZWQgdG8gcmVzdGFydCBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qgc2VuZCBjb21wbGV0aW9uIGV2ZW50IHdoZW4gbG9vcGluZworCisgICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Tm90aWZ5TGlzdGVuZXIsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQ2NCgic3JjSWQiLCBzcmNJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJtZXNzYWdlSWQiLCBNRURJQTJfSU5GTyk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJleHQxIiwgTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfUkVQRUFUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5kZWJ1Zy5zZi5zdGF0cyIsIGZhbHNlKSkgewpAQCAtOTQ5LDExICs4NzIsMTEgQEAKICAgICAgICAgICAgICAgICAvLyBleHQxIGlzIG91ciBwcmltYXJ5ICdlcnJvciB0eXBlJyB2YWx1ZS4gT25seSBhZGQgZXh0MiB3aGVuIG5vbi16ZXJvLgogICAgICAgICAgICAgICAgIC8vIFt0ZXN0IGFnYWluc3QgbXNnIGlzIGR1ZSB0byBmYWxsIHRocm91Z2ggZnJvbSBwcmV2aW91cyBzd2l0Y2ggdmFsdWVdCiAgICAgICAgICAgICAgICAgaWYgKG1zZyA9PSBNRURJQTJfRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJFcnJvciwgZXh0MSk7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga1BsYXllckVycm9yLCBleHQxKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dDIgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJFcnJvckNvZGUsIGV4dDIpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyRXJyb3JDb2RlLCBleHQyKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyRXJyb3JTdGF0ZSwgc3RhdGVTdHJpbmcobVN0YXRlKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJFcnJvclN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtQXRFT1MgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtOTY5LDcgKzg5Miw3IEBACiAgICAgbm90aWZ5LT5zZXRJbnQzMigibWVzc2FnZUlkIiwgbXNnKTsKICAgICBub3RpZnktPnNldEludDMyKCJleHQxIiwgZXh0MSk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigiZXh0MiIsIGV4dDIpOwotICAgIG5vdGlmeS0+c2V0T2JqZWN0KCJwYXJjZWwiLCBQYXJjZWxXcmFwcGVyOjpDcmVhdGUoaW4pKTsKKyAgICBub3RpZnktPnNldE9iamVjdCgib2JqIiwgUGxheWVyTWVzc2FnZVdyYXBwZXI6OkNyZWF0ZSgoUGxheWVyTWVzc2FnZSopaW4pKTsKICAgICBub3RpZnktPnBvc3QoKTsKIH0KIApAQCAtMTAzNiwyNCArOTU5LDI1IEBACiB9CiAKIC8vIE1vZHVsYXIgRFJNCi1zdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnByZXBhcmVEcm0oCisgICAgICAgIGludDY0X3Qgc3JjSWQsIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKQogewogICAgIEFMT0dWKCJwcmVwYXJlRHJtKCVwKSBzdGF0ZTogJWQiLCB0aGlzLCBtU3RhdGUpOwogCiAgICAgLy8gbGVhdmluZyB0aGUgc3RhdGUgdmVyaWZpY2F0aW9uIGZvciBtZWRpYXBsYXllci5jcHAKLSAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5wcmVwYXJlRHJtKHV1aWQsIGRybVNlc3Npb25JZCk7CisgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+cHJlcGFyZURybShzcmNJZCwgdXVpZCwgZHJtU2Vzc2lvbklkKTsKIAogICAgIEFMT0dWKCJwcmVwYXJlRHJtIHJldDogJWQiLCByZXQpOwogCiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpyZWxlYXNlRHJtKCkKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6cmVsZWFzZURybShpbnQ2NF90IHNyY0lkKQogewogICAgIEFMT0dWKCJyZWxlYXNlRHJtKCVwKSBzdGF0ZTogJWQiLCB0aGlzLCBtU3RhdGUpOwogCiAgICAgLy8gbGVhdmluZyB0aGUgc3RhdGUgdmVyaWZpY2F0aW9uIGZvciBtZWRpYXBsYXllci5jcHAKLSAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5yZWxlYXNlRHJtKCk7CisgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+cmVsZWFzZURybShzcmNJZCk7CiAKICAgICBBTE9HVigicmVsZWFzZURybSByZXQ6ICVkIiwgcmV0KTsKIApAQCAtMTA3Myw5ICs5OTcsNiBAQAogICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6IHJ2YWwgPSAiUlVOTklORyI7IGJyZWFrOwogICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDogcnZhbCA9ICJQQVVTRUQiOyBicmVhazsKICAgICAgICAgY2FzZSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUzogcnZhbCA9ICJSRVNFVF9JTl9QUk9HUkVTUyI7IGJyZWFrOwotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6IHJ2YWwgPSAiU1RPUFBFRCI7IGJyZWFrOwotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORzogcnZhbCA9ICJTVE9QUEVEX0FORF9QUkVQQVJJTkciOyBicmVhazsKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDogcnZhbCA9ICJTVE9QUEVEX0FORF9QUkVQQVJFRCI7IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgLy8geWVzLCB0aGlzIGJ1ZmZlciBpcyBzaGFyZWQgYW5kIHZ1bG5lcmFibGUgdG8gcmFjZXMKICAgICAgICAgICAgIHNucHJpbnRmKHJhd2J1ZmZlciwgc2l6ZW9mKHJhd2J1ZmZlciksICIlZCIsIHN0YXRlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5oCmluZGV4IDRkYTI1NjYuLmM5N2UyNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuaApAQCAtMTYsOCArMTYsOSBAQAogCiAjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oPgogCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMjYsNyArMjcsNyBAQAogc3RydWN0IE51UGxheWVyMjsKIAogc3RydWN0IE51UGxheWVyMkRyaXZlciA6IHB1YmxpYyBNZWRpYVBsYXllcjJJbnRlcmZhY2UgewotICAgIGV4cGxpY2l0IE51UGxheWVyMkRyaXZlcihwaWRfdCBwaWQsIHVpZF90IHVpZCk7CisgICAgZXhwbGljaXQgTnVQbGF5ZXIyRHJpdmVyKHBpZF90IHBpZCwgdWlkX3QgdWlkLCBjb25zdCBzcDxKT2JqZWN0SG9sZGVyPiAmY29udGV4dCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIG92ZXJyaWRlOwogCkBAIC00MCwzMSArNDEsMjkgQEAKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUFzeW5jKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKLSAgICB2aXJ0dWFsIGJvb2wgaXNQbGF5aW5nKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jLCBmbG9hdCAqdmlkZW9GcHMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUFzeW5jKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNQbGF5aW5nKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jLCBmbG9hdCAqdmlkZW9GcHMpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKAotICAgICAgICAgICAgaW50NjRfdCBtc2VjLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICptc2VjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc2V0KCk7CisgICAgICAgICAgICBpbnQ2NF90IG1zZWMsCisgICAgICAgICAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbXNlYykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICptc2VjKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc2V0KCkgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvb3BpbmcoaW50IGxvb3ApOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52b2tlKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCwgUGFyY2VsICpyZXBseSk7Ci0gICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvU2luayhjb25zdCBzcDxBdWRpb1Npbms+ICZhdWRpb1NpbmspOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMb29waW5nKGludCBsb29wKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGludm9rZShjb25zdCBQbGF5ZXJNZXNzYWdlICZyZXF1ZXN0LCBQbGF5ZXJNZXNzYWdlICpyZXNwb25zZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvU2luayhjb25zdCBzcDxBdWRpb1Npbms+ICZhdWRpb1NpbmspIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRyaWNzKGNoYXIgKipidWYsIHNpemVfdCAqbGVuZ3RoKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YWRhdGEoCi0gICAgICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgaWRzLCBQYXJjZWwgKnJlY29yZHMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3Qgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOwogCkBAIC03NywxNCArNzYsMTQgQEAKICAgICB2b2lkIG5vdGlmeU1vcmVSZWJ1ZmZlcmluZ1RpbWVVcyhpbnQ2NF90IHNyY0lkLCBpbnQ2NF90IHRpbWVVcyk7CiAgICAgdm9pZCBub3RpZnlSZWJ1ZmZlcmluZ1doZW5FeGl0KGludDY0X3Qgc3JjSWQsIGJvb2wgc3RhdHVzKTsKICAgICB2b2lkIG5vdGlmeVNlZWtDb21wbGV0ZShpbnQ2NF90IHNyY0lkKTsKLSAgICB2b2lkIG5vdGlmeVNlZWtDb21wbGV0ZV9sKGludDY0X3Qgc3JjSWQpOwogICAgIHZvaWQgbm90aWZ5TGlzdGVuZXIoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEgPSAwLCBpbnQgZXh0MiA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwgKmluID0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF5ZXJNZXNzYWdlICppbiA9IE5VTEwpOwogICAgIHZvaWQgbm90aWZ5RmxhZ3NDaGFuZ2VkKGludDY0X3Qgc3JjSWQsIHVpbnQzMl90IGZsYWdzKTsKIAogICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VEcm0oKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVEcm0oCisgICAgICAgICAgICBpbnQ2NF90IHNyY0lkLCBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlRHJtKGludDY0X3Qgc3JjSWQpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TnVQbGF5ZXIyRHJpdmVyKCk7CkBAIC05OSw5ICs5OCw2IEBACiAgICAgICAgIFNUQVRFX1JVTk5JTkcsCiAgICAgICAgIFNUQVRFX1BBVVNFRCwKICAgICAgICAgU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1MsCi0gICAgICAgIFNUQVRFX1NUT1BQRUQsICAgICAgICAgICAgICAgICAgLy8gZXF1aXZhbGVudCB0byBQQVVTRUQKLSAgICAgICAgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HLCAgICAvLyBlcXVpdmFsZW50IHRvIFBBVVNFRCwgYnV0IHNlZWtpbmcKLSAgICAgICAgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQsICAgICAvLyBlcXVpdmFsZW50IHRvIFBBVVNFRCwgYnV0IHNlZWsgY29tcGxldGUKICAgICB9OwogCiAgICAgc3RkOjpzdHJpbmcgc3RhdGVTdHJpbmcoU3RhdGUgc3RhdGUpOwpAQCAtMTM3LDcgKzEzMyw4IEBACiAgICAgc3A8QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwogICAgIHVpbnQzMl90IG1QbGF5ZXJGbGFnczsKIAotICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqbUFuYWx5dGljc0l0ZW07CisgICAgbWVkaWFtZXRyaWNzX2hhbmRsZV90IG1NZXRyaWNzSGFuZGxlOworICAgIGludDY0X3QgbVBsYXllclZlcnNpb247CiAgICAgdWlkX3QgbUNsaWVudFVpZDsKIAogICAgIGJvb2wgbUF0RU9TOwpAQCAtMTQ5LDcgKzE0Niw3IEBACiAKICAgICBzdGF0dXNfdCBzdGFydF9sKCk7CiAgICAgdm9pZCBub3RpZnlMaXN0ZW5lcl9sKGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxID0gMCwgaW50IGV4dDIgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwgKmluID0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsYXllck1lc3NhZ2UgKmluID0gTlVMTCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOdVBsYXllcjJEcml2ZXIpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmNwcAppbmRleCAwZTA5NmIwLi5mNDFhNDMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uY3BwCkBAIC0xMzMsOSArMTMzLDggQEAKICAgICByZXR1cm4gZHJtSW5mb0J1ZmZlcjsKIH0KIAotc3A8QUJ1ZmZlcj4gTnVQbGF5ZXIyRHJtOjpyZXRyaWV2ZURybUluZm8oUHNzaEluZm8gKnBzc2hJbmZvKQorc3RhdHVzX3QgTnVQbGF5ZXIyRHJtOjpyZXRyaWV2ZURybUluZm8oUHNzaEluZm8gKnBzc2hJbmZvLCBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpCiB7Ci0KICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gcHNzaCwgZHJtSW5mbzsKIAogICAgIC8vIDApIEdlbmVyYXRlIFBTU0ggYnl0ZXMKQEAgLTE1NCwyMiArMTUzLDIwIEBACiAgICAgICAgICAgICBEcm1VVUlEOjphcnJheVRvSGV4KHBzc2hQdHIsIHBzc2hTaXplKS5zdHJpbmcoKSk7CiAKICAgICAvLyAxKSBXcml0ZSBQU1NIIGJ5dGVzCi0gICAgZHJtSW5mby53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oJnBzc2hTaXplKSwgc2l6ZW9mKHBzc2hTaXplKSk7Ci0gICAgZHJtSW5mby53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4ocHNzaC5zdHIoKS5jX3N0cigpKSwgcHNzaFNpemUpOworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfYnl0ZXNfdmFsdWUoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4ocHNzaC5zdHIoKS5jX3N0cigpKSwgcHNzaFNpemUpOwogCiAgICAgLy8gMikgV3JpdGUgc3VwcG9ydGVkRFJNcwogICAgIHVpbnQzMl90IG51bWVudHJpZXMgPSBwc3NoSW5mby0+bnVtZW50cmllczsKLSAgICBkcm1JbmZvLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigmbnVtZW50cmllcyksIHNpemVvZihudW1lbnRyaWVzKSk7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShudW1lbnRyaWVzKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWVudHJpZXM7IGkrKykgewogICAgICAgICBQc3NoRW50cnkgKmVudHJ5ID0gJnBzc2hJbmZvLT5lbnRyaWVzW2ldOwotICAgICAgICBkcm1JbmZvLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigmZW50cnktPnV1aWQpLCBzaXplb2YoZW50cnktPnV1aWQpKTsKKyAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9ieXRlc192YWx1ZSgKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oJmVudHJ5LT51dWlkKSwgc2l6ZW9mKGVudHJ5LT51dWlkKSk7CiAgICAgICAgIEFMT0dWKCJyZXRyaWV2ZURybUluZm86IE1FRElBX0RSTV9JTkZPICBzdXBwb3J0ZWRTY2hlbWVbJXp1XSAlcyIsIGksCiAgICAgICAgICAgICAgICAgRHJtVVVJRDo6YXJyYXlUb0hleCgoY29uc3QgdWludDhfdCopJmVudHJ5LT51dWlkLCBzaXplb2YoQU1lZGlhVVVJRCkpLnN0cmluZygpKTsKICAgICB9Ci0KLSAgICBzcDxBQnVmZmVyPiBkcm1JbmZvQnVmID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGRybUluZm8uc3RyKCkuY19zdHIoKSwgZHJtSW5mby50ZWxscCgpKTsKLSAgICBkcm1JbmZvQnVmLT5zZXRSYW5nZSgwLCBkcm1JbmZvLnRlbGxwKCkpOwotICAgIHJldHVybiBkcm1JbmZvQnVmOworICAgIHJldHVybiBPSzsKIH0KIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uaAppbmRleCA5OWQyNDE1Li45NjhkMWJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmgKQEAgLTIzLDYgKzIzLDEwIEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCisjaW5jbHVkZSAibWVkaWFwbGF5ZXIyLnBiLmgiCisKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjpNZWRpYVBsYXllcjJQcm90bzo6UGxheWVyTWVzc2FnZTsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAgICAgc3RydWN0IERybVVVSUQgewpAQCAtODAsNyArODQsNyBAQAogCiAgICAgcHVibGljOgogICAgICAgICBzdGF0aWMgc3A8QUJ1ZmZlcj4gcmV0cmlldmVEcm1JbmZvKGNvbnN0IHZvaWQgKnBzc2gsIHVpbnQzMl90IHBzc2hzaXplKTsKLSAgICAgICAgc3RhdGljIHNwPEFCdWZmZXI+IHJldHJpZXZlRHJtSW5mbyhQc3NoSW5mbyAqKTsKKyAgICAgICAgc3RhdGljIHN0YXR1c190IHJldHJpZXZlRHJtSW5mbyhQc3NoSW5mbyAqLCBQbGF5ZXJNZXNzYWdlICopOwogCiAgICAgfTsgIC8vIE51UGxheWVyMkRybQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuY3BwCmluZGV4IDNkNjkxODguLmE4Yzk5MzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuY3BwCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CkBAIC0xMDYsNiArMTA2LDcgQEAKICAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlOjpBdWRpb1Npbms+ICZzaW5rLAogICAgICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jaywKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgIGNvbnN0IHNwPEpPYmplY3RIb2xkZXI+ICZjb250ZXh0LAogICAgICAgICB1aW50MzJfdCBmbGFncykKICAgICA6IG1BdWRpb1Npbmsoc2luayksCiAgICAgICBtVXNlVmlydHVhbEF1ZGlvU2luayhmYWxzZSksCkBAIC0xMzEsNyArMTMyLDcgQEAKICAgICAgIG1Ob3RpZnlDb21wbGV0ZUF1ZGlvKGZhbHNlKSwKICAgICAgIG1Ob3RpZnlDb21wbGV0ZVZpZGVvKGZhbHNlKSwKICAgICAgIG1TeW5jUXVldWVzKGZhbHNlKSwKLSAgICAgIG1QYXVzZWQoZmFsc2UpLAorICAgICAgbVBhdXNlZCh0cnVlKSwKICAgICAgIG1QYXVzZURyYWluQXVkaW9BbGxvd2VkVXMoMCksCiAgICAgICBtVmlkZW9TYW1wbGVSZWNlaXZlZChmYWxzZSksCiAgICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydGVkKGZhbHNlKSwKQEAgLTE0NywxMCArMTQ4LDkgQEAKICAgICAgIG1Ub3RhbEJ1ZmZlcnNRdWV1ZWQoMCksCiAgICAgICBtTGFzdEF1ZGlvQnVmZmVyRHJhaW5lZCgwKSwKICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrKGZhbHNlKSwKLSAgICAgIG1XYWtlTG9jayhuZXcgSldha2VMb2NrKCkpIHsKKyAgICAgIG1XYWtlTG9jayhuZXcgSldha2VMb2NrKGNvbnRleHQpKSB7CiAgICAgQ0hFQ0sobWVkaWFDbG9jayAhPSBOVUxMKTsKLSAgICBtUGxheWJhY2tSYXRlID0gbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkOwotICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CisgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOwogfQogCiBOdVBsYXllcjI6OlJlbmRlcmVyOjp+UmVuZGVyZXIoKSB7CkBAIC0yMDYsMjYgKzIwNiwyMCBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbkNvbmZpZ1BsYXliYWNrKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlIC8qIHNhbml0aXplZCAqLykgewotICAgIGlmIChyYXRlLm1TcGVlZCA9PSAwLmYpIHsKLSAgICAgICAgb25QYXVzZSgpOwotICAgICAgICAvLyBkb24ndCBjYWxsIGF1ZGlvc2luaydzIHNldFBsYXliYWNrUmF0ZSBpZiBwYXVzaW5nLCBhcyBwaXRjaCBkb2VzIG5vdAotICAgICAgICAvLyBoYXZlIHRvIGNvcnJlc3BvbmQgdG8gdGhlIGFueSBub24tMCBzcGVlZCAoZS5nIG9sZCBzcGVlZCkuIEtlZXAKLSAgICAgICAgLy8gc2V0dGluZ3Mgbm9uZXRoZWxlc3MsIHVzaW5nIHRoZSBvbGQgc3BlZWQsIGluIGNhc2UgYXVkaW9zaW5rIGNoYW5nZXMuCi0gICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIG5ld1JhdGUgPSByYXRlOwotICAgICAgICBuZXdSYXRlLm1TcGVlZCA9IG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZDsKLSAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSBuZXdSYXRlOwotICAgICAgICByZXR1cm4gT0s7CisgICAgaWYgKHJhdGUubVNwZWVkIDw9IDAuZikgeworICAgICAgICBBTE9HVygicGxheWJhY2sgcmF0ZSBjYW5ub3QgYmUgJWYiLCByYXRlLm1TcGVlZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCAmJiBtQXVkaW9TaW5rLT5yZWFkeSgpKSB7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NpbmstPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byBnZXQgcGxheWJhY2sgcmF0ZSBmcm9tIGF1ZGlvIHNpbmssIGVyciglZCkiLCBlcnIpOwogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgIH0KICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IHJhdGU7Ci0gICAgbVBsYXliYWNrUmF0ZSA9IHJhdGUubVNwZWVkOwotICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CisgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjQ3LDE0ICsyNDEsMTIgQEAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvU2luay0+Z2V0UGxheWJhY2tSYXRlKHJhdGUpOwogICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICBpZiAoIWlzQXVkaW9QbGF5YmFja1JhdGVFcXVhbCgqcmF0ZSwgbVBsYXliYWNrU2V0dGluZ3MpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNvcnJlY3RpbmcgbWlzbWF0Y2ggaW4gaW50ZXJuYWwvZXh0ZXJuYWwgcGxheWJhY2sgcmF0ZSIpOworICAgICAgICAgICAgICAgIEFMT0dXKCJjb3JyZWN0aW5nIG1pc21hdGNoIGluIGludGVybmFsL2V4dGVybmFsIHBsYXliYWNrIHJhdGUsICVmIHZzICVmIiwKKyAgICAgICAgICAgICAgICAgICAgICByYXRlLT5tU3BlZWQsIG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBnZXQgcGxheWJhY2sgc2V0dGluZ3MgdXNlZCBieSBhdWRpb3NpbmssIGFzIGl0IG1heSBiZQogICAgICAgICAgICAgLy8gc2xpZ2h0bHkgb2ZmIGR1ZSB0byBhdWRpb3Npbmsgbm90IHRha2luZyBzbWFsbCBjaGFuZ2VzLgogICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSAqcmF0ZTsKLSAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7Ci0gICAgICAgICAgICAgICAgcmF0ZS0+bVNwZWVkID0gMC5mOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQpAQCAtNTc2LDggKzU2OCw4IEBACiAgICAgICAgICAgICAgICAgaW50NjRfdCBkZWxheVVzID0KICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+bXNlY3NQZXJGcmFtZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAqIG51bUZyYW1lc1BlbmRpbmdQbGF5b3V0ICogMTAwMGxsOwotICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tSYXRlID4gMS4wZikgewotICAgICAgICAgICAgICAgICAgICBkZWxheVVzIC89IG1QbGF5YmFja1JhdGU7CisgICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCA+IDEuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsYXlVcyAvPSBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQ7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gTGV0J3MgZ2l2ZSBpdCBtb3JlIGRhdGEgYWZ0ZXIgYWJvdXQgaGFsZiB0aGF0IHRpbWUKQEAgLTE0NjYsNyArMTQ1OCw3IEBACiAKICAgICBpZiAobUhhc1ZpZGVvKSB7CiAgICAgICAgIGlmIChtVmlkZW9TY2hlZHVsZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgbVZpZGVvU2NoZWR1bGVyID0gbmV3IFZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKKyAgICAgICAgICAgIG1WaWRlb1NjaGVkdWxlciA9IG5ldyBWaWRlb0ZyYW1lU2NoZWR1bGVyMigpOwogICAgICAgICAgICAgbVZpZGVvU2NoZWR1bGVyLT5pbml0KCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTk0LDYgKzE1ODYsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbm90aWZ5Q29tcGxldGUgPSBtTm90aWZ5Q29tcGxldGVWaWRlbzsKICAgICAgICAgICAgIG1Ob3RpZnlDb21wbGV0ZVZpZGVvID0gZmFsc2U7CisgICAgICAgICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydGVkID0gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBJZiB3ZSdyZSBjdXJyZW50bHkgc3luY2luZyB0aGUgcXVldWVzLCBpLmUuIGRyb3BwaW5nIGF1ZGlvIHdoaWxlCkBAIC0xNzk0LDcgKzE3ODcsNyBAQAogICAgICAgICAgICAgbUF1ZGlvU2luay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzKTsKICAgICAgICAgfQogCi0gICAgICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CisgICAgICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrU2V0dGluZ3MubVNwZWVkKTsKIAogICAgICAgICBpZiAoIW1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKICAgICAgICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbCgpOwpAQCAtMTgwOCw3ICsxODAxLDcgQEAKIAogdm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvblNldFZpZGVvRnJhbWVSYXRlKGZsb2F0IGZwcykgewogICAgIGlmIChtVmlkZW9TY2hlZHVsZXIgPT0gTlVMTCkgewotICAgICAgICBtVmlkZW9TY2hlZHVsZXIgPSBuZXcgVmlkZW9GcmFtZVNjaGVkdWxlcigpOworICAgICAgICBtVmlkZW9TY2hlZHVsZXIgPSBuZXcgVmlkZW9GcmFtZVNjaGVkdWxlcjIoKTsKICAgICB9CiAgICAgbVZpZGVvU2NoZWR1bGVyLT5pbml0KGZwcyk7CiB9CkBAIC0xODc4LDYgKzE4NzEsNyBAQAogICAgICAgICBib29sIGlzU3RyZWFtaW5nKSB7CiAgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IG9mZmxvYWRPbmx5KCVkKSBvZmZsb2FkaW5nQXVkaW8oJWQpIiwKICAgICAgICAgICAgIG9mZmxvYWRPbmx5LCBvZmZsb2FkaW5nQXVkaW8oKSk7CisKICAgICBib29sIGF1ZGlvU2lua0NoYW5nZWQgPSBmYWxzZTsKIAogICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7CkBAIC0xOTU0LDcgKzE5NDgsNiBAQAogICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgMCAvKiBidWZmZXJDb3VudCAtIHVudXNlZCAqLywKICAgICAgICAgICAgICAgICAgICAgJk51UGxheWVyMjo6UmVuZGVyZXI6OkF1ZGlvU2lua0NhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICB0aGlzLAogICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3Qpb2ZmbG9hZEZsYWdzLApAQCAtMjAyNSwxMyArMjAxOCw2IEBACiAgICAgICAgIGNvbnN0IHVpbnQzMl90IGZyYW1lQ291bnQgPQogICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGdldEF1ZGlvU2lua1BjbU1zU2V0dGluZygpIC8gMTAwMDsKIAotICAgICAgICAvLyBUaGUgZG9Ob3RSZWNvbm5lY3QgbWVhbnMgQXVkaW9TaW5rIHdpbGwgc2lnbmFsIGJhY2sgYW5kIGxldCBOdVBsYXllcjIgdG8gcmUtY29uc3RydWN0Ci0gICAgICAgIC8vIEF1ZGlvU2luay4gV2UgZG9uJ3Qgd2FudCB0aGlzIHdoZW4gdGhlcmUncyB2aWRlbyBiZWNhdXNlIGl0IHdpbGwgY2F1c2UgYSB2aWRlbyBzZWVrIHRvCi0gICAgICAgIC8vIHRoZSBwcmV2aW91cyBJIGZyYW1lLiBCdXQgd2UgZG8gd2FudCB0aGlzIHdoZW4gdGhlcmUncyBvbmx5IGF1ZGlvIGJlY2F1c2UgaXQgd2lsbCBnaXZlCi0gICAgICAgIC8vIE51UGxheWVyMiBhIGNoYW5jZSB0byBzd2l0Y2ggZnJvbSBub24tb2ZmbG9hZCBtb2RlIHRvIG9mZmxvYWQgbW9kZS4KLSAgICAgICAgLy8gU28gd2Ugb25seSBzZXQgZG9Ob3RSZWNvbm5lY3Qgd2hlbiB0aGVyZSdzIG5vIHZpZGVvLgotICAgICAgICBjb25zdCBib29sIGRvTm90UmVjb25uZWN0ID0gIWhhc1ZpZGVvOwotCiAgICAgICAgIC8vIFdlIHNob3VsZCBhbHdheXMgYmUgYWJsZSB0byBzZXQgb3VyIHBsYXliYWNrIHNldHRpbmdzIGlmIHRoZSBzaW5rIGlzIGNsb3NlZC4KICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQXVkaW9TaW5rLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrU2V0dGluZ3MpICE9IE9LLAogICAgICAgICAgICAgICAgICJvbk9wZW5BdWRpb1Npbms6IGNhbid0IHNldCBwbGF5YmFjayByYXRlIG9uIGNsb3NlZCBzaW5rIik7CkBAIC0yMDQwLDEyICsyMDI2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAwIC8qIGJ1ZmZlckNvdW50IC0gdW51c2VkICovLAogICAgICAgICAgICAgICAgICAgICBtVXNlQXVkaW9DYWxsYmFjayA/ICZOdVBsYXllcjI6OlJlbmRlcmVyOjpBdWRpb1NpbmtDYWxsYmFjayA6IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID8gdGhpcyA6IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdClwY21GbGFncywKICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgZG9Ob3RSZWNvbm5lY3QsCiAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HVygib3BlbkF1ZGlvU2luazogbm9uIG9mZmxvYWRlZCBvcGVuIGZhaWxlZCBzdGF0dXM6ICVkIiwgZXJyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuaAppbmRleCA2MmNmMGQ4Li5kMDY1ZGVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5oCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0FWU3luY1NldHRpbmdzLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaD4KIAogI2luY2x1ZGUgIk51UGxheWVyMi5oIgogCkBAIC0yOCw3ICsyOSw3IEBACiBjbGFzcyAgSldha2VMb2NrOwogc3RydWN0IE1lZGlhQ2xvY2s7CiBjbGFzcyBNZWRpYUNvZGVjQnVmZmVyOwotc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXI7CitzdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U7CiAKIHN0cnVjdCBOdVBsYXllcjI6OlJlbmRlcmVyIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBlbnVtIEZsYWdzIHsKQEAgLTM4LDYgKzM5LDcgQEAKICAgICBSZW5kZXJlcihjb25zdCBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luaz4gJnNpbmssCiAgICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2ssCiAgICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCisgICAgICAgICAgICAgY29uc3Qgc3A8Sk9iamVjdEhvbGRlcj4gJmNvbnRleHQsCiAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKIAogICAgIHN0YXRpYyBzaXplX3QgQXVkaW9TaW5rQ2FsbGJhY2soCkBAIC0xNTYsNyArMTU4LDcgQEAKICAgICBMaXN0PFF1ZXVlRW50cnk+IG1BdWRpb1F1ZXVlOwogICAgIExpc3Q8UXVldWVFbnRyeT4gbVZpZGVvUXVldWU7CiAgICAgdWludDMyX3QgbU51bUZyYW1lc1dyaXR0ZW47Ci0gICAgc3A8VmlkZW9GcmFtZVNjaGVkdWxlcj4gbVZpZGVvU2NoZWR1bGVyOworICAgIHNwPFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlPiBtVmlkZW9TY2hlZHVsZXI7CiAKICAgICBib29sIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nOwogICAgIGJvb2wgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmc7CkBAIC0xNjcsNyArMTY5LDYgQEAKICAgICBpbnQzMl90IG1BdWRpb0VPU0dlbmVyYXRpb247CiAKICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiBtTWVkaWFDbG9jazsKLSAgICBmbG9hdCBtUGxheWJhY2tSYXRlOyAvLyBhdWRpbyB0cmFjayByYXRlCiAKICAgICBBdWRpb1BsYXliYWNrUmF0ZSBtUGxheWJhY2tTZXR0aW5nczsKICAgICBBVlN5bmNTZXR0aW5ncyBtU3luY1NldHRpbmdzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyU291cmNlLmgKaW5kZXggNjYyMjM1Zi4uOTI5OGE5OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlNvdXJjZS5oCkBAIC02OSw3ICs2OSw3IEBACiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpID0gMDsKIAotICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYyhpbnQ2NF90IHN0YXJ0VGltZVVzKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHN0b3AoKSB7fQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9SVFNQU291cmNlMi5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmNwcAppbmRleCA3MGJjMGE5Li5hNzAyNjllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmNwcApAQCAtOTYsNyArOTYsOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpwcmVwYXJlQXN5bmMoKSB7CisvLyBUT0RPOiBmZXRjaCBkYXRhIHN0YXJ0aW5nIGZyb20gfHN0YXJ0VGltZVVzfAordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpwcmVwYXJlQXN5bmMoaW50NjRfdCAvKiBzdGFydFRpbWVVcyAqLykgewogICAgIGlmIChtSXNTRFAgJiYgbUhUVFBTZXJ2aWNlID09IE5VTEwpIHsKICAgICAgICAgbm90aWZ5UHJlcGFyZWQoQkFEX1ZBTFVFKTsKICAgICAgICAgcmV0dXJuOwpAQCAtMTA0LDcgKzEwNSw3IEBACiAKICAgICBpZiAobUxvb3BlciA9PSBOVUxMKSB7CiAgICAgICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgicnRzcCIpOworICAgICAgICBtTG9vcGVyLT5zZXROYW1lKCJydHNwMiIpOwogICAgICAgICBtTG9vcGVyLT5zdGFydCgpOwogCiAgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuaAppbmRleCA3MTJjM2U1Li5lNWYxNzE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9SVFNQU291cmNlMi5oCkBAIC00Myw3ICs0Myw3IEBACiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKCk7CisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYyhpbnQ2NF90IHN0YXJ0VGltZVVzKTsKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnQoKTsKICAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLmJwCmluZGV4IDc0MjM2Y2IuLjQ2YTFjMjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLmJwCkBAIC0xMiw2ICsxMiw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYXVkaW9jbGllbnQiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLApAQCAtMjQsMTEgKzI1LDExIEBACiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWEiLAogICAgICAgICAibGlibWVkaWFfb214IiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKICAgICAgICAgImxpYm1lZGlhZHJtIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKKyAgICAgICAgImxpYm5ldGRfY2xpZW50IiwKICAgICAgICAgImxpYnBvd2VybWFuYWdlciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKQEAgLTYzLDggKzY0LDYgQEAKIAogICAgIG5hbWU6ICJsaWJtZWRpYXBsYXllcnNlcnZpY2UiLAogCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKLQogICAgIHNhbml0aXplOiB7CiAgICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCA5NmY3OWUwLi5kYTk1ODE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtNDUsNyArNDUsNiBAQAogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSVJlbW90ZURpc3BsYXlDbGllbnQuaD4KQEAgLTE2MjcsNyArMTYyNiw3IEBACiAgICAgICAgIG1BdHRyaWJ1dGVzID0gKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwogICAgICAgICBpZiAobUF0dHJpYnV0ZXMgIT0gTlVMTCkgewogICAgICAgICAgICAgbWVtY3B5KG1BdHRyaWJ1dGVzLCBhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgICAgICBtU3RyZWFtVHlwZSA9IGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUoYXR0cik7CisgICAgICAgICAgICBtU3RyZWFtVHlwZSA9IEF1ZGlvU3lzdGVtOjphdHRyaWJ1dGVzVG9TdHJlYW1UeXBlKCphdHRyKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIG1BdHRyaWJ1dGVzID0gTlVMTDsKQEAgLTE4MTYsNyArMTgxNSw3IEBACiAgICAgICAgICAgICBtQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKICAgICAgICAgfQogICAgICAgICBtZW1jcHkobUF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgbVN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGF0dHJpYnV0ZXMpOworICAgICAgICBtU3RyZWFtVHlwZSA9IEF1ZGlvU3lzdGVtOjphdHRyaWJ1dGVzVG9TdHJlYW1UeXBlKCphdHRyaWJ1dGVzKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAppbmRleCA0MjA2NjQ3Li5kNjYyOGQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCkBAIC01MzcsNCArNTM3LDI5IEBACiAgICAgfQogICAgIHJldHVybiBOT19JTklUOwogfQorCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpzZXRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CisgICAgQUxPR1YoInNldE1pY3JvcGhvbmVEaXJlY3Rpb24oJWQpIiwgZGlyZWN0aW9uKTsKKyAgICBpZiAobVJlY29yZGVyICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1SZWNvcmRlci0+c2V0TWljcm9waG9uZURpcmVjdGlvbihkaXJlY3Rpb24pOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIHsKKyAgICBBTE9HVigic2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKCVmKSIsIHpvb20pOworICAgIGlmIChtUmVjb3JkZXIgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbVJlY29yZGVyLT5zZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSB7CisgICAgQUxPR1YoImdldFBvcnRJZCIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVJlY29yZGVyICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1SZWNvcmRlci0+Z2V0UG9ydElkKHBvcnRJZCk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCmluZGV4IGQyZTY4MWYuLjhkYTcxOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaApAQCAtMTA5LDYgKzEwOSw5IEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBnZXRBY3RpdmVNaWNyb3Bob25lcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIHNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOworICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgc2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOworICAgICAgICAgICAgICAgIHN0YXR1c190ICAgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzICAgICAgICAgICBNZWRpYVBsYXllclNlcnZpY2U7ICAvLyBmb3IgYWNjZXNzaW5nIHByaXZhdGUgY29uc3RydWN0b3IKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAppbmRleCBlM2FlMDJlLi43Nzc3N2I4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCkBAIC0yNCw2ICsyNCw3IEBACiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYS5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CkBAIC00Niw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUGVyc2lzdGVudFN1cmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVByb2ZpbGVzLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KQEAgLTExNiw3ICsxMTgsOSBAQAogICAgICAgbVZpZGVvU291cmNlKFZJREVPX1NPVVJDRV9MSVNUX0VORCksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtU2VsZWN0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKLSAgICAgIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQoZmFsc2UpIHsKKyAgICAgIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQoZmFsc2UpLAorICAgICAgbVNlbGVjdGVkTWljRGlyZWN0aW9uKE1JQ19ESVJFQ1RJT05fVU5TUEVDSUZJRUQpLAorICAgICAgbVNlbGVjdGVkTWljRmllbGREaW1lbnNpb24oTUlDX0ZJRUxEX0RJTUVOU0lPTl9OT1JNQUwpIHsKIAogICAgIEFMT0dWKCJDb25zdHJ1Y3RvciIpOwogCkBAIC0yMDEsNyArMjA1LDcgQEAKICAgICB9CiAgICAgbUFuYWx5dGljc0RpcnR5ID0gZmFsc2U7CiAgICAgaWYgKHJlaW5pdGlhbGl6ZSkgewotICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0tleVJlY29yZGVyKTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShrS2V5UmVjb3JkZXIpOwogICAgIH0KIH0KIApAQCAtMzk2LDE0ICs0MDAsMTUgQEAKICAgICAgICAgcmV0dXJuIC1FQkFERjsKICAgICB9CiAKLSAgICAvLyBzdGFydCB3aXRoIGEgY2xlYW4sIGVtcHR5IGZpbGUKLSAgICBmdHJ1bmNhdGUoZmQsIDApOwotICAgIGludCBuZXh0RmQgPSBkdXAoZmQpOwotICAgIGlmIChtV3JpdGVyID09IE5VTEwpIHsKKyAgICBpZiAobVdyaXRlciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJzZXROZXh0T3V0cHV0RmlsZSBmYWlsZWQuIFdyaXRlciBoYXMgYmVlbiBmcmVlZCIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIHJldHVybiBtV3JpdGVyLT5zZXROZXh0RmQobmV4dEZkKTsKKworICAgIC8vIHN0YXJ0IHdpdGggYSBjbGVhbiwgZW1wdHkgZmlsZQorICAgIGZ0cnVuY2F0ZShmZCwgMCk7CisKKyAgICByZXR1cm4gbVdyaXRlci0+c2V0TmV4dEZkKGZkKTsKIH0KIAogLy8gQXR0ZW1wdCB0byBwYXJzZSBhbiBmbG9hdCBsaXRlcmFsIG9wdGlvbmFsbHkgc3Vycm91bmRlZCBieSB3aGl0ZXNwYWNlLApAQCAtOTQ4LDYgKzk1MywxMCBAQAogICAgICAgICAgICAgc3RhdHVzID0gc2V0dXBNUEVHMlRTUmVjb3JkaW5nKCk7CiAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfT0dHOgorICAgICAgICAgICAgc3RhdHVzID0gc2V0dXBPZ2dSZWNvcmRpbmcoKTsKKyAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgb3V0cHV0IGZpbGUgZm9ybWF0OiAlZCIsIG1PdXRwdXRGb3JtYXQpOwogICAgICAgICAgICAgc3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKQEAgLTEwMTMsNiArMTAyMiw3IEBACiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9BQUNfQURUUzoKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX1JUUF9BVlA6CiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9NUEVHMlRTOgorICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfT0dHOgogICAgICAgICB7CiAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKICAgICAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBzeXN0ZW1UaW1lKCkgLyAxMDAwOwpAQCAtMTA4Myw3ICsxMDkzLDkgQEAKICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICBtQ2xpZW50VWlkLAogICAgICAgICAgICAgICAgIG1DbGllbnRQaWQsCi0gICAgICAgICAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQpOworICAgICAgICAgICAgICAgIG1TZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgIG1TZWxlY3RlZE1pY0RpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICBtU2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbik7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBhdWRpb1NvdXJjZS0+aW5pdENoZWNrKCk7CiAKQEAgLTExMTMsNiArMTEyNSw5IEBACiAgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJhYWMtcHJvZmlsZSIsIE9NWF9BVURJT19BQUNPYmplY3RFTEQpOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9PUFVTOgorICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKTsKKyAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBhdWRpbyBlbmNvZGVyOiAlZCIsIG1BdWRpb0VuY29kZXIpOwpAQCAtMTE2OSw2ICsxMTg0LDEzIEBACiAgICAgcmV0dXJuIHNldHVwUmF3QXVkaW9SZWNvcmRpbmcoKTsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBPZ2dSZWNvcmRpbmcoKSB7CisgICAgQ0hFQ0tfRVEobU91dHB1dEZvcm1hdCwgT1VUUFVUX0ZPUk1BVF9PR0cpOworCisgICAgbVdyaXRlciA9IG5ldyBPZ2dXcml0ZXIobU91dHB1dEZkKTsKKyAgICByZXR1cm4gc2V0dXBSYXdBdWRpb1JlY29yZGluZygpOworfQorCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cEFNUlJlY29yZGluZygpIHsKICAgICBDSEVDSyhtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfQU1SX05CIHx8CiAgICAgICAgICAgbU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FNUl9XQik7CkBAIC0xNzQ1LDEzICsxNzY3LDI2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBFbmFibGUgdGVtcG9yYWwgbGF5ZXJpbmcgaWYgdGhlIGV4cGVjdGVkIChtYXgpIHBsYXliYWNrIGZyYW1lIHJhdGUgaXMgZ3JlYXRlciB0aGFuIH4xMSUgb2YKKyAgICAvLyB0aGUgbWluaW11bSBkaXNwbGF5IHJlZnJlc2ggcmF0ZSBvbiBhIHR5cGljYWwgZGV2aWNlLiBBZGQgbGF5ZXJzIHVudGlsIHRoZSBiYXNlIGxheWVyIGZhbGxzCisgICAgLy8gdW5kZXIgdGhpcyBsaW1pdC4gQWxsb3cgZGV2aWNlIG1hbnVmYWN0dXJlcnMgdG8gb3ZlcnJpZGUgdGhpcyBsaW1pdC4KKworICAgIC8vIFRPRE86IG1ha2UgdGhpcyBjb25maWd1cmFibGUgYnkgdGhlIGFwcGxpY2F0aW9uCisgICAgc3RkOjpzdHJpbmcgbWF4QmFzZUxheWVyRnBzUHJvcGVydHkgPQorICAgICAgICA6OmFuZHJvaWQ6OmJhc2U6OkdldFByb3BlcnR5KCJyby5tZWRpYS5yZWNvcmRlci1tYXgtYmFzZS1sYXllci1mcHMiLCAiIik7CisgICAgZmxvYXQgbWF4QmFzZUxheWVyRnBzID0gKGZsb2F0KTo6YXRvZihtYXhCYXNlTGF5ZXJGcHNQcm9wZXJ0eS5jX3N0cigpKTsKKyAgICAvLyBUUklDS1k6IHVzZSAhPiB0byBmaXggdXAgYW55IE5hTiB2YWx1ZXMKKyAgICBpZiAoIShtYXhCYXNlTGF5ZXJGcHMgPj0ga01pblR5cGljYWxEaXNwbGF5UmVmcmVzaGluZ1JhdGUgLyAwLjkpKSB7CisgICAgICAgIG1heEJhc2VMYXllckZwcyA9IGtNaW5UeXBpY2FsRGlzcGxheVJlZnJlc2hpbmdSYXRlIC8gMC45OworICAgIH0KKwogICAgIGZvciAodWludDMyX3QgdHJ5TGF5ZXJzID0gMTsgdHJ5TGF5ZXJzIDw9IGtNYXhOdW1WaWRlb1RlbXBvcmFsTGF5ZXJzOyArK3RyeUxheWVycykgewogICAgICAgICBpZiAodHJ5TGF5ZXJzID4gdHNMYXllcnMpIHsKICAgICAgICAgICAgIHRzTGF5ZXJzID0gdHJ5TGF5ZXJzOwogICAgICAgICB9CiAgICAgICAgIC8vIGtlZXAgZ29pbmcgdW50aWwgdGhlIGJhc2UgbGF5ZXIgZnBzIGZhbGxzIGJlbG93IHRoZSB0eXBpY2FsIGRpc3BsYXkgcmVmcmVzaCByYXRlCiAgICAgICAgIGZsb2F0IGJhc2VMYXllckZwcyA9IG1heFBsYXliYWNrRnBzIC8gKDEgPDwgKHRyeUxheWVycyAtIDEpKTsKLSAgICAgICAgaWYgKGJhc2VMYXllckZwcyA8IGtNaW5UeXBpY2FsRGlzcGxheVJlZnJlc2hpbmdSYXRlIC8gMC45KSB7CisgICAgICAgIGlmIChiYXNlTGF5ZXJGcHMgPCBtYXhCYXNlTGF5ZXJGcHMpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtMTgxMyw2ICsxODQ4LDcgQEAKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FBQzoKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0hFX0FBQzoKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FBQ19FTEQ6CisgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9PUFVTOgogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTE4NjMsMTkgKzE4OTksMTggQEAKICAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtVmlkZW9CaXRSYXRlOwogICAgIH0KIAotICAgIGlmIChtT3V0cHV0Rm9ybWF0ICE9IE9VVFBVVF9GT1JNQVRfV0VCTSkgewotICAgICAgICAvLyBBdWRpbyBzb3VyY2UgaXMgYWRkZWQgYXQgdGhlIGVuZCBpZiBpdCBleGlzdHMuCi0gICAgICAgIC8vIFRoaXMgaGVscCBtYWtlIHN1cmUgdGhhdCB0aGUgInJlY29kaW5nIiBzb3VuZCBpcyBzdXBwcmVzc2VkIGZvcgotICAgICAgICAvLyBjYW1jb3JkZXIgYXBwbGljYXRpb25zIGluIHRoZSByZWNvcmRlZCBmaWxlcy4KLSAgICAgICAgLy8gVE9ETyBBdWRpbyBzb3VyY2UgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkIGZvciB3ZWJtIG91dHB1dDsgdm9yYmlzIGVuY29kZXIgbmVlZGVkLgotICAgICAgICAvLyBkaXNhYmxlIGF1ZGlvIGZvciB0aW1lIGxhcHNlIHJlY29yZGluZwotICAgICAgICBib29sIGRpc2FibGVBdWRpbyA9IG1DYXB0dXJlRnBzRW5hYmxlICYmIG1DYXB0dXJlRnBzIDwgbUZyYW1lUmF0ZTsKLSAgICAgICAgaWYgKCFkaXNhYmxlQXVkaW8gJiYgbUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpIHsKLSAgICAgICAgICAgIGVyciA9IHNldHVwQXVkaW9FbmNvZGVyKHdyaXRlcik7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOwotICAgICAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOwotICAgICAgICB9CisgICAgLy8gQXVkaW8gc291cmNlIGlzIGFkZGVkIGF0IHRoZSBlbmQgaWYgaXQgZXhpc3RzLgorICAgIC8vIFRoaXMgaGVscCBtYWtlIHN1cmUgdGhhdCB0aGUgInJlY29kaW5nIiBzb3VuZCBpcyBzdXBwcmVzc2VkIGZvcgorICAgIC8vIGNhbWNvcmRlciBhcHBsaWNhdGlvbnMgaW4gdGhlIHJlY29yZGVkIGZpbGVzLgorICAgIC8vIGRpc2FibGUgYXVkaW8gZm9yIHRpbWUgbGFwc2UgcmVjb3JkaW5nCisgICAgY29uc3QgYm9vbCBkaXNhYmxlQXVkaW8gPSBtQ2FwdHVyZUZwc0VuYWJsZSAmJiBtQ2FwdHVyZUZwcyA8IG1GcmFtZVJhdGU7CisgICAgaWYgKCFkaXNhYmxlQXVkaW8gJiYgbUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpIHsKKyAgICAgICAgZXJyID0gc2V0dXBBdWRpb0VuY29kZXIod3JpdGVyKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKyAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOworICAgIH0KIAorICAgIGlmIChtT3V0cHV0Rm9ybWF0ICE9IE9VVFBVVF9GT1JNQVRfV0VCTSkgewogICAgICAgICBpZiAobUNhcHR1cmVGcHNFbmFibGUpIHsKICAgICAgICAgICAgIG1wNHdyaXRlci0+c2V0Q2FwdHVyZVJhdGUobUNhcHR1cmVGcHMpOwogICAgICAgICB9CkBAIC0yMjM5LDYgKzIyNzQsMzAgQEAKICAgICByZXR1cm4gTk9fSU5JVDsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgeworICAgIEFMT0dWKCJzZXRNaWNyb3Bob25lRGlyZWN0aW9uKCVkKSIsIGRpcmVjdGlvbik7CisgICAgbVNlbGVjdGVkTWljRGlyZWN0aW9uID0gZGlyZWN0aW9uOworICAgIGlmIChtQXVkaW9Tb3VyY2VOb2RlICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb1NvdXJjZU5vZGUtPnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oZGlyZWN0aW9uKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgQUxPR1YoInNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbiglZikiLCB6b29tKTsKKyAgICBtU2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbiA9IHpvb207CisgICAgaWYgKG1BdWRpb1NvdXJjZU5vZGUgIT0gMCkgeworICAgICAgICByZXR1cm4gbUF1ZGlvU291cmNlTm9kZS0+c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKHpvb20pOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Z2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3QgeworICAgIGlmIChtQXVkaW9Tb3VyY2VOb2RlICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb1NvdXJjZU5vZGUtPmdldFBvcnRJZChwb3J0SWQpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6ZHVtcCgKICAgICAgICAgaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAppbmRleCBmYWEyZTU5Li4yMzZiMTllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKQEAgLTc3LDcgKzc3LDkgQEAKICAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKLQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CisgICAgICAgICAgICBzdGF0dXNfdCBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBjb25zdCBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwpAQCAtMTU5LDYgKzE2MSw5IEBACiAgICAgYm9vbCBtRGV2aWNlQ2FsbGJhY2tFbmFibGVkOwogICAgIHdwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiBtQXVkaW9EZXZpY2VDYWxsYmFjazsKIAorICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgbVNlbGVjdGVkTWljRGlyZWN0aW9uOworICAgIGZsb2F0IG1TZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uOworCiAgICAgc3RhdGljIGNvbnN0IGludCBrTWF4SGlnaFNwZWVkRnBzID0gMTAwMDsKIAogICAgIHN0YXR1c190IHByZXBhcmVJbnRlcm5hbCgpOwpAQCAtMTY2LDYgKzE3MSw3IEBACiAgICAgdm9pZCBzZXR1cE1QRUc0b3JXRUJNTWV0YURhdGEoc3A8TWV0YURhdGE+ICptZXRhKTsKICAgICBzdGF0dXNfdCBzZXR1cEFNUlJlY29yZGluZygpOwogICAgIHN0YXR1c190IHNldHVwQUFDUmVjb3JkaW5nKCk7CisgICAgc3RhdHVzX3Qgc2V0dXBPZ2dSZWNvcmRpbmcoKTsKICAgICBzdGF0dXNfdCBzZXR1cFJhd0F1ZGlvUmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc2V0dXBSVFBSZWNvcmRpbmcoKTsKICAgICBzdGF0dXNfdCBzZXR1cE1QRUcyVFNSZWNvcmRpbmcoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9pbmNsdWRlL01lZGlhUGxheWVySW50ZXJmYWNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvaW5jbHVkZS9NZWRpYVBsYXllckludGVyZmFjZS5oCmluZGV4IDMxMTk5NTAuLjBhZDRkMDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9pbmNsdWRlL01lZGlhUGxheWVySW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2luY2x1ZGUvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaApAQCAtMTUxLDEzICsxNTEsMTMgQEAKIAogICAgICAgICB2aXJ0dWFsIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKTsKLSAgICAgICAgdmlydHVhbCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgPSAwOworICAgICAgICB2aXJ0dWFsIHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXRlPiBnZXRWb2x1bWVTaGFwZXJTdGF0ZShpbnQgaWQpID0gMDsKIAogICAgICAgICAvLyBBdWRpb1JvdXRpbmcKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgPSAwOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKSA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpID0gMDsKICAgICB9OwogCiAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllckJhc2UoKSB7fQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCmluZGV4IDY5NDIzNWEuLjVhNThhYTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUJ1ZmZlckhvbGRlci5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KQEAgLTM4LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTE1NTAsNiArMTU1MCwxNiBAQAogICAgICAgICAgICAgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKDEwMCk7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobVByZXBhcmluZykgeworICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKGZpbmFsU3RhdHVzKTsKKyAgICAgICAgICAgIG1QcmVwYXJpbmcgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChtU2VudFBhdXNlT25CdWZmZXJpbmcpIHsKKyAgICAgICAgICAgIHNlbmRDYWNoZVN0YXRzKCk7CisgICAgICAgICAgICBtU2VudFBhdXNlT25CdWZmZXJpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFJlc3VtZU9uQnVmZmVyaW5nRW5kKTsKKyAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICB9CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCmluZGV4IGNmNzVhZWMuLjMzODgwOTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcApAQCAtNjU5LDIwICs2NTksMzEgQEAKIAogICAgICAgICBjYXNlIGtXaGF0R2V0U2VsZWN0ZWRUcmFjazoKICAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCB0eXBlMzI7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHlwZSIsIChpbnQzMl90KikmdHlwZTMyKSk7CisgICAgICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUgPSAobWVkaWFfdHJhY2tfdHlwZSl0eXBlMzI7CisKKyAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICBzc2l6ZV90IHNlbGVjdGVkVHJhY2sgPSAtMTsKICAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKLQotICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTMyOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgKGludDMyX3QqKSZ0eXBlMzIpKTsKLSAgICAgICAgICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUgPSAobWVkaWFfdHJhY2tfdHlwZSl0eXBlMzI7Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBzZWxlY3RlZFRyYWNrID0gbVNvdXJjZS0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKLQotICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigicmVwbHkiLCAodm9pZCoqKSZyZXBseSkpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlbGVjdGVkVHJhY2spOworICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgICAgICBzZWxlY3RlZFRyYWNrID0gbVNvdXJjZS0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKHNlbGVjdGVkVHJhY2sgPT0gLTEgJiYgbUNDRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRUcmFjayA9IG1DQ0RlY29kZXItPmdldFNlbGVjdGVkVHJhY2sodHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkVHJhY2sgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUcmFjayArPSBpbmJhbmRUcmFja3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBQYXJjZWwqIHJlcGx5OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigicmVwbHkiLCAodm9pZCoqKSZyZXBseSkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2VsZWN0ZWRUcmFjayk7CisKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5jcHAKaW5kZXggN2Y0NzczYi4uMDE1NmFkMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuY3BwCkBAIC0yMDAsNiArMjAwLDE4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzc2l6ZV90IE51UGxheWVyOjpDQ0RlY29kZXI6OmdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdCB7CisgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IC0xKSB7CisgICAgICAgIENDVHJhY2sgdHJhY2sgPSBtVHJhY2tzW21TZWxlY3RlZFRyYWNrXTsKKyAgICAgICAgaWYgKHRyYWNrLm1UcmFja1R5cGUgPT0ga1RyYWNrVHlwZUNFQTYwOCB8fCB0cmFjay5tVHJhY2tUeXBlID09IGtUcmFja1R5cGVDRUE3MDgpIHsKKyAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFID8gbVNlbGVjdGVkVHJhY2sgOiAtMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICh0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfVU5LTk9XTiA/IG1TZWxlY3RlZFRyYWNrIDogLTEpOworICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKwogYm9vbCBOdVBsYXllcjo6Q0NEZWNvZGVyOjppc1NlbGVjdGVkKCkgY29uc3QgewogICAgIHJldHVybiBtU2VsZWN0ZWRUcmFjayA+PSAwICYmIG1TZWxlY3RlZFRyYWNrIDwgKGludDMyX3QpZ2V0VHJhY2tDb3VudCgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuaAppbmRleCBmMzEwZjM3Li4zN2I4MjMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuaApAQCAtMzgsNiArMzgsNyBAQAogICAgIHNpemVfdCBnZXRUcmFja0NvdW50KCkgY29uc3Q7CiAgICAgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgaW5kZXgpIGNvbnN0OwogICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCwgYm9vbCBzZWxlY3QpOworICAgIHNzaXplX3QgZ2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0OwogICAgIGJvb2wgaXNTZWxlY3RlZCgpIGNvbnN0OwogICAgIHZvaWQgZGVjb2RlKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKICAgICB2b2lkIGRpc3BsYXkoaW50NjRfdCB0aW1lVXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAppbmRleCA0YWQ2ZWFiLi4yZjBkYTJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcApAQCAtMTA3LDEwICsxMDcsMTYgQEAKIH0KIAogc3A8QU1lc3NhZ2U+IE51UGxheWVyOjpEZWNvZGVyOjpnZXRTdGF0cygpIGNvbnN0IHsKKwogICAgIG1TdGF0cy0+c2V0SW50NjQoImZyYW1lcy10b3RhbCIsIG1OdW1GcmFtZXNUb3RhbCk7CiAgICAgbVN0YXRzLT5zZXRJbnQ2NCgiZnJhbWVzLWRyb3BwZWQtaW5wdXQiLCBtTnVtSW5wdXRGcmFtZXNEcm9wcGVkKTsKICAgICBtU3RhdHMtPnNldEludDY0KCJmcmFtZXMtZHJvcHBlZC1vdXRwdXQiLCBtTnVtT3V0cHV0RnJhbWVzRHJvcHBlZCk7Ci0gICAgcmV0dXJuIG1TdGF0czsKKyAgICBtU3RhdHMtPnNldEZsb2F0KCJmcmFtZS1yYXRlLXRvdGFsIiwgbUZyYW1lUmF0ZVRvdGFsKTsKKworICAgIC8vIGknbSBtdXRleGVkIHJpZ2h0IG5vdy4KKyAgICAvLyBtYWtlIG91ciBvd24gY29weSwgc28gd2UgYXJlbid0IHZpY3RpbSB0byBhbnkgbGF0ZXIgY2hhbmdlcy4KKyAgICBzcDxBTWVzc2FnZT4gY29waWVkU3RhdHMgPSBtU3RhdHMtPmR1cCgpOworICAgIHJldHVybiBjb3BpZWRTdGF0czsKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OkRlY29kZXI6OnNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgewpAQCAtNjc3LDcgKzY4Myw3IEBACiAgICAgICAgIG1zZy0+c2V0U2l6ZSgiYnVmZmVyLWl4IiwgaW5kZXgpOwogCiAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG1DU0RzVG9TdWJtaXQuaXRlbUF0KDApOwotICAgICAgICBBTE9HSSgiWyVzXSByZXN1Ym1pdHRpbmcgQ1NEIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIEFMT0dWKCJbJXNdIHJlc3VibWl0dGluZyBDU0QiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKICAgICAgICAgbXNnLT5zZXRCdWZmZXIoImJ1ZmZlciIsIGJ1ZmZlcik7CiAgICAgICAgIG1DU0RzVG9TdWJtaXQucmVtb3ZlQXQoMCk7CiAgICAgICAgIGlmICghb25JbnB1dEJ1ZmZlckZldGNoZWQobXNnKSkgewpAQCAtNzQ4LDcgKzc1NCw3IEBACiAgICAgcmVwbHktPnNldFNpemUoInNpemUiLCBzaXplKTsKIAogICAgIGlmIChlb3MpIHsKLSAgICAgICAgQUxPR0koIlslc10gc2F3IG91dHB1dCBFT1MiLCBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKyAgICAgICAgQUxPR1YoIlslc10gc2F3IG91dHB1dCBFT1MiLCBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKIAogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImVvcyIsIHRydWUpOwogICAgICAgICByZXBseS0+c2V0SW50MzIoImVvcyIsIHRydWUpOwpAQCAtMTAyOCw3ICsxMDM0LDcgQEAKICAgICAgICAgICAgIGludDY0X3QgcmVzdW1lQXRNZWRpYVRpbWVVczsKICAgICAgICAgICAgIGlmIChleHRyYS0+ZmluZEludDY0KAogICAgICAgICAgICAgICAgICAgICAgICAgInJlc3VtZS1hdC1tZWRpYVRpbWVVcyIsICZyZXN1bWVBdE1lZGlhVGltZVVzKSkgewotICAgICAgICAgICAgICAgIEFMT0dJKCJbJXNdIHN1cHByZXNzaW5nIHJlbmRlcmluZyB1bnRpbCAlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBzdXBwcmVzc2luZyByZW5kZXJpbmcgdW50aWwgJWxsZCB1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAobG9uZyBsb25nKXJlc3VtZUF0TWVkaWFUaW1lVXMpOwogICAgICAgICAgICAgICAgIG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcyA9IHJlc3VtZUF0TWVkaWFUaW1lVXM7CiAgICAgICAgICAgICB9CkBAIC0xMDY5LDYgKzEwNzUsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE1lZGlhQnVmZmVySG9sZGVyKj4oaG9sZGVyLmdldCgpKS0+bWVkaWFCdWZmZXIoKSA6IG51bGxwdHI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChtZWRpYUJ1ZiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUJ1Zi0+c2l6ZSgpID4gY29kZWNCdWZmZXItPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKEVSUk9SX0JVRkZFUl9UT09fU01BTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgbURlcXVldWVkSW5wdXRCdWZmZXJzLnB1c2hfYmFjayhidWZmZXJJeCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2V0UmFuZ2UoMCwgbWVkaWFCdWYtPnNpemUoKSk7CiAgICAgICAgICAgICAgICAgICAgIG1lbWNweShjb2RlY0J1ZmZlci0+ZGF0YSgpLCBtZWRpYUJ1Zi0+ZGF0YSgpLCBtZWRpYUJ1Zi0+c2l6ZSgpKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKaW5kZXggYjgzZTc2Ni4uMmI4MTNlNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCkBAIC01Myw2ICs1Myw3IEBACiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckhlaWdodCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmhlaWdodCI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckZyYW1lcyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmZyYW1lcyI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckZyYW1lc0Ryb3BwZWQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kcm9wcGVkIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRnJhbWVSYXRlID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZnBzIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyQU1pbWUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5hdWRpby5taW1lIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyQUNvZGVjID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuYXVkaW8uY29kZWMiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJEdXJhdGlvbiA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmR1cmF0aW9uTXMiOwpAQCAtOTYsNyArOTcsNyBAQAogICAgIG1NZWRpYUNsb2NrLT5pbml0KCk7CiAKICAgICAvLyBzZXQgdXAgYW4gYW5hbHl0aWNzIHJlY29yZAotICAgIG1BbmFseXRpY3NJdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbShrS2V5UGxheWVyKTsKKyAgICBtQW5hbHl0aWNzSXRlbSA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKGtLZXlQbGF5ZXIpOwogCiAgICAgbUxvb3Blci0+c3RhcnQoCiAgICAgICAgICAgICBmYWxzZSwgLyogcnVuT25DYWxsaW5nVGhyZWFkICovCkBAIC0zMjgsNyArMzI5LDcgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnN0YXJ0KCkgewotICAgIEFMT0dEKCJzdGFydCglcCksIHN0YXRlIGlzICVkLCBlb3MgaXMgJWQiLCB0aGlzLCBtU3RhdGUsIG1BdEVPUyk7CisgICAgQUxPR1YoInN0YXJ0KCVwKSwgc3RhdGUgaXMgJWQsIGVvcyBpcyAlZCIsIHRoaXMsIG1TdGF0ZSwgbUF0RU9TKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIHJldHVybiBzdGFydF9sKCk7CiB9CkBAIC00NzAsNyArNDcxLDcgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNlZWtUbyhpbnQgbXNlYywgTWVkaWFQbGF5ZXJTZWVrTW9kZSBtb2RlKSB7Ci0gICAgQUxPR0QoInNlZWtUbyglcCkgKCVkIG1zLCAlZCkgYXQgc3RhdGUgJWQiLCB0aGlzLCBtc2VjLCBtb2RlLCBtU3RhdGUpOworICAgIEFMT0dWKCJzZWVrVG8oJXApICglZCBtcywgJWQpIGF0IHN0YXRlICVkIiwgdGhpcywgbXNlYywgbW9kZSwgbVN0YXRlKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzID0gbXNlYyAqIDEwMDBMTDsKQEAgLTU3Nyw2ICs1NzgsMTAgQEAKICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllckZyYW1lcywgbnVtRnJhbWVzVG90YWwpOwogICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyRnJhbWVzRHJvcHBlZCwgbnVtRnJhbWVzRHJvcHBlZCk7CiAKKyAgICAgICAgICAgICAgICBmbG9hdCBmcmFtZVJhdGUgPSAwOworICAgICAgICAgICAgICAgIGlmIChzdGF0cy0+ZmluZEZsb2F0KCJmcmFtZS1yYXRlLXRvdGFsIiwgJmZyYW1lUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldERvdWJsZShrUGxheWVyRnJhbWVSYXRlLCAoZG91YmxlKSBmcmFtZVJhdGUpOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgfSBlbHNlIGlmIChtaW1lLnN0YXJ0c1dpdGgoImF1ZGlvLyIpKSB7CiAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1BsYXllckFNaW1lLCBtaW1lLmNfc3RyKCkpOwpAQCAtNjAyLDYgKzYwNyw3IEBACiAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyUmVidWZmZXJpbmcsIChtUmVidWZmZXJpbmdUaW1lVXMrNTAwKS8xMDAwICk7CiAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyUmVidWZmZXJpbmdDb3VudCwgbVJlYnVmZmVyaW5nRXZlbnRzKTsKICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJSZWJ1ZmZlcmluZ0F0RXhpdCwgbVJlYnVmZmVyaW5nQXRFeGl0KTsKKwogICAgIH0KIAogICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJEYXRhU291cmNlVHlwZSwgbVBsYXllci0+Z2V0RGF0YVNvdXJjZVR5cGUoKSk7CkBAIC02MjksNyArNjM1LDcgQEAKIAogICAgICAgICAvLyByZS1pbml0IGluIGNhc2Ugd2UgcHJlcGFyZSgpIGFuZCBzdGFydCgpIGFnYWluLgogICAgICAgICBkZWxldGUgbUFuYWx5dGljc0l0ZW0gOwotICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oIm51cGxheWVyIik7CisgICAgICAgIG1BbmFseXRpY3NJdGVtID0gTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoIm51cGxheWVyIik7CiAgICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbSkgewogICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldFVpZChtQ2xpZW50VWlkKTsKICAgICAgICAgfQpAQCAtOTU5LDcgKzk2NSw3IEBACiAKIHZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeUxpc3RlbmVyX2woCiAgICAgICAgIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbikgewotICAgIEFMT0dEKCJub3RpZnlMaXN0ZW5lcl9sKCVwKSwgKCVkLCAlZCwgJWQsICVkKSwgbG9vcCBzZXR0aW5nKCVkLCAlZCkiLAorICAgIEFMT0dWKCJub3RpZnlMaXN0ZW5lcl9sKCVwKSwgKCVkLCAlZCwgJWQsICVkKSwgbG9vcCBzZXR0aW5nKCVkLCAlZCkiLAogICAgICAgICAgICAgdGhpcywgbXNnLCBleHQxLCBleHQyLCAoaW4gPT0gTlVMTCA/IC0xIDogKGludClpbi0+ZGF0YVNpemUoKSksIG1BdXRvTG9vcCwgbUxvb3BpbmcpOwogICAgIHN3aXRjaCAobXNnKSB7CiAgICAgICAgIGNhc2UgTUVESUFfUExBWUJBQ0tfQ09NUExFVEU6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmNwcAppbmRleCBiZGUwODYyLi4yZDBjOWUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRybS5jcHAKQEAgLTE1OSw4ICsxNTksMTIgQEAKICAgICBpZiAoZHJtICE9IE5VTEwpIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwc3NoRFJNcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgRHJtVVVJRCB1dWlkID0gcHNzaERSTXNbaV07Ci0gICAgICAgICAgICBpZiAoZHJtLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLnB0cigpLCBTdHJpbmc4KCkpKQorICAgICAgICAgICAgYm9vbCBpc1N1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgc3RhdHVzID0gZHJtLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLnB0cigpLCBTdHJpbmc4KCksCisgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxVbmtub3duLCAmaXNTdXBwb3J0ZWQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSyAmJiBpc1N1cHBvcnRlZCkgewogICAgICAgICAgICAgICAgIHN1cHBvcnRlZERSTXMuYWRkKHV1aWQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgZHJtLmNsZWFyKCk7CkBAIC0yMzksOCArMjQzLDE0IEBACiAgICAgICAgIHNpemVfdCAqZW5jcnlwdGVkYnl0ZXMpCiB7CiAgICAgLy8gc2l6ZSBuZWVkZWQgdG8gc3RvcmUgYWxsIHRoZSBjcnlwdG8gZGF0YQotICAgIHNpemVfdCBjcnlwdG9zaXplID0gc2l6ZW9mKENyeXB0b0luZm8pICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSkgKiBudW1TdWJTYW1wbGVzOworICAgIHNpemVfdCBjcnlwdG9zaXplOworICAgIC8vIHNpemVvZihDcnlwdG9JbmZvKSArIHNpemVvZihDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSkgKiBudW1TdWJTYW1wbGVzOworICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KHNpemVvZihDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSksIG51bVN1YlNhbXBsZXMsICZjcnlwdG9zaXplKSB8fAorICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhjcnlwdG9zaXplLCBzaXplb2YoQ3J5cHRvSW5mbyksICZjcnlwdG9zaXplKSkgeworICAgICAgICBBTE9HRSgiY3J5cHRvIHNpemUgb3ZlcmZsb3ciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCiAgICAgQ3J5cHRvSW5mbyAqcmV0ID0gKENyeXB0b0luZm8qKSBtYWxsb2MoY3J5cHRvc2l6ZSk7CiAgICAgaWYgKHJldCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBhbGxvY2F0ZSAlenUgYnl0ZXMiLCBjcnlwdG9zaXplKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAppbmRleCA0OTkyMTM3Li42NWQ2ZDYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCkBAIC0yNiw2ICsyNiw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTg3LDYgKzg5LDIwIEBACiAvLyBzdGF0aWMKIGNvbnN0IGludDY0X3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjprTWluUG9zaXRpb25VcGRhdGVEZWxheVVzID0gMTAwMDAwbGw7CiAKK3N0YXRpYyBhdWRpb19mb3JtYXRfdCBjb25zdGV4cHIgYXVkaW9Gb3JtYXRGcm9tRW5jb2RpbmcoaW50MzJfdCBwY21FbmNvZGluZykgeworICAgIHN3aXRjaCAocGNtRW5jb2RpbmcpIHsKKyAgICBjYXNlIGtBdWRpb0VuY29kaW5nUGNtRmxvYXQ6CisgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgIGNhc2Uga0F1ZGlvRW5jb2RpbmdQY20xNmJpdDoKKyAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIGNhc2Uga0F1ZGlvRW5jb2RpbmdQY204Yml0OgorICAgICAgICByZXR1cm4gQVVESU9fRk9STUFUX1BDTV84X0JJVDsgLy8gVE9ETzogZG8gd2Ugd2FudCB0byBzdXBwb3J0IHRoaXM/CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGVuY29kaW5nOiAlZCIsIF9fZnVuY19fLCBwY21FbmNvZGluZyk7CisgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICB9Cit9CisKIE51UGxheWVyOjpSZW5kZXJlcjo6UmVuZGVyZXIoCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmc2luaywKICAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2ssCkBAIC0xODgzLDggKzE4OTksMTMgQEAKICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CiAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKTsKIAorICAgIC8vIHJlYWQgcGNtIGVuY29kaW5nIGZyb20gTWVkaWFDb2RlYyBvdXRwdXQgZm9ybWF0LCBpZiBhdmFpbGFibGUKKyAgICBpbnQzMl90IHBjbUVuY29kaW5nOworICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0KKyAgICAgICAgICAgIGZvcm1hdC0+ZmluZEludDMyKEtFWV9QQ01fRU5DT0RJTkcsICZwY21FbmNvZGluZykgPworICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdEZyb21FbmNvZGluZyhwY21FbmNvZGluZykgOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKwogICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgewotICAgICAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgICAgICBBU3RyaW5nIG1pbWU7CiAgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG1hcE1pbWVUb0F1ZGlvRm9ybWF0KGF1ZGlvRm9ybWF0LCBtaW1lLmNfc3RyKCkpOwpAQCAtMTk4Niw3ICsyMDA3LDcgQEAKICAgICAgICAgY29uc3QgUGNtSW5mbyBpbmZvID0gewogICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcGNtRmxhZ3MsCi0gICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIC8vIFRPRE86IGNoYW5nZSB0byBhdWRpb0Zvcm1hdAorICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0LAogICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUKICAgICAgICAgfTsKQEAgLTIwMjUsNyArMjA0Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgMCAvKiBidWZmZXJDb3VudCAtIHVudXNlZCAqLywKICAgICAgICAgICAgICAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPyAmTnVQbGF5ZXI6OlJlbmRlcmVyOjpBdWRpb1NpbmtDYWxsYmFjayA6IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID8gdGhpcyA6IE5VTEwsCkBAIC0yMDgzLDQgKzIxMDQsMyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaAppbmRleCBhMDQ3OTc1Li5hNTIxZjYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKQEAgLTI4LDcgKzI4LDcgQEAKIGNsYXNzICBBV2FrZUxvY2s7CiBzdHJ1Y3QgTWVkaWFDbG9jazsKIGNsYXNzIE1lZGlhQ29kZWNCdWZmZXI7Ci1zdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlcjsKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTsKIAogc3RydWN0IE51UGxheWVyOjpSZW5kZXJlciA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgZW51bSBGbGFncyB7CkBAIC0xNTYsNyArMTU2LDcgQEAKICAgICBMaXN0PFF1ZXVlRW50cnk+IG1BdWRpb1F1ZXVlOwogICAgIExpc3Q8UXVldWVFbnRyeT4gbVZpZGVvUXVldWU7CiAgICAgdWludDMyX3QgbU51bUZyYW1lc1dyaXR0ZW47Ci0gICAgc3A8VmlkZW9GcmFtZVNjaGVkdWxlcj4gbVZpZGVvU2NoZWR1bGVyOworICAgIHNwPFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlPiBtVmlkZW9TY2hlZHVsZXI7CiAKICAgICBib29sIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nOwogICAgIGJvb2wgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmc7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGU4NmI2OGEuLmY4Yzg5ZTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xMSwxMCArMTEsOSBAQAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAogICAgIF0sCiAKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAotCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJuYmxvZy9BbmRyb2lkLmJwCmluZGV4IDc0YWFmNzcuLjExODgzMjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibmJsb2cvQW5kcm9pZC5icApAQCAtMyw5ICszLDEzIEBACiAgICAgbmFtZTogImxpYm5ibG9nIiwKIAogICAgIHNyY3M6IFsKLSAgICAgICAgIk5CTG9nLmNwcCIsCisgICAgICAgICJFbnRyeS5jcHAiLAorICAgICAgICAiTWVyZ2VyLmNwcCIsCiAgICAgICAgICJQZXJmb3JtYW5jZUFuYWx5c2lzLmNwcCIsCisgICAgICAgICJSZWFkZXIuY3BwIiwKICAgICAgICAgIlJlcG9ydFBlcmZvcm1hbmNlLmNwcCIsCisgICAgICAgICJUaW1lbGluZS5jcHAiLAorICAgICAgICAiV3JpdGVyLmNwcCIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCkBAIC0xMyw5ICsxNywxNCBAQAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmpzb25jcHAiLAorICAgIF0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvRW50cnkuY3BwIGIvbWVkaWEvbGlibmJsb2cvRW50cnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NzU2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9FbnRyeS5jcHAKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk5CTG9nIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmby5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0VudHJ5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKK2ludCBFbnRyeTo6Y29weUVudHJ5RGF0YUF0KHNpemVfdCBvZmZzZXQpIGNvbnN0Cit7CisgICAgLy8gRklYTUUgVGhpcyBpcyB0b28gc2xvdworICAgIGlmIChvZmZzZXQgPT0gMCkgeworICAgICAgICByZXR1cm4gbUV2ZW50OworICAgIH0gZWxzZSBpZiAob2Zmc2V0ID09IDEpIHsKKyAgICAgICAgcmV0dXJuIG1MZW5ndGg7CisgICAgfSBlbHNlIGlmIChvZmZzZXQgPCAoc2l6ZV90KSAobUxlbmd0aCArIDIpKSB7CisgICAgICAgIHJldHVybiAoaW50KSAoKGNoYXIgKikgbURhdGEpW29mZnNldCAtIDJdOworICAgIH0gZWxzZSBpZiAob2Zmc2V0ID09IChzaXplX3QpIChtTGVuZ3RoICsgMikpIHsKKyAgICAgICAgcmV0dXJuIG1MZW5ndGg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7ICAgLy8gRklYTUUgaXMgdGhpcyBhbiBlcnJvcj8KKyAgICB9Cit9CisKK0VudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoKSAgIC8vIER1bW15IGluaXRpYWxpemF0aW9uLgorICAgIDogbVB0cihudWxscHRyKQoreworfQorCitFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKGNvbnN0IHVpbnQ4X3QgKmVudHJ5KQorICAgIDogbVB0cihlbnRyeSkKK3sKK30KKworRW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcihjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcikKKyAgICA6IG1QdHIob3RoZXIubVB0cikKK3sKK30KKworY29uc3QgZW50cnkmIEVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0Cit7CisgICAgcmV0dXJuICooZW50cnkqKSBtUHRyOworfQorCitjb25zdCBlbnRyeSogRW50cnlJdGVyYXRvcjo6b3BlcmF0b3ItPigpIGNvbnN0Cit7CisgICAgcmV0dXJuIChlbnRyeSopIG1QdHI7Cit9CisKK0VudHJ5SXRlcmF0b3ImIEVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yKysoKQoreworICAgIG1QdHIgKz0gbVB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKyBFbnRyeTo6a092ZXJoZWFkOworICAgIHJldHVybiAqdGhpczsKK30KKworRW50cnlJdGVyYXRvciYgRW50cnlJdGVyYXRvcjo6b3BlcmF0b3ItLSgpCit7CisgICAgbVB0ciAtPSBtUHRyW0VudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdICsgRW50cnk6OmtPdmVyaGVhZDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK0VudHJ5SXRlcmF0b3IgRW50cnlJdGVyYXRvcjo6bmV4dCgpIGNvbnN0Cit7CisgICAgRW50cnlJdGVyYXRvciBhdXgoKnRoaXMpOworICAgIHJldHVybiArK2F1eDsKK30KKworRW50cnlJdGVyYXRvciBFbnRyeUl0ZXJhdG9yOjpwcmV2KCkgY29uc3QKK3sKKyAgICBFbnRyeUl0ZXJhdG9yIGF1eCgqdGhpcyk7CisgICAgcmV0dXJuIC0tYXV4OworfQorCitib29sIEVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yIT0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1QdHIgIT0gb3RoZXIubVB0cjsKK30KKworaW50IEVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLShjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcikgY29uc3QKK3sKKyAgICByZXR1cm4gbVB0ciAtIG90aGVyLm1QdHI7Cit9CisKK2Jvb2wgRW50cnlJdGVyYXRvcjo6aGFzQ29uc2lzdGVudExlbmd0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1QdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldID09IG1QdHJbbVB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKworICAgICAgICBFbnRyeTo6a092ZXJoZWFkICsgRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF07Cit9CisKK3ZvaWQgRW50cnlJdGVyYXRvcjo6Y29weVRvKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCkgY29uc3QKK3sKKyAgICBzaXplX3QgbGVuZ3RoID0gbVB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKyBFbnRyeTo6a092ZXJoZWFkOworICAgIGRzdC0+d3JpdGUobVB0ciwgbGVuZ3RoKTsKK30KKwordm9pZCBFbnRyeUl0ZXJhdG9yOjpjb3B5RGF0YSh1aW50OF90ICpkc3QpIGNvbnN0Cit7CisgICAgbWVtY3B5KCh2b2lkKikgZHN0LCBtUHRyICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpLCBtUHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGQ6OnVuaXF1ZV9wdHI8QWJzdHJhY3RFbnRyeT4gQWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpCit7CisgICAgaWYgKHB0ciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjb25zdCB1aW50OF90IHR5cGUgPSBFbnRyeUl0ZXJhdG9yKHB0ciktPnR5cGU7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBFVkVOVF9GTVRfU1RBUlQ6CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEZvcm1hdEVudHJ5PihGb3JtYXRFbnRyeShwdHIpKTsKKyAgICBjYXNlIEVWRU5UX0FVRElPX1NUQVRFOgorICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTOgorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxIaXN0b2dyYW1FbnRyeT4oSGlzdG9ncmFtRW50cnkocHRyKSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR1coIlRyaWVkIHRvIGNyZWF0ZSBBYnN0cmFjdEVudHJ5IG9mIHR5cGUgJWQiLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfQorCitFbnRyeUl0ZXJhdG9yIEZvcm1hdEVudHJ5OjpiZWdpbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KTsKK30KKworY29uc3QgY2hhciAqRm9ybWF0RW50cnk6OmZvcm1hdFN0cmluZygpIGNvbnN0Cit7CisgICAgcmV0dXJuIChjb25zdCBjaGFyKikgbUVudHJ5ICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpOworfQorCitzaXplX3QgRm9ybWF0RW50cnk6OmZvcm1hdFN0cmluZ0xlbmd0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1FbnRyeVtvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV07Cit9CisKK0VudHJ5SXRlcmF0b3IgRm9ybWF0RW50cnk6OmFyZ3MoKSBjb25zdAoreworICAgIGF1dG8gaXQgPSBiZWdpbigpOworICAgICsraXQ7IC8vIHNraXAgc3RhcnQgZm10CisgICAgKytpdDsgLy8gc2tpcCB0aW1lc3RhbXAKKyAgICArK2l0OyAvLyBza2lwIGhhc2gKKyAgICAvLyBTa2lwIGF1dGhvciBpZiBwcmVzZW50CisgICAgaWYgKGl0LT50eXBlID09IEVWRU5UX0ZNVF9BVVRIT1IpIHsKKyAgICAgICAgKytpdDsKKyAgICB9CisgICAgcmV0dXJuIGl0OworfQorCitpbnQ2NF90IEZvcm1hdEVudHJ5Ojp0aW1lc3RhbXAoKSBjb25zdAoreworICAgIGF1dG8gaXQgPSBiZWdpbigpOworICAgICsraXQ7IC8vIHNraXAgc3RhcnQgZm10CisgICAgcmV0dXJuIGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKK30KKworbG9nX2hhc2hfdCBGb3JtYXRFbnRyeTo6aGFzaCgpIGNvbnN0Cit7CisgICAgYXV0byBpdCA9IGJlZ2luKCk7CisgICAgKytpdDsgLy8gc2tpcCBzdGFydCBmbXQKKyAgICArK2l0OyAvLyBza2lwIHRpbWVzdGFtcAorICAgIC8vIHVuYWxpZ25lZCA2NC1iaXQgcmVhZCBub3Qgc3VwcG9ydGVkCisgICAgbG9nX2hhc2hfdCBoYXNoOworICAgIG1lbWNweSgmaGFzaCwgaXQtPmRhdGEsIHNpemVvZihoYXNoKSk7CisgICAgcmV0dXJuIGhhc2g7Cit9CisKK2ludCBGb3JtYXRFbnRyeTo6YXV0aG9yKCkgY29uc3QKK3sKKyAgICBhdXRvIGl0ID0gYmVnaW4oKTsKKyAgICArK2l0OyAvLyBza2lwIHN0YXJ0IGZtdAorICAgICsraXQ7IC8vIHNraXAgdGltZXN0YW1wCisgICAgKytpdDsgLy8gc2tpcCBoYXNoCisgICAgLy8gaWYgdGhlcmUgaXMgYW4gYXV0aG9yIGVudHJ5LCByZXR1cm4gaXQsIHJldHVybiAtMSBvdGhlcndpc2UKKyAgICByZXR1cm4gaXQtPnR5cGUgPT0gRVZFTlRfRk1UX0FVVEhPUiA/IGl0LnBheWxvYWQ8aW50PigpIDogLTE7Cit9CisKK0VudHJ5SXRlcmF0b3IgRm9ybWF0RW50cnk6OmNvcHlXaXRoQXV0aG9yKAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsIGludCBhdXRob3IpIGNvbnN0Cit7CisgICAgYXV0byBpdCA9IGJlZ2luKCk7CisgICAgaXQuY29weVRvKGRzdCk7ICAgICAvLyBjb3B5IGZtdCBzdGFydCBlbnRyeQorICAgICgrK2l0KS5jb3B5VG8oZHN0KTsgLy8gY29weSB0aW1lc3RhbXAKKyAgICAoKytpdCkuY29weVRvKGRzdCk7IC8vIGNvcHkgaGFzaAorICAgIC8vIGluc2VydCBhdXRob3IgZW50cnkKKyAgICBzaXplX3QgYXV0aG9yRW50cnlTaXplID0gRW50cnk6OmtPdmVyaGVhZCArIHNpemVvZihhdXRob3IpOworICAgIHVpbnQ4X3QgYXV0aG9yRW50cnlbYXV0aG9yRW50cnlTaXplXTsKKyAgICBhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgdHlwZSldID0gRVZFTlRfRk1UX0FVVEhPUjsKKyAgICBhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPQorICAgICAgICBhdXRob3JFbnRyeVthdXRob3JFbnRyeVNpemUgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSA9CisgICAgICAgIHNpemVvZihhdXRob3IpOworICAgICooaW50KikgKCZhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgZGF0YSldKSA9IGF1dGhvcjsKKyAgICBkc3QtPndyaXRlKGF1dGhvckVudHJ5LCBhdXRob3JFbnRyeVNpemUpOworICAgIC8vIGNvcHkgcmVzdCBvZiBlbnRyaWVzCisgICAgd2hpbGUgKCgrK2l0KS0+dHlwZSAhPSBFVkVOVF9GTVRfRU5EKSB7CisgICAgICAgIGl0LmNvcHlUbyhkc3QpOworICAgIH0KKyAgICBpdC5jb3B5VG8oZHN0KTsKKyAgICArK2l0OworICAgIHJldHVybiBpdDsKK30KKworaW50NjRfdCBIaXN0b2dyYW1FbnRyeTo6dGltZXN0YW1wKCkgY29uc3QKK3sKKyAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLnBheWxvYWQ8SGlzdFRzRW50cnk+KCkudHM7Cit9CisKK2xvZ19oYXNoX3QgSGlzdG9ncmFtRW50cnk6Omhhc2goKSBjb25zdAoreworICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkucGF5bG9hZDxIaXN0VHNFbnRyeT4oKS5oYXNoOworfQorCitpbnQgSGlzdG9ncmFtRW50cnk6OmF1dGhvcigpIGNvbnN0Cit7CisgICAgRW50cnlJdGVyYXRvciBpdChtRW50cnkpOworICAgIHJldHVybiBpdC0+bGVuZ3RoID09IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpCisgICAgICAgICAgICA/IGl0LnBheWxvYWQ8SGlzdFRzRW50cnlXaXRoQXV0aG9yPigpLmF1dGhvciA6IC0xOworfQorCitFbnRyeUl0ZXJhdG9yIEhpc3RvZ3JhbUVudHJ5Ojpjb3B5V2l0aEF1dGhvcigKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LCBpbnQgYXV0aG9yKSBjb25zdAoreworICAgIC8vIEN1cnJlbnQgaGlzdG9ncmFtIGVudHJ5IGhhcyB7dHlwZSwgbGVuZ3RoLCBzdHJ1Y3QgSGlzdFRzRW50cnksIGxlbmd0aH0uCisgICAgLy8gV2Ugbm93IHdhbnQge3R5cGUsIGxlbmd0aCwgc3RydWN0IEhpc3RUc0VudHJ5V2l0aEF1dGhvciwgbGVuZ3RofQorICAgIHVpbnQ4X3QgYnVmZmVyW0VudHJ5OjprT3ZlcmhlYWQgKyBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKV07CisgICAgLy8gQ29weSBjb250ZW50IHVudGlsIHRoZSBwb2ludCB3ZSB3YW50IHRvIGFkZCB0aGUgYXV0aG9yCisgICAgbWVtY3B5KGJ1ZmZlciwgbUVudHJ5LCBzaXplb2YoZW50cnkpICsgc2l6ZW9mKEhpc3RUc0VudHJ5KSk7CisgICAgLy8gQ29weSB0aGUgYXV0aG9yCisgICAgKihpbnQqKSAoYnVmZmVyICsgc2l6ZW9mKGVudHJ5KSArIHNpemVvZihIaXN0VHNFbnRyeSkpID0gYXV0aG9yOworICAgIC8vIFVwZGF0ZSBsZW5ndGhzCisgICAgYnVmZmVyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSA9IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpOworICAgIGJ1ZmZlcltvZmZzZXRvZihlbnRyeSwgZGF0YSkgKyBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKSArIG9mZnNldG9mKGVuZGluZywgbGVuZ3RoKV0KKyAgICAgICAgPSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKTsKKyAgICAvLyBXcml0ZSBuZXcgYnVmZmVyIGludG8gRklGTworICAgIGRzdC0+d3JpdGUoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5uZXh0KCk7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvTWVyZ2VyLmNwcCBiL21lZGlhL2xpYm5ibG9nL01lcmdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkNmQ2YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL01lcmdlci5jcHAKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk5CTG9nIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KKyNpbmNsdWRlIDxqc29uL2pzb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9NZXJnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZWFkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9UaW1lbGluZS5oPgorI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCitNZXJnZXI6Ok1lcmdlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKToKKyAgICAgIG1TaGFyZWQoKFNoYXJlZCAqKSBzaGFyZWQpLAorICAgICAgbUZpZm8obVNoYXJlZCAhPSBOVUxMID8KKyAgICAgICAgbmV3IGF1ZGlvX3V0aWxzX2ZpZm8oc2l6ZSwgc2l6ZW9mKHVpbnQ4X3QpLAorICAgICAgICAgICAgbVNoYXJlZC0+bUJ1ZmZlciwgbVNoYXJlZC0+bVJlYXIsIE5VTEwgLyp0aHJvdHRsZXNGcm9udCovKSA6IE5VTEwpLAorICAgICAgbUZpZm9Xcml0ZXIobUZpZm8gIT0gTlVMTCA/IG5ldyBhdWRpb191dGlsc19maWZvX3dyaXRlcigqbUZpZm8pIDogTlVMTCkKK3sKK30KKwordm9pZCBNZXJnZXI6OmFkZFJlYWRlcihjb25zdCBzcDxSZWFkZXI+ICZyZWFkZXIpCit7CisgICAgLy8gRklYTUUgVGhpcyBpcyBjYWxsZWQgYnkgYmluZGVyIHRocmVhZCBpbiBNZWRpYUxvZ1NlcnZpY2U6OnJlZ2lzdGVyV3JpdGVyCisgICAgLy8gICAgICAgYnV0IHRoZSBhY2Nlc3MgdG8gc2hhcmVkIHZhcmlhYmxlIG1SZWFkZXJzIGlzIG5vdCB5ZXQgcHJvdGVjdGVkIGJ5IGEgbG9jay4KKyAgICBtUmVhZGVycy5wdXNoX2JhY2socmVhZGVyKTsKK30KKworLy8gaXRlbXMgcGxhY2VkIGluIHByaW9yaXR5IHF1ZXVlIGR1cmluZyBtZXJnZQorLy8gY29tcG9zZWQgYnkgYSB0aW1lc3RhbXAgYW5kIHRoZSBpbmRleCBvZiB0aGUgc25hcHNob3Qgd2hlcmUgdGhlIHRpbWVzdGFtcCBjYW1lIGZyb20KK3N0cnVjdCBNZXJnZUl0ZW0KK3sKKyAgICBpbnQ2NF90IHRzOworICAgIGludCBpbmRleDsKKyAgICBNZXJnZUl0ZW0oaW50NjRfdCB0cywgaW50IGluZGV4KTogdHModHMpLCBpbmRleChpbmRleCkge30KK307CisKK2Jvb2wgb3BlcmF0b3I+KGNvbnN0IHN0cnVjdCBNZXJnZUl0ZW0gJmkxLCBjb25zdCBzdHJ1Y3QgTWVyZ2VJdGVtICZpMikKK3sKKyAgICByZXR1cm4gaTEudHMgPiBpMi50cyB8fCAoaTEudHMgPT0gaTIudHMgJiYgaTEuaW5kZXggPiBpMi5pbmRleCk7Cit9CisKKy8vIE1lcmdlIHJlZ2lzdGVyZWQgcmVhZGVycywgc29ydGVkIGJ5IHRpbWVzdGFtcCwgYW5kIHdyaXRlIGRhdGEgdG8gYSBzaW5nbGUgRklGTyBpbiBsb2NhbCBtZW1vcnkKK3ZvaWQgTWVyZ2VyOjptZXJnZSgpCit7CisgICAgaWYgKHRydWUpIHJldHVybjsgLy8gTWVyZ2luZyBpcyBub3QgbmVjZXNzYXJ5IGF0IHRoZSBtb21lbnQsIHNvIHRoaXMgaXMgdG8gZGlzYWJsZSBpdAorICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBieXBhc3MgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgbWVtYmVyIHZhcmlhYmxlcyBub3QgYmVpbmcgdXNlZC4KKyAgICBjb25zdCBpbnQgbkxvZ3MgPSBtUmVhZGVycy5zaXplKCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90Pj4gc25hcHNob3RzKG5Mb2dzKTsKKyAgICBzdGQ6OnZlY3RvcjxFbnRyeUl0ZXJhdG9yPiBvZmZzZXRzOworICAgIG9mZnNldHMucmVzZXJ2ZShuTG9ncyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTG9nczsgKytpKSB7CisgICAgICAgIHNuYXBzaG90c1tpXSA9IG1SZWFkZXJzW2ldLT5nZXRTbmFwc2hvdCgpOworICAgICAgICBvZmZzZXRzLnB1c2hfYmFjayhzbmFwc2hvdHNbaV0tPmJlZ2luKCkpOworICAgIH0KKyAgICAvLyBpbml0aWFsaXplIG9mZnNldHMKKyAgICAvLyBUT0RPIGN1c3RvbSBoZWFwIGltcGxlbWVudGF0aW9uIGNvdWxkIGFsbG93IHRvIHVwZGF0ZSB0b3AsIGltcHJvdmluZyBwZXJmb3JtYW5jZQorICAgIC8vIGZvciBidXJzdHkgYnVmZmVycworICAgIHN0ZDo6cHJpb3JpdHlfcXVldWU8TWVyZ2VJdGVtLCBzdGQ6OnZlY3RvcjxNZXJnZUl0ZW0+LCBzdGQ6OmdyZWF0ZXI8TWVyZ2VJdGVtPj4gdGltZXN0YW1wczsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Mb2dzOyArK2kpCisgICAgeworICAgICAgICBpZiAob2Zmc2V0c1tpXSAhPSBzbmFwc2hvdHNbaV0tPmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QWJzdHJhY3RFbnRyeT4gYWJzdHJhY3RFbnRyeSA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpXSk7CisgICAgICAgICAgICBpZiAoYWJzdHJhY3RFbnRyeSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aW1lc3RhbXBzLmVtcGxhY2UoYWJzdHJhY3RFbnRyeS0+dGltZXN0YW1wKCksIGkpOworICAgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKCF0aW1lc3RhbXBzLmVtcHR5KCkpIHsKKyAgICAgICAgaW50IGluZGV4ID0gdGltZXN0YW1wcy50b3AoKS5pbmRleDsgICAgIC8vIGZpbmQgbWluaW11bSB0aW1lc3RhbXAKKyAgICAgICAgLy8gY29weSBpdCB0byB0aGUgbG9nLCBpbmNyZWFzaW5nIG9mZnNldAorICAgICAgICBvZmZzZXRzW2luZGV4XSA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpbmRleF0pLT4KKyAgICAgICAgICAgIGNvcHlXaXRoQXV0aG9yKG1GaWZvV3JpdGVyLCBpbmRleCk7CisgICAgICAgIC8vIHVwZGF0ZSBkYXRhIHN0cnVjdHVyZXMKKyAgICAgICAgdGltZXN0YW1wcy5wb3AoKTsKKyAgICAgICAgaWYgKG9mZnNldHNbaW5kZXhdICE9IHNuYXBzaG90c1tpbmRleF0tPmVuZCgpKSB7CisgICAgICAgICAgICBpbnQ2NF90IHRzID0gQWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShvZmZzZXRzW2luZGV4XSktPnRpbWVzdGFtcCgpOworICAgICAgICAgICAgdGltZXN0YW1wcy5lbXBsYWNlKHRzLCBpbmRleCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPHNwPFJlYWRlcj4+JiBNZXJnZXI6OmdldFJlYWRlcnMoKSBjb25zdAoreworICAgIC8vQXV0b011dGV4IF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbVJlYWRlcnM7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNZXJnZVJlYWRlcjo6TWVyZ2VSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgTWVyZ2VyICZtZXJnZXIpCisgICAgOiBSZWFkZXIoc2hhcmVkLCBzaXplLCAiTWVyZ2VSZWFkZXIiKSwgbVJlYWRlcnMobWVyZ2VyLmdldFJlYWRlcnMoKSkKK3sKK30KKworLy8gVGFrZXMgcmF3IGNvbnRlbnQgb2YgdGhlIGxvY2FsIG1lcmdlciBGSUZPLCBwcm9jZXNzZXMgbG9nIGVudHJpZXMsIGFuZAorLy8gd3JpdGVzIHRoZSBkYXRhIHRvIGEgbWFwIG9mIGNsYXNzIFBlcmZvcm1hbmNlQW5hbHlzaXMsIGJhc2VkIG9uIHRoZWlyIHRocmVhZCBJRC4KK3ZvaWQgTWVyZ2VSZWFkZXI6OnByb2Nlc3NTbmFwc2hvdChTbmFwc2hvdCAmc25hcHNob3QsIGludCBhdXRob3IpCit7CisgICAgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YSYgZGF0YSA9IG1UaHJlYWRQZXJmb3JtYW5jZURhdGFbYXV0aG9yXTsKKyAgICAvLyBXZSBkb24ndCBkbyAiYXV0byBpdCIgYmVjYXVzZSBpdCByZWR1Y2VzIHJlYWRhYmlsaXR5IGluIHRoaXMgY2FzZS4KKyAgICBmb3IgKEVudHJ5SXRlcmF0b3IgaXQgPSBzbmFwc2hvdC5iZWdpbigpOyBpdCAhPSBzbmFwc2hvdC5lbmQoKTsgKytpdCkgeworICAgICAgICBzd2l0Y2ggKGl0LT50eXBlKSB7CisgICAgICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTOiB7CisgICAgICAgICAgICBjb25zdCBIaXN0VHNFbnRyeSBwYXlsb2FkID0gaXQucGF5bG9hZDxIaXN0VHNFbnRyeT4oKTsKKyAgICAgICAgICAgIC8vIFRPRE86IGhhc2ggZm9yIGhpc3RvZ3JhbSB0cyBhbmQgYXVkaW8gc3RhdGUgbmVlZCB0byBtYXRjaAorICAgICAgICAgICAgLy8gYW5kIGNvcnJlc3BvbmQgdG8gYXVkaW8gcHJvZHVjdGlvbiBzb3VyY2UgZmlsZSBsb2NhdGlvbgorICAgICAgICAgICAgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXNbYXV0aG9yXVswIC8qaGFzaCovXS5sb2dUc0VudHJ5KHBheWxvYWQudHMpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX0FVRElPX1NUQVRFOiB7CisgICAgICAgICAgICBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpc1thdXRob3JdWzAgLypoYXNoKi9dLmhhbmRsZVN0YXRlQ2hhbmdlKCk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfVEhSRUFEX0lORk86IHsKKyAgICAgICAgICAgIGNvbnN0IHRocmVhZF9pbmZvX3QgaW5mbyA9IGl0LnBheWxvYWQ8dGhyZWFkX2luZm9fdD4oKTsKKyAgICAgICAgICAgIGRhdGEudGhyZWFkSW5mbyA9IGluZm87CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfVEhSRUFEX1BBUkFNUzogeworICAgICAgICAgICAgY29uc3QgdGhyZWFkX3BhcmFtc190IHBhcmFtcyA9IGl0LnBheWxvYWQ8dGhyZWFkX3BhcmFtc190PigpOworICAgICAgICAgICAgZGF0YS50aHJlYWRQYXJhbXMgPSBwYXJhbXM7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfTEFURU5DWTogeworICAgICAgICAgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IGl0LnBheWxvYWQ8ZG91YmxlPigpOworICAgICAgICAgICAgZGF0YS5sYXRlbmN5SGlzdC5hZGQobGF0ZW5jeU1zKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9XT1JLX1RJTUU6IHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbW9ub3RvbmljTnMgPSBpdC5wYXlsb2FkPGludDY0X3Q+KCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbW9ub3RvbmljTXMgPSBtb25vdG9uaWNOcyAqIDFlLTY7CisgICAgICAgICAgICBkYXRhLndvcmtIaXN0LmFkZChtb25vdG9uaWNNcyk7CisgICAgICAgICAgICBkYXRhLmFjdGl2ZSArPSBtb25vdG9uaWNOczsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9XQVJNVVBfVElNRTogeworICAgICAgICAgICAgY29uc3QgZG91YmxlIHRpbWVNcyA9IGl0LnBheWxvYWQ8ZG91YmxlPigpOworICAgICAgICAgICAgZGF0YS53YXJtdXBIaXN0LmFkZCh0aW1lTXMpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1VOREVSUlVOOiB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRzID0gaXQucGF5bG9hZDxpbnQ2NF90PigpOworICAgICAgICAgICAgZGF0YS51bmRlcnJ1bnMrKzsKKyAgICAgICAgICAgIGRhdGEuc25hcHNob3RzLmVtcGxhY2VfZnJvbnQoRVZFTlRfVU5ERVJSVU4sIHRzKTsKKyAgICAgICAgICAgIC8vIFRPRE8gaGF2ZSBhIGRhdGEgc3RydWN0dXJlIHRvIGF1dG9tYXRpY2FsbHkgaGFuZGxlIHJlc2l6aW5nCisgICAgICAgICAgICBpZiAoZGF0YS5zbmFwc2hvdHMuc2l6ZSgpID4gUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YTo6a01heFNuYXBzaG90c1RvU3RvcmUpIHsKKyAgICAgICAgICAgICAgICBkYXRhLnNuYXBzaG90cy5wb3BfYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX09WRVJSVU46IHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdHMgPSBpdC5wYXlsb2FkPGludDY0X3Q+KCk7CisgICAgICAgICAgICBkYXRhLm92ZXJydW5zKys7CisgICAgICAgICAgICBkYXRhLnNuYXBzaG90cy5lbXBsYWNlX2Zyb250KEVWRU5UX1VOREVSUlVOLCB0cyk7CisgICAgICAgICAgICAvLyBUT0RPIGhhdmUgYSBkYXRhIHN0cnVjdHVyZSB0byBhdXRvbWF0aWNhbGx5IGhhbmRsZSByZXNpemluZworICAgICAgICAgICAgaWYgKGRhdGEuc25hcHNob3RzLnNpemUoKSA+IFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGE6OmtNYXhTbmFwc2hvdHNUb1N0b3JlKSB7CisgICAgICAgICAgICAgICAgZGF0YS5zbmFwc2hvdHMucG9wX2JhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9SRVNFUlZFRDoKKyAgICAgICAgY2FzZSBFVkVOVF9VUFBFUl9CT1VORDoKKyAgICAgICAgICAgIEFMT0dXKCJ3YXJuaW5nOiB1bmV4cGVjdGVkIGV2ZW50ICVkIiwgaXQtPnR5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNZXJnZVJlYWRlcjo6Z2V0QW5kUHJvY2Vzc1NuYXBzaG90KCkKK3sKKyAgICAvLyBnZXQgYSBzbmFwc2hvdCBvZiBlYWNoIHJlYWRlciBhbmQgcHJvY2VzcyB0aGVtCisgICAgLy8gVE9ETyBpbnNlcnQgbG9jayBoZXJlCisgICAgY29uc3Qgc2l6ZV90IG5Mb2dzID0gbVJlYWRlcnMuc2l6ZSgpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4+IHNuYXBzaG90cyhuTG9ncyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuTG9nczsgaSsrKSB7CisgICAgICAgIHNuYXBzaG90c1tpXSA9IG1SZWFkZXJzW2ldLT5nZXRTbmFwc2hvdCgpOworICAgIH0KKyAgICAvLyBUT0RPIHVubG9jayBsb2NrIGhlcmUKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5Mb2dzOyBpKyspIHsKKyAgICAgICAgaWYgKHNuYXBzaG90c1tpXSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBwcm9jZXNzU25hcHNob3QoKihzbmFwc2hvdHNbaV0pLCBpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjaGVja1B1c2hUb01lZGlhTWV0cmljcygpOworfQorCit2b2lkIE1lcmdlUmVhZGVyOjpjaGVja1B1c2hUb01lZGlhTWV0cmljcygpCit7CisgICAgY29uc3QgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgZm9yIChhdXRvJiBpdGVtIDogbVRocmVhZFBlcmZvcm1hbmNlRGF0YSkgeworICAgICAgICBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VEYXRhJiBkYXRhID0gaXRlbS5zZWNvbmQ7CisgICAgICAgIGlmIChub3cgLSBkYXRhLnN0YXJ0ID49IGtQZXJpb2RpY01lZGlhTWV0cmljc1B1c2gpIHsKKyAgICAgICAgICAgICh2b2lkKVJlcG9ydFBlcmZvcm1hbmNlOjpzZW5kVG9NZWRpYU1ldHJpY3MoZGF0YSk7CisgICAgICAgICAgICBkYXRhLnJlc2V0KCk7ICAgLy8gZGF0YSBpcyBwZXJzaXN0ZW50IHBlciB0aHJlYWQKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNZXJnZVJlYWRlcjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit7CisgICAgLy8gVE9ETzogYWRkIGEgbXV0ZXggYXJvdW5kIG1lZGlhLmxvZyBkdW1wCisgICAgLy8gT3B0aW9ucyBmb3IgZHVtcHN5cworICAgIGJvb2wgcGEgPSBmYWxzZSwganNvbiA9IGZhbHNlLCBwbG90cyA9IGZhbHNlLCByZXRybyA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byAmYXJnIDogYXJncykgeworICAgICAgICBpZiAoYXJnID09IFN0cmluZzE2KCItLXBhIikpIHsKKyAgICAgICAgICAgIHBhID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmcgPT0gU3RyaW5nMTYoIi0tanNvbiIpKSB7CisgICAgICAgICAgICBqc29uID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmcgPT0gU3RyaW5nMTYoIi0tcGxvdHMiKSkgeworICAgICAgICAgICAgcGxvdHMgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGFyZyA9PSBTdHJpbmcxNigiLS1yZXRybyIpKSB7CisgICAgICAgICAgICByZXRybyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBhKSB7CisgICAgICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wKGZkLCAwIC8qaW5kZW50Ki8sIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzKTsKKyAgICB9CisgICAgaWYgKGpzb24pIHsKKyAgICAgICAgUmVwb3J0UGVyZm9ybWFuY2U6OmR1bXBKc29uKGZkLCBtVGhyZWFkUGVyZm9ybWFuY2VEYXRhKTsKKyAgICB9CisgICAgaWYgKHBsb3RzKSB7CisgICAgICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wUGxvdHMoZmQsIG1UaHJlYWRQZXJmb3JtYW5jZURhdGEpOworICAgIH0KKyAgICBpZiAocmV0cm8pIHsKKyAgICAgICAgUmVwb3J0UGVyZm9ybWFuY2U6OmR1bXBSZXRybyhmZCwgbVRocmVhZFBlcmZvcm1hbmNlRGF0YSk7CisgICAgfQorfQorCit2b2lkIE1lcmdlUmVhZGVyOjpoYW5kbGVBdXRob3IoY29uc3QgQWJzdHJhY3RFbnRyeSAmZW50cnksIFN0cmluZzggKmJvZHkpCit7CisgICAgaW50IGF1dGhvciA9IGVudHJ5LmF1dGhvcigpOworICAgIGlmIChhdXRob3IgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBGSVhNRSBOZWVkcyBhIGxvY2sKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gbVJlYWRlcnNbYXV0aG9yXS0+bmFtZSgpLmNfc3RyKCk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlczogIiwgbmFtZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNZXJnZVRocmVhZDo6TWVyZ2VUaHJlYWQoTWVyZ2VyICZtZXJnZXIsIE1lcmdlUmVhZGVyICZtZXJnZVJlYWRlcikKKyAgICA6IG1NZXJnZXIobWVyZ2VyKSwKKyAgICAgIG1NZXJnZVJlYWRlcihtZXJnZVJlYWRlciksCisgICAgICBtVGltZW91dFVzKDApCit7Cit9CisKK01lcmdlVGhyZWFkOjp+TWVyZ2VUaHJlYWQoKQoreworICAgIC8vIHNldCBleGl0IGZsYWcsIHNldCB0aW1lb3V0IHRvIDAgdG8gZm9yY2UgdGhyZWFkTG9vcCB0byBleGl0IGFuZCB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIGpvaW4KKyAgICByZXF1ZXN0RXhpdCgpOworICAgIHNldFRpbWVvdXRVcygwKTsKKyAgICBqb2luKCk7Cit9CisKK2Jvb2wgTWVyZ2VUaHJlYWQ6OnRocmVhZExvb3AoKQoreworICAgIGJvb2wgZG9NZXJnZTsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOworICAgICAgICAvLyBJZiBtVGltZW91dFVzIGlzIG5lZ2F0aXZlLCB3YWl0IG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgdW50aWwgaXQncyBwb3NpdGl2ZS4KKyAgICAgICAgLy8gSWYgaXQncyBwb3NpdGl2ZSwgbWVyZ2UuIFRoZSBtaW5pbXVtIHBlcmlvZCBiZXR3ZWVuIHdha2luZyB0aGUgY29uZGl0aW9uIHZhcmlhYmxlCisgICAgICAgIC8vIGlzIGhhbmRsZWQgaW4gQXVkaW9GbGluZ2VyOjpNZWRpYUxvZ05vdGlmaWVyOjp0aHJlYWRMb29wKCkuCisgICAgICAgIG1Db25kLndhaXQobU11dGV4KTsKKyAgICAgICAgZG9NZXJnZSA9IG1UaW1lb3V0VXMgPiAwOworICAgICAgICBtVGltZW91dFVzIC09IGtUaHJlYWRTbGVlcFBlcmlvZFVzOworICAgIH0KKyAgICBpZiAoZG9NZXJnZSkgeworICAgICAgICAvLyBNZXJnZSBkYXRhIGZyb20gYWxsIHRoZSByZWFkZXJzCisgICAgICAgIG1NZXJnZXIubWVyZ2UoKTsKKyAgICAgICAgLy8gUHJvY2VzcyB0aGUgZGF0YSBjb2xsZWN0ZWQgYnkgbU1lcmdlciBhbmQgd3JpdGUgaXQgdG8gUGVyZm9ybWFuY2VBbmFseXNpcworICAgICAgICAvLyBGSVhNRTogZGVjaWRlIHdoZXRoZXIgdG8gY2FsbCBnZXRBbmRQcm9jZXNzU25hcHNob3QgZXZlcnkgdGltZQorICAgICAgICAvLyBvciB3aGV0aGVyIHRvIGhhdmUgYSBzZXBhcmF0ZSB0aHJlYWQgdGhhdCBjYWxscyBpdCB3aXRoIGEgbG93ZXIgZnJlcXVlbmN5CisgICAgICAgIG1NZXJnZVJlYWRlci5nZXRBbmRQcm9jZXNzU25hcHNob3QoKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTWVyZ2VUaHJlYWQ6Ondha2V1cCgpCit7CisgICAgc2V0VGltZW91dFVzKGtUaHJlYWRXYWtldXBQZXJpb2RVcyk7Cit9CisKK3ZvaWQgTWVyZ2VUaHJlYWQ6OnNldFRpbWVvdXRVcyhpbnQgdGltZSkKK3sKKyAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKKyAgICBtVGltZW91dFVzID0gdGltZTsKKyAgICBtQ29uZC5zaWduYWwoKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9OQkxvZy5jcHAgYi9tZWRpYS9saWJuYmxvZy9OQkxvZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZmEzZTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibmJsb2cvTkJMb2cuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoKLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk5CTG9nIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNsaW1pdHM+Ci0jaW5jbHVkZSA8ZGVxdWU+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8bnVtZXJpYz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8bmV3PgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3JvdW5kdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgotI2luY2x1ZGUgPG1lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oPgotI2luY2x1ZGUgPHV0aWxzL0NhbGxTdGFjay5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgPHF1ZXVlPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotaW50IE5CTG9nOjpFbnRyeTo6Y29weUVudHJ5RGF0YUF0KHNpemVfdCBvZmZzZXQpIGNvbnN0Ci17Ci0gICAgLy8gRklYTUUgVGhpcyBpcyB0b28gc2xvdwotICAgIGlmIChvZmZzZXQgPT0gMCkKLSAgICAgICAgcmV0dXJuIG1FdmVudDsKLSAgICBlbHNlIGlmIChvZmZzZXQgPT0gMSkKLSAgICAgICAgcmV0dXJuIG1MZW5ndGg7Ci0gICAgZWxzZSBpZiAob2Zmc2V0IDwgKHNpemVfdCkgKG1MZW5ndGggKyAyKSkKLSAgICAgICAgcmV0dXJuICgoY2hhciAqKSBtRGF0YSlbb2Zmc2V0IC0gMl07Ci0gICAgZWxzZSBpZiAob2Zmc2V0ID09IChzaXplX3QpIChtTGVuZ3RoICsgMikpCi0gICAgICAgIHJldHVybiBtTGVuZ3RoOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKnN0YXRpYyovCi1zdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OkFic3RyYWN0RW50cnk+IE5CTG9nOjpBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cikgewotICAgIGNvbnN0IHVpbnQ4X3QgdHlwZSA9IEVudHJ5SXRlcmF0b3IocHRyKS0+dHlwZTsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIEVWRU5UX1NUQVJUX0ZNVDoKLSAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8Rm9ybWF0RW50cnk+KEZvcm1hdEVudHJ5KHB0cikpOwotICAgIGNhc2UgRVZFTlRfQVVESU9fU1RBVEU6Ci0gICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFM6Ci0gICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEhpc3RvZ3JhbUVudHJ5PihIaXN0b2dyYW1FbnRyeShwdHIpKTsKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVygiVHJpZWQgdG8gY3JlYXRlIEFic3RyYWN0RW50cnkgb2YgdHlwZSAlZCIsIHR5cGUpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci19Ci0KLU5CTG9nOjpBYnN0cmFjdEVudHJ5OjpBYnN0cmFjdEVudHJ5KGNvbnN0IHVpbnQ4X3QgKmVudHJ5KSA6IG1FbnRyeShlbnRyeSkgewotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OkZvcm1hdEVudHJ5OjpiZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpOwotfQotCi1jb25zdCBjaGFyICpOQkxvZzo6Rm9ybWF0RW50cnk6OmZvcm1hdFN0cmluZygpIGNvbnN0IHsKLSAgICByZXR1cm4gKGNvbnN0IGNoYXIqKSBtRW50cnkgKyBvZmZzZXRvZihlbnRyeSwgZGF0YSk7Ci19Ci0KLXNpemVfdCBOQkxvZzo6Rm9ybWF0RW50cnk6OmZvcm1hdFN0cmluZ0xlbmd0aCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUVudHJ5W29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXTsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OkZvcm1hdEVudHJ5OjphcmdzKCkgY29uc3QgewotICAgIGF1dG8gaXQgPSBiZWdpbigpOwotICAgIC8vIHNraXAgc3RhcnQgZm10Ci0gICAgKytpdDsKLSAgICAvLyBza2lwIHRpbWVzdGFtcAotICAgICsraXQ7Ci0gICAgLy8gc2tpcCBoYXNoCi0gICAgKytpdDsKLSAgICAvLyBTa2lwIGF1dGhvciBpZiBwcmVzZW50Ci0gICAgaWYgKGl0LT50eXBlID09IEVWRU5UX0FVVEhPUikgewotICAgICAgICArK2l0OwotICAgIH0KLSAgICByZXR1cm4gaXQ7Ci19Ci0KLWludDY0X3QgTkJMb2c6OkZvcm1hdEVudHJ5Ojp0aW1lc3RhbXAoKSBjb25zdCB7Ci0gICAgYXV0byBpdCA9IGJlZ2luKCk7Ci0gICAgLy8gc2tpcCBzdGFydCBmbXQKLSAgICArK2l0OwotICAgIHJldHVybiBpdC5wYXlsb2FkPGludDY0X3Q+KCk7Ci19Ci0KLU5CTG9nOjpsb2dfaGFzaF90IE5CTG9nOjpGb3JtYXRFbnRyeTo6aGFzaCgpIGNvbnN0IHsKLSAgICBhdXRvIGl0ID0gYmVnaW4oKTsKLSAgICAvLyBza2lwIHN0YXJ0IGZtdAotICAgICsraXQ7Ci0gICAgLy8gc2tpcCB0aW1lc3RhbXAKLSAgICArK2l0OwotICAgIC8vIHVuYWxpZ25lZCA2NC1iaXQgcmVhZCBub3Qgc3VwcG9ydGVkCi0gICAgbG9nX2hhc2hfdCBoYXNoOwotICAgIG1lbWNweSgmaGFzaCwgaXQtPmRhdGEsIHNpemVvZihoYXNoKSk7Ci0gICAgcmV0dXJuIGhhc2g7Ci19Ci0KLWludCBOQkxvZzo6Rm9ybWF0RW50cnk6OmF1dGhvcigpIGNvbnN0IHsKLSAgICBhdXRvIGl0ID0gYmVnaW4oKTsKLSAgICAvLyBza2lwIHN0YXJ0IGZtdAotICAgICsraXQ7Ci0gICAgLy8gc2tpcCB0aW1lc3RhbXAKLSAgICArK2l0OwotICAgIC8vIHNraXAgaGFzaAotICAgICsraXQ7Ci0gICAgLy8gaWYgdGhlcmUgaXMgYW4gYXV0aG9yIGVudHJ5LCByZXR1cm4gaXQsIHJldHVybiAtMSBvdGhlcndpc2UKLSAgICBpZiAoaXQtPnR5cGUgPT0gRVZFTlRfQVVUSE9SKSB7Ci0gICAgICAgIHJldHVybiBpdC5wYXlsb2FkPGludD4oKTsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6Rm9ybWF0RW50cnk6OmNvcHlXaXRoQXV0aG9yKAotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsIGludCBhdXRob3IpIGNvbnN0IHsKLSAgICBhdXRvIGl0ID0gYmVnaW4oKTsKLSAgICAvLyBjb3B5IGZtdCBzdGFydCBlbnRyeQotICAgIGl0LmNvcHlUbyhkc3QpOwotICAgIC8vIGNvcHkgdGltZXN0YW1wCi0gICAgKCsraXQpLmNvcHlUbyhkc3QpOyAgICAvLyBjb3B5IGhhc2gKLSAgICAoKytpdCkuY29weVRvKGRzdCk7Ci0gICAgLy8gaW5zZXJ0IGF1dGhvciBlbnRyeQotICAgIHNpemVfdCBhdXRob3JFbnRyeVNpemUgPSBOQkxvZzo6RW50cnk6OmtPdmVyaGVhZCArIHNpemVvZihhdXRob3IpOwotICAgIHVpbnQ4X3QgYXV0aG9yRW50cnlbYXV0aG9yRW50cnlTaXplXTsKLSAgICBhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgdHlwZSldID0gRVZFTlRfQVVUSE9SOwotICAgIGF1dGhvckVudHJ5W29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSA9Ci0gICAgICAgIGF1dGhvckVudHJ5W2F1dGhvckVudHJ5U2l6ZSArIE5CTG9nOjpFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSA9Ci0gICAgICAgIHNpemVvZihhdXRob3IpOwotICAgICooaW50KikgKCZhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgZGF0YSldKSA9IGF1dGhvcjsKLSAgICBkc3QtPndyaXRlKGF1dGhvckVudHJ5LCBhdXRob3JFbnRyeVNpemUpOwotICAgIC8vIGNvcHkgcmVzdCBvZiBlbnRyaWVzCi0gICAgd2hpbGUgKCgrK2l0KS0+dHlwZSAhPSBFVkVOVF9FTkRfRk1UKSB7Ci0gICAgICAgIGl0LmNvcHlUbyhkc3QpOwotICAgIH0KLSAgICBpdC5jb3B5VG8oZHN0KTsKLSAgICArK2l0OwotICAgIHJldHVybiBpdDsKLX0KLQotdm9pZCBOQkxvZzo6RW50cnlJdGVyYXRvcjo6Y29weVRvKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCkgY29uc3QgewotICAgIHNpemVfdCBsZW5ndGggPSBwdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsgTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQ7Ci0gICAgZHN0LT53cml0ZShwdHIsIGxlbmd0aCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkVudHJ5SXRlcmF0b3I6OmNvcHlEYXRhKHVpbnQ4X3QgKmRzdCkgY29uc3QgewotICAgIG1lbWNweSgodm9pZCopIGRzdCwgcHRyICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpLCBwdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldKTsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoKQotICAgIDogcHRyKG51bGxwdHIpIHt9Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKGNvbnN0IHVpbnQ4X3QgKmVudHJ5KQotICAgIDogcHRyKGVudHJ5KSB7fQotCi1OQkxvZzo6RW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcihjb25zdCBOQkxvZzo6RW50cnlJdGVyYXRvciAmb3RoZXIpCi0gICAgOiBwdHIob3RoZXIucHRyKSB7fQotCi1jb25zdCBOQkxvZzo6ZW50cnkmIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvciooKSBjb25zdCB7Ci0gICAgcmV0dXJuICooZW50cnkqKSBwdHI7Ci19Ci0KLWNvbnN0IE5CTG9nOjplbnRyeSogTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLT4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIChlbnRyeSopIHB0cjsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3ImIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvcisrKCkgewotICAgIHB0ciArPSBwdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsgTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQ7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciYgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLS0oKSB7Ci0gICAgcHRyIC09IHB0cltOQkxvZzo6RW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gKyBOQkxvZzo6RW50cnk6OmtPdmVyaGVhZDsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpuZXh0KCkgY29uc3QgewotICAgIEVudHJ5SXRlcmF0b3IgYXV4KCp0aGlzKTsKLSAgICByZXR1cm4gKythdXg7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpwcmV2KCkgY29uc3QgewotICAgIEVudHJ5SXRlcmF0b3IgYXV4KCp0aGlzKTsKLSAgICByZXR1cm4gLS1hdXg7Ci19Ci0KLWludCBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3ItKGNvbnN0IE5CTG9nOjpFbnRyeUl0ZXJhdG9yICZvdGhlcikgY29uc3QgewotICAgIHJldHVybiBwdHIgLSBvdGhlci5wdHI7Ci19Ci0KLWJvb2wgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yIT0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gcHRyICE9IG90aGVyLnB0cjsKLX0KLQotYm9vbCBOQkxvZzo6RW50cnlJdGVyYXRvcjo6aGFzQ29uc2lzdGVudExlbmd0aCgpIGNvbnN0IHsKLSAgICByZXR1cm4gcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSA9PSBwdHJbcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArCi0gICAgICAgIE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkICsgTkJMb2c6OkVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW50NjRfdCBOQkxvZzo6SGlzdG9ncmFtRW50cnk6OnRpbWVzdGFtcCgpIGNvbnN0IHsKLSAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLnBheWxvYWQ8SGlzdFRzRW50cnk+KCkudHM7Ci19Ci0KLU5CTG9nOjpsb2dfaGFzaF90IE5CTG9nOjpIaXN0b2dyYW1FbnRyeTo6aGFzaCgpIGNvbnN0IHsKLSAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLnBheWxvYWQ8SGlzdFRzRW50cnk+KCkuaGFzaDsKLX0KLQotaW50IE5CTG9nOjpIaXN0b2dyYW1FbnRyeTo6YXV0aG9yKCkgY29uc3QgewotICAgIEVudHJ5SXRlcmF0b3IgaXQobUVudHJ5KTsKLSAgICBpZiAoaXQtPmxlbmd0aCA9PSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKSkgewotICAgICAgICByZXR1cm4gaXQucGF5bG9hZDxIaXN0VHNFbnRyeVdpdGhBdXRob3I+KCkuYXV0aG9yOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpIaXN0b2dyYW1FbnRyeTo6Y29weVdpdGhBdXRob3IoCi0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwgaW50IGF1dGhvcikgY29uc3QgewotICAgIC8vIEN1cnJlbnQgaGlzdG9ncmFtIGVudHJ5IGhhcyB7dHlwZSwgbGVuZ3RoLCBzdHJ1Y3QgSGlzdFRzRW50cnksIGxlbmd0aH0uCi0gICAgLy8gV2Ugbm93IHdhbnQge3R5cGUsIGxlbmd0aCwgc3RydWN0IEhpc3RUc0VudHJ5V2l0aEF1dGhvciwgbGVuZ3RofQotICAgIHVpbnQ4X3QgYnVmZmVyW0VudHJ5OjprT3ZlcmhlYWQgKyBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKV07Ci0gICAgLy8gQ29weSBjb250ZW50IHVudGlsIHRoZSBwb2ludCB3ZSB3YW50IHRvIGFkZCB0aGUgYXV0aG9yCi0gICAgbWVtY3B5KGJ1ZmZlciwgbUVudHJ5LCBzaXplb2YoZW50cnkpICsgc2l6ZW9mKEhpc3RUc0VudHJ5KSk7Ci0gICAgLy8gQ29weSB0aGUgYXV0aG9yCi0gICAgKihpbnQqKSAoYnVmZmVyICsgc2l6ZW9mKGVudHJ5KSArIHNpemVvZihIaXN0VHNFbnRyeSkpID0gYXV0aG9yOwotICAgIC8vIFVwZGF0ZSBsZW5ndGhzCi0gICAgYnVmZmVyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSA9IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpOwotICAgIGJ1ZmZlcltvZmZzZXRvZihlbnRyeSwgZGF0YSkgKyBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKSArIG9mZnNldG9mKGVuZGluZywgbGVuZ3RoKV0KLSAgICAgICAgPSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKTsKLSAgICAvLyBXcml0ZSBuZXcgYnVmZmVyIGludG8gRklGTwotICAgIGRzdC0+d3JpdGUoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5uZXh0KCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgMCAgIC8vIEZJWE1FIHNlZSBub3RlIGluIE5CTG9nLmgKLU5CTG9nOjpUaW1lbGluZTo6VGltZWxpbmUoc2l6ZV90IHNpemUsIHZvaWQgKnNoYXJlZCkKLSAgICA6IG1TaXplKHJvdW5kdXAoc2l6ZSkpLCBtT3duKHNoYXJlZCA9PSBOVUxMKSwKLSAgICAgIG1TaGFyZWQoKFNoYXJlZCAqKSAobU93biA/IG5ldyBjaGFyW3NoYXJlZFNpemUoc2l6ZSldIDogc2hhcmVkKSkKLXsKLSAgICBuZXcgKG1TaGFyZWQpIFNoYXJlZDsKLX0KLQotTkJMb2c6OlRpbWVsaW5lOjp+VGltZWxpbmUoKQotewotICAgIG1TaGFyZWQtPn5TaGFyZWQoKTsKLSAgICBpZiAobU93bikgewotICAgICAgICBkZWxldGVbXSAoY2hhciAqKSBtU2hhcmVkOwotICAgIH0KLX0KLSNlbmRpZgotCi0vKnN0YXRpYyovCi1zaXplX3QgTkJMb2c6OlRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemVfdCBzaXplKQotewotICAgIC8vIFRPRE8gZmlmbyBub3cgc3VwcG9ydHMgbm9uLXBvd2VyLW9mLTIgYnVmZmVyIHNpemVzLCBzbyBjb3VsZCByZW1vdmUgdGhlIHJvdW5kdXAKLSAgICByZXR1cm4gc2l6ZW9mKFNoYXJlZCkgKyByb3VuZHVwKHNpemUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTkJMb2c6OldyaXRlcjo6V3JpdGVyKCkKLSAgICA6IG1TaGFyZWQoTlVMTCksIG1GaWZvKE5VTEwpLCBtRmlmb1dyaXRlcihOVUxMKSwgbUVuYWJsZWQoZmFsc2UpLCBtUGlkVGFnKE5VTEwpLCBtUGlkVGFnU2l6ZSgwKQotewotfQotCi1OQkxvZzo6V3JpdGVyOjpXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSkKLSAgICA6IG1TaGFyZWQoKFNoYXJlZCAqKSBzaGFyZWQpLAotICAgICAgbUZpZm8obVNoYXJlZCAhPSBOVUxMID8KLSAgICAgICAgbmV3IGF1ZGlvX3V0aWxzX2ZpZm8oc2l6ZSwgc2l6ZW9mKHVpbnQ4X3QpLAotICAgICAgICAgICAgbVNoYXJlZC0+bUJ1ZmZlciwgbVNoYXJlZC0+bVJlYXIsIE5VTEwgLyp0aHJvdHRsZXNGcm9udCovKSA6IE5VTEwpLAotICAgICAgbUZpZm9Xcml0ZXIobUZpZm8gIT0gTlVMTCA/IG5ldyBhdWRpb191dGlsc19maWZvX3dyaXRlcigqbUZpZm8pIDogTlVMTCksCi0gICAgICBtRW5hYmxlZChtRmlmb1dyaXRlciAhPSBOVUxMKQotewotICAgIC8vIGNhY2hpbmcgcGlkIGFuZCBwcm9jZXNzIG5hbWUKLSAgICBwaWRfdCBpZCA9IDo6Z2V0cGlkKCk7Ci0gICAgY2hhciBwcm9jTmFtZVsxNl07Ci0gICAgaW50IHN0YXR1cyA9IHByY3RsKFBSX0dFVF9OQU1FLCBwcm9jTmFtZSk7Ci0gICAgaWYgKHN0YXR1cykgeyAgLy8gZXJyb3IgZ2V0dGluZyBwcm9jZXNzIG5hbWUKLSAgICAgICAgcHJvY05hbWVbMF0gPSAnXDAnOwotICAgIH0KLSAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKHByb2NOYW1lKTsKLSAgICBtUGlkVGFnU2l6ZSA9IGxlbmd0aCArIHNpemVvZihwaWRfdCk7Ci0gICAgbVBpZFRhZyA9IG5ldyBjaGFyW21QaWRUYWdTaXplXTsKLSAgICBtZW1jcHkobVBpZFRhZywgJmlkLCBzaXplb2YocGlkX3QpKTsKLSAgICBtZW1jcHkobVBpZFRhZyArIHNpemVvZihwaWRfdCksIHByb2NOYW1lLCBsZW5ndGgpOwotfQotCi1OQkxvZzo6V3JpdGVyOjpXcml0ZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplKQotICAgIDogV3JpdGVyKGlNZW1vcnkgIT0gMCA/IChTaGFyZWQgKikgaU1lbW9yeS0+cG9pbnRlcigpIDogTlVMTCwgc2l6ZSkKLXsKLSAgICBtSU1lbW9yeSA9IGlNZW1vcnk7Ci19Ci0KLU5CTG9nOjpXcml0ZXI6On5Xcml0ZXIoKQotewotICAgIGRlbGV0ZSBtRmlmb1dyaXRlcjsKLSAgICBkZWxldGUgbUZpZm87Ci0gICAgZGVsZXRlW10gbVBpZFRhZzsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2coY29uc3QgY2hhciAqc3RyaW5nKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0cmluZyA9PSBOVUxMLCAiQXR0ZW1wdGVkIHRvIGxvZyBOVUxMIHN0cmluZyIpOwotICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4oc3RyaW5nKTsKLSAgICBpZiAobGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKLSAgICAgICAgbGVuZ3RoID0gRW50cnk6OmtNYXhMZW5ndGg7Ci0gICAgfQotICAgIGxvZyhFVkVOVF9TVFJJTkcsIHN0cmluZywgbGVuZ3RoKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB2YV9saXN0IGFwOwotICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwotICAgIFdyaXRlcjo6bG9ndmYoZm10LCBhcCk7ICAgICAvLyB0aGUgV3JpdGVyOjogaXMgbmVlZGVkIHRvIGF2b2lkIHZpcnR1YWwgZGlzcGF0Y2ggZm9yIExvY2tlZFdyaXRlcgotICAgIHZhX2VuZChhcCk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjaGFyIGJ1ZmZlcltFbnRyeTo6a01heExlbmd0aCArIDEgLypOVUwqL107Ci0gICAgaW50IGxlbmd0aCA9IHZzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCBmbXQsIGFwKTsKLSAgICBpZiAobGVuZ3RoID49IChpbnQpIHNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgIGxlbmd0aCA9IHNpemVvZihidWZmZXIpIC0gMTsKLSAgICAgICAgLy8gTlVMIHRlcm1pbmF0aW9uIGlzIG5vdCByZXF1aXJlZAotICAgICAgICAvLyBidWZmZXJbbGVuZ3RoXSA9ICdcMCc7Ci0gICAgfQotICAgIGlmIChsZW5ndGggPj0gMCkgewotICAgICAgICBsb2coRVZFTlRfU1RSSU5HLCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgfQotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1RpbWVzdGFtcCgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludDY0X3QgdHMgPSBnZXRfbW9ub3RvbmljX25zKCk7Ci0gICAgaWYgKHRzID4gMCkgewotICAgICAgICBsb2coRVZFTlRfVElNRVNUQU1QLCAmdHMsIHNpemVvZih0cykpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHRpbWVzdGFtcCIpOwotICAgIH0KLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dUaW1lc3RhbXAoY29uc3QgaW50NjRfdCB0cykKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX1RJTUVTVEFNUCwgJnRzLCBzaXplb2YodHMpKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dJbnRlZ2VyKGNvbnN0IGludCB4KQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2coRVZFTlRfSU5URUdFUiwgJngsIHNpemVvZih4KSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nRmxvYXQoY29uc3QgZmxvYXQgeCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX0ZMT0FULCAmeCwgc2l6ZW9mKHgpKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dQSUQoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2coRVZFTlRfUElELCBtUGlkVGFnLCBtUGlkVGFnU2l6ZSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nU3RhcnQoY29uc3QgY2hhciAqZm10KQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKGZtdCk7Ci0gICAgaWYgKGxlbmd0aCA+IEVudHJ5OjprTWF4TGVuZ3RoKSB7Ci0gICAgICAgIGxlbmd0aCA9IEVudHJ5OjprTWF4TGVuZ3RoOwotICAgIH0KLSAgICBsb2coRVZFTlRfU1RBUlRfRk1ULCBmbXQsIGxlbmd0aCk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nRW5kKCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRW50cnkgZW50cnkgPSBFbnRyeShFVkVOVF9FTkRfRk1ULCBOVUxMLCAwKTsKLSAgICBsb2coJmVudHJ5LCB0cnVlKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX0hBU0gsICZoYXNoLCBzaXplb2YoaGFzaCkpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0V2ZW50SGlzdFRzKEV2ZW50IGV2ZW50LCBsb2dfaGFzaF90IGhhc2gpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEhpc3RUc0VudHJ5IGRhdGE7Ci0gICAgZGF0YS5oYXNoID0gaGFzaDsKLSAgICBkYXRhLnRzID0gZ2V0X21vbm90b25pY19ucygpOwotICAgIGlmIChkYXRhLnRzID4gMCkgewotICAgICAgICBsb2coZXZlbnQsICZkYXRhLCBzaXplb2YoZGF0YSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHRpbWVzdGFtcCIpOwotICAgIH0KLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIC4uLikKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB2YV9saXN0IGFwOwotICAgIHZhX3N0YXJ0KGFwLCBoYXNoKTsKLSAgICBXcml0ZXI6OmxvZ1ZGb3JtYXQoZm10LCBoYXNoLCBhcCk7Ci0gICAgdmFfZW5kKGFwKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dWRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCB2YV9saXN0IGFyZ3ApCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIFdyaXRlcjo6bG9nU3RhcnQoZm10KTsKLSAgICBpbnQgaTsKLSAgICBkb3VibGUgZjsKLSAgICBjaGFyKiBzOwotICAgIGludDY0X3QgdDsKLSAgICBXcml0ZXI6OmxvZ1RpbWVzdGFtcCgpOwotICAgIFdyaXRlcjo6bG9nSGFzaChoYXNoKTsKLSAgICBmb3IgKGNvbnN0IGNoYXIgKnAgPSBmbXQ7ICpwICE9ICdcMCc7IHArKykgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgbW9yZSBjb21wbGV4IGZvcm1hdHRpbmcgc3VjaCBhcyAlLjNmCi0gICAgICAgIGlmICgqcCAhPSAnJScpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCgqKytwKSB7Ci0gICAgICAgIGNhc2UgJ3MnOiAvLyBzdHJpbmcKLSAgICAgICAgICAgIHMgPSB2YV9hcmcoYXJncCwgY2hhciAqKTsKLSAgICAgICAgICAgIFdyaXRlcjo6bG9nKHMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAndCc6IC8vIHRpbWVzdGFtcAotICAgICAgICAgICAgdCA9IHZhX2FyZyhhcmdwLCBpbnQ2NF90KTsKLSAgICAgICAgICAgIFdyaXRlcjo6bG9nVGltZXN0YW1wKHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnZCc6IC8vIGludGVnZXIKLSAgICAgICAgICAgIGkgPSB2YV9hcmcoYXJncCwgaW50KTsKLSAgICAgICAgICAgIFdyaXRlcjo6bG9nSW50ZWdlcihpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ2YnOiAvLyBmbG9hdAotICAgICAgICAgICAgZiA9IHZhX2FyZyhhcmdwLCBkb3VibGUpOyAvLyBmbG9hdCBhcmd1bWVudHMgYXJlIHByb21vdGVkIHRvIGRvdWJsZSBpbiB2YXJhcmcgbGlzdHMKLSAgICAgICAgICAgIFdyaXRlcjo6bG9nRmxvYXQoKGZsb2F0KWYpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAncCc6IC8vIHBpZAotICAgICAgICAgICAgV3JpdGVyOjpsb2dQSUQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIHRoZSAiJVwwIiBjYXNlIGZpbmlzaGVzIHBhcnNpbmcKLSAgICAgICAgY2FzZSAnXDAnOgotICAgICAgICAgICAgLS1wOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnJSc6Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coIk5CTG9nIFdyaXRlciBwYXJzZWQgaW52YWxpZCBmb3JtYXQgc3BlY2lmaWVyOiAlYyIsICpwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIFdyaXRlcjo6bG9nRW5kKCk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nKEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoZGF0YSA9PSBOVUxMIHx8IGxlbmd0aCA+IEVudHJ5OjprTWF4TGVuZ3RoKSB7Ci0gICAgICAgIC8vIFRPRE8gUGVyaGFwcyBpdCBtYWtlcyBzZW5zZSB0byBkaXNwbGF5IHRydW5jYXRlZCBkYXRhIG9yIGF0IGxlYXN0IGEKLSAgICAgICAgLy8gICAgICBtZXNzYWdlIHRoYXQgdGhlIGRhdGEgaXMgdG9vIGxvbmc/ICBUaGUgY3VycmVudCBiZWhhdmlvciBjYW4gY3JlYXRlCi0gICAgICAgIC8vICAgICAgYSBjb25mdXNpb24gZm9yIGEgcHJvZ3JhbW1lciBkZWJ1Z2dpbmcgdGhlaXIgY29kZS4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBJZ25vcmUgaWYgaW52YWxpZCBldmVudAotICAgIGlmIChldmVudCA9PSBFVkVOVF9SRVNFUlZFRCB8fCBldmVudCA+PSBFVkVOVF9VUFBFUl9CT1VORCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEVudHJ5IGV0cihldmVudCwgZGF0YSwgbGVuZ3RoKTsKLSAgICBsb2coJmV0ciwgdHJ1ZSAvKnRydXN0ZWQqLyk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nKGNvbnN0IE5CTG9nOjpFbnRyeSAqZXRyLCBib29sIHRydXN0ZWQpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghdHJ1c3RlZCkgewotICAgICAgICBsb2coZXRyLT5tRXZlbnQsIGV0ci0+bURhdGEsIGV0ci0+bUxlbmd0aCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc2l6ZV90IG5lZWQgPSBldHItPm1MZW5ndGggKyBFbnRyeTo6a092ZXJoZWFkOyAgICAvLyBtRXZlbnQsIG1MZW5ndGgsIGRhdGFbbUxlbmd0aF0sIG1MZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgPSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBGSUZPCi0KLSAgICAvLyBGSVhNRSBvcHRpbWl6ZSB0aGlzIHVzaW5nIG1lbWNweSBmb3IgdGhlIGRhdGEgcGFydCBvZiB0aGUgRW50cnkuCi0gICAgLy8gVGhlIEVudHJ5IGNvdWxkIGhhdmUgYSBtZXRob2QgY29weVRvKHB0ciwgb2Zmc2V0LCBzaXplKSB0byBvcHRpbWl6ZSB0aGUgY29weS4KLSAgICAvLyBjaGVja3Mgc2l6ZSBvZiBhIHNpbmdsZSBsb2cgRW50cnk6IHR5cGUsIGxlbmd0aCwgZGF0YSBwb2ludGVyIGFuZCBlbmRpbmcKLSAgICB1aW50OF90IHRlbXBbRW50cnk6OmtNYXhMZW5ndGggKyBFbnRyeTo6a092ZXJoZWFkXTsKLSAgICAvLyB3cml0ZSB0aGlzIGRhdGEgdG8gdGVtcCBhcnJheQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmVlZDsgaSsrKSB7Ci0gICAgICAgIHRlbXBbaV0gPSBldHItPmNvcHlFbnRyeURhdGFBdChpKTsKLSAgICB9Ci0gICAgLy8gd3JpdGUgdG8gY2lyY3VsYXIgYnVmZmVyCi0gICAgbUZpZm9Xcml0ZXItPndyaXRlKHRlbXAsIG5lZWQpOwotfQotCi1ib29sIE5CTG9nOjpXcml0ZXI6OmlzRW5hYmxlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1FbmFibGVkOwotfQotCi1ib29sIE5CTG9nOjpXcml0ZXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQotewotICAgIGJvb2wgb2xkID0gbUVuYWJsZWQ7Ci0gICAgbUVuYWJsZWQgPSBlbmFibGVkICYmIG1TaGFyZWQgIT0gTlVMTDsKLSAgICByZXR1cm4gb2xkOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTkJMb2c6OkxvY2tlZFdyaXRlcjo6TG9ja2VkV3JpdGVyKCkKLSAgICA6IFdyaXRlcigpCi17Ci19Ci0KLU5CTG9nOjpMb2NrZWRXcml0ZXI6OkxvY2tlZFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQotICAgIDogV3JpdGVyKHNoYXJlZCwgc2l6ZSkKLXsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2coY29uc3QgY2hhciAqc3RyaW5nKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2coc3RyaW5nKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotICAgIC8vIEZJWE1FIHNob3VsZCBub3QgdGFrZSB0aGUgbG9jayB1bnRpbCBhZnRlciBmb3JtYXR0aW5nIGlzIGRvbmUKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHZhX2xpc3QgYXA7Ci0gICAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gICAgV3JpdGVyOjpsb2d2ZihmbXQsIGFwKTsKLSAgICB2YV9lbmQoYXApOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ3ZmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKLXsKLSAgICAvLyBGSVhNRSBzaG91bGQgbm90IHRha2UgdGhlIGxvY2sgdW50aWwgYWZ0ZXIgZm9ybWF0dGluZyBpcyBkb25lCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ3ZmKGZtdCwgYXApOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ1RpbWVzdGFtcCgpCi17Ci0gICAgLy8gRklYTUUgc2hvdWxkIG5vdCB0YWtlIHRoZSBsb2NrIHVudGlsIGFmdGVyIHRoZSBjbG9ja19nZXR0aW1lKCkgc3lzY2FsbAotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dUaW1lc3RhbXAoKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dUaW1lc3RhbXAoY29uc3QgaW50NjRfdCB0cykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nVGltZXN0YW1wKHRzKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dJbnRlZ2VyKGNvbnN0IGludCB4KQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dJbnRlZ2VyKHgpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ0Zsb2F0KGNvbnN0IGZsb2F0IHgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ0Zsb2F0KHgpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ1BJRCgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ1BJRCgpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nU3RhcnQoZm10KTsKLX0KLQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ0VuZCgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ0VuZCgpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ0hhc2gobG9nX2hhc2hfdCBoYXNoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dIYXNoKGhhc2gpOwotfQotCi1ib29sIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmlzRW5hYmxlZCgpIGNvbnN0Ci17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gV3JpdGVyOjppc0VuYWJsZWQoKTsKLX0KLQotYm9vbCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBXcml0ZXI6OnNldEVuYWJsZWQoZW5hYmxlZCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jb25zdCBzdGQ6OnNldDxOQkxvZzo6RXZlbnQ+IE5CTG9nOjpSZWFkZXI6OnN0YXJ0aW5nVHlwZXMge05CTG9nOjpFdmVudDo6RVZFTlRfU1RBUlRfRk1ULAotICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywKLSAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9BVURJT19TVEFURX07Ci1jb25zdCBzdGQ6OnNldDxOQkxvZzo6RXZlbnQ+IE5CTG9nOjpSZWFkZXI6OmVuZGluZ1R5cGVzICAge05CTG9nOjpFdmVudDo6RVZFTlRfRU5EX0ZNVCwKLSAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMsCi0gICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfQVVESU9fU1RBVEV9OwotCi1OQkxvZzo6UmVhZGVyOjpSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSkKLSAgICA6IG1GZCgtMSksIG1JbmRlbnQoMCksIG1Mb3N0KDApLAotICAgICAgbVNoYXJlZCgoLypjb25zdCovIFNoYXJlZCAqKSBzaGFyZWQpLCAvKm1JTWVtb3J5Ki8KLSAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/Ci0gICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKLSAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKLSAgICAgIG1GaWZvUmVhZGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIoKm1GaWZvKSA6IE5VTEwpCi17Ci19Ci0KLU5CTG9nOjpSZWFkZXI6OlJlYWRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpCi0gICAgOiBSZWFkZXIoaU1lbW9yeSAhPSAwID8gKFNoYXJlZCAqKSBpTWVtb3J5LT5wb2ludGVyKCkgOiBOVUxMLCBzaXplKQotewotICAgIG1JTWVtb3J5ID0gaU1lbW9yeTsKLX0KLQotTkJMb2c6OlJlYWRlcjo6flJlYWRlcigpCi17Ci0gICAgZGVsZXRlIG1GaWZvUmVhZGVyOwotICAgIGRlbGV0ZSBtRmlmbzsKLX0KLQotY29uc3QgdWludDhfdCAqTkJMb2c6OlJlYWRlcjo6ZmluZExhc3RFbnRyeU9mVHlwZXMoY29uc3QgdWludDhfdCAqZnJvbnQsIGNvbnN0IHVpbnQ4X3QgKmJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PEV2ZW50PiAmdHlwZXMpIHsKLSAgICB3aGlsZSAoYmFjayArIEVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXQgPj0gZnJvbnQpIHsKLSAgICAgICAgY29uc3QgdWludDhfdCAqcHJldiA9IGJhY2sgLSBiYWNrW0VudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdIC0gRW50cnk6OmtPdmVyaGVhZDsKLSAgICAgICAgaWYgKHByZXYgPCBmcm9udCB8fCBwcmV2ICsgcHJldltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudHJ5OjprT3ZlcmhlYWQgIT0gYmFjaykgewotCi0gICAgICAgICAgICAvLyBwcmV2IHBvaW50cyB0byBhbiBvdXQgb2YgbGltaXRzIG9yIGluY29uc2lzdGVudCBlbnRyeQotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGVzLmZpbmQoKGNvbnN0IEV2ZW50KSBwcmV2W29mZnNldG9mKGVudHJ5LCB0eXBlKV0pICE9IHR5cGVzLmVuZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJldjsKLSAgICAgICAgfQotICAgICAgICBiYWNrID0gcHJldjsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGxwdHI7IC8vIG5vIGVudHJ5IGZvdW5kCi19Ci0KLS8vIENvcGllcyBjb250ZW50IG9mIGEgUmVhZGVyIEZJRk8gaW50byBpdHMgU25hcHNob3QKLS8vIFRoZSBTbmFwc2hvdCBoYXMgdGhlIHNhbWUgcmF3IGRhdGEsIGJ1dCByZXByZXNlbnRlZCBhcyBhIHNlcXVlbmNlIG9mIGVudHJpZXMKLS8vIGFuZCBhbiBFbnRyeUl0ZXJhdG9yIG1ha2luZyBpdCBwb3NzaWJsZSB0byBwcm9jZXNzIHRoZSBkYXRhLgotc3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90PiBOQkxvZzo6UmVhZGVyOjpnZXRTbmFwc2hvdCgpCi17Ci0gICAgaWYgKG1GaWZvUmVhZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdD4obmV3IFNuYXBzaG90KCkpOwotICAgIH0KLSAgICAvLyBtYWtlIGEgY29weSB0byBhdm9pZCByYWNlIGNvbmRpdGlvbiB3aXRoIHdyaXRlcgotICAgIHNpemVfdCBjYXBhY2l0eSA9IG1GaWZvLT5jYXBhY2l0eSgpOwotCi0gICAgLy8gVGhpcyBlbXVsYXRlcyB0aGUgYmVoYXZpb3VyIG9mIGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyOjpyZWFkLCBidXQgd2l0aG91dCBpbmNyZW1lbnRpbmcgdGhlCi0gICAgLy8gcmVhZGVyIGluZGV4LiBUaGUgaW5kZXggaXMgaW5jcmVtZW50ZWQgYWZ0ZXIgaGFuZGxpbmcgY29ycnVwdGlvbiwgdG8gYWZ0ZXIgdGhlIGxhc3QgY29tcGxldGUKLSAgICAvLyBlbnRyeSBvZiB0aGUgYnVmZmVyCi0gICAgc2l6ZV90IGxvc3Q7Ci0gICAgYXVkaW9fdXRpbHNfaW92ZWMgaW92ZWNbMl07Ci0gICAgc3NpemVfdCBhdmFpbFRvUmVhZCA9IG1GaWZvUmVhZGVyLT5vYnRhaW4oaW92ZWMsIGNhcGFjaXR5LCBOVUxMIC8qdGltZW91dCovLCAmbG9zdCk7Ci0gICAgaWYgKGF2YWlsVG9SZWFkIDw9IDApIHsKLSAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdD4obmV3IFNuYXBzaG90KCkpOwotICAgIH0KLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gc25hcHNob3QobmV3IFNuYXBzaG90KGF2YWlsVG9SZWFkKSk7Ci0gICAgbWVtY3B5KHNuYXBzaG90LT5tRGF0YSwgKGNvbnN0IGNoYXIgKikgbUZpZm8tPmJ1ZmZlcigpICsgaW92ZWNbMF0ubU9mZnNldCwgaW92ZWNbMF0ubUxlbmd0aCk7Ci0gICAgaWYgKGlvdmVjWzFdLm1MZW5ndGggPiAwKSB7Ci0gICAgICAgIG1lbWNweShzbmFwc2hvdC0+bURhdGEgKyAoaW92ZWNbMF0ubUxlbmd0aCksCi0gICAgICAgICAgICAoY29uc3QgY2hhciAqKSBtRmlmby0+YnVmZmVyKCkgKyBpb3ZlY1sxXS5tT2Zmc2V0LCBpb3ZlY1sxXS5tTGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvLyBIYW5kbGUgY29ycnVwdGVkIGJ1ZmZlcgotICAgIC8vIFBvdGVudGlhbGx5LCBhIGJ1ZmZlciBoYXMgY29ycnVwdGVkIGRhdGEgb24gYm90aCBiZWdpbm5pbmcgKGR1ZSB0byBvdmVyZmxvdykgYW5kIGVuZAotICAgIC8vIChkdWUgdG8gaW5jb21wbGV0ZSBmb3JtYXQgZW50cnkpLiBCdXQgZXZlbiBpZiB0aGUgZW5kIGZvcm1hdCBlbnRyeSBpcyBpbmNvbXBsZXRlLAotICAgIC8vIGl0IGVuZHMgaW4gYSBjb21wbGV0ZSBlbnRyeSAod2hpY2ggaXMgbm90IGFuIEVORF9GTVQpLiBTbyBpcyBzYWZlIHRvIHRyYXZlcnNlIGJhY2t3YXJkcy4KLSAgICAvLyBUT0RPOiBoYW5kbGUgY2xpZW50IGNvcnJ1cHRpb24gKGluIHRoZSBtaWRkbGUgb2YgYSBidWZmZXIpCi0KLSAgICBjb25zdCB1aW50OF90ICpiYWNrID0gc25hcHNob3QtPm1EYXRhICsgYXZhaWxUb1JlYWQ7Ci0gICAgY29uc3QgdWludDhfdCAqZnJvbnQgPSBzbmFwc2hvdC0+bURhdGE7Ci0KLSAgICAvLyBGaW5kIGxhc3QgRU5EX0ZNVC4gPGJhY2s+IGlzIHNpdHRpbmcgb24gYW4gZW50cnkgd2hpY2ggbWlnaHQgYmUgdGhlIG1pZGRsZSBvZiBhIEZvcm1hdEVudHJ5LgotICAgIC8vIFdlIGdvIGJhY2t3YXJkcyB1bnRpbCB3ZSBmaW5kIGFuIEVWRU5UX0VORF9GTVQuCi0gICAgY29uc3QgdWludDhfdCAqbGFzdEVuZCA9IGZpbmRMYXN0RW50cnlPZlR5cGVzKGZyb250LCBiYWNrLCBlbmRpbmdUeXBlcyk7Ci0gICAgaWYgKGxhc3RFbmQgPT0gbnVsbHB0cikgewotICAgICAgICBzbmFwc2hvdC0+bUVuZCA9IHNuYXBzaG90LT5tQmVnaW4gPSBFbnRyeUl0ZXJhdG9yKGZyb250KTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBlbmQgb2Ygc25hcHNob3QgcG9pbnRzIHRvIGFmdGVyIGxhc3QgRU5EX0ZNVCBlbnRyeQotICAgICAgICBzbmFwc2hvdC0+bUVuZCA9IEVudHJ5SXRlcmF0b3IobGFzdEVuZCkubmV4dCgpOwotICAgICAgICAvLyBmaW5kIGZpcnN0IFNUQVJUX0ZNVAotICAgICAgICBjb25zdCB1aW50OF90ICpmaXJzdFN0YXJ0ID0gbnVsbHB0cjsKLSAgICAgICAgY29uc3QgdWludDhfdCAqZmlyc3RTdGFydFRtcCA9IHNuYXBzaG90LT5tRW5kOwotICAgICAgICB3aGlsZSAoKGZpcnN0U3RhcnRUbXAgPSBmaW5kTGFzdEVudHJ5T2ZUeXBlcyhmcm9udCwgZmlyc3RTdGFydFRtcCwgc3RhcnRpbmdUeXBlcykpCi0gICAgICAgICAgICAgICAgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgZmlyc3RTdGFydCA9IGZpcnN0U3RhcnRUbXA7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZmlyc3RTdGFydCBpcyBudWxsIGlmIG5vIFNUQVJUX0ZNVCBlbnRyeSB3YXMgZm91bmQgYmVmb3JlIGxhc3RFbmQKLSAgICAgICAgaWYgKGZpcnN0U3RhcnQgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgc25hcHNob3QtPm1CZWdpbiA9IHNuYXBzaG90LT5tRW5kOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc25hcHNob3QtPm1CZWdpbiA9IEVudHJ5SXRlcmF0b3IoZmlyc3RTdGFydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBhZHZhbmNlIGZpZm8gcmVhZGVyIGluZGV4IHRvIGFmdGVyIGxhc3QgZW50cnkgcmVhZC4KLSAgICBtRmlmb1JlYWRlci0+cmVsZWFzZShzbmFwc2hvdC0+bUVuZCAtIGZyb250KTsKLQotICAgIHNuYXBzaG90LT5tTG9zdCA9IGxvc3Q7Ci0gICAgcmV0dXJuIHNuYXBzaG90OwotCi19Ci0KLS8vIFRha2VzIHJhdyBjb250ZW50IG9mIHRoZSBsb2NhbCBtZXJnZXIgRklGTywgcHJvY2Vzc2VzIGxvZyBlbnRyaWVzLCBhbmQKLS8vIHdyaXRlcyB0aGUgZGF0YSB0byBhIG1hcCBvZiBjbGFzcyBQZXJmb3JtYW5jZUFuYWx5c2lzLCBiYXNlZCBvbiB0aGVpciB0aHJlYWQgSUQuCi12b2lkIE5CTG9nOjpNZXJnZVJlYWRlcjo6Z2V0QW5kUHJvY2Vzc1NuYXBzaG90KE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90ICZzbmFwc2hvdCkKLXsKLSAgICBTdHJpbmc4IHRpbWVzdGFtcCwgYm9keTsKLQotICAgIGZvciAoYXV0byBlbnRyeSA9IHNuYXBzaG90LmJlZ2luKCk7IGVudHJ5ICE9IHNuYXBzaG90LmVuZCgpOykgewotICAgICAgICBzd2l0Y2ggKGVudHJ5LT50eXBlKSB7Ci0gICAgICAgIGNhc2UgRVZFTlRfU1RBUlRfRk1UOgotICAgICAgICAgICAgZW50cnkgPSBoYW5kbGVGb3JtYXQoRm9ybWF0RW50cnkoZW50cnkpLCAmdGltZXN0YW1wLCAmYm9keSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFM6IHsKLSAgICAgICAgICAgIEhpc3RUc0VudHJ5V2l0aEF1dGhvciAqZGF0YSA9IChIaXN0VHNFbnRyeVdpdGhBdXRob3IgKikgKGVudHJ5LT5kYXRhKTsKLSAgICAgICAgICAgIC8vIFRPRE8gVGhpcyBtZW1jcGllcyBhcmUgaGVyZSB0byBhdm9pZCB1bmFsaWduZWQgbWVtb3J5IGFjY2VzcyBjcmFzaC4KLSAgICAgICAgICAgIC8vIFRoZXJlJ3MgcHJvYmFibHkgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZG8gaXQKLSAgICAgICAgICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICAgICAgICAgIG1lbWNweSgmaGFzaCwgJihkYXRhLT5oYXNoKSwgc2l6ZW9mKGhhc2gpKTsKLSAgICAgICAgICAgIGludDY0X3QgdHM7Ci0gICAgICAgICAgICBtZW1jcHkoJnRzLCAmZGF0YS0+dHMsIHNpemVvZih0cykpOwotICAgICAgICAgICAgLy8gVE9ETzogaGFzaCBmb3IgaGlzdG9ncmFtIHRzIGFuZCBhdWRpbyBzdGF0ZSBuZWVkIHRvIG1hdGNoCi0gICAgICAgICAgICAvLyBhbmQgY29ycmVzcG9uZCB0byBhdWRpbyBwcm9kdWN0aW9uIHNvdXJjZSBmaWxlIGxvY2F0aW9uCi0gICAgICAgICAgICBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpc1tkYXRhLT5hdXRob3JdWzAgLypoYXNoKi9dLmxvZ1RzRW50cnkodHMpOwotICAgICAgICAgICAgKytlbnRyeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRVZFTlRfQVVESU9fU1RBVEU6IHsKLSAgICAgICAgICAgIEhpc3RUc0VudHJ5V2l0aEF1dGhvciAqZGF0YSA9IChIaXN0VHNFbnRyeVdpdGhBdXRob3IgKikgKGVudHJ5LT5kYXRhKTsKLSAgICAgICAgICAgIC8vIFRPRE8gVGhpcyBtZW1jcGllcyBhcmUgaGVyZSB0byBhdm9pZCB1bmFsaWduZWQgbWVtb3J5IGFjY2VzcyBjcmFzaC4KLSAgICAgICAgICAgIC8vIFRoZXJlJ3MgcHJvYmFibHkgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZG8gaXQKLSAgICAgICAgICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICAgICAgICAgIG1lbWNweSgmaGFzaCwgJihkYXRhLT5oYXNoKSwgc2l6ZW9mKGhhc2gpKTsKLSAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0cyBpZiB1bnVzZWQKLSAgICAgICAgICAgIGludDY0X3QgdHM7Ci0gICAgICAgICAgICBtZW1jcHkoJnRzLCAmZGF0YS0+dHMsIHNpemVvZih0cykpOwotICAgICAgICAgICAgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXNbZGF0YS0+YXV0aG9yXVswIC8qaGFzaCovXS5oYW5kbGVTdGF0ZUNoYW5nZSgpOwotICAgICAgICAgICAgKytlbnRyeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRVZFTlRfRU5EX0ZNVDoKLSAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJ3YXJuaW5nOiBnb3QgdG8gZW5kIGZvcm1hdCBldmVudCIpOwotICAgICAgICAgICAgKytlbnRyeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVWRU5UX1JFU0VSVkVEOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIndhcm5pbmc6IHVuZXhwZWN0ZWQgZXZlbnQgJWQiLCBlbnRyeS0+dHlwZSk7Ci0gICAgICAgICAgICArK2VudHJ5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gRklYTUU6IGRlY2lkZSB3aGV0aGVyIHRvIHByaW50IHRoZSB3YXJuaW5ncyBoZXJlIG9yIGVsc2V3aGVyZQotICAgIGlmICghYm9keS5pc0VtcHR5KCkpIHsKLSAgICAgICAgZHVtcExpbmUodGltZXN0YW1wLCBib2R5KTsKLSAgICB9Ci19Ci0KLXZvaWQgTkJMb2c6Ok1lcmdlUmVhZGVyOjpnZXRBbmRQcm9jZXNzU25hcHNob3QoKQotewotICAgIC8vIGdldCBhIHNuYXBzaG90LCBwcm9jZXNzIGl0Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBzbmFwID0gZ2V0U25hcHNob3QoKTsKLSAgICBnZXRBbmRQcm9jZXNzU25hcHNob3QoKnNuYXApOwotfQotCi12b2lkIE5CTG9nOjpNZXJnZVJlYWRlcjo6ZHVtcChpbnQgZmQsIGludCBpbmRlbnQpIHsKLSAgICAvLyBUT0RPOiBhZGQgYSBtdXRleCBhcm91bmQgbWVkaWEubG9nIGR1bXAKLSAgICBSZXBvcnRQZXJmb3JtYW5jZTo6ZHVtcChmZCwgaW5kZW50LCBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpcyk7Ci19Ci0KLS8vIFdyaXRlcyBhIHN0cmluZyB0byB0aGUgY29uc29sZQotdm9pZCBOQkxvZzo6UmVhZGVyOjpkdW1wTGluZShjb25zdCBTdHJpbmc4ICZ0aW1lc3RhbXAsIFN0cmluZzggJmJvZHkpCi17Ci0gICAgaWYgKG1GZCA+PSAwKSB7Ci0gICAgICAgIGRwcmludGYobUZkLCAiJS4qcyVzICVzXG4iLCBtSW5kZW50LCAiIiwgdGltZXN0YW1wLnN0cmluZygpLCBib2R5LnN0cmluZygpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HSSgiJS4qcyVzICVzIiwgbUluZGVudCwgIiIsIHRpbWVzdGFtcC5zdHJpbmcoKSwgYm9keS5zdHJpbmcoKSk7Ci0gICAgfQotICAgIGJvZHkuY2xlYXIoKTsKLX0KLQotYm9vbCBOQkxvZzo6UmVhZGVyOjppc0lNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGlNZW1vcnkgIT0gMCAmJiBtSU1lbW9yeSAhPSAwICYmIGlNZW1vcnktPnBvaW50ZXIoKSA9PSBtSU1lbW9yeS0+cG9pbnRlcigpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBOQkxvZzo6YXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpIHsKLSAgICBpbnQ2NF90IHRzOwotICAgIG1lbWNweSgmdHMsIGRhdGEsIHNpemVvZih0cykpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiWyVkLiUwM2RdIiwgKGludCkgKHRzIC8gKDEwMDAgKiAxMDAwICogMTAwMCkpLAotICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzIC8gKDEwMDAgKiAxMDAwKSkgJSAxMDAwKSk7Ci19Ci0KLXZvaWQgTkJMb2c6OmFwcGVuZEludChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKSB7Ci0gICAgaW50IHggPSAqKChpbnQqKSBkYXRhKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIjwlZD4iLCB4KTsKLX0KLQotdm9pZCBOQkxvZzo6YXBwZW5kRmxvYXQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkgewotICAgIGZsb2F0IGY7Ci0gICAgbWVtY3B5KCZmLCBkYXRhLCBzaXplb2YoZmxvYXQpKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIjwlZj4iLCBmKTsKLX0KLQotdm9pZCBOQkxvZzo6YXBwZW5kUElEKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW5ndGgpIHsKLSAgICBwaWRfdCBpZCA9ICooKHBpZF90KikgZGF0YSk7Ci0gICAgY2hhciAqIG5hbWUgPSAmKChjaGFyKikgZGF0YSlbc2l6ZW9mKHBpZF90KV07Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8UElEOiAlZCwgbmFtZTogJS4qcz4iLCBpZCwgKGludCkgKGxlbmd0aCAtIHNpemVvZihwaWRfdCkpLCBuYW1lKTsKLX0KLQotU3RyaW5nOCBOQkxvZzo6YnVmZmVyRHVtcChjb25zdCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBzaXplKQotewotICAgIFN0cmluZzggc3RyOwotICAgIHN0ci5hcHBlbmQoIlsgIik7Ci0gICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICAgIHN0ci5hcHBlbmRGb3JtYXQoIiVkICIsIGJ1ZmZlcltpXSk7Ci0gICAgfQotICAgIHN0ci5hcHBlbmQoIl0iKTsKLSAgICByZXR1cm4gc3RyOwotfQotCi1TdHJpbmc4IE5CTG9nOjpidWZmZXJEdW1wKGNvbnN0IEVudHJ5SXRlcmF0b3IgJml0KQotewotICAgIHJldHVybiBidWZmZXJEdW1wKGl0LCBpdC0+bGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZCk7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpSZWFkZXI6OmhhbmRsZUZvcm1hdChjb25zdCBGb3JtYXRFbnRyeSAmZm10RW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4ICp0aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4ICpib2R5KSB7Ci0gICAgLy8gbG9nIHRpbWVzdGFtcAotICAgIGludDY0X3QgdHMgPSBmbXRFbnRyeS50aW1lc3RhbXAoKTsKLSAgICB0aW1lc3RhbXAtPmNsZWFyKCk7Ci0gICAgdGltZXN0YW1wLT5hcHBlbmRGb3JtYXQoIlslZC4lMDNkXSIsIChpbnQpICh0cyAvICgxMDAwICogMTAwMCAqIDEwMDApKSwKLSAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cyAvICgxMDAwICogMTAwMCkpICUgMTAwMCkpOwotCi0gICAgLy8gbG9nIHVuaXF1ZSBoYXNoCi0gICAgbG9nX2hhc2hfdCBoYXNoID0gZm10RW50cnkuaGFzaCgpOwotICAgIC8vIHByaW50IG9ubHkgbG93ZXIgMTZiaXQgb2YgaGFzaCBhcyBoZXggYW5kIGxpbmUgYXMgaW50IHRvIHJlZHVjZSBzcGFtIGluIHRoZSBsb2cKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuNFgtJWQgIiwgKGludCkoaGFzaCA+PiAxNikgJiAweEZGRkYsIChpbnQpIGhhc2ggJiAweEZGRkYpOwotCi0gICAgLy8gbG9nIGF1dGhvciAoaWYgcHJlc2VudCkKLSAgICBoYW5kbGVBdXRob3IoZm10RW50cnksIGJvZHkpOwotCi0gICAgLy8gbG9nIHN0cmluZwotICAgIE5CTG9nOjpFbnRyeUl0ZXJhdG9yIGFyZyA9IGZtdEVudHJ5LmFyZ3MoKTsKLQotICAgIGNvbnN0IGNoYXIqIGZtdCA9IGZtdEVudHJ5LmZvcm1hdFN0cmluZygpOwotICAgIHNpemVfdCBmbXRfbGVuZ3RoID0gZm10RW50cnkuZm9ybWF0U3RyaW5nTGVuZ3RoKCk7Ci0KLSAgICBmb3IgKHNpemVfdCBmbXRfb2Zmc2V0ID0gMDsgZm10X29mZnNldCA8IGZtdF9sZW5ndGg7ICsrZm10X29mZnNldCkgewotICAgICAgICBpZiAoZm10W2ZtdF9vZmZzZXRdICE9ICclJykgewotICAgICAgICAgICAgYm9keS0+YXBwZW5kKCZmbXRbZm10X29mZnNldF0sIDEpOyAvLyBUT0RPIG9wdGltaXplIHRvIHdyaXRlIGNvbnNlY3V0aXZlIHN0cmluZ3MgYXQgb25jZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY2FzZSAiJSUiIgotICAgICAgICBpZiAoZm10WysrZm10X29mZnNldF0gPT0gJyUnKSB7Ci0gICAgICAgICAgICBib2R5LT5hcHBlbmQoIiUiKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNhc2UgIiVcMCIKLSAgICAgICAgaWYgKGZtdF9vZmZzZXQgPT0gZm10X2xlbmd0aCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBOQkxvZzo6RXZlbnQgZXZlbnQgPSAoTkJMb2c6OkV2ZW50KSBhcmctPnR5cGU7Ci0gICAgICAgIHNpemVfdCBsZW5ndGggPSBhcmctPmxlbmd0aDsKLQotICAgICAgICAvLyBUT0RPIGNoZWNrIGxlbmd0aCBmb3IgZXZlbnQgdHlwZSBpcyBjb3JyZWN0Ci0KLSAgICAgICAgaWYgKGV2ZW50ID09IEVWRU5UX0VORF9GTVQpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IG1vcmUgY29tcGxleCBmb3JtYXR0aW5nIHN1Y2ggYXMgJS4zZgotICAgICAgICBjb25zdCB1aW50OF90ICpkYXR1bSA9IGFyZy0+ZGF0YTsgLy8gcG9pbnRlciB0byB0aGUgY3VycmVudCBldmVudCBhcmdzCi0gICAgICAgIHN3aXRjaChmbXRbZm10X29mZnNldF0pCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAncyc6IC8vIHN0cmluZwotICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfU1RSSU5HLAotICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBzdHJpbmcgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGJvZHktPmFwcGVuZCgoY29uc3QgY2hhciopIGRhdHVtLCBsZW5ndGgpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAndCc6IC8vIHRpbWVzdGFtcAotICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfVElNRVNUQU1QLAotICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciB0aW1lc3RhbXAgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGFwcGVuZFRpbWVzdGFtcChib2R5LCBkYXR1bSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdkJzogLy8gaW50ZWdlcgotICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfSU5URUdFUiwKLSAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgaW50ZWdlciBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYXBwZW5kSW50KGJvZHksIGRhdHVtKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ2YnOiAvLyBmbG9hdAotICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfRkxPQVQsCi0gICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIGZsb2F0IHNwZWNpZmllcjogJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBhcHBlbmRGbG9hdChib2R5LCBkYXR1bSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdwJzogLy8gcGlkCi0gICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9QSUQsCi0gICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHBpZCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYXBwZW5kUElEKGJvZHksIGRhdHVtLCBsZW5ndGgpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCJOQkxvZyBSZWFkZXIgZW5jb3VudGVyZWQgdW5rbm93biBjaGFyYWN0ZXIgJWMiLCBmbXRbZm10X29mZnNldF0pOwotICAgICAgICB9Ci0gICAgICAgICsrYXJnOwotICAgIH0KLSAgICBBTE9HV19JRihhcmctPnR5cGUgIT0gRVZFTlRfRU5EX0ZNVCwgIkV4cGVjdGVkIGVuZCBvZiBmb3JtYXQsIGdvdCAlZCIsIGFyZy0+dHlwZSk7Ci0gICAgKythcmc7Ci0gICAgcmV0dXJuIGFyZzsKLX0KLQotTkJMb2c6Ok1lcmdlcjo6TWVyZ2VyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOgotICAgICAgbVNoYXJlZCgoU2hhcmVkICopIHNoYXJlZCksCi0gICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPwotICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCi0gICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCi0gICAgICBtRmlmb1dyaXRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyKCptRmlmbykgOiBOVUxMKQotICAgICAge30KLQotdm9pZCBOQkxvZzo6TWVyZ2VyOjphZGRSZWFkZXIoY29uc3QgTkJMb2c6Ok5hbWVkUmVhZGVyICZyZWFkZXIpIHsKLQotICAgIC8vIEZJWE1FIFRoaXMgaXMgY2FsbGVkIGJ5IGJpbmRlciB0aHJlYWQgaW4gTWVkaWFMb2dTZXJ2aWNlOjpyZWdpc3RlcldyaXRlcgotICAgIC8vICAgICAgIGJ1dCB0aGUgYWNjZXNzIHRvIHNoYXJlZCB2YXJpYWJsZSBtTmFtZWRSZWFkZXJzIGlzIG5vdCB5ZXQgcHJvdGVjdGVkIGJ5IGEgbG9jay4KLSAgICBtTmFtZWRSZWFkZXJzLnB1c2hfYmFjayhyZWFkZXIpOwotfQotCi0vLyBpdGVtcyBwbGFjZWQgaW4gcHJpb3JpdHkgcXVldWUgZHVyaW5nIG1lcmdlCi0vLyBjb21wb3NlZCBieSBhIHRpbWVzdGFtcCBhbmQgdGhlIGluZGV4IG9mIHRoZSBzbmFwc2hvdCB3aGVyZSB0aGUgdGltZXN0YW1wIGNhbWUgZnJvbQotc3RydWN0IE1lcmdlSXRlbQotewotICAgIGludDY0X3QgdHM7Ci0gICAgaW50IGluZGV4OwotICAgIE1lcmdlSXRlbShpbnQ2NF90IHRzLCBpbnQgaW5kZXgpOiB0cyh0cyksIGluZGV4KGluZGV4KSB7fQotfTsKLQotLy8gb3BlcmF0b3JzIG5lZWRlZCBmb3IgcHJpb3JpdHkgcXVldWUgaW4gbWVyZ2UKLS8vIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGludDY0X3QgJnQxLCBjb25zdCBpbnQ2NF90ICZ0MikgewotLy8gICAgIHJldHVybiB0MS50dl9zZWMgPiB0Mi50dl9zZWMgfHwgKHQxLnR2X3NlYyA9PSB0Mi50dl9zZWMgJiYgdDEudHZfbnNlYyA+IHQyLnR2X25zZWMpOwotLy8gfQotCi1ib29sIG9wZXJhdG9yPihjb25zdCBzdHJ1Y3QgTWVyZ2VJdGVtICZpMSwgY29uc3Qgc3RydWN0IE1lcmdlSXRlbSAmaTIpIHsKLSAgICByZXR1cm4gaTEudHMgPiBpMi50cyB8fCAoaTEudHMgPT0gaTIudHMgJiYgaTEuaW5kZXggPiBpMi5pbmRleCk7Ci19Ci0KLS8vIE1lcmdlIHJlZ2lzdGVyZWQgcmVhZGVycywgc29ydGVkIGJ5IHRpbWVzdGFtcCwgYW5kIHdyaXRlIGRhdGEgdG8gYSBzaW5nbGUgRklGTyBpbiBsb2NhbCBtZW1vcnkKLXZvaWQgTkJMb2c6Ok1lcmdlcjo6bWVyZ2UoKSB7Ci0gICAgLy8gRklYTUUgVGhpcyBpcyBjYWxsZWQgYnkgbWVyZ2UgdGhyZWFkCi0gICAgLy8gICAgICAgYnV0IHRoZSBhY2Nlc3MgdG8gc2hhcmVkIHZhcmlhYmxlIG1OYW1lZFJlYWRlcnMgaXMgbm90IHlldCBwcm90ZWN0ZWQgYnkgYSBsb2NrLgotICAgIGludCBuTG9ncyA9IG1OYW1lZFJlYWRlcnMuc2l6ZSgpOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdD4+IHNuYXBzaG90cyhuTG9ncyk7Ci0gICAgc3RkOjp2ZWN0b3I8TkJMb2c6OkVudHJ5SXRlcmF0b3I+IG9mZnNldHMobkxvZ3MpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxvZ3M7ICsraSkgewotICAgICAgICBzbmFwc2hvdHNbaV0gPSBtTmFtZWRSZWFkZXJzW2ldLnJlYWRlcigpLT5nZXRTbmFwc2hvdCgpOwotICAgICAgICBvZmZzZXRzW2ldID0gc25hcHNob3RzW2ldLT5iZWdpbigpOwotICAgIH0KLSAgICAvLyBpbml0aWFsaXplIG9mZnNldHMKLSAgICAvLyBUT0RPIGN1c3RvbSBoZWFwIGltcGxlbWVudGF0aW9uIGNvdWxkIGFsbG93IHRvIHVwZGF0ZSB0b3AsIGltcHJvdmluZyBwZXJmb3JtYW5jZQotICAgIC8vIGZvciBidXJzdHkgYnVmZmVycwotICAgIHN0ZDo6cHJpb3JpdHlfcXVldWU8TWVyZ2VJdGVtLCBzdGQ6OnZlY3RvcjxNZXJnZUl0ZW0+LCBzdGQ6OmdyZWF0ZXI8TWVyZ2VJdGVtPj4gdGltZXN0YW1wczsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Mb2dzOyArK2kpCi0gICAgewotICAgICAgICBpZiAob2Zmc2V0c1tpXSAhPSBzbmFwc2hvdHNbaV0tPmVuZCgpKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IHRzID0gQWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShvZmZzZXRzW2ldKS0+dGltZXN0YW1wKCk7Ci0gICAgICAgICAgICB0aW1lc3RhbXBzLmVtcGxhY2UodHMsIGkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgd2hpbGUgKCF0aW1lc3RhbXBzLmVtcHR5KCkpIHsKLSAgICAgICAgLy8gZmluZCBtaW5pbXVtIHRpbWVzdGFtcAotICAgICAgICBpbnQgaW5kZXggPSB0aW1lc3RhbXBzLnRvcCgpLmluZGV4OwotICAgICAgICAvLyBjb3B5IGl0IHRvIHRoZSBsb2csIGluY3JlYXNpbmcgb2Zmc2V0Ci0gICAgICAgIG9mZnNldHNbaW5kZXhdID0gQWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShvZmZzZXRzW2luZGV4XSktPmNvcHlXaXRoQXV0aG9yKG1GaWZvV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0gICAgICAgIC8vIHVwZGF0ZSBkYXRhIHN0cnVjdHVyZXMKLSAgICAgICAgdGltZXN0YW1wcy5wb3AoKTsKLSAgICAgICAgaWYgKG9mZnNldHNbaW5kZXhdICE9IHNuYXBzaG90c1tpbmRleF0tPmVuZCgpKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IHRzID0gQWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShvZmZzZXRzW2luZGV4XSktPnRpbWVzdGFtcCgpOwotICAgICAgICAgICAgdGltZXN0YW1wcy5lbXBsYWNlKHRzLCBpbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWNvbnN0IHN0ZDo6dmVjdG9yPE5CTG9nOjpOYW1lZFJlYWRlcj4mIE5CTG9nOjpNZXJnZXI6OmdldE5hbWVkUmVhZGVycygpIGNvbnN0IHsKLSAgICAvLyBGSVhNRSBUaGlzIGlzIHJldHVybmluZyBhIHJlZmVyZW5jZSB0byBhIHNoYXJlZCB2YXJpYWJsZSB0aGF0IG5lZWRzIGEgbG9jawotICAgIHJldHVybiBtTmFtZWRSZWFkZXJzOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTkJMb2c6Ok1lcmdlUmVhZGVyOjpNZXJnZVJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplLCBNZXJnZXIgJm1lcmdlcikKLSAgICA6IFJlYWRlcihzaGFyZWQsIHNpemUpLCBtTmFtZWRSZWFkZXJzKG1lcmdlci5nZXROYW1lZFJlYWRlcnMoKSkge30KLQotdm9pZCBOQkxvZzo6TWVyZ2VSZWFkZXI6OmhhbmRsZUF1dGhvcihjb25zdCBOQkxvZzo6QWJzdHJhY3RFbnRyeSAmZW50cnksIFN0cmluZzggKmJvZHkpIHsKLSAgICBpbnQgYXV0aG9yID0gZW50cnkuYXV0aG9yKCk7Ci0gICAgLy8gRklYTUUgTmVlZHMgYSBsb2NrCi0gICAgY29uc3QgY2hhciogbmFtZSA9IG1OYW1lZFJlYWRlcnNbYXV0aG9yXS5uYW1lKCk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlczogIiwgbmFtZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OQkxvZzo6TWVyZ2VUaHJlYWQ6Ok1lcmdlVGhyZWFkKE5CTG9nOjpNZXJnZXIgJm1lcmdlciwgTkJMb2c6Ok1lcmdlUmVhZGVyICZtZXJnZVJlYWRlcikKLSAgICA6IG1NZXJnZXIobWVyZ2VyKSwKLSAgICAgIG1NZXJnZVJlYWRlcihtZXJnZVJlYWRlciksCi0gICAgICBtVGltZW91dFVzKDApIHt9Ci0KLU5CTG9nOjpNZXJnZVRocmVhZDo6fk1lcmdlVGhyZWFkKCkgewotICAgIC8vIHNldCBleGl0IGZsYWcsIHNldCB0aW1lb3V0IHRvIDAgdG8gZm9yY2UgdGhyZWFkTG9vcCB0byBleGl0IGFuZCB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIGpvaW4KLSAgICByZXF1ZXN0RXhpdCgpOwotICAgIHNldFRpbWVvdXRVcygwKTsKLSAgICBqb2luKCk7Ci19Ci0KLWJvb2wgTkJMb2c6Ok1lcmdlVGhyZWFkOjp0aHJlYWRMb29wKCkgewotICAgIGJvb2wgZG9NZXJnZTsKLSAgICB7Ci0gICAgICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOwotICAgICAgICAvLyBJZiBtVGltZW91dFVzIGlzIG5lZ2F0aXZlLCB3YWl0IG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgdW50aWwgaXQncyBwb3NpdGl2ZS4KLSAgICAgICAgLy8gSWYgaXQncyBwb3NpdGl2ZSwgd2FpdCBrVGhyZWFkU2xlZXBQZXJpb2RVcyBhbmQgdGhlbiBtZXJnZQotICAgICAgICBuc2Vjc190IHdhaXRUaW1lID0gbVRpbWVvdXRVcyA+IDAgPyBrVGhyZWFkU2xlZXBQZXJpb2RVcyAqIDEwMDAgOiBMTE9OR19NQVg7Ci0gICAgICAgIG1Db25kLndhaXRSZWxhdGl2ZShtTXV0ZXgsIHdhaXRUaW1lKTsKLSAgICAgICAgZG9NZXJnZSA9IG1UaW1lb3V0VXMgPiAwOwotICAgICAgICBtVGltZW91dFVzIC09IGtUaHJlYWRTbGVlcFBlcmlvZFVzOwotICAgIH0KLSAgICBpZiAoZG9NZXJnZSkgewotICAgICAgICAvLyBNZXJnZSBkYXRhIGZyb20gYWxsIHRoZSByZWFkZXJzCi0gICAgICAgIG1NZXJnZXIubWVyZ2UoKTsKLSAgICAgICAgLy8gUHJvY2VzcyB0aGUgZGF0YSBjb2xsZWN0ZWQgYnkgbU1lcmdlciBhbmQgd3JpdGUgaXQgdG8gUGVyZm9ybWFuY2VBbmFseXNpcwotICAgICAgICAvLyBGSVhNRTogZGVjaWRlIHdoZXRoZXIgdG8gY2FsbCBnZXRBbmRQcm9jZXNzU25hcHNob3QgZXZlcnkgdGltZQotICAgICAgICAvLyBvciB3aGV0aGVyIHRvIGhhdmUgYSBzZXBhcmF0ZSB0aHJlYWQgdGhhdCBjYWxscyBpdCB3aXRoIGEgbG93ZXIgZnJlcXVlbmN5Ci0gICAgICAgIG1NZXJnZVJlYWRlci5nZXRBbmRQcm9jZXNzU25hcHNob3QoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgTkJMb2c6Ok1lcmdlVGhyZWFkOjp3YWtldXAoKSB7Ci0gICAgc2V0VGltZW91dFVzKGtUaHJlYWRXYWtldXBQZXJpb2RVcyk7Ci19Ci0KLXZvaWQgTkJMb2c6Ok1lcmdlVGhyZWFkOjpzZXRUaW1lb3V0VXMoaW50IHRpbWUpIHsKLSAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKLSAgICBtVGltZW91dFVzID0gdGltZTsKLSAgICBtQ29uZC5zaWduYWwoKTsKLX0KLQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmNwcCBiL21lZGlhL2xpYm5ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwCmluZGV4IGYwOWU5M2QuLmU5MWE1MTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwCisrKyBiL21lZGlhL2xpYm5ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwCkBAIC0xNywxMyArMTcsMTYgQEAKIAogI2RlZmluZSBMT0dfVEFHICJQZXJmb3JtYW5jZUFuYWx5c2lzIgogLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vICNkZWZpbmUgV1JJVEVfVE9fRklMRQogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGNsaW1pdHM+CiAjaW5jbHVkZSA8ZGVxdWU+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8bnVtZXJpYz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CkBAIC0zMiwyMCArMzUsMTI2IEBACiAjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9Mb2dQbG90Lmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcm91bmR1cC5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogCiAjaW5jbHVkZSA8cXVldWU+CiAjaW5jbHVkZSA8dXRpbGl0eT4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgewogCit2b2lkIEhpc3RvZ3JhbTo6YWRkKGRvdWJsZSB2YWx1ZSkKK3sKKyAgICBpZiAobUJpblNpemUgPD0gMCB8fCBtQmlucy5zaXplKCkgPCAyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gVE9ETyBIYW5kbGUgZG9tYWluIGFuZCByYW5nZSBlcnJvciBleGNlcHRpb25zPworICAgIGNvbnN0IGludCB1bmJvdW5kZWRJbmRleCA9IGxyb3VuZCgodmFsdWUgLSBtTG93KSAvIG1CaW5TaXplKSArIDE7CisgICAgLy8gc3RkOjpjbGFtcCBpcyBpbnRyb2R1Y2VkIGluIEMrKzE3CisgICAgLy9jb25zdCBpbnQgaW5kZXggPSBzdGQ6OmNsYW1wKHVuYm91bmRlZEluZGV4LCAwLCAoaW50KShtQmlucy5zaXplKCkgLSAxKSk7CisgICAgY29uc3QgaW50IGluZGV4ID0gc3RkOjptYXgoMCwgc3RkOjptaW4oKGludCkobUJpbnMuc2l6ZSgpIC0gMSksIHVuYm91bmRlZEluZGV4KSk7CisgICAgbUJpbnNbaW5kZXhdKys7CisgICAgbVRvdGFsQ291bnQrKzsKK30KKwordm9pZCBIaXN0b2dyYW06OmNsZWFyKCkKK3sKKyAgICBzdGQ6OmZpbGwobUJpbnMuYmVnaW4oKSwgbUJpbnMuZW5kKCksIDApOworICAgIG1Ub3RhbENvdW50ID0gMDsKK30KKwordWludDY0X3QgSGlzdG9ncmFtOjp0b3RhbENvdW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVRvdGFsQ291bnQ7Cit9CisKK3N0ZDo6c3RyaW5nIEhpc3RvZ3JhbTo6dG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtEaXZpZGVyID0gJ3wnOworICAgIHNzIDw8IGtWZXJzaW9uIDw8ICIsIiA8PCBtQmluU2l6ZSA8PCAiLCIgPDwgbU51bUJpbnMgPDwgIiwiIDw8IG1Mb3cgPDwgIix7IjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtQmluc1tpXSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgICAgICAgc3MgPDwgIiwiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3MgPDwgc3RhdGljX2Nhc3Q8aW50PihpKSAtIDEgPDwga0RpdmlkZXIgPDwgbUJpbnNbaV07CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHNzIDw8ICJ9IjsKKworICAgIHJldHVybiBzcy5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgSGlzdG9ncmFtOjphc2NpaUFydFN0cmluZyhzaXplX3QgaW5kZW50KSBjb25zdCB7CisgICAgaWYgKHRvdGFsQ291bnQoKSA9PSAwIHx8IG1CaW5TaXplIDw9IDAgfHwgbUJpbnMuc2l6ZSgpIDwgMikgeworICAgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtNYXJrZXIgPSAnLSc7CisgICAgLy8gT25lIGluY3JlbWVudCBpcyBjb25zaWRlcmVkIG9uZSBzdGVwIG9mIGEgYmluJ3MgaGVpZ2h0LgorICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXJrZXJzUGVySW5jcmVtZW50ID0gMjsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWF4SW5jcmVtZW50cyA9IDY0ICsgMTsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWF4TnVtYmVyV2lkdGggPSA3OworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrTWFya2VycyhrTWFya2Vyc1BlckluY3JlbWVudCAqIGtNYXhJbmNyZW1lbnRzLCBrTWFya2VyKTsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1NwYWNlcyhrTWFya2Vyc1BlckluY3JlbWVudCAqIGtNYXhJbmNyZW1lbnRzLCAnICcpOworICAgIC8vIGdldCB0aGUgbGFzdCBuIGNoYXJhY3RlcnMgb2Ygcywgb3IgdGhlIHdob2xlIHN0cmluZyBpZiBpdCBpcyBzaG9ydGVyCisgICAgYXV0byBnZXRUYWlsID0gW10oY29uc3Qgc2l6ZV90IG4sIGNvbnN0IHN0ZDo6c3RyaW5nICZzKSB7CisgICAgICAgIHJldHVybiBzLmNfc3RyKCkgKyBzLnNpemUoKSAtIHN0ZDo6bWluKG4sIHMuc2l6ZSgpKTsKKyAgICB9OworCisgICAgLy8gU2luY2UgdG90YWxDb3VudCgpID4gMCwgbUJpbnMgaXMgbm90IGVtcHR5IGFuZCBtYXhDb3VudCA+IDAuCisgICAgY29uc3QgdW5zaWduZWQgbWF4Q291bnQgPSAqc3RkOjptYXhfZWxlbWVudChtQmlucy5iZWdpbigpLCBtQmlucy5lbmQoKSk7CisgICAgY29uc3Qgc2l6ZV90IG1heEluY3JlbWVudHMgPSBsb2cyKG1heENvdW50KSArIDE7CisKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKworICAgIC8vIE5vbi16ZXJvIGJpbnMgbXVzdCBleGlzdCBhdCB0aGlzIHBvaW50IGJlY2F1c2UgdG90YWxDb3VudCgpID4gMC4KKyAgICBzaXplX3QgZmlyc3ROb25aZXJvQmluID0gMDsKKyAgICAvLyBJZiBmaXJzdE5vblplcm9CaW4gcmVhY2hlcyBtQmlucy5zaXplKCkgLSAxLCB0aGVuIGl0IG11c3QgYmUgYSBub256ZXJvIGJpbi4KKyAgICBmb3IgKDsgZmlyc3ROb25aZXJvQmluIDwgbUJpbnMuc2l6ZSgpIC0gMSAmJiBtQmluc1tmaXJzdE5vblplcm9CaW5dID09IDA7IGZpcnN0Tm9uWmVyb0JpbisrKSB7fQorICAgIGNvbnN0IHNpemVfdCBmaXJzdEJpblRvUHJpbnQgPSBmaXJzdE5vblplcm9CaW4gPT0gMCA/IDAgOiBmaXJzdE5vblplcm9CaW4gLSAxOworCisgICAgc2l6ZV90IGxhc3ROb25aZXJvQmluID0gbUJpbnMuc2l6ZSgpIC0gMTsKKyAgICAvLyBJZiBsYXN0Tm9uWmVyb0JpbiByZWFjaGVzIDAsIHRoZW4gaXQgbXVzdCBiZSBhIG5vbnplcm8gYmluLgorICAgIGZvciAoOyBsYXN0Tm9uWmVyb0JpbiA+IDAgJiYgbUJpbnNbbGFzdE5vblplcm9CaW5dID09IDA7IGxhc3ROb25aZXJvQmluLS0pIHt9CisgICAgY29uc3Qgc2l6ZV90IGxhc3RCaW5Ub1ByaW50ID0gbGFzdE5vblplcm9CaW4gPT0gbUJpbnMuc2l6ZSgpIC0gMSA/IGxhc3ROb25aZXJvQmluCisgICAgICAgICAgICA6IGxhc3ROb25aZXJvQmluICsgMTsKKworICAgIGZvciAoc2l6ZV90IGJpbiA9IGZpcnN0QmluVG9QcmludDsgYmluIDw9IGxhc3RCaW5Ub1ByaW50OyBiaW4rKykgeworICAgICAgICBzcyA8PCBzdGQ6OnNldHcoaW5kZW50ICsga01heE51bWJlcldpZHRoKTsKKyAgICAgICAgaWYgKGJpbiA9PSAwKSB7CisgICAgICAgICAgICBzcyA8PCAiPCI7CisgICAgICAgIH0gZWxzZSBpZiAoYmluID09IG1CaW5zLnNpemUoKSAtIDEpIHsKKyAgICAgICAgICAgIHNzIDw8ICI+IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNzIDw8IG1Mb3cgKyAoYmluIC0gMSkgKiBtQmluU2l6ZTsKKyAgICAgICAgfQorICAgICAgICBzcyA8PCAiIHwiOworICAgICAgICBzaXplX3QgaW5jcmVtZW50cyA9IDA7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IGJpbkNvdW50ID0gbUJpbnNbYmluXTsKKyAgICAgICAgaWYgKGJpbkNvdW50ID4gMCkgeworICAgICAgICAgICAgaW5jcmVtZW50cyA9IGxvZzIoYmluQ291bnQpICsgMTsKKyAgICAgICAgICAgIHNzIDw8IGdldFRhaWwoaW5jcmVtZW50cyAqIGtNYXJrZXJzUGVySW5jcmVtZW50LCBrTWFya2Vycyk7CisgICAgICAgIH0KKyAgICAgICAgc3MgPDwgZ2V0VGFpbCgobWF4SW5jcmVtZW50cyAtIGluY3JlbWVudHMgKyAxKSAqIGtNYXJrZXJzUGVySW5jcmVtZW50LCBrU3BhY2VzKQorICAgICAgICAgICAgICAgIDw8IGJpbkNvdW50IDw8ICJcbiI7CisgICAgfQorICAgIHNzIDw8ICJcbiI7CisKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIC8vIEdpdmVuIGFuIGF1ZGlvIHByb2Nlc3Npbmcgd2FrZXVwIHRpbWVzdGFtcCwgYnVja2V0cyB0aGUgdGltZSBpbnRlcnZhbAogLy8gc2luY2UgdGhlIHByZXZpb3VzIHRpbWVzdGFtcCBpbnRvIGEgaGlzdG9ncmFtLCBzZWFyY2hlcyBmb3IKIC8vIG91dGxpZXJzLCBhbmFseXplcyB0aGUgb3V0bGllciBzZXJpZXMgZm9yIHVuZXhwZWN0ZWRseQpAQCAtMjA4LDI3ICszMTcsNiBAQAogICAgIHJldHVybiBpc091dGxpZXI7CiB9CiAKLXN0YXRpYyBpbnQgd2lkdGhPZihpbnQgeCkgewotICAgIGludCB3aWR0aCA9IDA7Ci0gICAgaWYgKHggPCAwKSB7Ci0gICAgICAgIHdpZHRoKys7Ci0gICAgICAgIHggPSB4ID09IElOVF9NSU4gPyBJTlRfTUFYIDogLXg7Ci0gICAgfQotICAgIC8vIGFzc2VydCAoeCA+PSAwKQotICAgIGRvIHsKLSAgICAgICAgKyt3aWR0aDsKLSAgICAgICAgeCAvPSAxMDsKLSAgICB9IHdoaWxlICh4ID4gMCk7Ci0gICAgcmV0dXJuIHdpZHRoOwotfQotCi0vLyBjb21wdXRlcyB0aGUgY29sdW1uIHdpZHRoIHJlcXVpcmVkIGZvciBhIHNwZWNpZmljIGhpc3RvZ3JhbSB2YWx1ZQotaW5saW5lIGludCBudW1iZXJXaWR0aChkb3VibGUgbnVtYmVyLCBpbnQgbGVmdFBhZGRpbmcpIHsKLSAgICAvLyBBZGRlZCB2YWx1ZXMgYWNjb3VudCBmb3Igd2hpdGVzcGFjZXMgbmVlZGVkIGFyb3VuZCBudW1iZXJzLCBhbmQgZm9yIHRoZQotICAgIC8vIGRvdCBhbmQgZGVjaW1hbCBkaWdpdCBub3QgYWNjb3VudGVkIGZvciBieSB3aWR0aE9mCi0gICAgcmV0dXJuIHN0ZDo6bWF4KHN0ZDo6bWF4KHdpZHRoT2Yoc3RhdGljX2Nhc3Q8aW50PihudW1iZXIpKSArIDMsIDIpLCBsZWZ0UGFkZGluZyArIDEpOwotfQotCiAvLyByb3VuZHMgdmFsdWUgdG8gcHJlY2lzaW9uIGJhc2VkIG9uIGxvZy1kaXN0YW5jZSBmcm9tIG1lYW4KIF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIGlubGluZSBkb3VibGUgbG9nUm91bmQoZG91YmxlIHgsIGRvdWJsZSBtZWFuKSB7CkBAIC0yNTQsNyArMzQyLDcgQEAKIC8vIG9mIFBlcmZvcm1hbmNlQW5hbHlzaXMKIHZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6cmVwb3J0UGVyZm9ybWFuY2UoU3RyaW5nOCAqYm9keSwgaW50IGF1dGhvciwgbG9nX2hhc2hfdCBoYXNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4SGVpZ2h0KSB7Ci0gICAgaWYgKG1IaXN0cy5lbXB0eSgpKSB7CisgICAgaWYgKG1IaXN0cy5lbXB0eSgpIHx8IGJvZHkgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0yNzMsNjkgKzM2MSwxNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gdW5kZXJzY29yZXMgYW5kIHNwYWNlcyBsZW5ndGggY29ycmVzcG9uZHMgdG8gbWF4aW11bSB3aWR0aCBvZiBoaXN0b2dyYW0KLSAgICBzdGF0aWMgY29uc3QgaW50IGtMZW4gPSAyMDA7Ci0gICAgc3RkOjpzdHJpbmcgdW5kZXJzY29yZXMoa0xlbiwgJ18nKTsKLSAgICBzdGQ6OnN0cmluZyBzcGFjZXMoa0xlbiwgJyAnKTsKLQotICAgIGF1dG8gaXQgPSBidWNrZXRzLmJlZ2luKCk7Ci0gICAgZG91YmxlIG1heERlbHRhID0gaXQtPmZpcnN0OwotICAgIGludCBtYXhDb3VudCA9IGl0LT5zZWNvbmQ7Ci0gICAgLy8gQ29tcHV0ZSBtYXhpbXVtIHZhbHVlcwotICAgIHdoaWxlICgrK2l0ICE9IGJ1Y2tldHMuZW5kKCkpIHsKLSAgICAgICAgaWYgKGl0LT5maXJzdCA+IG1heERlbHRhKSB7Ci0gICAgICAgICAgICBtYXhEZWx0YSA9IGl0LT5maXJzdDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXQtPnNlY29uZCA+IG1heENvdW50KSB7Ci0gICAgICAgICAgICBtYXhDb3VudCA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW50IGhlaWdodCA9IGxvZzIobWF4Q291bnQpICsgMTsgLy8gbWF4Q291bnQgPiAwLCBzYWZlIHRvIGNhbGwgbG9nMgotICAgIGNvbnN0IGludCBsZWZ0UGFkZGluZyA9IHdpZHRoT2YoMSA8PCBoZWlnaHQpOwotICAgIGNvbnN0IGludCBidWNrZXRXaWR0aCA9IG51bWJlcldpZHRoKG1heERlbHRhLCBsZWZ0UGFkZGluZyk7Ci0gICAgaW50IHNjYWxpbmdGYWN0b3IgPSAxOwotICAgIC8vIHNjYWxlIGRhdGEgaWYgaXQgZXhjZWVkcyBtYXhpbXVtIGhlaWdodAotICAgIGlmIChoZWlnaHQgPiBtYXhIZWlnaHQpIHsKLSAgICAgICAgc2NhbGluZ0ZhY3RvciA9IChoZWlnaHQgKyBtYXhIZWlnaHQpIC8gbWF4SGVpZ2h0OwotICAgICAgICBoZWlnaHQgLz0gc2NhbGluZ0ZhY3RvcjsKLSAgICB9Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyAlMy4yZiAlcyIsIGxlZnRQYWRkaW5nICsgMTEsCi0gICAgICAgICAgICAiT2NjdXJyZW5jZXMgaW4iLCAoZWxhcHNlZE1zIC8ga01zUGVyU2VjKSwgInNlY29uZHMgb2YgYXVkaW86Iik7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyVkLCAlbGxkLCAlbGxkXG4iLCBsZWZ0UGFkZGluZyArIDExLAorICAgIHN0YXRpYyBjb25zdCBpbnQgU0laRSA9IDEyODsKKyAgICBjaGFyIHRpdGxlW1NJWkVdOworICAgIHNucHJpbnRmKHRpdGxlLCBzaXplb2YodGl0bGUpLCAiXG4lcyAlMy4yZiAlc1xuJXMlZCwgJWxsZCwgJWxsZFxuIiwKKyAgICAgICAgICAgICJPY2N1cnJlbmNlcyBpbiIsIChlbGFwc2VkTXMgLyBrTXNQZXJTZWMpLCAic2Vjb25kcyBvZiBhdWRpbzoiLAogICAgICAgICAgICAgIlRocmVhZCwgaGFzaCwgc3RhcnRpbmcgdGltZXN0YW1wOiAiLCBhdXRob3IsCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmcgaW50PihoYXNoKSwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nIGludD4oc3RhcnRpbmdUcykpOwotICAgIC8vIHdyaXRlIGhpc3RvZ3JhbSBsYWJlbCBsaW5lIHdpdGggYnVja2V0IHZhbHVlcwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lcyIsICIgIik7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKnMiLCBsZWZ0UGFkZGluZywgIiAiKTsKLSAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7Ci0gICAgICAgIGNvbnN0IGludCBjb2xXaWR0aCA9IG51bWJlcldpZHRoKHguZmlyc3QsIGxlZnRQYWRkaW5nKTsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmQiLCBjb2xXaWR0aCwgeC5zZWNvbmQpOwotICAgIH0KLSAgICAvLyB3cml0ZSBoaXN0b2dyYW0gYXNjaWkgYXJ0Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKLSAgICBmb3IgKGludCByb3cgPSBoZWlnaHQgKiBzY2FsaW5nRmFjdG9yOyByb3cgPj0gMDsgcm93IC09IHNjYWxpbmdGYWN0b3IpIHsKLSAgICAgICAgY29uc3QgaW50IHZhbHVlID0gMSA8PCByb3c7Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIGxlZnRQYWRkaW5nLCBzcGFjZXMuY19zdHIoKSk7Ci0gICAgICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBjb2xXaWR0aCA9IG51bWJlcldpZHRoKHguZmlyc3QsIGxlZnRQYWRkaW5nKTsKLSAgICAgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGggLSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlcy5jX3N0cigpLCB4LnNlY29uZCA8IHZhbHVlID8gIiAiIDogInwiKTsKLSAgICAgICAgfQotICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOwotICAgIH0KLSAgICAvLyBwcmludCB4LWF4aXMKLSAgICBjb25zdCBpbnQgY29sdW1ucyA9IHN0YXRpY19jYXN0PGludD4oYnVja2V0cy5zaXplKCkpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpjIiwgbGVmdFBhZGRpbmcsICcgJyk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzIiwgKGNvbHVtbnMgKyAxKSAqIGJ1Y2tldFdpZHRoLCB1bmRlcnNjb3Jlcy5jX3N0cigpKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihoYXNoKSwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihzdGFydGluZ1RzKSk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrTGFiZWwgPSAibXMiOwogCi0gICAgLy8gd3JpdGUgZm9vdGVyIHdpdGggYnVja2V0IGxhYmVscwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpzIiwgbGVmdFBhZGRpbmcsICIgIik7Ci0gICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgewotICAgICAgICBjb25zdCBpbnQgY29sV2lkdGggPSBudW1iZXJXaWR0aCh4LmZpcnN0LCBsZWZ0UGFkZGluZyk7Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSouKmYiLCBjb2xXaWR0aCwgMSwgeC5maXJzdCk7Ci0gICAgfQotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgYnVja2V0V2lkdGgsIHNwYWNlcy5jX3N0cigpLCAibXNcbiIpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJXMiLAorICAgICAgICAgICAgYXVkaW9fdXRpbHNfcGxvdF9oaXN0b2dyYW0oYnVja2V0cywgdGl0bGUsIGtMYWJlbCwgbWF4SGVpZ2h0KS5jX3N0cigpKTsKIAogICAgIC8vIE5vdyByZXBvcnQgZ2xpdGNoZXMKICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxudGltZSBlbGFwc2VkIGJldHdlZW4gZ2xpdGNoZXMgYW5kIGdsaXRjaCB0aW1lc3RhbXBzOlxuIik7CkBAIC0zNTAsNyArMzg1LDkgQEAKIC8vIHdyaXRlcyBzdW1tYXJ5IG9mIHBlcmZvcm1hbmNlIGludG8gc3BlY2lmaWVkIGZpbGUgZGVzY3JpcHRvcgogdm9pZCBkdW1wKGludCBmZCwgaW50IGluZGVudCwgUGVyZm9ybWFuY2VBbmFseXNpc01hcCAmdGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpcykgewogICAgIFN0cmluZzggYm9keTsKKyNpZmRlZiBXUklURV9UT19GSUxFCiAgICAgY29uc3QgY2hhciogY29uc3Qga0RpcmVjdG9yeSA9ICIvZGF0YS9taXNjL2F1ZGlvc2VydmVyLyI7CisjZW5kaWYKICAgICBmb3IgKGF1dG8gJiB0aHJlYWQgOiB0aHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzKSB7CiAgICAgICAgIGZvciAoYXV0byAmIGhhc2g6IHRocmVhZC5zZWNvbmQpIHsKICAgICAgICAgICAgIFBlcmZvcm1hbmNlQW5hbHlzaXMmIGN1cnIgPSBoYXNoLnNlY29uZDsKQEAgLTM2MCw5ICszOTcsMTEgQEAKICAgICAgICAgICAgICAgICBkdW1wTGluZShmZCwgaW5kZW50LCBib2R5KTsKICAgICAgICAgICAgICAgICBib2R5LmNsZWFyKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyB3cml0ZSB0byBmaWxlCisjaWZkZWYgV1JJVEVfVE9fRklMRQorICAgICAgICAgICAgLy8gd3JpdGUgdG8gZmlsZS4gRW5hYmxlIGJ5IHVuY29tbWVudGluZyBtYWNybyBhdCB0b3Agb2YgZmlsZS4KICAgICAgICAgICAgIHdyaXRlVG9GaWxlKGN1cnIubUhpc3RzLCBjdXJyLm1PdXRsaWVyRGF0YSwgY3Vyci5tUGVha1RpbWVzdGFtcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICBrRGlyZWN0b3J5LCBmYWxzZSwgdGhyZWFkLmZpcnN0LCBoYXNoLmZpcnN0KTsKKyNlbmRpZgogICAgICAgICB9CiAgICAgfQogfQpAQCAtMzc0LDUgKzQxMyw0IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCi0KIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvUmVhZGVyLmNwcCBiL21lZGlhL2xpYm5ibG9nL1JlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1NmUzNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL1JlYWRlci5jcHAKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk5CTG9nIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmby5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRW50cnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZWFkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9UaW1lbGluZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIE5CTG9nIHsKKworUmVhZGVyOjpSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCisgICAgOiBtTmFtZShuYW1lKSwKKyAgICAgIG1TaGFyZWQoKC8qY29uc3QqLyBTaGFyZWQgKikgc2hhcmVkKSwgLyptSU1lbW9yeSovCisgICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPworICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCisgICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCisgICAgICBtRmlmb1JlYWRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyKCptRmlmbykgOiBOVUxMKQoreworfQorCitSZWFkZXI6OlJlYWRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKQorICAgIDogUmVhZGVyKGlNZW1vcnkgIT0gMCA/IChTaGFyZWQgKikgaU1lbW9yeS0+cG9pbnRlcigpIDogTlVMTCwgc2l6ZSwgbmFtZSkKK3sKKyAgICBtSU1lbW9yeSA9IGlNZW1vcnk7Cit9CisKK1JlYWRlcjo6flJlYWRlcigpCit7CisgICAgZGVsZXRlIG1GaWZvUmVhZGVyOworICAgIGRlbGV0ZSBtRmlmbzsKK30KKworLy8gQ29waWVzIGNvbnRlbnQgb2YgYSBSZWFkZXIgRklGTyBpbnRvIGl0cyBTbmFwc2hvdAorLy8gVGhlIFNuYXBzaG90IGhhcyB0aGUgc2FtZSByYXcgZGF0YSwgYnV0IHJlcHJlc2VudGVkIGFzIGEgc2VxdWVuY2Ugb2YgZW50cmllcworLy8gYW5kIGFuIEVudHJ5SXRlcmF0b3IgbWFraW5nIGl0IHBvc3NpYmxlIHRvIHByb2Nlc3MgdGhlIGRhdGEuCitzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IFJlYWRlcjo6Z2V0U25hcHNob3QoYm9vbCBmbHVzaCkKK3sKKyAgICBpZiAobUZpZm9SZWFkZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PihuZXcgU25hcHNob3QoKSk7CisgICAgfQorCisgICAgLy8gVGhpcyBlbXVsYXRlcyB0aGUgYmVoYXZpb3VyIG9mIGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyOjpyZWFkLCBidXQgd2l0aG91dCBpbmNyZW1lbnRpbmcgdGhlCisgICAgLy8gcmVhZGVyIGluZGV4LiBUaGUgaW5kZXggaXMgaW5jcmVtZW50ZWQgYWZ0ZXIgaGFuZGxpbmcgY29ycnVwdGlvbiwgdG8gYWZ0ZXIgdGhlIGxhc3QgY29tcGxldGUKKyAgICAvLyBlbnRyeSBvZiB0aGUgYnVmZmVyCisgICAgc2l6ZV90IGxvc3QgPSAwOworICAgIGF1ZGlvX3V0aWxzX2lvdmVjIGlvdmVjWzJdOworICAgIGNvbnN0IHNpemVfdCBjYXBhY2l0eSA9IG1GaWZvLT5jYXBhY2l0eSgpOworICAgIHNzaXplX3QgYXZhaWxUb1JlYWQ7CisgICAgLy8gQSBjYWxsIHRvIGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyOjpvYnRhaW4oKSBwbGFjZXMgdGhlIHJlYWQgcG9pbnRlciBvbmUgYnVmZmVyIGxlbmd0aAorICAgIC8vIGJlZm9yZSB0aGUgd3JpdGVyJ3MgcG9pbnRlciAoc2luY2UgbUZpZm9SZWFkZXIgd2FzIGNvbnN0cnVjdGVkIHdpdGggZmx1c2g9ZmFsc2UpLiBUaGUKKyAgICAvLyBkbyB3aGlsZSBsb29wIGlzIGFuIGF0dGVtcHQgdG8gcmVhZCBhbGwgb2YgdGhlIEZJRk8ncyBjb250ZW50cyByZWdhcmRsZXNzIG9mIGhvdyBiZWhpbmQKKyAgICAvLyB0aGUgcmVhZGVyIGlzIHdpdGggcmVzcGVjdCB0byB0aGUgd3JpdGVyLiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIHNjaGVkdWxpbmcgc2VxdWVuY2UgaXMKKyAgICAvLyBwb3NzaWJsZSBhbmQgY2FuIGxlYWQgdG8gYSBzdGFydmF0aW9uIHNpdHVhdGlvbjoKKyAgICAvLyAtIFdyaXRlciBUMSB3cml0ZXMsIG92ZXJydW4gd2l0aCByZXNwZWN0IHRvIFJlYWRlciBUMgorICAgIC8vIC0gVDIgY2FsbHMgb2J0YWluKCkgYW5kIGdldHMgRU9WRVJGTE9XLCBUMiBwdHIgcGxhY2VkIG9uZSBidWZmZXIgc2l6ZSBiZWhpbmQgVDEgcHRyCisgICAgLy8gLSBUMSB3cml0ZSwgb3ZlcnJ1bgorICAgIC8vIC0gVDIgb2J0YWluKCksIEVPVkVSRkxPVyAoYW5kIHNvIG9uLi4uKQorICAgIC8vIFRvIGFkZHJlc3MgdGhpcyBpc3N1ZSwgd2UgbGltaXQgdGhlIG51bWJlciBvZiB0cmllcyBmb3IgdGhlIHJlYWRlciB0byBjYXRjaCB1cCB3aXRoCisgICAgLy8gdGhlIHdyaXRlci4KKyAgICBpbnQgdHJpZXMgPSAwOworICAgIHNpemVfdCBsb3N0VGVtcDsKKyAgICBkbyB7CisgICAgICAgIGF2YWlsVG9SZWFkID0gbUZpZm9SZWFkZXItPm9idGFpbihpb3ZlYywgY2FwYWNpdHksIE5VTEwgLyp0aW1lb3V0Ki8sICZsb3N0VGVtcCk7CisgICAgICAgIGxvc3QgKz0gbG9zdFRlbXA7CisgICAgfSB3aGlsZSAoYXZhaWxUb1JlYWQgPCAwIHx8ICsrdHJpZXMgPD0ga01heE9idGFpblRyaWVzKTsKKworICAgIGlmIChhdmFpbFRvUmVhZCA8PSAwKSB7CisgICAgICAgIEFMT0dXX0lGKGF2YWlsVG9SZWFkIDwgMCwgIk5CTG9nIFJlYWRlciAlcyBmYWlsZWQgdG8gY2F0Y2ggdXAgd2l0aCBXcml0ZXIiLCBtTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4obmV3IFNuYXBzaG90KCkpOworICAgIH0KKworICAgIC8vIENoYW5nZSB0byAjaWYgMSBmb3IgZGVidWdnaW5nLiBUaGlzIHN0YXRlbWVudCBpcyB1c2VmdWwgZm9yIGNoZWNraW5nIGJ1ZmZlciBmdWxsbmVzcyBsZXZlbHMKKyAgICAvLyAoYXMgc2VlbiBieSByZWFkZXIpIGFuZCBob3cgbXVjaCBkYXRhIHdhcyBsb3N0LiBJZiB5b3UgZmluZCB0aGF0IHRoZSBmdWxsbmVzcyBsZXZlbCBpcworICAgIC8vIGdldHRpbmcgY2xvc2UgdG8gZnVsbCwgb3IgdGhhdCBkYXRhIGxvc3MgaXMgaGFwcGVuaW5nIHRvIG9mdGVuLCB0aGVuIHlvdSBzaG91bGQKKyAgICAvLyBwcm9iYWJseSB0cnkgc29tZSBvZiB0aGUgZm9sbG93aW5nOgorICAgIC8vIC0gbG9nIGxlc3MgZGF0YQorICAgIC8vIC0gbG9nIGxlc3Mgb2Z0ZW4KKyAgICAvLyAtIGluY3JlYXNlIHRoZSBpbml0aWFsIHNoYXJlZCBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhlIGJ1ZmZlcgorI2lmIDAKKyAgICBBTE9HRCgiZ2V0U25hcHNob3QgbmFtZT0lcywgYXZhaWxUb1JlYWQ9JXpkLCBjYXBhY2l0eT0lenUsIGZ1bGxuZXNzPSUuM2YsIGxvc3Q9JXp1IiwKKyAgICAgICAgICAgIG5hbWUoKS5jX3N0cigpLCBhdmFpbFRvUmVhZCwgY2FwYWNpdHksIChkb3VibGUpYXZhaWxUb1JlYWQgLyAoZG91YmxlKWNhcGFjaXR5LCBsb3N0KTsKKyNlbmRpZgorICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gc25hcHNob3QobmV3IFNuYXBzaG90KGF2YWlsVG9SZWFkKSk7CisgICAgbWVtY3B5KHNuYXBzaG90LT5tRGF0YSwgKGNvbnN0IGNoYXIgKikgbUZpZm8tPmJ1ZmZlcigpICsgaW92ZWNbMF0ubU9mZnNldCwgaW92ZWNbMF0ubUxlbmd0aCk7CisgICAgaWYgKGlvdmVjWzFdLm1MZW5ndGggPiAwKSB7CisgICAgICAgIG1lbWNweShzbmFwc2hvdC0+bURhdGEgKyAoaW92ZWNbMF0ubUxlbmd0aCksCisgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKikgbUZpZm8tPmJ1ZmZlcigpICsgaW92ZWNbMV0ubU9mZnNldCwgaW92ZWNbMV0ubUxlbmd0aCk7CisgICAgfQorCisgICAgLy8gSGFuZGxlIGNvcnJ1cHRlZCBidWZmZXIKKyAgICAvLyBQb3RlbnRpYWxseSwgYSBidWZmZXIgaGFzIGNvcnJ1cHRlZCBkYXRhIG9uIGJvdGggYmVnaW5uaW5nIChkdWUgdG8gb3ZlcmZsb3cpIGFuZCBlbmQKKyAgICAvLyAoZHVlIHRvIGluY29tcGxldGUgZm9ybWF0IGVudHJ5KS4gQnV0IGV2ZW4gaWYgdGhlIGVuZCBmb3JtYXQgZW50cnkgaXMgaW5jb21wbGV0ZSwKKyAgICAvLyBpdCBlbmRzIGluIGEgY29tcGxldGUgZW50cnkgKHdoaWNoIGlzIG5vdCBhbiBGTVRfRU5EKS4gU28gaXMgc2FmZSB0byB0cmF2ZXJzZSBiYWNrd2FyZHMuCisgICAgLy8gVE9ETzogaGFuZGxlIGNsaWVudCBjb3JydXB0aW9uIChpbiB0aGUgbWlkZGxlIG9mIGEgYnVmZmVyKQorCisgICAgY29uc3QgdWludDhfdCAqYmFjayA9IHNuYXBzaG90LT5tRGF0YSArIGF2YWlsVG9SZWFkOworICAgIGNvbnN0IHVpbnQ4X3QgKmZyb250ID0gc25hcHNob3QtPm1EYXRhOworCisgICAgLy8gRmluZCBsYXN0IEZNVF9FTkQuIDxiYWNrPiBpcyBzaXR0aW5nIG9uIGFuIGVudHJ5IHdoaWNoIG1pZ2h0IGJlIHRoZSBtaWRkbGUgb2YgYSBGb3JtYXRFbnRyeS4KKyAgICAvLyBXZSBnbyBiYWNrd2FyZHMgdW50aWwgd2UgZmluZCBhbiBFVkVOVF9GTVRfRU5ELgorICAgIGNvbnN0IHVpbnQ4X3QgKmxhc3RFbmQgPSBmaW5kTGFzdFZhbGlkRW50cnkoZnJvbnQsIGJhY2ssIGludmFsaWRFbmRUeXBlcyk7CisgICAgaWYgKGxhc3RFbmQgPT0gbnVsbHB0cikgeworICAgICAgICBzbmFwc2hvdC0+bUVuZCA9IHNuYXBzaG90LT5tQmVnaW4gPSBFbnRyeUl0ZXJhdG9yKGZyb250KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBlbmQgb2Ygc25hcHNob3QgcG9pbnRzIHRvIGFmdGVyIGxhc3QgRk1UX0VORCBlbnRyeQorICAgICAgICBzbmFwc2hvdC0+bUVuZCA9IEVudHJ5SXRlcmF0b3IobGFzdEVuZCkubmV4dCgpOworICAgICAgICAvLyBmaW5kIGZpcnN0IEZNVF9TVEFSVAorICAgICAgICBjb25zdCB1aW50OF90ICpmaXJzdFN0YXJ0ID0gbnVsbHB0cjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqZmlyc3RTdGFydFRtcCA9IHNuYXBzaG90LT5tRW5kOworICAgICAgICB3aGlsZSAoKGZpcnN0U3RhcnRUbXAgPSBmaW5kTGFzdFZhbGlkRW50cnkoZnJvbnQsIGZpcnN0U3RhcnRUbXAsIGludmFsaWRCZWdpblR5cGVzKSkKKyAgICAgICAgICAgICAgICAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBmaXJzdFN0YXJ0ID0gZmlyc3RTdGFydFRtcDsKKyAgICAgICAgfQorICAgICAgICAvLyBmaXJzdFN0YXJ0IGlzIG51bGwgaWYgbm8gRk1UX1NUQVJUIGVudHJ5IHdhcyBmb3VuZCBiZWZvcmUgbGFzdEVuZAorICAgICAgICBpZiAoZmlyc3RTdGFydCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBzbmFwc2hvdC0+bUJlZ2luID0gc25hcHNob3QtPm1FbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbmFwc2hvdC0+bUJlZ2luID0gRW50cnlJdGVyYXRvcihmaXJzdFN0YXJ0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGFkdmFuY2UgZmlmbyByZWFkZXIgaW5kZXggdG8gYWZ0ZXIgbGFzdCBlbnRyeSByZWFkLgorICAgIGlmIChmbHVzaCkgeworICAgICAgICBtRmlmb1JlYWRlci0+cmVsZWFzZShzbmFwc2hvdC0+bUVuZCAtIGZyb250KTsKKyAgICB9CisKKyAgICBzbmFwc2hvdC0+bUxvc3QgPSBsb3N0OworICAgIHJldHVybiBzbmFwc2hvdDsKK30KKworYm9vbCBSZWFkZXI6OmlzSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkgY29uc3QKK3sKKyAgICByZXR1cm4gaU1lbW9yeSAhPSAwICYmIG1JTWVtb3J5ICE9IDAgJiYgaU1lbW9yeS0+cG9pbnRlcigpID09IG1JTWVtb3J5LT5wb2ludGVyKCk7Cit9CisKKy8vIFdlIG1ha2UgYSBzZXQgb2YgdGhlIGludmFsaWQgdHlwZXMgcmF0aGVyIHRoYW4gdGhlIHZhbGlkIHR5cGVzIHdoZW4gYWxpZ25pbmcKKy8vIFNuYXBzaG90IEVudHJ5SXRlcmF0b3JzIHRvIHZhbGlkIGVudHJpZXMgZHVyaW5nIGxvZyBjb3JydXB0aW9uIGNoZWNraW5nLgorLy8gVGhpcyBpcyBkb25lIGluIG9yZGVyIHRvIGF2b2lkIHRoZSBtYWludGVuYW5jZSBvdmVyaGVhZCBvZiBhZGRpbmcgYSBuZXcgRXZlbnQKKy8vIHR5cGUgdG8gdGhlIHR3byBzZXRzIGJlbG93IHdoZW5ldmVyIGEgbmV3IEV2ZW50IHR5cGUgaXMgY3JlYXRlZCwgYXMgaXQgaXMKKy8vIHZlcnkgbGlrZWx5IHRoYXQgbmV3IHR5cGVzIGFkZGVkIHdpbGwgYmUgdmFsaWQgdHlwZXMuCisvLyBDdXJyZW50bHksIGludmFsaWRCZWdpblR5cGVzIGFuZCBpbnZhbGlkRW5kVHlwZXMgYXJlIHVzZWQgdG8gaGFuZGxlIHRoZSBzcGVjaWFsCisvLyBjYXNlIG9mIGEgRm9ybWF0IEVudHJ5LCB3aGljaCBjb25zaXN0cyBvZiBhIHZhcmlhYmxlIG51bWJlciBvZiBzaW1wbGUgbG9nIGVudHJpZXMuCisvLyBJZiBhIG5ldyBFdmVudCBpcyBhZGRlZCB0aGF0IGNvbnNpc3RzIG9mIGEgdmFyaWFibGUgbnVtYmVyIG9mIHNpbXBsZSBsb2cgZW50cmllcywKKy8vIHRoZW4gdGhlc2Ugc2V0cyBuZWVkIHRvIGJlIHVwZGF0ZWQuCisKKy8vIFdlIHdhbnQgdGhlIGJlZ2lubmluZyBvZiBhIFNuYXBzaG90IHRvIHBvaW50IHRvIGFuIGVudHJ5IHRoYXQgaXMgbm90IGluCisvLyB0aGUgbWlkZGxlIG9mIGEgZm9ybWF0dGVkIGVudHJ5IGFuZCBub3QgYW4gRk1UX0VORC4KK2NvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxFdmVudD4gUmVhZGVyOjppbnZhbGlkQmVnaW5UeXBlcyB7CisgICAgRVZFTlRfRk1UX0FVVEhPUiwKKyAgICBFVkVOVF9GTVRfRU5ELAorICAgIEVWRU5UX0ZNVF9GTE9BVCwKKyAgICBFVkVOVF9GTVRfSEFTSCwKKyAgICBFVkVOVF9GTVRfSU5URUdFUiwKKyAgICBFVkVOVF9GTVRfUElELAorICAgIEVWRU5UX0ZNVF9TVFJJTkcsCisgICAgRVZFTlRfRk1UX1RJTUVTVEFNUCwKK307CisKKy8vIFdlIHdhbnQgdGhlIGVuZCBvZiBhIFNuYXBzaG90IHRvIHBvaW50IHRvIGFuIGVudHJ5IHRoYXQgaXMgbm90IGluCisvLyB0aGUgbWlkZGxlIG9mIGEgZm9ybWF0dGVkIGVudHJ5IGFuZCBub3QgYSBGTVRfU1RBUlQuCitjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8RXZlbnQ+IFJlYWRlcjo6aW52YWxpZEVuZFR5cGVzIHsKKyAgICBFVkVOVF9GTVRfQVVUSE9SLAorICAgIEVWRU5UX0ZNVF9GTE9BVCwKKyAgICBFVkVOVF9GTVRfSEFTSCwKKyAgICBFVkVOVF9GTVRfSU5URUdFUiwKKyAgICBFVkVOVF9GTVRfUElELAorICAgIEVWRU5UX0ZNVF9TVEFSVCwKKyAgICBFVkVOVF9GTVRfU1RSSU5HLAorICAgIEVWRU5UX0ZNVF9USU1FU1RBTVAsCit9OworCitjb25zdCB1aW50OF90ICpSZWFkZXI6OmZpbmRMYXN0VmFsaWRFbnRyeShjb25zdCB1aW50OF90ICpmcm9udCwgY29uc3QgdWludDhfdCAqYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxFdmVudD4gJmludmFsaWRUeXBlcykgeworICAgIGlmIChmcm9udCA9PSBudWxscHRyIHx8IGJhY2sgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgd2hpbGUgKGJhY2sgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID49IGZyb250KSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnByZXYgPSBiYWNrIC0gYmFja1tFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSAtIEVudHJ5OjprT3ZlcmhlYWQ7CisgICAgICAgIGNvbnN0IEV2ZW50IHR5cGUgPSAoY29uc3QgRXZlbnQpcHJldltvZmZzZXRvZihlbnRyeSwgdHlwZSldOworICAgICAgICBpZiAocHJldiA8IGZyb250CisgICAgICAgICAgICAgICAgfHwgcHJldiArIHByZXZbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsgRW50cnk6OmtPdmVyaGVhZCAhPSBiYWNrCisgICAgICAgICAgICAgICAgfHwgdHlwZSA8PSBFVkVOVF9SRVNFUlZFRCB8fCB0eXBlID49IEVWRU5UX1VQUEVSX0JPVU5EKSB7CisgICAgICAgICAgICAvLyBwcmV2IHBvaW50cyB0byBhbiBvdXQgb2YgbGltaXRzIG9yIGluY29uc2lzdGVudCBlbnRyeQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgLy8gaWYgaW52YWxpZFR5cGVzIGRvZXMgbm90IGNvbnRhaW4gdGhlIHR5cGUsIHRoZW4gdGhlIHR5cGUgaXMgdmFsaWQuCisgICAgICAgIGlmIChpbnZhbGlkVHlwZXMuZmluZCh0eXBlKSA9PSBpbnZhbGlkVHlwZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBwcmV2OworICAgICAgICB9CisgICAgICAgIGJhY2sgPSBwcmV2OworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsgLy8gbm8gZW50cnkgZm91bmQKK30KKworLy8gVE9ETyBmb3IgZnV0dXJlIGNvbXBhdGliaWxpdHksIHdvdWxkIHByZWZlciB0byBoYXZlIGEgZHVtcCgpIGdvIHRvIHN0cmluZywgYW5kIHRoZW4gZ28KKy8vIHRvIGZkIG9ubHkgd2hlbiBpbnZva2VkIHRocm91Z2ggYmluZGVyLgordm9pZCBEdW1wUmVhZGVyOjpkdW1wKGludCBmZCwgc2l6ZV90IGluZGVudCkKK3sKKyAgICBpZiAoZmQgPCAwKSByZXR1cm47CisgICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBzbmFwc2hvdCA9IGdldFNuYXBzaG90KGZhbHNlIC8qZmx1c2gqLyk7CisgICAgaWYgKHNuYXBzaG90ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTdHJpbmc4IHRpbWVzdGFtcCwgYm9keTsKKworICAgIC8vIFRPRE8gYWxsIGxvZ2dlZCB0eXBlcyBzaG91bGQgaGF2ZSBhIHByaW50YWJsZSBmb3JtYXQuCisgICAgLy8gVE9ETyBjYW4gd2UgbWFrZSB0aGUgcHJpbnRpbmcgZ2VuZXJpYz8KKyAgICBmb3IgKEVudHJ5SXRlcmF0b3IgaXQgPSBzbmFwc2hvdC0+YmVnaW4oKTsgaXQgIT0gc25hcHNob3QtPmVuZCgpOyArK2l0KSB7CisgICAgICAgIHN3aXRjaCAoaXQtPnR5cGUpIHsKKyAgICAgICAgY2FzZSBFVkVOVF9GTVRfU1RBUlQ6CisgICAgICAgICAgICBpdCA9IGhhbmRsZUZvcm1hdChGb3JtYXRFbnRyeShpdCksICZ0aW1lc3RhbXAsICZib2R5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX0xBVEVOQ1k6IHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSBpdC5wYXlsb2FkPGRvdWJsZT4oKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJFVkVOVF9MQVRFTkNZLCUuM2YiLCBsYXRlbmN5TXMpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX09WRVJSVU46IHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdHMgPSBpdC5wYXlsb2FkPGludDY0X3Q+KCk7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiRVZFTlRfT1ZFUlJVTiwlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0cykpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1RIUkVBRF9JTkZPOiB7CisgICAgICAgICAgICBjb25zdCB0aHJlYWRfaW5mb190IGluZm8gPSBpdC5wYXlsb2FkPHRocmVhZF9pbmZvX3Q+KCk7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiRVZFTlRfVEhSRUFEX0lORk8sJWQsJXMiLCBzdGF0aWNfY2FzdDxpbnQ+KGluZm8uaWQpLAorICAgICAgICAgICAgICAgICAgICB0aHJlYWRUeXBlVG9TdHJpbmcoaW5mby50eXBlKSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfVU5ERVJSVU46IHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdHMgPSBpdC5wYXlsb2FkPGludDY0X3Q+KCk7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiRVZFTlRfVU5ERVJSVU4sJWxsZCIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odHMpKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9XQVJNVVBfVElNRTogeworICAgICAgICAgICAgY29uc3QgZG91YmxlIHRpbWVNcyA9IGl0LnBheWxvYWQ8ZG91YmxlPigpOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkVWRU5UX1dBUk1VUF9USU1FLCUuM2YiLCB0aW1lTXMpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1dPUktfVElNRTogeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBtb25vdG9uaWNOcyA9IGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJFVkVOVF9XT1JLX1RJTUUsJWxsZCIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4obW9ub3RvbmljTnMpKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9USFJFQURfUEFSQU1TOiB7CisgICAgICAgICAgICBjb25zdCB0aHJlYWRfcGFyYW1zX3QgcGFyYW1zID0gaXQucGF5bG9hZDx0aHJlYWRfcGFyYW1zX3Q+KCk7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiRVZFTlRfVEhSRUFEX1BBUkFNUywlenUsJXUiLCBwYXJhbXMuZnJhbWVDb3VudCwgcGFyYW1zLnNhbXBsZVJhdGUpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX0ZNVF9FTkQ6CisgICAgICAgIGNhc2UgRVZFTlRfUkVTRVJWRUQ6CisgICAgICAgIGNhc2UgRVZFTlRfVVBQRVJfQk9VTkQ6CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgid2FybmluZzogdW5leHBlY3RlZCBldmVudCAlZCIsIGl0LT50eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFib2R5LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZHByaW50ZihmZCwgIiUuKnMlcyAlc1xuIiwgKGludClpbmRlbnQsICIiLCB0aW1lc3RhbXAuc3RyaW5nKCksIGJvZHkuc3RyaW5nKCkpOworICAgICAgICAgICAgYm9keS5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHRpbWVzdGFtcC5jbGVhcigpOworICAgIH0KK30KKworRW50cnlJdGVyYXRvciBEdW1wUmVhZGVyOjpoYW5kbGVGb3JtYXQoY29uc3QgRm9ybWF0RW50cnkgJmZtdEVudHJ5LAorICAgICAgICBTdHJpbmc4ICp0aW1lc3RhbXAsIFN0cmluZzggKmJvZHkpCit7CisgICAgU3RyaW5nOCB0aW1lc3RhbXBMb2NhbDsKKyAgICBTdHJpbmc4IGJvZHlMb2NhbDsKKyAgICBpZiAodGltZXN0YW1wID09IG51bGxwdHIpIHsKKyAgICAgICAgdGltZXN0YW1wID0gJnRpbWVzdGFtcExvY2FsOworICAgIH0KKyAgICBpZiAoYm9keSA9PSBudWxscHRyKSB7CisgICAgICAgIGJvZHkgPSAmYm9keUxvY2FsOworICAgIH0KKworICAgIC8vIGxvZyB0aW1lc3RhbXAKKyAgICBjb25zdCBpbnQ2NF90IHRzID0gZm10RW50cnkudGltZXN0YW1wKCk7CisgICAgdGltZXN0YW1wLT5jbGVhcigpOworICAgIHRpbWVzdGFtcC0+YXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCisgICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMgLyAoMTAwMCAqIDEwMDApKSAlIDEwMDApKTsKKworICAgIC8vIGxvZyB1bmlxdWUgaGFzaAorICAgIGxvZ19oYXNoX3QgaGFzaCA9IGZtdEVudHJ5Lmhhc2goKTsKKyAgICAvLyBwcmludCBvbmx5IGxvd2VyIDE2Yml0IG9mIGhhc2ggYXMgaGV4IGFuZCBsaW5lIGFzIGludCB0byByZWR1Y2Ugc3BhbSBpbiB0aGUgbG9nCisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLjRYLSVkICIsIChpbnQpKGhhc2ggPj4gMTYpICYgMHhGRkZGLCAoaW50KSBoYXNoICYgMHhGRkZGKTsKKworICAgIC8vIGxvZyBhdXRob3IgKGlmIHByZXNlbnQpCisgICAgaGFuZGxlQXV0aG9yKGZtdEVudHJ5LCBib2R5KTsKKworICAgIC8vIGxvZyBzdHJpbmcKKyAgICBFbnRyeUl0ZXJhdG9yIGFyZyA9IGZtdEVudHJ5LmFyZ3MoKTsKKworICAgIGNvbnN0IGNoYXIqIGZtdCA9IGZtdEVudHJ5LmZvcm1hdFN0cmluZygpOworICAgIHNpemVfdCBmbXRfbGVuZ3RoID0gZm10RW50cnkuZm9ybWF0U3RyaW5nTGVuZ3RoKCk7CisKKyAgICBmb3IgKHNpemVfdCBmbXRfb2Zmc2V0ID0gMDsgZm10X29mZnNldCA8IGZtdF9sZW5ndGg7ICsrZm10X29mZnNldCkgeworICAgICAgICBpZiAoZm10W2ZtdF9vZmZzZXRdICE9ICclJykgeworICAgICAgICAgICAgYm9keS0+YXBwZW5kKCZmbXRbZm10X29mZnNldF0sIDEpOyAvLyBUT0RPIG9wdGltaXplIHRvIHdyaXRlIGNvbnNlY3V0aXZlIHN0cmluZ3MgYXQgb25jZQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2FzZSAiJSUiIgorICAgICAgICBpZiAoZm10WysrZm10X29mZnNldF0gPT0gJyUnKSB7CisgICAgICAgICAgICBib2R5LT5hcHBlbmQoIiUiKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIGNhc2UgIiVcMCIKKyAgICAgICAgaWYgKGZtdF9vZmZzZXQgPT0gZm10X2xlbmd0aCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBFdmVudCBldmVudCA9IChFdmVudCkgYXJnLT50eXBlOworICAgICAgICBzaXplX3QgbGVuZ3RoID0gYXJnLT5sZW5ndGg7CisKKyAgICAgICAgLy8gVE9ETyBjaGVjayBsZW5ndGggZm9yIGV2ZW50IHR5cGUgaXMgY29ycmVjdAorCisgICAgICAgIGlmIChldmVudCA9PSBFVkVOVF9GTVRfRU5EKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBtb3JlIGNvbXBsZXggZm9ybWF0dGluZyBzdWNoIGFzICUuM2YKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0dW0gPSBhcmctPmRhdGE7IC8vIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZXZlbnQgYXJncworICAgICAgICBzd2l0Y2goZm10W2ZtdF9vZmZzZXRdKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJ3MnOiAvLyBzdHJpbmcKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZNVF9TVFJJTkcsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHN0cmluZyBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYm9keS0+YXBwZW5kKChjb25zdCBjaGFyKikgZGF0dW0sIGxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICd0JzogLy8gdGltZXN0YW1wCisgICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9GTVRfVElNRVNUQU1QLAorICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciB0aW1lc3RhbXAgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGFwcGVuZFRpbWVzdGFtcChib2R5LCBkYXR1bSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdkJzogLy8gaW50ZWdlcgorICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfRk1UX0lOVEVHRVIsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIGludGVnZXIgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGFwcGVuZEludChib2R5LCBkYXR1bSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdmJzogLy8gZmxvYXQKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZNVF9GTE9BVCwKKyAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgZmxvYXQgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGFwcGVuZEZsb2F0KGJvZHksIGRhdHVtKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3AnOiAvLyBwaWQKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZNVF9QSUQsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHBpZCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYXBwZW5kUElEKGJvZHksIGRhdHVtLCBsZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJOQkxvZyBSZWFkZXIgZW5jb3VudGVyZWQgdW5rbm93biBjaGFyYWN0ZXIgJWMiLCBmbXRbZm10X29mZnNldF0pOworICAgICAgICB9CisgICAgICAgICsrYXJnOworICAgIH0KKyAgICBBTE9HV19JRihhcmctPnR5cGUgIT0gRVZFTlRfRk1UX0VORCwgIkV4cGVjdGVkIGVuZCBvZiBmb3JtYXQsIGdvdCAlZCIsIGFyZy0+dHlwZSk7CisgICAgcmV0dXJuIGFyZzsKK30KKwordm9pZCBEdW1wUmVhZGVyOjphcHBlbmRJbnQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKyAgICBpZiAoYm9keSA9PSBudWxscHRyIHx8IGRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vaW50IHggPSAqKChpbnQqKSBkYXRhKTsKKyAgICBpbnQgeDsKKyAgICBtZW1jcHkoJngsIGRhdGEsIHNpemVvZih4KSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8JWQ+IiwgeCk7Cit9CisKK3ZvaWQgRHVtcFJlYWRlcjo6YXBwZW5kRmxvYXQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKyAgICBpZiAoYm9keSA9PSBudWxscHRyIHx8IGRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZsb2F0IGY7CisgICAgbWVtY3B5KCZmLCBkYXRhLCBzaXplb2YoZikpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPCVmPiIsIGYpOworfQorCit2b2lkIER1bXBSZWFkZXI6OmFwcGVuZFBJRChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKQoreworICAgIGlmIChib2R5ID09IG51bGxwdHIgfHwgZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcGlkX3QgaWQgPSAqKChwaWRfdCopIGRhdGEpOworICAgIGNoYXIgKiBuYW1lID0gJigoY2hhciopIGRhdGEpW3NpemVvZihwaWRfdCldOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPFBJRDogJWQsIG5hbWU6ICUuKnM+IiwgaWQsIChpbnQpIChsZW5ndGggLSBzaXplb2YocGlkX3QpKSwgbmFtZSk7Cit9CisKK3ZvaWQgRHVtcFJlYWRlcjo6YXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpCit7CisgICAgaWYgKGJvZHkgPT0gbnVsbHB0ciB8fCBkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQ2NF90IHRzOworICAgIG1lbWNweSgmdHMsIGRhdGEsIHNpemVvZih0cykpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiWyVkLiUwM2RdIiwgKGludCkgKHRzIC8gKDEwMDAgKiAxMDAwICogMTAwMCkpLAorICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzIC8gKDEwMDAgKiAxMDAwKSkgJSAxMDAwKSk7Cit9CisKK1N0cmluZzggRHVtcFJlYWRlcjo6YnVmZmVyRHVtcChjb25zdCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBzaXplKQoreworICAgIFN0cmluZzggc3RyOworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gc3RyOworICAgIH0KKyAgICBzdHIuYXBwZW5kKCJbICIpOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgc3RyLmFwcGVuZEZvcm1hdCgiJWQgIiwgYnVmZmVyW2ldKTsKKyAgICB9CisgICAgc3RyLmFwcGVuZCgiXSIpOworICAgIHJldHVybiBzdHI7Cit9CisKK1N0cmluZzggRHVtcFJlYWRlcjo6YnVmZmVyRHVtcChjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCkKK3sKKyAgICByZXR1cm4gYnVmZmVyRHVtcChpdCwgaXQtPmxlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWQpOworfQorCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmNwcCBiL21lZGlhL2xpYm5ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmNwcAppbmRleCA4MjdlNzMxLi5iMDUwYjgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5jcHAKKysrIGIvbWVkaWEvbGlibmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuY3BwCkBAIC0xNSw5ICsxNSwxMSBAQAogICovCiAKICNkZWZpbmUgTE9HX1RBRyAiUmVwb3J0UGVyZm9ybWFuY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxmc3RyZWFtPgogI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxxdWV1ZT4KICNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KQEAgLTI3LDIzICsyOSwxOTUgQEAKICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KKyNpbmNsdWRlIDxqc29uL2pzb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKIAorc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxKc29uOjpWYWx1ZT4gZHVtcFRvSnNvbihjb25zdCBQZXJmb3JtYW5jZURhdGEmIGRhdGEpCit7CisgICAgc3RkOjp1bmlxdWVfcHRyPEpzb246OlZhbHVlPiByb290UHRyID0gc3RkOjptYWtlX3VuaXF1ZTxKc29uOjpWYWx1ZT4oSnNvbjo6b2JqZWN0VmFsdWUpOworICAgIEpzb246OlZhbHVlJiByb290ID0gKnJvb3RQdHI7CisgICAgcm9vdFsiaW9IYW5kbGUiXSA9IGRhdGEudGhyZWFkSW5mby5pZDsKKyAgICByb290WyJ0eXBlIl0gPSBOQkxvZzo6dGhyZWFkVHlwZVRvU3RyaW5nKGRhdGEudGhyZWFkSW5mby50eXBlKTsKKyAgICByb290WyJmcmFtZUNvdW50Il0gPSAoSnNvbjo6VmFsdWU6OkludClkYXRhLnRocmVhZFBhcmFtcy5mcmFtZUNvdW50OworICAgIHJvb3RbInNhbXBsZVJhdGUiXSA9IChKc29uOjpWYWx1ZTo6SW50KWRhdGEudGhyZWFkUGFyYW1zLnNhbXBsZVJhdGU7CisgICAgcm9vdFsid29ya01zSGlzdCJdID0gZGF0YS53b3JrSGlzdC50b1N0cmluZygpOworICAgIHJvb3RbImxhdGVuY3lNc0hpc3QiXSA9IGRhdGEubGF0ZW5jeUhpc3QudG9TdHJpbmcoKTsKKyAgICByb290WyJ3YXJtdXBNc0hpc3QiXSA9IGRhdGEud2FybXVwSGlzdC50b1N0cmluZygpOworICAgIHJvb3RbInVuZGVycnVucyJdID0gKEpzb246OlZhbHVlOjpJbnQ2NClkYXRhLnVuZGVycnVuczsKKyAgICByb290WyJvdmVycnVucyJdID0gKEpzb246OlZhbHVlOjpJbnQ2NClkYXRhLm92ZXJydW5zOworICAgIHJvb3RbImFjdGl2ZU1zIl0gPSAoSnNvbjo6VmFsdWU6OkludDY0KW5zMm1zKGRhdGEuYWN0aXZlKTsKKyAgICByb290WyJkdXJhdGlvbk1zIl0gPSAoSnNvbjo6VmFsdWU6OkludDY0KW5zMm1zKHN5c3RlbVRpbWUoKSAtIGRhdGEuc3RhcnQpOworICAgIHJldHVybiByb290UHRyOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgZHVtcEhpc3RvZ3JhbXNUb1N0cmluZyhjb25zdCBQZXJmb3JtYW5jZURhdGEmIGRhdGEpCit7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKKyAgICBzcyA8PCAiVGhyZWFkIHR5cGU9IiA8PCBOQkxvZzo6dGhyZWFkVHlwZVRvU3RyaW5nKGRhdGEudGhyZWFkSW5mby50eXBlKQorICAgICAgICAgICAgPDwgIiBoYW5kbGU9IiA8PCBkYXRhLnRocmVhZEluZm8uaWQKKyAgICAgICAgICAgIDw8ICIgc2FtcGxlUmF0ZT0iIDw8IGRhdGEudGhyZWFkUGFyYW1zLnNhbXBsZVJhdGUKKyAgICAgICAgICAgIDw8ICIgZnJhbWVDb3VudD0iIDw8IGRhdGEudGhyZWFkUGFyYW1zLmZyYW1lQ291bnQgPDwgIlxuIjsKKyAgICBzcyA8PCAiICBUaHJlYWQgd29yayB0aW1lcyBpbiBtczpcbiIgPDwgZGF0YS53b3JrSGlzdC5hc2NpaUFydFN0cmluZyg0IC8qaW5kZW50Ki8pOworICAgIHNzIDw8ICIgIFRocmVhZCBsYXRlbmNpZXMgaW4gbXM6XG4iIDw8IGRhdGEubGF0ZW5jeUhpc3QuYXNjaWlBcnRTdHJpbmcoNCAvKmluZGVudCovKTsKKyAgICBzcyA8PCAiICBUaHJlYWQgd2FybXVwIHRpbWVzIGluIG1zOlxuIiA8PCBkYXRhLndhcm11cEhpc3QuYXNjaWlBcnRTdHJpbmcoNCAvKmluZGVudCovKTsKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgZHVtcEpzb24oaW50IGZkLCBjb25zdCBzdGQ6Om1hcDxpbnQsIFBlcmZvcm1hbmNlRGF0YT4mIHRocmVhZERhdGFNYXApCit7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgSnNvbjo6VmFsdWUgcm9vdChKc29uOjphcnJheVZhbHVlKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiB0aHJlYWREYXRhTWFwKSB7CisgICAgICAgIGNvbnN0IFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGEmIGRhdGEgPSBpdGVtLnNlY29uZDsKKyAgICAgICAgLy8gU2tpcCB0aHJlYWRzIHRoYXQgZG8gbm90IGhhdmUgcGVyZm9ybWFuY2UgZGF0YSByZWNvcmRlZCB5ZXQuCisgICAgICAgIGlmIChkYXRhLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxKc29uOjpWYWx1ZT4gZGF0YUpzb24gPSBSZXBvcnRQZXJmb3JtYW5jZTo6ZHVtcFRvSnNvbihkYXRhKTsKKyAgICAgICAgaWYgKGRhdGFKc29uID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgICgqZGF0YUpzb24pWyJ0aHJlYWROdW0iXSA9IGl0ZW0uZmlyc3Q7CisgICAgICAgIHJvb3QuYXBwZW5kKCpkYXRhSnNvbik7CisgICAgfQorICAgIEpzb246OlN0eWxlZFdyaXRlciB3cml0ZXI7CisgICAgc3RkOjpzdHJpbmcgcm9vdFN0ciA9IHdyaXRlci53cml0ZShyb290KTsKKyAgICB3cml0ZShmZCwgcm9vdFN0ci5jX3N0cigpLCByb290U3RyLnNpemUoKSk7Cit9CisKK3ZvaWQgZHVtcFBsb3RzKGludCBmZCwgY29uc3Qgc3RkOjptYXA8aW50LCBQZXJmb3JtYW5jZURhdGE+JiB0aHJlYWREYXRhTWFwKQoreworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byAmaXRlbSA6IHRocmVhZERhdGFNYXApIHsKKyAgICAgICAgY29uc3QgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YSYgZGF0YSA9IGl0ZW0uc2Vjb25kOworICAgICAgICBpZiAoZGF0YS5lbXB0eSgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBoaXN0cyA9IFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wSGlzdG9ncmFtc1RvU3RyaW5nKGRhdGEpOworICAgICAgICB3cml0ZShmZCwgaGlzdHMuY19zdHIoKSwgaGlzdHMuc2l6ZSgpKTsKKyAgICB9Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBkdW1wUmV0cm9TdHJpbmcoY29uc3QgUGVyZm9ybWFuY2VEYXRhJiBkYXRhLCBpbnQ2NF90IG5vdykKK3sKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCBOQkxvZzo6dGhyZWFkVHlwZVRvU3RyaW5nKGRhdGEudGhyZWFkSW5mby50eXBlKSA8PCAiLCIgPDwgZGF0YS50aHJlYWRJbmZvLmlkIDw8ICJcbiI7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVtIDogZGF0YS5zbmFwc2hvdHMpIHsKKyAgICAgICAgLy8gVE9ETyB1c2UgYW4gZW51bSB0byBzdHJpbmcgY29udmVyc2lvbiBtZXRob2QuIE9uZSBnb29kIGlkZWE6CisgICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMzgxNTcKKyAgICAgICAgaWYgKGl0ZW0uZmlyc3QgPT0gTkJMb2c6OkVWRU5UX1VOREVSUlVOKSB7CisgICAgICAgICAgICBzcyA8PCAiRVZFTlRfVU5ERVJSVU4sIjsKKyAgICAgICAgfSBlbHNlIGlmIChpdGVtLmZpcnN0ID09IE5CTG9nOjpFVkVOVF9PVkVSUlVOKSB7CisgICAgICAgICAgICBzcyA8PCAiRVZFTlRfT1ZFUlJVTiwiOworICAgICAgICB9CisgICAgICAgIHNzIDw8IG5vdyAtIGl0ZW0uc2Vjb25kIDw8ICJcbiI7CisgICAgfQorICAgIHNzIDw8ICJcbiI7CisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCit2b2lkIGR1bXBSZXRybyhpbnQgZmQsIGNvbnN0IHN0ZDo6bWFwPGludCwgUGVyZm9ybWFuY2VEYXRhPiYgdGhyZWFkRGF0YU1hcCkKK3sKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZW0gOiB0aHJlYWREYXRhTWFwKSB7CisgICAgICAgIGNvbnN0IFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGEmIGRhdGEgPSBpdGVtLnNlY29uZDsKKyAgICAgICAgaWYgKGRhdGEuc25hcHNob3RzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHJldHJvU3RyID0gZHVtcFJldHJvU3RyaW5nKGRhdGEsIG5vdyk7CisgICAgICAgIHdyaXRlKGZkLCByZXRyb1N0ci5jX3N0cigpLCByZXRyb1N0ci5zaXplKCkpOworICAgIH0KK30KKworYm9vbCBzZW5kVG9NZWRpYU1ldHJpY3MoY29uc3QgUGVyZm9ybWFuY2VEYXRhJiBkYXRhKQoreworICAgIC8vIFNlZSBkb2N1bWVudGF0aW9uIGZvciB0aGVzZSBtZXRyaWNzIGhlcmU6CisgICAgLy8gZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMTEtLTZkeU9YVk9wYWNZUUxaaWFPWTVRVnRRalV5cU54MnpUOWNDekxLWUUvZWRpdD91c3A9c2hhcmluZworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkVHlwZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQudHlwZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRGcmFtZUNvdW50W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5mcmFtZWNvdW50IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZFNhbXBsZVJhdGVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLnNhbXBsZXJhdGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkV29ya0hpc3RbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLndvcmtNcy5oaXN0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZExhdGVuY3lIaXN0W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5sYXRlbmN5TXMuaGlzdCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRXYXJtdXBIaXN0W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC53YXJtdXBNcy5oaXN0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZFVuZGVycnVuc1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQudW5kZXJydW5zIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZE92ZXJydW5zW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5vdmVycnVucyI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRBY3RpdmVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLmFjdGl2ZU1zIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZER1cmF0aW9uW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5kdXJhdGlvbk1zIjsKKworICAgIC8vIEN1cnJlbnRseSwgd2Ugb25seSBhbGxvdyBGYXN0TWl4ZXIgdGhyZWFkIGRhdGEgdG8gYmUgc2VudCB0byBNZWRpYSBNZXRyaWNzLgorICAgIGlmIChkYXRhLnRocmVhZEluZm8udHlwZSAhPSBOQkxvZzo6RkFTVE1JWEVSKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFBbmFseXRpY3NJdGVtPiBpdGVtKE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKCJhdWRpb3RocmVhZCIpKTsKKworICAgIGNvbnN0IEhpc3RvZ3JhbSAmd29ya0hpc3QgPSBkYXRhLndvcmtIaXN0OworICAgIGlmICh3b3JrSGlzdC50b3RhbENvdW50KCkgPiAwKSB7CisgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa1RocmVhZFdvcmtIaXN0LCB3b3JrSGlzdC50b1N0cmluZygpLmNfc3RyKCkpOworICAgIH0KKworICAgIGNvbnN0IEhpc3RvZ3JhbSAmbGF0ZW5jeUhpc3QgPSBkYXRhLmxhdGVuY3lIaXN0OworICAgIGlmIChsYXRlbmN5SGlzdC50b3RhbENvdW50KCkgPiAwKSB7CisgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa1RocmVhZExhdGVuY3lIaXN0LCBsYXRlbmN5SGlzdC50b1N0cmluZygpLmNfc3RyKCkpOworICAgIH0KKworICAgIGNvbnN0IEhpc3RvZ3JhbSAmd2FybXVwSGlzdCA9IGRhdGEud2FybXVwSGlzdDsKKyAgICBpZiAod2FybXVwSGlzdC50b3RhbENvdW50KCkgPiAwKSB7CisgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa1RocmVhZFdhcm11cEhpc3QsIHdhcm11cEhpc3QudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBpZiAoZGF0YS51bmRlcnJ1bnMgPiAwKSB7CisgICAgICAgIGl0ZW0tPnNldEludDY0KGtUaHJlYWRVbmRlcnJ1bnMsIGRhdGEudW5kZXJydW5zKTsKKyAgICB9CisKKyAgICBpZiAoZGF0YS5vdmVycnVucyA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0SW50NjQoa1RocmVhZE92ZXJydW5zLCBkYXRhLm92ZXJydW5zKTsKKyAgICB9CisKKyAgICAvLyBTZW5kIHRvIE1lZGlhIE1ldHJpY3MgaWYgdGhlIHJlY29yZCBpcyBub3QgZW1wdHkuCisgICAgLy8gVGhlIHRocmVhZCBhbmQgdGltZSBpbmZvIGFyZSBhZGRlZCBpbnNpZGUgdGhlIGlmIHN0YXRlbWVudCBiZWNhdXNlCisgICAgLy8gd2Ugd2FudCB0byBzZW5kIHRoZW0gb25seSBpZiB0aGVyZSBhcmUgcGVyZm9ybWFuY2UgbWV0cmljcyB0byBzZW5kLgorICAgIGlmIChpdGVtLT5jb3VudCgpID4gMCkgeworICAgICAgICAvLyBBZGQgdGhyZWFkIGluZm8gZmllbGRzLgorICAgICAgICBjb25zdCBjaGFyICogY29uc3QgdHlwZVN0cmluZyA9IE5CTG9nOjp0aHJlYWRUeXBlVG9TdHJpbmcoZGF0YS50aHJlYWRJbmZvLnR5cGUpOworICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtUaHJlYWRUeXBlLCB0eXBlU3RyaW5nKTsKKyAgICAgICAgaXRlbS0+c2V0SW50MzIoa1RocmVhZEZyYW1lQ291bnQsIGRhdGEudGhyZWFkUGFyYW1zLmZyYW1lQ291bnQpOworICAgICAgICBpdGVtLT5zZXRJbnQzMihrVGhyZWFkU2FtcGxlUmF0ZSwgZGF0YS50aHJlYWRQYXJhbXMuc2FtcGxlUmF0ZSk7CisgICAgICAgIC8vIEFkZCB0aW1lIGluZm8gZmllbGRzLgorICAgICAgICBpdGVtLT5zZXRJbnQ2NChrVGhyZWFkQWN0aXZlLCBkYXRhLmFjdGl2ZSAvIDEwMDAwMDApOworICAgICAgICBpdGVtLT5zZXRJbnQ2NChrVGhyZWFkRHVyYXRpb24sIChzeXN0ZW1UaW1lKCkgLSBkYXRhLnN0YXJ0KSAvIDEwMDAwMDApOworICAgICAgICByZXR1cm4gaXRlbS0+c2VsZnJlY29yZCgpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIFRPRE86IHVzZSBhIGZ1bmN0aW9uIGxpa2UgdGhpcyB0byBleHRyYWN0IGxvZ2ljIGZyb20gd3JpdGVUb0ZpbGUKIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS85Mjc5NjIwCiAKIC8vIFdyaXRlcyBvdXRsaWVyIGludGVydmFscywgdGltZXN0YW1wcywgYW5kIGhpc3RvZ3JhbXMgc3Bhbm5pbmcgbG9uZyB0aW1lIGludGVydmFscyB0byBmaWxlLgogLy8gVE9ETzogd3JpdGUgZGF0YSBpbiBiaW5hcnkgZm9ybWF0Ci12b2lkIHdyaXRlVG9GaWxlKGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdG9ncmFtPj4gJmhpc3RzLAordm9pZCB3cml0ZVRvRmlsZShjb25zdCBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3Q+PiAmaGlzdHMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPG1zSW50ZXJ2YWwsIHRpbWVzdGFtcD4+ICZvdXRsaWVyRGF0YSwKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpkZXF1ZTx0aW1lc3RhbXA+ICZwZWFrVGltZXN0YW1wcywKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGRpcmVjdG9yeSwgYm9vbCBhcHBlbmQsIGludCBhdXRob3IsIGxvZ19oYXNoX3QgaGFzaCkgewpAQCAtMTI4LDYgKzMwMiw1IEBACiAgICAgcGZzLmNsb3NlKCk7CiB9CiAKLX0gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCi0KK30gICAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvVGltZWxpbmUuY3BwIGIvbWVkaWEvbGlibmJsb2cvVGltZWxpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOWIwM2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9UaW1lbGluZS5jcHAKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3JvdW5kdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9UaW1lbGluZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCisjaWYgMCAgIC8vIEZJWE1FIHNlZSBub3RlIGluIFRpbWVsaW5lLmgKK05CTG9nOjpUaW1lbGluZTo6VGltZWxpbmUoc2l6ZV90IHNpemUsIHZvaWQgKnNoYXJlZCkKKyAgICA6IG1TaXplKHJvdW5kdXAoc2l6ZSkpLCBtT3duKHNoYXJlZCA9PSBOVUxMKSwKKyAgICAgIG1TaGFyZWQoKFNoYXJlZCAqKSAobU93biA/IG5ldyBjaGFyW3NoYXJlZFNpemUoc2l6ZSldIDogc2hhcmVkKSkKK3sKKyAgICBuZXcgKG1TaGFyZWQpIFNoYXJlZDsKK30KKworTkJMb2c6OlRpbWVsaW5lOjp+VGltZWxpbmUoKQoreworICAgIG1TaGFyZWQtPn5TaGFyZWQoKTsKKyAgICBpZiAobU93bikgeworICAgICAgICBkZWxldGVbXSAoY2hhciAqKSBtU2hhcmVkOworICAgIH0KK30KKyNlbmRpZgorCisvKnN0YXRpYyovCitzaXplX3QgVGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZV90IHNpemUpCit7CisgICAgLy8gVE9ETyBmaWZvIG5vdyBzdXBwb3J0cyBub24tcG93ZXItb2YtMiBidWZmZXIgc2l6ZXMsIHNvIGNvdWxkIHJlbW92ZSB0aGUgcm91bmR1cAorICAgIHJldHVybiBzaXplb2YoU2hhcmVkKSArIHJvdW5kdXAoc2l6ZSk7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvV3JpdGVyLmNwcCBiL21lZGlhL2xpYm5ibG9nL1dyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEzYmQ1MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL1dyaXRlci5jcHAKQEAgLTAsMCArMSwzMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk5CTG9nIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FbnRyeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1RpbWVsaW5lLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvV3JpdGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIE5CTG9nIHsKKworV3JpdGVyOjpXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSkKKyAgICA6IG1TaGFyZWQoKFNoYXJlZCAqKSBzaGFyZWQpLAorICAgICAgbUZpZm8obVNoYXJlZCAhPSBOVUxMID8KKyAgICAgICAgbmV3IGF1ZGlvX3V0aWxzX2ZpZm8oc2l6ZSwgc2l6ZW9mKHVpbnQ4X3QpLAorICAgICAgICAgICAgbVNoYXJlZC0+bUJ1ZmZlciwgbVNoYXJlZC0+bVJlYXIsIE5VTEwgLyp0aHJvdHRsZXNGcm9udCovKSA6IE5VTEwpLAorICAgICAgbUZpZm9Xcml0ZXIobUZpZm8gIT0gTlVMTCA/IG5ldyBhdWRpb191dGlsc19maWZvX3dyaXRlcigqbUZpZm8pIDogTlVMTCksCisgICAgICBtRW5hYmxlZChtRmlmb1dyaXRlciAhPSBOVUxMKQoreworICAgIC8vIGNhY2hpbmcgcGlkIGFuZCBwcm9jZXNzIG5hbWUKKyAgICBwaWRfdCBpZCA9IDo6Z2V0cGlkKCk7CisgICAgY2hhciBwcm9jTmFtZVsxNl07CisgICAgaW50IHN0YXR1cyA9IHByY3RsKFBSX0dFVF9OQU1FLCBwcm9jTmFtZSk7CisgICAgaWYgKHN0YXR1cykgeyAgLy8gZXJyb3IgZ2V0dGluZyBwcm9jZXNzIG5hbWUKKyAgICAgICAgcHJvY05hbWVbMF0gPSAnXDAnOworICAgIH0KKyAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKHByb2NOYW1lKTsKKyAgICBtUGlkVGFnU2l6ZSA9IGxlbmd0aCArIHNpemVvZihwaWRfdCk7CisgICAgbVBpZFRhZyA9IG5ldyBjaGFyW21QaWRUYWdTaXplXTsKKyAgICBtZW1jcHkobVBpZFRhZywgJmlkLCBzaXplb2YocGlkX3QpKTsKKyAgICBtZW1jcHkobVBpZFRhZyArIHNpemVvZihwaWRfdCksIHByb2NOYW1lLCBsZW5ndGgpOworfQorCitXcml0ZXI6OldyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpCisgICAgOiBXcml0ZXIoaU1lbW9yeSAhPSAwID8gKFNoYXJlZCAqKSBpTWVtb3J5LT5wb2ludGVyKCkgOiBOVUxMLCBzaXplKQoreworICAgIG1JTWVtb3J5ID0gaU1lbW9yeTsKK30KKworV3JpdGVyOjp+V3JpdGVyKCkKK3sKKyAgICBkZWxldGUgbUZpZm9Xcml0ZXI7CisgICAgZGVsZXRlIG1GaWZvOworICAgIGRlbGV0ZVtdIG1QaWRUYWc7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2coY29uc3QgY2hhciAqc3RyaW5nKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0cmluZyA9PSBOVUxMLCAiQXR0ZW1wdGVkIHRvIGxvZyBOVUxMIHN0cmluZyIpOworICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4oc3RyaW5nKTsKKyAgICBpZiAobGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKKyAgICAgICAgbGVuZ3RoID0gRW50cnk6OmtNYXhMZW5ndGg7CisgICAgfQorICAgIGxvZyhFVkVOVF9TVFJJTkcsIHN0cmluZywgbGVuZ3RoKTsKK30KKwordm9pZCBXcml0ZXI6OmxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgV3JpdGVyOjpsb2d2ZihmbXQsIGFwKTsgICAgIC8vIHRoZSBXcml0ZXI6OiBpcyBuZWVkZWQgdG8gYXZvaWQgdmlydHVhbCBkaXNwYXRjaCBmb3IgTG9ja2VkV3JpdGVyCisgICAgdmFfZW5kKGFwKTsKK30KKwordm9pZCBXcml0ZXI6OmxvZ1RpbWVzdGFtcCgpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKyAgICBpZiAoIWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpKSB7CisgICAgICAgIGxvZyhFVkVOVF9USU1FU1RBTVAsICZ0cywgc2l6ZW9mKHRzKSk7CisgICAgfQorfQorCit2b2lkIFdyaXRlcjo6bG9nRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCAuLi4pCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoYXAsIGhhc2gpOworICAgIFdyaXRlcjo6bG9nVkZvcm1hdChmbXQsIGhhc2gsIGFwKTsKKyAgICB2YV9lbmQoYXApOworfQorCit2b2lkIFdyaXRlcjo6bG9nRXZlbnRIaXN0VHMoRXZlbnQgZXZlbnQsIGxvZ19oYXNoX3QgaGFzaCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgSGlzdFRzRW50cnkgZGF0YTsKKyAgICBkYXRhLmhhc2ggPSBoYXNoOworICAgIGRhdGEudHMgPSBzeXN0ZW1UaW1lKCk7CisgICAgaWYgKGRhdGEudHMgPiAwKSB7CisgICAgICAgIGxvZyhldmVudCwgJmRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdGltZXN0YW1wIik7CisgICAgfQorfQorCitib29sIFdyaXRlcjo6aXNFbmFibGVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbUVuYWJsZWQ7Cit9CisKK2Jvb2wgV3JpdGVyOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBib29sIG9sZCA9IG1FbmFibGVkOworICAgIG1FbmFibGVkID0gZW5hYmxlZCAmJiBtU2hhcmVkICE9IE5VTEw7CisgICAgcmV0dXJuIG9sZDsKK30KKwordm9pZCBXcml0ZXI6OmxvZyhjb25zdCBFbnRyeSAmZXRyLCBib29sIHRydXN0ZWQpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghdHJ1c3RlZCkgeworICAgICAgICBsb2coZXRyLm1FdmVudCwgZXRyLm1EYXRhLCBldHIubUxlbmd0aCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3Qgc2l6ZV90IG5lZWQgPSBldHIubUxlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWQ7IC8vIG1FdmVudCwgbUxlbmd0aCwgZGF0YVttTGVuZ3RoXSwgbUxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkID0gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gRklGTworCisgICAgLy8gRklYTUUgb3B0aW1pemUgdGhpcyB1c2luZyBtZW1jcHkgZm9yIHRoZSBkYXRhIHBhcnQgb2YgdGhlIEVudHJ5LgorICAgIC8vIFRoZSBFbnRyeSBjb3VsZCBoYXZlIGEgbWV0aG9kIGNvcHlUbyhwdHIsIG9mZnNldCwgc2l6ZSkgdG8gb3B0aW1pemUgdGhlIGNvcHkuCisgICAgLy8gY2hlY2tzIHNpemUgb2YgYSBzaW5nbGUgbG9nIEVudHJ5OiB0eXBlLCBsZW5ndGgsIGRhdGEgcG9pbnRlciBhbmQgZW5kaW5nCisgICAgdWludDhfdCB0ZW1wW0VudHJ5OjprTWF4TGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZF07CisgICAgLy8gd3JpdGUgdGhpcyBkYXRhIHRvIHRlbXAgYXJyYXkKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5lZWQ7IGkrKykgeworICAgICAgICB0ZW1wW2ldID0gZXRyLmNvcHlFbnRyeURhdGFBdChpKTsKKyAgICB9CisgICAgLy8gd3JpdGUgdG8gY2lyY3VsYXIgYnVmZmVyCisgICAgbUZpZm9Xcml0ZXItPndyaXRlKHRlbXAsIG5lZWQpOworfQorCit2b2lkIFdyaXRlcjo6bG9nKEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZGF0YSA9PSBOVUxMIHx8IGxlbmd0aCA+IEVudHJ5OjprTWF4TGVuZ3RoKSB7CisgICAgICAgIC8vIFRPRE8gUGVyaGFwcyBpdCBtYWtlcyBzZW5zZSB0byBkaXNwbGF5IHRydW5jYXRlZCBkYXRhIG9yIGF0IGxlYXN0IGEKKyAgICAgICAgLy8gICAgICBtZXNzYWdlIHRoYXQgdGhlIGRhdGEgaXMgdG9vIGxvbmc/ICBUaGUgY3VycmVudCBiZWhhdmlvciBjYW4gY3JlYXRlCisgICAgICAgIC8vICAgICAgYSBjb25mdXNpb24gZm9yIGEgcHJvZ3JhbW1lciBkZWJ1Z2dpbmcgdGhlaXIgY29kZS4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBJZ25vcmUgaWYgaW52YWxpZCBldmVudAorICAgIGlmIChldmVudCA9PSBFVkVOVF9SRVNFUlZFRCB8fCBldmVudCA+PSBFVkVOVF9VUFBFUl9CT1VORCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEVudHJ5IGV0cihldmVudCwgZGF0YSwgbGVuZ3RoKTsKKyAgICBsb2coZXRyLCB0cnVlIC8qdHJ1c3RlZCovKTsKK30KKwordm9pZCBXcml0ZXI6OmxvZ3ZmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2hhciBidWZmZXJbRW50cnk6OmtNYXhMZW5ndGggKyAxIC8qTlVMKi9dOworICAgIGludCBsZW5ndGggPSB2c25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgZm10LCBhcCk7CisgICAgaWYgKGxlbmd0aCA+PSAoaW50KSBzaXplb2YoYnVmZmVyKSkgeworICAgICAgICBsZW5ndGggPSBzaXplb2YoYnVmZmVyKSAtIDE7CisgICAgICAgIC8vIE5VTCB0ZXJtaW5hdGlvbiBpcyBub3QgcmVxdWlyZWQKKyAgICAgICAgLy8gYnVmZmVyW2xlbmd0aF0gPSAnXDAnOworICAgIH0KKyAgICBpZiAobGVuZ3RoID49IDApIHsKKyAgICAgICAgbG9nKEVWRU5UX1NUUklORywgYnVmZmVyLCBsZW5ndGgpOworICAgIH0KK30KKwordm9pZCBXcml0ZXI6OmxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihmbXQpOworICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgeworICAgICAgICBsZW5ndGggPSBFbnRyeTo6a01heExlbmd0aDsKKyAgICB9CisgICAgbG9nKEVWRU5UX0ZNVF9TVEFSVCwgZm10LCBsZW5ndGgpOworfQorCit2b2lkIFdyaXRlcjo6bG9nVGltZXN0YW1wRm9ybWF0KCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgbnNlY3NfdCB0cyA9IHN5c3RlbVRpbWUoKTsKKyAgICBpZiAodHMgPiAwKSB7CisgICAgICAgIGxvZyhFVkVOVF9GTVRfVElNRVNUQU1QLCAmdHMsIHNpemVvZih0cykpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHRpbWVzdGFtcCIpOworICAgIH0KK30KKwordm9pZCBXcml0ZXI6OmxvZ1ZGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIHZhX2xpc3QgYXJncCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgV3JpdGVyOjpsb2dTdGFydChmbXQpOworICAgIGludCBpOworICAgIGRvdWJsZSBkOworICAgIGZsb2F0IGY7CisgICAgY2hhciogczsKKyAgICBzaXplX3QgbGVuZ3RoOworICAgIGludDY0X3QgdDsKKyAgICBXcml0ZXI6OmxvZ1RpbWVzdGFtcEZvcm1hdCgpOworICAgIGxvZyhFVkVOVF9GTVRfSEFTSCwgJmhhc2gsIHNpemVvZihoYXNoKSk7CisgICAgZm9yIChjb25zdCBjaGFyICpwID0gZm10OyAqcCAhPSAnXDAnOyBwKyspIHsKKyAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IG1vcmUgY29tcGxleCBmb3JtYXR0aW5nIHN1Y2ggYXMgJS4zZgorICAgICAgICBpZiAoKnAgIT0gJyUnKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2goKisrcCkgeworICAgICAgICBjYXNlICdzJzogLy8gc3RyaW5nCisgICAgICAgICAgICBzID0gdmFfYXJnKGFyZ3AsIGNoYXIgKik7CisgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocyk7CisgICAgICAgICAgICBpZiAobGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBsZW5ndGggPSBFbnRyeTo6a01heExlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZyhFVkVOVF9GTVRfU1RSSU5HLCBzLCBsZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAndCc6IC8vIHRpbWVzdGFtcAorICAgICAgICAgICAgdCA9IHZhX2FyZyhhcmdwLCBpbnQ2NF90KTsKKyAgICAgICAgICAgIGxvZyhFVkVOVF9GTVRfVElNRVNUQU1QLCAmdCwgc2l6ZW9mKHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2QnOiAvLyBpbnRlZ2VyCisgICAgICAgICAgICBpID0gdmFfYXJnKGFyZ3AsIGludCk7CisgICAgICAgICAgICBsb2coRVZFTlRfRk1UX0lOVEVHRVIsICZpLCBzaXplb2YoaSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnZic6IC8vIGZsb2F0CisgICAgICAgICAgICBkID0gdmFfYXJnKGFyZ3AsIGRvdWJsZSk7IC8vIGZsb2F0IGFyZ3VtZW50cyBhcmUgcHJvbW90ZWQgdG8gZG91YmxlIGluIHZhcmFyZyBsaXN0cworICAgICAgICAgICAgZiA9IChmbG9hdClkOworICAgICAgICAgICAgbG9nKEVWRU5UX0ZNVF9GTE9BVCwgJmYsIHNpemVvZihmKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdwJzogLy8gcGlkCisgICAgICAgICAgICBsb2coRVZFTlRfRk1UX1BJRCwgbVBpZFRhZywgbVBpZFRhZ1NpemUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gdGhlICIlXDAiIGNhc2UgZmluaXNoZXMgcGFyc2luZworICAgICAgICBjYXNlICdcMCc6CisgICAgICAgICAgICAtLXA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICclJzoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiTkJMb2cgV3JpdGVyIHBhcnNlZCBpbnZhbGlkIGZvcm1hdCBzcGVjaWZpZXI6ICVjIiwgKnApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgRW50cnkgZXRyKEVWRU5UX0ZNVF9FTkQsIG51bGxwdHIsIDApOworICAgIGxvZyhldHIsIHRydWUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTG9ja2VkV3JpdGVyOjpMb2NrZWRXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSkKKyAgICA6IFdyaXRlcihzaGFyZWQsIHNpemUpCit7Cit9CisKK2Jvb2wgTG9ja2VkV3JpdGVyOjppc0VuYWJsZWQoKSBjb25zdAoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIFdyaXRlcjo6aXNFbmFibGVkKCk7Cit9CisKK2Jvb2wgTG9ja2VkV3JpdGVyOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBXcml0ZXI6OnNldEVuYWJsZWQoZW5hYmxlZCk7Cit9CisKK3ZvaWQgTG9ja2VkV3JpdGVyOjpsb2coY29uc3QgRW50cnkgJmVudHJ5LCBib29sIHRydXN0ZWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIFdyaXRlcjo6bG9nKGVudHJ5LCB0cnVzdGVkKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL0VudHJ5LmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL0VudHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmMDBiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvRW50cnkuaApAQCAtMCwwICsxLDIzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19FTlRSWV9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfRU5UUllfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisKK2NsYXNzIGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCisvLyBlbnRyeSByZXByZXNlbnRhdGlvbiBpbiBtZW1vcnkKK3N0cnVjdCBlbnRyeSB7CisgICAgY29uc3QgdWludDhfdCB0eXBlOworICAgIGNvbnN0IHVpbnQ4X3QgbGVuZ3RoOworICAgIGNvbnN0IHVpbnQ4X3QgZGF0YVswXTsKK307CisKKy8vIGVudHJ5IHRhaWwgcmVwcmVzZW50YXRpb24gKGFmdGVyIGRhdGEpCitzdHJ1Y3QgZW5kaW5nIHsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICB1aW50OF90IG5leHRbMF07Cit9OworCisvLyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBsb2cgZW50cnkgaW4gc2hhcmVkIG1lbW9yeQorLy8gIGJ5dGVbMF0gICAgICAgICAgICAgbUV2ZW50CisvLyAgYnl0ZVsxXSAgICAgICAgICAgICBtTGVuZ3RoCisvLyAgYnl0ZVsyXSAgICAgICAgICAgICBtRGF0YVswXQorLy8gIC4uLgorLy8gIGJ5dGVbMitpXSAgICAgICAgICAgbURhdGFbaV0KKy8vICAuLi4KKy8vICBieXRlWzIrbUxlbmd0aC0xXSAgIG1EYXRhW21MZW5ndGgtMV0KKy8vICBieXRlWzIrbUxlbmd0aF0gICAgIGR1cGxpY2F0ZSBjb3B5IG9mIG1MZW5ndGggdG8gcGVybWl0IHJldmVyc2Ugc2NhbgorLy8gIGJ5dGVbMyttTGVuZ3RoXSAgICAgc3RhcnQgb2YgbmV4dCBsb2cgZW50cnkKK2NsYXNzIEVudHJ5IHsKK3B1YmxpYzoKKyAgICBFbnRyeShFdmVudCBldmVudCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkKKyAgICAgICAgOiBtRXZlbnQoZXZlbnQpLCBtTGVuZ3RoKGxlbmd0aCksIG1EYXRhKGRhdGEpIHt9CisgICAgfkVudHJ5KCkge30KKworICAgIC8vIHVzZWQgZHVyaW5nIHdyaXRpbmcgdG8gZm9ybWF0IEVudHJ5IGluZm9ybWF0aW9uIGFzIGZvbGxvd3M6CisgICAgLy8gW3R5cGVdW2xlbmd0aF1bZGF0YSAuLi4gXVtsZW5ndGhdCisgICAgaW50ICAgICBjb3B5RW50cnlEYXRhQXQoc2l6ZV90IG9mZnNldCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFdyaXRlcjsKKyAgICBFdmVudCAgICAgICBtRXZlbnQ7ICAgICAvLyBldmVudCB0eXBlCisgICAgdWludDhfdCAgICAgbUxlbmd0aDsgICAgLy8gbGVuZ3RoIG9mIGFkZGl0aW9uYWwgZGF0YSwgMCA8PSBtTGVuZ3RoIDw9IGtNYXhMZW5ndGgKKyAgICBjb25zdCB2b2lkICptRGF0YTsgICAgICAvLyBldmVudCB0eXBlLXNwZWNpZmljIGRhdGEKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhMZW5ndGggPSAyNTU7CitwdWJsaWM6CisgICAgLy8gbUV2ZW50LCBtTGVuZ3RoLCBtRGF0YVsuLi5dLCBkdXBsaWNhdGUgbUxlbmd0aAorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga092ZXJoZWFkID0gc2l6ZW9mKGVudHJ5KSArIHNpemVvZihlbmRpbmcpOworICAgIC8vIGVuZGluZCBsZW5ndGggb2YgcHJldmlvdXMgZW50cnkKKyAgICBzdGF0aWMgY29uc3Qgc3NpemVfdCBrUHJldmlvdXNMZW5ndGhPZmZzZXQgPSAtIHNpemVvZihlbmRpbmcpICsKKyAgICAgICAgb2Zmc2V0b2YoZW5kaW5nLCBsZW5ndGgpOworfTsKKworLy8gZW50cnkgaXRlcmF0b3IKK2NsYXNzIEVudHJ5SXRlcmF0b3IgeworcHVibGljOgorICAgIC8vIFVzZWQgZm9yIGR1bW15IGluaXRpYWxpemF0aW9uLiBQZXJmb3JtaW5nIG9wZXJhdGlvbnMgb24gYSBkZWZhdWx0LWNvbnN0cnVjdGVkCisgICAgLy8gRW50cnlJdGVyYXRvciBvdGhlciB0aGFuIGFzc2lnbmluZyBpdCB0byBhbm90aGVyIHZhbGlkIEVudHJ5SXRlcmF0b3IKKyAgICAvLyBpcyB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgRW50cnlJdGVyYXRvcigpOworICAgIC8vIENhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSBlbnRyeSBpcyBub3QgbnVsbHB0ci4KKyAgICAvLyBQYXNzaW5nIGluIG51bGxwdHIgY2FuIHJlc3VsdCBpbiB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgZXhwbGljaXQgRW50cnlJdGVyYXRvcihjb25zdCB1aW50OF90ICplbnRyeSk7CisgICAgRW50cnlJdGVyYXRvcihjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcik7CisKKyAgICAvLyBkZXJlZmVyZW5jZSB1bmRlcmx5aW5nIGVudHJ5CisgICAgY29uc3QgZW50cnkmICAgIG9wZXJhdG9yKigpIGNvbnN0OworICAgIGNvbnN0IGVudHJ5KiAgICBvcGVyYXRvci0+KCkgY29uc3Q7CisgICAgLy8gYWR2YW5jZSB0byBuZXh0IGVudHJ5CisgICAgRW50cnlJdGVyYXRvciYgIG9wZXJhdG9yKysoKTsgLy8gKytpCisgICAgLy8gYmFjayB0byBwcmV2aW91cyBlbnRyeQorICAgIEVudHJ5SXRlcmF0b3ImICBvcGVyYXRvci0tKCk7IC8vIC0taQorICAgIC8vIHJldHVybnMgYW4gRW50cnlJdGVyYXRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBuZXh0IGVudHJ5CisgICAgRW50cnlJdGVyYXRvciAgIG5leHQoKSBjb25zdDsKKyAgICAvLyByZXR1cm5zIGFuIEVudHJ5SXRlcmF0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgcHJldmlvdXMgZW50cnkKKyAgICBFbnRyeUl0ZXJhdG9yICAgcHJldigpIGNvbnN0OworICAgIGJvb2wgICAgICAgICAgICBvcGVyYXRvciE9KGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdDsKKyAgICBpbnQgICAgICAgICAgICAgb3BlcmF0b3ItKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdDsKKworICAgIGJvb2wgICAgICAgICAgICBoYXNDb25zaXN0ZW50TGVuZ3RoKCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgIGNvcHlUbyhzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QpIGNvbnN0OworICAgIHZvaWQgICAgICAgICAgICBjb3B5RGF0YSh1aW50OF90ICpkc3QpIGNvbnN0OworCisgICAgLy8gbWVtY3B5IHByZWZlcnJlZCB0byByZWludGVycHJldF9jYXN0IHRvIGF2b2lkIHBvdGVudGlhbGx5IHVuc3VwcG9ydGVkCisgICAgLy8gdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MuCisjaWYgMAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIGNvbnN0IFQmIHBheWxvYWQoKSB7CisgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUICo+KG1QdHIgKyBvZmZzZXRvZihlbnRyeSwgZGF0YSkpOworICAgIH0KKyNlbHNlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgVCBwYXlsb2FkKCkgY29uc3QgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlPFQ+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICYmICFzdGQ6OmlzX3BvaW50ZXI8VD46OnZhbHVlLAorICAgICAgICAgICAgICAgICJOQkxvZzo6RW50cnlJdGVyYXRvciBwYXlsb2FkIG11c3QgYmUgdHJpdmlhbGx5IGNvcHlhYmxlLCBub24tcG9pbnRlciB0eXBlLiIpOworICAgICAgICBUIHBheWxvYWQ7CisgICAgICAgIG1lbWNweSgmcGF5bG9hZCwgbVB0ciArIG9mZnNldG9mKGVudHJ5LCBkYXRhKSwgc2l6ZW9mKHBheWxvYWQpKTsKKyAgICAgICAgcmV0dXJuIHBheWxvYWQ7CisgICAgfQorI2VuZGlmCisKKyAgICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgdWludDhfdCooKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUHRyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBjb25zdCB1aW50OF90ICAqbVB0cjsgICAvLyBTaG91bGQgbm90IGJlIG51bGxwdHIgZXhjZXB0IGZvciBkdW1teSBpbml0aWFsaXphdGlvbgorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgZm9sbG93aW5nIGNsYXNzZXMgYXJlIHVzZWQgZm9yIG1lcmdpbmcgaW50byB0aGUgTWVyZ2VyJ3MgYnVmZmVyLgorCitjbGFzcyBBYnN0cmFjdEVudHJ5IHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5BYnN0cmFjdEVudHJ5KCkge30KKworICAgIC8vIGJ1aWxkIGNvbmNyZXRlIGVudHJ5IG9mIGFwcHJvcHJpYXRlIGNsYXNzIGZyb20gcHRyLgorICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QWJzdHJhY3RFbnRyeT4gYnVpbGRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpOworCisgICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSB0aW1lc3RhbXAKKyAgICB2aXJ0dWFsIGludDY0X3QgICAgICAgdGltZXN0YW1wKCkgY29uc3QgPSAwOworCisgICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSdzIHVuaXF1ZSBpZAorICAgIHZpcnR1YWwgbG9nX2hhc2hfdCAgICBoYXNoKCkgY29uc3QgPSAwOworCisgICAgLy8gZW50cnkncyBhdXRob3IgaW5kZXggKC0xIGlmIG5vbmUgcHJlc2VudCkKKyAgICAvLyBhIE1lcmdlciBoYXMgYSB2ZWN0b3Igb2YgUmVhZGVycywgYXV0aG9yIHNpbXBseSBwb2ludHMgdG8gdGhlIGluZGV4IG9mIHRoZQorICAgIC8vIFJlYWRlciB0aGF0IG9yaWdpbmF0ZWQgdGhlIGVudHJ5CisgICAgLy8gVE9ETyBjb25zaWRlciBjaGFuZ2luZyB0byB1aW50MzJfdAorICAgIHZpcnR1YWwgaW50ICAgICAgICAgICBhdXRob3IoKSBjb25zdCA9IDA7CisKKyAgICAvLyBjb3B5IGVudHJ5LCBhZGRpbmcgYXV0aG9yIGJlZm9yZSB0aW1lc3RhbXAsIHJldHVybnMgaXRlcmF0b3IgdG8gZW5kIG9mIGVudHJ5CisgICAgdmlydHVhbCBFbnRyeUl0ZXJhdG9yIGNvcHlXaXRoQXV0aG9yKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgLy8gRW50cnkgc3RhcnRpbmcgaW4gdGhlIGdpdmVuIHBvaW50ZXIsIHdoaWNoIHNoYWxsIG5vdCBiZSBudWxscHRyLgorICAgIGV4cGxpY2l0IEFic3RyYWN0RW50cnkoY29uc3QgdWludDhfdCAqZW50cnkpIDogbUVudHJ5KGVudHJ5KSB7fQorICAgIC8vIGNvcGllcyBvcmRpbmFyeSBlbnRyeSBmcm9tIHNyYyB0byBkc3QsIGFuZCByZXR1cm5zIGxlbmd0aCBvZiBlbnRyeQorICAgIC8vIHNpemVfdCAgICAgIGNvcHlFbnRyeShhdWRpb191dGlsc19maWZvX3dyaXRlciAqZHN0LCBjb25zdCBpdGVyYXRvciAmaXQpOworICAgIGNvbnN0IHVpbnQ4X3QgKiBjb25zdCBtRW50cnk7Cit9OworCisvLyBBUEkgZm9yIGhhbmRsaW5nIGZvcm1hdCBlbnRyeSBvcGVyYXRpb25zCisKKy8vIGEgZm9ybWF0dGVkIGVudHJ5IGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKy8vICAgICogRk1UX1NUQVJUIGVudHJ5LCBjb250YWluaW5nIHRoZSBmb3JtYXQgc3RyaW5nCisvLyAgICAqIFRJTUVTVEFNUCBlbnRyeQorLy8gICAgKiBIQVNIIGVudHJ5CisvLyAgICAqIGF1dGhvciBlbnRyeSBvZiB0aGUgdGhyZWFkIHRoYXQgZ2VuZXJhdGVkIGl0IChvcHRpb25hbCwgcHJlc2VudCBpbiBtZXJnZWQgbG9nKQorLy8gICAgKiBmb3JtYXQgYXJnMQorLy8gICAgKiBmb3JtYXQgYXJnMgorLy8gICAgKiAuLi4KKy8vICAgICogRk1UX0VORCBlbnRyeQorY2xhc3MgRm9ybWF0RW50cnkgOiBwdWJsaWMgQWJzdHJhY3RFbnRyeSB7CitwdWJsaWM6CisgICAgLy8gZXhwbGljaXQgRm9ybWF0RW50cnkoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpOworICAgIGV4cGxpY2l0IEZvcm1hdEVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cikgOiBBYnN0cmFjdEVudHJ5KHB0cikge30KKyAgICB+Rm9ybWF0RW50cnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBFbnRyeUl0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7CisKKyAgICAvLyBFbnRyeSdzIGZvcm1hdCBzdHJpbmcKKyAgICBjb25zdCBjaGFyKiAgIGZvcm1hdFN0cmluZygpIGNvbnN0OworCisgICAgLy8gRW5ydHkncyBmb3JtYXQgc3RyaW5nIGxlbmd0aAorICAgIHNpemVfdCAgICAgICAgZm9ybWF0U3RyaW5nTGVuZ3RoKCkgY29uc3Q7CisKKyAgICAvLyBGb3JtYXQgYXJndW1lbnRzIChleGNsdWRpbmcgZm9ybWF0IHN0cmluZywgdGltZXN0YW1wIGFuZCBhdXRob3IpCisgICAgRW50cnlJdGVyYXRvciBhcmdzKCkgY29uc3Q7CisKKyAgICAvLyBnZXQgZm9ybWF0IGVudHJ5IHRpbWVzdGFtcAorICAgIGludDY0X3QgICAgICAgdGltZXN0YW1wKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBnZXQgZm9ybWF0IGVudHJ5J3MgdW5pcXVlIGlkCisgICAgbG9nX2hhc2hfdCAgICBoYXNoKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBlbnRyeSdzIGF1dGhvciBpbmRleCAoLTEgaWYgbm9uZSBwcmVzZW50KQorICAgIC8vIGEgTWVyZ2VyIGhhcyBhIHZlY3RvciBvZiBSZWFkZXJzLCBhdXRob3Igc2ltcGx5IHBvaW50cyB0byB0aGUgaW5kZXggb2YgdGhlCisgICAgLy8gUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKKyAgICBpbnQgICAgICAgICAgIGF1dGhvcigpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gY29weSBlbnRyeSwgYWRkaW5nIGF1dGhvciBiZWZvcmUgdGltZXN0YW1wLCByZXR1cm5zIHNpemUgb2Ygb3JpZ2luYWwgZW50cnkKKyAgICBFbnRyeUl0ZXJhdG9yIGNvcHlXaXRoQXV0aG9yKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRob3IpIGNvbnN0IG92ZXJyaWRlOworfTsKKworY2xhc3MgSGlzdG9ncmFtRW50cnkgOiBwdWJsaWMgQWJzdHJhY3RFbnRyeSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSGlzdG9ncmFtRW50cnkoY29uc3QgdWludDhfdCAqcHRyKSA6IEFic3RyYWN0RW50cnkocHRyKSB7fQorICAgIH5IaXN0b2dyYW1FbnRyeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIGludDY0X3QgICAgICAgdGltZXN0YW1wKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBsb2dfaGFzaF90ICAgIGhhc2goKSBjb25zdCBvdmVycmlkZTsKKworICAgIGludCAgICAgICAgICAgYXV0aG9yKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBFbnRyeUl0ZXJhdG9yIGNvcHlXaXRoQXV0aG9yKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRob3IpIGNvbnN0IG92ZXJyaWRlOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19FTlRSWV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL0V2ZW50cy5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9FdmVudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2E0ZmU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9FdmVudHMuaApAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19FVkVOVFNfSAorI2RlZmluZSBBTkRST0lEX01FRElBX05CTE9HX0VWRU5UU19ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIE5CTG9nIHsKKworLy8gVE9ETyBoYXZlIGEgY29tbWVudCBzb21ld2hlcmUgZXhwbGFpbmluZyB0aGUgd2hvbGUgcHJvY2VzcyBmb3IgYWRkaW5nIGEgbmV3IEVWRU5UXworCisvLyBOQkxvZyBFdmVudCB0eXBlcy4gVGhlIEV2ZW50cyBhcmUgbmFtZWQgdG8gcHJvdmlkZSBjb250ZXh0dWFsIG1lYW5pbmcgZm9yIHdoYXQgaXMgbG9nZ2VkLgorLy8gSWYgYWRkaW5nIGEgbmV3IHN0YW5kYWxvbmUgRXZlbnQgaGVyZSwgdXBkYXRlIHRoZSBldmVudC10by10eXBlIG1hcHBpbmcgYnkgYWRkaW5nIGEKKy8vIE1BUF9FVkVOVF9UT19UWVBFIHN0YXRlbWVudCBiZWxvdy4KKy8vIFhYWCBOb3RlIHRoYXQgYXMgb2YgdGhlIGN1cnJlbnQgZGVzaWduLCBFdmVudHMgc2hvdWxkIG5vdCBiZSByZW51bWJlcmVkIChpLmUuIHJlb3JkZXJlZCkKKy8vIGlmIHRoZXkgZXZlciBsZWF2ZSBtZW1vcnkgKGZvciBleGFtcGxlLCB3cml0dGVuIHRvIGZpbGUsIHVwbG9hZGVkIHRvIGNsb3VkLCBldGMuKS4KKy8vIFRPRE8gbWFrZSBzb21lIHNvcnQgb2YgaW50ZXJmYWNlIHRvIGtlZXAgdGhlc2UgImNvbnRyYWN0IiBjb25zdGFudHMuCitlbnVtIEV2ZW50IDogdWludDhfdCB7CisgICAgRVZFTlRfUkVTRVJWRUQsCisgICAgRVZFTlRfU1RSSU5HLCAgICAgICAgICAgICAgIC8vIEFTQ0lJIHN0cmluZywgbm90IE5VTC10ZXJtaW5hdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IG1ha2UgdGltZXN0YW1wIG9wdGlvbmFsCisgICAgRVZFTlRfVElNRVNUQU1QLCAgICAgICAgICAgIC8vIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKQorCisgICAgLy8gVHlwZXMgZm9yIEZvcm1hdCBFbnRyeSwgaS5lLiBmb3JtYXR0ZWQgZW50cnkKKyAgICBFVkVOVF9GTVRfU1RBUlQsICAgICAgICAgICAgLy8gbG9nRm9ybWF0IHN0YXJ0IGV2ZW50OiBlbnRyeSBpbmNsdWRlcyBmb3JtYXQgc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb2xsb3dpbmcgZW50cmllcyBjb250YWluIGZvcm1hdCBhcmd1bWVudHMKKyAgICAvLyBmb3JtYXQgYXJndW1lbnRzCisgICAgRVZFTlRfRk1UX0FVVEhPUiwgICAgICAgICAgIC8vIGF1dGhvciBpbmRleCAocHJlc2VudCBpbiBtZXJnZWQgbG9ncykgdHJhY2tzIGVudHJ5J3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JpZ2luYWwgbG9nCisgICAgRVZFTlRfRk1UX0ZMT0FULCAgICAgICAgICAgIC8vIGZsb2F0aW5nIHBvaW50IHZhbHVlIGVudHJ5CisgICAgRVZFTlRfRk1UX0hBU0gsICAgICAgICAgICAgIC8vIHVuaXF1ZSBIQVNIIG9mIGxvZyBvcmlnaW4sIG9yaWdpbmF0ZXMgZnJvbSBoYXNoIG9mIGZpbGUgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbGluZSBudW1iZXIKKyAgICBFVkVOVF9GTVRfSU5URUdFUiwgICAgICAgICAgLy8gaW50ZWdlciB2YWx1ZSBlbnRyeQorICAgIEVWRU5UX0ZNVF9QSUQsICAgICAgICAgICAgICAvLyBwcm9jZXNzIElEIGFuZCBwcm9jZXNzIG5hbWUKKyAgICBFVkVOVF9GTVRfU1RSSU5HLCAgICAgICAgICAgLy8gc3RyaW5nIHZhbHVlIGVudHJ5CisgICAgRVZFTlRfRk1UX1RJTUVTVEFNUCwgICAgICAgIC8vIHRpbWVzdGFtcCB2YWx1ZSBlbnRyeQorICAgIC8vIGVuZCBvZiBmb3JtYXQgYXJndW1lbnRzCisgICAgRVZFTlRfRk1UX0VORCwgICAgICAgICAgICAgIC8vIGVuZCBvZiBsb2dGb3JtYXQgYXJndW1lbnQgbGlzdAorCisgICAgLy8gVHlwZXMgZm9yIHdha2V1cCB0aW1lc3RhbXAgaGlzdG9ncmFtcworICAgIEVWRU5UX0FVRElPX1NUQVRFLCAgICAgICAgICAvLyBhdWRpbyBvbi9vZmYgZXZlbnQ6IGxvZ2dlZCBvbiBGYXN0TWl4ZXI6Om9uU3RhdGVDaGFuZ2UgY2FsbAorICAgIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywgICAvLyBzaW5nbGUgZGF0dW0gZm9yIHRpbWVzdGFtcCBoaXN0b2dyYW0KKworICAgIC8vIFR5cGVzIHJlcHJlc2VudGluZyBhdWRpbyBwZXJmb3JtYW5jZSBtZXRyaWNzCisgICAgRVZFTlRfTEFURU5DWSwgICAgICAgICAgICAgIC8vIGRpZmZlcmVuY2UgYmV0d2VlbiBmcmFtZXMgcHJlc2VudGVkIGJ5IEhBTCBhbmQgZnJhbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXR0ZW4gdG8gSEFMIG91dHB1dCBzaW5rLCBkaXZpZGVkIGJ5IHNhbXBsZSByYXRlLgorICAgIEVWRU5UX09WRVJSVU4sICAgICAgICAgICAgICAvLyBwcmVkaWN0ZWQgdGhyZWFkIG92ZXJydW4gZXZlbnQgdGltZXN0YW1wCisgICAgRVZFTlRfVEhSRUFEX0lORk8sICAgICAgICAgIC8vIHNlZSB0aHJlYWRfaW5mb190IGJlbG93CisgICAgRVZFTlRfVU5ERVJSVU4sICAgICAgICAgICAgIC8vIHByZWRpY3RlZCB0aHJlYWQgdW5kZXJydW4gZXZlbnQgdGltZXN0YW1wCisgICAgRVZFTlRfV0FSTVVQX1RJTUUsICAgICAgICAgIC8vIHRocmVhZCB3YXJtdXAgdGltZQorICAgIEVWRU5UX1dPUktfVElNRSwgICAgICAgICAgICAvLyB0aGUgdGltZSBhIHRocmVhZCB0YWtlcyB0byBkbyB3b3JrLCBlLmcuIHJlYWQsIHdyaXRlLCBldGMuCisgICAgRVZFTlRfVEhSRUFEX1BBUkFNUywgICAgICAgIC8vIHNlZSB0aHJlYWRfcGFyYW1zX3QgYmVsb3cKKworICAgIEVWRU5UX1VQUEVSX0JPVU5ELCAgICAgICAgICAvLyB0byBjaGVjayBmb3IgaW52YWxpZCBldmVudHMKK307CisKKy8vIE5CTG9nIGN1c3RvbS1kZWZpbmVkIHN0cnVjdHMuIFNvbWUgTkJMb2cgRXZlbnQgdHlwZXMgbWFwIHRvIHRoZXNlIHN0cnVjdHMuCisKK3VzaW5nIGxvZ19oYXNoX3QgPSB1aW50NjRfdDsKKworLy8gdXNlZCBmb3IgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTIChub3QgbWFwcGVkKQorc3RydWN0IEhpc3RUc0VudHJ5IHsKKyAgICBsb2dfaGFzaF90IGhhc2g7CisgICAgaW50NjRfdCB0czsKK307IC8vVE9ETyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLy8gdXNlZCBmb3IgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTIChub3QgbWFwcGVkKQorc3RydWN0IEhpc3RUc0VudHJ5V2l0aEF1dGhvciB7CisgICAgbG9nX2hhc2hfdCBoYXNoOworICAgIGludDY0X3QgdHM7CisgICAgaW50IGF1dGhvcjsKK307IC8vVE9ETyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworZW51bSBUaHJlYWRUeXBlIHsKKyAgICBVTktOT1dOLAorICAgIE1JWEVSLAorICAgIENBUFRVUkUsCisgICAgRkFTVE1JWEVSLAorICAgIEZBU1RDQVBUVVJFLAorfTsKKworaW5saW5lIGNvbnN0IGNoYXIgKnRocmVhZFR5cGVUb1N0cmluZyhUaHJlYWRUeXBlIHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIE1JWEVSOgorICAgICAgICByZXR1cm4gIk1JWEVSIjsKKyAgICBjYXNlIENBUFRVUkU6CisgICAgICAgIHJldHVybiAiQ0FQVFVSRSI7CisgICAgY2FzZSBGQVNUTUlYRVI6CisgICAgICAgIHJldHVybiAiRkFTVE1JWEVSIjsKKyAgICBjYXNlIEZBU1RDQVBUVVJFOgorICAgICAgICByZXR1cm4gIkZBU1RDQVBUVVJFIjsKKyAgICBjYXNlIFVOS05PV046CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICJVTktOT1dOIjsKKyAgICB9Cit9CisKKy8vIG1hcHBlZCBmcm9tIEVWRU5UX1RIUkVBRF9JTkZPCisvLyBUaGVzZSBmaWVsZHMgYWx3YXlzIHN0YXkgdGhlIHNhbWUgdGhyb3VnaG91dCBhIHRocmVhZCdzIGxpZmV0aW1lIGFuZAorLy8gc2hvdWxkIG9ubHkgbmVlZCB0byBiZSBsb2dnZWQgb25jZSB1cG9uIHRocmVhZCBpbml0aWFsaXphdGlvbi4KKy8vIFRoZXJlIGlzIGN1cnJlbnRseSBubyByZWNvdmVyeSBtZWNoYW5pc20gaWYgdGhlIGxvZyBldmVudCBjb3JyZXNwb25kaW5nCisvLyB0byB0aGlzIHR5cGUgaXMgbG9zdC4KKy8vIFRPRE8gYWRkIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBhZGRpbmcgYSByZWFkZXIgdG8gTWVkaWFMb2dTZXJ2aWNlPworc3RydWN0IHRocmVhZF9pbmZvX3QgeworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkID0gLTE7ICAgICAgLy8gVGhyZWFkIEkvTyBoYW5kbGUKKyAgICBUaHJlYWRUeXBlIHR5cGUgPSBVTktOT1dOOyAgICAgIC8vIFNlZSBlbnVtIFRocmVhZFR5cGUgYWJvdmUKK307CisKKy8vIG1hcHBlZCBmcm9tIEVWRU5UX1RIUkVBRF9QQVJBTVMKKy8vIFRoZXNlIGZpZWxkcyBhcmUgbm90IG5lY2Vzc2FyaWx5IGNvbnN0YW50IHRocm91Z2hvdXQgYSB0aHJlYWQncyBsaWZldGltZSBhbmQKKy8vIGNhbiBiZSBsb2dnZWQgd2hlbmV2ZXIgYSB0aHJlYWQgcmVjZWl2ZXMgbmV3IGNvbmZpZ3VyYXRpb25zIG9yIHBhcmFtZXRlcnMuCitzdHJ1Y3QgdGhyZWFkX3BhcmFtc190IHsKKyAgICBzaXplX3QgZnJhbWVDb3VudCA9IDA7ICAgICAgICAgIC8vIG51bWJlciBvZiBmcmFtZXMgcGVyIHJlYWQgb3Igd3JpdGUgYnVmZmVyCisgICAgdW5zaWduZWQgc2FtcGxlUmF0ZSA9IDA7ICAgICAgICAvLyBpbiBmcmFtZXMgcGVyIHNlY29uZAorfTsKKwordGVtcGxhdGUgPEV2ZW50IEU+IHN0cnVjdCBnZXRfbWFwcGVkOworI2RlZmluZSBNQVBfRVZFTlRfVE9fVFlQRShFLCBUKSBcCit0ZW1wbGF0ZTw+IHN0cnVjdCBnZXRfbWFwcGVkPEU+IHsgXAorICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc190cml2aWFsbHlfY29weWFibGU8VD46OnZhbHVlIFwKKyAgICAgICAgICAgICYmICFzdGQ6OmlzX3BvaW50ZXI8VD46OnZhbHVlLCBcCisgICAgICAgICAgICAiTkJMb2c6OkV2ZW50IG11c3QgbWFwIHRvIHRyaXZpYWxseSBjb3B5YWJsZSwgbm9uLXBvaW50ZXIgdHlwZS4iKTsgXAorICAgIHR5cGVkZWYgVCB0eXBlOyBcCit9CisKKy8vIE1hcHMgYW4gTkJMb2cgRXZlbnQgdHlwZSB0byBhIEMrKyBQT0QgdHlwZS4KK01BUF9FVkVOVF9UT19UWVBFKEVWRU5UX0xBVEVOQ1ksIGRvdWJsZSk7CitNQVBfRVZFTlRfVE9fVFlQRShFVkVOVF9PVkVSUlVOLCBpbnQ2NF90KTsKK01BUF9FVkVOVF9UT19UWVBFKEVWRU5UX1RIUkVBRF9JTkZPLCB0aHJlYWRfaW5mb190KTsKK01BUF9FVkVOVF9UT19UWVBFKEVWRU5UX1VOREVSUlVOLCBpbnQ2NF90KTsKK01BUF9FVkVOVF9UT19UWVBFKEVWRU5UX1dBUk1VUF9USU1FLCBkb3VibGUpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfV09SS19USU1FLCBpbnQ2NF90KTsKK01BUF9FVkVOVF9UT19UWVBFKEVWRU5UX1RIUkVBRF9QQVJBTVMsIHRocmVhZF9wYXJhbXNfdCk7CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfTkJMT0dfRVZFTlRTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTWVyZ2VyLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL01lcmdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTg1MjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL01lcmdlci5oCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX01FUkdFUl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfTUVSR0VSX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlYWRlci5oPgorI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0cmluZzE2OworY2xhc3MgU3RyaW5nODsKKworbmFtZXNwYWNlIE5CTG9nIHsKKworc3RydWN0IFNoYXJlZDsKKworLy8gVE9ETyB1cGRhdGUgY29tbWVudHMgdG8gcmVmbGVjdCBjdXJyZW50IGZ1bmN0aW9uYWxpdGllcworCisvLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVhZCBkYXRhIGZyb20gZWFjaCB0aHJlYWQncyBpbmRpdmlkdWFsIEZJRk8gaW4gc2hhcmVkIG1lbW9yeQorLy8gYW5kIHdyaXRlIGl0IHRvIGEgc2luZ2xlIEZJRk8gaW4gbG9jYWwgbWVtb3J5LgorY2xhc3MgTWVyZ2VyIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIE1lcmdlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKKworICAgIH5NZXJnZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIGFkZFJlYWRlcihjb25zdCBzcDxOQkxvZzo6UmVhZGVyPiAmcmVhZGVyKTsKKyAgICAvLyBUT0RPIGFkZCByZW1vdmVSZWFkZXIKKyAgICB2b2lkIG1lcmdlKCk7CisKKyAgICAvLyBGSVhNRSBUaGlzIGlzIHJldHVybmluZyBhIHJlZmVyZW5jZSB0byBhIHNoYXJlZCB2YXJpYWJsZSB0aGF0IG5lZWRzIGEgbG9jaworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFJlYWRlcj4+JiBnZXRSZWFkZXJzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgLy8gdmVjdG9yIG9mIHRoZSByZWFkZXJzIHRoZSBtZXJnZXIgaXMgc3VwcG9zZWQgdG8gbWVyZ2UgZnJvbS4KKyAgICAvLyBldmVyeSByZWFkZXIgcmVhZHMgZnJvbSBhIHdyaXRlcidzIGJ1ZmZlcgorICAgIC8vIEZJWE1FIE5lZWRzIHRvIGJlIHByb3RlY3RlZCBieSBhIGxvY2sKKyAgICBzdGQ6OnZlY3RvcjxzcDxSZWFkZXI+PiBtUmVhZGVyczsKKworICAgIFNoYXJlZCAqIGNvbnN0IG1TaGFyZWQ7IC8vIHJhdyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmbz4gbUZpZm87IC8vIEZJRk8gaXRzZWxmCisgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiBtRmlmb1dyaXRlcjsgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPCit9OworCisvLyBUaGlzIGNsYXNzIGhhcyBhIHBvaW50ZXIgdG8gdGhlIEZJRk8gaW4gbG9jYWwgbWVtb3J5IHdoaWNoIHN0b3JlcyB0aGUgbWVyZ2VkCisvLyBkYXRhIGNvbGxlY3RlZCBieSBOQkxvZzo6TWVyZ2VyIGZyb20gYWxsIFJlYWRlcnMuIEl0IGlzIHVzZWQgdG8gcHJvY2VzcworLy8gdGhpcyBkYXRhIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIFBlcmZvcm1hbmNlQW5hbHlzaXMuCitjbGFzcyBNZXJnZVJlYWRlciA6IHB1YmxpYyBSZWFkZXIgeworcHVibGljOgorICAgIE1lcmdlUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIE1lcmdlciAmbWVyZ2VyKTsKKworICAgIC8vIHByb2Nlc3MgYSBwYXJ0aWN1bGFyIHNuYXBzaG90IG9mIHRoZSByZWFkZXIKKyAgICB2b2lkIHByb2Nlc3NTbmFwc2hvdChTbmFwc2hvdCAmc25hcCwgaW50IGF1dGhvcik7CisKKyAgICAvLyBjYWxsIGdldFNuYXBzaG90IG9mIHRoZSBjb250ZW50IG9mIHRoZSByZWFkZXIncyBidWZmZXIgYW5kIHByb2Nlc3MgdGhlIGRhdGEKKyAgICB2b2lkIGdldEFuZFByb2Nlc3NTbmFwc2hvdCgpOworCisgICAgLy8gY2hlY2sgZm9yIHBlcmlvZGljIHB1c2ggb2YgcGVyZm9ybWFuY2UgZGF0YSB0byBtZWRpYSBtZXRyaWNzLCBhbmQgcGVyZm9ybQorICAgIC8vIHRoZSBzZW5kIGlmIGl0IGlzIHRpbWUgdG8gZG8gc28uCisgICAgdm9pZCBjaGVja1B1c2hUb01lZGlhTWV0cmljcygpOworCisgICAgdm9pZCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKK3ByaXZhdGU6CisgICAgLy8gRklYTUUgTmVlZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IGEgbG9jaywKKyAgICAvLyAgICAgICBiZWNhdXNlIGV2ZW4gdGhvdWdoIG91ciB1c2Ugb2YgaXQgaXMgcmVhZC1vbmx5IHRoZXJlIG1heSBiZSBhc3luY2hyb25vdXMgdXBkYXRlcworICAgIC8vIFRoZSBvYmplY3QgaXMgb3duZWQgYnkgdGhlIE1lcmdlciBjbGFzcy4KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxSZWFkZXI+PiYgbVJlYWRlcnM7CisKKyAgICAvLyBhbmFseXplcywgY29tcHJlc3NlcyBhbmQgc3RvcmVzIHRoZSBtZXJnZWQgZGF0YQorICAgIC8vIGNvbnRhaW5zIGEgc2VwYXJhdGUgaW5zdGFuY2UgZm9yIGV2ZXJ5IGF1dGhvciAodGhyZWFkKSwgYW5kIGZvciBldmVyeSBzb3VyY2UgZmlsZQorICAgIC8vIGxvY2F0aW9uIHdpdGhpbiBlYWNoIGF1dGhvcgorICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZUFuYWx5c2lzTWFwIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzOworCisgICAgLy8gY29tcHJlc3NlcyBhbmQgc3RvcmVzIGF1ZGlvIHBlcmZvcm1hbmNlIGRhdGEgZnJvbSBlYWNoIHRocmVhZCdzIGJ1ZmZlcnMuCisgICAgLy8gZmlyc3QgcGFyYW1ldGVyIGlzIGF1dGhvciwgaS5lLiB0aHJlYWQgaW5kZXguCisgICAgc3RkOjptYXA8aW50LCBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VEYXRhPiBtVGhyZWFkUGVyZm9ybWFuY2VEYXRhOworCisgICAgLy8gaG93IG9mdGVuIHRvIHB1c2ggZGF0YSB0byBNZWRpYSBNZXRyaWNzCisgICAgc3RhdGljIGNvbnN0ZXhwciBuc2Vjc190IGtQZXJpb2RpY01lZGlhTWV0cmljc1B1c2ggPSBzMm5zKChuc2Vjc190KTIgKiA2MCAqIDYwKTsgLy8gMiBob3VycworCisgICAgLy8gaGFuZGxlIGF1dGhvciBlbnRyeSBieSBsb29raW5nIHVwIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhcHBlbmRpbmcgaXQgdG8gdGhlIGJvZHkKKyAgICAvLyByZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gZm10RW50cnkKKyAgICB2b2lkIGhhbmRsZUF1dGhvcihjb25zdCBBYnN0cmFjdEVudHJ5ICZmbXRFbnRyeSwgU3RyaW5nOCAqYm9keSk7Cit9OworCisvLyBNZXJnZVRocmVhZCBpcyBhIHRocmVhZCB0aGF0IGNvbnRhaW5zIGEgTWVyZ2VyLiBJdCB3b3JrcyBhcyBhIHJldHJpZ2dlcmFibGUgb25lLXNob3Q6CisvLyB3aGVuIHRyaWdnZXJlZCwgaXQgYXdha2VzIGZvciBhIGxhcHNlIG9mIHRpbWUsIGR1cmluZyB3aGljaCBpdCBwZXJpb2RpY2FsbHkgbWVyZ2VzOyBpZgorLy8gcmV0cmlnZ2VyZWQsIHRoZSB0aW1lb3V0IGlzIHJlc2V0LgorLy8gVGhlIHRocmVhZCBpcyB0cmlnZ2VyZWQgb24gQXVkaW9GbGluZ2VyIGJpbmRlciBhY3Rpdml0eS4KK2NsYXNzIE1lcmdlVGhyZWFkIDogcHVibGljIFRocmVhZCB7CitwdWJsaWM6CisgICAgTWVyZ2VUaHJlYWQoTWVyZ2VyICZtZXJnZXIsIE1lcmdlUmVhZGVyICZtZXJnZVJlYWRlcik7CisgICAgfk1lcmdlVGhyZWFkKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBSZXNldCB0aW1lb3V0IGFuZCBhY3RpdmF0ZSB0aHJlYWQgdG8gbWVyZ2UgcGVyaW9kaWNhbGx5IGlmIGl0J3MgaWRsZQorICAgIHZvaWQgd2FrZXVwKCk7CisKKyAgICAvLyBTZXQgdGltZW91dCBwZXJpb2QgdW50aWwgdGhlIG1lcmdpbmcgdGhyZWFkIGdvZXMgaWRsZSBhZ2FpbgorICAgIHZvaWQgc2V0VGltZW91dFVzKGludCB0aW1lKTsKKworcHJpdmF0ZToKKyAgICBib29sIHRocmVhZExvb3AoKSBvdmVycmlkZTsKKworICAgIC8vIHRoZSBtZXJnZXIgd2hvIGFjdHVhbGx5IGRvZXMgdGhlIHdvcmsgb2YgbWVyZ2luZyB0aGUgbG9ncworICAgIE1lcmdlciYgICAgICBtTWVyZ2VyOworCisgICAgLy8gdGhlIG1lcmdlcmVhZGVyIHVzZWQgdG8gcHJvY2VzcyBkYXRhIG1lcmdlZCBieSBtTWVyZ2VyCisgICAgTWVyZ2VSZWFkZXImIG1NZXJnZVJlYWRlcjsKKworICAgIC8vIG11dGV4IGZvciB0aGUgY29uZGl0aW9uIHZhcmlhYmxlCisgICAgTXV0ZXggICAgICAgIG1NdXRleDsKKworICAgIC8vIGNvbmRpdGlvbiB2YXJpYWJsZSB0byBhY3RpdmF0ZSBtZXJnaW5nIG9uIHRpbWVvdXQgPj0gMAorICAgIENvbmRpdGlvbiAgICBtQ29uZDsKKworICAgIC8vIHRpbWUgbGVmdCB1bnRpbCB0aGUgdGhyZWFkIGJsb2NrcyBhZ2FpbiAoaW4gbWljcm9zZWNvbmRzKQorICAgIGludCAgICAgICAgICBtVGltZW91dFVzOworCisgICAgLy8gbWVyZ2luZyBwZXJpb2Qgd2hlbiB0aGUgdGhyZWFkIGlzIGF3YWtlCisgICAgc3RhdGljIGNvbnN0IGludCAga1RocmVhZFNsZWVwUGVyaW9kVXMgPSAxMDAwMDAwIC8qMXMqLzsKKworICAgIC8vIGluaXRpYWwgdGltZW91dCB2YWx1ZSB3aGVuIHRyaWdnZXJlZAorICAgIHN0YXRpYyBjb25zdCBpbnQgIGtUaHJlYWRXYWtldXBQZXJpb2RVcyA9IDMwMDAwMDAgLyozcyovOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19NRVJHRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9OQkxvZy5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9OQkxvZy5oCmluZGV4IGZiNmYxNzkuLmZkNzM1MzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTkJMb2cuaAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL05CTG9nLmgKQEAgLTE5LDU5NSArMTksMTAgQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19ICiAjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfSAogCi0jaW5jbHVkZSA8ZGVxdWU+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdHJpbmc4OwotCi1jbGFzcyBOQkxvZyB7Ci0KLXB1YmxpYzoKLQotICAgIHVzaW5nIGxvZ19oYXNoX3QgPSBSZXBvcnRQZXJmb3JtYW5jZTo6bG9nX2hhc2hfdDsKLQotICAgIC8vIEZJWE1FIEV2ZXJ5dGhpbmcgbmVlZGVkIGZvciBjbGllbnQgKHdyaXRlciBBUEkgYW5kIHJlZ2lzdHJhdGlvbikgc2hvdWxkIGJlIGlzb2xhdGVkCi0gICAgLy8gICAgICAgZnJvbSB0aGUgcmVzdCBvZiB0aGUgaW1wbGVtZW50YXRpb24uCi0gICAgY2xhc3MgV3JpdGVyOwotICAgIGNsYXNzIFJlYWRlcjsKLQotICAgIGVudW0gRXZlbnQgOiB1aW50OF90IHsKLSAgICAgICAgRVZFTlRfUkVTRVJWRUQsCi0gICAgICAgIEVWRU5UX1NUUklORywgICAgICAgICAgICAgICAvLyBBU0NJSSBzdHJpbmcsIG5vdCBOVUwtdGVybWluYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbWFrZSB0aW1lc3RhbXAgb3B0aW9uYWwKLSAgICAgICAgRVZFTlRfVElNRVNUQU1QLCAgICAgICAgICAgIC8vIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKQotICAgICAgICBFVkVOVF9JTlRFR0VSLCAgICAgICAgICAgICAgLy8gaW50ZWdlciB2YWx1ZSBlbnRyeQotICAgICAgICBFVkVOVF9GTE9BVCwgICAgICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgdmFsdWUgZW50cnkKLSAgICAgICAgRVZFTlRfUElELCAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgSUQgYW5kIHByb2Nlc3MgbmFtZQotICAgICAgICBFVkVOVF9BVVRIT1IsICAgICAgICAgICAgICAgLy8gYXV0aG9yIGluZGV4IChwcmVzZW50IGluIG1lcmdlZCBsb2dzKSB0cmFja3MgZW50cnkncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JpZ2luYWwgbG9nCi0gICAgICAgIEVWRU5UX1NUQVJUX0ZNVCwgICAgICAgICAgICAvLyBsb2dGb3JtYXQgc3RhcnQgZXZlbnQ6IGVudHJ5IGluY2x1ZGVzIGZvcm1hdCBzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb2xsb3dpbmcgZW50cmllcyBjb250YWluIGZvcm1hdCBhcmd1bWVudHMKLSAgICAgICAgRVZFTlRfSEFTSCwgICAgICAgICAgICAgICAgIC8vIHVuaXF1ZSBIQVNIIG9mIGxvZyBvcmlnaW4sIG9yaWdpbmF0ZXMgZnJvbSBoYXNoIG9mIGZpbGUgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGxpbmUgbnVtYmVyCi0gICAgICAgIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywgICAvLyBzaW5nbGUgZGF0dW0gZm9yIHRpbWVzdGFtcCBoaXN0b2dyYW0KLSAgICAgICAgRVZFTlRfQVVESU9fU1RBVEUsICAgICAgICAgIC8vIGF1ZGlvIG9uL29mZiBldmVudDogbG9nZ2VkIG9uIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSBjYWxsCi0gICAgICAgIEVWRU5UX0VORF9GTVQsICAgICAgICAgICAgICAvLyBlbmQgb2YgbG9nRm9ybWF0IGFyZ3VtZW50IGxpc3QKLQotICAgICAgICBFVkVOVF9VUFBFUl9CT1VORCwgICAgICAgICAgLy8gdG8gY2hlY2sgZm9yIGludmFsaWQgZXZlbnRzCi0gICAgfTsKLQotcHJpdmF0ZToKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEFQSSBmb3IgaGFuZGxpbmcgZm9ybWF0IGVudHJ5IG9wZXJhdGlvbnMKLQotICAgIC8vIGEgZm9ybWF0dGVkIGVudHJ5IGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKLSAgICAvLyAgICAqIFNUQVJUX0ZNVCBlbnRyeSwgY29udGFpbmluZyB0aGUgZm9ybWF0IHN0cmluZwotICAgIC8vICAgICogVElNRVNUQU1QIGVudHJ5Ci0gICAgLy8gICAgKiBIQVNIIGVudHJ5Ci0gICAgLy8gICAgKiBhdXRob3IgZW50cnkgb2YgdGhlIHRocmVhZCB0aGF0IGdlbmVyYXRlZCBpdCAob3B0aW9uYWwsIHByZXNlbnQgaW4gbWVyZ2VkIGxvZykKLSAgICAvLyAgICAqIGZvcm1hdCBhcmcxCi0gICAgLy8gICAgKiBmb3JtYXQgYXJnMgotICAgIC8vICAgICogLi4uCi0gICAgLy8gICAgKiBFTkRfRk1UIGVudHJ5Ci0KLSAgICAvLyBlbnRyeSByZXByZXNlbnRhdGlvbiBpbiBtZW1vcnkKLSAgICBzdHJ1Y3QgZW50cnkgewotICAgICAgICBjb25zdCB1aW50OF90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgbGVuZ3RoOwotICAgICAgICBjb25zdCB1aW50OF90IGRhdGFbMF07Ci0gICAgfTsKLQotICAgIC8vIGVudHJ5IHRhaWwgcmVwcmVzZW50YXRpb24gKGFmdGVyIGRhdGEpCi0gICAgc3RydWN0IGVuZGluZyB7Ci0gICAgICAgIHVpbnQ4X3QgbGVuZ3RoOwotICAgICAgICB1aW50OF90IG5leHRbMF07Ci0gICAgfTsKLQotICAgIC8vIGVudHJ5IGl0ZXJhdG9yCi0gICAgY2xhc3MgRW50cnlJdGVyYXRvciB7Ci0gICAgcHVibGljOgotICAgICAgICBFbnRyeUl0ZXJhdG9yKCk7Ci0gICAgICAgIGV4cGxpY2l0IEVudHJ5SXRlcmF0b3IoY29uc3QgdWludDhfdCAqZW50cnkpOwotICAgICAgICBFbnRyeUl0ZXJhdG9yKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKTsKLQotICAgICAgICAvLyBkZXJlZmVyZW5jZSB1bmRlcmx5aW5nIGVudHJ5Ci0gICAgICAgIGNvbnN0IGVudHJ5JiAgICBvcGVyYXRvciooKSBjb25zdDsKLSAgICAgICAgY29uc3QgZW50cnkqICAgIG9wZXJhdG9yLT4oKSBjb25zdDsKLSAgICAgICAgLy8gYWR2YW5jZSB0byBuZXh0IGVudHJ5Ci0gICAgICAgIEVudHJ5SXRlcmF0b3ImICAgICAgIG9wZXJhdG9yKysoKTsgLy8gKytpCi0gICAgICAgIC8vIGJhY2sgdG8gcHJldmlvdXMgZW50cnkKLSAgICAgICAgRW50cnlJdGVyYXRvciYgICAgICAgb3BlcmF0b3ItLSgpOyAvLyAtLWkKLSAgICAgICAgRW50cnlJdGVyYXRvciAgICAgICAgbmV4dCgpIGNvbnN0OwotICAgICAgICBFbnRyeUl0ZXJhdG9yICAgICAgICBwcmV2KCkgY29uc3Q7Ci0gICAgICAgIGJvb2wgICAgICAgICAgICBvcGVyYXRvciE9KGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdDsKLSAgICAgICAgaW50ICAgICAgICAgICAgIG9wZXJhdG9yLShjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcikgY29uc3Q7Ci0KLSAgICAgICAgYm9vbCAgICAgICAgICAgIGhhc0NvbnNpc3RlbnRMZW5ndGgoKSBjb25zdDsKLSAgICAgICAgdm9pZCAgICAgICAgICAgIGNvcHlUbyhzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QpIGNvbnN0OwotICAgICAgICB2b2lkICAgICAgICAgICAgY29weURhdGEodWludDhfdCAqZHN0KSBjb25zdDsKLQotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgICAgICBpbmxpbmUgY29uc3QgVCYgcGF5bG9hZCgpIHsKLSAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUICo+KHB0ciArIG9mZnNldG9mKGVudHJ5LCBkYXRhKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgdWludDhfdCooKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gcHRyOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBjb25zdCB1aW50OF90ICAqcHRyOwotICAgIH07Ci0KLSAgICBjbGFzcyBBYnN0cmFjdEVudHJ5IHsKLSAgICBwdWJsaWM6Ci0KLSAgICAgICAgLy8gRW50cnkgc3RhcnRpbmcgaW4gdGhlIGdpdmVuIHBvaW50ZXIKLSAgICAgICAgZXhwbGljaXQgQWJzdHJhY3RFbnRyeShjb25zdCB1aW50OF90ICplbnRyeSk7Ci0gICAgICAgIHZpcnR1YWwgfkFic3RyYWN0RW50cnkoKSB7fQotCi0gICAgICAgIC8vIGJ1aWxkIGNvbmNyZXRlIGVudHJ5IG9mIGFwcHJvcHJpYXRlIGNsYXNzIGZyb20gcG9pbnRlcgotICAgICAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEFic3RyYWN0RW50cnk+IGJ1aWxkRW50cnkoY29uc3QgdWludDhfdCAqcHRyKTsKLQotICAgICAgICAvLyBnZXQgZm9ybWF0IGVudHJ5IHRpbWVzdGFtcAotICAgICAgICB2aXJ0dWFsIGludDY0X3QgICAgICB0aW1lc3RhbXAoKSBjb25zdCA9IDA7Ci0KLSAgICAgICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSdzIHVuaXF1ZSBpZAotICAgICAgICB2aXJ0dWFsIGxvZ19oYXNoX3QgICBoYXNoKCkgY29uc3QgPSAwOwotCi0gICAgICAgIC8vIGVudHJ5J3MgYXV0aG9yIGluZGV4ICgtMSBpZiBub25lIHByZXNlbnQpCi0gICAgICAgIC8vIGEgTWVyZ2VyIGhhcyBhIHZlY3RvciBvZiBSZWFkZXJzLCBhdXRob3Igc2ltcGx5IHBvaW50cyB0byB0aGUgaW5kZXggb2YgdGhlCi0gICAgICAgIC8vIFJlYWRlciB0aGF0IG9yaWdpbmF0ZWQgdGhlIGVudHJ5Ci0gICAgICAgIC8vIFRPRE8gY29uc2lkZXIgY2hhbmdpbmcgdG8gdWludDMyX3QKLSAgICAgICAgdmlydHVhbCBpbnQgICAgICAgICAgYXV0aG9yKCkgY29uc3QgPSAwOwotCi0gICAgICAgIC8vIGNvcHkgZW50cnksIGFkZGluZyBhdXRob3IgYmVmb3JlIHRpbWVzdGFtcCwgcmV0dXJucyBpdGVyYXRvciB0byBlbmQgb2YgZW50cnkKLSAgICAgICAgdmlydHVhbCBFbnRyeUl0ZXJhdG9yICAgIGNvcHlXaXRoQXV0aG9yKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRob3IpIGNvbnN0ID0gMDsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgLy8gY29waWVzIG9yZGluYXJ5IGVudHJ5IGZyb20gc3JjIHRvIGRzdCwgYW5kIHJldHVybnMgbGVuZ3RoIG9mIGVudHJ5Ci0gICAgICAgIC8vIHNpemVfdCAgICAgIGNvcHlFbnRyeShhdWRpb191dGlsc19maWZvX3dyaXRlciAqZHN0LCBjb25zdCBpdGVyYXRvciAmaXQpOwotICAgICAgICBjb25zdCB1aW50OF90ICAqbUVudHJ5OwotICAgIH07Ci0KLSAgICBjbGFzcyBGb3JtYXRFbnRyeSA6IHB1YmxpYyBBYnN0cmFjdEVudHJ5IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIC8vIGV4cGxpY2l0IEZvcm1hdEVudHJ5KGNvbnN0IEVudHJ5SXRlcmF0b3IgJml0KTsKLSAgICAgICAgZXhwbGljaXQgRm9ybWF0RW50cnkoY29uc3QgdWludDhfdCAqcHRyKSA6IEFic3RyYWN0RW50cnkocHRyKSB7fQotICAgICAgICB2aXJ0dWFsIH5Gb3JtYXRFbnRyeSgpIHt9Ci0KLSAgICAgICAgRW50cnlJdGVyYXRvciBiZWdpbigpIGNvbnN0OwotCi0gICAgICAgIC8vIEVudHJ5J3MgZm9ybWF0IHN0cmluZwotICAgICAgICBjb25zdCAgIGNoYXIqIGZvcm1hdFN0cmluZygpIGNvbnN0OwotCi0gICAgICAgIC8vIEVucnR5J3MgZm9ybWF0IHN0cmluZyBsZW5ndGgKLSAgICAgICAgc2l6ZV90ICAgICAgZm9ybWF0U3RyaW5nTGVuZ3RoKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gRm9ybWF0IGFyZ3VtZW50cyAoZXhjbHVkaW5nIGZvcm1hdCBzdHJpbmcsIHRpbWVzdGFtcCBhbmQgYXV0aG9yKQotICAgICAgICBFbnRyeUl0ZXJhdG9yICAgIGFyZ3MoKSBjb25zdDsKLQotICAgICAgICAvLyBnZXQgZm9ybWF0IGVudHJ5IHRpbWVzdGFtcAotICAgICAgICB2aXJ0dWFsIGludDY0X3QgICAgIHRpbWVzdGFtcCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIC8vIGdldCBmb3JtYXQgZW50cnkncyB1bmlxdWUgaWQKLSAgICAgICAgdmlydHVhbCBsb2dfaGFzaF90ICBoYXNoKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAgICAgLy8gZW50cnkncyBhdXRob3IgaW5kZXggKC0xIGlmIG5vbmUgcHJlc2VudCkKLSAgICAgICAgLy8gYSBNZXJnZXIgaGFzIGEgdmVjdG9yIG9mIFJlYWRlcnMsIGF1dGhvciBzaW1wbHkgcG9pbnRzIHRvIHRoZSBpbmRleCBvZiB0aGUKLSAgICAgICAgLy8gUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKLSAgICAgICAgdmlydHVhbCBpbnQgICAgICAgICBhdXRob3IoKSBjb25zdCBvdmVycmlkZTsKLQotICAgICAgICAvLyBjb3B5IGVudHJ5LCBhZGRpbmcgYXV0aG9yIGJlZm9yZSB0aW1lc3RhbXAsIHJldHVybnMgc2l6ZSBvZiBvcmlnaW5hbCBlbnRyeQotICAgICAgICB2aXJ0dWFsIEVudHJ5SXRlcmF0b3IgICAgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICB9OwotCi0gICAgY2xhc3MgSGlzdG9ncmFtRW50cnkgOiBwdWJsaWMgQWJzdHJhY3RFbnRyeSB7Ci0gICAgcHVibGljOgotICAgICAgICBleHBsaWNpdCBIaXN0b2dyYW1FbnRyeShjb25zdCB1aW50OF90ICpwdHIpIDogQWJzdHJhY3RFbnRyeShwdHIpIHsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIH5IaXN0b2dyYW1FbnRyeSgpIHt9Ci0KLSAgICAgICAgdmlydHVhbCBpbnQ2NF90ICAgICB0aW1lc3RhbXAoKSBjb25zdCBvdmVycmlkZTsKLQotICAgICAgICB2aXJ0dWFsIGxvZ19oYXNoX3QgIGhhc2goKSBjb25zdCBvdmVycmlkZTsKLQotICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgIGF1dGhvcigpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIHZpcnR1YWwgRW50cnlJdGVyYXRvciAgICBjb3B5V2l0aEF1dGhvcihzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aG9yKSBjb25zdCBvdmVycmlkZTsKLQotICAgIH07Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGxvZyBlbnRyeSBpbiBwcml2YXRlIG1lbW9yeQotICAgIHN0cnVjdCBFbnRyeSB7Ci0gICAgICAgIEVudHJ5KEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQotICAgICAgICAgICAgOiBtRXZlbnQoZXZlbnQpLCBtTGVuZ3RoKGxlbmd0aCksIG1EYXRhKGRhdGEpIHsgfQotICAgICAgICAvKnZpcnR1YWwqLyB+RW50cnkoKSB7IH0KLQotICAgICAgICAvLyB1c2VkIGR1cmluZyB3cml0aW5nIHRvIGZvcm1hdCBFbnRyeSBpbmZvcm1hdGlvbiBhcyBmb2xsb3dzOgotICAgICAgICAvLyBbdHlwZV1bbGVuZ3RoXVtkYXRhIC4uLiBdW2xlbmd0aF0KLSAgICAgICAgaW50ICAgICBjb3B5RW50cnlEYXRhQXQoc2l6ZV90IG9mZnNldCkgY29uc3Q7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgY2xhc3MgV3JpdGVyOwotICAgICAgICBFdmVudCAgICAgICBtRXZlbnQ7ICAgICAvLyBldmVudCB0eXBlCi0gICAgICAgIHVpbnQ4X3QgICAgIG1MZW5ndGg7ICAgIC8vIGxlbmd0aCBvZiBhZGRpdGlvbmFsIGRhdGEsIDAgPD0gbUxlbmd0aCA8PSBrTWF4TGVuZ3RoCi0gICAgICAgIGNvbnN0IHZvaWQgKm1EYXRhOyAgICAgIC8vIGV2ZW50IHR5cGUtc3BlY2lmaWMgZGF0YQotICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhMZW5ndGggPSAyNTU7Ci0gICAgcHVibGljOgotICAgICAgICAvLyBtRXZlbnQsIG1MZW5ndGgsIG1EYXRhWy4uLl0sIGR1cGxpY2F0ZSBtTGVuZ3RoCi0gICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga092ZXJoZWFkID0gc2l6ZW9mKGVudHJ5KSArIHNpemVvZihlbmRpbmcpOwotICAgICAgICAvLyBlbmRpbmQgbGVuZ3RoIG9mIHByZXZpb3VzIGVudHJ5Ci0gICAgICAgIHN0YXRpYyBjb25zdCBzc2l6ZV90IGtQcmV2aW91c0xlbmd0aE9mZnNldCA9IC0gc2l6ZW9mKGVuZGluZykgKwotICAgICAgICAgICAgb2Zmc2V0b2YoZW5kaW5nLCBsZW5ndGgpOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgSGlzdFRzRW50cnkgewotICAgICAgICBsb2dfaGFzaF90IGhhc2g7Ci0gICAgICAgIGludDY0X3QgdHM7Ci0gICAgfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0gICAgc3RydWN0IEhpc3RUc0VudHJ5V2l0aEF1dGhvciB7Ci0gICAgICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICAgICAgaW50NjRfdCB0czsKLSAgICAgICAgaW50IGF1dGhvcjsKLSAgICB9OyAvL1RPRE8gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSAgICBzdHJ1Y3QgSGlzdEludEVudHJ5IHsKLSAgICAgICAgbG9nX2hhc2hfdCBoYXNoOwotICAgICAgICBpbnQgdmFsdWU7Ci0gICAgfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0gICAgLy8gcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgbG9nIGVudHJ5IGluIHNoYXJlZCBtZW1vcnkKLSAgICAvLyAgYnl0ZVswXSAgICAgICAgICAgICBtRXZlbnQKLSAgICAvLyAgYnl0ZVsxXSAgICAgICAgICAgICBtTGVuZ3RoCi0gICAgLy8gIGJ5dGVbMl0gICAgICAgICAgICAgbURhdGFbMF0KLSAgICAvLyAgLi4uCi0gICAgLy8gIGJ5dGVbMitpXSAgICAgICAgICAgbURhdGFbaV0KLSAgICAvLyAgLi4uCi0gICAgLy8gIGJ5dGVbMittTGVuZ3RoLTFdICAgbURhdGFbbUxlbmd0aC0xXQotICAgIC8vICBieXRlWzIrbUxlbmd0aF0gICAgIGR1cGxpY2F0ZSBjb3B5IG9mIG1MZW5ndGggdG8gcGVybWl0IHJldmVyc2Ugc2NhbgotICAgIC8vICBieXRlWzMrbUxlbmd0aF0gICAgIHN0YXJ0IG9mIG5leHQgbG9nIGVudHJ5Ci0KLSAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRJbnQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSk7Ci0gICAgc3RhdGljIHZvaWQgICAgYXBwZW5kRmxvYXQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSk7Ci0gICAgc3RhdGljIHZvaWQgICAgYXBwZW5kUElEKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpOwotICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZFRpbWVzdGFtcChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKLSAgICBzdGF0aWMgc2l6ZV90ICBmbXRFbnRyeUxlbmd0aChjb25zdCB1aW50OF90ICpkYXRhKTsKLSAgICBzdGF0aWMgU3RyaW5nOCBidWZmZXJEdW1wKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOwotICAgIHN0YXRpYyBTdHJpbmc4IGJ1ZmZlckR1bXAoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpOwotcHVibGljOgotCi0gICAgLy8gTG9jYXRlZCBpbiBzaGFyZWQgbWVtb3J5LCBtdXN0IGJlIFBPRC4KLSAgICAvLyBFeGFjdGx5IG9uZSBwcm9jZXNzIG11c3QgZXhwbGljaXRseSBjYWxsIHRoZSBjb25zdHJ1Y3RvciBvciB1c2UgcGxhY2VtZW50IG5ldy4KLSAgICAvLyBTaW5jZSB0aGlzIGlzIGEgUE9ELCB0aGUgZGVzdHJ1Y3RvciBpcyBlbXB0eSBhbmQgdW5uZWNlc3NhcnkgdG8gY2FsbCBpdCBleHBsaWNpdGx5LgotICAgIHN0cnVjdCBTaGFyZWQgewotICAgICAgICBTaGFyZWQoKSAvKiBtUmVhciBpbml0aWFsaXplZCB2aWEgZGVmYXVsdCBjb25zdHJ1Y3RvciAqLyB7IH0KLSAgICAgICAgLyp2aXJ0dWFsKi8gflNoYXJlZCgpIHsgfQotCi0gICAgICAgIGF1ZGlvX3V0aWxzX2ZpZm9faW5kZXggIG1SZWFyOyAgLy8gaW5kZXggb25lIGJ5dGUgcGFzdCB0aGUgZW5kIG9mIG1vc3QgcmVjZW50IEVudHJ5Ci0gICAgICAgIGNoYXIgICAgbUJ1ZmZlclswXTsgICAgICAgICAgICAgLy8gY2lyY3VsYXIgYnVmZmVyIGZvciBlbnRyaWVzCi0gICAgfTsKLQotcHVibGljOgotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBGSVhNRSBUaW1lbGluZSB3YXMgaW50ZW5kZWQgdG8gd3JhcCBXcml0ZXIgYW5kIFJlYWRlciwgYnV0IGlzbid0IGFjdHVhbGx5IHVzZWQgeWV0LgotICAgIC8vIEZvciBub3cgaXQgaXMganVzdCBhIG5hbWVzcGFjZSBmb3Igc2hhcmVkU2l6ZSgpLgotICAgIGNsYXNzIFRpbWVsaW5lIDogcHVibGljIFJlZkJhc2UgewotICAgIHB1YmxpYzoKLSNpZiAwCi0gICAgICAgIFRpbWVsaW5lKHNpemVfdCBzaXplLCB2b2lkICpzaGFyZWQgPSBOVUxMKTsKLSAgICAgICAgdmlydHVhbCB+VGltZWxpbmUoKTsKLSNlbmRpZgotCi0gICAgICAgIC8vIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgdGltZWxpbmUgaW4gYnl0ZSB1bml0cy4KLSAgICAgICAgLy8gUmV0dXJucyB0aGUgc2l6ZSByb3VuZGVkIHVwIHRvIGEgcG93ZXItb2YtMiwgcGx1cyB0aGUgY29uc3RhbnQgc2l6ZSBvdmVyaGVhZCBmb3IgaW5kaWNlcy4KLSAgICAgICAgc3RhdGljIHNpemVfdCBzaGFyZWRTaXplKHNpemVfdCBzaXplKTsKLQotI2lmIDAKLSAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgY2xhc3MgICAgV3JpdGVyOwotICAgICAgICBmcmllbmQgY2xhc3MgICAgUmVhZGVyOwotCi0gICAgICAgIGNvbnN0IHNpemVfdCAgICBtU2l6ZTsgICAgICAvLyBjaXJjdWxhciBidWZmZXIgc2l6ZSBpbiBieXRlcywgbXVzdCBiZSBhIHBvd2VyIG9mIDIKLSAgICAgICAgYm9vbCAgICAgICAgICAgIG1Pd247ICAgICAgIC8vIHdoZXRoZXIgSSBvd24gdGhlIG1lbW9yeSBhdCBtU2hhcmVkCi0gICAgICAgIFNoYXJlZCogY29uc3QgICBtU2hhcmVkOyAgICAvLyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkKLSNlbmRpZgotICAgIH07Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIFdyaXRlciBpcyB0aHJlYWQtc2FmZSB3aXRoIHJlc3BlY3QgdG8gUmVhZGVyLCBidXQgbm90IHdpdGggcmVzcGVjdCB0byBtdWx0aXBsZSB0aHJlYWRzCi0gICAgLy8gY2FsbGluZyBXcml0ZXIgbWV0aG9kcy4gIElmIHlvdSBuZWVkIG11bHRpLXRocmVhZCBzYWZldHkgZm9yIHdyaXRpbmcsIHVzZSBMb2NrZWRXcml0ZXIuCi0gICAgY2xhc3MgV3JpdGVyIDogcHVibGljIFJlZkJhc2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgV3JpdGVyKCk7ICAgICAgICAgICAgICAgICAgIC8vIGR1bW15IG5vcCBpbXBsZW1lbnRhdGlvbiB3aXRob3V0IHNoYXJlZCBtZW1vcnkKLQotICAgICAgICAvLyBJbnB1dCBwYXJhbWV0ZXIgJ3NpemUnIGlzIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIHRpbWVsaW5lIGluIGJ5dGUgdW5pdHMuCi0gICAgICAgIC8vIFRoZSBzaXplIG9mIHRoZSBzaGFyZWQgbWVtb3J5IG11c3QgYmUgYXQgbGVhc3QgVGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkuCi0gICAgICAgIFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKLSAgICAgICAgV3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICAgICAgdmlydHVhbCB+V3JpdGVyKCk7Ci0KLSAgICAgICAgLy8gRklYTUUgbmVlZHMgY29tbWVudHMsIGFuZCBzb21lIHNob3VsZCBiZSBwcml2YXRlCi0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2coY29uc3QgY2hhciAqc3RyaW5nKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ3ZmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dUaW1lc3RhbXAoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1RpbWVzdGFtcChjb25zdCBpbnQ2NF90IHRzKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0ludGVnZXIoY29uc3QgaW50IHgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRmxvYXQoY29uc3QgZmxvYXQgeCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dQSUQoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0Zvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgLi4uKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1ZGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIHZhX2xpc3QgYXApOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nU3RhcnQoY29uc3QgY2hhciAqZm10KTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0VuZCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSGFzaChsb2dfaGFzaF90IGhhc2gpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRXZlbnRIaXN0VHMoRXZlbnQgZXZlbnQsIGxvZ19oYXNoX3QgaGFzaCk7Ci0KLSAgICAgICAgdmlydHVhbCBib29sICAgIGlzRW5hYmxlZCgpIGNvbnN0OwotCi0gICAgICAgIC8vIHJldHVybiB2YWx1ZSBmb3IgYWxsIG9mIHRoZXNlIGlzIHRoZSBwcmV2aW91cyBpc0VuYWJsZWQoKQotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpOyAgIC8vIGJ1dCB3b24ndCBlbmFibGUgaWYgbm8gc2hhcmVkIG1lbW9yeQotICAgICAgICBib29sICAgIGVuYWJsZSgpICAgIHsgcmV0dXJuIHNldEVuYWJsZWQodHJ1ZSk7IH0KLSAgICAgICAgYm9vbCAgICBkaXNhYmxlKCkgICB7IHJldHVybiBzZXRFbmFibGVkKGZhbHNlKTsgfQotCi0gICAgICAgIHNwPElNZW1vcnk+ICAgICBnZXRJTWVtb3J5KCkgY29uc3QgIHsgcmV0dXJuIG1JTWVtb3J5OyB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICAvLyAwIDw9IGxlbmd0aCA8PSBrTWF4TGVuZ3RoCi0gICAgICAgIC8vIHdyaXRlcyBhIHNpbmdsZSBFbnRyeSB0byB0aGUgRklGTwotICAgICAgICB2b2lkICAgIGxvZyhFdmVudCBldmVudCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7Ci0gICAgICAgIC8vIGNoZWNrcyB2YWxpZGl0eSBvZiBhbiBldmVudCBiZWZvcmUgY2FsbGluZyBsb2cgYWJvdmUgdGhpcyBvbmUKLSAgICAgICAgdm9pZCAgICBsb2coY29uc3QgRW50cnkgKmVudHJ5LCBib29sIHRydXN0ZWQgPSBmYWxzZSk7Ci0KLSAgICAgICAgU2hhcmVkKiBjb25zdCAgIG1TaGFyZWQ7ICAgIC8vIHJhdyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkKLSAgICAgICAgc3A8SU1lbW9yeT4gICAgIG1JTWVtb3J5OyAgIC8vIHJlZi1jb3VudGVkIHZlcnNpb24sIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlbiBjb25zdAotICAgICAgICBhdWRpb191dGlsc19maWZvICogY29uc3QgbUZpZm87ICAgICAgICAgICAgICAgICAvLyBGSUZPIGl0c2VsZiwgbm9uLU5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCi0gICAgICAgIGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyICogY29uc3QgbUZpZm9Xcml0ZXI7ICAgIC8vIHVzZWQgdG8gd3JpdGUgdG8gRklGTywgbm9uLU5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5sZXNzIGR1bW15IGNvbnN0cnVjdG9yIHVzZWQKLSAgICAgICAgYm9vbCAgICAgICAgICAgIG1FbmFibGVkOyAgIC8vIHdoZXRoZXIgdG8gYWN0dWFsbHkgbG9nCi0KLSAgICAgICAgLy8gY2FjaGVkIHBpZCBhbmQgcHJvY2VzcyBuYW1lIHRvIHVzZSBpbiAlcCBmb3JtYXQgc3BlY2lmaWVyCi0gICAgICAgIC8vIHRvdGFsIHRhZyBsZW5ndGggaXMgbVBpZFRhZ1NpemUgYW5kIHByb2Nlc3MgbmFtZSBpcyBub3QgemVybyB0ZXJtaW5hdGVkCi0gICAgICAgIGNoYXIgICAqbVBpZFRhZzsKLSAgICAgICAgc2l6ZV90ICBtUGlkVGFnU2l6ZTsKLSAgICB9OwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBTaW1pbGFyIHRvIFdyaXRlciwgYnV0IHNhZmUgZm9yIG11bHRpcGxlIHRocmVhZHMgdG8gY2FsbCBjb25jdXJyZW50bHkKLSAgICBjbGFzcyBMb2NrZWRXcml0ZXIgOiBwdWJsaWMgV3JpdGVyIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIExvY2tlZFdyaXRlcigpOwotICAgICAgICBMb2NrZWRXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZyhjb25zdCBjaGFyICpzdHJpbmcpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1RpbWVzdGFtcCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVGltZXN0YW1wKGNvbnN0IGludDY0X3QgdHMpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSW50ZWdlcihjb25zdCBpbnQgeCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dGbG9hdChjb25zdCBmbG9hdCB4KTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1BJRCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nU3RhcnQoY29uc3QgY2hhciAqZm10KTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0VuZCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSGFzaChsb2dfaGFzaF90IGhhc2gpOwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCAgICBpc0VuYWJsZWQoKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBib29sICAgIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIG11dGFibGUgTXV0ZXggICBtTG9jazsKLSAgICB9OwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBjbGFzcyBSZWFkZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgcHVibGljOgotICAgICAgICAvLyBBIHNuYXBzaG90IG9mIGEgcmVhZGVycyBidWZmZXIKLSAgICAgICAgLy8gVGhpcyBpcyByYXcgZGF0YS4gTm8gYW5hbHlzaXMgaGFzIGJlZW4gZG9uZSBvbiBpdAotICAgICAgICBjbGFzcyBTbmFwc2hvdCB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIFNuYXBzaG90KCkgOiBtRGF0YShOVUxMKSwgbUxvc3QoMCkge30KLQotICAgICAgICAgICAgU25hcHNob3Qoc2l6ZV90IGJ1ZmZlclNpemUpIDogbURhdGEobmV3IHVpbnQ4X3RbYnVmZmVyU2l6ZV0pIHt9Ci0KLSAgICAgICAgICAgIH5TbmFwc2hvdCgpIHsgZGVsZXRlW10gbURhdGE7IH0KLQotICAgICAgICAgICAgLy8gY29weSBvZiB0aGUgYnVmZmVyCi0gICAgICAgICAgICB1aW50OF90ICpkYXRhKCkgY29uc3QgeyByZXR1cm4gbURhdGE7IH0KLQotICAgICAgICAgICAgLy8gYW1vdW50IG9mIGRhdGEgbG9zdCAoZ2l2ZW4gYnkgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIpCi0gICAgICAgICAgICBzaXplX3QgICBsb3N0KCkgY29uc3QgeyByZXR1cm4gbUxvc3Q7IH0KLQotICAgICAgICAgICAgLy8gaXRlcmF0b3IgdG8gYmVnaW5uaW5nIG9mIHJlYWRhYmxlIHNlZ21lbnQgb2Ygc25hcHNob3QKLSAgICAgICAgICAgIC8vIGRhdGEgYmV0d2VlbiBiZWdpbiBhbmQgZW5kIGhhcyB2YWxpZCBlbnRyaWVzCi0gICAgICAgICAgICBFbnRyeUl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gbUJlZ2luOyB9Ci0KLSAgICAgICAgICAgIC8vIGl0ZXJhdG9yIHRvIGVuZCBvZiByZWFkYWJsZSBzZWdtZW50IG9mIHNuYXBzaG90Ci0gICAgICAgICAgICBFbnRyeUl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIG1FbmQ7IH0KLQotICAgICAgICBwcml2YXRlOgotICAgICAgICAgICAgZnJpZW5kIGNsYXNzIE1lcmdlUmVhZGVyOwotICAgICAgICAgICAgZnJpZW5kIGNsYXNzIFJlYWRlcjsKLSAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgICptRGF0YTsKLSAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICBtTG9zdDsKLSAgICAgICAgICAgIEVudHJ5SXRlcmF0b3IgbUJlZ2luOwotICAgICAgICAgICAgRW50cnlJdGVyYXRvciBtRW5kOwotICAgICAgICB9OwotCi0gICAgICAgIC8vIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgdGltZWxpbmUgaW4gYnl0ZSB1bml0cy4KLSAgICAgICAgLy8gVGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgbXVzdCBiZSBhdCBsZWFzdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKS4KLSAgICAgICAgUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOwotICAgICAgICBSZWFkZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplKTsKLQotICAgICAgICB2aXJ0dWFsIH5SZWFkZXIoKTsKLQotICAgICAgICAvLyBnZXQgc25hcHNob3Qgb2YgcmVhZGVycyBmaWZvIGJ1ZmZlciwgZWZmZWN0aXZlbHkgY29uc3VtaW5nIHRoZSBidWZmZXIKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBnZXRTbmFwc2hvdCgpOwotCi0gICAgICAgIGJvb2wgICAgIGlzSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkgY29uc3Q7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIC8vIHByaW50IGEgc3VtbWFyeSBvZiB0aGUgcGVyZm9ybWFuY2UgdG8gdGhlIGNvbnNvbGUKLSAgICAgICAgdm9pZCAgICBkdW1wTGluZShjb25zdCBTdHJpbmc4JiB0aW1lc3RhbXAsIFN0cmluZzgmIGJvZHkpOwotICAgICAgICBFbnRyeUl0ZXJhdG9yICAgaGFuZGxlRm9ybWF0KGNvbnN0IEZvcm1hdEVudHJ5ICZmbXRFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4ICp0aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAqYm9keSk7Ci0gICAgICAgIGludCBtRmQ7ICAgICAgICAgICAgICAgIC8vIGZpbGUgZGVzY3JpcHRvcgotICAgICAgICBpbnQgbUluZGVudDsgICAgICAgICAgICAvLyBpbmRlbnRhdGlvbiBsZXZlbAotICAgICAgICBpbnQgbUxvc3Q7ICAgICAgICAgICAgICAvLyBieXRlcyBvZiBkYXRhIGxvc3QgYmVmb3JlIGJ1ZmZlciB3YXMgcmVhZAotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2V0PEV2ZW50PiBzdGFydGluZ1R5cGVzOwotICAgICAgICBzdGF0aWMgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+IGVuZGluZ1R5cGVzOwotCi0gICAgICAgIC8vIGRlY2xhcmVkIGFzIGNvbnN0IGJlY2F1c2UgYXVkaW9fdXRpbHNfZmlmbygpIGNvbnN0cnVjdG9yCi0gICAgICAgIHNwPElNZW1vcnk+IG1JTWVtb3J5OyAgICAgICAvLyByZWYtY291bnRlZCB2ZXJzaW9uLCBhc3NpZ25lZCBvbmx5IGluIGNvbnN0cnVjdG9yCi0KLSAgICAgICAgLypjb25zdCovIFNoYXJlZCogY29uc3QgbVNoYXJlZDsgICAgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeSwgYWN0dWFsbHkgY29uc3QgYnV0IG5vdAotICAgICAgICBhdWRpb191dGlsc19maWZvICogY29uc3QgbUZpZm87ICAgICAgICAgICAgICAgICAvLyBGSUZPIGl0c2VsZiwKLSAgICAgICAgLy8gbm9uLU5VTEwgdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCi0gICAgICAgIGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyICogY29uc3QgbUZpZm9SZWFkZXI7ICAgIC8vIHVzZWQgdG8gcmVhZCBmcm9tIEZJRk8sCi0gICAgICAgIC8vIG5vbi1OVUxMIHVubGVzcyBjb25zdHJ1Y3RvciBmYWlscwotCi0gICAgICAgIC8vIFNlYXJjaGVzIGZvciB0aGUgbGFzdCBlbnRyeSBvZiB0eXBlIDx0eXBlPiBpbiB0aGUgcmFuZ2UgW2Zyb250LCBiYWNrKQotICAgICAgICAvLyBiYWNrIGhhcyB0byBiZSBlbnRyeS1hbGlnbmVkLiBSZXR1cm5zIG51bGxwdHIgaWYgbm9uZSBlbmNvbnVudGVyZWQuCi0gICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90ICpmaW5kTGFzdEVudHJ5T2ZUeXBlcyhjb25zdCB1aW50OF90ICpmcm9udCwgY29uc3QgdWludDhfdCAqYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PEV2ZW50PiAmdHlwZXMpOwotCi0gICAgICAgIC8vIGR1bW15IG1ldGhvZCBmb3IgaGFuZGxpbmcgYWJzZW50IGF1dGhvciBlbnRyeQotICAgICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkmIC8qZm10RW50cnkqLywgU3RyaW5nOCogLypib2R5Ki8pIHt9Ci0gICAgfTsKLQotICAgIC8vIFdyYXBwZXIgZm9yIGEgcmVhZGVyIHdpdGggYSBuYW1lLiBDb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIHJlYWRlciBhbmQgYSBwb2ludGVyIHRvIHRoZSBuYW1lCi0gICAgY2xhc3MgTmFtZWRSZWFkZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgTmFtZWRSZWFkZXIoKSB7IG1OYW1lWzBdID0gJ1wwJzsgfSAvLyBmb3IgVmVjdG9yCi0gICAgICAgIE5hbWVkUmVhZGVyKGNvbnN0IHNwPE5CTG9nOjpSZWFkZXI+JiByZWFkZXIsIGNvbnN0IGNoYXIgKm5hbWUpIDoKLSAgICAgICAgICAgIG1SZWFkZXIocmVhZGVyKQotICAgICAgICAgICAgeyBzdHJsY3B5KG1OYW1lLCBuYW1lLCBzaXplb2YobU5hbWUpKTsgfQotICAgICAgICB+TmFtZWRSZWFkZXIoKSB7IH0KLSAgICAgICAgY29uc3Qgc3A8TkJMb2c6OlJlYWRlcj4mICByZWFkZXIoKSBjb25zdCB7IHJldHVybiBtUmVhZGVyOyB9Ci0gICAgICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBzcDxOQkxvZzo6UmVhZGVyPiAgIG1SZWFkZXI7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heE5hbWUgPSAzMjsKLSAgICAgICAgY2hhciAgICAgICAgICAgICAgICBtTmFtZVtrTWF4TmFtZV07Ci0gICAgfTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlYWQgZGF0YSBmcm9tIGVhY2ggdGhyZWFkJ3MgaW5kaXZpZHVhbCBGSUZPIGluIHNoYXJlZCBtZW1vcnkKLSAgICAvLyBhbmQgd3JpdGUgaXQgdG8gYSBzaW5nbGUgRklGTyBpbiBsb2NhbCBtZW1vcnkuCi0gICAgY2xhc3MgTWVyZ2VyIDogcHVibGljIFJlZkJhc2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgTWVyZ2VyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOwotCi0gICAgICAgIHZpcnR1YWwgfk1lcmdlcigpIHt9Ci0KLSAgICAgICAgdm9pZCBhZGRSZWFkZXIoY29uc3QgTmFtZWRSZWFkZXIgJnJlYWRlcik7Ci0gICAgICAgIC8vIFRPRE8gYWRkIHJlbW92ZVJlYWRlcgotICAgICAgICB2b2lkIG1lcmdlKCk7Ci0KLSAgICAgICAgLy8gRklYTUUgVGhpcyBpcyByZXR1cm5pbmcgYSByZWZlcmVuY2UgdG8gYSBzaGFyZWQgdmFyaWFibGUgdGhhdCBuZWVkcyBhIGxvY2sKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TmFtZWRSZWFkZXI+JiBnZXROYW1lZFJlYWRlcnMoKSBjb25zdDsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIHZlY3RvciBvZiB0aGUgcmVhZGVycyB0aGUgbWVyZ2VyIGlzIHN1cHBvc2VkIHRvIG1lcmdlIGZyb20uCi0gICAgICAgIC8vIGV2ZXJ5IHJlYWRlciByZWFkcyBmcm9tIGEgd3JpdGVyJ3MgYnVmZmVyCi0gICAgICAgIC8vIEZJWE1FIE5lZWRzIHRvIGJlIHByb3RlY3RlZCBieSBhIGxvY2sKLSAgICAgICAgc3RkOjp2ZWN0b3I8TmFtZWRSZWFkZXI+IG1OYW1lZFJlYWRlcnM7Ci0KLSAgICAgICAgU2hhcmVkICogY29uc3QgbVNoYXJlZDsgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmbz4gbUZpZm87IC8vIEZJRk8gaXRzZWxmCi0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gbUZpZm9Xcml0ZXI7IC8vIHVzZWQgdG8gd3JpdGUgdG8gRklGTwotICAgIH07Ci0KLSAgICAvLyBUaGlzIGNsYXNzIGhhcyBhIHBvaW50ZXIgdG8gdGhlIEZJRk8gaW4gbG9jYWwgbWVtb3J5IHdoaWNoIHN0b3JlcyB0aGUgbWVyZ2VkCi0gICAgLy8gZGF0YSBjb2xsZWN0ZWQgYnkgTkJMb2c6Ok1lcmdlciBmcm9tIGFsbCBOYW1lZFJlYWRlcnMuIEl0IGlzIHVzZWQgdG8gcHJvY2VzcwotICAgIC8vIHRoaXMgZGF0YSBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byBQZXJmb3JtYW5jZUFuYWx5c2lzLgotICAgIGNsYXNzIE1lcmdlUmVhZGVyIDogcHVibGljIFJlYWRlciB7Ci0gICAgcHVibGljOgotICAgICAgICBNZXJnZVJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplLCBNZXJnZXIgJm1lcmdlcik7Ci0KLSAgICAgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IGluZGVudCA9IDApOwotICAgICAgICAvLyBwcm9jZXNzIGEgcGFydGljdWxhciBzbmFwc2hvdCBvZiB0aGUgcmVhZGVyCi0gICAgICAgIHZvaWQgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KFNuYXBzaG90ICYgc25hcCk7Ci0gICAgICAgIC8vIGNhbGwgZ2V0U25hcHNob3Qgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIHJlYWRlcidzIGJ1ZmZlciBhbmQgcHJvY2VzcyB0aGUgZGF0YQotICAgICAgICB2b2lkIGdldEFuZFByb2Nlc3NTbmFwc2hvdCgpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgLy8gRklYTUUgTmVlZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IGEgbG9jaywKLSAgICAgICAgLy8gICAgICAgYmVjYXVzZSBldmVuIHRob3VnaCBvdXIgdXNlIG9mIGl0IGlzIHJlYWQtb25seSB0aGVyZSBtYXkgYmUgYXN5bmNocm9ub3VzIHVwZGF0ZXMKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TmFtZWRSZWFkZXI+JiBtTmFtZWRSZWFkZXJzOwotCi0gICAgICAgIC8vIGFuYWx5emVzLCBjb21wcmVzc2VzIGFuZCBzdG9yZXMgdGhlIG1lcmdlZCBkYXRhCi0gICAgICAgIC8vIGNvbnRhaW5zIGEgc2VwYXJhdGUgaW5zdGFuY2UgZm9yIGV2ZXJ5IGF1dGhvciAodGhyZWFkKSwgYW5kIGZvciBldmVyeSBzb3VyY2UgZmlsZQotICAgICAgICAvLyBsb2NhdGlvbiB3aXRoaW4gZWFjaCBhdXRob3IKLSAgICAgICAgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlQW5hbHlzaXNNYXAgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXM7Ci0KLSAgICAgICAgLy8gaGFuZGxlIGF1dGhvciBlbnRyeSBieSBsb29raW5nIHVwIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhcHBlbmRpbmcgaXQgdG8gdGhlIGJvZHkKLSAgICAgICAgLy8gcmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIGZtdEVudHJ5Ci0gICAgICAgIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkgJmZtdEVudHJ5LCBTdHJpbmc4ICpib2R5KTsKLSAgICB9OwotCi0gICAgLy8gTWVyZ2VUaHJlYWQgaXMgYSB0aHJlYWQgdGhhdCBjb250YWlucyBhIE1lcmdlci4gSXQgd29ya3MgYXMgYSByZXRyaWdnZXJhYmxlIG9uZS1zaG90OgotICAgIC8vIHdoZW4gdHJpZ2dlcmVkLCBpdCBhd2FrZXMgZm9yIGEgbGFwc2Ugb2YgdGltZSwgZHVyaW5nIHdoaWNoIGl0IHBlcmlvZGljYWxseSBtZXJnZXM7IGlmCi0gICAgLy8gcmV0cmlnZ2VyZWQsIHRoZSB0aW1lb3V0IGlzIHJlc2V0LgotICAgIC8vIFRoZSB0aHJlYWQgaXMgdHJpZ2dlcmVkIG9uIEF1ZGlvRmxpbmdlciBiaW5kZXIgYWN0aXZpdHkuCi0gICAgY2xhc3MgTWVyZ2VUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIE1lcmdlVGhyZWFkKE1lcmdlciAmbWVyZ2VyLCBNZXJnZVJlYWRlciAmbWVyZ2VSZWFkZXIpOwotICAgICAgICB2aXJ0dWFsIH5NZXJnZVRocmVhZCgpIG92ZXJyaWRlOwotCi0gICAgICAgIC8vIFJlc2V0IHRpbWVvdXQgYW5kIGFjdGl2YXRlIHRocmVhZCB0byBtZXJnZSBwZXJpb2RpY2FsbHkgaWYgaXQncyBpZGxlCi0gICAgICAgIHZvaWQgd2FrZXVwKCk7Ci0KLSAgICAgICAgLy8gU2V0IHRpbWVvdXQgcGVyaW9kIHVudGlsIHRoZSBtZXJnaW5nIHRocmVhZCBnb2VzIGlkbGUgYWdhaW4KLSAgICAgICAgdm9pZCBzZXRUaW1lb3V0VXMoaW50IHRpbWUpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKSBvdmVycmlkZTsKLQotICAgICAgICAvLyB0aGUgbWVyZ2VyIHdobyBhY3R1YWxseSBkb2VzIHRoZSB3b3JrIG9mIG1lcmdpbmcgdGhlIGxvZ3MKLSAgICAgICAgTWVyZ2VyJiAgICAgbU1lcmdlcjsKLQotICAgICAgICAvLyB0aGUgbWVyZ2VyZWFkZXIgdXNlZCB0byBwcm9jZXNzIGRhdGEgbWVyZ2VkIGJ5IG1NZXJnZXIKLSAgICAgICAgTWVyZ2VSZWFkZXImIG1NZXJnZVJlYWRlcjsKLQotICAgICAgICAvLyBtdXRleCBmb3IgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZQotICAgICAgICBNdXRleCAgICAgICBtTXV0ZXg7Ci0KLSAgICAgICAgLy8gY29uZGl0aW9uIHZhcmlhYmxlIHRvIGFjdGl2YXRlIG1lcmdpbmcgb24gdGltZW91dCA+PSAwCi0gICAgICAgIENvbmRpdGlvbiAgIG1Db25kOwotCi0gICAgICAgIC8vIHRpbWUgbGVmdCB1bnRpbCB0aGUgdGhyZWFkIGJsb2NrcyBhZ2FpbiAoaW4gbWljcm9zZWNvbmRzKQotICAgICAgICBpbnQgICAgICAgICBtVGltZW91dFVzOwotCi0gICAgICAgIC8vIG1lcmdpbmcgcGVyaW9kIHdoZW4gdGhlIHRocmVhZCBpcyBhd2FrZQotICAgICAgICBzdGF0aWMgY29uc3QgaW50ICBrVGhyZWFkU2xlZXBQZXJpb2RVcyA9IDEwMDAwMDAgLyoxcyovOwotCi0gICAgICAgIC8vIGluaXRpYWwgdGltZW91dCB2YWx1ZSB3aGVuIHRyaWdnZXJlZAotICAgICAgICBzdGF0aWMgY29uc3QgaW50ICBrVGhyZWFkV2FrZXVwUGVyaW9kVXMgPSAzMDAwMDAwIC8qM3MqLzsKLSAgICB9OwotCi19OyAgLy8gY2xhc3MgTkJMb2cKLQotLy8gVE9ETyBwdXQgc29tZXdoZXJlIGVsc2UKLXN0YXRpYyBpbmxpbmUgaW50NjRfdCBnZXRfbW9ub3RvbmljX25zKCkgewotICAgIHRpbWVzcGVjIHRzOwotICAgIGlmIChjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAodWludDY0X3QpIHRzLnR2X3NlYyAqIDEwMDAgKiAxMDAwICogMTAwMCArIHRzLnR2X25zZWM7Ci0gICAgfQotICAgIHJldHVybiAwOyAvLyBzaG91bGQgbm90IGhhcHBlbi4KLX0KLQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRW50cnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZWFkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9UaW1lbGluZS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1dyaXRlci5oPgogCiAjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfTkJMT0dfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaAppbmRleCBkZGZlOWQ2Li5kN2MxNmI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApAQCAtMTksMTQgKzE5LDE3NiBAQAogCiAjaW5jbHVkZSA8ZGVxdWU+CiAjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgU3RyaW5nODsKKwogbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKIAorLy8gVE9ETyBtYWtlIHRoaXMgYSB0ZW1wbGF0ZWQgY2xhc3MgYW5kIHB1dCBpdCBpbiBhIHNlcGFyYXRlIGZpbGUuCisvLyBUaGUgdGVtcGxhdGVkIHBhcmFtZXRlcnMgd291bGQgYmUgYmluIHNpemUgYW5kIGxvdyBsaW1pdC4KKy8qCisgKiBIaXN0b2dyYW0gcHJvdmlkZXMgYSB3YXkgdG8gc3RvcmUgbnVtZXJpYyBkYXRhIGluIGhpc3RvZ3JhbSBmb3JtYXQgYW5kIHJlYWQgaXQgYXMgYSBzZXJpYWxpemVkCisgKiBzdHJpbmcuIFRoZSB0ZXJtcyAiYmluIiBhbmQgImJ1Y2tldCIgYXJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5LgorICoKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHRocmVhZC1zYWZlLgorICovCitjbGFzcyBIaXN0b2dyYW0geworcHVibGljOgorICAgIHN0cnVjdCBDb25maWcgeworICAgICAgICBjb25zdCBkb3VibGUgYmluU2l6ZTsgICAvLyBUT0RPIHRlbXBsYXRlIHR5cGUKKyAgICAgICAgY29uc3Qgc2l6ZV90IG51bUJpbnM7CisgICAgICAgIGNvbnN0IGRvdWJsZSBsb3c7ICAgICAgIC8vIFRPRE8gdGVtcGxhdGUgdHlwZQorICAgIH07CisKKyAgICAvLyBIaXN0b2dyYW1zIGFyZSBjb25zdHJ1Y3RlZCB3aXRoIGZpeGVkIGNvbmZpZ3VyYXRpb24gbnVtYmVycy4gRHluYW1pYyBjb25maWd1cmF0aW9uIGJhc2VkCisgICAgLy8gdGhlIGRhdGEgaXMgcG9zc2libGUgYnV0IGNvbXBsZXggYmVjYXVzZQorICAgIC8vIC0gZGF0YSBwb2ludHMgYXJlIGFkZGVkIG9uZSBieSBvbmUsIG5vdCBwcm9jZXNzZWQgYXMgYSBiYXRjaC4KKyAgICAvLyAtIEhpc3RvZ3JhbXMgd2l0aCBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSB0cmlja3kgdG8gYWdncmVnYXRlLCBhbmQgdGhleQorICAgIC8vICAgd2lsbCBuZWVkIHRvIGJlIGFnZ3JlZ2F0ZWQgYXQgdGhlIE1lZGlhIE1ldHJpY3MgY2xvdWQgc2lkZS4KKyAgICAvLyAtIG5vdCBwcm92aWRpbmcgbGltaXRzIHRoZW9yZXRpY2FsbHkgYWxsb3dzIGZvciBpbmZpbml0ZSBudW1iZXIgb2YgYnVja2V0cy4KKworICAgIC8qKgorICAgICAqIFxicmllZiBDcmVhdGVzIGEgSGlzdG9ncmFtIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBiaW5TaXplIHRoZSB3aWR0aCBvZiBlYWNoIGJpbiBvZiB0aGUgaGlzdG9ncmFtLCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLgorICAgICAqICAgICAgICAgICAgICAgIFVuaXRzIGFyZSB3aGF0ZXZlciBkYXRhIHRoZSBjYWxsZXIgZGVjaWRlcyB0byBzdG9yZS4KKyAgICAgKiBccGFyYW0gbnVtQmlucyB0aGUgbnVtYmVyIG9mIGJpbnMgZGVzaXJlZCBpbiB0aGUgaGlzdG9ncmFtIHJhbmdlLCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLgorICAgICAqIFxwYXJhbSBsb3cgICAgIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgaGlzdG9ncmFtIGJ1Y2tldCB2YWx1ZXMuCisgICAgICogICAgICAgICAgICAgICAgVW5pdHMgYXJlIHdoYXRldmVyIGRhdGEgdGhlIGNhbGxlciBkZWNpZGVzIHRvIHN0b3JlLgorICAgICAqICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgdXBwZXIgYm91bmQgY2FuIGJlIGNhbGN1bGF0ZWQgYnkgdGhlIGZvbGxvd2luZzoKKyAgICAgKiAgICAgICAgICAgICAgICAgIHVwcGVyID0gbG93ZXIgKyBiaW5TaXplICogbnVtQmlucy4KKyAgICAgKi8KKyAgICBIaXN0b2dyYW0oZG91YmxlIGJpblNpemUsIHNpemVfdCBudW1CaW5zLCBkb3VibGUgbG93ID0gMC4pCisgICAgICAgIDogbUJpblNpemUoYmluU2l6ZSksIG1OdW1CaW5zKG51bUJpbnMpLCBtTG93KGxvdyksIG1CaW5zKG1OdW1CaW5zICsgMikge30KKworICAgIEhpc3RvZ3JhbShjb25zdCBDb25maWcgJmMpCisgICAgICAgIDogSGlzdG9ncmFtKGMuYmluU2l6ZSwgYy5udW1CaW5zLCBjLmxvdykge30KKworICAgIC8qKgorICAgICAqIFxicmllZiBBZGQgYSBkYXRhIHBvaW50IHRvIHRoZSBoaXN0b2dyYW0uIFRoZSB2YWx1ZSBvZiB0aGUgZGF0YSBwb2ludAorICAgICAqICAgICAgICBpcyByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIHRoZSBiaW4gc2l6ZSAoYmVmb3JlIGFjY291bnRpbmcKKyAgICAgKiAgICAgICAgZm9yIHRoZSBsb3dlciBib3VuZCBvZmZzZXQsIHdoaWNoIG1heSBub3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgYmluIHNpemUpLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgZGF0YSBwb2ludCB0byBhZGQuCisgICAgICovCisgICAgdm9pZCBhZGQoZG91YmxlIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFxicmllZiBSZW1vdmVzIGFsbCBkYXRhIHBvaW50cyBmcm9tIHRoZSBoaXN0b2dyYW0uCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCisgICAgLyoqCisgICAgICogXGJyaWVmIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBkYXRhIHBvaW50cyBhZGRlZCB0byB0aGUgaGlzdG9ncmFtLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIGluIHRoZSBoaXN0b2dyYW0uCisgICAgICovCisgICAgdWludDY0X3QgdG90YWxDb3VudCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogXGJyaWVmIFNlcmlhbGl6ZXMgdGhlIGhpc3RvZ3JhbSBpbnRvIGEgc3RyaW5nLiBUaGUgZm9ybWF0IGlzIGNob3NlbiB0byBiZSBjb21wYXRpYmxlIHdpdGgKKyAgICAgKiAgICAgICAgdGhlIGhpc3RvZ3JhbSByZXByZXNlbnRhdGlvbiB0byBzZW5kIHRvIHRoZSBNZWRpYSBNZXRyaWNzIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiAgICAgICAgVGhlIHN0cmluZyBpcyBhcyBmb2xsb3dzOgorICAgICAqICAgICAgICAgIGJpblNpemUsbnVtQmlucyxsb3csey0xfGxvd0NvdW50LC4uLixiaW5JbmRleHxjb3VudCwuLi4sbnVtQmluc3xoaWdoQ291bnR9CisgICAgICoKKyAgICAgKiAgICAgICAgLSBiaW5JbmRleCBpcyBhbiBpbnRlZ2VyIHdpdGggMCA8PSBiaW5JbmRleCA8IG51bUJpbnMuCisgICAgICogICAgICAgIC0gY291bnQgaXMgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiB0aGUgKHJvdW5kZWQpIHZhbHVlCisgICAgICogICAgICAgICAgbG93ICsgYmluU2l6ZSAqIGJ1Y2tldEluZGV4LgorICAgICAqICAgICAgICAtIGxvd0NvdW50IGlzIHRoZSBudW1iZXIgb2YgKHJvdW5kZWQpIHZhbHVlcyBsZXNzIHRoYW4gbG93LgorICAgICAqICAgICAgICAtIGhpZ2hDb3VudCBpcyB0aGUgbnVtYmVyIG9mIChyb3VuZGVkKSB2YWx1ZXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvCisgICAgICogICAgICAgICAgbG93ICsgYmluU2l6ZSAqIG51bUJpbnMuCisgICAgICogICAgICAgIC0gYSBiaW5JbmRleCBtYXkgYmUgc2tpcHBlZCBpZiBpdHMgY291bnQgaXMgMC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIGhpc3RvZ3JhbSBzZXJpYWxpemVkIGFzIGEgc3RyaW5nLgorICAgICAqLworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisKKyAgICAvLyBEcmF3IGxvZyBzY2FsZSBzaWRld2F5cyBoaXN0b2dyYW0gYXMgQVNDSUkgYXJ0IGFuZCBzdG9yZSBhcyBhIHN0ZDo6c3RyaW5nLgorICAgIC8vIEVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBpZiB0b3RhbENvdW50KCkgPT0gMC4KKyAgICBzdGQ6OnN0cmluZyBhc2NpaUFydFN0cmluZyhzaXplX3QgaW5kZW50ID0gMCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgLy8gSGlzdG9ncmFtIHZlcnNpb24gbnVtYmVyLgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtWZXJzaW9uID0gMTsKKworICAgIGNvbnN0IGRvdWJsZSBtQmluU2l6ZTsgICAgICAgICAgLy8gU2l6ZSBvZiBlYWNoIGJ1Y2tldAorICAgIGNvbnN0IHNpemVfdCBtTnVtQmluczsgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ1Y2tldHMgaW4gcmFuZ2UgKGV4Y2x1ZGVzIGxvdyBhbmQgaGlnaCkKKyAgICBjb25zdCBkb3VibGUgbUxvdzsgICAgICAgICAgICAgIC8vIExvd2VyIGJvdW5kIG9mIHZhbHVlcworCisgICAgLy8gRGF0YSBzdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIGFjdHVhbCBoaXN0b2dyYW0uIENvdW50cyBvZiBiaW4gdmFsdWVzIGxlc3MgdGhhbiBtTG93CisgICAgLy8gYXJlIHN0b3JlZCBpbiBtQmluc1swXS4gQmluIGluZGV4IGkgY29ycmVzcG9uZHMgdG8gbUJpbnNbaSsxXS4gQ291bnRzIG9mIGJpbiB2YWx1ZXMKKyAgICAvLyA+PSBoaWdoIGFyZSBzdG9yZWQgaW4gbUJpbnNbbU51bUJpbnMgKyAxXS4KKyAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gbUJpbnM7CisKKyAgICB1aW50NjRfdCBtVG90YWxDb3VudCA9IDA7ICAgICAgIC8vIFRvdGFsIG51bWJlciBvZiB2YWx1ZXMgcmVjb3JkZWQKK307CisKKy8vIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgY2xhc3MgUGVyZm9ybWFuY2VBbmFseXNpcywgYnV0IFBlcmZvcm1hbmNlQW5hbHlzaXMKKy8vIGFsc28gZG9lcyBzb21lIGFkZGl0aW9uYWwgYW5hbHl6aW5nIG9mIGRhdGEsIHdoaWxlIHRoZSBwdXJwb3NlIG9mIHRoaXMgc3RydWN0IGlzCisvLyB0byBob2xkIGRhdGEuCitzdHJ1Y3QgUGVyZm9ybWFuY2VEYXRhIHsKKyAgICAvLyBUT0RPIHRoZSBIaXN0b2dyYW06OkNvbmZpZyBudW1iZXJzIGJlbG93IGFyZSBmb3IgRmFzdE1peGVyLgorICAgIC8vIFNwZWNpZnkgZGlmZmVyZW50IG51bWJlcnMgZm9yIG90aGVyIHRocmVhZCB0eXBlcy4KKworICAgIC8vIFZhbHVlcyBiYXNlZCBvbiBtVW5kZXJydW5OcyBhbmQgbU92ZXJydW5OcyBpbiBGYXN0TWl4ZXIuY3BwIGZvciBmcmFtZUNvdW50ID0gMTkyCisgICAgLy8gYW5kIG1TYW1wbGVSYXRlID0gNDgwMDAsIHdoaWNoIGNvcnJlc3BvbmQgdG8gMiBhbmQgNyBzZWNvbmRzLgorICAgIHN0YXRpYyBjb25zdGV4cHIgSGlzdG9ncmFtOjpDb25maWcga1dvcmtDb25maWcgPSB7IDAuMjUsIDIwLCAyLn07CisKKyAgICAvLyBWYWx1ZXMgYmFzZWQgb24gdHJpYWwgYW5kIGVycm9yIGxvZ2dpbmcuIE5lZWQgYSBiZXR0ZXIgd2F5IHRvIGRldGVybWluZQorICAgIC8vIGJpbiBzaXplIGFuZCBsb3dlci91cHBlciBsaW1pdHMuCisgICAgc3RhdGljIGNvbnN0ZXhwciBIaXN0b2dyYW06OkNvbmZpZyBrTGF0ZW5jeUNvbmZpZyA9IHsgMi4sIDEwLCAxMC59OworCisgICAgLy8gVmFsdWVzIGJhc2VkIG9uIHRyaWFsIGFuZCBlcnJvciBsb2dnaW5nLiBOZWVkIGEgYmV0dGVyIHdheSB0byBkZXRlcm1pbmUKKyAgICAvLyBiaW4gc2l6ZSBhbmQgbG93ZXIvdXBwZXIgbGltaXRzLgorICAgIHN0YXRpYyBjb25zdGV4cHIgSGlzdG9ncmFtOjpDb25maWcga1dhcm11cENvbmZpZyA9IHsgNS4sIDEwLCAxMC59OworCisgICAgTkJMb2c6OnRocmVhZF9pbmZvX3QgdGhyZWFkSW5mb3t9OworICAgIE5CTG9nOjp0aHJlYWRfcGFyYW1zX3QgdGhyZWFkUGFyYW1ze307CisKKyAgICAvLyBQZXJmb3JtYW5jZSBEYXRhCisgICAgSGlzdG9ncmFtIHdvcmtIaXN0e2tXb3JrQ29uZmlnfTsKKyAgICBIaXN0b2dyYW0gbGF0ZW5jeUhpc3R7a0xhdGVuY3lDb25maWd9OworICAgIEhpc3RvZ3JhbSB3YXJtdXBIaXN0e2tXYXJtdXBDb25maWd9OworICAgIGludDY0X3QgdW5kZXJydW5zID0gMDsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWF4U25hcHNob3RzVG9TdG9yZSA9IDI1NjsKKyAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxOQkxvZzo6RXZlbnQsIGludDY0X3QgLyp0aW1lc3RhbXAqLz4+IHNuYXBzaG90czsKKyAgICBpbnQ2NF90IG92ZXJydW5zID0gMDsKKyAgICBuc2Vjc190IGFjdGl2ZSA9IDA7CisgICAgbnNlY3NfdCBzdGFydHtzeXN0ZW1UaW1lKCl9OworCisgICAgLy8gUmVzZXQgdGhlIHBlcmZvcm1hbmNlIGRhdGEuIFRoaXMgZG9lcyBub3QgcmVwcmVzZW50IGEgdGhyZWFkIHN0YXRlIGNoYW5nZS4KKyAgICAvLyBUaHJlYWQgaW5mbyBpcyBub3QgcmVzZXQgaGVyZSBiZWNhdXNlIHRoZSBkYXRhIGlzIG1lYW50IHRvIGJlIGEgY29udGludWF0aW9uIG9mIHRoZSB0aHJlYWQKKyAgICAvLyB0aGF0IHN0cnVjdCBQZXJmb3JtYW5jZURhdGEgaXMgYXNzb2NpYXRlZCB3aXRoLgorICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIHdvcmtIaXN0LmNsZWFyKCk7CisgICAgICAgIGxhdGVuY3lIaXN0LmNsZWFyKCk7CisgICAgICAgIHdhcm11cEhpc3QuY2xlYXIoKTsKKyAgICAgICAgdW5kZXJydW5zID0gMDsKKyAgICAgICAgb3ZlcnJ1bnMgPSAwOworICAgICAgICBhY3RpdmUgPSAwOworICAgICAgICBzdGFydCA9IHN5c3RlbVRpbWUoKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBwZXJmb3JtYW5jZSBkYXRhIGhhcyBub3QgYmVlbiByZWNvcmRlZCB5ZXQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIGVtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gd29ya0hpc3QudG90YWxDb3VudCgpID09IDAgJiYgbGF0ZW5jeUhpc3QudG90YWxDb3VudCgpID09IDAKKyAgICAgICAgICAgICAgICAmJiB3YXJtdXBIaXN0LnRvdGFsQ291bnQoKSA9PSAwICYmIHVuZGVycnVucyA9PSAwICYmIG92ZXJydW5zID09IDAKKyAgICAgICAgICAgICAgICAmJiBhY3RpdmUgPT0gMDsKKyAgICB9Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiBjbGFzcyBQZXJmb3JtYW5jZUFuYWx5c2lzOwogCiAvLyBhIG1hcCBvZiBQZXJmb3JtYW5jZUFuYWx5c2lzIGluc3RhbmNlcwpAQCAtODAsNyArMjQyLDcgQEAKICAgICBzdGQ6OmRlcXVlPHRpbWVzdGFtcD4gbVBlYWtUaW1lc3RhbXBzOwogCiAgICAgLy8gc3RvcmVzIGJ1ZmZlciBwZXJpb2QgaGlzdG9ncmFtcyB3aXRoIHRpbWVzdGFtcCBvZiBmaXJzdCBzYW1wbGUKLSAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3RvZ3JhbT4+IG1IaXN0czsKKyAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3Q+PiBtSGlzdHM7CiAKICAgICAvLyBQYXJhbWV0ZXJzIHVzZWQgd2hlbiBkZXRlY3Rpbmcgb3V0bGllcnMKICAgICBzdHJ1Y3QgQnVmZmVyUGVyaW9kIHsKQEAgLTExOSw4ICsyODEsNyBAQAogdm9pZCBkdW1wKGludCBmZCwgaW50IGluZGVudCwgUGVyZm9ybWFuY2VBbmFseXNpc01hcCAmdGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpcyk7CiB2b2lkIGR1bXBMaW5lKGludCBmZCwgaW50IGluZGVudCwgY29uc3QgU3RyaW5nOCAmYm9keSk7CiAKLX0gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCi0KK30gICAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfUEVSRk9STUFOQ0VBTkFMWVNJU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlYWRlci5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDk1ZThjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZWFkZXIuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19SRUFERVJfSAorI2RlZmluZSBBTkRST0lEX01FRElBX05CTE9HX1JFQURFUl9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FbnRyeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworY2xhc3MgYXVkaW9fdXRpbHNfZmlmbzsKK2NsYXNzIGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElNZW1vcnk7CitjbGFzcyBTdHJpbmc4OworCituYW1lc3BhY2UgTkJMb2cgeworCitzdHJ1Y3QgU2hhcmVkOworCisvLyBOQkxvZyBSZWFkZXIgQVBJCisKK2NsYXNzIFNuYXBzaG90OyAgICAgLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBuZWVkZWQgZm9yIFJlYWRlcjo6Z2V0U25hcHNob3QoKQorCitjbGFzcyBSZWFkZXIgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgorICAgIC8vIFRoZSBzaXplIG9mIHRoZSBzaGFyZWQgbWVtb3J5IG11c3QgYmUgYXQgbGVhc3QgVGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkuCisgICAgUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKTsKKyAgICBSZWFkZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSk7CisgICAgflJlYWRlcigpIG92ZXJyaWRlOworCisgICAgLy8gZ2V0IHNuYXBzaG90IG9mIHJlYWRlcnMgZmlmbyBidWZmZXIsIGVmZmVjdGl2ZWx5IGNvbnN1bWluZyB0aGUgYnVmZmVyCisgICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBnZXRTbmFwc2hvdChib29sIGZsdXNoID0gdHJ1ZSk7CisgICAgYm9vbCAgICAgaXNJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KSBjb25zdDsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisKK3ByaXZhdGU6CisgICAgLy8gQW1vdW50IG9mIHRyaWVzIGZvciByZWFkZXIgdG8gY2F0Y2ggdXAgd2l0aCB3cml0ZXIgaW4gZ2V0U25hcHNob3QoKS4KKyAgICBzdGF0aWMgY29uc3RleHByIGludCBrTWF4T2J0YWluVHJpZXMgPSAzOworCisgICAgLy8gaW52YWxpZEJlZ2luVHlwZXMgYW5kIGludmFsaWRFbmRUeXBlcyBhcmUgdXNlZCB0byBhbGlnbiB0aGUgU25hcHNob3Q6OmJlZ2luKCkgYW5kCisgICAgLy8gU25hcHNob3Q6OmVuZCgpIEVudHJ5SXRlcmF0b3JzIHRvIHZhbGlkIGVudHJpZXMuCisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxFdmVudD4gaW52YWxpZEJlZ2luVHlwZXM7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxFdmVudD4gaW52YWxpZEVuZFR5cGVzOworCisgICAgLy8gZGVjbGFyZWQgYXMgY29uc3QgYmVjYXVzZSBhdWRpb191dGlsc19maWZvKCkgY29uc3RydWN0b3IKKyAgICBzcDxJTWVtb3J5PiBtSU1lbW9yeTsgICAgICAgLy8gcmVmLWNvdW50ZWQgdmVyc2lvbiwgYXNzaWduZWQgb25seSBpbiBjb25zdHJ1Y3RvcgorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbU5hbWU7ICAgICAgICAgICAgLy8gbmFtZSBvZiByZWFkZXIgKGFjdHVhbGx5IG5hbWUgb2Ygd3JpdGVyKQorICAgIC8qY29uc3QqLyBTaGFyZWQqIGNvbnN0IG1TaGFyZWQ7ICAgIC8vIHJhdyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnksIGFjdHVhbGx5IGNvbnN0IGJ1dCBub3QKKyAgICBhdWRpb191dGlsc19maWZvICogY29uc3QgbUZpZm87ICAgICAgICAgICAgICAgICAvLyBGSUZPIGl0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24tTlVMTCB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKKyAgICBhdWRpb191dGlsc19maWZvX3JlYWRlciAqIGNvbnN0IG1GaWZvUmVhZGVyOyAgICAvLyB1c2VkIHRvIHJlYWQgZnJvbSBGSUZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1OVUxMIHVubGVzcyBjb25zdHJ1Y3RvciBmYWlscworCisgICAgLy8gU2VhcmNoZXMgZm9yIHRoZSBsYXN0IHZhbGlkIGVudHJ5IGluIHRoZSByYW5nZSBbZnJvbnQsIGJhY2spCisgICAgLy8gYmFjayBoYXMgdG8gYmUgZW50cnktYWxpZ25lZC4gUmV0dXJucyBudWxscHRyIGlmIG5vbmUgZW5jb251bnRlcmVkLgorICAgIHN0YXRpYyBjb25zdCB1aW50OF90ICpmaW5kTGFzdFZhbGlkRW50cnkoY29uc3QgdWludDhfdCAqZnJvbnQsIGNvbnN0IHVpbnQ4X3QgKmJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxFdmVudD4gJmludmFsaWRUeXBlcyk7Cit9OworCisvLyBBIHNuYXBzaG90IG9mIGEgcmVhZGVycyBidWZmZXIKKy8vIFRoaXMgaXMgcmF3IGRhdGEuIE5vIGFuYWx5c2lzIGhhcyBiZWVuIGRvbmUgb24gaXQKK2NsYXNzIFNuYXBzaG90IHsKK3B1YmxpYzoKKyAgICB+U25hcHNob3QoKSB7IGRlbGV0ZVtdIG1EYXRhOyB9CisKKyAgICAvLyBhbW91bnQgb2YgZGF0YSBsb3N0IChnaXZlbiBieSBhdWRpb191dGlsc19maWZvX3JlYWRlcikKKyAgICBzaXplX3QgbG9zdCgpIGNvbnN0IHsgcmV0dXJuIG1Mb3N0OyB9CisKKyAgICAvLyBpdGVyYXRvciB0byBiZWdpbm5pbmcgb2YgcmVhZGFibGUgc2VnbWVudCBvZiBzbmFwc2hvdAorICAgIC8vIGRhdGEgYmV0d2VlbiBiZWdpbiBhbmQgZW5kIGhhcyB2YWxpZCBlbnRyaWVzCisgICAgRW50cnlJdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1CZWdpbjsgfQorCisgICAgLy8gaXRlcmF0b3IgdG8gZW5kIG9mIHJlYWRhYmxlIHNlZ21lbnQgb2Ygc25hcHNob3QKKyAgICBFbnRyeUl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIG1FbmQ7IH0KKworcHJpdmF0ZToKKyAgICBTbmFwc2hvdCgpID0gZGVmYXVsdDsKKyAgICBleHBsaWNpdCBTbmFwc2hvdChzaXplX3QgYnVmZmVyU2l6ZSkgOiBtRGF0YShuZXcgdWludDhfdFtidWZmZXJTaXplXSkge30KKyAgICBmcmllbmQgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBSZWFkZXI6OmdldFNuYXBzaG90KGJvb2wgZmx1c2gpOworCisgICAgdWludDhfdCAqIGNvbnN0ICAgICAgIG1EYXRhID0gbnVsbHB0cjsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgbUxvc3QgPSAwOworICAgIEVudHJ5SXRlcmF0b3IgICAgICAgICBtQmVnaW47CisgICAgRW50cnlJdGVyYXRvciAgICAgICAgIG1FbmQ7Cit9OworCisvLyBUT0RPIG1vdmUgdGhpcyB0byBNZWRpYUxvZ1NlcnZpY2U/CitjbGFzcyBEdW1wUmVhZGVyIDogcHVibGljIE5CTG9nOjpSZWFkZXIgeworcHVibGljOgorICAgIER1bXBSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCisgICAgICAgIDogUmVhZGVyKHNoYXJlZCwgc2l6ZSwgbmFtZSkge30KKyAgICBEdW1wUmVhZGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCisgICAgICAgIDogUmVhZGVyKGlNZW1vcnksIHNpemUsIG5hbWUpIHt9CisgICAgdm9pZCBkdW1wKGludCBmZCwgc2l6ZV90IGluZGVudCA9IDApOworcHJpdmF0ZToKKyAgICB2b2lkIGhhbmRsZUF1dGhvcihjb25zdCBBYnN0cmFjdEVudHJ5JiBmbXRFbnRyeSBfX3VudXNlZCwgU3RyaW5nOCogYm9keSBfX3VudXNlZCkge30KKyAgICBFbnRyeUl0ZXJhdG9yIGhhbmRsZUZvcm1hdChjb25zdCBGb3JtYXRFbnRyeSAmZm10RW50cnksIFN0cmluZzggKnRpbWVzdGFtcCwgU3RyaW5nOCAqYm9keSk7CisKKyAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRJbnQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSk7CisgICAgc3RhdGljIHZvaWQgICAgYXBwZW5kRmxvYXQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSk7CisgICAgc3RhdGljIHZvaWQgICAgYXBwZW5kUElEKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpOworICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZFRpbWVzdGFtcChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKKworICAgIC8vIFRoZSBidWZmZXJEdW1wIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgZGVidWdnaW5nIG9ubHkuCisgICAgc3RhdGljIFN0cmluZzggYnVmZmVyRHVtcChjb25zdCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0aWMgU3RyaW5nOCBidWZmZXJEdW1wKGNvbnN0IEVudHJ5SXRlcmF0b3IgJml0KTsKK307CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfTkJMT0dfUkVBREVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaAppbmRleCBlYzA4NDJmLi42NGE1NzAxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmgKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oCkBAIC0yMiwxOSArMjIsMzMgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gVGhlIFN0cmluZzggY2xhc3MgaXMgdXNlZCBieSByZXBvcnRQZXJmb3JtYW5jZSBmdW5jdGlvbgotY2xhc3MgU3RyaW5nODsKLQogbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKIAorc3RydWN0IFBlcmZvcm1hbmNlRGF0YTsKKworLy8gRHVtcHMgcGVyZm9ybWFuY2UgZGF0YSBpbiBhIEpTT04gZm9ybWF0Lgordm9pZCBkdW1wSnNvbihpbnQgZmQsIGNvbnN0IHN0ZDo6bWFwPGludCwgUGVyZm9ybWFuY2VEYXRhPiYgdGhyZWFkRGF0YU1hcCk7CisKKy8vRHVtcHMgcGVyZm9ybWFuY2UgZGF0YSBhcyB2aXN1YWxpemVkIHBsb3RzLgordm9pZCBkdW1wUGxvdHMoaW50IGZkLCBjb25zdCBzdGQ6Om1hcDxpbnQsIFBlcmZvcm1hbmNlRGF0YT4mIHRocmVhZERhdGFNYXApOworCisvLyBEdW1wcyBzbmFwc2hvdHMgYXQgaW1wb3J0YW50IGV2ZW50cyBpbiB0aGUgcGFzdC4KK3ZvaWQgZHVtcFJldHJvKGludCBmZCwgY29uc3Qgc3RkOjptYXA8aW50LCBQZXJmb3JtYW5jZURhdGE+JiB0aHJlYWREYXRhTWFwKTsKKworLy8gU2VuZCBvbmUgdGhyZWFkJ3MgZGF0YSB0byBtZWRpYSBtZXRyaWNzLCBpZiB0aGUgcGVyZm9ybWFuY2UgZGF0YSBpcyBub250cml2aWFsIChpLmUuIG5vdAorLy8gYWxsIHplcm8gdmFsdWVzKS4gUmV0dXJuIHRydWUgaWYgZGF0YSB3YXMgc2VudCwgZmFsc2UgaWYgdGhlcmUgaXMgbm90aGluZyB0byB3cml0ZQorLy8gb3IgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgd3JpdGluZy4KK2Jvb2wgc2VuZFRvTWVkaWFNZXRyaWNzKGNvbnN0IFBlcmZvcm1hbmNlRGF0YSYgZGF0YSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIGNvbnN0ZXhwciBpbnQga01zUGVyU2VjID0gMTAwMDsKIGNvbnN0ZXhwciBpbnQga1NlY1Blck1pbiA9IDYwOwogCiBjb25zdGV4cHIgaW50IGtKaWZmeVBlck1zID0gMTA7IC8vIHRpbWUgdW5pdCBmb3IgaGlzdG9ncmFtIGFzIGEgbXVsdGlwbGUgb2YgbWlsbGlzZWNvbmRzCiAKIC8vIHN0b3JlcyBhIGhpc3RvZ3JhbToga2V5OiBvYnNlcnZlZCBidWZmZXIgcGVyaW9kIChtdWx0aXBsZSBvZiBqaWZmeSkuIHZhbHVlOiBjb3VudAotdXNpbmcgSGlzdG9ncmFtID0gc3RkOjptYXA8aW50LCBpbnQ+OwordXNpbmcgSGlzdCA9IHN0ZDo6bWFwPGludCwgaW50PjsKIAogdXNpbmcgbXNJbnRlcnZhbCA9IGRvdWJsZTsKIHVzaW5nIGppZmZ5SW50ZXJ2YWwgPSBkb3VibGU7CkBAIC01NywxMyArNzEsMTIgQEAKIH0KIAogLy8gV3JpdGVzIG91dGxpZXIgaW50ZXJ2YWxzLCB0aW1lc3RhbXBzLCBwZWFrcyB0aW1lc3RhbXBzLCBhbmQgaGlzdG9ncmFtcyB0byBhIGZpbGUuCi12b2lkIHdyaXRlVG9GaWxlKGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdG9ncmFtPj4gJmhpc3RzLAordm9pZCB3cml0ZVRvRmlsZShjb25zdCBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3Q+PiAmaGlzdHMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPG1zSW50ZXJ2YWwsIHRpbWVzdGFtcD4+ICZvdXRsaWVyRGF0YSwKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpkZXF1ZTx0aW1lc3RhbXA+ICZwZWFrVGltZXN0YW1wcywKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGtEaXJlY3RvcnksIGJvb2wgYXBwZW5kLCBpbnQgYXV0aG9yLCBsb2dfaGFzaF90IGhhc2gpOwogCi19IC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQotCit9ICAgLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1JFUE9SVFBFUkZPUk1BTkNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvVGltZWxpbmUuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvVGltZWxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGYwY2ZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9UaW1lbGluZS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfTkJMT0dfVElNRUxJTkVfSAorI2RlZmluZSBBTkRST0lEX01FRElBX05CTE9HX1RJTUVMSU5FX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmb19pbmRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIE5CTG9nIHsKKworLy8gTG9jYXRlZCBpbiBzaGFyZWQgbWVtb3J5LCBtdXN0IGJlIFBPRC4KKy8vIEV4YWN0bHkgb25lIHByb2Nlc3MgbXVzdCBleHBsaWNpdGx5IGNhbGwgdGhlIGNvbnN0cnVjdG9yIG9yIHVzZSBwbGFjZW1lbnQgbmV3LgorLy8gU2luY2UgdGhpcyBpcyBhIFBPRCwgdGhlIGRlc3RydWN0b3IgaXMgZW1wdHkgYW5kIHVubmVjZXNzYXJ5IHRvIGNhbGwgaXQgZXhwbGljaXRseS4KK3N0cnVjdCBTaGFyZWQgeworICAgIFNoYXJlZCgpIC8qIG1SZWFyIGluaXRpYWxpemVkIHZpYSBkZWZhdWx0IGNvbnN0cnVjdG9yICovIHt9CisgICAgflNoYXJlZCgpIHt9CisKKyAgICBhdWRpb191dGlsc19maWZvX2luZGV4ICBtUmVhcjsgIC8vIGluZGV4IG9uZSBieXRlIHBhc3QgdGhlIGVuZCBvZiBtb3N0IHJlY2VudCBFbnRyeQorICAgIGNoYXIgICAgbUJ1ZmZlclswXTsgICAgICAgICAgICAgLy8gY2lyY3VsYXIgYnVmZmVyIGZvciBlbnRyaWVzCit9OworCisvLyBGSVhNRSBUaW1lbGluZSB3YXMgaW50ZW5kZWQgdG8gd3JhcCBXcml0ZXIgYW5kIFJlYWRlciwgYnV0IGlzbid0IGFjdHVhbGx5IHVzZWQgeWV0LgorLy8gRm9yIG5vdyBpdCBpcyBqdXN0IGEgbmFtZXNwYWNlIGZvciBzaGFyZWRTaXplKCkuCitjbGFzcyBUaW1lbGluZSA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyNpZiAwCisgICAgVGltZWxpbmUoc2l6ZV90IHNpemUsIHZvaWQgKnNoYXJlZCA9IE5VTEwpOworICAgIHZpcnR1YWwgflRpbWVsaW5lKCk7CisjZW5kaWYKKworICAgIC8vIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgdGltZWxpbmUgaW4gYnl0ZSB1bml0cy4KKyAgICAvLyBSZXR1cm5zIHRoZSBzaXplIHJvdW5kZWQgdXAgdG8gYSBwb3dlci1vZi0yLCBwbHVzIHRoZSBjb25zdGFudCBzaXplIG92ZXJoZWFkIGZvciBpbmRpY2VzLgorICAgIHN0YXRpYyBzaXplX3Qgc2hhcmVkU2l6ZShzaXplX3Qgc2l6ZSk7CisKKyNpZiAwCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyAgICBXcml0ZXI7CisgICAgZnJpZW5kIGNsYXNzICAgIFJlYWRlcjsKKworICAgIGNvbnN0IHNpemVfdCAgICBtU2l6ZTsgICAgICAvLyBjaXJjdWxhciBidWZmZXIgc2l6ZSBpbiBieXRlcywgbXVzdCBiZSBhIHBvd2VyIG9mIDIKKyAgICBib29sICAgICAgICAgICAgbU93bjsgICAgICAgLy8gd2hldGhlciBJIG93biB0aGUgbWVtb3J5IGF0IG1TaGFyZWQKKyAgICBTaGFyZWQqIGNvbnN0ICAgbVNoYXJlZDsgICAgLy8gcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5CisjZW5kaWYKK307CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfTkJMT0dfVElNRUxJTkVfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9Xcml0ZXIuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZjZDM5NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvV3JpdGVyLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfTkJMT0dfV1JJVEVSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19XUklURVJfSAorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCitjbGFzcyBhdWRpb191dGlsc19maWZvOworY2xhc3MgYXVkaW9fdXRpbHNfZmlmb193cml0ZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSU1lbW9yeTsKKworbmFtZXNwYWNlIE5CTG9nIHsKKworY2xhc3MgRW50cnk7CitzdHJ1Y3QgU2hhcmVkOworCisvLyBOQkxvZyBXcml0ZXIgSW50ZXJmYWNlCisKKy8vIFdyaXRlciBpcyB0aHJlYWQtc2FmZSB3aXRoIHJlc3BlY3QgdG8gUmVhZGVyLCBidXQgbm90IHdpdGggcmVzcGVjdCB0byBtdWx0aXBsZSB0aHJlYWRzCisvLyBjYWxsaW5nIFdyaXRlciBtZXRob2RzLiAgSWYgeW91IG5lZWQgbXVsdGktdGhyZWFkIHNhZmV0eSBmb3Igd3JpdGluZywgdXNlIExvY2tlZFdyaXRlci4KK2NsYXNzIFdyaXRlciA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBXcml0ZXIoKSA9IGRlZmF1bHQ7ICAgICAgICAgLy8gZHVtbXkgbm9wIGltcGxlbWVudGF0aW9uIHdpdGhvdXQgc2hhcmVkIG1lbW9yeQorCisgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgorICAgIC8vIFRoZSBzaXplIG9mIHRoZSBzaGFyZWQgbWVtb3J5IG11c3QgYmUgYXQgbGVhc3QgVGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkuCisgICAgV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOworICAgIFdyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpOworCisgICAgfldyaXRlcigpIG92ZXJyaWRlOworCisgICAgLy8gRklYTUUgbmVlZHMgY29tbWVudHMsIGFuZCBzb21lIHNob3VsZCBiZSBwcml2YXRlCisgICAgdm9pZCAgICBsb2coY29uc3QgY2hhciAqc3RyaW5nKTsKKyAgICB2b2lkICAgIGxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKKyAgICB2b2lkICAgIGxvZ1RpbWVzdGFtcCgpOworICAgIHZvaWQgICAgbG9nRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCAuLi4pOworICAgIHZvaWQgICAgbG9nRXZlbnRIaXN0VHMoRXZlbnQgZXZlbnQsIGxvZ19oYXNoX3QgaGFzaCk7CisKKyAgICAvLyBMb2cgZGF0YSByZWxhdGVkIHRvIEV2ZW50IEUuIFNlZSB0aGUgZXZlbnQtdG8tdHlwZSBtYXBwaW5nIGZvciB0aGUgdHlwZSBvZiBkYXRhCisgICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGUgZXZlbnQuIEZvciBleGFtcGxlLCBpZiB5b3Ugc2VlIGEgbWFwcGluZyBzdGF0ZW1lbnQ6CisgICAgLy8gICAgIE1BUF9UWVBFX1RPX0VWRU5UKEUsIFQpOworICAgIC8vIHRoZW4gdGhlIHVzYWdlIG9mIHRoaXMgbWV0aG9kIHdvdWxkIGJlOgorICAgIC8vICAgICBUIGRhdGEgPSBkb0NvbXB1dGF0aW9uKCk7CisgICAgLy8gICAgIHRsTkJMb2dXcml0ZXItPmxvZzxOQkxvZzo6RT4oZGF0YSk7CisgICAgdGVtcGxhdGU8RXZlbnQgRT4KKyAgICB2b2lkICAgIGxvZyh0eXBlbmFtZSBnZXRfbWFwcGVkPEU+Ojp0eXBlIGRhdGEpIHsKKyAgICAgICAgbG9nKEUsICZkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCAgICBpc0VuYWJsZWQoKSBjb25zdDsKKworICAgIC8vIHJldHVybiB2YWx1ZSBmb3IgYWxsIG9mIHRoZXNlIGlzIHRoZSBwcmV2aW91cyBpc0VuYWJsZWQoKQorICAgIHZpcnR1YWwgYm9vbCAgICBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCk7ICAgLy8gYnV0IHdvbid0IGVuYWJsZSBpZiBubyBzaGFyZWQgbWVtb3J5CisgICAgYm9vbCAgICAgICAgICAgIGVuYWJsZSgpICB7IHJldHVybiBzZXRFbmFibGVkKHRydWUpOyB9CisgICAgYm9vbCAgICAgICAgICAgIGRpc2FibGUoKSB7IHJldHVybiBzZXRFbmFibGVkKGZhbHNlKTsgfQorCisgICAgc3A8SU1lbW9yeT4gICAgIGdldElNZW1vcnkoKSBjb25zdCB7IHJldHVybiBtSU1lbW9yeTsgfQorCisgICAgLy8gUHVibGljIGxvZ2dpbmcgZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zIHNob3VsZCBhbHdheXMgdXNlIG9uZSBvZiB0aGUKKyAgICAvLyB0d28gbG9nKCkgZnVuY3Rpb24gY2FsbHMgYmVsb3cgdG8gd3JpdGUgdG8gc2hhcmVkIG1lbW9yeS4KK3Byb3RlY3RlZDoKKyAgICAvLyBXcml0ZXMgYSBzaW5nbGUgRW50cnkgdG8gdGhlIEZJRk8gaWYgdGhlIHdyaXRlciBpcyBlbmFibGVkLgorICAgIC8vIFRoaXMgaXMgcHJvdGVjdGVkIGFuZCB2aXJ0dWFsIGJlY2F1c2UgTG9ja2VkV3JpdGVyIHVzZXMgYSBsb2NrIHRvIHByb3RlY3QKKyAgICAvLyB3cml0aW5nIHRvIHRoZSBGSUZPIGJlZm9yZSB3cml0aW5nIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgdmlydHVhbCB2b2lkIGxvZyhjb25zdCBFbnRyeSAmZW50cnksIGJvb2wgdHJ1c3RlZCA9IGZhbHNlKTsKKworcHJpdmF0ZToKKyAgICAvLyAwIDw9IGxlbmd0aCA8PSBrTWF4TGVuZ3RoCisgICAgLy8gTG9nIGEgc2luZ2xlIEVudHJ5IHdpdGggY29ycmVzcG9uZGluZyBldmVudCwgZGF0YSwgYW5kIGxlbmd0aC4KKyAgICB2b2lkICAgIGxvZyhFdmVudCBldmVudCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisKKyAgICB2b2lkICAgIGxvZ3ZmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCk7CisKKyAgICAvLyBoZWxwZXIgZnVuY3Rpb25zIGZvciBsb2dnaW5nIHBhcnRzIG9mIGEgZm9ybWF0dGVkIGVudHJ5CisgICAgdm9pZCAgICBsb2dTdGFydChjb25zdCBjaGFyICpmbXQpOworICAgIHZvaWQgICAgbG9nVGltZXN0YW1wRm9ybWF0KCk7CisgICAgdm9pZCAgICBsb2dWRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCB2YV9saXN0IGFwKTsKKworICAgIFNoYXJlZCogY29uc3QgICBtU2hhcmVke307ICAgICAgICAgIC8vIHJhdyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkKKyAgICBzcDxJTWVtb3J5PiAgICAgbUlNZW1vcnl7fTsgICAgICAgICAvLyByZWYtY291bnRlZCB2ZXJzaW9uLCBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIGNvbnN0CisgICAgYXVkaW9fdXRpbHNfZmlmbyAqIGNvbnN0IG1GaWZve307ICAgICAgICAgICAgICAgLy8gRklGTyBpdHNlbGYsIG5vbi1OVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgZHVtbXkgY29uc3RydWN0b3IgdXNlZAorICAgIGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyICogY29uc3QgbUZpZm9Xcml0ZXJ7fTsgIC8vIHVzZWQgdG8gd3JpdGUgdG8gRklGTywgbm9uLU5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgZHVtbXkgY29uc3RydWN0b3IgdXNlZAorICAgIGJvb2wgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOyAgIC8vIHdoZXRoZXIgdG8gYWN0dWFsbHkgbG9nCisKKyAgICAvLyBjYWNoZWQgcGlkIGFuZCBwcm9jZXNzIG5hbWUgdG8gdXNlIGluICVwIGZvcm1hdCBzcGVjaWZpZXIKKyAgICAvLyB0b3RhbCB0YWcgbGVuZ3RoIGlzIG1QaWRUYWdTaXplIGFuZCBwcm9jZXNzIG5hbWUgaXMgbm90IHplcm8gdGVybWluYXRlZAorICAgIGNoYXIgICAqbVBpZFRhZ3t9OworICAgIHNpemVfdCAgbVBpZFRhZ1NpemUgPSAwOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFNpbWlsYXIgdG8gV3JpdGVyLCBidXQgc2FmZSBmb3IgbXVsdGlwbGUgdGhyZWFkcyB0byBjYWxsIGNvbmN1cnJlbnRseQorY2xhc3MgTG9ja2VkV3JpdGVyIDogcHVibGljIFdyaXRlciB7CitwdWJsaWM6CisgICAgTG9ja2VkV3JpdGVyKCkgPSBkZWZhdWx0OworICAgIExvY2tlZFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKKworICAgIGJvb2wgICAgaXNFbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCAgICBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgLy8gTG9jayBuZWVkcyB0byBiZSBvYnRhaW5lZCBiZWZvcmUgd3JpdGluZyB0byBGSUZPLgorICAgIHZvaWQgbG9nKGNvbnN0IEVudHJ5ICZlbnRyeSwgYm9vbCB0cnVzdGVkID0gZmFsc2UpIG92ZXJyaWRlOworCisgICAgbXV0YWJsZSBNdXRleCAgIG1Mb2NrOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19XUklURVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ1dyaXRlci5jcHAKaW5kZXggMmVhNWZjZC4uZTE3Mzk3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwCkBAIC04NSw3ICs4NSw3IEBACiAgICAgQ0hFQ0soIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSk7CiAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZtQ2hhbm5lbENvdW50KSk7CiAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmbVNhbXBsZVJhdGUpKTsKLSAgICBDSEVDSyhtQ2hhbm5lbENvdW50ID49IDEgJiYgbUNoYW5uZWxDb3VudCA8PSAyKTsKKyAgICBDSEVDSyhtQ2hhbm5lbENvdW50ID49IDEgJiYgbUNoYW5uZWxDb3VudCA8PSA3KTsKIAogICAgIC8vIE9wdGlvbmFsbHksIHdlIHdhbnQgdG8gY2hlY2sgd2hldGhlciBBQUNQcm9maWxlIGlzIGFsc28gc2V0LgogICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUFBQ1Byb2ZpbGUsICZtQUFDUHJvZmlsZSkpIHsKQEAgLTE1NCwxMSArMTU0LDExIEBACiAgICAgbURvbmUgPSB0cnVlOwogCiAgICAgdm9pZCAqZHVtbXk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVNvdXJjZS0+c3RvcCgpOwogICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmZHVtbXkpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihkdW1teSkpOwogICAgIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVNvdXJjZS0+c3RvcCgpOwogICAgICAgICBpZiAoZXJyID09IE9LICYmCiAgICAgICAgICAgICAoc3RhdHVzICE9IE9LICYmIHN0YXR1cyAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSkgewogICAgICAgICAgICAgZXJyID0gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKaW5kZXggODFhNDY0MC4uZjAwYzg5NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCkBAIC0zNyw2ICszNyw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9CdWZmZXJQcm9kdWNlcldyYXBwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1BlcnNpc3RlbnRTdXJmYWNlLmg+CkBAIC0xNzEsMTEgKzE3Miw3IEBACiB9CiAKIHN0cnVjdCBDb2RlY09ic2VydmVyIDogcHVibGljIEJuT01YT2JzZXJ2ZXIgewotICAgIENvZGVjT2JzZXJ2ZXIoKSB7fQotCi0gICAgdm9pZCBzZXROb3RpZmljYXRpb25NZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgICAgIG1Ob3RpZnkgPSBtc2c7Ci0gICAgfQorICAgIGV4cGxpY2l0IENvZGVjT2JzZXJ2ZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIDogbU5vdGlmeShtc2cpIHt9CiAKICAgICAvLyBmcm9tIElPTVhPYnNlcnZlcgogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VzKGNvbnN0IHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT4gJm1lc3NhZ2VzKSB7CkBAIC0yNTEsNyArMjQ4LDcgQEAKICAgICB2aXJ0dWFsIH5Db2RlY09ic2VydmVyKCkge30KIAogcHJpdmF0ZToKLSAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKKyAgICBjb25zdCBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvZGVjT2JzZXJ2ZXIpOwogfTsKQEAgLTU3Niw2ICs1NzMsNyBAQAogICAgICAgbVR1bm5lbGVkKGZhbHNlKSwKICAgICAgIG1EZXNjcmliZUNvbG9yQXNwZWN0c0luZGV4KChPTVhfSU5ERVhUWVBFKTApLAogICAgICAgbURlc2NyaWJlSERSU3RhdGljSW5mb0luZGV4KChPTVhfSU5ERVhUWVBFKTApLAorICAgICAgbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4KChPTVhfSU5ERVhUWVBFKTApLAogICAgICAgbVN0YXRlR2VuZXJhdGlvbigwKSwKICAgICAgIG1WZW5kb3JFeHRlbnNpb25zU3RhdHVzKGtFeHRlbnNpb25zVW5jaGVja2VkKSB7CiAgICAgbWVtc2V0KCZtTGFzdEhEUlN0YXRpY0luZm8sIDAsIHNpemVvZihtTGFzdEhEUlN0YXRpY0luZm8pKTsKQEAgLTE3NDksMjkgKzE3NDcsMzIgQEAKICAgICB9CiAKICAgICBpbnQzMl90IHN0b3JlTWV0YTsKLSAgICBpZiAoZW5jb2RlcgotICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoImFuZHJvaWQuX2lucHV0LW1ldGFkYXRhLWJ1ZmZlci10eXBlIiwgJnN0b3JlTWV0YSkKLSAgICAgICAgICAgICYmIHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZCkgewotICAgICAgICBJT01YOjpQb3J0TW9kZSBtb2RlOwotICAgICAgICBpZiAoc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVOYXRpdmVIYW5kbGVTb3VyY2UpIHsKLSAgICAgICAgICAgIG1vZGUgPSBJT01YOjprUG9ydE1vZGVEeW5hbWljTmF0aXZlSGFuZGxlOwotICAgICAgICB9IGVsc2UgaWYgKHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyIHx8Ci0gICAgICAgICAgICAgICAgc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKSB7Ci0gICAgICAgICAgICBtb2RlID0gSU9NWDo6a1BvcnRNb2RlRHluYW1pY0FOV0J1ZmZlcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgaWYgKGVuY29kZXIpIHsKKyAgICAgICAgSU9NWDo6UG9ydE1vZGUgbW9kZSA9IElPTVg6OmtQb3J0TW9kZVByZXNldEJ5dGVCdWZmZXI7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5faW5wdXQtbWV0YWRhdGEtYnVmZmVyLXR5cGUiLCAmc3RvcmVNZXRhKQorICAgICAgICAgICAgICAgICYmIHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZCkgeworICAgICAgICAgICAgaWYgKHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlKSB7CisgICAgICAgICAgICAgICAgbW9kZSA9IElPTVg6OmtQb3J0TW9kZUR5bmFtaWNOYXRpdmVIYW5kbGU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyIHx8CisgICAgICAgICAgICAgICAgICAgIHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgeworICAgICAgICAgICAgICAgIG1vZGUgPSBJT01YOjprUG9ydE1vZGVEeW5hbWljQU5XQnVmZmVyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVyciA9IHNldFBvcnRNb2RlKGtQb3J0SW5kZXhJbnB1dCwgbW9kZSk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIAotICAgICAgICB1aW50MzJfdCB1c2FnZUJpdHM7Ci0gICAgICAgIGlmIChtT01YTm9kZS0+Z2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHMsCi0gICAgICAgICAgICAgICAgJnVzYWdlQml0cywgc2l6ZW9mKHVzYWdlQml0cykpID09IE9LKSB7Ci0gICAgICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoCi0gICAgICAgICAgICAgICAgICAgICJ1c2luZy1zdy1yZWFkLW9mdGVuIiwgISEodXNhZ2VCaXRzICYgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOKSk7CisgICAgICAgIGlmIChtb2RlICE9IElPTVg6OmtQb3J0TW9kZVByZXNldEJ5dGVCdWZmZXIpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVzYWdlQml0czsKKyAgICAgICAgICAgIGlmIChtT01YTm9kZS0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUNvbnN1bWVyVXNhZ2VCaXRzLAorICAgICAgICAgICAgICAgICAgICAmdXNhZ2VCaXRzLCBzaXplb2YodXNhZ2VCaXRzKSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmctc3ctcmVhZC1vZnRlbiIsICEhKHVzYWdlQml0cyAmIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTikpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xODE3LDIwICsxODE4LDE5IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KAotICAgICAgICAgICAgICAgICAgICAicmVwZWF0LXByZXZpb3VzLWZyYW1lLWFmdGVyIiwKLSAgICAgICAgICAgICAgICAgICAgJm1SZXBlYXRGcmFtZURlbGF5VXMpKSB7CisgICAgICAgICAgICAgICAgS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUiwgJm1SZXBlYXRGcmFtZURlbGF5VXMpKSB7CiAgICAgICAgICAgICBtUmVwZWF0RnJhbWVEZWxheVVzID0gLTFMTDsKICAgICAgICAgfQogCiAgICAgICAgIC8vIG9ubHkgYWxsb3cgMzItYml0IHZhbHVlLCBzaW5jZSB3ZSBwYXNzIGl0IGFzIFUzMiB0byBPTVguCi0gICAgICAgIGlmICghbXNnLT5maW5kSW50NjQoIm1heC1wdHMtZ2FwLXRvLWVuY29kZXIiLCAmbU1heFB0c0dhcFVzKSkgeworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KEtFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSLCAmbU1heFB0c0dhcFVzKSkgewogICAgICAgICAgICAgbU1heFB0c0dhcFVzID0gMExMOwogICAgICAgICB9IGVsc2UgaWYgKG1NYXhQdHNHYXBVcyA+IElOVDMyX01BWCB8fCBtTWF4UHRzR2FwVXMgPCBJTlQzMl9NSU4pIHsKICAgICAgICAgICAgIEFMT0dXKCJVbnN1cHBvcnRlZCB2YWx1ZSBmb3IgbWF4IHB0cyBnYXAgJWxsZCIsIChsb25nIGxvbmcpIG1NYXhQdHNHYXBVcyk7CiAgICAgICAgICAgICBtTWF4UHRzR2FwVXMgPSAwTEw7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIW1zZy0+ZmluZEZsb2F0KCJtYXgtZnBzLXRvLWVuY29kZXIiLCAmbU1heEZwcykpIHsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRGbG9hdChLRVlfTUFYX0ZQU19UT19FTkNPREVSLCAmbU1heEZwcykpIHsKICAgICAgICAgICAgIG1NYXhGcHMgPSAtMTsKICAgICAgICAgfQogCkBAIC0xODQ0LDggKzE4NDQsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgImNyZWF0ZS1pbnB1dC1idWZmZXJzLXN1c3BlbmRlZCIsCi0gICAgICAgICAgICAgICAgICAgIChpbnQzMl90KikmbUNyZWF0ZUlucHV0QnVmZmVyc1N1c3BlbmRlZCkpIHsKKyAgICAgICAgICAgICAgICBLRVlfQ1JFQVRFX0lOUFVUX1NVUkZBQ0VfU1VTUEVOREVELAorICAgICAgICAgICAgICAgIChpbnQzMl90KikmbUNyZWF0ZUlucHV0QnVmZmVyc1N1c3BlbmRlZCkpIHsKICAgICAgICAgICAgIG1DcmVhdGVJbnB1dEJ1ZmZlcnNTdXNwZW5kZWQgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0KQEAgLTIwODksNyArMjA4OSw4IEBACiAgICAgICAgIGlmICh1c2luZ1N3UmVuZGVyZXIpIHsKICAgICAgICAgICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoInVzaW5nLXN3LXJlbmRlcmVyIiwgMSk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpKSB7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKSB8fAorICAgICAgICAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJKSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlOwogICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKQogICAgICAgICAgICAgICAgIHx8ICFtc2ctPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpIHsKQEAgLTIxODAsNyArMjE4MSw4IEBACiAgICAgICAgICAgICBlcnIgPSBzZXR1cEc3MTFDb2RlYyhlbmNvZGVyLCBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpKSB7Ci0gICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSAwLCBzYW1wbGVSYXRlID0gMCwgY29tcHJlc3Npb25MZXZlbCA9IC0xOworICAgICAgICAvLyBudW1DaGFubmVscyBuZWVkcyB0byBiZSBzZXQgdG8gcHJvcGVybHkgY29tbXVuaWNhdGUgUENNIHZhbHVlcy4KKyAgICAgICAgaW50MzJfdCBudW1DaGFubmVscyA9IDIsIHNhbXBsZVJhdGUgPSA0NDEwMCwgY29tcHJlc3Npb25MZXZlbCA9IC0xOwogICAgICAgICBpZiAoZW5jb2RlciAmJgogICAgICAgICAgICAgICAgICghbXNnLT5maW5kSW50MzIoImNoYW5uZWwtY291bnQiLCAmbnVtQ2hhbm5lbHMpCiAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhbXNnLT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKSkgewpAQCAtMjIwNiw3ICsyMjA4LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlcnIgPSBzZXR1cEZsYWNDb2RlYygKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlciwgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGUsIGNvbXByZXNzaW9uTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLCBudW1DaGFubmVscywgc2FtcGxlUmF0ZSwgY29tcHJlc3Npb25MZXZlbCwgcGNtRW5jb2RpbmcpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKSB7CiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGU7CkBAIC0yMjM1LDYgKzIyMzcsMTUgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGVyciA9IHNldHVwRUFDM0NvZGVjKGVuY29kZXIsIG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlKTsKICAgICAgICAgfQorICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCkpIHsKKyAgICAgICAgaW50MzJfdCBudW1DaGFubmVsczsKKyAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKQorICAgICAgICAgICAgICAgIHx8ICFtc2ctPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgIGVyciA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyID0gc2V0dXBBQzRDb2RlYyhlbmNvZGVyLCBudW1DaGFubmVscywgc2FtcGxlUmF0ZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0yMzA4LDEyICsyMzE5LDE2IEBACiAgICAgICAgICAgICAodm9pZCltSW5wdXRGb3JtYXQtPmZpbmRJbnQzMigicGNtLWVuY29kaW5nIiwgKGludDMyX3QqKSZjb2RlY1BjbUVuY29kaW5nKTsKICAgICAgICAgICAgIG1Db252ZXJ0ZXJba1BvcnRJbmRleElucHV0XSA9IEF1ZGlvQ29udmVydGVyOjpDcmVhdGUocGNtRW5jb2RpbmcsIGNvZGVjUGNtRW5jb2RpbmcpOwogICAgICAgICAgICAgaWYgKG1Db252ZXJ0ZXJba1BvcnRJbmRleElucHV0XSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIiVzOiBlbmNvZGVyICVzIGlucHV0IGZvcm1hdCBwY20gZW5jb2RpbmcgY29udmVydGVyIGZyb20gJWQgdG8gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHBjbUVuY29kaW5nLCBjb2RlY1BjbUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICBtSW5wdXRGb3JtYXQtPnNldEludDMyKCJwY20tZW5jb2RpbmciLCBwY21FbmNvZGluZyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAodm9pZCltT3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoInBjbS1lbmNvZGluZyIsIChpbnQzMl90KikmY29kZWNQY21FbmNvZGluZyk7CiAgICAgICAgICAgICBtQ29udmVydGVyW2tQb3J0SW5kZXhPdXRwdXRdID0gQXVkaW9Db252ZXJ0ZXI6OkNyZWF0ZShjb2RlY1BjbUVuY29kaW5nLCBwY21FbmNvZGluZyk7CiAgICAgICAgICAgICBpZiAobUNvbnZlcnRlcltrUG9ydEluZGV4T3V0cHV0XSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIiVzOiBkZWNvZGVyICVzIG91dHB1dCBmb3JtYXQgcGNtIGVuY29kaW5nIGNvbnZlcnRlciBmcm9tICVkIHRvICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBjb2RlY1BjbUVuY29kaW5nLCBwY21FbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoInBjbS1lbmNvZGluZyIsIHBjbUVuY29kaW5nKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjM0Niw2ICsyMzYxLDE3IEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAorc3RhdHVzX3QgQUNvZGVjOjpzZXRBdWRpb1ByZXNlbnRhdGlvbihpbnQzMl90IHByZXNlbnRhdGlvbklkLCBpbnQzMl90IHByb2dyYW1JZCkgeworICAgIE9NWF9BVURJT19DT05GSUdfQU5EUk9JRF9BVURJT1BSRVNFTlRBVElPTiBjb25maWc7CisgICAgSW5pdE9NWFBhcmFtcygmY29uZmlnKTsKKyAgICBjb25maWcublByZXNlbnRhdGlvbklkID0gKE9NWF9TMzIpcHJlc2VudGF0aW9uSWQ7CisgICAgY29uZmlnLm5Qcm9ncmFtSWQgPSAoT01YX1MzMilwcm9ncmFtSWQ7CisgICAgc3RhdHVzX3QgZXJyID0gbU9NWE5vZGUtPnNldENvbmZpZygKKyAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleENvbmZpZ0F1ZGlvUHJlc2VudGF0aW9uLAorICAgICAgICAgICAgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZykpOworICAgIHJldHVybiBlcnI7Cit9CisKIHN0YXR1c190IEFDb2RlYzo6c2V0UHJpb3JpdHkoaW50MzJfdCBwcmlvcml0eSkgewogICAgIGlmIChwcmlvcml0eSA8IDApIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTI4OTEsNiArMjkxNywzOCBAQAogICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRFYWMzLCAmZGVmLCBzaXplb2YoZGVmKSk7CiB9CiAKK3N0YXR1c190IEFDb2RlYzo6c2V0dXBBQzRDb2RlYygKKyAgICAgICAgYm9vbCBlbmNvZGVyLCBpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cFJhd0F1ZGlvRm9ybWF0KAorICAgICAgICAgICAgZW5jb2RlciA/IGtQb3J0SW5kZXhJbnB1dCA6IGtQb3J0SW5kZXhPdXRwdXQsIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoZW5jb2RlcikgeworICAgICAgICBBTE9HVygiQUM0IGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQzRUWVBFIGRlZjsKKyAgICBJbml0T01YUGFyYW1zKCZkZWYpOworICAgIGRlZi5uUG9ydEluZGV4ID0ga1BvcnRJbmRleElucHV0OworCisgICAgZXJyID0gbU9NWE5vZGUtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWM0LCAmZGVmLCBzaXplb2YoZGVmKSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZGVmLm5DaGFubmVscyA9IG51bUNoYW5uZWxzOworICAgIGRlZi5uU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisKKyAgICByZXR1cm4gbU9NWE5vZGUtPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWM0LCAmZGVmLCBzaXplb2YoZGVmKSk7Cit9CisKIHN0YXRpYyBPTVhfQVVESU9fQU1SQkFORE1PREVUWVBFIHBpY2tNb2RlRnJvbUJpdFJhdGUoCiAgICAgICAgIGJvb2wgaXNBTVJXQiwgaW50MzJfdCBicHMpIHsKICAgICBpZiAoaXNBTVJXQikgewpAQCAtMjk3NCw4ICszMDMyLDggQEAKIH0KIAogc3RhdHVzX3QgQUNvZGVjOjpzZXR1cEZsYWNDb2RlYygKLSAgICAgICAgYm9vbCBlbmNvZGVyLCBpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgY29tcHJlc3Npb25MZXZlbCkgewotCisgICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNvbXByZXNzaW9uTGV2ZWwsCisgICAgICAgIEF1ZGlvRW5jb2RpbmcgZW5jb2RpbmcpIHsKICAgICBpZiAoZW5jb2RlcikgewogICAgICAgICBPTVhfQVVESU9fUEFSQU1fRkxBQ1RZUEUgZGVmOwogICAgICAgICBJbml0T01YUGFyYW1zKCZkZWYpOwpAQCAtMjk5OCw3ICszMDU2LDggQEAKICAgICByZXR1cm4gc2V0dXBSYXdBdWRpb0Zvcm1hdCgKICAgICAgICAgICAgIGVuY29kZXIgPyBrUG9ydEluZGV4SW5wdXQgOiBrUG9ydEluZGV4T3V0cHV0LAogICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIG51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgIG51bUNoYW5uZWxzLAorICAgICAgICAgICAgZW5jb2RpbmcpOwogfQogCiBzdGF0dXNfdCBBQ29kZWM6OnNldHVwUmF3QXVkaW9Gb3JtYXQoCkBAIC0zMDU2LDYgKzMxMTUsNyBAQAogICAgIHBjbVBhcmFtcy5lUENNTW9kZSA9IE9NWF9BVURJT19QQ01Nb2RlTGluZWFyOwogCiAgICAgaWYgKGdldE9NWENoYW5uZWxNYXBwaW5nKG51bUNoYW5uZWxzLCBwY21QYXJhbXMuZUNoYW5uZWxNYXBwaW5nKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IGluY29ycmVjdCBudW1DaGFubmVsczogJWQiLCBfX2Z1bmNfXywgbnVtQ2hhbm5lbHMpOwogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICB9CiAKQEAgLTM3MTEsOCArMzc3MSwxNyBAQAogICAgICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5kZXNjcmliZUhEUlN0YXRpY0luZm8iLCAmbURlc2NyaWJlSERSU3RhdGljSW5mb0luZGV4KTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIG1EZXNjcmliZUhEUlN0YXRpY0luZm9JbmRleCA9IChPTVhfSU5ERVhUWVBFKTA7CisgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQotICAgIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBtT01YTm9kZS0+Z2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5kZXNjcmliZUhEUjEwUGx1c0luZm8iLCAmbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4KTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCA9IChPTVhfSU5ERVhUWVBFKTA7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBBQ29kZWM6OnNldEhEUlN0YXRpY0luZm8oY29uc3QgRGVzY3JpYmVIRFJTdGF0aWNJbmZvUGFyYW1zICZwYXJhbXMpIHsKQEAgLTQyMjYsMjQgKzQyOTUsMjcgQEAKICAgICBpbnQgbWF4RGltZW5zaW9uID0gbWF4KHdpZHRoLCBoZWlnaHQpOwogCiAgICAgc3RhdGljIGNvbnN0IGludCBsaW1pdHNbXVs1XSA9IHsKLSAgICAgICAgLyogICBNQnBzICAgICBNQiAgIGRpbSAgYml0cmF0ZSAgICAgICAgbGV2ZWwgKi8KLSAgICAgICAgeyAgICAxNDg1LCAgICA5OSwgIDI4LCAgICAgNjQsIE9NWF9WSURFT19BVkNMZXZlbDEgIH0sCi0gICAgICAgIHsgICAgMTQ4NSwgICAgOTksICAyOCwgICAgMTI4LCBPTVhfVklERU9fQVZDTGV2ZWwxYiB9LAotICAgICAgICB7ICAgIDMwMDAsICAgMzk2LCAgNTYsICAgIDE5MiwgT01YX1ZJREVPX0FWQ0xldmVsMTEgfSwKLSAgICAgICAgeyAgICA2MDAwLCAgIDM5NiwgIDU2LCAgICAzODQsIE9NWF9WSURFT19BVkNMZXZlbDEyIH0sCi0gICAgICAgIHsgICAxMTg4MCwgICAzOTYsICA1NiwgICAgNzY4LCBPTVhfVklERU9fQVZDTGV2ZWwxMyB9LAotICAgICAgICB7ICAgMTE4ODAsICAgMzk2LCAgNTYsICAgMjAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMiAgfSwKLSAgICAgICAgeyAgIDE5ODAwLCAgIDc5MiwgIDc5LCAgIDQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDIxIH0sCi0gICAgICAgIHsgICAyMDI1MCwgIDE2MjAsIDExMywgICA0MDAwLCBPTVhfVklERU9fQVZDTGV2ZWwyMiB9LAotICAgICAgICB7ICAgNDA1MDAsICAxNjIwLCAxMTMsICAxMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMyAgfSwKLSAgICAgICAgeyAgMTA4MDAwLCAgMzYwMCwgMTY5LCAgMTQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDMxIH0sCi0gICAgICAgIHsgIDIxNjAwMCwgIDUxMjAsIDIwMiwgIDIwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWwzMiB9LAotICAgICAgICB7ICAyNDU3NjAsICA4MTkyLCAyNTYsICAyMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNCAgfSwKLSAgICAgICAgeyAgMjQ1NzYwLCAgODE5MiwgMjU2LCAgNTAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCi0gICAgICAgIHsgIDUyMjI0MCwgIDg3MDQsIDI2MywgIDUwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw0MiB9LAotICAgICAgICB7ICA1ODk4MjQsIDIyMDgwLCA0MjAsIDEzNTAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNSAgfSwKLSAgICAgICAgeyAgOTgzMDQwLCAzNjg2NCwgNTQzLCAyNDAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDUxIH0sCi0gICAgICAgIHsgMjA3MzYwMCwgMzY4NjQsIDU0MywgMjQwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw1MiB9LAorICAgICAgICAvKiAgICBNQnBzICAgICAgTUIgICBkaW0gIGJpdHJhdGUgICAgICAgIGxldmVsICovCisgICAgICAgIHsgICAgIDE0ODUsICAgICA5OSwgICAyOCwgICAgIDY0LCBPTVhfVklERU9fQVZDTGV2ZWwxICB9LAorICAgICAgICB7ICAgICAxNDg1LCAgICAgOTksICAgMjgsICAgIDEyOCwgT01YX1ZJREVPX0FWQ0xldmVsMWIgfSwKKyAgICAgICAgeyAgICAgMzAwMCwgICAgMzk2LCAgIDU2LCAgICAxOTIsIE9NWF9WSURFT19BVkNMZXZlbDExIH0sCisgICAgICAgIHsgICAgIDYwMDAsICAgIDM5NiwgICA1NiwgICAgMzg0LCBPTVhfVklERU9fQVZDTGV2ZWwxMiB9LAorICAgICAgICB7ICAgIDExODgwLCAgICAzOTYsICAgNTYsICAgIDc2OCwgT01YX1ZJREVPX0FWQ0xldmVsMTMgfSwKKyAgICAgICAgeyAgICAxMTg4MCwgICAgMzk2LCAgIDU2LCAgIDIwMDAsIE9NWF9WSURFT19BVkNMZXZlbDIgIH0sCisgICAgICAgIHsgICAgMTk4MDAsICAgIDc5MiwgICA3OSwgICA0MDAwLCBPTVhfVklERU9fQVZDTGV2ZWwyMSB9LAorICAgICAgICB7ICAgIDIwMjUwLCAgIDE2MjAsICAxMTMsICAgNDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMjIgfSwKKyAgICAgICAgeyAgICA0MDUwMCwgICAxNjIwLCAgMTEzLCAgMTAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDMgIH0sCisgICAgICAgIHsgICAxMDgwMDAsICAgMzYwMCwgIDE2OSwgIDE0MDAwLCBPTVhfVklERU9fQVZDTGV2ZWwzMSB9LAorICAgICAgICB7ICAgMjE2MDAwLCAgIDUxMjAsICAyMDIsICAyMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMzIgfSwKKyAgICAgICAgeyAgIDI0NTc2MCwgICA4MTkyLCAgMjU2LCAgMjAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDQgIH0sCisgICAgICAgIHsgICAyNDU3NjAsICAgODE5MiwgIDI1NiwgIDUwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw0MSB9LAorICAgICAgICB7ICAgNTIyMjQwLCAgIDg3MDQsICAyNjMsICA1MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNDIgfSwKKyAgICAgICAgeyAgIDU4OTgyNCwgIDIyMDgwLCAgNDIwLCAxMzUwMDAsIE9NWF9WSURFT19BVkNMZXZlbDUgIH0sCisgICAgICAgIHsgICA5ODMwNDAsICAzNjg2NCwgIDU0MywgMjQwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw1MSB9LAorICAgICAgICB7ICAyMDczNjAwLCAgMzY4NjQsICA1NDMsIDI0MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNTIgfSwKKyAgICAgICAgeyAgNDE3NzkyMCwgMTM5MjY0LCAxMDU1LCAyNDAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDYgIH0sCisgICAgICAgIHsgIDgzNTU4NDAsIDEzOTI2NCwgMTA1NSwgNDgwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw2MSB9LAorICAgICAgICB7IDE2NzExNjgwLCAxMzkyNjQsIDEwNTUsIDgwMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNjIgfSwKICAgICB9OwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxpbWl0cyk7IGkrKykgewpAQCAtNDM1Niw3ICs0NDI4LDcgQEAKICAgICAgICAgaDI2NHR5cGUublJlZkZyYW1lcyA9IDI7CiAgICAgICAgIGgyNjR0eXBlLm5CRnJhbWVzID0gbUxhdGVuY3kgPT0gMCA/IDEgOiBzdGQ6Om1pbigxVSwgbUxhdGVuY3kgLSAxKTsKIAotICAgICAgICAvLyBkaXNhYmxlIEItZnJhbWVzIHVudGlsIE1QRUc0V3JpdGVyIGNhbiBndWFyYW50ZWUgZmluYWxpemluZyBmaWxlcyB3aXRoIEItZnJhbWVzCisgICAgICAgIC8vIGRpc2FibGUgQi1mcmFtZXMgdW50aWwgd2UgaGF2ZSBleHBsaWNpdCBzZXR0aW5ncyBmb3IgZW5hYmxpbmcgdGhlIGZlYXR1cmUuCiAgICAgICAgIGgyNjR0eXBlLm5SZWZGcmFtZXMgPSAxOwogICAgICAgICBoMjY0dHlwZS5uQkZyYW1lcyA9IDA7CiAKQEAgLTUyNDQsNiArNTMxNiwyNSBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdBbmRyb2lkQUM0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUM0VFlQRSBwYXJhbXM7CisgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OworCisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRBYzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLm5DaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgcGFyYW1zLm5TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nQW5kcm9pZE9QVVM6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSBwYXJhbXM7CkBAIC01MzI0LDYgKzU0MTUsNzAgQEAKICAgICByZXR1cm4gZ2V0VmVuZG9yUGFyYW1ldGVycyhwb3J0SW5kZXgsIG5vdGlmeSk7CiB9CiAKK0Rlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyogQUNvZGVjOjpnZXRIRFIxMFBsdXNJbmZvKHNpemVfdCBwYXJhbVNpemVVc2VkKSB7CisgICAgaWYgKG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJnZXRIRFIxMFBsdXNJbmZvOiBkb2VzIG5vdCBzdXBwb3J0IERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzaXplX3QgbmV3U2l6ZSA9IHNpemVvZihEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMpIC0gMSArCisgICAgICAgICAgICAoKHBhcmFtU2l6ZVVzZWQgPiAwKSA/IHBhcmFtU2l6ZVVzZWQgOiA1MTIpOworICAgIGlmIChtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlciA9PSBudWxscHRyCisgICAgICAgICAgICB8fCBuZXdTaXplID4gbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXItPnNpemUoKSkgeworICAgICAgICBtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlciA9IG5ldyBBQnVmZmVyKG5ld1NpemUpOworICAgIH0KKyAgICBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKmNvbmZpZyA9CisgICAgICAgICAgICAoRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zICopbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXItPmRhdGEoKTsKKyAgICBJbml0T01YUGFyYW1zKGNvbmZpZyk7CisgICAgY29uZmlnLT5uU2l6ZSA9IG1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyLT5zaXplKCk7CisgICAgY29uZmlnLT5uUG9ydEluZGV4ID0gMTsKKyAgICBzaXplX3QgcGFyYW1TaXplID0gY29uZmlnLT5uU2l6ZSAtIHNpemVvZihEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMpICsgMTsKKyAgICBjb25maWctPm5QYXJhbVNpemUgPSBwYXJhbVNpemU7CisgICAgY29uZmlnLT5uUGFyYW1TaXplVXNlZCA9IDA7CisgICAgc3RhdHVzX3QgZXJyID0gbU9NWE5vZGUtPmdldENvbmZpZygKKyAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKW1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCwKKyAgICAgICAgICAgIGNvbmZpZywgY29uZmlnLT5uU2l6ZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGdldCBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKGVyciAlZCkiLCBlcnIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+blBhcmFtU2l6ZSAhPSBwYXJhbVNpemUpIHsKKyAgICAgICAgQUxPR0UoIkRlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyBhbHRlcnMgblBhcmFtU2l6ZTogJXUgdnMgJXp1IiwKKyAgICAgICAgICAgICAgICBjb25maWctPm5QYXJhbVNpemUsIHBhcmFtU2l6ZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBpZiAocGFyYW1TaXplVXNlZCA+IDAgJiYgY29uZmlnLT5uUGFyYW1TaXplVXNlZCAhPSBwYXJhbVNpemVVc2VkKSB7CisgICAgICAgIEFMT0dFKCJEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgcmV0dXJucyB3cm9uZyBuUGFyYW1TaXplVXNlZDogJXUgdnMgJXp1IiwKKyAgICAgICAgICAgICAgICBjb25maWctPm5QYXJhbVNpemVVc2VkLCBwYXJhbVNpemVVc2VkKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBjb25maWc7Cit9CisKK3ZvaWQgQUNvZGVjOjpvbkNvbmZpZ1VwZGF0ZShPTVhfSU5ERVhUWVBFIGNvbmZpZ0luZGV4KSB7CisgICAgaWYgKG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCA9PSAwCisgICAgICAgICAgICB8fCBjb25maWdJbmRleCAhPSBtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXgpIHsKKyAgICAgICAgLy8gbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4IGlzIHRoZSBvbmx5IHVwZGF0ZSB3ZSByZWNvZ25pemUgbm93CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKmNvbmZpZyA9IGdldEhEUjEwUGx1c0luZm8oKTsKKyAgICBpZiAoY29uZmlnID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoY29uZmlnLT5uUGFyYW1TaXplVXNlZCA+IGNvbmZpZy0+blBhcmFtU2l6ZSkgeworICAgICAgICAvLyB0cnkgYWdhaW4gd2l0aCB0aGUgc2l6ZSBzcGVjaWZpZWQKKyAgICAgICAgY29uZmlnID0gZ2V0SERSMTBQbHVzSW5mbyhjb25maWctPm5QYXJhbVNpemVVc2VkKTsKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtT3V0cHV0Rm9ybWF0ID0gbU91dHB1dEZvcm1hdC0+ZHVwKCk7IC8vIHRyaWdnZXIgYW4gb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIGV2ZW50CisgICAgbU91dHB1dEZvcm1hdC0+c2V0QnVmZmVyKCJoZHIxMC1wbHVzLWluZm8iLAorICAgICAgICAgICAgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGNvbmZpZy0+blZhbHVlLCBjb25maWctPm5QYXJhbVNpemVVc2VkKSk7Cit9CisKIHZvaWQgQUNvZGVjOjpvbkRhdGFTcGFjZUNoYW5nZWQoYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjb25zdCBDb2xvckFzcGVjdHMgJmFzcGVjdHMpIHsKICAgICAvLyBhc3BlY3RzIGFyZSBub3JtYWxseSBjb21tdW5pY2F0ZWQgaW4gQ29sb3JBc3BlY3RzCiAgICAgaW50MzJfdCByYW5nZSwgc3RhbmRhcmQsIHRyYW5zZmVyOwpAQCAtNTU1OSw2ICs1NzE0LDExIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRDaGVja0lmU3R1Y2s6IHsKKyAgICAgICAgICAgIEFMT0dWKCJOby1vcCBieSBkZWZhdWx0Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtNjI1OSw2ICs2NDE5LDE1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBzcDxBQnVmZmVyPiBoZHIxMFBsdXNJbmZvOworICAgICAgICBpZiAoYnVmZmVyLT5mb3JtYXQoKS0+ZmluZEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwgJmhkcjEwUGx1c0luZm8pCisgICAgICAgICAgICAgICAgJiYgaGRyMTBQbHVzSW5mbyAhPSBudWxscHRyICYmIGhkcjEwUGx1c0luZm8tPnNpemUoKSA+IDAKKyAgICAgICAgICAgICAgICAmJiBoZHIxMFBsdXNJbmZvICE9IG1Db2RlYy0+bUxhc3RIZHIxMFBsdXNCdWZmZXIpIHsKKyAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfaGRyMTBfcGx1c19tZXRhZGF0YShtQ29kZWMtPm1OYXRpdmVXaW5kb3cuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgIGhkcjEwUGx1c0luZm8tPnNpemUoKSwgaGRyMTBQbHVzSW5mby0+ZGF0YSgpKTsKKyAgICAgICAgICAgIG1Db2RlYy0+bUxhc3RIZHIxMFBsdXNCdWZmZXIgPSBoZHIxMFBsdXNJbmZvOworICAgICAgICB9CisKICAgICAgICAgLy8gc2F2ZSBidWZmZXJzIHNlbnQgdG8gdGhlIHN1cmZhY2Ugc28gd2UgY2FuIGdldCByZW5kZXIgdGltZSB3aGVuIHRoZXkgcmV0dXJuCiAgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXMgPSAtMTsKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKTsKQEAgLTYzNjcsOCArNjUzNiwxMCBAQAogCiAgICAgaWYgKG1EZWF0aE5vdGlmaWVyICE9IE5VTEwpIHsKICAgICAgICAgaWYgKG1Db2RlYy0+bU9NWE5vZGUgIT0gTlVMTCkgewotICAgICAgICAgICAgYXV0byB0T214Tm9kZSA9IG1Db2RlYy0+bU9NWE5vZGUtPmdldEhhbEludGVyZmFjZSgpOwotICAgICAgICAgICAgdE9teE5vZGUtPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIpOworICAgICAgICAgICAgYXV0byB0T214Tm9kZSA9IG1Db2RlYy0+bU9NWE5vZGUtPmdldEhhbEludGVyZmFjZTxJT214Tm9kZT4oKTsKKyAgICAgICAgICAgIGlmICh0T214Tm9kZSkgeworICAgICAgICAgICAgICAgIHRPbXhOb2RlLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtRGVhdGhOb3RpZmllci5jbGVhcigpOwogICAgIH0KQEAgLTY0NTUsNyArNjYyNiw4IEBACiAKICAgICBDSEVDSyhtQ29kZWMtPm1PTVhOb2RlID09IE5VTEwpOwogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE9NWERpZWQsIG1Db2RlYyk7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE9NWE1lc3NhZ2VMaXN0LCBtQ29kZWMpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQ29kZWMtPm1Ob2RlR2VuZXJhdGlvbiArIDEpOwogCiAgICAgc3A8UmVmQmFzZT4gb2JqOwogICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiY29kZWNJbmZvIiwgJm9iaikpOwpAQCAtNjQ3MCw3ICs2NjQyLDcgQEAKICAgICBBU3RyaW5nIGNvbXBvbmVudE5hbWU7CiAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJjb21wb25lbnROYW1lIiwgJmNvbXBvbmVudE5hbWUpKTsKIAotICAgIHNwPENvZGVjT2JzZXJ2ZXI+IG9ic2VydmVyID0gbmV3IENvZGVjT2JzZXJ2ZXI7CisgICAgc3A8Q29kZWNPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBuZXcgQ29kZWNPYnNlcnZlcihub3RpZnkpOwogICAgIHNwPElPTVg+IG9teDsKICAgICBzcDxJT01YTm9kZT4gb214Tm9kZTsKIApAQCAtNjQ5NSwxNSArNjY2NywxMyBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcihub3RpZnkpOwotICAgIGF1dG8gdE9teE5vZGUgPSBvbXhOb2RlLT5nZXRIYWxJbnRlcmZhY2UoKTsKLSAgICBpZiAoIXRPbXhOb2RlLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgMCkpIHsKKyAgICBtRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKG5ldyBBTWVzc2FnZShrV2hhdE9NWERpZWQsIG1Db2RlYykpOworICAgIGF1dG8gdE9teE5vZGUgPSBvbXhOb2RlLT5nZXRIYWxJbnRlcmZhY2U8SU9teE5vZGU+KCk7CisgICAgaWYgKHRPbXhOb2RlICYmICF0T214Tm9kZS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIDApKSB7CiAgICAgICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7CiAgICAgfQogCi0gICAgbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0T01YTWVzc2FnZUxpc3QsIG1Db2RlYyk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsICsrbUNvZGVjLT5tTm9kZUdlbmVyYXRpb24pOwotICAgIG9ic2VydmVyLT5zZXROb3RpZmljYXRpb25NZXNzYWdlKG5vdGlmeSk7CisgICAgKyttQ29kZWMtPm1Ob2RlR2VuZXJhdGlvbjsKIAogICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lOwogICAgIG1Db2RlYy0+bVJlbmRlclRyYWNrZXIuc2V0Q29tcG9uZW50TmFtZShjb21wb25lbnROYW1lKTsKQEAgLTcyNjEsNyArNzQzMSw3IEBACiAgICAgfQogCiAgICAgaW50NjRfdCB0aW1lT2Zmc2V0VXM7Ci0gICAgaWYgKHBhcmFtcy0+ZmluZEludDY0KCJ0aW1lLW9mZnNldC11cyIsICZ0aW1lT2Zmc2V0VXMpKSB7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDY0KFBBUkFNRVRFUl9LRVlfT0ZGU0VUX1RJTUUsICZ0aW1lT2Zmc2V0VXMpKSB7CiAgICAgICAgIGlmIChtR3JhcGhpY0J1ZmZlclNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgiWyVzXSBJbnZhbGlkIHRvIHNldCBpbnB1dCBidWZmZXIgdGltZSBvZmZzZXQgd2l0aG91dCBzdXJmYWNlIiwKICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CkBAIC03Mjk3LDcgKzc0NjcsNyBAQAogICAgIH0KIAogICAgIGludDMyX3QgZHJvcElucHV0RnJhbWVzOwotICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiZHJvcC1pbnB1dC1mcmFtZXMiLCAmZHJvcElucHV0RnJhbWVzKSkgeworICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMihQQVJBTUVURVJfS0VZX1NVU1BFTkQsICZkcm9wSW5wdXRGcmFtZXMpKSB7CiAgICAgICAgIGlmIChtR3JhcGhpY0J1ZmZlclNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgiWyVzXSBJbnZhbGlkIHRvIHNldCBzdXNwZW5kIHdpdGhvdXQgc3VyZmFjZSIsCiAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOwpAQCAtNzMwNSw3ICs3NDc1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGludDY0X3Qgc3VzcGVuZFN0YXJ0VGltZVVzID0gLTE7Ci0gICAgICAgICh2b2lkKSBwYXJhbXMtPmZpbmRJbnQ2NCgiZHJvcC1zdGFydC10aW1lLXVzIiwgJnN1c3BlbmRTdGFydFRpbWVVcyk7CisgICAgICAgICh2b2lkKSBwYXJhbXMtPmZpbmRJbnQ2NChQQVJBTUVURVJfS0VZX1NVU1BFTkRfVElNRSwgJnN1c3BlbmRTdGFydFRpbWVVcyk7CiAgICAgICAgIHN0YXR1c190IGVyciA9IHN0YXR1c0Zyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICAgICAgbUdyYXBoaWNCdWZmZXJTb3VyY2UtPnNldFN1c3BlbmQoZHJvcElucHV0RnJhbWVzICE9IDAsIHN1c3BlbmRTdGFydFRpbWVVcykpOwogCkBAIC03Mzg1LDEyICs3NTU1LDU3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpbnQzMl90IHByZXNlbnRhdGlvbklkID0gLTE7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJhdWRpby1wcmVzZW50YXRpb24tcHJlc2VudGF0aW9uLWlkIiwgJnByZXNlbnRhdGlvbklkKSkgeworICAgICAgICBpbnQzMl90IHByb2dyYW1JZCA9IC0xOworICAgICAgICBwYXJhbXMtPmZpbmRJbnQzMigiYXVkaW8tcHJlc2VudGF0aW9uLXByb2dyYW0taWQiLCAmcHJvZ3JhbUlkKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0QXVkaW9QcmVzZW50YXRpb24ocHJlc2VudGF0aW9uSWQsIHByb2dyYW1JZCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIGZhaWxlZCBzZXRBdWRpb1ByZXNlbnRhdGlvbi4gRmFpbHVyZSBpcyBmaW5lIHNpbmNlIHRoaXMga2V5IGlzIG9wdGlvbmFsIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGhkcjEwUGx1c0luZm87CisgICAgaWYgKHBhcmFtcy0+ZmluZEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwgJmhkcjEwUGx1c0luZm8pCisgICAgICAgICAgICAmJiBoZHIxMFBsdXNJbmZvICE9IG51bGxwdHIgJiYgaGRyMTBQbHVzSW5mby0+c2l6ZSgpID4gMCkgeworICAgICAgICAodm9pZClzZXRIZHIxMFBsdXNJbmZvKGhkcjEwUGx1c0luZm8pOworICAgIH0KKwogICAgIC8vIElnbm9yZSBlcnJvcnMgYXMgZmFpbHVyZSBpcyBleHBlY3RlZCBmb3IgY29kZWNzIHRoYXQgYXJlbid0IHZpZGVvIGVuY29kZXJzLgogICAgICh2b2lkKWNvbmZpZ3VyZVRlbXBvcmFsTGF5ZXJzKHBhcmFtcywgZmFsc2UgLyogaW5Db25maWd1cmUgKi8sIG1PdXRwdXRGb3JtYXQpOwogCiAgICAgcmV0dXJuIHNldFZlbmRvclBhcmFtZXRlcnMocGFyYW1zKTsKIH0KIAorc3RhdHVzX3QgQUNvZGVjOjpzZXRIZHIxMFBsdXNJbmZvKGNvbnN0IHNwPEFCdWZmZXI+ICZoZHIxMFBsdXNJbmZvKSB7CisgICAgaWYgKG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJzZXRIZHIxMFBsdXNJbmZvOiBkb2VzIG5vdCBzdXBwb3J0IERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyIpOworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorICAgIHNpemVfdCBuZXdTaXplID0gc2l6ZW9mKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcykgKyBoZHIxMFBsdXNJbmZvLT5zaXplKCkgLSAxOworICAgIGlmIChtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlciA9PSBudWxscHRyIHx8CisgICAgICAgICAgICBuZXdTaXplID4gbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXItPnNpemUoKSkgeworICAgICAgICBtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlciA9IG5ldyBBQnVmZmVyKG5ld1NpemUpOworICAgIH0KKyAgICBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKmNvbmZpZyA9CisgICAgICAgICAgICAoRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zICopbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXItPmRhdGEoKTsKKyAgICBJbml0T01YUGFyYW1zKGNvbmZpZyk7CisgICAgY29uZmlnLT5uUG9ydEluZGV4ID0gMDsKKyAgICBjb25maWctPm5TaXplID0gbmV3U2l6ZTsKKyAgICBjb25maWctPm5QYXJhbVNpemUgPSBoZHIxMFBsdXNJbmZvLT5zaXplKCk7CisgICAgY29uZmlnLT5uUGFyYW1TaXplVXNlZCA9IGhkcjEwUGx1c0luZm8tPnNpemUoKTsKKyAgICBtZW1jcHkoY29uZmlnLT5uVmFsdWUsIGhkcjEwUGx1c0luZm8tPmRhdGEoKSwgaGRyMTBQbHVzSW5mby0+c2l6ZSgpKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YTm9kZS0+c2V0Q29uZmlnKAorICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4LAorICAgICAgICAgICAgY29uZmlnLCBjb25maWctPm5TaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAoZXJyICVkKSIsIGVycik7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogLy8gUmVtb3ZlcyB0cmFpbGluZyB0YWdzIG1hdGNoaW5nIHx0YWd8IGZyb20gfGtleXwgKGUuZy4gYSBzZXR0aW5ncyBuYW1lKS4gfG1pbkxlbmd0aHwgc3BlY2lmaWVzCiAvLyB0aGUgbWluaW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBrZWVwIGluIHxrZXl8IChldmVuIGlmIGl0IGhhcyB0cmFpbGluZyB0YWdzKS4KIC8vIChVc2VkIHRvIHJlbW92ZSB0cmFpbGluZyAndmFsdWUnIHRhZ3MgaW4gc2V0dGluZ3MgbmFtZXMsIGUuZy4gdG8gbm9ybWFsaXplCkBAIC03ODEyLDYgKzgwMjcsMTUgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfRXZlbnRDb25maWdVcGRhdGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0VRKGRhdGExLCAoT01YX1UzMilrUG9ydEluZGV4T3V0cHV0KTsKKworICAgICAgICAgICAgbUNvZGVjLT5vbkNvbmZpZ1VwZGF0ZSgoT01YX0lOREVYVFlQRSlkYXRhMik7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfRXZlbnRCdWZmZXJGbGFnOgogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTc4NzYsNiArODEwMCwxOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0Q2hlY2tJZlN0dWNrOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb24gPSAwOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gPT0gbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIFRJTUVEX09VVCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaGFuZGxlZCA9IEJhc2VTdGF0ZTo6b25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNzg4Nyw2ICs4MTIzLDExIEBACiB2b2lkIEFDb2RlYzo6T3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlZFN0YXRlOjpzdGF0ZUVudGVyZWQoKSB7CiAgICAgQUxPR1YoIlslc10gTm93IGhhbmRsaW5nIG91dHB1dCBwb3J0IHNldHRpbmdzIGNoYW5nZSIsCiAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOworCisgICAgLy8gSWYgd2UgaGF2ZW4ndCB0cmFuc2l0aW9uZWQgYWZ0ZXIgMyBzZWNvbmRzLCB3ZSdyZSBwcm9iYWJseSBzdHVjay4KKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKEFDb2RlYzo6a1doYXRDaGVja0lmU3R1Y2ssIG1Db2RlYyk7CisgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Db2RlYy0+bVN0YXRlR2VuZXJhdGlvbik7CisgICAgbXNnLT5wb3N0KDMwMDAwMDApOwogfQogCiBib29sIEFDb2RlYzo6T3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlZFN0YXRlOjpvbk9NWEZyYW1lUmVuZGVyZWQoCkBAIC04MTUzLDYgKzgzOTQsMTEgQEAKICAgICBBTE9HVigiWyVzXSBOb3cgRmx1c2hpbmciLCBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOwogCiAgICAgbUZsdXNoQ29tcGxldGVba1BvcnRJbmRleElucHV0XSA9IG1GbHVzaENvbXBsZXRlW2tQb3J0SW5kZXhPdXRwdXRdID0gZmFsc2U7CisKKyAgICAvLyBJZiB3ZSBoYXZlbid0IHRyYW5zaXRpb25lZCBhZnRlciAzIHNlY29uZHMsIHdlJ3JlIHByb2JhYmx5IHN0dWNrLgorICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoQUNvZGVjOjprV2hhdENoZWNrSWZTdHVjaywgbUNvZGVjKTsKKyAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKTsKKyAgICBtc2ctPnBvc3QoMzAwMDAwMCk7CiB9CiAKIGJvb2wgQUNvZGVjOjpGbHVzaGluZ1N0YXRlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewpAQCAtODE2Nyw2ICs4NDEzLDcgQEAKICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKTsKICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoMzAwMDAwMCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTgxODcsNiArODQzNCwxOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0Q2hlY2tJZlN0dWNrOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb24gPSAwOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gPT0gbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIFRJTUVEX09VVCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaGFuZGxlZCA9IEJhc2VTdGF0ZTo6b25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtODMxMyw3ICs4NTcyLDcgQEAKICAgICB9CiAKICAgICBzcDxJT01YPiBvbXggPSBjbGllbnQuaW50ZXJmYWNlKCk7Ci0gICAgc3A8Q29kZWNPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBuZXcgQ29kZWNPYnNlcnZlcjsKKyAgICBzcDxDb2RlY09ic2VydmVyPiBvYnNlcnZlciA9IG5ldyBDb2RlY09ic2VydmVyKG5ldyBBTWVzc2FnZSk7CiAgICAgc3A8SU9NWE5vZGU+IG9teE5vZGU7CiAKICAgICBlcnIgPSBvbXgtPmFsbG9jYXRlTm9kZShuYW1lLCBvYnNlcnZlciwgJm9teE5vZGUpOwpAQCAtODQyOSwxNCArODY4OCwxNyBAQAogICAgICAgICBpZiAob214Tm9kZS0+Y29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAogICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9UUlVFLCAwLCAmc2lkZWJhbmRIYW5kbGUpID09IE9LKSB7CiAgICAgICAgICAgICAvLyB0dW5uZWxlZCBwbGF5YmFjayBpbmNsdWRlcyBhZGFwdGl2ZSBwbGF5YmFjawotICAgICAgICAgICAgY2Fwcy0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2sKLSAgICAgICAgICAgICAgICAgICAgfCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjprRmxhZ1N1cHBvcnRzVHVubmVsZWRQbGF5YmFjayk7Ci0gICAgICAgIH0gZWxzZSBpZiAob214Tm9kZS0+c2V0UG9ydE1vZGUoCi0gICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgSU9NWDo6a1BvcnRNb2RlRHluYW1pY0FOV0J1ZmZlcikgPT0gT0sgfHwKLSAgICAgICAgICAgICAgICBvbXhOb2RlLT5wcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKLSAgICAgICAgICAgICAgICBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVFJVRSwKLSAgICAgICAgICAgICAgICAxMjgwIC8qIHdpZHRoICovLCA3MjAgLyogaGVpZ2h0ICovKSA9PSBPSykgewotICAgICAgICAgICAgY2Fwcy0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdHVubmVsZWQgcGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgY2Fwcy0+cmVtb3ZlRGV0YWlsKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfVFVOTkVMRURfUExBWUJBQ0spOworICAgICAgICAgICAgaWYgKG9teE5vZGUtPnNldFBvcnRNb2RlKAorICAgICAgICAgICAgICAgICAgICBrUG9ydEluZGV4T3V0cHV0LCBJT01YOjprUG9ydE1vZGVEeW5hbWljQU5XQnVmZmVyKSAhPSBPSyAmJgorICAgICAgICAgICAgICAgICAgICBvbXhOb2RlLT5wcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9UUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgMTI4MCAvKiB3aWR0aCAqLywgNzIwIC8qIGhlaWdodCAqLykgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBhZGFwdGl2ZSBwbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgY2Fwcy0+cmVtb3ZlRGV0YWlsKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfQURBUFRJVkVfUExBWUJBQ0spOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC04NDQ0LDExICs4NzA2LDIwIEBACiAgICAgICAgIE9NWF9WSURFT19DT05GSUdfQU5EUk9JRF9JTlRSQVJFRlJFU0hUWVBFIHBhcmFtczsKICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OwotICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgdmVyaWZ5IGlmIGZhbGxiYWNrIGlzIHN1cHBvcnRlZD8KKworICAgICAgICBPTVhfVklERU9fUEFSQU1fSU5UUkFSRUZSRVNIVFlQRSBmYWxsYmFja1BhcmFtczsKKyAgICAgICAgSW5pdE9NWFBhcmFtcygmZmFsbGJhY2tQYXJhbXMpOworICAgICAgICBmYWxsYmFja1BhcmFtcy5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgZmFsbGJhY2tQYXJhbXMuZVJlZnJlc2hNb2RlID0gT01YX1ZJREVPX0ludHJhUmVmcmVzaEN5Y2xpYzsKKwogICAgICAgICBpZiAob214Tm9kZS0+Z2V0Q29uZmlnKAogICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleENvbmZpZ0FuZHJvaWRJbnRyYVJlZnJlc2gsCi0gICAgICAgICAgICAgICAgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpID09IE9LKSB7Ci0gICAgICAgICAgICBjYXBzLT5hZGRGbGFncyhNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjprRmxhZ1N1cHBvcnRzSW50cmFSZWZyZXNoKTsKKyAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSkgIT0gT0sgJiYKKyAgICAgICAgICAgICAgICBvbXhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9JbmRleFBhcmFtVmlkZW9JbnRyYVJlZnJlc2gsICZmYWxsYmFja1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZhbGxiYWNrUGFyYW1zKSkgIT0gT0spIHsKKyAgICAgICAgICAgIC8vIGludHJhIHJlZnJlc2ggaXMgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgY2Fwcy0+cmVtb3ZlRGV0YWlsKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfSU5UUkFfUkVGUkVTSCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKaW5kZXggNzEwYWU2OC4uMjY2YTI0MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKQEAgLTEyOSw2ICsxMjksNyBAQAogICAgICAgICBzZWN1cmVIYW5kbGUgPSBzdGF0aWNfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oc2VjdXJlRGF0YS0+Z2V0RGVzdGluYXRpb25Qb2ludGVyKCkpOwogICAgIH0KICAgICBzc2l6ZV90IHJlc3VsdCA9IC0xOworICAgIHNzaXplX3QgY29kZWNEYXRhT2Zmc2V0ID0gMDsKICAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7CiAgICAgICAgIElDcnlwdG86OkRlc3RpbmF0aW9uQnVmZmVyIGRlc3RpbmF0aW9uOwogICAgICAgICBpZiAoc2VjdXJlKSB7CkBAIC0xODAsOSArMTgxLDE2IEBACiAKICAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CiAgICAgICAgIGhpZGxfc3RyaW5nIGRldGFpbGVkRXJyb3I7CisgICAgICAgIFNjcmFtYmxpbmdDb250cm9sIHNjdHJsID0gU2NyYW1ibGluZ0NvbnRyb2w6OlVOU0NSQU1CTEVEOworCisgICAgICAgIGlmIChrZXkgIT0gTlVMTCkgeworICAgICAgICAgICAgc2N0cmwgPSAoU2NyYW1ibGluZ0NvbnRyb2wpa2V5WzBdOworICAgICAgICAgICAgLy8gQWRqdXN0IGZvciB0aGUgUEVTIG9mZnNldAorICAgICAgICAgICAgY29kZWNEYXRhT2Zmc2V0ID0ga2V5WzJdIHwgKGtleVszXSA8PCA4KTsKKyAgICAgICAgfQogCiAgICAgICAgIGF1dG8gcmV0dXJuVm9pZCA9IG1EZXNjcmFtYmxlci0+ZGVzY3JhbWJsZSgKLSAgICAgICAgICAgICAgICBrZXkgIT0gTlVMTCA/IChTY3JhbWJsaW5nQ29udHJvbClrZXlbMF0gOiBTY3JhbWJsaW5nQ29udHJvbDo6VU5TQ1JBTUJMRUQsCisgICAgICAgICAgICAgICAgc2N0cmwsCiAgICAgICAgICAgICAgICAgaGlkbFN1YlNhbXBsZXMsCiAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAogICAgICAgICAgICAgICAgIDAsCkBAIC0yMDIsNiArMjEwLDExIEBACiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIGlmIChyZXN1bHQgPCBjb2RlY0RhdGFPZmZzZXQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJpbnZhbGlkIGNvZGVjIGRhdGEgb2Zmc2V0OiAlemQsIHJlc3VsdCAlemQiLCBjb2RlY0RhdGFPZmZzZXQsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKICAgICAgICAgQUxPR1YoImRlc2NyYW1ibGUgc3VjY2VlZGVkLCAlemQgYnl0ZXMiLCByZXN1bHQpOwogCiAgICAgICAgIGlmIChkc3RCdWZmZXIudHlwZSA9PSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZKSB7CkBAIC0yMTAsNyArMjIzLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGl0LT5tQ29kZWNCdWZmZXItPnNldFJhbmdlKDAsIHJlc3VsdCk7CisgICAgaXQtPm1Db2RlY0J1ZmZlci0+c2V0UmFuZ2UoY29kZWNEYXRhT2Zmc2V0LCByZXN1bHQgLSBjb2RlY0RhdGFPZmZzZXQpOwogCiAgICAgLy8gQ29weSBtZXRhZGF0YSBmcm9tIGNsaWVudCB0byBjb2RlYyBidWZmZXIuCiAgICAgaXQtPm1Db2RlY0J1ZmZlci0+bWV0YSgpLT5jbGVhcigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODliOGIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBU3RhdGU6OkFTdGF0ZShjb25zdCBzcDxBU3RhdGU+ICZwYXJlbnRTdGF0ZSkKKyAgICA6IG1QYXJlbnRTdGF0ZShwYXJlbnRTdGF0ZSkgeworfQorCitBU3RhdGU6On5BU3RhdGUoKSB7Cit9CisKK3NwPEFTdGF0ZT4gQVN0YXRlOjpwYXJlbnRTdGF0ZSgpIHsKKyAgICByZXR1cm4gbVBhcmVudFN0YXRlOworfQorCit2b2lkIEFTdGF0ZTo6c3RhdGVFbnRlcmVkKCkgeworfQorCit2b2lkIEFTdGF0ZTo6c3RhdGVFeGl0ZWQoKSB7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKSB7Cit9CisKK0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6On5BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lKCkgeworfQorCit2b2lkIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OmhhbmRsZU1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzcDxBU3RhdGU+IHNhdmUgPSBtU3RhdGU7CisKKyAgICBzcDxBU3RhdGU+IGN1ciA9IG1TdGF0ZTsKKyAgICB3aGlsZSAoY3VyICE9IE5VTEwgJiYgIWN1ci0+b25NZXNzYWdlUmVjZWl2ZWQobXNnKSkgeworICAgICAgICAvLyBJZiB5b3UgY2xhaW0gbm90IHRvIGhhdmUgaGFuZGxlZCB0aGUgbWVzc2FnZSB5b3Ugc2hvdWxkbid0CisgICAgICAgIC8vIGhhdmUgY2FsbGVkIHNldFN0YXRlLi4uCisgICAgICAgIENIRUNLKHNhdmUgPT0gbVN0YXRlKTsKKworICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7CisgICAgfQorCisgICAgaWYgKGN1ciAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVygiV2FybmluZyBtZXNzYWdlICVzIHVuaGFuZGxlZCBpbiByb290IHN0YXRlLiIsCisgICAgICAgICBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Cit9CisKK3ZvaWQgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6Y2hhbmdlU3RhdGUoY29uc3Qgc3A8QVN0YXRlPiAmc3RhdGUpIHsKKyAgICBpZiAoc3RhdGUgPT0gbVN0YXRlKSB7CisgICAgICAgIC8vIFF1aWNrIGV4aXQgZm9yIHRoZSBlYXN5IGNhc2UuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWZWN0b3I8c3A8QVN0YXRlPiA+IEE7CisgICAgc3A8QVN0YXRlPiBjdXIgPSBtU3RhdGU7CisgICAgZm9yICg7OykgeworICAgICAgICBBLnB1c2goY3VyKTsKKyAgICAgICAgaWYgKGN1ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7CisgICAgfQorCisgICAgVmVjdG9yPHNwPEFTdGF0ZT4gPiBCOworICAgIGN1ciA9IHN0YXRlOworICAgIGZvciAoOzspIHsKKyAgICAgICAgQi5wdXNoKGN1cik7CisgICAgICAgIGlmIChjdXIgPT0gTlVMTCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY3VyID0gY3VyLT5wYXJlbnRTdGF0ZSgpOworICAgIH0KKworICAgIC8vIFJlbW92ZSB0aGUgY29tbW9uIHRhaWwuCisgICAgd2hpbGUgKEEuc2l6ZSgpID4gMCAmJiBCLnNpemUoKSA+IDAgJiYgQS50b3AoKSA9PSBCLnRvcCgpKSB7CisgICAgICAgIEEucG9wKCk7CisgICAgICAgIEIucG9wKCk7CisgICAgfQorCisgICAgbVN0YXRlID0gc3RhdGU7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEEuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQS5lZGl0SXRlbUF0KGkpLT5zdGF0ZUV4aXRlZCgpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSBCLnNpemUoKTsgaSA+IDA7KSB7CisgICAgICAgIGktLTsKKyAgICAgICAgQi5lZGl0SXRlbUF0KGkpLT5zdGF0ZUVudGVyZWQoKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcAppbmRleCA0MTEwNmExLi4yNGY2ZjBiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAKQEAgLTE0OSwxMSArMTQ5LDExIEBACiAgICAgbURvbmUgPSB0cnVlOwogCiAgICAgdm9pZCAqZHVtbXk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVNvdXJjZS0+c3RvcCgpOwogICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmZHVtbXkpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihkdW1teSkpOwogICAgIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVNvdXJjZS0+c3RvcCgpOwogICAgICAgICBpZiAoZXJyID09IE9LICYmCiAgICAgICAgICAgICAoc3RhdHVzICE9IE9LICYmIHN0YXR1cyAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSkgewogICAgICAgICAgICAgZXJyID0gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKaW5kZXggYmM3NTY5Zi4uZDhiODI1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCkBAIC0zOSw3ICszOSw3IEBACiAgICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAogCi0gICAgc2hhcmVkX2xpYnM6IFsibGlibWVkaWEiXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSIsICJsaWJtZWRpYW5kayJdLAogfQogCiBjY19saWJyYXJ5X3NoYXJlZCB7CkBAIC03NywxNiArNzcsNTEgQEAKICAgICB9LAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wZWcyZXh0cmFjdG9yIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlV0aWxzLmNwcCIsCisgICAgICAgICJNZWRpYVNvdXJjZS5jcHAiLAorICAgICAgICAiSGV2Y1V0aWxzLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQorCitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHQiLAogCiAgICAgc3JjczogWworICAgICAgICAiQUFDV3JpdGVyLmNwcCIsCiAgICAgICAgICJBQ29kZWMuY3BwIiwKICAgICAgICAgIkFDb2RlY0J1ZmZlckNoYW5uZWwuY3BwIiwKLSAgICAgICAgIkFBQ1dyaXRlci5jcHAiLAorICAgICAgICAiQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAiLAogICAgICAgICAiQU1SV3JpdGVyLmNwcCIsCiAgICAgICAgICJBdWRpb1BsYXllci5jcHAiLAotICAgICAgICAiQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcCIsCiAgICAgICAgICJBdWRpb1NvdXJjZS5jcHAiLAogICAgICAgICAiQnVmZmVySW1wbC5jcHAiLAogICAgICAgICAiQ2FsbGJhY2tEYXRhU291cmNlLmNwcCIsCkBAIC05NCw4ICsxMjksMTAgQEAKICAgICAgICAgIkNhbWVyYVNvdXJjZS5jcHAiLAogICAgICAgICAiQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcCIsCiAgICAgICAgICJEYXRhQ29udmVydGVyLmNwcCIsCisgICAgICAgICJEYXRhU291cmNlQmFzZS5jcHAiLAogICAgICAgICAiRGF0YVNvdXJjZUZhY3RvcnkuY3BwIiwKICAgICAgICAgIkRhdGFVUklTb3VyY2UuY3BwIiwKKyAgICAgICAgIkNsZWFyRmlsZVNvdXJjZS5jcHAiLAogICAgICAgICAiRmlsZVNvdXJjZS5jcHAiLAogICAgICAgICAiRnJhbWVEZWNvZGVyLmNwcCIsCiAgICAgICAgICJIVFRQQmFzZS5jcHAiLApAQCAtMTEwLDEyICsxNDcsMTcgQEAKICAgICAgICAgIk1lZGlhQ29kZWNMaXN0LmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAiLAogICAgICAgICAiTWVkaWFDb2RlY1NvdXJjZS5jcHAiLAorICAgICAgICAiTWVkaWFFeHRyYWN0b3IuY3BwIiwKICAgICAgICAgIk1lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAiLAorICAgICAgICAiTWVkaWFTb3VyY2UuY3BwIiwKICAgICAgICAgIk1lZGlhU3luYy5jcHAiLAorICAgICAgICAiTWVkaWFUcmFjay5jcHAiLAorICAgICAgICAiaHR0cC9DbGVhck1lZGlhSFRUUC5jcHAiLAogICAgICAgICAiaHR0cC9NZWRpYUhUVFAuY3BwIiwKICAgICAgICAgIk1lZGlhTXV4ZXIuY3BwIiwKICAgICAgICAgIk51Q2FjaGVkU291cmNlMi5jcHAiLAogICAgICAgICAiTnVNZWRpYUV4dHJhY3Rvci5jcHAiLAorICAgICAgICAiT2dnV3JpdGVyLmNwcCIsCiAgICAgICAgICJPTVhDbGllbnQuY3BwIiwKICAgICAgICAgIk9teEluZm9CdWlsZGVyLmNwcCIsCiAgICAgICAgICJSZW1vdGVNZWRpYUV4dHJhY3Rvci5jcHAiLApAQCAtMTI4LDQzICsxNzAsMzggQEAKICAgICAgICAgIlN1cmZhY2VVdGlscy5jcHAiLAogICAgICAgICAiVXRpbHMuY3BwIiwKICAgICAgICAgIlRocm90dGxlZFNvdXJjZS5jcHAiLAorICAgICAgICAiVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuY3BwIiwKICAgICAgICAgIlZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliZGwiLAogICAgICAgICAibGliZHJtZnJhbWV3b3JrIiwKICAgICAgICAgImxpYmd1aSIsCi0gICAgICAgICJsaWJpb24iLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlibWVkaWF1dGlscyIsCi0gICAgICAgICJsaWJuZXRkX2NsaWVudCIsCiAgICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfY29kZWNiYXNlIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214X3V0aWxzIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCiAgICAgICAgICJsaWJSU2NwcCIsCiAgICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGliaGlkbG1lbW9yeSIsCi0gICAgICAgICJsaWJ6aXBhcmNoaXZlIiwKICAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYWxsb2NhdG9yQDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckAyLjAiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpAQCAtMTc0LDEyICsyMTEsMTkgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3dlYm0iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKICAgICAgICAgImxpYnZweCIsCisgICAgICAgICJsaWJvZ2ciLAogICAgICAgICAibGlid2VibSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2lkMyIsCiAgICAgICAgICJsaWJGTEFDIiwKICAgICBdLAogCisgICAgaGVhZGVyX2xpYnM6WworICAgICAgICAibGlibmF0aXZlbG9hZGVyLWR1bW15LWhlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCisKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJtZWRpYSIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCkBAIC0yMTQsNTggKzI1OCwzNiBAQAogICAgIH0sCiB9CiAKLWNjX2xpYnJhcnkgeworY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9wbGF5ZXIyIiwKIAogICAgIHNyY3M6IFsKLSAgICAgICAgIkNhbGxiYWNrRGF0YVNvdXJjZS5jcHAiLAotICAgICAgICAiQ2FsbGJhY2tNZWRpYVNvdXJjZS5jcHAiLAotICAgICAgICAiRGF0YVNvdXJjZUZhY3RvcnkuY3BwIiwKKyAgICAgICAgIkNsZWFyRmlsZVNvdXJjZS5jcHAiLAogICAgICAgICAiRGF0YVVSSVNvdXJjZS5jcHAiLAotICAgICAgICAiRmlsZVNvdXJjZS5jcHAiLAorICAgICAgICAiRGF0YVNvdXJjZUJhc2UuY3BwIiwKICAgICAgICAgIkhUVFBCYXNlLmNwcCIsCiAgICAgICAgICJIZXZjVXRpbHMuY3BwIiwKLSAgICAgICAgIkludGVyZmFjZVV0aWxzLmNwcCIsCiAgICAgICAgICJNZWRpYUNsb2NrLmNwcCIsCi0gICAgICAgICJNZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwIiwKKyAgICAgICAgIk1lZGlhU291cmNlLmNwcCIsCiAgICAgICAgICJOZGtVdGlscy5jcHAiLAotICAgICAgICAiTnVDYWNoZWRTb3VyY2UyLmNwcCIsCi0gICAgICAgICJSZW1vdGVNZWRpYUV4dHJhY3Rvci5jcHAiLAotICAgICAgICAiUmVtb3RlTWVkaWFTb3VyY2UuY3BwIiwKICAgICAgICAgIlV0aWxzLmNwcCIsCi0gICAgICAgICJWaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcCIsCi0gICAgICAgICJodHRwL01lZGlhSFRUUC5jcHAiLAorICAgICAgICAiVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuY3BwIiwKKyAgICAgICAgIlZpZGVvRnJhbWVTY2hlZHVsZXIyLmNwcCIsCisgICAgICAgICJodHRwL0NsZWFyTWVkaWFIVFRQLmNwcCIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmRybWZyYW1ld29yayIsCiAgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhX3BsYXllcjJfdXRpbCIsCi0gICAgICAgICJsaWJhdWRpb2NsaWVudCIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCi0gICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAotICAgICAgICAibGlibWVkaWF1dGlscyIsCiAgICAgICAgICJsaWJuZXRkX2NsaWVudCIsCi0gICAgICAgICJsaWJ1aSIsCiAgICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ6aXBhcmNoaXZlIiwKKyAgICAgICAgImxpYmFuZHJvaWQiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCi0gICAgXSwKLQotICAgIGhlYWRlcl9saWJzOlsKLSAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKLSAgICBdLAotCi0gICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwogICAgICAgICAibGlibWVkaWFfcGxheWVyMl91dGlsIiwKKyAgICAgICAgImxpYm1lZGlhMl9qbmlfY29yZSIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcAppbmRleCBhNmYwYTBiLi4xOTliNTdiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCkBAIC0xMTgsNiArMTE4LDEzIEBACiAgICAgfQogCiAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOworCisgICAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJObyBtZXRhZGF0YSBiLzExODYyMDg3MSIpOworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjExODYyMDg3MSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgYm9vbCBzdWNjZXNzID0gZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKICAgICBDSEVDSyhzdWNjZXNzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmUxODU5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQXVkaW9QcmVzZW50YXRpb25JbmZvIgotCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9QcmVzZW50YXRpb25JbmZvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotQXVkaW9QcmVzZW50YXRpb25JbmZvOjpBdWRpb1ByZXNlbnRhdGlvbkluZm8oKSB7Ci19Ci0KLUF1ZGlvUHJlc2VudGF0aW9uSW5mbzo6fkF1ZGlvUHJlc2VudGF0aW9uSW5mbygpIHsKLSAgICBtUHJlc2VudGF0aW9ucy5jbGVhcigpOwotfQotCi12b2lkIEF1ZGlvUHJlc2VudGF0aW9uSW5mbzo6YWRkUHJlc2VudGF0aW9uKHNwPEF1ZGlvUHJlc2VudGF0aW9uPiBwcmVzZW50YXRpb24pIHsKLSAgICBtUHJlc2VudGF0aW9ucy5wdXNoKHByZXNlbnRhdGlvbik7Ci19Ci0KLXNpemVfdCBBdWRpb1ByZXNlbnRhdGlvbkluZm86OmNvdW50UHJlc2VudGF0aW9ucygpIGNvbnN0IHsKLSAgICByZXR1cm4gbVByZXNlbnRhdGlvbnMuc2l6ZSgpOwotfQotCi0vLyBSZXR1cm5zIGFuIEF1ZGlvUHJlc2VudGF0aW9uIGZvciB0aGUgZ2l2ZW4gdmFsaWQgaW5kZXgKLS8vIGluZGV4IG11c3QgYmUgPj0wIGFuZCA8IGNvdW50UHJlc2VudGF0aW9ucygpCi1jb25zdCBzcDxBdWRpb1ByZXNlbnRhdGlvbj4gQXVkaW9QcmVzZW50YXRpb25JbmZvOjpnZXRQcmVzZW50YXRpb24oc2l6ZV90IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIG1QcmVzZW50YXRpb25zW2luZGV4XTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcAppbmRleCBlZTZmZTE3Li41Zjg2YmQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCkBAIC01Miw3ICs1Miw5IEBACiBBdWRpb1NvdXJjZTo6QXVkaW9Tb3VyY2UoCiAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLCBjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSwKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgdWludDMyX3QgY2hhbm5lbENvdW50LCB1aW50MzJfdCBvdXRTYW1wbGVSYXRlLAotICAgICAgICB1aWRfdCB1aWQsIHBpZF90IHBpZCwgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkKQorICAgICAgICB1aWRfdCB1aWQsIHBpZF90IHBpZCwgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAorICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IHNlbGVjdGVkTWljRGlyZWN0aW9uLAorICAgICAgICBmbG9hdCBzZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uKQogICAgIDogbVN0YXJ0ZWQoZmFsc2UpLAogICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksCiAgICAgICBtT3V0U2FtcGxlUmF0ZShvdXRTYW1wbGVSYXRlID4gMCA/IG91dFNhbXBsZVJhdGUgOiBzYW1wbGVSYXRlKSwKQEAgLTEwMyw3ICsxMDUsOSBAQAogICAgICAgICAgICAgICAgICAgICB1aWQsCiAgICAgICAgICAgICAgICAgICAgIHBpZCwKICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKnBBdHRyaWJ1dGVzKi8sCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGV2aWNlSWQpOworICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE1pY0RpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbik7CiAgICAgICAgIG1Jbml0Q2hlY2sgPSBtUmVjb3JkLT5pbml0Q2hlY2soKTsKICAgICAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgICAgIG1SZWNvcmQuY2xlYXIoKTsKQEAgLTUwNiw0ICs1MTAsMjcgQEAKICAgICByZXR1cm4gTk9fSU5JVDsKIH0KIAorc3RhdHVzX3QgQXVkaW9Tb3VyY2U6OnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICBBTE9HVigic2V0TWljcm9waG9uZURpcmVjdGlvbiglZCkiLCBkaXJlY3Rpb24pOworICAgIGlmIChtUmVjb3JkICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1SZWNvcmQtPnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oZGlyZWN0aW9uKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3N0YXR1c190IEF1ZGlvU291cmNlOjpzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgeworICAgIEFMT0dWKCJzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oJWYpIiwgem9vbSk7CisgICAgaWYgKG1SZWNvcmQgIT0gMCkgeworICAgICAgICByZXR1cm4gbVJlY29yZC0+c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKHpvb20pOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworc3RhdHVzX3QgQXVkaW9Tb3VyY2U6OmdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIGNvbnN0IHsKKyAgICBpZiAobVJlY29yZCAhPSAwKSB7CisgICAgICAgICpwb3J0SWQgPSBtUmVjb3JkLT5nZXRQb3J0SWQoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2EyY2I3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmNwcApAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ2xlYXJGaWxlU291cmNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitDbGVhckZpbGVTb3VyY2U6OkNsZWFyRmlsZVNvdXJjZShjb25zdCBjaGFyICpmaWxlbmFtZSkKKyAgICA6IG1GZCgtMSksCisgICAgICBtT2Zmc2V0KDApLAorICAgICAgbUxlbmd0aCgtMSksCisgICAgICBtTmFtZSgiPG51bGw+IikgeworCisgICAgaWYgKGZpbGVuYW1lKSB7CisgICAgICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJGaWxlU291cmNlKCVzKSIsIGZpbGVuYW1lKTsKKyAgICB9CisgICAgQUxPR1YoIiVzIiwgZmlsZW5hbWUpOworICAgIG1GZCA9IG9wZW4oZmlsZW5hbWUsIE9fTEFSR0VGSUxFIHwgT19SRE9OTFkpOworCisgICAgaWYgKG1GZCA+PSAwKSB7CisgICAgICAgIG1MZW5ndGggPSBsc2VlazY0KG1GZCwgMCwgU0VFS19FTkQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBmaWxlICclcycuICglcykiLCBmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9Cit9CisKK0NsZWFyRmlsZVNvdXJjZTo6Q2xlYXJGaWxlU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQorICAgIDogbUZkKGZkKSwKKyAgICAgIG1PZmZzZXQob2Zmc2V0KSwKKyAgICAgIG1MZW5ndGgobGVuZ3RoKSwKKyAgICAgIG1OYW1lKCI8bnVsbD4iKSB7CisgICAgQUxPR1YoImZkPSVkICglcyksIG9mZnNldD0lbGxkLCBsZW5ndGg9JWxsZCIsCisgICAgICAgICAgICBmZCwgbmFtZUZvckZkKGZkKS5jX3N0cigpLCAobG9uZyBsb25nKSBvZmZzZXQsIChsb25nIGxvbmcpIGxlbmd0aCk7CisKKyAgICBpZiAobU9mZnNldCA8IDApIHsKKyAgICAgICAgbU9mZnNldCA9IDA7CisgICAgfQorICAgIGlmIChtTGVuZ3RoIDwgMCkgeworICAgICAgICBtTGVuZ3RoID0gMDsKKyAgICB9CisgICAgaWYgKG1MZW5ndGggPiBJTlQ2NF9NQVggLSBtT2Zmc2V0KSB7CisgICAgICAgIG1MZW5ndGggPSBJTlQ2NF9NQVggLSBtT2Zmc2V0OworICAgIH0KKyAgICBzdHJ1Y3Qgc3RhdCBzOworICAgIGlmIChmc3RhdChmZCwgJnMpID09IDApIHsKKyAgICAgICAgaWYgKG1PZmZzZXQgPiBzLnN0X3NpemUpIHsKKyAgICAgICAgICAgIG1PZmZzZXQgPSBzLnN0X3NpemU7CisgICAgICAgICAgICBtTGVuZ3RoID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAobU9mZnNldCArIG1MZW5ndGggPiBzLnN0X3NpemUpIHsKKyAgICAgICAgICAgIG1MZW5ndGggPSBzLnN0X3NpemUgLSBtT2Zmc2V0OworICAgICAgICB9CisgICAgfQorICAgIGlmIChtT2Zmc2V0ICE9IG9mZnNldCB8fCBtTGVuZ3RoICE9IGxlbmd0aCkgeworICAgICAgICBBTE9HVygib2Zmc2V0L2xlbmd0aCBhZGp1c3RlZCBmcm9tICVsbGQvJWxsZCB0byAlbGxkLyVsbGQiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG9mZnNldCwgKGxvbmcgbG9uZykgbGVuZ3RoLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG1PZmZzZXQsIChsb25nIGxvbmcpIG1MZW5ndGgpOworICAgIH0KKworICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KAorICAgICAgICAgICAgIkZpbGVTb3VyY2UoZmQoJXMpLCAlbGxkLCAlbGxkKSIsCisgICAgICAgICAgICBuYW1lRm9yRmQoZmQpLmNfc3RyKCksCisgICAgICAgICAgICAobG9uZyBsb25nKSBtT2Zmc2V0LAorICAgICAgICAgICAgKGxvbmcgbG9uZykgbUxlbmd0aCk7CisKK30KKworQ2xlYXJGaWxlU291cmNlOjp+Q2xlYXJGaWxlU291cmNlKCkgeworICAgIGlmIChtRmQgPj0gMCkgeworICAgICAgICA6OmNsb3NlKG1GZCk7CisgICAgICAgIG1GZCA9IC0xOworICAgIH0KK30KKworc3RhdHVzX3QgQ2xlYXJGaWxlU291cmNlOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1GZCA+PSAwID8gT0sgOiBOT19JTklUOworfQorCitzc2l6ZV90IENsZWFyRmlsZVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtRmQgPCAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1MZW5ndGggPj0gMCkgeworICAgICAgICBpZiAob2Zmc2V0ID49IG1MZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOyAgLy8gcmVhZCBiZXlvbmQgRU9GLgorICAgICAgICB9CisgICAgICAgIHVpbnQ2NF90IG51bUF2YWlsYWJsZSA9IG1MZW5ndGggLSBvZmZzZXQ7CisgICAgICAgIGlmICgodWludDY0X3Qpc2l6ZSA+IG51bUF2YWlsYWJsZSkgeworICAgICAgICAgICAgc2l6ZSA9IG51bUF2YWlsYWJsZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVhZEF0X2wob2Zmc2V0LCBkYXRhLCBzaXplKTsKK30KKworc3NpemVfdCBDbGVhckZpbGVTb3VyY2U6OnJlYWRBdF9sKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIG9mZjY0X3QgcmVzdWx0ID0gbHNlZWs2NChtRmQsIG9mZnNldCArIG1PZmZzZXQsIFNFRUtfU0VUKTsKKyAgICBpZiAocmVzdWx0ID09IC0xKSB7CisgICAgICAgIEFMT0dFKCJzZWVrIHRvICVsbGQgZmFpbGVkIiwgKGxvbmcgbG9uZykob2Zmc2V0ICsgbU9mZnNldCkpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gOjpyZWFkKG1GZCwgZGF0YSwgc2l6ZSk7Cit9CisKK3N0YXR1c190IENsZWFyRmlsZVNvdXJjZTo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtRmQgPCAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgICpzaXplID0gbUxlbmd0aDsKKworICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL0RhdGFTb3VyY2VCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2VCYXNlLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvRGF0YVNvdXJjZUJhc2UuY3BwCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlQmFzZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKaW5kZXggZWVmNTMxNC4uYWVlN2ZkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAKQEAgLTIyLDkwICsyMiwyOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBGaWxlU291cmNlOjpGaWxlU291cmNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotICAgIDogbUZkKC0xKSwKLSAgICAgIG1PZmZzZXQoMCksCi0gICAgICBtTGVuZ3RoKC0xKSwKLSAgICAgIG1OYW1lKCI8bnVsbD4iKSwKKyAgICA6IENsZWFyRmlsZVNvdXJjZShmaWxlbmFtZSksCiAgICAgICBtRGVjcnlwdEhhbmRsZShOVUxMKSwKICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpLAogICAgICAgbURybUJ1Zk9mZnNldCgwKSwKICAgICAgIG1Ecm1CdWZTaXplKDApLAogICAgICAgbURybUJ1ZihOVUxMKXsKLQotICAgIGlmIChmaWxlbmFtZSkgewotICAgICAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgiRmlsZVNvdXJjZSglcykiLCBmaWxlbmFtZSk7Ci0gICAgfQotICAgIEFMT0dWKCIlcyIsIGZpbGVuYW1lKTsKLSAgICBtRmQgPSBvcGVuKGZpbGVuYW1lLCBPX0xBUkdFRklMRSB8IE9fUkRPTkxZKTsKLQotICAgIGlmIChtRmQgPj0gMCkgewotICAgICAgICBtTGVuZ3RoID0gbHNlZWs2NChtRmQsIDAsIFNFRUtfRU5EKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gZmlsZSAnJXMnLiAoJXMpIiwgZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQogfQogCiBGaWxlU291cmNlOjpGaWxlU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQotICAgIDogbUZkKGZkKSwKLSAgICAgIG1PZmZzZXQob2Zmc2V0KSwKLSAgICAgIG1MZW5ndGgobGVuZ3RoKSwKLSAgICAgIG1OYW1lKCI8bnVsbD4iKSwKKyAgICA6IENsZWFyRmlsZVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpLAogICAgICAgbURlY3J5cHRIYW5kbGUoTlVMTCksCiAgICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSwKICAgICAgIG1Ecm1CdWZPZmZzZXQoMCksCiAgICAgICBtRHJtQnVmU2l6ZSgwKSwKICAgICAgIG1Ecm1CdWYoTlVMTCkgewotICAgIEFMT0dWKCJmZD0lZCAoJXMpLCBvZmZzZXQ9JWxsZCwgbGVuZ3RoPSVsbGQiLAotICAgICAgICAgICAgZmQsIG5hbWVGb3JGZChmZCkuY19zdHIoKSwgKGxvbmcgbG9uZykgb2Zmc2V0LCAobG9uZyBsb25nKSBsZW5ndGgpOwotCi0gICAgaWYgKG1PZmZzZXQgPCAwKSB7Ci0gICAgICAgIG1PZmZzZXQgPSAwOwotICAgIH0KLSAgICBpZiAobUxlbmd0aCA8IDApIHsKLSAgICAgICAgbUxlbmd0aCA9IDA7Ci0gICAgfQotICAgIGlmIChtTGVuZ3RoID4gSU5UNjRfTUFYIC0gbU9mZnNldCkgewotICAgICAgICBtTGVuZ3RoID0gSU5UNjRfTUFYIC0gbU9mZnNldDsKLSAgICB9Ci0gICAgc3RydWN0IHN0YXQgczsKLSAgICBpZiAoZnN0YXQoZmQsICZzKSA9PSAwKSB7Ci0gICAgICAgIGlmIChtT2Zmc2V0ID4gcy5zdF9zaXplKSB7Ci0gICAgICAgICAgICBtT2Zmc2V0ID0gcy5zdF9zaXplOwotICAgICAgICAgICAgbUxlbmd0aCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1PZmZzZXQgKyBtTGVuZ3RoID4gcy5zdF9zaXplKSB7Ci0gICAgICAgICAgICBtTGVuZ3RoID0gcy5zdF9zaXplIC0gbU9mZnNldDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobU9mZnNldCAhPSBvZmZzZXQgfHwgbUxlbmd0aCAhPSBsZW5ndGgpIHsKLSAgICAgICAgQUxPR1coIm9mZnNldC9sZW5ndGggYWRqdXN0ZWQgZnJvbSAlbGxkLyVsbGQgdG8gJWxsZC8lbGxkIiwKLSAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBvZmZzZXQsIChsb25nIGxvbmcpIGxlbmd0aCwKLSAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBtT2Zmc2V0LCAobG9uZyBsb25nKSBtTGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgKLSAgICAgICAgICAgICJGaWxlU291cmNlKGZkKCVzKSwgJWxsZCwgJWxsZCkiLAotICAgICAgICAgICAgbmFtZUZvckZkKGZkKS5jX3N0cigpLAotICAgICAgICAgICAgKGxvbmcgbG9uZykgbU9mZnNldCwKLSAgICAgICAgICAgIChsb25nIGxvbmcpIG1MZW5ndGgpOwotCiB9CiAKIEZpbGVTb3VyY2U6On5GaWxlU291cmNlKCkgewotICAgIGlmIChtRmQgPj0gMCkgewotICAgICAgICA6OmNsb3NlKG1GZCk7Ci0gICAgICAgIG1GZCA9IC0xOwotICAgIH0KLQogICAgIGlmIChtRHJtQnVmICE9IE5VTEwpIHsKICAgICAgICAgZGVsZXRlW10gbURybUJ1ZjsKICAgICAgICAgbURybUJ1ZiA9IE5VTEw7CkBAIC0xMjQsMTAgKzYyLDYgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IEZpbGVTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUZkID49IDAgPyBPSyA6IE5PX0lOSVQ7Ci19Ci0KIHNzaXplX3QgRmlsZVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIGlmIChtRmQgPCAwKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtMTQ3LDMwICs4MSwxMiBAQAogCiAgICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwgJiYgRGVjcnlwdEFwaVR5cGU6OkNPTlRBSU5FUl9CQVNFRAogICAgICAgICAgICAgPT0gbURlY3J5cHRIYW5kbGUtPmRlY3J5cHRBcGlUeXBlKSB7Ci0gICAgICAgIHJldHVybiByZWFkQXREUk0ob2Zmc2V0LCBkYXRhLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIHJlYWRBdERSTV9sKG9mZnNldCwgZGF0YSwgc2l6ZSk7CiAgICB9IGVsc2UgewotICAgICAgICBvZmY2NF90IHJlc3VsdCA9IGxzZWVrNjQobUZkLCBvZmZzZXQgKyBtT2Zmc2V0LCBTRUVLX1NFVCk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzZWVrIHRvICVsbGQgZmFpbGVkIiwgKGxvbmcgbG9uZykob2Zmc2V0ICsgbU9mZnNldCkpOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gOjpyZWFkKG1GZCwgZGF0YSwgc2l6ZSk7CisgICAgICAgIHJldHVybiByZWFkQXRfbChvZmZzZXQsIGRhdGEsIHNpemUpOwogICAgIH0KIH0KIAotc3RhdHVzX3QgRmlsZVNvdXJjZTo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtRmQgPCAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgICpzaXplID0gbUxlbmd0aDsKLQotICAgIHJldHVybiBPSzsKLX0KLQogc3A8RGVjcnlwdEhhbmRsZT4gRmlsZVNvdXJjZTo6RHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqbWltZSkgewogICAgIGlmIChnZXR1aWQoKSA9PSBBSURfTUVESUFfRVgpIHJldHVybiBudWxscHRyOyAvLyBubyBEUk0gaW4gbWVkaWEgZXh0cmFjdG9yCiAgICAgaWYgKG1Ecm1NYW5hZ2VyQ2xpZW50ID09IE5VTEwpIHsKQEAgLTE5NCw3ICsxMTAsNyBAQAogICAgIHJldHVybiBtRGVjcnlwdEhhbmRsZTsKIH0KIAotc3NpemVfdCBGaWxlU291cmNlOjpyZWFkQXREUk0ob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Citzc2l6ZV90IEZpbGVTb3VyY2U6OnJlYWRBdERSTV9sKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIHNpemVfdCBEUk1fQ0FDSEVfU0laRSA9IDEwMjQ7CiAgICAgaWYgKG1Ecm1CdWYgPT0gTlVMTCkgewogICAgICAgICBtRHJtQnVmID0gbmV3IHVuc2lnbmVkIGNoYXJbRFJNX0NBQ0hFX1NJWkVdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAKaW5kZXggNjIzMTQ1NC4uMThhNmJkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwCkBAIC01MDEsOSArNTAxLDE1IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOwotICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHNyY0Zvcm1hdDsKKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkgfHwKKyAgICAgICAgICAgICFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkgfHwKKyAgICAgICAgICAgICFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigic3RyaWRlIiwgJnN0cmlkZSkgfHwKKyAgICAgICAgICAgICFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJnNyY0Zvcm1hdCkpIHsKKyAgICAgICAgQUxPR0UoImZvcm1hdCBtaXNzaW5nIGRpbWVuc2lvbiBvciBjb2xvcjogJXMiLAorICAgICAgICAgICAgICAgIG91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CiAKICAgICBpbnQzMl90IGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tOwogICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kUmVjdCgiY3JvcCIsICZjcm9wX2xlZnQsICZjcm9wX3RvcCwgJmNyb3BfcmlnaHQsICZjcm9wX2JvdHRvbSkpIHsKQEAgLTUyMiwxOSArNTI4LDI3IEBACiAgICAgYWRkRnJhbWUoZnJhbWVNZW0pOwogICAgIFZpZGVvRnJhbWUqIGZyYW1lID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZSo+KGZyYW1lTWVtLT5wb2ludGVyKCkpOwogCi0gICAgaW50MzJfdCBzcmNGb3JtYXQ7Ci0gICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZzcmNGb3JtYXQpKTsKLQogICAgIENvbG9yQ29udmVydGVyIGNvbnZlcnRlcigoT01YX0NPTE9SX0ZPUk1BVFRZUEUpc3JjRm9ybWF0LCBkc3RGb3JtYXQoKSk7CiAKKyAgICB1aW50MzJfdCBzdGFuZGFyZCwgcmFuZ2UsIHRyYW5zZmVyOworICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXN0YW5kYXJkIiwgKGludDMyX3QqKSZzdGFuZGFyZCkpIHsKKyAgICAgICAgc3RhbmRhcmQgPSAwOworICAgIH0KKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1yYW5nZSIsIChpbnQzMl90KikmcmFuZ2UpKSB7CisgICAgICAgIHJhbmdlID0gMDsKKyAgICB9CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItdHJhbnNmZXIiLCAoaW50MzJfdCopJnRyYW5zZmVyKSkgeworICAgICAgICB0cmFuc2ZlciA9IDA7CisgICAgfQorICAgIGNvbnZlcnRlci5zZXRTcmNDb2xvclNwYWNlKHN0YW5kYXJkLCByYW5nZSwgdHJhbnNmZXIpOworCiAgICAgaWYgKGNvbnZlcnRlci5pc1ZhbGlkKCkpIHsKICAgICAgICAgY29udmVydGVyLmNvbnZlcnQoCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKil2aWRlb0ZyYW1lQnVmZmVyLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgY3JvcF9sZWZ0LCBjcm9wX3RvcCwgY3JvcF9yaWdodCwgY3JvcF9ib3R0b20sCiAgICAgICAgICAgICAgICAgZnJhbWUtPmdldEZsYXR0ZW5lZERhdGEoKSwKLSAgICAgICAgICAgICAgICBmcmFtZS0+bVdpZHRoLAotICAgICAgICAgICAgICAgIGZyYW1lLT5tSGVpZ2h0LAorICAgICAgICAgICAgICAgIGZyYW1lLT5tV2lkdGgsIGZyYW1lLT5tSGVpZ2h0LCBmcmFtZS0+bVJvd0J5dGVzLAogICAgICAgICAgICAgICAgIGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KQEAgLTY4MSw5ICs2OTUsMTAgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGU7CiAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSk7CiAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKTsKKyAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigic3RyaWRlIiwgJnN0cmlkZSkpOwogCiAgICAgaWYgKG1GcmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIHNwPElNZW1vcnk+IGZyYW1lTWVtID0gYWxsb2NWaWRlb0ZyYW1lKApAQCAtNjk4LDYgKzcxMywxOCBAQAogCiAgICAgQ29sb3JDb252ZXJ0ZXIgY29udmVydGVyKChPTVhfQ09MT1JfRk9STUFUVFlQRSlzcmNGb3JtYXQsIGRzdEZvcm1hdCgpKTsKIAorICAgIHVpbnQzMl90IHN0YW5kYXJkLCByYW5nZSwgdHJhbnNmZXI7CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3Itc3RhbmRhcmQiLCAoaW50MzJfdCopJnN0YW5kYXJkKSkgeworICAgICAgICBzdGFuZGFyZCA9IDA7CisgICAgfQorICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXJhbmdlIiwgKGludDMyX3QqKSZyYW5nZSkpIHsKKyAgICAgICAgcmFuZ2UgPSAwOworICAgIH0KKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci10cmFuc2ZlciIsIChpbnQzMl90KikmdHJhbnNmZXIpKSB7CisgICAgICAgIHRyYW5zZmVyID0gMDsKKyAgICB9CisgICAgY29udmVydGVyLnNldFNyY0NvbG9yU3BhY2Uoc3RhbmRhcmQsIHJhbmdlLCB0cmFuc2Zlcik7CisKICAgICBpbnQzMl90IGRzdExlZnQsIGRzdFRvcCwgZHN0UmlnaHQsIGRzdEJvdHRvbTsKICAgICBkc3RMZWZ0ID0gbVRpbGVzRGVjb2RlZCAlIG1HcmlkQ29scyAqIHdpZHRoOwogICAgIGRzdFRvcCA9IG1UaWxlc0RlY29kZWQgLyBtR3JpZENvbHMgKiBoZWlnaHQ7CkBAIC03MjcsMTEgKzc1NCwxMCBAQAogICAgIGlmIChjb252ZXJ0ZXIuaXNWYWxpZCgpKSB7CiAgICAgICAgIGNvbnZlcnRlci5jb252ZXJ0KAogICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopdmlkZW9GcmFtZUJ1ZmZlci0+ZGF0YSgpLAotICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgc3RyaWRlLAogICAgICAgICAgICAgICAgIGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tLAogICAgICAgICAgICAgICAgIG1GcmFtZS0+Z2V0RmxhdHRlbmVkRGF0YSgpLAotICAgICAgICAgICAgICAgIG1GcmFtZS0+bVdpZHRoLAotICAgICAgICAgICAgICAgIG1GcmFtZS0+bUhlaWdodCwKKyAgICAgICAgICAgICAgICBtRnJhbWUtPm1XaWR0aCwgbUZyYW1lLT5tSGVpZ2h0LCBtRnJhbWUtPm1Sb3dCeXRlcywKICAgICAgICAgICAgICAgICBkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b20pOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCmluZGV4IDBmMjQzMjkuLmQxMThlOGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKQEAgLTI2LDggKzI2LDYgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGN1dGlscy9xdGFndWlkLmg+CiAKLSNpbmNsdWRlIDxOZXRkQ2xpZW50Lmg+Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogSFRUUEJhc2U6OkhUVFBCYXNlKCkKQEAgLTExNCwzMCArMTEyLDQgQEAKICAgICBtTWF4QmFuZHdpZHRoSGlzdG9yeUl0ZW1zID0gbnVtSGlzdG9yeUl0ZW1zOwogfQogCi0vLyBzdGF0aWMKLXZvaWQgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkLCB1aWRfdCB1aWQsIHVpbnQzMl90IGtUYWcpIHsKLSAgICBpbnQgcmVzID0gcXRhZ3VpZF90YWdTb2NrZXQoc29ja2ZkLCBrVGFnLCB1aWQpOwotICAgIGlmIChyZXMgIT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRhZ2dpbmcgc29ja2V0ICVkIGZvciB1aWQgJWQgKE15IFVJRD0lZCkiLCBzb2NrZmQsIHVpZCwgZ2V0ZXVpZCgpKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCkgewotICAgIGludCByZXMgPSBxdGFndWlkX3VudGFnU29ja2V0KHNvY2tmZCk7Ci0gICAgaWYgKHJlcyAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdW50YWdnaW5nIHNvY2tldCAlZCAoTXkgVUlEPSVkKSIsIHNvY2tmZCwgZ2V0ZXVpZCgpKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkLCB1aWRfdCB1aWQpIHsKLSAgICBzZXROZXR3b3JrRm9yVXNlcih1aWQsIHNvY2tmZCk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQpIHsKLSAgICBSZWdpc3RlclNvY2tldFVzZXJNYXJrKHNvY2tmZCwgZ2V0ZXVpZCgpKTsKLX0KLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hldmNVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IZXZjVXRpbHMuY3BwCmluZGV4IGYxNTJhMzguLjQ4MmExYTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hldmNVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSGV2Y1V0aWxzLmNwcApAQCAtMzEyLDE0ICszMTIsMjMgQEAKICAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBudW1QaWNzOyArK2opIHsKICAgICAgICAgICAgICAgICBza2lwVUUoJnJlYWRlcik7IC8vIGRlbHRhX3BvY19zMHwxX21pbnVzMVtpXQogICAgICAgICAgICAgICAgIHJlYWRlci5za2lwQml0cygxKTsgLy8gdXNlZF9ieV9jdXJyX3BpY19zMHwxX2ZsYWdbaV0KKyAgICAgICAgICAgICAgICBpZiAocmVhZGVyLm92ZXJSZWFkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHJlYWRlci5vdmVyUmVhZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CiAgICAgfQogICAgIGlmIChyZWFkZXIuZ2V0Qml0c1dpdGhGYWxsYmFjaygxLCAwKSkgeyAvLyBsb25nX3Rlcm1fcmVmX3BpY3NfcHJlc2VudF9mbGFnCiAgICAgICAgIHVpbnQzMl90IG51bUxvbmdUZXJtUmVmUGljU3BzID0gcGFyc2VVRVdpdGhGYWxsYmFjaygmcmVhZGVyLCAwKTsKICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bUxvbmdUZXJtUmVmUGljU3BzOyArK2kpIHsKICAgICAgICAgICAgIHJlYWRlci5za2lwQml0cyhsb2cyTWF4UGljT3JkZXJDbnRMc2IpOyAvLyBsdF9yZWZfcGljX3BvY19sc2Jfc3BzW2ldCiAgICAgICAgICAgICByZWFkZXIuc2tpcEJpdHMoMSk7IC8vIHVzZWRfYnlfY3Vycl9waWNfbHRfc3BzX2ZsYWdbaV0KKyAgICAgICAgICAgIGlmIChyZWFkZXIub3ZlclJlYWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgcmVhZGVyLnNraXBCaXRzKDEpOyAvLyBzcHNfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZwpAQCAtNDU3LDggKzQ2Niw4IEBACiAgICAgICAgIGlmIChudW1OYWx1cyA9PSAwKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICAvLyBhcnJheV9jb21wbGV0ZW5lc3Mgc2V0IHRvIDAuCi0gICAgICAgIGhlYWRlclswXSA9IHR5cGU7CisgICAgICAgIC8vIGFycmF5X2NvbXBsZXRlbmVzcyBzZXQgdG8gMS4KKyAgICAgICAgaGVhZGVyWzBdID0gdHlwZSB8IDB4ODA7CiAgICAgICAgIGhlYWRlclsxXSA9IChudW1OYWx1cyA+PiA4KSAmIDB4ZmY7CiAgICAgICAgIGhlYWRlclsyXSA9IG51bU5hbHVzICYgMHhmZjsKICAgICAgICAgaGVhZGVyICs9IDM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKaW5kZXggZDljNGUwNS4uYTUyZGE0NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcApAQCAtODUsNyArODUsNyBAQAogc3RhdGljIGNvbnN0IGludCBrVGltZXN0YW1wRGVidWdDb3VudCA9IDEwOwogc3RhdGljIGNvbnN0IGludCBrSXRlbUlkQmFzZSA9IDEwMDAwOwogc3RhdGljIGNvbnN0IGNoYXIga0V4aWZIZWFkZXJbXSA9IHsnRScsICd4JywgJ2knLCAnZicsICdcMCcsICdcMCd9Owotc3RhdGljIGNvbnN0IGludDMyX3Qga1RpZmZIZWFkZXJPZmZzZXQgPSBodG9ubChzaXplb2Yoa0V4aWZIZWFkZXIpKTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtFeGlmQXBwMU1hcmtlcltdID0geydFJywgJ3gnLCAnaScsICdmJywgMHhmZiwgMHhlMX07CiAKIHN0YXRpYyBjb25zdCB1aW50OF90IGtNYW5kYXRvcnlIZXZjTmFsVW5pdFR5cGVzWzNdID0gewogICAgIGtIZXZjTmFsVW5pdFR5cGVWcHMsCkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICBib29sIGlzQXVkaW8oKSBjb25zdCB7IHJldHVybiBtSXNBdWRpbzsgfQogICAgIGJvb2wgaXNNUEVHNCgpIGNvbnN0IHsgcmV0dXJuIG1Jc01QRUc0OyB9CiAgICAgYm9vbCB1c2VQcmVmaXgoKSBjb25zdCB7IHJldHVybiBtSXNBdmMgfHwgbUlzSGV2YyB8fCBtSXNIZWljOyB9Ci0gICAgYm9vbCBpc0V4aWZEYXRhKGNvbnN0IE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSBjb25zdDsKKyAgICBib29sIGlzRXhpZkRhdGEoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQzMl90ICp0aWZmSGRyT2Zmc2V0KSBjb25zdDsKICAgICB2b2lkIGFkZENodW5rT2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKICAgICB2b2lkIGFkZEl0ZW1PZmZzZXRBbmRTaXplKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgYm9vbCBpc0V4aWYpOwogICAgIHZvaWQgZmx1c2hJdGVtUmVmcygpOwpAQCAtMTM3LDYgKzEzNyw4IEBACiAKIHByaXZhdGU6CiAgICAgZW51bSB7CisgICAgICAgIC8vIFRPRE86IG5lZWQgdG8gaW5jcmVhc2UgdGhpcyBjb25zaWRlcmluZyB0aGUgYnVnCisgICAgICAgIC8vIGFib3V0IGNhbWVyYSBhcHAgbm90IHNlbmRpbmcgdmlkZW8gZnJhbWVzIGNvbnRpbnVvdXNseT8KICAgICAgICAga01heEN0dHNPZmZzZXRUaW1lVXMgPSAxMDAwMDAwTEwsICAvLyAxIHNlY29uZAogICAgICAgICBrU2FtcGxlQXJyYXlTaXplID0gMTAwMCwKICAgICB9OwpAQCAtMzE3LDYgKzMxOSw3IEBACiAgICAgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMT4gKm1TdHNzVGFibGVFbnRyaWVzOwogICAgIExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+ICptU3R0c1RhYmxlRW50cmllczsKICAgICBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAyPiAqbUN0dHNUYWJsZUVudHJpZXM7CisgICAgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMz4gKm1FbHN0VGFibGVFbnRyaWVzOyAvLyAzY29sdW1uczogc2VnRHVyYXRpb24sIG1lZGlhVGltZSwgbWVkaWFSYXRlCiAKICAgICBpbnQ2NF90IG1NaW5DdHRzT2Zmc2V0VGltZVVzOwogICAgIGludDY0X3QgbU1pbkN0dHNPZmZzZXRUaWNrczsKQEAgLTM2MSw3ICszNjQsNyBAQAogCiAgICAgVmVjdG9yPHVpbnQxNl90PiBtUHJvcGVydGllczsKICAgICBJdGVtUmVmcyBtRGltZ1JlZnM7Ci0gICAgSXRlbVJlZnMgbUNkc2NSZWZzOworICAgIFZlY3Rvcjx1aW50MTZfdD4gbUV4aWZMaXN0OwogICAgIHVpbnQxNl90IG1JbWFnZUl0ZW1JZDsKICAgICBpbnQzMl90IG1Jc1ByaW1hcnk7CiAgICAgaW50MzJfdCBtV2lkdGgsIG1IZWlnaHQ7CkBAIC00MTYsNiArNDE5LDggQEAKICAgICAvLyBEdXJhdGlvbiBpcyB0aW1lIHNjYWxlIGJhc2VkCiAgICAgdm9pZCBhZGRPbmVTdHRzVGFibGVFbnRyeShzaXplX3Qgc2FtcGxlQ291bnQsIGludDMyX3QgdGltZXNjYWxlZER1cik7CiAgICAgdm9pZCBhZGRPbmVDdHRzVGFibGVFbnRyeShzaXplX3Qgc2FtcGxlQ291bnQsIGludDMyX3QgdGltZXNjYWxlZER1cik7CisgICAgdm9pZCBhZGRPbmVFbHN0VGFibGVFbnRyeSh1aW50MzJfdCBzZWdtZW50RHVyYXRpb24sIGludDMyX3QgbWVkaWFUaW1lLAorICAgICAgICBpbnQxNl90IG1lZGlhUmF0ZSwgaW50MTZfdCBtZWRpYVJhdGVGcmFjdGlvbik7CiAKICAgICBib29sIGlzVHJhY2tNYWxGb3JtZWQoKSBjb25zdDsKICAgICB2b2lkIHNlbmRUcmFja1N1bW1hcnkoYm9vbCBoYXNNdWx0aXBsZVRyYWNrcyk7CkBAIC00NDgsMTMgKzQ1MywxNCBAQAogICAgIHZvaWQgd3JpdGVWaWRlb0ZvdXJDQ0JveCgpOwogICAgIHZvaWQgd3JpdGVNZXRhZGF0YUZvdXJDQ0JveCgpOwogICAgIHZvaWQgd3JpdGVTdGJsQm94KGJvb2wgdXNlMzJCaXRPZmZzZXQpOworICAgIHZvaWQgd3JpdGVFZHRzQm94KCk7CiAKICAgICBUcmFjayhjb25zdCBUcmFjayAmKTsKICAgICBUcmFjayAmb3BlcmF0b3I9KGNvbnN0IFRyYWNrICYpOwogfTsKIAogTVBFRzRXcml0ZXI6Ok1QRUc0V3JpdGVyKGludCBmZCkgewotICAgIGluaXRJbnRlcm5hbChmZCwgdHJ1ZSAvKmlzRmlyc3RTZXNzaW9uKi8pOworICAgIGluaXRJbnRlcm5hbChkdXAoZmQpLCB0cnVlIC8qaXNGaXJzdFNlc3Npb24qLyk7CiB9CiAKIE1QRUc0V3JpdGVyOjp+TVBFRzRXcml0ZXIoKSB7CkBAIC00NzUsNyArNDgxLDcgQEAKIAogdm9pZCBNUEVHNFdyaXRlcjo6aW5pdEludGVybmFsKGludCBmZCwgYm9vbCBpc0ZpcnN0U2Vzc2lvbikgewogICAgIEFMT0dWKCJpbml0SW50ZXJuYWwiKTsKLSAgICBtRmQgPSBkdXAoZmQpOworICAgIG1GZCA9IGZkOwogICAgIG1OZXh0RmQgPSAtMTsKICAgICBtSW5pdENoZWNrID0gbUZkIDwgMD8gTk9fSU5JVDogT0s7CiAKQEAgLTQ4Myw2ICs0ODksNyBAQAogCiAgICAgbVN0YXJ0VGltZXN0YW1wVXMgPSAtMUxMOwogICAgIG1TdGFydFRpbWVPZmZzZXRNcyA9IC0xOworICAgIG1TdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMgPSAwOwogICAgIG1QYXVzZWQgPSBmYWxzZTsKICAgICBtU3RhcnRlZCA9IGZhbHNlOwogICAgIG1Xcml0ZXJUaHJlYWRTdGFydGVkID0gZmFsc2U7CkBAIC0xMDM3LDYgKzEwNDQsMTAgQEAKIHZvaWQgTVBFRzRXcml0ZXI6OnJlbGVhc2UoKSB7CiAgICAgY2xvc2UobUZkKTsKICAgICBtRmQgPSAtMTsKKyAgICBpZiAobU5leHRGZCAhPSAtMSkgeworICAgICAgICBjbG9zZShtTmV4dEZkKTsKKyAgICAgICAgbU5leHRGZCA9IC0xOworICAgIH0KICAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKICAgICBtU3RhcnRlZCA9IGZhbHNlOwogICAgIGZyZWUobUluTWVtb3J5Q2FjaGUpOwpAQCAtMTI3Miw2ICsxMjgzLDEwIEBACiAgICAgLy8gQWRqdXN0IHRoZSBnbG9iYWwgc3RhcnQgdGltZS4KICAgICBtU3RhcnRUaW1lc3RhbXBVcyArPSBtaW5DdHRzT2Zmc2V0VGltZVVzIC0ga01heEN0dHNPZmZzZXRUaW1lVXM7CiAKKyAgICAvLyBBZGQgbVN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcygtdmUgb3IgemVybykgdG8gdGhlIGR1cmF0aW9uIG9mIGZpcnN0IGVudHJ5IGluIFNUVFMuCisgICAgbVN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcyA9IG1pbkN0dHNPZmZzZXRUaW1lVXMgLSBrTWF4Q3R0c09mZnNldFRpbWVVczsKKyAgICBBTE9HVigibVN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcyA6JSIgUFJJZDMyLCBtU3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzKTsKKwogICAgIGZvciAoTGlzdDxUcmFjayAqPjo6aXRlcmF0b3IgaXQgPSBtVHJhY2tzLmJlZ2luKCk7CiAgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQpIHsKICAgICAgICAgaWYgKCEoKml0KS0+aXNIZWljKCkpIHsKQEAgLTEzNTcsMTQgKzEzNzIsMTYgQEAKIH0KIAogb2ZmNjRfdCBNUEVHNFdyaXRlcjo6YWRkU2FtcGxlX2woCi0gICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIsIGJvb2wgdXNlUHJlZml4LCBib29sIGlzRXhpZiwgc2l6ZV90ICpieXRlc1dyaXR0ZW4pIHsKKyAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciwgYm9vbCB1c2VQcmVmaXgsCisgICAgICAgIHVpbnQzMl90IHRpZmZIZHJPZmZzZXQsIHNpemVfdCAqYnl0ZXNXcml0dGVuKSB7CiAgICAgb2ZmNjRfdCBvbGRfb2Zmc2V0ID0gbU9mZnNldDsKIAogICAgIGlmICh1c2VQcmVmaXgpIHsKICAgICAgICAgYWRkTXVsdGlwbGVMZW5ndGhQcmVmaXhlZFNhbXBsZXNfbChidWZmZXIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChpc0V4aWYpIHsKLSAgICAgICAgICAgIDo6d3JpdGUobUZkLCAma1RpZmZIZWFkZXJPZmZzZXQsIDQpOyAvLyBleGlmX3RpZmZfaGVhZGVyX29mZnNldCBmaWVsZAorICAgICAgICBpZiAodGlmZkhkck9mZnNldCA+IDApIHsKKyAgICAgICAgICAgIHRpZmZIZHJPZmZzZXQgPSBodG9ubCh0aWZmSGRyT2Zmc2V0KTsKKyAgICAgICAgICAgIDo6d3JpdGUobUZkLCAmdGlmZkhkck9mZnNldCwgNCk7IC8vIGV4aWZfdGlmZl9oZWFkZXJfb2Zmc2V0IGZpZWxkCiAgICAgICAgICAgICBtT2Zmc2V0ICs9IDQ7CiAgICAgICAgIH0KIApAQCAtMTc0Nyw2ICsxNzY0LDExIEBACiAgICAgcmV0dXJuIG1TdGFydFRpbWVzdGFtcFVzOwogfQogCitpbnQzMl90IE1QRUc0V3JpdGVyOjpnZXRTdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbVN0YXJ0VGltZU9mZnNldEJGcmFtZXNVczsKK30KKwogc2l6ZV90IE1QRUc0V3JpdGVyOjpudW1UcmFja3MoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7CkBAIC0xNzc2LDYgKzE3OTgsNyBAQAogICAgICAgbVN0c3NUYWJsZUVudHJpZXMobmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDE+KDEwMDApKSwKICAgICAgIG1TdHRzVGFibGVFbnRyaWVzKG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAyPigxMDAwKSksCiAgICAgICBtQ3R0c1RhYmxlRW50cmllcyhuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMj4oMTAwMCkpLAorICAgICAgbUVsc3RUYWJsZUVudHJpZXMobmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDM+KDMpKSwgLy8gUmVzZXJ2ZSAzIHJvd3MsIGEgcm93IGhhcyAzIGl0ZW1zCiAgICAgICBtTWluQ3R0c09mZnNldFRpbWVVcygwKSwKICAgICAgIG1NaW5DdHRzT2Zmc2V0VGlja3MoMCksCiAgICAgICBtTWF4Q3R0c09mZnNldFRpY2tzKDApLApAQCAtMTc4Niw3ICsxODA5LDYgQEAKICAgICAgIG1TdGFydFRpbWVzdGFtcFVzKC0xKSwKICAgICAgIG1Sb3RhdGlvbigwKSwKICAgICAgIG1EaW1nUmVmcygiZGltZyIpLAotICAgICAgbUNkc2NSZWZzKCJjZHNjIiksCiAgICAgICBtSW1hZ2VJdGVtSWQoMCksCiAgICAgICBtSXNQcmltYXJ5KDApLAogICAgICAgbVdpZHRoKDApLApAQCAtMTg0Miw0NiArMTg2NCw0OCBAQAogCiAvLyBDbGVhciBhbGwgdGhlIGludGVybmFsIHN0YXRlcyBleGNlcHQgdGhlIENTRCBkYXRhLgogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OnJlc2V0SW50ZXJuYWwoKSB7Ci0gICAgICBtRG9uZSA9IGZhbHNlOwotICAgICAgbVBhdXNlZCA9IGZhbHNlOwotICAgICAgbVJlc3VtZWQgPSBmYWxzZTsKLSAgICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgICBtR290U3RhcnRLZXlGcmFtZSA9IGZhbHNlOwotICAgICAgbUlzTWFsZm9ybWVkID0gZmFsc2U7Ci0gICAgICBtVHJhY2tEdXJhdGlvblVzID0gMDsKLSAgICAgIG1Fc3RpbWF0ZWRUcmFja1NpemVCeXRlcyA9IDA7Ci0gICAgICBtU2FtcGxlc0hhdmVTYW1lU2l6ZSA9IDA7Ci0gICAgICBpZiAobVN0c3pUYWJsZUVudHJpZXMgIT0gTlVMTCkgewotICAgICAgICAgZGVsZXRlIG1TdHN6VGFibGVFbnRyaWVzOwotICAgICAgICAgbVN0c3pUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMT4oMTAwMCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChtU3Rjb1RhYmxlRW50cmllcyAhPSBOVUxMKSB7Ci0gICAgICAgICBkZWxldGUgbVN0Y29UYWJsZUVudHJpZXM7Ci0gICAgICAgICBtU3Rjb1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPigxMDAwKTsKLSAgICAgIH0KLSAgICAgIGlmIChtQ282NFRhYmxlRW50cmllcyAhPSBOVUxMKSB7Ci0gICAgICAgICBkZWxldGUgbUNvNjRUYWJsZUVudHJpZXM7Ci0gICAgICAgICBtQ282NFRhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPG9mZjY0X3QsIDE+KDEwMDApOwotICAgICAgfQotCi0gICAgICBpZiAobVN0c2NUYWJsZUVudHJpZXMgIT0gTlVMTCkgewotICAgICAgICAgZGVsZXRlIG1TdHNjVGFibGVFbnRyaWVzOwotICAgICAgICAgbVN0c2NUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMz4oMTAwMCk7Ci0gICAgICB9Ci0gICAgICBpZiAobVN0c3NUYWJsZUVudHJpZXMgIT0gTlVMTCkgewotICAgICAgICAgZGVsZXRlIG1TdHNzVGFibGVFbnRyaWVzOwotICAgICAgICAgbVN0c3NUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMT4oMTAwMCk7Ci0gICAgICB9Ci0gICAgICBpZiAobVN0dHNUYWJsZUVudHJpZXMgIT0gTlVMTCkgewotICAgICAgICAgZGVsZXRlIG1TdHRzVGFibGVFbnRyaWVzOwotICAgICAgICAgbVN0dHNUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMj4oMTAwMCk7Ci0gICAgICB9Ci0gICAgICBpZiAobUN0dHNUYWJsZUVudHJpZXMgIT0gTlVMTCkgewotICAgICAgICAgZGVsZXRlIG1DdHRzVGFibGVFbnRyaWVzOwotICAgICAgICAgbUN0dHNUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMj4oMTAwMCk7Ci0gICAgICB9Ci0gICAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOworICAgIG1Eb25lID0gZmFsc2U7CisgICAgbVBhdXNlZCA9IGZhbHNlOworICAgIG1SZXN1bWVkID0gZmFsc2U7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBtR290U3RhcnRLZXlGcmFtZSA9IGZhbHNlOworICAgIG1Jc01hbGZvcm1lZCA9IGZhbHNlOworICAgIG1UcmFja0R1cmF0aW9uVXMgPSAwOworICAgIG1Fc3RpbWF0ZWRUcmFja1NpemVCeXRlcyA9IDA7CisgICAgbVNhbXBsZXNIYXZlU2FtZVNpemUgPSAwOworICAgIGlmIChtU3RzelRhYmxlRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtU3RzelRhYmxlRW50cmllczsKKyAgICAgICAgbVN0c3pUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMT4oMTAwMCk7CisgICAgfQorICAgIGlmIChtU3Rjb1RhYmxlRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtU3Rjb1RhYmxlRW50cmllczsKKyAgICAgICAgbVN0Y29UYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMT4oMTAwMCk7CisgICAgfQorICAgIGlmIChtQ282NFRhYmxlRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtQ282NFRhYmxlRW50cmllczsKKyAgICAgICAgbUNvNjRUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczxvZmY2NF90LCAxPigxMDAwKTsKKyAgICB9CisgICAgaWYgKG1TdHNjVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1TdHNjVGFibGVFbnRyaWVzOworICAgICAgICBtU3RzY1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAzPigxMDAwKTsKKyAgICB9CisgICAgaWYgKG1TdHNzVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1TdHNzVGFibGVFbnRyaWVzOworICAgICAgICBtU3Rzc1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPigxMDAwKTsKKyAgICB9CisgICAgaWYgKG1TdHRzVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1TdHRzVGFibGVFbnRyaWVzOworICAgICAgICBtU3R0c1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAyPigxMDAwKTsKKyAgICB9CisgICAgaWYgKG1DdHRzVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1DdHRzVGFibGVFbnRyaWVzOworICAgICAgICBtQ3R0c1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAyPigxMDAwKTsKKyAgICB9CisgICAgaWYgKG1FbHN0VGFibGVFbnRyaWVzICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1FbHN0VGFibGVFbnRyaWVzOworICAgICAgICBtRWxzdFRhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAzPigzKTsKKyAgICB9CisgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OnVwZGF0ZVRyYWNrU2l6ZUVzdGltYXRlKCkgewpAQCAtMTkwMCw2ICsxOTI0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHNzVGFibGVFbnRyaWVzLT5jb3VudCgpICogNCArICAgLy8gc3RzcyBib3ggc2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0dHNUYWJsZUVudHJpZXMtPmNvdW50KCkgKiA4ICsgICAvLyBzdHRzIGJveCBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3R0c1RhYmxlRW50cmllcy0+Y291bnQoKSAqIDggKyAgIC8vIGN0dHMgYm94IHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FbHN0VGFibGVFbnRyaWVzLT5jb3VudCgpICogMTIgKyAgIC8vIGVsc3QgYm94IHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0Y29Cb3hTaXplQnl0ZXMgKyAgICAgICAgICAgLy8gc3RjbyBib3ggc2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RzekJveFNpemVCeXRlczsgICAgICAgICAgICAvLyBzdHN6IGJveCBzaXplCiAgICAgfQpAQCAtMTkzNiw2ICsxOTYxLDE2IEBACiAgICAgbUN0dHNUYWJsZUVudHJpZXMtPmFkZChodG9ubChkdXJhdGlvbikpOwogfQogCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6YWRkT25lRWxzdFRhYmxlRW50cnkoCisgICAgdWludDMyX3Qgc2VnbWVudER1cmF0aW9uLCBpbnQzMl90IG1lZGlhVGltZSwgaW50MTZfdCBtZWRpYVJhdGUsIGludDE2X3QgbWVkaWFSYXRlRnJhY3Rpb24pIHsKKyAgICBBTE9HVigic2VnbWVudER1cmF0aW9uOiV1LCBtZWRpYVRpbWU6JWQiLCBzZWdtZW50RHVyYXRpb24sIG1lZGlhVGltZSk7CisgICAgQUxPR1YoIm1lZGlhUmF0ZSA6JSIgUFJJZDE2ICIsIG1lZGlhUmF0ZUZyYWN0aW9uIDolIiBQUklkMTYgIiwgT3JlZCAldSIsIG1lZGlhUmF0ZSwKKyAgICAgICAgbWVkaWFSYXRlRnJhY3Rpb24sICgoKCh1aW50MzJfdCltZWRpYVJhdGUpIDw8IDE2KSB8ICgodWludDMyX3QpbWVkaWFSYXRlRnJhY3Rpb24pKSk7CisgICAgbUVsc3RUYWJsZUVudHJpZXMtPmFkZChodG9ubChzZWdtZW50RHVyYXRpb24pKTsKKyAgICBtRWxzdFRhYmxlRW50cmllcy0+YWRkKGh0b25sKG1lZGlhVGltZSkpOworICAgIG1FbHN0VGFibGVFbnRyaWVzLT5hZGQoaHRvbmwoKCgodWludDMyX3QpbWVkaWFSYXRlKSA8PCAxNikgfCAodWludDMyX3QpbWVkaWFSYXRlRnJhY3Rpb24pKTsKK30KKwogc3RhdHVzX3QgTVBFRzRXcml0ZXI6OnNldE5leHRGZChpbnQgZmQpIHsKICAgICBBTE9HVigiYWRkTmV4dEZkIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwpAQCAtMTk1MCwxNSArMTk4NSwzOCBAQAogICAgICAgICAvLyBObyBuZWVkIHRvIHNldCBhIG5ldyBGRCB5ZXQuCiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgbU5leHRGZCA9IGZkOworICAgIG1OZXh0RmQgPSBkdXAoZmQpOwogICAgIHJldHVybiBPSzsKIH0KIAotYm9vbCBNUEVHNFdyaXRlcjo6VHJhY2s6OmlzRXhpZkRhdGEoY29uc3QgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gbUlzSGVpYwotICAgICAgICAgICAgJiYgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPiBzaXplb2Yoa0V4aWZIZWFkZXIpKQotICAgICAgICAgICAgJiYgIW1lbWNtcCgodWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgICAgICAgICAga0V4aWZIZWFkZXIsIHNpemVvZihrRXhpZkhlYWRlcikpOworYm9vbCBNUEVHNFdyaXRlcjo6VHJhY2s6OmlzRXhpZkRhdGEoCisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50MzJfdCAqdGlmZkhkck9mZnNldCkgY29uc3QgeworICAgIGlmICghbUlzSGVpYykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gRXhpZiBibG9jayBzdGFydGluZyB3aXRoICdFeGlmXDBcMCcKKyAgICBzaXplX3QgbGVuZ3RoID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICB1aW50OF90ICpkYXRhID0gKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgaWYgKChsZW5ndGggPiBzaXplb2Yoa0V4aWZIZWFkZXIpKQorICAgICAgICAmJiAhbWVtY21wKGRhdGEsIGtFeGlmSGVhZGVyLCBzaXplb2Yoa0V4aWZIZWFkZXIpKSkgeworICAgICAgICAqdGlmZkhkck9mZnNldCA9IHNpemVvZihrRXhpZkhlYWRlcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIEV4aWYgYmxvY2sgc3RhcnRpbmcgd2l0aCBmb3VyY2MgJ0V4aWYnIGZvbGxvd2VkIGJ5IEFQUDEgbWFya2VyCisgICAgaWYgKChsZW5ndGggPiBzaXplb2Yoa0V4aWZBcHAxTWFya2VyKSArIDIgKyBzaXplb2Yoa0V4aWZIZWFkZXIpKQorICAgICAgICAgICAgJiYgIW1lbWNtcChkYXRhLCBrRXhpZkFwcDFNYXJrZXIsIHNpemVvZihrRXhpZkFwcDFNYXJrZXIpKQorICAgICAgICAgICAgJiYgIW1lbWNtcChkYXRhICsgc2l6ZW9mKGtFeGlmQXBwMU1hcmtlcikgKyAyLCBrRXhpZkhlYWRlciwgc2l6ZW9mKGtFeGlmSGVhZGVyKSkpIHsKKyAgICAgICAgLy8gc2tpcCAnRXhpZicgZm91cmNjCisgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDQsIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSA0KTsKKworICAgICAgICAvLyAyLWJ5dGUgQVBQMSArIDItYnl0ZSBzaXplIGZvbGxvd2VkIGJ5IGtFeGlmSGVhZGVyCisgICAgICAgICp0aWZmSGRyT2Zmc2V0ID0gMiArIDIgKyBzaXplb2Yoa0V4aWZIZWFkZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjphZGRDaHVua09mZnNldChvZmY2NF90IG9mZnNldCkgewpAQCAtMTk4NCw3ICsyMDQyLDcgQEAKICAgICB9CiAKICAgICBpZiAoaXNFeGlmKSB7Ci0gICAgICAgICBtQ2RzY1JlZnMudmFsdWUucHVzaF9iYWNrKG1Pd25lci0+YWRkSXRlbV9sKHsKKyAgICAgICAgIG1FeGlmTGlzdC5wdXNoX2JhY2sobU93bmVyLT5hZGRJdGVtX2woewogICAgICAgICAgICAgLml0ZW1UeXBlID0gIkV4aWYiLAogICAgICAgICAgICAgLmlzUHJpbWFyeSA9IGZhbHNlLAogICAgICAgICAgICAgLmlzSGlkZGVuID0gZmFsc2UsCkBAIC0yMDg3LDcgKzIxNDUsMTYgQEAKIAogICAgIGlmIChtSW1hZ2VJdGVtSWQgPiAwKSB7CiAgICAgICAgIG1Pd25lci0+YWRkUmVmc19sKG1JbWFnZUl0ZW1JZCwgbURpbWdSZWZzKTsKLSAgICAgICAgbU93bmVyLT5hZGRSZWZzX2wobUltYWdlSXRlbUlkLCBtQ2RzY1JlZnMpOworCisgICAgICAgIGlmICghbUV4aWZMaXN0LmVtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIFRoZSAiY2RzYyIgcmVmIGlzIGZyb20gdGhlIG1ldGFkYXRhL2V4aWYgaXRlbSB0byB0aGUgaW1hZ2UgaXRlbS4KKyAgICAgICAgICAgIC8vIFNvIHRoZSByZWZzIGFsbCBjb250YWluIHRoZSBpbWFnZSBpdGVtLgorICAgICAgICAgICAgSXRlbVJlZnMgY2RzY1JlZnMoImNkc2MiKTsKKyAgICAgICAgICAgIGNkc2NSZWZzLnZhbHVlLnB1c2hfYmFjayhtSW1hZ2VJdGVtSWQpOworICAgICAgICAgICAgZm9yICh1aW50MTZfdCBleGlmSXRlbSA6IG1FeGlmTGlzdCkgeworICAgICAgICAgICAgICAgIG1Pd25lci0+YWRkUmVmc19sKGV4aWZJdGVtLCBjZHNjUmVmcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTIxMTcsMTEgKzIxODQsMTEgQEAKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgIGNhc2Uga1doYXRTd2l0Y2g6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGZpbmlzaEN1cnJlbnRTZXNzaW9uKCk7CiAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICBpbnQgZmQgPSBtTmV4dEZkOwogICAgICAgICAgICAgbU5leHRGZCA9IC0xOwogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBmaW5pc2hDdXJyZW50U2Vzc2lvbigpOwogICAgICAgICAgICAgaW5pdEludGVybmFsKGZkLCBmYWxzZSAvKmlzRmlyc3RTZXNzaW9uKi8pOwogICAgICAgICAgICAgc3RhcnQobVN0YXJ0TWV0YS5nZXQoKSk7CiAgICAgICAgICAgICBtU3dpdGNoUGVuZGluZyA9IGZhbHNlOwpAQCAtMjE3Myw2ICsyMjQwLDcgQEAKICAgICBkZWxldGUgbVN0dHNUYWJsZUVudHJpZXM7CiAgICAgZGVsZXRlIG1TdHNzVGFibGVFbnRyaWVzOwogICAgIGRlbGV0ZSBtQ3R0c1RhYmxlRW50cmllczsKKyAgICBkZWxldGUgbUVsc3RUYWJsZUVudHJpZXM7CiAKICAgICBtU3RzelRhYmxlRW50cmllcyA9IE5VTEw7CiAgICAgbVN0Y29UYWJsZUVudHJpZXMgPSBOVUxMOwpAQCAtMjE4MSw2ICsyMjQ5LDcgQEAKICAgICBtU3R0c1RhYmxlRW50cmllcyA9IE5VTEw7CiAgICAgbVN0c3NUYWJsZUVudHJpZXMgPSBOVUxMOwogICAgIG1DdHRzVGFibGVFbnRyaWVzID0gTlVMTDsKKyAgICBtRWxzdFRhYmxlRW50cmllcyA9IE5VTEw7CiAKICAgICBpZiAobUNvZGVjU3BlY2lmaWNEYXRhICE9IE5VTEwpIHsKICAgICAgICAgZnJlZShtQ29kZWNTcGVjaWZpY0RhdGEpOwpAQCAtMjIzNywxNCArMjMwNiwxNiBAQAogICAgIHdoaWxlICghY2h1bmstPm1TYW1wbGVzLmVtcHR5KCkpIHsKICAgICAgICAgTGlzdDxNZWRpYUJ1ZmZlciAqPjo6aXRlcmF0b3IgaXQgPSBjaHVuay0+bVNhbXBsZXMuYmVnaW4oKTsKIAotICAgICAgICBpbnQzMl90IGlzRXhpZjsKLSAgICAgICAgaWYgKCEoKml0KS0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlJc0V4aWYsICZpc0V4aWYpKSB7Ci0gICAgICAgICAgICBpc0V4aWYgPSAwOworICAgICAgICB1aW50MzJfdCB0aWZmSGRyT2Zmc2V0OworICAgICAgICBpZiAoISgqaXQpLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoCisgICAgICAgICAgICAgICAga0tleUV4aWZUaWZmT2Zmc2V0LCAoaW50MzJfdCopJnRpZmZIZHJPZmZzZXQpKSB7CisgICAgICAgICAgICB0aWZmSGRyT2Zmc2V0ID0gMDsKICAgICAgICAgfQorICAgICAgICBib29sIGlzRXhpZiA9ICh0aWZmSGRyT2Zmc2V0ID4gMCk7CiAgICAgICAgIGJvb2wgdXNlUHJlZml4ID0gY2h1bmstPm1UcmFjay0+dXNlUHJlZml4KCkgJiYgIWlzRXhpZjsKIAogICAgICAgICBzaXplX3QgYnl0ZXNXcml0dGVuOwotICAgICAgICBvZmY2NF90IG9mZnNldCA9IGFkZFNhbXBsZV9sKCppdCwgdXNlUHJlZml4LCBpc0V4aWYsICZieXRlc1dyaXR0ZW4pOworICAgICAgICBvZmY2NF90IG9mZnNldCA9IGFkZFNhbXBsZV9sKCppdCwgdXNlUHJlZml4LCB0aWZmSGRyT2Zmc2V0LCAmYnl0ZXNXcml0dGVuKTsKIAogICAgICAgICBpZiAoY2h1bmstPm1UcmFjay0+aXNIZWljKCkpIHsKICAgICAgICAgICAgIGNodW5rLT5tVHJhY2stPmFkZEl0ZW1PZmZzZXRBbmRTaXplKG9mZnNldCwgYnl0ZXNXcml0dGVuLCBpc0V4aWYpOwpAQCAtMjk3MCwxMCArMzA0MSwxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgYm9vbCBpc0V4aWYgPSBmYWxzZTsKKyAgICAgICAgdWludDMyX3QgdGlmZkhkck9mZnNldCA9IDA7CiAgICAgICAgIGludDMyX3QgaXNNdXhlckRhdGE7CiAgICAgICAgIGlmIChidWZmZXItPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5SXNNdXhlckRhdGEsICZpc011eGVyRGF0YSkgJiYgaXNNdXhlckRhdGEpIHsKICAgICAgICAgICAgIC8vIFdlIG9ubHkgc3VwcG9ydCBvbmUgdHlwZSBvZiBtdXhlciBkYXRhLCB3aGljaCBpcyBFeGlmIGRhdGEgYmxvY2suCi0gICAgICAgICAgICBpc0V4aWYgPSBpc0V4aWZEYXRhKGJ1ZmZlcik7CisgICAgICAgICAgICBpc0V4aWYgPSBpc0V4aWZEYXRhKGJ1ZmZlciwgJnRpZmZIZHJPZmZzZXQpOwogICAgICAgICAgICAgaWYgKCFpc0V4aWYpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiSWdub3JpbmcgYmFkIEV4aWYgZGF0YSBibG9jayIpOwogICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwpAQCAtMjk5NSw3ICszMDY3LDcgQEAKICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAogICAgICAgICBpZiAoaXNFeGlmKSB7Ci0gICAgICAgICAgICBjb3B5LT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNFeGlmLCAxKTsKKyAgICAgICAgICAgIGNvcHktPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlFeGlmVGlmZk9mZnNldCwgdGlmZkhkck9mZnNldCk7CiAgICAgICAgIH0KICAgICAgICAgYm9vbCB1c2VQcmVmaXggPSB0aGlzLT51c2VQcmVmaXgoKSAmJiAhaXNFeGlmOwogCkBAIC0zMDYwLDggKzMxMzIsOCBAQAogICAgICAgICBpZiAoIW1Jc0hlaWMpIHsKICAgICAgICAgICAgIGlmIChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgbUZpcnN0U2FtcGxlVGltZVJlYWxVcyA9IHN5c3RlbVRpbWUoKSAvIDEwMDA7CisgICAgICAgICAgICAgICAgbU93bmVyLT5zZXRTdGFydFRpbWVzdGFtcFVzKHRpbWVzdGFtcFVzKTsKICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOwotICAgICAgICAgICAgICAgIG1Pd25lci0+c2V0U3RhcnRUaW1lc3RhbXBVcyhtU3RhcnRUaW1lc3RhbXBVcyk7CiAgICAgICAgICAgICAgICAgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzID0gbVN0YXJ0VGltZXN0YW1wVXM7CiAgICAgICAgICAgICB9CiAKQEAgLTMyNjgsNyArMzM0MCw4IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKCFoYXNNdWx0aXBsZVRyYWNrcykgewogICAgICAgICAgICAgc2l6ZV90IGJ5dGVzV3JpdHRlbjsKLSAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gbU93bmVyLT5hZGRTYW1wbGVfbChjb3B5LCB1c2VQcmVmaXgsIGlzRXhpZiwgJmJ5dGVzV3JpdHRlbik7CisgICAgICAgICAgICBvZmY2NF90IG9mZnNldCA9IG1Pd25lci0+YWRkU2FtcGxlX2woCisgICAgICAgICAgICAgICAgICAgIGNvcHksIHVzZVByZWZpeCwgdGlmZkhkck9mZnNldCwgJmJ5dGVzV3JpdHRlbik7CiAKICAgICAgICAgICAgIGlmIChtSXNIZWljKSB7CiAgICAgICAgICAgICAgICAgYWRkSXRlbU9mZnNldEFuZFNpemUob2Zmc2V0LCBieXRlc1dyaXR0ZW4sIGlzRXhpZik7CkBAIC0zNTI2LDcgKzM1OTksNyBAQAogfQogCiBpbnQ2NF90IE1QRUc0V3JpdGVyOjpUcmFjazo6Z2V0RHVyYXRpb25VcygpIGNvbnN0IHsKLSAgICByZXR1cm4gbVRyYWNrRHVyYXRpb25VcyArIGdldFN0YXJ0VGltZU9mZnNldFRpbWVVcygpOworICAgIHJldHVybiBtVHJhY2tEdXJhdGlvblVzICsgZ2V0U3RhcnRUaW1lT2Zmc2V0VGltZVVzKCkgKyBtT3duZXItPmdldFN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcygpOwogfQogCiBpbnQ2NF90IE1QRUc0V3JpdGVyOjpUcmFjazo6Z2V0RXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMoKSBjb25zdCB7CkBAIC0zNjEyLDYgKzM2ODUsNyBAQAogICAgIHVpbnQzMl90IG5vdyA9IGdldE1wZWc0VGltZSgpOwogICAgIG1Pd25lci0+YmVnaW5Cb3goInRyYWsiKTsKICAgICAgICAgd3JpdGVUa2hkQm94KG5vdyk7CisgICAgICAgIHdyaXRlRWR0c0JveCgpOwogICAgICAgICBtT3duZXItPmJlZ2luQm94KCJtZGlhIik7CiAgICAgICAgICAgICB3cml0ZU1kaGRCb3gobm93KTsKICAgICAgICAgICAgIHdyaXRlSGRsckJveCgpOwpAQCAtMzY3NCw2ICszNzQ4LDI5IEBACiAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgfQogICAgIG1Pd25lci0+YmVnaW5Cb3goZm91cmNjKTsgICAgLy8gVGV4dE1ldGFEYXRhU2FtcGxlRW50cnkKKworICAgIC8vICBIQUNLIHRvIG1ha2UgdGhlIG1ldGFkYXRhIHRyYWNrIGNvbXBsaWFudCB3aXRoIHRoZSBJU08gc3RhbmRhcmQuCisgICAgLy8KKyAgICAvLyAgTWV0YWRhdGEgdHJhY2sgaXMgYWRkZWQgZnJvbSBBUEkgMjYgYW5kIHRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdAorICAgIC8vICBmdWxseSBmb2xsb3dlZCB0aGUgVGV4dE1ldGFEYXRhU2FtcGxlRW50cnkgc3BlY2lmaWVkIGluIElTTy9JRUMgMTQ0OTYtMTItMjAxNQorICAgIC8vICBpbiB0aGF0IG9ubHkgdGhlIG1pbWVfZm9ybWF0IGlzIHdyaXR0ZW4gb3V0LiBjb250ZW50X2VuY29kaW5nIGFuZAorICAgIC8vICBkYXRhX3JlZmVyZW5jZV9pbmRleCBoYXZlIG5vdCBiZWVuIHdyaXR0ZW4gb3V0LiBUaGlzIGxlYWRzIHRvIHRoZSBmYWlsdXJlCisgICAgLy8gIHdoZW4gc29tZSBNUDQgcGFyc2VyIHRyaWVzIHRvIHBhcnNlIHRoZSBtZXRhZGF0YSB0cmFjayBhY2NvcmRpbmcgdG8gdGhlCisgICAgLy8gIHN0YW5kYXJkLiBUaGUgaGFjayBoZXJlIHdpbGwgbWFrZSB0aGUgbWV0YWRhdGEgdHJhY2sgY29tcGxpYW50IHdpdGggdGhlCisgICAgLy8gIHN0YW5kYXJkIHdoaWxlIHN0aWxsIG1haW50YWluaW5nIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBUaGlzIHdvdWxkIGVuYWJsZQorICAgIC8vICBBbmRyb2lkIHZlcnNpb25zIGJlZm9yZSBBUEkgMjkgdG8gYmUgYWJsZSB0byByZWFkIG91dCB0aGUgc3RhbmRhcmQgY29tcGxpYW50CisgICAgLy8gIE1ldGFkYXRhIHRyYWNrIGdlbmVyYXRlZCB3aXRoIEFuZHJvaWQgQVBJIDI5IGFuZCB1cHdhcmQuIFRoZSB0cmljayBpcyBiYXNlZAorICAgIC8vICBvbiB0aGUgZmFjdCB0aGF0IHRoZSBNZXRhZGF0YSB0cmFjayBtdXN0IHN0YXJ0IHdpdGggcHJlZml4IOKAnGFwcGxpY2F0aW9uL+KAnSBhbmQKKyAgICAvLyAgdGhvc2UgbWlzc2luZyBmaWVsZHMgYXJlIG5vdCB1c2VkIGluIEFuZHJvaWQncyBNZXRhZGF0YSB0cmFjay4gQnkgd3JpdHRpbmcKKyAgICAvLyAgb3V0IHRoZSBtaW1lX2Zvcm1hdCB0d2ljZSwgdGhlIGZpcnN0IG1pbWVfZm9ybWF0IHdpbGwgYmUgdXNlZCB0byBmaWxsIG91dCB0aGUKKyAgICAvLyAgbWlzc2luZyByZXNlcnZlZCwgZGF0YV9yZWZlcmVuY2VfaW5kZXggYW5kIGNvbnRlbnQgZW5jb2RpbmcgZmllbGRzLiBPbiB0aGUKKyAgICAvLyAgcGFyc2VyIHNpZGUsIHRoZSBleHRyYWN0ZXIgYmVmb3JlIEFQSSAyOSAgd2lsbCByZWFkIG91dCB0aGUgZmlyc3QgbWltZV9mb3JtYXQKKyAgICAvLyAgY29ycmVjdGx5IGFuZCBkcm9wIHRoZSBzZWNvbmQgbWltZV9mb3JtYXQuIFRoZSBleHRyYWN0b3IgZnJvbSBBUEkgMjkgd2lsbAorICAgIC8vICBjaGVjayBpZiB0aGUgcmVzZXJ2ZWQsIGRhdGFfcmVmZXJlbmNlX2luZGV4IGFuZCBjb250ZW50IGVuY29kaW5nIGFyZSBmaWxsZWQKKyAgICAvLyAgd2l0aCDigJxhcHBsaWNhdGlvbuKAnSB0byBkZXRlY3QgaWYgdGhpcyBpcyBhIHN0YW5kYXJkIGNvbXBsaWFudCBtZXRhZGF0YSB0cmFjaworICAgIC8vICBhbmQgcmVhZCBvdXQgdGhlIGRhdGEgYWNjb3JkaW5nbHkuCisgICAgbU93bmVyLT53cml0ZUNTdHJpbmcobWltZSk7CisKICAgICBtT3duZXItPndyaXRlQ1N0cmluZyhtaW1lKTsgIC8vIG1ldGFkYXRhIG1pbWVfZm9ybWF0CiAgICAgbU93bmVyLT5lbmRCb3goKTsgLy8gbWV0dAogfQpAQCAtMzk1OSw2ICs0MDU2LDMzIEBACiAgICAgbU93bmVyLT5lbmRCb3goKTsKIH0KIAordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlRWR0c0JveCgpeworICAgIEFMT0dWKCIlcyA6IGdldFN0YXJ0VGltZU9mZnNldFRpbWVVcyBvZiB0cmFjazolIiBQUklkNjQgIiB1cyIsIGdldFRyYWNrVHlwZSgpLAorICAgICAgICBnZXRTdGFydFRpbWVPZmZzZXRUaW1lVXMoKSk7CisKKyAgICAvLyBQcmVwb25lIHZpZGVvIHBsYXliYWNrLgorICAgIGlmIChtTWluQ3R0c09mZnNldFRpY2tzICE9IG1NYXhDdHRzT2Zmc2V0VGlja3MpIHsKKyAgICAgICAgaW50MzJfdCBtdmhkVGltZVNjYWxlID0gbU93bmVyLT5nZXRUaW1lU2NhbGUoKTsKKyAgICAgICAgdWludDMyX3QgdGtoZER1cmF0aW9uID0gKGdldER1cmF0aW9uVXMoKSAqIG12aGRUaW1lU2NhbGUgKyA1RTUpIC8gMUU2OworICAgICAgICBpbnQ2NF90IG1lZGlhVGltZSA9ICgoa01heEN0dHNPZmZzZXRUaW1lVXMgLSBnZXRNaW5DdHRzT2Zmc2V0VGltZVVzKCkpCisgICAgICAgICAgICAqIG1UaW1lU2NhbGUgKyA1RTUpIC8gMUU2OworICAgICAgICBpZiAodGtoZER1cmF0aW9uID4gMCAmJiBtZWRpYVRpbWUgPiAwKSB7CisgICAgICAgICAgICBhZGRPbmVFbHN0VGFibGVFbnRyeSh0a2hkRHVyYXRpb24sIG1lZGlhVGltZSwgMSwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUVsc3RUYWJsZUVudHJpZXMtPmNvdW50KCkgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbU93bmVyLT5iZWdpbkJveCgiZWR0cyIpOworICAgICAgICBtT3duZXItPmJlZ2luQm94KCJlbHN0Iik7CisgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7IC8vIHZlcnNpb249MCwgZmxhZ3M9MAorICAgICAgICAgICAgbUVsc3RUYWJsZUVudHJpZXMtPndyaXRlKG1Pd25lcik7CisgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7IC8vIGVsc3Q7CisgICAgbU93bmVyLT5lbmRCb3goKTsgLy8gZWR0cworfQorCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVNZGhkQm94KHVpbnQzMl90IG5vdykgewogICAgIGludDY0X3QgdHJha0R1cmF0aW9uVXMgPSBnZXREdXJhdGlvblVzKCk7CiAgICAgaW50NjRfdCBtZGhkRHVyYXRpb24gPSAodHJha0R1cmF0aW9uVXMgKiBtVGltZVNjYWxlICsgNUU1KSAvIDFFNjsKQEAgLTQwOTUsNyArNDIxOSw5IEBACiAgICAgICAgIHVpbnQzMl90IGR1cmF0aW9uOwogICAgICAgICBDSEVDSyhtU3R0c1RhYmxlRW50cmllcy0+Z2V0KGR1cmF0aW9uLCAxKSk7CiAgICAgICAgIGR1cmF0aW9uID0gaHRvbmwoZHVyYXRpb24pOyAgLy8gQmFjayB0byBob3N0IGJ5dGUgb3JkZXIKLSAgICAgICAgbVN0dHNUYWJsZUVudHJpZXMtPnNldChodG9ubChkdXJhdGlvbiArIGdldFN0YXJ0VGltZU9mZnNldFNjYWxlZFRpbWUoKSksIDEpOworICAgICAgICBpbnQzMl90IHN0YXJ0VGltZU9mZnNldFNjYWxlZCA9ICgoKGdldFN0YXJ0VGltZU9mZnNldFRpbWVVcygpICsKKyAgICAgICAgICAgIG1Pd25lci0+Z2V0U3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzKCkpICogbVRpbWVTY2FsZSkgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEw7CisgICAgICAgIG1TdHRzVGFibGVFbnRyaWVzLT5zZXQoaHRvbmwoKGludDMyX3QpZHVyYXRpb24gKyBzdGFydFRpbWVPZmZzZXRTY2FsZWQpLCAxKTsKICAgICB9CiAgICAgbVN0dHNUYWJsZUVudHJpZXMtPndyaXRlKG1Pd25lcik7CiAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHN0dHMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ2xvY2suY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5jcHAKaW5kZXggOGJmZjlmNy4uNGY5YmM2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5jcHAKQEAgLTExMCw3ICsxMTAsNyBAQAogICAgIGlmIChtQW5jaG9yVGltZVJlYWxVcyAhPSAtMSkgewogICAgICAgICBpbnQ2NF90IG9sZE5vd01lZGlhVXMgPQogICAgICAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzICsgKG5vd1VzIC0gbUFuY2hvclRpbWVSZWFsVXMpICogKGRvdWJsZSltUGxheWJhY2tSYXRlOwotICAgICAgICBpZiAobm93TWVkaWFVcyA8IG9sZE5vd01lZGlhVXMKKyAgICAgICAgaWYgKG5vd01lZGlhVXMgPCBvbGROb3dNZWRpYVVzICsga0FuY2hvckZsdWN0dWF0aW9uQWxsb3dlZFVzCiAgICAgICAgICAgICAgICAgJiYgbm93TWVkaWFVcyA+IG9sZE5vd01lZGlhVXMgLSBrQW5jaG9yRmx1Y3R1YXRpb25BbGxvd2VkVXMpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAppbmRleCBmYTU5Y2RiLi5kNGU0MDAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcApAQCAtNTUwLDcgKzU1MCw3IEBACiAKIHZvaWQgTWVkaWFDb2RlYzo6aW5pdEFuYWx5dGljc0l0ZW0oKSB7CiAgICAgaWYgKG1BbmFseXRpY3NJdGVtID09IE5VTEwpIHsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtDb2RlY0tleU5hbWUpOworICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKGtDb2RlY0tleU5hbWUpOwogICAgIH0KIAogICAgIG1MYXRlbmN5SGlzdC5zZXR1cChrTGF0ZW5jeUhpc3RCdWNrZXRzLCBrTGF0ZW5jeUhpc3RXaWR0aCwga0xhdGVuY3lIaXN0Rmxvb3IpOwpAQCAtODYyLDkgKzg2Miw5IEBACiAvL3N0YXRpYwogc3A8Q29kZWNCYXNlPiBNZWRpYUNvZGVjOjpHZXRDb2RlY0Jhc2UoY29uc3QgQVN0cmluZyAmbmFtZSwgY29uc3QgY2hhciAqb3duZXIpIHsKICAgICBpZiAob3duZXIpIHsKLSAgICAgICAgaWYgKHN0cm5jbXAob3duZXIsICJkZWZhdWx0IiwgOCkgPT0gMCkgeworICAgICAgICBpZiAoc3RyY21wKG93bmVyLCAiZGVmYXVsdCIpID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgQUNvZGVjOwotICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAob3duZXIsICJjb2RlYzIiLCA3KSA9PSAwKSB7CisgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcChvd25lciwgImNvZGVjMiIsIDYpID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBDcmVhdGVDQ29kZWMoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTkxMSwxMCArOTExLDEwIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBtQ29kZWNJbmZvID0gbWNsLT5nZXRDb2RlY0luZm8oY29kZWNJZHgpOwotICAgICAgICBWZWN0b3I8QVN0cmluZz4gbWltZXM7Ci0gICAgICAgIG1Db2RlY0luZm8tPmdldFN1cHBvcnRlZE1pbWVzKCZtaW1lcyk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWltZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtaW1lc1tpXS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICBWZWN0b3I8QVN0cmluZz4gbWVkaWFUeXBlczsKKyAgICAgICAgbUNvZGVjSW5mby0+Z2V0U3VwcG9ydGVkTWVkaWFUeXBlcygmbWVkaWFUeXBlcyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWVkaWFUeXBlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKG1lZGlhVHlwZXNbaV0uc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKICAgICAgICAgICAgICAgICBtSXNWaWRlbyA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xOTczLDEwICsxOTczLDExIEBACiAKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q29tcG9uZW50Q29uZmlndXJlZDoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCB8fCBtU3RhdGUgPT0gSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgYSBrV2hhdEVycm9yIG1lc3NhZ2UgY2FtZSBpbiBhbmQgcmVwbGllZCB3aXRoIGVycm9yLAorICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFJFTEVBU0lORyB8fCBtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCB8fCBtU3RhdGUgPT0gSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgYSBrV2hhdEVycm9yIG9yIGtXaGF0UmVsZWFzZSBtZXNzYWdlIGNhbWUgaW4gYW5kIHJlcGxpZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBsb2cgYSB3YXJuaW5nIGFuZCBpZ25vcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY29uZmlndXJlIGludGVycnVwdGVkIGJ5IGVycm9yLCBjdXJyZW50IHN0YXRlICVkIiwgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb25maWd1cmUgaW50ZXJydXB0ZWQgYnkgZXJyb3Igb3IgcmVsZWFzZSwgY3VycmVudCBzdGF0ZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVN0YXRlLCBDT05GSUdVUklORyk7CkBAIC0yMDY3LDYgKzIwNjgsMTMgQEAKIAogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRTdGFydENvbXBsZXRlZDoKICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gUkVMRUFTSU5HIHx8IG1TdGF0ZSA9PSBVTklOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIGEga1doYXRSZWxlYXNlIG1lc3NhZ2UgY2FtZSBpbiBhbmQgcmVwbGllZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGxvZyBhIHdhcm5pbmcgYW5kIGlnbm9yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJzdGFydCBpbnRlcnJ1cHRlZCBieSByZWxlYXNlLCBjdXJyZW50IHN0YXRlICVkIiwgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVN0YXRlLCBTVEFSVElORyk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtSXNWaWRlbykgewogICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzb3VyY2UoCkBAIC0yMTk3LDYgKzIyMDUsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGhkcjEwUGx1c0luZm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1PdXRwdXRGb3JtYXQtPmZpbmRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsICZoZHIxMFBsdXNJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaGRyMTBQbHVzSW5mbyAhPSBudWxscHRyICYmIGhkcjEwUGx1c0luZm8tPnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19oZHIxMF9wbHVzX21ldGFkYXRhKG1TdXJmYWNlLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkcjEwUGx1c0luZm8tPnNpemUoKSwgaGRyMTBQbHVzSW5mby0+ZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoSWdub3JlQ2FzZSgidmlkZW8vIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvZnRSZW5kZXJlciA9IG5ldyBTb2Z0d2FyZVJlbmRlcmVyKG1TdXJmYWNlLCBtUm90YXRpb25EZWdyZWVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0yNjI1LDExICsyNjQwLDEyIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIElmIHdlJ3JlIGZsdXNoaW5nLCBvciB3ZSdyZSBzdG9wcGluZyBidXQgcmVjZWl2ZWQgYSByZWxlYXNlCi0gICAgICAgICAgICAvLyByZXF1ZXN0LCBwb3N0IHRoZSByZXBseSBmb3IgdGhlIHBlbmRpbmcgY2FsbCBmaXJzdCwgYW5kIGNvbnNpZGVyCi0gICAgICAgICAgICAvLyBpdCBkb25lLiBUaGUgcmVwbHkgdG9rZW4gd2lsbCBiZSByZXBsYWNlZCBhZnRlciB0aGlzLCBhbmQgd2UnbGwKLSAgICAgICAgICAgIC8vIG5vIGxvbmdlciBiZSBhYmxlIHRvIHJlcGx5LgotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBGTFVTSElORyB8fCBtU3RhdGUgPT0gU1RPUFBJTkcpIHsKKyAgICAgICAgICAgIC8vIElmIHdlJ3JlIGZsdXNoaW5nLCBzdG9wcGluZywgY29uZmlndXJpbmcgb3Igc3RhcnRpbmcgIGJ1dAorICAgICAgICAgICAgLy8gcmVjZWl2ZWQgYSByZWxlYXNlIHJlcXVlc3QsIHBvc3QgdGhlIHJlcGx5IGZvciB0aGUgcGVuZGluZyBjYWxsCisgICAgICAgICAgICAvLyBmaXJzdCwgYW5kIGNvbnNpZGVyIGl0IGRvbmUuIFRoZSByZXBseSB0b2tlbiB3aWxsIGJlIHJlcGxhY2VkCisgICAgICAgICAgICAvLyBhZnRlciB0aGlzLCBhbmQgd2UnbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gcmVwbHkuCisgICAgICAgICAgICBpZiAobVN0YXRlID09IEZMVVNISU5HIHx8IG1TdGF0ZSA9PSBTVE9QUElORworICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUgPT0gQ09ORklHVVJJTkcgfHwgbVN0YXRlID09IFNUQVJUSU5HKSB7CiAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7CiAgICAgICAgICAgICB9CiAKQEAgLTI2NzQsNyArMjY5MCw3IEBACiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzQXN5bmMpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZGVxdWV1ZU91dHB1dEJ1ZmZlciBjYW4ndCBiZSB1c2VkIGluIGFzeW5jIG1vZGUiKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZGVxdWV1ZUlucHV0QnVmZmVyIGNhbid0IGJlIHVzZWQgaW4gYXN5bmMgbW9kZSIpOwogICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKaW5kZXggZWFmZjI4My4uM2Q1OGQ0YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcApAQCAtNzcsNyArNzcsOCBAQAogICAgIHJldHVybiBwcm9maWxpbmdOZWVkZWQ7CiB9CiAKLU9teEluZm9CdWlsZGVyIHNPbXhJbmZvQnVpbGRlcjsKK09teEluZm9CdWlsZGVyIHNPbXhJbmZvQnVpbGRlcnt0cnVlIC8qIGFsbG93U3VyZmFjZUVuY29kZXJzICovfTsKK09teEluZm9CdWlsZGVyIHNPbXhOb1N1cmZhY2VFbmNvZGVySW5mb0J1aWxkZXJ7ZmFsc2UgLyogYWxsb3dTdXJmYWNlRW5jb2RlcnMgKi99OwogCiBNdXRleCBzQ29kZWMySW5mb0J1aWxkZXJNdXRleDsKIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlPiBzQ29kZWMySW5mb0J1aWxkZXI7CkBAIC05OCw3ICs5OSwxMSBAQAogICAgIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBzdXJmYWNlVGVzdCA9CiAgICAgICAgIFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyOjpHZXRDQ29kZWNJbnN0YW5jZSgpLT5jcmVhdGVJbnB1dFN1cmZhY2UoKTsKICAgICBpZiAoc3VyZmFjZVRlc3QgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiQWxsb3dpbmcgYWxsIE9NWCBjb2RlY3MiKTsKICAgICAgICAgYnVpbGRlcnMucHVzaF9iYWNrKCZzT214SW5mb0J1aWxkZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCJBbGxvd2luZyBvbmx5IG5vbi1zdXJmYWNlLWVuY29kZXIgT01YIGNvZGVjcyIpOworICAgICAgICBidWlsZGVycy5wdXNoX2JhY2soJnNPbXhOb1N1cmZhY2VFbmNvZGVySW5mb0J1aWxkZXIpOwogICAgIH0KICAgICBidWlsZGVycy5wdXNoX2JhY2soR2V0Q29kZWMySW5mb0J1aWxkZXIoKSk7CiAgICAgcmV0dXJuIGJ1aWxkZXJzOwpAQCAtMjE1LDE0ICsyMjAsMjUgQEAKICAgICAgICAgICAgIG1Db2RlY0luZm9zLmJlZ2luKCksCiAgICAgICAgICAgICBtQ29kZWNJbmZvcy5lbmQoKSwKICAgICAgICAgICAgIFtdKGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmaW5mbzEsIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmaW5mbzIpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5mbzIgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmZvMSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmZvMS0+cmFuaygpIDwgaW5mbzItPnJhbmsoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gbnVsbCBpcyBsb3dlc3QKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5mbzEgPT0gbnVsbHB0cgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGluZm8yICE9IG51bGxwdHIgJiYgaW5mbzEtPmdldFJhbmsoKSA8IGluZm8yLT5nZXRSYW5rKCkpOwogICAgICAgICAgICAgfSk7CisKKyAgICAvLyByZW1vdmUgZHVwbGljYXRlIGVudHJpZXMKKyAgICBib29sIGRlZHVwZSA9IHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5zdGFnZWZyaWdodC5kZWR1cGUtY29kZWNzIiwgdHJ1ZSk7CisgICAgaWYgKGRlZHVwZSkgeworICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gY29kZWNzU2VlbjsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUNvZGVjSW5mb3MuYmVnaW4oKTsgaXQgIT0gbUNvZGVjSW5mb3MuZW5kKCk7ICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29kZWNOYW1lID0gKCppdCktPmdldENvZGVjTmFtZSgpOworICAgICAgICAgICAgaWYgKGNvZGVjc1NlZW4uY291bnQoY29kZWNOYW1lKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29kZWNzU2Vlbi5lbXBsYWNlKGNvZGVjTmFtZSk7CisgICAgICAgICAgICAgICAgaXQrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXQgPSBtQ29kZWNJbmZvcy5lcmFzZShpdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CiAKIE1lZGlhQ29kZWNMaXN0Ojp+TWVkaWFDb2RlY0xpc3QoKSB7CkBAIC0yNzIsMTAgKzI4OCwxNyBAQAogfQogCiBzc2l6ZV90IE1lZGlhQ29kZWNMaXN0OjpmaW5kQ29kZWNCeU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QgeworICAgIFZlY3RvcjxBU3RyaW5nPiBhbGlhc2VzOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvZGVjSW5mb3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgaWYgKHN0cmNtcChtQ29kZWNJbmZvc1tpXS0+Z2V0Q29kZWNOYW1lKCksIG5hbWUpID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICB9CisgICAgICAgIG1Db2RlY0luZm9zW2ldLT5nZXRBbGlhc2VzKCZhbGlhc2VzKTsKKyAgICAgICAgZm9yIChjb25zdCBBU3RyaW5nICZhbGlhcyA6IGFsaWFzZXMpIHsKKyAgICAgICAgICAgIGlmIChhbGlhcyA9PSBuYW1lKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gLUVOT0VOVDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcAppbmRleCBjYWM1M2Y0Li5kZDdjM2U2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwCkBAIC0yMjgsMTggKzIyOCwxOCBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBWZWN0b3I8QVN0cmluZz4gbWltZXM7Ci0gICAgICAgIGluZm8tPmdldFN1cHBvcnRlZE1pbWVzKCZtaW1lcyk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWltZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgVmVjdG9yPEFTdHJpbmc+IG1lZGlhVHlwZXM7CisgICAgICAgIGluZm8tPmdldFN1cHBvcnRlZE1lZGlhVHlwZXMoJm1lZGlhVHlwZXMpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1lZGlhVHlwZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+ICZjYXBzID0KLSAgICAgICAgICAgICAgICAgICAgaW5mby0+Z2V0Q2FwYWJpbGl0aWVzRm9yKG1pbWVzW2ldLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5nZXRDYXBhYmlsaXRpZXNGb3IobWVkaWFUeXBlc1tpXS5jX3N0cigpKTsKICAgICAgICAgICAgIGlmICghZm9yY2VUb01lYXN1cmUgJiYKICAgICAgICAgICAgICAgICAoY2Fwcy0+Z2V0RGV0YWlscygpLT5jb250YWlucygibWF4LXN1cHBvcnRlZC1pbnN0YW5jZXMiKSB8fAogICAgICAgICAgICAgICAgICBjYXBzLT5nZXREZXRhaWxzKCktPmNvbnRhaW5zKCJtYXgtY29uY3VycmVudC1pbnN0YW5jZXMiKSkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc2l6ZV90IG1heCA9IGRvUHJvZmlsZUNvZGVjcyhpbmZvLT5pc0VuY29kZXIoKSwgbmFtZSwgbWltZXNbaV0sIGNhcHMpOworICAgICAgICAgICAgc2l6ZV90IG1heCA9IGRvUHJvZmlsZUNvZGVjcyhpbmZvLT5pc0VuY29kZXIoKSwgbmFtZSwgbWVkaWFUeXBlc1tpXSwgY2Fwcyk7CiAgICAgICAgICAgICBpZiAobWF4ID4gMCkgewogICAgICAgICAgICAgICAgIENvZGVjU2V0dGluZ3Mgc2V0dGluZ3M7CiAgICAgICAgICAgICAgICAgY2hhciBtYXhTdHJbMzJdOwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAKICAgICAgICAgICAgICAgICBBU3RyaW5nIGtleSA9IG5hbWU7CiAgICAgICAgICAgICAgICAga2V5LmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgIGtleS5hcHBlbmQobWltZXNbaV0pOworICAgICAgICAgICAgICAgIGtleS5hcHBlbmQobWVkaWFUeXBlc1tpXSk7CiAKICAgICAgICAgICAgICAgICBpZiAoaW5mby0+aXNFbmNvZGVyKCkpIHsKICAgICAgICAgICAgICAgICAgICAgZW5jb2Rlcl9yZXN1bHRzLT5hZGQoa2V5LCBzZXR0aW5ncyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5jcHAKaW5kZXggYjMyZTQ3MC4uYzRmYjE5OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmNwcApAQCAtMzcsNiArMzcsMTYgQEAKICAgICAgICAgICAgIG5ldyBNZWRpYUNvZGVjSW5mb1dyaXRlcihpbmZvLmdldCgpKSk7CiB9CiAKK3N0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4KKyAgICAgICAgTWVkaWFDb2RlY0xpc3RXcml0ZXI6OmZpbmRNZWRpYUNvZGVjSW5mbyhjb25zdCBjaGFyICpuYW1lKSB7CisgICAgZm9yIChjb25zdCBzcDxNZWRpYUNvZGVjSW5mbz4gJmluZm8gOiBtQ29kZWNJbmZvcykgeworICAgICAgICBpZiAoIXN0cmNtcChpbmZvLT5nZXRDb2RlY05hbWUoKSwgbmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+KG5ldyBNZWRpYUNvZGVjSW5mb1dyaXRlcihpbmZvLmdldCgpKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKIHZvaWQgTWVkaWFDb2RlY0xpc3RXcml0ZXI6OndyaXRlR2xvYmFsU2V0dGluZ3MoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZ2xvYmFsU2V0dGluZ3MpIGNvbnN0IHsKICAgICBmb3IgKGNvbnN0IHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ICZrdiA6IG1HbG9iYWxTZXR0aW5ncykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmNwcAppbmRleCBlMjJhZDBkLi5jM2Q4NWVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmNwcApAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KQEAgLTM2Miw3ICszNjMsNyBAQAogCiBzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpzZXRJbnB1dEJ1ZmZlclRpbWVPZmZzZXQoaW50NjRfdCB0aW1lT2Zmc2V0VXMpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0SW5wdXRCdWZmZXJUaW1lT2Zmc2V0LCBtUmVmbGVjdG9yKTsKLSAgICBtc2ctPnNldEludDY0KCJ0aW1lLW9mZnNldC11cyIsIHRpbWVPZmZzZXRVcyk7CisgICAgbXNnLT5zZXRJbnQ2NChQQVJBTUVURVJfS0VZX09GRlNFVF9USU1FLCB0aW1lT2Zmc2V0VXMpOwogICAgIHJldHVybiBwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKG1zZyk7CiB9CiAKQEAgLTQ5MCw3ICs0OTEsNyBAQAogICAgIG1Db2RlY0xvb3Blci0+c3RhcnQoKTsKIAogICAgIGlmIChtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSB7Ci0gICAgICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJjcmVhdGUtaW5wdXQtYnVmZmVycy1zdXNwZW5kZWQiLCAxKTsKKyAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0NSRUFURV9JTlBVVF9TVVJGQUNFX1NVU1BFTkRFRCwgMSk7CiAgICAgfQogCiAgICAgQVN0cmluZyBvdXRwdXRNSU1FOwpAQCAtNjQzLDYgKzY0NCwxMCBAQAogICAgICAgICAgICAgb3V0cHV0LT5tQnVmZmVyUXVldWUuY2xlYXIoKTsKICAgICAgICAgICAgIG91dHB1dC0+bUVuY29kZXJSZWFjaGVkRU9TID0gdHJ1ZTsKICAgICAgICAgICAgIG91dHB1dC0+bUVycm9yQ29kZSA9IGVycjsKKyAgICAgICAgICAgIGlmICghKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpKSB7CisgICAgICAgICAgICAgICAgbVN0b3BwaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtUHVsbGVyLT5zdG9wKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBvdXRwdXQtPm1Db25kLnNpZ25hbCgpOwogCiAgICAgICAgICAgICByZWFjaGVkRU9TID0gdHJ1ZTsKQEAgLTY3Myw5ICs2NzgsOSBAQAogICAgIENIRUNLKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpOwogICAgIGlmIChtRW5jb2RlciAhPSBOVUxMKSB7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImRyb3AtaW5wdXQtZnJhbWVzIiwgZmFsc2UpOworICAgICAgICBwYXJhbXMtPnNldEludDMyKFBBUkFNRVRFUl9LRVlfU1VTUEVORCwgZmFsc2UpOwogICAgICAgICBpZiAocmVzdW1lU3RhcnRUaW1lVXMgPiAwKSB7Ci0gICAgICAgICAgICBwYXJhbXMtPnNldEludDY0KCJkcm9wLXN0YXJ0LXRpbWUtdXMiLCByZXN1bWVTdGFydFRpbWVVcyk7CisgICAgICAgICAgICBwYXJhbXMtPnNldEludDY0KFBBUkFNRVRFUl9LRVlfU1VTUEVORF9USU1FLCByZXN1bWVTdGFydFRpbWVVcyk7CiAgICAgICAgIH0KICAgICAgICAgbUVuY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKICAgICB9CkBAIC03OTUsNyArODAwLDcgQEAKICAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgewogICAgICAgICBpZiAobUVuY29kZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImRyb3AtaW5wdXQtZnJhbWVzIiwgZmFsc2UpOworICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQzMihQQVJBTUVURVJfS0VZX1NVU1BFTkQsIGZhbHNlKTsKICAgICAgICAgICAgIGlmIChzdGFydFRpbWVVcyA+PSAwKSB7CiAgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQ2NCgic2tpcC1mcmFtZXMtYmVmb3JlIiwgc3RhcnRUaW1lVXMpOwogICAgICAgICAgICAgfQpAQCAtODI4LDggKzgzMyw4IEBACiB2b2lkIE1lZGlhQ29kZWNTb3VyY2U6Om9uUGF1c2UoaW50NjRfdCBwYXVzZVN0YXJ0VGltZVVzKSB7CiAgICAgaWYgKChtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSAmJiAobUVuY29kZXIgIT0gTlVMTCkpIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigiZHJvcC1pbnB1dC1mcmFtZXMiLCB0cnVlKTsKLSAgICAgICAgcGFyYW1zLT5zZXRJbnQ2NCgiZHJvcC1zdGFydC10aW1lLXVzIiwgcGF1c2VTdGFydFRpbWVVcyk7CisgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoUEFSQU1FVEVSX0tFWV9TVVNQRU5ELCB0cnVlKTsKKyAgICAgICAgcGFyYW1zLT5zZXRJbnQ2NChQQVJBTUVURVJfS0VZX1NVU1BFTkRfVElNRSwgcGF1c2VTdGFydFRpbWVVcyk7CiAgICAgICAgIG1FbmNvZGVyLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQ0hFQ0sobVB1bGxlciAhPSBOVUxMKTsKQEAgLTEwOTIsMTIgKzEwOTcsMTIgQEAKICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lLW9mZnNldC11cyIsICZtSW5wdXRCdWZmZXJUaW1lT2Zmc2V0VXMpKTsKKyAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoUEFSQU1FVEVSX0tFWV9PRkZTRVRfVElNRSwgJm1JbnB1dEJ1ZmZlclRpbWVPZmZzZXRVcykpOwogCiAgICAgICAgIC8vIFByb3BhZ2F0ZSB0aGUgdGltZXN0YW1wIG9mZnNldCB0byBHcmFwaGljQnVmZmVyU291cmNlLgogICAgICAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgewogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50NjQoInRpbWUtb2Zmc2V0LXVzIiwgbUlucHV0QnVmZmVyVGltZU9mZnNldFVzKTsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50NjQoUEFSQU1FVEVSX0tFWV9PRkZTRVRfVElNRSwgbUlucHV0QnVmZmVyVGltZU9mZnNldFVzKTsKICAgICAgICAgICAgIGVyciA9IG1FbmNvZGVyLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZDMzODIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFFeHRyYWN0b3IiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8cHdkLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3JQcml2Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTWVkaWFFeHRyYWN0b3I6Ok1lZGlhRXh0cmFjdG9yKCkgeworICAgIGlmICghTE9HX05ERUJVRykgeworICAgICAgICB1aWRfdCB1aWQgPSBnZXR1aWQoKTsKKyAgICAgICAgc3RydWN0IHBhc3N3ZCAqcHcgPSBnZXRwd3VpZCh1aWQpOworICAgICAgICBBTE9HVigiZXh0cmFjdG9yIGNyZWF0ZWQgaW4gdWlkOiAlZCAoJXMpIiwgZ2V0dWlkKCksIHB3LT5wd19uYW1lKTsKKyAgICB9Cit9CisKK01lZGlhRXh0cmFjdG9yOjp+TWVkaWFFeHRyYWN0b3IoKSB7fQorCit1aW50MzJfdCBNZWRpYUV4dHJhY3Rvcjo6ZmxhZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9QQVVTRSB8IENBTl9TRUVLOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpNZWRpYUV4dHJhY3RvckNVbndyYXBwZXIoQ01lZGlhRXh0cmFjdG9yICpwbHVnaW4pIHsKKyAgICB0aGlzLT5wbHVnaW4gPSBwbHVnaW47Cit9CisKK01lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6fk1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcigpIHsKKyAgICBwbHVnaW4tPmZyZWUocGx1Z2luLT5kYXRhKTsKKyAgICBmcmVlKHBsdWdpbik7Cit9CisKK3NpemVfdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6OmNvdW50VHJhY2tzKCkgeworICAgIHJldHVybiBwbHVnaW4tPmNvdW50VHJhY2tzKHBsdWdpbi0+ZGF0YSk7Cit9CisKK01lZGlhVHJhY2sgKk1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CisgICAgcmV0dXJuIE1lZGlhVHJhY2tDVW53cmFwcGVyOjpjcmVhdGUocGx1Z2luLT5nZXRUcmFjayhwbHVnaW4tPmRhdGEsIGluZGV4KSk7Cit9CisKK3N0YXR1c190IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOworICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0ID0gIEFNZWRpYUZvcm1hdF9mcm9tTXNnKCZtc2cpOworICAgIG1lZGlhX3N0YXR1c190IHJldCA9IHBsdWdpbi0+Z2V0VHJhY2tNZXRhRGF0YShwbHVnaW4tPmRhdGEsIGZvcm1hdCwgaW5kZXgsIGZsYWdzKTsKKyAgICBzcDxNZXRhRGF0YT4gbmV3TWV0YSA9IG5ldyBNZXRhRGF0YSgpOworICAgIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YShtc2csIG5ld01ldGEpOworICAgIGRlbGV0ZSBmb3JtYXQ7CisgICAgbWV0YSA9ICpuZXdNZXRhOworICAgIHJldHVybiByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcihyZXQpOworfQorCitzdGF0dXNfdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCA9ICBBTWVkaWFGb3JtYXRfZnJvbU1zZygmbXNnKTsKKyAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSBwbHVnaW4tPmdldE1ldGFEYXRhKHBsdWdpbi0+ZGF0YSwgZm9ybWF0KTsKKyAgICBzcDxNZXRhRGF0YT4gbmV3TWV0YSA9IG5ldyBNZXRhRGF0YSgpOworICAgIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YShtc2csIG5ld01ldGEpOworICAgIGRlbGV0ZSBmb3JtYXQ7CisgICAgbWV0YSA9ICpuZXdNZXRhOworICAgIHJldHVybiByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcihyZXQpOworfQorCitjb25zdCBjaGFyICogTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpuYW1lKCkgeworICAgIHJldHVybiBwbHVnaW4tPm5hbWUocGx1Z2luLT5kYXRhKTsKK30KKwordWludDMyX3QgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpmbGFncygpIGNvbnN0IHsKKyAgICByZXR1cm4gcGx1Z2luLT5mbGFncyhwbHVnaW4tPmRhdGEpOworfQorCitzdGF0dXNfdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6OnNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIGNhc1Rva2VuLCBzaXplX3Qgc2l6ZSkgeworICAgIHJldHVybiBwbHVnaW4tPnNldE1lZGlhQ2FzKHBsdWdpbi0+ZGF0YSwgY2FzVG9rZW4sIHNpemUpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAKaW5kZXggYjBiZjI2OS4uYTMwOWVlNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwCkBAIC0xOCwyMCArMTgsMjAgQEAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFFeHRyYWN0b3JGYWN0b3J5IgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9kbGV4dC5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bmF0aXZlbG9hZGVyL2RsZXh0X25hbWVzcGFjZXMuaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx6aXBhcmNoaXZlL3ppcF9hcmNoaXZlLmg+CiAKICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxkbGZjbi5oPgpAQCAtNzAsNDkgKzcwLDQ4IEBACiAKICAgICBBTE9HVigiTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGVGcm9tU2VydmljZSAlcyIsIG1pbWUpOwogCi0gICAgVXBkYXRlRXh0cmFjdG9ycyhudWxscHRyKTsKKyAgICBVcGRhdGVFeHRyYWN0b3JzKCk7CiAKICAgICAvLyBpbml0aWFsaXplIHNvdXJjZSBkZWNyeXB0aW9uIGlmIG5lZWRlZAogICAgIHNvdXJjZS0+RHJtSW5pdGlhbGl6YXRpb24obnVsbHB0ciAvKiBtaW1lICovKTsKIAogICAgIHZvaWQgKm1ldGEgPSBudWxscHRyOwotICAgIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBjcmVhdG9yID0gTlVMTDsKLSAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jIGZyZWVNZXRhID0gbnVsbHB0cjsKKyAgICB2b2lkICpjcmVhdG9yID0gTlVMTDsKKyAgICBGcmVlTWV0YUZ1bmMgZnJlZU1ldGEgPSBudWxscHRyOwogICAgIGZsb2F0IGNvbmZpZGVuY2U7CiAgICAgc3A8RXh0cmFjdG9yUGx1Z2luPiBwbHVnaW47Ci0gICAgY3JlYXRvciA9IHNuaWZmKHNvdXJjZS5nZXQoKSwgJmNvbmZpZGVuY2UsICZtZXRhLCAmZnJlZU1ldGEsIHBsdWdpbik7CisgICAgdWludDMyX3QgY3JlYXRvclZlcnNpb24gPSAwOworICAgIGNyZWF0b3IgPSBzbmlmZihzb3VyY2UsICZjb25maWRlbmNlLCAmbWV0YSwgJmZyZWVNZXRhLCBwbHVnaW4sICZjcmVhdG9yVmVyc2lvbik7CiAgICAgaWYgKCFjcmVhdG9yKSB7CiAgICAgICAgIEFMT0dWKCJGQUlMRUQgdG8gYXV0b2RldGVjdCBtZWRpYSBjb250ZW50LiIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBNZWRpYUV4dHJhY3RvciAqcmV0ID0gY3JlYXRvcihzb3VyY2UuZ2V0KCksIG1ldGEpOwotICAgIGlmIChtZXRhICE9IG51bGxwdHIgJiYgZnJlZU1ldGEgIT0gbnVsbHB0cikgewotICAgICAgICBmcmVlTWV0YShtZXRhKTsKKyAgICBNZWRpYUV4dHJhY3RvciAqZXggPSBudWxscHRyOworICAgIGlmIChjcmVhdG9yVmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjEgfHwKKyAgICAgICAgICAgIGNyZWF0b3JWZXJzaW9uID09IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMikgeworICAgICAgICBDTWVkaWFFeHRyYWN0b3IgKnJldCA9ICgoQ3JlYXRvckZ1bmMpY3JlYXRvcikoc291cmNlLT53cmFwKCksIG1ldGEpOworICAgICAgICBpZiAobWV0YSAhPSBudWxscHRyICYmIGZyZWVNZXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZyZWVNZXRhKG1ldGEpOworICAgICAgICB9CisgICAgICAgIGV4ID0gcmV0ICE9IG51bGxwdHIgPyBuZXcgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyKHJldCkgOiBudWxscHRyOwogICAgIH0KIAogICAgIEFMT0dWKCJDcmVhdGVkIGFuIGV4dHJhY3RvciAnJXMnIHdpdGggY29uZmlkZW5jZSAlLjJmIiwKLSAgICAgICAgIHJldCAhPSBudWxscHRyID8gcmV0LT5uYW1lKCkgOiAiPG51bGw+IiwgY29uZmlkZW5jZSk7CisgICAgICAgICBleCAhPSBudWxscHRyID8gZXgtPm5hbWUoKSA6ICI8bnVsbD4iLCBjb25maWRlbmNlKTsKIAotICAgIHJldHVybiBDcmVhdGVJTWVkaWFFeHRyYWN0b3JGcm9tTWVkaWFFeHRyYWN0b3IocmV0LCBzb3VyY2UsIHBsdWdpbik7Ci19Ci0KLS8vc3RhdGljCi12b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6TG9hZFBsdWdpbnMoY29uc3QgOjpzdGQ6OnN0cmluZyYgYXBrUGF0aCkgewotICAgIC8vIFRPRE86IFZlcmlmeSBhcGsgcGF0aCB3aXRoIHBhY2thZ2UgbWFuYWdlciBpbiBleHRyYWN0b3IgcHJvY2Vzcy4KLSAgICBBTE9HVigiTG9hZCBwbHVnaW5zIGZyb206ICVzIiwgYXBrUGF0aC5jX3N0cigpKTsKLSAgICBVcGRhdGVFeHRyYWN0b3JzKGFwa1BhdGguZW1wdHkoKSA/IG51bGxwdHIgOiBhcGtQYXRoLmNfc3RyKCkpOworICAgIHJldHVybiBDcmVhdGVJTWVkaWFFeHRyYWN0b3JGcm9tTWVkaWFFeHRyYWN0b3IoZXgsIHNvdXJjZSwgcGx1Z2luKTsKIH0KIAogc3RydWN0IEV4dHJhY3RvclBsdWdpbiA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBNZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIGRlZjsKKyAgICBFeHRyYWN0b3JEZWYgZGVmOwogICAgIHZvaWQgKmxpYkhhbmRsZTsKICAgICBTdHJpbmc4IGxpYlBhdGg7CiAgICAgU3RyaW5nOCB1dWlkU3RyaW5nOwogCi0gICAgRXh0cmFjdG9yUGx1Z2luKE1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgZGVmaW5pdGlvbiwgdm9pZCAqaGFuZGxlLCBTdHJpbmc4ICZwYXRoKQorICAgIEV4dHJhY3RvclBsdWdpbihFeHRyYWN0b3JEZWYgZGVmaW5pdGlvbiwgdm9pZCAqaGFuZGxlLCBTdHJpbmc4ICZwYXRoKQogICAgICAgICA6IGRlZihkZWZpbml0aW9uKSwgbGliSGFuZGxlKGhhbmRsZSksIGxpYlBhdGgocGF0aCkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZiBNZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmOjpleHRyYWN0b3JfdXVpZDsgaSsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mIEV4dHJhY3RvckRlZjo6ZXh0cmFjdG9yX3V1aWQ7IGkrKykgewogICAgICAgICAgICAgdXVpZFN0cmluZy5hcHBlbmRGb3JtYXQoIiUwMngiLCBkZWYuZXh0cmFjdG9yX3V1aWQuYltpXSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMjUsMTcgKzEyNCwxOCBAQAogfTsKIAogTXV0ZXggTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnUGx1Z2luTXV0ZXg7Ci1zdGQ6OnNoYXJlZF9wdHI8TGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnUGx1Z2luczsKK3N0ZDo6c2hhcmVkX3B0cjxzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z1BsdWdpbnM7CiBib29sIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z1BsdWdpbnNSZWdpc3RlcmVkID0gZmFsc2U7Citib29sIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z0lnbm9yZVZlcnNpb24gPSBmYWxzZTsKIAogLy8gc3RhdGljCi1NZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpzbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSwgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luKSB7Cit2b2lkICpNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OnNuaWZmKAorICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCisgICAgICAgIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEsIHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbiwgdWludDMyX3QgKmNyZWF0b3JWZXJzaW9uKSB7CiAgICAgKmNvbmZpZGVuY2UgPSAwLjBmOwogICAgICptZXRhID0gbnVsbHB0cjsKIAotICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBwbHVnaW5zOworICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IHBsdWdpbnM7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ1BsdWdpbk11dGV4KTsKICAgICAgICAgaWYgKCFnUGx1Z2luc1JlZ2lzdGVyZWQpIHsKQEAgLTE0NCwxMyArMTQ0LDIzIEBACiAgICAgICAgIHBsdWdpbnMgPSBnUGx1Z2luczsKICAgICB9CiAKLSAgICBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgY3VyQ3JlYXRvciA9IE5VTEw7Ci0gICAgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIGJlc3RDcmVhdG9yID0gTlVMTDsKKyAgICB2b2lkICpiZXN0Q3JlYXRvciA9IE5VTEw7CiAgICAgZm9yIChhdXRvIGl0ID0gcGx1Z2lucy0+YmVnaW4oKTsgaXQgIT0gcGx1Z2lucy0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgQUxPR1YoInNuaWZmaW5nICVzIiwgKCppdCktPmRlZi5leHRyYWN0b3JfbmFtZSk7CiAgICAgICAgIGZsb2F0IG5ld0NvbmZpZGVuY2U7CiAgICAgICAgIHZvaWQgKm5ld01ldGEgPSBudWxscHRyOwotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jIG5ld0ZyZWVNZXRhID0gbnVsbHB0cjsKLSAgICAgICAgaWYgKChjdXJDcmVhdG9yID0gKCppdCktPmRlZi5zbmlmZihzb3VyY2UsICZuZXdDb25maWRlbmNlLCAmbmV3TWV0YSwgJm5ld0ZyZWVNZXRhKSkpIHsKKyAgICAgICAgRnJlZU1ldGFGdW5jIG5ld0ZyZWVNZXRhID0gbnVsbHB0cjsKKworICAgICAgICB2b2lkICpjdXJDcmVhdG9yID0gTlVMTDsKKyAgICAgICAgaWYgKCgqaXQpLT5kZWYuZGVmX3ZlcnNpb24gPT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YxKSB7CisgICAgICAgICAgICBjdXJDcmVhdG9yID0gKHZvaWQqKSAoKml0KS0+ZGVmLnUudjIuc25pZmYoCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+d3JhcCgpLCAmbmV3Q29uZmlkZW5jZSwgJm5ld01ldGEsICZuZXdGcmVlTWV0YSk7CisgICAgICAgIH0gZWxzZSBpZiAoKCppdCktPmRlZi5kZWZfdmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIpIHsKKyAgICAgICAgICAgIGN1ckNyZWF0b3IgPSAodm9pZCopICgqaXQpLT5kZWYudS52My5zbmlmZigKKyAgICAgICAgICAgICAgICAgICAgc291cmNlLT53cmFwKCksICZuZXdDb25maWRlbmNlLCAmbmV3TWV0YSwgJm5ld0ZyZWVNZXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXJDcmVhdG9yKSB7CiAgICAgICAgICAgICBpZiAobmV3Q29uZmlkZW5jZSA+ICpjb25maWRlbmNlKSB7CiAgICAgICAgICAgICAgICAgKmNvbmZpZGVuY2UgPSBuZXdDb25maWRlbmNlOwogICAgICAgICAgICAgICAgIGlmICgqbWV0YSAhPSBudWxscHRyICYmICpmcmVlTWV0YSAhPSBudWxscHRyKSB7CkBAIC0xNjAsNiArMTcwLDcgQEAKICAgICAgICAgICAgICAgICAqZnJlZU1ldGEgPSBuZXdGcmVlTWV0YTsKICAgICAgICAgICAgICAgICBwbHVnaW4gPSAqaXQ7CiAgICAgICAgICAgICAgICAgYmVzdENyZWF0b3IgPSBjdXJDcmVhdG9yOworICAgICAgICAgICAgICAgICpjcmVhdG9yVmVyc2lvbiA9ICgqaXQpLT5kZWYuZGVmX3ZlcnNpb247CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChuZXdNZXRhICE9IG51bGxwdHIgJiYgbmV3RnJlZU1ldGEgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBuZXdGcmVlTWV0YShuZXdNZXRhKTsKQEAgLTE3MywxMCArMTg0LDEwIEBACiAKIC8vIHN0YXRpYwogdm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlJlZ2lzdGVyRXh0cmFjdG9yKGNvbnN0IHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbiwKLSAgICAgICAgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCkgeworICAgICAgICBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKICAgICAvLyBzYW5pdHkgY2hlY2sgY2hlY2sgc3RydWN0IHZlcnNpb24sIHV1aWQsIG5hbWUKLSAgICBpZiAocGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24gPT0gMAotICAgICAgICAgICAgfHwgcGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24gPiBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04pIHsKKyAgICBpZiAocGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24gIT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YxICYmCisgICAgICAgICAgICBwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbiAhPSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIpIHsKICAgICAgICAgQUxPR0UoImRvbid0IHVuZGVyc3RhbmQgZXh0cmFjdG9yIGZvcm1hdCAldSwgaWdub3JpbmcuIiwgcGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24pOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTkyLDcgKzIwMyw3IEBACiAgICAgZm9yIChhdXRvIGl0ID0gcGx1Z2luTGlzdC5iZWdpbigpOyBpdCAhPSBwbHVnaW5MaXN0LmVuZCgpOyArK2l0KSB7CiAgICAgICAgIGlmIChtZW1jbXAoJigoKml0KS0+ZGVmLmV4dHJhY3Rvcl91dWlkKSwgJnBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl91dWlkLCAxNikgPT0gMCkgewogICAgICAgICAgICAgLy8gdGhlcmUncyBhbHJlYWR5IGFuIGV4dHJhY3RvciB3aXRoIHRoZSBzYW1lIHV1aWQKLSAgICAgICAgICAgIGlmICgoKml0KS0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uIDwgcGx1Z2luLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24pIHsKKyAgICAgICAgICAgIGlmIChnSWdub3JlVmVyc2lvbiB8fCAoKml0KS0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uIDwgcGx1Z2luLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24pIHsKICAgICAgICAgICAgICAgICAvLyB0aGlzIG9uZSBpcyBuZXdlciwgcmVwbGFjZSB0aGUgb2xkIG9uZQogICAgICAgICAgICAgICAgIEFMT0dXKCJyZXBsYWNpbmcgZXh0cmFjdG9yICclcycgdmVyc2lvbiAldSB3aXRoIHZlcnNpb24gJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLT5kZWYuZXh0cmFjdG9yX25hbWUsCkBAIC0yMTQsNjYgKzIyNSwyOCBAQAogfQogCiAvL3N0YXRpYwotdm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlJlZ2lzdGVyRXh0cmFjdG9yc0luQXBrKAotICAgICAgICBjb25zdCBjaGFyICphcGtQYXRoLCBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KSB7Ci0gICAgQUxPR1YoInNlYXJjaCBmb3IgcGx1Z2lucyBhdCAlcyIsIGFwa1BhdGgpOwotICAgIFppcEFyY2hpdmVIYW5kbGUgemlwSGFuZGxlOwotICAgIGludDMyX3QgcmV0ID0gT3BlbkFyY2hpdmUoYXBrUGF0aCwgJnppcEhhbmRsZSk7Ci0gICAgaWYgKHJldCA9PSAwKSB7Ci0gICAgICAgIGNoYXIgYWJpW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgICAgIHByb3BlcnR5X2dldCgicm8ucHJvZHVjdC5jcHUuYWJpIiwgYWJpLCAiYXJtNjQtdjhhIik7Ci0gICAgICAgIFN0cmluZzggcHJlZml4OCA9IFN0cmluZzg6OmZvcm1hdCgibGliLyVzLyIsIGFiaSk7Ci0gICAgICAgIFppcFN0cmluZyBwcmVmaXgocHJlZml4OC5jX3N0cigpKTsKLSAgICAgICAgWmlwU3RyaW5nIHN1ZmZpeCgiZXh0cmFjdG9yLnNvIik7Ci0gICAgICAgIHZvaWQqIGNvb2tpZTsKLSAgICAgICAgcmV0ID0gU3RhcnRJdGVyYXRpb24oemlwSGFuZGxlLCAmY29va2llLCAmcHJlZml4LCAmc3VmZml4KTsKLSAgICAgICAgaWYgKHJldCA9PSAwKSB7Ci0gICAgICAgICAgICBaaXBFbnRyeSBlbnRyeTsKLSAgICAgICAgICAgIFppcFN0cmluZyBuYW1lOwotICAgICAgICAgICAgd2hpbGUgKE5leHQoY29va2llLCAmZW50cnksICZuYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nOCBsaWJQYXRoID0gU3RyaW5nOChhcGtQYXRoKSArICIhLyIgKwotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KG5hbWUubmFtZSksIG5hbWUubmFtZV9sZW5ndGgpOwotICAgICAgICAgICAgICAgIC8vIFRPRE86IE9wZW4gd2l0aCBhIGxpbmtlciBuYW1lc3BhY2Ugc28gdGhhdCBpdCBjYW4gYmUgbGlua2VkIHdpdGggc3ViLWxpYnJhcmllcwotICAgICAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgYXBrIGluc3RlYWQgb2Ygc3lzdGVtIGxpYnJhcmllcyBhbHJlYWR5IGxvYWRlZC4KLSAgICAgICAgICAgICAgICB2b2lkICpsaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aC5zdHJpbmcoKSwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKLSAgICAgICAgICAgICAgICBpZiAobGliSGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpHZXRFeHRyYWN0b3JEZWYgZ2V0RGVmID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNZWRpYUV4dHJhY3Rvcjo6R2V0RXh0cmFjdG9yRGVmKSBkbHN5bShsaWJIYW5kbGUsICJHRVRFWFRSQUNUT1JERUYiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldERlZikgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyaW5nIHNuaWZmZXIgZm9yICVzIiwgbGliUGF0aC5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlckV4dHJhY3RvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dHJhY3RvclBsdWdpbihnZXREZWYoKSwgbGliSGFuZGxlLCBsaWJQYXRoKSwgcGx1Z2luTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgZG9lcyBub3QgY29udGFpbiBzbmlmZmVyIiwgbGliUGF0aC5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkbGNsb3NlKGxpYkhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY291bGRuJ3QgZGxvcGVuKCVzKSAlcyIsIGxpYlBhdGguc3RyaW5nKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgRW5kSXRlcmF0aW9uKGNvb2tpZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiY291bGRuJ3QgZmluZCBwbHVnaW5zIGZyb20gJXMsICVkIiwgYXBrUGF0aCwgcmV0KTsKLSAgICAgICAgfQotICAgICAgICBDbG9zZUFyY2hpdmUoemlwSGFuZGxlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiY291bGRuJ3Qgb3BlbiglcykgJWQiLCBhcGtQYXRoLCByZXQpOwotICAgIH0KLX0KLQotLy9zdGF0aWMKLXZvaWQgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpSZWdpc3RlckV4dHJhY3RvcnNJblN5c3RlbSgKLSAgICAgICAgY29uc3QgY2hhciAqbGliRGlyUGF0aCwgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCkgewordm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlJlZ2lzdGVyRXh0cmFjdG9ycygKKyAgICAgICAgY29uc3QgY2hhciAqbGliRGlyUGF0aCwgY29uc3QgYW5kcm9pZF9kbGV4dGluZm8qIGRsZXh0aW5mbywKKyAgICAgICAgc3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KSB7CiAgICAgQUxPR1YoInNlYXJjaCBmb3IgcGx1Z2lucyBhdCAlcyIsIGxpYkRpclBhdGgpOworCiAgICAgRElSICpsaWJEaXIgPSBvcGVuZGlyKGxpYkRpclBhdGgpOwogICAgIGlmIChsaWJEaXIpIHsKICAgICAgICAgc3RydWN0IGRpcmVudCogbGliRW50cnk7CiAgICAgICAgIHdoaWxlICgobGliRW50cnkgPSByZWFkZGlyKGxpYkRpcikpKSB7CisgICAgICAgICAgICBpZiAobGliRW50cnktPmRfbmFtZVswXSA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIFN0cmluZzggbGliUGF0aCA9IFN0cmluZzgobGliRGlyUGF0aCkgKyAiLyIgKyBsaWJFbnRyeS0+ZF9uYW1lOwotICAgICAgICAgICAgdm9pZCAqbGliSGFuZGxlID0gZGxvcGVuKGxpYlBhdGguc3RyaW5nKCksIFJUTERfTk9XIHwgUlRMRF9MT0NBTCk7CisgICAgICAgICAgICBpZiAoIWxpYlBhdGguY29udGFpbnMoImV4dHJhY3Rvci5zbyIpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkICpsaWJIYW5kbGUgPSBhbmRyb2lkX2Rsb3Blbl9leHQoCisgICAgICAgICAgICAgICAgICAgIGxpYlBhdGguc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIFJUTERfTk9XIHwgUlRMRF9MT0NBTCwgZGxleHRpbmZvKTsKICAgICAgICAgICAgIGlmIChsaWJIYW5kbGUpIHsKLSAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6R2V0RXh0cmFjdG9yRGVmIGdldERlZiA9Ci0gICAgICAgICAgICAgICAgICAgIChNZWRpYUV4dHJhY3Rvcjo6R2V0RXh0cmFjdG9yRGVmKSBkbHN5bShsaWJIYW5kbGUsICJHRVRFWFRSQUNUT1JERUYiKTsKKyAgICAgICAgICAgICAgICBHZXRFeHRyYWN0b3JEZWYgZ2V0RGVmID0KKyAgICAgICAgICAgICAgICAgICAgKEdldEV4dHJhY3RvckRlZikgZGxzeW0obGliSGFuZGxlLCAiR0VURVhUUkFDVE9SREVGIik7CiAgICAgICAgICAgICAgICAgaWYgKGdldERlZikgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJpbmcgc25pZmZlciBmb3IgJXMiLCBsaWJQYXRoLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJFeHRyYWN0b3IoCkBAIC0yODYsMzkgKzI1OSw4NSBAQAogICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBkbG9wZW4oJXMpICVzIiwgbGliUGF0aC5zdHJpbmcoKSwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCiAgICAgICAgIGNsb3NlZGlyKGxpYkRpcik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0UoImNvdWxkbid0IG9wZW5kaXIoJXMpIiwgbGliRGlyUGF0aCk7CiAgICAgfQogfQogCitzdGF0aWMgYm9vbCBjb21wYXJlRnVuYyhjb25zdCBzcDxFeHRyYWN0b3JQbHVnaW4+JiBmaXJzdCwgY29uc3Qgc3A8RXh0cmFjdG9yUGx1Z2luPiYgc2Vjb25kKSB7CisgICAgcmV0dXJuIHN0cmNtcChmaXJzdC0+ZGVmLmV4dHJhY3Rvcl9uYW1lLCBzZWNvbmQtPmRlZi5leHRyYWN0b3JfbmFtZSkgPCAwOworfQorCitzdGF0aWMgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBnU3VwcG9ydGVkRXh0ZW5zaW9uczsKKwogLy8gc3RhdGljCi12b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6VXBkYXRlRXh0cmFjdG9ycyhjb25zdCBjaGFyICpuZXdVcGRhdGVBcGtQYXRoKSB7Cit2b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6VXBkYXRlRXh0cmFjdG9ycygpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ1BsdWdpbk11dGV4KTsKLSAgICBpZiAobmV3VXBkYXRlQXBrUGF0aCAhPSBudWxscHRyKSB7Ci0gICAgICAgIGdQbHVnaW5zUmVnaXN0ZXJlZCA9IGZhbHNlOwotICAgIH0KKwogICAgIGlmIChnUGx1Z2luc1JlZ2lzdGVyZWQpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBuZXdMaXN0KG5ldyBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+KCkpOworICAgIGdJZ25vcmVWZXJzaW9uID0gcHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLmV4dHJhY3Rvci5pZ25vcmVfdmVyc2lvbiIsIGZhbHNlKTsKIAotICAgIFJlZ2lzdGVyRXh0cmFjdG9yc0luU3lzdGVtKCIvc3lzdGVtL2xpYiIKKyAgICBzdGQ6OnNoYXJlZF9wdHI8c3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBuZXdMaXN0KG5ldyBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4oKSk7CisKKyAgICBhbmRyb2lkX25hbWVzcGFjZV90ICptZWRpYU5zID0gYW5kcm9pZF9nZXRfZXhwb3J0ZWRfbmFtZXNwYWNlKCJtZWRpYSIpOworICAgIGlmIChtZWRpYU5zICE9IE5VTEwpIHsKKyAgICAgICAgY29uc3QgYW5kcm9pZF9kbGV4dGluZm8gZGxleHRpbmZvID0geworICAgICAgICAgICAgLmZsYWdzID0gQU5EUk9JRF9ETEVYVF9VU0VfTkFNRVNQQUNFLAorICAgICAgICAgICAgLmxpYnJhcnlfbmFtZXNwYWNlID0gbWVkaWFOcywKKyAgICAgICAgfTsKKyAgICAgICAgUmVnaXN0ZXJFeHRyYWN0b3JzKCIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS9saWIiCisjaWZkZWYgX19MUDY0X18KKyAgICAgICAgICAgICAgICAiNjQiCisjZW5kaWYKKyAgICAgICAgICAgICAgICAiL2V4dHJhY3RvcnMiLCAmZGxleHRpbmZvLCAqbmV3TGlzdCk7CisKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiY291bGRuJ3QgZmluZCBtZWRpYSBuYW1lc3BhY2UuIik7CisgICAgfQorCisgICAgUmVnaXN0ZXJFeHRyYWN0b3JzKCIvc3lzdGVtL2xpYiIKICNpZmRlZiBfX0xQNjRfXwogICAgICAgICAgICAgIjY0IgogI2VuZGlmCi0gICAgICAgICAgICAiL2V4dHJhY3RvcnMiLCAqbmV3TGlzdCk7CisgICAgICAgICAgICAiL2V4dHJhY3RvcnMiLCBOVUxMLCAqbmV3TGlzdCk7CiAKLSAgICBpZiAobmV3VXBkYXRlQXBrUGF0aCAhPSBudWxscHRyKSB7Ci0gICAgICAgIFJlZ2lzdGVyRXh0cmFjdG9yc0luQXBrKG5ld1VwZGF0ZUFwa1BhdGgsICpuZXdMaXN0KTsKKyAgICBuZXdMaXN0LT5zb3J0KGNvbXBhcmVGdW5jKTsKKyAgICBnUGx1Z2lucyA9IG5ld0xpc3Q7CisKKyAgICBmb3IgKGF1dG8gaXQgPSBnUGx1Z2lucy0+YmVnaW4oKTsgaXQgIT0gZ1BsdWdpbnMtPmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmICgoKml0KS0+ZGVmLmRlZl92ZXJzaW9uID09IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMikgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7OyBpKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHQgPSAoKml0KS0+ZGVmLnUudjMuc3VwcG9ydGVkX3R5cGVzW2ldOworICAgICAgICAgICAgICAgIGlmIChleHQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ1N1cHBvcnRlZEV4dGVuc2lvbnMuaW5zZXJ0KHN0ZDo6c3RyaW5nKGV4dCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCi0gICAgZ1BsdWdpbnMgPSBuZXdMaXN0OwogICAgIGdQbHVnaW5zUmVnaXN0ZXJlZCA9IHRydWU7CiB9CiAKKy8vIHN0YXRpYworc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmdldFN1cHBvcnRlZFR5cGVzKCkgeworICAgIGlmIChnZXR1aWQoKSA9PSBBSURfTUVESUFfRVgpIHsKKyAgICAgICAgcmV0dXJuIGdTdXBwb3J0ZWRFeHRlbnNpb25zOworICAgIH0KKyAgICBBTE9HVigiZ2V0IHNlcnZpY2UgbWFuYWdlciIpOworICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5leHRyYWN0b3IiKSk7CisKKyAgICBpZiAoYmluZGVyICE9IDApIHsKKyAgICAgICAgc3A8SU1lZGlhRXh0cmFjdG9yU2VydmljZT4gbWVkaWFFeFNlcnZpY2UoaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhRXh0cmFjdG9yU2VydmljZT4oYmluZGVyKSk7CisgICAgICAgIHJldHVybiBtZWRpYUV4U2VydmljZS0+Z2V0U3VwcG9ydGVkVHlwZXMoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4oKTsKK30KKwogc3RhdHVzX3QgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ1BsdWdpbk11dGV4KTsKICAgICBTdHJpbmc4IG91dDsKQEAgLTMzNSwxMiArMzU0LDI1IEBACiAgICAgICAgIG91dC5hcHBlbmQoIkF2YWlsYWJsZSBleHRyYWN0b3JzOlxuIik7CiAgICAgICAgIGlmIChnUGx1Z2luc1JlZ2lzdGVyZWQpIHsKICAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IGdQbHVnaW5zLT5iZWdpbigpOyBpdCAhPSBnUGx1Z2lucy0+ZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgICAgICBvdXQuYXBwZW5kRm9ybWF0KCIgICUyNXM6IHV1aWQoJXMpLCB2ZXJzaW9uKCV1KSwgcGF0aCglcylcbiIsCisgICAgICAgICAgICAgICAgb3V0LmFwcGVuZEZvcm1hdCgiICAlMjVzOiBwbHVnaW5fdmVyc2lvbiglZCksIHV1aWQoJXMpLCB2ZXJzaW9uKCV1KSwgcGF0aCglcykiLAogICAgICAgICAgICAgICAgICAgICAgICAgKCppdCktPmRlZi5leHRyYWN0b3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgKCppdCktPmRlZi5kZWZfdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICgqaXQpLT51dWlkU3RyaW5nLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAoKml0KS0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgKCppdCktPmxpYlBhdGguY19zdHIoKSk7CisgICAgICAgICAgICAgICAgaWYgKCgqaXQpLT5kZWYuZGVmX3ZlcnNpb24gPT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YyKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIiwgc3VwcG9ydHM6ICIpOworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDs7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSA9ICgqaXQpLT5kZWYudS52My5zdXBwb3J0ZWRfdHlwZXNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWltZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kRm9ybWF0KCIlcyAiLCBtaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJcbiIpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LmFwcGVuZCgiXG4iKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG91dC5hcHBlbmQoIiAgKG5vIHBsdWdpbnMgcmVnaXN0ZXJlZClcbiIpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYU11eGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwCmluZGV4IDk4ZjU5YjUuLjliYTJhZGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNTIsNiArNTMsOCBAQAogICAgICAgICBtV3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKGZkKTsKICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1dFQk0pIHsKICAgICAgICAgbVdyaXRlciA9IG5ldyBXZWJtV3JpdGVyKGZkKTsKKyAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX09HRykgeworICAgICAgICBtV3JpdGVyID0gbmV3IE9nZ1dyaXRlcihmZCk7CiAgICAgfQogCiAgICAgaWYgKG1Xcml0ZXIgIT0gTlVMTCkgewpAQCAtNTksNiArNjIsOCBAQAogICAgICAgICBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfSEVJRikgewogICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBrZXkgdXNlcyByZWNvcmRlciBmaWxlIHR5cGVzLgogICAgICAgICAgICAgbUZpbGVNZXRhLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG91dHB1dF9mb3JtYXQ6Ok9VVFBVVF9GT1JNQVRfSEVJRik7CisgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfT0dHKSB7CisgICAgICAgICAgICBtRmlsZU1ldGEtPnNldEludDMyKGtLZXlGaWxlVHlwZSwgb3V0cHV0X2Zvcm1hdDo6T1VUUFVUX0ZPUk1BVF9PR0cpOwogICAgICAgICB9CiAgICAgICAgIG1TdGF0ZSA9IElOSVRJQUxJWkVEOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFTb3VyY2UuY3BwCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhVHJhY2suY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFUcmFjay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODljOWIyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhVHJhY2suY3BwCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG11dGV4PgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK01lZGlhVHJhY2s6Ok1lZGlhVHJhY2soKSB7fQorCitNZWRpYVRyYWNrOjp+TWVkaWFUcmFjaygpIHt9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnNldE5vbkJsb2NraW5nKCkgeworICAgIG1Ob25CbG9ja2luZyA9IHRydWU7Cit9CisKK3ZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmNsZWFyTm9uQmxvY2tpbmcoKSB7CisgICAgbU5vbkJsb2NraW5nID0gZmFsc2U7Cit9CisKK2Jvb2wgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmdldE5vbkJsb2NraW5nKCkgY29uc3QgeworICAgIHJldHVybiBtTm9uQmxvY2tpbmc7Cit9CisKK3ZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnNldFNlZWtUbyhpbnQ2NF90IHRpbWVfdXMsIFNlZWtNb2RlIG1vZGUpIHsKKyAgICBtT3B0aW9ucyB8PSBrU2Vla1RvX09wdGlvbjsKKyAgICBtU2Vla1RpbWVVcyA9IHRpbWVfdXM7CisgICAgbVNlZWtNb2RlID0gbW9kZTsKK30KKworYm9vbCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Z2V0U2Vla1RvKAorICAgICAgICBpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3QgeworICAgICp0aW1lX3VzID0gbVNlZWtUaW1lVXM7CisgICAgKm1vZGUgPSBtU2Vla01vZGU7CisgICAgcmV0dXJuIChtT3B0aW9ucyAmIGtTZWVrVG9fT3B0aW9uKSAhPSAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLSB1bndyYXBwZXIgLS0tLS0tLS0tLS0tLS0tICovCisKK01lZGlhVHJhY2tDVW53cmFwcGVyOjpNZWRpYVRyYWNrQ1Vud3JhcHBlcihDTWVkaWFUcmFjayAqY21lZGlhdHJhY2spIHsKKyAgICB3cmFwcGVyID0gY21lZGlhdHJhY2s7CisgICAgYnVmZmVyR3JvdXAgPSBudWxscHRyOworfQorCitNZWRpYVRyYWNrQ1Vud3JhcHBlciAqTWVkaWFUcmFja0NVbndyYXBwZXI6OmNyZWF0ZShDTWVkaWFUcmFjayAqY21lZGlhdHJhY2spIHsKKyAgICBpZiAoY21lZGlhdHJhY2sgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBNZWRpYVRyYWNrQ1Vud3JhcHBlcihjbWVkaWF0cmFjayk7Cit9CisKK01lZGlhVHJhY2tDVW53cmFwcGVyOjp+TWVkaWFUcmFja0NVbndyYXBwZXIoKSB7CisgICAgd3JhcHBlci0+ZnJlZSh3cmFwcGVyLT5kYXRhKTsKKyAgICBmcmVlKHdyYXBwZXIpOworICAgIGRlbGV0ZSBidWZmZXJHcm91cDsKK30KKworc3RhdHVzX3QgTWVkaWFUcmFja0NVbndyYXBwZXI6OnN0YXJ0KCkgeworICAgIGlmIChidWZmZXJHcm91cCA9PSBudWxscHRyKSB7CisgICAgICAgIGJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXAoKTsKKyAgICB9CisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHdyYXBwZXItPnN0YXJ0KHdyYXBwZXItPmRhdGEsIGJ1ZmZlckdyb3VwLT53cmFwKCkpKTsKK30KKworc3RhdHVzX3QgTWVkaWFUcmFja0NVbndyYXBwZXI6OnN0b3AoKSB7CisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHdyYXBwZXItPnN0b3Aod3JhcHBlci0+ZGF0YSkpOworfQorCitzdGF0dXNfdCBNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYgZm9ybWF0KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOworICAgIEFNZWRpYUZvcm1hdCAqdG1wRm9ybWF0ID0gIEFNZWRpYUZvcm1hdF9mcm9tTXNnKCZtc2cpOworICAgIG1lZGlhX3N0YXR1c190IHJldCA9IHdyYXBwZXItPmdldEZvcm1hdCh3cmFwcGVyLT5kYXRhLCB0bXBGb3JtYXQpOworICAgIHNwPE1ldGFEYXRhPiBuZXdNZXRhID0gbmV3IE1ldGFEYXRhKCk7CisgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKG1zZywgbmV3TWV0YSk7CisgICAgZGVsZXRlIHRtcEZvcm1hdDsKKyAgICBmb3JtYXQgPSAqbmV3TWV0YTsKKyAgICByZXR1cm4gcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3IocmV0KTsKK30KKworc3RhdHVzX3QgTWVkaWFUcmFja0NVbndyYXBwZXI6OnJlYWQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworCisgICAgdWludDMyX3Qgb3B0cyA9IDA7CisKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXROb25CbG9ja2luZygpKSB7CisgICAgICAgIG9wdHMgfD0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6Tk9OQkxPQ0tJTkc7CisgICAgfQorCisgICAgaW50NjRfdCBzZWVrUG9zaXRpb24gPSAwOworICAgIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZTsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtQb3NpdGlvbiwgJnNlZWtNb2RlKSkgeworICAgICAgICBvcHRzIHw9IFNFRUs7CisgICAgICAgIG9wdHMgfD0gKHVpbnQzMl90KSBzZWVrTW9kZTsKKyAgICB9CisgICAgQ01lZGlhQnVmZmVyICpidWYgPSBudWxscHRyOworICAgIG1lZGlhX3N0YXR1c190IHJldCA9IHdyYXBwZXItPnJlYWQod3JhcHBlci0+ZGF0YSwgJmJ1Ziwgb3B0cywgc2Vla1Bvc2l0aW9uKTsKKyAgICBpZiAocmV0ID09IEFNRURJQV9PSyAmJiBidWYgIT0gbnVsbHB0cikgeworICAgICAgICAqYnVmZmVyID0gKE1lZGlhQnVmZmVyQmFzZSopYnVmLT5oYW5kbGU7CisgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSA9ICgqYnVmZmVyKS0+bWV0YV9kYXRhKCk7CisgICAgICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0ID0gYnVmLT5tZXRhX2RhdGEoYnVmLT5oYW5kbGUpOworICAgICAgICAvLyBvbmx5IGNvbnZlcnQgdGhlIGtleXMgd2UncmUgYWN0dWFsbHkgZXhwZWN0aW5nLCBhcyBkb2luZworICAgICAgICAvLyB0aGUgZnVsbCBjb252ZXJ0TWVzc2FnZVRvTWV0YWRhdGEoKSBmb3IgZXZlcnkgYnVmZmVyIGlzCisgICAgICAgIC8vIHRvbyBleHBlbnNpdmUKKyAgICAgICAgaW50NjRfdCB2YWw2NDsKKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdmFsNjQpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDY0KGtLZXlUaW1lLCB2YWw2NCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDY0KCJkdXJhdGlvblVzIiwgJnZhbDY0KSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIHZhbDY0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50NjQoInRhcmdldC10aW1lIiwgJnZhbDY0KSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQ2NChrS2V5VGFyZ2V0VGltZSwgdmFsNjQpOworICAgICAgICB9CisgICAgICAgIGludDMyX3QgdmFsMzI7CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigiaXMtc3luYy1mcmFtZSIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCB2YWwzMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJ0ZW1wb3JhbC1sYXllci1pZCIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJJZCwgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigidGVtcG9yYWwtbGF5ZXItY291bnQiLCAmdmFsMzIpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlUZW1wb3JhbExheWVyQ291bnQsIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoImNyeXB0by1kZWZhdWx0LWl2LXNpemUiLCAmdmFsMzIpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCB2YWwzMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJjcnlwdG8tbW9kZSIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoImNyeXB0by1lbmNyeXB0ZWQtYnl0ZS1ibG9jayIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUVuY3J5cHRlZEJ5dGVCbG9jaywgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigiY3J5cHRvLXNraXAtYnl0ZS1ibG9jayIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVNraXBCeXRlQmxvY2ssIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoInZhbGlkLXNhbXBsZXMiLCAmdmFsMzIpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlWYWxpZFNhbXBsZXMsIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBzcDxBQnVmZmVyPiB2YWxidWY7CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRCdWZmZXIoImNyeXB0by1wbGFpbi1zaXplcyIsICZ2YWxidWYpKSB7CisgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleVBsYWluU2l6ZXMsCisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZTo6VHlwZTo6VFlQRV9OT05FLCB2YWxidWYtPmRhdGEoKSwgdmFsYnVmLT5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRCdWZmZXIoImNyeXB0by1lbmNyeXB0ZWQtc2l6ZXMiLCAmdmFsYnVmKSkgeworICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigiY3J5cHRvLWtleSIsICZ2YWxidWYpKSB7CisgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigiY3J5cHRvLWl2IiwgJnZhbGJ1ZikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvSVYsCisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZTo6VHlwZTo6VFlQRV9OT05FLCB2YWxidWYtPmRhdGEoKSwgdmFsYnVmLT5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRCdWZmZXIoInNlaSIsICZ2YWxidWYpKSB7CisgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleVNFSSwKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigiYXVkaW8tcHJlc2VudGF0aW9uLWluZm8iLCAmdmFsYnVmKSkgeworICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8sCisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZTo6VHlwZTo6VFlQRV9OT05FLCB2YWxidWYtPmRhdGEoKSwgdmFsYnVmLT5zaXplKCkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHJldCk7Cit9CisKK2Jvb2wgTWVkaWFUcmFja0NVbndyYXBwZXI6OnN1cHBvcnROb25ibG9ja2luZ1JlYWQoKSB7CisgICAgcmV0dXJuIHdyYXBwZXItPnN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkKHdyYXBwZXItPmRhdGEpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmNwcAppbmRleCAwNGY2YWRlLi5kYmMyODdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmNwcApAQCAtMTYsMTUgKzE2LDI1IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTWV0YURhdGFVdGlscyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogYm9vbCBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChkYXRhID09IG51bGxwdHIgfHwgc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBpbnQzMl90IHdpZHRoOwogICAgIGludDMyX3QgaGVpZ2h0OwogICAgIGludDMyX3Qgc2FyV2lkdGg7CkBAIC00NiwyMSArNTYsODYgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtZXRhID09IG51bGxwdHIgfHwgZGF0YSA9PSBudWxscHRyIHx8IHNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50MzJfdCB3aWR0aDsKKyAgICBpbnQzMl90IGhlaWdodDsKKyAgICBpbnQzMl90IHNhcldpZHRoOworICAgIGludDMyX3Qgc2FySGVpZ2h0OworICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcigodm9pZCopZGF0YSwgIHNpemUpOworICAgIHNwPEFCdWZmZXI+IGNzZCA9IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShhY2Nlc3NVbml0LCAmd2lkdGgsICZoZWlnaHQsICZzYXJXaWR0aCwgJnNhckhlaWdodCk7CisgICAgaWYgKGNzZCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgY3NkLT5kYXRhKCksIGNzZC0+c2l6ZSgpKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgd2lkdGgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgaGVpZ2h0KTsKKyAgICBpZiAoc2FyV2lkdGggPiAwICYmIHNhckhlaWdodCA+IDApIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FSX1dJRFRILCBzYXJXaWR0aCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBUl9IRUlHSFQsIHNhckhlaWdodCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKGRhdGEgPT0gbnVsbHB0ciB8fCBzaXplIDwgNykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUJpdFJlYWRlciBiaXRzKGRhdGEsIHNpemUpOworCisgICAgLy8gYWR0c19maXhlZF9oZWFkZXIKKworICAgIGlmIChiaXRzLmdldEJpdHMoMTIpICE9IDB4ZmZmdSkgeworICAgICAgICBBTE9HRSgiV3JvbmcgYXRkc19maXhlZF9oZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJpdHMuc2tpcEJpdHMoNCk7ICAvLyBJRCwgbGF5ZXIsIHByb3RlY3Rpb25fYWJzZW50CisKKyAgICB1bnNpZ25lZCBwcm9maWxlID0gYml0cy5nZXRCaXRzKDIpOworICAgIGlmIChwcm9maWxlID09IDN1KSB7CisgICAgICAgIEFMT0dFKCJwcm9maWxlIHNob3VsZCBub3QgYmUgMyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXggPSBiaXRzLmdldEJpdHMoNCk7CisgICAgYml0cy5nZXRCaXRzKDEpOyAgLy8gcHJpdmF0ZV9iaXQKKyAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24gPSBiaXRzLmdldEJpdHMoMyk7CisgICAgaWYgKGNoYW5uZWxfY29uZmlndXJhdGlvbiA9PSAwdSkgeworICAgICAgICBBTE9HRSgiY2hhbm5lbF9jb25maWcgc2hvdWxkIG5vdCBiZSAwIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIU1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgICAgIG1ldGEsIHByb2ZpbGUsIHNhbXBsaW5nX2ZyZXFfaW5kZXgsIGNoYW5uZWxfY29uZmlndXJhdGlvbikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1ldGEuc2V0SW50MzIoa0tleUlzQURUUywgdHJ1ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKIGJvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCi0gICAgICAgIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCi0gICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbikgeworICAgICAgICB1aW50OF90ICpjc2QsIC8qIG91dCAqLworICAgICAgICBzaXplX3QgKmVzZHNfc2l6ZSwgLyogaW4vb3V0ICovCisgICAgICAgIHVuc2lnbmVkIHByb2ZpbGUsIC8qIGluICovCisgICAgICAgIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsIC8qIGluICovCisgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbiwgLyogaW4gKi8KKyAgICAgICAgaW50MzJfdCAqc2FtcGxpbmdfcmF0ZSAvKiBvdXQgKi8KKykgewogICAgIGlmKHNhbXBsaW5nX2ZyZXFfaW5kZXggPiAxMXUpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBpbnQzMl90IHNhbXBsZVJhdGU7Ci0gICAgaW50MzJfdCBjaGFubmVsQ291bnQ7CiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga1NhbXBsaW5nRnJlcVtdID0gewogICAgICAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLCAyNDAwMCwgMjIwNTAsCiAgICAgICAgIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAKICAgICB9OwotICAgIHNhbXBsZVJhdGUgPSBrU2FtcGxpbmdGcmVxW3NhbXBsaW5nX2ZyZXFfaW5kZXhdOwotICAgIGNoYW5uZWxDb3VudCA9IGNoYW5uZWxfY29uZmlndXJhdGlvbjsKKyAgICAqc2FtcGxpbmdfcmF0ZSA9IGtTYW1wbGluZ0ZyZXFbc2FtcGxpbmdfZnJlcV9pbmRleF07CiAKICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrU3RhdGljRVNEU1tdID0gewogICAgICAgICAweDAzLCAyMiwKQEAgLTgzLDcgKzE1OCw5IEBACiAgICAgfTsKIAogICAgIHNpemVfdCBjc2RTaXplID0gc2l6ZW9mKGtTdGF0aWNFU0RTKSArIDI7Ci0gICAgdWludDhfdCAqY3NkID0gbmV3IHVpbnQ4X3RbY3NkU2l6ZV07CisgICAgaWYgKGNzZFNpemUgPiAqZXNkc19zaXplKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgbWVtY3B5KGNzZCwga1N0YXRpY0VTRFMsIHNpemVvZihrU3RhdGljRVNEUykpOwogCiAgICAgY3NkW3NpemVvZihrU3RhdGljRVNEUyldID0KQEAgLTkyLDE0ICsxNjksMTk4IEBACiAgICAgY3NkW3NpemVvZihrU3RhdGljRVNEUykgKyAxXSA9CiAgICAgICAgICgoc2FtcGxpbmdfZnJlcV9pbmRleCA8PCA3KSAmIDB4ODApIHwgKGNoYW5uZWxfY29uZmlndXJhdGlvbiA8PCAzKTsKIAorICAgICplc2RzX3NpemUgPSBjc2RTaXplOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCisgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbikgeworCisgICAgaWYoc2FtcGxpbmdfZnJlcV9pbmRleCA+IDExdSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDhfdCBjc2RbMl07CisgICAgY3NkWzBdID0gKChwcm9maWxlICsgMSkgPDwgMykgfCAoc2FtcGxpbmdfZnJlcV9pbmRleCA+PiAxKTsKKyAgICBjc2RbMV0gPSAoKHNhbXBsaW5nX2ZyZXFfaW5kZXggPDwgNykgJiAweDgwKSB8IChjaGFubmVsX2NvbmZpZ3VyYXRpb24gPDwgMyk7CisKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU2FtcGxpbmdGcmVxW10gPSB7CisgICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwKKyAgICAgICAgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMAorICAgIH07CisgICAgaW50MzJfdCBzYW1wbGVSYXRlID0ga1NhbXBsaW5nRnJlcVtzYW1wbGluZ19mcmVxX2luZGV4XTsKKworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgY3NkLCBzaXplb2YoY3NkKSk7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZVJhdGUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNoYW5uZWxfY29uZmlndXJhdGlvbik7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgdW5zaWduZWQgcHJvZmlsZSwgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwKKyAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uKSB7CisKKyAgICB1aW50OF90IGNzZFsyNF07CisgICAgc2l6ZV90IGNzZFNpemUgPSBzaXplb2YoY3NkKTsKKyAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisKKyAgICBpZiAoIU1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShjc2QsICZjc2RTaXplLCBwcm9maWxlLCBzYW1wbGluZ19mcmVxX2luZGV4LAorICAgICAgICAgICAgY2hhbm5lbF9jb25maWd1cmF0aW9uLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CiAKICAgICBtZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKLSAgICBtZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNoYW5uZWxDb3VudCk7Ci0KKyAgICBtZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNoYW5uZWxfY29uZmlndXJhdGlvbik7CiAgICAgbWV0YS5zZXREYXRhKGtLZXlFU0RTLCAwLCBjc2QsIGNzZFNpemUpOwotICAgIGRlbGV0ZSBbXSBjc2Q7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKKworc3RhdGljIHZvaWQgZXh0cmFjdEFsYnVtQXJ0KAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFMT0dWKCJleHRyYWN0QWxidW1BcnQgZnJvbSAnJXMnIiwgKGNvbnN0IGNoYXIgKilkYXRhKTsKKworICAgIHNpemVfdCBpbkxlbiA9IHN0cm5sZW4oKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKTsKKyAgICBzaXplX3QgZmxhY1NpemUgPSBpbkxlbiAvIDQgKiAzOworICAgIHVpbnQ4X3QgKmZsYWMgPSBuZXcgdWludDhfdFtmbGFjU2l6ZV07CisgICAgaWYgKCFkZWNvZGVCYXNlNjQoZmxhYywgJmZsYWNTaXplLCAoY29uc3QgY2hhciopZGF0YSkpIHsKKyAgICAgICAgQUxPR0UoIm1hbGZvcm1lZCBiYXNlNjQgZW5jb2RlZCBkYXRhLiIpOworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImdvdCBmbGFjIG9mIHNpemUgJXp1IiwgZmxhY1NpemUpOworCisgICAgdWludDMyX3QgcGljVHlwZTsKKyAgICB1aW50MzJfdCB0eXBlTGVuOworICAgIHVpbnQzMl90IGRlc2NMZW47CisgICAgdWludDMyX3QgZGF0YUxlbjsKKyAgICBjaGFyIHR5cGVbMTI4XTsKKworICAgIGlmIChmbGFjU2l6ZSA8IDgpIHsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBpY1R5cGUgPSBVMzJfQVQoZmxhYyk7CisKKyAgICBpZiAocGljVHlwZSAhPSAzKSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgZnJvbnQgY292ZXIuCisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0eXBlTGVuID0gVTMyX0FUKCZmbGFjWzRdKTsKKyAgICBpZiAodHlwZUxlbiA+IHNpemVvZih0eXBlKSAtIDEpIHsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBhYm92ZSB0aGF0IGZsYWNTaXplID49IDgKKyAgICBpZiAoZmxhY1NpemUgLSA4IDwgdHlwZUxlbikgeworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbWVtY3B5KHR5cGUsICZmbGFjWzhdLCB0eXBlTGVuKTsKKyAgICB0eXBlW3R5cGVMZW5dID0gJ1wwJzsKKworICAgIEFMT0dWKCJwaWNUeXBlID0gJWQsIHR5cGUgPSAnJXMnIiwgcGljVHlwZSwgdHlwZSk7CisKKyAgICBpZiAoIXN0cmNtcCh0eXBlLCAiLS0+IikpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBub3QgaW5saW5lIGNvdmVyIGFydCwgYnV0IGFuIGV4dGVybmFsIHVybCBpbnN0ZWFkLgorICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGZsYWNTaXplIDwgMzIgfHwgZmxhY1NpemUgLSAzMiA8IHR5cGVMZW4pIHsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRlc2NMZW4gPSBVMzJfQVQoJmZsYWNbOCArIHR5cGVMZW5dKTsKKyAgICBpZiAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gPCBkZXNjTGVuKSB7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkYXRhTGVuID0gVTMyX0FUKCZmbGFjWzggKyB0eXBlTGVuICsgNCArIGRlc2NMZW4gKyAxNl0pOworCisgICAgLy8gd2UndmUgYWxyZWFkeSBjaGVja2VkIGFib3ZlIHRoYXQgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbikgPj0gMAorICAgIGlmIChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4gPCBkYXRhTGVuKSB7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiZ290IGltYWdlIGRhdGEsICV6dSB0cmFpbGluZyBieXRlcyIsCisgICAgICAgICBmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4gLSBkYXRhTGVuKTsKKworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoZmlsZU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQsCisgICAgICAgICAgICAmZmxhY1s4ICsgdHlwZUxlbiArIDQgKyBkZXNjTGVuICsgMjBdLCBkYXRhTGVuKTsKKworICAgIGRlbGV0ZVtdIGZsYWM7Cit9CisKK3ZvaWQgcGFyc2VWb3JiaXNDb21tZW50KAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhLCBjb25zdCBjaGFyICpjb21tZW50LCBzaXplX3QgY29tbWVudExlbmd0aCkgeworICAgIC8vIEhhcHRpYyB0YWcgaXMgb25seSBrZXB0IGhlcmUgYXMgaXQgd2lsbCBvbmx5IGJlIHVzZWQgaW4gZXh0cmFjdG9yIHRvIGdlbmVyYXRlIGNoYW5uZWwgbWFzay4KKyAgICBjb25zdCBjaGFyKiBjb25zdCBoYXB0aWMgPSAiaGFwdGljIjsKKyAgICBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyICpjb25zdCBtVGFnOworICAgICAgICBjb25zdCBjaGFyICptS2V5OworICAgIH0ga01hcFtdID0geworICAgICAgICB7ICJUSVRMRSIsIEFNRURJQUZPUk1BVF9LRVlfVElUTEUgfSwKKyAgICAgICAgeyAiQVJUSVNUIiwgQU1FRElBRk9STUFUX0tFWV9BUlRJU1QgfSwKKyAgICAgICAgeyAiQUxCVU1BUlRJU1QiLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNUIH0sCisgICAgICAgIHsgIkFMQlVNIEFSVElTVCIsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QgfSwKKyAgICAgICAgeyAiQ09NUElMQVRJT04iLCBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OIH0sCisgICAgICAgIHsgIkFMQlVNIiwgQU1FRElBRk9STUFUX0tFWV9BTEJVTSB9LAorICAgICAgICB7ICJDT01QT1NFUiIsIEFNRURJQUZPUk1BVF9LRVlfQ09NUE9TRVIgfSwKKyAgICAgICAgeyAiR0VOUkUiLCBBTUVESUFGT1JNQVRfS0VZX0dFTlJFIH0sCisgICAgICAgIHsgIkFVVEhPUiIsIEFNRURJQUZPUk1BVF9LRVlfQVVUSE9SIH0sCisgICAgICAgIHsgIlRSQUNLTlVNQkVSIiwgQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSIH0sCisgICAgICAgIHsgIkRJU0NOVU1CRVIiLCBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIgfSwKKyAgICAgICAgeyAiREFURSIsIEFNRURJQUZPUk1BVF9LRVlfREFURSB9LAorICAgICAgICB7ICJZRUFSIiwgQU1FRElBRk9STUFUX0tFWV9ZRUFSIH0sCisgICAgICAgIHsgIkxZUklDSVNUIiwgQU1FRElBRk9STUFUX0tFWV9MWVJJQ0lTVCB9LAorICAgICAgICB7ICJNRVRBREFUQV9CTE9DS19QSUNUVVJFIiwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCB9LAorICAgICAgICB7ICJBTkRST0lEX0xPT1AiLCBBTUVESUFGT1JNQVRfS0VZX0xPT1AgfSwKKyAgICAgICAgeyAiQU5EUk9JRF9IQVBUSUMiLCBoYXB0aWMgfSwKKyAgICB9OworCisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOyArK2opIHsKKyAgICAgICAgICAgIHNpemVfdCB0YWdMZW4gPSBzdHJsZW4oa01hcFtqXS5tVGFnKTsKKyAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoa01hcFtqXS5tVGFnLCBjb21tZW50LCB0YWdMZW4pCisgICAgICAgICAgICAgICAgICAgICYmIGNvbW1lbnRbdGFnTGVuXSA9PSAnPScpIHsKKyAgICAgICAgICAgICAgICBpZiAoa01hcFtqXS5tS2V5ID09IEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQpIHsKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEFsYnVtQXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVNZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21tZW50W3RhZ0xlbiArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRMZW5ndGggLSB0YWdMZW4gLSAxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtNYXBbal0ubUtleSA9PSBBTUVESUFGT1JNQVRfS0VZX0xPT1ApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKCZjb21tZW50W3RhZ0xlbiArIDFdLCAidHJ1ZSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZmlsZU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTE9PUCwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtNYXBbal0ubUtleSA9PSBoYXB0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqZW5kOworICAgICAgICAgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBoYXB0aWNDaGFubmVsQ291bnQgPSBzdHJ0b2woJmNvbW1lbnRbdGFnTGVuICsgMV0sICZlbmQsIDEwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVycm5vID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihmaWxlTWV0YSwgaGFwdGljLCBoYXB0aWNDaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yKCVkKSB3aGVuIHBhcnNpbmcgaGFwdGljIGNoYW5uZWwgY291bnQiLCBlcnJubyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKGZpbGVNZXRhLCBrTWFwW2pdLm1LZXksICZjb21tZW50W3RhZ0xlbiArIDFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKaW5kZXggYTFkMzRmYy4uNTIyYzgxZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCkBAIC0yNTYsNiArMjU2LDEwIEBACiAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogfQogCit2b2lkIE51Q2FjaGVkU291cmNlMjo6Y2xvc2UoKSB7CisgICAgZGlzY29ubmVjdCgpOworfQorCiB2b2lkIE51Q2FjaGVkU291cmNlMjo6ZGlzY29ubmVjdCgpIHsKICAgICBpZiAobVNvdXJjZS0+ZmxhZ3MoKSAmIGtJc0hUVFBCYXNlZFNvdXJjZSkgewogICAgICAgICBBTE9HVigiZGlzY29ubmVjdGluZyBIVFRQQmFzZWRTb3VyY2UiKTsKQEAgLTU2NywxMiArNTcxLDE5IEBACiAgICAgcmV0dXJuIG1DYWNoZU9mZnNldCArIG1DYWNoZS0+dG90YWxTaXplKCk7CiB9CiAKLXNpemVfdCBOdUNhY2hlZFNvdXJjZTI6OmFwcHJveERhdGFSZW1haW5pbmcoc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdCB7CitzdGF0dXNfdCBOdUNhY2hlZFNvdXJjZTI6OmdldEF2YWlsYWJsZVNpemUob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgKnNpemUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBhcHByb3hEYXRhUmVtYWluaW5nX2woZmluYWxTdGF0dXMpOworICAgIHN0YXR1c190IGZpbmFsU3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICAqc2l6ZSA9IGFwcHJveERhdGFSZW1haW5pbmdfbChvZmZzZXQsICZmaW5hbFN0YXR1cyk7CisgICAgcmV0dXJuIGZpbmFsU3RhdHVzOwogfQogCi1zaXplX3QgTnVDYWNoZWRTb3VyY2UyOjphcHByb3hEYXRhUmVtYWluaW5nX2woc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdCB7CitzaXplX3QgTnVDYWNoZWRTb3VyY2UyOjphcHByb3hEYXRhUmVtYWluaW5nKHN0YXR1c190ICpmaW5hbFN0YXR1cykgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIGFwcHJveERhdGFSZW1haW5pbmdfbChtTGFzdEFjY2Vzc1BvcywgZmluYWxTdGF0dXMpOworfQorCitzaXplX3QgTnVDYWNoZWRTb3VyY2UyOjphcHByb3hEYXRhUmVtYWluaW5nX2wob2ZmNjRfdCBvZmZzZXQsIHN0YXR1c190ICpmaW5hbFN0YXR1cykgY29uc3QgewogICAgICpmaW5hbFN0YXR1cyA9IG1GaW5hbFN0YXR1czsKIAogICAgIGlmIChtRmluYWxTdGF0dXMgIT0gT0sgJiYgbU51bVJldHJpZXNMZWZ0ID4gMCkgewpAQCAtNTgwLDkgKzU5MSwxMCBAQAogICAgICAgICAqZmluYWxTdGF0dXMgPSBPSzsKICAgICB9CiAKKyAgICBvZmZzZXQgPSBvZmZzZXQgPj0gMCA/IG9mZnNldCA6IG1MYXN0QWNjZXNzUG9zOwogICAgIG9mZjY0X3QgbGFzdEJ5dGVQb3NDYWNoZWQgPSBtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpOwotICAgIGlmIChtTGFzdEFjY2Vzc1BvcyA8IGxhc3RCeXRlUG9zQ2FjaGVkKSB7Ci0gICAgICAgIHJldHVybiBsYXN0Qnl0ZVBvc0NhY2hlZCAtIG1MYXN0QWNjZXNzUG9zOworICAgIGlmIChvZmZzZXQgPCBsYXN0Qnl0ZVBvc0NhY2hlZCkgeworICAgICAgICByZXR1cm4gbGFzdEJ5dGVQb3NDYWNoZWQgLSBvZmZzZXQ7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCA0OWViNWU5Li44M2I4N2Q5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcApAQCAtMjEsMTAgKzIxLDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKLSNpbmNsdWRlICJpbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtMzQsNiArMzIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTIwNSwxNSArMjA0LDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgTnVNZWRpYUV4dHJhY3Rvcjo6ZGlzY29ubmVjdCgpIHsKLSAgICBpZiAobURhdGFTb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAvLyBkaXNjb25uZWN0IGRhdGEgc291cmNlCi0gICAgICAgIGlmIChtRGF0YVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2U6OmtJc0NhY2hpbmdEYXRhU291cmNlKSB7Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxOdUNhY2hlZFNvdXJjZTIgKj4obURhdGFTb3VyY2UuZ2V0KCkpLT5kaXNjb25uZWN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KIHN0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OnVwZGF0ZUR1cmF0aW9uQW5kQml0cmF0ZSgpIHsKICAgICBpZiAobUltcGwtPmNvdW50VHJhY2tzKCkgPiBrTWF4VHJhY2tDb3VudCkgewogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CkBAIC03OTAsMTYgKzc4MCwxMiBAQAogICAgICAgICBpbnQ2NF90ICpkdXJhdGlvblVzLCBib29sICplb3MpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCisgICAgb2ZmNjRfdCBjYWNoZWREYXRhUmVtYWluaW5nID0gLTE7CisgICAgc3RhdHVzX3QgZmluYWxTdGF0dXMgPSBtRGF0YVNvdXJjZS0+Z2V0QXZhaWxhYmxlU2l6ZSgtMSwgJmNhY2hlZERhdGFSZW1haW5pbmcpOworCiAgICAgaW50NjRfdCBiaXRyYXRlOwotICAgIGlmICgobURhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkKKyAgICBpZiAoY2FjaGVkRGF0YVJlbWFpbmluZyA+PSAwCiAgICAgICAgICAgICAmJiBnZXRUb3RhbEJpdHJhdGUoJmJpdHJhdGUpKSB7Ci0gICAgICAgIHNwPE51Q2FjaGVkU291cmNlMj4gY2FjaGVkU291cmNlID0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihtRGF0YVNvdXJjZS5nZXQoKSk7Ci0KLSAgICAgICAgc3RhdHVzX3QgZmluYWxTdGF0dXM7Ci0gICAgICAgIHNpemVfdCBjYWNoZWREYXRhUmVtYWluaW5nID0KLSAgICAgICAgICAgIGNhY2hlZFNvdXJjZS0+YXBwcm94RGF0YVJlbWFpbmluZygmZmluYWxTdGF0dXMpOwotCiAgICAgICAgICpkdXJhdGlvblVzID0gY2FjaGVkRGF0YVJlbWFpbmluZyAqIDgwMDAwMDBsbCAvIGJpdHJhdGU7CiAgICAgICAgICplb3MgPSAoZmluYWxTdGF0dXMgIT0gT0spOwogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTgwOCw0ICs3OTQsMzYgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKKy8vIFJldHVybiBPSyBpZiB3ZSBoYXZlIHJlY2VpdmVkIGFuIGF1ZGlvIHByZXNlbnRhdGlvbiBpbmZvLgorLy8gUmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU0gaWYgbm8gdHJhY2tzIGFyZSBhdmFpbGFibGUuCisvLyBSZXR1cm4gRVJST1JfVU5TVVBQT1JURUQgaWYgdGhlIHRyYWNrIGhhcyBubyBhdWRpbyBwcmVzZW50YXRpb24uCisvLyBSZXR1cm4gSU5WQUxJRF9PUEVSQVRJT04gaWYgYXVkaW8gcHJlc2VudGF0aW9uIG1ldGFkYXRhIHZlcnNpb24gZG9lcyBub3QgbWF0Y2guCitzdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjpnZXRBdWRpb1ByZXNlbnRhdGlvbnMoCisgICAgICAgIHNpemVfdCB0cmFja0luZGV4LCBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gKnByZXNlbnRhdGlvbnMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHNzaXplX3QgbWluSW5kZXggPSBmZXRjaEFsbFRyYWNrU2FtcGxlcygpOworICAgIGlmIChtaW5JbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNlbGVjdGVkVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtU2VsZWN0ZWRUcmFja3MuZWRpdEl0ZW1BdChpKTsKKworICAgICAgICBpZiAoaW5mby0+bVRyYWNrSW5kZXggPT0gdHJhY2tJbmRleCkgeworICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGEoaW5mby0+bVNhbXBsZXMuYmVnaW4oKS0+bUJ1ZmZlci0+bWV0YV9kYXRhKCkpOworCisgICAgICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICAgICAgaWYgKG1ldGEgIT0gTlVMTCAmJiBtZXRhLT5maW5kRGF0YShrS2V5QXVkaW9QcmVzZW50YXRpb25JbmZvLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgICAgIHN0ZDo6aXN0cmluZ3N0cmVhbSBpblN0cmVhbShzdGQ6OnN0cmluZyhzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSksIHNpemUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzZXJpYWxpemVBdWRpb1ByZXNlbnRhdGlvbnMoJmluU3RyZWFtLCBwcmVzZW50YXRpb25zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJUcmFjayAlenUgZG9lcyBub3QgY29udGFpbiBhbnkgYXVkaW8gcHJlc2VudGF0aW9uIiwgdHJhY2tJbmRleCk7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIlNvdXJjZSBkb2VzIG5vdCBjb250YWluIGFueSBhdWRpbyBwcmVzZW50YXRpb24iKTsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjg3YjU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmNwcApAQCAtMCwwICsxLDM5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT2dnV3JpdGVyIgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oPgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlIDxvZ2cvb2dnLmg+Cit9CisKKy8vIHN0b3JlIHRoZSBpbnQzMiB2YWx1ZSBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyLgorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlaW50KGNoYXIgKmJ1ZiwgaW50IGJhc2UsIGludDMyX3QgdmFsKSB7CisgICAgYnVmW2Jhc2UgKyAzXSA9ICgodmFsKSA+PiAyNCkgJiAweGZmOworICAgIGJ1ZltiYXNlICsgMl0gPSAoKHZhbCkgPj4gMTYpICYgMHhmZjsKKyAgICBidWZbYmFzZSArIDFdID0gKCh2YWwpID4+IDgpICYgMHhmZjsKKyAgICBidWZbYmFzZV0gPSAodmFsKSYweGZmOworfQorCisvLyBsaW5rYWdlIGJldHdlZW4gb3VyIGhlYWRlciBPZ2dTdHJlYW1TdGF0ZSBhbmQgdGhlIHVuZGVybHlpbmcgb2dnX3N0cmVhbV9zdGF0ZQorLy8gc28gdGhhdCBjb25zdW1lcnMgb2Ygb3VyIGludGVyZmFjZSBkbyBub3QgcmVxdWlyZSB0aGUgb2dnIGhlYWRlcnMgdGhlbXNlbHZlcy4KK3N0cnVjdCBPZ2dTdHJlYW1TdGF0ZSA6IHB1YmxpYyBvZ2dfc3RyZWFtX3N0YXRlIHt9OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK09nZ1dyaXRlcjo6T2dnV3JpdGVyKGludCBmZCkKKyAgICAgIDogbUZkKGR1cChmZCkpLAorICAgICAgICBtSW5pdENoZWNrKG1GZCA8IDAgPyBOT19JTklUIDogT0spIHsKKyAgICAvLyBlbXB0eQorfQorCitPZ2dXcml0ZXI6On5PZ2dXcml0ZXIoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHJlc2V0KCk7CisgICAgfQorCisgICAgaWYgKG1GZCAhPSAtMSkgeworICAgICAgICBjbG9zZShtRmQpOworICAgICAgICBtRmQgPSAtMTsKKyAgICB9CisKKyAgICBmcmVlKG1Pcyk7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitzdGF0dXNfdCBPZ2dXcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLy8gU3VwcG9ydCBpcyBsaW1pdGVkIHRvIHNpbmdsZSB0cmFjayBvZiBPcHVzIGF1ZGlvLgorICAgIGNvbnN0IGNoYXIqIG1pbWU7CisgICAgc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgY29uc3QgY2hhciogb3B1cyA9IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVM7CisgICAgaWYgKHN0cm5jYXNlY21wKG1pbWUsIG9wdXMsIHN0cmxlbihvcHVzKSkpIHsKKyAgICAgICAgQUxPR0UoIlRyYWNrICglcykgb3RoZXIgdGhhbiAlcyBpcyBub3Qgc3VwcG9ydGVkIiwgbWltZSwgb3B1cyk7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBtT3MgPSAoT2dnU3RyZWFtU3RhdGUqKSBtYWxsb2Moc2l6ZW9mKG9nZ19zdHJlYW1fc3RhdGUpKTsKKyAgICBpZiAob2dnX3N0cmVhbV9pbml0KChvZ2dfc3RyZWFtX3N0YXRlKiltT3MsIHJhbmQoKSkgPT0gLTEpIHsKKyAgICAgICAgQUxPR0UoIm9nZyBzdHJlYW0gaW5pdCBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLy8gV3JpdGUgT2dnIGhlYWRlcnMuCisgICAgaW50MzJfdCBuQ2hhbm5lbHMgPSAwOworICAgIGlmICghc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZuQ2hhbm5lbHMpKSB7CisgICAgICAgIEFMT0dFKCJNaXNzaW5nIGZvcm1hdCBrZXlzIGZvciBhdWRpbyB0cmFjayIpOworICAgICAgICBzb3VyY2UtPmdldEZvcm1hdCgpLT5kdW1wVG9Mb2coKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc291cmNlLT5nZXRGb3JtYXQoKS0+ZHVtcFRvTG9nKCk7CisKKyAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAwOworICAgIGlmICghc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgQUxPR0UoIk1pc3NpbmcgZm9ybWF0IGtleSBmb3Igc2FtcGxlIHJhdGUiKTsKKyAgICAgICAgc291cmNlLT5nZXRGb3JtYXQoKS0+ZHVtcFRvTG9nKCk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGNvbnN0IHZvaWQgKmhlYWRlcl9kYXRhOworICAgIHNpemVfdCBwYWNrZXRfc2l6ZTsKKyAgICBpZiAoIXNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmREYXRhKGtLZXlPcHVzSGVhZGVyLCAmdHlwZSwgJmhlYWRlcl9kYXRhLCAmcGFja2V0X3NpemUpKSB7CisgICAgICAgIEFMT0dFKCJvcHVzIGhlYWRlciBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgb2dnX3BhY2tldCBvcDsKKyAgICBvZ2dfcGFnZSBvZzsKKyAgICBvcC5wYWNrZXQgPSAodW5zaWduZWQgY2hhciAqKWhlYWRlcl9kYXRhOworICAgIG9wLmJ5dGVzID0gcGFja2V0X3NpemU7CisgICAgb3AuYl9vX3MgPSAxOworICAgIG9wLmVfb19zID0gMDsKKyAgICBvcC5ncmFudWxlcG9zID0gMDsKKyAgICBvcC5wYWNrZXRubyA9IDA7CisgICAgb2dnX3N0cmVhbV9wYWNrZXRpbigob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCAmb3ApOworCisgICAgaW50IHJldDsKKyAgICB3aGlsZSAoKHJldCA9IG9nZ19zdHJlYW1fZmx1c2goKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgJm9nKSkpIHsKKyAgICAgICAgaWYgKCFyZXQpIGJyZWFrOworICAgICAgICB3cml0ZShtRmQsIG9nLmhlYWRlciwgb2cuaGVhZGVyX2xlbik7CisgICAgICAgIHdyaXRlKG1GZCwgb2cuYm9keSwgb2cuYm9keV9sZW4pOworICAgIH0KKworCisgICAgY29uc3QgY2hhciogdmVuZG9yX3N0cmluZyA9ICJsaWJvcHVzIjsKKyAgICBjb25zdCBpbnQgdmVuZG9yX2xlbmd0aCA9IHN0cmxlbih2ZW5kb3Jfc3RyaW5nKTsKKyAgICBpbnQgdXNlcl9jb21tZW50X2xpc3RfbGVuZ3RoID0gMDsKKworICAgIGNvbnN0IGludCBjb21tZW50c19sZW5ndGggPSA4ICsgNCArIHZlbmRvcl9sZW5ndGggKyA0ICsgdXNlcl9jb21tZW50X2xpc3RfbGVuZ3RoOworICAgIGNoYXIqIGNvbW1lbnRzID0gKGNoYXIqKW1hbGxvYyhjb21tZW50c19sZW5ndGgpOworICAgIGlmIChjb21tZW50cyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gYWxsb2NhdGUgb2dnIGNvbW1lbnQgYnVmZmVyIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtZW1jcHkoY29tbWVudHMsICJPcHVzVGFncyIsIDgpOworICAgIHdyaXRlaW50KGNvbW1lbnRzLCA4LCB2ZW5kb3JfbGVuZ3RoKTsKKyAgICBtZW1jcHkoY29tbWVudHMgKyAxMiwgdmVuZG9yX3N0cmluZywgdmVuZG9yX2xlbmd0aCk7CisgICAgd3JpdGVpbnQoY29tbWVudHMsIDEyICsgdmVuZG9yX2xlbmd0aCwgdXNlcl9jb21tZW50X2xpc3RfbGVuZ3RoKTsKKworICAgIG9wLnBhY2tldCA9ICh1bnNpZ25lZCBjaGFyKiljb21tZW50czsKKyAgICBvcC5ieXRlcyA9IGNvbW1lbnRzX2xlbmd0aDsKKyAgICBvcC5iX29fcyA9IDA7CisgICAgb3AuZV9vX3MgPSAwOworICAgIG9wLmdyYW51bGVwb3MgPSAwOworICAgIG9wLnBhY2tldG5vID0gMTsKKyAgICBvZ2dfc3RyZWFtX3BhY2tldGluKChvZ2dfc3RyZWFtX3N0YXRlKiltT3MsICZvcCk7CisKKyAgICB3aGlsZSAoKHJldCA9IG9nZ19zdHJlYW1fZmx1c2goKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgJm9nKSkpIHsKKyAgICAgICAgaWYgKCFyZXQpIGJyZWFrOworICAgICAgICB3cml0ZShtRmQsIG9nLmhlYWRlciwgb2cuaGVhZGVyX2xlbik7CisgICAgICAgIHdyaXRlKG1GZCwgb2cuYm9keSwgb2cuYm9keV9sZW4pOworICAgIH0KKworICAgIG1Tb3VyY2UgPSBzb3VyY2U7CisgICAgZnJlZShjb21tZW50cyk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBPZ2dXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhKiAvKiBwYXJhbXMgKi8pIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChtU3RhcnRlZCAmJiBtUGF1c2VkKSB7CisgICAgICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICAgICAgbVJlc3VtZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmIChtU3RhcnRlZCkgeworICAgICAgICAvLyBBbHJlYWR5IHN0YXJ0ZWQsIGRvZXMgbm90aGluZworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RhcnQoKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOworICAgIHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKKyAgICBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJmF0dHIsIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFKTsKKworICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7CisgICAgbURvbmUgPSBmYWxzZTsKKworICAgIHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkLCAmYXR0ciwgVGhyZWFkV3JhcHBlciwgdGhpcyk7CisgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpOworCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBPZ2dXcml0ZXI6OnBhdXNlKCkgeworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6cmVzZXQoKSB7CisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgbURvbmUgPSB0cnVlOworCisgICAgdm9pZCogZHVtbXk7CisgICAgcHRocmVhZF9qb2luKG1UaHJlYWQsICZkdW1teSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGR1bW15KSk7CisgICAgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU291cmNlLT5zdG9wKCk7CisgICAgICAgIGlmIChlcnIgPT0gT0sgJiYgKHN0YXR1cyAhPSBPSyAmJiBzdGF0dXMgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkpIHsKKyAgICAgICAgICAgIGVyciA9IHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgcmV0dXJuIGVycjsKK30KKworYm9vbCBPZ2dXcml0ZXI6OmV4Y2VlZHNGaWxlU2l6ZUxpbWl0KCkgeworICAgIGlmIChtTWF4RmlsZVNpemVMaW1pdEJ5dGVzID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbUVzdGltYXRlZFNpemVCeXRlcyA+IG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXM7Cit9CisKK2Jvb2wgT2dnV3JpdGVyOjpleGNlZWRzRmlsZUR1cmF0aW9uTGltaXQoKSB7CisgICAgaWYgKG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbUVzdGltYXRlZER1cmF0aW9uVXMgPiBtTWF4RmlsZUR1cmF0aW9uTGltaXRVczsKK30KKworLy8gc3RhdGljCit2b2lkKiBPZ2dXcml0ZXI6OlRocmVhZFdyYXBwZXIodm9pZCogbWUpIHsKKyAgICByZXR1cm4gKHZvaWQqKSh1aW50cHRyX3QpIHN0YXRpY19jYXN0PE9nZ1dyaXRlcio+KG1lKS0+dGhyZWFkRnVuYygpOworfQorCitzdGF0dXNfdCBPZ2dXcml0ZXI6OnRocmVhZEZ1bmMoKSB7CisgICAgbUVzdGltYXRlZER1cmF0aW9uVXMgPSAwOworICAgIG1Fc3RpbWF0ZWRTaXplQnl0ZXMgPSAwOworICAgIGJvb2wgc3RvcHBlZFByZW1hdHVyZWx5ID0gdHJ1ZTsKKyAgICBpbnQ2NF90IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VcyA9IDA7CisgICAgaW50NjRfdCBtYXhUaW1lc3RhbXBVcyA9IDA7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisKKyAgICBwcmN0bChQUl9TRVRfTkFNRSwgKHVuc2lnbmVkIGxvbmcpIk9nZ1dyaXRlciIsIDAsIDAsIDApOworCisgICAgd2hpbGUgKCFtRG9uZSkgeworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UqIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIGVyciA9IG1Tb3VyY2UtPnJlYWQoJmJ1ZmZlcik7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byByZWFkIG5leHQgYnVmZmVyIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtRXN0aW1hdGVkU2l6ZUJ5dGVzICs9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgIGlmIChleGNlZWRzRmlsZVNpemVMaW1pdCgpKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywgTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRklMRVNJWkVfUkVBQ0hFRCwgMCk7CisgICAgICAgICAgICBBTE9HVygiZXN0aW1hdGVkIHNpemUoJSIgUFJJZDY0ICIpIGV4Y2VlZHMgbGltaXQgKCUiIFBSSWQ2NCAiKSIsCisgICAgICAgICAgICAgICAgICBtRXN0aW1hdGVkU2l6ZUJ5dGVzLCBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBpc0NvZGVjU3BlY2lmaWM7CisgICAgICAgIGlmICgoYnVmZmVyLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoa0tleUlzQ29kZWNDb25maWcsICZpc0NvZGVjU3BlY2lmaWMpCisgICAgICAgICAgICAgJiYgaXNDb2RlY1NwZWNpZmljKQorICAgICAgICAgICAgfHwgSXNPcHVzSGVhZGVyKCh1aW50OF90KilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJEcm9wIGNvZGVjIHNwZWNpZmljIGluZm8gYnVmZmVyIik7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXM7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZXN0YW1wVXMpKTsKKyAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbUVzdGltYXRlZER1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgIG1Fc3RpbWF0ZWREdXJhdGlvblVzID0gdGltZXN0YW1wVXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1SZXN1bWVkKSB7CisgICAgICAgICAgICBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgKz0gKHRpbWVzdGFtcFVzIC0gbWF4VGltZXN0YW1wVXMgLSAyMDAwMCk7CisgICAgICAgICAgICBtUmVzdW1lZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdGltZXN0YW1wVXMgLT0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOworCisgICAgICAgIEFMT0dWKCJ0aW1lIHN0YW1wOiAlIiBQUklkNjQgIiwgcHJldmlvdXMgcGF1c2VkIGR1cmF0aW9uOiAlIiBQUklkNjQsIHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMpOworICAgICAgICBpZiAodGltZXN0YW1wVXMgPiBtYXhUaW1lc3RhbXBVcykgeworICAgICAgICAgICAgbWF4VGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleGNlZWRzRmlsZUR1cmF0aW9uTGltaXQoKSkgeworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgbm90aWZ5KE1FRElBX1JFQ09SREVSX0VWRU5UX0lORk8sIE1FRElBX1JFQ09SREVSX0lORk9fTUFYX0RVUkFUSU9OX1JFQUNIRUQsIDApOworICAgICAgICAgICAgQUxPR1coImVzdGltYXRlZCBkdXJhdGlvbiglIiBQUklkNjQgIiB1cykgZXhjZWVkcyBsaW1pdCglIiBQUklkNjQgIiB1cykiLAorICAgICAgICAgICAgICAgICAgbUVzdGltYXRlZER1cmF0aW9uVXMsIG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgb2dnX3BhY2tldCBvcDsKKyAgICAgICAgb2dnX3BhZ2Ugb2c7CisgICAgICAgIG9wLnBhY2tldCA9ICh1aW50OF90KilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgICAgIG9wLmJ5dGVzID0gKGxvbmcpYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgb3AuYl9vX3MgPSAwOworICAgICAgICBvcC5lX29fcyA9IG1SZWFjaGVkRU9TID8gMSA6IDA7CisgICAgICAgIC8vIGdyYW51bGVwb3MgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBQQ00gYXVkaW8gc2FtcGxlcyBAIDQ4IGtIeiwgdXAgdG8gYW5kCisgICAgICAgIC8vIGluY2x1ZGluZyB0aGUgY3VycmVudCBwYWNrZXQuCisgICAgICAgIG9nZ19pbnQ2NF90IGdyYW51bGVwb3MgPSAoNDgwMDAgKiBtRXN0aW1hdGVkRHVyYXRpb25VcykgLyAxMDAwMDAwOworICAgICAgICBvcC5ncmFudWxlcG9zID0gZ3JhbnVsZXBvczsKKworICAgICAgICAvLyBIZWFkZXJzIGFyZSBhdCBwYWNrZXRzIDAgYW5kIDEuCisgICAgICAgIG9wLnBhY2tldG5vID0gMiArIChvZ2dfaW50MzJfdCltQ3VycmVudFBhY2tldElkKys7CisgICAgICAgIG9nZ19zdHJlYW1fcGFja2V0aW4oKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgJm9wKTsKKyAgICAgICAgc2l6ZV90IG4gPSAwOworCisgICAgICAgIHdoaWxlIChvZ2dfc3RyZWFtX2ZsdXNoKChvZ2dfc3RyZWFtX3N0YXRlKiltT3MsICZvZykgPiAwKSB7CisgICAgICAgICAgICB3cml0ZShtRmQsIG9nLmhlYWRlciwgb2cuaGVhZGVyX2xlbik7CisgICAgICAgICAgICB3cml0ZShtRmQsIG9nLmJvZHksIG9nLmJvZHlfbGVuKTsKKyAgICAgICAgICAgIG4gPSBuICsgb2cuaGVhZGVyX2xlbiArIG9nLmJvZHlfbGVuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG4gPCBidWZmZXItPnJhbmdlX2xlbmd0aCgpKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICBlcnIgPSBFUlJPUl9JTzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzdG9wcGVkUHJlbWF0dXJlbHkgPSBmYWxzZTsKKworICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLyBlbmQgb2Ygc3RyZWFtIGlzIGFuIG9rIHRoaW5nCisgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGVyciA9IE9LOworICAgIH0KKworICAgIGlmIChlcnIgPT0gT0sgJiYgc3RvcHBlZFByZW1hdHVyZWx5KSB7CisgICAgICAgIGVyciA9IEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjbG9zZShtRmQpOworICAgIG1GZCA9IC0xOworICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK2Jvb2wgT2dnV3JpdGVyOjpyZWFjaGVkRU9TKCkgeworICAgIHJldHVybiBtUmVhY2hlZEVPUzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmNwcAppbmRleCA5NmI4OTZiLi44OTEwNDYzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuY3BwCkBAIC0yMSw4ICsyMSw4IEBACiAjZGVmaW5lIE9NWF9BTkRST0lEX0NPTVBJTEVfQVNfMzJCSVRfT05fNjRCSVRfUExBVEZPUk1TCiAjZW5kaWYKIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuaD4KQEAgLTUzLDE4ICs1MywxMyBAQAogbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8gewogCiBib29sIGhhc1ByZWZpeChjb25zdCBoaWRsX3N0cmluZyYgcywgY29uc3QgY2hhciogcHJlZml4KSB7Ci0gICAgcmV0dXJuIHN0cm5jbXAocy5jX3N0cigpLCBwcmVmaXgsIHN0cmxlbihwcmVmaXgpKSA9PSAwOworICAgIHJldHVybiBzdHJuY2FzZWNtcChzLmNfc3RyKCksIHByZWZpeCwgc3RybGVuKHByZWZpeCkpID09IDA7CiB9CiAKIHN0YXR1c190IHF1ZXJ5Q2FwYWJpbGl0aWVzKAotICAgICAgICBjb25zdCBJT214U3RvcmU6Ok5vZGVJbmZvJiBub2RlLCBjb25zdCBjaGFyKiBtaW1lLCBib29sIGlzRW5jb2RlciwKKyAgICAgICAgY29uc3QgSU9teFN0b3JlOjpOb2RlSW5mbyYgbm9kZSwgY29uc3QgY2hhciogbWVkaWFUeXBlLCBib29sIGlzRW5jb2RlciwKICAgICAgICAgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlciogY2FwcykgewogICAgIHNwPEFDb2RlYz4gY29kZWMgPSBuZXcgQUNvZGVjKCk7Ci0gICAgc3RhdHVzX3QgZXJyID0gY29kZWMtPnF1ZXJ5Q2FwYWJpbGl0aWVzKAotICAgICAgICAgICAgbm9kZS5vd25lci5jX3N0cigpLCBub2RlLm5hbWUuY19zdHIoKSwgbWltZSwgaXNFbmNvZGVyLCBjYXBzKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQogICAgIGZvciAoY29uc3QgYXV0byYgYXR0cmlidXRlIDogbm9kZS5hdHRyaWJ1dGVzKSB7CiAgICAgICAgIC8vIEFsbCBmZWF0dXJlcyBoYXZlIGFuIGludDMyIHZhbHVlIGV4Y2VwdAogICAgICAgICAvLyAiZmVhdHVyZS1iaXRyYXRlLW1vZGVzIiwgd2hpY2ggaGFzIGEgc3RyaW5nIHZhbHVlLgpAQCAtODEsMTIgKzc2LDE5IEBACiAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5rZXkuY19zdHIoKSwgYXR0cmlidXRlLnZhbHVlLmNfc3RyKCkpOwogICAgICAgICB9CiAgICAgfQorICAgIC8vIHF1ZXJ5IGNhcGFiaWxpdGllcyBtYXkgcmVtb3ZlIGNhcGFiaWxpdGllcyB0aGF0IGFyZSBub3QgYWN0dWFsbHkgc3VwcG9ydGVkIGJ5IHRoZSBjb2RlYworICAgIHN0YXR1c190IGVyciA9IGNvZGVjLT5xdWVyeUNhcGFiaWxpdGllcygKKyAgICAgICAgICAgIG5vZGUub3duZXIuY19zdHIoKSwgbm9kZS5uYW1lLmNfc3RyKCksIG1lZGlhVHlwZSwgaXNFbmNvZGVyLCBjYXBzKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAogfSAgLy8gdW5uYW1lZCBuYW1lc3BhY2UKIAotT214SW5mb0J1aWxkZXI6Ok9teEluZm9CdWlsZGVyKCkgeworT214SW5mb0J1aWxkZXI6Ok9teEluZm9CdWlsZGVyKGJvb2wgYWxsb3dTdXJmYWNlRW5jb2RlcnMpCisgICAgOiBtQWxsb3dTdXJmYWNlRW5jb2RlcnMoYWxsb3dTdXJmYWNlRW5jb2RlcnMpIHsKIH0KIAogc3RhdHVzX3QgT214SW5mb0J1aWxkZXI6OmJ1aWxkTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RXcml0ZXIqIHdyaXRlcikgewpAQCAtMTM0LDEwNyArMTM2LDg3IEBACiAgICAgLy8gQ29udmVydCByb2xlcyB0byBsaXN0cyBvZiBjb2RlY3MKIAogICAgIC8vIGNvZGVjIG5hbWUgLT4gaW5kZXggaW50byBzd0NvZGVjcy9od0NvZGVjcwotICAgIHN0ZDo6bWFwPGhpZGxfc3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+PgotICAgICAgICAgICAgc3dDb2RlY05hbWUySW5mbywgaHdDb2RlY05hbWUySW5mbzsKKyAgICBzdGQ6Om1hcDxoaWRsX3N0cmluZywgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPj4gY29kZWNOYW1lMkluZm87CiAKLSAgICBjaGFyIHJhbmtbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICB1aW50MzJfdCBkZWZhdWx0UmFuayA9IDB4MTAwOwotICAgIGlmIChwcm9wZXJ0eV9nZXQoImRlYnVnLnN0YWdlZnJpZ2h0Lm9teF9kZWZhdWx0X3JhbmsiLCByYW5rLCBudWxscHRyKSkgewotICAgICAgICBkZWZhdWx0UmFuayA9IHN0ZDo6c3RydG91bChyYW5rLCBudWxscHRyLCAxMCk7Ci0gICAgfQorICAgIHVpbnQzMl90IGRlZmF1bHRSYW5rID0KKyAgICAgICAgOjphbmRyb2lkOjpiYXNlOjpHZXRVaW50UHJvcGVydHkoImRlYnVnLnN0YWdlZnJpZ2h0Lm9teF9kZWZhdWx0X3JhbmsiLCAweDEwMHUpOworICAgIHVpbnQzMl90IGRlZmF1bHRTd0F1ZGlvUmFuayA9CisgICAgICAgIDo6YW5kcm9pZDo6YmFzZTo6R2V0VWludFByb3BlcnR5KCJkZWJ1Zy5zdGFnZWZyaWdodC5vbXhfZGVmYXVsdF9yYW5rLnN3LWF1ZGlvIiwgMHgxMHUpOworICAgIHVpbnQzMl90IGRlZmF1bHRTd090aGVyUmFuayA9CisgICAgICAgIDo6YW5kcm9pZDo6YmFzZTo6R2V0VWludFByb3BlcnR5KCJkZWJ1Zy5zdGFnZWZyaWdodC5vbXhfZGVmYXVsdF9yYW5rLnN3LW90aGVyIiwgMHgyMTB1KTsKKwogICAgIGZvciAoY29uc3QgSU9teFN0b3JlOjpSb2xlSW5mbyYgcm9sZSA6IHJvbGVzKSB7CiAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiB0eXBlTmFtZSA9IHJvbGUudHlwZTsKICAgICAgICAgYm9vbCBpc0VuY29kZXIgPSByb2xlLmlzRW5jb2RlcjsKLSAgICAgICAgYm9vbCBwcmVmZXJQbGF0Zm9ybU5vZGVzID0gcm9sZS5wcmVmZXJQbGF0Zm9ybU5vZGVzOwotICAgICAgICAvLyBJZiBwcmVmZXJQbGF0Zm9ybU5vZGVzIGlzIHRydWUsIGhhcmR3YXJlIG5vZGVzIG11c3QgYmUgYWRkZWQgYWZ0ZXIKLSAgICAgICAgLy8gcGxhdGZvcm0gKHNvZnR3YXJlKSBub2Rlcy4gaHdDb2RlY3MgaXMgdXNlZCB0byBob2xkIGhhcmR3YXJlIG5vZGVzCi0gICAgICAgIC8vIHRoYXQgbmVlZCB0byBiZSBhZGRlZCBhZnRlciBzb2Z0d2FyZSBub2RlcyBmb3IgdGhlIHNhbWUgcm9sZS4KLSAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgSU9teFN0b3JlOjpOb2RlSW5mbyo+IGh3Q29kZWNzOwotICAgICAgICBmb3IgKGNvbnN0IElPbXhTdG9yZTo6Tm9kZUluZm8mIG5vZGUgOiByb2xlLm5vZGVzKSB7CisgICAgICAgIGJvb2wgaXNBdWRpbyA9IGhhc1ByZWZpeChyb2xlLnR5cGUsICJhdWRpby8iKTsKKyAgICAgICAgYm9vbCBpc1ZpZGVvT3JJbWFnZSA9IGhhc1ByZWZpeChyb2xlLnR5cGUsICJ2aWRlby8iKSB8fCBoYXNQcmVmaXgocm9sZS50eXBlLCAiaW1hZ2UvIik7CisKKyAgICAgICAgZm9yIChjb25zdCBJT214U3RvcmU6Ok5vZGVJbmZvICZub2RlIDogcm9sZS5ub2RlcykgewogICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5vZGVOYW1lID0gbm9kZS5uYW1lOworCisgICAgICAgICAgICAvLyBjdXJyZW50bHkgaW1hZ2UgYW5kIHZpZGVvIGVuY29kZXJzIHVzZSBzdXJmYWNlIGlucHV0CisgICAgICAgICAgICBpZiAoIW1BbGxvd1N1cmZhY2VFbmNvZGVycyAmJiBpc1ZpZGVvT3JJbWFnZSAmJiBpc0VuY29kZXIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZGlzYWJsaW5nICVzIGZvciBtZWRpYSB0eXBlICVzIGJlY2F1c2Ugd2UgYXJlIG5vdCB1c2luZyBPTVggaW5wdXQgc3VyZmFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZS5jX3N0cigpLCByb2xlLnR5cGUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGJvb2wgaXNTb2Z0d2FyZSA9IGhhc1ByZWZpeChub2RlTmFtZSwgIk9NWC5nb29nbGUiKTsKLSAgICAgICAgICAgIE1lZGlhQ29kZWNJbmZvV3JpdGVyKiBpbmZvOwotICAgICAgICAgICAgaWYgKGlzU29mdHdhcmUpIHsKLSAgICAgICAgICAgICAgICBhdXRvIGMyaSA9IHN3Q29kZWNOYW1lMkluZm8uZmluZChub2RlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGMyaSA9PSBzd0NvZGVjTmFtZTJJbmZvLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBNZWRpYUNvZGVjSW5mbyBmb3IgYSBuZXcgbm9kZS4KLSAgICAgICAgICAgICAgICAgICAgYzJpID0gc3dDb2RlY05hbWUySW5mby5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUsIHdyaXRlci0+YWRkTWVkaWFDb2RlY0luZm8oKSkpLmZpcnN0OwotICAgICAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNldE5hbWUobm9kZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNldE93bmVyKG5vZGUub3duZXIuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNldEVuY29kZXIoaXNFbmNvZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0UmFuayhkZWZhdWx0UmFuayk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGUgaGFzIGJlZW4gc2VlbiBiZWZvcmUuIFNpbXBseSByZXRyaWV2ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgTWVkaWFDb2RlY0luZm9Xcml0ZXIuCi0gICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGF1dG8gYzJpID0gaHdDb2RlY05hbWUySW5mby5maW5kKG5vZGVOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoYzJpID09IGh3Q29kZWNOYW1lMkluZm8uZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNJbmZvIGZvciBhIG5ldyBub2RlLgotICAgICAgICAgICAgICAgICAgICBpZiAoIXByZWZlclBsYXRmb3JtTm9kZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMyaSA9IGh3Q29kZWNOYW1lMkluZm8uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSwgd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpKSkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXROYW1lKG5vZGVOYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0T3duZXIobm9kZS5vd25lci5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldEVuY29kZXIoaXNFbmNvZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldFJhbmsoZGVmYXVsdFJhbmspOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgcHJlZmVyUGxhdGZvcm1Ob2RlcyBpcyB0cnVlLCB0aGlzIG5vZGUgbXVzdCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkZWQgYWZ0ZXIgYWxsIHNvZnR3YXJlIG5vZGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgaHdDb2RlY3MucHVzaF9iYWNrKCZub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgdWludDMyX3QgcmFuayA9IGlzU29mdHdhcmUKKyAgICAgICAgICAgICAgICAgICAgPyAoaXNBdWRpbyA/IGRlZmF1bHRTd0F1ZGlvUmFuayA6IGRlZmF1bHRTd090aGVyUmFuaykKKyAgICAgICAgICAgICAgICAgICAgOiBkZWZhdWx0UmFuazsKKyAgICAgICAgICAgIC8vIGdldCByYW5rIGZyb20gSU9teFN0b3JlIHZpYSBhdHRyaWJ1dGUKKyAgICAgICAgICAgIGZvciAoY29uc3QgSU9teFN0b3JlOjpBdHRyaWJ1dGUmIGF0dHJpYnV0ZSA6IG5vZGUuYXR0cmlidXRlcykgeworICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUua2V5ID09ICJyYW5rIikgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvbGRSYW5rID0gcmFuazsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBkdW1teTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNzY2FuZihhdHRyaWJ1dGUudmFsdWUuY19zdHIoKSwgIiV1JWMiLCAmcmFuaywgJmR1bW15KSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByYW5rID0gb2xkUmFuazsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlIGhhcyBiZWVuIHNlZW4gYmVmb3JlLiBTaW1wbHkgcmV0cmlldmUgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIE1lZGlhQ29kZWNJbmZvV3JpdGVyLgotICAgICAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWVkaWFDb2RlY0luZm9Xcml0ZXIqIGluZm87CisgICAgICAgICAgICBhdXRvIGMyaSA9IGNvZGVjTmFtZTJJbmZvLmZpbmQobm9kZU5hbWUpOworICAgICAgICAgICAgaWYgKGMyaSA9PSBjb2RlY05hbWUySW5mby5lbmQoKSkgeworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBNZWRpYUNvZGVjSW5mbyBmb3IgYSBuZXcgbm9kZS4KKyAgICAgICAgICAgICAgICBjMmkgPSBjb2RlY05hbWUySW5mby5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSwgd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpKSkuZmlyc3Q7CisgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOworICAgICAgICAgICAgICAgIGluZm8tPnNldE5hbWUobm9kZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgaW5mby0+c2V0T3duZXIobm9kZS5vd25lci5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBpbmZvLT5zZXRSYW5rKHJhbmspOworCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8TWVkaWFDb2RlY0luZm86OkF0dHJpYnV0ZXM+Ojp0eXBlIGF0dHJzID0gMDsKKyAgICAgICAgICAgICAgICAvLyBhbGwgT01YIGNvZGVjcyBhcmUgdmVuZG9yIGNvZGVjcyAoaW4gdGhlIHZlbmRvciBwYXJ0aXRpb24pLCBidXQKKyAgICAgICAgICAgICAgICAvLyB0cmVhdCBPTVguZ29vZ2xlIGNvZGVjcyBhcyBub24taGFyZHdhcmUtYWNjZWxlcmF0ZWQgYW5kIG5vbi12ZW5kb3IKKyAgICAgICAgICAgICAgICBpZiAoIWlzU29mdHdhcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgYXR0cnMgfD0gTWVkaWFDb2RlY0luZm86OmtGbGFnSXNWZW5kb3I7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGQ6OmNvdW50X2lmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXR0cmlidXRlcy5iZWdpbigpLCBub2RlLmF0dHJpYnV0ZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgSU9teFN0b3JlOjpBdHRyaWJ1dGUgJmkpIC0+IGJvb2wgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5rZXkgPT0gImF0dHJpYnV0ZTo6c29mdHdhcmUtY29kZWMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdHRycyB8PSBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc0hhcmR3YXJlQWNjZWxlcmF0ZWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlzRW5jb2RlcikgeworICAgICAgICAgICAgICAgICAgICBhdHRycyB8PSBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc0VuY29kZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZm8tPnNldEF0dHJpYnV0ZXMoYXR0cnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbm9kZSBoYXMgYmVlbiBzZWVuIGJlZm9yZS4gU2ltcGx5IHJldHJpZXZlIHRoZQorICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIE1lZGlhQ29kZWNJbmZvV3JpdGVyLgorICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyPiBjYXBzID0KLSAgICAgICAgICAgICAgICAgICAgaW5mby0+YWRkTWltZSh0eXBlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+YWRkTWVkaWFUeXBlKHR5cGVOYW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgaWYgKHF1ZXJ5Q2FwYWJpbGl0aWVzKAogICAgICAgICAgICAgICAgICAgICBub2RlLCB0eXBlTmFtZS5jX3N0cigpLCBpc0VuY29kZXIsIGNhcHMuZ2V0KCkpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkZhaWwgdG8gYWRkIG1pbWUgJXMgdG8gY29kZWMgJXMiLAorICAgICAgICAgICAgICAgIEFMT0dXKCJGYWlsIHRvIGFkZCBtZWRpYSB0eXBlICVzIHRvIGNvZGVjICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lLmNfc3RyKCksIG5vZGVOYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIGluZm8tPnJlbW92ZU1pbWUodHlwZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiBwcmVmZXJQbGF0Zm9ybU5vZGVzIGlzIHRydWUsIGhhcmR3YXJlIG5vZGVzIHdpbGwgbm90IGhhdmUgYmVlbgotICAgICAgICAvLyBhZGRlZCBpbiB0aGUgbG9vcCBhYm92ZSwgYnV0IHJhdGhlciBzYXZlZCBpbiBod0NvZGVjcy4gVGhleSBhcmUKLSAgICAgICAgLy8gZ29pbmcgdG8gYmUgYWRkZWQgaGVyZS4KLSAgICAgICAgaWYgKHByZWZlclBsYXRmb3JtTm9kZXMpIHsKLSAgICAgICAgICAgIGZvciAoY29uc3QgSU9teFN0b3JlOjpOb2RlSW5mbyAqbm9kZSA6IGh3Q29kZWNzKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFDb2RlY0luZm9Xcml0ZXIqIGluZm87Ci0gICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5vZGVOYW1lID0gbm9kZS0+bmFtZTsKLSAgICAgICAgICAgICAgICBhdXRvIGMyaSA9IGh3Q29kZWNOYW1lMkluZm8uZmluZChub2RlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGMyaSA9PSBod0NvZGVjTmFtZTJJbmZvLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBNZWRpYUNvZGVjSW5mbyBmb3IgYSBuZXcgbm9kZS4KLSAgICAgICAgICAgICAgICAgICAgYzJpID0gaHdDb2RlY05hbWUySW5mby5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUsIHdyaXRlci0+YWRkTWVkaWFDb2RlY0luZm8oKSkpLmZpcnN0OwotICAgICAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNldE5hbWUobm9kZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNldE93bmVyKG5vZGUtPm93bmVyLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRFbmNvZGVyKGlzRW5jb2Rlcik7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNldFJhbmsoZGVmYXVsdFJhbmspOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlIGhhcyBiZWVuIHNlZW4gYmVmb3JlLiBTaW1wbHkgcmV0cmlldmUgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIE1lZGlhQ29kZWNJbmZvV3JpdGVyLgotICAgICAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyPiBjYXBzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmFkZE1pbWUodHlwZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHF1ZXJ5Q2FwYWJpbGl0aWVzKAotICAgICAgICAgICAgICAgICAgICAgICAgKm5vZGUsIHR5cGVOYW1lLmNfc3RyKCksIGlzRW5jb2RlciwgY2Fwcy5nZXQoKSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZhaWwgdG8gYWRkIG1pbWUgJXMgdG8gY29kZWMgJXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXIgc29mdHdhcmUgY29kZWNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWUuY19zdHIoKSwgbm9kZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnJlbW92ZU1pbWUodHlwZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZm8tPnJlbW92ZU1lZGlhVHlwZSh0eXBlTmFtZS5jX3N0cigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI0Miw0ICsyMjQsMyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggOWQyYzQyYi4uYjBjZTY4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcApAQCAtNDksNyArNDksNyBAQAogCiAgICAgbUFuYWx5dGljc0l0ZW0gPSBudWxscHRyOwogICAgIGlmIChNRURJQV9MT0cpIHsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtLZXlFeHRyYWN0b3IpOworICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKGtLZXlFeHRyYWN0b3IpOwogCiAgICAgICAgIC8vIHRyYWNrIHRoZSBjb250YWluZXIgZm9ybWF0IChtcGVnLCBhYWMsIHd2bSwgZXRjKQogICAgICAgICBzaXplX3QgbnRyYWNrcyA9IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmNwcAppbmRleCBkMDdhZmVjLi5kYjMxYWYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuY3BwCkBAIC0yNSwyNSArMjUsMjkgQEAKICAgICAgICAgTWVkaWFUcmFjayAqc291cmNlLAogICAgICAgICBjb25zdCBzcDxSZWZCYXNlPiAmcGx1Z2luKQogICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLAotICAgICAgbVNvdXJjZShzb3VyY2UpLAorICAgICAgbVRyYWNrKHNvdXJjZSksCiAgICAgICBtRXh0cmFjdG9yUGx1Z2luKHBsdWdpbikge30KIAogUmVtb3RlTWVkaWFTb3VyY2U6On5SZW1vdGVNZWRpYVNvdXJjZSgpIHsKLSAgICBkZWxldGUgbVNvdXJjZTsKKyAgICBkZWxldGUgbVRyYWNrOwogICAgIG1FeHRyYWN0b3JQbHVnaW4gPSBudWxscHRyOwogfQogCiBzdGF0dXNfdCBSZW1vdGVNZWRpYVNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewotICAgIHJldHVybiBtU291cmNlLT5zdGFydChwYXJhbXMpOworICAgIGlmIChwYXJhbXMpIHsKKyAgICAgICAgQUxPR1coImRyb3BwaW5nIHN0YXJ0IHBhcmFtZXRlcnM6Iik7CisgICAgICAgIHBhcmFtcy0+ZHVtcFRvTG9nKCk7CisgICAgfQorICAgIHJldHVybiBtVHJhY2stPnN0YXJ0KCk7CiB9CiAKIHN0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpzdG9wKCkgewotICAgIHJldHVybiBtU291cmNlLT5zdG9wKCk7CisgICAgcmV0dXJuIG1UcmFjay0+c3RvcCgpOwogfQogCiBzcDxNZXRhRGF0YT4gUmVtb3RlTWVkaWFTb3VyY2U6OmdldEZvcm1hdCgpIHsKICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YSgpOwotICAgIGlmIChtU291cmNlLT5nZXRGb3JtYXQoKm1ldGEuZ2V0KCkpID09IE9LKSB7CisgICAgaWYgKG1UcmFjay0+Z2V0Rm9ybWF0KCptZXRhLmdldCgpKSA9PSBPSykgewogICAgICAgICByZXR1cm4gbWV0YTsKICAgICB9CiAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC01MSw3ICs1NSwxMSBAQAogCiBzdGF0dXNfdCBSZW1vdGVNZWRpYVNvdXJjZTo6cmVhZCgKICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICByZXR1cm4gbVNvdXJjZS0+cmVhZChidWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zKj4ob3B0aW9ucykpOworICAgIHJldHVybiBtVHJhY2stPnJlYWQoYnVmZmVyLCByZWludGVycHJldF9jYXN0PGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyo+KG9wdGlvbnMpKTsKK30KKworYm9vbCBSZW1vdGVNZWRpYVNvdXJjZTo6c3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpIHsKKyAgICByZXR1cm4gbVRyYWNrLT5zdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCk7CiB9CiAKIHN0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpwYXVzZSgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmNwcAppbmRleCA0MDRjNTM3Li5iYWJkYzdhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwCkBAIC0zNyw2ICszNyw3IEBACiAKIGNvbnN0IGludDY0X3Qga1RpbWVvdXRXYWl0Rm9yT3V0cHV0VXMgPSA1MDAwMDA7IC8vIDAuNSBzZWNvbmRzCiBjb25zdCBpbnQ2NF90IGtUaW1lb3V0V2FpdEZvcklucHV0VXMgPSA1MDAwOyAvLyA1IG1pbGxpc2Vjb25kcworY29uc3QgaW50IGtUaW1lb3V0TWF4UmV0cmllcyA9IDIwOwogCiAvL3N0YXRpYwogc3A8U2ltcGxlRGVjb2RpbmdTb3VyY2U+IFNpbXBsZURlY29kaW5nU291cmNlOjpDcmVhdGUoCkBAIC0yNDIsNyArMjQzLDcgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCi0gICAgZm9yIChpbnQgcmV0cmllcyA9IDA7ICsrcmV0cmllczsgKSB7CisgICAgZm9yIChpbnQgcmV0cmllcyA9IDA7IHJldHJpZXMgPCBrVGltZW91dE1heFJldHJpZXM7ICsrcmV0cmllcykgewogICAgICAgICAvLyBJZiB3ZSBmaWxsIGFsbCBhdmFpbGFibGUgaW5wdXQgYnVmZmVycywgd2Ugc2hvdWxkIGV4cGVjdCB0aGF0CiAgICAgICAgIC8vIHRoZSBjb2RlYyBwcm9kdWNlcyBhdCBsZWFzdCBvbmUgb3V0cHV0IGJ1ZmZlci4gQWxzbywgdGhlIGNvZGVjCiAgICAgICAgIC8vIHNob3VsZCBwcm9kdWNlIGFuIG91dHB1dCBidWZmZXIgaW4gYXQgbW9zdCAxIHNlY29uZHMuIFJldHJ5IGEKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAppbmRleCBjNjI2MDNjLi5jZjRlZGFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxmY250bC5oPgogCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CkBAIC0zNCwyNSArMzUsMTYgQEAKIAogU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXI6On5TdGFnZWZyaWdodE1lZGlhU2Nhbm5lcigpIHt9CiAKLXN0YXRpYyBib29sIEZpbGVIYXNBY2NlcHRhYmxlRXh0ZW5zaW9uKGNvbnN0IGNoYXIgKmV4dGVuc2lvbikgewotICAgIHN0YXRpYyBjb25zdCBjaGFyICprVmFsaWRFeHRlbnNpb25zW10gPSB7Ci0gICAgICAgICIubXAzIiwgIi5tcDQiLCAiLm00YSIsICIuM2dwIiwgIi4zZ3BwIiwgIi4zZzIiLCAiLjNncHAyIiwKLSAgICAgICAgIi5tcGVnIiwgIi5vZ2ciLCAiLm1pZCIsICIuc21mIiwgIi5pbXkiLCAiLndtYSIsICIuYWFjIiwKLSAgICAgICAgIi53YXYiLCAiLmFtciIsICIubWlkaSIsICIueG1mIiwgIi5ydHR0bCIsICIucnR4IiwgIi5vdGEiLAotICAgICAgICAiLm1rdiIsICIubWthIiwgIi53ZWJtIiwgIi50cyIsICIuZmwiLCAiLmZsYWMiLCAiLm14bWYiLAotICAgICAgICAiLmF2aSIsICIubXBlZyIsICIubXBnIiwgIi5hd2IiLCAiLm1wZ2EiLCAiLm1vdiIsCi0gICAgICAgICIubTR2IiwgIi5vZ2EiLCAiLm00ciIKLSAgICB9OwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bVZhbGlkRXh0ZW5zaW9ucyA9Ci0gICAgICAgIHNpemVvZihrVmFsaWRFeHRlbnNpb25zKSAvIHNpemVvZihrVmFsaWRFeHRlbnNpb25zWzBdKTsKK3N0YXRpYyBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGdTdXBwb3J0ZWRFeHRlbnNpb25zOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtVmFsaWRFeHRlbnNpb25zOyArK2kpIHsKLSAgICAgICAgaWYgKCFzdHJjYXNlY21wKGV4dGVuc2lvbiwga1ZhbGlkRXh0ZW5zaW9uc1tpXSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9CitzdGF0aWMgYm9vbCBGaWxlSGFzQWNjZXB0YWJsZUV4dGVuc2lvbihjb25zdCBjaGFyICpleHRlbnNpb24pIHsKKworICAgIGlmIChnU3VwcG9ydGVkRXh0ZW5zaW9ucy5lbXB0eSgpKSB7CisgICAgICAgIC8vIGdldCB0aGUgbGlzdCBmcm9tIHRoZSBzZXJ2aWNlCisgICAgICAgIGdTdXBwb3J0ZWRFeHRlbnNpb25zID0gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnZXRTdXBwb3J0ZWRUeXBlcygpOwogICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gIGdTdXBwb3J0ZWRFeHRlbnNpb25zLmNvdW50KHN0ZDo6c3RyaW5nKGV4dGVuc2lvbiArIDEpKSAhPSAwOwogfQogCiBNZWRpYVNjYW5SZXN1bHQgU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXI6OnByb2Nlc3NGaWxlKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcAppbmRleCAyMWFjY2FkLi5mYTNkMzcyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTI4MSwxMiArMjgyLDYgQEAKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogCi0gICAgaW50MzJfdCBkcm0gPSAwOwotICAgIGlmIChmaWxlTWV0YS0+ZmluZEludDMyKGtLZXlJc0RSTSwgJmRybSkgJiYgZHJtICE9IDApIHsKLSAgICAgICAgQUxPR0UoImZyYW1lIGdyYWIgbm90IGFsbG93ZWQuIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fVU5LTk9XTjsKLSAgICB9Ci0KICAgICBzaXplX3QgbiA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CiAgICAgc2l6ZV90IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewpAQCAtMzU0LDE1ICszNDksMTUgQEAKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hpbmdDb2RlY3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgY29uc3QgQVN0cmluZyAmY29tcG9uZW50TmFtZSA9IG1hdGNoaW5nQ29kZWNzW2ldOwotICAgICAgICBWaWRlb0ZyYW1lRGVjb2RlciBkZWNvZGVyKGNvbXBvbmVudE5hbWUsIHRyYWNrTWV0YSwgc291cmNlKTsKLSAgICAgICAgaWYgKGRlY29kZXIuaW5pdCh0aW1lVXMsIG51bUZyYW1lcywgb3B0aW9uLCBjb2xvckZvcm1hdCkgPT0gT0spIHsKKyAgICAgICAgc3A8VmlkZW9GcmFtZURlY29kZXI+IGRlY29kZXIgPSBuZXcgVmlkZW9GcmFtZURlY29kZXIoY29tcG9uZW50TmFtZSwgdHJhY2tNZXRhLCBzb3VyY2UpOworICAgICAgICBpZiAoZGVjb2Rlci0+aW5pdCh0aW1lVXMsIG51bUZyYW1lcywgb3B0aW9uLCBjb2xvckZvcm1hdCkgPT0gT0spIHsKICAgICAgICAgICAgIGlmIChvdXRGcmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgKm91dEZyYW1lID0gZGVjb2Rlci5leHRyYWN0RnJhbWUoKTsKKyAgICAgICAgICAgICAgICAqb3V0RnJhbWUgPSBkZWNvZGVyLT5leHRyYWN0RnJhbWUoKTsKICAgICAgICAgICAgICAgICBpZiAoKm91dEZyYW1lICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0RnJhbWVzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBkZWNvZGVyLmV4dHJhY3RGcmFtZXMob3V0RnJhbWVzKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBkZWNvZGVyLT5leHRyYWN0RnJhbWVzKG91dEZyYW1lcyk7CiAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuY3BwCmluZGV4IDUxOWU4NzAuLmI5MDY0OWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGRsZmNuLmg+CiAKICNpbmNsdWRlICJTdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oIgpAQCAtMjcsOSArMjgsMTcgQEAKIC8qIHN0YXRpYyAqLyBNdXRleCBTdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6c011dGV4OwogLyogc3RhdGljICovIHN0ZDo6dW5pcXVlX3B0cjxTdGFnZWZyaWdodFBsdWdpbkxvYWRlcj4gU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OnNJbnN0YW5jZTsKIAotU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OlN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyKGNvbnN0IGNoYXIgKmxpYlBhdGgpCi0gICAgOiBtQ3JlYXRlQ29kZWMobnVsbHB0ciksCi0gICAgICBtQ3JlYXRlQnVpbGRlcihudWxscHRyKSB7CituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK2NvbnN0ZXhwciBjb25zdCBjaGFyIGtDQ29kZWNQbHVnaW5QYXRoW10gPSAibGlic2ZwbHVnaW5fY2NvZGVjLnNvIjsKKworfSAgLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OlN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyKGNvbnN0IGNoYXIgKmxpYlBhdGgpIHsKKyAgICBpZiAoYW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoImRlYnVnLm1lZGlhLmNvZGVjMiIsIDApID09IDApIHsKKyAgICAgICAgQUxPR0QoIkNDb2RlYyBpcyBkaXNhYmxlZC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBtTGliSGFuZGxlID0gZGxvcGVuKGxpYlBhdGgsIFJUTERfTk9XIHwgUlRMRF9OT0RFTEVURSk7CiAgICAgaWYgKG1MaWJIYW5kbGUgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGxvYWQgbGlicmFyeTogJXMgKCVzKSIsIGxpYlBhdGgsIGRsZXJyb3IoKSk7CkBAIC00Niw3ICs1NSw3IEBACiAgICAgfQogICAgIG1DcmVhdGVJbnB1dFN1cmZhY2UgPSAoQ29kZWNCYXNlOjpDcmVhdGVJbnB1dFN1cmZhY2VGdW5jKWRsc3ltKAogICAgICAgICAgICAgbUxpYkhhbmRsZSwgIkNyZWF0ZUlucHV0U3VyZmFjZSIpOwotICAgIGlmIChtQ3JlYXRlQnVpbGRlciA9PSBudWxscHRyKSB7CisgICAgaWYgKG1DcmVhdGVJbnB1dFN1cmZhY2UgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGZpbmQgc3ltYm9sOiBDcmVhdGVJbnB1dFN1cmZhY2UgKCVzKSIsIGRsZXJyb3IoKSk7CiAgICAgfQogfQpAQCAtODcsNyArOTYsNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChzTXV0ZXgpOwogICAgIGlmICghc0luc3RhbmNlKSB7CiAgICAgICAgIEFMT0dWKCJMb2FkaW5nIGxpYnJhcnkiKTsKLSAgICAgICAgc0luc3RhbmNlLnJlc2V0KG5ldyBTdGFnZWZyaWdodFBsdWdpbkxvYWRlcigibGlic3RhZ2VmcmlnaHRfY2NvZGVjLnNvIikpOworICAgICAgICBzSW5zdGFuY2UucmVzZXQobmV3IFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyKGtDQ29kZWNQbHVnaW5QYXRoKSk7CiAgICAgfQogICAgIHJldHVybiBzSW5zdGFuY2U7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuaAppbmRleCA5OTlkMzBjLi43OGVmZmJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmgKQEAgLTQwLDEwICs0MCwxMCBAQAogICAgIHN0YXRpYyBNdXRleCBzTXV0ZXg7CiAgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxTdGFnZWZyaWdodFBsdWdpbkxvYWRlcj4gc0luc3RhbmNlOwogCi0gICAgdm9pZCAqbUxpYkhhbmRsZTsKLSAgICBDb2RlY0Jhc2U6OkNyZWF0ZUNvZGVjRnVuYyBtQ3JlYXRlQ29kZWM7Ci0gICAgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZTo6Q3JlYXRlQnVpbGRlckZ1bmMgbUNyZWF0ZUJ1aWxkZXI7Ci0gICAgQ29kZWNCYXNlOjpDcmVhdGVJbnB1dFN1cmZhY2VGdW5jIG1DcmVhdGVJbnB1dFN1cmZhY2U7CisgICAgdm9pZCAqbUxpYkhhbmRsZXtudWxscHRyfTsKKyAgICBDb2RlY0Jhc2U6OkNyZWF0ZUNvZGVjRnVuYyBtQ3JlYXRlQ29kZWN7bnVsbHB0cn07CisgICAgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZTo6Q3JlYXRlQnVpbGRlckZ1bmMgbUNyZWF0ZUJ1aWxkZXJ7bnVsbHB0cn07CisgICAgQ29kZWNCYXNlOjpDcmVhdGVJbnB1dFN1cmZhY2VGdW5jIG1DcmVhdGVJbnB1dFN1cmZhY2V7bnVsbHB0cn07CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVEVTVF9NQVBQSU5HIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ODE4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcKQEAgLTAsMCArMSwxMiBAQAoreworICAicG9zdHN1Ym1pdCI6IFsKKyAgICB7CisgICAgICAibmFtZSI6ICJDdHNNZWRpYVRlc3RDYXNlcyIsCisgICAgICAib3B0aW9ucyI6IFsKKyAgICAgICAgeworICAgICAgICAgICJpbmNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlIgorICAgICAgICB9CisgICAgICBdCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKaW5kZXggMzM2MTRkNi4uNjRiYmYwOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcApAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb2t1cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KQEAgLTc0LDcgKzc1LDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgdm9pZCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2VDb2xvckFzcGVjdHMoY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLCBzcDxBTWVzc2FnZT4gJm1zZykgeworc3RhdGljIHZvaWQgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlQ29sb3JBc3BlY3RzKGNvbnN0IE1ldGFEYXRhQmFzZSAqbWV0YSwgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICAvLyAwIHZhbHVlcyBhcmUgdW5zcGVjaWZpZWQKICAgICBpbnQzMl90IHJhbmdlID0gMDsKICAgICBpbnQzMl90IHByaW1hcmllcyA9IDA7CkBAIC0xMTksNyArMTIwLDggQEAKICAgICB9CiAKICAgICAvLyBpZiB1c2VyL2NvbnRhaW5lciBzdXBwbGllZCBIRFIgc3RhdGljIGluZm8gd2l0aG91dCB0cmFuc2ZlciBzZXQsIGFzc3VtZSB0cnVlCi0gICAgaWYgKGZvcm1hdC0+Y29udGFpbnMoImhkci1zdGF0aWMtaW5mbyIpICYmICFmb3JtYXQtPmNvbnRhaW5zKCJjb2xvci10cmFuc2ZlciIpKSB7CisgICAgaWYgKChmb3JtYXQtPmNvbnRhaW5zKCJoZHItc3RhdGljLWluZm8iKSB8fCBmb3JtYXQtPmNvbnRhaW5zKCJoZHIxMC1wbHVzLWluZm8iKSkKKyAgICAgICAgICAgICYmICFmb3JtYXQtPmNvbnRhaW5zKCJjb2xvci10cmFuc2ZlciIpKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICAvLyBvdGhlcndpc2UsIHZlcmlmeSB0aGF0IGFuIEhEUiB0cmFuc2ZlciBmdW5jdGlvbiBpcyBzZXQKQEAgLTE5MCw2ICsxOTIsOSBAQAogICAgICAgICB7IDUwLCBPTVhfVklERU9fQVZDTGV2ZWw1ICB9LAogICAgICAgICB7IDUxLCBPTVhfVklERU9fQVZDTGV2ZWw1MSB9LAogICAgICAgICB7IDUyLCBPTVhfVklERU9fQVZDTGV2ZWw1MiB9LAorICAgICAgICB7IDYwLCBPTVhfVklERU9fQVZDTGV2ZWw2ICB9LAorICAgICAgICB7IDYxLCBPTVhfVklERU9fQVZDTGV2ZWw2MSB9LAorICAgICAgICB7IDYyLCBPTVhfVklERU9fQVZDTGV2ZWw2MiB9LAogICAgIH07CiAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFPiBwcm9maWxlcyB7CiAgICAgICAgIHsgNjYsIE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUgfSwKQEAgLTU2OCw4ICs1NzMsMTY0IEBACiAgICAgfQogfQogCisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgY2hhciAqLCB1aW50MzJfdD4+IHN0cmluZ01hcHBpbmdzIHsKKyAgICB7CisgICAgICAgIHsgImFsYnVtIiwga0tleUFsYnVtIH0sCisgICAgICAgIHsgImFsYnVtYXJ0aXN0Iiwga0tleUFsYnVtQXJ0aXN0IH0sCisgICAgICAgIHsgImFydGlzdCIsIGtLZXlBcnRpc3QgfSwKKyAgICAgICAgeyAiYXV0aG9yIiwga0tleUF1dGhvciB9LAorICAgICAgICB7ICJjZHRyYWNrbnVtIiwga0tleUNEVHJhY2tOdW1iZXIgfSwKKyAgICAgICAgeyAiY29tcGlsYXRpb24iLCBrS2V5Q29tcGlsYXRpb24gfSwKKyAgICAgICAgeyAiY29tcG9zZXIiLCBrS2V5Q29tcG9zZXIgfSwKKyAgICAgICAgeyAiZGF0ZSIsIGtLZXlEYXRlIH0sCisgICAgICAgIHsgImRpc2NudW0iLCBrS2V5RGlzY051bWJlciB9LAorICAgICAgICB7ICJnZW5yZSIsIGtLZXlHZW5yZSB9LAorICAgICAgICB7ICJsb2NhdGlvbiIsIGtLZXlMb2NhdGlvbiB9LAorICAgICAgICB7ICJseXJpY2lzdCIsIGtLZXlXcml0ZXIgfSwKKyAgICAgICAgeyAibWFudWZhY3R1cmVyIiwga0tleU1hbnVmYWN0dXJlciB9LAorICAgICAgICB7ICJ0aXRsZSIsIGtLZXlUaXRsZSB9LAorICAgICAgICB7ICJ5ZWFyIiwga0tleVllYXIgfSwKKyAgICB9Cit9OworCitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IGNoYXIgKiwgdWludDMyX3Q+PiBmbG9hdE1hcHBpbmdzIHsKKyAgICB7CisgICAgICAgIHsgImNhcHR1cmUtcmF0ZSIsIGtLZXlDYXB0dXJlRnJhbWVyYXRlIH0sCisgICAgfQorfTsKKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIHVpbnQzMl90Pj4gaW50NjRNYXBwaW5ncyB7CisgICAgeworICAgICAgICB7ICJleGlmLW9mZnNldCIsIGtLZXlFeGlmT2Zmc2V0IH0sCisgICAgICAgIHsgImV4aWYtc2l6ZSIsIGtLZXlFeGlmU2l6ZSB9LAorICAgICAgICB7ICJ0YXJnZXQtdGltZSIsIGtLZXlUYXJnZXRUaW1lIH0sCisgICAgICAgIHsgInRodW1ibmFpbC10aW1lIiwga0tleVRodW1ibmFpbFRpbWUgfSwKKyAgICAgICAgeyAidGltZVVzIiwga0tleVRpbWUgfSwKKyAgICAgICAgeyAiZHVyYXRpb25VcyIsIGtLZXlEdXJhdGlvbiB9LAorICAgIH0KK307CisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgY2hhciAqLCB1aW50MzJfdD4+IGludDMyTWFwcGluZ3MgeworICAgIHsKKyAgICAgICAgeyAibG9vcCIsIGtLZXlBdXRvTG9vcCB9LAorICAgICAgICB7ICJ0aW1lLXNjYWxlIiwga0tleVRpbWVTY2FsZSB9LAorICAgICAgICB7ICJjcnlwdG8tbW9kZSIsIGtLZXlDcnlwdG9Nb2RlIH0sCisgICAgICAgIHsgImNyeXB0by1kZWZhdWx0LWl2LXNpemUiLCBrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSB9LAorICAgICAgICB7ICJjcnlwdG8tZW5jcnlwdGVkLWJ5dGUtYmxvY2siLCBrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrIH0sCisgICAgICAgIHsgImNyeXB0by1za2lwLWJ5dGUtYmxvY2siLCBrS2V5U2tpcEJ5dGVCbG9jayB9LAorICAgICAgICB7ICJmcmFtZS1jb3VudCIsIGtLZXlGcmFtZUNvdW50IH0sCisgICAgICAgIHsgIm1heC1iaXRyYXRlIiwga0tleU1heEJpdFJhdGUgfSwKKyAgICAgICAgeyAicGNtLWJpZy1lbmRpYW4iLCBrS2V5UGNtQmlnRW5kaWFuIH0sCisgICAgICAgIHsgInRlbXBvcmFsLWxheWVyLWNvdW50Iiwga0tleVRlbXBvcmFsTGF5ZXJDb3VudCB9LAorICAgICAgICB7ICJ0ZW1wb3JhbC1sYXllci1pZCIsIGtLZXlUZW1wb3JhbExheWVySWQgfSwKKyAgICAgICAgeyAidGh1bWJuYWlsLXdpZHRoIiwga0tleVRodW1ibmFpbFdpZHRoIH0sCisgICAgICAgIHsgInRodW1ibmFpbC1oZWlnaHQiLCBrS2V5VGh1bWJuYWlsSGVpZ2h0IH0sCisgICAgICAgIHsgInZhbGlkLXNhbXBsZXMiLCBrS2V5VmFsaWRTYW1wbGVzIH0sCisgICAgfQorfTsKKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIHVpbnQzMl90Pj4gYnVmZmVyTWFwcGluZ3MgeworICAgIHsKKyAgICAgICAgeyAiYWxidW1hcnQiLCBrS2V5QWxidW1BcnQgfSwKKyAgICAgICAgeyAiYXVkaW8tcHJlc2VudGF0aW9uLWluZm8iLCBrS2V5QXVkaW9QcmVzZW50YXRpb25JbmZvIH0sCisgICAgICAgIHsgInBzc2giLCBrS2V5UHNzaCB9LAorICAgICAgICB7ICJjcnlwdG8taXYiLCBrS2V5Q3J5cHRvSVYgfSwKKyAgICAgICAgeyAiY3J5cHRvLWtleSIsIGtLZXlDcnlwdG9LZXkgfSwKKyAgICAgICAgeyAiY3J5cHRvLWVuY3J5cHRlZC1zaXplcyIsIGtLZXlFbmNyeXB0ZWRTaXplcyB9LAorICAgICAgICB7ICJjcnlwdG8tcGxhaW4tc2l6ZXMiLCBrS2V5UGxhaW5TaXplcyB9LAorICAgICAgICB7ICJpY2MtcHJvZmlsZSIsIGtLZXlJY2NQcm9maWxlIH0sCisgICAgICAgIHsgInNlaSIsIGtLZXlTRUkgfSwKKyAgICAgICAgeyAidGV4dC1mb3JtYXQtZGF0YSIsIGtLZXlUZXh0Rm9ybWF0RGF0YSB9LAorICAgICAgICB7ICJ0aHVtYm5haWwtY3NkLWhldmMiLCBrS2V5VGh1bWJuYWlsSFZDQyB9LAorICAgIH0KK307CisKK3ZvaWQgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhRnJvbU1hcHBpbmdzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBzcDxNZXRhRGF0YT4gJm1ldGEpIHsKKyAgICBmb3IgKGF1dG8gZWxlbSA6IHN0cmluZ01hcHBpbmdzKSB7CisgICAgICAgIEFTdHJpbmcgdmFsdWU7CisgICAgICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoZWxlbS5maXJzdCwgJnZhbHVlKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhlbGVtLnNlY29uZCwgdmFsdWUuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGZsb2F0TWFwcGluZ3MpIHsKKyAgICAgICAgZmxvYXQgdmFsdWU7CisgICAgICAgIGlmIChtc2ctPmZpbmRGbG9hdChlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRGbG9hdChlbGVtLnNlY29uZCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBpbnQ2NE1hcHBpbmdzKSB7CisgICAgICAgIGludDY0X3QgdmFsdWU7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQ2NChlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQ2NChlbGVtLnNlY29uZCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBpbnQzMk1hcHBpbmdzKSB7CisgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMihlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihlbGVtLnNlY29uZCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBidWZmZXJNYXBwaW5ncykgeworICAgICAgICBzcDxBQnVmZmVyPiB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcihlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGVsZW0uc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsdWUtPmRhdGEoKSwgdmFsdWUtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlRnJvbU1hcHBpbmdzKGNvbnN0IE1ldGFEYXRhQmFzZSAqbWV0YSwgc3A8QU1lc3NhZ2U+IGZvcm1hdCkgeworICAgIGZvciAoYXV0byBlbGVtIDogc3RyaW5nTWFwcGluZ3MpIHsKKyAgICAgICAgY29uc3QgY2hhciAqdmFsdWU7CisgICAgICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhlbGVtLnNlY29uZCwgJnZhbHVlKSkgeworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoZWxlbS5maXJzdCwgdmFsdWUsIHN0cmxlbih2YWx1ZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBmbG9hdE1hcHBpbmdzKSB7CisgICAgICAgIGZsb2F0IHZhbHVlOworICAgICAgICBpZiAobWV0YS0+ZmluZEZsb2F0KGVsZW0uc2Vjb25kLCAmdmFsdWUpKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldEZsb2F0KGVsZW0uZmlyc3QsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogaW50NjRNYXBwaW5ncykgeworICAgICAgICBpbnQ2NF90IHZhbHVlOworICAgICAgICBpZiAobWV0YS0+ZmluZEludDY0KGVsZW0uc2Vjb25kLCAmdmFsdWUpKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDY0KGVsZW0uZmlyc3QsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogaW50MzJNYXBwaW5ncykgeworICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGVsZW0uc2Vjb25kLCAmdmFsdWUpKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKGVsZW0uZmlyc3QsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogYnVmZmVyTWFwcGluZ3MpIHsKKyAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgY29uc3Qgdm9pZCogZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmIChtZXRhLT5maW5kRGF0YShlbGVtLnNlY29uZCwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0QnVmZmVyKGVsZW0uZmlyc3QsIGJ1Zik7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0YXR1c190IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZSgKICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLCBzcDxBTWVzc2FnZT4gKmZvcm1hdCkgeworICAgIHJldHVybiBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UobWV0YS5nZXQoKSwgZm9ybWF0KTsKK30KKworc3RhdHVzX3QgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKAorICAgICAgICBjb25zdCBNZXRhRGF0YUJhc2UgKm1ldGEsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KSB7CiAKICAgICBmb3JtYXQtPmNsZWFyKCk7CiAKQEAgLTU4Niw2ICs3NDcsOCBAQAogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2U7CiAgICAgbXNnLT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lKTsKIAorICAgIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZUZyb21NYXBwaW5ncyhtZXRhLCBtc2cpOworCiAgICAgdWludDMyX3QgdHlwZTsKICAgICBjb25zdCB2b2lkICpkYXRhOwogICAgIHNpemVfdCBzaXplOwpAQCAtNTk5LDYgKzc2MiwxNiBAQAogICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOwogICAgIH0KIAorICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Q0FQcml2YXRlRGF0YSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisKKyAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNhLXByaXZhdGUtZGF0YSIsIGJ1ZmZlcik7CisgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisgICAgfQorCiAgICAgaW50MzJfdCBzeXN0ZW1JZDsKICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlDQVN5c3RlbUlELCAmc3lzdGVtSWQpKSB7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoImNhLXN5c3RlbS1pZCIsIHN5c3RlbUlkKTsKQEAgLTcxMiw2ICs4ODUsMTYgQEAKICAgICAgICAgICAgIENvbG9yVXRpbHM6OnNldEhEUlN0YXRpY0luZm9JbnRvRm9ybWF0KCooSERSU3RhdGljSW5mbyopZGF0YSwgbXNnKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5SGRyMTBQbHVzSW5mbywgJnR5cGUsICZkYXRhLCAmc2l6ZSkKKyAgICAgICAgICAgICAgICAmJiBzaXplID4gMCkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7CisgICAgICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwgfHwgYnVmZmVyLT5iYXNlKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOworICAgICAgICAgICAgbXNnLT5zZXRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsIGJ1ZmZlcik7CisgICAgICAgIH0KKwogICAgICAgICBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2VDb2xvckFzcGVjdHMobWV0YSwgbXNnKTsKICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgbWltZSwgNikpIHsKICAgICAgICAgaW50MzJfdCBudW1DaGFubmVscywgc2FtcGxlUmF0ZTsKQEAgLTcyMyw2ICs5MDYsMTEgQEAKICAgICAgICAgbXNnLT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIG51bUNoYW5uZWxzKTsKICAgICAgICAgbXNnLT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBzYW1wbGVSYXRlKTsKIAorICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGU7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUJpdHNQZXJTYW1wbGUsICZiaXRzUGVyU2FtcGxlKSkgeworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYml0cy1wZXItc2FtcGxlIiwgYml0c1BlclNhbXBsZSk7CisgICAgICAgIH0KKwogICAgICAgICBpbnQzMl90IGNoYW5uZWxNYXNrOwogICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsTWFzaywgJmNoYW5uZWxNYXNrKSkgewogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiY2hhbm5lbC1tYXNrIiwgY2hhbm5lbE1hc2spOwpAQCAtMTAwMSw2ICsxMTg5LDE2IEBACiAgICAgICAgIH0KIAogICAgICAgICBwYXJzZUhldmNQcm9maWxlTGV2ZWxGcm9tSHZjYygoY29uc3QgdWludDhfdCAqKWRhdGEsIGRhdGFTaXplLCBtc2cpOworICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleUFWMUMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKHNpemUpOworICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwgfHwgYnVmZmVyLT5iYXNlKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOworCisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMCIsIGJ1ZmZlcik7CiAgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgRVNEUyBlc2RzKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSk7CiAgICAgICAgIGlmIChlc2RzLkluaXRDaGVjaygpICE9IChzdGF0dXNfdClPSykgewpAQCAtMTA0OCw3ICsxMjQ2LDcgQEAKICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJtYXgtYml0cmF0ZSIsIChpbnQzMl90KW1heEJpdHJhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrVHlwZUQyNjMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RDI2MywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwogICAgICAgICBwYXJzZUgyNjNQcm9maWxlTGV2ZWxGcm9tRDI2MyhwdHIsIHNpemUsIG1zZyk7CiAgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Vm9yYmlzSW5mbywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKQEAgLTExNDgsMTMgKzEzNDYsNiBAQAogICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTAiLCBidWZmZXIpOwogICAgIH0KIAotICAgIC8vIFRPRE8gZXhwb3NlICJjcnlwdG8ta2V5Ii9rS2V5Q3J5cHRvS2V5IHRocm91Z2ggcHVibGljIGFwaQotICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Q3J5cHRvS2V5LCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKLSAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNyeXB0by1rZXkiLCBidWZmZXIpOwotICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOwotICAgIH0KLQogICAgICpmb3JtYXQgPSBtc2c7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xMzUzLDYgKzE1NDQsMjEgQEAKICAgICAgICAgQUxPR1coImRpZCBub3QgZmluZCBtaW1lIHR5cGUiKTsKICAgICB9CiAKKyAgICBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGFGcm9tTWFwcGluZ3MobXNnLCBtZXRhKTsKKworICAgIGludDMyX3Qgc3lzdGVtSWQ7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjYS1zeXN0ZW0taWQiLCAmc3lzdGVtSWQpKSB7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDQVN5c3RlbUlELCBzeXN0ZW1JZCk7CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY2FTZXNzaW9uSWQsIGNhUHZ0RGF0YTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY2Etc2Vzc2lvbi1pZCIsICZjYVNlc3Npb25JZCkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUNBU2Vzc2lvbklELCAwLCBjYVNlc3Npb25JZC0+ZGF0YSgpLCBjYVNlc3Npb25JZC0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJjYS1wcml2YXRlLWRhdGEiLCAmY2FQdnREYXRhKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5Q0FQcml2YXRlRGF0YSwgMCwgY2FQdnREYXRhLT5kYXRhKCksIGNhUHZ0RGF0YS0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGludDY0X3QgZHVyYXRpb25VczsKICAgICBpZiAobXNnLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpIHsKICAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKQEAgLTEzODQsNyArMTU5MCw3IEBACiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiZGlkIG5vdCBmaW5kIHdpZHRoIGFuZC9vciBoZWlnaHQiKTsKKyAgICAgICAgICAgIEFMT0dWKCJkaWQgbm90IGZpbmQgd2lkdGggYW5kL29yIGhlaWdodCIpOwogICAgICAgICB9CiAKICAgICAgICAgaW50MzJfdCBzYXJXaWR0aCwgc2FySGVpZ2h0OwpAQCAtMTQ0Nyw2ICsxNjUzLDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBzcDxBQnVmZmVyPiBoZHIxMFBsdXNJbmZvOworICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJoZHIxMC1wbHVzLWluZm8iLCAmaGRyMTBQbHVzSW5mbykpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUhkcjEwUGx1c0luZm8sIDAsCisgICAgICAgICAgICAgICAgICAgIGhkcjEwUGx1c0luZm8tPmRhdGEoKSwgaGRyMTBQbHVzSW5mby0+c2l6ZSgpKTsKKyAgICAgICAgfQorCiAgICAgICAgIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YUNvbG9yQXNwZWN0cyhtc2csIG1ldGEpOwogCiAgICAgICAgIEFTdHJpbmcgdHNTY2hlbWE7CkBAIC0xNDcxLDYgKzE2ODMsMTAgQEAKICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSkgewogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOwogICAgICAgICB9CisgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJiaXRzLXBlci1zYW1wbGUiLCAmYml0c1BlclNhbXBsZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCBiaXRzUGVyU2FtcGxlKTsKKyAgICAgICAgfQogICAgICAgICBpbnQzMl90IGNoYW5uZWxNYXNrOwogICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImNoYW5uZWwtbWFzayIsICZjaGFubmVsTWFzaykpIHsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsTWFzaywgY2hhbm5lbE1hc2spOwpAQCAtMTQ4OSw2ICsxNzA1LDExIEBACiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5SXNBRFRTLCBpc0FEVFMpOwogICAgICAgICB9CiAKKyAgICAgICAgaW50MzJfdCBhYWNQcm9maWxlID0gLTE7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiYWFjLXByb2ZpbGUiLCAmYWFjUHJvZmlsZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlBQUNBT1QsIGFhY1Byb2ZpbGUpOworICAgICAgICB9CisKICAgICAgICAgaW50MzJfdCBwY21FbmNvZGluZzsKICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJwY20tZW5jb2RpbmciLCAmcGNtRW5jb2RpbmcpKSB7CiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIHBjbUVuY29kaW5nKTsKQEAgLTE1MjksMjggKzE3NTAsNTIgQEAKICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImNzZC0xIiwgJmNzZDEpKSB7CiAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gYXZjYyhjc2Qwc2l6ZSArIGNzZDEtPnNpemUoKSArIDEwMjQpOwogICAgICAgICAgICAgICAgIHNpemVfdCBvdXRzaXplID0gcmVhc3NlbWJsZUFWQ0MoY3NkMCwgY3NkMSwgYXZjYy5kYXRhKCkpOwotICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUFWQ0MsIGtLZXlBVkNDLCBhdmNjLmRhdGEoKSwgb3V0c2l6ZSk7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga1R5cGVBVkNDLCBhdmNjLmRhdGEoKSwgb3V0c2l6ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMgfHwgbWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCkgewogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gZXNkcyhjc2Qwc2l6ZSArIDMxKTsKICAgICAgICAgICAgIC8vIFRoZSB3cml0dGVuIEVTRFMgaXMgYWN0dWFsbHkgZm9yIGFuIGF1ZGlvIHN0cmVhbSwgYnV0IGl0J3MgZW5vdWdoCiAgICAgICAgICAgICAvLyBmb3IgdHJhbnNwb3J0aW5nIHRoZSBDU0QgdG8gbXV4ZXJzLgogICAgICAgICAgICAgcmVhc3NlbWJsZUVTRFMoY3NkMCwgZXNkcy5kYXRhKCkpOwotICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RVNEUywga0tleUVTRFMsIGVzZHMuZGF0YSgpLCBlc2RzLnNpemUoKSk7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrVHlwZUVTRFMsIGVzZHMuZGF0YSgpLCBlc2RzLnNpemUoKSk7CiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDIHx8CiAgICAgICAgICAgICAgICAgICAgbWltZSA9PSBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpIHsKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGh2Y2MoY3NkMHNpemUgKyAxMDI0KTsKICAgICAgICAgICAgIHNpemVfdCBvdXRzaXplID0gcmVhc3NlbWJsZUhWQ0MoY3NkMCwgaHZjYy5kYXRhKCksIGh2Y2Muc2l6ZSgpLCA0KTsKLSAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtLZXlIVkNDLCBodmNjLmRhdGEoKSwgb3V0c2l6ZSk7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGh2Y2MuZGF0YSgpLCBvdXRzaXplKTsKKyAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSkgeworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVYxQywgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwogICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KSB7CiAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlWcDlDb2RlY1ByaXZhdGUsIDAsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKICAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpIHsKLSAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIHNpemVfdCBvcHVzSGVhZFNpemUgPSBjc2QwLT5zaXplKCk7CisgICAgICAgICAgICBzaXplX3QgY29kZWNEZWxheUJ1ZlNpemUgPSAwOworICAgICAgICAgICAgc2l6ZV90IHNlZWtQcmVSb2xsQnVmU2l6ZSA9IDA7CisgICAgICAgICAgICB2b2lkICpvcHVzSGVhZEJ1ZiA9IGNzZDAtPmRhdGEoKTsKKyAgICAgICAgICAgIHZvaWQgKmNvZGVjRGVsYXlCdWYgPSBOVUxMOworICAgICAgICAgICAgdm9pZCAqc2Vla1ByZVJvbGxCdWYgPSBOVUxMOwogICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY3NkLTEiLCAmY3NkMSkpIHsKLSAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlPcHVzQ29kZWNEZWxheSwgMCwgY3NkMS0+ZGF0YSgpLCBjc2QxLT5zaXplKCkpOworICAgICAgICAgICAgICAgIGNvZGVjRGVsYXlCdWZTaXplID0gY3NkMS0+c2l6ZSgpOworICAgICAgICAgICAgICAgIGNvZGVjRGVsYXlCdWYgPSBjc2QxLT5kYXRhKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJjc2QtMiIsICZjc2QyKSkgewotICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU9wdXNTZWVrUHJlUm9sbCwgMCwgY3NkMi0+ZGF0YSgpLCBjc2QyLT5zaXplKCkpOworICAgICAgICAgICAgICAgIHNlZWtQcmVSb2xsQnVmU2l6ZSA9IGNzZDItPnNpemUoKTsKKyAgICAgICAgICAgICAgICBzZWVrUHJlUm9sbEJ1ZiA9IGNzZDItPmRhdGEoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEV4dHJhY3QgY29kZWMgZGVsYXkgYW5kIHNlZWsgcHJlIHJvbGwgZnJvbSBjc2QtMCwKKyAgICAgICAgICAgICAqIGlmIGNzZC0xIGFuZCBjc2QtMiBhcmUgbm90IHByZXNlbnQgKi8KKyAgICAgICAgICAgIGlmICghY29kZWNEZWxheUJ1ZiAmJiAhc2Vla1ByZVJvbGxCdWYpIHsKKyAgICAgICAgICAgICAgICBHZXRPcHVzSGVhZGVyQnVmZmVycyhjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSwgJm9wdXNIZWFkQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wdXNIZWFkU2l6ZSwgJmNvZGVjRGVsYXlCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNEZWxheUJ1ZlNpemUsICZzZWVrUHJlUm9sbEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWVrUHJlUm9sbEJ1ZlNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5T3B1c0hlYWRlciwgMCwgb3B1c0hlYWRCdWYsIG9wdXNIZWFkU2l6ZSk7CisgICAgICAgICAgICBpZiAoY29kZWNEZWxheUJ1ZikgeworICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU9wdXNDb2RlY0RlbGF5LCAwLCBjb2RlY0RlbGF5QnVmLCBjb2RlY0RlbGF5QnVmU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2Vla1ByZVJvbGxCdWYpIHsKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlPcHVzU2Vla1ByZVJvbGwsIDAsIHNlZWtQcmVSb2xsQnVmLCBzZWVrUHJlUm9sbEJ1ZlNpemUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSB7CiAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlWb3JiaXNJbmZvLCAwLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CkBAIC0xNTYwLDExICsxODA1LDE3IEBACiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDKSB7CiAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBbGFjTWFnaWNDb29raWUsIDAsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKICAgICAgICAgfQotICAgIH0KLQotICAgIGludDMyX3QgdGltZVNjYWxlOwotICAgIGlmIChtc2ctPmZpbmRJbnQzMigidGltZS1zY2FsZSIsICZ0aW1lU2NhbGUpKSB7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaW1lU2NhbGUsIHRpbWVTY2FsZSk7CisgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyAmJiBtc2ctPmZpbmRCdWZmZXIoImNzZC1hdmMiLCAmY3NkMCkpIHsKKyAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga1R5cGVBVkNDLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CisgICAgfSBlbHNlIGlmICgobWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDIHx8IG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKQorICAgICAgICAgICAgJiYgbXNnLT5maW5kQnVmZmVyKCJjc2QtaGV2YyIsICZjc2QwKSkgeworICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKKyAgICB9IGVsc2UgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiZXNkcyIsICZjc2QwKSkgeworICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrVHlwZUVTRFMsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKKyAgICB9IGVsc2UgaWYgKG1zZy0+ZmluZEJ1ZmZlcigibXBlZzItc3RyZWFtLWhlYWRlciIsICZjc2QwKSkgeworICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlTdHJlYW1IZWFkZXIsICdtZGF0JywgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOworICAgIH0gZWxzZSBpZiAobXNnLT5maW5kQnVmZmVyKCJkMjYzIiwgJmNzZDApKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUQyNjMsIGtUeXBlRDI2MywgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwogICAgIH0KIAogICAgIC8vIFhYWCBUT0RPIGFkZCB3aGF0ZXZlciBvdGhlciBrZXlzIHRoZXJlIGFyZQpAQCAtMTY0MCw2ICsxODkxLDkgQEAKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywgICAgICBBVURJT19GT1JNQVRfVk9SQklTIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCAgICAgICAgQVVESU9fRk9STUFUX09QVVN9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzLCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQzN9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMywgICAgICAgIEFVRElPX0ZPUk1BVF9FX0FDM30sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzX0pPQywgICAgQVVESU9fRk9STUFUX0VfQUMzX0pPQ30sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQsICAgICAgICAgQVVESU9fRk9STUFUX0FDNH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDLCAgICAgICAgQVVESU9fRk9STUFUX0ZMQUN9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUxBQywgICAgICAgIEFVRElPX0ZPUk1BVF9BTEFDIH0sCiAgICAgeyAwLCBBVURJT19GT1JNQVRfSU5WQUxJRCB9CkBAIC0xNjkzLDQzICsxOTQ3LDQzIEBACiAgICAgcmV0dXJuOwogfQogCi1ib29sIGNhbk9mZmxvYWRTdHJlYW0oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKK3N0YXR1c190IGdldEF1ZGlvT2ZmbG9hZEluZm8oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAorICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsIGF1ZGlvX29mZmxvYWRfaW5mb190ICppbmZvKQogewogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgaWYgKG1ldGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKIAotICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IGluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgICgqaW5mbykgPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOwogCi0gICAgaW5mby5mb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICBpZiAobWFwTWltZVRvQXVkaW9Gb3JtYXQoaW5mby5mb3JtYXQsIG1pbWUpICE9IE9LKSB7CisgICAgaW5mby0+Zm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgaWYgKG1hcE1pbWVUb0F1ZGlvRm9ybWF0KGluZm8tPmZvcm1hdCwgbWltZSkgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiBDb3VsZG4ndCBtYXAgbWltZSB0eXBlIFwiJXNcIiB0byBhIHZhbGlkIEF1ZGlvU3lzdGVtOjphdWRpb19mb3JtYXQgISIsIG1pbWUpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIk1pbWUgdHlwZSBcIiVzXCIgbWFwcGVkIHRvIGF1ZGlvX2Zvcm1hdCAlZCIsIG1pbWUsIGluZm8uZm9ybWF0KTsKKyAgICAgICAgQUxPR1YoIk1pbWUgdHlwZSBcIiVzXCIgbWFwcGVkIHRvIGF1ZGlvX2Zvcm1hdCAlZCIsIG1pbWUsIGluZm8tPmZvcm1hdCk7CiAgICAgfQogCi0gICAgaWYgKEFVRElPX0ZPUk1BVF9JTlZBTElEID09IGluZm8uZm9ybWF0KSB7CisgICAgaWYgKEFVRElPX0ZPUk1BVF9JTlZBTElEID09IGluZm8tPmZvcm1hdCkgewogICAgICAgICAvLyBjYW4ndCBvZmZsb2FkIGlmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgc291cmNlIGZvcm1hdCBpcwogICAgICAgICBBTE9HRSgibWltZSB0eXBlIFwiJXNcIiBub3QgYSBrbm93biBhdWRpbyBmb3JtYXQiLCBtaW1lKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIC8vIFJlZGVmaW5lIGFhYyBmb3JtYXQgYWNjb3JkaW5nIHRvIGl0cyBwcm9maWxlCiAgICAgLy8gT2ZmbG9hZGluZyBkZXBlbmRzIG9uIGF1ZGlvIERTUCBjYXBhYmlsaXRpZXMuCiAgICAgaW50MzJfdCBhYWNhb3QgPSAtMTsKICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlBQUNBT1QsICZhYWNhb3QpKSB7Ci0gICAgICAgIG1hcEFBQ1Byb2ZpbGVUb0F1ZGlvRm9ybWF0KGluZm8uZm9ybWF0LChPTVhfQVVESU9fQUFDUFJPRklMRVRZUEUpIGFhY2FvdCk7CisgICAgICAgIG1hcEFBQ1Byb2ZpbGVUb0F1ZGlvRm9ybWF0KGluZm8tPmZvcm1hdCwoT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFKSBhYWNhb3QpOwogICAgIH0KIAogICAgIGludDMyX3Qgc3JhdGUgPSAtMTsKICAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNyYXRlKSkgewogICAgICAgICBBTE9HVigidHJhY2sgb2YgdHlwZSAnJXMnIGRvZXMgbm90IHB1Ymxpc2ggc2FtcGxlIHJhdGUiLCBtaW1lKTsKICAgICB9Ci0gICAgaW5mby5zYW1wbGVfcmF0ZSA9IHNyYXRlOworICAgIGluZm8tPnNhbXBsZV9yYXRlID0gc3JhdGU7CiAKICAgICBpbnQzMl90IGNtYXNrID0gMDsKICAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbE1hc2ssICZjbWFzaykgfHwgY21hc2sgPT0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSKSB7CkBAIC0xNzQzLDI1ICsxOTk3LDM0IEBACiAgICAgICAgICAgICBjbWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpOwogICAgICAgICB9CiAgICAgfQotICAgIGluZm8uY2hhbm5lbF9tYXNrID0gY21hc2s7CisgICAgaW5mby0+Y2hhbm5lbF9tYXNrID0gY21hc2s7CiAKICAgICBpbnQ2NF90IGR1cmF0aW9uID0gMDsKICAgICBpZiAoIW1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikpIHsKICAgICAgICAgQUxPR1YoInRyYWNrIG9mIHR5cGUgJyVzJyBkb2VzIG5vdCBwdWJsaXNoIGR1cmF0aW9uIiwgbWltZSk7CiAgICAgfQotICAgIGluZm8uZHVyYXRpb25fdXMgPSBkdXJhdGlvbjsKKyAgICBpbmZvLT5kdXJhdGlvbl91cyA9IGR1cmF0aW9uOwogCiAgICAgaW50MzJfdCBicmF0ZSA9IC0xOwogICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYnJhdGUpKSB7CiAgICAgICAgIEFMT0dWKCJ0cmFjayBvZiB0eXBlICclcycgZG9lcyBub3QgcHVibGlzaCBiaXRyYXRlIiwgbWltZSk7CiAgICAgfQotICAgIGluZm8uYml0X3JhdGUgPSBicmF0ZTsKKyAgICBpbmZvLT5iaXRfcmF0ZSA9IGJyYXRlOwogCiAKLSAgICBpbmZvLnN0cmVhbV90eXBlID0gc3RyZWFtVHlwZTsKLSAgICBpbmZvLmhhc192aWRlbyA9IGhhc1ZpZGVvOwotICAgIGluZm8uaXNfc3RyZWFtaW5nID0gaXNTdHJlYW1pbmc7CisgICAgaW5mby0+c3RyZWFtX3R5cGUgPSBzdHJlYW1UeXBlOworICAgIGluZm8tPmhhc192aWRlbyA9IGhhc1ZpZGVvOworICAgIGluZm8tPmlzX3N0cmVhbWluZyA9IGlzU3RyZWFtaW5nOworICAgIHJldHVybiBPSzsKK30KIAorYm9vbCBjYW5PZmZsb2FkU3RyZWFtKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpCit7CisgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgaW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgaWYgKE9LICE9IGdldEF1ZGlvT2ZmbG9hZEluZm8obWV0YSwgaGFzVmlkZW8sIGlzU3RyZWFtaW5nLCBzdHJlYW1UeXBlLCAmaW5mbykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICAvLyBDaGVjayBpZiBvZmZsb2FkIGlzIHBvc3NpYmxlIGZvciBnaXZlbiBmb3JtYXQsIHN0cmVhbSB0eXBlLCBzYW1wbGUgcmF0ZSwKICAgICAvLyBiaXQgcmF0ZSwgZHVyYXRpb24sIHZpZGVvIGFuZCBzdHJlYW1pbmcKICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmlzT2ZmbG9hZFN1cHBvcnRlZChpbmZvKTsKQEAgLTE5MzEsNCArMjE5NCwzIEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKaW5kZXggOTAyMGZjMS4uNGU1YjVlMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xOSw4ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19WSURFTwogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+Ci0KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KQEAgLTMyLDMyMSArMzEsMTQgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrTmFub3NJbjFzID0gMTAwMDAwMDAwMDsKLQotdGVtcGxhdGU8Y2xhc3MgVD4KLXN0YXRpYyBpbnQgY29tcGFyZShjb25zdCBUICpsaHMsIGNvbnN0IFQgKnJocykgewotICAgIGlmICgqbGhzIDwgKnJocykgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmICgqbGhzID4gKnJocykgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUExMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotc3RhdGljIGNvbnN0IHNpemVfdCBrTWluU2FtcGxlc1RvU3RhcnRQcmltZSA9IDM7Ci1zdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyOjprSGlzdG9yeVNpemU7Ci1zdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCA9IDM7Ci1zdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhTYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCA9IFZpZGVvRnJhbWVTY2hlZHVsZXI6OmtIaXN0b3J5U2l6ZTsKLQotc3RhdGljIGNvbnN0IHNpemVfdCBrUHJlY2lzaW9uID0gMTI7Ci1zdGF0aWMgY29uc3QgaW50NjRfdCBrRXJyb3JUaHJlc2hvbGQgPSAoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSAvIDEwOwotc3RhdGljIGNvbnN0IGludDY0X3Qga011bHRpcGxlc1RocmVzaG9sZERpdiA9IDQ7ICAgICAgICAgICAgLy8gMjUlCi1zdGF0aWMgY29uc3QgaW50NjRfdCBrUmVGaXRUaHJlc2hvbGREaXYgPSAxMDA7ICAgICAgICAgICAgICAvLyAxJQotc3RhdGljIGNvbnN0IG5zZWNzX3Qga01heEFsbG93ZWRGcmFtZVNraXAgPSBrTmFub3NJbjFzOyAgICAgLy8gMSBzZWMKLXN0YXRpYyBjb25zdCBuc2Vjc190IGtNaW5QZXJpb2QgPSBrTmFub3NJbjFzIC8gMTIwOyAgICAgICAgIC8vIDEyMEh6Ci1zdGF0aWMgY29uc3QgbnNlY3NfdCBrUmVmaXRSZWZyZXNoUGVyaW9kID0gMTAgKiBrTmFub3NJbjFzOyAvLyAxMCBzZWMKLQotVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpQTEwoKQotICAgIDogbVBlcmlvZCgtMSksCi0gICAgICBtUGhhc2UoMCksCi0gICAgICBtUHJpbWVkKGZhbHNlKSwKLSAgICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcoMCksCi0gICAgICBtTGFzdFRpbWUoLTEpLAotICAgICAgbU51bVNhbXBsZXMoMCkgewotfQotCi12b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6cmVzZXQoZmxvYXQgZnBzKSB7Ci0gICAgLy90ZXN0KCk7Ci0KLSAgICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID0gMDsKLSAgICBtTGFzdFRpbWUgPSAtMTsKLQotICAgIC8vIHNldCB1cCBvciByZXNldCB2aWRlbyBQTEwKLSAgICBpZiAoZnBzIDw9IDAuZikgewotICAgICAgICBtUGVyaW9kID0gLTE7Ci0gICAgICAgIG1QcmltZWQgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigicmVzZXQgYXQgJS4xZiBmcHMiLCBmcHMpOwotICAgICAgICBtUGVyaW9kID0gKG5zZWNzX3QpKDFlOSAvIGZwcyArIDAuNSk7Ci0gICAgICAgIG1QcmltZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHJlc3RhcnQoKTsKLX0KLQotLy8gcmVzZXQgUExMIGJ1dCBrZWVwIHByZXZpb3VzIHBlcmlvZCBlc3RpbWF0ZQotdm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OnJlc3RhcnQoKSB7Ci0gICAgbU51bVNhbXBsZXMgPSAwOwotICAgIG1QaGFzZSA9IC0xOwotfQotCi0jaWYgMAotCi12b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6dGVzdCgpIHsKLSAgICBuc2Vjc190IHBlcmlvZCA9IGtOYW5vc0luMXMgLyA2MDsKLSAgICBtVGltZXNbMF0gPSAwOwotICAgIG1UaW1lc1sxXSA9IHBlcmlvZDsKLSAgICBtVGltZXNbMl0gPSBwZXJpb2QgKiAzOwotICAgIG1UaW1lc1szXSA9IHBlcmlvZCAqIDQ7Ci0gICAgbVRpbWVzWzRdID0gcGVyaW9kICogNzsKLSAgICBtVGltZXNbNV0gPSBwZXJpb2QgKiA4OwotICAgIG1UaW1lc1s2XSA9IHBlcmlvZCAqIDEwOwotICAgIG1UaW1lc1s3XSA9IHBlcmlvZCAqIDEyOwotICAgIG1OdW1TYW1wbGVzID0gODsKLSAgICBpbnQ2NF90IGEsIGIsIGVycjsKLSAgICBmaXQoMCwgcGVyaW9kICogMTIgLyA3LCA4LCAmYSwgJmIsICZlcnIpOwotICAgIC8vIGEgPSAwLjgoNSkrCi0gICAgLy8gYiA9IC0wLjE0MDk3KDIpKwotICAgIC8vIGVyciA9IDAuMjc1MDU3OCg3MDMpKwotICAgIEFMT0dEKCJhPSVsbGQgKCUuNmYpLCBiPSVsbGQgKCUuNmYpLCBlcnI9JWxsZCAoJS42ZikiLAotICAgICAgICAgICAgKGxvbmcgbG9uZylhLCAoYSAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCi0gICAgICAgICAgICAobG9uZyBsb25nKWIsIChiIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKLSAgICAgICAgICAgIChsb25nIGxvbmcpZXJyLCAoZXJyIC8gKGZsb2F0KSgxIDw8IChrUHJlY2lzaW9uICogMikpKSk7Ci19Ci0KLSNlbmRpZgotCi1ib29sIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6Zml0KAotICAgICAgICBuc2Vjc190IHBoYXNlLCBuc2Vjc190IHBlcmlvZCwgc2l6ZV90IG51bVNhbXBsZXNUb1VzZSwKLSAgICAgICAgaW50NjRfdCAqYSwgaW50NjRfdCAqYiwgaW50NjRfdCAqZXJyKSB7Ci0gICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+IG1OdW1TYW1wbGVzKSB7Ci0gICAgICAgIG51bVNhbXBsZXNUb1VzZSA9IG1OdW1TYW1wbGVzOwotICAgIH0KLQotICAgIGlmICgocGVyaW9kID4+IGtQcmVjaXNpb24pID09IDAgKSB7Ci0gICAgICAgIEFMT0dXKCJQZXJpb2QgaXMgMCwgb3IgYWZ0ZXIgaW5jbHVkaW5nIHByZWNpc2lvbiBpcyAwIC0gd291bGQgY2F1c2UgZGl2MCwgcmV0dXJuaW5nIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHN1bVggPSAwOwotICAgIGludDY0X3Qgc3VtWFggPSAwOwotICAgIGludDY0X3Qgc3VtWFkgPSAwOwotICAgIGludDY0X3Qgc3VtWVkgPSAwOwotICAgIGludDY0X3Qgc3VtWSA9IDA7Ci0KLSAgICBpbnQ2NF90IHggPSAwOyAvLyB4IHVzdWFsbHkgaXMgaW4gWzAuLm51bVNhbXBsZXNUb1VzZSkKLSAgICBuc2Vjc190IGxhc3RUaW1lOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2FtcGxlc1RvVXNlOyBpKyspIHsKLSAgICAgICAgc2l6ZV90IGl4ID0gKG1OdW1TYW1wbGVzIC0gbnVtU2FtcGxlc1RvVXNlICsgaSkgJSBrSGlzdG9yeVNpemU7Ci0gICAgICAgIG5zZWNzX3QgdGltZSA9IG1UaW1lc1tpeF07Ci0gICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgeCArPSBkaXZSb3VuZCh0aW1lIC0gbGFzdFRpbWUsIHBlcmlvZCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8geSBpcyB1c3VhbGx5IGluIFstbnVtU2FtcGxlc1RvVXNlLi5udW1TYW1wbGVzVG9Vc2Ura1JlZml0UmVmcmVzaFBlcmlvZC9rTWluUGVyaW9kKSA8PCBrUHJlY2lzaW9uCi0gICAgICAgIC8vICAgaWRlYWxseSBpbiBbMC4ubnVtU2FtcGxlc1RvVXNlKSwgYnV0IHNoaWZ0ZWQgYnkgLW51bVNhbXBsZXNUb1VzZSBkdXJpbmcKLSAgICAgICAgLy8gICBwcmltaW5nLCBhbmQgcG9zc2libHkgc2hpZnRlZCBieSB1cCB0byBrUmVmaXRSZWZyZXNoUGVyaW9kL2tNaW5QZXJpb2QKLSAgICAgICAgLy8gICB3aGlsZSB3ZSBhcmUgbm90IHJlZml0dGluZy4KLSAgICAgICAgaW50NjRfdCB5ID0gZGl2Um91bmQodGltZSAtIHBoYXNlLCBwZXJpb2QgPj4ga1ByZWNpc2lvbik7Ci0gICAgICAgIHN1bVggKz0geDsKLSAgICAgICAgc3VtWSArPSB5OwotICAgICAgICBzdW1YWCArPSB4ICogeDsKLSAgICAgICAgc3VtWFkgKz0geCAqIHk7Ci0gICAgICAgIHN1bVlZICs9IHkgKiB5OwotICAgICAgICBsYXN0VGltZSA9IHRpbWU7Ci0gICAgfQotCi0gICAgaW50NjRfdCBkaXYgICA9IChpbnQ2NF90KW51bVNhbXBsZXNUb1VzZSAqIHN1bVhYIC0gc3VtWCAqIHN1bVg7Ci0gICAgaWYgKGRpdiA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IGFfbm9tID0gKGludDY0X3QpbnVtU2FtcGxlc1RvVXNlICogc3VtWFkgLSBzdW1YICogc3VtWTsKLSAgICBpbnQ2NF90IGJfbm9tID0gc3VtWFggKiBzdW1ZICAgICAgICAgICAgLSBzdW1YICogc3VtWFk7Ci0gICAgKmEgPSBkaXZSb3VuZChhX25vbSwgZGl2KTsKLSAgICAqYiA9IGRpdlJvdW5kKGJfbm9tLCBkaXYpOwotICAgIC8vIGRvbid0IHVzZSBhIGFuZCBiIGRpcmVjdGx5IGFzIHRoZSByb3VuZGluZyBlcnJvciBpcyBzaWduaWZpY2FudAotICAgICplcnIgPSBzdW1ZWSAtIGRpdlJvdW5kKGFfbm9tICogc3VtWFkgKyBiX25vbSAqIHN1bVksIGRpdik7Ci0gICAgQUxPR1YoImZpdHRpbmdbJXp1XSBhPSVsbGQgKCUuNmYpLCBiPSVsbGQgKCUuNmYpLCBlcnI9JWxsZCAoJS42ZikiLAotICAgICAgICAgICAgbnVtU2FtcGxlc1RvVXNlLAotICAgICAgICAgICAgKGxvbmcgbG9uZykqYSwgICAoKmEgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAotICAgICAgICAgICAgKGxvbmcgbG9uZykqYiwgICAoKmIgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAotICAgICAgICAgICAgKGxvbmcgbG9uZykqZXJyLCAoKmVyciAvIChmbG9hdCkoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6cHJpbWUoc2l6ZV90IG51bVNhbXBsZXNUb1VzZSkgewotICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPiBtTnVtU2FtcGxlcykgewotICAgICAgICBudW1TYW1wbGVzVG9Vc2UgPSBtTnVtU2FtcGxlczsKLSAgICB9Ci0gICAgQ0hFQ0sobnVtU2FtcGxlc1RvVXNlID49IDMpOyAgLy8gbXVzdCBoYXZlIGF0IGxlYXN0IDMgc2FtcGxlcwotCi0gICAgLy8gZXN0aW1hdGUgdmlkZW8gZnJhbWVyYXRlIGZyb20gZGVsdGFzIGJldHdlZW4gdGltZXN0YW1wcywgYW5kCi0gICAgLy8gMm5kIG9yZGVyIGRlbHRhcwotICAgIFZlY3Rvcjxuc2Vjc190PiBkZWx0YXM7Ci0gICAgbnNlY3NfdCBsYXN0VGltZSwgZmlyc3RUaW1lOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2FtcGxlc1RvVXNlOyArK2kpIHsKLSAgICAgICAgc2l6ZV90IGluZGV4ID0gKG1OdW1TYW1wbGVzIC0gbnVtU2FtcGxlc1RvVXNlICsgaSkgJSBrSGlzdG9yeVNpemU7Ci0gICAgICAgIG5zZWNzX3QgdGltZSA9IG1UaW1lc1tpbmRleF07Ci0gICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgaWYgKHRpbWUgLSBsYXN0VGltZSA+IGtNaW5QZXJpb2QpIHsKLSAgICAgICAgICAgICAgICAvL0FMT0dWKCJkZWx0YTogJWxsZCIsIChsb25nIGxvbmcpKHRpbWUgLSBsYXN0VGltZSkpOwotICAgICAgICAgICAgICAgIGRlbHRhcy5wdXNoKHRpbWUgLSBsYXN0VGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaXJzdFRpbWUgPSB0aW1lOwotICAgICAgICB9Ci0gICAgICAgIGxhc3RUaW1lID0gdGltZTsKLSAgICB9Ci0gICAgZGVsdGFzLnNvcnQoY29tcGFyZTxuc2Vjc190Pik7Ci0gICAgc2l6ZV90IG51bURlbHRhcyA9IGRlbHRhcy5zaXplKCk7Ci0gICAgaWYgKG51bURlbHRhcyA+IDEpIHsKLSAgICAgICAgbnNlY3NfdCBkZWx0YU1pbkxpbWl0ID0gbWF4KGRlbHRhc1swXSAvIGtNdWx0aXBsZXNUaHJlc2hvbGREaXYsIGtNaW5QZXJpb2QpOwotICAgICAgICBuc2Vjc190IGRlbHRhTWF4TGltaXQgPSBkZWx0YXNbbnVtRGVsdGFzIC8gMl0gKiBrTXVsdGlwbGVzVGhyZXNob2xkRGl2OwotICAgICAgICBmb3IgKHNpemVfdCBpID0gbnVtRGVsdGFzIC8gMiArIDE7IGkgPCBudW1EZWx0YXM7ICsraSkgewotICAgICAgICAgICAgaWYgKGRlbHRhc1tpXSA+IGRlbHRhTWF4TGltaXQpIHsKLSAgICAgICAgICAgICAgICBkZWx0YXMucmVzaXplKGkpOwotICAgICAgICAgICAgICAgIG51bURlbHRhcyA9IGk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBudW1EZWx0YXM7ICsraSkgewotICAgICAgICAgICAgbnNlY3NfdCBkZWx0YTJuZCA9IGRlbHRhc1tpXSAtIGRlbHRhc1tpIC0gMV07Ci0gICAgICAgICAgICBpZiAoZGVsdGEybmQgPj0gZGVsdGFNaW5MaW1pdCkgewotICAgICAgICAgICAgICAgIC8vQUxPR1YoImRlbHRhMjogJWxsZCIsIChsb25nIGxvbmcpKGRlbHRhMm5kKSk7Ci0gICAgICAgICAgICAgICAgZGVsdGFzLnB1c2goZGVsdGEybmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gdXNlIHRoZSBvbmUgdGhhdCB5aWVsZHMgdGhlIGJlc3QgbWF0Y2gKLSAgICBpbnQ2NF90IGJlc3RTY29yZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRlbHRhcy5zaXplKCk7ICsraSkgewotICAgICAgICBuc2Vjc190IGRlbHRhID0gZGVsdGFzW2ldOwotICAgICAgICBpbnQ2NF90IHNjb3JlID0gMDsKLSNpZiAxCi0gICAgICAgIC8vIHNpbXBsZXN0IHNjb3JlOiBudW1iZXIgb2YgZGVsdGFzIHRoYXQgYXJlIG5lYXIgbXVsdGlwbGVzCi0gICAgICAgIHNpemVfdCBtYXRjaGVzID0gMDsKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBkZWx0YXMuc2l6ZSgpOyArK2opIHsKLSAgICAgICAgICAgIG5zZWNzX3QgZXJyID0gcGVyaW9kaWNFcnJvcihkZWx0YXNbal0sIGRlbHRhKTsKLSAgICAgICAgICAgIGlmIChlcnIgPCBkZWx0YSAvIGtNdWx0aXBsZXNUaHJlc2hvbGREaXYpIHsKLSAgICAgICAgICAgICAgICArK21hdGNoZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2NvcmUgPSBtYXRjaGVzOwotI2lmIDAKLSAgICAgICAgLy8gY291bGQgYmUgd2VpZ2hlZCBieSB0aGUgKDEgLSBub3JtYWxpemVkIGVycm9yKQotICAgICAgICBpZiAobnVtU2FtcGxlc1RvVXNlID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgewotICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7Ci0gICAgICAgICAgICBmaXQoZmlyc3RUaW1lLCBkZWx0YSwgbnVtU2FtcGxlc1RvVXNlLCAmYSwgJmIsICZlcnIpOwotICAgICAgICAgICAgZXJyID0gKDEgPDwgKDIgKiBrUHJlY2lzaW9uKSkgLSBlcnI7Ci0gICAgICAgICAgICBzY29yZSAqPSBtYXgoMCwgZXJyKTsKLSAgICAgICAgfQotI2VuZGlmCi0jZWxzZQotICAgICAgICAvLyBvciB1c2UgdGhlIGVycm9yIGFzIGEgbmVnYXRpdmUgc2NvcmUKLSAgICAgICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+PSBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QpIHsKLSAgICAgICAgICAgIGludDY0X3QgYSwgYiwgZXJyOwotICAgICAgICAgICAgZml0KGZpcnN0VGltZSwgZGVsdGEsIG51bVNhbXBsZXNUb1VzZSwgJmEsICZiLCAmZXJyKTsKLSAgICAgICAgICAgIHNjb3JlID0gLWRlbHRhICogZXJyOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgaWYgKGkgPT0gMCB8fCBzY29yZSA+IGJlc3RTY29yZSkgewotICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7Ci0gICAgICAgICAgICBtUGVyaW9kID0gZGVsdGE7Ci0gICAgICAgICAgICBtUGhhc2UgPSBmaXJzdFRpbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR1YoInByaW1pbmdbJXp1XSBwaGFzZTolbGxkIHBlcmlvZDolbGxkIiwKLSAgICAgICAgICAgIG51bVNhbXBsZXNUb1VzZSwgKGxvbmcgbG9uZyltUGhhc2UsIChsb25nIGxvbmcpbVBlcmlvZCk7Ci19Ci0KLW5zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjphZGRTYW1wbGUobnNlY3NfdCB0aW1lKSB7Ci0gICAgaWYgKG1MYXN0VGltZSA+PSAwCi0gICAgICAgICAgICAvLyBpZiB0aW1lIGdvZXMgYmFja3dhcmQsIG9yIHdlIHNraXBwZWQgcmVuZGVyaW5nCi0gICAgICAgICAgICAmJiAodGltZSA+IG1MYXN0VGltZSArIGtNYXhBbGxvd2VkRnJhbWVTa2lwIHx8IHRpbWUgPCBtTGFzdFRpbWUpKSB7Ci0gICAgICAgIHJlc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBtTGFzdFRpbWUgPSB0aW1lOwotICAgIG1UaW1lc1ttTnVtU2FtcGxlcyAlIGtIaXN0b3J5U2l6ZV0gPSB0aW1lOwotICAgICsrbU51bVNhbXBsZXM7Ci0KLSAgICBib29sIGRvRml0ID0gdGltZSA+IG1SZWZpdEF0OwotICAgIGlmICgobVBlcmlvZCA8PSAwIHx8ICFtUHJpbWVkKSAmJiBtTnVtU2FtcGxlcyA+PSBrTWluU2FtcGxlc1RvU3RhcnRQcmltZSkgewotICAgICAgICBwcmltZShrTWluU2FtcGxlc1RvU3RvcFByaW1lKTsKLSAgICAgICAgKyttU2FtcGxlc1VzZWRGb3JQcmltaW5nOwotICAgICAgICBkb0ZpdCA9IHRydWU7Ci0gICAgfQotICAgIGlmIChtUGVyaW9kID4gMCAmJiBtTnVtU2FtcGxlcyA+PSBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QpIHsKLSAgICAgICAgaWYgKG1QaGFzZSA8IDApIHsKLSAgICAgICAgICAgIC8vIGluaXRpYWxpemUgcGhhc2UgdG8gdGhlIGN1cnJlbnQgcmVuZGVyIHRpbWUKLSAgICAgICAgICAgIG1QaGFzZSA9IHRpbWU7Ci0gICAgICAgICAgICBkb0ZpdCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIWRvRml0KSB7Ci0gICAgICAgICAgICBpbnQ2NF90IGVyciA9IHBlcmlvZGljRXJyb3IodGltZSAtIG1QaGFzZSwgbVBlcmlvZCk7Ci0gICAgICAgICAgICBkb0ZpdCA9IGVyciA+IG1QZXJpb2QgLyBrUmVGaXRUaHJlc2hvbGREaXY7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZG9GaXQpIHsKLSAgICAgICAgICAgIGludDY0X3QgYSwgYiwgZXJyOwotICAgICAgICAgICAgaWYgKCFmaXQobVBoYXNlLCBtUGVyaW9kLCBrTWF4U2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QsICZhLCAmYiwgJmVycikpIHsKLSAgICAgICAgICAgICAgICAvLyBzYW1wbGVzIGFyZSBub3Qgc3VpdGFibGUgZm9yIGZpdHRpbmcuICB0aGlzIG1lYW5zIHRoZXkgYXJlCi0gICAgICAgICAgICAgICAgLy8gYWxzbyBub3Qgc3VpdGFibGUgZm9yIHByaW1pbmcuCi0gICAgICAgICAgICAgICAgQUxPR1YoImNvdWxkIG5vdCBmaXQgLSBrZWVwaW5nIG9sZCBwZXJpb2Q6JWxsZCIsIChsb25nIGxvbmcpbVBlcmlvZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1QZXJpb2Q7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1SZWZpdEF0ID0gdGltZSArIGtSZWZpdFJlZnJlc2hQZXJpb2Q7Ci0KLSAgICAgICAgICAgIG1QaGFzZSArPSAobVBlcmlvZCAqIGIpID4+IGtQcmVjaXNpb247Ci0gICAgICAgICAgICBtUGVyaW9kID0gKG1QZXJpb2QgKiBhKSA+PiBrUHJlY2lzaW9uOwotICAgICAgICAgICAgQUxPR1YoIm5ldyBwaGFzZTolbGxkIHBlcmlvZDolbGxkIiwgKGxvbmcgbG9uZyltUGhhc2UsIChsb25nIGxvbmcpbVBlcmlvZCk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgPCBrRXJyb3JUaHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1QcmltZWQgJiYgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA+PSBrTWluU2FtcGxlc1RvU3RvcFByaW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmltZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVByaW1lZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtUGVyaW9kOwotfQotCi1uc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6Z2V0UGVyaW9kKCkgY29uc3QgewotICAgIHJldHVybiBtUHJpbWVkID8gbVBlcmlvZCA6IDA7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWUgU2NoZWR1bGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotc3RhdGljIGNvbnN0IG5zZWNzX3Qga0RlZmF1bHRWc3luY1BlcmlvZCA9IGtOYW5vc0luMXMgLyA2MDsgIC8vIDYwSHoKLXN0YXRpYyBjb25zdCBuc2Vjc190IGtWc3luY1JlZnJlc2hQZXJpb2QgPSBrTmFub3NJbjFzOyAgICAgICAvLyAxIHNlYwotCi1WaWRlb0ZyYW1lU2NoZWR1bGVyOjpWaWRlb0ZyYW1lU2NoZWR1bGVyKCkKLSAgICA6IG1Wc3luY1RpbWUoMCksCi0gICAgICBtVnN5bmNQZXJpb2QoMCksCi0gICAgICBtVnN5bmNSZWZyZXNoQXQoMCksCi0gICAgICBtTGFzdFZzeW5jVGltZSgtMSksCi0gICAgICBtVGltZUNvcnJlY3Rpb24oMCkgeworVmlkZW9GcmFtZVNjaGVkdWxlcjo6VmlkZW9GcmFtZVNjaGVkdWxlcigpIDogVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UoKSB7CiB9CiAKIHZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6dXBkYXRlVnN5bmMoKSB7CiAgICAgbVZzeW5jUmVmcmVzaEF0ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpICsga1ZzeW5jUmVmcmVzaFBlcmlvZDsKLSAgICBtVnN5bmNQZXJpb2QgPSAwOwogICAgIG1Wc3luY1RpbWUgPSAwOworICAgIG1Wc3luY1BlcmlvZCA9IDA7CiAKLSAgICAvLyBUT0RPOiBzY2hlZHVsZSBmcmFtZXMgZm9yIHRoZSBkZXN0aW5hdGlvbiBzdXJmYWNlCi0gICAgLy8gRm9yIG5vdywgc3VyZmFjZSBmbGluZ2VyIG9ubHkgc2NoZWR1bGVzIGZyYW1lcyBvbiB0aGUgcHJpbWFyeSBkaXNwbGF5CiAgICAgaWYgKG1Db21wb3NlciA9PSBOVUxMKSB7CiAgICAgICAgIFN0cmluZzE2IG5hbWUoIlN1cmZhY2VGbGluZ2VyIik7CiAgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKQEAgLTM2OCwxMzYgKzYwLDYgQEAKICAgICB9CiB9CiAKLXZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6aW5pdChmbG9hdCB2aWRlb0ZwcykgewotICAgIHVwZGF0ZVZzeW5jKCk7Ci0KLSAgICBtTGFzdFZzeW5jVGltZSA9IC0xOwotICAgIG1UaW1lQ29ycmVjdGlvbiA9IDA7Ci0KLSAgICBtUGxsLnJlc2V0KHZpZGVvRnBzKTsKLX0KLQotdm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpyZXN0YXJ0KCkgewotICAgIG1MYXN0VnN5bmNUaW1lID0gLTE7Ci0gICAgbVRpbWVDb3JyZWN0aW9uID0gMDsKLQotICAgIG1QbGwucmVzdGFydCgpOwotfQotCi1uc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXI6OmdldFZzeW5jUGVyaW9kKCkgewotICAgIGlmIChtVnN5bmNQZXJpb2QgPiAwKSB7Ci0gICAgICAgIHJldHVybiBtVnN5bmNQZXJpb2Q7Ci0gICAgfQotICAgIHJldHVybiBrRGVmYXVsdFZzeW5jUGVyaW9kOwotfQotCi1mbG9hdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpnZXRGcmFtZVJhdGUoKSB7Ci0gICAgbnNlY3NfdCB2aWRlb1BlcmlvZCA9IG1QbGwuZ2V0UGVyaW9kKCk7Ci0gICAgaWYgKHZpZGVvUGVyaW9kID4gMCkgewotICAgICAgICByZXR1cm4gMWU5IC8gdmlkZW9QZXJpb2Q7Ci0gICAgfQotICAgIHJldHVybiAwLmY7Ci19Ci0KLW5zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6c2NoZWR1bGUobnNlY3NfdCByZW5kZXJUaW1lKSB7Ci0gICAgbnNlY3NfdCBvcmlnUmVuZGVyVGltZSA9IHJlbmRlclRpbWU7Ci0KLSAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBpZiAobm93ID49IG1Wc3luY1JlZnJlc2hBdCkgewotICAgICAgICB1cGRhdGVWc3luYygpOwotICAgIH0KLQotICAgIC8vIHdpdGhvdXQgVlNZTkMgaW5mbywgdGhlcmUgaXMgbm90aGluZyB0byBkbwotICAgIGlmIChtVnN5bmNQZXJpb2QgPT0gMCkgewotICAgICAgICBBTE9HVigibm8gdnN5bmM6IHJlbmRlcj0lbGxkIiwgKGxvbmcgbG9uZylyZW5kZXJUaW1lKTsKLSAgICAgICAgcmV0dXJuIHJlbmRlclRpbWU7Ci0gICAgfQotCi0gICAgLy8gZW5zdXJlIHZzeW5jIHRpbWUgaXMgd2VsbCBiZWZvcmUgKGNvcnJlY3RlZCkgcmVuZGVyIHRpbWUKLSAgICBpZiAobVZzeW5jVGltZSA+IHJlbmRlclRpbWUgLSA0ICogbVZzeW5jUGVyaW9kKSB7Ci0gICAgICAgIG1Wc3luY1RpbWUgLT0KLSAgICAgICAgICAgICgobVZzeW5jVGltZSAtIHJlbmRlclRpbWUpIC8gbVZzeW5jUGVyaW9kICsgNSkgKiBtVnN5bmNQZXJpb2Q7Ci0gICAgfQotCi0gICAgLy8gVmlkZW8gcHJlc2VudGF0aW9uIHRha2VzIHBsYWNlIGF0IHRoZSBWU1lOQyBfYWZ0ZXJfIHJlbmRlclRpbWUuICBBZGp1c3QgcmVuZGVyVGltZQotICAgIC8vIHNvIHRoaXMgZWZmZWN0aXZlbHkgYmVjb21lcyBhIHJvdW5kaW5nIG9wZXJhdGlvbiAodG8gdGhlIF9jbG9zZXN0XyBWU1lOQy4pCi0gICAgcmVuZGVyVGltZSAtPSBtVnN5bmNQZXJpb2QgLyAyOwotCi0gICAgY29uc3QgbnNlY3NfdCB2aWRlb1BlcmlvZCA9IG1QbGwuYWRkU2FtcGxlKG9yaWdSZW5kZXJUaW1lKTsKLSAgICBpZiAodmlkZW9QZXJpb2QgPiAwKSB7Ci0gICAgICAgIC8vIFNtb290aCBvdXQgcmVuZGVyaW5nCi0gICAgICAgIHNpemVfdCBOID0gMTI7Ci0gICAgICAgIG5zZWNzX3QgZml2ZVNpeHRoRGV2ID0KLSAgICAgICAgICAgIGFicygoKHZpZGVvUGVyaW9kICogNSArIG1Wc3luY1BlcmlvZCkgJSAobVZzeW5jUGVyaW9kICogNikpIC0gbVZzeW5jUGVyaW9kKQotICAgICAgICAgICAgICAgICAgICAvIChtVnN5bmNQZXJpb2QgLyAxMDApOwotICAgICAgICAvLyB1c2UgMjAgc2FtcGxlcyBpZiB3ZSBhcmUgZG9pbmcgNTo2IHJhdGlvICstIDElIChlLmcuIHBsYXlpbmcgNTBIeiBvbiA2MEh6KQotICAgICAgICBpZiAoZml2ZVNpeHRoRGV2IDwgMTIpIHsgIC8qIDEyJSAvIDYgPSAyJSAqLwotICAgICAgICAgICAgTiA9IDIwOwotICAgICAgICB9Ci0KLSAgICAgICAgbnNlY3NfdCBvZmZzZXQgPSAwOwotICAgICAgICBuc2Vjc190IGVkZ2VSZW1haW5kZXIgPSAwOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8PSBOOyBpKyspIHsKLSAgICAgICAgICAgIG9mZnNldCArPQotICAgICAgICAgICAgICAgIChyZW5kZXJUaW1lICsgbVRpbWVDb3JyZWN0aW9uICsgdmlkZW9QZXJpb2QgKiBpIC0gbVZzeW5jVGltZSkgJSBtVnN5bmNQZXJpb2Q7Ci0gICAgICAgICAgICBlZGdlUmVtYWluZGVyICs9ICh2aWRlb1BlcmlvZCAqIGkpICUgbVZzeW5jUGVyaW9kOwotICAgICAgICB9Ci0gICAgICAgIG1UaW1lQ29ycmVjdGlvbiArPSBtVnN5bmNQZXJpb2QgLyAyIC0gb2Zmc2V0IC8gKG5zZWNzX3QpTjsKLSAgICAgICAgcmVuZGVyVGltZSArPSBtVGltZUNvcnJlY3Rpb247Ci0gICAgICAgIG5zZWNzX3QgY29ycmVjdGlvbkxpbWl0ID0gbVZzeW5jUGVyaW9kICogMyAvIDU7Ci0gICAgICAgIGVkZ2VSZW1haW5kZXIgPSBhYnMoZWRnZVJlbWFpbmRlciAvIChuc2Vjc190KU4gLSBtVnN5bmNQZXJpb2QgLyAyKTsKLSAgICAgICAgaWYgKGVkZ2VSZW1haW5kZXIgPD0gbVZzeW5jUGVyaW9kIC8gMykgewotICAgICAgICAgICAgY29ycmVjdGlvbkxpbWl0IC89IDI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBlc3RpbWF0ZSBob3cgbWFueSBWU1lOQ3MgYSBmcmFtZSB3aWxsIHNwZW5kIG9uIHRoZSBkaXNwbGF5Ci0gICAgICAgIG5zZWNzX3QgbmV4dFZzeW5jVGltZSA9Ci0gICAgICAgICAgICByZW5kZXJUaW1lICsgbVZzeW5jUGVyaW9kIC0gKChyZW5kZXJUaW1lIC0gbVZzeW5jVGltZSkgJSBtVnN5bmNQZXJpb2QpOwotICAgICAgICBpZiAobUxhc3RWc3luY1RpbWUgPj0gMCkgewotICAgICAgICAgICAgc2l6ZV90IG1pblZzeW5jc1BlckZyYW1lID0gdmlkZW9QZXJpb2QgLyBtVnN5bmNQZXJpb2Q7Ci0gICAgICAgICAgICBzaXplX3QgdnN5bmNzRm9yTGFzdEZyYW1lID0gZGl2Um91bmQobmV4dFZzeW5jVGltZSAtIG1MYXN0VnN5bmNUaW1lLCBtVnN5bmNQZXJpb2QpOwotICAgICAgICAgICAgYm9vbCB2c3luY3NQZXJGcmFtZUFyZU5lYXJseUNvbnN0YW50ID0KLSAgICAgICAgICAgICAgICBwZXJpb2RpY0Vycm9yKHZpZGVvUGVyaW9kLCBtVnN5bmNQZXJpb2QpIC8gKG1Wc3luY1BlcmlvZCAvIDIwKSA9PSAwOwotCi0gICAgICAgICAgICBpZiAobVRpbWVDb3JyZWN0aW9uID4gY29ycmVjdGlvbkxpbWl0ICYmCi0gICAgICAgICAgICAgICAgICAgICh2c3luY3NQZXJGcmFtZUFyZU5lYXJseUNvbnN0YW50IHx8IHZzeW5jc0Zvckxhc3RGcmFtZSA+IG1pblZzeW5jc1BlckZyYW1lKSkgewotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhIFZTWU5DCi0gICAgICAgICAgICAgICAgbVRpbWVDb3JyZWN0aW9uIC09IG1Wc3luY1BlcmlvZCAvIDI7Ci0gICAgICAgICAgICAgICAgcmVuZGVyVGltZSAtPSBtVnN5bmNQZXJpb2QgLyAyOwotICAgICAgICAgICAgICAgIG5leHRWc3luY1RpbWUgLT0gbVZzeW5jUGVyaW9kOwotICAgICAgICAgICAgICAgIGlmICh2c3luY3NGb3JMYXN0RnJhbWUgPiAwKQotICAgICAgICAgICAgICAgICAgICAtLXZzeW5jc0Zvckxhc3RGcmFtZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVRpbWVDb3JyZWN0aW9uIDwgLWNvcnJlY3Rpb25MaW1pdCAmJgotICAgICAgICAgICAgICAgICAgICAodnN5bmNzUGVyRnJhbWVBcmVOZWFybHlDb25zdGFudCB8fCB2c3luY3NGb3JMYXN0RnJhbWUgPT0gbWluVnN5bmNzUGVyRnJhbWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gYWRkIGEgVlNZTkMKLSAgICAgICAgICAgICAgICBtVGltZUNvcnJlY3Rpb24gKz0gbVZzeW5jUGVyaW9kIC8gMjsKLSAgICAgICAgICAgICAgICByZW5kZXJUaW1lICs9IG1Wc3luY1BlcmlvZCAvIDI7Ci0gICAgICAgICAgICAgICAgbmV4dFZzeW5jVGltZSArPSBtVnN5bmNQZXJpb2Q7Ci0gICAgICAgICAgICAgICAgaWYgKHZzeW5jc0Zvckxhc3RGcmFtZSA8IFVMT05HX01BWCkKLSAgICAgICAgICAgICAgICAgICAgKyt2c3luY3NGb3JMYXN0RnJhbWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1UaW1lQ29ycmVjdGlvbiA8IC1jb3JyZWN0aW9uTGltaXQgKiAyCi0gICAgICAgICAgICAgICAgICAgIHx8IG1UaW1lQ29ycmVjdGlvbiA+IGNvcnJlY3Rpb25MaW1pdCAqIDIpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY29ycmVjdGlvbiBiZXlvbmQgbGltaXQ6ICVsbGQgdnMgJWxsZCAodnN5bmNzIGZvciBsYXN0IGZyYW1lOiAlenUsIG1pbjogJXp1KSIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgcmVzdGFydGluZy4gcmVuZGVyPSVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltVGltZUNvcnJlY3Rpb24sIChsb25nIGxvbmcpY29ycmVjdGlvbkxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgdnN5bmNzRm9yTGFzdEZyYW1lLCBtaW5Wc3luY3NQZXJGcmFtZSwgKGxvbmcgbG9uZylvcmlnUmVuZGVyVGltZSk7Ci0gICAgICAgICAgICAgICAgcmVzdGFydCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBvcmlnUmVuZGVyVGltZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQVRSQUNFX0lOVCgiRlJBTUVfVlNZTkNTIiwgdnN5bmNzRm9yTGFzdEZyYW1lKTsKLSAgICAgICAgfQotICAgICAgICBtTGFzdFZzeW5jVGltZSA9IG5leHRWc3luY1RpbWU7Ci0gICAgfQotCi0gICAgLy8gYWxpZ24gcmVuZGVydGltZSB0byB0aGUgY2VudGVyIGJldHdlZW4gVlNZTkMgZWRnZXMKLSAgICByZW5kZXJUaW1lIC09IChyZW5kZXJUaW1lIC0gbVZzeW5jVGltZSkgJSBtVnN5bmNQZXJpb2Q7Ci0gICAgcmVuZGVyVGltZSArPSBtVnN5bmNQZXJpb2QgLyAyOwotICAgIEFMT0dWKCJhZGp1c3RpbmcgcmVuZGVyOiAlbGxkID0+ICVsbGQiLCAobG9uZyBsb25nKW9yaWdSZW5kZXJUaW1lLCAobG9uZyBsb25nKXJlbmRlclRpbWUpOwotICAgIEFUUkFDRV9JTlQoIkZSQU1FX0ZMSVBfSU4obXMpIiwgKHJlbmRlclRpbWUgLSBub3cpIC8gMTAwMDAwMCk7Ci0gICAgcmV0dXJuIHJlbmRlclRpbWU7Ci19Ci0KIHZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6cmVsZWFzZSgpIHsKICAgICBtQ29tcG9zZXIuY2xlYXIoKTsKIH0KQEAgLTUwNyw0ICs2OSwzIEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlcjIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlcjIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNjcxZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5jcHAKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlZpZGVvRnJhbWVTY2hlZHVsZXIyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfVklERU8KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9jaG9yZW9ncmFwaGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9sb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgdm9pZCBnZXRWc3luY09mZnNldChuc2Vjc190KiBhcHBWc3luY09mZnNldFB0ciwgbnNlY3NfdCogc2ZWc3luY09mZnNldFB0cik7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWc3luY1RyYWNrZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworY2xhc3MgVnN5bmNUcmFja2VyIDogcHVibGljIFJlZkJhc2V7CitwdWJsaWM6CisgICAgVnN5bmNUcmFja2VyKCk7CisgICAgflZzeW5jVHJhY2tlcigpIHt9CisgICAgbnNlY3NfdCBnZXRWc3luY1BlcmlvZCgpOworICAgIG5zZWNzX3QgZ2V0VnN5bmNUaW1lKG5zZWNzX3QgcGVyaW9kT2Zmc2V0KTsKKyAgICB2b2lkIGFkZFNhbXBsZShuc2Vjc190IHRpbWVzdGFtcCk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0IGludCBrTWF4U2FtcGxlcyA9IDMyOworICAgIHN0YXRpYyBjb25zdCBpbnQga01pblNhbXBsZXNGb3JVcGRhdGUgPSA2OworICAgIGludCBtTnVtU2FtcGxlczsKKyAgICBpbnQgbUZpcnN0U2FtcGxlOworICAgIG5zZWNzX3QgbVJlZmVyZW5jZVRpbWU7CisgICAgbnNlY3NfdCBtUGhhc2U7CisgICAgbnNlY3NfdCBtUGVyaW9kOworICAgIG5zZWNzX3QgbVRpbWVzdGFtcFNhbXBsZXNba01heFNhbXBsZXNdOworICAgIE11dGV4IG1Mb2NrOworCisgICAgdm9pZCB1cGRhdGVNb2RlbExvY2tlZCgpOworfTsKKworVnN5bmNUcmFja2VyOjpWc3luY1RyYWNrZXIoKQorICAgIDogbU51bVNhbXBsZXMoMCksCisgICAgICBtRmlyc3RTYW1wbGUoMCksCisgICAgICBtUmVmZXJlbmNlVGltZSgwKSwKKyAgICAgIG1QaGFzZSgwKSwKKyAgICAgIG1QZXJpb2QoMCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga01heFNhbXBsZXM7IGkrKykgeworICAgICAgICBtVGltZXN0YW1wU2FtcGxlc1tpXSA9IDA7CisgICAgfQorfQorCituc2Vjc190IFZzeW5jVHJhY2tlcjo6Z2V0VnN5bmNQZXJpb2QoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGRhdGFMb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbVBlcmlvZDsKK30KKworbnNlY3NfdCBWc3luY1RyYWNrZXI6OmdldFZzeW5jVGltZShuc2Vjc190IHBlcmlvZE9mZnNldCkgeworICAgIE11dGV4OjpBdXRvbG9jayBkYXRhTG9jayhtTG9jayk7CisgICAgY29uc3QgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgbnNlY3NfdCBwaGFzZSA9IG1SZWZlcmVuY2VUaW1lICsgbVBoYXNlOworCisgICAgLy8gcmVzdWx0ID0gKCgobm93IC0gcGhhc2UpIC8gbVBlcmlvZCkgKyBwZXJpb2RPZmZzZXQgKyAxKSAqIG1QZXJpb2QgKyBwaGFzZQorICAgIC8vIHByZXZlbnQgb3ZlcmZsb3cKKyAgICBuc2Vjc190IHJlc3VsdCA9IChub3cgLSBwaGFzZSkgLyBtUGVyaW9kOworICAgIGlmIChyZXN1bHQgPiBMT05HX0xPTkdfTUFYIC0gcGVyaW9kT2Zmc2V0IC0gMSkgeworICAgICAgICByZXR1cm4gTE9OR19MT05HX01BWDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgKz0gcGVyaW9kT2Zmc2V0ICsgMTsKKyAgICB9CisgICAgaWYgKHJlc3VsdCA+IExPTkdfTE9OR19NQVggLyBtUGVyaW9kKSB7CisgICAgICAgIHJldHVybiBMT05HX0xPTkdfTUFYOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCAqPSBtUGVyaW9kOworICAgIH0KKyAgICBpZiAocmVzdWx0ID4gTE9OR19MT05HX01BWCAtIHBoYXNlKSB7CisgICAgICAgIHJldHVybiBMT05HX0xPTkdfTUFYOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSBwaGFzZTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFZzeW5jVHJhY2tlcjo6YWRkU2FtcGxlKG5zZWNzX3QgdGltZXN0YW1wKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGRhdGFMb2NrKG1Mb2NrKTsKKyAgICBpZiAobU51bVNhbXBsZXMgPT0gMCkgeworICAgICAgICBtUGhhc2UgPSAwOworICAgICAgICBtUmVmZXJlbmNlVGltZSA9IHRpbWVzdGFtcDsKKyAgICB9CisgICAgaW50IGlkeCA9IChtRmlyc3RTYW1wbGUgKyBtTnVtU2FtcGxlcykgJSBrTWF4U2FtcGxlczsKKyAgICBtVGltZXN0YW1wU2FtcGxlc1tpZHhdID0gdGltZXN0YW1wOworICAgIGlmIChtTnVtU2FtcGxlcyA8IGtNYXhTYW1wbGVzKSB7CisgICAgICAgIG1OdW1TYW1wbGVzKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUZpcnN0U2FtcGxlID0gKG1GaXJzdFNhbXBsZSArIDEpICUga01heFNhbXBsZXM7CisgICAgfQorICAgIHVwZGF0ZU1vZGVsTG9ja2VkKCk7Cit9CisKK3ZvaWQgVnN5bmNUcmFja2VyOjp1cGRhdGVNb2RlbExvY2tlZCgpIHsKKyAgICBpZiAobU51bVNhbXBsZXMgPCBrTWluU2FtcGxlc0ZvclVwZGF0ZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG5zZWNzX3QgZHVyYXRpb25TdW0gPSAwOworICAgIG5zZWNzX3QgbWluRHVyYXRpb24gPSBMT05HX01BWDsKKyAgICBuc2Vjc190IG1heER1cmF0aW9uID0gMDsKKworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbU51bVNhbXBsZXM7IGkrKykgeworICAgICAgICBpbnQgaWR4ID0gKG1GaXJzdFNhbXBsZSArIGkpICUga01heFNhbXBsZXM7CisgICAgICAgIGludCBwcmV2ID0gKGlkeCArIGtNYXhTYW1wbGVzIC0gMSkgJSBrTWF4U2FtcGxlczsKKyAgICAgICAgbG9uZyBkdXJhdGlvbiA9IG1UaW1lc3RhbXBTYW1wbGVzW2lkeF0gLSBtVGltZXN0YW1wU2FtcGxlc1twcmV2XTsKKyAgICAgICAgZHVyYXRpb25TdW0gKz0gZHVyYXRpb247CisgICAgICAgIGlmIChtaW5EdXJhdGlvbiA+IGR1cmF0aW9uKSB7IG1pbkR1cmF0aW9uID0gZHVyYXRpb247IH0KKyAgICAgICAgaWYgKG1heER1cmF0aW9uIDwgZHVyYXRpb24pIHsgbWF4RHVyYXRpb24gPSBkdXJhdGlvbjsgfQorICAgIH0KKworICAgIGR1cmF0aW9uU3VtIC09IChtaW5EdXJhdGlvbiArIG1heER1cmF0aW9uKTsKKyAgICBtUGVyaW9kID0gZHVyYXRpb25TdW0gLyAobU51bVNhbXBsZXMgLSAzKTsKKworICAgIGRvdWJsZSBzYW1wbGVBdmdYID0gMC4wOworICAgIGRvdWJsZSBzYW1wbGVBdmdZID0gMC4wOworICAgIGRvdWJsZSBzY2FsZSA9IDIuMCAqIE1fUEkgLyAoZG91YmxlKSBtUGVyaW9kOworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtTnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgIGludCBpZHggPSAobUZpcnN0U2FtcGxlICsgaSkgJSBrTWF4U2FtcGxlczsKKyAgICAgICAgbG9uZyBzYW1wbGUgPSBtVGltZXN0YW1wU2FtcGxlc1tpZHhdIC0gbVJlZmVyZW5jZVRpbWU7CisgICAgICAgIGRvdWJsZSBzYW1wbGVQaGFzZSA9IChkb3VibGUpIChzYW1wbGUgJSBtUGVyaW9kKSAqIHNjYWxlOworICAgICAgICBzYW1wbGVBdmdYICs9IGNvcyhzYW1wbGVQaGFzZSk7CisgICAgICAgIHNhbXBsZUF2Z1kgKz0gc2luKHNhbXBsZVBoYXNlKTsKKyAgICB9CisKKyAgICBzYW1wbGVBdmdYIC89IChkb3VibGUpIG1OdW1TYW1wbGVzIC0gMS4wOworICAgIHNhbXBsZUF2Z1kgLz0gKGRvdWJsZSkgbU51bVNhbXBsZXMgLSAxLjA7CisgICAgbVBoYXNlID0gKGxvbmcpIChhdGFuMihzYW1wbGVBdmdZLCBzYW1wbGVBdmdYKSAvIHNjYWxlKTsKK30KKworc3RhdGljIHZvaWQgZnJhbWVDYWxsYmFjayhpbnQ2NF90IGZyYW1lVGltZU5hbm9zLCB2b2lkKiBkYXRhKSB7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPFZzeW5jVHJhY2tlcj4gdnN5bmNUcmFja2VyKHN0YXRpY19jYXN0PFZzeW5jVHJhY2tlcio+KGRhdGEpKTsKKyAgICB2c3luY1RyYWNrZXItPmFkZFNhbXBsZShmcmFtZVRpbWVOYW5vcyk7CisgICAgQUNob3Jlb2dyYXBoZXJfcG9zdEZyYW1lQ2FsbGJhY2s2NChBQ2hvcmVvZ3JhcGhlcl9nZXRJbnN0YW5jZSgpLAorICAgICAgICAgICAgZnJhbWVDYWxsYmFjaywgc3RhdGljX2Nhc3Q8dm9pZCo+KHZzeW5jVHJhY2tlci5nZXQoKSkpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpOSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyB2b2lkIGdldFZzeW5jT2Zmc2V0KG5zZWNzX3QqIGFwcFZzeW5jT2Zmc2V0UHRyLCBuc2Vjc190KiBzZlZzeW5jT2Zmc2V0UHRyKSB7CisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga09uZU1pbGxpc2VjSW5OYW5vc2VjID0gMTAwMDAwMDsKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrT25lU2VjSW5OYW5vc2VjID0ga09uZU1pbGxpc2VjSW5OYW5vc2VjICogMTAwMDsKKworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqY2xhc3MgakRpc3BsYXlNYW5hZ2VyR2xvYmFsQ2xzID0gZW52LT5GaW5kQ2xhc3MoCisgICAgICAgICAgICAiYW5kcm9pZC9oYXJkd2FyZS9kaXNwbGF5L0Rpc3BsYXlNYW5hZ2VyR2xvYmFsIik7CisgICAgamNsYXNzIGpEaXNwbGF5Q2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvdmlldy9EaXNwbGF5Iik7CisKKyAgICBqbWV0aG9kSUQgakdldEluc3RhbmNlID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChqRGlzcGxheU1hbmFnZXJHbG9iYWxDbHMsCisgICAgICAgICAgICAiZ2V0SW5zdGFuY2UiLCAiKClMYW5kcm9pZC9oYXJkd2FyZS9kaXNwbGF5L0Rpc3BsYXlNYW5hZ2VyR2xvYmFsOyIpOworICAgIGpvYmplY3QgamF2YURpc3BsYXlNYW5hZ2VyR2xvYmFsT2JqID0gZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKAorICAgICAgICAgICAgakRpc3BsYXlNYW5hZ2VyR2xvYmFsQ2xzLCBqR2V0SW5zdGFuY2UpOworCisgICAgamZpZWxkSUQgakRFRkFVTFRfRElTUExBWSA9IGVudi0+R2V0U3RhdGljRmllbGRJRChqRGlzcGxheUNscywgIkRFRkFVTFRfRElTUExBWSIsICJJIik7CisgICAgamludCBERUZBVUxUX0RJU1BMQVkgPSBlbnYtPkdldFN0YXRpY0ludEZpZWxkKGpEaXNwbGF5Q2xzLCBqREVGQVVMVF9ESVNQTEFZKTsKKworICAgIGptZXRob2RJRCBqZ2V0UmVhbERpc3BsYXkgPSBlbnYtPkdldE1ldGhvZElEKGpEaXNwbGF5TWFuYWdlckdsb2JhbENscywKKyAgICAgICAgICAgICJnZXRSZWFsRGlzcGxheSIsICIoSSlMYW5kcm9pZC92aWV3L0Rpc3BsYXk7Iik7CisgICAgam9iamVjdCBqYXZhRGlzcGxheU9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZCgKKyAgICAgICAgICAgIGphdmFEaXNwbGF5TWFuYWdlckdsb2JhbE9iaiwgamdldFJlYWxEaXNwbGF5LCBERUZBVUxUX0RJU1BMQVkpOworCisgICAgam1ldGhvZElEIGpHZXRSZWZyZXNoUmF0ZSA9IGVudi0+R2V0TWV0aG9kSUQoakRpc3BsYXlDbHMsICJnZXRSZWZyZXNoUmF0ZSIsICIoKUYiKTsKKyAgICBqZmxvYXQgamF2YVJlZnJlc2hSYXRlID0gZW52LT5DYWxsRmxvYXRNZXRob2QoamF2YURpc3BsYXlPYmosIGpHZXRSZWZyZXNoUmF0ZSk7CisgICAgbnNlY3NfdCB2c3luY1BlcmlvZCA9IChuc2Vjc190KSAoa09uZVNlY0luTmFub3NlYyAvIChmbG9hdCkgamF2YVJlZnJlc2hSYXRlKTsKKworICAgIGptZXRob2RJRCBqR2V0QXBwVnN5bmNPZmZzZXROYW5vcyA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBqRGlzcGxheUNscywgImdldEFwcFZzeW5jT2Zmc2V0TmFub3MiLCAiKClKIik7CisgICAgamxvbmcgamF2YUFwcFZzeW5jT2Zmc2V0ID0gZW52LT5DYWxsTG9uZ01ldGhvZChqYXZhRGlzcGxheU9iaiwgakdldEFwcFZzeW5jT2Zmc2V0TmFub3MpOworICAgICphcHBWc3luY09mZnNldFB0ciA9IChuc2Vjc190KSBqYXZhQXBwVnN5bmNPZmZzZXQ7CisKKyAgICBqbWV0aG9kSUQgakdldFByZXNlbnRhdGlvbkRlYWRsaW5lTmFub3MgPSBlbnYtPkdldE1ldGhvZElEKAorICAgICAgICAgICAgakRpc3BsYXlDbHMsICJnZXRQcmVzZW50YXRpb25EZWFkbGluZU5hbm9zIiwgIigpSiIpOworICAgIGpsb25nIGphdmFQcmVzZW50YXRpb25EZWFkbGluZSA9IGVudi0+Q2FsbExvbmdNZXRob2QoCisgICAgICAgICAgICBqYXZhRGlzcGxheU9iaiwgakdldFByZXNlbnRhdGlvbkRlYWRsaW5lTmFub3MpOworCisgICAgKnNmVnN5bmNPZmZzZXRQdHIgPSB2c3luY1BlcmlvZCAtICgobnNlY3NfdCkgamF2YVByZXNlbnRhdGlvbkRlYWRsaW5lIC0ga09uZU1pbGxpc2VjSW5OYW5vc2VjKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICBDaG9yZW9ncmFwaGVyIFRocmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdHJ1Y3QgQ2hvcmVvZ3JhcGhlclRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworICAgIENob3Jlb2dyYXBoZXJUaHJlYWQoYm9vbCBjYW5DYWxsSmF2YSk7CisgICAgc3RhdHVzX3QgaW5pdCh2b2lkKiBkYXRhKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWR5VG9SdW4oKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Q2hvcmVvZ3JhcGhlclRocmVhZCgpIHt9CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2hvcmVvZ3JhcGhlclRocmVhZCk7CisgICAgdm9pZCogbURhdGE7Cit9OworCitDaG9yZW9ncmFwaGVyVGhyZWFkOjpDaG9yZW9ncmFwaGVyVGhyZWFkKGJvb2wgY2FuQ2FsbEphdmEpIDogVGhyZWFkKGNhbkNhbGxKYXZhKSB7Cit9CisKK3N0YXR1c190IENob3Jlb2dyYXBoZXJUaHJlYWQ6OmluaXQodm9pZCogZGF0YSkgeworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIG1EYXRhID0gZGF0YTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENob3Jlb2dyYXBoZXJUaHJlYWQ6OnJlYWR5VG9SdW4oKSB7CisgICAgQUxvb3Blcl9wcmVwYXJlKEFMT09QRVJfUFJFUEFSRV9BTExPV19OT05fQ0FMTEJBQ0tTKTsKKyAgICBpZiAoQUNob3Jlb2dyYXBoZXJfZ2V0SW5zdGFuY2UoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBQ2hvcmVvZ3JhcGhlcl9wb3N0RnJhbWVDYWxsYmFjazY0KEFDaG9yZW9ncmFwaGVyX2dldEluc3RhbmNlKCksIGZyYW1lQ2FsbGJhY2ssIG1EYXRhKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQ2hvcmVvZ3JhcGhlclRocmVhZDo6dGhyZWFkTG9vcCgpIHsKKyAgICBBTG9vcGVyX3BvbGxPbmNlKC0xLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZSBTY2hlZHVsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitWaWRlb0ZyYW1lU2NoZWR1bGVyMjo6VmlkZW9GcmFtZVNjaGVkdWxlcjIoKSA6IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlKCkgeworCisgICAgZ2V0VnN5bmNPZmZzZXQoJm1BcHBWc3luY09mZnNldCwgJm1TZlZzeW5jT2Zmc2V0KTsKKworICAgIE11dGV4OjpBdXRvbG9jayB0aHJlYWRMb2NrKG1Mb2NrKTsKKyAgICBtQ2hvcmVvZ3JhcGhlclRocmVhZCA9IG5ldyBDaG9yZW9ncmFwaGVyVGhyZWFkKHRydWUpOworCisgICAgbVZzeW5jVHJhY2tlciA9IG5ldyBWc3luY1RyYWNrZXIoKTsKKyAgICBpZiAobUNob3Jlb2dyYXBoZXJUaHJlYWQtPmluaXQoc3RhdGljX2Nhc3Q8dm9pZCo+KG1Wc3luY1RyYWNrZXIuZ2V0KCkpKSAhPSBPSykgeworICAgICAgICBtQ2hvcmVvZ3JhcGhlclRocmVhZC5jbGVhcigpOworICAgIH0KKyAgICBpZiAobUNob3Jlb2dyYXBoZXJUaHJlYWQgIT0gTlVMTCAmJiBtQ2hvcmVvZ3JhcGhlclRocmVhZC0+cnVuKCJDaG9yZW9ncmFwaGVyIikgIT0gT0spIHsKKyAgICAgICAgbUNob3Jlb2dyYXBoZXJUaHJlYWQuY2xlYXIoKTsKKyAgICB9Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjI6OnVwZGF0ZVZzeW5jKCkgeworICAgIG1Wc3luY1RpbWUgPSAwOworICAgIG1Wc3luY1BlcmlvZCA9IDA7CisKKyAgICBpZiAobVZzeW5jVHJhY2tlciAhPSBOVUxMKSB7CisgICAgICAgIG1Wc3luY1BlcmlvZCA9IG1Wc3luY1RyYWNrZXItPmdldFZzeW5jUGVyaW9kKCk7CisgICAgICAgIG1Wc3luY1RpbWUgPSBtVnN5bmNUcmFja2VyLT5nZXRWc3luY1RpbWUobVNmVnN5bmNPZmZzZXQgLSBtQXBwVnN5bmNPZmZzZXQpOworICAgIH0KKyAgICBtVnN5bmNSZWZyZXNoQXQgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykgKyBrVnN5bmNSZWZyZXNoUGVyaW9kOworfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXIyOjpyZWxlYXNlKCkgeworICAgIC8vIERvIG5vdCBjaGFuZ2Ugb3JkZXIKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayB0aHJlYWRMb2NrKG1Mb2NrKTsKKyAgICAgICAgbUNob3Jlb2dyYXBoZXJUaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOworICAgICAgICBtQ2hvcmVvZ3JhcGhlclRocmVhZC5jbGVhcigpOworICAgIH0KKworICAgIG1Wc3luY1RyYWNrZXIuY2xlYXIoKTsKK30KKworVmlkZW9GcmFtZVNjaGVkdWxlcjI6On5WaWRlb0ZyYW1lU2NoZWR1bGVyMigpIHsKKyAgICByZWxlYXNlKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzEwN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuY3BwCkBAIC0wLDAgKzEsNDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX1ZJREVPCisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdGF0aWMgaW50IGNvbXBhcmUoY29uc3QgVCAqbGhzLCBjb25zdCBUICpyaHMpIHsKKyAgICBpZiAoKmxocyA8ICpyaHMpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSBpZiAoKmxocyA+ICpyaHMpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb1N0YXJ0UHJpbWUgPSAzOworc3RhdGljIGNvbnN0IHNpemVfdCBrTWluU2FtcGxlc1RvU3RvcFByaW1lID0gVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmtIaXN0b3J5U2l6ZTsKK3N0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kID0gMzsKK3N0YXRpYyBjb25zdCBzaXplX3Qga01heFNhbXBsZXNUb0VzdGltYXRlUGVyaW9kID0gVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmtIaXN0b3J5U2l6ZTsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrUHJlY2lzaW9uID0gMTI7CitzdGF0aWMgY29uc3QgaW50NjRfdCBrRXJyb3JUaHJlc2hvbGQgPSAoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSAvIDEwOworc3RhdGljIGNvbnN0IGludDY0X3Qga011bHRpcGxlc1RocmVzaG9sZERpdiA9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI1JQorc3RhdGljIGNvbnN0IGludDY0X3Qga1JlRml0VGhyZXNob2xkRGl2ID0gMTAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDElCitzdGF0aWMgY29uc3QgbnNlY3NfdCBrTWF4QWxsb3dlZEZyYW1lU2tpcCA9IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjprTmFub3NJbjFzOyAgICAgLy8gMSBzZWMKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtNaW5QZXJpb2QgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6a05hbm9zSW4xcyAvIDEyMDsgICAgICAgICAvLyAxMjBIegorc3RhdGljIGNvbnN0IG5zZWNzX3Qga1JlZml0UmVmcmVzaFBlcmlvZCA9IDEwICogVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmtOYW5vc0luMXM7IC8vIDEwIHNlYworCitWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjpQTEwoKQorICAgIDogbVBlcmlvZCgtMSksCisgICAgICBtUGhhc2UoMCksCisgICAgICBtUHJpbWVkKGZhbHNlKSwKKyAgICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcoMCksCisgICAgICBtTGFzdFRpbWUoLTEpLAorICAgICAgbU51bVNhbXBsZXMoMCkgeworfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpQTEw6OnJlc2V0KGZsb2F0IGZwcykgeworICAgIC8vdGVzdCgpOworCisgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA9IDA7CisgICAgbUxhc3RUaW1lID0gLTE7CisKKyAgICAvLyBzZXQgdXAgb3IgcmVzZXQgdmlkZW8gUExMCisgICAgaWYgKGZwcyA8PSAwLmYpIHsKKyAgICAgICAgbVBlcmlvZCA9IC0xOworICAgICAgICBtUHJpbWVkID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoInJlc2V0IGF0ICUuMWYgZnBzIiwgZnBzKTsKKyAgICAgICAgbVBlcmlvZCA9IChuc2Vjc190KSgxZTkgLyBmcHMgKyAwLjUpOworICAgICAgICBtUHJpbWVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXN0YXJ0KCk7Cit9CisKKy8vIHJlc2V0IFBMTCBidXQga2VlcCBwcmV2aW91cyBwZXJpb2QgZXN0aW1hdGUKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6cmVzdGFydCgpIHsKKyAgICBtTnVtU2FtcGxlcyA9IDA7CisgICAgbVBoYXNlID0gLTE7Cit9CisKKyNpZiAwCisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6dGVzdCgpIHsKKyAgICBuc2Vjc190IHBlcmlvZCA9IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjprTmFub3NJbjFzIC8gNjA7CisgICAgbVRpbWVzWzBdID0gMDsKKyAgICBtVGltZXNbMV0gPSBwZXJpb2Q7CisgICAgbVRpbWVzWzJdID0gcGVyaW9kICogMzsKKyAgICBtVGltZXNbM10gPSBwZXJpb2QgKiA0OworICAgIG1UaW1lc1s0XSA9IHBlcmlvZCAqIDc7CisgICAgbVRpbWVzWzVdID0gcGVyaW9kICogODsKKyAgICBtVGltZXNbNl0gPSBwZXJpb2QgKiAxMDsKKyAgICBtVGltZXNbN10gPSBwZXJpb2QgKiAxMjsKKyAgICBtTnVtU2FtcGxlcyA9IDg7CisgICAgaW50NjRfdCBhLCBiLCBlcnI7CisgICAgZml0KDAsIHBlcmlvZCAqIDEyIC8gNywgOCwgJmEsICZiLCAmZXJyKTsKKyAgICAvLyBhID0gMC44KDUpKworICAgIC8vIGIgPSAtMC4xNDA5NygyKSsKKyAgICAvLyBlcnIgPSAwLjI3NTA1NzgoNzAzKSsKKyAgICBBTE9HRCgiYT0lbGxkICglLjZmKSwgYj0lbGxkICglLjZmKSwgZXJyPSVsbGQgKCUuNmYpIiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpYSwgKGEgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAorICAgICAgICAgICAgKGxvbmcgbG9uZyliLCAoYiAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCisgICAgICAgICAgICAobG9uZyBsb25nKWVyciwgKGVyciAvIChmbG9hdCkoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSkpOworfQorCisjZW5kaWYKKworYm9vbCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjpmaXQoCisgICAgICAgIG5zZWNzX3QgcGhhc2UsIG5zZWNzX3QgcGVyaW9kLCBzaXplX3QgbnVtU2FtcGxlc1RvVXNlLAorICAgICAgICBpbnQ2NF90ICphLCBpbnQ2NF90ICpiLCBpbnQ2NF90ICplcnIpIHsKKyAgICBpZiAobnVtU2FtcGxlc1RvVXNlID4gbU51bVNhbXBsZXMpIHsKKyAgICAgICAgbnVtU2FtcGxlc1RvVXNlID0gbU51bVNhbXBsZXM7CisgICAgfQorCisgICAgaWYgKChwZXJpb2QgPj4ga1ByZWNpc2lvbikgPT0gMCApIHsKKyAgICAgICAgQUxPR1coIlBlcmlvZCBpcyAwLCBvciBhZnRlciBpbmNsdWRpbmcgcHJlY2lzaW9uIGlzIDAgLSB3b3VsZCBjYXVzZSBkaXYwLCByZXR1cm5pbmciKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDY0X3Qgc3VtWCA9IDA7CisgICAgaW50NjRfdCBzdW1YWCA9IDA7CisgICAgaW50NjRfdCBzdW1YWSA9IDA7CisgICAgaW50NjRfdCBzdW1ZWSA9IDA7CisgICAgaW50NjRfdCBzdW1ZID0gMDsKKworICAgIGludDY0X3QgeCA9IDA7IC8vIHggdXN1YWxseSBpcyBpbiBbMC4ubnVtU2FtcGxlc1RvVXNlKQorICAgIG5zZWNzX3QgbGFzdFRpbWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzVG9Vc2U7IGkrKykgeworICAgICAgICBzaXplX3QgaXggPSAobU51bVNhbXBsZXMgLSBudW1TYW1wbGVzVG9Vc2UgKyBpKSAlIGtIaXN0b3J5U2l6ZTsKKyAgICAgICAgbnNlY3NfdCB0aW1lID0gbVRpbWVzW2l4XTsKKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICB4ICs9IGRpdlJvdW5kKHRpbWUgLSBsYXN0VGltZSwgcGVyaW9kKTsKKyAgICAgICAgfQorICAgICAgICAvLyB5IGlzIHVzdWFsbHkgaW4gWy1udW1TYW1wbGVzVG9Vc2UuLm51bVNhbXBsZXNUb1VzZStrUmVmaXRSZWZyZXNoUGVyaW9kL2tNaW5QZXJpb2QpIDw8IGtQcmVjaXNpb24KKyAgICAgICAgLy8gICBpZGVhbGx5IGluIFswLi5udW1TYW1wbGVzVG9Vc2UpLCBidXQgc2hpZnRlZCBieSAtbnVtU2FtcGxlc1RvVXNlIGR1cmluZworICAgICAgICAvLyAgIHByaW1pbmcsIGFuZCBwb3NzaWJseSBzaGlmdGVkIGJ5IHVwIHRvIGtSZWZpdFJlZnJlc2hQZXJpb2Qva01pblBlcmlvZAorICAgICAgICAvLyAgIHdoaWxlIHdlIGFyZSBub3QgcmVmaXR0aW5nLgorICAgICAgICBpbnQ2NF90IHkgPSBkaXZSb3VuZCh0aW1lIC0gcGhhc2UsIHBlcmlvZCA+PiBrUHJlY2lzaW9uKTsKKyAgICAgICAgc3VtWCArPSB4OworICAgICAgICBzdW1ZICs9IHk7CisgICAgICAgIHN1bVhYICs9IHggKiB4OworICAgICAgICBzdW1YWSArPSB4ICogeTsKKyAgICAgICAgc3VtWVkgKz0geSAqIHk7CisgICAgICAgIGxhc3RUaW1lID0gdGltZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IGRpdiAgID0gKGludDY0X3QpbnVtU2FtcGxlc1RvVXNlICogc3VtWFggLSBzdW1YICogc3VtWDsKKyAgICBpZiAoZGl2ID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDY0X3QgYV9ub20gPSAoaW50NjRfdCludW1TYW1wbGVzVG9Vc2UgKiBzdW1YWSAtIHN1bVggKiBzdW1ZOworICAgIGludDY0X3QgYl9ub20gPSBzdW1YWCAqIHN1bVkgICAgICAgICAgICAtIHN1bVggKiBzdW1YWTsKKyAgICAqYSA9IGRpdlJvdW5kKGFfbm9tLCBkaXYpOworICAgICpiID0gZGl2Um91bmQoYl9ub20sIGRpdik7CisgICAgLy8gZG9uJ3QgdXNlIGEgYW5kIGIgZGlyZWN0bHkgYXMgdGhlIHJvdW5kaW5nIGVycm9yIGlzIHNpZ25pZmljYW50CisgICAgKmVyciA9IHN1bVlZIC0gZGl2Um91bmQoYV9ub20gKiBzdW1YWSArIGJfbm9tICogc3VtWSwgZGl2KTsKKyAgICBBTE9HVigiZml0dGluZ1slenVdIGE9JWxsZCAoJS42ZiksIGI9JWxsZCAoJS42ZiksIGVycj0lbGxkICglLjZmKSIsCisgICAgICAgICAgICBudW1TYW1wbGVzVG9Vc2UsCisgICAgICAgICAgICAobG9uZyBsb25nKSphLCAgICgqYSAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCisgICAgICAgICAgICAobG9uZyBsb25nKSpiLCAgICgqYiAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCisgICAgICAgICAgICAobG9uZyBsb25nKSplcnIsICgqZXJyIC8gKGZsb2F0KSgxIDw8IChrUHJlY2lzaW9uICogMikpKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6cHJpbWUoc2l6ZV90IG51bVNhbXBsZXNUb1VzZSkgeworICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPiBtTnVtU2FtcGxlcykgeworICAgICAgICBudW1TYW1wbGVzVG9Vc2UgPSBtTnVtU2FtcGxlczsKKyAgICB9CisgICAgQ0hFQ0sobnVtU2FtcGxlc1RvVXNlID49IDMpOyAgLy8gbXVzdCBoYXZlIGF0IGxlYXN0IDMgc2FtcGxlcworCisgICAgLy8gZXN0aW1hdGUgdmlkZW8gZnJhbWVyYXRlIGZyb20gZGVsdGFzIGJldHdlZW4gdGltZXN0YW1wcywgYW5kCisgICAgLy8gMm5kIG9yZGVyIGRlbHRhcworICAgIFZlY3Rvcjxuc2Vjc190PiBkZWx0YXM7CisgICAgbnNlY3NfdCBsYXN0VGltZSwgZmlyc3RUaW1lOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2FtcGxlc1RvVXNlOyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gKG1OdW1TYW1wbGVzIC0gbnVtU2FtcGxlc1RvVXNlICsgaSkgJSBrSGlzdG9yeVNpemU7CisgICAgICAgIG5zZWNzX3QgdGltZSA9IG1UaW1lc1tpbmRleF07CisgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgaWYgKHRpbWUgLSBsYXN0VGltZSA+IGtNaW5QZXJpb2QpIHsKKyAgICAgICAgICAgICAgICAvL0FMT0dWKCJkZWx0YTogJWxsZCIsIChsb25nIGxvbmcpKHRpbWUgLSBsYXN0VGltZSkpOworICAgICAgICAgICAgICAgIGRlbHRhcy5wdXNoKHRpbWUgLSBsYXN0VGltZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaXJzdFRpbWUgPSB0aW1lOworICAgICAgICB9CisgICAgICAgIGxhc3RUaW1lID0gdGltZTsKKyAgICB9CisgICAgZGVsdGFzLnNvcnQoY29tcGFyZTxuc2Vjc190Pik7CisgICAgc2l6ZV90IG51bURlbHRhcyA9IGRlbHRhcy5zaXplKCk7CisgICAgaWYgKG51bURlbHRhcyA+IDEpIHsKKyAgICAgICAgbnNlY3NfdCBkZWx0YU1pbkxpbWl0ID0gbWF4KGRlbHRhc1swXSAvIGtNdWx0aXBsZXNUaHJlc2hvbGREaXYsIGtNaW5QZXJpb2QpOworICAgICAgICBuc2Vjc190IGRlbHRhTWF4TGltaXQgPSBkZWx0YXNbbnVtRGVsdGFzIC8gMl0gKiBrTXVsdGlwbGVzVGhyZXNob2xkRGl2OworICAgICAgICBmb3IgKHNpemVfdCBpID0gbnVtRGVsdGFzIC8gMiArIDE7IGkgPCBudW1EZWx0YXM7ICsraSkgeworICAgICAgICAgICAgaWYgKGRlbHRhc1tpXSA+IGRlbHRhTWF4TGltaXQpIHsKKyAgICAgICAgICAgICAgICBkZWx0YXMucmVzaXplKGkpOworICAgICAgICAgICAgICAgIG51bURlbHRhcyA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBudW1EZWx0YXM7ICsraSkgeworICAgICAgICAgICAgbnNlY3NfdCBkZWx0YTJuZCA9IGRlbHRhc1tpXSAtIGRlbHRhc1tpIC0gMV07CisgICAgICAgICAgICBpZiAoZGVsdGEybmQgPj0gZGVsdGFNaW5MaW1pdCkgeworICAgICAgICAgICAgICAgIC8vQUxPR1YoImRlbHRhMjogJWxsZCIsIChsb25nIGxvbmcpKGRlbHRhMm5kKSk7CisgICAgICAgICAgICAgICAgZGVsdGFzLnB1c2goZGVsdGEybmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gdXNlIHRoZSBvbmUgdGhhdCB5aWVsZHMgdGhlIGJlc3QgbWF0Y2gKKyAgICBpbnQ2NF90IGJlc3RTY29yZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRlbHRhcy5zaXplKCk7ICsraSkgeworICAgICAgICBuc2Vjc190IGRlbHRhID0gZGVsdGFzW2ldOworICAgICAgICBpbnQ2NF90IHNjb3JlID0gMDsKKyNpZiAxCisgICAgICAgIC8vIHNpbXBsZXN0IHNjb3JlOiBudW1iZXIgb2YgZGVsdGFzIHRoYXQgYXJlIG5lYXIgbXVsdGlwbGVzCisgICAgICAgIHNpemVfdCBtYXRjaGVzID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBkZWx0YXMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIG5zZWNzX3QgZXJyID0gcGVyaW9kaWNFcnJvcihkZWx0YXNbal0sIGRlbHRhKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCBkZWx0YSAvIGtNdWx0aXBsZXNUaHJlc2hvbGREaXYpIHsKKyAgICAgICAgICAgICAgICArK21hdGNoZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2NvcmUgPSBtYXRjaGVzOworI2lmIDAKKyAgICAgICAgLy8gY291bGQgYmUgd2VpZ2hlZCBieSB0aGUgKDEgLSBub3JtYWxpemVkIGVycm9yKQorICAgICAgICBpZiAobnVtU2FtcGxlc1RvVXNlID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgeworICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7CisgICAgICAgICAgICBmaXQoZmlyc3RUaW1lLCBkZWx0YSwgbnVtU2FtcGxlc1RvVXNlLCAmYSwgJmIsICZlcnIpOworICAgICAgICAgICAgZXJyID0gKDEgPDwgKDIgKiBrUHJlY2lzaW9uKSkgLSBlcnI7CisgICAgICAgICAgICBzY29yZSAqPSBtYXgoMCwgZXJyKTsKKyAgICAgICAgfQorI2VuZGlmCisjZWxzZQorICAgICAgICAvLyBvciB1c2UgdGhlIGVycm9yIGFzIGEgbmVnYXRpdmUgc2NvcmUKKyAgICAgICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+PSBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QpIHsKKyAgICAgICAgICAgIGludDY0X3QgYSwgYiwgZXJyOworICAgICAgICAgICAgZml0KGZpcnN0VGltZSwgZGVsdGEsIG51bVNhbXBsZXNUb1VzZSwgJmEsICZiLCAmZXJyKTsKKyAgICAgICAgICAgIHNjb3JlID0gLWRlbHRhICogZXJyOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKGkgPT0gMCB8fCBzY29yZSA+IGJlc3RTY29yZSkgeworICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7CisgICAgICAgICAgICBtUGVyaW9kID0gZGVsdGE7CisgICAgICAgICAgICBtUGhhc2UgPSBmaXJzdFRpbWU7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoInByaW1pbmdbJXp1XSBwaGFzZTolbGxkIHBlcmlvZDolbGxkIiwKKyAgICAgICAgICAgIG51bVNhbXBsZXNUb1VzZSwgKGxvbmcgbG9uZyltUGhhc2UsIChsb25nIGxvbmcpbVBlcmlvZCk7Cit9CisKK25zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6YWRkU2FtcGxlKG5zZWNzX3QgdGltZSkgeworICAgIGlmIChtTGFzdFRpbWUgPj0gMAorICAgICAgICAgICAgLy8gaWYgdGltZSBnb2VzIGJhY2t3YXJkLCBvciB3ZSBza2lwcGVkIHJlbmRlcmluZworICAgICAgICAgICAgJiYgKHRpbWUgPiBtTGFzdFRpbWUgKyBrTWF4QWxsb3dlZEZyYW1lU2tpcCB8fCB0aW1lIDwgbUxhc3RUaW1lKSkgeworICAgICAgICByZXN0YXJ0KCk7CisgICAgfQorCisgICAgbUxhc3RUaW1lID0gdGltZTsKKyAgICBtVGltZXNbbU51bVNhbXBsZXMgJSBrSGlzdG9yeVNpemVdID0gdGltZTsKKyAgICArK21OdW1TYW1wbGVzOworCisgICAgYm9vbCBkb0ZpdCA9IHRpbWUgPiBtUmVmaXRBdDsKKyAgICBpZiAoKG1QZXJpb2QgPD0gMCB8fCAhbVByaW1lZCkgJiYgbU51bVNhbXBsZXMgPj0ga01pblNhbXBsZXNUb1N0YXJ0UHJpbWUpIHsKKyAgICAgICAgcHJpbWUoa01pblNhbXBsZXNUb1N0b3BQcmltZSk7CisgICAgICAgICsrbVNhbXBsZXNVc2VkRm9yUHJpbWluZzsKKyAgICAgICAgZG9GaXQgPSB0cnVlOworICAgIH0KKyAgICBpZiAobVBlcmlvZCA+IDAgJiYgbU51bVNhbXBsZXMgPj0ga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kKSB7CisgICAgICAgIGlmIChtUGhhc2UgPCAwKSB7CisgICAgICAgICAgICAvLyBpbml0aWFsaXplIHBoYXNlIHRvIHRoZSBjdXJyZW50IHJlbmRlciB0aW1lCisgICAgICAgICAgICBtUGhhc2UgPSB0aW1lOworICAgICAgICAgICAgZG9GaXQgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKCFkb0ZpdCkgeworICAgICAgICAgICAgaW50NjRfdCBlcnIgPSBwZXJpb2RpY0Vycm9yKHRpbWUgLSBtUGhhc2UsIG1QZXJpb2QpOworICAgICAgICAgICAgZG9GaXQgPSBlcnIgPiBtUGVyaW9kIC8ga1JlRml0VGhyZXNob2xkRGl2OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRvRml0KSB7CisgICAgICAgICAgICBpbnQ2NF90IGEsIGIsIGVycjsKKyAgICAgICAgICAgIGlmICghZml0KG1QaGFzZSwgbVBlcmlvZCwga01heFNhbXBsZXNUb0VzdGltYXRlUGVyaW9kLCAmYSwgJmIsICZlcnIpKSB7CisgICAgICAgICAgICAgICAgLy8gc2FtcGxlcyBhcmUgbm90IHN1aXRhYmxlIGZvciBmaXR0aW5nLiAgdGhpcyBtZWFucyB0aGV5IGFyZQorICAgICAgICAgICAgICAgIC8vIGFsc28gbm90IHN1aXRhYmxlIGZvciBwcmltaW5nLgorICAgICAgICAgICAgICAgIEFMT0dWKCJjb3VsZCBub3QgZml0IC0ga2VlcGluZyBvbGQgcGVyaW9kOiVsbGQiLCAobG9uZyBsb25nKW1QZXJpb2QpOworICAgICAgICAgICAgICAgIHJldHVybiBtUGVyaW9kOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUmVmaXRBdCA9IHRpbWUgKyBrUmVmaXRSZWZyZXNoUGVyaW9kOworCisgICAgICAgICAgICBtUGhhc2UgKz0gKG1QZXJpb2QgKiBiKSA+PiBrUHJlY2lzaW9uOworICAgICAgICAgICAgbVBlcmlvZCA9IChtUGVyaW9kICogYSkgPj4ga1ByZWNpc2lvbjsKKyAgICAgICAgICAgIEFMT0dWKCJuZXcgcGhhc2U6JWxsZCBwZXJpb2Q6JWxsZCIsIChsb25nIGxvbmcpbVBoYXNlLCAobG9uZyBsb25nKW1QZXJpb2QpOworCisgICAgICAgICAgICBpZiAoZXJyIDwga0Vycm9yVGhyZXNob2xkKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtUHJpbWVkICYmIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPj0ga01pblNhbXBsZXNUb1N0b3BQcmltZSkgeworICAgICAgICAgICAgICAgICAgICBtUHJpbWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1QcmltZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbVBlcmlvZDsKK30KKworbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjpnZXRQZXJpb2QoKSBjb25zdCB7CisgICAgcmV0dXJuIG1QcmltZWQgPyBtUGVyaW9kIDogMDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZSBTY2hlZHVsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6VmlkZW9GcmFtZVNjaGVkdWxlckJhc2UoKQorICAgIDogbVZzeW5jVGltZSgwKSwKKyAgICAgIG1Wc3luY1BlcmlvZCgwKSwKKyAgICAgIG1Wc3luY1JlZnJlc2hBdCgwKSwKKyAgICAgIG1MYXN0VnN5bmNUaW1lKC0xKSwKKyAgICAgIG1UaW1lQ29ycmVjdGlvbigwKSB7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmluaXQoZmxvYXQgdmlkZW9GcHMpIHsKKyAgICB1cGRhdGVWc3luYygpOworCisgICAgbUxhc3RWc3luY1RpbWUgPSAtMTsKKyAgICBtVGltZUNvcnJlY3Rpb24gPSAwOworCisgICAgbVBsbC5yZXNldCh2aWRlb0Zwcyk7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OnJlc3RhcnQoKSB7CisgICAgbUxhc3RWc3luY1RpbWUgPSAtMTsKKyAgICBtVGltZUNvcnJlY3Rpb24gPSAwOworCisgICAgbVBsbC5yZXN0YXJ0KCk7Cit9CisKK25zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmdldFZzeW5jUGVyaW9kKCkgeworICAgIGlmIChtVnN5bmNQZXJpb2QgPiAwKSB7CisgICAgICAgIHJldHVybiBtVnN5bmNQZXJpb2Q7CisgICAgfQorICAgIHJldHVybiBrRGVmYXVsdFZzeW5jUGVyaW9kOworfQorCitmbG9hdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6Z2V0RnJhbWVSYXRlKCkgeworICAgIG5zZWNzX3QgdmlkZW9QZXJpb2QgPSBtUGxsLmdldFBlcmlvZCgpOworICAgIGlmICh2aWRlb1BlcmlvZCA+IDApIHsKKyAgICAgICAgcmV0dXJuIDFlOSAvIHZpZGVvUGVyaW9kOworICAgIH0KKyAgICByZXR1cm4gMC5mOworfQorCituc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpzY2hlZHVsZShuc2Vjc190IHJlbmRlclRpbWUpIHsKKyAgICBuc2Vjc190IG9yaWdSZW5kZXJUaW1lID0gcmVuZGVyVGltZTsKKworICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgIGlmIChub3cgPj0gbVZzeW5jUmVmcmVzaEF0KSB7CisgICAgICAgIHVwZGF0ZVZzeW5jKCk7CisgICAgfQorCisgICAgLy8gd2l0aG91dCBWU1lOQyBpbmZvLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvCisgICAgaWYgKG1Wc3luY1BlcmlvZCA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJubyB2c3luYzogcmVuZGVyPSVsbGQiLCAobG9uZyBsb25nKXJlbmRlclRpbWUpOworICAgICAgICByZXR1cm4gcmVuZGVyVGltZTsKKyAgICB9CisKKyAgICAvLyBlbnN1cmUgdnN5bmMgdGltZSBpcyB3ZWxsIGJlZm9yZSAoY29ycmVjdGVkKSByZW5kZXIgdGltZQorICAgIGlmIChtVnN5bmNUaW1lID4gcmVuZGVyVGltZSAtIDQgKiBtVnN5bmNQZXJpb2QpIHsKKyAgICAgICAgbVZzeW5jVGltZSAtPQorICAgICAgICAgICAgKChtVnN5bmNUaW1lIC0gcmVuZGVyVGltZSkgLyBtVnN5bmNQZXJpb2QgKyA1KSAqIG1Wc3luY1BlcmlvZDsKKyAgICB9CisKKyAgICAvLyBWaWRlbyBwcmVzZW50YXRpb24gdGFrZXMgcGxhY2UgYXQgdGhlIFZTWU5DIF9hZnRlcl8gcmVuZGVyVGltZS4gIEFkanVzdCByZW5kZXJUaW1lCisgICAgLy8gc28gdGhpcyBlZmZlY3RpdmVseSBiZWNvbWVzIGEgcm91bmRpbmcgb3BlcmF0aW9uICh0byB0aGUgX2Nsb3Nlc3RfIFZTWU5DLikKKyAgICByZW5kZXJUaW1lIC09IG1Wc3luY1BlcmlvZCAvIDI7CisKKyAgICBjb25zdCBuc2Vjc190IHZpZGVvUGVyaW9kID0gbVBsbC5hZGRTYW1wbGUob3JpZ1JlbmRlclRpbWUpOworICAgIGlmICh2aWRlb1BlcmlvZCA+IDApIHsKKyAgICAgICAgLy8gU21vb3RoIG91dCByZW5kZXJpbmcKKyAgICAgICAgc2l6ZV90IE4gPSAxMjsKKyAgICAgICAgbnNlY3NfdCBmaXZlU2l4dGhEZXYgPQorICAgICAgICAgICAgYWJzKCgodmlkZW9QZXJpb2QgKiA1ICsgbVZzeW5jUGVyaW9kKSAlIChtVnN5bmNQZXJpb2QgKiA2KSkgLSBtVnN5bmNQZXJpb2QpCisgICAgICAgICAgICAgICAgICAgIC8gKG1Wc3luY1BlcmlvZCAvIDEwMCk7CisgICAgICAgIC8vIHVzZSAyMCBzYW1wbGVzIGlmIHdlIGFyZSBkb2luZyA1OjYgcmF0aW8gKy0gMSUgKGUuZy4gcGxheWluZyA1MEh6IG9uIDYwSHopCisgICAgICAgIGlmIChmaXZlU2l4dGhEZXYgPCAxMikgeyAgLyogMTIlIC8gNiA9IDIlICovCisgICAgICAgICAgICBOID0gMjA7CisgICAgICAgIH0KKworICAgICAgICBuc2Vjc190IG9mZnNldCA9IDA7CisgICAgICAgIG5zZWNzX3QgZWRnZVJlbWFpbmRlciA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDw9IE47IGkrKykgeworICAgICAgICAgICAgb2Zmc2V0ICs9CisgICAgICAgICAgICAgICAgKHJlbmRlclRpbWUgKyBtVGltZUNvcnJlY3Rpb24gKyB2aWRlb1BlcmlvZCAqIGkgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgIGVkZ2VSZW1haW5kZXIgKz0gKHZpZGVvUGVyaW9kICogaSkgJSBtVnN5bmNQZXJpb2Q7CisgICAgICAgIH0KKyAgICAgICAgbVRpbWVDb3JyZWN0aW9uICs9IG1Wc3luY1BlcmlvZCAvIDIgLSBvZmZzZXQgLyAobnNlY3NfdClOOworICAgICAgICByZW5kZXJUaW1lICs9IG1UaW1lQ29ycmVjdGlvbjsKKyAgICAgICAgbnNlY3NfdCBjb3JyZWN0aW9uTGltaXQgPSBtVnN5bmNQZXJpb2QgKiAzIC8gNTsKKyAgICAgICAgZWRnZVJlbWFpbmRlciA9IGFicyhlZGdlUmVtYWluZGVyIC8gKG5zZWNzX3QpTiAtIG1Wc3luY1BlcmlvZCAvIDIpOworICAgICAgICBpZiAoZWRnZVJlbWFpbmRlciA8PSBtVnN5bmNQZXJpb2QgLyAzKSB7CisgICAgICAgICAgICBjb3JyZWN0aW9uTGltaXQgLz0gMjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGVzdGltYXRlIGhvdyBtYW55IFZTWU5DcyBhIGZyYW1lIHdpbGwgc3BlbmQgb24gdGhlIGRpc3BsYXkKKyAgICAgICAgbnNlY3NfdCBuZXh0VnN5bmNUaW1lID0KKyAgICAgICAgICAgIHJlbmRlclRpbWUgKyBtVnN5bmNQZXJpb2QgLSAoKHJlbmRlclRpbWUgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZCk7CisgICAgICAgIGlmIChtTGFzdFZzeW5jVGltZSA+PSAwKSB7CisgICAgICAgICAgICBzaXplX3QgbWluVnN5bmNzUGVyRnJhbWUgPSB2aWRlb1BlcmlvZCAvIG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgIHNpemVfdCB2c3luY3NGb3JMYXN0RnJhbWUgPSBkaXZSb3VuZChuZXh0VnN5bmNUaW1lIC0gbUxhc3RWc3luY1RpbWUsIG1Wc3luY1BlcmlvZCk7CisgICAgICAgICAgICBib29sIHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgPQorICAgICAgICAgICAgICAgIHBlcmlvZGljRXJyb3IodmlkZW9QZXJpb2QsIG1Wc3luY1BlcmlvZCkgLyAobVZzeW5jUGVyaW9kIC8gMjApID09IDA7CisKKyAgICAgICAgICAgIGlmIChtVGltZUNvcnJlY3Rpb24gPiBjb3JyZWN0aW9uTGltaXQgJiYKKyAgICAgICAgICAgICAgICAgICAgKHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgfHwgdnN5bmNzRm9yTGFzdEZyYW1lID4gbWluVnN5bmNzUGVyRnJhbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGEgVlNZTkMKKyAgICAgICAgICAgICAgICBtVGltZUNvcnJlY3Rpb24gLT0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICAgICAgICAgICAgICByZW5kZXJUaW1lIC09IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgICAgICAgICAgICAgbmV4dFZzeW5jVGltZSAtPSBtVnN5bmNQZXJpb2Q7CisgICAgICAgICAgICAgICAgaWYgKHZzeW5jc0Zvckxhc3RGcmFtZSA+IDApCisgICAgICAgICAgICAgICAgICAgIC0tdnN5bmNzRm9yTGFzdEZyYW1lOworICAgICAgICAgICAgfSBlbHNlIGlmIChtVGltZUNvcnJlY3Rpb24gPCAtY29ycmVjdGlvbkxpbWl0ICYmCisgICAgICAgICAgICAgICAgICAgICh2c3luY3NQZXJGcmFtZUFyZU5lYXJseUNvbnN0YW50IHx8IHZzeW5jc0Zvckxhc3RGcmFtZSA9PSBtaW5Wc3luY3NQZXJGcmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBhZGQgYSBWU1lOQworICAgICAgICAgICAgICAgIG1UaW1lQ29ycmVjdGlvbiArPSBtVnN5bmNQZXJpb2QgLyAyOworICAgICAgICAgICAgICAgIHJlbmRlclRpbWUgKz0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICAgICAgICAgICAgICBuZXh0VnN5bmNUaW1lICs9IG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgICAgICBpZiAodnN5bmNzRm9yTGFzdEZyYW1lIDwgVUxPTkdfTUFYKQorICAgICAgICAgICAgICAgICAgICArK3ZzeW5jc0Zvckxhc3RGcmFtZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVRpbWVDb3JyZWN0aW9uIDwgLWNvcnJlY3Rpb25MaW1pdCAqIDIKKyAgICAgICAgICAgICAgICAgICAgfHwgbVRpbWVDb3JyZWN0aW9uID4gY29ycmVjdGlvbkxpbWl0ICogMikgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjb3JyZWN0aW9uIGJleW9uZCBsaW1pdDogJWxsZCB2cyAlbGxkICh2c3luY3MgZm9yIGxhc3QgZnJhbWU6ICV6dSwgbWluOiAlenUpIgorICAgICAgICAgICAgICAgICAgICAgICAgIiByZXN0YXJ0aW5nLiByZW5kZXI9JWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1UaW1lQ29ycmVjdGlvbiwgKGxvbmcgbG9uZyljb3JyZWN0aW9uTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICB2c3luY3NGb3JMYXN0RnJhbWUsIG1pblZzeW5jc1BlckZyYW1lLCAobG9uZyBsb25nKW9yaWdSZW5kZXJUaW1lKTsKKyAgICAgICAgICAgICAgICByZXN0YXJ0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdSZW5kZXJUaW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBVFJBQ0VfSU5UKCJGUkFNRV9WU1lOQ1MiLCB2c3luY3NGb3JMYXN0RnJhbWUpOworICAgICAgICB9CisgICAgICAgIG1MYXN0VnN5bmNUaW1lID0gbmV4dFZzeW5jVGltZTsKKyAgICB9CisKKyAgICAvLyBhbGlnbiByZW5kZXJ0aW1lIHRvIHRoZSBjZW50ZXIgYmV0d2VlbiBWU1lOQyBlZGdlcworICAgIHJlbmRlclRpbWUgLT0gKHJlbmRlclRpbWUgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZDsKKyAgICByZW5kZXJUaW1lICs9IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgQUxPR1YoImFkanVzdGluZyByZW5kZXI6ICVsbGQgPT4gJWxsZCIsIChsb25nIGxvbmcpb3JpZ1JlbmRlclRpbWUsIChsb25nIGxvbmcpcmVuZGVyVGltZSk7CisgICAgQVRSQUNFX0lOVCgiRlJBTUVfRkxJUF9JTihtcykiLCAocmVuZGVyVGltZSAtIG5vdykgLyAxMDAwMDAwKTsKKyAgICByZXR1cm4gcmVuZGVyVGltZTsKK30KKworVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6On5WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSgpIHt9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9BbmRyb2lkLmJwCmluZGV4IGRiODYyMTguLjIxOGZlMTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQW5kcm9pZC5icApAQCAtNCw3ICs0LDcgQEAKICAgICB2bmRrOiB7CiAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgfSwKLQorICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKICAgICBzcmNzOiBbCiAgICAgICAgICJDb252ZXJzaW9uLmNwcCIsCiAgICAgICAgICJGcmFtZURyb3BwZXIuY3BwIiwKQEAgLTI1LDcgKzI1LDYgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJndWkiLApAQCAtMzgsOCArMzcsNiBAQAogICAgICAgICAibGlidXRpbHMiLAogCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCi0KLSAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsIC8vIFRPRE8oYi82MjkyMzQ3OSk6IHVzZSBoZWFkZXIgbGlicmFyeQogICAgIF0sCiAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbnZlcnNpb24uY3BwCmluZGV4IGZmZWQwMDUuLjkxZDdjNzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbnZlcnNpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbnZlcnNpb24uY3BwCkBAIC05OCw2ICs5OCwxNyBAQAogICovCiAKIC8qKgorICogXGJyaWVmIENvbnZlcnQgYFJldHVybjx2b2lkPmAgdG8gYHN0YXR1c190YC4gVGhpcyBpcyBmb3IgbGVnYWN5IGJpbmRlciBjYWxscy4KKyAqCisgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmV0dXJuPHZvaWQ+YC4KKyAqIFxyZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgYHN0YXR1c190YC4KKyAqLworLy8gY29udmVydDogUmV0dXJuPHZvaWQ+IC0+IHN0YXR1c190CitzdGF0dXNfdCB0b1N0YXR1c1QoUmV0dXJuPHZvaWQ+IGNvbnN0JiB0KSB7CisgICAgcmV0dXJuIHQuaXNPaygpID8gT0sgOiAodC5pc0RlYWRPYmplY3QoKSA/IERFQURfT0JKRUNUIDogVU5LTk9XTl9FUlJPUik7Cit9CisKKy8qKgogICogXGJyaWVmIENvbnZlcnQgYFJldHVybjx2b2lkPmAgdG8gYGJpbmRlcjo6U3RhdHVzYC4KICAqCiAgKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmV0dXJuPHZvaWQ+YC4KQEAgLTEwNywyMiArMTE4LDExIEBACiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIHRvQmluZGVyU3RhdHVzKAogICAgICAgICBSZXR1cm48dm9pZD4gY29uc3QmIHQpIHsKICAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoCi0gICAgICAgICAgICB0LmlzT2soKSA/IE9LIDogVU5LTk9XTl9FUlJPUiwKKyAgICAgICAgICAgIHRvU3RhdHVzVCh0KSwKICAgICAgICAgICAgIHQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKIH0KIAogLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgUmV0dXJuPHZvaWQ+YCB0byBgc3RhdHVzX3RgLiBUaGlzIGlzIGZvciBsZWdhY3kgYmluZGVyIGNhbGxzLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZXR1cm48dm9pZD5gLgotICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgc3RhdHVzX3RgLgotICovCi0vLyBjb252ZXJ0OiBSZXR1cm48dm9pZD4gLT4gc3RhdHVzX3QKLXN0YXR1c190IHRvU3RhdHVzVChSZXR1cm48dm9pZD4gY29uc3QmIHQpIHsKLSAgICByZXR1cm4gdC5pc09rKCkgPyBPSyA6IFVOS05PV05fRVJST1I7Ci19Ci0KLS8qKgogICogXGJyaWVmIFdyYXAgYG5hdGl2ZV9oYW5kbGVfdCpgIGluIGBoaWRsX2hhbmRsZWAuCiAgKgogICogXHBhcmFtW2luXSBuaCBUaGUgc291cmNlIGBuYXRpdmVfaGFuZGxlX3QqYC4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKaW5kZXggNzFjZWVkOC4uYTQzNzRjOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKQEAgLTc2Nyw3ICs3NjcsNyBAQAogICAgICAgICAgICAgZG91YmxlIG5GcmFtZXMgPSAodGltZVVzIC0gbVByZXZDYXB0dXJlVXMpICogbUNhcHR1cmVGcHMgLyAxMDAwMDAwOwogICAgICAgICAgICAgaWYgKG5GcmFtZXMgPCAwLjUgLSBrVGltZXN0YW1wRmx1Y3R1YXRpb24pIHsKICAgICAgICAgICAgICAgICAvLyBza2lwIHRoaXMgZnJhbWUgYXMgaXQncyB0b28gY2xvc2UgdG8gcHJldmlvdXMgY2FwdHVyZQotICAgICAgICAgICAgICAgIEFMT0dWKCJza2lwcGluZyBmcmFtZSwgdGltZVVzICVsbGQiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHRpbWVVcykpOworICAgICAgICAgICAgICAgIEFMT0dEKCJza2lwcGluZyBmcmFtZSwgdGltZVVzICVsbGQiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHRpbWVVcykpOwogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChuRnJhbWVzIDw9IDEuMCkgewpAQCAtMTEwNiw2ICsxMTA2LDE0IEBACiAgICAgICAgIGNvbnN1bWVyVXNhZ2UgfD0gR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSOwogICAgICAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyVXNhZ2VCaXRzKGNvbnN1bWVyVXNhZ2UpOwogCisgICAgICAgIC8vIFNldCBpbXBsLiBkZWZpbmVkIGZvcm1hdCBhcyBkZWZhdWx0LiBEZXBlbmRpbmcgb24gdGhlIHVzYWdlIGZsYWdzCisgICAgICAgIC8vIHRoZSBkZXZpY2Utc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gd2lsbCBkZXJpdmUgdGhlIGV4YWN0IGZvcm1hdC4KKyAgICAgICAgZXJyID0gbUNvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyRm9ybWF0KEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCk7CisgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29uZmlndXJlIHN1cmZhY2UgZGVmYXVsdCBmb3JtYXQgcmV0OiAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKICAgICAgICAgLy8gU2V0cyB0aGUgZGVmYXVsdCBidWZmZXIgZGF0YSBzcGFjZQogICAgICAgICBBTE9HRCgic2V0dGluZyBkYXRhc3BhY2U6ICUjeCwgYWNxdWlyZWQ9JWQiLCBkYXRhU3BhY2UsIG1OdW1PdXRzdGFuZGluZ0FjcXVpcmVzKTsKICAgICAgICAgbUNvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyRGF0YVNwYWNlKChhbmRyb2lkX2RhdGFzcGFjZSlkYXRhU3BhY2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKaW5kZXggMzc5ZDQxZS4uZTBmMjY4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCkBAIC0xMDU4LDggKzEwNTgsOCBAQAogICAgIH0KIH0KIAotT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjpzZXRDb25maWcoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcykgeworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjppbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBfcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZykgewogICAgIHN3aXRjaCAoKGludClpbmRleCkgewogICAgICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFWT1BSZWZyZXNoOgogICAgICAgICB7CkBAIC0xMTI1LDcgKzExMjUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpzZXRDb25maWcoaW5kZXgsIF9wYXJhbXMpOworICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0Q29uZmlnKGluZGV4LCBfcGFyYW1zLCBmcmFtZUNvbmZpZyk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oCmluZGV4IGE0M2NkZjEuLjgyNTNiN2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oCkBAIC0yMTksOCArMjE5LDggQEAKICAgICBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0Qml0cmF0ZVBhcmFtcygKICAgICAgICAgY29uc3QgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFICpiaXRyYXRlKTsKIAotICAgIE9NWF9FUlJPUlRZUEUgc2V0Q29uZmlnKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIF9wYXJhbXMpOworICAgIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpOwogCiAgICAgT01YX0VSUk9SVFlQRSBnZXRDb25maWcoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9BbmRyb2lkLmJwCmluZGV4IDE2NzRjYjIuLjNkNGE0NGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9BbmRyb2lkLmJwCkBAIC0yOSw3ICsyOSw2IEBACiAgICAgfSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZsYWNkZWMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5jcHAKaW5kZXggNGRiMDA2MC4uODQyYTdjZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5jcHAKQEAgLTg5LDEyICs4OSwxMiBAQAogICAgIGRlZi5lRGlyID0gT01YX0Rpck91dHB1dDsKICAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bU91dHB1dEJ1ZmZlcnM7CiAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47Ci0gICAgZGVmLm5CdWZmZXJTaXplID0gNDA5NiAqIEZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHM7CisgICAgZGVmLm5CdWZmZXJTaXplID0ga051bVNhbXBsZXNQZXJGcmFtZSAqIEZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHMgKiBzaXplb2YoZmxvYXQpOwogICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOwogICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOwogICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKICAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOwotICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMjsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IHNpemVvZihmbG9hdCk7CiAKICAgICBkZWYuZm9ybWF0LmF1ZGlvLmNNSU1FVHlwZSA9IGNvbnN0X2Nhc3Q8Y2hhciAqPigiYXVkaW8vcmF3Iik7CiAgICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKQEAgLTE3Myw3ICsxNzMsNyBAQAogICAgICAgICAgICAgICAgIGZsYWNQYXJhbXMtPm5DaGFubmVscyA9IG1TdHJlYW1JbmZvLmNoYW5uZWxzOwogICAgICAgICAgICAgICAgIGZsYWNQYXJhbXMtPm5TYW1wbGVSYXRlID0gbVN0cmVhbUluZm8uc2FtcGxlX3JhdGU7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZsYWNQYXJhbXMtPm5DaGFubmVscyA9IDE7CisgICAgICAgICAgICAgICAgZmxhY1BhcmFtcy0+bkNoYW5uZWxzID0gMjsKICAgICAgICAgICAgICAgICBmbGFjUGFyYW1zLT5uU2FtcGxlUmF0ZSA9IDQ0MTAwOwogICAgICAgICAgICAgfQogCkBAIC0xOTUsMTAgKzE5NSwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+ZU51bURhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZDsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZU51bURhdGEgPSBtTnVtZXJpY2FsRGF0YTsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUVuZGlhbiA9IE9NWF9FbmRpYW5CaWc7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmJJbnRlcmxlYXZlZCA9IE9NWF9UUlVFOwotICAgICAgICAgICAgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID0gMTY7CisgICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSBtQml0c1BlclNhbXBsZTsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzBdID0gT01YX0FVRElPX0NoYW5uZWxMRjsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzFdID0gT01YX0FVRElPX0NoYW5uZWxSRjsKQEAgLTIxMSw3ICsyMTEsNyBAQAogICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+bkNoYW5uZWxzID0gbVN0cmVhbUluZm8uY2hhbm5lbHM7CiAgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uU2FtcGxpbmdSYXRlID0gbVN0cmVhbUluZm8uc2FtcGxlX3JhdGU7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+bkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5DaGFubmVscyA9IDI7CiAgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uU2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgICAgICAgICB9CiAKQEAgLTI4MSw2ICsyODEsMTkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUG9ydEluZGV4OwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5lTnVtRGF0YSA9PSBPTVhfTnVtZXJpY2FsRGF0YUZsb2F0ICYmIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9PSAzMikgeworICAgICAgICAgICAgICAgIG1OdW1lcmljYWxEYXRhID0gT01YX051bWVyaWNhbERhdGFGbG9hdDsKKyAgICAgICAgICAgICAgICBtQml0c1BlclNhbXBsZSA9IDMyOworICAgICAgICAgICAgfSBlbHNlIGlmIChwY21QYXJhbXMtPmVOdW1EYXRhID09IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkCisgICAgICAgICAgICAgICAgICAgICAmJiBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICBtTnVtZXJpY2FsRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgICAgICAgICAgICAgIG1CaXRzUGVyU2FtcGxlID0gMTY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGVOdW1EYXRhICVkLCBuQml0c1BlclNhbXBsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBwY21QYXJhbXMtPmVOdW1EYXRhLCBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUpOworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKQEAgLTMwMSwxMSArMzE0LDEzIEBACiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOwogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CiAKKyAgICBjb25zdCBib29sIG91dHB1dEZsb2F0ID0gbU51bWVyaWNhbERhdGEgPT0gT01YX051bWVyaWNhbERhdGFGbG9hdDsKKwogICAgIEFMT0dWKCJvblF1ZXVlRmlsbGVkICVkLyVkOiIsIGluUXVldWUuZW1wdHkoKSwgb3V0UXVldWUuZW1wdHkoKSk7CiAgICAgd2hpbGUgKCghaW5RdWV1ZS5lbXB0eSgpIHx8IG1TYXdJbnB1dEVPUykgJiYgIW91dFF1ZXVlLmVtcHR5KCkgJiYgIW1GaW5pc2hlZERlY29kZXIpIHsKICAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOwogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKLSAgICAgICAgaW50MTZfdCAqb3V0QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+KG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCk7CisgICAgICAgIHZvaWQgKm91dEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQpOwogICAgICAgICBzaXplX3Qgb3V0QnVmZmVyU2l6ZSA9IG91dEhlYWRlci0+bkFsbG9jTGVuIC0gb3V0SGVhZGVyLT5uT2Zmc2V0OwogICAgICAgICBpbnQ2NF90IHRpbWVTdGFtcCA9IDA7CiAKQEAgLTM3NCw3ICszODksNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdGF0dXNfdCBkZWNvZGVyRXJyID0gbUZMQUNEZWNvZGVyLT5kZWNvZGVPbmVGcmFtZSgKLSAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoLCBvdXRCdWZmZXIsICZvdXRCdWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoLCBvdXRCdWZmZXIsICZvdXRCdWZmZXJTaXplLCBvdXRwdXRGbG9hdCk7CiAgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIEFMT0dFKCJvblF1ZXVlRmlsbGVkOiBGTEFDRGVjb2RlciBkZWNvZGVPbmVGcmFtZSByZXR1cm5zIGVycm9yICVkIiwgZGVjb2RlckVycik7CiAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKQEAgLTM5Myw3ICs0MDgsOSBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG1TYXdJbnB1dEVPUykgewotICAgICAgICAgICAgc3RhdHVzX3QgZGVjb2RlckVyciA9IG1GTEFDRGVjb2Rlci0+ZGVjb2RlT25lRnJhbWUoTlVMTCwgMCwgb3V0QnVmZmVyLCAmb3V0QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBzdGF0dXNfdCBkZWNvZGVyRXJyID0gbUZMQUNEZWNvZGVyLT5kZWNvZGVPbmVGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBpbkJ1ZmZlciAqLywgMCAvKiBpbkJ1ZmZlckxlbiAqLywKKyAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLCAmb3V0QnVmZmVyU2l6ZSwgb3V0cHV0RmxvYXQpOwogICAgICAgICAgICAgbUZpbmlzaGVkRGVjb2RlciA9IHRydWU7CiAgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIEFMT0dFKCJvblF1ZXVlRmlsbGVkOiBGTEFDRGVjb2RlciBmaW5pc2ggcmV0dXJucyBlcnJvciAlZCIsIGRlY29kZXJFcnIpOwpAQCAtNDU2LDcgKzQ3Myw4IEBACiAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRU5BQkxFRDsKICAgICAgICAgICAgIFBvcnRJbmZvICppbmZvID0gZWRpdFBvcnRJbmZvKDEgLyogcG9ydEluZGV4ICovKTsKICAgICAgICAgICAgIGlmICghaW5mby0+bURlZi5iRW5hYmxlZCkgewotICAgICAgICAgICAgICAgIGluZm8tPm1EZWYubkJ1ZmZlclNpemUgPSBtU3RyZWFtSW5mby5tYXhfYmxvY2tzaXplICogbVN0cmVhbUluZm8uY2hhbm5lbHMgKiAyOworICAgICAgICAgICAgICAgIGluZm8tPm1EZWYubkJ1ZmZlclNpemUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSAqIG1TdHJlYW1JbmZvLmNoYW5uZWxzICogc2l6ZW9mKGZsb2F0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmgKaW5kZXggYjYzZjdhZC4uYmEwMjA3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuaApAQCAtNDUsMTAgKzQ1LDE0IEBACiAgICAgdmlydHVhbCB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGludCBrTnVtU2FtcGxlc1BlckZyYW1lID0gMjA0ODsgLy8gYWRqdXN0ZWQgYmFzZWQgb24gc3RyZWFtLgorCiAgICAgZW51bSB7CiAgICAgICAgIGtOdW1JbnB1dEJ1ZmZlcnMgICA9IDQsCiAgICAgICAgIGtOdW1PdXRwdXRCdWZmZXJzICA9IDQsCiAgICAgfTsKKyAgICBPTVhfTlVNRVJJQ0FMREFUQVRZUEUgbU51bWVyaWNhbERhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZDsKKyAgICBPTVhfVTMyIG1CaXRzUGVyU2FtcGxlID0gMTY7CiAKICAgICBGTEFDRGVjb2RlciAqbUZMQUNEZWNvZGVyOwogICAgIEZMQUNfX1N0cmVhbU1ldGFkYXRhX1N0cmVhbUluZm8gbVN0cmVhbUluZm87CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLmJwCmluZGV4IDliNjk2ZGEuLmIzMmFiMDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLmJwCkBAIC0yOCw3ICsyOCwxMCBAQAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWyJsaWJiYXNlX2hlYWRlcnMiXSwKLSAgICBzdGF0aWNfbGliczogWyJsaWJGTEFDIl0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliRkxBQyIsCisgICAgXSwKIAogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2ZsYWNlbmMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCmluZGV4IDk1NWYyMTEuLjNhZGQwMDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJTb2Z0RmxhY0VuY29kZXIuaCIKLQorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogCkBAIC03NSw3ICs3NSw5IEBACiAgICAgfQogCiAgICAgaWYgKCFtU2lnbmFsbGVkRXJyb3IpIHsgLy8gbm8gdXNlIGFsbG9jYXRpbmcgaW5wdXQgYnVmZmVyIGlmIHdlIGhhZCBhbiBlcnJvciBhYm92ZQotICAgICAgICBtSW5wdXRCdWZmZXJQY20zMiA9IChGTEFDX19pbnQzMiopIG1hbGxvYyhzaXplb2YoRkxBQ19faW50MzIpICogMiAqIGtNYXhOdW1TYW1wbGVzUGVyRnJhbWUpOworICAgICAgICAvLyAyeCB0aGUgcGNtMTYgc2FtcGxlcyBjYW4gZXhpc3Qgd2l0aCB0aGUgc2FtZSBzaXplIGFzIHBjbUZsb2F0IHNhbXBsZXMuCisgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyID0gKEZMQUNfX2ludDMyKikgbWFsbG9jKAorICAgICAgICAgICAgICAgIHNpemVvZihGTEFDX19pbnQzMikgKiBrTnVtU2FtcGxlc1BlckZyYW1lICoga01heENoYW5uZWxzICogMik7CiAgICAgICAgIGlmIChtSW5wdXRCdWZmZXJQY20zMiA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgiU29mdEZsYWNFbmNvZGVyOjpTb2Z0RmxhY0VuY29kZXIobmFtZT0lcykgZXJyb3IgYWxsb2NhdGluZyBpbnRlcm5hbCBpbnB1dCBidWZmZXIiLCBuYW1lKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CkBAIC0xMTUsMTQgKzExNywxNCBAQAogICAgIC8vIGNvbmZpZ3VyZSBpbnB1dCBwb3J0IG9mIHRoZSBlbmNvZGVyCiAgICAgZGVmLm5Qb3J0SW5kZXggPSAwOwogICAgIGRlZi5lRGlyID0gT01YX0RpcklucHV0OwotICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsvLyBUT0RPIHZlcmlmeSB0aGF0IDEgaXMgZW5vdWdoCisgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOwogICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOwogICAgIGRlZi5uQnVmZmVyU2l6ZSA9IGtNYXhJbnB1dEJ1ZmZlclNpemU7CiAgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CiAgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CiAgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOwogICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7Ci0gICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAyOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gc2l6ZW9mKGZsb2F0KTsKIAogICAgIGRlZi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlID0gY29uc3RfY2FzdDxjaGFyICo+KCJhdWRpby9yYXciKTsKICAgICBkZWYuZm9ybWF0LmF1ZGlvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOwpAQCAtMTM0LDcgKzEzNiw3IEBACiAgICAgLy8gY29uZmlndXJlIG91dHB1dCBwb3J0IG9mIHRoZSBlbmNvZGVyCiAgICAgZGVmLm5Qb3J0SW5kZXggPSAxOwogICAgIGRlZi5lRGlyID0gT01YX0Rpck91dHB1dDsKLSAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7Ly8gVE9ETyB2ZXJpZnkgdGhhdCAxIGlzIGVub3VnaAorICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKICAgICBkZWYubkJ1ZmZlclNpemUgPSBrTWF4T3V0cHV0QnVmZmVyU2l6ZTsKICAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKQEAgLTE5MywxMCArMTk1LDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSA9IG1OdW1lcmljYWxEYXRhOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5lRW5kaWFuID0gT01YX0VuZGlhbkJpZzsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+YkludGVybGVhdmVkID0gT01YX1RSVUU7Ci0gICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9IG1CaXRzUGVyU2FtcGxlOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5lUENNTW9kZSA9IE9NWF9BVURJT19QQ01Nb2RlTGluZWFyOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMF0gPSBPTVhfQVVESU9fQ2hhbm5lbExGOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMV0gPSBPTVhfQVVESU9fQ2hhbm5lbFJGOwpAQCAtMjcwLDEyICsyNzIsMjYgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uQ2hhbm5lbHMgPCAxIHx8IHBjbVBhcmFtcy0+bkNoYW5uZWxzID4gMikgeworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+bkNoYW5uZWxzIDwgMSB8fCBwY21QYXJhbXMtPm5DaGFubmVscyA+IGtNYXhDaGFubmVscykgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1OdW1DaGFubmVscyA9IHBjbVBhcmFtcy0+bkNoYW5uZWxzOwogICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBwY21QYXJhbXMtPm5TYW1wbGluZ1JhdGU7CisKKyAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPmVOdW1EYXRhID09IE9NWF9OdW1lcmljYWxEYXRhRmxvYXQgJiYgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID09IDMyKSB7CisgICAgICAgICAgICAgICAgbU51bWVyaWNhbERhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YUZsb2F0OworICAgICAgICAgICAgICAgIG1CaXRzUGVyU2FtcGxlID0gMzI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBjbVBhcmFtcy0+ZU51bURhdGEgPT0gT01YX051bWVyaWNhbERhdGFTaWduZWQKKyAgICAgICAgICAgICAgICAgICAgICYmIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9PSAxNikgeworICAgICAgICAgICAgICAgIG1OdW1lcmljYWxEYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgICAgICAgICAgICAgbUJpdHNQZXJTYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGVOdW1EYXRhICVkLCBuQml0c1BlclNhbXBsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGNtUGFyYW1zLT5lTnVtRGF0YSwgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBBTE9HVigid2lsbCBlbmNvZGUgJWQgY2hhbm5lbHMgYXQgJWRIeiIsIG1OdW1DaGFubmVscywgbVNhbXBsZVJhdGUpOwogCiAgICAgICAgICAgICByZXR1cm4gY29uZmlndXJlRW5jb2RlcigpOwpAQCAtMzU2LDYgKzM3MiwxMCBAQAogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOwogCisgICAgY29uc3QgYm9vbCBpbnB1dEZsb2F0ID0gbU51bWVyaWNhbERhdGEgPT0gT01YX051bWVyaWNhbERhdGFGbG9hdDsKKyAgICBjb25zdCBzaXplX3Qgc2FtcGxlU2l6ZSA9IGlucHV0RmxvYXQgPyBzaXplb2YoZmxvYXQpIDogc2l6ZW9mKGludDE2X3QpOworICAgIGNvbnN0IHNpemVfdCBmcmFtZVNpemUgPSBzYW1wbGVTaXplICogbU51bUNoYW5uZWxzOworCiAgICAgRkxBQ19fYm9vbCBvayA9IHRydWU7CiAKICAgICB3aGlsZSAoKCFpblF1ZXVlLmVtcHR5KCkgfHwgbVNhd0lucHV0RU9TKSAmJiAhb3V0UXVldWUuZW1wdHkoKSAmJiAhbVNlbnRPdXRwdXRFT1MpIHsKQEAgLTM4MSwxMyArNDAxLDIxIEBACiAgICAgICAgICAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlcyA9IDA7CiAgICAgICAgICAgICBtQ3VycmVudElucHV0VGltZVN0YW1wID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CiAKLSAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIG5iSW5wdXRGcmFtZXMgPSBpbkhlYWRlci0+bkZpbGxlZExlbiAvICgyICogbU51bUNoYW5uZWxzKTsKLSAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIG5iSW5wdXRTYW1wbGVzID0gaW5IZWFkZXItPm5GaWxsZWRMZW4gLyAyOwotICAgICAgICAgICAgY29uc3QgT01YX1MxNiAqIGNvbnN0IHBjbTE2ID0gcmVpbnRlcnByZXRfY2FzdDxPTVhfUzE2ICo+KGluSGVhZGVyLT5wQnVmZmVyKTsKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIG5iSW5wdXRGcmFtZXMgPSBpbkhlYWRlci0+bkZpbGxlZExlbiAvIGZyYW1lU2l6ZTsKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIG5iSW5wdXRTYW1wbGVzID0gaW5IZWFkZXItPm5GaWxsZWRMZW4gLyBzYW1wbGVTaXplOwogCi0gICAgICAgICAgICBDSEVDS19MRShuYklucHV0U2FtcGxlcywgMiAqIGtNYXhOdW1TYW1wbGVzUGVyRnJhbWUpOwotICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpPTAgOyBpIDwgbmJJbnB1dFNhbXBsZXMgOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJQY20zMltpXSA9IChGTEFDX19pbnQzMikgcGNtMTZbaV07CisgICAgICAgICAgICBpZiAoaW5wdXRGbG9hdCkgeworICAgICAgICAgICAgICAgIENIRUNLX0xFKG5iSW5wdXRTYW1wbGVzLCBrTnVtU2FtcGxlc1BlckZyYW1lICoga01heENoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqIGNvbnN0IHBjbUZsb2F0ID0gcmVpbnRlcnByZXRfY2FzdDxmbG9hdCAqPihpbkhlYWRlci0+cEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgIG1lbWNweV90b19xOF8yM19mcm9tX2Zsb2F0X3dpdGhfY2xhbXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyUGNtMzIsIHBjbUZsb2F0LCBuYklucHV0U2FtcGxlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIG5vdGUgbmJJbnB1dFNhbXBsZXMgbWF5IGJlIDJ4IGFzIGxhcmdlIGZvciBwY20xNiBkYXRhLgorICAgICAgICAgICAgICAgIENIRUNLX0xFKG5iSW5wdXRTYW1wbGVzLCBrTnVtU2FtcGxlc1BlckZyYW1lICoga01heENoYW5uZWxzICogMik7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqIGNvbnN0IHBjbTE2ID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+KGluSGVhZGVyLT5wQnVmZmVyKTsKKyAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbmJJbnB1dFNhbXBsZXM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJQY20zMltpXSA9IChGTEFDX19pbnQzMikgcGNtMTZbaV07CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoIiBhYm91dCB0byBlbmNvZGUgJXUgc2FtcGxlcyBwZXIgY2hhbm5lbCIsIG5iSW5wdXRGcmFtZXMpOwogICAgICAgICAgICAgb2sgPSBGTEFDX19zdHJlYW1fZW5jb2Rlcl9wcm9jZXNzX2ludGVybGVhdmVkKApAQCAtNTI2LDEwICs1NTQsMTIgQEAKICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckludmFsaWRTdGF0ZTsKICAgICB9CiAKKyAgICBjb25zdCBib29sIGlucHV0RmxvYXQgPSBtTnVtZXJpY2FsRGF0YSA9PSBPTVhfTnVtZXJpY2FsRGF0YUZsb2F0OworICAgIGNvbnN0IGludCBjb2RlY0JpdHNQZXJTYW1wbGUgPSBpbnB1dEZsb2F0ID8gMjQgOiAxNjsKICAgICBGTEFDX19ib29sIG9rID0gdHJ1ZTsKICAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9jaGFubmVscyhtRmxhY1N0cmVhbUVuY29kZXIsIG1OdW1DaGFubmVscyk7CiAgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfc2FtcGxlX3JhdGUobUZsYWNTdHJlYW1FbmNvZGVyLCBtU2FtcGxlUmF0ZSk7Ci0gICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfYml0c19wZXJfc2FtcGxlKG1GbGFjU3RyZWFtRW5jb2RlciwgMTYpOworICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2JpdHNfcGVyX3NhbXBsZShtRmxhY1N0cmVhbUVuY29kZXIsIGNvZGVjQml0c1BlclNhbXBsZSk7CiAgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfY29tcHJlc3Npb25fbGV2ZWwobUZsYWNTdHJlYW1FbmNvZGVyLAogICAgICAgICAgICAgKHVuc2lnbmVkKW1Db21wcmVzc2lvbkxldmVsKTsKICAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF92ZXJpZnkobUZsYWNTdHJlYW1FbmNvZGVyLCBmYWxzZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmgKaW5kZXggNjRhNmIxZS4uNzIyZmMxMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuaApAQCAtNDUsOCArNDUsMTAgQEAKIAogcHJpdmF0ZToKICAgICBjb25zdCB1bnNpZ25lZCBpbnQga051bUJ1ZmZlcnMgPSAyOwotICAgIGNvbnN0IHVuc2lnbmVkIGludCBrTWF4TnVtU2FtcGxlc1BlckZyYW1lID0gMTE1MjsKLSAgICBjb25zdCB1bnNpZ25lZCBpbnQga01heElucHV0QnVmZmVyU2l6ZSA9IGtNYXhOdW1TYW1wbGVzUGVyRnJhbWUgKiBzaXplb2YoaW50MTZfdCkgKiAyOworICAgIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgaW50IGtNYXhDaGFubmVscyA9IDI7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBpbnQga051bVNhbXBsZXNQZXJGcmFtZSA9IDExNTI7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBpbnQga01heElucHV0QnVmZmVyU2l6ZSA9CisgICAgICAgICAgICBrTnVtU2FtcGxlc1BlckZyYW1lICoga01heENoYW5uZWxzICogc2l6ZW9mKGZsb2F0KTsKICAgICBjb25zdCB1bnNpZ25lZCBpbnQga01heE91dHB1dEJ1ZmZlclNpemUgPSA2NTUzNjsgICAgLy9UT0RPIGNoZWNrIGlmIHRoaXMgY2FuIGJlIHJlZHVjZWQKIAogICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOwpAQCAtNTQsNiArNTYsOCBAQAogICAgIE9NWF9VMzIgbU51bUNoYW5uZWxzOwogICAgIE9NWF9VMzIgbVNhbXBsZVJhdGU7CiAgICAgT01YX1UzMiBtQ29tcHJlc3Npb25MZXZlbDsKKyAgICBPTVhfTlVNRVJJQ0FMREFUQVRZUEUgbU51bWVyaWNhbERhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZDsKKyAgICBPTVhfVTMyIG1CaXRzUGVyU2FtcGxlID0gMTY7CiAKICAgICAvLyBzaG91bGQgdGhlIGRhdGEgcmVjZWl2ZWQgYnkgdGhlIGNhbGxiYWNrIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBwb3J0CiAgICAgYm9vbCAgICAgICAgbUVuY29kZXJXcml0ZURhdGE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcAppbmRleCBjMTQ5ODNhLi44NzdjYjVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKQEAgLTIzLDYgKzIzLDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogCisjZGVmaW5lIE1BWF9DSEFOTkVMX0NPVU5UICAgICAgICAgICAgNiAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgdGhhdCBjYW4gYmUgZGVjb2RlZCAqLworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHRlbXBsYXRlPGNsYXNzIFQ+CkBAIC0xODQsNyArMTg2LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uQ2hhbm5lbHMgPCAxIHx8IHBjbVBhcmFtcy0+bkNoYW5uZWxzID4gMikgeworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+bkNoYW5uZWxzIDwgMSB8fCBwY21QYXJhbXMtPm5DaGFubmVscyA+IE1BWF9DSEFOTkVMX0NPVU5UKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9ibG9ja19pZGN0LmNwcAppbmRleCBhNzU0ODNhLi4zZDEwMDg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9ibG9ja19pZGN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9ibG9ja19pZGN0LmNwcApAQCAtNjE3LDYgKzYxNyw3IEBACiAgICAgcmV0dXJuOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Ryb3dfaW50cmEoCiAgICAgaW50MTYgKmJsaywgUElYRUwgKmNvbXAsIGludCB3aWR0aAogKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAKaW5kZXggNzVjYTg0Ni4uOWMwZmNmYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wdmRlY19hcGkuY3BwCkBAIC0xODYsOCArMTg2LDggQEAKICNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAogICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XSA9IElNRU1fdm9sW2lkeF07CiAgICAgICAgICAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IHNpemVvZihWb2wpOwotICAgICAgICAgICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLT52b2xbaWR4XSwgMCwgc2l6ZW9mKFZvbCkpOwogICAgICAgICAgICAgICAgIGlmICh2aWRlby0+dm9sW2lkeF0gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgICAgICAgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+dm9sW2lkeF0sIDAsIHNpemVvZihWb2wpKTsKICAgICAgICAgICAgICAgICBzdHJlYW0gPSBJTUVNX0JpdHN0cmVhbURlY1ZpZGVvOwogI2Vsc2UKICAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0gPSAoVm9sICopIG9zY2xfbWFsbG9jKHNpemVvZihWb2wpKTsKQEAgLTIxMyw2ICsyMTMsNyBAQAogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGludDMyIGJ1ZmZlcl9zaXplOworICAgICAgICAgICAgICAgICAgICBvc2NsX21lbXNldChzdHJlYW0sIDAsIHNpemVvZihCaXRzdHJlYW1EZWNWaWRlbykpOwogICAgICAgICAgICAgICAgICAgICBpZiAoKGJ1ZmZlcl9zaXplID0gQml0c3RyZWFtT3BlbihzdHJlYW0sIGlkeCkpIDwgMCkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgbXA0ZGVjX2xvZygiSW5pdFZpZGVvRGVjb2RlcigpOiBDYW4ndCBhbGxvY2F0ZSBiaXRzdHJlYW0gYnVmZmVyLlxuIik7CkBAIC0zMzksMjcgKzM0MCwzMyBAQAogI2lmZGVmIERFQ19JTlRFUk5BTF9NRU1PUllfT1BUCiAgICAgdmlkZW8tPmN1cnJWb3AtPnlDaGFuID0gSU1FTV9jdXJyVm9wX3lDaGFuOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KICAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArIHNpemU7Ci0gICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgZWxzZSB7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArIHNpemU7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIH0KIAogICAgIHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9IElNRU1fcHJldlZvcF95Q2hhbjsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCiAgICAgaWYgKHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB2aWRlby0+cHJldlZvcC0+dUNoYW4gPSB2aWRlby0+cHJldlZvcC0+eUNoYW4gKyBzaXplOwotICAgIHZpZGVvLT5wcmV2Vm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIGVsc2UgeworICAgICAgICB2aWRlby0+cHJldlZvcC0+dUNoYW4gPSB2aWRlby0+cHJldlZvcC0+eUNoYW4gKyBzaXplOworICAgICAgICB2aWRlby0+cHJldlZvcC0+dkNoYW4gPSB2aWRlby0+cHJldlZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICB9CiAjZWxzZQogICAgIGlmIChzaXplID4gSU5UMzJfTUFYIC8gMykgewogICAgICAgICByZXR1cm4gUFZfRkFMU0U7CiAgICAgfQogICAgIHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9IChQSVhFTCAqKSBvc2NsX21hbGxvYyhzaXplICogMyAvIDIpOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KICAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotCi0gICAgdmlkZW8tPmN1cnJWb3AtPnVDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgc2l6ZTsKLSAgICB2aWRlby0+Y3VyclZvcC0+dkNoYW4gPSB2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICBlbHNlIHsKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnVDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgfQogICAgIHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9IChQSVhFTCAqKSBvc2NsX21hbGxvYyhzaXplICogMyAvIDIpOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KICAgICBpZiAodmlkZW8tPnByZXZWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotCi0gICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuICsgc2l6ZTsKLSAgICB2aWRlby0+cHJldlZvcC0+dkNoYW4gPSB2aWRlby0+cHJldlZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICBlbHNlIHsKKyAgICAgICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgdmlkZW8tPnByZXZWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgfQogI2VuZGlmCiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChzaXplICogMyk7CiAjZW5kaWYgICAvLyBNRU1PUllfUE9PTApAQCAtMzgzLDggKzM5MCwxMCBAQAogCiAgICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuID0gKFBJWEVMICopIG9zY2xfbWFsbG9jKHNpemUgKiAzIC8gMik7IC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIFZPUCBPS0EgMy8yLzEqLwogICAgICAgICAgICAgaWYgKHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbiArIHNpemU7Ci0gICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4gKyBzaXplOworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dkNoYW4gPSB2aWRlby0+cHJldkVuaGNWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKDMgKiBzaXplIC8gMik7CiAjZW5kaWYKICAgICAgICAgfQpAQCAtNDMxLDEwICs0NDAsMTIgQEAKICNlbHNlCiAgICAgdmlkZW8tPnNsaWNlTm8gPSAodWludDggKikgb3NjbF9tYWxsb2MoblRvdGFsTUIpOwogICAgIGlmICh2aWRlby0+c2xpY2VObyA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5zbGljZU5vLCAwLCBuVG90YWxNQik7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IG5Ub3RhbE1COwogCiAgICAgdmlkZW8tPmFjUHJlZEZsYWcgPSAodWludDggKikgb3NjbF9tYWxsb2MoblRvdGFsTUIgKiBzaXplb2YodWludDgpKTsKICAgICBpZiAodmlkZW8tPmFjUHJlZEZsYWcgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+YWNQcmVkRmxhZywgMCwgblRvdGFsTUIgKiBzaXplb2YodWludDgpKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CKTsKIAogICAgIGlmICgoc2l6ZV90KW5Ub3RhbE1CID4gU0laRV9NQVggLyBzaXplb2YodHlwZURDU3RvcmUpKSB7CkBAIC00NDIsNiArNDUzLDcgQEAKICAgICB9CiAgICAgdmlkZW8tPnByZWREQyA9ICh0eXBlRENTdG9yZSAqKSBvc2NsX21hbGxvYyhuVG90YWxNQiAqIHNpemVvZih0eXBlRENTdG9yZSkpOwogICAgIGlmICh2aWRlby0+cHJlZERDID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnByZWREQywgMCwgblRvdGFsTUIgKiBzaXplb2YodHlwZURDU3RvcmUpKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CICogc2l6ZW9mKHR5cGVEQ1N0b3JlKSk7CiAKICAgICBpZiAobk1CUGVyUm93ID4gSU5UMzJfTUFYIC0gMQpAQCAtNDUwLDYgKzQ2Miw3IEBACiAgICAgfQogICAgIHZpZGVvLT5wcmVkRENBQ19jb2wgPSAodHlwZURDQUNTdG9yZSAqKSBvc2NsX21hbGxvYygobk1CUGVyUm93ICsgMSkgKiBzaXplb2YodHlwZURDQUNTdG9yZSkpOwogICAgIGlmICh2aWRlby0+cHJlZERDQUNfY29sID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnByZWREQ0FDX2NvbCwgMCwgKG5NQlBlclJvdyArIDEpICogc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKChuTUJQZXJSb3cgKyAxKSAqIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7CiAKICAgICAvKiBlbGVtZW50IHplcm8gd2lsbCBiZSB1c2VkIGZvciBzdG9yaW5nIHZlcnRpY2FsIChjb2wpIEFDIGNvZWZmaWNpZW50cyAqLwpAQCAtNDU5LDkgKzQ3MiwxMSBAQAogICAgIC8qIEFsbG9jYXRpbmcgSGVhZGVySW5mbyBzdHJ1Y3R1cmUgJiBRdWFudGl6ZXIgYXJyYXkgKi8KICAgICB2aWRlby0+aGVhZGVySW5mby5Nb2RlID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CKTsKICAgICBpZiAodmlkZW8tPmhlYWRlckluZm8uTW9kZSA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUsIDAsIG5Ub3RhbE1CKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gblRvdGFsTUI7CiAgICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CKTsKICAgICBpZiAodmlkZW8tPmhlYWRlckluZm8uQ0JQID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQgKHZpZGVvLT5oZWFkZXJJbmZvLkNCUCwgMCwgblRvdGFsTUIpOwogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBuVG90YWxNQjsKIAogICAgIGlmICgoc2l6ZV90KW5Ub3RhbE1CID4gU0laRV9NQVggLyBzaXplb2YoaW50MTYpKSB7CkBAIC00NjksNiArNDg0LDcgQEAKICAgICB9CiAgICAgdmlkZW8tPlFQTUIgPSAoaW50MTYgKikgb3NjbF9tYWxsb2MoblRvdGFsTUIgKiBzaXplb2YoaW50MTYpKTsKICAgICBpZiAodmlkZW8tPlFQTUIgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBtZW1zZXQodmlkZW8tPlFQTUIsIDB4MCwgblRvdGFsTUIgKiBzaXplb2YoaW50MTYpKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CICogc2l6ZW9mKGludCkpOwogCiAgICAgLyogQWxsb2NhdGluZyBtYWNyb2Jsb2NrIHNwYWNlICovCkBAIC00ODksOCArNTA1LDEwIEBACiAgICAgfQogICAgIHZpZGVvLT5tb3RYID0gKE1PVCAqKSBvc2NsX21hbGxvYyhzaXplb2YoTU9UKSAqIDQgKiBuVG90YWxNQik7CiAgICAgaWYgKHZpZGVvLT5tb3RYID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2UgbWVtc2V0KHZpZGVvLT5tb3RYLCAwLCBzaXplb2YoTU9UKSAqIDQgKiBuVG90YWxNQik7CiAgICAgdmlkZW8tPm1vdFkgPSAoTU9UICopIG9zY2xfbWFsbG9jKHNpemVvZihNT1QpICogNCAqIG5Ub3RhbE1CKTsKICAgICBpZiAodmlkZW8tPm1vdFkgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBtZW1zZXQodmlkZW8tPm1vdFksIDAsIHNpemVvZihNT1QpICogNCAqIG5Ub3RhbE1CKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKHNpemVvZihNT1QpICogOCAqIG5Ub3RhbE1CKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCmluZGV4IDAwZjJkZDMuLjcxZTExNzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCkBAIC0xNyw3ICsxNyw2IEBACiAjaWZuZGVmIFNPRlRfTVBFRzRfRU5DT0RFUl9IXwogI2RlZmluZSBTT0ZUX01QRUc0X0VOQ09ERVJfSF8KIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSAibXA0ZW5jX2FwaS5oIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAKaW5kZXggNTMxNDljMS4uZWNjMzIxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuY3BwCkBAIC0zNzcsMTUgKzM3NywxNSBAQAogLyogIEluL291dCAgIDogTnIsIEIsIFJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgUmV0dXJuICAgOiBWb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSW5wdXQgYXJndW1lbnQgInZpZGVvIiBpcyBndWFyYW50ZWVkIG5vbi1udWxsIGJ5IGNhbGxlciAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotCiBQVl9TVEFUVVMgUkNfVXBkYXRlQnVmZmVyKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBjdXJyTGF5ZXIsIEludCBudW1fc2tpcCkKIHsKICAgICByYXRlQ29udHJvbCAqcmMgID0gdmlkZW8tPnJjW2N1cnJMYXllcl07CiAgICAgTXVsdGlQYXNzICAgKnBNUCA9IHZpZGVvLT5wTVBbY3VyckxheWVyXTsKIAotICAgIGlmICh2aWRlbyA9PSBOVUxMIHx8IHJjID09IE5VTEwgfHwgcE1QID09IE5VTEwpCisgICAgaWYgKHJjID09IE5VTEwgfHwgcE1QID09IE5VTEwpCiAgICAgICAgIHJldHVybiBQVl9GQUlMOwogCiAgICAgcmMtPlZCVl9mdWxsbmVzcyAgIC09IChJbnQpKHJjLT5iaXRyYXRlIC8gcmMtPmZyYW1lcmF0ZSAqIG51bV9za2lwKTsgLy9yY1tjdXJyTGF5ZXJdLT5ScDsKQEAgLTUyNCw2ICs1MjQsNyBAQAogLyogIEluL291dCAgIDogcmMtPlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBSZXR1cm4gICA6IFZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSW5wdXQgYXJndW1lbnQgImlucHV0IiBpcyBndWFyYW50ZWVkIG5vbi1udWxsIGJ5IGNhbGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKIHZvaWQgdGFyZ2V0Qml0Q2FsY3VsYXRpb24odm9pZCAqaW5wdXQpCkBAIC01MzcsNyArNTM4LDcgQEAKICAgICBJbnQgZGlmZl9jb3VudGVyX0JUc3JjLCBkaWZmX2NvdW50ZXJfQlRkc3QsIHByZXZfY291bnRlcl9kaWZmLCBjdXJyX2NvdW50ZXJfZGlmZiwgYm91bmQ7CiAgICAgLyogQlQgPSBCaXQgVHJhbnNmZXIsIGZvciBwTVAtPmNvdW50ZXJfQlRzcmMsIHBNUC0+Y291bnRlcl9CVGRzdCAqLwogCi0gICAgaWYgKHZpZGVvID09IE5VTEwgfHwgY3VyclZvbCA9PSBOVUxMIHx8IHBNUCA9PSBOVUxMIHx8IHJjID09IE5VTEwpCisgICAgaWYgKGN1cnJWb2wgPT0gTlVMTCB8fCBwTVAgPT0gTlVMTCB8fCByYyA9PSBOVUxMKQogICAgICAgICByZXR1cm47CiAKICAgICAvKiBzb21lIHN0dWZmIGFib3V0IGZyYW1lIGRyb3BwaW5nIHJlbWFpbmVkIGhlcmUgdG8gYmUgZG9uZSBiZWNhdXNlIHBNUCBjYW5ub3QgYmUgaW5zZXJ0ZWQgaW50byB1cGRhdGVSYXRlQ29udHJvbCgpKi8KQEAgLTY5Myw2ICs2OTQsNyBAQAogLyogIEluL291dCAgIDogcmMtPlQgYW5kIHJjLT5RYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBSZXR1cm4gICA6IFZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIElucHV0IGFyZ3VtZW50ICJpbnB1dCIgaXMgZ3VhcmFudGVlZCBub24tbnVsbCBieSBjYWxsZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKIC8qIE1hZCBiYXNlZCB2YXJpYWJsZSBiaXQgYWxsb2NhdGlvbiArIFFQIGNhbGN1bGF0aW9uIHdpdGggYSBuZXcgcXVhZHJhdGljIG1ldGhvZCAqLwpAQCAtNzA4LDcgKzcxMCw3IEBACiAgICAgZmxvYXQgY3Vycl9tYWQsIHByZXZfbWFkLCBjdXJyX1JELCBwcmV2X1JELCBhdmVyYWdlX21hZCwgYXZlcl9RUDsKIAogCi0gICAgaWYgKHZpZGVvID09IE5VTEwgfHwgY3VyclZvbCA9PSBOVUxMIHx8IHBNUCA9PSBOVUxMIHx8IHJjID09IE5VTEwpCisgICAgaWYgKGN1cnJWb2wgPT0gTlVMTCB8fCBwTVAgPT0gTlVMTCB8fCByYyA9PSBOVUxMKQogICAgICAgICByZXR1cm47CiAKICAgICAvKiBNYWQgYmFzZWQgdmFyaWFibGUgYml0IGFsbG9jYXRpb24gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCmluZGV4IGU3ZDMwNWQuLjgwMDgzZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcApAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgbUNvbmZpZy0+Y3JjRW5hYmxlZCA9IGZhbHNlOwogCiAgICAgdWludDMyX3QgbWVtUmVxdWlyZW1lbnRzID0gcHZtcDNfZGVjb2Rlck1lbVJlcXVpcmVtZW50cygpOwotICAgIG1EZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcXVpcmVtZW50cyk7CisgICAgbURlY29kZXJCdWYgPSBjYWxsb2MoMSwgbWVtUmVxdWlyZW1lbnRzKTsKIAogICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKICAgICBtSXNGaXJzdCA9IHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCmluZGV4IDNkZjRkNGMuLmM2NTU1NDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCkBAIC0xLDkgKzEsNiBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X21wZWcyZGVjIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAogCiAgICAgc3RhdGljX2xpYnM6IFsibGlibXBlZzJkZWMiXSwKICAgICBzcmNzOiBbIlNvZnRNUEVHMi5jcHAiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKaW5kZXggOGQ1ZjNlNy4uMGYyZmYxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKQEAgLTMzLDYgKzMzLDcgQEAKICAgICB7IE9NWF9WSURFT19WUDlQcm9maWxlMCwgT01YX1ZJREVPX1ZQOUxldmVsNSB9LAogICAgIHsgT01YX1ZJREVPX1ZQOVByb2ZpbGUyLCBPTVhfVklERU9fVlA5TGV2ZWw1IH0sCiAgICAgeyBPTVhfVklERU9fVlA5UHJvZmlsZTJIRFIsIE9NWF9WSURFT19WUDlMZXZlbDUgfSwKKyAgICB7IE9NWF9WSURFT19WUDlQcm9maWxlMkhEUjEwUGx1cywgT01YX1ZJREVPX1ZQOUxldmVsNSB9LAogfTsKIAogU29mdFZQWDo6U29mdFZQWCgKQEAgLTg0LDYgKzg1LDEwIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgU29mdFZQWDo6c3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpIHsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogc3RhdHVzX3QgU29mdFZQWDo6aW5pdERlY29kZXIoKSB7CiAgICAgbUN0eCA9IG5ldyB2cHhfY29kZWNfY3R4X3Q7CiAgICAgdnB4X2NvZGVjX2Vycl90IHZweF9lcnI7CkBAIC0xNjcsNyArMTcyLDEyIEBACiAgICAgICAgIG91dEhlYWRlci0+bk9mZnNldCA9IDA7CiAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG91dHB1dEJ1ZmZlcldpZHRoKCkgKiBvdXRwdXRCdWZmZXJIZWlnaHQoKSAqIGJwcCAqIDMpIC8gMjsKLSAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gKihPTVhfVElDS1MgKiltSW1nLT51c2VyX3ByaXY7CisgICAgICAgIFByaXZJbmZvICpwcml2SW5mbyA9IChQcml2SW5mbyAqKW1JbWctPnVzZXJfcHJpdjsKKyAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gcHJpdkluZm8tPm1UaW1lU3RhbXA7CisgICAgICAgIGlmIChwcml2SW5mby0+bUhkcjEwUGx1c0luZm8gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcXVldWVPdXRwdXRGcmFtZUNvbmZpZyhwcml2SW5mby0+bUhkcjEwUGx1c0luZm8pOworICAgICAgICB9CisKICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlclNhZmUob3V0SGVhZGVyKSkgewogICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gb3V0SGVhZGVyLT5wQnVmZmVyOwogICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopbUltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXTsKQEAgLTI3NSw3ICsyODUsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIG1UaW1lU3RhbXBzW21UaW1lU3RhbXBJZHhdID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgIG1Qcml2SW5mb1ttVGltZVN0YW1wSWR4XS5tVGltZVN0YW1wID0gaW5IZWFkZXItPm5UaW1lU3RhbXA7CisKKyAgICAgICAgaWYgKGluSW5mby0+bUZyYW1lQ29uZmlnKSB7CisgICAgICAgICAgICBtUHJpdkluZm9bbVRpbWVTdGFtcElkeF0ubUhkcjEwUGx1c0luZm8gPSBkZXF1ZXVlSW5wdXRGcmFtZUNvbmZpZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVByaXZJbmZvW21UaW1lU3RhbXBJZHhdLm1IZHIxMFBsdXNJbmZvLmNsZWFyKCk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgewogICAgICAgICAgICAgbUVPU1N0YXR1cyA9IElOUFVUX0VPU19TRUVOOwpAQCAtMjg1LDcgKzMwMSw3IEBACiAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA+IDApIHsKICAgICAgICAgICAgIHZweF9jb2RlY19lcnJfdCBlcnIgPSB2cHhfY29kZWNfZGVjb2RlKAogICAgICAgICAgICAgICAgICAgICAodnB4X2NvZGVjX2N0eF90ICopbUN0eCwgaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4sICZtVGltZVN0YW1wc1ttVGltZVN0YW1wSWR4XSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuLCAmbVByaXZJbmZvW21UaW1lU3RhbXBJZHhdLCAwKTsKICAgICAgICAgICAgIGlmIChlcnIgPT0gVlBYX0NPREVDX09LKSB7CiAgICAgICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCmluZGV4IGI2MmI1MjYuLjBhYThlOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKQEAgLTI2LDYgKzI2LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgQUJ1ZmZlcjsKKwogc3RydWN0IFNvZnRWUFggOiBwdWJsaWMgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudCB7CiAgICAgU29mdFZQWChjb25zdCBjaGFyICpuYW1lLAogICAgICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50Um9sZSwKQEAgLTQxLDYgKzQzLDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25Qb3J0Rmx1c2hDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgpOwogICAgIHZpcnR1YWwgdm9pZCBvblJlc2V0KCk7CiAgICAgdmlydHVhbCBib29sIHN1cHBvcnREZXNjcmliZUhkclN0YXRpY0luZm8oKTsKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpOwogCiBwcml2YXRlOgogICAgIGVudW0gewpAQCAtNjAsNyArNjMsMTEgQEAKIAogICAgIHZvaWQgKm1DdHg7CiAgICAgYm9vbCBtRnJhbWVQYXJhbGxlbE1vZGU7ICAvLyBGcmFtZSBwYXJhbGxlbCBpcyBvbmx5IHN1cHBvcnRlZCBieSBWUDkgZGVjb2Rlci4KLSAgICBPTVhfVElDS1MgbVRpbWVTdGFtcHNba051bUJ1ZmZlcnNdOworICAgIHN0cnVjdCBQcml2SW5mbyB7CisgICAgICAgIE9NWF9USUNLUyBtVGltZVN0YW1wOworICAgICAgICBzcDxBQnVmZmVyPiBtSGRyMTBQbHVzSW5mbzsKKyAgICB9OworICAgIFByaXZJbmZvIG1Qcml2SW5mb1trTnVtQnVmZmVyc107CiAgICAgdWludDhfdCBtVGltZVN0YW1wSWR4OwogICAgIHZweF9pbWFnZV90ICptSW1nOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKaW5kZXggMmRmYmExMy4uZDBjYjA3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcApAQCAtNDAxLDggKzQwMSw4IEBACiAgICAgfQogfQogCi1PTVhfRVJST1JUWVBFIFNvZnRWUFhFbmNvZGVyOjpzZXRDb25maWcoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcykgeworT01YX0VSUk9SVFlQRSBTb2Z0VlBYRW5jb2Rlcjo6aW50ZXJuYWxTZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CiAgICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYVZPUFJlZnJlc2g6CiAgICAgICAgIHsKQEAgLTQ0Miw3ICs0NDIsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpzZXRDb25maWcoaW5kZXgsIF9wYXJhbXMpOworICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0Q29uZmlnKGluZGV4LCBfcGFyYW1zLCBmcmFtZUNvbmZpZyk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaAppbmRleCBkZDg2ZDM2Li4yNjNkMTM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmgKQEAgLTg0LDggKzg0LDggQEAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtKTsKIAotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBzZXRDb25maWcoCi0gICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0Q29uZmlnKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKTsKIAogICAgIC8vIE9NWCBjYWxsYmFjayB3aGVuIGJ1ZmZlcnMgYXZhaWxhYmxlCiAgICAgLy8gTm90ZSB0aGF0IGJvdGggYW4gaW5wdXQgYW5kIG91dHB1dCBidWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCmluZGV4IGQ0MGY1MjUuLjRmNjFhYTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcApAQCAtNDMwLDggKzQzMCwxNyBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKHNpemUgPCBzaXplb2YoaW50NjRfdCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgMm5kIGFuZCAzcmQgaW5wdXQgYnVmZmVyIGFyZSBleHBlY3RlZCB0byBjb250YWluCisgICAgICAgICAgICAgICAgLy8gIGFuIGludDY0X3QgKHNlZSBiZWxvdyksIHNvIG1ha2Ugc3VyZSB3ZSBnZXQgYXQgbGVhc3QKKyAgICAgICAgICAgICAgICAvLyAgdGhhdCBtdWNoLiBUaGUgZmlyc3QgaW5wdXQgYnVmZmVyIG11c3QgY29udGFpbiAxOSBieXRlcywKKyAgICAgICAgICAgICAgICAvLyAgYnV0IHRoYXQgaXMgY2hlY2tlZCBhbHJlYWR5LgorICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobUhlYWRlciA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgbUhlYWRlcjsKICAgICAgICAgICAgICAgICBtSGVhZGVyID0gbmV3IE9wdXNIZWFkZXIoKTsKICAgICAgICAgICAgICAgICBtZW1zZXQobUhlYWRlciwgMCwgc2l6ZW9mKCptSGVhZGVyKSk7CiAgICAgICAgICAgICAgICAgaWYgKCFQYXJzZU9wdXNIZWFkZXIoZGF0YSwgc2l6ZSwgbUhlYWRlcikpIHsKQEAgLTQ1Miw2ICs0NjEsOSBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGludCBzdGF0dXMgPSBPUFVTX0lOVkFMSURfU1RBVEU7CisgICAgICAgICAgICAgICAgaWYgKG1EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2Rlc3Ryb3kobURlY29kZXIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtRGVjb2RlciA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUoa1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPmNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLT5udW1fc3RyZWFtcywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmNwcAppbmRleCBiOTliY2Q4Li5kYTg2NzU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuY3BwCkBAIC03OSw3ICs3OSw3IEBACiAKIHN0YXRpYyBjb25zdCBPTVhfVTMyIGtTdXBwb3J0ZWRQcm9maWxlc1tdID0gewogICAgIE9NWF9BVURJT19BQUNPYmplY3RMQywgT01YX0FVRElPX0FBQ09iamVjdEhFLCAgT01YX0FVRElPX0FBQ09iamVjdEhFX1BTLAotICAgIE9NWF9BVURJT19BQUNPYmplY3RMRCwgT01YX0FVRElPX0FBQ09iamVjdEVMRCwKKyAgICBPTVhfQVVESU9fQUFDT2JqZWN0TEQsIE9NWF9BVURJT19BQUNPYmplY3RFTEQsIE9NWF9BVURJT19BQUNPYmplY3RYSEUKIH07CiAKIFNvZnRYQUFDOjpTb2Z0WEFBQyhjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFKiBjYWxsYmFja3MsIE9NWF9QVFIgYXBwRGF0YSwKQEAgLTExMCwxNSArMTEwLDIyIEBACiAKIHsKICAgICBpbml0UG9ydHMoKTsKLSAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworICAgIG1NZW1vcnlWZWMuY2xlYXIoKTsKKyAgICBtRHJjTWVtb3J5VmVjLmNsZWFyKCk7CisKKyAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCBJQV9OT19FUlJPUik7CiB9CiAKIFNvZnRYQUFDOjp+U29mdFhBQUMoKSB7Ci0gICAgaW50IGVyckNvZGUgPSBkZUluaXRYQUFDRGVjb2RlcigpOwotICAgIGlmICgwICE9IGVyckNvZGUpIHsKLSAgICAgICAgQUxPR0UoImRlSW5pdFhBQUNEZWNvZGVyKCkgZmFpbGVkICVkIiwgZXJyQ29kZSk7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyX2NvZGUpIHsKKyAgICAgICAgQUxPR0UoImRlSW5pdFhBQUNEZWNvZGVyKCkgZmFpbGVkICVkIiwgZXJyX2NvZGUpOwogICAgIH0KIAorICAgIGVycl9jb2RlID0gZGVJbml0TVBFR0RERHJjKCk7CisgICAgaWYgKElBX05PX0VSUk9SICE9IGVycl9jb2RlKSB7CisgICAgICAgIEFMT0dFKCJkZUluaXRNUEVHREREcmMoKSBmYWlsZWQgJWQiLCBlcnJfY29kZSk7CisgICAgfQogICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgICBtSXNDb2RlY0NvbmZpZ0ZsdXNoUmVxdWlyZWQgPSBmYWxzZTsKIH0KQEAgLTE2NCwzNiArMTcxLDE2IEBACiAgICAgYWRkUG9ydChkZWYpOwogfQogCi1zdGF0dXNfdCBTb2Z0WEFBQzo6aW5pdERlY29kZXIoKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKLQorSUFfRVJST1JDT0RFIFNvZnRYQUFDOjppbml0RGVjb2RlcigpIHsKICAgICBpbnQgdWlfZHJjX3ZhbDsKICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKICAgICBpbnQgbG9vcCA9IDA7CiAKICAgICBlcnJfY29kZSA9IGluaXRYQUFDRGVjb2RlcigpOwogICAgIGlmIChlcnJfY29kZSAhPSBJQV9OT19FUlJPUikgewotICAgICAgICBpZiAoTlVMTCA9PSBtWGhlYWFjQ29kZWNIYW5kbGUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJBQUMgZGVjb2RlciBoYW5kbGUgaXMgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChOVUxMID09IG1NcGVnRERyY0hhbmRsZSkgewotICAgICAgICAgICAgQUxPR0UoIk1QRUctRCBEUkMgZGVjb2RlciBoYW5kbGUgaXMgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAobG9vcCA9IDE7IGxvb3AgPCBtTWFsbG9jQ291bnQ7IGxvb3ArKykgewotICAgICAgICAgICAgaWYgKG1NZW1vcnlBcnJheVtsb29wXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciAlZFxuIiwgbG9vcCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR0UoImluaXRYQUFDRGVjb2RlciBGYWlsZWQiKTsKLQotICAgICAgICBmb3IgKGxvb3AgPSAwOyBsb29wIDwgbU1hbGxvY0NvdW50OyBsb29wKyspIHsKLSAgICAgICAgICAgIGlmIChtTWVtb3J5QXJyYXlbbG9vcF0pIGZyZWUobU1lbW9yeUFycmF5W2xvb3BdKTsKLSAgICAgICAgfQotICAgICAgICBtTWFsbG9jQ291bnQgPSAwOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1cyA9IE9LOworICAgICAgICBBTE9HRSgiaW5pdFhBQUNEZWNvZGVyIGZhaWxlZCB3aXRoIGVycm9yICVkIiwgZXJyX2NvZGUpOworICAgICAgICBkZUluaXRYQUFDRGVjb2RlcigpOworICAgICAgICByZXR1cm4gZXJyX2NvZGU7CiAgICAgfQogCiAgICAgbUVuZE9mSW5wdXQgPSBmYWxzZTsKQEAgLTI3NCw3ICsyNjEsNyBAQAogICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0RSQ19FRkZFQ1RfVFlQRSIpOwogCiAjZW5kaWYKLSAgICByZXR1cm4gc3RhdHVzOworICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KIAogT01YX0VSUk9SVFlQRSBTb2Z0WEFBQzo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKQEAgLTU0Nyw5ICs1MzQsNiBAQAogICAgIC8qIHNhbXBsZSBjdXJyZW50bHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgaWYgKG1Jc0NvZGVjSW5pdGlhbGl6ZWQpIHsKICAgICAgICAgbnVtT3V0Qnl0ZXMgPSBtT3V0cHV0RnJhbWVMZW5ndGggKiAobVBjbVdkU3ogLyA4KSAqIG1OdW1DaGFubmVsczsKLSAgICAgICAgaWYgKChtUGNtV2RTeiAvIDgpICE9IDIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJYQUFDIGFzc3VtZXMgMiBieXRlcyBwZXIgc2FtcGxlISBtUGNtV2RTeiAlZCIsIG1QY21XZFN6KTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIHdoaWxlICgoIWluUXVldWUuZW1wdHkoKSB8fCBtRW5kT2ZJbnB1dCkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKQEAgLTU2OSw4ICs1NTMsOCBAQAogICAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoID0gaW5IZWFkZXItPm5GaWxsZWRMZW47CiAKICAgICAgICAgICAgICAgICAvKiBHQSBoZWFkZXIgY29uZmlndXJhdGlvbiBzZW50IHRvIERlY29kZXIhICovCi0gICAgICAgICAgICAgICAgaW50IGVycl9jb2RlID0gY29uZmlnWEFBQ0RlY29kZXIoaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpZiAoMCAhPSBlcnJfY29kZSkgeworICAgICAgICAgICAgICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGNvbmZpZ1hBQUNEZWNvZGVyKGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKElBX05PX0VSUk9SICE9IGVycl9jb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb25maWdYQUFDRGVjb2RlciBlcnJfY29kZSA9ICVkIiwgZXJyX2NvZGUpOwogICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgZXJyX2NvZGUsIE5VTEwpOwpAQCAtNjgyLDggKzY2Niw4IEBACiAgICAgICAgICAgICAvKiB3aGljaCBzaG91bGQgaW5pdGlhbGl6ZSB0aGUgY29kZWMuIE9uY2UgdGhpcyBzdGF0ZSBpcyByZWFjaGVkLCBjYWxsIHRoZSAgKi8KICAgICAgICAgICAgIC8qIGRlY29kZVhBQUNTdHJlYW0gQVBJIHdpdGggc2FtZSBmcmFtZSB0byBkZWNvZGUhICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGlmICghbUlzQ29kZWNJbml0aWFsaXplZCkgewotICAgICAgICAgICAgICAgIGludCBlcnJfY29kZSA9IGNvbmZpZ1hBQUNEZWNvZGVyKGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKDAgIT0gZXJyX2NvZGUpIHsKKyAgICAgICAgICAgICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBjb25maWdYQUFDRGVjb2RlcihpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJfY29kZSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiY29uZmlnWEFBQ0RlY29kZXIgRmFpbGVkIDIgZXJyX2NvZGUgPSAlZCIsIGVycl9jb2RlKTsKICAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGVycl9jb2RlLCBOVUxMKTsKQEAgLTg0NSw3ICs4MjksNyBAQAogICAgIH0KIH0KIAotaW50IFNvZnRYQUFDOjpjb25maWdmbHVzaERlY29kZSgpIHsKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6Y29uZmlnZmx1c2hEZWNvZGUoKSB7CiAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlOwogICAgIFVXT1JEMzIgdWlfaW5pdF9kb25lOwogICAgIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoID0gODIwMzsKQEAgLTg3MSwxNiArODU1LDEzIEBACiAgICAgICAgICAgICAiRm91bmQgQ29kZWMgd2l0aCBiZWxvdyBjb25maWctLS1cbnNhbXBGcmVxICVkXG5udW1DaGFubmVscyAlZFxucGNtV2RTeiAiCiAgICAgICAgICAgICAiJWRcbmNoYW5uZWxNYXNrICVkXG5vdXRwdXRGcmFtZUxlbmd0aCAlZCIsCiAgICAgICAgICAgICBtU2FtcEZyZXEsIG1OdW1DaGFubmVscywgbVBjbVdkU3osIG1DaGFubmVsTWFzaywgbU91dHB1dEZyYW1lTGVuZ3RoKTsKLSAgICAgICAgaWYgKG1OdW1DaGFubmVscyA+IE1BWF9DSEFOTkVMX0NPVU5UKSB7Ci0gICAgICAgICAgICBBTE9HRSgiIE5vIG9mIGNoYW5uZWxzIGFyZSBtb3JlIHRoYW4gbWF4IGNoYW5uZWxzXG4iKTsKLSAgICAgICAgICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gdHJ1ZTsKKworICAgICAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gdHJ1ZTsKICAgICB9Ci0gICAgcmV0dXJuIGVycl9jb2RlOworICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KLWludCBTb2Z0WEFBQzo6ZHJhaW5EZWNvZGVyKCkgewotICAgIHJldHVybiAwOworSUFfRVJST1JDT0RFIFNvZnRYQUFDOjpkcmFpbkRlY29kZXIoKSB7CisgICAgcmV0dXJuIElBX05PX0VSUk9SOwogfQogCiB2b2lkIFNvZnRYQUFDOjpvblJlc2V0KCkgewpAQCAtOTIxLDcgKzkwMiw3IEBACiAgICAgfQogfQogCi1pbnQgU29mdFhBQUM6OmluaXRYQUFDRGVjb2RlcigpIHsKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6aW5pdFhBQUNEZWNvZGVyKCkgewogICAgIExPT1BJRFggaTsKIAogICAgIC8qIEVycm9yIGNvZGUgKi8KQEAgLTkzOSwxMSArOTIwLDExIEBACiAgICAgVVdPUkQzMiB1aV9wcm9jX21lbV90YWJzX3NpemU7CiAgICAgLyogQVBJIHNpemUgKi8KICAgICBVV09SRDMyIHB1aV9hcGlfc2l6ZTsKKyAgICBwVk9JRCBwdl9hbGxvY19wdHI7CiAKICAgICBtSW5wdXRCdWZmZXJTaXplID0gMDsKICAgICBtSW5wdXRCdWZmZXIgPSAwOwogICAgIG1PdXRwdXRCdWZmZXIgPSAwOwotICAgIG1NYWxsb2NDb3VudCA9IDA7CiAKICAgICAvKiBQcm9jZXNzIHN0cnVjdCBpbml0aW5nIGVuZCAqLwogICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTk1NCwyMCArOTM1LDEzIEBACiAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKE5VTEwsIElBX0FQSV9DTURfR0VUX0FQSV9TSVpFLCAwLCAmcHVpX2FwaV9zaXplKTsKICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9BUElfU0laRSIpOwogCi0gICAgaWYgKG1NYWxsb2NDb3VudCA9PSBNQVhfTUVNX0FMTE9DUykgewotICAgICAgICBBTE9HRSgibU1lbW9yeUFycmF5IGlzIGZ1bGwiKTsKLSAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgIH0KLQogICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgQVBJICovCi0gICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbig0LCBwdWlfYXBpX3NpemUpOwotICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7CisgICAgbVhoZWFhY0NvZGVjSGFuZGxlID0gbWVtYWxpZ24oNCwgcHVpX2FwaV9zaXplKTsKKyAgICBpZiAobVhoZWFhY0NvZGVjSGFuZGxlID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIm1hbGxvYyBmb3IgcHVpX2FwaV9zaXplICsgNCA+PiAlZCBGYWlsZWQiLCBwdWlfYXBpX3NpemUgKyA0KTsKICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwogICAgIH0KLSAgICAvKiBTZXQgQVBJIG9iamVjdCB3aXRoIHRoZSBtZW1vcnkgYWxsb2NhdGVkICovCi0gICAgbVhoZWFhY0NvZGVjSGFuZGxlID0gKHBWT0lEKSgoV09SRDgqKW1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdKTsKLSAgICBtTWFsbG9jQ291bnQrKzsKKyAgICBtTWVtb3J5VmVjLnB1c2gobVhoZWFhY0NvZGVjSGFuZGxlKTsKIAogICAgIC8qIFNldCB0aGUgY29uZmlnIHBhcmFtcyB0byBkZWZhdWx0IHZhbHVlcyAqLwogICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKQEAgLTk3OSwyMyArOTUzLDE2IEBACiAKICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9BUElfU0laRSIpOwogCi0gICAgaWYgKG1NYWxsb2NDb3VudCA9PSBNQVhfTUVNX0FMTE9DUykgewotICAgICAgICBBTE9HRSgibU1lbW9yeUFycmF5IGlzIGZ1bGwiKTsKLSAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgIH0KLQogICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgQVBJICovCi0gICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbig0LCBwdWlfYXBpX3NpemUpOworICAgIG1NcGVnRERyY0hhbmRsZSA9IG1lbWFsaWduKDQsIHB1aV9hcGlfc2l6ZSk7CiAKLSAgICBpZiAobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkgeworICAgIGlmIChtTXBlZ0REcmNIYW5kbGUgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgibWFsbG9jIGZvciBkcmMgYXBpIHN0cnVjdHVyZSBGYWlsZWQiKTsKICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwogICAgIH0KLSAgICBtZW1zZXQobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0sIDAsIHB1aV9hcGlfc2l6ZSk7CisgICAgbU1lbW9yeVZlYy5wdXNoKG1NcGVnRERyY0hhbmRsZSk7CiAKLSAgICAvKiBTZXQgQVBJIG9iamVjdCB3aXRoIHRoZSBtZW1vcnkgYWxsb2NhdGVkICovCi0gICAgbU1wZWdERHJjSGFuZGxlID0gKHBWT0lEKSgoV09SRDgqKW1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdKTsKLSAgICBtTWFsbG9jQ291bnQrKzsKKyAgICBtZW1zZXQobU1wZWdERHJjSGFuZGxlLCAwLCBwdWlfYXBpX3NpemUpOwogCiAgICAgLyogU2V0IHRoZSBjb25maWcgcGFyYW1zIHRvIGRlZmF1bHQgdmFsdWVzICovCiAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKQEAgLTEwMjEsMjMgKzk4OCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfcHJvY19tZW1fdGFic19zaXplKTsKICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1UQUJTX1NJWkUiKTsKIAotICAgIGlmIChtTWFsbG9jQ291bnQgPT0gTUFYX01FTV9BTExPQ1MpIHsKLSAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICB9Ci0KLSAgICBtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9IG1lbWFsaWduKDQsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7Ci0gICAgaWYgKG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID09IE5VTEwpIHsKKyAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbig0LCB1aV9wcm9jX21lbV90YWJzX3NpemUpOworICAgIGlmIChwdl9hbGxvY19wdHIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiTWFsbG9jIGZvciBzaXplICh1aV9wcm9jX21lbV90YWJzX3NpemUgKyA0KSA9ICVkIGZhaWxlZCEiLAogICAgICAgICAgICAgICB1aV9wcm9jX21lbV90YWJzX3NpemUgKyA0KTsKICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwogICAgIH0KLSAgICBtTWFsbG9jQ291bnQrKzsKLSAgICAvKiBTZXQgcG9pbnRlciBmb3IgcHJvY2VzcyBtZW1vcnkgdGFibGVzICAgICovCi0gICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNVEFCU19QVFIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwVk9JRCkoKFdPUkQ4KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50IC0gMV0pKTsKLSAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiIpOworICAgIG1NZW1vcnlWZWMucHVzaChwdl9hbGxvY19wdHIpOwogCisgICAgLyogU2V0IHBvaW50ZXIgZm9yIHByb2Nlc3MgbWVtb3J5IHRhYmxlcyAgICAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSLCAwLCBwdl9hbGxvY19wdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSIik7CiAKICAgICAvKiBpbml0aWFsaXplIHRoZSBBUEksIHBvc3QgY29uZmlnLCBmaWxsIG1lbW9yeSB0YWJsZXMgICovCiAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULApAQCAtMTA2NiwxNyArMTAyNywxMiBAQAogICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFLCBpLCAmdWlfdHlwZSk7CiAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUiKTsKIAotICAgICAgICBpZiAobU1hbGxvY0NvdW50ID09IE1BWF9NRU1fQUxMT0NTKSB7Ci0gICAgICAgICAgICBBTE9HRSgibU1lbW9yeUFycmF5IGlzIGZ1bGwiKTsKLSAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9IG1lbWFsaWduKHVpX2FsaWdubWVudCwgdWlfc2l6ZSk7Ci0gICAgICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7CisgICAgICAgIHB2X2FsbG9jX3B0ciA9IG1lbWFsaWduKHVpX2FsaWdubWVudCwgdWlfc2l6ZSk7CisgICAgICAgIGlmIChwdl9hbGxvY19wdHIgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoIk1hbGxvYyBmb3Igc2l6ZSAodWlfc2l6ZSArIHVpX2FsaWdubWVudCkgPSAlZCBmYWlsZWQhIiwgdWlfc2l6ZSArIHVpX2FsaWdubWVudCk7CiAgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CiAgICAgICAgIH0KLSAgICAgICAgcHZfYWxsb2NfcHRyID0gKHBWT0lEKSgoV09SRDgqKW1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdKTsKLSAgICAgICAgbU1hbGxvY0NvdW50Kys7CisgICAgICAgIG1NZW1vcnlWZWMucHVzaChwdl9hbGxvY19wdHIpOwogCiAgICAgICAgIC8qIFNldCB0aGUgYnVmZmVyIHBvaW50ZXIgKi8KICAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgaSwgcHZfYWxsb2NfcHRyKTsKQEAgLTEwOTUsNyArMTA1MSw3IEBACiAgICAgcmV0dXJuIElBX05PX0VSUk9SOwogfQogCi1pbnQgU29mdFhBQUM6OmNvbmZpZ1hBQUNEZWNvZGVyKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCkgeworSUFfRVJST1JDT0RFIFNvZnRYQUFDOjpjb25maWdYQUFDRGVjb2Rlcih1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgpIHsKICAgICBVV09SRDMyIHVpX2luaXRfZG9uZTsKICAgICBpbnQzMl90IGlfYnl0ZXNfY29uc3VtZWQ7CiAKQEAgLTExNTQsMTQgKzExMTAsNzYgQEAKIAogICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KLWludCBTb2Z0WEFBQzo6Y29uZmlnTVBFR0REcmMoKSB7CitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmluaXRNUEVHREREcmMoKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgKFdPUkQzMikyOyBpKyspIHsKKyAgICAgICAgV09SRDMyIHVpX3NpemUsIHVpX2FsaWdubWVudCwgdWlfdHlwZTsKKyAgICAgICAgcFZPSUQgcHZfYWxsb2NfcHRyOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgc2l6ZSAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSwgaSwgJnVpX3NpemUpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUiKTsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IGFsaWdubWVudCAqLworICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX0FMSUdOTUVOVCwgaSwgJnVpX2FsaWdubWVudCk7CisKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5UIik7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSB0eXBlICovCisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFLCBpLCAmdWlfdHlwZSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUiKTsKKworICAgICAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbig0LCB1aV9zaXplKTsKKyAgICAgICAgaWYgKHB2X2FsbG9jX3B0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtRHJjTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKKworICAgICAgICAvKiBTZXQgdGhlIGJ1ZmZlciBwb2ludGVyICovCisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCBpLCBwdl9hbGxvY19wdHIpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKyAgICB9CisKKyAgICBXT1JEMzIgdWlfc2l6ZTsKKyAgICB1aV9zaXplID0gODE5MiAqIDI7CisKKyAgICBtRHJjSW5CdWYgPSAoaW50OF90KiltZW1hbGlnbig0LCB1aV9zaXplKTsKKyAgICBpZiAobURyY0luQnVmID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbURyY01lbW9yeVZlYy5wdXNoKG1EcmNJbkJ1Zik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgMiwgbURyY0luQnVmKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisKKyAgICBtRHJjT3V0QnVmID0gKGludDhfdCopbWVtYWxpZ24oNCwgdWlfc2l6ZSk7CisgICAgaWYgKG1EcmNPdXRCdWYgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKyAgICBtRHJjTWVtb3J5VmVjLnB1c2gobURyY091dEJ1Zik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgMywgbURyY091dEJ1Zik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorSUFfRVJST1JDT0RFIFNvZnRYQUFDOjpjb25maWdNUEVHRERyYygpIHsKICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKICAgICBpbnQgaV9lZmZlY3RfdHlwZTsKICAgICBpbnQgaV9sb3VkX25vcm07CiAgICAgaW50IGlfdGFyZ2V0X2xvdWRuZXNzOwogICAgIHVuc2lnbmVkIGludCBpX3Nicl9tb2RlOwotICAgIGludCBuX21lbXM7CiAgICAgaW50IGk7CisgICAgaW50IHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSA9IDA7CisgICAgcFZPSUQgcHZfYWxsb2NfcHRyID0gTlVMTDsKIAogI2lmZGVmIEVOQUJMRV9NUEVHX0RfRFJDCiAgICAgewpAQCAtMTIxMiw4MyArMTIzMCw0NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFLCAmaV9zYnJfbW9kZSk7CiAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9TQlJfTU9ERSIpOwogCisgICAgICAgIC8qIEdldCBtZW1vcnkgaW5mbyB0YWJsZXMgc2l6ZSAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNVEFCU19TSVpFLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9wcm9jX21lbV90YWJzX3NpemUpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTVRBQlNfU0laRSIpOworCisgICAgICAgIHB2X2FsbG9jX3B0ciA9IG1lbWFsaWduKDQsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisKKyAgICAgICAgaWYgKHB2X2FsbG9jX3B0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQocHZfYWxsb2NfcHRyLCAwLCB1aV9wcm9jX21lbV90YWJzX3NpemUpOworCisgICAgICAgIG1NZW1vcnlWZWMucHVzaChwdl9hbGxvY19wdHIpOworCisgICAgICAgIC8qIFNldCBwb2ludGVyIGZvciBwcm9jZXNzIG1lbW9yeSB0YWJsZXMgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2X2FsbG9jX3B0cik7CisKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNVEFCU19QVFIiKTsKKwogICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUywgTlVMTCk7CiAKICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9BUElfUE9TVF9DT05GSUdfUEFSQU1TIik7CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IChXT1JEMzIpMjsgaSsrKSB7Ci0gICAgICAgICAgICBXT1JEMzIgdWlfc2l6ZSwgdWlfYWxpZ25tZW50LCB1aV90eXBlOwotICAgICAgICAgICAgcFZPSUQgcHZfYWxsb2NfcHRyOworICAgICAgICAvKiBGcmVlIGFueSBtZW1vcnkgdGhhdCBpcyBhbGxvY2F0ZWQgZm9yIE1QRUcgRCBEcmMgc28gZmFyICovCisgICAgICAgIGRlSW5pdE1QRUdERERyYygpOwogCi0gICAgICAgICAgICAvKiBHZXQgbWVtb3J5IHNpemUgKi8KLSAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19TSVpFLCBpLCAmdWlfc2l6ZSk7Ci0KLSAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUiKTsKLQotICAgICAgICAgICAgLyogR2V0IG1lbW9yeSBhbGlnbm1lbnQgKi8KLSAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQsIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9hbGlnbm1lbnQpOwotCi0gICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQiKTsKLQotICAgICAgICAgICAgLyogR2V0IG1lbW9yeSB0eXBlICovCi0gICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSwgaSwgJnVpX3R5cGUpOwotICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSIpOwotICAgICAgICAgICAgaWYgKG1NYWxsb2NDb3VudCA9PSBNQVhfTUVNX0FMTE9DUykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJtTWVtb3J5QXJyYXkgaXMgZnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbig0LCB1aV9zaXplKTsKLSAgICAgICAgICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHZfYWxsb2NfcHRyID0gKHBWT0lEKSgoV09SRDgqKW1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdKTsKLSAgICAgICAgICAgIG1NYWxsb2NDb3VudCsrOwotCi0gICAgICAgICAgICAvKiBTZXQgdGhlIGJ1ZmZlciBwb2ludGVyICovCi0gICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgaSwgcHZfYWxsb2NfcHRyKTsKLQotICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOworICAgICAgICBlcnJfY29kZSA9IGluaXRNUEVHREREcmMoKTsKKyAgICAgICAgaWYgKGVycl9jb2RlICE9IElBX05PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiaW5pdE1QRUdERERyYyBmYWlsZWQgd2l0aCBlcnJvciAlZCIsIGVycl9jb2RlKTsKKyAgICAgICAgICAgIGRlSW5pdE1QRUdERERyYygpOworICAgICAgICAgICAgcmV0dXJuIGVycl9jb2RlOwogICAgICAgICB9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFdPUkQzMiB1aV9zaXplOwotICAgICAgICAgICAgdWlfc2l6ZSA9IDgxOTIgKiAyOwotICAgICAgICAgICAgaWYgKG1NYWxsb2NDb3VudCA9PSBNQVhfTUVNX0FMTE9DUykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJtTWVtb3J5QXJyYXkgaXMgZnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbig0LCB1aV9zaXplKTsKLSAgICAgICAgICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRHJjSW5CdWYgPSAoaW50OF90KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XTsKLSAgICAgICAgICAgIG1NYWxsb2NDb3VudCsrOwotICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbU91dHB1dEJ1ZmZlciovIG1EcmNJbkJ1Zik7Ci0gICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7Ci0KLSAgICAgICAgICAgIGlmIChtTWFsbG9jQ291bnQgPT0gTUFYX01FTV9BTExPQ1MpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibU1lbW9yeUFycmF5IGlzIGZ1bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9IG1lbWFsaWduKDQsIHVpX3NpemUpOwotICAgICAgICAgICAgaWYgKG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EcmNPdXRCdWYgPSAoaW50OF90KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XTsKLSAgICAgICAgICAgIG1NYWxsb2NDb3VudCsrOwotICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbU91dHB1dEJ1ZmZlciovIG1EcmNPdXRCdWYpOwotICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOwotICAgICAgICB9CiAgICAgICAgIC8qIERSQyBidWZmZXJzCiAgICAgICAgICAgICBidWZbMF0gLSBjb250YWlucyBleHRlbnNpb24gZWxlbWVudCBwYXkgbG9hZCBsb3VkbmVzcyByZWxhdGVkCiAgICAgICAgICAgICBidWZbMV0gLSBjb250YWlucyBleHRlbnNpb24gZWxlbWVudCBwYXkgbG9hZCovCkBAIC0xNDIzLDEwICsxNDAyLDEwIEBACiAgICAgfQogI2VuZGlmCiAKLSAgICByZXR1cm4gZXJyX2NvZGU7CisgICAgcmV0dXJuIElBX05PX0VSUk9SOwogfQotaW50IFNvZnRYQUFDOjpkZWNvZGVYQUFDU3RyZWFtKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCwgaW50MzJfdCogYnl0ZXNDb25zdW1lZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBvdXRCeXRlcykgeworSUFfRVJST1JDT0RFIFNvZnRYQUFDOjpkZWNvZGVYQUFDU3RyZWFtKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBieXRlc0NvbnN1bWVkLCBpbnQzMl90KiBvdXRCeXRlcykgewogICAgIGlmIChtSW5wdXRCdWZmZXJTaXplIDwgaW5CdWZmZXJMZW5ndGgpIHsKICAgICAgICAgQUxPR0UoIkNhbm5vdCBjb25maWcgQUFDLCBpbnB1dCBidWZmZXIgc2l6ZSAlZCA8IGluQnVmZmVyTGVuZ3RoICVkIiwgbUlucHV0QnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGgpOwpAQCAtMTUxNiwyNCArMTQ5NSwzMyBAQAogICAgICAgICBtZW1jcHkobU91dHB1dEJ1ZmZlciwgbURyY091dEJ1ZiwgKm91dEJ5dGVzKTsKICAgICB9CiAjZW5kaWYKLSAgICByZXR1cm4gZXJyX2NvZGU7CisgICAgcmV0dXJuIElBX05PX0VSUk9SOwogfQogCi1pbnQgU29mdFhBQUM6OmRlSW5pdFhBQUNEZWNvZGVyKCkgeworSUFfRVJST1JDT0RFIFNvZnRYQUFDOjpkZUluaXRYQUFDRGVjb2RlcigpIHsKICAgICBBTE9HSSgiZGVJbml0WEFBQ0RlY29kZXIiKTsKIAogICAgIC8qIFRlbGwgdGhhdCB0aGUgaW5wdXQgaXMgb3ZlciBpbiB0aGlzIGJ1ZmZlciAqLwogICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0lOUFVUX09WRVIsIDAsIE5VTEwpOwotICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfSU5QVVRfT1ZFUiIpOwogCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTWFsbG9jQ291bnQ7IGkrKykgewotICAgICAgICBpZiAobU1lbW9yeUFycmF5W2ldKSBmcmVlKG1NZW1vcnlBcnJheVtpXSk7CisgICAgLyogSXJyZXNwZWN0aXZlIG9mIGVycm9yIHJldHVybmVkIGluIElBX0FQSV9DTURfSU5QVVRfT1ZFUiwgZnJlZSBhbGxvY2F0ZWQgbWVtb3J5ICovCisgICAgZm9yICh2b2lkKiBidWYgOiBtTWVtb3J5VmVjKSB7CisgICAgICAgIGZyZWUoYnVmKTsKICAgICB9Ci0gICAgbU1hbGxvY0NvdW50ID0gMDsKLQorICAgIG1NZW1vcnlWZWMuY2xlYXIoKTsKICAgICByZXR1cm4gZXJyX2NvZGU7CiB9CiAKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6ZGVJbml0TVBFR0RERHJjKCkgeworICAgIEFMT0dJKCJkZUluaXRNUEVHREREcmMiKTsKKworICAgIGZvciAodm9pZCogYnVmIDogbURyY01lbW9yeVZlYykgeworICAgICAgICBmcmVlKGJ1Zik7CisgICAgfQorICAgIG1EcmNNZW1vcnlWZWMuY2xlYXIoKTsKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKIElBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6Z2V0WEFBQ1N0cmVhbUluZm8oKSB7CiAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CiAKQEAgLTE1NDYsMTEgKzE1MzQsMTkgQEAKICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMsICZtTnVtQ2hhbm5lbHMpOwogICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMiKTsKKyAgICBpZiAobU51bUNoYW5uZWxzID4gTUFYX0NIQU5ORUxfQ09VTlQpIHsKKyAgICAgICAgQUxPR0UoIiBObyBvZiBjaGFubmVscyBhcmUgbW9yZSB0aGFuIG1heCBjaGFubmVsc1xuIik7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CiAKICAgICAvKiBQQ00gd29yZCBzaXplICovCiAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fUENNX1dEU1osICZtUGNtV2RTeik7CiAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1BDTV9XRFNaIik7CisgICAgaWYgKChtUGNtV2RTeiAvIDgpICE9IDIpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgTnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGU6ICVkLCBFeHBlY3RlZCBpcyAyIiwgbVBjbVdkU3opOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQogCiAgICAgLyogY2hhbm5lbCBtYXNrIHRvIHRlbGwgdGhlIGFycmFuZ2VtZW50IG9mIGNoYW5uZWxzIGluIGJpdCBzdHJlYW0gKi8KICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuaAppbmRleCA2MTc2MDgyLi5hNjJhNzk3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmgKQEAgLTMzLDggKzMzLDYgQEAKICNpbmNsdWRlICJpbXBkX2FwaWNtZF9zdGFuZGFyZHMuaCIKICNpbmNsdWRlICJpbXBkX2RyY19jb25maWdfcGFyYW1zLmgiCiAKLSNkZWZpbmUgTUFYX01FTV9BTExPQ1MgMTAwCi0KIGV4dGVybiAiQyIgSUFfRVJST1JDT0RFIGl4aGVhYWNkX2RlY19hcGkocFZPSUQgcF9pYV9tb2R1bGVfb2JqLCBXT1JEMzIgaV9jbWQsIFdPUkQzMiBpX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZPSUQgcHZfdmFsdWUpOwogZXh0ZXJuICJDIiBJQV9FUlJPUkNPREUgaWFfZHJjX2RlY19hcGkocFZPSUQgcF9pYV9tb2R1bGVfb2JqLCBXT1JEMzIgaV9jbWQsIFdPUkQzMiBpX2lkeCwKQEAgLTgwLDE4ICs3OCwxOSBAQAogICAgIGVudW0geyBOT05FLCBBV0FJVElOR19ESVNBQkxFRCwgQVdBSVRJTkdfRU5BQkxFRCB9IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2U7CiAKICAgICB2b2lkIGluaXRQb3J0cygpOwotICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGluaXREZWNvZGVyKCk7CiAgICAgYm9vbCBpc0NvbmZpZ3VyZWQoKSBjb25zdDsKLSAgICBpbnQgZHJhaW5EZWNvZGVyKCk7Ci0gICAgaW50IGluaXRYQUFDRGVjb2RlcigpOwotICAgIGludCBkZUluaXRYQUFDRGVjb2RlcigpOworICAgIElBX0VSUk9SQ09ERSBkcmFpbkRlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgaW5pdFhBQUNEZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGRlSW5pdFhBQUNEZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGluaXRNUEVHREREcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgZGVJbml0TVBFR0RERHJjKCk7CisgICAgSUFfRVJST1JDT0RFIGNvbmZpZ1hBQUNEZWNvZGVyKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgSUFfRVJST1JDT0RFIGNvbmZpZ01QRUdERHJjKCk7CisgICAgSUFfRVJST1JDT0RFIGRlY29kZVhBQUNTdHJlYW0odWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGJ5dGVzQ29uc3VtZWQsIGludDMyX3QqIG91dEJ5dGVzKTsKIAotICAgIGludCBjb25maWdYQUFDRGVjb2Rlcih1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgpOwotICAgIGludCBjb25maWdNUEVHRERyYygpOwotICAgIGludCBkZWNvZGVYQUFDU3RyZWFtKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCwgaW50MzJfdCogYnl0ZXNDb25zdW1lZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBvdXRCeXRlcyk7Ci0KLSAgICBpbnQgY29uZmlnZmx1c2hEZWNvZGUoKTsKKyAgICBJQV9FUlJPUkNPREUgY29uZmlnZmx1c2hEZWNvZGUoKTsKICAgICBJQV9FUlJPUkNPREUgZ2V0WEFBQ1N0cmVhbUluZm8oKTsKICAgICBJQV9FUlJPUkNPREUgc2V0WEFBQ0RSQ0luZm8oaW50MzJfdCBkcmNDdXQsIGludDMyX3QgZHJjQm9vc3QsIGludDMyX3QgZHJjUmVmTGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHJjSGVhdnlDb21wcmVzc2lvbgpAQCAtMTIwLDkgKzExOSw4IEBACiAgICAgaW50OF90KiBtRHJjT3V0QnVmOwogICAgIGludDMyX3QgbU1wZWdERFJDUHJlc2VudDsKICAgICBpbnQzMl90IG1EUkNGbGFnOwotCi0gICAgdm9pZCogbU1lbW9yeUFycmF5W01BWF9NRU1fQUxMT0NTXTsKLSAgICBpbnQzMl90IG1NYWxsb2NDb3VudDsKKyAgICBWZWN0b3I8dm9pZCo+IG1NZW1vcnlWZWM7CisgICAgVmVjdG9yPHZvaWQqPiBtRHJjTWVtb3J5VmVjOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdFhBQUMpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCmluZGV4IDcwZjUyYzMuLmQxMzZkOWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcApAQCAtMjEsMTAgKzIxLDEzIEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KIAogI2luY2x1ZGUgImxpYnl1di9jb252ZXJ0X2Zyb20uaCIKKyNpbmNsdWRlICJsaWJ5dXYvY29udmVydF9hcmdiLmgiCisjaW5jbHVkZSAibGlieXV2L3BsYW5hcl9mdW5jdGlvbnMuaCIKICNpbmNsdWRlICJsaWJ5dXYvdmlkZW9fY29tbW9uLmgiCiAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgpAQCAtNDUsMTAgKzQ4LDI4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RhdGljIGJvb2wgaXNSR0IoT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQpIHsKKyAgICByZXR1cm4gY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1CisgICAgICAgICAgICB8fCBjb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4OAorICAgICAgICAgICAgfHwgY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg7Cit9CisKK2Jvb2wgQ29sb3JDb252ZXJ0ZXI6OkNvbG9yU3BhY2U6OmlzQnQ3MDkoKSB7CisgICAgcmV0dXJuIChtU3RhbmRhcmQgPT0gQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDcwOSk7Cit9CisKKworYm9vbCBDb2xvckNvbnZlcnRlcjo6Q29sb3JTcGFjZTo6aXNKcGVnKCkgeworICAgIHJldHVybiAoKG1TdGFuZGFyZCA9PSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNjAxXzYyNSkKKyAgICAgICAgICAgIHx8IChtU3RhbmRhcmQgPT0gQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV81MjUpKQorICAgICAgICAgICAgJiYgKG1SYW5nZSA9PSBDb2xvclV0aWxzOjprQ29sb3JSYW5nZUZ1bGwpOworfQorCiBDb2xvckNvbnZlcnRlcjo6Q29sb3JDb252ZXJ0ZXIoCiAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGZyb20sIE9NWF9DT0xPUl9GT1JNQVRUWVBFIHRvKQogICAgIDogbVNyY0Zvcm1hdChmcm9tKSwKICAgICAgIG1Ec3RGb3JtYXQodG8pLAorICAgICAgbVNyY0NvbG9yU3BhY2UoezAsIDAsIDB9KSwKICAgICAgIG1DbGlwKE5VTEwpIHsKIH0KIApAQCAtNzEsMjQgKzkyLDQ2IEBACiAKICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZOgogICAgICAgICBjYXNlIE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXI6Ci0gICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CiAgICAgICAgIGNhc2UgT01YX1RJX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CiAgICAgICAgICAgICByZXR1cm4gbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU7CiAKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyNpZmRlZiBVU0VfTElCWVVWCisgICAgICAgICAgICByZXR1cm4gbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUKKyAgICAgICAgICAgICAgICAgICAgfHwgbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4ODsKKyNlbHNlCisgICAgICAgICAgICByZXR1cm4gbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU7CisjZW5kaWYKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIH0KIAogYm9vbCBDb2xvckNvbnZlcnRlcjo6aXNEc3RSR0IoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1Ci0gICAgICAgICAgICB8fCBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4Ci0gICAgICAgICAgICB8fCBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OworICAgIHJldHVybiBpc1JHQihtRHN0Rm9ybWF0KTsKIH0KIAordm9pZCBDb2xvckNvbnZlcnRlcjo6c2V0U3JjQ29sb3JTcGFjZSgKKyAgICAgICAgdWludDMyX3Qgc3RhbmRhcmQsIHVpbnQzMl90IHJhbmdlLCB1aW50MzJfdCB0cmFuc2ZlcikgeworICAgIGlmIChpc1JHQihtU3JjRm9ybWF0KSkgeworICAgICAgICBBTE9HVygiQ2FuJ3Qgc2V0IGNvbG9yIHNwYWNlIG9uIFJHQiBzb3VyY2UiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtU3JjQ29sb3JTcGFjZS5tU3RhbmRhcmQgPSBzdGFuZGFyZDsKKyAgICBtU3JjQ29sb3JTcGFjZS5tUmFuZ2UgPSByYW5nZTsKKyAgICBtU3JjQ29sb3JTcGFjZS5tVHJhbnNmZXIgPSB0cmFuc2ZlcjsKK30KKworLyoKKyAqIElmIHN0cmlkZSBpcyBub24temVybywgY2xpZW50J3Mgc3RyaWRlIHdpbGwgYmUgdXNlZC4gRm9yIHBsYW5hcgorICogb3Igc2VtaS1wbGFuYXIgWVVWIGZvcm1hdHMsIHN0cmlkZSBtdXN0IGJlIGV2ZW4gbnVtYmVycy4KKyAqIElmIHN0cmlkZSBpcyB6ZXJvLCBpdCB3aWxsIGJlIGNhbGN1bGF0ZWQgYmFzZWQgb24gd2lkdGggYW5kIGJwcAorICogb2YgdGhlIGZvcm1hdCwgYXNzdW1pbmcgbm8gcGFkZGluZyBvbiB0aGUgcmlnaHQgZWRnZS4KKyAqLwogQ29sb3JDb252ZXJ0ZXI6OkJpdG1hcFBhcmFtczo6Qml0bWFwUGFyYW1zKAogICAgICAgICB2b2lkICpiaXRzLAotICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsCisgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwgc2l6ZV90IHN0cmlkZSwKICAgICAgICAgc2l6ZV90IGNyb3BMZWZ0LCBzaXplX3QgY3JvcFRvcCwKICAgICAgICAgc2l6ZV90IGNyb3BSaWdodCwgc2l6ZV90IGNyb3BCb3R0b20sCiAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRnJvbWF0KQpAQCAtMTAyLDYgKzE0NSw4IEBACiAgICAgICBtQ3JvcEJvdHRvbShjcm9wQm90dG9tKSB7CiAgICAgc3dpdGNoKG1Db2xvckZvcm1hdCkgewogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OgorICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2OgorICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdENiWUNyWToKICAgICAgICAgbUJwcCA9IDI7CiAgICAgICAgIG1TdHJpZGUgPSAyICogbVdpZHRoOwogICAgICAgICBicmVhazsKQEAgLTExMywxMyArMTU4LDcgQEAKICAgICAgICAgbVN0cmlkZSA9IDQgKiBtV2lkdGg7CiAgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTY6Ci0gICAgICAgIG1CcHAgPSAyOwotICAgICAgICBtU3RyaWRlID0gMiAqIG1XaWR0aDsKLSAgICAgICAgYnJlYWs7Ci0KICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6Ci0gICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZOgogICAgIGNhc2UgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hcjoKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgogICAgIGNhc2UgT01YX1RJX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CkBAIC0xMzMsNiArMTcyLDEwIEBACiAgICAgICAgIG1TdHJpZGUgPSBtV2lkdGg7CiAgICAgICAgIGJyZWFrOwogICAgIH0KKyAgICAvLyB1c2UgY2xpZW50J3Mgc3RyaWRlIGlmIGl0J3Mgc3BlY2lmaWVkLgorICAgIGlmIChzdHJpZGUgIT0gMCkgeworICAgICAgICBtU3RyaWRlID0gc3RyaWRlOworICAgIH0KIH0KIAogc2l6ZV90IENvbG9yQ29udmVydGVyOjpCaXRtYXBQYXJhbXM6OmNyb3BXaWR0aCgpIGNvbnN0IHsKQEAgLTE0NSwyMSArMTg4LDIxIEBACiAKIHN0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0KAogICAgICAgICBjb25zdCB2b2lkICpzcmNCaXRzLAotICAgICAgICBzaXplX3Qgc3JjV2lkdGgsIHNpemVfdCBzcmNIZWlnaHQsCisgICAgICAgIHNpemVfdCBzcmNXaWR0aCwgc2l6ZV90IHNyY0hlaWdodCwgc2l6ZV90IHNyY1N0cmlkZSwKICAgICAgICAgc2l6ZV90IHNyY0Nyb3BMZWZ0LCBzaXplX3Qgc3JjQ3JvcFRvcCwKICAgICAgICAgc2l6ZV90IHNyY0Nyb3BSaWdodCwgc2l6ZV90IHNyY0Nyb3BCb3R0b20sCiAgICAgICAgIHZvaWQgKmRzdEJpdHMsCi0gICAgICAgIHNpemVfdCBkc3RXaWR0aCwgc2l6ZV90IGRzdEhlaWdodCwKKyAgICAgICAgc2l6ZV90IGRzdFdpZHRoLCBzaXplX3QgZHN0SGVpZ2h0LCBzaXplX3QgZHN0U3RyaWRlLAogICAgICAgICBzaXplX3QgZHN0Q3JvcExlZnQsIHNpemVfdCBkc3RDcm9wVG9wLAogICAgICAgICBzaXplX3QgZHN0Q3JvcFJpZ2h0LCBzaXplX3QgZHN0Q3JvcEJvdHRvbSkgewogICAgIEJpdG1hcFBhcmFtcyBzcmMoCiAgICAgICAgICAgICBjb25zdF9jYXN0PHZvaWQgKj4oc3JjQml0cyksCi0gICAgICAgICAgICBzcmNXaWR0aCwgc3JjSGVpZ2h0LAorICAgICAgICAgICAgc3JjV2lkdGgsIHNyY0hlaWdodCwgc3JjU3RyaWRlLAogICAgICAgICAgICAgc3JjQ3JvcExlZnQsIHNyY0Nyb3BUb3AsIHNyY0Nyb3BSaWdodCwgc3JjQ3JvcEJvdHRvbSwgbVNyY0Zvcm1hdCk7CiAKICAgICBCaXRtYXBQYXJhbXMgZHN0KAogICAgICAgICAgICAgZHN0Qml0cywKLSAgICAgICAgICAgIGRzdFdpZHRoLCBkc3RIZWlnaHQsCisgICAgICAgICAgICBkc3RXaWR0aCwgZHN0SGVpZ2h0LCBkc3RTdHJpZGUsCiAgICAgICAgICAgICBkc3RDcm9wTGVmdCwgZHN0Q3JvcFRvcCwgZHN0Q3JvcFJpZ2h0LCBkc3RDcm9wQm90dG9tLCBtRHN0Rm9ybWF0KTsKIAogICAgIGlmICghKChzcmMubUNyb3BMZWZ0ICYgMSkgPT0gMApAQCAtMjAxLDcgKzI0NCwxMSBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyNpZmRlZiBVU0VfTElCWVVWCisgICAgICAgICAgICBlcnIgPSBjb252ZXJ0WVVWNDIwU2VtaVBsYW5hclVzZUxpYllVVihzcmMsIGRzdCk7CisjZWxzZQogICAgICAgICAgICAgZXJyID0gY29udmVydFlVVjQyMFNlbWlQbGFuYXIoc3JjLCBkc3QpOworI2VuZGlmCiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIE9NWF9USV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgpAQCAtMjc2LDYgKzMyMywxMyBAQAogICAgIHJldHVybiBPSzsKIH0KIAorI2RlZmluZSBERUNMQVJFX1lVVjJSR0JGVU5DKGZ1bmMsIHJnYikgaW50ICgqZnVuYykoICAgICBcCisgICAgICAgIGNvbnN0IHVpbnQ4KiwgaW50LCBjb25zdCB1aW50OCosIGludCwgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdWludDgqLCBpbnQsIHVpbnQ4KiwgaW50LCBpbnQsIGludCkgICAgICAgXAorICAgICAgICA9IG1TcmNDb2xvclNwYWNlLmlzQnQ3MDkoKSA/IGxpYnl1djo6SDQyMFRvIyNyZ2IgXAorICAgICAgICA6IG1TcmNDb2xvclNwYWNlLmlzSnBlZygpID8gbGlieXV2OjpKNDIwVG8jI3JnYiAgXAorICAgICAgICA6IGxpYnl1djo6STQyMFRvIyNyZ2IKKwogc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRZVVY0MjBQbGFuYXJVc2VMaWJZVVYoCiAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCkgewogICAgIHVpbnQ4X3QgKmRzdF9wdHIgPSAodWludDhfdCAqKWRzdC5tQml0cwpAQCAtMjkzLDE5ICszNDcsMjggQEAKIAogICAgIHN3aXRjaCAobURzdEZvcm1hdCkgewogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OgotICAgICAgICBsaWJ5dXY6Okk0MjBUb1JHQjU2NShzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSAvIDIsIHNyY192LCBzcmMubVN0cmlkZSAvIDIsCisgICAgeworICAgICAgICBERUNMQVJFX1lVVjJSR0JGVU5DKGZ1bmMsIFJHQjU2NSk7CisgICAgICAgICgqZnVuYykoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAogICAgICAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCkpOwogICAgICAgICBicmVhazsKKyAgICB9CiAKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4OgotICAgICAgICBsaWJ5dXY6OkNvbnZlcnRGcm9tSTQyMChzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSAvIDIsIHNyY192LCBzcmMubVN0cmlkZSAvIDIsCi0gICAgICAgICAgICAgICAgKHVpbnQ4ICopZHN0X3B0ciwgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSwgbGlieXV2OjpGT1VSQ0NfQUJHUik7CisgICAgeworICAgICAgICBERUNMQVJFX1lVVjJSR0JGVU5DKGZ1bmMsIEFCR1IpOworICAgICAgICAoKmZ1bmMpKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpKTsKICAgICAgICAgYnJlYWs7CisgICAgfQogCiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODoKLSAgICAgICAgbGlieXV2OjpDb252ZXJ0RnJvbUk0MjAoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCksIGxpYnl1djo6Rk9VUkNDX0FSR0IpOworICAgIHsKKyAgICAgICAgREVDTEFSRV9ZVVYyUkdCRlVOQyhmdW5jLCBBUkdCKTsKKyAgICAgICAgKCpmdW5jKShzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSAvIDIsIHNyY192LCBzcmMubVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgKHVpbnQ4ICopZHN0X3B0ciwgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSk7CiAgICAgICAgIGJyZWFrOworICAgIH0KIAogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKQEAgLTMxNCw2ICszNzcsMzYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENvbG9yQ29udmVydGVyOjpjb252ZXJ0WVVWNDIwU2VtaVBsYW5hclVzZUxpYllVVigKKyAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KSB7CisgICAgdWludDhfdCAqZHN0X3B0ciA9ICh1aW50OF90ICopZHN0Lm1CaXRzCisgICAgICAgICsgZHN0Lm1Dcm9wVG9wICogZHN0Lm1TdHJpZGUgKyBkc3QubUNyb3BMZWZ0ICogZHN0Lm1CcHA7CisKKyAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0OworCisgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyYy5tQml0cyArIHNyYy5tU3RyaWRlICogc3JjLm1IZWlnaHQKKyAgICAgICAgKyAoc3JjLm1Dcm9wVG9wIC8gMikgKiBzcmMubVN0cmlkZSArIHNyYy5tQ3JvcExlZnQ7CisKKyAgICBzd2l0Y2ggKG1Ec3RGb3JtYXQpIHsKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NToKKyAgICAgICAgbGlieXV2OjpOVjEyVG9SR0I1NjUoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUsICh1aW50OCAqKWRzdF9wdHIsCisgICAgICAgICAgICAgICAgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4ODoKKyAgICAgICAgbGlieXV2OjpOVjEyVG9BUkdCKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlLCAodWludDggKilkc3RfcHRyLAorICAgICAgICAgICAgICAgIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCkpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgIH0KKworICAgcmV0dXJuIE9LOworfQorCiBzdGQ6OmZ1bmN0aW9uPHZvaWQgKHZvaWQgKiwgdm9pZCAqLCB2b2lkICosIHNpemVfdCwKICAgICAgICAgICAgICAgICAgICAgc2lnbmVkICosIHNpZ25lZCAqLCBzaWduZWQgKiwgc2lnbmVkICopPgogZ2V0UmVhZEZyb21TcmMoT01YX0NPTE9SX0ZPUk1BVFRZUEUgc3JjRm9ybWF0KSB7CkBAIC03OTMsMTUgKzg4NiwxNSBAQAogCiAgICAgdWludDhfdCAqa0FkanVzdGVkQ2xpcCA9IGluaXRDbGlwKCk7CiAKLSAgICB1aW50MTZfdCAqZHN0X3B0ciA9ICh1aW50MTZfdCAqKWRzdC5tQml0cwotICAgICAgICArIGRzdC5tQ3JvcFRvcCAqIGRzdC5tV2lkdGggKyBkc3QubUNyb3BMZWZ0OworICAgIHVpbnQxNl90ICpkc3RfcHRyID0gKHVpbnQxNl90ICopKCh1aW50OF90ICopCisgICAgICAgICAgICBkc3QubUJpdHMgKyBkc3QubUNyb3BUb3AgKiBkc3QubVN0cmlkZSArIGRzdC5tQ3JvcExlZnQgKiBkc3QubUJwcCk7CiAKICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1XaWR0aCArIHNyYy5tQ3JvcExlZnQ7CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0OwogCiAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPQotICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyY195ICsgc3JjLm1XaWR0aCAqIHNyYy5tSGVpZ2h0Ci0gICAgICAgICsgc3JjLm1Dcm9wVG9wICogc3JjLm1XaWR0aCArIHNyYy5tQ3JvcExlZnQ7CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1IZWlnaHQgKiBzcmMubVN0cmlkZSArCisgICAgICAgIChzcmMubUNyb3BUb3AgLyAyKSAqIHNyYy5tU3RyaWRlICsgc3JjLm1Dcm9wTGVmdDsKIAogICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgc3JjLmNyb3BIZWlnaHQoKTsgKyt5KSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgc3JjLmNyb3BXaWR0aCgpOyB4ICs9IDIpIHsKQEAgLTg0MywxMyArOTM2LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBzcmNfeSArPSBzcmMubVdpZHRoOworICAgICAgICBzcmNfeSArPSBzcmMubVN0cmlkZTsKIAogICAgICAgICBpZiAoeSAmIDEpIHsKLSAgICAgICAgICAgIHNyY191ICs9IHNyYy5tV2lkdGg7CisgICAgICAgICAgICBzcmNfdSArPSBzcmMubVN0cmlkZTsKICAgICAgICAgfQogCi0gICAgICAgIGRzdF9wdHIgKz0gZHN0Lm1XaWR0aDsKKyAgICAgICAgZHN0X3B0ciA9ICh1aW50MTZfdCopKCh1aW50OF90Kilkc3RfcHRyICsgZHN0Lm1TdHJpZGUpOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAppbmRleCA2NTdhMDViLi4zNTlkZjNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCkBAIC00NCw2ICs0NCw3IEBACiAgICAgICBtTmF0aXZlV2luZG93KG5hdGl2ZVdpbmRvdyksCiAgICAgICBtV2lkdGgoMCksCiAgICAgICBtSGVpZ2h0KDApLAorICAgICAgbVN0cmlkZSgwKSwKICAgICAgIG1Dcm9wTGVmdCgwKSwKICAgICAgIG1Dcm9wVG9wKDApLAogICAgICAgbUNyb3BSaWdodCgwKSwKQEAgLTY3LDkgKzY4LDEwIEBACiAgICAgaW50MzJfdCBjb2xvckZvcm1hdE5ldzsKICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0TmV3KSk7CiAKLSAgICBpbnQzMl90IHdpZHRoTmV3LCBoZWlnaHROZXc7Ci0gICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZ3aWR0aE5ldykpOworICAgIGludDMyX3Qgd2lkdGhOZXcsIGhlaWdodE5ldywgc3RyaWRlTmV3OworICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aE5ldykpOwogICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJzbGljZS1oZWlnaHQiLCAmaGVpZ2h0TmV3KSk7CisgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZzdHJpZGVOZXcpKTsKIAogICAgIGludDMyX3QgY3JvcExlZnROZXcsIGNyb3BUb3BOZXcsIGNyb3BSaWdodE5ldywgY3JvcEJvdHRvbU5ldzsKICAgICBpZiAoIWZvcm1hdC0+ZmluZFJlY3QoCkBAIC0xMDYsNiArMTA4LDcgQEAKICAgICBtQ29sb3JGb3JtYXQgPSBzdGF0aWNfY2FzdDxPTVhfQ09MT1JfRk9STUFUVFlQRT4oY29sb3JGb3JtYXROZXcpOwogICAgIG1XaWR0aCA9IHdpZHRoTmV3OwogICAgIG1IZWlnaHQgPSBoZWlnaHROZXc7CisgICAgbVN0cmlkZSA9IHN0cmlkZU5ldzsKICAgICBtQ3JvcExlZnQgPSBjcm9wTGVmdE5ldzsKICAgICBtQ3JvcFRvcCA9IGNyb3BUb3BOZXc7CiAgICAgbUNyb3BSaWdodCA9IGNyb3BSaWdodE5ldzsKQEAgLTI3NiwyMCArMjc5LDE1IEBACiAgICAgaWYgKG1Db252ZXJ0ZXIpIHsKICAgICAgICAgbUNvbnZlcnRlci0+Y29udmVydCgKICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwKKyAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQsIG1TdHJpZGUsCiAgICAgICAgICAgICAgICAgbUNyb3BMZWZ0LCBtQ3JvcFRvcCwgbUNyb3BSaWdodCwgbUNyb3BCb3R0b20sCiAgICAgICAgICAgICAgICAgZHN0LAotICAgICAgICAgICAgICAgIGJ1Zi0+c3RyaWRlLCBidWYtPmhlaWdodCwKKyAgICAgICAgICAgICAgICBidWYtPnN0cmlkZSwgYnVmLT5oZWlnaHQsIDAsCiAgICAgICAgICAgICAgICAgMCwgMCwgbUNyb3BXaWR0aCAtIDEsIG1Dcm9wSGVpZ2h0IC0gMSk7CiAgICAgfSBlbHNlIGlmIChtQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgewotICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9IChjb25zdCB1aW50OF90ICopZGF0YTsKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPQotICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopZGF0YSArIG1XaWR0aCAqIG1IZWlnaHQ7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY192ID0gc3JjX3UgKyAobVdpZHRoIC8gMiAqIG1IZWlnaHQgLyAyKTsKLQotICAgICAgICBzcmNfeSArPW1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoOwotICAgICAgICBzcmNfdSArPShtQ3JvcExlZnQgKyBtQ3JvcFRvcCAqIG1XaWR0aCAvIDIpLzI7Ci0gICAgICAgIHNyY192ICs9KG1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoIC8gMikvMjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3kgPSAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtQ3JvcFRvcCAqIG1TdHJpZGUgKyBtQ3JvcExlZnQ7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbVN0cmlkZSAqIG1IZWlnaHQgKyBtQ3JvcFRvcCAqIG1TdHJpZGUgLyA0OworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdiA9IChjb25zdCB1aW50OF90ICopc3JjX3UgKyBtU3RyaWRlICogbUhlaWdodCAvIDQ7CiAKICAgICAgICAgdWludDhfdCAqZHN0X3kgPSAodWludDhfdCAqKWRzdDsKICAgICAgICAgc2l6ZV90IGRzdF95X3NpemUgPSBidWYtPnN0cmlkZSAqIGJ1Zi0+aGVpZ2h0OwpAQCAtMzA1LDcgKzMwMyw3IEBACiAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgbUNyb3BIZWlnaHQ7ICsreSkgewogICAgICAgICAgICAgbWVtY3B5KGRzdF95LCBzcmNfeSwgbUNyb3BXaWR0aCk7CiAKLSAgICAgICAgICAgIHNyY195ICs9IG1XaWR0aDsKKyAgICAgICAgICAgIHNyY195ICs9IG1TdHJpZGU7CiAgICAgICAgICAgICBkc3RfeSArPSBidWYtPnN0cmlkZTsKICAgICAgICAgfQogCkBAIC0zMTMsMTkgKzMxMSwxNSBAQAogICAgICAgICAgICAgbWVtY3B5KGRzdF91LCBzcmNfdSwgKG1Dcm9wV2lkdGggKyAxKSAvIDIpOwogICAgICAgICAgICAgbWVtY3B5KGRzdF92LCBzcmNfdiwgKG1Dcm9wV2lkdGggKyAxKSAvIDIpOwogCi0gICAgICAgICAgICBzcmNfdSArPSBtV2lkdGggLyAyOwotICAgICAgICAgICAgc3JjX3YgKz0gbVdpZHRoIC8gMjsKKyAgICAgICAgICAgIHNyY191ICs9IG1TdHJpZGUgLyAyOworICAgICAgICAgICAgc3JjX3YgKz0gbVN0cmlkZSAvIDI7CiAgICAgICAgICAgICBkc3RfdSArPSBkc3RfY19zdHJpZGU7CiAgICAgICAgICAgICBkc3RfdiArPSBkc3RfY19zdHJpZGU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTYpIHsKLSAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY195ID0gKGNvbnN0IHVpbnQxNl90ICopZGF0YTsKLSAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY191ID0gKGNvbnN0IHVpbnQxNl90ICopZGF0YSArIG1XaWR0aCAqIG1IZWlnaHQ7Ci0gICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNfdiA9IHNyY191ICsgKG1XaWR0aCAvIDIgKiBtSGVpZ2h0IC8gMik7Ci0KLSAgICAgICAgc3JjX3kgKz0gbUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGg7Ci0gICAgICAgIHNyY191ICs9IChtQ3JvcExlZnQgKyBtQ3JvcFRvcCAqIG1XaWR0aCAvIDIpIC8gMjsKLSAgICAgICAgc3JjX3YgKz0gKG1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoIC8gMikgLyAyOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9IChjb25zdCB1aW50OF90ICopZGF0YSArIG1Dcm9wVG9wICogbVN0cmlkZSArIG1Dcm9wTGVmdCAqIDI7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbVN0cmlkZSAqIG1IZWlnaHQgKyBtQ3JvcFRvcCAqIG1TdHJpZGUgLyA0OworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdiA9IChjb25zdCB1aW50OF90ICopc3JjX3UgKyBtU3RyaWRlICogbUhlaWdodCAvIDQ7CiAKICAgICAgICAgdWludDhfdCAqZHN0X3kgPSAodWludDhfdCAqKWRzdDsKICAgICAgICAgc2l6ZV90IGRzdF95X3NpemUgPSBidWYtPnN0cmlkZSAqIGJ1Zi0+aGVpZ2h0OwpAQCAtMzQwLDIxICszMzQsMjEgQEAKIAogICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IG1Dcm9wSGVpZ2h0OyArK3kpIHsKICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgbUNyb3BXaWR0aDsgKyt4KSB7Ci0gICAgICAgICAgICAgICAgZHN0X3lbeF0gPSAodWludDhfdCkoc3JjX3lbeF0gPj4gMik7CisgICAgICAgICAgICAgICAgZHN0X3lbeF0gPSAodWludDhfdCkoKCh1aW50MTZfdCAqKXNyY195KVt4XSA+PiAyKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3JjX3kgKz0gbVdpZHRoOworICAgICAgICAgICAgc3JjX3kgKz0gbVN0cmlkZTsKICAgICAgICAgICAgIGRzdF95ICs9IGJ1Zi0+c3RyaWRlOwogICAgICAgICB9CiAKICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCAobUNyb3BIZWlnaHQgKyAxKSAvIDI7ICsreSkgewogICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCAobUNyb3BXaWR0aCArIDEpIC8gMjsgKyt4KSB7Ci0gICAgICAgICAgICAgICAgZHN0X3VbeF0gPSAodWludDhfdCkoc3JjX3VbeF0gPj4gMik7Ci0gICAgICAgICAgICAgICAgZHN0X3ZbeF0gPSAodWludDhfdCkoc3JjX3ZbeF0gPj4gMik7CisgICAgICAgICAgICAgICAgZHN0X3VbeF0gPSAodWludDhfdCkoKCh1aW50MTZfdCAqKXNyY191KVt4XSA+PiAyKTsKKyAgICAgICAgICAgICAgICBkc3Rfdlt4XSA9ICh1aW50OF90KSgoKHVpbnQxNl90ICopc3JjX3YpW3hdID4+IDIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzcmNfdSArPSBtV2lkdGggLyAyOwotICAgICAgICAgICAgc3JjX3YgKz0gbVdpZHRoIC8gMjsKKyAgICAgICAgICAgIHNyY191ICs9IG1TdHJpZGUgLyAyOworICAgICAgICAgICAgc3JjX3YgKz0gbVN0cmlkZSAvIDI7CiAgICAgICAgICAgICBkc3RfdSArPSBkc3RfY19zdHJpZGU7CiAgICAgICAgICAgICBkc3RfdiArPSBkc3RfY19zdHJpZGU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl9hdWRpby54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfYXVkaW8ueG1sCmluZGV4IDBiNTU0YTIuLjQ3YTk3MTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl9hdWRpby54bWwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX2F1ZGlvLnhtbApAQCAtMTcsNTEgKzE3LDYxIEBACiA8SW5jbHVkZWQ+CiAgICAgPERlY29kZXJzPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm1wMy5kZWNvZGVyIiB0eXBlPSJhdWRpby9tcGVnIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLm1wMy5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLDExMDI1LDEyMDAwLDE2MDAwLDIyMDUwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI4MDAwLTMyMDAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFtcm5iLmRlY29kZXIiIHR5cGU9ImF1ZGlvLzNncHAiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuYW1ybmIuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNDc1MC0xMjIwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFtcndiLmRlY29kZXIiIHR5cGU9ImF1ZGlvL2Ftci13YiI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hbXJ3Yi5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSIxNjAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjYwMC0yMzg1MCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFhYy5kZWNvZGVyIiB0eXBlPSJhdWRpby9tcDRhLWxhdG0iPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuYWFjLmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjczNTAsODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iODAwMC05NjAwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5nNzExLmFsYXcuZGVjb2RlciIgdHlwZT0iYXVkaW8vZzcxMS1hbGF3Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmc3MTEuYWxhdy5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTQ4MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NDAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmc3MTEubWxhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9nNzExLW1sYXciPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuZzcxMS5tbGF3LmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAtNDgwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY0MDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQudm9yYmlzLmRlY29kZXIiIHR5cGU9ImF1ZGlvL3ZvcmJpcyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS52b3JiaXMuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMC05NjAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMzIwMDAtNTAwMDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQub3B1cy5kZWNvZGVyIiB0eXBlPSJhdWRpby9vcHVzIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLm9wdXMuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iNDgwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjYwMDAtNTEwMDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQucmF3LmRlY29kZXIiIHR5cGU9ImF1ZGlvL3JhdyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5yYXcuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMC05NjAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmZsYWMuZGVjb2RlciIgdHlwZT0iYXVkaW8vZmxhYyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5mbGFjLmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjEtNjU1MzUwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIxMDAwMDAwIiAvPgpAQCAtNjksMjkgKzc5LDQwIEBACiAgICAgPC9EZWNvZGVycz4KICAgICA8RW5jb2RlcnM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYWFjLmVuY29kZXIiIHR5cGU9ImF1ZGlvL21wNGEtbGF0bSI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hYWMuZW5jb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjYiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIgLz4KICAgICAgICAgICAgIDwhLS0gYWxzbyBtYXkgc3VwcG9ydCA2NDAwMCwgODgyMDAgIGFuZCA5NjAwMCBIeiAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iODAwMC05NjAwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hbXJuYi5lbmNvZGVyIiB0eXBlPSJhdWRpby8zZ3BwIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmFtcm5iLmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjQ3NTAtMTIyMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ0JSIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYW1yd2IuZW5jb2RlciIgdHlwZT0iYXVkaW8vYW1yLXdiIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmFtcndiLmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjE2MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NjAwLTIzODUwIiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IkNCUiIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmZsYWMuZW5jb2RlciIgdHlwZT0iYXVkaW8vZmxhYyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5mbGFjLmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjEtNjU1MzUwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIxMDAwMDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNvbXBsZXhpdHkiIHJhbmdlPSIwLTgiICBkZWZhdWx0PSI1IiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IkNRIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQub3B1cy5lbmNvZGVyIiB0eXBlPSJhdWRpby9vcHVzIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCwxMjAwMCwxNjAwMCwyNDAwMCw0ODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNTAwLTUxMjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjb21wbGV4aXR5IiByYW5nZT0iMC0xMCIgIGRlZmF1bHQ9IjUiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ1EiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICA8L0VuY29kZXJzPgogPC9JbmNsdWRlZD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl90ZWxlcGhvbnkueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3RlbGVwaG9ueS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwYjA5MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl90ZWxlcGhvbnkueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8SW5jbHVkZWQ+CisgICAgPERlY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmdzbS5kZWNvZGVyIiB0eXBlPSJhdWRpby9nc20iPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuZ3NtLmRlY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEzMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9EZWNvZGVycz4KKzwvSW5jbHVkZWQ+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdHYueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3R2LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjAwZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3R2LnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEluY2x1ZGVkPgorICAgIDxEZWNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5tcGVnMi5kZWNvZGVyIiB0eXBlPSJ2aWRlby9tcGVnMiI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5tcGVnMi5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBMZXZlbEhMIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iMTkyMHgxMDg4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTI0NDgwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9EZWNvZGVycz4KKzwvSW5jbHVkZWQ+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdmlkZW8ueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3ZpZGVvLnhtbAppbmRleCBhZGI0NWIzLi5lMjAxNzRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdmlkZW8ueG1sCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl92aWRlby54bWwKQEAgLTE3LDYgKzE3LDcgQEAKIDxJbmNsdWRlZD4KICAgICA8RGVjb2RlcnM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQubXBlZzQuZGVjb2RlciIgdHlwZT0idmlkZW8vbXA0di1lcyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5tcGVnNC5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZVNpbXBsZSA6IExldmVsMyAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIzNTJ4Mjg4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KQEAgLTI2LDYgKzI3LDcgQEAKICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuaDI2My5kZWNvZGVyIiB0eXBlPSJ2aWRlby8zZ3BwIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmgyNjMuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsMzAsIFByb2ZpbGVCYXNlbGluZSA6IExldmVsNDUKICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZUlTV1YyIDogTGV2ZWwzMCwgUHJvZmlsZUlTV1YyIDogTGV2ZWw0NSAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIzNTJ4Mjg4IiAvPgpAQCAtMzQsNiArMzYsNyBAQAogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hdmMuZGVjb2RlciIgdHlwZT0idmlkZW8vYXZjIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmgyNjQuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVIaWdoIDogTGV2ZWw1MiAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSI0MDgweDQwODAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgpAQCAtNDQsNiArNDcsNyBAQAogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5oZXZjLmRlY29kZXIiIHR5cGU9InZpZGVvL2hldmMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuaGV2Yy5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBNYWluVGllckxldmVsNTEgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iNDA5Nng0MDk2IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KQEAgLTU0LDYgKzU4LDcgQEAKICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQudnA4LmRlY29kZXIiIHR5cGU9InZpZGVvL3gtdm5kLm9uMi52cDgiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUudnA4LmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CkBAIC02Myw2ICs2OCw3IEBACiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOS5kZWNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA5Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLnZwOS5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgpAQCAtNzEsMTYgKzc3LDI3IEBACiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmF2MS5kZWNvZGVyIiB0eXBlPSJ2aWRlby9hdjAxIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49Ijk2eDk2IiBtYXg9IjE5MjB4MTA4MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiBtaW49IjI0IiBtYXg9IjIwNzM2MDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTIwMDAwMDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImZyYW1lLXJhdGUiIHJhbmdlPSIxLTYwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICA8L0RlY29kZXJzPgogCiAgICAgPEVuY29kZXJzPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmgyNjMuZW5jb2RlciIgdHlwZT0idmlkZW8vM2dwcCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5oMjYzLmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDQ1IC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTc2eDE0NCIgbWF4PSIxNzZ4MTQ0IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjE2eDE2IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEyODAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmF2Yy5lbmNvZGVyIiB0eXBlPSJ2aWRlby9hdmMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuaDI2NC5lbmNvZGVyIiAvPgogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWw0MSAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CkBAIC05MCw3ICsxMDcsMTcgQEAKICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMjAwMDAwMCIgLz4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImludHJhLXJlZnJlc2giIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5oZXZjLmVuY29kZXIiIHR5cGU9InZpZGVvL2hldmMiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBNYWluVGllckxldmVsNTEgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIzMjB4MTI4IiBtYXg9IjUxMng1MTIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSI4eDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTQwOTYiIC8+IDwhLS0gbWF4IDUxMng1MTIgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTEyMjg4MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm1wZWc0LmVuY29kZXIiIHR5cGU9InZpZGVvL21wNHYtZXMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUubXBlZzQuZW5jb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVDb3JlIDogTGV2ZWwyIC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iMTc2eDE0NCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIxNngxNiIgLz4KQEAgLTk5LDYgKzEyNiw3IEBACiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNjQwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC52cDguZW5jb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS52cDguZW5jb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxfVmVyc2lvbjAtMyAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgpAQCAtMTA5LDYgKzEzNyw3IEBACiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iVkJSLENCUiIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOS5lbmNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA5Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLnZwOS5lbmNvZGVyIiAvPgogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBMZXZlbF9WZXJzaW9uMC0zIC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icAppbmRleCA2YmZhYjE2Li4zMDdjOWIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAKQEAgLTI3LDE3ICsyNywyMSBAQAogICAgIH0sCiAKICAgICBzdGF0aWM6IHsKLSAgICAgICAgd2hvbGVfc3RhdGljX2xpYnM6IFsibGliRkxBQyJdLAorICAgICAgICB3aG9sZV9zdGF0aWNfbGliczogWworICAgICAgICAgICAgImxpYkZMQUMiLAorICAgICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICBdLAogICAgIH0sCiAKICAgICBzaGFyZWQ6IHsKLSAgICAgICAgc3RhdGljX2xpYnM6IFsibGliRkxBQyJdLAorICAgICAgICBzdGF0aWNfbGliczogWworICAgICAgICAgICAgImxpYkZMQUMiLAorICAgICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICBdLAogICAgIH0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsibGlibWVkaWFfaGVhZGVycyJdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwCmluZGV4IGRmZGM0MWMuLmNlZjBiYzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgIkZMQUNEZWNvZGVyLmgiCiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+IC8vIGZsb2F0X2Zyb21faTMyCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTExNywxMDQgKzExOCw0MyBAQAogICAgIG1FcnJvclN0YXR1cyA9IHN0YXR1czsKIH0KIAotLy8gQ29weSBzYW1wbGVzIGZyb20gRkxBQyBuYXRpdmUgMzItYml0IG5vbi1pbnRlcmxlYXZlZCB0byAxNi1iaXQgaW50ZXJsZWF2ZWQuCisvLyBDb3B5IHNhbXBsZXMgZnJvbSBGTEFDIG5hdGl2ZSAzMi1iaXQgbm9uLWludGVybGVhdmVkIHRvIDE2LWJpdCBzaWduZWQKKy8vIG9yIDMyLWJpdCBmbG9hdCBpbnRlcmxlYXZlZC4KKy8vIFRPRE86IENvbnNpZGVyIG1vdmluZyB0byBhdWRpb191dGlscy4gIFNlZSBzaW1pbGFyIGNvZGUgYXQgRkxBQ0V4dHJhY3Rvci5jcHAKIC8vIFRoZXNlIGFyZSBjYW5kaWRhdGVzIGZvciBvcHRpbWl6YXRpb24gaWYgbmVlZGVkLgotc3RhdGljIHZvaWQgY29weU1vbm84KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKK3N0YXRpYyB2b2lkIGNvcHlUbzE2U2lnbmVkKAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCiAgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPDwgODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW84KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA8PCA4OwotICAgICAgICAqZHN0KysgPSBzcmNbMV1baV0gPDwgODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlNdWx0aUNoOCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMpIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA8PCA4OworICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMsCisgICAgICAgIHVuc2lnbmVkIGJpdHNQZXJTYW1wbGUpIHsKKyAgICBjb25zdCBpbnQgbGVmdFNoaWZ0ID0gMTYgLSAoaW50KWJpdHNQZXJTYW1wbGU7IC8vIGNhc3QgdG8gaW50IHRvIHByZXZlbnQgdW5zaWduZWQgb3ZlcmZsb3cuCisgICAgaWYgKGxlZnRTaGlmdCA+PSAwKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPDwgbGVmdFNoaWZ0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgaW50IHJpZ2h0U2hpZnQgPSAtbGVmdFNoaWZ0OworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldID4+IHJpZ2h0U2hpZnQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlNb25vMTYoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAorc3RhdGljIHZvaWQgY29weVRvRmxvYXQoCisgICAgICAgIGZsb2F0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqY29uc3QgKnNyYywKICAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW8xNigKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV07Ci0gICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlNdWx0aUNoMTYoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzKSB7CisgICAgICAgIHVuc2lnbmVkIG5DaGFubmVscywKKyAgICAgICAgdW5zaWduZWQgYml0c1BlclNhbXBsZSkgeworICAgIGNvbnN0IHVuc2lnbmVkIGxlZnRTaGlmdCA9IDMyIC0gYml0c1BlclNhbXBsZTsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewogICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gVE9ETzogMjQtYml0IHZlcnNpb25zIHNob3VsZCBkbyBkaXRoZXJpbmcgb3Igbm9pc2Utc2hhcGluZywgaGVyZSBvciBpbiBBdWRpb0ZsaW5nZXIKLXN0YXRpYyB2b2lkIGNvcHlNb25vMjQoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldID4+IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvMjQoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldID4+IDg7Ci0gICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXSA+PiA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weU11bHRpQ2gyNCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMpIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA+PiA4OworICAgICAgICAgICAgKmRzdCsrID0gZmxvYXRfZnJvbV9pMzIoc3JjW2NdW2ldIDw8IGxlZnRTaGlmdCk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yMzgsOCArMTc4LDcgQEAKICAgICAgIG1TdHJlYW1JbmZvVmFsaWQoZmFsc2UpLAogICAgICAgbVdyaXRlUmVxdWVzdGVkKGZhbHNlKSwKICAgICAgIG1Xcml0ZUNvbXBsZXRlZChmYWxzZSksCi0gICAgICBtRXJyb3JTdGF0dXMoKEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cykgLTEpLAotICAgICAgbUNvcHkobnVsbHB0cikgeworICAgICAgbUVycm9yU3RhdHVzKChGTEFDX19TdHJlYW1EZWNvZGVyRXJyb3JTdGF0dXMpIC0xKSB7CiAgICAgQUxPR1YoImN0b3I6Iik7CiAgICAgbWVtc2V0KCZtU3RyZWFtSW5mbywgMCwgc2l6ZW9mKG1TdHJlYW1JbmZvKSk7CiAgICAgbWVtc2V0KCZtV3JpdGVIZWFkZXIsIDAsIHNpemVvZihtV3JpdGVIZWFkZXIpKTsKQEAgLTM3OSw2ICszMTgsNyBAQAogICAgICAgICBjYXNlIDg6CiAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgIGNhc2UgMzI6IC8vIGdlbmVyYWxseSByYXJlLCBidXQgaXMgc3VwcG9ydGVkIGluIHRoZSBmcmFtZXdvcmsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CkBAIC0zODcsMzEgKzMyNyw2IEBACiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIC8vIGNvbmZpZ3VyZSB0aGUgYXBwcm9wcmlhdGUgY29weSBmdW5jdGlvbiwgZGVmYXVsdGluZyB0byB0cmVzcGFzcwotICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewotICAgICAgICB1bnNpZ25lZCBtQ2hhbm5lbHM7Ci0gICAgICAgIHVuc2lnbmVkIG1CaXRzUGVyU2FtcGxlOwotICAgICAgICB2b2lkICgqbUNvcHkpKGludDE2X3QgKmRzdCwgY29uc3QgaW50ICogc3JjW2tNYXhDaGFubmVsc10sCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscyk7Ci0gICAgfSB0YWJsZVtdID0gewotICAgICAgICB7IDEsICA4LCBjb3B5TW9ubzggICAgIH0sCi0gICAgICAgIHsgMiwgIDgsIGNvcHlTdGVyZW84ICAgfSwKLSAgICAgICAgeyA4LCAgOCwgY29weU11bHRpQ2g4ICB9LAotICAgICAgICB7IDEsIDE2LCBjb3B5TW9ubzE2ICAgIH0sCi0gICAgICAgIHsgMiwgMTYsIGNvcHlTdGVyZW8xNiAgfSwKLSAgICAgICAgeyA4LCAxNiwgY29weU11bHRpQ2gxNiB9LAotICAgICAgICB7IDEsIDI0LCBjb3B5TW9ubzI0ICAgIH0sCi0gICAgICAgIHsgMiwgMjQsIGNvcHlTdGVyZW8yNCAgfSwKLSAgICAgICAgeyA4LCAyNCwgY29weU11bHRpQ2gyNCB9LAotICAgIH07Ci0gICAgZm9yIChjb25zdCBhdXRvICZlbnRyeSA6IHRhYmxlKSB7Ci0gICAgICAgIGlmIChlbnRyeS5tQ2hhbm5lbHMgPj0gZ2V0Q2hhbm5lbHMoKSAmJgotICAgICAgICAgICAgICAgIGVudHJ5Lm1CaXRzUGVyU2FtcGxlID09IGdldEJpdHNQZXJTYW1wbGUoKSkgewotICAgICAgICAgICAgbUNvcHkgPSBlbnRyeS5tQ29weTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLy8gTm93IHdlIGhhdmUgYWxsIG1ldGFkYXRhIGJsb2Nrcy4KICAgICBtQnVmZmVyUG9zID0gMDsKICAgICBtQnVmZmVyRGF0YVNpemUgPSAwOwpAQCAtNDIwLDcgKzMzNSw3IEBACiB9CiAKIHN0YXR1c190IEZMQUNEZWNvZGVyOjpkZWNvZGVPbmVGcmFtZShjb25zdCB1aW50OF90ICppbkJ1ZmZlciwgc2l6ZV90IGluQnVmZmVyTGVuLAotICAgICAgICBpbnQxNl90ICpvdXRCdWZmZXIsIHNpemVfdCAqb3V0QnVmZmVyTGVuKSB7CisgICAgICAgIHZvaWQgKm91dEJ1ZmZlciwgc2l6ZV90ICpvdXRCdWZmZXJMZW4sIGJvb2wgb3V0cHV0RmxvYXQpIHsKICAgICBBTE9HVigiZGVjb2RlT25lRnJhbWU6IGlucHV0IHNpemUoJXp1KSIsIGluQnVmZmVyTGVuKTsKIAogICAgIGlmICghbVN0cmVhbUluZm9WYWxpZCkgewpAQCAtNDY5LDIxICszODQsMzMgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IGJsb2Nrc2l6ZSAqIGdldENoYW5uZWxzKCkgKiBzaXplb2YoaW50MTZfdCk7CisgICAgY29uc3QgdW5zaWduZWQgY2hhbm5lbHMgPSBnZXRDaGFubmVscygpOworICAgIGNvbnN0IHNpemVfdCBzYW1wbGVTaXplID0gb3V0cHV0RmxvYXQgPyBzaXplb2YoZmxvYXQpIDogc2l6ZW9mKGludDE2X3QpOworICAgIGNvbnN0IHNpemVfdCBmcmFtZVNpemUgPSBjaGFubmVscyAqIHNhbXBsZVNpemU7CisgICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBibG9ja3NpemUgKiBmcmFtZVNpemU7CiAgICAgaWYgKGJ1ZmZlclNpemUgPiAqb3V0QnVmZmVyTGVuKSB7CiAgICAgICAgIEFMT0dXKCJkZWNvZGVPbmVGcmFtZTogb3V0cHV0IGJ1ZmZlciBob2xkcyBvbmx5IHBhcnRpYWwgZnJhbWUgJXp1OiV6dSIsCiAgICAgICAgICAgICAgICAgKm91dEJ1ZmZlckxlbiwgYnVmZmVyU2l6ZSk7Ci0gICAgICAgIGJsb2Nrc2l6ZSA9ICpvdXRCdWZmZXJMZW4gLyAoZ2V0Q2hhbm5lbHMoKSAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgICAgIGJ1ZmZlclNpemUgPSBibG9ja3NpemUgKiBnZXRDaGFubmVscygpICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICBibG9ja3NpemUgPSAqb3V0QnVmZmVyTGVuIC8gZnJhbWVTaXplOworICAgICAgICBidWZmZXJTaXplID0gYmxvY2tzaXplICogZnJhbWVTaXplOwogICAgIH0KIAotICAgIGlmIChtQ29weSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJkZWNvZGVPbmVGcmFtZTogZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQ6IGNoYW5uZWxzKCVkKSwgQml0c1BlclNhbXBsZSglZCkiLAotICAgICAgICAgICAgICAgIGdldENoYW5uZWxzKCksIGdldEJpdHNQZXJTYW1wbGUoKSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9CiAgICAgLy8gY29weSBQQ00gZnJvbSBGTEFDIHdyaXRlIGJ1ZmZlciB0byBvdXRwdXQgYnVmZmVyLCB3aXRoIGludGVybGVhdmluZwotICAgICgqbUNvcHkpKG91dEJ1ZmZlciwgbVdyaXRlQnVmZmVyLCBibG9ja3NpemUsIGdldENoYW5uZWxzKCkpOworCisgICAgY29uc3QgdW5zaWduZWQgYml0c1BlclNhbXBsZSA9IGdldEJpdHNQZXJTYW1wbGUoKTsKKyAgICBpZiAob3V0cHV0RmxvYXQpIHsKKyAgICAgICAgY29weVRvRmxvYXQocmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KG91dEJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgIG1Xcml0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tzaXplLAorICAgICAgICAgICAgICAgICAgICBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgYml0c1BlclNhbXBsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29weVRvMTZTaWduZWQocmVpbnRlcnByZXRfY2FzdDxzaG9ydCo+KG91dEJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgIG1Xcml0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgYml0c1BlclNhbXBsZSk7CisgICAgfQogICAgICpvdXRCdWZmZXJMZW4gPSBidWZmZXJTaXplOwogICAgIHJldHVybiBPSzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5oCmluZGV4IGFmNDE5YTIuLjY5NGZjY2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuaApAQCAtNDEsNyArNDEsNyBAQAogCiAgICAgc3RhdHVzX3QgcGFyc2VNZXRhZGF0YShjb25zdCB1aW50OF90ICppbkJ1ZmZlciwgc2l6ZV90IGluQnVmZmVyTGVuKTsKICAgICBzdGF0dXNfdCBkZWNvZGVPbmVGcmFtZShjb25zdCB1aW50OF90ICppbkJ1ZmZlciwgc2l6ZV90IGluQnVmZmVyTGVuLAotICAgICAgICAgICAgaW50MTZfdCAqb3V0QnVmZmVyLCBzaXplX3QgKm91dEJ1ZmZlckxlbik7CisgICAgICAgICAgICB2b2lkICpvdXRCdWZmZXIsIHNpemVfdCAqb3V0QnVmZmVyTGVuLCBib29sIG91dHB1dEZsb2F0ID0gZmFsc2UpOwogICAgIHZvaWQgZmx1c2goKTsKICAgICB2aXJ0dWFsIH5GTEFDRGVjb2RlcigpOwogCkBAIC04OSw4ICs4OSw2IEBACiAgICAgLy8gbW9zdCByZWNlbnQgZXJyb3IgcmVwb3J0ZWQgYnkgbGliRkxBQyBkZWNvZGVyCiAgICAgRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIG1FcnJvclN0YXR1czsKIAotICAgIHZvaWQgKCptQ29weSkoaW50MTZfdCAqZHN0LCBjb25zdCBpbnQgKnNyY1trTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKTsKLQogICAgIHN0YXR1c190IGluaXQoKTsKIAogICAgIC8vIEZMQUMgc3RyZWFtIGRlY29kZXIgY2FsbGJhY2tzIGFzIEMrKyBpbnN0YW5jZSBtZXRob2RzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgzN2Y2Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUFTdGF0ZTo6QVN0YXRlKGNvbnN0IHNwPEFTdGF0ZT4gJnBhcmVudFN0YXRlKQotICAgIDogbVBhcmVudFN0YXRlKHBhcmVudFN0YXRlKSB7Ci19Ci0KLUFTdGF0ZTo6fkFTdGF0ZSgpIHsKLX0KLQotc3A8QVN0YXRlPiBBU3RhdGU6OnBhcmVudFN0YXRlKCkgewotICAgIHJldHVybiBtUGFyZW50U3RhdGU7Ci19Ci0KLXZvaWQgQVN0YXRlOjpzdGF0ZUVudGVyZWQoKSB7Ci19Ci0KLXZvaWQgQVN0YXRlOjpzdGF0ZUV4aXRlZCgpIHsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6QUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSgpIHsKLX0KLQotQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6fkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKSB7Ci19Ci0KLXZvaWQgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6aGFuZGxlTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIHNwPEFTdGF0ZT4gc2F2ZSA9IG1TdGF0ZTsKLQotICAgIHNwPEFTdGF0ZT4gY3VyID0gbVN0YXRlOwotICAgIHdoaWxlIChjdXIgIT0gTlVMTCAmJiAhY3VyLT5vbk1lc3NhZ2VSZWNlaXZlZChtc2cpKSB7Ci0gICAgICAgIC8vIElmIHlvdSBjbGFpbSBub3QgdG8gaGF2ZSBoYW5kbGVkIHRoZSBtZXNzYWdlIHlvdSBzaG91bGRuJ3QKLSAgICAgICAgLy8gaGF2ZSBjYWxsZWQgc2V0U3RhdGUuLi4KLSAgICAgICAgQ0hFQ0soc2F2ZSA9PSBtU3RhdGUpOwotCi0gICAgICAgIGN1ciA9IGN1ci0+cGFyZW50U3RhdGUoKTsKLSAgICB9Ci0KLSAgICBpZiAoY3VyICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFMT0dXKCJXYXJuaW5nIG1lc3NhZ2UgJXMgdW5oYW5kbGVkIGluIHJvb3Qgc3RhdGUuIiwKLSAgICAgICAgIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKLX0KLQotdm9pZCBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjpjaGFuZ2VTdGF0ZShjb25zdCBzcDxBU3RhdGU+ICZzdGF0ZSkgewotICAgIGlmIChzdGF0ZSA9PSBtU3RhdGUpIHsKLSAgICAgICAgLy8gUXVpY2sgZXhpdCBmb3IgdGhlIGVhc3kgY2FzZS4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFZlY3RvcjxzcDxBU3RhdGU+ID4gQTsKLSAgICBzcDxBU3RhdGU+IGN1ciA9IG1TdGF0ZTsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIEEucHVzaChjdXIpOwotICAgICAgICBpZiAoY3VyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGN1ciA9IGN1ci0+cGFyZW50U3RhdGUoKTsKLSAgICB9Ci0KLSAgICBWZWN0b3I8c3A8QVN0YXRlPiA+IEI7Ci0gICAgY3VyID0gc3RhdGU7Ci0gICAgZm9yICg7OykgewotICAgICAgICBCLnB1c2goY3VyKTsKLSAgICAgICAgaWYgKGN1ciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7Ci0gICAgfQotCi0gICAgLy8gUmVtb3ZlIHRoZSBjb21tb24gdGFpbC4KLSAgICB3aGlsZSAoQS5zaXplKCkgPiAwICYmIEIuc2l6ZSgpID4gMCAmJiBBLnRvcCgpID09IEIudG9wKCkpIHsKLSAgICAgICAgQS5wb3AoKTsKLSAgICAgICAgQi5wb3AoKTsKLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBzdGF0ZTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQS5zaXplKCk7ICsraSkgewotICAgICAgICBBLmVkaXRJdGVtQXQoaSktPnN0YXRlRXhpdGVkKCk7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IEIuc2l6ZSgpOyBpID4gMDspIHsKLSAgICAgICAgaS0tOwotICAgICAgICBCLmVkaXRJdGVtQXQoaSktPnN0YXRlRW50ZXJlZCgpOwotICAgIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCmluZGV4IDVlNzZjNjcuLmEyNzY3MjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcApAQCAtMTcwLDcgKzE3MCw5IEBACiAKICAgICBpbnQ2NF90IHdoZW5VczsKICAgICBpZiAoZGVsYXlVcyA+IDApIHsKLSAgICAgICAgd2hlblVzID0gR2V0Tm93VXMoKSArIGRlbGF5VXM7CisgICAgICAgIGludDY0X3Qgbm93VXMgPSBHZXROb3dVcygpOworICAgICAgICB3aGVuVXMgPSAoZGVsYXlVcyA+IElOVDY0X01BWCAtIG5vd1VzID8gSU5UNjRfTUFYIDogbm93VXMgKyBkZWxheVVzKTsKKwogICAgIH0gZWxzZSB7CiAgICAgICAgIHdoZW5VcyA9IEdldE5vd1VzKCk7CiAgICAgfQpAQCAtMjA4LDYgKzIxMCw5IEBACiAKICAgICAgICAgaWYgKHdoZW5VcyA+IG5vd1VzKSB7CiAgICAgICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSB3aGVuVXMgLSBub3dVczsKKyAgICAgICAgICAgIGlmIChkZWxheVVzID4gSU5UNjRfTUFYIC8gMTAwMCkgeworICAgICAgICAgICAgICAgIGRlbGF5VXMgPSBJTlQ2NF9NQVggLyAxMDAwOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbVF1ZXVlQ2hhbmdlZENvbmRpdGlvbi53YWl0UmVsYXRpdmUobUxvY2ssIGRlbGF5VXMgKiAxMDAwbGwpOwogCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFmZGMzNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTmV0d29ya1Nlc3Npb24iCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJBTmV0d29ya1Nlc3Npb24uaCIKLSNpbmNsdWRlICJQYXJzZWRNZXNzYWdlLmgiCi0KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgotI2luY2x1ZGUgPG5ldC9pZi5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4VURQU2l6ZSA9IDE1MDA7Ci1zdGF0aWMgY29uc3QgaW50MzJfdCBrTWF4VURQUmV0cmllcyA9IDIwMDsKLQotc3RydWN0IEFOZXR3b3JrU2Vzc2lvbjo6TmV0d29ya1RocmVhZCA6IHB1YmxpYyBUaHJlYWQgewotICAgIGV4cGxpY2l0IE5ldHdvcmtUaHJlYWQoQU5ldHdvcmtTZXNzaW9uICpzZXNzaW9uKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfk5ldHdvcmtUaHJlYWQoKTsKLQotcHJpdmF0ZToKLSAgICBBTmV0d29ya1Nlc3Npb24gKm1TZXNzaW9uOwotCi0gICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE5ldHdvcmtUaHJlYWQpOwotfTsKLQotc3RydWN0IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbiA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBlbnVtIE1vZGUgewotICAgICAgICBNT0RFX1JUU1AsCi0gICAgICAgIE1PREVfREFUQUdSQU0sCi0gICAgICAgIE1PREVfV0VCU09DS0VULAotICAgIH07Ci0KLSAgICBlbnVtIFN0YXRlIHsKLSAgICAgICAgQ09OTkVDVElORywKLSAgICAgICAgQ09OTkVDVEVELAotICAgICAgICBMSVNURU5JTkdfUlRTUCwKLSAgICAgICAgTElTVEVOSU5HX1RDUF9ER1JBTVMsCi0gICAgICAgIERBVEFHUkFNLAotICAgIH07Ci0KLSAgICBTZXNzaW9uKGludDMyX3Qgc2Vzc2lvbklELAotICAgICAgICAgICAgU3RhdGUgc3RhdGUsCi0gICAgICAgICAgICBpbnQgcywKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKLQotICAgIGludDMyX3Qgc2Vzc2lvbklEKCkgY29uc3Q7Ci0gICAgaW50IHNvY2tldCgpIGNvbnN0OwotICAgIHNwPEFNZXNzYWdlPiBnZXROb3RpZmljYXRpb25NZXNzYWdlKCkgY29uc3Q7Ci0KLSAgICBib29sIGlzUlRTUFNlcnZlcigpIGNvbnN0OwotICAgIGJvb2wgaXNUQ1BEYXRhZ3JhbVNlcnZlcigpIGNvbnN0OwotCi0gICAgYm9vbCB3YW50c1RvUmVhZCgpOwotICAgIGJvb2wgd2FudHNUb1dyaXRlKCk7Ci0KLSAgICBzdGF0dXNfdCByZWFkTW9yZSgpOwotICAgIHN0YXR1c190IHdyaXRlTW9yZSgpOwotCi0gICAgc3RhdHVzX3Qgc2VuZFJlcXVlc3QoCi0gICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzc2l6ZV90IHNpemUsIGJvb2wgdGltZVZhbGlkLCBpbnQ2NF90IHRpbWVVcyk7Ci0KLSAgICB2b2lkIHNldE1vZGUoTW9kZSBtb2RlKTsKLQotICAgIHN0YXR1c190IHN3aXRjaFRvV2ViU29ja2V0TW9kZSgpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+U2Vzc2lvbigpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBGUkFHTUVOVF9GTEFHX1RJTUVfVkFMSUQgPSAxLAotICAgIH07Ci0gICAgc3RydWN0IEZyYWdtZW50IHsKLSAgICAgICAgdWludDMyX3QgbUZsYWdzOwotICAgICAgICBpbnQ2NF90IG1UaW1lVXM7Ci0gICAgICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7Ci0gICAgfTsKLQotICAgIGludDMyX3QgbVNlc3Npb25JRDsKLSAgICBTdGF0ZSBtU3RhdGU7Ci0gICAgTW9kZSBtTW9kZTsKLSAgICBpbnQgbVNvY2tldDsKLSAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKLSAgICBib29sIG1TYXdSZWNlaXZlRmFpbHVyZSwgbVNhd1NlbmRGYWlsdXJlOwotICAgIGludDMyX3QgbVVEUFJldHJpZXM7Ci0KLSAgICBMaXN0PEZyYWdtZW50PiBtT3V0RnJhZ21lbnRzOwotCi0gICAgQVN0cmluZyBtSW5CdWZmZXI7Ci0KLSAgICBpbnQ2NF90IG1MYXN0U3RhbGxSZXBvcnRVczsKLQotICAgIHZvaWQgbm90aWZ5RXJyb3IoYm9vbCBzZW5kLCBzdGF0dXNfdCBlcnIsIGNvbnN0IGNoYXIgKmRldGFpbCk7Ci0gICAgdm9pZCBub3RpZnkoTm90aWZpY2F0aW9uUmVhc29uIHJlYXNvbik7Ci0KLSAgICB2b2lkIGR1bXBGcmFnbWVudFN0YXRzKGNvbnN0IEZyYWdtZW50ICZmcmFnKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNlc3Npb24pOwotfTsKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLUFOZXR3b3JrU2Vzc2lvbjo6TmV0d29ya1RocmVhZDo6TmV0d29ya1RocmVhZChBTmV0d29ya1Nlc3Npb24gKnNlc3Npb24pCi0gICAgOiBtU2Vzc2lvbihzZXNzaW9uKSB7Ci19Ci0KLUFOZXR3b3JrU2Vzc2lvbjo6TmV0d29ya1RocmVhZDo6fk5ldHdvcmtUaHJlYWQoKSB7Ci19Ci0KLWJvb2wgQU5ldHdvcmtTZXNzaW9uOjpOZXR3b3JrVGhyZWFkOjp0aHJlYWRMb29wKCkgewotICAgIG1TZXNzaW9uLT50aHJlYWRMb29wKCk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpTZXNzaW9uKAotICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwKLSAgICAgICAgU3RhdGUgc3RhdGUsCi0gICAgICAgIGludCBzLAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkKLSAgICA6IG1TZXNzaW9uSUQoc2Vzc2lvbklEKSwKLSAgICAgIG1TdGF0ZShzdGF0ZSksCi0gICAgICBtTW9kZShNT0RFX0RBVEFHUkFNKSwKLSAgICAgIG1Tb2NrZXQocyksCi0gICAgICBtTm90aWZ5KG5vdGlmeSksCi0gICAgICBtU2F3UmVjZWl2ZUZhaWx1cmUoZmFsc2UpLAotICAgICAgbVNhd1NlbmRGYWlsdXJlKGZhbHNlKSwKLSAgICAgIG1VRFBSZXRyaWVzKGtNYXhVRFBSZXRyaWVzKSwKLSAgICAgIG1MYXN0U3RhbGxSZXBvcnRVcygtMWxsKSB7Ci0gICAgaWYgKG1TdGF0ZSA9PSBDT05ORUNURUQpIHsKLSAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIGxvY2FsQWRkcjsKLSAgICAgICAgc29ja2xlbl90IGxvY2FsQWRkckxlbiA9IHNpemVvZihsb2NhbEFkZHIpOwotCi0gICAgICAgIGludCByZXMgPSBnZXRzb2NrbmFtZSgKLSAgICAgICAgICAgICAgICBtU29ja2V0LCAoc3RydWN0IHNvY2thZGRyICopJmxvY2FsQWRkciwgJmxvY2FsQWRkckxlbik7Ci0gICAgICAgIENIRUNLX0dFKHJlcywgMCk7Ci0KLSAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIHJlbW90ZUFkZHI7Ci0gICAgICAgIHNvY2tsZW5fdCByZW1vdGVBZGRyTGVuID0gc2l6ZW9mKHJlbW90ZUFkZHIpOwotCi0gICAgICAgIHJlcyA9IGdldHBlZXJuYW1lKAotICAgICAgICAgICAgICAgIG1Tb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcmVtb3RlQWRkciwgJnJlbW90ZUFkZHJMZW4pOwotICAgICAgICBDSEVDS19HRShyZXMsIDApOwotCi0gICAgICAgIGluX2FkZHJfdCBhZGRyID0gbnRvaGwobG9jYWxBZGRyLnNpbl9hZGRyLnNfYWRkcik7Ci0gICAgICAgIEFTdHJpbmcgbG9jYWxBZGRyU3RyaW5nID0gQVN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAiJWQuJWQuJWQuJWQiLAotICAgICAgICAgICAgICAgIChhZGRyID4+IDI0KSwKLSAgICAgICAgICAgICAgICAoYWRkciA+PiAxNikgJiAweGZmLAotICAgICAgICAgICAgICAgIChhZGRyID4+IDgpICYgMHhmZiwKLSAgICAgICAgICAgICAgICBhZGRyICYgMHhmZik7Ci0KLSAgICAgICAgYWRkciA9IG50b2hsKHJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyKTsKLSAgICAgICAgQVN0cmluZyByZW1vdGVBZGRyU3RyaW5nID0gQVN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICAgICAiJWQuJWQuJWQuJWQiLAotICAgICAgICAgICAgICAgIChhZGRyID4+IDI0KSwKLSAgICAgICAgICAgICAgICAoYWRkciA+PiAxNikgJiAweGZmLAotICAgICAgICAgICAgICAgIChhZGRyID4+IDgpICYgMHhmZiwKLSAgICAgICAgICAgICAgICBhZGRyICYgMHhmZik7Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICBtc2ctPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigicmVhc29uIiwga1doYXRDbGllbnRDb25uZWN0ZWQpOwotICAgICAgICBtc2ctPnNldFN0cmluZygic2VydmVyLWlwIiwgbG9jYWxBZGRyU3RyaW5nLmNfc3RyKCkpOwotICAgICAgICBtc2ctPnNldEludDMyKCJzZXJ2ZXItcG9ydCIsIG50b2hzKGxvY2FsQWRkci5zaW5fcG9ydCkpOwotICAgICAgICBtc2ctPnNldFN0cmluZygiY2xpZW50LWlwIiwgcmVtb3RlQWRkclN0cmluZy5jX3N0cigpKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigiY2xpZW50LXBvcnQiLCBudG9ocyhyZW1vdGVBZGRyLnNpbl9wb3J0KSk7Ci0gICAgICAgIG1zZy0+cG9zdCgpOwotICAgIH0KLX0KLQotQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjp+U2Vzc2lvbigpIHsKLSAgICBBTE9HVigiU2Vzc2lvbiAlZCBnb25lIiwgbVNlc3Npb25JRCk7Ci0KLSAgICBjbG9zZShtU29ja2V0KTsKLSAgICBtU29ja2V0ID0gLTE7Ci19Ci0KLWludDMyX3QgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpzZXNzaW9uSUQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TZXNzaW9uSUQ7Ci19Ci0KLWludCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OnNvY2tldCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNvY2tldDsKLX0KLQotdm9pZCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OnNldE1vZGUoTW9kZSBtb2RlKSB7Ci0gICAgbU1vZGUgPSBtb2RlOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OnN3aXRjaFRvV2ViU29ja2V0TW9kZSgpIHsKLSAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RFRCB8fCBtTW9kZSAhPSBNT0RFX1JUU1ApIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIG1Nb2RlID0gTU9ERV9XRUJTT0NLRVQ7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPEFNZXNzYWdlPiBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OmdldE5vdGlmaWNhdGlvbk1lc3NhZ2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Ob3RpZnk7Ci19Ci0KLWJvb2wgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjppc1JUU1BTZXJ2ZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TdGF0ZSA9PSBMSVNURU5JTkdfUlRTUDsKLX0KLQotYm9vbCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OmlzVENQRGF0YWdyYW1TZXJ2ZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TdGF0ZSA9PSBMSVNURU5JTkdfVENQX0RHUkFNUzsKLX0KLQotYm9vbCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OndhbnRzVG9SZWFkKCkgewotICAgIHJldHVybiAhbVNhd1JlY2VpdmVGYWlsdXJlICYmIG1TdGF0ZSAhPSBDT05ORUNUSU5HOwotfQotCi1ib29sIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6d2FudHNUb1dyaXRlKCkgewotICAgIHJldHVybiAhbVNhd1NlbmRGYWlsdXJlCi0gICAgICAgICYmIChtU3RhdGUgPT0gQ09OTkVDVElORwotICAgICAgICAgICAgfHwgKG1TdGF0ZSA9PSBDT05ORUNURUQgJiYgIW1PdXRGcmFnbWVudHMuZW1wdHkoKSkKLSAgICAgICAgICAgIHx8IChtU3RhdGUgPT0gREFUQUdSQU0gJiYgIW1PdXRGcmFnbWVudHMuZW1wdHkoKSkpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OnJlYWRNb3JlKCkgewotICAgIGlmIChtU3RhdGUgPT0gREFUQUdSQU0pIHsKLSAgICAgICAgQ0hFQ0tfRVEobU1vZGUsIE1PREVfREFUQUdSQU0pOwotCi0gICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmID0gbmV3IEFCdWZmZXIoa01heFVEUFNpemUpOwotCi0gICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVtb3RlQWRkcjsKLSAgICAgICAgICAgIHNvY2tsZW5fdCByZW1vdGVBZGRyTGVuID0gc2l6ZW9mKHJlbW90ZUFkZHIpOwotCi0gICAgICAgICAgICBzc2l6ZV90IG47Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgbiA9IHJlY3Zmcm9tKAotICAgICAgICAgICAgICAgICAgICAgICAgbVNvY2tldCwgYnVmLT5kYXRhKCksIGJ1Zi0+Y2FwYWNpdHkoKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmcmVtb3RlQWRkciwgJnJlbW90ZUFkZHJMZW4pOwotICAgICAgICAgICAgfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gLUVDT05OUkVTRVQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1Zi0+c2V0UmFuZ2UoMCwgbik7Ci0KLSAgICAgICAgICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICAgICAgICAgICAgICBidWYtPm1ldGEoKS0+c2V0SW50NjQoImFycml2YWxUaW1lVXMiLCBub3dVcyk7Ci0KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicmVhc29uIiwga1doYXREYXRhZ3JhbSk7Ci0KLSAgICAgICAgICAgICAgICB1aW50MzJfdCBpcCA9IG50b2hsKHJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJmcm9tQWRkciIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIldS4ldS4ldS4ldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXAgPj4gMjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlwID4+IDE2KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlwID4+IDgpICYgMHhmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcCAmIDB4ZmYpLmNfc3RyKCkpOwotCi0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZnJvbVBvcnQiLCBudG9ocyhyZW1vdGVBZGRyLnNpbl9wb3J0KSk7Ci0KLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiZGF0YSIsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKGVyciA9PSBPSyk7Ci0KLSAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOKSB7Ci0gICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGlmICghbVVEUFJldHJpZXMpIHsKLSAgICAgICAgICAgICAgICBub3RpZnlFcnJvcihmYWxzZSAvKiBzZW5kICovLCBlcnIsICJSZWN2ZnJvbSBmYWlsZWQuIik7Ci0gICAgICAgICAgICAgICAgbVNhd1JlY2VpdmVGYWlsdXJlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVVEUFJldHJpZXMtLTsKLSAgICAgICAgICAgICAgICBBTE9HRSgiUmVjdmZyb20gZmFpbGVkLCAlZC8lZCByZXRyaWVzIGxlZnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgbVVEUFJldHJpZXMsIGtNYXhVRFBSZXRyaWVzKTsKLSAgICAgICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1VRFBSZXRyaWVzID0ga01heFVEUFJldHJpZXM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGNoYXIgdG1wWzUxMl07Ci0gICAgc3NpemVfdCBuOwotICAgIGRvIHsKLSAgICAgICAgbiA9IHJlY3YobVNvY2tldCwgdG1wLCBzaXplb2YodG1wKSwgMCk7Ci0gICAgfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBpZiAobiA+IDApIHsKLSAgICAgICAgbUluQnVmZmVyLmFwcGVuZCh0bXAsIG4pOwotCi0jaWYgMAotICAgICAgICBBTE9HSSgiaW46Iik7Ci0gICAgICAgIGhleGR1bXAodG1wLCBuKTsKLSNlbmRpZgotICAgIH0gZWxzZSBpZiAobiA8IDApIHsKLSAgICAgICAgZXJyID0gLWVycm5vOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IC1FQ09OTlJFU0VUOwotICAgIH0KLQotICAgIGlmIChtTW9kZSA9PSBNT0RFX0RBVEFHUkFNKSB7Ci0gICAgICAgIC8vIFRDUCBzdHJlYW0gY2FycnlpbmcgMTYtYml0IGxlbmd0aC1wcmVmaXhlZCBkYXRhZ3JhbXMuCi0KLSAgICAgICAgd2hpbGUgKG1JbkJ1ZmZlci5zaXplKCkgPj0gMikgewotICAgICAgICAgICAgc2l6ZV90IHBhY2tldFNpemUgPSBVMTZfQVQoKGNvbnN0IHVpbnQ4X3QgKiltSW5CdWZmZXIuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgIGlmIChtSW5CdWZmZXIuc2l6ZSgpIDwgcGFja2V0U2l6ZSArIDIpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gcGFja2V0ID0gbmV3IEFCdWZmZXIocGFja2V0U2l6ZSk7Ci0gICAgICAgICAgICBtZW1jcHkocGFja2V0LT5kYXRhKCksIG1JbkJ1ZmZlci5jX3N0cigpICsgMiwgcGFja2V0U2l6ZSk7Ci0KLSAgICAgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgICAgICAgICAgcGFja2V0LT5tZXRhKCktPnNldEludDY0KCJhcnJpdmFsVGltZVVzIiwgbm93VXMpOwotCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0RGF0YWdyYW0pOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImRhdGEiLCBwYWNrZXQpOwotICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0KLSAgICAgICAgICAgIG1JbkJ1ZmZlci5lcmFzZSgwLCBwYWNrZXRTaXplICsgMik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1Nb2RlID09IE1PREVfUlRTUCkgewotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICBzaXplX3QgbGVuZ3RoOwotCi0gICAgICAgICAgICBpZiAobUluQnVmZmVyLnNpemUoKSA+IDAgJiYgbUluQnVmZmVyLmNfc3RyKClbMF0gPT0gJyQnKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1JbkJ1ZmZlci5zaXplKCkgPCA0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxlbmd0aCA9IFUxNl9BVCgoY29uc3QgdWludDhfdCAqKW1JbkJ1ZmZlci5jX3N0cigpICsgMik7Ci0KLSAgICAgICAgICAgICAgICBpZiAobUluQnVmZmVyLnNpemUoKSA8IDQgKyBsZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0QmluYXJ5RGF0YSk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbCIsIG1JbkJ1ZmZlci5jX3N0cigpWzFdKTsKLQotICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGRhdGEgPSBuZXcgQUJ1ZmZlcihsZW5ndGgpOwotICAgICAgICAgICAgICAgIG1lbWNweShkYXRhLT5kYXRhKCksIG1JbkJ1ZmZlci5jX3N0cigpICsgNCwgbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgICAgICAgICAgICAgIGRhdGEtPm1ldGEoKS0+c2V0SW50NjQoImFycml2YWxUaW1lVXMiLCBub3dVcyk7Ci0KLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiZGF0YSIsIGRhdGEpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotCi0gICAgICAgICAgICAgICAgbUluQnVmZmVyLmVyYXNlKDAsIDQgKyBsZW5ndGgpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxQYXJzZWRNZXNzYWdlPiBtc2cgPQotICAgICAgICAgICAgICAgIFBhcnNlZE1lc3NhZ2U6OlBhcnNlKAotICAgICAgICAgICAgICAgICAgICAgICAgbUluQnVmZmVyLmNfc3RyKCksIG1JbkJ1ZmZlci5zaXplKCksIGVyciAhPSBPSywgJmxlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmIChtc2cgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0RGF0YSk7Ci0gICAgICAgICAgICBub3RpZnktPnNldE9iamVjdCgiZGF0YSIsIG1zZyk7Ci0gICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLQotI2lmIDEKLSAgICAgICAgICAgIC8vIFhYWCBUaGUgKG9sZCkgZG9uZ2xlIHNlbmRzIHRoZSB3cm9uZyBjb250ZW50IGxlbmd0aCBoZWFkZXIgb24gYQotICAgICAgICAgICAgLy8gU0VUX1BBUkFNRVRFUiByZXF1ZXN0IHRoYXQgc2lnbmFscyBhICJ3ZmRfaWRyX3JlcXVlc3QiLgotICAgICAgICAgICAgLy8gKDE3IGluc3RlYWQgb2YgMTkpLgotICAgICAgICAgICAgY29uc3QgY2hhciAqY29udGVudCA9IG1zZy0+Z2V0Q29udGVudCgpOwotICAgICAgICAgICAgaWYgKGNvbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgJiYgIW1lbWNtcChjb250ZW50LCAid2ZkX2lkcl9yZXF1ZXN0XHJcbiIsIDE3KQotICAgICAgICAgICAgICAgICAgICAmJiBsZW5ndGggPj0gMTkKLSAgICAgICAgICAgICAgICAgICAgJiYgbUluQnVmZmVyLmNfc3RyKClbbGVuZ3RoXSA9PSAnXHInCi0gICAgICAgICAgICAgICAgICAgICYmIG1JbkJ1ZmZlci5jX3N0cigpW2xlbmd0aCArIDFdID09ICdcbicpIHsKLSAgICAgICAgICAgICAgICBsZW5ndGggKz0gMjsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgICAgICBtSW5CdWZmZXIuZXJhc2UoMCwgbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQ0hFQ0tfRVEobU1vZGUsIE1PREVfV0VCU09DS0VUKTsKLQotICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gKGNvbnN0IHVpbnQ4X3QgKiltSW5CdWZmZXIuY19zdHIoKTsKLSAgICAgICAgLy8gaGV4ZHVtcChkYXRhLCBtSW5CdWZmZXIuc2l6ZSgpKTsKLQotICAgICAgICB3aGlsZSAobUluQnVmZmVyLnNpemUoKSA+PSAyKSB7Ci0gICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMjsKLQotICAgICAgICAgICAgdWludDY0X3QgcGF5bG9hZExlbiA9IGRhdGFbMV0gJiAweDdmOwotICAgICAgICAgICAgaWYgKHBheWxvYWRMZW4gPT0gMTI2KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9mZnNldCArIDIgPiBtSW5CdWZmZXIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBheWxvYWRMZW4gPSBVMTZfQVQoJmRhdGFbb2Zmc2V0XSk7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBheWxvYWRMZW4gPT0gMTI3KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9mZnNldCArIDggPiBtSW5CdWZmZXIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBheWxvYWRMZW4gPSBVNjRfQVQoJmRhdGFbb2Zmc2V0XSk7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IG1hc2sgPSAwOwotICAgICAgICAgICAgaWYgKGRhdGFbMV0gJiAweDgwKSB7Ci0gICAgICAgICAgICAgICAgLy8gTUFTSz09MQotICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgKyA0ID4gbUluQnVmZmVyLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYXNrID0gVTMyX0FUKCZkYXRhW29mZnNldF0pOwotICAgICAgICAgICAgICAgIG9mZnNldCArPSA0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGF5bG9hZExlbiA+IG1JbkJ1ZmZlci5zaXplKCkgfHwgb2Zmc2V0ID4gbUluQnVmZmVyLnNpemUoKSAtIHBheWxvYWRMZW4pIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV2UgaGF2ZSB0aGUgZnVsbCBtZXNzYWdlLgotCi0gICAgICAgICAgICBzcDxBQnVmZmVyPiBwYWNrZXQgPSBuZXcgQUJ1ZmZlcihwYXlsb2FkTGVuKTsKLSAgICAgICAgICAgIG1lbWNweShwYWNrZXQtPmRhdGEoKSwgJmRhdGFbb2Zmc2V0XSwgcGF5bG9hZExlbik7Ci0KLSAgICAgICAgICAgIGlmIChtYXNrICE9IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBheWxvYWRMZW47ICsraSkgewotICAgICAgICAgICAgICAgICAgICBwYWNrZXQtPmRhdGEoKVtpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW29mZnNldCArIGldCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAoKG1hc2sgPj4gKDggKiAoMyAtIChpICUgNCkpKSkgJiAweGZmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicmVhc29uIiwga1doYXRXZWJTb2NrZXRNZXNzYWdlKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJkYXRhIiwgcGFja2V0KTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImhlYWRlckJ5dGUiLCBkYXRhWzBdKTsKLSAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotCi0gICAgICAgICAgICBtSW5CdWZmZXIuZXJhc2UoMCwgb2Zmc2V0ICsgcGF5bG9hZExlbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIG5vdGlmeUVycm9yKGZhbHNlIC8qIHNlbmQgKi8sIGVyciwgIlJlY3YgZmFpbGVkLiIpOwotICAgICAgICBtU2F3UmVjZWl2ZUZhaWx1cmUgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXZvaWQgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpkdW1wRnJhZ21lbnRTdGF0cyhjb25zdCBGcmFnbWVudCAmIC8qIGZyYWcgKi8pIHsKLSNpZiAwCi0gICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgaW50NjRfdCBkZWxheU1zID0gKG5vd1VzIC0gZnJhZy5tVGltZVVzKSAvIDEwMDBsbDsKLQotICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5EZWxheU1zID0gMDsKLSAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4RGVsYXlNcyA9IDMwMDsKLQotICAgIGNvbnN0IGNoYXIgKmtQYXR0ZXJuID0gIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiOwotICAgIHNpemVfdCBrUGF0dGVyblNpemUgPSBzdHJsZW4oa1BhdHRlcm4pOwotCi0gICAgaW50IG4gPSAoa1BhdHRlcm5TaXplICogKGRlbGF5TXMgLSBrTWluRGVsYXlNcykpCi0gICAgICAgICAgICAgICAgLyAoa01heERlbGF5TXMgLSBrTWluRGVsYXlNcyk7Ci0KLSAgICBpZiAobiA8IDApIHsKLSAgICAgICAgbiA9IDA7Ci0gICAgfSBlbHNlIGlmICgoc2l6ZV90KW4gPiBrUGF0dGVyblNpemUpIHsKLSAgICAgICAgbiA9IGtQYXR0ZXJuU2l6ZTsKLSAgICB9Ci0KLSAgICBBTE9HSSgiWyVsbGRdOiAoJTRsbGQgbXMpICVzXG4iLAotICAgICAgICAgIGZyYWcubVRpbWVVcyAvIDEwMDAsCi0gICAgICAgICAgZGVsYXlNcywKLSAgICAgICAgICBrUGF0dGVybiArIGtQYXR0ZXJuU2l6ZSAtIG4pOwotI2VuZGlmCi19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6d3JpdGVNb3JlKCkgewotICAgIGlmIChtU3RhdGUgPT0gREFUQUdSQU0pIHsKLSAgICAgICAgQ0hFQ0soIW1PdXRGcmFnbWVudHMuZW1wdHkoKSk7Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBjb25zdCBGcmFnbWVudCAmZnJhZyA9ICptT3V0RnJhZ21lbnRzLmJlZ2luKCk7Ci0gICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmZGF0YWdyYW0gPSBmcmFnLm1CdWZmZXI7Ci0KLSAgICAgICAgICAgIGludCBuOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIG4gPSBzZW5kKG1Tb2NrZXQsIGRhdGFncmFtLT5kYXRhKCksIGRhdGFncmFtLT5zaXplKCksIDApOwotICAgICAgICAgICAgfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgICAgICAgICBlcnIgPSBPSzsKLQotICAgICAgICAgICAgaWYgKG4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZyYWcubUZsYWdzICYgRlJBR01FTlRfRkxBR19USU1FX1ZBTElEKSB7Ci0gICAgICAgICAgICAgICAgICAgIGR1bXBGcmFnbWVudFN0YXRzKGZyYWcpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1PdXRGcmFnbWVudHMuZXJhc2UobU91dEZyYWdtZW50cy5iZWdpbigpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobiA8IDApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgICAgIGVyciA9IC1FQ09OTlJFU0VUOwotICAgICAgICAgICAgfQotICAgICAgICB9IHdoaWxlIChlcnIgPT0gT0sgJiYgIW1PdXRGcmFnbWVudHMuZW1wdHkoKSk7Ci0KLSAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOKSB7Ci0gICAgICAgICAgICBpZiAoIW1PdXRGcmFnbWVudHMuZW1wdHkoKSkgewotICAgICAgICAgICAgICAgIEFMT0dJKCIlenUgZGF0YWdyYW1zIHJlbWFpbiBxdWV1ZWQuIiwgbU91dEZyYWdtZW50cy5zaXplKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBpZiAoIW1VRFBSZXRyaWVzKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IodHJ1ZSAvKiBzZW5kICovLCBlcnIsICJTZW5kIGRhdGFncmFtIGZhaWxlZC4iKTsKLSAgICAgICAgICAgICAgICBtU2F3U2VuZEZhaWx1cmUgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVURQUmV0cmllcy0tOwotICAgICAgICAgICAgICAgIEFMT0dFKCJTZW5kIGRhdGFncmFtIGZhaWxlZCwgJWQvJWQgcmV0cmllcyBsZWZ0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VRFBSZXRyaWVzLCBrTWF4VURQUmV0cmllcyk7Ci0gICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVURQUmV0cmllcyA9IGtNYXhVRFBSZXRyaWVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAobVN0YXRlID09IENPTk5FQ1RJTkcpIHsKLSAgICAgICAgaW50IGVycjsKLSAgICAgICAgc29ja2xlbl90IG9wdGlvbkxlbiA9IHNpemVvZihlcnIpOwotICAgICAgICBDSEVDS19FUShnZXRzb2Nrb3B0KG1Tb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAmZXJyLCAmb3B0aW9uTGVuKSwgMCk7Ci0gICAgICAgIENIRUNLX0VRKG9wdGlvbkxlbiwgKHNvY2tsZW5fdClzaXplb2YoZXJyKSk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgICAgICBub3RpZnlFcnJvcihrV2hhdEVycm9yLCAtZXJyLCAiQ29ubmVjdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgIG1TYXdTZW5kRmFpbHVyZSA9IHRydWU7Ci0KLSAgICAgICAgICAgIHJldHVybiAtZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgbVN0YXRlID0gQ09OTkVDVEVEOwotICAgICAgICBub3RpZnkoa1doYXRDb25uZWN0ZWQpOwotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBDSEVDS19FUShtU3RhdGUsIENPTk5FQ1RFRCk7Ci0gICAgQ0hFQ0soIW1PdXRGcmFnbWVudHMuZW1wdHkoKSk7Ci0KLSAgICBzc2l6ZV90IG4gPSAtMTsKLSAgICB3aGlsZSAoIW1PdXRGcmFnbWVudHMuZW1wdHkoKSkgewotICAgICAgICBjb25zdCBGcmFnbWVudCAmZnJhZyA9ICptT3V0RnJhZ21lbnRzLmJlZ2luKCk7Ci0KLSAgICAgICAgZG8gewotICAgICAgICAgICAgbiA9IHNlbmQobVNvY2tldCwgZnJhZy5tQnVmZmVyLT5kYXRhKCksIGZyYWcubUJ1ZmZlci0+c2l6ZSgpLCAwKTsKLSAgICAgICAgfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgICAgIGlmIChuIDw9IDApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZnJhZy5tQnVmZmVyLT5zZXRSYW5nZSgKLSAgICAgICAgICAgICAgICBmcmFnLm1CdWZmZXItPm9mZnNldCgpICsgbiwgZnJhZy5tQnVmZmVyLT5zaXplKCkgLSBuKTsKLQotICAgICAgICBpZiAoZnJhZy5tQnVmZmVyLT5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmcmFnLm1GbGFncyAmIEZSQUdNRU5UX0ZMQUdfVElNRV9WQUxJRCkgewotICAgICAgICAgICAgZHVtcEZyYWdtZW50U3RhdHMoZnJhZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBtT3V0RnJhZ21lbnRzLmVyYXNlKG1PdXRGcmFnbWVudHMuYmVnaW4oKSk7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0KLSAgICBpZiAobiA8IDApIHsKLSAgICAgICAgZXJyID0gLWVycm5vOwotICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICAgIGVyciA9IC1FQ09OTlJFU0VUOwotICAgIH0KLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgbm90aWZ5RXJyb3IodHJ1ZSAvKiBzZW5kICovLCBlcnIsICJTZW5kIGZhaWxlZC4iKTsKLSAgICAgICAgbVNhd1NlbmRGYWlsdXJlID0gdHJ1ZTsKLSAgICB9Ci0KLSNpZiAwCi0gICAgaW50IG51bUJ5dGVzUXVldWVkOwotICAgIGludCByZXMgPSBpb2N0bChtU29ja2V0LCBTSU9DT1VUUSwgJm51bUJ5dGVzUXVldWVkKTsKLSAgICBpZiAocmVzID09IDAgJiYgbnVtQnl0ZXNRdWV1ZWQgPiA1MCAqIDEwMjQpIHsKLSAgICAgICAgaWYgKG51bUJ5dGVzUXVldWVkID4gNDA5NjAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiISEhIG51bUJ5dGVzUXVldWVkID0gJWQiLCBudW1CeXRlc1F1ZXVlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLQotICAgICAgICBpZiAobUxhc3RTdGFsbFJlcG9ydFVzIDwgMGxsCi0gICAgICAgICAgICAgICAgfHwgbm93VXMgPiBtTGFzdFN0YWxsUmVwb3J0VXMgKyAxMDAwMDBsbCkgewotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgICAgICBtc2ctPnNldEludDMyKCJyZWFzb24iLCBrV2hhdE5ldHdvcmtTdGFsbCk7Ci0gICAgICAgICAgICBtc2ctPnNldFNpemUoIm51bUJ5dGVzUXVldWVkIiwgbnVtQnl0ZXNRdWV1ZWQpOwotICAgICAgICAgICAgbXNnLT5wb3N0KCk7Ci0KLSAgICAgICAgICAgIG1MYXN0U3RhbGxSZXBvcnRVcyA9IG5vd1VzOwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OnNlbmRSZXF1ZXN0KAotICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzc2l6ZV90IHNpemUsIGJvb2wgdGltZVZhbGlkLCBpbnQ2NF90IHRpbWVVcykgewotICAgIENIRUNLKG1TdGF0ZSA9PSBDT05ORUNURUQgfHwgbVN0YXRlID09IERBVEFHUkFNKTsKLQotICAgIGlmIChzaXplIDwgMCkgewotICAgICAgICBzaXplID0gc3RybGVuKChjb25zdCBjaGFyICopZGF0YSk7Ci0gICAgfQotCi0gICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOwotCi0gICAgaWYgKG1TdGF0ZSA9PSBDT05ORUNURUQgJiYgbU1vZGUgPT0gTU9ERV9EQVRBR1JBTSkgewotICAgICAgICBDSEVDS19MRShzaXplLCA2NTUzNSk7Ci0KLSAgICAgICAgYnVmZmVyID0gbmV3IEFCdWZmZXIoc2l6ZSArIDIpOwotICAgICAgICBidWZmZXItPmRhdGEoKVswXSA9IHNpemUgPj4gODsKLSAgICAgICAgYnVmZmVyLT5kYXRhKClbMV0gPSBzaXplICYgMHhmZjsKLSAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpICsgMiwgZGF0YSwgc2l6ZSk7Ci0gICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gQ09OTkVDVEVEICYmIG1Nb2RlID09IE1PREVfV0VCU09DS0VUKSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBib29sIGtVc2VNYXNrID0gZmFsc2U7ICAvLyBDaHJvbWl1bSBkb2Vzbid0IGxpa2UgaXQuCi0KLSAgICAgICAgc2l6ZV90IG51bUhlYWRlckJ5dGVzID0gMiArIChrVXNlTWFzayA/IDQgOiAwKTsKLSAgICAgICAgaWYgKHNpemUgPiA2NTUzNSkgewotICAgICAgICAgICAgbnVtSGVhZGVyQnl0ZXMgKz0gODsKLSAgICAgICAgfSBlbHNlIGlmIChzaXplID4gMTI1KSB7Ci0gICAgICAgICAgICBudW1IZWFkZXJCeXRlcyArPSAyOwotICAgICAgICB9Ci0KLSAgICAgICAgYnVmZmVyID0gbmV3IEFCdWZmZXIobnVtSGVhZGVyQnl0ZXMgKyBzaXplKTsKLSAgICAgICAgYnVmZmVyLT5kYXRhKClbMF0gPSAweDgxOyAgLy8gRklOPT0xIHwgb3Bjb2RlPTEgKHRleHQpCi0gICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzFdID0ga1VzZU1hc2sgPyAweDgwIDogMHgwMDsKLQotICAgICAgICBpZiAoc2l6ZSA+IDY1NTM1KSB7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVsxXSB8PSAxMjc7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVsyXSA9IDB4MDA7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVszXSA9IDB4MDA7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVs0XSA9IDB4MDA7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVs1XSA9IDB4MDA7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVs2XSA9IChzaXplID4+IDI0KSAmIDB4ZmY7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVs3XSA9IChzaXplID4+IDE2KSAmIDB4ZmY7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVs4XSA9IChzaXplID4+IDgpICYgMHhmZjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzldID0gc2l6ZSAmIDB4ZmY7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA+IDEyNSkgewotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbMV0gfD0gMTI2OwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbMl0gPSAoc2l6ZSA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVszXSA9IHNpemUgJiAweGZmOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbMV0gfD0gc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChrVXNlTWFzaykgewotICAgICAgICAgICAgdWludDMyX3QgbWFzayA9IHJhbmQoKTsKLQotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbbnVtSGVhZGVyQnl0ZXMgLSA0XSA9IChtYXNrID4+IDI0KSAmIDB4ZmY7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVtudW1IZWFkZXJCeXRlcyAtIDNdID0gKG1hc2sgPj4gMTYpICYgMHhmZjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpW251bUhlYWRlckJ5dGVzIC0gMl0gPSAobWFzayA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVtudW1IZWFkZXJCeXRlcyAtIDFdID0gbWFzayAmIDB4ZmY7Ci0KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgKHNpemVfdClzaXplOyArK2kpIHsKLSAgICAgICAgICAgICAgICBidWZmZXItPmRhdGEoKVtudW1IZWFkZXJCeXRlcyArIGldID0KLSAgICAgICAgICAgICAgICAgICAgKChjb25zdCB1aW50OF90ICopZGF0YSlbaV0KLSAgICAgICAgICAgICAgICAgICAgICAgIF4gKChtYXNrID4+ICg4ICogKDMgLSAoaSAlIDQpKSkpICYgMHhmZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCkgKyBudW1IZWFkZXJCeXRlcywgZGF0YSwgc2l6ZSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBidWZmZXIgPSBuZXcgQUJ1ZmZlcihzaXplKTsKLSAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKLSAgICB9Ci0KLSAgICBGcmFnbWVudCBmcmFnOwotCi0gICAgZnJhZy5tRmxhZ3MgPSAwOwotICAgIGlmICh0aW1lVmFsaWQpIHsKLSAgICAgICAgZnJhZy5tRmxhZ3MgPSBGUkFHTUVOVF9GTEFHX1RJTUVfVkFMSUQ7Ci0gICAgICAgIGZyYWcubVRpbWVVcyA9IHRpbWVVczsKLSAgICB9Ci0KLSAgICBmcmFnLm1CdWZmZXIgPSBidWZmZXI7Ci0KLSAgICBtT3V0RnJhZ21lbnRzLnB1c2hfYmFjayhmcmFnKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246Om5vdGlmeUVycm9yKAotICAgICAgICBib29sIHNlbmQsIHN0YXR1c190IGVyciwgY29uc3QgY2hhciAqZGV0YWlsKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG1zZy0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgIG1zZy0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0RXJyb3IpOwotICAgIG1zZy0+c2V0SW50MzIoInNlbmQiLCBzZW5kKTsKLSAgICBtc2ctPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgIG1zZy0+c2V0U3RyaW5nKCJkZXRhaWwiLCBkZXRhaWwpOwotICAgIG1zZy0+cG9zdCgpOwotfQotCi12b2lkIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6bm90aWZ5KE5vdGlmaWNhdGlvblJlYXNvbiByZWFzb24pIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbXNnLT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgbXNnLT5zZXRJbnQzMigicmVhc29uIiwgcmVhc29uKTsKLSAgICBtc2ctPnBvc3QoKTsKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotQU5ldHdvcmtTZXNzaW9uOjpBTmV0d29ya1Nlc3Npb24oKQotICAgIDogbU5leHRTZXNzaW9uSUQoMSkgewotICAgIG1QaXBlRmRbMF0gPSBtUGlwZUZkWzFdID0gLTE7Ci19Ci0KLUFOZXR3b3JrU2Vzc2lvbjo6fkFOZXR3b3JrU2Vzc2lvbigpIHsKLSAgICBzdG9wKCk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6c3RhcnQoKSB7Ci0gICAgaWYgKG1UaHJlYWQgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgaW50IHJlcyA9IHBpcGUobVBpcGVGZCk7Ci0gICAgaWYgKHJlcyAhPSAwKSB7Ci0gICAgICAgIG1QaXBlRmRbMF0gPSBtUGlwZUZkWzFdID0gLTE7Ci0gICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgfQotCi0gICAgbVRocmVhZCA9IG5ldyBOZXR3b3JrVGhyZWFkKHRoaXMpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gbVRocmVhZC0+cnVuKCJBTmV0d29ya1Nlc3Npb24iLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgbVRocmVhZC5jbGVhcigpOwotCi0gICAgICAgIGNsb3NlKG1QaXBlRmRbMF0pOwotICAgICAgICBjbG9zZShtUGlwZUZkWzFdKTsKLSAgICAgICAgbVBpcGVGZFswXSA9IG1QaXBlRmRbMV0gPSAtMTsKLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpzdG9wKCkgewotICAgIGlmIChtVGhyZWFkID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIG1UaHJlYWQtPnJlcXVlc3RFeGl0KCk7Ci0gICAgaW50ZXJydXB0KCk7Ci0gICAgbVRocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7Ci0KLSAgICBtVGhyZWFkLmNsZWFyKCk7Ci0KLSAgICBjbG9zZShtUGlwZUZkWzBdKTsKLSAgICBjbG9zZShtUGlwZUZkWzFdKTsKLSAgICBtUGlwZUZkWzBdID0gbVBpcGVGZFsxXSA9IC0xOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmNyZWF0ZVJUU1BDbGllbnQoCi0gICAgICAgIGNvbnN0IGNoYXIgKmhvc3QsIHVuc2lnbmVkIHBvcnQsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpIHsKLSAgICByZXR1cm4gY3JlYXRlQ2xpZW50T3JTZXJ2ZXIoCi0gICAgICAgICAgICBrTW9kZUNyZWF0ZVJUU1BDbGllbnQsCi0gICAgICAgICAgICBOVUxMIC8qIGFkZHIgKi8sCi0gICAgICAgICAgICAwIC8qIHBvcnQgKi8sCi0gICAgICAgICAgICBob3N0LAotICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgIG5vdGlmeSwKLSAgICAgICAgICAgIHNlc3Npb25JRCk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlUlRTUFNlcnZlcigKLSAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgJmFkZHIsIHVuc2lnbmVkIHBvcnQsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBpbnQzMl90ICpzZXNzaW9uSUQpIHsKLSAgICByZXR1cm4gY3JlYXRlQ2xpZW50T3JTZXJ2ZXIoCi0gICAgICAgICAgICBrTW9kZUNyZWF0ZVJUU1BTZXJ2ZXIsCi0gICAgICAgICAgICAmYWRkciwKLSAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICBOVUxMIC8qIHJlbW90ZUhvc3QgKi8sCi0gICAgICAgICAgICAwIC8qIHJlbW90ZVBvcnQgKi8sCi0gICAgICAgICAgICBub3RpZnksCi0gICAgICAgICAgICBzZXNzaW9uSUQpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmNyZWF0ZVVEUFNlc3Npb24oCi0gICAgICAgIHVuc2lnbmVkIGxvY2FsUG9ydCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGludDMyX3QgKnNlc3Npb25JRCkgewotICAgIHJldHVybiBjcmVhdGVVRFBTZXNzaW9uKGxvY2FsUG9ydCwgTlVMTCwgMCwgbm90aWZ5LCBzZXNzaW9uSUQpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmNyZWF0ZVVEUFNlc3Npb24oCi0gICAgICAgIHVuc2lnbmVkIGxvY2FsUG9ydCwKLSAgICAgICAgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwKLSAgICAgICAgdW5zaWduZWQgcmVtb3RlUG9ydCwKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgIGludDMyX3QgKnNlc3Npb25JRCkgewotICAgIHJldHVybiBjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgICAgIGtNb2RlQ3JlYXRlVURQU2Vzc2lvbiwKLSAgICAgICAgICAgIE5VTEwgLyogYWRkciAqLywKLSAgICAgICAgICAgIGxvY2FsUG9ydCwKLSAgICAgICAgICAgIHJlbW90ZUhvc3QsCi0gICAgICAgICAgICByZW1vdGVQb3J0LAotICAgICAgICAgICAgbm90aWZ5LAotICAgICAgICAgICAgc2Vzc2lvbklEKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb24oCi0gICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICZhZGRyLCB1bnNpZ25lZCBwb3J0LAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNsaWVudE9yU2VydmVyKAotICAgICAgICAgICAga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25QYXNzaXZlLAotICAgICAgICAgICAgJmFkZHIsCi0gICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgTlVMTCAvKiByZW1vdGVIb3N0ICovLAotICAgICAgICAgICAgMCAvKiByZW1vdGVQb3J0ICovLAotICAgICAgICAgICAgbm90aWZ5LAotICAgICAgICAgICAgc2Vzc2lvbklEKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb24oCi0gICAgICAgIHVuc2lnbmVkIGxvY2FsUG9ydCwKLSAgICAgICAgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwKLSAgICAgICAgdW5zaWduZWQgcmVtb3RlUG9ydCwKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgIGludDMyX3QgKnNlc3Npb25JRCkgewotICAgIHJldHVybiBjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgICAgIGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uQWN0aXZlLAotICAgICAgICAgICAgTlVMTCAvKiBhZGRyICovLAotICAgICAgICAgICAgbG9jYWxQb3J0LAotICAgICAgICAgICAgcmVtb3RlSG9zdCwKLSAgICAgICAgICAgIHJlbW90ZVBvcnQsCi0gICAgICAgICAgICBub3RpZnksCi0gICAgICAgICAgICBzZXNzaW9uSUQpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmRlc3Ryb3lTZXNzaW9uKGludDMyX3Qgc2Vzc2lvbklEKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uSUQpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0KLSAgICBtU2Vzc2lvbnMucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0KLSAgICBpbnRlcnJ1cHQoKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246Ok1ha2VTb2NrZXROb25CbG9ja2luZyhpbnQgcykgewotICAgIGludCBmbGFncyA9IGZjbnRsKHMsIEZfR0VURkwsIDApOwotICAgIGlmIChmbGFncyA8IDApIHsKLSAgICAgICAgZmxhZ3MgPSAwOwotICAgIH0KLQotICAgIGludCByZXMgPSBmY250bChzLCBGX1NFVEZMLCBmbGFncyB8IE9fTk9OQkxPQ0spOwotICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmNyZWF0ZUNsaWVudE9yU2VydmVyKAotICAgICAgICBNb2RlIG1vZGUsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICpsb2NhbEFkZHIsCi0gICAgICAgIHVuc2lnbmVkIHBvcnQsCi0gICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgIHVuc2lnbmVkIHJlbW90ZVBvcnQsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgKnNlc3Npb25JRCA9IDA7Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgaW50IHMsIHJlczsKLSAgICBzcDxTZXNzaW9uPiBzZXNzaW9uOwotCi0gICAgcyA9IHNvY2tldCgKLSAgICAgICAgICAgIEFGX0lORVQsCi0gICAgICAgICAgICAobW9kZSA9PSBrTW9kZUNyZWF0ZVVEUFNlc3Npb24pID8gU09DS19ER1JBTSA6IFNPQ0tfU1RSRUFNLAotICAgICAgICAgICAgMCk7Ci0KLSAgICBpZiAocyA8IDApIHsKLSAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICBnb3RvIGJhaWw7Ci0gICAgfQotCi0gICAgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVSVFNQU2VydmVyCi0gICAgICAgICAgICB8fCBtb2RlID09IGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uUGFzc2l2ZSkgewotICAgICAgICBjb25zdCBpbnQgeWVzID0gMTsKLSAgICAgICAgcmVzID0gc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZ5ZXMsIHNpemVvZih5ZXMpKTsKLQotICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlVURQU2Vzc2lvbikgewotICAgICAgICBpbnQgc2l6ZSA9IDI1NiAqIDEwMjQ7Ci0KLSAgICAgICAgcmVzID0gc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsICZzaXplLCBzaXplb2Yoc2l6ZSkpOwotCi0gICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgICAgICBnb3RvIGJhaWwyOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzID0gc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19TTkRCVUYsICZzaXplLCBzaXplb2Yoc2l6ZSkpOwotCi0gICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgICAgICBnb3RvIGJhaWwyOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uQWN0aXZlKSB7Ci0gICAgICAgIGludCBmbGFnID0gMTsKLSAgICAgICAgcmVzID0gc2V0c29ja29wdChzLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksICZmbGFnLCBzaXplb2YoZmxhZykpOwotCi0gICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgICAgICBnb3RvIGJhaWwyOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHRvcyA9IDIyNDsgIC8vIFZPSUNFCi0gICAgICAgIHJlcyA9IHNldHNvY2tvcHQocywgSVBQUk9UT19JUCwgSVBfVE9TLCAmdG9zLCBzaXplb2YodG9zKSk7Ci0KLSAgICAgICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBlcnIgPSBNYWtlU29ja2V0Tm9uQmxvY2tpbmcocyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgfQotCi0gICAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7Ci0gICAgbWVtc2V0KGFkZHIuc2luX3plcm8sIDAsIHNpemVvZihhZGRyLnNpbl96ZXJvKSk7Ci0gICAgYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQotICAgIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlUlRTUENsaWVudAotICAgICAgICAgICAgfHwgbW9kZSA9PSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZSkgewotICAgICAgICBzdHJ1Y3QgaG9zdGVudCAqZW50PSBnZXRob3N0YnluYW1lKHJlbW90ZUhvc3QpOwotICAgICAgICBpZiAoZW50ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGVyciA9IC1oX2Vycm5vOwotICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgfQotCi0gICAgICAgIGFkZHIuc2luX2FkZHIuc19hZGRyID0gKihpbl9hZGRyX3QgKillbnQtPmhfYWRkcjsKLSAgICAgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHJlbW90ZVBvcnQpOwotICAgIH0gZWxzZSBpZiAobG9jYWxBZGRyICE9IE5VTEwpIHsKLSAgICAgICAgYWRkci5zaW5fYWRkciA9ICpsb2NhbEFkZHI7Ci0gICAgICAgIGFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOwotICAgICAgICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0gICAgfQotCi0gICAgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVSVFNQQ2xpZW50Ci0gICAgICAgICAgICB8fCBtb2RlID09IGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uQWN0aXZlKSB7Ci0gICAgICAgIGluX2FkZHJfdCB4ID0gbnRvaGwoYWRkci5zaW5fYWRkci5zX2FkZHIpOwotICAgICAgICBBTE9HSSgiY29ubmVjdGluZyBzb2NrZXQgJWQgdG8gJWQuJWQuJWQuJWQ6JWQiLAotICAgICAgICAgICAgICBzLAotICAgICAgICAgICAgICAoeCA+PiAyNCksCi0gICAgICAgICAgICAgICh4ID4+IDE2KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICh4ID4+IDgpICYgMHhmZiwKLSAgICAgICAgICAgICAgeCAmIDB4ZmYsCi0gICAgICAgICAgICAgIG50b2hzKGFkZHIuc2luX3BvcnQpKTsKLQotICAgICAgICByZXMgPSBjb25uZWN0KHMsIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKTsKLQotICAgICAgICBDSEVDS19MVChyZXMsIDApOwotICAgICAgICBpZiAoZXJybm8gPT0gRUlOUFJPR1JFU1MpIHsKLSAgICAgICAgICAgIHJlcyA9IDA7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICByZXMgPSBiaW5kKHMsIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKTsKLQotICAgICAgICBpZiAocmVzID09IDApIHsKLSAgICAgICAgICAgIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlUlRTUFNlcnZlcgotICAgICAgICAgICAgICAgICAgICB8fCBtb2RlID09IGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uUGFzc2l2ZSkgewotICAgICAgICAgICAgICAgIHJlcyA9IGxpc3RlbihzLCA0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEobW9kZSwga01vZGVDcmVhdGVVRFBTZXNzaW9uKTsKLQotICAgICAgICAgICAgICAgIGlmIChyZW1vdGVIb3N0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIHJlbW90ZUFkZHI7Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldChyZW1vdGVBZGRyLnNpbl96ZXJvLCAwLCBzaXplb2YocmVtb3RlQWRkci5zaW5femVybykpOwotICAgICAgICAgICAgICAgICAgICByZW1vdGVBZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotICAgICAgICAgICAgICAgICAgICByZW1vdGVBZGRyLnNpbl9wb3J0ID0gaHRvbnMocmVtb3RlUG9ydCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IGhvc3RlbnQgKmVudD0gZ2V0aG9zdGJ5bmFtZShyZW1vdGVIb3N0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSAtaF9lcnJubzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkciA9ICooaW5fYWRkcl90ICopZW50LT5oX2FkZHI7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmVzID0gY29ubmVjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmcmVtb3RlQWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocmVtb3RlQWRkcikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgZ290byBiYWlsMjsKLSAgICB9Ci0KLSAgICBTZXNzaW9uOjpTdGF0ZSBzdGF0ZTsKLSAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICAgICAgY2FzZSBrTW9kZUNyZWF0ZVJUU1BDbGllbnQ6Ci0gICAgICAgICAgICBzdGF0ZSA9IFNlc3Npb246OkNPTk5FQ1RJTkc7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uQWN0aXZlOgotICAgICAgICAgICAgc3RhdGUgPSBTZXNzaW9uOjpDT05ORUNUSU5HOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvblBhc3NpdmU6Ci0gICAgICAgICAgICBzdGF0ZSA9IFNlc3Npb246OkxJU1RFTklOR19UQ1BfREdSQU1TOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBrTW9kZUNyZWF0ZVJUU1BTZXJ2ZXI6Ci0gICAgICAgICAgICBzdGF0ZSA9IFNlc3Npb246OkxJU1RFTklOR19SVFNQOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIENIRUNLX0VRKG1vZGUsIGtNb2RlQ3JlYXRlVURQU2Vzc2lvbik7Ci0gICAgICAgICAgICBzdGF0ZSA9IFNlc3Npb246OkRBVEFHUkFNOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgc2Vzc2lvbiA9IG5ldyBTZXNzaW9uKAotICAgICAgICAgICAgbU5leHRTZXNzaW9uSUQrKywKLSAgICAgICAgICAgIHN0YXRlLAotICAgICAgICAgICAgcywKLSAgICAgICAgICAgIG5vdGlmeSk7Ci0KLSAgICBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZSkgewotICAgICAgICBzZXNzaW9uLT5zZXRNb2RlKFNlc3Npb246Ok1PREVfREFUQUdSQU0pOwotICAgIH0gZWxzZSBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVJUU1BDbGllbnQpIHsKLSAgICAgICAgc2Vzc2lvbi0+c2V0TW9kZShTZXNzaW9uOjpNT0RFX1JUU1ApOwotICAgIH0KLQotICAgIG1TZXNzaW9ucy5hZGQoc2Vzc2lvbi0+c2Vzc2lvbklEKCksIHNlc3Npb24pOwotCi0gICAgaW50ZXJydXB0KCk7Ci0KLSAgICAqc2Vzc2lvbklEID0gc2Vzc2lvbi0+c2Vzc2lvbklEKCk7Ci0KLSAgICBnb3RvIGJhaWw7Ci0KLWJhaWwyOgotICAgIGNsb3NlKHMpOwotICAgIHMgPSAtMTsKLQotYmFpbDoKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmNvbm5lY3RVRFBTZXNzaW9uKAotICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwgdW5zaWduZWQgcmVtb3RlUG9ydCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbVNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbklEKTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotCi0gICAgY29uc3Qgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9ucy52YWx1ZUF0KGluZGV4KTsKLSAgICBpbnQgcyA9IHNlc3Npb24tPnNvY2tldCgpOwotCi0gICAgc3RydWN0IHNvY2thZGRyX2luIHJlbW90ZUFkZHI7Ci0gICAgbWVtc2V0KHJlbW90ZUFkZHIuc2luX3plcm8sIDAsIHNpemVvZihyZW1vdGVBZGRyLnNpbl96ZXJvKSk7Ci0gICAgcmVtb3RlQWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgICByZW1vdGVBZGRyLnNpbl9wb3J0ID0gaHRvbnMocmVtb3RlUG9ydCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBzdHJ1Y3QgaG9zdGVudCAqZW50ID0gZ2V0aG9zdGJ5bmFtZShyZW1vdGVIb3N0KTsKLSAgICBpZiAoZW50ID09IE5VTEwpIHsKLSAgICAgICAgZXJyID0gLWhfZXJybm87Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVtb3RlQWRkci5zaW5fYWRkci5zX2FkZHIgPSAqKGluX2FkZHJfdCAqKWVudC0+aF9hZGRyOwotCi0gICAgICAgIGludCByZXMgPSBjb25uZWN0KAotICAgICAgICAgICAgICAgIHMsCi0gICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZyZW1vdGVBZGRyLAotICAgICAgICAgICAgICAgIHNpemVvZihyZW1vdGVBZGRyKSk7Ci0KLSAgICAgICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6c2VuZFJlcXVlc3QoCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCB2b2lkICpkYXRhLCBzc2l6ZV90IHNpemUsCi0gICAgICAgIGJvb2wgdGltZVZhbGlkLCBpbnQ2NF90IHRpbWVVcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbVNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbklEKTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotCi0gICAgY29uc3Qgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9ucy52YWx1ZUF0KGluZGV4KTsKLQotICAgIHN0YXR1c190IGVyciA9IHNlc3Npb24tPnNlbmRSZXF1ZXN0KGRhdGEsIHNpemUsIHRpbWVWYWxpZCwgdGltZVVzKTsKLQotICAgIGludGVycnVwdCgpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpzd2l0Y2hUb1dlYlNvY2tldE1vZGUoaW50MzJfdCBzZXNzaW9uSUQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1TZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb25JRCk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLQotICAgIGNvbnN0IHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbnMudmFsdWVBdChpbmRleCk7Ci0gICAgcmV0dXJuIHNlc3Npb24tPnN3aXRjaFRvV2ViU29ja2V0TW9kZSgpOwotfQotCi12b2lkIEFOZXR3b3JrU2Vzc2lvbjo6aW50ZXJydXB0KCkgewotICAgIHN0YXRpYyBjb25zdCBjaGFyIGR1bW15ID0gMDsKLQotICAgIHNzaXplX3QgbjsKLSAgICBkbyB7Ci0gICAgICAgIG4gPSB3cml0ZShtUGlwZUZkWzFdLCAmZHVtbXksIDEpOwotICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgIGlmIChuIDwgMCkgewotICAgICAgICBBTE9HVygiRXJyb3Igd3JpdGluZyB0byBwaXBlICglcykiLCBzdHJlcnJvcihlcnJubykpOwotICAgIH0KLX0KLQotdm9pZCBBTmV0d29ya1Nlc3Npb246OnRocmVhZExvb3AoKSB7Ci0gICAgZmRfc2V0IHJzLCB3czsKLSAgICBGRF9aRVJPKCZycyk7Ci0gICAgRkRfWkVSTygmd3MpOwotCi0gICAgRkRfU0VUKG1QaXBlRmRbMF0sICZycyk7Ci0gICAgaW50IG1heEZkID0gbVBpcGVGZFswXTsKLQotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TZXNzaW9ucy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgY29uc3Qgc3A8U2Vzc2lvbj4gJnNlc3Npb24gPSBtU2Vzc2lvbnMudmFsdWVBdChpKTsKLQotICAgICAgICAgICAgaW50IHMgPSBzZXNzaW9uLT5zb2NrZXQoKTsKLQotICAgICAgICAgICAgaWYgKHMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzZXNzaW9uLT53YW50c1RvUmVhZCgpKSB7Ci0gICAgICAgICAgICAgICAgRkRfU0VUKHMsICZycyk7Ci0gICAgICAgICAgICAgICAgaWYgKHMgPiBtYXhGZCkgewotICAgICAgICAgICAgICAgICAgICBtYXhGZCA9IHM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2Vzc2lvbi0+d2FudHNUb1dyaXRlKCkpIHsKLSAgICAgICAgICAgICAgICBGRF9TRVQocywgJndzKTsKLSAgICAgICAgICAgICAgICBpZiAocyA+IG1heEZkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1heEZkID0gczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgcmVzID0gc2VsZWN0KG1heEZkICsgMSwgJnJzLCAmd3MsIE5VTEwsIE5VTEwgLyogdHYgKi8pOwotCi0gICAgaWYgKHJlcyA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocmVzIDwgMCkgewotICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dFKCJzZWxlY3QgZmFpbGVkIHcvIGVycm9yICVkICglcykiLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChGRF9JU1NFVChtUGlwZUZkWzBdLCAmcnMpKSB7Ci0gICAgICAgIGNoYXIgYzsKLSAgICAgICAgc3NpemVfdCBuOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBuID0gcmVhZChtUGlwZUZkWzBdLCAmYywgMSk7Ci0gICAgICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCJFcnJvciByZWFkaW5nIGZyb20gcGlwZSAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgfQotCi0gICAgICAgIC0tcmVzOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgICAgICBMaXN0PHNwPFNlc3Npb24+ID4gc2Vzc2lvbnNUb0FkZDsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gbVNlc3Npb25zLnNpemUoKTsgcmVzID4gMCAmJiBpID4gMDspIHsKLSAgICAgICAgICAgIGktLTsKLSAgICAgICAgICAgIGNvbnN0IHNwPFNlc3Npb24+ICZzZXNzaW9uID0gbVNlc3Npb25zLnZhbHVlQXQoaSk7Ci0KLSAgICAgICAgICAgIGludCBzID0gc2Vzc2lvbi0+c29ja2V0KCk7Ci0KLSAgICAgICAgICAgIGlmIChzIDwgMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoRkRfSVNTRVQocywgJnJzKSB8fCBGRF9JU1NFVChzLCAmd3MpKSB7Ci0gICAgICAgICAgICAgICAgLS1yZXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChGRF9JU1NFVChzLCAmcnMpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlc3Npb24tPmlzUlRTUFNlcnZlcigpIHx8IHNlc3Npb24tPmlzVENQRGF0YWdyYW1TZXJ2ZXIoKSkgewotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVtb3RlQWRkcjsKLSAgICAgICAgICAgICAgICAgICAgc29ja2xlbl90IHJlbW90ZUFkZHJMZW4gPSBzaXplb2YocmVtb3RlQWRkcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFNvY2tldCA9IGFjY2VwdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCAoc3RydWN0IHNvY2thZGRyICopJnJlbW90ZUFkZHIsICZyZW1vdGVBZGRyTGVuKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50U29ja2V0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE1ha2VTb2NrZXROb25CbG9ja2luZyhjbGllbnRTb2NrZXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBtYWtlIGNsaWVudCBzb2NrZXQgbm9uIGJsb2NraW5nLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB3LyBlcnJvciAlZCAoJXMpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIsIHN0cmVycm9yKC1lcnIpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGNsaWVudFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50U29ja2V0ID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2FkZHJfdCBhZGRyID0gbnRvaGwocmVtb3RlQWRkci5zaW5fYWRkci5zX2FkZHIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koImluY29taW5nIGNvbm5lY3Rpb24gZnJvbSAlZC4lZC4lZC4lZDolZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihzb2NrZXQgJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkciA+PiAyNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkZHIgPj4gMTYpICYgMHhmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkciA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkciAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRvaHMocmVtb3RlQWRkci5zaW5fcG9ydCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50U29ja2V0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFNlc3Npb24+IGNsaWVudFNlc3Npb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2Vzc2lvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dFNlc3Npb25JRCsrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb246OkNPTk5FQ1RFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRTb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+Z2V0Tm90aWZpY2F0aW9uTWVzc2FnZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFNlc3Npb24tPnNldE1vZGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5pc1JUU1BTZXJ2ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU2Vzc2lvbjo6TU9ERV9SVFNQCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTZXNzaW9uOjpNT0RFX0RBVEFHUkFNKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25zVG9BZGQucHVzaF9iYWNrKGNsaWVudFNlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImFjY2VwdCByZXR1cm5lZCBlcnJvciAlZCAoJXMpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2Vzc2lvbi0+cmVhZE1vcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInJlYWRNb3JlIG9uIHNvY2tldCAlZCBmYWlsZWQgdy8gZXJyb3IgJWQgKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKEZEX0lTU0VUKHMsICZ3cykpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXNzaW9uLT53cml0ZU1vcmUoKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJ3cml0ZU1vcmUgb24gc29ja2V0ICVkIGZhaWxlZCB3LyBlcnJvciAlZCAoJXMpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcywgZXJyLCBzdHJlcnJvcigtZXJyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKCFzZXNzaW9uc1RvQWRkLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSAqc2Vzc2lvbnNUb0FkZC5iZWdpbigpOwotICAgICAgICAgICAgc2Vzc2lvbnNUb0FkZC5lcmFzZShzZXNzaW9uc1RvQWRkLmJlZ2luKCkpOwotCi0gICAgICAgICAgICBtU2Vzc2lvbnMuYWRkKHNlc3Npb24tPnNlc3Npb25JRCgpLCBzZXNzaW9uKTsKLQotICAgICAgICAgICAgQUxPR0koImFkZGVkIGNsaWVudFNlc3Npb24gJWQiLCBzZXNzaW9uLT5zZXNzaW9uSUQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKaW5kZXggMjljZjFlZC4uNTMzY2Q3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icApAQCAtNCw4ICs0LDggQEAKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogfQogCi1jY19saWJyYXJ5IHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fZGVmYXVsdHMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgdm5kazogewogICAgICAgICBlbmFibGVkOiB0cnVlLApAQCAtMjUsNiArMjUsNyBAQAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCiAgICAgXSwKIApAQCAtNTYsMTggKzU3LDIyIEBACiAgICAgICAgICJBQnVmZmVyLmNwcCIsCiAgICAgICAgICJBRGVidWcuY3BwIiwKICAgICAgICAgIkFIYW5kbGVyLmNwcCIsCi0gICAgICAgICJBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcCIsCiAgICAgICAgICJBTG9vcGVyLmNwcCIsCiAgICAgICAgICJBTG9vcGVyUm9zdGVyLmNwcCIsCiAgICAgICAgICJBTWVzc2FnZS5jcHAiLAotICAgICAgICAiQU5ldHdvcmtTZXNzaW9uLmNwcCIsCiAgICAgICAgICJBU3RyaW5nLmNwcCIsCiAgICAgICAgICJBU3RyaW5nVXRpbHMuY3BwIiwKKyAgICAgICAgIkF1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAiLAogICAgICAgICAiQnl0ZVV0aWxzLmNwcCIsCiAgICAgICAgICJDb2xvclV0aWxzLmNwcCIsCisgICAgICAgICJNZWRpYUJ1ZmZlci5jcHAiLAorICAgICAgICAiTWVkaWFCdWZmZXJCYXNlLmNwcCIsCisgICAgICAgICJNZWRpYUJ1ZmZlckdyb3VwLmNwcCIsCiAgICAgICAgICJNZWRpYURlZnMuY3BwIiwKICAgICAgICAgIk1lZGlhS2V5cy5jcHAiLAotICAgICAgICAiUGFyc2VkTWVzc2FnZS5jcHAiLAorICAgICAgICAiTWV0YURhdGEuY3BwIiwKKyAgICAgICAgIk1ldGFEYXRhQmFzZS5jcHAiLAorICAgICAgICAiT3B1c0hlYWRlci5jcHAiLAogICAgICAgICAiYXZjX3V0aWxzLmNwcCIsCiAgICAgICAgICJiYXNlNjQuY3BwIiwKICAgICAgICAgImhleGR1bXAuY3BwIiwKQEAgLTgzLDMgKzg4LDIwIEBACiAgICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAogfQorCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9kZWZhdWx0cyJdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fd2l0aG91dF9pbWVtb3J5IiwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2RlZmF1bHRzIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1Xbm8tbXVsdGljaGFyIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLUROT19JTUVNT1JZIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOGU5NjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBdWRpb1ByZXNlbnRhdGlvbkluZm8iCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJBdWRpb1ByZXNlbnRhdGlvbkluZm8uaCIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3ZvaWQgc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKGNvbnN0IEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiYgcHJlc2VudGF0aW9ucywKKyAgICAgICAgc3RkOjpvc3RyZWFtKiBzZXJpYWxpemVkT3V0cHV0KSB7CisgICAgdWludDMyX3QgbnVtUHJlc2VudGF0aW9ucyA9IHByZXNlbnRhdGlvbnMuc2l6ZSgpOworICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZudW1QcmVzZW50YXRpb25zKSwgc2l6ZW9mKG51bVByZXNlbnRhdGlvbnMpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGFwIDogcHJlc2VudGF0aW9ucykgeworICAgICAgICBpZiAoYXAubVZlcnNpb24gPT0gUFJFU0VOVEFUSU9OX1ZFUlNJT05fMSkgeworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZhcC5tVmVyc2lvbikpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubVZlcnNpb24pKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmYXAubVByZXNlbnRhdGlvbklkKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tUHJlc2VudGF0aW9uSWQpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmYXAubVByb2dyYW1JZCkpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubVByb2dyYW1JZCkpOworCisgICAgICAgICAgICB1aW50MzJfdCBudW1MYWJlbHMgPSBhcC5tTGFiZWxzLnNpemUoKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmbnVtTGFiZWxzKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihudW1MYWJlbHMpKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgbGFiZWwgOiBhcC5tTGFiZWxzKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbGFiZWxLZXlTaXplID0gbGFiZWwuZmlyc3Quc2l6ZSgpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmxhYmVsS2V5U2l6ZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGxhYmVsS2V5U2l6ZSkpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKGxhYmVsLmZpcnN0LmNfc3RyKCksIGxhYmVsS2V5U2l6ZSk7CisKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBsYWJlbFZhbFNpemUgPSBsYWJlbC5zZWNvbmQuc2l6ZSgpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmxhYmVsVmFsU2l6ZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGxhYmVsVmFsU2l6ZSkpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKGxhYmVsLnNlY29uZC5jX3N0cigpLCBsYWJlbFZhbFNpemUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCBsYW5nU2l6ZSA9IGFwLm1MYW5ndWFnZS5zaXplKCk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmxhbmdTaXplKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihsYW5nU2l6ZSkpOworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoYXAubUxhbmd1YWdlLmNfc3RyKCksIGxhbmdTaXplKTsKKworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbikpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubU1hc3RlcmluZ0luZGljYXRpb24pKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmYXAubUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUpKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmFwLm1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUpKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmYXAubURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGUpKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IGRlc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKHN0ZDo6aXN0cmVhbSogc2VyaWFsaXplZElucHV0LAorICAgICAgICBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gKnByZXNlbnRhdGlvbnMpIHsKKyAgICB1aW50MzJfdCBudW1QcmVzZW50YXRpb25zOworICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmbnVtUHJlc2VudGF0aW9ucyksIHNpemVvZihudW1QcmVzZW50YXRpb25zKSk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bVByZXNlbnRhdGlvbnM7ICsraSkgeworICAgICAgICB1aW50MzJfdCB2ZXJzaW9uOworICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJnZlcnNpb24pLCBzaXplb2YodmVyc2lvbikpOworICAgICAgICBpZiAodmVyc2lvbiA9PSBQUkVTRU5UQVRJT05fVkVSU0lPTl8xKSB7CisgICAgICAgICAgICBBdWRpb1ByZXNlbnRhdGlvblYxIGFwOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKAorICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPigmYXAubVByZXNlbnRhdGlvbklkKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1QcmVzZW50YXRpb25JZCkpOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZhcC5tUHJvZ3JhbUlkKSwgc2l6ZW9mKGFwLm1Qcm9ncmFtSWQpKTsKKworICAgICAgICAgICAgdWludDMyX3QgbnVtTGFiZWxzOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZudW1MYWJlbHMpLCBzaXplb2YobnVtTGFiZWxzKSk7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgbnVtTGFiZWxzOyArK2opIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBsYWJlbEtleVNpemU7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZsYWJlbEtleVNpemUpLCBzaXplb2YobGFiZWxLZXlTaXplKSk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gbGFiZWxLZXkobGFiZWxLZXlTaXplKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQobGFiZWxLZXkuZGF0YSgpLCBsYWJlbEtleVNpemUpOworCisgICAgICAgICAgICAgICAgdWludDMyX3QgbGFiZWxWYWxTaXplOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmbGFiZWxWYWxTaXplKSwgc2l6ZW9mKGxhYmVsVmFsU2l6ZSkpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGxhYmVsVmFsKGxhYmVsVmFsU2l6ZSk7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKGxhYmVsVmFsLmRhdGEoKSwgbGFiZWxWYWxTaXplKTsKKyAgICAgICAgICAgICAgICBhcC5tTGFiZWxzLmVtcGxhY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNoYXIqPihsYWJlbEtleS5kYXRhKCkpLCBsYWJlbEtleVNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4obGFiZWxWYWwuZGF0YSgpKSwgbGFiZWxWYWxTaXplKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50MzJfdCBsYW5ndWFnZVNpemU7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmxhbmd1YWdlU2l6ZSksIHNpemVvZihsYW5ndWFnZVNpemUpKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGxhbmd1YWdlKGxhbmd1YWdlU2l6ZSk7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQobGFuZ3VhZ2UuZGF0YSgpLCBsYW5ndWFnZVNpemUpOworICAgICAgICAgICAgYXAubUxhbmd1YWdlID0gc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4obGFuZ3VhZ2UuZGF0YSgpKSwgbGFuZ3VhZ2VTaXplKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmYXAubU1hc3RlcmluZ0luZGljYXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmFwLm1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSkpOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZhcC5tU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmFwLm1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSkpOworICAgICAgICAgICAgcHJlc2VudGF0aW9ucy0+cHVzaF9iYWNrKHN0ZDo6bW92ZShhcCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkF1ZGlvIHByZXNlbnRhdGlvbiBpbmZvIHZlcnNpb24gaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwCmluZGV4IGM0ZWFhMjcuLjA3MGUzMjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9va3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzQyLDYgKzM0MywxNCBAQAogICAgIGFzcGVjdHMubVJhbmdlID0gZnVsbFJhbmdlID8gQ29sb3JBc3BlY3RzOjpSYW5nZUZ1bGwgOiBDb2xvckFzcGVjdHM6OlJhbmdlTGltaXRlZDsKIH0KIAordm9pZCBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoCisgICAgICAgIGludDMyX3QgcHJpbWFyaWVzLCBpbnQzMl90IGludHJhbnNmZXIsIGludDMyX3QgY29lZmZzLCBib29sIGZ1bGxSYW5nZSwKKyAgICAgICAgaW50MzJfdCAqcmFuZ2UsIGludDMyX3QgKnN0YW5kYXJkLCBpbnQzMl90ICpvdXR0cmFuc2ZlcikgeworICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzOworICAgIGNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cyhwcmltYXJpZXMsIGludHJhbnNmZXIsIGNvZWZmcywgZnVsbFJhbmdlLCBhc3BlY3RzKTsKKyAgICBjb252ZXJ0Q29kZWNDb2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cyhhc3BlY3RzLCByYW5nZSwgc3RhbmRhcmQsIG91dHRyYW5zZmVyKTsKK30KKwogLy8gc3RhdGljCiBDb2xvckFzcGVjdHMgQ29sb3JVdGlsczo6dW5wYWNrVG9Db2xvckFzcGVjdHModWludDMyX3QgcGFja2VkKSB7CiAgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHM7CkBAIC02ODQsNiArNjkzLDEzIEBACiAgICAgICAgICAgICB0cmFuc2ZlciwgYXNTdHJpbmcoKENvbG9yVHJhbnNmZXIpdHJhbnNmZXIpKTsKIH0KIAorCisvLyBzdGF0aWMKK3ZvaWQgQ29sb3JVdGlsczo6c2V0SERSU3RhdGljSW5mb0ludG9BTWVkaWFGb3JtYXQoCisgICAgICAgIGNvbnN0IEhEUlN0YXRpY0luZm8gJmluZm8sIEFNZWRpYUZvcm1hdCAqZm9ybWF0KSB7CisgICAgc2V0SERSU3RhdGljSW5mb0ludG9Gb3JtYXQoaW5mbywgZm9ybWF0LT5tRm9ybWF0KTsKK30KKwogLy8gc3RhdGljCiB2b2lkIENvbG9yVXRpbHM6OnNldEhEUlN0YXRpY0luZm9JbnRvRm9ybWF0KAogICAgICAgICBjb25zdCBIRFJTdGF0aWNJbmZvICZpbmZvLCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmVhYzA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlci5jcHAKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk1lZGlhQnVmZmVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiBzdGF0aWMgKi8KK3N0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgTWVkaWFCdWZmZXI6Om1Vc2VTaGFyZWRNZW1vcnkoMCk7CisKK01lZGlhQnVmZmVyOjpNZWRpYUJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkKKyAgICA6IG1PYnNlcnZlcihOVUxMKSwKKyAgICAgIG1SZWZDb3VudCgwKSwKKyAgICAgIG1EYXRhKGRhdGEpLAorICAgICAgbVNpemUoc2l6ZSksCisgICAgICBtUmFuZ2VPZmZzZXQoMCksCisgICAgICBtUmFuZ2VMZW5ndGgoc2l6ZSksCisgICAgICBtT3duc0RhdGEoZmFsc2UpLAorICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YUJhc2UpIHsKK30KKworTWVkaWFCdWZmZXI6Ok1lZGlhQnVmZmVyKHNpemVfdCBzaXplKQorICAgIDogbU9ic2VydmVyKE5VTEwpLAorICAgICAgbVJlZkNvdW50KDApLAorICAgICAgbURhdGEoTlVMTCksCisgICAgICBtU2l6ZShzaXplKSwKKyAgICAgIG1SYW5nZU9mZnNldCgwKSwKKyAgICAgIG1SYW5nZUxlbmd0aChzaXplKSwKKyAgICAgIG1Pd25zRGF0YSh0cnVlKSwKKyAgICAgIG1NZXRhRGF0YShuZXcgTWV0YURhdGFCYXNlKSB7CisjaWZuZGVmIE5PX0lNRU1PUlkKKyAgICBpZiAoc2l6ZSA8IGtTaGFyZWRNZW1UaHJlc2hvbGQKKyAgICAgICAgICAgIHx8IHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoJm1Vc2VTaGFyZWRNZW1vcnksIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpID09IDApIHsKKyNlbmRpZgorICAgICAgICBtRGF0YSA9IG1hbGxvYyhzaXplKTsKKyNpZm5kZWYgTk9fSU1FTU9SWQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJjcmVhdGluZyBtZW1vcnlEZWFsZXIiKTsKKyAgICAgICAgc2l6ZV90IG5ld1NpemUgPSAwOworICAgICAgICBpZiAoIV9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coc2l6ZSwgc2l6ZW9mKFNoYXJlZENvbnRyb2wpLCAmbmV3U2l6ZSkpIHsKKyAgICAgICAgICAgIHNwPE1lbW9yeURlYWxlcj4gbWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihuZXdTaXplLCAiTWVkaWFCdWZmZXIiKTsKKyAgICAgICAgICAgIG1NZW1vcnkgPSBtZW1vcnlEZWFsZXItPmFsbG9jYXRlKG5ld1NpemUpOworICAgICAgICB9CisgICAgICAgIGlmIChtTWVtb3J5ID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWxsb2NhdGUgc2hhcmVkIG1lbW9yeSwgdHJ5aW5nIHJlZ3VsYXIgYWxsb2NhdGlvbiEiKTsKKyAgICAgICAgICAgIG1EYXRhID0gbWFsbG9jKHNpemUpOworICAgICAgICAgICAgaWYgKG1EYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiT3V0IG9mIG1lbW9yeSIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2V0U2hhcmVkQ29udHJvbCgpLT5jbGVhcigpOworICAgICAgICAgICAgbURhdGEgPSAodWludDhfdCAqKW1NZW1vcnktPnBvaW50ZXIoKSArIHNpemVvZihTaGFyZWRDb250cm9sKTsKKyAgICAgICAgICAgIEFMT0dWKCJBbGxvY2F0ZWQgc2hhcmVkIG1lbSBidWZmZXIgb2Ygc2l6ZSAlenUgQCAlcCIsIHNpemUsIG1EYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorfQorCitNZWRpYUJ1ZmZlcjo6TWVkaWFCdWZmZXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikKKyAgICA6IG1PYnNlcnZlcihOVUxMKSwKKyAgICAgIG1SZWZDb3VudCgwKSwKKyAgICAgIG1EYXRhKGJ1ZmZlci0+ZGF0YSgpKSwKKyAgICAgIG1TaXplKGJ1ZmZlci0+c2l6ZSgpKSwKKyAgICAgIG1SYW5nZU9mZnNldCgwKSwKKyAgICAgIG1SYW5nZUxlbmd0aChtU2l6ZSksCisgICAgICBtQnVmZmVyKGJ1ZmZlciksCisgICAgICBtT3duc0RhdGEoZmFsc2UpLAorICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YUJhc2UpIHsKK30KKwordm9pZCBNZWRpYUJ1ZmZlcjo6cmVsZWFzZSgpIHsKKyAgICBpZiAobU9ic2VydmVyID09IE5VTEwpIHsKKyAgICAgICAgLy8gTGVnYWN5IGNvbnRyYWN0IGZvciBNZWRpYUJ1ZmZlciB3aXRob3V0IGEgTWVkaWFCdWZmZXJHcm91cC4KKyAgICAgICAgQ0hFQ0tfRVEobVJlZkNvdW50LCAwKTsKKyAgICAgICAgZGVsZXRlIHRoaXM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgcHJldkNvdW50ID0gbVJlZkNvdW50LmZldGNoX3N1YigxKTsKKyAgICBpZiAocHJldkNvdW50ID09IDEpIHsKKyAgICAgICAgaWYgKG1PYnNlcnZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBkZWxldGUgdGhpczsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1PYnNlcnZlci0+c2lnbmFsQnVmZmVyUmV0dXJuZWQodGhpcyk7CisgICAgfQorICAgIENIRUNLKHByZXZDb3VudCA+IDApOworfQorCit2b2lkIE1lZGlhQnVmZmVyOjpjbGFpbSgpIHsKKyAgICBDSEVDSyhtT2JzZXJ2ZXIgIT0gTlVMTCk7CisgICAgQ0hFQ0tfRVEobVJlZkNvdW50LmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCksIDEpOworCisgICAgbVJlZkNvdW50LnN0b3JlKDAsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworfQorCit2b2lkIE1lZGlhQnVmZmVyOjphZGRfcmVmKCkgeworICAgICh2b2lkKSBtUmVmQ291bnQuZmV0Y2hfYWRkKDEpOworfQorCit2b2lkICpNZWRpYUJ1ZmZlcjo6ZGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbURhdGE7Cit9CisKK3NpemVfdCBNZWRpYUJ1ZmZlcjo6c2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNpemU7Cit9CisKK3NpemVfdCBNZWRpYUJ1ZmZlcjo6cmFuZ2Vfb2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBtUmFuZ2VPZmZzZXQ7Cit9CisKK3NpemVfdCBNZWRpYUJ1ZmZlcjo6cmFuZ2VfbGVuZ3RoKCkgY29uc3QgeworICAgIHJldHVybiBtUmFuZ2VMZW5ndGg7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXI6OnNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKSB7CisgICAgaWYgKG9mZnNldCArIGxlbmd0aCA+IG1TaXplKSB7CisgICAgICAgIEFMT0dFKCJvZmZzZXQgPSAlenUsIGxlbmd0aCA9ICV6dSwgbVNpemUgPSAlenUiLCBvZmZzZXQsIGxlbmd0aCwgbVNpemUpOworICAgIH0KKyAgICBDSEVDSyhvZmZzZXQgKyBsZW5ndGggPD0gbVNpemUpOworCisgICAgbVJhbmdlT2Zmc2V0ID0gb2Zmc2V0OworICAgIG1SYW5nZUxlbmd0aCA9IGxlbmd0aDsKK30KKworTWV0YURhdGFCYXNlJiBNZWRpYUJ1ZmZlcjo6bWV0YV9kYXRhKCkgeworICAgIHJldHVybiAqbU1ldGFEYXRhOworfQorCit2b2lkIE1lZGlhQnVmZmVyOjpyZXNldCgpIHsKKyAgICBtTWV0YURhdGEtPmNsZWFyKCk7CisgICAgc2V0X3JhbmdlKDAsIG1TaXplKTsKK30KKworTWVkaWFCdWZmZXI6On5NZWRpYUJ1ZmZlcigpIHsKKyAgICBDSEVDSyhtT2JzZXJ2ZXIgPT0gTlVMTCk7CisKKyAgICBpZiAobU93bnNEYXRhICYmIG1EYXRhICE9IE5VTEwgJiYgbU1lbW9yeSA9PSBOVUxMKSB7CisgICAgICAgIGZyZWUobURhdGEpOworICAgICAgICBtRGF0YSA9IE5VTEw7CisgICAgfQorCisgICBpZiAobU1lbW9yeS5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgZ2V0U2hhcmVkQ29udHJvbCgpLT5zZXREZWFkT2JqZWN0KCk7CisgICB9CisgICBkZWxldGUgbU1ldGFEYXRhOworfQorCit2b2lkIE1lZGlhQnVmZmVyOjpzZXRPYnNlcnZlcihNZWRpYUJ1ZmZlck9ic2VydmVyICpvYnNlcnZlcikgeworICAgIENIRUNLKG9ic2VydmVyID09IE5VTEwgfHwgbU9ic2VydmVyID09IE5VTEwpOworICAgIG1PYnNlcnZlciA9IG9ic2VydmVyOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXJCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJCYXNlLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXJCYXNlLmNwcApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckJhc2UuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyR3JvdXAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckdyb3VwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGZmOWE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckdyb3VwLmNwcApAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFCdWZmZXJHcm91cCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RkOjptaW4gaXMgbm90IGNvbnN0ZXhwciBpbiBDKysxMQordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0ZXhwciBUIE1JTihjb25zdCBUICZhLCBjb25zdCBUICZiKSB7IHJldHVybiBhIDw9IGIgPyBhIDogYjsgfQorCisvLyBNZWRpYUJ1ZmZlckdyb3VwIG1heSBjcmVhdGUgc2hhcmVkIG1lbW9yeSBidWZmZXJzIGF0IGEKKy8vIHNtYWxsZXIgdGhyZXNob2xkIHRoYW4gYW4gaXNvbGF0ZWQgbmV3IE1lZGlhQnVmZmVyLgorc3RhdGljIGNvbnN0IHNpemVfdCBrU2hhcmVkTWVtb3J5VGhyZXNob2xkID0gTUlOKAorICAgICAgICAoc2l6ZV90KU1lZGlhQnVmZmVyOjprU2hhcmVkTWVtVGhyZXNob2xkLCAoc2l6ZV90KSg0ICogMTAyNCkpOworCitzdHJ1Y3QgTWVkaWFCdWZmZXJHcm91cDo6SW50ZXJuYWxEYXRhIHsKKyAgICBNdXRleCBtTG9jazsKKyAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKKyAgICBzaXplX3QgbUdyb3d0aExpbWl0OyAgLy8gRG8gbm90IGF1dG9tYXRpY2FsbHkgZ3JvdyBncm91cCBsYXJnZXIgdGhhbiB0aGlzLgorICAgIHN0ZDo6bGlzdDxNZWRpYUJ1ZmZlckJhc2UgKj4gbUJ1ZmZlcnM7Cit9OworCitNZWRpYUJ1ZmZlckdyb3VwOjpNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBncm93dGhMaW1pdCkKKyAgICA6IG1XcmFwcGVyKG51bGxwdHIpLCBtSW50ZXJuYWwobmV3IEludGVybmFsRGF0YSgpKSB7CisgICAgbUludGVybmFsLT5tR3Jvd3RoTGltaXQgPSBncm93dGhMaW1pdDsKK30KKworTWVkaWFCdWZmZXJHcm91cDo6TWVkaWFCdWZmZXJHcm91cChzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpCisgICAgOiBtV3JhcHBlcihudWxscHRyKSwgbUludGVybmFsKG5ldyBJbnRlcm5hbERhdGEoKSkgeworICAgIGluaXQoYnVmZmVycywgYnVmZmVyX3NpemUsIGdyb3d0aExpbWl0KTsKK30KKwordm9pZCBNZWRpYUJ1ZmZlckdyb3VwOjppbml0KHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCkgeworICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID0gZ3Jvd3RoTGltaXQ7CisKKyAgICBpZiAobUludGVybmFsLT5tR3Jvd3RoTGltaXQgPiAwICYmIGJ1ZmZlcnMgPiBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCkgeworICAgICAgICBBTE9HVygiUHJlYWxsb2NhdGVkIGJ1ZmZlcnMgJXp1ID4gZ3Jvd3RoTGltaXQgJXp1LCBpbmNyZWFzaW5nIGdyb3d0aExpbWl0IiwKKyAgICAgICAgICAgICAgICBidWZmZXJzLCBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCk7CisgICAgICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID0gYnVmZmVyczsKKyAgICB9CisKKyNpZm5kZWYgTk9fSU1FTU9SWQorICAgIGlmIChidWZmZXJfc2l6ZSA+PSBrU2hhcmVkTWVtb3J5VGhyZXNob2xkKSB7CisgICAgICAgIEFMT0dEKCJjcmVhdGluZyBNZW1vcnlEZWFsZXIiKTsKKyAgICAgICAgLy8gVXNpbmcgYSBzaW5nbGUgTWVtb3J5RGVhbGVyIGlzIGVmZmljaWVudCBmb3IgYSBncm91cCBvZiBzaGFyZWQgbWVtb3J5IG9iamVjdHMuCisgICAgICAgIC8vIFRoaXMgbG9vcCBndWFyYW50ZWVzIHRoYXQgd2UgdXNlIHNoYXJlZCBtZW1vcnkgKG5vIGZhbGxiYWNrIHRvIG1hbGxvYykuCisKKyAgICAgICAgc2l6ZV90IGFsaWdubWVudCA9IE1lbW9yeURlYWxlcjo6Z2V0QWxsb2NhdGlvbkFsaWdubWVudCgpOworICAgICAgICBzaXplX3QgYXVnbWVudGVkX3NpemUgPSBidWZmZXJfc2l6ZSArIHNpemVvZihNZWRpYUJ1ZmZlcjo6U2hhcmVkQ29udHJvbCk7CisgICAgICAgIHNpemVfdCB0b3RhbCA9IChhdWdtZW50ZWRfc2l6ZSArIGFsaWdubWVudCAtIDEpIC8gYWxpZ25tZW50ICogYWxpZ25tZW50ICogYnVmZmVyczsKKyAgICAgICAgc3A8TWVtb3J5RGVhbGVyPiBtZW1vcnlEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKHRvdGFsLCAiTWVkaWFCdWZmZXJHcm91cCIpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmZmVyczsgKytpKSB7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBtZW0gPSBtZW1vcnlEZWFsZXItPmFsbG9jYXRlKGF1Z21lbnRlZF9zaXplKTsKKyAgICAgICAgICAgIGlmIChtZW0uZ2V0KCkgPT0gbnVsbHB0ciB8fCBtZW0tPnBvaW50ZXIoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIk9ubHkgYWxsb2NhdGVkICV6dSBzaGFyZWQgYnVmZmVycyBvZiBzaXplICV6dSIsIGksIGJ1ZmZlcl9zaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIobWVtKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+Z2V0U2hhcmVkQ29udHJvbCgpLT5jbGVhcigpOworICAgICAgICAgICAgYWRkX2J1ZmZlcihidWZmZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZWxzZQorICAgICh2b2lkKWtTaGFyZWRNZW1vcnlUaHJlc2hvbGQ7CisjZW5kaWYKKworICAgIC8vIE5vbi1zaGFyZWQgbWVtb3J5IGFsbG9jYXRpb24uCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidWZmZXJzOyArK2kpIHsKKyAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihidWZmZXJfc2l6ZSk7CisgICAgICAgIGlmIChidWZmZXItPmRhdGEoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBkZWxldGUgYnVmZmVyOyAvLyBkb24ndCBjYWxsIHJlbGVhc2UsIGl0J3Mgbm90IHByb3Blcmx5IGZvcm1lZAorICAgICAgICAgICAgQUxPR1coIk9ubHkgYWxsb2NhdGVkICV6dSBtYWxsb2MgYnVmZmVycyBvZiBzaXplICV6dSIsIGksIGJ1ZmZlcl9zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGFkZF9idWZmZXIoYnVmZmVyKTsKKyAgICB9Cit9CisKK01lZGlhQnVmZmVyR3JvdXA6On5NZWRpYUJ1ZmZlckdyb3VwKCkgeworICAgIGZvciAoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgOiBtSW50ZXJuYWwtPm1CdWZmZXJzKSB7CisgICAgICAgIGlmIChidWZmZXItPnJlZmNvdW50KCkgIT0gMCkgeworICAgICAgICAgICAgY29uc3QgaW50IGxvY2FsUmVmY291bnQgPSBidWZmZXItPmxvY2FsUmVmY291bnQoKTsKKyAgICAgICAgICAgIGNvbnN0IGludCByZW1vdGVSZWZjb3VudCA9IGJ1ZmZlci0+cmVtb3RlUmVmY291bnQoKTsKKworICAgICAgICAgICAgLy8gRmF0YWwgaWYgd2UgaGF2ZSBhIGxvY2FsIHJlZmNvdW50LgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihsb2NhbFJlZmNvdW50ICE9IDAsCisgICAgICAgICAgICAgICAgICAgICJidWZmZXIoJXApIGxvY2FsUmVmY291bnQgJWQgIT0gMCwgcmVtb3RlUmVmY291bnQgJWQiLAorICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGxvY2FsUmVmY291bnQsIHJlbW90ZVJlZmNvdW50KTsKKworICAgICAgICAgICAgLy8gTG9nIGFuIGVycm9yIGlmIHdlIGhhdmUgYSByZW1haW5pbmcgcmVtb3RlIHJlZmNvdW50LAorICAgICAgICAgICAgLy8gYXMgdGhlIHJlbW90ZSBwcm9jZXNzIG1heSBoYXZlIGRpZWQgb3IgbWF5IGhhdmUgaW5hcHByb3ByaWF0ZSBiZWhhdmlvci4KKyAgICAgICAgICAgIC8vIFRoZSBzaGFyZWQgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgTWVkaWFCdWZmZXIgd2lsbAorICAgICAgICAgICAgLy8gYXV0b21hdGljYWxseSBiZSByZWNsYWltZWQgd2hlbiB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIGZkcworICAgICAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIGl0LgorICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciglcCkgaGFzIHJlc2lkdWFsIHJlbW90ZVJlZmNvdW50ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCByZW1vdGVSZWZjb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gZ3JhY2VmdWxseSBkZWxldGUuCisgICAgICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIobnVsbHB0cik7CisgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgIH0KKyAgICBkZWxldGUgbUludGVybmFsOworICAgIGRlbGV0ZSBtV3JhcHBlcjsKK30KKwordm9pZCBNZWRpYUJ1ZmZlckdyb3VwOjphZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1JbnRlcm5hbC0+bUxvY2spOworCisgICAgLy8gaWYgd2UncmUgYWJvdmUgb3VyIGdyb3d0aCBsaW1pdCwgcmVsZWFzZSBidWZmZXJzIGlmIHdlIGNhbgorICAgIGZvciAoYXV0byBpdCA9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID4gMAorICAgICAgICAgICAgJiYgbUludGVybmFsLT5tQnVmZmVycy5zaXplKCkgPj0gbUludGVybmFsLT5tR3Jvd3RoTGltaXQKKyAgICAgICAgICAgICYmIGl0ICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgIGlmICgoKml0KS0+cmVmY291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICAoKml0KS0+c2V0T2JzZXJ2ZXIobnVsbHB0cik7CisgICAgICAgICAgICAoKml0KS0+cmVsZWFzZSgpOworICAgICAgICAgICAgaXQgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBidWZmZXItPnNldE9ic2VydmVyKHRoaXMpOworICAgIG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW1wbGFjZV9iYWNrKGJ1ZmZlcik7Cit9CisKK2Jvb2wgTWVkaWFCdWZmZXJHcm91cDo6aGFzX2J1ZmZlcnMoKSB7CisgICAgaWYgKG1JbnRlcm5hbC0+bUJ1ZmZlcnMuc2l6ZSgpIDwgbUludGVybmFsLT5tR3Jvd3RoTGltaXQpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7IC8vIFdlIGNhbiBhZGQgbW9yZSBidWZmZXJzIGludGVybmFsbHkuCisgICAgfQorICAgIGZvciAoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgOiBtSW50ZXJuYWwtPm1CdWZmZXJzKSB7CisgICAgICAgIGlmIChidWZmZXItPnJlZmNvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0dXNfdCBNZWRpYUJ1ZmZlckdyb3VwOjphY3F1aXJlX2J1ZmZlcigKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBib29sIG5vbkJsb2NraW5nLCBzaXplX3QgcmVxdWVzdGVkU2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtSW50ZXJuYWwtPm1Mb2NrKTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHNpemVfdCBzbWFsbGVzdCA9IHJlcXVlc3RlZFNpemU7CisgICAgICAgIHNpemVfdCBiaWdnZXN0ID0gcmVxdWVzdGVkU2l6ZTsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgPSBudWxscHRyOworICAgICAgICBhdXRvIGZyZWUgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gKCppdCktPnNpemUoKTsKKyAgICAgICAgICAgIGlmIChzaXplID4gYmlnZ2VzdCkgeworICAgICAgICAgICAgICAgIGJpZ2dlc3QgPSBzaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCgqaXQpLT5yZWZjb3VudCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+PSByZXF1ZXN0ZWRTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9ICppdDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzaXplIDwgc21hbGxlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgc21hbGxlc3QgPSBzaXplOyAvLyBhbHdheXMgZnJlZSB0aGUgc21hbGxlc3QgYnVmCisgICAgICAgICAgICAgICAgICAgIGZyZWUgPSBpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyCisgICAgICAgICAgICAgICAgJiYgKGZyZWUgIT0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKQorICAgICAgICAgICAgICAgICAgICB8fCBtSW50ZXJuYWwtPm1CdWZmZXJzLnNpemUoKSA8IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KSkgeworICAgICAgICAgICAgLy8gV2UgYWxsb2MgYmVmb3JlIHdlIGZyZWUgc28gZmFpbHVyZSBsZWF2ZXMgZ3JvdXAgdW5jaGFuZ2VkLgorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jYXRlU2l6ZSA9IHJlcXVlc3RlZFNpemUgPT0gMCA/IGJpZ2dlc3QgOgorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRTaXplIDwgU0laRV9NQVggLyAzICogMiAvKiBOQjogb3JkZXJpbmcgKi8gPworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRTaXplICogMyAvIDIgOiByZXF1ZXN0ZWRTaXplOworICAgICAgICAgICAgYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGFsbG9jYXRlU2l6ZSk7CisgICAgICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgZm9yIHNpemUgJXp1IiwgYWxsb2NhdGVTaXplKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgYnVmZmVyOyAvLyBJbnZhbGlkIGFsbG9jLCBwcmVmZXIgbm90IHRvIGNhbGwgcmVsZWFzZS4KKyAgICAgICAgICAgICAgICBidWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKHRoaXMpOworICAgICAgICAgICAgICAgIGlmIChmcmVlICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJlYWxsb2NhdGUgYnVmZmVyLCByZXF1ZXN0ZWQgc2l6ZSAlenUgdnMgYXZhaWxhYmxlICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkU2l6ZSwgKCpmcmVlKS0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgKCpmcmVlKS0+c2V0T2JzZXJ2ZXIobnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgICgqZnJlZSktPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgKmZyZWUgPSBidWZmZXI7IC8vIGluLXBsYWNlIHJlcGxhY2UKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiYWxsb2NhdGUgYnVmZmVyLCByZXF1ZXN0ZWQgc2l6ZSAlenUiLCByZXF1ZXN0ZWRTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbUludGVybmFsLT5tQnVmZmVycy5lbXBsYWNlX2JhY2soYnVmZmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBidWZmZXItPmFkZF9yZWYoKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVzZXQoKTsKKyAgICAgICAgICAgICpvdXQgPSBidWZmZXI7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vbkJsb2NraW5nKSB7CisgICAgICAgICAgICAqb3V0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICAgICAgfQorICAgICAgICAvLyBBbGwgYnVmZmVycyBhcmUgaW4gdXNlLCBibG9jayB1bnRpbCBvbmUgb2YgdGhlbSBpcyByZXR1cm5lZC4KKyAgICAgICAgbUludGVybmFsLT5tQ29uZGl0aW9uLndhaXQobUludGVybmFsLT5tTG9jayk7CisgICAgfQorICAgIC8vIE5ldmVyIGdldHMgaGVyZS4KK30KKworc2l6ZV90IE1lZGlhQnVmZmVyR3JvdXA6OmJ1ZmZlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbnRlcm5hbC0+bUJ1ZmZlcnMuc2l6ZSgpOworfQorCit2b2lkIE1lZGlhQnVmZmVyR3JvdXA6OnNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1JbnRlcm5hbC0+bUxvY2spOworICAgIG1JbnRlcm5hbC0+bUNvbmRpdGlvbi5zaWduYWwoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcAppbmRleCBlNWE4NWU5Li41MmIyNzY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCA9ICJ2aWRlby94LXZuZC5vbjIudnA4IjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSA9ICJ2aWRlby94LXZuZC5vbjIudnA5IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSA9ICJ2aWRlby9hdjAxIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyA9ICJ2aWRlby9hdmMiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyA9ICJ2aWRlby9oZXZjIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0ID0gInZpZGVvL21wNHYtZXMiOwpAQCAtMzEsNiArMzIsMTAgQEAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyA9ICJ2aWRlby9yYXciOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OID0gInZpZGVvL2RvbGJ5LXZpc2lvbiI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19TQ1JBTUJMRUQgPSAidmlkZW8vc2NyYW1ibGVkIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0RJVlggPSAidmlkZW8vZGl2eCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19ESVZYMyA9ICJ2aWRlby9kaXZ4MyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19YVklEID0gInZpZGVvL3h2aWQiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTUpQRUcgPSAidmlkZW8veC1tb3Rpb24tanBlZyI7CiAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiA9ICJhdWRpby8zZ3BwIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiA9ICJhdWRpby9hbXItd2IiOwpAQCAtNTAsMTIgKzU1LDE0IEBACiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTSA9ICJhdWRpby9nc20iOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzID0gImF1ZGlvL2FjMyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzID0gImF1ZGlvL2VhYzMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDM19KT0MgPSAiYXVkaW8vZWFjMy1qb2MiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0ID0gImF1ZGlvL2FjNCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQgPSAiYXVkaW8vc2NyYW1ibGVkIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FMQUMgPSAiYXVkaW8vYWxhYyI7CiAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCA9ICJ2aWRlby9tcDQiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBViA9ICJhdWRpby94LXdhdiI7Ci1jb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHID0gImFwcGxpY2F0aW9uL29nZyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHID0gImF1ZGlvL29nZyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTUFUUk9TS0EgPSAidmlkZW8veC1tYXRyb3NrYSI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUyA9ICJ2aWRlby9tcDJ0cyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfQVZJID0gInZpZGVvL2F2aSI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZXRhRGF0YS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWV0YURhdGEuY3BwCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWV0YURhdGFCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGFCYXNlLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWV0YURhdGFCYXNlLmNwcApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YUJhc2UuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2I5Y2NmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmNwcApAQCAtMCwwICsxLDM1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiT3B1c0hlYWRlciIKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlICJPcHVzSGVhZGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gT3B1cyB1c2VzIFZvcmJpcyBjaGFubmVsIG1hcHBpbmcsIGFuZCBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nIHNwZWNpZmllcworLy8gbWFwcGluZ3MgZm9yIHVwIHRvIDggY2hhbm5lbHMuIFRoaXMgaW5mb3JtYXRpb24gaXMgcGFydCBvZiB0aGUgVm9yYmlzIEkKKy8vIFNwZWNpZmljYXRpb246CisvLyBodHRwOi8vd3d3LnhpcGgub3JnL3ZvcmJpcy9kb2MvVm9yYmlzX0lfc3BlYy5odG1sCitjb25zdGV4cHIgaW50IGtNYXhDaGFubmVscyA9IDg7CisKK2NvbnN0ZXhwciB1aW50OF90IGtPcHVzQ2hhbm5lbE1hcFtrTWF4Q2hhbm5lbHNdW2tNYXhDaGFubmVsc10gPSB7CisgICAgICAgIHswfSwKKyAgICAgICAgezAsIDF9LAorICAgICAgICB7MCwgMiwgMX0sCisgICAgICAgIHswLCAxLCAyLCAzfSwKKyAgICAgICAgezAsIDQsIDEsIDIsIDN9LAorICAgICAgICB7MCwgNCwgMSwgMiwgMywgNX0sCisgICAgICAgIHswLCA0LCAxLCAyLCAzLCA1LCA2fSwKKyAgICAgICAgezAsIDYsIDEsIDIsIDMsIDQsIDUsIDd9LAorfTsKKworLy8gU2l6ZSBvZiB0aGUgT3B1cyBoZWFkZXIgZXhjbHVkaW5nIG9wdGlvbmFsIG1hcHBpbmcgaW5mb3JtYXRpb24uCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyU2l6ZSA9IDE5OworLy8gT2Zmc2V0IHRvIG1hZ2ljIHN0cmluZyB0aGF0IHN0YXJ0cyBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJMYWJlbE9mZnNldCA9IDA7CisvLyBPZmZzZXQgdG8gT3B1cyB2ZXJzaW9uIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJWZXJzaW9uT2Zmc2V0ID0gODsKKy8vIE9mZnNldCB0byB0aGUgY2hhbm5lbCBjb3VudCBieXRlIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJDaGFubmVsc09mZnNldCA9IDk7CisvLyBPZmZzZXQgdG8gdGhlIHByZS1za2lwIHZhbHVlIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJTa2lwU2FtcGxlc09mZnNldCA9IDEwOworLy8gT2Zmc2V0IHRvIHNhbXBsZSByYXRlIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJTYW1wbGVSYXRlT2Zmc2V0ID0gMTI7CisvLyBPZmZzZXQgdG8gdGhlIGdhaW4gdmFsdWUgaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlckdhaW5PZmZzZXQgPSAxNjsKKy8vIE9mZnNldCB0byB0aGUgY2hhbm5lbCBtYXBwaW5nIGJ5dGUgaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlckNoYW5uZWxNYXBwaW5nT2Zmc2V0ID0gMTg7CisvLyBPcHVzIEhlYWRlciBjb250YWlucyBhIHN0cmVhbSBtYXAuIFRoZSBtYXBwaW5nIHZhbHVlcyBhcmUgaW4gdGhlIGhlYWRlcgorLy8gYmV5b25kIHRoZSBhbHdheXMgcHJlc2VudCB8a09wdXNIZWFkZXJTaXplfCBieXRlcyBvZiBkYXRhLiBUaGUgbWFwcGluZworLy8gZGF0YSBjb250YWlucyBzdHJlYW0gY291bnQsIGNvdXBsaW5nIGluZm9ybWF0aW9uLCBhbmQgcGVyIGNoYW5uZWwgbWFwcGluZworLy8gdmFsdWVzOgorLy8gICAtIEJ5dGUgMDogTnVtYmVyIG9mIHN0cmVhbXMuCisvLyAgIC0gQnl0ZSAxOiBOdW1iZXIgY291cGxlZC4KKy8vICAgLSBCeXRlIDI6IFN0YXJ0aW5nIGF0IGJ5dGUgMiBhcmUgfGhlYWRlci0+Y2hhbm5lbHN8IHVpbnQ4IG1hcHBpbmcKKy8vICAgICAgICAgICAgIHZhbHVlcy4KKy8vIE9mZnNldCB0byB0aGUgbnVtYmVyIG9mIHN0cmVhbXMgaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXQgPSAxOTsKKy8vIE9mZnNldCB0byB0aGUgbnVtYmVyIG9mIHN0cmVhbXMgdGhhdCBhcmUgY291cGxlZCBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyTnVtQ291cGxlZFN0cmVhbXNPZmZzZXQgPSAyMDsKKy8vIE9mZnNldCB0byB0aGUgc3RyZWFtIHRvIGNoYW5uZWwgbWFwcGluZyBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ID0gMjE7CisKKy8vIERlZmF1bHQgYXVkaW8gb3V0cHV0IGNoYW5uZWwgbGF5b3V0LiBVc2VkIHRvIGluaXRpYWxpemUgfHN0cmVhbV9tYXB8IGluCisvLyBPcHVzSGVhZGVyLCBhbmQgcGFzc2VkIHRvIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUoKSB3aGVuIHRoZSBoZWFkZXIKKy8vIGRvZXMgbm90IGNvbnRhaW4gbWFwcGluZyBpbmZvcm1hdGlvbi4gVGhlIHZhbHVlcyBhcmUgdmFsaWQgb25seSBmb3IgbW9ubyBhbmQKKy8vIHN0ZXJlbyBvdXRwdXQ6IE9wdXMgc3RyZWFtcyB3aXRoIG1vcmUgdGhhbiAyIGNoYW5uZWxzIHJlcXVpcmUgYSBzdHJlYW0gbWFwLgorY29uc3RleHByIGludCBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCA9IDI7CisKK3N0YXRpYyB1aW50MTZfdCBSZWFkTEUxNihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLCB1aW50MzJfdCByZWFkX29mZnNldCkgeworICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIDJuZCBieXRlIGlzIHdpdGhpbiB0aGUgYnVmZmVyCisgICAgaWYgKHJlYWRfb2Zmc2V0ICsgMSA+PSBkYXRhX3NpemUpIHJldHVybiAwOworICAgIHVpbnQxNl90IHZhbDsKKyAgICB2YWwgPSBkYXRhW3JlYWRfb2Zmc2V0XTsKKyAgICB2YWwgfD0gZGF0YVtyZWFkX29mZnNldCArIDFdIDw8IDg7CisgICAgcmV0dXJuIHZhbDsKK30KKworLy8gUGFyc2VzIE9wdXMgSGVhZGVyLiBIZWFkZXIgc3BlYzogaHR0cDovL3dpa2kueGlwaC5vcmcvT2dnT3B1cyNJRF9IZWFkZXIKK2Jvb2wgUGFyc2VPcHVzSGVhZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsIE9wdXNIZWFkZXIqIGhlYWRlcikgeworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoZGF0YV9zaXplIDwga09wdXNIZWFkZXJTaXplKSB7CisgICAgICAgIEFMT0dWKCJIZWFkZXIgc2l6ZSBpcyB0b28gc21hbGwuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyLT5jaGFubmVscyA9IGRhdGFba09wdXNIZWFkZXJDaGFubmVsc09mZnNldF07CisKKyAgICBpZiAoaGVhZGVyLT5jaGFubmVscyA8IDEgfHwgaGVhZGVyLT5jaGFubmVscyA+IGtNYXhDaGFubmVscykgeworICAgICAgICBBTE9HVigiSW52YWxpZCBIZWFkZXIsIGJhZCBjaGFubmVsIGNvdW50OiAlZCIsIGhlYWRlci0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGhlYWRlci0+c2tpcF9zYW1wbGVzID0gUmVhZExFMTYoZGF0YSwgZGF0YV9zaXplLCBrT3B1c0hlYWRlclNraXBTYW1wbGVzT2Zmc2V0KTsKKyAgICBoZWFkZXItPmdhaW5fZGIgPSBzdGF0aWNfY2FzdDxpbnQxNl90PihSZWFkTEUxNihkYXRhLCBkYXRhX3NpemUsIGtPcHVzSGVhZGVyR2Fpbk9mZnNldCkpOworICAgIGhlYWRlci0+Y2hhbm5lbF9tYXBwaW5nID0gZGF0YVtrT3B1c0hlYWRlckNoYW5uZWxNYXBwaW5nT2Zmc2V0XTsKKyAgICBpZiAoIWhlYWRlci0+Y2hhbm5lbF9tYXBwaW5nKSB7CisgICAgICAgIGlmIChoZWFkZXItPmNoYW5uZWxzID4ga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJJbnZhbGlkIEhlYWRlciwgbWlzc2luZyBzdHJlYW0gbWFwLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGhlYWRlci0+bnVtX3N0cmVhbXMgPSAxOworICAgICAgICBoZWFkZXItPm51bV9jb3VwbGVkID0gaGVhZGVyLT5jaGFubmVscyA+IDE7CisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFswXSA9IDA7CisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFsxXSA9IDE7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoZGF0YV9zaXplIDwga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBoZWFkZXItPmNoYW5uZWxzKSB7CisgICAgICAgIEFMT0dWKCJJbnZhbGlkIHN0cmVhbSBtYXA7IGluc3VmZmljaWVudCBkYXRhIGZvciBjdXJyZW50IGNoYW5uZWwgIgorICAgICAgICAgICAgICAiY291bnQ6ICVkIiwKKyAgICAgICAgICAgICAgaGVhZGVyLT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyLT5udW1fc3RyZWFtcyA9IGRhdGFba09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0XTsKKyAgICBoZWFkZXItPm51bV9jb3VwbGVkID0gZGF0YVtrT3B1c0hlYWRlck51bUNvdXBsZWRTdHJlYW1zT2Zmc2V0XTsKKyAgICBpZiAoaGVhZGVyLT5udW1fc3RyZWFtcyArIGhlYWRlci0+bnVtX2NvdXBsZWQgIT0gaGVhZGVyLT5jaGFubmVscykgeworICAgICAgICBBTE9HVigiSW5jb25zaXN0ZW50IGNoYW5uZWwgbWFwcGluZy4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlci0+Y2hhbm5lbHM7ICsraSkKKyAgICAgICAgaGVhZGVyLT5zdHJlYW1fbWFwW2ldID0gZGF0YVtrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGldOworICAgIHJldHVybiB0cnVlOworfQorCitpbnQgV3JpdGVPcHVzSGVhZGVyKGNvbnN0IE9wdXNIZWFkZXIgJmhlYWRlciwgaW50IGlucHV0X3NhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXRwdXQsIHNpemVfdCBvdXRwdXRfc2l6ZSkgeworICAgIC8vIFNlZSBodHRwczovL3dpa2kueGlwaC5vcmcvT2dnT3B1cyNJRF9IZWFkZXIuCisgICAgY29uc3Qgc2l6ZV90IHRvdGFsX3NpemUgPSBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGhlYWRlci5jaGFubmVsczsKKyAgICBpZiAob3V0cHV0X3NpemUgPCB0b3RhbF9zaXplKSB7CisgICAgICAgIEFMT0dFKCJPdXRwdXQgYnVmZmVyIHRvbyBzbWFsbCBmb3IgaGVhZGVyLiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gZW5zdXJlIGVudGlyZSBoZWFkZXIgaXMgY2xlYXJlZCwgZXZlbiB0aG91Z2ggd2Ugb3ZlcndyaXRlIG11Y2ggb2YgaXQgYmVsb3cKKyAgICBtZW1zZXQob3V0cHV0LCAwLCBvdXRwdXRfc2l6ZSk7CisKKyAgICAvLyBTZXQgbWFnaWMgc2lnbmF0dXJlLgorICAgIG1lbWNweShvdXRwdXQgKyBrT3B1c0hlYWRlckxhYmVsT2Zmc2V0LCAiT3B1c0hlYWQiLCA4KTsKKyAgICAvLyBTZXQgT3B1cyB2ZXJzaW9uLgorICAgIG91dHB1dFtrT3B1c0hlYWRlclZlcnNpb25PZmZzZXRdID0gMTsKKyAgICAvLyBTZXQgY2hhbm5lbCBjb3VudC4KKyAgICBvdXRwdXRba09wdXNIZWFkZXJDaGFubmVsc09mZnNldF0gPSAodWludDhfdCloZWFkZXIuY2hhbm5lbHM7CisgICAgLy8gU2V0IHByZS1za2lwCisgICAgbWVtY3B5KG91dHB1dCArIGtPcHVzSGVhZGVyU2tpcFNhbXBsZXNPZmZzZXQsICZoZWFkZXIuc2tpcF9zYW1wbGVzLCBzaXplb2YodWludDE2X3QpKTsKKyAgICAvLyBTZXQgb3JpZ2luYWwgaW5wdXQgc2FtcGxlIHJhdGUgaW4gSHouCisgICAgbWVtY3B5KG91dHB1dCArIGtPcHVzSGVhZGVyU2FtcGxlUmF0ZU9mZnNldCwgJmlucHV0X3NhbXBsZV9yYXRlLCBzaXplb2YodWludDMyX3QpKTsKKyAgICAvLyBTZXQgb3V0cHV0IGdhaW4gaW4gZEIuCisgICAgbWVtY3B5KG91dHB1dCArIGtPcHVzSGVhZGVyR2Fpbk9mZnNldCwgJmhlYWRlci5nYWluX2RiLCBzaXplb2YodWludDE2X3QpKTsKKworICAgIGlmIChoZWFkZXIuY2hhbm5lbHMgPiAyKSB7CisgICAgICAgIC8vIFNldCBjaGFubmVsIG1hcHBpbmcKKyAgICAgICAgb3V0cHV0W2tPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXRdID0gMTsKKyAgICAgICAgLy8gQXNzdW1pbmcgbm8gY291cGxlZCBzdHJlYW1zLiBUaGlzIHNob3VsZCBhY3R1YWxseSBiZQorICAgICAgICAvLyBjaGFubmVscygpIC0gfGNvdXBsZWRfc3RyZWFtc3wuCisgICAgICAgIG91dHB1dFtrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXRdID0gaGVhZGVyLmNoYW5uZWxzOworICAgICAgICBvdXRwdXRba09wdXNIZWFkZXJOdW1Db3VwbGVkU3RyZWFtc09mZnNldF0gPSAwOworCisgICAgICAgIC8vIFNldCB0aGUgYWN0dWFsIHN0cmVhbSBtYXAuCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyLmNoYW5uZWxzOyArK2kpIHsKKyAgICAgICAgICAgIG91dHB1dFtrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGldID0ga09wdXNDaGFubmVsTWFwW2hlYWRlci5jaGFubmVscyAtIDFdW2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGhlYWRlci5jaGFubmVscyArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0cHV0W2tPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXRdID0gMDsKKyAgICAgICAgcmV0dXJuIGtPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXQgKyAxOworICAgIH0KK30KKworaW50IFdyaXRlT3B1c0hlYWRlcnMoY29uc3QgT3B1c0hlYWRlciAmaGVhZGVyLCBpbnQgaW5wdXRTYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0cHV0LCBzaXplX3Qgb3V0cHV0U2l6ZSwgdWludDY0X3QgY29kZWNEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNlZWtQcmVSb2xsKSB7CisgICAgaWYgKG91dHB1dFNpemUgPCBBT1BVU19VTklGSUVEX0NTRF9NSU5TSVpFKSB7CisgICAgICAgIEFMT0dEKCJCdWZmZXIgbm90IGxhcmdlIGVub3VnaCB0byBob2xkIHVuaWZpZWQgT1BVUyBDU0QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpbnQgaGVhZGVyTGVuID0gMDsKKworICAgIC8vIEFkZCBvcHVzIGhlYWRlcgorICAgIC8qCisgICAgICBGb2xsb3dpbmcgaXMgdGhlIENTRCBzeW50YXggZm9yIHNpZ25hbGxpbmcgT3B1c0hlYWRlcgorICAgICAgKGh0dHA6Ly93aWtpLnhpcGgub3JnL09nZ09wdXMjSURfSGVhZGVyKQorCisgICAgICBNYXJrZXIgKDggYnl0ZXMpIHwgTGVuZ3RoICg4IGJ5dGVzKSB8IE9wdXNIZWFkZXIKKworICAgICAgTWFya2VycyBzdXBwb3J0ZWQ6CisgICAgICBBT1BVU19DU0RfT1BVU19IRUFERVJfTUFSS0VSIC0gU2lnbmFscyBPcHVzIEhlYWRlcgorCisgICAgICBMZW5ndGggc2hvdWxkIGJlIGEgdmFsdWUgd2l0aGluIEFPUFVTX09QVVNIRUFEX01JTlNJWkUgYW5kIEFPUFVTX09QVVNIRUFEX01BWFNJWkUuCisgICAgKi8KKworICAgIG1lbWNweShvdXRwdXQgKyBoZWFkZXJMZW4sIEFPUFVTX0NTRF9PUFVTX0hFQURFUl9NQVJLRVIsIEFPUFVTX01BUktFUl9TSVpFKTsKKyAgICBoZWFkZXJMZW4gKz0gQU9QVVNfTUFSS0VSX1NJWkU7CisKKyAgICAvLyBQbGFjZSBob2xkZXIgZm9yIG9wdXNIZWFkZXIgU2l6ZQorICAgIGhlYWRlckxlbiArPSBBT1BVU19MRU5HVEhfU0laRTsKKworICAgIGludCBoZWFkZXJTaXplID0gV3JpdGVPcHVzSGVhZGVyKGhlYWRlciwgaW5wdXRTYW1wbGVSYXRlLCBvdXRwdXQgKyBoZWFkZXJMZW4sCisgICAgICAgIG91dHB1dFNpemUpOworICAgIGlmIChoZWFkZXJTaXplIDwgMCkgeworICAgICAgICBBTE9HRCgiJXM6IFdyaXRlT3B1c0hlYWRlciBmYWlsZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaGVhZGVyTGVuICs9IGhlYWRlclNpemU7CisKKyAgICAvLyBVcGRhdGUgb3B1cyBoZWFkZXJTaXplIGFmdGVyIEFPUFVTX0NTRF9PUFVTX0hFQURFUl9NQVJLRVIKKyAgICB1aW50NjRfdCBsZW5ndGggPSBoZWFkZXJTaXplOworICAgIG1lbWNweShvdXRwdXQgKyBBT1BVU19NQVJLRVJfU0laRSwgJmxlbmd0aCwgQU9QVVNfTEVOR1RIX1NJWkUpOworCisgICAgLyoKKyAgICAgIEZvbGxvd2luZyBpcyB0aGUgQ1NEIHN5bnRheCBmb3Igc2lnbmFsbGluZyBjb2RlYyBkZWxheSBhbmQKKyAgICAgIHNlZWsgcHJlLXJvbGwgd2hpY2ggaXMgdG8gYmUgYXBwZW5kZWQgYWZ0ZXIgT3B1c0hlYWRlcgorCisgICAgICBNYXJrZXIgKDggYnl0ZXMpIHwgTGVuZ3RoICg4IGJ5dGVzKSB8IFNhbXBsZXMgaW4gbnMgKDggYnl0ZXMpCisKKyAgICAgIE1hcmtlcnMgc3VwcG9ydGVkOgorICAgICAgQU9QVVNfQ1NEX0NPREVDX0RFTEFZX01BUktFUiAtIGNvZGVjIGRlbGF5IGFzIHNhbXBsZXMgaW4gbnMsIHJlcHJlc2VudGVkIGluIDggYnl0ZXMKKyAgICAgIEFPUFVTX0NTRF9TRUVLX1BSRVJPTExfTUFSS0VSIC0gcHJlcm9sbCBhZGp1c3RtZW50IGFzIHNhbXBsZXMgaW4gbnMsIHJlcHJlc2VudGVkIGluIDggYnl0ZXMKKworICAgICovCisgICAgbGVuZ3RoID0gc2l6ZW9mKGNvZGVjRGVsYXkpOworICAgIGlmIChoZWFkZXJMZW4gPiAob3V0cHV0U2l6ZSAtIEFPUFVTX01BUktFUl9TSVpFIC0gQU9QVVNfTEVOR1RIX1NJWkUgLSBsZW5ndGgpKSB7CisgICAgICAgIEFMT0dEKCJCdWZmZXIgbm90IGxhcmdlIGVub3VnaCB0byBob2xkIGNvZGVjIGRlbGF5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLy8gQWRkIGNvZGVjIGRlbGF5CisgICAgbWVtY3B5KG91dHB1dCArIGhlYWRlckxlbiwgQU9QVVNfQ1NEX0NPREVDX0RFTEFZX01BUktFUiwgQU9QVVNfTUFSS0VSX1NJWkUpOworICAgIGhlYWRlckxlbiArPSBBT1BVU19NQVJLRVJfU0laRTsKKyAgICBtZW1jcHkob3V0cHV0ICsgaGVhZGVyTGVuLCAmbGVuZ3RoLCBBT1BVU19MRU5HVEhfU0laRSk7CisgICAgaGVhZGVyTGVuICs9IEFPUFVTX0xFTkdUSF9TSVpFOworICAgIG1lbWNweShvdXRwdXQgKyBoZWFkZXJMZW4sICZjb2RlY0RlbGF5LCBsZW5ndGgpOworICAgIGhlYWRlckxlbiArPSBsZW5ndGg7CisKKyAgICBsZW5ndGggPSBzaXplb2Yoc2Vla1ByZVJvbGwpOworICAgIGlmIChoZWFkZXJMZW4gPiAob3V0cHV0U2l6ZSAtIEFPUFVTX01BUktFUl9TSVpFIC0gQU9QVVNfTEVOR1RIX1NJWkUgLSBsZW5ndGgpKSB7CisgICAgICAgIEFMT0dEKCJCdWZmZXIgbm90IGxhcmdlIGVub3VnaCB0byBob2xkIHNlZWsgcHJlIHJvbGwiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvLyBBZGQgc2tpcCBwcmUgcm9sbAorICAgIG1lbWNweShvdXRwdXQgKyBoZWFkZXJMZW4sIEFPUFVTX0NTRF9TRUVLX1BSRVJPTExfTUFSS0VSLCBBT1BVU19NQVJLRVJfU0laRSk7CisgICAgaGVhZGVyTGVuICs9IEFPUFVTX01BUktFUl9TSVpFOworICAgIG1lbWNweShvdXRwdXQgKyBoZWFkZXJMZW4sICZsZW5ndGgsIEFPUFVTX0xFTkdUSF9TSVpFKTsKKyAgICBoZWFkZXJMZW4gKz0gQU9QVVNfTEVOR1RIX1NJWkU7CisgICAgbWVtY3B5KG91dHB1dCArIGhlYWRlckxlbiwgJnNlZWtQcmVSb2xsLCBsZW5ndGgpOworICAgIGhlYWRlckxlbiArPSBsZW5ndGg7CisKKyAgICByZXR1cm4gaGVhZGVyTGVuOworfQorCitib29sIElzT3B1c0hlYWRlcihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YV9zaXplKSB7CisgICAgaWYgKGRhdGFfc2l6ZSA8IEFPUFVTX01BUktFUl9TSVpFKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gIW1lbWNtcChkYXRhLCBBT1BVU19DU0RfT1BVU19IRUFERVJfTUFSS0VSLCBBT1BVU19NQVJLRVJfU0laRSk7Cit9CisKK2Jvb2wgR2V0T3B1c0hlYWRlckJ1ZmZlcnMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKm9wdXNIZWFkQnVmLCBzaXplX3QgKm9wdXNIZWFkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmNvZGVjRGVsYXlCdWYsIHNpemVfdCAqY29kZWNEZWxheVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipzZWVrUHJlUm9sbEJ1Ziwgc2l6ZV90ICpzZWVrUHJlUm9sbFNpemUpIHsKKyAgICAqY29kZWNEZWxheUJ1ZiA9IE5VTEw7CisgICAgKmNvZGVjRGVsYXlTaXplID0gMDsKKyAgICAqc2Vla1ByZVJvbGxCdWYgPSBOVUxMOworICAgICpzZWVrUHJlUm9sbFNpemUgPSAwOworICAgICpvcHVzSGVhZEJ1ZiA9IE5VTEw7CisgICAgKm9wdXNIZWFkU2l6ZSA9IDA7CisKKyAgICAvLyBBT1BVU19NQVJLRVJfU0laRSBpcyA4ICJPcHVzSGVhZCIgaXMgb2Ygc2l6ZSA4CisgICAgaWYgKGRhdGFfc2l6ZSA8IDgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIENoZWNrIGlmIHRoZSBDU0QgaXMgaW4gbGVnYWN5IGZvcm1hdAorICAgIGlmICghbWVtY21wKCJPcHVzSGVhZCIsIGRhdGEsIDgpKSB7CisgICAgICAgIGlmIChkYXRhX3NpemUgPCBBT1BVU19PUFVTSEVBRF9NSU5TSVpFIHx8IGRhdGFfc2l6ZSA+IEFPUFVTX09QVVNIRUFEX01BWFNJWkUpIHsKKyAgICAgICAgICAgIEFMT0dEKCJVbmV4cGVjdGVkIHNpemUgZm9yIG9wdXNIZWFkU2l6ZSAlenUiLCBkYXRhX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICpvcHVzSGVhZEJ1ZiA9ICh2b2lkICopZGF0YTsKKyAgICAgICAgKm9wdXNIZWFkU2l6ZSA9IGRhdGFfc2l6ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChtZW1jbXAoQU9QVVNfQ1NEX01BUktFUl9QUkVGSVgsIGRhdGEsIEFPUFVTX0NTRF9NQVJLRVJfUFJFRklYX1NJWkUpID09IDApIHsKKyAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIHdoaWxlIChpIDw9IGRhdGFfc2l6ZSAtIEFPUFVTX01BUktFUl9TSVpFIC0gQU9QVVNfTEVOR1RIX1NJWkUpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmNzZEJ1ZiA9ICh1aW50OF90ICopZGF0YSArIGk7CisgICAgICAgICAgICBpZiAoIW1lbWNtcChjc2RCdWYsIEFPUFVTX0NTRF9PUFVTX0hFQURFUl9NQVJLRVIsIEFPUFVTX01BUktFUl9TSVpFKSkgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOworICAgICAgICAgICAgICAgIG1lbWNweSgmdmFsdWUsIGNzZEJ1ZiArIEFPUFVTX01BUktFUl9TSVpFLCBzaXplb2YodmFsdWUpKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCBBT1BVU19PUFVTSEVBRF9NSU5TSVpFIHx8IHZhbHVlID4gQU9QVVNfT1BVU0hFQURfTUFYU0laRSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiVW5leHBlY3RlZCBzaXplIGZvciBvcHVzSGVhZFNpemUgJSIgUFJJdTY0LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSArPSBBT1BVU19NQVJLRVJfU0laRSArIEFPUFVTX0xFTkdUSF9TSVpFICsgdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKGkgPiBkYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIk1hcmtlciBzaWduYWxzIGEgaGVhZGVyIHRoYXQgaXMgbGFyZ2VyIHRoYW4gaW5wdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqb3B1c0hlYWRCdWYgPSBjc2RCdWYgKyBBT1BVU19NQVJLRVJfU0laRSArIEFPUFVTX0xFTkdUSF9TSVpFOworICAgICAgICAgICAgICAgICpvcHVzSGVhZFNpemUgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFtZW1jbXAoY3NkQnVmLCBBT1BVU19DU0RfQ09ERUNfREVMQVlfTUFSS0VSLCBBT1BVU19NQVJLRVJfU0laRSkpIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnZhbHVlLCBjc2RCdWYgKyBBT1BVU19NQVJLRVJfU0laRSwgc2l6ZW9mKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IHNpemVvZih1aW50NjRfdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlVuZXhwZWN0ZWQgc2l6ZSBmb3IgY29kZWNEZWxheSAlIiBQUkl1NjQsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpICs9IEFPUFVTX01BUktFUl9TSVpFICsgQU9QVVNfTEVOR1RIX1NJWkUgKyB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAoaSA+IGRhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiTWFya2VyIHNpZ25hbHMgYSBoZWFkZXIgdGhhdCBpcyBsYXJnZXIgdGhhbiBpbnB1dCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpjb2RlY0RlbGF5QnVmID0gY3NkQnVmICsgQU9QVVNfTUFSS0VSX1NJWkUgKyBBT1BVU19MRU5HVEhfU0laRTsKKyAgICAgICAgICAgICAgICAqY29kZWNEZWxheVNpemUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1lbWNtcChjc2RCdWYsIEFPUFVTX0NTRF9TRUVLX1BSRVJPTExfTUFSS0VSLCBBT1BVU19NQVJLRVJfU0laRSkpIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnZhbHVlLCBjc2RCdWYgKyBBT1BVU19NQVJLRVJfU0laRSwgc2l6ZW9mKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IHNpemVvZih1aW50NjRfdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlVuZXhwZWN0ZWQgc2l6ZSBmb3Igc2Vla1ByZVJvbGxTaXplICUiIFBSSXU2NCwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkgKz0gQU9QVVNfTUFSS0VSX1NJWkUgKyBBT1BVU19MRU5HVEhfU0laRSArIHZhbHVlOworICAgICAgICAgICAgICAgIGlmIChpID4gZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJNYXJrZXIgc2lnbmFscyBhIGhlYWRlciB0aGF0IGlzIGxhcmdlciB0aGFuIGlucHV0Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnNlZWtQcmVSb2xsQnVmID0gY3NkQnVmICsgQU9QVVNfTUFSS0VSX1NJWkUgKyBBT1BVU19MRU5HVEhfU0laRTsKKyAgICAgICAgICAgICAgICAqc2Vla1ByZVJvbGxTaXplID0gdmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZm91bmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gaXQgaXNuJ3QgaW4gZWl0aGVyIGZvcm1hdAorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL1BhcnNlZE1lc3NhZ2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDljOWFkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlBhcnNlZE1lc3NhZ2UuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdGF0aWMKLXNwPFBhcnNlZE1lc3NhZ2U+IFBhcnNlZE1lc3NhZ2U6OlBhcnNlKAotICAgICAgICBjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBub01vcmVEYXRhLCBzaXplX3QgKmxlbmd0aCkgewotICAgIHNwPFBhcnNlZE1lc3NhZ2U+IG1zZyA9IG5ldyBQYXJzZWRNZXNzYWdlOwotICAgIHNzaXplX3QgcmVzID0gbXNnLT5wYXJzZShkYXRhLCBzaXplLCBub01vcmVEYXRhKTsKLQotICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICpsZW5ndGggPSAwOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAqbGVuZ3RoID0gcmVzOwotICAgIHJldHVybiBtc2c7Ci19Ci0KLVBhcnNlZE1lc3NhZ2U6OlBhcnNlZE1lc3NhZ2UoKSB7Ci19Ci0KLVBhcnNlZE1lc3NhZ2U6On5QYXJzZWRNZXNzYWdlKCkgewotfQotCi1ib29sIFBhcnNlZE1lc3NhZ2U6OmZpbmRTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgQVN0cmluZyAqdmFsdWUpIGNvbnN0IHsKLSAgICBBU3RyaW5nIGtleSA9IG5hbWU7Ci0gICAga2V5LnRvbG93ZXIoKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtRGljdC5pbmRleE9mS2V5KGtleSk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHZhbHVlLT5jbGVhcigpOwotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAqdmFsdWUgPSBtRGljdC52YWx1ZUF0KGluZGV4KTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQYXJzZWRNZXNzYWdlOjpmaW5kSW50MzIoY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqdmFsdWUpIGNvbnN0IHsKLSAgICBBU3RyaW5nIHN0cmluZ1ZhbHVlOwotCi0gICAgaWYgKCFmaW5kU3RyaW5nKG5hbWUsICZzdHJpbmdWYWx1ZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNoYXIgKmVuZDsKLSAgICAqdmFsdWUgPSBzdHJ0b2woc3RyaW5nVmFsdWUuY19zdHIoKSwgJmVuZCwgMTApOwotCi0gICAgaWYgKGVuZCA9PSBzdHJpbmdWYWx1ZS5jX3N0cigpIHx8ICplbmQgIT0gJ1wwJykgewotICAgICAgICAqdmFsdWUgPSAwOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IGNoYXIgKlBhcnNlZE1lc3NhZ2U6OmdldENvbnRlbnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Db250ZW50LmNfc3RyKCk7Ci19Ci0KLXNzaXplX3QgUGFyc2VkTWVzc2FnZTo6cGFyc2UoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgbm9Nb3JlRGF0YSkgewotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHNzaXplX3QgbGFzdERpY3RJbmRleCA9IC0xOwotCi0gICAgc2l6ZV90IG9mZnNldCA9IDA7Ci0gICAgYm9vbCBoZWFkZXJzQ29tcGxldGUgPSBmYWxzZTsKLSAgICB3aGlsZSAob2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICBzaXplX3QgbGluZUVuZE9mZnNldCA9IG9mZnNldDsKLSAgICAgICAgd2hpbGUgKGxpbmVFbmRPZmZzZXQgKyAxIDwgc2l6ZQotICAgICAgICAgICAgICAgICYmIChkYXRhW2xpbmVFbmRPZmZzZXRdICE9ICdccicKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRhdGFbbGluZUVuZE9mZnNldCArIDFdICE9ICdcbicpKSB7Ci0gICAgICAgICAgICArK2xpbmVFbmRPZmZzZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGluZUVuZE9mZnNldCArIDEgPj0gc2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgQVN0cmluZyBsaW5lKCZkYXRhW29mZnNldF0sIGxpbmVFbmRPZmZzZXQgLSBvZmZzZXQpOwotCi0gICAgICAgIGlmIChvZmZzZXQgPT0gMCkgewotICAgICAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgdGhlIHJlcXVlc3Qvc3RhdHVzIGxpbmUuCi0KLSAgICAgICAgICAgIG1EaWN0LmFkZChBU3RyaW5nKCJfIiksIGxpbmUpOwotICAgICAgICAgICAgb2Zmc2V0ID0gbGluZUVuZE9mZnNldCArIDI7Ci0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxpbmVFbmRPZmZzZXQgPT0gb2Zmc2V0KSB7Ci0gICAgICAgICAgICAvLyBBbiBlbXB0eSBsaW5lIHNlcGFyYXRlcyBoZWFkZXJzIGZyb20gYm9keS4KLSAgICAgICAgICAgIGhlYWRlcnNDb21wbGV0ZSA9IHRydWU7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxpbmUuY19zdHIoKVswXSA9PSAnICcgfHwgbGluZS5jX3N0cigpWzBdID09ICdcdCcpIHsKLSAgICAgICAgICAgIC8vIFN1cHBvcnQgZm9yIGZvbGRlZCBoZWFkZXIgdmFsdWVzLgotCi0gICAgICAgICAgICBpZiAobGFzdERpY3RJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGl0J3MgbWFsZm9ybWVkIHNpbmNlIHRoZSBmaXJzdCBoZWFkZXIgbGluZQotICAgICAgICAgICAgICAgIC8vIGNhbm5vdCBjb250aW51ZSBhbnl0aGluZy4uLgotCi0gICAgICAgICAgICAgICAgQVN0cmluZyAmdmFsdWUgPSBtRGljdC5lZGl0VmFsdWVBdChsYXN0RGljdEluZGV4KTsKLSAgICAgICAgICAgICAgICB2YWx1ZS5hcHBlbmQobGluZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9mZnNldCA9IGxpbmVFbmRPZmZzZXQgKyAyOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzc2l6ZV90IGNvbG9uUG9zID0gbGluZS5maW5kKCI6Iik7Ci0gICAgICAgIGlmIChjb2xvblBvcyA+PSAwKSB7Ci0gICAgICAgICAgICBBU3RyaW5nIGtleShsaW5lLCAwLCBjb2xvblBvcyk7Ci0gICAgICAgICAgICBrZXkudHJpbSgpOwotICAgICAgICAgICAga2V5LnRvbG93ZXIoKTsKLQotICAgICAgICAgICAgbGluZS5lcmFzZSgwLCBjb2xvblBvcyArIDEpOwotCi0gICAgICAgICAgICBsYXN0RGljdEluZGV4ID0gbURpY3QuYWRkKGtleSwgbGluZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBvZmZzZXQgPSBsaW5lRW5kT2Zmc2V0ICsgMjsKLSAgICB9Ci0KLSAgICBpZiAoIWhlYWRlcnNDb21wbGV0ZSAmJiAoIW5vTW9yZURhdGEgfHwgb2Zmc2V0ID09IDApKSB7Ci0gICAgICAgIC8vIFdlIGVpdGhlciBzYXcgdGhlIGVtcHR5IGxpbmUgc2VwYXJhdGluZyBoZWFkZXJzIGZyb20gYm9keQotICAgICAgICAvLyBvciB3ZSBzYXcgYXQgbGVhc3QgdGhlIHN0YXR1cyBsaW5lIGFuZCBrbm93IHRoYXQgbm8gbW9yZSBkYXRhCi0gICAgICAgIC8vIGlzIGdvaW5nIHRvIGZvbGxvdy4KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbURpY3Quc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgbURpY3QuZWRpdFZhbHVlQXQoaSkudHJpbSgpOwotICAgIH0KLQotICAgIGludDMyX3QgY29udGVudExlbmd0aDsKLSAgICBpZiAoIWZpbmRJbnQzMigiY29udGVudC1sZW5ndGgiLCAmY29udGVudExlbmd0aCkgfHwgY29udGVudExlbmd0aCA8IDApIHsKLSAgICAgICAgY29udGVudExlbmd0aCA9IDA7Ci0gICAgfQotCi0gICAgc2l6ZV90IHRvdGFsTGVuZ3RoID0gb2Zmc2V0ICsgY29udGVudExlbmd0aDsKLQotICAgIGlmIChzaXplIDwgdG90YWxMZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIG1Db250ZW50LnNldFRvKCZkYXRhW29mZnNldF0sIGNvbnRlbnRMZW5ndGgpOwotCi0gICAgcmV0dXJuIHRvdGFsTGVuZ3RoOwotfQotCi1ib29sIFBhcnNlZE1lc3NhZ2U6OmdldFJlcXVlc3RGaWVsZChzaXplX3QgaW5kZXgsIEFTdHJpbmcgKmZpZWxkKSBjb25zdCB7Ci0gICAgQVN0cmluZyBsaW5lOwotICAgIENIRUNLKGZpbmRTdHJpbmcoIl8iLCAmbGluZSkpOwotCi0gICAgc2l6ZV90IHByZXZPZmZzZXQgPSAwOwotICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDw9IGluZGV4OyArK2kpIHsKLSAgICAgICAgaWYgKG9mZnNldCA+PSBsaW5lLnNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3NpemVfdCBzcGFjZVBvcyA9IGxpbmUuZmluZCgiICIsIG9mZnNldCk7Ci0KLSAgICAgICAgaWYgKHNwYWNlUG9zIDwgMCkgewotICAgICAgICAgICAgc3BhY2VQb3MgPSBsaW5lLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByZXZPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIG9mZnNldCA9IHNwYWNlUG9zICsgMTsKLSAgICB9Ci0KLSAgICBmaWVsZC0+c2V0VG8obGluZSwgcHJldk9mZnNldCwgb2Zmc2V0IC0gcHJldk9mZnNldCAtIDEpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUGFyc2VkTWVzc2FnZTo6Z2V0U3RhdHVzQ29kZShpbnQzMl90ICpzdGF0dXNDb2RlKSBjb25zdCB7Ci0gICAgQVN0cmluZyBzdGF0dXNDb2RlU3RyaW5nOwotICAgIGlmICghZ2V0UmVxdWVzdEZpZWxkKDEsICZzdGF0dXNDb2RlU3RyaW5nKSkgewotICAgICAgICAqc3RhdHVzQ29kZSA9IDA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjaGFyICplbmQ7Ci0gICAgKnN0YXR1c0NvZGUgPSBzdHJ0b2woc3RhdHVzQ29kZVN0cmluZy5jX3N0cigpLCAmZW5kLCAxMCk7Ci0KLSAgICBpZiAoKmVuZCAhPSAnXDAnIHx8IGVuZCA9PSBzdGF0dXNDb2RlU3RyaW5nLmNfc3RyKCkKLSAgICAgICAgICAgIHx8ICgqc3RhdHVzQ29kZSkgPCAxMDAgfHwgKCpzdGF0dXNDb2RlKSA+IDk5OSkgewotICAgICAgICAqc3RhdHVzQ29kZSA9IDA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotQVN0cmluZyBQYXJzZWRNZXNzYWdlOjpkZWJ1Z1N0cmluZygpIGNvbnN0IHsKLSAgICBBU3RyaW5nIGxpbmU7Ci0gICAgQ0hFQ0soZmluZFN0cmluZygiXyIsICZsaW5lKSk7Ci0KLSAgICBsaW5lLmFwcGVuZCgiXG4iKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbURpY3Quc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29uc3QgQVN0cmluZyAma2V5ID0gbURpY3Qua2V5QXQoaSk7Ci0gICAgICAgIGNvbnN0IEFTdHJpbmcgJnZhbHVlID0gbURpY3QudmFsdWVBdChpKTsKLQotICAgICAgICBpZiAoa2V5ID09IEFTdHJpbmcoIl8iKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBsaW5lLmFwcGVuZChrZXkpOwotICAgICAgICBsaW5lLmFwcGVuZCgiOiAiKTsKLSAgICAgICAgbGluZS5hcHBlbmQodmFsdWUpOwotICAgICAgICBsaW5lLmFwcGVuZCgiXG4iKTsKLSAgICB9Ci0KLSAgICBsaW5lLmFwcGVuZCgiXG4iKTsKLSAgICBsaW5lLmFwcGVuZChtQ29udGVudCk7Ci0KLSAgICByZXR1cm4gbGluZTsKLX0KLQotLy8gc3RhdGljCi1ib29sIFBhcnNlZE1lc3NhZ2U6OkdldEF0dHJpYnV0ZSgKLSAgICAgICAgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqa2V5LCBBU3RyaW5nICp2YWx1ZSkgewotICAgIHZhbHVlLT5jbGVhcigpOwotCi0gICAgc2l6ZV90IGtleUxlbiA9IHN0cmxlbihrZXkpOwotCi0gICAgZm9yICg7OykgewotICAgICAgICB3aGlsZSAoaXNzcGFjZSgqcykpIHsKLSAgICAgICAgICAgICsrczsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IGNoYXIgKmNvbG9uUG9zID0gc3RyY2hyKHMsICc7Jyk7Ci0KLSAgICAgICAgc2l6ZV90IGxlbiA9Ci0gICAgICAgICAgICAoY29sb25Qb3MgPT0gTlVMTCkgPyBzdHJsZW4ocykgOiBjb2xvblBvcyAtIHM7Ci0KLSAgICAgICAgaWYgKGxlbiA+PSBrZXlMZW4gKyAxICYmIHNba2V5TGVuXSA9PSAnPScgJiYgIXN0cm5jbXAocywga2V5LCBrZXlMZW4pKSB7Ci0gICAgICAgICAgICB2YWx1ZS0+c2V0VG8oJnNba2V5TGVuICsgMV0sIGxlbiAtIGtleUxlbiAtIDEpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29sb25Qb3MgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcyA9IGNvbG9uUG9zICsgMTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBQYXJzZWRNZXNzYWdlOjpHZXRJbnQzMkF0dHJpYnV0ZSgKLSAgICAgICAgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqa2V5LCBpbnQzMl90ICp2YWx1ZSkgewotICAgIEFTdHJpbmcgc3RyaW5nVmFsdWU7Ci0gICAgaWYgKCFHZXRBdHRyaWJ1dGUocywga2V5LCAmc3RyaW5nVmFsdWUpKSB7Ci0gICAgICAgICp2YWx1ZSA9IDA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjaGFyICplbmQ7Ci0gICAgKnZhbHVlID0gc3RydG9sKHN0cmluZ1ZhbHVlLmNfc3RyKCksICZlbmQsIDEwKTsKLQotICAgIGlmIChlbmQgPT0gc3RyaW5nVmFsdWUuY19zdHIoKSB8fCAqZW5kICE9ICdcMCcpIHsKLSAgICAgICAgKnZhbHVlID0gMDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAKaW5kZXggOGYzMjU4Mi4uODM0Yjg4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcApAQCAtMjgsMTQgKzI4LDMxIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAorICAgIHNpemVfdCBidWZTaXplID0gbiAvIDQgKiAzOworICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IG5ldyBBQnVmZmVyKGJ1ZlNpemUpOworCisgICAgaWYgKGRlY29kZUJhc2U2NChidWYtPmRhdGEoKSwgJmJ1ZlNpemUsIHMuY19zdHIoKSkpIHsKKyAgICAgICAgYnVmLT5zZXRSYW5nZSgwLCBidWZTaXplKTsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2Jvb2wgZGVjb2RlQmFzZTY0KHVpbnQ4X3QgKm91dCwgc2l6ZV90ICppbk91dEJ1ZlNpemUsIGNvbnN0IGNoYXIqIHMpIHsKKyAgICBzaXplX3QgbiA9IHN0cmxlbihzKTsKKworICAgIGlmICgobiAlIDQpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIHNpemVfdCBwYWRkaW5nID0gMDsKLSAgICBpZiAobiA+PSAxICYmIHMuY19zdHIoKVtuIC0gMV0gPT0gJz0nKSB7CisgICAgaWYgKG4gPj0gMSAmJiBzW24gLSAxXSA9PSAnPScpIHsKICAgICAgICAgcGFkZGluZyA9IDE7CiAKLSAgICAgICAgaWYgKG4gPj0gMiAmJiBzLmNfc3RyKClbbiAtIDJdID09ICc9JykgeworICAgICAgICBpZiAobiA+PSAyICYmIHNbbiAtIDJdID09ICc9JykgewogICAgICAgICAgICAgcGFkZGluZyA9IDI7CiAKLSAgICAgICAgICAgIGlmIChuID49IDMgJiYgcy5jX3N0cigpW24gLSAzXSA9PSAnPScpIHsKKyAgICAgICAgICAgIGlmIChuID49IDMgJiYgc1tuIC0gM10gPT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgcGFkZGluZyA9IDM7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQ1LDE1ICs2MiwxMyBAQAogICAgIC8vIGFscmVhZHkgbWFkZSBzdXJlIHRoYXQgbiAlIDQgPT0gMC4KICAgICBzaXplX3Qgb3V0TGVuID0gKG4gLyA0KSAqIDMgLSBwYWRkaW5nOwogCi0gICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIob3V0TGVuKTsKLSAgICB1aW50OF90ICpvdXQgPSBidWZmZXItPmRhdGEoKTsKLSAgICBpZiAob3V0ID09IE5VTEwgfHwgYnVmZmVyLT5zaXplKCkgPCBvdXRMZW4pIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG91dCA9PSBOVUxMIHx8ICppbk91dEJ1ZlNpemUgPCBvdXRMZW4pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBzaXplX3QgaiA9IDA7CiAgICAgdWludDMyX3QgYWNjdW0gPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgIGNoYXIgYyA9IHMuY19zdHIoKVtpXTsKKyAgICAgICAgY2hhciBjID0gc1tpXTsKICAgICAgICAgdW5zaWduZWQgdmFsdWU7CiAgICAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgewogICAgICAgICAgICAgdmFsdWUgPSBjIC0gJ0EnOwpAQCAtNjYsMTAgKzgxLDEwIEBACiAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnLycgfHwgYyA9PSAnXycpIHsKICAgICAgICAgICAgIHZhbHVlID0gNjM7CiAgICAgICAgIH0gZWxzZSBpZiAoYyAhPSAnPScpIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKGkgPCBuIC0gcGFkZGluZykgewotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdmFsdWUgPSAwOwpAQCAtODYsNyArMTAxLDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBidWZmZXI7CisgICAgKmluT3V0QnVmU2l6ZSA9IGo7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyBjaGFyIGVuY29kZTZCaXQodW5zaWduZWQgeCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzZWJhYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFfTkVUV09SS19TRVNTSU9OX0hfCi0KLSNkZWZpbmUgQV9ORVRXT1JLX1NFU1NJT05fSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KLQotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQU1lc3NhZ2U7Ci0KLS8vIEhlbHBlciBjbGFzcyB0byBtYW5hZ2UgYSBudW1iZXIgb2YgbGl2ZSBzb2NrZXRzIChkYXRhZ3JhbSBhbmQgc3RyZWFtLWJhc2VkKQotLy8gb24gYSBzaW5nbGUgdGhyZWFkLiBDbGllbnRzIGFyZSBub3RpZmllZCBhYm91dCBhY3Rpdml0eSB0aHJvdWdoIEFNZXNzYWdlcy4KLXN0cnVjdCBBTmV0d29ya1Nlc3Npb24gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgQU5ldHdvcmtTZXNzaW9uKCk7Ci0KLSAgICBzdGF0dXNfdCBzdGFydCgpOwotICAgIHN0YXR1c190IHN0b3AoKTsKLQotICAgIHN0YXR1c190IGNyZWF0ZVJUU1BDbGllbnQoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCB1bnNpZ25lZCBwb3J0LCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgICAgIGludDMyX3QgKnNlc3Npb25JRCk7Ci0KLSAgICBzdGF0dXNfdCBjcmVhdGVSVFNQU2VydmVyKAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgJmFkZHIsIHVuc2lnbmVkIHBvcnQsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIHN0YXR1c190IGNyZWF0ZVVEUFNlc3Npb24oCi0gICAgICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3QgY3JlYXRlVURQU2Vzc2lvbigKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvY2FsUG9ydCwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3QgY29ubmVjdFVEUFNlc3Npb24oCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwgdW5zaWduZWQgcmVtb3RlUG9ydCk7Ci0KLSAgICAvLyBwYXNzaXZlCi0gICAgc3RhdHVzX3QgY3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uKAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgJmFkZHIsIHVuc2lnbmVkIHBvcnQsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIC8vIGFjdGl2ZQotICAgIHN0YXR1c190IGNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbigKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvY2FsUG9ydCwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3QgZGVzdHJveVNlc3Npb24oaW50MzJfdCBzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3Qgc2VuZFJlcXVlc3QoCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JRCwgY29uc3Qgdm9pZCAqZGF0YSwgc3NpemVfdCBzaXplID0gLTEsCi0gICAgICAgICAgICBib29sIHRpbWVWYWxpZCA9IGZhbHNlLCBpbnQ2NF90IHRpbWVVcyA9IC0xbGwpOwotCi0gICAgc3RhdHVzX3Qgc3dpdGNoVG9XZWJTb2NrZXRNb2RlKGludDMyX3Qgc2Vzc2lvbklEKTsKLQotICAgIGVudW0gTm90aWZpY2F0aW9uUmVhc29uIHsKLSAgICAgICAga1doYXRFcnJvciwKLSAgICAgICAga1doYXRDb25uZWN0ZWQsCi0gICAgICAgIGtXaGF0Q2xpZW50Q29ubmVjdGVkLAotICAgICAgICBrV2hhdERhdGEsCi0gICAgICAgIGtXaGF0RGF0YWdyYW0sCi0gICAgICAgIGtXaGF0QmluYXJ5RGF0YSwKLSAgICAgICAga1doYXRXZWJTb2NrZXRNZXNzYWdlLAotICAgICAgICBrV2hhdE5ldHdvcmtTdGFsbCwKLSAgICB9OwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+QU5ldHdvcmtTZXNzaW9uKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IE5ldHdvcmtUaHJlYWQ7Ci0gICAgc3RydWN0IFNlc3Npb247Ci0KLSAgICBNdXRleCBtTG9jazsKLSAgICBzcDxUaHJlYWQ+IG1UaHJlYWQ7Ci0KLSAgICBpbnQzMl90IG1OZXh0U2Vzc2lvbklEOwotCi0gICAgaW50IG1QaXBlRmRbMl07Ci0KLSAgICBLZXllZFZlY3RvcjxpbnQzMl90LCBzcDxTZXNzaW9uPiA+IG1TZXNzaW9uczsKLQotICAgIGVudW0gTW9kZSB7Ci0gICAgICAgIGtNb2RlQ3JlYXRlVURQU2Vzc2lvbiwKLSAgICAgICAga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25QYXNzaXZlLAotICAgICAgICBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbkFjdGl2ZSwKLSAgICAgICAga01vZGVDcmVhdGVSVFNQU2VydmVyLAotICAgICAgICBrTW9kZUNyZWF0ZVJUU1BDbGllbnQsCi0gICAgfTsKLSAgICBzdGF0dXNfdCBjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgICAgIE1vZGUgbW9kZSwKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICphZGRyLAotICAgICAgICAgICAgdW5zaWduZWQgcG9ydCwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsCi0gICAgICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgdm9pZCB0aHJlYWRMb29wKCk7Ci0gICAgdm9pZCBpbnRlcnJ1cHQoKTsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBNYWtlU29ja2V0Tm9uQmxvY2tpbmcoaW50IHMpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU5ldHdvcmtTZXNzaW9uKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQV9ORVRXT1JLX1NFU1NJT05fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkNGQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCisjZGVmaW5lIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIEF1ZGlvUHJlc2VudGF0aW9uVmVyc2lvbiB7CisgICAgUFJFU0VOVEFUSU9OX1ZFUlNJT05fVU5ERUZJTkVEID0gMCwKKyAgICBQUkVTRU5UQVRJT05fVkVSU0lPTl8xLAorfTsKKworZW51bSBNYXN0ZXJpbmdJbmRpY2F0aW9uIHsKKyAgICBNQVNURVJJTkdfTk9UX0lORElDQVRFRCwKKyAgICBNQVNURVJFRF9GT1JfU1RFUkVPLAorICAgIE1BU1RFUkVEX0ZPUl9TVVJST1VORCwKKyAgICBNQVNURVJFRF9GT1JfM0QsCisgICAgTUFTVEVSRURfRk9SX0hFQURQSE9ORSwKK307CisKK3N0cnVjdCBBdWRpb1ByZXNlbnRhdGlvbiB7CisgICAgdWludDMyX3QgbVZlcnNpb24gPSBQUkVTRU5UQVRJT05fVkVSU0lPTl9VTkRFRklORUQ7CisgICAgaW50MzJfdCBtUHJlc2VudGF0aW9uSWQgPSAtMTsKKyAgICBpbnQzMl90IG1Qcm9ncmFtSWQgPSAtMTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG1MYWJlbHM7CisgICAgc3RkOjpzdHJpbmcgbUxhbmd1YWdlOworICAgIE1hc3RlcmluZ0luZGljYXRpb24gbU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJJTkdfTk9UX0lORElDQVRFRDsKKyAgICBib29sIG1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlID0gZmFsc2U7CisgICAgYm9vbCBtU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlID0gZmFsc2U7CisgICAgYm9vbCBtRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSA9IGZhbHNlOworfTsKKworc3RydWN0IEF1ZGlvUHJlc2VudGF0aW9uVjEgOiBwdWJsaWMgQXVkaW9QcmVzZW50YXRpb24geworICAgIEF1ZGlvUHJlc2VudGF0aW9uVjEoKSB7CisgICAgICAgIG1WZXJzaW9uID0gUFJFU0VOVEFUSU9OX1ZFUlNJT05fMTsKKyAgICB9Cit9OworCit0eXBlZGVmIHN0ZDo6dmVjdG9yPEF1ZGlvUHJlc2VudGF0aW9uPiBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb247CisKK3ZvaWQgc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKGNvbnN0IEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiYgcHJlc2VudGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtKiBzZXJpYWxpemVkT3V0cHV0KTsKK3N0YXR1c190IGRlc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKHN0ZDo6aXN0cmVhbSogc2VyaWFsaXplZElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uICpwcmVzZW50YXRpb25zKTsKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQVVESU9fUFJFU0VOVEFUSU9OX0lORk9fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaAppbmRleCBkNmM3NjhkLi5jZDBhZjJiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oCkBAIC0yNyw2ICsyNyw4IEBACiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KICNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KIAorc3RydWN0IEFNZWRpYUZvcm1hdDsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQ29sb3JVdGlscyB7CkBAIC0xMzUsNiArMTM3LDkgQEAKICAgICBzdGF0aWMgdm9pZCBjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCiAgICAgICAgICAgICBpbnQzMl90IHByaW1hcmllcywgaW50MzJfdCB0cmFuc2ZlciwgaW50MzJfdCBjb2VmZnMsIGJvb2wgZnVsbFJhbmdlLAogICAgICAgICAgICAgQ29sb3JBc3BlY3RzICZhc3BlY3RzKTsKKyAgICBzdGF0aWMgdm9pZCBjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoCisgICAgICAgIGludDMyX3QgcHJpbWFyaWVzLCBpbnQzMl90IGlzb3RyYW5zZmVyLCBpbnQzMl90IGNvZWZmcywgYm9vbCBmdWxsUmFuZ2UsCisgICAgICAgIGludDMyX3QgKnJhbmdlLCBpbnQzMl90ICpzdGFuZGFyZCwgaW50MzJfdCAqdHJhbnNmZXIpOwogCiAgICAgLy8gdW5wYWNrIGEgdWludDMyX3QgdG8gYSBmdWxsIENvbG9yQXNwZWN0cyBzdHJ1Y3QKICAgICBzdGF0aWMgQ29sb3JBc3BlY3RzIHVucGFja1RvQ29sb3JBc3BlY3RzKHVpbnQzMl90IHBhY2tlZCk7CkBAIC0xODAsNiArMTg1LDggQEAKIAogICAgIC8vIHdyaXRlcyB8aW5mb3wgaW50byBmb3JtYXQuCiAgICAgc3RhdGljIHZvaWQgc2V0SERSU3RhdGljSW5mb0ludG9Gb3JtYXQoY29uc3QgSERSU3RhdGljSW5mbyAmaW5mbywgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIC8vIHdyaXRlcyB8aW5mb3wgaW50byBmb3JtYXQuCisgICAgc3RhdGljIHZvaWQgc2V0SERSU3RhdGljSW5mb0ludG9BTWVkaWFGb3JtYXQoY29uc3QgSERSU3RhdGljSW5mbyAmaW5mbywgQU1lZGlhRm9ybWF0ICpmb3JtYXQpOwogfTsKIAogaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZyhhbmRyb2lkOjpDb2xvclV0aWxzOjpDb2xvclN0YW5kYXJkIGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKaW5kZXggNTg3NThiYy4uMDA3YTA5YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKQEAgLTI1LDYgKzI1LDcgQEAKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQODsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDk7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVYxOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0FWQzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0OwpAQCAtMzMsNiArMzQsMTAgQEAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19SQVc7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1NDUkFNQkxFRDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19ESVZYOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0RJVlgzOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1hWSUQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTUpQRUc7CiAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkI7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCOwpAQCAtNTIsNiArNTcsOCBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDMzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDNDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQ7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUxBQzsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MDM3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGUgT3B1cyBzcGVjaWZpY2F0aW9uIGlzIHBhcnQgb2YgSUVURiBSRkMgNjcxNjoKKyAqIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY3MTYKKyAqLworCisjaWZuZGVmIE9QVVNfSEVBREVSX0hfCisjZGVmaW5lIE9QVVNfSEVBREVSX0hfCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogQ29uc3RhbnRzIHVzZWQgZm9yIGRlbGltaXRpbmcgT3B1cyBDU0QgKi8KKyNkZWZpbmUgQU9QVVNfQ1NEX01BUktFUl9QUkVGSVggIkFPUFVTIgorI2RlZmluZSBBT1BVU19DU0RfTUFSS0VSX1BSRUZJWF9TSVpFIChzaXplb2YoQU9QVVNfQ1NEX01BUktFUl9QUkVGSVgpIC0gMSkKKyNkZWZpbmUgQU9QVVNfQ1NEX09QVVNfSEVBREVSX01BUktFUiBBT1BVU19DU0RfTUFSS0VSX1BSRUZJWCAiSERSIgorI2RlZmluZSBBT1BVU19DU0RfQ09ERUNfREVMQVlfTUFSS0VSIEFPUFVTX0NTRF9NQVJLRVJfUFJFRklYICJETFkiCisjZGVmaW5lIEFPUFVTX0NTRF9TRUVLX1BSRVJPTExfTUFSS0VSIEFPUFVTX0NTRF9NQVJLRVJfUFJFRklYICJQUkwiCisjZGVmaW5lIEFPUFVTX01BUktFUl9TSVpFIDgKKyNkZWZpbmUgQU9QVVNfTEVOR1RIX1NJWkUgc2l6ZW9mKHVpbnQ2NF90KQorI2RlZmluZSBBT1BVU19DU0RfQ09ERUNfREVMQVlfU0laRSBcCisgICAgIChBT1BVU19NQVJLRVJfU0laRSkgKyAoQU9QVVNfTEVOR1RIX1NJWkUpICsgc2l6ZW9mKHVpbnQ2NF90KQorI2RlZmluZSBBT1BVU19DU0RfU0VFS19QUkVST0xMX1NJWkUgXAorICAgICAoQU9QVVNfTUFSS0VSX1NJWkUpICsgKEFPUFVTX0xFTkdUSF9TSVpFKSArIHNpemVvZih1aW50NjRfdCkKKworLyogT3B1c0hlYWQgY3NkIG1pbmltdW0gc2l6ZSBpcyAxOSAqLworI2RlZmluZSBBT1BVU19PUFVTSEVBRF9NSU5TSVpFIDE5CisjZGVmaW5lIEFPUFVTX0NTRF9PUFVTSEVBRF9NSU5TSVpFIFwKKyAgICAoQU9QVVNfTUFSS0VSX1NJWkUpICsgKEFPUFVTX0xFTkdUSF9TSVpFKSArIChBT1BVU19PUFVTSEVBRF9NSU5TSVpFKQorCisjZGVmaW5lIEFPUFVTX1VOSUZJRURfQ1NEX01JTlNJWkUgXAorICAgICgoQU9QVVNfQ1NEX09QVVNIRUFEX01JTlNJWkUpICsgXAorICAgICAoQU9QVVNfQ1NEX0NPREVDX0RFTEFZX1NJWkUpICsgXAorICAgICAoQU9QVVNfQ1NEX1NFRUtfUFJFUk9MTF9TSVpFKSkKKworLyogT3B1c0hlYWQgY3NkIGF0IG1heCBjYW4gYmUgQU9QVVNfQ1NEX09QVVNIRUFEX01JTlNJWkUgKyAyICsgbWF4IG51bWJlciBvZiBjaGFubmVscyAoMjU1KSAqLworI2RlZmluZSBBT1BVU19PUFVTSEVBRF9NQVhTSVpFICgoQU9QVVNfT1BVU0hFQURfTUlOU0laRSkgKyAyICsgMjU1KQorI2RlZmluZSBBT1BVU19DU0RfT1BVU0hFQURfTUFYU0laRSBcCisgICAgKEFPUFVTX01BUktFUl9TSVpFKSArIChBT1BVU19MRU5HVEhfU0laRSkgKyAoQU9QVVNfT1BVU0hFQURfTUFYU0laRSkKKworI2RlZmluZSBBT1BVU19VTklGSUVEX0NTRF9NQVhTSVpFIFwKKyAgICAoKEFPUFVTX0NTRF9PUFVTSEVBRF9NQVhTSVpFKSArIFwKKyAgICAgKEFPUFVTX0NTRF9DT0RFQ19ERUxBWV9TSVpFKSArIFwKKyAgICAgKEFPUFVTX0NTRF9TRUVLX1BSRVJPTExfU0laRSkpCisKK3N0cnVjdCBPcHVzSGVhZGVyIHsKKyAgICBpbnQgY2hhbm5lbHM7CisgICAgaW50IGNoYW5uZWxfbWFwcGluZzsKKyAgICBpbnQgbnVtX3N0cmVhbXM7CisgICAgaW50IG51bV9jb3VwbGVkOworICAgIGludDE2X3QgZ2Fpbl9kYjsKKyAgICBpbnQgc2tpcF9zYW1wbGVzOworICAgIHVpbnQ4X3Qgc3RyZWFtX21hcFs4XTsKK307CisKK2Jvb2wgUGFyc2VPcHVzSGVhZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsIE9wdXNIZWFkZXIqIGhlYWRlcik7CitpbnQgV3JpdGVPcHVzSGVhZGVyKGNvbnN0IE9wdXNIZWFkZXIgJmhlYWRlciwgaW50IGlucHV0X3NhbXBsZV9yYXRlLCB1aW50OF90KiBvdXRwdXQsIHNpemVfdCBvdXRwdXRfc2l6ZSk7Citib29sIEdldE9wdXNIZWFkZXJCdWZmZXJzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvcHVzSGVhZEJ1Ziwgc2l6ZV90ICpvcHVzSGVhZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipjb2RlY0RlbGF5QnVmLCBzaXplX3QgKmNvZGVjRGVsYXlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqc2Vla1ByZVJvbGxCdWYsIHNpemVfdCAqc2Vla1ByZVJvbGxTaXplKTsKK2ludCBXcml0ZU9wdXNIZWFkZXJzKGNvbnN0IE9wdXNIZWFkZXIgJmhlYWRlciwgaW50IGlucHV0U2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dHB1dCwgc2l6ZV90IG91dHB1dFNpemUsIHVpbnQ2NF90IGNvZGVjRGVsYXksCisgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzZWVrUHJlUm9sbCk7Citib29sIElzT3B1c0hlYWRlcihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YV9zaXplKTsKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gT1BVU19IRUFERVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL1BhcnNlZE1lc3NhZ2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL1BhcnNlZE1lc3NhZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0M2E5My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9QYXJzZWRNZXNzYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIEVuY2Fwc3VsYXRlcyBhbiAiSFRUUC9SVFNQIHN0eWxlIiByZXNwb25zZSwgaS5lLiBhIHN0YXR1cyBsaW5lLAotLy8ga2V5L3ZhbHVlIHBhaXJzIG1ha2luZyB1cCB0aGUgaGVhZGVycyBhbmQgYW4gb3B0aW9uYWwgYm9keS9jb250ZW50Lgotc3RydWN0IFBhcnNlZE1lc3NhZ2UgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgc3RhdGljIHNwPFBhcnNlZE1lc3NhZ2U+IFBhcnNlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgbm9Nb3JlRGF0YSwgc2l6ZV90ICpsZW5ndGgpOwotCi0gICAgYm9vbCBmaW5kU3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIEFTdHJpbmcgKnZhbHVlKSBjb25zdDsKLSAgICBib29sIGZpbmRJbnQzMihjb25zdCBjaGFyICpuYW1lLCBpbnQzMl90ICp2YWx1ZSkgY29uc3Q7Ci0KLSAgICBjb25zdCBjaGFyICpnZXRDb250ZW50KCkgY29uc3Q7Ci0KLSAgICBib29sIGdldFJlcXVlc3RGaWVsZChzaXplX3QgaW5kZXgsIEFTdHJpbmcgKmZpZWxkKSBjb25zdDsKLSAgICBib29sIGdldFN0YXR1c0NvZGUoaW50MzJfdCAqc3RhdHVzQ29kZSkgY29uc3Q7Ci0KLSAgICBBU3RyaW5nIGRlYnVnU3RyaW5nKCkgY29uc3Q7Ci0KLSAgICBzdGF0aWMgYm9vbCBHZXRBdHRyaWJ1dGUoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqa2V5LCBBU3RyaW5nICp2YWx1ZSk7Ci0KLSAgICBzdGF0aWMgYm9vbCBHZXRJbnQzMkF0dHJpYnV0ZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmtleSwgaW50MzJfdCAqdmFsdWUpOwotCi0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5QYXJzZWRNZXNzYWdlKCk7Ci0KLXByaXZhdGU6Ci0gICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgQVN0cmluZz4gbURpY3Q7Ci0gICAgQVN0cmluZyBtQ29udGVudDsKLQotICAgIFBhcnNlZE1lc3NhZ2UoKTsKLQotICAgIHNzaXplX3QgcGFyc2UoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgbm9Nb3JlRGF0YSk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQYXJzZWRNZXNzYWdlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oCmluZGV4IGFiYzk1ZTAuLjYwZmI5ZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oCkBAIC0yNiw2ICsyNiw5IEBACiBzdHJ1Y3QgQVN0cmluZzsKIAogc3A8QUJ1ZmZlcj4gZGVjb2RlQmFzZTY0KGNvbnN0IEFTdHJpbmcgJnMpOworCitib29sIGRlY29kZUJhc2U2NCh1aW50OF90ICpvdXQsIHNpemVfdCAqaW5PdXRCdWZTaXplLCBjb25zdCBjaGFyKiBzKTsKKwogdm9pZCBlbmNvZGVCYXNlNjQoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIEFTdHJpbmcgKm91dCk7CiAKIHZvaWQgZW5jb2RlQmFzZTY0VXJsKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBBU3RyaW5nICpvdXQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9DbGVhck1lZGlhSFRUUC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0NsZWFyTWVkaWFIVFRQLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTU3YzhhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9DbGVhck1lZGlhSFRUUC5jcHAKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyTWVkaWFIVFRQIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJNZWRpYUhUVFAuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitDbGVhck1lZGlhSFRUUDo6Q2xlYXJNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pCisgICAgOiBtSW5pdENoZWNrKChjb25uICE9IE5VTEwpID8gT0sgOiBOT19JTklUKSwKKyAgICAgIG1IVFRQQ29ubmVjdGlvbihjb25uKSwKKyAgICAgIG1DYWNoZWRTaXplVmFsaWQoZmFsc2UpLAorICAgICAgbUNhY2hlZFNpemUoMGxsKSB7Cit9CisKK0NsZWFyTWVkaWFIVFRQOjp+Q2xlYXJNZWRpYUhUVFAoKSB7Cit9CisKK3N0YXR1c190IENsZWFyTWVkaWFIVFRQOjpjb25uZWN0KAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICBvZmY2NF90IC8qIG9mZnNldCAqLykgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGV4dEhlYWRlcnM7CisgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgeworICAgICAgICBleHRIZWFkZXJzID0gKmhlYWRlcnM7CisgICAgfQorCisgICAgaWYgKGV4dEhlYWRlcnMuaW5kZXhPZktleShTdHJpbmc4KCJVc2VyLUFnZW50IikpIDwgMCkgeworICAgICAgICBleHRIZWFkZXJzLmFkZChTdHJpbmc4KCJVc2VyLUFnZW50IiksIFN0cmluZzgoTWFrZVVzZXJBZ2VudCgpLmNfc3RyKCkpKTsKKyAgICB9CisKKyAgICBtTGFzdFVSSSA9IHVyaTsKKyAgICAvLyByZWNvbm5lY3QoKSBjYWxscyB3aXRoIHVyaSA9PSBvbGQgbUxhc3RVUkkuY19zdHIoKSwgd2hpY2ggZ2V0cyB6YXBwZWQKKyAgICAvLyBhcyBwYXJ0IG9mIHRoZSBhYm92ZSBhc3NpZ25tZW50LiBFbnN1cmUgbm8gYWNjaWRlbnRhbCBsYXRlciB1c2UuCisgICAgdXJpID0gTlVMTDsKKworICAgIGJvb2wgc3VjY2VzcyA9IG1IVFRQQ29ubmVjdGlvbi0+Y29ubmVjdChtTGFzdFVSSS5jX3N0cigpLCAmZXh0SGVhZGVycyk7CisKKyAgICBtTGFzdEhlYWRlcnMgPSBleHRIZWFkZXJzOworCisgICAgbUNhY2hlZFNpemVWYWxpZCA9IGZhbHNlOworCisgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgQVN0cmluZyBzYW5pdGl6ZWQgPSB1cmlEZWJ1Z1N0cmluZyhtTGFzdFVSSSk7CisgICAgICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJDbGVhck1lZGlhSFRUUCglcykiLCBzYW5pdGl6ZWQuY19zdHIoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHN1Y2Nlc3MgPyBPSyA6IFVOS05PV05fRVJST1I7Cit9CisKK3ZvaWQgQ2xlYXJNZWRpYUhUVFA6OmNsb3NlKCkgeworICAgIGRpc2Nvbm5lY3QoKTsKK30KKwordm9pZCBDbGVhck1lZGlhSFRUUDo6ZGlzY29ubmVjdCgpIHsKKyAgICBtTmFtZSA9IFN0cmluZzgoIkNsZWFyTWVkaWFIVFRQKDxkaXNjb25uZWN0ZWQ+KSIpOworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtSFRUUENvbm5lY3Rpb24tPmRpc2Nvbm5lY3QoKTsKK30KKworc3RhdHVzX3QgQ2xlYXJNZWRpYUhUVFA6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXRDaGVjazsKK30KKworc3NpemVfdCBDbGVhck1lZGlhSFRUUDo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworCisgICAgc2l6ZV90IG51bUJ5dGVzUmVhZCA9IDA7CisgICAgd2hpbGUgKG51bUJ5dGVzUmVhZCA8IHNpemUpIHsKKyAgICAgICAgc2l6ZV90IGNvcHkgPSBzaXplIC0gbnVtQnl0ZXNSZWFkOworCisgICAgICAgIGlmIChjb3B5ID4gNjQgKiAxMDI0KSB7CisgICAgICAgICAgICAvLyBsaW1pdCB0aGUgYnVmZmVyIHNpemVzIHRyYW5zZmVycmVkIGFjcm9zcyBiaW5kZXIgYm91bmRhcmllcworICAgICAgICAgICAgLy8gdG8gYXZvaWQgc3B1cmlvdXMgdHJhbnNhY3Rpb24gZmFpbHVyZXMuCisgICAgICAgICAgICBjb3B5ID0gNjQgKiAxMDI0OworICAgICAgICB9CisKKyAgICAgICAgc3NpemVfdCBuID0gbUhUVFBDb25uZWN0aW9uLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgb2Zmc2V0ICsgbnVtQnl0ZXNSZWFkLCAodWludDhfdCAqKWRhdGEgKyBudW1CeXRlc1JlYWQsIGNvcHkpOworCisgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG51bUJ5dGVzUmVhZCArPSBuOworICAgIH0KKworICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKKworICAgIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KG51bUJ5dGVzUmVhZCwgZGVsYXlVcyk7CisKKyAgICByZXR1cm4gbnVtQnl0ZXNSZWFkOworfQorCitzdGF0dXNfdCBDbGVhck1lZGlhSFRUUDo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgLy8gQ2FjaGluZyB0aGUgcmV0dXJuZWQgc2l6ZSBzbyB0aGF0IGl0IHN0YXlzIHZhbGlkIGV2ZW4gYWZ0ZXIgYQorICAgIC8vIGRpc2Nvbm5lY3QuIE51Q2FjaGVkU291cmNlMiByZWxpZXMgb24gdGhpcy4KKworICAgIGlmICghbUNhY2hlZFNpemVWYWxpZCkgeworICAgICAgICBtQ2FjaGVkU2l6ZSA9IG1IVFRQQ29ubmVjdGlvbi0+Z2V0U2l6ZSgpOworICAgICAgICBtQ2FjaGVkU2l6ZVZhbGlkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAqc2l6ZSA9IG1DYWNoZWRTaXplOworCisgICAgcmV0dXJuICpzaXplIDwgMCA/ICpzaXplIDogc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KE9LKTsKK30KKwordWludDMyX3QgQ2xlYXJNZWRpYUhUVFA6OmZsYWdzKCkgeworICAgIHJldHVybiBrV2FudHNQcmVmZXRjaGluZyB8IGtJc0hUVFBCYXNlZFNvdXJjZTsKK30KKworc3RhdHVzX3QgQ2xlYXJNZWRpYUhUVFA6OnJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgcmV0dXJuIGNvbm5lY3QobUxhc3RVUkkuY19zdHIoKSwgJm1MYXN0SGVhZGVycywgb2Zmc2V0KTsKK30KKworCitTdHJpbmc4IENsZWFyTWVkaWFIVFRQOjpnZXRVcmkoKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7CisgICAgfQorCisgICAgU3RyaW5nOCB1cmk7CisgICAgaWYgKE9LID09IG1IVFRQQ29ubmVjdGlvbi0+Z2V0VXJpKCZ1cmkpKSB7CisgICAgICAgIHJldHVybiB1cmk7CisgICAgfQorICAgIHJldHVybiBTdHJpbmc4KG1MYXN0VVJJLmNfc3RyKCkpOworfQorCitTdHJpbmc4IENsZWFyTWVkaWFIVFRQOjpnZXRNSU1FVHlwZSgpIGNvbnN0IHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgfQorCisgICAgU3RyaW5nOCBtaW1lVHlwZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtSFRUUENvbm5lY3Rpb24tPmdldE1JTUVUeXBlKCZtaW1lVHlwZSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWltZVR5cGU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKaW5kZXggN2M5MjQ3ZS4uMGZiYTNkYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcApAQCAtMzAsMTAgKzMwLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogTWVkaWFIVFRQOjpNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pCi0gICAgOiBtSW5pdENoZWNrKChjb25uICE9IE5VTEwpID8gT0sgOiBOT19JTklUKSwKLSAgICAgIG1IVFRQQ29ubmVjdGlvbihjb25uKSwKLSAgICAgIG1DYWNoZWRTaXplVmFsaWQoZmFsc2UpLAotICAgICAgbUNhY2hlZFNpemUoMGxsKSwKKyAgICA6IENsZWFyTWVkaWFIVFRQKGNvbm4pLAogICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCkgewogfQogCkBAIC00MSwxMTcgKzM4LDYgQEAKICAgICBjbGVhckRSTVN0YXRlX2woKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFIVFRQOjpjb25uZWN0KAotICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICBvZmY2NF90IC8qIG9mZnNldCAqLykgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGV4dEhlYWRlcnM7Ci0gICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewotICAgICAgICBleHRIZWFkZXJzID0gKmhlYWRlcnM7Ci0gICAgfQotCi0gICAgaWYgKGV4dEhlYWRlcnMuaW5kZXhPZktleShTdHJpbmc4KCJVc2VyLUFnZW50IikpIDwgMCkgewotICAgICAgICBleHRIZWFkZXJzLmFkZChTdHJpbmc4KCJVc2VyLUFnZW50IiksIFN0cmluZzgoTWFrZVVzZXJBZ2VudCgpLmNfc3RyKCkpKTsKLSAgICB9Ci0KLSAgICBtTGFzdFVSSSA9IHVyaTsKLSAgICAvLyByZWNvbm5lY3QoKSBjYWxscyB3aXRoIHVyaSA9PSBvbGQgbUxhc3RVUkkuY19zdHIoKSwgd2hpY2ggZ2V0cyB6YXBwZWQKLSAgICAvLyBhcyBwYXJ0IG9mIHRoZSBhYm92ZSBhc3NpZ25tZW50LiBFbnN1cmUgbm8gYWNjaWRlbnRhbCBsYXRlciB1c2UuCi0gICAgdXJpID0gTlVMTDsKLQotICAgIGJvb2wgc3VjY2VzcyA9IG1IVFRQQ29ubmVjdGlvbi0+Y29ubmVjdChtTGFzdFVSSS5jX3N0cigpLCAmZXh0SGVhZGVycyk7Ci0KLSAgICBtTGFzdEhlYWRlcnMgPSBleHRIZWFkZXJzOwotCi0gICAgbUNhY2hlZFNpemVWYWxpZCA9IGZhbHNlOwotCi0gICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgQVN0cmluZyBzYW5pdGl6ZWQgPSB1cmlEZWJ1Z1N0cmluZyhtTGFzdFVSSSk7Ci0gICAgICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJNZWRpYUhUVFAoJXMpIiwgc2FuaXRpemVkLmNfc3RyKCkpOwotICAgIH0KLQotICAgIHJldHVybiBzdWNjZXNzID8gT0sgOiBVTktOT1dOX0VSUk9SOwotfQotCi12b2lkIE1lZGlhSFRUUDo6ZGlzY29ubmVjdCgpIHsKLSAgICBtTmFtZSA9IFN0cmluZzgoIk1lZGlhSFRUUCg8ZGlzY29ubmVjdGVkPikiKTsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbUhUVFBDb25uZWN0aW9uLT5kaXNjb25uZWN0KCk7Ci19Ci0KLXN0YXR1c190IE1lZGlhSFRUUDo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBtSW5pdENoZWNrOwotfQotCi1zc2l6ZV90IE1lZGlhSFRUUDo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotCi0gICAgc2l6ZV90IG51bUJ5dGVzUmVhZCA9IDA7Ci0gICAgd2hpbGUgKG51bUJ5dGVzUmVhZCA8IHNpemUpIHsKLSAgICAgICAgc2l6ZV90IGNvcHkgPSBzaXplIC0gbnVtQnl0ZXNSZWFkOwotCi0gICAgICAgIGlmIChjb3B5ID4gNjQgKiAxMDI0KSB7Ci0gICAgICAgICAgICAvLyBsaW1pdCB0aGUgYnVmZmVyIHNpemVzIHRyYW5zZmVycmVkIGFjcm9zcyBiaW5kZXIgYm91bmRhcmllcwotICAgICAgICAgICAgLy8gdG8gYXZvaWQgc3B1cmlvdXMgdHJhbnNhY3Rpb24gZmFpbHVyZXMuCi0gICAgICAgICAgICBjb3B5ID0gNjQgKiAxMDI0OwotICAgICAgICB9Ci0KLSAgICAgICAgc3NpemVfdCBuID0gbUhUVFBDb25uZWN0aW9uLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgb2Zmc2V0ICsgbnVtQnl0ZXNSZWFkLCAodWludDhfdCAqKWRhdGEgKyBudW1CeXRlc1JlYWQsIGNvcHkpOwotCi0gICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIG51bUJ5dGVzUmVhZCArPSBuOwotICAgIH0KLQotICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKLQotICAgIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KG51bUJ5dGVzUmVhZCwgZGVsYXlVcyk7Ci0KLSAgICByZXR1cm4gbnVtQnl0ZXNSZWFkOwotfQotCi1zdGF0dXNfdCBNZWRpYUhUVFA6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIC8vIENhY2hpbmcgdGhlIHJldHVybmVkIHNpemUgc28gdGhhdCBpdCBzdGF5cyB2YWxpZCBldmVuIGFmdGVyIGEKLSAgICAvLyBkaXNjb25uZWN0LiBOdUNhY2hlZFNvdXJjZTIgcmVsaWVzIG9uIHRoaXMuCi0KLSAgICBpZiAoIW1DYWNoZWRTaXplVmFsaWQpIHsKLSAgICAgICAgbUNhY2hlZFNpemUgPSBtSFRUUENvbm5lY3Rpb24tPmdldFNpemUoKTsKLSAgICAgICAgbUNhY2hlZFNpemVWYWxpZCA9IHRydWU7Ci0gICAgfQotCi0gICAgKnNpemUgPSBtQ2FjaGVkU2l6ZTsKLQotICAgIHJldHVybiAqc2l6ZSA8IDAgPyAqc2l6ZSA6IHN0YXRpY19jYXN0PHN0YXR1c190PihPSyk7Ci19Ci0KLXVpbnQzMl90IE1lZGlhSFRUUDo6ZmxhZ3MoKSB7Ci0gICAgcmV0dXJuIGtXYW50c1ByZWZldGNoaW5nIHwga0lzSFRUUEJhc2VkU291cmNlOwotfQotCi1zdGF0dXNfdCBNZWRpYUhUVFA6OnJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgcmV0dXJuIGNvbm5lY3QobUxhc3RVUkkuY19zdHIoKSwgJm1MYXN0SGVhZGVycywgb2Zmc2V0KTsKLX0KLQogLy8gRFJNLi4uCiAKIHNwPERlY3J5cHRIYW5kbGU+IE1lZGlhSFRUUDo6RHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciogbWltZSkgewpAQCAtMTc2LDMzICs2Miw2IEBACiAgICAgcmV0dXJuIG1EZWNyeXB0SGFuZGxlOwogfQogCi1TdHJpbmc4IE1lZGlhSFRUUDo6Z2V0VXJpKCkgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4OjplbXB0eSgpOwotICAgIH0KLQotICAgIFN0cmluZzggdXJpOwotICAgIGlmIChPSyA9PSBtSFRUUENvbm5lY3Rpb24tPmdldFVyaSgmdXJpKSkgewotICAgICAgICByZXR1cm4gdXJpOwotICAgIH0KLSAgICByZXR1cm4gU3RyaW5nOChtTGFzdFVSSS5jX3N0cigpKTsKLX0KLQotU3RyaW5nOCBNZWRpYUhUVFA6OmdldE1JTUVUeXBlKCkgY29uc3QgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKLSAgICB9Ci0KLSAgICBTdHJpbmc4IG1pbWVUeXBlOwotICAgIHN0YXR1c190IGVyciA9IG1IVFRQQ29ubmVjdGlvbi0+Z2V0TUlNRVR5cGUoJm1pbWVUeXBlKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotICAgIH0KLQotICAgIHJldHVybiBtaW1lVHlwZTsKLX0KLQogdm9pZCBNZWRpYUhUVFA6OmNsZWFyRFJNU3RhdGVfbCgpIHsKICAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgewogICAgICAgICAvLyBUbyByZWxlYXNlIG1EZWNyeXB0SGFuZGxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icAppbmRleCA5MDUzZDYyLi5jMGVlMTRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAKQEAgLTI5LDE4ICsyOSwxOCBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3J5cHRvIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJtZWRpYSIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcAppbmRleCA3MjYwNGUzLi41OTI2NWZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuY3BwCkBAIC0yNiw4ICsyNiw4IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KICNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CkBAIC0zOCw3ICszOCw3IEBACiBIVFRQRG93bmxvYWRlcjo6SFRUUERvd25sb2FkZXIoCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gJmhlYWRlcnMpIDoKLSAgICBtSFRUUERhdGFTb3VyY2UobmV3IE1lZGlhSFRUUChodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCkpKSwKKyAgICBtSFRUUERhdGFTb3VyY2UobmV3IENsZWFyTWVkaWFIVFRQKGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKSkpLAogICAgIG1FeHRyYUhlYWRlcnMoaGVhZGVycyksCiAgICAgbURpc2Nvbm5lY3RpbmcoZmFsc2UpIHsKIH0KQEAgLTkxLDcgKzkxLDcgQEAKIAogICAgIGlmIChyZWNvbm5lY3QpIHsKICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCh1cmwsICJmaWxlOi8vIiwgNykpIHsKLSAgICAgICAgICAgIG1EYXRhU291cmNlID0gbmV3IEZpbGVTb3VyY2UodXJsICsgNyk7CisgICAgICAgICAgICBtRGF0YVNvdXJjZSA9IG5ldyBDbGVhckZpbGVTb3VyY2UodXJsICsgNyk7CiAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNhc2VjbXAodXJsLCAiaHR0cDovLyIsIDcpCiAgICAgICAgICAgICAgICAgJiYgc3RybmNhc2VjbXAodXJsLCAiaHR0cHM6Ly8iLCA4KSkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCmluZGV4IDJlY2ZhNDMuLjVlN2Y5MGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKQEAgLTEyMzQsNyArMTIzNCw3IEBACiAgICAgICAgIGNvbnN0IEFTdHJpbmcgJnVyaSwgdWludDMyX3Qgc3RyZWFtTWFzaywgaW50NjRfdCB0aW1lVXMsIGJvb2wgbmV3VXJpKSB7CiAgICAgc3NpemVfdCBpbmRleCA9IG1GZXRjaGVySW5mb3MuaW5kZXhPZktleSh1cmkpOwogICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR0UoImRpZCBub3QgZmluZCBmZXRjaGVyIGZvciB1cmk6ICVzIiwgdXJpLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiZGlkIG5vdCBmaW5kIGZldGNoZXIgZm9yIHVyaTogJXMiLCB1cmlEZWJ1Z1N0cmluZyh1cmkpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC0yMDA1LDcgKzIwMDUsNyBAQAogCiAgICAgICAgICAgICBpZiAoKG1OZXdTdHJlYW1NYXNrICYgc3RyZWFtKSAmJiBtU3RyZWFtc1tpZHhdLm1OZXdVcmkuZW1wdHkoKSkgewogICAgICAgICAgICAgICAgIEFMT0dXKCJzd2FwcGluZyBzdHJlYW0gdHlwZSAlZCAlcyB0byBlbXB0eSBzdHJlYW0iLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBtU3RyZWFtc1tpZHhdLm1VcmkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIHVyaURlYnVnU3RyaW5nKG1TdHJlYW1zW2lkeF0ubVVyaSkuY19zdHIoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtU3RyZWFtc1tpZHhdLm1VcmkgPSBtU3RyZWFtc1tpZHhdLm1OZXdVcmk7CiAgICAgICAgICAgICBtU3RyZWFtc1tpZHhdLm1OZXdVcmkuY2xlYXIoKTsKQEAgLTIwMzMsNyArMjAzMyw3IEBACiAgICAgICAgIENIRUNLKGlkeCA+PSAwKTsKICAgICAgICAgaWYgKG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5lbXB0eSgpKSB7CiAgICAgICAgICAgICBBTE9HVygic3dhcHBpbmcgZXh0cmEgc3RyZWFtIHR5cGUgJWQgJXMgdG8gZW1wdHkgc3RyZWFtIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBtU3RyZWFtc1tpZHhdLm1VcmkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgdXJpRGVidWdTdHJpbmcobVN0cmVhbXNbaWR4XS5tVXJpKS5jX3N0cigpKTsKICAgICAgICAgfQogICAgICAgICBtU3RyZWFtc1tpZHhdLm1VcmkgPSBtU3RyZWFtc1tpZHhdLm1OZXdVcmk7CiAgICAgICAgIG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5jbGVhcigpOwpAQCAtMjEzOCw3ICsyMTM4LDcgQEAKICAgICAgICAgICAgIEFMT0dWKCJzdG9wcGluZyBuZXdVcmkgPSAlcyIsIG5ld1VyaS5jX3N0cigpKTsKICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtRmV0Y2hlckluZm9zLmluZGV4T2ZLZXkobmV3VXJpKTsKICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZGlkIG5vdCBmaW5kIGZldGNoZXIgZm9yIG5ld1VyaTogJXMiLCBuZXdVcmkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgZmluZCBmZXRjaGVyIGZvciBuZXdVcmk6ICVzIiwgdXJpRGVidWdTdHJpbmcobmV3VXJpKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEZldGNoZXJJbmZvICZpbmZvID0gbUZldGNoZXJJbmZvcy5lZGl0VmFsdWVBdChpbmRleCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcAppbmRleCA5NzVlMmI1Li5jYjk3YTNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKQEAgLTcwNiw2ICs3MDYsMTIgQEAKICAgICAgICAgKytsaW5lTm87CiAgICAgfQogCisgICAgLy8gcGxheWxpc3QgaGFzIG5vIGl0ZW0sIHdvdWxkIGNhdXNlIGV4Y2VwdGlvbgorICAgIGlmIChtSXRlbXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoInBsYXlsaXN0IGhhcyBubyBpdGVtIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCiAgICAgLy8gZXJyb3IgY2hlY2tpbmcgb2YgYWxsIGZpZWxkcyB0aGF0J3MgcmVxdWlyZWQgdG8gYXBwZWFyIG9uY2UKICAgICAvLyAoY3VycmVudGx5IG9ubHkgY2hlY2tpbmcgInRhcmdldC1kdXJhdGlvbiIpLCBhbmQKICAgICAvLyBpbml0aWFsaXphdGlvbiBvZiBwbGF5bGlzdCBwcm9wZXJ0aWVzIChlZy4gbVRhcmdldER1cmF0aW9uVXMpCkBAIC0xMTk5LDggKzEyMDUsNyBAQAogICAgICAgICAgICAgaWYgKHZhbC5zaXplKCkgPCAyCiAgICAgICAgICAgICAgICAgICAgIHx8IHZhbC5jX3N0cigpWzBdICE9ICciJwogICAgICAgICAgICAgICAgICAgICB8fCB2YWwuY19zdHIoKVt2YWwuc2l6ZSgpIC0gMV0gIT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIHF1b3RlZCBzdHJpbmcgZm9yIFVSSSwgZ290ICclcycgaW5zdGVhZC4iLAotICAgICAgICAgICAgICAgICAgICAgIHZhbC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgcXVvdGVkIHN0cmluZyBmb3IgVVJJLiIpOwogCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KQEAgLTEzOTEsNiArMTM5NiwxOSBAQAogICAgICAgICBjYXNlICdRRE1DJzoKICAgICAgICAgY2FzZSAndWxhdyc6CiAgICAgICAgIGNhc2UgJ3ZkdmEnOgorICAgICAgICBjYXNlICdhYy00JzoKKyAgICAgICAgY2FzZSAnT3B1cyc6CisgICAgICAgIGNhc2UgJ2EzZHMnOgorICAgICAgICBjYXNlICdkdHMrJzoKKyAgICAgICAgY2FzZSAnZHRzLSc6CisgICAgICAgIGNhc2UgJ2R0c3gnOgorICAgICAgICBjYXNlICdkdHN5JzoKKyAgICAgICAgY2FzZSAnZWMrMyc6CisgICAgICAgIGNhc2UgJ21oYTEnOgorICAgICAgICBjYXNlICdtaGEyJzoKKyAgICAgICAgY2FzZSAnbWhtMSc6CisgICAgICAgIGNhc2UgJ21obTInOgorICAgICAgICBjYXNlICdzZXZzJzoKICAgICAgICAgICAgIHJldHVybiAhc3RyY21wKCJhdWRpbyIsIHR5cGUpOwogCiAgICAgICAgIGNhc2UgJ2F2YzEnOgpAQCAtMTQzOSw2ICsxNDU3LDM1IEBACiAgICAgICAgIGNhc2UgJ3RnYSAnOgogICAgICAgICBjYXNlICd0aWZmJzoKICAgICAgICAgY2FzZSAnV1JMRSc6CisgICAgICAgIGNhc2UgJ2EzZDEnOgorICAgICAgICBjYXNlICdhM2QyJzoKKyAgICAgICAgY2FzZSAnYTNkMyc6CisgICAgICAgIGNhc2UgJ2EzZDQnOgorICAgICAgICBjYXNlICdhdmMzJzoKKyAgICAgICAgY2FzZSAnYXZjNCc6CisgICAgICAgIGNhc2UgJ2R2YTEnOgorICAgICAgICBjYXNlICdkdmF2JzoKKyAgICAgICAgY2FzZSAnZHZoMSc6CisgICAgICAgIGNhc2UgJ2R2aGUnOgorICAgICAgICBjYXNlICdoZXYxJzoKKyAgICAgICAgY2FzZSAnaGV2Mic6CisgICAgICAgIGNhc2UgJ2h2YzEnOgorICAgICAgICBjYXNlICdodmMyJzoKKyAgICAgICAgY2FzZSAnaHZ0MSc6CisgICAgICAgIGNhc2UgJ2xoZTEnOgorICAgICAgICBjYXNlICdsaHQxJzoKKyAgICAgICAgY2FzZSAnbGh2MSc6CisgICAgICAgIGNhc2UgJ21qcGcnOgorICAgICAgICBjYXNlICdtdmMzJzoKKyAgICAgICAgY2FzZSAnbXZjNCc6CisgICAgICAgIGNhc2UgJ212ZDEnOgorICAgICAgICBjYXNlICdtdmQyJzoKKyAgICAgICAgY2FzZSAnbXZkMyc6CisgICAgICAgIGNhc2UgJ212ZDQnOgorICAgICAgICBjYXNlICdydjYwJzoKKyAgICAgICAgY2FzZSAnc3ZjMic6CisgICAgICAgIGNhc2UgJ3ZwMDgnOgorICAgICAgICBjYXNlICd2cDA5JzoKICAgICAgICAgICAgIHJldHVybiAhc3RyY21wKCJ2aWRlbyIsIHR5cGUpOwogCiAgICAgICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcAppbmRleCA1NjJjNjI1Li5kMTUzNTk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKQEAgLTM2NSwxMCArMzY1LDEwIEBACiAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfTk9UX0NPTk5FQ1RFRCkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX05PVF9DT05ORUNURUQ7CiAgICAgICAgIH0gZWxzZSBpZiAoZXJyIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBmZXRjaCBjaXBoZXIga2V5IGZyb20gJyVzJy4iLCBrZXlVUkkuY19zdHIoKSk7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGZldGNoIGNpcGhlciBrZXkgZnJvbSAnJXMnLiIsIHVyaURlYnVnU3RyaW5nKGtleVVSSSkuY19zdHIoKSk7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgIH0gZWxzZSBpZiAoa2V5LT5zaXplKCkgIT0gMTYpIHsKLSAgICAgICAgICAgIEFMT0dFKCJrZXkgZmlsZSAnJXMnIHdhc24ndCAxNiBieXRlcyBpbiBzaXplLiIsIGtleVVSSS5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dFKCJrZXkgZmlsZSAnJXMnIHdhc24ndCAxNiBieXRlcyBpbiBzaXplLiIsIHVyaURlYnVnU3RyaW5nKGtleVVSSSkuY19zdHIoKSk7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAKQEAgLTEzNjYsNyArMTM2Niw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGJ5dGVzUmVhZCA8IDApIHsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGJ5dGVzUmVhZDsKLSAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZmV0Y2ggLnRzIHNlZ21lbnQgYXQgdXJsICclcyciLCB1cmkuY19zdHIoKSk7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGZldGNoIC50cyBzZWdtZW50IGF0IHVybCAnJXMnIiwgdXJpRGVidWdTdHJpbmcodXJpKS5jX3N0cigpKTsKICAgICAgICAgICAgIG5vdGlmeUVycm9yKGVycik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKaW5kZXggZjlmOGEzZC4uNzE1MWQwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKQEAgLTMsNiArMywxMCBAQAogCiAgICAgc3JjczogWyJJRDMuY3BwIl0sCiAKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcAppbmRleCAwODU2MDhiLi43OTJhNjhhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcApAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvSUQzLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CkBAIC01Niw2ICs1OCw1NSBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lbW9yeVNvdXJjZSk7CiB9OwogCitjbGFzcyBEYXRhU291cmNlVW53cmFwcGVyIDogcHVibGljIERhdGFTb3VyY2VCYXNlIHsKKworcHVibGljOgorICAgIGV4cGxpY2l0IERhdGFTb3VyY2VVbndyYXBwZXIoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlaGVscGVyKSB7CisgICAgICAgIG1Tb3VyY2UgPSBzb3VyY2VoZWxwZXI7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgeyByZXR1cm4gT0s7IH0KKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtMSBvbiBmYWlsdXJlLiBJdCdzIG5vdCBhbiBlcnJvciBpZgorICAgIC8vIHRoaXMgcmV0dXJucyB6ZXJvOyBpdCBqdXN0IG1lYW5zIHRoZSBnaXZlbiBvZmZzZXQgaXMgZXF1YWwgdG8sIG9yCisgICAgLy8gYmV5b25kLCB0aGUgZW5kIG9mIHRoZSBzb3VyY2UuCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOworICAgIH0KKworICAgIC8vIE1heSByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPmdldFNpemUoc2l6ZSk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGdldFVyaShjaGFyICogLyp1cmlTdHJpbmcqLywgc2l6ZV90IC8qYnVmZmVyU2l6ZSovKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSB7fTsKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbVNvdXJjZTsKK307CisKKworSUQzOjpJRDMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlaGVscGVyLCBib29sIGlnbm9yZVYxLCBvZmY2NF90IG9mZnNldCkKKyAgICA6IG1Jc1ZhbGlkKGZhbHNlKSwKKyAgICAgIG1EYXRhKE5VTEwpLAorICAgICAgbVNpemUoMCksCisgICAgICBtRmlyc3RGcmFtZU9mZnNldCgwKSwKKyAgICAgIG1WZXJzaW9uKElEM19VTktOT1dOKSwKKyAgICAgIG1SYXdTaXplKDApIHsKKyAgICBEYXRhU291cmNlVW53cmFwcGVyIHNvdXJjZShzb3VyY2VoZWxwZXIpOworICAgIG1Jc1ZhbGlkID0gcGFyc2VWMigmc291cmNlLCBvZmZzZXQpOworCisgICAgaWYgKCFtSXNWYWxpZCAmJiAhaWdub3JlVjEpIHsKKyAgICAgICAgbUlzVmFsaWQgPSBwYXJzZVYxKCZzb3VyY2UpOworICAgIH0KK30KKwogSUQzOjpJRDMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgYm9vbCBpZ25vcmVWMSwgb2ZmNjRfdCBvZmZzZXQpCiAgICAgOiBtSXNWYWxpZChmYWxzZSksCiAgICAgICBtRGF0YShOVUxMKSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaAppbmRleCBhOTI0MTk3Li44YjIwMTg3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCkBAIC01MSwxMiArNTEsNiBAQAogCiAgICAgdmlydHVhbCB2b2lkIHNldEJhbmR3aWR0aEhpc3RvcnlTaXplKHNpemVfdCBudW1IaXN0b3J5SXRlbXMpOwogCi0gICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQsIHVpZF90IHVpZCwgdWludDMyX3Qga1RhZyk7Ci0gICAgc3RhdGljIHZvaWQgVW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCk7Ci0KLSAgICBzdGF0aWMgdm9pZCBSZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQsIHVpZF90IHVpZCk7Ci0gICAgc3RhdGljIHZvaWQgVW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQpOwotCiAgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gbU5hbWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmgKaW5kZXggN2MyMzkxZS4uNWU0MzNlYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0lEMy5oCkBAIC0yNCw2ICsyNCw3IEBACiAKIGNsYXNzIERhdGFTb3VyY2VCYXNlOwogY2xhc3MgU3RyaW5nODsKK2NsYXNzIERhdGFTb3VyY2VIZWxwZXI7CiAKIHN0cnVjdCBJRDMgewogICAgIGVudW0gVmVyc2lvbiB7CkBAIC0zNSw2ICszNiw3IEBACiAgICAgICAgIElEM19WMl80LAogICAgIH07CiAKKyAgICBleHBsaWNpdCBJRDMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBib29sIGlnbm9yZVYxID0gZmFsc2UsIG9mZjY0X3Qgb2Zmc2V0ID0gMCk7CiAgICAgZXhwbGljaXQgSUQzKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGJvb2wgaWdub3JlVjEgPSBmYWxzZSwgb2ZmNjRfdCBvZmZzZXQgPSAwKTsKICAgICBJRDMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgaWdub3JlVjEgPSBmYWxzZSk7CiAgICAgfklEMygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKaW5kZXggZjQzOWExYy4uNTk2ZWZiOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCkBAIC0zNyw2ICszNyw4IEBACiAKICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKwogICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CkBAIC01MSw2ICs1Myw4IEBACiAgICAgICAgIHJldHVybiBtTmFtZTsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBnZXRBdmFpbGFibGVTaXplKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90ICpzaXplKTsKKwogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogICAgIHNpemVfdCBjYWNoZWRTaXplKCk7CkBAIC0xMzUsNyArMTM5LDcgQEAKICAgICBzc2l6ZV90IHJlYWRJbnRlcm5hbChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwogICAgIHN0YXR1c190IHNlZWtJbnRlcm5hbF9sKG9mZjY0X3Qgb2Zmc2V0KTsKIAotICAgIHNpemVfdCBhcHByb3hEYXRhUmVtYWluaW5nX2woc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdDsKKyAgICBzaXplX3QgYXBwcm94RGF0YVJlbWFpbmluZ19sKG9mZjY0X3Qgb2Zmc2V0LCBzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0OwogCiAgICAgdm9pZCByZXN0YXJ0UHJlZmV0Y2hlcklmTmVjZXNzYXJ5X2woCiAgICAgICAgICAgICBib29sIGlnbm9yZUxvd1dhdGVyVGhyZXNob2xkID0gZmFsc2UsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCmluZGV4IGMyODY1MTYuLjY0ZGNhNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCkBAIC01MSw3ICs1MSw3IEBACiAgICAgQ29sb3JDb252ZXJ0ZXIgKm1Db252ZXJ0ZXI7CiAgICAgWVVWTW9kZSBtWVVWTW9kZTsKICAgICBzcDxBTmF0aXZlV2luZG93PiBtTmF0aXZlV2luZG93OwotICAgIGludDMyX3QgbVdpZHRoLCBtSGVpZ2h0OworICAgIGludDMyX3QgbVdpZHRoLCBtSGVpZ2h0LCBtU3RyaWRlOwogICAgIGludDMyX3QgbUNyb3BMZWZ0LCBtQ3JvcFRvcCwgbUNyb3BSaWdodCwgbUNyb3BCb3R0b207CiAgICAgaW50MzJfdCBtQ3JvcFdpZHRoLCBtQ3JvcEhlaWdodDsKICAgICBpbnQzMl90IG1Sb3RhdGlvbkRlZ3JlZXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCmluZGV4IDFhNDRlMWYuLmM1MDY3N2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCkBAIC0yNiw3ICsyNiw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIERhdGFTb3VyY2U7Ci1jbGFzcyBNZWRpYUV4dHJhY3RvcjsKIHN0cnVjdCBJbWFnZURlY29kZXI7CiBzdHJ1Y3QgRnJhbWVSZWN0OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAppbmRleCA5N2QxNWE3Li45ZDQ2ZDJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgogI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CkBAIC0xMzcsNiArMTM3LDcgQEAKICAgICAgICAga1doYXRPTVhEaWVkICAgICAgICAgICAgICAgICA9ICdPTVhkJywKICAgICAgICAga1doYXRSZWxlYXNlQ29kZWNJbnN0YW5jZSAgICA9ICdyZWxDJywKICAgICAgICAga1doYXRGb3JjZVN0YXRlVHJhbnNpdGlvbiAgICA9ICdmc3R0JywKKyAgICAgICAga1doYXRDaGVja0lmU3R1Y2sgICAgICAgICAgICA9ICdDc3RrJywKICAgICB9OwogCiAgICAgZW51bSB7CkBAIC0yMzYsNiArMjM3LDggQEAKICAgICBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgbUxhc3ROYXRpdmVXaW5kb3dDcm9wOwogICAgIGludDMyX3QgbUxhc3ROYXRpdmVXaW5kb3dEYXRhU3BhY2U7CiAgICAgSERSU3RhdGljSW5mbyBtTGFzdEhEUlN0YXRpY0luZm87CisgICAgc3A8QUJ1ZmZlcj4gbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXI7CisgICAgc3A8QUJ1ZmZlcj4gbUxhc3RIZHIxMFBsdXNCdWZmZXI7CiAgICAgc3A8QU1lc3NhZ2U+IG1Db25maWdGb3JtYXQ7CiAgICAgc3A8QU1lc3NhZ2U+IG1JbnB1dEZvcm1hdDsKICAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKQEAgLTI4OSw2ICsyOTIsNyBAQAogCiAgICAgT01YX0lOREVYVFlQRSBtRGVzY3JpYmVDb2xvckFzcGVjdHNJbmRleDsKICAgICBPTVhfSU5ERVhUWVBFIG1EZXNjcmliZUhEUlN0YXRpY0luZm9JbmRleDsKKyAgICBPTVhfSU5ERVhUWVBFIG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleDsKIAogICAgIHN0ZDo6c2hhcmVkX3B0cjxBQ29kZWNCdWZmZXJDaGFubmVsPiBtQnVmZmVyQ2hhbm5lbDsKIApAQCAtNDIzLDYgKzQyNywxMSBAQAogICAgIC8vIHVuc3BlY2lmaWVkIHZhbHVlcy4KICAgICB2b2lkIG9uRGF0YVNwYWNlQ2hhbmdlZChhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNvbnN0IENvbG9yQXNwZWN0cyAmYXNwZWN0cyk7CiAKKyAgICAvLyBub3RpZmllcyB0aGUgY29kZWMgdGhhdCB0aGUgY29uZmlnIHdpdGggfGNvbmZpZ0luZGV4fCBoYXMgY2hhbmdlZCwgdGhlIHZhbHVlCisgICAgLy8gY2FuIGJlIHF1ZXJpZWQgYnkgT01YIGdldENvbmZpZywgYW5kIHRoZSBjb25maWcgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIG5leHQKKyAgICAvLyBvdXRwdXQgYnVmZmVyIG5vdGlmaWVkIGFmdGVyIHRoaXMgY2FsbGJhY2suCisgICAgdm9pZCBvbkNvbmZpZ1VwZGF0ZShPTVhfSU5ERVhUWVBFIGNvbmZpZ0luZGV4KTsKKwogICAgIC8vIGdldHMgaW5kZXggb3Igc2V0cyBpdCB0byAwIG9uIGVycm9yLiBSZXR1cm5zIGVycm9yIGZyb20gY29kZWMuCiAgICAgc3RhdHVzX3QgaW5pdERlc2NyaWJlSERSU3RhdGljSW5mb0luZGV4KCk7CiAKQEAgLTQzNCwxMiArNDQzLDIyIEBACiAgICAgLy8gc2V0cyB8cGFyYW1zfC4gUmV0dXJucyB0aGUgY29kZWMgZXJyb3IuCiAgICAgc3RhdHVzX3Qgc2V0SERSU3RhdGljSW5mbyhjb25zdCBEZXNjcmliZUhEUlN0YXRpY0luZm9QYXJhbXMgJnBhcmFtcyk7CiAKKyAgICAvLyBzZXRzIHxoZHIxMFBsdXNJbmZvfC4gUmV0dXJucyB0aGUgY29kZWMgZXJyb3IuCisgICAgc3RhdHVzX3Qgc2V0SGRyMTBQbHVzSW5mbyhjb25zdCBzcDxBQnVmZmVyPiAmaGRyMTBQbHVzSW5mbyk7CisKICAgICAvLyBnZXRzIHxwYXJhbXN8LiBSZXR1cm5zIHRoZSBjb2RlYyBlcnJvci4KICAgICBzdGF0dXNfdCBnZXRIRFJTdGF0aWNJbmZvKERlc2NyaWJlSERSU3RhdGljSW5mb1BhcmFtcyAmcGFyYW1zKTsKIAogICAgIC8vIGdldHMgSERSIHN0YXRpYyBpbmZvcm1hdGlvbiBmb3IgdGhlIHZpZGVvIGVuY29kZXIvZGVjb2RlciBwb3J0IGFuZCBzZXRzIHRoZW0gaW50byB8Zm9ybWF0fC4KICAgICBzdGF0dXNfdCBnZXRIRFJTdGF0aWNJbmZvRm9yVmlkZW9Db2RlYyhPTVhfVTMyIHBvcnRJbmRleCwgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOwogCisgICAgLy8gZ2V0cyBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgcGFyYW1zLiBJZiB8cGFyYW1TaXplVXNlZHwgaXMgemVybywgaXQncworICAgIC8vIHBvc3NpYmxlIHRoYXQgdGhlIHJldHVybmVkIERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyBvbmx5IGhhcyB0aGUKKyAgICAvLyBuUGFyYW1TaXplVXNlZCBmaWVsZCB1cGRhdGVkLCBiZWNhdXNlIHRoZSBzaXplIG9mIHRoZSBzdG9yYWdlIGlzIGluc3VmZmljaWVudC4KKyAgICAvLyBJbiB0aGlzIGNhc2UsIGdldEhEUjEwUGx1c0luZm8oKSBzaG91bGQgYmUgY2FsbGVkIGFnYWluIHdpdGggfHBhcmFtU2l6ZVVzZWR8CisgICAgLy8gc3BlY2lmaWVkIHRvIHRoZSBwcmV2aW91cyByZXR1cm5lZCB2YWx1ZS4KKyAgICBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMqIGdldEhEUjEwUGx1c0luZm8oc2l6ZV90IHBhcmFtU2l6ZVVzZWQgPSAwKTsKKwogICAgIHR5cGVkZWYgc3RydWN0IGRyY1BhcmFtcyB7CiAgICAgICAgIGludDMyX3QgZHJjQ3V0OwogICAgICAgICBpbnQzMl90IGRyY0Jvb3N0OwpAQCAtNDYwLDYgKzQ3OSw4IEBACiAKICAgICBzdGF0dXNfdCBzZXR1cEVBQzNDb2RlYyhib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSk7CiAKKyAgICBzdGF0dXNfdCBzZXR1cEFDNENvZGVjKGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlKTsKKwogICAgIHN0YXR1c190IHNlbGVjdEF1ZGlvUG9ydEZvcm1hdCgKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQVVESU9fQ09ESU5HVFlQRSBkZXNpcmVkRm9ybWF0KTsKIApAQCAtNDY3LDcgKzQ4OCw4IEBACiAgICAgc3RhdHVzX3Qgc2V0dXBHNzExQ29kZWMoYm9vbCBlbmNvZGVyLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgbnVtQ2hhbm5lbHMpOwogCiAgICAgc3RhdHVzX3Qgc2V0dXBGbGFjQ29kZWMoCi0gICAgICAgICAgICBib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjb21wcmVzc2lvbkxldmVsKTsKKyAgICAgICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNvbXByZXNzaW9uTGV2ZWwsCisgICAgICAgICAgICBBdWRpb0VuY29kaW5nIGVuY29kaW5nKTsKIAogICAgIHN0YXR1c190IHNldHVwUmF3QXVkaW9Gb3JtYXQoCiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IG51bUNoYW5uZWxzLApAQCAtNDc2LDYgKzQ5OCw3IEBACiAgICAgc3RhdHVzX3Qgc2V0UHJpb3JpdHkoaW50MzJfdCBwcmlvcml0eSk7CiAgICAgc3RhdHVzX3Qgc2V0TGF0ZW5jeSh1aW50MzJfdCBsYXRlbmN5KTsKICAgICBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKKyAgICBzdGF0dXNfdCBzZXRBdWRpb1ByZXNlbnRhdGlvbihpbnQzMl90IHByZXNlbnRhdGlvbklkLCBpbnQzMl90IHByb2dyYW1JZCk7CiAgICAgc3RhdHVzX3Qgc2V0T3BlcmF0aW5nUmF0ZShmbG9hdCByYXRlRmxvYXQsIGJvb2wgaXNWaWRlbyk7CiAgICAgc3RhdHVzX3QgZ2V0SW50cmFSZWZyZXNoUGVyaW9kKHVpbnQzMl90ICppbnRyYVJlZnJlc2hQZXJpb2QpOwogICAgIHN0YXR1c190IHNldEludHJhUmVmcmVzaFBlcmlvZCh1aW50MzJfdCBpbnRyYVJlZnJlc2hQZXJpb2QsIGJvb2wgaW5Db25maWd1cmUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaAppbmRleCAyMDZkMzIyLi4xOGU1ZjEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oCkBAIC00NCw3ICs0NCw5IEBACiAgICAgICAgICAgICB1aW50MzJfdCBvdXRTYW1wbGVSYXRlID0gMCwKICAgICAgICAgICAgIHVpZF90IHVpZCA9IC0xLAogICAgICAgICAgICAgcGlkX3QgcGlkID0gLTEsCi0gICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUsCisgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IHNlbGVjdGVkTWljRGlyZWN0aW9uID0gTUlDX0RJUkVDVElPTl9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgIGZsb2F0IHNlbGVjdGVkTWljRmllbGREaW1lbnNpb24gPSBNSUNfRklFTERfRElNRU5TSU9OX05PUk1BTCk7CiAKICAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKIApAQCAtNjgsNyArNzAsMTAgQEAKICAgICBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spOwogCiAgICAgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOworICAgIHN0YXR1c190IHNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOworICAgIHN0YXR1c190IHNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKIAorICAgIHN0YXR1c190IGdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIGNvbnN0OwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QXVkaW9Tb3VyY2UoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlODM3NDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENMRUFSX0ZJTEVfU09VUkNFX0hfCisKKyNkZWZpbmUgQ0xFQVJfRklMRV9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ2xlYXJGaWxlU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgeworcHVibGljOgorICAgIENsZWFyRmlsZVNvdXJjZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CisgICAgLy8gQ2xlYXJGaWxlU291cmNlIHRha2VzIG93bmVyc2hpcCBhbmQgd2lsbCBjbG9zZSB0aGUgZmQKKyAgICBDbGVhckZpbGVTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7CisgICAgICAgIHJldHVybiBrSXNMb2NhbEZpbGVTb3VyY2U7CisgICAgfQorCisgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Q2xlYXJGaWxlU291cmNlKCk7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdF9sKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICBpbnQgbUZkOworICAgIGludDY0X3QgbU9mZnNldDsKKyAgICBpbnQ2NF90IG1MZW5ndGg7CisgICAgTXV0ZXggbUxvY2s7CisKK3ByaXZhdGU6CisgICAgU3RyaW5nOCBtTmFtZTsKKworICAgIENsZWFyRmlsZVNvdXJjZShjb25zdCBDbGVhckZpbGVTb3VyY2UgJik7CisgICAgQ2xlYXJGaWxlU291cmNlICZvcGVyYXRvcj0oY29uc3QgQ2xlYXJGaWxlU291cmNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDTEVBUl9GSUxFX1NPVVJDRV9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5MDdhOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJNZWRpYUhUVFAuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUl9NRURJQV9IVFRQX0hfCisKKyNkZWZpbmUgQ0xFQVJfTUVESUFfSFRUUF9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhSFRUUENvbm5lY3Rpb247CisKK3N0cnVjdCBDbGVhck1lZGlhSFRUUCA6IHB1YmxpYyBIVFRQQmFzZSB7CisgICAgQ2xlYXJNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCisgICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOworCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5DbGVhck1lZGlhSFRUUCgpOworCisgICAgdmlydHVhbCBTdHJpbmc4IGdldFVyaSgpOworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0OworCisgICAgQVN0cmluZyBtTGFzdFVSSTsKKworcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworICAgIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IG1IVFRQQ29ubmVjdGlvbjsKKworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1MYXN0SGVhZGVyczsKKworICAgIGJvb2wgbUNhY2hlZFNpemVWYWxpZDsKKyAgICBvZmY2NF90IG1DYWNoZWRTaXplOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2xlYXJNZWRpYUhUVFApOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDTEVBUl9NRURJQV9IVFRQX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmgKaW5kZXggNWIzNTQzZC4uNzViMGQ4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaApAQCAtMzUsMjEgKzM1LDMyIEBACiAKICAgICBib29sIGlzRHN0UkdCKCkgY29uc3Q7CiAKKyAgICB2b2lkIHNldFNyY0NvbG9yU3BhY2UodWludDMyX3Qgc3RhbmRhcmQsIHVpbnQzMl90IHJhbmdlLCB1aW50MzJfdCB0cmFuc2Zlcik7CisKICAgICBzdGF0dXNfdCBjb252ZXJ0KAogICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3JjQml0cywKLSAgICAgICAgICAgIHNpemVfdCBzcmNXaWR0aCwgc2l6ZV90IHNyY0hlaWdodCwKKyAgICAgICAgICAgIHNpemVfdCBzcmNXaWR0aCwgc2l6ZV90IHNyY0hlaWdodCwgc2l6ZV90IHNyY1N0cmlkZSwKICAgICAgICAgICAgIHNpemVfdCBzcmNDcm9wTGVmdCwgc2l6ZV90IHNyY0Nyb3BUb3AsCiAgICAgICAgICAgICBzaXplX3Qgc3JjQ3JvcFJpZ2h0LCBzaXplX3Qgc3JjQ3JvcEJvdHRvbSwKICAgICAgICAgICAgIHZvaWQgKmRzdEJpdHMsCi0gICAgICAgICAgICBzaXplX3QgZHN0V2lkdGgsIHNpemVfdCBkc3RIZWlnaHQsCisgICAgICAgICAgICBzaXplX3QgZHN0V2lkdGgsIHNpemVfdCBkc3RIZWlnaHQsIHNpemVfdCBkc3RTdHJpZGUsCiAgICAgICAgICAgICBzaXplX3QgZHN0Q3JvcExlZnQsIHNpemVfdCBkc3RDcm9wVG9wLAogICAgICAgICAgICAgc2l6ZV90IGRzdENyb3BSaWdodCwgc2l6ZV90IGRzdENyb3BCb3R0b20pOwogCiBwcml2YXRlOgorICAgIHN0cnVjdCBDb2xvclNwYWNlIHsKKyAgICAgICAgdWludDMyX3QgbVN0YW5kYXJkOworICAgICAgICB1aW50MzJfdCBtUmFuZ2U7CisgICAgICAgIHVpbnQzMl90IG1UcmFuc2ZlcjsKKworICAgICAgICBib29sIGlzQnQ3MDkoKTsKKyAgICAgICAgYm9vbCBpc0pwZWcoKTsKKyAgICB9OworCiAgICAgc3RydWN0IEJpdG1hcFBhcmFtcyB7CiAgICAgICAgIEJpdG1hcFBhcmFtcygKICAgICAgICAgICAgICAgICB2b2lkICpiaXRzLAotICAgICAgICAgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsIHNpemVfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgc2l6ZV90IGNyb3BMZWZ0LCBzaXplX3QgY3JvcFRvcCwKICAgICAgICAgICAgICAgICBzaXplX3QgY3JvcFJpZ2h0LCBzaXplX3QgY3JvcEJvdHRvbSwKICAgICAgICAgICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZyb21hdCk7CkBAIC02NSw2ICs3Niw3IEBACiAgICAgfTsKIAogICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIG1TcmNGb3JtYXQsIG1Ec3RGb3JtYXQ7CisgICAgQ29sb3JTcGFjZSBtU3JjQ29sb3JTcGFjZTsKICAgICB1aW50OF90ICptQ2xpcDsKIAogICAgIHVpbnQ4X3QgKmluaXRDbGlwKCk7CkBAIC03OCw2ICs5MCw5IEBACiAgICAgc3RhdHVzX3QgY29udmVydFlVVjQyMFBsYW5hclVzZUxpYllVVigKICAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CiAKKyAgICBzdGF0dXNfdCBjb252ZXJ0WVVWNDIwU2VtaVBsYW5hclVzZUxpYllVVigKKyAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CisKICAgICBzdGF0dXNfdCBjb252ZXJ0WVVWNDIwUGxhbmFyMTYoCiAgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmN2E0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgREFUQV9TT1VSQ0VfSF8KKworI2RlZmluZSBEQVRBX1NPVVJDRV9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTdHJpbmc4OworCitjbGFzcyBEYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2VCYXNlLCBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBEYXRhU291cmNlKCkgOiBtV3JhcHBlcihOVUxMKSB7fQorCisgICAgLy8gcmV0dXJucyBhIHBvaW50ZXIgdG8gSURhdGFTb3VyY2UgaWYgaXQgaXMgd3JhcHBlZC4KKyAgICB2aXJ0dWFsIHNwPElEYXRhU291cmNlPiBnZXRJRGF0YVNvdXJjZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiPHVuc3BlY2lmaWVkPiIpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCAvKm9mZnNldCovKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvLyBmb3IgRFJNCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICogLyptaW1lKi8gPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGdldFVyaShjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKSBmaW5hbCB7CisgICAgICAgIGludCByZXQgPSBzbnByaW50Zih1cmlTdHJpbmcsIGJ1ZmZlclNpemUsICIlcyIsIGdldFVyaSgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gcmV0ID49IDAgJiYgc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQpIDwgYnVmZmVyU2l6ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICB9CisKKyAgICBDRGF0YVNvdXJjZSAqd3JhcCgpIHsKKyAgICAgICAgaWYgKG1XcmFwcGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgICAgIH0KKyAgICAgICAgbVdyYXBwZXIgPSBuZXcgQ0RhdGFTb3VyY2UoKTsKKyAgICAgICAgbVdyYXBwZXItPmhhbmRsZSA9IHRoaXM7CisKKyAgICAgICAgbVdyYXBwZXItPnJlYWRBdCA9IFtdKHZvaWQgKmhhbmRsZSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSAtPiBzc2l6ZV90IHsKKyAgICAgICAgICAgIHJldHVybiAoKERhdGFTb3VyY2UqKWhhbmRsZSktPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOworICAgICAgICB9OworICAgICAgICBtV3JhcHBlci0+Z2V0U2l6ZSA9IFtdKHZvaWQgKmhhbmRsZSwgb2ZmNjRfdCAqc2l6ZSkgLT4gc3RhdHVzX3QgeworICAgICAgICAgICAgcmV0dXJuICgoRGF0YVNvdXJjZSopaGFuZGxlKS0+Z2V0U2l6ZShzaXplKTsKKyAgICAgICAgfTsKKyAgICAgICAgbVdyYXBwZXItPmZsYWdzID0gW10odm9pZCAqaGFuZGxlKSAtPiB1aW50MzJfdCB7CisgICAgICAgICAgICByZXR1cm4gKChEYXRhU291cmNlKiloYW5kbGUpLT5mbGFncygpOworICAgICAgICB9OworICAgICAgICBtV3JhcHBlci0+Z2V0VXJpID0gW10odm9pZCAqaGFuZGxlLCBjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKSAtPiBib29sIHsKKyAgICAgICAgICAgIHJldHVybiAoKERhdGFTb3VyY2UqKWhhbmRsZSktPmdldFVyaSh1cmlTdHJpbmcsIGJ1ZmZlclNpemUpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+RGF0YVNvdXJjZSgpIHsKKyAgICAgICAgZGVsZXRlIG1XcmFwcGVyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDRGF0YVNvdXJjZSAqbVdyYXBwZXI7CisgICAgRGF0YVNvdXJjZShjb25zdCBEYXRhU291cmNlICYpOworICAgIERhdGFTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBEQVRBX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNWI4M2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VCYXNlLmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgREFUQV9TT1VSQ0VfQkFTRV9IXworCisjZGVmaW5lIERBVEFfU09VUkNFX0JBU0VfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0cmluZzg7CisKK2NsYXNzIERhdGFTb3VyY2VCYXNlIHsKK3B1YmxpYzoKKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAga1dhbnRzUHJlZmV0Y2hpbmcgICAgICA9IDEsCisgICAgICAgIGtTdHJlYW1lZEZyb21Mb2NhbEhvc3QgPSAyLAorICAgICAgICBrSXNDYWNoaW5nRGF0YVNvdXJjZSAgID0gNCwKKyAgICAgICAga0lzSFRUUEJhc2VkU291cmNlICAgICA9IDgsCisgICAgICAgIGtJc0xvY2FsRmlsZVNvdXJjZSAgICAgPSAxNiwKKyAgICB9OworCisgICAgRGF0YVNvdXJjZUJhc2UoKSB7fQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgb24gZmFpbHVyZS4gSXQncyBub3QgYW4gZXJyb3IgaWYKKyAgICAvLyB0aGlzIHJldHVybnMgemVybzsgaXQganVzdCBtZWFucyB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGVxdWFsIHRvLCBvcgorICAgIC8vIGJleW9uZCwgdGhlIGVuZCBvZiB0aGUgc291cmNlLgorICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSA9IDA7CisKKyAgICAvLyBDb252ZW5pZW5jZSBtZXRob2RzOgorICAgIGJvb2wgZ2V0VUludDE2KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCk7CisgICAgYm9vbCBnZXRVSW50MjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KTsgLy8gMyBieXRlIGludCwgcmV0dXJuZWQgYXMgYSAzMi1iaXQgaW50CisgICAgYm9vbCBnZXRVSW50MzIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KTsKKyAgICBib29sIGdldFVJbnQ2NChvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngpOworCisgICAgLy8gcmVhZCBlaXRoZXIgaW50PE4+IG9yIGludDwyTj4gaW50byBhIHVpbnQ8Mk4+X3QsIHNpemUgaXMgdGhlIGludCBzaXplIGluIGJ5dGVzLgorICAgIGJvb2wgZ2V0VUludDE2VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCwgc2l6ZV90IHNpemUpOworICAgIGJvb2wgZ2V0VUludDMyVmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCwgc2l6ZV90IHNpemUpOworICAgIGJvb2wgZ2V0VUludDY0VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCwgc2l6ZV90IHNpemUpOworCisgICAgLy8gTWF5IHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0VXJpKGNoYXIgKnVyaVN0cmluZywgc2l6ZV90IGJ1ZmZlclNpemUpOworCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkge307CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF2YWlsYWJsZVNpemUob2ZmNjRfdCAvKm9mZnNldCovLCBvZmY2NF90ICogLypzaXplKi8pIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkRhdGFTb3VyY2VCYXNlKCkge30KKworcHJpdmF0ZToKKyAgICBEYXRhU291cmNlQmFzZShjb25zdCBEYXRhU291cmNlQmFzZSAmKTsKKyAgICBEYXRhU291cmNlQmFzZSAmb3BlcmF0b3I9KGNvbnN0IERhdGFTb3VyY2VCYXNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBEQVRBX1NPVVJDRV9CQVNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCmluZGV4IDg2MDQ4OTAuLmI2MTBlZWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCkBAIC0yMCw0NyArMjAsMjkgQEAKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8ZHJtL0RybU1hbmFnZXJDbGllbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBGaWxlU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgeworY2xhc3MgRmlsZVNvdXJjZSA6IHB1YmxpYyBDbGVhckZpbGVTb3VyY2UgewogcHVibGljOgogICAgIEZpbGVTb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpOwogICAgIC8vIEZpbGVTb3VyY2UgdGFrZXMgb3duZXJzaGlwIGFuZCB3aWxsIGNsb3NlIHRoZSBmZAogICAgIEZpbGVTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLQogICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKLQotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7Ci0gICAgICAgIHJldHVybiBrSXNMb2NhbEZpbGVTb3VyY2U7Ci0gICAgfQotCiAgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICptaW1lKTsKIAotICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgIH0KLQogICAgIHN0YXRpYyBib29sIHJlcXVpcmVzRHJtKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyICptaW1lKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkZpbGVTb3VyY2UoKTsKIAogcHJpdmF0ZToKLSAgICBpbnQgbUZkOwotICAgIGludDY0X3QgbU9mZnNldDsKLSAgICBpbnQ2NF90IG1MZW5ndGg7Ci0gICAgTXV0ZXggbUxvY2s7Ci0gICAgU3RyaW5nOCBtTmFtZTsKLQogICAgIC8qZm9yIERSTSovCiAgICAgc3A8RGVjcnlwdEhhbmRsZT4gbURlY3J5cHRIYW5kbGU7CiAgICAgRHJtTWFuYWdlckNsaWVudCAqbURybU1hbmFnZXJDbGllbnQ7CkBAIC02OCw3ICs1MCw3IEBACiAgICAgc3NpemVfdCBtRHJtQnVmU2l6ZTsKICAgICB1bnNpZ25lZCBjaGFyICptRHJtQnVmOwogCi0gICAgc3NpemVfdCByZWFkQXREUk0ob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICBzc2l6ZV90IHJlYWRBdERSTV9sKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKICAgICBGaWxlU291cmNlKGNvbnN0IEZpbGVTb3VyY2UgJik7CiAgICAgRmlsZVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IEZpbGVTb3VyY2UgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmgKaW5kZXggZjBlYmQ0OC4uYjgzYTk1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaApAQCAtMTgsNyArMTgsNiBAQAogI2RlZmluZSBJTlRFUkZBQ0VfVVRJTFNfSF8KIAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaAppbmRleCBmMTg5NDBkLi44MDMxNTVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCkBAIC0xMTAsNiArMTEwLDcgQEAKICAgICB1aW50MzJfdCBtSW50ZXJsZWF2ZUR1cmF0aW9uVXM7CiAgICAgaW50MzJfdCBtVGltZVNjYWxlOwogICAgIGludDY0X3QgbVN0YXJ0VGltZXN0YW1wVXM7CisgICAgaW50MzJfdCBtU3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzOyAvLyBTdGFydCB0aW1lIG9mZnNldCB3aGVuIEIgRnJhbWVzIGFyZSBwcmVzZW50CiAgICAgaW50IG1MYXRpdHVkZXgxMDAwMDsKICAgICBpbnQgbUxvbmdpdHVkZXgxMDAwMDsKICAgICBib29sIG1BcmVHZW9UYWdzQXZhaWxhYmxlOwpAQCAtMTI5LDYgKzEzMCw3IEBACiAKICAgICB2b2lkIHNldFN0YXJ0VGltZXN0YW1wVXMoaW50NjRfdCB0aW1lVXMpOwogICAgIGludDY0X3QgZ2V0U3RhcnRUaW1lc3RhbXBVcygpOyAgLy8gTm90IGNvbnN0CisgICAgaW50MzJfdCBnZXRTdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMoKTsKICAgICBzdGF0dXNfdCBzdGFydFRyYWNrcyhNZXRhRGF0YSAqcGFyYW1zKTsKICAgICBzaXplX3QgbnVtVHJhY2tzKCk7CiAgICAgaW50NjRfdCBlc3RpbWF0ZU1vb3ZCb3hTaXplKGludDMyX3QgYml0UmF0ZSk7CkBAIC0yNTUsNyArMjU3LDkgQEAKICAgICB2b2lkIGluaXRJbnRlcm5hbChpbnQgZmQsIGJvb2wgaXNGaXJzdFNlc3Npb24pOwogCiAgICAgLy8gQWNxdWlyZSBsb2NrIGJlZm9yZSBjYWxsaW5nIHRoZXNlIG1ldGhvZHMKLSAgICBvZmY2NF90IGFkZFNhbXBsZV9sKE1lZGlhQnVmZmVyICpidWZmZXIsIGJvb2wgdXNlUHJlZml4LCBib29sIGlzRXhpZiwgc2l6ZV90ICpieXRlc1dyaXR0ZW4pOworICAgIG9mZjY0X3QgYWRkU2FtcGxlX2woCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyLCBib29sIHVzZVByZWZpeCwKKyAgICAgICAgICAgIHVpbnQzMl90IHRpZmZIZHJPZmZzZXQsIHNpemVfdCAqYnl0ZXNXcml0dGVuKTsKICAgICB2b2lkIGFkZExlbmd0aFByZWZpeGVkU2FtcGxlX2woTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CiAgICAgdm9pZCBhZGRNdWx0aXBsZUxlbmd0aFByZWZpeGVkU2FtcGxlc19sKE1lZGlhQnVmZmVyICpidWZmZXIpOwogICAgIHVpbnQxNl90IGFkZFByb3BlcnR5X2woY29uc3QgSXRlbVByb3BlcnR5ICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAxZDQ5YzFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uLy4uLy4uL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2U2M2FlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9CVUZGRVJfSF8KKworI2RlZmluZSBNRURJQV9CVUZGRVJfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKK2NsYXNzIE1lZGlhQnVmZmVyOworY2xhc3MgTWVkaWFCdWZmZXJPYnNlcnZlcjsKK2NsYXNzIE1ldGFEYXRhQmFzZTsKKworY2xhc3MgTWVkaWFCdWZmZXIgOiBwdWJsaWMgTWVkaWFCdWZmZXJCYXNlIHsKK3B1YmxpYzoKKyAgICAvLyBhbGxvY2F0aW9ucyBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byB0aGlzIHdpbGwgdXNlIHNoYXJlZCBtZW1vcnkuCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrU2hhcmVkTWVtVGhyZXNob2xkID0gNjQgKiAxMDI0OworCisgICAgLy8gVGhlIHVuZGVybHlpbmcgZGF0YSByZW1haW5zIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIQorICAgIE1lZGlhQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIGV4cGxpY2l0IE1lZGlhQnVmZmVyKHNpemVfdCBzaXplKTsKKworICAgIGV4cGxpY2l0IE1lZGlhQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworI2lmbmRlZiBOT19JTUVNT1JZCisgICAgTWVkaWFCdWZmZXIoY29uc3Qgc3A8SU1lbW9yeT4gJm1lbSkgOgorICAgICAgICBNZWRpYUJ1ZmZlcigodWludDhfdCAqKW1lbS0+cG9pbnRlcigpICsgc2l6ZW9mKFNoYXJlZENvbnRyb2wpLCBtZW0tPnNpemUoKSkgeworICAgICAgICAvLyBkZWxlZ2F0ZSBhbmQgb3ZlcnJpZGUgbU1lbW9yeQorICAgICAgICBtTWVtb3J5ID0gbWVtOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gSWYgTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIGRlY3JlbWVudCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50OworICAgIC8vIGlmIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gMCwgcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlCisgICAgLy8gYXNzb2NpYXRlZCBNZWRpYUJ1ZmZlckdyb3VwLgorICAgIC8vCisgICAgLy8gSWYgbm8gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSB6ZXJvCisgICAgLy8gd2hlbiBjYWxsZWQsIHdoZXJldXBvbiB0aGUgTWVkaWFCdWZmZXIgaXMgZGVsZXRlZC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpOworCisgICAgLy8gSW5jcmVtZW50cyB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50LgorICAgIC8vIFVzZSBvbmx5IHdoZW4gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQuCisgICAgdmlydHVhbCB2b2lkIGFkZF9yZWYoKTsKKworICAgIHZpcnR1YWwgdm9pZCAqZGF0YSgpIGNvbnN0OworICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdDsKKworICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX29mZnNldCgpIGNvbnN0OworICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX2xlbmd0aCgpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIHNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKTsKKworICAgIE1ldGFEYXRhQmFzZSYgbWV0YV9kYXRhKCk7CisKKyAgICAvLyBDbGVhcnMgbWV0YSBkYXRhIGFuZCByZXNldHMgdGhlIHJhbmdlIHRvIHRoZSBmdWxsIGV4dGVudC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRPYnNlcnZlcihNZWRpYUJ1ZmZlck9ic2VydmVyICpncm91cCk7CisKKyAgICAvLyBzdW0gb2YgbG9jYWxSZWZjb3VudCgpIGFuZCByZW1vdGVSZWZjb3VudCgpCisgICAgLy8gUmVzdWx0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGFwcHJveGltYXRlIHVubGVzcyB0aGUgcmVzdWx0IHByZWNsdWRlcyBjb25jdXJyZW50IGFjY2Vzc2VzLgorICAgIHZpcnR1YWwgaW50IHJlZmNvdW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbG9jYWxSZWZjb3VudCgpICsgcmVtb3RlUmVmY291bnQoKTsKKyAgICB9CisKKyAgICAvLyBSZXN1bHQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYXBwcm94aW1hdGUgdW5sZXNzIHRoZSByZXN1bHQgcHJlY2x1ZGVzIGNvbmN1cnJlbnQgYWNjZXNzZXMuCisgICAgdmlydHVhbCBpbnQgbG9jYWxSZWZjb3VudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1SZWZDb3VudC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIH0KKworICAgIHZpcnR1YWwgaW50IHJlbW90ZVJlZmNvdW50KCkgY29uc3QgeworI2lmbmRlZiBOT19JTUVNT1JZCisgICAgICAgIGlmIChtTWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHJldHVybiAwOworICAgICAgICBpbnQzMl90IHJlbW90ZVJlZmNvdW50ID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obU1lbW9yeS0+cG9pbnRlcigpKS0+Z2V0UmVtb3RlUmVmY291bnQoKTsKKyAgICAgICAgLy8gU2FuaXR5IGNoZWNrIHNvIHRoYXQgcmVtb3RlUmVmQ291bnQoKSBpcyBub24tbmVnYXRpdmUuCisgICAgICAgIHJldHVybiByZW1vdGVSZWZjb3VudCA+PSAwID8gcmVtb3RlUmVmY291bnQgOiAwOyAvLyBkbyBub3QgYWxsb3cgY29ycnVwdGVkIGRhdGEuCisjZWxzZQorICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgorICAgIH0KKworICAgIC8vIHJldHVybnMgb2xkIHZhbHVlCisgICAgaW50IGFkZFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKKyNpZm5kZWYgTk9fSU1FTU9SWQorICAgICAgICBpZiAobU1lbW9yeS5nZXQoKSA9PSBudWxscHRyIHx8IG1NZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpLT5hZGRSZW1vdGVSZWZjb3VudCh2YWx1ZSk7CisjZWxzZQorICAgICAgICAodm9pZCkgdmFsdWU7CisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisgICAgfQorCisgICAgYm9vbCBpc0RlYWRPYmplY3QoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpc0RlYWRPYmplY3QobU1lbW9yeSk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNEZWFkT2JqZWN0KGNvbnN0IHNwPElNZW1vcnk+ICZtZW1vcnkpIHsKKyNpZm5kZWYgTk9fSU1FTU9SWQorICAgICAgICBpZiAobWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1lbW9yeS0+cG9pbnRlcigpKS0+aXNEZWFkT2JqZWN0KCk7CisjZWxzZQorICAgICAgICAodm9pZCkgbWVtb3J5OworICAgICAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKyAgICB9CisKKyAgICAvLyBTdGlja3kgb24gZW5hYmxpbmcgb2Ygc2hhcmVkIG1lbW9yeSBNZWRpYUJ1ZmZlcnMuIEJ5IGRlZmF1bHQgd2UgZG9uJ3QgdXNlCisgICAgLy8gc2hhcmVkIG1lbW9yeSBmb3IgTWVkaWFCdWZmZXJzLCBidXQgd2UgZW5hYmxlIHRoaXMgZm9yIHRob3NlIHByb2Nlc3NlcworICAgIC8vIHRoYXQgZXhwb3J0IE1lZGlhQnVmZmVycy4KKyAgICBzdGF0aWMgdm9pZCB1c2VTaGFyZWRNZW1vcnkoKSB7CisgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICZtVXNlU2hhcmVkTWVtb3J5LCAoaW50X2xlYXN0MzJfdCkxLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICAvLyB0cnVlIGlmIE1lZGlhQnVmZmVyIGlzIG9ic2VydmVkIChwYXJ0IG9mIGEgTWVkaWFCdWZmZXJHcm91cCkuCisgICAgaW5saW5lIGJvb2wgaXNPYnNlcnZlZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1PYnNlcnZlciAhPSBudWxscHRyOworICAgIH0KKworICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyKCk7CisKKyAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBNZWRpYUJ1ZmZlckdyb3VwOworICAgIGZyaWVuZCBjbGFzcyBPTVhEZWNvZGVyOworICAgIGZyaWVuZCBjbGFzcyBCbk1lZGlhU291cmNlOworICAgIGZyaWVuZCBjbGFzcyBCcE1lZGlhU291cmNlOworCisgICAgLy8gRm9yIHVzZSBieSBPTVhEZWNvZGVyLCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSAxLCBkcm9wIHJlZmVyZW5jZQorICAgIC8vIGNvdW50IHRvIDAgd2l0aG91dCBzaWduYWxsaW5nIHRoZSBvYnNlcnZlci4KKyAgICB2b2lkIGNsYWltKCk7CisKKyAgICBNZWRpYUJ1ZmZlck9ic2VydmVyICptT2JzZXJ2ZXI7CisgICAgc3RkOjphdG9taWM8aW50PiBtUmVmQ291bnQ7CisKKyAgICB2b2lkICptRGF0YTsKKyAgICBzaXplX3QgbVNpemUsIG1SYW5nZU9mZnNldCwgbVJhbmdlTGVuZ3RoOworICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7CisKKyAgICBib29sIG1Pd25zRGF0YTsKKworICAgIE1ldGFEYXRhQmFzZSogbU1ldGFEYXRhOworCisgICAgc3RhdGljIHN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgbVVzZVNoYXJlZE1lbW9yeTsKKworICAgIE1lZGlhQnVmZmVyKGNvbnN0IE1lZGlhQnVmZmVyICYpOworICAgIE1lZGlhQnVmZmVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXIgJik7CisKKyAgICAvLyBTaGFyZWRDb250cm9sIGJsb2NrIGF0IHRoZSBzdGFydCBvZiBJTWVtb3J5LgorICAgIHN0cnVjdCBTaGFyZWRDb250cm9sIHsKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgICBGTEFHX0RFQURfT0JKRUNUID0gKDEgPDwgMCksCisgICAgICAgIH07CisKKyAgICAgICAgLy8gcmV0dXJucyBvbGQgdmFsdWUKKyAgICAgICAgaW5saW5lIGludDMyX3QgYWRkUmVtb3RlUmVmY291bnQoaW50MzJfdCB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdCgKKyAgICAgICAgICAgICAgICAgICAgJm1SZW1vdGVSZWZjb3VudCwgKGludF9sZWFzdDMyX3QpdmFsdWUsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIGludDMyX3QgZ2V0UmVtb3RlUmVmY291bnQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgmbVJlbW90ZVJlZmNvdW50LCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIHNldFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKKyAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICAgICAmbVJlbW90ZVJlZmNvdW50LCAoaW50X2xlYXN0MzJfdCl2YWx1ZSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgYm9vbCBpc0RlYWRPYmplY3QoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoCisgICAgICAgICAgICAgICAgICAgICZtRmxhZ3MsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpICYgRkxBR19ERUFEX09CSkVDVCkgIT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIHNldERlYWRPYmplY3QoKSB7CisgICAgICAgICAgICAodm9pZClzdGQ6OmF0b21pY19mZXRjaF9vcl9leHBsaWNpdCgKKyAgICAgICAgICAgICAgICAgICAgJm1GbGFncywgKGludF9sZWFzdDMyX3QpRkxBR19ERUFEX09CSkVDVCwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICAgICAmbUZsYWdzLCAoaW50X2xlYXN0MzJfdCkwLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICAgICAmbVJlbW90ZVJlZmNvdW50LCAoaW50X2xlYXN0MzJfdCkwLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gQ2F1dGlvbjogYXRvbWljX2ludF9mYXN0MzJfdCBpcyA2NCBiaXRzIG9uIExQNjQuCisgICAgICAgIHN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgbUZsYWdzOworICAgICAgICBzdGQ6OmF0b21pY19pbnRfbGVhc3QzMl90IG1SZW1vdGVSZWZjb3VudDsKKyAgICAgICAgaW50MzJfdCB1bnVzZWRbNl0gX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpOyAvLyBhZGRpdGlvbmFsIGJ1ZmZlciBzcGFjZQorICAgIH07CisKKyAgICBpbmxpbmUgU2hhcmVkQ29udHJvbCAqZ2V0U2hhcmVkQ29udHJvbCgpIGNvbnN0IHsKKyNpZm5kZWYgTk9fSU1FTU9SWQorICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpOworI2Vsc2UKKyAgICAgICAgIHJldHVybiBudWxscHRyOworI2VuZGlmCisgICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggODBlNDliMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vLi4vLi4vbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyY2JmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9CVUZGRVJfQkFTRV9IXworCisjZGVmaW5lIE1FRElBX0JVRkZFUl9CQVNFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYUJ1ZmZlckJhc2U7CitjbGFzcyBNZXRhRGF0YUJhc2U7CisKK2NsYXNzIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgeworcHVibGljOgorICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIoKSB7fQorICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyT2JzZXJ2ZXIoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSA9IDA7CisKK3ByaXZhdGU6CisgICAgTWVkaWFCdWZmZXJPYnNlcnZlcihjb25zdCBNZWRpYUJ1ZmZlck9ic2VydmVyICYpOworICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlck9ic2VydmVyICYpOworfTsKKworY2xhc3MgTWVkaWFCdWZmZXJCYXNlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgTWVkaWFCdWZmZXJCYXNlICpDcmVhdGUoc2l6ZV90IHNpemUpOworCisgICAgLy8gSWYgTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIGRlY3JlbWVudCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50OworICAgIC8vIGlmIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gMCwgcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlCisgICAgLy8gYXNzb2NpYXRlZCBNZWRpYUJ1ZmZlckdyb3VwLgorICAgIC8vCisgICAgLy8gSWYgbm8gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSB6ZXJvCisgICAgLy8gd2hlbiBjYWxsZWQsIHdoZXJldXBvbiB0aGUgTWVkaWFCdWZmZXIgaXMgZGVsZXRlZC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpID0gMDsKKworICAgIC8vIEluY3JlbWVudHMgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudC4KKyAgICAvLyBVc2Ugb25seSB3aGVuIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LgorICAgIHZpcnR1YWwgdm9pZCBhZGRfcmVmKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkICpkYXRhKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9vZmZzZXQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzaXplX3QgcmFuZ2VfbGVuZ3RoKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKSA9IDA7CisKKyAgICB2aXJ0dWFsIE1ldGFEYXRhQmFzZSYgbWV0YV9kYXRhKCkgPSAwOworCisgICAgLy8gQ2xlYXJzIG1ldGEgZGF0YSBhbmQgcmVzZXRzIHRoZSByYW5nZSB0byB0aGUgZnVsbCBleHRlbnQuCisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHNldE9ic2VydmVyKE1lZGlhQnVmZmVyT2JzZXJ2ZXIgKmdyb3VwKSA9IDA7CisKKyAgICB2aXJ0dWFsIGludCByZWZjb3VudCgpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgaW50IGxvY2FsUmVmY291bnQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBpbnQgcmVtb3RlUmVmY291bnQoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIH5NZWRpYUJ1ZmZlckJhc2UoKSB7CisgICAgICAgIGRlbGV0ZSBtV3JhcHBlcjsKKyAgICAgICAgZGVsZXRlIG1Gb3JtYXQ7CisgICAgfTsKKworICAgIENNZWRpYUJ1ZmZlciAqd3JhcCgpIHsKKyAgICAgICAgaWYgKG1XcmFwcGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgICAgIH0KKyAgICAgICAgbVdyYXBwZXIgPSBuZXcgQ01lZGlhQnVmZmVyOworICAgICAgICBtV3JhcHBlci0+aGFuZGxlID0gdGhpczsKKworICAgICAgICBtV3JhcHBlci0+cmVsZWFzZSA9IFtdKHZvaWQgKmhhbmRsZSkgLT4gdm9pZCB7CisgICAgICAgICAgICAoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+cmVsZWFzZSgpOworICAgICAgICB9OworCisgICAgICAgIG1XcmFwcGVyLT5kYXRhID0gW10odm9pZCAqaGFuZGxlKSAtPiB2b2lkICogeworICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5kYXRhKCk7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPnNpemUgPSBbXSh2b2lkICpoYW5kbGUpIC0+IHNpemVfdCB7CisgICAgICAgICAgICByZXR1cm4gKChNZWRpYUJ1ZmZlckJhc2UqKWhhbmRsZSktPnNpemUoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+cmFuZ2Vfb2Zmc2V0ID0gW10odm9pZCAqaGFuZGxlKSAtPiBzaXplX3QgeworICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5yYW5nZV9vZmZzZXQoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+cmFuZ2VfbGVuZ3RoID0gW10odm9pZCAqaGFuZGxlKSAtPiBzaXplX3QgeworICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+c2V0X3JhbmdlID0gW10odm9pZCAqaGFuZGxlLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKSAtPiB2b2lkIHsKKyAgICAgICAgICAgIHJldHVybiAoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+c2V0X3JhbmdlKG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+bWV0YV9kYXRhID0gW10odm9pZCAqaGFuZGxlKSAtPiBBTWVkaWFGb3JtYXQqIHsKKyAgICAgICAgICAgIGlmICgoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+bUZvcm1hdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICAgICAgICAgICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5tRm9ybWF0ID0gQU1lZGlhRm9ybWF0X2Zyb21Nc2coJm1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKChNZWRpYUJ1ZmZlckJhc2UqKWhhbmRsZSktPm1Gb3JtYXQ7CisgICAgICAgIH07CisKKyAgICAgICAgcmV0dXJuIG1XcmFwcGVyOworICAgIH0KK3Byb3RlY3RlZDoKKyAgICBNZWRpYUJ1ZmZlckJhc2UoKSB7CisgICAgICAgIG1XcmFwcGVyID0gbnVsbHB0cjsKKyAgICAgICAgbUZvcm1hdCA9IG51bGxwdHI7CisgICAgfQorcHJpdmF0ZToKKyAgICBDTWVkaWFCdWZmZXIgKm1XcmFwcGVyOworICAgIEFNZWRpYUZvcm1hdCAqbUZvcm1hdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwOWIzZDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi8uLi8uLi9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2MjExNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9CVUZGRVJfR1JPVVBfSF8KKworI2RlZmluZSBNRURJQV9CVUZGRVJfR1JPVVBfSF8KKworI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3JQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhQnVmZmVyQmFzZTsKKworY2xhc3MgTWVkaWFCdWZmZXJHcm91cCA6IHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKK3B1YmxpYzoKKyAgICBNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBncm93dGhMaW1pdCA9IDApOworCisgICAgLy8gY3JlYXRlIGEgbWVkaWEgYnVmZmVyIGdyb3VwIHdpdGggcHJlYWxsb2NhdGVkIGJ1ZmZlcnMKKyAgICBNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCA9IDApOworCisgICAgfk1lZGlhQnVmZmVyR3JvdXAoKTsKKworICAgIHZvaWQgYWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CisKKyAgICBib29sIGhhc19idWZmZXJzKCk7CisKKyAgICAvLyBJZiBub25CbG9ja2luZyBpcyBmYWxzZSwgaXQgYmxvY2tzIHVudGlsIGEgYnVmZmVyIGlzIGF2YWlsYWJsZSBhbmQKKyAgICAvLyBwYXNzZXMgaXQgdG8gdGhlIGNhbGxlciBpbiAqYnVmZmVyLCB3aGlsZSByZXR1cm5pbmcgT0suCisgICAgLy8gVGhlIHJldHVybmVkIGJ1ZmZlciB3aWxsIGhhdmUgYSByZWZlcmVuY2UgY291bnQgb2YgMS4KKyAgICAvLyBJZiBub25CbG9ja2luZyBpcyB0cnVlIGFuZCBhIGJ1ZmZlciBpcyBub3QgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLAorICAgIC8vIGJ1ZmZlciBpcyBzZXQgdG8gTlVMTCBhbmQgaXQgcmV0dXJucyBXT1VMRF9CTE9DSy4KKyAgICAvLyBJZiByZXF1ZXN0ZWRTaXplIGlzIDAsIGFueSBmcmVlIE1lZGlhQnVmZmVyIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8gSWYgcmVxdWVzdGVkU2l6ZSBpcyA+IDAsIHRoZSByZXR1cm5lZCBNZWRpYUJ1ZmZlciBzaG91bGQgaGF2ZSBidWZmZXIKKyAgICAvLyBzaXplIG9mIGF0IGxlYXN0IHJlcXVzdGVkU2l6ZS4KKyAgICBzdGF0dXNfdCBhY3F1aXJlX2J1ZmZlcigKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgYm9vbCBub25CbG9ja2luZyA9IGZhbHNlLCBzaXplX3QgcmVxdWVzdGVkU2l6ZSA9IDApOworCisgICAgc2l6ZV90IGJ1ZmZlcnMoKSBjb25zdDsKKworICAgIC8vIElmIGJ1ZmZlciBpcyBudWxscHRyLCBoYXZlIGFjcXVpcmVfYnVmZmVyKCkgY2hlY2sgZm9yIHJlbW90ZSByZWxlYXNlLgorICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CisKKyAgICBDTWVkaWFCdWZmZXJHcm91cCAqd3JhcCgpIHsKKyAgICAgICAgaWYgKG1XcmFwcGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgICAgIH0KKworICAgICAgICBtV3JhcHBlciA9IG5ldyBDTWVkaWFCdWZmZXJHcm91cDsKKyAgICAgICAgbVdyYXBwZXItPmhhbmRsZSA9IHRoaXM7CisKKyAgICAgICAgbVdyYXBwZXItPmFkZF9idWZmZXIgPSBbXSh2b2lkICpoYW5kbGUsIHNpemVfdCBzaXplKSAtPiB2b2lkIHsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoc2l6ZSk7CisgICAgICAgICAgICAoKE1lZGlhQnVmZmVyR3JvdXAqKWhhbmRsZSktPmFkZF9idWZmZXIoYnVmKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+aW5pdCA9IFtdKHZvaWQgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpIC0+IGJvb2wgeworICAgICAgICAgICAgKChNZWRpYUJ1ZmZlckdyb3VwKiloYW5kbGUpLT5pbml0KGJ1ZmZlcnMsIGJ1ZmZlcl9zaXplLCBncm93dGhMaW1pdCk7CisgICAgICAgICAgLy8gICgoTWVkaWFCdWZmZXJHcm91cCopaGFuZGxlKS0+bVdyYXBwZXItPmluaXQgPSBudWxscHRyOyAvLyBlbmZvcmNlIGNhbGwtb25jZQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPmFjcXVpcmVfYnVmZmVyID0gW10odm9pZCAqaGFuZGxlLAorICAgICAgICAgICAgICAgIENNZWRpYUJ1ZmZlciAqKmJ1ZiwgYm9vbCBub25CbG9ja2luZywgc2l6ZV90IHJlcXVlc3RlZFNpemUpIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYWNxdWlyZWRCdWYgPSBudWxscHRyOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gKChNZWRpYUJ1ZmZlckdyb3VwKiloYW5kbGUpLT5hY3F1aXJlX2J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgJmFjcXVpcmVkQnVmLCBub25CbG9ja2luZywgcmVxdWVzdGVkU2l6ZSk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LICYmIGFjcXVpcmVkQnVmICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAqYnVmID0gYWNxdWlyZWRCdWYtPndyYXAoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmJ1ZiA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPmhhc19idWZmZXJzID0gW10odm9pZCAqaGFuZGxlKSAtPiBib29sIHsKKyAgICAgICAgICAgIHJldHVybiAoKE1lZGlhQnVmZmVyR3JvdXAqKWhhbmRsZSktPmhhc19idWZmZXJzKCk7CisgICAgICAgIH07CisKKyAgICAgICAgcmV0dXJuIG1XcmFwcGVyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDTWVkaWFCdWZmZXJHcm91cCAqbVdyYXBwZXI7CisgICAgc3RydWN0IEludGVybmFsRGF0YTsKKyAgICBJbnRlcm5hbERhdGEgKm1JbnRlcm5hbDsKKworICAgIE1lZGlhQnVmZmVyR3JvdXAoY29uc3QgTWVkaWFCdWZmZXJHcm91cCAmKTsKKyAgICBNZWRpYUJ1ZmZlckdyb3VwICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXJHcm91cCAmKTsKKyAgICB2b2lkIGluaXQoc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0dST1VQX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCmluZGV4IDNlZjRjMGUuLjJkY2E1YzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCkBAIC0zMSw2ICszMSwyMSBAQAogY29uc3RleHByIGludDMyX3QgQVZDUHJvZmlsZUNvbnN0cmFpbmVkQmFzZWxpbmUgPSAweDEwMDAwOwogY29uc3RleHByIGludDMyX3QgQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaCAgICAgPSAweDgwMDAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0FWQ1Byb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgQVZDUHJvZmlsZUJhc2VsaW5lOiAgICAgICAgICAgIHJldHVybiAiQmFzZWxpbmUiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVNYWluOiAgICAgICAgICAgICAgICByZXR1cm4gIk1haW4iOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVFeHRlbmRlZDogICAgICAgICAgICByZXR1cm4gIkV4dGVuZGVkIjsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlSGlnaDogICAgICAgICAgICAgICAgcmV0dXJuICJIaWdoIjsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlSGlnaDEwOiAgICAgICAgICAgICAgcmV0dXJuICJIaWdoMTAiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVIaWdoNDIyOiAgICAgICAgICAgICByZXR1cm4gIkhpZ2g0MjIiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVIaWdoNDQ0OiAgICAgICAgICAgICByZXR1cm4gIkhpZ2g0NDQiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lOiByZXR1cm4gIkNvbnN0cmFpbmVkQmFzZWxpbmUiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEhpZ2g6ICAgICByZXR1cm4gIkNvbnN0cmFpbmVkSGlnaCI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBBVkNMZXZlbDEgICAgICAgPSAweDAxOwogY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWwxYiAgICAgID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsMTEgICAgICA9IDB4MDQ7CkBAIC00OCw2ICs2MywzNSBAQAogY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw1ICAgICAgID0gMHg0MDAwOwogY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw1MSAgICAgID0gMHg4MDAwOwogY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw1MiAgICAgID0gMHgxMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsNiAgICAgICA9IDB4MjAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVkNMZXZlbDYxICAgICAgPSAweDQwMDAwOworY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw2MiAgICAgID0gMHg4MDAwMDsKKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19BVkNMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDE6ICAgICByZXR1cm4gIjEiOworICAgICAgICBjYXNlIEFWQ0xldmVsMWI6ICAgIHJldHVybiAiMWIiOworICAgICAgICBjYXNlIEFWQ0xldmVsMTE6ICAgIHJldHVybiAiMS4xIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDEyOiAgICByZXR1cm4gIjEuMiI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWwxMzogICAgcmV0dXJuICIxLjMiOworICAgICAgICBjYXNlIEFWQ0xldmVsMjogICAgIHJldHVybiAiMiI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWwyMTogICAgcmV0dXJuICIyLjEiOworICAgICAgICBjYXNlIEFWQ0xldmVsMjI6ICAgIHJldHVybiAiMi4yIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDM6ICAgICByZXR1cm4gIjMiOworICAgICAgICBjYXNlIEFWQ0xldmVsMzE6ICAgIHJldHVybiAiMy4xIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDMyOiAgICByZXR1cm4gIjMuMiI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWw0OiAgICAgcmV0dXJuICI0IjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDQxOiAgICByZXR1cm4gIjQuMSI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWw0MjogICAgcmV0dXJuICI0LjIiOworICAgICAgICBjYXNlIEFWQ0xldmVsNTogICAgIHJldHVybiAiNSI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWw1MTogICAgcmV0dXJuICI1LjEiOworICAgICAgICBjYXNlIEFWQ0xldmVsNTI6ICAgIHJldHVybiAiNS4yIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDY6ICAgICByZXR1cm4gIjYiOworICAgICAgICBjYXNlIEFWQ0xldmVsNjE6ICAgIHJldHVybiAiNi4xIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDYyOiAgICByZXR1cm4gIjYuMiI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CiAKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNQcm9maWxlQmFzZWxpbmUgICAgICAgICAgICAgPSAweDAxOwogY29uc3RleHByIGludDMyX3QgSDI2M1Byb2ZpbGVIMzIwQ29kaW5nICAgICAgICAgICA9IDB4MDI7CkBAIC01OSw2ICsxMDMsMjEgQEAKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNQcm9maWxlSW50ZXJsYWNlICAgICAgICAgICAgPSAweDgwOwogY29uc3RleHByIGludDMyX3QgSDI2M1Byb2ZpbGVIaWdoTGF0ZW5jeSAgICAgICAgICA9IDB4MTAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0gyNjNQcm9maWxlKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEgyNjNQcm9maWxlQmFzZWxpbmU6ICAgICAgICAgICByZXR1cm4gIkJhc2VsaW5lIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUgzMjBDb2Rpbmc6ICAgICAgICAgcmV0dXJuICJIMzIwQ29kaW5nIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUJhY2t3YXJkQ29tcGF0aWJsZTogcmV0dXJuICJCYWNrd2FyZENvbXBhdGlibGUiOworICAgICAgICBjYXNlIEgyNjNQcm9maWxlSVNXVjI6ICAgICAgICAgICAgICByZXR1cm4gIklTV1YyIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUlTV1YzOiAgICAgICAgICAgICAgcmV0dXJuICJJU1dWMyI7CisgICAgICAgIGNhc2UgSDI2M1Byb2ZpbGVIaWdoQ29tcHJlc3Npb246ICAgIHJldHVybiAiSGlnaENvbXByZXNzaW9uIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUludGVybmV0OiAgICAgICAgICAgcmV0dXJuICJJbnRlcm5ldCI7CisgICAgICAgIGNhc2UgSDI2M1Byb2ZpbGVJbnRlcmxhY2U6ICAgICAgICAgIHJldHVybiAiSW50ZXJsYWNlIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUhpZ2hMYXRlbmN5OiAgICAgICAgcmV0dXJuICJIaWdoTGF0ZW5jeSI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBIMjYzTGV2ZWwxMCAgICAgID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNMZXZlbDIwICAgICAgPSAweDAyOwogY29uc3RleHByIGludDMyX3QgSDI2M0xldmVsMzAgICAgICA9IDB4MDQ7CkBAIC02OCw2ICsxMjcsMjAgQEAKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNMZXZlbDYwICAgICAgPSAweDQwOwogY29uc3RleHByIGludDMyX3QgSDI2M0xldmVsNzAgICAgICA9IDB4ODA7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfSDI2M0xldmVsKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEgyNjNMZXZlbDEwOiAgIHJldHVybiAiMTAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDIwOiAgIHJldHVybiAiMjAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDMwOiAgIHJldHVybiAiMzAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDQwOiAgIHJldHVybiAiNDAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDQ1OiAgIHJldHVybiAiNDUiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDUwOiAgIHJldHVybiAiNTAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDYwOiAgIHJldHVybiAiNjAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDcwOiAgIHJldHVybiAiNzAiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVTaW1wbGUgICAgICAgICAgICAgID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlICAgICAgPSAweDAyOwogY29uc3RleHByIGludDMyX3QgTVBFRzRQcm9maWxlQ29yZSAgICAgICAgICAgICAgICA9IDB4MDQ7CkBAIC04NSw2ICsxNTgsMjggQEAKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUgICAgPSAweDQwMDA7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSAgICAgID0gMHg4MDAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX01QRUc0UHJvZmlsZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVTaW1wbGU6ICAgICAgICAgICAgcmV0dXJuICJTaW1wbGUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlOiAgICByZXR1cm4gIlNpbXBsZVNjYWxhYmxlIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVDb3JlOiAgICAgICAgICAgICAgcmV0dXJuICJDb3JlIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVNYWluOiAgICAgICAgICAgICAgcmV0dXJuICJNYWluIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVOYml0OiAgICAgICAgICAgICAgcmV0dXJuICJOYml0IjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVTY2FsYWJsZVRleHR1cmU6ICAgcmV0dXJuICJTY2FsYWJsZVRleHR1cmUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZVNpbXBsZUZhY2U6ICAgICAgICByZXR1cm4gIlNpbXBsZUZhY2UiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZVNpbXBsZUZCQTogICAgICAgICByZXR1cm4gIlNpbXBsZUZCQSI7CisgICAgICAgIGNhc2UgTVBFRzRQcm9maWxlQmFzaWNBbmltYXRlZDogICAgIHJldHVybiAiQmFzaWNBbmltYXRlZCI7CisgICAgICAgIGNhc2UgTVBFRzRQcm9maWxlSHlicmlkOiAgICAgICAgICAgIHJldHVybiAiSHlicmlkIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lOiAgcmV0dXJuICJBZHZhbmNlZFJlYWxUaW1lIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVDb3JlU2NhbGFibGU6ICAgICAgcmV0dXJuICJDb3JlU2NhbGFibGUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nOiAgICByZXR1cm4gIkFkdmFuY2VkQ29kaW5nIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVBZHZhbmNlZENvcmU6ICAgICAgcmV0dXJuICJBZHZhbmNlZENvcmUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGU6ICByZXR1cm4gIkFkdmFuY2VkU2NhbGFibGUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlOiAgICByZXR1cm4gIkFkdmFuY2VkU2ltcGxlIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUc0TGV2ZWwwICAgICAgPSAweDAxOwogY29uc3RleHByIGludDMyX3QgTVBFRzRMZXZlbDBiICAgICA9IDB4MDI7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNExldmVsMSAgICAgID0gMHgwNDsKQEAgLTk2LDYgKzE5MSwyMiBAQAogY29uc3RleHByIGludDMyX3QgTVBFRzRMZXZlbDUgICAgICA9IDB4ODA7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNExldmVsNiAgICAgID0gMHgxMDA7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfTVBFRzRMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBNUEVHNExldmVsMDogICByZXR1cm4gIjAiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWwwYjogIHJldHVybiAiMGIiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWwxOiAgIHJldHVybiAiMSI7CisgICAgICAgIGNhc2UgTVBFRzRMZXZlbDI6ICAgcmV0dXJuICIyIjsKKyAgICAgICAgY2FzZSBNUEVHNExldmVsMzogICByZXR1cm4gIjMiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWwzYjogIHJldHVybiAiM2IiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWw0OiAgIHJldHVybiAiNCI7CisgICAgICAgIGNhc2UgTVBFRzRMZXZlbDRhOiAgcmV0dXJuICI0YSI7CisgICAgICAgIGNhc2UgTVBFRzRMZXZlbDU6ICAgcmV0dXJuICI1IjsKKyAgICAgICAgY2FzZSBNUEVHNExldmVsNjogICByZXR1cm4gIjYiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMlByb2ZpbGVTaW1wbGUgICAgICAgICAgICAgID0gMHgwMDsKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUcyUHJvZmlsZU1haW4gICAgICAgICAgICAgICAgPSAweDAxOwogY29uc3RleHByIGludDMyX3QgTVBFRzJQcm9maWxlNDIyICAgICAgICAgICAgICAgICA9IDB4MDI7CkBAIC0xMDMsMTIgKzIxNCwzNSBAQAogY29uc3RleHByIGludDMyX3QgTVBFRzJQcm9maWxlU3BhdGlhbCAgICAgICAgICAgICA9IDB4MDQ7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMlByb2ZpbGVIaWdoICAgICAgICAgICAgICAgID0gMHgwNTsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19NUEVHMlByb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgTVBFRzJQcm9maWxlU2ltcGxlOiAgICByZXR1cm4gIlNpbXBsZSI7CisgICAgICAgIGNhc2UgTVBFRzJQcm9maWxlTWFpbjogICAgICByZXR1cm4gIk1haW4iOworICAgICAgICBjYXNlIE1QRUcyUHJvZmlsZTQyMjogICAgICAgcmV0dXJuICI0MjIiOworICAgICAgICBjYXNlIE1QRUcyUHJvZmlsZVNOUjogICAgICAgcmV0dXJuICJTTlIiOworICAgICAgICBjYXNlIE1QRUcyUHJvZmlsZVNwYXRpYWw6ICAgcmV0dXJuICJTcGF0aWFsIjsKKyAgICAgICAgY2FzZSBNUEVHMlByb2ZpbGVIaWdoOiAgICAgIHJldHVybiAiSGlnaCI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgTVBFRzJMZXZlbExMICAgICA9IDB4MDA7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMkxldmVsTUwgICAgID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUcyTGV2ZWxIMTQgICAgPSAweDAyOwogY29uc3RleHByIGludDMyX3QgTVBFRzJMZXZlbEhMICAgICA9IDB4MDM7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMkxldmVsSFAgICAgID0gMHgwNDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19NUEVHMkxldmVsKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE1QRUcyTGV2ZWxMTDogIHJldHVybiAiTEwiOworICAgICAgICBjYXNlIE1QRUcyTGV2ZWxNTDogIHJldHVybiAiTUwiOworICAgICAgICBjYXNlIE1QRUcyTGV2ZWxIMTQ6IHJldHVybiAiSDE0IjsKKyAgICAgICAgY2FzZSBNUEVHMkxldmVsSEw6ICByZXR1cm4gIkhMIjsKKyAgICAgICAgY2FzZSBNUEVHMkxldmVsSFA6ICByZXR1cm4gIkhQIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgQUFDT2JqZWN0TWFpbiAgICAgICA9IDE7CiBjb25zdGV4cHIgaW50MzJfdCBBQUNPYmplY3RMQyAgICAgICAgID0gMjsKIGNvbnN0ZXhwciBpbnQzMl90IEFBQ09iamVjdFNTUiAgICAgICAgPSAzOwpAQCAtMTIyLDE5ICsyNTYsNzAgQEAKIGNvbnN0ZXhwciBpbnQzMl90IEFBQ09iamVjdEVMRCAgICAgICAgPSAzOTsKIGNvbnN0ZXhwciBpbnQzMl90IEFBQ09iamVjdFhIRSAgICAgICAgPSA0MjsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19BQUNPYmplY3QoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0TWFpbjogICAgICAgICByZXR1cm4gIk1haW4iOworICAgICAgICBjYXNlIEFBQ09iamVjdExDOiAgICAgICAgICAgcmV0dXJuICJMQyI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0U1NSOiAgICAgICAgICByZXR1cm4gIlNTUiI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0TFRQOiAgICAgICAgICByZXR1cm4gIkxUUCI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0SEU6ICAgICAgICAgICByZXR1cm4gIkhFIjsKKyAgICAgICAgY2FzZSBBQUNPYmplY3RTY2FsYWJsZTogICAgIHJldHVybiAiU2NhbGFibGUiOworICAgICAgICBjYXNlIEFBQ09iamVjdEVSTEM6ICAgICAgICAgcmV0dXJuICJFUkxDIjsKKyAgICAgICAgY2FzZSBBQUNPYmplY3RFUlNjYWxhYmxlOiAgIHJldHVybiAiRVJTY2FsYWJsZSI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0TEQ6ICAgICAgICAgICByZXR1cm4gIkxEIjsKKyAgICAgICAgY2FzZSBBQUNPYmplY3RIRV9QUzogICAgICAgIHJldHVybiAiSEVfUFMiOworICAgICAgICBjYXNlIEFBQ09iamVjdEVMRDogICAgICAgICAgcmV0dXJuICJFTEQiOworICAgICAgICBjYXNlIEFBQ09iamVjdFhIRTogICAgICAgICAgcmV0dXJuICJYSEUiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24wID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24xID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24yID0gMHgwNDsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24zID0gMHgwODsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19WUDhMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBWUDhMZXZlbF9WZXJzaW9uMDogcmV0dXJuICJWMCI7CisgICAgICAgIGNhc2UgVlA4TGV2ZWxfVmVyc2lvbjE6IHJldHVybiAiVjEiOworICAgICAgICBjYXNlIFZQOExldmVsX1ZlcnNpb24yOiByZXR1cm4gIlYyIjsKKyAgICAgICAgY2FzZSBWUDhMZXZlbF9WZXJzaW9uMzogcmV0dXJuICJWMyI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBWUDhQcm9maWxlTWFpbiA9IDB4MDE7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfVlA4UHJvZmlsZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBWUDhQcm9maWxlTWFpbjogICAgcmV0dXJuICJNYWluIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUwID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUxID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUyID0gMHgwNDsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUzID0gMHgwODsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUySERSID0gMHgxMDAwOwogY29uc3RleHByIGludDMyX3QgVlA5UHJvZmlsZTNIRFIgPSAweDIwMDA7Citjb25zdGV4cHIgaW50MzJfdCBWUDlQcm9maWxlMkhEUjEwUGx1cyA9IDB4NDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUzSERSMTBQbHVzID0gMHg4MDAwOworCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX1ZQOVByb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTA6ICAgICAgICAgICByZXR1cm4gIjAiOworICAgICAgICBjYXNlIFZQOVByb2ZpbGUxOiAgICAgICAgICAgcmV0dXJuICIxIjsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlMjogICAgICAgICAgIHJldHVybiAiMiI7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTM6ICAgICAgICAgICByZXR1cm4gIjMiOworICAgICAgICBjYXNlIFZQOVByb2ZpbGUySERSOiAgICAgICAgcmV0dXJuICIySERSIjsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlM0hEUjogICAgICAgIHJldHVybiAiM0hEUiI7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTJIRFIxMFBsdXM6ICByZXR1cm4gIjJIRFJQbHVzIjsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlM0hEUjEwUGx1czogIHJldHVybiAiM0hEUlBsdXMiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CiAKIGNvbnN0ZXhwciBpbnQzMl90IFZQOUxldmVsMSAgPSAweDE7CiBjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDExID0gMHgyOwpAQCAtMTUxLDEwICszMzYsMTEwIEBACiBjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDYxID0gMHgxMDAwOwogY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWw2MiA9IDB4MjAwMDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19WUDlMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDE6ICAgICByZXR1cm4gIjEiOworICAgICAgICBjYXNlIFZQOUxldmVsMTE6ICAgIHJldHVybiAiMS4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDI6ICAgICByZXR1cm4gIjIiOworICAgICAgICBjYXNlIFZQOUxldmVsMjE6ICAgIHJldHVybiAiMi4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDM6ICAgICByZXR1cm4gIjMiOworICAgICAgICBjYXNlIFZQOUxldmVsMzE6ICAgIHJldHVybiAiMy4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDQ6ICAgICByZXR1cm4gIjQiOworICAgICAgICBjYXNlIFZQOUxldmVsNDE6ICAgIHJldHVybiAiNC4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDU6ICAgICByZXR1cm4gIjUiOworICAgICAgICBjYXNlIFZQOUxldmVsNTE6ICAgIHJldHVybiAiNS4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDUyOiAgICByZXR1cm4gIjUuMiI7CisgICAgICAgIGNhc2UgVlA5TGV2ZWw2OiAgICAgcmV0dXJuICI2IjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDYxOiAgICByZXR1cm4gIjYuMSI7CisgICAgICAgIGNhc2UgVlA5TGV2ZWw2MjogICAgcmV0dXJuICI2LjIiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCitjb25zdGV4cHIgaW50MzJfdCBBVjFQcm9maWxlMCA9IDB4MDE7Citjb25zdGV4cHIgaW50MzJfdCBBVjFQcm9maWxlMSA9IDB4MDI7Citjb25zdGV4cHIgaW50MzJfdCBBVjFQcm9maWxlMiA9IDB4MDQ7CisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfQVYxUHJvZmlsZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBBVjFQcm9maWxlMDogICAgICAgcmV0dXJuICIwIjsKKyAgICAgICAgY2FzZSBBVjFQcm9maWxlMTogICAgICAgcmV0dXJuICIxIjsKKyAgICAgICAgY2FzZSBBVjFQcm9maWxlMjogICAgICAgcmV0dXJuICIyIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsMiAgPSAweDE7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDIxID0gMHgyOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWwyMiA9IDB4NDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsMjMgPSAweDg7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDMgID0gMHgxMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsMzEgPSAweDIwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWwzMiA9IDB4NDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDMzID0gMHg4MDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNCAgPSAweDEwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNDEgPSAweDIwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNDIgPSAweDQwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNDMgPSAweDgwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNSAgPSAweDEwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDUxID0gMHgyMDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw1MiA9IDB4NDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNTMgPSAweDgwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDYgID0gMHgxMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNjEgPSAweDIwMDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw2MiA9IDB4NDAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDYzID0gMHg4MDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNyAgPSAweDEwMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNzEgPSAweDIwMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNzIgPSAweDQwMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNzMgPSAweDgwMDAwMDsKKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19BVjFMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDI6ICAgICByZXR1cm4gIjIiOworICAgICAgICBjYXNlIEFWMUxldmVsMjE6ICAgIHJldHVybiAiMi4xIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDIyOiAgICByZXR1cm4gIjIuMiI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWwyMzogICAgcmV0dXJuICIyLjMiOworICAgICAgICBjYXNlIEFWMUxldmVsMzogICAgIHJldHVybiAiMyI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWwzMTogICAgcmV0dXJuICIzLjEiOworICAgICAgICBjYXNlIEFWMUxldmVsMzI6ICAgIHJldHVybiAiMy4yIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDMzOiAgICByZXR1cm4gIjMuMyI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw0OiAgICAgcmV0dXJuICI0IjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDQxOiAgICByZXR1cm4gIjQuMSI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw0MjogICAgcmV0dXJuICI0LjIiOworICAgICAgICBjYXNlIEFWMUxldmVsNDM6ICAgIHJldHVybiAiNC4zIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDU6ICAgICByZXR1cm4gIjUiOworICAgICAgICBjYXNlIEFWMUxldmVsNTE6ICAgIHJldHVybiAiNS4xIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDUyOiAgICByZXR1cm4gIjUuMiI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw1MzogICAgcmV0dXJuICI1LjMiOworICAgICAgICBjYXNlIEFWMUxldmVsNjogICAgIHJldHVybiAiNiI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw2MTogICAgcmV0dXJuICI2LjEiOworICAgICAgICBjYXNlIEFWMUxldmVsNjI6ICAgIHJldHVybiAiNi4yIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDYzOiAgICByZXR1cm4gIjYuMyI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw3OiAgICAgcmV0dXJuICI3IjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDcxOiAgICByZXR1cm4gIjcuMSI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw3MjogICAgcmV0dXJuICI3LjIiOworICAgICAgICBjYXNlIEFWMUxldmVsNzM6ICAgIHJldHVybiAiNy4zIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgSEVWQ1Byb2ZpbGVNYWluICAgICAgICA9IDB4MDE7CiBjb25zdGV4cHIgaW50MzJfdCBIRVZDUHJvZmlsZU1haW4xMCAgICAgID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IEhFVkNQcm9maWxlTWFpblN0aWxsICAgPSAweDA0OwogY29uc3RleHByIGludDMyX3QgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMCA9IDB4MTAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEhFVkNQcm9maWxlTWFpbjEwSERSMTBQbHVzID0gMHgyMDAwOworCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0hFVkNQcm9maWxlKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEhFVkNQcm9maWxlTWFpbjogICAgICAgICAgICAgICByZXR1cm4gIk1haW4iOworICAgICAgICBjYXNlIEhFVkNQcm9maWxlTWFpbjEwOiAgICAgICAgICAgICByZXR1cm4gIk1haW4xMCI7CisgICAgICAgIGNhc2UgSEVWQ1Byb2ZpbGVNYWluU3RpbGw6ICAgICAgICAgIHJldHVybiAiTWFpblN0aWxsIjsKKyAgICAgICAgY2FzZSBIRVZDUHJvZmlsZU1haW4xMEhEUjEwOiAgICAgICAgcmV0dXJuICJNYWluMTBIRFIxMCI7CisgICAgICAgIGNhc2UgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMFBsdXM6ICAgIHJldHVybiAiTWFpbjEwSERSMTBQbHVzIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CiAKIGNvbnN0ZXhwciBpbnQzMl90IEhFVkNNYWluVGllckxldmVsMSAgPSAweDE7CiBjb25zdGV4cHIgaW50MzJfdCBIRVZDSGlnaFRpZXJMZXZlbDEgID0gMHgyOwpAQCAtMTgzLDYgKzQ2OCwzOCBAQAogY29uc3RleHByIGludDMyX3QgSEVWQ01haW5UaWVyTGV2ZWw2MiA9IDB4MTAwMDAwMDsKIGNvbnN0ZXhwciBpbnQzMl90IEhFVkNIaWdoVGllckxldmVsNjIgPSAweDIwMDAwMDA7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfSEVWQ1RpZXJMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDE6ICAgIHJldHVybiAiTWFpbiAxIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDE6ICAgIHJldHVybiAiSGlnaCAxIjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDI6ICAgIHJldHVybiAiTWFpbiAyIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDI6ICAgIHJldHVybiAiSGlnaCAyIjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDIxOiAgIHJldHVybiAiTWFpbiAyLjEiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsMjE6ICAgcmV0dXJuICJIaWdoIDIuMSI7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWwzOiAgICByZXR1cm4gIk1haW4gMyI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWwzOiAgICByZXR1cm4gIkhpZ2ggMyI7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWwzMTogICByZXR1cm4gIk1haW4gMy4xIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDMxOiAgIHJldHVybiAiSGlnaCAzLjEiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsNDogICAgcmV0dXJuICJNYWluIDQiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsNDogICAgcmV0dXJuICJIaWdoIDQiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsNDE6ICAgcmV0dXJuICJNYWluIDQuMSI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWw0MTogICByZXR1cm4gIkhpZ2ggNC4xIjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDU6ICAgIHJldHVybiAiTWFpbiA1IjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDU6ICAgIHJldHVybiAiSGlnaCA1IjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDUxOiAgIHJldHVybiAiTWFpbiA1LjEiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsNTE6ICAgcmV0dXJuICJIaWdoIDUuMSI7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWw1MjogICByZXR1cm4gIk1haW4gNS4yIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDUyOiAgIHJldHVybiAiSGlnaCA1LjIiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsNjogICAgcmV0dXJuICJNYWluIDYiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsNjogICAgcmV0dXJuICJIaWdoIDYiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsNjE6ICAgcmV0dXJuICJNYWluIDYuMSI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWw2MTogICByZXR1cm4gIkhpZ2ggNi4xIjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDYyOiAgIHJldHVybiAiTWFpbiA2LjIiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsNjI6ICAgcmV0dXJuICJIaWdoIDYuMiI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlciA9IDB4MTsKIGNvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZQZW4gPSAweDI7CiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRGVyID0gMHg0OwpAQCAtMTk0LDYgKzUxMSwyMiBAQAogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0ID0gMHgxMDA7CiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvblByb2ZpbGVEdmF2U2UgPSAweDIwMDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19Eb2xieVZpc2lvblByb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlcjogcmV0dXJuICJEdmF2UGVyIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmF2UGVuOiByZXR1cm4gIkR2YXZQZW4iOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEZXI6IHJldHVybiAiRHZoZURlciI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZoZURlbjogcmV0dXJuICJEdmhlRGVuIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRyOiByZXR1cm4gIkR2aGVEdHIiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdG46IHJldHVybiAiRHZoZVN0biI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0aDogcmV0dXJuICJEdmhlRHRoIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRiOiByZXR1cm4gIkR2aGVEdGIiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdDogIHJldHVybiAiRHZoZVN0IjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmF2U2U6ICByZXR1cm4gIkR2YXZTZSI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uTGV2ZWxIZDI0ICAgID0gMHgxOwogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbEhkMzAgICAgPSAweDI7CiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsRmhkMjQgICA9IDB4NDsKQEAgLTIwNCwxMCArNTM3LDM0IEBACiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsVWhkNDggICA9IDB4ODA7CiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsVWhkNjAgICA9IDB4MTAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0RvbGJ5VmlzaW9uTGV2ZWwoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbEhkMjQ6ICByZXR1cm4gIkhkMjQiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWxIZDMwOiAgcmV0dXJuICJIZDMwIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsRmhkMjQ6IHJldHVybiAiRmhkMjQiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWxGaGQzMDogcmV0dXJuICJGaGQzMCI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbEZoZDYwOiByZXR1cm4gIkZoZDYwIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsVWhkMjQ6IHJldHVybiAiVWhkMjQiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWxVaGQzMDogcmV0dXJuICJVaGQzMCI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbFVoZDQ4OiByZXR1cm4gIlVoZDQ4IjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsVWhkNjA6IHJldHVybiAiVWhkNjAiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IEJJVFJBVEVfTU9ERV9DQlIgPSAyOwogY29uc3RleHByIGludDMyX3QgQklUUkFURV9NT0RFX0NRID0gMDsKIGNvbnN0ZXhwciBpbnQzMl90IEJJVFJBVEVfTU9ERV9WQlIgPSAxOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0JpdHJhdGVNb2RlKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEJJVFJBVEVfTU9ERV9DQlI6ICByZXR1cm4gIkNCUiI7CisgICAgICAgIGNhc2UgQklUUkFURV9NT0RFX0NROiAgIHJldHVybiAiQ1EiOworICAgICAgICBjYXNlIEJJVFJBVEVfTU9ERV9WQlI6ICByZXR1cm4gIlZCUiI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQxMmJpdFJHQjQ0NCAgICAgICAgICAgICA9IDM7CiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQxNmJpdEFSR0IxNTU1ICAgICAgICAgICA9IDU7CiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXQxNmJpdEFSR0I0NDQ0ICAgICAgICAgICA9IDQ7CkBAIC0yNjEsNiArNjE4LDY0IEBACiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9RQ09NX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIgICA9IDB4N2ZhMzBjMDA7CiBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9USV9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyID0gMHg3ZjAwMDEwMDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19Db2xvckZvcm1hdChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxMmJpdFJHQjQ0NDogICAgICAgICAgICAgICByZXR1cm4gIjEyYml0UkdCNDQ0IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxNmJpdEFSR0IxNTU1OiAgICAgICAgICAgICByZXR1cm4gIjE2Yml0QVJHQjE1NTUiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDE2Yml0QVJHQjQ0NDQ6ICAgICAgICAgICAgIHJldHVybiAiMTZiaXRBUkdCNDQ0NCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MTZiaXRCR1I1NjU6ICAgICAgICAgICAgICAgcmV0dXJuICIxNmJpdEJHUjU2NSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU6ICAgICAgICAgICAgICAgcmV0dXJuICIxNmJpdFJHQjU2NSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MThiaXRBUkdCMTY2NTogICAgICAgICAgICAgcmV0dXJuICIxOGJpdEFSR0IxNjY1IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxOEJpdEJHUjY2NjogICAgICAgICAgICAgICByZXR1cm4gIjE4Qml0QkdSNjY2IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxOGJpdFJHQjY2NjogICAgICAgICAgICAgICByZXR1cm4gIjE4Yml0UkdCNjY2IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxOWJpdEFSR0IxNjY2OiAgICAgICAgICAgICByZXR1cm4gIjE5Yml0QVJHQjE2NjYiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDI0Qml0QUJHUjY2NjY6ICAgICAgICAgICAgIHJldHVybiAiMjRCaXRBQkdSNjY2NiI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRBUkdCMTg4NzogICAgICAgICAgICAgcmV0dXJuICIyNGJpdEFSR0IxODg3IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQyNEJpdEFSR0I2NjY2OiAgICAgICAgICAgICByZXR1cm4gIjI0Qml0QVJHQjY2NjYiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDI0Yml0QkdSODg4OiAgICAgICAgICAgICAgIHJldHVybiAiMjRiaXRCR1I4ODgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDI0Yml0UkdCODg4OiAgICAgICAgICAgICAgIHJldHVybiAiMjRiaXRSR0I4ODgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDI1Yml0QVJHQjE4ODg6ICAgICAgICAgICAgIHJldHVybiAiMjViaXRBUkdCMTg4OCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRBQkdSODg4ODogICAgICAgICAgICAgcmV0dXJuICIzMmJpdEFCR1I4ODg4IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEFSR0I4ODg4OiAgICAgICAgICAgICByZXR1cm4gIjMyYml0QVJHQjg4ODgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg6ICAgICAgICAgICAgIHJldHVybiAiMzJiaXRCR1JBODg4OCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0OGJpdFJHQjMzMjogICAgICAgICAgICAgICAgcmV0dXJuICI4Yml0UkdCMzMyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRDYllDclk6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkNiWUNyWSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0Q3JZQ2JZOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDcllDYlkiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdEwxNjogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTDE2IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRMMjogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkwyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRMMjQ6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkwyNCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0TDMyOiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJMMzIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdEw0OiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTDQiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdEw4OiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTDgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdE1vbm9jaHJvbWU6ICAgICAgICAgICAgICAgIHJldHVybiAiTW9ub2Nocm9tZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UmF3QmF5ZXIxMGJpdDogICAgICAgICAgICAgcmV0dXJuICJSYXdCYXllcjEwYml0IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRSYXdCYXllcjhiaXQ6ICAgICAgICAgICAgICByZXR1cm4gIlJhd0JheWVyOGJpdCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UmF3QmF5ZXI4Yml0Y29tcHJlc3NlZDogICAgcmV0dXJuICJSYXdCYXllcjhiaXRjb21wcmVzc2VkIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRSR0JBRmxleGlibGU6ICAgICAgICAgICAgICByZXR1cm4gIlJHQkFGbGV4aWJsZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UkdCRmxleGlibGU6ICAgICAgICAgICAgICAgcmV0dXJuICJSR0JGbGV4aWJsZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0U3VyZmFjZTogICAgICAgICAgICAgICAgICAgcmV0dXJuICJTdXJmYWNlIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZQ2JZQ3I6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIllDYllDciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WUNyWUNiOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJZQ3JZQ2IiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQxMVBhY2tlZFBsYW5hcjogICAgICAgIHJldHVybiAiWVVWNDExUGFja2VkUGxhbmFyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MTFQbGFuYXI6ICAgICAgICAgICAgICByZXR1cm4gIllVVjQxMVBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU6ICAgICAgICAgICAgcmV0dXJuICJZVVY0MjBGbGV4aWJsZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOiAgICAgICAgcmV0dXJuICJZVVY0MjBQYWNrZWRQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6ICAgIHJldHVybiAiWVVWNDIwUGFja2VkU2VtaVBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOiAgICAgICAgICAgICAgcmV0dXJuICJZVVY0MjBQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6ICAgICAgICAgIHJldHVybiAiWVVWNDIwU2VtaVBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIyRmxleGlibGU6ICAgICAgICAgICAgcmV0dXJuICJZVVY0MjJGbGV4aWJsZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIyUGFja2VkUGxhbmFyOiAgICAgICAgcmV0dXJuICJZVVY0MjJQYWNrZWRQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMlBhY2tlZFNlbWlQbGFuYXI6ICAgIHJldHVybiAiWVVWNDIyUGFja2VkU2VtaVBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIyUGxhbmFyOiAgICAgICAgICAgICAgcmV0dXJuICJZVVY0MjJQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMlNlbWlQbGFuYXI6ICAgICAgICAgIHJldHVybiAiWVVWNDIyU2VtaVBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDQ0RmxleGlibGU6ICAgICAgICAgICAgcmV0dXJuICJZVVY0NDRGbGV4aWJsZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDQ0SW50ZXJsZWF2ZWQ6ICAgICAgICAgcmV0dXJuICJZVVY0NDRJbnRlcmxlYXZlZCI7CisgICAgICAgIGNhc2UgQ09MT1JfUUNPTV9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOiAgICAgcmV0dXJuICJRQ09NX1lVVjQyMFNlbWlQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX1RJX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6IHJldHVybiAiVElfWVVWNDIwUGFja2VkU2VtaVBsYW5hciI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBjaGFyIEZFQVRVUkVfQWRhcHRpdmVQbGF5YmFja1tdICAgICAgID0gImFkYXB0aXZlLXBsYXliYWNrIjsKIGNvbnN0ZXhwciBjaGFyIEZFQVRVUkVfSW50cmFSZWZyZXNoW10gPSAiaW50cmEtcmVmcmVzaCI7CiBjb25zdGV4cHIgY2hhciBGRUFUVVJFX1BhcnRpYWxGcmFtZVtdID0gInBhcnRpYWwtZnJhbWUiOwpAQCAtMjcwLDYgKzY4NSw3IEBACiAvLyBmcm9tIE1lZGlhRm9ybWF0LmphdmEKIGNvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX1ZQOFtdID0gInZpZGVvL3gtdm5kLm9uMi52cDgiOwogY29uc3RleHByIGNoYXIgTUlNRVRZUEVfVklERU9fVlA5W10gPSAidmlkZW8veC12bmQub24yLnZwOSI7Citjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19BVjFbXSA9ICJ2aWRlby9hdjAxIjsKIGNvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX0FWQ1tdID0gInZpZGVvL2F2YyI7CiBjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19IRVZDW10gPSAidmlkZW8vaGV2YyI7CiBjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19NUEVHNFtdID0gInZpZGVvL21wNHYtZXMiOwpAQCAtMzI3LDYgKzc0Myw3IEBACiBjb25zdGV4cHIgY2hhciBLRVlfQklUUkFURV9NT0RFW10gPSAiYml0cmF0ZS1tb2RlIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DQV9TRVNTSU9OX0lEW10gPSAiY2Etc2Vzc2lvbi1pZCI7CiBjb25zdGV4cHIgY2hhciBLRVlfQ0FfU1lTVEVNX0lEW10gPSAiY2Etc3lzdGVtLWlkIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9DQV9QUklWQVRFX0RBVEFbXSA9ICJjYS1wcml2YXRlLWRhdGEiOwogY29uc3RleHByIGNoYXIgS0VZX0NBUFRVUkVfUkFURVtdID0gImNhcHR1cmUtcmF0ZSI7CiBjb25zdGV4cHIgY2hhciBLRVlfQ0hBTk5FTF9DT1VOVFtdID0gImNoYW5uZWwtY291bnQiOwogY29uc3RleHByIGNoYXIgS0VZX0NIQU5ORUxfTUFTS1tdID0gImNoYW5uZWwtbWFzayI7CkBAIC0zMzUsNiArNzUyLDcgQEAKIGNvbnN0ZXhwciBjaGFyIEtFWV9DT0xPUl9TVEFOREFSRFtdID0gImNvbG9yLXN0YW5kYXJkIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DT0xPUl9UUkFOU0ZFUltdID0gImNvbG9yLXRyYW5zZmVyIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DT01QTEVYSVRZW10gPSAiY29tcGxleGl0eSI7Citjb25zdGV4cHIgY2hhciBLRVlfQ1JFQVRFX0lOUFVUX1NVUkZBQ0VfU1VTUEVOREVEW10gPSAiY3JlYXRlLWlucHV0LWJ1ZmZlcnMtc3VzcGVuZGVkIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9EVVJBVElPTltdID0gImR1cmF0aW9uVXMiOwogY29uc3RleHByIGNoYXIgS0VZX0ZFQVRVUkVfW10gPSAiZmVhdHVyZS0iOwogY29uc3RleHByIGNoYXIgS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUxbXSA9ICJmbGFjLWNvbXByZXNzaW9uLWxldmVsIjsKQEAgLTM0Miw2ICs3NjAsNyBAQAogY29uc3RleHByIGNoYXIgS0VZX0dSSURfQ09MVU1OU1tdID0gImdyaWQtY29scyI7CiBjb25zdGV4cHIgY2hhciBLRVlfR1JJRF9ST1dTW10gPSAiZ3JpZC1yb3dzIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9IRFJfU1RBVElDX0lORk9bXSA9ICJoZHItc3RhdGljLWluZm8iOworY29uc3RleHByIGNoYXIgS0VZX0hEUjEwX1BMVVNfSU5GT1tdID0gImhkcjEwLXBsdXMtaW5mbyI7CiBjb25zdGV4cHIgY2hhciBLRVlfSEVJR0hUW10gPSAiaGVpZ2h0IjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9JX0ZSQU1FX0lOVEVSVkFMW10gPSAiaS1mcmFtZS1pbnRlcnZhbCI7CiBjb25zdGV4cHIgY2hhciBLRVlfSU5UUkFfUkVGUkVTSF9QRVJJT0RbXSA9ICJpbnRyYS1yZWZyZXNoLXBlcmlvZCI7CkBAIC0zNTQsOCArNzczLDEwIEBACiBjb25zdGV4cHIgY2hhciBLRVlfTEFURU5DWVtdID0gImxhdGVuY3kiOwogY29uc3RleHByIGNoYXIgS0VZX0xFVkVMW10gPSAibGV2ZWwiOwogY29uc3RleHByIGNoYXIgS0VZX01BWF9CSVRfUkFURVtdID0gIm1heC1iaXRyYXRlIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9NQVhfRlBTX1RPX0VOQ09ERVJbXSA9ICJtYXgtZnBzLXRvLWVuY29kZXIiOwogY29uc3RleHByIGNoYXIgS0VZX01BWF9IRUlHSFRbXSA9ICJtYXgtaGVpZ2h0IjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9NQVhfSU5QVVRfU0laRVtdID0gIm1heC1pbnB1dC1zaXplIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSW10gPSAibWF4LXB0cy1nYXAtdG8tZW5jb2RlciI7CiBjb25zdGV4cHIgY2hhciBLRVlfTUFYX1dJRFRIW10gPSAibWF4LXdpZHRoIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9NSU1FW10gPSAibWltZSI7CiBjb25zdGV4cHIgY2hhciBLRVlfT1BFUkFUSU5HX1JBVEVbXSA9ICJvcGVyYXRpbmctcmF0ZSI7CkBAIC00MTAsOCArODMxLDEwIEBACiBjb25zdGV4cHIgaW50MzJfdCBJTkZPX1RSWV9BR0FJTl9MQVRFUiAgICAgICAgPSAtMTsKIGNvbnN0ZXhwciBpbnQzMl90IFZJREVPX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19GSVQgICAgICAgICAgICAgICA9IDE7CiBjb25zdGV4cHIgaW50MzJfdCBWSURFT19TQ0FMSU5HX01PREVfU0NBTEVfVE9fRklUX1dJVEhfQ1JPUFBJTkcgPSAyOworY29uc3RleHByIGNoYXIgUEFSQU1FVEVSX0tFWV9PRkZTRVRfVElNRVtdID0gInRpbWUtb2Zmc2V0LXVzIjsKIGNvbnN0ZXhwciBjaGFyIFBBUkFNRVRFUl9LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FW10gPSAicmVxdWVzdC1zeW5jIjsKIGNvbnN0ZXhwciBjaGFyIFBBUkFNRVRFUl9LRVlfU1VTUEVORFtdID0gImRyb3AtaW5wdXQtZnJhbWVzIjsKK2NvbnN0ZXhwciBjaGFyIFBBUkFNRVRFUl9LRVlfU1VTUEVORF9USU1FW10gPSAiZHJvcC1zdGFydC10aW1lLXVzIjsKIGNvbnN0ZXhwciBjaGFyIFBBUkFNRVRFUl9LRVlfVklERU9fQklUUkFURVtdID0gInZpZGVvLWJpdHJhdGUiOwogCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmgKaW5kZXggNTlmNTdjNy4uZjUzYjIzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaApAQCAtNDgsNiArNDgsMTMgQEAKICAgICAgKiBhZGRlZCBgTWVkaWFDb2RlY0luZm9gIG9iamVjdC4KICAgICAgKi8KICAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+IGFkZE1lZGlhQ29kZWNJbmZvKCk7CisgICAgLyoqCisgICAgICogRmluZCBhbiBleGlzdGluZyBgTWVkaWFDb2RlY0luZm9gIG9iamVjdCBmb3IgYSBjb2RlYyBuYW1lIGFuZCByZXR1cm4gYQorICAgICAqIGBNZWRpYUNvZGVjSW5mb1dyaXRlcmAgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZm91bmQgYWRkZWQgYE1lZGlhQ29kZWNJbmZvYC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGBNZWRpYUNvZGVjSW5mb1dyaXRlcmAgb2JqZWN0IGlmIGZvdW5kLCBvciBudWxscHRyIGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+IGZpbmRNZWRpYUNvZGVjSW5mbyhjb25zdCBjaGFyICpjb2RlY05hbWUpOwogcHJpdmF0ZToKICAgICBNZWRpYUNvZGVjTGlzdFdyaXRlcigpID0gZGVmYXVsdDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCmluZGV4IDZhNWM2YjYuLjA5NjM5ZTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKQEAgLTcwLDcgKzcwLDEyIEBACiAgICAgRVJST1JfRFJNX0RFVklDRV9SRVZPS0VEICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gOSwKICAgICBFUlJPUl9EUk1fUkVTT1VSQ0VfQlVTWSAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxMCwKICAgICBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX09VVFBVVF9QUk9URUNUSU9OID0gRFJNX0VSUk9SX0JBU0UgLSAxMSwKLSAgICBFUlJPUl9EUk1fTEFTVF9VU0VEX0VSUk9SQ09ERSAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxMSwKKyAgICBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxMiwKKyAgICBFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxMywKKyAgICBFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTiAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxNCwKKyAgICBFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxNSwKKyAgICBFUlJPUl9EUk1fSU5WQUxJRF9TVEFURSAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxNiwKKyAgICBFUlJPUl9EUk1fTEFTVF9VU0VEX0VSUk9SQ09ERSAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxNiwKIAogICAgIEVSUk9SX0RSTV9WRU5ET1JfTUFYICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDUwMCwKICAgICBFUlJPUl9EUk1fVkVORE9SX01JTiAgICAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA5OTksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmMThkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfRVhUUkFDVE9SX0hfCisKKyNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBNZXRhRGF0YUJhc2U7CitzdHJ1Y3QgTWVkaWFUcmFjazsKKworCitjbGFzcyBFeHRyYWN0b3JBbGxvY1RyYWNrZXIgeworcHVibGljOgorICAgIEV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoImV4dHJhY3RvciBhbGxvY2F0ZWQ6ICVwIiwgdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgfkV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoImV4dHJhY3RvciBmcmVlZDogJXAiLCB0aGlzKTsKKyAgICB9Cit9OworCitjbGFzcyBNZWRpYUV4dHJhY3RvcgorLy8gOiBwdWJsaWMgRXh0cmFjdG9yQWxsb2NUcmFja2VyCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3IoKTsKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpID0gMDsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCkgPSAwOworCisgICAgZW51bSBHZXRUcmFja01ldGFEYXRhRmxhZ3MgeworICAgICAgICBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhID0gMQorICAgIH07CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKAorICAgICAgICAgICAgTWV0YURhdGFCYXNlJiBtZXRhLAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyA9IDApID0gMDsKKworICAgIC8vIFJldHVybiBjb250YWluZXIgc3BlY2lmaWMgbWV0YS1kYXRhLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAgIC8vIHJldHVybnMgYW4gZW1wdHkgbWV0YWRhdGEgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKSA9IDA7CisKKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgQ0FOX1NFRUtfQkFDS1dBUkQgID0gMSwgIC8vIHRoZSAic2VlayAxMHNlY3MgYmFjayBidXR0b24iCisgICAgICAgIENBTl9TRUVLX0ZPUldBUkQgICA9IDIsICAvLyB0aGUgInNlZWsgMTBzZWNzIGZvcndhcmQgYnV0dG9uIgorICAgICAgICBDQU5fUEFVU0UgICAgICAgICAgPSA0LAorICAgICAgICBDQU5fU0VFSyAgICAgICAgICAgPSA4LCAgLy8gdGhlICJzZWVrIGJhciIKKyAgICB9OworCisgICAgLy8gSWYgc3ViY2xhc3NlcyBkbyBfbm90XyBvdmVycmlkZSB0aGlzLCB0aGUgZGVmYXVsdCBpcworICAgIC8vIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLIHwgQ0FOX1BBVVNFCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICI8dW5zcGVjaWZpZWQ+IjsgfQorCitwcm90ZWN0ZWQ6CisgICAgTWVkaWFFeHRyYWN0b3IoKTsKKworcHJpdmF0ZToKKyAgICBNZWRpYUV4dHJhY3Rvcihjb25zdCBNZWRpYUV4dHJhY3RvciAmKTsKKyAgICBNZWRpYUV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhRXh0cmFjdG9yICYpOworfTsKKworY2xhc3MgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXIoQ01lZGlhRXh0cmFjdG9yICpwbHVnaW4pOworICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpOworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIGNhc1Rva2VuLCBzaXplX3Qgc2l6ZSk7Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyKCk7Citwcml2YXRlOgorICAgIENNZWRpYUV4dHJhY3RvciAqcGx1Z2luOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oCmluZGV4IGZiOWY1YmQuLmVhODc5NDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaApAQCAtMTksMTAgKzE5LDEwIEBACiAjZGVmaW5lIE1FRElBX0VYVFJBQ1RPUl9GQUNUT1JZX0hfCiAKICNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2RsZXh0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzUsMjYgKzM1LDI2IEBACiAgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7CiAgICAgc3RhdGljIHNwPElNZWRpYUV4dHJhY3Rvcj4gQ3JlYXRlRnJvbVNlcnZpY2UoCiAgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7Ci0gICAgc3RhdGljIHZvaWQgTG9hZFBsdWdpbnMoY29uc3QgOjpzdGQ6OnN0cmluZyYgYXBrUGF0aCk7CiAgICAgc3RhdGljIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKyAgICBzdGF0aWMgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBnZXRTdXBwb3J0ZWRUeXBlcygpOwogCiBwcml2YXRlOgogICAgIHN0YXRpYyBNdXRleCBnUGx1Z2luTXV0ZXg7Ci0gICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBnUGx1Z2luczsKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gZ1BsdWdpbnM7CiAgICAgc3RhdGljIGJvb2wgZ1BsdWdpbnNSZWdpc3RlcmVkOworICAgIHN0YXRpYyBib29sIGdJZ25vcmVWZXJzaW9uOwogCi0gICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJFeHRyYWN0b3JzSW5BcGsoCi0gICAgICAgICAgICBjb25zdCBjaGFyICphcGtQYXRoLCBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KTsKLSAgICBzdGF0aWMgdm9pZCBSZWdpc3RlckV4dHJhY3RvcnNJblN5c3RlbSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxpYkRpclBhdGgsIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOworICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRXh0cmFjdG9ycygKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxpYkRpclBhdGgsIGNvbnN0IGFuZHJvaWRfZGxleHRpbmZvKiBkbGV4dGluZm8sCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOwogICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRXh0cmFjdG9yKAotICAgICAgICAgICAgY29uc3Qgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLCBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KTsKKyAgICAgICAgICAgIGNvbnN0IHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbiwgc3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KTsKIAotICAgIHN0YXRpYyBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgc25pZmYoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqbWV0YSwgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqZnJlZU1ldGEsCi0gICAgICAgICAgICBzcDxFeHRyYWN0b3JQbHVnaW4+ICZwbHVnaW4pOworICAgIHN0YXRpYyB2b2lkICpzbmlmZihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLCBGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhLAorICAgICAgICAgICAgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLCB1aW50MzJfdCAqY3JlYXRvclZlcnNpb24pOwogCi0gICAgc3RhdGljIHZvaWQgVXBkYXRlRXh0cmFjdG9ycyhjb25zdCBjaGFyICpuZXdVcGRhdGVBcGtQYXRoKTsKKyAgICBzdGF0aWMgdm9pZCBVcGRhdGVFeHRyYWN0b3JzKCk7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmgKaW5kZXggZmUwZTYxMy4uYWNhYTZjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oCkBAIC0xOSw1MCArMTksMjEgQEAKICNkZWZpbmUgTUVESUFfSFRUUF9IXwogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJNZWRpYUhUVFAuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgTWVkaWFIVFRQQ29ubmVjdGlvbjsKIAotc3RydWN0IE1lZGlhSFRUUCA6IHB1YmxpYyBIVFRQQmFzZSB7CitzdHJ1Y3QgTWVkaWFIVFRQIDogcHVibGljIENsZWFyTWVkaWFIVFRQIHsKICAgICBNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCi0gICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKLQotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCBvZmZzZXQpOwotCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWVkaWFIVFRQKCk7CiAKICAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIqIG1pbWUpOwotICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKTsKLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdDsKIAogcHJpdmF0ZToKLSAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotICAgIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IG1IVFRQQ29ubmVjdGlvbjsKLQotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1MYXN0SGVhZGVyczsKLSAgICBBU3RyaW5nIG1MYXN0VVJJOwotCi0gICAgYm9vbCBtQ2FjaGVkU2l6ZVZhbGlkOwotICAgIG9mZjY0X3QgbUNhY2hlZFNpemU7Ci0KICAgICBzcDxEZWNyeXB0SGFuZGxlPiBtRGVjcnlwdEhhbmRsZTsKICAgICBEcm1NYW5hZ2VyQ2xpZW50ICptRHJtTWFuYWdlckNsaWVudDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaAppbmRleCA2NmY0ZDcyLi42OWQ2Y2RlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaApAQCAtNDksNiArNDksNyBAQAogICAgICAgICBPVVRQVVRfRk9STUFUX1dFQk0gICAgICAgID0gMSwKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFAgICA9IDIsCiAgICAgICAgIE9VVFBVVF9GT1JNQVRfSEVJRiAgICAgICAgPSAzLAorICAgICAgICBPVVRQVVRfRk9STUFUX09HRyAgICAgICAgID0gNCwKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9MSVNUX0VORCAvLyBtdXN0IGJlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIGZvcm1hdCB0eXBlCiAgICAgfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhU291cmNlLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAxNjBmOGQzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uLy4uLy4uL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAxZTEyMTkzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi8uLi8uLi9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0MDdhZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKQEAgLTAsMCArMSwzMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FVEFfREFUQV9CQVNFX0hfCisKKyNkZWZpbmUgTUVUQV9EQVRBX0JBU0VfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFRoZSBmb2xsb3dpbmcga2V5cyBtYXAgdG8gaW50MzJfdCBkYXRhIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgorZW51bSB7CisgICAga0tleU1JTUVUeXBlICAgICAgICAgID0gJ21pbWUnLCAgLy8gY3N0cmluZworICAgIGtLZXlXaWR0aCAgICAgICAgICAgICA9ICd3aWR0JywgIC8vIGludDMyX3QsIGltYWdlIHBpeGVsCisgICAga0tleUhlaWdodCAgICAgICAgICAgID0gJ2hlaWcnLCAgLy8gaW50MzJfdCwgaW1hZ2UgcGl4ZWwKKyAgICBrS2V5RGlzcGxheVdpZHRoICAgICAgPSAnZFdpZCcsICAvLyBpbnQzMl90LCBkaXNwbGF5L3ByZXNlbnRhdGlvbgorICAgIGtLZXlEaXNwbGF5SGVpZ2h0ICAgICA9ICdkSGd0JywgIC8vIGludDMyX3QsIGRpc3BsYXkvcHJlc2VudGF0aW9uCisgICAga0tleVNBUldpZHRoICAgICAgICAgID0gJ3NhclcnLCAgLy8gaW50MzJfdCwgc2FtcGxlQXNwZWN0UmF0aW8gd2lkdGgKKyAgICBrS2V5U0FSSGVpZ2h0ICAgICAgICAgPSAnc2FySCcsICAvLyBpbnQzMl90LCBzYW1wbGVBc3BlY3RSYXRpbyBoZWlnaHQKKyAgICBrS2V5VGh1bWJuYWlsV2lkdGggICAgPSAndGhiVycsICAvLyBpbnQzMl90LCB0aHVtYm5haWwgd2lkdGgKKyAgICBrS2V5VGh1bWJuYWlsSGVpZ2h0ICAgPSAndGhiSCcsICAvLyBpbnQzMl90LCB0aHVtYm5haWwgaGVpZ2h0CisKKyAgICAvLyBhIHJlY3RhbmdsZSwgaWYgYWJzZW50IGFzc3VtZWQgdG8gYmUgKDAsIDAsIHdpZHRoIC0gMSwgaGVpZ2h0IC0gMSkKKyAgICBrS2V5Q3JvcFJlY3QgICAgICAgICAgPSAnY3JvcCcsCisKKyAgICBrS2V5Um90YXRpb24gICAgICAgICAgPSAncm90QScsICAvLyBpbnQzMl90IChhbmdsZSBpbiBkZWdyZWVzKQorICAgIGtLZXlJRnJhbWVzSW50ZXJ2YWwgICA9ICdpZml2JywgIC8vIGludDMyX3QKKyAgICBrS2V5U3RyaWRlICAgICAgICAgICAgPSAnc3RyZCcsICAvLyBpbnQzMl90CisgICAga0tleVNsaWNlSGVpZ2h0ICAgICAgID0gJ3NsaHQnLCAgLy8gaW50MzJfdAorICAgIGtLZXlDaGFubmVsQ291bnQgICAgICA9ICcjY2huJywgIC8vIGludDMyX3QKKyAgICBrS2V5Q2hhbm5lbE1hc2sgICAgICAgPSAnY2hubScsICAvLyBpbnQzMl90CisgICAga0tleVNhbXBsZVJhdGUgICAgICAgID0gJ3NydGUnLCAgLy8gaW50MzJfdCAoYXVkaW8gc2FtcGxpbmcgcmF0ZSBIeikKKyAgICBrS2V5UGNtRW5jb2RpbmcgICAgICAgPSAnUENNZScsICAvLyBpbnQzMl90IChhdWRpbyBlbmNvZGluZyBlbnVtKQorICAgIGtLZXlGcmFtZVJhdGUgICAgICAgICA9ICdmcm1SJywgIC8vIGludDMyX3QgKHZpZGVvIGZyYW1lIHJhdGUgZnBzKQorICAgIGtLZXlCaXRSYXRlICAgICAgICAgICA9ICdicnRlJywgIC8vIGludDMyX3QgKGJwcykKKyAgICBrS2V5TWF4Qml0UmF0ZSAgICAgICAgPSAnbXhCcicsICAvLyBpbnQzMl90IChicHMpCisgICAga0tleUJpdHNQZXJTYW1wbGUgICAgID0gJ2JpdHMnLCAgLy8gaW50MzJfdCAoYml0cyBwZXIgc2FtcGxlKQorICAgIGtLZXlTdHJlYW1IZWFkZXIgICAgICA9ICdzdEhkJywgIC8vIHJhdyBkYXRhCisgICAga0tleUVTRFMgICAgICAgICAgICAgID0gJ2VzZHMnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5QUFDUHJvZmlsZSAgICAgICAgPSAnYWFjcCcsICAvLyBpbnQzMl90CisgICAga0tleUFWQ0MgICAgICAgICAgICAgID0gJ2F2Y2MnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5SFZDQyAgICAgICAgICAgICAgPSAnaHZjYycsICAvLyByYXcgZGF0YQorICAgIGtLZXlBVjFDICAgICAgICAgICAgICA9ICdhdjFjJywgIC8vIHJhdyBkYXRhCisgICAga0tleVRodW1ibmFpbEhWQ0MgICAgID0gJ3RodmMnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5RDI2MyAgICAgICAgICAgICAgPSAnZDI2MycsICAvLyByYXcgZGF0YQorICAgIGtLZXlWb3JiaXNJbmZvICAgICAgICA9ICd2aW5mJywgIC8vIHJhdyBkYXRhCisgICAga0tleVZvcmJpc0Jvb2tzICAgICAgID0gJ3Zib28nLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5T3B1c0hlYWRlciAgICAgICAgPSAnb2hkcicsICAvLyByYXcgZGF0YQorICAgIGtLZXlPcHVzQ29kZWNEZWxheSAgICA9ICdvY29kJywgIC8vIHVpbnQ2NF90IChjb2RlYyBkZWxheSBpbiBucykKKyAgICBrS2V5T3B1c1NlZWtQcmVSb2xsICAgPSAnb3NwcicsICAvLyB1aW50NjRfdCAoc2VlayBwcmVyb2xsIGluIG5zKQorICAgIGtLZXlGbGFjTWV0YWRhdGEgICAgICA9ICdmbE1kJywgIC8vIHJhdyBkYXRhCisgICAga0tleVZwOUNvZGVjUHJpdmF0ZSAgID0gJ3ZwOXAnLCAgLy8gcmF3IGRhdGEgKHZwOSBjc2QgaW5mb3JtYXRpb24pCisgICAga0tleUlzU3luY0ZyYW1lICAgICAgID0gJ3N5bmMnLCAgLy8gaW50MzJfdCAoYm9vbCkKKyAgICBrS2V5SXNDb2RlY0NvbmZpZyAgICAgPSAnY29uZicsICAvLyBpbnQzMl90IChib29sKQorICAgIGtLZXlJc011eGVyRGF0YSAgICAgICA9ICdtdXhkJywgIC8vIGludDMyX3QgKGJvb2wpCisgICAga0tleVRpbWUgICAgICAgICAgICAgID0gJ3RpbWUnLCAgLy8gaW50NjRfdCAodXNlY3MpCisgICAga0tleURlY29kaW5nVGltZSAgICAgID0gJ2RlY1QnLCAgLy8gaW50NjRfdCAoZGVjb2RpbmcgdGltZXN0YW1wIGluIHVzZWNzKQorICAgIGtLZXlOVFBUaW1lICAgICAgICAgICA9ICdudHBUJywgIC8vIHVpbnQ2NF90IChudHAtdGltZXN0YW1wKQorICAgIGtLZXlUYXJnZXRUaW1lICAgICAgICA9ICd0YXJUJywgIC8vIGludDY0X3QgKHVzZWNzKQorICAgIGtLZXlEcmlmdFRpbWUgICAgICAgICA9ICdkZnRUJywgIC8vIGludDY0X3QgKHVzZWNzKQorICAgIGtLZXlBbmNob3JUaW1lICAgICAgICA9ICdhbmNUJywgIC8vIGludDY0X3QgKHVzZWNzKQorICAgIGtLZXlEdXJhdGlvbiAgICAgICAgICA9ICdkdXJhJywgIC8vIGludDY0X3QgKHVzZWNzKQorICAgIGtLZXlQaXhlbEZvcm1hdCAgICAgICA9ICdwaXhmJywgIC8vIGludDMyX3QKKyAgICBrS2V5Q29sb3JGb3JtYXQgICAgICAgPSAnY29sZicsICAvLyBpbnQzMl90CisgICAga0tleUNvbG9yU3BhY2UgICAgICAgID0gJ2NvbHMnLCAgLy8gaW50MzJfdAorICAgIGtLZXlQbGF0Zm9ybVByaXZhdGUgICA9ICdwcml2JywgIC8vIHBvaW50ZXIKKyAgICBrS2V5RGVjb2RlckNvbXBvbmVudCAgPSAnZGVjQycsICAvLyBjc3RyaW5nCisgICAga0tleUJ1ZmZlcklEICAgICAgICAgID0gJ2JmSUQnLAorICAgIGtLZXlNYXhJbnB1dFNpemUgICAgICA9ICdpbnBTJywKKyAgICBrS2V5TWF4V2lkdGggICAgICAgICAgPSAnbWF4VycsCisgICAga0tleU1heEhlaWdodCAgICAgICAgID0gJ21heEgnLAorICAgIGtLZXlUaHVtYm5haWxUaW1lICAgICA9ICd0aGJUJywgIC8vIGludDY0X3QgKHVzZWNzKQorICAgIGtLZXlUcmFja0lEICAgICAgICAgICA9ICd0cklEJywKKyAgICBrS2V5RW5jb2RlckRlbGF5ICAgICAgPSAnZW5jZCcsICAvLyBpbnQzMl90IChmcmFtZXMpCisgICAga0tleUVuY29kZXJQYWRkaW5nICAgID0gJ2VuY3AnLCAgLy8gaW50MzJfdCAoZnJhbWVzKQorCisgICAga0tleUFsYnVtICAgICAgICAgICAgID0gJ2FsYnUnLCAgLy8gY3N0cmluZworICAgIGtLZXlBcnRpc3QgICAgICAgICAgICA9ICdhcnRpJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5QWxidW1BcnRpc3QgICAgICAgPSAnYWFydCcsICAvLyBjc3RyaW5nCisgICAga0tleUNvbXBvc2VyICAgICAgICAgID0gJ2NvbXAnLCAgLy8gY3N0cmluZworICAgIGtLZXlHZW5yZSAgICAgICAgICAgICA9ICdnZW5yJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5VGl0bGUgICAgICAgICAgICAgPSAndGl0bCcsICAvLyBjc3RyaW5nCisgICAga0tleVllYXIgICAgICAgICAgICAgID0gJ3llYXInLCAgLy8gY3N0cmluZworICAgIGtLZXlBbGJ1bUFydCAgICAgICAgICA9ICdhbGJBJywgIC8vIGNvbXByZXNzZWQgaW1hZ2UgZGF0YQorICAgIGtLZXlBdXRob3IgICAgICAgICAgICA9ICdhdXRoJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5Q0RUcmFja051bWJlciAgICAgPSAnY2R0cicsICAvLyBjc3RyaW5nCisgICAga0tleURpc2NOdW1iZXIgICAgICAgID0gJ2RudW0nLCAgLy8gY3N0cmluZworICAgIGtLZXlEYXRlICAgICAgICAgICAgICA9ICdkYXRlJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5V3JpdGVyICAgICAgICAgICAgPSAnd3JpdCcsICAvLyBjc3RyaW5nCisgICAga0tleUNvbXBpbGF0aW9uICAgICAgID0gJ2NwaWwnLCAgLy8gY3N0cmluZworICAgIGtLZXlMb2NhdGlvbiAgICAgICAgICA9ICdsb2MgJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5VGltZVNjYWxlICAgICAgICAgPSAndG1zbCcsICAvLyBpbnQzMl90CisgICAga0tleUNhcHR1cmVGcmFtZXJhdGUgID0gJ2NhcEYnLCAgLy8gZmxvYXQgKGNhcHR1cmUgZnBzKQorCisgICAgLy8gdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwKKyAgICBrS2V5VmlkZW9Qcm9maWxlICAgICAgPSAndnByZicsICAvLyBpbnQzMl90CisgICAga0tleVZpZGVvTGV2ZWwgICAgICAgID0gJ3ZsZXYnLCAgLy8gaW50MzJfdAorCisgICAgLy8gU2V0IHRoaXMga2V5IHRvIGVuYWJsZSBhdXRob3JpbmcgZmlsZXMgaW4gNjQtYml0IG9mZnNldAorICAgIGtLZXk2NEJpdEZpbGVPZmZzZXQgICA9ICdmb2J0JywgIC8vIGludDMyX3QgKGJvb2wpCisgICAga0tleTJCeXRlTmFsTGVuZ3RoICAgID0gJzJOQUwnLCAgLy8gaW50MzJfdCAoYm9vbCkKKworICAgIC8vIElkZW50aWZ5IHRoZSBmaWxlIG91dHB1dCBmb3JtYXQgZm9yIGF1dGhvcmluZworICAgIC8vIFBsZWFzZSBzZWUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4gZm9yIHRoZSBzdXBwb3J0ZWQKKyAgICAvLyBmaWxlIG91dHB1dCBmb3JtYXRzLgorICAgIGtLZXlGaWxlVHlwZSAgICAgICAgICA9ICdmdHlwJywgIC8vIGludDMyX3QKKworICAgIC8vIFRyYWNrIGF1dGhvcmluZyBwcm9ncmVzcyBzdGF0dXMKKyAgICAvLyBrS2V5VHJhY2tUaW1lU3RhdHVzIGlzIHVzZWQgdG8gdHJhY2sgcHJvZ3Jlc3MgaW4gZWxhcHNlZCB0aW1lCisgICAga0tleVRyYWNrVGltZVN0YXR1cyAgID0gJ3RrdG0nLCAgLy8gaW50NjRfdAorCisgICAga0tleVJlYWxUaW1lUmVjb3JkaW5nID0gJ3J0cmMnLCAgLy8gYm9vbCAoaW50MzJfdCkKKyAgICBrS2V5TnVtQnVmZmVycyAgICAgICAgPSAnbmJiZicsICAvLyBpbnQzMl90CisKKyAgICAvLyBPZ2cgZmlsZXMgY2FuIGJlIHRhZ2dlZCB0byBiZSBhdXRvbWF0aWNhbGx5IGxvb3BpbmcuLi4KKyAgICBrS2V5QXV0b0xvb3AgICAgICAgICAgPSAnYXV0TCcsICAvLyBib29sIChpbnQzMl90KQorCisgICAga0tleVZhbGlkU2FtcGxlcyAgICAgID0gJ3ZhbEQnLCAgLy8gaW50MzJfdAorCisgICAga0tleUlzVW5yZWFkYWJsZSAgICAgID0gJ3VucmUnLCAgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIC8vIEFuIGluZGljYXRpb24gdGhhdCBhIHZpZGVvIGJ1ZmZlciBoYXMgYmVlbiByZW5kZXJlZC4KKyAgICBrS2V5UmVuZGVyZWQgICAgICAgICAgPSAncmVuZCcsICAvLyBib29sIChpbnQzMl90KQorCisgICAgLy8gVGhlIGxhbmd1YWdlIGNvZGUgZm9yIHRoaXMgbWVkaWEKKyAgICBrS2V5TWVkaWFMYW5ndWFnZSAgICAgPSAnbGFuZycsICAvLyBjc3RyaW5nCisKKyAgICAvLyBUaGUgbWFudWZhY3R1cmVyIGNvZGUgZm9yIHRoaXMgbWVkaWEKKyAgICBrS2V5TWFudWZhY3R1cmVyICA9ICdtYW51JywgIC8vIGNzdHJpbmcKKworICAgIC8vIFRvIHN0b3JlIHRoZSB0aW1lZCB0ZXh0IGZvcm1hdCBkYXRhCisgICAga0tleVRleHRGb3JtYXREYXRhICAgID0gJ3RleHQnLCAgLy8gcmF3IGRhdGEKKworICAgIGtLZXlSZXF1aXJlc1NlY3VyZUJ1ZmZlcnMgPSAnc2VjdScsICAvLyBib29sIChpbnQzMl90KQorCisgICAga0tleUlzQURUUyAgICAgICAgICAgID0gJ2FkdHMnLCAgLy8gYm9vbCAoaW50MzJfdCkKKyAgICBrS2V5QUFDQU9UICAgICAgICAgICAgPSAnYWFvdCcsICAvLyBpbnQzMl90CisKKyAgICAvLyBJZiBhIE1lZGlhQnVmZmVyJ3MgZGF0YSByZXByZXNlbnRzIChhdCBsZWFzdCBwYXJ0aWFsbHkpIGVuY3J5cHRlZAorICAgIC8vIGRhdGEsIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFpZCBpbiBkZWNyeXB0aW9uLgorICAgIC8vIFRoZSBkYXRhIGNhbiBiZSB0aG91Z2h0IG9mIGFzIHBhaXJzIG9mIHBsYWluIGFuZCBlbmNyeXB0ZWQgZGF0YQorICAgIC8vIGZyYWdtZW50cywgaS5lLiBwbGFpbiBhbmQgZW5jcnlwdGVkIGRhdGEgYWx0ZXJuYXRlLgorICAgIC8vIFRoZSBmaXJzdCBmcmFnbWVudCBpcyBieSBjb252ZW50aW9uIHBsYWluIGRhdGEgKGlmIHRoYXQncyBub3QgdGhlCisgICAgLy8gY2FzZSwgc2ltcGx5IHNwZWNpZnkgcGxhaW4gZnJhZ21lbnQgc2l6ZSBvZiAwKS4KKyAgICAvLyBrS2V5RW5jcnlwdGVkU2l6ZXMgYW5kIGtLZXlQbGFpblNpemVzIGVhY2ggbWFwIHRvIGFuIGFycmF5IG9mCisgICAgLy8gc2l6ZV90IHZhbHVlcy4gVGhlIHN1bSB0b3RhbCBvZiBhbGwgc2l6ZV90IHZhbHVlcyBvZiBib3RoIGFycmF5cworICAgIC8vIG11c3QgZXF1YWwgdGhlIGFtb3VudCBvZiBkYXRhIChpLmUuIE1lZGlhQnVmZmVyJ3MgcmFuZ2VfbGVuZ3RoKCkpLgorICAgIC8vIElmIGJvdGggYXJyYXlzIGFyZSBwcmVzZW50LCB0aGV5IG11c3QgYmUgb2YgdGhlIHNhbWUgc2l6ZS4KKyAgICAvLyBJZiBvbmx5IGVuY3J5cHRlZCBzaXplcyBhcmUgcHJlc2VudCBpdCBpcyBhc3N1bWVkIHRoYXQgYWxsCisgICAgLy8gcGxhaW4gc2l6ZXMgYXJlIDAsIGkuZS4gYWxsIGZyYWdtZW50cyBhcmUgZW5jcnlwdGVkLgorICAgIC8vIFRvIHByb2dyYW1tYXRpY2FsbHkgc2V0IHRoZXNlIGFycmF5LCB1c2UgdGhlIE1ldGFEYXRhQmFzZTo6c2V0RGF0YSBBUEksIGkuZS4KKyAgICAvLyBjb25zdCBzaXplX3QgZW5jU2l6ZXNbXTsKKyAgICAvLyBtZXRhLT5zZXREYXRhKAorICAgIC8vICBrS2V5RW5jcnlwdGVkU2l6ZXMsIDAgLyogdHlwZSAqLywgZW5jU2l6ZXMsIHNpemVvZihlbmNTaXplcykpOworICAgIC8vIEEgcGxhaW4gc2l6ZXMgYXJyYXkgYnkgaXRzZWxmIG1ha2VzIG5vIHNlbnNlLgorICAgIGtLZXlFbmNyeXB0ZWRTaXplcyAgICA9ICdlbmNyJywgIC8vIHNpemVfdFtdCisgICAga0tleVBsYWluU2l6ZXMgICAgICAgID0gJ3BsYWknLCAgLy8gc2l6ZV90W10KKyAgICBrS2V5Q3J5cHRvS2V5ICAgICAgICAgPSAnY3J5SycsICAvLyB1aW50OF90WzE2XQorICAgIGtLZXlDcnlwdG9JViAgICAgICAgICA9ICdjcnlJJywgIC8vIHVpbnQ4X3RbMTZdCisgICAga0tleUNyeXB0b01vZGUgICAgICAgID0gJ2NyeU0nLCAgLy8gaW50MzJfdAorCisgICAga0tleUNyeXB0b0RlZmF1bHRJVlNpemUgPSAnY3J5UycsICAvLyBpbnQzMl90CisKKyAgICBrS2V5UHNzaCAgICAgICAgICAgICAgPSAncHNzaCcsICAvLyByYXcgZGF0YQorICAgIGtLZXlDQVN5c3RlbUlEICAgICAgICA9ICdjYWlkJywgIC8vIGludDMyX3QKKyAgICBrS2V5Q0FTZXNzaW9uSUQgICAgICAgPSAnc2VpZCcsICAvLyByYXcgZGF0YQorICAgIGtLZXlDQVByaXZhdGVEYXRhICAgICA9ICdjYWRjJywgIC8vIHJhdyBkYXRhCisKKyAgICBrS2V5RW5jcnlwdGVkQnl0ZUJsb2NrID0gJ2NibGsnLCAgLy8gdWludDhfdAorICAgIGtLZXlTa2lwQnl0ZUJsb2NrICAgICA9ICdzYmxrJywgIC8vIHVpbnQ4X3QKKworICAgIC8vIFBsZWFzZSBzZWUgTWVkaWFGb3JtYXQuS0VZX0lTX0FVVE9TRUxFQ1QuCisgICAga0tleVRyYWNrSXNBdXRvc2VsZWN0ID0gJ2F1dG8nLCAvLyBib29sIChpbnQzMl90KQorICAgIC8vIFBsZWFzZSBzZWUgTWVkaWFGb3JtYXQuS0VZX0lTX0RFRkFVTFQuCisgICAga0tleVRyYWNrSXNEZWZhdWx0ICAgID0gJ2RmbHQnLCAvLyBib29sIChpbnQzMl90KQorICAgIC8vIFNpbWlsYXIgdG8gTWVkaWFGb3JtYXQuS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSBidXQgcGVydGFpbnMgdG8gYXYgdHJhY2tzIGFzIHdlbGwuCisgICAga0tleVRyYWNrSXNGb3JjZWQgICAgID0gJ2ZyY2QnLCAvLyBib29sIChpbnQzMl90KQorCisgICAgLy8gSDI2NCBzdXBwbGVtZW50YWwgZW5oYW5jZW1lbnQgaW5mb3JtYXRpb24gb2Zmc2V0cy9zaXplcworICAgIGtLZXlTRUkgICAgICAgICAgICAgICA9ICdzZWkgJywgLy8gcmF3IGRhdGEKKworICAgIC8vIE1QRUcgdXNlciBkYXRhIG9mZnNldHMKKyAgICBrS2V5TXBlZ1VzZXJEYXRhICAgICAgPSAnbXB1ZCcsIC8vIHNpemVfdFtdCisKKyAgICAvLyBIRFIgcmVsYXRlZAorICAgIGtLZXlIZHJTdGF0aWNJbmZvICAgID0gJ2hkclMnLCAvLyBIRFJTdGF0aWNJbmZvCisgICAga0tleUhkcjEwUGx1c0luZm8gICAgPSAnaGRyRCcsIC8vIHJhdyBkYXRhCisKKyAgICAvLyBjb2xvciBhc3BlY3RzCisgICAga0tleUNvbG9yUmFuZ2UgICAgICAgPSAnY1JuZycsIC8vIGludDMyX3QsIGNvbG9yIHJhbmdlLCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5SYW5nZQorICAgIGtLZXlDb2xvclByaW1hcmllcyAgID0gJ2NQcm0nLCAvLyBpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xvciBQcmltYXJpZXMsIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLlByaW1hcmllcworICAgIGtLZXlUcmFuc2ZlckZ1bmN0aW9uID0gJ3RGdW4nLCAvLyBpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2ZlciBGdW5jdGlvbiwgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuVHJhbnNmZXIuCisgICAga0tleUNvbG9yTWF0cml4ICAgICAgPSAnY010eCcsIC8vIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbG9yIE1hdHJpeCwgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuTWF0cml4Q29lZmZzLgorICAgIGtLZXlUZW1wb3JhbExheWVySWQgID0gJ2lMeXInLCAvLyBpbnQzMl90LCB0ZW1wb3JhbCBsYXllci1pZC4gMC1iYXNlZCAoMCA9PiBiYXNlIGxheWVyKQorICAgIGtLZXlUZW1wb3JhbExheWVyQ291bnQgPSAnY0x5cicsIC8vIGludDMyX3QsIG51bWJlciBvZiB0ZW1wb3JhbCBsYXllcnMgZW5jb2RlZAorCisgICAga0tleVRpbGVXaWR0aCAgICAgICAgPSAndGlsVycsIC8vIGludDMyX3QsIEhFSUYgdGlsZSB3aWR0aAorICAgIGtLZXlUaWxlSGVpZ2h0ICAgICAgID0gJ3RpbEgnLCAvLyBpbnQzMl90LCBIRUlGIHRpbGUgaGVpZ2h0CisgICAga0tleUdyaWRSb3dzICAgICAgICAgPSAnZ3JkUicsIC8vIGludDMyX3QsIEhFSUYgZ3JpZCByb3dzCisgICAga0tleUdyaWRDb2xzICAgICAgICAgPSAnZ3JkQycsIC8vIGludDMyX3QsIEhFSUYgZ3JpZCBjb2x1bW5zCisgICAga0tleUljY1Byb2ZpbGUgICAgICAgPSAncHJvZicsIC8vIHJhdyBkYXRhLCBJQ0MgcHJvZmlsZSBkYXRhCisgICAga0tleUlzUHJpbWFyeUltYWdlICAgPSAncHJpbScsIC8vIGJvb2wgKGludDMyX3QpLCBpbWFnZSB0cmFjayBpcyB0aGUgcHJpbWFyeSBpbWFnZQorICAgIGtLZXlGcmFtZUNvdW50ICAgICAgID0gJ25mcm0nLCAvLyBpbnQzMl90LCB0b3RhbCBudW1iZXIgb2YgZnJhbWUgaW4gdmlkZW8gdHJhY2sKKyAgICBrS2V5RXhpZk9mZnNldCAgICAgICA9ICdleG9mJywgLy8gaW50NjRfdCwgRXhpZiBkYXRhIG9mZnNldAorICAgIGtLZXlFeGlmU2l6ZSAgICAgICAgID0gJ2V4c3onLCAvLyBpbnQ2NF90LCBFeGlmIGRhdGEgc2l6ZQorICAgIGtLZXlFeGlmVGlmZk9mZnNldCAgID0gJ3RoZHInLCAvLyBpbnQzMl90LCBpZiA+IDAsIGJ1ZmZlciBjb250YWlucyBleGlmIGRhdGEgYmxvY2sgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aWZmIGhkciBhdCBzcGVjaWZpZWQgb2Zmc2V0CisgICAga0tleVBjbUJpZ0VuZGlhbiAgICAgPSAncGNtYicsIC8vIGJvb2wgKGludDMyX3QpCisKKyAgICAvLyBLZXkgZm9yIEFMQUMgTWFnaWMgQ29va2llCisgICAga0tleUFsYWNNYWdpY0Nvb2tpZSAgPSAnYWxtYycsIC8vIHJhdyBkYXRhCisKKyAgICAvLyBBQy00IEF1ZGlvUHJlc2VudGF0aW9uSW5mbworICAgIGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8gPSAnYXVkUCcsICAvLyByYXcgZGF0YQorfTsKKworZW51bSB7CisgICAga1R5cGVFU0RTICAgICAgICA9ICdlc2RzJywKKyAgICBrVHlwZUFWQ0MgICAgICAgID0gJ2F2Y2MnLAorICAgIGtUeXBlSFZDQyAgICAgICAgPSAnaHZjYycsCisgICAga1R5cGVBVjFDICAgICAgICA9ICdhdjFjJywKKyAgICBrVHlwZUQyNjMgICAgICAgID0gJ2QyNjMnLAorfTsKKworZW51bSB7CisgICAga0NyeXB0b01vZGVVbmVuY3J5cHRlZCA9IDAsCisgICAga0NyeXB0b01vZGVBZXNDdHIgICAgICA9IDEsCisgICAga0NyeXB0b01vZGVBZXNDYmMgICAgICA9IDIsCit9OworCitjbGFzcyBQYXJjZWw7CisKK2NsYXNzIE1ldGFEYXRhQmFzZSB7CitwdWJsaWM6CisgICAgTWV0YURhdGFCYXNlKCk7CisgICAgTWV0YURhdGFCYXNlKGNvbnN0IE1ldGFEYXRhQmFzZSAmZnJvbSk7CisgICAgTWV0YURhdGFCYXNlJiBvcGVyYXRvciA9IChjb25zdCBNZXRhRGF0YUJhc2UgJik7CisKKyAgICB2aXJ0dWFsIH5NZXRhRGF0YUJhc2UoKTsKKworICAgIGVudW0gVHlwZSB7CisgICAgICAgIFRZUEVfTk9ORSAgICAgPSAnbm9uZScsCisgICAgICAgIFRZUEVfQ19TVFJJTkcgPSAnY3N0cicsCisgICAgICAgIFRZUEVfSU5UMzIgICAgPSAnaW4zMicsCisgICAgICAgIFRZUEVfSU5UNjQgICAgPSAnaW42NCcsCisgICAgICAgIFRZUEVfRkxPQVQgICAgPSAnZmxvYScsCisgICAgICAgIFRZUEVfUE9JTlRFUiAgPSAncHRyICcsCisgICAgICAgIFRZUEVfUkVDVCAgICAgPSAncmVjdCcsCisgICAgfTsKKworICAgIHZvaWQgY2xlYXIoKTsKKyAgICBib29sIHJlbW92ZSh1aW50MzJfdCBrZXkpOworCisgICAgYm9vbCBzZXRDU3RyaW5nKHVpbnQzMl90IGtleSwgY29uc3QgY2hhciAqdmFsdWUpOworICAgIGJvb2wgc2V0SW50MzIodWludDMyX3Qga2V5LCBpbnQzMl90IHZhbHVlKTsKKyAgICBib29sIHNldEludDY0KHVpbnQzMl90IGtleSwgaW50NjRfdCB2YWx1ZSk7CisgICAgYm9vbCBzZXRGbG9hdCh1aW50MzJfdCBrZXksIGZsb2F0IHZhbHVlKTsKKyAgICBib29sIHNldFBvaW50ZXIodWludDMyX3Qga2V5LCB2b2lkICp2YWx1ZSk7CisKKyAgICBib29sIHNldFJlY3QoCisgICAgICAgICAgICB1aW50MzJfdCBrZXksCisgICAgICAgICAgICBpbnQzMl90IGxlZnQsIGludDMyX3QgdG9wLAorICAgICAgICAgICAgaW50MzJfdCByaWdodCwgaW50MzJfdCBib3R0b20pOworCisgICAgYm9vbCBmaW5kQ1N0cmluZyh1aW50MzJfdCBrZXksIGNvbnN0IGNoYXIgKip2YWx1ZSkgY29uc3Q7CisgICAgYm9vbCBmaW5kSW50MzIodWludDMyX3Qga2V5LCBpbnQzMl90ICp2YWx1ZSkgY29uc3Q7CisgICAgYm9vbCBmaW5kSW50NjQodWludDMyX3Qga2V5LCBpbnQ2NF90ICp2YWx1ZSkgY29uc3Q7CisgICAgYm9vbCBmaW5kRmxvYXQodWludDMyX3Qga2V5LCBmbG9hdCAqdmFsdWUpIGNvbnN0OworICAgIGJvb2wgZmluZFBvaW50ZXIodWludDMyX3Qga2V5LCB2b2lkICoqdmFsdWUpIGNvbnN0OworCisgICAgYm9vbCBmaW5kUmVjdCgKKyAgICAgICAgICAgIHVpbnQzMl90IGtleSwKKyAgICAgICAgICAgIGludDMyX3QgKmxlZnQsIGludDMyX3QgKnRvcCwKKyAgICAgICAgICAgIGludDMyX3QgKnJpZ2h0LCBpbnQzMl90ICpib3R0b20pIGNvbnN0OworCisgICAgYm9vbCBzZXREYXRhKHVpbnQzMl90IGtleSwgdWludDMyX3QgdHlwZSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgYm9vbCBmaW5kRGF0YSh1aW50MzJfdCBrZXksIHVpbnQzMl90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKmRhdGEsIHNpemVfdCAqc2l6ZSkgY29uc3Q7CisKKyAgICBib29sIGhhc0RhdGEodWludDMyX3Qga2V5KSBjb25zdDsKKworICAgIFN0cmluZzggdG9TdHJpbmcoKSBjb25zdDsKKyAgICB2b2lkIGR1bXBUb0xvZygpIGNvbnN0OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBCcE1lZGlhU291cmNlOworICAgIGZyaWVuZCBjbGFzcyBCbk1lZGlhU291cmNlOworICAgIGZyaWVuZCBjbGFzcyBCbk1lZGlhRXh0cmFjdG9yOworICAgIGZyaWVuZCBjbGFzcyBNZXRhRGF0YTsKKworICAgIHN0cnVjdCB0eXBlZF9kYXRhOworICAgIHN0cnVjdCBSZWN0OworICAgIHN0cnVjdCBNZXRhRGF0YUludGVybmFsOworICAgIE1ldGFEYXRhSW50ZXJuYWwgKm1JbnRlcm5hbERhdGE7CisgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgJnBhcmNlbCk7CisgICAgc3RhdHVzX3QgdXBkYXRlRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FVEFfREFUQV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaAppbmRleCBkNWE4MDgwLi5kY2FmMjdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaApAQCAtMjAsMTMgKzIwLDI0IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogCitzdHJ1Y3QgQU1lZGlhRm9ybWF0OworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBQnVmZmVyOwogYm9vbCBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7Citib29sIE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKworYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiBib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCiAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbik7CiAKK2Jvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgdW5zaWduZWQgcHJvZmlsZSwgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwKKyAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uKTsKKwordm9pZCBwYXJzZVZvcmJpc0NvbW1lbnQoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZmlsZU1ldGEsIGNvbnN0IGNoYXIgKmNvbW1lbnQsIHNpemVfdCBjb21tZW50TGVuZ3RoKTsKKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBNRVRBX0RBVEFfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKaW5kZXggNTRhNzA5NS4uZjM0ZjliNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaXN0PgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KQEAgLTY0LDggKzY1LDYgQEAKIAogICAgIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IEhJbnRlcmZhY2VUb2tlbiAmY2FzVG9rZW4pOwogCi0gICAgdm9pZCBkaXNjb25uZWN0KCk7Ci0KICAgICBzaXplX3QgY291bnRUcmFja3MoKSBjb25zdDsKICAgICBzdGF0dXNfdCBnZXRUcmFja0Zvcm1hdChzaXplX3QgaW5kZXgsIHNwPEFNZXNzYWdlPiAqZm9ybWF0LCB1aW50MzJfdCBmbGFncyA9IDApIGNvbnN0OwogCkBAIC05Nyw2ICs5Niw4IEBACiAKICAgICBib29sIGdldENhY2hlZER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMsIGJvb2wgKmVvcykgY29uc3Q7CiAKKyAgICBzdGF0dXNfdCBnZXRBdWRpb1ByZXNlbnRhdGlvbnMoc2l6ZV90IHRyYWNrSWR4LCBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gKnByZXNlbnRhdGlvbnMpOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TnVNZWRpYUV4dHJhY3RvcigpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzgzN2NkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBPR0dfV1JJVEVSX0hfCisKKyNkZWZpbmUgT0dHX1dSSVRFUl9IXworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCitzdHJ1Y3QgT2dnU3RyZWFtU3RhdGU7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE9nZ1dyaXRlciA6IHB1YmxpYyBNZWRpYVdyaXRlciB7CisgICAgT2dnV3JpdGVyKGludCBmZCk7CisKKyAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlKTsKKyAgICB2aXJ0dWFsIGJvb2wgcmVhY2hlZEVPUygpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEqIHBhcmFtcyA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpIHsgcmV0dXJuIHJlc2V0KCk7IH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKK3Byb3RlY3RlZDoKKyAgICB+T2dnV3JpdGVyKCk7CisKK3ByaXZhdGU6CisgICAgaW50IG1GZDsKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOworICAgIGJvb2wgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICB2b2xhdGlsZSBib29sIG1QYXVzZWQgPSBmYWxzZTsKKyAgICB2b2xhdGlsZSBib29sIG1SZXN1bWVkID0gZmFsc2U7CisgICAgdm9sYXRpbGUgYm9vbCBtRG9uZTsKKyAgICB2b2xhdGlsZSBib29sIG1SZWFjaGVkRU9TOworICAgIHB0aHJlYWRfdCBtVGhyZWFkOworICAgIGludDY0X3QgbVNhbXBsZVJhdGU7CisgICAgaW50NjRfdCBtRXN0aW1hdGVkU2l6ZUJ5dGVzOworICAgIGludDY0X3QgbUVzdGltYXRlZER1cmF0aW9uVXM7CisKKyAgICBzdGF0aWMgdm9pZCogVGhyZWFkV3JhcHBlcih2b2lkKik7CisgICAgc3RhdHVzX3QgdGhyZWFkRnVuYygpOworICAgIGJvb2wgZXhjZWVkc0ZpbGVTaXplTGltaXQoKTsKKyAgICBib29sIGV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpOworICAgIHN0YXR1c190IHJlc2V0KCk7CisKKyAgICBpbnQzMl90IG1DdXJyZW50UGFja2V0SWQ7CisgICAgT2dnU3RyZWFtU3RhdGUqIG1PcyA9IG51bGxwdHI7CisKKyAgICBPZ2dXcml0ZXIoY29uc3QgT2dnV3JpdGVyJik7CisgICAgT2dnV3JpdGVyJiBvcGVyYXRvcj0oY29uc3QgT2dnV3JpdGVyJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE9HR19XUklURVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuaAppbmRleCAyOGY2MDk0Li4xNDEwYTE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oCkBAIC0yMyw4ICsyMywxMSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBPbXhJbmZvQnVpbGRlciA6IHB1YmxpYyBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtQWxsb3dTdXJmYWNlRW5jb2RlcnM7IC8vIGFsbG93IHN1cmZhY2UgZW5jb2RlcnMKKwogcHVibGljOgotICAgIE9teEluZm9CdWlsZGVyKCk7CisgICAgZXhwbGljaXQgT214SW5mb0J1aWxkZXIoYm9vbCBhbGxvd1N1cmZhY2VFbmNvZGVycyk7CiAgICAgfk9teEluZm9CdWlsZGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogICAgIHN0YXR1c190IGJ1aWxkTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RXcml0ZXIqIHdyaXRlcikgb3ZlcnJpZGU7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oCmluZGV4IDUwOWU2NjkuLjk5MjUxMTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmgKQEAgLTE4LDcgKzE4LDcgQEAKICNkZWZpbmUgUkVNT1RFX01FRElBX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5oCmluZGV4IDFkNzIwYWYuLjAzZDM4NjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmgKQEAgLTM3LDEyICszNywxMyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKICAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwKICAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RvcFRpbWVVcyhpbnQ2NF90IHN0b3BUaW1lVXMpOwogCiBwcml2YXRlOgogICAgIHNwPFJlbW90ZU1lZGlhRXh0cmFjdG9yPiBtRXh0cmFjdG9yOwotICAgIE1lZGlhVHJhY2sgKm1Tb3VyY2U7CisgICAgTWVkaWFUcmFjayAqbVRyYWNrOwogICAgIHNwPFJlZkJhc2U+IG1FeHRyYWN0b3JQbHVnaW47CiAKICAgICBleHBsaWNpdCBSZW1vdGVNZWRpYVNvdXJjZSgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaAppbmRleCA2YTI4ZTBiLi5lOGUwYTExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCkBAIC0zMCw2ICszMCw4IEBACiAKIHN0cnVjdCBBTWVzc2FnZTsKIHN0YXR1c190IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZSgKKyAgICAgICAgY29uc3QgTWV0YURhdGFCYXNlICptZXRhLCBzcDxBTWVzc2FnZT4gKmZvcm1hdCk7CitzdGF0dXNfdCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoCiAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpOwogdm9pZCBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBzcDxNZXRhRGF0YT4gJm1ldGEpOwpAQCAtNTAsNiArNTIsMTAgQEAKIC8vIFNlbmQgaW5mb3JtYXRpb24gZnJvbSBNZXRhRGF0YSB0byB0aGUgSEFMIHZpYSBBdWRpb1NpbmsKIHN0YXR1c190IHNlbmRNZXRhRGF0YVRvSGFsKHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiYgc2luaywgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKIAorLy8gUmV0dXJuIHxhdWRpb19vZmZsb2FkX2luZm9fdHwgZmlsbGVkIGZyb20gZ2l2ZW4gbWV0YWRhdGEKK3N0YXR1c190IGdldEF1ZGlvT2ZmbG9hZEluZm8oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAorICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsIGF1ZGlvX29mZmxvYWRfaW5mb190ICppbmZvKTsKKwogLy8gQ2hlY2sgd2hldGhlciB0aGUgc3RyZWFtIGRlZmluZWQgYnkgbWV0YSBjYW4gYmUgb2ZmbG9hZGVkIHRvIGhhcmR3YXJlCiBib29sIGNhbk9mZmxvYWRTdHJlYW0oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAogICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCmluZGV4IDlkOTdkZmQuLmZjZmNiZWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTcsODcgKzE3LDI0IEBACiAjaWZuZGVmIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl9IXwogI2RlZmluZSBWSURFT19GUkFNRV9TQ0hFRFVMRVJfSF8KIAotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIElTdXJmYWNlQ29tcG9zZXI7CiAKLXN0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyIDogcHVibGljIFJlZkJhc2Ugeworc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXIgOiBwdWJsaWMgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UgewogICAgIFZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKLQotICAgIC8vIChyZSlpbml0aWFsaXplIHNjaGVkdWxlcgotICAgIHZvaWQgaW5pdChmbG9hdCB2aWRlb0ZwcyA9IC0xKTsKLSAgICAvLyB1c2UgaW4gY2FzZSBvZiB2aWRlbyByZW5kZXItdGltZSBkaXNjb250aW51aXR5LCBlLmcuIHNlZWsKLSAgICB2b2lkIHJlc3RhcnQoKTsKLSAgICAvLyBnZXQgYWRqdXN0ZWQgbmFub3RpbWUgZm9yIGEgdmlkZW8gZnJhbWUgcmVuZGVyIGF0IHJlbmRlclRpbWUKLSAgICBuc2Vjc190IHNjaGVkdWxlKG5zZWNzX3QgcmVuZGVyVGltZSk7Ci0KLSAgICAvLyByZXR1cm5zIHRoZSB2c3luYyBwZXJpb2QgZm9yIHRoZSBtYWluIGRpc3BsYXkKLSAgICBuc2Vjc190IGdldFZzeW5jUGVyaW9kKCk7Ci0KLSAgICAvLyByZXR1cm5zIHRoZSBjdXJyZW50IGZyYW1lcy1wZXItc2Vjb25kLCBvciAwLmYgaWYgbm90IHByaW1lZAotICAgIGZsb2F0IGdldEZyYW1lUmF0ZSgpOwotCi0gICAgdm9pZCByZWxlYXNlKCk7Ci0KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtIaXN0b3J5U2l6ZSA9IDg7CisgICAgdm9pZCByZWxlYXNlKCkgb3ZlcnJpZGU7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5WaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CiAKIHByaXZhdGU6Ci0gICAgc3RydWN0IFBMTCB7Ci0gICAgICAgIFBMTCgpOwotCi0gICAgICAgIC8vIHJlc2V0IFBMTCB0byBuZXcgUExMCi0gICAgICAgIHZvaWQgcmVzZXQoZmxvYXQgZnBzID0gLTEpOwotICAgICAgICAvLyBrZWVwIGN1cnJlbnQgZXN0aW1hdGUsIGJ1dCByZXN0YXJ0IHBoYXNlCi0gICAgICAgIHZvaWQgcmVzdGFydCgpOwotICAgICAgICAvLyByZXR1cm5zIHBlcmlvZCBvciAwIGlmIG5vdCB5ZXQgcHJpbWVkCi0gICAgICAgIG5zZWNzX3QgYWRkU2FtcGxlKG5zZWNzX3QgdGltZSk7Ci0gICAgICAgIG5zZWNzX3QgZ2V0UGVyaW9kKCkgY29uc3Q7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBuc2Vjc190IG1QZXJpb2Q7Ci0gICAgICAgIG5zZWNzX3QgbVBoYXNlOwotCi0gICAgICAgIGJvb2wgICAgbVByaW1lZDsgICAgICAgIC8vIGhhdmUgYW4gZXN0aW1hdGUgZm9yIHRoZSBwZXJpb2QKLSAgICAgICAgc2l6ZV90ICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nOwotCi0gICAgICAgIG5zZWNzX3QgbUxhc3RUaW1lOyAgICAgIC8vIGxhc3QgaW5wdXQgdGltZQotICAgICAgICBuc2Vjc190IG1SZWZpdEF0OyAgICAgICAvLyBuZXh0IGlucHV0IHRpbWUgdG8gZml0IGF0Ci0KLSAgICAgICAgc2l6ZV90ICBtTnVtU2FtcGxlczsgICAgLy8gY2FuIGdvIHBhc3Qga0hpc3RvcnlTaXplCi0gICAgICAgIG5zZWNzX3QgbVRpbWVzW2tIaXN0b3J5U2l6ZV07Ci0KLSAgICAgICAgdm9pZCB0ZXN0KCk7Ci0gICAgICAgIC8vIHJldHVybnMgd2hldGhlciBmaXQgd2FzIHN1Y2Nlc3NmdWwKLSAgICAgICAgYm9vbCBmaXQobnNlY3NfdCBwaGFzZSwgbnNlY3NfdCBwZXJpb2QsIHNpemVfdCBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgIGludDY0X3QgKmEsIGludDY0X3QgKmIsIGludDY0X3QgKmVycik7Ci0gICAgICAgIHZvaWQgcHJpbWUoc2l6ZV90IG51bVNhbXBsZXMpOwotICAgIH07Ci0KLSAgICB2b2lkIHVwZGF0ZVZzeW5jKCk7Ci0KLSAgICBuc2Vjc190IG1Wc3luY1RpbWU7ICAgICAgICAvLyB2c3luYyB0aW1pbmcgZnJvbSBkaXNwbGF5Ci0gICAgbnNlY3NfdCBtVnN5bmNQZXJpb2Q7Ci0gICAgbnNlY3NfdCBtVnN5bmNSZWZyZXNoQXQ7ICAgLy8gbmV4dCB0aW1lIHRvIHJlZnJlc2ggdGltaW5nIGluZm8KLQotICAgIG5zZWNzX3QgbUxhc3RWc3luY1RpbWU7ICAgIC8vIGVzdGltYXRlZCB2c3luYyB0aW1lIGZvciBsYXN0IGZyYW1lCi0gICAgbnNlY3NfdCBtVGltZUNvcnJlY3Rpb247ICAgLy8gcnVubmluZyBhZGp1c3RtZW50Ci0KLSAgICBQTEwgbVBsbDsgICAgICAgICAgICAgICAgICAvLyBQTEwgZm9yIHZpZGVvIGZyYW1lIHJhdGUgYmFzZWQgb24gcmVuZGVyIHRpbWUKLQorICAgIHZvaWQgdXBkYXRlVnN5bmMoKSBvdmVycmlkZTsKICAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBtQ29tcG9zZXI7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhWaWRlb0ZyYW1lU2NoZWR1bGVyKTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gVklERU9fRlJBTUVfU0NIRURVTEVSX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlcjIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlcjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTFiOWEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVklERU9fRlJBTUVfU0NIRURVTEVSXzJfSF8KKyNkZWZpbmUgVklERU9fRlJBTUVfU0NIRURVTEVSXzJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgVnN5bmNUcmFja2VyOworc3RydWN0IENob3Jlb2dyYXBoZXJUaHJlYWQ7CisKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyMiA6IHB1YmxpYyBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSB7CisgICAgVmlkZW9GcmFtZVNjaGVkdWxlcjIoKTsKKyAgICB2b2lkIHJlbGVhc2UoKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflZpZGVvRnJhbWVTY2hlZHVsZXIyKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCB1cGRhdGVWc3luYygpIG92ZXJyaWRlOworCisgICAgbnNlY3NfdCBtQXBwVnN5bmNPZmZzZXQ7CisgICAgbnNlY3NfdCBtU2ZWc3luY09mZnNldDsKKyAgICBzcDxWc3luY1RyYWNrZXI+IG1Wc3luY1RyYWNrZXI7CisgICAgc3A8Q2hvcmVvZ3JhcGhlclRocmVhZD4gbUNob3Jlb2dyYXBoZXJUaHJlYWQ7CisgICAgTXV0ZXggbUxvY2s7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl8yX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1ZjcxNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBWSURFT19GUkFNRV9TQ0hFRFVMRVJfQkFTRV9IXworI2RlZmluZSBWSURFT19GUkFNRV9TQ0hFRFVMRVJfQkFTRV9IXworCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSgpOworCisgICAgLy8gKHJlKWluaXRpYWxpemUgc2NoZWR1bGVyCisgICAgdm9pZCBpbml0KGZsb2F0IHZpZGVvRnBzID0gLTEpOworICAgIC8vIHVzZSBpbiBjYXNlIG9mIHZpZGVvIHJlbmRlci10aW1lIGRpc2NvbnRpbnVpdHksIGUuZy4gc2VlaworICAgIHZvaWQgcmVzdGFydCgpOworICAgIC8vIGdldCBhZGp1c3RlZCBuYW5vdGltZSBmb3IgYSB2aWRlbyBmcmFtZSByZW5kZXIgYXQgcmVuZGVyVGltZQorICAgIG5zZWNzX3Qgc2NoZWR1bGUobnNlY3NfdCByZW5kZXJUaW1lKTsKKworICAgIC8vIHJldHVybnMgdGhlIHZzeW5jIHBlcmlvZCBmb3IgdGhlIG1haW4gZGlzcGxheQorICAgIG5zZWNzX3QgZ2V0VnN5bmNQZXJpb2QoKTsKKworICAgIC8vIHJldHVybnMgdGhlIGN1cnJlbnQgZnJhbWVzLXBlci1zZWNvbmQsIG9yIDAuZiBpZiBub3QgcHJpbWVkCisgICAgZmxvYXQgZ2V0RnJhbWVSYXRlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpID0gMDsKKworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0hpc3RvcnlTaXplID0gODsKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrTmFub3NJbjFzID0gMTAwMDAwMDAwMDsKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrRGVmYXVsdFZzeW5jUGVyaW9kID0ga05hbm9zSW4xcyAvIDYwOyAgLy8gNjBIegorICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtWc3luY1JlZnJlc2hQZXJpb2QgPSBrTmFub3NJbjFzOyAgICAgICAvLyAxIHNlYworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VmlkZW9GcmFtZVNjaGVkdWxlckJhc2UoKTsKKworICAgIG5zZWNzX3QgbVZzeW5jVGltZTsgICAgICAgIC8vIHZzeW5jIHRpbWluZyBmcm9tIGRpc3BsYXkKKyAgICBuc2Vjc190IG1Wc3luY1BlcmlvZDsKKyAgICBuc2Vjc190IG1Wc3luY1JlZnJlc2hBdDsgICAvLyBuZXh0IHRpbWUgdG8gcmVmcmVzaCB0aW1pbmcgaW5mbworCitwcml2YXRlOgorICAgIHN0cnVjdCBQTEwgeworICAgICAgICBQTEwoKTsKKworICAgICAgICAvLyByZXNldCBQTEwgdG8gbmV3IFBMTAorICAgICAgICB2b2lkIHJlc2V0KGZsb2F0IGZwcyA9IC0xKTsKKyAgICAgICAgLy8ga2VlcCBjdXJyZW50IGVzdGltYXRlLCBidXQgcmVzdGFydCBwaGFzZQorICAgICAgICB2b2lkIHJlc3RhcnQoKTsKKyAgICAgICAgLy8gcmV0dXJucyBwZXJpb2Qgb3IgMCBpZiBub3QgeWV0IHByaW1lZAorICAgICAgICBuc2Vjc190IGFkZFNhbXBsZShuc2Vjc190IHRpbWUpOworICAgICAgICBuc2Vjc190IGdldFBlcmlvZCgpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgbnNlY3NfdCBtUGVyaW9kOworICAgICAgICBuc2Vjc190IG1QaGFzZTsKKworICAgICAgICBib29sICAgIG1QcmltZWQ7ICAgICAgICAvLyBoYXZlIGFuIGVzdGltYXRlIGZvciB0aGUgcGVyaW9kCisgICAgICAgIHNpemVfdCAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZzsKKworICAgICAgICBuc2Vjc190IG1MYXN0VGltZTsgICAgICAvLyBsYXN0IGlucHV0IHRpbWUKKyAgICAgICAgbnNlY3NfdCBtUmVmaXRBdDsgICAgICAgLy8gbmV4dCBpbnB1dCB0aW1lIHRvIGZpdCBhdAorCisgICAgICAgIHNpemVfdCAgbU51bVNhbXBsZXM7ICAgIC8vIGNhbiBnbyBwYXN0IGtIaXN0b3J5U2l6ZQorICAgICAgICBuc2Vjc190IG1UaW1lc1trSGlzdG9yeVNpemVdOworCisgICAgICAgIHZvaWQgdGVzdCgpOworICAgICAgICAvLyByZXR1cm5zIHdoZXRoZXIgZml0IHdhcyBzdWNjZXNzZnVsCisgICAgICAgIGJvb2wgZml0KG5zZWNzX3QgcGhhc2UsIG5zZWNzX3QgcGVyaW9kLCBzaXplX3QgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICBpbnQ2NF90ICphLCBpbnQ2NF90ICpiLCBpbnQ2NF90ICplcnIpOworICAgICAgICB2b2lkIHByaW1lKHNpemVfdCBudW1TYW1wbGVzKTsKKyAgICB9OworCisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVZzeW5jKCkgPSAwOworCisgICAgbnNlY3NfdCBtTGFzdFZzeW5jVGltZTsgICAgLy8gZXN0aW1hdGVkIHZzeW5jIHRpbWUgZm9yIGxhc3QgZnJhbWUKKyAgICBuc2Vjc190IG1UaW1lQ29ycmVjdGlvbjsgICAvLyBydW5uaW5nIGFkanVzdG1lbnQKKyAgICBQTEwgbVBsbDsgICAgICAgICAgICAgICAgICAvLyBQTEwgZm9yIHZpZGVvIGZyYW1lIHJhdGUgYmFzZWQgb24gcmVuZGVyIHRpbWUKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gVklERU9fRlJBTUVfU0NIRURVTEVSX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAppbmRleCA3NDUyOTAxLi4xNDgyMDcyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCkBAIC0yMywxMCArMjMsMTAgQEAKICNpbmNsdWRlICJFU1F1ZXVlLmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9hbGxvY2F0b3IvMS4wL0lBbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLSNpbmNsdWRlIDxoaWRsbWVtb3J5L0ZyYW1ld29ya1V0aWxzLmg+CisjaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bWVkaWEvY2FzL0Rlc2NyYW1ibGVyQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC00NiwxMiArNDYsMTMgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci11c2luZyBoYXJkd2FyZTo6ZnJvbUhlYXA7CiB1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CiB1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyBoYXJkd2FyZTo6SGlkbE1lbW9yeTsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX21lbW9yeTsKIHVzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpWMV8wOwogdXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDsKK3R5cGVkZWYgaGlkbDo6YWxsb2NhdG9yOjpWMV8wOjpJQWxsb2NhdG9yIFRBbGxvY2F0b3I7Cit0eXBlZGVmIGhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeSBUTWVtb3J5OwogCiAvLyBJIHdhbnQgdGhlIGV4cHJlc3Npb24gInkiIGV2YWx1YXRlZCBldmVuIGlmIHZlcmJvc2UgbG9nZ2luZyBpcyBvZmYuCiAjZGVmaW5lIE1ZX0xPR1YoeCwgeSkgXApAQCAtMTE3LDE1ICsxMTgsMTIgQEAKICAgICB2b2lkIHNpZ25hbE5ld1NhbXBsZUFlc0tleShjb25zdCBzcDxBTWVzc2FnZT4gJmtleUl0ZW0pOwogCiBwcml2YXRlOgotICAgIHN0cnVjdCBTdHJlYW1JbmZvIHsKLSAgICAgICAgdW5zaWduZWQgbVR5cGU7Ci0gICAgICAgIHVuc2lnbmVkIG1QSUQ7Ci0gICAgICAgIGludDMyX3QgbUNBU3lzdGVtSWQ7Ci0gICAgfTsKIAogICAgIEFUU1BhcnNlciAqbVBhcnNlcjsKICAgICB1bnNpZ25lZCBtUHJvZ3JhbU51bWJlcjsKICAgICB1bnNpZ25lZCBtUHJvZ3JhbU1hcFBJRDsKKyAgICB1aW50MzJfdCBtUE1UVmVyc2lvbjsKKyAgICB1aW50MzJfdCBtUE1UX0NSQzsKICAgICBLZXllZFZlY3Rvcjx1bnNpZ25lZCwgc3A8U3RyZWFtPiA+IG1TdHJlYW1zOwogICAgIGJvb2wgbUZpcnN0UFRTVmFsaWQ7CiAgICAgdWludDY0X3QgbUZpcnN0UFRTOwpAQCAtMTQyLDE1ICsxNDAsMTUgQEAKIH07CiAKIHN0cnVjdCBBVFNQYXJzZXI6OlN0cmVhbSA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBTdHJlYW0oUHJvZ3JhbSAqcHJvZ3JhbSwKLSAgICAgICAgICAgdW5zaWduZWQgZWxlbWVudGFyeVBJRCwKLSAgICAgICAgICAgdW5zaWduZWQgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgdW5zaWduZWQgUENSX1BJRCwKLSAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1fSUQpOworICAgIFN0cmVhbShQcm9ncmFtICpwcm9ncmFtLCB1bnNpZ25lZCBQQ1JfUElELCBjb25zdCBTdHJlYW1JbmZvICZpbmZvKTsKIAogICAgIHVuc2lnbmVkIHR5cGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZTsgfQorICAgIHVuc2lnbmVkIHR5cGVFeHQoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZUV4dDsgfQogICAgIHVuc2lnbmVkIHBpZCgpIGNvbnN0IHsgcmV0dXJuIG1FbGVtZW50YXJ5UElEOyB9CiAgICAgdm9pZCBzZXRQSUQodW5zaWduZWQgcGlkKSB7IG1FbGVtZW50YXJ5UElEID0gcGlkOyB9CisgICAgdm9pZCBzZXRBdWRpb1ByZXNlbnRhdGlvbnMoQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uIGF1ZGlvUHJlc2VudGF0aW9ucykgeworICAgICAgICBtQXVkaW9QcmVzZW50YXRpb25zID0gYXVkaW9QcmVzZW50YXRpb25zOworICAgIH0KIAogICAgIHZvaWQgc2V0Q2FzSW5mbygKICAgICAgICAgICAgIGludDMyX3Qgc3lzdGVtSWQsCkBAIC0xOTQsNiArMTkyLDcgQEAKICAgICBQcm9ncmFtICptUHJvZ3JhbTsKICAgICB1bnNpZ25lZCBtRWxlbWVudGFyeVBJRDsKICAgICB1bnNpZ25lZCBtU3RyZWFtVHlwZTsKKyAgICB1bnNpZ25lZCBtU3RyZWFtVHlwZUV4dDsKICAgICB1bnNpZ25lZCBtUENSX1BJRDsKICAgICBpbnQzMl90IG1FeHBlY3RlZENvbnRpbnVpdHlDb3VudGVyOwogCkBAIC0yMTAsMTMgKzIwOSwxNiBAQAogICAgIGJvb2wgbVNjcmFtYmxlZDsKICAgICBib29sIG1TYW1wbGVFbmNyeXB0ZWQ7CiAgICAgc3A8QU1lc3NhZ2U+IG1TYW1wbGVBZXNLZXlJdGVtOwotICAgIHNwPElNZW1vcnk+IG1NZW07Ci0gICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyOwotICAgIHNwPEhpZGxNZW1vcnk+IG1IaWRsTWVtb3J5OworICAgIHNwPFRNZW1vcnk+IG1IaWRsTWVtb3J5OworICAgIHNwPFRBbGxvY2F0b3I+IG1IaWRsQWxsb2NhdG9yOwogICAgIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U2hhcmVkQnVmZmVyIG1EZXNjcmFtYmxlclNyY0J1ZmZlcjsKICAgICBzcDxBQnVmZmVyPiBtRGVzY3JhbWJsZWRCdWZmZXI7CiAgICAgTGlzdDxTdWJTYW1wbGVJbmZvPiBtU3ViU2FtcGxlczsKICAgICBzcDxJRGVzY3JhbWJsZXI+IG1EZXNjcmFtYmxlcjsKKyAgICBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gbUF1ZGlvUHJlc2VudGF0aW9uczsKKworICAgIC8vIFNlbmQgYXVkaW8gcHJlc2VudGF0aW9ucyBhbG9uZyB3aXRoIGFjY2VzcyB1bml0cy4KKyAgICB2b2lkIGFkZEF1ZGlvUHJlc2VudGF0aW9ucyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKIAogICAgIC8vIEZsdXNoIGFjY3VtdWxhdGVkIHBheWxvYWQgaWYgbmVjZXNzYXJ5IC0tLSBpLmUuIGF0IEVPUyBvciBhdCB0aGUgc3RhcnQgb2YKICAgICAvLyBhbm90aGVyIHBheWxvYWQuIGV2ZW50IGlzIHNldCBpZiB0aGUgZmx1c2hlZCBwYXlsb2FkIGlzIFBFUyB3aXRoIGEgc3luYwpAQCAtMjk5LDYgKzMwMSw4IEBACiAgICAgOiBtUGFyc2VyKHBhcnNlciksCiAgICAgICBtUHJvZ3JhbU51bWJlcihwcm9ncmFtTnVtYmVyKSwKICAgICAgIG1Qcm9ncmFtTWFwUElEKHByb2dyYW1NYXBQSUQpLAorICAgICAgbVBNVFZlcnNpb24oMHhmZmZmZmZmZiksCisgICAgICBtUE1UX0NSQygweGZmZmZmZmZmKSwKICAgICAgIG1GaXJzdFBUU1ZhbGlkKGZhbHNlKSwKICAgICAgIG1GaXJzdFBUUygwKSwKICAgICAgIG1MYXN0UmVjb3ZlcmVkUFRTKGxhc3RSZWNvdmVyZWRQVFMpIHsKQEAgLTQ0Nyw3ICs0NTEsNyBAQAogICAgICAgICBpZiAoZGVzY3JpcHRvcl9sZW5ndGggPiBpbmZvTGVuZ3RoKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAoZGVzY3JpcHRvcl90YWcgPT0gOSAmJiBkZXNjcmlwdG9yX2xlbmd0aCA+PSA0KSB7CisgICAgICAgIGlmIChkZXNjcmlwdG9yX3RhZyA9PSBERVNDUklQVE9SX0NBICYmIGRlc2NyaXB0b3JfbGVuZ3RoID49IDQpIHsKICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgIGNhRGVzY3JpcHRvci0+bVN5c3RlbUlEID0gYnItPmdldEJpdHMoMTYpOwogICAgICAgICAgICAgY2FEZXNjcmlwdG9yLT5tUElEID0gYnItPmdldEJpdHMoMTYpICYgMHgxZmZmOwpAQCAtNDg2LDcgKzQ5MCwxMyBAQAogCiAgICAgTVlfTE9HVigiICBwcm9ncmFtX251bWJlciA9ICV1IiwgYnItPmdldEJpdHMoMTYpKTsKICAgICBNWV9MT0dWKCIgIHJlc2VydmVkID0gJXUiLCBici0+Z2V0Qml0cygyKSk7Ci0gICAgTVlfTE9HVigiICB2ZXJzaW9uX251bWJlciA9ICV1IiwgYnItPmdldEJpdHMoNSkpOworICAgIGJvb2wgYXVkaW9QcmVzZW50YXRpb25zQ2hhbmdlZCA9IGZhbHNlOworICAgIHVuc2lnbmVkIHBtdFZlcnNpb24gPSBici0+Z2V0Qml0cyg1KTsKKyAgICBpZiAocG10VmVyc2lvbiAhPSBtUE1UVmVyc2lvbikgeworICAgICAgICBhdWRpb1ByZXNlbnRhdGlvbnNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgbVBNVFZlcnNpb24gPSBwbXRWZXJzaW9uOworICAgIH0KKyAgICBNWV9MT0dWKCIgIHZlcnNpb25fbnVtYmVyID0gJXUiLCBwbXRWZXJzaW9uKTsKICAgICBNWV9MT0dWKCIgIGN1cnJlbnRfbmV4dF9pbmRpY2F0b3IgPSAldSIsIGJyLT5nZXRCaXRzKDEpKTsKICAgICBNWV9MT0dWKCIgIHNlY3Rpb25fbnVtYmVyID0gJXUiLCBici0+Z2V0Qml0cyg4KSk7CiAgICAgTVlfTE9HVigiICBsYXN0X3NlY3Rpb25fbnVtYmVyID0gJXUiLCBici0+Z2V0Qml0cyg4KSk7CkBAIC01MTMsNDMgKzUyMywxNjYgQEAKICAgICAvLyBpbmZvQnl0ZXNSZW1haW5pbmcgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IG1ha2UgdXAgdGhlCiAgICAgLy8gdmFyaWFibGUgbGVuZ3RoIHNlY3Rpb24gb2YgRVNfaW5mb3MuIEl0IGRvZXMgbm90IGluY2x1ZGUgdGhlCiAgICAgLy8gZmluYWwgQ1JDLgotICAgIHNpemVfdCBpbmZvQnl0ZXNSZW1haW5pbmcgPSBzZWN0aW9uX2xlbmd0aCAtIDkgLSBwcm9ncmFtX2luZm9fbGVuZ3RoIC0gNDsKKyAgICBpbnQzMl90IGluZm9CeXRlc1JlbWFpbmluZyA9IHNlY3Rpb25fbGVuZ3RoIC0gOSAtIHByb2dyYW1faW5mb19sZW5ndGggLSA0OwogCiAgICAgd2hpbGUgKGluZm9CeXRlc1JlbWFpbmluZyA+PSA1KSB7Ci0KLSAgICAgICAgdW5zaWduZWQgc3RyZWFtVHlwZSA9IGJyLT5nZXRCaXRzKDgpOwotICAgICAgICBBTE9HVigiICAgIHN0cmVhbV90eXBlID0gMHglMDJ4Iiwgc3RyZWFtVHlwZSk7Ci0KKyAgICAgICAgU3RyZWFtSW5mbyBpbmZvOworICAgICAgICBpbmZvLm1UeXBlID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgIEFMT0dWKCIgICAgc3RyZWFtX3R5cGUgPSAweCUwMngiLCBpbmZvLm1UeXBlKTsKICAgICAgICAgTVlfTE9HVigiICAgIHJlc2VydmVkID0gJXUiLCBici0+Z2V0Qml0cygzKSk7CiAKLSAgICAgICAgdW5zaWduZWQgZWxlbWVudGFyeVBJRCA9IGJyLT5nZXRCaXRzKDEzKTsKLSAgICAgICAgQUxPR1YoIiAgICBlbGVtZW50YXJ5X1BJRCA9IDB4JTA0eCIsIGVsZW1lbnRhcnlQSUQpOworICAgICAgICBpbmZvLm1QSUQgPSBici0+Z2V0Qml0cygxMyk7CisgICAgICAgIEFMT0dWKCIgICAgZWxlbWVudGFyeV9QSUQgPSAweCUwNHgiLCBpbmZvLm1QSUQpOwogCiAgICAgICAgIE1ZX0xPR1YoIiAgICByZXNlcnZlZCA9ICV1IiwgYnItPmdldEJpdHMoNCkpOwogCiAgICAgICAgIHVuc2lnbmVkIEVTX2luZm9fbGVuZ3RoID0gYnItPmdldEJpdHMoMTIpOwogICAgICAgICBBTE9HVigiICAgIEVTX2luZm9fbGVuZ3RoID0gJXUiLCBFU19pbmZvX2xlbmd0aCk7CisgICAgICAgIGluZm9CeXRlc1JlbWFpbmluZyAtPSA1ICsgRVNfaW5mb19sZW5ndGg7CiAKICAgICAgICAgQ0FEZXNjcmlwdG9yIHN0cmVhbUNBOwotICAgICAgICBib29sIGhhc1N0cmVhbUNBID0gZmluZENBRGVzY3JpcHRvcihiciwgRVNfaW5mb19sZW5ndGgsICZzdHJlYW1DQSk7CisgICAgICAgIGluZm8ubVR5cGVFeHQgPSBFWFRfREVTQ1JJUFRPUl9EVkJfUkVTRVJWRURfTUFYOworCisgICAgICAgIGluZm8ubUF1ZGlvUHJlc2VudGF0aW9ucy5jbGVhcigpOworICAgICAgICBib29sIGhhc1N0cmVhbUNBID0gZmFsc2U7CisgICAgICAgIHdoaWxlIChFU19pbmZvX2xlbmd0aCA+IDIgJiYgaW5mb0J5dGVzUmVtYWluaW5nID49IDApIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGRlc2NyaXB0b3JfdGFnID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICBBTE9HVigiICAgICAgdGFnID0gMHglMDJ4IiwgZGVzY3JpcHRvcl90YWcpOworCisgICAgICAgICAgICB1bnNpZ25lZCBkZXNjcmlwdG9yX2xlbmd0aCA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgQUxPR1YoIiAgICAgIGxlbiA9ICV1IiwgZGVzY3JpcHRvcl9sZW5ndGgpOworCisgICAgICAgICAgICBFU19pbmZvX2xlbmd0aCAtPSAyOworICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JfbGVuZ3RoID4gRVNfaW5mb19sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JfdGFnID09IERFU0NSSVBUT1JfQ0EgJiYgZGVzY3JpcHRvcl9sZW5ndGggPj0gNCkgeworICAgICAgICAgICAgICAgIGhhc1N0cmVhbUNBID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzdHJlYW1DQS5tU3lzdGVtSUQgPSBici0+Z2V0Qml0cygxNik7CisgICAgICAgICAgICAgICAgc3RyZWFtQ0EubVBJRCA9IGJyLT5nZXRCaXRzKDE2KSAmIDB4MWZmZjsKKyAgICAgICAgICAgICAgICBFU19pbmZvX2xlbmd0aCAtPSBkZXNjcmlwdG9yX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX2xlbmd0aCAtPSA0OworICAgICAgICAgICAgICAgIHN0cmVhbUNBLm1Qcml2YXRlRGF0YS5hc3NpZ24oYnItPmRhdGEoKSwgYnItPmRhdGEoKSArIGRlc2NyaXB0b3JfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoZGVzY3JpcHRvcl9sZW5ndGggKiA4KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5mby5tVHlwZSA9PSBTVFJFQU1UWVBFX1BFU19QUklWQVRFX0RBVEEgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl90YWcgPT0gREVTQ1JJUFRPUl9EVkJfRVhURU5TSU9OICYmIGRlc2NyaXB0b3JfbGVuZ3RoID49IDEpIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBkZXNjVGFnRXh0ID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiAgICAgIHRhZ19leHQgPSAweCUwMngiLCBkZXNjVGFnRXh0KTsKKyAgICAgICAgICAgICAgICBFU19pbmZvX2xlbmd0aCAtPSBkZXNjcmlwdG9yX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX2xlbmd0aC0tOworICAgICAgICAgICAgICAgIC8vIFRoZSBBQzQgZGVzY3JpcHRvciBpcyB1c2VkIGluIHRoZSBQU0kgUE1UIHRvIGlkZW50aWZ5IHN0cmVhbXMgd2hpY2ggY2FycnkgQUM0CisgICAgICAgICAgICAgICAgLy8gYXVkaW8uCisgICAgICAgICAgICAgICAgaWYgKGRlc2NUYWdFeHQgPT0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNCkgeworICAgICAgICAgICAgICAgICAgICBpbmZvLm1UeXBlRXh0ID0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNDsKKyAgICAgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKGRlc2NyaXB0b3JfbGVuZ3RoICogOCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXNjVGFnRXh0ID09IEVYVF9ERVNDUklQVE9SX0RWQl9BVURJT19QUkVTRUxFQ1RJT04gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfbGVuZ3RoID49IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRFZCIEJsdWVCb29rIEEwMzggVGFibGUgMTEwCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV9wcmVzZWxlY3Rpb25zID0gYnItPmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cygzKTsgIC8vIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1fcHJlc2VsZWN0aW9uczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCAxNikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUHJlc2VudGF0aW9uVjEgYXA7CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tUHJlc2VudGF0aW9uSWQgPSBici0+Z2V0Qml0cyg1KTsgIC8vIHByZXNlbGVjdGlvbl9pZAorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdWRpb19yZW5kZXJpbmdfaW5kaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgYXAubU1hc3RlcmluZ0luZGljYXRpb24gPSBzdGF0aWNfY2FzdDxNYXN0ZXJpbmdJbmRpY2F0aW9uPihici0+Z2V0Qml0cygzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUgPSAoYnItPmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbnRlcmFjdGl2aXR5X2VuYWJsZWQgPSAoYnItPmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBNWV9MT0dWKCIgICAgICBpbnRlcmFjdGl2aXR5X2VuYWJsZWQgPSAlZCIsIGludGVyYWN0aXZpdHlfZW5hYmxlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGFuZ3VhZ2VfY29kZV9wcmVzZW50ID0gKGJyLT5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0ZXh0X2xhYmVsX3ByZXNlbnQgPSAoYnItPmdldEJpdHMoMSkgPT0gMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbXVsdGlfc3RyZWFtX2luZm9fcHJlc2VudCA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnV0dXJlX2V4dGVuc2lvbiA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYW5ndWFnZV9jb2RlX3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCAyNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBkYXRhIGxlZnQgaW4gYml0cmVhZGVyISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGxhbmd1YWdlWzRdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlWzBdID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VbMV0gPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVsyXSA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlWzNdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcC5tTGFuZ3VhZ2UgPSBTdHJpbmc4KGxhbmd1YWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBtYXBzIHRoZSBwcmVzZW50YXRpb24gaWQgdG8gdGhlIG1lc3NhZ2UgaWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFWFRfREVTQ1JJUFRPUl9EVkJfTUVTU0FHRSBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIHByZXNlbnRhdGlvbiBsYWJlbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0X2xhYmVsX3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1lc3NhZ2VfaWQgPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNWV9MT0dWKCIgICAgICBtZXNzYWdlX2lkID0gJXUiLCBtZXNzYWdlX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11bHRpX3N0cmVhbV9pbmZvX3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV9hdXhfY29tcG9uZW50cyA9IGJyLT5nZXRCaXRzKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cyg1KTsgIC8vIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpIDwgKG51bV9hdXhfY29tcG9uZW50cyAqIDgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cyhudW1fYXV4X2NvbXBvbmVudHMgKiA4KTsgIC8vIGNvbXBvbmVudF90YWcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdXR1cmVfZXh0ZW5zaW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpIDwgOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoMyk7ICAvLyByZXNlcnZlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZ1dHVyZV9leHRlbnNpb25fbGVuZ3RoID0gYnItPmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpIDwgKGZ1dHVyZV9leHRlbnNpb25fbGVuZ3RoICogOCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggZGF0YSBsZWZ0IGluIGJpdHJlYWRlciEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKGZ1dHVyZV9leHRlbnNpb25fbGVuZ3RoICogOCk7ICAvLyBmdXR1cmVfZXh0ZW5zaW9uX2J5dGUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubUF1ZGlvUHJlc2VudGF0aW9ucy5wdXNoX2JhY2soc3RkOjptb3ZlKGFwKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoZGVzY3JpcHRvcl9sZW5ndGggKiA4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEVTX2luZm9fbGVuZ3RoIC09IGRlc2NyaXB0b3JfbGVuZ3RoOworICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cyhkZXNjcmlwdG9yX2xlbmd0aCAqIDgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGlmIChoYXNTdHJlYW1DQSAmJiAhbVBhcnNlci0+bUNhc01hbmFnZXItPmFkZFN0cmVhbSgKLSAgICAgICAgICAgICAgICBtUHJvZ3JhbU51bWJlciwgZWxlbWVudGFyeVBJRCwgc3RyZWFtQ0EpKSB7CisgICAgICAgICAgICAgICAgbVByb2dyYW1OdW1iZXIsIGluZm8ubVBJRCwgc3RyZWFtQ0EpKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9Ci0gICAgICAgIFN0cmVhbUluZm8gaW5mbzsKLSAgICAgICAgaW5mby5tVHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgICAgIGluZm8ubVBJRCA9IGVsZW1lbnRhcnlQSUQ7Ci0gICAgICAgIGluZm8ubUNBU3lzdGVtSWQgPSBoYXNQcm9ncmFtQ0EgPyBwcm9ncmFtQ0EubVN5c3RlbUlEIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1N0cmVhbUNBID8gc3RyZWFtQ0EubVN5c3RlbUlEICA6IC0xOwotICAgICAgICBpbmZvcy5wdXNoKGluZm8pOworICAgICAgICBpZiAoaGFzUHJvZ3JhbUNBKSB7CisgICAgICAgICAgICBpbmZvLm1DQURlc2NyaXB0b3IgPSBwcm9ncmFtQ0E7CisgICAgICAgIH0gZWxzZSBpZiAoaGFzU3RyZWFtQ0EpIHsKKyAgICAgICAgICAgIGluZm8ubUNBRGVzY3JpcHRvciA9IHN0cmVhbUNBOworICAgICAgICB9CiAKLSAgICAgICAgaW5mb0J5dGVzUmVtYWluaW5nIC09IDUgKyBFU19pbmZvX2xlbmd0aDsKKyAgICAgICAgaW5mb3MucHVzaChpbmZvKTsKICAgICB9CiAKICAgICBpZiAoaW5mb0J5dGVzUmVtYWluaW5nICE9IDApIHsKICAgICAgICAgQUxPR1coIlNlY3Rpb24gZGF0YSByZW1haW5zIHVuY29uc3VtZWQiKTsKICAgICB9Ci0gICAgTVlfTE9HVigiICBDUkMgPSAweCUwOHgiLCBici0+Z2V0Qml0cygzMikpOworICAgIHVuc2lnbmVkIGNyYyA9IGJyLT5nZXRCaXRzKDMyKTsKKyAgICBpZiAoY3JjICE9IG1QTVRfQ1JDKSB7CisgICAgICAgIGF1ZGlvUHJlc2VudGF0aW9uc0NoYW5nZWQgPSB0cnVlOworICAgICAgICBtUE1UX0NSQyA9IGNyYzsKKyAgICB9CisgICAgTVlfTE9HVigiICBDUkMgPSAweCUwOHgiLCBjcmMpOwogCiAgICAgYm9vbCBQSURzQ2hhbmdlZCA9IGZhbHNlOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5mb3Muc2l6ZSgpOyArK2kpIHsKQEAgLTYwMSwxNiArNzM0LDE5IEBACiAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtU3RyZWFtcy5pbmRleE9mS2V5KGluZm8ubVBJRCk7CiAKICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgc3A8U3RyZWFtPiBzdHJlYW0gPSBuZXcgU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICB0aGlzLCBpbmZvLm1QSUQsIGluZm8ubVR5cGUsIFBDUl9QSUQsIGluZm8ubUNBU3lzdGVtSWQpOworICAgICAgICAgICAgc3A8U3RyZWFtPiBzdHJlYW0gPSBuZXcgU3RyZWFtKHRoaXMsIFBDUl9QSUQsIGluZm8pOwogCiAgICAgICAgICAgICBpZiAobVNhbXBsZUFlc0tleUl0ZW0gIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHN0cmVhbS0+c2lnbmFsTmV3U2FtcGxlQWVzS2V5KG1TYW1wbGVBZXNLZXlJdGVtKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaXNBZGRpbmdTY3JhbWJsZWRTdHJlYW0gfD0gaW5mby5tQ0FTeXN0ZW1JZCA+PSAwOworICAgICAgICAgICAgaXNBZGRpbmdTY3JhbWJsZWRTdHJlYW0gfD0gaW5mby5tQ0FEZXNjcmlwdG9yLm1TeXN0ZW1JRCA+PSAwOwogICAgICAgICAgICAgbVN0cmVhbXMuYWRkKGluZm8ubVBJRCwgc3RyZWFtKTsKICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpbmRleCA+PSAwICYmIG1TdHJlYW1zLmVkaXRWYWx1ZUF0KGluZGV4KS0+aXNBdWRpbygpCisgICAgICAgICAgICAgICAgICYmIGF1ZGlvUHJlc2VudGF0aW9uc0NoYW5nZWQpIHsKKyAgICAgICAgICAgIG1TdHJlYW1zLmVkaXRWYWx1ZUF0KGluZGV4KS0+c2V0QXVkaW9QcmVzZW50YXRpb25zKGluZm8ubUF1ZGlvUHJlc2VudGF0aW9ucyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoaXNBZGRpbmdTY3JhbWJsZWRTdHJlYW0pIHsKQEAgLTcxNywzNCArODUzLDMzIEBACiBzdGF0aWMgY29uc3Qgc2l6ZV90IGtJbml0aWFsU3RyZWFtQnVmZmVyU2l6ZSA9IDE5MiAqIDEwMjQ7CiAKIEFUU1BhcnNlcjo6U3RyZWFtOjpTdHJlYW0oCi0gICAgICAgIFByb2dyYW0gKnByb2dyYW0sCi0gICAgICAgIHVuc2lnbmVkIGVsZW1lbnRhcnlQSUQsCi0gICAgICAgIHVuc2lnbmVkIHN0cmVhbVR5cGUsCi0gICAgICAgIHVuc2lnbmVkIFBDUl9QSUQsCi0gICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX0lEKQorICAgICAgICBQcm9ncmFtICpwcm9ncmFtLCB1bnNpZ25lZCBQQ1JfUElELCBjb25zdCBTdHJlYW1JbmZvICZpbmZvKQogICAgIDogbVByb2dyYW0ocHJvZ3JhbSksCi0gICAgICBtRWxlbWVudGFyeVBJRChlbGVtZW50YXJ5UElEKSwKLSAgICAgIG1TdHJlYW1UeXBlKHN0cmVhbVR5cGUpLAorICAgICAgbUVsZW1lbnRhcnlQSUQoaW5mby5tUElEKSwKKyAgICAgIG1TdHJlYW1UeXBlKGluZm8ubVR5cGUpLAorICAgICAgbVN0cmVhbVR5cGVFeHQoaW5mby5tVHlwZUV4dCksCiAgICAgICBtUENSX1BJRChQQ1JfUElEKSwKICAgICAgIG1FeHBlY3RlZENvbnRpbnVpdHlDb3VudGVyKC0xKSwKICAgICAgIG1QYXlsb2FkU3RhcnRlZChmYWxzZSksCiAgICAgICBtRU9TUmVhY2hlZChmYWxzZSksCiAgICAgICBtUHJldlBUUygwKSwKICAgICAgIG1RdWV1ZShOVUxMKSwKLSAgICAgIG1TY3JhbWJsZWQoQ0Ffc3lzdGVtX0lEID49IDApIHsKLQorICAgICAgbVNjcmFtYmxlZChpbmZvLm1DQURlc2NyaXB0b3IubVN5c3RlbUlEID49IDApLAorICAgICAgbUF1ZGlvUHJlc2VudGF0aW9ucyhpbmZvLm1BdWRpb1ByZXNlbnRhdGlvbnMpIHsKICAgICBtU2FtcGxlRW5jcnlwdGVkID0KICAgICAgICAgICAgIG1TdHJlYW1UeXBlID09IFNUUkVBTVRZUEVfSDI2NF9FTkNSWVBURUQgfHwKICAgICAgICAgICAgIG1TdHJlYW1UeXBlID09IFNUUkVBTVRZUEVfQUFDX0VOQ1JZUFRFRCAgfHwKICAgICAgICAgICAgIG1TdHJlYW1UeXBlID09IFNUUkVBTVRZUEVfQUMzX0VOQ1JZUFRFRDsKIAogICAgIEFMT0dWKCJuZXcgc3RyZWFtIFBJRCAweCUwMngsIHR5cGUgMHglMDJ4LCBzY3JhbWJsZWQgJWQsIFNhbXBsZUVuY3J5cHRlZDogJWQiLAotICAgICAgICAgICAgZWxlbWVudGFyeVBJRCwgc3RyZWFtVHlwZSwgbVNjcmFtYmxlZCwgbVNhbXBsZUVuY3J5cHRlZCk7CisgICAgICAgICAgICBpbmZvLm1QSUQsIGluZm8ubVR5cGUsIG1TY3JhbWJsZWQsIG1TYW1wbGVFbmNyeXB0ZWQpOwogCi0gICAgdWludDMyX3QgZmxhZ3MgPQotICAgICAgICAgICAgKGlzVmlkZW8oKSAmJiBtU2NyYW1ibGVkKSA/IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6a0ZsYWdfU2NyYW1ibGVkRGF0YSA6Ci0gICAgICAgICAgICAobVNhbXBsZUVuY3J5cHRlZCkgPyBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmtGbGFnX1NhbXBsZUVuY3J5cHRlZERhdGEgOgotICAgICAgICAgICAgMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKCgoaXNWaWRlbygpIHx8IGlzQXVkaW8oKSkgJiYgbVNjcmFtYmxlZCkpIHsKKyAgICAgICAgZmxhZ3MgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmtGbGFnX1NjcmFtYmxlZERhdGE7CisgICAgfSBlbHNlIGlmIChtU2FtcGxlRW5jcnlwdGVkKSB7CisgICAgICAgIGZsYWdzID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjprRmxhZ19TYW1wbGVFbmNyeXB0ZWREYXRhOworICAgIH0KIAogICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TW9kZSBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpJTlZBTElEOwogCkBAIC03ODEsMTMgKzkxNiwyMyBAQAogICAgICAgICAgICAgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6QUMzOwogICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0VBQzM6CisgICAgICAgICAgICBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpFQUMzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1BFU19QUklWQVRFX0RBVEE6CisgICAgICAgICAgICBpZiAobVN0cmVhbVR5cGVFeHQgPT0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNCkgeworICAgICAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OkFDNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NRVRBREFUQToKICAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6Ok1FVEFEQVRBOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCJzdHJlYW0gUElEIDB4JTAyeCBoYXMgaW52YWxpZCBzdHJlYW0gdHlwZSAweCUwMngiLAotICAgICAgICAgICAgICAgICAgICBlbGVtZW50YXJ5UElELCBzdHJlYW1UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5tUElELCBpbmZvLm1UeXBlKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTgwNyw3ICs5NTIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgaXNBdWRpbygpID8gTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1FRElBX01JTUVUWVBFX1ZJREVPX1NDUkFNQkxFRCk7CiAgICAgICAgICAgICAvLyBmb3IgTWVkaWFFeHRyYWN0b3IuQ2FzSW5mbwotICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIENBX3N5c3RlbV9JRCk7CisgICAgICAgICAgICBjb25zdCBDQURlc2NyaXB0b3IgJmRlc2NyaXB0b3IgPSBpbmZvLm1DQURlc2NyaXB0b3I7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgZGVzY3JpcHRvci5tU3lzdGVtSUQpOworCisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlDQVByaXZhdGVEYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLm1Qcml2YXRlRGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IubVByaXZhdGVEYXRhLnNpemUoKSk7CisKICAgICAgICAgICAgIG1Tb3VyY2UgPSBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShtZXRhKTsKICAgICAgICAgfQogICAgIH0KQEAgLTgyNywxNiArOTc4LDQzIEBACiAgICAgICAgICAgICBtQnVmZmVyID09IE5VTEwgPyAwIDogbUJ1ZmZlci0+Y2FwYWNpdHkoKSwgbmVlZGVkU2l6ZSwgbVNjcmFtYmxlZCk7CiAKICAgICBzcDxBQnVmZmVyPiBuZXdCdWZmZXIsIG5ld1NjcmFtYmxlZEJ1ZmZlcjsKLSAgICBzcDxJTWVtb3J5PiBuZXdNZW07Ci0gICAgc3A8TWVtb3J5RGVhbGVyPiBuZXdEZWFsZXI7CisgICAgc3A8VE1lbW9yeT4gbmV3TWVtOwogICAgIGlmIChtU2NyYW1ibGVkKSB7Ci0gICAgICAgIHNpemVfdCBhbGlnbm1lbnQgPSBNZW1vcnlEZWFsZXI6OmdldEFsbG9jYXRpb25BbGlnbm1lbnQoKTsKLSAgICAgICAgbmVlZGVkU2l6ZSA9IChuZWVkZWRTaXplICsgKGFsaWdubWVudCAtIDEpKSAmIH4oYWxpZ25tZW50IC0gMSk7Ci0gICAgICAgIC8vIEFsaWduIHRvIG11bHRpcGxlcyBvZiA2NEsuCi0gICAgICAgIG5lZWRlZFNpemUgPSAobmVlZGVkU2l6ZSArIDY1NTM1KSAmIH42NTUzNTsKLSAgICAgICAgbmV3RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihuZWVkZWRTaXplLCAiQVRTUGFyc2VyIik7Ci0gICAgICAgIG5ld01lbSA9IG5ld0RlYWxlci0+YWxsb2NhdGUobmVlZGVkU2l6ZSk7Ci0gICAgICAgIG5ld1NjcmFtYmxlZEJ1ZmZlciA9IG5ldyBBQnVmZmVyKG5ld01lbS0+cG9pbnRlcigpLCBuZXdNZW0tPnNpemUoKSk7CisgICAgICAgIGlmIChtSGlkbEFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtSGlkbEFsbG9jYXRvciA9IFRBbGxvY2F0b3I6OmdldFNlcnZpY2UoImFzaG1lbSIpOworICAgICAgICAgICAgaWYgKG1IaWRsQWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gY2FuJ3QgZ2V0IGhpZGwgYWxsb2NhdG9yIiwgbUVsZW1lbnRhcnlQSUQpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGhpZGxfbWVtb3J5IGhpZGxNZW1Ub2tlbjsKKyAgICAgICAgYm9vbCBzdWNjZXNzOworICAgICAgICBhdXRvIHRyYW5zU3RhdHVzID0gbUhpZGxBbGxvY2F0b3ItPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgIG5lZWRlZFNpemUsCisgICAgICAgICAgICAgICAgWyZzdWNjZXNzLCAmaGlkbE1lbVRva2VuXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfbWVtb3J5IGNvbnN0JiBtKSB7CisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzOworICAgICAgICAgICAgICAgICAgICBoaWRsTWVtVG9rZW4gPSBtOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gaGlkbCBhbGxvY2F0b3IgZmFpbGVkIGF0IHRoZSB0cmFuc3BvcnQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIHRyYW5zU3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gaGlkbCBhbGxvY2F0b3IgZmFpbGVkIiwgbUVsZW1lbnRhcnlQSUQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG5ld01lbSA9IG1hcE1lbW9yeShoaWRsTWVtVG9rZW4pOworICAgICAgICBpZiAobmV3TWVtID09IG51bGxwdHIgfHwgbmV3TWVtLT5nZXRQb2ludGVyKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIltzdHJlYW0gJWRdIGhpZGwgZmFpbGVkIHRvIG1hcCBtZW1vcnkiLCBtRWxlbWVudGFyeVBJRCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBuZXdTY3JhbWJsZWRCdWZmZXIgPSBuZXcgQUJ1ZmZlcihuZXdNZW0tPmdldFBvaW50ZXIoKSwgbmV3TWVtLT5nZXRTaXplKCkpOwogCiAgICAgICAgIGlmIChtRGVzY3JhbWJsZWRCdWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgbWVtY3B5KG5ld1NjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLApAQCAtODQ1LDI0ICsxMDIzLDE1IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBuZXdTY3JhbWJsZWRCdWZmZXItPnNldFJhbmdlKDAsIDApOwogICAgICAgICB9Ci0gICAgICAgIG1NZW0gPSBuZXdNZW07Ci0gICAgICAgIG1EZWFsZXIgPSBuZXdEZWFsZXI7CisgICAgICAgIG1IaWRsTWVtb3J5ID0gbmV3TWVtOwogICAgICAgICBtRGVzY3JhbWJsZWRCdWZmZXIgPSBuZXdTY3JhbWJsZWRCdWZmZXI7CiAKLSAgICAgICAgc3NpemVfdCBvZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG5ld01lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKLSAgICAgICAgaWYgKGhlYXAgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5oZWFwQmFzZSA9IGhpZGxNZW1Ub2tlbjsKKyAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLm9mZnNldCA9IDBVTEw7CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5zaXplID0gICh1aW50NjRfdCluZWVkZWRTaXplOwogCi0gICAgICAgIG1IaWRsTWVtb3J5ID0gZnJvbUhlYXAoaGVhcCk7Ci0gICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5oZWFwQmFzZSA9ICptSGlkbE1lbW9yeTsKLSAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLm9mZnNldCA9ICh1aW50NjRfdCkgb2Zmc2V0OwotICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIuc2l6ZSA9ICh1aW50NjRfdCkgc2l6ZTsKLQotICAgICAgICBBTE9HRCgiW3N0cmVhbSAlZF0gY3JlYXRlZCBzaGFyZWQgYnVmZmVyIGZvciBkZXNjcmFtYmxpbmcsIG9mZnNldCAlemQsIHNpemUgJXp1IiwKLSAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgb2Zmc2V0LCBzaXplKTsKKyAgICAgICAgQUxPR0QoIltzdHJlYW0gJWRdIGNyZWF0ZWQgc2hhcmVkIGJ1ZmZlciBmb3IgZGVzY3JhbWJsaW5nLCBzaXplICV6dSIsCisgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIG5lZWRlZFNpemUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIEFsaWduIHRvIG11bHRpcGxlcyBvZiA2NEsuCiAgICAgICAgIG5lZWRlZFNpemUgPSAobmVlZGVkU2l6ZSArIDY1NTM1KSAmIH42NTUzNTsKQEAgLTk4Niw5ICsxMTU1LDEyIEBACiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NUEVHMl9BVURJT19BRFRTOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTFBDTV9BQzM6CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9BQzM6CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9FQUMzOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQUFDX0VOQ1JZUFRFRDoKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FDM19FTkNSWVBURUQ6CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1BFU19QUklWQVRFX0RBVEE6CisgICAgICAgICAgICByZXR1cm4gbVN0cmVhbVR5cGVFeHQgPT0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNDsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTM0Nyw3ICsxNTE5LDcgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgaWYgKG1EZXNjcmFtYmxlZEJ1ZmZlciA9PSBOVUxMIHx8IG1NZW0gPT0gTlVMTCkgeworICAgIGlmIChtRGVzY3JhbWJsZWRCdWZmZXIgPT0gTlVMTCB8fCBtSGlkbE1lbW9yeSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJyZWNlaXZlZCBzY3JhbWJsZWQgcGFja2V0cyB3aXRob3V0IHNoYXJlZCBtZW1vcnkhIik7CiAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CkBAIC0xMzk1LDcgKzE1NjcsNyBAQAogICAgIC8vIFBlcmZvcm0gdGhlIDFzdCBwYXNzIGRlc2NyYW1ibGluZyBpZiBuZWVkZWQKICAgICBpZiAoZGVzY3JhbWJsZUJ5dGVzID4gMCkgewogICAgICAgICBtZW1jcHkobURlc2NyYW1ibGVkQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgZGVzY3JhbWJsZUJ5dGVzKTsKLSAgICAgICAgbURlc2NyYW1ibGVkQnVmZmVyLT5zZXRSYW5nZSgwLCBkZXNjcmFtYmxlQnl0ZXMpOworICAgICAgICBtRGVzY3JhbWJsZWRCdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSk7CiAKICAgICAgICAgaGlkbF92ZWM8U3ViU2FtcGxlPiBzdWJTYW1wbGVzOwogICAgICAgICBzdWJTYW1wbGVzLnJlc2l6ZShkZXNjcmFtYmxlU3ViU2FtcGxlcyk7CkBAIC0xNDEyLDEwICsxNTg0LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHVpbnQ2NF90IHNyY09mZnNldCA9IDAsIGRzdE9mZnNldCA9IDA7Ci0gICAgICAgIC8vIElmIHNjcmFtYmxlZCBhdCBQRVMtbGV2ZWwsIFBFUyBoZWFkZXIgc2hvdWxkIGJlIHNraXBwZWQKKyAgICAgICAgLy8gSWYgc2NyYW1ibGVkIGF0IFBFUy1sZXZlbCwgUEVTIGhlYWRlciBpcyBpbiB0aGUgY2xlYXIKICAgICAgICAgaWYgKHBlc1NjcmFtYmxpbmdDb250cm9sICE9IDApIHsKLSAgICAgICAgICAgIHNyY09mZnNldCA9IGRzdE9mZnNldCA9IHBlc09mZnNldDsKKyAgICAgICAgICAgIHN1YlNhbXBsZXNbMF0ubnVtQnl0ZXNPZkNsZWFyRGF0YSA9IHBlc09mZnNldDsKICAgICAgICAgICAgIHN1YlNhbXBsZXNbMF0ubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgLT0gcGVzT2Zmc2V0OwogICAgICAgICB9CiAKQEAgLTE0MzEsOSArMTYwMiw5IEBACiAgICAgICAgICAgICAgICAgKFNjcmFtYmxpbmdDb250cm9sKSBzY3RybCwKICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLAogICAgICAgICAgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlciwKLSAgICAgICAgICAgICAgICBzcmNPZmZzZXQsCisgICAgICAgICAgICAgICAgMCAvKnNyY09mZnNldCovLAogICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKLSAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgICAgICAgICAgICAgMCAvKmRzdE9mZnNldCovLAogICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmYnl0ZXNXcml0dGVuLCAmZGV0YWlsZWRFcnJvcl0gKAogICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzIF9zdGF0dXMsIHVpbnQzMl90IF9ieXRlc1dyaXR0ZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgX2RldGFpbGVkRXJyb3IpIHsKQEAgLTE0NDIsMTcgKzE2MTMsMjkgQEAKICAgICAgICAgICAgICAgICAgICAgZGV0YWlsZWRFcnJvciA9IF9kZXRhaWxlZEVycm9yOwogICAgICAgICAgICAgICAgIH0pOwogCi0gICAgICAgIGlmICghcmV0dXJuVm9pZC5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBkZXNjcmFtYmxlIGZhaWxlZCwgdHJhbnM9JXMiLAotICAgICAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgcmV0dXJuVm9pZC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICBpZiAoIXJldHVyblZvaWQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gZGVzY3JhbWJsZSBmYWlsZWQsIHRyYW5zPSVzLCBzdGF0dXM9JWQiLAorICAgICAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgcmV0dXJuVm9pZC5kZXNjcmlwdGlvbigpLmNfc3RyKCksIHN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogCiAgICAgICAgIEFMT0dWKCJbc3RyZWFtICVkXSBkZXNjcmFtYmxlIHN1Y2NlZWRlZCwgJWQgYnl0ZXMiLAogICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCBieXRlc1dyaXR0ZW4pOwotICAgICAgICBtZW1jcHkobUJ1ZmZlci0+ZGF0YSgpLCBtRGVzY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwgZGVzY3JhbWJsZUJ5dGVzKTsKKworICAgICAgICAvLyBTZXQgZGVzY3JhbWJsZUJ5dGVzIHRvIHRoZSByZXR1cm5lZCByZXN1bHQuCisgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIG1pZ2h0IGJlIHNtYWxsZXIgdGhhbiB0aGUgdG90YWwgbGVuZ3RoIG9mIGlucHV0IGRhdGEuCisgICAgICAgIC8vIChlZy4gd2hlbiB3ZSdyZSBkZXNjcmFtYmxpbmcgdGhlIFBFUyBoZWFkZXIgcG9ydGlvbiBvZiBhIHNlY3VyZSBzdHJlYW0sCisgICAgICAgIC8vIHRoZSBwbHVnaW4gbWlnaHQgY3V0IGl0IG9mZiByaWdodCBhZnRlciB0aGUgUEVTIGhlYWRlci4pCisgICAgICAgIGRlc2NyYW1ibGVCeXRlcyA9IGJ5dGVzV3JpdHRlbjsKICAgICB9CiAKKyAgICAvLyB8YnVmZmVyfCBwb2ludHMgdG8gdGhlIGJ1ZmZlciBmcm9tIHdoaWNoIHdlJ2QgcGFyc2UgdGhlIFBFUyBoZWFkZXIuCisgICAgLy8gV2hlbiB0aGUgb3V0cHV0IHN0cmVhbSBpcyBzY3JhbWJsZWQsIGl0IHBvaW50cyB0byBtRGVzY3JhbWJsZWRCdWZmZXIKKyAgICAvLyAodW5sZXNzIGFsbCBwYWNrZXRzIGluIHRoaXMgUEVTIGFyZSBhY3R1YWxseSBjbGVhciwgaW4gd2hpY2ggY2FzZSwKKyAgICAvLyBpdCBwb2ludHMgdG8gbUJ1ZmZlciBzaW5jZSB3ZSBuZXZlciBjb3BpZWQgaW50byBtRGVzY3JhbWJsZWRCdWZmZXIpLgorICAgIC8vIFdoZW4gdGhlIG91dHB1dCBzdHJlYW0gaXMgY2xlYXIsIGl0IHBvaW50cyB0byBtQnVmZmVyLCBhbmQgd2UnbGwKKyAgICAvLyBjb3B5IGFsbCBkZXNjcmFtYmxlZCBkYXRhIGJhY2sgdG8gbUJ1ZmZlci4KKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBtQnVmZmVyOwogICAgIGlmIChtUXVldWUtPmlzU2NyYW1ibGVkKCkpIHsKICAgICAgICAgLy8gUXVldWUgc3ViU2FtcGxlIGluZm8gZm9yIHNjcmFtYmxlZCBxdWV1ZQogICAgICAgICBzcDxBQnVmZmVyPiBjbGVhclNpemVzQnVmZmVyID0gbmV3IEFCdWZmZXIobVN1YlNhbXBsZXMuc2l6ZSgpICogNCk7CkBAIC0xNDY0LDggKzE2NDcsNyBAQAogICAgICAgICBmb3IgKGF1dG8gaXQgPSBtU3ViU2FtcGxlcy5iZWdpbigpOwogICAgICAgICAgICAgICAgIGl0ICE9IG1TdWJTYW1wbGVzLmVuZCgpOyBpdCsrLCBpKyspIHsKICAgICAgICAgICAgIGlmICgoaXQtPnRyYW5zcG9ydF9zY3JhbWJsaW5nX21vZGUgPT0gMAotICAgICAgICAgICAgICAgICAgICAmJiBwZXNTY3JhbWJsaW5nQ29udHJvbCA9PSAwKQotICAgICAgICAgICAgICAgICAgICB8fCBpIDwgZGVzY3JhbWJsZVN1YlNhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgJiYgcGVzU2NyYW1ibGluZ0NvbnRyb2wgPT0gMCkpIHsKICAgICAgICAgICAgICAgICBjbGVhclNpemVQdHJbaV0gPSBpdC0+c3ViU2FtcGxlU2l6ZTsKICAgICAgICAgICAgICAgICBlbmNTaXplUHRyW2ldID0gMDsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xNDc0LDE0ICsxNjU2LDI5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpc1N5bmMgfD0gaXQtPnJhbmRvbV9hY2Nlc3NfaW5kaWNhdG9yOwogICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgc2NyYW1ibGVkIGF0IFBFUy1sZXZlbCwgUEVTIGhlYWRlciBpcyBpbiB0aGUgY2xlYXIKKyAgICAgICAgaWYgKHBlc1NjcmFtYmxpbmdDb250cm9sICE9IDApIHsKKyAgICAgICAgICAgIGNsZWFyU2l6ZVB0clswXSA9IHBlc09mZnNldDsKKyAgICAgICAgICAgIGVuY1NpemVQdHJbMF0gLT0gcGVzT2Zmc2V0OworICAgICAgICB9CiAgICAgICAgIC8vIFBhc3MgdGhlIG9yaWdpbmFsIFRTIHN1YnNhbXBsZSBzaXplIG5vdy4gVGhlIFBFUyBoZWFkZXIgYWRqdXN0CiAgICAgICAgIC8vIHdpbGwgYmUgYXBwbGllZCB3aGVuIHRoZSBzY3JhbWJsZWQgQVUgaXMgZGVxdWV1ZWQuCisgICAgICAgIC8vIE5vdGUgdGhhdCBpZiBkZXNjcmFtYmxlQnl0ZXMgaXMgMCwgaXQgbWVhbnMgdGhpcyBQRVMgY29udGFpbnMgb25seQorICAgICAgICAvLyBhbGwgdHMgcGFja2V0cywgbGVhZGluZ0NsZWFyQnl0ZXMgaXMgZW50aXJlIGJ1ZmZlciBzaXplLgogICAgICAgICBtUXVldWUtPmFwcGVuZFNjcmFtYmxlZERhdGEoCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCksIHNjdHJsLAotICAgICAgICAgICAgICAgIGlzU3luYywgY2xlYXJTaXplc0J1ZmZlciwgZW5jU2l6ZXNCdWZmZXIpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpLAorICAgICAgICAgICAgICAgIChkZXNjcmFtYmxlQnl0ZXMgPiAwKSA/IGRlc2NyYW1ibGVCeXRlcyA6IG1CdWZmZXItPnNpemUoKSwKKyAgICAgICAgICAgICAgICBzY3RybCwgaXNTeW5jLCBjbGVhclNpemVzQnVmZmVyLCBlbmNTaXplc0J1ZmZlcik7CisKKyAgICAgICAgaWYgKGRlc2NyYW1ibGVCeXRlcyA+IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG1EZXNjcmFtYmxlZEJ1ZmZlcjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShtQnVmZmVyLT5kYXRhKCksIG1EZXNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLCBkZXNjcmFtYmxlQnl0ZXMpOwogICAgIH0KIAotICAgIEFCaXRSZWFkZXIgYnIobUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOworICAgIEFCaXRSZWFkZXIgYnIoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZVBFUygmYnIsIGV2ZW50KTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTE1MTQsNiArMTcxMSwxMyBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3ZvaWQgQVRTUGFyc2VyOjpTdHJlYW06OmFkZEF1ZGlvUHJlc2VudGF0aW9ucyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dFN0cmVhbShzdGQ6Omlvczo6b3V0KTsKKyAgICBzZXJpYWxpemVBdWRpb1ByZXNlbnRhdGlvbnMobUF1ZGlvUHJlc2VudGF0aW9ucywgJm91dFN0cmVhbSk7CisgICAgc3A8QUJ1ZmZlcj4gYXAgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkob3V0U3RyZWFtLnN0cigpLmRhdGEoKSwgb3V0U3RyZWFtLnN0cigpLnNpemUoKSk7CisgICAgYnVmZmVyLT5tZXRhKCktPnNldEJ1ZmZlcigiYXVkaW8tcHJlc2VudGF0aW9uLWluZm8iLCBhcCk7Cit9CisKIHZvaWQgQVRTUGFyc2VyOjpTdHJlYW06Om9uUGF5bG9hZERhdGEoCiAgICAgICAgIHVuc2lnbmVkIFBUU19EVFNfZmxhZ3MsIHVpbnQ2NF90IFBUUywgdWludDY0X3QgLyogRFRTICovLAogICAgICAgICB1bnNpZ25lZCBQRVNfc2NyYW1ibGluZ19jb250cm9sLApAQCAtMTU2NCw2ICsxNzY4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtU291cmNlID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobWV0YSk7CisgICAgICAgICAgICAgICAgaWYgKG1BdWRpb1ByZXNlbnRhdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1ByZXNlbnRhdGlvbnMoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKICAgICAgICAgICAgICAgICBBTE9HVigib25QYXlsb2FkRGF0YTogY3JlYXRlZCBBbm90aGVyUGFja2V0U291cmNlIFBJRCAweCUwOHggb2YgdHlwZSAweCUwMngiLAogICAgICAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIG1TdHJlYW1UeXBlKTsKQEAgLTE1NzYsNiArMTc4Myw5IEBACiAgICAgICAgICAgICBpZiAobVNvdXJjZS0+Z2V0Rm9ybWF0KCkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnNldEZvcm1hdChtUXVldWUtPmdldEZvcm1hdCgpKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQXVkaW9QcmVzZW50YXRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBhZGRBdWRpb1ByZXNlbnRhdGlvbnMoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtU291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKaW5kZXggNDVjYTA2Yi4uMGZmMmQ3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CkBAIC0xNDIsNiArMTQzLDcgQEAKICAgICAgICAgU1RSRUFNVFlQRV9NUEVHMl9WSURFTyAgICAgICAgICA9IDB4MDIsCiAgICAgICAgIFNUUkVBTVRZUEVfTVBFRzFfQVVESU8gICAgICAgICAgPSAweDAzLAogICAgICAgICBTVFJFQU1UWVBFX01QRUcyX0FVRElPICAgICAgICAgID0gMHgwNCwKKyAgICAgICAgU1RSRUFNVFlQRV9QRVNfUFJJVkFURV9EQVRBICAgICA9IDB4MDYsCiAgICAgICAgIFNUUkVBTVRZUEVfTVBFRzJfQVVESU9fQURUUyAgICAgPSAweDBmLAogICAgICAgICBTVFJFQU1UWVBFX01QRUc0X1ZJREVPICAgICAgICAgID0gMHgxMCwKICAgICAgICAgU1RSRUFNVFlQRV9NRVRBREFUQSAgICAgICAgICAgICA9IDB4MTUsCkBAIC0xNTMsNiArMTU1LDcgQEAKICAgICAgICAgLy8gU3RyZWFtIHR5cGUgMHg4MyBpcyBub24tc3RhbmRhcmQsCiAgICAgICAgIC8vIGl0IGNvdWxkIGJlIExQQ00gb3IgVHJ1ZUhEIEFDMwogICAgICAgICBTVFJFQU1UWVBFX0xQQ01fQUMzICAgICAgICAgICAgID0gMHg4MywKKyAgICAgICAgU1RSRUFNVFlQRV9FQUMzICAgICAgICAgICAgICAgICA9IDB4ODcsCiAKICAgICAgICAgLy9TYW1wbGUgRW5jcnlwdGVkIHR5cGVzCiAgICAgICAgIFNUUkVBTVRZUEVfSDI2NF9FTkNSWVBURUQgICAgICAgPSAweERCLApAQCAtMTYwLDYgKzE2MywyMSBAQAogICAgICAgICBTVFJFQU1UWVBFX0FDM19FTkNSWVBURUQgICAgICAgID0gMHhDMSwKICAgICB9OwogCisgICAgZW51bSB7CisgICAgICAgIC8vIEZyb20gSVNPL0lFQyAxMzgxOC0xOiAyMDA3IChFKSwgVGFibGUgMi00NQorICAgICAgICBERVNDUklQVE9SX0NBICAgICAgICAgICAgICAgICAgID0gMHgwOSwKKworICAgICAgICAvLyBEVkIgQmx1ZUJvb2sgQTAzOCBUYWJsZSAxMgorICAgICAgICBERVNDUklQVE9SX0RWQl9FWFRFTlNJT04gICAgICAgID0gMHg3RiwKKyAgICB9OworCisgICAgLy8gRFZCIEJsdWVCb29rIEEwMzggVGFibGUgMTA5CisgICAgZW51bSB7CisgICAgICAgIEVYVF9ERVNDUklQVE9SX0RWQl9BQzQgICAgICAgICAgICAgICAgICA9IDB4MTUsCisgICAgICAgIEVYVF9ERVNDUklQVE9SX0RWQl9BVURJT19QUkVTRUxFQ1RJT04gICA9IDB4MTksCisgICAgICAgIEVYVF9ERVNDUklQVE9SX0RWQl9SRVNFUlZFRF9NQVggICAgICAgICA9IDB4N0YsCisgICAgfTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFUU1BhcnNlcigpOwogCkBAIC0xNjksMTEgKzE4NywyMCBAQAogICAgIHN0cnVjdCBQU0lTZWN0aW9uOwogICAgIHN0cnVjdCBDYXNNYW5hZ2VyOwogICAgIHN0cnVjdCBDQURlc2NyaXB0b3IgewotICAgICAgICBpbnQzMl90IG1TeXN0ZW1JRDsKKyAgICAgICAgQ0FEZXNjcmlwdG9yKCkgOiBtUElEKDApLCBtU3lzdGVtSUQoLTEpIHt9CiAgICAgICAgIHVuc2lnbmVkIG1QSUQ7CisgICAgICAgIGludDMyX3QgbVN5c3RlbUlEOwogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtUHJpdmF0ZURhdGE7CiAgICAgfTsKIAorICAgIHN0cnVjdCBTdHJlYW1JbmZvIHsKKyAgICAgICAgdW5zaWduZWQgbVR5cGU7CisgICAgICAgIHVuc2lnbmVkIG1UeXBlRXh0OworICAgICAgICB1bnNpZ25lZCBtUElEOworICAgICAgICBDQURlc2NyaXB0b3IgbUNBRGVzY3JpcHRvcjsKKyAgICAgICAgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uIG1BdWRpb1ByZXNlbnRhdGlvbnM7CisgICAgfTsKKwogICAgIHNwPENhc01hbmFnZXI+IG1DYXNNYW5hZ2VyOwogCiAgICAgdWludDMyX3QgbUZsYWdzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCmluZGV4IGY5ZGNiYzkuLmE1MDdiOTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKQEAgLTMwLDkgKzMwLDE0IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmNyeXB0byIsCiAgICAgICAgICJsaWJtZWRpYSIsCi0gICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgd2hvbGVfc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwCmluZGV4IDY2ZDdkYzEuLjYyZTNhNGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcApAQCAtMjIzLDkgKzIyMywxNiBAQAogICAgICAgICAgICAgICAgICAgICBrS2V5TXBlZ1VzZXJEYXRhLCAwLCBtcGVnVXNlckRhdGEtPmRhdGEoKSwgbXBlZ1VzZXJEYXRhLT5zaXplKCkpOwogICAgICAgICB9CiAKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYXA7CisgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEJ1ZmZlcigiYXVkaW8tcHJlc2VudGF0aW9uLWluZm8iLCAmYXApICYmIGFwICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAga0tleUF1ZGlvUHJlc2VudGF0aW9uSW5mbywgMCwgYXAtPmRhdGEoKSwgYXAtPnNpemUoKSk7CisgICAgICAgIH0KKwogICAgICAgICBpbnQzMl90IGNyeXB0b01vZGU7CiAgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjcnlwdG9Nb2RlIiwgJmNyeXB0b01vZGUpKSB7CiAgICAgICAgICAgICBpbnQzMl90IGNyeXB0b0tleTsKKyAgICAgICAgICAgIGludDMyX3QgcGVzT2Zmc2V0OwogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY2xlYXJCeXRlc0J1ZmZlciwgZW5jQnl0ZXNCdWZmZXI7CiAKICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImNyeXB0b0tleSIsICZjcnlwdG9LZXkpKTsKQEAgLTIzMyw2ICsyNDAsOCBAQAogICAgICAgICAgICAgICAgICAgICAmJiBjbGVhckJ5dGVzQnVmZmVyICE9IE5VTEwpOwogICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRCdWZmZXIoImVuY0J5dGVzIiwgJmVuY0J5dGVzQnVmZmVyKQogICAgICAgICAgICAgICAgICAgICAmJiBlbmNCeXRlc0J1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInBlc09mZnNldCIsICZwZXNPZmZzZXQpCisgICAgICAgICAgICAgICAgICAgICYmIChwZXNPZmZzZXQgPj0gMCkgJiYgKHBlc09mZnNldCA8IDY1NTM2KSk7CiAKICAgICAgICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIGNyeXB0b01vZGUpOwogCkBAIC0yNDAsNiArMjQ5LDExIEBACiAgICAgICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleUNyeXB0b0lWLCAwLCBhcnJheSwgMTYpOwogCiAgICAgICAgICAgICBhcnJheVswXSA9ICh1aW50OF90KSAoY3J5cHRvS2V5ICYgMHhmZik7CisgICAgICAgICAgICAvLyBhcnJheVsxXSBjb250YWlucyBQRVMgaGVhZGVyIGZsYWcsIHdoaWNoIHdlIGRvbid0IHVzZS4KKyAgICAgICAgICAgIC8vIGFycmF5WzJ+M10gY29udGFpbiB0aGUgUEVTIG9mZnNldC4KKyAgICAgICAgICAgIGFycmF5WzJdID0gKHVpbnQ4X3QpIChwZXNPZmZzZXQgJiAweGZmKTsKKyAgICAgICAgICAgIGFycmF5WzNdID0gKHVpbnQ4X3QpICgocGVzT2Zmc2V0ID4+IDgpICYgMHhmZik7CisKICAgICAgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAwLCBhcnJheSwgMTYpOwogCiAgICAgICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleVBsYWluU2l6ZXMsIDAsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcAppbmRleCBjOWU1MTlmLi41YWY3YjIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKQEAgLTg2LDYgKzg2LDIxIEBACiAgICAgbUNhc1Nlc3Npb25JZCA9IHNlc3Npb25JZDsKIH0KIAorc3RhdGljIGludDMyX3QgcmVhZFZhcmlhYmxlQml0cyhBQml0UmVhZGVyICZiaXRzLCBpbnQzMl90IG5iaXRzKSB7CisgICAgaW50MzJfdCB2YWx1ZSA9IDA7CisgICAgaW50MzJfdCBtb3JlX2JpdHMgPSAxOworCisgICAgd2hpbGUgKG1vcmVfYml0cykgeworICAgICAgICB2YWx1ZSArPSBiaXRzLmdldEJpdHMobmJpdHMpOworICAgICAgICBtb3JlX2JpdHMgPSBiaXRzLmdldEJpdHMoMSk7CisgICAgICAgIGlmICghbW9yZV9iaXRzKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHZhbHVlKys7CisgICAgICAgIHZhbHVlIDw8PSBuYml0czsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlOworfQorCiAvLyBQYXJzZSBBQzMgaGVhZGVyIGFzc3VtaW5nIHRoZSBjdXJyZW50IHB0ciBpcyBzdGFydCBwb3NpdGlvbiBvZiBzeW5jZnJhbWUsCiAvLyB1cGRhdGUgbWV0YWRhdGEgb25seSBhcHBsaWNhYmxlLCBhbmQgcmV0dXJuIHRoZSBwYXlsb2FkIHNpemUKIHN0YXRpYyB1bnNpZ25lZCBwYXJzZUFDM1N5bmNGcmFtZSgKQEAgLTE5NSw4ICsyMTAsMTUzIEBACiAgICAgcmV0dXJuIHBheWxvYWRTaXplOwogfQogCi1zdGF0aWMgYm9vbCBJc1NlZW1pbmdseVZhbGlkQUMzSGVhZGVyKGNvbnN0IHVpbnQ4X3QgKnB0ciwgc2l6ZV90IHNpemUpIHsKLSAgICByZXR1cm4gcGFyc2VBQzNTeW5jRnJhbWUocHRyLCBzaXplLCBOVUxMKSA+IDA7CisvLyBQYXJzZSBFQUMzIGhlYWRlciBhc3N1bWluZyB0aGUgY3VycmVudCBwdHIgaXMgc3RhcnQgcG9zaXRpb24gb2Ygc3luY2ZyYW1lLAorLy8gdXBkYXRlIG1ldGFkYXRhIG9ubHkgYXBwbGljYWJsZSwgYW5kIHJldHVybiB0aGUgcGF5bG9hZCBzaXplCisvLyBBVFNDIEEvNTI6MjAxMiBFMi4zLjEKK3N0YXRpYyB1bnNpZ25lZCBwYXJzZUVBQzNTeW5jRnJhbWUoCisgICAgY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3Qgc2l6ZSwgc3A8TWV0YURhdGE+ICptZXRhRGF0YSkgeworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFubmVsQ291bnRUYWJsZVtdID0gezIsIDEsIDIsIDMsIDMsIDQsIDQsIDV9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGluZ1JhdGVUYWJsZVtdID0gezQ4MDAwLCA0NDEwMCwgMzIwMDB9OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGluZ1JhdGVUYWJsZTJbXSA9IHsyNDAwMCwgMjIwNTAsIDE2MDAwfTsKKworICAgIEFCaXRSZWFkZXIgYml0cyhwdHIsIHNpemUpOworICAgIGlmIChiaXRzLm51bUJpdHNMZWZ0KCkgPCAxNikgeworICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBiaXRzIGxlZnQgZm9yIGZ1cnRoZXIgcGFyc2luZyIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGJpdHMuZ2V0Qml0cygxNikgIT0gMHgwQjc3KSB7CisgICAgICAgIEFMT0dFKCJObyB2YWxpZCBzeW5jIHdvcmQgaW4gRUFDMyBoZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gd2UgcGFyc2UgdXAgdG8gYnNpZCBzbyB0aGVyZSBuZWVkcyB0byBiZSBhdCBsZWFzdCB0aGF0IG1hbnkgYml0cworICAgIGlmIChiaXRzLm51bUJpdHNMZWZ0KCkgPCAyICsgMyArIDExICsgMiArIDIgKyAzICsgMSArIDUpIHsKKyAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggYml0cyBsZWZ0IGZvciBmdXJ0aGVyIHBhcnNpbmciKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdW5zaWduZWQgc3RybXR5cCA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICBpZiAoc3RybXR5cCA9PSAzKSB7CisgICAgICAgIEFMT0dFKCJJbmNvcnJlY3Qgc3RybXR5cCBpbiBFQUMzIGhlYWRlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBzdWJzdHJlYW1pZCA9IGJpdHMuZ2V0Qml0cygzKTsKKyAgICAvLyBvbmx5IHRoZSBmaXJzdCBpbmRlcGVuZGVudCBzdHJlYW0gaXMgc3VwcG9ydGVkCisgICAgaWYgKChzdHJtdHlwID09IDAgfHwgc3RybXR5cCA9PSAyKSAmJiBzdWJzdHJlYW1pZCAhPSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHVuc2lnbmVkIGZybXNpeiA9IGJpdHMuZ2V0Qml0cygxMSk7CisgICAgdW5zaWduZWQgZnNjb2QgPSBiaXRzLmdldEJpdHMoMik7CisKKyAgICB1bnNpZ25lZCBzYW1wbGluZ1JhdGUgPSAwOworICAgIGlmIChmc2NvZCA9PSAweDMpIHsKKyAgICAgICAgdW5zaWduZWQgZnNjb2QyID0gYml0cy5nZXRCaXRzKDIpOworICAgICAgICBpZiAoZnNjb2QyID09IDMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJJbmNvcnJlY3QgZnNjb2QyIGluIEVBQzMgaGVhZGVyIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBzYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGVUYWJsZTJbZnNjb2QyXTsKKyAgICB9IGVsc2UgeworICAgICAgICBzYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGVUYWJsZVtmc2NvZF07CisgICAgICAgIHVuc2lnbmVkIG51bWJsa3Njb2QgX191bnVzZWQgPSBiaXRzLmdldEJpdHMoMik7CisgICAgfQorCisgICAgdW5zaWduZWQgYWNtb2QgPSBiaXRzLmdldEJpdHMoMyk7CisgICAgdW5zaWduZWQgbGZlb24gPSBiaXRzLmdldEJpdHMoMSk7CisgICAgdW5zaWduZWQgYnNpZCA9IGJpdHMuZ2V0Qml0cyg1KTsKKyAgICBpZiAoYnNpZCA8IDExIHx8IGJzaWQgPiAxNikgeworICAgICAgICBBTE9HVygiSW5jb3JyZWN0IGJzaWQgaW4gRUFDMyBoZWFkZXIuIENvdWxkIGJlIEFDLTMgb3Igc29tZSB1bmtub3duIEVBQzMgZm9ybWF0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIHdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgdGhlIGZpcnN0IGluZGVwZW5kYW50IHN0cmVhbQorICAgIGlmIChtZXRhRGF0YSAhPSBOVUxMICYmIChzdHJtdHlwID09IDAgfHwgc3RybXR5cCA9PSAyKSkgeworICAgICAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnRUYWJsZVthY21vZF0gKyBsZmVvbjsKKyAgICAgICAgQUxPR1YoIkVBQzMgY2hhbm5lbENvdW50ID0gJWQiLCBjaGFubmVsQ291bnQpOworICAgICAgICBBTE9HVigiRUFDMyBzYW1wbGluZ1JhdGUgPSAlZCIsIHNhbXBsaW5nUmF0ZSk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMyk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjaGFubmVsQ291bnQpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsaW5nUmF0ZSk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIH0KKworICAgIHVuc2lnbmVkIHBheWxvYWRTaXplID0gZnJtc2l6ICsgMTsKKyAgICBwYXlsb2FkU2l6ZSA8PD0gMTsgIC8vIGNvbnZlcnQgZnJvbSAxNi1iaXQgd29yZHMgdG8gYnl0ZXMKKworICAgIHJldHVybiBwYXlsb2FkU2l6ZTsKK30KKworLy8gUGFyc2UgQUM0IGhlYWRlciBhc3N1bWluZyB0aGUgY3VycmVudCBwdHIgaXMgc3RhcnQgcG9zaXRpb24gb2Ygc3luY2ZyYW1lCisvLyBhbmQgdXBkYXRlIGZyYW1lU2l6ZSBhbmQgbWV0YWRhdGEuCitzdGF0aWMgc3RhdHVzX3QgcGFyc2VBQzRTeW5jRnJhbWUoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciwgc2l6ZV90IHNpemUsIHVuc2lnbmVkICZmcmFtZVNpemUsIHNwPE1ldGFEYXRhPiAqbWV0YURhdGEpIHsKKyAgICAvLyBFVFNJIFRTIDEwMyAxOTAtMiBWMS4xLjEgKDIwMTUtMDkpLCBBbm5leCBDCisgICAgLy8gVGhlIHN5bmNfd29yZCBjYW4gYmUgZWl0aGVyIDB4QUM0MCBvciAweEFDNDEuCisgICAgc3RhdGljIGNvbnN0IGludCBrU3luY1dvcmRBQzQwID0gMHhBQzQwOworICAgIHN0YXRpYyBjb25zdCBpbnQga1N5bmNXb3JkQUM0MSA9IDB4QUM0MTsKKworICAgIHNpemVfdCBoZWFkZXJTaXplID0gMDsKKyAgICBBQml0UmVhZGVyIGJpdHMocHRyLCBzaXplKTsKKyAgICBpbnQzMl90IHN5bmNXb3JkID0gYml0cy5nZXRCaXRzKDE2KTsKKyAgICBpZiAoKHN5bmNXb3JkICE9IGtTeW5jV29yZEFDNDApICYmIChzeW5jV29yZCAhPSBrU3luY1dvcmRBQzQxKSkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBzeW5jd29yZCBpbiBBQzQgaGVhZGVyIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGhlYWRlclNpemUgKz0gMjsKKworICAgIGZyYW1lU2l6ZSA9IGJpdHMuZ2V0Qml0cygxNik7CisgICAgaGVhZGVyU2l6ZSArPSAyOworICAgIGlmIChmcmFtZVNpemUgPT0gMHhGRkZGKSB7CisgICAgICAgIGZyYW1lU2l6ZSA9IGJpdHMuZ2V0Qml0cygyNCk7CisgICAgICAgIGhlYWRlclNpemUgKz0gMzsKKyAgICB9CisKKyAgICBpZiAoZnJhbWVTaXplID09IDApIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgZnJhbWUgc2l6ZSBpbiBBQzQgaGVhZGVyIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGZyYW1lU2l6ZSArPSBoZWFkZXJTaXplOworICAgIC8vIElmIHRoZSBzeW5jX3dvcmQgaXMgMHhBQzQxLCBhIGNyY193b3JkIGlzIGFsc28gdHJhbnNtaXR0ZWQuCisgICAgaWYgKHN5bmNXb3JkID09IGtTeW5jV29yZEFDNDEpIHsKKyAgICAgICAgZnJhbWVTaXplICs9IDI7IC8vIGNyY193b3JkCisgICAgfQorICAgIEFMT0dWKCJBQzQgZnJhbWVTaXplID0gJXUiLCBmcmFtZVNpemUpOworCisgICAgLy8gRVRTSSBUUyAxMDMgMTkwLTIgVjEuMS4xIDYuMi4xLjEKKyAgICB1aW50MzJfdCBiaXRzdHJlYW1WZXJzaW9uID0gYml0cy5nZXRCaXRzKDIpOworICAgIGlmIChiaXRzdHJlYW1WZXJzaW9uID09IDMpIHsKKyAgICAgICAgYml0c3RyZWFtVmVyc2lvbiArPSByZWFkVmFyaWFibGVCaXRzKGJpdHMsIDIpOworICAgIH0KKworICAgIGJpdHMuc2tpcEJpdHMoMTApOyAvLyBTZXF1ZW5jZSBDb3VudGVyCisKKyAgICB1aW50MzJfdCBiV2FpdEZyYW1lcyA9IGJpdHMuZ2V0Qml0cygxKTsKKyAgICBpZiAoYldhaXRGcmFtZXMpIHsKKyAgICAgICAgdWludDMyX3Qgd2FpdEZyYW1lcyA9IGJpdHMuZ2V0Qml0cygzKTsKKyAgICAgICAgaWYgKHdhaXRGcmFtZXMgPiAwKSB7CisgICAgICAgICAgICBiaXRzLnNraXBCaXRzKDIpOyAvLyBicl9jb2RlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRVRTSSBUUyAxMDMgMTkwIFYxLjEuMSBUYWJsZSA4MgorICAgIGJvb2wgZnNJbmRleCA9IGJpdHMuZ2V0Qml0cygxKTsKKyAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBmc0luZGV4ID8gNDgwMDAgOiA0NDEwMDsKKworICAgIGlmIChtZXRhRGF0YSAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdEFDNCBTZXR0aW5nIG1Gb3JtYXQiKTsKKyAgICAgICAgKCptZXRhRGF0YSktPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgLy8gW0ZJWE1FXSBBQzQgY2hhbm5lbCBjb3VudCBpcyBkZWZpbmVkIHBlciBwcmVzZW50YXRpb24uIFByb3ZpZGUgYSBkZWZhdWx0IGNoYW5uZWwgY291bnQKKyAgICAgICAgLy8gYXMgc3RlcmVvIGZvciB0aGUgZW50aXJlIHN0cmVhbS4KKyAgICAgICAgKCptZXRhRGF0YSktPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIDIpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsaW5nUmF0ZSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIHN0YXR1c190IElzU2VlbWluZ2x5VmFsaWRBQzRIZWFkZXIoY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgJmZyYW1lU2l6ZSkgeworICAgIHJldHVybiBwYXJzZUFDNFN5bmNGcmFtZShwdHIsIHNpemUsIGZyYW1lU2l6ZSwgTlVMTCk7CiB9CiAKIHN0YXRpYyBib29sIElzU2VlbWluZ2x5VmFsaWRBRFRTSGVhZGVyKApAQCAtMjc5LDcgKzQzOSw4IEBACiAgICAgICAgIEFMT0dFKCJhcHBlbmRpbmcgZGF0YSBhZnRlciBFT1MiKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9Ci0gICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQnVmZmVyLT5zaXplKCkgPT0gMCkgeworCisgICAgaWYgKCFpc1NjcmFtYmxlZCgpICYmIChtQnVmZmVyID09IE5VTEwgfHwgbUJ1ZmZlci0+c2l6ZSgpID09IDApKSB7CiAgICAgICAgIHN3aXRjaCAobU1vZGUpIHsKICAgICAgICAgICAgIGNhc2UgSDI2NDoKICAgICAgICAgICAgIGNhc2UgTVBFR19WSURFTzoKQEAgLTM5MCwxMiArNTUxLDE5IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNhc2UgQUMzOgorICAgICAgICAgICAgY2FzZSBFQUMzOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciA9ICh1aW50OF90ICopZGF0YTsKIAogICAgICAgICAgICAgICAgIHNzaXplX3Qgc3RhcnRPZmZzZXQgPSAtMTsKICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoSXNTZWVtaW5nbHlWYWxpZEFDM0hlYWRlcigmcHRyW2ldLCBzaXplIC0gaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcGF5bG9hZFNpemUgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAobU1vZGUgPT0gQUMzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlQUMzU3luY0ZyYW1lKCZwdHJbaV0sIHNpemUgLSBpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtTW9kZSA9PSBFQUMzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlRUFDM1N5bmNGcmFtZSgmcHRyW2ldLCBzaXplIC0gaSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBheWxvYWRTaXplID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTQwNiw3ICs1NzQsNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIEFDMyBzeW5jd29yZCBhdCAiCisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBzb21ldGhpbmcgcmVzZW1ibGluZyBhbiAoRSlBQzMgc3luY3dvcmQgYXQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0ICV6ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0KTsKICAgICAgICAgICAgICAgICB9CkBAIC00MTYsNiArNTg0LDQzIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGNhc2UgQUM0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciA9ICh1aW50OF90ICopZGF0YTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBmcmFtZVNpemUgPSAwOworICAgICAgICAgICAgICAgIHNzaXplX3Qgc3RhcnRPZmZzZXQgPSAtMTsKKworICAgICAgICAgICAgICAgIC8vIEEgdmFsaWQgQUM0IHN0cmVhbSBzaG91bGQgaGF2ZSBtaW5pbXVtIG9mIDcgYnl0ZXMgaW4gaXRzIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAvLyAoU3luYyBoZWFkZXIgNCBieXRlcyArIEFDNCB0b2MgMyBieXRlcykKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IDcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKElzU2VlbWluZ2x5VmFsaWRBQzRIZWFkZXIoJnB0cltpXSwgc2l6ZSAtIGksIGZyYW1lU2l6ZSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIEFDNCBzeW5jd29yZCBhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQgJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZnJhbWVTaXplICE9IHNpemUgLSBzdGFydE9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQUM0IGZyYW1lIHNpemUgaXMgJXUgYnl0ZXMsIHdoaWxlIHRoZSBidWZmZXIgc2l6ZSBpcyAlemQgYnl0ZXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplLCBzaXplIC0gc3RhcnRPZmZzZXQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRhdGEgPSAmcHRyW3N0YXJ0T2Zmc2V0XTsKKyAgICAgICAgICAgICAgICBzaXplIC09IHN0YXJ0T2Zmc2V0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBjYXNlIE1QRUdfQVVESU86CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilkYXRhOwpAQCAtNDk0LDYgKzY5OSw3IEBACiAKIHZvaWQgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjphcHBlbmRTY3JhbWJsZWREYXRhKAogICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgc2l6ZV90IGxlYWRpbmdDbGVhckJ5dGVzLAogICAgICAgICBpbnQzMl90IGtleUlkLCBib29sIGlzU3luYywKICAgICAgICAgc3A8QUJ1ZmZlcj4gY2xlYXJTaXplcywgc3A8QUJ1ZmZlcj4gZW5jU2l6ZXMpIHsKICAgICBpZiAoIWlzU2NyYW1ibGVkKCkpIHsKQEAgLTUyMSw2ICs3MjcsNyBAQAogCiAgICAgU2NyYW1ibGVkUmFuZ2VJbmZvIHNjcmFtYmxlZEluZm87CiAgICAgc2NyYW1ibGVkSW5mby5tTGVuZ3RoID0gc2l6ZTsKKyAgICBzY3JhbWJsZWRJbmZvLm1MZWFkaW5nQ2xlYXJCeXRlcyA9IGxlYWRpbmdDbGVhckJ5dGVzOwogICAgIHNjcmFtYmxlZEluZm8ubUtleUlkID0ga2V5SWQ7CiAgICAgc2NyYW1ibGVkSW5mby5tSXNTeW5jID0gaXNTeW5jOwogICAgIHNjcmFtYmxlZEluZm8ubUNsZWFyU2l6ZXMgPSBjbGVhclNpemVzOwpAQCAtNTMzLDcgKzc0MCw2IEBACiAKIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZVNjcmFtYmxlZEFjY2Vzc1VuaXQoKSB7CiAgICAgc2l6ZV90IG5leHRTY2FuID0gbUJ1ZmZlci0+c2l6ZSgpOwotICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOwogICAgIGludDMyX3QgcGVzT2Zmc2V0ID0gMCwgcGVzU2NyYW1ibGluZ0NvbnRyb2wgPSAwOwogICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAobmV4dFNjYW4sICZwZXNPZmZzZXQsICZwZXNTY3JhbWJsaW5nQ29udHJvbCk7CiAgICAgaWYgKHRpbWVVcyA8IDBsbCkgewpAQCAtNTQ0LDYgKzc1MCw3IEBACiAgICAgLy8gcmV0dXJuIHNjcmFtYmxlZCB1bml0CiAgICAgaW50MzJfdCBrZXlJZCA9IHBlc1NjcmFtYmxpbmdDb250cm9sLCBpc1N5bmMgPSAwLCBzY3JhbWJsZWRMZW5ndGggPSAwOwogICAgIHNwPEFCdWZmZXI+IGNsZWFyU2l6ZXMsIGVuY1NpemVzOworICAgIHNpemVfdCBsZWFkaW5nQ2xlYXJCeXRlczsKICAgICB3aGlsZSAobVNjcmFtYmxlZFJhbmdlSW5mb3Muc2l6ZSgpID4gbVJhbmdlSW5mb3Muc2l6ZSgpKSB7CiAgICAgICAgIGF1dG8gaXQgPSBtU2NyYW1ibGVkUmFuZ2VJbmZvcy5iZWdpbigpOwogICAgICAgICBBTE9HVigiW3N0cmVhbSAlZF0gZmV0Y2hpbmcgc2NyYW1ibGVkIHJhbmdlOiBzaXplPSV6dSIsIG1Nb2RlLCBpdC0+bUxlbmd0aCk7CkBAIC01NjEsNiArNzY4LDcgQEAKICAgICAgICAgY2xlYXJTaXplcyA9IGl0LT5tQ2xlYXJTaXplczsKICAgICAgICAgZW5jU2l6ZXMgPSBpdC0+bUVuY1NpemVzOwogICAgICAgICBpc1N5bmMgPSBpdC0+bUlzU3luYzsKKyAgICAgICAgbGVhZGluZ0NsZWFyQnl0ZXMgPSBpdC0+bUxlYWRpbmdDbGVhckJ5dGVzOwogICAgICAgICBtU2NyYW1ibGVkUmFuZ2VJbmZvcy5lcmFzZShpdCk7CiAgICAgfQogICAgIGlmIChzY3JhbWJsZWRMZW5ndGggPT0gMCkgewpAQCAtNTY4LDI2ICs3NzYsNzQgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgLy8gc2tpcCB0aGUgUEVTIGhlYWRlciwgYW5kIGNvcHkgdGhlIHJlc3QgaW50byBzY3JhbWJsZWQgYWNjZXNzIHVuaXQKLSAgICBzcDxBQnVmZmVyPiBzY3JhbWJsZWRBY2Nlc3NVbml0ID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KAotICAgICAgICAgICAgbVNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpICsgcGVzT2Zmc2V0LAotICAgICAgICAgICAgc2NyYW1ibGVkTGVuZ3RoIC0gcGVzT2Zmc2V0KTsKLQotICAgIC8vIGZpeCB1cCBmaXJzdCBzYW1wbGUgc2l6ZSBhZnRlciBza2lwcGluZyB0aGUgUEVTIGhlYWRlcgotICAgIGlmIChwZXNPZmZzZXQgPiAwKSB7Ci0gICAgICAgIGludDMyX3QgJmZpcnN0Q2xlYXJTaXplID0gKihpbnQzMl90KiljbGVhclNpemVzLT5kYXRhKCk7Ci0gICAgICAgIGludDMyX3QgJmZpcnN0RW5jU2l6ZSA9ICooaW50MzJfdCopZW5jU2l6ZXMtPmRhdGEoKTsKLSAgICAgICAgLy8gQ3V0IGF3YXkgdGhlIFBFUyBoZWFkZXIKLSAgICAgICAgaWYgKGZpcnN0Q2xlYXJTaXplID49IHBlc09mZnNldCkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBmb3IgVFMtbGV2ZWwgc2NyYW1ibGluZywgd2UgZGVzY3JhbWJsZWQgdGhlIGZpcnN0Ci0gICAgICAgICAgICAvLyAob3IgaXQgd2FzIGNsZWFyIHRvIGJlZ2luIHdpdGgpCi0gICAgICAgICAgICBmaXJzdENsZWFyU2l6ZSAtPSBwZXNPZmZzZXQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmlyc3RFbmNTaXplID49IHBlc09mZnNldCkgewotICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBiZSBQRVMtbGV2ZWwgc2NyYW1ibGluZwotICAgICAgICAgICAgZmlyc3RFbmNTaXplIC09IHBlc09mZnNldDsKLSAgICAgICAgfQorICAgIC8vIFJldHJpZXZlIHRoZSBsZWFkaW5nIGNsZWFyIGJ5dGVzIGluZm8sIGFuZCB1c2UgaXQgdG8gc2V0IHRoZSBjbGVhcgorICAgIC8vIHJhbmdlIG9uIG1CdWZmZXIuIE5vdGUgdGhhdCB0aGUgbGVhZGluZyBjbGVhciBieXRlcyBpbmNsdWRlcyB0aGUKKyAgICAvLyBQRVMgaGVhZGVyIHBvcnRpb24sIHdoaWxlIG1CdWZmZXIgZG9lc24ndC4KKyAgICBpZiAoKGludDMyX3QpbGVhZGluZ0NsZWFyQnl0ZXMgPiBwZXNPZmZzZXQpIHsKKyAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbGVhZGluZ0NsZWFyQnl0ZXMgLSBwZXNPZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOwogICAgIH0KIAorICAgIC8vIFRyeSB0byBwYXJzZSBmb3JtYXRzLCBhbmQgaWYgdW5hdmFpbGFibGUgc2V0IHVwIGEgZHVtbXkgZm9ybWF0LgorICAgIC8vIE9ubHkgc3VwcG9ydCB0aGUgZm9sbG93aW5nIG1vZGVzIGZvciBzY3JhbWJsZWQgY29udGVudCBmb3Igbm93LgorICAgIC8vICh3aWxsIGJlIGV4cGFuZGVkIGxhdGVyKS4KKyAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7CisgICAgICAgIHN3aXRjaCAobU1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgSDI2NDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIU1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICptRm9ybWF0LCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIkNyZWF0aW5nIGR1bW15IEFWQyBmb3JtYXQgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7CisKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlXaWR0aCwgMTI4MCk7CisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIDcyMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBQUM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAqbUZvcm1hdCwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJDcmVhdGluZyBkdW1teSBBQUMgZm9ybWF0IGZvciBzY3JhbWJsZWQgY29udGVudCIpOworCisgICAgICAgICAgICAgICAgICAgIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgqbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8qcHJvZmlsZSovLCA3IC8qc2FtcGxpbmdfZnJlcV9pbmRleCovLCAxIC8qY2hhbm5lbF9jb25maWcqLyk7CisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlJc0FEVFMsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNUEVHX1ZJREVPOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFMT0dJKCJDcmVhdGluZyBkdW1teSBNUEVHIGZvcm1hdCBmb3Igc2NyYW1ibGVkIGNvbnRlbnQiKTsKKworICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7CisgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCAxMjgwKTsKKyAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SGVpZ2h0LCA3MjApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBtb2RlIGZvciBzY3JhbWJsZWQgY29udGVudCIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZm9yIE1lZGlhRXh0cmFjdG9yLkNhc0luZm8KKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIG1DQVN5c3RlbUlkKTsKKyAgICAgICAgbUZvcm1hdC0+c2V0RGF0YShrS2V5Q0FTZXNzaW9uSUQsCisgICAgICAgICAgICAgICAgMCwgbUNhc1Nlc3Npb25JZC5kYXRhKCksIG1DYXNTZXNzaW9uSWQuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKworICAgIC8vIGNvcHkgaW50byBzY3JhbWJsZWQgYWNjZXNzIHVuaXQKKyAgICBzcDxBQnVmZmVyPiBzY3JhbWJsZWRBY2Nlc3NVbml0ID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KAorICAgICAgICAgICAgbVNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLCBzY3JhbWJsZWRMZW5ndGgpOworCiAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKICAgICBpZiAoaXNTeW5jKSB7CiAgICAgICAgIHNjcmFtYmxlZEFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImlzU3luYyIsIDEpOwpAQCAtNjAwLDYgKzg1Niw3IEBACiAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiY3J5cHRvS2V5Iiwga2V5SWQpOwogICAgIHNjcmFtYmxlZEFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0QnVmZmVyKCJjbGVhckJ5dGVzIiwgY2xlYXJTaXplcyk7CiAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRCdWZmZXIoImVuY0J5dGVzIiwgZW5jU2l6ZXMpOworICAgIHNjcmFtYmxlZEFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoInBlc09mZnNldCIsIHBlc09mZnNldCk7CiAKICAgICBtZW1tb3ZlKG1TY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwKICAgICAgICAgICAgIG1TY3JhbWJsZWRCdWZmZXItPmRhdGEoKSArIHNjcmFtYmxlZExlbmd0aCwKQEAgLTYxNCw3ICs4NzEsMTEgQEAKIH0KIAogc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdCgpIHsKLSAgICBpZiAoKG1GbGFncyAmIGtGbGFnX0FsaWduZWREYXRhKSAmJiBtTW9kZSA9PSBIMjY0ICYmICFpc1NjcmFtYmxlZCgpKSB7CisgICAgaWYgKGlzU2NyYW1ibGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIGRlcXVldWVTY3JhbWJsZWRBY2Nlc3NVbml0KCk7CisgICAgfQorCisgICAgaWYgKChtRmxhZ3MgJiBrRmxhZ19BbGlnbmVkRGF0YSkgJiYgbU1vZGUgPT0gSDI2NCkgewogICAgICAgICBpZiAobVJhbmdlSW5mb3MuZW1wdHkoKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTY0OCw3ICs5MDksMTAgQEAKICAgICAgICAgY2FzZSBBQUM6CiAgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRBQUMoKTsKICAgICAgICAgY2FzZSBBQzM6Ci0gICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRBQzMoKTsKKyAgICAgICAgY2FzZSBFQUMzOgorICAgICAgICAgICAgcmV0dXJuIGRlcXVldWVBY2Nlc3NVbml0RUFDMygpOworICAgICAgICBjYXNlIEFDNDoKKyAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdEFDNCgpOwogICAgICAgICBjYXNlIE1QRUdfVklERU86CiAgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHVmlkZW8oKTsKICAgICAgICAgY2FzZSBNUEVHNF9WSURFTzoKQEAgLTY2NiwzNCArOTMwLDM4IEBACiAgICAgfQogfQogCi1zcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0QUMzKCkgeworc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdEVBQzMoKSB7CiAgICAgdW5zaWduZWQgc3luY1N0YXJ0UG9zID0gMDsgIC8vIGluIGJ5dGVzCiAgICAgdW5zaWduZWQgcGF5bG9hZFNpemUgPSAwOwogICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBuZXcgTWV0YURhdGE7CiAKLSAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRfQUMzWyVkXTogbUJ1ZmZlciAlcCglenUpIiwgbUFVSW5kZXgsIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRFQUMzWyVkXTogbUJ1ZmZlciAlcCglenUpIiwgbUFVSW5kZXgsCisgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7CiAKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICBpZiAoc3luY1N0YXJ0UG9zICsgMiA+PSBtQnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKLSAgICAgICAgcGF5bG9hZFNpemUgPSBwYXJzZUFDM1N5bmNGcmFtZSgKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCkgKyBzeW5jU3RhcnRQb3MsCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2l6ZSgpIC0gc3luY1N0YXJ0UG9zLAotICAgICAgICAgICAgICAgICZmb3JtYXQpOworICAgICAgICB1aW50OF90ICpwdHIgPSBtQnVmZmVyLT5kYXRhKCkgKyBzeW5jU3RhcnRQb3M7CisgICAgICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlci0+c2l6ZSgpIC0gc3luY1N0YXJ0UG9zOworICAgICAgICBpZiAobU1vZGUgPT0gQUMzKSB7CisgICAgICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlQUMzU3luY0ZyYW1lKHB0ciwgc2l6ZSwgJmZvcm1hdCk7CisgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gRUFDMykgeworICAgICAgICAgICAgcGF5bG9hZFNpemUgPSBwYXJzZUVBQzNTeW5jRnJhbWUocHRyLCBzaXplLCAmZm9ybWF0KTsKKyAgICAgICAgfQogICAgICAgICBpZiAocGF5bG9hZFNpemUgPiAwKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdF9BQzNbJWRdOiBzeW5jU3RhcnRQb3MgJXUgcGF5bG9hZFNpemUgJXUiLAorICAgICAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRFQUMzWyVkXTogc3luY1N0YXJ0UG9zICV1IHBheWxvYWRTaXplICV1IiwKICAgICAgICAgICAgICAgICBtQVVJbmRleCwgc3luY1N0YXJ0UG9zLCBwYXlsb2FkU2l6ZSk7CiAKICAgICAgICAgKytzeW5jU3RhcnRQb3M7CiAgICAgfQogCiAgICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKSB7Ci0gICAgICAgIEFMT0dWKCJOb3QgZW5vdWdoIGJ1ZmZlciBzaXplIGZvciBBQzMiKTsKKyAgICAgICAgQUxPR1YoIk5vdCBlbm91Z2ggYnVmZmVyIHNpemUgZm9yIEUvQUMzIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtNzAxLDcgKzk2OSw2IEBACiAgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CiAgICAgfQogCi0KICAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKTsKICAgICBpZiAodGltZVVzIDwgMGxsKSB7CiAgICAgICAgIEFMT0dFKCJuZWdhdGl2ZSB0aW1lVXMiKTsKQEAgLTcxMCw3ICs5NzcsMTIgQEAKIAogICAgIC8vIE5vdCBkZWNyeXB0aW5nIGlmIGtleSBpbmZvIG5vdCBhdmFpbGFibGUgKGUuZy4sIHNjYW5uZXIvZXh0cmFjdG9yIHBhcnNpbmcgdHMgZmlsZXMpCiAgICAgaWYgKG1TYW1wbGVEZWNyeXB0b3IgIT0gTlVMTCkgewotICAgICAgICBtU2FtcGxlRGVjcnlwdG9yLT5wcm9jZXNzQUMzKG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvcywgcGF5bG9hZFNpemUpOworICAgICAgICBpZiAobU1vZGUgPT0gQUMzKSB7CisgICAgICAgICAgICBtU2FtcGxlRGVjcnlwdG9yLT5wcm9jZXNzQUMzKG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvcywgcGF5bG9hZFNpemUpOworICAgICAgICB9IGVsc2UgaWYgKG1Nb2RlID09IEVBQzMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFQUMzIEFVIGlzIGVuY3J5cHRlZCBhbmQgZGVjcnlwdGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogICAgIH0KICAgICBtQVVJbmRleCsrOwogCkBAIC03MzAsNiArMTAwMiw2OSBAQAogICAgIHJldHVybiBhY2Nlc3NVbml0OwogfQogCitzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0QUM0KCkgeworICAgIHVuc2lnbmVkIHN5bmNTdGFydFBvcyA9IDA7CisgICAgdW5zaWduZWQgcGF5bG9hZFNpemUgPSAwOworICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBuZXcgTWV0YURhdGE7CisgICAgQUxPR1YoImRlcXVldWVBY2Nlc3NVbml0X0FDNFslZF06IG1CdWZmZXIgJXAoJXp1KSIsIG1BVUluZGV4LCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7CisKKyAgICAvLyBBIHZhbGlkIEFDNCBzdHJlYW0gc2hvdWxkIGhhdmUgbWluaW11bSBvZiA3IGJ5dGVzIGluIGl0cyBidWZmZXIuCisgICAgLy8gKFN5bmMgaGVhZGVyIDQgYnl0ZXMgKyBBQzQgdG9jIDMgYnl0ZXMpCisgICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IDcpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKHN5bmNTdGFydFBvcyArIDIgPj0gbUJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcnNlQUM0U3luY0ZyYW1lKAorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCkgKyBzeW5jU3RhcnRQb3MsCisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnNpemUoKSAtIHN5bmNTdGFydFBvcywKKyAgICAgICAgICAgICAgICAgICAgcGF5bG9hZFNpemUsCisgICAgICAgICAgICAgICAgICAgICZmb3JtYXQpOworICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdF9BQzRbJWRdOiBzeW5jU3RhcnRQb3MgJXUgcGF5bG9hZFNpemUgJXUiLAorICAgICAgICAgICAgICAgIG1BVUluZGV4LCBzeW5jU3RhcnRQb3MsIHBheWxvYWRTaXplKTsKKworICAgICAgICArK3N5bmNTdGFydFBvczsKKyAgICB9CisKKyAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpIHsKKyAgICAgICAgQUxPR1YoIk5vdCBlbm91Z2ggYnVmZmVyIHNpemUgZm9yIEFDNCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChzeW5jU3RhcnRQb3MgKyBwYXlsb2FkU2l6ZSk7CisgICAgaWYgKHRpbWVVcyA8IDBsbCkgeworICAgICAgICBBTE9HRSgibmVnYXRpdmUgdGltZVVzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtQVVJbmRleCsrOworCisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKTsKKyAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCksIHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKTsKKworICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiaXNTeW5jIiwgMSk7CisKKyAgICBtZW1tb3ZlKAorICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpLAorICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpICsgc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUsCisgICAgICAgICAgICBtQnVmZmVyLT5zaXplKCkgLSBzeW5jU3RhcnRQb3MgLSBwYXlsb2FkU2l6ZSk7CisKKyAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgLSBzeW5jU3RhcnRQb3MgLSBwYXlsb2FkU2l6ZSk7CisgICAgcmV0dXJuIGFjY2Vzc1VuaXQ7Cit9CisKIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRQQ01BdWRpbygpIHsKICAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgNCkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTg1MSwyNSArMTE4NiwxMSBAQAogICAgICAgICBib29sIHByb3RlY3Rpb25fYWJzZW50ID0gYml0cy5nZXRCaXRzKDEpICE9IDA7CiAKICAgICAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgewotICAgICAgICAgICAgdW5zaWduZWQgcHJvZmlsZSA9IGJpdHMuZ2V0Qml0cygyKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlID09IDN1KSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoInByb2ZpbGUgc2hvdWxkIG5vdCBiZSAzIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4ID0gYml0cy5nZXRCaXRzKDQpOwotICAgICAgICAgICAgYml0cy5nZXRCaXRzKDEpOyAgLy8gcHJpdmF0ZV9iaXQKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbiA9IGJpdHMuZ2V0Qml0cygzKTsKLSAgICAgICAgICAgIGlmIChjaGFubmVsX2NvbmZpZ3VyYXRpb24gPT0gMHUpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiY2hhbm5lbF9jb25maWcgc2hvdWxkIG5vdCBiZSAwIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiaXRzLnNraXBCaXRzKDIpOyAgLy8gb3JpZ2luYWxfY29weSwgaG9tZQotCiAgICAgICAgICAgICBtRm9ybWF0ID0gbmV3IE1ldGFEYXRhOwotICAgICAgICAgICAgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKCptRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICBwcm9maWxlLCBzYW1wbGluZ19mcmVxX2luZGV4LCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pOwotCi0gICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SXNBRFRTLCB0cnVlKTsKKyAgICAgICAgICAgIGlmICghTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICAgICAgICAgICAgICAqbUZvcm1hdCwgbUJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LCBtQnVmZmVyLT5zaXplKCkgLSBvZmZzZXQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKICAgICAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7CkBAIC04ODQsMTIgKzEyMDUsMTIgQEAKIAogICAgICAgICAgICAgQUxPR0koImZvdW5kIEFBQyBjb2RlYyBjb25maWcgKCVkIEh6LCAlZCBjaGFubmVscykiLAogICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBwcm9maWxlX09iamVjdFR5cGUsIHNhbXBsaW5nX2ZyZXF1ZW5jeV9pbmRleCwgcHJpdmF0ZV9iaXRzLAotICAgICAgICAgICAgLy8gY2hhbm5lbF9jb25maWd1cmF0aW9uLCBvcmlnaW5hbF9jb3B5LCBob21lCi0gICAgICAgICAgICBiaXRzLnNraXBCaXRzKDEyKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIHByb2ZpbGVfT2JqZWN0VHlwZSwgc2FtcGxpbmdfZnJlcXVlbmN5X2luZGV4LCBwcml2YXRlX2JpdHMsCisgICAgICAgIC8vIGNoYW5uZWxfY29uZmlndXJhdGlvbiwgb3JpZ2luYWxfY29weSwgaG9tZQorICAgICAgICBiaXRzLnNraXBCaXRzKDEyKTsKKwogICAgICAgICAvLyBhZHRzX3ZhcmlhYmxlX2hlYWRlcgogCiAgICAgICAgIC8vIGNvcHlyaWdodF9pZGVudGlmaWNhdGlvbl9iaXQsIGNvcHlyaWdodF9pZGVudGlmaWNhdGlvbl9zdGFydApAQCAtMTAwNCwyNyArMTMyNSw2IEBACiB9CiAKIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRIMjY0KCkgewotICAgIGlmIChpc1NjcmFtYmxlZCgpKSB7Ci0gICAgICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgbUJ1ZmZlci0+c2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgICAgICBpZiAoIU1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgqbUZvcm1hdCwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkNyZWF0aW5nIGR1bW15IEFWQyBmb3JtYXQgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7Ci0gICAgICAgICAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKLSAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIDEyODApOwotICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIDcyMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBmb3IgTWVkaWFFeHRyYWN0b3IuQ2FzSW5mbwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIG1DQVN5c3RlbUlkKTsKLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldERhdGEoa0tleUNBU2Vzc2lvbklELCAwLAotICAgICAgICAgICAgICAgICAgICBtQ2FzU2Vzc2lvbklkLmRhdGEoKSwgbUNhc1Nlc3Npb25JZC5zaXplKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZXF1ZXVlU2NyYW1ibGVkQWNjZXNzVW5pdCgpOwotICAgIH0KLQogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBtQnVmZmVyLT5kYXRhKCk7CiAKICAgICBzaXplX3Qgc2l6ZSA9IG1CdWZmZXItPnNpemUoKTsKQEAgLTEyMjYsNiArMTUyNiw3IEBACiAgICAgICAgICAgICAgICAgaGVhZGVyLCAmZnJhbWVTaXplLCAmc2FtcGxpbmdSYXRlLCAmbnVtQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgJmJpdHJhdGUsICZudW1TYW1wbGVzKSkgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBhdWRpbyBmcmFtZSBzaXplIik7CisgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTEyNTAsNiArMTU1MSwyMiBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKKyAgICBpZiAobUZvcm1hdCAhPSBOVUxMKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgIGlmIChtRm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSkgeworICAgICAgICAgICAgaWYgKChsYXllciA9PSAxKSAmJiBzdHJjbXAgKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQXVkaW8gbGF5ZXIgaXMgbm90IE1QRUdfTEFZRVJfSSIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfSBlbHNlIGlmICgobGF5ZXIgPT0gMikgJiYgc3RyY21wIChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpbyBsYXllciBpcyBub3QgTVBFR19MQVlFUl9JSSIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfSBlbHNlIGlmICgobGF5ZXIgPT0gMykgJiYgc3RyY21wIChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpbyBsYXllciBpcyBub3QgQVVESU9fTVBFRyIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJpc1N5bmMiLCAxKTsKIApAQCAtMTMyNCwyNSArMTY0MSw2IEBACiB9CiAKIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHVmlkZW8oKSB7Ci0gICAgaWYgKGlzU2NyYW1ibGVkKCkpIHsKLSAgICAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQnVmZmVyLT5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0koIkNyZWF0aW5nIGR1bW15IE1QRUcgZm9ybWF0IGZvciBzY3JhbWJsZWQgY29udGVudCIpOwotICAgICAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7Ci0gICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIDEyODApOwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgNzIwKTsKLQotICAgICAgICAgICAgLy8gZm9yIE1lZGlhRXh0cmFjdG9yLkNhc0luZm8KLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlDQVN5c3RlbUlELCBtQ0FTeXN0ZW1JZCk7Ci0gICAgICAgICAgICBtRm9ybWF0LT5zZXREYXRhKGtLZXlDQVNlc3Npb25JRCwgMCwKLSAgICAgICAgICAgICAgICAgICAgbUNhc1Nlc3Npb25JZC5kYXRhKCksIG1DYXNTZXNzaW9uSWQuc2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVxdWV1ZVNjcmFtYmxlZEFjY2Vzc1VuaXQoKTsKLSAgICB9Ci0KICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gbUJ1ZmZlci0+ZGF0YSgpOwogICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlci0+c2l6ZSgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCmluZGV4IGZmY2I1MDIuLjMyMjdmNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCkBAIC0zOCw2ICszOCw4IEBACiAgICAgICAgIEgyNjQsCiAgICAgICAgIEFBQywKICAgICAgICAgQUMzLAorICAgICAgICBFQUMzLAorICAgICAgICBBQzQsCiAgICAgICAgIE1QRUdfQVVESU8sCiAgICAgICAgIE1QRUdfVklERU8sCiAgICAgICAgIE1QRUc0X1ZJREVPLApAQCAtNTksNiArNjEsNyBAQAogCiAgICAgdm9pZCBhcHBlbmRTY3JhbWJsZWREYXRhKAogICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICBzaXplX3QgbGVhZGluZ0NsZWFyQnl0ZXMsCiAgICAgICAgICAgICBpbnQzMl90IGtleUlkLCBib29sIGlzU3luYywKICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNsZWFyU2l6ZXMsIHNwPEFCdWZmZXI+IGVuY1NpemVzKTsKIApAQCAtODQsOCArODcsOCBAQAogICAgIH07CiAKICAgICBzdHJ1Y3QgU2NyYW1ibGVkUmFuZ2VJbmZvIHsKLSAgICAgICAgLy9pbnQ2NF90IG1UaW1lc3RhbXBVczsKICAgICAgICAgc2l6ZV90IG1MZW5ndGg7CisgICAgICAgIHNpemVfdCBtTGVhZGluZ0NsZWFyQnl0ZXM7CiAgICAgICAgIGludDMyX3QgbUtleUlkOwogICAgICAgICBpbnQzMl90IG1Jc1N5bmM7CiAgICAgICAgIHNwPEFCdWZmZXI+IG1DbGVhclNpemVzOwpAQCAtMTE1LDcgKzExOCw4IEBACiAKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdEgyNjQoKTsKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdEFBQygpOwotICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0QUMzKCk7CisgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRFQUMzKCk7CisgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRBQzQoKTsKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUdBdWRpbygpOwogICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0TVBFR1ZpZGVvKCk7CiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHNFZpZGVvKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAKaW5kZXggNGUyZDM5OC4uMTIxYmIxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcApAQCAtMTI0LDExICsxMjQsMTEgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHVpbnQzMl90IHF1aXJrcyA9IDA7CiAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHF1aXJrIDogY29kZWMtPnNlY29uZC5xdWlya1NldCkgewotICAgICAgICAgICAgICAgIGlmIChxdWlyayA9PSAicmVxdWlyZXMtYWxsb2NhdGUtb24taW5wdXQtcG9ydHMiKSB7CisgICAgICAgICAgICAgICAgaWYgKHF1aXJrID09ICJxdWlyazo6cmVxdWlyZXMtYWxsb2NhdGUtb24taW5wdXQtcG9ydHMiKSB7CiAgICAgICAgICAgICAgICAgICAgIHF1aXJrcyB8PSBPTVhOb2RlSW5zdGFuY2U6OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25JbnB1dFBvcnRzOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocXVpcmsgPT0gInJlcXVpcmVzLWFsbG9jYXRlLW9uLW91dHB1dC1wb3J0cyIpIHsKKyAgICAgICAgICAgICAgICBpZiAocXVpcmsgPT0gInF1aXJrOjpyZXF1aXJlcy1hbGxvY2F0ZS1vbi1vdXRwdXQtcG9ydHMiKSB7CiAgICAgICAgICAgICAgICAgICAgIHF1aXJrcyB8PSBPTVhOb2RlSW5zdGFuY2U6OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0czsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCmluZGV4IDQ0N2FmNmYuLjJlMDQxZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCkBAIC02MSwxMCArNjEsNyBAQAogICAgICAgICByb2xlLnJvbGUgPSByb2xlUGFpci5maXJzdDsKICAgICAgICAgcm9sZS50eXBlID0gcm9sZVBhaXIuc2Vjb25kLnR5cGU7CiAgICAgICAgIHJvbGUuaXNFbmNvZGVyID0gcm9sZVBhaXIuc2Vjb25kLmlzRW5jb2RlcjsKLSAgICAgICAgLy8gVE9ETzogQ3VycmVudGx5LCBwcmVmZXJQbGF0Zm9ybU5vZGVzIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW4KLSAgICAgICAgLy8gdGhlIHhtbCBmaWxlLiBPbmNlIHdlIGhhdmUgYSB3YXkgdG8gcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uLCBpdAotICAgICAgICAvLyBzaG91bGQgYmUgcGFyc2VkIHByb3Blcmx5LgotICAgICAgICByb2xlLnByZWZlclBsYXRmb3JtTm9kZXMgPSByb2xlUGFpci5maXJzdC5jb21wYXJlKDAsIDUsICJhdWRpbyIpID09IDA7CisgICAgICAgIHJvbGUucHJlZmVyUGxhdGZvcm1Ob2RlcyA9IGZhbHNlOyAvLyBkZXByZWNhdGVkIGFuZCBpZ25vcmVkLCB1c2luZyByYW5rIGluc3RlYWQKICAgICAgICAgaGlkbF92ZWM8Tm9kZUluZm8+JiBub2RlTGlzdCA9IHJvbGUubm9kZXM7CiAgICAgICAgIG5vZGVMaXN0LnJlc2l6ZShyb2xlUGFpci5zZWNvbmQubm9kZUxpc3Quc2l6ZSgpKTsKICAgICAgICAgc2l6ZV90IGogPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icAppbmRleCAxMGI5NWQ5Li40MzgzMDA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icApAQCAtNTMsNyArNTMsNiBAQAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKLSAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsIC8vIFRPRE8oYi82MjkyMzQ3OSk6IHVzZSBoZWFkZXIgbGlicmFyeQogICAgICAgICAibGlidm5ka3N1cHBvcnQiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwCmluZGV4IDllZDRhOTkuLjFiODQ5M2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcApAQCAtMTUwLDYgKzE1MCw4IEBACiAgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci52cDgiLCAidmlkZW9fZW5jb2Rlci52cDgiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5LAogICAgICAgICAgICAgInZpZGVvX2RlY29kZXIudnA5IiwgInZpZGVvX2VuY29kZXIudnA5IiB9LAorICAgICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSwKKyAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLmF2MSIsICJ2aWRlb19lbmNvZGVyLmF2MSIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcsCiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5yYXciLCAiYXVkaW9fZW5jb2Rlci5yYXciIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OLApAQCAtMTY0LDYgKzE2NiwxMCBAQAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuYWMzIiwgImF1ZGlvX2VuY29kZXIuYWMzIiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzMsCiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5lYWMzIiwgImF1ZGlvX2VuY29kZXIuZWFjMyIgfSwKKyAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzX0pPQywKKyAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmVhYzNfam9jIiwgImF1ZGlvX2VuY29kZXIuZWFjM19qb2MiIH0sCisgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0LAorICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuYWM0IiwgImF1ZGlvX2VuY29kZXIuYWM0IiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQywKICAgICAgICAgICAgICJpbWFnZV9kZWNvZGVyLmhlaWMiLCAiaW1hZ2VfZW5jb2Rlci5oZWljIiB9LAogICAgIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKaW5kZXggNTVhZmUwNC4uZGRiNDU5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcApAQCAtMzQsNyArMzQsOCBAQAogICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCiAgICAgICBtSGFuZGxlcihuZXcgQUhhbmRsZXJSZWZsZWN0b3I8U2ltcGxlU29mdE9NWENvbXBvbmVudD4odGhpcykpLAogICAgICAgbVN0YXRlKE9NWF9TdGF0ZUxvYWRlZCksCi0gICAgICBtVGFyZ2V0U3RhdGUoT01YX1N0YXRlTG9hZGVkKSB7CisgICAgICBtVGFyZ2V0U3RhdGUoT01YX1N0YXRlTG9hZGVkKSwKKyAgICAgIG1GcmFtZUNvbmZpZyhmYWxzZSkgewogICAgIG1Mb29wZXItPnNldE5hbWUobmFtZSk7CiAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKIApAQCAtMjA0LDYgKzIwNSwyMSBAQAogICAgIH0KIH0KIAorT01YX0VSUk9SVFlQRSBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKSB7CisgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKK30KKworT01YX0VSUk9SVFlQRSBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpzZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKSB7CisgICAgYm9vbCBmcmFtZUNvbmZpZyA9IG1GcmFtZUNvbmZpZzsKKyAgICBPTVhfRVJST1JUWVBFIGVyciA9IGludGVybmFsU2V0Q29uZmlnKGluZGV4LCBwYXJhbXMsICZmcmFtZUNvbmZpZyk7CisgICAgaWYgKGVyciA9PSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIG1GcmFtZUNvbmZpZyA9IGZyYW1lQ29uZmlnOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCiBPTVhfRVJST1JUWVBFIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OnVzZUJ1ZmZlcigKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipoZWFkZXIsCiAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LApAQCAtMzM2LDYgKzM1MiwxMCBAQAogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEVtcHR5VGhpc0J1ZmZlciwgbUhhbmRsZXIpOwogICAgIG1zZy0+c2V0UG9pbnRlcigiaGVhZGVyIiwgYnVmZmVyKTsKKyAgICBpZiAobUZyYW1lQ29uZmlnKSB7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImZyYW1lLWNvbmZpZyIsIG1GcmFtZUNvbmZpZyk7CisgICAgICAgIG1GcmFtZUNvbmZpZyA9IGZhbHNlOworICAgIH0KICAgICBtc2ctPnBvc3QoKTsKIAogICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwpAQCAtMzc4LDYgKzM5OCwxMCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigiaGVhZGVyIiwgKHZvaWQgKiopJmhlYWRlcikpOworICAgICAgICAgICAgaW50MzJfdCBmcmFtZUNvbmZpZzsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImZyYW1lLWNvbmZpZyIsICZmcmFtZUNvbmZpZykpIHsKKyAgICAgICAgICAgICAgICBmcmFtZUNvbmZpZyA9IDA7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIENIRUNLKG1TdGF0ZSA9PSBPTVhfU3RhdGVFeGVjdXRpbmcgJiYgbVRhcmdldFN0YXRlID09IG1TdGF0ZSk7CiAKQEAgLTM5Myw2ICs0MTcsNyBAQAogICAgICAgICAgICAgICAgICAgICBDSEVDSyghYnVmZmVyLT5tT3duZWRCeVVzKTsKIAogICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1Pd25lZEJ5VXMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1GcmFtZUNvbmZpZyA9IChib29sKWZyYW1lQ29uZmlnOwogCiAgICAgICAgICAgICAgICAgICAgIENIRUNLKChtc2dUeXBlID09IGtXaGF0RW1wdHlUaGlzQnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcG9ydC0+bURlZi5lRGlyID09IE9NWF9EaXJJbnB1dCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcAppbmRleCA5MzVkYzM0Li5lODUzZGE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCkBAIC0xNTQsMTIgKzE1NCwxMiBAQAogICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gb3V0cHV0QnVmZmVyV2lkdGgoKTsKICAgICBvdXREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBvdXRwdXRCdWZmZXJIZWlnaHQoKTsKICAgICBvdXREZWYtPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBtT3V0cHV0Rm9ybWF0OwotICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBvdXREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKICAgICBvdXREZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBvdXREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CiAKICAgICBpbnQzMl90IGJwcCA9IChtT3V0cHV0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNikgPyAyIDogMTsKKyAgICBvdXREZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlID0gb3V0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggKiBicHA7CiAgICAgb3V0RGVmLT5uQnVmZmVyU2l6ZSA9Ci0gICAgICAgIChvdXREZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlICogb3V0RGVmLT5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ICogYnBwICogMykgLyAyOworICAgICAgICAgICAgKG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgKiBvdXREZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgKiAzKSAvIDI7CiAKICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICppbkRlZiA9ICZlZGl0UG9ydEluZm8oa0lucHV0UG9ydEluZGV4KS0+bURlZjsKICAgICBpbkRlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOwpAQCAtNTAyLDcgKzUwMiw4IEBACiAgICAgICAgICAgICAvLyBUaGVzZSB2YWx1ZXMgd2VyZSBjaG9zZW4gdG8gcHJldmVudCBpbnRlZ2VyIG92ZXJmbG93cyBmdXJ0aGVyIGRvd24gdGhlIGxpbmUsIGFuZCBkbwogICAgICAgICAgICAgLy8gbm90IGluZGljYXRlIHN1cHBvcnQgZm9yIDMya3gzMmsgdmlkZW8uCiAgICAgICAgICAgICBpZiAobmV3V2lkdGggPiAzMjc2OCB8fCBuZXdIZWlnaHQgPiAzMjc2OAotICAgICAgICAgICAgICAgICAgICB8fCB2aWRlb19kZWYtPm5TdHJpZGUgPiAzMjc2OCB8fCB2aWRlb19kZWYtPm5TbGljZUhlaWdodCA+IDMyNzY4KSB7CisgICAgICAgICAgICAgICAgICAgIHx8IHZpZGVvX2RlZi0+blN0cmlkZSA+IDMyNzY4IHx8IHZpZGVvX2RlZi0+blN0cmlkZSA8IC0zMjc2OAorICAgICAgICAgICAgICAgICAgICB8fCB2aWRlb19kZWYtPm5TbGljZUhlaWdodCA+IDMyNzY4KSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImIvMjI4ODU0MjEiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOwogICAgICAgICAgICAgfQpAQCAtNjAxLDEzICs2MDIsNDAgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrRGVzY3JpYmVIZHIxMFBsdXNJbmZvSW5kZXg6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtSGRyMTBQbHVzT3V0cHV0cy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IG1IZHIxMFBsdXNPdXRwdXRzLmJlZ2luKCk7CisKKyAgICAgICAgICAgICAgICBhdXRvIGluZm8gPSAoKml0KS5nZXQoKTsKKworICAgICAgICAgICAgICAgIERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyogb3V0UGFyYW1zID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKilwYXJhbXM7CisKKyAgICAgICAgICAgICAgICBvdXRQYXJhbXMtPm5QYXJhbVNpemVVc2VkID0gaW5mby0+c2l6ZSgpOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGJ1ZmZlciBwcm92aWRlZCBieSB0aGUgY2xpZW50IGRvZXMgbm90IGhhdmUgZW5vdWdoCisgICAgICAgICAgICAgICAgLy8gc3RvcmFnZSwgcmV0dXJuIHRoZSBzaXplIG9ubHkgYW5kIGRvIG5vdCByZW1vdmUgdGhlIHBhcmFtIHlldC4KKyAgICAgICAgICAgICAgICBpZiAob3V0UGFyYW1zLT5uUGFyYW1TaXplID49IGluZm8tPnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkob3V0UGFyYW1zLT5uVmFsdWUsIGluZm8tPmRhdGEoKSwgaW5mby0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbUhkcjEwUGx1c091dHB1dHMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlcmZsb3c7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CiAgICAgfQogfQogCi1PTVhfRVJST1JUWVBFIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OnNldENvbmZpZygKLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpeworT01YX0VSUk9SVFlQRSBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjppbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKXsKICAgICBzd2l0Y2ggKChpbnQpaW5kZXgpIHsKICAgICAgICAgY2FzZSBrRGVzY3JpYmVDb2xvckFzcGVjdHNJbmRleDoKICAgICAgICAgewpAQCAtNjU3LDExICs2ODUsNTUgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrRGVzY3JpYmVIZHIxMFBsdXNJbmZvSW5kZXg6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghc3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyogaW5QYXJhbXMgPQorICAgICAgICAgICAgICAgICAgICAoRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zICopcGFyYW1zOworCisgICAgICAgICAgICBpZiAoKmZyYW1lQ29uZmlnKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHJlcXVlc3QgdG8gYXBwZW5kIHRvIHRoZSBjdXJyZW50IGZyYW1lIGNvbmZpZyBzZXQuCisgICAgICAgICAgICAgICAgLy8gRm9yIG5vdywgd2Ugb25seSBzdXBwb3J0IGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleCwgd2hpY2gKKyAgICAgICAgICAgICAgICAvLyB3ZSBzaW1wbHkgcmVwbGFjZSB3aXRoIHRoZSBsYXN0IHNldCB2YWx1ZS4KKyAgICAgICAgICAgICAgICBpZiAobUhkcjEwUGx1c0lucHV0cy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICooLS1tSGRyMTBQbHVzSW5wdXRzLmVuZCgpKSA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcmFtcy0+blZhbHVlLCBpblBhcmFtcy0+blBhcmFtU2l6ZVVzZWQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJJZ25vcmluZyBrRGVzY3JpYmVIZHIxMFBsdXNJbmZvSW5kZXg6IGFwcGVuZCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyYW1lIGNvbmZpZyB3aGlsZSBubyBmcmFtZSBjb25maWcgaXMgcHJlc2VudCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGZyYW1lIGNvbmZpZywgc2V0dGluZyAqZnJhbWVDb25maWcgdG8gdHJ1ZSBzbyB0aGF0CisgICAgICAgICAgICAgICAgLy8gdGhlIGNsaWVudCBtYXJrcyB0aGUgbmV4dCBxdWV1ZWQgaW5wdXQgZnJhbWUgdG8gYXBwbHkgaXQuCisgICAgICAgICAgICAgICAgKmZyYW1lQ29uZmlnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtSGRyMTBQbHVzSW5wdXRzLnB1c2hfYmFjayhBQnVmZmVyOjpDcmVhdGVBc0NvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICBpblBhcmFtcy0+blZhbHVlLCBpblBhcmFtcy0+blBhcmFtU2l6ZVVzZWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OwogICAgIH0KIH0KIAorc3A8QUJ1ZmZlcj4gU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6ZGVxdWV1ZUlucHV0RnJhbWVDb25maWcoKSB7CisgICAgYXV0byBpdCA9IG1IZHIxMFBsdXNJbnB1dHMuYmVnaW4oKTsKKyAgICBzcDxBQnVmZmVyPiBpbmZvID0gKml0OworICAgIG1IZHIxMFBsdXNJbnB1dHMuZXJhc2UoaXQpOworICAgIHJldHVybiBpbmZvOworfQorCit2b2lkIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OnF1ZXVlT3V0cHV0RnJhbWVDb25maWcoY29uc3Qgc3A8QUJ1ZmZlcj4gJmluZm8pIHsKKyAgICBtSGRyMTBQbHVzT3V0cHV0cy5wdXNoX2JhY2soaW5mbyk7CisgICAgbm90aWZ5KE9NWF9FdmVudENvbmZpZ1VwZGF0ZSwKKyAgICAgICAgICAga091dHB1dFBvcnRJbmRleCwKKyAgICAgICAgICAga0Rlc2NyaWJlSGRyMTBQbHVzSW5mb0luZGV4LAorICAgICAgICAgICBOVUxMKTsKK30KIAogT01YX0VSUk9SVFlQRSBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpnZXRFeHRlbnNpb25JbmRleCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpIHsKQEAgLTY3Niw2ICs3NDgsMTAgQEAKICAgICAgICAgICAgICYmIHN1cHBvcnREZXNjcmliZUhkclN0YXRpY0luZm8oKSkgewogICAgICAgICAqKGludDMyX3QqKWluZGV4ID0ga0Rlc2NyaWJlSGRyU3RhdGljSW5mb0luZGV4OwogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5kZXNjcmliZUhEUjEwUGx1c0luZm8iKQorICAgICAgICAgICAgJiYgc3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpKSB7CisgICAgICAgICooaW50MzJfdCopaW5kZXggPSBrRGVzY3JpYmVIZHIxMFBsdXNJbmZvSW5kZXg7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgIH0KIAogICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpnZXRFeHRlbnNpb25JbmRleChuYW1lLCBpbmRleCk7CkBAIC02OTMsNiArNzY5LDEwIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OnN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKSB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCiB2b2lkIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6Om9uUmVzZXQoKSB7CiAgICAgbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSA9IE5PTkU7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCmluZGV4IGE5ZmNlNTUuLjBmMjI5ZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCkBAIC0xOTAsNyArMTkwLDEyIEBACiAgKi8KIC8vIGNvbnZlcnQ6IFN0YXR1cyAtPiBzdGF0dXNfdAogaW5saW5lIHN0YXR1c190IHRvU3RhdHVzVChSZXR1cm48U3RhdHVzPiBjb25zdCYgdCkgewotICAgIHJldHVybiB0LmlzT2soKSA/IHRvU3RhdHVzVChzdGF0aWNfY2FzdDxTdGF0dXM+KHQpKSA6IFVOS05PV05fRVJST1I7CisgICAgaWYgKHQuaXNPaygpKSB7CisgICAgICAgIHJldHVybiB0b1N0YXR1c1Qoc3RhdGljX2Nhc3Q8U3RhdHVzPih0KSk7CisgICAgfSBlbHNlIGlmICh0LmlzRGVhZE9iamVjdCgpKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgKaW5kZXggMWQxZjJiZC4uNmJiZWRkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlICJTb2Z0T01YQ29tcG9uZW50LmgiCiAKKyNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlclJlZmxlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CkBAIC0yOCw2ICsyOSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTG9vcGVyOworc3RydWN0IEFCdWZmZXI7CiAKIHN0cnVjdCBDb2RlY1Byb2ZpbGVMZXZlbCB7CiAgICAgT01YX1UzMiBtUHJvZmlsZTsKQEAgLTQ5LDYgKzUxLDcgQEAKICAgICBzdHJ1Y3QgQnVmZmVySW5mbyB7CiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICptSGVhZGVyOwogICAgICAgICBib29sIG1Pd25lZEJ5VXM7CisgICAgICAgIGJvb2wgbUZyYW1lQ29uZmlnOwogICAgIH07CiAKICAgICBzdHJ1Y3QgUG9ydEluZm8gewpAQCAtNzYsNiArNzksOSBAQAogICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldFBhcmFtZXRlcigKICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKIAorICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZyk7CisKICAgICB2aXJ0dWFsIHZvaWQgb25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCk7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZnZXRQb3J0UXVldWUoT01YX1UzMiBwb3J0SW5kZXgpOwogCkBAIC0xMDEsNiArMTA3LDcgQEAKICAgICBPTVhfU1RBVEVUWVBFIG1UYXJnZXRTdGF0ZTsKIAogICAgIFZlY3RvcjxQb3J0SW5mbz4gbVBvcnRzOworICAgIHN0ZDo6YXRvbWljX2Jvb2wgbUZyYW1lQ29uZmlnOwogCiAgICAgYm9vbCBpc1NldFBhcmFtZXRlckFsbG93ZWQoCiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgY29uc3Q7CkBAIC0xMTQsNiArMTIxLDkgQEAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgc2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOwogCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIHNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKwogICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSB1c2VCdWZmZXIoCiAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKmJ1ZmZlciwKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKaW5kZXggNTZmYzY5MS4uM2IzODFjZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgpAQCAtMjgsNiArMjksNyBAQAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ4LDYgKzUwLDcgQEAKICAgICBlbnVtIHsKICAgICAgICAga0Rlc2NyaWJlQ29sb3JBc3BlY3RzSW5kZXggPSBrUHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2tJbmRleCArIDEsCiAgICAgICAgIGtEZXNjcmliZUhkclN0YXRpY0luZm9JbmRleCA9IGtQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja0luZGV4ICsgMiwKKyAgICAgICAga0Rlc2NyaWJlSGRyMTBQbHVzSW5mb0luZGV4ID0ga1ByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrSW5kZXggKyAzLAogICAgIH07CiAKICAgICBlbnVtIHsKQEAgLTY4LDggKzcxLDggQEAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZ2V0Q29uZmlnKAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOwogCi0gICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIHNldENvbmZpZygKLSAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRDb25maWcoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpOwogCiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldEV4dGVuc2lvbkluZGV4KAogICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpOwpAQCAtODAsNiArODMsOCBAQAogCiAgICAgdmlydHVhbCBib29sIHN1cHBvcnREZXNjcmliZUhkclN0YXRpY0luZm8oKTsKIAorICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0RGVzY3JpYmVIZHIxMFBsdXNJbmZvKCk7CisKICAgICAvLyBUaGlzIGZ1bmN0aW9uIHNldHMgYm90aCBtaW5pbXVtIGJ1ZmZlciBjb3VudCBhbmQgYWN0dWFsIGJ1ZmZlciBjb3VudCBvZgogICAgIC8vIGlucHV0IHBvcnQgdG8gYmUgfG51bUlucHV0QnVmZmVyc3wuIEl0IHdpbGwgYWxzbyBzZXQgYm90aCBtaW5pbXVtIGJ1ZmZlcgogICAgIC8vIGNvdW50IGFuZCBhY3R1YWwgYnVmZmVyIGNvdW50IG9mIG91dHB1dCBwb3J0IHRvIGJlIHxudW1PdXRwdXRCdWZmZXJzfC4KQEAgLTE2Niw2ICsxNzEsOSBAQAogICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBkdW1wIHRoZSBDb2xvckFzcGVjdHMuCiAgICAgdm9pZCBkdW1wQ29sb3JBc3BlY3RzKGNvbnN0IENvbG9yQXNwZWN0cyAmY29sb3JBc3BlY3RzKTsKIAorICAgIHNwPEFCdWZmZXI+IGRlcXVldWVJbnB1dEZyYW1lQ29uZmlnKCk7CisgICAgdm9pZCBxdWV1ZU91dHB1dEZyYW1lQ29uZmlnKGNvbnN0IHNwPEFCdWZmZXI+ICZpbmZvKTsKKwogcHJpdmF0ZToKICAgICB1aW50MzJfdCBtTWluSW5wdXRCdWZmZXJTaXplOwogICAgIHVpbnQzMl90IG1NaW5Db21wcmVzc2lvblJhdGlvOwpAQCAtMTc0LDYgKzE4Miw5IEBACiAgICAgT01YX1ZJREVPX0NPRElOR1RZUEUgbUNvZGluZ1R5cGU7CiAgICAgY29uc3QgQ29kZWNQcm9maWxlTGV2ZWwgKm1Qcm9maWxlTGV2ZWxzOwogICAgIHNpemVfdCBtTnVtUHJvZmlsZUxldmVsczsKKyAgICB0eXBlZGVmIExpc3Q8c3A8QUJ1ZmZlcj4gPiBIZHIxMFBsdXNJbmZvTGlzdDsKKyAgICBIZHIxMFBsdXNJbmZvTGlzdCBtSGRyMTBQbHVzSW5wdXRzOworICAgIEhkcjEwUGx1c0luZm9MaXN0IG1IZHIxMFBsdXNPdXRwdXRzOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudCk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icAppbmRleCBlZjM2OTgyLi5mYjAzMjI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icApAQCAtOSw3ICs5LDYgQEAKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJtZWRpYSIsCiAgICAgICAgICJsaWJtZWRpYV9vbXgiLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLApAQCAtMjksNiArMjgsNyBAQAogCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCmluZGV4IDE1YTc2NTUuLmMyZjEwNzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmNwcAppbmRleCA4MmEwNjMxLi40MzAyYWVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmNwcApAQCAtNDIzLDYgKzQyMywxMSBAQAogICAgICAgICAgICAgQ0hFQ0tfTEUob2Zmc2V0ICsgKG1PdGhlckRhdGFMZW5CaXRzIC8gOCksIGJ1ZmZlci0+c2l6ZSgpKTsKICAgICAgICAgICAgIG9mZnNldCArPSBtT3RoZXJEYXRhTGVuQml0cyAvIDg7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoaSA8IG1OdW1TdWJGcmFtZXMgJiYgb2Zmc2V0ID49IGJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HVygiU2tpcCBzdWJmcmFtZXMgYWZ0ZXIgJWQsIHRvdGFsICVkIiwgKGludClpLCAoaW50KW1OdW1TdWJGcmFtZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAob2Zmc2V0IDwgYnVmZmVyLT5zaXplKCkpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAppbmRleCAwMTYxN2I2Li43ODllNjJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJBUlRTUENvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJOZXR3b3JrVXRpbHMuaCIKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC01OSw4ICs2MCw4IEBACiAgICAgaWYgKG1Tb2NrZXQgPj0gMCkgewogICAgICAgICBBTE9HRSgiQ29ubmVjdGlvbiBpcyBzdGlsbCBvcGVuLCBjbG9zaW5nIHRoZSBzb2NrZXQuIik7CiAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CiAgICAgICAgIH0KICAgICAgICAgY2xvc2UobVNvY2tldCk7CiAgICAgICAgIG1Tb2NrZXQgPSAtMTsKQEAgLTIxNCw4ICsyMTUsOCBAQAogCiAgICAgaWYgKG1TdGF0ZSAhPSBESVNDT05ORUNURUQpIHsKICAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOwotICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKICAgICAgICAgfQogICAgICAgICBjbG9zZShtU29ja2V0KTsKICAgICAgICAgbVNvY2tldCA9IC0xOwpAQCAtMjU0LDcgKzI1NSw3IEBACiAKICAgICBzdHJ1Y3QgaG9zdGVudCAqZW50ID0gZ2V0aG9zdGJ5bmFtZShob3N0LmNfc3RyKCkpOwogICAgIGlmIChlbnQgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiVW5rbm93biBob3N0ICVzIiwgaG9zdC5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIlVua25vd24gaG9zdCAlcyIsIHVyaURlYnVnU3RyaW5nKGhvc3QpLmNfc3RyKCkpOwogCiAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigicmVzdWx0IiwgLUVOT0VOVCk7CiAgICAgICAgIHJlcGx5LT5wb3N0KCk7CkBAIC0yNjYsOSArMjY3LDkgQEAKICAgICBtU29ja2V0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKIAogICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0LCBtVUlELAorICAgICAgICBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0LCBtVUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUU1AiKTsKLSAgICAgICAgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCwgbVVJRCk7CisgICAgICAgIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0LCBtVUlEKTsKICAgICB9CiAKICAgICBNYWtlU29ja2V0QmxvY2tpbmcobVNvY2tldCwgZmFsc2UpOwpAQCAtMjk3LDggKzI5OCw4IEBACiAgICAgICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKIAogICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOwogICAgICAgICB9CiAgICAgICAgIGNsb3NlKG1Tb2NrZXQpOwogICAgICAgICBtU29ja2V0ID0gLTE7CkBAIC0zMTUsOCArMzE2LDggQEAKIAogdm9pZCBBUlRTUENvbm5lY3Rpb246OnBlcmZvcm1EaXNjb25uZWN0KCkgewogICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOwotICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOworICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOworICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKICAgICB9CiAgICAgY2xvc2UobVNvY2tldCk7CiAgICAgbVNvY2tldCA9IC0xOwpAQCAtMzg5LDggKzM5MCw4IEBACiAKICAgICAgICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOwogICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOwogICAgICAgICB9CiAgICAgICAgIGNsb3NlKG1Tb2NrZXQpOwogICAgICAgICBtU29ja2V0ID0gLTE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcAppbmRleCAzMjUwODRjLi45MjYzNTY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKQEAgLTgwLDcgKzgwLDcgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIEFMT0dJKCIlcyIsIGxpbmUuY19zdHIoKSk7CisgICAgICAgIEFMT0dWKCIlcyIsIGxpbmUuY19zdHIoKSk7CiAKICAgICAgICAgc3dpdGNoIChsaW5lLmNfc3RyKClbMF0pIHsKICAgICAgICAgICAgIGNhc2UgJ3YnOgpAQCAtMjYxLDcgKzI2MSw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoc3RybmNtcCh2YWx1ZS5jX3N0cigpLCAibnB0PSIsIDQpKSB7CisgICAgaWYgKHN0cm5jbXAodmFsdWUuY19zdHIoKSwgIm5wdD0iLCA0KSAmJiBzdHJuY21wKHZhbHVlLmNfc3RyKCksICJucHQ6IiwgNCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLmJwCmluZGV4IDU5NTFkZGYuLjliYzljODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw1IEBACi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3J0c3AiLAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9ydHNwX2RlZmF1bHRzIiwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkFBTVJBc3NlbWJsZXIuY3BwIiwKQEAgLTQ5LDYgKzQ5LDIxIEBACiAgICAgfSwKIH0KIAorY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9ydHNwIiwKKworICAgIHNyY3M6IFsiTmV0d29ya1V0aWxzLmNwcCJdLAorICAgIGhlYWRlcl9saWJzOiBbImxpYm5ldGRfY2xpZW50X2hlYWRlcnMiXSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9ydHNwX2RlZmF1bHRzIl0sCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcnRzcF9wbGF5ZXIyIiwKKworICAgIHNyY3M6IFsiTmV0d29ya1V0aWxzRm9yQXBwUHJvYy5jcHAiXSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9ydHNwX2RlZmF1bHRzIl0sCit9CisKIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiBjY190ZXN0IHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCmluZGV4IGQxODM1MTYuLmI0NTE1ZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaApAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgIkFSVFBDb25uZWN0aW9uLmgiCiAjaW5jbHVkZSAiQVJUU1BDb25uZWN0aW9uLmgiCiAjaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgIk5ldHdvcmtVdGlscy5oIgogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgpAQCAtMzQ0LDggKzM0NSw3IEBACiAKICAgICAgICAgICAgIHN0cnVjdCBob3N0ZW50ICplbnQgPSBnZXRob3N0YnluYW1lKG1TZXNzaW9uSG9zdC5jX3N0cigpKTsKICAgICAgICAgICAgIGlmIChlbnQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbG9vayB1cCBhZGRyZXNzIG9mIHNlc3Npb24gaG9zdCAnJXMnIiwKLSAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSG9zdC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGxvb2sgdXAgYWRkcmVzcyBvZiBzZXNzaW9uIGhvc3QiKTsKIAogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KQEAgLTUzMCw3ICs1MzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZChBU3RyaW5nUHJpbnRmKCIldSIsIHBvcnQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQocGF0aCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgicmV3cml0dGVuIHNlc3Npb24gdXJsOiAnJXMnIiwgbVNlc3Npb25VUkwuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJld3JpdHRlbiBzZXNzaW9uIHVybDogJyVzJyIsIG1TZXNzaW9uVVJMLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Nvbm4nLCB0aGlzKTsKQEAgLTc1NywxMCArNzU3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYWNrLT5tVXNpbmdJbnRlcmxlYXZlZFRDUCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSB0YWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyh0cmFjay0+bVJUUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsodHJhY2stPm1SVFBTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcodHJhY2stPm1SVENQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayh0cmFjay0+bVJUQ1BTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKHRyYWNrLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsodHJhY2stPm1SVFBTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKHRyYWNrLT5tUlRDUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKHRyYWNrLT5tUlRDUFNvY2tldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UodHJhY2stPm1SVFBTb2NrZXQpOwpAQCAtODg2LDEwICs4ODYsMTAgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHRhZwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVFBTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRDUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRDUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVENQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRDUFNvY2tldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGluZm8tPm1SVFBTb2NrZXQpOwpAQCAtMTY2NSwxMiArMTY2NSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAmaW5mby0+bVJUUFNvY2tldCwgJmluZm8tPm1SVENQU29ja2V0LCAmcnRwUG9ydCk7CiAKICAgICAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVFBTb2NrZXQsIG1VSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKih1aW50MzJfdCopICJSVFBfIik7Ci0gICAgICAgICAgICAgICAgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRDUFNvY2tldCwgbVVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUUF8iKTsKLSAgICAgICAgICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRQU29ja2V0LCBtVUlEKTsKLSAgICAgICAgICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRDUFNvY2tldCwgbVVJRCk7CisgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW5mby0+bVJUUFNvY2tldCwgbVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUUF8iKTsKKyAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRDUFNvY2tldCwgbVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUUF8iKTsKKyAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW5mby0+bVJUUFNvY2tldCwgbVVJRCk7CisgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVENQU29ja2V0LCBtVUlEKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlRyYW5zcG9ydDogUlRQL0FWUC9VRFA7dW5pY2FzdDtjbGllbnRfcG9ydD0iKTsKQEAgLTE5MTIsNyArMTkxMiw3IEBACiAgICAgICAgICAgICBtTGFzdE1lZGlhVGltZVVzID0gbWVkaWFUaW1lVXM7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobWVkaWFUaW1lVXMgPCAwKSB7CisgICAgICAgIGlmIChtZWRpYVRpbWVVcyA8IDAgJiYgIW1TZWVrYWJsZSkgewogICAgICAgICAgICAgQUxPR1YoImRyb3BwaW5nIGVhcmx5IGFjY2Vzc1VuaXQuIik7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzM2Yjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ldHdvcmtVdGlscyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIk5ldHdvcmtVdGlscy5oIgorI2luY2x1ZGUgPGN1dGlscy9xdGFndWlkLmg+CisjaW5jbHVkZSA8TmV0ZENsaWVudC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkLCB1aWRfdCB1aWQsIHVpbnQzMl90IGtUYWcpIHsKKyAgICBpbnQgcmVzID0gcXRhZ3VpZF90YWdTb2NrZXQoc29ja2ZkLCBrVGFnLCB1aWQpOworICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRhZ2dpbmcgc29ja2V0ICVkIGZvciB1aWQgJWQgKE15IFVJRD0lZCkiLCBzb2NrZmQsIHVpZCwgZ2V0ZXVpZCgpKTsKKyAgICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQpIHsKKyAgICBpbnQgcmVzID0gcXRhZ3VpZF91bnRhZ1NvY2tldChzb2NrZmQpOworICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHVudGFnZ2luZyBzb2NrZXQgJWQgKE15IFVJRD0lZCkiLCBzb2NrZmQsIGdldGV1aWQoKSk7CisgICAgfQorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQsIHVpZF90IHVpZCkgeworICAgIHNldE5ldHdvcmtGb3JVc2VyKHVpZCwgc29ja2ZkKTsKK30KKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQpIHsKKyAgICBSZWdpc3RlclNvY2tldFVzZXJNYXJrKHNvY2tmZCwgZ2V0ZXVpZCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNWVlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5FVFdPUktfVVRJTFNfSF8KKyNkZWZpbmUgTkVUV09SS19VVElMU19IXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBOZXR3b3JrVXRpbHMgeworICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkLCB1aWRfdCB1aWQsIHVpbnQzMl90IGtUYWcpOworICAgIHN0YXRpYyB2b2lkIFVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQpOworCisgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkLCB1aWRfdCB1aWQpOworICAgIHN0YXRpYyB2b2lkIFVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTkVUV09SS19VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHNGb3JBcHBQcm9jLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzRm9yQXBwUHJvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyMTU5YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzRm9yQXBwUHJvYy5jcHAKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmV0d29ya1V0aWxzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTmV0d29ya1V0aWxzLmgiCisKKy8vIE5ldHdvcmtVdGlscyBpbXBsZW1lbnRhdGlvbiBmb3IgYXBwbGljYXRpb24gcHJvY2Vzcy4KK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCwgdWlkX3QsIHVpbnQzMl90KSB7CisgICAgLy8gTm8gb3AuIEZyYW1ld29yayBhbHJlYWR5IGhhbmRsZXMgdGhlIGRhdGEgdXNhZ2UgYmlsbGluZyBmb3IgYXBwbGljYXRpb25zLgorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQpIHsKKyAgICAvLyBObyBvcC4KK30KKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQsIHVpZF90KSB7CisgICAgLy8gTm8gb3AuIEZyYW1ld29yayBhbHJlYWR5IGhhbmRsZXMgdGhlIGRhdGEgdXNhZ2UgYmlsbGluZyBmb3IgYXBwbGljYXRpb25zLgorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50KSB7CisgICAgLy8gTm8gb3AuCit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKaW5kZXggZDQ1OWNiZC4uNjY1ZDUxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcApAQCAtMjQsNyArMjQsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbGVhck1lZGlhSFRUUC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTQxLDcgKzQxLDcgQEAKICAgICAgIG1GbGFncyhmbGFncyksCiAgICAgICBtTmV0TG9vcGVyKG5ldyBBTG9vcGVyKSwKICAgICAgIG1DYW5jZWxsZWQoZmFsc2UpLAotICAgICAgbUhUVFBEYXRhU291cmNlKG5ldyBNZWRpYUhUVFAoaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpKSkgeworICAgICAgbUhUVFBEYXRhU291cmNlKG5ldyBDbGVhck1lZGlhSFRUUChodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCkpKSB7CiAgICAgbU5ldExvb3Blci0+c2V0TmFtZSgic2RwIG5ldCIpOwogICAgIG1OZXRMb29wZXItPnN0YXJ0KGZhbHNlIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLywKICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBjYW5DYWxsSmF2YSAqLywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAKaW5kZXggYTRlODg5ZC4uNjkzNTY1NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAKQEAgLTIyLDMgKzIyLDMzIEBACiAKICAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSJdLAogfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dDIiLAorCisgICAgc3JjczogWyJUZXh0RGVzY3JpcHRpb25zMi5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYXBsYXllcjItcHJvdG9zIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsibGlibWVkaWEiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9uczIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OGVhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9uczIuY3BwCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlRleHREZXNjcmlwdGlvbnMyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1RleHREZXNjcmlwdGlvbnMyOjpUZXh0RGVzY3JpcHRpb25zMigpIHsKK30KKworc3RhdHVzX3QgVGV4dERlc2NyaXB0aW9uczI6OmdldFBsYXllck1lc3NhZ2VPZkRlc2NyaXB0aW9ucygKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICB1aW50MzJfdCBmbGFncywgaW50IHRpbWVNcywgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKSB7CisgICAgaWYgKGZsYWdzICYgSU5fQkFORF9URVhUXzNHUFApIHsKKyAgICAgICAgaWYgKGZsYWdzICYgR0xPQkFMX0RFU0NSSVBUSU9OUykgeworICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3QzR1BQR2xvYmFsRGVzY3JpcHRpb25zKGRhdGEsIHNpemUsIHBsYXllck1zZyk7CisgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBMT0NBTF9ERVNDUklQVElPTlMpIHsKKyAgICAgICAgICAgIHJldHVybiBleHRyYWN0M0dQUExvY2FsRGVzY3JpcHRpb25zKGRhdGEsIHNpemUsIHRpbWVNcywgcGxheWVyTXNnKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBPVVRfT0ZfQkFORF9URVhUX1NSVCkgeworICAgICAgICBpZiAoZmxhZ3MgJiBMT0NBTF9ERVNDUklQVElPTlMpIHsKKyAgICAgICAgICAgIHJldHVybiBleHRyYWN0U1JUTG9jYWxEZXNjcmlwdGlvbnMoZGF0YSwgc2l6ZSwgdGltZU1zLCBwbGF5ZXJNc2cpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCisvLyBQYXJzZSB0aGUgU1JUIHRleHQgc2FtcGxlLCBhbmQgc3RvcmUgdGhlIHRpbWluZyBhbmQgdGV4dCBzYW1wbGUgaW4gYSBQbGF5ZXJNZXNzYWdlLgorLy8gVGhlIFBsYXllck1lc3NhZ2Ugd2lsbCBiZSBzZW50IHRvIE1lZGlhUGxheWVyMi5qYXZhIHRocm91Z2ggZXZlbnQsIGFuZCB3aWxsIGJlCisvLyBwYXJzZWQgaW4gVGltZWRUZXh0LmphdmEuCitzdGF0dXNfdCBUZXh0RGVzY3JpcHRpb25zMjo6ZXh0cmFjdFNSVExvY2FsRGVzY3JpcHRpb25zKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsIGludCB0aW1lTXMsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZykgeworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX0xPQ0FMX1NFVFRJTkcpOworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUQVJUX1RJTUUpOworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUodGltZU1zKTsKKworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUUlVDVF9URVhUKTsKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2J5dGVzX3ZhbHVlKGRhdGEsIHNpemUpOworCisgICAgcmV0dXJuIE9LOworfQorCisvLyBFeHRyYWN0IHRoZSBsb2NhbCAzR1BQIGRpc3BsYXkgZGVzY3JpcHRpb25zLiAzR1BQIGxvY2FsIGRlc2NyaXB0aW9ucworLy8gYXJlIGFwcGVuZGVkIHRvIHRoZSB0ZXh0IHNhbXBsZSBpZiBhbnkuCitzdGF0dXNfdCBUZXh0RGVzY3JpcHRpb25zMjo6ZXh0cmFjdDNHUFBMb2NhbERlc2NyaXB0aW9ucygKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICBpbnQgdGltZU1zLCBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpIHsKKworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX0xPQ0FMX1NFVFRJTkcpOworCisgICAgLy8gd3JpdGUgc3RhcnQgdGltZSB0byBkaXNwbGF5IHRoaXMgdGV4dCBzYW1wbGUKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKEtFWV9TVEFSVF9USU1FKTsKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKHRpbWVNcyk7CisKKyAgICBpZiAoc2l6ZSA8IDIpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBzc2l6ZV90IHRleHRMZW4gPSAoKmRhdGEpIDw8IDggfCAoKihkYXRhICsgMSkpOworCisgICAgaWYgKHNpemUgPCB0ZXh0TGVuICsgMikgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gd3JpdGUgdGV4dCBzYW1wbGUgbGVuZ3RoIGFuZCB0ZXh0IHNhbXBsZSBpdHNlbGYKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKEtFWV9TVFJVQ1RfVEVYVCk7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9ieXRlc192YWx1ZShkYXRhICsgMiwgdGV4dExlbik7CisKKyAgICBpZiAoc2l6ZSA+IHRleHRMZW4gKyAyKSB7CisgICAgICAgIGRhdGEgKz0gKHRleHRMZW4gKyAyKTsKKyAgICAgICAgc2l6ZSAtPSAodGV4dExlbiArIDIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICB3aGlsZSAoc2l6ZSA+PSA4KSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnRtcERhdGEgPSBkYXRhOworICAgICAgICBzc2l6ZV90IGNodW5rU2l6ZSA9IFUzMl9BVCh0bXBEYXRhKTsgICAgICAvLyBzaXplIGluY2x1ZGVzIHNpemUgYW5kIHR5cGUKKyAgICAgICAgdWludDMyX3QgY2h1bmtUeXBlID0gVTMyX0FUKHRtcERhdGEgKyA0KTsKKworICAgICAgICBpZiAoY2h1bmtTaXplIDw9IDggfHwgY2h1bmtTaXplID4gc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IHJlbWFpbmluZyA9IGNodW5rU2l6ZSAtIDg7CisKKyAgICAgICAgdG1wRGF0YSArPSA4OworCisgICAgICAgIHN3aXRjaChjaHVua1R5cGUpIHsKKyAgICAgICAgICAgIC8vICd0Ym94JyBib3ggdG8gaW5kaWNhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSB0ZXh0IHdpdGggdmFsdWVzCisgICAgICAgICAgICAvLyBvZiB0b3AsIGxlZnQsIGJvdHRvbSBhbmQgcmlnaHQKKyAgICAgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ2InLCAnbycsICd4Jyk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA8IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKEtFWV9TVFJVQ1RfVEVYVF9QT1MpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEpKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhICsgMikpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEgKyA0KSk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSArIDYpKTsKKworICAgICAgICAgICAgICAgIHRtcERhdGEgKz0gODsKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkYXRhICs9IGNodW5rU2l6ZTsKKyAgICAgICAgc2l6ZSAtPSBjaHVua1NpemU7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCisvLyBUbyBleHRyYWN0IGJveCAndHgzZycgZGVmaW5lZCBpbiAzR1BQIFRTIDI2LjI0NSwgYW5kIHN0b3JlIGl0IGluIGEgUGxheWVyTWVzc2FnZQorc3RhdHVzX3QgVGV4dERlc2NyaXB0aW9uczI6OmV4dHJhY3QzR1BQR2xvYmFsRGVzY3JpcHRpb25zKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZykgeworCisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfR0xPQkFMX1NFVFRJTkcpOworCisgICAgd2hpbGUgKHNpemUgPj0gOCkgeworICAgICAgICBzc2l6ZV90IGNodW5rU2l6ZSA9IFUzMl9BVChkYXRhKTsKKyAgICAgICAgdWludDMyX3QgY2h1bmtUeXBlID0gVTMyX0FUKGRhdGEgKyA0KTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqdG1wRGF0YSA9IGRhdGE7CisgICAgICAgIHRtcERhdGEgKz0gODsKKyAgICAgICAgc2l6ZV90IHJlbWFpbmluZyA9IHNpemUgLSA4OworCisgICAgICAgIGlmIChzaXplIDwgY2h1bmtTaXplKSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoKGNodW5rVHlwZSkgeworICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAneCcsICczJywgJ2cnKToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nIDwgMTgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBTa2lwIERJU1BMQVlfRkxBR1MsIFNUUlVDVF9KVVNUSUZJQ0FUSU9OLCBhbmQgQkFDS0dST1VORF9DT0xPUl9SR0JBCisgICAgICAgICAgICAgICAgdG1wRGF0YSArPSAxODsKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gMTg7CisKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nIDwgOCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUUlVDVF9URVhUX1BPUyk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSkpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEgKyAyKSk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSArIDQpKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhICsgNikpOworCisgICAgICAgICAgICAgICAgdG1wRGF0YSArPSA4OworICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSAxODsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUgcmVtYWluaW5nIGRhdGEuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZGF0YSArPSBjaHVua1NpemU7CisgICAgICAgIHNpemUgLT0gY2h1bmtTaXplOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3ZDJkMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zMi5oCkBAIC0wLDAgKzEsODggQEAKKyAvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBURVhUX0RFU0NSSVBUSU9OUzJfSF8KKworI2RlZmluZSBURVhUX0RFU0NSSVBUSU9OUzJfSF8KKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKKyNpbmNsdWRlICJtZWRpYXBsYXllcjIucGIuaCIKKwordXNpbmcgYW5kcm9pZDo6bWVkaWE6Ok1lZGlhUGxheWVyMlByb3RvOjpQbGF5ZXJNZXNzYWdlOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFRleHREZXNjcmlwdGlvbnMyIHsKK3B1YmxpYzoKKyAgICBlbnVtIHsKKyAgICAgICAgSU5fQkFORF9URVhUXzNHUFAgICAgICAgICAgICAgPSAweDAxLAorICAgICAgICBPVVRfT0ZfQkFORF9URVhUX1NSVCAgICAgICAgICA9IDB4MDIsCisKKyAgICAgICAgR0xPQkFMX0RFU0NSSVBUSU9OUyAgICAgICAgICAgPSAweDEwMCwKKyAgICAgICAgTE9DQUxfREVTQ1JJUFRJT05TICAgICAgICAgICAgPSAweDIwMCwKKyAgICB9OworCisgICAgc3RhdGljIHN0YXR1c190IGdldFBsYXllck1lc3NhZ2VPZkRlc2NyaXB0aW9ucygKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLCBpbnQgdGltZU1zLCBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpOworcHJpdmF0ZToKKyAgICBUZXh0RGVzY3JpcHRpb25zMigpOworCisgICAgZW51bSB7CisgICAgICAgIC8vIFRoZXNlIGtleXMgbXVzdCBiZSBpbiBzeW5jIHdpdGggdGhlIGtleXMgaW4gVGltZWRUZXh0LmphdmEKKyAgICAgICAgS0VZX0RJU1BMQVlfRkxBR1MgICAgICAgICAgICAgICAgID0gMSwgLy8gaW50CisgICAgICAgIEtFWV9TVFlMRV9GTEFHUyAgICAgICAgICAgICAgICAgICA9IDIsIC8vIGludAorICAgICAgICBLRVlfQkFDS0dST1VORF9DT0xPUl9SR0JBICAgICAgICAgPSAzLCAvLyBpbnQKKyAgICAgICAgS0VZX0hJR0hMSUdIVF9DT0xPUl9SR0JBICAgICAgICAgID0gNCwgLy8gaW50CisgICAgICAgIEtFWV9TQ1JPTExfREVMQVkgICAgICAgICAgICAgICAgICA9IDUsIC8vIGludAorICAgICAgICBLRVlfV1JBUF9URVhUICAgICAgICAgICAgICAgICAgICAgPSA2LCAvLyBpbnQKKyAgICAgICAgS0VZX1NUQVJUX1RJTUUgICAgICAgICAgICAgICAgICAgID0gNywgLy8gaW50CisgICAgICAgIEtFWV9TVFJVQ1RfQkxJTktJTkdfVEVYVF9MSVNUICAgICA9IDgsIC8vIExpc3Q8Q2hhclBvcz4KKyAgICAgICAgS0VZX1NUUlVDVF9GT05UX0xJU1QgICAgICAgICAgICAgID0gOSwgLy8gTGlzdDxGb250PgorICAgICAgICBLRVlfU1RSVUNUX0hJR0hMSUdIVF9MSVNUICAgICAgICAgPSAxMCwgLy8gTGlzdDxDaGFyUG9zPgorICAgICAgICBLRVlfU1RSVUNUX0hZUEVSX1RFWFRfTElTVCAgICAgICAgPSAxMSwgLy8gTGlzdDxIeXBlclRleHQ+CisgICAgICAgIEtFWV9TVFJVQ1RfS0FSQU9LRV9MSVNUICAgICAgICAgICA9IDEyLCAvLyBMaXN0PEthcmFva2U+CisgICAgICAgIEtFWV9TVFJVQ1RfU1RZTEVfTElTVCAgICAgICAgICAgICA9IDEzLCAvLyBMaXN0PFN0eWxlPgorICAgICAgICBLRVlfU1RSVUNUX1RFWFRfUE9TICAgICAgICAgICAgICAgPSAxNCwgLy8gVGV4dFBvcworICAgICAgICBLRVlfU1RSVUNUX0pVU1RJRklDQVRJT04gICAgICAgICAgPSAxNSwgLy8gSnVzdGlmaWNhdGlvbgorICAgICAgICBLRVlfU1RSVUNUX1RFWFQgICAgICAgICAgICAgICAgICAgPSAxNiwgLy8gVGV4dAorCisgICAgICAgIEtFWV9HTE9CQUxfU0VUVElORyAgICAgICAgICAgICAgICA9IDEwMSwKKyAgICAgICAgS0VZX0xPQ0FMX1NFVFRJTkcgICAgICAgICAgICAgICAgID0gMTAyLAorICAgICAgICBLRVlfU1RBUlRfQ0hBUiAgICAgICAgICAgICAgICAgICAgPSAxMDMsCisgICAgICAgIEtFWV9FTkRfQ0hBUiAgICAgICAgICAgICAgICAgICAgICA9IDEwNCwKKyAgICAgICAgS0VZX0ZPTlRfSUQgICAgICAgICAgICAgICAgICAgICAgID0gMTA1LAorICAgICAgICBLRVlfRk9OVF9TSVpFICAgICAgICAgICAgICAgICAgICAgPSAxMDYsCisgICAgICAgIEtFWV9URVhUX0NPTE9SX1JHQkEgICAgICAgICAgICAgICA9IDEwNywKKyAgICB9OworCisgICAgc3RhdGljIHN0YXR1c190IGV4dHJhY3RTUlRMb2NhbERlc2NyaXB0aW9ucygKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIGludCB0aW1lTXMsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZyk7CisgICAgc3RhdGljIHN0YXR1c190IGV4dHJhY3QzR1BQR2xvYmFsRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICAgICAgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZXh0cmFjdDNHUFBMb2NhbERlc2NyaXB0aW9ucygKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIGludCB0aW1lTXMsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZyk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUZXh0RGVzY3JpcHRpb25zMik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmICAvLyBURVhUX0RFU0NSSVBUSU9OUzJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icAppbmRleCAyNjZiNjExLi42NGVjYzJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLmJwCkBAIC0zMSw0ICszMSw4IEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwCmluZGV4IGE1MTIwYjkuLjRkNTA0ZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwCkBAIC0zMDUsNiArMzA1LDcgQEAKIH0KIAogc3A8V2VibUVsZW1lbnQ+IFdlYm1FbGVtZW50OjpBdWRpb1RyYWNrRW50cnkoCisgICAgICAgIGNvbnN0IGNoYXIgKmNvZGVjLAogICAgICAgICBpbnQgY2hhbnMsCiAgICAgICAgIGRvdWJsZSByYXRlLAogICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmLApAQCAtMzIyLDcgKzMyMyw3IEBACiAgICAgICAgICAgICB1aWQsCiAgICAgICAgICAgICBsYWNpbmcsCiAgICAgICAgICAgICBsYW5nLAotICAgICAgICAgICAgIkFfVk9SQklTIiwKKyAgICAgICAgICAgIGNvZGVjLAogICAgICAgICAgICAga0F1ZGlvVHlwZSwKICAgICAgICAgICAgIHRyYWNrRW50cnlGaWVsZHMpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmgKaW5kZXggZmZiYmExYi4uYTk0YzIzZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuaApAQCAtNTAsNiArNTAsNyBAQAogICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gU2VnbWVudEluZm8odWludDY0X3Qgc2NhbGUgPSAxMDAwMDAwLCBkb3VibGUgZHVyID0gMCk7CiAKICAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IEF1ZGlvVHJhY2tFbnRyeSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvZGVjLAogICAgICAgICAgICAgaW50IGNoYW5zLAogICAgICAgICAgICAgZG91YmxlIHJhdGUsCiAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAKaW5kZXggNGQ3M2ViOC4uYjBhMzAzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oPgogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAKQEAgLTExMiw0NiArMTE0LDEwMiBAQAogLy8gc3RhdGljCiBzcDxXZWJtRWxlbWVudD4gV2VibVdyaXRlcjo6YXVkaW9UcmFjayhjb25zdCBzcDxNZXRhRGF0YT4mIG1kKSB7CiAgICAgaW50MzJfdCBuQ2hhbm5lbHMsIHNhbXBsZXJhdGU7Ci0gICAgdWludDMyX3QgdHlwZTsKLSAgICBjb25zdCB2b2lkICpoZWFkZXJEYXRhMTsKLSAgICBjb25zdCBjaGFyIGhlYWRlckRhdGEyW10gPSB7IDMsICd2JywgJ28nLCAncicsICdiJywgJ2knLCAncycsIDcsIDAsIDAsIDAsCi0gICAgICAgICAgICAnYScsICduJywgJ2QnLCAncicsICdvJywgJ2knLCAnZCcsIDAsIDAsIDAsIDAsIDEgfTsKLSAgICBjb25zdCB2b2lkICpoZWFkZXJEYXRhMzsKLSAgICBzaXplX3QgaGVhZGVyU2l6ZTEsIGhlYWRlclNpemUyID0gc2l6ZW9mKGhlYWRlckRhdGEyKSwgaGVhZGVyU2l6ZTM7CisgICAgY29uc3QgY2hhciogbWltZVR5cGU7CiAKICAgICBpZiAoIW1kLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm5DaGFubmVscykKLSAgICAgICAgICAgIHx8ICFtZC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSkKLSAgICAgICAgICAgIHx8ICFtZC0+ZmluZERhdGEoa0tleVZvcmJpc0luZm8sICZ0eXBlLCAmaGVhZGVyRGF0YTEsICZoZWFkZXJTaXplMSkKLSAgICAgICAgICAgIHx8ICFtZC0+ZmluZERhdGEoa0tleVZvcmJpc0Jvb2tzLCAmdHlwZSwgJmhlYWRlckRhdGEzLCAmaGVhZGVyU2l6ZTMpKSB7CisgICAgICAgIHx8ICFtZC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSkKKyAgICAgICAgfHwgIW1kLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lVHlwZSkpIHsKICAgICAgICAgQUxPR0UoIk1pc3NpbmcgZm9ybWF0IGtleXMgZm9yIGF1ZGlvIHRyYWNrIik7CiAgICAgICAgIG1kLT5kdW1wVG9Mb2coKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemUgPSAxOwotICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gWGlwaExhY2VDb2RlTGVuKGhlYWRlclNpemUxKTsKLSAgICBjb2RlY1ByaXZhdGVTaXplICs9IFhpcGhMYWNlQ29kZUxlbihoZWFkZXJTaXplMik7Ci0gICAgY29kZWNQcml2YXRlU2l6ZSArPSBoZWFkZXJTaXplMSArIGhlYWRlclNpemUyICsgaGVhZGVyU2l6ZTM7CisgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUywgc3RybGVuKE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpKSkgeworICAgICAgICAvLyBPcHVzIGluIFdlYk0gaXMgYSB3ZWxsLWtub3duLCB5ZXQgdW5kZXItZG9jdW1lbnRlZCwgZm9ybWF0LiBUaGUgY29kZWMgcHJpdmF0ZSBkYXRhCisgICAgICAgIC8vIG9mIHRoZSB0cmFjayBpcyBhbiBPcHVzIE9nZyBoZWFkZXIgKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3ODQ1I3NlY3Rpb24tNS4xKQorICAgICAgICAvLyBUaGUgbmFtZSBvZiB0aGUgdHJhY2sgaXNuJ3Qgc3RhbmRhcmRpemVkLCBpdHMgdmFsdWUgc2hvdWxkIGJlICJBX09QVVMiLgorICAgICAgICBPcHVzSGVhZGVyIGhlYWRlcjsKKyAgICAgICAgaGVhZGVyLmNoYW5uZWxzID0gbkNoYW5uZWxzOworICAgICAgICBoZWFkZXIubnVtX3N0cmVhbXMgPSBuQ2hhbm5lbHM7CisgICAgICAgIGhlYWRlci5udW1fY291cGxlZCA9IDA7CisgICAgICAgIC8vIC0gQ2hhbm5lbCBtYXBwaW5nIGZhbWlseSAoOCBiaXRzIHVuc2lnbmVkKQorICAgICAgICAvLyAgLS0gIDAgPSBvbmUgc3RyZWFtOiBtb25vIG9yIEwsUiBzdGVyZW8KKyAgICAgICAgLy8gIC0tICAxID0gY2hhbm5lbHMgaW4gdm9yYmlzIHNwZWMgb3JkZXI6IG1vbm8gb3IgTCxSIHN0ZXJlbyBvciAuLi4gb3IgRkwsQyxGUixSTCxSUixMRkUsIC4uLgorICAgICAgICAvLyAgLS0gIDIuLjI1NCA9IHJlc2VydmVkICh0cmVhdCBhcyAyNTUpCisgICAgICAgIC8vICAtLSAgMjU1ID0gbm8gZGVmaW5lZCBjaGFubmVsIG1lYW5pbmcKKyAgICAgICAgLy8KKyAgICAgICAgLy8gIG91ciBpbXBsZW1lbnRhdGlvbiBlbmNvZGVzOiAgMCwgMSwgb3IgMjU1CisgICAgICAgIGhlYWRlci5jaGFubmVsX21hcHBpbmcgPSAoKG5DaGFubmVscyA+IDgpID8gMjU1IDogKG5DaGFubmVscyA+IDIpKTsKKyAgICAgICAgaGVhZGVyLmdhaW5fZGIgPSAwOworICAgICAgICBoZWFkZXIuc2tpcF9zYW1wbGVzID0gMDsKIAotICAgIG9mZl90IG9mZiA9IDA7Ci0gICAgc3A8QUJ1ZmZlcj4gY29kZWNQcml2YXRlQnVmID0gbmV3IEFCdWZmZXIoY29kZWNQcml2YXRlU2l6ZSk7Ci0gICAgdWludDhfdCAqY29kZWNQcml2YXRlRGF0YSA9IGNvZGVjUHJpdmF0ZUJ1Zi0+ZGF0YSgpOwotICAgIGNvZGVjUHJpdmF0ZURhdGFbb2ZmKytdID0gMjsKKyAgICAgICAgLy8gaGVhZGVycyBhcmUgMjEtYnl0ZXMgKyBzb21ldGhpbmcgZHJpdmVuIGJ5IGNoYW5uZWwgY291bnQKKyAgICAgICAgLy8gZXhwZWN0IG51bWJlcnMgaW4gdGhlIGxvdyAzMCdzIGhlcmUuIFdyaXRlT3B1c0hlYWRlcigpIHdpbGwgdGVsbCB1cworICAgICAgICAvLyBpZiB0aGluZ3MgYXJlIGJhZC4KKyAgICAgICAgdW5zaWduZWQgY2hhciBoZWFkZXJfZGF0YVsxMDBdOworICAgICAgICBpbnQgaGVhZGVyU2l6ZSA9IFdyaXRlT3B1c0hlYWRlcihoZWFkZXIsIHNhbXBsZXJhdGUsICh1aW50OF90KiloZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhlYWRlcl9kYXRhKSk7CiAKLSAgICBvZmYgKz0gWGlwaExhY2VFbmMoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyU2l6ZTEpOwotICAgIG9mZiArPSBYaXBoTGFjZUVuYyhjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJTaXplMik7CisgICAgICAgIGlmIChoZWFkZXJTaXplIDwgMCkgeworICAgICAgICAgICAgLy8gZGlkbid0IGZpbGwgb3V0IHRoYXQgaGVhZGVyIGZvciBzb21lIHJlYXNvbgorICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBnZW5lcmF0ZSBPUFVTIGhlYWRlciIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJEYXRhMSwgaGVhZGVyU2l6ZTEpOwotICAgIG9mZiArPSBoZWFkZXJTaXplMTsKLSAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTIsIGhlYWRlclNpemUyKTsKLSAgICBvZmYgKz0gaGVhZGVyU2l6ZTI7Ci0gICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGEzLCBoZWFkZXJTaXplMyk7CisgICAgICAgIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplID0gMDsKKyAgICAgICAgY29kZWNQcml2YXRlU2l6ZSArPSBoZWFkZXJTaXplOwogCi0gICAgc3A8V2VibUVsZW1lbnQ+IGVudHJ5ID0gV2VibUVsZW1lbnQ6OkF1ZGlvVHJhY2tFbnRyeSgKLSAgICAgICAgICAgIG5DaGFubmVscywKLSAgICAgICAgICAgIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICBjb2RlY1ByaXZhdGVCdWYpOwotICAgIHJldHVybiBlbnRyeTsKKyAgICAgICAgb2ZmX3Qgb2ZmID0gMDsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY29kZWNQcml2YXRlQnVmID0gbmV3IEFCdWZmZXIoY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgIHVpbnQ4X3QqIGNvZGVjUHJpdmF0ZURhdGEgPSBjb2RlY1ByaXZhdGVCdWYtPmRhdGEoKTsKKworICAgICAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgKHVpbnQ4X3QqKWhlYWRlcl9kYXRhLCBoZWFkZXJTaXplKTsKKyAgICAgICAgc3A8V2VibUVsZW1lbnQ+IGVudHJ5ID0KKyAgICAgICAgICAgICAgICBXZWJtRWxlbWVudDo6QXVkaW9UcmFja0VudHJ5KCJBX09QVVMiLCBuQ2hhbm5lbHMsIHNhbXBsZXJhdGUsIGNvZGVjUHJpdmF0ZUJ1Zik7CisgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykpKSB7CisgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgIGNvbnN0IHZvaWQgKmhlYWRlckRhdGExOworICAgICAgICBjb25zdCBjaGFyIGhlYWRlckRhdGEyW10gPSB7IDMsICd2JywgJ28nLCAncicsICdiJywgJ2knLCAncycsIDcsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgJ2EnLCAnbicsICdkJywgJ3InLCAnbycsICdpJywgJ2QnLCAwLCAwLCAwLCAwLCAxIH07CisgICAgICAgIGNvbnN0IHZvaWQgKmhlYWRlckRhdGEzOworICAgICAgICBzaXplX3QgaGVhZGVyU2l6ZTEsIGhlYWRlclNpemUyID0gc2l6ZW9mKGhlYWRlckRhdGEyKSwgaGVhZGVyU2l6ZTM7CisKKyAgICAgICAgaWYgKCFtZC0+ZmluZERhdGEoa0tleVZvcmJpc0luZm8sICZ0eXBlLCAmaGVhZGVyRGF0YTEsICZoZWFkZXJTaXplMSkKKyAgICAgICAgICAgIHx8ICFtZC0+ZmluZERhdGEoa0tleVZvcmJpc0Jvb2tzLCAmdHlwZSwgJmhlYWRlckRhdGEzLCAmaGVhZGVyU2l6ZTMpKSB7CisgICAgICAgICAgICBBTE9HRSgiTWlzc2luZyBoZWFkZXIgZm9ybWF0IGtleXMgZm9yIHZvcmJpcyB0cmFjayIpOworICAgICAgICAgICAgbWQtPmR1bXBUb0xvZygpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgY29kZWNQcml2YXRlU2l6ZSA9IDE7CisgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gWGlwaExhY2VDb2RlTGVuKGhlYWRlclNpemUxKTsKKyAgICAgICAgY29kZWNQcml2YXRlU2l6ZSArPSBYaXBoTGFjZUNvZGVMZW4oaGVhZGVyU2l6ZTIpOworICAgICAgICBjb2RlY1ByaXZhdGVTaXplICs9IGhlYWRlclNpemUxICsgaGVhZGVyU2l6ZTIgKyBoZWFkZXJTaXplMzsKKworICAgICAgICBvZmZfdCBvZmYgPSAwOworICAgICAgICBzcDxBQnVmZmVyPiBjb2RlY1ByaXZhdGVCdWYgPSBuZXcgQUJ1ZmZlcihjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgdWludDhfdCAqY29kZWNQcml2YXRlRGF0YSA9IGNvZGVjUHJpdmF0ZUJ1Zi0+ZGF0YSgpOworICAgICAgICBjb2RlY1ByaXZhdGVEYXRhW29mZisrXSA9IDI7CisKKyAgICAgICAgb2ZmICs9IFhpcGhMYWNlRW5jKGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlclNpemUxKTsKKyAgICAgICAgb2ZmICs9IFhpcGhMYWNlRW5jKGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlclNpemUyKTsKKworICAgICAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTEsIGhlYWRlclNpemUxKTsKKyAgICAgICAgb2ZmICs9IGhlYWRlclNpemUxOworICAgICAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTIsIGhlYWRlclNpemUyKTsKKyAgICAgICAgb2ZmICs9IGhlYWRlclNpemUyOworICAgICAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTMsIGhlYWRlclNpemUzKTsKKworICAgICAgICBzcDxXZWJtRWxlbWVudD4gZW50cnkgPQorICAgICAgICAgICAgICAgIFdlYm1FbGVtZW50OjpBdWRpb1RyYWNrRW50cnkoIkFfVk9SQklTIiwgbkNoYW5uZWxzLCBzYW1wbGVyYXRlLCBjb2RlY1ByaXZhdGVCdWYpOworICAgICAgICByZXR1cm4gZW50cnk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIlRyYWNrICglcykgaXMgbm90IGEgc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdCIsIG1pbWVUeXBlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBzaXplX3QgV2VibVdyaXRlcjo6bnVtVHJhY2tzKCkgewpAQCAtMzgyLDE2ICs0NDAsMTggQEAKICAgICBjb25zdCBjaGFyICp2cDggPSBNRURJQV9NSU1FVFlQRV9WSURFT19WUDg7CiAgICAgY29uc3QgY2hhciAqdnA5ID0gTUVESUFfTUlNRVRZUEVfVklERU9fVlA5OwogICAgIGNvbnN0IGNoYXIgKnZvcmJpcyA9IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUzsKKyAgICBjb25zdCBjaGFyKiBvcHVzID0gTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUzsKIAogICAgIHNpemVfdCBzdHJlYW1JbmRleDsKICAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsIHZwOCwgc3RybGVuKHZwOCkpIHx8CiAgICAgICAgICFzdHJuY2FzZWNtcChtaW1lLCB2cDksIHN0cmxlbih2cDkpKSkgewogICAgICAgICBzdHJlYW1JbmRleCA9IGtWaWRlb0luZGV4OwotICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKG1pbWUsIHZvcmJpcywgc3RybGVuKHZvcmJpcykpKSB7CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZSwgdm9yYmlzLCBzdHJsZW4odm9yYmlzKSkgfHwKKyAgICAgICAgICAgICAgICFzdHJuY2FzZWNtcChtaW1lLCBvcHVzLCBzdHJsZW4ob3B1cykpKSB7CiAgICAgICAgIHN0cmVhbUluZGV4ID0ga0F1ZGlvSW5kZXg7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIlRyYWNrICglcykgb3RoZXIgdGhhbiAlcywgJXMgb3IgJXMgaXMgbm90IHN1cHBvcnRlZCIsCi0gICAgICAgICAgICAgIG1pbWUsIHZwOCwgdnA5LCB2b3JiaXMpOworICAgICAgICBBTE9HRSgiVHJhY2sgKCVzKSBvdGhlciB0aGFuICVzLCAlcywgJXMsIG9yICVzIGlzIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICBtaW1lLCB2cDgsIHZwOSwgdm9yYmlzLCBvcHVzKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvQW5kcm9pZC5icAppbmRleCBlZDI2ZTU4Li4yMDJlOTY0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvQW5kcm9pZC5icApAQCAtMSwxMCArMSwxNSBAQAorY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyX2hlYWRlcnMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIHZuZGs6IHsKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICB9LAotICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIk1lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcAppbmRleCAyZGVjOWZhLi43MDQ2ZjYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAKQEAgLTI2LDggKzI2LDkgQEAKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGV4cGF0Lmg+CiAKLSNpbmNsdWRlIDxjY3R5cGU+CiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNjdHlwZT4KKyNpbmNsdWRlIDxzdHJpbmc+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzI2LDggKzMyNyw4IEBACiAgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSOgogICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUjoKICAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJRdWlyayIpKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpYWRkUXVpcmsoYXR0cnMpOworICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJRdWlyayIpIHx8IHN0ckVxKG5hbWUsICJBdHRyaWJ1dGUiKSkgeworICAgICAgICAgICAgICAgICh2b2lkKWFkZFF1aXJrKGF0dHJzLCBuYW1lKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIlR5cGUiKSkgewogICAgICAgICAgICAgICAgICh2b2lkKWFkZFR5cGVGcm9tQXR0cmlidXRlcyhhdHRycywKICAgICAgICAgICAgICAgICAgICAgICAgIChtQ3VycmVudFNlY3Rpb24gPT0gU0VDVElPTl9FTkNPREVSKSk7CkBAIC0zNDgsNiArMzQ5LDggQEAKICAgICAgICAgICAgIGlmIChvdXRzaWRlICYmCiAgICAgICAgICAgICAgICAgICAgIChzdHJFcShuYW1lLCAiTGltaXQiKSB8fCBzdHJFcShuYW1lLCAiRmVhdHVyZSIpKSkgewogICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyAlcyBzcGVjaWZpZWQgb3V0c2lkZSBvZiBhIFR5cGUiLCBuYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIkFsaWFzIikpIHsKKyAgICAgICAgICAgICAgICAodm9pZClhZGRBbGlhcyhhdHRycyk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJMaW1pdCIpKSB7CiAgICAgICAgICAgICAgICAgKHZvaWQpYWRkTGltaXQoYXR0cnMpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiRmVhdHVyZSIpKSB7CkBAIC00OTksNiArNTAyLDcgQEAKICAgICBjb25zdCBjaGFyICpuYW1lID0gbnVsbHB0cjsKICAgICBjb25zdCBjaGFyICp0eXBlID0gbnVsbHB0cjsKICAgICBjb25zdCBjaGFyICp1cGRhdGUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKnJhbmsgPSBudWxscHRyOwogCiAgICAgc2l6ZV90IGkgPSAwOwogICAgIHdoaWxlIChhdHRyc1tpXSAhPSBudWxscHRyKSB7CkBAIC01MjAsNiArNTI0LDEyIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAicmFuayIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogcmFuayBpcyBudWxsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJhbmsgPSBhdHRyc1tpXTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTU3NiwxMCArNTg2LDE5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAocmFuayAhPSBudWxscHRyKSB7CisgICAgICAgIGlmICghbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnJhbmsuZW1wdHkoKSAmJiBtQ3VycmVudENvZGVjLT5zZWNvbmQucmFuayAhPSByYW5rKSB7CisgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBjb2RlIFwiJXNcIiByYW5rIGNoYW5nZWQgZnJvbSBcIiVzXCIgdG8gXCIlc1wiIiwKKyAgICAgICAgICAgICAgICAgICAgbmFtZSwgbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnJhbmsuY19zdHIoKSwgcmFuayk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIG1DdXJyZW50Q29kZWMtPnNlY29uZC5yYW5rID0gcmFuazsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMpIHsKK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMsIGNvbnN0IGNoYXIgKnRhZykgewogICAgIGlmIChtQ3VycmVudENvZGVjID09IG1Db2RlY01hcC5lbmQoKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KQEAgLTYwNiw3ICs2MjUsMTIgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBtQ3VycmVudENvZGVjLT5zZWNvbmQucXVpcmtTZXQuZW1wbGFjZShuYW1lKTsKKyAgICBzdGQ6OnN0cmluZyB0YWdTdHJpbmcgPSB0YWc7CisgICAgc3RkOjp0cmFuc2Zvcm0odGFnU3RyaW5nLmJlZ2luKCksIHRhZ1N0cmluZy5lbmQoKSwgdGFnU3RyaW5nLmJlZ2luKCksIDo6dG9sb3dlcik7CisgICAgdGFnU3RyaW5nLmFwcGVuZCgiOjoiKTsKKyAgICB0YWdTdHJpbmcuYXBwZW5kKG5hbWUpOworICAgIG1DdXJyZW50Q29kZWMtPnNlY29uZC5xdWlya1NldC5lbXBsYWNlKHRhZ1N0cmluZy5jX3N0cigpKTsKKyAgICBBTE9HSSgiYWRkaW5nICVzIHRvICVzIiwgdGFnU3RyaW5nLmNfc3RyKCksIG1DdXJyZW50Q29kZWMtPmZpcnN0LmNfc3RyKCkpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtNzYwLDYgKzc4NCw3IEBACiAgICAgICAgICAgICBzdHJFcShhX25hbWUsICJxdWFsaXR5IikgfHwKICAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgInNpemUiKSB8fAogICAgICAgICAgICAgc3RyRXEoYV9uYW1lLCAibWVhc3VyZWQtYmxvY2tzLXBlci1zZWNvbmQiKSB8fAorICAgICAgICAgICAgc3RySGFzUHJlZml4KGFfbmFtZSwgInBlcmZvcm1hbmNlLXBvaW50LSIpIHx8CiAgICAgICAgICAgICBzdHJIYXNQcmVmaXgoYV9uYW1lLCAibWVhc3VyZWQtZnJhbWUtcmF0ZS0iKSkgewogICAgICAgICAvLyAicmFuZ2UiIGlzIHNwZWNpZmllZCBpbiBleGFjdGx5IG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOgogICAgICAgICAvLyAxKSBtaW4tbWF4CkBAIC05NjQsNiArOTg5LDM0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkQWxpYXMoY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBudWxscHRyOworCisgICAgd2hpbGUgKGF0dHJzW2ldICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7CisgICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImFkZEFsaWFzOiBuYW1lIGlzIG51bGwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmFtZSA9IGF0dHJzW2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoImFkZEFsaWFzOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgIH0KKworICAgIC8vIEV2ZXJ5IGZlYXR1cmUgbXVzdCBoYXZlIGEgbmFtZS4KKyAgICBpZiAobmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJhbGlhcyB3aXRoIG5vICduYW1lJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtQ3VycmVudENvZGVjLT5zZWNvbmQuYWxpYXNlcy5lbXBsYWNlX2JhY2sobmFtZSk7CisgICAgcmV0dXJuIE9LOworfQorCiBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwJgogICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2V0U2VydmljZUF0dHJpYnV0ZU1hcCgpIGNvbnN0IHsKICAgICByZXR1cm4gbVNlcnZpY2VBdHRyaWJ1dGVNYXA7CkBAIC05OTgsNiArMTA1MSw3IEBACiAgICAgICAgIGNvbnN0IGF1dG8mIGNvZGVjTmFtZSA9IGNvZGVjLmZpcnN0OwogICAgICAgICBib29sIGlzRW5jb2RlciA9IGNvZGVjLnNlY29uZC5pc0VuY29kZXI7CiAgICAgICAgIHNpemVfdCBvcmRlciA9IGNvZGVjLnNlY29uZC5vcmRlcjsKKyAgICAgICAgc3RkOjpzdHJpbmcgcmFuayA9IGNvZGVjLnNlY29uZC5yYW5rOwogICAgICAgICBjb25zdCBhdXRvJiB0eXBlTWFwID0gY29kZWMuc2Vjb25kLnR5cGVNYXA7CiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgdHlwZSA6IHR5cGVNYXApIHsKICAgICAgICAgICAgIGNvbnN0IGF1dG8mIHR5cGVOYW1lID0gdHlwZS5maXJzdDsKQEAgLTEwNDEsMTEgKzEwOTUsMjEgQEAKIAogICAgICAgICAgICAgTm9kZUluZm8gbm9kZUluZm87CiAgICAgICAgICAgICBub2RlSW5mby5uYW1lID0gY29kZWNOYW1lOworICAgICAgICAgICAgLy8gTk9URTogbm8gYWxpYXNlcyBhcmUgZXhwb3NlZCBpbiByb2xlIGluZm8KKyAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSBxdWlya3MgYXJlIGV4cG9zZWQgYXMgbm9kZSBhdHRyaWJ1dGVzCiAgICAgICAgICAgICBub2RlSW5mby5hdHRyaWJ1dGVMaXN0LnJlc2VydmUodHlwZUF0dHJpYnV0ZU1hcC5zaXplKCkpOwogICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhdHRyaWJ1dGUgOiB0eXBlQXR0cmlidXRlTWFwKSB7CiAgICAgICAgICAgICAgICAgbm9kZUluZm8uYXR0cmlidXRlTGlzdC5wdXNoX2JhY2soCiAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGV7YXR0cmlidXRlLmZpcnN0LCBhdHRyaWJ1dGUuc2Vjb25kfSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZxdWlyayA6IGNvZGVjLnNlY29uZC5xdWlya1NldCkgeworICAgICAgICAgICAgICAgIGlmIChzdHJIYXNQcmVmaXgocXVpcmsuY19zdHIoKSwgImF0dHJpYnV0ZTo6IikpIHsKKyAgICAgICAgICAgICAgICAgICAgbm9kZUluZm8uYXR0cmlidXRlTGlzdC5wdXNoX2JhY2soQXR0cmlidXRle3F1aXJrLCAicHJlc2VudCJ9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXJhbmsuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG5vZGVJbmZvLmF0dHJpYnV0ZUxpc3QucHVzaF9iYWNrKEF0dHJpYnV0ZXsicmFuayIsIHJhbmt9KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5vZGVMaXN0LT5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCiAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShvcmRlciksIHN0ZDo6bW92ZShub2RlSW5mbykpKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaAppbmRleCBjYzY5ZTUyLi43YTk4NmI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaApAQCAtNjUsNiArNjUsOCBAQAogICAgICAgICBzaXplX3Qgb3JkZXI7ICAgICAgLy8vPCBPcmRlciBvZiBhcHBlYXJhbmNlIGluIHRoZSBmaWxlIChzdGFydGluZyBmcm9tIDApCiAgICAgICAgIFF1aXJrU2V0IHF1aXJrU2V0OyAvLy88IFNldCBvZiBxdWlya3MgcmVxdWVzdGVkIGJ5IHRoaXMgY29kZWMKICAgICAgICAgVHlwZU1hcCB0eXBlTWFwOyAgIC8vLzwgTWFwIG9mIHR5cGVzIHN1cHBvcnRlZCBieSB0aGlzIGNvZGVjCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhbGlhc2VzOyAvLy88IE5hbWUgYWxpYXNlcyBmb3IgdGhpcyBjb2RlYworICAgICAgICBzdGQ6OnN0cmluZyByYW5rOyAgLy8vPCBSYW5rIG9mIHRoaXMgY29kZWMuIFRoaXMgaXMgYSBudW1lcmljIHN0cmluZy4KICAgICB9OwogCiAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIENvZGVjUHJvcGVydGllcz4gQ29kZWM7CkBAIC03Niw2ICs3OCw3IEBACiAgICAgc3RydWN0IE5vZGVJbmZvIHsKICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKICAgICAgICAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlPiBhdHRyaWJ1dGVMaXN0OworICAgICAgICAvLyBub3RlOiBhbGlhc2VzIGFyZSBub3QgZXhwb3NlZCBoZXJlIGFzIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoZSByb2xlIG1hcAogICAgIH07CiAKICAgICAvKioKQEAgLTE3MSw4ICsxNzQsOSBAQAogICAgIHZvaWQgYWRkTWVkaWFDb2RlYyhib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICBjb25zdCBjaGFyICp0eXBlID0gbnVsbHB0cik7CiAKLSAgICBzdGF0dXNfdCBhZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMpOworICAgIHN0YXR1c190IGFkZFF1aXJrKGNvbnN0IGNoYXIgKiphdHRycywgY29uc3QgY2hhciAqdGFnKTsKICAgICBzdGF0dXNfdCBhZGRUeXBlRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzLCBib29sIGVuY29kZXIpOworICAgIHN0YXR1c190IGFkZEFsaWFzKGNvbnN0IGNoYXIgKiphdHRycyk7CiAgICAgc3RhdHVzX3QgYWRkTGltaXQoY29uc3QgY2hhciAqKmF0dHJzKTsKICAgICBzdGF0dXNfdCBhZGRGZWF0dXJlKGNvbnN0IGNoYXIgKiphdHRycyk7CiAgICAgdm9pZCBhZGRUeXBlKGNvbnN0IGNoYXIgKm5hbWUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5icCBiL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQuYnAKaW5kZXggMTZjN2JlOS4uNmExY2M3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLmJwCkBAIC0yNSw3ICsyNSw2IEBACiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJpY3VhbmRyb2lkX3V0aWxzIiwKICAgICAgICAgImxpYnJlZ2lzdGVybXNleHQiLAogICAgIF0sCiAKQEAgLTM0LDYgKzMzLDcgQEAKICAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIiLAogICAgIF0sCiAKKyAgICAvLyBiYWNrIHRvIDMyLWJpdCwgYi8xMjY1MDI2MTMKICAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogCiAgICAgaW5pdF9yYzogWyJtZWRpYXNlcnZlci5yYyJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFpbl9tZWRpYXNlcnZlci5jcHAgYi9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcAppbmRleCBlY2RkYzQ4Li43YjIyYjA1IDEwMDY0NAotLS0gYS9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcAorKysgYi9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJtZWRpYXNlcnZlciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGFpY3UvQUljdS5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CkBAIC0yNSw3ICsyNiw2IEBACiAjaW5jbHVkZSAiUmVnaXN0ZXJFeHRlbnNpb25zLmgiCiAKIC8vIGZyb20gTE9DQUxfQ19JTkNMVURFUwotI2luY2x1ZGUgIkljdVV0aWxzLmgiCiAjaW5jbHVkZSAiTWVkaWFQbGF5ZXJTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oIgogCkBAIC0zOCw3ICszOCw3IEBACiAgICAgc3A8UHJvY2Vzc1N0YXRlPiBwcm9jKFByb2Nlc3NTdGF0ZTo6c2VsZigpKTsKICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtKGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpKTsKICAgICBBTE9HSSgiU2VydmljZU1hbmFnZXI6ICVwIiwgc20uZ2V0KCkpOwotICAgIEluaXRpYWxpemVJY3VPckRpZSgpOworICAgIEFJY3VfaW5pdGlhbGl6ZUljdU9yRGllKCk7CiAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwogICAgIFJlc291cmNlTWFuYWdlclNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgcmVnaXN0ZXJFeHRlbnNpb25zKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcCBiL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwCmluZGV4IGYyNWZjNzEuLmJkNmE2YzYgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwCisrKyBiL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwCkBAIC00Nyw2ICs0Nyw5IEBACiBjb25zdGV4cHIgdW5zaWduZWQgTUFYX0ZJTEVfQ0hVTktfU0laRSA9IEFJT19CVUZTX01BWCAqIEFJT19CVUZfTEVOOwogCiBjb25zdGV4cHIgdWludDMyX3QgTUFYX01UUF9GSUxFX1NJWkUgPSAweEZGRkZGRkZGOworLy8gTm90ZTogUE9MTF9USU1FT1VUX01TID0gMCBtZWFucyByZXR1cm4gaW1tZWRpYXRlbHkgaS5lLiBubyBzbGVlcC4KKy8vIEFuZCB0aGlzIHdpbGwgY2F1c2UgaGlnaCBDUFUgdXNhZ2UuCitjb25zdGV4cHIgaW50MzJfdCBQT0xMX1RJTUVPVVRfTVMgPSA1MDA7CiAKIHN0cnVjdCB0aW1lc3BlYyBaRVJPX1RJTUVPVVQgPSB7IDAsIDAgfTsKIApAQCAtMjEyLDcgKzIxNSw2IEBACiAgICAgdWludDE2X3QgdmFsdWUgPSBzZXR1cC0+d1ZhbHVlOwogICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGJ1ZjsKICAgICBidWYucmVzaXplKGxlbmd0aCk7Ci0gICAgaW50IHJldCA9IDA7CiAKICAgICBpZiAoISh0eXBlICYgVVNCX0RJUl9JTikpIHsKICAgICAgICAgaWYgKDo6cmVhZChtQ29udHJvbCwgYnVmLmRhdGEoKSwgbGVuZ3RoKSAhPSBsZW5ndGgpIHsKQEAgLTIyNSw4ICsyMjcsOCBAQAogICAgICAgICBjYXNlIE1UUF9SRVFfUkVTRVQ6CiAgICAgICAgIGNhc2UgTVRQX1JFUV9DQU5DRUw6CiAgICAgICAgICAgICBlcnJubyA9IEVDQU5DRUxFRDsKLSAgICAgICAgICAgIHJldCA9IC0xOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIC8vICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1UUF9SRVFfR0VUX0RFVklDRV9TVEFUVVM6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChsZW5ndGggPCBzaXplb2Yoc3RydWN0IG10cF9kZXZpY2Vfc3RhdHVzKSArIDQpIHsKQEAgLTMwNiw3ICszMDgsNyBAQAogICAgIGludCBlcnJvciA9IDA7CiAKICAgICB3aGlsZSAobnVtX2V2ZW50cyA8IG1pbl9ldmVudHMpIHsKLSAgICAgICAgaWYgKHBvbGwobVBvbGxGZHMsIDIsIDApID09IC0xKSB7CisgICAgICAgIGlmIChwb2xsKG1Qb2xsRmRzLCAyLCBQT0xMX1RJTUVPVVRfTVMpID09IC0xKSB7CiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiTXRwIGVycm9yIGR1cmluZyBwb2xsKCkiOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcCBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCmluZGV4IGNjZGRkNmUuLmNhOGNiNzggMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCkBAIC05OSw2ICs5OSw3IEBACiAgICAgTVRQX0VWRU5UX1NUT1JFX0FEREVELAogICAgIE1UUF9FVkVOVF9TVE9SRV9SRU1PVkVELAogICAgIE1UUF9FVkVOVF9ERVZJQ0VfUFJPUF9DSEFOR0VELAorICAgIE1UUF9FVkVOVF9PQkpFQ1RfSU5GT19DSEFOR0VELAogfTsKIAogTXRwU2VydmVyOjpNdHBTZXJ2ZXIoSU10cERhdGFiYXNlKiBkYXRhYmFzZSwgaW50IGNvbnRyb2xGZCwgYm9vbCBwdHAsCkBAIC0yNTksNiArMjYwLDExIEBACiAgICAgc2VuZEV2ZW50KE1UUF9FVkVOVF9PQkpFQ1RfUkVNT1ZFRCwgaGFuZGxlKTsKIH0KIAordm9pZCBNdHBTZXJ2ZXI6OnNlbmRPYmplY3RJbmZvQ2hhbmdlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgQUxPR1YoInNlbmRPYmplY3RJbmZvQ2hhbmdlZCAlZFxuIiwgaGFuZGxlKTsKKyAgICBzZW5kRXZlbnQoTVRQX0VWRU5UX09CSkVDVF9JTkZPX0NIQU5HRUQsIGhhbmRsZSk7Cit9CisKIHZvaWQgTXRwU2VydmVyOjpzZW5kU3RvcmVBZGRlZChNdHBTdG9yYWdlSUQgaWQpIHsKICAgICBBTE9HVigic2VuZFN0b3JlQWRkZWQgJTA4WFxuIiwgaWQpOwogICAgIHNlbmRFdmVudChNVFBfRVZFTlRfU1RPUkVfQURERUQsIGlkKTsKQEAgLTQ0Miw2ICs0NDgsOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCisgICAgaWYgKHJlc3BvbnNlICE9IE1UUF9SRVNQT05TRV9PSykKKyAgICAgIEFMT0dXKCJbTVRQXSBnb3QgcmVzcG9uc2UgMHglWCBpbiBjb21tYW5kICVzICgleCkiLCByZXNwb25zZSwKKyAgICAgICAgICAgIE10cERlYnVnOjpnZXRPcGVyYXRpb25Db2RlTmFtZShvcGVyYXRpb24pLCBvcGVyYXRpb24pOwogICAgIGlmIChyZXNwb25zZSA9PSBNVFBfUkVTUE9OU0VfVFJBTlNBQ1RJT05fQ0FOQ0VMTEVEKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgbVJlc3BvbnNlLnNldFJlc3BvbnNlQ29kZShyZXNwb25zZSk7CkBAIC02NTIsOCArNjYxLDggQEAKICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX1BBUkFNRVRFUjsKICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDEpOwogICAgIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5ID0gbVJlcXVlc3QuZ2V0UGFyYW1ldGVyKDIpOwotICAgIEFMT0dWKCJHZXRPYmplY3RQcm9wVmFsdWUgJWQgJXNcbiIsIGhhbmRsZSwKLSAgICAgICAgICAgIE10cERlYnVnOjpnZXRPYmplY3RQcm9wQ29kZU5hbWUocHJvcGVydHkpKTsKKyAgICBBTE9HVigiR2V0T2JqZWN0UHJvcFZhbHVlICVkICVzICgweCUwNFgpXG4iLCBoYW5kbGUsCisgICAgICAgICAgTXRwRGVidWc6OmdldE9iamVjdFByb3BDb2RlTmFtZShwcm9wZXJ0eSksIHByb3BlcnR5KTsKIAogICAgIHJldHVybiBtRGF0YWJhc2UtPmdldE9iamVjdFByb3BlcnR5VmFsdWUoaGFuZGxlLCBwcm9wZXJ0eSwgbURhdGEpOwogfQpAQCAtOTQ2LDcgKzk1NSw4IEBACiAgICAgaWYgKCFtRGF0YS5nZXRTdHJpbmcobW9kaWZpZWQpKSByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSQU1FVEVSOyAgICAgLy8gZGF0ZSBtb2RpZmllZAogICAgIC8vIGtleXdvcmRzIGZvbGxvdwogCi0gICAgQUxPR1YoIm5hbWU6ICVzIGZvcm1hdDogJTA0WFxuIiwgKGNvbnN0IGNoYXIgKiluYW1lLCBmb3JtYXQpOworICAgIEFMT0dWKCJuYW1lOiAlcyBmb3JtYXQ6IDB4JTA0WCAoJXMpXG4iLCAoY29uc3QgY2hhciopbmFtZSwgZm9ybWF0LAorICAgICAgICAgIE10cERlYnVnOjpnZXRGb3JtYXRDb2RlTmFtZShmb3JtYXQpKTsKICAgICB0aW1lX3QgbW9kaWZpZWRUaW1lOwogICAgIGlmICghcGFyc2VEYXRlVGltZShtb2RpZmllZCwgbW9kaWZpZWRUaW1lKSkKICAgICAgICAgbW9kaWZpZWRUaW1lID0gMDsKQEAgLTk2Nyw5ICs5NzcsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0JKRUNUX1RPT19MQVJHRTsKICAgICB9CiAKLSAgICBBTE9HRCgicGF0aDogJXMgcGFyZW50OiAlZCBzdG9yYWdlSUQ6ICUwOFgiLCAoY29uc3QgY2hhciopcGF0aCwgcGFyZW50LCBzdG9yYWdlSUQpOworICAgIEFMT0dWKCJwYXRoOiAlcyBwYXJlbnQ6ICVkIHN0b3JhZ2VJRDogJTA4WCIsIChjb25zdCBjaGFyKilwYXRoLCBwYXJlbnQsIHN0b3JhZ2VJRCk7CiAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSA9IG1EYXRhYmFzZS0+YmVnaW5TZW5kT2JqZWN0KChjb25zdCBjaGFyKilwYXRoLCBmb3JtYXQsCiAgICAgICAgICAgICBwYXJlbnQsIHN0b3JhZ2VJRCk7CisgICAgQUxPR0QoImhhbmRsZTogJWQsIHBhcmVudDogJWQsIHN0b3JhZ2VJRDogJTA4WCIsIGhhbmRsZSwgcGFyZW50LCBzdG9yYWdlSUQpOwogICAgIGlmIChoYW5kbGUgPT0ga0ludmFsaWRPYmplY3RIYW5kbGUpIHsKICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9HRU5FUkFMX0VSUk9SOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTZXJ2ZXIuaCBiL21lZGlhL210cC9NdHBTZXJ2ZXIuaAppbmRleCBmNjkzOWQ3Li4xZjg3OTlmIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwU2VydmVyLmgKKysrIGIvbWVkaWEvbXRwL010cFNlcnZlci5oCkBAIC0xMTUsNiArMTE1LDcgQEAKIAogICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZE9iamVjdEFkZGVkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgc2VuZE9iamVjdFJlbW92ZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kT2JqZWN0SW5mb0NoYW5nZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kRGV2aWNlUHJvcGVydHlDaGFuZ2VkKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KTsKIAogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL21lZGlhL25kay9BbmRyb2lkLmJwIGIvbWVkaWEvbmRrL0FuZHJvaWQuYnAKaW5kZXggNWVjZTY3ZC4uZjlmMWFjYyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbmRrL0FuZHJvaWQuYnAKQEAgLTMxLDYgKzMxLDEzIEBACiAgICAgbGljZW5zZTogIk5PVElDRSIsCiB9CiAKKy8vIGZvciB1c2Ugd2l0aCBoZWFkZXJfbGlicworY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0KK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtZWRpYW5kayIsCiAKQEAgLTU1LDcgKzYyLDYgQEAKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLURFWFBPUlQ9X19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eShcImRlZmF1bHRcIikpKSIsCi0KICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCkBAIC02NSwyMSArNzEsMjYgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJtZWRpYV9qbmlfdXRpbHMiLAogICAgICAgICAibGlibWVkaWFkcm0iLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAogICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJtZWRpYTJfam5pX2NvcmUiLAorICAgICAgICAibGlibWVkaWFuZGtfdXRpbHMiLAogICAgIF0sCiAKICAgICByZXF1aXJlZDogWwpAQCAtMTA5LDUgKzEyMCw2MyBAQAogbGxuZGtfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm1lZGlhbmRrIiwKICAgICBzeW1ib2xfZmlsZTogImxpYm1lZGlhbmRrLm1hcC50eHQiLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJtZWRpYW5ka191dGlscyIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJOZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3MuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsvaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkFJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QiLAorICAgIHNyY3M6IFsidGVzdHMvQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRF9fQU5EUk9JRF9WTkRLX18iLAorICAgIF0sCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL25kay8iLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcAppbmRleCA5ZDAwZGY2Li4yMmUxNWQzIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwCisrKyBiL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgIk5ka0ltYWdlUHJpdi5oIgogI2luY2x1ZGUgIk5ka0ltYWdlUmVhZGVyUHJpdi5oIgorI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvTmRrSW1hZ2UuaD4KIAogI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTI4LDYgKzI5LDcgQEAKICNpbmNsdWRlIDx1aS9QdWJsaWNGb3JtYXQuaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWQvQUhhcmR3YXJlQnVmZmVySGVscGVycy5oPgogI2luY2x1ZGUgPGdyYWxsb2N1c2FnZS9HcmFsbG9jVXNhZ2VDb252ZXJzaW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApAQCAtNDMsNiArNDUsMTAgQEAKIGNvbnN0IGNoYXIqIEFJbWFnZVJlYWRlcjo6a0NvbnRleHRLZXkgICAgPSAiQ29udGV4dCI7CiBjb25zdCBjaGFyKiBBSW1hZ2VSZWFkZXI6OmtHcmFwaGljQnVmZmVyS2V5ID0gIkdyYXBoaWNCdWZmZXIiOwogCitzdGF0aWMgY29uc3RleHByIGludCBrV2luZG93SGFsVG9rZW5TaXplTWF4ID0gMjU2OworCitzdGF0aWMgbmF0aXZlX2hhbmRsZV90ICpjb252ZXJ0SGFsVG9rZW5Ub05hdGl2ZUhhbmRsZShjb25zdCBIYWxUb2tlbiAmaGFsVG9rZW4pOworCiBib29sCiBBSW1hZ2VSZWFkZXI6OmlzU3VwcG9ydGVkRm9ybWF0QW5kVXNhZ2UoaW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlKSB7CiAgICAgLy8gQ2hlY2sgd2hldGhlciB1c2FnZSBoYXMgZWl0aGVyIENQVV9SRUFEX09GVEVOIG9yIENQVV9SRUFEIHNldC4gTm90ZSB0aGF0IGNoZWNrIGFnYWluc3QKQEAgLTU4LDExICs2NCwxNSBAQAogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODg6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9KUEVHOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkFXMTY6CisgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SQVdfREVQVEg6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SQVdfUFJJVkFURToKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JBVzEwOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkFXMTI6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSDE2OgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEhfUE9JTlRfQ0xPVUQ6CisgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ZODoKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0hFSUM6CisgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSF9KUEVHOgogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9QUklWQVRFOgogICAgICAgICAgICAgLy8gRm9yIHByaXZhdGUgZm9ybWF0LCBjcHUgdXNhZ2UgaXMgcHJvaGliaXRlZC4KQEAgLTg0LDExICs5NCwxNSBAQAogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkdCQV9GUDE2OgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfSlBFRzoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JBVzE2OgorICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkFXX0RFUFRIOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkFXX1BSSVZBVEU6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SQVcxMDoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JBVzEyOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEgxNjoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0RFUFRIX1BPSU5UX0NMT1VEOgorICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfWTg6CisgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9IRUlDOgorICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEhfSlBFRzoKICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUFJJVkFURToKICAgICAgICAgICAgIHJldHVybiAwOwpAQCAtMzAxLDYgKzMxNSw5IEBACiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEJ1ZmZlckl0ZW1Db25zdW1lciBidWZmZXIgZGF0YVNwYWNlIik7CiAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CisgICAgaWYgKG1Vc2FnZSAmIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9QUk9URUNURURfQ09OVEVOVCkgeworICAgICAgICBnYkNvbnN1bWVyLT5zZXRDb25zdW1lcklzUHJvdGVjdGVkKHRydWUpOworICAgIH0KIAogICAgIG1TdXJmYWNlID0gbmV3IFN1cmZhY2UobVByb2R1Y2VyLCAvKmNvbnRyb2xsZWRCeUFwcCovdHJ1ZSk7CiAgICAgaWYgKG1TdXJmYWNlID09IG51bGxwdHIpIHsKQEAgLTM1MCw4ICszNjcsMTAgQEAKICAgICAgICAgICAgICAgaXQgIT0gbUFjcXVpcmVkSW1hZ2VzLmVuZCgpOyBpdCsrKSB7CiAgICAgICAgIEFJbWFnZSogaW1hZ2UgPSAqaXQ7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChpbWFnZS0+bUxvY2spOwotICAgICAgICByZWxlYXNlSW1hZ2VMb2NrZWQoaW1hZ2UsIC8qcmVsZWFzZUZlbmNlRmQqLy0xKTsKKyAgICAgICAgLy8gRG8gbm90IGFsdGVyIG1BY3F1aXJlZEltYWdlcyB3aGlsZSB3ZSBhcmUgaXRlcmF0aW5nIG9uIGl0CisgICAgICAgIHJlbGVhc2VJbWFnZUxvY2tlZChpbWFnZSwgLypyZWxlYXNlRmVuY2VGZCovLTEsIC8qY2xlYXJDYWNoZSovZmFsc2UpOwogICAgIH0KKyAgICBtQWNxdWlyZWRJbWFnZXMuY2xlYXIoKTsKIAogICAgIC8vIERlbGV0ZSBCdWZmZXIgSXRlbXMKICAgICBmb3IgKGF1dG8gaXQgPSBtQnVmZmVycy5iZWdpbigpOwpAQCAtMzYzLDYgKzM4MiwxNSBAQAogICAgICAgICBtQnVmZmVySXRlbUNvbnN1bWVyLT5hYmFuZG9uKCk7CiAgICAgICAgIG1CdWZmZXJJdGVtQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIobnVsbHB0cik7CiAgICAgfQorCisgICAgaWYgKG1XaW5kb3dIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICBpbnQgc2l6ZSA9IG1XaW5kb3dIYW5kbGUtPmRhdGFbMF07CisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGhhbFRva2VuOworICAgICAgICBoYWxUb2tlbi5zZXRUb0V4dGVybmFsKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KCZtV2luZG93SGFuZGxlLT5kYXRhWzFdKSwgc2l6ZSk7CisgICAgICAgIGRlbGV0ZUhhbFRva2VuKGhhbFRva2VuKTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobVdpbmRvd0hhbmRsZSk7CisgICAgfQogfQogCiBtZWRpYV9zdGF0dXNfdApAQCAtNDgxLDcgKzUwOSw3IEBACiB9CiAKIHZvaWQKLUFJbWFnZVJlYWRlcjo6cmVsZWFzZUltYWdlTG9ja2VkKEFJbWFnZSogaW1hZ2UsIGludCByZWxlYXNlRmVuY2VGZCkgeworQUltYWdlUmVhZGVyOjpyZWxlYXNlSW1hZ2VMb2NrZWQoQUltYWdlKiBpbWFnZSwgaW50IHJlbGVhc2VGZW5jZUZkLCBib29sIGNsZWFyQ2FjaGUpIHsKICAgICBCdWZmZXJJdGVtKiBidWZmZXIgPSBpbWFnZS0+bUJ1ZmZlcjsKICAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IGlzIG5vdCBmYXRhbApAQCAtNTA1LDYgKzUzMywxMCBAQAogICAgIGltYWdlLT5tTG9ja2VkQnVmZmVyID0gbnVsbHB0cjsKICAgICBpbWFnZS0+bUlzQ2xvc2VkID0gdHJ1ZTsKIAorICAgIGlmICghY2xlYXJDYWNoZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwogICAgIC8vIGNsZWFudXAgYWNxdWlyZWQgaW1hZ2UgbGlzdAogICAgIGZvciAoYXV0byBpdCA9IG1BY3F1aXJlZEltYWdlcy5iZWdpbigpOwpAQCAtNTIyLDYgKzU1NCwyNSBAQAogICAgIH0KIH0KIAorbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyOjpnZXRXaW5kb3dOYXRpdmVIYW5kbGUobmF0aXZlX2hhbmRsZSAqKmhhbmRsZSkgeworICAgIGlmIChtV2luZG93SGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgKmhhbmRsZSA9IG1XaW5kb3dIYW5kbGU7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGhnYnAgPQorICAgICAgICBuZXcgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4obVByb2R1Y2VyKTsKKyAgICBIYWxUb2tlbiBoYWxUb2tlbjsKKyAgICBpZiAoIWNyZWF0ZUhhbFRva2VuKGhnYnAsICZoYWxUb2tlbikpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgIH0KKyAgICBtV2luZG93SGFuZGxlID0gY29udmVydEhhbFRva2VuVG9OYXRpdmVIYW5kbGUoaGFsVG9rZW4pOworICAgIGlmICghbVdpbmRvd0hhbmRsZSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgfQorICAgICpoYW5kbGUgPSBtV2luZG93SGFuZGxlOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKIGludAogQUltYWdlUmVhZGVyOjpnZXRCdWZmZXJXaWR0aChCdWZmZXJJdGVtKiBidWZmZXIpIHsKICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHJldHVybiAtMTsKQEAgLTU4NSw2ICs2MzYsMzMgQEAKICAgICB9CiB9CiAKK3N0YXRpYyBuYXRpdmVfaGFuZGxlX3QgKmNvbnZlcnRIYWxUb2tlblRvTmF0aXZlSGFuZGxlKAorICAgICAgICBjb25zdCBIYWxUb2tlbiAmaGFsVG9rZW4pIHsKKyAgICAvLyBXZSBhdHRlbXB0IHRvIHN0b3JlIGhhbFRva2VuIGluIHRoZSBpbnRzIG9mIHRoZSBuYXRpdmVfaGFuZGxlX3QgYWZ0ZXIgaXRzCisgICAgLy8gc2l6ZS4gVGhlIGZpcnN0IGludCBzdG9yZXMgdGhlIHNpemUgb2YgdGhlIHRva2VuLiBXZSBzdG9yZSB0aGlzIGluIGFuIGludAorICAgIC8vIHRvIGF2b2lkIGFsaWdubWVudCBpc3N1ZXMgd2hlcmUgc2l6ZV90IGFuZCBpbnQgZG8gbm90IGhhdmUgdGhlIHNhbWUKKyAgICAvLyBhbGlnbm1lbnQuCisgICAgc2l6ZV90IG5oRGF0YUJ5dGVTaXplID0gaGFsVG9rZW4uc2l6ZSgpOworICAgIGlmIChuaERhdGFCeXRlU2l6ZSA+IGtXaW5kb3dIYWxUb2tlblNpemVNYXgpIHsKKyAgICAgICAgLy8gVGhlIHNpemUgb2YgdGhlIHRva2VuIGlzbid0IHJlYXNvbmFibGUuLgorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc2l6ZV90IG51bUludHMgPSBjZWlsKG5oRGF0YUJ5dGVTaXplIC8gc2l6ZW9mKGludCkpICsgMTsKKworICAgIC8vIFdlIGRvbid0IGNoZWNrIGZvciBvdmVyZmxvdywgd2hldGhlciBudW1JbnRzIGNhbiBmaXQgaW4gYW4gaW50LCBzaW5jZSB3ZQorICAgIC8vIGV4cGVjdCBrV2luZG93SGFsVG9rZW5TaXplTWF4IHRvIGJlIGEgcmVhc29uYWJsZSBsaW1pdC4KKyAgICAvLyBjcmVhdGUgYSBuYXRpdmVfaGFuZGxlX3Qgd2l0aCAwIG51bUZkcyBhbmQgbnVtSW50cyBudW1iZXIgb2YgaW50cy4KKyAgICBuYXRpdmVfaGFuZGxlX3QgKm5oID0KKyAgICAgICAgbmF0aXZlX2hhbmRsZV9jcmVhdGUoMCwgbnVtSW50cyk7CisgICAgaWYgKCFuaCkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgLy8gU3RvcmUgdGhlIHNpemUgb2YgdGhlIHRva2VuIGluIHRoZSBmaXJzdCBpbnQuCisgICAgbmgtPmRhdGFbMF0gPSBuaERhdGFCeXRlU2l6ZTsKKyAgICBtZW1jcHkoJihuaC0+ZGF0YVsxXSksIGhhbFRva2VuLmRhdGEoKSwgbmhEYXRhQnl0ZVNpemUpOworICAgIHJldHVybiBuaDsKK30KKwogRVhQT1JUCiBtZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfbmV3KAogICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBmb3JtYXQsIGludDMyX3QgbWF4SW1hZ2VzLApAQCAtNTk0LDYgKzY3MiwxOSBAQAogICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQURfT0ZURU4sIG1heEltYWdlcywgcmVhZGVyKTsKIH0KIAorZXh0ZXJuICJDIiB7CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZSgKKyAgICAgICAgQUltYWdlUmVhZGVyICpyZWFkZXIsIC8qb3V0Ki9uYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpIHsKKyAgICBpZiAocmVhZGVyID09IG51bGxwdHIgfHwgaGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgcmV0dXJuIHJlYWRlci0+Z2V0V2luZG93TmF0aXZlSGFuZGxlKGhhbmRsZSk7Cit9CisKK30gLy9leHRlcm4gIkMiCisKIEVYUE9SVAogbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX25ld1dpdGhVc2FnZSgKICAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSwKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlclByaXYuaCBiL21lZGlhL25kay9OZGtJbWFnZVJlYWRlclByaXYuaAppbmRleCBiZWQ4YTIxLi5lMzI4Y2IxIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXJQcml2LmgKKysrIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyUHJpdi5oCkBAIC02OSw2ICs2OSw4IEBACiAgICAgbWVkaWFfc3RhdHVzX3QgYWNxdWlyZU5leHRJbWFnZSgvKm91dCovQUltYWdlKiogaW1hZ2UsIC8qb3V0Ki9pbnQqIGZlbmNlRmQpOwogICAgIG1lZGlhX3N0YXR1c190IGFjcXVpcmVMYXRlc3RJbWFnZSgvKm91dCovQUltYWdlKiogaW1hZ2UsIC8qb3V0Ki9pbnQqIGZlbmNlRmQpOwogCisgICAgbWVkaWFfc3RhdHVzX3QgZ2V0V2luZG93TmF0aXZlSGFuZGxlKC8qb3V0Ki9uYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCiAgICAgQU5hdGl2ZVdpbmRvdyogZ2V0V2luZG93KCkgICAgY29uc3QgeyByZXR1cm4gbVdpbmRvdy5nZXQoKTsgfTsKICAgICBpbnQzMl90ICAgICAgICBnZXRXaWR0aCgpICAgICBjb25zdCB7IHJldHVybiBtV2lkdGg7IH07CiAgICAgaW50MzJfdCAgICAgICAgZ2V0SGVpZ2h0KCkgICAgY29uc3QgeyByZXR1cm4gbUhlaWdodDsgfTsKQEAgLTg2LDcgKzg4LDcgQEAKICAgICBtZWRpYV9zdGF0dXNfdCBhY3F1aXJlSW1hZ2VMb2NrZWQoLypvdXQqL0FJbWFnZSoqIGltYWdlLCAvKm91dCovaW50KiBmZW5jZUZkKTsKIAogICAgIC8vIENhbGxlZCBieSBBSW1hZ2UvfkFJbWFnZVJlYWRlciB0byBjbG9zZSBpbWFnZS4gQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRvIGdyYWIgQUltYWdlOjptTG9jawotICAgIHZvaWQgcmVsZWFzZUltYWdlTG9ja2VkKEFJbWFnZSogaW1hZ2UsIGludCByZWxlYXNlRmVuY2VGZCk7CisgICAgdm9pZCByZWxlYXNlSW1hZ2VMb2NrZWQoQUltYWdlKiBpbWFnZSwgaW50IHJlbGVhc2VGZW5jZUZkLCBib29sIGNsZWFyQ2FjaGUgPSB0cnVlKTsKIAogICAgIHN0YXRpYyBpbnQgZ2V0QnVmZmVyV2lkdGgoQnVmZmVySXRlbSogYnVmZmVyKTsKICAgICBzdGF0aWMgaW50IGdldEJ1ZmZlckhlaWdodChCdWZmZXJJdGVtKiBidWZmZXIpOwpAQCAtMTYwLDYgKzE2Miw3IEBACiAgICAgc3A8U3VyZmFjZT4gICAgICAgICAgICAgICAgbVN1cmZhY2U7CiAgICAgc3A8QnVmZmVySXRlbUNvbnN1bWVyPiAgICAgbUJ1ZmZlckl0ZW1Db25zdW1lcjsKICAgICBzcDxBTmF0aXZlV2luZG93PiAgICAgICAgICBtV2luZG93OworICAgIG5hdGl2ZV9oYW5kbGVfdCogICAgICAgICAgIG1XaW5kb3dIYW5kbGUgPSBudWxscHRyOwogCiAgICAgTGlzdDxBSW1hZ2UqPiAgICAgICAgICAgICAgbUFjcXVpcmVkSW1hZ2VzOwogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKaW5kZXggNDIyODVmOC4uYzIzZjE5YiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcApAQCAtMjEsOCArMjEsOCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KICNpbmNsdWRlICJOZGtNZWRpYUNyeXB0b1ByaXYuaCIKLSNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUNyeXB0by5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFDcnlwdG8uY3BwCmluZGV4IDAwZDQ1MjAuLmNlMmM2NjAgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUNyeXB0by5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvLmNwcApAQCAtMjAsNyArMjAsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNvZGVjLmg+Ci0jaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CiAKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwCmluZGV4IDlkMDBlNWUuLjA4OTFmMmEgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwCkBAIC0yMywzMiArMjMsMTAyIEBACiAjaW5jbHVkZSA8am5pLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuaD4KIAogI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCIKICNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgorI2luY2x1ZGUgIk5ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaCIKKworI2luY2x1ZGUgPG11dGV4PiAvLyBzdGQ6OmNhbGxfb25jZSxvbmNlX2ZsYWcKKyNpbmNsdWRlIDxkbGZjbi5oPiAvLyBkbG9wZW4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKKy8vIGxvYWQgbGliYW5kcm9pZF9ydW50aW1lLnNvIGxhemlseS4KKy8vIEEgdmVuZG9yIHByb2Nlc3MgbWF5IHVzZSBsaWJtZWRpYW5kayBidXQgc2hvdWxkIG5vdCBkZXBlbmQgb24gbGliYW5kcm9pZF9ydW50aW1lLgorLy8gVE9ETyhqb295dW5nKTogcmVtb3ZlIGR1cGxpY2F0ZSAoYi8xMjU1NTAxMjEpCisvLyBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2JpbmRlci9uZGsvaWJpbmRlcl9qbmkuY3BwCituYW1lc3BhY2UgeworCit0eXBlZGVmIEpOSUVudiogKCpnZXRKTklFbnZfdCkoKTsKK3R5cGVkZWYgc3A8SUJpbmRlcj4gKCppYmluZGVyRm9ySmF2YU9iamVjdF90KShKTklFbnYqIGVudiwgam9iamVjdCBvYmopOworCitnZXRKTklFbnZfdCBnZXRKTklFbnZfOworaWJpbmRlckZvckphdmFPYmplY3RfdCBpYmluZGVyRm9ySmF2YU9iamVjdF87CisKK3N0ZDo6b25jZV9mbGFnIG1Mb2FkRmxhZzsKKwordm9pZCBsb2FkKCkgeworICAgIHN0ZDo6Y2FsbF9vbmNlKG1Mb2FkRmxhZywgW10oKSB7CisgICAgICAgIHZvaWQqIGhhbmRsZSA9IGRsb3BlbigibGliYW5kcm9pZF9ydW50aW1lLnNvIiwgUlRMRF9MQVpZKTsKKyAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IG9wZW4gbGliYW5kcm9pZF9ydW50aW1lLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZ2V0Sk5JRW52XyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Z2V0Sk5JRW52X3Q+KAorICAgICAgICAgICAgICAgIGRsc3ltKGhhbmRsZSwgIl9aTjdhbmRyb2lkMTRBbmRyb2lkUnVudGltZTlnZXRKTklFbnZFdiIpKTsKKyAgICAgICAgaWYgKGdldEpOSUVudl8gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYuIik7CisgICAgICAgICAgICAvLyBubyByZXR1cm4KKyAgICAgICAgfQorCisgICAgICAgIGliaW5kZXJGb3JKYXZhT2JqZWN0XyA9IHJlaW50ZXJwcmV0X2Nhc3Q8aWJpbmRlckZvckphdmFPYmplY3RfdD4oCisgICAgICAgICAgICAgICAgZGxzeW0oaGFuZGxlLCAiX1pON2FuZHJvaWQyMGliaW5kZXJGb3JKYXZhT2JqZWN0RVA3X0pOSUVudlA4X2pvYmplY3QiKSk7CisgICAgICAgIGlmIChpYmluZGVyRm9ySmF2YU9iamVjdF8gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBmaW5kIGliaW5kZXJGb3JKYXZhT2JqZWN0LiIpOworICAgICAgICAgICAgLy8gbm8gcmV0dXJuCisgICAgICAgIH0KKyAgICB9KTsKK30KKworSk5JRW52KiBnZXRKTklFbnYoKSB7CisgICAgbG9hZCgpOworICAgIGlmIChnZXRKTklFbnZfID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiAoZ2V0Sk5JRW52XykoKTsKK30KKworc3A8SUJpbmRlcj4gaWJpbmRlckZvckphdmFPYmplY3QoSk5JRW52KiBlbnYsIGpvYmplY3Qgb2JqKSB7CisgICAgbG9hZCgpOworICAgIGlmIChpYmluZGVyRm9ySmF2YU9iamVjdF8gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIChpYmluZGVyRm9ySmF2YU9iamVjdF8pKGVudiwgb2JqKTsKK30KKworfSAvLyBuYW1lc3BhY2UKKwogc3RydWN0IEFNZWRpYURhdGFTb3VyY2UgewogICAgIHZvaWQgKnVzZXJkYXRhOwogICAgIEFNZWRpYURhdGFTb3VyY2VSZWFkQXQgcmVhZEF0OwogICAgIEFNZWRpYURhdGFTb3VyY2VHZXRTaXplIGdldFNpemU7CiAgICAgQU1lZGlhRGF0YVNvdXJjZUNsb3NlIGNsb3NlOworICAgIEFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplIGdldEF2YWlsYWJsZVNpemU7CisgICAgc3A8RGF0YVNvdXJjZT4gbUltcGw7CisgICAgdWludDMyX3QgbUZsYWdzOwogfTsKIAogTmRrRGF0YVNvdXJjZTo6TmRrRGF0YVNvdXJjZShBTWVkaWFEYXRhU291cmNlICpkYXRhU291cmNlKQogICAgIDogbURhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZV9uZXcoKSkgewotICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPnJlYWRBdCk7Ci0gICAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemUobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPmdldFNpemUpOwotICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRDbG9zZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Y2xvc2UpOwotICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+dXNlcmRhdGEpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0KG1EYXRhU291cmNlLCBkYXRhU291cmNlLT5yZWFkQXQpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0U2l6ZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Z2V0U2l6ZSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRDbG9zZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Y2xvc2UpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0VXNlcmRhdGEobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPnVzZXJkYXRhKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldEF2YWlsYWJsZVNpemUobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPmdldEF2YWlsYWJsZVNpemUpOworICAgIG1EYXRhU291cmNlLT5tSW1wbCA9IGRhdGFTb3VyY2UtPm1JbXBsOworICAgIG1EYXRhU291cmNlLT5tRmxhZ3MgPSBkYXRhU291cmNlLT5tRmxhZ3M7CiB9CiAKIE5ka0RhdGFTb3VyY2U6On5OZGtEYXRhU291cmNlKCkgewpAQCAtNTksOSArMTI5LDEzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCit1aW50MzJfdCBOZGtEYXRhU291cmNlOjpmbGFncygpIHsKKyAgICByZXR1cm4gbURhdGFTb3VyY2UtPm1GbGFnczsKK30KKwogc3NpemVfdCBOZGtEYXRhU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwotICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSA9PSBOVUxMIHx8IG1EYXRhU291cmNlLT51c2VyZGF0YSA9PSBOVUxMKSB7CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQgPT0gTlVMTCB8fCBtRGF0YVNvdXJjZS0+dXNlcmRhdGEgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIHJldHVybiBtRGF0YVNvdXJjZS0+cmVhZEF0KG1EYXRhU291cmNlLT51c2VyZGF0YSwgb2Zmc2V0LCBkYXRhLCBzaXplKTsKQEAgLTkyLDYgKzE2NiwxMDAgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IE5ka0RhdGFTb3VyY2U6OmdldEF2YWlsYWJsZVNpemUob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgKnNpemVwdHIpIHsKKyAgICBvZmY2NF90IHNpemUgPSAtMTsKKyAgICBpZiAobURhdGFTb3VyY2UtPmdldEF2YWlsYWJsZVNpemUgIT0gTlVMTAorICAgICAgICAgICAgJiYgbURhdGFTb3VyY2UtPnVzZXJkYXRhICE9IE5VTEwKKyAgICAgICAgICAgICYmIHNpemVwdHIgIT0gTlVMTCkgeworICAgICAgICBzaXplID0gbURhdGFTb3VyY2UtPmdldEF2YWlsYWJsZVNpemUobURhdGFTb3VyY2UtPnVzZXJkYXRhLCBvZmZzZXQpOworICAgICAgICAqc2l6ZXB0ciA9IHNpemU7CisgICAgfQorICAgIHJldHVybiBzaXplID49IDAgPyBPSyA6IFVOS05PV05fRVJST1I7Cit9CisKK3N0YXRpYyBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlRnJvbUphdmFPYmooSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqLCBpbnQgdmVyc2lvbikgeworICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3A8SUJpbmRlcj4gYmluZGVyOworICAgIHN3aXRjaCAodmVyc2lvbikgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBiaW5kZXIgPSBpYmluZGVyRm9ySmF2YU9iamVjdChlbnYsIG9iaik7CisgICAgICAgICAgICBpZiAoYmluZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVkaWFIVFRQU2VydmljZT4oYmluZGVyKTsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcmV0dXJuIG5ldyBKTWVkaWEySFRUUFNlcnZpY2UoZW52LCBvYmopOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgc3A8TWVkaWFIVFRQU2VydmljZT4gY3JlYXRlTWVkaWFIdHRwU2VydmljZVRlbXBsYXRlKAorICAgICAgICBKTklFbnYgKmVudiwKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBjb25zdCBjaGFyICpjbGF6eiwKKyAgICAgICAgY29uc3QgY2hhciAqbWV0aG9kLAorICAgICAgICBjb25zdCBjaGFyICpzaWduYXR1cmUsCisgICAgICAgIGludCB2ZXJzaW9uKSB7CisgICAgam9iamVjdCBzZXJ2aWNlID0gTlVMTDsKKyAgICBpZiAoZW52ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImh0dHAgc2VydmljZSBtdXN0IGJlIGNyZWF0ZWQgZnJvbSBKYXZhIHRocmVhZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBqY2xhc3MgbWVkaWFodHRwY2xhc3MgPSBlbnYtPkZpbmRDbGFzcyhjbGF6eik7CisgICAgaWYgKG1lZGlhaHR0cGNsYXNzID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImNhbid0IGZpbmQgTWVkaWEoMilIdHRwU2VydmljZSIpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGptZXRob2RJRCBtZWRpYUh0dHBDcmVhdGVNZXRob2QgPSBlbnYtPkdldFN0YXRpY01ldGhvZElEKG1lZGlhaHR0cGNsYXNzLCBtZXRob2QsIHNpZ25hdHVyZSk7CisgICAgaWYgKG1lZGlhSHR0cENyZWF0ZU1ldGhvZCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJjYW4ndCBmaW5kIG1ldGhvZCIpOworICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGpzdHJpbmcganVyaSA9IGVudi0+TmV3U3RyaW5nVVRGKHVyaSk7CisKKyAgICBzZXJ2aWNlID0gZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKG1lZGlhaHR0cGNsYXNzLCBtZWRpYUh0dHBDcmVhdGVNZXRob2QsIGp1cmkpOworICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoanVyaSk7CisKKyAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7CisgICAgc3A8TWVkaWFIVFRQU2VydmljZT4gaHR0cFNlcnZpY2UgPSBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlRnJvbUphdmFPYmooZW52LCBzZXJ2aWNlLCB2ZXJzaW9uKTsKKyAgICByZXR1cm4gaHR0cFNlcnZpY2U7CisKK30KKworc3A8TWVkaWFIVFRQU2VydmljZT4gY3JlYXRlTWVkaWFIdHRwU2VydmljZShjb25zdCBjaGFyICp1cmksIGludCB2ZXJzaW9uKSB7CisKKyAgICBKTklFbnYgKmVudjsKKyAgICBjb25zdCBjaGFyICpjbGF6eiwgKm1ldGhvZCwgKnNpZ25hdHVyZTsKKworICAgIHN3aXRjaCAodmVyc2lvbikgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBlbnYgPSBnZXRKTklFbnYoKTsKKyAgICAgICAgICAgIGNsYXp6ID0gImFuZHJvaWQvbWVkaWEvTWVkaWFIVFRQU2VydmljZSI7CisgICAgICAgICAgICBtZXRob2QgPSAiY3JlYXRlSHR0cFNlcnZpY2VCaW5kZXJJZk5lY2Vzc2FyeSI7CisgICAgICAgICAgICBzaWduYXR1cmUgPSAiKExqYXZhL2xhbmcvU3RyaW5nOylMYW5kcm9pZC9vcy9JQmluZGVyOyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICAgICAgICAgIGNsYXp6ID0gImFuZHJvaWQvbWVkaWEvTWVkaWEySFRUUFNlcnZpY2UiOworICAgICAgICAgICAgbWV0aG9kID0gImNyZWF0ZUhUVFBTZXJ2aWNlIjsKKyAgICAgICAgICAgIHNpZ25hdHVyZSA9ICIoTGphdmEvbGFuZy9TdHJpbmc7KUxhbmRyb2lkL21lZGlhL01lZGlhMkhUVFBTZXJ2aWNlOyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlVGVtcGxhdGUoZW52LCB1cmksIGNsYXp6LCBtZXRob2QsIHNpZ25hdHVyZSwgdmVyc2lvbik7CisKK30KKwogZXh0ZXJuICJDIiB7CiAKIEVYUE9SVApAQCAtMTA1LDYgKzI3MywzMiBAQAogfQogCiBFWFBPUlQKK0FNZWRpYURhdGFTb3VyY2UqIEFNZWRpYURhdGFTb3VyY2VfbmV3VXJpKAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGludCBudW1oZWFkZXJzLAorICAgICAgICBjb25zdCBjaGFyICogY29uc3QgKmtleV92YWx1ZXMpIHsKKworICAgIHNwPE1lZGlhSFRUUFNlcnZpY2U+IHNlcnZpY2UgPSBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlKHVyaSwgLyogdmVyc2lvbiA9ICovIDEpOworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGhlYWRlcnM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1oZWFkZXJzOyArK2kpIHsKKyAgICAgICAgU3RyaW5nOCBrZXk4KGtleV92YWx1ZXNbaSAqIDJdKTsKKyAgICAgICAgU3RyaW5nOCB2YWx1ZTgoa2V5X3ZhbHVlc1tpICogMiArIDFdKTsKKyAgICAgICAgaGVhZGVycy5hZGQoa2V5OCwgdmFsdWU4KTsKKyAgICB9CisKKyAgICBzcDxEYXRhU291cmNlPiBzb3VyY2UgPSBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlRnJvbVVSSShzZXJ2aWNlLCB1cmksICZoZWFkZXJzKTsKKyAgICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkFNZWRpYURhdGFTb3VyY2VfbmV3VXJpIHNvdXJjZSBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBBTE9HSSgiQU1lZGlhRGF0YVNvdXJjZV9uZXdVcmkgc291cmNlICVzIGZsYWdzICV1Iiwgc291cmNlLT50b1N0cmluZygpLmNfc3RyKCksIHNvdXJjZS0+ZmxhZ3MoKSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZSogYVNvdXJjZSA9IGNvbnZlcnREYXRhU291cmNlVG9BTWVkaWFEYXRhU291cmNlKHNvdXJjZSk7CisgICAgYVNvdXJjZS0+bUltcGwgPSBzb3VyY2U7CisgICAgYVNvdXJjZS0+bUZsYWdzID0gc291cmNlLT5mbGFncygpOworICAgIHJldHVybiBhU291cmNlOworfQorCitFWFBPUlQKIHZvaWQgQU1lZGlhRGF0YVNvdXJjZV9kZWxldGUoQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSkgewogICAgIEFMT0dWKCJkdG9yIik7CiAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewpAQCAtMTMyLDUgKzMyNiwxNiBAQAogICAgIG1Tb3VyY2UtPmNsb3NlID0gY2xvc2U7CiB9CiAKK0VYUE9SVAordm9pZCBBTWVkaWFEYXRhU291cmNlX2Nsb3NlKEFNZWRpYURhdGFTb3VyY2UgKm1Tb3VyY2UpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+Y2xvc2UobVNvdXJjZS0+dXNlcmRhdGEpOworfQorCitFWFBPUlQKK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRBdmFpbGFibGVTaXplKEFNZWRpYURhdGFTb3VyY2UgKm1Tb3VyY2UsCisgICAgICAgIEFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplIGdldEF2YWlsYWJsZVNpemUpIHsKKyAgICBtU291cmNlLT5nZXRBdmFpbGFibGVTaXplID0gZ2V0QXZhaWxhYmxlU2l6ZTsKK30KKwogfSAvLyBleHRlcm4gIkMiCiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3MuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZhNTdkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3MuY3BwCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzIgorCisjaW5jbHVkZSAiTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzUHJpdi5oIgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3NzaXplX3QgRGF0YVNvdXJjZV9nZXRTaXplKHZvaWQgKnVzZXJkYXRhKSB7CisgICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7CisgICAgb2ZmNjRfdCBzaXplID0gLTE7CisgICAgc291cmNlLT5nZXRTaXplKCZzaXplKTsKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3NpemVfdCBEYXRhU291cmNlX3JlYWRBdCh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKiBidWYsIHNpemVfdCBzaXplKSB7CisgICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7CisgICAgcmV0dXJuIHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmLCBzaXplKTsKK30KKwordm9pZCBEYXRhU291cmNlX2Nsb3NlKHZvaWQgKnVzZXJkYXRhKSB7CisgICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7CisgICAgc291cmNlLT5jbG9zZSgpOworfQorCitzc2l6ZV90IERhdGFTb3VyY2VfZ2V0QXZhaWxhYmxlU2l6ZSh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBvZmY2NF90IHNpemUgPSAtMTsKKyAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKKyAgICBzb3VyY2UtPmdldEF2YWlsYWJsZVNpemUob2Zmc2V0LCAmc2l6ZSk7CisgICAgcmV0dXJuICBzaXplOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaCBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3NQcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwMzMwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3NQcml2LmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBX01FRElBX0RBVEFfU09VUkNFX0NBTExCQUNLU19ICisKKyNkZWZpbmUgQV9NRURJQV9EQVRBX1NPVVJDRV9DQUxMQkFDS1NfSAorCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzc2l6ZV90IERhdGFTb3VyY2VfZ2V0U2l6ZSh2b2lkICp1c2VyZGF0YSk7CisKK3NzaXplX3QgRGF0YVNvdXJjZV9yZWFkQXQodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICogYnVmLCBzaXplX3Qgc2l6ZSk7CisKK3ZvaWQgRGF0YVNvdXJjZV9jbG9zZSh2b2lkICp1c2VyZGF0YSk7CisKK3NzaXplX3QgRGF0YVNvdXJjZV9nZXRBdmFpbGFibGVTaXplKHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCk7CisKK3N0YXRpYyBpbmxpbmUgQU1lZGlhRGF0YVNvdXJjZSogY29udmVydERhdGFTb3VyY2VUb0FNZWRpYURhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkgeworICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSA9IEFNZWRpYURhdGFTb3VyY2VfbmV3KCk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YShtU291cmNlLCBzb3VyY2UuZ2V0KCkpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0KG1Tb3VyY2UsIERhdGFTb3VyY2VfcmVhZEF0KTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemUobVNvdXJjZSwgRGF0YVNvdXJjZV9nZXRTaXplKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldENsb3NlKG1Tb3VyY2UsIERhdGFTb3VyY2VfY2xvc2UpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0QXZhaWxhYmxlU2l6ZShtU291cmNlLCBEYXRhU291cmNlX2dldEF2YWlsYWJsZVNpemUpOworICAgIHJldHVybiBtU291cmNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfTUVESUFfREFUQV9TT1VSQ0VfQ0FMTEJBQ0tTX0gKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VQcml2LmggYi9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlUHJpdi5oCmluZGV4IGVhOWM4NjUuLjE2ZmY5NzQgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VQcml2LmgKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZVByaXYuaApAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KQEAgLTQzLDExICs0NCwxMyBAQAogICAgIE5ka0RhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZSAqKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOwogICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqKTsKICAgICB2aXJ0dWFsIFN0cmluZzggdG9TdHJpbmcoKTsKICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF2YWlsYWJsZVNpemUob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgKnNpemUpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TmRrRGF0YVNvdXJjZSgpOwpAQCAtNTksNSArNjIsNyBAQAogCiB9OwogCitzcDxNZWRpYUhUVFBTZXJ2aWNlPiBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlKGNvbnN0IGNoYXIgKnVyaSwgaW50IHZlcnNpb24pOworCiAjZW5kaWYgLy8gX05ES19NRURJQV9EQVRBU09VUkNFX1BSSVZfSAogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcAppbmRleCBiNmVhMTgzLi4yZGViMWE0IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKQEAgLTI3NCw3ICsyNzQsMTAgQEAKICAgICB9CiAKICAgICBTdHJpbmc4IG1pbWVTdHIgPSBtaW1lVHlwZSA/IFN0cmluZzgobWltZVR5cGUpIDogU3RyaW5nOCgiIik7Ci0gICAgcmV0dXJuIGRybS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVN0cik7CisgICAgYm9vbCBpc1N1cHBvcnRlZCA9IGZhbHNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRybS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVN0ciwKKyAgICAgICAgICAgIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxVbmtub3duLCAmaXNTdXBwb3J0ZWQpOworICAgIHJldHVybiAoc3RhdHVzID09IE9LKSAmJiBpc1N1cHBvcnRlZDsKIH0KIAogRVhQT1JUCkBAIC00MzAsNiArNDMzLDcgQEAKICAgICB9CiAgICAgU3RyaW5nOCBkZWZhdWx0VXJsOwogICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUga2V5UmVxdWVzdFR5cGU7CisgICAgbU9iai0+bUtleVJlcXVlc3QuY2xlYXIoKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5nZXRLZXlSZXF1ZXN0KCppdGVyLCBtZEluaXQsIFN0cmluZzgobWltZVR5cGUpLAogICAgICAgICAgICAgbWRLZXlUeXBlLCBtZE9wdGlvbmFsUGFyYW1ldGVycywgbU9iai0+bUtleVJlcXVlc3QsIGRlZmF1bHRVcmwsCiAgICAgICAgICAgICAma2V5UmVxdWVzdFR5cGUpOwpAQCAtNjk3LDcgKzcwMSw3IEBACiAgICAgVmVjdG9yPHVpbnQ4X3Q+IGJ5dGVBcnJheTsKICAgICBieXRlQXJyYXkuYXBwZW5kQXJyYXkodmFsdWUsIHZhbHVlU2l6ZSk7CiAKLSAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKG1PYmotPm1Ecm0tPmdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzgocHJvcGVydHlOYW1lKSwKKyAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKG1PYmotPm1Ecm0tPnNldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzgocHJvcGVydHlOYW1lKSwKICAgICAgICAgICAgICAgICAgICAgYnl0ZUFycmF5KSk7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IDRiZTcxYWMuLmM4M2IyNTUgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcApAQCAtMjAsOCArMjAsOSBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KICNpbmNsdWRlICJOZGtNZWRpYURhdGFTb3VyY2VQcml2LmgiCi0jaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCiAKIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CkBAIC0zMyw4OCArMzQsMjkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWRfdXRpbF9CaW5kZXIuaD4KIAogI2luY2x1ZGUgPGpuaS5oPgogCi0jaW5jbHVkZSA8bXV0ZXg+IC8vIHN0ZDo6Y2FsbF9vbmNlLG9uY2VfZmxhZwotI2luY2x1ZGUgPGRsZmNuLmg+IC8vIGRsb3BlbgotCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotLy8gbG9hZCBsaWJhbmRyb2lkX3J1bnRpbWUuc28gbGF6aWx5LgotLy8gQSB2ZW5kb3IgcHJvY2VzcyBtYXkgdXNlIGxpYm1lZGlhbmRrIGJ1dCBzaG91bGQgbm90IGRlcGVuZCBvbiBsaWJhbmRyb2lkX3J1bnRpbWUuCi0vLyBUT0RPKGpvb3l1bmcpOiByZW1vdmUgZHVwbGljYXRlIChiLzEyNTU1MDEyMSkKLS8vIGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvYmluZGVyL25kay9pYmluZGVyX2puaS5jcHAKLW5hbWVzcGFjZSB7Ci0KLXR5cGVkZWYgSk5JRW52KiAoKmdldEpOSUVudl90KSgpOwotdHlwZWRlZiBzcDxJQmluZGVyPiAoKmliaW5kZXJGb3JKYXZhT2JqZWN0X3QpKEpOSUVudiogZW52LCBqb2JqZWN0IG9iaik7Ci0KLWdldEpOSUVudl90IGdldEpOSUVudl87Ci1pYmluZGVyRm9ySmF2YU9iamVjdF90IGliaW5kZXJGb3JKYXZhT2JqZWN0XzsKLQotc3RkOjpvbmNlX2ZsYWcgbUxvYWRGbGFnOwotCi12b2lkIGxvYWQoKSB7Ci0gICAgc3RkOjpjYWxsX29uY2UobUxvYWRGbGFnLCBbXSgpIHsKLSAgICAgICAgdm9pZCogaGFuZGxlID0gZGxvcGVuKCJsaWJhbmRyb2lkX3J1bnRpbWUuc28iLCBSVExEX0xBWlkpOwotICAgICAgICBpZiAoaGFuZGxlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3Qgb3BlbiBsaWJhbmRyb2lkX3J1bnRpbWUuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBnZXRKTklFbnZfID0gcmVpbnRlcnByZXRfY2FzdDxnZXRKTklFbnZfdD4oCi0gICAgICAgICAgICAgICAgZGxzeW0oaGFuZGxlLCAiX1pON2FuZHJvaWQxNEFuZHJvaWRSdW50aW1lOWdldEpOSUVudkV2IikpOwotICAgICAgICBpZiAoZ2V0Sk5JRW52XyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGZpbmQgQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudi4iKTsKLSAgICAgICAgICAgIC8vIG5vIHJldHVybgotICAgICAgICB9Ci0KLSAgICAgICAgaWJpbmRlckZvckphdmFPYmplY3RfID0gcmVpbnRlcnByZXRfY2FzdDxpYmluZGVyRm9ySmF2YU9iamVjdF90PigKLSAgICAgICAgICAgICAgICBkbHN5bShoYW5kbGUsICJfWk43YW5kcm9pZDIwaWJpbmRlckZvckphdmFPYmplY3RFUDdfSk5JRW52UDhfam9iamVjdCIpKTsKLSAgICAgICAgaWYgKGliaW5kZXJGb3JKYXZhT2JqZWN0XyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGZpbmQgaWJpbmRlckZvckphdmFPYmplY3QuIik7Ci0gICAgICAgICAgICAvLyBubyByZXR1cm4KLSAgICAgICAgfQotICAgIH0pOwotfQotCi1KTklFbnYqIGdldEpOSUVudigpIHsKLSAgICBsb2FkKCk7Ci0gICAgaWYgKGdldEpOSUVudl8gPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgcmV0dXJuIChnZXRKTklFbnZfKSgpOwotfQotCi1zcDxJQmluZGVyPiBpYmluZGVyRm9ySmF2YU9iamVjdChKTklFbnYqIGVudiwgam9iamVjdCBvYmopIHsKLSAgICBsb2FkKCk7Ci0gICAgaWYgKGliaW5kZXJGb3JKYXZhT2JqZWN0XyA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICByZXR1cm4gKGliaW5kZXJGb3JKYXZhT2JqZWN0XykoZW52LCBvYmopOwotfQotCi19IC8vIG5hbWVzcGFjZQotCi1zdGF0aWMgbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgewotICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKLSAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9JTykgewotICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwotICAgIH0KLQotICAgIEFMT0dFKCJzZiBlcnJvciBjb2RlOiAlZCIsIGVycik7Ci0gICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwotfQotCiBzdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yIHsKICAgICBzcDxOdU1lZGlhRXh0cmFjdG9yPiBtSW1wbDsKICAgICBzcDxBQnVmZmVyPiBtUHNzaEJ1ZjsKIH07CiAKK3NwPEFCdWZmZXI+IFUzMkFycmF5VG9TaXplQnVmKHNpemVfdCBudW1TdWJTYW1wbGVzLCB1aW50MzJfdCAqZGF0YSkgeworICAgIGlmIChudW1TdWJTYW1wbGVzID4gIFNJWkVfTUFYIC8gc2l6ZW9mKHNpemVfdCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNwPEFCdWZmZXI+IHNpemVidWYgPSBuZXcgQUJ1ZmZlcihudW1TdWJTYW1wbGVzICogc2l6ZW9mKHNpemVfdCkpOworICAgIHNpemVfdCAqc2l6ZXMgPSAoc2l6ZV90ICopc2l6ZWJ1Zi0+ZGF0YSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBzaXplcyAhPSBOVUxMICYmIGkgPCBudW1TdWJTYW1wbGVzOyBpKyspIHsKKyAgICAgICAgc2l6ZXNbaV0gPSBkYXRhW2ldOworICAgIH0KKyAgICByZXR1cm4gc2l6ZWJ1ZjsKK30KKwogZXh0ZXJuICJDIiB7CiAKIEVYUE9SVApAQCAtMTM5LDQ3ICs4MSwzNSBAQAogICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1JbXBsLT5zZXREYXRhU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCkpOwogfQogCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZVdpdGhIZWFkZXJzKEFNZWRpYUV4dHJhY3RvciAqbURhdGEsCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgaW50IG51bWhlYWRlcnMsCisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqa2V5cywKKyAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICp2YWx1ZXMpIHsKKworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVzKSIsIHVyaSk7CisKKyAgICBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZSA9IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2UodXJpLCAvKiB2ZXJzaW9uID0gKi8gMSk7CisgICAgaWYgKGh0dHBTZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImNhbid0IGNyZWF0ZSBodHRwIHNlcnZpY2UiKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBoZWFkZXJzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtaGVhZGVyczsgKytpKSB7CisgICAgICAgIFN0cmluZzgga2V5OChrZXlzW2ldKTsKKyAgICAgICAgU3RyaW5nOCB2YWx1ZTgodmFsdWVzW2ldKTsKKyAgICAgICAgaGVhZGVycy5hZGQoa2V5OCwgdmFsdWU4KTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgZXJyID0gbURhdGEtPm1JbXBsLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCB1cmksIG51bWhlYWRlcnMgPiAwID8gJmhlYWRlcnMgOiBOVUxMKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7Cit9CisKIEVYUE9SVAogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2UoQU1lZGlhRXh0cmFjdG9yICptRGF0YSwgY29uc3QgY2hhciAqbG9jYXRpb24pIHsKLSAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCBsb2NhdGlvbik7Ci0gICAgLy8gVE9ETzogYWRkIGhlYWRlciBzdXBwb3J0Ci0KLSAgICBKTklFbnYgKmVudiA9IGdldEpOSUVudigpOwotICAgIGpvYmplY3Qgc2VydmljZSA9IE5VTEw7Ci0gICAgaWYgKGVudiA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJzZXREYXRhU291cmNlKHBhdGgpIG11c3QgYmUgY2FsbGVkIGZyb20gSmF2YSB0aHJlYWQiKTsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBqY2xhc3MgbWVkaWFodHRwY2xhc3MgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYUhUVFBTZXJ2aWNlIik7Ci0gICAgaWYgKG1lZGlhaHR0cGNsYXNzID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImNhbid0IGZpbmQgTWVkaWFIdHRwU2VydmljZSIpOwotICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7Ci0gICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgam1ldGhvZElEIG1lZGlhSHR0cENyZWF0ZU1ldGhvZCA9IGVudi0+R2V0U3RhdGljTWV0aG9kSUQobWVkaWFodHRwY2xhc3MsCi0gICAgICAgICAgICAiY3JlYXRlSHR0cFNlcnZpY2VCaW5kZXJJZk5lY2Vzc2FyeSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUxhbmRyb2lkL29zL0lCaW5kZXI7Iik7Ci0gICAgaWYgKG1lZGlhSHR0cENyZWF0ZU1ldGhvZCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJjYW4ndCBmaW5kIG1ldGhvZCIpOwotICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7Ci0gICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAganN0cmluZyBqbG9jID0gZW52LT5OZXdTdHJpbmdVVEYobG9jYXRpb24pOwotCi0gICAgc2VydmljZSA9IGVudi0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZChtZWRpYWh0dHBjbGFzcywgbWVkaWFIdHRwQ3JlYXRlTWV0aG9kLCBqbG9jKTsKLSAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGpsb2MpOwotCi0gICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlOwotICAgIGlmIChzZXJ2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gaWJpbmRlckZvckphdmFPYmplY3QoZW52LCBzZXJ2aWNlKTsKLSAgICAgICAgaHR0cFNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJTWVkaWFIVFRQU2VydmljZT4oYmluZGVyKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtRGF0YS0+bUltcGwtPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIGxvY2F0aW9uLCBOVUxMKTsKLSAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7Ci0gICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihlcnIpOworICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZVdpdGhIZWFkZXJzKG1EYXRhLCBsb2NhdGlvbiwgMCwgTlVMTCwgTlVMTCk7CiB9CiAKIEVYUE9SVApAQCAtNDIwLDcgKzM1MCw3IEBACiAgICAgaWYgKCFtZXRhLT5maW5kRGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsICZ0eXBlLCAmY3J5cHRlZGRhdGEsICZjcnlwdGVkc2l6ZSkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHNpemVfdCBudW1TdWJTYW1wbGVzID0gY3J5cHRlZHNpemUgLyBzaXplb2Yoc2l6ZV90KTsKKyAgICBzaXplX3QgbnVtU3ViU2FtcGxlcyA9IGNyeXB0ZWRzaXplIC8gc2l6ZW9mKHVpbnQzMl90KTsKIAogICAgIGNvbnN0IHZvaWQgKmNsZWFyZGF0YTsKICAgICBzaXplX3QgY2xlYXJzaXplOwpAQCAtNDU0LDYgKzM4NCwxNiBAQAogICAgICAgICBtb2RlID0gQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfQ1RSOwogICAgIH0KIAorICAgIGlmIChzaXplb2YodWludDMyX3QpICE9IHNpemVvZihzaXplX3QpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGNsZWFyYnVmICAgPSBVMzJBcnJheVRvU2l6ZUJ1ZihudW1TdWJTYW1wbGVzLCAodWludDMyX3QgKiljbGVhcmRhdGEpOworICAgICAgICBzcDxBQnVmZmVyPiBjcnlwdGVkYnVmID0gVTMyQXJyYXlUb1NpemVCdWYobnVtU3ViU2FtcGxlcywgKHVpbnQzMl90ICopY3J5cHRlZGRhdGEpOworICAgICAgICBjbGVhcmRhdGEgICA9IGNsZWFyYnVmICAgID09IE5VTEwgPyBOVUxMIDogY2xlYXJidWYtPmRhdGEoKTsKKyAgICAgICAgY3J5cHRlZGRhdGEgPSBjcnlwdGVkZGF0YSA9PSBOVUxMID8gTlVMTCA6IGNyeXB0ZWRidWYtPmRhdGEoKTsKKyAgICAgICAgaWYoY3J5cHRlZGRhdGEgPT0gTlVMTCB8fCBjbGVhcmRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gQU1lZGlhQ29kZWNDcnlwdG9JbmZvX25ldygKICAgICAgICAgICAgIG51bVN1YlNhbXBsZXMsCiAgICAgICAgICAgICAodWludDhfdCopIGtleSwKQEAgLTUyOSw2ICs0NjksMTYgQEAKICAgICAgICAgbWV0YS0+c2V0QnVmZmVyKEFNRURJQUZPUk1BVF9LRVlfTVBFR19VU0VSX0RBVEEsIG1wZWdVc2VyRGF0YSk7CiAgICAgfQogCisgICAgY29uc3Qgdm9pZCAqYXVkaW9QcmVzZW50YXRpb25zUG9pbnRlcjsKKyAgICBzaXplX3QgYXVkaW9QcmVzZW50YXRpb25zTGVuZ3RoOworICAgIGlmIChzYW1wbGVNZXRhLT5maW5kRGF0YSgKKyAgICAgICAgICAgIGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8sICZkYXRhVHlwZSwKKyAgICAgICAgICAgICZhdWRpb1ByZXNlbnRhdGlvbnNQb2ludGVyLCAmYXVkaW9QcmVzZW50YXRpb25zTGVuZ3RoKSkgeworICAgICAgICBzcDxBQnVmZmVyPiBhdWRpb1ByZXNlbnRhdGlvbnNEYXRhID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KAorICAgICAgICAgICAgICAgIGF1ZGlvUHJlc2VudGF0aW9uc1BvaW50ZXIsIGF1ZGlvUHJlc2VudGF0aW9uc0xlbmd0aCk7CisgICAgICAgIG1ldGEtPnNldEJ1ZmZlcihBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9JTkZPLCBhdWRpb1ByZXNlbnRhdGlvbnNEYXRhKTsKKyAgICB9CisKICAgICByZXR1cm4gQU1FRElBX09LOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcAppbmRleCAyMDcwN2NjLi5lZDg4Y2YzIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KQEAgLTMxLDMxICszMiw4IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1zdHJ1Y3QgQU1lZGlhRm9ybWF0IHsKLSAgICBzcDxBTWVzc2FnZT4gbUZvcm1hdDsKLSAgICBTdHJpbmc4IG1EZWJ1ZzsKLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtU3RyaW5nQ2FjaGU7Ci19OwotCiBleHRlcm4gIkMiIHsKIAotLy8gcHJpdmF0ZSBmdW5jdGlvbnMgZm9yIGNvbnZlcnNpb24gdG8vZnJvbSBBTWVzc2FnZQotQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyhjb25zdCB2b2lkKiBkYXRhKSB7Ci0gICAgQUxPR1YoInByaXZhdGUgY3RvciIpOwotICAgIEFNZWRpYUZvcm1hdCogbURhdGEgPSBuZXcgQU1lZGlhRm9ybWF0KCk7Ci0gICAgbURhdGEtPm1Gb3JtYXQgPSAqKChzcDxBTWVzc2FnZT4qKWRhdGEpOwotICAgIGlmIChtRGF0YS0+bUZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJnb3QgTlVMTCBmb3JtYXQiKTsKLSAgICAgICAgbURhdGEtPm1Gb3JtYXQgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgfQotICAgIHJldHVybiBtRGF0YTsKLX0KLQotdm9pZCBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGNvbnN0IEFNZWRpYUZvcm1hdCogbURhdGEsIHZvaWQqIGRlc3QpIHsKLSAgICAqKChzcDxBTWVzc2FnZT4qKWRlc3QpID0gbURhdGEtPm1Gb3JtYXQ7Ci19Ci0KLQogLyoKICAqIHB1YmxpYyBmdW5jdGlvbiBmb2xsb3cKICAqLwpAQCAtNzMsNiArNTEsMjEgQEAKICAgICByZXR1cm4gQU1FRElBX09LOwogfQogCitFWFBPUlQKK3ZvaWQgQU1lZGlhRm9ybWF0X2NsZWFyKEFNZWRpYUZvcm1hdCAqZm9ybWF0KSB7CisgICAgZm9ybWF0LT5tRm9ybWF0LT5jbGVhcigpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUZvcm1hdF9jb3B5KEFNZWRpYUZvcm1hdCAqdG8sIEFNZWRpYUZvcm1hdCAqZnJvbSkgeworICAgIGlmICghdG8gfHwgIWZyb20pIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgdG8tPm1Gb3JtYXQtPmNsZWFyKCk7CisgICAgdG8tPm1Gb3JtYXQtPmV4dGVuZChmcm9tLT5tRm9ybWF0KTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCiAKIEVYUE9SVAogY29uc3QgY2hhciogQU1lZGlhRm9ybWF0X3RvU3RyaW5nKEFNZWRpYUZvcm1hdCAqbURhdGEpIHsKQEAgLTI1NSw3ICsyNDgsNyBAQAogfQogCiBFWFBPUlQKLXZvaWQgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciogbmFtZSwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciogbmFtZSwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICAvLyB0aGUgQUJ1ZmZlcih2b2lkKiwgc2l6ZV90KSBjb25zdHJ1Y3RvciBkb2Vzbid0IHRha2Ugb3duZXJzaGlwIG9mIHRoZSBkYXRhLCBzbyBjcmVhdGUKICAgICAvLyBhIG5ldyBidWZmZXIgYW5kIGNvcHkgdGhlIGRhdGEgaW50byBpdAogICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IG5ldyBBQnVmZmVyKHNpemUpOwpAQCAtMjc0LDY1ICsyNjcsMTIzIEBACiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfTUFYX09VVFBVVF9DSEFOTkVMX0NPVU5UID0gImFhYy1tYXgtb3V0cHV0LWNoYW5uZWxfY291bnQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEUgPSAiYWFjLXByb2ZpbGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX1NCUl9NT0RFID0gImFhYy1zYnItbW9kZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTSA9ICJhbGJ1bSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCA9ICJhbGJ1bWFydCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVElTVCA9ICJhbGJ1bWFydGlzdCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BUlRJU1QgPSAiYXJ0aXN0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9JTkZPID0gImF1ZGlvLXByZXNlbnRhdGlvbi1pbmZvIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9QUkVTRU5UQVRJT05fSUQgPQorICAgICAgICAiYXVkaW8tcHJlc2VudGF0aW9uLXByZXNlbnRhdGlvbi1pZCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fUFJPR1JBTV9JRCA9ICJhdWRpby1wcmVzZW50YXRpb24tcHJvZ3JhbS1pZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVURJT19TRVNTSU9OX0lEID0gImF1ZGlvLXNlc3Npb24taWQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVUSE9SID0gImF1dGhvciI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRSQVRFX01PREUgPSAiYml0cmF0ZS1tb2RlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFID0gImJpdHJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFID0gImJpdHMtcGVyLXNhbXBsZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DQVBUVVJFX1JBVEUgPSAiY2FwdHVyZS1yYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIgPSAiY2R0cmFja251bSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5UID0gImNoYW5uZWwtY291bnQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9NQVNLID0gImNoYW5uZWwtbWFzayI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQgPSAiY29sb3ItZm9ybWF0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFID0gImNvbG9yLXJhbmdlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJEID0gImNvbG9yLXN0YW5kYXJkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSID0gImNvbG9yLXRyYW5zZmVyIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OID0gImNvbXBpbGF0aW9uIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTVBMRVhJVFkgPSAiY29tcGxleGl0eSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUiA9ICJjb21wb3NlciI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUkVBVEVfSU5QVVRfU1VSRkFDRV9TVVNQRU5ERUQgPSAiY3JlYXRlLWlucHV0LWJ1ZmZlcnMtc3VzcGVuZGVkIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUgPSAiY3J5cHRvLWRlZmF1bHQtaXYtc2l6ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0sgPSAiY3J5cHRvLWVuY3J5cHRlZC1ieXRlLWJsb2NrIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMgPSAiY3J5cHRvLWVuY3J5cHRlZC1zaXplcyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYgPSAiY3J5cHRvLWl2IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVkgPSAiY3J5cHRvLWtleSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSA9ICJjcnlwdG8tbW9kZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMgPSAiY3J5cHRvLXBsYWluLXNpemVzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0sgPSAiY3J5cHRvLXNraXAtYnl0ZS1ibG9jayI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0QgPSAiY3NkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8wID0gImNzZC0wIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8xID0gImNzZC0xIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8yID0gImNzZC0yIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMgPSAiY3NkLWF2YyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQyA9ICJjc2QtaGV2YyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EMjYzID0gImQyNjMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfREFURSA9ICJkYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIgPSAiZGlzY251bSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0NST1AgPSAiY3JvcCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0hFSUdIVCA9ICJkaXNwbGF5LWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRIID0gImRpc3BsYXktd2lkdGgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04gPSAiZHVyYXRpb25VcyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZID0gImVuY29kZXItZGVsYXkiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HID0gImVuY29kZXItcGFkZGluZyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FU0RTID0gImVzZHMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9PRkZTRVQgPSAiZXhpZi1vZmZzZXQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9TSVpFID0gImV4aWYtc2l6ZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMID0gImZsYWMtY29tcHJlc3Npb24tbGV2ZWwiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfQ09VTlQgPSAiZnJhbWUtY291bnQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSA9ICJmcmFtZS1yYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0dFTlJFID0gImdlbnJlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0dSSURfQ09MVU1OUyA9ICJncmlkLWNvbHMiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9ST1dTID0gImdyaWQtcm93cyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9IRFJfU1RBVElDX0lORk8gPSAiaGRyLXN0YXRpYy1pbmZvIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hEUjEwX1BMVVNfSU5GTyA9ICJoZHIxMC1wbHVzLWluZm8iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hUID0gImhlaWdodCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JQ0NfUFJPRklMRSA9ICJpY2MtcHJvZmlsZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JTlRSQV9SRUZSRVNIX1BFUklPRCA9ICJpbnRyYS1yZWZyZXNoLXBlcmlvZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19BRFRTID0gImlzLWFkdHMiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfQVVUT1NFTEVDVCA9ICJpcy1hdXRvc2VsZWN0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0RFRkFVTFQgPSAiaXMtZGVmYXVsdCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19GT1JDRURfU1VCVElUTEUgPSAiaXMtZm9yY2VkLXN1YnRpdGxlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUgPSAiaXMtc3luYy1mcmFtZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JX0ZSQU1FX0lOVEVSVkFMID0gImktZnJhbWUtaW50ZXJ2YWwiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEFOR1VBR0UgPSAibGFuZ3VhZ2UiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEFURU5DWSA9ICJsYXRlbmN5IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xFVkVMID0gImxldmVsIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xPQ0FUSU9OID0gImxvY2F0aW9uIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xPT1AgPSAibG9vcCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MWVJJQ0lTVCA9ICJseXJpY2lzdCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQU5VRkFDVFVSRVIgPSAibWFudWZhY3R1cmVyIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9CSVRfUkFURSA9ICJtYXgtYml0cmF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfRlBTX1RPX0VOQ09ERVIgPSAibWF4LWZwcy10by1lbmNvZGVyIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9IRUlHSFQgPSAibWF4LWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSA9ICJtYXgtaW5wdXQtc2l6ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSID0gIm1heC1wdHMtZ2FwLXRvLWVuY29kZXIiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX1dJRFRIID0gIm1heC13aWR0aCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NSU1FID0gIm1pbWUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFR19VU0VSX0RBVEEgPSAibXBlZy11c2VyLWRhdGEiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFRzJfU1RSRUFNX0hFQURFUiA9ICJtcGVnMi1zdHJlYW0taGVhZGVyIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFID0gIm9wZXJhdGluZy1yYXRlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORyA9ICJwY20tZW5jb2RpbmciOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFJJT1JJVFkgPSAicHJpb3JpdHkiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSA9ICJwcm9maWxlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BDTV9CSUdfRU5ESUFOID0gInBjbS1iaWctZW5kaWFuIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BTU0ggPSAicHNzaCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUCA9ICJwdXNoLWJsYW5rLWJ1ZmZlcnMtb24tc2h1dGRvd24iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSID0gInJlcGVhdC1wcmV2aW91cy1mcmFtZS1hZnRlciI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTiA9ICJyb3RhdGlvbi1kZWdyZWVzIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFID0gInNhbXBsZS1yYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBUl9IRUlHSFQgPSAic2FyLWhlaWdodCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TQVJfV0lEVEggPSAic2FyLXdpZHRoIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NFSSA9ICJzZWkiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0xJQ0VfSEVJR0hUID0gInNsaWNlLWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TVFJJREUgPSAic3RyaWRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FID0gInRhcmdldC10aW1lIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0NPVU5UID0gInRlbXBvcmFsLWxheWVyLWNvdW50IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lEID0gInRlbXBvcmFsLWxheWVyLWlkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSSU5HID0gInRzLXNjaGVtYSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URVhUX0ZPUk1BVF9EQVRBID0gInRleHQtZm9ybWF0LWRhdGEiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0NTRF9IRVZDID0gInRodW1ibmFpbC1jc2QtaGV2YyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfSEVJR0hUID0gInRodW1ibmFpbC1oZWlnaHQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUgPSAidGh1bWJuYWlsLXRpbWUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1dJRFRIID0gInRodW1ibmFpbC13aWR0aCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USUxFX0hFSUdIVCA9ICJ0aWxlLWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USUxFX1dJRFRIID0gInRpbGUtd2lkdGgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUyA9ICJ0aW1lVXMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElUTEUgPSAidGl0bGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQgPSAidHJhY2staWQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVggPSAidHJhY2staW5kZXgiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUyA9ICJ2YWxpZC1zYW1wbGVzIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1dJRFRIID0gIndpZHRoIjsKLQorRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfWUVBUiA9ICJ5ZWFyIjsKIAogfSAvLyBleHRlcm4gIkMiCiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdFByaXYuaCBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdFByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhNjU2My4uMDAwMDAwMAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXRQcml2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCi0gKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCi0gKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgotICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgotICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgotICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgotICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KLSAqLwotCi0jaWZuZGVmIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAotI2RlZmluZSBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKLQotI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyh2b2lkKik7Ci12b2lkIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoY29uc3QgQU1lZGlhRm9ybWF0KiBtRGF0YSwgdm9pZCogZGVzdCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmIC8vIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAotCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAKaW5kZXggNDRjYWZiMi4uZDE5OTJiZiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhTXV4ZXIuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYU11eGVyLmNwcApAQCAtMjAsNyArMjAsOCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFNdXhlci5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhQ29kZWMuaD4KLSNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogCiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTM1LDE0ICszNiw2IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1zdGF0aWMgbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgewotICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKLSAgICB9Ci0gICAgQUxPR0UoInNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKLSAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047Ci19Ci0KIHN0cnVjdCBBTWVkaWFNdXhlciB7CiAgICAgc3A8TWVkaWFNdXhlcj4gbUltcGw7CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9PV05FUlMgYi9tZWRpYS9uZGsvT1dORVJTCmluZGV4IDExZTgzNDAuLjlkYzQ0MWUgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9PV05FUlMKKysrIGIvbWVkaWEvbmRrL09XTkVSUwpAQCAtMSw1ICsxLDMgQEAKIG1hcmNvbmVAZ29vZ2xlLmNvbQogIyBGb3IgQUltYWdlL0FJbWFnZVJlYWRlcgotZXRhbHZhbGFAZ29vZ2xlLmNvbQoteWluY2hpYXllaEBnb29nbGUuY29tCi16aGlqdW5oZUBnb29nbGUuY29tCitpbmNsdWRlIHBsYXRmb3JtL2ZyYW1ld29ya3MvYXY6L2NhbWVyYS9PV05FUlMKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZS5oCmluZGV4IGY5MzYxMTguLjNlNjBkZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaApAQCAtNDk5LDcgKzQ5OSw1MSBAQAogICAgICAqIDxwPldoZW4gYW4ge0BsaW5rIEFJbWFnZX0gb2YgdGhpcyBmb3JtYXQgaXMgb2J0YWluZWQgZnJvbSBhbiB7QGxpbmsgQUltYWdlUmVhZGVyfSBvcgogICAgICAqIHtAbGluayBBSW1hZ2VfZ2V0TnVtYmVyT2ZQbGFuZXMoKX0gbWV0aG9kIHdpbGwgcmV0dXJuIHplcm8uPC9wPgogICAgICAqLwotICAgIEFJTUFHRV9GT1JNQVRfUFJJVkFURSAgICAgICAgICAgPSAweDIyCisgICAgQUlNQUdFX0ZPUk1BVF9QUklWQVRFICAgICAgICAgICA9IDB4MjIsCisKKyAgICAvKioKKyAgICAgKiBBbmRyb2lkIFk4IGZvcm1hdC4KKyAgICAgKgorICAgICAqIDxwPlk4IGlzIGEgcGxhbmFyIGZvcm1hdCBjb21wcmlzZWQgb2YgYSBXeEggWSBwbGFuZSBvbmx5LCB3aXRoIGVhY2ggcGl4ZWwKKyAgICAgKiBiZWluZyByZXByZXNlbnRlZCBieSA4IGJpdHMuPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyBmb3JtYXQgYXNzdW1lcworICAgICAqIDx1bD4KKyAgICAgKiA8bGk+YW4gZXZlbiB3aWR0aDwvbGk+CisgICAgICogPGxpPmFuIGV2ZW4gaGVpZ2h0PC9saT4KKyAgICAgKiA8bGk+YSBob3Jpem9udGFsIHN0cmlkZSBtdWx0aXBsZSBvZiAxNiBwaXhlbHM8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgorICAgICAqCisgICAgICogPHByZT4gc2l6ZSA9IHN0cmlkZSAqIGhlaWdodCA8L3ByZT4KKyAgICAgKgorICAgICAqIDxwPkZvciBleGFtcGxlLCB0aGUge0BsaW5rIEFJbWFnZX0gb2JqZWN0IGNhbiBwcm92aWRlIGRhdGEKKyAgICAgKiBpbiB0aGlzIGZvcm1hdCBmcm9tIGEge0BsaW5rIEFDYW1lcmFEZXZpY2V9IChpZiBzdXBwb3J0ZWQpIHRocm91Z2ggYQorICAgICAqIHtAbGluayBBSW1hZ2VSZWFkZXJ9IG9iamVjdC4gVGhlIG51bWJlciBvZiBwbGFuZXMgcmV0dXJuZWQgYnkKKyAgICAgKiB7QGxpbmsgQUltYWdlX2dldE51bWJlck9mUGxhbmVzfSB3aWxsIGFsd2F5cyBiZSAxLiBUaGUgcGl4ZWwgc3RyaWRlIHJldHVybmVkIGJ5CisgICAgICoge0BsaW5rIEFJbWFnZV9nZXRQbGFuZVBpeGVsU3RyaWRlfSB3aWxsIGFsd2F5cyBiZSAxLCBhbmQgdGhlCisgICAgICoge0BsaW5rIEFJbWFnZV9nZXRQbGFuZVJvd1N0cmlkZX0gZGVzY3JpYmVkIHRoZSB2ZXJ0aWNhbCBuZWlnaGJvcmluZyBwaXhlbCBkaXN0YW5jZQorICAgICAqIChpbiBieXRlcykgYmV0d2VlbiBhZGphY2VudCByb3dzLjwvcD4KKyAgICAgKgorICAgICAqLworICAgIEFJTUFHRV9GT1JNQVRfWTggPSAweDIwMjAzODU5LAorCisgICAgLyoqCisgICAgICogQ29tcHJlc3NlZCBIRUlDIGZvcm1hdC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgZm9ybWF0IGRlZmluZXMgdGhlIEhFSUMgYnJhbmQgb2YgSGlnaCBFZmZpY2llbmN5IEltYWdlIEZpbGUKKyAgICAgKiBGb3JtYXQgYXMgZGVzY3JpYmVkIGluIElTTy9JRUMgMjMwMDgtMTIuPC9wPgorICAgICAqLworICAgIEFJTUFHRV9GT1JNQVRfSEVJQyA9IDB4NDg0NTQ5NDYsCisKKyAgICAvKioKKyAgICAgKiBEZXB0aCBhdWdtZW50ZWQgY29tcHJlc3NlZCBKUEVHIGZvcm1hdC4KKyAgICAgKgorICAgICAqIDxwPkpQRUcgY29tcHJlc3NlZCBtYWluIGltYWdlIGFsb25nIHdpdGggWE1QIGVtYmVkZGVkIGRlcHRoIG1ldGFkYXRhCisgICAgICogZm9sbG93aW5nIElTTyAxNjY4NC0xOjIwMTEoRSkuPC9wPgorICAgICAqLworICAgIEFJTUFHRV9GT1JNQVRfREVQVEhfSlBFRyA9IDB4Njk2NTY5NjMsCisKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmgKaW5kZXggNjhkZTE3Ni4uZTVkODYzYyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oCkBAIC0zNyw2ICszNyw5IEBACiAjZGVmaW5lIF9OREtfSU1BR0VfUkVBREVSX0gKIAogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2VuZGlmCiAKICNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KICNpbmNsdWRlICJOZGtNZWRpYUVycm9yLmgiCkBAIC00NjEsNiArNDY0LDIzIEBACiBtZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfc2V0QnVmZmVyUmVtb3ZlZExpc3RlbmVyKAogICAgICAgICBBSW1hZ2VSZWFkZXIqIHJlYWRlciwgQUltYWdlUmVhZGVyX0J1ZmZlclJlbW92ZWRMaXN0ZW5lciogbGlzdGVuZXIpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisvKgorICogR2V0IHRoZSBuYXRpdmVfaGFuZGxlX3QgY29ycmVzcG9uZGluZyB0byB0aGUgQU5hdGl2ZVdpbmRvdyBvd25lZCBieSB0aGUKKyAqIEFJbWFnZVJlYWRlciBwcm92aWRlZC4KKyAqCisgKiBAcGFyYW0gcmVhZGVyIFRoZSBpbWFnZSByZWFkZXIgb2YgaW50ZXJlc3QuCisgKiBAcGFyYW0gaGFuZGxlIFRoZSBvdXRwdXQgbmF0aXZlX2hhbmRsZV90LiBUaGlzIG5hdGl2ZSBoYW5kbGUgaXMgb3duZWQgYnkKKyAqICAgICAgICAgICAgICAgdGhpcyBpbWFnZSByZWFkZXIuCisgKgorICogQHJldHVybiBBTUVESUFfT0sgaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLgorICogICAgICAgICBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgaWYgcmVhZGVyIG9yIGhhbmRsZSBhcmUgTlVMTC4KKyAqICAgICAgICAgQU1FRElBX0VSUk9SX1VOS05PV04gaWYgc29tZSBvdGhlciBlcnJvciBpcyBlbmNvdW50ZXJlZC4KKyAqLworbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZSgKKyAgICBBSW1hZ2VSZWFkZXIgKnJlYWRlciwgLyogb3V0ICovbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKyNlbmRpZgorCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI2ICovCiAKIF9fRU5EX0RFQ0xTCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCmluZGV4IGVhNWJhMGMuLjE2YjFlYjMgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCkBAIC00MywxNCArNDMsOSBAQAogLyoKICAqIEFNZWRpYURhdGFTb3VyY2UncyBjYWxsYmFja3Mgd2lsbCBiZSBpbnZva2VkIG9uIGFuIGltcGxlbWVudGF0aW9uLWRlZmluZWQgdGhyZWFkCiAgKiBvciB0aHJlYWQgcG9vbC4gTm8gZ3VhcmFudGVlcyBhcmUgcHJvdmlkZWQgYWJvdXQgd2hpY2ggdGhyZWFkKHMpIHdpbGwgYmUgdXNlZCBmb3IKLSAqIGNhbGxiYWNrcy4gSG93ZXZlciwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0IEFNZWRpYURhdGFTb3VyY2UncyBjYWxsYmFja3Mgd2lsbCBvbmx5Ci0gKiBldmVyIGJlIGludm9rZWQgYnkgYSBzaW5nbGUgdGhyZWFkIGF0IGEgdGltZS4KLSAqCi0gKiBUaGVyZSB3aWxsIGJlIGEgdGhyZWFkIHN5bmNocm9uaXphdGlvbiBwb2ludCBiZXR3ZWVuIGVhY2ggY2FsbCB0byBlbnN1cmUgdGhhdAotICogbW9kaWZpY2F0aW9ucyB0byB0aGUgc3RhdGUgb2YgeW91ciBBTWVkaWFEYXRhU291cmNlIGFyZSB2aXNpYmxlIHRvIGZ1dHVyZQotICogY2FsbHMuIFRoaXMgbWVhbnMgeW91IGRvbid0IG5lZWQgdG8gZG8geW91ciBvd24gc3luY2hyb25pemF0aW9uIHVubGVzcyB5b3UncmUKLSAqIG1vZGlmeWluZyB0aGUgQU1lZGlhRGF0YVNvdXJjZSBmcm9tIGFub3RoZXIgdGhyZWFkIHdoaWxlIGl0J3MgYmVpbmcgdXNlZCBieSB0aGUKLSAqIGZyYW1ld29yay4KKyAqIGNhbGxiYWNrcy4gRm9yIGV4YW1wbGUsIHxjbG9zZXwgY2FuIGJlIGludm9rZWQgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQgdGhhbiB0aGUKKyAqIHRocmVhZCBpbnZva2luZyB8cmVhZEF0fC4gQXMgc3VjaCwgdGhlIEltcGxlbWVudGF0aW9ucyBvZiBBTWVkaWFEYXRhU291cmNlIGNhbGxiYWNrcworICogbXVzdCBiZSB0aHJlYWRzYWZlLgogICovCiAKIC8qKgpAQCAtNzQsOSArNjksMTkgQEAKIHR5cGVkZWYgc3NpemVfdCAoKkFNZWRpYURhdGFTb3VyY2VHZXRTaXplKSh2b2lkICp1c2VyZGF0YSk7CiAKIC8qKgotICogQ2FsbGVkIHRvIGNsb3NlIHRoZSBkYXRhIHNvdXJjZSBhbmQgcmVsZWFzZSBhc3NvY2lhdGVkIHJlc291cmNlcy4KLSAqIFRoZSBOREsgbWVkaWEgZnJhbWV3b3JrIGd1YXJhbnRlZXMgdGhhdCBhZnRlciB8Y2xvc2V8IGlzIGNhbGxlZAotICogbm8gZnV0dXJlIGNhbGxiYWNrcyB3aWxsIGJlIGludm9rZWQgb24gdGhlIGRhdGEgc291cmNlLgorICogQ2FsbGVkIHRvIGNsb3NlIHRoZSBkYXRhIHNvdXJjZSwgdW5ibG9jayByZWFkcywgYW5kIHJlbGVhc2UgYXNzb2NpYXRlZAorICogcmVzb3VyY2VzLgorICoKKyAqIFRoZSBOREsgbWVkaWEgZnJhbWV3b3JrIGd1YXJhbnRlZXMgdGhhdCBhZnRlciB0aGUgZmlyc3QgfGNsb3NlfCBpcworICogY2FsbGVkLCBubyBmdXR1cmUgY2FsbGJhY2tzIHdpbGwgYmUgaW52b2tlZCBvbiB0aGUgZGF0YSBzb3VyY2UgZXhjZXB0CisgKiBmb3IgfGNsb3NlfCBpdHNlbGYuCisgKgorICogQ2xvc2luZyBhIGRhdGEgc291cmNlIGFsbG93cyByZWFkQXQgY2FsbHMgdGhhdCB3ZXJlIGJsb2NrZWQgd2FpdGluZworICogZm9yIEkvTyBkYXRhIHRvIHJldHVybiBwcm9tcHRseS4KKyAqCisgKiBXaGVuIHVzaW5nIEFNZWRpYURhdGFTb3VyY2UgYXMgaW5wdXQgdG8gQU1lZGlhRXh0cmFjdG9yLCBjbG9zaW5nCisgKiBoYXMgdGhlIGVmZmVjdCBvZiB1bmJsb2NraW5nIHNsb3cgcmVhZHMgaW5zaWRlIG9mIHNldERhdGFTb3VyY2UKKyAqIGFuZCByZWFkU2FtcGxlRGF0YS4KICAqLwogdHlwZWRlZiB2b2lkICgqQU1lZGlhRGF0YVNvdXJjZUNsb3NlKSh2b2lkICp1c2VyZGF0YSk7CiAKQEAgLTg2LDYgKzkxLDM4IEBACiAgKi8KIEFNZWRpYURhdGFTb3VyY2UqIEFNZWRpYURhdGFTb3VyY2VfbmV3KCkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQorCisvKioKKyAqIENhbGxlZCB0byBnZXQgYW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSByZWFkIGZyb20gdGhpcyBkYXRhIHNvdXJjZQorICogc3RhcnRpbmcgYXQgfG9mZnNldHwgd2l0aG91dCBibG9ja2luZyBmb3IgSS9PLgorICoKKyAqIFJldHVybiAtMSB3aGVuIHN1Y2ggYW4gZXN0aW1hdGUgaXMgbm90IHBvc3NpYmxlLgorICovCit0eXBlZGVmIHNzaXplX3QgKCpBTWVkaWFEYXRhU291cmNlR2V0QXZhaWxhYmxlU2l6ZSkodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0KTsKKworLyoqCisgKiBDcmVhdGUgbmV3IG1lZGlhIGRhdGEgc291cmNlLiBSZXR1cm5zIE5VTEwgaWYgbWVtb3J5IGFsbG9jYXRpb24KKyAqIGZvciB0aGUgbmV3IGRhdGEgc291cmNlIG9iamVjdCBmYWlscy4KKyAqCisgKiBTZXQgdGhlIHx1cml8IGZyb20gd2hpY2ggdGhlIGRhdGEgc291cmNlIHdpbGwgcmVhZCwKKyAqIHBsdXMgYWRkaXRpb25hbCBodHRwIGhlYWRlcnMgd2hlbiBpbml0aWF0aW5nIHRoZSByZXF1ZXN0LgorICoKKyAqIEhlYWRlcnMgd2lsbCBjb250YWluIGNvcnJlc3BvbmRpbmcgaXRlbXMgZnJvbSB8a2V5X3ZhbHVlc3wKKyAqIGluIHRoZSBmb2xsb3dpbmcgZmFzaGlvbjoKKyAqCisgKiBrZXlfdmFsdWVzWzBdOmtleV92YWx1ZXNbMV0KKyAqIGtleV92YWx1ZXNbMl06a2V5X3ZhbHVlc1szXQorICogLi4uCisgKiBrZXlfdmFsdWVzWyhudW1oZWFkZXJzIC0gMSkgKiAyXTprZXlfdmFsdWVzWyhudW1oZWFkZXJzIC0gMSkgKiAyICsgMV0KKyAqCisgKi8KK0FNZWRpYURhdGFTb3VyY2UqIEFNZWRpYURhdGFTb3VyY2VfbmV3VXJpKGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgaW50IG51bWhlYWRlcnMsCisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqa2V5X3ZhbHVlcykgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2VuZGlmICAvKl9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiAvKioKICAqIERlbGV0ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBtZWRpYSBkYXRhIHNvdXJjZS4KICAqLwpAQCAtMTM3LDYgKzE3NCwzMCBAQAogCiAjZW5kaWYgIC8qX19BTkRST0lEX0FQSV9fID49IDI4ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKworLyoqCisgKiBDbG9zZSB0aGUgZGF0YSBzb3VyY2UsIHVuYmxvY2sgcmVhZHMsIGFuZCByZWxlYXNlIGFzc29jaWF0ZWQgcmVzb3VyY2VzLgorICoKKyAqIFBsZWFzZSByZWZlciB0byB0aGUgZGVmaW5pdGlvbiBvZiBBTWVkaWFEYXRhU291cmNlQ2xvc2UgZm9yCisgKiBhZGRpdGlvbmFsIGRldGFpbHMuCisgKi8KK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9jbG9zZShBTWVkaWFEYXRhU291cmNlKikgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBTZXQgYSBjdXN0b20gY2FsbGJhY2sgZm9yIHN1cHBseWluZyB0aGUgZXN0aW1hdGVkIG51bWJlciBvZiBieXRlcworICogdGhhdCBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgZGF0YSBzb3VyY2Ugc3RhcnRpbmcgYXQgYW4gb2Zmc2V0IHdpdGhvdXQKKyAqIGJsb2NraW5nIGZvciBJL08uCisgKgorICogUGxlYXNlIHJlZmVyIHRvIHRoZSBkZWZpbml0aW9uIG9mIEFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplCisgKiBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLgorICovCit2b2lkIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0QXZhaWxhYmxlU2l6ZSgKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZSosCisgICAgICAgIEFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisjZW5kaWYgIC8qX19BTkRST0lEX0FQSV9fID49IDI5ICovCisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvLyBfTkRLX01FRElBX0RBVEFTT1VSQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvci5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvci5oCmluZGV4IDc1ZjQ2MDUuLjJiZTFkNmUgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3IuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yLmgKQEAgLTYzLDYgKzYzLDcgQEAKICAgICBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT04gICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSA1LAogICAgIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNICAgICAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDYsCiAgICAgQU1FRElBX0VSUk9SX0lPICAgICAgICAgICAgICAgICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gNywKKyAgICBBTUVESUFfRVJST1JfV09VTERfQkxPQ0sgICAgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSA4LAogCiAgICAgQU1FRElBX0RSTV9FUlJPUl9CQVNFICAgICAgICAgICAgICA9IC0yMDAwMCwKICAgICBBTUVESUFfRFJNX05PVF9QUk9WSVNJT05FRCAgICAgICAgID0gQU1FRElBX0RSTV9FUlJPUl9CQVNFIC0gMSwKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oCmluZGV4IDZhMTc5NmYuLmUzZDlmZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaApAQCAtNzIsNyArNzIsNiBAQAogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZShBTWVkaWFFeHRyYWN0b3IqLAogICAgICAgICBjb25zdCBjaGFyICpsb2NhdGlvbikgX19JTlRST0RVQ0VEX0lOKDIxKTsKLSAgICAgICAgLy8gVE9ETyBzdXBwb3J0IGhlYWRlcnMKIAogI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOAogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaAppbmRleCA1Zjc4MDRkLi4yNTk0ODFkIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmgKQEAgLTgzLDEzICs4Myw5IEBACiAvKioKICAqIFRoZSBwcm92aWRlZCBkYXRhIGlzIGNvcGllZCBpbnRvIHRoZSBmb3JtYXQuCiAgKi8KLXZvaWQgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogCi0KLS8qKgotICogWFhYIHNob3VsZCB0aGVzZSBiZSBpbnRzL2VudW1zIHRoYXQgd2UgbG9vayB1cCBpbiBhIHRhYmxlIGFzIG5lZWRlZD8KLSAqLwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IgX19JTlRST0RVQ0VEX0lOKDI4KTsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfQk9PU1RfRkFDVE9SIF9fSU5UUk9EVUNFRF9JTigyOCk7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0hFQVZZX0NPTVBSRVNTSU9OIF9fSU5UUk9EVUNFRF9JTigyOCk7CkBAIC0xNTYsNyArMTUyLDYgQEAKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lEIF9fSU5UUk9EVUNFRF9JTigyOCk7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JTkRFWCBfX0lOVFJPRFVDRURfSU4oMjgpOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfV0lEVEggX19JTlRST0RVQ0VEX0lOKDIxKTsKLQogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyMSAqLwogCiAjaWYgX19BTkRST0lEX0FQSV9fID49IDI4CkBAIC0xNzAsNiArMTY1LDc3IEBACiAgICAgICAgIGludDMyX3QgbGVmdCwgaW50MzJfdCB0b3AsIGludDMyX3QgcmlnaHQsIGludDMyX3QgYm90dG9tKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI5CisvKioKKyAqIHJlbW92ZSBhbGwga2V5L3ZhbHVlIHBhaXJzIGZyb20gdGhlIGdpdmVuIEFNZWRpYUZvcm1hdAorICovCit2b2lkIEFNZWRpYUZvcm1hdF9jbGVhcihBTWVkaWFGb3JtYXQqKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIGNvcHkgb25lIEFNZWRpYUZvcm1hdCB0byBhbm90aGVyCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYUZvcm1hdF9jb3B5KEFNZWRpYUZvcm1hdCAqdG8sIEFNZWRpYUZvcm1hdCAqZnJvbSkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUxCVU0gX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVElTVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVJUSVNUIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fSU5GTyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX1BSRVNFTlRBVElPTl9JRCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX1BST0dSQU1fSUQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVVEhPUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT01QSUxBVElPTiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09NUE9TRVIgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSRUFURV9JTlBVVF9TVVJGQUNFX1NVU1BFTkRFRCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9CWVRFX0JMT0NLIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVkgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0sgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EMjYzIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EQVRFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNDTlVNQkVSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX1BBRERJTkcgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VTRFMgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VYSUZfT0ZGU0VUIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FWElGX1NJWkUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX0NPVU5UIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9HRU5SRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSUNDX1BST0ZJTEUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xPQ0FUSU9OIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MT09QIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MWVJJQ0lTVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFOVUZBQ1RVUkVSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfQklUX1JBVEUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9GUFNfVE9fRU5DT0RFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX1BUU19HQVBfVE9fRU5DT0RFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFRzJfU1RSRUFNX0hFQURFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUENNX0JJR19FTkRJQU4gX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BTU0ggX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBUl9IRUlHSFQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBUl9XSURUSCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0NPVU5UIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URVhUX0ZPUk1BVF9EQVRBIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfQ1NEX0hFVkMgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9IRUlHSFQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfV0lEVEggX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RJVExFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ZRUFSIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KKwogX19FTkRfREVDTFMKIAogI2VuZGlmIC8vIF9OREtfTUVESUFfRk9STUFUX0gKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvTmRrSW1hZ2UuaCBiL21lZGlhL25kay9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvTmRrSW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzY4YTU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9OZGtJbWFnZS5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9QUklWQVRFX01FRElBX05ES0lNQUdFX0hfCisjZGVmaW5lIF9QUklWQVRFX01FRElBX05ES0lNQUdFX0hfCisvLyBGb3JtYXRzIG5vdCBsaXN0ZWQgaW4gdGhlIHB1YmxpYyBBUEksIGJ1dCBzdGlsbCBhdmFpbGFibGUgdG8gQUltYWdlUmVhZGVyCitlbnVtIEFJTUFHRV9QUklWQVRFX0ZPUk1BVFMgeworICAgIC8qKgorICAgICAqIFVucHJvY2Vzc2VkIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudCByYXcKKyAgICAgKiBkZXB0aCBtZWFzdXJlbWVudHMsIG9wYXF1ZSB3aXRoIDE2IGJpdAorICAgICAqIHNhbXBsZXMuCisgICAgICoKKyAgICAgKi8KKworICAgIEFJTUFHRV9GT1JNQVRfUkFXX0RFUFRIID0gMHgxMDAyLAorfTsKKyNlbmRpZiAvLyBfUFJJVkFURV9NRURJQV9OREtJTUFHRQpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2xpYm1lZGlhbmRrLm1hcC50eHQgYi9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dAppbmRleCBkZWVjYjYzLi40NzI1ZTllIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dAorKysgYi9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dApAQCAtNCw2ICs0LDcgQEAKICAgICBBSW1hZ2VSZWFkZXJfYWNxdWlyZUxhdGVzdEltYWdlQXN5bmM7ICMgaW50cm9kdWNlZD0yNgogICAgIEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlOyAjIGludHJvZHVjZWQ9MjQKICAgICBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZUFzeW5jOyAjIGludHJvZHVjZWQ9MjYKKyAgICBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93TmF0aXZlSGFuZGxlOyAjdm5kawogICAgIEFJbWFnZVJlYWRlcl9kZWxldGU7ICMgaW50cm9kdWNlZD0yNAogICAgIEFJbWFnZVJlYWRlcl9nZXRGb3JtYXQ7ICMgaW50cm9kdWNlZD0yNAogICAgIEFJbWFnZVJlYWRlcl9nZXRIZWlnaHQ7ICMgaW50cm9kdWNlZD0yNApAQCAtMzQsNjQgKzM1LDExOSBAQAogICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX01BWF9PVVRQVVRfQ0hBTk5FTF9DT1VOVDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEU7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19TQlJfTU9ERTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQUxCVU07ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVElTVDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQVJUSVNUOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fSU5GTzsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fU0VTU0lPTl9JRDsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQVVUSE9SOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRSQVRFX01PREU7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEU7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0NBUFRVUkVfUkFURTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9NQVNLOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQ7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9TVEFOREFSRDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfVFJBTlNGRVI7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9DT01QTEVYSVRZOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUjsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JFQVRFX0lOUFVUX1NVUkZBQ0VfU1VTUEVOREVEOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fREVGQVVMVF9JVl9TSVpFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0s7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19JVjsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1NLSVBfQllURV9CTE9DSzsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzE7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8yOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfRDI2MzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfREFURTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9DUk9QOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0hFSUdIVDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT047ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVk7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfRVNEUzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9PRkZTRVQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0VYSUZfU0laRTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfQ09VTlQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUw7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX0dFTlJFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9HUklEX0NPTFVNTlM7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfUk9XUzsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfSERSX1NUQVRJQ19JTkZPOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX0lDQ19QUk9GSUxFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9JTlRSQV9SRUZSRVNIX1BFUklPRDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfQURUUzsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfQVVUT1NFTEVDVDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfREVGQVVMVDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfRk9SQ0VEX1NVQlRJVExFOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9JX0ZSQU1FX0lOVEVSVkFMOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRTsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfTEFURU5DWTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfTEVWRUw7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0xPQ0FUSU9OOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9MT09QOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9MWVJJQ0lTVDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfTUFOVUZBQ1RVUkVSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfQklUX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9GUFNfVE9fRU5DT0RFUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0hFSUdIVDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkU7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9QVFNfR0FQX1RPX0VOQ09ERVI7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRTsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFR19VU0VSX0RBVEE7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX01QRUcyX1NUUkVBTV9IRUFERVI7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fQklHX0VORElBTjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9QUklPUklUWTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfUFNTSDsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfUFVTSF9CTEFOS19CVUZGRVJTX09OX1NUT1A7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUjsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfUk9UQVRJT047ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9TQVJfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9TQVJfV0lEVEg7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX1NFSTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfU0xJQ0VfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9TVFJJREU7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9DT1VOVDsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSSU5HOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9URVhUX0ZPUk1BVF9EQVRBOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfQ1NEX0hFVkM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfV0lEVEg7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RJVExFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9USUxFX0hFSUdIVDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVElMRV9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUzsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVg7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lEOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfWUVBUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNZWRpYUNvZGVjQWN0aW9uQ29kZV9pc1JlY292ZXJhYmxlOyAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFDb2RlY0FjdGlvbkNvZGVfaXNUcmFuc2llbnQ7ICMgaW50cm9kdWNlZD0yOAogICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19kZWxldGU7CkBAIC0xNDIsNiArMTk4LDkgQEAKICAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemU7ICAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFEYXRhU291cmNlX3NldFJlYWRBdDsgICAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhOyAjIGludHJvZHVjZWQ9MjgKKyAgICBBTWVkaWFEYXRhU291cmNlX25ld1VyaTsgICAgICAjIGludHJvZHVjZWQ9MjkKKyAgICBBTWVkaWFEYXRhU291cmNlX2Nsb3NlOyAgICAgICAjIGludHJvZHVjZWQ9MjkKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldEF2YWlsYWJsZVNpemU7ICMgaW50cm9kdWNlZD0yOQogICAgIEFNZWRpYURybV9jbG9zZVNlc3Npb247CiAgICAgQU1lZGlhRHJtX2NyZWF0ZUJ5VVVJRDsKICAgICBBTWVkaWFEcm1fZGVjcnlwdDsKQEAgLTE4OCw2ICsyNDcsOCBAQAogICAgIEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlQ3VzdG9tOyAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkOwogICAgIEFNZWRpYUV4dHJhY3Rvcl91bnNlbGVjdFRyYWNrOworICAgIEFNZWRpYUZvcm1hdF9jbGVhcjsgIyBpbnRyb2R1Y2VkPTI5CisgICAgQU1lZGlhRm9ybWF0X2NvcHk7ICMgaW50cm9kdWNlZD0yOQogICAgIEFNZWRpYUZvcm1hdF9kZWxldGU7CiAgICAgQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcjsKICAgICBBTWVkaWFGb3JtYXRfZ2V0RG91YmxlOyAjIGludHJvZHVjZWQ9MjgKZGlmZiAtLWdpdCBhL21lZGlhL25kay90ZXN0cy9BSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LmNwcCBiL21lZGlhL25kay90ZXN0cy9BSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjExMjUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL3Rlc3RzL0FJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QuY3BwCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtJbWFnZVJlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0ltYWdlLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9OZGtJbWFnZS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuaD4KKyNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8xLjAvSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8TmRrSW1hZ2VSZWFkZXJQcml2Lmg+CisjaW5jbHVkZSA8dm5kay9oYXJkd2FyZV9idWZmZXIuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgaGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6dXRpbHM6OkgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIGFpbWc6OkFJbWFnZVJlYWRlcl9nZXRIR0JQRnJvbUhhbmRsZTsKKwordHlwZWRlZiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IFF1ZXVlQnVmZmVySW5wdXQ7Cit0eXBlZGVmIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IFF1ZXVlQnVmZmVyT3V0cHV0OworCitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtJbWFnZUJ1ZmZlclVzYWdlID0KKyAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1dSSVRFX09GVEVOOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0ltYWdlV2lkdGggPSA2NDA7CitzdGF0aWMgY29uc3RleHByIGludCBrSW1hZ2VIZWlnaHQgPSA0ODA7CitzdGF0aWMgY29uc3RleHByIGludCBrSW1hZ2VGb3JtYXQgPSBBSU1BR0VfRk9STUFUX1JHQkFfODg4ODsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhJbWFnZXMgPSAxOworCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1F1ZXVlQnVmZmVySW5wdXRUaW1lU3RhbXAgPSAxMzg0ODg4NjExOworc3RhdGljIGNvbnN0ZXhwciBib29sIGtRdWV1ZUJ1ZmZlcklucHV0SXNBdXRvVGltZVN0YW1wID0gZmFsc2U7CitzdGF0aWMgY29uc3RleHByIGFuZHJvaWRfZGF0YXNwYWNlIGtRdWV1ZUJ1ZmZlcklucHV0RGF0YXNwYWNlID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOOworc3RhdGljIGNvbnN0IFJlY3Qga1F1ZXVlQnVmZmVySW5wdXRSZWN0ID0gUmVjdChrSW1hZ2VXaWR0aCwga0ltYWdlSGVpZ2h0KTsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtRdWV1ZUJ1ZmZlcklucHV0U2NhbGluZ01vZGUgPSAwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga1F1ZXVlQnVmZmVySW5wdXRUcmFuc2Zvcm0gPSAwOworc3RhdGljIGNvbnN0IHNwPEZlbmNlPiBrUXVldWVCdWZmZXJJbnB1dEZlbmNlID0gRmVuY2U6Ok5PX0ZFTkNFOworCitzdGF0aWMgY29uc3RleHByIGludCBrT25JbWFnZUF2YWlsYWJsZVdhaXRVcyA9IDEwMCAqIDEwMDA7CisKK2NsYXNzIEFJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgIHB1YmxpYzoKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBBSW1hZ2VSZWFkZXJfbmV3V2l0aFVzYWdlKGtJbWFnZVdpZHRoLCBrSW1hZ2VIZWlnaHQsIGtJbWFnZUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSW1hZ2VCdWZmZXJVc2FnZSAsIGtNYXhJbWFnZXMsICZpbWFnZVJlYWRlcl8pOworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSBBTUVESUFfRVJST1JfVU5LTk9XTjsKKyAgICAgICAgQVNTRVJUX05FKGltYWdlUmVhZGVyXywgbnVsbHB0cik7CisgICAgICAgIHJldCA9IEFJbWFnZVJlYWRlcl9zZXRJbWFnZUxpc3RlbmVyKGltYWdlUmVhZGVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlUmVhZGVyQXZhaWxhYmxlQ2JfKTsKKyAgICAgICAgQVNTRVJUX0VRKHJldCwgQU1FRElBX09LKTsKKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX3NldEJ1ZmZlclJlbW92ZWRMaXN0ZW5lcihpbWFnZVJlYWRlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlUmVhZGVyRGV0YWNoZWRDYl8pOworICAgICAgICBBU1NFUlRfRVEocmV0LCBBTUVESUFfT0spOworICAgIH0KKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAoaW1hZ2VSZWFkZXJfKSB7CisgICAgICAgICAgICBBSW1hZ2VSZWFkZXJfZGVsZXRlKGltYWdlUmVhZGVyXyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIEhhbmRsZUltYWdlQXZhaWxhYmxlKCkgeworICAgICAgICBBSW1hZ2UgKm91dEltYWdlID0gbnVsbHB0cjsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gQU1FRElBX09LOworICAgICAgICBhdXRvIGltYWdlRGVsZXRlciA9IFtdKEFJbWFnZSAqaW1nKSB7IEFJbWFnZV9kZWxldGUoaW1nKTsgfTsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEFJbWFnZSwgZGVjbHR5cGUoaW1hZ2VEZWxldGVyKT4gaW1nKG51bGxwdHIsIGltYWdlRGVsZXRlcik7CisKKyAgICAgICAgLy8gVGVzdCB0aGF0IHRoZSBpbWFnZSBjYW4gYmUgYWNxdWlyZWQuCisgICAgICAgIHJldCA9IEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlKGltYWdlUmVhZGVyXywgJm91dEltYWdlKTsKKyAgICAgICAgQVNTRVJUX0VRKHJldCwgQU1FRElBX09LKTsKKyAgICAgICAgaW1nLnJlc2V0KG91dEltYWdlKTsKKyAgICAgICAgQVNTRVJUX05FKGltZywgbnVsbHB0cik7CisKKyAgICAgICAgLy8gVGVzdCB0aGF0IHdlIGNhbiBnZXQgYSBoYW5kbGUgdG8gdGhlIGltYWdlJ3MgaGFyZHdhcmUgYnVmZmVyIGFuZCBhCisgICAgICAgIC8vIG5hdGl2ZSBoYW5kbGUgdG8gaXQuCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlciAqaGFyZHdhcmVCdWZmZXIgPSBudWxscHRyOworICAgICAgICByZXQgPSBBSW1hZ2VfZ2V0SGFyZHdhcmVCdWZmZXIoaW1nLmdldCgpLCAmaGFyZHdhcmVCdWZmZXIpOworICAgICAgICBBU1NFUlRfRVEocmV0LCBBTUVESUFfT0spOworICAgICAgICBBU1NFUlRfTkUoaGFyZHdhcmVCdWZmZXIsIG51bGxwdHIpOworICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oID0gQUhhcmR3YXJlQnVmZmVyX2dldE5hdGl2ZUhhbmRsZShoYXJkd2FyZUJ1ZmZlcik7CisgICAgICAgIEFTU0VSVF9ORShuaCwgbnVsbHB0cik7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhpbWFnZUF2YWlsYWJsZU11dGV4Xyk7CisgICAgICAgIGltYWdlQXZhaWxhYmxlXyA9IHRydWU7CisgICAgICAgIGltYWdlQ29uZFZhcl8ubm90aWZ5X29uZSgpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIG9uSW1hZ2VBdmFpbGFibGUodm9pZCAqY29udGV4dCwgQUltYWdlUmVhZGVyICpyZWFkZXIpIHsKKyAgICAgICAgKHZvaWQpcmVhZGVyOworICAgICAgICBBSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0ICp0aGlzQ29udGV4dCA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QgKj4oY29udGV4dCk7CisgICAgICAgIHRoaXNDb250ZXh0LT5IYW5kbGVJbWFnZUF2YWlsYWJsZSgpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIG9uQnVmZmVyUmVtb3ZlZCh2b2lkICosIEFJbWFnZVJlYWRlciAqLCBBSGFyZHdhcmVCdWZmZXIgKikgeworICAgIH0KKworICAgIEFJbWFnZVJlYWRlciAqaW1hZ2VSZWFkZXJfID0gbnVsbHB0cjsKKyAgICBBSW1hZ2VSZWFkZXJfSW1hZ2VMaXN0ZW5lciBpbWFnZVJlYWRlckF2YWlsYWJsZUNiX3t0aGlzLCBvbkltYWdlQXZhaWxhYmxlfTsKKyAgICBBSW1hZ2VSZWFkZXJfQnVmZmVyUmVtb3ZlZExpc3RlbmVyIGltYWdlUmVhZGVyRGV0YWNoZWRDYl97dGhpcywgb25CdWZmZXJSZW1vdmVkfTsKKyAgICBzdGQ6Om11dGV4IGltYWdlQXZhaWxhYmxlTXV0ZXhfOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIGltYWdlQ29uZFZhcl87CisgICAgYm9vbCBpbWFnZUF2YWlsYWJsZV8gPSBmYWxzZTsKK307CisKK3N0YXRpYyB2b2lkIGZpbGxSR0JBOEJ1ZmZlcih1aW50OF90KiBidWYsIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSkgeworICAgIGNvbnN0IHNpemVfdCBQSVhFTF9TSVpFID0gNDsKKyAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0ID0gKHkgKiBzdHJpZGUgKyB4KSAqIFBJWEVMX1NJWkU7CisgICAgICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IDQ7IGMrKykgeworICAgICAgICAgICAgICAgIGludCBwYXJpdHlYID0gKHggLyAoMSA8PCAoYysyKSkpICYgMTsKKyAgICAgICAgICAgICAgICBpbnQgcGFyaXR5WSA9ICh5IC8gKDEgPDwgKGMrMikpKSAmIDE7CisgICAgICAgICAgICAgICAgYnVmW29mZnNldCArIGNdID0gKHBhcml0eVggXiBwYXJpdHlZKSA/IDIzMSA6IDM1OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitURVNUX0YoQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCwgQ3JlYXRlV2luZG93TmF0aXZlSGFuZGxlKSB7CisgICAgLy8gQ2hlY2sgdGhhdCB3ZSBjYW4gY3JlYXRlIGEgbmF0aXZlX2hhbmRsZV90IGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICAgLy8gQUltYWdlUmVhZGVyLgorICAgIG5hdGl2ZV9oYW5kbGVfdCAqbmggPSBudWxscHRyOworICAgIEFJbWFnZVJlYWRlcl9nZXRXaW5kb3dOYXRpdmVIYW5kbGUoaW1hZ2VSZWFkZXJfLCAmbmgpOworICAgIEFTU0VSVF9ORShuaCwgbnVsbHB0cik7CisKKyAgICAvLyBDaGVjayB0aGF0IHRoZXJlIGFyZSBvbmx5IGludHMgaW4gdGhlIGhhbmRsZS4KKyAgICBBU1NFUlRfRVEobmgtPm51bUZkcywgMCk7CisgICAgQVNTRVJUX05FKG5oLT5udW1JbnRzLCAwKTsKKworICAgIC8vIENoZWNrIHRoYXQgdGhlIEhHQlAgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBoYW5kbGUuCisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaGdicCA9ICBBSW1hZ2VSZWFkZXJfZ2V0SEdCUEZyb21IYW5kbGUobmgpOworICAgIEFTU0VSVF9ORShoZ2JwLCBudWxscHRyKTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBpZ2JwID0gbmV3IEgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcihoZ2JwKTsKKyAgICBpbnQgZGVxdWV1ZWRTbG90ID0gLTE7CisgICAgc3A8RmVuY2U+IGRlcXVldWVkRmVuY2U7CisgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgb3V0cHV0OworICAgIEFTU0VSVF9FUShPSywgaWdicC0+Y29ubmVjdChudWxscHRyLCBOQVRJVkVfV0lORE9XX0FQSV9DUFUsIGZhbHNlLCAmb3V0cHV0KSk7CisKKyAgICAvLyBUZXN0IHRoYXQgd2UgY2FuIGRlcXVldWUgYSBidWZmZXIuCisgICAgQVNTRVJUX0VRKE9LLAorICAgICAgICAgICAgICB+SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6QlVGRkVSX05FRURTX1JFQUxMT0NBVElPTiAmCisgICAgICAgICAgICAgICAgICAgICAgKGlnYnAtPmRlcXVldWVCdWZmZXIoJmRlcXVldWVkU2xvdCwgJmRlcXVldWVkRmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ltYWdlV2lkdGgsIGtJbWFnZUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSW1hZ2VGb3JtYXQsIGtJbWFnZUJ1ZmZlclVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIpKSk7CisgICAgRVhQRUNUX0xFKDAsIGRlcXVldWVkU2xvdCk7CisgICAgRVhQRUNUX0dUKEJ1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTLCBkZXF1ZXVlZFNsb3QpOworCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZGVxdWV1ZWRCdWZmZXI7CisgICAgaWdicC0+cmVxdWVzdEJ1ZmZlcihkZXF1ZXVlZFNsb3QsICZkZXF1ZXVlZEJ1ZmZlcik7CisgICAgdWludDhfdCogaW1nID0gbnVsbHB0cjsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIGRlcXVldWVkQnVmZmVyLT5sb2NrKGtJbWFnZUJ1ZmZlclVzYWdlLCAodm9pZCoqKSgmaW1nKSkpOworCisgICAgLy8gV3JpdGUgaW4gc29tZSBkdW1teSBpbWFnZSBkYXRhLgorICAgIGZpbGxSR0JBOEJ1ZmZlcihpbWcsIGRlcXVldWVkQnVmZmVyLT5nZXRXaWR0aCgpLCBkZXF1ZXVlZEJ1ZmZlci0+Z2V0SGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgIGRlcXVldWVkQnVmZmVyLT5nZXRTdHJpZGUoKSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBkZXF1ZXVlZEJ1ZmZlci0+dW5sb2NrKCkpOworICAgIFF1ZXVlQnVmZmVySW5wdXQgcXVldWVCdWZmZXJJbnB1dChrUXVldWVCdWZmZXJJbnB1dFRpbWVTdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1F1ZXVlQnVmZmVySW5wdXRJc0F1dG9UaW1lU3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtRdWV1ZUJ1ZmZlcklucHV0RGF0YXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUXVldWVCdWZmZXJJbnB1dFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtRdWV1ZUJ1ZmZlcklucHV0U2NhbGluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtRdWV1ZUJ1ZmZlcklucHV0VHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUXVldWVCdWZmZXJJbnB1dEZlbmNlKTsKKyAgICBRdWV1ZUJ1ZmZlck91dHB1dCBxdWV1ZUJ1ZmZlck91dHB1dDsKKyAgICBBU1NFUlRfRVEoT0ssIGlnYnAtPnF1ZXVlQnVmZmVyKGRlcXVldWVkU2xvdCwgcXVldWVCdWZmZXJJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxdWV1ZUJ1ZmZlck91dHB1dCkpOworICAgIC8vIHdhaXQgdW50aWwgdGhlIG9uSW1hZ2VBdmFpbGFibGUgY2FsbGJhY2sgaXMgY2FsbGVkLCBvciB0aW1lb3V0IGNvbXBsZXRlcy4KKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soaW1hZ2VBdmFpbGFibGVNdXRleF8pOworICAgIGltYWdlQ29uZFZhcl8ud2FpdF9mb3IobG9jaywgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyhrT25JbWFnZUF2YWlsYWJsZVdhaXRVcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhpc117IHJldHVybiB0aGlzLT5pbWFnZUF2YWlsYWJsZV87fSk7CisgICAgRVhQRUNUX1RSVUUoaW1hZ2VBdmFpbGFibGVfKSA8PCAgIlRpbWVkIG91dCB3YWl0aW5nIGZvciBpbWFnZSBkYXRhIHRvIGJlIGhhbmRsZWQhXG4iOworfQorCitjbGFzcyBBSW1hZ2VSZWFkZXJQcml2YXRlRm9ybWF0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICBwdWJsaWM6CisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgYXV0byBzdGF0dXMgPSBBSW1hZ2VSZWFkZXJfbmV3KGtJbWFnZVdpZHRoLCBrSW1hZ2VIZWlnaHQsIEFJTUFHRV9GT1JNQVRfUkFXX0RFUFRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga01heEltYWdlcywgJmltZ1JlYWRlcik7CisgICAgICAgIEVYUEVDVF9UUlVFKHN0YXR1cyA9PSBBTUVESUFfT0spOworICAgIH0KKworICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChpbWdSZWFkZXIpIHsKKyAgICAgICAgICAgIEFJbWFnZVJlYWRlcl9kZWxldGUoaW1nUmVhZGVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBSW1hZ2VSZWFkZXIgKmltZ1JlYWRlciA9IG51bGxwdHI7Cit9OworCitURVNUX0YoQUltYWdlUmVhZGVyUHJpdmF0ZUZvcm1hdFRlc3QsIENyZWF0ZVRlc3QpIHsKKyAgICBFWFBFQ1RfVFJVRShpbWdSZWFkZXIgIT0gbnVsbHB0cik7Cit9CisKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmNwcCBiL21lZGlhL3V0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTdjMzQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y21hdGg+CisKKyNpbmNsdWRlIDxtZWRpYXV0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmg+CisjaW5jbHVkZSA8aGlkbC9IeWJyaWRJbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFpbWcgeworCit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7CisKK3N0YXRpYyBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBjb252ZXJ0TmF0aXZlSGFuZGxlVG9IR0JQICgKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpIHsKKyAgICAvLyBSZWFkIHRoZSBzaXplIG9mIHRoZSBoYWxUb2tlbiB2ZWM8dWludDhfdD4KKyAgICBoaWRsX3ZlYzx1aW50OF90PiBoYWxUb2tlbjsKKyAgICBoYWxUb2tlbi5zZXRUb0V4dGVybmFsKAorICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oY29uc3RfY2FzdDxpbnQgKj4oJihoYW5kbGUtPmRhdGFbMV0pKSksCisgICAgICAgIGhhbmRsZS0+ZGF0YVswXSk7CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaGdicCA9CisgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmNhc3RGcm9tKHJldHJpZXZlSGFsSW50ZXJmYWNlKGhhbFRva2VuKSk7CisgICAgcmV0dXJuIGhnYnA7Cit9CisKK3NwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IEFJbWFnZVJlYWRlcl9nZXRIR0JQRnJvbUhhbmRsZSgKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSkgeworICAgIGlmIChoYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKGhhbmRsZS0+bnVtRmRzICE9IDAgIHx8CisgICAgICAgIGhhbmRsZS0+bnVtSW50cyA8IHN0ZDo6Y2VpbChzaXplb2Yoc2l6ZV90KSAvIHNpemVvZihpbnQpKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGNvbnZlcnROYXRpdmVIYW5kbGVUb0hHQlAoaGFuZGxlKTsKK30KKworfSAvL25hbWVzcGFjZSBhaW1nCit9IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS91dGlscy9BbmRyb2lkLmJwCmluZGV4IGQ2ZGFlNWIuLmExMTYwMmIgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvdXRpbHMvQW5kcm9pZC5icApAQCAtMTYsMjUgKzE2LDM5IEBACiAgICAgbmFtZTogImxpYm1lZGlhdXRpbHMiLAogCiAgICAgc3JjczogWworICAgICAgICAiQUltYWdlUmVhZGVyVXRpbHMuY3BwIiwKICAgICAgICAgIkJhdHRlcnlOb3RpZmllci5jcHAiLAogICAgICAgICAiSVNjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmNwcCIsCiAgICAgICAgICJNZW1vcnlMZWFrVHJhY2tVdGlsLmNwcCIsCiAgICAgICAgICJQcm9jZXNzSW5mby5jcHAiLAogICAgICAgICAiU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuY3BwIiwKKyAgICAgICAgIlNlcnZpY2VVdGlsaXRpZXMuY3BwIiwKKyAgICAgICAgIlRpbWVDaGVjay5jcHAiLAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibWVtdW5yZWFjaGFibGUiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCiAgICAgXSwKIAorICAgIGxvZ3RhZ3M6IFsiRXZlbnRMb2dUYWdzLmxvZ3RhZ3MiXSwKKwogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdleHRyYSIsCiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLAogCisgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKKyAgICAgICAgcHJvZHVjdF9pc19pb3Q6IHsKKyAgICAgICAgICAgIGNmbGFnczogWyItRFRBUkdFVF9BTkRST0lEX1RISU5HUyJdLAorICAgICAgICB9LAorICAgIH0sCisKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvRXZlbnRMb2dUYWdzLmxvZ3RhZ3MgYi9tZWRpYS91dGlscy9FdmVudExvZ1RhZ3MubG9ndGFncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2YwZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvRXZlbnRMb2dUYWdzLmxvZ3RhZ3MKQEAgLTAsMCArMSw0MSBAQAorIyBUaGUgZW50cmllcyBpbiB0aGlzIGZpbGUgbWFwIGEgc3BhcnNlIHNldCBvZiBsb2cgdGFnIG51bWJlcnMgdG8gdGFnIG5hbWVzLgorIyBUaGlzIGlzIGluc3RhbGxlZCBvbiB0aGUgZGV2aWNlLCBpbiAvc3lzdGVtL2V0YywgYW5kIHBhcnNlZCBieSBsb2djYXQuCisjCisjIFRhZyBudW1iZXJzIGFyZSBkZWNpbWFsIGludGVnZXJzLCBmcm9tIDAgdG8gMl4zMS4gIChMZXQncyBsZWF2ZSB0aGUKKyMgbmVnYXRpdmUgdmFsdWVzIGFsb25lIGZvciBub3cuKQorIworIyBUYWcgbmFtZXMgYXJlIG9uZSBvciBtb3JlIEFTQ0lJIGxldHRlcnMgYW5kIG51bWJlcnMgb3IgdW5kZXJzY29yZXMsIGkuZS4KKyMgIltBLVpdW2Etel1bMC05XV8iLiAgRG8gbm90IGluY2x1ZGUgc3BhY2VzIG9yIHB1bmN0dWF0aW9uICh0aGUgZm9ybWVyCisjIGltcGFjdHMgbG9nIHJlYWRhYmlsaXR5LCB0aGUgbGF0dGVyIG1ha2VzIHJlZ2V4IHNlYXJjaGVzIG1vcmUgYW5ub3lpbmcpLgorIworIyBUYWcgbnVtYmVycyBhbmQgbmFtZXMgYXJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLiAgQmxhbmsgbGluZXMgYW5kIGxpbmVzCisjIHN0YXJ0aW5nIHdpdGggJyMnIGFyZSBpZ25vcmVkLgorIworIyBPcHRpb25hbGx5LCBhZnRlciB0aGUgdGFnIG5hbWVzIGNhbiBiZSBwdXQgYSBkZXNjcmlwdGlvbiBmb3IgdGhlIHZhbHVlKHMpCisjIG9mIHRoZSB0YWcuIERlc2NyaXB0aW9uIGFyZSBpbiB0aGUgZm9ybWF0CisjICAgICg8bmFtZT58ZGF0YSB0eXBlW3xkYXRhIHVuaXRdKQorIyBNdWx0aXBsZSB2YWx1ZXMgYXJlIHNlcGFyYXRlZCBieSBjb21tYXMuCisjCisjIFRoZSBkYXRhIHR5cGUgaXMgYSBudW1iZXIgZnJvbSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyMgMTogaW50CisjIDI6IGxvbmcKKyMgMzogc3RyaW5nCisjIDQ6IGxpc3QKKyMKKyMgVGhlIGRhdGEgdW5pdCBpcyBhIG51bWJlciB0YWtlbiBmcm9tIHRoZSBmb2xsb3dpbmcgbGlzdDoKKyMgMTogTnVtYmVyIG9mIG9iamVjdHMKKyMgMjogTnVtYmVyIG9mIGJ5dGVzCisjIDM6IE51bWJlciBvZiBtaWxsaXNlY29uZHMKKyMgNDogTnVtYmVyIG9mIGFsbG9jYXRpb25zCisjIDU6IElkCisjIDY6IFBlcmNlbnQKKyMgRGVmYXVsdCB2YWx1ZSBmb3IgZGF0YSBvZiB0eXBlIGludC9sb25nIGlzIDIgKGJ5dGVzKS4KKyMKKyMgU2VlIHN5c3RlbS9jb3JlL2xvZ2NhdC9ldmVudC5sb2d0YWdzIGZvciB0aGUgbWFzdGVyIGNvcHkgb2YgdGhlIHRhZ3MuCisKKyMgNjEwMDAgLSA2MTE5OSByZXNlcnZlZCBmb3IgYXVkaW9zZXJ2ZXIKKworNjEwMDAgYXVkaW9zZXJ2ZXJfYmluZGVyX3RpbWVvdXQgKGNvbW1hbmR8MykKKworIyBOT1RFIC0gdGhlIHJhbmdlIDEwMDAwMDAtMjAwMDAwMCBpcyByZXNlcnZlZCBmb3IgcGFydG5lcnMgYW5kIG90aGVycyB3aG8KKyMgd2FudCB0byBkZWZpbmUgdGhlaXIgb3duIGxvZyB0YWdzIHdpdGhvdXQgY29uZmxpY3Rpbmcgd2l0aCB0aGUgY29yZSBwbGF0Zm9ybS4KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL1NlcnZpY2VVdGlsaXRpZXMuY3BwIGIvbWVkaWEvdXRpbHMvU2VydmljZVV0aWxpdGllcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZiMjRmNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL1NlcnZpY2VVdGlsaXRpZXMuY3BwCkBAIC0wLDAgKzEsMzA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJTZXJ2aWNlVXRpbGl0aWVzIgorCisjaW5jbHVkZSA8YmluZGVyL0FwcE9wc01hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25DYWNoZS5oPgorI2luY2x1ZGUgIm1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oIgorCisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisvKiBXaGVuIHBlcmZvcm1pbmcgcGVybWlzc2lvbiBjaGVja3Mgd2UgZG8gbm90IHVzZSBwZXJtaXNzaW9uIGNhY2hlIGZvcgorICogcnVudGltZSBwZXJtaXNzaW9ucyAocHJvdGVjdGlvbiBsZXZlbCBkYW5nZXJvdXMpIGFzIHRoZXkgbWF5IGNoYW5nZSBhdAorICogcnVudGltZS4gQWxsIG90aGVyIHBlcm1pc3Npb25zIChwcm90ZWN0aW9uIGxldmVsIG5vcm1hbCBhbmQgZGFuZ2Vyb3VzKQorICogY2FuIGJlIGNhY2hlZCBhcyB0aGV5IG5ldmVyIGNoYW5nZS4gT2YgY291cnNlIGFsbCBwZXJtaXNzaW9uIGNoZWNrZWQKKyAqIGhlcmUgYXJlIHBsYXRmb3JtIGRlZmluZWQuCisgKi8KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8oImFuZHJvaWQucGVybWlzc2lvbi5SRUNPUkRfQVVESU8iKTsKKworc3RhdGljIFN0cmluZzE2IHJlc29sdmVDYWxsaW5nUGFja2FnZShQZXJtaXNzaW9uQ29udHJvbGxlciYgcGVybWlzc2lvbkNvbnRyb2xsZXIsCisgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCB1aWRfdCB1aWQpIHsKKyAgICBpZiAob3BQYWNrYWdlTmFtZS5zaXplKCkgPiAwKSB7CisgICAgICAgIHJldHVybiBvcFBhY2thZ2VOYW1lOworICAgIH0KKyAgICAvLyBJbiBzb21lIGNhc2VzIHRoZSBjYWxsaW5nIGNvZGUgaGFzIG5vIGFjY2VzcyB0byB0aGUgcGFja2FnZSBpdCBydW5zIHVuZGVyLgorICAgIC8vIEZvciBleGFtcGxlLCBjb2RlIHVzaW5nIHRoZSB3aWxoZWxtIGZyYW1ld29yaydzIE9wZW5TTC1FUyBBUElzLiBJbiB0aGlzCisgICAgLy8gY2FzZSB3ZSB3aWxsIGdldCB0aGUgcGFja2FnZXMgZm9yIHRoZSBjYWxsaW5nIFVJRCBhbmQgcGljayB0aGUgZmlyc3Qgb25lCisgICAgLy8gZm9yIGF0dHJpYnV0aW5nIHRoZSBhcHAgb3AuIFRoaXMgd2lsbCB3b3JrIGNvcnJlY3RseSBmb3IgcnVudGltZSBwZXJtaXNzaW9ucworICAgIC8vIGFzIGZvciBsZWdhY3kgYXBwcyB3ZSB3aWxsIHRvZ2dsZSB0aGUgYXBwIG9wIGZvciBhbGwgcGFja2FnZXMgaW4gdGhlIFVJRC4KKyAgICAvLyBUaGUgY2F2ZWF0IGlzIHRoYXQgdGhlIG9wZXJhdGlvbiBtYXkgYmUgYXR0cmlidXRlZCB0byB0aGUgd3JvbmcgcGFja2FnZSBhbmQKKyAgICAvLyBzdGF0cyBiYXNlZCBvbiBhcHAgb3BzIG1heSBiZSBzbGlnaHRseSBvZmYuCisgICAgVmVjdG9yPFN0cmluZzE2PiBwYWNrYWdlczsKKyAgICBwZXJtaXNzaW9uQ29udHJvbGxlci5nZXRQYWNrYWdlc0ZvclVpZCh1aWQsIHBhY2thZ2VzKTsKKyAgICBpZiAocGFja2FnZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCJObyBwYWNrYWdlcyBmb3IgdWlkICVkIiwgdWlkKTsKKyAgICAgICAgcmV0dXJuIG9wUGFja2FnZU5hbWU7IC8vIGVtcHR5IHN0cmluZworICAgIH0KKyAgICByZXR1cm4gcGFja2FnZXNbMF07Cit9CisKK3N0YXRpYyBib29sIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwKKyAgICAgICAgdWlkX3QgdWlkLCBib29sIHN0YXJ0KSB7CisgICAgLy8gT2theSB0byBub3QgdHJhY2sgaW4gYXBwIG9wcyBhcyBhdWRpbyBzZXJ2ZXIgaXMgdXMgYW5kIGlmCisgICAgLy8gZGV2aWNlIGlzIHJvb3RlZCBzZWN1cml0eSBtb2RlbCBpcyBjb25zaWRlcmVkIGNvbXByb21pc2VkLgorICAgIGlmIChpc0F1ZGlvU2VydmVyT3JSb290VWlkKHVpZCkpIHJldHVybiB0cnVlOworCisgICAgLy8gV2Ugc3BlY2lmeSBhIHBpZCBhbmQgdWlkIGhlcmUgYXMgbWVkaWFzZXJ2ZXIgKGFrYSBNZWRpYVJlY29yZGVyIG9yIFN0YWdlRnJpZ2h0UmVjb3JkZXIpCisgICAgLy8gbWF5IG9wZW4gYSByZWNvcmQgdHJhY2sgb24gYmVoYWxmIG9mIGEgY2xpZW50LiAgTm90ZSB0aGF0IHBpZCBtYXkgYmUgYSB0aWQuCisgICAgLy8gSU1QT1JUQU5UOiBET04nVCBVU0UgUGVybWlzc2lvbkNhY2hlIC0gUlVOVElNRSBQRVJNSVNTSU9OUyBDSEFOR0UuCisgICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGVybWlzc2lvbkNvbnRyb2xsZXI7CisgICAgY29uc3QgYm9vbCBvayA9IHBlcm1pc3Npb25Db250cm9sbGVyLmNoZWNrUGVybWlzc2lvbihzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbywgcGlkLCB1aWQpOworICAgIGlmICghb2spIHsKKyAgICAgICAgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgJXMiLCBTdHJpbmc4KHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFN0cmluZzE2IHJlc29sdmVkT3BQYWNrYWdlTmFtZSA9IHJlc29sdmVDYWxsaW5nUGFja2FnZSgKKyAgICAgICAgICAgIHBlcm1pc3Npb25Db250cm9sbGVyLCBvcFBhY2thZ2VOYW1lLCB1aWQpOworICAgIGlmIChyZXNvbHZlZE9wUGFja2FnZU5hbWUuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFwcE9wc01hbmFnZXIgYXBwT3BzOworICAgIGNvbnN0IGludDMyX3Qgb3AgPSBhcHBPcHMucGVybWlzc2lvblRvT3BDb2RlKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKTsKKyAgICBpZiAoc3RhcnQpIHsKKyAgICAgICAgaWYgKGFwcE9wcy5zdGFydE9wTm9UaHJvdyhvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUsIC8qc3RhcnRJZk1vZGVEZWZhdWx0Ki8gZmFsc2UpCisgICAgICAgICAgICAgICAgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7CisgICAgICAgICAgICBBTE9HRSgiUmVxdWVzdCBkZW5pZWQgYnkgYXBwIG9wOiAlZCIsIG9wKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhcHBPcHMuY2hlY2tPcChvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUpICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgeworICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3QgZGVuaWVkIGJ5IGFwcCBvcDogJWQiLCBvcCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCByZWNvcmRpbmdBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgIHJldHVybiBjaGVja1JlY29yZGluZ0ludGVybmFsKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkLCAvKnN0YXJ0Ki8gZmFsc2UpOworfQorCitib29sIHN0YXJ0UmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgICByZXR1cm4gY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgLypzdGFydCovIHRydWUpOworfQorCit2b2lkIGZpbmlzaFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKSB7CisgICAgLy8gT2theSB0byBub3QgdHJhY2sgaW4gYXBwIG9wcyBhcyBhdWRpbyBzZXJ2ZXIgaXMgdXMgYW5kIGlmCisgICAgLy8gZGV2aWNlIGlzIHJvb3RlZCBzZWN1cml0eSBtb2RlbCBpcyBjb25zaWRlcmVkIGNvbXByb21pc2VkLgorICAgIGlmIChpc0F1ZGlvU2VydmVyT3JSb290VWlkKHVpZCkpIHJldHVybjsKKworICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBlcm1pc3Npb25Db250cm9sbGVyOworICAgIFN0cmluZzE2IHJlc29sdmVkT3BQYWNrYWdlTmFtZSA9IHJlc29sdmVDYWxsaW5nUGFja2FnZSgKKyAgICAgICAgICAgIHBlcm1pc3Npb25Db250cm9sbGVyLCBvcFBhY2thZ2VOYW1lLCB1aWQpOworICAgIGlmIChyZXNvbHZlZE9wUGFja2FnZU5hbWUuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFwcE9wc01hbmFnZXIgYXBwT3BzOworICAgIGNvbnN0IGludDMyX3Qgb3AgPSBhcHBPcHMucGVybWlzc2lvblRvT3BDb2RlKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKTsKKyAgICBhcHBPcHMuZmluaXNoT3Aob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lKTsKK30KKworYm9vbCBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7CisgICAgaWYgKGlzQXVkaW9TZXJ2ZXJPclJvb3RVaWQodWlkKSkgcmV0dXJuIHRydWU7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYXB0dXJlQXVkaW9PdXRwdXQoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX09VVFBVVCIpOworICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzQ2FwdHVyZUF1ZGlvT3V0cHV0LCBwaWQsIHVpZCk7CisgICAgaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fT1VUUFVUIik7CisgICAgcmV0dXJuIG9rOworfQorCitib29sIGNhcHR1cmVIb3R3b3JkQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgIC8vIENBUFRVUkVfQVVESU9fSE9UV09SRCBwZXJtaXNzaW9uIGltcGxpZXMgUkVDT1JEX0FVRElPIHBlcm1pc3Npb24KKyAgICBib29sIG9rID0gcmVjb3JkaW5nQWxsb3dlZChTdHJpbmcxNigiIiksIHBpZCwgdWlkKTsKKworICAgIGlmIChvaykgeworICAgICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVIb3R3b3JkQWxsb3dlZCgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRCIpOworICAgICAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgorICAgICAgICBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzQ2FwdHVyZUhvdHdvcmRBbGxvd2VkKTsKKyAgICB9CisgICAgaWYgKCFvaykgQUxPR0UoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkQiKTsKKyAgICByZXR1cm4gb2s7Cit9CisKK2Jvb2wgc2V0dGluZ3NBbGxvd2VkKCkgeworICAgIC8vIGdpdmVuIHRoaXMgaXMgYSBwZXJtaXNzaW9uIGNoZWNrLCBjb3VsZCB0aGlzIGJlIGlzQXVkaW9TZXJ2ZXJPclJvb3RVaWQoKT8KKyAgICBpZiAoaXNBdWRpb1NlcnZlclVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSByZXR1cm4gdHJ1ZTsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0F1ZGlvU2V0dGluZ3MoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MiKTsKKyAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgorICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0F1ZGlvU2V0dGluZ3MpOworICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MiKTsKKyAgICByZXR1cm4gb2s7Cit9CisKK2Jvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpIHsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fUk9VVElORyIpOworICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzTW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCk7CisgICAgaWYgKCFvaykgQUxPR0UoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fUk9VVElORyIpOworICAgIHJldHVybiBvazsKK30KKworYm9vbCBtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpIHsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKAorICAgICAgICAgICAgImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfREVGQVVMVF9BVURJT19FRkZFQ1RTIik7CisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNNb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCk7CisKKyNpZmRlZiBUQVJHRVRfQU5EUk9JRF9USElOR1MKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIC8vIFVzZSBhIHNlY29uZGFyeSBwZXJtaXNzaW9uIG9uIEFuZHJvaWQgVGhpbmdzIHRvIGFsbG93IGEgbW9yZSBsZW5pZW50IGxldmVsIG9mIHByb3RlY3Rpb24uCisgICAgICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FuZHJvaWRUaGluZ3NBbGxvd2VkKAorICAgICAgICAgICAgICAgICJjb20uZ29vZ2xlLmFuZHJvaWQudGhpbmdzLnBlcm1pc3Npb24uTU9ESUZZX0RFRkFVTFRfQVVESU9fRUZGRUNUUyIpOworICAgICAgICBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICBzTW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FuZHJvaWRUaGluZ3NBbGxvd2VkKTsKKyAgICB9CisgICAgaWYgKCFvaykgQUxPR0UoImNvbS5nb29nbGUuYW5kcm9pZC50aGluZ3MucGVybWlzc2lvbi5NT0RJRllfREVGQVVMVF9BVURJT19FRkZFQ1RTIik7CisjZWxzZQorICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0RFRkFVTFRfQVVESU9fRUZGRUNUUyIpOworI2VuZGlmCisgICAgcmV0dXJuIG9rOworfQorCitib29sIGR1bXBBbGxvd2VkKCkgeworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzRHVtcCgiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKTsKKyAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgorICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0R1bXApOworICAgIC8vIGNvbnZlbnRpb24gaXMgZm9yIGNhbGxlciB0byBkdW1wIGFuIGVycm9yIG1lc3NhZ2UgdG8gZmQgaW5zdGVhZCBvZiBsb2dnaW5nIGhlcmUKKyAgICAvL2lmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7CisgICAgcmV0dXJuIG9rOworfQorCitib29sIG1vZGlmeVBob25lU3RhdGVBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlQaG9uZVN0YXRlKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX1BIT05FX1NUQVRFIik7CisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNNb2RpZnlQaG9uZVN0YXRlLCBwaWQsIHVpZCk7CisgICAgaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9QSE9ORV9TVEFURSIpOworICAgIHJldHVybiBvazsKK30KKworc3RhdHVzX3QgY2hlY2tJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KQoreworICAgIGlmIChpTWVtb3J5ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzIGNoZWNrIGZhaWxlZDogTlVMTCBJTWVtb3J5IHBvaW50ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gaU1lbW9yeS0+Z2V0TWVtb3J5KCk7CisgICAgaWYgKGhlYXAgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXMgY2hlY2sgZmFpbGVkOiBOVUxMIGhlYXAgcG9pbnRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgb2ZmX3Qgc2l6ZSA9IGxzZWVrKGhlYXAtPmdldEhlYXBJRCgpLCAwLCBTRUVLX0VORCk7CisgICAgbHNlZWsoaGVhcC0+Z2V0SGVhcElEKCksIDAsIFNFRUtfU0VUKTsKKworICAgIGlmIChpTWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCB8fCBzaXplIDwgKG9mZl90KWlNZW1vcnktPnNpemUoKSkgeworICAgICAgICBBTE9HRSgiJXMgY2hlY2sgZmFpbGVkOiBwb2ludGVyICVwIHNpemUgJXp1IGZkIHNpemUgJXUiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlNZW1vcnktPnBvaW50ZXIoKSwgaU1lbW9yeS0+c2l6ZSgpLCAodWludDMyX3Qpc2l6ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzcDxjb250ZW50OjpwbTo6SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPiBNZWRpYVBhY2thZ2VNYW5hZ2VyOjpyZXRyZWl2ZVBhY2thZ2VNYW5hZ2VyKCkgeworICAgIGNvbnN0IHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICBpZiAoc20gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXM6IGZhaWxlZCB0byByZXRyaWV2ZSBkZWZhdWx0U2VydmljZU1hbmFnZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzcDxJQmluZGVyPiBwYWNrYWdlTWFuYWdlciA9IHNtLT5jaGVja1NlcnZpY2UoU3RyaW5nMTYobmF0aXZlUGFja2FnZU1hbmFnZXJOYW1lKSk7CisgICAgaWYgKHBhY2thZ2VNYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBmYWlsZWQgdG8gcmV0cmlldmUgbmF0aXZlIHBhY2thZ2UgbWFuYWdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxjb250ZW50OjpwbTo6SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPihwYWNrYWdlTWFuYWdlcik7Cit9CisKK3N0ZDo6b3B0aW9uYWw8Ym9vbD4gTWVkaWFQYWNrYWdlTWFuYWdlcjo6ZG9Jc0FsbG93ZWQodWlkX3QgdWlkKSB7CisgICAgaWYgKG1QYWNrYWdlTWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgIC8qKiBDYW4gbm90IGZldGNoIHBhY2thZ2UgbWFuYWdlciBhdCBjb25zdHJ1Y3Rpb24gaXQgbWF5IG5vdCB5ZXQgYmUgcmVnaXN0ZXJlZC4gKi8KKyAgICAgICAgbVBhY2thZ2VNYW5hZ2VyID0gcmV0cmVpdmVQYWNrYWdlTWFuYWdlcigpOworICAgICAgICBpZiAobVBhY2thZ2VNYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogUGxheWJhY2sgY2FwdHVyZSBpcyBkZW5pZWQgYXMgcGFja2FnZSBtYW5hZ2VyIGlzIG5vdCByZWFjaGFibGUiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBhY2thZ2VOYW1lczsKKyAgICBhdXRvIHN0YXR1cyA9IG1QYWNrYWdlTWFuYWdlci0+Z2V0TmFtZXNGb3JVaWRzKHsoaW50MzJfdCl1aWR9LCAmcGFja2FnZU5hbWVzKTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR1coIiVzOiBQbGF5YmFjayBjYXB0dXJlIGlzIGRlbmllZCBmb3IgdWlkICV1IGFzIHRoZSBwYWNrYWdlIG5hbWVzIGNvdWxkIG5vdCBiZSAiCisgICAgICAgICAgICAgICJyZXRyaWV2ZWQgZnJvbSB0aGUgcGFja2FnZSBtYW5hZ2VyOiAlcyIsIF9fZnVuY19fLCB1aWQsIHN0YXR1cy50b1N0cmluZzgoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKKyAgICB9CisgICAgaWYgKHBhY2thZ2VOYW1lcy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dXKCIlczogUGxheWJhY2sgY2FwdHVyZSBmb3IgdWlkICV1IGlzIGRlbmllZCBhcyBubyBwYWNrYWdlIG5hbWUgY291bGQgYmUgcmV0cmlldmVkICIKKyAgICAgICAgICAgICAgImZyb20gdGhlIHBhY2thZ2UgbWFuYWdlcjogJXMiLCBfX2Z1bmNfXywgdWlkLCBzdGF0dXMudG9TdHJpbmc4KCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPGJvb2w+IGlzQWxsb3dlZDsKKyAgICBzdGF0dXMgPSBtUGFja2FnZU1hbmFnZXItPmlzQXVkaW9QbGF5YmFja0NhcHR1cmVBbGxvd2VkKHBhY2thZ2VOYW1lcywgJmlzQWxsb3dlZCk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dXKCIlczogUGxheWJhY2sgY2FwdHVyZSBpcyBkZW5pZWQgZm9yIHVpZCAldSBhcyB0aGUgbWFuaWZlc3QgcHJvcGVydHkgY291bGQgbm90IGJlICIKKyAgICAgICAgICAgICAgInJldHJpZXZlZCBmcm9tIHRoZSBwYWNrYWdlIG1hbmFnZXI6ICVzIiwgX19mdW5jX18sIHVpZCwgc3RhdHVzLnRvU3RyaW5nOCgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OworICAgIH0KKyAgICBpZiAocGFja2FnZU5hbWVzLnNpemUoKSAhPSBpc0FsbG93ZWQuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dXKCIlczogUGxheWJhY2sgY2FwdHVyZSBpcyBkZW5pZWQgZm9yIHVpZCAldSBhcyB0aGUgcGFja2FnZSBtYW5hZ2VyIHJldHVybmVkIGluY29oZXJlbnQiCisgICAgICAgICAgICAgICIgcmVzcG9uc2Ugc2l6ZTogJXp1ICE9ICV6dSIsIF9fZnVuY19fLCB1aWQsIHBhY2thZ2VOYW1lcy5zaXplKCksIGlzQWxsb3dlZC5zaXplKCkpOworICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OworICAgIH0KKworICAgIC8vIFppcCB0b2dldGhlciBwYWNrYWdlTmFtZXMgYW5kIGlzQWxsb3dlZCBmb3IgZGVidWcgbG9ncworICAgIFBhY2thZ2VzJiBwYWNrYWdlcyA9IG1EZWJ1Z0xvZ1t1aWRdOworICAgIHBhY2thZ2VzLnJlc2l6ZShwYWNrYWdlTmFtZXMuc2l6ZSgpKTsgLy8gUmV1c2UgYWxsIG9iamVjdHMKKyAgICBzdGQ6OnRyYW5zZm9ybShiZWdpbihwYWNrYWdlTmFtZXMpLCBlbmQocGFja2FnZU5hbWVzKSwgYmVnaW4oaXNBbGxvd2VkKSwKKyAgICAgICAgICAgICAgICAgICBiZWdpbihwYWNrYWdlcyksIFtdIChhdXRvJiBuYW1lLCBib29sIGlzQWxsb3dlZCkgLT4gUGFja2FnZSB7CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7c3RkOjptb3ZlKG5hbWUpLCBpc0FsbG93ZWR9OworICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgLy8gT25seSBhbGxvdyBwbGF5YmFjayByZWNvcmQgaWYgYWxsIHBhY2thZ2VzIGluIHRoaXMgVUlEIGFsbG93IGl0CisgICAgYm9vbCBwbGF5YmFja0NhcHR1cmVBbGxvd2VkID0gc3RkOjphbGxfb2YoYmVnaW4oaXNBbGxvd2VkKSwgZW5kKGlzQWxsb3dlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGJvb2wgYikgeyByZXR1cm4gYjsgfSk7CisKKyAgICByZXR1cm4gcGxheWJhY2tDYXB0dXJlQWxsb3dlZDsKK30KKwordm9pZCBNZWRpYVBhY2thZ2VNYW5hZ2VyOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QgeworICAgIGRwcmludGYoZmQsICIlKnNBbGxvdyBwbGF5YmFjayBjYXB0dXJlIGxvZzpcbiIsIHNwYWNlcywgIiIpOworICAgIGlmIChtUGFja2FnZU1hbmFnZXIgPT0gbnVsbHB0cikgeworICAgICAgICBkcHJpbnRmKGZkLCAiJSpzTm8gcGFja2FnZSBtYW5hZ2VyXG4iLCBzcGFjZXMgKyAyLCAiIik7CisgICAgfQorICAgIGRwcmludGYoZmQsICIlKnNQYWNrYWdlIG1hbmFnZXIgZXJyb3JzOiAldVxuIiwgc3BhY2VzICsgMiwgIiIsIG1QYWNrYWdlTWFuYWdlckVycm9ycyk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHVpZENhY2hlIDogbURlYnVnTG9nKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGFja2FnZSA6IHN0ZDo6Z2V0PFBhY2thZ2VzPih1aWRDYWNoZSkpIHsKKyAgICAgICAgICAgIGRwcmludGYoZmQsICIlKnMtIHVpZD0lNXUsIGFsbG93UGxheWJhY2tDYXB0dXJlPSVzLCBwYWNrYWdlTmFtZT0lc1xuIiwgc3BhY2VzICsgMiwgIiIsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6Z2V0PGNvbnN0IHVpZF90Pih1aWRDYWNoZSksCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UucGxheWJhY2tDYXB0dXJlQWxsb3dlZCA/ICJ0cnVlICIgOiAiZmFsc2UiLAorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLm5hbWUuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL1RpbWVDaGVjay5jcHAgYi9tZWRpYS91dGlscy9UaW1lQ2hlY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Y2Y0ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9UaW1lQ2hlY2suY3BwCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9UaW1lQ2hlY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9FdmVudExvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIHN0YXRpYyAqLworc3A8VGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ+IFRpbWVDaGVjazo6Z2V0VGltZUNoZWNrVGhyZWFkKCkKK3sKKyAgICBzdGF0aWMgc3A8VGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ+IHNUaW1lQ2hlY2tUaHJlYWQgPSBuZXcgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQoKTsKKyAgICByZXR1cm4gc1RpbWVDaGVja1RocmVhZDsKK30KKworVGltZUNoZWNrOjpUaW1lQ2hlY2soY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMpCisgICAgOiBtRW5kVGltZU5zKGdldFRpbWVDaGVja1RocmVhZCgpLT5zdGFydE1vbml0b3JpbmcodGFnLCB0aW1lb3V0TXMpKQoreworfQorCitUaW1lQ2hlY2s6On5UaW1lQ2hlY2soKSB7CisgICAgZ2V0VGltZUNoZWNrVGhyZWFkKCktPnN0b3BNb25pdG9yaW5nKG1FbmRUaW1lTnMpOworfQorCitUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6flRpbWVDaGVja1RocmVhZCgpCit7CisgICAgQXV0b011dGV4IF9sKG1NdXRleCk7CisgICAgcmVxdWVzdEV4aXQoKTsKKyAgICBtTW9uaXRvclJlcXVlc3RzLmNsZWFyKCk7CisgICAgbUNvbmQuc2lnbmFsKCk7Cit9CisKK25zZWNzX3QgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnN0YXJ0TW9uaXRvcmluZyhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOworICAgIG5zZWNzX3QgZW5kVGltZU5zID0gc3lzdGVtVGltZSgpICsgbWlsbGlzZWNvbmRzKHRpbWVvdXRNcyk7CisgICAgZm9yICg7IG1Nb25pdG9yUmVxdWVzdHMuaW5kZXhPZktleShlbmRUaW1lTnMpID49IDA7ICsrZW5kVGltZU5zKTsKKyAgICBtTW9uaXRvclJlcXVlc3RzLmFkZChlbmRUaW1lTnMsIHRhZyk7CisgICAgbUNvbmQuc2lnbmFsKCk7CisgICAgcmV0dXJuIGVuZFRpbWVOczsKK30KKwordm9pZCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6c3RvcE1vbml0b3JpbmcobnNlY3NfdCBlbmRUaW1lTnMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKKyAgICBtTW9uaXRvclJlcXVlc3RzLnJlbW92ZUl0ZW0oZW5kVGltZU5zKTsKKyAgICBtQ29uZC5zaWduYWwoKTsKK30KKworYm9vbCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6dGhyZWFkTG9vcCgpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gVElNRURfT1VUOworICAgIGNvbnN0IGNoYXIgKnRhZzsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOworCisgICAgICAgIGlmIChleGl0UGVuZGluZygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBuc2Vjc190IGVuZFRpbWVOcyA9IElOVDY0X01BWDsKKyAgICAgICAgLy8gS2V5ZWRWZWN0b3IgbU1vbml0b3JSZXF1ZXN0cyBpcyBvcmRlcmVkIHNvIHRha2UgZmlyc3QgZW50cnkgYXMgbmV4dCB0aW1lb3V0CisgICAgICAgIGlmIChtTW9uaXRvclJlcXVlc3RzLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICBlbmRUaW1lTnMgPSBtTW9uaXRvclJlcXVlc3RzLmtleUF0KDApOworICAgICAgICAgICAgdGFnID0gbU1vbml0b3JSZXF1ZXN0cy52YWx1ZUF0KDApOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgbnNlY3NfdCB3YWl0VGltZU5zID0gZW5kVGltZU5zIC0gc3lzdGVtVGltZSgpOworICAgICAgICBpZiAod2FpdFRpbWVOcyA+IDApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1Db25kLndhaXRSZWxhdGl2ZShtTXV0ZXgsIHdhaXRUaW1lTnMpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HX0VWRU5UX1NUUklORyhMT0dUQUdfQVVESU9fQklOREVSX1RJTUVPVVQsIHRhZyk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlRpbWVDaGVjayB0aW1lb3V0IGZvciAlcyIsIHRhZyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWJkZTFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQUlNQUdFX1JFQURFUl9VVElMU19ICisjZGVmaW5lIEFJTUFHRV9SRUFERVJfVVRJTFNfSAorCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzEuMC9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaW1nIHsKKwordXNpbmcgSEdyYXBoaWNCdWZmZXJQcm9kdWNlciA9IGhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKy8vIFJldHJpZXZlcyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5hdGl2ZV9oYW5kbGVfdAorLy8gcHJvdmlkZWQgKHRoaXMgbmF0aXZlIGhhbmRsZSBNVVNUIGhhdmUgYmVlbiBvYnRhaW5lZCBieSBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93TmF0aXZlSGFuZGxlKCkpLgorc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gQUltYWdlUmVhZGVyX2dldEhHQlBGcm9tSGFuZGxlKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKTsKKworfS8vIG5hbWVzcGFjZSBhaW1nCit9Ly8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vQUlNQUdFX1JFQURFUl9VVElMU19ICmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvRXZlbnRMb2cuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9FdmVudExvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1M2QzYmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvRXZlbnRMb2cuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQU5EUk9JRF9BVURJT19FVkVOVF9MT0dfSF8KKyNkZWZpbmUgQU5EUk9JRF9BVURJT19FVkVOVF9MT0dfSF8KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBrZWVwIHZhbHVlcyBpbiBzeW5jIHdpdGggZnJhbWV3b3Jrcy9hdi9tZWRpYS91dGlscy9FdmVudExvZ1RhZ3MubG9ndGFncworZW51bSB7CisgIExPR1RBR19BVURJT19CSU5ERVJfVElNRU9VVCA9IDYxMDAwLAorfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0VWRU5UX0xPR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQzNzBlZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFVVElMU19TRVJWSUNFVVRJTElUSUVTX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQVVUSUxTX1NFUlZJQ0VVVElMSVRJRVNfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvcG0vSVBhY2thZ2VNYW5hZ2VyTmF0aXZlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNvbnRyb2xsZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBBdWRpbyBwZXJtaXNzaW9uIHV0aWxpdGllcworCisvLyBVc2VkIGZvciBjYWxscyB0aGF0IHNob3VsZCBvcmlnaW5hdGUgZnJvbSBzeXN0ZW0gc2VydmljZXMuCisvLyBXZSBhbGxvdyB0aGF0IHNvbWUgc2VydmljZXMgbWlnaHQgaGF2ZSBzZXBhcmF0ZSBwcm9jZXNzZXMgdG8KKy8vIGhhbmRsZSBtdWx0aXBsZSB1c2VycywgZS5nLiB1MTBfc3lzdGVtLCB1MTBfYmx1ZXRvb3RoLCB1MTBfcmFkaW8uCitzdGF0aWMgaW5saW5lIGJvb2wgaXNTZXJ2aWNlVWlkKHVpZF90IHVpZCkgeworICAgIHJldHVybiBtdWx0aXVzZXJfZ2V0X2FwcF9pZCh1aWQpIDwgQUlEX0FQUF9TVEFSVDsKK30KKworLy8gVXNlZCBmb3IgY2FsbHMgdGhhdCBzaG91bGQgb3JpZ2luYXRlIGZyb20gYXVkaW9zZXJ2ZXIuCitzdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1NlcnZlclVpZCh1aWRfdCB1aWQpIHsKKyAgICByZXR1cm4gdWlkID09IEFJRF9BVURJT1NFUlZFUjsKK30KKworLy8gVXNlZCBmb3Igc29tZSBwZXJtaXNzaW9uIGNoZWNrcy4KKy8vIEFJRF9ST09UIGlzIE9LIGZvciBjb21tYW5kLWxpbmUgdGVzdHMuICBOYXRpdmUgYXVkaW9zZXJ2ZXIgYWx3YXlzIE9LLgorc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9TZXJ2ZXJPclJvb3RVaWQodWlkX3QgdWlkKSB7CisgICAgcmV0dXJuIHVpZCA9PSBBSURfQVVESU9TRVJWRVIgfHwgdWlkID09IEFJRF9ST09UOworfQorCisvLyBVc2VkIGZvciBjYWxscyB0aGF0IHNob3VsZCBjb21lIGZyb20gc3lzdGVtIHNlcnZlciBvciBpbnRlcm5hbC4KKy8vIE5vdGU6IHN5c3RlbSBzZXJ2ZXIgaXMgbXVsdGlwcm9jZXNzIGZvciBtdWx0aXBsZSB1c2Vycy4gIGF1ZGlvc2VydmVyIGlzIG5vdC4KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0F1ZGlvU2VydmVyT3JTeXN0ZW1TZXJ2ZXJVaWQodWlkX3QgdWlkKSB7CisgICAgcmV0dXJuIG11bHRpdXNlcl9nZXRfYXBwX2lkKHVpZCkgPT0gQUlEX1NZU1RFTSB8fCB1aWQgPT0gQUlEX0FVRElPU0VSVkVSOworfQorCisvLyBNZWRpYXNlcnZlciBtYXkgZm9yd2FyZCB0aGUgY2xpZW50IFBJRCBhbmQgVUlEIGFzIHBhcnQgb2YgYSBiaW5kZXIgaW50ZXJmYWNlIGNhbGw7CisvLyBvdGhlcndpc2UgdGhlIGNhbGxpbmcgVUlEIG11c3QgYmUgZXF1YWwgdG8gdGhlIGNsaWVudCBVSUQuCitzdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQodWlkX3QgdWlkKSB7CisgICAgc3dpdGNoICh1aWQpIHsKKyAgICBjYXNlIEFJRF9NRURJQToKKyAgICBjYXNlIEFJRF9BVURJT1NFUlZFUjoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCByZWNvcmRpbmdBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7Citib29sIHN0YXJ0UmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7Cit2b2lkIGZpbmlzaFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKTsKK2Jvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Citib29sIGNhcHR1cmVIb3R3b3JkQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Citib29sIHNldHRpbmdzQWxsb3dlZCgpOworYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCk7Citib29sIG1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCk7Citib29sIGR1bXBBbGxvd2VkKCk7Citib29sIG1vZGlmeVBob25lU3RhdGVBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKK3N0YXR1c190IGNoZWNrSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSk7CisKK2NsYXNzIE1lZGlhUGFja2FnZU1hbmFnZXIgeworcHVibGljOgorICAgIC8qKiBRdWVyeSB0aGUgUGFja2FnZU1hbmFnZXIgdG8gY2hlY2sgaWYgYWxsIGFwcHMgb2YgYW4gVUlEIGFsbG93IHBsYXliYWNrIGNhcHR1cmUuICovCisgICAgYm9vbCBhbGxvd1BsYXliYWNrQ2FwdHVyZSh1aWRfdCB1aWQpIHsKKyAgICAgICAgYXV0byByZXN1bHQgPSBkb0lzQWxsb3dlZCh1aWQpOworICAgICAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICAgICAgbVBhY2thZ2VNYW5hZ2VyRXJyb3JzKys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcihmYWxzZSk7CisgICAgfQorICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMgPSAwKSBjb25zdDsKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBuYXRpdmVQYWNrYWdlTWFuYWdlck5hbWUgPSAicGFja2FnZV9uYXRpdmUiOworICAgIHN0ZDo6b3B0aW9uYWw8Ym9vbD4gZG9Jc0FsbG93ZWQodWlkX3QgdWlkKTsKKyAgICBzcDxjb250ZW50OjpwbTo6SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPiByZXRyZWl2ZVBhY2thZ2VNYW5hZ2VyKCk7CisgICAgc3A8Y29udGVudDo6cG06OklQYWNrYWdlTWFuYWdlck5hdGl2ZT4gbVBhY2thZ2VNYW5hZ2VyOyAvLyBUbyBjaGVjayBhcHBzIG1hbmlmZXN0CisgICAgdWludF90IG1QYWNrYWdlTWFuYWdlckVycm9ycyA9IDA7CisgICAgc3RydWN0IFBhY2thZ2UgeworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBib29sIHBsYXliYWNrQ2FwdHVyZUFsbG93ZWQgPSBmYWxzZTsKKyAgICB9OworICAgIHVzaW5nIFBhY2thZ2VzID0gc3RkOjp2ZWN0b3I8UGFja2FnZT47CisgICAgc3RkOjptYXA8dWlkX3QsIFBhY2thZ2VzPiBtRGVidWdMb2c7Cit9OworfQorCisjZW5kaWYgLy8gQU5EUk9JRF9NRURJQVVUSUxTX1NFUlZJQ0VVVElMSVRJRVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9UaW1lQ2hlY2suaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaApyZW5hbWUgdG8gbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1RpbWVDaGVjay5oCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZC5tayBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWY5ZGM1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIFRoaXMgcGFja2FnZSBpcyBleGNsdWRlZCBmcm9tIGJ1aWxkIGZvciBub3cgc2luY2UgQVBJcyB1c2luZyB0aGlzIGFwayBiZWNhbWUgaGlkZGVuLgotIwotI0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLSNpZm5lcSAoJChUQVJHRVRfQlVJTERfUERLKSx0cnVlKSAjIEJ1aWxkIE1lZGlhQ29tcG9uZW50cyBvbmx5IGlmIHRoaXMgaXMgbm90IGEgUERLIGJ1aWxkLiAgTWVkaWFDb21wb25lbnRzIHdvbid0Ci0jIyBidWlsZCBpbiBQREsgYnVpbGRzIGJlY2F1c2UgZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YSBpcyBub3QgYXZhaWxhYmxlIGJ1dAotIyMgSU1lZGlhU2Vzc2lvbjIuYWlkbCBhbmQgSU1lZGlhQ29udHJvbGxlcjIuYWlkbCBhcmUgdXNpbmcgY2xhc3NlcyBmcm9tCi0jIyBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhLgotIwotI2luY2x1ZGUgJChDTEVBUl9WQVJTKQotIwotI0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBNZWRpYUNvbXBvbmVudHMKLSNMT0NBTF9NT0RVTEVfT1dORVIgOj0gZ29vZ2xlCi0jCi0jIyBUT0RPOiBjcmVhdGUgYSBzZXBhcmF0ZSBrZXkgZm9yIHRoaXMgcGFja2FnZS4KLSNMT0NBTF9DRVJUSUZJQ0FURSA6PSBwbGF0Zm9ybQotIwotIyMgVE9ETzogVXNlIFN5c3RlbSBTREsgb25jZSBwdWJsaWMgQVBJcyBhcmUgYXBwcm92ZWQKLSMjIExPQ0FMX1NES19WRVJTSU9OIDo9IHN5c3RlbV9jdXJyZW50Ci0jTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKLSMKLSNMT0NBTF9TUkNfRklMRVMgOj0gXAotIyAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgXAotIyAgICAkKGNhbGwgYWxsLUlhaWRsLWZpbGVzLXVuZGVyLCBzcmMpCi0jCi0jTE9DQUxfUFJPR1VBUkRfRkxBR19GSUxFUyA6PSBwcm9ndWFyZC5jZmcKLSMKLSNMT0NBTF9NVUxUSUxJQiA6PSBmaXJzdAotIwotI0xPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQtc3VwcG9ydC1hbm5vdGF0aW9ucwotIwotIyMgVG8gZW1iZWQgbmF0aXZlIGxpYnJhcmllcyBpbiBwYWNrYWdlLCB1bmNvbW1lbnQgdGhlIGxpbmVzIGJlbG93LgotIyNMT0NBTF9NT0RVTEVfVEFHUyA6PSBzYW1wbGVzCi0jI0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSMjICAgIGxpYmFhY2V4dHJhY3RvciBcCi0jIyAgICBsaWJhbXJleHRyYWN0b3IgXAotIyMgICAgbGliZmxhY2V4dHJhY3RvciBcCi0jIyAgICBsaWJtaWRpZXh0cmFjdG9yIFwKLSMjICAgIGxpYm1rdmV4dHJhY3RvciBcCi0jIyAgICBsaWJtcDNleHRyYWN0b3IgXAotIyMgICAgbGlibXA0ZXh0cmFjdG9yIFwKLSMjICAgIGxpYm1wZWcyZXh0cmFjdG9yIFwKLSMjICAgIGxpYm9nZ2V4dHJhY3RvciBcCi0jIyAgICBsaWJ3YXZleHRyYWN0b3IgXAotIwotIyMgVE9ETzogUmVtb3ZlIGRlcGVuZGVuY3kgd2l0aCBvdGhlciBzdXBwb3J0IGxpYnJhcmllcy4KLSNMT0NBTF9TVEFUSUNfQU5EUk9JRF9MSUJSQVJJRVMgKz0gXAotIyAgICBhbmRyb2lkLXN1cHBvcnQtdjQgXAotIyAgICBhbmRyb2lkLXN1cHBvcnQtdjctYXBwY29tcGF0IFwKLSMgICAgYW5kcm9pZC1zdXBwb3J0LXY3LXBhbGV0dGUKLSNMT0NBTF9VU0VfQUFQVDIgOj0gdHJ1ZQotIwotI2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQotIwotI2VuZGlmICAjIGlmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspLHRydWUpCi0jCi0jaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmZGNhMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZSIKLSAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxIgotICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMCIgPgotCi0gICAgPGFwcGxpY2F0aW9uCi0gICAgICAgIGFuZHJvaWQ6bGFiZWw9Ik1lZGlhIENvbXBvbmVudHMgVXBkYXRlIgotICAgICAgICBhbmRyb2lkOm11bHRpQXJjaD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDphbGxvd0JhY2t1cD0iZmFsc2UiCi0gICAgICAgIGFuZHJvaWQ6aGFzQ29kZT0iZmFsc2UiCi0gICAgICAgIGFuZHJvaWQ6ZXh0cmFjdE5hdGl2ZUxpYnM9ImZhbHNlIj4KLSAgICA8L2FwcGxpY2F0aW9uPgotCi08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Byb2d1YXJkLmNmZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9wcm9ndWFyZC5jZmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YmY3MzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Byb2d1YXJkLmNmZworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBLZWVwIGVudHJ5IHBvaW50IGZvciB1cGRhdGFibGUgSmF2YSBjbGFzc2VzCi0ta2VlcCBwdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUZhY3RvcnkgewotICAgcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpRmFjdG9yeSBpbml0aWFsaXplKGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8pOwotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdmZDUxZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjODI1Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI4ZGRlYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE5Y2Q3NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE5MmFkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI3MDdlYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMzMmQwMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0NWVlMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDFkMzQxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDZiNjVkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZGlzYWJsZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzU0ZjYxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZW5hYmxlZC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZW5hYmxlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmOGZlYmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZDMwNWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4N2ZkZTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM5ZGY3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGMzNDRhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTAzNDIwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MjNlNDU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDBjMjVhMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWZkYjljMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0NmMxMDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzM2JmNDg0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOTExYjVjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTRlZDUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2Y3ZTBjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjU1OGE4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGExYTg0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDlhZWQ3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDA2OGVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2M3NzdjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjA4Nzk1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZDJjOWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMDJhYjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTRmNjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4ZmViZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3VidGl0bGVfZW5hYmxlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0NmVhNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3OTBjNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MDFkYzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNGQ1ODYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYmI3NzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjYzk4NDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMjYxN2UxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZWZlZjNjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWEwMDQ3Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhNWQ2YTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgxMzQzMTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjODk5Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc3OGUwMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5MmZjNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM4ODRlNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYwYWM2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyMTA0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1YzA2Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEyZDQ5NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjM5MzM2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmM1YTZjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZGQyMTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2JkY2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdmZTU3Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE1ZDZhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWFkZmEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjVmZTBiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YzQ4YTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MWU5MTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0MjE4YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzMGZhYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2FhOTAzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2UyZjI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODcxZTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNTdmNjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0MWIwMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiYjY5NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGUxMDEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzM1MmMzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNTMyZTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNmJhMzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhM2I1Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0YmIyMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTU2MTI3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDE3YTlmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZjYzM2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNTE4MTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU2YTUzYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcwNWRjYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGU0ZWEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzY3MjRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllM2I0MTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMThhYmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4MTEzMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwYjE5MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGFiYTNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTM0ZDViLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OTU3YjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZDM4NGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRjNjI5Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhhYjY4NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWU3Zjc1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWEzY2EzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYWVjZGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOGQwYjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwYmUzYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0ZjFiZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTE4YjQ2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGMyYzAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZmFlNDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NGMyODkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmOTMyNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlMWY2OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTZmYWZkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTJiZDg3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3M2ExZjguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YzEwNjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYyYjgwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmYmEwMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTdmMmQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGY1NDc4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OTVhZjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MGI3ZjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmRkMjE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjdiZGNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZmU1NzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNWQ2YWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhZGZhMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI1ZmUwYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWM0OGE3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDFlOTExLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNDIxOGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMzBmYWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhYTkwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlMmYyOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzg3MWUyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzU3ZjYzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNDFiMDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmI2OTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlMTAxMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzNTJjMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDUzMmU5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzZiYTMwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYTNiNWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNGJiMjIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM1NzBmNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhNDAzZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjQ0YmZkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Q2MDQ4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMGQ1NTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYmM0OGQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRkOGY4ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiOTBlNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzIzNGE3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2Q0NTJmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MWNmNWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZDA4YjQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZlYjNmMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZThiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjBmYzA4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmExNmFjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNTk4Y2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NmQxNmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3MDQ1NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2ZGIxMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjM4MjhhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWNjYzczLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOGNlZDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMDFiOWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UzMWRkMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmNzhlNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2MyY2RiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2M1YmVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYWQwZDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYTU5MjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY4N2UyNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMwNmRiOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDIyNWJhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTY5N2RlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzN2VjMjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxODQwYmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0NWUzYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzN2M2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmRkMjE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjdiZGNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkYzEzMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE0NjE3Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMzA3NzMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNWQ3ZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMzhkNTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU0MDM0OWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNjdjNDYzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZmNlYmY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWEzMmE3YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ2MmNhMzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxMzEyNTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEzMWUxYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU5NDZhMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1ZTg3Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFiNDQwMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VhN2UwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2MzUzOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0NWMzYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRhM2JhNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzVjYTE4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWMxODNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYjY3OWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYzYwNTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4MzkxNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjM2NhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzQ0NGNmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ2Mzc3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmQxZGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZTcxMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmNTk2Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzMmUxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTY4ZTA0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDIwZGQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZTM5ZTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZGMxNWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhZWJhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVhNmE0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGI5MWNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWY2NmY5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZWEzNGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MmRlMDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxYWEyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0YmNjMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjY2YjM1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDVhOGZiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZWIxMzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYTJiNjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI4MGFhOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1ZWZlNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzBjYzMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFlNmZjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ODE2YzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNDI5MzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkNWI3Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzYTBmZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzJhNjU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGRlYmMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZTc4YTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhM2Y5OTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNmYWQ5ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkZDhkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTBmZDVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjBiNWMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTFlZjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNzEwZDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYxYzA4MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0YWEyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWE2YjMwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmU4ZmUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Yjg0MGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjQwNTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFjMThjMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5NzUzZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjI5MWIxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzFjNjE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MDRhNzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZTBhNjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiMWYzZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM1NTFlYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzg2NjdlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmI4MTgzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OTNmMTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNWUxNTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGI2NzllLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWM2MDUxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwODM5MTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYzNjYWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0NDRjZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkNjM3Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGJkMWRhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmU3MTA4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZjU5NmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzJlMWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU2OGUwNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQyMGRkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmUzOWU3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWRjMTVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YWViYWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YTZhNGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiOTFjZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmNjZmOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWVhMzRiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTJkZTA0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMWFhMjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNGJjYzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmZmEwMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmN2U1Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmFjNGRjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmE4NmY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMDEwOTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzOTZmMGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5MDAxYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI3MTU4MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTk2MjA4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjY5NTAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZTFiZDYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZThmMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYzMmU5NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFkNWQyZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjBkNTI3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzYxYWUxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYTNmODQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZDE2NmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJlNTI3ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViMmE4ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzM3YWY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2YzMWVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZDlmNTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOGViNzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZhMGUxNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0MjVlMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yzc2ZTE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDJmMWVkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZmRjZGQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZTliODE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOWU0NDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OWNhODkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjNzVkNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNiZDI3Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWJiMGFjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjUxNGFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlN2ZlNWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjJjMTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRiNjc5ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjNjA1MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjIxMjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTdlM2EuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODYwMWNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDkyOGQ3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTJmZDc3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMTcxYThjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzhjYjZjYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWM4ODYzZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzMzUwMzguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNmE0ODU4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Y2E2Nzg3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjMwNWQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDEucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkzOTVkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAyLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYTcyODIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2YwZjUzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZhODBkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA1LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYzM5MzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNi5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjAyNTM2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDcucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyMjhmNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA4LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNDI3N2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wOS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODY1YmZiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTAucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjNWQ2Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzExLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZjRhZDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzExLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMi5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjMwNjQ4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTMucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk5MzI0ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xNC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NjE4ZjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xNS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTBkNzcwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAwLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTBkNzcwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRiNGU1MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDIucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYjVmMDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAzLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDVjNzU4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE1YzdmYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDUucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMjg3ZTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA2LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjdkMGNmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmYTcyYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDgucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NTBlZWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjQ0MzU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU4NzdjMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTEucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MjdmMGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEyLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWIxOWJiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY1OTIxZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0Yjc2YjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzE1LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjMwNWQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YTk1MjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTczMWE2ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08bGF5ZXItbGlzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiID4KLSAgICA8aXRlbSBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9iYWNrZ3JvdW5kIj4KLSAgICAgICAgPHNoYXBlIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSIgPgotICAgICAgICAgICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IiMyNjAwMDAwMCIgLz4KLSAgICAgICAgPC9zaGFwZT4KLSAgICA8L2l0ZW0+Ci0gICAgPGl0ZW0gYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvc2Vjb25kYXJ5UHJvZ3Jlc3MiPgotICAgICAgICA8Y2xpcD4KLSAgICAgICAgICAgIDxzaGFwZSBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiID4KLSAgICAgICAgICAgICAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iIzVDZmZmZmZmIiAvPgotICAgICAgICAgICAgPC9zaGFwZT4KLSAgICAgICAgPC9jbGlwPgotICAgIDwvaXRlbT4KLSAgICA8aXRlbSBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9wcm9ncmVzcyI+Ci0gICAgICAgIDxjbGlwPgotICAgICAgICAgICAgPHNoYXBlIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSIgPgotICAgICAgICAgICAgICAgIDxzb2xpZCBhbmRyb2lkOmNvbG9yPSIjZmZmZmZmIiAvPgotICAgICAgICAgICAgPC9zaGFwZT4KLSAgICAgICAgPC9jbGlwPgotICAgIDwvaXRlbT4KLTwvbGF5ZXItbGlzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzc190aHVtYi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzc190aHVtYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMzU5NzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9jdXN0b21fcHJvZ3Jlc3NfdGh1bWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOnNoYXBlPSJvdmFsIiA+Ci0gICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IiNmZmZmZmYiIC8+Ci0gICAgPHNpemUKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc190aHVtYl9zaXplIgotICAgICAgICBhbmRyb2lkOndpZHRoPSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSIgLz4KLTwvc2hhcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hcnJvd19iYWNrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXJyb3dfYmFjay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNWY3MWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hcnJvd19iYWNrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0yMCwxMUg3LjgzbDUuNTksLTUuNTlMMTIsNGwtOCw4IDgsOCAxLjQxLC0xLjQxTDcuODMsMTNIMjB2LTJ6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2FzcGVjdF9yYXRpby54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2FzcGVjdF9yYXRpby54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MjI4ZTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hc3BlY3RfcmF0aW8ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LDEyaC0ydjNoLTN2Mmg1di01ek03LDloM0wxMCw3TDUsN3Y1aDJMNyw5ek0yMSwzTDMsM2MtMS4xLDAgLTIsMC45IC0yLDJ2MTRjMCwxLjEgMC45LDIgMiwyaDE4YzEuMSwwIDIsLTAuOSAyLC0yTDIzLDVjMCwtMS4xIC0wLjksLTIgLTIsLTJ6TTIxLDE5LjAxTDMsMTkuMDFMMyw0Ljk5aDE4djE0LjAyeiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hdWRpb3RyYWNrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXVkaW90cmFjay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YzEyYjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hdWRpb3RyYWNrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiwzdjkuMjhjLTAuNDcsLTAuMTcgLTAuOTcsLTAuMjggLTEuNSwtMC4yOEM4LjAxLDEyIDYsMTQuMDEgNiwxNi41UzguMDEsMjEgMTAuNSwyMWMyLjMxLDAgNC4yLC0xLjc1IDQuNDUsLTRIMTVWNmg0VjNoLTd6Ii8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hlY2sueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGVjay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZjcyMGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGVjay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wIDBoMjR2MjRIMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik05IDE2LjJMNC44IDEybC0xLjQgMS40TDkgMTkgMjEgN2wtMS40LTEuNEw5IDE2LjJ6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX2xlZnQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX2xlZnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzM2ZDE3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9sZWZ0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xNS40MSw3LjQxTDE0LDZsLTYsNiA2LDYgMS40MSwtMS40MUwxMC44MywxMnoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZXZyb25fcmlnaHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjJjZTA5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTAsNkw4LjU5LDcuNDEgMTMuMTcsMTJsLTQuNTgsNC41OUwxMCwxOGw2LC02eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZWU2NDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSI1MTJkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iNTEyZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSI1MTIiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iNTEyIj4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjNjE2MTYxIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNIDAgMCBIIDUxMiBWIDUxMiBIIDAgViAwIFoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiM1MjUyNTIiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0yNTYsMTUxdjEyMy4xNGMtNi44OC00LjAyLTE0LjgyLTYuNDgtMjMuMzMtNi40OCBjLTI1Ljc4LDAtNDYuNjcsMjAuODgtNDYuNjcsNDYuNjdjMCwyNS43OCwyMC44OCw0Ni42Nyw0Ni42Nyw0Ni42N3M0Ni42Ny0yMC44OCw0Ni42Ny00Ni42N1YxOTcuNjdIMzI2VjE1MUgyNTZ6IiAvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2ZvcndhcmRfMzAueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mb3J3YXJkXzMwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmZGYxNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2ZvcndhcmRfMzAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxncm91cD4KLSAgICAgICAgPGNsaXAtcGF0aCBhbmRyb2lkOnBhdGhEYXRhPSJNMjQsMjRIMFYwaDI0djI0eiBNIDAsMCIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNOS42IDEzLjVoLjRjLjIgMCAuNCwtLjEuNSwtLjJzLjIsLS4yLjIsLS40di0uMnMtLjEsLS4xLC0uMSwtLjIsLS4xLC0uMSwtLjIsLS4xaC0uNXMtLjEuMSwtLjIuMSwtLjEuMSwtLjEuMnYuMmgtMWMwLC0uMiAwLC0uMy4xLC0uNXMuMiwtLjMuMywtLjQuMywtLjIuNCwtLjIuNCwtLjEuNSwtLjFjLjIgMCAuNCAwIC42LjFzLjMuMS41LjIuMi4yLjMuNC4xLjMuMS41di4zcy0uMS4yLC0uMS4zLC0uMS4yLC0uMi4yLC0uMi4xLC0uMy4yYy4yLjEuNC4yLjUuNHMuMi40LjIuNmMwIC4yIDAgLjQsLS4xLjVzLS4yLjMsLS4zLjQsLS4zLjIsLS41LjIsLS40LjEsLS42LjFjLS4yIDAsLS40IDAsLS41LC0uMXMtLjMsLS4xLC0uNSwtLjIsLS4yLC0uMiwtLjMsLS40LC0uMSwtLjQsLS4xLC0uNmguOHYuMnMuMS4xLjEuMi4xLjEuMi4xaC41cy4xLC0uMS4yLC0uMS4xLC0uMS4xLC0uMnYtLjVzLS4xLC0uMSwtLjEsLS4yLC0uMSwtLjEsLS4yLC0uMWgtLjZ2LS43em01LjcuN2MwIC4zIDAgLjYsLS4xLjhsLS4zLjZzLS4zLjMsLS41LjMsLS40LjEsLS42LjEsLS40IDAsLS42LC0uMSwtLjMsLS4yLC0uNSwtLjMsLS4yLC0uMywtLjMsLS42LC0uMSwtLjUsLS4xLC0uOHYtLjdjMCwtLjMgMCwtLjYuMSwtLjhsLjMsLS42cy4zLC0uMy41LC0uMy40LC0uMS42LC0uMS40IDAgLjYuMS4zLjIuNS4zLjIuMy4zLjYuMS41LjEuOHYuN3ptLS45LC0uOHYtLjVzLS4xLC0uMiwtLjEsLS4zLC0uMSwtLjEsLS4yLC0uMiwtLjIsLS4xLC0uMywtLjEsLS4yIDAsLS4zLjFsLS4yLjJzLS4xLjIsLS4xLjN2MnMuMS4yLjEuMy4xLjEuMi4yLjIuMS4zLjEuMiAwIC4zLC0uMWwuMiwtLjJzLjEsLS4yLjEsLS4zdi0xLjV6TTQgMTNjMCA0LjQgMy42IDggOCA4czgsLTMuNiA4LC04aC0yYzAgMy4zLC0yLjcgNiwtNiA2cy02LC0yLjcsLTYsLTYgMi43LC02IDYsLTZ2NGw1LC01LC01LC01djRjLTQuNCAwLC04IDMuNiwtOCA4eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLSAgICA8L2dyb3VwPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW4ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mdWxsc2NyZWVuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI0ZjZiYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTcsMTRMNSwxNHY1aDV2LTJMNywxN3YtM3pNNSwxMGgyTDcsN2gzTDEwLDVMNSw1djV6TTE3LDE3aC0zdjJoNXYtNWgtMnYzek0xNCw1djJoM3YzaDJMMTksNWgtNXoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbl9leGl0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbl9leGl0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyMDRlMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW5fZXhpdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNSwxNmgzdjNoMnYtNUw1LDE0djJ6TTgsOEw1LDh2Mmg1TDEwLDVMOCw1djN6TTE0LDE5aDJ2LTNoM3YtMmgtNXY1ek0xNiw4TDE2LDVoLTJ2NWg1TDE5LDhoLTN6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hlbHAueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19oZWxwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxZDc1ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hlbHAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCAwaDI0djI0SDB6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMQotMTdoLTJ2LTJoMnYyem0yLjA3LTcuNzVsLS45IC45MiBDMTMuNDUgMTIuOSAxMyAxMy41IDEzIDE1aC0ydi0uNWMwLTEuMSAuNDUgLTIuMQotMS4xNy0yLjgzbDEuMjQtMS4yNmMuMzctLjM2IC41OSAtLjg2IC41OSAtMS40MSAwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDJIOGMwLTIuMjEKLTEuNzktNCA0LTRzNCAxLjc5IDQgNGMwIC44OC0uMzYgMS42OC0uOTMgMi4yNXoiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hpZ2hfcXVhbGl0eS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hpZ2hfcXVhbGl0eS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NmUyMmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19oaWdoX3F1YWxpdHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjM0ZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjM0ZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCAwaDI0djI0SDB6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTkgNEg1Yy0xLjExIDAtMiAwLjktMiAydjEyYzAgMS4xIDAuODkgMiAyIDJoMTRjMS4xIDAgMi0wLjkgMi0yVjZjMC0xLjEtMC45LTItMi0yem0tOCAxMUg5LjV2LTJoLTJ2Mkg2VjloMS41djIuNWgyVjlIMTF2NnptNy0xYzAgMC41NS0wLjQ1IDEtMSAxaC0wLjc1djEuNWgtMS41VjE1SDE0Yy0wLjU1IDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUgMC40NSAtMSAxLTFoM2MwLjU1IDAgMSAwLjQ1IDEgMXY0em0tMy41LTAuNWgydi0zaC0ydjN6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19sYXVuY2gueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19sYXVuY2gueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2FmNmFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfbGF1bmNoLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSwxOUg1VjVoN1YzSDVjLTEuMTEsMCAtMiwwLjkgLTIsMnYxNGMwLDEuMSAwLjg5LDIgMiwyaDE0YzEuMSwwIDIsLTAuOSAyLC0ydi03aC0ydjd6TTE0LDN2MmgzLjU5bC05LjgzLDkuODMgMS40MSwxLjQxTDE5LDYuNDFWMTBoMlYzaC03eiIvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19tdXRlLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfbXV0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MGFhZWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19tdXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xNi41LDEyYzAsLTEuNzcgLTEuMDIsLTMuMjkgLTIuNSwtNC4wM3YyLjIxbDIuNDUsMi40NWMwLjAzLC0wLjIgMC4wNSwtMC40MSAwLjA1LC0wLjYzek0xOSwxMmMwLDAuOTQgLTAuMiwxLjgyIC0wLjU0LDIuNjRsMS41MSwxLjUxQzIwLjYzLDE0LjkxIDIxLDEzLjUgMjEsMTJjMCwtNC4yOCAtMi45OSwtNy44NiAtNywtOC43N3YyLjA2YzIuODksMC44NiA1LDMuNTQgNSw2Ljcxek00LjI3LDNMMyw0LjI3IDcuNzMsOUwzLDl2Nmg0bDUsNXYtNi43M2w0LjI1LDQuMjVjLTAuNjcsMC41MiAtMS40MiwwLjkzIC0yLjI1LDEuMTh2Mi4wNmMxLjM4LC0wLjMxIDIuNjMsLTAuOTUgMy42OSwtMS44MUwxOS43MywyMSAyMSwxOS43M2wtOSwtOUw0LjI3LDN6TTEyLDRMOS45MSw2LjA5IDEyLDguMThMMTIsNHoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3BhdXNlX2NpcmNsZV9maWxsZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2JlMjI4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIsMkM2LjQ4LDIgMiw2LjQ4IDIsMTJzNC40OCwxMCAxMCwxMCAxMCwtNC40OCAxMCwtMTBTMTcuNTIsMiAxMiwyek0xMSwxNkw5LDE2TDksOGgydjh6TTE1LDE2aC0yTDEzLDhoMnY4eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wbGF5X2NpcmNsZV9maWxsZWQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wbGF5X2NpcmNsZV9maWxsZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDM5ZGVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGxheV9jaXJjbGVfZmlsbGVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiwyQzYuNDgsMiAyLDYuNDggMiwxMnM0LjQ4LDEwIDEwLDEwIDEwLC00LjQ4IDEwLC0xMFMxNy41MiwyIDEyLDJ6TTEwLDE2LjV2LTlsNiw0LjUgLTYsNC41eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXBsYXlfY2lyY2xlX2ZpbGxlZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3JlcGxheV9jaXJjbGVfZmlsbGVkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU2ZDVkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3JlcGxheV9jaXJjbGVfZmlsbGVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAsMGgyNHYyNEgwVjB6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOmZpbGxUeXBlPSJldmVuT2RkIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIsMkM2LjQ4LDIsMiw2LjQ4LDIsMTJjMCw1LjUyLDQuNDgsMTAsMTAsMTBjNS41MiwwLDEwLTQuNDgsMTAtMTAKLUMyMiw2LjQ4LDE3LjUyLDIsMTIsMnoKLU0xOCwxMmMwLDMuMzEtMi42OSw2LTYsNmMtMy4zMSwwLTYtMi42OS02LTZoMmMwLDIuMjEsMS43OSw0LDQsNHM0LTEuNzksNC00cy0xLjc5LTQtNC00djNMOCw3bDQtNHYzCi1DMTUuMzEsNiwxOCw4LjY5LDE4LDEyeiIgLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmV3aW5kXzEwLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmV3aW5kXzEwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU1ODZiNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3Jld2luZF8xMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPGdyb3VwPgotICAgICAgICA8Y2xpcC1wYXRoIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDBoMjR2MjRIMFYweiBNIDAsMCIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIgNVYxTDcgNmw1IDVWN2MzLjMgMCA2IDIuNyA2IDZzLTIuNyA2LC02IDYsLTYsLTIuNywtNiwtNkg0YzAgNC40IDMuNiA4IDggOHM4LC0zLjYgOCwtOCwtMy42LC04LC04LC04em0tMS4xIDExSDEwdi0zLjNMOSAxM3YtLjdsMS44LC0uNmguMVYxNnptNC4zLC0xLjhjMCAuMyAwIC42LC0uMS44bC0uMy42cy0uMy4zLC0uNS4zLC0uNC4xLC0uNi4xLC0uNCAwLC0uNiwtLjEsLS4zLC0uMiwtLjUsLS4zLC0uMiwtLjMsLS4zLC0uNiwtLjEsLS41LC0uMSwtLjh2LS43YzAsLS4zIDAsLS42LjEsLS44bC4zLC0uNnMuMywtLjMuNSwtLjMuNCwtLjEuNiwtLjEuNCAwIC42LjFjLjIuMS4zLjIuNS4zcy4yLjMuMy42LjEuNS4xLjh2Ljd6bS0uOSwtLjh2LS41cy0uMSwtLjIsLS4xLC0uMywtLjEsLS4xLC0uMiwtLjIsLS4yLC0uMSwtLjMsLS4xLC0uMiAwLC0uMy4xbC0uMi4ycy0uMS4yLC0uMS4zdjJzLjEuMi4xLjMuMS4xLjIuMi4yLjEuMy4xLjIgMCAuMywtLjFsLjIsLS4ycy4xLC0uMi4xLC0uM3YtMS41eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLSAgICA8L2dyb3VwPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NkLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWNiNmQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCwwaDI0djI0SDBWMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSwzSDVDMy44OSwzLDMsMy45LDMsNXYxNGMwLDEuMSwwLjg5LDIsMiwyaDE0YzEuMSwwLDItMC45LDItMlY1QzIxLDMuOSwyMC4xLDMsMTksM3oKLU0xMyw5aDRjMC41NSwwLDEsMC40NSwxLDF2NCBjMCwwLjU1LTAuNDUsMS0xLDFoLTRWOXoKLU05LjUsMTMuNXYtMUg3Yy0wLjU1LDAtMS0wLjQ1LTEtMVYxMGMwLTAuNTUsMC40NS0xLDEtMWgzYzAuNTUsMCwxLDAuNDUsMSwxdjFIOS41di0wLjVoLTJ2MUgxMAotYzAuNTUsMCwxLDAuNDUsMSwxVjE0YzAsMC41NS0wLjQ1LDEtMSwxSDdjLTAuNTUsMC0xLTAuNDUtMS0xdi0xaDEuNXYwLjVIOS41egotTTE0LjUsMTMuNWgydi0zaC0yVjEzLjV6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZXR0aW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NldHRpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5ZWNjMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NldHRpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOS40MywxMi45OGMwLjA0LC0wLjMyIDAuMDcsLTAuNjQgMC4wNywtMC45OHMtMC4wMywtMC42NiAtMC4wNywtMC45OGwyLjExLC0xLjY1YzAuMTksLTAuMTUgMC4yNCwtMC40MiAwLjEyLC0wLjY0bC0yLC0zLjQ2Yy0wLjEyLC0wLjIyIC0wLjM5LC0wLjMgLTAuNjEsLTAuMjJsLTIuNDksMWMtMC41MiwtMC40IC0xLjA4LC0wLjczIC0xLjY5LC0wLjk4bC0wLjM4LC0yLjY1QzE0LjQ2LDIuMTggMTQuMjUsMiAxNCwyaC00Yy0wLjI1LDAgLTAuNDYsMC4xOCAtMC40OSwwLjQybC0wLjM4LDIuNjVjLTAuNjEsMC4yNSAtMS4xNywwLjU5IC0xLjY5LDAuOThsLTIuNDksLTFjLTAuMjMsLTAuMDkgLTAuNDksMCAtMC42MSwwLjIybC0yLDMuNDZjLTAuMTMsMC4yMiAtMC4wNywwLjQ5IDAuMTIsMC42NGwyLjExLDEuNjVjLTAuMDQsMC4zMiAtMC4wNywwLjY1IC0wLjA3LDAuOThzMC4wMywwLjY2IDAuMDcsMC45OGwtMi4xMSwxLjY1Yy0wLjE5LDAuMTUgLTAuMjQsMC40MiAtMC4xMiwwLjY0bDIsMy40NmMwLjEyLDAuMjIgMC4zOSwwLjMgMC42MSwwLjIybDIuNDksLTFjMC41MiwwLjQgMS4wOCwwLjczIDEuNjksMC45OGwwLjM4LDIuNjVjMC4wMywwLjI0IDAuMjQsMC40MiAwLjQ5LDAuNDJoNGMwLjI1LDAgMC40NiwtMC4xOCAwLjQ5LC0wLjQybDAuMzgsLTIuNjVjMC42MSwtMC4yNSAxLjE3LC0wLjU5IDEuNjksLTAuOThsMi40OSwxYzAuMjMsMC4wOSAwLjQ5LDAgMC42MSwtMC4yMmwyLC0zLjQ2YzAuMTIsLTAuMjIgMC4wNywtMC40OSAtMC4xMiwtMC42NGwtMi4xMSwtMS42NXpNMTIsMTUuNWMtMS45MywwIC0zLjUsLTEuNTcgLTMuNSwtMy41czEuNTcsLTMuNSAzLjUsLTMuNSAzLjUsMS41NyAzLjUsMy41IC0xLjU3LDMuNSAtMy41LDMuNXoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9uZXh0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9uZXh0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmMjgxMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NraXBfbmV4dC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNiwxOGw4LjUsLTZMNiw2djEyek0xNiw2djEyaDJWNmgtMnoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9wcmV2aW91cy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NraXBfcHJldmlvdXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWRhMzE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9wcmV2aW91cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNiw2aDJ2MTJMNiwxOHpNOS41LDEybDguNSw2TDE4LDZ6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29mZi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29mZi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYTcyN2EuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vZmYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCwwaDI0djI0SDBWMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOS41LDUuNXYxM2gtMTV2LTEzSDE5LjV6IE0xOSw0SDVDMy44OSw0LDMsNC45LDMsNnYxMmMwLDEuMSwwLjg5LDIsMiwyaDE0YzEuMSwwLDItMC45LDItMlY2QzIxLDQuOSwyMC4xLDQsMTksNEwxOSw0eiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTExLDExSDkuNXYtMC41aC0ydjNoMlYxM0gxMXYxYzAsMC41NS0wLjQ1LDEtMSwxSDdjLTAuNTUsMC0xLTAuNDUtMS0xdi00YzAtMC41NSwwLjQ1LTEsMS0xaDNjMC41NSwwLDEsMC40NSwxLDFWMTF6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTgsMTFoLTEuNXYtMC41aC0ydjNoMlYxM0gxOHYxYzAsMC41NS0wLjQ1LDEtMSwxaC0zYy0wLjU1LDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUsMC40NS0xLDEtMWgzYzAuNTUsMCwxLDAuNDUsMSwxVjExeiIgLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc3VidGl0bGVfb24ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOTFjMDYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wIDBoMjR2MjRIMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSA0SDVjLTEuMTEgMC0yIDAuOS0yIDJ2MTJjMCAxLjEgMC44OSAyIDIgMmgxNGMxLjEgMCAyLTAuOSAyLTJWNmMwLTEuMS0wLjktMi0yLTJ6bS04IDdIOS41di0wLjVoLTJ2M2gyVjEzSDExdjFjMCAwLjU1LTAuNDUgMS0xIDFIN2MtMC41NSAwLTEtMC40NS0xLTF2LTRjMC0wLjU1IDAuNDUgLTEgMS0xaDNjMC41NSAwIDEgMC40NSAxIDF2MXptNyAwaC0xLjV2LTAuNWgtMnYzaDJWMTNIMTh2MWMwIDAuNTUtMC40NSAxLTEgMWgtM2MtMC41NSAwLTEtMC40NS0xLTF2LTRjMC0wLjU1IDAuNDUgLTEgMS0xaDNjMC41NSAwIDEgMC40NSAxIDF2MXoiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3VubXV0ZS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3VubXV0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZmIyYjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY191bm11dGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTMsOXY2aDRsNSw1TDEyLDRMNyw5TDMsOXpNMTYuNSwxMmMwLC0xLjc3IC0xLjAyLC0zLjI5IC0yLjUsLTQuMDN2OC4wNWMxLjQ4LC0wLjczIDIuNSwtMi4yNSAyLjUsLTQuMDJ6TTE0LDMuMjN2Mi4wNmMyLjg5LDAuODYgNSwzLjU0IDUsNi43MXMtMi4xMSw1Ljg1IC01LDYuNzF2Mi4wNmM0LjAxLC0wLjkxIDcsLTQuNDkgNywtOC43N3MtMi45OSwtNy44NiAtNywtOC43N3oiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEwZmYxMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhbmltYXRpb24tbGlzdAotICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b25lc2hvdD0idHJ1ZSI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZmM3ZmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0Ci0gICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJ0cnVlIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfZGFyay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YWY3YjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0Ci0gICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJmYWxzZSI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotPC9hbmltYXRpb24tbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYjQxNzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhbmltYXRpb24tbGlzdAotICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b25lc2hvdD0iZmFsc2UiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYxZGZhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9kYXJrIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2thYmxlPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfZGFyayIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkM2Q4NGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2xpZ2h0IiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2thYmxlPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfbGlnaHQiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodCIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODhjOGM3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZGlhbG9nX2Nsb3NlX2RhcmsiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfbGlnaHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDUwZTBmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0+Ci0gICAgICAgIDxiaXRtYXAKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci0KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjN2VjYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tIFRoaXMgaXMgdGhlIGNvcHkgb2YgQGRyYXdhYmxlL2FiY19kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9kYXJrIGV4Y2VwdCBmb3IgaW5zZXQKLSAgICAgd2hpY2ggaW5jbHVkZXMgdW5uZWNlc3NhcnkgcGFkZGluZy4gLS0+Ci08c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiPgotICAgIDxjb3JuZXJzIGFuZHJvaWQ6cmFkaXVzPSIyZHAiIC8+Ci0gICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IkBjb2xvci9iYWNrZ3JvdW5kX2Zsb2F0aW5nX21hdGVyaWFsX2RhcmsiIC8+Ci08L3NoYXBlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYjIzNWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gVGhpcyBpcyB0aGUgY29weSBvZiBAZHJhd2FibGUvYWJjX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2xpZ2h0IGV4Y2VwdCBmb3IgaW5zZXQKLSAgICAgd2hpY2ggaW5jbHVkZXMgdW5uZWNlc3NhcnkgcGFkZGluZy4gLS0+Ci08c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiPgotICAgIDxjb3JuZXJzIGFuZHJvaWQ6cmFkaXVzPSIyZHAiIC8+Ci0gICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IkBjb2xvci9iYWNrZ3JvdW5kX2Zsb2F0aW5nX21hdGVyaWFsX2xpZ2h0IiAvPgotPC9zaGFwZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2dyb3VwX2NvbGxhcHNlLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfY29sbGFwc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjcyYmM4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfY29sbGFwc2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YW5pbWF0aW9uLWxpc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9uZXNob3Q9InRydWUiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wMCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzAxIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDIiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wMyIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA0IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDUiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wNiIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA3IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDgiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wOSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzEwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTEiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xMiIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzEzIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTQiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xNSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9leHBhbmQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9leHBhbmQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjNmZGI2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfZXhwYW5kLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJ0cnVlIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzAwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzAxIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzAyIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzAzIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA0IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA1IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA2IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA3IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA4IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA5IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzEwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzExIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzEyIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzEzIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzE0IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzE1IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyMThhNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbWVkaWFfcGF1c2VfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQxZjAyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19tZWRpYV9wYXVzZV9saWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6YWxwaGE9IjAuODciIC8+Ci0gICAgPC9pdGVtPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0NWEzMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tZWRpYV9wbGF5X2RhcmsiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZmI3YTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0+Ci0gICAgICAgIDxiaXRtYXAKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfbWVkaWFfcGxheV9saWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6YWxwaGE9IjAuODciIC8+Ci0gICAgPC9pdGVtPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxMDhhOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3N0b3BfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tZWRpYV9zdG9wX2RhcmsiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzZjZTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0+Ci0gICAgICAgIDxiaXRtYXAKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfbWVkaWFfc3RvcF9saWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6YWxwaGE9IjAuODciIC8+Ci0gICAgPC9pdGVtPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRmNGZkNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19hdWRpb3RyYWNrX2RhcmsiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOWRiYzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0+Ci0gICAgICAgIDxiaXRtYXAKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfYXVkaW90cmFja19saWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6YWxwaGE9IjAuODciIC8+Ci0gICAgPC9pdGVtPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvaW50ZXJwb2xhdG9yL21yX2Zhc3Rfb3V0X3Nsb3dfaW4ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfZmFzdF9vdXRfc2xvd19pbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNmExNzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfZmFzdF9vdXRfc2xvd19pbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICB+IENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAgLS0+Ci0KLTxwYXRoSW50ZXJwb2xhdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmNvbnRyb2xYMT0iMC40IgotICAgIGFuZHJvaWQ6Y29udHJvbFkxPSIwIgotICAgIGFuZHJvaWQ6Y29udHJvbFgyPSIwLjIiCi0gICAgYW5kcm9pZDpjb250cm9sWTI9IjEiLz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvaW50ZXJwb2xhdG9yL21yX2xpbmVhcl9vdXRfc2xvd19pbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9saW5lYXJfb3V0X3Nsb3dfaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGJmMjk4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvaW50ZXJwb2xhdG9yL21yX2xpbmVhcl9vdXRfc2xvd19pbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICB+IENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAgLS0+Ci0KLTxwYXRoSW50ZXJwb2xhdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmNvbnRyb2xYMT0iMCIKLSAgICBhbmRyb2lkOmNvbnRyb2xZMT0iMCIKLSAgICBhbmRyb2lkOmNvbnRyb2xYMj0iMC4yIgotICAgIGFuZHJvaWQ6Y29udHJvbFkyPSIxIi8+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9tdXNpYy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9tdXNpYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNGQzNjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfbXVzaWMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgIDxWaWV3Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIgotICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAuMjUiLz4KLQotICAgIDxJbWFnZVZpZXcKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbGJ1bSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMC41IgotICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0Q2VudGVyIgotICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UiIC8+Ci0KLSAgICA8VmlldwotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwLjI1Ii8+Ci08L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1NmRjYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYmxhY2tfb3BhY2l0eV83MCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pY29uIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2ljb25fc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI4ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIgLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbWFpbl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19tYWluX3RleHRfc2l6ZSIvPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdWJfdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3RleHRfaGVpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9tYWluX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGVfb3BhY2l0eV83MCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3N1Yl90ZXh0X3NpemUiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+Ci0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfc3ViX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDdhNzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfc3ViX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ibGFja19vcGFjaXR5XzcwIj4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NoZWNrIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2ljb25fc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI4ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfY2hlY2siLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3RleHRfaGVpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhNTk1Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iQGRpbWVuL21jdjJfdHJhbnNwb3J0X2NvbnRyb2xzX3BhZGRpbmciCi0gICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IkBkaW1lbi9tY3YyX3RyYW5zcG9ydF9jb250cm9sc19wYWRkaW5nIgotICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0idmlzaWJsZSI+Ci0KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9wcmV2IiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUHJldmlvdXMiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcmV3IiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUmV3IiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3BhdXNlIiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUGF1c2UiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZmZ3ZCIgc3R5bGU9IkBzdHlsZS9FbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLkZmd2QiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbmV4dCIgc3R5bGU9IkBzdHlsZS9FbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLk5leHQiIC8+Ci08L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX2xhbmRzY2FwZV9tdXNpYy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX2xhbmRzY2FwZV9tdXNpYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZTcwNTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9sYW5kc2NhcGVfbXVzaWMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0IzMDBGRjAwIgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL211c2ljX2ltYWdlIgotICAgICAgICBzdHlsZT0iQHN0eWxlL0Z1bGxNdXNpY0xhbmRzY2FwZS5JbWFnZSI+Ci0KLSAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbGJ1bSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX2xhbmRzY2FwZV9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX2xhbmRzY2FwZV9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlIi8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXVzaWNfdGV4dCIKLSAgICAgICAgc3R5bGU9IkBzdHlsZS9GdWxsTXVzaWNMYW5kc2NhcGUuVGV4dCI+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjBzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkYiIC8+Ci0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hcnRpc3QiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbWN2Ml9tdXNpY19hcnRpc3RfdW5rbm93bl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTZzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjQkJCQkJCIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9wb3J0cmFpdF9tdXNpYy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3BvcnRyYWl0X211c2ljLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmMWJiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3BvcnRyYWl0X211c2ljLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXVzaWNfaW1hZ2UiCi0gICAgICAgIHN0eWxlPSJAc3R5bGUvRnVsbE11c2ljUG9ydHJhaXQuSW1hZ2UiPgotCi0gICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWxidW0iCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9hbGJ1bV9pbWFnZV9wb3J0cmFpdF9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX3BvcnRyYWl0X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UiLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXNpY190ZXh0IgotICAgICAgICBzdHlsZT0iQHN0eWxlL0Z1bGxNdXNpY1BvcnRyYWl0LlRleHQiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX3BvcnRyYWl0X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIwc3AiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGIiAvPgotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYXJ0aXN0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21jdjJfbXVzaWNfYXJ0aXN0X3Vua25vd25fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE2c3AiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0JCQkJCQiIgLz4KLSAgICA8L0xpbmVhckxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyZWE1ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JsYWNrX29wYWNpdHlfNzAiPgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pY29uIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2ljb25fc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iOGRwIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tYWluX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX3RleHRfaGVpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19tYWluX3RleHRfc2l6ZSIvPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdWJfdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL21haW5fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZV9vcGFjaXR5XzcwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19zdWJfdGV4dF9zaXplIi8+Ci0gICAgPC9SZWxhdGl2ZUxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc3ViX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MTI4ZDAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYmxhY2tfb3BhY2l0eV83MCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NoZWNrIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2ljb25fc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iOGRwIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2NoZWNrIi8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX21haW5fdGV4dF9zaXplIi8+Ci0gICAgPC9SZWxhdGl2ZUxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkxNDc4NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3RyYW5zcG9ydF9jb250cm9scy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSJAZGltZW4vbWN2Ml90cmFuc3BvcnRfY29udHJvbHNfcGFkZGluZyIKLSAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iQGRpbWVuL21jdjJfdHJhbnNwb3J0X2NvbnRyb2xzX3BhZGRpbmciCi0gICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJ2aXNpYmxlIj4KLQotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3ByZXYiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlByZXZpb3VzIiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3JldyIgc3R5bGU9IkBzdHlsZS9GdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUmV3IiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3BhdXNlIiBzdHlsZT0iQHN0eWxlL0Z1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QYXVzZSIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mZndkIiBzdHlsZT0iQHN0eWxlL0Z1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5GZndkIiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL25leHQiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLk5leHQiIC8+Ci08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21lZGlhX2NvbnRyb2xsZXIueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWVkaWFfY29udHJvbGxlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NThmMDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWVkaWFfY29udHJvbGxlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibHRyIj4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX2JhciIKLSAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAbGF5b3V0L3RpdGxlX2Jhcl9ncmFkaWVudCIKLSAgICAgICAgc3R5bGU9IkBzdHlsZS9UaXRsZUJhciI+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZV9iYXJfbGVmdCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9iYWNrIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRTdGFydD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0idmlzaWJsZSIKLSAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RpdGxlQmFyQnV0dG9uLkJhY2siLz4KLQotICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZV90ZXh0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC9iYWNrIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4TGluZXM9IjEiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNWRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNWRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNXNwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGRkYiLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZV9iYXJfcmlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZF9leHRlcm5hbF9saW5rIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMGRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSI+Ci0KLSAgICAgICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZF90ZXh0IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI1ZGlwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvTWVkaWFDb250cm9sVmlldzJfYWRfdGV4dCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTBzcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkZGRiIgLz4KLQotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX2xhdW5jaCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RpdGxlQmFyQnV0dG9uLkxhdW5jaCIgLz4KLSAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgICAgICA8dmlldyBjbGFzcz0iY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUJ1dHRvbiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Nhc3QiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGl0bGVCYXJCdXR0b24iIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPC9SZWxhdGl2ZUxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jZW50ZXJfdmlldyIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9taW5pbWFsX2V4dHJhX3ZpZXciCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0Ij4KLQotICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZnVsbHNjcmVlbiIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiCi0gICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5GdWxsU2NyZWVuIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX3RodW1iX3NpemUiPgotCi0gICAgICAgIDxTZWVrQmFyCi0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Byb2dyZXNzIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX3RodW1iX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tY3YyX3NlZWtfYmFyX2Rlc2MiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjBkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bWF4SGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfbWF4X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX21heF9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDplbGV2YXRpb249IjEwZHAiLz4KLQotICAgICAgICA8VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wcm9ncmVzc19idWZmZXIiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9idWZmZXJfdmlld19oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JvdHRvbV9iYXJfYmFja2dyb3VuZCIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZWxldmF0aW9uPSIwZHAiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYm90dG9tX2JhciIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0NGRwIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ib3R0b21fYmFyX2JhY2tncm91bmQiPgotCi0gICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYm90dG9tX2Jhcl9sZWZ0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRTdGFydD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIj4KLQotICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZF9za2lwX3RpbWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI0ZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTJzcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGltZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL2JvdHRvbV9iYXJfbGVmdCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjEwZHAiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTBkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIiA+Ci0KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGltZV9jdXJyZW50IgotICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGltZVRleHQuQ3VycmVudCIvPgotICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aW1lX2ludGVycHVuY3QiCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaW1lVGV4dC5JbnRlcnB1bmN0Ii8+Ci0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpbWVfZW5kIgotICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGltZVRleHQuRW5kIi8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYm90dG9tX2Jhcl9yaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50RW5kPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodCI+Ci0KLSAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Jhc2ljX2NvbnRyb2xzIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgPgotCi0gICAgICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWRfcmVtYWluaW5nIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjEyc3AiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0KLSAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXRlIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5NdXRlIiAvPgotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N1YnRpdGxlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0Q2VudGVyIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLkNDIiAvPgotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Z1bGxzY3JlZW4iCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLkZ1bGxTY3JlZW4iLz4KLSAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdmVyZmxvd19yaWdodCIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uT3ZlcmZsb3dSaWdodCIvPgotICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2V4dHJhX2NvbnRyb2xzIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiPgotCi0gICAgICAgICAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2N1c3RvbV9idXR0b25zIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KLQotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3ZpZGVvX3F1YWxpdHkiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLlZpZGVvUXVhbGl0eSIgLz4KLSAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZXR0aW5ncyIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uU2V0dGluZ3MiIC8+Ci0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb3ZlcmZsb3dfbGVmdCIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uT3ZlcmZsb3dMZWZ0Ii8+Ci0gICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgPC9SZWxhdGl2ZUxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWluaW1hbF90cmFuc3BvcnRfY29udHJvbHMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWluaW1hbF90cmFuc3BvcnRfY29udHJvbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDBjODBiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21pbmltYWxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3BhdXNlIiBzdHlsZT0iQHN0eWxlL01pbmltYWxUcmFuc3BvcnRDb250cm9sc0J1dHRvbiIgLz4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfZGlhbG9nLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfZGlhbG9nLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4OWUxNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2RpYWxvZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+Ci0gICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2hvb3Nlcl90aXRsZSIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjI0ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMjRkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21yX2Nob29zZXJfdGl0bGUiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKLSAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlRpdGxlIiAvPgotICAgIDxMaXN0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfbGlzdCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpkaXZpZGVyPSJAYW5kcm9pZDpjb2xvci90cmFuc3BhcmVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpkaXZpZGVySGVpZ2h0PSIwZHAiIC8+Ci0gICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9lbXB0eSIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI0MGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI5MGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxNmRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTZkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIj4KLSAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tcl9jaG9vc2VyX3NlYXJjaGluZyIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5TZWNvbmRhcnlUZXh0IiAvPgotICAgICAgICA8UHJvZ3Jlc3NCYXIgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE1MGRwIgotICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmluZGV0ZXJtaW5hdGU9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9wcm9ncmVzc0JhclN0eWxlSG9yaXpvbnRhbCIgLz4KLSAgICA8L0xpbmVhckxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9saXN0X2l0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTg4NzliLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfbGlzdF9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI1NmRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiID4KLQotICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jaG9vc2VyX3JvdXRlX2ljb24iCi0gICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjRkcCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIyNGRwIiAvPgotCi0gICAgPExpbmVhckxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMWRwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiID4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jaG9vc2VyX3JvdXRlX25hbWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjMyZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5QcmltYXJ5VGV4dCIgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jaG9vc2VyX3JvdXRlX2Rlc2MiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI0ZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5TZWNvbmRhcnlUZXh0IiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2NvbnRyb2xsZXJfbWF0ZXJpYWxfZGlhbG9nX2IueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl9tYXRlcmlhbF9kaWFsb2dfYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMDQ0NzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl9tYXRlcmlhbF9kaWFsb2dfYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfZXhwYW5kYWJsZV9hcmVhIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbXJfZGlhbG9nX2FyZWEiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9jb2xvckJhY2tncm91bmRGbG9hdGluZyI+Ci0gICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl90aXRsZV9iYXIiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiID4KLSAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX25hbWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjcyZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5UaXRsZSIgLz4KLSAgICAgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL21yX2Nsb3NlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI0OGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDhkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iP2F0dHIvbWVkaWFSb3V0ZUNsb3NlRHJhd2FibGUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3NlbGVjdGFibGVJdGVtQmFja2dyb3VuZEJvcmRlcmxlc3MiIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9jdXN0b21fY29udHJvbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgotICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9kZWZhdWx0X2NvbnRyb2wiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+Ci0gICAgICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfYXJ0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmFkanVzdFZpZXdCb3VuZHM9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdFhZIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9jb2xvclByaW1hcnkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0idG9wIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLSAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNwbGl0TW90aW9uRXZlbnRzPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX21lZGlhX21haW5fY29udHJvbCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMTZkcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIxNmRwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9Ij9hdHRyL21lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiPgotICAgICAgICAgICAgICAgICAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfcGxheWJhY2tfY29udHJvbCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkcCIgPgotICAgICAgICAgICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF9wbGF5YmFja19jdHJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTJkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfcGxheSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvc2VsZWN0YWJsZUl0ZW1CYWNrZ3JvdW5kQm9yZGVybGVzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF90aXRsZV9jb250YWluZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL21yX2NvbnRyb2xfcGxheWJhY2tfY3RybCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2NvbnRyb2xfdGl0bGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuUHJpbWFyeVRleHQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jb250cm9sX3N1YnRpdGxlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICAgICAgICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgotICAgICAgICAgICAgICAgICAgICA8VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2NvbnRyb2xfZGl2aWRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iOGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgotICAgICAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9jb250cm9sIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iNDhkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMmRwIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzcGxpdE1vdGlvbkV2ZW50cz0iZmFsc2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iP2F0dHIvbWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iY2VudGVyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNpbmNlIGRpYWxvZydzIHRvcCBsYXlvdXQgbXJfZXhwYW5kYWJsZV9hcmVhIGlzIGNsaWNrYWJsZSwgaXQgcHJvcGFnYXRlcyBwcmVzc2VkIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGl0cyBub24tY2xpY2thYmxlIGNoaWxkcmVuLiBTcGVjaWZ5IGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIiB0byBwcmV2ZW50IHZvbHVtZSBzbGlkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBoYXZpbmcgZmFsc2UgcHJlc3NlZCBzdGF0ZS4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX3NsaWRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4SGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tcl9ncm91cF9leHBhbmRfY29sbGFwc2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMTJkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvc2VsZWN0YWJsZUl0ZW1CYWNrZ3JvdW5kQm9yZGVybGVzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgICAgICAgICAgPGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk92ZXJsYXlMaXN0VmlldwotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9ncm91cF9saXN0IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X3BhZGRpbmdfdG9wIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjcm9sbGJhclN0eWxlPSJvdXRzaWRlT3ZlcmxheSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlwVG9QYWRkaW5nPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNwbGl0TW90aW9uRXZlbnRzPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iP2F0dHIvbWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSIgLz4KLSAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICA8L0ZyYW1lTGF5b3V0PgotICAgICAgICA8U2Nyb2xsVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9idXR0b25QYW5lbCIKLSAgICAgICAgICAgIHN0eWxlPSI/YXR0ci9idXR0b25CYXJTdHlsZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZmlsbFZpZXdwb3J0PSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpzY3JvbGxJbmRpY2F0b3JzPSJ0b3B8Ym90dG9tIj4KLSAgICAgICAgICAgIDxhbmRyb2lkLnN1cHBvcnQudjcud2lkZ2V0LkJ1dHRvbkJhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b20iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249ImxvY2FsZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iNGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjEyZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEyZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI0ZHAiPgotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvYnV0dG9uMyIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyTmV1dHJhbEJ1dHRvblN0eWxlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgotICAgICAgICAgICAgICAgIDxhbmRyb2lkLnN1cHBvcnQudjQud2lkZ2V0LlNwYWNlCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3BhY2VyIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImludmlzaWJsZSIvPgotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvYnV0dG9uMiIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyTmVnYXRpdmVCdXR0b25TdHlsZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KLSAgICAgICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2J1dHRvbjEiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2J1dHRvbkJhclBvc2l0aXZlQnV0dG9uU3R5bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+Ci0gICAgICAgICAgICA8L2FuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuQnV0dG9uQmFyTGF5b3V0PgotICAgICAgICA8L1Njcm9sbFZpZXc+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci08L0ZyYW1lTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl92b2x1bWVfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX3ZvbHVtZV9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg5MDU4Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX3ZvbHVtZV9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgotICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC92b2x1bWVfaXRlbV9jb250YWluZXIiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faGVpZ2h0IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI2MGRwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI4ZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgPgotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9uYW1lIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiIC8+Ci0gICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiPgotICAgICAgICAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9pdGVtX2ljb24iCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRwIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0Q2VudGVyIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iP2F0dHIvbWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSIgLz4KLSAgICAgICAgICAgIDxhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVWb2x1bWVTbGlkZXIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9zbGlkZXIiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDBkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iNDBkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm1heEhlaWdodD0iNDBkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgIDwvTGluZWFyTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9zZXR0aW5nc19saXN0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3NldHRpbmdzX2xpc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTMwNTM4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3NldHRpbmdzX2xpc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGlzdFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc193aWR0aCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICBhbmRyb2lkOmRpdmlkZXI9IkBudWxsIgotICAgIGFuZHJvaWQ6ZGl2aWRlckhlaWdodD0iMGRwIj4KLTwvTGlzdFZpZXc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvdGl0bGVfYmFyX2dyYWRpZW50LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3RpdGxlX2Jhcl9ncmFkaWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMWZjNmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvdGl0bGVfYmFyX2dyYWRpZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiPgotICAgIDxncmFkaWVudAotICAgICAgICBhbmRyb2lkOnN0YXJ0Q29sb3I9IkBjb2xvci90aXRsZV9iYXJfZ3JhZGllbnRfc3RhcnQiCi0gICAgICAgIGFuZHJvaWQ6ZW5kQ29sb3I9IkBjb2xvci90aXRsZV9iYXJfZ3JhZGllbnRfZW5kIgotICAgICAgICBhbmRyb2lkOmFuZ2xlPSItMjcwIiAvPgotPC9zaGFwZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hZi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzIzMGFkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN0ZWxzZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVG9lc3RlbGxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1rbm9wcGllIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVWl0c2FhaS1rbm9wcGllLiBPbnRrb3BwZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlVpdHNhYWkta25vcHBpZS4gS29wcGVsIHRhbnMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iVWl0c2FhaS1rbm9wcGllLiBHZWtvcHBlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTYWFpIHVpdCBuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlZpbmQgdGFucyB0b2VzdGVsbGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iT250a29wcGVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSG91IG9wIHVpdHNhYWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ik1hYWsgdG9lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iU3BlZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkxhYXQgd2FnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlZvdSB1aXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlZvdSBpbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVta3Vuc3dlcmsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lZ2x5ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkdlZW4gbWVkaWEgaXMgZ2VraWVzIG5pZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iR2VlbiBpbmxpZ3RpbmcgYmVza2lrYmFhciBuaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNhYWkgdGFucyBza2VybSB1aXQiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFtL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YTE5MDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Yi14Yit4YuT4Ym1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuGImOGIo+GIquGLq+GLjuGJvSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuGLqENhc3Qg4Yqg4Yud4Yir4YitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdCDhiqDhi53hiKvhiK3hjaIg4YyN4YqV4YqZ4YqQ4Ym1IOGJsOGJi+GIreGMp+GIjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCDhiqDhi53hiKvhiK0g4Ymg4Yib4YyI4YqT4YqY4Ym1IOGIi+GLrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IOGKoOGLneGIq+GIreGNoiDhibDhjIjhipPhip3hibfhiI0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCDhiqDhi7XhiK3hjI0g4YuI4YuwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4YiY4Yij4Yiq4Yur4YuO4Ym94YqVIOGJoOGIm+GMjeGKmOGJtSDhiIvhi60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4YyN4YqV4YqZ4YqQ4Ym1IOGKoOGJi+GIreGMpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkNhc3Qg4Yib4Yu14Yio4YyNIOGKoOGJgeGInSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Yud4YyLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Yqg4Yyr4YuN4Ym1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLhiIjhiqDhjY3hibMg4Yqg4YmB4YidIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Yqg4YmB4YidIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4Yqg4Yi14Y2LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLhiLDhiaXhiLXhiaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLhi6jhiqDhiI3hiaDhiJ0g4Yi14YqQLeGMpeGJoOGJpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLhibDhipXhiLjhiKvhibPhib0g4Yuo4Yu14Yid4Y2FIOGImOGJhuGMo+GMoOGIquGLqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4Yid4YqV4YidIOGIm+GIheGLsOGIqOGImOGIqOGMgyDhiqDhiI3hibDhiJjhiKjhjKDhiJ0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuGIneGKleGInSDhiJjhiKjhjIMg4Yqg4Yut4YyI4Yqd4YidIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLhiJvhi6sg4YyI4Yy94YqVIOGJoOGImOGLjeGIsOGLtSDhiIvhi60iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZmI5N2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i2KfZhNmG2LjYp9mFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Itin2YTYo9is2YfYstipIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i2LLYsSDYp9mE2KXYsdiz2KfZhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Itiy2LEg2KfZhNil2LHYs9in2YQuINiq2YUg2YLYt9i5INin2YTYp9iq2LXYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLYstixINin2YTYpdix2LPYp9mELiDYrNin2LHZjSDYp9mE2KfYqti12KfZhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLYstixINin2YTYpdix2LPYp9mELiDYqtmFINin2YTYp9iq2LXYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Itil2LHYs9in2YQg2KXZhNmJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i2KzYp9ix2Y0g2KfZhNio2K3YqyDYudmGINij2KzZh9iy2KkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i2YLYt9i5INin2YTYp9iq2LXYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i2KXZitmC2KfZgSDYp9mE2KXYsdiz2KfZhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i2KXYutmE2KfZgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Itiq2LTYutmK2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Itil2YrZgtin2YEg2YXYpNmC2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLYpdmK2YLYp9mBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i2KrZiNiz2YrYuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i2KrYtdi62YrYsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Iti12YjYsdipINin2YTYo9mE2KjZiNmFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Iti02LHZiti3INiq2YXYsdmK2LEg2YXYs9iq2YjZiSDYp9mE2LXZiNiqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLZhNmFINmK2KrZhSDYp9iu2KrZitin2LEg2KPZiiDZiNiz2KfYpti3Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLZhNinINiq2KrZiNmB2LEg2KPZiiDZhdi52YTZiNmF2KfYqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i2KzYp9ix2Y0g2KXYsdiz2KfZhCDYp9mE2LTYp9i02KkiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWF6L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXovc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYzYwYWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXovc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkNpaGF6bGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iWWF5xLFtIGTDvHltyZlzaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IllhecSxbSBkw7x5bcmZc2kuIEJhxJ9sYW50xLEga8mZc2lsZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IllhecSxbSBkw7x5bcmZc2kuIFFvxZ91bHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IllhecSxbSBkw7x5bcmZc2kuIFFvxZ91bGR1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkJ1cmEgeWF5xLFtbGF5xLFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQ2loYXpsYXIgYXh0YXLEsWzEsXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQmHEn2xhbnTEsW7EsSBryZlzaW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJZYXnEsW3EsSBkYXlhbmTEsXLEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlFhcGFkxLFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iT3luYWTEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkR1cmR1cnVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iRGF5YW5kxLFyxLFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iR2VuacWfbMmZbmRpcmluIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJZxLHEn2NhbWxhxZ9kxLFyxLFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxib20gaW5jyZlzyZluyZl0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTyZlzIGjJmXJtaSBkaXlpcmPJmXlpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJIZcOnIGJpciBtZWRpYSBzZcOnaWxtyZl5aWIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IsaPbMOnYXRhbiBtyZlsdW1hdCB5b3hkdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVrcmFuIHlhecSxbWxhbsSxciI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYitzcitMYXRuL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYitzcitMYXRuL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjViZDZlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWIrc3IrTGF0bi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVXJlxJFhamkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJEdWdtZSBQcmViYWNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iRHVnbWUgUHJlYmFjaS4gVmV6YSBqZSBwcmVraW51dGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkR1Z21lIFByZWJhY2kuIFBvdmV6dWplIHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkR1Z21lIFByZWJhY2kuIFBvdmV6YW4gamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUHJlYmFjdWogbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJQcm9uYWxhxb5lbmplIHVyZcSRYWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlByZWtpbmkgdmV6dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlphdXN0YXZpIHByZWJhY2l2YW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmF0dm9yaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlB1c3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXV6aXJhaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlphdXN0YXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUHJvxaFpcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNrdXBpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iT21vdCBhbGJ1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iS2xpemHEjSB6YSBqYcSNaW51IHp2dWthIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZW1hIGl6YWJyYW5paCBtZWRpamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5pc3UgZG9zdHVwbmUgbmlrYWt2ZSBpbmZvcm1hY2lqZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUHJlYmFjdWplIHNlIGVrcmFuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iZS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJlL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzM5MWMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJlL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0ZbRgdGC0Y3QvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCf0YDRi9C70LDQtNGLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRi9GWIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRi9GWLiDQkNC00LrQu9GO0YfQsNC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0YvRli4g0IbQtNC30LUg0L/QsNC00LrQu9GO0YfRjdC90L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGL0ZYuINCf0LDQtNC60LvRjtGH0LDQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCi0YDQsNC90YHQu9GW0YDQsNCy0LDRhtGMINC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQn9C+0YjRg9C6INC/0YDRi9C70LDQtCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQkNC00LvRg9GH0YvRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0KHQv9GL0L3RltGG0Ywg0YLRgNCw0L3RgdC70Y/RhtGL0Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCX0LDQutGA0YvRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0J/RgNCw0LnQs9GA0LDRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQn9GA0YvQv9GL0L3RltGG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQodC/0YvQvdGW0YbRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCg0LDQt9Cz0LDRgNC90YPRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQl9Cz0LDRgNC90YPRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0JLQvtC60LvQsNC00LrQsCDQsNC70YzQsdC+0LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQn9Cw0Z7Qt9GD0L3QvtC6INCz0YPRh9C90LDRgdGG0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCc0LXQtNGL0Y/RhNCw0LnQuyDQvdC1INCy0YvQsdGA0LDQvdGLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQhtC90YTQsNGA0LzQsNGG0YvRjyDQsNC00YHRg9GC0L3RltGH0LDQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0K3QutGA0LDQvSDRgtGA0LDQvdGB0LvRj9GG0YvRliI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmcvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3MTJkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQo9GB0YLRgNC+0LnRgdGC0LLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQkdGD0YLQvtC9INC30LAg0L/RgNC10LTQsNCy0LDQvdC1LiDQktGA0YrQt9C60LDRgtCwINC1INC/0YDQtdC60YDQsNGC0LXQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQkdGD0YLQvtC9INC30LAg0L/RgNC10LTQsNCy0LDQvdC1LiDQodCy0YrRgNC30LLQsCDRgdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUuINCj0YHRgtCw0L3QvtCy0LXQvdCwINC1INCy0YDRitC30LrQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQn9GA0LXQtNCw0LLQsNC90LUg0LrRitC8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0KLRitGA0YHRj9GCINGB0LUg0YPRgdGC0YDQvtC50YHRgtCy0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0J/RgNC10LrRgNCw0YLRj9Cy0LDQvdC1INC90LAg0LLRgNGK0LfQutCw0YLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCh0L/QuNGA0LDQvdC1INC90LAg0L/RgNC10LTQsNCy0LDQvdC10YLQviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNGC0LLQsNGA0Y/QvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0J/Rg9GB0LrQsNC90LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0L7RgdGC0LDQstGP0L3QtSDQvdCwINC/0LDRg9C30LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQodC/0LjRgNCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCg0LDQt9Cz0YrQstCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KHQstC40LLQsNC90LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQntCx0LvQvtC20LrQsCDQvdCwINCw0LvQsdGD0LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQn9C70YrQt9Cz0LDRhyDQt9CwINGB0LjQu9Cw0YLQsCDQvdCwINC30LLRg9C60LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCd0Y/QvNCwINC40LfQsdGA0LDQvdCwINC80YPQu9GC0LjQvNC10LTQuNGPIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndGP0LzQsCDQvdCw0LvQuNGH0L3QsCDQuNC90YTQvtGA0LzQsNGG0LjRjyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0JXQutGA0LDQvdGK0YIg0YHQtSDQv9GA0LXQtNCw0LLQsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYm4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ibi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJmNTkzMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ibi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgprjgpr/gprjgp43gpp/gp4fgpq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4Kah4Ka/4Kat4Ka+4KaH4Ka44KaX4KeB4Kay4Ka/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmvuCmsCDgpqzgp4vgpqTgpr7gpq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmruCntyDgprjgpoLgpq/gp4vgppcg4Kas4Ka/4Kaa4KeN4Kab4Ka/4Kao4KeN4KaoIOCmueCmr+CmvOCnh+Cmm+CnhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmvuCmsCDgpqzgp4vgpqTgpr7gpq7gp7cg4Ka44KaC4Kav4KeL4KaXIOCmleCmsOCmviDgprngpprgp43gppvgp4ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmvuCmsCDgpqzgp4vgpqTgpr7gpq7gp7cg4Ka44KaC4Kav4KeB4KaV4KeN4KakIOCmueCmr+CmvOCnh+Cmm+CnhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgpo/gpqTgp4cg4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCngeCmqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCmoeCmv+CmreCmvuCmh+CmuOCml+CngeCmsuCmv+CmleCnhyDgppbgp4vgpoHgppzgpr4g4Ka54Kaa4KeN4Kab4KeHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCmuOCmguCmr+Cni+CmlyDgpqzgpr/gpprgp43gppvgpr/gpqjgp43gpqgg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmviDgpqzgpqjgp43gpqcg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgpqzgpqjgp43gpqcg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Kaa4Ka+4Kay4Ka+4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgpqzgpr/gprDgpr7gpq4g4Kam4Ka/4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Kal4Ka+4Kau4Ka+4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4Kas4Kah4Ka8IOCmleCmsOCngeCmqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Ka44KaZ4KeN4KaV4KeB4Kaa4Ka/4KakIOCmleCmsOCngeCmqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCmheCnjeCmr+CmvuCmsuCmrOCmvuCmriDgprbgp4jgprLgpr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4Kat4Kay4Ka/4KaJ4KauIOCmuOCnjeCmsuCmvuCmh+CmoeCmvuCmsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4KaV4KeL4Kao4KeLIOCmruCmv+CmoeCmv+Cmr+CmvOCmviDgpqjgpr/gprDgp43gpqzgpr7gpprgpqgg4KaV4Kaw4Ka+IOCmueCmr+CmvOCmqOCmvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KaV4KeL4Kao4KeLIOCmpOCmpeCnjeCmryDgpongpqrgprLgpqzgp43gpqcg4Kao4KeH4KaHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgprjgp43gppXgp43gprDgp4Dgpqgg4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmviDgprngpprgp43gppvgp4ciPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYnMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMWM3NDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYnMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlVyZcSRYWppIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iRHVnbWUgemEgZW1pdGlyYW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkR1Z21lIHphIGVtaXRpcmFuamUuIFZlemEgamUgcHJla2ludXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJEdWdtZSB6YSBlbWl0aXJhbmplLiBQb3Zleml2YW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJEdWdtZSB6YSBlbWl0aXJhbmplLiBQb3ZlemFubyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWl0aXJhbmplIG5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iVHJhxb5lbmplIHVyZcSRYWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlByZWtpbmkgdmV6dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlphdXN0YXZpIHByZWJhY2l2YW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmF0dm9yaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjaXJhaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1emlyYWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXVzdGF2aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlByb8WhaXJpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTa3VwaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik9tb3QgYWxidW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IktsaXphxI0gemEgamHEjWludSB6dnVrYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmlqZWRhbiBtZWRpaiBuaWplIG9kYWJyYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lbWEgZG9zdHVwbmloIGluZm9ybWFjaWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQcmViYWN1amUgc2UgZWtyYW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWNhL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY2Evc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmODVhY2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY2Evc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl1cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOzIGRcJ2VtZXRyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOzIEVtZXQuIERlc2Nvbm5lY3RhdC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOzIEVtZXQuIFNcJ2VzdMOgIGNvbm5lY3RhbnQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOzIEVtZXQuIENvbm5lY3RhdC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRW1ldCBhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iU1wnZXN0YW4gY2VyY2FudCBkaXNwb3NpdGl1cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25uZWN0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkF0dXJhIGxcJ2VtaXNzacOzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJUYW5jYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVlaXgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBvc2EgZW4gcGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBdHVyYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkRlc3BsZWdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZXBsZWdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hdGdlIGRlIGxcJ8OgbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sIGxsaXNjYW50IGRlIHZvbHVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBzXCdoYSBzZWxlY2Npb25hdCBjYXAgZml0eGVyIG11bHRpbcOoZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBoaSBoYSBpbmZvcm1hY2nDsyBkaXNwb25pYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFbWlzc2nDsyBkZSBwYW50YWxsYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlhODkyMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0w6ltIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlphxZnDrXplbsOtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iVGxhxI3DrXRrbyBvZGVzw61sw6Fuw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJUbGHEjcOtdGtvIG9kZXPDrWzDoW7DrS4gT2Rwb2plbm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlRsYcSNw610a28gb2Rlc8OtbMOhbsOtLiBQxZlpcG9qb3bDoW7DrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJUbGHEjcOtdGtvIG9kZXPDrWzDoW7DrS4gUMWZaXBvamVubyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJPZGVzw61sYXQgZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJIbGVkw6Fuw60gemHFmcOtemVuw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iT2Rwb2ppdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ilphc3Rhdml0IG9kZXPDrWzDoW7DrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmF2xZnDrXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQxZllaHLDoXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBvemFzdGF2aXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXN0YXZpdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlJvemJhbGl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTYmFsaXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPYmFsIGFsYmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iUG9zdXZuw61rIGhsYXNpdG9zdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lYnlsYSB2eWJyw6FuYSDFvsOhZG7DoSBtw6lkaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lanNvdSBrwqBkaXNwb3ppY2kgxb7DoWRuw6kgaW5mb3JtYWNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJPZGVzw61sw6Fuw60gb2JzYWh1IG9icmF6b3ZreSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3YTc5MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRW5oZWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3Qta25hcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qta25hcC4gRm9yYmluZGVsc2VuIGVyIGFmYnJ1ZHQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3Qta25hcC4gT3ByZXR0ZXIgZm9yYmluZGVsc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdC1rbmFwLiBUaWxzbHV0dGV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdGlsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRmluZGVyIGVuaGVkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQWZicnlkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBtZWQgYXQgY2FzdGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ikx1ayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkFmc3BpbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iU8OmdCBww6UgcGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVWR2aWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNranVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1ncmFmaWsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iTHlkc3R5cmtlc2t5ZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJJbmdlbiBtZWRpZXIgZXIgbWFya2VyZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkRlciBlciBpbmdlbiB0aWxnw6ZuZ2VsaWdlIG9wbHlzbmluZ2VyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTa8Omcm1lbiBjYXN0ZXMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YmY1N2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkdlcsOkdGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LVN5bWJvbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlN0cmVhbWluZy1TY2hhbHRmbMOkY2hlLiBOaWNodCB2ZXJidW5kZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlN0cmVhbWluZy1TY2hhbHRmbMOkY2hlLiBWZXJiaW5kdW5nIHdpcmQgaGVyZ2VzdGVsbHQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iU3RyZWFtaW5nLVNjaGFsdGZsw6RjaGUuIFZlcmJ1bmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTdHJlYW1lbiBhdWYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJHZXLDpHRlIHdlcmRlbiBnZXN1Y2h0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJWZXJiaW5kdW5nIHRyZW5uZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdHJlYW1pbmcgYmVlbmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iU2NobGllw59lbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IldpZWRlcmdlYmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzaWVyZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJCZWVuZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTWF4aW1pZXJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iTWluaW1pZXJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtY292ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU2NoaWViZXJlZ2xlciBmw7xyIGRpZSBMYXV0c3TDpHJrZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iS2VpbmUgTWVkaWVuIGF1c2dld8OkaGx0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJLZWluZSBJbmZvcm1hdGlvbmVuIHZlcmbDvGdiYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkJpbGRzY2hpcm0gd2lyZCBnZXN0cmVhbXQuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODJmNjliLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Is6jz43Pg8+EzrfOvM6xIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Is6jz4XPg866zrXPhc6tz4IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLOms6/z4XOvM+Azq8gQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Is6azr/Phc68z4DOryDOvM61z4TOrM60zr/Pg863z4IuIM6Rz4DOv8+Dz4XOvc60zq3OuM63zrrOtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4izprOv8+FzrzPgM6vIM68zrXPhM6szrTOv8+DzrcuIM6jz43Ovc60zrXPg863IM+DzrUgzrXOvs6tzrvOuc6+zrciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4izprOv8+FzrzPgM6vIM68zrXPhM6szrTOv8+DzrfPgi4gzqPPhc69zrTOrc64zrfOus61Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Is6czrXPhM6szrTOv8+Dzrcgz4POtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Is6Vz43Pgc61z4POtyDPg8+Fz4POus61z4XPjs69Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Is6Rz4DOv8+Dz43Ovc60zrXPg863Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4izpTOuc6xzrrOv8+Azq4gzrzOtc+EzqzOtM6/z4POt8+CIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLOms67zrXOr8+DzrnOvM6/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4izpHOvc6xz4DOsc+BzrHOs8+JzrPOriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4izqDOsc+Nz4POtyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Is6UzrnOsc66zr/PgM6uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4izpHOvc6sz4DPhM+Fzr7OtyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4izqPPjc68z4DPhM+Fzr7OtyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Is6Vzr7Pjs+Gz4XOu867zr8gzqzOu868z4DOv8+FzrwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4izqHPhc64zrzOuc+Dz4TOuc66z4wgzq3Ovc+EzrHPg863z4Igzq7Ph86/z4UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Is6UzrXOvSDOrc+Hzr/Phc69IM61z4DOuc67zrXOs861zq8gzrzOrc+DzrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Is6UzrXOvSDPhc+AzqzPgc+Hzr/Phc69IM60zrnOsc64zq3Pg865zrzOtc+CIM+AzrvOt8+Bzr/Phs6/z4HOr861z4IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Is6czrXPhM6szrTOv8+Dzrcgzr/OuM+Mzr3Ot8+CIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQVUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQVUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkM2YyMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckFVL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdCBidXR0b24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kaW5nIGRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGlzY29ubmVjdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3AgY2FzdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2xvc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQbGF5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbGxhcHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW0gYXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZSBzbGlkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIG1lZGlhIHNlbGVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBpbmZvIGF2YWlsYWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGluZyBzY3JlZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJDQS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJDQS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzZjIxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQ0Evc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IGJ1dHRvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3QgYnV0dG9uLiBDb25uZWN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkZpbmRpbmcgZGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEaXNjb25uZWN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBjYXN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDbG9zZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBsYXkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29sbGFwc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lIHNsaWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gbWVkaWEgc2VsZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGluZm8gYXZhaWxhYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJDYXN0aW5nIHNjcmVlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNmMjE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJHQi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QgYnV0dG9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRmluZGluZyBkZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRpc2Nvbm5lY3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wIGNhc3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNsb3NlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUGxheSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDb2xsYXBzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtIGFydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWUgc2xpZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBtZWRpYSBzZWxlY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm8gaW5mbyBhdmFpbGFibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkNhc3Rpbmcgc2NyZWVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1ySU4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1ySU4vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkM2YyMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tcklOL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdCBidXR0b24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kaW5nIGRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGlzY29ubmVjdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3AgY2FzdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2xvc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQbGF5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbGxhcHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW0gYXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZSBzbGlkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIG1lZGlhIHNlbGVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBpbmZvIGF2YWlsYWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGluZyBzY3JlZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJYQy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJYQy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg3MDA3ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yWEMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCOU3lzdGVt4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjkRldmljZXPigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI/igI/igI7igI/igI7igI/igI7igI7igI/igI/igI7igI/igI7igI7igI7igI/igI/igI/igI7igI/igI7igI7igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI/igI7igI7igI/igI/igI/igI/igI/igI7igI/igI/igI/igI/igI/igI7igI/igI7igI7igI7igI7igI/igI7igI7igI7igI/igI5DYXN0IGJ1dHRvbuKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAj+KAj+KAjuKAj+KAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWTigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjkNhc3QgYnV0dG9uLiBDb25uZWN0aW5n4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAjuKAjuKAj+KAj+KAj+KAjuKAj+KAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAj+KAjuKAj+KAjuKAj+KAjkNhc3QgYnV0dG9uLiBDb25uZWN0ZWTigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCOQ2FzdCB0b+KAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjkZpbmRpbmcgZGV2aWNlc+KAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI7igI/igI7igI7igI7igI7igI/igI7igI7igI7igI7igI7igI7igI/igI/igI/igI/igI7igI/igI/igI/igI7igI/igI7igI/igI7igI7igI7igI/igI7igI7igI7igI/igI7igI/igI/igI7igI7igI7igI/igI7igI/igI7igI7igI/igI/igI7igI7igI/igI7igI/igI7igI7igI7igI/igI/igI7igI7igI5EaXNjb25uZWN04oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCOU3RvcCBjYXN0aW5n4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI/igI/igI/igI7igI7igI7igI/igI/igI/igI7igI7igI/igI/igI/igI7igI/igI7igI/igI7igI/igI7igI/igI7igI/igI/igI/igI/igI7igI7igI7igI7igI7igI/igI/igI/igI/igI7igI/igI7igI/igI/igI/igI7igI7igI/igI7igI/igI/igI/igI7igI7igI5DbG9zZeKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjlBsYXnigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjlBhdXNl4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCOU3RvcOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAj+KAjkV4cGFuZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCOQ29sbGFwc2XigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI/igI7igI7igI/igI7igI7igI7igI/igI7igI7igI/igI/igI7igI7igI7igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI7igI/igI7igI7igI/igI7igI/igI7igI/igI/igI/igI/igI7igI/igI7igI/igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI7igI7igI7igI7igI/igI5BbGJ1bSBhcnTigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCOVm9sdW1lIHNsaWRlcuKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCOTm8gbWVkaWEgc2VsZWN0ZWTigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjk5vIGluZm8gYXZhaWxhYmxl4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI7igI7igI/igI/igI/igI7igI7igI/igI7igI7igI7igI7igI7igI7igI/igI/igI/igI/igI7igI7igI/igI7igI/igI/igI7igI/igI/igI/igI/igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI7igI/igI7igI/igI7igI/igI7igI/igI7igI/igI/igI7igI/igI/igI7igI7igI7igI7igI7igI/igI/igI5DYXN0aW5nIHNjcmVlbuKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDFlYWQxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3TDs24gcGFyYSB0cmFuc21pdGlyIChkZXNjb25lY3RhZG8pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDs24gcGFyYSB0cmFuc21pdGlyIChjb25lY3RhbmRvKSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDs24gcGFyYSB0cmFuc21pdGlyIChjb25lY3RhZG8pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYW5zbWl0aXIgYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkJ1c2NhbmRvIGRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25lY3RhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkRldGVuZXIgbGEgdHJhbnNtaXNpw7NuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDZXJyYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1Y2lyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEZXRlbmVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTW9zdHJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iT2N1bHRhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkltYWdlbiBkZWwgw6FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2wgZGVzbGl6YW50ZSBkZWwgdm9sdW1lbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gc2Ugc2VsZWNjaW9uw7MgbmluZ8O6biBjb250ZW5pZG8gbXVsdGltZWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iU2luIGluZm9ybWFjacOzbiBkaXNwb25pYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJUcmFuc21pdGllbmRvIHBhbnRhbGxhIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjQzMDA4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w7NuIGRlIGVudmlhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOzbiBkZSBlbnZpYXIuIERlc2NvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w7NuIGRlIGVudmlhci4gQ29uZWN0YW5kbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDs24gZGUgZW52aWFyLiBDb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRW52aWFyIGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJCdXNjYW5kbyBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzY29uZWN0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJEZXRlbmVyIGVudsOtbyBkZSBjb250ZW5pZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNlcnJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iRGV0ZW5lciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ik1vc3RyYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Ik9jdWx0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJQb3J0YWRhIGRlbCDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbCBkZXNsaXphbnRlIGRlIHZvbHVtZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIHNlIGhhIHNlbGVjY2lvbmFkbyBuaW5nw7puIG1lZGlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBoYXkgaW5mb3JtYWNpw7NuIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVudmlhbmRvIHBhbnRhbGxhIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ldC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV0L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTMyMzViLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV0L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlPDvHN0ZWVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlNlYWRtZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLDnGxla2FuZGVudXBwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iw5xsZWthbmRlbnVwcC4gw5xoZW5kdXMgb24ga2F0a2VzdGF0dWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IsOcbGVrYW5kZW51cHAuIMOcaGVuZGFtaW5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IsOcbGVrYW5kZW51cHAuIMOcaGVuZGF0dWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iw5xsZWthbmRtaW5lIHNlYWRtZXNzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlNlYWRtZXRlIG90c2ltaW5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkthdGtlc3RhIMO8aGVuZHVzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iUGVhdGEgw7xsZWthbmRtaW5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJTdWxnZW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJFc2l0YW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBlYXRhbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlBlYXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTGFpZW5kYW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkFoZW5kYW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWkga3VqdW5kdXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSGVsaXR1Z2V2dXNlIGxpdWd1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTWVlZGlhdCBwb2xlIHZhbGl0dWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IlRlYXZlIHB1dWR1YiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRWtyYWFuaWt1dmEgw7xsZWthbmRtaW5lIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ldS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV1L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmExOWU0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV1L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iR2FpbHVhayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Iklnb3JyaSBib3RvaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJJZ29ydHpla28gYm90b2lhLiBEZXNrb25la3RhdHV0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iSWdvcnR6ZWtvIGJvdG9pYS4gS29uZWt0YXR6ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iSWdvcnR6ZWtvIGJvdG9pYS4gS29uZWt0YXR1dGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iSWdvcnJpIGhvbmE6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iR2FpbHVhayBiaWxhdHplbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNrb25la3RhdHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJVdHppIGlnb3J0emVhcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ikl0eGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJFcnJlcHJvZHV6aXR1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYXR1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iR2VsZGl0dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlphYmFsZHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlRvbGVzdHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWFyZW4gYXphbGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQm9sdW1lbmFyZW4gZ3JhZHVhdHphaWxlYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iRXogZGEgaGF1dGF0dSBtdWx0aW1lZGlhLWVkdWtpcmlrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJFeiBkYWdvIGluZm9ybWF6aW9yaWsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlBhbnRhaWxhIGlnb3J0emVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzZjNzc5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Itiz24zYs9iq2YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i2K/Ys9iq2q/Yp9mH4oCM2YfYpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Itiv2qnZhdmHINin2LHYs9in2YQg2YXYrdiq2YjYpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Itiv2qnZhdmHINmB2LHYs9iq2KfYr9mGLiDYp9ix2KrYqNin2Lcg2YLYt9i5INi02K8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Itiv2qnZhdmHINmB2LHYs9iq2KfYr9mGLiDYr9ix2K3Yp9mEINmF2LHYqtio2LfigIzYs9in2LLbjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLYr9qp2YXZhyDZgdix2LPYqtin2K/Zhi4g2YXYsdiq2KjYtyDYtNivIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Itin2LHYs9in2YQg2YXYrdiq2YjYpyDYqNmHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i2b7bjNiv2Kcg2qnYsdiv2YYg2K/Ys9iq2q/Yp9mH4oCM2YfYpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLZgti32Lkg2KfYsdiq2KjYp9i3Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i2KrZiNmC2YEg2KfYsdiz2KfZhCDZhdit2KrZiNinIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLYqNiz2KrZhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Itm+2K7YtCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i2YXaqdirIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i2KrZiNmC2YEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLYqNiy2LHaryDaqdix2K/ZhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i2qnZiNqG2qkg2qnYsdiv2YYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLYudqp2LMg2LHZiNuMINis2YTYryDYotmE2KjZiNmFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItmE2LrYstmG2K/ZhyDZhduM2LLYp9mGINi12K/YpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i2LHYs9in2YbZhyDYp9mG2KrYrtin2Kgg2YbYtNiv2Ycg2KfYs9iqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLYp9i32YTYp9i52KfYqiDYr9ixINiv2LPYqtix2LMg2YbbjNiz2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Itiv2LHYrdin2YQg2YHYsdiz2KrYp9iv2YYg2LXZgdit2YciPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZpL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ODM0MzUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iSsOkcmplc3RlbG3DpCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJMYWl0dGVldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtcGFpbmlrZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QtcGFpbmlrZS4gWWh0ZXlzIGthdGthaXN0dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdC1wYWluaWtlLiBZaGRpc3RldMOkw6RuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QtcGFpbmlrZS4gWWhkaXN0ZXR0eSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTdW9yYXRvaXN0b24ga29oZGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJFdHNpdMOkw6RuIGxhaXR0ZWl0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJLYXRrYWlzZSB5aHRleXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJMb3BldGEgc3VvcmF0b2lzdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlN1bGplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iVG9pc3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJLZXNrZXl0w6QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJQeXPDpHl0w6QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJMYWFqZW5uYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVGlpdmlzdMOkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1pbiBrYW5zaWt1dmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iw4TDpG5lbnZvaW1ha2t1dWRlbiBsaXVrdXPDpMOkZGluIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJFaSB2YWxpdHR1YSBtZWRpYWEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJUaWV0b2phIGVpIG9sZSBzYWF0YXZpbGxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTdW9yYXRvaXN0ZXRhYW4gbsOkeXR0w7bDpCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnItckNBL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnItckNBL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGY5ODRiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyLXJDQS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0w6htZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJBcHBhcmVpbHMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3V0b24gRGlmZnVzZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3V0b24gRGlmZnVzZXIuIETDqWNvbm5lY3TDqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm91dG9uIERpZmZ1c2VyLiBDb25uZXhpb24gZW4gY291cnPigKYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm91dG9uIERpZmZ1c2VyLiBDb25uZWN0w6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRGlmZnVzZXIgc3VyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUmVjaGVyY2hlIGRcJ2FwcGFyZWlscyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJTZSBkw6ljb25uZWN0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJBcnLDqnRlciBsYSBkaWZmdXNpb24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlcm1lciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkxpcmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkludGVycm9tcHJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQXJyw6p0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJEw6l2ZWxvcHBlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUsOpZHVpcmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJJbWFnZSBkZSBsXCdhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDdXJzZXVyIGRlIHLDqWdsYWdlIGR1IHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iQXVjdW4gbcOpZGlhIHPDqWxlY3Rpb25uw6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkF1Y3VuZSBpbmZvcm1hdGlvbiBkaXNwb25pYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJEaWZmdXNpb24gZGUgbFwnw6ljcmFuIGVuIGNvdXJzIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmMzMTJmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqG1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkFwcGFyZWlscyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Ikljw7RuZSBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iSWPDtG5lIENhc3QuIETDqWNvbm5lY3TDqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iSWPDtG5lIENhc3QuIENvbm5leGlvbuKApiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJJY8O0bmUgQ2FzdC4gQ29ubmVjdMOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3RlciBzdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJSZWNoZXJjaGUgZFwnYXBwYXJlaWxz4oCmIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkTDqWNvbm5lY3RlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkFycsOqdGVyIGxhIGRpZmZ1c2lvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRmVybWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTGVjdHVyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBcnLDqnRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkTDqXZlbG9wcGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSw6lkdWlyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkltYWdlIGRlIGxcJ2FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkN1cnNldXIgZGUgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJBdWN1biBtw6lkaWEgc8OpbGVjdGlvbm7DqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iQXVjdW5lIGluZm9ybWF0aW9uIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkRpZmZ1c2lvbiBkZSBsXCfDqWNyYW4gZW4gY291cnPigKYiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWdsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ2wvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMmMzNTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ2wvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDs24gZGUgZW1pdGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w7NuIGRlIGVtaXRpci4gRGVzY29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDs24gZGUgZW1pdGlyLiBDb25lY3RhbmRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOzbiBkZSBlbWl0aXIuIENvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWl0aXIgYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkJ1c2NhbmRvIGRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25lY3RhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkRldGVyIGVtaXNpw7NuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJQZWNoYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1Y2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iRGV0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJBbXBsaWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDb250cmFlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlBvcnRhZGEgZG8gw6FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2wgZGVzcHJhemFibGUgZG8gdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOb24gc2Ugc2VsZWNjaW9uYXJvbiByZWN1cnNvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm9uIGhhaSBpbmZvcm1hY2nDs24gZGlzcG/DsWlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVtaXNpw7NuIGRlIHBhbnRhbGxhIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ndS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWd1L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2Q1ZjNmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWd1L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCquOCqv+CquOCrjeCqn+CqriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgqongqqrgqpXgqrDgqqPgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4KuLIOCqrOCqn+CqqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4sg4Kqs4Kqf4KqoLiDgqqHgqr/gqrjgq43gqpXgqqjgq4fgqpXgq43gqp8g4KqV4Kqw4KuN4Kqv4KuB4KqCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4KuLIOCqrOCqn+CqqC4g4KqV4Kqo4KuH4KqV4KuN4KqfIOCqpeCqiCDgqrDgqrngq43gqq/gq4HgqoIg4Kqb4KuHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4sg4Kqs4Kqf4KqoLiDgqpXgqqjgq4fgqpXgq43gqp8g4Kql4Kqv4KuB4KqCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCqhuCqqOCqviDgqqrgqrAg4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCqieCqquCqleCqsOCqo+CriyDgqrbgq4vgqqfgq4Ag4Kqw4Kq54KuN4Kqv4Kq+4KqCIOCqm+CrgOCqjyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgqqHgqr/gqrjgq43gqpXgqqjgq4fgqpXgq43gqp8g4KqV4Kqw4KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCqteCqvuCqqOCrgeCqgiDgqrDgq4vgqpXgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCqrOCqguCqpyDgqpXgqrDgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgqprgqrLgqr7gqrXgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCqpeCri+CqreCqvuCqteCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCqsOCri+CqleCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCqteCqv+CquOCrjeCqpOCrg+CqpCDgqpXgqrDgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCquOCqguCqleCrgeCqmuCqv+CqpCDgqpXgqrDgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgqobgqrLgq43gqqzgqq4g4KqV4Kqy4Kq+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCqteCrieCqsuCrjeCqr+CrgeCqriDgqrjgq43gqrLgqr7gqofgqqHgqrAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCqleCri+CqiCDgqq7gq4DgqqHgqr/gqq/gqr4g4Kqq4Kq44KqC4KqmIOCqleCqsOCrh+CqsiDgqqjgqqXgq4AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCqleCri+CqiCDgqq7gqr7gqrngqr/gqqTgq4Ag4KqJ4Kqq4Kqy4Kqs4KuN4KqnIOCqqOCqpeCrgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4Kq44KuN4KqV4KuN4Kqw4KuA4Kqo4Kqo4KuHIOCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4Ag4Kqw4Kq54KuN4Kqv4Kq+4KqCIOCqm+CrhyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaGkvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oaS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU1MmE1OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oaS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgpLjgpL/gpLjgpY3gpJ/gpK4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4KSh4KS/4KS14KS+4KSH4KS4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOClh+CkgiDgpKzgpJ/gpKgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KWH4KSCIOCkrOCkn+CkqC4g4KSh4KS/4KS44KSV4KSo4KWH4KSV4KWN4KSfIOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOClh+CkgiDgpKzgpJ/gpKguIOCkleCkqOClh+CkleCljeCknyDgpLngpYsg4KSw4KS54KS+IOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KWH4KSCIOCkrOCkn+CkqC4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgpIfgpLgg4KSq4KSwIOCkleCkvuCkuOCljeKAjeCknyDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgpKHgpL/gpLXgpL7gpIfgpLgg4KSi4KWC4KSC4KSiIOCksOCkueCkviDgpLngpYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4KSh4KS/4KS44KSV4KSo4KWH4KSV4KWN4KSfIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCkleCkvuCkuOCljeCknyDgpJXgpLDgpKjgpL4g4KSs4KSC4KSmIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4KSs4KSC4KSmIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCkmuCksuCkvuCkj+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4KSw4KWL4KSV4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4KSs4KSC4KSmIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCkteCkv+CkuOCljeCkpOCkvuCksCDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCkm+Cli+Ckn+CkviDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgpI/gpLLgpY3gpKzgpK4g4KSG4KSw4KWN4KSfIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCkteClieCksuCljeCkr+ClguCkriDgpLjgpY3gpLLgpL7gpIfgpKHgpLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCkleCli+CkiCDgpK7gpYDgpKHgpL/gpK/gpL4g4KSa4KSv4KSo4KS/4KSkIOCkqOCkueClgOCkgiDgpLngpYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCkleCli+CkiCDgpJzgpL7gpKjgpJXgpL7gpLDgpYAg4KSu4KWM4KSc4KWC4KSmIOCkqOCkueClgOCkgiDgpLngpYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCkuOCljeCkleCljeCksOClgOCkqCDgpJXgpL7gpLjgpY3gpJ8g4KS54KWLIOCksOCkueClgCDgpLngpYgiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNDNlZTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3VzdGF2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlVyZcSRYWppIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iR3VtYiB6YSBlbWl0aXJhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iR3VtYiB6YSBlbWl0aXJhbmplLiBWZXphIHByZWtpbnV0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iR3VtYiB6YSBlbWl0aXJhbmplLiBQb3Zleml2YW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJHdW1iIHphIGVtaXRpcmFuamUuIFBvdmV6YW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRW1pdGlyYW5qZSBuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlRyYcW+ZW5qZSB1cmXEkWFqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQcmVraW5pIHZlenUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJaYXVzdGF2aSBlbWl0aXJhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXR2YXJhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWtjaWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXV6aXJhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmF1c3RhdmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQcm/FoWlyaXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTYcW+aW1hbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iTmFzbG92bmljYSBhbGJ1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iS2xpemHEjSB6YSBnbGFzbm/Eh3UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pamUgb2RhYnJhbiBuaWplZGFuIG1lZGlqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJJbmZvcm1hY2lqZSBuaXN1IGRvc3R1cG5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFbWl0aXJhbmplIHphc2xvbmEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNmJkZmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iUmVuZHN6ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRXN6a8O2esO2ayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IsOBdGvDvGxkw6lzIGdvbWIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLDgXRrw7xsZMOpcyBnb21iLiBLYXBjc29sYXQgYm9udHZhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLDgXRrw7xsZMOpcyBnb21iLiBDc2F0bGFrb3rDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iw4F0a8O8bGTDqXMgZ29tYi4gQ3NhdGxha296dGF0dmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iw4F0a8O8bGTDqXMgaWRlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRXN6a8O2esO2ayBrZXJlc8Opc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iTGV2w6FsYXN6dMOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IsOBdGvDvGxkw6lzIGxlw6FsbMOtdMOhc2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkJlesOhcsOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkxlasOhdHN6w6FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJTesO8bmV0ZWx0ZXTDqXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJMZcOhbGzDrXTDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJLaWJvbnTDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IsOWc3N6ZWNzdWvDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJMZW1lemJvcsOtdMOzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkhhbmdlcsWRc3phYsOhbHl6w7MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pbmNzIG3DqWRpYSBraXbDoWxhc3p0dmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5pbmNzIGluZm9ybcOhY2nDsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iS8OpcGVybnnFkXRhcnRhbG9tIMOhdGvDvGxkw6lzZSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHkvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oeS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVjODJiNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oeS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLVgNWh1bTVodWv1aHWgNWjIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItWN1aHWgNaE1aXWgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItWA1aXVvNWh1oDVsdWh1a/VtNWh1bYg1a/VuNWz1aHVryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItWA1aXVvNWh1oDVsdWh1a/VtNWh1bYg1a/VuNWz1aHVrzog1Y3VodaA1oTVtiDVodW21bvVodW/1b7VodWuINWnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLVgNWl1bzVodaA1bHVodWv1bTVodW2INWv1bjVs9Wh1a86INWN1aHWgNaE1agg1a/VodW61aHVr9aB1b7VuNaC1bQg1aciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i1YDVpdW81aHWgNWx1aHVr9W01aHVtiDVr9W41bPVodWvOiDVjdWh1oDWhNWoINWv1aHVutWh1a/WgdW+1aHVriDVpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLUuNW21b/WgNWl1oQg1b3VodaA1oTVqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItWN1aHWgNaE1aXWgNWrINW41oDVuNW21bjWgtW0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItSx1bbVu9Wh1b/VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i1LTVodWk1aHWgNWl1oHVttWl1awg1bDVpdW81aHWgNWx1aHVr9W41oLVtNWoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLVk9Wh1a/VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i1YbVvtWh1aPVodaA1a/VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLUtNWh1aTVodaAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i1LTVodWk1aHWgNWl1oHVttWl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLUuNW21aTVodaA1bHVodWv1aXVrCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i1L/VuNWu1a/VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i1LHVrNWi1bjVtNWrINW31aHVutWr1a8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i1YHVodW11bbVqyDVuNaC1arVo9W21bjWgtWp1bXVodW2INWv1aHWgNWj1aHVvtW41oDVq9W5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLVhNWl1aTVq9WhINaG1aHVtdWs1aXWgCDVudWl1bYg1ajVttW/1oDVvtWl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItWP1aXVstWl1a/VuNaC1anVtdW41oLVttW21aXWgNWoINWw1aHVvdWh1bbVpdWs1asg1bnVpdW2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLUt9Wv1oDVodW21agg1bDVpdW81aHWgNWx1aHVr9W+1bjWgtW0INWnIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjI3NTJlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJQZXJhbmdrYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJUb21ib2wgQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlRvbWJvbCBDYXN0LiBUZXJwdXR1cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVG9tYm9sIENhc3QuIE1lbmdodWJ1bmdrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iVG9tYm9sIENhc3QuIFRlcmh1YnVuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pc2lrYW4ga2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJNZW5jYXJpIHBlcmFuZ2thdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQdXR1c2thbiBzYW1idW5nYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJIZW50aWthbiBjYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJUdXR1cCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlB1dGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJKZWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQmVyaGVudGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJMdWFza2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDaXV0a2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iU2FtcHVsIGFsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkJpbGFoIGdlc2VyIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iVGlkYWsgYWRhIG1lZGlhIHlhbmcgZGlwaWxpaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iVGlkYWsgYWRhIGluZm8geWFuZyB0ZXJzZWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhbnNtaXNpIGxheWFyIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWlzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTM1ZWE2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWlzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IktlcmZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlTDpmtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iw5p0c2VuZGluZ2FyaG5hcHB1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IsOadHNlbmRpbmdhcmhuYXBwdXIuIEFmdGVuZ3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IsOadHNlbmRpbmdhcmhuYXBwdXIuIFRlbmdpc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iw5p0c2VuZGluZ2FyaG5hcHB1ci4gVGVuZ3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iU2VuZGEgw7p0IMOtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTGVpdGHDsCBhw7AgdMOma2p1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJBZnRlbmdqYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3TDtsOwdmEgw7p0c2VuZGluZ3UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ikxva2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJTcGlsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSGzDqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0w7bDsHZhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iU3TDpmtrYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iTWlubmthIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iUGzDtnR1dW1zbGFnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkhsasOzw7BzdHlya3NzbGXDsGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkVuZ2lubiBtacOwaWxsIHZhbGlubiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iRW5nYXIgdXBwbMO9c2luZ2FyIMOtIGJvw7BpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTa2rDoXIgc2VuZHVyIMO6dCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2ZTNhYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iUHVsc2FudGUgVHJhc21ldHRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iUHVsc2FudGUgVHJhc21ldHRpLiBEaXNjb25uZXNzbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iUHVsc2FudGUgVHJhc21ldHRpLiBDb25uZXNzaW9uZSBpbiBjb3JzbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJQdWxzYW50ZSBUcmFzbWV0dGkuIENvbm5lc3NvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYXNtZXR0aSBhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUmljZXJjYSBkaSBkaXNwb3NpdGl2aSBpbiBjb3JzbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJTY29sbGVnYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkludGVycm9tcGkgdHJhc21pc3Npb25lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDaGl1ZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSaXByb2R1Y2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iSW50ZXJyb21waSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkVzcGFuZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbXByaW1pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQ29wZXJ0aW5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkRpc3Bvc2l0aXZvIGRpIHNjb3JyaW1lbnRvIGRlbCB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lc3N1biBjb250ZW51dG8gbXVsdGltZWRpYWxlIHNlbGV6aW9uYXRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZXNzdW5hIGluZm9ybWF6aW9uZSBkaXNwb25pYmlsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhc21pc3Npb25lIGRlbGxvIHNjaGVybW8gaW4gY29yc28iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl3L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXcvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MmIwY2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXcvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i157Xoteo15vXqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLXnteb16nXmdeo15nXnSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuKAj9ec15fXptefINeU16TXotec16ogQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuKAj9ec15fXptefINeU16TXotec16ogQ2FzdC4g157XoNeV16rXpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0LiDXnteq15fXkdeoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuKAj9ec15fXptefINeU16TXotec16ogQ2FzdC4g157Xl9eV15HXqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLXlNei15HXqNeUINeQ15wiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLXnteX16TXqSDXnteb16nXmdeo15nXnSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLXoNeq16ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLXlNek16HXpyDXkNeqINeU15TXoteR16jXlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i16HXkteV16giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLXlNek16LXnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i15TXqdeU15QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLXlNek16HXpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IteU16jXl9eRIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLXm9eV15XXpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Itei15jXmdek16og15DXnNeR15XXnSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLXnteX15XXldefINei15XXptee15QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Itec15Ag16DXkdeX16jXlCDXnteT15nXlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i15DXmdefINee15nXk9eiINeW157XmdefIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLXlNei15HXqNeqINee16HXmiDXnteq15HXptei16oiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNDk3MjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i44K344K544OG44OgIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Iuerr+acqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuOCreODo+OCueODiOOCouOCpOOCs+ODsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuOCreODo+OCueODiCDjgqLjgqTjgrPjg7PjgILmjqXntprop6PpmaTmuIjjgb8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuOCreODo+OCueODiCDjgqLjgqTjgrPjg7PjgILmjqXntprkuK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i44Kt44Oj44K544OIIOOCouOCpOOCs+ODs+OAguaOpee2mua4iOOBvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLjgq3jg6Pjgrnjg4jjgZnjgovjg4fjg5DjgqTjgrkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLnq6/mnKvjgpLmpJzntKLjgZfjgabjgYTjgb7jgZkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i5o6l57aa44KS6Kej6ZmkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i44Kt44Oj44K544OI44KS5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLplonjgZjjgosiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLlho3nlJ8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuS4gOaZguWBnOatoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuWBnOatoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuWxlemWiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i5oqY44KK44Gf44Gf44KAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i44Ki44Or44OQ44Og44Ki44O844OIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Iumfs+mHj+OCueODqeOCpOODgOODvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i44Oh44OH44Kj44Ki44GM6YG45oqe44GV44KM44Gm44GE44G+44Gb44KTIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLmg4XloLHjgYzjgYLjgorjgb7jgZvjgpMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IueUu+mdouOCkuOCreODo+OCueODiOOBl+OBpuOBhOOBvuOBmSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta2Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhMDgxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLhg6Hhg5jhg6Hhg6Lhg5Thg5vhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4YOb4YOd4YOs4YOn4YOd4YOR4YOY4YOa4YOd4YOR4YOU4YOR4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDpuGDmOGDmuGDkOGDmeGDmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuGDouGDoOGDkOGDnOGDoeGDmuGDmOGDoOGDlOGDkeGDmOGDoSDhg6bhg5jhg5rhg5Dhg5nhg5guIOGDkuGDkOGDl+GDmOGDqOGDo+GDmuGDmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDpuGDmOGDmuGDkOGDmeGDmC4g4YOb4YOY4YOb4YOT4YOY4YOc4YOQ4YOg4YOU4YOd4YOR4YOhIOGDk+GDkOGDmeGDkOGDleGDqOGDmOGDoOGDlOGDkeGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5jhg6Eg4YOm4YOY4YOa4YOQ4YOZ4YOYLiDhg5Phg5Dhg5nhg5Dhg5Xhg6jhg5jhg6Dhg5Thg5Hhg6Phg5rhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOQOiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuGDm+GDneGDrOGDp+GDneGDkeGDmOGDmuGDneGDkeGDlOGDkeGDmOGDoSDhg5vhg53hg6vhg5jhg5Thg5Hhg5AuLi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4YOZ4YOQ4YOV4YOo4YOY4YOg4YOY4YOhIOGDkuGDkOGDrOGDp+GDleGDlOGDouGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuGDouGDoOGDkOGDnOGDoeGDmuGDmOGDoOGDlOGDkeGDmOGDoSDhg6jhg5Thg6zhg6fhg5Xhg5Thg6Lhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuGDk+GDkOGDruGDo+GDoOGDleGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuGDk+GDkOGDmeGDleGDoOGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4YOe4YOQ4YOj4YOW4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4YOo4YOU4YOs4YOn4YOV4YOU4YOi4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4YOS4YOQ4YOo4YOa4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLhg6nhg5Dhg5nhg5Thg6rhg5Xhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLhg5Dhg5rhg5Hhg53hg5vhg5jhg6Eg4YOS4YOQ4YOg4YOU4YOZ4YOQ4YOc4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGDruGDm+GDmOGDoSDhg6Hhg5rhg5Dhg5jhg5Phg5Thg6Dhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuGDm+GDlOGDk+GDmOGDkCDhg5Dhg6Dhg6nhg5Thg6Phg5rhg5gg4YOQ4YOgIOGDkOGDoOGDmOGDoSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4YOY4YOc4YOk4YOd4YOg4YOb4YOQ4YOq4YOY4YOQIOGDkOGDoCDhg5Dhg6Dhg5jhg6Eg4YOu4YOU4YOa4YOb4YOY4YOh4YOQ4YOs4YOV4YOT4YOd4YOb4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLhg5vhg5jhg5vhg5Phg5jhg5zhg5Dhg6Dhg5Thg53hg5Hhg6Eg4YOU4YOZ4YOg4YOQ4YOc4YOY4YOhIOGDkuGDkOGDk+GDkOGDquGDlOGDm+GDkCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta2svc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ray9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRkY2JiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ray9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQltKv0LnQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLSmtKx0YDRi9C70pPRi9C70LDRgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDINGC0q/QudC80LXRgdGWIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iXCLQotGA0LDQvdGB0LvRj9GG0LjRj9C70LDRg1wiINGC0q/QudC80LXRgdGWLiDQkNC20YvRgNCw0YLRg9C70YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Ilwi0KLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YNcIiDRgtKv0LnQvNC10YHRli4g0prQvtGB0YvQu9GD0LTQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJcItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDXCIg0YLSr9C50LzQtdGB0ZYuINKa0L7RgdGL0LvQtNGLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCa0LXQu9C10YHRltCz0LUg0YLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLSmtKx0YDRi9C70pPRi9C70LDRgNC00Ysg0YLQsNCx0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JDQttGL0YDQsNGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQotGA0LDQvdGB0LvRj9GG0LjRj9C70LDRg9C00Ysg0YLQvtKb0YLQsNGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCW0LDQsdGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0J7QudC90LDRgtGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQmtGW0LTRltGA0YLRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCi0L7Sm9GC0LDRgtGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0JbQsNGOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQltC40Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQkNC70YzQsdC+0Lwg0YjQtdCx0LXRgNGWIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCU0YvQsdGL0YEg0LTQtdKj0LPQtdC50ZbQvdGW0qMg0LbSr9Cz0ZbRgNGC0LrRltGB0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCV0YjQsdGW0YAg0YLQsNGB0YPRiNGLINGC0LDSo9C00LDQu9C80LDSk9Cw0L0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItKa0L7QuyDQttC10YLRltC80LTRliDQsNKb0L/QsNGA0LDRgiDQttC+0psiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCt0LrRgNCw0L3QtNGLINGC0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWttL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDQ3ODBlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWttL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuGelOGfkuGemuGeluGfkOGek+GfkuGekiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLhnqfhnpThnoDhnprhno7hn40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLhnpThn4rhnrzhno/hnrvhnoThnoHhnrbhnp8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLhnoHhnrbhnp/hnpThn4rhnrzhno/hnrvhnoThn5Yg4Z6U4Z624Z6T4Z6A4Z624Z6P4Z+L4Z6V4Z+S4Z6P4Z624Z6F4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLhnoHhnrbhnp/hnpThn4rhnrzhno/hnrvhnoThn5Yg4Z6A4Z+G4Z6W4Z674Z6E4Z6X4Z+S4Z6H4Z624Z6U4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuGegeGetuGen+GelOGfiuGevOGej+Geu+GehOGfliDhnpThnrbhnpPhnpfhn5LhnofhnrbhnpThn4vhnqDhnr7hnpkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4Z6U4Z6J4Z+S4Z6H4Z684Z6T4Z6R4Z+FIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4Z6A4Z+G4Z6W4Z674Z6E4Z6f4Z+S4Z6c4Z+C4Z6E4Z6a4Z6A4Z6n4Z6U4Z6A4Z6a4Z6O4Z+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuGeleGfkuGeiuGetuGeheGfiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuGeiOGelOGfi+Gel+GfkuGeh+GetuGelOGfiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Z6U4Z634Z6RIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Z6F4Z624Z6A4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLhnpXhn5LhnqLhnrbhnoAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLhnojhnpThn4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLhnpbhnoThn5LhnprhnrjhnoAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuGelOGehOGfkuGemuGeveGemCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuGen+GfkuGek+GetuGeiuGfg+Gen+Get+Gem+GfkuGelOGfiOGeouGetuGem+Gfi+GelOGfiuGeu+GemCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLhnprhnpThnrbhnprhnoDhnpjhn5Lhnprhnrfhno/hnp/hn4bhnqHhn4HhnoQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuGeguGfkuGemOGetuGek+GegOGetuGemuGeh+GfkuGemuGevuGen+GemOGfgeGejOGfgOGekeGfgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4Z6Y4Z634Z6T4Z6Y4Z624Z6T4Z6W4Z+Q4Z6P4Z+M4Z6Y4Z624Z6T4Z6R4Z+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLhnoDhn4bhnpbhnrvhnoThnoHhnrbhnp/hnqLhn4HhnoDhn5LhnprhnoThn4siPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtuL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta24vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMzdmZGQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta24vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4LK44LK/4LK44LON4LKf4LKCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCyuOCyvuCyp+CyqOCyl+Cys+CzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgSDgsqzgsp/gsqjgs43igIwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4Eg4LKs4LKf4LKo4LON4oCMLiDgsrjgsoLgsqrgsrDgs43gspUg4LKV4LKh4LK/4LKk4LKX4LOK4LKz4LK/4LK44LKy4LK+4LKX4LK/4LKm4LOGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4Eg4LKs4LKf4LKo4LON4oCMLiDgsrjgsoLgsqrgsrDgs43gspXgsr/gsrjgsrLgsr7gspfgs4HgsqTgs43gsqTgsr/gsqbgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LOBIOCyrOCyn+CyqOCzjeKAjC4g4LK44LKC4LKq4LKw4LON4LKV4LK/4LKk4LKX4LOK4LKC4LKh4LK/4LKm4LOGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCyh+CypuCyleCzjeCyleCzhiDgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgsr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgsrjgsr7gsqfgsqjgspfgsrPgsqjgs43gsqjgs4Eg4LK54LOB4LKh4LOB4LKV4LKy4LK+4LKX4LOB4LKk4LON4LKk4LK/4LKm4LOGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCyuOCyguCyquCysOCzjeCylSDgspXgsqHgsr/gsqTgspfgs4rgsrPgsr/gsrjgs4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4HgsrXgsr/gspXgs4Yg4LKo4LK/4LKy4LON4LKy4LK/4LK44LK/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgsq7gs4Hgsprgs43gsprgs4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgsqrgs43gsrLgs4cg4LKu4LK+4LKh4LK/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgsrXgsr/gsrDgsr7gsq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgsqjgsr/gsrLgs43gsrLgsr/gsrjgsr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgsrXgsr/gsrjgs43gsqTgsrDgsr/gsrjgs4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCyuOCyguCyleCzgeCymuCyv+CyuOCzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCyhuCysuCzjeCyrOCyruCzjSDgspXgsrLgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LK14LK+4LKy4LON4LKv4LOC4LKu4LONIOCyuOCzjeCysuCziOCyoeCysOCzjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4LKv4LK+4LK14LOB4LKm4LOHIOCyruCyvuCyp+CzjeCyr+CyriDgsobgsq/gs43gspXgs4bgsq7gsr7gsqHgsrLgsr7gspfgsr/gsrLgs43gsrIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCyr+CyvuCyteCzgeCypuCzhyDgsq7gsr7gsrngsr/gsqTgsr8g4LKy4LKt4LON4LKv4LK14LK/4LKy4LON4LKyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgsqrgsrDgsqbgs4bgsq/gsqjgs43gsqjgs4Eg4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LKy4LK+4LKX4LOB4LKk4LON4LKk4LK/4LKm4LOGIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTg5M2E5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuyLnOyKpO2FnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLquLDquLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLsoITshqEg67KE7Yq8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i7KCE7IahIOuyhO2KvC4g7Jew6rKwIO2VtOygnOuQqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i7KCE7IahIOuyhO2KvC4g7Jew6rKwIOykkSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLsoITshqEg67KE7Yq8LiDsl7DqsrDrkKgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i7KCE7Iah7ZWgIOq4sOq4sCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuq4sOq4sOulvCDssL7ripQg7KSRIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuyXsOqysCDtlbTsoJwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLsoITshqEg7KSR7KeAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLri6vquLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLsnqzsg50iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuydvOyLnOykkeyngCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuykkeyngCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Iu2OvOy5mOq4sCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i7KCR6riwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i7JWo67KU7JWE7Yq4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuuzvOulqCDsiqzrnbzsnbTrjZQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuyEoO2Dne2VnCDrr7jrlJTslrQg7JeG7J2MIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLsoJXrs7TqsIAg7JeG7Iq164uI64ukLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i7ZmU66m0IOyghOyGoSDspJEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWt5L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta3kvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ODEzYWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta3kvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KLRg9GC0YPQvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQotKv0LfQvNOp0LrRgtOp0YAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRg9GDINCx0LDRgdC60YvRh9GLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0KLRi9GI0LrRiyDRjdC60YDQsNC90LPQsCDRh9GL0LPQsNGA0YPRgyDQsdCw0YHQutGL0YfRiy4g0KLSr9C30LzTqdC6INCw0LbRi9GA0LDQvyDRgtGD0YDQsNGCLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0KLRi9GI0LrRiyDRjdC60YDQsNC90LPQsCDRh9GL0LPQsNGA0YPRgyDQsdCw0YHQutGL0YfRiy4g0KLSr9C30LzTqdC6INGC0YPRgtCw0YjRg9GD0LTQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRg9GDINCx0LDRgdC60YvRh9GLLiDQotKv0LfQvNOp0Log0YLRg9GC0LDRiNGL0L8g0YLRg9GA0LDRgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQotOp0LzTqdC90LrSr9Cz06kg0YfRi9Cz0LDRgNGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQotKv0LfQvNOp0LrRgtOp0YAg0LjQt9C00LXQu9Kv0q/QtNOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCQ0LbRi9GA0LDRgtGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQotGL0YjQuiDRjdC60YDQsNC90LPQsCDRh9GL0LPQsNGA0L3RgyDRgtC+0LrRgtC+0YLRg9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQltCw0LHRg9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0J7QudC90L7RgtGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCi0YvQvdC00YvRgNGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQotC+0LrRgtC+0YLRg9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0JbQsNC50YvQvyDQutOp0YDRgdOp0YLSr9KvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQltGL0LnRi9GI0YLRi9GA0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCQ0LvRjNCx0L7QvCDQvNGD0LrQsNCx0LDRgdGLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItKu0L3QtNKvINC60LDRgtGD0YPQu9Cw0YLRg9GD0YfRgyDRgdGL0LTRi9GA0LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JHQuNGAINC00LAg0LzQtdC00LjQsCDRhNCw0LnQuyDRgtCw0L3QtNCw0LvQs9Cw0L0g0LbQvtC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQrdGHINC80LDQsNC70YvQvNCw0YIg0LbQvtC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRi9C70YPRg9C00LAiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlmMWUxZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sYW5kL2RpbWVucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBNZWRpYVJvdXRlQ29udHJvbGxlcidzIHZvbHVtZSBncm91cCBsaXN0IC0tPgotICAgIDxlYXQtY29tbWVudCAvPgotICAgIDwhLS0gTWF4aW11bSBoZWlnaHQgb2Ygdm9sdW1lIGdyb3VwIGxpc3QuIC0tPgotICAgIDxkaW1lbiBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X21heF9oZWlnaHQiPjEzMmRwPC9kaW1lbj4KLSAgICA8IS0tIEhlaWdodCBvZiB2b2x1bWUgZ3JvdXAgaXRlbS4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9oZWlnaHQiPjYxZHA8L2RpbWVuPgotICAgIDwhLS0gU2l6ZSBvZiBhbiBpdGVtJ3MgaWNvbi4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9pY29uX3NpemUiPjE4ZHA8L2RpbWVuPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sby9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxvL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTczN2RiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxvL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuC6peC6sOC6muC6u+C6miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLguq3gurjgupvgurDguoHguq3gupkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgupvgurjgu4jguqHigIvguoTgurLigIvguqrigIvgupfgu4wiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgupvgurjgu4jguqHguqrgurvgu4jguofguqrgurHgupnguo3gurLgupkuIOC6leC6seC6lOC6geC6suC6meC7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iOC7geC6peC7ieC6pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4Lqb4Lq44LuI4Lqh4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZLiDguoHgurPguqXgurHguofgu4Dguorgurfgu4jguq3guqHgupXgu43gu4giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4Lqb4Lq44LuI4Lqh4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZLiDgu4Dguorgurfgu4jguq3guqHgupXgu43gu4jgu4HguqXgu4nguqciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZ4Lqr4LqyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4LqB4Lqz4Lql4Lqx4LqH4oCL4LqK4Lqt4LqB4oCL4Lqr4Lqy4oCL4Lqt4Lq44oCL4Lqb4Lqw4oCL4LqB4Lqt4LqZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuC6leC6seC6lOC6geC6suC6meC7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuC6ouC6uOC6lOC6geC6suC6meC6quC6u+C7iOC6h+C6quC6seC6meC6jeC6suC6mSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Lqb4Lq04LqUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Lqr4Lq84Lq04LuJ4LqZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLguqLgurjgupTguorgurvgu4jguqfguoTgurLguqciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLguqLgurjgupQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLguoLgurDguqvguo3gurLguo0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuC6q+C6jeC7jeC7ieC6peC6u+C6hyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuC7nOC7ieC6suC6m+C6u+C6geC6reC6sOC6peC6sOC6muC7jeC7ieC6siI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgupXgurvguqfgupvgurHguprguqXgurDgupTgurHguprguqrgur3guociPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuC6muC7jeC7iOKAi+C7hOC6lOC7ieKAi+C7gOC6peC6t+C6reC6geKAi+C6oeC6teKAi+C7gOC6lOC6jeKAi+C7g+C6lOKAi+C7hOC6p+C7iSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4Lqa4LuN4LuI4oCL4Lqh4Lq14oCL4LqC4LuN4LuJ4oCL4Lqh4Lq54LqZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLguoHgurLgupnguqrgurvgu4jguofgup7gurLguprgu5zgu4ngurLguojgu40iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx0L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMDM2ZDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLErnJlbmdpbmlhaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlBlcmRhdmltbyBteWd0dWthcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlBlcmRhdmltbyBteWd0dWthcy4gQXRzaWp1bmd0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iUGVyZGF2aW1vIG15Z3R1a2FzLiBQcmlzaWp1bmdpYW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlBlcmRhdmltbyBteWd0dWthcy4gUHJpc2lqdW5ndGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUGVyZHVvdGkgxK8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJSYW5kYW1pIMSvcmVuZ2luaWFpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkF0anVuZ3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3VzdGFiZHl0aSBwZXJkYXZpbcSFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJVxb5kYXJ5dGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJMZWlzdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlByaXN0YWJkeXRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3VzdGFiZHl0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IknFoXNrbGVpc3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTdXRyYXVrdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bW8gdmlyxaFlbGlzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkdhcnN1bW8gxaFsaWF1xb5pa2xpcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVwYXNpcmlua3RhIGpva2lhIG1lZGlqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iSW5mb3JtYWNpamEgbmVwYXNpZWtpYW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQZXJkdW9kYW1hcyBla3JhbmFzIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sdi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTQwNjNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3TEk21hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkllcsSrY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQXByYWlkZXMgcG9nYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkFwcmFpZGVzIHBvZ2EuIFNhdmllbm9qdW1zIHDEgXJ0cmF1a3RzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJBcHJhaWRlcyBwb2dhLiBOb3RpZWsgc2F2aWVub2p1bWEgaXp2ZWlkZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJBcHJhaWRlcyBwb2dhLiBTYXZpZW5vanVtcyBpenZlaWRvdHMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQXByYWlkxKvFoWFuYSB1eiBpZXLEq2NpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTm90aWVrIGllcsSrxI11IG1la2zEk8WhYW5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkF0dmllbm90Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQXB0dXLEk3QgYXByYWlkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQWl6dsSTcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJBdHNrYcWGb3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkFwdHVyxJN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQXB0dXLEk3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJJenbEk3JzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2FrxLxhdXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWEgdsSBY2nFhsWhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlNrYcS8dW1hIHNsxKtkbmlzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOYXYgYXRsYXPEq3RpIG11bHRpdmlkZXMgZmFpbGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5hdiBwaWVlamFtYSBpbmZvcm3EgWNpamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Ik5vdGllayBla3LEgW5hIGFwcmFpZGUiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1rL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWsvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZGVlMzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWsvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCj0YDQtdC00LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQmtC+0L/Rh9C10YLQviDQt9CwIENhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQmtC+0L/Rh9C1INC30LAgQ2FzdC4g0JjRgdC60LvRg9GH0LXQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQmtC+0L/Rh9C1INC30LAgQ2FzdC4g0KHQtSDQv9C+0LLRgNC30YPQstCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCa0L7Qv9GH0LUg0LfQsCBDYXN0LiDQn9C+0LLRgNC30LDQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCV0LzQuNGC0YPQstCw0Zgg0L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCh0LUg0LHQsNGA0LDQsNGCINGD0YDQtdC00LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JjRgdC60LvRg9GH0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQodC+0L/RgNC4INCz0L4g0LXQvNC40YLRg9Cy0LDRmtC10YLQviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNGC0LLQvtGA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQoNC10L/RgNC+0LTRg9GG0LjRgNCw0ZgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0LDRg9C30LjRgNCw0ZgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQodC+0L/RgNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0J/RgNC+0YjQuNGA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCh0L7QsdC10YDQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCa0L7RgNC40YbQsCDQvdCwINCw0LvQsdGD0LwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0JvQuNC30LPQsNGHINC30LAg0ZjQsNGH0LjQvdCwINC90LAg0LfQstGD0LoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCd0LUg0YHQtSDQuNC30LHRgNCw0L3QuCDQvNC10LTQuNGD0LzQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0J3QtdC80LAg0LTQvtGB0YLQsNC/0L3QuCDQuNC90YTQvtGA0LzQsNGG0LjQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0JXQutGA0LDQvdC+0YIg0YHQtSDQtdC80LjRgtGD0LLQsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ5MTRiOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgtLjgtL/gtLjgtY3gtLHgtY3gtLHgtIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4LSJ4LSq4LSV4LSw4LSj4LSZ4LWN4LSZ4LW+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4LSf4LS+4LSq4LWN4LSq4LWB4LSa4LWG4LSv4LWN4LSv4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWNIOC0rOC0n+C1jeC0n+C1ui4g4LS14LS/4LSa4LWN4LSb4LWH4LSm4LS/4LSa4LWN4LSa4LWBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtY0g4LSs4LSf4LWN4LSf4LW6LiDgtJXgtKPgtJXgtY3igIzgtLHgtY3gtLHgtYHgtJrgtYbgtK/gtY3gtK/gtYHgtKjgtY3gtKjgtYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWNIOC0rOC0n+C1jeC0n+C1ui4g4LSV4LSj4LSV4LWN4LSx4LWN4LSx4LWB4LSa4LWG4LSv4LWN4LSk4LWBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuC0h+C0pOC0v+C0suC1h+C0leC1jeC0leC1jSDgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtYHgtJrgtYbgtK/gtY3gtK/gtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgtIngtKrgtJXgtLDgtKPgtJngtY3gtJngtb4g4LSV4LSj4LWN4LSf4LWG4LSk4LWN4LSk4LWB4LSo4LWN4LSo4LWBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuC0teC0v+C0muC1jeC0m+C1h+C0puC0v+C0leC1jeC0leC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuC0leC0vuC0uOC1jeC0seC1jeC0seC1geC0muC1huC0r+C1jeC0r+C1vSDgtKjgtL/gtbzgtKTgtY3gtKTgtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuC0heC0teC0uOC0vuC0qOC0v+C0quC1jeC0quC0v+C0leC1jeC0leC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuC0quC1jeC0suC1hyDgtJrgtYbgtK/gtY3gtK/gtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuC0pOC1veC0leC1jeC0leC0vuC0suC0giDgtKjgtL/gtbzgtKTgtY3gtKTgtYIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgtKjgtL/gtLDgtY3igI3gtKTgtY3gtKTgtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgtLXgtL/gtJXgtLjgtL/gtKrgtY3gtKrgtL/gtJXgtY3gtJXgtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuC0muC1geC0sOC1geC0leC1jeC0leC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuC0huC1veC0rOC0giDgtIbgtbzgtJ/gtY3gtJ/gtY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LS14LWL4LSz4LS/4LSv4LSCIOC0uOC1jeC0suC1iOC0oeC1vCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4LSu4LWA4LSh4LS/4LSv4LSv4LWK4LSo4LWN4LSo4LWB4LSCIOC0pOC0v+C0sOC0nuC1jeC0nuC1huC0n+C1geC0pOC1jeC0pOC0v+C0n+C1jeC0n+C0v+C0suC1jeC0siI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4LS14LS/4LS14LSw4LSZ4LWN4LSZ4LSz4LWK4LSo4LWN4LSo4LWB4LSCIOC0suC0reC1jeC0r+C0ruC0suC1jeC0siI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LS44LWN4oCM4LSV4LWN4LSw4LWA4LW7IOC0leC0vuC0uOC1jeC0seC1jeC0seC1geC0muC1huC0r+C1jeC0r+C1geC0qOC1jeC0qOC1gSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbW4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4N2M5Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0KLTqdGF06nTqdGA06nQvNC20q/Sr9C0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JTQsNC80LbRg9GD0LvQsNGFINGC0L7QstGH0LvRg9GD0YAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQlNCw0LzQttGD0YPQu9Cw0YUg0YLQvtCy0YfQu9GD0YPRgC4g0KHQsNC70YHQsNC9Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQlNCw0LzQttGD0YPQu9Cw0YUg0YLQvtCy0YfQu9GD0YPRgC4g0KXQvtC70LHQvtC2INCx0LDQudC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JTQsNC80LbRg9GD0LvQsNGFINGC0L7QstGH0LvRg9GD0YAuINCl0L7Qu9Cx0L7Qs9C00YHQvtC9Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCU0LDQvNC20YPRg9C70LDRhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCi06nRhdOp06nRgNOp0LzQtiDRhdCw0LnQtiDQsdCw0LnQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCh0LDQu9Cz0LDRhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCU0LDQvNC20YPRg9C70LDRhdGL0LMg0LfQvtCz0YHQvtC+0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCl0LDQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0KLQvtCz0LvRg9GD0LvQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQotKv0YAg0LfQvtCz0YHQvtC+0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQl9C+0LPRgdC+0L7RhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCU0Y3Qu9Cz0Y3RhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KXRg9GA0LDQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0KbQvtC80LPQuNC50L0g0LfRg9GA0LDQsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQlNGD0YPQvdGLINGC0q/QstGI0LjQvSDRgtCw0LDRgNGD0YPQu9Cw0LPRhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0K/QvNCw0YAg0Ycg0LzQtdC00LjQsCDRgdC+0L3Qs9C+0L7Qs9Kv0LkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCc0Y3QtNGN0Y3Qu9GN0Lsg0LHQsNC50YXQs9Kv0Lkg0LHQsNC50L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0JTRjdC70LPRjdGG0LjQudCzINC00LDQvNC20YPRg9C70LYg0LHQsNC50L3QsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmYmViYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgpLjgpL/gpLjgpY3gpJ/gpK4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4KSh4KS/4KS14KWN4KS54KS+4KSH4KS44KWH4KS4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+CkoyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCkleCkvuCkuOCljeCknyDgpKzgpJ/gpKMuIOCkoeCkv+CkuOCljeCkleCkqOClh+CkleCljeCknyDgpJXgpYfgpLLgpYciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCkleCkvuCkuOCljeCknyDgpKzgpJ/gpKMuIOCkleCkqOClh+CkleCljeCknyDgpJXgpLDgpKQg4KSG4KS54KWHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCkleCkvuCkuOCljeCknyDgpKzgpJ/gpKMuIOCkleCkqOClh+CkleCljeCknyDgpJXgpYfgpLLgpYciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KSv4KS+4KS14KSwIOCkleCkvuCkuOCljeCknyDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgpKHgpL/gpLXgpY3gpLngpL7gpIfgpLjgpYfgpLgg4KS24KWL4KSn4KSkIOCkhuCkueClhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgpKHgpL/gpLjgpY3igI3gpJXgpKjgpYfgpJXgpY3igI3gpJ8g4KSV4KSw4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOCko+ClhyDgpKXgpL7gpILgpKzgpLXgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCkrOCkguCkpiDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgpKrgpY3gpLLgpYcg4KSV4KSw4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgpLXgpL/gpLDgpL7gpK4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpKXgpL7gpILgpKzgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgpLXgpL/gpLjgpY3gpKTgpYPgpKQg4KSV4KSw4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgpLjgpILgpJXgpYHgpJrgpL/gpKQg4KSV4KSw4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KSF4KSy4KWN4KSs4KSuIOCkleCksuCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgpLXgpY3gpLngpYngpLLgpY3gpK/gpYLgpK4g4KS44KWN4KSy4KS+4KSv4KSh4KSwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgpK7gpYDgpKHgpL/gpK/gpL4g4KSo4KS/4KS14KSh4KSy4KS+IOCkqOCkvuCkueClgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KSV4KWL4KSj4KSk4KWA4KS54KWAIOCkruCkvuCkueCkv+CkpOClgCDgpIngpKrgpLLgpKzgpY3gpKcg4KSo4KS+4KS54KWAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgpLjgpY3gpJXgpY3gpLDgpYDgpKgg4KSV4KS+4KS44KWN4oCN4KSfIOCkleCksOCkpCDgpIbgpLngpYciPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1zL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NWU0ODAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlBlcmFudGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCdXRhbmcgSGFudGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQnV0YW5nIGhhbnRhci4gU2FtYnVuZ2FuIGRpcHV0dXNrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJ1dGFuZyBoYW50YXIuIE1lbnlhbWJ1bmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQnV0YW5nIGhhbnRhci4gRGlzYW1idW5na2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkhhbnRhciBrZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Ik1lbmNhcmkgcGVyYW50aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQdXR1c2thbiBzYW1idW5nYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJCZXJoZW50aSBtZW5naGFudGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJUdXR1cCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Ik1haW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkplZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJCZXJoZW50aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IktlbWJhbmdrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJ1bnR1aGthbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlNlbmkgYWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iUGVsdW5jdXIga2VsYW50YW5nYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IlRpYWRhIG1lZGlhIGRpcGlsaWgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik1ha2x1bWF0IHRpZGFrIHRlcnNlZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJNZW5naGFudGFyIHNrcmluIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1teS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW15L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODNkODA1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW15L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuGAheGAlOGAheGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLhgIXhgIDhgLrhgJXhgIXhgLnhgIXhgIrhgLrhgLjhgJnhgLvhgKzhgLgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLhgIDhgKzhgIXhgLrhgJDhgLrhgJzhgK/hgJXhgLrhgJvhgJThgLog4YCB4YCc4YCv4YCQ4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4YCA4YCs4YCF4YC64YCB4YCc4YCv4YCQ4YC64YGLIOGAgeGAu+GAreGAkOGAuuGAhuGAgOGAuuGAmeGAkeGArOGAuOGAleGAqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4YCA4YCs4YCF4YC64YCB4YCc4YCv4YCQ4YC64YGLIOGAgeGAu+GAreGAkOGAuuGAhuGAgOGAuuGAlOGAseGAnuGAiuGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLhgIDhgKzhgIXhgLrhgIHhgJzhgK/hgJDhgLrhgYsg4YCB4YC74YCt4YCQ4YC64YCG4YCA4YC64YCR4YCs4YC44YCe4YCK4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuGAgOGArOGAheGAuuGAnOGAr+GAleGAuuGAm+GAlOGAuiDhgIXhgIDhgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLhgIXhgIDhgLrhgJXhgIXhgLnhgIXhgIrhgLrhgLjhgJnhgLvhgKzhgLgg4YCb4YC+4YCs4YCW4YC94YCx4YCB4YC84YCE4YC64YC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuGAhuGAgOGAuuGAnuGAveGAmuGAuuGAmeGAvuGAryDhgJbhgLzhgJDhgLrhgJvhgJThgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLhgIDhgKzhgIXhgLrhgJzhgK/hgJXhgLrhgIHhgLzhgIThgLrhgLgg4YCb4YCV4YC64YCb4YCU4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLhgJXhgK3hgJDhgLrhgJvhgJThgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLhgJbhgL3hgIThgLfhgLrhgJvhgJThgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuGAgeGAj+GAm+GAleGAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuGAm+GAleGAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuGAluGAvOGAlOGAt+GAuuGAgeGAu+GAm+GAlOGAuuGBgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4YCB4YCx4YCr4YCA4YC64YCe4YCt4YCZ4YC64YC44YCb4YCU4YC6Li4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4YCh4YCa4YC64YCc4YC64YCY4YCZ4YC64YCV4YCv4YC2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGAoeGAnuGAtuGAoeGAkOGAreGAr+GAuOGAoeGAgOGAu+GAmuGAuuGAgeGAu+GAreGAlOGAuuGAnuGAiuGAt+GAuiDhgIbhgJzhgK3hgK/hgIDhgLrhgJLhgKsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuGAmeGAiuGAuuGAnuGAiuGAt+GAuuGAmeGAruGAkuGAruGAmeGAviDhgJnhgJvhgL3hgLHhgLjhgIHhgLvhgJrhgLrhgJHhgKzhgLjhgJXhgKsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuGAoeGAgeGAu+GAgOGAuuGAoeGAnOGAgOGAuiDhgJnhgJvhgJvhgL7hgK3hgJThgK3hgK/hgIThgLrhgJXhgKsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGAkOGAiuGAuuGAuOGAluGAvOGAkOGAuuGAm+GAseGAuCDhgJnhgLvhgIDhgLrhgJThgL7hgKzhgJXhgLzhgIThgLoiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNzY0YzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkVuaGV0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LWlrb25ldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qta25hcHBlbi4gRnJha29ibGV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LWtuYXBwZW4uIEtvYmxlciB0aWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdC1rbmFwcGVuLiBUaWxrb2JsZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0aWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJTw7hrZXIgZXR0ZXIgZW5oZXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJLb2JsZSBmcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wcCBjYXN0aW5nZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ikx1a2siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJTcGlsbCBhdiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iU2V0dCBww6UgcGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlV0dmlkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTa2p1bCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtZ3JhZmlrayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJHbGlkZWJyeXRlciBmb3Igdm9sdW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkR1IGhhciBpa2tlIHZhbGd0IG5vZW4gbWVkaWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJJbmdlbiBpbmZvcm1hc2pvbiBlciB0aWxnamVuZ2VsaWciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkNhc3RlciBza2plcm1lbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uZS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZjMmUxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uZS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgpKrgpY3gpLDgpKPgpL7gpLLgpYAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4KSJ4KSq4KSV4KSw4KSj4KS54KSw4KWCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdCDgpKzgpJ/gpKgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IOCkrOCkn+CkqOClpCDgpJzgpKHgpL7gpKgg4KS14KS/4KSa4KWN4KSb4KWH4KSmIOCkreCkr+CliyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCDgpKzgpJ/gpKjgpaQg4KSc4KSh4KS+4KSoIOCkueClgeCkgeCkpuCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IOCkrOCkn+CkqOClpCDgpJzgpKHgpL7gpKgg4KSt4KSv4KWLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCkr+CkuOCkruCkviBDYXN0IOCkl+CksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCkr+CkqOCljeCkpOCljeCksOCkueCksOClgiDgpKrgpKTgpY3gpKTgpL4g4KSy4KSX4KS+4KSJ4KSB4KSm4KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCkteCkv+CkmuCljeCkm+Clh+CkpiDgpJfgpLDgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJjYXN0aW5nIOCksOCli+CkleCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4KSs4KSo4KWN4KSmIOCkl+CksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCkrOCknOCkvuCkieCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4KSw4KWL4KSV4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4KSw4KWL4KSV4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4KS14KS/4KS44KWN4KSk4KS+4KSwIOCkl+CksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4KS44KSC4KSV4KWN4KS34KS/4KSq4KWN4KSkIOCkquCkvuCksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCkj+CksuCljeCkrOCkriDgpIbgpLDgpY3gpJ8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4KSt4KWL4KSy4KWN4KSv4KWB4KSu4KSV4KWLIOCkuOCljeCksuCkvuCkh+CkoeCksCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4KSV4KWB4KSo4KWIIOCkruCkv+CkoeCkv+Ckr+CkviDgpJrgpK/gpKgg4KSt4KSP4KSV4KWLIOCkm+CliOCkqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KSc4KS+4KSo4KSV4KS+4KSw4KWAIOCkieCkquCksuCkrOCljeCkpyDgpJvgpYjgpKgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCkuOCljeCkleCljeCksOCkv+CkqCBjYXN0IOCkl+CksOCljeCkpuCliCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVkZjYyZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZWVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkFwcGFyYXRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtaWNvb24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0LWljb29uLiBWZXJiaW5kaW5nIHZlcmJyb2tlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdC1pY29vbi4gVmVyYmluZGluZyBtYWtlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LWljb29uLiBWZXJib25kZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdGVuIG5hYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJBcHBhcmF0ZW4gem9la2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ikxvc2tvcHBlbGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQ2FzdGVuIHN0b3BwZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlNsdWl0ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJBZnNwZWxlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iT25kZXJicmVrZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wcGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVWl0dm91d2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTYW1lbnZvdXdlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtaG9lcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWVzY2h1aWZyZWdlbGFhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iR2VlbiBtZWRpYSBnZXNlbGVjdGVlcmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkdlZW4gaW5mb3JtYXRpZSBiZXNjaGlrYmFhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2NoZXJtIGNhc3RlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGEvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1ZGY3MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgqLjgqL/gqLjgqJ/gqK4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4Kih4Ki/4Ki14Ki+4KiI4Ki44Ki+4KiCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4KiV4Ki+4Ki44KifIOCorOCon+CoqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuColeCovuCouOConyDgqKzgqJ/gqKjgpaQg4Kih4Ki/4Ki44KiV4Kio4KmI4KiV4KifIOColeCpgOCopOCoviDgqJfgqL/gqIYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuColeCovuCouOConyDgqKzgqJ/gqKjgpaQg4KiV4Kio4KmI4KiV4KifIOColeCpgOCopOCoviDgqJzgqL4g4Kiw4Ki/4Ki54Ki+IOCoueCpiCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgqJXgqL7gqLjgqJ8g4Kis4Kif4Kio4KWkIOColeCoqOCpiOColeConyDgqJXgqYDgqKTgqL4g4KiX4Ki/4KiGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCoj+CopeCphyDgqJXgqL7gqLjgqJ8g4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4Kih4KmA4Ki14Ki+4KiI4Ki44Ki+4KiCIOCoqOCpguCpsCDgqLLgqbHgqK3gqL/gqIYg4Kic4Ki+IOCosOCov+CoueCoviDgqLngqYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Kih4Ki/4Ki44KiV4Kio4KmI4KiV4KifIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuColeCovuCouOConyDgqJXgqLDgqKjgqL4g4Kis4Kmw4KimIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Kis4Kmw4KimIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCoquCosuCphyDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCosOCpi+ColeCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCorOCpsOCopiDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgqLXgqL/gqLjgqKTgqL7gqLAg4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgqKzgqbDgqKYg4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KiQ4Kiy4Kis4KiuIOCohuCosOConyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgqLXgqYzgqLLgqK/gqYLgqK4g4Ki44Kiy4Ki+4KiI4Kih4KiwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgqJXgqYvgqIgg4Ki14KmAIOCoruCpgOCooeCpgOCohiDgqKjgqLngqYDgqIIg4Kia4KmB4Kij4Ki/4KiGIOCol+Cov+CohiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KiV4KmL4KiIIOConOCovuCoo+ColeCovuCosOCpgCDgqIngqKrgqLLgqKzgqKcg4Kio4Ki54KmA4KiCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgqLjgqJXgqY3gqLDgqYDgqKgg4Kic4KmL4KmcIOCosOCov+CoueCoviDgqLngqYgiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3OTJhNmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlVyesSFZHplbmlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iUHJ6eWNpc2sgQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlByenljaXNrIFByemXFm2xpaiBla3Jhbi4gUm96xYLEhWN6b25vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJQcnp5Y2lzayBQcnplxZtsaWogZWtyYW4uIMWBxIVjesSZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlByenljaXNrIFByemXFm2xpaiBla3Jhbi4gUG/FgsSFY3pvbm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUHJ6ZXN5xYJhaiBuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlpuYWpkb3dhbmllIHVyesSFZHplxYQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iT2TFgsSFY3oiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJaYXRyenltYWogcHJ6ZXN5xYJhbmllIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYW1rbmlqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iT2R0d8OzcnoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IldzdHJ6eW1haiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlphdHJ6eW1haiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlJvendpxYQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Ilp3acWEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iT2vFgmFka2EgYWxidW11Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlN1d2FrIGfFgm/Fm25vxZtjaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmllIHd5YnJhbm8gbXVsdGltZWRpw7N3Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJCcmFrIGluZm9ybWFjamkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlByemVzecWCYW0gZWtyYW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJCUi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJCUi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjNjE5ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC1yQlIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDo28gVHJhbnNtaXRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gRGVzY29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIENvbmVjdGFuZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBDb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtaXRpciBwYXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTG9jYWxpemFuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSW50ZXJyb21wZXIgdHJhbnNtaXNzw6NvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJGZWNoYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1emlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJQYXJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZWNvbGhlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFydGUgZG8gw6FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2xlIGRlc2xpemFudGUgZGUgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZW5odW1hIG3DrWRpYSBzZWxlY2lvbmFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVuaHVtYSBpbmZvcm1hw6fDo28gZGlzcG9uw612ZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlRyYW5zbWl0aW5kbyBhIHRlbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YwYTYxZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDo28gVHJhbnNtaXRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOjbyBUcmFuc21pdGlyLiBEZXNsaWdhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOjbyBUcmFuc21pdGlyLiBBIGxpZ2FyLi4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOjbyBUcmFuc21pdGlyLiBMaWdhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtaXRpciBwYXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQSBsb2NhbGl6YXIgZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2Fzc29jaWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iUGFyYXIgYSB0cmFuc21pc3PDo28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlY2hhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHV6aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkludGVycm9tcGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iUGFyYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUmVkdXppciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkltYWdlbSBkbyDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbG8gZGUgZGVzbGl6ZSBkbyB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbmh1bSBzdXBvcnRlIG11bHRpbcOpZGlhIHNlbGVjaW9uYWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZW5odW1hIGluZm9ybWHDp8OjbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQSB0cmFuc21pdGlyIG8gZWNyw6MiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYzYxOWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDo28gVHJhbnNtaXRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gRGVzY29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIENvbmVjdGFuZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBDb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtaXRpciBwYXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTG9jYWxpemFuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSW50ZXJyb21wZXIgdHJhbnNtaXNzw6NvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJGZWNoYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1emlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJQYXJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZWNvbGhlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFydGUgZG8gw6FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2xlIGRlc2xpemFudGUgZGUgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZW5odW1hIG3DrWRpYSBzZWxlY2lvbmFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVuaHVtYSBpbmZvcm1hw6fDo28gZGlzcG9uw612ZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlRyYW5zbWl0aW5kbyBhIHRlbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXJvL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYmIyZjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bveml0aXZlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQnV0b251bCBkZSBwcm9pZWPIm2llIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQnV0b251bCBkZSBwcm9pZWPIm2llLiBEZWNvbmVjdGF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCdXRvbnVsIGRlIHByb2llY8ibaWUuIFNlIGNvbmVjdGVhesSDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJ1dG9udWwgZGUgcHJvaWVjyJtpZS4gQ29uZWN0YXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUHJvaWVjdGHIm2kgcGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJTZSBjYXV0xIMgZGlzcG96aXRpdmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVjb25lY3RhyJtpLXbEgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ik51IG1haSBwcm9pZWN0YcibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iw45uY2hpZGXIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZWRhyJtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLDjm50cmVydXBlyJtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iT3ByacibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4dGluZGXIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlc3Ryw6JuZ2XIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJHcmFmaWNhIGFsYnVtdWx1aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJHbGlzb3IgcGVudHJ1IHZvbHVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWNpdW4gZmnImWllciBtZWRpYSBzZWxlY3RhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTnUgc3VudCBkaXNwb25pYmlsZSBpbmZvcm1hyJtpaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2UgcHJvaWVjdGVhesSDIGVjcmFudWwiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNDYyZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0KPRgdGC0YDQvtC50YHRgtCy0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtC40LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtC40LguINCj0YHRgtGA0L7QudGB0YLQstC+INC+0YLQutC70Y7Rh9C10L3Qvi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuC4g0KPRgdGC0YDQvtC50YHRgtCy0L4g0L/QvtC00LrQu9GO0YfQsNC10YLRgdGPLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtC40LguINCj0YHRgtGA0L7QudGB0YLQstC+INC/0L7QtNC60LvRjtGH0LXQvdC+LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQktGL0LHQtdGA0LjRgtC1INGD0YHRgtGA0L7QudGB0YLQstC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0J/QvtC40YHQuiDRg9GB0YLRgNC+0LnRgdGC0LLigKYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0J7RgtC60LvRjtGH0LjRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0J/RgNC10LrRgNCw0YLQuNGC0Ywg0YLRgNCw0L3RgdC70Y/RhtC40Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCX0LDQutGA0YvRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0JLQvtGB0L/RgNC+0LjQt9Cy0LXRgdGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0YDQuNC+0YHRgtCw0L3QvtCy0LjRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0J7RgdGC0LDQvdC+0LLQuNGC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQoNCw0LfQstC10YDQvdGD0YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KHQstC10YDQvdGD0YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCe0LHQu9C+0LbQutCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCg0LXQs9GD0LvRj9GC0L7RgCDQs9GA0L7QvNC60L7RgdGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCc0LXQtNC40LDRhNCw0LnQuyDQvdC1INCy0YvQsdGA0LDQvSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0JTQsNC90L3Ri9GFINC90LXRgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0J/QvtC00LrQu9GO0YfQtdC90LjQtSDQuiDRg9C00LDQu9C10L3QvdC+0LzRgyDQvNC+0L3QuNGC0L7RgNGDIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zaS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNpL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTVjZTUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNpL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuC2tOC2r+C3iuC2sOC2reC3kuC2uiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgtovgtrTgt4/gtoLgtpwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgt4Dgt5Lgtprgt4/gt4Eg4La24Lec4Lat4LeK4Lat4La4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4LeA4LeS4Laa4LeP4LeBIOC2tuC3nOC2reC3iuC2reC2uC4g4LeA4LeS4LeD4Lax4LeK4Law4LeSIOC2muC2u+C2sSDgtr3gtq/gt5MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuC3gOC3kuC2muC3j+C3gSDgtrbgt5zgtq3gt4rgtq3gtrgg4LeD4La44LeK4La24Lax4LeK4LawIOC2muC2u+C2uOC3kuC2seC3iiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgt4Dgt5Lgtprgt4/gt4Eg4La24Lec4Lat4LeK4Lat4La4IOC3g+C2uOC3iuC2tuC2seC3iuC2sCDgtprgtrvgtrEg4La94Lav4LeTIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuC3gOC3kuC2muC3j+C3geC2uiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuC2i+C2tOC3j+C2guC2nCDgt4Pgt5ngt4Dgt5PgtrgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LeA4LeS4LeD4Lax4LeK4Law4LeSIOC2muC2u+C2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuC3gOC3kuC2muC3j+C3gSDgtprgt5Lgtrvgt5Pgtrgg4Lax4Lat4La7IOC2muC2u+C2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4LeA4LeD4Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Law4LeP4LeA4Lax4La6IOC2muC2u+C2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4LeA4LeS4La74LeP4La4IOC2nOC2seC3iuC3gOC2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuC2seC2reC2uyDgtprgtrvgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgtq/gt5Lgtpwg4LeE4La74LeS4Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgt4Tgtprgt5Tgt4XgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgtofgtr3gt4rgtrbgtrgg4Laa4La94LeP4LeAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuC3hOC2rCDgtrTgtrvgt5Lgtrjgt48g4LeD4LeK4La94La64LeS4Lap4La74La6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgtrjgt4/gtrDgt4rigI3gtrrgtrog4Lat4Led4La74LePIOC2seC3kOC2rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4La94La24LePIOC2nOC2rSDgt4Tgt5Dgtprgt5Ig4Lat4Lec4La74Lat4LeU4La74LeUIOC2seC3nOC2uOC3kOC2rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LeA4LeS4Laa4LeP4LeBIOC2reC3kuC2u+C2uiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2svc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU4YWExMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0w6ltIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlphcmlhZGVuaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJUbGHEjWlkbG8gcHJlbm9zdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlRsYcSNaWRsbyBwcmVub3N1LiBPZHBvamVuw6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlRsYcSNaWRsbyBwcmVub3N1LiBQcmlww6FqYSBzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJUbGHEjWlkbG8gcHJlbm9zdS4gUHJpcG9qZW7DqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcmVub3MgZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJIxL5hZGFqw7ogc2EgemFyaWFkZW5pYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPZHBvamnFpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ilphc3RhdmnFpSBwcmVuw6HFoWFuaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphdnJpZcWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHJlaHJhxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBvemFzdGF2acWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmFzdGF2acWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUm96YmFsacWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJaYmFsacWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iT2Jyw6F6b2sgYWxidW11Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlBvc8O6dmHEjSBobGFzaXRvc3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWUgc8O6IHZ5YnJhbsOpIMW+aWFkbmUgbcOpZGnDoSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmllIHPDuiBrwqBkaXNwb3rDrWNpaSDFvmlhZG5lIGluZm9ybcOhY2llIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQcmVuw6HFoWEgc2Egb2JyYXpvdmthIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zbC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNsL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2E0Y2U0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNsL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJOYXByYXZlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iR3VtYiB6YSBwcmVkdmFqYW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Ikd1bWIgemEgcHJlZHZhamFuamUuIFBvdmV6YXZhIGplIHByZWtpbmplbmEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJHdW1iIHphIHByZWR2YWphbmplLiBWenBvc3RhdmxqYW5qZSBwb3ZlemF2ZS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iR3VtYiB6YSBwcmVkdmFqYW5qZS4gUG92ZXphdmEgamUgdnpwb3N0YXZsamVuYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUHJlZHZhamFuamUgcHJlazoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJJc2thbmplIG5hcHJhdiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQcmVraW5pIHBvdmV6YXZvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iVXN0YXZpIHByZWR2YWphbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXByaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlByZWR2YWphbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJaYXVzdGF2aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlVzdGF2aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlJhesWhaXJpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTdHJuaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik5hc2xvdm5pY2EgYWxidW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkRyc25payB6YSBnbGFzbm9zdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmkgaXpicmFuZSBwcmVkc3Rhdm5vc3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJQb2RhdGtpIG5pc28gbmEgdm9sam8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlByZWR2YWphbmplIHphc2xvbmEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNxL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Evc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNmUxMTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Evc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJQYWppc2pldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJ1dG9uaSBpIHRyYW5zbWV0aW1pdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJ1dG9uaSBpIHRyYW5zbWV0aW1pdC4gSmUgaSBzaGvDq3B1dHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCdXRvbmkgaSB0cmFuc21ldGltaXQuIFBvIGxpZGhldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCdXRvbmkgaSB0cmFuc21ldGltaXQuIEplIGkgbGlkaHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYW5zbWV0byB0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlBvIGvDq3Jrb24gcGFqaXNqZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJTaGvDq3B1dGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJOZGFsbyB0cmFuc21ldGltaW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ik1ieWxsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTHVhaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1esOrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iTmRhbG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJaZ2plcm9qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUGFsb3NlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iS29wZXJ0aW5hIGUgYWxidW1pdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJScsOrc2hxaXTDq3NpIGkgdm9sdW1pdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTnVrIHUgemdqb2RoIGFzbmrDqyBtZWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTnVrIGplcGV0IGFzbmrDqyBpbmZvcm1hY2lvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUG8gdHJhbnNtZXRvbiBla3JhbmluIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zci9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWFiYWQ1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0LjRgdGC0LXQvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQo9GA0LXRktCw0ZjQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCU0YPQs9C80LUg0J/RgNC10LHQsNGG0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQlNGD0LPQvNC1INCf0YDQtdCx0LDRhtC4LiDQktC10LfQsCDRmNC1INC/0YDQtdC60LjQvdGD0YLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0JTRg9Cz0LzQtSDQn9GA0LXQsdCw0YbQuC4g0J/QvtCy0LXQt9GD0ZjQtSDRgdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCU0YPQs9C80LUg0J/RgNC10LHQsNGG0LguINCf0L7QstC10LfQsNC9INGY0LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0J/RgNC10LHQsNGG0YPRmCDQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0J/RgNC+0L3QsNC70LDQttC10ZrQtSDRg9GA0LXRktCw0ZjQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQn9GA0LXQutC40L3QuCDQstC10LfRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCX0LDRg9GB0YLQsNCy0Lgg0L/RgNC10LHQsNGG0LjQstCw0ZrQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNGC0LLQvtGA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQn9GD0YHRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQn9Cw0YPQt9C40YDQsNGYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0JfQsNGD0YHRgtCw0LLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCf0YDQvtGI0LjRgNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQodC60YPQv9C4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0J7QvNC+0YIg0LDQu9Cx0YPQvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCa0LvQuNC30LDRhyDQt9CwINGY0LDRh9C40L3RgyDQt9Cy0YPQutCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQndC10LzQsCDQuNC30LDQsdGA0LDQvdC40YUg0LzQtdC00LjRmNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndC40YHRgyDQtNC+0YHRgtGD0L/QvdC1INC90LjQutCw0LrQstC1INC40L3RhNC+0YDQvNCw0YbQuNGY0LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCf0YDQtdCx0LDRhtGD0ZjQtSDRgdC1INC10LrRgNCw0L0iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhN2QzZTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkVuaGV0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LWtuYXBwZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0LWtuYXBwZW4uIEZyw6Vua29wcGxhZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdC1rbmFwcGVuLiBBbnNsdXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LWtuYXBwZW4uIEFuc2x1dGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3RhIHRpbGwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMZXRhciBlZnRlciBlbmhldGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IktvcHBsYSBmcsOlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlNsdXRhIGNhc3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJTdMOkbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJTcGVsYSB1cHAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQXZicnl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVXTDtmthIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJLb21wcmltZXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iU2tpdm9tc2xhZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x5bXJlZ2xhZ2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkluZ2EgbWVkaWEgaGFyIHZhbHRzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJEZXQgZmlubnMgaW5nZW4gaW5mb3JtYXRpb24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNrw6RybWVuIGNhc3RhcyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3cvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU2MmNiMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJNZnVtbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJWaWZhYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IktpdHVmZSBjaGEga3V0dW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iS2l0dWZlIGNoYSBrdXR1bWEuIEtpbWVvbmRvbGV3YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iS2l0dWZlIGNoYSBrdXR1bWEuIEtpbmF1bmdhbmlzaGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iS2l0dWZlIGNoYSBrdXR1bWEuIEtpbWV1bmdhbmlzaHdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlR1bWEga3dlbnllIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iSW5hdGFmdXRhIHZpZmFhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ik9uZG9hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQWNoYSBrdXR1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZ1bmdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iQ2hlemEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlNpdGlzaGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTaW1hbWlzaGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQYW51YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iS3VuamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJTYW5hYSB5YSBhbGJhbXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iS2l0ZWxlemkgY2hhIHNhdXRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJIYWt1bmEgbWF1ZGh1aSB5YWxpeW9jaGFndWxpd2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ikhha3VuYSBtYWVsZXpvIHlhbGl5b3BhdGlrYW5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJJbmF0dW1hIHNrcmluaSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDQyMzQ4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NjAwZHAvZGltZW5zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtYWpvciBheGlzCi0gICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBsYW5kc2NhcGUpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yIj42MCU8L2l0ZW0+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWlub3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gcG9ydHJhaXQpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21pbm9yIj45MCU8L2l0ZW0+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NzIwZHAvZGltZW5zLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NzIwZHAvZGltZW5zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0YWI4ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdzcyMGRwL2RpbWVucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWFqb3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gbGFuZHNjYXBlKS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+Ci0gICAgPGl0ZW0gdHlwZT0iZGltZW4iIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9tYWpvciI+NTAlPC9pdGVtPgotICAgIDwhLS0gVGhlIHBsYXRmb3JtJ3MgZGVzaXJlZCBmaXhlZCB3aWR0aCBmb3IgYSBkaWFsb2cgYWxvbmcgdGhlIG1pbm9yIGF4aXMKLSAgICAgICAgICh0aGUgc2NyZWVuIGlzIGluIHBvcnRyYWl0KS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+Ci0gICAgPGl0ZW0gdHlwZT0iZGltZW4iIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9taW5vciI+NzAlPC9pdGVtPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10YS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRhL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTk3OGYzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRhL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCumuCuv+CuuOCvjeCun+CuruCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgrprgrr7grqTgrqngrpngr43grpXgrrPgr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgrqTgrr/grrDgr4jgrq/grr/grp/gr4Eg4K6q4K6f4K+N4K6f4K6p4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4K6F4K6p4K+B4K6q4K+N4K6q4K+B4K6k4K6y4K+NIOCuquCviuCupOCvjeCupOCuvuCuqeCvjS4g4K6k4K+B4K6j4K+N4K6f4K6/4K6V4K+N4K6V4K6q4K+N4K6q4K6f4K+N4K6f4K6k4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgroXgrqngr4Hgrqrgr43grqrgr4HgrqTgrrLgr40g4K6q4K+K4K6k4K+N4K6k4K6+4K6p4K+NLiDgrofgrqPgr4jgrpXgr43grpXgrr/grrHgrqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4K6F4K6p4K+B4K6q4K+N4K6q4K+B4K6k4K6y4K+NIOCuquCviuCupOCvjeCupOCuvuCuqeCvjS4g4K6H4K6j4K+I4K6V4K+N4K6V4K6q4K+N4K6q4K6f4K+N4K6f4K6k4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCuh+CupOCuseCvjeCuleCvgSDgroXgrqngr4Hgrqrgr43grqrgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgrprgrr7grqTgrqngrpngr43grpXgrrPgr4jgrqTgr40g4K6k4K+H4K6f4K+B4K6V4K6/4K6x4K6k4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCupOCviuCun+CusOCvjeCuquCviOCupOCvjSDgrqTgr4HgrqPgr43grp/grr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgroXgrqngr4Hgrqrgr43grqrgr4HgrrXgrqTgr4gg4K6o4K6/4K6x4K+B4K6k4K+N4K6k4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgrq7gr4Lgrp/gr4Hgrq7gr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgrofgrq/grpXgr43grpXgr4Hgrq7gr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCuh+Cun+CviOCuqOCuv+CuseCvgeCupOCvjeCupOCvgeCuruCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCuqOCuv+CuseCvgeCupOCvjeCupOCvgeCuteCupOCuseCvjeCuleCuvuCuqSDgrqrgr4rgrqTgr43grqTgrr7grqngr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgrrXgrr/grrDgrr/grrXgrr7grpXgr43grpXgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCumuCvgeCusOCvgeCuleCvjeCuleCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCuhuCusuCvjeCuquCuruCvjSDgrobgrrDgr43grp/gr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4K6S4K6y4K6/4K6v4K6z4K614K+BIOCuuOCvjeCusuCviOCun+CusOCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4K6u4K+A4K6f4K6/4K6v4K6+IOCujuCupOCvgeCuteCvgeCuruCvjSDgrqTgr4fgrrDgr43grqjgr43grqTgr4bgrp/gr4HgrpXgr43grpXgrqrgr43grqrgrp/grrXgrr/grrLgr43grrLgr4giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCupOCuleCuteCusuCvjSDgro7grqTgr4HgrrXgr4Hgrq7grr/grrLgr43grrLgr4giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCupOCuv+CusOCviOCur+CviCDgroXgrqngr4Hgrqrgr43grqrgr4HgrpXgrr/grrHgr4DgrrDgr43grpXgrrPgr40iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRlL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMzEyZTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4LC44LC/4LC44LGN4LCf4LCu4LGNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCwquCwsOCwv+CwleCwsOCwvuCwsuCxgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCwquCxjeCwsOCwuOCwvuCwsOCwgiDgsJrgsYfgsK/gsL8g4LCs4LCf4LCo4LGNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4LCq4LGN4LCw4LC44LC+4LCwIOCwrOCwn+CwqOCxjS4g4LCh4LC/4LC44LGN4oCM4LCV4LCo4LGG4LCV4LGN4LCf4LGNIOCwmuCxh+Cwr+CwrOCwoeCwv+CwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4LCq4LGN4LCw4LC44LC+4LCwIOCwrOCwn+CwqOCxjS4g4LCV4LCo4LGG4LCV4LGN4LCf4LGNIOCwmuCxh+CwuOCxjeCwpOCxi+CwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgsKrgsY3gsLDgsLjgsL7gsLAg4LCs4LCf4LCo4LGNLiDgsJXgsKjgsYbgsJXgsY3gsJ/gsY0g4LCa4LGH4LCv4LCs4LCh4LC/4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCwpuCxgOCwqOCwv+CwleCwvyDgsKrgsY3gsLDgsLjgsL7gsLDgsIIg4LCa4LGH4LCv4LCC4LCh4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4LCq4LCw4LC/4LCV4LCw4LC+4LCy4LCo4LGBIOCwleCwqOCxgeCwl+CxiuCwguCwn+Cxi+CwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgsKHgsL/gsLjgsY3igIzgsJXgsKjgsYbgsJXgsY3gsJ/gsY0g4LCa4LGH4LCv4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4LCq4LGN4LCw4LC44LC+4LCw4LC+4LCo4LGN4LCo4LC/IOCwhuCwquCwv+CwteCxh+Cwr+CwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4LCu4LGC4LC44LC/4LC14LGH4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4LCq4LGN4LCy4LGHIOCwmuCxh+CwuOCxjeCwpOCxgeCwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4LCq4LC+4LCc4LGNIOCwmuCxh+CwuOCxjeCwpOCxgeCwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCwhuCwquCwv+CwteCxh+Cwr+CwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCwteCwv+CwuOCxjeCwpOCwsOCwv+CwguCwquCwnOCxh+CwuOCxjeCwpOCxgeCwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4LCV4LGB4LCm4LC/4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4LCG4LCy4LGN4LCs4LCu4LGNIOCwhuCwsOCxjeCwn+CxjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgsLXgsL7gsLLgsY3gsK/gsYLgsK7gsY0g4LC44LGN4LCy4LCv4LC/4LCh4LCw4LGNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgsK7gsYDgsKHgsL/gsK/gsL4g4LCP4LCm4LGAIOCwjuCwguCwmuCxgeCwleCxi+CwrOCwoeCwsuCxh+CwpuCxgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4LC44LCu4LC+4LCa4LC+4LCw4LCCIOCwheCwguCwpuCxgeCwrOCwvuCwn+CxgeCwsuCxiyDgsLLgsYfgsKbgsYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCwuOCxjeCwleCxjeCwsOCxgOCwqOCxjeKAjOCwqOCxgSDgsKrgsY3gsLDgsLjgsL7gsLDgsIIg4LCa4LGH4LC44LGN4LCk4LGL4LCC4LCm4LC/Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10aC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmE4YWU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuC4o+C4sOC4muC4miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLguK3guLjguJvguIHguKPguJPguYwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLguJvguLjguYjguKEgXCLguYHguITguKrguJXguYxcIiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuC4m+C4uOC5iOC4oSBcIuC5geC4hOC4quC4leC5jFwiIOC4ouC4geC5gOC4peC4tOC4geC4geC4suC4o+C5gOC4iuC4t+C5iOC4reC4oeC4leC5iOC4rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4Lib4Li44LmI4LihIFwi4LmB4LiE4Liq4LiV4LmMXCIg4LiB4Liz4Lil4Lix4LiH4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4LitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuC4m+C4uOC5iOC4oSBcIuC5geC4hOC4quC4leC5jFwiIOC5gOC4iuC4t+C5iOC4reC4oeC4leC5iOC4reC5geC4peC5ieC4pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLguYHguITguKrguJXguYzguYTguJvguKLguLHguIciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLguIHguLPguKXguLHguIfguITguYnguJnguKvguLLguK3guLjguJvguIHguKPguJPguYwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Lii4LiB4LmA4Lil4Li04LiB4LiB4Liy4Lij4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4LitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4Lir4Lii4Li44LiU4LmB4LiE4Liq4LiV4LmMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLguJvguLTguJQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLguYDguKXguYjguJkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuC4q+C4ouC4uOC4lOC4iuC4seC5iOC4p+C4hOC4o+C4suC4pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuC4q+C4ouC4uOC4lCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC4guC4ouC4suC4oiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Lii4Li44LiaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4Lib4LiB4Lit4Lix4Lil4Lia4Lix4LmJ4LihIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuC5geC4luC4muC5gOC4peC4t+C5iOC4reC4meC4m+C4o+C4seC4muC4o+C4sOC4lOC4seC4muC5gOC4quC4teC4ouC4hyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4LmE4Lih4LmI4LmE4LiU4LmJ4LmA4Lil4Li34Lit4LiB4Liq4Li34LmI4Lit4LmE4Lin4LmJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLguYTguKHguYjguKHguLXguILguYnguK3guKHguLnguKUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuC4geC4s+C4peC4seC4h+C5geC4hOC4quC4leC5jOC4q+C4meC5ieC4suC4iOC4rSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10bC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThiZTNkMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10bC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iTWdhIERldmljZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJ1dHRvbiBuYSBJLWNhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCdXR0b24gbmEgSS1jYXN0LiBOYWRpc2tvbmVrdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJ1dHRvbiBuYSBJLWNhc3QuIEt1bW9rb25la3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJ1dHRvbiBuYSBJLWNhc3QuIE5ha2Frb25la3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkktY2FzdCBzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Ik5hZ2hhaGFuYXAgbmcgbWdhIGRldmljZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJJZGlza29uZWt0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkloaW50byBhbmcgcGFnLWNhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IklzYXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iSS1wbGF5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJJLXBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iSWhpbnRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUGFsYXdha2luIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJJLWNvbGxhcHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW0gYXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlNsaWRlciBuZyB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IldhbGFuZyBwaW5pbGluZyBtZWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iV2FsYW5nIGF2YWlsYWJsZSBuYSBpbXBvcm1hc3lvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iS2luYS1jYXN0IGFuZyBzY3JlZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZjYzOTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkNpaGF6bGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iWWF5xLFubGEgZMO8xJ9tZXNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iWWF5xLFubGEgZMO8xJ9tZXNpLiBCYcSfbGFudMSxIGtlc2lsZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IllhecSxbmxhIGTDvMSfbWVzaS4gQmHEn2xhbsSxeW9yIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IllhecSxbmxhIGTDvMSfbWVzaS4gQmHEn2xhbmTEsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLFnnVyYXlhIHlhecSxbmxhOiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkNpaGF6bGFyIGJ1bHVudXlvciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJCYcSfbGFudMSxecSxIGtlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IllhecSxbsSxIGR1cmR1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iS2FwYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJPeW5hdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iRHVyYWtsYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEdXJkdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJHZW5pxZ9sZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkRhcmFsdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYsO8bSBrYXBhxJ/EsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTZXMgZMO8emV5aSBrYXlkxLFybWEgw6d1YnXEn3UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik1lZHlhIHNlw6dpbG1lZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkJpbGdpIHlvayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRWtyYW4geWF5xLFubGFuxLF5b3IiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXVrL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZDM2NWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0J/RgNC40YHRgtGA0L7RlyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0ZbRlyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0ZbRly4g0JLRltC04oCZ0ZTQtNC90LDQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGW0ZcuINCf0ZbQtOKAmdGU0LTQvdCw0L3QvdGPIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0ZbRly4g0J/RltC04oCZ0ZTQtNC90LDQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCi0YDQsNC90YHQu9GO0LLQsNGC0Lgg0L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCf0L7RiNGD0Log0L/RgNC40YHRgtGA0L7Rl9CyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCS0ZbQtNC60LvRjtGH0LjRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0J/RgNC40L/QuNC90LjRgtC4INGC0YDQsNC90YHQu9GP0YbRltGOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0LrRgNC40YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCS0ZbQtNGC0LLQvtGA0LjRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQn9GA0LjQt9GD0L/QuNC90LjRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0J/RgNC40L/QuNC90LjRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0KDQvtC30LPQvtGA0L3Rg9GC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCX0LPQvtGA0L3Rg9GC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQntCx0LrQu9Cw0LTQuNC90LrQsCDQsNC70YzQsdC+0LzRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQn9C+0LLQt9GD0L3QvtC6INCz0YPRh9C90L7RgdGC0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCc0LXQtNGW0LAt0YTQsNC50Lsg0L3QtSDQstC40LHRgNCw0L3QviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0J3QtdC80LDRlCDQtNCw0L3QuNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQotGA0LDQvdGB0LvRj9GG0ZbRjyDQtdC60YDQsNC90LAiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXVyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMmM1OTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i2LPYs9m52YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i2KLZhNin2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLaqdin2LPZuSDaqdix2YbbkiDaqdinINio2bnZhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Itqp2KfYs9m5INqp2LHZhtuSINqp2Kcg2KjZudmG25Qg2LrbjNixINmF2YbYs9mE2qkg24HbkiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i2qnYp9iz2bkg2qnYsdmG25Ig2qnYpyDYqNm52YbblCDZhdmG2LPZhNqpINuB2Ygg2LHbgdinINuB25IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i2qnYp9iz2bkg2qnYsdmG25Ig2qnYpyDYqNm52YbblCDZhdmG2LPZhNqpINuB25IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i2KfYsyDZhduM2rog2qnYp9iz2bkg2qnYsduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLYotmE2KfYqiDYqtmE2KfYtCDbgdmIINix24HbkiDbgduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i2LrbjNixINmF2YbYs9mE2qkg2qnYsduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLaqdin2LPZuSDaqdix2YbYpyDYqNmG2K8g2qnYsduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Itio2YbYryDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItqG2YTYp9im24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i2YXZiNmC2YjZgSDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Itix2YjaqduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLZvtq+24zZhNin2KbbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLYs9qp24zakduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLYp9mE2KjZhSDYotix2bkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i2YjYp9mE24zZiNmFINiz2YTYp9im24zaiNixIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLaqdmI2KbbjCDZhduM2ojbjNinINmF2YbYqtiu2Kgg2YbbgduM2rog24HbkiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i2qnZiNim24wg2YXYudmE2YjZhdin2Kog2K/Ys9iq24zYp9ioINmG24HbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLYs9qp2LHbjNmGINqp2KfYs9m5INuB2Ygg2LHbgduMINuB25IiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXV6L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXovc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYTA4MTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXovc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iVGl6aW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iUXVyaWxtYWxhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlRyYW5zbGF0c2l5YSB0dWdtYXNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVHJhbnNsYXRzaXlhIHR1Z21hc2kuIFV6aWxkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVHJhbnNsYXRzaXlhIHR1Z21hc2kuIFVsYW5tb3FkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJUcmFuc2xhdHNpeWEgdHVnbWFzaS4gVWxhbmRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlF1eWlkYWdpZ2EgdHJhbnNsYXRzaXlhIHFpbGlzaDoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJRdXJpbG1hbGFybmkgdG9waXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlVsYW5pc2huaSB1emlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlRyYW5zbGF0c2l5YW5pIHRv4oCYeHRhdGlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWW9waXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iQm9zaGxhc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlRv4oCYeHRhdGliIHR1cmlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlRv4oCYeHRhdGlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IllveWlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iWWln4oCYaXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxib20gbXVxb3Zhc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVG92dXNoIGJhbGFuZGxpZ2kgc2xheWRlcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik11bHRpbWVkaWEgdGFubGFtYWdhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iSGVjaCBxYW5kYXkgbWHigJlsdW1vdCB5b+KAmHEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVrcmFubmkgdHJhbnNsYXRzaXlhIHFpbGlzaCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdmkvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy12aS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA5OGNjYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy12aS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJI4buHIHRo4buRbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVGhp4bq/dCBi4buLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iTsO6dCB0cnV54buBbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Ik7DunQgdHJ1eeG7gW4uIMSQw6Mgbmfhuq90IGvhur90IG7hu5FpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJOw7p0IHRydXnhu4FuLiDEkGFuZyBr4bq/dCBu4buRaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJOw7p0IHRydXnhu4FuLiDEkMOjIGvhur90IG7hu5FpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRydXnhu4FuIHThu5tpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4ixJBhbmcgdMOsbSB0aGnhur90IGLhu4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iTmfhuq90IGvhur90IG7hu5FpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iROG7q25nIHRydXnhu4FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLEkMOzbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQaMOhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iVOG6oW0gZOG7q25nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iROG7q25nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTeG7nyBy4buZbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlRodSBn4buNbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuG6om5oIGLDrGEgYWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVGhhbmggdHLGsOG7o3Qgw6JtIGzGsOG7o25nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJLaMO0bmcgY8OzIHBoxrDGoW5nIHRp4buHbiBuw6BvIMSRxrDhu6NjIGNo4buNbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iS2jDtG5nIGPDsyB0aMO0bmcgdGluIG7DoG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IsSQYW5nIHRydXnhu4FuIG3DoG4gaMOsbmgiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUyMmQwMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i57O757ufIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuiuvuWkhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuaKleWwhOaMiemSriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuaKleWwhOaMiemSruOAguW3suaWreW8gOi/nuaOpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i5oqV5bCE5oyJ6ZKu44CC5q2j5Zyo6L+e5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuaKleWwhOaMiemSruOAguW3sui/nuaOpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLmipXlsITliLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLmraPlnKjmn6Xmib7orr7lpIciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i5pat5byA6L+e5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i5YGc5q2i5oqV5bCEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLlhbPpl60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLmkq3mlL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuaaguWBnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuWBnOatoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuWxleW8gCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i5pS26LW3Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i5LiT6L6R5bCB6Z2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Iumfs+mHj+a7keWdlyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i5pyq6YCJ5oup5Lu75L2V5aqS5L2TIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLmsqHmnInku7vkvZXnm7jlhbPkv6Hmga8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Iuato+WcqOaKleWwhOWxj+W5lSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckhLL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckhLL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTZlNWMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJISy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLns7vntbEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i6KOd572uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i5oqV5pS+5oyJ6YiVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i5oqV5pS+5oyJ6YiV44CC5bey6Kej6Zmk6YCj5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLmipXmlL7mjInpiJXjgILmraPlnKjpgKPmjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i5oqV5pS+5oyJ6YiV44CC5bey6YCj5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuaKleaUvuiHsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuato+WcqOWwi+aJvuijnee9riI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLkuK3mlrfpgKPnt5oiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLlgZzmraLmipXmlL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IumXnOmWiSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuaSreaUviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i5pqr5YGcIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i5bGV6ZaLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLmlLblkIgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLlsIjovK/lsIHpnaIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i6Z+z6YeP5ruR5qG/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLlsJrmnKrpgbjmk4flqpLpq5QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Iuaykuacieips+e0sOizh+aWmSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i5q2j5Zyo5oqV5pS+6J6i5bmVIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYWZkZTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Iuezu+e1sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLoo53nva4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLmipXmlL7mjInpiJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLmipXmlL7mjInpiJXvvJvlt7LkuK3mlrfpgKPnt5oiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuaKleaUvuaMiemIle+8m+mAo+e3muS4rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLmipXmlL7mjInpiJXvvJvlt7LpgKPnt5oiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i5oqV5pS+5YiwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i5q2j5Zyo5bCL5om+6KOd572uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuS4reaWt+mAo+e3miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuWBnOatouaKleaUviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i6Zec6ZaJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i5pKt5pS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLmmqvlgZwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLlgZzmraIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLlsZXplosiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuaUtuWQiCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuWwiOi8r+WwgemdoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLpn7Pph4/mu5Hmob8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuacqumBuOWPluS7u+S9leWqkumrlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i5rKS5pyJ5Y+v55So55qE6LOH6KiKIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLmraPlnKjmipXmlL7onqLluZUiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXp1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMDdjNDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iSXNpc3RpbXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQW1hZGl2YXlpc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJJbmtpbm9iaG8geWUtQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Iklua2lub2JobyB5b2t1c2FrYXphLiBLdW5xYW55dWxpd2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Iklua2lub2JobyB5b2t1c2FrYXphLiBLdXlheGh1bnl3YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJJbmtpbm9iaG8geW9rdXNha2F6YS4gS3V4aHVueWl3ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTYWthemEga3UtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iSXRob2xhIGFtYWRpdmF5aXNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ik5xYW11bGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJNaXNhIHVrdXNha2F6YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iVmFsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkRsYWxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJNaXNhIGlzaWtoYXNoYW5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iTWlzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ik53ZWJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJHb3FhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iVWJ1Y2lrbyBiZS1hbGJoYW11Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IklzaWxheWlkYSBzZXZvbHVtdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iQXlpa2hvIGltaWRpeWEgZWtoZXRoaXdlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJBbHVraG8gdWx3YXppIG9sdXRob2xha2FsYXlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJJc2lrcmluaSBzb2t1c2FrYXphIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hcnJheXMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvYXJyYXlzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4NzMyMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hcnJheXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDxpbnRlZ2VyLWFycmF5IG5hbWU9InNwZWVkX211bHRpcGxpZWRfYnlfMTAwIj4KLSAgICAgICAgPGl0ZW0+MjU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjUwPC9pdGVtPgotICAgICAgICA8aXRlbT43NTwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MTAwPC9pdGVtPgotICAgICAgICA8aXRlbT4xMjU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjE1MDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MjAwPC9pdGVtPgotICAgIDwvaW50ZWdlci1hcnJheT4KLTwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2F0dHJzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2F0dHJzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3Mjg1Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hdHRycy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9Ik1lZGlhUm91dGVCdXR0b24iPgotICAgICAgICA8IS0tIFRoaXMgZHJhd2FibGUgaXMgYSBzdGF0ZSBsaXN0IHdoZXJlIHRoZSAiY2hlY2tlZCIgc3RhdGUKLSAgICAgICAgICAgICBpbmRpY2F0ZXMgYWN0aXZlIG1lZGlhIHJvdXRpbmcuICBDaGVja2FibGUgaW5kaWNhdGVzIGNvbm5lY3RpbmcKLSAgICAgICAgICAgICBhbmQgbm9uLWNoZWNrZWQgLyBub24tY2hlY2thYmxlIGluZGljYXRlcwotICAgICAgICAgICAgIHRoYXQgbWVkaWEgaXMgcGxheWluZyB0byB0aGUgbG9jYWwgZGV2aWNlIG9ubHkuIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJleHRlcm5hbFJvdXRlRW5hYmxlZERyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgPCEtLSBUaW50IHRvIGFwcGx5IHRvIHRoZSBtZWRpYSByb3V0ZSBidXR0b24gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVCdXR0b25UaW50IiBmb3JtYXQ9ImNvbG9yIiAvPgotCi0gICAgICAgIDxhdHRyIG5hbWU9ImFuZHJvaWQ6bWluV2lkdGgiIC8+Ci0gICAgICAgIDxhdHRyIG5hbWU9ImFuZHJvaWQ6bWluSGVpZ2h0IiAvPgotICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+Ci0KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlQnV0dG9uU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVDbG9zZURyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlUGF1c2VEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZURlZmF1bHRJY29uRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVUdkljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJJY29uRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVTcGVha2VyR3JvdXBJY29uRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotCi0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVRoZW1lIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2NvbG9ycy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YmMyOTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8Y29sb3IgbmFtZT0iZ3JheSI+IzgwODA4MDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9IndoaXRlIj4jZmZmZmZmPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0id2hpdGVfb3BhY2l0eV83MCI+I0IzZmZmZmZmPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0iYmxhY2tfb3BhY2l0eV83MCI+I0IzMDAwMDAwPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0idGl0bGVfYmFyX2dyYWRpZW50X3N0YXJ0Ij4jNTAwMDAwMDA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJ0aXRsZV9iYXJfZ3JhZGllbnRfZW5kIj4jMDAwMDAwMDA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJib3R0b21fYmFyX2JhY2tncm91bmQiPiM0MDIwMjAyMDwvY29sb3I+Ci08L3Jlc291cmNlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ3YjAyMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDwhLS0gRGlhbG9nIHNpemUgLS0+Ci0gICAgPGVhdC1jb21tZW50IC8+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWFqb3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gbGFuZHNjYXBlKS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9tYWpvciI+MzIwZHA8L2RpbWVuPgotICAgIDwhLS0gVGhlIHBsYXRmb3JtJ3MgZGVzaXJlZCBmaXhlZCB3aWR0aCBmb3IgYSBkaWFsb2cgYWxvbmcgdGhlIG1pbm9yIGF4aXMKLSAgICAgICAgICh0aGUgc2NyZWVuIGlzIGluIHBvcnRyYWl0KS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9taW5vciI+MzIwZHA8L2RpbWVuPgotCi0gICAgPCEtLSBNZWRpYVJvdXRlQ29udHJvbGxlcidzIHZvbHVtZSBncm91cCBsaXN0IC0tPgotICAgIDxlYXQtY29tbWVudCAvPgotICAgIDwhLS0gTWF4aW11bSBoZWlnaHQgb2Ygdm9sdW1lIGdyb3VwIGxpc3QuIC0tPgotICAgIDxkaW1lbiBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X21heF9oZWlnaHQiPjI4OGRwPC9kaW1lbj4KLSAgICA8IS0tIEhlaWdodCBvZiB2b2x1bWUgZ3JvdXAgaXRlbS4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9oZWlnaHQiPjY4ZHA8L2RpbWVuPgotICAgIDwhLS0gU2l6ZSBvZiBhbiBpdGVtJ3MgaWNvbi4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9pY29uX3NpemUiPjI0ZHA8L2RpbWVuPgotCi0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfcGFkZGluZ190b3AiPjE2ZHA8L2RpbWVuPgotICAgIDwhLS0gR3JvdXAgbGlzdCBleHBhbmQvY29sbGFwc2UgYW5pbWF0aW9uIGR1cmF0aW9uLiAtLT4KLSAgICA8aW50ZWdlciBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2FuaW1hdGlvbl9kdXJhdGlvbl9tcyI+NDAwPC9pbnRlZ2VyPgotICAgIDwhLS0gR3JvdXAgbGlzdCBmYWRlIGluIGFuaW1hdGlvbiBkdXJhdGlvbi4gLS0+Ci0gICAgPGludGVnZXIgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9mYWRlX2luX2R1cmF0aW9uX21zIj40MDA8L2ludGVnZXI+Ci0gICAgPCEtLSBHcm91cCBsaXN0IGZhZGUgb3V0IGFuaW1hdGlvbiBkdXJhdGlvbi4gLS0+Ci0gICAgPGludGVnZXIgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9mYWRlX291dF9kdXJhdGlvbl9tcyI+MjAwPC9pbnRlZ2VyPgotCi0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3Nfd2lkdGgiPjE1MGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiPjM2ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX2ljb25fc2l6ZSI+MjBkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfdGV4dF9oZWlnaHQiPjE4ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX21haW5fdGV4dF9zaXplIj4xMnNwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19zdWJfdGV4dF9zaXplIj4xMHNwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX3dpZHRoIj4yMjVkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiPjU0ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIj4zMGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX3RleHRfaGVpZ2h0Ij4yN2RwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX21haW5fdGV4dF9zaXplIj4xNnNwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX3N1Yl90ZXh0X3NpemUiPjEzc3A8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX3NldHRpbmdzX29mZnNldCI+OGRwPC9kaW1lbj4KLQotICAgIDxkaW1lbiBuYW1lPSJtY3YyX3RyYW5zcG9ydF9jb250cm9sc19wYWRkaW5nIj40ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX3BhdXNlX2ljb25fc2l6ZSI+MzZkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9pY29uX3NpemUiPjI4ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX2ljb25fc2l6ZSI+MjRkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfbWluaW1hbF9pY29uX3NpemUiPjI0ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2ljb25fbWFyZ2luIj4xMGRwPC9kaW1lbj4KLQotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSI+MjMyZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfYWxidW1faW1hZ2VfbGFuZHNjYXBlX3NpemUiPjE3NmRwPC9kaW1lbj4KLQotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2N1c3RvbV9wcm9ncmVzc19tYXhfc2l6ZSI+MmRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSI+MTJkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfYnVmZmVyX3ZpZXdfaGVpZ2h0Ij41ZHA8L2RpbWVuPgotICAgIDwhLS0gVE9ETzogYWRqdXN0IGJvdHRvbSBiYXIgdmlldyAtLT4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5N2EzYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLQotICAgIDwhLS0gTmFtZSBmb3IgdGhlIGRlZmF1bHQgc3lzdGVtIHJvdXRlIHByaW9yIHRvIEplbGx5YmVhbi4gW0NIQVIgTElNSVQ9MzBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiPlN5c3RlbTwvc3RyaW5nPgotCi0gICAgPCEtLSBOYW1lIGZvciB0aGUgdXNlciByb3V0ZSBjYXRlZ29yeSBjcmVhdGVkIHdoZW4gcHVibGlzaGluZyByb3V0ZXMgdG8gdGhlIHN5c3RlbSBpbiBKZWxseWJlYW4gYW5kIGFib3ZlLiBbQ0hBUiBMSU1JVD0zMF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiPkRldmljZXM8L3N0cmluZz4KLQotICAgIDwhLS0gU3RyaW5nIHRvIGJlIHNob3duIGFzIGEgdG9vbHRpcCBvZiBNZWRpYVJvdXRlQnV0dG9uCi0gICAgICAgIENhc3QgaXMgdGhlIHN0YW5kYXJkIGFuZHJvaWQgdmVyYiBmb3Igc2VuZGluZyBjb250ZW50IHRvIGEgcmVtb3RlIGRldmljZS4gW0NIQVIgTElNSVQ9NTBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iPkNhc3QgYnV0dG9uPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gb2YgYSBNZWRpYVJvdXRlQnV0dG9uIGZvciBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQgd2hlbiBubyByZW1vdGUgZGV2aWNlIGlzIGNvbm5lY3RlZC4KLSAgICAgICAgQ2FzdCBpcyB0aGUgc3RhbmRhcmQgYW5kcm9pZCB2ZXJiIGZvciBzZW5kaW5nIGNvbnRlbnQgdG8gYSByZW1vdGUgZGV2aWNlLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCI+Q2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZDwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIG9mIGEgTWVkaWFSb3V0ZUJ1dHRvbiBmb3IgYWNjZXNzaWJpbGl0eSBzdXBwb3J0IHdoaWxlIGNvbm5lY3RpbmcgdG8gYSByZW1vdGUgZGV2aWNlLgotICAgICAgICBDYXN0IGlzIHRoZSBzdGFuZGFyZCBhbmRyb2lkIHZlcmIgZm9yIHNlbmRpbmcgY29udGVudCB0byBhIHJlbW90ZSBkZXZpY2UuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyI+Q2FzdCBidXR0b24uIENvbm5lY3Rpbmc8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBvZiBhIE1lZGlhUm91dGVCdXR0b24gZm9yIGFjY2Vzc2liaWxpdHkgc3VwcG9ydCB3aGVuIGEgcmVtb3RlIGRldmljZSBpcyBjb25uZWN0ZWQuCi0gICAgICAgIENhc3QgaXMgdGhlIHN0YW5kYXJkIGFuZHJvaWQgdmVyYiBmb3Igc2VuZGluZyBjb250ZW50IHRvIGEgcmVtb3RlIGRldmljZS4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiPkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQ8L3N0cmluZz4KLQotICAgIDwhLS0gVGl0bGUgb2YgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLiBbQ0hBUiBMSU1JVD0zMF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIj5DYXN0IHRvPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgdG8gc2hvdyB3aGVuIG5vIGRldmljZXMgaGF2ZSBiZWVuIGZvdW5kLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyI+RmluZGluZyBkZXZpY2VzPC9zdHJpbmc+Ci0KLSAgICA8IS0tIEJ1dHRvbiB0byBkaXNjb25uZWN0IGZyb20gYSBtZWRpYSByb3V0ZS4gIFtDSEFSIExJTUlUPTMwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCI+RGlzY29ubmVjdDwvc3RyaW5nPgotCi0gICAgPCEtLSBCdXR0b24gdG8gc3RvcCBwbGF5YmFjayBhbmQgZGlzY29ubmVjdCBmcm9tIGEgbWVkaWEgcm91dGUuIFtDSEFSIExJTUlUPTMwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIj5TdG9wIGNhc3Rpbmc8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBkaWFsb2cgY2xvc2UgYnV0dG9uLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iPkNsb3NlPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogbWVkaWEgcGxheSBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5Ij5QbGF5PC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogbWVkaWEgcGF1c2UgYnV0dG9uLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiPlBhdXNlPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogbWVkaWEgc3RvcCBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIj5TdG9wPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogZ3JvdXAgZXhwYW5kIGJ1dHRvbi4gUHJlc3NpbmcgYnV0dG9uIHNob3dzIGdyb3VwIG1lbWJlcnMgb2YgYSBzZWxlY3RlZCByb3V0ZSBncm91cC4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCI+RXhwYW5kPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogZ3JvdXAgY29sbGFwc2UgYnV0dG9uLiBQcmVzc2luZyBidXR0b24gaGlkZXMgZ3JvdXAgbWVtYmVycyBvZiBhIHNlbGVjdGVkIHJvdXRlIGdyb3VwLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiPkNvbGxhcHNlPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogYWxidW0gYXJ0IGJ1dHRvbi4gQ2xpY2tpbmcgb24gdGhlIGFsYnVtIGFydCB0YWtlcyB1c2VyIHRvIGEgcHJlZGVmaW5lZCBhY3Rpdml0eSBwZXIgbWVkaWEgYXBwLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCI+QWxidW0gYXJ0PC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogdm9sdW1lIHNsaWRlci4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiPlZvbHVtZSBzbGlkZXI8L3N0cmluZz4KLQotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCB0byBzaG93IHdoZW4gbm8gbWVkaWEgaGF2ZSBiZWVuIHNlbGVjdGVkIGZvciBwbGF5YmFjay4gW0NIQVIgTElNSVQ9NTBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCI+Tm8gbWVkaWEgc2VsZWN0ZWQ8L3N0cmluZz4KLQotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCB0byBzaG93IHdoZW4gbm8gdGl0bGUvZGVzY3JpcHRpb24gaGF2ZSBiZWVuIGZvdW5kIGZvciBhIGdpdmVuIHNvbmcvdmlkZW8uIFtDSEFSIExJTUlUPTUwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiPk5vIGluZm8gYXZhaWxhYmxlPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIGlzIGN1cnJlbnRseSBjYXN0aW5nIHNjcmVlbi4gW0NIQVIgTElNSVQ9NTBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiI+Q2FzdGluZyBzY3JlZW48L3N0cmluZz4KLQotICAgIDwhLS0gVGV4dCBmb3IgZXJyb3IgYWxlcnQgd2hlbiBhIHZpZGVvIGNvbnRhaW5lciBpcyBub3QgdmFsaWQgZm9yIHByb2dyZXNzaXZlIGRvd25sb2FkL3BsYXliYWNrLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9IlZpZGVvVmlldzJfZXJyb3JfdGV4dF9pbnZhbGlkX3Byb2dyZXNzaXZlX3BsYXliYWNrIj5UaGlzIHZpZGVvIGlzblwndCB2YWxpZCBmb3Igc3RyZWFtaW5nIHRvIHRoaXMgZGV2aWNlLjwvc3RyaW5nPgotICAgIDwhLS0gVGV4dCBmb3IgZXJyb3IgYWxlcnQgd2hlbiBhIHZpZGVvIGNhbm5vdCBiZSBwbGF5ZWQuIEl0IGNhbiBiZSB1c2VkIGJ5IGFueSBhcHAuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iVmlkZW9WaWV3Ml9lcnJvcl90ZXh0X3Vua25vd24iPkNhblwndCBwbGF5IHRoaXMgdmlkZW8uPC9zdHJpbmc+Ci0gICAgPCEtLSBCdXR0b24gdG8gY2xvc2UgZXJyb3IgYWxlcnQgd2hlbiBhIHZpZGVvIGNhbm5vdCBiZSBwbGF5ZWQuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iVmlkZW9WaWV3Ml9lcnJvcl9idXR0b24iPk9LPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgYWQgc2tpcCB3YWl0IHRpbWUuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYWRfc2tpcF93YWl0X3RpbWUiPgotICAgICAgICBZb3UgY2FuIHNraXAgQWQgaW4gPHhsaWZmOmcgaWQ9IndhaXRfdGltZSIgZXhhbXBsZT0iNSI+JTEkZDwveGxpZmY6Zz5zCi0gICAgPC9zdHJpbmc+Ci0gICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIGFkIHRvdGFsIHJlbWFpbmluZyB0aW1lLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2FkX3JlbWFpbmluZ190aW1lIj4KLSAgICAgICAgQWQgwrcgPHhsaWZmOmcgaWQ9InJlbWFpbmluZ190aW1lIiBleGFtcGxlPSIxOjE1Ij4lMSRzPC94bGlmZjpnPiByZW1haW5pbmcKLSAgICA8L3N0cmluZz4KLSAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIGNhbiBwcmVzcyB0aGUgYnV0dG9uIHRvIGdvIHRvIGFuIGV4dGVybmFsIHdlYnNpdGUuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYWRfdGV4dCI+VmlzaXQgQWR2ZXJ0aXNlcjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfc3VidGl0bGVfdGV4dCI+Q2xvc2VkIGNhcHRpb248L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX29mZl90ZXh0Ij5PZmY8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX3RleHQiPkF1ZGlvIHRyYWNrPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19ub25lX3RleHQiPk5vbmU8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3ZpZGVvX3F1YWxpdHlfdGV4dCI+VmlkZW8gcXVhbGl0eTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfdmlkZW9fcXVhbGl0eV9hdXRvX3RleHQiPkF1dG88L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2hlbHBfdGV4dCI+SGVscCAmYW1wOyBmZWVkYmFjazwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRfdGV4dCI+UGxheWJhY2sgc3BlZWQ8L3N0cmluZz4KLSAgICA8c3RyaW5nLWFycmF5IG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3BsYXliYWNrX3NwZWVkcyI+Ci0gICAgICAgIDxpdGVtPjAuMjV4PC9pdGVtPgotICAgICAgICA8aXRlbT4wLjV4PC9pdGVtPgotICAgICAgICA8aXRlbT4wLjc1eDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+Tm9ybWFsPC9pdGVtPgotICAgICAgICA8aXRlbT4xLjI1eDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MS41eDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+Mng8L2l0ZW0+Ci0gICAgPC9zdHJpbmctYXJyYXk+Ci0gICAgPCEtLSBQbGFjZWhvbGRlciB0ZXh0IGZvciBkaXNwbGF5aW5nIHRpbWUuIFVzZWQgdG8gY2FsY3VsYXRlIHdoaWNoIHNpemUgbGF5b3V0IHRvIHVzZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml90aW1lX3BsYWNlaG9sZGVyIj4wMDowMDowMDwvc3RyaW5nPgotCi0gICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIHN1YnRpdGxlIHRyYWNrIG51bWJlci4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9zdWJ0aXRsZV90cmFja19udW1iZXJfdGV4dCI+Ci0gICAgICAgIFRyYWNrIDx4bGlmZjpnIGlkPSJ0cmFja19udW1iZXIiIGV4YW1wbGU9IjEiPiUxJHM8L3hsaWZmOmc+Ci0gICAgPC9zdHJpbmc+Ci0gICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIGF1ZGlvIHRyYWNrIG51bWJlci4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19udW1iZXJfdGV4dCI+Ci0gICAgICAgIFRyYWNrIDx4bGlmZjpnIGlkPSJhdWRpb19udW1iZXIiIGV4YW1wbGU9IjEiPiUxJHM8L3hsaWZmOmc+Ci0gICAgPC9zdHJpbmc+Ci0gICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIHVua25vd24gc29uZyB0aXRsZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCI+U29uZyB0aXRsZSB1bmtub3duPC9zdHJpbmc+Ci0gICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIHVua25vd24gYXJ0aXN0IG5hbWUuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9tdXNpY19hcnRpc3RfdW5rbm93bl90ZXh0Ij5BcnRpc3QgdW5rbm93bjwvc3RyaW5nPgotCi0gICAgPCEtLUNvbnRlbnQgRGVzY3JpcHRpb25zIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9iYWNrX2J1dHRvbl9kZXNjIj5CYWNrPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX292ZXJmbG93X2xlZnRfYnV0dG9uX2Rlc2MiPlNlZSBtb3JlIGJ1dHRvbnM8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfb3ZlcmZsb3dfcmlnaHRfYnV0dG9uX2Rlc2MiPkJhY2sgdG8gcHJldmlvdXMgYnV0dG9uIGxpc3Q8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfc2Vla19iYXJfZGVzYyI+UGxheWJhY2sgcHJvZ3Jlc3M8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfc2V0dGluZ3NfYnV0dG9uX2Rlc2MiPlNldHRpbmdzPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3ZpZGVvX3F1YWxpdHlfYnV0dG9uX2Rlc2MiPlZpZGVvIFF1YWxpdHkgU2VsZWN0aW9uPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX2NjX2lzX29uIj5TdWJ0aXRsZSBpcyBvbi4gQ2xpY2sgdG8gaGlkZSBpdC48L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfY2NfaXNfb2ZmIj5TdWJ0aXRsZSBpcyBvZmYuIENsaWNrIHRvIHNob3cgaXQuPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3JlcGxheV9idXR0b25fZGVzYyI+UmVwbGF5PC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3BsYXlfYnV0dG9uX2Rlc2MiPlBsYXk8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcGF1c2VfYnV0dG9uX2Rlc2MiPlBhdXNlPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3ByZXZpb3VzX2J1dHRvbl9kZXNjIj5QcmV2aW91cyBtZWRpYTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9uZXh0X2J1dHRvbl9kZXNjIj5OZXh0IG1lZGlhPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3Jld2luZF9idXR0b25fZGVzYyI+UmV3aW5kIGJ5IDEwIHNlY29uZHM8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfZmZ3ZF9idXR0b25fZGVzYyI+R28gZm9yd2FyZCBieSAzMCBzZWNvbmRzPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX2xhdW5jaF9idXR0b25fZGVzYyI+TGF1bmNoIExpbms8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfbXV0ZWRfYnV0dG9uX2Rlc2MiPk11dGVkLiBDbGljayB0byB1bm11dGU8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfdW5tdXRlZF9idXR0b25fZGVzYyI+Q2xpY2sgdG8gTXV0ZTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9mdWxsX3NjcmVlbl9idXR0b25fZGVzYyI+RnVsbCBzY3JlZW48L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGUueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjlhOGVlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0eWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHJlc291cmNlcz4KLSAgICA8c3R5bGUgbmFtZT0iRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luIj5AZGltZW4vbWN2Ml9pY29uX21hcmdpbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY2FsZVR5cGUiPmZpdFhZPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlByZXZpb3VzIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcHJldmlvdXNfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc2tpcF9uZXh0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfbmV4dF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QYXVzZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcGF1c2VfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uRmZ3ZCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfZm9yd2FyZF8zMDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2Zmd2RfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUmV3Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19yZXdpbmRfMTA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9yZXdpbmRfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luIj5AZGltZW4vbWN2Ml9pY29uX21hcmdpbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY2FsZVR5cGUiPmZpdFhZPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QcmV2aW91cyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc2tpcF9wcmV2aW91czwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcHJldmlvdXNfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLk5leHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3NraXBfbmV4dDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfbmV4dF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUGF1c2UiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3BhdXNlX2NpcmNsZV9maWxsZWQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3BhdXNlX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5GZndkIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19mb3J3YXJkXzMwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9mZndkX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3Jld2luZF8xMDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcmV3aW5kX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iTWluaW1hbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbiI+QGRpbWVuL21jdjJfaWNvbl9tYXJnaW48L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2NhbGVUeXBlIj5maXRYWTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3BhdXNlX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGl0bGVCYXIiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+bWF0Y2hfcGFyZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPjQ2ZHA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ1N0YXJ0Ij41ZHA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ0VuZCI+NWRwPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGl0bGVCYXJCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+MzZkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij4zNmRwPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGl0bGVCYXJCdXR0b24uQmFjayI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfYXJyb3dfYmFjazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9iYWNrX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGl0bGVCYXJCdXR0b24uTGF1bmNoIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19sYXVuY2g8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfbGF1bmNoX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGltZVRleHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+d3JhcF9jb250ZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPndyYXBfY29udGVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nU3RhcnQiPjRkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nRW5kIj40ZHA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNHNwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcjwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRpbWVUZXh0LkN1cnJlbnQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGNvbG9yL3doaXRlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHQiPkBzdHJpbmcvTWVkaWFDb250cm9sVmlldzJfdGltZV9wbGFjZWhvbGRlcjwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRpbWVUZXh0LkludGVycHVuY3QiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGNvbG9yL3doaXRlX29wYWNpdHlfNzA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dCI+wrc8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaW1lVGV4dC5FbmQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGNvbG9yL3doaXRlX29wYWNpdHlfNzA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dCI+QHN0cmluZy9NZWRpYUNvbnRyb2xWaWV3Ml90aW1lX3BsYWNlaG9sZGVyPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbiI+QGRpbWVuL21jdjJfaWNvbl9tYXJnaW48L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyX2hvcml6b250YWw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2NhbGVUeXBlIj5maXRYWTwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5DQyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc3VidGl0bGVfb2ZmPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2NjX2lzX29mZjwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5GdWxsU2NyZWVuIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19mdWxsc2NyZWVuPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2Z1bGxfc2NyZWVuX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLk92ZXJmbG93UmlnaHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2NoZXZyb25fcmlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfb3ZlcmZsb3dfcmlnaHRfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uT3ZlcmZsb3dMZWZ0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19jaGV2cm9uX2xlZnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfb3ZlcmZsb3dfbGVmdF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5TZXR0aW5ncyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc2V0dGluZ3M8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfc2V0dGluZ3NfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uTXV0ZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfdW5tdXRlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3VubXV0ZWRfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uVmlkZW9RdWFsaXR5Ij4KLSAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfaGlnaF9xdWFsaXR5PC9pdGVtPgotICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml92aWRlb19xdWFsaXR5X2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljUG9ydHJhaXQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPjBkcDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxNdXNpY1BvcnRyYWl0LkltYWdlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPm1hdGNoX3BhcmVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2VpZ2h0Ij4wLjY8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljUG9ydHJhaXQuVGV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5tYXRjaF9wYXJlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dlaWdodCI+MC40PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPnRvcHxjZW50ZXI8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6b3JpZW50YXRpb24iPnZlcnRpY2FsPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljTGFuZHNjYXBlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPjBkcDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxNdXNpY0xhbmRzY2FwZS5JbWFnZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+bWF0Y2hfcGFyZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93ZWlnaHQiPjAuMzU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyfHJpZ2h0PC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljTGFuZHNjYXBlLlRleHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPm1hdGNoX3BhcmVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2VpZ2h0Ij4wLjY1PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0Ij4yNGRwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcnxsZWZ0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOm9yaWVudGF0aW9uIj52ZXJ0aWNhbDwvaXRlbT4KLSAgICA8L3N0eWxlPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRlNjkwMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuTWVkaWFSb3V0ZXIuTWVkaWFSb3V0ZUJ1dHRvbiIKLSAgICAgICAgICAgIHBhcmVudD0iV2lkZ2V0LkFwcENvbXBhdC5BY3Rpb25CdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJleHRlcm5hbFJvdXRlRW5hYmxlZERyYXdhYmxlIj5AZHJhd2FibGUvbXJfYnV0dG9uX2Rhcms8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuTWVkaWFSb3V0ZXIuTGlnaHQuTWVkaWFSb3V0ZUJ1dHRvbiIKLSAgICAgICAgICAgIHBhcmVudD0iV2lkZ2V0LkFwcENvbXBhdC5MaWdodC5BY3Rpb25CdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJleHRlcm5hbFJvdXRlRW5hYmxlZERyYXdhYmxlIj5AZHJhd2FibGUvbXJfYnV0dG9uX2xpZ2h0PC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuVGl0bGUiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuQXBwQ29tcGF0LlRpdGxlIiAvPgotCi0gICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlByaW1hcnlUZXh0IiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLkFwcENvbXBhdC5TdWJoZWFkIiAvPgotCi0gICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuQXBwQ29tcGF0LkJvZHkxIiAvPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zeW1ib2xzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N5bWJvbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTBlOGM2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N5bWJvbHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLS8qIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotLS0+Ci08cmVzb3VyY2VzPgotICAgIDwhLS1qYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0iY2MiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJmZndkIiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0ibWVkaWFjb250cm9sbGVyX3Byb2dyZXNzIiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0ibmV4dCIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InBhdXNlIiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0icHJldiIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InJldyIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InRpbWUiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJ0aW1lX2N1cnJlbnQiIC8tLT4KLTwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3RoZW1lcy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy90aGVtZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWE3NTRiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGhlbWUuTWVkaWFSb3V0ZXIiIHBhcmVudD0iYW5kcm9pZDpUaGVtZS5NYXRlcmlhbCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93Tm9UaXRsZSI+dHJ1ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUJ1dHRvblN0eWxlIj5Ac3R5bGUvV2lkZ2V0Lk1lZGlhUm91dGVyLk1lZGlhUm91dGVCdXR0b248L2l0ZW0+Ci0KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNsb3NlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBsYXlEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BsYXlfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3RvcERyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIj5AZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlRGVmYXVsdEljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVR2SWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfdHZfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV9zcGVha2VyX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTcGVha2VyR3JvdXBJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2Rhcms8L2l0ZW0+Ci0KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+QG51bGw8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5NZWRpYVJvdXRlci5MaWdodENvbnRyb2xQYW5lbCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiPkBzdHlsZS9UaGVtZU92ZXJsYXkuTWVkaWFSb3V0ZXIuTGlnaHQ8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5NZWRpYVJvdXRlci5MaWdodCIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLk1hdGVyaWFsLkxpZ2h0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dOb1RpdGxlIj50cnVlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQnV0dG9uU3R5bGUiPkBzdHlsZS9XaWRnZXQuTWVkaWFSb3V0ZXIuTGlnaHQuTWVkaWFSb3V0ZUJ1dHRvbjwvaXRlbT4KLQotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ2xvc2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBsYXlEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BsYXlfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQYXVzZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTdG9wRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIj5AZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZURlZmF1bHRJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY19tcl9idXR0b25fZ3JleTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVR2SWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfdHZfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTcGVha2VySWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJHcm91cEljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQ8L2l0ZW0+Ci0KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+QG51bGw8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5NZWRpYVJvdXRlci5MaWdodC5EYXJrQ29udHJvbFBhbmVsIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+QHN0eWxlL1RoZW1lT3ZlcmxheS5NZWRpYVJvdXRlci5EYXJrPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGhlbWVPdmVybGF5Lk1lZGlhUm91dGVyLkRhcmsiIHBhcmVudD0iYW5kcm9pZDpUaGVtZS5NYXRlcmlhbCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQbGF5RHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQYXVzZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3N0b3BfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSI+QGRyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfZGFyazwvaXRlbT4KLQotICAgIDwvc3R5bGU+Ci0gICAgPHN0eWxlIG5hbWU9IlRoZW1lT3ZlcmxheS5NZWRpYVJvdXRlci5MaWdodCIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLk1hdGVyaWFsLkxpZ2h0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBsYXlEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BsYXlfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQYXVzZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTdG9wRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIj5AZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19saWdodDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9ydW5jdHMuc2ggYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcnVuY3RzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWIxYTFlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9ydW5jdHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBVc2FnZSAnLiBydW5jdHMuc2gnCi0KLWZ1bmN0aW9uIF9ydW50ZXN0X2N0c19tZWRpYWNvbXBvbmVudF91c2FnZSgpIHsKLSAgZWNobyAncnVudGVzdC1jdHMtTWVkaWFDb21wb25lbnRzIFtvcHRpb25dOiBCdWlsZCwgZmxhc2ggZGV2aWNlLCcKLSAgZWNobyAnICAgICAgICAgICAgICBhbmQgcnVuIHN1YnNldCBvZiBDdHNNZWRpYVRlc3RDYXNlcyB0aGF0IE1lZGlhQ29tcG9uZW50cyBjb3ZlcnMuJwotICBlY2hvICcgICAgICAgICAgKldhcm5pbmcqIFRoaXMgYnlwYXNzZXMgQ1RTIHNldHVwIChlLmcuIGRvd25sb2FkIG1lZGlhIGNvbnRlbnRzIGZyb20gc2VydmVyKScKLSAgZWNobyAnICAgICAgICAgIEZvciBydW5uaW5nIENUUyBpbiBvZmZpY2lhbCB3YXksIHVzZSBhdGVzdCBvciBjdHMtdHJhZGVmZWQgJwotICBlY2hvICcgICAgIC1ofC0taGVscDogVGhpcyBoZWxwJwotICBlY2hvICcgICAgIC0tc2tpcDogU2tpcCBidWlsZCBhbmQgZmxhc2guIEp1c3QgcmVydW4tdGVzdHMnCi0gIGVjaG8gJyAgICAgLS1taW46IE9ubHkgcmVidWlsZCB0ZXN0cyBhbmQgdXBkYXRhYmxlIGxpYnJhcnkuJwotICBlY2hvICcgICAgIC0tdGVzdDogT25seSByZWJ1aWxkIHRlc3RzJwotICBlY2hvICcgICAgIC1zIFtkZXZpY2VfaWRdOiBTcGVjaWZ5IGEgZGV2aWNlIG5hbWUgdG8gcnVuIHRlc3QgYWdhaW5zdC4nCi0gIGVjaG8gJyAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gZGVmaW5lICR7QURCSE9TVH0gaW5zdGVhZC4nCi0gIGVjaG8gJyAgICAgLXIgW2NvdW50XTogUmVwZWF0IHRlc3RzIGZvciBnaXZlbiBjb3VudC4gSXQgd2lsbCBzdG9wIHdoZW4gZmFpbHMuJwotICBlY2hvICcgICAgIC0taWdub3JlOiBLZWVwIHJlcGVhdGluZyB0ZXN0cyBldmVuIHdoZW4gaXQgZmFpbHMuJwotICBlY2hvICcgICAgIC10IFt0ZXN0XTogT25seSBydW4gdGhlIHNwZWNpZmljIHRlc3QuIENhbiBiZSBlaXRoZXIgYSBjbGFzcyBvciBhIG1ldGhvZC4nCi19Ci0KLWZ1bmN0aW9uIHJ1bnRlc3QtY3RzLU1lZGlhQ29tcG9uZW50cygpIHsKLSAgIyBFZGl0IGhlcmUgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBvdGhlciB0ZXN0cy4KLSAgIyBMaXN0IHVwIGxpYnMgYW5kIGFwa3MgaW4gdGhlIG1lZGlhX2FwaSBuZWVkZWQgZm9yIHRlc3RzLCBhbmQgcGxhY2UgdGVzdCB0YXJnZXQgYXQgdGhlIGxhc3QuCi0gIGxvY2FsIFRFU1RfUEFDS0FHRV9ESVI9KCJmcmFtZXdvcmtzL2F2L3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0IikKLSAgbG9jYWwgVEVTVF9QQUNLQUdFPSgiYW5kcm9pZC5tZWRpYS5jdHMiKQotICBsb2NhbCBCVUlMRF9UQVJHRVRTPSgiTWVkaWFDb21wb25lbnRzIiAiQ3RzTWVkaWFUZXN0Q2FzZXMiKQotICAjIERvbid0IGluY2x1ZGUgTWVkaWFDb21wb25lbnRzIC0tIGlmIHdlIHNpbXBseSBpbnN0YWxsIGl0LCBzeXN0ZW0gc2VydmVyCi0gICMgd291bGRuJ3QgdXNlIHRoZSBpbnN0YWxsZWQgb25lLgotICBsb2NhbCBJTlNUQUxMX1RBUkdFVFM9KCJDdHNNZWRpYVRlc3RDYXNlcyIpCi0gIGxvY2FsIFRFU1RfUlVOTkVSPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgotICBsb2NhbCBERVBFTkRFTkNJRVM9KCJtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQiICJhbmRyb2lkLXN1cHBvcnQtdGVzdCIgImNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwiKQotICBsb2NhbCBERUZBVUxUX1RFU1RfVEFSR0VUPSIiCi0gIERFRkFVTFRfVEVTVF9UQVJHRVQrPSJhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYUJyb3dzZXIyVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYUNvbnRyb2xsZXIyVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYU1ldGFkYXRhMlRlc3QiCi0gIERFRkFVTFRfVEVTVF9UQVJHRVQrPSIsYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFTZXNzaW9uMlRlc3QiCi0gIERFRkFVTFRfVEVTVF9UQVJHRVQrPSIsYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFTZXNzaW9uMl9QZXJtaXNzaW9uVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYVNlc3Npb25NYW5hZ2VyX01lZGlhU2Vzc2lvbjJUZXN0IgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLlNlc3Npb25Ub2tlbjJUZXN0IgotICBpZiBbWyAteiAiJHtBTkRST0lEX0JVSUxEX1RPUH0iIF1dOyB0aGVuCi0gICAgZWNobyAiTmVlZHMgdG8gbHVuY2ggYSB0YXJnZXQgZmlyc3QiCi0gICAgcmV0dXJuCi0gIGZpCi0KLSAgbG9jYWwgb2xkX3BhdGg9JHtPTERQV0R9Ci0gIHdoaWxlIHRydWU7IGRvCi0gICAgbG9jYWwgT1BUSU9OX1NLSVA9ImZhbHNlIgotICAgIGxvY2FsIE9QVElPTl9NSU49ImZhbHNlIgotICAgIGxvY2FsIE9QVElPTl9URVNUPSJmYWxzZSIKLSAgICBsb2NhbCBPUFRJT05fUkVQRUFUX0NPVU5UPSIxIgotICAgIGxvY2FsIE9QVElPTl9JR05PUkU9ImZhbHNlIgotICAgIGxvY2FsIE9QVElPTl9URVNUX1RBUkdFVD0iJHtERUZBVUxUX1RFU1RfVEFSR0VUfSIKLSAgICBsb2NhbCBhZGJob3N0X2xvY2FsCi0gICAgd2hpbGUgKCggIiQjIiApKTsgZG8KLSAgICAgIGNhc2UgIiR7MX0iIGluCi0gICAgICAgIC1ofC0taGVscCkKLSAgICAgICAgICBfcnVudGVzdF9jdHNfbWVkaWFjb21wb25lbnRfdXNhZ2UKLSAgICAgICAgICByZXR1cm4KLSAgICAgICAgICA7OwotICAgICAgICAtLXNraXApCi0gICAgICAgICAgT1BUSU9OX1NLSVA9InRydWUiCi0gICAgICAgICAgOzsKLSAgICAgICAgLS1taW4pCi0gICAgICAgICAgT1BUSU9OX01JTj0idHJ1ZSIKLSAgICAgICAgICA7OwotICAgICAgICAtLXRlc3QpCi0gICAgICAgICAgT1BUSU9OX1RFU1Q9InRydWUiCi0gICAgICAgICAgOzsKLSAgICAgICAgLXMpCi0gICAgICAgICAgc2hpZnQKLSAgICAgICAgICBhZGJob3N0X2xvY2FsPSR7MX0KLSAgICAgICAgICA7OwotICAgICAgICAtcikKLSAgICAgICAgICBzaGlmdAotICAgICAgICAgIE9QVElPTl9SRVBFQVRfQ09VTlQ9IiR7MX0iCi0gICAgICAgICAgOzsKLSAgICAgICAgLS1pZ25vcmUpCi0gICAgICAgICAgT1BUSU9OX0lHTk9SRT0idHJ1ZSIKLSAgICAgICAgICA7OwotICAgICAgICAtdCkKLSAgICAgICAgICBzaGlmdAotICAgICAgICAgIE9QVElPTl9URVNUX1RBUkdFVD0iJHsxfSIKLSAgICAgIGVzYWMKLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotCi0gICAgIyBCdWlsZCBhZGIgY29tbWFuZC4KLSAgICBsb2NhbCBhZGIKLSAgICBpZiBbWyAteiAiJHthZGJob3N0X2xvY2FsfSIgXV07IHRoZW4KLSAgICAgIGFkYmhvc3RfbG9jYWw9JHtBREJIT1NUfQotICAgIGZpCi0gICAgaWYgW1sgLXogIiR7YWRiaG9zdF9sb2NhbH0iIF1dOyB0aGVuCi0gICAgICBsb2NhbCBkZXZpY2VfY291bnQ9JChhZGIgZGV2aWNlcyB8IHNlZCAnL15bWzpzcGFjZTpdXSokL2QnIHwgd2MgLWwpCi0gICAgICBpZiBbWyAiJHtkZXZpY2VfY291bnR9IiAhPSAiMiIgXV07IHRoZW4KLSAgICAgICAgZWNobyAiVG9vIG1hbnkgZGV2aWNlcy4gU3BlY2lmeSBhIGRldmljZS4iICYmIGJyZWFrCi0gICAgICBmaQotICAgICAgYWRiPSJhZGIiCi0gICAgZWxzZQotICAgICAgYWRiPSJhZGIgLXMgJHthZGJob3N0X2xvY2FsfSIKLSAgICBmaQotCi0gICAgbG9jYWwgdGFyZ2V0X2Rpcj0iJHtBTkRST0lEX0JVSUxEX1RPUH0vJHtURVNUX1BBQ0tBR0VfRElSfSIKLSAgICAjbG9jYWwgVEVTVF9QQUNLQUdFPSQoc2VkIC1uICdzL14uKlxicGFja2FnZVxiPSJcKFthLXowLTlcLl0qXCkiLiokL1wxL3AnICR7dGFyZ2V0X2Rpcn0vQW5kcm9pZE1hbmlmZXN0LnhtbCkKLQotICAgIGlmIFtbICIke09QVElPTl9TS0lQfSIgIT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAjIEJ1aWxkIGRlcGVuZGVuY2llcyBpZiBuZWVkZWQuCi0gICAgICBsb2NhbCBkZXBlbmRlbmN5Ci0gICAgICBsb2NhbCBidWlsZF9kZXBlbmRlbmN5PSIiCi0gICAgICBmb3IgZGVwZW5kZW5jeSBpbiAke0RFUEVOREVOQ0lFU1tAXX07IGRvCi0gICAgICAgIGlmIFtbICIke2RlcGVuZGVuY3l9IiA9PSAib3V0LyIqIF1dOyB0aGVuCi0gICAgICAgICAgaWYgW1sgISAtZiAke0FORFJPSURfQlVJTERfVE9QfS8ke2RlcGVuZGVuY3l9IF1dOyB0aGVuCi0gICAgICAgICAgICBidWlsZF9kZXBlbmRlbmN5PSJ0cnVlIgotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICBmaQotICAgICAgICBlbHNlCi0gICAgICAgICAgaWYgW1sgIiQoZmluZCAke09VVH0gLW5hbWUgJHtkZXBlbmRlbmN5fV9pbnRlcm1lZGlhdGVzIHwgd2MgLWwpIiA9PSAiMCIgXV07IHRoZW4KLSAgICAgICAgICAgIGJ1aWxkX2RlcGVuZGVuY3k9InRydWUiCi0gICAgICAgICAgICBicmVhawotICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgICBkb25lCi0gICAgICBpZiBbWyAiJHtidWlsZF9kZXBlbmRlbmN5fSIgPT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAgIGVjaG8gIkJ1aWxkaW5nIGRlcGVuZGVuY2llcy4gV2lsbCBvbmx5IHByaW50IHN0ZGVyci4iCi0gICAgICAgIG0gJHtERVBFTkRFTkNJRVNbQF19IC1qID4gL2Rldi9udWxsCi0gICAgICBmaQotCi0gICAgICAjIEJ1aWxkIHRlc3QgYXBrIGFuZCByZXF1aXJlZCBhcGsuCi0gICAgICBsb2NhbCBidWlsZF90YXJnZXRzCi0gICAgICBpZiBbWyAiJHtPUFRJT05fVEVTVH0iID09ICJ0cnVlIiBdXTsgdGhlbgotICAgICAgICBidWlsZF90YXJnZXRzPSIke0lOU1RBTExfVEFSR0VUU1tAXX0iCi0gICAgICBlbGlmIFtbICIke09QVElPTl9NSU59IiA9PSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICAgYnVpbGRfdGFyZ2V0cz0iJHtCVUlMRF9UQVJHRVRTW0BdfSIKLSAgICAgIGVsc2UKLSAgICAgICAgYnVpbGRfdGFyZ2V0cz0iJHtCVUlMRF9UQVJHRVRTW0BdfSBkcm9pZCIKLSAgICAgIGZpCi0gICAgICBtICR7YnVpbGRfdGFyZ2V0c30gLWogfHwgYnJlYWsKLQotICAgICAgaWYgW1sgIiR7T1BUSU9OX1RFU1R9IiAhPSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICAgIyBGbGFzaCBvbmx5IHdoZW4gbmVlZGVkCi0gICAgICAgIGxvY2FsIGRldmljZV9idWlsZF90eXBlPSIkKCR7YWRifSBzaGVsbCBnZXRwcm9wIHJvLmJ1aWxkLnR5cGUpIgotICAgICAgICBpZiBbWyAiJHtkZXZpY2VfYnVpbGRfdHlwZX0iID09ICJ1c2VyIiBdXTsgdGhlbgotICAgICAgICAgICMgVXNlciBidWlsZC4gQ2Fubm90IGFkYiBzeW5jCi0gICAgICAgICAgJHthZGJ9IHJlYm9vdCBib290bG9hZGVyCi0gICAgICAgICAgZmFzdGJvb3QgZmxhc2hhbGwKLSAgICAgICAgZWxzZQotICAgICAgICAgICR7YWRifSByb290Ci0gICAgICAgICAgbG9jYWwgZGV2aWNlX3Zlcml0eV9tb2RlPSIkKCR7YWRifSBzaGVsbCBnZXRwcm9wIHJvLmJvb3QudmVyaXR5bW9kZSkiCi0gICAgICAgICAgaWYgW1sgIiR7ZGV2aWNlX3Zlcml0eV9tb2RlfSIgIT0gImRpc2FibGVkIiBdXTsgdGhlbgotICAgICAgICAgICAgJHthZGJ9IGRpc2FibGUtdmVyaXR5Ci0gICAgICAgICAgICAke2FkYn0gcmVib290Ci0gICAgICAgICAgICAke2FkYn0gd2FpdC1mb3ItZGV2aWNlIHx8IGJyZWFrCi0gICAgICAgICAgICAke2FkYn0gcm9vdAotICAgICAgICAgIGZpCi0gICAgICAgICAgJHthZGJ9IHJlbW91bnQKLSAgICAgICAgICAke2FkYn0gc2hlbGwgc3RvcAotICAgICAgICAgICR7YWRifSBzaGVsbCBzZXRwcm9wIGxvZy50YWcuTWVkaWFTZXNzaW9uU2VydmljZSBERUJVRwotICAgICAgICAgICR7YWRifSBzeW5jCi0gICAgICAgICAgJHthZGJ9IHNoZWxsIHN0YXJ0Ci0gICAgICAgIGZpCi0gICAgICAgICR7YWRifSB3YWl0LWZvci1kZXZpY2UgfHwgYnJlYWsKLSAgICAgICAgIyBFbnN1cmUgcGFja2FnZSBtYW5hZ2VyIGlzIGxvYWRlZC4KLSAgICAgICAgIyBUT0RPKGphZXdhbik6IEZpbmQgYmV0dGVyIHdheSB0byB3YWl0Ci0gICAgICAgIHNsZWVwIDE1Ci0gICAgICBmaQotCi0gICAgICAjIEluc3RhbGwgYXBrcwotICAgICAgbG9jYWwgaW5zdGFsbF9mYWlsZWQ9ImZhbHNlIgotICAgICAgZm9yIHRhcmdldCBpbiAke0lOU1RBTExfVEFSR0VUU1tAXX07IGRvCi0gICAgICAgIGxvY2FsIGFwa19wYXRoPSQoZmluZCAke09VVH0vc3lzdGVtICR7T1VUfS9kYXRhIC1uYW1lICR7dGFyZ2V0fS5hcGspCi0gICAgICAgIGxvY2FsIGFwa19udW09JChmaW5kICR7T1VUfS9zeXN0ZW0gJHtPVVR9L2RhdGEgLW5hbWUgJHt0YXJnZXR9LmFwayB8IHdjIC1sKQotICAgICAgICBpZiBbWyAiJHthcGtfbnVtfSIgIT0gIjEiIF1dOyB0aGVuCi0gICAgICAgICAgZWNobyAiQ2Fubm90IGxvY2F0ZSBhICR7dGFyZ2V0fS5hcGsuIEZvdW5kICR7YXBrX251bX0gYXBrcyIgJiYgYnJlYWsKLSAgICAgICAgZmkKLSAgICAgICAgZWNobyAiSW5zdGFsbGluZyAke3RhcmdldH0uYXBrLiBwYXRoPSR7YXBrX3BhdGh9IgotICAgICAgICAke2FkYn0gaW5zdGFsbCAtciAke2Fwa19wYXRofQotICAgICAgICBpZiBbWyAiJHs/fSIgIT0gIjAiIF1dOyB0aGVuCi0gICAgICAgICAgaW5zdGFsbF9mYWlsZWQ9InRydWUiCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICAgIGRvbmUKLSAgICAgIGlmIFtbICIke2luc3RhbGxfZmFpbGVkfSIgPT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAgIGVjaG8gIkZhaWxlZCB0byBpbnN0YWxsLiBUZXN0IHdvdWxkbid0IHJ1bi4iCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0KLSAgICBsb2NhbCB0ZXN0X3RhcmdldD0iIgotICAgIGlmIFtbIC1uICIke09QVElPTl9URVNUX1RBUkdFVH0iIF1dOyB0aGVuCi0gICAgICB0ZXN0X3RhcmdldD0iLWUgY2xhc3MgJHtPUFRJT05fVEVTVF9UQVJHRVR9IgotICAgIGZpCi0KLSAgICBsb2NhbCBpCi0gICAgbG9jYWwgdG1wZmlsZT0kKHRlbXBmaWxlKQotICAgIGZvciAoKGk9MTsgaSA8PSAke09QVElPTl9SRVBFQVRfQ09VTlR9OyBpKyspKTsgZG8KLSAgICAgIGVjaG8gIlJ1biB0ZXN0ICR7aX0vJHtPUFRJT05fUkVQRUFUX0NPVU5UfSIKLSAgICAgICR7YWRifSBzaGVsbCBhbSBpbnN0cnVtZW50ICR7dGVzdF90YXJnZXR9IC13ICR7VEVTVF9QQUNLQUdFfS8ke1RFU1RfUlVOTkVSfSA+JiAke3RtcGZpbGV9Ci0gICAgICBjYXQgJHt0bXBmaWxlfQotICAgICAgaWYgW1sgIiR7T1BUSU9OX0lHTk9SRX0iICE9ICJ0cnVlIiBdXTsgdGhlbgotICAgICAgICBpZiBbWyAtbiAiJChncmVwICR7dG1wZmlsZX0gLWUgJ0ZBSUxVUkVcfGNyYXNoZWQnKSIgXV07IHRoZW4KLSAgICAgICAgICAjIGFtIGluc3RydW1lbnQgZG9lc24ndCByZXR1cm4gZXJyb3IgY29kZSBzbyBuZWVkIHRvIGdyZXAgcmVzdWx0IG1lc3NhZ2UgaW5zdGVhZAotICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBybSAke3RtcGZpbGV9Ci0gICAgYnJlYWsKLSAgZG9uZQotfQotCi1lY2hvICJGb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBhZGRlZCB0byB5b3VyIGVudmlyb25tZW50OiIKLV9ydW50ZXN0X2N0c19tZWRpYWNvbXBvbmVudF91c2FnZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFDb250cm9sbGVyMi5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFDb250cm9sbGVyMi5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDg4YjcwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ29udHJvbGxlcjIuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5JTWVkaWFTZXNzaW9uMjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZnJvbSBNZWRpYVNlc3Npb24yIHRvIE1lZGlhQ29udHJvbGxlcjIuCi0gKiA8cD4KLSAqIEtlZXAgdGhpcyBpbnRlcmZhY2Ugb25ld2F5LiBPdGhlcndpc2UgYSBtYWxpY2lvdXMgYXBwIG1heSBpbXBsZW1lbnQgZmFrZSB2ZXJzaW9uIG9mIHRoaXMsCi0gKiBhbmQgaG9sZHMgY2FsbHMgZnJvbSBzZXNzaW9uIHRvIG1ha2Ugc2Vzc2lvbiBvd25lcihzKSBmcm96ZW4uCi0gKi8KLS8vIFRPRE8oamFld2FuKTogKFBvc3QgUCkgSGFuZGxlIHdoZW4gdGhlIHBsYXlsaXN0IGJlY29tZXMgdG9vIGh1Z2UuCi0vLyAgICAgICAgICAgICAgIE5vdGUgdGhhdCBQYXJjZWxsZWRTbGljZUxpc3QgaXNuJ3QgYSBnb29kIGlkZWEgZm9yIHRoZSBwdXJwb3NlLiAoc2VlOiBiLzM3NDkzNjc3KQotb25ld2F5IGludGVyZmFjZSBJTWVkaWFDb250cm9sbGVyMiB7Ci0gICAgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChpbnQgc3RhdGUpOwotICAgIHZvaWQgb25Qb3NpdGlvbkNoYW5nZWQobG9uZyBldmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zKTsKLSAgICB2b2lkIG9uUGxheWJhY2tTcGVlZENoYW5nZWQoZmxvYXQgc3BlZWQpOwotICAgIHZvaWQgb25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZChsb25nIGJ1ZmZlcmVkUG9zaXRpb25Ncyk7Ci0gICAgdm9pZCBvblBsYXlsaXN0Q2hhbmdlZChpbiBMaXN0PEJ1bmRsZT4gcGxheWxpc3QsIGluIEJ1bmRsZSBtZXRhZGF0YSk7Ci0gICAgdm9pZCBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKGluIEJ1bmRsZSBtZXRhZGF0YSk7Ci0gICAgdm9pZCBvblBsYXliYWNrSW5mb0NoYW5nZWQoaW4gQnVuZGxlIHBsYXliYWNrSW5mbyk7Ci0gICAgdm9pZCBvblJlcGVhdE1vZGVDaGFuZ2VkKGludCByZXBlYXRNb2RlKTsKLSAgICB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKGludCBzaHVmZmxlTW9kZSk7Ci0gICAgdm9pZCBvbkVycm9yKGludCBlcnJvckNvZGUsIGluIEJ1bmRsZSBleHRyYXMpOwotCi0gICAgdm9pZCBvbkNvbm5lY3RlZChJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyLCBpbiBCdW5kbGUgY29tbWFuZEdyb3VwLAotICAgICAgICAgICAgaW50IHBsYXllclN0YXRlLCBsb25nIHBvc2l0aW9uRXZlbnRUaW1lTXMsIGxvbmcgcG9zaXRpb25NcywgZmxvYXQgcGxheWJhY2tTcGVlZCwKLSAgICAgICAgICAgIGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zLCBpbiBCdW5kbGUgcGxheWJhY2tJbmZvLCBpbnQgcmVwZWF0TW9kZSwgaW50IHNodWZmbGVNb2RlLAotICAgICAgICAgICAgaW4gTGlzdDxCdW5kbGU+IHBsYXlsaXN0LCBpbiBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSk7Ci0gICAgdm9pZCBvbkRpc2Nvbm5lY3RlZCgpOwotCi0gICAgdm9pZCBvbkN1c3RvbUxheW91dENoYW5nZWQoaW4gTGlzdDxCdW5kbGU+IGNvbW1hbmRCdXR0b25saXN0KTsKLSAgICB2b2lkIG9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZChpbiBCdW5kbGUgY29tbWFuZHMpOwotCi0gICAgdm9pZCBvbkN1c3RvbUNvbW1hbmQoaW4gQnVuZGxlIGNvbW1hbmQsIGluIEJ1bmRsZSBhcmdzLCBpbiBSZXN1bHRSZWNlaXZlciByZWNlaXZlcik7Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gQnJvd3NlciBzZXBjaWZpYwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICB2b2lkIG9uR2V0TGlicmFyeVJvb3REb25lKGluIEJ1bmRsZSByb290SGludHMsIFN0cmluZyByb290TWVkaWFJZCwgaW4gQnVuZGxlIHJvb3RFeHRyYSk7Ci0gICAgdm9pZCBvbkdldEl0ZW1Eb25lKFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgcmVzdWx0KTsKLSAgICB2b2lkIG9uQ2hpbGRyZW5DaGFuZ2VkKFN0cmluZyByb290TWVkaWFJZCwgaW50IGl0ZW1Db3VudCwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBvbkdldENoaWxkcmVuRG9uZShTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIGluIExpc3Q8QnVuZGxlPiByZXN1bHQsCi0gICAgICAgICAgICBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIG9uU2VhcmNoUmVzdWx0Q2hhbmdlZChTdHJpbmcgcXVlcnksIGludCBpdGVtQ291bnQsIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgb25HZXRTZWFyY2hSZXN1bHREb25lKFN0cmluZyBxdWVyeSwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgaW4gTGlzdDxCdW5kbGU+IHJlc3VsdCwKLSAgICAgICAgICAgIGluIEJ1bmRsZSBleHRyYXMpOwotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFTZXNzaW9uMi5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFTZXNzaW9uMi5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjQ0NjdkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvSU1lZGlhU2Vzc2lvbjIuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLklNZWRpYUNvbnRyb2xsZXIyOwotCi0vKioKLSAqIEludGVyZmFjZSBmcm9tIE1lZGlhQ29udHJvbGxlcjIgdG8gTWVkaWFTZXNzaW9uMi4KLSAqIDxwPgotICogS2VlcCB0aGlzIGludGVyZmFjZSBvbmV3YXkuIE90aGVyd2lzZSBhIG1hbGljaW91cyBhcHAgbWF5IGltcGxlbWVudCBmYWtlIHZlcnNpb24gb2YgdGhpcywKLSAqIGFuZCBob2xkcyBjYWxscyBmcm9tIHNlc3Npb24gdG8gbWFrZSBzZXNzaW9uIG93bmVyKHMpIGZyb3plbi4KLSAqLwotIC8vIFRPRE8oamFld2FuKTogKFBvc3QgUCkgSGFuZGxlIHdoZW4gdGhlIHBsYXlsaXN0IGJlY29tZXMgdG9vIGh1Z2UuCi0gLy8gICAgICAgICAgICAgICBOb3RlIHRoYXQgUGFyY2VsbGVkU2xpY2VMaXN0IGlzbid0IGEgZ29vZCBpZGVhIGZvciB0aGUgcHVycG9zZS4gKHNlZTogYi8zNzQ5MzY3NykKLW9uZXdheSBpbnRlcmZhY2UgSU1lZGlhU2Vzc2lvbjIgewotICAgIC8vIFRPRE8oamFld2FuKTogYWRkIG9uQ29tbWFuZCgpIHRvIHNlbmQgcHJpdmF0ZSBjb21tYW5kCi0KLSAgICAvLyBUT0RPKGphZXdhbik6IChQb3N0IFApIFdlIG1heSBjb25zaWRlciB0byBhZGQgYW5vdGhlciBiaW5kZXIganVzdCBmb3IgdGhlIGNvbm5lY3Rpb24KLSAgICAvLyAgICAgICAgICAgICAgIG5vdCB0byBleHBvc2Ugb3RoZXIgbWV0aG9kcyB0byB0aGUgY29udHJvbGxlciB3aG9zZSBjb25uZWN0aW9uIHdhc24ndCBhY2NlcHRlZC4KLSAgICAvLyAgICAgICAgICAgICAgIEJ1dCB0aGlzIHdvdWxkIGJlIGVub3VnaCBmb3Igbm93IGJlY2F1c2UgaXQncyB0aGUgc2FtZSBhcyBleGlzdGluZwotICAgIC8vICAgICAgICAgICAgICAgTWVkaWFCcm93c2VyIGFuZCBNZWRpYUJyb3dzZXJTZXJ2aWNlLgotICAgIHZvaWQgY29ubmVjdChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBjYWxsaW5nUGFja2FnZSk7Ci0gICAgdm9pZCByZWxlYXNlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcik7Ci0KLSAgICB2b2lkIHNldFZvbHVtZVRvKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IHZhbHVlLCBpbnQgZmxhZ3MpOwotICAgIHZvaWQgYWRqdXN0Vm9sdW1lKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGRpcmVjdGlvbiwgaW50IGZsYWdzKTsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBzZW5kIGNvbW1hbmQKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgdm9pZCBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLAotICAgICAgICAgICAgaW50IGNvbW1hbmRDb2RlLCBpbiBCdW5kbGUgYXJncyk7Ci0gICAgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIEJ1bmRsZSBjb21tYW5kLCBpbiBCdW5kbGUgYXJncywKLSAgICAgICAgICAgIGluIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKTsKLQotICAgIHZvaWQgcHJlcGFyZUZyb21VcmkoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBVcmkgdXJpLCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHByZXBhcmVGcm9tU2VhcmNoKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHByZXBhcmVGcm9tTWVkaWFJZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHBsYXlGcm9tVXJpKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gVXJpIHVyaSwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBwbGF5RnJvbVNlYXJjaChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBxdWVyeSwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBwbGF5RnJvbU1lZGlhSWQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgbWVkaWFJZCwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBzZXRSYXRpbmcoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgbWVkaWFJZCwgaW4gQnVuZGxlIHJhdGluZyk7Ci0KLSAgICB2b2lkIHNldFBsYXlsaXN0KElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gTGlzdDxCdW5kbGU+IHBsYXlsaXN0LCBpbiBCdW5kbGUgbWV0YWRhdGEpOwotICAgIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIEJ1bmRsZSBtZXRhZGF0YSk7Ci0gICAgdm9pZCBhZGRQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgaW5kZXgsIGluIEJ1bmRsZSBtZWRpYUl0ZW0pOwotICAgIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIG1lZGlhSXRlbSk7Ci0gICAgdm9pZCByZXBsYWNlUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGluZGV4LCBpbiBCdW5kbGUgbWVkaWFJdGVtKTsKLSAgICB2b2lkIHNraXBUb1BsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIEJ1bmRsZSBtZWRpYUl0ZW0pOwotICAgIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcik7Ci0gICAgdm9pZCBza2lwVG9OZXh0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpOwotICAgIHZvaWQgc2V0UmVwZWF0TW9kZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCByZXBlYXRNb2RlKTsKLSAgICB2b2lkIHNldFNodWZmbGVNb2RlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IHNodWZmbGVNb2RlKTsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBsaWJyYXJ5IHNlcnZpY2Ugc3BlY2lmaWMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgdm9pZCBnZXRMaWJyYXJ5Um9vdChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIEJ1bmRsZSByb290SGludHMpOwotICAgIHZvaWQgZ2V0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBtZWRpYUlkKTsKLSAgICB2b2lkIGdldENoaWxkcmVuKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHBhcmVudElkLCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLAotICAgICAgICAgICAgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBzZWFyY2goSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcXVlcnksIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgZ2V0U2VhcmNoUmVzdWx0KElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLAotICAgICAgICAgICAgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBzdWJzY3JpYmUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcGFyZW50SWQsIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgdW5zdWJzY3JpYmUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcGFyZW50SWQpOwotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUJyb3dzZXIySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUJyb3dzZXIySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTA5MDk5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFCcm93c2VyMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFCcm93c2VyMi5Ccm93c2VyQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFCcm93c2VyMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFCcm93c2VyMkltcGwgZXh0ZW5kcyBNZWRpYUNvbnRyb2xsZXIySW1wbCBpbXBsZW1lbnRzIE1lZGlhQnJvd3NlcjJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhQnJvd3NlcjIiOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFRPRE8oamFld2FuKTogY2hhbmdlLgotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUJyb3dzZXIyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhQnJvd3NlcjIuQnJvd3NlckNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHB1YmxpYyBNZWRpYUJyb3dzZXIySW1wbChDb250ZXh0IGNvbnRleHQsIE1lZGlhQnJvd3NlcjIgaW5zdGFuY2UsIFNlc3Npb25Ub2tlbjIgdG9rZW4sCi0gICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgQnJvd3NlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGluc3RhbmNlLCB0b2tlbiwgZXhlY3V0b3IsIGNhbGxiYWNrKTsKLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIEBPdmVycmlkZSBNZWRpYUJyb3dzZXIyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gKE1lZGlhQnJvd3NlcjIpIHN1cGVyLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0TGlicmFyeVJvb3RfaW1wbChCdW5kbGUgcm9vdEhpbnRzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5nZXRMaWJyYXJ5Um9vdChnZXRDb250cm9sbGVyU3R1YigpLCByb290SGludHMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3Vic2NyaWJlX2ltcGwoU3RyaW5nIHBhcmVudElkLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnN1YnNjcmliZShnZXRDb250cm9sbGVyU3R1YigpLCBwYXJlbnRJZCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVuc3Vic2NyaWJlX2ltcGwoU3RyaW5nIHBhcmVudElkKSB7Ci0gICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnVuc3Vic2NyaWJlKGdldENvbnRyb2xsZXJTdHViKCksIHBhcmVudElkKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldEl0ZW1faW1wbChTdHJpbmcgbWVkaWFJZCkgewotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuZ2V0SXRlbShnZXRDb250cm9sbGVyU3R1YigpLCBtZWRpYUlkKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldENoaWxkcmVuX2ltcGwoU3RyaW5nIHBhcmVudElkLCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYWdlIDwgMSB8fCBwYWdlU2l6ZSA8IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5laXRoZXIgcGFnZSBub3IgcGFnZVNpemUgc2hvdWxkIGJlIGxlc3MgdGhhbiAxIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuZ2V0Q2hpbGRyZW4oZ2V0Q29udHJvbGxlclN0dWIoKSwgcGFyZW50SWQsIHBhZ2UsIHBhZ2VTaXplLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VhcmNoX2ltcGwoU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5IHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZWFyY2goZ2V0Q29udHJvbGxlclN0dWIoKSwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRTZWFyY2hSZXN1bHRfaW1wbChTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkgc2hvdWxkbid0IGJlIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2VTaXplIDwgMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmVpdGhlciBwYWdlIG5vciBwYWdlU2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuIDEiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuZ2V0U2VhcmNoUmVzdWx0KGdldENvbnRyb2xsZXJTdHViKCksIHF1ZXJ5LCBwYWdlLCBwYWdlU2l6ZSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uR2V0TGlicmFyeVJvb3REb25lKAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIHJvb3RIaW50cywgZmluYWwgU3RyaW5nIHJvb3RNZWRpYUlkLCBmaW5hbCBCdW5kbGUgcm9vdEV4dHJhKSB7Ci0gICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkdldExpYnJhcnlSb290RG9uZShnZXRJbnN0YW5jZSgpLCByb290SGludHMsIHJvb3RNZWRpYUlkLCByb290RXh0cmEpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkdldEl0ZW1Eb25lKFN0cmluZyBtZWRpYUlkLCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uR2V0SXRlbURvbmUoZ2V0SW5zdGFuY2UoKSwgbWVkaWFJZCwgaXRlbSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uR2V0Q2hpbGRyZW5Eb25lKFN0cmluZyBwYXJlbnRJZCwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQsCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkdldENoaWxkcmVuRG9uZShnZXRJbnN0YW5jZSgpLCBwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIHJlc3VsdCwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25TZWFyY2hSZXN1bHRDaGFuZ2VkKFN0cmluZyBxdWVyeSwgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25TZWFyY2hSZXN1bHRDaGFuZ2VkKGdldEluc3RhbmNlKCksIHF1ZXJ5LCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uR2V0U2VhcmNoUmVzdWx0RG9uZShTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0LAotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25HZXRTZWFyY2hSZXN1bHREb25lKGdldEluc3RhbmNlKCksIHF1ZXJ5LCBwYWdlLCBwYWdlU2l6ZSwgcmVzdWx0LCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkNoaWxkcmVuQ2hhbmdlZChmaW5hbCBTdHJpbmcgcGFyZW50SWQsIGludCBpdGVtQ291bnQsIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ2hpbGRyZW5DaGFuZ2VkKGdldEluc3RhbmNlKCksIHBhcmVudElkLCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ5MzY1YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFVF9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9BRERfSVRFTTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1JFTU9WRV9JVEVNOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfUkVQTEFDRV9JVEVNOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1Q7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVF9NRVRBREFUQTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9SRVBFQVRfTU9ERTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9TSFVGRkxFX01PREU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9NRURJQV9JRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1NFQVJDSDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1VSSTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX01FRElBX0lEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fU0VBUkNIOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fVVJJOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyLkNvbnRyb2xsZXJDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjIuUGxheWJhY2tJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50LlJlcGVhdE1vZGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQuU2h1ZmZsZU1vZGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbW1hbmRCdXR0b247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZEdyb3VwMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFDb250cm9sbGVyMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkd1YXJkZWRCeTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFDb250cm9sbGVyMkltcGwgaW1wbGVtZW50cyBNZWRpYUNvbnRyb2xsZXIyUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFDb250cm9sbGVyMiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFRPRE8oamFld2FuKTogQ2hhbmdlCi0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhQ29udHJvbGxlcjIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFDb250cm9sbGVyMlN0dWIgbUNvbnRyb2xsZXJTdHViOwotICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvblRva2VuMiBtVG9rZW47Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250cm9sbGVyQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3IgbUNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJQmluZGVyLkRlYXRoUmVjaXBpZW50IG1EZWF0aFJlY2lwaWVudDsKLQotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFNlc3Npb25TZXJ2aWNlQ29ubmVjdGlvbiBtU2VydmljZUNvbm5lY3Rpb247Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNSZWxlYXNlZDsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBMaXN0PE1lZGlhSXRlbTI+IG1QbGF5bGlzdDsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhMiBtUGxheWxpc3RNZXRhZGF0YTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBAUmVwZWF0TW9kZSBpbnQgbVJlcGVhdE1vZGU7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgQFNodWZmbGVNb2RlIGludCBtU2h1ZmZsZU1vZGU7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgaW50IG1QbGF5ZXJTdGF0ZTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBsb25nIG1Qb3NpdGlvbkV2ZW50VGltZU1zOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGxvbmcgbVBvc2l0aW9uTXM7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmxvYXQgbVBsYXliYWNrU3BlZWQ7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgbG9uZyBtQnVmZmVyZWRQb3NpdGlvbk1zOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFBsYXliYWNrSW5mbyBtUGxheWJhY2tJbmZvOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFBlbmRpbmdJbnRlbnQgbVNlc3Npb25BY3Rpdml0eTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBTZXNzaW9uQ29tbWFuZEdyb3VwMiBtQWxsb3dlZENvbW1hbmRzOwotCi0gICAgLy8gQXNzaWdubWVudCBzaG91bGQgYmUgdXNlZCB3aXRoIHRoZSBsb2NrIGhvbGQsIGJ1dCBzaG91bGQgYmUgdXNlZCB3aXRob3V0IGEgbG9jayB0byBwcmV2ZW50Ci0gICAgLy8gcG90ZW50aWFsIGRlYWRsb2NrLgotICAgIC8vIFBvc3RmaXggLUJpbmRlciBpcyBhZGRlZCB0byBleHBsaWNpdGx5IHNob3cgdGhhdCBpdCdzIHBvdGVudGlhbGx5IHJlbW90ZSBwcm9jZXNzIGNhbGwuCi0gICAgLy8gVGVjaG5pY2FsbHkgLUludGVyZmFjZSBpcyBtb3JlIGNvcnJlY3QsIGJ1dCBpdCBtYXkgbWlzcmVhZCB0aGF0IGl0J3MgaW50ZXJmYWNlICh2cyBjbGFzcykKLSAgICAvLyBzbyBsZXQncyBrZWVwIHRoaXMgcG9zdGZpeCB1bnRpbCB3ZSBmaW5kIGJldHRlciBwb3N0Zml4LgotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIHZvbGF0aWxlIElNZWRpYVNlc3Npb24yIG1TZXNzaW9uQmluZGVyOwotCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBSZXF1aXJlIHNlc3Npb24gYWN0aXZlbmVzcyBjaGFuZ2VkIGxpc3RlbmVyLCBiZWNhdXNlIGNvbnRyb2xsZXIgY2FuIGJlCi0gICAgLy8gICAgICAgICAgICAgICBhdmFpbGFibGUgd2hlbiB0aGUgc2Vzc2lvbidzIHBsYXllciBpcyBudWxsLgotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xsZXIySW1wbChDb250ZXh0IGNvbnRleHQsIE1lZGlhQ29udHJvbGxlcjIgaW5zdGFuY2UsIFNlc3Npb25Ub2tlbjIgdG9rZW4sCi0gICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgQ29udHJvbGxlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRva2VuIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV4ZWN1dG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImV4ZWN1dG9yIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtQ29udHJvbGxlclN0dWIgPSBuZXcgTWVkaWFDb250cm9sbGVyMlN0dWIodGhpcyk7Ci0gICAgICAgIG1Ub2tlbiA9IHRva2VuOwotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IgPSBleGVjdXRvcjsKLSAgICAgICAgbURlYXRoUmVjaXBpZW50ID0gKCkgLT4gewotICAgICAgICAgICAgbUluc3RhbmNlLmNsb3NlKCk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgbVNlc3Npb25CaW5kZXIgPSBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogTW9yZSBzYW5pdHkgY2hlY2tzLgotICAgICAgICBpZiAobVRva2VuLmdldFR5cGUoKSA9PSBTZXNzaW9uVG9rZW4yLlRZUEVfU0VTU0lPTikgewotICAgICAgICAgICAgLy8gU2Vzc2lvbgotICAgICAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIGNvbm5lY3RUb1Nlc3Npb24oU2Vzc2lvblRva2VuMkltcGwuZnJvbShtVG9rZW4pLmdldFNlc3Npb25CaW5kZXIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTZXNzaW9uIHNlcnZpY2UKLSAgICAgICAgICAgIGlmIChQcm9jZXNzLm15VWlkKCkgPT0gUHJvY2Vzcy5TWVNURU1fVUlEKSB7Ci0gICAgICAgICAgICAgICAgLy8gSXQncyBzeXN0ZW0gc2VydmVyIChNZWRpYVNlc3Npb25TZXJ2aWNlKSB0aGF0IHdhbnRzIHRvIG1vbml0b3Igc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAvLyBEb24ndCBiaW5kIGlmIGFibGUuLgotICAgICAgICAgICAgICAgIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IFNlc3Npb25Ub2tlbjJJbXBsLmZyb20obVRva2VuKS5nZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVzZSBiaW5kZXIgaW4gdGhlIHNlc3Npb24gdG9rZW4gaW5zdGVhZCBvZiBiaW5kIGJ5IGl0cyBvd24uCi0gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBzZXJ2ZXIgd2lsbCBob2xkcyB0aGUgYmluZGluZyB0byB0aGUgc2VydmljZSAqZm9yZXZlciogYW5kIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBuZXZlciBzdG9wLgotICAgICAgICAgICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBjb25uZWN0VG9TZXNzaW9uKFNlc3Npb25Ub2tlbjJJbXBsLmZyb20obVRva2VuKS5nZXRTZXNzaW9uQmluZGVyKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgaGFwcGVuIG9ubHkgd2hlbiBzeXN0ZW0gc2VydmVyIHdhbnRzIHRvIGRpc3BhdGNoIG1lZGlhIGtleSBldmVudHMgdG8KLSAgICAgICAgICAgICAgICAgICAgLy8gYSBkZWFkIHNlcnZpY2UuCi0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlN5c3RlbSBzZXJ2ZXIgYmluZHMgdG8gYSBzZXNzaW9uIHNlcnZpY2UuIFNob3VsZCB1bmJpbmQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB1c2UuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uID0gbmV3IFNlc3Npb25TZXJ2aWNlQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgY29ubmVjdFRvU2VydmljZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbm5lY3RUb1NlcnZpY2UoKSB7Ci0gICAgICAgIC8vIFNlcnZpY2UuIE5lZWRzIHRvIGdldCBmcmVzaCBiaW5kZXIgd2hlbmV2ZXIgY29ubmVjdGlvbiBpcyBuZWVkZWQuCi0gICAgICAgIFNlc3Npb25Ub2tlbjJJbXBsIGltcGwgPSBTZXNzaW9uVG9rZW4ySW1wbC5mcm9tKG1Ub2tlbik7Ci0gICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhU2Vzc2lvblNlcnZpY2UyLlNFUlZJQ0VfSU5URVJGQUNFKTsKLSAgICAgICAgaW50ZW50LnNldENsYXNzTmFtZShtVG9rZW4uZ2V0UGFja2FnZU5hbWUoKSwgaW1wbC5nZXRTZXJ2aWNlTmFtZSgpKTsKLQotICAgICAgICAvLyBVc2UgYmluZFNlcnZpY2UoKSBpbnN0ZWFkIG9mIHN0YXJ0Rm9yZWdyb3VuZFNlcnZpY2UoKSB0byBzdGFydCBzZXNzaW9uIHNlcnZpY2UgZm9yIHRocmVlCi0gICAgICAgIC8vIHJlYXNvbnMuCi0gICAgICAgIC8vIDEuIFByZXZlbnQgc2Vzc2lvbiBzZXJ2aWNlIG93bmVyJ3Mgc3RvcFNlbGYoKSBmcm9tIGRlc3Ryb3lpbmcgc2VydmljZS4KLSAgICAgICAgLy8gICAgV2l0aCB0aGUgc3RhcnRGb3JlZ3JvdW5kU2VydmljZSgpLCBzZXJ2aWNlJ3MgY2FsbCBvZiBzdG9wU2VsZigpIHdpbGwgdHJpZ2dlciBpbW1lZGlhdGUKLSAgICAgICAgLy8gICAgb25EZXN0cm95KCkgY2FsbHMgb24gdGhlIG1haW4gdGhyZWFkIGV2ZW4gd2hlbiBvbkNvbm5lY3QoKSBpcyBydW5uaW5nIGluIGFub3RoZXIKLSAgICAgICAgLy8gICAgdGhyZWFkLgotICAgICAgICAvLyAyLiBNaW5pbWl6ZSBBUElzIGZvciBkZXZlbG9wZXJzIHRvIHRha2UgY2FyZSBhYm91dC4KLSAgICAgICAgLy8gICAgV2l0aCBiaW5kU2VydmljZSgpLCBkZXZlbG9wZXJzIG9ubHkgbmVlZCB0byB0YWtlIGNhcmUgYWJvdXQgU2VydmljZS5vbkJpbmQoKQotICAgICAgICAvLyAgICBidXQgU2VydmljZS5vblN0YXJ0Q29tbWFuZCgpIHNob3VsZCBiZSBhbHNvIHRha2VuIGNhcmUgYWJvdXQgd2l0aCB0aGUKLSAgICAgICAgLy8gICAgc3RhcnRGb3JlZ3JvdW5kU2VydmljZSgpLgotICAgICAgICAvLyAzLiBGdXR1cmUgc3VwcG9ydCBmb3IgVUktbGVzcyBwbGF5YmFjawotICAgICAgICAvLyAgICBJZiBhIHNlcnZpY2Ugd2FudHMgdG8ga2VlcCBydW5uaW5nLCBpdCBzaG91bGQgYmUgZWl0aGVyIGZvcmVncm91bmQgc2VydmljZSBvcgotICAgICAgICAvLyAgICBib3VuZGVkIHNlcnZpY2UuIEJ1dCB0aGVyZSBoYWQgYmVlbiByZXF1ZXN0IGZvciB0aGUgZmVhdHVyZSBmb3Igc3lzdGVtIGFwcHMKLSAgICAgICAgLy8gICAgYW5kIHVzaW5nIGJpbmRTZXJ2aWNlKCkgd2lsbCBiZSBiZXR0ZXIgZml0IHdpdGggaXQuCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0OwotICAgICAgICBpZiAoUHJvY2Vzcy5teVVpZCgpID09IFByb2Nlc3MuU1lTVEVNX1VJRCkgewotICAgICAgICAgICAgLy8gVXNlIGJpbmRTZXJ2aWNlQXNVc2VyKCkgZm9yIGJpbmRpbmcgZnJvbSBzeXN0ZW0gc2VydmljZSB0byBhdm9pZCBmb2xsb3dpbmcgd2FybmluZy4KLSAgICAgICAgICAgIC8vIENvbnRleHRJbXBsOiBDYWxsaW5nIGEgbWV0aG9kIGluIHRoZSBzeXN0ZW0gcHJvY2VzcyB3aXRob3V0IGEgcXVhbGlmaWVkIHVzZXIKLSAgICAgICAgICAgIHJlc3VsdCA9IG1Db250ZXh0LmJpbmRTZXJ2aWNlQXNVc2VyKGludGVudCwgbVNlcnZpY2VDb25uZWN0aW9uLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUsCi0gICAgICAgICAgICAgICAgICAgIFVzZXJIYW5kbGUuZ2V0VXNlckhhbmRsZUZvclVpZChtVG9rZW4uZ2V0VWlkKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG1Db250ZXh0LmJpbmRTZXJ2aWNlKGludGVudCwgbVNlcnZpY2VDb25uZWN0aW9uLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcmVzdWx0KSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJiaW5kIHRvICIgKyBtVG9rZW4gKyAiIGZhaWxlZCIpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJiaW5kIHRvICIgKyBtVG9rZW4gKyAiIHN1Y2Nlc3MiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb25uZWN0VG9TZXNzaW9uKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlc3Npb25CaW5kZXIuY29ubmVjdChtQ29udHJvbGxlclN0dWIsIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIGNhbGwgY29ubmVjdGlvbiByZXF1ZXN0LiBGcmFtZXdvcmsgd2lsbCByZXRyeSIKLSAgICAgICAgICAgICAgICAgICAgKyAiIGF1dG9tYXRpY2FsbHkiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlX2ltcGwoKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVsZWFzZSBmcm9tICIgKyBtVG9rZW4pOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlcjsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1Jc1JlbGVhc2VkKSB7Ci0gICAgICAgICAgICAgICAgLy8gUHJldmVudCByZS1lbnRlcmFuY2UgZnJvbSB0aGUgQ29udHJvbGxlckNhbGxiYWNrLm9uRGlzY29ubmVjdGVkKCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSXNSZWxlYXNlZCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAobVNlcnZpY2VDb25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29udGV4dC51bmJpbmRTZXJ2aWNlKG1TZXJ2aWNlQ29ubmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIgPSBudWxsOwotICAgICAgICAgICAgbUNvbnRyb2xsZXJTdHViLmRlc3Ryb3koKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLmFzQmluZGVyKCkudW5saW5rVG9EZWF0aChtRGVhdGhSZWNpcGllbnQsIDApOwotICAgICAgICAgICAgICAgIGJpbmRlci5yZWxlYXNlKG1Db250cm9sbGVyU3R1Yik7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIE5vLW9wLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uRGlzY29ubmVjdGVkKG1JbnN0YW5jZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIElNZWRpYVNlc3Npb24yIGdldFNlc3Npb25CaW5kZXIoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbkJpbmRlcjsKLSAgICB9Ci0KLSAgICBNZWRpYUNvbnRyb2xsZXIyU3R1YiBnZXRDb250cm9sbGVyU3R1YigpIHsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyU3R1YjsKLSAgICB9Ci0KLSAgICBFeGVjdXRvciBnZXRDYWxsYmFja0V4ZWN1dG9yKCkgewotICAgICAgICByZXR1cm4gbUNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgfQotCi0gICAgQ29udGV4dCBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gbUNvbnRleHQ7Ci0gICAgfQotCi0gICAgTWVkaWFDb250cm9sbGVyMiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm5zIHNlc3Npb24gYmluZGVyIGlmIHRoZSBjb250cm9sbGVyIGNhbiBzZW5kIHRoZSBjb21tYW5kLgotICAgIElNZWRpYVNlc3Npb24yIGdldFNlc3Npb25CaW5kZXJJZkFibGUoaW50IGNvbW1hbmRDb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmICghbUFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmRDb2RlKSkgewotICAgICAgICAgICAgICAgIC8vIENhbm5vdCBzZW5kIGJlY2F1c2UgaXNuJ3QgYWxsb3dlZCB0by4KLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgdG8gY2FsbCBjb21tYW5kLCBjb21tYW5kQ29kZT0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIGNvbW1hbmRDb2RlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFNob3VsZCB3ZSBkbyB0aGlzIHdpdGggdGhlIGxvY2sgaG9sZD8KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ2Fubm90IHNlbmQgYmVjYXVzZSBkaXNjb25uZWN0ZWQuCi0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzIGRpc2Nvbm5lY3RlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiaW5kZXI7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJucyBzZXNzaW9uIGJpbmRlciBpZiB0aGUgY29udHJvbGxlciBjYW4gc2VuZCB0aGUgY29tbWFuZC4KLSAgICBJTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uQmluZGVySWZBYmxlKFNlc3Npb25Db21tYW5kMiBjb21tYW5kKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmICghbUFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmQpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29udHJvbGxlciBpc24ndCBhbGxvd2VkIHRvIGNhbGwgY29tbWFuZCwgY29tbWFuZD0iICsgY29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBTaG91bGQgd2UgZG8gdGhpcyB3aXRoIHRoZSBsb2NrIGhvbGQ/Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICBpZiAoYmluZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIENhbm5vdCBzZW5kIGJlY2F1c2UgZGlzY29ubmVjdGVkLgotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpcyBkaXNjb25uZWN0ZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmluZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldFNlc3Npb25Ub2tlbl9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVRva2VuOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICByZXR1cm4gYmluZGVyICE9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheV9pbXBsKCkgewotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QTEFZKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwYXVzZV9pbXBsKCkgewotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QQVVTRSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcF9pbXBsKCkgewotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19TVE9QKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW1faW1wbChNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNraXBUb1BsYXlsaXN0SXRlbShtQ29udHJvbGxlclN0dWIsIGl0ZW0udG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb1ByZXZpb3VzSXRlbV9pbXBsKCkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5za2lwVG9QcmV2aW91c0l0ZW0obUNvbnRyb2xsZXJTdHViKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW1faW1wbCgpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2tpcFRvTmV4dEl0ZW0obUNvbnRyb2xsZXJTdHViKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChpbnQgY29tbWFuZENvZGUpIHsKLSAgICAgICAgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKGNvbW1hbmRDb2RlLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKGludCBjb21tYW5kQ29kZSwgQnVuZGxlIGFyZ3MpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKG1Db250cm9sbGVyU3R1YiwgY29tbWFuZENvZGUsIGFyZ3MpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUGVuZGluZ0ludGVudCBnZXRTZXNzaW9uQWN0aXZpdHlfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uQWN0aXZpdHk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lVG9faW1wbChpbnQgdmFsdWUsIGludCBmbGFncykgewotICAgICAgICAvLyBUT0RPKGhkbW9vbik6IHNhbml0eSBjaGVjawotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVRfVk9MVU1FKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZXRWb2x1bWVUbyhtQ29udHJvbGxlclN0dWIsIHZhbHVlLCBmbGFncyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkanVzdFZvbHVtZV9pbXBsKGludCBkaXJlY3Rpb24sIGludCBmbGFncykgewotICAgICAgICAvLyBUT0RPKGhkbW9vbik6IHNhbml0eSBjaGVjawotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVRfVk9MVU1FKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5hZGp1c3RWb2x1bWUobUNvbnRyb2xsZXJTdHViLCBkaXJlY3Rpb24sIGZsYWdzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21VcmlfaW1wbChVcmkgdXJpLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX1VSSSk7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidXJpIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wcmVwYXJlRnJvbVVyaShtQ29udHJvbGxlclN0dWIsIHVyaSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVNlYXJjaF9pbXBsKFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAotICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9TRUFSQ0gpOwotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnByZXBhcmVGcm9tU2VhcmNoKG1Db250cm9sbGVyU3R1YiwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21NZWRpYUlkX2ltcGwoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZSgKLSAgICAgICAgICAgICAgICBDT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fTUVESUFfSUQpOwotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wcmVwYXJlRnJvbU1lZGlhSWQobUNvbnRyb2xsZXJTdHViLCBtZWRpYUlkLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tVXJpX2ltcGwoVXJpIHVyaSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9VUkkpOwotICAgICAgICBpZiAodXJpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVyaSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucGxheUZyb21VcmkobUNvbnRyb2xsZXJTdHViLCB1cmksIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheUZyb21TZWFyY2hfaW1wbChTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fU0VBUkNIKTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkgc2hvdWxkbid0IGJlIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wbGF5RnJvbVNlYXJjaChtQ29udHJvbGxlclN0dWIsIHF1ZXJ5LCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tTWVkaWFJZF9pbXBsKFN0cmluZyBtZWRpYUlkLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoCi0gICAgICAgICAgICAgICAgQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX01FRElBX0lEKTsKLSAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWVkaWFJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucGxheUZyb21NZWRpYUlkKG1Db250cm9sbGVyU3R1YiwgbWVkaWFJZCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSYXRpbmdfaW1wbChTdHJpbmcgbWVkaWFJZCwgUmF0aW5nMiByYXRpbmcpIHsKLSAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWVkaWFJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyYXRpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmF0aW5nIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZXRSYXRpbmcobUNvbnRyb2xsZXJTdHViLCBtZWRpYUlkLCByYXRpbmcudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmRfaW1wbChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgQnVuZGxlIGFyZ3MsIFJlc3VsdFJlY2VpdmVyIGNiKSB7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKGNvbW1hbmQpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNlbmRDdXN0b21Db21tYW5kKG1Db250cm9sbGVyU3R1YiwgY29tbWFuZC50b0J1bmRsZSgpLCBhcmdzLCBjYik7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PE1lZGlhSXRlbTI+IGdldFBsYXlsaXN0X2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWxpc3Q7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdF9pbXBsKExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9MSVNUKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gYnVuZGxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYnVuZGxlTGlzdC5hZGQobGlzdC5nZXQoaSkudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCdW5kbGUgbWV0YWRhdGFCdW5kbGUgPSAobWV0YWRhdGEgPT0gbnVsbCkgPyBudWxsIDogbWV0YWRhdGEudG9CdW5kbGUoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFBsYXlsaXN0KG1Db250cm9sbGVyU3R1YiwgYnVuZGxlTGlzdCwgbWV0YWRhdGFCdW5kbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgZ2V0UGxheWxpc3RNZXRhZGF0YV9pbXBsKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXlsaXN0TWV0YWRhdGE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhX2ltcGwoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZSgKLSAgICAgICAgICAgICAgICBDT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1RfTUVUQURBVEEpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS50b0J1bmRsZSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIudXBkYXRlUGxheWxpc3RNZXRhZGF0YShtQ29udHJvbGxlclN0dWIsIG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZV9pbXBsKCkgewotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QUkVQQVJFKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBmYXN0Rm9yd2FyZF9pbXBsKCkgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudCB0aGlzLiBOb3RlIHRoYXQgZmFzdCBmb3J3YXJkIGlzbid0IGEgdHJhbnNwb3J0IGNvbW1hbmQgYW55bW9yZQotICAgICAgICAvL3NlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChNZWRpYVNlc3Npb24yLkNPTU1BTkRfQ09ERV9TRVNTSU9OX0ZBU1RfRk9SV0FSRCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmV3aW5kX2ltcGwoKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogSW1wbGVtZW50IHRoaXMuIE5vdGUgdGhhdCByZXdpbmQgaXNuJ3QgYSB0cmFuc3BvcnQgY29tbWFuZCBhbnltb3JlCi0gICAgICAgIC8vc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKE1lZGlhU2Vzc2lvbjIuQ09NTUFORF9DT0RFX1NFU1NJT05fUkVXSU5EKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZWVrVG9faW1wbChsb25nIHBvcykgewotICAgICAgICBpZiAocG9zIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicG9zaXRpb24gc2hvdWxkbid0IGJlIG5lZ2F0aXZlIik7Ci0gICAgICAgIH0KLSAgICAgICAgQnVuZGxlIGFyZ3MgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGFyZ3MucHV0TG9uZyhNZWRpYVNlc3Npb24yU3R1Yi5BUkdVTUVOVF9LRVlfUE9TSVRJT04sIHBvcyk7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1NFRUtfVE8sIGFyZ3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9BRERfSVRFTSk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuYWRkUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaW5kZXgsIGl0ZW0udG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBsYXlsaXN0SXRlbV9pbXBsKE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfUkVNT1ZFX0lURU0pOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnJlbW92ZVBsYXlsaXN0SXRlbShtQ29udHJvbGxlclN0dWIsIGl0ZW0udG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW1faW1wbChpbnQgaW5kZXgsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbmRleCBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfUkVQTEFDRV9JVEVNKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5yZXBsYWNlUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaW5kZXgsIGl0ZW0udG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U2h1ZmZsZU1vZGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TaHVmZmxlTW9kZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZV9pbXBsKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAotICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfU0hVRkZMRV9NT0RFKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZXRTaHVmZmxlTW9kZShtQ29udHJvbGxlclN0dWIsIHNodWZmbGVNb2RlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRSZXBlYXRNb2RlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtUmVwZWF0TW9kZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlX2ltcGwoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1JFUEVBVF9NT0RFKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZXRSZXBlYXRNb2RlKG1Db250cm9sbGVyU3R1YiwgcmVwZWF0TW9kZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBQbGF5YmFja0luZm8gZ2V0UGxheWJhY2tJbmZvX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRQbGF5ZXJTdGF0ZV9pbXBsKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXllclN0YXRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFBvc2l0aW9uX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGxvbmcgdGltZURpZmYgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIG1Qb3NpdGlvbkV2ZW50VGltZU1zOwotICAgICAgICAgICAgbG9uZyBleHBlY3RlZFBvc2l0aW9uID0gbVBvc2l0aW9uTXMgKyAobG9uZykgKG1QbGF5YmFja1NwZWVkICogdGltZURpZmYpOwotICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIGV4cGVjdGVkUG9zaXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZsb2F0IGdldFBsYXliYWNrU3BlZWRfaW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja1NwZWVkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0QnVmZmVyZWRQb3NpdGlvbl9pbXBsKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJ1ZmZlcmVkUG9zaXRpb25NczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUl0ZW0yIGdldEN1cnJlbnRNZWRpYUl0ZW1faW1wbCgpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUGxheWVyU3RhdGVDaGFuZ2VzKGZpbmFsIGludCBzdGF0ZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWVyU3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5ZXJTdGF0ZUNoYW5nZWQobUluc3RhbmNlLCBzdGF0ZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vIFRPRE8oamFld2FuKTogUmVuYW1lIHRvIHNlZWsgY29tcGxldGVkCi0gICAgdm9pZCBwdXNoUG9zaXRpb25DaGFuZ2VzKGZpbmFsIGxvbmcgZXZlbnRUaW1lTXMsIGZpbmFsIGxvbmcgcG9zaXRpb25NcykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUG9zaXRpb25FdmVudFRpbWVNcyA9IGV2ZW50VGltZU1zOwotICAgICAgICAgICAgbVBvc2l0aW9uTXMgPSBwb3NpdGlvbk1zOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblNlZWtDb21wbGV0ZWQobUluc3RhbmNlLCBwb3NpdGlvbk1zKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUGxheWJhY2tTcGVlZENoYW5nZXMoZmluYWwgZmxvYXQgc3BlZWQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbVBsYXliYWNrU3BlZWQgPSBzcGVlZDsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5YmFja1NwZWVkQ2hhbmdlZChtSW5zdGFuY2UsIHNwZWVkKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoQnVmZmVyZWRQb3NpdGlvbkNoYW5nZXMoZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbUJ1ZmZlcmVkUG9zaXRpb25NcyA9IGJ1ZmZlcmVkUG9zaXRpb25NczsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEZpeCB0aGlzIC0tIGl0J3Mgbm93IGJ1ZmZlcmVkIHN0YXRlCi0gICAgICAgICAgICAvL21DYWxsYmFjay5vbkJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkKG1JbnN0YW5jZSwgYnVmZmVyZWRQb3NpdGlvbk1zKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUGxheWJhY2tJbmZvQ2hhbmdlcyhmaW5hbCBQbGF5YmFja0luZm8gaW5mbykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWJhY2tJbmZvID0gaW5mbzsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5YmFja0luZm9DaGFuZ2VkKG1JbnN0YW5jZSwgaW5mbyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgcHVzaFBsYXlsaXN0Q2hhbmdlcyhmaW5hbCBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0LCBmaW5hbCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWxpc3QgPSBwbGF5bGlzdDsKLSAgICAgICAgICAgIG1QbGF5bGlzdE1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkKG1JbnN0YW5jZSwgcGxheWxpc3QsIG1ldGFkYXRhKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUGxheWxpc3RNZXRhZGF0YUNoYW5nZXMoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbVBsYXlsaXN0TWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChtSW5zdGFuY2UsIG1ldGFkYXRhKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoU2h1ZmZsZU1vZGVDaGFuZ2VzKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtU2h1ZmZsZU1vZGUgPSBzaHVmZmxlTW9kZTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWQobUluc3RhbmNlLCBzaHVmZmxlTW9kZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgcHVzaFJlcGVhdE1vZGVDaGFuZ2VzKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1SZXBlYXRNb2RlID0gcmVwZWF0TW9kZTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHJlcGVhdE1vZGUpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hFcnJvcihpbnQgZXJyb3JDb2RlLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkVycm9yKG1JbnN0YW5jZSwgZXJyb3JDb2RlLCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLyBTaG91bGQgYmUgdXNlZCB3aXRob3V0IGEgbG9jayB0byBwcmV2ZW50IHBvdGVudGlhbCBkZWFkbG9jay4KLSAgICB2b2lkIG9uQ29ubmVjdGVkTm90TG9ja2VkKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIsCi0gICAgICAgICAgICBmaW5hbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBhbGxvd2VkQ29tbWFuZHMsCi0gICAgICAgICAgICBmaW5hbCBpbnQgcGxheWVyU3RhdGUsCi0gICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uRXZlbnRUaW1lTXMsCi0gICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uTXMsCi0gICAgICAgICAgICBmaW5hbCBmbG9hdCBwbGF5YmFja1NwZWVkLAotICAgICAgICAgICAgZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMsCi0gICAgICAgICAgICBmaW5hbCBQbGF5YmFja0luZm8gaW5mbywKLSAgICAgICAgICAgIGZpbmFsIGludCByZXBlYXRNb2RlLAotICAgICAgICAgICAgZmluYWwgaW50IHNodWZmbGVNb2RlLAotICAgICAgICAgICAgZmluYWwgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCwKLSAgICAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5KSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Db25uZWN0ZWROb3RMb2NrZWQgc2Vzc2lvbkJpbmRlcj0iICsgc2Vzc2lvbkJpbmRlcgotICAgICAgICAgICAgICAgICAgICArICIsIGFsbG93ZWRDb21tYW5kcz0iICsgYWxsb3dlZENvbW1hbmRzKTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIGNsb3NlID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbkJpbmRlciA9PSBudWxsIHx8IGFsbG93ZWRDb21tYW5kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ29ubmVjdGlvbiByZWplY3RlZC4KLSAgICAgICAgICAgICAgICBjbG9zZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgIGlmIChtSXNSZWxlYXNlZCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtU2Vzc2lvbkJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNhbm5vdCBiZSBub3RpZmllZCBhYm91dCB0aGUgY29ubmVjdGlvbiByZXN1bHQgbWFueSB0aW1lcy4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFByb2JhYmx5IGEgYnVnIG9yIG1hbGljaW91cyBhcHAuIik7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQWxsb3dlZENvbW1hbmRzID0gYWxsb3dlZENvbW1hbmRzOwotICAgICAgICAgICAgICAgIG1QbGF5ZXJTdGF0ZSA9IHBsYXllclN0YXRlOwotICAgICAgICAgICAgICAgIG1Qb3NpdGlvbkV2ZW50VGltZU1zID0gcG9zaXRpb25FdmVudFRpbWVNczsKLSAgICAgICAgICAgICAgICBtUG9zaXRpb25NcyA9IHBvc2l0aW9uTXM7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrU3BlZWQgPSBwbGF5YmFja1NwZWVkOwotICAgICAgICAgICAgICAgIG1CdWZmZXJlZFBvc2l0aW9uTXMgPSBidWZmZXJlZFBvc2l0aW9uTXM7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mbyA9IGluZm87Ci0gICAgICAgICAgICAgICAgbVJlcGVhdE1vZGUgPSByZXBlYXRNb2RlOwotICAgICAgICAgICAgICAgIG1TaHVmZmxlTW9kZSA9IHNodWZmbGVNb2RlOwotICAgICAgICAgICAgICAgIG1QbGF5bGlzdCA9IHBsYXlsaXN0OwotICAgICAgICAgICAgICAgIG1TZXNzaW9uQWN0aXZpdHkgPSBzZXNzaW9uQWN0aXZpdHk7Ci0gICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIgPSBzZXNzaW9uQmluZGVyOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGZvciB0aGUgbG9jYWwgYmluZGVyIGlzIG5vLW9wLAotICAgICAgICAgICAgICAgICAgICAvLyBzbyBjYW4gYmUgdXNlZCB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IGRlYWRsb2NrLgotICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5hc0JpbmRlcigpLmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCwgMCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGRpZWQgdG9vIGVhcmx5LiIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogS2VlcCBjb21tYW5kcyB0byBwcmV2ZW50cyBpbGxlZ2FsIEFQSSBjYWxscy4KLSAgICAgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgICAgIC8vIE5vdGU6IFdlIG1heSB0cmlnZ2VyIENvbnRyb2xsZXJDYWxsYmFja3Mgd2l0aCB0aGUgaW5pdGlhbCB2YWx1ZXMKLSAgICAgICAgICAgICAgICAvLyBCdXQgaXQncyBoYXJkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgdGhlIGNvbnRyb2xsZXIgY2FsbGJhY2tzCi0gICAgICAgICAgICAgICAgLy8gT25seSBub3RpZnkgYWJvdXQgdGhlCi0gICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ29ubmVjdGVkKG1JbnN0YW5jZSwgYWxsb3dlZENvbW1hbmRzKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGNsb3NlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVHJpY2sgdG8gY2FsbCByZWxlYXNlKCkgd2l0aG91dCBob2xkaW5nIHRoZSBsb2NrLCB0byBwcmV2ZW50IHBvdGVudGlhbCBkZWFkbG9jawotICAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIGRldmVsb3BlcidzIGN1c3RvbSBsb2NrIHdpdGhpbiB0aGUgQ29udHJvbGxlckNhbGxiYWNrLm9uRGlzY29ubmVjdGVkKCkuCi0gICAgICAgICAgICAgICAgbUluc3RhbmNlLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIG9uQ3VzdG9tQ29tbWFuZChmaW5hbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgZmluYWwgQnVuZGxlIGFyZ3MsCi0gICAgICAgICAgICBmaW5hbCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uQ3VzdG9tQ29tbWFuZCBjbWQ9IiArIGNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBEb3VibGUgY2hlY2sgaWYgdGhlIGNvbnRyb2xsZXIgZXhpc3RzLgotICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ3VzdG9tQ29tbWFuZChtSW5zdGFuY2UsIGNvbW1hbmQsIGFyZ3MsIHJlY2VpdmVyKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBvbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoZmluYWwgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZHMpIHsKLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKG1JbnN0YW5jZSwgY29tbWFuZHMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChmaW5hbCBMaXN0PENvbW1hbmRCdXR0b24+IGxheW91dCkgewotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkN1c3RvbUxheW91dENoYW5nZWQobUluc3RhbmNlLCBsYXlvdXQpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBtYWluIHRocmVhZC4KLSAgICBwcml2YXRlIGNsYXNzIFNlc3Npb25TZXJ2aWNlQ29ubmVjdGlvbiBpbXBsZW1lbnRzIFNlcnZpY2VDb25uZWN0aW9uIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUsIElCaW5kZXIgc2VydmljZSkgewotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0J3MgYWx3YXlzIG1haW4tdGhyZWFkLgotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TZXJ2aWNlQ29ubmVjdGVkICIgKyBuYW1lICsgIiAiICsgdGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2sKLSAgICAgICAgICAgIGlmICghbVRva2VuLmdldFBhY2thZ2VOYW1lKCkuZXF1YWxzKG5hbWUuZ2V0UGFja2FnZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgbmFtZSArICIgd2FzIGNvbm5lY3RlZCwgYnV0IGV4cGVjdGVkIHBrZz0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1Ub2tlbi5nZXRQYWNrYWdlTmFtZSgpICsgIiB3aXRoIGlkPSIgKyBtVG9rZW4uZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgc2Vzc2lvbkJpbmRlciA9IElNZWRpYVNlc3Npb24yLlN0dWIuYXNJbnRlcmZhY2Uoc2VydmljZSk7Ci0gICAgICAgICAgICBjb25uZWN0VG9TZXNzaW9uKHNlc3Npb25CaW5kZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKLSAgICAgICAgICAgIC8vIFRlbXBvcmFsIGxvc2Ugb2YgdGhlIGJpbmRpbmcgYmVjYXVzZSBvZiB0aGUgc2VydmljZSBjcmFzaC4gU3lzdGVtIHdpbGwgYXV0b21hdGljYWxseQotICAgICAgICAgICAgLy8gcmViaW5kLCBzbyBqdXN0IG5vLW9wLgotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZWFsbHk/IEVpdGhlciBkaXNjb25uZWN0IGNsZWFubHkgb3IKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gc2VydmljZSAiICsgbmFtZSArICIgaXMgZGlzY29ubmVjdGVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQmluZGluZ0RpZWQoQ29tcG9uZW50TmFtZSBuYW1lKSB7Ci0gICAgICAgICAgICAvLyBQZXJtYW5lbnQgbG9zZSBvZiB0aGUgYmluZGluZyBiZWNhdXNlIG9mIHRoZSBzZXJ2aWNlIHBhY2thZ2UgdXBkYXRlIG9yIHJlbW92ZWQuCi0gICAgICAgICAgICAvLyBUaGlzIFNlc3Npb25TZXJ2aWNlUmVjb3JkIHdpbGwgYmUgcmVtb3ZlZCBhY2NvcmRpbmdseSwgYnV0IGZvcmdldCBzZXNzaW9uIGJpbmRlciBoZXJlCi0gICAgICAgICAgICAvLyBmb3Igc3VyZS4KLSAgICAgICAgICAgIG1JbnN0YW5jZS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQbGF5YmFja0luZm9JbXBsIGltcGxlbWVudHMgUGxheWJhY2tJbmZvUHJvdmlkZXIgewotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBWUJBQ0tfVFlQRSA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEucGxheWJhY2tpbmZvX2ltcGwucGxheWJhY2tfdHlwZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVFJPTF9UWVBFID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5jb250cm9sX3R5cGUiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01BWF9WT0xVTUUgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnBsYXliYWNraW5mb19pbXBsLm1heF92b2x1bWUiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NVUlJFTlRfVk9MVU1FID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5jdXJyZW50X3ZvbHVtZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVVESU9fQVRUUklCVVRFUyA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEucGxheWJhY2tpbmZvX2ltcGwuYXVkaW9fYXR0cnMiOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgUGxheWJhY2tJbmZvIG1JbnN0YW5jZTsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtUGxheWJhY2tUeXBlOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtQ29udHJvbFR5cGU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1NYXhWb2x1bWU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1DdXJyZW50Vm9sdW1lOwotICAgICAgICBwcml2YXRlIGZpbmFsIEF1ZGlvQXR0cmlidXRlcyBtQXVkaW9BdHRyczsKLQotICAgICAgICBwcml2YXRlIFBsYXliYWNrSW5mb0ltcGwoaW50IHBsYXliYWNrVHlwZSwgQXVkaW9BdHRyaWJ1dGVzIGF0dHJzLCBpbnQgY29udHJvbFR5cGUsCi0gICAgICAgICAgICAgICAgaW50IG1heCwgaW50IGN1cnJlbnQpIHsKLSAgICAgICAgICAgIG1QbGF5YmFja1R5cGUgPSBwbGF5YmFja1R5cGU7Ci0gICAgICAgICAgICBtQXVkaW9BdHRycyA9IGF0dHJzOwotICAgICAgICAgICAgbUNvbnRyb2xUeXBlID0gY29udHJvbFR5cGU7Ci0gICAgICAgICAgICBtTWF4Vm9sdW1lID0gbWF4OwotICAgICAgICAgICAgbUN1cnJlbnRWb2x1bWUgPSBjdXJyZW50OwotICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IFBsYXliYWNrSW5mbyh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrVHlwZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja1R5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEF1ZGlvQXR0cmlidXRlcyBnZXRBdWRpb0F0dHJpYnV0ZXNfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQXVkaW9BdHRyczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldENvbnRyb2xUeXBlX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xUeXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0TWF4Vm9sdW1lX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1heFZvbHVtZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRWb2x1bWVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ3VycmVudFZvbHVtZTsKLSAgICAgICAgfQotCi0gICAgICAgIFBsYXliYWNrSW5mbyBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBCdW5kbGUgdG9CdW5kbGUoKSB7Ci0gICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEludChLRVlfUExBWUJBQ0tfVFlQRSwgbVBsYXliYWNrVHlwZSk7Ci0gICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9DT05UUk9MX1RZUEUsIG1Db250cm9sVHlwZSk7Ci0gICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9NQVhfVk9MVU1FLCBtTWF4Vm9sdW1lKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0NVUlJFTlRfVk9MVU1FLCBtQ3VycmVudFZvbHVtZSk7Ci0gICAgICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZShLRVlfQVVESU9fQVRUUklCVVRFUywgbUF1ZGlvQXR0cnMpOwotICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBQbGF5YmFja0luZm8gY3JlYXRlUGxheWJhY2tJbmZvKGludCBwbGF5YmFja1R5cGUsIEF1ZGlvQXR0cmlidXRlcyBhdHRycywKLSAgICAgICAgICAgICAgICBpbnQgY29udHJvbFR5cGUsIGludCBtYXgsIGludCBjdXJyZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBsYXliYWNrSW5mb0ltcGwocGxheWJhY2tUeXBlLCBhdHRycywgY29udHJvbFR5cGUsIG1heCwgY3VycmVudCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgUGxheWJhY2tJbmZvIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdm9sdW1lVHlwZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX1BMQVlCQUNLX1RZUEUpOwotICAgICAgICAgICAgZmluYWwgaW50IHZvbHVtZUNvbnRyb2wgPSBidW5kbGUuZ2V0SW50KEtFWV9DT05UUk9MX1RZUEUpOwotICAgICAgICAgICAgZmluYWwgaW50IG1heFZvbHVtZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX01BWF9WT0xVTUUpOwotICAgICAgICAgICAgZmluYWwgaW50IGN1cnJlbnRWb2x1bWUgPSBidW5kbGUuZ2V0SW50KEtFWV9DVVJSRU5UX1ZPTFVNRSk7Ci0gICAgICAgICAgICBmaW5hbCBBdWRpb0F0dHJpYnV0ZXMgYXR0cnMgPSBidW5kbGUuZ2V0UGFyY2VsYWJsZShLRVlfQVVESU9fQVRUUklCVVRFUyk7Ci0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVQbGF5YmFja0luZm8odm9sdW1lVHlwZSwgYXR0cnMsIHZvbHVtZUNvbnRyb2wsIG1heFZvbHVtZSwgY3VycmVudFZvbHVtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJTdHViLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJTdHViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZmM1ZGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUNvbnRyb2xsZXIyU3R1Yi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29tbWFuZEJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kR3JvdXAyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMkltcGwuUGxheWJhY2tJbmZvSW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kQnV0dG9uSW1wbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgTWVkaWFDb250cm9sbGVyMlN0dWIgZXh0ZW5kcyBJTWVkaWFDb250cm9sbGVyMi5TdHViIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhQ29udHJvbGxlcjJTdHViIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBDaGFuZ2UKLQotICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYUNvbnRyb2xsZXIySW1wbD4gbUNvbnRyb2xsZXI7Ci0KLSAgICBNZWRpYUNvbnRyb2xsZXIyU3R1YihNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyKSB7Ci0gICAgICAgIG1Db250cm9sbGVyID0gbmV3IFdlYWtSZWZlcmVuY2U8Pihjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbGxlcjJJbXBsIGdldENvbnRyb2xsZXIoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlciA9IG1Db250cm9sbGVyLmdldCgpOwotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb250cm9sbGVyIGlzIHJlbGVhc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUJyb3dzZXIySW1wbCBnZXRCcm93c2VyKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIGlmIChjb250cm9sbGVyIGluc3RhbmNlb2YgTWVkaWFCcm93c2VyMkltcGwpIHsKLSAgICAgICAgICAgIHJldHVybiAoTWVkaWFCcm93c2VyMkltcGwpIGNvbnRyb2xsZXI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKLSAgICAgICAgbUNvbnRyb2xsZXIuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChpbnQgc3RhdGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5ZXJTdGF0ZUNoYW5nZXMoc3RhdGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUG9zaXRpb25DaGFuZ2VkKGxvbmcgZXZlbnRUaW1lTXMsIGxvbmcgcG9zaXRpb25NcykgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChldmVudFRpbWVNcyA8IDApIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uUG9zaXRpb25DaGFuZ2VkKCk6IElnbm9yaW5nIG5lZ2F0aXZlIGV2ZW50VGltZU1zIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBvc2l0aW9uTXMgPCAwKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvblBvc2l0aW9uQ2hhbmdlZCgpOiBJZ25vcmluZyBuZWdhdGl2ZSBwb3NpdGlvbk1zIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoUG9zaXRpb25DaGFuZ2VzKGV2ZW50VGltZU1zLCBwb3NpdGlvbk1zKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXliYWNrU3BlZWRDaGFuZ2VkKGZsb2F0IHNwZWVkKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoUGxheWJhY2tTcGVlZENoYW5nZXMoc3BlZWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQnVmZmVyZWRQb3NpdGlvbkNoYW5nZWQobG9uZyBidWZmZXJlZFBvc2l0aW9uTXMpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnVmZmVyZWRQb3NpdGlvbk1zIDwgMCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZCgpOiBJZ25vcmluZyBuZWdhdGl2ZSBidWZmZXJlZFBvc2l0aW9uTXMiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hCdWZmZXJlZFBvc2l0aW9uQ2hhbmdlcyhidWZmZXJlZFBvc2l0aW9uTXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RDaGFuZ2VkKExpc3Q8QnVuZGxlPiBwbGF5bGlzdEJ1bmRsZSwgQnVuZGxlIG1ldGFkYXRhQnVuZGxlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBsYXlsaXN0QnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uUGxheWxpc3RDaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgcGxheWxpc3QgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmb3IgKEJ1bmRsZSBidW5kbGUgOiBwbGF5bGlzdEJ1bmRsZSkgewotICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGJ1bmRsZSk7Ci0gICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAib25QbGF5bGlzdENoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBpdGVtIGluIHBsYXlsaXN0Iik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBsYXlsaXN0LmFkZChpdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSA9IE1lZGlhTWV0YWRhdGEyLmZyb21CdW5kbGUobWV0YWRhdGFCdW5kbGUpOwotICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5bGlzdENoYW5nZXMocGxheWxpc3QsIG1ldGFkYXRhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSkgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhID0gTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VzKG1ldGFkYXRhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblJlcGVhdE1vZGVDaGFuZ2VkKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoUmVwZWF0TW9kZUNoYW5nZXMocmVwZWF0TW9kZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QbGF5YmFja0luZm9DaGFuZ2VkKEJ1bmRsZSBwbGF5YmFja0luZm8pIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvblBsYXliYWNrSW5mb0NoYW5nZWQiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIE1lZGlhQ29udHJvbGxlcjIuUGxheWJhY2tJbmZvIGluZm8gPSBQbGF5YmFja0luZm9JbXBsLmZyb21CdW5kbGUocGxheWJhY2tJbmZvKTsKLSAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25QbGF5YmFja0luZm9DaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgcGxheWJhY2tJbmZvIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoUGxheWJhY2tJbmZvQ2hhbmdlcyhpbmZvKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblNodWZmbGVNb2RlQ2hhbmdlZChpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hTaHVmZmxlTW9kZUNoYW5nZXMoc2h1ZmZsZU1vZGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoaW50IGVycm9yQ29kZSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaEVycm9yKGVycm9yQ29kZSwgZXh0cmFzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNvbm5lY3RlZChJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyLCBCdW5kbGUgY29tbWFuZEdyb3VwLAotICAgICAgICAgICAgaW50IHBsYXllclN0YXRlLCBsb25nIHBvc2l0aW9uRXZlbnRUaW1lTXMsIGxvbmcgcG9zaXRpb25NcywgZmxvYXQgcGxheWJhY2tTcGVlZCwKLSAgICAgICAgICAgIGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zLCBCdW5kbGUgcGxheWJhY2tJbmZvLCBpbnQgc2h1ZmZsZU1vZGUsIGludCByZXBlYXRNb2RlLAotICAgICAgICAgICAgTGlzdDxCdW5kbGU+IGl0ZW1CdW5kbGVMaXN0LCBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyID0gbUNvbnRyb2xsZXIuZ2V0KCk7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uQ29ubmVjdGVkIGFmdGVyIE1lZGlhQ29udHJvbGxlcjIuY2xvc2UoKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IGNvbnRyb2xsZXIuZ2V0Q29udGV4dCgpOwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IGl0ZW1MaXN0ID0gbnVsbDsKLSAgICAgICAgaWYgKGl0ZW1CdW5kbGVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGl0ZW1MaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1CdW5kbGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGl0ZW1CdW5kbGVMaXN0LmdldChpKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpdGVtTGlzdC5hZGQoaXRlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIub25Db25uZWN0ZWROb3RMb2NrZWQoc2Vzc2lvbkJpbmRlciwKLSAgICAgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMi5mcm9tQnVuZGxlKGNvbW1hbmRHcm91cCksCi0gICAgICAgICAgICAgICAgcGxheWVyU3RhdGUsIHBvc2l0aW9uRXZlbnRUaW1lTXMsIHBvc2l0aW9uTXMsIHBsYXliYWNrU3BlZWQsIGJ1ZmZlcmVkUG9zaXRpb25NcywKLSAgICAgICAgICAgICAgICBQbGF5YmFja0luZm9JbXBsLmZyb21CdW5kbGUocGxheWJhY2tJbmZvKSwgcmVwZWF0TW9kZSwgc2h1ZmZsZU1vZGUsCi0gICAgICAgICAgICAgICAgaXRlbUxpc3QsIHNlc3Npb25BY3Rpdml0eSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EaXNjb25uZWN0ZWQoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlci5nZXQoKTsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25EaXNjb25uZWN0ZWQgYWZ0ZXIgTWVkaWFDb250cm9sbGVyMi5jbG9zZSgpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DdXN0b21MYXlvdXRDaGFuZ2VkKExpc3Q8QnVuZGxlPiBjb21tYW5kQnV0dG9ubGlzdCkgewotICAgICAgICBpZiAoY29tbWFuZEJ1dHRvbmxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25DdXN0b21MYXlvdXRDaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgY29tbWFuZEJ1dHRvbmxpc3QiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIExpc3Q8Q29tbWFuZEJ1dHRvbj4gbGF5b3V0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZEJ1dHRvbmxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIENvbW1hbmRCdXR0b24gYnV0dG9uID0gQ29tbWFuZEJ1dHRvbkltcGwuZnJvbUJ1bmRsZShjb21tYW5kQnV0dG9ubGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgaWYgKGJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbGF5b3V0LmFkZChidXR0b24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIub25DdXN0b21MYXlvdXRDaGFuZ2VkKGxheW91dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKEJ1bmRsZSBjb21tYW5kc0J1bmRsZSkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGNvbW1hbmRzID0gU2Vzc2lvbkNvbW1hbmRHcm91cDIuZnJvbUJ1bmRsZShjb21tYW5kc0J1bmRsZSk7Ci0gICAgICAgIGlmIChjb21tYW5kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBjb21tYW5kcyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIub25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKGNvbW1hbmRzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkN1c3RvbUNvbW1hbmQoQnVuZGxlIGNvbW1hbmRCdW5kbGUsIEJ1bmRsZSBhcmdzLCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFNlc3Npb25Db21tYW5kMiBjb21tYW5kID0gU2Vzc2lvbkNvbW1hbmQyLmZyb21CdW5kbGUoY29tbWFuZEJ1bmRsZSk7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uQ3VzdG9tQ29tbWFuZCgpOiBJZ25vcmluZyBudWxsIGNvbW1hbmQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLm9uQ3VzdG9tQ29tbWFuZChjb21tYW5kLCBhcmdzLCByZWNlaXZlcik7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBNZWRpYUJyb3dzZXIgc3BlY2lmaWMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uR2V0TGlicmFyeVJvb3REb25lKEJ1bmRsZSByb290SGludHMsIFN0cmluZyByb290TWVkaWFJZCwgQnVuZGxlIHJvb3RFeHRyYSkKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uR2V0TGlicmFyeVJvb3REb25lKHJvb3RIaW50cywgcm9vdE1lZGlhSWQsIHJvb3RFeHRyYSk7Ci0gICAgfQotCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkdldEl0ZW1Eb25lKFN0cmluZyBtZWRpYUlkLCBCdW5kbGUgaXRlbUJ1bmRsZSkgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkdldEl0ZW1Eb25lKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJZCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQnJvd3NlcjJJbXBsIGJyb3dzZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBicm93c2VyID0gZ2V0QnJvd3NlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJyb3dzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYnJvd3Nlci5vbkdldEl0ZW1Eb25lKG1lZGlhSWQsIE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShpdGVtQnVuZGxlKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25HZXRDaGlsZHJlbkRvbmUoU3RyaW5nIHBhcmVudElkLCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLAotICAgICAgICAgICAgTGlzdDxCdW5kbGU+IGl0ZW1CdW5kbGVMaXN0LCBCdW5kbGUgZXh0cmFzKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkdldENoaWxkcmVuRG9uZSgpOiBJZ25vcmluZyBudWxsIHBhcmVudElkIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKGl0ZW1CdW5kbGVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChCdW5kbGUgYnVuZGxlIDogaXRlbUJ1bmRsZUxpc3QpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShidW5kbGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uR2V0Q2hpbGRyZW5Eb25lKHBhcmVudElkLCBwYWdlLCBwYWdlU2l6ZSwgcmVzdWx0LCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2VhcmNoUmVzdWx0Q2hhbmdlZChTdHJpbmcgcXVlcnksIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uU2VhcmNoUmVzdWx0Q2hhbmdlZCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQnJvd3NlcjJJbXBsIGJyb3dzZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBicm93c2VyID0gZ2V0QnJvd3NlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJyb3dzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYnJvd3Nlci5vblNlYXJjaFJlc3VsdENoYW5nZWQocXVlcnksIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkdldFNlYXJjaFJlc3VsdERvbmUoU3RyaW5nIHF1ZXJ5LCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLAotICAgICAgICAgICAgTGlzdDxCdW5kbGU+IGl0ZW1CdW5kbGVMaXN0LCBCdW5kbGUgZXh0cmFzKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uR2V0U2VhcmNoUmVzdWx0RG9uZSgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQnJvd3NlcjJJbXBsIGJyb3dzZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBicm93c2VyID0gZ2V0QnJvd3NlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJyb3dzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGlmIChpdGVtQnVuZGxlTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoQnVuZGxlIGJ1bmRsZSA6IGl0ZW1CdW5kbGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChNZWRpYUl0ZW0yLmZyb21CdW5kbGUoYnVuZGxlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJvd3Nlci5vbkdldFNlYXJjaFJlc3VsdERvbmUocXVlcnksIHBhZ2UsIHBhZ2VTaXplLCByZXN1bHQsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DaGlsZHJlbkNoYW5nZWQoU3RyaW5nIHBhcmVudElkLCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkNoaWxkcmVuQ2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIHBhcmVudElkIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uQ2hpbGRyZW5DaGFuZ2VkKHBhcmVudElkLCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUl0ZW0ySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUl0ZW0ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTBhMGYxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFJdGVtMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMi5GTEFHX0JST1dTQUJMRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yLkZMQUdfUExBWUFCTEU7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yLkJ1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yLkZsYWdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFJdGVtMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKLQotcHVibGljIGNsYXNzIE1lZGlhSXRlbTJJbXBsIGltcGxlbWVudHMgTWVkaWFJdGVtMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lEID0gImFuZHJvaWQubWVkaWEubWVkaWFpdGVtMi5pZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9GTEFHUyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhaXRlbTIuZmxhZ3MiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUVUQURBVEEgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWl0ZW0yLm1ldGFkYXRhIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1VVSUQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWl0ZW0yLnV1aWQiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUl0ZW0yIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtSWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUZsYWdzOwotICAgIHByaXZhdGUgZmluYWwgVVVJRCBtVVVJRDsKLSAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEyIG1NZXRhZGF0YTsKLSAgICBwcml2YXRlIERhdGFTb3VyY2VEZXNjIG1EYXRhU291cmNlRGVzYzsKLQotICAgIC8vIEZyb20gdGhlIHB1YmxpYyBBUEkKLSAgICBwdWJsaWMgTWVkaWFJdGVtMkltcGwoQE5vbk51bGwgU3RyaW5nIG1lZGlhSWQsIEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBkc2QsCi0gICAgICAgICAgICBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEsIEBGbGFncyBpbnQgZmxhZ3MpIHsKLSAgICAgICAgdGhpcyhtZWRpYUlkLCBkc2QsIG1ldGFkYXRhLCBmbGFncywgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUl0ZW0ySW1wbChATm9uTnVsbCBTdHJpbmcgbWVkaWFJZCwgQE51bGxhYmxlIERhdGFTb3VyY2VEZXNjIGRzZCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSwgQEZsYWdzIGludCBmbGFncywgQE51bGxhYmxlIFVVSUQgdXVpZCkgewotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwgJiYgIVRleHRVdGlscy5lcXVhbHMobWVkaWFJZCwgbWV0YWRhdGEuZ2V0TWVkaWFJZCgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWV0YWRhdGEncyBpZCBzaG91bGQgYmUgbWF0Y2hlZCB3aXRoIHRoZSBtZWRpYWlkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtSWQgPSBtZWRpYUlkOwotICAgICAgICBtRGF0YVNvdXJjZURlc2MgPSBkc2Q7Ci0gICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICBtRmxhZ3MgPSBmbGFnczsKLSAgICAgICAgbVVVSUQgPSAodXVpZCA9PSBudWxsKSA/IFVVSUQucmFuZG9tVVVJRCgpIDogdXVpZDsKLQotICAgICAgICBtSW5zdGFuY2UgPSBuZXcgTWVkaWFJdGVtMih0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNfaW1wbChPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE1lZGlhSXRlbTIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFJdGVtMiBvdGhlciA9IChNZWRpYUl0ZW0yKSBvYmo7Ci0gICAgICAgIHJldHVybiBtVVVJRC5lcXVhbHMoKChNZWRpYUl0ZW0ySW1wbCkgb3RoZXIuZ2V0UHJvdmlkZXIoKSkubVVVSUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGlzIG9iamVjdCBhcyBhIGJ1bmRsZSB0byBzaGFyZSBiZXR3ZWVuIHByb2Nlc3Nlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBuZXcgYnVuZGxlIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgewotICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9JRCwgbUlkKTsKLSAgICAgICAgYnVuZGxlLnB1dEludChLRVlfRkxBR1MsIG1GbGFncyk7Ci0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVuZGxlLnB1dEJ1bmRsZShLRVlfTUVUQURBVEEsIG1NZXRhZGF0YS50b0J1bmRsZSgpKTsKLSAgICAgICAgfQotICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9VVUlELCBtVVVJRC50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBNZWRpYUl0ZW0yIGZyb20gdGhlIHtAbGluayBCdW5kbGV9LgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlIHdoaWNoIHdhcyBwdWJsaXNoZWQgYnkge0BsaW5rIE1lZGlhSXRlbTIjdG9CdW5kbGUoKX0uCi0gICAgICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBNZWRpYUl0ZW0yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYUl0ZW0yIGZyb21CdW5kbGVfaW1wbChATm9uTnVsbCBCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nIHV1aWRTdHJpbmcgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9VVUlEKTsKLSAgICAgICAgcmV0dXJuIGZyb21CdW5kbGUoYnVuZGxlLCBVVUlELmZyb21TdHJpbmcodXVpZFN0cmluZykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIE1lZGlhSXRlbTIgZnJvbSB0aGUge0BsaW5rIEJ1bmRsZX0gd2l0aCB0aGUgc3BlY2lmaWVkIHtAbGluayBVVUlEfS4KLSAgICAgKiBJZiB7QGxpbmsgVVVJRH0KLSAgICAgKiBjYW4gYmUgbnVsbCBmb3IgY3JlYXRpbmcgbmV3LgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlIHdoaWNoIHdhcyBwdWJsaXNoZWQgYnkge0BsaW5rIE1lZGlhSXRlbTIjdG9CdW5kbGUoKX0uCi0gICAgICogQHBhcmFtIHV1aWQgQSB7QGxpbmsgVVVJRH0gdG8gb3ZlcnJpZGUuIENhbiBiZSB7QGxpbmsgbnVsbH0gZm9yIG92ZXJyaWRlLgotICAgICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgTWVkaWFJdGVtMgotICAgICAqLwotICAgIHN0YXRpYyBNZWRpYUl0ZW0yIGZyb21CdW5kbGUoQE5vbk51bGwgQnVuZGxlIGJ1bmRsZSwgQE51bGxhYmxlIFVVSUQgdXVpZCkgewotICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX0lEKTsKLSAgICAgICAgZmluYWwgQnVuZGxlIG1ldGFkYXRhQnVuZGxlID0gYnVuZGxlLmdldEJ1bmRsZShLRVlfTUVUQURBVEEpOwotICAgICAgICBmaW5hbCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSA9IE1lZGlhTWV0YWRhdGEyLmZyb21CdW5kbGUobWV0YWRhdGFCdW5kbGUpOwotICAgICAgICBmaW5hbCBpbnQgZmxhZ3MgPSBidW5kbGUuZ2V0SW50KEtFWV9GTEFHUyk7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMkltcGwoaWQsIG51bGwsIG1ldGFkYXRhLCBmbGFncywgdXVpZCkuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhSXRlbTIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZ19pbXBsKCkgewotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIk1lZGlhSXRlbTJ7Iik7Ci0gICAgICAgIHNiLmFwcGVuZCgibUZsYWdzPSIpLmFwcGVuZChtRmxhZ3MpOwotICAgICAgICBzYi5hcHBlbmQoIiwgbU1ldGFkYXRhPSIpLmFwcGVuZChtTWV0YWRhdGEpOwotICAgICAgICBzYi5hcHBlbmQoJ30nKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBGbGFncyBpbnQgZ2V0RmxhZ3NfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1GbGFnczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Jyb3dzYWJsZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gKG1GbGFncyAmIEZMQUdfQlJPV1NBQkxFKSAhPSAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzUGxheWFibGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBGTEFHX1BMQVlBQkxFKSAhPSAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFkYXRhX2ltcGwoQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsICYmICFUZXh0VXRpbHMuZXF1YWxzKG1JZCwgbWV0YWRhdGEuZ2V0TWVkaWFJZCgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWV0YWRhdGEncyBpZCBzaG91bGQgYmUgbWF0Y2hlZCB3aXRoIHRoZSBtZWRpYUlkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBnZXRNZXRhZGF0YV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbU1ldGFkYXRhOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATm9uTnVsbCBTdHJpbmcgZ2V0TWVkaWFJZF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUlkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZ2V0RGF0YVNvdXJjZURlc2NfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1EYXRhU291cmNlRGVzYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgTWVkaWFJdGVtMlByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgQnVpbGRlciBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgQEZsYWdzIGludCBtRmxhZ3M7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1NZWRpYUlkOwotICAgICAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEyIG1NZXRhZGF0YTsKLSAgICAgICAgcHJpdmF0ZSBEYXRhU291cmNlRGVzYyBtRGF0YVNvdXJjZURlc2M7Ci0KLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKEJ1aWxkZXIgaW5zdGFuY2UsIGludCBmbGFncykgewotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRNZWRpYUlkX2ltcGwoQE51bGxhYmxlIFN0cmluZyBtZWRpYUlkKSB7Ci0gICAgICAgICAgICBtTWVkaWFJZCA9IG1lZGlhSWQ7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1ldGFkYXRhX2ltcGwoQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGF0YVNvdXJjZURlc2NfaW1wbChATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZGF0YVNvdXJjZURlc2MpIHsKLSAgICAgICAgICAgIG1EYXRhU291cmNlRGVzYyA9IGRhdGFTb3VyY2VEZXNjOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTWVkaWFJdGVtMiBidWlsZF9pbXBsKCkgewotICAgICAgICAgICAgU3RyaW5nIGlkID0gKG1NZXRhZGF0YSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICA/IG1NZXRhZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YTIuTUVUQURBVEFfS0VZX01FRElBX0lEKSA6IG51bGw7Ci0gICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vICBUT0RPKGphZXdhbik6IERvdWJsZSBjaGVjayBpZiBpdHMgc3VmZmljaWVudCAoZS5nLiBVc2UgVVVJRCBpbnN0ZWFkPykKLSAgICAgICAgICAgICAgICBpZCA9IChtTWVkaWFJZCAhPSBudWxsKSA/IG1NZWRpYUlkIDogdG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMkltcGwoaWQsIG1EYXRhU291cmNlRGVzYywgbU1ldGFkYXRhLCBtRmxhZ3MpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YzNGNkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5MaWJyYXJ5Um9vdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uLkJ1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uLk1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbnRyb2xsZXJJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhTGlicmFyeVNlcnZpY2UyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkJ1aWxkZXJCYXNlSW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsIGV4dGVuZHMgTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsIGltcGxlbWVudHMKLSAgICAgICAgTWVkaWFMaWJyYXJ5U2VydmljZTJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb25TZXJ2aWNlMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBNZWRpYUxpYnJhcnlTZXNzaW9uIG1MaWJyYXJ5U2Vzc2lvbjsKLQotICAgIHB1YmxpYyBNZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwoTWVkaWFMaWJyYXJ5U2VydmljZTIgaW5zdGFuY2UpIHsKLSAgICAgICAgc3VwZXIoaW5zdGFuY2UpOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZV9pbXBsKCkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZV9pbXBsKCk7Ci0KLSAgICAgICAgLy8gRWZmZWN0aXZlbHkgZmluYWwKLSAgICAgICAgTWVkaWFTZXNzaW9uMiBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICBpZiAoIShzZXNzaW9uIGluc3RhbmNlb2YgTWVkaWFMaWJyYXJ5U2Vzc2lvbikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBNZWRpYUxpYnJhcnlTZXNzaW9uLCBidXQgcmV0dXJuZWQgTWVkaWFTZXNzaW9uMiIpOwotICAgICAgICB9Ci0gICAgICAgIG1MaWJyYXJ5U2Vzc2lvbiA9IChNZWRpYUxpYnJhcnlTZXNzaW9uKSBnZXRTZXNzaW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgaW50IGdldFNlc3Npb25UeXBlKCkgewotICAgICAgICByZXR1cm4gU2Vzc2lvblRva2VuMi5UWVBFX0xJQlJBUllfU0VSVklDRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsIGV4dGVuZHMgTWVkaWFTZXNzaW9uMkltcGwKLSAgICAgICAgICAgIGltcGxlbWVudHMgTWVkaWFMaWJyYXJ5U2Vzc2lvblByb3ZpZGVyIHsKLSAgICAgICAgcHVibGljIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsKENvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICBNZWRpYVBsYXllckJhc2UgcGxheWVyLCBTdHJpbmcgaWQsIE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlciwKLSAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSwgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwKLSAgICAgICAgICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHBsYXllciwgaWQsIHBsYXlsaXN0QWdlbnQsIHZvbHVtZVByb3ZpZGVyLCBzZXNzaW9uQWN0aXZpdHksCi0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrRXhlY3V0b3IsIGNhbGxiYWNrKTsKLSAgICAgICAgICAgIC8vIERvbid0IHB1dCBhbnkgZXh0cmEgaW5pdGlhbGl6YXRpb24gaGVyZS4gSGVyZSdzIHRoZSByZWFzb24uCi0gICAgICAgICAgICAvLyBTeXN0ZW0gc2VydmljZSB3aWxsIHJlY29nbml6ZSB0aGlzIHNlc3Npb24gaW5zaWRlIG9mIHRoZSBzdXBlciBjb25zdHJ1Y3RvciBhbmQgd291bGQKLSAgICAgICAgICAgIC8vIGNvbm5lY3QgdG8gdGhpcyBzZXNzaW9uIGFzc3VtaW5nIHRoYXQgaW5pdGlhbGl6YXRpb24gaXMgZmluaXNoZWQuIEhvd2V2ZXIsIGlmIGFueQotICAgICAgICAgICAgLy8gaW5pdGlhbGl6YXRpb24gbG9naWMgaXMgaGVyZSwgY2FsbHMgZnJvbSB0aGUgc2VydmVyIHdvdWxkIGZhaWwuCi0gICAgICAgICAgICAvLyBzZWU6IE1lZGlhU2Vzc2lvbjJTdHViI2Nvbm5lY3QoKQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb24gY3JlYXRlSW5zdGFuY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhTGlicmFyeVNlc3Npb24odGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgTWVkaWFMaWJyYXJ5U2Vzc2lvbiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAoTWVkaWFMaWJyYXJ5U2Vzc2lvbikgc3VwZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2sgZ2V0Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICByZXR1cm4gKE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjaykgc3VwZXIuZ2V0Q2FsbGJhY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWRfaW1wbChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcGFyZW50SWQsCi0gICAgICAgICAgICAgICAgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRyb2xsZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyZW50SWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldFNlc3Npb25TdHViKCkubm90aWZ5Q2hpbGRyZW5DaGFuZ2VkTm90TG9ja2VkKGNvbnRyb2xsZXIsIHBhcmVudElkLCBpdGVtQ291bnQsCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2hpbGRyZW5DaGFuZ2VkX2ltcGwoU3RyaW5nIHBhcmVudElkLCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRTZXNzaW9uU3R1YigpLm5vdGlmeUNoaWxkcmVuQ2hhbmdlZE5vdExvY2tlZChwYXJlbnRJZCwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeVNlYXJjaFJlc3VsdENoYW5nZWRfaW1wbChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcXVlcnksCi0gICAgICAgICAgICAgICAgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRyb2xsZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldFNlc3Npb25TdHViKCkubm90aWZ5U2VhcmNoUmVzdWx0Q2hhbmdlZChjb250cm9sbGVyLCBxdWVyeSwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVySW1wbAotICAgICAgICAgICAgZXh0ZW5kcyBCdWlsZGVyQmFzZUltcGw8TWVkaWFMaWJyYXJ5U2Vzc2lvbiwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrPiB7Ci0gICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChNZWRpYUxpYnJhcnlTZXJ2aWNlMiBzZXJ2aWNlLCBCdWlsZGVyIGluc3RhbmNlLAotICAgICAgICAgICAgICAgIEV4ZWN1dG9yIGNhbGxiYWNrRXhlY3V0b3IsIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoc2VydmljZSk7Ci0gICAgICAgICAgICBzZXRTZXNzaW9uQ2FsbGJhY2tfaW1wbChjYWxsYmFja0V4ZWN1dG9yLCBjYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE1lZGlhTGlicmFyeVNlc3Npb24gYnVpbGRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwobUNvbnRleHQsIG1QbGF5ZXIsIG1JZCwgbVBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVQcm92aWRlciwgbVNlc3Npb25BY3Rpdml0eSwgbUNhbGxiYWNrRXhlY3V0b3IsIG1DYWxsYmFjaykuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTGlicmFyeVJvb3RJbXBsIGltcGxlbWVudHMgTGlicmFyeVJvb3RQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTGlicmFyeVJvb3QgbUluc3RhbmNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUm9vdElkOwotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtRXh0cmFzOwotCi0gICAgICAgIHB1YmxpYyBMaWJyYXJ5Um9vdEltcGwoTGlicmFyeVJvb3QgaW5zdGFuY2UsIFN0cmluZyByb290SWQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIGlmIChyb290SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvb3RJZCBzaG91bGRuJ3QgYmUgbnVsbC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgbVJvb3RJZCA9IHJvb3RJZDsKLSAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRSb290SWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUm9vdElkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUV4dHJhczsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFNZXRhZGF0YTJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTWV0YWRhdGEySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjFjNTMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFNZXRhZGF0YTJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLio7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLkJpdG1hcEtleTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLkJ1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi5Mb25nS2V5OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuUmF0aW5nS2V5OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuVGV4dEtleTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFNZXRhZGF0YTJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYU1ldGFkYXRhMkltcGwgaW1wbGVtZW50cyBNZWRpYU1ldGFkYXRhMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhTWV0YWRhdGEyIjsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9MT05HID0gMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfVEVYVCA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX0JJVE1BUCA9IDI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX1JBVElORyA9IDM7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX0ZMT0FUID0gNDsKLSAgICBzdGF0aWMgZmluYWwgQXJyYXlNYXA8U3RyaW5nLCBJbnRlZ2VyPiBNRVRBREFUQV9LRVlTX1RZUEU7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUgPSBuZXcgQXJyYXlNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9USVRMRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVJUSVNULCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9EVVJBVElPTiwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQUxCVU0sIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FVVEhPUiwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfV1JJVEVSLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9DT01QT1NFUiwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQ09NUElMQVRJT04sIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RBVEUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1lFQVIsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0dFTlJFLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9UUkFDS19OVU1CRVIsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX05VTV9UUkFDS1MsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU0NfTlVNQkVSLCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRJU1QsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FSVCwgTUVUQURBVEFfVFlQRV9CSVRNQVApOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BUlRfVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTV9BUlQsIE1FVEFEQVRBX1RZUEVfQklUTUFQKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQUxCVU1fQVJUX1VSSSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfVVNFUl9SQVRJTkcsIE1FVEFEQVRBX1RZUEVfUkFUSU5HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfUkFUSU5HLCBNRVRBREFUQV9UWVBFX1JBVElORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfVElUTEUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfU1VCVElUTEUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfREVTQ1JJUFRJT04sIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTiwgTUVUQURBVEFfVFlQRV9CSVRNQVApOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT05fVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9NRURJQV9JRCwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQlRfRk9MREVSX1RZUEUsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX01FRElBX1VSSSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQURWRVJUSVNFTUVOVCwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRE9XTkxPQURfU1RBVFVTLCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEBUZXh0S2V5Ci0gICAgU3RyaW5nW10gUFJFRkVSUkVEX0RFU0NSSVBUSU9OX09SREVSID0gewotICAgICAgICAgICAgTUVUQURBVEFfS0VZX1RJVExFLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FSVElTVCwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BTEJVTSwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRJU1QsCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfV1JJVEVSLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FVVEhPUiwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9DT01QT1NFUgotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBAQml0bWFwS2V5Ci0gICAgU3RyaW5nW10gUFJFRkVSUkVEX0JJVE1BUF9PUkRFUiA9IHsKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT04sCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJULAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVAotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBAVGV4dEtleQotICAgIFN0cmluZ1tdIFBSRUZFUlJFRF9VUklfT1JERVIgPSB7Ci0gICAgICAgICAgICBNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OX1VSSSwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BUlRfVVJJLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVF9VUkkKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYU1ldGFkYXRhMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMkltcGwoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBtSW5zdGFuY2UgPSBuZXcgTWVkaWFNZXRhZGF0YTIodGhpcyk7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5X2ltcGwoU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUZXh0X2ltcGwoQFRleHRLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldENoYXJTZXF1ZW5jZShrZXkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgU3RyaW5nIGdldE1lZGlhSWRfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZS5nZXRTdHJpbmcoTUVUQURBVEFfS0VZX01FRElBX0lEKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ19pbXBsKEBUZXh0S2V5IFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IG1CdW5kbGUuZ2V0Q2hhclNlcXVlbmNlKGtleSk7Ci0gICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0TG9uZ19pbXBsKEBMb25nS2V5IFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRMb25nKGtleSwgMCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhdGluZzIgZ2V0UmF0aW5nX2ltcGwoQFJhdGluZ0tleSBTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBBZGQgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotICAgICAgICBSYXRpbmcyIHJhdGluZyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByYXRpbmcgPSBSYXRpbmcyLmZyb21CdW5kbGUobUJ1bmRsZS5nZXRCdW5kbGUoa2V5KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUsIHZhbHVlIHdhcyBub3QgYSByYXRpbmcKLSAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0byByZXRyaWV2ZSBhIGtleSBhcyBSYXRpbmcuIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJhdGluZzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXRfaW1wbChARmxvYXRLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEZsb2F0KGtleSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJpdG1hcCBnZXRCaXRtYXBfaW1wbChAQml0bWFwS2V5IFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBCaXRtYXAgYm1wID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJtcCA9IG1CdW5kbGUuZ2V0UGFyY2VsYWJsZShrZXkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlLCB2YWx1ZSB3YXMgbm90IGEgYml0bWFwCi0gICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gcmV0cmlldmUgYSBrZXkgYXMgQml0bWFwLiIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBibXA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXNfaW1wbCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJ1bmRsZShNRVRBREFUQV9LRVlfRVhUUkFTKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSwgdmFsdWUgd2FzIG5vdCBhbiBidW5kbGUKLSAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0byByZXRyaWV2ZSBhbiBleHRyYSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgc2l6ZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5zaXplKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNldDxTdHJpbmc+IGtleVNldF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5rZXlTZXQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFNZXRhZGF0YTIgZnJvbUJ1bmRsZV9pbXBsKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIChidW5kbGUgPT0gbnVsbCkgPyBudWxsIDogbmV3IE1lZGlhTWV0YWRhdGEySW1wbChidW5kbGUpLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVySW1wbCBpbXBsZW1lbnRzIE1lZGlhTWV0YWRhdGEyUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYU1ldGFkYXRhMi5CdWlsZGVyIG1JbnN0YW5jZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLQotICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIgaW5zdGFuY2UsIE1lZGlhTWV0YWRhdGEyIHNvdXJjZSkgewotICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic291cmNlIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKHNvdXJjZS50b0J1bmRsZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChpbnQgbWF4Qml0bWFwU2l6ZSkgewotICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIodGhpcyk7Ci0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBtQnVuZGxlLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbUJ1bmRsZS5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCaXRtYXApIHsKLSAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJtcCA9IChCaXRtYXApIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICBpZiAoYm1wLmdldEhlaWdodCgpID4gbWF4Qml0bWFwU2l6ZSB8fCBibXAuZ2V0V2lkdGgoKSA+IG1heEJpdG1hcFNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5wdXRCaXRtYXAoa2V5LCBzY2FsZUJpdG1hcChibXAsIG1heEJpdG1hcFNpemUpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRUZXh0X2ltcGwoQFRleHRLZXkgU3RyaW5nIGtleSwgQ2hhclNlcXVlbmNlIHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9URVhUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBDaGFyU2VxdWVuY2UiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dENoYXJTZXF1ZW5jZShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0U3RyaW5nX2ltcGwoQFRleHRLZXkgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9URVhUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBTdHJpbmciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dENoYXJTZXF1ZW5jZShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0TG9uZ19pbXBsKEBMb25nS2V5IFN0cmluZyBrZXksIGxvbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX0xPTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIGxvbmciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dExvbmcoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dFJhdGluZ19pbXBsKEBSYXRpbmdLZXkgU3RyaW5nIGtleSwgUmF0aW5nMiB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfUkFUSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBSYXRpbmciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShrZXksIHZhbHVlLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRCaXRtYXBfaW1wbChAQml0bWFwS2V5IFN0cmluZyBrZXksIEJpdG1hcCB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfQklUTUFQKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBCaXRtYXAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dFBhcmNlbGFibGUoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dEZsb2F0X2ltcGwoQEZsb2F0S2V5IFN0cmluZyBrZXksIGZsb2F0IHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9GTE9BVCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgZmxvYXQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEZsb2F0KGtleSwgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXNfaW1wbChCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShNRVRBREFUQV9LRVlfRVhUUkFTLCBidW5kbGUpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgYnVpbGRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsKG1CdW5kbGUpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIEJpdG1hcCBzY2FsZUJpdG1hcChCaXRtYXAgYm1wLCBpbnQgbWF4U2l6ZSkgewotICAgICAgICAgICAgZmxvYXQgbWF4U2l6ZUYgPSBtYXhTaXplOwotICAgICAgICAgICAgZmxvYXQgd2lkdGhTY2FsZSA9IG1heFNpemVGIC8gYm1wLmdldFdpZHRoKCk7Ci0gICAgICAgICAgICBmbG9hdCBoZWlnaHRTY2FsZSA9IG1heFNpemVGIC8gYm1wLmdldEhlaWdodCgpOwotICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSBNYXRoLm1pbih3aWR0aFNjYWxlLCBoZWlnaHRTY2FsZSk7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0ID0gKGludCkgKGJtcC5nZXRIZWlnaHQoKSAqIHNjYWxlKTsKLSAgICAgICAgICAgIGludCB3aWR0aCA9IChpbnQpIChibXAuZ2V0V2lkdGgoKSAqIHNjYWxlKTsKLSAgICAgICAgICAgIHJldHVybiBCaXRtYXAuY3JlYXRlU2NhbGVkQml0bWFwKGJtcCwgd2lkdGgsIGhlaWdodCwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFQbGF5bGlzdEFnZW50SW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXlsaXN0QWdlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZDRlMWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXlsaXN0QWdlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5DYWxsYmFja0V4ZWN1dG9yOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50LlBsYXlsaXN0RXZlbnRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVBsYXlsaXN0QWdlbnRQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLkd1YXJkZWRCeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFQbGF5bGlzdEFnZW50SW1wbCBpbXBsZW1lbnRzIE1lZGlhUGxheWxpc3RBZ2VudFByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUGxheWxpc3RBZ2VudCI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBtSW5zdGFuY2U7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBtQ2FsbGJhY2tzID0gbmV3IEFycmF5TWFwPD4oKTsKLQotICAgIHB1YmxpYyBNZWRpYVBsYXlsaXN0QWdlbnRJbXBsKE1lZGlhUGxheWxpc3RBZ2VudCBpbnN0YW5jZSkgewotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCByZWdpc3RlclBsYXlsaXN0RXZlbnRDYWxsYmFja19pbXBsKAotICAgICAgICAgICAgQE5vbk51bGwgQENhbGxiYWNrRXhlY3V0b3IgRXhlY3V0b3IgZXhlY3V0b3IsIEBOb25OdWxsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXhlY3V0b3Igc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tzLmdldChjYWxsYmFjaykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgImNhbGxiYWNrIGlzIGFscmVhZHkgYWRkZWQuIElnbm9yaW5nLiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFja3MucHV0KGNhbGxiYWNrLCBleGVjdXRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrX2ltcGwoCi0gICAgICAgICAgICBATm9uTnVsbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbUNhbGxiYWNrcy5yZW1vdmUoY2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgZmluYWwgcHVibGljIHZvaWQgbm90aWZ5UGxheWxpc3RDaGFuZ2VkX2ltcGwoKSB7Ci0gICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IGdldENhbGxiYWNrcygpOwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0PSBtSW5zdGFuY2UuZ2V0UGxheWxpc3QoKTsKLSAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEgPSBtSW5zdGFuY2UuZ2V0UGxheWxpc3RNZXRhZGF0YSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrID0gY2FsbGJhY2tzLmtleUF0KGkpOwotICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBjYWxsYmFja3MudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwgcGxheWxpc3QsIG1ldGFkYXRhKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCBub3RpZnlQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZF9pbXBsKCkgewotICAgICAgICBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBjYWxsYmFja3MgPSBnZXRDYWxsYmFja3MoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBjYWxsYmFjayA9IGNhbGxiYWNrcy5rZXlBdChpKTsKLSAgICAgICAgICAgIGZpbmFsIEV4ZWN1dG9yIGV4ZWN1dG9yID0gY2FsbGJhY2tzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IGNhbGxiYWNrLm9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwgbUluc3RhbmNlLmdldFBsYXlsaXN0TWV0YWRhdGEoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgZmluYWwgcHVibGljIHZvaWQgbm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkX2ltcGwoKSB7Ci0gICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IGdldENhbGxiYWNrcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrID0gY2FsbGJhY2tzLmtleUF0KGkpOwotICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBjYWxsYmFja3MudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwgbUluc3RhbmNlLmdldFNodWZmbGVNb2RlKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHB1YmxpYyB2b2lkIG5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkX2ltcGwoKSB7Ci0gICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IGdldENhbGxiYWNrcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrID0gY2FsbGJhY2tzLmtleUF0KGkpOwotICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBjYWxsYmFja3MudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0UmVwZWF0TW9kZSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3RfaW1wbCgpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3RfaW1wbChATm9uTnVsbCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsCi0gICAgICAgICAgICBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIGdldFBsYXlsaXN0TWV0YWRhdGFfaW1wbCgpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YV9pbXBsKEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtX2ltcGwoQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtX2ltcGwoQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtX2ltcGwoKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW1faW1wbCgpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGVfaW1wbChpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U2h1ZmZsZU1vZGVfaW1wbCgpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZV9pbXBsKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgTWVkaWFJdGVtMiBnZXRNZWRpYUl0ZW1faW1wbChATm9uTnVsbCBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgaWYgKGRzZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkc2Qgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IGl0ZW1MaXN0ID0gbUluc3RhbmNlLmdldFBsYXlsaXN0KCk7Ci0gICAgICAgIGlmIChpdGVtTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1MaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBpdGVtTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsICYmIGl0ZW0uZ2V0RGF0YVNvdXJjZURlc2MoKSA9PSBkc2QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGdldENhbGxiYWNrcygpIHsKLSAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gbmV3IEFycmF5TWFwPD4oKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgY2FsbGJhY2tzLnB1dEFsbChtQ2FsbGJhY2tzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2FsbGJhY2tzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNjA0Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX0NVU1RPTTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRZUEVfTElCUkFSWV9TRVJWSUNFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OX1NFUlZJQ0U7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0ZvY3VzUmVxdWVzdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjIuUGxheWJhY2tJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2U7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2UuUGxheWVyRXZlbnRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJTdGF0ZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudC5QbGF5bGlzdEV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5CdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db21tYW5kQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmRHcm91cDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbnRyb2xsZXJJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5PbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5TZXNzaW9uQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbk1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFTZXNzaW9uMkltcGwgaW1wbGVtZW50cyBNZWRpYVNlc3Npb24yUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFTZXNzaW9uMiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7Ly9Mb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1JZDsKLSAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yIG1DYWxsYmFja0V4ZWN1dG9yOwotICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvbkNhbGxiYWNrIG1DYWxsYmFjazsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvbjJTdHViIG1TZXNzaW9uU3R1YjsKLSAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Ub2tlbjIgbVNlc3Npb25Ub2tlbjsKLSAgICBwcml2YXRlIGZpbmFsIEF1ZGlvTWFuYWdlciBtQXVkaW9NYW5hZ2VyOwotICAgIHByaXZhdGUgZmluYWwgUGVuZGluZ0ludGVudCBtU2Vzc2lvbkFjdGl2aXR5OwotICAgIHByaXZhdGUgZmluYWwgUGxheWVyRXZlbnRDYWxsYmFjayBtUGxheWVyRXZlbnRDYWxsYmFjazsKLSAgICBwcml2YXRlIGZpbmFsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBtUGxheWxpc3RFdmVudENhbGxiYWNrOwotCi0gICAgLy8gbVBsYXllciBpcyBzZXQgdG8gbnVsbCB3aGVuIHRoZSBzZXNzaW9uIGlzIGNsb3NlZCwgYW5kIHdlIHNob3VsZG4ndCB0aHJvdyBhbiBleGNlcHRpb24KLSAgICAvLyBub3IgbGVhdmUgbG9nIGFsd2F5cyBmb3IgdXNpbmcgbVBsYXllciB3aGVuIGl0J3MgbnVsbC4gSGVyZSdzIHRoZSByZWFzb24uCi0gICAgLy8gV2hlbiBhIE1lZGlhU2Vzc2lvbjIgaXMgY2xvc2VkLCB0aGVyZSBjb3VsZCBiZSBhIHBlbmRlZCBvcGVyYXRpb24gaW4gdGhlIHNlc3Npb24gY2FsbGJhY2sKLSAgICAvLyBleGVjdXRvciB0aGF0IG1heSB3YW50IHRvIGFjY2VzcyB0aGUgcGxheWVyLiBIZXJlJ3MgdGhlIHNhbXBsZSBjb2RlIHNuaXBwZXQgZm9yIHRoYXQuCi0gICAgLy8KLSAgICAvLyAgIHB1YmxpYyB2b2lkIG9uRm9vKCkgewotICAgIC8vICAgICBpZiAobVBsYXllciA9PSBudWxsKSByZXR1cm47IC8vIGZpcnN0IGNoZWNrCi0gICAgLy8gICAgIG1TZXNzaW9uQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRvcigoKSAtPiB7Ci0gICAgLy8gICAgICAgLy8gRXJyb3IuIFNlc3Npb24gbWF5IGJlIGNsb3NlZCBhbmQgbVBsYXllciBjYW4gYmUgbnVsbCBoZXJlLgotICAgIC8vICAgICAgIG1QbGF5ZXIuZm9vKCk7Ci0gICAgLy8gICAgIH0pOwotICAgIC8vICAgfQotICAgIC8vCi0gICAgLy8gQnkgYWRkaW5nIHByb3RlY3RpdmUgY29kZSwgd2UgY2FuIGFsc28gcHJvdGVjdCBBUElzIGZyb20gYmVpbmcgY2FsbGVkIGFmdGVyIHRoZSBjbG9zZSgpCi0gICAgLy8KLSAgICAvLyBUT0RPKGphZXdhbik6IFNob3VsZCB3ZSBwdXQgdm9sYXRpbGUgaGVyZT8KLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYVBsYXllckJhc2UgbVBsYXllcjsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYVBsYXlsaXN0QWdlbnQgbVBsYXlsaXN0QWdlbnQ7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgU2Vzc2lvblBsYXlsaXN0QWdlbnQgbVNlc3Npb25QbGF5bGlzdEFnZW50OwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFZvbHVtZVByb3ZpZGVyMiBtVm9sdW1lUHJvdmlkZXI7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgUGxheWJhY2tJbmZvIG1QbGF5YmFja0luZm87Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBtRHNtSGVscGVyOwotCi0gICAgLyoqCi0gICAgICogQ2FuIGJlIG9ubHkgY2FsbGVkIGJ5IHRoZSB7QGxpbmsgQnVpbGRlciNidWlsZCgpfS4KLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqIEBwYXJhbSBwbGF5ZXIKLSAgICAgKiBAcGFyYW0gaWQKLSAgICAgKiBAcGFyYW0gcGxheWxpc3RBZ2VudAotICAgICAqIEBwYXJhbSB2b2x1bWVQcm92aWRlcgotICAgICAqIEBwYXJhbSBzZXNzaW9uQWN0aXZpdHkKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2tFeGVjdXRvcgotICAgICAqIEBwYXJhbSBjYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24ySW1wbChDb250ZXh0IGNvbnRleHQsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIFN0cmluZyBpZCwKLSAgICAgICAgICAgIE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIsCi0gICAgICAgICAgICBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSwKLSAgICAgICAgICAgIEV4ZWN1dG9yIGNhbGxiYWNrRXhlY3V0b3IsIFNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEtlZXAgb3RoZXIgcGFyYW1zLgotICAgICAgICBtSW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZSgpOwotCi0gICAgICAgIC8vIEFyZ3VtZW50IGNoZWNrcyBhcmUgZG9uZSBieSBidWlsZGVyIGFscmVhZHkuCi0gICAgICAgIC8vIEluaXRpYWxpemUgZmluYWxzIGZpcnN0LgotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1JZCA9IGlkOwotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IgPSBjYWxsYmFja0V4ZWN1dG9yOwotICAgICAgICBtU2Vzc2lvbkFjdGl2aXR5ID0gc2Vzc2lvbkFjdGl2aXR5OwotICAgICAgICBtU2Vzc2lvblN0dWIgPSBuZXcgTWVkaWFTZXNzaW9uMlN0dWIodGhpcyk7Ci0gICAgICAgIG1BdWRpb01hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sgPSBuZXcgTXlQbGF5ZXJFdmVudENhbGxiYWNrKHRoaXMpOwotICAgICAgICBtUGxheWxpc3RFdmVudENhbGxiYWNrID0gbmV3IE15UGxheWxpc3RFdmVudENhbGxiYWNrKHRoaXMpOwotCi0gICAgICAgIC8vIEluZmVyIHR5cGUgZnJvbSB0aGUgaWQgYW5kIHBhY2thZ2UgbmFtZS4KLSAgICAgICAgU3RyaW5nIGxpYnJhcnlTZXJ2aWNlID0gZ2V0U2VydmljZU5hbWUoY29udGV4dCwgTWVkaWFMaWJyYXJ5U2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UsIGlkKTsKLSAgICAgICAgU3RyaW5nIHNlc3Npb25TZXJ2aWNlID0gZ2V0U2VydmljZU5hbWUoY29udGV4dCwgTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UsIGlkKTsKLSAgICAgICAgaWYgKHNlc3Npb25TZXJ2aWNlICE9IG51bGwgJiYgbGlicmFyeVNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQW1iaWd1b3VzIHNlc3Npb24gdHlwZS4gTXVsdGlwbGUiCi0gICAgICAgICAgICAgICAgICAgICsgIiBzZXNzaW9uIHNlcnZpY2VzIGRlZmluZSB0aGUgc2FtZSBpZD0iICsgaWQpOwotICAgICAgICB9IGVsc2UgaWYgKGxpYnJhcnlTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uVG9rZW4gPSBuZXcgU2Vzc2lvblRva2VuMkltcGwoUHJvY2Vzcy5teVVpZCgpLCBUWVBFX0xJQlJBUllfU0VSVklDRSwKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbGlicmFyeVNlcnZpY2UsIGlkLCBtU2Vzc2lvblN0dWIpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvblNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNlc3Npb25Ub2tlbiA9IG5ldyBTZXNzaW9uVG9rZW4ySW1wbChQcm9jZXNzLm15VWlkKCksIFRZUEVfU0VTU0lPTl9TRVJWSUNFLAotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBzZXNzaW9uU2VydmljZSwgaWQsIG1TZXNzaW9uU3R1YikuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TZXNzaW9uVG9rZW4gPSBuZXcgU2Vzc2lvblRva2VuMkltcGwoUHJvY2Vzcy5teVVpZCgpLCBUWVBFX1NFU1NJT04sCi0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIG51bGwsIGlkLCBtU2Vzc2lvblN0dWIpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB1cGRhdGVQbGF5ZXIocGxheWVyLCBwbGF5bGlzdEFnZW50LCB2b2x1bWVQcm92aWRlcik7Ci0KLSAgICAgICAgLy8gQXNrIHNlcnZlciBmb3IgdGhlIHNhbml0eSBjaGVjaywgYW5kIHN0YXJ0cwotICAgICAgICAvLyBTYW5pdHkgY2hlY2sgZm9yIG1ha2luZyBzZXNzaW9uIElEIHVuaXF1ZSAncGVyIHBhY2thZ2UnIGNhbm5vdCBiZSBkb25lIGluIGhlcmUuCi0gICAgICAgIC8vIFNlcnZlciBjYW4gb25seSBrbm93IGlmIHRoZSBwYWNrYWdlIGhhcyBhbm90aGVyIHByb2Nlc3MgYW5kIGhhcyBhbm90aGVyIHNlc3Npb24gd2l0aCB0aGUKLSAgICAgICAgLy8gc2FtZSBpZC4gTm90ZSB0aGF0ICdJRCBpcyB1bmlxdWUgcGVyIHBhY2thZ2UnIGlzIGltcG9ydGFudCBmb3IgY29udHJvbGxlciB0byBkaXN0aW5ndWlzaAotICAgICAgICAvLyBhIHNlc3Npb24gaW4gYW5vdGhlciBwYWNrYWdlLgotICAgICAgICBNZWRpYVNlc3Npb25NYW5hZ2VyIG1hbmFnZXIgPQotICAgICAgICAgICAgICAgIChNZWRpYVNlc3Npb25NYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTUVESUFfU0VTU0lPTl9TRVJWSUNFKTsKLSAgICAgICAgaWYgKCFtYW5hZ2VyLmNyZWF0ZVNlc3Npb24yKG1TZXNzaW9uVG9rZW4pKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJTZXNzaW9uIHdpdGggdGhlIHNhbWUgaWQgaXMgYWxyZWFkeSB1c2VkIGJ5IgotICAgICAgICAgICAgICAgICAgICArICIgYW5vdGhlciBwcm9jZXNzLiBVc2UgTWVkaWFDb250cm9sbGVyMiBpbnN0ZWFkLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTWVkaWFTZXNzaW9uMiBjcmVhdGVJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24yKHRoaXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZShDb250ZXh0IGNvbnRleHQsIFN0cmluZyBzZXJ2aWNlQWN0aW9uLCBTdHJpbmcgaWQpIHsKLSAgICAgICAgUGFja2FnZU1hbmFnZXIgbWFuYWdlciA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKLSAgICAgICAgSW50ZW50IHNlcnZpY2VJbnRlbnQgPSBuZXcgSW50ZW50KHNlcnZpY2VBY3Rpb24pOwotICAgICAgICBzZXJ2aWNlSW50ZW50LnNldFBhY2thZ2UoY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgTGlzdDxSZXNvbHZlSW5mbz4gc2VydmljZXMgPSBtYW5hZ2VyLnF1ZXJ5SW50ZW50U2VydmljZXMoc2VydmljZUludGVudCwKLSAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKHNlcnZpY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZUlkID0gU2Vzc2lvblRva2VuMkltcGwuZ2V0U2Vzc2lvbklkKHNlcnZpY2VzLmdldChpKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VJZCAhPSBudWxsICYmIFRleHRVdGlscy5lcXVhbHMoaWQsIHNlcnZpY2VJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VzLmdldChpKS5zZXJ2aWNlSW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQW1iaWd1b3VzIHNlc3Npb24gdHlwZS4gTXVsdGlwbGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzZXNzaW9uIHNlcnZpY2VzIGRlZmluZSB0aGUgc2FtZSBpZD0iICsgaWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gc2VydmljZXMuZ2V0KGkpLnNlcnZpY2VJbmZvLm5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5ZXJfaW1wbChATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgcGxheWVyLCBNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlcikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgaWYgKHBsYXllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5ZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVQbGF5ZXIocGxheWVyLCBwbGF5bGlzdEFnZW50LCB2b2x1bWVQcm92aWRlcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXllcihNZWRpYVBsYXllckJhc2UgcGxheWVyLCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQsCi0gICAgICAgICAgICBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIG9sZFBsYXllcjsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IG9sZEFnZW50OwotICAgICAgICBmaW5hbCBQbGF5YmFja0luZm8gaW5mbyA9IGNyZWF0ZVBsYXliYWNrSW5mbyh2b2x1bWVQcm92aWRlciwgcGxheWVyLmdldEF1ZGlvQXR0cmlidXRlcygpKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgb2xkUGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgICAgIG9sZEFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgICAgICBtUGxheWVyID0gcGxheWVyOwotICAgICAgICAgICAgaWYgKGFnZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQgPSBuZXcgU2Vzc2lvblBsYXlsaXN0QWdlbnQodGhpcywgbVBsYXllcik7Ci0gICAgICAgICAgICAgICAgaWYgKG1Ec21IZWxwZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQuc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcihtRHNtSGVscGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWdlbnQgPSBtU2Vzc2lvblBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUGxheWxpc3RBZ2VudCA9IGFnZW50OwotICAgICAgICAgICAgbVZvbHVtZVByb3ZpZGVyID0gdm9sdW1lUHJvdmlkZXI7Ci0gICAgICAgICAgICBtUGxheWJhY2tJbmZvID0gaW5mbzsKLSAgICAgICAgfQotICAgICAgICBpZiAocGxheWVyICE9IG9sZFBsYXllcikgewotICAgICAgICAgICAgcGxheWVyLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhtQ2FsbGJhY2tFeGVjdXRvciwgbVBsYXllckV2ZW50Q2FsbGJhY2spOwotICAgICAgICAgICAgaWYgKG9sZFBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2FybmluZzogUG9vcmx5IGltcGxlbWVudCBwbGF5ZXIgbWF5IGlnbm9yZSB0aGlzCi0gICAgICAgICAgICAgICAgb2xkUGxheWVyLnVucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1QbGF5ZXJFdmVudENhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYWdlbnQgIT0gb2xkQWdlbnQpIHsKLSAgICAgICAgICAgIGFnZW50LnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrKG1DYWxsYmFja0V4ZWN1dG9yLCBtUGxheWxpc3RFdmVudENhbGxiYWNrKTsKLSAgICAgICAgICAgIGlmIChvbGRBZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2FybmluZzogUG9vcmx5IGltcGxlbWVudCBwbGF5ZXIgbWF5IGlnbm9yZSB0aGlzCi0gICAgICAgICAgICAgICAgb2xkQWdlbnQudW5yZWdpc3RlclBsYXlsaXN0RXZlbnRDYWxsYmFjayhtUGxheWxpc3RFdmVudENhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvbGRQbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXliYWNrSW5mb0NoYW5nZWQoaW5mbyk7Ci0gICAgICAgICAgICBub3RpZnlQbGF5ZXJVcGRhdGVkTm90TG9ja2VkKG9sZFBsYXllcik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXBlYXQgdGhlIHNhbWUgdGhpbmcgZm9yIHRoZSBwbGF5bGlzdCBhZ2VudC4KLSAgICB9Ci0KLSAgICBwcml2YXRlIFBsYXliYWNrSW5mbyBjcmVhdGVQbGF5YmFja0luZm8oVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyLCBBdWRpb0F0dHJpYnV0ZXMgYXR0cnMpIHsKLSAgICAgICAgUGxheWJhY2tJbmZvIGluZm87Ci0gICAgICAgIGlmICh2b2x1bWVQcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgc3RyZWFtOwotICAgICAgICAgICAgaWYgKGF0dHJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBhdHRycy5nZXRWb2x1bWVDb250cm9sU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBBdWRpb01hbmFnZXIuVVNFX0RFRkFVTFRfU1RSRUFNX1RZUEUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSXQgbWF5IGhhcHBlbiBpZiB0aGUgQXVkaW9BdHRyaWJ1dGVzIGRvZXNuJ3QgaGF2ZSB1c2FnZS4KLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hhbmdlIGl0IHRvIHRoZSBTVFJFQU1fTVVTSUMgYmVjYXVzZSBpdCdzIG5vdCBzdXBwb3J0ZWQgYnkgYXVkaW8gbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcXVlcnlpbmcgdm9sdW1lIGxldmVsLgotICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluZm8gPSBNZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsLmNyZWF0ZVBsYXliYWNrSW5mbygKLSAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tJbmZvLlBMQVlCQUNLX1RZUEVfTE9DQUwsCi0gICAgICAgICAgICAgICAgICAgIGF0dHJzLAotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzVm9sdW1lRml4ZWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gVm9sdW1lUHJvdmlkZXIyLlZPTFVNRV9DT05UUk9MX0ZJWEVECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBWb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfQUJTT0xVVEUsCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtTWF4Vm9sdW1lKHN0cmVhbSksCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKHN0cmVhbSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5mbyA9IE1lZGlhQ29udHJvbGxlcjJJbXBsLlBsYXliYWNrSW5mb0ltcGwuY3JlYXRlUGxheWJhY2tJbmZvKAotICAgICAgICAgICAgICAgICAgICBQbGF5YmFja0luZm8uUExBWUJBQ0tfVFlQRV9SRU1PVEUgLyogQ29udHJvbFR5cGUgKi8sCi0gICAgICAgICAgICAgICAgICAgIGF0dHJzLAotICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5nZXRDb250cm9sVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5nZXRNYXhWb2x1bWUoKSwKLSAgICAgICAgICAgICAgICAgICAgdm9sdW1lUHJvdmlkZXIuZ2V0Q3VycmVudFZvbHVtZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5mbzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbG9zZV9pbXBsKCkgewotICAgICAgICAvLyBTdG9wIHN5c3RlbSBzZXJ2aWNlIGZyb20gbGlzdGVuaW5nIHRoaXMgc2Vzc2lvbiBmaXJzdC4KLSAgICAgICAgTWVkaWFTZXNzaW9uTWFuYWdlciBtYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAoTWVkaWFTZXNzaW9uTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk1FRElBX1NFU1NJT05fU0VSVklDRSk7Ci0gICAgICAgIG1hbmFnZXIuZGVzdHJveVNlc3Npb24yKG1TZXNzaW9uVG9rZW4pOwotCi0gICAgICAgIGlmIChtU2Vzc2lvblN0dWIgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic2Vzc2lvbiBpcyBub3cgdW5hdmFpbGFibGUsIGlkPSIgKyBtSWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSBwcmV2aW91c2x5IHB1Ymxpc2hlZCBzZXNzaW9uIHN0dWIuCi0gICAgICAgICAgICBtU2Vzc2lvblN0dWIuZGVzdHJveU5vdExvY2tlZCgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXI7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudDsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgICAgIG1QbGF5ZXIgPSBudWxsOwotICAgICAgICAgICAgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgICAgIG1QbGF5bGlzdEFnZW50ID0gbnVsbDsKLSAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwbGF5ZXIudW5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobVBsYXllckV2ZW50Q2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC51bnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrKG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhUGxheWVyQmFzZSBnZXRQbGF5ZXJfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFBsYXllcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVBsYXlsaXN0QWdlbnQgZ2V0UGxheWxpc3RBZ2VudF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZvbHVtZVByb3ZpZGVyMiBnZXRWb2x1bWVQcm92aWRlcl9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVZvbHVtZVByb3ZpZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldFRva2VuX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvblRva2VuOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PENvbnRyb2xsZXJJbmZvPiBnZXRDb25uZWN0ZWRDb250cm9sbGVyc19pbXBsKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25TdHViLmdldENvbnRyb2xsZXJzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QXVkaW9Gb2N1c1JlcXVlc3RfaW1wbChBdWRpb0ZvY3VzUmVxdWVzdCBhZnIpIHsKLSAgICAgICAgLy8gaW1wbGVtZW50Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheV9pbXBsKCkgewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci5wbGF5KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwYXVzZV9pbXBsKCkgewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcF9pbXBsKCkgewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci5yZXNldCgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtX2ltcGwoQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnNraXBUb1BsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb1ByZXZpb3VzSXRlbV9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW1faW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tTGF5b3V0X2ltcGwoQE5vbk51bGwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgIEBOb25OdWxsIExpc3Q8Q29tbWFuZEJ1dHRvbj4gbGF5b3V0KSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsYXlvdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGF5b3V0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeUN1c3RvbUxheW91dE5vdExvY2tlZChjb250cm9sbGVyLCBsYXlvdXQpOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQgZm9sbG93cwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBbGxvd2VkQ29tbWFuZHNfaW1wbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZHMpIHsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21tYW5kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kcyBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5zZXRBbGxvd2VkQ29tbWFuZHMoY29udHJvbGxlciwgY29tbWFuZHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kX2ltcGwoQE5vbk51bGwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgIEBOb25OdWxsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncywgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtU2Vzc2lvblN0dWIuc2VuZEN1c3RvbUNvbW1hbmQoY29udHJvbGxlciwgY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kX2ltcGwoQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIEJ1bmRsZSBhcmdzKSB7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtU2Vzc2lvblN0dWIuc2VuZEN1c3RvbUNvbW1hbmQoY29tbWFuZCwgYXJncyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3RfaW1wbChATm9uTnVsbCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxpc3Qgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2V0UGxheWxpc3QobGlzdCwgbWV0YWRhdGEpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YV9pbXBsKE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQudXBkYXRlUGxheWxpc3RNZXRhZGF0YShtZXRhZGF0YSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRQbGF5bGlzdEl0ZW1faW1wbChpbnQgaW5kZXgsIEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbmRleCBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5hZGRQbGF5bGlzdEl0ZW0oaW5kZXgsIGl0ZW0pOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtX2ltcGwoQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW1faW1wbChpbnQgaW5kZXgsIEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbmRleCBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5yZXBsYWNlUGxheWxpc3RJdGVtKGluZGV4LCBpdGVtKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PE1lZGlhSXRlbTI+IGdldFBsYXlsaXN0X2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFnZW50LmdldFBsYXlsaXN0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGdldFBsYXlsaXN0TWV0YWRhdGFfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0UGxheWxpc3RNZXRhZGF0YSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUl0ZW0yIGdldEN1cnJlbnRQbGF5bGlzdEl0ZW1faW1wbCgpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRSZXBlYXRNb2RlX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFnZW50LmdldFJlcGVhdE1vZGUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZV9pbXBsKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2V0UmVwZWF0TW9kZShyZXBlYXRNb2RlKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U2h1ZmZsZU1vZGVfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlX2ltcGwoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2V0U2h1ZmZsZU1vZGUoc2h1ZmZsZU1vZGUpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZV9pbXBsKCkgewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci5wcmVwYXJlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZWVrVG9faW1wbChsb25nIHBvcykgewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci5zZWVrVG8ocG9zKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBAUGxheWVyU3RhdGUgaW50IGdldFBsYXllclN0YXRlX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLmdldFBsYXllclN0YXRlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWVyQmFzZS5QTEFZRVJfU1RBVEVfRVJST1I7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFBvc2l0aW9uX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZWRpYVBsYXllckJhc2UuVU5LTk9XTl9USU1FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldEJ1ZmZlcmVkUG9zaXRpb25faW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXIuZ2V0QnVmZmVyZWRQb3NpdGlvbigpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZWRpYVBsYXllckJhc2UuVU5LTk9XTl9USU1FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUVycm9yX2ltcGwoaW50IGVycm9yQ29kZSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5RXJyb3IoZXJyb3JDb2RlLCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXJfaW1wbChATm9uTnVsbCBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIGhlbHBlcikgewotICAgICAgICBpZiAoaGVscGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImhlbHBlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1Ec21IZWxwZXIgPSBoZWxwZXI7Ci0gICAgICAgICAgICBpZiAobVNlc3Npb25QbGF5bGlzdEFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQuc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcihoZWxwZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xlYXJPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1Ec21IZWxwZXIgPSBudWxsOwotICAgICAgICAgICAgaWYgKG1TZXNzaW9uUGxheWxpc3RBZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlc3Npb25QbGF5bGlzdEFnZW50LmNsZWFyT25EYXRhU291cmNlTWlzc2luZ0hlbHBlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gUHJvdGVjdGVkIG9yIHByaXZhdGUgbWV0aG9kcwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgLy8gRW5mb3JjZXMgZGV2ZWxvcGVycyB0byBjYWxsIGFsbCB0aGUgbWV0aG9kcyBvbiB0aGUgaW5pdGlhbGx5IGdpdmVuIHRocmVhZAotICAgIC8vIGJlY2F1c2UgY2FsbHMgZnJvbSB0aGUgTWVkaWFDb250cm9sbGVyMiB3aWxsIGJlIHJ1biBvbiB0aGUgdGhyZWFkLgotICAgIC8vIFRPRE8oamFld2FuKTogU2hvdWxkIHdlIGFsbG93IGNhbGxzIGZyb20gdGhlIG11bHRpcGxlIHRocmVhZD8KLSAgICAvLyAgICAgICAgICAgICAgIEkgcHJlZmVyIHRoaXMgd2F5IGJlY2F1c2UgYWxsb3dpbmcgbXVsdGlwbGUgdGhyZWFkIG1heSBjYXNlIHRyaWNreSBpc3N1ZSBsaWtlCi0gICAgLy8gICAgICAgICAgICAgICBiLzYzNDQ2MzYwLiBJZiB0aGUge0BsaW5rICNzZXRQbGF5ZXIoKX0gd2l0aCB7QGNvZGUgbnVsbH0gY2FuIGJlIGNhbGxlZCBmcm9tCi0gICAgLy8gICAgICAgICAgICAgICBhbm90aGVyIHRocmVhZCwgdHJhbnNwb3J0IGNvbnRyb2xzIGNhbiBiZSBjYWxsZWQgYWZ0ZXIgdGhhdC4KLSAgICAvLyAgICAgICAgICAgICAgIFRoYXQncyBiYXNpY2FsbHkgdGhlIGRldmVsb3BlcidzIG1pc3Rha2UsIGJ1dCB0aGV5IGNhbm5vdCB1bmRlcnN0YW5kIHdoYXQncwotICAgIC8vICAgICAgICAgICAgICAgaGFwcGVuaW5nIGJlaGluZCB1bnRpbCB3ZSB0ZWxsIHRoZW0gc28uCi0gICAgLy8gICAgICAgICAgICAgICBJZiBlbmZvcmNpbmcgY2FsbGxpbmcgdGhyZWFkIGRvZXNuJ3QgbG9vayBnb29kLCB3ZSBjYW4gYWx0ZXJuYXRpdmVseSBwaWNrCi0gICAgLy8gICAgICAgICAgICAgICAxLiBBbGxvdyBjYWxscyBmcm9tIHJhbmRvbSB0aHJlYWRzIGZvciBhbGwgbWV0aG9kcy4KLSAgICAvLyAgICAgICAgICAgICAgIDIuIEFsbG93IGNhbGxzIGZyb20gcmFuZG9tIHRocmVhZHMgZm9yIGFsbCBtZXRob2RzLCBleGNlcHQgZm9yIHRoZQotICAgIC8vICAgICAgICAgICAgICAgICAge0BsaW5rICNzZXRQbGF5ZXIoKX0uCi0gICAgdm9pZCBlbnN1cmVDYWxsaW5nVGhyZWFkKCkgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFVuY29tbWVudCBvciByZW1vdmUKLSAgICAgICAgLyoKLSAgICAgICAgaWYgKG1IYW5kbGVyLmdldExvb3BlcigpICE9IExvb3Blci5teUxvb3BlcigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJSdW4gdGhpcyBvbiB0aGUgZ2l2ZW4gdGhyZWFkIik7Ci0gICAgICAgIH0qLwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlQbGF5bGlzdENoYW5nZWRPbkV4ZWN1dG9yKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBpZiAocGxheWxpc3RBZ2VudCAhPSBtUGxheWxpc3RBZ2VudCkgewotICAgICAgICAgICAgLy8gSWdub3JlIGNhbGxzIGZyb20gdGhlIG9sZCBhZ2VudC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWQobUluc3RhbmNlLCBwbGF5bGlzdEFnZW50LCBsaXN0LCBtZXRhZGF0YSk7Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlQbGF5bGlzdENoYW5nZWROb3RMb2NrZWQobGlzdCwgbWV0YWRhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBpZiAocGxheWxpc3RBZ2VudCAhPSBtUGxheWxpc3RBZ2VudCkgewotICAgICAgICAgICAgLy8gSWdub3JlIGNhbGxzIGZyb20gdGhlIG9sZCBhZ2VudC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2sub25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIG1ldGFkYXRhKTsKLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkTm90TG9ja2VkKG1ldGFkYXRhKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5UmVwZWF0TW9kZUNoYW5nZWRPbkV4ZWN1dG9yKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgaWYgKHBsYXlsaXN0QWdlbnQgIT0gbVBsYXlsaXN0QWdlbnQpIHsKLSAgICAgICAgICAgIC8vIElnbm9yZSBjYWxscyBmcm9tIHRoZSBvbGQgYWdlbnQuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWQobUluc3RhbmNlLCBwbGF5bGlzdEFnZW50LCByZXBlYXRNb2RlKTsKLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkTm90TG9ja2VkKHJlcGVhdE1vZGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWRPbkV4ZWN1dG9yKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIGlmIChwbGF5bGlzdEFnZW50ICE9IG1QbGF5bGlzdEFnZW50KSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgY2FsbHMgZnJvbSB0aGUgb2xkIGFnZW50LgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIHNodWZmbGVNb2RlKTsKLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZE5vdExvY2tlZChzaHVmZmxlTW9kZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVBsYXllclVwZGF0ZWROb3RMb2NrZWQoTWVkaWFQbGF5ZXJCYXNlIG9sZFBsYXllcikgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2UgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiAoQ2FuIGJlIHBvc3QtUCkgRmluZCBiZXR0ZXIgd2F5IGZvciBwbGF5ZXIuZ2V0UGxheWVyU3RhdGUoKSAvLwotICAgICAgICAvLyAgICAgICAgICAgICAgIEluIHRoZW9yeSwgU2Vzc2lvbi5nZXRYWFgoKSBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIFBsYXllci5nZXRYWFgoKQotICAgICAgICAvLyAgICAgICAgICAgICAgIGFuZCB3ZSBzaG91bGQgbm90aWZ5IGluZm9ybWF0aW9uIG9mIHRoZSBzZXNzaW9uLmdldFhYWCgpIGluc3RlYWQgb2YKLSAgICAgICAgLy8gICAgICAgICAgICAgICBwbGF5ZXIuZ2V0WFhYKCkKLSAgICAgICAgLy8gTm90aWZ5IHRvIGNvbnRyb2xsZXJzIGFzIHdlbGwuCi0gICAgICAgIGZpbmFsIGludCBzdGF0ZSA9IHBsYXllci5nZXRQbGF5ZXJTdGF0ZSgpOwotICAgICAgICBpZiAoc3RhdGUgIT0gb2xkUGxheWVyLmdldFBsYXllclN0YXRlKCkpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlQbGF5ZXJTdGF0ZUNoYW5nZWROb3RMb2NrZWQoc3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgbG9uZyBjdXJyZW50VGltZU1zID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGZpbmFsIGxvbmcgcG9zaXRpb24gPSBwbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCk7Ci0gICAgICAgIGlmIChwb3NpdGlvbiAhPSBvbGRQbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCkpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlQb3NpdGlvbkNoYW5nZWROb3RMb2NrZWQoY3VycmVudFRpbWVNcywgcG9zaXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgZmxvYXQgc3BlZWQgPSBwbGF5ZXIuZ2V0UGxheWJhY2tTcGVlZCgpOwotICAgICAgICBpZiAoc3BlZWQgIT0gb2xkUGxheWVyLmdldFBsYXliYWNrU3BlZWQoKSkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXliYWNrU3BlZWRDaGFuZ2VkTm90TG9ja2VkKHNwZWVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGxvbmcgYnVmZmVyZWRQb3NpdGlvbiA9IHBsYXllci5nZXRCdWZmZXJlZFBvc2l0aW9uKCk7Ci0gICAgICAgIGlmIChidWZmZXJlZFBvc2l0aW9uICE9IG9sZFBsYXllci5nZXRCdWZmZXJlZFBvc2l0aW9uKCkpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlCdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZE5vdExvY2tlZChidWZmZXJlZFBvc2l0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db250ZXh0OwotICAgIH0KLQotICAgIE1lZGlhU2Vzc2lvbjIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgTWVkaWFQbGF5ZXJCYXNlIGdldFBsYXllcigpIHsKLSAgICAgICAgcmV0dXJuIG1QbGF5ZXI7Ci0gICAgfQotCi0gICAgTWVkaWFQbGF5bGlzdEFnZW50IGdldFBsYXlsaXN0QWdlbnQoKSB7Ci0gICAgICAgIHJldHVybiBtUGxheWxpc3RBZ2VudDsKLSAgICB9Ci0KLSAgICBFeGVjdXRvciBnZXRDYWxsYmFja0V4ZWN1dG9yKCkgewotICAgICAgICByZXR1cm4gbUNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgfQotCi0gICAgU2Vzc2lvbkNhbGxiYWNrIGdldENhbGxiYWNrKCkgewotICAgICAgICByZXR1cm4gbUNhbGxiYWNrOwotICAgIH0KLQotICAgIE1lZGlhU2Vzc2lvbjJTdHViIGdldFNlc3Npb25TdHViKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25TdHViOwotICAgIH0KLQotICAgIFZvbHVtZVByb3ZpZGVyMiBnZXRWb2x1bWVQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1Wb2x1bWVQcm92aWRlcjsKLSAgICB9Ci0KLSAgICBQbGF5YmFja0luZm8gZ2V0UGxheWJhY2tJbmZvKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrSW5mbzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFBlbmRpbmdJbnRlbnQgZ2V0U2Vzc2lvbkFjdGl2aXR5KCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25BY3Rpdml0eTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeVBsYXllckV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBQbGF5ZXJFdmVudENhbGxiYWNrIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhU2Vzc2lvbjJJbXBsPiBtU2Vzc2lvbjsKLQotICAgICAgICBwcml2YXRlIE15UGxheWVyRXZlbnRDYWxsYmFjayhNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvbiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oc2Vzc2lvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQoTWVkaWFQbGF5ZXJCYXNlIG1wYiwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCB8fCBkc2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IGdldE1lZGlhSXRlbShzZXNzaW9uLCBkc2QpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25DdXJyZW50TWVkaWFJdGVtQ2hhbmdlZChzZXNzaW9uLmdldEluc3RhbmNlKCksIG1wYiwgaXRlbSk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAoamFld2FuKTogTm90aWZ5IGNvbnRyb2xsZXJzIHRocm91Z2ggYXBwcm9wcmlhdGUgY2FsbGJhY2suIChiLzc0NTA1OTM2KQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25NZWRpYVByZXBhcmVkKE1lZGlhUGxheWVyQmFzZSBtcGIsIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICAgICAgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgZHNkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBnZXRNZWRpYUl0ZW0oc2Vzc2lvbiwgZHNkKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uTWVkaWFQcmVwYXJlZChzZXNzaW9uLmdldEluc3RhbmNlKCksIG1wYiwgaXRlbSk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAoamFld2FuKTogTm90aWZ5IGNvbnRyb2xsZXJzIHRocm91Z2ggYXBwcm9wcmlhdGUgY2FsbGJhY2suIChiLzc0NTA1OTM2KQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5ZXJTdGF0ZUNoYW5nZWQoTWVkaWFQbGF5ZXJCYXNlIG1wYiwgaW50IHN0YXRlKSB7Ci0gICAgICAgICAgICBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblBsYXllclN0YXRlQ2hhbmdlZChzZXNzaW9uLmdldEluc3RhbmNlKCksIG1wYiwgc3RhdGUpOwotICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0U2Vzc2lvblN0dWIoKS5ub3RpZnlQbGF5ZXJTdGF0ZUNoYW5nZWROb3RMb2NrZWQoc3RhdGUpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25CdWZmZXJpbmdTdGF0ZUNoYW5nZWQoTWVkaWFQbGF5ZXJCYXNlIG1wYiwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgc3RhdGUpIHsKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGRzZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gZ2V0TWVkaWFJdGVtKHNlc3Npb24sIGRzZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkJ1ZmZlcmluZ1N0YXRlQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBpdGVtLCBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAoamFld2FuKTogTm90aWZ5IGNvbnRyb2xsZXJzIHRocm91Z2ggYXBwcm9wcmlhdGUgY2FsbGJhY2suIChiLzc0NTA1OTM2KQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbjJJbXBsIGdldFNlc3Npb24oKSB7Ci0gICAgICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gbVNlc3Npb24uZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsICYmIERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2Vzc2lvbiBpcyBjbG9zZWQiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNlc3Npb247Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIE1lZGlhSXRlbTIgZ2V0TWVkaWFJdGVtKE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24sIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICAgICAgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gc2Vzc2lvbi5nZXRQbGF5bGlzdEFnZW50KCk7Ci0gICAgICAgICAgICBpZiAoYWdlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGlzIGNsb3NlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gYWdlbnQuZ2V0TWVkaWFJdGVtKGRzZCk7Ci0gICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNvdWxkIG5vdCBmaW5kIG1hdGNoaW5nIGl0ZW0gZm9yIGRzZD0iICsgZHNkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpdGVtOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFTZXNzaW9uMkltcGw+IG1TZXNzaW9uOwotCi0gICAgICAgIHByaXZhdGUgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2soTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbikgewotICAgICAgICAgICAgbVNlc3Npb24gPSBuZXcgV2Vha1JlZmVyZW5jZTw+KHNlc3Npb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsCi0gICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLm5vdGlmeVBsYXlsaXN0Q2hhbmdlZE9uRXhlY3V0b3IocGxheWxpc3RBZ2VudCwgbGlzdCwgbWV0YWRhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLm5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkT25FeGVjdXRvcihwbGF5bGlzdEFnZW50LCBtZXRhZGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZXBlYXRNb2RlQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLm5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkT25FeGVjdXRvcihwbGF5bGlzdEFnZW50LCByZXBlYXRNb2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNodWZmbGVNb2RlQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gbVNlc3Npb24uZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5ub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWRPbkV4ZWN1dG9yKHBsYXlsaXN0QWdlbnQsIHNodWZmbGVNb2RlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ29tbWFuZEltcGwgaW1wbGVtZW50cyBDb21tYW5kUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTU1BTkRfQ09ERQotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZC5jb21tYW5kX2NvZGUiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTU1BTkRfQ1VTVE9NX0NPTU1BTkQKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmQuY3VzdG9tX2NvbW1hbmQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTU1BTkRfRVhUUkFTCi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kLmV4dHJhcyI7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uQ29tbWFuZDIgbUluc3RhbmNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtQ29tbWFuZENvZGU7Ci0gICAgICAgIC8vIE5vbm51bGwgaWYgaXQncyBjdXN0b20gY29tbWFuZAotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ3VzdG9tQ29tbWFuZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUV4dHJhczsKLQotICAgICAgICBwdWJsaWMgQ29tbWFuZEltcGwoU2Vzc2lvbkNvbW1hbmQyIGluc3RhbmNlLCBpbnQgY29tbWFuZENvZGUpIHsKLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgbUNvbW1hbmRDb2RlID0gY29tbWFuZENvZGU7Ci0gICAgICAgICAgICBtQ3VzdG9tQ29tbWFuZCA9IG51bGw7Ci0gICAgICAgICAgICBtRXh0cmFzID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb21tYW5kSW1wbChTZXNzaW9uQ29tbWFuZDIgaW5zdGFuY2UsIEBOb25OdWxsIFN0cmluZyBhY3Rpb24sCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjdGlvbiBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtQ29tbWFuZENvZGUgPSBDT01NQU5EX0NPREVfQ1VTVE9NOwotICAgICAgICAgICAgbUN1c3RvbUNvbW1hbmQgPSBhY3Rpb247Ci0gICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29tbWFuZENvZGVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29tbWFuZENvZGU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0Q3VzdG9tQ29tbWFuZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1DdXN0b21Db21tYW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBATnVsbGFibGUgQnVuZGxlIGdldEV4dHJhc19pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1FeHRyYXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBhIG5ldyBCdW5kbGUgaW5zdGFuY2UgZnJvbSB0aGUgQ29tbWFuZAotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9DT01NQU5EX0NPREUsIG1Db21tYW5kQ29kZSk7Ci0gICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9DT01NQU5EX0NVU1RPTV9DT01NQU5ELCBtQ3VzdG9tQ29tbWFuZCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0QnVuZGxlKEtFWV9DT01NQU5EX0VYVFJBUywgbUV4dHJhcyk7Ci0gICAgICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gYSBuZXcgQ29tbWFuZCBpbnN0YW5jZSBmcm9tIHRoZSBCdW5kbGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU2Vzc2lvbkNvbW1hbmQyIGZyb21CdW5kbGVfaW1wbChATm9uTnVsbCBCdW5kbGUgY29tbWFuZCkgewotICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBjb2RlID0gY29tbWFuZC5nZXRJbnQoS0VZX0NPTU1BTkRfQ09ERSk7Ci0gICAgICAgICAgICBpZiAoY29kZSAhPSBDT01NQU5EX0NPREVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uQ29tbWFuZDIoY29kZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBjdXN0b21Db21tYW5kID0gY29tbWFuZC5nZXRTdHJpbmcoS0VZX0NPTU1BTkRfQ1VTVE9NX0NPTU1BTkQpOwotICAgICAgICAgICAgICAgIGlmIChjdXN0b21Db21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2Vzc2lvbkNvbW1hbmQyKGN1c3RvbUNvbW1hbmQsIGNvbW1hbmQuZ2V0QnVuZGxlKEtFWV9DT01NQU5EX0VYVFJBUykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbW1hbmRJbXBsKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbW1hbmRJbXBsIG90aGVyID0gKENvbW1hbmRJbXBsKSBvYmo7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IENvbXBhcmUgQ29tbWFuZHMgd2l0aCB0aGUgZ2VuZXJhdGVkIFVVSUQsIGFzIHdlJ3JlIGRvaW5nIGZvciB0aGUgTUkyLgotICAgICAgICAgICAgcmV0dXJuIG1Db21tYW5kQ29kZSA9PSBvdGhlci5tQ29tbWFuZENvZGUKLSAgICAgICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmVxdWFscyhtQ3VzdG9tQ29tbWFuZCwgb3RoZXIubUN1c3RvbUNvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGVfaW1wbCgpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBwcmltZSA9IDMxOwotICAgICAgICAgICAgcmV0dXJuICgobUN1c3RvbUNvbW1hbmQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgPyBtQ3VzdG9tQ29tbWFuZC5oYXNoQ29kZSgpIDogMCkgKiBwcmltZSArIG1Db21tYW5kQ29kZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcHJlc2VudCBzZXQgb2Yge0BsaW5rIFNlc3Npb25Db21tYW5kMn0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21tYW5kR3JvdXBJbXBsIGltcGxlbWVudHMgQ29tbWFuZEdyb3VwUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTU1BTkRTID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5tZWRpYXNlc3Npb24yLmNvbW1hbmRncm91cC5jb21tYW5kcyI7Ci0KLSAgICAgICAgLy8gUHJlZml4IGZvciBhbGwgY29tbWFuZCBjb2RlcwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0NPTU1BTkRfQ09ERSA9ICJDT01NQU5EX0NPREVfIjsKLQotICAgICAgICAvLyBQcmVmaXggZm9yIGNvbW1hbmQgY29kZXMgdGhhdCB3aWxsIGJlIHNlbnQgZGlyZWN0bHkgdG8gdGhlIE1lZGlhUGxheWVyQmFzZQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZQkFDSyA9ICJDT01NQU5EX0NPREVfUExBWUJBQ0tfIjsKLQotICAgICAgICAvLyBQcmVmaXggZm9yIGNvbW1hbmQgY29kZXMgdGhhdCB3aWxsIGJlIHNlbnQgZGlyZWN0bHkgdG8gdGhlIE1lZGlhUGxheWxpc3RBZ2VudAotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZTElTVCA9ICJDT01NQU5EX0NPREVfUExBWUxJU1RfIjsKLQotICAgICAgICBwcml2YXRlIFNldDxTZXNzaW9uQ29tbWFuZDI+IG1Db21tYW5kcyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBtSW5zdGFuY2U7Ci0KLSAgICAgICAgcHVibGljIENvbW1hbmRHcm91cEltcGwoU2Vzc2lvbkNvbW1hbmRHcm91cDIgaW5zdGFuY2UsIE9iamVjdCBvdGhlcikgewotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBpZiAob3RoZXIgIT0gbnVsbCAmJiBvdGhlciBpbnN0YW5jZW9mIENvbW1hbmRHcm91cEltcGwpIHsKLSAgICAgICAgICAgICAgICBtQ29tbWFuZHMuYWRkQWxsKCgoQ29tbWFuZEdyb3VwSW1wbCkgb3RoZXIpLm1Db21tYW5kcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29tbWFuZEdyb3VwSW1wbCgpIHsKLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBTZXNzaW9uQ29tbWFuZEdyb3VwMih0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRDb21tYW5kX2ltcGwoQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29tbWFuZHMuYWRkKGNvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZEFsbFByZWRlZmluZWRDb21tYW5kc19pbXBsKCkgewotICAgICAgICAgICAgYWRkQ29tbWFuZHNXaXRoUHJlZml4KFBSRUZJWF9DT01NQU5EX0NPREUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhZGRBbGxQbGF5YmFja0NvbW1hbmRzKCkgewotICAgICAgICAgICAgYWRkQ29tbWFuZHNXaXRoUHJlZml4KFBSRUZJWF9DT01NQU5EX0NPREVfUExBWUJBQ0spOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhZGRBbGxQbGF5bGlzdENvbW1hbmRzKCkgewotICAgICAgICAgICAgYWRkQ29tbWFuZHNXaXRoUHJlZml4KFBSRUZJWF9DT01NQU5EX0NPREVfUExBWUxJU1QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZENvbW1hbmRzV2l0aFByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IChDYW4gYmUgcG9zdC1QKTogRG9uJ3QgdXNlIHJlZmxlY3Rpb24gZm9yIHRoaXMgcHVycG9zZS4KLSAgICAgICAgICAgIGZpbmFsIEZpZWxkW10gZmllbGRzID0gTWVkaWFTZXNzaW9uMi5jbGFzcy5nZXRGaWVsZHMoKTsKLSAgICAgICAgICAgIGlmIChmaWVsZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZHNbaV0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgocHJlZml4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tbWFuZHMuYWRkKG5ldyBTZXNzaW9uQ29tbWFuZDIoZmllbGRzW2ldLmdldEludChudWxsKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5leHBlY3RlZCAiICsgZmllbGRzW2ldICsgIiBpbiBNZWRpYVNlc3Npb24yIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlQ29tbWFuZF9pbXBsKEBOb25OdWxsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kKSB7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNvbW1hbmRzLnJlbW92ZShjb21tYW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb21tYW5kX2ltcGwoQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbUNvbW1hbmRzLmNvbnRhaW5zKGNvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbW1hbmRfaW1wbChpbnQgY29kZSkgewotICAgICAgICAgICAgaWYgKGNvZGUgPT0gQ09NTUFORF9DT0RFX0NVU1RPTSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVzZSBoYXNDb21tYW5kKENvbW1hbmQpIGZvciBjdXN0b20gY29tbWFuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA6IG1Db21tYW5kcykgewotICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLmdldENvbW1hbmRDb2RlKCkgPT0gY29kZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFNldDxTZXNzaW9uQ29tbWFuZDI+IGdldENvbW1hbmRzX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29tbWFuZHMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTZXQ8U2Vzc2lvbkNvbW1hbmQyPiBnZXRDb21tYW5kcygpIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobUNvbW1hbmRzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIG5ldyBidW5kbGUgZnJvbSB0aGUgQ29tbWFuZEdyb3VwCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgewotICAgICAgICAgICAgQXJyYXlMaXN0PEJ1bmRsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA6IG1Db21tYW5kcykgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKGNvbW1hbmQudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgYnVuZGxlLnB1dFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX0NPTU1BTkRTLCBsaXN0KTsKLSAgICAgICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBuZXcgaW5zdGFuY2Ugb2YgQ29tbWFuZEdyb3VwIGZyb20gdGhlIGJ1bmRsZQotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBATnVsbGFibGUgU2Vzc2lvbkNvbW1hbmRHcm91cDIgZnJvbUJ1bmRsZV9pbXBsKEJ1bmRsZSBjb21tYW5kcykgewotICAgICAgICAgICAgaWYgKGNvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8UGFyY2VsYWJsZT4gbGlzdCA9IGNvbW1hbmRzLmdldFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX0NPTU1BTkRTKTsKLSAgICAgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGNvbW1hbmRHcm91cCA9IG5ldyBTZXNzaW9uQ29tbWFuZEdyb3VwMigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUGFyY2VsYWJsZSBwYXJjZWxhYmxlID0gbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKCEocGFyY2VsYWJsZSBpbnN0YW5jZW9mIEJ1bmRsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEJ1bmRsZSBjb21tYW5kQnVuZGxlID0gKEJ1bmRsZSkgcGFyY2VsYWJsZTsKLSAgICAgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA9IFNlc3Npb25Db21tYW5kMi5mcm9tQnVuZGxlKGNvbW1hbmRCdW5kbGUpOwotICAgICAgICAgICAgICAgIGlmIChjb21tYW5kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZEdyb3VwLmFkZENvbW1hbmQoY29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmRHcm91cDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udHJvbGxlckluZm9JbXBsIGltcGxlbWVudHMgQ29udHJvbGxlckluZm9Qcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ29udHJvbGxlckluZm8gbUluc3RhbmNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtVWlkOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGFja2FnZU5hbWU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNUcnVzdGVkOwotICAgICAgICBwcml2YXRlIGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIG1Db250cm9sbGVyQmluZGVyOwotCi0gICAgICAgIHB1YmxpYyBDb250cm9sbGVySW5mb0ltcGwoQ29udGV4dCBjb250ZXh0LCBDb250cm9sbGVySW5mbyBpbnN0YW5jZSwgaW50IHVpZCwKLSAgICAgICAgICAgICAgICBpbnQgcGlkLCBATm9uTnVsbCBTdHJpbmcgcGFja2FnZU5hbWUsIEBOb25OdWxsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFja2FnZU5hbWUgc2hvdWxkbid0IGJlIGVtcHR5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgbVVpZCA9IHVpZDsKLSAgICAgICAgICAgIG1QYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotICAgICAgICAgICAgbUNvbnRyb2xsZXJCaW5kZXIgPSBjYWxsYmFjazsKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbk1hbmFnZXIgbWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgICAoTWVkaWFTZXNzaW9uTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTUVESUFfU0VTU0lPTl9TRVJWSUNFKTsKLSAgICAgICAgICAgIC8vIEFzayBzZXJ2ZXIgd2hldGhlciB0aGUgY29udHJvbGxlciBpcyB0cnVzdGVkLgotICAgICAgICAgICAgLy8gQXBwIGNhbm5vdCBrbm93IHRoaXMgYmVjYXVzZSBhcHBzIGNhbm5vdCBxdWVyeSBlbmFibGVkIG5vdGlmaWNhdGlvbiBsaXN0ZW5lciBmb3IKLSAgICAgICAgICAgIC8vIGFub3RoZXIgcGFja2FnZSwgYnV0IHN5c3RlbSBzZXJ2ZXIgY2FuIGRvLgotICAgICAgICAgICAgbUlzVHJ1c3RlZCA9IG1hbmFnZXIuaXNUcnVzdGVkRm9yTWVkaWFDb250cm9sKAotICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFTZXNzaW9uTWFuYWdlci5SZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBhY2thZ2VOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0VWlkX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVVpZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1RydXN0ZWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSXNUcnVzdGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlckJpbmRlci5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbnRyb2xsZXJJbmZvKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBlcXVhbHMoKChDb250cm9sbGVySW5mbykgb2JqKS5nZXRQcm92aWRlcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkNvbnRyb2xsZXJJbmZvIHtwa2c9IiArIG1QYWNrYWdlTmFtZSArICIsIHVpZD0iICsgbVVpZCArICIsIHRydXN0ZWQ9IgotICAgICAgICAgICAgICAgICAgICArIG1Jc1RydXN0ZWQgKyAifSI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlckJpbmRlci5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBDb250cm9sbGVySW5mb0ltcGwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29udHJvbGxlckluZm9JbXBsIG90aGVyID0gKENvbnRyb2xsZXJJbmZvSW1wbCkgb2JqOwotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmFzQmluZGVyKCkuZXF1YWxzKG90aGVyLm1Db250cm9sbGVyQmluZGVyLmFzQmluZGVyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29udHJvbGxlckluZm8gZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgSUJpbmRlciBnZXRJZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlckJpbmRlci5hc0JpbmRlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgSU1lZGlhQ29udHJvbGxlcjIgZ2V0Q29udHJvbGxlckJpbmRlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlckJpbmRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBDb250cm9sbGVySW5mb0ltcGwgZnJvbShDb250cm9sbGVySW5mbyBjb250cm9sbGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKENvbnRyb2xsZXJJbmZvSW1wbCkgY29udHJvbGxlci5nZXRQcm92aWRlcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21tYW5kQnV0dG9uSW1wbCBpbXBsZW1lbnRzIENvbW1hbmRCdXR0b25Qcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORAotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uY29tbWFuZCI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSUNPTl9SRVNfSUQKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmljb25fcmVzX2lkIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ESVNQTEFZX05BTUUKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmRpc3BsYXlfbmFtZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVhUUkFTCi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kX2J1dHRvbi5leHRyYXMiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VOQUJMRUQKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmVuYWJsZWQiOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgQ29tbWFuZEJ1dHRvbiBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgU2Vzc2lvbkNvbW1hbmQyIG1Db21tYW5kOwotICAgICAgICBwcml2YXRlIGludCBtSWNvblJlc0lkOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtRGlzcGxheU5hbWU7Ci0gICAgICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXM7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlZDsKLQotICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbkltcGwoQE51bGxhYmxlIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBpbnQgaWNvblJlc0lkLAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBTdHJpbmcgZGlzcGxheU5hbWUsIEJ1bmRsZSBleHRyYXMsIGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICAgICAgbUNvbW1hbmQgPSBjb21tYW5kOwotICAgICAgICAgICAgbUljb25SZXNJZCA9IGljb25SZXNJZDsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKLSAgICAgICAgICAgIG1FbmFibGVkID0gZW5hYmxlZDsKLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBDb21tYW5kQnV0dG9uKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBATnVsbGFibGUKLSAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGdldENvbW1hbmRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29tbWFuZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldEljb25SZXNJZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JY29uUmVzSWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0RGlzcGxheU5hbWVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGlzcGxheU5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZSBCdW5kbGUgZ2V0RXh0cmFzX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUV4dHJhczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRW5hYmxlZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBOb25OdWxsIEJ1bmRsZSB0b0J1bmRsZSgpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0QnVuZGxlKEtFWV9DT01NQU5ELCBtQ29tbWFuZC50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0lDT05fUkVTX0lELCBtSWNvblJlc0lkKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX0RJU1BMQVlfTkFNRSwgbURpc3BsYXlOYW1lKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRCdW5kbGUoS0VZX0VYVFJBUywgbUV4dHJhcyk7Ci0gICAgICAgICAgICBidW5kbGUucHV0Qm9vbGVhbihLRVlfRU5BQkxFRCwgbUVuYWJsZWQpOwotICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBATnVsbGFibGUgQ29tbWFuZEJ1dHRvbiBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyKCk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLmZyb21CdW5kbGUoYnVuZGxlLmdldEJ1bmRsZShLRVlfQ09NTUFORCkpKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0SWNvblJlc0lkKGJ1bmRsZS5nZXRJbnQoS0VZX0lDT05fUkVTX0lELCAwKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldERpc3BsYXlOYW1lKGJ1bmRsZS5nZXRTdHJpbmcoS0VZX0RJU1BMQVlfTkFNRSkpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRFeHRyYXMoYnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldEVuYWJsZWQoYnVuZGxlLmdldEJvb2xlYW4oS0VZX0VOQUJMRUQpKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gTWFsZm9ybWVkIG9yIHZlcnNpb24gbWlzbWF0Y2guIFJldHVybiBudWxsIGZvciBub3cuCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQnVpbGRlciBmb3Ige0BsaW5rIENvbW1hbmRCdXR0b259LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVySW1wbCBpbXBsZW1lbnRzIENvbW1hbmRCdXR0b25Qcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgbUluc3RhbmNlOwotICAgICAgICAgICAgcHJpdmF0ZSBTZXNzaW9uQ29tbWFuZDIgbUNvbW1hbmQ7Ci0gICAgICAgICAgICBwcml2YXRlIGludCBtSWNvblJlc0lkOwotICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbURpc3BsYXlOYW1lOwotICAgICAgICAgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlZDsKLQotICAgICAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKENvbW1hbmRCdXR0b24uQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgICAgIG1FbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldENvbW1hbmRfaW1wbChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgewotICAgICAgICAgICAgICAgIG1Db21tYW5kID0gY29tbWFuZDsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgc2V0SWNvblJlc0lkX2ltcGwoaW50IHJlc0lkKSB7Ci0gICAgICAgICAgICAgICAgbUljb25SZXNJZCA9IHJlc0lkOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXREaXNwbGF5TmFtZV9pbXBsKFN0cmluZyBkaXNwbGF5TmFtZSkgewotICAgICAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXRFbmFibGVkX2ltcGwoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgbUVuYWJsZWQgPSBlbmFibGVkOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXRFeHRyYXNfaW1wbChCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uIGJ1aWxkX2ltcGwoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1FbmFibGVkICYmIG1Db21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRW5hYmxlZCBidXR0b24gbmVlZHMgQ29tbWFuZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIGNvbnRyb2xsZXIgdG8gaW52b2tlIHRoZSBjb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtQ29tbWFuZCAhPSBudWxsICYmIG1Db21tYW5kLmdldENvbW1hbmRDb2RlKCkgPT0gQ09NTUFORF9DT0RFX0NVU1RPTQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1JY29uUmVzSWQgPT0gMCB8fCBUZXh0VXRpbHMuaXNFbXB0eShtRGlzcGxheU5hbWUpKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDdXN0b20gY29tbWFuZHMgbmVlZHMgaWNvbiBhbmQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFuZCBuYW1lIHRvIGRpc3BsYXkiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21tYW5kQnV0dG9uSW1wbChtQ29tbWFuZCwgbUljb25SZXNJZCwgbURpc3BsYXlOYW1lLCBtRXh0cmFzLCBtRW5hYmxlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5tSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEJ1aWxkZXJCYXNlSW1wbDxUIGV4dGVuZHMgTWVkaWFTZXNzaW9uMiwgQyBleHRlbmRzIFNlc3Npb25DYWxsYmFjaz4KLSAgICAgICAgICAgIGltcGxlbWVudHMgQnVpbGRlckJhc2VQcm92aWRlcjxULCBDPiB7Ci0gICAgICAgIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgICAgIE1lZGlhUGxheWVyQmFzZSBtUGxheWVyOwotICAgICAgICBTdHJpbmcgbUlkOwotICAgICAgICBFeGVjdXRvciBtQ2FsbGJhY2tFeGVjdXRvcjsKLSAgICAgICAgQyBtQ2FsbGJhY2s7Ci0gICAgICAgIE1lZGlhUGxheWxpc3RBZ2VudCBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgVm9sdW1lUHJvdmlkZXIyIG1Wb2x1bWVQcm92aWRlcjsKLSAgICAgICAgUGVuZGluZ0ludGVudCBtU2Vzc2lvbkFjdGl2aXR5OwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNvbnRleHQgYSBjb250ZXh0Ci0gICAgICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBwYXJhbWV0ZXIgaXMgbnVsbCwgb3IgdGhlIHBsYXllciBpcyBhCi0gICAgICAgICAqICAgICAge0BsaW5rIE1lZGlhU2Vzc2lvbjJ9IG9yIHtAbGluayBNZWRpYUNvbnRyb2xsZXIyfS4KLSAgICAgICAgICovCi0gICAgICAgIC8vIFRPRE8oamFld2FuKTogQWxzbyBuZWVkIGV4ZWN1dG9yCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyQmFzZUltcGwoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICAgICAgLy8gRW5zdXJlIG5vbi1udWxsCi0gICAgICAgICAgICBtSWQgPSAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5ZXJfaW1wbChATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgcGxheWVyKSB7Ci0gICAgICAgICAgICBpZiAocGxheWVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5ZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3RBZ2VudF9pbXBsKEBOb25OdWxsIE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50KSB7Ci0gICAgICAgICAgICBpZiAocGxheWxpc3RBZ2VudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGxheWxpc3RBZ2VudCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBsYXlsaXN0QWdlbnQgPSBwbGF5bGlzdEFnZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZVByb3ZpZGVyX2ltcGwoVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyKSB7Ci0gICAgICAgICAgICBtVm9sdW1lUHJvdmlkZXIgPSB2b2x1bWVQcm92aWRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uQWN0aXZpdHlfaW1wbChQZW5kaW5nSW50ZW50IHBpKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvbkFjdGl2aXR5ID0gcGk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0SWRfaW1wbChATm9uTnVsbCBTdHJpbmcgaWQpIHsKLSAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JZCA9IGlkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25DYWxsYmFja19pbXBsKEBOb25OdWxsIEV4ZWN1dG9yIGV4ZWN1dG9yLCBATm9uTnVsbCBDIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImV4ZWN1dG9yIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvciA9IGV4ZWN1dG9yOwotICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGFic3RyYWN0IFQgYnVpbGRfaW1wbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlckltcGwgZXh0ZW5kcyBCdWlsZGVyQmFzZUltcGw8TWVkaWFTZXNzaW9uMiwgU2Vzc2lvbkNhbGxiYWNrPiB7Ci0gICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChDb250ZXh0IGNvbnRleHQsIEJ1aWxkZXIgaW5zdGFuY2UpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yIGJ1aWxkX2ltcGwoKSB7Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrRXhlY3V0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yID0gbUNvbnRleHQuZ2V0TWFpbkV4ZWN1dG9yKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgU2Vzc2lvbkNhbGxiYWNrKCkge307Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsKG1Db250ZXh0LCBtUGxheWVyLCBtSWQsIG1QbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgICAgICAgICBtVm9sdW1lUHJvdmlkZXIsIG1TZXNzaW9uQWN0aXZpdHksIG1DYWxsYmFja0V4ZWN1dG9yLCBtQ2FsbGJhY2spLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJTdHViLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJTdHViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNjU3ZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb24yU3R1Yi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTGlicmFyeVJvb3Q7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29tbWFuZEJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kR3JvdXAyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db250cm9sbGVySW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuRGVhZE9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5HdWFyZGVkQnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5NZWRpYUxpYnJhcnlTZXNzaW9uSW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kQnV0dG9uSW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kR3JvdXBJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbnRyb2xsZXJJbmZvSW1wbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYVNlc3Npb24yU3R1YiBleHRlbmRzIElNZWRpYVNlc3Npb24yLlN0dWIgewotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9LRVlfUE9TSVRJT04gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5rZXlfcG9zaXRpb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfS0VZX0lURU1fSU5ERVggPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5rZXlfaXRlbV9pbmRleCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9LRVlfUExBWUxJU1RfUEFSQU1TID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmtleV9wbGF5bGlzdF9wYXJhbXMiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVNlc3Npb24yU3R1YiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFRPRE8oamFld2FuKTogUmVuYW1lLgotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3BhcnNlQXJyYXk8U2Vzc2lvbkNvbW1hbmQyPiBzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0ID0KLSAgICAgICAgICAgIG5ldyBTcGFyc2VBcnJheTw+KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFTZXNzaW9uMkltcGw+IG1TZXNzaW9uOwotCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlNYXA8SUJpbmRlciwgQ29udHJvbGxlckluZm8+IG1Db250cm9sbGVycyA9IG5ldyBBcnJheU1hcDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmluYWwgU2V0PElCaW5kZXI+IG1Db25uZWN0aW5nQ29udHJvbGxlcnMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlNYXA8Q29udHJvbGxlckluZm8sIFNlc3Npb25Db21tYW5kR3JvdXAyPiBtQWxsb3dlZENvbW1hbmRHcm91cE1hcCA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlNYXA8PigpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TWFwPENvbnRyb2xsZXJJbmZvLCBTZXQ8U3RyaW5nPj4gbVN1YnNjcmlwdGlvbnMgPSBuZXcgQXJyYXlNYXA8PigpOwotCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbjJTdHViKE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24pIHsKLSAgICAgICAgbVNlc3Npb24gPSBuZXcgV2Vha1JlZmVyZW5jZTw+KHNlc3Npb24pOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoc0NvbW1hbmRzRm9yT25Db21tYW5kUmVxdWVzdCkgewotICAgICAgICAgICAgaWYgKHNDb21tYW5kc0Zvck9uQ29tbWFuZFJlcXVlc3Quc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICBDb21tYW5kR3JvdXBJbXBsIGdyb3VwID0gbmV3IENvbW1hbmRHcm91cEltcGwoKTsKLSAgICAgICAgICAgICAgICBncm91cC5hZGRBbGxQbGF5YmFja0NvbW1hbmRzKCk7Ci0gICAgICAgICAgICAgICAgZ3JvdXAuYWRkQWxsUGxheWxpc3RDb21tYW5kcygpOwotICAgICAgICAgICAgICAgIFNldDxTZXNzaW9uQ29tbWFuZDI+IGNvbW1hbmRzID0gZ3JvdXAuZ2V0Q29tbWFuZHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKFNlc3Npb25Db21tYW5kMiBjb21tYW5kIDogY29tbWFuZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgc0NvbW1hbmRzRm9yT25Db21tYW5kUmVxdWVzdC5hcHBlbmQoY29tbWFuZC5nZXRDb21tYW5kQ29kZSgpLCBjb21tYW5kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95Tm90TG9ja2VkKCkgewotICAgICAgICBmaW5hbCBMaXN0PENvbnRyb2xsZXJJbmZvPiBsaXN0OwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvbi5jbGVhcigpOwotICAgICAgICAgICAgbGlzdCA9IGdldENvbnRyb2xsZXJzKCk7Ci0gICAgICAgICAgICBtQ29udHJvbGxlcnMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIElNZWRpYUNvbnRyb2xsZXIyIGNvbnRyb2xsZXJCaW5kZXIgPQotICAgICAgICAgICAgICAgICAgICAoKENvbnRyb2xsZXJJbmZvSW1wbCkgbGlzdC5nZXQoaSkuZ2V0UHJvdmlkZXIoKSkuZ2V0Q29udHJvbGxlckJpbmRlcigpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgdXNlZCB3aXRob3V0IGEgbG9jayBob2xkIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrLgotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJCaW5kZXIub25EaXNjb25uZWN0ZWQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ29udHJvbGxlciBpcyBnb25lLiBTaG91bGQgYmUgZmluZSBiZWNhdXNlIHdlJ3JlIGRlc3Ryb3lpbmcuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbjJJbXBsIGdldFNlc3Npb24oKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCAmJiBERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2Vzc2lvbiBpcyBjbG9zZWQiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXNzaW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwgZ2V0TGlicmFyeVNlc3Npb24oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgaWYgKCEoc2Vzc2lvbiBpbnN0YW5jZW9mIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlNlc3Npb24gaXNuJ3QgYSBsaWJyYXJ5IHNlc3Npb24iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKE1lZGlhTGlicmFyeVNlc3Npb25JbXBsKSBzZXNzaW9uOwotICAgIH0KLQotICAgIC8vIEdldCBjb250cm9sbGVyIGlmIHRoZSBjb21tYW5kIGZyb20gY2FsbGVyIHRvIHNlc3Npb24gaXMgYWJsZSB0byBiZSBoYW5kbGVkLgotICAgIHByaXZhdGUgQ29udHJvbGxlckluZm8gZ2V0Q29udHJvbGxlcklmQWJsZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlckluZm8gPSBtQ29udHJvbGxlcnMuZ2V0KGNhbGxlci5hc0JpbmRlcigpKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVySW5mbyA9PSBudWxsICYmIERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29udHJvbGxlciBpcyBkaXNjb25uZWN0ZWQiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gR2V0IGNvbnRyb2xsZXIgaWYgdGhlIGNvbW1hbmQgZnJvbSBjYWxsZXIgdG8gc2Vzc2lvbiBpcyBhYmxlIHRvIGJlIGhhbmRsZWQuCi0gICAgcHJpdmF0ZSBDb250cm9sbGVySW5mbyBnZXRDb250cm9sbGVySWZBYmxlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGNvbW1hbmRDb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXJJbmZvID0gZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXJJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcyA9IG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwLmdldChjb250cm9sbGVySW5mbyk7Ci0gICAgICAgICAgICBpZiAoYWxsb3dlZENvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250cm9sbGVyIHdpdGggbnVsbCBhbGxvd2VkIGNvbW1hbmRzLiBJZ25vcmluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFhbGxvd2VkQ29tbWFuZHMuaGFzQ29tbWFuZChjb21tYW5kQ29kZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29udHJvbGxlciBpc24ndCBhbGxvd2VkIGZvciBjb21tYW5kICIgKyBjb21tYW5kQ29kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gR2V0IGNvbnRyb2xsZXIgaWYgdGhlIGNvbW1hbmQgZnJvbSBjYWxsZXIgdG8gc2Vzc2lvbiBpcyBhYmxlIHRvIGJlIGhhbmRsZWQuCi0gICAgcHJpdmF0ZSBDb250cm9sbGVySW5mbyBnZXRDb250cm9sbGVySWZBYmxlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlckluZm8gPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcik7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlckluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgYWxsb3dlZENvbW1hbmRzID0gbUFsbG93ZWRDb21tYW5kR3JvdXBNYXAuZ2V0KGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgd2l0aCBudWxsIGFsbG93ZWQgY29tbWFuZHMuIElnbm9yaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNvbnRyb2xsZXIgaXNuJ3QgYWxsb3dlZCBmb3IgY29tbWFuZCAiICsgY29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGJpbmRlciBpZiB0aGUgc2Vzc2lvbiBpcyBhYmxlIHRvIHNlbmQgYSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyLgotICAgIHByaXZhdGUgSU1lZGlhQ29udHJvbGxlcjIgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShDb250cm9sbGVySW5mbyBjb250cm9sbGVyKSB7Ci0gICAgICAgIGlmIChnZXRTZXNzaW9uKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZ2V0U2Vzc2lvbigpIGFscmVhZHkgbG9nZ2VkIGlmIHNlc3Npb24gaXMgY2xvc2VkLgotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm9JbXBsIGltcGwgPSBDb250cm9sbGVySW5mb0ltcGwuZnJvbShjb250cm9sbGVyKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1Db250cm9sbGVycy5nZXQoaW1wbC5nZXRJZCgpKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgIHx8IG1Db25uZWN0aW5nQ29udHJvbGxlcnMuY29udGFpbnMoaW1wbC5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpbXBsLmdldENvbnRyb2xsZXJCaW5kZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY29udHJvbGxlciArICIgaXNuJ3QgY29ubmVjdGVkIG5vciBjb25uZWN0aW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiBiaW5kZXIgaWYgdGhlIHNlc3Npb24gaXMgYWJsZSB0byBzZW5kIGEgY29tbWFuZCB0byB0aGUgY29udHJvbGxlci4KLSAgICBwcml2YXRlIElNZWRpYUNvbnRyb2xsZXIyIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgIGludCBjb21tYW5kQ29kZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBhbGxvd2VkQ29tbWFuZHMgPSBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5nZXQoY29udHJvbGxlcik7Ci0gICAgICAgICAgICBpZiAoYWxsb3dlZENvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250cm9sbGVyIHdpdGggbnVsbCBhbGxvd2VkIGNvbW1hbmRzLiBJZ25vcmluZyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFhbGxvd2VkQ29tbWFuZHMuaGFzQ29tbWFuZChjb21tYW5kQ29kZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29udHJvbGxlciBpc24ndCBhbGxvd2VkIGZvciBjb21tYW5kICIgKyBjb21tYW5kQ29kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25Db21tYW5kKEBOb25OdWxsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGNvbW1hbmRDb2RlLAotICAgICAgICAgICAgQE5vbk51bGwgU2Vzc2lvblJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlciwgY29tbWFuZENvZGUpOwotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyLCBjb21tYW5kQ29kZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMiBjb21tYW5kID0gc0NvbW1hbmRzRm9yT25Db21tYW5kUmVxdWVzdC5nZXQoY29tbWFuZENvZGUpOwotICAgICAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gYWNjZXB0ZWQgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25Db21tYW5kUmVxdWVzdChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBjb21tYW5kKTsKLSAgICAgICAgICAgICAgICBpZiAoIWFjY2VwdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHJ1biByZWplY3RlZCBjb21tYW5kLgotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNvbW1hbmQgKGNvZGU9IiArIGNvbW1hbmRDb2RlICsgIikgZnJvbSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29udHJvbGxlciArICIgd2FzIHJlamVjdGVkIGJ5ICIgKyBzZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcnVubmFibGUucnVuKHNlc3Npb24sIGNvbnRyb2xsZXIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25Ccm93c2VyQ29tbWFuZChATm9uTnVsbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsCi0gICAgICAgICAgICBATm9uTnVsbCBMaWJyYXJ5U2Vzc2lvblJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsIHNlc3Npb24gPSBnZXRMaWJyYXJ5U2Vzc2lvbigpOwotICAgICAgICAvLyBUT0RPKGphZXdhbik6IENvbnNpZGVyIGNvbW1hbmQgY29kZQotICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIpOwotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBDb25zaWRlciBjb21tYW5kIGNvZGUKLSAgICAgICAgICAgIGlmIChnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcikgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJ1bm5hYmxlLnJ1bihzZXNzaW9uLCBjb250cm9sbGVyKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5QWxsKGludCBjb21tYW5kQ29kZSwgQE5vbk51bGwgTm90aWZ5UnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgTGlzdDxDb250cm9sbGVySW5mbz4gY29udHJvbGxlcnMgPSBnZXRDb250cm9sbGVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xsZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBub3RpZnlJbnRlcm5hbChjb250cm9sbGVycy5nZXQoaSksCi0gICAgICAgICAgICAgICAgICAgIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlcnMuZ2V0KGkpLCBjb21tYW5kQ29kZSksIHJ1bm5hYmxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlBbGwoQE5vbk51bGwgTm90aWZ5UnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgTGlzdDxDb250cm9sbGVySW5mbz4gY29udHJvbGxlcnMgPSBnZXRDb250cm9sbGVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xsZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBub3RpZnlJbnRlcm5hbChjb250cm9sbGVycy5nZXQoaSksCi0gICAgICAgICAgICAgICAgICAgIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlcnMuZ2V0KGkpKSwgcnVubmFibGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeShATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBub3RpZnlJbnRlcm5hbChjb250cm9sbGVyLCBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXIpLCBydW5uYWJsZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeShATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBpbnQgY29tbWFuZENvZGUsCi0gICAgICAgICAgICBATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBub3RpZnlJbnRlcm5hbChjb250cm9sbGVyLCBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXIsIGNvbW1hbmRDb2RlKSwgcnVubmFibGUpOwotICAgIH0KLQotICAgIC8vIERvIG5vdCBjYWxsIHRoaXMgQVBJIGRpcmVjdGx5LiBVc2Ugbm90aWZ5KCkgaW5zdGVhZC4KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5SW50ZXJuYWwoQE5vbk51bGwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgIEBOb25OdWxsIElNZWRpYUNvbnRyb2xsZXIyIGlDb250cm9sbGVyLCBATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsIHx8IGlDb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcnVubmFibGUucnVuKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKTsKLSAgICAgICAgfSBjYXRjaCAoRGVhZE9iamVjdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNvbnRyb2xsZXIudG9TdHJpbmcoKSArICIgaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb25Db250cm9sbGVyQ2xvc2VkKGlDb250cm9sbGVyKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEN1cnJlbnRseSBpdCdzIFRyYW5zYWN0aW9uVG9vTGFyZ2VFeGNlcHRpb24gb3IgRGVhZFN5c3RlbUV4Y2VwdGlvbi4KLSAgICAgICAgICAgIC8vIFdlJ2QgYmV0dGVyIHRvIGxlYXZlIGxvZyBmb3IgdGhvc2UgY2FzZXMgYmVjYXVzZQotICAgICAgICAgICAgLy8gICAtIFRyYW5zYWN0aW9uVG9vTGFyZ2VFeGNlcHRpb24gbWVhbnMgdGhhdCB3ZSBtYXkgbmVlZCB0byBmaXggb3VyIGNvZGUuCi0gICAgICAgICAgICAvLyAgICAgKGUuZy4gYWRkIHBhZ2luYXRpb24gb3Igc3BlY2lhbCB3YXkgdG8gZGVsaXZlciBCaXRtYXApCi0gICAgICAgICAgICAvLyAgIC0gRGVhZFN5c3RlbUV4Y2VwdGlvbiBtZWFucyB0aGF0IGVycm9ycyBhcm91bmQgaXQgY2FuIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICBMb2cudyhUQUcsICJFeGNlcHRpb24gaW4gIiArIGNvbnRyb2xsZXIudG9TdHJpbmcoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25Db250cm9sbGVyQ2xvc2VkKElNZWRpYUNvbnRyb2xsZXIyIGlDb250cm9sbGVyKSB7Ci0gICAgICAgIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXI7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlcnMucmVtb3ZlKGlDb250cm9sbGVyLmFzQmluZGVyKCkpOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVsZWFzaW5nICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TdWJzY3JpcHRpb25zLnJlbW92ZShjb250cm9sbGVyKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uRGlzY29ubmVjdGVkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlcik7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBBSURMIG1ldGhvZHMgZm9yIHNlc3Npb24gb3ZlcnJpZGVzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgY2FsbGluZ1BhY2thZ2UpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBzZXNzaW9uLmdldENvbnRleHQoKTsKLSAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlckluZm8gPSBuZXcgQ29udHJvbGxlckluZm8oY29udGV4dCwKLSAgICAgICAgICAgICAgICBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpLCBCaW5kZXIuZ2V0Q2FsbGluZ1BpZCgpLCBjYWxsaW5nUGFja2FnZSwgY2FsbGVyKTsKLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoZ2V0U2Vzc2lvbigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgLy8gS2VlcCBjb25uZWN0aW5nIGNvbnRyb2xsZXJzLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgaGVscHMgc2Vzc2lvbnMgdG8gY2FsbCBBUElzIGluIHRoZSBvbkNvbm5lY3QoKSAoZS5nLiBzZXRDdXN0b21MYXlvdXQoKSkKLSAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIHBlbmRpbmcgdGhlbS4KLSAgICAgICAgICAgICAgICBtQ29ubmVjdGluZ0NvbnRyb2xsZXJzLmFkZChDb250cm9sbGVySW5mb0ltcGwuZnJvbShjb250cm9sbGVySW5mbykuZ2V0SWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBhbGxvd2VkQ29tbWFuZHMgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25Db25uZWN0KAotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgIC8vIERvbid0IHJlamVjdCBjb25uZWN0aW9uIGZvciB0aGUgcmVxdWVzdCBmcm9tIHRydXN0ZWQgYXBwLgotICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHNlcnZlciB3aWxsIGZhaWwgdG8gcmV0cmlldmUgc2Vzc2lvbidzIGluZm9ybWF0aW9uIHRvIGRpc3BhdGNoCi0gICAgICAgICAgICAvLyBtZWRpYSBrZXlzIHRvLgotICAgICAgICAgICAgYm9vbGVhbiBhY2NlcHQgPSBhbGxvd2VkQ29tbWFuZHMgIT0gbnVsbCB8fCBjb250cm9sbGVySW5mby5pc1RydXN0ZWQoKTsKLSAgICAgICAgICAgIGlmIChhY2NlcHQpIHsKLSAgICAgICAgICAgICAgICBDb250cm9sbGVySW5mb0ltcGwgY29udHJvbGxlckltcGwgPSBDb250cm9sbGVySW5mb0ltcGwuZnJvbShjb250cm9sbGVySW5mbyk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkFjY2VwdGluZyBjb25uZWN0aW9uLCBjb250cm9sbGVySW5mbz0iICsgY29udHJvbGxlckluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYWxsb3dlZENvbW1hbmRzPSIgKyBhbGxvd2VkQ29tbWFuZHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZENvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHRydXN0ZWQgYXBwcywgc2VuZCBub24tbnVsbCBhbGxvd2VkIGNvbW1hbmRzIHRvIGtlZXAgY29ubmVjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgYWxsb3dlZENvbW1hbmRzID0gbmV3IFNlc3Npb25Db21tYW5kR3JvdXAyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RpbmdDb250cm9sbGVycy5yZW1vdmUoY29udHJvbGxlckltcGwuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy5wdXQoY29udHJvbGxlckltcGwuZ2V0SWQoKSwgIGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgbUFsbG93ZWRDb21tYW5kR3JvdXBNYXAucHV0KGNvbnRyb2xsZXJJbmZvLCBhbGxvd2VkQ29tbWFuZHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBJZiBjb25uZWN0aW9uIGlzIGFjY2VwdGVkLCBub3RpZnkgdGhlIGN1cnJlbnQgc3RhdGUgdG8gdGhlIGNvbnRyb2xsZXIuCi0gICAgICAgICAgICAgICAgLy8gSXQncyBuZWVkZWQgYmVjYXVzZSB3ZSBjYW5ub3QgY2FsbCBzeW5jaHJvbm91cyBjYWxscyBiZXR3ZWVuIHNlc3Npb24vY29udHJvbGxlci4KLSAgICAgICAgICAgICAgICAvLyBOb3RlOiBXZSdyZSBkb2luZyB0aGlzIGFmdGVyIHRoZSBvbkNvbm5lY3Rpb25DaGFuZ2VkKCksIGJ1dCB0aGVyZSdzIG5vIGd1YXJhbnRlZQotICAgICAgICAgICAgICAgIC8vICAgICAgIHRoYXQgZXZlbnRzIGhlcmUgYXJlIG5vdGlmaWVkIGFmdGVyIHRoZSBvbkNvbm5lY3RlZCgpIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAvLyAgICAgICBJTWVkaWFDb250cm9sbGVyMiBpcyBvbmV3YXkgKGkuZS4gYXN5bmMgY2FsbCkgYW5kIFN0dWIgd2lsbAotICAgICAgICAgICAgICAgIC8vICAgICAgIHVzZSB0aHJlYWQgcG9sbCBmb3IgaW5jb21pbmcgY2FsbHMuCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHBsYXllclN0YXRlID0gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldFBsYXllclN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBwb3NpdGlvbkV2ZW50VGltZU1zID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBwb3NpdGlvbk1zID0gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRQb3NpdGlvbigpOwotICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHBsYXliYWNrU3BlZWQgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0UGxheWJhY2tTcGVlZCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zID0gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldEJ1ZmZlcmVkUG9zaXRpb24oKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgcGxheWJhY2tJbmZvQnVuZGxlID0gKChNZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsKQotICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRQbGF5YmFja0luZm8oKS5nZXRQcm92aWRlcigpKS50b0J1bmRsZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXBlYXRNb2RlID0gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldFJlcGVhdE1vZGUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2h1ZmZsZU1vZGUgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0U2h1ZmZsZU1vZGUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSA9IHNlc3Npb24uZ2V0U2Vzc2lvbkFjdGl2aXR5KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQ29tbWFuZHMuaGFzQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0dFVF9MSVNUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRQbGF5bGlzdCgpIDogbnVsbDsKLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PEJ1bmRsZT4gcGxheWxpc3RCdW5kbGU7Ci0gICAgICAgICAgICAgICAgaWYgKHBsYXlsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWxpc3RCdW5kbGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBGaW5kIGEgd2F5IHRvIGF2b2lkIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbGF5bGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFJdGVtMiBpdGVtID0gcGxheWxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBpdGVtQnVuZGxlID0gaXRlbS50b0J1bmRsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtQnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWxpc3RCdW5kbGUuYWRkKGl0ZW1CdW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBsYXlsaXN0QnVuZGxlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBEb3VibGUgY2hlY2sgaWYgc2Vzc2lvbiBpcyBzdGlsbCB0aGVyZSwgYmVjYXVzZSBjbG9zZSgpIGNhbiBiZSBjYWxsZWQgaW4gYW5vdGhlcgotICAgICAgICAgICAgICAgIC8vIHRocmVhZC4KLSAgICAgICAgICAgICAgICBpZiAoZ2V0U2Vzc2lvbigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjYWxsZXIub25Db25uZWN0ZWQoTWVkaWFTZXNzaW9uMlN0dWIudGhpcywgYWxsb3dlZENvbW1hbmRzLnRvQnVuZGxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyU3RhdGUsIHBvc2l0aW9uRXZlbnRUaW1lTXMsIHBvc2l0aW9uTXMsIHBsYXliYWNrU3BlZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyZWRQb3NpdGlvbk1zLCBwbGF5YmFja0luZm9CdW5kbGUsIHJlcGVhdE1vZGUsIHNodWZmbGVNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlsaXN0QnVuZGxlLCBzZXNzaW9uQWN0aXZpdHkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbnRyb2xsZXIgbWF5IGJlIGRpZWQgcHJlbWF0dXJlbHkuCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGhlcmUuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW5nQ29udHJvbGxlcnMucmVtb3ZlKENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXJJbmZvKS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlamVjdGluZyBjb25uZWN0aW9uLCBjb250cm9sbGVySW5mbz0iICsgY29udHJvbGxlckluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjYWxsZXIub25EaXNjb25uZWN0ZWQoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBDb250cm9sbGVyIG1heSBiZSBkaWVkIHByZW1hdHVyZWx5LgotICAgICAgICAgICAgICAgICAgICAvLyBOb3QgYW4gaXNzdWUgYmVjYXVzZSB3ZSdsbCBpZ25vcmUgaXQgYW55d2F5LgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotICAgICAgICBvbkNvbnRyb2xsZXJDbG9zZWQoY2FsbGVyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWVUbyhmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIGludCB2YWx1ZSwgZmluYWwgaW50IGZsYWdzKQotICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFVF9WT0xVTUUsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyID0gc2Vzc2lvbi5nZXRWb2x1bWVQcm92aWRlcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAodm9sdW1lUHJvdmlkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBTZXQgbG9jYWwgc3RyZWFtIHZvbHVtZQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lUHJvdmlkZXIub25TZXRWb2x1bWVUbyh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGp1c3RWb2x1bWUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgZGlyZWN0aW9uLCBpbnQgZmxhZ3MpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VUX1ZPTFVNRSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIgPSBzZXNzaW9uLmdldFZvbHVtZVByb3ZpZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2b2x1bWVQcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEFkanVzdCBsb2NhbCBzdHJlYW0gdm9sdW1lCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5vbkFkanVzdFZvbHVtZShkaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwKLSAgICAgICAgICAgIGludCBjb21tYW5kQ29kZSwgQnVuZGxlIGFyZ3MpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgY29tbWFuZENvZGUsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmRDb2RlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BMQVk6Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5wbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QQVVTRToKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19TVE9QOgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc3RvcCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfUFJFUEFSRToKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1NFRUtfVE86Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zZWVrVG8oYXJncy5nZXRMb25nKEFSR1VNRU5UX0tFWV9QT1NJVElPTikpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJlc2VuZCB1bmtub3duIChuZXcpIGNvbW1hbmRzIHRocm91Z2ggdGhlIGN1c3RvbSBjb21tYW5kLgotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIEJ1bmRsZSBjb21tYW5kQnVuZGxlLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGFyZ3MsIGZpbmFsIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA9IFNlc3Npb25Db21tYW5kMi5mcm9tQnVuZGxlKGNvbW1hbmRCdW5kbGUpOwotICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJzZW5kQ3VzdG9tQ29tbWFuZCgpOiBJZ25vcmluZyBudWxsIGNvbW1hbmQgZnJvbSAiCi0gICAgICAgICAgICAgICAgICAgICsgZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIsIGNvbW1hbmQpOwotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIsIGNvbW1hbmQpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25DdXN0b21Db21tYW5kKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVVyaShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFVyaSB1cmksCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fVVJJLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicHJlcGFyZUZyb21VcmkoKTogSWdub3JpbmcgbnVsbCB1cmkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUHJlcGFyZUZyb21Vcmkoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCB1cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVNlYXJjaChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9TRUFSQ0gsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicHJlcGFyZUZyb21TZWFyY2goKTogSWdub3JpbmcgZW1wdHkgcXVlcnkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUHJlcGFyZUZyb21TZWFyY2goc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIHF1ZXJ5LCBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tTWVkaWFJZChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBtZWRpYUlkLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX01FRElBX0lELAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicHJlcGFyZUZyb21NZWRpYUlkKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QcmVwYXJlRnJvbU1lZGlhSWQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBtZWRpYUlkLCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5RnJvbVVyaShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFVyaSB1cmksCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fVVJJLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicGxheUZyb21VcmkoKTogSWdub3JpbmcgbnVsbCB1cmkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUGxheUZyb21Vcmkoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCB1cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5RnJvbVNlYXJjaChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9TRUFSQ0gsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicGxheUZyb21TZWFyY2goKTogSWdub3JpbmcgZW1wdHkgcXVlcnkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUGxheUZyb21TZWFyY2goc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIHF1ZXJ5LCBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tTWVkaWFJZChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBtZWRpYUlkLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX01FRElBX0lELAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInBsYXlGcm9tTWVkaWFJZCgpOiBJZ25vcmluZyBudWxsIG1lZGlhSWQgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUGxheUZyb21NZWRpYUlkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUlkLCBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJhdGluZyhmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBtZWRpYUlkLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIHJhdGluZ0J1bmRsZSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fU0VUX1JBVElORywKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRSYXRpbmcoKTogSWdub3JpbmcgbnVsbCBtZWRpYUlkIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYXRpbmdCdW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0UmF0aW5nKCk6IElnbm9yaW5nIG51bGwgcmF0aW5nQnVuZGxlIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFJhdGluZzIgcmF0aW5nID0gUmF0aW5nMi5mcm9tQnVuZGxlKHJhdGluZ0J1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYXRpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGluZ0J1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0UmF0aW5nKCk6IElnbm9yaW5nIG51bGwgcmF0aW5nIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25TZXRSYXRpbmcoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCBtZWRpYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGluZyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3QoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBMaXN0PEJ1bmRsZT4gcGxheWxpc3QsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgbWV0YWRhdGEpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVCwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChwbGF5bGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0UGxheWxpc3QoKTogSWdub3JpbmcgbnVsbCBwbGF5bGlzdCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGxheWxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAvLyBSZWNyZWF0ZXMgVVVJRCBpbiB0aGUgcGxheWxpc3QKLSAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0ySW1wbC5mcm9tQnVuZGxlKHBsYXlsaXN0LmdldChpKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChpdGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2V0UGxheWxpc3QobGlzdCwgTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YSkpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgQnVuZGxlIG1ldGFkYXRhKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1RfTUVUQURBVEEsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS51cGRhdGVQbGF5bGlzdE1ldGFkYXRhKE1lZGlhTWV0YWRhdGEyLmZyb21CdW5kbGUobWV0YWRhdGEpKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGluZGV4LCBCdW5kbGUgbWVkaWFJdGVtKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfQUREX0lURU0sCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXRzIHRoZSBVVUlEIGZyb20gdGhlIGluY29taW5nIG1lZGlhIGlkLCBzbyBjb250cm9sbGVyIG1heSByZXVzZSBhIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgIC8vIGl0ZW0gbXVsdGlwbGUgdGltZXMgZm9yIGFkZFBsYXlsaXN0SXRlbS4KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmFkZFBsYXlsaXN0SXRlbShpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUl0ZW0ySW1wbC5mcm9tQnVuZGxlKG1lZGlhSXRlbSwgbnVsbCkpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIEJ1bmRsZSBtZWRpYUl0ZW0pIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9SRU1PVkVfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gTWVkaWFJdGVtMi5mcm9tQnVuZGxlKG1lZGlhSXRlbSk7Ci0gICAgICAgICAgICAvLyBOb3RlOiBNZWRpYUl0ZW0yIGhhcyBoaWRkZW4gVVVJRCB0byBpZGVudGlmeSBpdCBhY3Jvc3MgdGhlIHByb2Nlc3Nlcy4KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5yZW1vdmVQbGF5bGlzdEl0ZW0oaXRlbSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgaW5kZXgsIEJ1bmRsZSBtZWRpYUl0ZW0pIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9SRVBMQUNFX0lURU0sCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXRzIHRoZSBVVUlEIGZyb20gdGhlIGluY29taW5nIG1lZGlhIGlkLCBzbyBjb250cm9sbGVyIG1heSByZXVzZSBhIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgIC8vIGl0ZW0gbXVsdGlwbGUgdGltZXMgZm9yIHJlcGxhY2VQbGF5bGlzdEl0ZW0uCi0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5yZXBsYWNlUGxheWxpc3RJdGVtKGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhSXRlbTJJbXBsLmZyb21CdW5kbGUobWVkaWFJdGVtLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgQnVuZGxlIG1lZGlhSXRlbSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NLSVBfVE9fUExBWUxJU1RfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFJdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNraXBUb1BsYXlsaXN0SXRlbSgpOiBJZ25vcmluZyBudWxsIG1lZGlhSXRlbSBmcm9tICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBNZWRpYUl0ZW0yIGhhcyBoaWRkZW4gVVVJRCB0byBpZGVudGlmeSBpdCBhY3Jvc3MgdGhlIHByb2Nlc3Nlcy4KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNraXBUb1BsYXlsaXN0SXRlbShNZWRpYUl0ZW0yLmZyb21CdW5kbGUobWVkaWFJdGVtKSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NLSVBfUFJFVl9JVEVNLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5za2lwVG9QcmV2aW91c0l0ZW0oKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TS0lQX05FWFRfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2tpcFRvTmV4dEl0ZW0oKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfUkVQRUFUX01PREUsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNldFJlcGVhdE1vZGUocmVwZWF0TW9kZSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U2h1ZmZsZU1vZGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfU0hVRkZMRV9NT0RFLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zZXRTaHVmZmxlTW9kZShzaHVmZmxlTW9kZSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEFJREwgbWV0aG9kcyBmb3IgTGlicmFyeVNlc3Npb24gb3ZlcnJpZGVzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0TGlicmFyeVJvb3QoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBCdW5kbGUgcm9vdEhpbnRzKQotICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGZpbmFsIExpYnJhcnlSb290IHJvb3QgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25HZXRMaWJyYXJ5Um9vdChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIHJvb3RIaW50cyk7Ci0gICAgICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkdldExpYnJhcnlSb290RG9uZShyb290SGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICByb290ID09IG51bGwgPyBudWxsIDogcm9vdC5nZXRSb290SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QgPT0gbnVsbCA/IG51bGwgOiByb290LmdldEV4dHJhcygpKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRJdGVtKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIE1lZGlhSXRlbTIgcmVzdWx0ID0gc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uR2V0SXRlbShzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIG1lZGlhSWQpOwotICAgICAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25HZXRJdGVtRG9uZShtZWRpYUlkLCByZXN1bHQgPT0gbnVsbCA/IG51bGwgOiByZXN1bHQudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0Q2hpbGRyZW4oZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgcGFyZW50SWQsCi0gICAgICAgICAgICBmaW5hbCBpbnQgcGFnZSwgZmluYWwgaW50IHBhZ2VTaXplLCBmaW5hbCBCdW5kbGUgZXh0cmFzKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicGFyZW50SWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2VTaXplIDwgMSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJOZWl0aGVyIHBhZ2Ugbm9yIHBhZ2VTaXplIHNob3VsZCBiZSBsZXNzIHRoYW4gMSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHJlc3VsdCA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkdldENoaWxkcmVuKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcGFyZW50SWQsIHBhZ2UsIHBhZ2VTaXplLCBleHRyYXMpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5zaXplKCkgPiBwYWdlU2l6ZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm9uR2V0Q2hpbGRyZW4oKSBzaG91bGRuJ3QgcmV0dXJuIG1lZGlhIGl0ZW1zICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIm1vcmUgdGhhbiBwYWdlU2l6ZS4gcmVzdWx0LnNpemUoKT0iICsgcmVzdWx0LnNpemUoKSArICIgcGFnZVNpemU9IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBwYWdlU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PEJ1bmRsZT4gYnVuZGxlTGlzdDsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKE1lZGlhSXRlbTIgaXRlbSA6IHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBidW5kbGVMaXN0LmFkZChpdGVtID09IG51bGwgPyBudWxsIDogaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25HZXRDaGlsZHJlbkRvbmUocGFyZW50SWQsIHBhZ2UsIHBhZ2VTaXplLCBidW5kbGVMaXN0LCBleHRyYXMpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlYXJjaChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZWFyY2goKTogSWdub3JpbmcgZW1wdHkgcXVlcnkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uU2VhcmNoKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlciwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldFNlYXJjaFJlc3VsdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgIGZpbmFsIGludCBwYWdlLCBmaW5hbCBpbnQgcGFnZVNpemUsIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiZ2V0U2VhcmNoUmVzdWx0KCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5IGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYWdlIDwgMSB8fCBwYWdlU2l6ZSA8IDEpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJnZXRTZWFyY2hSZXN1bHQoKTogSWdub3JpbmcgbmVnYXRpdmUgcGFnZSAvIHBhZ2VTaXplLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBwYWdlPSIgKyBwYWdlICsgIiBwYWdlU2l6ZT0iICsgcGFnZVNpemUgKyAiIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0ID0gc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uR2V0U2VhcmNoUmVzdWx0KHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcXVlcnksIHBhZ2UsIHBhZ2VTaXplLCBleHRyYXMpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5zaXplKCkgPiBwYWdlU2l6ZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm9uR2V0U2VhcmNoUmVzdWx0KCkgc2hvdWxkbid0IHJldHVybiBtZWRpYSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJpdGVtcyBtb3JlIHRoYW4gcGFnZVNpemUuIHJlc3VsdC5zaXplKCk9IiArIHJlc3VsdC5zaXplKCkgKyAiIHBhZ2VTaXplPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcGFnZVNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgTGlzdDxCdW5kbGU+IGJ1bmRsZUxpc3Q7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidW5kbGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChNZWRpYUl0ZW0yIGl0ZW0gOiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVuZGxlTGlzdC5hZGQoaXRlbSA9PSBudWxsID8gbnVsbCA6IGl0ZW0udG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidW5kbGVMaXN0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uR2V0U2VhcmNoUmVzdWx0RG9uZShxdWVyeSwgcGFnZSwgcGFnZVNpemUsIGJ1bmRsZUxpc3QsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3Vic2NyaWJlKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHBhcmVudElkLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIG9wdGlvbikgewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic3Vic2NyaWJlKCk6IElnbm9yaW5nIG51bGwgcGFyZW50SWQgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uU3Vic2NyaWJlKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcGFyZW50SWQsIG9wdGlvbik7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gc3Vic2NyaXB0aW9uID0gbVN1YnNjcmlwdGlvbnMuZ2V0KGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1TdWJzY3JpcHRpb25zLnB1dChjb250cm9sbGVyLCBzdWJzY3JpcHRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24uYWRkKHBhcmVudElkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdW5zdWJzY3JpYmUoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgcGFyZW50SWQpIHsKLSAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInVuc3Vic2NyaWJlKCk6IElnbm9yaW5nIG51bGwgcGFyZW50SWQgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uVW5zdWJzY3JpYmUoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCBwYXJlbnRJZCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgbVN1YnNjcmlwdGlvbnMucmVtb3ZlKGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gQVBJcyBmb3IgTWVkaWFTZXNzaW9uMkltcGwKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvLyBUT0RPKGphZXdhbik6IChDYW4gYmUgUG9zdC1QKSBOZWVkIGEgd2F5IHRvIGdldCBjb250cm9sbGVyIHdpdGggcGVybWlzc2lvbnMKLSAgICBwdWJsaWMgTGlzdDxDb250cm9sbGVySW5mbz4gZ2V0Q29udHJvbGxlcnMoKSB7Ci0gICAgICAgIEFycmF5TGlzdDxDb250cm9sbGVySW5mbz4gY29udHJvbGxlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ29udHJvbGxlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVycy5hZGQobUNvbnRyb2xsZXJzLnZhbHVlQXQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250cm9sbGVyczsKLSAgICB9Ci0KLSAgICAvLyBTaG91bGQgYmUgdXNlZCB3aXRob3V0IGEgbG9jayB0byBwcmV2ZW50IHBvdGVudGlhbCBkZWFkbG9jay4KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlQbGF5ZXJTdGF0ZUNoYW5nZWROb3RMb2NrZWQoaW50IHN0YXRlKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUGxheWVyU3RhdGVDaGFuZ2VkKHN0YXRlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBSZW5hbWUKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlQb3NpdGlvbkNoYW5nZWROb3RMb2NrZWQobG9uZyBldmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUG9zaXRpb25DaGFuZ2VkKGV2ZW50VGltZU1zLCBwb3NpdGlvbk1zKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWJhY2tTcGVlZENoYW5nZWROb3RMb2NrZWQoZmxvYXQgc3BlZWQpIHsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5YmFja1NwZWVkQ2hhbmdlZChzcGVlZCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkTm90TG9ja2VkKGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQnVmZmVyZWRQb3NpdGlvbkNoYW5nZWQoYnVmZmVyZWRQb3NpdGlvbk1zKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5Q3VzdG9tTGF5b3V0Tm90TG9ja2VkKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIExpc3Q8Q29tbWFuZEJ1dHRvbj4gbGF5b3V0KSB7Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgTGlzdDxCdW5kbGU+IGxheW91dEJ1bmRsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGF5b3V0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9ICgoQ29tbWFuZEJ1dHRvbkltcGwpIGxheW91dC5nZXQoaSkuZ2V0UHJvdmlkZXIoKSkudG9CdW5kbGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0QnVuZGxlcy5hZGQoYnVuZGxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkN1c3RvbUxheW91dENoYW5nZWQobGF5b3V0QnVuZGxlcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZE5vdExvY2tlZChMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0LCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBmaW5hbCBMaXN0PEJ1bmRsZT4gYnVuZGxlTGlzdDsKLSAgICAgICAgaWYgKHBsYXlsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGxheWxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocGxheWxpc3QuZ2V0KGkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IHBsYXlsaXN0LmdldChpKS50b0J1bmRsZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QuYWRkKGJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidW5kbGVMaXN0ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBCdW5kbGUgbWV0YWRhdGFCdW5kbGUgPSAobWV0YWRhdGEgPT0gbnVsbCkgPyBudWxsIDogbWV0YWRhdGEudG9CdW5kbGUoKTsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlciwKLSAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9HRVRfTElTVCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUGxheWxpc3RDaGFuZ2VkKGJ1bmRsZUxpc3QsIG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0dFVF9MSVNUX01FVEFEQVRBKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkTm90TG9ja2VkKE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGZpbmFsIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS50b0J1bmRsZSgpOwotICAgICAgICBub3RpZnlBbGwoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9HRVRfTElTVF9NRVRBREFUQSwKLSAgICAgICAgICAgICAgICAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlSZXBlYXRNb2RlQ2hhbmdlZE5vdExvY2tlZChpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBub3RpZnlBbGwoKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUmVwZWF0TW9kZUNoYW5nZWQocmVwZWF0TW9kZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZE5vdExvY2tlZChpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vblNodWZmbGVNb2RlQ2hhbmdlZChzaHVmZmxlTW9kZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXliYWNrSW5mb0NoYW5nZWQoTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm8gcGxheWJhY2tJbmZvKSB7Ci0gICAgICAgIGZpbmFsIEJ1bmRsZSBwbGF5YmFja0luZm9CdW5kbGUgPQotICAgICAgICAgICAgICAgICgoTWVkaWFDb250cm9sbGVyMkltcGwuUGxheWJhY2tJbmZvSW1wbCkgcGxheWJhY2tJbmZvLmdldFByb3ZpZGVyKCkpLnRvQnVuZGxlKCk7Ci0gICAgICAgIG5vdGlmeUFsbCgodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5YmFja0luZm9DaGFuZ2VkKHBsYXliYWNrSW5mb0J1bmRsZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFsbG93ZWRDb21tYW5kcyhDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBjb21tYW5kcykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5wdXQoY29udHJvbGxlciwgY29tbWFuZHMpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKGNvbW1hbmRzLnRvQnVuZGxlKCkpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgQnVuZGxlIGFyZ3MsCi0gICAgICAgICAgICBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCAmJiBjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbnRyb2xsZXIgc2hvdWxkbid0IGJlIG51bGwgaWYgcmVzdWx0IHJlY2VpdmVyIGlzIgotICAgICAgICAgICAgICAgICAgICArICIgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgQnVuZGxlIGNvbW1hbmRCdW5kbGUgPSBjb21tYW5kLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkN1c3RvbUNvbW1hbmQoY29tbWFuZEJ1bmRsZSwgYXJncywgbnVsbCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kKFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncykgewotICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgQnVuZGxlIGNvbW1hbmRCdW5kbGUgPSBjb21tYW5kLnRvQnVuZGxlKCk7Ci0gICAgICAgIG5vdGlmeUFsbCgodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25DdXN0b21Db21tYW5kKGNvbW1hbmRCdW5kbGUsIGFyZ3MsIG51bGwpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlFcnJvcihpbnQgZXJyb3JDb2RlLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25FcnJvcihlcnJvckNvZGUsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBBUElzIGZvciBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbAotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVNlYXJjaFJlc3VsdENoYW5nZWQoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbnQgaXRlbUNvdW50LAotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uU2VhcmNoUmVzdWx0Q2hhbmdlZChxdWVyeSwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWROb3RMb2NrZWQoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgU3RyaW5nIHBhcmVudElkLAotICAgICAgICAgICAgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChpc1N1YnNjcmliZWQoY29udHJvbGxlciwgcGFyZW50SWQpKSB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25DaGlsZHJlbkNoYW5nZWQocGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5Q2hpbGRyZW5DaGFuZ2VkTm90TG9ja2VkKFN0cmluZyBwYXJlbnRJZCwgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAoaXNTdWJzY3JpYmVkKGNvbnRyb2xsZXIsIHBhcmVudElkKSkgewotICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQ2hpbGRyZW5DaGFuZ2VkKHBhcmVudElkLCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1N1YnNjcmliZWQoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgU3RyaW5nIHBhcmVudElkKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IHN1YnNjcmlwdGlvbnMgPSBtU3Vic2NyaXB0aW9ucy5nZXQoY29udHJvbGxlcik7Ci0gICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9ucyA9PSBudWxsIHx8ICFzdWJzY3JpcHRpb25zLmNvbnRhaW5zKHBhcmVudElkKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gTWlzYwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBGdW5jdGlvbmFsSW50ZXJmYWNlCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgU2Vzc2lvblJ1bm5hYmxlIHsKLSAgICAgICAgdm9pZCBydW4oZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiwgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlcik7Ci0gICAgfQotCi0gICAgQEZ1bmN0aW9uYWxJbnRlcmZhY2UKLSAgICBwcml2YXRlIGludGVyZmFjZSBMaWJyYXJ5U2Vzc2lvblJ1bm5hYmxlIHsKLSAgICAgICAgdm9pZCBydW4oZmluYWwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwgc2Vzc2lvbiwgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlcik7Ci0gICAgfQotCi0gICAgQEZ1bmN0aW9uYWxJbnRlcmZhY2UKLSAgICBwcml2YXRlIGludGVyZmFjZSBOb3RpZnlSdW5uYWJsZSB7Ci0gICAgICAgIHZvaWQgcnVuKGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgaUNvbnRyb2xsZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzM2ViNjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0Lk5PVElGSUNBVElPTl9TRVJWSUNFOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTIuTWVkaWFOb3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5Ub2tlblR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8vIFRPRE8oamFld2FuKTogTmVlZCBhIHRlc3QgZm9yIHNlc3Npb24gc2VydmljZSBpdHNlbGYuCi1wdWJsaWMgY2xhc3MgTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsIGltcGxlbWVudHMgTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1QU2Vzc2lvblNlcnZpY2UiOyAvLyB0byBtZWV0IDIzIGNoYXIgbGltaXQgaW4gTG9nIHRhZwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBUT0RPKGphZXdhbik6IENoYW5nZSB0aGlzLiAoYi83NDA5NDYxMSkKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uU2VydmljZTIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgUGxheWVyRXZlbnRDYWxsYmFjayBtQ2FsbGJhY2sgPSBuZXcgU2Vzc2lvblNlcnZpY2VFdmVudENhbGxiYWNrKCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBOb3RpZmljYXRpb25NYW5hZ2VyIG1Ob3RpZmljYXRpb25NYW5hZ2VyOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIEludGVudCBtU3RhcnRTZWxmSW50ZW50OwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1J1bm5pbmdGb3JlZ3JvdW5kOwotICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMiBtU2Vzc2lvbjsKLQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwoTWVkaWFTZXNzaW9uU2VydmljZTIgaW5zdGFuY2UpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwoIiArIGluc3RhbmNlICsgIikiKTsKLSAgICAgICAgfQotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTZXNzaW9uKCk7Ci0gICAgfQotCi0gICAgTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlc3Npb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFOb3RpZmljYXRpb24gb25VcGRhdGVOb3RpZmljYXRpb25faW1wbCgpIHsKLSAgICAgICAgLy8gUHJvdmlkZSBkZWZhdWx0IG5vdGlmaWNhdGlvbiBVSSBsYXRlci4KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGVfaW1wbCgpIHsKLSAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIgPSAoTm90aWZpY2F0aW9uTWFuYWdlcikgbUluc3RhbmNlLmdldFN5c3RlbVNlcnZpY2UoCi0gICAgICAgICAgICAgICAgTk9USUZJQ0FUSU9OX1NFUlZJQ0UpOwotICAgICAgICBtU3RhcnRTZWxmSW50ZW50ID0gbmV3IEludGVudChtSW5zdGFuY2UsIG1JbnN0YW5jZS5nZXRDbGFzcygpKTsKLQotICAgICAgICBTZXNzaW9uVG9rZW4yIHRva2VuID0gbmV3IFNlc3Npb25Ub2tlbjIobUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0UGFja2FnZU5hbWUoKSwKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICBpZiAodG9rZW4uZ2V0VHlwZSgpICE9IGdldFNlc3Npb25UeXBlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBzZXNzaW9uIHNlcnZpY2UsIGJ1dCB3YXMgIiArIHRva2VuLmdldFR5cGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlc3Npb24gPSBtSW5zdGFuY2Uub25DcmVhdGVTZXNzaW9uKHRva2VuLmdldElkKCkpOwotICAgICAgICBpZiAobVNlc3Npb24gPT0gbnVsbCB8fCAhdG9rZW4uZ2V0SWQoKS5lcXVhbHMobVNlc3Npb24uZ2V0VG9rZW4oKS5nZXRJZCgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIHNlc3Npb24gd2l0aCBpZCAiICsgdG9rZW4uZ2V0SWQoKQotICAgICAgICAgICAgICAgICAgICArICIsIGJ1dCBnb3QgIiArIG1TZXNzaW9uKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFVuY29tbWVudCBoZXJlLgotICAgICAgICAvLyBtU2Vzc2lvbi5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobUNhbGxiYWNrLCBtU2Vzc2lvbi5nZXRFeGVjdXRvcigpKTsKLSAgICB9Ci0KLSAgICBAVG9rZW5UeXBlIGludCBnZXRTZXNzaW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OX1NFUlZJQ0U7Ci0gICAgfQotCi0gICAgcHVibGljIElCaW5kZXIgb25CaW5kX2ltcGwoSW50ZW50IGludGVudCkgewotICAgICAgICBpZiAoTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKE1lZGlhU2Vzc2lvbjJJbXBsKSBtU2Vzc2lvbi5nZXRQcm92aWRlcigpKS5nZXRTZXNzaW9uU3R1YigpLmFzQmluZGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU5vdGlmaWNhdGlvbihpbnQgcGxheWVyU3RhdGUpIHsKLSAgICAgICAgTWVkaWFOb3RpZmljYXRpb24gbWVkaWFOb3RpZmljYXRpb24gPSBtSW5zdGFuY2Uub25VcGRhdGVOb3RpZmljYXRpb24oKTsKLSAgICAgICAgaWYgKG1lZGlhTm90aWZpY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2gocGxheWVyU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXJCYXNlLlBMQVlFUl9TVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgIGlmICghbUlzUnVubmluZ0ZvcmVncm91bmQpIHsKLSAgICAgICAgICAgICAgICAgICAgbUlzUnVubmluZ0ZvcmVncm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc3RhcnRGb3JlZ3JvdW5kU2VydmljZShtU3RhcnRTZWxmSW50ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnN0YXJ0Rm9yZWdyb3VuZChtZWRpYU5vdGlmaWNhdGlvbi5nZXROb3RpZmljYXRpb25JZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhTm90aWZpY2F0aW9uLmdldE5vdGlmaWNhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXJCYXNlLlBMQVlFUl9TVEFURV9JRExFOgotICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXllckJhc2UuUExBWUVSX1NUQVRFX0VSUk9SOgotICAgICAgICAgICAgICAgIGlmIChtSXNSdW5uaW5nRm9yZWdyb3VuZCkgewotICAgICAgICAgICAgICAgICAgICBtSXNSdW5uaW5nRm9yZWdyb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc3RvcEZvcmVncm91bmQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIubm90aWZ5KG1lZGlhTm90aWZpY2F0aW9uLmdldE5vdGlmaWNhdGlvbklkKCksCi0gICAgICAgICAgICAgICAgbWVkaWFOb3RpZmljYXRpb24uZ2V0Tm90aWZpY2F0aW9uKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgU2Vzc2lvblNlcnZpY2VFdmVudENhbGxiYWNrIGV4dGVuZHMgUGxheWVyRXZlbnRDYWxsYmFjayB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgcGxheWVyLCBpbnQgc3RhdGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lZGlhTm90aWZpY2F0aW9uSW1wbCBpbXBsZW1lbnRzIE1lZGlhTm90aWZpY2F0aW9uUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIGludCBtTm90aWZpY2F0aW9uSWQ7Ci0gICAgICAgIHByaXZhdGUgTm90aWZpY2F0aW9uIG1Ob3RpZmljYXRpb247Ci0KLSAgICAgICAgcHVibGljIE1lZGlhTm90aWZpY2F0aW9uSW1wbChNZWRpYU5vdGlmaWNhdGlvbiBpbnN0YW5jZSwgaW50IG5vdGlmaWNhdGlvbklkLAotICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgICAgIGlmIChub3RpZmljYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vdGlmaWNhdGlvbiBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbklkID0gbm90aWZpY2F0aW9uSWQ7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uID0gbm90aWZpY2F0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Tm90aWZpY2F0aW9uSWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTm90aWZpY2F0aW9uSWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE5vdGlmaWNhdGlvbiBnZXROb3RpZmljYXRpb25faW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTm90aWZpY2F0aW9uOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9SYXRpbmcySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9SYXRpbmcySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTU4MTI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvUmF0aW5nMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuUmF0aW5nMi4qOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMi5TdHlsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5SYXRpbmcyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUmF0aW5nMkltcGwgaW1wbGVtZW50cyBSYXRpbmcyUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmF0aW5nMiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NUWUxFID0gImFuZHJvaWQubWVkaWEucmF0aW5nMi5zdHlsZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WQUxVRSA9ICJhbmRyb2lkLm1lZGlhLnJhdGluZzIudmFsdWUiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgZmxvYXQgUkFUSU5HX05PVF9SQVRFRCA9IC0xLjBmOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBSYXRpbmcyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtUmF0aW5nU3R5bGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBtUmF0aW5nVmFsdWU7Ci0KLSAgICBwcml2YXRlIFJhdGluZzJJbXBsKEBTdHlsZSBpbnQgcmF0aW5nU3R5bGUsIGZsb2F0IHJhdGluZykgewotICAgICAgICBtUmF0aW5nU3R5bGUgPSByYXRpbmdTdHlsZTsKLSAgICAgICAgbVJhdGluZ1ZhbHVlID0gcmF0aW5nOwotICAgICAgICBtSW5zdGFuY2UgPSBuZXcgUmF0aW5nMih0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiAiUmF0aW5nMjpzdHlsZT0iICsgbVJhdGluZ1N0eWxlICsgIiByYXRpbmc9IgotICAgICAgICAgICAgICAgICsgKG1SYXRpbmdWYWx1ZSA8IDAuMGYgPyAidW5yYXRlZCIgOiBTdHJpbmcudmFsdWVPZihtUmF0aW5nVmFsdWUpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNfaW1wbChPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFJhdGluZzIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgUmF0aW5nMkltcGwgb3RoZXIgPSAoUmF0aW5nMkltcGwpICgoUmF0aW5nMikgb2JqKS5nZXRQcm92aWRlcigpOwotICAgICAgICByZXR1cm4gbVJhdGluZ1N0eWxlID09IG90aGVyLm1SYXRpbmdTdHlsZQotICAgICAgICAgICAgICAgICYmIG1SYXRpbmdWYWx1ZSA9PSBvdGhlci5tUmF0aW5nVmFsdWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKG1SYXRpbmdTdHlsZSwgbVJhdGluZ1ZhbHVlKTsKLSAgICB9Ci0KLSAgICBSYXRpbmcyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoYnVuZGxlLmdldEludChLRVlfU1RZTEUpLCBidW5kbGUuZ2V0RmxvYXQoS0VZX1ZBTFVFKSkuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7Ci0gICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX1NUWUxFLCBtUmF0aW5nU3R5bGUpOwotICAgICAgICBidW5kbGUucHV0RmxvYXQoS0VZX1ZBTFVFLCBtUmF0aW5nVmFsdWUpOwotICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdVbnJhdGVkUmF0aW5nX2ltcGwoQFN0eWxlIGludCByYXRpbmdTdHlsZSkgewotICAgICAgICBzd2l0Y2gocmF0aW5nU3R5bGUpIHsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HX0hFQVJUOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfVEhVTUJfVVBfRE9XTjoKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzNfU1RBUlM6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR180X1NUQVJTOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfNV9TVEFSUzoKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HX1BFUkNFTlRBR0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChyYXRpbmdTdHlsZSwgUkFUSU5HX05PVF9SQVRFRCkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJhdGluZzIgbmV3SGVhcnRSYXRpbmdfaW1wbChib29sZWFuIGhhc0hlYXJ0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoUkFUSU5HX0hFQVJULCBoYXNIZWFydCA/IDEuMGYgOiAwLjBmKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdUaHVtYlJhdGluZ19pbXBsKGJvb2xlYW4gdGh1bWJJc1VwKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoUkFUSU5HX1RIVU1CX1VQX0RPV04sIHRodW1iSXNVcCA/IDEuMGYgOiAwLjBmKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdTdGFyUmF0aW5nX2ltcGwoaW50IHN0YXJSYXRpbmdTdHlsZSwgZmxvYXQgc3RhclJhdGluZykgewotICAgICAgICBmbG9hdCBtYXhSYXRpbmcgPSBSQVRJTkdfTk9UX1JBVEVEOwotICAgICAgICBzd2l0Y2goc3RhclJhdGluZ1N0eWxlKSB7Ci0gICAgICAgICAgICBjYXNlIFJBVElOR18zX1NUQVJTOgotICAgICAgICAgICAgICAgIG1heFJhdGluZyA9IDMuMGY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJBVElOR180X1NUQVJTOgotICAgICAgICAgICAgICAgIG1heFJhdGluZyA9IDQuMGY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJBVElOR181X1NUQVJTOgotICAgICAgICAgICAgICAgIG1heFJhdGluZyA9IDUuMGY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgcmF0aW5nIHN0eWxlICgiICsgc3RhclJhdGluZ1N0eWxlICsgIikgZm9yIGEgc3RhciByYXRpbmciKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoKHN0YXJSYXRpbmcgPCAwLjBmKSB8fCAoc3RhclJhdGluZyA+IG1heFJhdGluZykpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIlRyeWluZyB0byBzZXQgb3V0IG9mIHJhbmdlIHN0YXItYmFzZWQgcmF0aW5nIik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFJhdGluZzJJbXBsKHN0YXJSYXRpbmdTdHlsZSwgc3RhclJhdGluZykuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJhdGluZzIgbmV3UGVyY2VudGFnZVJhdGluZ19pbXBsKGZsb2F0IHBlcmNlbnQpIHsKLSAgICAgICAgaWYgKChwZXJjZW50IDwgMC4wZikgfHwgKHBlcmNlbnQgPiAxMDAuMGYpKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJJbnZhbGlkIHBlcmNlbnRhZ2UtYmFzZWQgcmF0aW5nIHZhbHVlIik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoUkFUSU5HX1BFUkNFTlRBR0UsIHBlcmNlbnQpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JhdGVkX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtUmF0aW5nVmFsdWUgPj0gMC4wZjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJhdGluZ1N0eWxlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtUmF0aW5nU3R5bGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzSGVhcnRfaW1wbCgpIHsKLSAgICAgICAgaWYgKG1SYXRpbmdTdHlsZSAhPSBSQVRJTkdfSEVBUlQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAobVJhdGluZ1ZhbHVlID09IDEuMGYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNUaHVtYlVwX2ltcGwoKSB7Ci0gICAgICAgIGlmIChtUmF0aW5nU3R5bGUgIT0gUkFUSU5HX1RIVU1CX1VQX0RPV04pIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAobVJhdGluZ1ZhbHVlID09IDEuMGYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZsb2F0IGdldFN0YXJSYXRpbmdfaW1wbCgpIHsKLSAgICAgICAgc3dpdGNoIChtUmF0aW5nU3R5bGUpIHsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzNfU1RBUlM6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR180X1NUQVJTOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfNV9TVEFSUzoKLSAgICAgICAgICAgICAgICBpZiAobUluc3RhbmNlLmlzUmF0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVJhdGluZ1ZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xLjBmOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZsb2F0IGdldFBlcmNlbnRSYXRpbmdfaW1wbCgpIHsKLSAgICAgICAgaWYgKChtUmF0aW5nU3R5bGUgIT0gUkFUSU5HX1BFUkNFTlRBR0UpIHx8ICFtSW5zdGFuY2UuaXNSYXRlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTEuMGY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJhdGluZ1ZhbHVlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Sb3V0ZVBsYXllci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Sb3V0ZVBsYXllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDUwZDM0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvUm91dGVQbGF5ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlJlcXVpcmVzQXBpOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYUl0ZW1TdGF0dXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhU2Vzc2lvblN0YXR1czsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLlJlbW90ZVBsYXliYWNrQ2xpZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuUmVtb3RlUGxheWJhY2tDbGllbnQuSXRlbUFjdGlvbkNhbGxiYWNrOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuUmVtb3RlUGxheWJhY2tDbGllbnQuU2Vzc2lvbkFjdGlvbkNhbGxiYWNrOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuUmVtb3RlUGxheWJhY2tDbGllbnQuU3RhdHVzQ2FsbGJhY2s7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1AUmVxdWlyZXNBcGkoYXBpID0gQnVpbGQuVkVSU0lPTl9DT0RFUy5MT0xMSVBPUCkKLXB1YmxpYyBjbGFzcyBSb3V0ZVBsYXllciBleHRlbmRzIE1lZGlhU2Vzc2lvbi5DYWxsYmFjayB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFBMQVlCQUNLX0FDVElPTlMgPSBQbGF5YmFja1N0YXRlLkFDVElPTl9QQVVTRQotICAgICAgICAgICAgfCBQbGF5YmFja1N0YXRlLkFDVElPTl9QTEFZIHwgUGxheWJhY2tTdGF0ZS5BQ1RJT05fU0VFS19UTwotICAgICAgICAgICAgfCBQbGF5YmFja1N0YXRlLkFDVElPTl9GQVNUX0ZPUldBUkQgfCBQbGF5YmFja1N0YXRlLkFDVElPTl9SRVdJTkQ7Ci0KLSAgICBwcml2YXRlIFJlbW90ZVBsYXliYWNrQ2xpZW50IG1DbGllbnQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVNlc3Npb25JZDsKLSAgICBwcml2YXRlIFN0cmluZyBtSXRlbUlkOwotICAgIHByaXZhdGUgUGxheWVyRXZlbnRDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIFN0YXR1c0NhbGxiYWNrIG1TdGF0dXNDYWxsYmFjayA9IG5ldyBTdGF0dXNDYWxsYmFjaygpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVN0YXR1c0NoYW5nZWQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgIHVwZGF0ZUl0ZW1TdGF0dXMoaXRlbUlkLCBpdGVtU3RhdHVzKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwdWJsaWMgUm91dGVQbGF5ZXIoQ29udGV4dCBjb250ZXh0LCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgbUNsaWVudCA9IG5ldyBSZW1vdGVQbGF5YmFja0NsaWVudChjb250ZXh0LCByb3V0ZSk7Ci0gICAgICAgIG1DbGllbnQuc2V0U3RhdHVzQ2FsbGJhY2sobVN0YXR1c0NhbGxiYWNrKTsKLSAgICAgICAgbUNsaWVudC5zdGFydFNlc3Npb24obnVsbCwgbmV3IFNlc3Npb25BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXkoKSB7Ci0gICAgICAgIG1DbGllbnQucmVzdW1lKG51bGwsIG5ldyBTZXNzaW9uQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgbUNsaWVudC5wYXVzZShudWxsLCBuZXcgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2Vla1RvKGxvbmcgcG9zKSB7Ci0gICAgICAgIG1DbGllbnQuc2VlayhtSXRlbUlkLCBwb3MsIG51bGwsIG5ldyBJdGVtQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlSXRlbVN0YXR1cyhpdGVtSWQsIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICAgIG1DbGllbnQuc3RvcChudWxsLCBuZXcgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBsYXllckV2ZW50Q2FsbGJhY2soUGxheWVyRXZlbnRDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvcGVuVmlkZW8oRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgIG1DbGllbnQucGxheShkc2QuZ2V0VXJpKCksICJ2aWRlby9tcDQiLCBudWxsLCAwLCBudWxsLCBuZXcgSXRlbUFjdGlvbkNhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQsIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW1TdGF0dXMoaXRlbUlkLCBpdGVtU3RhdHVzKTsKLSAgICAgICAgICAgICAgICBwbGF5SW50ZXJuYWwoZHNkLmdldFVyaSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLSAgICAgICAgaWYgKG1DbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNsaWVudC5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQ2xpZW50ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGxheUludGVybmFsKFVyaSB1cmkpIHsKLSAgICAgICAgbUNsaWVudC5wbGF5KHVyaSwgInZpZGVvL21wNCIsIG51bGwsIDAsIG51bGwsIG5ldyBJdGVtQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlSXRlbVN0YXR1cyhpdGVtSWQsIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2Vzc2lvblN0YXR1cyhTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVJdGVtU3RhdHVzKFN0cmluZyBpdGVtSWQsIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7Ci0gICAgICAgIG1JdGVtSWQgPSBpdGVtSWQ7Ci0gICAgICAgIGlmIChpdGVtU3RhdHVzID09IG51bGwgfHwgbUNhbGxiYWNrID09IG51bGwpIHJldHVybjsKLSAgICAgICAgbUNhbGxiYWNrLm9uUGxheWVyU3RhdGVDaGFuZ2VkKGl0ZW1TdGF0dXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUGxheWVyRXZlbnRDYWxsYmFjayB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7IH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNTcwYWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uUGxheWxpc3RBZ2VudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5PbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLkd1YXJkZWRCeTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkTG9jYWxSYW5kb207Ci0KLXB1YmxpYyBjbGFzcyBTZXNzaW9uUGxheWxpc3RBZ2VudCBleHRlbmRzIE1lZGlhUGxheWxpc3RBZ2VudCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTZXNzaW9uUGxheWxpc3RBZ2VudCI7Ci0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIGZpbmFsIGludCBFTkRfT0ZfUExBWUxJU1QgPSAtMTsKLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBzdGF0aWMgZmluYWwgaW50IE5PX1ZBTElEX0lURU1TID0gLTI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFBsYXlJdGVtIG1Fb3BQbGF5SXRlbSA9IG5ldyBQbGF5SXRlbShFTkRfT0ZfUExBWUxJU1QsIG51bGwpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBtU2Vzc2lvbkltcGw7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNeVBsYXllckV2ZW50Q2FsbGJhY2sgbVBsYXllckNhbGxiYWNrOwotCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXJCYXNlIG1QbGF5ZXI7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBtRHNtSGVscGVyOwotICAgIC8vIFRPRE86IENoZWNrIGlmIGhhdmluZyB0aGUgc2FtZSBpdGVtIGlzIG9rYXkgKGIvNzQwOTA3NDEpCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lZGlhSXRlbTI+IG1QbGF5bGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIEFycmF5TGlzdDxNZWRpYUl0ZW0yPiBtU2h1ZmZsZWRMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgTWFwPE1lZGlhSXRlbTIsIERhdGFTb3VyY2VEZXNjPiBtSXRlbURzZE1hcCA9IG5ldyBBcnJheU1hcDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YTIgbU1ldGFkYXRhOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGludCBtUmVwZWF0TW9kZTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBpbnQgbVNodWZmbGVNb2RlOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFBsYXlJdGVtIG1DdXJyZW50OwotCi0gICAgLy8gQ2FsbGVkIG9uIHNlc3Npb24gY2FsbGJhY2sgZXhlY3V0b3IuCi0gICAgcHJpdmF0ZSBjbGFzcyBNeVBsYXllckV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBQbGF5ZXJFdmVudENhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQoQE5vbk51bGwgTWVkaWFQbGF5ZXJCYXNlIG1wYiwKLSAgICAgICAgICAgICAgICBATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICBpZiAobVBsYXllciAhPSBtcGIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRzZCA9PSBudWxsICYmIG1DdXJyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChtQ3VycmVudC5zaHVmZmxlZElkeCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgUGxheUl0ZW0gewotICAgICAgICBpbnQgc2h1ZmZsZWRJZHg7Ci0gICAgICAgIERhdGFTb3VyY2VEZXNjIGRzZDsKLSAgICAgICAgTWVkaWFJdGVtMiBtZWRpYUl0ZW07Ci0KLSAgICAgICAgUGxheUl0ZW0oaW50IHNodWZmbGVkSWR4KSB7Ci0gICAgICAgICAgICB0aGlzKHNodWZmbGVkSWR4LCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIFBsYXlJdGVtKGludCBzaHVmZmxlZElkeCwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICB0aGlzLnNodWZmbGVkSWR4ID0gc2h1ZmZsZWRJZHg7Ci0gICAgICAgICAgICBpZiAoc2h1ZmZsZWRJZHggPj0gMCkgewotICAgICAgICAgICAgICAgIHRoaXMubWVkaWFJdGVtID0gbVNodWZmbGVkTGlzdC5nZXQoc2h1ZmZsZWRJZHgpOwotICAgICAgICAgICAgICAgIGlmIChkc2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRzZCA9IHJldHJpZXZlRGF0YVNvdXJjZURlc2NMb2NrZWQodGhpcy5tZWRpYUl0ZW0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5kc2QgPSBkc2Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICAgICAgaWYgKHRoaXMgPT0gbUVvcFBsYXlJdGVtKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWVkaWFJdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZHNkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2h1ZmZsZWRJZHggPj0gbVNodWZmbGVkTGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWVkaWFJdGVtICE9IG1TaHVmZmxlZExpc3QuZ2V0KHNodWZmbGVkSWR4KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZWRpYUl0ZW0uZ2V0RGF0YVNvdXJjZURlc2MoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICFtZWRpYUl0ZW0uZ2V0RGF0YVNvdXJjZURlc2MoKS5lcXVhbHMoZHNkKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNlc3Npb25QbGF5bGlzdEFnZW50KEBOb25OdWxsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb25JbXBsLAotICAgICAgICAgICAgQE5vbk51bGwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllcikgewotICAgICAgICBpZiAoc2Vzc2lvbkltcGwgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2Vzc2lvbkltcGwgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGxheWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXNzaW9uSW1wbCA9IHNlc3Npb25JbXBsOwotICAgICAgICBtUGxheWVyID0gcGxheWVyOwotICAgICAgICBtUGxheWVyQ2FsbGJhY2sgPSBuZXcgTXlQbGF5ZXJFdmVudENhbGxiYWNrKCk7Ci0gICAgICAgIG1QbGF5ZXIucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1TZXNzaW9uSW1wbC5nZXRDYWxsYmFja0V4ZWN1dG9yKCksIG1QbGF5ZXJDYWxsYmFjayk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWVyKEBOb25OdWxsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIpIHsKLSAgICAgICAgaWYgKHBsYXllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5ZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAocGxheWVyID09IG1QbGF5ZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUGxheWVyLnVucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1QbGF5ZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICBtUGxheWVyID0gcGxheWVyOwotICAgICAgICAgICAgbVBsYXllci5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2soCi0gICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSW1wbC5nZXRDYWxsYmFja0V4ZWN1dG9yKCksIG1QbGF5ZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgaGVscGVyKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1Ec21IZWxwZXIgPSBoZWxwZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhck9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1Ec21IZWxwZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBMaXN0PE1lZGlhSXRlbTI+IGdldFBsYXlsaXN0KCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChtUGxheWxpc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3QoQE5vbk51bGwgTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LCBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbUl0ZW1Ec2RNYXAuY2xlYXIoKTsKLQotICAgICAgICAgICAgbVBsYXlsaXN0LmNsZWFyKCk7Ci0gICAgICAgICAgICBtUGxheWxpc3QuYWRkQWxsKGxpc3QpOwotICAgICAgICAgICAgYXBwbHlTaHVmZmxlTW9kZUxvY2tlZCgpOwotCi0gICAgICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQoRU5EX09GX1BMQVlMSVNULCAxKTsKLSAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlQbGF5bGlzdENoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIGdldFBsYXlsaXN0TWV0YWRhdGEoKSB7Ci0gICAgICAgIHJldHVybiBtTWV0YWRhdGE7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YShATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1ldGFkYXRhID09IG1NZXRhZGF0YSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGxheWxpc3RJdGVtKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpbmRleCA9IGNsYW1wKGluZGV4LCBtUGxheWxpc3Quc2l6ZSgpKTsKLSAgICAgICAgICAgIGludCBzaHVmZmxlZElkeCA9IGluZGV4OwotICAgICAgICAgICAgbVBsYXlsaXN0LmFkZChpbmRleCwgaXRlbSk7Ci0gICAgICAgICAgICBpZiAobVNodWZmbGVNb2RlID09IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORSkgewotICAgICAgICAgICAgICAgIG1TaHVmZmxlZExpc3QuYWRkKGluZGV4LCBpdGVtKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBpdGVtIGluIHJhbmRvbSBwb3NpdGlvbiBvZiBtU2h1ZmZsZWRMaXN0LgotICAgICAgICAgICAgICAgIHNodWZmbGVkSWR4ID0gVGhyZWFkTG9jYWxSYW5kb20uY3VycmVudCgpLm5leHRJbnQobVNodWZmbGVkTGlzdC5zaXplKCkgKyAxKTsKLSAgICAgICAgICAgICAgICBtU2h1ZmZsZWRMaXN0LmFkZChzaHVmZmxlZElkeCwgaXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChFTkRfT0ZfUExBWUxJU1QsIDEpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5UGxheWxpc3RDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtKEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFtUGxheWxpc3QucmVtb3ZlKGl0ZW0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNodWZmbGVkTGlzdC5yZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICBtSXRlbURzZE1hcC5yZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlQbGF5bGlzdENoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXBsYWNlUGxheWxpc3RJdGVtKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobVBsYXlsaXN0LnNpemUoKSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5kZXggPSBjbGFtcChpbmRleCwgbVBsYXlsaXN0LnNpemUoKSAtIDEpOwotICAgICAgICAgICAgaW50IHNodWZmbGVkSWR4ID0gbVNodWZmbGVkTGlzdC5pbmRleE9mKG1QbGF5bGlzdC5nZXQoaW5kZXgpKTsKLSAgICAgICAgICAgIG1JdGVtRHNkTWFwLnJlbW92ZShtU2h1ZmZsZWRMaXN0LmdldChzaHVmZmxlZElkeCkpOwotICAgICAgICAgICAgbVNodWZmbGVkTGlzdC5zZXQoc2h1ZmZsZWRJZHgsIGl0ZW0pOwotICAgICAgICAgICAgbVBsYXlsaXN0LnNldChpbmRleCwgaXRlbSk7Ci0gICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChFTkRfT0ZfUExBWUxJU1QsIDEpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5UGxheWxpc3RDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtKEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFoYXNWYWxpZEl0ZW0oKSB8fCBpdGVtLmVxdWFscyhtQ3VycmVudC5tZWRpYUl0ZW0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHNodWZmbGVkSWR4ID0gbVNodWZmbGVkTGlzdC5pbmRleE9mKGl0ZW0pOwotICAgICAgICAgICAgaWYgKHNodWZmbGVkSWR4IDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJyZW50ID0gbmV3IFBsYXlJdGVtKHNodWZmbGVkSWR4KTsKLSAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUGxheUl0ZW0gcHJldiA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKG1DdXJyZW50LnNodWZmbGVkSWR4LCAtMSk7Ci0gICAgICAgICAgICBpZiAocHJldiAhPSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudCA9IHByZXY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW0oKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkgfHwgbUN1cnJlbnQgPT0gbUVvcFBsYXlJdGVtKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUGxheUl0ZW0gbmV4dCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKG1DdXJyZW50LnNodWZmbGVkSWR4LCAxKTsKLSAgICAgICAgICAgIGlmIChuZXh0ICE9IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gbmV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRSZXBlYXRNb2RlKCkgewotICAgICAgICByZXR1cm4gbVJlcGVhdE1vZGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZShpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBpZiAocmVwZWF0TW9kZSA8IE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FCi0gICAgICAgICAgICAgICAgfHwgcmVwZWF0TW9kZSA+IE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9HUk9VUCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtUmVwZWF0TW9kZSA9PSByZXBlYXRNb2RlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJlcGVhdE1vZGUgPSByZXBlYXRNb2RlOwotICAgICAgICAgICAgc3dpdGNoIChyZXBlYXRNb2RlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FOgotICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnQgIT0gbnVsbCAmJiBtQ3VycmVudCAhPSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5ZXIubG9vcEN1cnJlbnQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMOgotICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQOgotICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnQgPT0gbUVvcFBsYXlJdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKEVORF9PRl9QTEFZTElTVCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gcGFzcyB0aHJvdWdoCi0gICAgICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORToKLSAgICAgICAgICAgICAgICAgICAgbVBsYXllci5sb29wQ3VycmVudChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TaHVmZmxlTW9kZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZShpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgaWYgKHNodWZmbGVNb2RlIDwgTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FCi0gICAgICAgICAgICAgICAgfHwgc2h1ZmZsZU1vZGUgPiBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1TaHVmZmxlTW9kZSA9PSBzaHVmZmxlTW9kZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TaHVmZmxlTW9kZSA9IHNodWZmbGVNb2RlOwotICAgICAgICAgICAgYXBwbHlTaHVmZmxlTW9kZUxvY2tlZCgpOwotICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgaW50IGdldEN1clNodWZmbGVkSW5kZXgoKSB7Ci0gICAgICAgIHJldHVybiBoYXNWYWxpZEl0ZW0oKSA/IG1DdXJyZW50LnNodWZmbGVkSWR4IDogTk9fVkFMSURfSVRFTVM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc1ZhbGlkSXRlbSgpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJyZW50ICE9IG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBEYXRhU291cmNlRGVzYyByZXRyaWV2ZURhdGFTb3VyY2VEZXNjTG9ja2VkKE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBEYXRhU291cmNlRGVzYyBkc2QgPSBpdGVtLmdldERhdGFTb3VyY2VEZXNjKCk7Ci0gICAgICAgIGlmIChkc2QgIT0gbnVsbCkgewotICAgICAgICAgICAgbUl0ZW1Ec2RNYXAucHV0KGl0ZW0sIGRzZCk7Ci0gICAgICAgICAgICByZXR1cm4gZHNkOwotICAgICAgICB9Ci0gICAgICAgIGRzZCA9IG1JdGVtRHNkTWFwLmdldChpdGVtKTsKLSAgICAgICAgaWYgKGRzZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZHNkOwotICAgICAgICB9Ci0gICAgICAgIE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgaGVscGVyID0gbURzbUhlbHBlcjsKLSAgICAgICAgaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBEbyBub3QgY2FsbCBvbkRhdGFTb3VyY2VNaXNzaW5nIHdpdGggdGhlIGxvY2sgKGIvNzQwOTA3NDEpLgotICAgICAgICAgICAgZHNkID0gaGVscGVyLm9uRGF0YVNvdXJjZU1pc3NpbmcobVNlc3Npb25JbXBsLmdldEluc3RhbmNlKCksIGl0ZW0pOwotICAgICAgICAgICAgaWYgKGRzZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUl0ZW1Ec2RNYXAucHV0KGl0ZW0sIGRzZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRzZDsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBjb25zaWRlciB0byBjYWxsIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCBpbnNpZGUgKGIvNzQwOTA3NDEpCi0gICAgcHJpdmF0ZSBQbGF5SXRlbSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChpbnQgY3VyU2h1ZmZsZWRJZHgsIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgaW50IHNpemUgPSBtUGxheWxpc3Quc2l6ZSgpOwotICAgICAgICBpZiAoY3VyU2h1ZmZsZWRJZHggPT0gRU5EX09GX1BMQVlMSVNUKSB7Ci0gICAgICAgICAgICBjdXJTaHVmZmxlZElkeCA9IChkaXJlY3Rpb24gPiAwKSA/IC0xIDogc2l6ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgY3VyU2h1ZmZsZWRJZHggKz0gZGlyZWN0aW9uOwotICAgICAgICAgICAgaWYgKGN1clNodWZmbGVkSWR4IDwgMCB8fCBjdXJTaHVmZmxlZElkeCA+PSBtUGxheWxpc3Quc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1SZXBlYXRNb2RlID09IFJFUEVBVF9NT0RFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpID09IHNpemUgLSAxKSA/IG51bGwgOiBtRW9wUGxheUl0ZW07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyU2h1ZmZsZWRJZHggPSBjdXJTaHVmZmxlZElkeCA8IDAgPyBtUGxheWxpc3Quc2l6ZSgpIC0gMSA6IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgRGF0YVNvdXJjZURlc2MgZHNkID0gcmV0cmlldmVEYXRhU291cmNlRGVzY0xvY2tlZChtU2h1ZmZsZWRMaXN0LmdldChjdXJTaHVmZmxlZElkeCkpOwotICAgICAgICAgICAgaWYgKGRzZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQbGF5SXRlbShjdXJTaHVmZmxlZElkeCwgZHNkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCkgewotICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpIHx8IG1DdXJyZW50LmlzVmFsaWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGludCBzaHVmZmxlZElkeCA9IG1TaHVmZmxlZExpc3QuaW5kZXhPZihtQ3VycmVudC5tZWRpYUl0ZW0pOwotICAgICAgICBpZiAoc2h1ZmZsZWRJZHggPj0gMCkgewotICAgICAgICAgICAgLy8gQWRkZWQgYW4gaXRlbS4KLSAgICAgICAgICAgIG1DdXJyZW50LnNodWZmbGVkSWR4ID0gc2h1ZmZsZWRJZHg7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUN1cnJlbnQuc2h1ZmZsZWRJZHggPj0gbVNodWZmbGVkTGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobVNodWZmbGVkTGlzdC5zaXplKCkgLSAxLCAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1DdXJyZW50Lm1lZGlhSXRlbSA9IG1TaHVmZmxlZExpc3QuZ2V0KG1DdXJyZW50LnNodWZmbGVkSWR4KTsKLSAgICAgICAgICAgIGlmIChyZXRyaWV2ZURhdGFTb3VyY2VEZXNjTG9ja2VkKG1DdXJyZW50Lm1lZGlhSXRlbSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobUN1cnJlbnQuc2h1ZmZsZWRJZHgsIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCkgewotICAgICAgICBpZiAobUN1cnJlbnQgPT0gbnVsbCB8fCBtQ3VycmVudCA9PSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobVBsYXllci5nZXRDdXJyZW50RGF0YVNvdXJjZSgpICE9IG1DdXJyZW50LmRzZCkgewotICAgICAgICAgICAgbVBsYXllci5zZXREYXRhU291cmNlKG1DdXJyZW50LmRzZCk7Ci0gICAgICAgICAgICBtUGxheWVyLmxvb3BDdXJyZW50KG1SZXBlYXRNb2RlID09IE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE86IENhbGwgc2V0TmV4dERhdGFTb3VyY2UgKGIvNzQwOTA3NDEpCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGx5U2h1ZmZsZU1vZGVMb2NrZWQoKSB7Ci0gICAgICAgIG1TaHVmZmxlZExpc3QuY2xlYXIoKTsKLSAgICAgICAgbVNodWZmbGVkTGlzdC5hZGRBbGwobVBsYXlsaXN0KTsKLSAgICAgICAgaWYgKG1TaHVmZmxlTW9kZSA9PSBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0FMTAotICAgICAgICAgICAgICAgIHx8IG1TaHVmZmxlTW9kZSA9PSBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zaHVmZmxlKG1TaHVmZmxlZExpc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ2xhbXBzIHZhbHVlIHRvIFswLCBzaXplXQotICAgIHByaXZhdGUgc3RhdGljIGludCBjbGFtcChpbnQgdmFsdWUsIGludCBzaXplKSB7Ci0gICAgICAgIGlmICh2YWx1ZSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAodmFsdWUgPiBzaXplKSA/IHNpemUgOiB2YWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25Ub2tlbjJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25Ub2tlbjJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Y2Y4YzQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uVG9rZW4ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRZUEVfU0VTU0lPTjsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRZUEVfU0VTU0lPTl9TRVJWSUNFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9MSUJSQVJZX1NFUlZJQ0U7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5Ub2tlblR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuU2Vzc2lvblRva2VuMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTZXNzaW9uVG9rZW4ySW1wbCBpbXBsZW1lbnRzIFNlc3Npb25Ub2tlbjJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9VSUQgPSAiYW5kcm9pZC5tZWRpYS50b2tlbi51aWQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVFlQRSA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLnR5cGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUEFDS0FHRV9OQU1FID0gImFuZHJvaWQubWVkaWEudG9rZW4ucGFja2FnZV9uYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFUlZJQ0VfTkFNRSA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLnNlcnZpY2VfbmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JRCA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLmlkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFU1NJT05fQklOREVSID0gImFuZHJvaWQubWVkaWEudG9rZW4uc2Vzc2lvbl9iaW5kZXIiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uVG9rZW4yIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtVWlkOwotICAgIHByaXZhdGUgZmluYWwgQFRva2VuVHlwZSBpbnQgbVR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVBhY2thZ2VOYW1lOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TZXJ2aWNlTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtSWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJTWVkaWFTZXNzaW9uMiBtU2Vzc2lvbkJpbmRlcjsKLQotICAgIC8qKgotICAgICAqIFB1YmxpYyBjb25zdHJ1Y3RvciBmb3IgdGhlIGxlZ2FjeSBzdXBwb3J0IChpLmUuIGJyb3dzZXIgY2FuIHRyeSBjb25uZWN0aW5nIHRvIGFueSBicm93c2VyCi0gICAgICogc2VydmljZSBpZiBpdCBrbm93cyB0aGUgc2VydmljZSBuYW1lKQotICAgICAqLwotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4ySW1wbChDb250ZXh0IGNvbnRleHQsIFNlc3Npb25Ub2tlbjIgaW5zdGFuY2UsCi0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBzZXJ2aWNlTmFtZSwgaW50IHVpZCkgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYWNrYWdlTmFtZSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc2VydmljZU5hbWUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZXJ2aWNlTmFtZSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgLy8gQ2FsY3VsYXRlIHVpZCBpZiBpdCdzIG5vdCBzcGVjaWZpZWQuCi0gICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIG1hbmFnZXIgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgICAgIGlmICh1aWQgPCAwKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHVpZCA9IG1hbmFnZXIuZ2V0UGFja2FnZVVpZChwYWNrYWdlTmFtZSwgMCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBmaW5kIHBhY2thZ2UgIiArIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtVWlkID0gdWlkOwotCi0gICAgICAgIC8vIEluZmVyIGlkIGFuZCB0eXBlIGZyb20gcGFja2FnZSBuYW1lIGFuZCBzZXJ2aWNlIG5hbWUKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgbXVsdGktdXNlci4KLSAgICAgICAgU3RyaW5nIGlkID0gZ2V0U2Vzc2lvbklkRnJvbVNlcnZpY2UobWFuYWdlciwgTWVkaWFMaWJyYXJ5U2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UsCi0gICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1JZCA9IGlkOwotICAgICAgICAgICAgbVR5cGUgPSBUWVBFX0xJQlJBUllfU0VSVklDRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHJldHJ5IHdpdGggc2Vzc2lvbiBzZXJ2aWNlCi0gICAgICAgICAgICBtSWQgPSBnZXRTZXNzaW9uSWRGcm9tU2VydmljZShtYW5hZ2VyLCBNZWRpYVNlc3Npb25TZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgIG1UeXBlID0gVFlQRV9TRVNTSU9OX1NFUlZJQ0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1JZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZXJ2aWNlICIgKyBzZXJ2aWNlTmFtZSArICIgZG9lc24ndCBpbXBsZW1lbnQiCi0gICAgICAgICAgICAgICAgICAgICsgIiBzZXNzaW9uIHNlcnZpY2Ugbm9yIGxpYnJhcnkgc2VydmljZS4gVXNlIHNlcnZpY2UncyBmdWxsIG5hbWUuIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0gICAgICAgIG1TZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IG51bGw7Ci0gICAgfQotCi0gICAgU2Vzc2lvblRva2VuMkltcGwoaW50IHVpZCwgaW50IHR5cGUsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgaWQsCi0gICAgICAgICAgICBJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogQWRkIHNhbml0eSBjaGVjayAoYi83Mzg2Mzg2NSkKLSAgICAgICAgbVVpZCA9IHVpZDsKLSAgICAgICAgbVR5cGUgPSB0eXBlOwotICAgICAgICBtUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLSAgICAgICAgbVNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0gICAgICAgIG1JZCA9IGlkOwotICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IHNlc3Npb25CaW5kZXI7Ci0gICAgICAgIG1JbnN0YW5jZSA9IG5ldyBTZXNzaW9uVG9rZW4yKHRoaXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTZXNzaW9uSWRGcm9tU2VydmljZShQYWNrYWdlTWFuYWdlciBtYW5hZ2VyLCBTdHJpbmcgc2VydmljZUludGVyZmFjZSwKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIEludGVudCBzZXJ2aWNlSW50ZW50ID0gbmV3IEludGVudChzZXJ2aWNlSW50ZXJmYWNlKTsKLSAgICAgICAgc2VydmljZUludGVudC5zZXRQYWNrYWdlKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgLy8gVXNlIHF1ZXJ5SW50ZW50U2VydmljZXMgdG8gZmluZCBzZXJ2aWNlcyB3aXRoIE1lZGlhTGlicmFyeVNlcnZpY2UyLlNFUlZJQ0VfSU5URVJGQUNFLgotICAgICAgICAvLyBXZSBjYW5ub3QgdXNlIHJlc29sdmVTZXJ2aWNlIHdpdGggaW50ZW50IHNwZWNpZmllZCBjbGFzcyBuYW1lLCBiZWNhdXNlIHJlc29sdmVTZXJ2aWNlCi0gICAgICAgIC8vIGlnbm9yZXMgYWN0aW9ucyBpZiBJbnRlbnQuc2V0Q2xhc3NOYW1lKCkgaXMgc3BlY2lmaWVkLgotICAgICAgICBMaXN0PFJlc29sdmVJbmZvPiBsaXN0ID0gbWFuYWdlci5xdWVyeUludGVudFNlcnZpY2VzKAotICAgICAgICAgICAgICAgIHNlcnZpY2VJbnRlbnQsIFBhY2thZ2VNYW5hZ2VyLkdFVF9NRVRBX0RBVEEpOwotICAgICAgICBpZiAobGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBSZXNvbHZlSW5mbyByZXNvbHZlSW5mbyA9IGxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlSW5mbyA9PSBudWxsIHx8IHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuZXF1YWxzKHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvLm5hbWUsIHNlcnZpY2VOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U2Vzc2lvbklkKHJlc29sdmVJbmZvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2Vzc2lvbklkKFJlc29sdmVJbmZvIHJlc29sdmVJbmZvKSB7Ci0gICAgICAgIGlmIChyZXNvbHZlSW5mbyA9PSBudWxsIHx8IHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgaWYgKHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvLm1ldGFEYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiByZXNvbHZlSW5mby5zZXJ2aWNlSW5mby5tZXRhRGF0YS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhU2Vzc2lvblNlcnZpY2UyLlNFUlZJQ0VfTUVUQV9EQVRBLCAiIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2Vzc2lvblRva2VuMiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtUGFja2FnZU5hbWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRVaWRfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1VaWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRJZF9pbXAoKSB7Ci0gICAgICAgIHJldHVybiBtSWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRUeXBlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtVHlwZTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0U2VydmljZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtU2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgSU1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbkJpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU2Vzc2lvblRva2VuMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCB1aWQgPSBidW5kbGUuZ2V0SW50KEtFWV9VSUQpOwotICAgICAgICBmaW5hbCBAVG9rZW5UeXBlIGludCB0eXBlID0gYnVuZGxlLmdldEludChLRVlfVFlQRSwgLTEpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9QQUNLQUdFX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9TRVJWSUNFX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9JRCk7Ci0gICAgICAgIGZpbmFsIElCaW5kZXIgc2Vzc2lvbkJpbmRlciA9IGJ1bmRsZS5nZXRCaW5kZXIoS0VZX1NFU1NJT05fQklOREVSKTsKLQotICAgICAgICAvLyBTYW5pdHkgY2hlY2suCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBUWVBFX1NFU1NJT046Ci0gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25CaW5kZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmV4cGVjdGVkIHNlc3Npb25CaW5kZXIgZm9yIHNlc3Npb24sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBiaW5kZXI9IiArIHNlc3Npb25CaW5kZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVFlQRV9TRVNTSU9OX1NFUlZJQ0U6Ci0gICAgICAgICAgICBjYXNlIFRZUEVfTElCUkFSWV9TRVJWSUNFOgotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzZXJ2aWNlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2Vzc2lvbiBzZXJ2aWNlIG5lZWRzIHNlcnZpY2UgbmFtZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCB0eXBlIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBhY2thZ2VOYW1lKSB8fCBpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYWNrYWdlIG5hbWUgbm9yIElEIGNhbm5vdCBiZSBudWxsLiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgU2Vzc2lvblRva2VuMkltcGwodWlkLCB0eXBlLCBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUsIGlkLAotICAgICAgICAgICAgICAgIHNlc3Npb25CaW5kZXIgIT0gbnVsbCA/IElNZWRpYVNlc3Npb24yLlN0dWIuYXNJbnRlcmZhY2Uoc2Vzc2lvbkJpbmRlcikgOiBudWxsKQotICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKLSAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgYnVuZGxlLnB1dEludChLRVlfVUlELCBtVWlkKTsKLSAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfUEFDS0FHRV9OQU1FLCBtUGFja2FnZU5hbWUpOwotICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9TRVJWSUNFX05BTUUsIG1TZXJ2aWNlTmFtZSk7Ci0gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX0lELCBtSWQpOwotICAgICAgICBidW5kbGUucHV0SW50KEtFWV9UWVBFLCBtVHlwZSk7Ci0gICAgICAgIGJ1bmRsZS5wdXRCaW5kZXIoS0VZX1NFU1NJT05fQklOREVSLAotICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyICE9IG51bGwgPyBtU2Vzc2lvbkJpbmRlci5hc0JpbmRlcigpIDogbnVsbCk7Ci0gICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgewotICAgICAgICBmaW5hbCBpbnQgcHJpbWUgPSAzMTsKLSAgICAgICAgcmV0dXJuIG1UeXBlCi0gICAgICAgICAgICAgICAgKyBwcmltZSAqIChtVWlkCi0gICAgICAgICAgICAgICAgKyBwcmltZSAqIChtUGFja2FnZU5hbWUuaGFzaENvZGUoKQotICAgICAgICAgICAgICAgICsgcHJpbWUgKiAobUlkLmhhc2hDb2RlKCkKLSAgICAgICAgICAgICAgICArIHByaW1lICogKG1TZXJ2aWNlTmFtZSAhPSBudWxsID8gbVNlcnZpY2VOYW1lLmhhc2hDb2RlKCkgOiAwKSkpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNfaW1wbChPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFNlc3Npb25Ub2tlbjIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgU2Vzc2lvblRva2VuMkltcGwgb3RoZXIgPSBmcm9tKChTZXNzaW9uVG9rZW4yKSBvYmopOwotICAgICAgICByZXR1cm4gbVVpZCA9PSBvdGhlci5tVWlkCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmVxdWFscyhtUGFja2FnZU5hbWUsIG90aGVyLm1QYWNrYWdlTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuZXF1YWxzKG1TZXJ2aWNlTmFtZSwgb3RoZXIubVNlcnZpY2VOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5lcXVhbHMobUlkLCBvdGhlci5tSWQpCi0gICAgICAgICAgICAgICAgJiYgbVR5cGUgPT0gb3RoZXIubVR5cGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZ19pbXBsKCkgewotICAgICAgICByZXR1cm4gIlNlc3Npb25Ub2tlbiB7cGtnPSIgKyBtUGFja2FnZU5hbWUgKyAiIGlkPSIgKyBtSWQgKyAiIHR5cGU9IiArIG1UeXBlCi0gICAgICAgICAgICAgICAgKyAiIHNlcnZpY2U9IiArIG1TZXJ2aWNlTmFtZSArICIgYmluZGVyPSIgKyBtU2Vzc2lvbkJpbmRlciArICJ9IjsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU2Vzc2lvblRva2VuMkltcGwgZnJvbShTZXNzaW9uVG9rZW4yIHRva2VuKSB7Ci0gICAgICAgIHJldHVybiAoKFNlc3Npb25Ub2tlbjJJbXBsKSB0b2tlbi5nZXRQcm92aWRlcigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1ZvbHVtZVByb3ZpZGVyMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvVm9sdW1lUHJvdmlkZXIySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjIyZTFiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvVm9sdW1lUHJvdmlkZXIySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfQUJTT0xVVEU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyLlZPTFVNRV9DT05UUk9MX0ZJWEVEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMi5WT0xVTUVfQ09OVFJPTF9SRUxBVElWRTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZvbHVtZVByb3ZpZGVyMlByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgVm9sdW1lUHJvdmlkZXIySW1wbCBpbXBsZW1lbnRzIFZvbHVtZVByb3ZpZGVyMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIFZvbHVtZVByb3ZpZGVyMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUNvbnRyb2xUeXBlOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1NYXhWb2x1bWU7Ci0KLSAgICBwcml2YXRlIGludCBtQ3VycmVudFZvbHVtZTsKLSAgICBwcml2YXRlIENhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHB1YmxpYyBWb2x1bWVQcm92aWRlcjJJbXBsKFZvbHVtZVByb3ZpZGVyMiBpbnN0YW5jZSwKLSAgICAgICAgICAgIEBWb2x1bWVQcm92aWRlcjIuQ29udHJvbFR5cGUgaW50IGNvbnRyb2xUeXBlLCBpbnQgbWF4Vm9sdW1lLCBpbnQgY3VycmVudFZvbHVtZSkgewotICAgICAgICBpZiAoY29udHJvbFR5cGUgIT0gVk9MVU1FX0NPTlRST0xfRklYRUQgJiYgY29udHJvbFR5cGUgIT0gVk9MVU1FX0NPTlRST0xfUkVMQVRJVkUKLSAgICAgICAgICAgICAgICAmJiBjb250cm9sVHlwZSAhPSBWT0xVTUVfQ09OVFJPTF9BQlNPTFVURSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigid3JvbmcgY29udHJvbFR5cGUgIiArIGNvbnRyb2xUeXBlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWF4Vm9sdW1lIDwgMCB8fCBjdXJyZW50Vm9sdW1lIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidm9sdW1lIHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBtYXhWb2x1bWU9IiArIG1heFZvbHVtZSArICIsIGN1cnJlbnRWb2x1bWU9IiArIGN1cnJlbnRWb2x1bWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjdXJyZW50Vm9sdW1lID4gbWF4Vm9sdW1lKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjdXJyZW50Vm9sdW1lIHNob3VsZG4ndCBiZSBncmVhdGVyIHRoYW4gbWF4Vm9sdW1lIgotICAgICAgICAgICAgICAgICAgICArICIsIG1heFZvbHVtZT0iICsgbWF4Vm9sdW1lICsgIiwgY3VycmVudFZvbHVtZT0iICsgY3VycmVudFZvbHVtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgIG1Db250cm9sVHlwZSA9IGNvbnRyb2xUeXBlOwotICAgICAgICBtTWF4Vm9sdW1lID0gbWF4Vm9sdW1lOwotICAgICAgICBtQ3VycmVudFZvbHVtZSA9IGN1cnJlbnRWb2x1bWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRDb250cm9sVHlwZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUNvbnRyb2xUeXBlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0TWF4Vm9sdW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtTWF4Vm9sdW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudFZvbHVtZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUN1cnJlbnRWb2x1bWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFZvbHVtZV9pbXBsKGludCBjdXJyZW50Vm9sdW1lKSB7Ci0gICAgICAgIGlmIChjdXJyZW50Vm9sdW1lIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY3VycmVudFZvbHVtZSBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiCi0gICAgICAgICAgICAgICAgICAgICsgIiwgY3VycmVudFZvbHVtZT0iICsgY3VycmVudFZvbHVtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRWb2x1bWUgPSBjdXJyZW50Vm9sdW1lOwotICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblZvbHVtZUNoYW5nZWQobUluc3RhbmNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjYWxsYmFjayB0byByZWNlaXZlIHZvbHVtZSBjaGFuZ2VzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExpc3RlbnMgZm9yIGNoYW5nZXMgdG8gdGhlIHZvbHVtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIENhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgb25Wb2x1bWVDaGFuZ2VkKFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9DbG9zZWRDYXB0aW9uUmVuZGVyZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvQ2xvc2VkQ2FwdGlvblJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmN2VlYzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9DbG9zZWRDYXB0aW9uUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlN0eWxlU3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVW5kZXJsaW5lU3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVXBkYXRlQXBwZWFyYW5jZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlci5DYXB0aW9uU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQ2FwdGlvbmluZ01hbmFnZXIuQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vLyBOb3RlOiBUaGlzIGlzIGZvcmtlZCBmcm9tIGFuZHJvaWQubWVkaWEuQ2xvc2VkQ2FwdGlvblJlbmRlcmVyIHNpbmNlIFAKLXB1YmxpYyBjbGFzcyBDbG9zZWRDYXB0aW9uUmVuZGVyZXIgZXh0ZW5kcyBTdWJ0aXRsZUNvbnRyb2xsZXIuUmVuZGVyZXIgewotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIENlYTYwOENDV2lkZ2V0IG1DQ1dpZGdldDsKLQotICAgIHB1YmxpYyBDbG9zZWRDYXB0aW9uUmVuZGVyZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgaWYgKGZvcm1hdC5jb250YWluc0tleShNZWRpYUZvcm1hdC5LRVlfTUlNRSkpIHsKLSAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IGZvcm1hdC5nZXRTdHJpbmcoTWVkaWFGb3JtYXQuS0VZX01JTUUpOwotICAgICAgICAgICAgcmV0dXJuIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1RFWFRfQ0VBXzYwOC5lcXVhbHMobWltZVR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3VidGl0bGVUcmFjayBjcmVhdGVUcmFjayhNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSk7Ci0gICAgICAgIGlmIChNZWRpYUZvcm1hdC5NSU1FVFlQRV9URVhUX0NFQV82MDguZXF1YWxzKG1pbWVUeXBlKSkgewotICAgICAgICAgICAgaWYgKG1DQ1dpZGdldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNDV2lkZ2V0ID0gbmV3IENlYTYwOENDV2lkZ2V0KG1Db250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ2VhNjA4Q2FwdGlvblRyYWNrKG1DQ1dpZGdldCwgZm9ybWF0KTsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gbWF0Y2hpbmcgZm9ybWF0OiAiICsgZm9ybWF0LnRvU3RyaW5nKCkpOwotICAgIH0KLX0KLQotY2xhc3MgQ2VhNjA4Q2FwdGlvblRyYWNrIGV4dGVuZHMgU3VidGl0bGVUcmFjayB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDZWE2MDhDQ1BhcnNlciBtQ0NQYXJzZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDZWE2MDhDQ1dpZGdldCBtUmVuZGVyaW5nV2lkZ2V0OwotCi0gICAgQ2VhNjA4Q2FwdGlvblRyYWNrKENlYTYwOENDV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCwgTWVkaWFGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIHN1cGVyKGZvcm1hdCk7Ci0KLSAgICAgICAgbVJlbmRlcmluZ1dpZGdldCA9IHJlbmRlcmluZ1dpZGdldDsKLSAgICAgICAgbUNDUGFyc2VyID0gbmV3IENlYTYwOENDUGFyc2VyKG1SZW5kZXJpbmdXaWRnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGF0YShieXRlW10gZGF0YSwgYm9vbGVhbiBlb3MsIGxvbmcgcnVuSUQpIHsKLSAgICAgICAgbUNDUGFyc2VyLnBhcnNlKGRhdGEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZW5kZXJpbmdXaWRnZXQgZ2V0UmVuZGVyaW5nV2lkZ2V0KCkgewotICAgICAgICByZXR1cm4gbVJlbmRlcmluZ1dpZGdldDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVWaWV3KFZlY3RvcjxDdWU+IGFjdGl2ZUN1ZXMpIHsKLSAgICAgICAgLy8gT3ZlcnJpZGluZyB3aXRoIE5PLU9QLCBDQyByZW5kZXJpbmcgYnktcGFzc2VzIHRoaXMKLSAgICB9Ci19Ci0KLS8qKgotICogQWJzdHJhY3Qgd2lkZ2V0IGNsYXNzIHRvIHJlbmRlciBhIGNsb3NlZCBjYXB0aW9uIHRyYWNrLgotICovCi1hYnN0cmFjdCBjbGFzcyBDbG9zZWRDYXB0aW9uV2lkZ2V0IGV4dGVuZHMgVmlld0dyb3VwIGltcGxlbWVudHMgU3VidGl0bGVUcmFjay5SZW5kZXJpbmdXaWRnZXQgewotCi0gICAgaW50ZXJmYWNlIENsb3NlZENhcHRpb25MYXlvdXQgewotICAgICAgICB2b2lkIHNldENhcHRpb25TdHlsZShDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlKTsKLSAgICAgICAgdm9pZCBzZXRGb250U2NhbGUoZmxvYXQgc2NhbGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENhcHRpb25TdHlsZSBERUZBVUxUX0NBUFRJT05fU1RZTEUgPSBDYXB0aW9uU3R5bGUuREVGQVVMVDsKLQotICAgIC8qKiBDYXB0aW9uaW5nIG1hbmFnZXIsIHVzZWQgdG8gb2J0YWluIGFuZCB0cmFjayBjYXB0aW9uIHByb3BlcnRpZXMuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBDYXB0aW9uaW5nTWFuYWdlciBtTWFuYWdlcjsKLQotICAgIC8qKiBDdXJyZW50IGNhcHRpb24gc3R5bGUuICovCi0gICAgcHJvdGVjdGVkIENhcHRpb25TdHlsZSBtQ2FwdGlvblN0eWxlOwotCi0gICAgLyoqIENhbGxiYWNrIGZvciByZW5kZXJpbmcgY2hhbmdlcy4gKi8KLSAgICBwcm90ZWN0ZWQgT25DaGFuZ2VkTGlzdGVuZXIgbUxpc3RlbmVyOwotCi0gICAgLyoqIENvbmNyZXRlIGxheW91dCBvZiBDQy4gKi8KLSAgICBwcm90ZWN0ZWQgQ2xvc2VkQ2FwdGlvbkxheW91dCBtQ2xvc2VkQ2FwdGlvbkxheW91dDsKLQotICAgIC8qKiBXaGV0aGVyIGEgY2FwdGlvbiBzdHlsZSBjaGFuZ2UgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZC4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbUhhc0NoYW5nZUxpc3RlbmVyOwotCi0gICAgcHVibGljIENsb3NlZENhcHRpb25XaWRnZXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIENsb3NlZENhcHRpb25XaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIENsb3NlZENhcHRpb25XaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIENsb3NlZENhcHRpb25XaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsCi0gICAgICAgICAgICBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwotCi0gICAgICAgIC8vIENhbm5vdCByZW5kZXIgdGV4dCBvdmVyIHZpZGVvIHdoZW4gbGF5ZXIgdHlwZSBpcyBoYXJkd2FyZS4KLSAgICAgICAgc2V0TGF5ZXJUeXBlKFZpZXcuTEFZRVJfVFlQRV9TT0ZUV0FSRSwgbnVsbCk7Ci0KLSAgICAgICAgbU1hbmFnZXIgPSAoQ2FwdGlvbmluZ01hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNBUFRJT05JTkdfU0VSVklDRSk7Ci0gICAgICAgIG1DYXB0aW9uU3R5bGUgPSBERUZBVUxUX0NBUFRJT05fU1RZTEUuYXBwbHlTdHlsZShtTWFuYWdlci5nZXRVc2VyU3R5bGUoKSk7Ci0KLSAgICAgICAgbUNsb3NlZENhcHRpb25MYXlvdXQgPSBjcmVhdGVDYXB0aW9uTGF5b3V0KGNvbnRleHQpOwotICAgICAgICBtQ2xvc2VkQ2FwdGlvbkxheW91dC5zZXRDYXB0aW9uU3R5bGUobUNhcHRpb25TdHlsZSk7Ci0gICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0LnNldEZvbnRTY2FsZShtTWFuYWdlci5nZXRGb250U2NhbGUoKSk7Ci0gICAgICAgIGFkZFZpZXcoKFZpZXdHcm91cCkgbUNsb3NlZENhcHRpb25MYXlvdXQsIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCi0gICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7Ci0KLSAgICAgICAgcmVxdWVzdExheW91dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBDbG9zZWRDYXB0aW9uTGF5b3V0IGNyZWF0ZUNhcHRpb25MYXlvdXQoQ29udGV4dCBjb250ZXh0KTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE9uQ2hhbmdlZExpc3RlbmVyKE9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGZpbmFsIGludCB3aWR0aFNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMod2lkdGgsIE1lYXN1cmVTcGVjLkVYQUNUTFkpOwotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0U3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhoZWlnaHQsIE1lYXN1cmVTcGVjLkVYQUNUTFkpOwotCi0gICAgICAgIG1lYXN1cmUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKLSAgICAgICAgbGF5b3V0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICBzZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtYW5hZ2VDaGFuZ2VMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7Ci0KLSAgICAgICAgbWFuYWdlQ2hhbmdlTGlzdGVuZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLQotICAgICAgICBtYW5hZ2VDaGFuZ2VMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIHN1cGVyLm9uTWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgICAgICgoVmlld0dyb3VwKSBtQ2xvc2VkQ2FwdGlvbkxheW91dCkubWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgewotICAgICAgICAoKFZpZXdHcm91cCkgbUNsb3NlZENhcHRpb25MYXlvdXQpLmxheW91dChsLCB0LCByLCBiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW5hZ2VzIHdoZXRoZXIgdGhpcyByZW5kZXJlciBpcyBsaXN0ZW5pbmcgZm9yIGNhcHRpb24gc3R5bGUgY2hhbmdlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIENhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lciBtQ2FwdGlvbmluZ0xpc3RlbmVyID0gbmV3IENhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVXNlclN0eWxlQ2hhbmdlZChDYXB0aW9uU3R5bGUgdXNlclN0eWxlKSB7Ci0gICAgICAgICAgICBtQ2FwdGlvblN0eWxlID0gREVGQVVMVF9DQVBUSU9OX1NUWUxFLmFwcGx5U3R5bGUodXNlclN0eWxlKTsKLSAgICAgICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0LnNldENhcHRpb25TdHlsZShtQ2FwdGlvblN0eWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkZvbnRTY2FsZUNoYW5nZWQoZmxvYXQgZm9udFNjYWxlKSB7Ci0gICAgICAgICAgICBtQ2xvc2VkQ2FwdGlvbkxheW91dC5zZXRGb250U2NhbGUoZm9udFNjYWxlKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHZvaWQgbWFuYWdlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gbmVlZHNMaXN0ZW5lciA9IGlzQXR0YWNoZWRUb1dpbmRvdygpICYmIGdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEU7Ci0gICAgICAgIGlmIChtSGFzQ2hhbmdlTGlzdGVuZXIgIT0gbmVlZHNMaXN0ZW5lcikgewotICAgICAgICAgICAgbUhhc0NoYW5nZUxpc3RlbmVyID0gbmVlZHNMaXN0ZW5lcjsKLQotICAgICAgICAgICAgaWYgKG5lZWRzTGlzdGVuZXIpIHsKLSAgICAgICAgICAgICAgICBtTWFuYWdlci5hZGRDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIobUNhcHRpb25pbmdMaXN0ZW5lcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcihtQ2FwdGlvbmluZ0xpc3RlbmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqCi0gKiBDQ1BhcnNlciBwcm9jZXNzZXMgQ0VBLTYwOCBjbG9zZWQgY2FwdGlvbiBkYXRhLgotICoKLSAqIEl0IGNhbGxzIGJhY2sgaW50byBPbkRpc3BsYXlDaGFuZ2VkTGlzdGVuZXIgdXBvbgotICogZGlzcGxheSBjaGFuZ2Ugd2l0aCBzdHlsZWQgdGV4dCBmb3IgcmVuZGVyaW5nLgotICoKLSAqLwotY2xhc3MgQ2VhNjA4Q0NQYXJzZXIgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9ST1dTID0gMTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NPTFMgPSAzMjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ2VhNjA4Q0NQYXJzZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRCA9IC0xOwotCi0gICAgLy8gRUlBLUNFQS02MDg6IFRhYmxlIDcwIC0gQ29udHJvbCBDb2RlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSQ0wgPSAweDIwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCUyAgPSAweDIxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBT0YgPSAweDIyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBT04gPSAweDIzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVIgPSAweDI0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVTIgPSAweDI1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVTMgPSAweDI2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVTQgPSAweDI3OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGT04gPSAweDI4OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSREMgPSAweDI5OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUiAgPSAweDJhOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVEQgPSAweDJiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFRE0gPSAweDJjOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDUiAgPSAweDJkOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTk0gPSAweDJlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFT0MgPSAweDJmOwotCi0gICAgLy8gVHJhbnNwYXJlbnQgU3BhY2UKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFRTID0gJ1x1MDBBMCc7Ci0KLSAgICAvLyBDYXB0aW9uaW5nIE1vZGVzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfVU5LTk9XTiA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfUEFJTlRfT04gPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX1JPTExfVVAgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX1BPUF9PTiA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfVEVYVCA9IDQ7Ci0KLSAgICBwcml2YXRlIGZpbmFsIERpc3BsYXlMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIGludCBtTW9kZSA9IE1PREVfUEFJTlRfT047Ci0gICAgcHJpdmF0ZSBpbnQgbVJvbGxVcFNpemUgPSA0OwotICAgIHByaXZhdGUgaW50IG1QcmV2Q3RybENvZGUgPSBJTlZBTElEOwotCi0gICAgcHJpdmF0ZSBDQ01lbW9yeSBtRGlzcGxheSA9IG5ldyBDQ01lbW9yeSgpOwotICAgIHByaXZhdGUgQ0NNZW1vcnkgbU5vbkRpc3BsYXkgPSBuZXcgQ0NNZW1vcnkoKTsKLSAgICBwcml2YXRlIENDTWVtb3J5IG1UZXh0TWVtID0gbmV3IENDTWVtb3J5KCk7Ci0KLSAgICBDZWE2MDhDQ1BhcnNlcihEaXNwbGF5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFyc2UoYnl0ZVtdIGRhdGEpIHsKLSAgICAgICAgQ0NEYXRhW10gY2NEYXRhID0gQ0NEYXRhLmZyb21CeXRlQXJyYXkoZGF0YSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjY0RhdGEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2NEYXRhW2ldLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaGFuZGxlQ3RybENvZGUoY2NEYXRhW2ldKQotICAgICAgICAgICAgICAgICAgICB8fCBoYW5kbGVUYWJPZmZzZXRzKGNjRGF0YVtpXSkKLSAgICAgICAgICAgICAgICAgICAgfHwgaGFuZGxlUEFDQ29kZShjY0RhdGFbaV0pCi0gICAgICAgICAgICAgICAgICAgIHx8IGhhbmRsZU1pZFJvd0NvZGUoY2NEYXRhW2ldKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoYW5kbGVEaXNwbGF5YWJsZUNoYXJzKGNjRGF0YVtpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnRlcmZhY2UgRGlzcGxheUxpc3RlbmVyIHsKLSAgICAgICAgdm9pZCBvbkRpc3BsYXlDaGFuZ2VkKFNwYW5uYWJsZVN0cmluZ0J1aWxkZXJbXSBzdHlsZWRUZXh0cyk7Ci0gICAgICAgIENhcHRpb25TdHlsZSBnZXRDYXB0aW9uU3R5bGUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENDTWVtb3J5IGdldE1lbW9yeSgpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBDQyBtZW1vcnkgdG8gb3BlcmF0ZSBvbiBmb3IgY3VycmVudCBtb2RlCi0gICAgICAgIHN3aXRjaCAobU1vZGUpIHsKLSAgICAgICAgY2FzZSBNT0RFX1BPUF9PTjoKLSAgICAgICAgICAgIHJldHVybiBtTm9uRGlzcGxheTsKLSAgICAgICAgY2FzZSBNT0RFX1RFWFQ6Ci0gICAgICAgICAgICAvLyBUT0RPKGNoeik6IHN1cHBvcnQgb25seSBjYXB0aW9uIG1vZGUgZm9yIG5vdywKLSAgICAgICAgICAgIC8vIGluIHRleHQgbW9kZSwgZHVtcCBldmVyeXRoaW5nIHRvIHRleHQgbWVtLgotICAgICAgICAgICAgcmV0dXJuIG1UZXh0TWVtOwotICAgICAgICBjYXNlIE1PREVfUEFJTlRfT046Ci0gICAgICAgIGNhc2UgTU9ERV9ST0xMX1VQOgotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5OwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTG9nLncoVEFHLCAidW5yZWNvZ2luaXplZCBtb2RlOiAiICsgbU1vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRGlzcGxheTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlRGlzcGxheWFibGVDaGFycyhDQ0RhdGEgY2NEYXRhKSB7Ci0gICAgICAgIGlmICghY2NEYXRhLmlzRGlzcGxheWFibGVDaGFyKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEV4dGVuZGVkIGNoYXIgaW5jbHVkZXMgMSBhdXRvbWF0aWMgYmFja3NwYWNlCi0gICAgICAgIGlmIChjY0RhdGEuaXNFeHRlbmRlZENoYXIoKSkgewotICAgICAgICAgICAgZ2V0TWVtb3J5KCkuYnMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGdldE1lbW9yeSgpLndyaXRlVGV4dChjY0RhdGEuZ2V0RGlzcGxheVRleHQoKSk7Ci0KLSAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfUEFJTlRfT04gfHwgbU1vZGUgPT0gTU9ERV9ST0xMX1VQKSB7Ci0gICAgICAgICAgICB1cGRhdGVEaXNwbGF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlTWlkUm93Q29kZShDQ0RhdGEgY2NEYXRhKSB7Ci0gICAgICAgIFN0eWxlQ29kZSBtID0gY2NEYXRhLmdldE1pZFJvdygpOwotICAgICAgICBpZiAobSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS53cml0ZU1pZFJvd0NvZGUobSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZVBBQ0NvZGUoQ0NEYXRhIGNjRGF0YSkgewotICAgICAgICBQQUMgcGFjID0gY2NEYXRhLmdldFBBQygpOwotCi0gICAgICAgIGlmIChwYWMgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfUk9MTF9VUCkgewotICAgICAgICAgICAgICAgIGdldE1lbW9yeSgpLm1vdmVCYXNlbGluZVRvKHBhYy5nZXRSb3coKSwgbVJvbGxVcFNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0TWVtb3J5KCkud3JpdGVQQUMocGFjKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVUYWJPZmZzZXRzKENDRGF0YSBjY0RhdGEpIHsKLSAgICAgICAgaW50IHRhYnMgPSBjY0RhdGEuZ2V0VGFiT2Zmc2V0KCk7Ci0KLSAgICAgICAgaWYgKHRhYnMgPiAwKSB7Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS50YWIodGFicyk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlQ3RybENvZGUoQ0NEYXRhIGNjRGF0YSkgewotICAgICAgICBpbnQgY3RybENvZGUgPSBjY0RhdGEuZ2V0Q3RybENvZGUoKTsKLQotICAgICAgICBpZiAobVByZXZDdHJsQ29kZSAhPSBJTlZBTElEICYmIG1QcmV2Q3RybENvZGUgPT0gY3RybENvZGUpIHsKLSAgICAgICAgICAgIC8vIGRpc2NhcmQgZG91YmxlIGN0cmwgY29kZXMgKGJ1dCBpZiB0aGVyZSdzIGEgM3JkIG9uZSwgd2Ugc3RpbGwgdGFrZSB0aGF0KQotICAgICAgICAgICAgbVByZXZDdHJsQ29kZSA9IElOVkFMSUQ7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaChjdHJsQ29kZSkgewotICAgICAgICBjYXNlIFJDTDoKLSAgICAgICAgICAgIC8vIHNlbGVjdCBwb3Atb24gc3R5bGUKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9QT1BfT047Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCUzoKLSAgICAgICAgICAgIGdldE1lbW9yeSgpLmJzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBERVI6Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS5kZXIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJVMjoKLSAgICAgICAgY2FzZSBSVTM6Ci0gICAgICAgIGNhc2UgUlU0OgotICAgICAgICAgICAgbVJvbGxVcFNpemUgPSAoY3RybENvZGUgLSAweDIzKTsKLSAgICAgICAgICAgIC8vIGVyYXNlIG1lbW9yeSBpZiBjdXJyZW50bHkgaW4gb3RoZXIgc3R5bGUKLSAgICAgICAgICAgIGlmIChtTW9kZSAhPSBNT0RFX1JPTExfVVApIHsKLSAgICAgICAgICAgICAgICBtRGlzcGxheS5lcmFzZSgpOwotICAgICAgICAgICAgICAgIG1Ob25EaXNwbGF5LmVyYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBzZWxlY3Qgcm9sbC11cCBzdHlsZQotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1JPTExfVVA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGT046Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJGbGFzaCBPbiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkRDOgotICAgICAgICAgICAgLy8gc2VsZWN0IHBhaW50LW9uIHN0eWxlCi0gICAgICAgICAgICBtTW9kZSA9IE1PREVfUEFJTlRfT047Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUUjoKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9URVhUOwotICAgICAgICAgICAgbVRleHRNZW0uZXJhc2UoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJURDoKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9URVhUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRURNOgotICAgICAgICAgICAgLy8gZXJhc2UgZGlzcGxheSBtZW1vcnkKLSAgICAgICAgICAgIG1EaXNwbGF5LmVyYXNlKCk7Ci0gICAgICAgICAgICB1cGRhdGVEaXNwbGF5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDUjoKLSAgICAgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX1JPTExfVVApIHsKLSAgICAgICAgICAgICAgICBnZXRNZW1vcnkoKS5yb2xsVXAobVJvbGxVcFNpemUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBnZXRNZW1vcnkoKS5jcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfUk9MTF9VUCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZURpc3BsYXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVOTToKLSAgICAgICAgICAgIC8vIGVyYXNlIG5vbi1kaXNwbGF5IG1lbW9yeQotICAgICAgICAgICAgbU5vbkRpc3BsYXkuZXJhc2UoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVPQzoKLSAgICAgICAgICAgIC8vIHN3YXAgZGlzcGxheS9ub24tZGlzcGxheSBtZW1vcnkKLSAgICAgICAgICAgIHN3YXBNZW1vcnkoKTsKLSAgICAgICAgICAgIC8vIHN3aXRjaCB0byBwb3Atb24gc3R5bGUKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9QT1BfT047Ci0gICAgICAgICAgICB1cGRhdGVEaXNwbGF5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJTlZBTElEOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgbVByZXZDdHJsQ29kZSA9IElOVkFMSUQ7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBtUHJldkN0cmxDb2RlID0gY3RybENvZGU7Ci0KLSAgICAgICAgLy8gaGFuZGxlZAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlRGlzcGxheSgpIHsKLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlID0gbUxpc3RlbmVyLmdldENhcHRpb25TdHlsZSgpOwotICAgICAgICAgICAgbUxpc3RlbmVyLm9uRGlzcGxheUNoYW5nZWQobURpc3BsYXkuZ2V0U3R5bGVkVGV4dChjYXB0aW9uU3R5bGUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzd2FwTWVtb3J5KCkgewotICAgICAgICBDQ01lbW9yeSB0ZW1wID0gbURpc3BsYXk7Ci0gICAgICAgIG1EaXNwbGF5ID0gbU5vbkRpc3BsYXk7Ci0gICAgICAgIG1Ob25EaXNwbGF5ID0gdGVtcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHlsZUNvZGUgewotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX1dISVRFID0gMDsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9HUkVFTiA9IDE7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfQkxVRSA9IDI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfQ1lBTiA9IDM7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfUkVEID0gNDsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9ZRUxMT1cgPSA1OwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX01BR0VOVEEgPSA2OwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX0lOVkFMSUQgPSA3OwotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfSVRBTElDUyAgID0gMHgwMDAwMDAwMTsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBTVFlMRV9VTkRFUkxJTkUgPSAweDAwMDAwMDAyOwotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtQ29sb3JNYXAgPSB7Ci0gICAgICAgICAgICAiV0hJVEUiLCAiR1JFRU4iLCAiQkxVRSIsICJDWUFOIiwgIlJFRCIsICJZRUxMT1ciLCAiTUFHRU5UQSIsICJJTlZBTElEIgotICAgICAgICB9OwotCi0gICAgICAgIGZpbmFsIGludCBtU3R5bGU7Ci0gICAgICAgIGZpbmFsIGludCBtQ29sb3I7Ci0KLSAgICAgICAgc3RhdGljIFN0eWxlQ29kZSBmcm9tQnl0ZShieXRlIGRhdGEyKSB7Ci0gICAgICAgICAgICBpbnQgc3R5bGUgPSAwOwotICAgICAgICAgICAgaW50IGNvbG9yID0gKGRhdGEyID4+IDEpICYgMHg3OwotCi0gICAgICAgICAgICBpZiAoKGRhdGEyICYgMHgxKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGUgfD0gU1RZTEVfVU5ERVJMSU5FOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY29sb3IgPT0gQ09MT1JfSU5WQUxJRCkgewotICAgICAgICAgICAgICAgIC8vIFdISVRFIElUQUxJQ1MKLSAgICAgICAgICAgICAgICBjb2xvciA9IENPTE9SX1dISVRFOwotICAgICAgICAgICAgICAgIHN0eWxlIHw9IFNUWUxFX0lUQUxJQ1M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU3R5bGVDb2RlKHN0eWxlLCBjb2xvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHlsZUNvZGUoaW50IHN0eWxlLCBpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIG1TdHlsZSA9IHN0eWxlOwotICAgICAgICAgICAgbUNvbG9yID0gY29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzSXRhbGljcygpIHsKLSAgICAgICAgICAgIHJldHVybiAobVN0eWxlICYgU1RZTEVfSVRBTElDUykgIT0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNVbmRlcmxpbmUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1TdHlsZSAmIFNUWUxFX1VOREVSTElORSkgIT0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRDb2xvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc3RyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIHN0ci5hcHBlbmQoInsiKTsKLSAgICAgICAgICAgIHN0ci5hcHBlbmQobUNvbG9yTWFwW21Db2xvcl0pOwotICAgICAgICAgICAgaWYgKChtU3R5bGUgJiBTVFlMRV9JVEFMSUNTKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3RyLmFwcGVuZCgiLCBJVEFMSUNTIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG1TdHlsZSAmIFNUWUxFX1VOREVSTElORSkgIT0gMCkgewotICAgICAgICAgICAgICAgIHN0ci5hcHBlbmQoIiwgVU5ERVJMSU5FIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHIuYXBwZW5kKCJ9Iik7Ci0KLSAgICAgICAgICAgIHJldHVybiBzdHIudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBBQyBleHRlbmRzIFN0eWxlQ29kZSB7Ci0gICAgICAgIGZpbmFsIGludCBtUm93OwotICAgICAgICBmaW5hbCBpbnQgbUNvbDsKLQotICAgICAgICBzdGF0aWMgUEFDIGZyb21CeXRlcyhieXRlIGRhdGExLCBieXRlIGRhdGEyKSB7Ci0gICAgICAgICAgICBpbnRbXSByb3dUYWJsZSA9IHsxMSwgMSwgMywgMTIsIDE0LCA1LCA3LCA5fTsKLSAgICAgICAgICAgIGludCByb3cgPSByb3dUYWJsZVtkYXRhMSAmIDB4MDddICsgKChkYXRhMiAmIDB4MjApID4+IDUpOwotICAgICAgICAgICAgaW50IHN0eWxlID0gMDsKLSAgICAgICAgICAgIGlmICgoZGF0YTIgJiAxKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGUgfD0gU1RZTEVfVU5ERVJMSU5FOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChkYXRhMiAmIDB4MTApICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBpbmRlbnQgY29kZQotICAgICAgICAgICAgICAgIGludCBpbmRlbnQgPSAoZGF0YTIgPj4gMSkgJiAweDc7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQQUMocm93LCBpbmRlbnQgKiA0LCBzdHlsZSwgQ09MT1JfV0hJVEUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBzdHlsZSBjb2RlCi0gICAgICAgICAgICAgICAgaW50IGNvbG9yID0gKGRhdGEyID4+IDEpICYgMHg3OwotCi0gICAgICAgICAgICAgICAgaWYgKGNvbG9yID09IENPTE9SX0lOVkFMSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV0hJVEUgSVRBTElDUwotICAgICAgICAgICAgICAgICAgICBjb2xvciA9IENPTE9SX1dISVRFOwotICAgICAgICAgICAgICAgICAgICBzdHlsZSB8PSBTVFlMRV9JVEFMSUNTOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBBQyhyb3csIC0xLCBzdHlsZSwgY29sb3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgUEFDKGludCByb3csIGludCBjb2wsIGludCBzdHlsZSwgaW50IGNvbG9yKSB7Ci0gICAgICAgICAgICBzdXBlcihzdHlsZSwgY29sb3IpOwotICAgICAgICAgICAgbVJvdyA9IHJvdzsKLSAgICAgICAgICAgIG1Db2wgPSBjb2w7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzSW5kZW50UEFDKCkgewotICAgICAgICAgICAgcmV0dXJuIChtQ29sID49IDApOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldFJvdygpIHsKLSAgICAgICAgICAgIHJldHVybiBtUm93OwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldENvbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29sOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgieyVkLCAlZH0sICVzIiwKLSAgICAgICAgICAgICAgICAgICAgbVJvdywgbUNvbCwgc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNdXRhYmxlIHZlcnNpb24gb2YgQmFja2dyb3VuZFNwYW4gdG8gZmFjaWxpdGF0ZSB0ZXh0IHJlbmRlcmluZyB3aXRoIGVkZ2Ugc3R5bGVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXV0YWJsZUJhY2tncm91bmRDb2xvclNwYW4gZXh0ZW5kcyBDaGFyYWN0ZXJTdHlsZQotICAgICAgICAgICAgaW1wbGVtZW50cyBVcGRhdGVBcHBlYXJhbmNlIHsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbG9yOwotCi0gICAgICAgIHB1YmxpYyBNdXRhYmxlQmFja2dyb3VuZENvbG9yU3BhbihpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIG1Db2xvciA9IGNvbG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKGludCBjb2xvcikgewotICAgICAgICAgICAgbUNvbG9yID0gY29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldEJhY2tncm91bmRDb2xvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlRHJhd1N0YXRlKFRleHRQYWludCBkcykgewotICAgICAgICAgICAgZHMuYmdDb2xvciA9IG1Db2xvcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENDTGluZUJ1aWxkZXIga2VlcHMgdHJhY2sgb2YgZGlzcGxheWFibGUgY2hhcnMsIGFzIHdlbGwgYXMKLSAgICAgKiBNaWRSb3cgc3R5bGVzIGFuZCBQQUNzLCBmb3IgYSBzaW5nbGUgbGluZSBvZiBDQyBtZW1vcnkuCi0gICAgICoKLSAgICAgKiBJdCBnZW5lcmF0ZXMgc3R5bGVkIHRleHQgdmlhIGdldFN0eWxlZFRleHQoKSBtZXRob2QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0NMaW5lQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVpbGRlciBtRGlzcGxheUNoYXJzOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0eWxlQ29kZVtdIG1NaWRSb3dTdHlsZXM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3R5bGVDb2RlW10gbVBBQ1N0eWxlczsKLQotICAgICAgICBDQ0xpbmVCdWlsZGVyKFN0cmluZyBzdHIpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5Q2hhcnMgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHIpOwotICAgICAgICAgICAgbU1pZFJvd1N0eWxlcyA9IG5ldyBTdHlsZUNvZGVbbURpc3BsYXlDaGFycy5sZW5ndGgoKV07Ci0gICAgICAgICAgICBtUEFDU3R5bGVzID0gbmV3IFN0eWxlQ29kZVttRGlzcGxheUNoYXJzLmxlbmd0aCgpXTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0Q2hhckF0KGludCBpbmRleCwgY2hhciBjaCkgewotICAgICAgICAgICAgbURpc3BsYXlDaGFycy5zZXRDaGFyQXQoaW5kZXgsIGNoKTsKLSAgICAgICAgICAgIG1NaWRSb3dTdHlsZXNbaW5kZXhdID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0TWlkUm93QXQoaW50IGluZGV4LCBTdHlsZUNvZGUgbSkgewotICAgICAgICAgICAgbURpc3BsYXlDaGFycy5zZXRDaGFyQXQoaW5kZXgsICcgJyk7Ci0gICAgICAgICAgICBtTWlkUm93U3R5bGVzW2luZGV4XSA9IG07Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldFBBQ0F0KGludCBpbmRleCwgUEFDIHBhYykgewotICAgICAgICAgICAgbVBBQ1N0eWxlc1tpbmRleF0gPSBwYWM7Ci0gICAgICAgIH0KLQotICAgICAgICBjaGFyIGNoYXJBdChpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGlzcGxheUNoYXJzLmNoYXJBdChpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbGVuZ3RoKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5Q2hhcnMubGVuZ3RoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFwcGx5U3R5bGVTcGFuKAotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgc3R5bGVkVGV4dCwKLSAgICAgICAgICAgICAgICBTdHlsZUNvZGUgcywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgICAgICBpZiAocy5pc0l0YWxpY3MoKSkgewotICAgICAgICAgICAgICAgIHN0eWxlZFRleHQuc2V0U3BhbigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHlsZVNwYW4oYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZS5JVEFMSUMpLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocy5pc1VuZGVybGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGVkVGV4dC5zZXRTcGFuKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVuZGVybGluZVNwYW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIFNwYW5uYWJsZS5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBnZXRTdHlsZWRUZXh0KENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUpIHsKLSAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgc3R5bGVkVGV4dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKG1EaXNwbGF5Q2hhcnMpOwotICAgICAgICAgICAgaW50IHN0YXJ0ID0gLTEsIG5leHQgPSAwOwotICAgICAgICAgICAgaW50IHN0eWxlU3RhcnQgPSAtMTsKLSAgICAgICAgICAgIFN0eWxlQ29kZSBjdXJTdHlsZSA9IG51bGw7Ci0gICAgICAgICAgICB3aGlsZSAobmV4dCA8IG1EaXNwbGF5Q2hhcnMubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICBTdHlsZUNvZGUgbmV3U3R5bGUgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChtTWlkUm93U3R5bGVzW25leHRdICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgbWlkLXJvdyBzdHlsZSBjaGFuZ2UKLSAgICAgICAgICAgICAgICAgICAgbmV3U3R5bGUgPSBtTWlkUm93U3R5bGVzW25leHRdOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVBBQ1N0eWxlc1tuZXh0XSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIChzdHlsZVN0YXJ0IDwgMCB8fCBzdGFydCA8IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFwcGx5IFBBQyBzdHlsZSBjaGFuZ2UsIG9ubHkgaWY6Ci0gICAgICAgICAgICAgICAgICAgIC8vIDEuIG5vIHN0eWxlIHNldCwgb3IKLSAgICAgICAgICAgICAgICAgICAgLy8gMi4gc3R5bGUgc2V0LCBidXQgcHJldiBjaGFyIGlzIG5vbmUtZGlzcGxheWFibGUKLSAgICAgICAgICAgICAgICAgICAgbmV3U3R5bGUgPSBtUEFDU3R5bGVzW25leHRdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobmV3U3R5bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjdXJTdHlsZSA9IG5ld1N0eWxlOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVTdGFydCA+PSAwICYmIHN0YXJ0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3R5bGVTcGFuKHN0eWxlZFRleHQsIG5ld1N0eWxlLCBzdHlsZVN0YXJ0LCBuZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzdHlsZVN0YXJ0ID0gbmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobURpc3BsYXlDaGFycy5jaGFyQXQobmV4dCkgIT0gVFMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBuZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBleHBhbmRlZFN0YXJ0ID0gbURpc3BsYXlDaGFycy5jaGFyQXQoc3RhcnQpID09ICcgJyA/IHN0YXJ0IDogc3RhcnQgLSAxOwotICAgICAgICAgICAgICAgICAgICBpbnQgZXhwYW5kZWRFbmQgPSBtRGlzcGxheUNoYXJzLmNoYXJBdChuZXh0IC0gMSkgPT0gJyAnID8gbmV4dCA6IG5leHQgKyAxOwotICAgICAgICAgICAgICAgICAgICBzdHlsZWRUZXh0LnNldFNwYW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE11dGFibGVCYWNrZ3JvdW5kQ29sb3JTcGFuKGNhcHRpb25TdHlsZS5iYWNrZ3JvdW5kQ29sb3IpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkU3RhcnQsIGV4cGFuZGVkRW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uYWJsZS5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVTdGFydCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcHBseVN0eWxlU3BhbihzdHlsZWRUZXh0LCBjdXJTdHlsZSwgc3R5bGVTdGFydCwgZXhwYW5kZWRFbmQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5leHQrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHN0eWxlZFRleHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENDTWVtb3J5IG1vZGVscyBhIGNvbnNvbGUtc3R5bGUgZGlzcGxheS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDQ01lbW9yeSB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1CbGFua0xpbmU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ0NMaW5lQnVpbGRlcltdIG1MaW5lcyA9IG5ldyBDQ0xpbmVCdWlsZGVyW01BWF9ST1dTICsgMl07Ci0gICAgICAgIHByaXZhdGUgaW50IG1Sb3c7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Db2w7Ci0KLSAgICAgICAgQ0NNZW1vcnkoKSB7Ci0gICAgICAgICAgICBjaGFyW10gYmxhbmsgPSBuZXcgY2hhcltNQVhfQ09MUyArIDJdOwotICAgICAgICAgICAgQXJyYXlzLmZpbGwoYmxhbmssIFRTKTsKLSAgICAgICAgICAgIG1CbGFua0xpbmUgPSBuZXcgU3RyaW5nKGJsYW5rKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZXJhc2UoKSB7Ci0gICAgICAgICAgICAvLyBlcmFzZSBhbGwgbGluZXMKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUxpbmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Sb3cgPSBNQVhfUk9XUzsKLSAgICAgICAgICAgIG1Db2wgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBkZXIoKSB7Ci0gICAgICAgICAgICBpZiAobUxpbmVzW21Sb3ddICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db2w7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAobUxpbmVzW21Sb3ddLmNoYXJBdChpKSAhPSBUUykgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IG1Db2w7IGogPCBtTGluZXNbbVJvd10ubGVuZ3RoKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MaW5lc1tqXS5zZXRDaGFyQXQoaiwgVFMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1MaW5lc1ttUm93XSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHRhYihpbnQgdGFicykgewotICAgICAgICAgICAgbW92ZUN1cnNvckJ5Q29sKHRhYnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBicygpIHsKLSAgICAgICAgICAgIG1vdmVDdXJzb3JCeUNvbCgtMSk7Ci0gICAgICAgICAgICBpZiAobUxpbmVzW21Sb3ddICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbbVJvd10uc2V0Q2hhckF0KG1Db2wsIFRTKTsKLSAgICAgICAgICAgICAgICBpZiAobUNvbCA9PSBNQVhfQ09MUyAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3BlYyByZWNvbW1lbmRhdGlvbjoKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgY3Vyc29yIHdhcyBhdCBjb2wgMzIsIG1vdmUgY3Vyc29yCi0gICAgICAgICAgICAgICAgICAgIC8vIGJhY2sgdG8gY29sIDMxIGFuZCBlcmFzZSBib3RoIGNvbCAzMSYzMgotICAgICAgICAgICAgICAgICAgICBtTGluZXNbbVJvd10uc2V0Q2hhckF0KE1BWF9DT0xTLCBUUyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBjcigpIHsKLSAgICAgICAgICAgIG1vdmVDdXJzb3JUbyhtUm93ICsgMSwgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHJvbGxVcChpbnQgd2luZG93U2l6ZSkgewotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG1Sb3cgLSB3aW5kb3dTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHN0YXJ0Um93ID0gbVJvdyAtIHdpbmRvd1NpemUgKyAxOwotICAgICAgICAgICAgaWYgKHN0YXJ0Um93IDwgMSkgewotICAgICAgICAgICAgICAgIHN0YXJ0Um93ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaSA9IHN0YXJ0Um93OyBpIDwgbVJvdzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbUxpbmVzW2kgKyAxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaSA9IG1Sb3c7IGkgPCBtTGluZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAvLyBjbGVhciBiYXNlIHJvdwotICAgICAgICAgICAgICAgIG1MaW5lc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBkZWZhdWx0IHRvIGNvbCAxLCBpbiBjYXNlIFBBQyBpcyBub3Qgc2VudAotICAgICAgICAgICAgbUNvbCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlVGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBnZXRMaW5lQnVmZmVyKG1Sb3cpLnNldENoYXJBdChtQ29sLCB0ZXh0LmNoYXJBdChpKSk7Ci0gICAgICAgICAgICAgICAgbW92ZUN1cnNvckJ5Q29sKDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZU1pZFJvd0NvZGUoU3R5bGVDb2RlIG0pIHsKLSAgICAgICAgICAgIGdldExpbmVCdWZmZXIobVJvdykuc2V0TWlkUm93QXQobUNvbCwgbSk7Ci0gICAgICAgICAgICBtb3ZlQ3Vyc29yQnlDb2woMSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlUEFDKFBBQyBwYWMpIHsKLSAgICAgICAgICAgIGlmIChwYWMuaXNJbmRlbnRQQUMoKSkgewotICAgICAgICAgICAgICAgIG1vdmVDdXJzb3JUbyhwYWMuZ2V0Um93KCksIHBhYy5nZXRDb2woKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1vdmVDdXJzb3JUbyhwYWMuZ2V0Um93KCksIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0TGluZUJ1ZmZlcihtUm93KS5zZXRQQUNBdChtQ29sLCBwYWMpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltdIGdldFN0eWxlZFRleHQoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSkgewotICAgICAgICAgICAgQXJyYXlMaXN0PFNwYW5uYWJsZVN0cmluZ0J1aWxkZXI+IHJvd3MgPSBuZXcgQXJyYXlMaXN0PD4oTUFYX1JPV1MpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIHJvd3MuYWRkKG1MaW5lc1tpXSAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1MaW5lc1tpXS5nZXRTdHlsZWRUZXh0KGNhcHRpb25TdHlsZSkgOiBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByb3dzLnRvQXJyYXkobmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXJbTUFYX1JPV1NdKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGludCBjbGFtcChpbnQgeCwgaW50IG1pbiwgaW50IG1heCkgewotICAgICAgICAgICAgcmV0dXJuIHggPCBtaW4gPyBtaW4gOiAoeCA+IG1heCA/IG1heCA6IHgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1vdmVDdXJzb3JUbyhpbnQgcm93LCBpbnQgY29sKSB7Ci0gICAgICAgICAgICBtUm93ID0gY2xhbXAocm93LCAxLCBNQVhfUk9XUyk7Ci0gICAgICAgICAgICBtQ29sID0gY2xhbXAoY29sLCAxLCBNQVhfQ09MUyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbW92ZUN1cnNvclRvUm93KGludCByb3cpIHsKLSAgICAgICAgICAgIG1Sb3cgPSBjbGFtcChyb3csIDEsIE1BWF9ST1dTKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBtb3ZlQ3Vyc29yQnlDb2woaW50IGNvbCkgewotICAgICAgICAgICAgbUNvbCA9IGNsYW1wKG1Db2wgKyBjb2wsIDEsIE1BWF9DT0xTKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBtb3ZlQmFzZWxpbmVUbyhpbnQgYmFzZVJvdywgaW50IHdpbmRvd1NpemUpIHsKLSAgICAgICAgICAgIGlmIChtUm93ID09IGJhc2VSb3cpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgYWN0dWFsV2luZG93U2l6ZSA9IHdpbmRvd1NpemU7Ci0gICAgICAgICAgICBpZiAoYmFzZVJvdyA8IGFjdHVhbFdpbmRvd1NpemUpIHsKLSAgICAgICAgICAgICAgICBhY3R1YWxXaW5kb3dTaXplID0gYmFzZVJvdzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUm93IDwgYWN0dWFsV2luZG93U2l6ZSkgewotICAgICAgICAgICAgICAgIGFjdHVhbFdpbmRvd1NpemUgPSBtUm93OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGlmIChiYXNlUm93IDwgbVJvdykgewotICAgICAgICAgICAgICAgIC8vIGNvcHkgZnJvbSBib3R0b20gdG8gdG9wIHJvdwotICAgICAgICAgICAgICAgIGZvciAoaSA9IGFjdHVhbFdpbmRvd1NpemUgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBtTGluZXNbYmFzZVJvdyAtIGldID0gbUxpbmVzW21Sb3cgLSBpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGNvcHkgZnJvbSB0b3AgdG8gYm90dG9tIHJvdwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhY3R1YWxXaW5kb3dTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbUxpbmVzW2Jhc2VSb3cgLSBpXSA9IG1MaW5lc1ttUm93IC0gaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY2xlYXIgcmVzdCBvZiB0aGUgcm93cwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBiYXNlUm93IC0gd2luZG93U2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaSA9IGJhc2VSb3cgKyAxOyBpIDwgbUxpbmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgQ0NMaW5lQnVpbGRlciBnZXRMaW5lQnVmZmVyKGludCByb3cpIHsKLSAgICAgICAgICAgIGlmIChtTGluZXNbcm93XSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW3Jvd10gPSBuZXcgQ0NMaW5lQnVpbGRlcihtQmxhbmtMaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtTGluZXNbcm93XTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQ0NEYXRhIHBhcnNlcyB0aGUgcmF3IENDIGJ5dGUgcGFpciBpbnRvIGRpc3BsYXlhYmxlIGNoYXJzLAotICAgICAqIG1pc2MgY29udHJvbCBjb2RlcywgTWlkLVJvdyBvciBQcmVhbWJsZSBBZGRyZXNzIENvZGVzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDRGF0YSB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgYnl0ZSBtVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBieXRlIG1EYXRhMTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBieXRlIG1EYXRhMjsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtQ3RybENvZGVNYXAgPSB7Ci0gICAgICAgICAgICAiUkNMIiwgIkJTIiAsICJBT0YiLCAiQU9OIiwKLSAgICAgICAgICAgICJERVIiLCAiUlUyIiwgIlJVMyIsICJSVTQiLAotICAgICAgICAgICAgIkZPTiIsICJSREMiLCAiVFIiICwgIlJURCIsCi0gICAgICAgICAgICAiRURNIiwgIkNSIiAsICJFTk0iLCAiRU9DIiwKLSAgICAgICAgfTsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtU3BlY2lhbENoYXJNYXAgPSB7Ci0gICAgICAgICAgICAiXHUwMEFFIiwKLSAgICAgICAgICAgICJcdTAwQjAiLAotICAgICAgICAgICAgIlx1MDBCRCIsCi0gICAgICAgICAgICAiXHUwMEJGIiwKLSAgICAgICAgICAgICJcdTIxMjIiLAotICAgICAgICAgICAgIlx1MDBBMiIsCi0gICAgICAgICAgICAiXHUwMEEzIiwKLSAgICAgICAgICAgICJcdTI2NkEiLCAvLyBFaWdodGggbm90ZQotICAgICAgICAgICAgIlx1MDBFMCIsCi0gICAgICAgICAgICAiXHUwMEEwIiwgLy8gVHJhbnNwYXJlbnQgc3BhY2UKLSAgICAgICAgICAgICJcdTAwRTgiLAotICAgICAgICAgICAgIlx1MDBFMiIsCi0gICAgICAgICAgICAiXHUwMEVBIiwKLSAgICAgICAgICAgICJcdTAwRUUiLAotICAgICAgICAgICAgIlx1MDBGNCIsCi0gICAgICAgICAgICAiXHUwMEZCIiwKLSAgICAgICAgfTsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtU3BhbmlzaENoYXJNYXAgPSB7Ci0gICAgICAgICAgICAvLyBTcGFuaXNoIGFuZCBtaXNjIGNoYXJzCi0gICAgICAgICAgICAiXHUwMEMxIiwgLy8gQQotICAgICAgICAgICAgIlx1MDBDOSIsIC8vIEUKLSAgICAgICAgICAgICJcdTAwRDMiLCAvLyBJCi0gICAgICAgICAgICAiXHUwMERBIiwgLy8gTwotICAgICAgICAgICAgIlx1MDBEQyIsIC8vIFUKLSAgICAgICAgICAgICJcdTAwRkMiLCAvLyB1Ci0gICAgICAgICAgICAiXHUyMDE4IiwgLy8gb3BlbmluZyBzaW5nbGUgcXVvdGUKLSAgICAgICAgICAgICJcdTAwQTEiLCAvLyBpbnZlcnRlZCBleGNsYW1hdGlvbiBtYXJrCi0gICAgICAgICAgICAiKiIsCi0gICAgICAgICAgICAiJyIsCi0gICAgICAgICAgICAiXHUyMDE0IiwgLy8gZW0gZGFzaAotICAgICAgICAgICAgIlx1MDBBOSIsIC8vIENvcHlyaWdodAotICAgICAgICAgICAgIlx1MjEyMCIsIC8vIFNlcnZpY2VtYXJrCi0gICAgICAgICAgICAiXHUyMDIyIiwgLy8gcm91bmQgYnVsbGV0Ci0gICAgICAgICAgICAiXHUyMDFDIiwgLy8gb3BlbmluZyBkb3VibGUgcXVvdGUKLSAgICAgICAgICAgICJcdTIwMUQiLCAvLyBjbG9zaW5nIGRvdWJsZSBxdW90ZQotICAgICAgICAgICAgLy8gRnJlbmNoCi0gICAgICAgICAgICAiXHUwMEMwIiwKLSAgICAgICAgICAgICJcdTAwQzIiLAotICAgICAgICAgICAgIlx1MDBDNyIsCi0gICAgICAgICAgICAiXHUwMEM4IiwKLSAgICAgICAgICAgICJcdTAwQ0EiLAotICAgICAgICAgICAgIlx1MDBDQiIsCi0gICAgICAgICAgICAiXHUwMEVCIiwKLSAgICAgICAgICAgICJcdTAwQ0UiLAotICAgICAgICAgICAgIlx1MDBDRiIsCi0gICAgICAgICAgICAiXHUwMEVGIiwKLSAgICAgICAgICAgICJcdTAwRDQiLAotICAgICAgICAgICAgIlx1MDBEOSIsCi0gICAgICAgICAgICAiXHUwMEY5IiwKLSAgICAgICAgICAgICJcdTAwREIiLAotICAgICAgICAgICAgIlx1MDBBQiIsCi0gICAgICAgICAgICAiXHUwMEJCIgotICAgICAgICB9OwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1Qcm90dWd1ZXNlQ2hhck1hcCA9IHsKLSAgICAgICAgICAgIC8vIFBvcnR1Z3Vlc2UKLSAgICAgICAgICAgICJcdTAwQzMiLAotICAgICAgICAgICAgIlx1MDBFMyIsCi0gICAgICAgICAgICAiXHUwMENEIiwKLSAgICAgICAgICAgICJcdTAwQ0MiLAotICAgICAgICAgICAgIlx1MDBFQyIsCi0gICAgICAgICAgICAiXHUwMEQyIiwKLSAgICAgICAgICAgICJcdTAwRjIiLAotICAgICAgICAgICAgIlx1MDBENSIsCi0gICAgICAgICAgICAiXHUwMEY1IiwKLSAgICAgICAgICAgICJ7IiwKLSAgICAgICAgICAgICJ9IiwKLSAgICAgICAgICAgICJcXCIsCi0gICAgICAgICAgICAiXiIsCi0gICAgICAgICAgICAiXyIsCi0gICAgICAgICAgICAifCIsCi0gICAgICAgICAgICAifiIsCi0gICAgICAgICAgICAvLyBHZXJtYW4gYW5kIG1pc2MgY2hhcnMKLSAgICAgICAgICAgICJcdTAwQzQiLAotICAgICAgICAgICAgIlx1MDBFNCIsCi0gICAgICAgICAgICAiXHUwMEQ2IiwKLSAgICAgICAgICAgICJcdTAwRjYiLAotICAgICAgICAgICAgIlx1MDBERiIsCi0gICAgICAgICAgICAiXHUwMEE1IiwKLSAgICAgICAgICAgICJcdTAwQTQiLAotICAgICAgICAgICAgIlx1MjUwMiIsIC8vIHZlcnRpY2FsIGJhcgotICAgICAgICAgICAgIlx1MDBDNSIsCi0gICAgICAgICAgICAiXHUwMEU1IiwKLSAgICAgICAgICAgICJcdTAwRDgiLAotICAgICAgICAgICAgIlx1MDBGOCIsCi0gICAgICAgICAgICAiXHUyNTBDIiwgLy8gdG9wLWxlZnQgY29ybmVyCi0gICAgICAgICAgICAiXHUyNTEwIiwgLy8gdG9wLXJpZ2h0IGNvcm5lcgotICAgICAgICAgICAgIlx1MjUxNCIsIC8vIGxvd2VyLWxlZnQgY29ybmVyCi0gICAgICAgICAgICAiXHUyNTE4IiwgLy8gbG93ZXItcmlnaHQgY29ybmVyCi0gICAgICAgIH07Ci0KLSAgICAgICAgc3RhdGljIENDRGF0YVtdIGZyb21CeXRlQXJyYXkoYnl0ZVtdIGRhdGEpIHsKLSAgICAgICAgICAgIENDRGF0YVtdIGNjRGF0YSA9IG5ldyBDQ0RhdGFbZGF0YS5sZW5ndGggLyAzXTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjY0RhdGEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjY0RhdGFbaV0gPSBuZXcgQ0NEYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpICogM10sCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2kgKiAzICsgMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2kgKiAzICsgMl0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gY2NEYXRhOwotICAgICAgICB9Ci0KLSAgICAgICAgQ0NEYXRhKGJ5dGUgdHlwZSwgYnl0ZSBkYXRhMSwgYnl0ZSBkYXRhMikgewotICAgICAgICAgICAgbVR5cGUgPSB0eXBlOwotICAgICAgICAgICAgbURhdGExID0gZGF0YTE7Ci0gICAgICAgICAgICBtRGF0YTIgPSBkYXRhMjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRDdHJsQ29kZSgpIHsKLSAgICAgICAgICAgIGlmICgobURhdGExID09IDB4MTQgfHwgbURhdGExID09IDB4MWMpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDJmKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1EYXRhMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwotICAgICAgICB9Ci0KLSAgICAgICAgU3R5bGVDb2RlIGdldE1pZFJvdygpIHsKLSAgICAgICAgICAgIC8vIG9ubHkgc3VwcG9ydCBzdGFuZGFyZCBNaWQtcm93IGNvZGVzLCBpZ25vcmUKLSAgICAgICAgICAgIC8vIG9wdGlvbmFsIGJhY2tncm91bmQvZm9yZWdyb3VuZCBtaWQtcm93IGNvZGVzCi0gICAgICAgICAgICBpZiAoKG1EYXRhMSA9PSAweDExIHx8IG1EYXRhMSA9PSAweDE5KQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgyMCAmJiBtRGF0YTIgPD0gMHgyZikgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHlsZUNvZGUuZnJvbUJ5dGUobURhdGEyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgUEFDIGdldFBBQygpIHsKLSAgICAgICAgICAgIGlmICgobURhdGExICYgMHg3MCkgPT0gMHgxMAotICAgICAgICAgICAgICAgICAgICAmJiAobURhdGEyICYgMHg0MCkgPT0gMHg0MAotICAgICAgICAgICAgICAgICAgICAmJiAoKG1EYXRhMSAmIDB4MDcpICE9IDAgfHwgKG1EYXRhMiAmIDB4MjApID09IDApKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBBQy5mcm9tQnl0ZXMobURhdGExLCBtRGF0YTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0VGFiT2Zmc2V0KCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxNyB8fCBtRGF0YTEgPT0gMHgxZikKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjEgJiYgbURhdGEyIDw9IDB4MjMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbURhdGEyICYgMHgzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzRGlzcGxheWFibGVDaGFyKCkgewotICAgICAgICAgICAgcmV0dXJuIGlzQmFzaWNDaGFyKCkgfHwgaXNTcGVjaWFsQ2hhcigpIHx8IGlzRXh0ZW5kZWRDaGFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZ2V0RGlzcGxheVRleHQoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3RyID0gZ2V0QmFzaWNDaGFycygpOwotCi0gICAgICAgICAgICBpZiAoc3RyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdHIgPSAgZ2V0U3BlY2lhbENoYXIoKTsKLQotICAgICAgICAgICAgICAgIGlmIChzdHIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzdHIgPSBnZXRFeHRlbmRlZENoYXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzdHI7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBjdHJsQ29kZVRvU3RyaW5nKGludCBjdHJsQ29kZSkgewotICAgICAgICAgICAgcmV0dXJuIG1DdHJsQ29kZU1hcFtjdHJsQ29kZSAtIDB4MjBdOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzQmFzaWNDaGFyKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EYXRhMSA+PSAweDIwICYmIG1EYXRhMSA8PSAweDdmOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzU3BlY2lhbENoYXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChtRGF0YTEgPT0gMHgxMSB8fCBtRGF0YTEgPT0gMHgxOSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MzAgJiYgbURhdGEyIDw9IDB4M2YpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzRXh0ZW5kZWRDaGFyKCkgewotICAgICAgICAgICAgcmV0dXJuICgobURhdGExID09IDB4MTIgfHwgbURhdGExID09IDB4MUEKLSAgICAgICAgICAgICAgICAgICAgfHwgbURhdGExID09IDB4MTMgfHwgbURhdGExID09IDB4MUIpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDNmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgY2hhciBnZXRCYXNpY0NoYXIoYnl0ZSBkYXRhKSB7Ci0gICAgICAgICAgICBjaGFyIGM7Ci0gICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBub24tQVNDSUkgb25lcwotICAgICAgICAgICAgc3dpdGNoIChkYXRhKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDJBOiBjID0gJ1x1MDBFMSc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg1QzogYyA9ICdcdTAwRTknOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4NUU6IGMgPSAnXHUwMEVEJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDVGOiBjID0gJ1x1MDBGMyc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg2MDogYyA9ICdcdTAwRkEnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4N0I6IGMgPSAnXHUwMEU3JzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDdDOiBjID0gJ1x1MDBGNyc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg3RDogYyA9ICdcdTAwRDEnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4N0U6IGMgPSAnXHUwMEYxJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDdGOiBjID0gJ1x1MjU4OCc7IGJyZWFrOyAvLyBGdWxsIGJsb2NrCi0gICAgICAgICAgICAgICAgZGVmYXVsdDogYyA9IChjaGFyKSBkYXRhOyBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QmFzaWNDaGFycygpIHsKLSAgICAgICAgICAgIGlmIChtRGF0YTEgPj0gMHgyMCAmJiBtRGF0YTEgPD0gMHg3ZikgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKDIpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGdldEJhc2ljQ2hhcihtRGF0YTEpKTsKLSAgICAgICAgICAgICAgICBpZiAobURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4N2YpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZ2V0QmFzaWNDaGFyKG1EYXRhMikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGdldFNwZWNpYWxDaGFyKCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxMSB8fCBtRGF0YTEgPT0gMHgxOSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MzAgJiYgbURhdGEyIDw9IDB4M2YpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVNwZWNpYWxDaGFyTWFwW21EYXRhMiAtIDB4MzBdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGdldEV4dGVuZGVkQ2hhcigpIHsKLSAgICAgICAgICAgIGlmICgobURhdGExID09IDB4MTIgfHwgbURhdGExID09IDB4MUEpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDNmKXsKLSAgICAgICAgICAgICAgICAvLyAxIFNwYW5pc2gvRnJlbmNoIGNoYXIKLSAgICAgICAgICAgICAgICByZXR1cm4gbVNwYW5pc2hDaGFyTWFwW21EYXRhMiAtIDB4MjBdOwotICAgICAgICAgICAgfSBlbHNlIGlmICgobURhdGExID09IDB4MTMgfHwgbURhdGExID09IDB4MUIpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDNmKXsKLSAgICAgICAgICAgICAgICAvLyAxIFBvcnR1Z3Vlc2UvR2VybWFuL0RhbmlzaCBjaGFyCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1Qcm90dWd1ZXNlQ2hhck1hcFttRGF0YTIgLSAweDIwXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIFN0cmluZyBzdHI7Ci0KLSAgICAgICAgICAgIGlmIChtRGF0YTEgPCAweDEwICYmIG1EYXRhMiA8IDB4MTApIHsKLSAgICAgICAgICAgICAgICAvLyBOdWxsIFBhZCwgaWdub3JlCi0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1OdWxsOiAlMDJ4ICUwMngiLCBtVHlwZSwgbURhdGExLCBtRGF0YTIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgY3RybENvZGUgPSBnZXRDdHJsQ29kZSgpOwotICAgICAgICAgICAgaWYgKGN0cmxDb2RlICE9IElOVkFMSUQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXSVzIiwgbVR5cGUsIGN0cmxDb2RlVG9TdHJpbmcoY3RybENvZGUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHRhYk9mZnNldCA9IGdldFRhYk9mZnNldCgpOwotICAgICAgICAgICAgaWYgKHRhYk9mZnNldCA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXVRhYiVkIiwgbVR5cGUsIHRhYk9mZnNldCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFBBQyBwYWMgPSBnZXRQQUMoKTsKLSAgICAgICAgICAgIGlmIChwYWMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdUEFDOiAlcyIsIG1UeXBlLCBwYWMudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0eWxlQ29kZSBtID0gZ2V0TWlkUm93KCk7Ci0gICAgICAgICAgICBpZiAobSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1NaWQtcm93OiAlcyIsIG1UeXBlLCBtLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaXNEaXNwbGF5YWJsZUNoYXIoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdRGlzcGxheWFibGU6ICVzICglMDJ4ICUwMngpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UeXBlLCBnZXREaXNwbGF5VGV4dCgpLCBtRGF0YTEsIG1EYXRhMik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdSW52YWxpZDogJTAyeCAlMDJ4IiwgbVR5cGUsIG1EYXRhMSwgbURhdGEyKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqCi0gKiBXaWRnZXQgY2FwYWJsZSBvZiByZW5kZXJpbmcgQ0VBLTYwOCBjbG9zZWQgY2FwdGlvbnMuCi0gKi8KLWNsYXNzIENlYTYwOENDV2lkZ2V0IGV4dGVuZHMgQ2xvc2VkQ2FwdGlvbldpZGdldCBpbXBsZW1lbnRzIENlYTYwOENDUGFyc2VyLkRpc3BsYXlMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVjdCBtVGV4dEJvdW5kcyA9IG5ldyBSZWN0KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1EdW1teVRleHQgPSAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCI7Ci0KLSAgICBwdWJsaWMgQ2VhNjA4Q0NXaWRnZXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIENlYTYwOENDV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBDZWE2MDhDQ1dpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2VhNjA4Q0NXaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsCi0gICAgICAgICAgICBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbG9zZWRDYXB0aW9uTGF5b3V0IGNyZWF0ZUNhcHRpb25MYXlvdXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ0NMYXlvdXQoY29udGV4dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EaXNwbGF5Q2hhbmdlZChTcGFubmFibGVTdHJpbmdCdWlsZGVyW10gc3R5bGVkVGV4dHMpIHsKLSAgICAgICAgKChDQ0xheW91dCkgbUNsb3NlZENhcHRpb25MYXlvdXQpLnVwZGF0ZShzdHlsZWRUZXh0cyk7Ci0KLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXIub25DaGFuZ2VkKHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENhcHRpb25TdHlsZSBnZXRDYXB0aW9uU3R5bGUoKSB7Ci0gICAgICAgIHJldHVybiBtQ2FwdGlvblN0eWxlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDTGluZUJveCBleHRlbmRzIFRleHRWaWV3IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRk9OVF9QQURESU5HX1JBVElPID0gMC43NWY7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEVER0VfT1VUTElORV9SQVRJTyA9IDAuMWY7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEVER0VfU0hBRE9XX1JBVElPID0gMC4wNWY7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbU91dGxpbmVXaWR0aDsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtU2hhZG93UmFkaXVzOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1TaGFkb3dPZmZzZXQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbVRleHRDb2xvciA9IENvbG9yLldISVRFOwotICAgICAgICBwcml2YXRlIGludCBtQmdDb2xvciA9IENvbG9yLkJMQUNLOwotICAgICAgICBwcml2YXRlIGludCBtRWRnZVR5cGUgPSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX05PTkU7Ci0gICAgICAgIHByaXZhdGUgaW50IG1FZGdlQ29sb3IgPSBDb2xvci5UUkFOU1BBUkVOVDsKLQotICAgICAgICBDQ0xpbmVCb3goQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgICAgIHNldEdyYXZpdHkoR3Jhdml0eS5DRU5URVIpOwotICAgICAgICAgICAgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yLlRSQU5TUEFSRU5UKTsKLSAgICAgICAgICAgIHNldFRleHRDb2xvcihDb2xvci5XSElURSk7Ci0gICAgICAgICAgICBzZXRUeXBlZmFjZShUeXBlZmFjZS5NT05PU1BBQ0UpOwotICAgICAgICAgICAgc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgZGVmYXVsdCAod2lsbCBiZSB1cGRhdGVkIGxhdGVyIGR1cmluZyBtZWFzdXJlKQotICAgICAgICAgICAgbU91dGxpbmVXaWR0aCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3VidGl0bGVfb3V0bGluZV93aWR0aCk7Ci0gICAgICAgICAgICBtU2hhZG93UmFkaXVzID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdWJ0aXRsZV9zaGFkb3dfcmFkaXVzKTsKLSAgICAgICAgICAgIG1TaGFkb3dPZmZzZXQgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN1YnRpdGxlX3NoYWRvd19vZmZzZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRDYXB0aW9uU3R5bGUoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSkgewotICAgICAgICAgICAgbVRleHRDb2xvciA9IGNhcHRpb25TdHlsZS5mb3JlZ3JvdW5kQ29sb3I7Ci0gICAgICAgICAgICBtQmdDb2xvciA9IGNhcHRpb25TdHlsZS5iYWNrZ3JvdW5kQ29sb3I7Ci0gICAgICAgICAgICBtRWRnZVR5cGUgPSBjYXB0aW9uU3R5bGUuZWRnZVR5cGU7Ci0gICAgICAgICAgICBtRWRnZUNvbG9yID0gY2FwdGlvblN0eWxlLmVkZ2VDb2xvcjsKLQotICAgICAgICAgICAgc2V0VGV4dENvbG9yKG1UZXh0Q29sb3IpOwotICAgICAgICAgICAgaWYgKG1FZGdlVHlwZSA9PSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX0RST1BfU0hBRE9XKSB7Ci0gICAgICAgICAgICAgICAgc2V0U2hhZG93TGF5ZXIobVNoYWRvd1JhZGl1cywgbVNoYWRvd09mZnNldCwgbVNoYWRvd09mZnNldCwgbUVkZ2VDb2xvcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldFNoYWRvd0xheWVyKDAsIDAsIDAsIDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgICAgICBmbG9hdCBmb250U2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUoaGVpZ2h0TWVhc3VyZVNwZWMpICogRk9OVF9QQURESU5HX1JBVElPOwotICAgICAgICAgICAgc2V0VGV4dFNpemUoVHlwZWRWYWx1ZS5DT01QTEVYX1VOSVRfUFgsIGZvbnRTaXplKTsKLQotICAgICAgICAgICAgbU91dGxpbmVXaWR0aCA9IEVER0VfT1VUTElORV9SQVRJTyAqIGZvbnRTaXplICsgMS4wZjsKLSAgICAgICAgICAgIG1TaGFkb3dSYWRpdXMgPSBFREdFX1NIQURPV19SQVRJTyAqIGZvbnRTaXplICsgMS4wZjs7Ci0gICAgICAgICAgICBtU2hhZG93T2Zmc2V0ID0gbVNoYWRvd1JhZGl1czsKLQotICAgICAgICAgICAgLy8gc2V0IGZvbnQgc2NhbGUgaW4gdGhlIFggZGlyZWN0aW9uIHRvIG1hdGNoIHRoZSByZXF1aXJlZCB3aWR0aAotICAgICAgICAgICAgc2V0U2NhbGVYKDEuMGYpOwotICAgICAgICAgICAgZ2V0UGFpbnQoKS5nZXRUZXh0Qm91bmRzKG1EdW1teVRleHQsIDAsIG1EdW1teVRleHQubGVuZ3RoKCksIG1UZXh0Qm91bmRzKTsKLSAgICAgICAgICAgIGZsb2F0IGFjdHVhbFRleHRXaWR0aCA9IG1UZXh0Qm91bmRzLndpZHRoKCk7Ci0gICAgICAgICAgICBmbG9hdCByZXF1aXJlZFRleHRXaWR0aCA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgICAgICBzZXRTY2FsZVgocmVxdWlyZWRUZXh0V2lkdGggLyBhY3R1YWxUZXh0V2lkdGgpOwotCi0gICAgICAgICAgICBzdXBlci5vbk1lYXN1cmUod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgYykgewotICAgICAgICAgICAgaWYgKG1FZGdlVHlwZSA9PSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX1VOU1BFQ0lGSUVECi0gICAgICAgICAgICAgICAgICAgIHx8IG1FZGdlVHlwZSA9PSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX05PTkUKLSAgICAgICAgICAgICAgICAgICAgfHwgbUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfRFJPUF9TSEFET1cpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGVzZSBlZGdlIHN0eWxlcyBkb24ndCByZXF1aXJlIGEgc2Vjb25kIHBhc3MKLSAgICAgICAgICAgICAgICBzdXBlci5vbkRyYXcoYyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfT1VUTElORSkgewotICAgICAgICAgICAgICAgIGRyYXdFZGdlT3V0bGluZShjKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gUmFpc2VkIG9yIGRlcHJlc3NlZAotICAgICAgICAgICAgICAgIGRyYXdFZGdlUmFpc2VkT3JEZXByZXNzZWQoYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZHJhd0VkZ2VPdXRsaW5lKENhbnZhcyBjKSB7Ci0gICAgICAgICAgICBUZXh0UGFpbnQgdGV4dFBhaW50ID0gZ2V0UGFpbnQoKTsKLQotICAgICAgICAgICAgUGFpbnQuU3R5bGUgcHJldmlvdXNTdHlsZSA9IHRleHRQYWludC5nZXRTdHlsZSgpOwotICAgICAgICAgICAgUGFpbnQuSm9pbiBwcmV2aW91c0pvaW4gPSB0ZXh0UGFpbnQuZ2V0U3Ryb2tlSm9pbigpOwotICAgICAgICAgICAgZmxvYXQgcHJldmlvdXNXaWR0aCA9IHRleHRQYWludC5nZXRTdHJva2VXaWR0aCgpOwotCi0gICAgICAgICAgICBzZXRUZXh0Q29sb3IobUVkZ2VDb2xvcik7Ci0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuRklMTF9BTkRfU1RST0tFKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHJva2VKb2luKFBhaW50LkpvaW4uUk9VTkQpOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0cm9rZVdpZHRoKG1PdXRsaW5lV2lkdGgpOwotCi0gICAgICAgICAgICAvLyBEcmF3IG91dGxpbmUgYW5kIGJhY2tncm91bmQgb25seS4KLSAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKLQotICAgICAgICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBzZXR0aW5ncy4KLSAgICAgICAgICAgIHNldFRleHRDb2xvcihtVGV4dENvbG9yKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHlsZShwcmV2aW91c1N0eWxlKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHJva2VKb2luKHByZXZpb3VzSm9pbik7Ci0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3Ryb2tlV2lkdGgocHJldmlvdXNXaWR0aCk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYmFja2dyb3VuZC4KLSAgICAgICAgICAgIHNldEJhY2tncm91bmRTcGFucyhDb2xvci5UUkFOU1BBUkVOVCk7Ci0gICAgICAgICAgICAvLyBEcmF3IGZvcmVncm91bmQgb25seS4KLSAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKLSAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIGJhY2tncm91bmQuCi0gICAgICAgICAgICBzZXRCYWNrZ3JvdW5kU3BhbnMobUJnQ29sb3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGRyYXdFZGdlUmFpc2VkT3JEZXByZXNzZWQoQ2FudmFzIGMpIHsKLSAgICAgICAgICAgIFRleHRQYWludCB0ZXh0UGFpbnQgPSBnZXRQYWludCgpOwotCi0gICAgICAgICAgICBQYWludC5TdHlsZSBwcmV2aW91c1N0eWxlID0gdGV4dFBhaW50LmdldFN0eWxlKCk7Ci0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuRklMTCk7Ci0KLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmFpc2VkID0gbUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfUkFJU0VEOwotICAgICAgICAgICAgZmluYWwgaW50IGNvbG9yVXAgPSByYWlzZWQgPyBDb2xvci5XSElURSA6IG1FZGdlQ29sb3I7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY29sb3JEb3duID0gcmFpc2VkID8gbUVkZ2VDb2xvciA6IENvbG9yLldISVRFOwotICAgICAgICAgICAgZmluYWwgZmxvYXQgb2Zmc2V0ID0gbVNoYWRvd1JhZGl1cyAvIDJmOwotCi0gICAgICAgICAgICAvLyBEcmF3IGJhY2tncm91bmQgYW5kIHRleHQgd2l0aCBzaGFkb3cgdXAKLSAgICAgICAgICAgIHNldFNoYWRvd0xheWVyKG1TaGFkb3dSYWRpdXMsIC1vZmZzZXQsIC1vZmZzZXQsIGNvbG9yVXApOwotICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOwotCi0gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGJhY2tncm91bmQuCi0gICAgICAgICAgICBzZXRCYWNrZ3JvdW5kU3BhbnMoQ29sb3IuVFJBTlNQQVJFTlQpOwotCi0gICAgICAgICAgICAvLyBEcmF3IHRleHQgd2l0aCBzaGFkb3cgZG93bgotICAgICAgICAgICAgc2V0U2hhZG93TGF5ZXIobVNoYWRvd1JhZGl1cywgK29mZnNldCwgK29mZnNldCwgY29sb3JEb3duKTsKLSAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKLQotICAgICAgICAgICAgLy8gUmVzdG9yZSBzZXR0aW5ncwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0eWxlKHByZXZpb3VzU3R5bGUpOwotCi0gICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBiYWNrZ3JvdW5kLgotICAgICAgICAgICAgc2V0QmFja2dyb3VuZFNwYW5zKG1CZ0NvbG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRCYWNrZ3JvdW5kU3BhbnMoaW50IGNvbG9yKSB7Ci0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IGdldFRleHQoKTsKLSAgICAgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5hYmxlKSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlIHNwYW5uYWJsZSA9IChTcGFubmFibGUpIHRleHQ7Ci0gICAgICAgICAgICAgICAgQ2VhNjA4Q0NQYXJzZXIuTXV0YWJsZUJhY2tncm91bmRDb2xvclNwYW5bXSBiZ1NwYW5zID0gc3Bhbm5hYmxlLmdldFNwYW5zKAotICAgICAgICAgICAgICAgICAgICAgICAgMCwgc3Bhbm5hYmxlLmxlbmd0aCgpLCBDZWE2MDhDQ1BhcnNlci5NdXRhYmxlQmFja2dyb3VuZENvbG9yU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiZ1NwYW5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJnU3BhbnNbaV0uc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDQ0xheW91dCBleHRlbmRzIExpbmVhckxheW91dCBpbXBsZW1lbnRzIENsb3NlZENhcHRpb25MYXlvdXQgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JPV1MgPSBDZWE2MDhDQ1BhcnNlci5NQVhfUk9XUzsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgU0FGRV9BUkVBX1JBVElPID0gMC45ZjsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIENDTGluZUJveFtdIG1MaW5lQm94ZXMgPSBuZXcgQ0NMaW5lQm94W01BWF9ST1dTXTsKLQotICAgICAgICBDQ0xheW91dChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICAgICAgc2V0R3Jhdml0eShHcmF2aXR5LlNUQVJUKTsKLSAgICAgICAgICAgIHNldE9yaWVudGF0aW9uKExpbmVhckxheW91dC5WRVJUSUNBTCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9ST1dTOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldID0gbmV3IENDTGluZUJveChnZXRDb250ZXh0KCkpOwotICAgICAgICAgICAgICAgIGFkZFZpZXcobUxpbmVCb3hlc1tpXSwgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q2FwdGlvblN0eWxlKENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0uc2V0Q2FwdGlvblN0eWxlKGNhcHRpb25TdHlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Rm9udFNjYWxlKGZsb2F0IGZvbnRTY2FsZSkgewotICAgICAgICAgICAgLy8gSWdub3JlcyB0aGUgZm9udCBzY2FsZSBjaGFuZ2VzIG9mIHRoZSBzeXN0ZW0gd2lkZSBDQyBwcmVmZXJlbmNlLgotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB1cGRhdGUoU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltdIHRleHRCdWZmZXIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICh0ZXh0QnVmZmVyW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5zZXRUZXh0KHRleHRCdWZmZXJbaV0sIFRleHRWaWV3LkJ1ZmZlclR5cGUuU1BBTk5BQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uTWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgICAgIGludCBzYWZlV2lkdGggPSBnZXRNZWFzdXJlZFdpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgc2FmZUhlaWdodCA9IGdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgIC8vIENFQS02MDggYXNzdW1lcyA0OjMgdmlkZW8KLSAgICAgICAgICAgIGlmIChzYWZlV2lkdGggKiAzID49IHNhZmVIZWlnaHQgKiA0KSB7Ci0gICAgICAgICAgICAgICAgc2FmZVdpZHRoID0gc2FmZUhlaWdodCAqIDQgLyAzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzYWZlSGVpZ2h0ID0gc2FmZVdpZHRoICogMyAvIDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYWZlV2lkdGggKj0gU0FGRV9BUkVBX1JBVElPOwotICAgICAgICAgICAgc2FmZUhlaWdodCAqPSBTQUZFX0FSRUFfUkFUSU87Ci0KLSAgICAgICAgICAgIGludCBsaW5lSGVpZ2h0ID0gc2FmZUhlaWdodCAvIE1BWF9ST1dTOwotICAgICAgICAgICAgaW50IGxpbmVIZWlnaHRNZWFzdXJlU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygKLSAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0gICAgICAgICAgICBpbnQgbGluZVdpZHRoTWVhc3VyZVNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoCi0gICAgICAgICAgICAgICAgICAgIHNhZmVXaWR0aCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0ubWVhc3VyZShsaW5lV2lkdGhNZWFzdXJlU3BlYywgbGluZUhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7Ci0gICAgICAgICAgICAvLyBzYWZlIGNhcHRpb24gYXJlYQotICAgICAgICAgICAgaW50IHZpZXdQb3J0V2lkdGggPSByIC0gbDsKLSAgICAgICAgICAgIGludCB2aWV3UG9ydEhlaWdodCA9IGIgLSB0OwotICAgICAgICAgICAgaW50IHNhZmVXaWR0aCwgc2FmZUhlaWdodDsKLSAgICAgICAgICAgIC8vIENFQS02MDggYXNzdW1lcyA0OjMgdmlkZW8KLSAgICAgICAgICAgIGlmICh2aWV3UG9ydFdpZHRoICogMyA+PSB2aWV3UG9ydEhlaWdodCAqIDQpIHsKLSAgICAgICAgICAgICAgICBzYWZlV2lkdGggPSB2aWV3UG9ydEhlaWdodCAqIDQgLyAzOwotICAgICAgICAgICAgICAgIHNhZmVIZWlnaHQgPSB2aWV3UG9ydEhlaWdodDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2FmZVdpZHRoID0gdmlld1BvcnRXaWR0aDsKLSAgICAgICAgICAgICAgICBzYWZlSGVpZ2h0ID0gdmlld1BvcnRXaWR0aCAqIDMgLyA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2FmZVdpZHRoICo9IFNBRkVfQVJFQV9SQVRJTzsKLSAgICAgICAgICAgIHNhZmVIZWlnaHQgKj0gU0FGRV9BUkVBX1JBVElPOwotICAgICAgICAgICAgaW50IGxlZnQgPSAodmlld1BvcnRXaWR0aCAtIHNhZmVXaWR0aCkgLyAyOwotICAgICAgICAgICAgaW50IHRvcCA9ICh2aWV3UG9ydEhlaWdodCAtIHNhZmVIZWlnaHQpIC8gMjsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5sYXlvdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgdG9wICsgc2FmZUhlaWdodCAqIGkgLyBNQVhfUk9XUywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKyBzYWZlV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICB0b3AgKyBzYWZlSGVpZ2h0ICogKGkgKyAxKSAvIE1BWF9ST1dTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvTWVkaWFUaW1lUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvTWVkaWFUaW1lUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzNmQ3Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL01lZGlhVGltZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlOwotCi0vLyBOb3RlOiBUaGlzIGlzIGp1c3QgY29waWVkIGZyb20gYW5kcm9pZC5tZWRpYS5NZWRpYVRpbWVQcm92aWRlci4KLXB1YmxpYyBpbnRlcmZhY2UgTWVkaWFUaW1lUHJvdmlkZXIgewotICAgIC8vIHdlIGRvIG5vdCBhbGxvdyBuZWdhdGl2ZSBtZWRpYSB0aW1lCi0gICAgLyoqCi0gICAgICogUHJlc2VudGF0aW9uIHRpbWUgdmFsdWUgaWYgbm8gdGltZWQgZXZlbnQgbm90aWZpY2F0aW9uIGlzIHJlcXVlc3RlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgTk9fVElNRSA9IC0xOwotCi0gICAgLyoqCi0gICAgICogQ2FuY2VscyBhbGwgcHJldmlvdXMgbm90aWZpY2F0aW9uIHJlcXVlc3QgZnJvbSB0aGlzIGxpc3RlbmVyIGlmIGFueS4gIEl0Ci0gICAgICogcmVnaXN0ZXJzIHRoZSBsaXN0ZW5lciB0byBnZXQgc2VlayBhbmQgc3RvcCBub3RpZmljYXRpb25zLiAgSWYgdGltZVVzIGlzCi0gICAgICogbm90IG5lZ2F0aXZlLCBpdCBhbHNvIHJlZ2lzdGVycyB0aGUgbGlzdGVuZXIgZm9yIGEgdGltZWQgZXZlbnQKLSAgICAgKiBub3RpZmljYXRpb24gd2hlbiB0aGUgcHJlc2VudGF0aW9uIHRpbWUgcmVhY2hlcyAoYmVjb21lcyBncmVhdGVyKSB0aGFuCi0gICAgICogdGhlIHZhbHVlIHNwZWNpZmllZC4gIFRoaXMgaGFwcGVucyBpbW1lZGlhdGVseSBpZiB0aGUgY3VycmVudCBtZWRpYSB0aW1lCi0gICAgICogaXMgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gdGltZVVzLgotICAgICAqCi0gICAgICogQHBhcmFtIHRpbWVVcyBwcmVzZW50YXRpb24gdGltZSB0byBnZXQgdGltZWQgZXZlbnQgY2FsbGJhY2sgYXQgKG9yCi0gICAgICogICAgICAgICAgICAgICB7QGxpbmsgI05PX1RJTUV9KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUF0KGxvbmcgdGltZVVzLCBPbk1lZGlhVGltZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIC8qKgotICAgICAqIENhbmNlbHMgYWxsIHByZXZpb3VzIG5vdGlmaWNhdGlvbiByZXF1ZXN0IGZyb20gdGhpcyBsaXN0ZW5lciBpZiBhbnkuICBJdAotICAgICAqIHJlZ2lzdGVycyB0aGUgbGlzdGVuZXIgdG8gZ2V0IHNlZWsgYW5kIHN0b3Agbm90aWZpY2F0aW9ucy4gIElmIHRoZSBtZWRpYQotICAgICAqIGlzIHN0b3BwZWQsIHRoZSBsaXN0ZW5lciB3aWxsIGltbWVkaWF0ZWx5IHJlY2VpdmUgYSBzdG9wIG5vdGlmaWNhdGlvbi4KLSAgICAgKiBPdGhlcndpc2UsIGl0IHdpbGwgcmVjZWl2ZSBhIHRpbWVkIGV2ZW50IG5vdGlmaWNhdG9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNjaGVkdWxlVXBkYXRlKE9uTWVkaWFUaW1lTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICogQ2FuY2VscyBhbGwgcHJldmlvdXMgbm90aWZpY2F0aW9uIHJlcXVlc3QgZnJvbSB0aGlzIGxpc3RlbmVyIGlmIGFueS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxOb3RpZmljYXRpb25zKE9uTWVkaWFUaW1lTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjdXJyZW50IHByZXNlbnRhdGlvbiB0aW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHByZWNpc2UgICBXaGV0aGVyIGdldHRpbmcgYSBwcmVjaXNlIHRpbWUgaXMgaW1wb3J0YW50LiBUaGlzIGlzCi0gICAgICogICAgICAgICAgICAgICAgICBtb3JlIGNvc3RseS4KLSAgICAgKiBAcGFyYW0gbW9ub3RvbmljIFdoZXRoZXIgcmV0dXJuZWQgdGltZSBzaG91bGQgYmUgbW9ub3RvbmljOiB0aGF0IGlzLAotICAgICAqICAgICAgICAgICAgICAgICAgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsYXN0IHJldHVybmVkIHRpbWUuICBEb24ndAotICAgICAqICAgICAgICAgICAgICAgICAgYWx3YXlzIHNldCB0aGlzIHRvIHRydWUuICBFLmcuIHRoaXMgaGFzIHVuZGVzaXJlZAotICAgICAqICAgICAgICAgICAgICAgICAgY29uc2VxdWVuY2VzIGlmIHRoZSBtZWRpYSBpcyBzZWVrZWQgYmV0d2VlbiBjYWxscy4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgbWVkaWEgaXMgbm90IGluaXRpYWxpemVkCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFRpbWVVcyhib29sZWFuIHByZWNpc2UsIGJvb2xlYW4gbW9ub3RvbmljKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE9uTWVkaWFUaW1lTGlzdGVuZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlZ2lzdGVyZWQgdGltZSB3YXMgcmVhY2hlZCBuYXR1cmFsbHkuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB0aW1lVXMgY3VycmVudCBtZWRpYSB0aW1lCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIG9uVGltZWRFdmVudChsb25nIHRpbWVVcyk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBtZWRpYSB0aW1lIGNoYW5nZWQgZHVlIHRvIHNlZWtpbmcuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB0aW1lVXMgY3VycmVudCBtZWRpYSB0aW1lCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIG9uU2Vlayhsb25nIHRpbWVVcyk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBwbGF5YmFjayBzdG9wcGVkLiAgVGhpcyBpcyBub3QgY2FsbGVkIG9uIHBhdXNlLCBvbmx5Ci0gICAgICAgICAqIG9uIGZ1bGwgc3RvcCwgYXQgd2hpY2ggcG9pbnQgdGhlcmUgaXMgbm8gZnVydGhlciBjdXJyZW50IG1lZGlhIHRpbWUuCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIG9uU3RvcCgpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZUNvbnRyb2xsZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZDU1ZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZUNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMi5UcmFja0luZm87Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLlN1YnRpdGxlVHJhY2suUmVuZGVyaW5nV2lkZ2V0OwotCi0vLyBOb3RlOiBUaGlzIGlzIGZvcmtlZCBmcm9tIGFuZHJvaWQubWVkaWEuU3VidGl0bGVDb250cm9sbGVyIHNpbmNlIFAKLS8qKgotICogVGhlIHN1YnRpdGxlIGNvbnRyb2xsZXIgcHJvdmlkZXMgdGhlIGFyY2hpdGVjdHVyZSB0byBkaXNwbGF5IHN1YnRpdGxlcyBmb3IgYQotICogbWVkaWEgc291cmNlLiAgSXQgYWxsb3dzIHNwZWNpZnlpbmcgd2hpY2ggdHJhY2tzIHRvIGRpc3BsYXksIG9uIHdoaWNoIGFuY2hvcgotICogdG8gZGlzcGxheSB0aGVtLCBhbmQgYWxzbyBhbGxvd3MgYWRkaW5nIGV4dGVybmFsLCBvdXQtb2YtYmFuZCBzdWJ0aXRsZSB0cmFja3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJ0aXRsZUNvbnRyb2xsZXIgewotICAgIHByaXZhdGUgTWVkaWFUaW1lUHJvdmlkZXIgbVRpbWVQcm92aWRlcjsKLSAgICBwcml2YXRlIFZlY3RvcjxSZW5kZXJlcj4gbVJlbmRlcmVyczsKLSAgICBwcml2YXRlIFZlY3RvcjxTdWJ0aXRsZVRyYWNrPiBtVHJhY2tzOwotICAgIHByaXZhdGUgU3VidGl0bGVUcmFjayBtU2VsZWN0ZWRUcmFjazsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVNob3dpbmc7Ci0gICAgcHJpdmF0ZSBDYXB0aW9uaW5nTWFuYWdlciBtQ2FwdGlvbmluZ01hbmFnZXI7Ci0gICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdIQVRfU0hPVyA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdIQVRfSElERSA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdIQVRfU0VMRUNUX1RSQUNLID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9TRUxFQ1RfREVGQVVMVF9UUkFDSyA9IDQ7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIuQ2FsbGJhY2sgbUNhbGxiYWNrID0gbmV3IEhhbmRsZXIuQ2FsbGJhY2soKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICBjYXNlIFdIQVRfU0hPVzoKLSAgICAgICAgICAgICAgICBkb1Nob3coKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGNhc2UgV0hBVF9ISURFOgotICAgICAgICAgICAgICAgIGRvSGlkZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBXSEFUX1NFTEVDVF9UUkFDSzoKLSAgICAgICAgICAgICAgICBkb1NlbGVjdFRyYWNrKChTdWJ0aXRsZVRyYWNrKW1zZy5vYmopOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBXSEFUX1NFTEVDVF9ERUZBVUxUX1RSQUNLOgotICAgICAgICAgICAgICAgIGRvU2VsZWN0RGVmYXVsdFRyYWNrKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIENhcHRpb25pbmdNYW5hZ2VyLkNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lciBtQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyID0KLSAgICAgICAgbmV3IENhcHRpb25pbmdNYW5hZ2VyLkNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25FbmFibGVkQ2hhbmdlZChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBzZWxlY3REZWZhdWx0VHJhY2soKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkxvY2FsZUNoYW5nZWQoTG9jYWxlIGxvY2FsZSkgewotICAgICAgICAgICAgICAgIHNlbGVjdERlZmF1bHRUcmFjaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgcHVibGljIFN1YnRpdGxlQ29udHJvbGxlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgc3VidGl0bGUgY29udHJvbGxlciBmb3IgYSBtZWRpYSBwbGF5YmFjayBvYmplY3QgdGhhdCBpbXBsZW1lbnRzCi0gICAgICogdGhlIE1lZGlhVGltZVByb3ZpZGVyIGludGVyZmFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aW1lUHJvdmlkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgU3VidGl0bGVDb250cm9sbGVyKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgTWVkaWFUaW1lUHJvdmlkZXIgdGltZVByb3ZpZGVyLAotICAgICAgICAgICAgTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbVRpbWVQcm92aWRlciA9IHRpbWVQcm92aWRlcjsKLSAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0KLSAgICAgICAgbVJlbmRlcmVycyA9IG5ldyBWZWN0b3I8UmVuZGVyZXI+KCk7Ci0gICAgICAgIG1TaG93aW5nID0gZmFsc2U7Ci0gICAgICAgIG1UcmFja3MgPSBuZXcgVmVjdG9yPFN1YnRpdGxlVHJhY2s+KCk7Ci0gICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlciA9Ci0gICAgICAgICAgICAoQ2FwdGlvbmluZ01hbmFnZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0FQVElPTklOR19TRVJWSUNFKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBtQ2FwdGlvbmluZ01hbmFnZXIucmVtb3ZlQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgIG1DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIpOwotICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGF2YWlsYWJsZSBzdWJ0aXRsZSB0cmFja3MgZm9yIHRoaXMgbWVkaWEuIFRoZXNlIGluY2x1ZGUKLSAgICAgKiB0aGUgdHJhY2tzIGZvdW5kIGJ5IHtAbGluayBNZWRpYVBsYXllcn0gYXMgd2VsbCBhcyBhbnkgdHJhY2tzIGFkZGVkCi0gICAgICogbWFudWFsbHkgdmlhIHtAbGluayAjYWRkVHJhY2t9LgotICAgICAqLwotICAgIHB1YmxpYyBTdWJ0aXRsZVRyYWNrW10gZ2V0VHJhY2tzKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobVRyYWNrcykgewotICAgICAgICAgICAgU3VidGl0bGVUcmFja1tdIHRyYWNrcyA9IG5ldyBTdWJ0aXRsZVRyYWNrW21UcmFja3Muc2l6ZSgpXTsKLSAgICAgICAgICAgIG1UcmFja3MudG9BcnJheSh0cmFja3MpOwotICAgICAgICAgICAgcmV0dXJuIHRyYWNrczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzdWJ0aXRsZSB0cmFjawotICAgICAqLwotICAgIHB1YmxpYyBTdWJ0aXRsZVRyYWNrIGdldFNlbGVjdGVkVHJhY2soKSB7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0ZWRUcmFjazsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlbmRlcmluZ1dpZGdldCBnZXRSZW5kZXJpbmdXaWRnZXQoKSB7Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVNlbGVjdGVkVHJhY2suZ2V0UmVuZGVyaW5nV2lkZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VsZWN0cyBhIHN1YnRpdGxlIHRyYWNrLiAgQXMgYSByZXN1bHQsIHRoaXMgdHJhY2sgd2lsbCByZWNlaXZlCi0gICAgICogaW4tYmFuZCBkYXRhIGZyb20gdGhlIHtAbGluayBNZWRpYVBsYXllcn0uICBIb3dldmVyLCB0aGlzIGRvZXMKLSAgICAgKiBub3QgY2hhbmdlIHRoZSBzdWJ0aXRsZSB2aXNpYmlsaXR5LgotICAgICAqCi0gICAgICogU2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSBhbmNob3IncyAoVUkpIHRocmVhZC4ge0BzZWUgI0FuY2hvci5nZXRTdWJ0aXRsZUxvb3Blcn0KLSAgICAgKgotICAgICAqIEBwYXJhbSB0cmFjayBUaGUgc3VidGl0bGUgdHJhY2sgdG8gc2VsZWN0LiAgVGhpcyBtdXN0IGJlIG9uZSBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgdHJhY2tzIGluIHtAbGluayAjZ2V0VHJhY2tzfS4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRyYWNrIHdhcyBzdWNjZXNzZnVsbHkgc2VsZWN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0VHJhY2soU3VidGl0bGVUcmFjayB0cmFjaykgewotICAgICAgICBpZiAodHJhY2sgIT0gbnVsbCAmJiAhbVRyYWNrcy5jb250YWlucyh0cmFjaykpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb2Nlc3NPbkFuY2hvcihtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFdIQVRfU0VMRUNUX1RSQUNLLCB0cmFjaykpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9TZWxlY3RUcmFjayhTdWJ0aXRsZVRyYWNrIHRyYWNrKSB7Ci0gICAgICAgIG1UcmFja0lzRXhwbGljaXQgPSB0cnVlOwotICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgPT0gdHJhY2spIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5oaWRlKCk7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5zZXRUaW1lUHJvdmlkZXIobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtU2VsZWN0ZWRUcmFjayA9IHRyYWNrOwotICAgICAgICBpZiAobUFuY2hvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQW5jaG9yLnNldFN1YnRpdGxlV2lkZ2V0KGdldFJlbmRlcmluZ1dpZGdldCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5zZXRUaW1lUHJvdmlkZXIobVRpbWVQcm92aWRlcik7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5zaG93KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lci5vblN1YnRpdGxlVHJhY2tTZWxlY3RlZCh0cmFjayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHN1YnRpdGxlIHRyYWNrIGJhc2VkIG9uIHN5c3RlbSBwcmVmZXJlbmNlcywgb3IgbnVsbCwKLSAgICAgKiBpZiBubyBzdWNoIHRyYWNrIGV4aXN0cyBpbiB0aGlzIG1hbmFnZXIuCi0gICAgICoKLSAgICAgKiBTdXBwb3J0cyBITFMtZmxhZ3M6IEFVVE9TRUxFQ1QsIEZPUkNFRCAmIERFRkFVTFQuCi0gICAgICoKLSAgICAgKiAxLiBJZiBjYXB0aW9uaW5nIGlzIGRpc2FibGVkLCBvbmx5IGNvbnNpZGVyIEZPUkNFRCB0cmFja3MuIE90aGVyd2lzZSwKLSAgICAgKiBjb25zaWRlciBhbGwgdHJhY2tzLCBidXQgcHJlZmVyIG5vbi1GT1JDRUQgb25lcy4KLSAgICAgKiAyLiBJZiB1c2VyIHNlbGVjdGVkICJEZWZhdWx0IiBjYXB0aW9uIGxhbmd1YWdlOgotICAgICAqICAgYS4gSWYgdGhlcmUgaXMgYSBjb25zaWRlcmVkIHRyYWNrIHdpdGggREVGQVVMVD15ZXMsIHJldHVybnMgdGhhdCB0cmFjawotICAgICAqICAgICAgKGZhdm9yIHRoZSBmaXJzdCBvbmUgaW4gdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbgotICAgICAqICAgICAgb25lIGRlZmF1bHQgdHJhY2tzLCBvciB0aGUgZmlyc3QgaW4gZ2VuZXJhbCBpZiBub25lIG9mIHRoZW0gYXJlIGluCi0gICAgICogICAgICB0aGUgY3VycmVudCBsYW5ndWFnZSkuCi0gICAgICogICBiLiBPdGhlcndpc2UsIGlmIHRoZXJlIGlzIGEgdHJhY2sgd2l0aCBBVVRPU0VMRUNUPXllcyBpbiB0aGUgY3VycmVudAotICAgICAqICAgICAgbGFuZ3VhZ2UsIHJldHVybiB0aGF0IG9uZS4KLSAgICAgKiAgIGMuIElmIHRoZXJlIGFyZSBubyBkZWZhdWx0IHRyYWNrcywgYW5kIG5vIGF1dG9zZWxlY3RhYmxlIHRyYWNrcyBpbiB0aGUKLSAgICAgKiAgICAgIGN1cnJlbnQgbGFuZ3VhZ2UsIHJldHVybiBudWxsLgotICAgICAqIDMuIElmIHRoZXJlIGlzIGEgdHJhY2sgd2l0aCB0aGUgY2FwdGlvbiBsYW5ndWFnZSwgc2VsZWN0IHRoYXQgb25lLiAgUHJlZmVyCi0gICAgICogdGhlIG9uZSB3aXRoIEFVVE9TRUxFQ1Q9bm8uCi0gICAgICoKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZXNlIGZsYWdzIGFyZSBERUZBVUxUPW5vLCBBVVRPU0VMRUNUPXllcwotICAgICAqIGFuZCBGT1JDRUQ9bm8uCi0gICAgICovCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2sgZ2V0RGVmYXVsdFRyYWNrKCkgewotICAgICAgICBTdWJ0aXRsZVRyYWNrIGJlc3RUcmFjayA9IG51bGw7Ci0gICAgICAgIGludCBiZXN0U2NvcmUgPSAtMTsKLQotICAgICAgICBMb2NhbGUgc2VsZWN0ZWRMb2NhbGUgPSBtQ2FwdGlvbmluZ01hbmFnZXIuZ2V0TG9jYWxlKCk7Ci0gICAgICAgIExvY2FsZSBsb2NhbGUgPSBzZWxlY3RlZExvY2FsZTsKLSAgICAgICAgaWYgKGxvY2FsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gc2VsZWN0Rm9yY2VkID0gIW1DYXB0aW9uaW5nTWFuYWdlci5pc0VuYWJsZWQoKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVRyYWNrcykgewotICAgICAgICAgICAgZm9yIChTdWJ0aXRsZVRyYWNrIHRyYWNrOiBtVHJhY2tzKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFGb3JtYXQgZm9ybWF0ID0gdHJhY2suZ2V0Rm9ybWF0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTEFOR1VBR0UpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZm9yY2VkID0KLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSwgMCkgIT0gMDsKLSAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9zZWxlY3QgPQotICAgICAgICAgICAgICAgICAgICBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSVNfQVVUT1NFTEVDVCwgMSkgIT0gMDsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzX2RlZmF1bHQgPQotICAgICAgICAgICAgICAgICAgICBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSVNfREVGQVVMVCwgMCkgIT0gMDsKLQotICAgICAgICAgICAgICAgIGJvb2xlYW4gbGFuZ3VhZ2VNYXRjaGVzID0KLSAgICAgICAgICAgICAgICAgICAgKGxvY2FsZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsZS5nZXRMYW5ndWFnZSgpLmVxdWFscygiIikgfHwKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxlLmdldElTTzNMYW5ndWFnZSgpLmVxdWFscyhsYW5ndWFnZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxlLmdldExhbmd1YWdlKCkuZXF1YWxzKGxhbmd1YWdlKSk7Ci0gICAgICAgICAgICAgICAgLy8gaXNfZGVmYXVsdCBpcyBtZWFuaW5nbGVzcyB1bmxlc3MgY2FwdGlvbiBsYW5ndWFnZSBpcyAnZGVmYXVsdCcKLSAgICAgICAgICAgICAgICBpbnQgc2NvcmUgPSAoZm9yY2VkID8gMCA6IDgpICsKLSAgICAgICAgICAgICAgICAgICAgKCgoc2VsZWN0ZWRMb2NhbGUgPT0gbnVsbCkgJiYgaXNfZGVmYXVsdCkgPyA0IDogMCkgKwotICAgICAgICAgICAgICAgICAgICAoYXV0b3NlbGVjdCA/IDAgOiAyKSArIChsYW5ndWFnZU1hdGNoZXMgPyAxIDogMCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0Rm9yY2VkICYmICFmb3JjZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gd2UgdHJlYXQgbnVsbCBsb2NhbGUvbGFuZ3VhZ2UgYXMgbWF0Y2hpbmcgYW55IGxhbmd1YWdlCi0gICAgICAgICAgICAgICAgaWYgKChzZWxlY3RlZExvY2FsZSA9PSBudWxsICYmIGlzX2RlZmF1bHQpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChsYW5ndWFnZU1hdGNoZXMgJiYKLSAgICAgICAgICAgICAgICAgICAgIChhdXRvc2VsZWN0IHx8IGZvcmNlZCB8fCBzZWxlY3RlZExvY2FsZSAhPSBudWxsKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3JlID4gYmVzdFNjb3JlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZXN0U2NvcmUgPSBzY29yZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RUcmFjayA9IHRyYWNrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiZXN0VHJhY2s7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1UcmFja0lzRXhwbGljaXQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gZmFsc2U7Ci0KLSAgICAvKiogc2hvdWxkIGJlIGNhbGxlZCBmcm9tIGFuY2hvciB0aHJlYWQgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3REZWZhdWx0VHJhY2soKSB7Ci0gICAgICAgIHByb2Nlc3NPbkFuY2hvcihtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFdIQVRfU0VMRUNUX0RFRkFVTFRfVFJBQ0spKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9TZWxlY3REZWZhdWx0VHJhY2soKSB7Ci0gICAgICAgIGlmIChtVHJhY2tJc0V4cGxpY2l0KSB7Ci0gICAgICAgICAgICAvLyBJZiB0cmFjayBzZWxlY3Rpb24gaXMgZXhwbGljaXQsIGJ1dCB2aXNpYmlsaXR5Ci0gICAgICAgICAgICAvLyBpcyBub3QsIGl0IGZhbGxzIGJhY2sgdG8gdGhlIGNhcHRpb25pbmcgc2V0dGluZwotICAgICAgICAgICAgaWYgKCFtVmlzaWJpbGl0eUlzRXhwbGljaXQpIHsKLSAgICAgICAgICAgICAgICBpZiAobUNhcHRpb25pbmdNYW5hZ2VyLmlzRW5hYmxlZCgpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5nZXRGb3JtYXQoKS5nZXRJbnRlZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhRm9ybWF0LktFWV9JU19GT1JDRURfU1VCVElUTEUsIDApICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNob3coKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG1TZWxlY3RlZFRyYWNrLmdldFRyYWNrVHlwZSgpID09IFRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhpZGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBjYW4gaGF2ZSBhIGRlZmF1bHQgKGZvcmNlZCkgdHJhY2sgZXZlbiBpZiBjYXB0aW9uaW5nCi0gICAgICAgIC8vIGlzIG5vdCBlbmFibGVkLiAgVGhpcyBpcyBoYW5kbGVkIGJ5IGdldERlZmF1bHRUcmFjaygpLgotICAgICAgICAvLyBTaG93IHRoaXMgdHJhY2sgdW5sZXNzIHN1YnRpdGxlcyB3ZXJlIGV4cGxpY2l0bHkgaGlkZGVuLgotICAgICAgICBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gZ2V0RGVmYXVsdFRyYWNrKCk7Ci0gICAgICAgIGlmICh0cmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZWxlY3RUcmFjayh0cmFjayk7Ci0gICAgICAgICAgICBtVHJhY2tJc0V4cGxpY2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoIW1WaXNpYmlsaXR5SXNFeHBsaWNpdCkgewotICAgICAgICAgICAgICAgIHNob3coKTsKLSAgICAgICAgICAgICAgICBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBtdXN0IGJlIGNhbGxlZCBmcm9tIGFuY2hvciB0aHJlYWQgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgY2hlY2tBbmNob3JMb29wZXIoKTsKLSAgICAgICAgaGlkZSgpOwotICAgICAgICBzZWxlY3RUcmFjayhudWxsKTsKLSAgICAgICAgbVRyYWNrcy5jbGVhcigpOwotICAgICAgICBtVHJhY2tJc0V4cGxpY2l0ID0gZmFsc2U7Ci0gICAgICAgIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IGZhbHNlOwotICAgICAgICBtQ2FwdGlvbmluZ01hbmFnZXIucmVtb3ZlQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgIG1DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBuZXcsIGV4dGVybmFsIHN1YnRpdGxlIHRyYWNrIHRvIHRoZSBtYW5hZ2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIGZvcm1hdCB0aGUgZm9ybWF0IG9mIHRoZSB0cmFjayB0aGF0IHdpbGwgaW5jbHVkZSBhdCBsZWFzdAotICAgICAqICAgICAgICAgICAgICAgdGhlIE1JTUUgdHlwZSB7QGxpbmsgTWVkaWFGb3JtYXRAS0VZX01JTUV9LgotICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQge0BsaW5rIFN1YnRpdGxlVHJhY2t9IG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBTdWJ0aXRsZVRyYWNrIGFkZFRyYWNrKE1lZGlhRm9ybWF0IGZvcm1hdCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobVJlbmRlcmVycykgewotICAgICAgICAgICAgZm9yIChSZW5kZXJlciByZW5kZXJlcjogbVJlbmRlcmVycykgewotICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlci5zdXBwb3J0cyhmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN1YnRpdGxlVHJhY2sgdHJhY2sgPSByZW5kZXJlci5jcmVhdGVUcmFjayhmb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkKG1UcmFja3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRyYWNrcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FwdGlvbmluZ01hbmFnZXIuYWRkQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tzLmFkZCh0cmFjayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhY2s7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyB0aGUgc2VsZWN0ZWQgKG9yIGRlZmF1bHQpIHN1YnRpdGxlIHRyYWNrLgotICAgICAqCi0gICAgICogU2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSBhbmNob3IncyAoVUkpIHRocmVhZC4ge0BzZWUgI0FuY2hvci5nZXRTdWJ0aXRsZUxvb3Blcn0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzaG93KCkgewotICAgICAgICBwcm9jZXNzT25BbmNob3IobUhhbmRsZXIub2J0YWluTWVzc2FnZShXSEFUX1NIT1cpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9TaG93KCkgewotICAgICAgICBtU2hvd2luZyA9IHRydWU7Ci0gICAgICAgIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IHRydWU7Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5zaG93KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIaWRlIHRoZSBzZWxlY3RlZCAob3IgZGVmYXVsdCkgc3VidGl0bGUgdHJhY2suCi0gICAgICoKLSAgICAgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIChVSSkgdGhyZWFkLiB7QHNlZSAjQW5jaG9yLmdldFN1YnRpdGxlTG9vcGVyfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7Ci0gICAgICAgIHByb2Nlc3NPbkFuY2hvcihtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFdIQVRfSElERSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb0hpZGUoKSB7Ci0gICAgICAgIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IHRydWU7Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5oaWRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVNob3dpbmcgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgZm9yIHN1cHBvcnRpbmcgYSBzaW5nbGUgb3IgbXVsdGlwbGUgc3VidGl0bGUgdHlwZXMgaW4ge0BsaW5rCi0gICAgICogTWVkaWFQbGF5ZXJ9LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgUmVuZGVyZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIGJ5IHtAbGluayBNZWRpYVBsYXllcn0ncyB7QGxpbmsgU3VidGl0bGVDb250cm9sbGVyfSB3aGVuIGEgbmV3Ci0gICAgICAgICAqIHN1YnRpdGxlIHRyYWNrIGlzIGRldGVjdGVkLCB0byBzZWUgaWYgaXQgc2hvdWxkIHVzZSB0aGlzIG9iamVjdCB0bwotICAgICAgICAgKiBwYXJzZSBhbmQgZGlzcGxheSB0aGlzIHN1YnRpdGxlIHRyYWNrLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZm9ybWF0IHRoZSBmb3JtYXQgb2YgdGhlIHRyYWNrIHRoYXQgd2lsbCBpbmNsdWRlIGF0IGxlYXN0Ci0gICAgICAgICAqICAgICAgICAgICAgICAgdGhlIE1JTUUgdHlwZSB7QGxpbmsgTWVkaWFGb3JtYXRAS0VZX01JTUV9LgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIHRyYWNrIGZvcm1hdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcwotICAgICAgICAgKiByZW5kZXJlcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHMoTWVkaWFGb3JtYXQgZm9ybWF0KTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIGJ5IHtAbGluayBNZWRpYVBsYXllcn0ncyB7QGxpbmsgU3VidGl0bGVDb250cm9sbGVyfSBmb3IgZWFjaAotICAgICAgICAgKiBzdWJ0aXRsZSB0cmFjayB0aGF0IHdhcyBkZXRlY3RlZCBhbmQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgb2JqZWN0IHRvCi0gICAgICAgICAqIGNyZWF0ZSBhIHtAbGluayBTdWJ0aXRsZVRyYWNrfSBvYmplY3QuICBUaGlzIG9iamVjdCB3aWxsIGJlIGNyZWF0ZWQKLSAgICAgICAgICogZm9yIGVhY2ggdHJhY2sgdGhhdCB3YXMgZm91bmQuICBJZiB0aGUgdHJhY2sgaXMgc2VsZWN0ZWQgZm9yIGRpc3BsYXksCi0gICAgICAgICAqIHRoaXMgb2JqZWN0IHdpbGwgYmUgdXNlZCB0byBwYXJzZSBhbmQgZGlzcGxheSB0aGUgdHJhY2sgZGF0YS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGZvcm1hdCB0aGUgZm9ybWF0IG9mIHRoZSB0cmFjayB0aGF0IHdpbGwgaW5jbHVkZSBhdCBsZWFzdAotICAgICAgICAgKiAgICAgICAgICAgICAgIHRoZSBNSU1FIHR5cGUge0BsaW5rIE1lZGlhRm9ybWF0QEtFWV9NSU1FfS4KLSAgICAgICAgICogQHJldHVybiBhIHtAbGluayBTdWJ0aXRsZVRyYWNrfSBvYmplY3QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcGFyc2UKLSAgICAgICAgICogYW5kIHJlbmRlciB0aGUgc3VidGl0bGUgdHJhY2suCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgU3VidGl0bGVUcmFjayBjcmVhdGVUcmFjayhNZWRpYUZvcm1hdCBmb3JtYXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBzdXBwb3J0IGZvciBhIHN1YnRpdGxlIGZvcm1hdCBpbiB7QGxpbmsgTWVkaWFQbGF5ZXJ9LgotICAgICAqCi0gICAgICogQHBhcmFtIHJlbmRlcmVyIGEge0BsaW5rIFN1YnRpdGxlQ29udHJvbGxlci5SZW5kZXJlcn0gb2JqZWN0IHRoYXQgYWRkcwotICAgICAqICAgICAgICAgICAgICAgICBzdXBwb3J0IGZvciBhIHN1YnRpdGxlIGZvcm1hdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlclJlbmRlcmVyKFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGhvdyB0byBnZXQgYXZhaWxhYmxlIHJlbmRlcmVycyBpbiB0aGUgc3lzdGVtCi0gICAgICAgICAgICBpZiAoIW1SZW5kZXJlcnMuY29udGFpbnMocmVuZGVyZXIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBzaG91bGQgYWRkZWQgcmVuZGVyZXJzIG92ZXJyaWRlIGV4aXN0aW5nIG9uZXMgKHRvIGFsbG93IHJlcGxhY2luZz8pCi0gICAgICAgICAgICAgICAgbVJlbmRlcmVycy5hZGQocmVuZGVyZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUmVuZGVyZXJGb3IoTWVkaWFGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGhvdyB0byBnZXQgYXZhaWxhYmxlIHJlbmRlcmVycyBpbiB0aGUgc3lzdGVtCi0gICAgICAgICAgICBmb3IgKFJlbmRlcmVyIHJlbmRlcmVyOiBtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyLnN1cHBvcnRzKGZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3VidGl0bGUgYW5jaG9yLCBhbiBvYmplY3QgdGhhdCBpcyBhYmxlIHRvIGRpc3BsYXkgYSBzdWJ0aXRsZSByZW5kZXJlciwKLSAgICAgKiBlLmcuIGEgVmlkZW9WaWV3LgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgQW5jaG9yIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuY2hvciBzaG91bGQgdXNlIHRoZSBzdXBwbGllZCBzdWJ0aXRsZSByZW5kZXJpbmcgd2lkZ2V0LCBvcgotICAgICAgICAgKiBub25lIGlmIGl0IGlzIG51bGwuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZVdpZGdldChSZW5kZXJpbmdXaWRnZXQgc3VidGl0bGVXaWRnZXQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbmNob3JzIHByb3ZpZGUgdGhlIGxvb3BlciBvbiB3aGljaCBhbGwgdHJhY2sgdmlzaWJpbGl0eSBjaGFuZ2VzCi0gICAgICAgICAqICh0cmFjay5zaG93L2hpZGUsIHNldFN1YnRpdGxlV2lkZ2V0KSB3aWxsIHRha2UgcGxhY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTG9vcGVyIGdldFN1YnRpdGxlTG9vcGVyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBbmNob3IgbUFuY2hvcjsKLQotICAgIC8qKgotICAgICAqICBjYWxsZWQgZnJvbSBhbmNob3IncyBsb29wZXIgKGlmIGFueSwgYm90aCB3aGVuIHVuc2V0dGluZyBhbmQKLSAgICAgKiAgc2V0dGluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbmNob3IoQW5jaG9yIGFuY2hvcikgewotICAgICAgICBpZiAobUFuY2hvciA9PSBhbmNob3IpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQW5jaG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNoZWNrQW5jaG9yTG9vcGVyKCk7Ci0gICAgICAgICAgICBtQW5jaG9yLnNldFN1YnRpdGxlV2lkZ2V0KG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIG1BbmNob3IgPSBhbmNob3I7Ci0gICAgICAgIG1IYW5kbGVyID0gbnVsbDsKLSAgICAgICAgaWYgKG1BbmNob3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihtQW5jaG9yLmdldFN1YnRpdGxlTG9vcGVyKCksIG1DYWxsYmFjayk7Ci0gICAgICAgICAgICBjaGVja0FuY2hvckxvb3BlcigpOwotICAgICAgICAgICAgbUFuY2hvci5zZXRTdWJ0aXRsZVdpZGdldChnZXRSZW5kZXJpbmdXaWRnZXQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tBbmNob3JMb29wZXIoKSB7Ci0gICAgICAgIGFzc2VydCBtSGFuZGxlciAhPSBudWxsIDogIlNob3VsZCBoYXZlIGEgbG9vcGVyIGFscmVhZHkiOwotICAgICAgICBhc3NlcnQgTG9vcGVyLm15TG9vcGVyKCkgPT0gbUhhbmRsZXIuZ2V0TG9vcGVyKCkKLSAgICAgICAgICAgICAgICA6ICJNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBhbmNob3IncyBsb29wZXIiOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzT25BbmNob3IoTWVzc2FnZSBtKSB7Ci0gICAgICAgIGFzc2VydCBtSGFuZGxlciAhPSBudWxsIDogIlNob3VsZCBoYXZlIGEgbG9vcGVyIGFscmVhZHkiOwotICAgICAgICBpZiAoTG9vcGVyLm15TG9vcGVyKCkgPT0gbUhhbmRsZXIuZ2V0TG9vcGVyKCkpIHsKLSAgICAgICAgICAgIG1IYW5kbGVyLmRpc3BhdGNoTWVzc2FnZShtKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludGVyZmFjZSBMaXN0ZW5lciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIHN1YnRpdGxlIHRyYWNrIGhhcyBiZWVuIHNlbGVjdGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdHJhY2sgc2VsZWN0ZWQgc3VidGl0bGUgdHJhY2sgb3IgbnVsbAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TdWJ0aXRsZVRyYWNrU2VsZWN0ZWQoU3VidGl0bGVUcmFjayB0cmFjayk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0ZW5lciBtTGlzdGVuZXI7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL1N1YnRpdGxlVHJhY2suamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVUcmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjkwNjRhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVUcmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGU7Ci0KLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyLlRyYWNrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlN1YnRpdGxlRGF0YTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9uZ1NwYXJzZUFycmF5OwotaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLy8gTm90ZTogVGhpcyBpcyBmb3JrZWQgZnJvbSBhbmRyb2lkLm1lZGlhLlN1YnRpdGxlVHJhY2sgc2luY2UgUAotLyoqCi0gKiBBIHN1YnRpdGxlIHRyYWNrIGFic3RyYWN0IGJhc2UgY2xhc3MgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgcGFyc2luZyBhbmQgZGlzcGxheWluZwotICogYW4gaW5zdGFuY2Ugb2YgYSBwYXJ0aWN1bGFyIHR5cGUgb2Ygc3VidGl0bGUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdWJ0aXRsZVRyYWNrIGltcGxlbWVudHMgTWVkaWFUaW1lUHJvdmlkZXIuT25NZWRpYVRpbWVMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdWJ0aXRsZVRyYWNrIjsKLSAgICBwcml2YXRlIGxvbmcgbUxhc3RVcGRhdGVUaW1lTXM7Ci0gICAgcHJpdmF0ZSBsb25nIG1MYXN0VGltZU1zOwotCi0gICAgcHJpdmF0ZSBSdW5uYWJsZSBtUnVubmFibGU7Ci0KLSAgICBmaW5hbCBwcml2YXRlIExvbmdTcGFyc2VBcnJheTxSdW4+IG1SdW5zQnlFbmRUaW1lID0gbmV3IExvbmdTcGFyc2VBcnJheTxSdW4+KCk7Ci0gICAgZmluYWwgcHJpdmF0ZSBMb25nU3BhcnNlQXJyYXk8UnVuPiBtUnVuc0J5SUQgPSBuZXcgTG9uZ1NwYXJzZUFycmF5PFJ1bj4oKTsKLQotICAgIHByaXZhdGUgQ3VlTGlzdCBtQ3VlczsKLSAgICBmaW5hbCBwcml2YXRlIFZlY3RvcjxDdWU+IG1BY3RpdmVDdWVzID0gbmV3IFZlY3RvcjxDdWU+KCk7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbVZpc2libGU7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOwotCi0gICAgcHJpdmF0ZSBNZWRpYUZvcm1hdCBtRm9ybWF0OwotCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2soTWVkaWFGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgIG1DdWVzID0gbmV3IEN1ZUxpc3QoKTsKLSAgICAgICAgY2xlYXJBY3RpdmVDdWVzKCk7Ci0gICAgICAgIG1MYXN0VGltZU1zID0gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIE1lZGlhRm9ybWF0IGdldEZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Gb3JtYXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBsb25nIG1OZXh0U2NoZWR1bGVkVGltZU1zID0gLTE7Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkRhdGEoU3VidGl0bGVEYXRhIGRhdGEpIHsKLSAgICAgICAgbG9uZyBydW5JRCA9IGRhdGEuZ2V0U3RhcnRUaW1lVXMoKSArIDE7Ci0gICAgICAgIG9uRGF0YShkYXRhLmdldERhdGEoKSwgdHJ1ZSAvKiBlb3MgKi8sIHJ1bklEKTsKLSAgICAgICAgc2V0UnVuRGlzY2FyZFRpbWVNcygKLSAgICAgICAgICAgICAgICBydW5JRCwKLSAgICAgICAgICAgICAgICAoZGF0YS5nZXRTdGFydFRpbWVVcygpICsgZGF0YS5nZXREdXJhdGlvblVzKCkpIC8gMTAwMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlcmUgaXMgaW5wdXQgZGF0YSBmb3IgdGhlIHN1YnRpdGxlIHRyYWNrLiAgVGhlCi0gICAgICogY29tcGxldGUgc3VidGl0bGUgZm9yIGEgdHJhY2sgY2FuIGluY2x1ZGUgbXVsdGlwbGUgd2hvbGUgdW5pdHMKLSAgICAgKiAocnVucykuICBFYWNoIG9mIHRoZXNlIHVuaXRzIGNhbiBoYXZlIG11bHRpcGxlIHNlY3Rpb25zLiAgVGhlCi0gICAgICogY29udGVudHMgb2YgYSBydW4gYXJlIHN1Ym1pdHRlZCBpbiBzZXF1ZW50aWFsIG9yZGVyLCB3aXRoIGVvcwotICAgICAqIGluZGljYXRpbmcgdGhlIGxhc3Qgc2VjdGlvbiBvZiB0aGUgcnVuLiAgQ2FsbHMgZnJvbSBkaWZmZXJlbnQKLSAgICAgKiBydW5zIG11c3Qgbm90IGJlIGludGVybWl4ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YSBzdWJ0aXRsZSBkYXRhIGJ5dGUgYnVmZmVyCi0gICAgICogQHBhcmFtIGVvcyB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3Qgc2VjdGlvbiBvZiB0aGUgcnVuLgotICAgICAqIEBwYXJhbSBydW5JRCBtb3N0bHktdW5pcXVlIElEIGZvciB0aGlzIHJ1biBvZiBkYXRhLiAgU3VidGl0bGUgY3VlcwotICAgICAqICAgICAgICAgICAgICB3aXRoIHJ1bklEIG9mIDAgYXJlIGRpc2NhcmRlZCBpbW1lZGlhdGVseSBhZnRlcgotICAgICAqICAgICAgICAgICAgICBkaXNwbGF5LiAgQ3VlcyB3aXRoIHJ1bklEIG9mIH4wIGFyZSBkaXNjYXJkZWQKLSAgICAgKiAgICAgICAgICAgICAgb25seSBhdCB0aGUgZGVsZXRpb24gb2YgdGhlIHRyYWNrIG9iamVjdC4gIEN1ZXMKLSAgICAgKiAgICAgICAgICAgICAgd2l0aCBvdGhlciBydW5JRC1zIGFyZSBkaXNjYXJkZWQgYXQgdGhlIGVuZCBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgcnVuLCB3aGljaCBkZWZhdWx0cyB0byB0aGUgbGF0ZXN0IHRpbWVzdGFtcCBvZgotICAgICAqICAgICAgICAgICAgICBhbnkgb2YgaXRzIGN1ZXMgKHdpdGggdGhpcyBydW5JRCkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25EYXRhKGJ5dGVbXSBkYXRhLCBib29sZWFuIGVvcywgbG9uZyBydW5JRCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiBhZGRpbmcgdGhlIHN1YnRpdGxlIHJlbmRlcmluZyB3aWRnZXQgdG8gdGhlIHZpZXcgaGllcmFyY2h5LAotICAgICAqIGFzIHdlbGwgYXMgd2hlbiBzaG93aW5nIG9yIGhpZGluZyB0aGUgc3VidGl0bGUgdHJhY2ssIG9yIHdoZW4gdGhlIHZpZGVvCi0gICAgICogc3VyZmFjZSBwb3NpdGlvbiBoYXMgY2hhbmdlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHdpZGdldCB0aGF0IHJlbmRlcnMgdGhpcyBzdWJ0aXRsZSB0cmFjay4gRm9yIG1vc3QgcmVuZGVyZXJzCi0gICAgICogICAgICAgICB0aGVyZSBzaG91bGQgYmUgYSBzaW5nbGUgc2hhcmVkIGluc3RhbmNlIHRoYXQgaXMgdXNlZCBmb3IgYWxsCi0gICAgICogICAgICAgICB0cmFja3Mgc3VwcG9ydGVkIGJ5IHRoYXQgcmVuZGVyZXIsIGFzIGF0IG1vc3Qgb25lIHN1YnRpdGxlIHRyYWNrCi0gICAgICogICAgICAgICBpcyB2aXNpYmxlIGF0IG9uZSB0aW1lLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBSZW5kZXJpbmdXaWRnZXQgZ2V0UmVuZGVyaW5nV2lkZ2V0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZlIGN1ZXMgaGF2ZSBjaGFuZ2VkLCBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdWJ0aXRsZQotICAgICAqIHZpZXcgc2hvdWxkIGJlIHVwZGF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlVmlldyhWZWN0b3I8Q3VlPiBhY3RpdmVDdWVzKTsKLQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCB1cGRhdGVBY3RpdmVDdWVzKGJvb2xlYW4gcmVidWlsZCwgbG9uZyB0aW1lTXMpIHsKLSAgICAgICAgLy8gb3V0LW9mLW9yZGVyIHRpbWVzIG1lYW4gc2Vla2luZyBvciBuZXcgYWN0aXZlIGN1ZXMgYmVpbmcgYWRkZWQKLSAgICAgICAgLy8gKGR1cmluZyB0aGVpciBvd24gdGltZXNwYW4pCi0gICAgICAgIGlmIChyZWJ1aWxkIHx8IG1MYXN0VXBkYXRlVGltZU1zID4gdGltZU1zKSB7Ci0gICAgICAgICAgICBjbGVhckFjdGl2ZUN1ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvcihJdGVyYXRvcjxQYWlyPExvbmcsIEN1ZT4gPiBpdCA9Ci0gICAgICAgICAgICAgICAgbUN1ZXMuZW50cmllc0JldHdlZW4obUxhc3RVcGRhdGVUaW1lTXMsIHRpbWVNcykuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIFBhaXI8TG9uZywgQ3VlPiBldmVudCA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIEN1ZSBjdWUgPSBldmVudC5zZWNvbmQ7Ci0KLSAgICAgICAgICAgIGlmIChjdWUubUVuZFRpbWVNcyA9PSBldmVudC5maXJzdCkgewotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBwYXN0IGN1ZXMKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlJlbW92aW5nICIgKyBjdWUpOwotICAgICAgICAgICAgICAgIG1BY3RpdmVDdWVzLnJlbW92ZShjdWUpOwotICAgICAgICAgICAgICAgIGlmIChjdWUubVJ1bklEID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjdWUubVN0YXJ0VGltZU1zID09IGV2ZW50LmZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBjdWVzCi0gICAgICAgICAgICAgICAgLy8gVFJJQ0tZOiB0aGlzIHdpbGwgaGFwcGVuIGluIHN0YXJ0IG9yZGVyCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJBZGRpbmcgIiArIGN1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ZS5tSW5uZXJUaW1lc01zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VlLm9uVGltZSh0aW1lTXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQWN0aXZlQ3Vlcy5hZGQoY3VlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGN1ZSBpcyBtb2RpZmllZAotICAgICAgICAgICAgICAgIGN1ZS5vblRpbWUodGltZU1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNvbXBsZXRlIGFueSBydW5zICovCi0gICAgICAgIHdoaWxlIChtUnVuc0J5RW5kVGltZS5zaXplKCkgPiAwICYmCi0gICAgICAgICAgICAgICBtUnVuc0J5RW5kVGltZS5rZXlBdCgwKSA8PSB0aW1lTXMpIHsKLSAgICAgICAgICAgIHJlbW92ZVJ1bnNCeUVuZFRpbWVJbmRleCgwKTsgLy8gcmVtb3ZlcyBlbGVtZW50Ci0gICAgICAgIH0KLSAgICAgICAgbUxhc3RVcGRhdGVUaW1lTXMgPSB0aW1lTXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVJ1bnNCeUVuZFRpbWVJbmRleChpbnQgaXgpIHsKLSAgICAgICAgUnVuIHJ1biA9IG1SdW5zQnlFbmRUaW1lLnZhbHVlQXQoaXgpOwotICAgICAgICB3aGlsZSAocnVuICE9IG51bGwpIHsKLSAgICAgICAgICAgIEN1ZSBjdWUgPSBydW4ubUZpcnN0Q3VlOwotICAgICAgICAgICAgd2hpbGUgKGN1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1ZXMucmVtb3ZlKGN1ZSk7Ci0gICAgICAgICAgICAgICAgQ3VlIG5leHRDdWUgPSBjdWUubU5leHRJblJ1bjsKLSAgICAgICAgICAgICAgICBjdWUubU5leHRJblJ1biA9IG51bGw7Ci0gICAgICAgICAgICAgICAgY3VlID0gbmV4dEN1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SdW5zQnlJRC5yZW1vdmUocnVuLm1SdW5JRCk7Ci0gICAgICAgICAgICBSdW4gbmV4dFJ1biA9IHJ1bi5tTmV4dFJ1bkF0RW5kVGltZU1zOwotICAgICAgICAgICAgcnVuLm1QcmV2UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgcnVuLm1OZXh0UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgcnVuID0gbmV4dFJ1bjsKLSAgICAgICAgfQotICAgICAgICBtUnVuc0J5RW5kVGltZS5yZW1vdmVBdChpeCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLyogcmVtb3ZlIGFsbCBjdWVzICh1bnRhbmdsZSBhbGwgY3Jvc3MtbGlua3MpICovCi0gICAgICAgIGludCBzaXplID0gbVJ1bnNCeUVuZFRpbWUuc2l6ZSgpOwotICAgICAgICBmb3IoaW50IGl4ID0gc2l6ZSAtIDE7IGl4ID49IDA7IGl4LS0pIHsKLSAgICAgICAgICAgIHJlbW92ZVJ1bnNCeUVuZFRpbWVJbmRleChpeCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgdGFrZVRpbWUobG9uZyB0aW1lTXMpIHsKLSAgICAgICAgbUxhc3RUaW1lTXMgPSB0aW1lTXM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyQWN0aXZlQ3VlcygpIHsKLSAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJDbGVhcmluZyAiICsgbUFjdGl2ZUN1ZXMuc2l6ZSgpICsgIiBhY3RpdmUgY3VlcyIpOwotICAgICAgICBtQWN0aXZlQ3Vlcy5jbGVhcigpOwotICAgICAgICBtTGFzdFVwZGF0ZVRpbWVNcyA9IC0xOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNjaGVkdWxlVGltZWRFdmVudHMoKSB7Ci0gICAgICAgIC8qIGdldCB0aW1lcyBmb3IgdGhlIG5leHQgZXZlbnQgKi8KLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbU5leHRTY2hlZHVsZWRUaW1lTXMgPSBtQ3Vlcy5uZXh0VGltZUFmdGVyKG1MYXN0VGltZU1zKTsKLSAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAic2NoZWQgQCIgKyBtTmV4dFNjaGVkdWxlZFRpbWVNcyArICIgYWZ0ZXIgIiArIG1MYXN0VGltZU1zKTsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIubm90aWZ5QXQoCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0U2NoZWR1bGVkVGltZU1zID49IDAgPwotICAgICAgICAgICAgICAgICAgICAgICAgKG1OZXh0U2NoZWR1bGVkVGltZU1zICogMTAwMCkgOiBNZWRpYVRpbWVQcm92aWRlci5OT19USU1FLAotICAgICAgICAgICAgICAgICAgICB0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uVGltZWRFdmVudChsb25nIHRpbWVVcykgewotICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIm9uVGltZWRFdmVudCAiICsgdGltZVVzKTsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBsb25nIHRpbWVNcyA9IHRpbWVVcyAvIDEwMDA7Ci0gICAgICAgICAgICB1cGRhdGVBY3RpdmVDdWVzKGZhbHNlLCB0aW1lTXMpOwotICAgICAgICAgICAgdGFrZVRpbWUodGltZU1zKTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVWaWV3KG1BY3RpdmVDdWVzKTsKLSAgICAgICAgc2NoZWR1bGVUaW1lZEV2ZW50cygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2Vlayhsb25nIHRpbWVVcykgewotICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIm9uU2VlayAiICsgdGltZVVzKTsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBsb25nIHRpbWVNcyA9IHRpbWVVcyAvIDEwMDA7Ci0gICAgICAgICAgICB1cGRhdGVBY3RpdmVDdWVzKHRydWUsIHRpbWVNcyk7Ci0gICAgICAgICAgICB0YWtlVGltZSh0aW1lTXMpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVZpZXcobUFjdGl2ZUN1ZXMpOwotICAgICAgICBzY2hlZHVsZVRpbWVkRXZlbnRzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdG9wKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAib25TdG9wIik7Ci0gICAgICAgICAgICBjbGVhckFjdGl2ZUN1ZXMoKTsKLSAgICAgICAgICAgIG1MYXN0VGltZU1zID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlVmlldyhtQWN0aXZlQ3Vlcyk7Ci0gICAgICAgIG1OZXh0U2NoZWR1bGVkVGltZU1zID0gLTE7Ci0gICAgICAgIG1UaW1lUHJvdmlkZXIubm90aWZ5QXQoTWVkaWFUaW1lUHJvdmlkZXIuTk9fVElNRSwgdGhpcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1lZGlhVGltZVByb3ZpZGVyIG1UaW1lUHJvdmlkZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBzaG93KCkgewotICAgICAgICBpZiAobVZpc2libGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1WaXNpYmxlID0gdHJ1ZTsKLSAgICAgICAgUmVuZGVyaW5nV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCA9IGdldFJlbmRlcmluZ1dpZGdldCgpOwotICAgICAgICBpZiAocmVuZGVyaW5nV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlbmRlcmluZ1dpZGdldC5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIuc2NoZWR1bGVVcGRhdGUodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBoaWRlKCkgewotICAgICAgICBpZiAoIW1WaXNpYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVRpbWVQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGltZVByb3ZpZGVyLmNhbmNlbE5vdGlmaWNhdGlvbnModGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgUmVuZGVyaW5nV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCA9IGdldFJlbmRlcmluZ1dpZGdldCgpOwotICAgICAgICBpZiAocmVuZGVyaW5nV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlbmRlcmluZ1dpZGdldC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBtVmlzaWJsZSA9IGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhZGRDdWUoQ3VlIGN1ZSkgewotICAgICAgICBtQ3Vlcy5hZGQoY3VlKTsKLQotICAgICAgICBpZiAoY3VlLm1SdW5JRCAhPSAwKSB7Ci0gICAgICAgICAgICBSdW4gcnVuID0gbVJ1bnNCeUlELmdldChjdWUubVJ1bklEKTsKLSAgICAgICAgICAgIGlmIChydW4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJ1biA9IG5ldyBSdW4oKTsKLSAgICAgICAgICAgICAgICBtUnVuc0J5SUQucHV0KGN1ZS5tUnVuSUQsIHJ1bik7Ci0gICAgICAgICAgICAgICAgcnVuLm1FbmRUaW1lTXMgPSBjdWUubUVuZFRpbWVNczsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocnVuLm1FbmRUaW1lTXMgPCBjdWUubUVuZFRpbWVNcykgewotICAgICAgICAgICAgICAgIHJ1bi5tRW5kVGltZU1zID0gY3VlLm1FbmRUaW1lTXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGxpbmstdXAgY3VlcyBpbiB0aGUgc2FtZSBydW4KLSAgICAgICAgICAgIGN1ZS5tTmV4dEluUnVuID0gcnVuLm1GaXJzdEN1ZTsKLSAgICAgICAgICAgIHJ1bi5tRmlyc3RDdWUgPSBjdWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiBhIGN1ZSBpcyBhZGRlZCB0aGF0IHNob3VsZCBiZSB2aXNpYmxlLCBuZWVkIHRvIHJlZnJlc2ggdmlldwotICAgICAgICBsb25nIG5vd01zID0gLTE7Ci0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbm93TXMgPSBtVGltZVByb3ZpZGVyLmdldEN1cnJlbnRUaW1lVXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBwcmVjaXNlICovLCB0cnVlIC8qIG1vbm90b25pYyAqLykgLyAxMDAwOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBoYW5kbGUgYXMgaXQgd2UgYXJlIG5vdCBwbGF5aW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1WaXNpYmxlPSIgKyBtVmlzaWJsZSArICIsICIgKwotICAgICAgICAgICAgICAgIGN1ZS5tU3RhcnRUaW1lTXMgKyAiIDw9ICIgKyBub3dNcyArICIsICIgKwotICAgICAgICAgICAgICAgIGN1ZS5tRW5kVGltZU1zICsgIiA+PSAiICsgbUxhc3RUaW1lTXMpOwotCi0gICAgICAgIGlmIChtVmlzaWJsZSAmJgotICAgICAgICAgICAgICAgIGN1ZS5tU3RhcnRUaW1lTXMgPD0gbm93TXMgJiYKLSAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCB0cnVzdCBub3dNcywgc28gY2hlY2sgYW55IGN1ZSBzaW5jZSBsYXN0IGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgY3VlLm1FbmRUaW1lTXMgPj0gbUxhc3RUaW1lTXMpIHsKLSAgICAgICAgICAgIGlmIChtUnVubmFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUnVubmFibGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgU3VidGl0bGVUcmFjayB0cmFjayA9IHRoaXM7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIHRoZW5NcyA9IG5vd01zOwotICAgICAgICAgICAgbVJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiB3aXRoIHN5bmNocm9uaXplZCwgaXQgaXMgcG9zc2libGUgdGhhdCB3ZSBhcmUgZ29pbmcKLSAgICAgICAgICAgICAgICAgICAgLy8gdG8gZG8gbXVsdGlwbGUgdXBkYXRlcyBhcyB0aGUgcnVubmFibGUgY291bGQgYmUgYWxyZWFkeQotICAgICAgICAgICAgICAgICAgICAvLyBydW5uaW5nLgotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRyYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUnVubmFibGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQWN0aXZlQ3Vlcyh0cnVlLCB0aGVuTXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlVmlldyhtQWN0aXZlQ3Vlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgLy8gZGVsYXkgdXBkYXRlIHNvIHdlIGRvbid0IHVwZGF0ZSB2aWV3IG9uIGV2ZXJ5IGN1ZS4gIFRPRE8gd2h5IDEwPwotICAgICAgICAgICAgaWYgKG1IYW5kbGVyLnBvc3REZWxheWVkKG1SdW5uYWJsZSwgMTAgLyogZGVsYXkgKi8pKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJzY2hlZHVsaW5nIHVwZGF0ZSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy53KFRBRywgImZhaWxlZCB0byBzY2hlZHVsZSBzdWJ0aXRsZSB2aWV3IHVwZGF0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVZpc2libGUgJiYKLSAgICAgICAgICAgICAgICBjdWUubUVuZFRpbWVNcyA+PSBtTGFzdFRpbWVNcyAmJgotICAgICAgICAgICAgICAgIChjdWUubVN0YXJ0VGltZU1zIDwgbU5leHRTY2hlZHVsZWRUaW1lTXMgfHwKLSAgICAgICAgICAgICAgICAgbU5leHRTY2hlZHVsZWRUaW1lTXMgPCAwKSkgewotICAgICAgICAgICAgc2NoZWR1bGVUaW1lZEV2ZW50cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRUaW1lUHJvdmlkZXIoTWVkaWFUaW1lUHJvdmlkZXIgdGltZVByb3ZpZGVyKSB7Ci0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyID09IHRpbWVQcm92aWRlcikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIuY2FuY2VsTm90aWZpY2F0aW9ucyh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBtVGltZVByb3ZpZGVyID0gdGltZVByb3ZpZGVyOwotICAgICAgICBpZiAobVRpbWVQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGltZVByb3ZpZGVyLnNjaGVkdWxlVXBkYXRlKHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBzdGF0aWMgY2xhc3MgQ3VlTGlzdCB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ3VlTGlzdCI7Ci0gICAgICAgIC8vIHNpbXBsaXN0aWMsIGluZWZmaWNpZW50IGltcGxlbWVudGF0aW9uCi0gICAgICAgIHByaXZhdGUgU29ydGVkTWFwPExvbmcsIFZlY3RvcjxDdWU+ID4gbUN1ZXM7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGFkZEV2ZW50KEN1ZSBjdWUsIGxvbmcgdGltZU1zKSB7Ci0gICAgICAgICAgICBWZWN0b3I8Q3VlPiBjdWVzID0gbUN1ZXMuZ2V0KHRpbWVNcyk7Ci0gICAgICAgICAgICBpZiAoY3VlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY3VlcyA9IG5ldyBWZWN0b3I8Q3VlPigyKTsKLSAgICAgICAgICAgICAgICBtQ3Vlcy5wdXQodGltZU1zLCBjdWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vlcy5jb250YWlucyhjdWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90IGR1cGxpY2F0ZSBjdWVzCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjdWVzLmFkZChjdWUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcmVtb3ZlRXZlbnQoQ3VlIGN1ZSwgbG9uZyB0aW1lTXMpIHsKLSAgICAgICAgICAgIFZlY3RvcjxDdWU+IGN1ZXMgPSBtQ3Vlcy5nZXQodGltZU1zKTsKLSAgICAgICAgICAgIGlmIChjdWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjdWVzLnJlbW92ZShjdWUpOwotICAgICAgICAgICAgICAgIGlmIChjdWVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdWVzLnJlbW92ZSh0aW1lTXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZChDdWUgY3VlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUgbm9uLXBvc2l0aXZlLWR1cmF0aW9uIGN1ZXMKLSAgICAgICAgICAgIGlmIChjdWUubVN0YXJ0VGltZU1zID49IGN1ZS5tRW5kVGltZU1zKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaWYgKCFhZGRFdmVudChjdWUsIGN1ZS5tU3RhcnRUaW1lTXMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb25nIGxhc3RUaW1lTXMgPSBjdWUubVN0YXJ0VGltZU1zOwotICAgICAgICAgICAgaWYgKGN1ZS5tSW5uZXJUaW1lc01zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGxvbmcgdGltZU1zOiBjdWUubUlubmVyVGltZXNNcykgewotICAgICAgICAgICAgICAgICAgICBpZiAodGltZU1zID4gbGFzdFRpbWVNcyAmJiB0aW1lTXMgPCBjdWUubUVuZFRpbWVNcykgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXZlbnQoY3VlLCB0aW1lTXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFRpbWVNcyA9IHRpbWVNczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkRXZlbnQoY3VlLCBjdWUubUVuZFRpbWVNcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoQ3VlIGN1ZSkgewotICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCBjdWUubVN0YXJ0VGltZU1zKTsKLSAgICAgICAgICAgIGlmIChjdWUubUlubmVyVGltZXNNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChsb25nIHRpbWVNczogY3VlLm1Jbm5lclRpbWVzTXMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCB0aW1lTXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlbW92ZUV2ZW50KGN1ZSwgY3VlLm1FbmRUaW1lTXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEl0ZXJhYmxlPFBhaXI8TG9uZywgQ3VlPj4gZW50cmllc0JldHdlZW4oCi0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBsYXN0VGltZU1zLCBmaW5hbCBsb25nIHRpbWVNcykgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBJdGVyYWJsZTxQYWlyPExvbmcsIEN1ZT4gPigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3I8UGFpcjxMb25nLCBDdWU+ID4gaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAic2xpY2UgKCIgKyBsYXN0VGltZU1zICsgIiwgIiArIHRpbWVNcyArICJdPSIpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRyeUl0ZXJhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3Vlcy5zdWJNYXAobGFzdFRpbWVNcyArIDEsIHRpbWVNcyArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRyeUl0ZXJhdG9yKG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIG5leHRUaW1lQWZ0ZXIobG9uZyB0aW1lTXMpIHsKLSAgICAgICAgICAgIFNvcnRlZE1hcDxMb25nLCBWZWN0b3I8Q3VlPj4gdGFpbCA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRhaWwgPSBtQ3Vlcy50YWlsTWFwKHRpbWVNcyArIDEpOwotICAgICAgICAgICAgICAgIGlmICh0YWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhaWwuZmlyc3RLZXkoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0gY2F0Y2goTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2xhc3MgRW50cnlJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPFBhaXI8TG9uZywgQ3VlPiA+IHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIW1Eb25lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBQYWlyPExvbmcsIEN1ZT4gbmV4dCgpIHsKLSAgICAgICAgICAgICAgICBpZiAobURvbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTGFzdEVudHJ5ID0gbmV3IFBhaXI8TG9uZywgQ3VlPigKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VGltZU1zLCBtTGlzdEl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgbUxhc3RMaXN0SXRlcmF0b3IgPSBtTGlzdEl0ZXJhdG9yOwotICAgICAgICAgICAgICAgIGlmICghbUxpc3RJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dEtleSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbUxhc3RFbnRyeTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICAgICAgLy8gb25seSBhbGxvdyByZW1vdmluZyBlbmQgdGFncwotICAgICAgICAgICAgICAgIGlmIChtTGFzdExpc3RJdGVyYXRvciA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdEVudHJ5LnNlY29uZC5tRW5kVGltZU1zICE9IG1MYXN0RW50cnkuZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGVuZC1jdWUKLSAgICAgICAgICAgICAgICBtTGFzdExpc3RJdGVyYXRvci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICBtTGFzdExpc3RJdGVyYXRvciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKG1DdWVzLmdldChtTGFzdEVudHJ5LmZpcnN0KS5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtQ3Vlcy5yZW1vdmUobUxhc3RFbnRyeS5maXJzdCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHJlc3Qgb2YgdGhlIGN1ZXMKLSAgICAgICAgICAgICAgICBDdWUgY3VlID0gbUxhc3RFbnRyeS5zZWNvbmQ7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCBjdWUubVN0YXJ0VGltZU1zKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGxvbmcgdGltZU1zOiBjdWUubUlubmVyVGltZXNNcykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCB0aW1lTXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgRW50cnlJdGVyYXRvcihTb3J0ZWRNYXA8TG9uZywgVmVjdG9yPEN1ZT4gPiBjdWVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsIGN1ZXMgKyAiIik7Ci0gICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMgPSBjdWVzOwotICAgICAgICAgICAgICAgIG1MYXN0TGlzdEl0ZXJhdG9yID0gbnVsbDsKLSAgICAgICAgICAgICAgICBuZXh0S2V5KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBuZXh0S2V5KCkgewotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUmVtYWluaW5nQ3VlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUaW1lTXMgPSBtUmVtYWluaW5nQ3Vlcy5maXJzdEtleSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUxpc3RJdGVyYXRvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMuZ2V0KG1DdXJyZW50VGltZU1zKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3VlcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZW1haW5pbmdDdWVzLnRhaWxNYXAobUN1cnJlbnRUaW1lTXMgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbURvbmUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRG9uZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3VlcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGlzdEl0ZXJhdG9yID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gd2hpbGUgKCFtTGlzdEl0ZXJhdG9yLmhhc05leHQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgbG9uZyBtQ3VycmVudFRpbWVNczsKLSAgICAgICAgICAgIHByaXZhdGUgSXRlcmF0b3I8Q3VlPiBtTGlzdEl0ZXJhdG9yOwotICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Eb25lOwotICAgICAgICAgICAgcHJpdmF0ZSBTb3J0ZWRNYXA8TG9uZywgVmVjdG9yPEN1ZT4gPiBtUmVtYWluaW5nQ3VlczsKLSAgICAgICAgICAgIHByaXZhdGUgSXRlcmF0b3I8Q3VlPiBtTGFzdExpc3RJdGVyYXRvcjsKLSAgICAgICAgICAgIHByaXZhdGUgUGFpcjxMb25nLEN1ZT4gbUxhc3RFbnRyeTsKLSAgICAgICAgfQotCi0gICAgICAgIEN1ZUxpc3QoKSB7Ci0gICAgICAgICAgICBtQ3VlcyA9IG5ldyBUcmVlTWFwPExvbmcsIFZlY3RvcjxDdWU+PigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdWUgewotICAgICAgICBwdWJsaWMgbG9uZyBtU3RhcnRUaW1lTXM7Ci0gICAgICAgIHB1YmxpYyBsb25nIG1FbmRUaW1lTXM7Ci0gICAgICAgIHB1YmxpYyBsb25nW10gbUlubmVyVGltZXNNczsKLSAgICAgICAgcHVibGljIGxvbmcgbVJ1bklEOwotCi0gICAgICAgIHB1YmxpYyBDdWUgbU5leHRJblJ1bjsKLQotICAgICAgICBwdWJsaWMgdm9pZCBvblRpbWUobG9uZyB0aW1lTXMpIHsgfQotICAgIH0KLQotICAgIC8qKiB1cGRhdGUgbVJ1bnNCeUVuZFRpbWUgKHdpdGggZGVmYXVsdCBlbmQgdGltZSkgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZFJ1bihsb25nIHJ1bklEKSB7Ci0gICAgICAgIGlmIChydW5JRCAhPSAwICYmIHJ1bklEICE9IH4wKSB7Ci0gICAgICAgICAgICBSdW4gcnVuID0gbVJ1bnNCeUlELmdldChydW5JRCk7Ci0gICAgICAgICAgICBpZiAocnVuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBydW4uc3RvcmVCeUVuZFRpbWVNcyhtUnVuc0J5RW5kVGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogdXBkYXRlIG1SdW5zQnlFbmRUaW1lIHdpdGggZ2l2ZW4gZW5kIHRpbWUgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSdW5EaXNjYXJkVGltZU1zKGxvbmcgcnVuSUQsIGxvbmcgdGltZU1zKSB7Ci0gICAgICAgIGlmIChydW5JRCAhPSAwICYmIHJ1bklEICE9IH4wKSB7Ci0gICAgICAgICAgICBSdW4gcnVuID0gbVJ1bnNCeUlELmdldChydW5JRCk7Ci0gICAgICAgICAgICBpZiAocnVuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBydW4ubUVuZFRpbWVNcyA9IHRpbWVNczsKLSAgICAgICAgICAgICAgICBydW4uc3RvcmVCeUVuZFRpbWVNcyhtUnVuc0J5RW5kVGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogd2hldGhlciB0aGlzIGlzIGEgdGV4dCB0cmFjayB3aG8gZmlyZXMgZXZlbnRzIGluc3RlYWQgZ2V0dGluZyByZW5kZXJlZCAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VHJhY2tUeXBlKCkgewotICAgICAgICByZXR1cm4gZ2V0UmVuZGVyaW5nV2lkZ2V0KCkgPT0gbnVsbAotICAgICAgICAgICAgICAgID8gVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUCi0gICAgICAgICAgICAgICAgOiBUcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJ1biB7Ci0gICAgICAgIHB1YmxpYyBDdWUgbUZpcnN0Q3VlOwotICAgICAgICBwdWJsaWMgUnVuIG1OZXh0UnVuQXRFbmRUaW1lTXM7Ci0gICAgICAgIHB1YmxpYyBSdW4gbVByZXZSdW5BdEVuZFRpbWVNczsKLSAgICAgICAgcHVibGljIGxvbmcgbUVuZFRpbWVNcyA9IC0xOwotICAgICAgICBwdWJsaWMgbG9uZyBtUnVuSUQgPSAwOwotICAgICAgICBwcml2YXRlIGxvbmcgbVN0b3JlZEVuZFRpbWVNcyA9IC0xOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlQnlFbmRUaW1lTXMoTG9uZ1NwYXJzZUFycmF5PFJ1bj4gcnVuc0J5RW5kVGltZSkgewotICAgICAgICAgICAgLy8gcmVtb3ZlIG9sZCB2YWx1ZSBpZiBhbnkKLSAgICAgICAgICAgIGludCBpeCA9IHJ1bnNCeUVuZFRpbWUuaW5kZXhPZktleShtU3RvcmVkRW5kVGltZU1zKTsKLSAgICAgICAgICAgIGlmIChpeCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmV2UnVuQXRFbmRUaW1lTXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQodGhpcyA9PSBydW5zQnlFbmRUaW1lLnZhbHVlQXQoaXgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1OZXh0UnVuQXRFbmRUaW1lTXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcnVuc0J5RW5kVGltZS5yZW1vdmVBdChpeCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBydW5zQnlFbmRUaW1lLnNldFZhbHVlQXQoaXgsIG1OZXh0UnVuQXRFbmRUaW1lTXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlbW92ZUF0RW5kVGltZU1zKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCBuZXcgdmFsdWUKLSAgICAgICAgICAgIGlmIChtRW5kVGltZU1zID49IDApIHsKLSAgICAgICAgICAgICAgICBtUHJldlJ1bkF0RW5kVGltZU1zID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtTmV4dFJ1bkF0RW5kVGltZU1zID0gcnVuc0J5RW5kVGltZS5nZXQobUVuZFRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXh0UnVuQXRFbmRUaW1lTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTmV4dFJ1bkF0RW5kVGltZU1zLm1QcmV2UnVuQXRFbmRUaW1lTXMgPSB0aGlzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBydW5zQnlFbmRUaW1lLnB1dChtRW5kVGltZU1zLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBtU3RvcmVkRW5kVGltZU1zID0gbUVuZFRpbWVNczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0RW5kVGltZU1zKCkgewotICAgICAgICAgICAgUnVuIHByZXYgPSBtUHJldlJ1bkF0RW5kVGltZU1zOwotCi0gICAgICAgICAgICBpZiAobVByZXZSdW5BdEVuZFRpbWVNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVByZXZSdW5BdEVuZFRpbWVNcy5tTmV4dFJ1bkF0RW5kVGltZU1zID0gbU5leHRSdW5BdEVuZFRpbWVNczsKLSAgICAgICAgICAgICAgICBtUHJldlJ1bkF0RW5kVGltZU1zID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtTmV4dFJ1bkF0RW5kVGltZU1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtTmV4dFJ1bkF0RW5kVGltZU1zLm1QcmV2UnVuQXRFbmRUaW1lTXMgPSBwcmV2OwotICAgICAgICAgICAgICAgIG1OZXh0UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIGZvciByZW5kZXJpbmcgc3VidGl0bGVzIG9udG8gYSBDYW52YXMuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBSZW5kZXJpbmdXaWRnZXQgewotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgd2lkZ2V0J3MgY2FsbGJhY2ssIHdoaWNoIGlzIHVzZWQgdG8gc2VuZCB1cGRhdGVzIHdoZW4gdGhlCi0gICAgICAgICAqIHJlbmRlcmVkIGRhdGEgaGFzIGNoYW5nZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayB1cGRhdGUgY2FsbGJhY2sKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE9uQ2hhbmdlZExpc3RlbmVyKE9uQ2hhbmdlZExpc3RlbmVyIGNhbGxiYWNrKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgd2lkZ2V0J3Mgc2l6ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHdpZHRoIHdpZHRoIGluIHBpeGVscwotICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0IGhlaWdodCBpbiBwaXhlbHMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSB3aWRnZXQgc2hvdWxkIGRyYXcgc3VidGl0bGVzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdmlzaWJsZSB0cnVlIGlmIHN1YnRpdGxlcyBzaG91bGQgYmUgZHJhd24sIGZhbHNlIG90aGVyd2lzZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZW5kZXJzIHN1YnRpdGxlcyBvbnRvIGEge0BsaW5rIENhbnZhc30uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjIGNhbnZhcyBvbiB3aGljaCB0byByZW5kZXIgc3VidGl0bGVzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHdpZGdldCBpcyBhdHRhY2hlZCB0byBhIHdpbmRvdy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgd2lkZ2V0IGlzIGRldGFjaGVkIGZyb20gYSB3aW5kb3cuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsYmFjayB1c2VkIHRvIHNlbmQgdXBkYXRlcyBhYm91dCBjaGFuZ2VzIHRvIHJlbmRlcmluZyBkYXRhLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludGVyZmFjZSBPbkNoYW5nZWRMaXN0ZW5lciB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSByZW5kZXJpbmcgZGF0YSBoYXMgY2hhbmdlZC4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBAcGFyYW0gcmVuZGVyaW5nV2lkZ2V0IHRoZSB3aWRnZXQgd2hvc2UgZGF0YSBoYXMgY2hhbmdlZAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZWQoUmVuZGVyaW5nV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlGYWN0b3J5LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YmU1NDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFCcm93c2VyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQnJvd3NlcjIuQnJvd3NlckNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjIuQ29udHJvbGxlckNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTGlicmFyeVJvb3Q7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTWVkaWFMaWJyYXJ5U2Vzc2lvbi5NZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZEdyb3VwMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29udHJvbGxlckluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLlNlc3Npb25DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTIuTWVkaWFOb3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUJyb3dzZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFDb250cm9sVmlldzJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUNvbnRyb2xsZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFJdGVtMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhTGlicmFyeVNlcnZpY2UyUHJvdmlkZXIuTGlicmFyeVJvb3RQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYU1ldGFkYXRhMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhUGxheWxpc3RBZ2VudFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvbjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb24yUHJvdmlkZXIuQnVpbGRlckJhc2VQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29tbWFuZEJ1dHRvblByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb25TZXJ2aWNlMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXIuTWVkaWFOb3RpZmljYXRpb25Qcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5TZXNzaW9uVG9rZW4yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuU3RhdGljUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlkZW9WaWV3MlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZXdHcm91cFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZvbHVtZVByb3ZpZGVyMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSUludGVyZmFjZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbFZpZXcyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldzI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5JTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0ySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLkxpYnJhcnlSb290SW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50SW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24ySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuUmF0aW5nMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sVmlldzJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcySW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQXBpRmFjdG9yeSBpbXBsZW1lbnRzIFN0YXRpY1Byb3ZpZGVyIHsKLSAgICBwcml2YXRlIEFwaUZhY3RvcnkoKSB7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RhdGljUHJvdmlkZXIgaW5pdGlhbGl6ZShBcHBsaWNhdGlvbkluZm8gdXBkYXRhYmxlSW5mbykgewotICAgICAgICBBcGlIZWxwZXIuaW5pdGlhbGl6ZSh1cGRhdGFibGVJbmZvKTsKLSAgICAgICAgcmV0dXJuIG5ldyBBcGlGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhQ29udHJvbGxlcjJQcm92aWRlciBjcmVhdGVNZWRpYUNvbnRyb2xsZXIyKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBNZWRpYUNvbnRyb2xsZXIyIGluc3RhbmNlLCBTZXNzaW9uVG9rZW4yIHRva2VuLAotICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IsIENvbnRyb2xsZXJDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhQ29udHJvbGxlcjJJbXBsKGNvbnRleHQsIGluc3RhbmNlLCB0b2tlbiwgZXhlY3V0b3IsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFCcm93c2VyMlByb3ZpZGVyIGNyZWF0ZU1lZGlhQnJvd3NlcjIoQ29udGV4dCBjb250ZXh0LCBNZWRpYUJyb3dzZXIyIGluc3RhbmNlLAotICAgICAgICAgICAgU2Vzc2lvblRva2VuMiB0b2tlbiwgRXhlY3V0b3IgZXhlY3V0b3IsIEJyb3dzZXJDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhQnJvd3NlcjJJbXBsKGNvbnRleHQsIGluc3RhbmNlLCB0b2tlbiwgZXhlY3V0b3IsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMlByb3ZpZGVyLkNvbW1hbmRQcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb24yQ29tbWFuZCgKLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMiBpbnN0YW5jZSwgaW50IGNvbW1hbmRDb2RlLCBTdHJpbmcgYWN0aW9uLCBCdW5kbGUgZXh0cmEpIHsKLSAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsICYmIGV4dHJhID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEltcGwoaW5zdGFuY2UsIGNvbW1hbmRDb2RlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRJbXBsKGluc3RhbmNlLCBhY3Rpb24sIGV4dHJhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2Vzc2lvbkNvbW1hbmQyIGZyb21CdW5kbGVfTWVkaWFTZXNzaW9uMkNvbW1hbmQoQnVuZGxlIGNvbW1hbmQpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRJbXBsLmZyb21CdW5kbGVfaW1wbChjb21tYW5kKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMlByb3ZpZGVyLkNvbW1hbmRHcm91cFByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb21tYW5kR3JvdXAoCi0gICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBpbnN0YW5jZSwgU2Vzc2lvbkNvbW1hbmRHcm91cDIgb3RoZXIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kR3JvdXBJbXBsKGluc3RhbmNlLAotICAgICAgICAgICAgICAgIChvdGhlciA9PSBudWxsKSA/IG51bGwgOiBvdGhlci5nZXRQcm92aWRlcigpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2Vzc2lvbkNvbW1hbmRHcm91cDIgZnJvbUJ1bmRsZV9NZWRpYVNlc3Npb24yQ29tbWFuZEdyb3VwKEJ1bmRsZSBjb21tYW5kcykgewotICAgICAgICByZXR1cm4gTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEdyb3VwSW1wbC5mcm9tQnVuZGxlX2ltcGwoY29tbWFuZHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29udHJvbGxlckluZm9Qcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb24yQ29udHJvbGxlckluZm8oCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIENvbnRyb2xsZXJJbmZvIGluc3RhbmNlLCBpbnQgdWlkLCBpbnQgcGlkLCBTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICBJSW50ZXJmYWNlIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29udHJvbGxlckluZm9JbXBsKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgaW5zdGFuY2UsIHVpZCwgcGlkLCBwYWNrYWdlTmFtZSwgKElNZWRpYUNvbnRyb2xsZXIyKSBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJQcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb24yQ29tbWFuZEJ1dHRvbkJ1aWxkZXIoCi0gICAgICAgICAgICBNZWRpYVNlc3Npb24yLkNvbW1hbmRCdXR0b24uQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRCdXR0b25JbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnVpbGRlckJhc2VQcm92aWRlcjxNZWRpYVNlc3Npb24yLCBTZXNzaW9uQ2FsbGJhY2s+IGNyZWF0ZU1lZGlhU2Vzc2lvbjJCdWlsZGVyKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBNZWRpYVNlc3Npb24yLkJ1aWxkZXIgaW5zdGFuY2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5CdWlsZGVySW1wbChjb250ZXh0LCBpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXIgY3JlYXRlTWVkaWFTZXNzaW9uU2VydmljZTIoTWVkaWFTZXNzaW9uU2VydmljZTIgaW5zdGFuY2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwoaW5zdGFuY2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU5vdGlmaWNhdGlvblByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvblNlcnZpY2UyTWVkaWFOb3RpZmljYXRpb24oCi0gICAgICAgICAgICBNZWRpYU5vdGlmaWNhdGlvbiBpbnN0YW5jZSwgaW50IG5vdGlmaWNhdGlvbklkLCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsLk1lZGlhTm90aWZpY2F0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICBpbnN0YW5jZSwgbm90aWZpY2F0aW9uSWQsIG5vdGlmaWNhdGlvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXIgY3JlYXRlTWVkaWFMaWJyYXJ5U2VydmljZTIoTWVkaWFMaWJyYXJ5U2VydmljZTIgaW5zdGFuY2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwoaW5zdGFuY2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyQmFzZVByb3ZpZGVyPE1lZGlhTGlicmFyeVNlc3Npb24sIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjaz4KLSAgICAgICAgY3JlYXRlTWVkaWFMaWJyYXJ5U2VydmljZTJCdWlsZGVyKE1lZGlhTGlicmFyeVNlcnZpY2UyIHNlcnZpY2UsCi0gICAgICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uLkJ1aWxkZXIgaW5zdGFuY2UsIEV4ZWN1dG9yIGNhbGxiYWNrRXhlY3V0b3IsCi0gICAgICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuQnVpbGRlckltcGwoc2VydmljZSwgaW5zdGFuY2UsIGNhbGxiYWNrRXhlY3V0b3IsCi0gICAgICAgICAgICAgICAgY2FsbGJhY2spOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaWJyYXJ5Um9vdFByb3ZpZGVyIGNyZWF0ZU1lZGlhTGlicmFyeVNlcnZpY2UyTGlicmFyeVJvb3QoCi0gICAgICAgICAgICBMaWJyYXJ5Um9vdCBpbnN0YW5jZSwgU3RyaW5nIHJvb3RJZCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICByZXR1cm4gbmV3IExpYnJhcnlSb290SW1wbChpbnN0YW5jZSwgcm9vdElkLCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xWaWV3MlByb3ZpZGVyIGNyZWF0ZU1lZGlhQ29udHJvbFZpZXcyKE1lZGlhQ29udHJvbFZpZXcyIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyLAotICAgICAgICAgICAgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFDb250cm9sVmlldzJJbXBsKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWaWRlb1ZpZXcyUHJvdmlkZXIgY3JlYXRlVmlkZW9WaWV3MigKLSAgICAgICAgICAgIFZpZGVvVmlldzIgaW5zdGFuY2UsIFZpZXdHcm91cFByb3ZpZGVyIHN1cGVyUHJvdmlkZXIsIFZpZXdHcm91cFByb3ZpZGVyIHByaXZhdGVQcm92aWRlciwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICByZXR1cm4gbmV3IFZpZGVvVmlldzJJbXBsKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yUHJvdmlkZXIgY3JlYXRlU2Vzc2lvblRva2VuMihDb250ZXh0IGNvbnRleHQsIFNlc3Npb25Ub2tlbjIgaW5zdGFuY2UsCi0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBzZXJ2aWNlTmFtZSwgaW50IHVpZCkgewotICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25Ub2tlbjJJbXBsKGNvbnRleHQsIGluc3RhbmNlLCBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUsIHVpZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjIgZnJvbUJ1bmRsZV9TZXNzaW9uVG9rZW4yKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIFNlc3Npb25Ub2tlbjJJbXBsLmZyb21CdW5kbGVfaW1wbChidW5kbGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUl0ZW0yUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyIGNyZWF0ZU1lZGlhSXRlbTJCdWlsZGVyKE1lZGlhSXRlbTIuQnVpbGRlciBpbnN0YW5jZSwKLSAgICAgICAgICAgIGludCBmbGFncykgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhSXRlbTJJbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlLCBmbGFncyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhSXRlbTIgZnJvbUJ1bmRsZV9NZWRpYUl0ZW0yKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhSXRlbTJJbXBsLmZyb21CdW5kbGVfaW1wbChidW5kbGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWb2x1bWVQcm92aWRlcjJQcm92aWRlciBjcmVhdGVWb2x1bWVQcm92aWRlcjIoVm9sdW1lUHJvdmlkZXIyIGluc3RhbmNlLCBpbnQgY29udHJvbFR5cGUsCi0gICAgICAgICAgICBpbnQgbWF4Vm9sdW1lLCBpbnQgY3VycmVudFZvbHVtZSkgewotICAgICAgICByZXR1cm4gbmV3IFZvbHVtZVByb3ZpZGVyMkltcGwoaW5zdGFuY2UsIGNvbnRyb2xUeXBlLCBtYXhWb2x1bWUsIGN1cnJlbnRWb2x1bWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBmcm9tQnVuZGxlX01lZGlhTWV0YWRhdGEyKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhTWV0YWRhdGEySW1wbC5mcm9tQnVuZGxlX2ltcGwoYnVuZGxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgY3JlYXRlTWVkaWFNZXRhZGF0YTJCdWlsZGVyKAotICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhTWV0YWRhdGEySW1wbC5CdWlsZGVySW1wbChpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyIGNyZWF0ZU1lZGlhTWV0YWRhdGEyQnVpbGRlcigKLSAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIgaW5zdGFuY2UsIE1lZGlhTWV0YWRhdGEyIHNvdXJjZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhTWV0YWRhdGEySW1wbC5CdWlsZGVySW1wbChpbnN0YW5jZSwgc291cmNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBmcm9tQnVuZGxlX1JhdGluZzIoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwuZnJvbUJ1bmRsZV9pbXBsKGJ1bmRsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhdGluZzIgbmV3VW5yYXRlZFJhdGluZ19SYXRpbmcyKGludCByYXRpbmdTdHlsZSkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3VW5yYXRlZFJhdGluZ19pbXBsKHJhdGluZ1N0eWxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBuZXdIZWFydFJhdGluZ19SYXRpbmcyKGJvb2xlYW4gaGFzSGVhcnQpIHsKLSAgICAgICAgcmV0dXJuIFJhdGluZzJJbXBsLm5ld0hlYXJ0UmF0aW5nX2ltcGwoaGFzSGVhcnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIG5ld1RodW1iUmF0aW5nX1JhdGluZzIoYm9vbGVhbiB0aHVtYklzVXApIHsKLSAgICAgICAgcmV0dXJuIFJhdGluZzJJbXBsLm5ld1RodW1iUmF0aW5nX2ltcGwodGh1bWJJc1VwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBuZXdTdGFyUmF0aW5nX1JhdGluZzIoaW50IHN0YXJSYXRpbmdTdHlsZSwgZmxvYXQgc3RhclJhdGluZykgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3U3RhclJhdGluZ19pbXBsKHN0YXJSYXRpbmdTdHlsZSwgc3RhclJhdGluZyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhdGluZzIgbmV3UGVyY2VudGFnZVJhdGluZ19SYXRpbmcyKGZsb2F0IHBlcmNlbnQpIHsKLSAgICAgICAgcmV0dXJuIFJhdGluZzJJbXBsLm5ld1BlcmNlbnRhZ2VSYXRpbmdfaW1wbChwZXJjZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFQbGF5bGlzdEFnZW50UHJvdmlkZXIgY3JlYXRlTWVkaWFQbGF5bGlzdEFnZW50KE1lZGlhUGxheWxpc3RBZ2VudCBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUGxheWxpc3RBZ2VudEltcGwoaW5zdGFuY2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvdXBkYXRlL0FwaUhlbHBlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOGJiNDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGU7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5UaGVtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkd1YXJkZWRCeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQud2lkZ2V0LlNwYWNlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuQnV0dG9uQmFyTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlQnV0dG9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlVm9sdW1lU2xpZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk92ZXJsYXlMaXN0VmlldzsKLQotcHVibGljIGZpbmFsIGNsYXNzIEFwaUhlbHBlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQXBwbGljYXRpb25JbmZvIHNVcGRhdGFibGVJbmZvOwotCi0gICAgQEd1YXJkZWRCeSgidGhpcyIpCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGhlbWUgc0xpYlRoZW1lOwotCi0gICAgcHJpdmF0ZSBBcGlIZWxwZXIoKSB7IH0KLQotICAgIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoQXBwbGljYXRpb25JbmZvIHVwZGF0YWJsZUluZm8pIHsKLSAgICAgICAgaWYgKHNVcGRhdGFibGVJbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImluaXRpYWxpemUgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNVcGRhdGFibGVJbmZvID0gdXBkYXRhYmxlSW5mbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlcyBnZXRMaWJSZXNvdXJjZXMoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBnZXRMaWJUaGVtZShjb250ZXh0KS5nZXRSZXNvdXJjZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRoZW1lIGdldExpYlRoZW1lKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAoc0xpYlRoZW1lICE9IG51bGwpIHJldHVybiBzTGliVGhlbWU7Ci0KLSAgICAgICAgcmV0dXJuIGdldExpYlRoZW1lU3luY2hyb25pemVkKGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGhlbWUgZ2V0TGliVGhlbWUoQ29udGV4dCBjb250ZXh0LCBpbnQgdGhlbWVJZCkgewotICAgICAgICBUaGVtZSB0aGVtZSA9IGdldExpYlJlc291cmNlcyhjb250ZXh0KS5uZXdUaGVtZSgpOwotICAgICAgICB0aGVtZS5hcHBseVN0eWxlKHRoZW1lSWQsIHRydWUpOwotICAgICAgICByZXR1cm4gdGhlbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYXlvdXRJbmZsYXRlciBnZXRMYXlvdXRJbmZsYXRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGdldExheW91dEluZmxhdGVyKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGF5b3V0SW5mbGF0ZXIgZ2V0TGF5b3V0SW5mbGF0ZXIoQ29udGV4dCBjb250ZXh0LCBUaGVtZSB0aGVtZSkgewotICAgICAgICBpZiAodGhlbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhlbWUgPSBnZXRMaWJUaGVtZShjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE8gKGIvNzI5NzU5NzYpOiBBdm9pZCB0byB1c2UgQ29udGV4dFRoZW1lV3JhcHBlciB3aXRoIGFwcCBjb250ZXh0IGFuZCBsaWIgdGhlbWUuCi0gICAgICAgIExheW91dEluZmxhdGVyIGxheW91dEluZmxhdGVyID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShjb250ZXh0KS5jbG9uZUluQ29udGV4dCgKLSAgICAgICAgICAgICAgICBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCB0aGVtZSkpOwotICAgICAgICBsYXlvdXRJbmZsYXRlci5zZXRGYWN0b3J5MihuZXcgTGF5b3V0SW5mbGF0ZXIuRmFjdG9yeTIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldygKLSAgICAgICAgICAgICAgICAgICAgVmlldyBwYXJlbnQsIFN0cmluZyBuYW1lLCBDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICAgICAgICAgIGlmIChNZWRpYVJvdXRlQnV0dG9uLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlQnV0dG9uKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1lZGlhUm91dGVWb2x1bWVTbGlkZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVWb2x1bWVTbGlkZXIoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24oY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoT3ZlcmxheUxpc3RWaWV3LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPdmVybGF5TGlzdFZpZXcoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQnV0dG9uQmFyTGF5b3V0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdXR0b25CYXJMYXlvdXQoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU3BhY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNwYWNlKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KFN0cmluZyBuYW1lLCBDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICAgICAgICAgIHJldHVybiBvbkNyZWF0ZVZpZXcobnVsbCwgbmFtZSwgY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIGxheW91dEluZmxhdGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVmlldyBpbmZsYXRlTGliTGF5b3V0KENvbnRleHQgY29udGV4dCwgaW50IGxpYlJlc0lkKSB7Ci0gICAgICAgIHJldHVybiBpbmZsYXRlTGliTGF5b3V0KGNvbnRleHQsIGdldExpYlRoZW1lKGNvbnRleHQpLCBsaWJSZXNJZCwgbnVsbCwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVmlldyBpbmZsYXRlTGliTGF5b3V0KENvbnRleHQgY29udGV4dCwgVGhlbWUgdGhlbWUsIGludCBsaWJSZXNJZCkgewotICAgICAgICByZXR1cm4gaW5mbGF0ZUxpYkxheW91dChjb250ZXh0LCB0aGVtZSwgbGliUmVzSWQsIG51bGwsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFZpZXcgaW5mbGF0ZUxpYkxheW91dChDb250ZXh0IGNvbnRleHQsIFRoZW1lIHRoZW1lLCBpbnQgbGliUmVzSWQsCi0gICAgICAgICAgICBATnVsbGFibGUgVmlld0dyb3VwIHJvb3QsIGJvb2xlYW4gYXR0YWNoVG9Sb290KSB7Ci0gICAgICAgIHRyeSAoWG1sUmVzb3VyY2VQYXJzZXIgcGFyc2VyID0gZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldExheW91dChsaWJSZXNJZCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRMYXlvdXRJbmZsYXRlcihjb250ZXh0LCB0aGVtZSkuaW5mbGF0ZShwYXJzZXIsIHJvb3QsIGF0dGFjaFRvUm9vdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgVGhlbWUgZ2V0TGliVGhlbWVTeW5jaHJvbml6ZWQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChzTGliVGhlbWUgIT0gbnVsbCkgcmV0dXJuIHNMaWJUaGVtZTsKLQotICAgICAgICBpZiAoc1VwZGF0YWJsZUluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5pdGlhbGl6ZSBoYXNuJ3QgYmVlbiBjYWxsZWQgeWV0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHNMaWJUaGVtZSA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VzRm9yQXBwbGljYXRpb24oc1VwZGF0YWJsZUluZm8pLm5ld1RoZW1lKCk7Ci0gICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcGkyNC9tZWRpYS9NZWRpYVJvdXRlckFwaTI0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBpMjQvbWVkaWEvTWVkaWFSb3V0ZXJBcGkyNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTQ2YWY2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcGkyNC9tZWRpYS9NZWRpYVJvdXRlckFwaTI0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLS8vIEBAUmVxdWlyZXNBcGkoMjQpCi1maW5hbCBjbGFzcyBNZWRpYVJvdXRlckFwaTI0IHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldERldmljZVR5cGUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0RGV2aWNlVHlwZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZThkNDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC52aWV3LkFjdGlvblByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci0KLS8qKgotICogVGhlIG1lZGlhIHJvdXRlIGFjdGlvbiBwcm92aWRlciBkaXNwbGF5cyBhIHtAbGluayBNZWRpYVJvdXRlQnV0dG9uIG1lZGlhIHJvdXRlIGJ1dHRvbn0KLSAqIGluIHRoZSBhcHBsaWNhdGlvbidzIHtAbGluayBBY3Rpb25CYXJ9IHRvIGFsbG93IHRoZSB1c2VyIHRvIHNlbGVjdCByb3V0ZXMgYW5kCi0gKiB0byBjb250cm9sIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuCi0gKiA8cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHNwZWNpZnkgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZSB1c2VyIHNob3VsZCBiZSBhbGxvd2VkCi0gKiB0byBzZWxlY3QgYnkgc3BlY2lmeWluZyBhIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3J9IHdpdGggdGhlCi0gKiB7QGxpbmsgI3NldFJvdXRlU2VsZWN0b3J9IG1ldGhvZC4KLSAqIDwvcD48cD4KLSAqIFJlZmVyIHRvIHtAbGluayBNZWRpYVJvdXRlQnV0dG9ufSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgYnV0dG9uIHRoYXQgd2lsbAotICogYXBwZWFyIGluIHRoZSBhY3Rpb24gYmFyIG1lbnUuICBOb3RlIHRoYXQgaW5zdGVhZCBvZiBkaXNhYmxpbmcgdGhlIGJ1dHRvbgotICogd2hlbiBubyByb3V0ZXMgYXJlIGF2YWlsYWJsZSwgdGhlIGFjdGlvbiBwcm92aWRlciB3aWxsIGluc3RlYWQgbWFrZSB0aGUKLSAqIG1lbnUgaXRlbSBpbnZpc2libGUuICBJbiB0aGlzIHdheSwgdGhlIGJ1dHRvbiB3aWxsIG9ubHkgYmUgdmlzaWJsZSB3aGVuIGl0Ci0gKiBpcyBwb3NzaWJsZSBmb3IgdGhlIHVzZXIgdG8gZGlzY292ZXIgYW5kIHNlbGVjdCBhIG1hdGNoaW5nIHJvdXRlLgotICogPC9wPgotICoKLSAqIDxoMz5QcmVyZXF1aXNpdGVzPC9oMz4KLSAqIDxwPgotICogVG8gdXNlIHRoZSBtZWRpYSByb3V0ZSBhY3Rpb24gcHJvdmlkZXIsIHRoZSBhY3Rpdml0eSBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YKLSAqIHtAbGluayBBcHBDb21wYXRBY3Rpdml0eX0gZnJvbSB0aGUgPGNvZGU+YW5kcm9pZC5zdXBwb3J0LnY3LmFwcGNvbXBhdDwvY29kZT4KLSAqIHN1cHBvcnQgbGlicmFyeS4gIFJlZmVyIHRvIHN1cHBvcnQgbGlicmFyeSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgotICogPC9wPgotICoKLSAqIDxoMz5FeGFtcGxlPC9oMz4KLSAqIDxwPgotICogPC9wPjxwPgotICogVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBkZWZpbmUgYSBtZW51IHJlc291cmNlIHRvIGluY2x1ZGUgdGhlIHByb3ZpZGVyIGluIHRoZQotICogYWN0aW9uIGJhciBvcHRpb25zIG1lbnUuICBOb3RlIHRoYXQgdGhlIHN1cHBvcnQgbGlicmFyeSBhY3Rpb24gYmFyIHVzZXMgYXR0cmlidXRlcwotICogdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgYXBwbGljYXRpb24ncyByZXNvdXJjZSBuYW1lc3BhY2UgcmF0aGVyIHRoYW4gdGhlIGZyYW1ld29yaydzCi0gKiByZXNvdXJjZSBuYW1lc3BhY2UgdG8gY29uZmlndXJlIGVhY2ggaXRlbS4KLSAqIDwvcD48cHJlPgotICogJmx0O21lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICogICAgICAgICB4bWxuczphcHA9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMtYXV0byI+Ci0gKiAgICAgJmx0O2l0ZW0gYW5kcm9pZDppZD0iQCtpZC9tZWRpYV9yb3V0ZV9tZW51X2l0ZW0iCi0gKiAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvbWVkaWFfcm91dGVfbWVudV90aXRsZSIKLSAqICAgICAgICAgYXBwOnNob3dBc0FjdGlvbj0iYWx3YXlzIgotICogICAgICAgICBhcHA6YWN0aW9uUHJvdmlkZXJDbGFzcz0iYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5NZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIiLz4KLSAqICZsdDsvbWVudT4KLSAqIDwvcHJlPjxwPgotICogVGhlbiBjb25maWd1cmUgdGhlIG1lbnUgYW5kIHNldCB0aGUgcm91dGUgc2VsZWN0b3IgZm9yIHRoZSBjaG9vc2VyLgotICogPC9wPjxwcmU+Ci0gKiBwdWJsaWMgY2xhc3MgTXlBY3Rpdml0eSBleHRlbmRzIEFwcENvbXBhdEFjdGl2aXR5IHsKLSAqICAgICBwcml2YXRlIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5DYWxsYmFjayBtQ2FsbGJhY2s7Ci0gKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yOwotICoKLSAqICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gKiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gKgotICogICAgICAgICBtUm91dGVyID0gTWVkaWFyb3V0ZXIuZ2V0SW5zdGFuY2UodGhpcyk7Ci0gKiAgICAgICAgIG1TZWxlY3RvciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcigpCi0gKiAgICAgICAgICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykKLSAqICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spCi0gKiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gKiAgICAgICAgIG1DYWxsYmFjayA9IG5ldyBNeUNhbGxiYWNrKCk7Ci0gKiAgICAgfQotICoKLSAqICAgICAvLyBBZGQgdGhlIGNhbGxiYWNrIG9uIHN0YXJ0IHRvIHRlbGwgdGhlIG1lZGlhIHJvdXRlciB3aGF0IGtpbmRzIG9mIHJvdXRlcwotICogICAgIC8vIHRoZSBhcHBsaWNhdGlvbiBpcyBpbnRlcmVzdGVkIGluIHNvIHRoYXQgaXQgY2FuIHRyeSB0byBkaXNjb3ZlciBzdWl0YWJsZSBvbmVzLgotICogICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7Ci0gKiAgICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKLSAqCi0gKiAgICAgICAgIG1lZGlhUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLAotICogICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkpOwotICoKLSAqICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbWVkaWFSb3V0ZXIudXBkYXRlU2VsZWN0ZWRSb3V0ZShtU2VsZWN0b3IpOwotICogICAgICAgICAvLyBkbyBzb21ldGhpbmcgd2l0aCB0aGUgcm91dGUuLi4KLSAqICAgICB9Ci0gKgotICogICAgIC8vIFJlbW92ZSB0aGUgc2VsZWN0b3Igb24gc3RvcCB0byB0ZWxsIHRoZSBtZWRpYSByb3V0ZXIgdGhhdCBpdCBubyBsb25nZXIKLSAqICAgICAvLyBuZWVkcyB0byBpbnZlc3QgZWZmb3J0IHRyeWluZyB0byBkaXNjb3ZlciByb3V0ZXMgb2YgdGhlc2Uga2luZHMgZm9yIG5vdy4KLSAqICAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gKiAgICAgICAgIHN1cGVyLm9uU3RvcCgpOwotICoKLSAqICAgICAgICAgbWVkaWFSb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAqICAgICB9Ci0gKgotICogICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7Ci0gKiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSk7Ci0gKgotICogICAgICAgICBnZXRNZW51SW5mbGF0ZXIoKS5pbmZsYXRlKFIubWVudS5zYW1wbGVfbWVkaWFfcm91dGVyX21lbnUsIG1lbnUpOwotICoKLSAqICAgICAgICAgTWVudUl0ZW0gbWVkaWFSb3V0ZU1lbnVJdGVtID0gbWVudS5maW5kSXRlbShSLmlkLm1lZGlhX3JvdXRlX21lbnVfaXRlbSk7Ci0gKiAgICAgICAgIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBtZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIgPQotICogICAgICAgICAgICAgICAgIChNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIpTWVudUl0ZW1Db21wYXQuZ2V0QWN0aW9uUHJvdmlkZXIobWVkaWFSb3V0ZU1lbnVJdGVtKTsKLSAqICAgICAgICAgbWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyLnNldFJvdXRlU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAqICAgICAgICAgcmV0dXJuIHRydWU7Ci0gKiAgICAgfQotICoKLSAqICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE15Q2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gKiAgICAgICAgIC8vIEltcGxlbWVudCBjYWxsYmFjayBtZXRob2RzIGFzIG5lZWRlZC4KLSAqICAgICB9Ci0gKiB9Ci0gKiA8L3ByZT4KLSAqCi0gKiBAc2VlICNzZXRSb3V0ZVNlbGVjdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBBY3Rpb25Qcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXJDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBtRGlhbG9nRmFjdG9yeSA9IE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5LmdldERlZmF1bHQoKTsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVCdXR0b24gbUJ1dHRvbjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGFjdGlvbiBwcm92aWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotCi0gICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgICAgbUNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyQ2FsbGJhY2sodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICByZXR1cm4gbVNlbGVjdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbgotICAgICAqIHNlbGVjdCB1c2luZyB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yLCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1TZWxlY3Rvci5lcXVhbHMoc2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogV2UgY3VycmVudGx5IGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgd2hldGhlciB0aGUgYWN0aW9uIHByb3ZpZGVyCi0gICAgICAgICAgICAvLyBpcyBzdGlsbCBuZWVkZWQgYnkgdGhlIFVJLiAgVW5mb3J0dW5hdGVseSB0aGlzIG1lYW5zIHRoZSBhY3Rpb24gcHJvdmlkZXIKLSAgICAgICAgICAgIC8vIG1heSBsZWFrIGNhbGxiYWNrcyB1bnRpbCBnYXJiYWdlIGNvbGxlY3Rpb24gb2NjdXJzLiAgVGhpcyBtYXkgcmVzdWx0IGluCi0gICAgICAgICAgICAvLyBtZWRpYSByb3V0ZSBwcm92aWRlcnMgZG9pbmcgbW9yZSB3b3JrIHRoYW4gbmVjZXNzYXJ5IGluIHRoZSBzaG9ydCB0ZXJtCi0gICAgICAgICAgICAvLyB3aGlsZSB0cnlpbmcgdG8gZGlzY292ZXIgcm91dGVzIHRoYXQgYXJlIG5vIGxvbmdlciBvZiBpbnRlcmVzdCB0byB0aGUKLSAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uLiAgVG8gc29sdmUgdGhpcyBwcm9ibGVtLCB0aGUgYWN0aW9uIHByb3ZpZGVyIHdpbGwgbmVlZCBzb21lCi0gICAgICAgICAgICAvLyBpbmRpY2F0aW9uIGZyb20gdGhlIGZyYW1ld29yayB0aGF0IGl0IGlzIGJlaW5nIGRlc3Ryb3llZC4KLSAgICAgICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghc2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhzZWxlY3RvciwgbUNhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0KLSAgICAgICAgICAgIGlmIChtQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQnV0dG9uLnNldFJvdXRlU2VsZWN0b3Ioc2VsZWN0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgdG8gdXNlIHdoZW4gc2hvd2luZyB0aGUgcm91dGUgY2hvb3NlcgotICAgICAqIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGlhbG9nIGZhY3RvcnksIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZ2V0RGlhbG9nRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIG1EaWFsb2dGYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIGRpYWxvZyBmYWN0b3J5IHRvIHVzZSB3aGVuIHNob3dpbmcgdGhlIHJvdXRlIGNob29zZXIKLSAgICAgKiBvciBjb250cm9sbGVyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBkaWFsb2cgZmFjdG9yeSwgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaWFsb2dGYWN0b3J5KEBOb25OdWxsIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmFjdG9yeSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobURpYWxvZ0ZhY3RvcnkgIT0gZmFjdG9yeSkgewotICAgICAgICAgICAgbURpYWxvZ0ZhY3RvcnkgPSBmYWN0b3J5OwotCi0gICAgICAgICAgICBpZiAobUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJ1dHRvbi5zZXREaWFsb2dGYWN0b3J5KGZhY3RvcnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgYXNzb2NpYXRlZCBtZWRpYSByb3V0ZSBidXR0b24sIG9yIG51bGwgaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkLgotICAgICAqLwotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQnV0dG9uIGdldE1lZGlhUm91dGVCdXR0b24oKSB7Ci0gICAgICAgIHJldHVybiBtQnV0dG9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBtZWRpYSByb3V0ZSBidXR0b24gaXMgYmVpbmcgY3JlYXRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgdGhlIGJ1dHRvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24gb25DcmVhdGVNZWRpYVJvdXRlQnV0dG9uKCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVCdXR0b24oZ2V0Q29udGV4dCgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlQWN0aW9uVmlldygpIHsKLSAgICAgICAgaWYgKG1CdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAib25DcmVhdGVBY3Rpb25WaWV3OiB0aGlzIEFjdGlvblByb3ZpZGVyIGlzIGFscmVhZHkgYXNzb2NpYXRlZCAiICsKLSAgICAgICAgICAgICAgICAgICAgIndpdGggYSBtZW51IGl0ZW0uIERvbid0IHJldXNlIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBpbnN0YW5jZXMhICIgKwotICAgICAgICAgICAgICAgICAgICAiQWJhbmRvbmluZyB0aGUgb2xkIG1lbnUgaXRlbS4uLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1dHRvbiA9IG9uQ3JlYXRlTWVkaWFSb3V0ZUJ1dHRvbigpOwotICAgICAgICBtQnV0dG9uLnNldENoZWF0U2hlZXRFbmFibGVkKHRydWUpOwotICAgICAgICBtQnV0dG9uLnNldFJvdXRlU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAgICAgICAgbUJ1dHRvbi5zZXREaWFsb2dGYWN0b3J5KG1EaWFsb2dGYWN0b3J5KTsKLSAgICAgICAgbUJ1dHRvbi5zZXRMYXlvdXRQYXJhbXMobmV3IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpKTsKLSAgICAgICAgcmV0dXJuIG1CdXR0b247Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25QZXJmb3JtRGVmYXVsdEFjdGlvbigpIHsKLSAgICAgICAgaWYgKG1CdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1CdXR0b24uc2hvd0RpYWxvZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvdmVycmlkZXNJdGVtVmlzaWJpbGl0eSgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlci5pc1JvdXRlQXZhaWxhYmxlKG1TZWxlY3RvciwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5BVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURSk7Ci0gICAgfQotCi0gICAgdm9pZCByZWZyZXNoUm91dGUoKSB7Ci0gICAgICAgIHJlZnJlc2hWaXNpYmlsaXR5KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcj4gbVByb3ZpZGVyV2VhazsKLQotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZXJDYWxsYmFjayhNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIG1Qcm92aWRlcldlYWsgPSBuZXcgV2Vha1JlZmVyZW5jZTxNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXI+KHByb3ZpZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZShyb3V0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hSb3V0ZShNZWRpYVJvdXRlciByb3V0ZXIpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG1Qcm92aWRlcldlYWsuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb3ZpZGVyLnJlZnJlc2hSb3V0ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByb3V0ZXIucmVtb3ZlQ2FsbGJhY2sodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVCdXR0b24uamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUJ1dHRvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGU4YTYzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUJ1dHRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3Q7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0aW9uRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGVDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5Ub29sdGlwQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlNvdW5kRWZmZWN0Q29uc3RhbnRzOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotCi0vKioKLSAqIFRoZSBtZWRpYSByb3V0ZSBidXR0b24gYWxsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCByb3V0ZXMgYW5kIHRvIGNvbnRyb2wgdGhlCi0gKiBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuCi0gKiA8cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHNwZWNpZnkgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZSB1c2VyIHNob3VsZCBiZSBhbGxvd2VkCi0gKiB0byBzZWxlY3QgYnkgc3BlY2lmeWluZyBhIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3J9IHdpdGggdGhlCi0gKiB7QGxpbmsgI3NldFJvdXRlU2VsZWN0b3J9IG1ldGhvZC4KLSAqIDwvcD48cD4KLSAqIFdoZW4gdGhlIGRlZmF1bHQgcm91dGUgaXMgc2VsZWN0ZWQgb3Igd2hlbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGRvZXMgbm90Ci0gKiBtYXRjaCB0aGUge0BsaW5rICNnZXRSb3V0ZVNlbGVjdG9yKCkgc2VsZWN0b3J9LCB0aGUgYnV0dG9uIHdpbGwgYXBwZWFyIGluCi0gKiBhbiBpbmFjdGl2ZSBzdGF0ZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGlzIG5vdCBjb25uZWN0ZWQgdG8gYQotICogcm91dGUgb2YgdGhlIGtpbmQgdGhhdCBpdCB3YW50cyB0byB1c2UuICBDbGlja2luZyBvbiB0aGUgYnV0dG9uIG9wZW5zCi0gKiBhIHtAbGluayBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ30gdG8gYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0IGEgcm91dGUuCi0gKiBJZiBubyBub24tZGVmYXVsdCByb3V0ZXMgbWF0Y2ggdGhlIHNlbGVjdG9yIGFuZCBpdCBpcyBub3QgcG9zc2libGUgZm9yIGFuIGFjdGl2ZQotICogc2NhbiB0byBkaXNjb3ZlciBhbnkgbWF0Y2hpbmcgcm91dGVzLCB0aGVuIHRoZSBidXR0b24gaXMgZGlzYWJsZWQgYW5kIGNhbm5vdAotICogYmUgY2xpY2tlZC4KLSAqIDwvcD48cD4KLSAqIFdoZW4gYSBub24tZGVmYXVsdCByb3V0ZSBpcyBzZWxlY3RlZCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLCB0aGUgYnV0dG9uIHdpbGwKLSAqIGFwcGVhciBpbiBhbiBhY3RpdmUgc3RhdGUgaW5kaWNhdGluZyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBpcyBjb25uZWN0ZWQKLSAqIHRvIGEgcm91dGUgb2YgdGhlIGtpbmQgdGhhdCBpdCB3YW50cyB0byB1c2UuICBUaGUgYnV0dG9uIG1heSBhbHNvIGFwcGVhcgotICogaW4gYW4gaW50ZXJtZWRpYXJ5IGNvbm5lY3Rpbmcgc3RhdGUgaWYgdGhlIHJvdXRlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmcKLSAqIHRvIHRoZSBkZXN0aW5hdGlvbiBidXQgaGFzIG5vdCB5ZXQgY29tcGxldGVkIGRvaW5nIHNvLiAgSW4gZWl0aGVyIGNhc2UsIGNsaWNraW5nCi0gKiBvbiB0aGUgYnV0dG9uIG9wZW5zIGEge0BsaW5rIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nfSB0byBhbGxvdyB0aGUgdXNlcgotICogdG8gY29udHJvbCBvciBkaXNjb25uZWN0IGZyb20gdGhlIGN1cnJlbnQgcm91dGUuCi0gKiA8L3A+Ci0gKgotICogPGgzPlByZXJlcXVpc2l0ZXM8L2gzPgotICogPHA+Ci0gKiBUbyB1c2UgdGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiwgdGhlIGFjdGl2aXR5IG11c3QgYmUgYSBzdWJjbGFzcyBvZgotICoge0BsaW5rIEZyYWdtZW50QWN0aXZpdHl9IGZyb20gdGhlIDxjb2RlPmFuZHJvaWQuc3VwcG9ydC52NDwvY29kZT4KLSAqIHN1cHBvcnQgbGlicmFyeS4gIFJlZmVyIHRvIHN1cHBvcnQgbGlicmFyeSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgotICogPC9wPgotICoKLSAqIEBzZWUgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyCi0gKiBAc2VlICNzZXRSb3V0ZVNlbGVjdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQnV0dG9uIGV4dGVuZHMgVmlldyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlQnV0dG9uIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSE9PU0VSX0ZSQUdNRU5UX1RBRyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhcm91dGVyOk1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUk9MTEVSX0ZSQUdNRU5UX1RBRyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhcm91dGVyOk1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXJDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgcHJpdmF0ZSBpbnQgbVJvdXRlQ2FsbGJhY2tGbGFnczsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IG1EaWFsb2dGYWN0b3J5ID0gTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkuZ2V0RGVmYXVsdCgpOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1BdHRhY2hlZFRvV2luZG93OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3BhcnNlQXJyYXk8RHJhd2FibGUuQ29uc3RhbnRTdGF0ZT4gc1JlbW90ZUluZGljYXRvckNhY2hlID0KLSAgICAgICAgICAgIG5ldyBTcGFyc2VBcnJheTw+KDIpOwotICAgIHByaXZhdGUgUmVtb3RlSW5kaWNhdG9yTG9hZGVyIG1SZW1vdGVJbmRpY2F0b3JMb2FkZXI7Ci0gICAgcHJpdmF0ZSBEcmF3YWJsZSBtUmVtb3RlSW5kaWNhdG9yOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUmVtb3RlQWN0aXZlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNDb25uZWN0aW5nOwotCi0gICAgcHJpdmF0ZSBDb2xvclN0YXRlTGlzdCBtQnV0dG9uVGludDsKLSAgICBwcml2YXRlIGludCBtTWluV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbU1pbkhlaWdodDsKLQotICAgIC8vIFRoZSBjaGVja2VkIHN0YXRlIGlzIHVzZWQgd2hlbiBjb25uZWN0ZWQgdG8gYSByZW1vdGUgcm91dGUuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQ0hFQ0tFRF9TVEFURV9TRVQgPSB7Ci0gICAgICAgIGFuZHJvaWQuUi5hdHRyLnN0YXRlX2NoZWNrZWQKLSAgICB9OwotCi0gICAgLy8gVGhlIGNoZWNrYWJsZSBzdGF0ZSBpcyB1c2VkIHdoaWxlIGNvbm5lY3RpbmcgdG8gYSByZW1vdGUgcm91dGUuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQ0hFQ0tBQkxFX1NUQVRFX1NFVCA9IHsKLSAgICAgICAgYW5kcm9pZC5SLmF0dHIuc3RhdGVfY2hlY2thYmxlCi0gICAgfTsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQnV0dG9uKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQnV0dG9uKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIFIuYXR0ci5tZWRpYVJvdXRlQnV0dG9uU3R5bGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQnV0dG9uKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHN1cGVyKE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuY3JlYXRlVGhlbWVkQnV0dG9uQ29udGV4dChjb250ZXh0KSwgYXR0cnMsIGRlZlN0eWxlQXR0cik7Ci0gICAgICAgIGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0KLSAgICAgICAgbVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGNvbnRleHQpOwotICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXJDYWxsYmFjaygpOwotCi0gICAgICAgIFJlc291cmNlcy5UaGVtZSB0aGVtZSA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkubmV3VGhlbWUoKTsKLSAgICAgICAgdGhlbWUuYXBwbHlTdHlsZShNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoY29udGV4dCksIHRydWUpOwotICAgICAgICBUeXBlZEFycmF5IGEgPSB0aGVtZS5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLAotICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b24sIGRlZlN0eWxlQXR0ciwgMCk7Ci0KLSAgICAgICAgbUJ1dHRvblRpbnQgPSBhLmdldENvbG9yU3RhdGVMaXN0KFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b25fbWVkaWFSb3V0ZUJ1dHRvblRpbnQpOwotICAgICAgICBtTWluV2lkdGggPSBhLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NZWRpYVJvdXRlQnV0dG9uX2FuZHJvaWRfbWluV2lkdGgsIDApOwotICAgICAgICBtTWluSGVpZ2h0ID0gYS5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuTWVkaWFSb3V0ZUJ1dHRvbl9hbmRyb2lkX21pbkhlaWdodCwgMCk7Ci0gICAgICAgIGludCByZW1vdGVJbmRpY2F0b3JSZXNJZCA9IGEuZ2V0UmVzb3VyY2VJZCgKLSAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NZWRpYVJvdXRlQnV0dG9uX2V4dGVybmFsUm91dGVFbmFibGVkRHJhd2FibGUsIDApOwotICAgICAgICBhLnJlY3ljbGUoKTsKLQotICAgICAgICBpZiAocmVtb3RlSW5kaWNhdG9yUmVzSWQgIT0gMCkgewotICAgICAgICAgICAgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSByZW1vdGVJbmRpY2F0b3JTdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHNSZW1vdGVJbmRpY2F0b3JDYWNoZS5nZXQocmVtb3RlSW5kaWNhdG9yUmVzSWQpOwotICAgICAgICAgICAgaWYgKHJlbW90ZUluZGljYXRvclN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXRSZW1vdGVJbmRpY2F0b3JEcmF3YWJsZShyZW1vdGVJbmRpY2F0b3JTdGF0ZS5uZXdEcmF3YWJsZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvckxvYWRlciA9IG5ldyBSZW1vdGVJbmRpY2F0b3JMb2FkZXIocmVtb3RlSW5kaWNhdG9yUmVzSWQpOwotICAgICAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3JMb2FkZXIuZXhlY3V0ZU9uRXhlY3V0b3IoQXN5bmNUYXNrLlRIUkVBRF9QT09MX0VYRUNVVE9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHVwZGF0ZUNvbnRlbnREZXNjcmlwdGlvbigpOwotICAgICAgICBzZXRDbGlja2FibGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICByZXR1cm4gbVNlbGVjdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbgotICAgICAqIHNlbGVjdCB1c2luZyB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIHNldFJvdXRlU2VsZWN0b3Ioc2VsZWN0b3IsIDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbgotICAgICAqIHNlbGVjdCB1c2luZyB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yLgotICAgICAqIEBwYXJhbSBmbGFncyBGbGFncyB0byBjb250cm9sIHRoZSBiZWhhdmlvciBvZiB0aGUgY2FsbGJhY2suIE1heSBiZSB6ZXJvIG9yIGEgY29tYmluYXRpb24gb2YKLSAgICAgKiAgICAgICAgICAgICAge0BsaW5rICNNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU59IGFuZAotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgI01lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFN9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgaWYgKG1TZWxlY3Rvci5lcXVhbHMoc2VsZWN0b3IpICYmIG1Sb3V0ZUNhbGxiYWNrRmxhZ3MgPT0gZmxhZ3MpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1TZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCB8fCBzZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotICAgICAgICBtUm91dGVDYWxsYmFja0ZsYWdzID0gZmxhZ3M7Ci0KLSAgICAgICAgaWYgKG1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKHNlbGVjdG9yLCBtQ2FsbGJhY2ssIGZsYWdzKTsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgdG8gdXNlIHdoZW4gc2hvd2luZyB0aGUgcm91dGUgY2hvb3NlcgotICAgICAqIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGlhbG9nIGZhY3RvcnksIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZ2V0RGlhbG9nRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIG1EaWFsb2dGYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIGRpYWxvZyBmYWN0b3J5IHRvIHVzZSB3aGVuIHNob3dpbmcgdGhlIHJvdXRlIGNob29zZXIKLSAgICAgKiBvciBjb250cm9sbGVyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBkaWFsb2cgZmFjdG9yeSwgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaWFsb2dGYWN0b3J5KEBOb25OdWxsIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmFjdG9yeSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtRGlhbG9nRmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyB0aGUgcm91dGUgY2hvb3NlciBvciBjb250cm9sbGVyIGRpYWxvZy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgZGVmYXVsdCByb3V0ZSBpcyBzZWxlY3RlZCBvciBpZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGRvZXMKLSAgICAgKiBub3QgbWF0Y2ggdGhlIHtAbGluayAjZ2V0Um91dGVTZWxlY3RvciBzZWxlY3Rvcn0sIHRoZW4gc2hvd3MgdGhlIHJvdXRlIGNob29zZXIgZGlhbG9nLgotICAgICAqIE90aGVyd2lzZSwgc2hvd3MgdGhlIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIHRvIG9mZmVyIHRoZSB1c2VyCi0gICAgICogYSBjaG9pY2UgdG8gZGlzY29ubmVjdCBmcm9tIHRoZSByb3V0ZSBvciBwZXJmb3JtIG90aGVyIGNvbnRyb2wgYWN0aW9ucwotICAgICAqIHN1Y2ggYXMgc2V0dGluZyB0aGUgcm91dGUncyB2b2x1bWUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBjYW4gY3VzdG9taXplIHRoZSBkaWFsb2dzIGJ5IGNhbGxpbmcge0BsaW5rICNzZXREaWFsb2dGYWN0b3J5fQotICAgICAqIHRvIHByb3ZpZGUgYSBjdXN0b21pemVkIGRpYWxvZyBmYWN0b3J5LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZGlhbG9nIHdhcyBhY3R1YWxseSBzaG93bi4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBhY3Rpdml0eSBpcyBub3QgYSBzdWJjbGFzcyBvZgotICAgICAqIHtAbGluayBGcmFnbWVudEFjdGl2aXR5fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzaG93RGlhbG9nKCkgewotICAgICAgICBpZiAoIW1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBGcmFnbWVudE1hbmFnZXIgZm0gPSBnZXRBY3Rpdml0eSgpLmdldEZyYWdtZW50TWFuYWdlcigpOwotICAgICAgICBpZiAoZm0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGFjdGl2aXR5IG11c3QgYmUgYSBzdWJjbGFzcyBvZiBGcmFnbWVudEFjdGl2aXR5Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtUm91dGVyLmdldFNlbGVjdGVkUm91dGUoKTsKLSAgICAgICAgaWYgKHJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkgfHwgIXJvdXRlLm1hdGNoZXNTZWxlY3RvcihtU2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICBpZiAoZm0uZmluZEZyYWdtZW50QnlUYWcoQ0hPT1NFUl9GUkFHTUVOVF9UQUcpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzaG93RGlhbG9nKCk6IFJvdXRlIGNob29zZXIgZGlhbG9nIGFscmVhZHkgc2hvd2luZyEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50IGYgPQotICAgICAgICAgICAgICAgICAgICBtRGlhbG9nRmFjdG9yeS5vbkNyZWF0ZUNob29zZXJEaWFsb2dGcmFnbWVudCgpOwotICAgICAgICAgICAgZi5zZXRSb3V0ZVNlbGVjdG9yKG1TZWxlY3Rvcik7Ci0gICAgICAgICAgICBmLnNob3coZm0sIENIT09TRVJfRlJBR01FTlRfVEFHKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChmbS5maW5kRnJhZ21lbnRCeVRhZyhDT05UUk9MTEVSX0ZSQUdNRU5UX1RBRykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNob3dEaWFsb2coKTogUm91dGUgY29udHJvbGxlciBkaWFsb2cgYWxyZWFkeSBzaG93aW5nISIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQgZiA9Ci0gICAgICAgICAgICAgICAgICAgIG1EaWFsb2dGYWN0b3J5Lm9uQ3JlYXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50KCk7Ci0gICAgICAgICAgICBmLnNob3coZm0sIENPTlRST0xMRVJfRlJBR01FTlRfVEFHKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgQWN0aXZpdHkgZ2V0QWN0aXZpdHkoKSB7Ci0gICAgICAgIC8vIEdyb3NzIHdheSBvZiB1bndyYXBwaW5nIHRoZSBBY3Rpdml0eSBzbyB3ZSBjYW4gZ2V0IHRoZSBGcmFnbWVudE1hbmFnZXIKLSAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotICAgICAgICB3aGlsZSAoY29udGV4dCBpbnN0YW5jZW9mIENvbnRleHRXcmFwcGVyKSB7Ci0gICAgICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChBY3Rpdml0eSljb250ZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGV4dCA9ICgoQ29udGV4dFdyYXBwZXIpY29udGV4dCkuZ2V0QmFzZUNvbnRleHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdG8gZW5hYmxlIHNob3dpbmcgYSB0b2FzdCB3aXRoIHRoZSBjb250ZW50IGRlc2NyaXB0b3Igb2YgdGhlCi0gICAgICogYnV0dG9uIHdoZW4gdGhlIGJ1dHRvbiBpcyBsb25nIHByZXNzZWQuCi0gICAgICovCi0gICAgdm9pZCBzZXRDaGVhdFNoZWV0RW5hYmxlZChib29sZWFuIGVuYWJsZSkgewotICAgICAgICBUb29sdGlwQ29tcGF0LnNldFRvb2x0aXBUZXh0KHRoaXMsIGVuYWJsZQotICAgICAgICAgICAgICAgID8gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhnZXRDb250ZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoUi5zdHJpbmcubXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24pCi0gICAgICAgICAgICAgICAgOiBudWxsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2xpY2soKSB7Ci0gICAgICAgIC8vIFNlbmQgdGhlIGFwcHJvcHJpYXRlIGFjY2Vzc2liaWxpdHkgZXZlbnRzIGFuZCBjYWxsIGxpc3RlbmVycwotICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBzdXBlci5wZXJmb3JtQ2xpY2soKTsKLSAgICAgICAgaWYgKCFoYW5kbGVkKSB7Ci0gICAgICAgICAgICBwbGF5U291bmRFZmZlY3QoU291bmRFZmZlY3RDb25zdGFudHMuQ0xJQ0spOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzaG93RGlhbG9nKCkgfHwgaGFuZGxlZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgaW50W10gb25DcmVhdGVEcmF3YWJsZVN0YXRlKGludCBleHRyYVNwYWNlKSB7Ci0gICAgICAgIGZpbmFsIGludFtdIGRyYXdhYmxlU3RhdGUgPSBzdXBlci5vbkNyZWF0ZURyYXdhYmxlU3RhdGUoZXh0cmFTcGFjZSArIDEpOwotCi0gICAgICAgIC8vIFRlY2huaWNhbGx5IHdlIHNob3VsZCBiZSBoYW5kbGluZyB0aGlzIG1vcmUgY29tcGxldGVseSwgYnV0IHRoZXNlCi0gICAgICAgIC8vIGFyZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGhlcmUuIENoZWNrYWJsZSBpcyB1c2VkIHRvIGV4cHJlc3MgdGhlIGNvbm5lY3RpbmcKLSAgICAgICAgLy8gZHJhd2FibGUgc3RhdGUgYW5kIGl0J3MgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggY2hlY2sgZm9yIHRoZSBwdXJwb3NlcwotICAgICAgICAvLyBvZiBzdGF0ZSBzZWxlY3Rpb24gaGVyZS4KLSAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgIG1lcmdlRHJhd2FibGVTdGF0ZXMoZHJhd2FibGVTdGF0ZSwgQ0hFQ0tBQkxFX1NUQVRFX1NFVCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVJlbW90ZUFjdGl2ZSkgewotICAgICAgICAgICAgbWVyZ2VEcmF3YWJsZVN0YXRlcyhkcmF3YWJsZVN0YXRlLCBDSEVDS0VEX1NUQVRFX1NFVCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRyYXdhYmxlU3RhdGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZHJhd2FibGVTdGF0ZUNoYW5nZWQoKSB7Ci0gICAgICAgIHN1cGVyLmRyYXdhYmxlU3RhdGVDaGFuZ2VkKCk7Ci0KLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50W10gbXlEcmF3YWJsZVN0YXRlID0gZ2V0RHJhd2FibGVTdGF0ZSgpOwotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5zZXRTdGF0ZShteURyYXdhYmxlU3RhdGUpOwotICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGRyYXdhYmxlIHRvIHVzZSBhcyB0aGUgcmVtb3RlIHJvdXRlIGluZGljYXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdGVJbmRpY2F0b3JEcmF3YWJsZShEcmF3YWJsZSBkKSB7Ci0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yTG9hZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3JMb2FkZXIuY2FuY2VsKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3Iuc2V0Q2FsbGJhY2sobnVsbCk7Ci0gICAgICAgICAgICB1bnNjaGVkdWxlRHJhd2FibGUobVJlbW90ZUluZGljYXRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1CdXR0b25UaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkID0gRHJhd2FibGVDb21wYXQud3JhcChkLm11dGF0ZSgpKTsKLSAgICAgICAgICAgICAgICBEcmF3YWJsZUNvbXBhdC5zZXRUaW50TGlzdChkLCBtQnV0dG9uVGludCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkLnNldENhbGxiYWNrKHRoaXMpOwotICAgICAgICAgICAgZC5zZXRTdGF0ZShnZXREcmF3YWJsZVN0YXRlKCkpOwotICAgICAgICAgICAgZC5zZXRWaXNpYmxlKGdldFZpc2liaWxpdHkoKSA9PSBWSVNJQkxFLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVJlbW90ZUluZGljYXRvciA9IGQ7Ci0KLSAgICAgICAgcmVmcmVzaERyYXdhYmxlU3RhdGUoKTsKLSAgICAgICAgaWYgKG1BdHRhY2hlZFRvV2luZG93ICYmIG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIG1SZW1vdGVJbmRpY2F0b3IuZ2V0Q3VycmVudCgpIGluc3RhbmNlb2YgQW5pbWF0aW9uRHJhd2FibGUpIHsKLSAgICAgICAgICAgIEFuaW1hdGlvbkRyYXdhYmxlIGN1ckRyYXdhYmxlID0gKEFuaW1hdGlvbkRyYXdhYmxlKSBtUmVtb3RlSW5kaWNhdG9yLmdldEN1cnJlbnQoKTsKLSAgICAgICAgICAgIGlmIChtSXNDb25uZWN0aW5nKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjdXJEcmF3YWJsZS5pc1J1bm5pbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zdGFydCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVJlbW90ZUFjdGl2ZSkgewotICAgICAgICAgICAgICAgIGlmIChjdXJEcmF3YWJsZS5pc1J1bm5pbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnNlbGVjdERyYXdhYmxlKGN1ckRyYXdhYmxlLmdldE51bWJlck9mRnJhbWVzKCkgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIHZlcmlmeURyYXdhYmxlKERyYXdhYmxlIHdobykgewotICAgICAgICByZXR1cm4gc3VwZXIudmVyaWZ5RHJhd2FibGUod2hvKSB8fCB3aG8gPT0gbVJlbW90ZUluZGljYXRvcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBqdW1wRHJhd2FibGVzVG9DdXJyZW50U3RhdGUoKSB7Ci0gICAgICAgIC8vIFdlIGNhbid0IGNhbGwgc3VwZXIgdG8gaGFuZGxlIHRoZSBiYWNrZ3JvdW5kIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4KLSAgICAgICAgLy9zdXBlci5qdW1wRHJhd2FibGVzVG9DdXJyZW50U3RhdGUoKTsKLSAgICAgICAgaWYgKGdldEJhY2tncm91bmQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBEcmF3YWJsZUNvbXBhdC5qdW1wVG9DdXJyZW50U3RhdGUoZ2V0QmFja2dyb3VuZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEhhbmRsZSBvdXIgb3duIHJlbW90ZSBpbmRpY2F0b3IuCi0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIERyYXdhYmxlQ29tcGF0Lmp1bXBUb0N1cnJlbnRTdGF0ZShtUmVtb3RlSW5kaWNhdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpc2liaWxpdHkoaW50IHZpc2liaWxpdHkpIHsKLSAgICAgICAgc3VwZXIuc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLQotICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLnNldFZpc2libGUoZ2V0VmlzaWJpbGl0eSgpID09IFZJU0lCTEUsIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7Ci0KLSAgICAgICAgbUF0dGFjaGVkVG9XaW5kb3cgPSB0cnVlOwotICAgICAgICBpZiAoIW1TZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssIG1Sb3V0ZUNhbGxiYWNrRmxhZ3MpOwotICAgICAgICB9Ci0gICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IGZhbHNlOwotICAgICAgICBpZiAoIW1TZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLm9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgZmluYWwgaW50IHdpZHRoU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgIGZpbmFsIGludCBoZWlnaHRTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgICAgIGZpbmFsIGludCB3aWR0aE1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0TW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUoaGVpZ2h0TWVhc3VyZVNwZWMpOwotCi0gICAgICAgIGZpbmFsIGludCB3aWR0aCA9IE1hdGgubWF4KG1NaW5XaWR0aCwgbVJlbW90ZUluZGljYXRvciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLmdldEludHJpbnNpY1dpZHRoKCkgKyBnZXRQYWRkaW5nTGVmdCgpICsgZ2V0UGFkZGluZ1JpZ2h0KCkgOiAwKTsKLSAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IE1hdGgubWF4KG1NaW5IZWlnaHQsIG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5nZXRJbnRyaW5zaWNIZWlnaHQoKSArIGdldFBhZGRpbmdUb3AoKSArIGdldFBhZGRpbmdCb3R0b20oKSA6IDApOwotCi0gICAgICAgIGludCBtZWFzdXJlZFdpZHRoOwotICAgICAgICBzd2l0Y2ggKHdpZHRoTW9kZSkgewotICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5FWEFDVExZOgotICAgICAgICAgICAgICAgIG1lYXN1cmVkV2lkdGggPSB3aWR0aFNpemU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lYXN1cmVTcGVjLkFUX01PU1Q6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRXaWR0aCA9IE1hdGgubWluKHdpZHRoU2l6ZSwgd2lkdGgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQ6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRXaWR0aCA9IHdpZHRoOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG1lYXN1cmVkSGVpZ2h0OwotICAgICAgICBzd2l0Y2ggKGhlaWdodE1vZGUpIHsKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuRVhBQ1RMWToKLSAgICAgICAgICAgICAgICBtZWFzdXJlZEhlaWdodCA9IGhlaWdodFNpemU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lYXN1cmVTcGVjLkFUX01PU1Q6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRIZWlnaHQgPSBNYXRoLm1pbihoZWlnaHRTaXplLCBoZWlnaHQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQ6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRIZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbihtZWFzdXJlZFdpZHRoLCBtZWFzdXJlZEhlaWdodCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7Ci0KLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgaW50IGxlZnQgPSBnZXRQYWRkaW5nTGVmdCgpOwotICAgICAgICAgICAgZmluYWwgaW50IHJpZ2h0ID0gZ2V0V2lkdGgoKSAtIGdldFBhZGRpbmdSaWdodCgpOwotICAgICAgICAgICAgZmluYWwgaW50IHRvcCA9IGdldFBhZGRpbmdUb3AoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBib3R0b20gPSBnZXRIZWlnaHQoKSAtIGdldFBhZGRpbmdCb3R0b20oKTsKLQotICAgICAgICAgICAgZmluYWwgaW50IGRyYXdXaWR0aCA9IG1SZW1vdGVJbmRpY2F0b3IuZ2V0SW50cmluc2ljV2lkdGgoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBkcmF3SGVpZ2h0ID0gbVJlbW90ZUluZGljYXRvci5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBkcmF3TGVmdCA9IGxlZnQgKyAocmlnaHQgLSBsZWZ0IC0gZHJhd1dpZHRoKSAvIDI7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgZHJhd1RvcCA9IHRvcCArIChib3R0b20gLSB0b3AgLSBkcmF3SGVpZ2h0KSAvIDI7Ci0KLSAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3Iuc2V0Qm91bmRzKGRyYXdMZWZ0LCBkcmF3VG9wLAotICAgICAgICAgICAgICAgICAgICBkcmF3TGVmdCArIGRyYXdXaWR0aCwgZHJhd1RvcCArIGRyYXdIZWlnaHQpOwotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5kcmF3KGNhbnZhcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHJlZnJlc2hSb3V0ZSgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbVJvdXRlci5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gaXNSZW1vdGUgPSAhcm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSAmJiByb3V0ZS5tYXRjaGVzU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc0Nvbm5lY3RpbmcgPSBpc1JlbW90ZSAmJiByb3V0ZS5pc0Nvbm5lY3RpbmcoKTsKLSAgICAgICAgYm9vbGVhbiBuZWVkc1JlZnJlc2ggPSBmYWxzZTsKLSAgICAgICAgaWYgKG1SZW1vdGVBY3RpdmUgIT0gaXNSZW1vdGUpIHsKLSAgICAgICAgICAgIG1SZW1vdGVBY3RpdmUgPSBpc1JlbW90ZTsKLSAgICAgICAgICAgIG5lZWRzUmVmcmVzaCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmcgIT0gaXNDb25uZWN0aW5nKSB7Ci0gICAgICAgICAgICBtSXNDb25uZWN0aW5nID0gaXNDb25uZWN0aW5nOwotICAgICAgICAgICAgbmVlZHNSZWZyZXNoID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuZWVkc1JlZnJlc2gpIHsKLSAgICAgICAgICAgIHVwZGF0ZUNvbnRlbnREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgcmVmcmVzaERyYXdhYmxlU3RhdGUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIHNldEVuYWJsZWQobVJvdXRlci5pc1JvdXRlQXZhaWxhYmxlKG1TZWxlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEUpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgbVJlbW90ZUluZGljYXRvci5nZXRDdXJyZW50KCkgaW5zdGFuY2VvZiBBbmltYXRpb25EcmF3YWJsZSkgewotICAgICAgICAgICAgQW5pbWF0aW9uRHJhd2FibGUgY3VyRHJhd2FibGUgPSAoQW5pbWF0aW9uRHJhd2FibGUpIG1SZW1vdGVJbmRpY2F0b3IuZ2V0Q3VycmVudCgpOwotICAgICAgICAgICAgaWYgKG1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgaWYgKChuZWVkc1JlZnJlc2ggfHwgaXNDb25uZWN0aW5nKSAmJiAhY3VyRHJhd2FibGUuaXNSdW5uaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyRHJhd2FibGUuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzUmVtb3RlICYmICFpc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSByb3V0ZSBpcyBhbHJlYWR5IGNvbm5lY3RlZCBiZWZvcmUgdGhlIHZpZXcgaXMgYXR0YWNoZWQsIHNob3cgdGhlIGxhc3QKLSAgICAgICAgICAgICAgICAvLyBmcmFtZSBvZiB0aGUgY29ubmVjdGVkIGFuaW1hdGlvbiBpbW1lZGlhdGVseS4KLSAgICAgICAgICAgICAgICBpZiAoY3VyRHJhd2FibGUuaXNSdW5uaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyRHJhd2FibGUuc3RvcCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zZWxlY3REcmF3YWJsZShjdXJEcmF3YWJsZS5nZXROdW1iZXJPZkZyYW1lcygpIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ29udGVudERlc2NyaXB0aW9uKCkgewotICAgICAgICBpbnQgcmVzSWQ7Ci0gICAgICAgIGlmIChtSXNDb25uZWN0aW5nKSB7Ci0gICAgICAgICAgICByZXNJZCA9IFIuc3RyaW5nLm1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3Rpbmc7Ci0gICAgICAgIH0gZWxzZSBpZiAobVJlbW90ZUFjdGl2ZSkgewotICAgICAgICAgICAgcmVzSWQgPSBSLnN0cmluZy5tcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXNJZCA9IFIuc3RyaW5nLm1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZDsKLSAgICAgICAgfQotICAgICAgICBzZXRDb250ZW50RGVzY3JpcHRpb24oQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhnZXRDb250ZXh0KCkpLmdldFN0cmluZyhyZXNJZCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgICAgTWVkaWFSb3V0ZXJDYWxsYmFjaygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlclJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUmVtb3RlSW5kaWNhdG9yTG9hZGVyIGV4dGVuZHMgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIERyYXdhYmxlPiB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1SZXNJZDsKLQotICAgICAgICBSZW1vdGVJbmRpY2F0b3JMb2FkZXIoaW50IHJlc0lkKSB7Ci0gICAgICAgICAgICBtUmVzSWQgPSByZXNJZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgRHJhd2FibGUgZG9JbkJhY2tncm91bmQoVm9pZC4uLiBwYXJhbXMpIHsKLSAgICAgICAgICAgIHJldHVybiBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGdldENvbnRleHQoKSkuZ2V0RHJhd2FibGUobVJlc0lkKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFeGVjdXRlKERyYXdhYmxlIHJlbW90ZUluZGljYXRvcikgewotICAgICAgICAgICAgY2FjaGVBbmRSZXNldChyZW1vdGVJbmRpY2F0b3IpOwotICAgICAgICAgICAgc2V0UmVtb3RlSW5kaWNhdG9yRHJhd2FibGUocmVtb3RlSW5kaWNhdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNhbmNlbGxlZChEcmF3YWJsZSByZW1vdGVJbmRpY2F0b3IpIHsKLSAgICAgICAgICAgIGNhY2hlQW5kUmVzZXQocmVtb3RlSW5kaWNhdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBjYWNoZUFuZFJlc2V0KERyYXdhYmxlIHJlbW90ZUluZGljYXRvcikgewotICAgICAgICAgICAgaWYgKHJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc1JlbW90ZUluZGljYXRvckNhY2hlLnB1dChtUmVzSWQsIHJlbW90ZUluZGljYXRvci5nZXRDb25zdGFudFN0YXRlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvckxvYWRlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYzY0ZDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ2hvb3NlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvLkNPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORzsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuQXBwQ29tcGF0RGlhbG9nOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgcm91dGUgY2hvb3NlciBkaWFsb2cgZm9yIHtAbGluayBNZWRpYVJvdXRlcn0uCi0gKiA8cD4KLSAqIFRoaXMgZGlhbG9nIGFsbG93cyB0aGUgdXNlciB0byBjaG9vc2UgYSByb3V0ZSB0aGF0IG1hdGNoZXMgYSBnaXZlbiBzZWxlY3Rvci4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIE1lZGlhUm91dGVCdXR0b24KLSAqIEBzZWUgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZUNob29zZXJEaWFsb2ciOwotCi0gICAgLy8gRG8gbm90IHVwZGF0ZSB0aGUgcm91dGUgbGlzdCBpbW1lZGlhdGVseSB0byBhdm9pZCB1bm5hdHVyYWwgZGlhbG9nIGNoYW5nZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVQREFURV9ST1VURVNfREVMQVlfTVMgPSAzMDBMOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VQREFURV9ST1VURVMgPSAxOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXJDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gbVJvdXRlczsKLSAgICBwcml2YXRlIFJvdXRlQWRhcHRlciBtQWRhcHRlcjsKLSAgICBwcml2YXRlIExpc3RWaWV3IG1MaXN0VmlldzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUF0dGFjaGVkVG9XaW5kb3c7Ci0gICAgcHJpdmF0ZSBsb25nIG1MYXN0VXBkYXRlVGltZTsKLSAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgTVNHX1VQREFURV9ST1VURVM6Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJvdXRlcygoTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+KSBtZXNzYWdlLm9iaik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2coQ29udGV4dCBjb250ZXh0LCBpbnQgdGhlbWUpIHsKLSAgICAgICAgLy8gVE9ETyAoYi83Mjk3NTk3Nik6IEF2b2lkIHRvIHVzZSBDb250ZXh0VGhlbWVXcmFwcGVyIHdpdGggYXBwIGNvbnRleHQgYW5kIGxpYiB0aGVtZS4KLSAgICAgICAgc3VwZXIobmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgQXBpSGVscGVyLmdldExpYlRoZW1lKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpKSksIHRoZW1lKTsKLSAgICAgICAgY29udGV4dCA9IGdldENvbnRleHQoKTsKLQotICAgICAgICBtUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlckNhbGxiYWNrKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuIHNlbGVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICByZXR1cm4gbVNlbGVjdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbiBzZWxlY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yLCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1TZWxlY3Rvci5lcXVhbHMoc2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICBtU2VsZWN0b3IgPSBzZWxlY3RvcjsKLQotICAgICAgICAgICAgaWYgKG1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2soc2VsZWN0b3IsIG1DYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB0byBmaWx0ZXIgdGhlIHNldCBvZiByb3V0ZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXRlcmF0ZXMgb3ZlciBhbGwgcm91dGVzIGluIHRoZSBwcm92aWRlZCBsaXN0IGFuZAotICAgICAqIHJlbW92ZXMgdGhvc2UgZm9yIHdoaWNoIHtAbGluayAjb25GaWx0ZXJSb3V0ZX0gcmV0dXJucyBmYWxzZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGVzIFRoZSBsaXN0IG9mIHJvdXRlcyB0byBmaWx0ZXIgaW4tcGxhY2UsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25GaWx0ZXJSb3V0ZXMoQE5vbk51bGwgTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHJvdXRlcykgewotICAgICAgICBmb3IgKGludCBpID0gcm91dGVzLnNpemUoKTsgaS0tID4gMDsgKSB7Ci0gICAgICAgICAgICBpZiAoIW9uRmlsdGVyUm91dGUocm91dGVzLmdldChpKSkpIHsKLSAgICAgICAgICAgICAgICByb3V0ZXMucmVtb3ZlKGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGZvciBlbmFibGVkIG5vbi1kZWZhdWx0IHJvdXRlcyB0aGF0Ci0gICAgICogbWF0Y2ggdGhlIHNlbGVjdG9yLiAgU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gZmlsdGVyIHJvdXRlcwotICAgICAqIGRpZmZlcmVudGx5LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdG8gY29uc2lkZXIsIG5ldmVyIG51bGwuCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSByb3V0ZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGNob29zZXIgZGlhbG9nLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG9uRmlsdGVyUm91dGUoQE5vbk51bGwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIHJldHVybiAhcm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSAmJiByb3V0ZS5pc0VuYWJsZWQoKQotICAgICAgICAgICAgICAgICYmIHJvdXRlLm1hdGNoZXNTZWxlY3RvcihtU2VsZWN0b3IpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgewotICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQodGl0bGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKGludCB0aXRsZUlkKSB7Ci0gICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZUlkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0KLSAgICAgICAgc2V0Q29udGVudFZpZXcoQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQoZ2V0Q29udGV4dCgpLCBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChnZXRDb250ZXh0KCkpKSwKLSAgICAgICAgICAgICAgICBSLmxheW91dC5tcl9jaG9vc2VyX2RpYWxvZykpOwotCi0gICAgICAgIG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgbUFkYXB0ZXIgPSBuZXcgUm91dGVBZGFwdGVyKGdldENvbnRleHQoKSwgbVJvdXRlcyk7Ci0gICAgICAgIG1MaXN0VmlldyA9IChMaXN0VmlldylmaW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX2xpc3QpOwotICAgICAgICBtTGlzdFZpZXcuc2V0QWRhcHRlcihtQWRhcHRlcik7Ci0gICAgICAgIG1MaXN0Vmlldy5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG1BZGFwdGVyKTsKLSAgICAgICAgbUxpc3RWaWV3LnNldEVtcHR5VmlldyhmaW5kVmlld0J5SWQoYW5kcm9pZC5SLmlkLmVtcHR5KSk7Ci0gICAgICAgIG1UaXRsZVZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX3RpdGxlKTsKLQotICAgICAgICB1cGRhdGVMYXlvdXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB3aWR0aCBvZiB0aGUgZGlhbG9nLiBBbHNvIGNhbGxlZCB3aGVuIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4KLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZUxheW91dCgpIHsKLSAgICAgICAgZ2V0V2luZG93KCkuc2V0TGF5b3V0KE1lZGlhUm91dGVEaWFsb2dIZWxwZXIuZ2V0RGlhbG9nV2lkdGgoZ2V0Q29udGV4dCgpKSwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLQotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IHRydWU7Ci0gICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTik7Ci0gICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKLSAgICAgICAgbUF0dGFjaGVkVG9XaW5kb3cgPSBmYWxzZTsKLSAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfVVBEQVRFX1JPVVRFUyk7Ci0KLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWZyZXNoZXMgdGhlIGxpc3Qgb2Ygcm91dGVzIHRoYXQgYXJlIHNob3duIGluIHRoZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoUm91dGVzKCkgewotICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8PihtUm91dGVyLmdldFJvdXRlcygpKTsKLSAgICAgICAgICAgIG9uRmlsdGVyUm91dGVzKHJvdXRlcyk7Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJvdXRlcywgUm91dGVDb21wYXJhdG9yLnNJbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBtTGFzdFVwZGF0ZVRpbWUgPj0gVVBEQVRFX1JPVVRFU19ERUxBWV9NUykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVJvdXRlcyhyb3V0ZXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfVVBEQVRFX1JPVVRFUyk7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfVVBEQVRFX1JPVVRFUywgcm91dGVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VXBkYXRlVGltZSArIFVQREFURV9ST1VURVNfREVMQVlfTVMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVSb3V0ZXMoTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHJvdXRlcykgewotICAgICAgICBtTGFzdFVwZGF0ZVRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbVJvdXRlcy5jbGVhcigpOwotICAgICAgICBtUm91dGVzLmFkZEFsbChyb3V0ZXMpOwotICAgICAgICBtQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUm91dGVBZGFwdGVyIGV4dGVuZHMgQXJyYXlBZGFwdGVyPE1lZGlhUm91dGVyLlJvdXRlSW5mbz4KLSAgICAgICAgICAgIGltcGxlbWVudHMgTGlzdFZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbURlZmF1bHRJY29uOwotICAgICAgICBwcml2YXRlIGZpbmFsIERyYXdhYmxlIG1Udkljb247Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbVNwZWFrZXJJY29uOwotICAgICAgICBwcml2YXRlIGZpbmFsIERyYXdhYmxlIG1TcGVha2VyR3JvdXBJY29uOwotCi0gICAgICAgIHB1YmxpYyBSb3V0ZUFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCAwLCByb3V0ZXMpOwotCi0gICAgICAgICAgICBUeXBlZEFycmF5IHN0eWxlZEF0dHJpYnV0ZXMgPSBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpKS5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuYXR0ci5tZWRpYVJvdXRlRGVmYXVsdEljb25EcmF3YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5hdHRyLm1lZGlhUm91dGVUdkljb25EcmF3YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5hdHRyLm1lZGlhUm91dGVTcGVha2VySWNvbkRyYXdhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmF0dHIubWVkaWFSb3V0ZVNwZWFrZXJHcm91cEljb25EcmF3YWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBtRGVmYXVsdEljb24gPSBzdHlsZWRBdHRyaWJ1dGVzLmdldERyYXdhYmxlKDApOwotICAgICAgICAgICAgbVR2SWNvbiA9IHN0eWxlZEF0dHJpYnV0ZXMuZ2V0RHJhd2FibGUoMSk7Ci0gICAgICAgICAgICBtU3BlYWtlckljb24gPSBzdHlsZWRBdHRyaWJ1dGVzLmdldERyYXdhYmxlKDIpOwotICAgICAgICAgICAgbVNwZWFrZXJHcm91cEljb24gPSBzdHlsZWRBdHRyaWJ1dGVzLmdldERyYXdhYmxlKDMpOwotICAgICAgICAgICAgc3R5bGVkQXR0cmlidXRlcy5yZWN5Y2xlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gYXJlQWxsSXRlbXNFbmFibGVkKCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRJdGVtKHBvc2l0aW9uKS5pc0VuYWJsZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICAgICAgVmlldyB2aWV3ID0gY29udmVydFZpZXc7Ci0gICAgICAgICAgICBpZiAodmlldyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmlldyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KGdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJUaGVtZShnZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChnZXRDb250ZXh0KCkpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1yX2Nob29zZXJfbGlzdF9pdGVtLCBwYXJlbnQsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0MSA9IChUZXh0Vmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX3JvdXRlX25hbWUpOwotICAgICAgICAgICAgVGV4dFZpZXcgdGV4dDIgPSAoVGV4dFZpZXcpIHZpZXcuZmluZFZpZXdCeUlkKFIuaWQubXJfY2hvb3Nlcl9yb3V0ZV9kZXNjKTsKLSAgICAgICAgICAgIHRleHQxLnNldFRleHQocm91dGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IHJvdXRlLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBib29sZWFuIGlzQ29ubmVjdGVkT3JDb25uZWN0aW5nID0KLSAgICAgICAgICAgICAgICAgICAgcm91dGUuZ2V0Q29ubmVjdGlvblN0YXRlKCkgPT0gQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCByb3V0ZS5nZXRDb25uZWN0aW9uU3RhdGUoKSA9PSBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkc7Ci0gICAgICAgICAgICBpZiAoaXNDb25uZWN0ZWRPckNvbm5lY3RpbmcgJiYgIVRleHRVdGlscy5pc0VtcHR5KGRlc2NyaXB0aW9uKSkgewotICAgICAgICAgICAgICAgIHRleHQxLnNldEdyYXZpdHkoR3Jhdml0eS5CT1RUT00pOwotICAgICAgICAgICAgICAgIHRleHQyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB0ZXh0Mi5zZXRUZXh0KGRlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGV4dDEuc2V0R3Jhdml0eShHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCk7Ci0gICAgICAgICAgICAgICAgdGV4dDIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIHRleHQyLnNldFRleHQoIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmlldy5zZXRFbmFibGVkKHJvdXRlLmlzRW5hYmxlZCgpKTsKLQotICAgICAgICAgICAgSW1hZ2VWaWV3IGljb25WaWV3ID0gKEltYWdlVmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX3JvdXRlX2ljb24pOwotICAgICAgICAgICAgaWYgKGljb25WaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRJbWFnZURyYXdhYmxlKGdldEljb25EcmF3YWJsZShyb3V0ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHZpZXc7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAocm91dGUuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICByb3V0ZS5zZWxlY3QoKTsKLSAgICAgICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIERyYXdhYmxlIGdldEljb25EcmF3YWJsZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIFVyaSBpY29uVXJpID0gcm91dGUuZ2V0SWNvblVyaSgpOwotICAgICAgICAgICAgaWYgKGljb25VcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbShpY29uVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBEcmF3YWJsZS5jcmVhdGVGcm9tU3RyZWFtKGlzLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXdhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkcmF3YWJsZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIGxvYWQgIiArIGljb25VcmksIGUpOwotICAgICAgICAgICAgICAgICAgICAvLyBGYWxscyBiYWNrLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SWNvbkRyYXdhYmxlKHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgRHJhd2FibGUgZ2V0RGVmYXVsdEljb25EcmF3YWJsZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSB0eXBlIG9mIHRoZSByZWNlaXZlciBkZXZpY2UgaXMgc3BlY2lmaWVkLCB1c2UgaXQuCi0gICAgICAgICAgICBzd2l0Y2ggKHJvdXRlLmdldERldmljZVR5cGUoKSkgewotICAgICAgICAgICAgICAgIGNhc2UgIE1lZGlhUm91dGVyLlJvdXRlSW5mby5ERVZJQ0VfVFlQRV9UVjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Udkljb247Ci0gICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uREVWSUNFX1RZUEVfU1BFQUtFUjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1TcGVha2VySWNvbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBtYWtlIHRoZSBiZXN0IGd1ZXNzIGJhc2VkIG9uIG90aGVyIHJvdXRlIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgaWYgKHJvdXRlIGluc3RhbmNlb2YgTWVkaWFSb3V0ZXIuUm91dGVHcm91cCkgewotICAgICAgICAgICAgICAgIC8vIE9ubHkgc3BlYWtlcnMgY2FuIGJlIGdyb3VwZWQgZm9yIG5vdy4KLSAgICAgICAgICAgICAgICByZXR1cm4gbVNwZWFrZXJHcm91cEljb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbURlZmF1bHRJY29uOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgewotICAgICAgICBNZWRpYVJvdXRlckNhbGxiYWNrKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yPE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFJvdXRlQ29tcGFyYXRvciBzSW5zdGFuY2UgPSBuZXcgUm91dGVDb21wYXJhdG9yKCk7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbGhzLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcmhzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGhzLmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJocy5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVlNmIyOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOwotaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZ0ZyYWdtZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotCi0vKioKLSAqIE1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nIGZyYWdtZW50LgotICogPHA+Ci0gKiBDcmVhdGVzIGEge0BsaW5rIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nfS4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgc3ViY2xhc3MKLSAqIHRoaXMgZGlhbG9nIGZyYWdtZW50IHRvIGN1c3RvbWl6ZSB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50IGV4dGVuZHMgRGlhbG9nRnJhZ21lbnQgewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIEFSR1VNRU5UX1NFTEVDVE9SID0gInNlbGVjdG9yIjsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cgbURpYWxvZzsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cgZnJhZ21lbnQuCi0gICAgICogPHA+Ci0gICAgICogQWxsIHN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcyBtdXN0IGFsc28gcG9zc2VzcyBhIGRlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50KCkgewotICAgICAgICBzZXRDYW5jZWxhYmxlKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbiBzZWxlY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzZWxlY3RvciwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlU2VsZWN0b3IoKTsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RvcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlUm91dGVTZWxlY3RvcigpIHsKLSAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOwotICAgICAgICAgICAgaWYgKGFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5mcm9tQnVuZGxlKGFyZ3MuZ2V0QnVuZGxlKEFSR1VNRU5UX1NFTEVDVE9SKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4gc2VsZWN0LgotICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZnJhZ21lbnQgaXMgYWRkZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSb3V0ZVNlbGVjdG9yKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZW5zdXJlUm91dGVTZWxlY3RvcigpOwotICAgICAgICBpZiAoIW1TZWxlY3Rvci5lcXVhbHMoc2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICBtU2VsZWN0b3IgPSBzZWxlY3RvcjsKLQotICAgICAgICAgICAgQnVuZGxlIGFyZ3MgPSBnZXRBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIGlmIChhcmdzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcmdzID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXJncy5wdXRCdW5kbGUoQVJHVU1FTlRfU0VMRUNUT1IsIHNlbGVjdG9yLmFzQnVuZGxlKCkpOwotICAgICAgICAgICAgc2V0QXJndW1lbnRzKGFyZ3MpOwotCi0gICAgICAgICAgICBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyBkaWFsb2cgPSAoTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cpZ2V0RGlhbG9nKCk7Ci0gICAgICAgICAgICBpZiAoZGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkaWFsb2cuc2V0Um91dGVTZWxlY3RvcihzZWxlY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY2hvb3NlciBkaWFsb2cgaXMgYmVpbmcgY3JlYXRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgdGhlIGRpYWxvZy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nIG9uQ3JlYXRlQ2hvb3NlckRpYWxvZygKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nKGNvbnRleHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEaWFsb2cgb25DcmVhdGVEaWFsb2coQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBtRGlhbG9nID0gb25DcmVhdGVDaG9vc2VyRGlhbG9nKGdldENvbnRleHQoKSwgc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgbURpYWxvZy5zZXRSb3V0ZVNlbGVjdG9yKGdldFJvdXRlU2VsZWN0b3IoKSk7Ci0gICAgICAgIHJldHVybiBtRGlhbG9nOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKLSAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOwotICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRGlhbG9nLnVwZGF0ZUxheW91dCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjBjZmNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9QQVVTRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZUNvbXBhdC5BQ1RJT05fUExBWTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZUNvbXBhdC5BQ1RJT05fUExBWV9QQVVTRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZUNvbXBhdC5BQ1RJT05fU1RPUDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOwotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLk1lZGlhRGVzY3JpcHRpb25Db21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLk1lZGlhTWV0YWRhdGFDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uTWVkaWFDb250cm9sbGVyQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbkNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLk9iamVjdHNDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnRDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY3LmdyYXBoaWNzLlBhbGV0dGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuTWVhc3VyZVNwZWM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFscGhhQW5pbWF0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2Zvcm1hdGlvbjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zbGF0ZUFuaW1hdGlvbjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5PdmVybGF5TGlzdFZpZXcuT3ZlcmxheU9iamVjdDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBmb3Ige0BsaW5rIE1lZGlhUm91dGVyfS4KLSAqIDxwPgotICogVGhpcyBkaWFsb2cgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbnRyb2wgb3IgZGlzY29ubmVjdCBmcm9tIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuCi0gKiA8L3A+Ci0gKgotICogQHNlZSBNZWRpYVJvdXRlQnV0dG9uCi0gKiBAc2VlIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2cgZXh0ZW5kcyBBbGVydERpYWxvZyB7Ci0gICAgLy8gVGFncyBzaG91bGQgYmUgbGVzcyB0aGFuIDI0IGNoYXJhY3RlcnMgbG9uZyAoc2VlIGRvY3MgZm9yIGFuZHJvaWQudXRpbC5Mb2cuaXNMb2dnYWJsZSgpKQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVDdHJsRGlhbG9nIjsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIC8vIFRpbWUgdG8gd2FpdCBiZWZvcmUgdXBkYXRpbmcgdGhlIHZvbHVtZSB3aGVuIHRoZSB1c2VyIGxldHMgZ28gb2YgdGhlIHNlZWsgYmFyCi0gICAgLy8gdG8gYWxsb3cgdGhlIHJvdXRlIHByb3ZpZGVyIHRpbWUgdG8gcHJvcGFnYXRlIHRoZSBjaGFuZ2UgYW5kIHB1Ymxpc2ggYSBuZXcKLSAgICAvLyByb3V0ZSBkZXNjcmlwdG9yLgotICAgIHN0YXRpYyBmaW5hbCBpbnQgVk9MVU1FX1VQREFURV9ERUxBWV9NSUxMSVMgPSA1MDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTID0gKGludCkgVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygzMEwpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9ORVVUUkFMX1JFU19JRCA9IGFuZHJvaWQuUi5pZC5idXR0b24zOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX0RJU0NPTk5FQ1RfUkVTX0lEID0gYW5kcm9pZC5SLmlkLmJ1dHRvbjI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBCVVRUT05fU1RPUF9SRVNfSUQgPSBhbmRyb2lkLlIuaWQuYnV0dG9uMTsKLQotICAgIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlckNhbGxiYWNrIG1DYWxsYmFjazsKLSAgICBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlOwotCi0gICAgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUNyZWF0ZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1BdHRhY2hlZFRvV2luZG93OwotCi0gICAgcHJpdmF0ZSBpbnQgbURpYWxvZ0NvbnRlbnRXaWR0aDsKLQotICAgIHByaXZhdGUgVmlldyBtQ3VzdG9tQ29udHJvbFZpZXc7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBtRGlzY29ubmVjdEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtU3RvcENhc3RpbmdCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtUGxheWJhY2tDb250cm9sQnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUNsb3NlQnV0dG9uOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uIG1Hcm91cEV4cGFuZENvbGxhcHNlQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBGcmFtZUxheW91dCBtRXhwYW5kYWJsZUFyZWFMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbURpYWxvZ0FyZWFMYXlvdXQ7Ci0gICAgRnJhbWVMYXlvdXQgbURlZmF1bHRDb250cm9sTGF5b3V0OwotICAgIHByaXZhdGUgRnJhbWVMYXlvdXQgbUN1c3RvbUNvbnRyb2xMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBJbWFnZVZpZXcgbUFydFZpZXc7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtVGl0bGVWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN1YnRpdGxlVmlldzsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1Sb3V0ZU5hbWVUZXh0VmlldzsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtVm9sdW1lQ29udHJvbEVuYWJsZWQgPSB0cnVlOwotICAgIC8vIExheW91dCBmb3IgbWVkaWEgY29udHJvbGxlcnMgaW5jbHVkaW5nIHBsYXkvcGF1c2UgYnV0dG9uIGFuZCB0aGUgbWFpbiB2b2x1bWUgc2xpZGVyLgotICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1NZWRpYU1haW5Db250cm9sTGF5b3V0OwotICAgIHByaXZhdGUgUmVsYXRpdmVMYXlvdXQgbVBsYXliYWNrQ29udHJvbExheW91dDsKLSAgICBwcml2YXRlIExpbmVhckxheW91dCBtVm9sdW1lQ29udHJvbExheW91dDsKLSAgICBwcml2YXRlIFZpZXcgbURpdmlkZXJWaWV3OwotCi0gICAgT3ZlcmxheUxpc3RWaWV3IG1Wb2x1bWVHcm91cExpc3Q7Ci0gICAgVm9sdW1lR3JvdXBBZGFwdGVyIG1Wb2x1bWVHcm91cEFkYXB0ZXI7Ci0gICAgcHJpdmF0ZSBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gbUdyb3VwTWVtYmVyUm91dGVzOwotICAgIFNldDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkOwotICAgIHByaXZhdGUgU2V0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZDsKLSAgICBTZXQ8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwOwotICAgIFNlZWtCYXIgbVZvbHVtZVNsaWRlcjsKLSAgICBWb2x1bWVDaGFuZ2VMaXN0ZW5lciBtVm9sdW1lQ2hhbmdlTGlzdGVuZXI7Ci0gICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZDsKLSAgICBwcml2YXRlIGludCBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplOwotICAgIHByaXZhdGUgaW50IG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0OwotICAgIHByaXZhdGUgaW50IG1Wb2x1bWVHcm91cExpc3RNYXhIZWlnaHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVZvbHVtZUdyb3VwTGlzdFBhZGRpbmdUb3A7Ci0gICAgTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgU2Vla0Jhcj4gbVZvbHVtZVNsaWRlck1hcDsKLQotICAgIE1lZGlhQ29udHJvbGxlckNvbXBhdCBtTWVkaWFDb250cm9sbGVyOwotICAgIE1lZGlhQ29udHJvbGxlckNhbGxiYWNrIG1Db250cm9sbGVyQ2FsbGJhY2s7Ci0gICAgUGxheWJhY2tTdGF0ZUNvbXBhdCBtU3RhdGU7Ci0gICAgTWVkaWFEZXNjcmlwdGlvbkNvbXBhdCBtRGVzY3JpcHRpb247Ci0KLSAgICBGZXRjaEFydFRhc2sgbUZldGNoQXJ0VGFzazsKLSAgICBCaXRtYXAgbUFydEljb25CaXRtYXA7Ci0gICAgVXJpIG1BcnRJY29uVXJpOwotICAgIGJvb2xlYW4gbUFydEljb25Jc0xvYWRlZDsKLSAgICBCaXRtYXAgbUFydEljb25Mb2FkZWRCaXRtYXA7Ci0gICAgaW50IG1BcnRJY29uQmFja2dyb3VuZENvbG9yOwotCi0gICAgYm9vbGVhbiBtSGFzUGVuZGluZ1VwZGF0ZTsKLSAgICBib29sZWFuIG1QZW5kaW5nVXBkYXRlQW5pbWF0aW9uTmVlZGVkOwotCi0gICAgYm9vbGVhbiBtSXNHcm91cEV4cGFuZGVkOwotICAgIGJvb2xlYW4gbUlzR3JvdXBMaXN0QW5pbWF0aW5nOwotICAgIGJvb2xlYW4gbUlzR3JvdXBMaXN0QW5pbWF0aW9uUGVuZGluZzsKLSAgICBpbnQgbUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXM7Ci0gICAgcHJpdmF0ZSBpbnQgbUdyb3VwTGlzdEZhZGVJbkR1cmF0aW9uTXM7Ci0gICAgcHJpdmF0ZSBpbnQgbUdyb3VwTGlzdEZhZGVPdXREdXJhdGlvbk1zOwotCi0gICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUludGVycG9sYXRvcjsKLSAgICBwcml2YXRlIEludGVycG9sYXRvciBtTGluZWFyT3V0U2xvd0luSW50ZXJwb2xhdG9yOwotICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1GYXN0T3V0U2xvd0luSW50ZXJwb2xhdG9yOwotICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1BY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcjsKLQotICAgIGZpbmFsIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKLQotICAgIFJ1bm5hYmxlIG1Hcm91cExpc3RGYWRlSW5BbmltYXRpb24gPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBzdGFydEdyb3VwTGlzdEZhZGVJbkFuaW1hdGlvbigpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2coQ29udGV4dCBjb250ZXh0LCBpbnQgdGhlbWUpIHsKLSAgICAgICAgLy8gVE9ETyAoYi83Mjk3NTk3Nik6IEF2b2lkIHRvIHVzZSBDb250ZXh0VGhlbWVXcmFwcGVyIHdpdGggYXBwIGNvbnRleHQgYW5kIGxpYiB0aGVtZS4KLSAgICAgICAgc3VwZXIobmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgQXBpSGVscGVyLmdldExpYlRoZW1lKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpKSksIHRoZW1lKTsKLSAgICAgICAgbUNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0KLSAgICAgICAgbUNvbnRyb2xsZXJDYWxsYmFjayA9IG5ldyBNZWRpYUNvbnRyb2xsZXJDYWxsYmFjaygpOwotICAgICAgICBtUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UobUNvbnRleHQpOwotICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXJDYWxsYmFjaygpOwotICAgICAgICBtUm91dGUgPSBtUm91dGVyLmdldFNlbGVjdGVkUm91dGUoKTsKLSAgICAgICAgc2V0TWVkaWFTZXNzaW9uKG1Sb3V0ZXIuZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKSk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3RQYWRkaW5nVG9wID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X3BhZGRpbmdfdG9wKTsKLSAgICAgICAgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAoQWNjZXNzaWJpbGl0eU1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BQ0NFU1NJQklMSVRZX1NFUlZJQ0UpOwotICAgICAgICBtTGluZWFyT3V0U2xvd0luSW50ZXJwb2xhdG9yID0gQW5pbWF0aW9uVXRpbHMubG9hZEludGVycG9sYXRvcigKLSAgICAgICAgICAgICAgICBtQ29udGV4dCwgYW5kcm9pZC5SLmludGVycG9sYXRvci5saW5lYXJfb3V0X3Nsb3dfaW4pOwotICAgICAgICBtRmFzdE91dFNsb3dJbkludGVycG9sYXRvciA9IEFuaW1hdGlvblV0aWxzLmxvYWRJbnRlcnBvbGF0b3IoCi0gICAgICAgICAgICAgICAgbUNvbnRleHQsIGFuZHJvaWQuUi5pbnRlcnBvbGF0b3IuZmFzdF9vdXRfc2xvd19pbik7Ci0gICAgICAgIG1BY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvciA9IG5ldyBBY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlIHRoYXQgdGhpcyBkaWFsb2cgaXMgY29udHJvbGxpbmcuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBnZXRSb3V0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVyLlJvdXRlR3JvdXAgZ2V0R3JvdXAoKSB7Ci0gICAgICAgIGlmIChtUm91dGUgaW5zdGFuY2VvZiBNZWRpYVJvdXRlci5Sb3V0ZUdyb3VwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKE1lZGlhUm91dGVyLlJvdXRlR3JvdXApIG1Sb3V0ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyB0aGUgc3ViY2xhc3MgYW4gb3Bwb3J0dW5pdHkgdG8gY3JlYXRlIGEgdmlldyB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgZGVmYXVsdCBtZWRpYQotICAgICAqIGNvbnRyb2xzIGZvciB0aGUgY3VycmVudGx5IHBsYXlpbmcgY29udGVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzYXZlZEluc3RhbmNlU3RhdGUgVGhlIGRpYWxvZydzIHNhdmVkIGluc3RhbmNlIHN0YXRlLgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIGNvbnRyb2wgdmlldywgb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlTWVkaWFDb250cm9sVmlldyhCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIGNvbnRyb2wgdmlldyB0aGF0IHdhcyBjcmVhdGVkIGJ5IHtAbGluayAjb25DcmVhdGVNZWRpYUNvbnRyb2xWaWV3KEJ1bmRsZSl9LgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbWVkaWEgY29udHJvbCB2aWV3LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIFZpZXcgZ2V0TWVkaWFDb250cm9sVmlldygpIHsKLSAgICAgICAgcmV0dXJuIG1DdXN0b21Db250cm9sVmlldzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdG8gZW5hYmxlIHRoZSB2b2x1bWUgc2xpZGVyIGFuZCB2b2x1bWUgY29udHJvbCB1c2luZyB0aGUgdm9sdW1lIGtleXMKLSAgICAgKiB3aGVuIHRoZSByb3V0ZSBzdXBwb3J0cyBpdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWVDb250cm9sRW5hYmxlZChib29sZWFuIGVuYWJsZSkgewotICAgICAgICBpZiAobVZvbHVtZUNvbnRyb2xFbmFibGVkICE9IGVuYWJsZSkgewotICAgICAgICAgICAgbVZvbHVtZUNvbnRyb2xFbmFibGVkID0gZW5hYmxlOwotICAgICAgICAgICAgaWYgKG1DcmVhdGVkKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0byBlbmFibGUgdGhlIHZvbHVtZSBzbGlkZXIgYW5kIHZvbHVtZSBjb250cm9sIHVzaW5nIHRoZSB2b2x1bWUga2V5cwotICAgICAqIHdoZW4gdGhlIHJvdXRlIHN1cHBvcnRzIGl0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVm9sdW1lQ29udHJvbEVuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBtVm9sdW1lQ29udHJvbEVuYWJsZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzZXNzaW9uIHRvIHVzZSBmb3IgbWV0YWRhdGEgYW5kIHRyYW5zcG9ydCBjb250cm9scy4gVGhlIGRpYWxvZwotICAgICAqIHdpbGwgbGlzdGVuIHRvIGNoYW5nZXMgb24gdGhpcyBzZXNzaW9uIGFuZCB1cGRhdGUgdGhlIFVJIGF1dG9tYXRpY2FsbHkgaW4KLSAgICAgKiByZXNwb25zZSB0byBjaGFuZ2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlc3Npb25Ub2tlbiBUaGUgdG9rZW4gZm9yIHRoZSBzZXNzaW9uIHRvIHVzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0TWVkaWFTZXNzaW9uKE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBzZXNzaW9uVG9rZW4pIHsKLSAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci51bnJlZ2lzdGVyQ2FsbGJhY2sobUNvbnRyb2xsZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2Vzc2lvblRva2VuID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIgPSBuZXcgTWVkaWFDb250cm9sbGVyQ29tcGF0KG1Db250ZXh0LCBzZXNzaW9uVG9rZW4pOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgY3JlYXRpbmcgbWVkaWEgY29udHJvbGxlciBpbiBzZXRNZWRpYVNlc3Npb24uIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5yZWdpc3RlckNhbGxiYWNrKG1Db250cm9sbGVyQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIE1lZGlhTWV0YWRhdGFDb21wYXQgbWV0YWRhdGEgPSBtTWVkaWFDb250cm9sbGVyID09IG51bGwgPyBudWxsCi0gICAgICAgICAgICAgICAgOiBtTWVkaWFDb250cm9sbGVyLmdldE1ldGFkYXRhKCk7Ci0gICAgICAgIG1EZXNjcmlwdGlvbiA9IG1ldGFkYXRhID09IG51bGwgPyBudWxsIDogbWV0YWRhdGEuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgbVN0YXRlID0gbU1lZGlhQ29udHJvbGxlciA9PSBudWxsID8gbnVsbCA6IG1NZWRpYUNvbnRyb2xsZXIuZ2V0UGxheWJhY2tTdGF0ZSgpOwotICAgICAgICB1cGRhdGVBcnRJY29uSWZOZWVkZWQoKTsKLSAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZXNzaW9uIHRvIHVzZSBmb3IgbWV0YWRhdGEgYW5kIHRyYW5zcG9ydCBjb250cm9scy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHRva2VuIGZvciB0aGUgc2Vzc2lvbiB0byB1c2Ugb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVNlc3Npb25Db21wYXQuVG9rZW4gZ2V0TWVkaWFTZXNzaW9uKCkgewotICAgICAgICByZXR1cm4gbU1lZGlhQ29udHJvbGxlciA9PSBudWxsID8gbnVsbCA6IG1NZWRpYUNvbnRyb2xsZXIuZ2V0U2Vzc2lvblRva2VuKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotCi0gICAgICAgIGdldFdpbmRvdygpLnNldEJhY2tncm91bmREcmF3YWJsZVJlc291cmNlKGFuZHJvaWQuUi5jb2xvci50cmFuc3BhcmVudCk7Ci0KLSAgICAgICAgc2V0Q29udGVudFZpZXcoQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlRoZW1lKG1Db250ZXh0LCBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQobUNvbnRleHQpKSwKLSAgICAgICAgICAgICAgICBSLmxheW91dC5tcl9jb250cm9sbGVyX21hdGVyaWFsX2RpYWxvZ19iKSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBuZXV0cmFsIGJ1dHRvbi4KLSAgICAgICAgZmluZFZpZXdCeUlkKEJVVFRPTl9ORVVUUkFMX1JFU19JRCkuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgIENsaWNrTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQ2xpY2tMaXN0ZW5lcigpOwotCi0gICAgICAgIG1FeHBhbmRhYmxlQXJlYUxheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2V4cGFuZGFibGVfYXJlYSk7Ci0gICAgICAgIG1FeHBhbmRhYmxlQXJlYUxheW91dC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIG1EaWFsb2dBcmVhTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfZGlhbG9nX2FyZWEpOwotICAgICAgICBtRGlhbG9nQXJlYUxheW91dC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgIC8vIEVhdCB1bmhhbmRsZWQgdG91Y2ggZXZlbnRzLgotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgaW50IGNvbG9yID0gTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRCdXR0b25UZXh0Q29sb3IobUNvbnRleHQpOwotICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbiA9IGZpbmRWaWV3QnlJZChCVVRUT05fRElTQ09OTkVDVF9SRVNfSUQpOwotICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbi5zZXRUZXh0KAotICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZyhSLnN0cmluZy5tcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QpKTsKLSAgICAgICAgbURpc2Nvbm5lY3RCdXR0b24uc2V0VGV4dENvbG9yKGNvbG9yKTsKLSAgICAgICAgbURpc2Nvbm5lY3RCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgICAgICBtU3RvcENhc3RpbmdCdXR0b24gPSBmaW5kVmlld0J5SWQoQlVUVE9OX1NUT1BfUkVTX0lEKTsKLSAgICAgICAgbVN0b3BDYXN0aW5nQnV0dG9uLnNldFRleHQoCi0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nKSk7Ci0gICAgICAgIG1TdG9wQ2FzdGluZ0J1dHRvbi5zZXRUZXh0Q29sb3IoY29sb3IpOwotICAgICAgICBtU3RvcENhc3RpbmdCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgICAgICBtUm91dGVOYW1lVGV4dFZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9uYW1lKTsKLSAgICAgICAgbUNsb3NlQnV0dG9uID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY2xvc2UpOwotICAgICAgICBtQ2xvc2VCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgbUN1c3RvbUNvbnRyb2xMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jdXN0b21fY29udHJvbCk7Ci0gICAgICAgIG1EZWZhdWx0Q29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2RlZmF1bHRfY29udHJvbCk7Ci0KLSAgICAgICAgLy8gU3RhcnQgdGhlIHNlc3Npb24gYWN0aXZpdHkgd2hlbiBhIGNvbnRlbnQgaXRlbSAoYWxidW0gYXJ0LCB0aXRsZSBvciBzdWJ0aXRsZSkgaXMgY2xpY2tlZC4KLSAgICAgICAgVmlldy5PbkNsaWNrTGlzdGVuZXIgb25DbGlja0xpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgUGVuZGluZ0ludGVudCBwaSA9IG1NZWRpYUNvbnRyb2xsZXIuZ2V0U2Vzc2lvbkFjdGl2aXR5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpLnNlbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIHBpICsgIiB3YXMgbm90IHNlbnQsIGl0IGhhZCBiZWVuIGNhbmNlbGVkLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBtQXJ0VmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2FydCk7Ci0gICAgICAgIG1BcnRWaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcihvbkNsaWNrTGlzdGVuZXIpOwotICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5tcl9jb250cm9sX3RpdGxlX2NvbnRhaW5lcikuc2V0T25DbGlja0xpc3RlbmVyKG9uQ2xpY2tMaXN0ZW5lcik7Ci0KLSAgICAgICAgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9tZWRpYV9tYWluX2NvbnRyb2wpOwotICAgICAgICBtRGl2aWRlclZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jb250cm9sX2RpdmlkZXIpOwotCi0gICAgICAgIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9wbGF5YmFja19jb250cm9sKTsKLSAgICAgICAgbVRpdGxlVmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfdGl0bGUpOwotICAgICAgICBtU3VidGl0bGVWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY29udHJvbF9zdWJ0aXRsZSk7Ci0gICAgICAgIG1QbGF5YmFja0NvbnRyb2xCdXR0b24gPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jb250cm9sX3BsYXliYWNrX2N0cmwpOwotICAgICAgICBtUGxheWJhY2tDb250cm9sQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLSAgICAgICAgbVZvbHVtZUNvbnRyb2xMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfY29udHJvbCk7Ci0gICAgICAgIG1Wb2x1bWVDb250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgbVZvbHVtZVNsaWRlciA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9zbGlkZXIpOwotICAgICAgICBtVm9sdW1lU2xpZGVyLnNldFRhZyhtUm91dGUpOwotICAgICAgICBtVm9sdW1lQ2hhbmdlTGlzdGVuZXIgPSBuZXcgVm9sdW1lQ2hhbmdlTGlzdGVuZXIoKTsKLSAgICAgICAgbVZvbHVtZVNsaWRlci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcihtVm9sdW1lQ2hhbmdlTGlzdGVuZXIpOwotCi0gICAgICAgIG1Wb2x1bWVHcm91cExpc3QgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfZ3JvdXBfbGlzdCk7Ci0gICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPigpOwotICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyID0gbmV3IFZvbHVtZUdyb3VwQWRhcHRlcihtVm9sdW1lR3JvdXBMaXN0LmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXMpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnNldEFkYXB0ZXIobVZvbHVtZUdyb3VwQWRhcHRlcik7Ci0gICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FuaW1hdGluZ1dpdGhCaXRtYXAgPSBuZXcgSGFzaFNldDw+KCk7Ci0KLSAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5zZXRNZWRpYUNvbnRyb2xzQmFja2dyb3VuZENvbG9yKG1Db250ZXh0LAotICAgICAgICAgICAgICAgIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LCBtVm9sdW1lR3JvdXBMaXN0LCBnZXRHcm91cCgpICE9IG51bGwpOwotICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLnNldFZvbHVtZVNsaWRlckNvbG9yKG1Db250ZXh0LAotICAgICAgICAgICAgICAgIChNZWRpYVJvdXRlVm9sdW1lU2xpZGVyKSBtVm9sdW1lU2xpZGVyLCBtTWVkaWFNYWluQ29udHJvbExheW91dCk7Ci0gICAgICAgIG1Wb2x1bWVTbGlkZXJNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIG1Wb2x1bWVTbGlkZXJNYXAucHV0KG1Sb3V0ZSwgbVZvbHVtZVNsaWRlcik7Ci0KLSAgICAgICAgbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b24gPQotICAgICAgICAgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLm1yX2dyb3VwX2V4cGFuZF9jb2xsYXBzZSk7Ci0gICAgICAgIG1Hcm91cEV4cGFuZENvbGxhcHNlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgbUlzR3JvdXBFeHBhbmRlZCA9ICFtSXNHcm91cEV4cGFuZGVkOwotICAgICAgICAgICAgICAgIGlmIChtSXNHcm91cEV4cGFuZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsb2FkSW50ZXJwb2xhdG9yKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0SGVpZ2h0KHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbG9hZEludGVycG9sYXRvcigpOwotICAgICAgICBtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25NcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldEludGVnZXIoCi0gICAgICAgICAgICAgICAgUi5pbnRlZ2VyLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfYW5pbWF0aW9uX2R1cmF0aW9uX21zKTsKLSAgICAgICAgbUdyb3VwTGlzdEZhZGVJbkR1cmF0aW9uTXMgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRJbnRlZ2VyKAotICAgICAgICAgICAgICAgIFIuaW50ZWdlci5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2ZhZGVfaW5fZHVyYXRpb25fbXMpOwotICAgICAgICBtR3JvdXBMaXN0RmFkZU91dER1cmF0aW9uTXMgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRJbnRlZ2VyKAotICAgICAgICAgICAgICAgIFIuaW50ZWdlci5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2ZhZGVfb3V0X2R1cmF0aW9uX21zKTsKLQotICAgICAgICBtQ3VzdG9tQ29udHJvbFZpZXcgPSBvbkNyZWF0ZU1lZGlhQ29udHJvbFZpZXcoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgaWYgKG1DdXN0b21Db250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ3VzdG9tQ29udHJvbExheW91dC5hZGRWaWV3KG1DdXN0b21Db250cm9sVmlldyk7Ci0gICAgICAgICAgICBtQ3VzdG9tQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUNyZWF0ZWQgPSB0cnVlOwotICAgICAgICB1cGRhdGVMYXlvdXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB3aWR0aCBvZiB0aGUgZGlhbG9nLiBBbHNvIGNhbGxlZCB3aGVuIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4KLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZUxheW91dCgpIHsKLSAgICAgICAgaW50IHdpZHRoID0gTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXREaWFsb2dXaWR0aChtQ29udGV4dCk7Ci0gICAgICAgIGdldFdpbmRvdygpLnNldExheW91dCh3aWR0aCwgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOwotCi0gICAgICAgIFZpZXcgZGVjb3JWaWV3ID0gZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCk7Ci0gICAgICAgIG1EaWFsb2dDb250ZW50V2lkdGggPSB3aWR0aCAtIGRlY29yVmlldy5nZXRQYWRkaW5nTGVmdCgpIC0gZGVjb3JWaWV3LmdldFBhZGRpbmdSaWdodCgpOwotCi0gICAgICAgIFJlc291cmNlcyByZXMgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdEl0ZW1JY29uU2l6ZSA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faWNvbl9zaXplKTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuZGltZW4ubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2hlaWdodCk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3RNYXhIZWlnaHQgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuZGltZW4ubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9tYXhfaGVpZ2h0KTsKLQotICAgICAgICAvLyBGZXRjaCBhcnQgaWNvbnMgYWdhaW4gZm9yIGxheW91dCBjaGFuZ2VzIHRvIHJlc2l6ZSBpdCBhY2NvcmRpbmdseQotICAgICAgICBtQXJ0SWNvbkJpdG1hcCA9IG51bGw7Ci0gICAgICAgIG1BcnRJY29uVXJpID0gbnVsbDsKLSAgICAgICAgdXBkYXRlQXJ0SWNvbklmTmVlZGVkKCk7Ci0gICAgICAgIHVwZGF0ZShmYWxzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLSAgICAgICAgbUF0dGFjaGVkVG9XaW5kb3cgPSB0cnVlOwotCi0gICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZLCBtQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UUyk7Ci0gICAgICAgIHNldE1lZGlhU2Vzc2lvbihtUm91dGVyLmdldE1lZGlhU2Vzc2lvblRva2VuKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgIHNldE1lZGlhU2Vzc2lvbihudWxsKTsKLSAgICAgICAgbUF0dGFjaGVkVG9XaW5kb3cgPSBmYWxzZTsKLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfVk9MVU1FX0RPV04KLSAgICAgICAgICAgICAgICB8fCBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfVk9MVU1FX1VQKSB7Ci0gICAgICAgICAgICBtUm91dGUucmVxdWVzdFVwZGF0ZVZvbHVtZShrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfVk9MVU1FX0RPV04gPyAtMSA6IDEpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25LZXlVcChpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfRE9XTgotICAgICAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfVVApIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5vbktleVVwKGtleUNvZGUsIGV2ZW50KTsKLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZShib29sZWFuIGFuaW1hdGUpIHsKLSAgICAgICAgLy8gRGVmZXIgZGlhbG9nIHVwZGF0ZXMgaWYgYSB1c2VyIGlzIGFkanVzdGluZyBhIHZvbHVtZSBpbiB0aGUgbGlzdAotICAgICAgICBpZiAobVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1IYXNQZW5kaW5nVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG1QZW5kaW5nVXBkYXRlQW5pbWF0aW9uTmVlZGVkIHw9IGFuaW1hdGU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUhhc1BlbmRpbmdVcGRhdGUgPSBmYWxzZTsKLSAgICAgICAgbVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKCFtUm91dGUuaXNTZWxlY3RlZCgpIHx8IG1Sb3V0ZS5pc0RlZmF1bHRPckJsdWV0b290aCgpKSB7Ci0gICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtQ3JlYXRlZCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVJvdXRlTmFtZVRleHRWaWV3LnNldFRleHQobVJvdXRlLmdldE5hbWUoKSk7Ci0gICAgICAgIG1EaXNjb25uZWN0QnV0dG9uLnNldFZpc2liaWxpdHkobVJvdXRlLmNhbkRpc2Nvbm5lY3QoKSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgICAgIGlmIChtQ3VzdG9tQ29udHJvbFZpZXcgPT0gbnVsbCAmJiBtQXJ0SWNvbklzTG9hZGVkKSB7Ci0gICAgICAgICAgICBpZiAoaXNCaXRtYXBSZWN5Y2xlZChtQXJ0SWNvbkxvYWRlZEJpdG1hcCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW4ndCBzZXQgYXJ0d29yayBpbWFnZSB3aXRoIHJlY3ljbGVkIGJpdG1hcDogIiArIG1BcnRJY29uTG9hZGVkQml0bWFwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUFydFZpZXcuc2V0SW1hZ2VCaXRtYXAobUFydEljb25Mb2FkZWRCaXRtYXApOwotICAgICAgICAgICAgICAgIG1BcnRWaWV3LnNldEJhY2tncm91bmRDb2xvcihtQXJ0SWNvbkJhY2tncm91bmRDb2xvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbGVhckxvYWRlZEJpdG1hcCgpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVZvbHVtZUNvbnRyb2xMYXlvdXQoKTsKLSAgICAgICAgdXBkYXRlUGxheWJhY2tDb250cm9sTGF5b3V0KCk7Ci0gICAgICAgIHVwZGF0ZUxheW91dEhlaWdodChhbmltYXRlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNCaXRtYXBSZWN5Y2xlZChCaXRtYXAgYml0bWFwKSB7Ci0gICAgICAgIHJldHVybiBiaXRtYXAgIT0gbnVsbCAmJiBiaXRtYXAuaXNSZWN5Y2xlZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KCkgewotICAgICAgICByZXR1cm4gbUN1c3RvbUNvbnRyb2xWaWV3ID09IG51bGwgJiYgKG1EZXNjcmlwdGlvbiAhPSBudWxsIHx8IG1TdGF0ZSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgbWFpbiBtZWRpYSBjb250cm9sbGVyIHdoaWNoIGluY2x1ZGVzIHBsYXliYWNrIGNvbnRyb2wgYW5kIG1hc3RlcgotICAgICAqIHZvbHVtZSBjb250cm9sLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGdldE1haW5Db250cm9sbGVySGVpZ2h0KGJvb2xlYW4gc2hvd1BsYXliYWNrQ29udHJvbCkgewotICAgICAgICBpbnQgaGVpZ2h0ID0gMDsKLSAgICAgICAgaWYgKHNob3dQbGF5YmFja0NvbnRyb2wgfHwgbVZvbHVtZUNvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgaGVpZ2h0ICs9IG1NZWRpYU1haW5Db250cm9sTGF5b3V0LmdldFBhZGRpbmdUb3AoKQotICAgICAgICAgICAgICAgICAgICArIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LmdldFBhZGRpbmdCb3R0b20oKTsKLSAgICAgICAgICAgIGlmIChzaG93UGxheWJhY2tDb250cm9sKSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ICs9ICBtUGxheWJhY2tDb250cm9sTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVZvbHVtZUNvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgICAgIGhlaWdodCArPSBtVm9sdW1lQ29udHJvbExheW91dC5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNob3dQbGF5YmFja0NvbnRyb2wgJiYgbVZvbHVtZUNvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgICAgIGhlaWdodCArPSBtRGl2aWRlclZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVpZ2h0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVNZWRpYUNvbnRyb2xWaXNpYmlsaXR5KGJvb2xlYW4gY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCkgewotICAgICAgICAvLyBUT0RPOiBVcGRhdGUgdGhlIHRvcCBhbmQgYm90dG9tIHBhZGRpbmcgb2YgdGhlIGNvbnRyb2wgbGF5b3V0IGFjY29yZGluZyB0byB0aGUgZGlzcGxheQotICAgICAgICAvLyBoZWlnaHQuCi0gICAgICAgIG1EaXZpZGVyVmlldy5zZXRWaXNpYmlsaXR5KChtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFCi0gICAgICAgICAgICAgICAgJiYgY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCkgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgICAgICBtTWVkaWFNYWluQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KChtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5HT05FCi0gICAgICAgICAgICAgICAgJiYgIWNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQpID8gVmlldy5HT05FIDogVmlldy5WSVNJQkxFKTsKLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZUxheW91dEhlaWdodChmaW5hbCBib29sZWFuIGFuaW1hdGUpIHsKLSAgICAgICAgLy8gV2UgbmVlZCB0byBkZWZlciB0aGUgdXBkYXRlIHVudGlsIHRoZSBmaXJzdCBsYXlvdXQgaGFzIG9jY3VycmVkLCBhcyB3ZSBkb24ndCB5ZXQga25vdyB0aGUKLSAgICAgICAgLy8gb3ZlcmFsbCB2aXNpYmxlIGRpc3BsYXkgc2l6ZSBpbiB3aGljaCB0aGUgd2luZG93IHRoaXMgdmlldyBpcyBhdHRhY2hlZCB0byBoYXMgYmVlbgotICAgICAgICAvLyBwb3NpdGlvbmVkIGluLgotICAgICAgICBtRGVmYXVsdENvbnRyb2xMYXlvdXQucmVxdWVzdExheW91dCgpOwotICAgICAgICBWaWV3VHJlZU9ic2VydmVyIG9ic2VydmVyID0gbURlZmF1bHRDb250cm9sTGF5b3V0LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKTsKLSAgICAgICAgb2JzZXJ2ZXIuYWRkT25HbG9iYWxMYXlvdXRMaXN0ZW5lcihuZXcgVmlld1RyZWVPYnNlcnZlci5Pbkdsb2JhbExheW91dExpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkdsb2JhbExheW91dCgpIHsKLSAgICAgICAgICAgICAgICBtRGVmYXVsdENvbnRyb2xMYXlvdXQuZ2V0Vmlld1RyZWVPYnNlcnZlcigpLnJlbW92ZUdsb2JhbE9uTGF5b3V0TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc0dyb3VwTGlzdEFuaW1hdGluZykgewotICAgICAgICAgICAgICAgICAgICBtSXNHcm91cExpc3RBbmltYXRpb25QZW5kaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRIZWlnaHRJbnRlcm5hbChhbmltYXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGhlaWdodCBvZiB2aWV3cyBhbmQgaGlkZSBhcnR3b3JrIG9yIG1ldGFkYXRhIGlmIHNwYWNlIGlzIGxpbWl0ZWQuCi0gICAgICovCi0gICAgdm9pZCB1cGRhdGVMYXlvdXRIZWlnaHRJbnRlcm5hbChib29sZWFuIGFuaW1hdGUpIHsKLSAgICAgICAgLy8gTWVhc3VyZSB0aGUgc2l6ZSBvZiB3aWRnZXRzIGFuZCBnZXQgdGhlIGhlaWdodCBvZiBtYWluIGNvbXBvbmVudHMuCi0gICAgICAgIGludCBvbGRIZWlnaHQgPSBnZXRMYXlvdXRIZWlnaHQobU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQpOwotICAgICAgICBzZXRMYXlvdXRIZWlnaHQobU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLSAgICAgICAgdXBkYXRlTWVkaWFDb250cm9sVmlzaWJpbGl0eShjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KCkpOwotICAgICAgICBWaWV3IGRlY29yVmlldyA9IGdldFdpbmRvdygpLmdldERlY29yVmlldygpOwotICAgICAgICBkZWNvclZpZXcubWVhc3VyZSgKLSAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoZ2V0V2luZG93KCkuZ2V0QXR0cmlidXRlcygpLndpZHRoLCBNZWFzdXJlU3BlYy5FWEFDVExZKSwKLSAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCk7Ci0gICAgICAgIHNldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCwgb2xkSGVpZ2h0KTsKLSAgICAgICAgaW50IGFydFZpZXdIZWlnaHQgPSAwOwotICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ID09IG51bGwgJiYgbUFydFZpZXcuZ2V0RHJhd2FibGUoKSBpbnN0YW5jZW9mIEJpdG1hcERyYXdhYmxlKSB7Ci0gICAgICAgICAgICBCaXRtYXAgYXJ0ID0gKChCaXRtYXBEcmF3YWJsZSkgbUFydFZpZXcuZ2V0RHJhd2FibGUoKSkuZ2V0Qml0bWFwKCk7Ci0gICAgICAgICAgICBpZiAoYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcnRWaWV3SGVpZ2h0ID0gZ2V0RGVzaXJlZEFydEhlaWdodChhcnQuZ2V0V2lkdGgoKSwgYXJ0LmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICBtQXJ0Vmlldy5zZXRTY2FsZVR5cGUoYXJ0LmdldFdpZHRoKCkgPj0gYXJ0LmdldEhlaWdodCgpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IEltYWdlVmlldy5TY2FsZVR5cGUuRklUX1hZIDogSW1hZ2VWaWV3LlNjYWxlVHlwZS5GSVRfQ0VOVEVSKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnQgbWFpbkNvbnRyb2xsZXJIZWlnaHQgPSBnZXRNYWluQ29udHJvbGxlckhlaWdodChjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KCkpOwotICAgICAgICBpbnQgdm9sdW1lR3JvdXBMaXN0Q291bnQgPSBtR3JvdXBNZW1iZXJSb3V0ZXMuc2l6ZSgpOwotICAgICAgICAvLyBTY2FsZSBkb3duIHZvbHVtZSBncm91cCBsaXN0IGl0ZW1zIGluIGxhbmRzY2FwZSBtb2RlLgotICAgICAgICBpbnQgZXhwYW5kZWRHcm91cExpc3RIZWlnaHQgPSBnZXRHcm91cCgpID09IG51bGwgPyAwIDoKLSAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodCAqIGdldEdyb3VwKCkuZ2V0Um91dGVzKCkuc2l6ZSgpOwotICAgICAgICBpZiAodm9sdW1lR3JvdXBMaXN0Q291bnQgPiAwKSB7Ci0gICAgICAgICAgICBleHBhbmRlZEdyb3VwTGlzdEhlaWdodCArPSBtVm9sdW1lR3JvdXBMaXN0UGFkZGluZ1RvcDsKLSAgICAgICAgfQotICAgICAgICBleHBhbmRlZEdyb3VwTGlzdEhlaWdodCA9IE1hdGgubWluKGV4cGFuZGVkR3JvdXBMaXN0SGVpZ2h0LCBtVm9sdW1lR3JvdXBMaXN0TWF4SGVpZ2h0KTsKLSAgICAgICAgaW50IHZpc2libGVHcm91cExpc3RIZWlnaHQgPSBtSXNHcm91cEV4cGFuZGVkID8gZXhwYW5kZWRHcm91cExpc3RIZWlnaHQgOiAwOwotCi0gICAgICAgIGludCBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA9Ci0gICAgICAgICAgICAgICAgTWF0aC5tYXgoYXJ0Vmlld0hlaWdodCwgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCkgKyBtYWluQ29udHJvbGxlckhlaWdodDsKLSAgICAgICAgUmVjdCB2aXNpYmxlUmVjdCA9IG5ldyBSZWN0KCk7Ci0gICAgICAgIGRlY29yVmlldy5nZXRXaW5kb3dWaXNpYmxlRGlzcGxheUZyYW1lKHZpc2libGVSZWN0KTsKLSAgICAgICAgLy8gSGVpZ2h0IG9mIG5vbi1jb250cm9sIHZpZXdzIGluIGRlY29yIHZpZXcuCi0gICAgICAgIC8vIFRoaXMgaW5jbHVkZXMgdGl0bGUgYmFyLCBidXR0b24gYmFyLCBhbmQgZGlhbG9nJ3MgdmVydGljYWwgcGFkZGluZyB3aGljaCBzaG91bGQgYmUKLSAgICAgICAgLy8gYWx3YXlzIHNob3duLgotICAgICAgICBpbnQgbm9uQ29udHJvbFZpZXdIZWlnaHQgPSBtRGlhbG9nQXJlYUxheW91dC5nZXRNZWFzdXJlZEhlaWdodCgpCi0gICAgICAgICAgICAgICAgLSBtRGVmYXVsdENvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLSAgICAgICAgLy8gTWF4aW11bSBhbGxvd2VkIGhlaWdodCBmb3IgY29udHJvbHMgdG8gZml0IHNjcmVlbi4KLSAgICAgICAgaW50IG1heGltdW1Db250cm9sVmlld0hlaWdodCA9IHZpc2libGVSZWN0LmhlaWdodCgpIC0gbm9uQ29udHJvbFZpZXdIZWlnaHQ7Ci0KLSAgICAgICAgLy8gU2hvdyBhcnR3b3JrIGlmIGl0IGZpdHMgdGhlIHNjcmVlbi4KLSAgICAgICAgaWYgKG1DdXN0b21Db250cm9sVmlldyA9PSBudWxsICYmIGFydFZpZXdIZWlnaHQgPiAwCi0gICAgICAgICAgICAgICAgJiYgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPD0gbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0KSB7Ci0gICAgICAgICAgICBtQXJ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBzZXRMYXlvdXRIZWlnaHQobUFydFZpZXcsIGFydFZpZXdIZWlnaHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGdldExheW91dEhlaWdodChtVm9sdW1lR3JvdXBMaXN0KSArIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCkKLSAgICAgICAgICAgICAgICAgICAgPj0gbURlZmF1bHRDb250cm9sTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICBtQXJ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcnRWaWV3SGVpZ2h0ID0gMDsKLSAgICAgICAgICAgIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID0gdmlzaWJsZUdyb3VwTGlzdEhlaWdodCArIG1haW5Db250cm9sbGVySGVpZ2h0OwotICAgICAgICB9Ci0gICAgICAgIC8vIFNob3cgdGhlIHBsYXliYWNrIGNvbnRyb2wgaWYgaXQgZml0cyB0aGUgc2NyZWVuLgotICAgICAgICBpZiAoY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCgpCi0gICAgICAgICAgICAgICAgJiYgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPD0gbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0KSB7Ci0gICAgICAgICAgICBtUGxheWJhY2tDb250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZU1lZGlhQ29udHJvbFZpc2liaWxpdHkobVBsYXliYWNrQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKTsKLSAgICAgICAgbWFpbkNvbnRyb2xsZXJIZWlnaHQgPSBnZXRNYWluQ29udHJvbGxlckhlaWdodCgKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpOwotICAgICAgICBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA9Ci0gICAgICAgICAgICAgICAgTWF0aC5tYXgoYXJ0Vmlld0hlaWdodCwgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCkgKyBtYWluQ29udHJvbGxlckhlaWdodDsKLQotICAgICAgICAvLyBMaW1pdCB0aGUgdm9sdW1lIGdyb3VwIGxpc3QgaGVpZ2h0IHRvIGZpdCB0aGUgc2NyZWVuLgotICAgICAgICBpZiAoZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPiBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpIHsKLSAgICAgICAgICAgIHZpc2libGVHcm91cExpc3RIZWlnaHQgLT0gKGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0IC0gbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0KTsKLSAgICAgICAgICAgIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID0gbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0OwotICAgICAgICB9Ci0gICAgICAgIC8vIFVwZGF0ZSB0aGUgbGF5b3V0cyB3aXRoIHRoZSBjb21wdXRlZCBoZWlnaHRzLgotICAgICAgICBtTWVkaWFNYWluQ29udHJvbExheW91dC5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgIG1EZWZhdWx0Q29udHJvbExheW91dC5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICBpZiAoYW5pbWF0ZSkgewotICAgICAgICAgICAgYW5pbWF0ZUxheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCwgbWFpbkNvbnRyb2xsZXJIZWlnaHQpOwotICAgICAgICAgICAgYW5pbWF0ZUxheW91dEhlaWdodChtVm9sdW1lR3JvdXBMaXN0LCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0KTsKLSAgICAgICAgICAgIGFuaW1hdGVMYXlvdXRIZWlnaHQobURlZmF1bHRDb250cm9sTGF5b3V0LCBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRMYXlvdXRIZWlnaHQobU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQsIG1haW5Db250cm9sbGVySGVpZ2h0KTsKLSAgICAgICAgICAgIHNldExheW91dEhlaWdodChtVm9sdW1lR3JvdXBMaXN0LCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0KTsKLSAgICAgICAgICAgIHNldExheW91dEhlaWdodChtRGVmYXVsdENvbnRyb2xMYXlvdXQsIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICAvLyBNYXhpbWl6ZSB0aGUgd2luZG93IHNpemUgd2l0aCBhIHRyYW5zcGFyZW50IGxheW91dCBpbiBhZHZhbmNlIGZvciBzbW9vdGggYW5pbWF0aW9uLgotICAgICAgICBzZXRMYXlvdXRIZWlnaHQobUV4cGFuZGFibGVBcmVhTGF5b3V0LCB2aXNpYmxlUmVjdC5oZWlnaHQoKSk7Ci0gICAgICAgIHJlYnVpbGRWb2x1bWVHcm91cExpc3QoYW5pbWF0ZSk7Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVWb2x1bWVHcm91cEl0ZW1IZWlnaHQoVmlldyBpdGVtKSB7Ci0gICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSBpdGVtLmZpbmRWaWV3QnlJZChSLmlkLnZvbHVtZV9pdGVtX2NvbnRhaW5lcik7Ci0gICAgICAgIHNldExheW91dEhlaWdodChjb250YWluZXIsIG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0KTsKLSAgICAgICAgVmlldyBpY29uID0gaXRlbS5maW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfaXRlbV9pY29uKTsKLSAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcyBscCA9IGljb24uZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgIGxwLndpZHRoID0gbVZvbHVtZUdyb3VwTGlzdEl0ZW1JY29uU2l6ZTsKLSAgICAgICAgbHAuaGVpZ2h0ID0gbVZvbHVtZUdyb3VwTGlzdEl0ZW1JY29uU2l6ZTsKLSAgICAgICAgaWNvbi5zZXRMYXlvdXRQYXJhbXMobHApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhbmltYXRlTGF5b3V0SGVpZ2h0KGZpbmFsIFZpZXcgdmlldywgaW50IHRhcmdldEhlaWdodCkgewotICAgICAgICBmaW5hbCBpbnQgc3RhcnRWYWx1ZSA9IGdldExheW91dEhlaWdodCh2aWV3KTsKLSAgICAgICAgZmluYWwgaW50IGVuZFZhbHVlID0gdGFyZ2V0SGVpZ2h0OwotICAgICAgICBBbmltYXRpb24gYW5pbSA9IG5ldyBBbmltYXRpb24oKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGFwcGx5VHJhbnNmb3JtYXRpb24oZmxvYXQgaW50ZXJwb2xhdGVkVGltZSwgVHJhbnNmb3JtYXRpb24gdCkgewotICAgICAgICAgICAgICAgIGludCBoZWlnaHQgPSBzdGFydFZhbHVlIC0gKGludCkgKChzdGFydFZhbHVlIC0gZW5kVmFsdWUpICogaW50ZXJwb2xhdGVkVGltZSk7Ci0gICAgICAgICAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KHZpZXcsIGhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGFuaW0uc2V0RHVyYXRpb24obUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXMpOwotICAgICAgICBpZiAoYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMjEpIHsKLSAgICAgICAgICAgIGFuaW0uc2V0SW50ZXJwb2xhdG9yKG1JbnRlcnBvbGF0b3IpOwotICAgICAgICB9Ci0gICAgICAgIHZpZXcuc3RhcnRBbmltYXRpb24oYW5pbSk7Ci0gICAgfQotCi0gICAgdm9pZCBsb2FkSW50ZXJwb2xhdG9yKCkgewotICAgICAgICBtSW50ZXJwb2xhdG9yID0KLSAgICAgICAgICAgICAgICBtSXNHcm91cEV4cGFuZGVkID8gbUxpbmVhck91dFNsb3dJbkludGVycG9sYXRvciA6IG1GYXN0T3V0U2xvd0luSW50ZXJwb2xhdG9yOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVWb2x1bWVDb250cm9sTGF5b3V0KCkgewotICAgICAgICBpZiAoaXNWb2x1bWVDb250cm9sQXZhaWxhYmxlKG1Sb3V0ZSkpIHsKLSAgICAgICAgICAgIGlmIChtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5HT05FKSB7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUNvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1Wb2x1bWVTbGlkZXIuc2V0TWF4KG1Sb3V0ZS5nZXRWb2x1bWVNYXgoKSk7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlci5zZXRQcm9ncmVzcyhtUm91dGUuZ2V0Vm9sdW1lKCkpOwotICAgICAgICAgICAgICAgIG1Hcm91cEV4cGFuZENvbGxhcHNlQnV0dG9uLnNldFZpc2liaWxpdHkoZ2V0R3JvdXAoKSA9PSBudWxsID8gVmlldy5HT05FCi0gICAgICAgICAgICAgICAgICAgICAgICA6IFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVm9sdW1lQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVidWlsZFZvbHVtZUdyb3VwTGlzdChib29sZWFuIGFuaW1hdGUpIHsKLSAgICAgICAgTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHJvdXRlcyA9IGdldEdyb3VwKCkgPT0gbnVsbCA/IG51bGwgOiBnZXRHcm91cCgpLmdldFJvdXRlcygpOwotICAgICAgICBpZiAocm91dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcy5jbGVhcigpOwotICAgICAgICAgICAgbVZvbHVtZUdyb3VwQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICB9IGVsc2UgaWYgKE1lZGlhUm91dGVEaWFsb2dIZWxwZXIubGlzdFVub3JkZXJlZEVxdWFscyhtR3JvdXBNZW1iZXJSb3V0ZXMsIHJvdXRlcykpIHsKLSAgICAgICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEhhc2hNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBSZWN0PiBwcmV2aW91c1JvdXRlQm91bmRNYXAgPSBhbmltYXRlCi0gICAgICAgICAgICAgICAgICAgID8gTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXRJdGVtQm91bmRNYXAobVZvbHVtZUdyb3VwTGlzdCwgbVZvbHVtZUdyb3VwQWRhcHRlcikKLSAgICAgICAgICAgICAgICAgICAgOiBudWxsOwotICAgICAgICAgICAgSGFzaE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIEJpdG1hcERyYXdhYmxlPiBwcmV2aW91c1JvdXRlQml0bWFwTWFwID0gYW5pbWF0ZQotICAgICAgICAgICAgICAgICAgICA/IE1lZGlhUm91dGVEaWFsb2dIZWxwZXIuZ2V0SXRlbUJpdG1hcE1hcChtQ29udGV4dCwgbVZvbHVtZUdyb3VwTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyKSA6IG51bGw7Ci0gICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCA9Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVEaWFsb2dIZWxwZXIuZ2V0SXRlbXNBZGRlZChtR3JvdXBNZW1iZXJSb3V0ZXMsIHJvdXRlcyk7Ci0gICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkID0gTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXRJdGVtc1JlbW92ZWQobUdyb3VwTWVtYmVyUm91dGVzLAotICAgICAgICAgICAgICAgICAgICByb3V0ZXMpOwotICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzLmFkZEFsbCgwLCBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCk7Ci0gICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXMucmVtb3ZlQWxsKG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQpOwotICAgICAgICAgICAgbVZvbHVtZUdyb3VwQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICAgICAgaWYgKGFuaW1hdGUgJiYgbUlzR3JvdXBFeHBhbmRlZAotICAgICAgICAgICAgICAgICAgICAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5zaXplKCkgKyBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBhbmltYXRlR3JvdXBMaXN0SXRlbXMocHJldmlvdXNSb3V0ZUJvdW5kTWFwLCBwcmV2aW91c1JvdXRlQml0bWFwTWFwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgPSBudWxsOwotICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFuaW1hdGVHcm91cExpc3RJdGVtcyhmaW5hbCBNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBSZWN0PiBwcmV2aW91c1JvdXRlQm91bmRNYXAsCi0gICAgICAgICAgICBmaW5hbCBNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBCaXRtYXBEcmF3YWJsZT4gcHJldmlvdXNSb3V0ZUJpdG1hcE1hcCkgewotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgbUlzR3JvdXBMaXN0QW5pbWF0aW5nID0gdHJ1ZTsKLSAgICAgICAgVmlld1RyZWVPYnNlcnZlciBvYnNlcnZlciA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpOwotICAgICAgICBvYnNlcnZlci5hZGRPbkdsb2JhbExheW91dExpc3RlbmVyKG5ldyBWaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2xvYmFsTGF5b3V0KCkgewotICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpLnJlbW92ZUdsb2JhbE9uTGF5b3V0TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgYW5pbWF0ZUdyb3VwTGlzdEl0ZW1zSW50ZXJuYWwocHJldmlvdXNSb3V0ZUJvdW5kTWFwLCBwcmV2aW91c1JvdXRlQml0bWFwTWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBhbmltYXRlR3JvdXBMaXN0SXRlbXNJbnRlcm5hbCgKLSAgICAgICAgICAgIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIFJlY3Q+IHByZXZpb3VzUm91dGVCb3VuZE1hcCwKLSAgICAgICAgICAgIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIEJpdG1hcERyYXdhYmxlPiBwcmV2aW91c1JvdXRlQml0bWFwTWFwKSB7Ci0gICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCA9PSBudWxsIHx8IG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGludCBncm91cFNpemVEZWx0YSA9IG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLnNpemUoKSAtIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQuc2l6ZSgpOwotICAgICAgICBib29sZWFuIGxpc3RlbmVyUmVnaXN0ZXJlZCA9IGZhbHNlOwotICAgICAgICBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdGlvbiBhbmltYXRpb24pIHsKLSAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnN0YXJ0QW5pbWF0aW9uQWxsKCk7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5wb3N0RGVsYXllZChtR3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgbUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdGlvbiBhbmltYXRpb24pIHsgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uUmVwZWF0KEFuaW1hdGlvbiBhbmltYXRpb24pIHsgfQotICAgICAgICB9OwotCi0gICAgICAgIC8vIEFuaW1hdGUgdmlzaWJsZSBpdGVtcyBmcm9tIHByZXZpb3VzIHBvc2l0aW9ucyB0byBjdXJyZW50IHBvc2l0aW9ucyBleGNlcHQgcm91dGVzIGFkZGVkCi0gICAgICAgIC8vIGp1c3QgYmVmb3JlLiBBZGRlZCByb3V0ZXMgd2lsbCByZW1haW4gaGlkZGVuIHVudGlsIHRyYW5zbGF0ZSBhbmltYXRpb24gZmluaXNoZXMuCi0gICAgICAgIGludCBmaXJzdCA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQ291bnQoKTsgKytpKSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBmaXJzdCArIGk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtVm9sdW1lR3JvdXBBZGFwdGVyLmdldEl0ZW0ocG9zaXRpb24pOwotICAgICAgICAgICAgUmVjdCBwcmV2aW91c0JvdW5kcyA9IHByZXZpb3VzUm91dGVCb3VuZE1hcC5nZXQocm91dGUpOwotICAgICAgICAgICAgaW50IGN1cnJlbnRUb3AgPSB2aWV3LmdldFRvcCgpOwotICAgICAgICAgICAgaW50IHByZXZpb3VzVG9wID0gcHJldmlvdXNCb3VuZHMgIT0gbnVsbCA/IHByZXZpb3VzQm91bmRzLnRvcAotICAgICAgICAgICAgICAgICAgICA6IChjdXJyZW50VG9wICsgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQgKiBncm91cFNpemVEZWx0YSk7Ci0gICAgICAgICAgICBBbmltYXRpb25TZXQgYW5pbVNldCA9IG5ldyBBbmltYXRpb25TZXQodHJ1ZSk7Ci0gICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgIT0gbnVsbCAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICBwcmV2aW91c1RvcCA9IGN1cnJlbnRUb3A7Ci0gICAgICAgICAgICAgICAgQW5pbWF0aW9uIGFscGhhQW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbigwLjBmLCAwLjBmKTsKLSAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RHVyYXRpb24obUdyb3VwTGlzdEZhZGVJbkR1cmF0aW9uTXMpOwotICAgICAgICAgICAgICAgIGFuaW1TZXQuYWRkQW5pbWF0aW9uKGFscGhhQW5pbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBbmltYXRpb24gdHJhbnNsYXRpb25BbmltID0gbmV3IFRyYW5zbGF0ZUFuaW1hdGlvbigwLCAwLCBwcmV2aW91c1RvcCAtIGN1cnJlbnRUb3AsIDApOwotICAgICAgICAgICAgdHJhbnNsYXRpb25BbmltLnNldER1cmF0aW9uKG1Hcm91cExpc3RBbmltYXRpb25EdXJhdGlvbk1zKTsKLSAgICAgICAgICAgIGFuaW1TZXQuYWRkQW5pbWF0aW9uKHRyYW5zbGF0aW9uQW5pbSk7Ci0gICAgICAgICAgICBhbmltU2V0LnNldEZpbGxBZnRlcih0cnVlKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0RmlsbEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBhbmltU2V0LnNldEludGVycG9sYXRvcihtSW50ZXJwb2xhdG9yKTsKLSAgICAgICAgICAgIGlmICghbGlzdGVuZXJSZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXJSZWdpc3RlcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBhbmltU2V0LnNldEFuaW1hdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZpZXcuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgICAgIHZpZXcuc3RhcnRBbmltYXRpb24oYW5pbVNldCk7Ci0gICAgICAgICAgICBwcmV2aW91c1JvdXRlQm91bmRNYXAucmVtb3ZlKHJvdXRlKTsKLSAgICAgICAgICAgIHByZXZpb3VzUm91dGVCaXRtYXBNYXAucmVtb3ZlKHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIGEgbWVtYmVyIHJvdXRlIGRvZXNuJ3QgZXhpc3QgYW55IGxvbmdlciwgaXQgY2FuIGJlIGVpdGhlciByZW1vdmVkIG9yIG1vdmVkIG91dCBvZiB0aGUKLSAgICAgICAgLy8gTGlzdFZpZXcgbGF5b3V0IGJvdW5kYXJ5LiBJbiB0aGlzIGNhc2UsIHVzZSB0aGUgcHJldmlvdXNseSBjYXB0dXJlZCBiaXRtYXBzIGZvcgotICAgICAgICAvLyBhbmltYXRpb24uCi0gICAgICAgIGZvciAoTWFwLkVudHJ5PE1lZGlhUm91dGVyLlJvdXRlSW5mbywgQml0bWFwRHJhd2FibGU+IGl0ZW0KLSAgICAgICAgICAgICAgICA6IHByZXZpb3VzUm91dGVCaXRtYXBNYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gaXRlbS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGZpbmFsIEJpdG1hcERyYXdhYmxlIGJpdG1hcCA9IGl0ZW0uZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGZpbmFsIFJlY3QgYm91bmRzID0gcHJldmlvdXNSb3V0ZUJvdW5kTWFwLmdldChyb3V0ZSk7Ci0gICAgICAgICAgICBPdmVybGF5T2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZC5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICBvYmplY3QgPSBuZXcgT3ZlcmxheU9iamVjdChiaXRtYXAsIGJvdW5kcykuc2V0QWxwaGFBbmltYXRpb24oMS4wZiwgMC4wZikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREdXJhdGlvbihtR3JvdXBMaXN0RmFkZU91dER1cmF0aW9uTXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW50ZXJwb2xhdG9yKG1JbnRlcnBvbGF0b3IpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgZGVsdGFZID0gZ3JvdXBTaXplRGVsdGEgKiBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodDsKLSAgICAgICAgICAgICAgICBvYmplY3QgPSBuZXcgT3ZlcmxheU9iamVjdChiaXRtYXAsIGJvdW5kcykuc2V0VHJhbnNsYXRlWUFuaW1hdGlvbihkZWx0YVkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RHVyYXRpb24obUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW50ZXJwb2xhdG9yKG1JbnRlcnBvbGF0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0QW5pbWF0aW9uRW5kTGlzdGVuZXIobmV3IE92ZXJsYXlPYmplY3QuT25BbmltYXRpb25FbmRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQW5pbWF0aW5nV2l0aEJpdG1hcC5yZW1vdmUocm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQW5pbWF0aW5nV2l0aEJpdG1hcC5hZGQocm91dGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5hZGRPdmVybGF5T2JqZWN0KG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHN0YXJ0R3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uKCkgewotICAgICAgICBjbGVhckdyb3VwTGlzdEFuaW1hdGlvbih0cnVlKTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5yZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgIFZpZXdUcmVlT2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBtVm9sdW1lR3JvdXBMaXN0LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKTsKLSAgICAgICAgb2JzZXJ2ZXIuYWRkT25HbG9iYWxMYXlvdXRMaXN0ZW5lcihuZXcgVmlld1RyZWVPYnNlcnZlci5Pbkdsb2JhbExheW91dExpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkdsb2JhbExheW91dCgpIHsKLSAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKS5yZW1vdmVHbG9iYWxPbkxheW91dExpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgICAgIHN0YXJ0R3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uSW50ZXJuYWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBzdGFydEdyb3VwTGlzdEZhZGVJbkFuaW1hdGlvbkludGVybmFsKCkgewotICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgIT0gbnVsbCAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgZmFkZUluQWRkZWRSb3V0ZXMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpbmlzaEFuaW1hdGlvbih0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZmluaXNoQW5pbWF0aW9uKGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCA9IG51bGw7Ci0gICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQgPSBudWxsOwotICAgICAgICBtSXNHcm91cExpc3RBbmltYXRpbmcgPSBmYWxzZTsKLSAgICAgICAgaWYgKG1Jc0dyb3VwTGlzdEFuaW1hdGlvblBlbmRpbmcpIHsKLSAgICAgICAgICAgIG1Jc0dyb3VwTGlzdEFuaW1hdGlvblBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIHVwZGF0ZUxheW91dEhlaWdodChhbmltYXRlKTsKLSAgICAgICAgfQotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZhZGVJbkFkZGVkUm91dGVzKCkgewotICAgICAgICBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdGlvbiBhbmltYXRpb24pIHsgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdGlvbiBhbmltYXRpb24pIHsKLSAgICAgICAgICAgICAgICBmaW5pc2hBbmltYXRpb24odHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9Ci0gICAgICAgIH07Ci0gICAgICAgIGJvb2xlYW4gbGlzdGVuZXJSZWdpc3RlcmVkID0gZmFsc2U7Ci0gICAgICAgIGludCBmaXJzdCA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQ291bnQoKTsgKytpKSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBmaXJzdCArIGk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtVm9sdW1lR3JvdXBBZGFwdGVyLmdldEl0ZW0ocG9zaXRpb24pOwotICAgICAgICAgICAgaWYgKG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgIEFuaW1hdGlvbiBhbHBoYUFuaW0gPSBuZXcgQWxwaGFBbmltYXRpb24oMC4wZiwgMS4wZik7Ci0gICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldER1cmF0aW9uKG1Hcm91cExpc3RGYWRlSW5EdXJhdGlvbk1zKTsKLSAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RmlsbEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldEZpbGxBZnRlcih0cnVlKTsKLSAgICAgICAgICAgICAgICBpZiAoIWxpc3RlbmVyUmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lclJlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0QW5pbWF0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2aWV3LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgdmlldy5zdGFydEFuaW1hdGlvbihhbHBoYUFuaW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBjbGVhckdyb3VwTGlzdEFuaW1hdGlvbihib29sZWFuIGV4Y2VwdEFkZGVkUm91dGVzKSB7Ci0gICAgICAgIGludCBmaXJzdCA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQ291bnQoKTsgKytpKSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBmaXJzdCArIGk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtVm9sdW1lR3JvdXBBZGFwdGVyLmdldEl0ZW0ocG9zaXRpb24pOwotICAgICAgICAgICAgaWYgKGV4Y2VwdEFkZGVkUm91dGVzICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuY29udGFpbnMocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaW5lYXJMYXlvdXQgY29udGFpbmVyID0gKExpbmVhckxheW91dCkgdmlldy5maW5kVmlld0J5SWQoUi5pZC52b2x1bWVfaXRlbV9jb250YWluZXIpOwotICAgICAgICAgICAgY29udGFpbmVyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIEFuaW1hdGlvblNldCBhbmltU2V0ID0gbmV3IEFuaW1hdGlvblNldCh0cnVlKTsKLSAgICAgICAgICAgIEFuaW1hdGlvbiBhbHBoYUFuaW0gPSBuZXcgQWxwaGFBbmltYXRpb24oMS4wZiwgMS4wZik7Ci0gICAgICAgICAgICBhbHBoYUFuaW0uc2V0RHVyYXRpb24oMCk7Ci0gICAgICAgICAgICBhbmltU2V0LmFkZEFuaW1hdGlvbihhbHBoYUFuaW0pOwotICAgICAgICAgICAgQW5pbWF0aW9uIHRyYW5zbGF0aW9uQW5pbSA9IG5ldyBUcmFuc2xhdGVBbmltYXRpb24oMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICB0cmFuc2xhdGlvbkFuaW0uc2V0RHVyYXRpb24oMCk7Ci0gICAgICAgICAgICBhbmltU2V0LnNldEZpbGxBZnRlcih0cnVlKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0RmlsbEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB2aWV3LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgICAgICB2aWV3LnN0YXJ0QW5pbWF0aW9uKGFuaW1TZXQpOwotICAgICAgICB9Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc3RvcEFuaW1hdGlvbkFsbCgpOwotICAgICAgICBpZiAoIWV4Y2VwdEFkZGVkUm91dGVzKSB7Ci0gICAgICAgICAgICBmaW5pc2hBbmltYXRpb24oZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXliYWNrQ29udHJvbExheW91dCgpIHsKLSAgICAgICAgaWYgKGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSkgewotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlID0gbURlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbURlc2NyaXB0aW9uLmdldFRpdGxlKCk7Ci0gICAgICAgICAgICBib29sZWFuIGhhc1RpdGxlID0gIVRleHRVdGlscy5pc0VtcHR5KHRpdGxlKTsKLQotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHN1YnRpdGxlID0gbURlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbURlc2NyaXB0aW9uLmdldFN1YnRpdGxlKCk7Ci0gICAgICAgICAgICBib29sZWFuIGhhc1N1YnRpdGxlID0gIVRleHRVdGlscy5pc0VtcHR5KHN1YnRpdGxlKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBzaG93VGl0bGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gc2hvd1N1YnRpdGxlID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobVJvdXRlLmdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpCi0gICAgICAgICAgICAgICAgICAgICE9IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QUkVTRU5UQVRJT05fRElTUExBWV9JRF9OT05FKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHVzZXIgaXMgY3VycmVudGx5IGNhc3Rpbmcgc2NyZWVuLgotICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5tcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuKSk7Ci0gICAgICAgICAgICAgICAgc2hvd1RpdGxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlID09IG51bGwgfHwgbVN0YXRlLmdldFN0YXRlKCkgPT0gUGxheWJhY2tTdGF0ZUNvbXBhdC5TVEFURV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2hvdyAiTm8gbWVkaWEgc2VsZWN0ZWQiIGFzIHdlIGRvbid0IHlldCBrbm93IHRoZSBwbGF5YmFjayBzdGF0ZS4KLSAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQoQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcubXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCkpOwotICAgICAgICAgICAgICAgIHNob3dUaXRsZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFoYXNUaXRsZSAmJiAhaGFzU3VidGl0bGUpIHsKLSAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQoQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcubXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSkpOwotICAgICAgICAgICAgICAgIHNob3dUaXRsZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChoYXNUaXRsZSkgewotICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQodGl0bGUpOwotICAgICAgICAgICAgICAgICAgICBzaG93VGl0bGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaGFzU3VidGl0bGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0KHN1YnRpdGxlKTsKLSAgICAgICAgICAgICAgICAgICAgc2hvd1N1YnRpdGxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGl0bGVWaWV3LnNldFZpc2liaWxpdHkoc2hvd1RpdGxlID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShzaG93U3VidGl0bGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotCi0gICAgICAgICAgICBpZiAobVN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzUGxheWluZyA9IG1TdGF0ZS5nZXRTdGF0ZSgpID09IFBsYXliYWNrU3RhdGVDb21wYXQuU1RBVEVfQlVGRkVSSU5HCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUuZ2V0U3RhdGUoKSA9PSBQbGF5YmFja1N0YXRlQ29tcGF0LlNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICAgICAgQ29udGV4dCBwbGF5YmFja0NvbnRyb2xCdXR0b25Db250ZXh0ID0gbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5nZXRDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiB2aXNpYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpbnQgaWNvbkRyYXdhYmxlQXR0ciA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IGljb25EZXNjUmVzSWQgPSAwOwotICAgICAgICAgICAgICAgIGlmIChpc1BsYXlpbmcgJiYgaXNQYXVzZUFjdGlvblN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGljb25EcmF3YWJsZUF0dHIgPSBSLmF0dHIubWVkaWFSb3V0ZVBhdXNlRHJhd2FibGU7Ci0gICAgICAgICAgICAgICAgICAgIGljb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3BhdXNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGF5aW5nICYmIGlzU3RvcEFjdGlvblN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGljb25EcmF3YWJsZUF0dHIgPSBSLmF0dHIubWVkaWFSb3V0ZVN0b3BEcmF3YWJsZTsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfc3RvcDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1BsYXlpbmcgJiYgaXNQbGF5QWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRyYXdhYmxlQXR0ciA9IFIuYXR0ci5tZWRpYVJvdXRlUGxheURyYXdhYmxlOwotICAgICAgICAgICAgICAgICAgICBpY29uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9wbGF5OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZpc2libGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2libGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xCdXR0b24uc2V0SW1hZ2VSZXNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFRoZW1lUmVzb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0NvbnRyb2xCdXR0b25Db250ZXh0LCBpY29uRHJhd2FibGVBdHRyKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrQ29udHJvbEJ1dHRvbkNvbnRleHQuZ2V0UmVzb3VyY2VzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUZXh0KGljb25EZXNjUmVzSWQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQbGF5QWN0aW9uU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gKG1TdGF0ZS5nZXRBY3Rpb25zKCkgJiAoQUNUSU9OX1BMQVkgfCBBQ1RJT05fUExBWV9QQVVTRSkpICE9IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGF1c2VBY3Rpb25TdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAobVN0YXRlLmdldEFjdGlvbnMoKSAmIChBQ1RJT05fUEFVU0UgfCBBQ1RJT05fUExBWV9QQVVTRSkpICE9IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3RvcEFjdGlvblN1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChtU3RhdGUuZ2V0QWN0aW9ucygpICYgQUNUSU9OX1NUT1ApICE9IDA7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc1ZvbHVtZUNvbnRyb2xBdmFpbGFibGUoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIHJldHVybiBtVm9sdW1lQ29udHJvbEVuYWJsZWQgJiYgcm91dGUuZ2V0Vm9sdW1lSGFuZGxpbmcoKQotICAgICAgICAgICAgICAgID09IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfVkFSSUFCTEU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldExheW91dEhlaWdodChWaWV3IHZpZXcpIHsKLSAgICAgICAgcmV0dXJuIHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCkuaGVpZ2h0OwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNldExheW91dEhlaWdodChWaWV3IHZpZXcsIGludCBoZWlnaHQpIHsKLSAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcyBscCA9IHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgIGxwLmhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgdmlldy5zZXRMYXlvdXRQYXJhbXMobHApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdXJpRXF1YWxzKFVyaSB1cmkxLCBVcmkgdXJpMikgewotICAgICAgICBpZiAodXJpMSAhPSBudWxsICYmIHVyaTEuZXF1YWxzKHVyaTIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICh1cmkxID09IG51bGwgJiYgdXJpMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBkZXNpcmVkIGFydCBoZWlnaHQgdG8gZml0IGludG8gY29udHJvbGxlciBkaWFsb2cuCi0gICAgICovCi0gICAgaW50IGdldERlc2lyZWRBcnRIZWlnaHQoaW50IG9yaWdpbmFsV2lkdGgsIGludCBvcmlnaW5hbEhlaWdodCkgewotICAgICAgICBpZiAob3JpZ2luYWxXaWR0aCA+PSBvcmlnaW5hbEhlaWdodCkgewotICAgICAgICAgICAgLy8gRm9yIGxhbmRzY2FwZSBhcnQsIGZpdCB3aWR0aCB0byBkaWFsb2cgd2lkdGguCi0gICAgICAgICAgICByZXR1cm4gKGludCkgKChmbG9hdCkgbURpYWxvZ0NvbnRlbnRXaWR0aCAqIG9yaWdpbmFsSGVpZ2h0IC8gb3JpZ2luYWxXaWR0aCArIDAuNWYpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEZvciBwb3J0cmFpdCBhcnQsIGZpdCBoZWlnaHQgdG8gMTY6OSByYXRpbyBjYXNlJ3MgaGVpZ2h0LgotICAgICAgICByZXR1cm4gKGludCkgKChmbG9hdCkgbURpYWxvZ0NvbnRlbnRXaWR0aCAqIDkgLyAxNiArIDAuNWYpOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlQXJ0SWNvbklmTmVlZGVkKCkgewotICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ICE9IG51bGwgfHwgIWlzSWNvbkNoYW5nZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRmV0Y2hBcnRUYXNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1GZXRjaEFydFRhc2suY2FuY2VsKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIG1GZXRjaEFydFRhc2sgPSBuZXcgRmV0Y2hBcnRUYXNrKCk7Ci0gICAgICAgIG1GZXRjaEFydFRhc2suZXhlY3V0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFyIHRoZSBiaXRtYXAgbG9hZGVkIGJ5IEZldGNoQXJ0VGFzay4gV2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxvYWRlZCBiaXRtYXBzIGFyZSBhcHBsaWVkCi0gICAgICogdG8gYXJ0d29yaywgb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqLwotICAgIHZvaWQgY2xlYXJMb2FkZWRCaXRtYXAoKSB7Ci0gICAgICAgIG1BcnRJY29uSXNMb2FkZWQgPSBmYWxzZTsKLSAgICAgICAgbUFydEljb25Mb2FkZWRCaXRtYXAgPSBudWxsOwotICAgICAgICBtQXJ0SWNvbkJhY2tncm91bmRDb2xvciA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIGEgbmV3IGFydCBpbWFnZSBpcyBkaWZmZXJlbnQgZnJvbSBhbiBvcmlnaW5hbCBhcnQgaW1hZ2UuIENvbXBhcmVzCi0gICAgICogQml0bWFwIG9iamVjdHMgZmlyc3QsIGFuZCB0aGVuIGNvbXBhcmVzIFVSSXMgb25seSBpZiBiaXRtYXAgaXMgdW5jaGFuZ2VkIHdpdGgKLSAgICAgKiBhIG51bGwgdmFsdWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSWNvbkNoYW5nZWQoKSB7Ci0gICAgICAgIEJpdG1hcCBuZXdCaXRtYXAgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0SWNvbkJpdG1hcCgpOwotICAgICAgICBVcmkgbmV3VXJpID0gbURlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbURlc2NyaXB0aW9uLmdldEljb25VcmkoKTsKLSAgICAgICAgQml0bWFwIG9sZEJpdG1hcCA9IG1GZXRjaEFydFRhc2sgPT0gbnVsbCA/IG1BcnRJY29uQml0bWFwIDogbUZldGNoQXJ0VGFzay5nZXRJY29uQml0bWFwKCk7Ci0gICAgICAgIFVyaSBvbGRVcmkgPSBtRmV0Y2hBcnRUYXNrID09IG51bGwgPyBtQXJ0SWNvblVyaSA6IG1GZXRjaEFydFRhc2suZ2V0SWNvblVyaSgpOwotICAgICAgICBpZiAob2xkQml0bWFwICE9IG5ld0JpdG1hcCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAob2xkQml0bWFwID09IG51bGwgJiYgIXVyaUVxdWFscyhvbGRVcmksIG5ld1VyaSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gICAgICAgIE1lZGlhUm91dGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHVwZGF0ZShmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHVwZGF0ZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVm9sdW1lQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgU2Vla0JhciB2b2x1bWVTbGlkZXIgPSBtVm9sdW1lU2xpZGVyTWFwLmdldChyb3V0ZSk7Ci0gICAgICAgICAgICBpbnQgdm9sdW1lID0gcm91dGUuZ2V0Vm9sdW1lKCk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblJvdXRlVm9sdW1lQ2hhbmdlZCgpLCByb3V0ZS5nZXRWb2x1bWU6IiArIHZvbHVtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodm9sdW1lU2xpZGVyICE9IG51bGwgJiYgbVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkICE9IHJvdXRlKSB7Ci0gICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKHZvbHVtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1lZGlhQ29udHJvbGxlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFDb250cm9sbGVyQ29tcGF0LkNhbGxiYWNrIHsKLSAgICAgICAgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uRGVzdHJveWVkKCkgewotICAgICAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIudW5yZWdpc3RlckNhbGxiYWNrKG1Db250cm9sbGVyQ2FsbGJhY2spOwotICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWJhY2tTdGF0ZUNoYW5nZWQoUGxheWJhY2tTdGF0ZUNvbXBhdCBzdGF0ZSkgewotICAgICAgICAgICAgbVN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uTWV0YWRhdGFDaGFuZ2VkKE1lZGlhTWV0YWRhdGFDb21wYXQgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IG1ldGFkYXRhID09IG51bGwgPyBudWxsIDogbWV0YWRhdGEuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIHVwZGF0ZUFydEljb25JZk5lZWRlZCgpOwotICAgICAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ2xpY2tMaXN0ZW5lciBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKLSAgICAgICAgQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgaW50IGlkID0gdi5nZXRJZCgpOwotICAgICAgICAgICAgaWYgKGlkID09IEJVVFRPTl9TVE9QX1JFU19JRCB8fCBpZCA9PSBCVVRUT05fRElTQ09OTkVDVF9SRVNfSUQpIHsKLSAgICAgICAgICAgICAgICBpZiAobVJvdXRlLmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVyLnVuc2VsZWN0KGlkID09IEJVVFRPTl9TVE9QX1JFU19JRCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1NUT1BQRUQgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9ESVNDT05ORUNURUQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlkID09IFIuaWQubXJfY29udHJvbF9wbGF5YmFja19jdHJsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCAmJiBtU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzUGxheWluZyA9IG1TdGF0ZS5nZXRTdGF0ZSgpID09IFBsYXliYWNrU3RhdGVDb21wYXQuU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbkRlc2NSZXNJZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1BsYXlpbmcgJiYgaXNQYXVzZUFjdGlvblN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGF1c2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfcGF1c2U7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGF5aW5nICYmIGlzU3RvcEFjdGlvblN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkuc3RvcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9zdG9wOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1BsYXlpbmcgJiYgaXNQbGF5QWN0aW9uU3VwcG9ydGVkKCkpewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfcGxheTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBBbm5vdW5jZSB0aGUgYWN0aW9uIGZvciBhY2Nlc3NpYmlsaXR5LgotICAgICAgICAgICAgICAgICAgICBpZiAobUFjY2Vzc2liaWxpdHlNYW5hZ2VyICE9IG51bGwgJiYgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmlzRW5hYmxlZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYWN0aW9uRGVzY1Jlc0lkICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudENvbXBhdC5UWVBFX0FOTk9VTkNFTUVOVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zZXRQYWNrYWdlTmFtZShtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnNldENsYXNzTmFtZShnZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRUZXh0KCkuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoYWN0aW9uRGVzY1Jlc0lkKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eU1hbmFnZXIuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlkID09IFIuaWQubXJfY2xvc2UpIHsKLSAgICAgICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFZvbHVtZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgU2Vla0Jhci5PblNlZWtCYXJDaGFuZ2VMaXN0ZW5lciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbVN0b3BUcmFja2luZ1RvdWNoID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtSGFzUGVuZGluZ1VwZGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlKG1QZW5kaW5nVXBkYXRlQW5pbWF0aW9uTmVlZGVkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBWb2x1bWVDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKLSAgICAgICAgICAgIGlmIChtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Wb2x1bWVTbGlkZXIucmVtb3ZlQ2FsbGJhY2tzKG1TdG9wVHJhY2tpbmdUb3VjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgPSAoTWVkaWFSb3V0ZXIuUm91dGVJbmZvKSBzZWVrQmFyLmdldFRhZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7Ci0gICAgICAgICAgICAvLyBEZWZlciByZXNldHRpbmcgbVZvbHVtZVNsaWRlclRvdWNoZWQgdG8gYWxsb3cgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyCi0gICAgICAgICAgICAvLyBhIGxpdHRsZSB0aW1lIHRvIHNldHRsZSBpbnRvIGl0cyBuZXcgc3RhdGUgYW5kIHB1Ymxpc2ggdGhlIGZpbmFsCi0gICAgICAgICAgICAvLyB2b2x1bWUgdXBkYXRlLgotICAgICAgICAgICAgbVZvbHVtZVNsaWRlci5wb3N0RGVsYXllZChtU3RvcFRyYWNraW5nVG91Y2gsIFZPTFVNRV9VUERBVEVfREVMQVlfTUlMTElTKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChTZWVrQmFyIHNlZWtCYXIsIGludCBwcm9ncmVzcywgYm9vbGVhbiBmcm9tVXNlcikgewotICAgICAgICAgICAgaWYgKGZyb21Vc2VyKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gKE1lZGlhUm91dGVyLlJvdXRlSW5mbykgc2Vla0Jhci5nZXRUYWcoKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Qcm9ncmVzc0NoYW5nZWQoKTogY2FsbGluZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiTWVkaWFSb3V0ZXIuUm91dGVJbmZvLnJlcXVlc3RTZXRWb2x1bWUoIiArIHByb2dyZXNzICsgIikiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcm91dGUucmVxdWVzdFNldFZvbHVtZShwcm9ncmVzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFZvbHVtZUdyb3VwQWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHsKLSAgICAgICAgZmluYWwgZmxvYXQgbURpc2FibGVkQWxwaGE7Ci0KLSAgICAgICAgcHVibGljIFZvbHVtZUdyb3VwQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBvYmplY3RzKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCAwLCBvYmplY3RzKTsKLSAgICAgICAgICAgIG1EaXNhYmxlZEFscGhhID0gTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXREaXNhYmxlZEFscGhhKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGZpbmFsIGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICAgICAgVmlldyB2ID0gY29udmVydFZpZXc7Ci0gICAgICAgICAgICBpZiAodiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdiA9IExheW91dEluZmxhdGVyLmZyb20ocGFyZW50LmdldENvbnRleHQoKSkuaW5mbGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1yX2NvbnRyb2xsZXJfdm9sdW1lX2l0ZW0sIHBhcmVudCwgZmFsc2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVWb2x1bWVHcm91cEl0ZW1IZWlnaHQodik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IGdldEl0ZW0ocG9zaXRpb24pOwotICAgICAgICAgICAgaWYgKHJvdXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzRW5hYmxlZCA9IHJvdXRlLmlzRW5hYmxlZCgpOwotCi0gICAgICAgICAgICAgICAgVGV4dFZpZXcgcm91dGVOYW1lID0gKFRleHRWaWV3KSB2LmZpbmRWaWV3QnlJZChSLmlkLm1yX25hbWUpOwotICAgICAgICAgICAgICAgIHJvdXRlTmFtZS5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgcm91dGVOYW1lLnNldFRleHQocm91dGUuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVWb2x1bWVTbGlkZXIgdm9sdW1lU2xpZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNZWRpYVJvdXRlVm9sdW1lU2xpZGVyKSB2LmZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9zbGlkZXIpOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuc2V0Vm9sdW1lU2xpZGVyQ29sb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuZ2V0Q29udGV4dCgpLCB2b2x1bWVTbGlkZXIsIG1Wb2x1bWVHcm91cExpc3QpOwotICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRUYWcocm91dGUpOwotICAgICAgICAgICAgICAgIG1Wb2x1bWVTbGlkZXJNYXAucHV0KHJvdXRlLCB2b2x1bWVTbGlkZXIpOwotICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRIaWRlVGh1bWIoIWlzRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1ZvbHVtZUNvbnRyb2xBdmFpbGFibGUocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0TWF4KHJvdXRlLmdldFZvbHVtZU1heCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRQcm9ncmVzcyhyb3V0ZS5nZXRWb2x1bWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIobVZvbHVtZUNoYW5nZUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRNYXgoMTAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRQcm9ncmVzcygxMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgSW1hZ2VWaWV3IHZvbHVtZUl0ZW1JY29uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChJbWFnZVZpZXcpIHYuZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX2l0ZW1faWNvbik7Ci0gICAgICAgICAgICAgICAgdm9sdW1lSXRlbUljb24uc2V0QWxwaGEoaXNFbmFibGVkID8gMHhGRiA6IChpbnQpICgweEZGICogbURpc2FibGVkQWxwaGEpKTsKLQotICAgICAgICAgICAgICAgIC8vIElmIG92ZXJsYXkgYml0bWFwIGV4aXN0cywgcmVhbCB2aWV3IHNob3VsZCByZW1haW4gaGlkZGVuIHVudGlsCi0gICAgICAgICAgICAgICAgLy8gdGhlIGFuaW1hdGlvbiBlbmRzLgotICAgICAgICAgICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSB2LmZpbmRWaWV3QnlJZChSLmlkLnZvbHVtZV9pdGVtX2NvbnRhaW5lcik7Ci0gICAgICAgICAgICAgICAgY29udGFpbmVyLnNldFZpc2liaWxpdHkobUdyb3VwTWVtYmVyUm91dGVzQW5pbWF0aW5nV2l0aEJpdG1hcC5jb250YWlucyhyb3V0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gVmlldy5JTlZJU0lCTEUgOiBWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICAgICAgLy8gUm91dGVzIHdoaWNoIGFyZSBiZWluZyBhZGRlZCB3aWxsIGJlIGludmlzaWJsZSB1bnRpbCBhbmltYXRpb24gZW5kcy4KLSAgICAgICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgIT0gbnVsbCAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQW5pbWF0aW9uIGFscGhhQW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbigwLjBmLCAwLjBmKTsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldER1cmF0aW9uKDApOwotICAgICAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RmlsbEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRGaWxsQWZ0ZXIodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHYuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgdi5zdGFydEFuaW1hdGlvbihhbHBoYUFuaW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB2OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBGZXRjaEFydFRhc2sgZXh0ZW5kcyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgQml0bWFwPiB7Ci0gICAgICAgIC8vIFNob3cgYW5pbWF0aW9uIG9ubHkgd2hlbiBmZXRjaGluZyB0YWtlcyBhIGxvbmcgdGltZS4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTSE9XX0FOSU1fVElNRV9USFJFU0hPTERfTUlMTElTID0gMTIwTDsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtSWNvbkJpdG1hcDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBVcmkgbUljb25Vcmk7Ci0gICAgICAgIHByaXZhdGUgaW50IG1CYWNrZ3JvdW5kQ29sb3I7Ci0gICAgICAgIHByaXZhdGUgbG9uZyBtU3RhcnRUaW1lTWlsbGlzOwotCi0gICAgICAgIEZldGNoQXJ0VGFzaygpIHsKLSAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0SWNvbkJpdG1hcCgpOwotICAgICAgICAgICAgaWYgKGlzQml0bWFwUmVjeWNsZWQoYml0bWFwKSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbid0IGZldGNoIHRoZSBnaXZlbiBhcnQgYml0bWFwIGJlY2F1c2UgaXQncyBhbHJlYWR5IHJlY3ljbGVkLiIpOwotICAgICAgICAgICAgICAgIGJpdG1hcCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSWNvbkJpdG1hcCA9IGJpdG1hcDsKLSAgICAgICAgICAgIG1JY29uVXJpID0gbURlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbURlc2NyaXB0aW9uLmdldEljb25VcmkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBCaXRtYXAgZ2V0SWNvbkJpdG1hcCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSWNvbkJpdG1hcDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBVcmkgZ2V0SWNvblVyaSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSWNvblVyaTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblByZUV4ZWN1dGUoKSB7Ci0gICAgICAgICAgICBtU3RhcnRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBjbGVhckxvYWRlZEJpdG1hcCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBCaXRtYXAgZG9JbkJhY2tncm91bmQoVm9pZC4uLiBhcmcpIHsKLSAgICAgICAgICAgIEJpdG1hcCBhcnQgPSBudWxsOwotICAgICAgICAgICAgaWYgKG1JY29uQml0bWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcnQgPSBtSWNvbkJpdG1hcDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUljb25VcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChzdHJlYW0gPSBvcGVuSW5wdXRTdHJlYW1CeVNjaGVtZShtSWNvblVyaSkpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBvcGVuOiAiICsgbUljb25VcmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gUXVlcnkgYXJ0IHNpemUuCi0gICAgICAgICAgICAgICAgICAgIEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBvcHRpb25zID0gbmV3IEJpdG1hcEZhY3RvcnkuT3B0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmluSnVzdERlY29kZUJvdW5kcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIEJpdG1hcEZhY3RvcnkuZGVjb2RlU3RyZWFtKHN0cmVhbSwgbnVsbCwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm91dFdpZHRoID09IDAgfHwgb3B0aW9ucy5vdXRIZWlnaHQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gUmV3aW5kIHRoZSBzdHJlYW0gaW4gb3JkZXIgdG8gcmVzdGFydCBhcnQgZGVjb2RpbmcuCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucmVzZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpbGVkIHRvIHJld2luZCB0aGUgc3RyZWFtLCB0cnkgdG8gcmVvcGVuIGl0LgotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmVhbSA9IG9wZW5JbnB1dFN0cmVhbUJ5U2NoZW1lKG1JY29uVXJpKSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBvcGVuOiAiICsgbUljb25VcmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSByZXF1aXJlZCBzaXplIHRvIGRlY29kZSB0aGUgYXJ0IGFuZCBwb3NzaWJseSByZXNpemUgaXQuCi0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5KdXN0RGVjb2RlQm91bmRzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXFIZWlnaHQgPSBnZXREZXNpcmVkQXJ0SGVpZ2h0KG9wdGlvbnMub3V0V2lkdGgsIG9wdGlvbnMub3V0SGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJhdGlvID0gb3B0aW9ucy5vdXRIZWlnaHQgLyByZXFIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5TYW1wbGVTaXplID0gTWF0aC5tYXgoMSwgSW50ZWdlci5oaWdoZXN0T25lQml0KHJhdGlvKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0NhbmNlbGxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcnQgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVN0cmVhbShzdHJlYW0sIG51bGwsIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gb3BlbjogIiArIG1JY29uVXJpLCBlKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaXNCaXRtYXBSZWN5Y2xlZChhcnQpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FuJ3QgdXNlIHJlY3ljbGVkIGJpdG1hcDogIiArIGFydCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXJ0ICE9IG51bGwgJiYgYXJ0LmdldFdpZHRoKCkgPCBhcnQuZ2V0SGVpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBQb3J0cmFpdCBhcnQgcmVxdWlyZXMgZG9taW5hbnQgY29sb3IgYXMgYmFja2dyb3VuZCBjb2xvci4KLSAgICAgICAgICAgICAgICBQYWxldHRlIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZS5CdWlsZGVyKGFydCkubWF4aW11bUNvbG9yQ291bnQoMSkuZ2VuZXJhdGUoKTsKLSAgICAgICAgICAgICAgICBtQmFja2dyb3VuZENvbG9yID0gcGFsZXR0ZS5nZXRTd2F0Y2hlcygpLmlzRW1wdHkoKQotICAgICAgICAgICAgICAgICAgICAgICAgPyAwIDogcGFsZXR0ZS5nZXRTd2F0Y2hlcygpLmdldCgwKS5nZXRSZ2IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBhcnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShCaXRtYXAgYXJ0KSB7Ci0gICAgICAgICAgICBtRmV0Y2hBcnRUYXNrID0gbnVsbDsKLSAgICAgICAgICAgIGlmICghT2JqZWN0c0NvbXBhdC5lcXVhbHMobUFydEljb25CaXRtYXAsIG1JY29uQml0bWFwKQotICAgICAgICAgICAgICAgICAgICB8fCAhT2JqZWN0c0NvbXBhdC5lcXVhbHMobUFydEljb25VcmksIG1JY29uVXJpKSkgewotICAgICAgICAgICAgICAgIG1BcnRJY29uQml0bWFwID0gbUljb25CaXRtYXA7Ci0gICAgICAgICAgICAgICAgbUFydEljb25Mb2FkZWRCaXRtYXAgPSBhcnQ7Ci0gICAgICAgICAgICAgICAgbUFydEljb25VcmkgPSBtSWNvblVyaTsKLSAgICAgICAgICAgICAgICBtQXJ0SWNvbkJhY2tncm91bmRDb2xvciA9IG1CYWNrZ3JvdW5kQ29sb3I7Ci0gICAgICAgICAgICAgICAgbUFydEljb25Jc0xvYWRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbG9uZyBlbGFwc2VkVGltZU1pbGxpcyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gbVN0YXJ0VGltZU1pbGxpczsKLSAgICAgICAgICAgICAgICAvLyBMb2FkZWQgYml0bWFwIHdpbGwgYmUgYXBwbGllZCBvbiB0aGUgbmV4dCB1cGRhdGUKLSAgICAgICAgICAgICAgICB1cGRhdGUoZWxhcHNlZFRpbWVNaWxsaXMgPiBTSE9XX0FOSU1fVElNRV9USFJFU0hPTERfTUlMTElTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gb3BlbklucHV0U3RyZWFtQnlTY2hlbWUoVXJpIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFN0cmluZyBzY2hlbWUgPSB1cmkuZ2V0U2NoZW1lKCkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoQ29udGVudFJlc29sdmVyLlNDSEVNRV9BTkRST0lEX1JFU09VUkNFLmVxdWFscyhzY2hlbWUpCi0gICAgICAgICAgICAgICAgICAgIHx8IENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQ09OVEVOVC5lcXVhbHMoc2NoZW1lKQotICAgICAgICAgICAgICAgICAgICB8fCBDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0ZJTEUuZXF1YWxzKHNjaGVtZSkpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5vcGVuSW5wdXRTdHJlYW0odXJpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwodXJpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgICAgIGNvbm4uc2V0Q29ubmVjdFRpbWVvdXQoQ09OTkVDVElPTl9USU1FT1VUX01JTExJUyk7Ci0gICAgICAgICAgICAgICAgY29ubi5zZXRSZWFkVGltZW91dChDT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTKTsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBjb25uLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKHN0cmVhbSA9PSBudWxsKSA/IG51bGwgOiBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzdHJlYW0pOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1ZDc0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nRnJhZ21lbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi0vKioKLSAqIE1lZGlhIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIGZyYWdtZW50LgotICogPHA+Ci0gKiBDcmVhdGVzIGEge0BsaW5rIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nfS4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgc3ViY2xhc3MKLSAqIHRoaXMgZGlhbG9nIGZyYWdtZW50IHRvIGN1c3RvbWl6ZSB0aGUgbWVkaWEgcm91dGUgY29udHJvbGxlciBkaWFsb2cuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50IGV4dGVuZHMgRGlhbG9nRnJhZ21lbnQgewotICAgIHByaXZhdGUgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2cgbURpYWxvZzsKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgY29udHJvbGxlciBkaWFsb2cgZnJhZ21lbnQuCi0gICAgICogPHA+Ci0gICAgICogQWxsIHN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcyBtdXN0IGFsc28gcG9zc2VzcyBhIGRlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50KCkgewotICAgICAgICBzZXRDYW5jZWxhYmxlKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjb250cm9sbGVyIGRpYWxvZyBpcyBiZWluZyBjcmVhdGVkLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgZGlhbG9nLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2cgb25DcmVhdGVDb250cm9sbGVyRGlhbG9nKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2coY29udGV4dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIERpYWxvZyBvbkNyZWF0ZURpYWxvZyhCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIG1EaWFsb2cgPSBvbkNyZWF0ZUNvbnRyb2xsZXJEaWFsb2coZ2V0Q29udGV4dCgpLCBzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICByZXR1cm4gbURpYWxvZzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICAgIHN1cGVyLm9uU3RvcCgpOwotICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRGlhbG9nLmNsZWFyR3JvdXBMaXN0QW5pbWF0aW9uKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKLSAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOwotICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRGlhbG9nLnVwZGF0ZUxheW91dCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWVhZjM5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotCi0vKioKLSAqIFRoZSBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIG1lZGlhIHJvdXRlCi0gKiBjaG9vc2VyIGFuZCBjb250cm9sbGVyIGRpYWxvZ3MgYXMgbmVlZGVkLgotICogPHA+Ci0gKiBUaGUgYXBwbGljYXRpb24gY2FuIGN1c3RvbWl6ZSB0aGUgZGlhbG9ncyBieSBwcm92aWRpbmcgYSBzdWJjbGFzcyBvZiB0aGUKLSAqIGRpYWxvZyBmYWN0b3J5IHRvIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZUJ1dHRvbn0gdXNpbmcgdGhlCi0gKiB7QGxpbmsgTWVkaWFSb3V0ZUJ1dHRvbiNzZXREaWFsb2dGYWN0b3J5IHNldERpYWxvZ0ZhY3Rvcnl9IG1ldGhvZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBzRGVmYXVsdCA9IG5ldyBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSgpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGRlZmF1bHQgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGRlZmF1bHQgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnksIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBzRGVmYXVsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY2hvb3NlciBkaWFsb2cgaXMgYmVpbmcgb3BlbmVkIGFuZCBpdCBpcyB0aW1lIHRvIGNyZWF0ZSB0aGUgZnJhZ21lbnQuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIGEgY3VzdG9taXplZCBmcmFnbWVudC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBmcmFnbWVudCwgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50IG9uQ3JlYXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50KCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY29udHJvbGxlciBkaWFsb2cgaXMgYmVpbmcgb3BlbmVkIGFuZCBpdCBpcyB0aW1lIHRvIGNyZWF0ZSB0aGUgZnJhZ21lbnQuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIGEgY3VzdG9taXplZCBmcmFnbWVudC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBmcmFnbWVudCwgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50IG9uQ3JlYXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50KCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaWFsb2dIZWxwZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWFiZjdiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotZmluYWwgY2xhc3MgTWVkaWFSb3V0ZURpYWxvZ0hlbHBlciB7Ci0gICAgLyoqCi0gICAgICogVGhlIGZyYW1ld29yayBzaG91bGQgc2V0IHRoZSBkaWFsb2cgd2lkdGggcHJvcGVybHksIGJ1dCBzb21laG93IGl0IGRvZXNuJ3Qgd29yaywgaGVuY2UKLSAgICAgKiBkdXBsaWNhdGluZyBhIHNpbWlsYXIgbG9naWMgaGVyZSB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGRpYWxvZyB3aWR0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXREaWFsb2dXaWR0aChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0RGlzcGxheU1ldHJpY3MoKTsKLSAgICAgICAgYm9vbGVhbiBpc1BvcnRyYWl0ID0gbWV0cmljcy53aWR0aFBpeGVscyA8IG1ldHJpY3MuaGVpZ2h0UGl4ZWxzOwotCi0gICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOwotICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldFZhbHVlKGlzUG9ydHJhaXQKLSAgICAgICAgICAgICAgICA/IFIuZGltZW4ubXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21pbm9yCi0gICAgICAgICAgICAgICAgOiBSLmRpbWVuLm1yX2RpYWxvZ19maXhlZF93aWR0aF9tYWpvciwgdmFsdWUsIHRydWUpOwotICAgICAgICBpZiAodmFsdWUudHlwZSA9PSBUeXBlZFZhbHVlLlRZUEVfRElNRU5TSU9OKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgdmFsdWUuZ2V0RGltZW5zaW9uKG1ldHJpY3MpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnR5cGUgPT0gVHlwZWRWYWx1ZS5UWVBFX0ZSQUNUSU9OKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgdmFsdWUuZ2V0RnJhY3Rpb24obWV0cmljcy53aWR0aFBpeGVscywgbWV0cmljcy53aWR0aFBpeGVscyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHR3byBsaXN0cyByZWdhcmRsZXNzIG9mIG9yZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3QxIEEgbGlzdAotICAgICAqIEBwYXJhbSBsaXN0MiBBIGxpc3QgdG8gYmUgY29tcGFyZWQgd2l0aCB7QGNvZGUgbGlzdDF9Ci0gICAgICogQHJldHVybiBUcnVlIGlmIHR3byBsaXN0cyBoYXZlIGV4YWN0bHkgc2FtZSBpdGVtcyByZWdhcmRsZXNzIG9mIG9yZGVyLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBsaXN0VW5vcmRlcmVkRXF1YWxzKExpc3Q8RT4gbGlzdDEsIExpc3Q8RT4gbGlzdDIpIHsKLSAgICAgICAgSGFzaFNldDxFPiBzZXQxID0gbmV3IEhhc2hTZXQ8PihsaXN0MSk7Ci0gICAgICAgIEhhc2hTZXQ8RT4gc2V0MiA9IG5ldyBIYXNoU2V0PD4obGlzdDIpOwotICAgICAgICByZXR1cm4gc2V0MS5lcXVhbHMoc2V0Mik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIGxpc3RzIGFuZCByZXR1cm5zIGEgc2V0IG9mIGl0ZW1zIHdoaWNoIGV4aXN0Ci0gICAgICogYWZ0ZXItbGlzdCBidXQgYmVmb3JlLWxpc3QsIHdoaWNoIG1lYW5zIG5ld2x5IGFkZGVkIGl0ZW1zLgotICAgICAqCi0gICAgICogQHBhcmFtIGJlZm9yZSBBIGxpc3QKLSAgICAgKiBAcGFyYW0gYWZ0ZXIgQSBsaXN0IHRvIGJlIGNvbXBhcmVkIHdpdGgge0Bjb2RlIGJlZm9yZX0KLSAgICAgKiBAcmV0dXJuIEEgc2V0IG9mIGl0ZW1zIHdoaWNoIGNvbnRhaW5zIG5ld2x5IGFkZGVkIGl0ZW1zIHdoaWxlCi0gICAgICogY29tcGFyaW5nIHtAY29kZSBhZnRlcn0gdG8ge0Bjb2RlIGJlZm9yZX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8RT4gU2V0PEU+IGdldEl0ZW1zQWRkZWQoTGlzdDxFPiBiZWZvcmUsIExpc3Q8RT4gYWZ0ZXIpIHsKLSAgICAgICAgSGFzaFNldDxFPiBzZXQgPSBuZXcgSGFzaFNldDw+KGFmdGVyKTsKLSAgICAgICAgc2V0LnJlbW92ZUFsbChiZWZvcmUpOwotICAgICAgICByZXR1cm4gc2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHR3byBsaXN0cyBhbmQgcmV0dXJucyBhIHNldCBvZiBpdGVtcyB3aGljaCBleGlzdAotICAgICAqIGJlZm9yZS1saXN0IGJ1dCBhZnRlci1saXN0LCB3aGljaCBtZWFucyByZW1vdmVkIGl0ZW1zLgotICAgICAqCi0gICAgICogQHBhcmFtIGJlZm9yZSBBIGxpc3QKLSAgICAgKiBAcGFyYW0gYWZ0ZXIgQSBsaXN0IHRvIGJlIGNvbXBhcmVkIHdpdGgge0Bjb2RlIGJlZm9yZX0KLSAgICAgKiBAcmV0dXJuIEEgc2V0IG9mIGl0ZW1zIHdoaWNoIGNvbnRhaW5zIHJlbW92ZWQgaXRlbXMgd2hpbGUKLSAgICAgKiBjb21wYXJpbmcge0Bjb2RlIGFmdGVyfSB0byB7QGNvZGUgYmVmb3JlfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxFPiBTZXQ8RT4gZ2V0SXRlbXNSZW1vdmVkKExpc3Q8RT4gYmVmb3JlLCBMaXN0PEU+IGFmdGVyKSB7Ci0gICAgICAgIEhhc2hTZXQ8RT4gc2V0ID0gbmV3IEhhc2hTZXQ8PihiZWZvcmUpOwotICAgICAgICBzZXQucmVtb3ZlQWxsKGFmdGVyKTsKLSAgICAgICAgcmV0dXJuIHNldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYW4gaXRlbS1SZWN0IG1hcCB3aGljaCBpbmRpY2F0ZXMgd2hlcmUgbWVtYmVyCi0gICAgICogaXRlbXMgYXJlIGxvY2F0ZWQgaW4gdGhlIGdpdmVuIExpc3RWaWV3LgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RWaWV3IEEgbGlzdCB2aWV3Ci0gICAgICogQHBhcmFtIGFkYXB0ZXIgQW4gYXJyYXkgYWRhcHRlciB3aGljaCBjb250YWlucyBhbiBhcnJheSBvZiBpdGVtcy4KLSAgICAgKiBAcmV0dXJuIEEgbWFwIG9mIGl0ZW1zIGFuZCBib3VuZHMgb2YgdGhlaXIgdmlld3MgbG9jYXRlZCBpbiB0aGUgZ2l2ZW4gbGlzdCB2aWV3LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPEU+IEhhc2hNYXA8RSwgUmVjdD4gZ2V0SXRlbUJvdW5kTWFwKExpc3RWaWV3IGxpc3RWaWV3LAotICAgICAgICAgICAgQXJyYXlBZGFwdGVyPEU+IGFkYXB0ZXIpIHsKLSAgICAgICAgSGFzaE1hcDxFLCBSZWN0PiBpdGVtQm91bmRNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIGludCBmaXJzdFZpc2libGVQb3NpdGlvbiA9IGxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZpZXcuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0VmlzaWJsZVBvc2l0aW9uICsgaTsKLSAgICAgICAgICAgIEUgaXRlbSA9IGFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBsaXN0Vmlldy5nZXRDaGlsZEF0KGkpOwotICAgICAgICAgICAgaXRlbUJvdW5kTWFwLnB1dChpdGVtLAotICAgICAgICAgICAgICAgICAgICBuZXcgUmVjdCh2aWV3LmdldExlZnQoKSwgdmlldy5nZXRUb3AoKSwgdmlldy5nZXRSaWdodCgpLCB2aWV3LmdldEJvdHRvbSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGl0ZW1Cb3VuZE1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYW4gaXRlbS1CaXRtYXBEcmF3YWJsZSBtYXAgd2hpY2ggc3RvcmVzIHNuYXBzaG90cwotICAgICAqIG9mIG1lbWJlciBpdGVtcyBpbiB0aGUgZ2l2ZW4gTGlzdFZpZXcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQKLSAgICAgKiBAcGFyYW0gbGlzdFZpZXcgQSBsaXN0IHZpZXcKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBBbiBhcnJheSBhZGFwdGVyIHdoaWNoIGNvbnRhaW5zIGFuIGFycmF5IG9mIGl0ZW1zLgotICAgICAqIEByZXR1cm4gQSBtYXAgb2YgaXRlbXMgYW5kIHNuYXBzaG90cyBvZiB0aGVpciB2aWV3cyBpbiB0aGUgZ2l2ZW4gbGlzdCB2aWV3LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPEU+IEhhc2hNYXA8RSwgQml0bWFwRHJhd2FibGU+IGdldEl0ZW1CaXRtYXBNYXAoQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgTGlzdFZpZXcgbGlzdFZpZXcsIEFycmF5QWRhcHRlcjxFPiBhZGFwdGVyKSB7Ci0gICAgICAgIEhhc2hNYXA8RSwgQml0bWFwRHJhd2FibGU+IGl0ZW1CaXRtYXBNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIGludCBmaXJzdFZpc2libGVQb3NpdGlvbiA9IGxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZpZXcuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0VmlzaWJsZVBvc2l0aW9uICsgaTsKLSAgICAgICAgICAgIEUgaXRlbSA9IGFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBsaXN0Vmlldy5nZXRDaGlsZEF0KGkpOwotICAgICAgICAgICAgaXRlbUJpdG1hcE1hcC5wdXQoaXRlbSwgZ2V0Vmlld0JpdG1hcChjb250ZXh0LCB2aWV3KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGl0ZW1CaXRtYXBNYXA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQml0bWFwRHJhd2FibGUgZ2V0Vmlld0JpdG1hcChDb250ZXh0IGNvbnRleHQsIFZpZXcgdmlldykgewotICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcCh2aWV3LmdldFdpZHRoKCksIHZpZXcuZ2V0SGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOwotICAgICAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhiaXRtYXApOwotICAgICAgICB2aWV3LmRyYXcoY2FudmFzKTsKLSAgICAgICAgcmV0dXJuIG5ldyBCaXRtYXBEcmF3YWJsZShjb250ZXh0LmdldFJlc291cmNlcygpLCBiaXRtYXApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmVlMTE4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotCi0vKioKLSAqIE1lZGlhIHJvdXRlIGRpc2NvdmVyeSBmcmFnbWVudC4KLSAqIDxwPgotICogVGhpcyBmcmFnbWVudCB0YWtlcyBjYXJlIG9mIHJlZ2lzdGVyaW5nIGEgY2FsbGJhY2sgZm9yIG1lZGlhIHJvdXRlIGRpc2NvdmVyeQotICogZHVyaW5nIHRoZSB7QGxpbmsgRnJhZ21lbnQjb25TdGFydCBvblN0YXJ0KCl9IHBoYXNlCi0gKiBhbmQgcmVtb3ZpbmcgaXQgZHVyaW5nIHRoZSB7QGxpbmsgRnJhZ21lbnQjb25TdG9wIG9uU3RvcCgpfSBwaGFzZS4KLSAqIDwvcD48cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHN1cHBseSBhIHJvdXRlIHNlbGVjdG9yIHRvIHNwZWNpZnkgdGhlIGtpbmRzIG9mIHJvdXRlcwotICogdG8gZGlzY292ZXIuICBUaGUgYXBwbGljYXRpb24gbWF5IGFsc28gb3ZlcnJpZGUge0BsaW5rICNvbkNyZWF0ZUNhbGxiYWNrfSB0bwotICogcHJvdmlkZSB0aGUge0BsaW5rIE1lZGlhUm91dGVyfSBjYWxsYmFjayB0byByZWdpc3Rlci4KLSAqIDwvcD48cD4KLSAqIE5vdGUgdGhhdCB0aGUgZGlzY292ZXJ5IGNhbGxiYWNrIG1ha2VzIHRoZSBhcHBsaWNhdGlvbiBiZSBjb25uZWN0ZWQgd2l0aCBhbGwgdGhlCi0gKiB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXN9Ci0gKiB3aGlsZSBpdCBpcyByZWdpc3RlcmVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIEFSR1VNRU5UX1NFTEVDVE9SID0gInNlbGVjdG9yIjsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5DYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlciBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZXIgZ2V0TWVkaWFSb3V0ZXIoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlcigpOwotICAgICAgICByZXR1cm4gbVJvdXRlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlUm91dGVyKCkgewotICAgICAgICBpZiAobVJvdXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0byBiZSBkaXNjb3ZlcmVkLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRvIGJlIGRpc2NvdmVyZWQuCi0gICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmcmFnbWVudCBpcyBhZGRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotCi0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOwotICAgICAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcmdzLnB1dEJ1bmRsZShBUkdVTUVOVF9TRUxFQ1RPUiwgc2VsZWN0b3IuYXNCdW5kbGUoKSk7Ci0gICAgICAgICAgICBzZXRBcmd1bWVudHMoYXJncyk7Ci0KLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLCBvblByZXBhcmVDYWxsYmFja0ZsYWdzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIGlmIChtU2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgQnVuZGxlIGFyZ3MgPSBnZXRBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIGlmIChhcmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuZnJvbUJ1bmRsZShhcmdzLmdldEJ1bmRsZShBUkdVTUVOVF9TRUxFQ1RPUikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIGNyZWF0ZSB0aGUge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayBjYWxsYmFja30KLSAgICAgKiB0aGF0IHdpbGwgYmUgcmVnaXN0ZXJlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBjYWxsYmFjayBkb2VzIG5vdGhpbmcuICBUaGUgYXBwbGljYXRpb24gbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvCi0gICAgICogc3VwcGx5IGl0cyBvd24gY2FsbGJhY2suCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbmV3IGNhbGxiYWNrLCBvciBudWxsIGlmIG5vIGNhbGxiYWNrIHNob3VsZCBiZSByZWdpc3RlcmVkLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlci5DYWxsYmFjayBvbkNyZWF0ZUNhbGxiYWNrKCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVyLkNhbGxiYWNrKCkgeyB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB0byBwcmVwYXJlIHRoZSBjYWxsYmFjayBmbGFncyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHRoZQotICAgICAqIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgY2FsbGJhY2t9IGlzIHJlZ2lzdGVyZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB7QGxpbmsgTWVkaWFSb3V0ZXIjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGVzaXJlZCBjYWxsYmFjayBmbGFncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IG9uUHJlcGFyZUNhbGxiYWNrRmxhZ3MoKSB7Ci0gICAgICAgIHJldHVybiBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7Ci0gICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKLQotICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7Ci0gICAgICAgIGVuc3VyZVJvdXRlcigpOwotICAgICAgICBtQ2FsbGJhY2sgPSBvbkNyZWF0ZUNhbGxiYWNrKCk7Ci0gICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywgb25QcmVwYXJlQ2FsbGJhY2tGbGFncygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24uamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMGE5NWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmZDb2xvckZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkFuaW1hdGlvbkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5jb250ZW50LkNvbnRleHRDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci0KLS8qKgotICogQ2hldnJvbi9DYXJldCBidXR0b24gdG8gZXhwYW5kL2NvbGxhcHNlIGdyb3VwIHZvbHVtZSBsaXN0IHdpdGggYW5pbWF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uIGV4dGVuZHMgSW1hZ2VCdXR0b24gewotICAgIGZpbmFsIEFuaW1hdGlvbkRyYXdhYmxlIG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZTsKLSAgICBmaW5hbCBBbmltYXRpb25EcmF3YWJsZSBtQ29sbGFwc2VBbmltYXRpb25EcmF3YWJsZTsKLSAgICBmaW5hbCBTdHJpbmcgbUV4cGFuZEdyb3VwRGVzY3JpcHRpb247Ci0gICAgZmluYWwgU3RyaW5nIG1Db2xsYXBzZUdyb3VwRGVzY3JpcHRpb247Ci0gICAgYm9vbGVhbiBtSXNHcm91cEV4cGFuZGVkOwotICAgIE9uQ2xpY2tMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24oQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyKTsKLSAgICAgICAgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlID0gKEFuaW1hdGlvbkRyYXdhYmxlKQotICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5tcl9ncm91cF9leHBhbmQpOwotICAgICAgICBtQ29sbGFwc2VBbmltYXRpb25EcmF3YWJsZSA9IChBbmltYXRpb25EcmF3YWJsZSkKLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldERyYXdhYmxlKFIuZHJhd2FibGUubXJfZ3JvdXBfY29sbGFwc2UpOwotCi0gICAgICAgIENvbG9yRmlsdGVyIGZpbHRlciA9IG5ldyBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIoCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgZGVmU3R5bGVBdHRyKSwKLSAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKTsKLSAgICAgICAgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlLnNldENvbG9yRmlsdGVyKGZpbHRlcik7Ci0gICAgICAgIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlLnNldENvbG9yRmlsdGVyKGZpbHRlcik7Ci0KLSAgICAgICAgbUV4cGFuZEdyb3VwRGVzY3JpcHRpb24gPQotICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwKTsKLSAgICAgICAgbUNvbGxhcHNlR3JvdXBEZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXRTdHJpbmcoUi5zdHJpbmcubXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCk7Ci0KLSAgICAgICAgc2V0SW1hZ2VEcmF3YWJsZShtRXhwYW5kQW5pbWF0aW9uRHJhd2FibGUuZ2V0RnJhbWUoMCkpOwotICAgICAgICBzZXRDb250ZW50RGVzY3JpcHRpb24obUV4cGFuZEdyb3VwRGVzY3JpcHRpb24pOwotCi0gICAgICAgIHN1cGVyLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdmlldykgewotICAgICAgICAgICAgICAgIG1Jc0dyb3VwRXhwYW5kZWQgPSAhbUlzR3JvdXBFeHBhbmRlZDsKLSAgICAgICAgICAgICAgICBpZiAobUlzR3JvdXBFeHBhbmRlZCkgewotICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZURyYXdhYmxlKG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZS5zdGFydCgpOwotICAgICAgICAgICAgICAgICAgICBzZXRDb250ZW50RGVzY3JpcHRpb24obUNvbGxhcHNlR3JvdXBEZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0SW1hZ2VEcmF3YWJsZShtQ29sbGFwc2VBbmltYXRpb25EcmF3YWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25DbGljayh2aWV3KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE9uQ2xpY2tMaXN0ZW5lcihPbkNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlVm9sdW1lU2xpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVWb2x1bWVTbGlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA1ZDIwZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVWb2x1bWVTbGlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKLQotLyoqCi0gKiBWb2x1bWUgc2xpZGVyIHdpdGggc2hvd2luZywgaGlkaW5nLCBhbmQgYXBwbHlpbmcgYWxwaGEgc3VwcG9ydHMgdG8gdGhlIHRodW1iLgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlciBleHRlbmRzIFNlZWtCYXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZVZvbHVtZVNsaWRlciI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1EaXNhYmxlZEFscGhhOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1IaWRlVGh1bWI7Ci0gICAgcHJpdmF0ZSBEcmF3YWJsZSBtVGh1bWI7Ci0gICAgcHJpdmF0ZSBpbnQgbUNvbG9yOwotCi0gICAgcHVibGljIE1lZGlhUm91dGVWb2x1bWVTbGlkZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVWb2x1bWVTbGlkZXIoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwotICAgICAgICBtRGlzYWJsZWRBbHBoYSA9IE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0RGlzYWJsZWRBbHBoYShjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyKTsKLSAgICAgICAgbURpc2FibGVkQWxwaGEgPSBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldERpc2FibGVkQWxwaGEoY29udGV4dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZHJhd2FibGVTdGF0ZUNoYW5nZWQoKSB7Ci0gICAgICAgIHN1cGVyLmRyYXdhYmxlU3RhdGVDaGFuZ2VkKCk7Ci0gICAgICAgIGludCBhbHBoYSA9IGlzRW5hYmxlZCgpID8gMHhGRiA6IChpbnQpICgweEZGICogbURpc2FibGVkQWxwaGEpOwotCi0gICAgICAgIC8vIFRoZSB0aHVtYiBkcmF3YWJsZSBpcyBhIGNvbGxlY3Rpb24gb2YgZHJhd2FibGVzIGFuZCBpdHMgY3VycmVudCBkcmF3YWJsZXMgYXJlIGNoYW5nZWQgcGVyCi0gICAgICAgIC8vIHN0YXRlLiBBcHBseSB0aGUgY29sb3IgZmlsdGVyIGFuZCBhbHBoYSBvbiBldmVyeSBzdGF0ZSBjaGFuZ2UuCi0gICAgICAgIGlmIChtVGh1bWIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRodW1iLnNldENvbG9yRmlsdGVyKG1Db2xvciwgUG9ydGVyRHVmZi5Nb2RlLlNSQ19JTik7Ci0gICAgICAgICAgICBtVGh1bWIuc2V0QWxwaGEoYWxwaGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2V0UHJvZ3Jlc3NEcmF3YWJsZSgpLnNldENvbG9yRmlsdGVyKG1Db2xvciwgUG9ydGVyRHVmZi5Nb2RlLlNSQ19JTik7Ci0gICAgICAgIGdldFByb2dyZXNzRHJhd2FibGUoKS5zZXRBbHBoYShhbHBoYSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VGh1bWIoRHJhd2FibGUgdGh1bWIpIHsKLSAgICAgICAgbVRodW1iID0gdGh1bWI7Ci0gICAgICAgIHN1cGVyLnNldFRodW1iKG1IaWRlVGh1bWIgPyBudWxsIDogbVRodW1iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdG8gc2hvdyBvciBoaWRlIHRodW1iLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhpZGVUaHVtYihib29sZWFuIGhpZGVUaHVtYikgewotICAgICAgICBpZiAobUhpZGVUaHVtYiA9PSBoaWRlVGh1bWIpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtSGlkZVRodW1iID0gaGlkZVRodW1iOwotICAgICAgICBzdXBlci5zZXRUaHVtYihtSGlkZVRodW1iID8gbnVsbCA6IG1UaHVtYik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdm9sdW1lIHNsaWRlciBjb2xvci4gVGhlIGNoYW5nZSB0YWtlcyBlZmZlY3QgbmV4dCB0aW1lIGRyYXdhYmxlIHN0YXRlIGlzIGNoYW5nZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGNvbG9yIGNhbm5vdCBiZSB0cmFuc2x1Y2VudCwgb3RoZXJ3aXNlIHRoZSB1bmRlcmx5aW5nIHByb2dyZXNzIGJhciB3aWxsIGJlIHNlZW4gdGhyb3VnaAotICAgICAqIHRoZSB0aHVtYi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29sb3IoaW50IGNvbG9yKSB7Ci0gICAgICAgIGlmIChtQ29sb3IgPT0gY29sb3IpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoQ29sb3IuYWxwaGEoY29sb3IpICE9IDB4RkYpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIlZvbHVtZSBzbGlkZXIgY29sb3IgY2Fubm90IGJlIHRyYW5zbHVjZW50OiAjIiArIEludGVnZXIudG9IZXhTdHJpbmcoY29sb3IpKTsKLSAgICAgICAgfQotICAgICAgICBtQ29sb3IgPSBjb2xvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVyVGhlbWVIZWxwZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2YwNDJmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5JbnREZWY7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmdyYXBoaWNzLkNvbG9yVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci0KLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1JTl9DT05UUkFTVCA9IDMuMGY7Ci0KLSAgICBASW50RGVmKHtDT0xPUl9EQVJLX09OX0xJR0hUX0JBQ0tHUk9VTkQsIENPTE9SX1dISVRFX09OX0RBUktfQkFDS0dST1VORH0pCi0gICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotICAgIHByaXZhdGUgQGludGVyZmFjZSBDb250cm9sbGVyQ29sb3JUeXBlIHt9Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCA9IDB4REUwMDAwMDA7IC8qIE9wYWNpdHkgb2YgODclICovCi0gICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9XSElURV9PTl9EQVJLX0JBQ0tHUk9VTkQgPSBDb2xvci5XSElURTsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlcigpIHsKLSAgICB9Ci0KLSAgICBzdGF0aWMgQ29udGV4dCBjcmVhdGVUaGVtZWRCdXR0b25Db250ZXh0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICAvLyBBcHBseSBiYXNlIE1lZGlhIFJvdXRlciB0aGVtZS4KLSAgICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIGdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpOwotCi0gICAgICAgIC8vIEFwcGx5IGN1c3RvbSBNZWRpYSBSb3V0ZXIgdGhlbWUuCi0gICAgICAgIGludCBzdHlsZSA9IGdldFRoZW1lUmVzb3VyY2UoY29udGV4dCwgUi5hdHRyLm1lZGlhUm91dGVUaGVtZSk7Ci0gICAgICAgIGlmIChzdHlsZSAhPSAwKSB7Ci0gICAgICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgc3R5bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUaGUgZm9sbG93aW5nIHR3byBtZXRob2RzIGFyZSB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uLiBUaGV5IHNob3VsZCBiZSB1c2VkIHRvIHByZXBhcmUKLSAgICAgKiB0aGUgY29udGV4dCBhbmQgdGhlbWUgZm9yIGEgc3VwZXIgY2xhc3MgY29uc3RydWN0b3IgKHRoZSBsYXR0ZXIgbWV0aG9kIHJlbGllcyBvbiB0aGUKLSAgICAgKiBmb3JtZXIgbWV0aG9kIHRvIHByb3Blcmx5IHByZXBhcmUgdGhlIGNvbnRleHQpOgotICAgICAqICAgc3VwZXIoY29udGV4dCA9IGNyZWF0ZVRoZW1lZERpYWxvZ0NvbnRleHQoY29udGV4dCwgdGhlbWUpLAotICAgICAqICAgICAgICAgICBjcmVhdGVUaGVtZWREaWFsb2dTdHlsZShjb250ZXh0KSk7Ci0gICAgICoKLSAgICAgKiBJdCB3aWxsIGFwcGx5IHRoZW1lIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgKHN0eWxlIGxvb2t1cHMgd2lsbCBiZSBkb25lIGluIHJldmVyc2UpOgotICAgICAqICAgMSkgQ3VycmVudCB0aGVtZQotICAgICAqICAgMikgU3VwcGxpZWQgdGhlbWUKLSAgICAgKiAgIDMpIEJhc2UgTWVkaWEgUm91dGVyIHRoZW1lCi0gICAgICogICA0KSBDdXN0b20gTWVkaWEgUm91dGVyIHRoZW1lLCBpZiBwcm92aWRlZAotICAgICAqLwotICAgIHN0YXRpYyBDb250ZXh0IGNyZWF0ZVRoZW1lZERpYWxvZ0NvbnRleHQoQ29udGV4dCBjb250ZXh0LCBpbnQgdGhlbWUsIGJvb2xlYW4gYWxlcnREaWFsb2cpIHsKLSAgICAgICAgLy8gMSkgQ3VycmVudCB0aGVtZSBpcyBhbHJlYWR5IGFwcGxpZWQgdG8gdGhlIGNvbnRleHQKLQotICAgICAgICAvLyAyKSBJZiBubyB0aGVtZSBpcyBzdXBwbGllZCwgbG9vayBpdCB1cCBmcm9tIHRoZSBjb250ZXh0IChkaWFsb2dUaGVtZS9hbGVydERpYWxvZ1RoZW1lKQotICAgICAgICBpZiAodGhlbWUgPT0gMCkgewotICAgICAgICAgICAgdGhlbWUgPSBnZXRUaGVtZVJlc291cmNlKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICFhbGVydERpYWxvZyA/IGFuZHJvaWQuUi5hdHRyLmRpYWxvZ1RoZW1lIDogYW5kcm9pZC5SLmF0dHIuYWxlcnREaWFsb2dUaGVtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gICAgQXBwbHkgaXQKLSAgICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIHRoZW1lKTsKLQotICAgICAgICAvLyAzKSBJZiBhIGN1c3RvbSBNZWRpYSBSb3V0ZXIgdGhlbWUgaXMgcHJvdmlkZWQgdGhlbiBhcHBseSB0aGUgYmFzZSB0aGVtZQotICAgICAgICBpZiAoZ2V0VGhlbWVSZXNvdXJjZShjb250ZXh0LCBSLmF0dHIubWVkaWFSb3V0ZVRoZW1lKSAhPSAwKSB7Ci0gICAgICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29udGV4dDsKLSAgICB9Ci0gICAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcHJldmlvdXMgbWV0aG9kLgotICAgIHN0YXRpYyBpbnQgY3JlYXRlVGhlbWVkRGlhbG9nU3R5bGUoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIDQpIEFwcGx5IHRoZSBjdXN0b20gTWVkaWEgUm91dGVyIHRoZW1lCi0gICAgICAgIGludCB0aGVtZSA9IGdldFRoZW1lUmVzb3VyY2UoY29udGV4dCwgUi5hdHRyLm1lZGlhUm91dGVUaGVtZSk7Ci0gICAgICAgIGlmICh0aGVtZSA9PSAwKSB7Ci0gICAgICAgICAgICAvLyAzKSBObyBjdXN0b20gTWVkaWFSb3V0ZXIgdGhlbWUgd2FzIHByb3ZpZGVkIHNvIGFwcGx5IHRoZSBiYXNlIHRoZW1lIGluc3RlYWQKLSAgICAgICAgICAgIHRoZW1lID0gZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGVtZTsKLSAgICB9Ci0gICAgLy8gRU5ELiBQcmV2aW91cyB0d28gbWV0aG9kcyBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbi4KLQotICAgIHN0YXRpYyBpbnQgZ2V0VGhlbWVSZXNvdXJjZShDb250ZXh0IGNvbnRleHQsIGludCBhdHRyKSB7Ci0gICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOwotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoYXR0ciwgdmFsdWUsIHRydWUpID8gdmFsdWUucmVzb3VyY2VJZCA6IDA7Ci0gICAgfQotCi0gICAgc3RhdGljIGZsb2F0IGdldERpc2FibGVkQWxwaGEoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOwotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoYW5kcm9pZC5SLmF0dHIuZGlzYWJsZWRBbHBoYSwgdmFsdWUsIHRydWUpCi0gICAgICAgICAgICAgICAgPyB2YWx1ZS5nZXRGbG9hdCgpIDogMC41ZjsKLSAgICB9Ci0KLSAgICBzdGF0aWMgQENvbnRyb2xsZXJDb2xvclR5cGUgaW50IGdldENvbnRyb2xsZXJDb2xvcihDb250ZXh0IGNvbnRleHQsIGludCBzdHlsZSkgewotICAgICAgICBpbnQgcHJpbWFyeUNvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCBzdHlsZSwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5KTsKLSAgICAgICAgaWYgKHByaW1hcnlDb2xvciA9PSAwKSB7Ci0gICAgICAgICAgICBwcmltYXJ5Q29sb3IgPSBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIHN0eWxlLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnkpOwotICAgICAgICAgICAgaWYgKHByaW1hcnlDb2xvciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbWFyeUNvbG9yID0gMHhGRjAwMDAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoQ29sb3JVdGlscy5jYWxjdWxhdGVDb250cmFzdChDT0xPUl9XSElURV9PTl9EQVJLX0JBQ0tHUk9VTkQsIHByaW1hcnlDb2xvcikKLSAgICAgICAgICAgICAgICA+PSBNSU5fQ09OVFJBU1QpIHsKLSAgICAgICAgICAgIHJldHVybiBDT0xPUl9XSElURV9PTl9EQVJLX0JBQ0tHUk9VTkQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgaW50IGdldEJ1dHRvblRleHRDb2xvcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaW50IHByaW1hcnlDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5KTsKLSAgICAgICAgaW50IGJhY2tncm91bmRDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JCYWNrZ3JvdW5kKTsKLQotICAgICAgICBpZiAoQ29sb3JVdGlscy5jYWxjdWxhdGVDb250cmFzdChwcmltYXJ5Q29sb3IsIGJhY2tncm91bmRDb2xvcikgPCBNSU5fQ09OVFJBU1QpIHsKLSAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gY29sb3JBY2NlbnQgaWYgdGhlIGNvbnRyYXN0IHJhdGlvIGlzIGxvdy4KLSAgICAgICAgICAgIHJldHVybiBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIDAsIGFuZHJvaWQuUi5hdHRyLmNvbG9yQWNjZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJpbWFyeUNvbG9yOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNldE1lZGlhQ29udHJvbHNCYWNrZ3JvdW5kQ29sb3IoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIFZpZXcgbWFpbkNvbnRyb2xzLCBWaWV3IGdyb3VwQ29udHJvbHMsIGJvb2xlYW4gaGFzR3JvdXApIHsKLSAgICAgICAgaW50IHByaW1hcnlDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5KTsKLSAgICAgICAgaW50IHByaW1hcnlEYXJrQ29sb3IgPSBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIDAsIGFuZHJvaWQuUi5hdHRyLmNvbG9yUHJpbWFyeURhcmspOwotICAgICAgICBpZiAoaGFzR3JvdXAgJiYgZ2V0Q29udHJvbGxlckNvbG9yKGNvbnRleHQsIDApID09IENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCkgewotICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiBzaG93aW5nIGRhcmsgY29udHJvbHMgaW4gYSBwb3NzaWJseSBkYXJrIChpLmUuIHRoZSBwcmltYXJ5IGRhcmspLCBtb2RlbAotICAgICAgICAgICAgLy8gdGhlIHdoaXRlIGRpYWxvZyBhbmQgdXNlIHRoZSBwcmltYXJ5IGNvbG9yIGZvciB0aGUgZ3JvdXAgY29udHJvbHMuCi0gICAgICAgICAgICBwcmltYXJ5RGFya0NvbG9yID0gcHJpbWFyeUNvbG9yOwotICAgICAgICAgICAgcHJpbWFyeUNvbG9yID0gQ29sb3IuV0hJVEU7Ci0gICAgICAgIH0KLSAgICAgICAgbWFpbkNvbnRyb2xzLnNldEJhY2tncm91bmRDb2xvcihwcmltYXJ5Q29sb3IpOwotICAgICAgICBncm91cENvbnRyb2xzLnNldEJhY2tncm91bmRDb2xvcihwcmltYXJ5RGFya0NvbG9yKTsKLSAgICAgICAgLy8gQWxzbyBzdG9yZSB0aGUgYmFja2dyb3VuZCBjb2xvcnMgdG8gdGhlIHZpZXcgdGFncy4gVGhleSBhcmUgdXNlZCBpbgotICAgICAgICAvLyBzZXRWb2x1bWVTbGlkZXJDb2xvcigpIGJlbG93LgotICAgICAgICBtYWluQ29udHJvbHMuc2V0VGFnKHByaW1hcnlDb2xvcik7Ci0gICAgICAgIGdyb3VwQ29udHJvbHMuc2V0VGFnKHByaW1hcnlEYXJrQ29sb3IpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNldFZvbHVtZVNsaWRlckNvbG9yKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyIHZvbHVtZVNsaWRlciwgVmlldyBiYWNrZ3JvdW5kVmlldykgewotICAgICAgICBpbnQgY29udHJvbGxlckNvbG9yID0gZ2V0Q29udHJvbGxlckNvbG9yKGNvbnRleHQsIDApOwotICAgICAgICBpZiAoQ29sb3IuYWxwaGEoY29udHJvbGxlckNvbG9yKSAhPSAweEZGKSB7Ci0gICAgICAgICAgICAvLyBDb21wb3NpdGUgd2l0aCB0aGUgYmFja2dyb3VuZCBpbiBvcmRlciBub3QgdG8gc2hvdyB0aGUgdW5kZXJseWluZyBwcm9ncmVzcyBiYXIKLSAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIHRodW1iLgotICAgICAgICAgICAgaW50IGJhY2tncm91bmRDb2xvciA9IChpbnQpIGJhY2tncm91bmRWaWV3LmdldFRhZygpOwotICAgICAgICAgICAgY29udHJvbGxlckNvbG9yID0gQ29sb3JVdGlscy5jb21wb3NpdGVDb2xvcnMoY29udHJvbGxlckNvbG9yLCBiYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgICB9Ci0gICAgICAgIHZvbHVtZVNsaWRlci5zZXRDb2xvcihjb250cm9sbGVyQ29sb3IpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMaWdodFRoZW1lKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBUeXBlZFZhbHVlIHZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKLSAgICAgICAgLy8gVE9ETyhzdW5nc29vKTogU3dpdGNoIHRvIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5pc0xpZ2h0VGhlbWUKLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0VGhlbWUoKS5yZXNvbHZlQXR0cmlidXRlKGFuZHJvaWQuc3VwcG9ydC52Ny5hcHBjb21wYXQuUi5hdHRyLmlzTGlnaHRUaGVtZSwKLSAgICAgICAgICAgICAgICB2YWx1ZSwgdHJ1ZSkgJiYgdmFsdWUuZGF0YSAhPSAwOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRUaGVtZUNvbG9yKENvbnRleHQgY29udGV4dCwgaW50IHN0eWxlLCBpbnQgYXR0cikgewotICAgICAgICBpZiAoc3R5bGUgIT0gMCkgewotICAgICAgICAgICAgaW50W10gYXR0cnMgPSB7IGF0dHIgfTsKLSAgICAgICAgICAgIFR5cGVkQXJyYXkgdGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoc3R5bGUsIGF0dHJzKTsKLSAgICAgICAgICAgIGludCBjb2xvciA9IHRhLmdldENvbG9yKDAsIDApOwotICAgICAgICAgICAgdGEucmVjeWNsZSgpOwotICAgICAgICAgICAgaWYgKGNvbG9yICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29sb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7Ci0gICAgICAgIGNvbnRleHQuZ2V0VGhlbWUoKS5yZXNvbHZlQXR0cmlidXRlKGF0dHIsIHZhbHVlLCB0cnVlKTsKLSAgICAgICAgaWYgKHZhbHVlLnJlc291cmNlSWQgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29sb3IodmFsdWUucmVzb3VyY2VJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlLmRhdGE7Ci0gICAgfQotCi0gICAgc3RhdGljIGludCBnZXRSb3V0ZXJUaGVtZUlkKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpbnQgdGhlbWVJZDsKLSAgICAgICAgaWYgKGlzTGlnaHRUaGVtZShjb250ZXh0KSkgewotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJDb2xvcihjb250ZXh0LCAwKSA9PSBDT0xPUl9EQVJLX09OX0xJR0hUX0JBQ0tHUk9VTkQpIHsKLSAgICAgICAgICAgICAgICB0aGVtZUlkID0gUi5zdHlsZS5UaGVtZV9NZWRpYVJvdXRlcl9MaWdodDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhlbWVJZCA9IFIuc3R5bGUuVGhlbWVfTWVkaWFSb3V0ZXJfTGlnaHRfRGFya0NvbnRyb2xQYW5lbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChnZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgMCkgPT0gQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EKSB7Ci0gICAgICAgICAgICAgICAgdGhlbWVJZCA9IFIuc3R5bGUuVGhlbWVfTWVkaWFSb3V0ZXJfTGlnaHRDb250cm9sUGFuZWw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoZW1lSWQgPSBSLnN0eWxlLlRoZW1lX01lZGlhUm91dGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGVtZUlkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvT3ZlcmxheUxpc3RWaWV3LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL092ZXJsYXlMaXN0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDBkZWUyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvT3ZlcmxheUxpc3RWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBIExpc3RWaWV3IHdoaWNoIGhhcyBhbiBhZGRpdGlvbmFsIG92ZXJsYXkgbGF5ZXIuIHtAbGluayBCaXRtYXBEcmF3YWJsZX0KLSAqIGNhbiBiZSBhZGRlZCB0byB0aGUgbGF5ZXIgYW5kIGNhbiBiZSBhbmltYXRlZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE92ZXJsYXlMaXN0VmlldyBleHRlbmRzIExpc3RWaWV3IHsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8T3ZlcmxheU9iamVjdD4gbU92ZXJsYXlPYmplY3RzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICBwdWJsaWMgT3ZlcmxheUxpc3RWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3ZlcmxheUxpc3RWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3ZlcmxheUxpc3RWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gb2JqZWN0IHRvIHRoZSBvdmVybGF5IGxheWVyLgotICAgICAqCi0gICAgICogQHBhcmFtIG9iamVjdCBBbiBvYmplY3QgdG8gYmUgYWRkZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkT3ZlcmxheU9iamVjdChPdmVybGF5T2JqZWN0IG9iamVjdCkgewotICAgICAgICBtT3ZlcmxheU9iamVjdHMuYWRkKG9iamVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnRzIGFsbCBhbmltYXRpb25zIG9mIG9iamVjdHMgaW4gdGhlIG92ZXJsYXkgbGF5ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRBbmltYXRpb25BbGwoKSB7Ci0gICAgICAgIGZvciAoT3ZlcmxheU9iamVjdCBvYmplY3QgOiBtT3ZlcmxheU9iamVjdHMpIHsKLSAgICAgICAgICAgIGlmICghb2JqZWN0LmlzQW5pbWF0aW9uU3RhcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0LnN0YXJ0QW5pbWF0aW9uKGdldERyYXdpbmdUaW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcHMgYWxsIGFuaW1hdGlvbnMgb2Ygb2JqZWN0cyBpbiB0aGUgb3ZlcmxheSBsYXllci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wQW5pbWF0aW9uQWxsKCkgewotICAgICAgICBmb3IgKE92ZXJsYXlPYmplY3Qgb2JqZWN0IDogbU92ZXJsYXlPYmplY3RzKSB7Ci0gICAgICAgICAgICBvYmplY3Quc3RvcEFuaW1hdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7Ci0gICAgICAgIGlmIChtT3ZlcmxheU9iamVjdHMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgSXRlcmF0b3I8T3ZlcmxheU9iamVjdD4gaXQgPSBtT3ZlcmxheU9iamVjdHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPdmVybGF5T2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBCaXRtYXBEcmF3YWJsZSBiaXRtYXAgPSBvYmplY3QuZ2V0Qml0bWFwRHJhd2FibGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoYml0bWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYml0bWFwLmRyYXcoY2FudmFzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QudXBkYXRlKGdldERyYXdpbmdUaW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgY2xhc3MgdGhhdCByZXByZXNlbnRzIGFuIG9iamVjdCB0byBiZSBzaG93biBpbiB0aGUgb3ZlcmxheSBsYXllci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE92ZXJsYXlPYmplY3QgewotICAgICAgICBwcml2YXRlIEJpdG1hcERyYXdhYmxlIG1CaXRtYXA7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbUN1cnJlbnRBbHBoYSA9IDEuMGY7Ci0gICAgICAgIHByaXZhdGUgUmVjdCBtQ3VycmVudEJvdW5kczsKLSAgICAgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUludGVycG9sYXRvcjsKLSAgICAgICAgcHJpdmF0ZSBsb25nIG1EdXJhdGlvbjsKLSAgICAgICAgcHJpdmF0ZSBSZWN0IG1TdGFydFJlY3Q7Ci0gICAgICAgIHByaXZhdGUgaW50IG1EZWx0YVk7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbVN0YXJ0QWxwaGEgPSAxLjBmOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1FbmRBbHBoYSA9IDEuMGY7Ci0gICAgICAgIHByaXZhdGUgbG9uZyBtU3RhcnRUaW1lOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzQW5pbWF0aW9uU3RhcnRlZDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0FuaW1hdGlvbkVuZGVkOwotICAgICAgICBwcml2YXRlIE9uQW5pbWF0aW9uRW5kTGlzdGVuZXIgbUxpc3RlbmVyOwotCi0gICAgICAgIHB1YmxpYyBPdmVybGF5T2JqZWN0KEJpdG1hcERyYXdhYmxlIGJpdG1hcCwgUmVjdCBzdGFydFJlY3QpIHsKLSAgICAgICAgICAgIG1CaXRtYXAgPSBiaXRtYXA7Ci0gICAgICAgICAgICBtU3RhcnRSZWN0ID0gc3RhcnRSZWN0OwotICAgICAgICAgICAgbUN1cnJlbnRCb3VuZHMgPSBuZXcgUmVjdChzdGFydFJlY3QpOwotICAgICAgICAgICAgaWYgKG1CaXRtYXAgIT0gbnVsbCAmJiBtQ3VycmVudEJvdW5kcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRBbHBoYSgoaW50KSAobUN1cnJlbnRBbHBoYSAqIDI1NSkpOwotICAgICAgICAgICAgICAgIG1CaXRtYXAuc2V0Qm91bmRzKG1DdXJyZW50Qm91bmRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBiaXRtYXAgdGhhdCB0aGlzIG9iamVjdCByZXByZXNlbnRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIEJpdG1hcERyYXdhYmxlIHRoYXQgdGhpcyBvYmplY3QgaGFzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJpdG1hcERyYXdhYmxlIGdldEJpdG1hcERyYXdhYmxlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1CaXRtYXA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgc3RhcnRlZCBzdGF0dXMgb2YgdGhlIGFuaW1hdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBhbmltYXRpb24gaGFzIHN0YXJ0ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQW5pbWF0aW9uU3RhcnRlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSXNBbmltYXRpb25TdGFydGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYW5pbWF0aW9uIGZvciB2YXJ5aW5nIGFscGhhLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc3RhcnRBbHBoYSBTdGFydGluZyBhbHBoYSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbiwgd2hlcmUgMS4wIG1lYW5zCi0gICAgICAgICAqIGZ1bGx5IG9wYXF1ZSBhbmQgMC4wIG1lYW5zIGZ1bGx5IHRyYW5zcGFyZW50LgotICAgICAgICAgKiBAcGFyYW0gZW5kQWxwaGEgRW5kaW5nIGFscGhhIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uLgotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRBbHBoYUFuaW1hdGlvbihmbG9hdCBzdGFydEFscGhhLCBmbG9hdCBlbmRBbHBoYSkgewotICAgICAgICAgICAgbVN0YXJ0QWxwaGEgPSBzdGFydEFscGhhOwotICAgICAgICAgICAgbUVuZEFscGhhID0gZW5kQWxwaGE7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGFuaW1hdGlvbiBmb3IgbW92aW5nIG9iamVjdHMgdmVydGljYWxseS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRlbHRhWSBEaXN0YW5jZSB0byBtb3ZlIGluIHBpeGVscy4KLSAgICAgICAgICogQHJldHVybiBUaGlzIE92ZXJsYXlPYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluaW5nIG9mIGNhbGxzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3Qgc2V0VHJhbnNsYXRlWUFuaW1hdGlvbihpbnQgZGVsdGFZKSB7Ci0gICAgICAgICAgICBtRGVsdGFZID0gZGVsdGFZOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBob3cgbG9uZyB0aGUgYW5pbWF0aW9uIHdpbGwgbGFzdC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGR1cmF0aW9uIER1cmF0aW9uIGluIG1pbGxpc2Vjb25kcwotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXREdXJhdGlvbihsb25nIGR1cmF0aW9uKSB7Ci0gICAgICAgICAgICBtRHVyYXRpb24gPSBkdXJhdGlvbjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIGFjY2VsZXJhdGlvbiBjdXJ2ZSBmb3IgdGhpcyBhbmltYXRpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbnRlcnBvbGF0b3IgVGhlIGludGVycG9sYXRvciB3aGljaCBkZWZpbmVzIHRoZSBhY2NlbGVyYXRpb24gY3VydmUKLSAgICAgICAgICogQHJldHVybiBUaGlzIE92ZXJsYXlPYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluaW5nIG9mIGNhbGxzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3Qgc2V0SW50ZXJwb2xhdG9yKEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IpIHsKLSAgICAgICAgICAgIG1JbnRlcnBvbGF0b3IgPSBpbnRlcnBvbGF0b3I7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCaW5kcyBhbiBhbmltYXRpb24gZW5kIGxpc3RlbmVyIHRvIHRoZSBhbmltYXRpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgYW5pbWF0aW9uIGVuZCBsaXN0ZW5lciB0byBiZSBub3RpZmllZC4KLSAgICAgICAgICogQHJldHVybiBUaGlzIE92ZXJsYXlPYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluaW5nIG9mIGNhbGxzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3Qgc2V0QW5pbWF0aW9uRW5kTGlzdGVuZXIoT25BbmltYXRpb25FbmRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTdGFydHMgdGhlIGFuaW1hdGlvbiBhbmQgc2V0cyB0aGUgc3RhcnQgdGltZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHN0YXJ0VGltZSBTdGFydCB0aW1lIHRvIGJlIHNldCBpbiBNaWxsaXMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0QW5pbWF0aW9uKGxvbmcgc3RhcnRUaW1lKSB7Ci0gICAgICAgICAgICBtU3RhcnRUaW1lID0gc3RhcnRUaW1lOwotICAgICAgICAgICAgbUlzQW5pbWF0aW9uU3RhcnRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU3RvcHMgdGhlIGFuaW1hdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0b3BBbmltYXRpb24oKSB7Ci0gICAgICAgICAgICBtSXNBbmltYXRpb25TdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIG1Jc0FuaW1hdGlvbkVuZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbkFuaW1hdGlvbkVuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGN1bGF0ZXMgYW5kIHVwZGF0ZXMgY3VycmVudCBib3VuZHMgYW5kIGFscGhhIHZhbHVlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY3VycmVudFRpbWUgQ3VycmVudCB0aW1lLmluIG1pbGxpcwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gdXBkYXRlKGxvbmcgY3VycmVudFRpbWUpIHsKLSAgICAgICAgICAgIGlmIChtSXNBbmltYXRpb25FbmRlZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsb2F0IG5vcm1hbGl6ZWRUaW1lID0gKGN1cnJlbnRUaW1lIC0gbVN0YXJ0VGltZSkgLyAoZmxvYXQpIG1EdXJhdGlvbjsKLSAgICAgICAgICAgIG5vcm1hbGl6ZWRUaW1lID0gTWF0aC5tYXgoMC4wZiwgTWF0aC5taW4oMS4wZiwgbm9ybWFsaXplZFRpbWUpKTsKLSAgICAgICAgICAgIGlmICghbUlzQW5pbWF0aW9uU3RhcnRlZCkgewotICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRUaW1lID0gMC4wZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsb2F0IGludGVycG9sYXRlZFRpbWUgPSAobUludGVycG9sYXRvciA9PSBudWxsKSA/IG5vcm1hbGl6ZWRUaW1lCi0gICAgICAgICAgICAgICAgICAgIDogbUludGVycG9sYXRvci5nZXRJbnRlcnBvbGF0aW9uKG5vcm1hbGl6ZWRUaW1lKTsKLSAgICAgICAgICAgIGludCBkZWx0YVkgPSAoaW50KSAobURlbHRhWSAqIGludGVycG9sYXRlZFRpbWUpOwotICAgICAgICAgICAgbUN1cnJlbnRCb3VuZHMudG9wID0gbVN0YXJ0UmVjdC50b3AgKyBkZWx0YVk7Ci0gICAgICAgICAgICBtQ3VycmVudEJvdW5kcy5ib3R0b20gPSBtU3RhcnRSZWN0LmJvdHRvbSArIGRlbHRhWTsKLSAgICAgICAgICAgIG1DdXJyZW50QWxwaGEgPSBtU3RhcnRBbHBoYSArIChtRW5kQWxwaGEgLSBtU3RhcnRBbHBoYSkgKiBpbnRlcnBvbGF0ZWRUaW1lOwotICAgICAgICAgICAgaWYgKG1CaXRtYXAgIT0gbnVsbCAmJiBtQ3VycmVudEJvdW5kcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRBbHBoYSgoaW50KSAobUN1cnJlbnRBbHBoYSAqIDI1NSkpOwotICAgICAgICAgICAgICAgIG1CaXRtYXAuc2V0Qm91bmRzKG1DdXJyZW50Qm91bmRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtSXNBbmltYXRpb25TdGFydGVkICYmIG5vcm1hbGl6ZWRUaW1lID49IDEuMGYpIHsKLSAgICAgICAgICAgICAgICBtSXNBbmltYXRpb25FbmRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbkFuaW1hdGlvbkVuZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAhbUlzQW5pbWF0aW9uRW5kZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gYW5pbWF0aW9uIGxpc3RlbmVyIHRoYXQgcmVjZWl2ZXMgbm90aWZpY2F0aW9ucyB3aGVuIHRoZSBhbmltYXRpb24gZW5kcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgT25BbmltYXRpb25FbmRMaXN0ZW5lciB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIE5vdGlmaWVzIHRoZSBlbmQgb2YgdGhlIGFuaW1hdGlvbi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIxL01lZGlhUm91dGVySmVsbHliZWFuTXIxLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMS9NZWRpYVJvdXRlckplbGx5YmVhbk1yMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODUzOWJkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIxL01lZGlhUm91dGVySmVsbHliZWFuTXIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5kaXNwbGF5LkRpc3BsYXlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlJlcXVpcmVzQXBpOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLy8gQEBSZXF1aXJlc0FwaSgxNykKLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVySmVsbHliZWFuTXIxIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVySmVsbHliZWFuTXIxIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUNhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ2FsbGJhY2tQcm94eTxDYWxsYmFjaz4oY2FsbGJhY2spOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW5hYmxlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5pc0VuYWJsZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRGlzcGxheSBnZXRQcmVzZW50YXRpb25EaXNwbGF5KE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgLy8gYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpIHdhcwotICAgICAgICAgICAgLy8gYWRkZWQgaW4gQVBJIDE3LiBIb3dldmVyLCBzb21lIGZhY3RvcnkgcmVsZWFzZXMgb2YgSkIgTVIxIG1pc3NlZCBpdC4KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFByZXNlbnRhdGlvbkRpc3BsYXkoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEVycm9yIGV4KSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGdldCBwcmVzZW50YXRpb24gZGlzcGxheSBmb3IgdGhlIHJvdXRlLiIsIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlckplbGx5YmVhbi5DYWxsYmFjayB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChPYmplY3Qgcm91dGVPYmopOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdvcmthcm91bmQgdGhlIGZhY3QgdGhhdCB0aGUgdmVyc2lvbiBvZiBNZWRpYVJvdXRlci5hZGRDYWxsYmFjaygpIHRoYXQgYWNjZXB0cyBhCi0gICAgICogZmxhZyB0byBwZXJmb3JtIGFuIGFjdGl2ZSBzY2FuIGRvZXMgbm90IGV4aXN0IGluIEpCIE1SMSBzbyB3ZSBuZWVkIHRvIGZvcmNlCi0gICAgICogd2lmaSBkaXNwbGF5IHNjYW5zIGRpcmVjdGx5IHRocm91Z2ggdGhlIERpc3BsYXlNYW5hZ2VyLgotICAgICAqIERvIG5vdCB1c2Ugb24gSkIgTVIyIGFuZCBhYm92ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEFjdGl2ZVNjYW5Xb3JrYXJvdW5kIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICAvLyBUaW1lIGJldHdlZW4gd2lmaSBkaXNwbGF5IHNjYW5zIHdoZW4gYWN0aXZlbHkgc2Nhbm5pbmcgaW4gbWlsbGlzZWNvbmRzLgotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9ESVNQTEFZX1NDQU5fSU5URVJWQUwgPSAxNTAwMDsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIERpc3BsYXlNYW5hZ2VyIG1EaXNwbGF5TWFuYWdlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOwotICAgICAgICBwcml2YXRlIE1ldGhvZCBtU2NhbldpZmlEaXNwbGF5c01ldGhvZDsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXM7Ci0KLSAgICAgICAgcHVibGljIEFjdGl2ZVNjYW5Xb3JrYXJvdW5kKENvbnRleHQgY29udGV4dCwgSGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UICE9IDE3KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EaXNwbGF5TWFuYWdlciA9IChEaXNwbGF5TWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuRElTUExBWV9TRVJWSUNFKTsKLSAgICAgICAgICAgIG1IYW5kbGVyID0gaGFuZGxlcjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVNjYW5XaWZpRGlzcGxheXNNZXRob2QgPSBEaXNwbGF5TWFuYWdlci5jbGFzcy5nZXRNZXRob2QoInNjYW5XaWZpRGlzcGxheXMiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlU2NhblJvdXRlVHlwZXMoaW50IHJvdXRlVHlwZXMpIHsKLSAgICAgICAgICAgIC8vIE9uIEpCIE1SMSwgdGhlcmUgaXMgbm8gQVBJIHRvIHNjYW4gd2lmaSBkaXNwbGF5IHJvdXRlcy4KLSAgICAgICAgICAgIC8vIEluc3RlYWQgd2UgbXVzdCBtYWtlIGEgZGlyZWN0IGNhbGwgaW50byB0aGUgRGlzcGxheU1hbmFnZXIgdG8gc2NhbgotICAgICAgICAgICAgLy8gd2lmaSBkaXNwbGF5cyBvbiB0aGlzIHZlcnNpb24gYnV0IG9ubHkgd2hlbiBsaXZlIHZpZGVvIHJvdXRlcyBhcmUgcmVxdWVzdGVkLgotICAgICAgICAgICAgLy8gU2VlIGFsc28gdGhlIEplbGx5YmVhbk1yMkltcGwgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QuCi0gICAgICAgICAgICAvLyBUaGlzIHdhcyBmaXhlZCBpbiBKQiBNUjIgYnkgYWRkaW5nIGEgbmV3IG92ZXJsb2FkIG9mIGFkZENhbGxiYWNrKCkgdG8KLSAgICAgICAgICAgIC8vIGVuYWJsZSBhY3RpdmUgc2Nhbm5pbmcgb24gcmVxdWVzdC4KLSAgICAgICAgICAgIGlmICgocm91dGVUeXBlcyAmIE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9WSURFTykgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmICghbUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TY2FuV2lmaURpc3BsYXlzTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVseVNjYW5uaW5nV2lmaURpc3BsYXlzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QodGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3Qgc2NhbiBmb3Igd2lmaSBkaXNwbGF5cyBiZWNhdXNlIHRoZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIkRpc3BsYXlNYW5hZ2VyLnNjYW5XaWZpRGlzcGxheXMoKSBtZXRob2QgaXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJub3QgYXZhaWxhYmxlIG9uIHRoaXMgZGV2aWNlLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMpIHsKLSAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpZiAobUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtU2NhbldpZmlEaXNwbGF5c01ldGhvZC5pbnZva2UobURpc3BsYXlNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBzY2FuIGZvciB3aWZpIGRpc3BsYXlzLiIsIGV4KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBzY2FuIGZvciB3aWZpIGRpc3BsYXlzLiIsIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQodGhpcywgV0lGSV9ESVNQTEFZX1NDQU5fSU5URVJWQUwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV29ya2Fyb3VuZCB0aGUgZmFjdCB0aGF0IHRoZSBpc0Nvbm5lY3RpbmcoKSBtZXRob2QgZG9lcyBub3QgZXhpc3QgaW4gSkIgTVIxLgotICAgICAqIERvIG5vdCB1c2Ugb24gSkIgTVIyIGFuZCBhYm92ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIElzQ29ubmVjdGluZ1dvcmthcm91bmQgewotICAgICAgICBwcml2YXRlIE1ldGhvZCBtR2V0U3RhdHVzQ29kZU1ldGhvZDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVN0YXR1c0Nvbm5lY3Rpbmc7Ci0KLSAgICAgICAgcHVibGljIElzQ29ubmVjdGluZ1dvcmthcm91bmQoKSB7Ci0gICAgICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UICE9IDE3KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRmllbGQgc3RhdHVzQ29ubmVjdGluZ0ZpZWxkID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvLmNsYXNzLmdldEZpZWxkKCJTVEFUVVNfQ09OTkVDVElORyIpOwotICAgICAgICAgICAgICAgIG1TdGF0dXNDb25uZWN0aW5nID0gc3RhdHVzQ29ubmVjdGluZ0ZpZWxkLmdldEludChudWxsKTsKLSAgICAgICAgICAgICAgICBtR2V0U3RhdHVzQ29kZU1ldGhvZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5jbGFzcy5nZXRNZXRob2QoImdldFN0YXR1c0NvZGUiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGluZyhPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0KLSAgICAgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqOwotCi0gICAgICAgICAgICBpZiAobUdldFN0YXR1c0NvZGVNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdGF0dXNDb2RlID0gKEludGVnZXIpbUdldFN0YXR1c0NvZGVNZXRob2QuaW52b2tlKHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1c0NvZGUgPT0gbVN0YXR1c0Nvbm5lY3Rpbmc7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFzc3VtZSBub3QgY29ubmVjdGluZy4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBDYWxsYmFja1Byb3h5PFQgZXh0ZW5kcyBDYWxsYmFjaz4KLSAgICAgICAgICAgIGV4dGVuZHMgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQ2FsbGJhY2tQcm94eTxUPiB7Ci0gICAgICAgIHB1YmxpYyBDYWxsYmFja1Byb3h5KFQgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQocm91dGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjIvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIyL01lZGlhUm91dGVySmVsbHliZWFuTXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMDM1NDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjIvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotLy8gQEBSZXF1aXJlc0FwaSgxOCkKLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVySmVsbHliZWFuTXIyIHsKLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXREZWZhdWx0Um91dGUoT2JqZWN0IHJvdXRlck9iaikgewotICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuZ2V0RGVmYXVsdFJvdXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZENhbGxiYWNrKE9iamVjdCByb3V0ZXJPYmosIGludCB0eXBlcywgT2JqZWN0IGNhbGxiYWNrT2JqLCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuYWRkQ2FsbGJhY2sodHlwZXMsCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2spY2FsbGJhY2tPYmosIGZsYWdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldERlc2NyaXB0aW9uKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb25uZWN0aW5nKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmlzQ29ubmVjdGluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBVc2VyUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0aW9uKE9iamVjdCByb3V0ZU9iaiwgQ2hhclNlcXVlbmNlIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi9NZWRpYVJvdXRlckplbGx5YmVhbi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi9NZWRpYVJvdXRlckplbGx5YmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmI1OWI4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4vTWVkaWFSb3V0ZXJKZWxseWJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8vIEBAUmVxdWlyZXNBcGkoMTYpCi1maW5hbCBjbGFzcyBNZWRpYVJvdXRlckplbGx5YmVhbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlckplbGx5YmVhbiI7Ci0KLSAgICAvLyBhbmRyb2lkLm1lZGlhLkF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAgPSAweDgwOwotICAgIC8vIGFuZHJvaWQubWVkaWEuQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTID0gMHgxMDA7Ci0gICAgLy8gYW5kcm9pZC5tZWRpYS5BdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIgPSAweDIwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfT1VUX0JMVUVUT09USCA9IDB4ODAgfCAweDEwMCB8IDB4MjAwOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9VVEVfVFlQRV9MSVZFX0FVRElPID0gMHgxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPVVRFX1RZUEVfTElWRV9WSURFTyA9IDB4MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VURV9UWVBFX1VTRVIgPSAweDAwODAwMDAwOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMX1JPVVRFX1RZUEVTID0KLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9BVURJTwotICAgICAgICAgICAgfCBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfVklERU8KLSAgICAgICAgICAgIHwgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9VU0VSOwotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0TWVkaWFSb3V0ZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5NRURJQV9ST1VURVJfU0VSVklDRSk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSb3V0ZXMoT2JqZWN0IHJvdXRlck9iaikgewotICAgICAgICBmaW5hbCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciA9IChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iajsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gcm91dGVyLmdldFJvdXRlQ291bnQoKTsKLSAgICAgICAgTGlzdCBvdXQgPSBuZXcgQXJyYXlMaXN0KGNvdW50KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBvdXQuYWRkKHJvdXRlci5nZXRSb3V0ZUF0KGkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3V0OwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q2F0ZWdvcmllcyhPYmplY3Qgcm91dGVyT2JqKSB7Ci0gICAgICAgIGZpbmFsIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyID0gKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqOwotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXIuZ2V0Q2F0ZWdvcnlDb3VudCgpOwotICAgICAgICBMaXN0IG91dCA9IG5ldyBBcnJheUxpc3QoY291bnQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIG91dC5hZGQocm91dGVyLmdldENhdGVnb3J5QXQoaSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0U2VsZWN0ZWRSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZSkgewotICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuZ2V0U2VsZWN0ZWRSb3V0ZSh0eXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VsZWN0Um91dGUoT2JqZWN0IHJvdXRlck9iaiwgaW50IHR5cGVzLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuc2VsZWN0Um91dGUodHlwZXMsCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQ2FsbGJhY2soT2JqZWN0IHJvdXRlck9iaiwgaW50IHR5cGVzLCBPYmplY3QgY2FsbGJhY2tPYmopIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuYWRkQ2FsbGJhY2sodHlwZXMsCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2spY2FsbGJhY2tPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVDYWxsYmFjayhPYmplY3Qgcm91dGVyT2JqLCBPYmplY3QgY2FsbGJhY2tPYmopIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikucmVtb3ZlQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2spY2FsbGJhY2tPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVJvdXRlQ2F0ZWdvcnkoT2JqZWN0IHJvdXRlck9iaiwKLSAgICAgICAgICAgIFN0cmluZyBuYW1lLCBib29sZWFuIGlzR3JvdXBhYmxlKSB7Ci0gICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5jcmVhdGVSb3V0ZUNhdGVnb3J5KG5hbWUsIGlzR3JvdXBhYmxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVVc2VyUm91dGUoT2JqZWN0IHJvdXRlck9iaiwgT2JqZWN0IGNhdGVnb3J5T2JqKSB7Ci0gICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5jcmVhdGVVc2VyUm91dGUoCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVDYXRlZ29yeSljYXRlZ29yeU9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFVzZXJSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuYWRkVXNlclJvdXRlKAotICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVVc2VyUm91dGUoT2JqZWN0IHJvdXRlck9iaiwgT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLnJlbW92ZVVzZXJSb3V0ZSgKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVDYWxsYmFjayhDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IENhbGxiYWNrUHJveHk8Q2FsbGJhY2s+KGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVWb2x1bWVDYWxsYmFjayhWb2x1bWVDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IFZvbHVtZUNhbGxiYWNrUHJveHk8Vm9sdW1lQ2FsbGJhY2s+KGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBjaGVja1JvdXRlZFRvQmx1ZXRvb3RoKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXVkaW9NYW5hZ2VyIGF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZSgKLSAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5BVURJT19TRVJWSUNFKTsKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBhdWRpb01hbmFnZXIuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgImdldERldmljZXNGb3JTdHJlYW0iLCBpbnQuY2xhc3MpOwotICAgICAgICAgICAgaW50IGRldmljZSA9IChJbnRlZ2VyKSBtZXRob2QuaW52b2tlKGF1ZGlvTWFuYWdlciwgQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQyk7Ci0gICAgICAgICAgICByZXR1cm4gKGRldmljZSAmIERFVklDRV9PVVRfQkxVRVRPT1RIKSAhPSAwOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUluZm8gewotICAgICAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBnZXROYW1lKE9iamVjdCByb3V0ZU9iaiwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0TmFtZShjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldFN0YXR1cyhPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRTdGF0dXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFN1cHBvcnRlZFR5cGVzKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFN1cHBvcnRlZFR5cGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRDYXRlZ29yeShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRDYXRlZ29yeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBEcmF3YWJsZSBnZXRJY29uRHJhd2FibGUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0SWNvbkRyYXdhYmxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQbGF5YmFja1R5cGUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0UGxheWJhY2tUeXBlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQbGF5YmFja1N0cmVhbShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRQbGF5YmFja1N0cmVhbSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Vm9sdW1lKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFZvbHVtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Vm9sdW1lTWF4KE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFZvbHVtZU1heCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Vm9sdW1lSGFuZGxpbmcoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0Vm9sdW1lSGFuZGxpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFRhZyhPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRUYWcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRUYWcoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgdGFnKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRUYWcodGFnKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXF1ZXN0U2V0Vm9sdW1lKE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZSkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikucmVxdWVzdFNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcXVlc3RVcGRhdGVWb2x1bWUoT2JqZWN0IHJvdXRlT2JqLCBpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGRpcmVjdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRHcm91cChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRHcm91cCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzR3JvdXAoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gcm91dGVPYmogaW5zdGFuY2VvZiBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlR3JvdXAgewotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRHcm91cGVkUm91dGVzKE9iamVjdCBncm91cE9iaikgewotICAgICAgICAgICAgZmluYWwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUdyb3VwIGdyb3VwID0KLSAgICAgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVHcm91cClncm91cE9iajsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdyb3VwLmdldFJvdXRlQ291bnQoKTsKLSAgICAgICAgICAgIExpc3Qgb3V0ID0gbmV3IEFycmF5TGlzdChjb3VudCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBvdXQuYWRkKGdyb3VwLmdldFJvdXRlQXQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG91dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVXNlclJvdXRlSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXROYW1lKE9iamVjdCByb3V0ZU9iaiwgQ2hhclNlcXVlbmNlIG5hbWUpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXROYW1lKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFN0YXR1cyhPYmplY3Qgcm91dGVPYmosIENoYXJTZXF1ZW5jZSBzdGF0dXMpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRTdGF0dXMoc3RhdHVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJY29uRHJhd2FibGUoT2JqZWN0IHJvdXRlT2JqLCBEcmF3YWJsZSBpY29uKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0SWNvbkRyYXdhYmxlKGljb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFBsYXliYWNrVHlwZShPYmplY3Qgcm91dGVPYmosIGludCB0eXBlKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0UGxheWJhY2tUeXBlKHR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFBsYXliYWNrU3RyZWFtKE9iamVjdCByb3V0ZU9iaiwgaW50IHN0cmVhbSkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFBsYXliYWNrU3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Vm9sdW1lKE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZSkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZvbHVtZU1heChPYmplY3Qgcm91dGVPYmosIGludCB2b2x1bWVNYXgpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRWb2x1bWVNYXgodm9sdW1lTWF4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWb2x1bWVIYW5kbGluZyhPYmplY3Qgcm91dGVPYmosIGludCB2b2x1bWVIYW5kbGluZykgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFZvbHVtZUhhbmRsaW5nKHZvbHVtZUhhbmRsaW5nKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWb2x1bWVDYWxsYmFjayhPYmplY3Qgcm91dGVPYmosIE9iamVjdCB2b2x1bWVDYWxsYmFja09iaikgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFZvbHVtZUNhbGxiYWNrKAotICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Wb2x1bWVDYWxsYmFjayl2b2x1bWVDYWxsYmFja09iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmVtb3RlQ29udHJvbENsaWVudChPYmplY3Qgcm91dGVPYmosIE9iamVjdCByY2NPYmopIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRSZW1vdGVDb250cm9sQ2xpZW50KAotICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5SZW1vdGVDb250cm9sQ2xpZW50KXJjY09iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlQ2F0ZWdvcnkgewotICAgICAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBnZXROYW1lKE9iamVjdCBjYXRlZ29yeU9iaiwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmdldE5hbWUoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSb3V0ZXMoT2JqZWN0IGNhdGVnb3J5T2JqKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Qgb3V0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmdldFJvdXRlcyhvdXQpOwotICAgICAgICAgICAgcmV0dXJuIG91dDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFN1cHBvcnRlZFR5cGVzKE9iamVjdCBjYXRlZ29yeU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUNhdGVnb3J5KWNhdGVnb3J5T2JqKS5nZXRTdXBwb3J0ZWRUeXBlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzR3JvdXBhYmxlKE9iamVjdCBjYXRlZ29yeU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUNhdGVnb3J5KWNhdGVnb3J5T2JqKS5pc0dyb3VwYWJsZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQ2FsbGJhY2sgewotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoaW50IHR5cGUsIE9iamVjdCByb3V0ZU9iaik7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKGludCB0eXBlLCBPYmplY3Qgcm91dGVPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoT2JqZWN0IHJvdXRlT2JqKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoT2JqZWN0IHJvdXRlT2JqKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoT2JqZWN0IHJvdXRlT2JqKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUdyb3VwZWQoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgZ3JvdXBPYmosIGludCBpbmRleCk7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbmdyb3VwZWQoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgZ3JvdXBPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVm9sdW1lQ2hhbmdlZChPYmplY3Qgcm91dGVPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZvbHVtZUNhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZSk7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCBkaXJlY3Rpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdvcmthcm91bmQgZm9yIGxpbWl0YXRpb25zIG9mIHNlbGVjdFJvdXRlKCkgb24gSkIgYW5kIEpCIE1SMS4KLSAgICAgKiBEbyBub3QgdXNlIG9uIEpCIE1SMiBhbmQgYWJvdmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTZWxlY3RSb3V0ZVdvcmthcm91bmQgewotICAgICAgICBwcml2YXRlIE1ldGhvZCBtU2VsZWN0Um91dGVJbnRNZXRob2Q7Ci0KLSAgICAgICAgcHVibGljIFNlbGVjdFJvdXRlV29ya2Fyb3VuZCgpIHsKLSAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPCAxNiB8fCBCdWlsZC5WRVJTSU9OLlNES19JTlQgPiAxNykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0Um91dGVJbnRNZXRob2QgPSBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLmNsYXNzLmdldE1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3RSb3V0ZUludCIsIGludC5jbGFzcywgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uY2xhc3MpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3RSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZXMsIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIgPSAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmo7Ci0gICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iajsKLQotICAgICAgICAgICAgaW50IHJvdXRlVHlwZXMgPSByb3V0ZS5nZXRTdXBwb3J0ZWRUeXBlcygpOwotICAgICAgICAgICAgaWYgKChyb3V0ZVR5cGVzICYgUk9VVEVfVFlQRV9VU0VSKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gSGFuZGxlIG5vbi11c2VyIHJvdXRlcy4KLSAgICAgICAgICAgICAgICAvLyBPbiBKQiBhbmQgSkIgTVIxLCB0aGUgc2VsZWN0Um91dGUoKSBBUEkgb25seSBzdXBwb3J0cyBwcm9ncmFtbWF0aWNhbGx5Ci0gICAgICAgICAgICAgICAgLy8gc2VsZWN0aW5nIHVzZXIgcm91dGVzLiAgU28gaW5zdGVhZCB3ZSByZWx5IG9uIHRoZSBoaWRkZW4gc2VsZWN0Um91dGVJbnQoKQotICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBvbiB0aGVzZSB2ZXJzaW9ucyBvZiB0aGUgcGxhdGZvcm0uCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBsaW1pdGF0aW9uIHdhcyByZW1vdmVkIGluIEpCIE1SMi4KLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdFJvdXRlSW50TWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RSb3V0ZUludE1ldGhvZC5pbnZva2Uocm91dGVyLCB0eXBlcywgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBzdWNjZXNzIQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgcHJvZ3JhbW1hdGljYWxseSBzZWxlY3Qgbm9uLXVzZXIgcm91dGUuICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIk1lZGlhIHJvdXRpbmcgbWF5IG5vdCB3b3JrLiIsIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IHByb2dyYW1tYXRpY2FsbHkgc2VsZWN0IG5vbi11c2VyIHJvdXRlLiAgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJNZWRpYSByb3V0aW5nIG1heSBub3Qgd29yay4iLCBleCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgcHJvZ3JhbW1hdGljYWxseSBzZWxlY3Qgbm9uLXVzZXIgcm91dGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImJlY2F1c2UgdGhlIHBsYXRmb3JtIGlzIG1pc3NpbmcgdGhlIHNlbGVjdFJvdXRlSW50KCkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm1ldGhvZC4gIE1lZGlhIHJvdXRpbmcgbWF5IG5vdCB3b3JrLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRGVmYXVsdCBoYW5kbGluZy4KLSAgICAgICAgICAgIHJvdXRlci5zZWxlY3RSb3V0ZSh0eXBlcywgcm91dGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV29ya2Fyb3VuZCB0aGUgZmFjdCB0aGF0IHRoZSBnZXREZWZhdWx0Um91dGUoKSBtZXRob2QgZG9lcyBub3QgZXhpc3QgaW4gSkIgYW5kIEpCIE1SMS4KLSAgICAgKiBEbyBub3QgdXNlIG9uIEpCIE1SMiBhbmQgYWJvdmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBHZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kIHsKLSAgICAgICAgcHJpdmF0ZSBNZXRob2QgbUdldFN5c3RlbUF1ZGlvUm91dGVNZXRob2Q7Ci0KLSAgICAgICAgcHVibGljIEdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQoKSB7Ci0gICAgICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UIDwgMTYgfHwgQnVpbGQuVkVSU0lPTi5TREtfSU5UID4gMTcpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUdldFN5c3RlbUF1ZGlvUm91dGVNZXRob2QgPQotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5jbGFzcy5nZXRNZXRob2QoImdldFN5c3RlbUF1ZGlvUm91dGUiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXREZWZhdWx0Um91dGUoT2JqZWN0IHJvdXRlck9iaikgewotICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIgPSAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmo7Ci0KLSAgICAgICAgICAgIGlmIChtR2V0U3lzdGVtQXVkaW9Sb3V0ZU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1HZXRTeXN0ZW1BdWRpb1JvdXRlTWV0aG9kLmludm9rZShyb3V0ZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDb3VsZCBub3QgZmluZCB0aGUgbWV0aG9kIG9yIGl0IGRvZXMgbm90IHdvcmsuCi0gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGZpcnN0IHJvdXRlIGFuZCBob3BlIGZvciB0aGUgYmVzdC4KLSAgICAgICAgICAgIHJldHVybiByb3V0ZXIuZ2V0Um91dGVBdCgwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBDYWxsYmFja1Byb3h5PFQgZXh0ZW5kcyBDYWxsYmFjaz4KLSAgICAgICAgICAgIGV4dGVuZHMgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBUIG1DYWxsYmFjazsKLQotICAgICAgICBwdWJsaWMgQ2FsbGJhY2tQcm94eShUIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgaW50IHR5cGUsIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVNlbGVjdGVkKHR5cGUsIHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBpbnQgdHlwZSwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlVW5zZWxlY3RlZCh0eXBlLCByb3V0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZUFkZGVkKHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVSZW1vdmVkKHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVDaGFuZ2VkKHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlR3JvdXBlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXAgZ3JvdXAsIGludCBpbmRleCkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVHcm91cGVkKHJvdXRlLCBncm91cCwgaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbmdyb3VwZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUdyb3VwIGdyb3VwKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVVuZ3JvdXBlZChyb3V0ZSwgZ3JvdXApOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVZvbHVtZUNoYW5nZWQocm91dGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFZvbHVtZUNhbGxiYWNrUHJveHk8VCBleHRlbmRzIFZvbHVtZUNhbGxiYWNrPgotICAgICAgICAgICAgZXh0ZW5kcyBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlZvbHVtZUNhbGxiYWNrIHsKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFQgbUNhbGxiYWNrOwotCi0gICAgICAgIHB1YmxpYyBWb2x1bWVDYWxsYmFja1Byb3h5KFQgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU2V0UmVxdWVzdChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Wb2x1bWVTZXRSZXF1ZXN0KHJvdXRlLCB2b2x1bWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Wb2x1bWVVcGRhdGVSZXF1ZXN0KHJvdXRlLCBkaXJlY3Rpb24pOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhQ29udHJvbEludGVudC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhQ29udHJvbEludGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDllNzc3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUNvbnRyb2xJbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLQotLyoqCi0gKiBDb25zdGFudHMgZm9yIG1lZGlhIGNvbnRyb2wgaW50ZW50cy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBkZWNsYXJlcyBhIHNldCBvZiBzdGFuZGFyZCBtZWRpYSBjb250cm9sIGludGVudCBjYXRlZ29yaWVzIGFuZCBhY3Rpb25zIHRoYXQKLSAqIGFwcGxpY2F0aW9ucyBjYW4gdXNlIHRvIGlkZW50aWZ5IHRoZSBjYXBhYmlsaXRpZXMgb2YgbWVkaWEgcm91dGVzIGFuZCBjb250cm9sIHRoZW0uCi0gKiA8L3A+Ci0gKgotICogPGgzPk1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXM8L2gzPgotICogPHA+Ci0gKiBNZWRpYSBjb250cm9sIGludGVudCBjYXRlZ29yaWVzIHNwZWNpZnkgbWVhbnMgYnkgd2hpY2ggYXBwbGljYXRpb25zIGNhbgotICogc2VuZCBtZWRpYSB0byB0aGUgZGVzdGluYXRpb24gb2YgYSBtZWRpYSByb3V0ZS4gIENhdGVnb3JpZXMgYXJlIHNvbWV0aW1lcyByZWZlcnJlZAotICogdG8gYXMgZGVzY3JpYmluZyAidHlwZXMiIG9yICJraW5kcyIgb2Ygcm91dGVzLgotICogPC9wPjxwPgotICogRm9yIGV4YW1wbGUsIGlmIGEgcm91dGUgc3VwcG9ydHMgdGhlIHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFjayBjYXRlZ29yeX0sCi0gKiB0aGVuIGFuIGFwcGxpY2F0aW9uIGNhbiBhc2sgaXQgdG8gcGxheSBtZWRpYSByZW1vdGVseSBieSBzZW5kaW5nIGEKLSAqIHtAbGluayAjQUNUSU9OX1BMQVkgcGxheX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBpbnRlbnQgd2l0aCB0aGUgVXJpIG9mIHRoZQotICogbWVkaWEgY29udGVudCB0byBwbGF5LiAgU3VjaCBhIHJvdXRlIG1heSB0aGVuIGJlIHJlZmVycmVkIHRvIGFzCi0gKiBhICJyZW1vdGUgcGxheWJhY2sgcm91dGUiIGJlY2F1c2UgaXQgc3VwcG9ydHMgcmVtb3RlIHBsYXliYWNrIHJlcXVlc3RzLiAgSXQgaXMgY29tbW9uCi0gKiBmb3IgYSByb3V0ZSB0byBzdXBwb3J0IG11bHRpcGxlIGNhdGVnb3JpZXMgb2YgcmVxdWVzdHMgYXQgdGhlIHNhbWUgdGltZSwgc3VjaCBhcwotICogbGl2ZSBhdWRpbyBhbmQgbGl2ZSB2aWRlby4KLSAqIDwvcD48cD4KLSAqIFRoZSBmb2xsb3dpbmcgc3RhbmRhcmQgcm91dGUgY2F0ZWdvcmllcyBhcmUgZGVmaW5lZC4KLSAqIDwvcD48dWw+Ci0gKiA8bGk+e0BsaW5rICNDQVRFR09SWV9MSVZFX0FVRElPIExpdmUgYXVkaW99OiBUaGUgcm91dGUgc3VwcG9ydHMgc3RyZWFtaW5nIGxpdmUgYXVkaW8KLSAqIGZyb20gdGhlIGRldmljZSB0byB0aGUgZGVzdGluYXRpb24uICBMaXZlIGF1ZGlvIHJvdXRlcyBpbmNsdWRlIGxvY2FsIHNwZWFrZXJzCi0gKiBhbmQgQmx1ZXRvb3RoIGhlYWRzZXRzLgotICogPGxpPntAbGluayAjQ0FURUdPUllfTElWRV9WSURFTyBMaXZlIHZpZGVvfTogVGhlIHJvdXRlIHN1cHBvcnRzIHN0cmVhbWluZyBsaXZlIHZpZGVvCi0gKiBmcm9tIHRoZSBkZXZpY2UgdG8gdGhlIGRlc3RpbmF0aW9uLiAgTGl2ZSB2aWRlbyByb3V0ZXMgaW5jbHVkZSBsb2NhbCBkaXNwbGF5cwotICogYW5kIHdpcmVsZXNzIGRpc3BsYXlzIHRoYXQgc3VwcG9ydCBtaXJyb3JpbmcgYW5kCi0gKiB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbnN9LiAgTGl2ZSB2aWRlbyByb3V0ZXMgdHlwaWNhbGx5IGFsc28KLSAqIHN1cHBvcnQgbGl2ZSBhdWRpbyBjYXBhYmlsaXRpZXMuCi0gKiA8bGk+e0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgUmVtb3RlIHBsYXliYWNrfTogVGhlIHJvdXRlIHN1cHBvcnRzIHNlbmRpbmcKLSAqIHJlbW90ZSBwbGF5YmFjayByZXF1ZXN0cyBmb3IgbWVkaWEgY29udGVudCB0byB0aGUgZGVzdGluYXRpb24uICBUaGUgY29udGVudCB0byBiZQotICogcGxheWVkIGlzIGlkZW50aWZpZWQgYnkgYSBVcmkgYW5kIG1pbWUtdHlwZS4KLSAqIDwvdWw+PHA+Ci0gKiBNZWRpYSByb3V0ZSBwcm92aWRlcnMgbWF5IGRlZmluZSBjdXN0b20gbWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcmllcyBvZiB0aGVpciBvd24gaW4KLSAqIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBvbmVzLiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhIHZhcmlldHkKLSAqIG9mIGZlYXR1cmVzIHRvIGFwcGxpY2F0aW9ucyB0aGF0IHJlY29nbml6ZSBhbmQga25vdyBob3cgdG8gdXNlIHRoZW0uICBGb3IgZXhhbXBsZSwKLSAqIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgbWlnaHQgZGVmaW5lIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGluZGljYXRlIHRoYXQgaXRzIHJvdXRlcwotICogc3VwcG9ydCBhIHNwZWNpYWwgZGV2aWNlLXNwZWNpZmljIGNvbnRyb2wgaW50ZXJmYWNlIGluIGFkZGl0aW9uIHRvIG90aGVyCi0gKiBzdGFuZGFyZCBmZWF0dXJlcy4KLSAqIDwvcD48cD4KLSAqIEFwcGxpY2F0aW9ucyBjYW4gZGV0ZXJtaW5lIHdoaWNoIGNhdGVnb3JpZXMgYSByb3V0ZSBzdXBwb3J0cyBieSB1c2luZyB0aGUKLSAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5fQotICogb3Ige0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNnZXRDb250cm9sRmlsdGVycyBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uZ2V0Q29udHJvbEZpbHRlcnN9Ci0gKiBtZXRob2RzLiAgQXBwbGljYXRpb25zIGNhbiBhbHNvIHNwZWNpZnkgdGhlIHR5cGVzIG9mIHJvdXRlcyB0aGF0IHRoZXkgd2FudCB0byB1c2UgYnkKLSAqIGNyZWF0aW5nIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3IgbWVkaWEgcm91dGUgc2VsZWN0b3JzfSB0aGF0IGNvbnRhaW4gdGhlIGRlc2lyZWQKLSAqIGNhdGVnb3JpZXMgYW5kIGFyZSB1c2VkIHRvIGZpbHRlciByb3V0ZXMgaW4gc2V2ZXJhbCBwYXJ0cyBvZiB0aGUgbWVkaWEgcm91dGVyIEFQSS4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+TWVkaWEgY29udHJvbCBpbnRlbnQgYWN0aW9uczwvaDM+Ci0gKiA8cD4KLSAqIE1lZGlhIGNvbnRyb2wgaW50ZW50IGFjdGlvbnMgc3BlY2lmeSBwYXJ0aWN1bGFyIGZ1bmN0aW9ucyB0aGF0IGFwcGxpY2F0aW9ucwotICogY2FuIGFzayB0aGUgZGVzdGluYXRpb24gb2YgYSBtZWRpYSByb3V0ZSB0byBwZXJmb3JtLiAgTWVkaWEgcm91dGUgY29udHJvbCByZXF1ZXN0cwotICogdGFrZSB0aGUgZm9ybSBvZiBpbnRlbnRzIGluIGEgc2ltaWxhciBtYW5uZXIgdG8gb3RoZXIgaW50ZW50cyB1c2VkIHRvIHN0YXJ0IGFjdGl2aXRpZXMKLSAqIG9yIHNlbmQgYnJvYWRjYXN0cy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgbWVkaWEgY29udHJvbCBpbnRlbnRzIGFyZSBkaXJlY3RlZCB0bwotICogcm91dGVzIHJhdGhlciB0aGFuIGFjdGl2aXR5IG9yIGJyb2FkY2FzdCByZWNlaXZlciBjb21wb25lbnRzLgotICogPC9wPjxwPgotICogRWFjaCBtZWRpYSByb3V0ZSBjb250cm9sIGludGVudCBzcGVjaWZpZXMgYW4gYWN0aW9uLCBhIGNhdGVnb3J5IGFuZCBzb21lIG51bWJlciBvZiBwYXJhbWV0ZXJzCi0gKiB0aGF0IGFyZSBzdXBwbGllZCBhcyBleHRyYXMuICBBcHBsaWNhdGlvbnMgc2VuZCBtZWRpYSBjb250cm9sIHJlcXVlc3RzIHRvIHJvdXRlcyB1c2luZyB0aGUKLSAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0IE1lZGlhUm91dGVyLlJvdXRlSW5mby5zZW5kQ29udHJvbFJlcXVlc3R9Ci0gKiBtZXRob2QgYW5kIHJlY2VpdmUgcmVzdWx0cyB2aWEgYSBjYWxsYmFjay4KLSAqIDwvcD48cD4KLSAqIEFsbCBtZWRpYSBjb250cm9sIGludGVudCBhY3Rpb25zIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXMKLSAqIHRoYXQgc3VwcG9ydCB0aGVtLiAgVGh1cyBvbmx5IHJlbW90ZSBwbGF5YmFjayByb3V0ZXMgbWF5IHBlcmZvcm0gcmVtb3RlIHBsYXliYWNrIGFjdGlvbnMuCi0gKiBUaGUgZG9jdW1lbnRhdGlvbiBvZiBlYWNoIGFjdGlvbiBzcGVjaWZpZXMgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoZSBhY3Rpb24gYmVsb25ncywKLSAqIHRoZSBwYXJhbWV0ZXJzIGl0IHJlcXVpcmVzLCBhbmQgdGhlIHJlc3VsdHMgaXQgcmV0dXJucy4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+TGl2ZSBhdWRpbyBhbmQgbGl2ZSB2aWRlbyByb3V0ZXM8L2gzPgotICogPHA+Ci0gKiB7QGxpbmsgI0NBVEVHT1JZX0xJVkVfQVVESU8gTGl2ZSBhdWRpb30gYW5kIHtAbGluayAjQ0FURUdPUllfTElWRV9WSURFTyBsaXZlIHZpZGVvfQotICogcm91dGVzIHByZXNlbnQgbWVkaWEgdXNpbmcgc3RhbmRhcmQgc3lzdGVtIGludGVyZmFjZXMgc3VjaCBhcyBhdWRpbyBzdHJlYW1zLAotICoge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbiBwcmVzZW50YXRpb25zfSBvciBkaXNwbGF5IG1pcnJvcmluZy4gIFRoZXNlIHJvdXRlcyBhcmUKLSAqIHRoZSBlYXNpZXN0IHRvIHVzZSBiZWNhdXNlIGFwcGxpY2F0aW9ucyBzaW1wbHkgcmVuZGVyIGNvbnRlbnQgbG9jYWxseSBvbiB0aGUgZGV2aWNlCi0gKiBhbmQgdGhlIHN5c3RlbSBzdHJlYW1zIGl0IHRvIHRoZSByb3V0ZSBkZXN0aW5hdGlvbiBhdXRvbWF0aWNhbGx5LgotICogPC9wPjxwPgotICogSW4gbW9zdCBjYXNlcywgYXBwbGljYXRpb25zIGNhbiBzdHJlYW0gY29udGVudCB0byBsaXZlIGF1ZGlvIGFuZCBsaXZlIHZpZGVvIHJvdXRlcyBpbgotICogdGhlIHNhbWUgd2F5IHRoZXkgd291bGQgcGxheSB0aGUgY29udGVudCBsb2NhbGx5IHdpdGhvdXQgYW55IG1vZGlmaWNhdGlvbi4gIEhvd2V2ZXIsCi0gKiBhcHBsaWNhdGlvbnMgbWF5IGFsc28gYmUgYWJsZSB0byB0YWtlIGFkdmFudGFnZSBvZiBtb3JlIHNvcGhpc3RpY2F0ZWQgZmVhdHVyZXMgc3VjaAotICogYXMgc2Vjb25kLXNjcmVlbiBwcmVzZW50YXRpb24gQVBJcyB0aGF0IGFyZSBwYXJ0aWN1bGFyIHRvIHRoZXNlIHJvdXRlcy4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+UmVtb3RlIHBsYXliYWNrIHJvdXRlczwvaDM+Ci0gKiA8cD4KLSAqIHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIFJlbW90ZSBwbGF5YmFja30gcm91dGVzIHByZXNlbnQgbWVkaWEgcmVtb3RlbHkKLSAqIGJ5IHBsYXlpbmcgY29udGVudCBmcm9tIGEgVXJpLgotICogVGhlc2Ugcm91dGVzIGRlc3RpbmF0aW9ucyB0YWtlIHJlc3BvbnNpYmlsaXR5IGZvciBmZXRjaGluZyBhbmQgcmVuZGVyaW5nIGNvbnRlbnQKLSAqIG9uIHRoZWlyIG93bi4gIEFwcGxpY2F0aW9ucyBkbyBub3QgcmVuZGVyIHRoZSBjb250ZW50IHRoZW1zZWx2ZXM7IGluc3RlYWQsIGFwcGxpY2F0aW9ucwotICogc2VuZCBjb250cm9sIHJlcXVlc3RzIHRvIGluaXRpYXRlIHBsYXksIHBhdXNlLCByZXN1bWUsIG9yIHN0b3AgbWVkaWEgaXRlbXMgYW5kIHJlY2VpdmUKLSAqIHN0YXR1cyB1cGRhdGVzIGFzIHRoZXkgY2hhbmdlIHN0YXRlLgotICogPC9wPgotICoKLSAqIDxoND5TZXNzaW9uczwvaDQ+Ci0gKiA8cD4KLSAqIEVhY2ggcmVtb3RlIG1lZGlhIHBsYXliYWNrIGFjdGlvbiBpcyBjb25kdWN0ZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhIHNlc3Npb24uCi0gKiBTZXNzaW9ucyBhcmUgdXNlZCB0byBwcmV2ZW50IGFwcGxpY2F0aW9ucyBmcm9tIGFjY2lkZW50YWxseSBpbnRlcmZlcmluZyB3aXRoIG9uZQotICogYW5vdGhlciBiZWNhdXNlIGF0IG1vc3Qgb25lIHNlc3Npb24gY2FuIGJlIHZhbGlkIGF0IGEgdGltZS4KLSAqIDwvcD48cD4KLSAqIEEgc2Vzc2lvbiBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGUge0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTiBzdGFydCBzZXNzaW9uIGFjdGlvbn0KLSAqIGFuZCB0ZXJtaW5hdGVkIHVzaW5nIHRoZSB7QGxpbmsgI0FDVElPTl9FTkRfU0VTU0lPTiBlbmQgc2Vzc2lvbiBhY3Rpb259IHdoZW4gdGhlCi0gKiByb3V0ZSBwcm92aWRlcyBleHBsaWNpdCBzZXNzaW9uIG1hbmFnZW1lbnQgZmVhdHVyZXMuCi0gKiA8L3A+PHA+Ci0gKiBFeHBsaWNpdCBzZXNzaW9uIG1hbmFnZW1lbnQgd2FzIGFkZGVkIGluIGEgbGF0ZXIgcmV2aXNpb24gb2YgdGhlIHByb3RvY29sIHNvIG5vdAotICogYWxsIHJvdXRlcyBzdXBwb3J0IGl0LiAgSWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgZXhwbGljaXQgc2Vzc2lvbiBtYW5hZ2VtZW50Ci0gKiB0aGVuIGltcGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudCBtYXkgc3RpbGwgYmUgdXNlZC4gIEltcGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudAotICogcmVsaWVzIG9uIHRoZSB1c2Ugb2YgdGhlIHtAbGluayAjQUNUSU9OX1BMQVkgcGxheX0gYW5kIHtAbGluayAjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0KLSAqIGFjdGlvbnMgd2hpY2ggaGF2ZSB0aGUgc2lkZS1lZmZlY3Qgb2YgY3JlYXRpbmcgYSBuZXcgc2Vzc2lvbiBpZiBub25lIGlzIHByb3ZpZGVkCi0gKiBhcyBhcmd1bWVudC4KLSAqIDwvcD48cD4KLSAqIFdoZW4gYSBuZXcgc2Vzc2lvbiBpcyBjcmVhdGVkLCB0aGUgcHJldmlvdXMgc2Vzc2lvbiBpcyBpbnZhbGlkYXRlZCBhbmQgYW55IG9uZ29pbmcKLSAqIG1lZGlhIHBsYXliYWNrIGlzIHN0b3BwZWQgYmVmb3JlIHRoZSByZXF1ZXN0ZWQgYWN0aW9uIGlzIHBlcmZvcm1lZC4gIEFueSBhdHRlbXB0Ci0gKiB0byB1c2UgYW4gaW52YWxpZGF0ZWQgc2Vzc2lvbiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIChQcm90b2NvbCBpbXBsZW1lbnRhdGlvbnMKLSAqIGFyZSBlbmNvdXJhZ2VkIHRvIGFnZ3Jlc3NpdmVseSBkaXNjYXJkIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBpbnZhbGlkYXRlZCBzZXNzaW9ucwotICogc2luY2UgaXQgaXMgbm8gbG9uZ2VyIG9mIHVzZS4pCi0gKiA8L3A+PHA+Ci0gKiBFYWNoIHNlc3Npb24gaXMgaWRlbnRpZmllZCBieSBhIHVuaXF1ZSBzZXNzaW9uIGlkIHRoYXQgbWF5IGJlIHVzZWQgdG8gY29udHJvbAotICogdGhlIHNlc3Npb24gdXNpbmcgYWN0aW9ucyBzdWNoIGFzIHBhdXNlLCByZXN1bWUsIHN0b3AgYW5kIGVuZCBzZXNzaW9uLgotICogPC9wPgotICoKLSAqIDxoND5NZWRpYSBpdGVtczwvaDQ+Ci0gKiA8cD4KLSAqIEVhY2ggc3VjY2Vzc2Z1bCB7QGxpbmsgI0FDVElPTl9QTEFZIHBsYXl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uCi0gKiByZXR1cm5zIGEgdW5pcXVlIG1lZGlhIGl0ZW0gaWQgdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gdXNlIHRvIG1vbml0b3IgYW5kIGNvbnRyb2wKLSAqIHBsYXliYWNrLiAgVGhlIG1lZGlhIGl0ZW0gaWQgbWF5IGJlIHBhc3NlZCB0byBvdGhlciBhY3Rpb25zIHN1Y2ggYXMKLSAqIHtAbGluayAjQUNUSU9OX1NFRUsgc2Vla30gb3Ige0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVUyBnZXQgc3RhdHVzfS4gIEl0IHdpbGwgYWxzbyBhcHBlYXIKLSAqIGFzIGEgcGFyYW1ldGVyIGluIHN0YXR1cyB1cGRhdGUgYnJvYWRjYXN0cyB0byBpZGVudGlmeSB0aGUgYXNzb2NpYXRlZCBwbGF5YmFjayByZXF1ZXN0LgotICogPC9wPjxwPgotICogRWFjaCBtZWRpYSBpdGVtIGlzIHNjb3BlZCB0byB0aGUgc2Vzc2lvbiBpbiB3aGljaCBpdCB3YXMgY3JlYXRlZC4gIFRoZXJlZm9yZSBtZWRpYSBpdGVtCi0gKiBpZHMgYXJlIG9ubHkgZXZlciB1c2VkIHRvZ2V0aGVyIHdpdGggc2Vzc2lvbiBpZHMuICBNZWRpYSBpdGVtIGlkcyBhcmUgbWVhbmluZ2xlc3MKLSAqIG9uIHRoZWlyIG93bi4gIFdoZW4gdGhlIHNlc3Npb24gaXMgaW52YWxpZGF0ZWQsIGFsbCBvZiBpdHMgbWVkaWEgaXRlbXMgYXJlIGFsc28KLSAqIGludmFsaWRhdGVkLgotICogPC9wPgotICoKLSAqIDxoND5UaGUgcGxheWJhY2sgcXVldWU8L2g0PgotICogPHA+Ci0gKiBFYWNoIHNlc3Npb24gaGFzIGl0cyBvd24gcGxheWJhY2sgcXVldWUgdGhhdCBjb25zaXN0cyBvZiB0aGUgbWVkaWEgaXRlbXMgdGhhdAotICogYXJlIHBlbmRpbmcsIHBsYXlpbmcsIGJ1ZmZlcmluZyBvciBwYXVzZWQuICBJdGVtcyBhcmUgYWRkZWQgdG8gdGhlIHF1ZXVlIHdoZW4KLSAqIGEgcGxheWJhY2sgcmVxdWVzdCBpcyBpc3N1ZWQuICBJdGVtcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSB3aGVuIHRoZXkgYXJlIG5vCi0gKiBsb25nZXIgZWxpZ2libGUgZm9yIHBsYXliYWNrIChlbnRlciB0ZXJtaW5hbCBzdGF0ZXMpLgotICogPC9wPjxwPgotICogQXMgZGVzY3JpYmVkIGluIHRoZSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzfSBjbGFzcywgbWVkaWEgaXRlbXMgaW5pdGlhbGx5Ci0gKiBzdGFydCBpbiBhIHBlbmRpbmcgc3RhdGUsIHRyYW5zaXRpb24gdG8gdGhlIHBsYXlpbmcgKG9yIGJ1ZmZlcmluZyBvciBwYXVzZWQpIHN0YXRlCi0gKiBkdXJpbmcgcGxheWJhY2ssIGFuZCBlbmQgaW4gYSBmaW5pc2hlZCwgY2FuY2VsZWQsIGludmFsaWRhdGVkIG9yIGVycm9yIHN0YXRlLgotICogT25jZSB0aGUgY3VycmVudCBpdGVtIGVudGVycyBhIHRlcm1pbmFsIHN0YXRlLCBwbGF5YmFjayBwcm9jZWVkcyBvbiB0byB0aGUKLSAqIG5leHQgaXRlbS4KLSAqIDwvcD48cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHJvdXRlIHN1cHBvcnRzIHF1ZXVpbmcgYnkgY2hlY2tpbmcKLSAqIHdoZXRoZXIgdGhlIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IGFjdGlvbiBpcyBkZWNsYXJlZCBpbiB0aGUgcm91dGUncyBjb250cm9sIGZpbHRlcgotICogdXNpbmcge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzdXBwb3J0c0NvbnRyb2xSZXF1ZXN0IFJvdXRlSW5mby5zdXBwb3J0c0NvbnRyb2xSZXF1ZXN0fS4KLSAqIDwvcD48cD4KLSAqIElmIHRoZSB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSBhY3Rpb24gaXMgc3VwcG9ydGVkIGJ5IHRoZSByb3V0ZSwgdGhlbiB0aGUgcm91dGUgcHJvbWlzZXMKLSAqIHRvIGFsbG93IGF0IGxlYXN0IHR3byBpdGVtcyAocG9zc2libHkgbW9yZSkgdG8gYmUgZW5xdWV1ZWQgYXQgYSB0aW1lLiAgRW5xdWV1ZWQgaXRlbXMgcGxheQotICogYmFjayB0byBiYWNrIG9uZSBhZnRlciB0aGUgb3RoZXIgYXMgdGhlIHByZXZpb3VzIGl0ZW0gY29tcGxldGVzLiAgSWRlYWxseSB0aGVyZSBzaG91bGQKLSAqIGJlIG5vIGF1ZGlibGUgcGF1c2UgYmV0d2VlbiBpdGVtcyBmb3Igc3RhbmRhcmQgYXVkaW8gY29udGVudCB0eXBlcy4KLSAqIDwvcD48cD4KLSAqIElmIHRoZSB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSBhY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgcm91dGUsIHRoZW4gdGhlIHF1ZXVlCi0gKiBlZmZlY3RpdmVseSBjb250YWlucyBhdCBtb3N0IG9uZSBpdGVtIGF0IGEgdGltZS4gIEVhY2ggcGxheSBhY3Rpb24gaGFzIHRoZSBlZmZlY3Qgb2YKLSAqIGNsZWFyaW5nIHRoZSBxdWV1ZSBhbmQgcmVzZXR0aW5nIGl0cyBzdGF0ZSBiZWZvcmUgdGhlIG5leHQgaXRlbSBpcyBwbGF5ZWQuCi0gKiA8L3A+Ci0gKgotICogPGg0PkltcGFjdCBvZiBwYXVzZSwgcmVzdW1lLCBzdG9wIGFuZCBwbGF5IGFjdGlvbnMgb24gdGhlIHBsYXliYWNrIHF1ZXVlPC9oND4KLSAqIDxwPgotICogVGhlIHBhdXNlLCByZXN1bWUgYW5kIHN0b3AgYWN0aW9ucyBhZmZlY3QgdGhlIHNlc3Npb24ncyB3aG9sZSBxdWV1ZS4gIFBhdXNlIGNhdXNlcwotICogdGhlIHBsYXliYWNrIHF1ZXVlIHRvIGJlIHN1c3BlbmRlZCBubyBtYXR0ZXIgd2hpY2ggaXRlbSBpcyBjdXJyZW50bHkgcGxheWluZy4KLSAqIFJlc3VtZSByZXZlcnNlcyB0aGUgZWZmZWN0cyBvZiBwYXVzZS4gIFN0b3AgY2xlYXJzIHRoZSBxdWV1ZSBhbmQgYWxzbyByZXNldHMKLSAqIHRoZSBwYXVzZSBmbGFnIGp1c3QgbGlrZSByZXN1bWUuCi0gKiA8L3A+PHA+Ci0gKiBBcyBkZXNjcmliZWQgZWFybGllciwgdGhlIHBsYXkgYWN0aW9uIGhhcyB0aGUgZWZmZWN0IG9mIGNsZWFyaW5nIHRoZSBxdWV1ZQotICogYW5kIGNvbXBsZXRlbHkgcmVzZXR0aW5nIGl0cyBzdGF0ZSAobGlrZSB0aGUgc3RvcCBhY3Rpb24pIHRoZW4gZW5xdWV1aW5nIGEKLSAqIG5ldyBtZWRpYSBpdGVtIHRvIGJlIHBsYXllZCBpbW1lZGlhdGVseS4gIFBsYXkgaXMgdGhlcmVmb3JlIGVxdWl2YWxlbnQKLSAqIHRvIHN0b3AgZm9sbG93ZWQgYnkgYW4gYWN0aW9uIHRvIGVucXVldWUgYW4gaXRlbS4KLSAqIDwvcD48cD4KLSAqIFRoZSBwbGF5IGFjdGlvbiBpcyBhbHNvIHNwZWNpYWwgaW4gdGhhdCBpdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgbmV3IHNlc3Npb25zLgotICogQW4gYXBwbGljYXRpb24gd2l0aCBzaW1wbGUgbmVlZHMgbWF5IGZpbmQgdGhhdCBpdCBvbmx5IG5lZWRzIHRvIHVzZSBwbGF5Ci0gKiAoYW5kIG9jY2FzaW9uYWxseSBzdG9wKSB0byBjb250cm9sIHBsYXliYWNrLgotICogPC9wPgotICoKLSAqIDxoND5SZXNvbHZpbmcgY29uZmxpY3RzIGJldHdlZW4gYXBwbGljYXRpb25zPC9oND4KLSAqIDxwPgotICogV2hlbiBhbiBhcHBsaWNhdGlvbiBoYXMgYSB2YWxpZCBzZXNzaW9uLCBpdCBpcyBlc3NlbnRpYWxseSBpbiBjb250cm9sIG9mIHJlbW90ZSBwbGF5YmFjawotICogb24gdGhlIHJvdXRlLiAgTm8gb3RoZXIgYXBwbGljYXRpb24gY2FuIHZpZXcgb3IgbW9kaWZ5IHRoZSByZW1vdGUgcGxheWJhY2sgc3RhdGUKLSAqIG9mIHRoYXQgYXBwbGljYXRpb24ncyBzZXNzaW9uIHdpdGhvdXQga25vd2luZyBpdHMgaWQuCi0gKiA8L3A+PHA+Ci0gKiBIb3dldmVyLCBvdGhlciBhcHBsaWNhdGlvbnMgY2FuIHBlcmZvcm0gYWN0aW9ucyB0aGF0IGhhdmUgdGhlIGVmZmVjdCBvZiBzdG9wcGluZwotICogcGxheWJhY2sgYW5kIGludmFsaWRhdGluZyB0aGUgY3VycmVudCBzZXNzaW9uLiAgV2hlbiB0aGlzIG9jY3VycywgdGhlIGZvcm1lciBhcHBsaWNhdGlvbgotICogd2lsbCBiZSBpbmZvcm1lZCB0aGF0IGl0IGhhcyBsb3N0IGNvbnRyb2wgYnkgd2F5IG9mIGluZGl2aWR1YWwgbWVkaWEgaXRlbSBzdGF0dXMKLSAqIHVwZGF0ZSBicm9hZGNhc3RzIHRoYXQgaW5kaWNhdGUgdGhhdCBpdHMgcXVldWVkIG1lZGlhIGl0ZW1zIGhhdmUgYmVjb21lCi0gKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI1BMQVlCQUNLX1NUQVRFX0lOVkFMSURBVEVEIGludmFsaWRhdGVkfS4gIFRoaXMgYnJvYWRjYXN0Ci0gKiBpbXBsaWVzIHRoYXQgcGxheWJhY2sgd2FzIHRlcm1pbmF0ZWQgYWJub3JtYWxseSBieSBhbiBleHRlcm5hbCBjYXVzZS4KLSAqIDwvcD48cD4KLSAqIEFwcGxpY2F0aW9ucyBzaG91bGQgaGFuZGxlIGNvbmZsaWN0cyBjb25zZXJ2YXRpdmVseSB0byBhbGxvdyBvdGhlciBhcHBsaWNhdGlvbnMgdG8KLSAqIHNtb290aGx5IGFzc3VtZSBjb250cm9sIG92ZXIgdGhlIHJvdXRlLiAgV2hlbiBhIGNvbmZsaWN0IG9jY3VycywgdGhlIGN1cnJlbnRseSBwbGF5aW5nCi0gKiBhcHBsaWNhdGlvbiBzaG91bGQgcmVsZWFzZSBpdHMgc2Vzc2lvbiBhbmQgYWxsb3cgdGhlIG5ldyBhcHBsaWNhdGlvbiB0byB1c2UgdGhlCi0gKiByb3V0ZSB1bnRpbCBzdWNoIHRpbWUgYXMgdGhlIHVzZXIgaW50ZXJ2ZW5lcyB0byB0YWtlIG92ZXIgdGhlIHJvdXRlIGFnYWluIGFuZCBiZWdpbgotICogYSBuZXcgcGxheWJhY2sgc2Vzc2lvbi4KLSAqIDwvcD4KLSAqCi0gKiA8aDQ+QmFzaWMgYWN0aW9uczwvaDQ+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgYmFzaWMgYWN0aW9ucyBtdXN0IGJlIHN1cHBvcnRlZCAoYWxsIG9yIG5vdGhpbmcpIGJ5IGFsbCByZW1vdGUKLSAqIHBsYXliYWNrIHJvdXRlcy4gIFRoZXNlIGFjdGlvbnMgZm9ybSB0aGUgYmFzaXMgb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBwcm90b2NvbAotICogYW5kIGFyZSByZXF1aXJlZCBpbiBhbGwgaW1wbGVtZW50YXRpb25zLgotICogPC9wPjx1bD4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9QTEFZIFBsYXl9OiBTdGFydHMgcGxheWluZyBjb250ZW50IHNwZWNpZmllZCBieSBhIGdpdmVuIFVyaQotICogYW5kIHJldHVybnMgYSBuZXcgbWVkaWEgaXRlbSBpZCB0byBkZXNjcmliZSB0aGUgcmVxdWVzdC4gIEltcGxpY2l0bHkgY3JlYXRlcyBhIG5ldwotICogc2Vzc2lvbiBpZiBubyBzZXNzaW9uIGlkIHdhcyBzcGVjaWZpZWQgYXMgYSBwYXJhbWV0ZXIuCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fU0VFSyBTZWVrfTogU2V0cyB0aGUgY29udGVudCBwbGF5YmFjayBwb3NpdGlvbiBvZiBhIHNwZWNpZmljIG1lZGlhIGl0ZW0uCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVUyBHZXQgc3RhdHVzfTogR2V0cyB0aGUgc3RhdHVzIG9mIGEgbWVkaWEgaXRlbQotICogaW5jbHVkaW5nIHRoZSBpdGVtJ3MgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiBhbmQgcHJvZ3Jlc3MuCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fUEFVU0UgUGF1c2V9OiBQYXVzZXMgcGxheWJhY2sgb2YgdGhlIHF1ZXVlLgotICogPGxpPntAbGluayAjQUNUSU9OX1JFU1VNRSBSZXN1bWV9OiBSZXN1bWVzIHBsYXliYWNrIG9mIHRoZSBxdWV1ZS4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9TVE9QIFN0b3B9OiBTdG9wcyBwbGF5YmFjaywgY2xlYXJzIHRoZSBxdWV1ZSwgYW5kIHJlc2V0cyB0aGUKLSAqIHBhdXNlIHN0YXRlLgotICogPC91bD4KLSAqCi0gKiA8aDQ+UXVldWUgYWN0aW9uczwvaDQ+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgcXVldWUgYWN0aW9ucyBtdXN0IGJlIHN1cHBvcnRlZCAoYWxsIG9yIG5vdGhpbmcpIGJ5IHJlbW90ZQotICogcGxheWJhY2sgcm91dGVzIHRoYXQgb2ZmZXIgb3B0aW9uYWwgcXVldWluZyBjYXBhYmlsaXRpZXMuCi0gKiA8L3A+PHVsPgotICogPGxpPntAbGluayAjQUNUSU9OX0VOUVVFVUUgRW5xdWV1ZX06IEVucXVldWVzIGNvbnRlbnQgc3BlY2lmaWVkIGJ5IGEgZ2l2ZW4gVXJpCi0gKiBhbmQgcmV0dXJucyBhIG5ldyBtZWRpYSBpdGVtIGlkIHRvIGRlc2NyaWJlIHRoZSByZXF1ZXN0LiAgSW1wbGljaXRseSBjcmVhdGVzIGEgbmV3Ci0gKiBzZXNzaW9uIGlmIG5vIHNlc3Npb24gaWQgd2FzIHNwZWNpZmllZCBhcyBhIHBhcmFtZXRlci4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9SRU1PVkUgUmVtb3ZlfTogUmVtb3ZlcyBhIHNwZWNpZmllZCBtZWRpYSBpdGVtIGZyb20gdGhlIHF1ZXVlLgotICogPC91bD4KLSAqCi0gKiA8aDQ+U2Vzc2lvbiBhY3Rpb25zPC9oND4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBzZXNzaW9uIGFjdGlvbnMgbXVzdCBiZSBzdXBwb3J0ZWQgKGFsbCBvciBub3RoaW5nKSBieSByZW1vdGUKLSAqIHBsYXliYWNrIHJvdXRlcyB0aGF0IG9mZmVyIG9wdGlvbmFsIHNlc3Npb24gbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMuCi0gKiA8L3A+PHVsPgotICogPGxpPntAbGluayAjQUNUSU9OX1NUQVJUX1NFU1NJT04gU3RhcnQgc2Vzc2lvbn06IFN0YXJ0cyBhIG5ldyBzZXNzaW9uIGV4cGxpY2l0bHkuCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTIEdldCBzZXNzaW9uIHN0YXR1c306IEdldHMgdGhlIHN0YXR1cyBvZiBhIHNlc3Npb24uCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fRU5EX1NFU1NJT04gRW5kIHNlc3Npb259OiBFbmRzIGEgc2Vzc2lvbiBleHBsaWNpdGx5LgotICogPC91bD4KLSAqCi0gKiA8aDQ+SW1wbGVtZW50YXRpb24gbm90ZTwvaDQ+Ci0gKiA8cD4KLSAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sIG11c3QgaW1wbGVtZW50IDxlbT5hbGw8L2VtPiBvZiB0aGUKLSAqIGRvY3VtZW50ZWQgYWN0aW9ucywgcGFyYW1ldGVycyBhbmQgcmVzdWx0cy4gIE5vdGUgdGhhdCB0aGUgZG9jdW1lbnRhdGlvbiBpcyB3cml0dGVuIGZyb20KLSAqIHRoZSBwZXJzcGVjdGl2ZSBvZiBhIGNsaWVudCBvZiB0aGUgcHJvdG9jb2wuICBJbiBwYXJ0aWN1bGFyLCB3aGVuZXZlciBhIHBhcmFtZXRlcgotICogaXMgZGVzY3JpYmVkIGFzIGJlaW5nICJvcHRpb25hbCIsIGl0IGlzIG9ubHkgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGNsaWVudC4KLSAqIENvbXBsaWFudCBtZWRpYSByb3V0ZSBwcm92aWRlciBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBwcm90b2NvbCBtdXN0IHN1cHBvcnQgYWxsCi0gKiBvZiB0aGUgZmVhdHVyZXMgZGVzY3JpYmVkIGhlcmVpbi4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhQ29udHJvbEludGVudCB7Ci0gICAgLyogUm91dGUgY2F0ZWdvcmllcy4gKi8KLQotICAgIC8qKgotICAgICAqIE1lZGlhIGNvbnRyb2wgY2F0ZWdvcnk6IExpdmUgYXVkaW8uCi0gICAgICogPHA+Ci0gICAgICogQSByb3V0ZSB0aGF0IHN1cHBvcnRzIGxpdmUgYXVkaW8gcm91dGluZyB3aWxsIGFsbG93IHRoZSBtZWRpYSBhdWRpbyBzdHJlYW0KLSAgICAgKiB0byBiZSBzZW50IHRvIHN1cHBvcnRlZCBkZXN0aW5hdGlvbnMuICBUaGlzIGNhbiBpbmNsdWRlIGludGVybmFsIHNwZWFrZXJzIG9yCi0gICAgICogYXVkaW8gamFja3Mgb24gdGhlIGRldmljZSBpdHNlbGYsIEEyRFAgZGV2aWNlcywgYW5kIG1vcmUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW4gYSBsaXZlIGF1ZGlvIHJvdXRlIGlzIHNlbGVjdGVkLCBhdWRpbyByb3V0aW5nIGlzIHRyYW5zcGFyZW50IHRvIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgKiBBbGwgYXVkaW8gcGxheWVkIG9uIHRoZSBtZWRpYSBzdHJlYW0gd2lsbCBiZSByb3V0ZWQgdG8gdGhlIHNlbGVjdGVkIGRlc3RpbmF0aW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB0aGUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBhYm91dCBsaXZlIGF1ZGlvIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfTElWRV9BVURJTyA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5jYXRlZ29yeS5MSVZFX0FVRElPIjsKLQotICAgIC8qKgotICAgICAqIE1lZGlhIGNvbnRyb2wgY2F0ZWdvcnk6IExpdmUgdmlkZW8uCi0gICAgICogPHA+Ci0gICAgICogQSByb3V0ZSB0aGF0IHN1cHBvcnRzIGxpdmUgdmlkZW8gcm91dGluZyB3aWxsIGFsbG93IGEgbWlycm9yZWQgdmVyc2lvbgotICAgICAqIG9mIHRoZSBkZXZpY2UncyBwcmltYXJ5IGRpc3BsYXkgb3IgYSBjdXN0b21pemVkCi0gICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbiBQcmVzZW50YXRpb259IHRvIGJlIHNlbnQgdG8gc3VwcG9ydGVkCi0gICAgICogZGVzdGluYXRpb25zLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBXaGVuIGEgbGl2ZSB2aWRlbyByb3V0ZSBpcyBzZWxlY3RlZCwgYXVkaW8gYW5kIHZpZGVvIHJvdXRpbmcgaXMgdHJhbnNwYXJlbnQKLSAgICAgKiB0byB0aGUgYXBwbGljYXRpb24uICBCeSBkZWZhdWx0LCBhdWRpbyBhbmQgdmlkZW8gaXMgcm91dGVkIHRvIHRoZSBzZWxlY3RlZAotICAgICAqIGRlc3RpbmF0aW9uLiAgRm9yIGNlcnRhaW4gbGl2ZSB2aWRlbyByb3V0ZXMsIHRoZSBhcHBsaWNhdGlvbiBtYXkgYWxzbyB1c2UgYQotICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb24gUHJlc2VudGF0aW9ufSB0byByZXBsYWNlIHRoZSBtaXJyb3JlZCB2aWV3Ci0gICAgICogb24gdGhlIGV4dGVybmFsIGRpc3BsYXkgd2l0aCBkaWZmZXJlbnQgY29udGVudC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUmVmZXIgdG8gdGhlIGNsYXNzIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgYWJvdXQgbGl2ZSB2aWRlbyByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpCi0gICAgICogQHNlZSBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9MSVZFX1ZJREVPID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmNhdGVnb3J5LkxJVkVfVklERU8iOwotCi0gICAgLyoqCi0gICAgICogTWVkaWEgY29udHJvbCBjYXRlZ29yeTogUmVtb3RlIHBsYXliYWNrLgotICAgICAqIDxwPgotICAgICAqIEEgcm91dGUgdGhhdCBzdXBwb3J0cyByZW1vdGUgcGxheWJhY2sgcm91dGluZyB3aWxsIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIHNlbmQKLSAgICAgKiByZXF1ZXN0cyB0byBwbGF5IGNvbnRlbnQgcmVtb3RlbHkgdG8gc3VwcG9ydGVkIGRlc3RpbmF0aW9ucy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUmVtb3RlIHBsYXliYWNrIHJvdXRlcyBkZXN0aW5hdGlvbnMgb3BlcmF0ZSBpbmRlcGVuZGVudGx5IG9mIHRoZSBsb2NhbCBkZXZpY2UuCi0gICAgICogV2hlbiBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSBpcyBzZWxlY3RlZCwgdGhlIGFwcGxpY2F0aW9uIGNhbiBjb250cm9sIHRoZSBjb250ZW50Ci0gICAgICogcGxheWluZyBvbiB0aGUgZGVzdGluYXRpb24gYnkgc2VuZGluZyBtZWRpYSBjb250cm9sIGFjdGlvbnMgdG8gdGhlIHJvdXRlLgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBtYXkgYWxzbyByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIGZyb20gdGhlIHJvdXRlIHJlZ2FyZGluZwotICAgICAqIHJlbW90ZSBwbGF5YmFjay4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUmVmZXIgdG8gdGhlIGNsYXNzIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgYWJvdXQgcmVtb3RlIHBsYXliYWNrIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmNhdGVnb3J5LlJFTU9URV9QTEFZQkFDSyI7Ci0KLSAgICAvKiBSZW1vdGUgcGxheWJhY2sgYWN0aW9ucyB0aGF0IGFmZmVjdCBpbmRpdmlkdWFsIGl0ZW1zLiAqLwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBQbGF5IG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBzdGFydCBwbGF5aW5nIGNvbnRlbnQgd2l0aAotICAgICAqIHRoZSB7QGxpbmsgVXJpfSBzcGVjaWZpZWQgaW4gdGhlIHtAbGluayBJbnRlbnR9J3Mge0BsaW5rIEludGVudCNnZXREYXRhKCkgZGF0YSB1cml9LgotICAgICAqIFRoZSBhY3Rpb24gcmV0dXJucyBhIG1lZGlhIHNlc3Npb24gaWQgYW5kIG1lZGlhIGl0ZW0gaWQgd2hpY2ggY2FuIGJlIHVzZWQKLSAgICAgKiB0byBjb250cm9sIHBsYXliYWNrIHVzaW5nIG90aGVyIHJlbW90ZSBwbGF5YmFjayBhY3Rpb25zLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBPbmNlIGluaXRpYXRlZCwgcGxheWJhY2sgb2YgdGhlIHNwZWNpZmllZCBjb250ZW50IHdpbGwgYmUgbWFuYWdlZCBpbmRlcGVuZGVudGx5Ci0gICAgICogYnkgdGhlIGRlc3RpbmF0aW9uLiAgVGhlIGFwcGxpY2F0aW9uIHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcyBhcyB0aGUgc3RhdGUKLSAgICAgKiBvZiB0aGUgbWVkaWEgaXRlbSBjaGFuZ2VzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiB0aGUgZGF0YSB1cmkgc3BlY2lmaWVzIGFuIEhUVFAgb3IgSFRUUFMgc2NoZW1lLCB0aGVuIHRoZSBkZXN0aW5hdGlvbiBpcwotICAgICAqIHJlc3BvbnNpYmxlIGZvciBmb2xsb3dpbmcgSFRUUCByZWRpcmVjdHMgdG8gYSByZWFzb25hYmxlIGRlcHRoIG9mIGF0IGxlYXN0IDMKLSAgICAgKiBsZXZlbHMgYXMgbWlnaHQgdHlwaWNhbGx5IGJlIGhhbmRsZWQgYnkgYSB3ZWIgYnJvd3Nlci4gIElmIGFuIEhUVFAgZXJyb3IKLSAgICAgKiBvY2N1cnMsIHRoZW4gdGhlIGRlc3RpbmF0aW9uIHNob3VsZCBzZW5kIGEge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyBzdGF0dXMgdXBkYXRlfQotICAgICAqIGJhY2sgdG8gdGhlIGNsaWVudCBpbmRpY2F0aW5nIHRoZSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI1BMQVlCQUNLX1NUQVRFX0VSUk9SIGVycm9yfQotICAgICAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjZ2V0UGxheWJhY2tTdGF0ZSgpIHBsYXliYWNrIHN0YXRlfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+T25lIGl0ZW0gYXQgYSB0aW1lPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBFYWNoIHN1Y2Nlc3NmdWwgcGxheSBhY3Rpb24gPGVtPnJlcGxhY2VzPC9lbT4gdGhlIHByZXZpb3VzIHBsYXkgYWN0aW9uLgotICAgICAqIElmIGFuIGl0ZW0gaXMgYWxyZWFkeSBwbGF5aW5nLCB0aGVuIGl0IGlzIGNhbmNlbGVkLCB0aGUgc2Vzc2lvbidzIHBsYXliYWNrIHF1ZXVlCi0gICAgICogaXMgY2xlYXJlZCBhbmQgdGhlIG5ldyBpdGVtIGJlZ2lucyBwbGF5aW5nIGltbWVkaWF0ZWx5IChyZWdhcmRsZXNzIG9mCi0gICAgICogd2hldGhlciB0aGUgcHJldmlvdXNseSBwbGF5aW5nIGl0ZW0gaGFkIGJlZW4gcGF1c2VkKS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxheSBpcyB0aGVyZWZvcmUgZXF1aXZhbGVudCB0byB7QGxpbmsgI0FDVElPTl9TVE9QIHN0b3B9IGZvbGxvd2VkIGJ5IGFuIGFjdGlvbgotICAgICAqIHRvIGVucXVldWUgYSBuZXcgbWVkaWEgaXRlbSB0byBiZSBwbGF5ZWQgaW1tZWRpYXRlbHkuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlNlc3Npb25zPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHJlcXVlc3QgaGFzIHRoZSBlZmZlY3Qgb2YgaW1wbGljaXRseSBjcmVhdGluZyBhIG1lZGlhIHNlc3Npb24gd2hlbmV2ZXIgdGhlCi0gICAgICogYXBwbGljYXRpb24gZG9lcyBub3Qgc3BlY2lmeSB0aGUge0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEIHNlc3Npb24gaWR9IHBhcmFtZXRlci4KLSAgICAgKiBCZWNhdXNlIHRoZXJlIGNhbiBvbmx5IGJlIGF0IG1vc3Qgb25lIHZhbGlkIHNlc3Npb24gYXQgYSB0aW1lLCBjcmVhdGluZyBhIG5ldyBzZXNzaW9uCi0gICAgICogaGFzIHRoZSBzaWRlLWVmZmVjdCBvZiBpbnZhbGlkYXRpbmcgYW55IGV4aXN0aW5nIHNlc3Npb25zIGFuZCB0aGVpciBtZWRpYSBpdGVtcywKLSAgICAgKiB0aGVuIGhhbmRsaW5nIHRoZSBwbGF5YmFjayByZXF1ZXN0IHdpdGggYSBuZXcgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmllcyBhbiBpbnZhbGlkIHNlc3Npb24gaWQsIHRoZW4gYW4gZXJyb3IgaXMgcmV0dXJuZWQuCi0gICAgICogV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgYXNzdW1lIHRoYXQgaXRzIHNlc3Npb24KLSAgICAgKiBpcyBubyBsb25nZXIgdmFsaWQuICBUbyBvYnRhaW4gYSBuZXcgc2Vzc2lvbiwgdGhlIGFwcGxpY2F0aW9uIG1heSB0cnkgYWdhaW4KLSAgICAgKiBhbmQgb21pdCB0aGUgc2Vzc2lvbiBpZCBwYXJhbWV0ZXIuICBIb3dldmVyLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkCi0gICAgICogb25seSByZXRyeSByZXF1ZXN0cyBkdWUgdG8gYW4gZXhwbGljaXQgYWN0aW9uIHBlcmZvcm1lZCBieSB0aGUgdXNlciwKLSAgICAgKiBzdWNoIGFzIHRoZSB1c2VyIGNsaWNraW5nIG9uIGEgInBsYXkiIGJ1dHRvbiBpbiB0aGUgVUksIHNpbmNlIGFub3RoZXIKLSAgICAgKiBhcHBsaWNhdGlvbiBtYXkgYmUgdHJ5aW5nIHRvIHRha2UgY29udHJvbCBvZiB0aGUgcm91dGUgYW5kIHRoZSBmb3JtZXIKLSAgICAgKiBhcHBsaWNhdGlvbiBzaG91bGQgdHJ5IHRvIHN0YXkgb3V0IG9mIGl0cyB3YXkuCi0gICAgICogPC9wPjxwPgotICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHNlc3Npb25zLCBxdWV1ZXMgYW5kIG1lZGlhIGl0ZW1zLCBwbGVhc2UgcmVmZXIgdG8gdGhlCi0gICAgICogY2xhc3MgZG9jdW1lbnRhdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZQotICAgICAqIHNlc3Npb24gdG8gd2hpY2ggdGhlIHBsYXliYWNrIHJlcXVlc3QgYmVsb25ncy4gIElmIG9taXR0ZWQsIGEgbmV3IHNlc3Npb24KLSAgICAgKiBpcyBjcmVhdGVkIGltcGxpY2l0bHkuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGluaXRpYWwKLSAgICAgKiBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbQotICAgICAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRlbnQuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9NRVRBREFUQX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIG1ldGFkYXRhIGFzc29jaWF0ZWQKLSAgICAgKiB3aXRoIHRoZSBjb250ZW50IHN1Y2ggYXMgdGhlIHRpdGxlIG9mIGEgc29uZy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVJ9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyBhCi0gICAgICoge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcwotICAgICAqIGFib3V0IHRoZSBtZWRpYSBpdGVtLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZQotICAgICAqIHNlc3Npb24gdGhhdCB3YXMgYWZmZWN0ZWQgYnkgdGhlIHJlcXVlc3QuICBUaGlzIHdpbGwgYmUgYSBuZXcgc2Vzc2lvbiBpbgotICAgICAqIHRoZSBjYXNlIHdoZXJlIG5vIHNlc3Npb24gaWQgd2FzIHN1cHBsaWVkIGFzIGEgcGFyYW1ldGVyLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fSUR9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgYW4gb3BhcXVlIHN0cmluZyBpZGVudGlmaWVyCi0gICAgICogdG8gdXNlIHRvIHJlZmVyIHRvIHRoZSBtZWRpYSBpdGVtIGluIHN1YnNlcXVlbnQgcmVxdWVzdHMgc3VjaCBhcwotICAgICAqIHtAbGluayAjQUNUSU9OX0dFVF9TVEFUVVN9LgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBpbml0aWFsIHN0YXR1cyBvZgotICAgICAqIHRoZSBuZXcgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlN0YXR1cyB1cGRhdGVzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgY2xpZW50IHN1cHBsaWVzIGFuCi0gICAgICoge0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgaXRlbSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyfQotICAgICAqIHRoZW4gdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIHN0YXR1cyB1cGRhdGVzIHRvIHRoZSByZWNlaXZlcgotICAgICAqIHdoZW4gc2lnbmlmaWNhbnQgbWVkaWEgaXRlbSBzdGF0ZSBjaGFuZ2VzIG9jY3VyIHN1Y2ggYXMgd2hlbiBwbGF5YmFjayBzdGFydHMgb3IKLSAgICAgKiBzdG9wcy4gIFRoZSByZWNlaXZlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZvciBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGNoYW5nZXMuCi0gICAgICogVGhlIGFwcGxpY2F0aW9uIG1heSByZXRyaWV2ZSB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiB3aGVuIG5lY2Vzc2FyeQotICAgICAqIHVzaW5nIHRoZSB7QGxpbmsgI0FDVElPTl9HRVRfU1RBVFVTfSByZXF1ZXN0LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzfSBmb3IgZGV0YWlscy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIGEgc2Vzc2lvbiBpZCB3YXMgcHJvdmlkZWQgYnV0IGlzIHVua25vd24gb3IKLSAgICAgKiBubyBsb25nZXIgdmFsaWQsIGlmIHRoZSBpdGVtIFVyaSBvciBjb250ZW50IHR5cGUgaXMgbm90IHN1cHBvcnRlZCwgb3IgaWYKLSAgICAgKiBhbnkgb3RoZXIgYXJndW1lbnRzIGFyZSBpbnZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FeGFtcGxlPC9oMz4KLSAgICAgKiA8cHJlPgotICAgICAqIE1lZGlhUm91dGVyIG1lZGlhUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7Ci0gICAgICogTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbWVkaWFSb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAqIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUExBWSk7Ci0gICAgICogaW50ZW50LmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOwotICAgICAqIGludGVudC5zZXREYXRhQW5kVHlwZSgiaHR0cDovL2V4YW1wbGUuY29tL3ZpZGVvcy9tb3ZpZS5tcDQiLCAidmlkZW8vbXA0Iik7Ci0gICAgICogaWYgKHJvdXRlLnN1cHBvcnRzQ29udHJvbFJlcXVlc3QoaW50ZW50KSkgewotICAgICAqICAgICBNZWRpYVJvdXRlci5Db250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2soKSB7Ci0gICAgICogICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSkgewotICAgICAqICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IHN1Y2NlZWRlZC4KLSAgICAgKiAgICAgICAgICAgICAvLyBQbGF5YmFjayBtYXkgYmUgY29udHJvbGxlZCB1c2luZyB0aGUgcmV0dXJuZWQgc2Vzc2lvbiBhbmQgaXRlbSBpZC4KLSAgICAgKiAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkID0gZGF0YS5nZXRTdHJpbmcoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQpOwotICAgICAqICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQgPSBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9JRCk7Ci0gICAgICogICAgICAgICAgICAgTWVkaWFJdGVtU3RhdHVzIHN0YXR1cyA9IE1lZGlhSXRlbVN0YXR1cy5mcm9tQnVuZGxlKGRhdGEuZ2V0QnVuZGxlKAotICAgICAqICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fU1RBVFVTKSk7Ci0gICAgICogICAgICAgICAgICAgLy8gLi4uCi0gICAgICogICAgICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICogICAgICAgICAgICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQhCi0gICAgICogICAgICAgICB9Ci0gICAgICogICAgIH07Ci0gICAgICogICAgIHJvdXRlLnNlbmRDb250cm9sUmVxdWVzdChpbnRlbnQsIGNhbGxiYWNrKTsKLSAgICAgKiB9PC9wcmU+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKiBAc2VlICNBQ1RJT05fU0VFSwotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU1RBVFVTCi0gICAgICogQHNlZSAjQUNUSU9OX1BBVVNFCi0gICAgICogQHNlZSAjQUNUSU9OX1JFU1VNRQotICAgICAqIEBzZWUgI0FDVElPTl9TVE9QCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1BMQVkgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlBMQVkiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBFbnF1ZXVlIG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIHdvcmtzIGp1c3QgbGlrZSB7QGxpbmsgI0FDVElPTl9QTEFZIHBsYXl9IGV4Y2VwdCB0aGF0IGl0IGRvZXMKLSAgICAgKiBub3QgY2xlYXIgdGhlIHF1ZXVlIG9yIHJlc2V0IHRoZSBwYXVzZSBzdGF0ZSB3aGVuIGl0IGVucXVldWVzIHRoZQotICAgICAqIG5ldyBtZWRpYSBpdGVtIGludG8gdGhlIHNlc3Npb24ncyBwbGF5YmFjayBxdWV1ZS4gIFRoaXMgYWN0aW9uIG9ubHkKLSAgICAgKiBlbnF1ZXVlcyBhIG1lZGlhIGl0ZW0gd2l0aCBubyBvdGhlciBzaWRlLWVmZmVjdHMgb24gdGhlIHF1ZXVlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiB0aGUgcXVldWUgaXMgY3VycmVudGx5IGVtcHR5IGFuZCB0aGVuIHRoZSBpdGVtIHdpbGwgcGxheSBpbW1lZGlhdGVseQotICAgICAqIChhc3N1bWluZyB0aGUgcXVldWUgaXMgbm90IHBhdXNlZCkuICBPdGhlcndpc2UsIHRoZSBpdGVtIHdpbGwgcGxheQotICAgICAqIGFmdGVyIGFsbCBlYXJsaWVyIGl0ZW1zIGluIHRoZSBxdWV1ZSBoYXZlIGZpbmlzaGVkIG9yIGJlZW4gcmVtb3ZlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIGVucXVldWUgYWN0aW9uIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgc2Vzc2lvbnMganVzdCBsaWtlIHBsYXkuCi0gICAgICogSXRzIHBhcmFtZXRlcnMgYW5kIHJlc3VsdHMgYXJlIGFsc28gdGhlIHNhbWUuICBPbmx5IHRoZSBxdWV1aW5nIGJlaGF2aW9yCi0gICAgICogaXMgZGlmZmVyZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0VOUVVFVUUgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLkVOUVVFVUUiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBTZWVrIG1lZGlhIGl0ZW0gdG8gYSBuZXcgcGxheWJhY2sgcG9zaXRpb24uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBtb2RpZnkgdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24KLSAgICAgKiBvZiB0aGUgc3BlY2lmaWVkIG1lZGlhIGl0ZW0uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIG9ubHkgYWZmZWN0cyB0aGUgcGxheWJhY2sgcG9zaXRpb24gb2YgdGhlIG1lZGlhIGl0ZW07IG5vdCBpdHMgcGxheWJhY2sgc3RhdGUuCi0gICAgICogSWYgdGhlIHBsYXliYWNrIHF1ZXVlIGlzIHBhdXNlZCwgdGhlbiBzZWVraW5nIHNldHMgdGhlIHBvc2l0aW9uIGJ1dCB0aGUgaXRlbQotICAgICAqIHJlbWFpbnMgcGF1c2VkLiAgTGlrZXdpc2UgaWYgdGhlIGl0ZW0gaXMgcGxheWluZywgdGhlbiBzZWVraW5nIHdpbGwgY2F1c2UgcGxheWJhY2sKLSAgICAgKiB0byBqdW1wIHRvIHRoZSBuZXcgcG9zaXRpb24gYW5kIGNvbnRpbnVlIHBsYXlpbmcgZnJvbSB0aGF0IHBvaW50LiAgSWYgdGhlIGl0ZW0gaGFzCi0gICAgICogbm90IHlldCBzdGFydGVkIHBsYXlpbmcsIHRoZW4gdGhlIG5ldyBwbGF5YmFjayBwb3NpdGlvbiBpcyByZW1lbWJlcmVkIGJ5IHRoZQotICAgICAqIHF1ZXVlIGFuZCB1c2VkIGFzIHRoZSBpdGVtJ3MgaW5pdGlhbCBjb250ZW50IHBvc2l0aW9uIHdoZW4gcGxheWJhY2sgZXZlbnR1YWxseSBiZWdpbnMuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHN1Y2Nlc3NmdWwsIHRoZSBtZWRpYSBpdGVtJ3MgcGxheWJhY2sgcG9zaXRpb24gaXMgY2hhbmdlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggdGhlIG1lZGlhIGl0ZW0gYmVsb25ncy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lZGlhIGl0ZW0gaWQgb2YKLSAgICAgKiB0aGUgbWVkaWEgaXRlbSB0byBzZWVrLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fQ09OVEVOVF9QT1NJVElPTn0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBuZXcKLSAgICAgKiBjb250ZW50IHBvc2l0aW9uIGZvciBwbGF5YmFjayBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZyb20KLSAgICAgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZW50LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbmV3IHN0YXR1cyBvZgotICAgICAqIHRoZSBtZWRpYSBpdGVtLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIG9yIG1lZGlhIGl0ZW0gaWQgYXJlIHVua25vd24KLSAgICAgKiBvciBubyBsb25nZXIgdmFsaWQsIGlmIHRoZSBjb250ZW50IHBvc2l0aW9uIGlzIGludmFsaWQsIG9yIGlmIHRoZSBtZWRpYSBpdGVtCi0gICAgICogaXMgaW4gYSB0ZXJtaW5hbCBzdGF0ZS4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0VFSyA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uU0VFSyI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IEdldCBtZWRpYSBpdGVtIHBsYXliYWNrIHN0YXR1cwotICAgICAqIGFuZCBwcm9ncmVzcyBpbmZvcm1hdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gYXNrcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBwcm92aWRlIHVwZGF0ZWQgcGxheWJhY2sgc3RhdHVzIGFuZCBwcm9ncmVzcwotICAgICAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggdGhlIG1lZGlhIGl0ZW0gYmVsb25ncy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lZGlhIGl0ZW0gaWQgb2YKLSAgICAgKiB0aGUgbWVkaWEgaXRlbSB0byBxdWVyeS4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGN1cnJlbnQgc3RhdHVzIG9mCi0gICAgICogdGhlIG1lZGlhIGl0ZW0uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgb3IgbWVkaWEgaXRlbSBpZCBhcmUgdW5rbm93bgotICAgICAqIG9yIG5vIGxvbmdlciB2YWxpZC4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKiBAc2VlICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fR0VUX1NUQVRVUyA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uR0VUX1NUQVRVUyI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFJlbW92ZSBtZWRpYSBpdGVtIGZyb20gc2Vzc2lvbidzIHF1ZXVlLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHJlbW92ZSB0aGUgc3BlY2lmaWVkIG1lZGlhIGl0ZW0KLSAgICAgKiBmcm9tIHRoZSBzZXNzaW9uJ3MgcGxheWJhY2sgcXVldWUuICBJZiB0aGUgY3VycmVudCBpdGVtIGlzIHJlbW92ZWQsIHRoZW4KLSAgICAgKiBwbGF5YmFjayB3aWxsIHByb2NlZWQgdG8gdGhlIG5leHQgbWVkaWEgaXRlbSAoYXNzdW1pbmcgdGhlIHF1ZXVlIGhhcyBub3QgYmVlbgotICAgICAqIHBhdXNlZCkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGRvZXMgbm90IGFmZmVjdCB0aGUgcGF1c2Ugc3RhdGUgb2YgdGhlIHF1ZXVlLiAgSWYgdGhlIHF1ZXVlIHdhcyBwYXVzZWQKLSAgICAgKiB0aGVuIGl0IHJlbWFpbnMgcGF1c2VkIChldmVuIGlmIGl0IGlzIG5vdyBlbXB0eSkgdW50aWwgYSByZXN1bWUsIHN0b3Agb3IgcGxheQotICAgICAqIGFjdGlvbiBpcyBpc3N1ZWQgdGhhdCBjYXVzZXMgdGhlIHBhdXNlIHN0YXRlIHRvIGJlIGNsZWFyZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgotICAgICAqIHRvIHdoaWNoIHRoZSBtZWRpYSBpdGVtIGJlbG9uZ3MuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBtZWRpYSBpdGVtIGlkIG9mCi0gICAgICogdGhlIG1lZGlhIGl0ZW0gdG8gcmVtb3ZlLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbmV3IHN0YXR1cyBvZgotICAgICAqIHRoZSBtZWRpYSBpdGVtLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIG9yIG1lZGlhIGl0ZW0gaWQgYXJlIHVua25vd24KLSAgICAgKiBvciBubyBsb25nZXIgdmFsaWQsIG9yIGlmIHRoZSBtZWRpYSBpdGVtIGlzIGluIGEgdGVybWluYWwgc3RhdGUgKGFuZCB0aGVyZWZvcmUKLSAgICAgKiBubyBsb25nZXIgaW4gdGhlIHF1ZXVlKS4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUkVNT1ZFID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5SRU1PVkUiOwotCi0gICAgLyogUmVtb3RlIHBsYXliYWNrIGFjdGlvbnMgdGhhdCBhZmZlY3QgdGhlIHdob2xlIHBsYXliYWNrIHF1ZXVlLiAqLwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBQYXVzZSBtZWRpYSBwbGF5YmFjay4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIHRoZSBwbGF5YmFjayBxdWV1ZSBvZiB0aGUgc3BlY2lmaWVkIHNlc3Npb24gdG8gYmUgcGF1c2VkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KLSAgICAgKiB3aG9zZSBwbGF5YmFjayBxdWV1ZSBpcyB0byBiZSBwYXVzZWQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0FDVElPTl9SRVNVTUUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUEFVU0UgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlBBVVNFIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogUmVzdW1lIG1lZGlhIHBsYXliYWNrICh1bnBhdXNlKS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIHRoZSBwbGF5YmFjayBxdWV1ZSBvZiB0aGUgc3BlY2lmaWVkIHNlc3Npb24gdG8gYmUgcmVzdW1lZC4KLSAgICAgKiBSZXZlcnNlcyB0aGUgZWZmZWN0cyBvZiB7QGxpbmsgI0FDVElPTl9QQVVTRX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgotICAgICAqIHdob3NlIHBsYXliYWNrIHF1ZXVlIGlzIHRvIGJlIHJlc3VtZWQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0FDVElPTl9QQVVTRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9SRVNVTUUgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlJFU1VNRSI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFN0b3AgbWVkaWEgcGxheWJhY2sgKGNsZWFyIHF1ZXVlIGFuZCB1bnBhdXNlKS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHN0b3AgcGxheWJhY2ssIGNhbmNlbCBhbmQgcmVtb3ZlCi0gICAgICogYWxsIG1lZGlhIGl0ZW1zIGZyb20gdGhlIHNlc3Npb24ncyBtZWRpYSBpdGVtIHF1ZXVlIGFuZCwgcmVzZXQgdGhlIHF1ZXVlJ3MKLSAgICAgKiBwYXVzZSBzdGF0ZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgc3VjY2Vzc2Z1bCwgdGhlIHN0YXR1cyBvZiBhbGwgbWVkaWEgaXRlbXMgaW4gdGhlIHF1ZXVlIGlzIHNldCB0bwotICAgICAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfQ0FOQ0VMRUQgY2FuY2VsZWR9IGFuZCBhIHN0YXR1cyB1cGRhdGUgaXMgc2VudAotICAgICAqIHRvIHRoZSBhcHByb3ByaWF0ZSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVycyBpbmRpY2F0aW5nIHRoZSBuZXcgc3RhdHVzIG9mIGVhY2ggaXRlbS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mCi0gICAgICogdGhlIHNlc3Npb24gd2hvc2UgcGxheWJhY2sgcXVldWUgaXMgdG8gYmUgc3RvcHBlZCAoY2xlYXJlZCBhbmQgdW5wYXVzZWQpLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBpcyB1bmtub3duIG9yIG5vIGxvbmdlciB2YWxpZC4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU1RPUCA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uU1RPUCI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFN0YXJ0IHNlc3Npb24uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBpbnZhbGlkYXRlIHRoZSBjdXJyZW50IHNlc3Npb24KLSAgICAgKiBhbmQgc3RhcnQgYSBuZXcgc2Vzc2lvbi4gIFRoZSBuZXcgc2Vzc2lvbiBpbml0aWFsbHkgaGFzIGFuIGVtcHR5IHF1ZXVlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiBzdWNjZXNzZnVsLCB0aGUgc3RhdHVzIG9mIGFsbCBtZWRpYSBpdGVtcyBpbiB0aGUgcHJldmlvdXMgc2Vzc2lvbidzIHF1ZXVlIGlzIHNldCB0bwotICAgICAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQgaW52YWxpZGF0ZWR9IGFuZCBhIHN0YXR1cyB1cGRhdGUKLSAgICAgKiBpcyBzZW50IHRvIHRoZSBhcHByb3ByaWF0ZSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVycyBpbmRpY2F0aW5nIHRoZSBuZXcgc3RhdHVzCi0gICAgICogb2YgZWFjaCBpdGVtLiAgVGhlIHByZXZpb3VzIHNlc3Npb24gYmVjb21lcyBubyBsb25nZXIgdmFsaWQgYW5kIHRoZSBuZXcgc2Vzc2lvbgotICAgICAqIHRha2VzIGNvbnRyb2wgb2YgdGhlIHJvdXRlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVJ9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyBhCi0gICAgICoge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcwotICAgICAqIGFib3V0IHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX01FU1NBR0VfUkVDRUlWRVJ9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyBhCi0gICAgICoge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBtZXNzYWdlcyBmcm9tCi0gICAgICogdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlCi0gICAgICogc2Vzc2lvbiB0aGF0IHdhcyBzdGFydGVkIGJ5IHRoZSByZXF1ZXN0LiAgVGhpcyB3aWxsIGFsd2F5cyBiZSBhIGJyYW5kIG5ldyBzZXNzaW9uCi0gICAgICogZGlzdGluY3QgZnJvbSBhbnkgb3RoZXIgcHJldmlvdXNseSBjcmVhdGVkIHNlc3Npb25zLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZQotICAgICAqIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlN0YXR1cyB1cGRhdGVzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgY2xpZW50IHN1cHBsaWVzIGEKLSAgICAgKiB7QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyfQotICAgICAqIHRoZW4gdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIHN0YXR1cyB1cGRhdGVzIHRvIHRoZSByZWNlaXZlcgotICAgICAqIHdoZW4gc2lnbmlmaWNhbnQgbWVkaWEgc2Vzc2lvbiBzdGF0ZSBjaGFuZ2VzIG9jY3VyIHN1Y2ggYXMgd2hlbiB0aGUgc2Vzc2lvbidzCi0gICAgICogcXVldWUgaXMgcGF1c2VkIG9yIHJlc3VtZWQgb3Igd2hlbiB0aGUgc2Vzc2lvbiBpcyB0ZXJtaW5hdGVkIG9yIGludmFsaWRhdGVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzfSBmb3IgZGV0YWlscy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+Q3VzdG9tIG1lc3NhZ2VzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgY2xpZW50IHN1cHBsaWVzIGEge0BsaW5rICNFWFRSQV9NRVNTQUdFX1JFQ0VJVkVSIG1lc3NhZ2UgcmVjZWl2ZXJ9Ci0gICAgICogdGhlbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgbWVzc2FnZXMgdG8gdGhlIHJlY2VpdmVyCi0gICAgICogd2hlbiB0aGUgc2Vzc2lvbiBoYXMgYW55IG1lc3NhZ2VzIHRvIHNlbmQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlZmVyIHRvIHtAbGluayAjRVhUUkFfTUVTU0FHRX0gZm9yIGRldGFpbHMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBjb3VsZCBub3QgYmUgY3JlYXRlZC4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU1RBUlRfU0VTU0lPTiA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uU1RBUlRfU0VTU0lPTiI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IEdldCBtZWRpYSBzZXNzaW9uIHN0YXR1cyBpbmZvcm1hdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gYXNrcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBwcm92aWRlIHVwZGF0ZWQgc3RhdHVzIGluZm9ybWF0aW9uCi0gICAgICogYWJvdXQgdGhlIHNwZWNpZmllZCBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlCi0gICAgICogc2Vzc2lvbiB3aG9zZSBzdGF0dXMgaXMgdG8gYmUgcmV0cmlldmVkLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUKLSAgICAgKiBjdXJyZW50IHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBpcyB1bmtub3duIG9yIG5vIGxvbmdlciB2YWxpZC4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKiBAc2VlICNFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uR0VUX1NFU1NJT05fU1RBVFVTIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogRW5kIHNlc3Npb24uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBlbmQgdGhlIHNwZWNpZmllZCBzZXNzaW9uLgotICAgICAqIFRoZSBzZXNzaW9uIGJlY29tZXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCB0aGUgcm91dGUgY2Vhc2VzIHRvIGJlIHVuZGVyIGNvbnRyb2wKLSAgICAgKiBvZiB0aGUgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgc3VjY2Vzc2Z1bCwgdGhlIHN0YXR1cyBvZiB0aGUgc2Vzc2lvbiBpcyBzZXQgdG8KLSAgICAgKiB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzI1NFU1NJT05fU1RBVEVfRU5ERUR9IGFuZCBhIHN0YXR1cyB1cGRhdGUgaXMgc2VudCB0bwotICAgICAqIHRoZSBzZXNzaW9uJ3Mgc3RhdHVzIHVwZGF0ZSByZWNlaXZlci4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQWRkaXRpb25hbGx5LCB0aGUgc3RhdHVzIG9mIGFsbCBtZWRpYSBpdGVtcyBpbiB0aGUgcXVldWUgaXMgc2V0IHRvCi0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNQTEFZQkFDS19TVEFURV9DQU5DRUxFRCBjYW5jZWxlZH0gYW5kIGEgc3RhdHVzIHVwZGF0ZSBpcyBzZW50Ci0gICAgICogdG8gdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzIGluZGljYXRpbmcgdGhlIG5ldyBzdGF0dXMgb2YgZWFjaCBpdGVtLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKLSAgICAgKiB0aGUgc2Vzc2lvbiB0byBlbmQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZQotICAgICAqIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBpcyB1bmtub3duIG9yIG5vIGxvbmdlciB2YWxpZC4KLSAgICAgKiBJbiBvdGhlciB3b3JkcywgaXQgaXMgYW4gZXJyb3IgdG8gYXR0ZW1wdCB0byBlbmQgYSBzZXNzaW9uIG90aGVyIHRoYW4gdGhlCi0gICAgICogY3VycmVudCBzZXNzaW9uLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9FTkRfU0VTU0lPTiA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uRU5EX1NFU1NJT04iOwotCi0gICAgLyoqCi0gICAgICogQ3VzdG9tIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBTZW5kIHtAbGluayAjRVhUUkFfTUVTU0FHRX0uCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gYXNrcyBhIHJvdXRlIHRvIGhhbmRsZSBhIG1lc3NhZ2UgZGVzY3JpYmVkIGJ5IEVYVFJBX01FU1NBR0UuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgotICAgICAqIHRvIHdoaWNoIHdpbGwgaGFuZGxlIHRoaXMgbWVzc2FnZS4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9NRVNTQUdFfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgdG8gc2VuZC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiBBbnkgbWVzc2FnZXMgZGVmaW5lZCBieSBlYWNoIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogQW55IGVycm9yIG1lc3NhZ2VzIGRlZmluZWQgYnkgZWFjaCBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRU5EX01FU1NBR0UgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlNFTkRfTUVTU0FHRSI7Ci0KLSAgICAvKiBFeHRyYXMgYW5kIHJlbGF0ZWQgY29uc3RhbnRzLiAqLwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBzZXNzaW9uIGlkLgotICAgICAqIDxwPgotICAgICAqIEFuIG9wYXF1ZSB1bmlxdWUgaWRlbnRpZmllciB0aGF0IGlkZW50aWZpZXMgdGhlIHJlbW90ZSBwbGF5YmFjayBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBVc2VkIHdpdGggdmFyaW91cyBhY3Rpb25zIHRvIHNwZWNpZnkgdGhlIGlkIG9mIHRoZSBtZWRpYSBzZXNzaW9uIHRvIGJlIGNvbnRyb2xsZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIEluY2x1ZGVkIGluIGJyb2FkY2FzdCBpbnRlbnRzIHNlbnQgdG8KLSAgICAgKiB7QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBpdGVtIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzfSB0byBpZGVudGlmeQotICAgICAqIHRoZSBzZXNzaW9uIHRvIHdoaWNoIHRoZSBpdGVtIGluIHF1ZXN0aW9uIGJlbG9uZ3MuCi0gICAgICogPC9wPjxwPgotICAgICAqIEluY2x1ZGVkIGluIGJyb2FkY2FzdCBpbnRlbnRzIHNlbnQgdG8KLSAgICAgKiB7QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBzZXNzaW9uIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzfSB0byBpZGVudGlmeQotICAgICAqIHRoZSBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB1bmlxdWUgc3RyaW5nIHZhbHVlIGdlbmVyYXRlZCBieSB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIKLSAgICAgKiB0byByZXByZXNlbnQgb25lIHBhcnRpY3VsYXIgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TVEFUVVMKLSAgICAgKiBAc2VlICNBQ1RJT05fUEFVU0UKLSAgICAgKiBAc2VlICNBQ1RJT05fUkVTVU1FCi0gICAgICogQHNlZSAjQUNUSU9OX1NUT1AKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RBUlRfU0VTU0lPTgotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMKLSAgICAgKiBAc2VlICNBQ1RJT05fRU5EX1NFU1NJT04KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TRVNTSU9OX0lEID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5TRVNTSU9OX0lEIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgc2Vzc2lvbiBzdGF0dXMuCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJuZWQgYXMgYSByZXN1bHQgZnJvbSBtZWRpYSBzZXNzaW9uIGFjdGlvbnMgc3VjaCBhcyB7QGxpbmsgI0FDVElPTl9TVEFSVF9TRVNTSU9OfSwKLSAgICAgKiB7QGxpbmsgI0FDVElPTl9QQVVTRX0sIGFuZCB7QGxpbmsgI0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVN9Ci0gICAgICogdG8gZGVzY3JpYmUgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIEluY2x1ZGVkIGluIGJyb2FkY2FzdCBpbnRlbnRzIHNlbnQgdG8KLSAgICAgKiB7QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBzZXNzaW9uIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzfSB0byBwcm92aWRlCi0gICAgICogdXBkYXRlZCBzdGF0dXMgaW5mb3JtYXRpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0gb2YgZGF0YSB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgaW50bwotICAgICAqIGEge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1c30gb2JqZWN0IHVzaW5nCi0gICAgICoge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1cyNmcm9tQnVuZGxlIE1lZGlhU2Vzc2lvblN0YXR1cy5mcm9tQnVuZGxlfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TVEFUVVMKLSAgICAgKiBAc2VlICNBQ1RJT05fUEFVU0UKLSAgICAgKiBAc2VlICNBQ1RJT05fUkVTVU1FCi0gICAgICogQHNlZSAjQUNUSU9OX1NUT1AKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RBUlRfU0VTU0lPTgotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMKLSAgICAgKiBAc2VlICNBQ1RJT05fRU5EX1NFU1NJT04KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TRVNTSU9OX1NUQVRVUyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuU0VTU0lPTl9TVEFUVVMiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBzZXNzaW9uIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1NUQVJUX1NFU1NJT059IHRvIHNwZWNpZnkgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEKLSAgICAgKiBicm9hZGNhc3QgcmVjZWl2ZXIgdGhhdCB3aWxsIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMgYWJvdXQgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW5ldmVyIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24gY2hhbmdlcywgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpbGwKLSAgICAgKiBzZW5kIGEgYnJvYWRjYXN0IHRvIHRoZSBwZW5kaW5nIGludGVudCB3aXRoIGV4dHJhcyB0aGF0IGlkZW50aWZ5IHRoZSBzZXNzaW9uCi0gICAgICogaWQgYW5kIGl0cyB1cGRhdGVkIHN0YXR1cy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5Ccm9hZGNhc3QgZXh0cmFzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mCi0gICAgICogdGhlIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZQotICAgICAqIHNlc3Npb24gYXMgYSBidW5kbGUgdGhhdCBjYW4gYmUgZGVjb2RlZCBpbnRvIGEge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1c30gb2JqZWN0LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RBUlRfU0VTU0lPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgbWVzc2FnZSByZWNlaXZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTn0gdG8gc3BlY2lmeSBhIHtAbGluayBQZW5kaW5nSW50ZW50fSBmb3IgYQotICAgICAqIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBtZXNzYWdlcyBmcm9tIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBXaGVuIHRoZSBtZWRpYSBzZXNzaW9uIGhhcyBhIG1lc3NhZ2UgdG8gc2VuZCwgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpbGwKLSAgICAgKiBzZW5kIGEgYnJvYWRjYXN0IHRvIHRoZSBwZW5kaW5nIGludGVudCB3aXRoIGV4dHJhcyB0aGF0IGlkZW50aWZ5IHRoZSBzZXNzaW9uCi0gICAgICogaWQgYW5kIGl0cyBtZXNzYWdlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkJyb2FkY2FzdCBleHRyYXM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKLSAgICAgKiB0aGUgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9NRVNTQUdFfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgZnJvbQotICAgICAqIHRoZSBzZXNzaW9uIGFzIGEgYnVuZGxlIG9iamVjdC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1NUQVJUX1NFU1NJT04KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9NRVNTQUdFX1JFQ0VJVkVSID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5NRVNTQUdFX1JFQ0VJVkVSIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgaXRlbSBpZC4KLSAgICAgKiA8cD4KLSAgICAgKiBBbiBvcGFxdWUgdW5pcXVlIGlkZW50aWZpZXIgcmV0dXJuZWQgYXMgYSByZXN1bHQgZnJvbSB7QGxpbmsgI0FDVElPTl9QTEFZfSBvcgotICAgICAqIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRoYXQgcmVwcmVzZW50cyB0aGUgbWVkaWEgaXRlbSB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZQotICAgICAqIHBsYXliYWNrIHJlcXVlc3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFVzZWQgd2l0aCB2YXJpb3VzIGFjdGlvbnMgdG8gc3BlY2lmeSB0aGUgaWQgb2YgdGhlIG1lZGlhIGl0ZW0gdG8gYmUgY29udHJvbGxlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzfSB0byBpZGVudGlmeQotICAgICAqIHRoZSBpdGVtIGluIHF1ZXN0aW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB1bmlxdWUgc3RyaW5nIHZhbHVlIGdlbmVyYXRlZCBieSB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIKLSAgICAgKiB0byByZXByZXNlbnQgb25lIHBhcnRpY3VsYXIgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICogQHNlZSAjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lURU1fSUQgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLklURU1fSUQiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBpdGVtIHN0YXR1cy4KLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5lZCBhcyBhIHJlc3VsdCBmcm9tIG1lZGlhIGl0ZW0gYWN0aW9ucyBzdWNoIGFzIHtAbGluayAjQUNUSU9OX1BMQVl9LAotICAgICAqIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9LCB7QGxpbmsgI0FDVElPTl9TRUVLfSwgYW5kIHtAbGluayAjQUNUSU9OX0dFVF9TVEFUVVN9Ci0gICAgICogdG8gZGVzY3JpYmUgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIG1lZGlhIGl0ZW0uCi0gICAgICogPC9wPjxwPgotICAgICAqIEluY2x1ZGVkIGluIGJyb2FkY2FzdCBpbnRlbnRzIHNlbnQgdG8KLSAgICAgKiB7QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBpdGVtIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzfSB0byBwcm92aWRlCi0gICAgICogdXBkYXRlZCBzdGF0dXMgaW5mb3JtYXRpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0gb2YgZGF0YSB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgaW50bwotICAgICAqIGEge0BsaW5rIE1lZGlhSXRlbVN0YXR1c30gb2JqZWN0IHVzaW5nCi0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNmcm9tQnVuZGxlIE1lZGlhSXRlbVN0YXR1cy5mcm9tQnVuZGxlfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICogQHNlZSAjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lURU1fU1RBVFVTID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX1NUQVRVUyI7Ci0KLSAgICAvKioKLSAgICAgKiBMb25nIGV4dHJhOiBNZWRpYSBpdGVtIGNvbnRlbnQgcG9zaXRpb24uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRvIHNwZWNpZnkgdGhlCi0gICAgICogc3RhcnRpbmcgcGxheWJhY2sgcG9zaXRpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9TRUVLfSB0byBzZXQgYSBuZXcgcGxheWJhY2sgcG9zaXRpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KLSAgICAgKiA8cD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU0VFSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lURU1fQ09OVEVOVF9QT1NJVElPTiA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuSVRFTV9QT1NJVElPTiI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIGl0ZW0gbWV0YWRhdGEuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRvIHNwZWNpZnkgbWV0YWRhdGEKLSAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRlbnQgb2YgYSBtZWRpYSBpdGVtLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IG9mIG1ldGFkYXRhIGtleS12YWx1ZSBwYWlycyBhcyBkZWZpbmVkCi0gICAgICogaW4ge0BsaW5rIE1lZGlhSXRlbU1ldGFkYXRhfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9NRVRBREFUQSA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuSVRFTV9NRVRBREFUQSI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IEhUVFAgcmVxdWVzdCBoZWFkZXJzLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9QTEFZfSBvciB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSB0byBzcGVjaWZ5IEhUVFAgcmVxdWVzdAotICAgICAqIGhlYWRlcnMgdG8gYmUgaW5jbHVkZWQgd2hlbiBmZXRjaGluZyB0byB0aGUgY29udGVudCBpbmRpY2F0ZWQgYnkgdGhlIG1lZGlhCi0gICAgICogaXRlbSdzIGRhdGEgVXJpLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGV4dHJhIG1heSBiZSB1c2VkIHRvIHByb3ZpZGUgYXV0aGVudGljYXRpb24gdG9rZW5zIGFuZCBvdGhlcgotICAgICAqIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlciBzZXBhcmF0ZWx5IGZyb20gdGhlIG1lZGlhIGl0ZW0ncyBkYXRhIFVyaS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBzdHJpbmcgYmFzZWQga2V5LXZhbHVlIHBhaXJzCi0gICAgICogdGhhdCBkZXNjcmliZSB0aGUgSFRUUCByZXF1ZXN0IGhlYWRlcnMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1BMQVkKLSAgICAgKiBAc2VlICNBQ1RJT05fRU5RVUVVRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lURU1fSFRUUF9IRUFERVJTID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5IVFRQX0hFQURFUlMiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBpdGVtIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRvIHNwZWNpZnkKLSAgICAgKiBhIHtAbGluayBQZW5kaW5nSW50ZW50fSBmb3IgYQotICAgICAqIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcyBhYm91dCBhIHBhcnRpY3VsYXIKLSAgICAgKiBtZWRpYSBpdGVtLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBXaGVuZXZlciB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBpdGVtIGNoYW5nZXMsIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciB3aWxsCi0gICAgICogc2VuZCBhIGJyb2FkY2FzdCB0byB0aGUgcGVuZGluZyBpbnRlbnQgd2l0aCBleHRyYXMgdGhhdCBpZGVudGlmeSB0aGUgc2Vzc2lvbgotICAgICAqIHRvIHdoaWNoIHRoZSBpdGVtIGJlbG9uZ3MsIHRoZSBzZXNzaW9uIHN0YXR1cywgdGhlIGl0ZW0ncyBpZAotICAgICAqIGFuZCB0aGUgaXRlbSdzIHVwZGF0ZWQgc3RhdHVzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgc2FtZSBwZW5kaW5nIGludGVudCBhbmQgYnJvYWRjYXN0IHJlY2VpdmVyIG1heSBiZSBzaGFyZWQgYnkgYW55IG51bWJlciBvZgotICAgICAqIG1lZGlhIGl0ZW1zIHNpbmNlIHRoZSBicm9hZGNhc3QgaW50ZW50IGluY2x1ZGVzIHRoZSBtZWRpYSBzZXNzaW9uIGlkCi0gICAgICogYW5kIG1lZGlhIGl0ZW0gaWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBQZW5kaW5nSW50ZW50fS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+QnJvYWRjYXN0IGV4dHJhczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZgotICAgICAqIHRoZSBzZXNzaW9uIHRvIHdoaWNoIHRoZSBpdGVtIGluIHF1ZXN0aW9uIGJlbG9uZ3MuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBtZWRpYSBpdGVtIGlkIG9mIHRoZQotICAgICAqIG1lZGlhIGl0ZW0gaW4gcXVlc3Rpb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9TVEFUVVN9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZQotICAgICAqIGl0ZW0gYXMgYSBidW5kbGUgdGhhdCBjYW4gYmUgZGVjb2RlZCBpbnRvIGEge0BsaW5rIE1lZGlhSXRlbVN0YXR1c30gb2JqZWN0LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZXNzYWdlLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9TRU5EX01FU1NBR0V9LCBhbmQgaW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfTUVTU0FHRV9SRUNFSVZFUiBtZXNzYWdlIHJlY2VpdmVyc30gdG8gZGVzY3JpYmUgYSBtZXNzYWdlIGJldHdlZW4gYQotICAgICAqIHNlc3Npb24gYW5kIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX01FU1NBR0UgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuTUVTU0FHRSI7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlZ2VyIGV4dHJhOiBFcnJvciBjb2RlLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCBhbGwgbWVkaWEgY29udHJvbCByZXF1ZXN0cyB0byBkZXNjcmliZSB0aGUgY2F1c2Ugb2YgYW4gZXJyb3IuCi0gICAgICogVGhpcyBleHRyYSBtYXkgYmUgb21pdHRlZCB3aGVuIHRoZSBlcnJvciBpcyB1bmtub3duLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgb25lIG9mOiB7QGxpbmsgI0VSUk9SX1VOS05PV059LCB7QGxpbmsgI0VSUk9SX1VOU1VQUE9SVEVEX09QRVJBVElPTn0sCi0gICAgICoge0BsaW5rICNFUlJPUl9JTlZBTElEX1NFU1NJT05fSUR9LCB7QGxpbmsgI0VSUk9SX0lOVkFMSURfSVRFTV9JRH0uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0VSUk9SX0NPREUgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuRVJST1JfQ09ERSI7Ci0KLSAgICAvKioKLSAgICAgKiBFcnJvciBjb2RlOiBBbiB1bmtub3duIGVycm9yIG9jY3VycmVkLgotICAgICAqCi0gICAgICogQHNlZSAjRVhUUkFfRVJST1JfQ09ERQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1VOS05PV04gPSAwOwotCi0gICAgLyoqCi0gICAgICogRXJyb3IgY29kZTogVGhlIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAqCi0gICAgICogQHNlZSAjRVhUUkFfRVJST1JfQ09ERQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1VOU1VQUE9SVEVEX09QRVJBVElPTiA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBFcnJvciBjb2RlOiBUaGUgc2Vzc2lvbiBpZCBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3Qgd2FzIGludmFsaWQuCi0gICAgICoKLSAgICAgKiBAc2VlICNFWFRSQV9FUlJPUl9DT0RFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfSU5WQUxJRF9TRVNTSU9OX0lEID0gMjsKLQotICAgIC8qKgotICAgICAqIEVycm9yIGNvZGU6IFRoZSBpdGVtIGlkIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB3YXMgaW52YWxpZC4KLSAgICAgKgotICAgICAqIEBzZWUgI0VYVFJBX0VSUk9SX0NPREUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9JTlZBTElEX0lURU1fSUQgPSAzOwotCi0gICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xJbnRlbnQoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbU1ldGFkYXRhLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtTWV0YWRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyZGRiNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtTWV0YWRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotLyoqCi0gKiBDb25zdGFudHMgZm9yIHNwZWNpZnlpbmcgbWV0YWRhdGEgYWJvdXQgYSBtZWRpYSBpdGVtIGFzIGEge0BsaW5rIEJ1bmRsZX0uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgcGFydCBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sIGRlc2NyaWJlZCBieSB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgTWVkaWFDb250cm9sSW50ZW50fSBjbGFzcy4KLSAqIDwvcD48cD4KLSAqIE1lZGlhIGl0ZW0gbWV0YWRhdGEgaXMgZGVzY3JpYmVkIGFzIGEgYnVuZGxlIG9mIGtleS92YWx1ZSBwYWlycyBhcyBkZWZpbmVkCi0gKiBpbiB0aGlzIGNsYXNzLiAgVGhlIGRvY3VtZW50YXRpb24gc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHZhbHVlIGFzc29jaWF0ZWQKLSAqIHdpdGggZWFjaCBrZXkuCi0gKiA8L3A+PHA+Ci0gKiBBbiBhcHBsaWNhdGlvbiBtYXkgc3BlY2lmeSBhZGRpdGlvbmFsIGN1c3RvbSBtZXRhZGF0YSBrZXlzIGJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUKLSAqIHRoYXQgdGhleSB3aWxsIGJlIHJlY29nbml6ZWQgYnkgdGhlIGRlc3RpbmF0aW9uLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFJdGVtTWV0YWRhdGEgewotICAgIC8qCi0gICAgICogTm90ZTogTWVkaWFNZXRhZGF0YVJldHJpZXZlciBhbHNvIGRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIG1ldGFkYXRhIGtleXMgdGhhdCBjYW4gYmUKLSAgICAgKiByZXRyaWV2ZWQgZnJvbSBhIGNvbnRlbnQgc3RyZWFtIGFsdGhvdWdoIHRoZSByZXByZXNlbnRhdGlvbiBpcyBzb21ld2hhdCBkaWZmZXJlbnQgaGVyZQotICAgICAqIHNpbmNlIHdlIGFyZSBzZW5kaW5nIHRoZSBkYXRhIHRvIGEgcmVtb3RlIGVuZHBvaW50LgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBNZWRpYUl0ZW1NZXRhZGF0YSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBBbGJ1bSBhcnRpc3QgbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BTEJVTV9BUlRJU1QgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BTEJVTV9BUlRJU1QiOwotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGtleTogQWxidW0gdGl0bGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUxCVU1fVElUTEUgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BTEJVTV9USVRMRSI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBBcnR3b3JrIFVyaS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgVVJJIGZvciBhbiBpbWFnZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVkaWEgaXRlbSwKLSAgICAgKiBzdWNoIGFzIGFsYnVtIG9yIGNvdmVyIGFydC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FSVFdPUktfVVJJID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQVJUV09SS19VUkkiOwotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGtleTogQXJ0aXN0IG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVJUSVNUID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQVJUSVNUIjsKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IEF1dGhvciBuYW1lLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FVVEhPUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFVVEhPUiI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBDb21wb3NlciBuYW1lLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTVBPU0VSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQ09NUE9TRVIiOwotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGtleTogVHJhY2sgdGl0bGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElUTEUgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5USVRMRSI7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlZ2VyIGtleTogWWVhciBvZiBwdWJsaWNhdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYW4gaW50ZWdlciB5ZWFyIG51bWJlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1lFQVIgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5ZRUFSIjsKLQotICAgIC8qKgotICAgICAqIEludGVnZXIga2V5OiBUcmFjayBudW1iZXIgKHN1Y2ggYXMgYSB0cmFjayBvbiBhIENEKS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBvbmUtYmFzZWQgaW50ZWdlciB0cmFjayBudW1iZXIuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UUkFDS19OVU1CRVIgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5UUkFDS19OVU1CRVIiOwotCi0gICAgLyoqCi0gICAgICogSW50ZWdlciBrZXk6IERpc2MgbnVtYmVyIHdpdGhpbiBhIGNvbGxlY3Rpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgb25lLWJhc2VkIGludGVnZXIgZGlzYyBudW1iZXIuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ESVNDX05VTUJFUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkRJU0NfTlVNQkVSIjsKLQotICAgIC8qKgotICAgICAqIExvbmcga2V5OiBJdGVtIHBsYXliYWNrIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSA8Y29kZT5sb25nPC9jb2RlPiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgZHVyYXRpb24gbWV0YWRhdGEgaXMgb25seSBhIGhpbnQgdG8gZW5hYmxlIGEgcmVtb3RlIG1lZGlhIHBsYXllciB0bwotICAgICAqIGd1ZXNzIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29udGVudCBiZWZvcmUgaXQgYWN0dWFsbHkgb3BlbnMgdGhlIG1lZGlhIHN0cmVhbS4KLSAgICAgKiBUaGUgcmVtb3RlIG1lZGlhIHBsYXllciBzaG91bGQgc3RpbGwgZGV0ZXJtaW5lIHRoZSBhY3R1YWwgY29udGVudCBkdXJhdGlvbiBmcm9tCi0gICAgICogdGhlIG1lZGlhIHN0cmVhbSBpdHNlbGYgaW5kZXBlbmRlbnQgb2YgdGhlIHZhbHVlIHRoYXQgbWF5IGJlIHNwZWNpZmllZCBieSB0aGlzIGtleS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RVUkFUSU9OID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuRFVSQVRJT04iOwotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbVN0YXR1cy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbVN0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGVhMmQ1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1TdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuVGltZVV0aWxzOwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgcGxheWJhY2sgc3RhdHVzIG9mIGEgbWVkaWEgaXRlbS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wgZGVzY3JpYmVkIGJ5IHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBNZWRpYUNvbnRyb2xJbnRlbnR9IGNsYXNzLgotICogPC9wPjxwPgotICogQXMgYSBtZWRpYSBpdGVtIGlzIHBsYXllZCwgaXQgdHJhbnNpdGlvbnMgdGhyb3VnaCBhIHNlcXVlbmNlIG9mIHN0YXRlcyBpbmNsdWRpbmc6Ci0gKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX1BFTkRJTkcgcGVuZGluZ30sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HIGJ1ZmZlcmluZ30sCi0gKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX1BMQVlJTkcgcGxheWluZ30sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEFVU0VEIHBhdXNlZH0sCi0gKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0ZJTklTSEVEIGZpbmlzaGVkfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9DQU5DRUxFRCBjYW5jZWxlZH0sCi0gKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0lOVkFMSURBVEVEIGludmFsaWRhdGVkfSwgYW5kCi0gKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0VSUk9SIGVycm9yfS4gIFJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIG9mIGVhY2ggc3RhdGUKLSAqIGZvciBhbiBleHBsYW5hdGlvbiBvZiBpdHMgbWVhbmluZy4KLSAqIDwvcD48cD4KLSAqIFdoaWxlIHRoZSBpdGVtIGlzIHBsYXlpbmcsIHRoZSBwbGF5YmFjayBzdGF0dXMgbWF5IGFsc28gaW5jbHVkZSBwcm9ncmVzcyBpbmZvcm1hdGlvbgotICogYWJvdXQgdGhlIHtAbGluayAjZ2V0Q29udGVudFBvc2l0aW9uIGNvbnRlbnQgcG9zaXRpb259IGFuZAotICoge0BsaW5rICNnZXRDb250ZW50RHVyYXRpb24gY29udGVudCBkdXJhdGlvbn0gYWx0aG91Z2ggbm90IGFsbCByb3V0ZSBkZXN0aW5hdGlvbnMKLSAqIHdpbGwgcmVwb3J0IGl0LgotICogPC9wPjxwPgotICogVG8gbW9uaXRvciBwbGF5YmFjayBzdGF0dXMsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgc3VwcGx5IGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IHRvIHVzZSBhcyB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcn0KLSAqIGZvciBhIGdpdmVuIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheWJhY2sgcmVxdWVzdH0uICBOb3RlIHRoYXQKLSAqIHRoZSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyIHdpbGwgb25seSBiZSBpbnZva2VkIGZvciBtYWpvciBzdGF0dXMgY2hhbmdlcyBzdWNoIGFzIGEKLSAqIHRyYW5zaXRpb24gZnJvbSBwbGF5aW5nIHRvIGZpbmlzaGVkLgotICogPC9wPjxwIGNsYXNzPSJub3RlIj4KLSAqIFRoZSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyIHdpbGwgbm90IGJlIGludm9rZWQgZm9yIG1pbm9yIHByb2dyZXNzIHVwZGF0ZXMgc3VjaCBhcwotICogY2hhbmdlcyB0byBwbGF5YmFjayBwb3NpdGlvbiBvciBkdXJhdGlvbi4gIElmIHRoZSBhcHBsaWNhdGlvbiB3YW50cyB0byBtb25pdG9yCi0gKiBwbGF5YmFjayBwcm9ncmVzcywgdGhlbiBpdCBtdXN0IHVzZSB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TVEFUVVMgZ2V0IHN0YXR1cyByZXF1ZXN0fSB0byBwb2xsIGZvciBjaGFuZ2VzCi0gKiBwZXJpb2RpY2FsbHkgYW5kIGVzdGltYXRlIHRoZSBwbGF5YmFjayBwb3NpdGlvbiB3aGlsZSBwbGF5aW5nLiAgTm90ZSB0aGF0IHRoZXJlIG1heQotICogYmUgYSBzaWduaWZpY2FudCBwb3dlciBpbXBhY3QgdG8gcG9sbGluZyBzbyB0aGUgYXBwbGljYXRpb24gaXMgYWR2aXNlZCBvbmx5Ci0gKiB0byBwb2xsIHdoZW4gdGhlIHNjcmVlbiBpcyBvbiBhbmQgbmV2ZXIgbW9yZSB0aGFuIGFib3V0IG9uY2UgZXZlcnkgNSBzZWNvbmRzIG9yIHNvLgotICogPC9wPjxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhSXRlbVN0YXR1cyB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElNRVNUQU1QID0gInRpbWVzdGFtcCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBWUJBQ0tfU1RBVEUgPSAicGxheWJhY2tTdGF0ZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVEVOVF9QT1NJVElPTiA9ICJjb250ZW50UG9zaXRpb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlRFTlRfRFVSQVRJT04gPSAiY29udGVudER1cmF0aW9uIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FWFRSQVMgPSAiZXh0cmFzIjsKLQotICAgIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotCi0gICAgLyoqCi0gICAgICogUGxheWJhY2sgc3RhdGU6IFBlbmRpbmcuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gaGFzIG5vdCB5ZXQgc3RhcnRlZCBwbGF5YmFjayBidXQgd2lsbCBiZSBwbGF5ZWQgZXZlbnR1YWxseS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfUEVORElORyA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGxheWluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBpcyBjdXJyZW50bHkgcGxheWluZy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfUExBWUlORyA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGF1c2VkLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHBsYXliYWNrIG9mIHRoZSBtZWRpYSBpdGVtIGhhcyBiZWVuIHBhdXNlZC4gIFBsYXliYWNrIGNhbiBiZQotICAgICAqIHJlc3VtZWQgdXNpbmcgdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFU1VNRSByZXN1bWV9IGFjdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfUEFVU0VEID0gMjsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBCdWZmZXJpbmcgb3Igc2Vla2luZyB0byBhIG5ldyBwb3NpdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBoYXMgYmVlbiB0ZW1wb3JhcmlseSBpbnRlcnJ1cHRlZAotICAgICAqIHRvIGZldGNoIG1vcmUgY29udGVudC4gIFBsYXliYWNrIHdpbGwgY29udGludWUgYXV0b21hdGljYWxseQotICAgICAqIHdoZW4gZW5vdWdoIGNvbnRlbnQgaGFzIGJlZW4gYnVmZmVyZWQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUQVRFX0JVRkZFUklORyA9IDM7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogRmluaXNoZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gcGxheWVkIHRvIHRoZSBlbmQgb2YgdGhlIGNvbnRlbnQgYW5kIGZpbmlzaGVkIG5vcm1hbGx5LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBIGZpbmlzaGVkIG1lZGlhIGl0ZW0gY2Fubm90IGJlIHJlc3VtZWQuICBUbyBwbGF5IHRoZSBjb250ZW50IGFnYWluLCB0aGUgYXBwbGljYXRpb24KLSAgICAgKiBtdXN0IHNlbmQgYSBuZXcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBvcgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9GSU5JU0hFRCA9IDQ7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogQ2FuY2VsZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gd2FzIGV4cGxpY2l0bHkgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSBieSB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbi4gIEl0ZW1zIG1heSBiZSBjYW5jZWxlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSB1c2luZwotICAgICAqIHRoZSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkUgcmVtb3ZlfSBvcgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUT1Agc3RvcH0gYWN0aW9uIG9yIGJ5IGlzc3VpbmcKLSAgICAgKiBhbm90aGVyIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gYWN0aW9uIHRoYXQgaGFzIHRoZQotICAgICAqIHNpZGUtZWZmZWN0IG9mIGNsZWFyaW5nIHRoZSBxdWV1ZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQSBjYW5jZWxlZCBtZWRpYSBpdGVtIGNhbm5vdCBiZSByZXN1bWVkLiAgVG8gcGxheSB0aGUgY29udGVudCBhZ2FpbiwgdGhlCi0gICAgICogYXBwbGljYXRpb24gbXVzdCBzZW5kIGEgbmV3IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGFjdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfQ0FOQ0VMRUQgPSA1OwotCi0gICAgLyoqCi0gICAgICogUGxheWJhY2sgc3RhdGU6IEludmFsaWRhdGVkLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpdGVtIHdhcyBpbnZhbGlkYXRlZCBwZXJtYW5lbnRseSBhbmQgaW52b2x1bnRhcmlseS4KLSAgICAgKiBUaGlzIHN0YXRlIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWVkaWEgaXRlbSB3YXMgaW52YWxpZGF0ZWQgYW5kIHJlbW92ZWQKLSAgICAgKiBmcm9tIHRoZSBxdWV1ZSBiZWNhdXNlIHRoZSBzZXNzaW9uIHRvIHdoaWNoIGl0IGJlbG9uZ3Mgd2FzIGludmFsaWRhdGVkCi0gICAgICogKHR5cGljYWxseSBieSBhbm90aGVyIGFwcGxpY2F0aW9uIHRha2luZyBjb250cm9sIG9mIHRoZSByb3V0ZSkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW4gaW52YWxpZGF0aW9uIG9jY3VycywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBnZW5lcmFsbHkgd2FpdCBmb3IgdGhlIHVzZXIKLSAgICAgKiB0byBwZXJmb3JtIGFuIGV4cGxpY2l0IGFjdGlvbiwgc3VjaCBhcyBjbGlja2luZyBvbiBhIHBsYXkgYnV0dG9uIGluIHRoZSBVSSwKLSAgICAgKiBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgbWVkaWEgc2Vzc2lvbiB0byBhdm9pZCB1bm5lY2Vzc2FyaWx5IGludGVycnVwdGluZwotICAgICAqIGFub3RoZXIgYXBwbGljYXRpb24gdGhhdCBtYXkgaGF2ZSBqdXN0IHN0YXJ0ZWQgdXNpbmcgdGhlIHJvdXRlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBbiBpbnZhbGlkYXRlZCBtZWRpYSBpdGVtIGNhbm5vdCBiZSByZXN1bWVkLiAgVG8gcGxheSB0aGUgY29udGVudCBhZ2FpbiwgdGhlIGFwcGxpY2F0aW9uCi0gICAgICogbXVzdCBzZW5kIGEgbmV3IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGFjdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQgPSA2OwotCi0gICAgLyoqCi0gICAgICogUGxheWJhY2sgc3RhdGU6IFBsYXliYWNrIGhhbHRlZCBvciBhYm9ydGVkIGR1ZSB0byBhbiBlcnJvci4KLSAgICAgKiA8cD4KLSAgICAgKiBFeGFtcGxlcyBvZiBlcnJvcnMgYXJlIG5vIG5ldHdvcmsgY29ubmVjdGl2aXR5IHdoZW4gYXR0ZW1wdGluZyB0byByZXRyaWV2ZSBjb250ZW50Ci0gICAgICogZnJvbSBhIHNlcnZlciwgb3IgZXhwaXJlZCB1c2VyIGNyZWRlbnRpYWxzIHdoZW4gdHJ5aW5nIHRvIHBsYXkgc3Vic2NyaXB0aW9uLWJhc2VkCi0gICAgICogY29udGVudC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQSBtZWRpYSBpdGVtIGluIHRoZSBlcnJvciBzdGF0ZSBjYW5ub3QgYmUgcmVzdW1lZC4gIFRvIHBsYXkgdGhlIGNvbnRlbnQgYWdhaW4sCi0gICAgICogdGhlIGFwcGxpY2F0aW9uIG11c3Qgc2VuZCBhIG5ldyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIHBsYXl9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBhY3Rpb24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUQVRFX0VSUk9SID0gNzsKLQotICAgIC8qKgotICAgICAqIEludGVnZXIgZXh0cmE6IEhUVFAgc3RhdHVzIGNvZGUuCi0gICAgICogPHA+Ci0gICAgICogU3BlY2lmaWVzIHRoZSBIVFRQIHN0YXR1cyBjb2RlIHRoYXQgd2FzIGVuY291bnRlcmVkIHdoZW4gdGhlIGNvbnRlbnQKLSAgICAgKiB3YXMgcmVxdWVzdGVkIGFmdGVyIGFsbCByZWRpcmVjdHMgd2VyZSBmb2xsb3dlZC4gIFRoaXMga2V5IG9ubHkgbmVlZHMgdG8KLSAgICAgKiBzcGVjaWZpZWQgd2hlbiB0aGUgY29udGVudCB1cmkgdXNlcyB0aGUgSFRUUCBvciBIVFRQUyBzY2hlbWUgYW5kIGFuIGVycm9yCi0gICAgICogb2NjdXJyZWQuICBUaGlzIGtleSBtYXkgYmUgb21pdHRlZCBpZiB0aGUgY29udGVudCB3YXMgYWJsZSB0byBiZSBwbGF5ZWQKLSAgICAgKiBzdWNjZXNzZnVsbHk7IHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVwb3J0IGEgMjAwIChPSykgc3RhdHVzIGNvZGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyIEhUVFAgc3RhdHVzIGNvZGUsIHN1Y2ggYXMgNDAxIChVbmF1dGhvcml6ZWQpLAotICAgICAqIDQwNCAoTm90IEZvdW5kKSwgb3IgNTAwIChTZXJ2ZXIgRXJyb3IpLCBvciAwIGlmIG5vbmUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0hUVFBfU1RBVFVTX0NPREUgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuc3RhdHVzLmV4dHJhLkhUVFBfU1RBVFVTX0NPREUiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBIVFRQIHJlc3BvbnNlIGhlYWRlcnMuCi0gICAgICogPHA+Ci0gICAgICogU3BlY2lmaWVzIHRoZSBIVFRQIHJlc3BvbnNlIGhlYWRlcnMgdGhhdCB3ZXJlIHJldHVybmVkIHdoZW4gdGhlIGNvbnRlbnQgd2FzCi0gICAgICogcmVxdWVzdGVkIGZyb20gdGhlIG5ldHdvcmsuICBUaGUgaGVhZGVycyBtYXkgaW5jbHVkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgICogYWJvdXQgdGhlIGNvbnRlbnQgb3IgYW55IGVycm9ycyBjb25kaXRpb25zIHRoYXQgd2VyZSBlbmNvdW50ZXJlZCB3aGlsZQotICAgICAqIHRyeWluZyB0byBmZXRjaCB0aGUgY29udGVudC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBzdHJpbmcgYmFzZWQga2V5LXZhbHVlIHBhaXJzCi0gICAgICogdGhhdCBkZXNjcmliZSB0aGUgSFRUUCByZXNwb25zZSBoZWFkZXJzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9IVFRQX1JFU1BPTlNFX0hFQURFUlMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuc3RhdHVzLmV4dHJhLkhUVFBfUkVTUE9OU0VfSEVBREVSUyI7Ci0KLSAgICBNZWRpYUl0ZW1TdGF0dXMoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRpbWVzdGFtcCBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXR1cyBpbmZvcm1hdGlvbiBpbgotICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSBib290IGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lfSB0aW1lIGJhc2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0dXMgdGltZXN0YW1wIGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lKCl9IHRpbWUgYmFzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRUaW1lc3RhbXAoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoS0VZX1RJTUVTVEFNUCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcGxheWJhY2sgc3RhdGUgb2YgdGhlIG1lZGlhIGl0ZW0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBwbGF5YmFjayBzdGF0ZS4gIE9uZSBvZiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX1BFTkRJTkd9LAotICAgICAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUExBWUlOR30sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEFVU0VEfSwKLSAgICAgKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0JVRkZFUklOR30sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRklOSVNIRUR9LAotICAgICAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfQ0FOQ0VMRUR9LCB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0lOVkFMSURBVEVEfSwKLSAgICAgKiBvciB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0VSUk9SfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrU3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfUExBWUJBQ0tfU1RBVEUsIFBMQVlCQUNLX1NUQVRFX0VSUk9SKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMKLSAgICAgKiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRlbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGluIG1pbGxpc2Vjb25kcywgb3IgLTEgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRDb250ZW50UG9zaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoS0VZX0NPTlRFTlRfUE9TSVRJT04sIC0xKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgY29udGVudCB0byBiZSBwbGF5ZWQgYXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mCi0gICAgICogbWlsbGlzZWNvbmRzLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudCBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMsIG9yIC0xIGlmIHVua25vd24uCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0Q29udGVudER1cmF0aW9uKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRMb25nKEtFWV9DT05URU5UX0RVUkFUSU9OLCAtMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgc3RhdHVzIG9iamVjdC4KLSAgICAgKiBUaGUgZXh0cmFzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbWVkaWEgcm91dGVyIGJ1dCB0aGV5IG1heSBiZSB1c2VkCi0gICAgICogYnkgYXBwbGljYXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCdW5kbGUoS0VZX0VYVFJBUyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYUl0ZW1TdGF0dXN7ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJ0aW1lc3RhbXA9Iik7Ci0gICAgICAgIFRpbWVVdGlscy5mb3JtYXREdXJhdGlvbihTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSAtIGdldFRpbWVzdGFtcCgpLCByZXN1bHQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgbXMgYWdvIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcGxheWJhY2tTdGF0ZT0iKS5hcHBlbmQocGxheWJhY2tTdGF0ZVRvU3RyaW5nKGdldFBsYXliYWNrU3RhdGUoKSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGNvbnRlbnRQb3NpdGlvbj0iKS5hcHBlbmQoZ2V0Q29udGVudFBvc2l0aW9uKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGNvbnRlbnREdXJhdGlvbj0iKS5hcHBlbmQoZ2V0Q29udGVudER1cmF0aW9uKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGV4dHJhcz0iKS5hcHBlbmQoZ2V0RXh0cmFzKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBsYXliYWNrU3RhdGVUb1N0cmluZyhpbnQgcGxheWJhY2tTdGF0ZSkgewotICAgICAgICBzd2l0Y2ggKHBsYXliYWNrU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfUEVORElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gInBlbmRpbmciOwotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9CVUZGRVJJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJidWZmZXJpbmciOwotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAicGxheWluZyI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX1BBVVNFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gInBhdXNlZCI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0ZJTklTSEVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiZmluaXNoZWQiOwotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9DQU5DRUxFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImNhbmNlbGVkIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkYXRlZCI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0VSUk9SOgotICAgICAgICAgICAgICAgIHJldHVybiAiZXJyb3IiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHBsYXliYWNrU3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhSXRlbVN0YXR1cyBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZSAhPSBudWxsID8gbmV3IE1lZGlhSXRlbVN0YXR1cyhidW5kbGUpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzIG1lZGlhIGl0ZW0gc3RhdHVzIG9iamVjdHN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBpdGVtIHN0YXR1cyBidWlsZGVyIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUgYXMgdGhlCi0gICAgICAgICAqIHJlZmVyZW5jZSB0aW1lc3RhbXAuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBwbGF5YmFja1N0YXRlIFRoZSBpdGVtIHBsYXliYWNrIHN0YXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoaW50IHBsYXliYWNrU3RhdGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBzZXRUaW1lc3RhbXAoU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkpOwotICAgICAgICAgICAgc2V0UGxheWJhY2tTdGF0ZShwbGF5YmFja1N0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgaXRlbSBzdGF0dXMgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBzdGF0dXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihNZWRpYUl0ZW1TdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGF0dXMgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShzdGF0dXMubUJ1bmRsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCi0gICAgICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSBib290IGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lfSB0aW1lIGJhc2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRUaW1lc3RhbXAobG9uZyBlbGFwc2VkUmVhbHRpbWVUaW1lc3RhbXApIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhLRVlfVElNRVNUQU1QLCBlbGFwc2VkUmVhbHRpbWVUaW1lc3RhbXApOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcGxheWJhY2sgc3RhdGUgb2YgdGhlIG1lZGlhIGl0ZW0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQbGF5YmFja1N0YXRlKGludCBwbGF5YmFja1N0YXRlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfUExBWUJBQ0tfU1RBVEUsIHBsYXliYWNrU3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgY29udGVudCBwbGF5YmFjayBwb3NpdGlvbiBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YgbWlsbGlzZWNvbmRzCi0gICAgICAgICAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENvbnRlbnRQb3NpdGlvbihsb25nIHBvc2l0aW9uTWlsbGlzZWNvbmRzKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dExvbmcoS0VZX0NPTlRFTlRfUE9TSVRJT04sIHBvc2l0aW9uTWlsbGlzZWNvbmRzKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBjb250ZW50IHRvIGJlIHBsYXllZCBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIKLSAgICAgICAgICogb2YgbWlsbGlzZWNvbmRzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29udGVudER1cmF0aW9uKGxvbmcgZHVyYXRpb25NaWxsaXNlY29uZHMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhLRVlfQ09OVEVOVF9EVVJBVElPTiwgZHVyYXRpb25NaWxsaXNlY29uZHMpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgc3RhdHVzIG9iamVjdC4KLSAgICAgICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAotICAgICAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXMoQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCdW5kbGUoS0VZX0VYVFJBUywgZXh0cmFzKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyBtZWRpYSBpdGVtIHN0YXR1cyBvYmplY3R9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lZGlhSXRlbVN0YXR1cyBidWlsZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtU3RhdHVzKG1CdW5kbGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEZXNjcmlwdG9yLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJjODRmYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIHByb3BlcnRpZXMgb2YgYSByb3V0ZS4KLSAqIDxwPgotICogRWFjaCByb3V0ZSBpcyB1bmlxdWVseSBpZGVudGlmaWVkIGJ5IGFuIG9wYXF1ZSBpZCBzdHJpbmcuICBUaGlzIHRva2VuCi0gKiBtYXkgdGFrZSBhbnkgZm9ybSBhcyBsb25nIGFzIGl0IGlzIHVuaXF1ZSB3aXRoaW4gdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICogPC9wPjxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVEZXNjcmlwdG9yIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JRCA9ICJpZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfR1JPVVBfTUVNQkVSX0lEUyA9ICJncm91cE1lbWJlcklkcyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkFNRSA9ICJuYW1lIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVNDUklQVElPTiA9ICJzdGF0dXMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lDT05fVVJJID0gImljb25VcmkiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VOQUJMRUQgPSAiZW5hYmxlZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OTkVDVElORyA9ICJjb25uZWN0aW5nIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05ORUNUSU9OX1NUQVRFID0gImNvbm5lY3Rpb25TdGF0ZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVFJPTF9GSUxURVJTID0gImNvbnRyb2xGaWx0ZXJzIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19UWVBFID0gInBsYXliYWNrVHlwZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBWUJBQ0tfU1RSRUFNID0gInBsYXliYWNrU3RyZWFtIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVZJQ0VfVFlQRSA9ICJkZXZpY2VUeXBlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WT0xVTUUgPSAidm9sdW1lIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WT0xVTUVfTUFYID0gInZvbHVtZU1heCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVk9MVU1FX0hBTkRMSU5HID0gInZvbHVtZUhhbmRsaW5nIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QUkVTRU5UQVRJT05fRElTUExBWV9JRCA9ICJwcmVzZW50YXRpb25EaXNwbGF5SWQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYVFJBUyA9ICJleHRyYXMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NBTl9ESVNDT05ORUNUID0gImNhbkRpc2Nvbm5lY3QiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFVFRJTkdTX0lOVEVOVCA9ICJzZXR0aW5nc0ludGVudCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUlOX0NMSUVOVF9WRVJTSU9OID0gIm1pbkNsaWVudFZlcnNpb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01BWF9DTElFTlRfVkVSU0lPTiA9ICJtYXhDbGllbnRWZXJzaW9uIjsKLQotICAgIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgIExpc3Q8SW50ZW50RmlsdGVyPiBtQ29udHJvbEZpbHRlcnM7Ci0KLSAgICBNZWRpYVJvdXRlRGVzY3JpcHRvcihCdW5kbGUgYnVuZGxlLCBMaXN0PEludGVudEZpbHRlcj4gY29udHJvbEZpbHRlcnMpIHsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICAgICAgbUNvbnRyb2xGaWx0ZXJzID0gY29udHJvbEZpbHRlcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcm91dGUgaWQgYXNzb2NpYXRlZCB3aXRoIGEgcm91dGUgZGVzY3JpcHRvciBmdW5jdGlvbnMgYXMgYSBzdGFibGUKLSAgICAgKiBpZGVudGlmaWVyIGZvciB0aGUgcm91dGUgYW5kIG11c3QgYmUgdW5pcXVlIGFtb25nIGFsbCByb3V0ZXMgb2ZmZXJlZAotICAgICAqIGJ5IHRoZSBwcm92aWRlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0U3RyaW5nKEtFWV9JRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZ3JvdXAgbWVtYmVyIGlkcyBvZiB0aGUgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogQSByb3V0ZSBkZXNjcmlwdG9yIHRoYXQgaGFzIG9uZSBvciBtb3JlIGdyb3VwIG1lbWJlciByb3V0ZSBpZHMKLSAgICAgKiByZXByZXNlbnRzIGEgcm91dGUgZ3JvdXAuIEEgbWVtYmVyIHJvdXRlIG1heSBiZWxvbmcgdG8gYW5vdGhlciBncm91cC4KLSAgICAgKiA8L3A+Ci0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0R3JvdXBNZW1iZXJJZHMoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldFN0cmluZ0FycmF5TGlzdChLRVlfR1JPVVBfTUVNQkVSX0lEUyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhlIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSByb3V0ZSBuYW1lIGlkZW50aWZpZXMgdGhlIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KLSAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIG5hbWUsIGFuIGFsaWFzLCBvciBkZXZpY2Ugc2VyaWFsIG51bWJlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRTdHJpbmcoS0VZX05BTUUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHVzZXItdmlzaWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJvdXRlIGRlc2NyaXB0aW9uIGRlc2NyaWJlcyB0aGUga2luZCBvZiBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICogSXQgbWF5IGJlIGEgdXNlci1zdXBwbGllZCBzdHJpbmcsIGEgbW9kZWwgbnVtYmVyIG9yIGJyYW5kIG9mIGRldmljZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0U3RyaW5nKEtFWV9ERVNDUklQVElPTik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgVVJJIG9mIHRoZSBpY29uIHJlcHJlc2VudGluZyB0aGlzIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaWNvbiB3aWxsIGJlIHVzZWQgaW4gcGlja2VyIFVJcyBpZiBhdmFpbGFibGUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBVcmkgZ2V0SWNvblVyaSgpIHsKLSAgICAgICAgU3RyaW5nIGljb25VcmkgPSBtQnVuZGxlLmdldFN0cmluZyhLRVlfSUNPTl9VUkkpOwotICAgICAgICByZXR1cm4gaWNvblVyaSA9PSBudWxsID8gbnVsbCA6IFVyaS5wYXJzZShpY29uVXJpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIGVuYWJsZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCb29sZWFuKEtFWV9FTkFCTEVELCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIGNvbm5lY3RpbmcuCi0gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0Q29ubmVjdGlvblN0YXRlfSBpbnN0ZWFkCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oS0VZX0NPTk5FQ1RJTkcsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSByb3V0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhpcyByb3V0ZToKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElOR30sIG9yCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRH0uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uU3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfQ09OTkVDVElPTl9TVEFURSwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciB0aGUgcm91dGUgY2FuIGJlIGRpc2Nvbm5lY3RlZCB3aXRob3V0IHN0b3BwaW5nIHBsYXliYWNrLgotICAgICAqIDxwPgotICAgICAqIFRoZSByb3V0ZSBjYW4gbm9ybWFsbHkgYmUgZGlzY29ubmVjdGVkIHdpdGhvdXQgc3RvcHBpbmcgcGxheWJhY2sgd2hlbgotICAgICAqIHRoZSBkZXN0aW5hdGlvbiBkZXZpY2Ugb24gdGhlIHJvdXRlIGlzIGNvbm5lY3RlZCB0byB0d28gb3IgbW9yZSBzb3VyY2UKLSAgICAgKiBkZXZpY2VzLiBUaGUgcm91dGUgcHJvdmlkZXIgc2hvdWxkIHVwZGF0ZSB0aGUgcm91dGUgaW1tZWRpYXRlbHkgd2hlbiB0aGUKLSAgICAgKiBudW1iZXIgb2YgY29ubmVjdGVkIGRldmljZXMgY2hhbmdlcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVG8gc3BlY2lmeSB0aGF0IHRoZSByb3V0ZSBzaG91bGQgZGlzY29ubmVjdCB3aXRob3V0IHN0b3BwaW5nIHVzZQotICAgICAqIHtAbGluayBNZWRpYVJvdXRlciN1bnNlbGVjdChpbnQpfSB3aXRoCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ESVNDT05ORUNURUR9LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5EaXNjb25uZWN0QW5kS2VlcFBsYXlpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oS0VZX0NBTl9ESVNDT05ORUNULCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiB7QGxpbmsgSW50ZW50U2VuZGVyfSBmb3Igc3RhcnRpbmcgYSBzZXR0aW5ncyBhY3Rpdml0eSBmb3IgdGhpcwotICAgICAqIHJvdXRlLiBUaGUgYWN0aXZpdHkgbWF5IGhhdmUgc3BlY2lmaWMgcm91dGUgc2V0dGluZ3Mgb3IgZ2VuZXJhbCBzZXR0aW5ncwotICAgICAqIGZvciB0aGUgY29ubmVjdGVkIGRldmljZSBvciByb3V0ZSBwcm92aWRlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQW4ge0BsaW5rIEludGVudFNlbmRlcn0gdG8gc3RhcnQgYSBzZXR0aW5ncyBhY3Rpdml0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW50ZW50U2VuZGVyIGdldFNldHRpbmdzQWN0aXZpdHkoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldFBhcmNlbGFibGUoS0VZX1NFVFRJTkdTX0lOVEVOVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcm91dGUncyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fSBmaWx0ZXJzLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEludGVudEZpbHRlcj4gZ2V0Q29udHJvbEZpbHRlcnMoKSB7Ci0gICAgICAgIGVuc3VyZUNvbnRyb2xGaWx0ZXJzKCk7Ci0gICAgICAgIHJldHVybiBtQ29udHJvbEZpbHRlcnM7Ci0gICAgfQotCi0gICAgdm9pZCBlbnN1cmVDb250cm9sRmlsdGVycygpIHsKLSAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMgPSBtQnVuZGxlLjxJbnRlbnRGaWx0ZXI+Z2V0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfQ09OVFJPTF9GSUxURVJTKTsKLSAgICAgICAgICAgIGlmIChtQ29udHJvbEZpbHRlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycyA9IENvbGxlY3Rpb25zLjxJbnRlbnRGaWx0ZXI+ZW1wdHlMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgdHlwZSBvZiBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZToKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1RZUEVfTE9DQUx9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19UWVBFX1JFTU9URX0uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQbGF5YmFja1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfUExBWUJBQ0tfVFlQRSwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1RZUEVfUkVNT1RFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIHBsYXliYWNrIHN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrU3RyZWFtKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX1BMQVlCQUNLX1NUUkVBTSwgLTEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZToKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0RFVklDRV9UWVBFX1RWfSBvcgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jREVWSUNFX1RZUEVfU1BFQUtFUn0uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXREZXZpY2VUeXBlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX0RFVklDRV9UWVBFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIGN1cnJlbnQgdm9sdW1lLCBvciAwIGlmIHVua25vd24uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRWb2x1bWUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfVk9MVU1FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIG1heGltdW0gdm9sdW1lLCBvciAwIGlmIHVua25vd24uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRWb2x1bWVNYXgoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfVk9MVU1FX01BWCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBob3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBIb3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlOgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVk9MVU1FX0ZJWEVEfSBvcgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZvbHVtZUhhbmRsaW5nKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX1ZPTFVNRV9IQU5ETElORywKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVk9MVU1FX0ZJWEVEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIHByZXNlbnRhdGlvbiBkaXNwbGF5IGlkLCBvciAtMSBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoCi0gICAgICAgICAgICAgICAgS0VZX1BSRVNFTlRBVElPTl9ESVNQTEFZX0lELCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUFJFU0VOVEFUSU9OX0RJU1BMQVlfSURfTk9ORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgcm91dGUgZGVzY3JpcHRvci4KLSAgICAgKiBUaGUgZXh0cmFzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbWVkaWEgcm91dGVyIGJ1dCB0aGV5IG1heSBiZSB1c2VkCi0gICAgICogYnkgYXBwbGljYXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCdW5kbGUoS0VZX0VYVFJBUyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWluaW11bSBjbGllbnQgdmVyc2lvbiByZXF1aXJlZCBmb3IgdGhpcyByb3V0ZS4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgcHVibGljIGludCBnZXRNaW5DbGllbnRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX01JTl9DTElFTlRfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfVkVSU0lPTl9TVEFSVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWF4aW11bSBjbGllbnQgdmVyc2lvbiByZXF1aXJlZCBmb3IgdGhpcyByb3V0ZS4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgcHVibGljIGludCBnZXRNYXhDbGllbnRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX01BWF9DTElFTlRfVkVSU0lPTiwgSW50ZWdlci5NQVhfVkFMVUUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgZGVzY3JpcHRvciBoYXMgYWxsIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbEZpbHRlcnMoKTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGdldElkKCkpCi0gICAgICAgICAgICAgICAgfHwgVGV4dFV0aWxzLmlzRW1wdHkoZ2V0TmFtZSgpKQotICAgICAgICAgICAgICAgIHx8IG1Db250cm9sRmlsdGVycy5jb250YWlucyhudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiTWVkaWFSb3V0ZURlc2NyaXB0b3J7ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJpZD0iKS5hcHBlbmQoZ2V0SWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZ3JvdXBNZW1iZXJJZHM9IikuYXBwZW5kKGdldEdyb3VwTWVtYmVySWRzKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIG5hbWU9IikuYXBwZW5kKGdldE5hbWUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb249IikuYXBwZW5kKGdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGljb25Vcmk9IikuYXBwZW5kKGdldEljb25VcmkoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaXNFbmFibGVkPSIpLmFwcGVuZChpc0VuYWJsZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaXNDb25uZWN0aW5nPSIpLmFwcGVuZChpc0Nvbm5lY3RpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29ubmVjdGlvblN0YXRlPSIpLmFwcGVuZChnZXRDb25uZWN0aW9uU3RhdGUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29udHJvbEZpbHRlcnM9IikuYXBwZW5kKEFycmF5cy50b1N0cmluZyhnZXRDb250cm9sRmlsdGVycygpLnRvQXJyYXkoKSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHBsYXliYWNrVHlwZT0iKS5hcHBlbmQoZ2V0UGxheWJhY2tUeXBlKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHBsYXliYWNrU3RyZWFtPSIpLmFwcGVuZChnZXRQbGF5YmFja1N0cmVhbSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBkZXZpY2VUeXBlPSIpLmFwcGVuZChnZXREZXZpY2VUeXBlKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHZvbHVtZT0iKS5hcHBlbmQoZ2V0Vm9sdW1lKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHZvbHVtZU1heD0iKS5hcHBlbmQoZ2V0Vm9sdW1lTWF4KCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHZvbHVtZUhhbmRsaW5nPSIpLmFwcGVuZChnZXRWb2x1bWVIYW5kbGluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBwcmVzZW50YXRpb25EaXNwbGF5SWQ9IikuYXBwZW5kKGdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBleHRyYXM9IikuYXBwZW5kKGdldEV4dHJhcygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc1ZhbGlkPSIpLmFwcGVuZChpc1ZhbGlkKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIG1pbkNsaWVudFZlcnNpb249IikuYXBwZW5kKGdldE1pbkNsaWVudFZlcnNpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbWF4Q2xpZW50VmVyc2lvbj0iKS5hcHBlbmQoZ2V0TWF4Q2xpZW50VmVyc2lvbigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVEZXNjcmlwdG9yIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IoYnVuZGxlLCBudWxsKSA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRlciBmb3Ige0BsaW5rIE1lZGlhUm91dGVEZXNjcmlwdG9yIG1lZGlhIHJvdXRlIGRlc2NyaXB0b3JzfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1Hcm91cE1lbWJlcklkczsKLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPiBtQ29udHJvbEZpbHRlcnM7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBkZXNjcmlwdG9yIGJ1aWxkZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpZCBUaGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBzZXRJZChpZCk7Ci0gICAgICAgICAgICBzZXROYW1lKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBkZXNjcmlwdG9yIGJ1aWxkZXIgd2hvc2UgaW5pdGlhbCBjb250ZW50cyBhcmUKLSAgICAgICAgICogY29waWVkIGZyb20gYW4gZXhpc3RpbmcgZGVzY3JpcHRvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhUm91dGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkZXNjcmlwdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoZGVzY3JpcHRvci5tQnVuZGxlKTsKLQotICAgICAgICAgICAgZGVzY3JpcHRvci5lbnN1cmVDb250cm9sRmlsdGVycygpOwotICAgICAgICAgICAgaWYgKCFkZXNjcmlwdG9yLm1Db250cm9sRmlsdGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PEludGVudEZpbHRlcj4oZGVzY3JpcHRvci5tQ29udHJvbEZpbHRlcnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHVuaXF1ZSBpZCBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcm91dGUgaWQgYXNzb2NpYXRlZCB3aXRoIGEgcm91dGUgZGVzY3JpcHRvciBmdW5jdGlvbnMgYXMgYSBzdGFibGUKLSAgICAgICAgICogaWRlbnRpZmllciBmb3IgdGhlIHJvdXRlIGFuZCBtdXN0IGJlIHVuaXF1ZSBhbW9uZyBhbGwgcm91dGVzIG9mZmVyZWQKLSAgICAgICAgICogYnkgdGhlIHByb3ZpZGVyLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0U3RyaW5nKEtFWV9JRCwgaWQpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIGdyb3VwIG1lbWJlciBpZCBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBBIHJvdXRlIGRlc2NyaXB0b3IgdGhhdCBoYXMgb25lIG9yIG1vcmUgZ3JvdXAgbWVtYmVyIHJvdXRlIGlkcwotICAgICAgICAgKiByZXByZXNlbnRzIGEgcm91dGUgZ3JvdXAuIEEgbWVtYmVyIHJvdXRlIG1heSBiZWxvbmcgdG8gYW5vdGhlciBncm91cC4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkR3JvdXBNZW1iZXJJZChTdHJpbmcgZ3JvdXBNZW1iZXJJZCkgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGdyb3VwTWVtYmVySWQpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZ3JvdXBNZW1iZXJJZCBtdXN0IG5vdCBiZSBlbXB0eSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVySWRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJJZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUdyb3VwTWVtYmVySWRzLmNvbnRhaW5zKGdyb3VwTWVtYmVySWQpKSB7Ci0gICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVySWRzLmFkZChncm91cE1lbWJlcklkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSBsaXN0IG9mIGdyb3VwIG1lbWJlciBpZHMgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogQSByb3V0ZSBkZXNjcmlwdG9yIHRoYXQgaGFzIG9uZSBvciBtb3JlIGdyb3VwIG1lbWJlciByb3V0ZSBpZHMKLSAgICAgICAgICogcmVwcmVzZW50cyBhIHJvdXRlIGdyb3VwLiBBIG1lbWJlciByb3V0ZSBtYXkgYmVsb25nIHRvIGFub3RoZXIgZ3JvdXAuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZEdyb3VwTWVtYmVySWRzKENvbGxlY3Rpb248U3RyaW5nPiBncm91cE1lbWJlcklkcykgewotICAgICAgICAgICAgaWYgKGdyb3VwTWVtYmVySWRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJncm91cE1lbWJlcklkcyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZ3JvdXBNZW1iZXJJZHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZ3JvdXBNZW1iZXJJZCA6IGdyb3VwTWVtYmVySWRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEdyb3VwTWVtYmVySWQoZ3JvdXBNZW1iZXJJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJvdXRlIG5hbWUgaWRlbnRpZmllcyB0aGUgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdXRlLgotICAgICAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIG5hbWUsIGFuIGFsaWFzLCBvciBkZXZpY2Ugc2VyaWFsIG51bWJlci4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoS0VZX05BTUUsIG5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdXNlci12aXNpYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByb3V0ZSBkZXNjcmlwdGlvbiBkZXNjcmliZXMgdGhlIGtpbmQgb2YgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdXRlLgotICAgICAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIHN0cmluZywgYSBtb2RlbCBudW1iZXIgb3IgYnJhbmQgb2YgZGV2aWNlLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0U3RyaW5nKEtFWV9ERVNDUklQVElPTiwgZGVzY3JpcHRpb24pOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgVVJJIG9mIHRoZSBpY29uIHJlcHJlc2VudGluZyB0aGlzIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhpcyBpY29uIHdpbGwgYmUgdXNlZCBpbiBwaWNrZXIgVUlzIGlmIGF2YWlsYWJsZS4KLSAgICAgICAgICogPC9wPjxwPgotICAgICAgICAgKiBUaGUgVVJJIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0czoKLSAgICAgICAgICogPHVsPgotICAgICAgICAgKiA8bGk+Y29udGVudCAoe0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIjU0NIRU1FX0NPTlRFTlR9KTwvbGk+Ci0gICAgICAgICAqIDxsaT5hbmRyb2lkLnJlc291cmNlICh7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNTQ0hFTUVfQU5EUk9JRF9SRVNPVVJDRX0pCi0gICAgICAgICAqIDwvbGk+Ci0gICAgICAgICAqIDxsaT5maWxlICh7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNTQ0hFTUVfRklMRX0pPC9saT4KLSAgICAgICAgICogPC91bD4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0SWNvblVyaShVcmkgaWNvblVyaSkgewotICAgICAgICAgICAgaWYgKGljb25VcmkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImljb25VcmkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoS0VZX0lDT05fVVJJLCBpY29uVXJpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBpcyBlbmFibGVkLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogRGlzYWJsZWQgcm91dGVzIHJlcHJlc2VudCByb3V0ZXMgdGhhdCBhIHJvdXRlIHByb3ZpZGVyIGtub3dzIGFib3V0LCBzdWNoIGFzIHBhaXJlZAotICAgICAgICAgKiBXaWZpIERpc3BsYXkgcmVjZWl2ZXJzLCBidXQgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0Qm9vbGVhbihLRVlfRU5BQkxFRCwgZW5hYmxlZCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmcgYW5kIGlzIG5vdCB5ZXQKLSAgICAgICAgICogcmVhZHkgZm9yIHVzZS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjc2V0Q29ubmVjdGlvblN0YXRlfSBpbnN0ZWFkLgotICAgICAgICAgKi8KLSAgICAgICAgQERlcHJlY2F0ZWQKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29ubmVjdGluZyhib29sZWFuIGNvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0Qm9vbGVhbihLRVlfQ09OTkVDVElORywgY29ubmVjdGluZyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIGNvbm5lY3Rpb24gc3RhdGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uU3RhdGUgVGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEfSwKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkd9LCBvcgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENvbm5lY3Rpb25TdGF0ZShpbnQgY29ubmVjdGlvblN0YXRlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfQ09OTkVDVElPTl9TVEFURSwgY29ubmVjdGlvblN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgd2hldGhlciB0aGUgcm91dGUgY2FuIGJlIGRpc2Nvbm5lY3RlZCB3aXRob3V0IHN0b3BwaW5nIHBsYXliYWNrLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q2FuRGlzY29ubmVjdChib29sZWFuIGNhbkRpc2Nvbm5lY3QpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0Qm9vbGVhbihLRVlfQ0FOX0RJU0NPTk5FQ1QsIGNhbkRpc2Nvbm5lY3QpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhbiBpbnRlbnQgc2VuZGVyIGZvciBsYXVuY2hpbmcgdGhlIHNldHRpbmdzIGFjdGl2aXR5IGZvciB0aGlzCi0gICAgICAgICAqIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0U2V0dGluZ3NBY3Rpdml0eShJbnRlbnRTZW5kZXIgaXMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0UGFyY2VsYWJsZShLRVlfU0VUVElOR1NfSU5URU5ULCBpcyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0gZmlsdGVyIGZvciB0aGUgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDb250cm9sRmlsdGVyKEludGVudEZpbHRlciBmaWx0ZXIpIHsKLSAgICAgICAgICAgIGlmIChmaWx0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZpbHRlciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtQ29udHJvbEZpbHRlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtQ29udHJvbEZpbHRlcnMuY29udGFpbnMoZmlsdGVyKSkgewotICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycy5hZGQoZmlsdGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSBsaXN0IG9mIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9IGZpbHRlcnMgZm9yIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENvbnRyb2xGaWx0ZXJzKENvbGxlY3Rpb248SW50ZW50RmlsdGVyPiBmaWx0ZXJzKSB7Ci0gICAgICAgICAgICBpZiAoZmlsdGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmlsdGVycyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZmlsdGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEludGVudEZpbHRlciBmaWx0ZXIgOiBmaWx0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENvbnRyb2xGaWx0ZXIoZmlsdGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIHBsYXliYWNrIHR5cGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBwbGF5YmFja1R5cGUgVGhlIHBsYXliYWNrIHR5cGUgb2YgdGhlIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1RZUEVfTE9DQUx9IG9yCi0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVFlQRV9SRU1PVEV9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UGxheWJhY2tUeXBlKGludCBwbGF5YmFja1R5cGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9QTEFZQkFDS19UWVBFLCBwbGF5YmFja1R5cGUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBwbGF5YmFjayBzdHJlYW0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQbGF5YmFja1N0cmVhbShpbnQgcGxheWJhY2tTdHJlYW0pIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9QTEFZQkFDS19TVFJFQU0sIHBsYXliYWNrU3RyZWFtKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgcmVjZWl2ZXIgZGV2aWNlIHR5cGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkZXZpY2VUeXBlIFRoZSByZWNlaXZlIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZToKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNERVZJQ0VfVFlQRV9UVn0gb3IKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNERVZJQ0VfVFlQRV9TUEVBS0VSfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERldmljZVR5cGUoaW50IGRldmljZVR5cGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9ERVZJQ0VfVFlQRSwgZGV2aWNlVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIGN1cnJlbnQgdm9sdW1lLCBvciAwIGlmIHVua25vd24uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRWb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1ZPTFVNRSwgdm9sdW1lKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgbWF4aW11bSB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFZvbHVtZU1heChpbnQgdm9sdW1lTWF4KSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfVk9MVU1FX01BWCwgdm9sdW1lTWF4KTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3Mgdm9sdW1lIGhhbmRsaW5nLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdm9sdW1lSGFuZGxpbmcgaG93IHZvbHVtZSBpcyBoYW5kbGVkIG9uIHRoZSByb3V0ZToKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfRklYRUR9IG9yCi0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFZvbHVtZUhhbmRsaW5nKGludCB2b2x1bWVIYW5kbGluZykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1ZPTFVNRV9IQU5ETElORywgdm9sdW1lSGFuZGxpbmcpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBwcmVzZW50YXRpb24gZGlzcGxheSBpZCwgb3IgLTEgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFByZXNlbnRhdGlvbkRpc3BsYXlJZChpbnQgcHJlc2VudGF0aW9uRGlzcGxheUlkKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfUFJFU0VOVEFUSU9OX0RJU1BMQVlfSUQsIHByZXNlbnRhdGlvbkRpc3BsYXlJZCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyByb3V0ZSBkZXNjcmlwdG9yLgotICAgICAgICAgKiBUaGUgZXh0cmFzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbWVkaWEgcm91dGVyIGJ1dCB0aGV5IG1heSBiZSB1c2VkCi0gICAgICAgICAqIGJ5IGFwcGxpY2F0aW9ucy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4dHJhcyhCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShLRVlfRVhUUkFTLCBleHRyYXMpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBtaW5pbXVtIGNsaWVudCB2ZXJzaW9uLgotICAgICAgICAgKiBBIHJvdXRlciB3aG9zZSB2ZXJzaW9uIGlzIGxvd2VyIHRoYW4gdGhpcyB3aWxsIG5vdCBiZSBhYmxlIHRvIGNvbm5lY3QgdG8gdGhpcyByb3V0ZS4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1pbkNsaWVudFZlcnNpb24oaW50IG1pblZlcnNpb24pIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9NSU5fQ0xJRU5UX1ZFUlNJT04sIG1pblZlcnNpb24pOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBtYXhpbXVtIGNsaWVudCB2ZXJzaW9uLgotICAgICAgICAgKiBBIHJvdXRlciB3aG9zZSB2ZXJzaW9uIGlzIGhpZ2hlciB0aGFuIHRoaXMgd2lsbCBub3QgYmUgYWJsZSB0byBjb25uZWN0IHRvIHRoaXMgcm91dGUuCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRNYXhDbGllbnRWZXJzaW9uKGludCBtYXhWZXJzaW9uKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfTUFYX0NMSUVOVF9WRVJTSU9OLCBtYXhWZXJzaW9uKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhUm91dGVEZXNjcmlwdG9yIG1lZGlhIHJvdXRlIGRlc2NyaXB0b3J9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVEZXNjcmlwdG9yIGJ1aWxkKCkgewotICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJ1bmRsZS5wdXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9DT05UUk9MX0ZJTFRFUlMsIG1Db250cm9sRmlsdGVycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVySWRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQnVuZGxlLnB1dFN0cmluZ0FycmF5TGlzdChLRVlfR1JPVVBfTUVNQkVSX0lEUywgbUdyb3VwTWVtYmVySWRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IobUJ1bmRsZSwgbUNvbnRyb2xGaWx0ZXJzKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzOTYyN2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIG1lZGlhIHJvdXRlciB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyCi0gKiBhbmQgd2hldGhlciB0byBwZXJmb3JtIGFjdGl2ZSBzY2FubmluZy4KLSAqIDxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFTEVDVE9SID0gInNlbGVjdG9yIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FDVElWRV9TQ0FOID0gImFjdGl2ZVNjYW4iOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgZGlzY292ZXJ5IHJlcXVlc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHJvdXRlIHNlbGVjdG9yIHRoYXQgc3BlY2lmaWVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdG8gZGlzY292ZXIuCi0gICAgICogQHBhcmFtIGFjdGl2ZVNjYW4gVHJ1ZSBpZiBhY3RpdmUgc2Nhbm5pbmcgc2hvdWxkIGJlIHBlcmZvcm1lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBib29sZWFuIGFjdGl2ZVNjYW4pIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShLRVlfU0VMRUNUT1IsIHNlbGVjdG9yLmFzQnVuZGxlKCkpOwotICAgICAgICBtQnVuZGxlLnB1dEJvb2xlYW4oS0VZX0FDVElWRV9TQ0FOLCBhY3RpdmVTY2FuKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSBzZWxlY3RvciB0aGF0IHNwZWNpZmllcyB0aGUga2luZHMgb2Ygcm91dGVzIHRvIGRpc2NvdmVyLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZ2V0U2VsZWN0b3IoKSB7Ci0gICAgICAgIGVuc3VyZVNlbGVjdG9yKCk7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVNlbGVjdG9yKCkgewotICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5mcm9tQnVuZGxlKG1CdW5kbGUuZ2V0QnVuZGxlKEtFWV9TRUxFQ1RPUikpOwotICAgICAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIGFjdGl2ZSBzY2FubmluZyBzaG91bGQgYmUgcGVyZm9ybWVkLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZVNjYW4oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oS0VZX0FDVElWRV9TQ0FOKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRpc2NvdmVyeSByZXF1ZXN0IGhhcyBhbGwgb2YgdGhlIHJlcXVpcmVkIGZpZWxkcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICBlbnN1cmVTZWxlY3RvcigpOwotICAgICAgICByZXR1cm4gbVNlbGVjdG9yLmlzVmFsaWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3Qgb3RoZXIgPSAoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QpbzsKLSAgICAgICAgICAgIHJldHVybiBnZXRTZWxlY3RvcigpLmVxdWFscyhvdGhlci5nZXRTZWxlY3RvcigpKQotICAgICAgICAgICAgICAgICAgICAmJiBpc0FjdGl2ZVNjYW4oKSA9PSBvdGhlci5pc0FjdGl2ZVNjYW4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNlbGVjdG9yKCkuaGFzaENvZGUoKSBeIChpc0FjdGl2ZVNjYW4oKSA/IDEgOiAwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIkRpc2NvdmVyeVJlcXVlc3R7IHNlbGVjdG9yPSIpLmFwcGVuZChnZXRTZWxlY3RvcigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBhY3RpdmVTY2FuPSIpLmFwcGVuZChpc0FjdGl2ZVNjYW4oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaXNWYWxpZD0iKS5hcHBlbmQoaXNWYWxpZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QoYnVuZGxlKSA6IG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWEyZTFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLk9iamVjdHNDb21wYXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2s7Ci0KLS8qKgotICogTWVkaWEgcm91dGUgcHJvdmlkZXJzIGFyZSB1c2VkIHRvIHB1Ymxpc2ggYWRkaXRpb25hbCBtZWRpYSByb3V0ZXMgZm9yCi0gKiB1c2Ugd2l0aGluIGFuIGFwcGxpY2F0aW9uLiAgTWVkaWEgcm91dGUgcHJvdmlkZXJzIG1heSBhbHNvIGJlIGRlY2xhcmVkCi0gKiBhcyBhIHNlcnZpY2UgdG8gcHVibGlzaCBhZGRpdGlvbmFsIG1lZGlhIHJvdXRlcyB0byBhbGwgYXBwbGljYXRpb25zCi0gKiBpbiB0aGUgc3lzdGVtLgotICogPHA+Ci0gKiBUaGUgcHVycG9zZSBvZiBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGlzIHRvIGRpc2NvdmVyIG1lZGlhIHJvdXRlcyB0aGF0IHNhdGlzZnkKLSAqIHRoZSBjcml0ZXJpYSBzcGVjaWZpZWQgYnkgdGhlIGN1cnJlbnQge0BsaW5rIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0fSBhbmQgcHVibGlzaCBhCi0gKiB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvcn0gd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIHJvdXRlIGJ5IGNhbGxpbmcKLSAqIHtAbGluayAjc2V0RGVzY3JpcHRvcn0gdG8gbm90aWZ5IHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZCB7QGxpbmsgQ2FsbGJhY2t9LgotICogPC9wPjxwPgotICogVGhlIHByb3ZpZGVyIHNob3VsZCB3YXRjaCBmb3IgY2hhbmdlcyB0byB0aGUgZGlzY292ZXJ5IHJlcXVlc3QgYnkgaW1wbGVtZW50aW5nCi0gKiB7QGxpbmsgI29uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWR9IGFuZCB1cGRhdGluZyB0aGUgc2V0IG9mIHJvdXRlcyB0aGF0IGl0IGlzCi0gKiBhdHRlbXB0aW5nIHRvIGRpc2NvdmVyLiAgSXQgc2hvdWxkIGFsc28gaGFuZGxlIHJvdXRlIGNvbnRyb2wgcmVxdWVzdHMgc3VjaAotICogYXMgdm9sdW1lIGNoYW5nZXMgb3Ige0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudHN9Ci0gKiBieSBpbXBsZW1lbnRpbmcge0BsaW5rICNvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcn0gdG8gcmV0dXJuIGEge0BsaW5rIFJvdXRlQ29udHJvbGxlcn0KLSAqIGZvciBhIHBhcnRpY3VsYXIgcm91dGUuCi0gKiA8L3A+PHA+Ci0gKiBBIG1lZGlhIHJvdXRlIHByb3ZpZGVyIG1heSBiZSB1c2VkIHByaXZhdGVseSB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgc2luZ2xlCi0gKiBhcHBsaWNhdGlvbiBwcm9jZXNzIGJ5IGNhbGxpbmcge0BsaW5rIE1lZGlhUm91dGVyI2FkZFByb3ZpZGVyIE1lZGlhUm91dGVyLmFkZFByb3ZpZGVyfQotICogdG8gYWRkIGl0IHRvIHRoZSBsb2NhbCB7QGxpbmsgTWVkaWFSb3V0ZXJ9LiAgQSBtZWRpYSByb3V0ZSBwcm92aWRlciBtYXkgYWxzbyBiZSBtYWRlCi0gKiBhdmFpbGFibGUgZ2xvYmFsbHkgdG8gYWxsIGFwcGxpY2F0aW9ucyBieSByZWdpc3RlcmluZyBhIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlfQotICogaW4gdGhlIHByb3ZpZGVyJ3MgbWFuaWZlc3QuICBXaGVuIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBpcyByZWdpc3RlcmVkCi0gKiBhcyBhIHNlcnZpY2UsIGFsbCBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgdGhlIG1lZGlhIHJvdXRlciBBUEkgd2lsbCBiZSBhYmxlIHRvCi0gKiBkaXNjb3ZlciBhbmQgdXNlZCB0aGUgcHJvdmlkZXIncyByb3V0ZXMgd2l0aG91dCBoYXZpbmcgdG8gaW5zdGFsbCBhbnl0aGluZyBlbHNlLgotICogPC9wPjxwPgotICogVGhpcyBvYmplY3QgbXVzdCBvbmx5IGJlIGFjY2Vzc2VkIG9uIHRoZSBtYWluIHRocmVhZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1lZGlhUm91dGVQcm92aWRlciB7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNU0dfREVMSVZFUl9ERVNDUklQVE9SX0NIQU5HRUQgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RFTElWRVJfRElTQ09WRVJZX1JFUVVFU1RfQ0hBTkdFRCA9IDI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlck1ldGFkYXRhIG1NZXRhZGF0YTsKLSAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVySGFuZGxlciBtSGFuZGxlciA9IG5ldyBQcm92aWRlckhhbmRsZXIoKTsKLQotICAgIHByaXZhdGUgQ2FsbGJhY2sgbUNhbGxiYWNrOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBtRGlzY292ZXJ5UmVxdWVzdDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVBlbmRpbmdEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1EZXNjcmlwdG9yOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUGVuZGluZ0Rlc2NyaXB0b3JDaGFuZ2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyKEBOb25OdWxsIENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIE1lZGlhUm91dGVQcm92aWRlcihDb250ZXh0IGNvbnRleHQsIFByb3ZpZGVyTWV0YWRhdGEgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIGlmIChtZXRhZGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTWV0YWRhdGEgPSBuZXcgUHJvdmlkZXJNZXRhZGF0YShuZXcgQ29tcG9uZW50TmFtZShjb250ZXh0LCBnZXRDbGFzcygpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbnRleHQgb2YgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIGhhbmRsZXIgd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYWluIHRocmVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgSGFuZGxlciBnZXRIYW5kbGVyKCkgewotICAgICAgICByZXR1cm4gbUhhbmRsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBzb21lIG1ldGFkYXRhIGFib3V0IHRoZSBwcm92aWRlcidzIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBQcm92aWRlck1ldGFkYXRhIGdldE1ldGFkYXRhKCkgewotICAgICAgICByZXR1cm4gbU1ldGFkYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcHJvdmlkZXIncyBkZXNjcmlwdG9yIGNoYW5nZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHVzZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldENhbGxiYWNrKEBOdWxsYWJsZSBDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBNZWRpYVJvdXRlci5jaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY3VycmVudCBkaXNjb3ZlcnkgcmVxdWVzdCB3aGljaCBpbmZvcm1zIHRoZSBwcm92aWRlciBhYm91dCB0aGUKLSAgICAgKiBraW5kcyBvZiByb3V0ZXMgdG8gZGlzY292ZXIgYW5kIHdoZXRoZXIgdG8gcGVyZm9ybSBhY3RpdmUgc2Nhbm5pbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGRpc2NvdmVyeSByZXF1ZXN0LCBvciBudWxsIGlmIG5vIGRpc2NvdmVyeSBpcyBuZWVkZWQgYXQgdGhpcyB0aW1lLgotICAgICAqCi0gICAgICogQHNlZSAjb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZAotICAgICAqLwotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBmaW5hbCBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBnZXREaXNjb3ZlcnlSZXF1ZXN0KCkgewotICAgICAgICByZXR1cm4gbURpc2NvdmVyeVJlcXVlc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGRpc2NvdmVyeSByZXF1ZXN0IHRvIGluZm9ybSB0aGUgcHJvdmlkZXIgYWJvdXQgdGhlIGtpbmRzIG9mCi0gICAgICogcm91dGVzIHRoYXQgaXRzIGNsaWVudHMgd291bGQgbGlrZSB0byBkaXNjb3ZlciBhbmQgd2hldGhlciB0byBwZXJmb3JtIGFjdGl2ZSBzY2FubmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBkaXNjb3ZlcnkgcmVxdWVzdCwgb3IgbnVsbCBpZiBubyBkaXNjb3ZlcnkgaXMgbmVlZGVkIGF0IHRoaXMgdGltZS4KLSAgICAgKgotICAgICAqIEBzZWUgI29uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXREaXNjb3ZlcnlSZXF1ZXN0KE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgTWVkaWFSb3V0ZXIuY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKE9iamVjdHNDb21wYXQuZXF1YWxzKG1EaXNjb3ZlcnlSZXF1ZXN0LCByZXF1ZXN0KSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbURpc2NvdmVyeVJlcXVlc3QgPSByZXF1ZXN0OwotICAgICAgICBpZiAoIW1QZW5kaW5nRGlzY292ZXJ5UmVxdWVzdENoYW5nZSkgewotICAgICAgICAgICAgbVBlbmRpbmdEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlID0gdHJ1ZTsKLSAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0RFTElWRVJfRElTQ09WRVJZX1JFUVVFU1RfQ0hBTkdFRCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGRlbGl2ZXJEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZCgpIHsKLSAgICAgICAgbVBlbmRpbmdEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlID0gZmFsc2U7Ci0gICAgICAgIG9uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWQobURpc2NvdmVyeVJlcXVlc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gdGhlIHtAbGluayBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBkaXNjb3ZlcnkgcmVxdWVzdH0KLSAgICAgKiBoYXMgY2hhbmdlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuZXZlciBhbiBhcHBsaWNhdGlvbnMgY2FsbHMge0BsaW5rIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrfSB0byByZWdpc3RlcgotICAgICAqIGEgY2FsbGJhY2ssIGl0IGFsc28gcHJvdmlkZXMgYSBzZWxlY3RvciB0byBzcGVjaWZ5IHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdAotICAgICAqIGl0IGlzIGludGVyZXN0ZWQgaW4uICBUaGUgbWVkaWEgcm91dGVyIGNvbWJpbmVzIGFsbCBvZiB0aGVzZSBzZWxlY3RvcnMgdG9nZXRoZXIKLSAgICAgKiB0byBnZW5lcmF0ZSBhIHtAbGluayBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdH0gYW5kIG5vdGlmaWVzIGVhY2ggcHJvdmlkZXIgd2hlbiBhIGNoYW5nZQotICAgICAqIG9jY3VycyBieSBjYWxsaW5nIHtAbGluayAjc2V0RGlzY292ZXJ5UmVxdWVzdH0gd2hpY2ggcG9zdHMgYSBtZXNzYWdlIHRvIGludm9rZQotICAgICAqIHRoaXMgbWV0aG9kIGFzeW5jaHJvbm91c2x5LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgcHJvdmlkZXIgc2hvdWxkIGV4YW1pbmUgdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBjYXRlZ29yaWVzfQotICAgICAqIGluIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdCdzIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3J9IHRvIGRldGVybWluZSB3aGF0Ci0gICAgICoga2luZHMgb2Ygcm91dGVzIGl0IHNob3VsZCB0cnkgdG8gZGlzY292ZXIgYW5kIHdoZXRoZXIgaXQgc2hvdWxkIHBlcmZvcm0gYWN0aXZlCi0gICAgICogb3IgcGFzc2l2ZSBzY2Fucy4gIEluIG1hbnkgY2FzZXMsIHRoZSBwcm92aWRlciBtYXkgYmUgYWJsZSB0byBzYXZlIHBvd2VyIGJ5Ci0gICAgICogZGV0ZXJtaW5pbmcgdGhhdCB0aGUgc2VsZWN0b3IgZG9lcyBub3QgY29udGFpbiBhbnkgY2F0ZWdvcmllcyB0aGF0IGl0IHN1cHBvcnRzCi0gICAgICogYW5kIGl0IGNhbiB0aGVyZWZvcmUgYXZvaWQgcGVyZm9ybWluZyBhbnkgc2NhbnMgYXQgYWxsLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBuZXcgZGlzY292ZXJ5IHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gZGlzY292ZXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHRpbWUuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChATnVsbGFibGUgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHByb3ZpZGVyJ3MgZGVzY3JpcHRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVzY3JpcHRvciBkZXNjcmliZXMgdGhlIHN0YXRlIG9mIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBhbmQKLSAgICAgKiB0aGUgcm91dGVzIHRoYXQgaXQgcHVibGlzaGVzLiAgV2F0Y2ggZm9yIGNoYW5nZXMgdG8gdGhlIGRlc2NyaXB0b3IKLSAgICAgKiBieSByZWdpc3RlcmluZyBhIHtAbGluayBDYWxsYmFjayBjYWxsYmFja30gd2l0aCB7QGxpbmsgI3NldENhbGxiYWNrfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAc2VlIENhbGxiYWNrI29uRGVzY3JpcHRvckNoYW5nZWQKLSAgICAgKi8KLSAgICBATnVsbGFibGUKLSAgICBwdWJsaWMgZmluYWwgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCkgewotICAgICAgICByZXR1cm4gbURlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJvdmlkZXIncyBkZXNjcmlwdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoZSBwcm92aWRlciBtdXN0IGNhbGwgdGhpcyBtZXRob2QgdG8gbm90aWZ5IHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZAotICAgICAqIHtAbGluayBDYWxsYmFjayBjYWxsYmFja30gYWJvdXQgdGhlIGNoYW5nZSB0byB0aGUgcHJvdmlkZXIncyBkZXNjcmlwdG9yLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIFRoZSB1cGRhdGVkIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEBzZWUgQ2FsbGJhY2sjb25EZXNjcmlwdG9yQ2hhbmdlZAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldERlc2NyaXB0b3IoQE51bGxhYmxlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICBNZWRpYVJvdXRlci5jaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAobURlc2NyaXB0b3IgIT0gZGVzY3JpcHRvcikgewotICAgICAgICAgICAgbURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgICAgICAgICAgaWYgKCFtUGVuZGluZ0Rlc2NyaXB0b3JDaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ0Rlc2NyaXB0b3JDaGFuZ2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0RFTElWRVJfREVTQ1JJUFRPUl9DSEFOR0VEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZGVsaXZlckRlc2NyaXB0b3JDaGFuZ2VkKCkgewotICAgICAgICBtUGVuZGluZ0Rlc2NyaXB0b3JDaGFuZ2UgPSBmYWxzZTsKLQotICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkRlc2NyaXB0b3JDaGFuZ2VkKHRoaXMsIG1EZXNjcmlwdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHRvIG9idGFpbiBhIHJvdXRlIGNvbnRyb2xsZXIgZm9yIGEgcGFydGljdWxhciByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbWVkaWEgcm91dGVyIHdpbGwgaW52b2tlIHRoZSB7QGxpbmsgUm91dGVDb250cm9sbGVyI29uUmVsZWFzZX0gbWV0aG9kIG9mIHRoZSByb3V0ZQotICAgICAqIGNvbnRyb2xsZXIgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkIHRvIGFsbG93IGl0IHRvIGZyZWUgaXRzIHJlc291cmNlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGVJZCBUaGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgKiBAcmV0dXJuIFRoZSByb3V0ZSBjb250cm9sbGVyLiAgUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggcm91dGUgb3IgaWYgdGhlIHJvdXRlCi0gICAgICogY2Fubm90IGJlIGNvbnRyb2xsZWQgdXNpbmcgdGhlIHJvdXRlIGNvbnRyb2xsZXIgaW50ZXJmYWNlLgotICAgICAqLwotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoQE5vbk51bGwgU3RyaW5nIHJvdXRlSWQpIHsKLSAgICAgICAgaWYgKHJvdXRlSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGVJZCBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHRvIG9idGFpbiBhIHJvdXRlIGNvbnRyb2xsZXIgZm9yIGEgcGFydGljdWxhciByb3V0ZSB3aGljaCBpcyBhCi0gICAgICogbWVtYmVyIG9mIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUdyb3VwfS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbWVkaWEgcm91dGVyIHdpbGwgaW52b2tlIHRoZSB7QGxpbmsgUm91dGVDb250cm9sbGVyI29uUmVsZWFzZX0gbWV0aG9kIG9mIHRoZSByb3V0ZQotICAgICAqIGNvbnRyb2xsZXIgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkIHRvIGFsbG93IGl0IHRvIGZyZWUgaXRzIHJlc291cmNlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGVJZCBUaGUgdW5pcXVlIGlkIG9mIHRoZSBtZW1iZXIgcm91dGUuCi0gICAgICogQHBhcmFtIHJvdXRlR3JvdXBJZCBUaGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZSBncm91cC4KLSAgICAgKiBAcmV0dXJuIFRoZSByb3V0ZSBjb250cm9sbGVyLiAgUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggcm91dGUgb3IgaWYgdGhlIHJvdXRlCi0gICAgICogY2Fubm90IGJlIGNvbnRyb2xsZWQgdXNpbmcgdGhlIHJvdXRlIGNvbnRyb2xsZXIgaW50ZXJmYWNlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICBATnVsbGFibGUKLSAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKEBOb25OdWxsIFN0cmluZyByb3V0ZUlkLAotICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICBpZiAocm91dGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUlkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJvdXRlR3JvdXBJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUdyb3VwSWQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVzY3JpYmVzIHByb3BlcnRpZXMgb2YgdGhlIHJvdXRlIHByb3ZpZGVyJ3MgaW1wbGVtZW50YXRpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm92aWRlck1ldGFkYXRhIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21wb25lbnROYW1lIG1Db21wb25lbnROYW1lOwotCi0gICAgICAgIFByb3ZpZGVyTWV0YWRhdGEoQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lKSB7Ci0gICAgICAgICAgICBpZiAoY29tcG9uZW50TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tcG9uZW50TmFtZSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgcHJvdmlkZXIncyBwYWNrYWdlIG5hbWUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db21wb25lbnROYW1lLmdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgcHJvdmlkZXIncyBjb21wb25lbnQgbmFtZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBDb21wb25lbnROYW1lIGdldENvbXBvbmVudE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbXBvbmVudE5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXJNZXRhZGF0YXsgY29tcG9uZW50TmFtZT0iCi0gICAgICAgICAgICAgICAgICAgICsgbUNvbXBvbmVudE5hbWUuZmxhdHRlblRvU2hvcnRTdHJpbmcoKSArICIgfSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBjb250cm9sIG92ZXIgYSBwYXJ0aWN1bGFyIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBtZWRpYSByb3V0ZXIgb2J0YWlucyBhIHJvdXRlIGNvbnRyb2xsZXIgZm9yIGEgcm91dGUgd2hlbmV2ZXIgaXQgbmVlZHMKLSAgICAgKiB0byBjb250cm9sIGEgcm91dGUuICBXaGVuIGEgcm91dGUgaXMgc2VsZWN0ZWQsIHRoZSBtZWRpYSByb3V0ZXIgaW52b2tlcwotICAgICAqIHRoZSB7QGxpbmsgI29uU2VsZWN0fSBtZXRob2Qgb2YgaXRzIHJvdXRlIGNvbnRyb2xsZXIuICBXaGlsZSBzZWxlY3RlZCwKLSAgICAgKiB0aGUgbWVkaWEgcm91dGVyIG1heSBjYWxsIG90aGVyIG1ldGhvZHMgb2YgdGhlIHJvdXRlIGNvbnRyb2xsZXIgdG8KLSAgICAgKiByZXF1ZXN0IHRoYXQgaXQgcGVyZm9ybSBjZXJ0YWluIGFjdGlvbnMgdG8gdGhlIHJvdXRlLiAgV2hlbiBhIHJvdXRlIGlzCi0gICAgICogdW5zZWxlY3RlZCwgdGhlIG1lZGlhIHJvdXRlciBpbnZva2VzIHRoZSB7QGxpbmsgI29uVW5zZWxlY3R9IG1ldGhvZCBvZiBpdHMKLSAgICAgKiByb3V0ZSBjb250cm9sbGVyLiAgV2hlbiB0aGUgbWVkaWEgcm91dGUgbm8gbG9uZ2VyIG5lZWRzIHRoZSByb3V0ZSBjb250cm9sbGVyCi0gICAgICogaXQgd2lsbCBpbnZva2UgdGhlIHtAbGluayAjb25SZWxlYXNlfSBtZXRob2QgdG8gYWxsb3cgdGhlIHJvdXRlIGNvbnRyb2xsZXIKLSAgICAgKiB0byBmcmVlIGl0cyByZXNvdXJjZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZXJlIG1heSBiZSBtdWx0aXBsZSByb3V0ZSBjb250cm9sbGVycyBzaW11bHRhbmVvdXNseSBhY3RpdmUgZm9yIHRoZQotICAgICAqIHNhbWUgcm91dGUuICBFYWNoIHJvdXRlIGNvbnRyb2xsZXIgd2lsbCBiZSByZWxlYXNlZCBzZXBhcmF0ZWx5LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBbGwgb3BlcmF0aW9ucyBvbiB0aGUgcm91dGUgY29udHJvbGxlciBhcmUgYXN5bmNocm9ub3VzIGFuZAotICAgICAqIHJlc3VsdHMgYXJlIGNvbW11bmljYXRlZCB2aWEgY2FsbGJhY2tzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFJvdXRlQ29udHJvbGxlciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWxlYXNlcyB0aGUgcm91dGUgY29udHJvbGxlciwgYWxsb3dpbmcgaXQgdG8gZnJlZSBpdHMgcmVzb3VyY2VzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25SZWxlYXNlKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbGVjdHMgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TZWxlY3QoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVW5zZWxlY3RzIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVW5zZWxlY3QoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVW5zZWxlY3RzIHRoZSByb3V0ZSBhbmQgcHJvdmlkZXMgYSByZWFzb24uIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0gICAgICAgICAqIGNhbGxzIHtAbGluayAjb25VbnNlbGVjdCgpfS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByZWFzb24gcHJvdmlkZWQgd2lsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgICogPHVsPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9VTktOT1dOfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRH08L2xpPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9TVE9QUEVEfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUR9PC9saT4KLSAgICAgICAgICogPC91bD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIGZvciB1bnNlbGVjdGluZyB0aGUgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblVuc2VsZWN0KGludCByZWFzb24pIHsKLSAgICAgICAgICAgIG9uVW5zZWxlY3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXF1ZXN0cyB0byBzZXQgdGhlIHZvbHVtZSBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2b2x1bWUgVGhlIG5ldyB2b2x1bWUgdmFsdWUgYmV0d2VlbiAwIGFuZCB7QGxpbmsgTWVkaWFSb3V0ZURlc2NyaXB0b3IjZ2V0Vm9sdW1lTWF4fS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXF1ZXN0cyBhbiBpbmNyZW1lbnRhbCB2b2x1bWUgdXBkYXRlIGZvciB0aGUgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkZWx0YSBUaGUgZGVsdGEgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHZvbHVtZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVXBkYXRlVm9sdW1lKGludCBkZWx0YSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBlcmZvcm1zIGEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSByZXF1ZXN0Ci0gICAgICAgICAqIGFzeW5jaHJvbm91c2x5IG9uIGJlaGFsZiBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbnRlbnQgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fS4KLSAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIEEge0BsaW5rIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2t9IHRvIGludm9rZSB3aXRoIHRoZSByZXN1bHQKLSAgICAgICAgICogb2YgdGhlIHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gcmVzdWx0IGlzIHJlcXVpcmVkLgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNvbnRyb2xsZXIgaW50ZW5kcyB0byBoYW5kbGUgdGhlIHJlcXVlc3QgYW5kIHdpbGwKLSAgICAgICAgICogaW52b2tlIHRoZSBjYWxsYmFjayB3aGVuIGZpbmlzaGVkLiAgRmFsc2UgaWYgdGhlIGNvbnRyb2xsZXIgd2lsbCBub3QKLSAgICAgICAgICogaGFuZGxlIHRoZSByZXF1ZXN0IGFuZCB3aWxsIG5vdCBpbnZva2UgdGhlIGNhbGxiYWNrLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db250cm9sUmVxdWVzdChJbnRlbnQgaW50ZW50LCBATnVsbGFibGUgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgd2hpY2ggaXMgaW52b2tlZCB3aGVuIHJvdXRlIGluZm9ybWF0aW9uIGJlY29tZXMgYXZhaWxhYmxlIG9yIGNoYW5nZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBpbmZvcm1hdGlvbiBhYm91dCBhIHJvdXRlIHByb3ZpZGVyIGFuZCBpdHMgcm91dGVzIGNoYW5nZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBwcm92aWRlciBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgdGhhdCBjaGFuZ2VkLCBuZXZlciBudWxsLgotICAgICAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciBUaGUgbmV3IG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzY3JpcHRvckNoYW5nZWQoQE5vbk51bGwgTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyLAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUHJvdmlkZXJIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIFByb3ZpZGVySGFuZGxlcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfREVMSVZFUl9ERVNDUklQVE9SX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJEZXNjcmlwdG9yQ2hhbmdlZCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19ERUxJVkVSX0RJU0NPVkVSWV9SRVFVRVNUX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjFjZTA5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIHN0YXRlIG9mIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgYW5kIHRoZSByb3V0ZXMgdGhhdCBpdCBwdWJsaXNoZXMuCi0gKiA8cD4KLSAqIFRoaXMgb2JqZWN0IGlzIGltbXV0YWJsZSBvbmNlIGNyZWF0ZWQgdXNpbmcgYSB7QGxpbmsgQnVpbGRlcn0gaW5zdGFuY2UuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1JPVVRFUyA9ICJyb3V0ZXMiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLSAgICBwcml2YXRlIExpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IG1Sb3V0ZXM7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IoQnVuZGxlIGJ1bmRsZSwgTGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcm91dGVzKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgICAgIG1Sb3V0ZXMgPSByb3V0ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbGlzdCBvZiBhbGwgcm91dGVzIHRoYXQgdGhpcyBwcm92aWRlciBoYXMgcHVibGlzaGVkLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiBnZXRSb3V0ZXMoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlcygpOwotICAgICAgICByZXR1cm4gbVJvdXRlczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlUm91dGVzKCkgewotICAgICAgICBpZiAobVJvdXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8QnVuZGxlPiByb3V0ZUJ1bmRsZXMgPSBtQnVuZGxlLjxCdW5kbGU+Z2V0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfUk9VVEVTKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZUJ1bmRsZXMgPT0gbnVsbCB8fCByb3V0ZUJ1bmRsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlcyA9IENvbGxlY3Rpb25zLjxNZWRpYVJvdXRlRGVzY3JpcHRvcj5lbXB0eUxpc3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gcm91dGVCdW5kbGVzLnNpemUoKTsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4oY291bnQpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVzLmFkZChNZWRpYVJvdXRlRGVzY3JpcHRvci5mcm9tQnVuZGxlKHJvdXRlQnVuZGxlcy5nZXQoaSkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYW5kIGFsbCBvZiB0aGUgcm91dGVzIHRoYXQKLSAgICAgKiBpdCBjb250YWlucyBoYXZlIGFsbCBvZiB0aGUgcmVxdWlyZWQgZmllbGRzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgdmVyaWZpY2F0aW9uIGlzIGRlZXAuICBJZiB0aGUgcHJvdmlkZXIgZGVzY3JpcHRvciBpcyBrbm93biB0byBiZQotICAgICAqIHZhbGlkIHRoZW4gaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjYWxsIHtAbGluayAjaXNWYWxpZH0gb24gZWFjaCBvZiBpdHMgcm91dGVzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICBlbnN1cmVSb3V0ZXMoKTsKLSAgICAgICAgZmluYWwgaW50IHJvdXRlQ291bnQgPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3V0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlID0gbVJvdXRlcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAocm91dGUgPT0gbnVsbCB8fCAhcm91dGUuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvcnsgIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoInJvdXRlcz0iKS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGdldFJvdXRlcygpLnRvQXJyYXkoKSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGlzVmFsaWQ9IikuYXBwZW5kKGlzVmFsaWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIGJ1bmRsZSBmb3Igc2VyaWFsaXphdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYXMgYSBidW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBhc0J1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEgYnVuZGxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBidW5kbGUgd2FzIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvcihidW5kbGUsIG51bGwpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yc30uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IG1Sb3V0ZXM7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgbWVkaWEgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciBidWlsZGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7Ci0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGJ1aWxkZXIgd2hvc2UgaW5pdGlhbCBjb250ZW50cyBhcmUKLSAgICAgICAgICogY29waWVkIGZyb20gYW4gZXhpc3RpbmcgZGVzY3JpcHRvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRlc2NyaXB0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShkZXNjcmlwdG9yLm1CdW5kbGUpOwotCi0gICAgICAgICAgICBkZXNjcmlwdG9yLmVuc3VyZVJvdXRlcygpOwotICAgICAgICAgICAgaWYgKCFkZXNjcmlwdG9yLm1Sb3V0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+KGRlc2NyaXB0b3IubVJvdXRlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkUm91dGUoTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGUgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVJvdXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Sb3V0ZXMuY29udGFpbnMocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGUgZGVzY3JpcHRvciBhbHJlYWR5IGFkZGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUm91dGVzLmFkZChyb3V0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEgbGlzdCBvZiByb3V0ZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRSb3V0ZXMoQ29sbGVjdGlvbjxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcm91dGVzKSB7Ci0gICAgICAgICAgICBpZiAocm91dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZXMgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXJvdXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlIDogcm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJvdXRlKHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBsaXN0IG9mIHJvdXRlcy4KLSAgICAgICAgICovCi0gICAgICAgIEJ1aWxkZXIgc2V0Um91dGVzKENvbGxlY3Rpb248TWVkaWFSb3V0ZURlc2NyaXB0b3I+IHJvdXRlcykgewotICAgICAgICAgICAgaWYgKHJvdXRlcyA9PSBudWxsIHx8IHJvdXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtQnVuZGxlLnJlbW92ZShLRVlfUk9VVEVTKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8Pihyb3V0ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQnVpbGRzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGJ1aWxkKCkgewotICAgICAgICAgICAgaWYgKG1Sb3V0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxCdW5kbGU+IHJvdXRlQnVuZGxlcyA9IG5ldyBBcnJheUxpc3Q8QnVuZGxlPihjb3VudCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJvdXRlQnVuZGxlcy5hZGQobVJvdXRlcy5nZXQoaSkuYXNCdW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdW5kbGUucHV0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfUk9VVEVTLCByb3V0ZUJ1bmRsZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yKG1CdW5kbGUsIG1Sb3V0ZXMpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZTkzNDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBjb21tdW5pY2F0aW9uIHByb3RvY29sIGZvciBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlcy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wgewotICAgIC8qKgotICAgICAqIFRoZSB7QGxpbmsgSW50ZW50fSB0aGF0IG11c3QgYmUgZGVjbGFyZWQgYXMgaGFuZGxlZCBieSB0aGUgc2VydmljZS4KLSAgICAgKiBQdXQgdGhpcyBpbiB5b3VyIG1hbmlmZXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfSU5URVJGQUNFID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UiOwotCi0gICAgLyoKLSAgICAgKiBNZXNzYWdlcyBzZW50IGZyb20gdGhlIGNsaWVudCB0byB0aGUgc2VydmljZS4KLSAgICAgKiBETyBOT1QgUkVOVU1CRVIgVEhFU0UhCi0gICAgICovCi0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBSZWdpc3RlciBjbGllbnQuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiBjbGllbnQgdmVyc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfUkVHSVNURVIgPSAxOwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogVW5yZWdpc3RlciBjbGllbnQuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1VOUkVHSVNURVIgPSAyOwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogQ3JlYXRlIHJvdXRlIGNvbnRyb2xsZXIuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICogLSBDTElFTlRfREFUQV9ST1VURV9JRCA6IHJvdXRlIGlkIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfQ1JFQVRFX1JPVVRFX0NPTlRST0xMRVIgPSAzOwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogUmVsZWFzZSByb3V0ZSBjb250cm9sbGVyLgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSID0gNDsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFNlbGVjdCByb3V0ZS4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1NFTEVDVF9ST1VURSA9IDU7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBVbnNlbGVjdCByb3V0ZS4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1VOU0VMRUNUX1JPVVRFID0gNjsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFNldCByb3V0ZSB2b2x1bWUuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICogLSBDTElFTlRfREFUQV9WT0xVTUUgOiB2b2x1bWUgaW50ZWdlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRSA9IDc7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBVcGRhdGUgcm91dGUgdm9sdW1lLgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqIC0gQ0xJRU5UX0RBVEFfVk9MVU1FIDogdm9sdW1lIGRlbHRhIGludGVnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1VQREFURV9ST1VURV9WT0xVTUUgPSA4OwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogUm91dGUgY29udHJvbCByZXF1ZXN0LgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqIC0gb2JqICAgICA6IG1lZGlhIGNvbnRyb2wgaW50ZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19ST1VURV9DT05UUk9MX1JFUVVFU1QgPSA5OwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogU2V0cyB0aGUgZGlzY292ZXJ5IHJlcXVlc3QuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIG9iaiAgICAgOiBkaXNjb3ZlcnkgcmVxdWVzdCBidW5kbGUsIG9yIG51bGwgaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNUID0gMTA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfREFUQV9ST1VURV9JRCA9ICJyb3V0ZUlkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfREFUQV9ST1VURV9MSUJSQVJZX0dST1VQID0gInJvdXRlR3JvdXBJZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0RBVEFfVk9MVU1FID0gInZvbHVtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OID0gInVuc2VsZWN0UmVhc29uIjsKLQotICAgIC8qCi0gICAgICogTWVzc2FnZXMgc2VudCBmcm9tIHRoZSBzZXJ2aWNlIHRvIHRoZSBjbGllbnQuCi0gICAgICogRE8gTk9UIFJFTlVNQkVSIFRIRVNFIQotICAgICAqLwotCi0gICAgLyoqIChzZXJ2aWNlIHYxKQotICAgICAqIEdlbmVyaWMgZmFpbHVyZSBzZW50IGluIHJlc3BvbnNlIHRvIGFueSB1bnJlY29nbml6ZWQgb3IgbWFsZm9ybWVkIHJlcXVlc3QuCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0dFTkVSSUNfRkFJTFVSRSA9IDA7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogR2VuZXJpYyBmYWlsdXJlIHNlbnQgaW4gcmVzcG9uc2UgdG8gYSBzdWNjZXNzZnVsIG1lc3NhZ2UuCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUyA9IDE7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogUmVnaXN0cmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogc2VydmVyIHZlcnNpb24KLSAgICAgKiAtIG9iaiAgICAgOiByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGJ1bmRsZSwgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX1JFR0lTVEVSRUQgPSAyOwotCi0gICAgLyoqIChzZXJ2aWNlIHYxKQotICAgICAqIFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBzdWNjZXNzIHJlc3VsdC4KLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBvYmogICAgIDogcmVzdWx0IGRhdGEgYnVuZGxlLCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRCA9IDM7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogUm91dGUgY29udHJvbCByZXF1ZXN0IGZhaWx1cmUgcmVzdWx0LgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIG9iaiAgICAgOiByZXN1bHQgZGF0YSBidW5kbGUsIG9yIG51bGwKLSAgICAgKiAtIFNFUlZJQ0VfREFUQV9FUlJPUjogZXJyb3IgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQgPSA0OwotCi0gICAgLyoqIChzZXJ2aWNlIHYxKQotICAgICAqIFJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgY2hhbmdlZC4gICh1bnNvbGljaXRlZCBldmVudCkKLSAgICAgKiAtIGFyZzEgICAgOiByZXNlcnZlZCAoMCkKLSAgICAgKiAtIG9iaiAgICAgOiByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGJ1bmRsZSwgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRCA9IDU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0RBVEFfRVJST1IgPSAiZXJyb3IiOwotCi0gICAgLyoKLSAgICAgKiBSZWNvZ25pemVkIGNsaWVudCB2ZXJzaW9uIG51bWJlcnMuICAoUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuKQotICAgICAqIERPIE5PVCBSRU5VTUJFUiBUSEVTRSEKLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIFRoZSBjbGllbnQgdmVyc2lvbiB1c2VkIGZyb20gdGhlIGJlZ2lubmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfVkVSU0lPTl8xID0gMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjbGllbnQgdmVyc2lvbiB1c2VkIGZyb20gc3VwcG9ydCBsaWJyYXJ5IHYyNC4xLjAuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX1ZFUlNJT05fMiA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3VycmVudCBjbGllbnQgdmVyc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfVkVSU0lPTl9DVVJSRU5UID0gQ0xJRU5UX1ZFUlNJT05fMjsKLQotICAgIC8qCi0gICAgICogUmVjb2duaXplZCBzZXJ2ZXIgdmVyc2lvbiBudW1iZXJzLiAgKFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLikKLSAgICAgKiBETyBOT1QgUkVOVU1CRVIgVEhFU0UhCi0gICAgICovCi0KLSAgICAvKioKLSAgICAgKiBUaGUgc2VydmljZSB2ZXJzaW9uIHVzZWQgZnJvbSB0aGUgYmVnaW5uaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfVkVSU0lPTl8xID0gMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IHNlcnZpY2UgdmVyc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX1ZFUlNJT05fQ1VSUkVOVCA9IFNFUlZJQ0VfVkVSU0lPTl8xOwotCi0gICAgc3RhdGljIGZpbmFsIGludCBDTElFTlRfVkVSU0lPTl9TVEFSVCA9IENMSUVOVF9WRVJTSU9OXzE7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1lc3NlbmdlciBvYmplY3QgaXMgdmFsaWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIG1lc3NlbmdlciBjb25zdHJ1Y3RvciBhbmQgdW5wYXJjZWxpbmcgY29kZSBkb2VzIG5vdCBjaGVjayB3aGV0aGVyIHRoZQotICAgICAqIHByb3ZpZGVkIElCaW5kZXIgaXMgYSB2YWxpZCBJTWVzc2VuZ2VyIG9iamVjdC4gIEFzIGEgcmVzdWx0LCBpdCdzIHBvc3NpYmxlCi0gICAgICogZm9yIGEgcGVlciB0byBzZW5kIGFuIGludmFsaWQgSUJpbmRlciB0aGF0IHdpbGwgcmVzdWx0IGluIGNyYXNoZXMgZG93bnN0cmVhbS4KLSAgICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgdGhhdCB0aGUgbWVzc2VuZ2VyIGlzIGluIGEgdmFsaWQgc3RhdGUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyKE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtZXNzZW5nZXIgIT0gbnVsbCAmJiBtZXNzZW5nZXIuZ2V0QmluZGVyKCkgIT0gbnVsbDsKLSAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBtZXNzZW5nZXIgd2FzIGNvbnN0cnVjdGVkIHdpdGggYSBiaW5kZXIgaW50ZXJmYWNlIG90aGVyIHRoYW4KLSAgICAgICAgICAgIC8vIElNZXNzZW5nZXIgdGhlbiB0aGUgY2FsbCB0byBnZXRCaW5kZXIoKSB3aWxsIGNyYXNoIHdpdGggYW4gTlBFLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclNlcnZpY2UuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzY2RlMTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfREFUQV9ST1VURV9JRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX0RBVEFfUk9VVEVfTElCUkFSWV9HUk9VUDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9EQVRBX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1JFR0lTVEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1JFTEVBU0VfUk9VVEVfQ09OVFJPTExFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19ST1VURV9DT05UUk9MX1JFUVVFU1Q7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNUOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1NFVF9ST1VURV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19VTlJFR0lTVEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1VOU0VMRUNUX1JPVVRFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1VQREFURV9ST1VURV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX1ZFUlNJT05fMTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX0RBVEFfRVJST1I7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9TVUNDRUVERUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19HRU5FUklDX1NVQ0NFU1M7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9NU0dfUkVHSVNURVJFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX1ZFUlNJT05fQ1VSUkVOVDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5pc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuRGVhZE9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlci5EZWF0aFJlY2lwaWVudDsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzZW5nZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uVmlzaWJsZUZvclRlc3Rpbmc7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuT2JqZWN0c0NvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2VzLgotICogPHA+Ci0gKiBBIG1lZGlhIHJvdXRlciB3aWxsIGJpbmQgdG8gbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXMgd2hlbiBhIGNhbGxiYWNrIGlzIGFkZGVkIHZpYQotICoge0BsaW5rIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgTWVkaWFSb3V0ZXIuQ2FsbGJhY2ssIGludCl9IHdpdGggYSBkaXNjb3ZlcnkKLSAqIGZsYWc6IHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfSwKLSAqIHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWX0sIG9yCi0gKiB7QGxpbmsgTWVkaWFSb3V0ZXIjQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOfSwgYW5kIHdpbGwgdW5iaW5kIHdoZW4gdGhlIGNhbGxiYWNrCi0gKiBpcyByZW1vdmVkIHZpYSB7QGxpbmsgTWVkaWFSb3V0ZXIjcmVtb3ZlQ2FsbGJhY2soTWVkaWFSb3V0ZXIuQ2FsbGJhY2spfS4KLSAqIDwvcD48cD4KLSAqIFRvIGltcGxlbWVudCB5b3VyIG93biBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlLCBleHRlbmQgdGhpcyBjbGFzcyBhbmQKLSAqIG92ZXJyaWRlIHRoZSB7QGxpbmsgI29uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyfSBtZXRob2QgdG8gcmV0dXJuIGFuCi0gKiBpbnN0YW5jZSBvZiB5b3VyIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJ9LgotICogPC9wPjxwPgotICogRGVjbGFyZSB5b3VyIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UgaW4geW91ciBhcHBsaWNhdGlvbiBtYW5pZmVzdAotICogbGlrZSB0aGlzOgotICogPC9wPgotICogPHByZT4KLSAqICAgJmx0O3NlcnZpY2UgYW5kcm9pZDpuYW1lPSIuTXlNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIgotICogICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvbXlfbWVkaWFfcm91dGVfcHJvdmlkZXJfc2VydmljZSI+Ci0gKiAgICAgICAmbHQ7aW50ZW50LWZpbHRlcj4KLSAqICAgICAgICAgICAmbHQ7YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIiAvPgotICogICAgICAgJmx0Oy9pbnRlbnQtZmlsdGVyPgotICogICAmbHQ7L3NlcnZpY2U+Ci0gKiA8L3ByZT4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlUHJvdmlkZXJTcnYiOyAvLyBtYXguIDIzIGNoYXJzCi0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxDbGllbnRSZWNvcmQ+IG1DbGllbnRzID0gbmV3IEFycmF5TGlzdDxDbGllbnRSZWNvcmQ+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBSZWNlaXZlSGFuZGxlciBtUmVjZWl2ZUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZXNzZW5nZXIgbVJlY2VpdmVNZXNzZW5nZXI7Ci0gICAgZmluYWwgUHJpdmF0ZUhhbmRsZXIgbVByaXZhdGVIYW5kbGVyOwotICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJDYWxsYmFjayBtUHJvdmlkZXJDYWxsYmFjazsKLQotICAgIE1lZGlhUm91dGVQcm92aWRlciBtUHJvdmlkZXI7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBtQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdDsKLQotICAgIC8qKgotICAgICAqIFRoZSB7QGxpbmsgSW50ZW50fSB0aGF0IG11c3QgYmUgZGVjbGFyZWQgYXMgaGFuZGxlZCBieSB0aGUgc2VydmljZS4KLSAgICAgKiBQdXQgdGhpcyBpbiB5b3VyIG1hbmlmZXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfSU5URVJGQUNFID0gTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9JTlRFUkZBQ0U7Ci0KLSAgICAvKgotICAgICAqIFByaXZhdGUgbWVzc2FnZXMgdXNlZCBpbnRlcm5hbGx5LiAgKFllcywgeW91IGNhbiByZW51bWJlciB0aGVzZS4pCi0gICAgICovCi0KLSAgICBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfTVNHX0NMSUVOVF9ESUVEID0gMTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlKCkgewotICAgICAgICBtUmVjZWl2ZUhhbmRsZXIgPSBuZXcgUmVjZWl2ZUhhbmRsZXIodGhpcyk7Ci0gICAgICAgIG1SZWNlaXZlTWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihtUmVjZWl2ZUhhbmRsZXIpOwotICAgICAgICBtUHJpdmF0ZUhhbmRsZXIgPSBuZXcgUHJpdmF0ZUhhbmRsZXIoKTsKLSAgICAgICAgbVByb3ZpZGVyQ2FsbGJhY2sgPSBuZXcgUHJvdmlkZXJDYWxsYmFjaygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgc3lzdGVtIHdoZW4gaXQgaXMgdGltZSB0byBjcmVhdGUgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgb2ZmZXJlZCBieSB0aGlzIHNlcnZpY2UsIG9yIG51bGwgaWYKLSAgICAgKiB0aGlzIHNlcnZpY2UgaGFzIGRlY2lkZWQgbm90IHRvIG9mZmVyIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IE1lZGlhUm91dGVQcm92aWRlciBvbkNyZWF0ZU1lZGlhUm91dGVQcm92aWRlcigpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgb2ZmZXJlZCBieSB0aGlzIHNlcnZpY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBvZmZlcmVkIGJ5IHRoaXMgc2VydmljZSwgb3IgbnVsbCBpZgotICAgICAqIGl0IGhhcyBub3QgeWV0IGJlZW4gY3JlYXRlZC4KLSAgICAgKgotICAgICAqIEBzZWUgI29uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyIGdldE1lZGlhUm91dGVQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1Qcm92aWRlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgewotICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhTRVJWSUNFX0lOVEVSRkFDRSkpIHsKLSAgICAgICAgICAgIGlmIChtUHJvdmlkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciA9IG9uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3ZpZGVyUGFja2FnZSA9IHByb3ZpZGVyLmdldE1ldGFkYXRhKCkuZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm92aWRlclBhY2thZ2UuZXF1YWxzKGdldFBhY2thZ2VOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJvbkNyZWF0ZU1lZGlhUm91dGVQcm92aWRlcigpIHJldHVybmVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYSBwcm92aWRlciB3aG9zZSBwYWNrYWdlIG5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlIHBhY2thZ2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJuYW1lIG9mIHRoZSBzZXJ2aWNlLiAgQSBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlIGNhbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm9ubHkgZXhwb3J0IGl0cyBvd24gbWVkaWEgcm91dGUgcHJvdmlkZXJzLiAgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJQcm92aWRlciBwYWNrYWdlIG5hbWU6ICIgKyBwcm92aWRlclBhY2thZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLiAgU2VydmljZSBwYWNrYWdlIG5hbWU6ICIgKyBnZXRQYWNrYWdlTmFtZSgpICsgIi4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXIgPSBwcm92aWRlcjsKLSAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVyLnNldENhbGxiYWNrKG1Qcm92aWRlckNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVJlY2VpdmVNZXNzZW5nZXIuZ2V0QmluZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25VbmJpbmQoSW50ZW50IGludGVudCkgewotICAgICAgICBpZiAobVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Qcm92aWRlci5zZXRDYWxsYmFjayhudWxsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIub25VbmJpbmQoaW50ZW50KTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uUmVnaXN0ZXJDbGllbnQoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwgaW50IHZlcnNpb24pIHsKLSAgICAgICAgaWYgKHZlcnNpb24gPj0gQ0xJRU5UX1ZFUlNJT05fMSkgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBuZXcgQ2xpZW50UmVjb3JkKG1lc3NlbmdlciwgdmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaWVudC5yZWdpc3RlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DbGllbnRzLmFkZChjbGllbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUmVnaXN0ZXJlZCwgdmVyc2lvbj0iICsgdmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBtUHJvdmlkZXIuZ2V0RGVzY3JpcHRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfUkVHSVNURVJFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCBTRVJWSUNFX1ZFUlNJT05fQ1VSUkVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVzY3JpcHRvckJ1bmRsZUZvckNsaWVudFZlcnNpb24oZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQubVZlcnNpb24pLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25VbnJlZ2lzdGVyQ2xpZW50KE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQpIHsKLSAgICAgICAgaW50IGluZGV4ID0gZmluZENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IG1DbGllbnRzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFVucmVnaXN0ZXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xpZW50LmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBvbkJpbmRlckRpZWQoTWVzc2VuZ2VyIG1lc3NlbmdlcikgewotICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbUNsaWVudHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogQmluZGVyIGRpZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsaWVudC5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sZWFuIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQgY29udHJvbGxlcklkLCBTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNsaWVudC5jcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCwgcm91dGVHcm91cElkLCBjb250cm9sbGVySWQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbGxlciBjcmVhdGVkLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgcm91dGVJZD0iICsgcm91dGVJZCArICIsIHJvdXRlR3JvdXBJZD0iICsgcm91dGVHcm91cElkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IGdldENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjbGllbnQucmVsZWFzZVJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbGxlciByZWxlYXNlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblNlbGVjdFJvdXRlKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQgY29udHJvbGxlcklkKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNlbGVjdCgpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIHNlbGVjdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uVW5zZWxlY3RSb3V0ZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCwgaW50IHJlYXNvbikgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldFJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25VbnNlbGVjdChyZWFzb24pOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIHVuc2VsZWN0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25TZXRSb3V0ZVZvbHVtZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCwgaW50IHZvbHVtZSkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldFJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25TZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSB2b2x1bWUgY2hhbmdlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkICsgIiwgdm9sdW1lPSIgKyB2b2x1bWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uVXBkYXRlUm91dGVWb2x1bWUoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQsIGludCBkZWx0YSkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldFJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25VcGRhdGVWb2x1bWUoZGVsdGEpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIHZvbHVtZSB1cGRhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQgKyAiLCBkZWx0YT0iICsgZGVsdGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uUm91dGVDb250cm9sUmVxdWVzdChmaW5hbCBNZXNzZW5nZXIgbWVzc2VuZ2VyLCBmaW5hbCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgZmluYWwgaW50IGNvbnRyb2xsZXJJZCwgZmluYWwgSW50ZW50IGludGVudCkgewotICAgICAgICBmaW5hbCBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldFJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2sgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0SWQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlci5Db250cm9sUmVxdWVzdENhbGxiYWNrKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBzdWNjZWVkZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaW50ZW50PSIgKyBpbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGRhdGE9IiArIGRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZENsaWVudChtZXNzZW5nZXIpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIDAsIGRhdGEsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSBjb250cm9sIHJlcXVlc3QgZmFpbGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGludGVudD0iICsgaW50ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBlcnJvcj0iICsgZXJyb3IgKyAiLCBkYXRhPSIgKyBkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRDbGllbnQobWVzc2VuZ2VyKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhTRVJWSUNFX0RBVEFfRVJST1IsIGVycm9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgMCwgZGF0YSwgYnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgMCwgZGF0YSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyLm9uQ29udHJvbFJlcXVlc3QoaW50ZW50LCBjYWxsYmFjaykpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBkZWxpdmVyZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQgKyAiLCBpbnRlbnQ9IiArIGludGVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uU2V0RGlzY292ZXJ5UmVxdWVzdChNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYm9vbGVhbiBhY3R1YWxseUNoYW5nZWQgPSBjbGllbnQuc2V0RGlzY292ZXJ5UmVxdWVzdChyZXF1ZXN0KTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogU2V0IGRpc2NvdmVyeSByZXF1ZXN0LCByZXF1ZXN0PSIgKyByZXF1ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICArICIsIGFjdHVhbGx5Q2hhbmdlZD0iICsgYWN0dWFsbHlDaGFuZ2VkCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3Q9IiArIG1Db21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBzZW5kRGVzY3JpcHRvckNoYW5nZWQoTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DbGllbnRzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbUNsaWVudHMuZ2V0KGkpOwotICAgICAgICAgICAgc2VuZFJlcGx5KGNsaWVudC5tTWVzc2VuZ2VyLCBTRVJWSUNFX01TR19ERVNDUklQVE9SX0NIQU5HRUQsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZURlc2NyaXB0b3JCdW5kbGVGb3JDbGllbnRWZXJzaW9uKGRlc2NyaXB0b3IsIGNsaWVudC5tVmVyc2lvbiksIG51bGwpOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBTZW50IGRlc2NyaXB0b3IgY2hhbmdlIGV2ZW50LCBkZXNjcmlwdG9yPSIgKyBkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHN0YXRpYyBCdW5kbGUgY3JlYXRlRGVzY3JpcHRvckJ1bmRsZUZvckNsaWVudFZlcnNpb24oTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICAgICAgaW50IGNsaWVudFZlcnNpb24pIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLkJ1aWxkZXIoZGVzY3JpcHRvcik7Ci0gICAgICAgIGJ1aWxkZXIuc2V0Um91dGVzKG51bGwpOwotICAgICAgICBmb3IgKE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlIDogZGVzY3JpcHRvci5nZXRSb3V0ZXMoKSkgewotICAgICAgICAgICAgaWYgKGNsaWVudFZlcnNpb24gPj0gcm91dGUuZ2V0TWluQ2xpZW50VmVyc2lvbigpCi0gICAgICAgICAgICAgICAgICAgICYmIGNsaWVudFZlcnNpb24gPD0gcm91dGUuZ2V0TWF4Q2xpZW50VmVyc2lvbigpKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRSb3V0ZShyb3V0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKS5hc0J1bmRsZSgpOwotICAgIH0KLQotICAgIGJvb2xlYW4gdXBkYXRlQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdCgpIHsKLSAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgY29tcG9zaXRlID0gbnVsbDsKLSAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIgc2VsZWN0b3JCdWlsZGVyID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBhY3RpdmVTY2FuID0gZmFsc2U7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DbGllbnRzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0ID0gbUNsaWVudHMuZ2V0KGkpLm1EaXNjb3ZlcnlSZXF1ZXN0OwotICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiAoIXJlcXVlc3QuZ2V0U2VsZWN0b3IoKS5pc0VtcHR5KCkgfHwgcmVxdWVzdC5pc0FjdGl2ZVNjYW4oKSkpIHsKLSAgICAgICAgICAgICAgICBhY3RpdmVTY2FuIHw9IHJlcXVlc3QuaXNBY3RpdmVTY2FuKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSA9IHJlcXVlc3Q7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yQnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvckJ1aWxkZXIgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIoY29tcG9zaXRlLmdldFNlbGVjdG9yKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yQnVpbGRlci5hZGRTZWxlY3RvcihyZXF1ZXN0LmdldFNlbGVjdG9yKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0b3JCdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbXBvc2l0ZSA9IG5ldyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChzZWxlY3RvckJ1aWxkZXIuYnVpbGQoKSwgYWN0aXZlU2Nhbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFPYmplY3RzQ29tcGF0LmVxdWFscyhtQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdCwgY29tcG9zaXRlKSkgewotICAgICAgICAgICAgbUNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3QgPSBjb21wb3NpdGU7Ci0gICAgICAgICAgICBtUHJvdmlkZXIuc2V0RGlzY292ZXJ5UmVxdWVzdChjb21wb3NpdGUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgQ2xpZW50UmVjb3JkIGdldENsaWVudChNZXNzZW5nZXIgbWVzc2VuZ2VyKSB7Ci0gICAgICAgIGludCBpbmRleCA9IGZpbmRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgcmV0dXJuIGluZGV4ID49IDAgPyBtQ2xpZW50cy5nZXQoaW5kZXgpIDogbnVsbDsKLSAgICB9Ci0KLSAgICBpbnQgZmluZENsaWVudChNZXNzZW5nZXIgbWVzc2VuZ2VyKSB7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DbGllbnRzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbUNsaWVudHMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGNsaWVudC5oYXNNZXNzZW5nZXIobWVzc2VuZ2VyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBzZW5kR2VuZXJpY0ZhaWx1cmUoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCkgewotICAgICAgICBpZiAocmVxdWVzdElkICE9IDApIHsKLSAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0dFTkVSSUNfRkFJTFVSRSwgcmVxdWVzdElkLCAwLCBudWxsLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2VuZEdlbmVyaWNTdWNjZXNzKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQpIHsKLSAgICAgICAgaWYgKHJlcXVlc3RJZCAhPSAwKSB7Ci0gICAgICAgICAgICBzZW5kUmVwbHkobWVzc2VuZ2VyLCBTRVJWSUNFX01TR19HRU5FUklDX1NVQ0NFU1MsIHJlcXVlc3RJZCwgMCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBzZW5kUmVwbHkoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHdoYXQsCi0gICAgICAgICAgICBpbnQgcmVxdWVzdElkLCBpbnQgYXJnLCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgewotICAgICAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKCk7Ci0gICAgICAgIG1zZy53aGF0ID0gd2hhdDsKLSAgICAgICAgbXNnLmFyZzEgPSByZXF1ZXN0SWQ7Ci0gICAgICAgIG1zZy5hcmcyID0gYXJnOwotICAgICAgICBtc2cub2JqID0gb2JqOwotICAgICAgICBtc2cuc2V0RGF0YShkYXRhKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1lc3Nlbmdlci5zZW5kKG1zZyk7Ci0gICAgICAgIH0gY2F0Y2ggKERlYWRPYmplY3RFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIFRoZSBjbGllbnQgZGllZC4KLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3Qgc2VuZCBtZXNzYWdlIHRvICIgKyBnZXRDbGllbnRJZChtZXNzZW5nZXIpLCBleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGdldENsaWVudElkKE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKLSAgICAgICAgcmV0dXJuICJDbGllbnQgY29ubmVjdGlvbiAiICsgbWVzc2VuZ2VyLmdldEJpbmRlcigpLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcml2YXRlSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBQcml2YXRlSGFuZGxlcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBQUklWQVRFX01TR19DTElFTlRfRElFRDoKLSAgICAgICAgICAgICAgICAgICAgb25CaW5kZXJEaWVkKChNZXNzZW5nZXIpbXNnLm9iaik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm92aWRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZVByb3ZpZGVyLkNhbGxiYWNrIHsKLSAgICAgICAgUHJvdmlkZXJDYWxsYmFjaygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc2NyaXB0b3JDaGFuZ2VkKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIHNlbmREZXNjcmlwdG9yQ2hhbmdlZChkZXNjcmlwdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ2xpZW50UmVjb3JkIGltcGxlbWVudHMgRGVhdGhSZWNpcGllbnQgewotICAgICAgICBwdWJsaWMgZmluYWwgTWVzc2VuZ2VyIG1NZXNzZW5nZXI7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbVZlcnNpb247Ci0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBtRGlzY292ZXJ5UmVxdWVzdDsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFNwYXJzZUFycmF5PE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXI+IG1Db250cm9sbGVycyA9Ci0gICAgICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXI+KCk7Ci0KLSAgICAgICAgcHVibGljIENsaWVudFJlY29yZChNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgdmVyc2lvbikgewotICAgICAgICAgICAgbU1lc3NlbmdlciA9IG1lc3NlbmdlcjsKLSAgICAgICAgICAgIG1WZXJzaW9uID0gdmVyc2lvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtTWVzc2VuZ2VyLmdldEJpbmRlcigpLmxpbmtUb0RlYXRoKHRoaXMsIDApOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyRGllZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IG1Db250cm9sbGVycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbGxlcnMudmFsdWVBdChpKS5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Db250cm9sbGVycy5jbGVhcigpOwotCi0gICAgICAgICAgICBtTWVzc2VuZ2VyLmdldEJpbmRlcigpLnVubGlua1RvRGVhdGgodGhpcywgMCk7Ci0KLSAgICAgICAgICAgIHNldERpc2NvdmVyeVJlcXVlc3QobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNZXNzZW5nZXIoTWVzc2VuZ2VyIG90aGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1lc3Nlbmdlci5nZXRCaW5kZXIoKSA9PSBvdGhlci5nZXRCaW5kZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNyZWF0ZVJvdXRlQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCwKLSAgICAgICAgICAgICAgICBpbnQgY29udHJvbGxlcklkKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRyb2xsZXJzLmluZGV4T2ZLZXkoY29udHJvbGxlcklkKSA8IDApIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSByb3V0ZUdyb3VwSWQgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgPyBtUHJvdmlkZXIub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDogbVByb3ZpZGVyLm9uQ3JlYXRlUm91dGVDb250cm9sbGVyKHJvdXRlSWQsIHJvdXRlR3JvdXBJZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlcnMucHV0KGNvbnRyb2xsZXJJZCwgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIoaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0gbUNvbnRyb2xsZXJzLmdldChjb250cm9sbGVySWQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy5yZW1vdmUoY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgZ2V0Um91dGVDb250cm9sbGVyKGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlcnMuZ2V0KGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZXREaXNjb3ZlcnlSZXF1ZXN0KE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgICAgIGlmICghT2JqZWN0c0NvbXBhdC5lcXVhbHMobURpc2NvdmVyeVJlcXVlc3QsIHJlcXVlc3QpKSB7Ci0gICAgICAgICAgICAgICAgbURpc2NvdmVyeVJlcXVlc3QgPSByZXF1ZXN0OwotICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVDb21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSdW5zIG9uIGEgYmluZGVyIHRocmVhZC4KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGJpbmRlckRpZWQoKSB7Ci0gICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZShQUklWQVRFX01TR19DTElFTlRfRElFRCwgbU1lc3Nlbmdlcikuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDbGllbnRJZChtTWVzc2VuZ2VyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXIgdGhhdCByZWNlaXZlcyBtZXNzYWdlcyBmcm9tIGNsaWVudHMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbm5lciBjbGFzcyBpcyBzdGF0aWMgYW5kIG9ubHkgcmV0YWlucyBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBzZXJ2aWNlCi0gICAgICogdG8gcHJldmVudCB0aGUgc2VydmljZSBmcm9tIGJlaW5nIGxlYWtlZCBpbiBjYXNlIG9uZSBvZiB0aGUgY2xpZW50cyBpcyBob2xkaW5nIGFuCi0gICAgICogYWN0aXZlIHJlZmVyZW5jZSB0byB0aGUgc2VydmVyJ3MgbWVzc2VuZ2VyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGhhbmRsZXIgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGhhbmRsZSBhbnkgbWVzc2FnZXMgb3RoZXIgdGhhbiB0aG9zZQotICAgICAqIHRoYXQgY29tZSBmcm9tIHRoZSBjbGllbnQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlY2VpdmVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlPiBtU2VydmljZVJlZjsKLQotICAgICAgICBwdWJsaWMgUmVjZWl2ZUhhbmRsZXIoTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgICAgICBtU2VydmljZVJlZiA9IG5ldyBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2U+KHNlcnZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lc3NlbmdlciBtZXNzZW5nZXIgPSBtc2cucmVwbHlUbzsKLSAgICAgICAgICAgIGlmIChpc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyKG1lc3NlbmdlcikpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2hhdCA9IG1zZy53aGF0OwotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXF1ZXN0SWQgPSBtc2cuYXJnMTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYXJnID0gbXNnLmFyZzI7Ci0gICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iaiA9IG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIGRhdGEgPSBtc2cucGVla0RhdGEoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NNZXNzYWdlKHdoYXQsIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIG9iaiwgZGF0YSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGdldENsaWVudElkKG1lc3NlbmdlcikgKyAiOiBNZXNzYWdlIGZhaWxlZCwgd2hhdD0iICsgd2hhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHJlcXVlc3RJZD0iICsgcmVxdWVzdElkICsgIiwgYXJnPSIgKyBhcmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBvYmo9IiArIG9iaiArICIsIGRhdGE9IiArIGRhdGEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljRmFpbHVyZShtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiSWdub3JpbmcgbWVzc2FnZSB3aXRob3V0IHZhbGlkIHJlcGx5IG1lc3Nlbmdlci4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoaW50IHdoYXQsCi0gICAgICAgICAgICAgICAgTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwgaW50IGFyZywgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2Ugc2VydmljZSA9IG1TZXJ2aWNlUmVmLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfUkVHSVNURVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblJlZ2lzdGVyQ2xpZW50KG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19VTlJFR0lTVEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25VbnJlZ2lzdGVyQ2xpZW50KG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfQ1JFQVRFX1JPVVRFX0NPTlRST0xMRVI6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByb3V0ZUlkID0gZGF0YS5nZXRTdHJpbmcoQ0xJRU5UX0RBVEFfUk9VVEVfSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJvdXRlR3JvdXBJZCA9IGRhdGEuZ2V0U3RyaW5nKENMSUVOVF9EQVRBX1JPVVRFX0xJQlJBUllfR1JPVVApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uQ3JlYXRlUm91dGVDb250cm9sbGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgcm91dGVJZCwgcm91dGVHcm91cElkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1JFTEVBU0VfUk9VVEVfQ09OVFJPTExFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uUmVsZWFzZVJvdXRlQ29udHJvbGxlcihtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnKTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfU0VMRUNUX1JPVVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25TZWxlY3RSb3V0ZShtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnKTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVhc29uID0gZGF0YSA9PSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkYXRhLmdldEludChDTElFTlRfREFUQV9VTlNFTEVDVF9SRUFTT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25VbnNlbGVjdFJvdXRlKG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIHJlYXNvbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1NFVF9ST1VURV9WT0xVTUU6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB2b2x1bWUgPSBkYXRhLmdldEludChDTElFTlRfREFUQV9WT0xVTUUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2x1bWUgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uU2V0Um91dGVWb2x1bWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnLCB2b2x1bWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRTogewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhID0gZGF0YS5nZXRJbnQoQ0xJRU5UX0RBVEFfVk9MVU1FLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25VcGRhdGVSb3V0ZVZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIGRlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblJvdXRlQ29udHJvbFJlcXVlc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnLCAoSW50ZW50KW9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNUOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqIGluc3RhbmNlb2YgQnVuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdC5mcm9tQnVuZGxlKChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblNldERpc2NvdmVyeVJlcXVlc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgIT0gbnVsbCAmJiByZXF1ZXN0LmlzVmFsaWQoKSA/IHJlcXVlc3QgOiBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlU2VsZWN0b3IuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlU2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2OWIxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVNlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBjYXBhYmlsaXRpZXMgb2Ygcm91dGVzIHRoYXQgYXBwbGljYXRpb25zIHdvdWxkIGxpa2UgdG8gZGlzY292ZXIgYW5kIHVzZS4KLSAqIDxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+RXhhbXBsZTwvaDM+Ci0gKiA8cHJlPgotICogTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yQnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcigpCi0gKiAgICAgICAgIC5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pCi0gKiAgICAgICAgIC5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykKLSAqICAgICAgICAgLmJ1aWxkKCk7Ci0gKgotICogTWVkaWFSb3V0ZXIgcm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7Ci0gKiByb3V0ZXIuYWRkQ2FsbGJhY2soc2VsZWN0b3IsIGNhbGxiYWNrLCBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZKTsKLSAqIDwvcHJlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZVNlbGVjdG9yIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05UUk9MX0NBVEVHT1JJRVMgPSAiY29udHJvbENhdGVnb3JpZXMiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLSAgICBMaXN0PFN0cmluZz4gbUNvbnRyb2xDYXRlZ29yaWVzOwotCi0gICAgLyoqCi0gICAgICogQW4gZW1wdHkgbWVkaWEgcm91dGUgc2VsZWN0b3IgdGhhdCB3aWxsIG5vdCBtYXRjaCBhbnkgcm91dGVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWVkaWFSb3V0ZVNlbGVjdG9yIEVNUFRZID0gbmV3IE1lZGlhUm91dGVTZWxlY3RvcihuZXcgQnVuZGxlKCksIG51bGwpOwotCi0gICAgTWVkaWFSb3V0ZVNlbGVjdG9yKEJ1bmRsZSBidW5kbGUsIExpc3Q8U3RyaW5nPiBjb250cm9sQ2F0ZWdvcmllcykgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBjb250cm9sQ2F0ZWdvcmllczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBjYXRlZ29yaWVzfSBpbiB0aGUgc2VsZWN0b3IuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGNhdGVnb3JpZXMuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRDb250cm9sQ2F0ZWdvcmllcygpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sQ2F0ZWdvcmllczsKLSAgICB9Ci0KLSAgICB2b2lkIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCkgewotICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcyA9IG1CdW5kbGUuZ2V0U3RyaW5nQXJyYXlMaXN0KEtFWV9DT05UUk9MX0NBVEVHT1JJRVMpOwotICAgICAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcyA9PSBudWxsIHx8IG1Db250cm9sQ2F0ZWdvcmllcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBDb2xsZWN0aW9ucy48U3RyaW5nPmVtcHR5TGlzdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBjb250YWlucyB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhdGVnb3J5IFRoZSBjYXRlZ29yeSB0byBjaGVjay4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNhdGVnb3J5IGlzIHByZXNlbnQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ29udHJvbENhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgewotICAgICAgICBpZiAoY2F0ZWdvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBjYXRlZ29yeUNvdW50ID0gbUNvbnRyb2xDYXRlZ29yaWVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcnlDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcy5nZXQoaSkuZXF1YWxzKGNhdGVnb3J5KSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0b3IgbWF0Y2hlcyBhdCBsZWFzdCBvbmUgb2YgdGhlIHNwZWNpZmllZCBjb250cm9sIGZpbHRlcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsdGVycyBUaGUgbGlzdCBvZiBjb250cm9sIGZpbHRlcnMgdG8gY29uc2lkZXIuCi0gICAgICogQHJldHVybiBUcnVlIGlmIGEgbWF0Y2ggaXMgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlc0NvbnRyb2xGaWx0ZXJzKExpc3Q8SW50ZW50RmlsdGVyPiBmaWx0ZXJzKSB7Ci0gICAgICAgIGlmIChmaWx0ZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY2F0ZWdvcnlDb3VudCA9IG1Db250cm9sQ2F0ZWdvcmllcy5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoY2F0ZWdvcnlDb3VudCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGZpbHRlckNvdW50ID0gZmlsdGVycy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVudEZpbHRlciBmaWx0ZXIgPSBmaWx0ZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNhdGVnb3J5Q291bnQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIuaGFzQ2F0ZWdvcnkobUNvbnRyb2xDYXRlZ29yaWVzLmdldChqKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzZWxlY3RvciBjb250YWlucyBhbGwgb2YgdGhlIGNhcGFiaWxpdGllcyBkZXNjcmliZWQKLSAgICAgKiBieSB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0byBiZSBleGFtaW5lZC4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBzZWxlY3RvciBjb250YWlucyBhbGwgb2YgdGhlIGNhcGFiaWxpdGllcyBkZXNjcmliZWQKLSAgICAgKiBieSB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIHNlbGVjdG9yLmVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzLmNvbnRhaW5zQWxsKHNlbGVjdG9yLm1Db250cm9sQ2F0ZWdvcmllcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0b3IgZG9lcyBub3Qgc3BlY2lmeSBhbnkgY2FwYWJpbGl0aWVzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgIHJldHVybiBtQ29udHJvbENhdGVnb3JpZXMuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0b3IgaGFzIGFsbCBvZiB0aGUgcmVxdWlyZWQgZmllbGRzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgIGlmIChtQ29udHJvbENhdGVnb3JpZXMuY29udGFpbnMobnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBNZWRpYVJvdXRlU2VsZWN0b3IpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVTZWxlY3RvciBvdGhlciA9IChNZWRpYVJvdXRlU2VsZWN0b3IpbzsKLSAgICAgICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICBvdGhlci5lbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sQ2F0ZWdvcmllcy5lcXVhbHMob3RoZXIubUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sQ2F0ZWdvcmllcy5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiTWVkaWFSb3V0ZVNlbGVjdG9yeyAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiY29udHJvbENhdGVnb3JpZXM9IikuYXBwZW5kKAotICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhnZXRDb250cm9sQ2F0ZWdvcmllcygpLnRvQXJyYXkoKSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGZyb21CdW5kbGUoQE51bGxhYmxlIEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZSAhPSBudWxsID8gbmV3IE1lZGlhUm91dGVTZWxlY3RvcihidW5kbGUsIG51bGwpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFSb3V0ZVNlbGVjdG9yIG1lZGlhIHJvdXRlIHNlbGVjdG9yc30uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtQ29udHJvbENhdGVnb3JpZXM7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgbWVkaWEgcm91dGUgc2VsZWN0b3IgYnVpbGRlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBzZWxlY3RvciBkZXNjcmlwdG9yIGJ1aWxkZXIgd2hvc2UgaW5pdGlhbCBjb250ZW50cyBhcmUKLSAgICAgICAgICogY29waWVkIGZyb20gYW4gZXhpc3Rpbmcgc2VsZWN0b3IuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZWxlY3Rvci5lbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgaWYgKCFzZWxlY3Rvci5tQ29udHJvbENhdGVnb3JpZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xDYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHNlbGVjdG9yLm1Db250cm9sQ2F0ZWdvcmllcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBjYXRlZ29yeX0gdG8gdGhlIGJ1aWxkZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjYXRlZ29yeSBUaGUgY2F0ZWdvcnkgdG8gYWRkIHRvIHRoZSBzZXQgb2YgZGVzaXJlZCBjYXBhYmlsaXRpZXMsIHN1Y2ggYXMKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX0FVRElPfS4KLSAgICAgICAgICogQHJldHVybiBUaGUgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuCi0gICAgICAgICAqLwotICAgICAgICBATm9uTnVsbAotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDb250cm9sQ2F0ZWdvcnkoQE5vbk51bGwgU3RyaW5nIGNhdGVnb3J5KSB7Ci0gICAgICAgICAgICBpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhdGVnb3J5IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xDYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1Db250cm9sQ2F0ZWdvcmllcy5jb250YWlucyhjYXRlZ29yeSkpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMuYWRkKGNhdGVnb3J5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSBsaXN0IG9mIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBjYXRlZ29yaWVzfSB0byB0aGUgYnVpbGRlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhdGVnb3JpZXMgVGhlIGxpc3QgY2F0ZWdvcmllcyB0byBhZGQgdG8gdGhlIHNldCBvZiBkZXNpcmVkIGNhcGFiaWxpdGllcywKLSAgICAgICAgICogc3VjaCBhcyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfQVVESU99LgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZy4KLSAgICAgICAgICovCi0gICAgICAgIEBOb25OdWxsCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENvbnRyb2xDYXRlZ29yaWVzKEBOb25OdWxsIENvbGxlY3Rpb248U3RyaW5nPiBjYXRlZ29yaWVzKSB7Ci0gICAgICAgICAgICBpZiAoY2F0ZWdvcmllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2F0ZWdvcmllcyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghY2F0ZWdvcmllcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBjYXRlZ29yeSA6IGNhdGVnb3JpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ29udHJvbENhdGVnb3J5KGNhdGVnb3J5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIHRoZSBjb250ZW50cyBvZiBhbiBleGlzdGluZyBtZWRpYSByb3V0ZSBzZWxlY3RvciB0byB0aGUgYnVpbGRlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciB3aG9zZSBjb250ZW50cyBhcmUgdG8gYmUgYWRkZWQuCi0gICAgICAgICAqIEByZXR1cm4gVGhlIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgQE5vbk51bGwKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkU2VsZWN0b3IoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkQ29udHJvbENhdGVnb3JpZXMoc2VsZWN0b3IuZ2V0Q29udHJvbENhdGVnb3JpZXMoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCdWlsZHMgdGhlIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3IgbWVkaWEgcm91dGUgc2VsZWN0b3J9LgotICAgICAgICAgKi8KLSAgICAgICAgQE5vbk51bGwKLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBidWlsZCgpIHsKLSAgICAgICAgICAgIGlmIChtQ29udHJvbENhdGVnb3JpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nQXJyYXlMaXN0KEtFWV9DT05UUk9MX0NBVEVHT1JJRVMsIG1Db250cm9sQ2F0ZWdvcmllcyk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVTZWxlY3RvcihidW5kbGUsIG1Db250cm9sQ2F0ZWdvcmllcyk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwMDUyZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkludERlZjsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRTZW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkFjdGl2aXR5TWFuYWdlckNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuaGFyZHdhcmUuZGlzcGxheS5EaXNwbGF5TWFuYWdlckNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuVm9sdW1lUHJvdmlkZXJDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLlBhaXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUHJvdmlkZXJNZXRhZGF0YTsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogTWVkaWFSb3V0ZXIgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBjb250cm9sIHRoZSByb3V0aW5nIG9mIG1lZGlhIGNoYW5uZWxzCi0gKiBhbmQgc3RyZWFtcyBmcm9tIHRoZSBjdXJyZW50IGRldmljZSB0byBleHRlcm5hbCBzcGVha2VycyBhbmQgZGVzdGluYXRpb24gZGV2aWNlcy4KLSAqIDxwPgotICogQSBNZWRpYVJvdXRlciBpbnN0YW5jZSBpcyByZXRyaWV2ZWQgdGhyb3VnaCB7QGxpbmsgI2dldEluc3RhbmNlfS4gIEFwcGxpY2F0aW9ucwotICogY2FuIHF1ZXJ5IHRoZSBtZWRpYSByb3V0ZXIgYWJvdXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZSBhbmQgaXRzIGNhcGFiaWxpdGllcwotICogdG8gZGV0ZXJtaW5lIGhvdyB0byBzZW5kIGNvbnRlbnQgdG8gdGhlIHJvdXRlJ3MgZGVzdGluYXRpb24uICBBcHBsaWNhdGlvbnMgY2FuCi0gKiBhbHNvIHtAbGluayBSb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0IHNlbmQgY29udHJvbCByZXF1ZXN0c30gdG8gdGhlIHJvdXRlCi0gKiB0byBhc2sgdGhlIHJvdXRlJ3MgZGVzdGluYXRpb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlbW90ZSBjb250cm9sIGZ1bmN0aW9ucwotICogc3VjaCBhcyBwbGF5aW5nIG1lZGlhLgotICogPC9wPjxwPgotICogU2VlIGFsc28ge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlcn0gZm9yIGluZm9ybWF0aW9uIG9uIGhvdyBhbiBhcHBsaWNhdGlvbgotICogY2FuIHB1Ymxpc2ggbmV3IG1lZGlhIHJvdXRlcyB0byB0aGUgbWVkaWEgcm91dGVyLgotICogPC9wPjxwPgotICogVGhlIG1lZGlhIHJvdXRlciBBUEkgaXMgbm90IHRocmVhZC1zYWZlOyBhbGwgaW50ZXJhY3Rpb25zIHdpdGggaXQgbXVzdCBiZQotICogZG9uZSBmcm9tIHRoZSBtYWluIHRocmVhZCBvZiB0aGUgcHJvY2Vzcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVyIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlciI7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICAvKioKLSAgICAgKiBQYXNzZWQgdG8ge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyI29uVW5zZWxlY3QoaW50KX0KLSAgICAgKiBhbmQge0BsaW5rIENhbGxiYWNrI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9IHdoZW4gdGhlIHJlYXNvbiB0aGUgcm91dGUKLSAgICAgKiB3YXMgdW5zZWxlY3RlZCBpcyB1bmtub3duLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU0VMRUNUX1JFQVNPTl9VTktOT1dOID0gMDsKLSAgICAvKioKLSAgICAgKiBQYXNzZWQgdG8ge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyI29uVW5zZWxlY3QoaW50KX0KLSAgICAgKiBhbmQge0BsaW5rIENhbGxiYWNrI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9IHdoZW4gdGhlIHVzZXIgcHJlc3NlZAotICAgICAqIHRoZSBkaXNjb25uZWN0IGJ1dHRvbiB0byBkaXNjb25uZWN0IGFuZCBrZWVwIHBsYXlpbmcuCi0gICAgICogPHA+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVEZXNjcmlwdG9yI2NhbkRpc2Nvbm5lY3RBbmRLZWVwUGxheWluZygpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRCA9IDE7Ci0gICAgLyoqCi0gICAgICogUGFzc2VkIHRvIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciNvblVuc2VsZWN0KGludCl9Ci0gICAgICogYW5kIHtAbGluayBDYWxsYmFjayNvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciwgUm91dGVJbmZvLCBpbnQpfSB3aGVuIHRoZSB1c2VyIHByZXNzZWQKLSAgICAgKiB0aGUgc3RvcCBjYXN0aW5nIGJ1dHRvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNFTEVDVF9SRUFTT05fU1RPUFBFRCA9IDI7Ci0gICAgLyoqCi0gICAgICogUGFzc2VkIHRvIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciNvblVuc2VsZWN0KGludCl9Ci0gICAgICogYW5kIHtAbGluayBDYWxsYmFjayNvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciwgUm91dGVJbmZvLCBpbnQpfSB3aGVuIHRoZSB1c2VyIHNlbGVjdGVkCi0gICAgICogYSBkaWZmZXJlbnQgcm91dGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUQgPSAzOwotCi0gICAgLy8gTWFpbnRhaW5zIGdsb2JhbCBtZWRpYSByb3V0ZXIgc3RhdGUgZm9yIHRoZSBwcm9jZXNzLgotICAgIC8vIFRoaXMgZmllbGQgaXMgaW5pdGlhbGl6ZWQgaW4gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoKSBiZWZvcmUgYW55Ci0gICAgLy8gTWVkaWFSb3V0ZXIgb2JqZWN0cyBhcmUgaW5zdGFudGlhdGVkIHNvIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUKLSAgICAvLyB2YWxpZCB3aGVuZXZlciBhbnkgaW5zdGFuY2UgbWV0aG9kIGlzIGludm9rZWQuCi0gICAgc3RhdGljIEdsb2JhbE1lZGlhUm91dGVyIHNHbG9iYWw7Ci0KLSAgICAvLyBDb250ZXh0LWJvdW5kIHN0YXRlIG9mIHRoZSBtZWRpYSByb3V0ZXIuCi0gICAgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBmaW5hbCBBcnJheUxpc3Q8Q2FsbGJhY2tSZWNvcmQ+IG1DYWxsYmFja1JlY29yZHMgPSBuZXcgQXJyYXlMaXN0PENhbGxiYWNrUmVjb3JkPigpOwotCi0gICAgQEludERlZihmbGFnID0gdHJ1ZSwKLSAgICAgICAgICAgIHZhbHVlID0gewotICAgICAgICAgICAgICAgICAgICBDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4sCi0gICAgICAgICAgICAgICAgICAgIENBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlksCi0gICAgICAgICAgICAgICAgICAgIENBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMKLSAgICAgICAgICAgIH0KLSAgICApCi0gICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotICAgIHByaXZhdGUgQGludGVyZmFjZSBDYWxsYmFja0ZsYWdzIHt9Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2FkZENhbGxiYWNrfTogQWN0aXZlbHkgc2NhbiBmb3Igcm91dGVzIHdoaWxlIHRoaXMgY2FsbGJhY2sKLSAgICAgKiBpcyByZWdpc3RlcmVkLgotICAgICAqIDxwPgotICAgICAqIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgdGhlIG1lZGlhIHJvdXRlciB3aWxsIGFjdGl2ZWx5IHNjYW4gZm9yIG5ldwotICAgICAqIHJvdXRlcy4gIENlcnRhaW4gcm91dGVzLCBzdWNoIGFzIHdpZmkgZGlzcGxheSByb3V0ZXMsIG1heSBub3QgYmUgZGlzY292ZXJhYmxlCi0gICAgICogZXhjZXB0IHdoZW4gYWN0aXZlbHkgc2Nhbm5pbmcuICBUaGlzIGZsYWcgaXMgdHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgcm91dGUgcGlja2VyCi0gICAgICogZGlhbG9nIGhhcyBiZWVuIG9wZW5lZCBieSB0aGUgdXNlciB0byBlbnN1cmUgdGhhdCB0aGUgcm91dGUgaW5mb3JtYXRpb24gaXMKLSAgICAgKiB1cCB0byBkYXRlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBY3RpdmUgc2Nhbm5pbmcgbWF5IGNvbnN1bWUgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgcG93ZXIgYW5kIG1heSBoYXZlIGludHJ1c2l2ZQotICAgICAqIGVmZmVjdHMgb24gd2lyZWxlc3MgY29ubmVjdGl2aXR5LiAgVGhlcmVmb3JlIGl0IGlzIGltcG9ydGFudCB0aGF0IGFjdGl2ZSBzY2FubmluZwotICAgICAqIG9ubHkgYmUgcmVxdWVzdGVkIHdoZW4gaXQgaXMgYWN0dWFsbHkgbmVlZGVkIHRvIHNhdGlzZnkgYSB1c2VyIHJlcXVlc3QgdG8KLSAgICAgKiBkaXNjb3ZlciBhbmQgc2VsZWN0IGEgbmV3IHJvdXRlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGZsYWcgaW1wbGllcyB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IGJ1dCBwZXJmb3JtaW5nCi0gICAgICogYWN0aXZlIHNjYW5zIGlzIG11Y2ggbW9yZSBleHBlbnNpdmUgdGhhbiBhIG5vcm1hbCBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOID0gMSA8PCAwOwotCi0gICAgLyoqCi0gICAgICogRmxhZyBmb3Ige0BsaW5rICNhZGRDYWxsYmFja306IERvIG5vdCBmaWx0ZXIgcm91dGUgZXZlbnRzLgotICAgICAqIDxwPgotICAgICAqIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCBmb3IgZXZlbnRzIHRoYXQgYWZmZWN0IGFueQotICAgICAqIHJvdXRlIGV2ZW4gaWYgdGhleSBkbyBub3QgbWF0Y2ggdGhlIGNhbGxiYWNrJ3MgZmlsdGVyLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTID0gMSA8PCAxOwotCi0gICAgLyoqCi0gICAgICogRmxhZyBmb3Ige0BsaW5rICNhZGRDYWxsYmFja306IFJlcXVlc3QgcGFzc2l2ZSByb3V0ZSBkaXNjb3Zlcnkgd2hpbGUgdGhpcwotICAgICAqIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQsIGV4Y2VwdCBvbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30uCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgbWVkaWEgcm91dGVyIHdpbGwgdHJ5IHRvIGRpc2NvdmVyIHJvdXRlcy4KLSAgICAgKiBBbHRob3VnaCByb3V0ZSBkaXNjb3ZlcnkgaXMgaW50ZW5kZWQgdG8gYmUgZWZmaWNpZW50LCBjaGVja2luZyBmb3IgbmV3IHJvdXRlcyBtYXkKLSAgICAgKiByZXN1bHQgaW4gc29tZSBuZXR3b3JrIGFjdGl2aXR5IGFuZCBjb3VsZCBzbG93bHkgZHJhaW4gdGhlIGJhdHRlcnkuICBUaGVyZWZvcmUKLSAgICAgKiBhcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgc3BlY2lmeSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IHdoZW4KLSAgICAgKiB0aGV5IGFyZSBydW5uaW5nIGluIHRoZSBmb3JlZ3JvdW5kIGFuZCB3b3VsZCBsaWtlIHRvIHByb3ZpZGUgdGhlIHVzZXIgd2l0aCB0aGUKLSAgICAgKiBvcHRpb24gb2YgY29ubmVjdGluZyB0byBuZXcgcm91dGVzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBcHBsaWNhdGlvbnMgc2hvdWxkIHR5cGljYWxseSBhZGQgYSBjYWxsYmFjayB1c2luZyB0aGlzIGZsYWcgaW4gdGhlCi0gICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5IGFjdGl2aXR5J3N9IHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblN0YXJ0IG9uU3RhcnR9Ci0gICAgICogbWV0aG9kIGFuZCByZW1vdmUgaXQgaW4gdGhlIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblN0b3Agb25TdG9wfSBtZXRob2QuCi0gICAgICogVGhlIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudH0gZnJhZ21lbnQgbWF5Ci0gICAgICogYWxzbyBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UuCi0gICAgICogPC9wPjxwIGNsYXNzPSJub3RlIj4KLSAgICAgKiBPbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30gdGhpcyBmbGFnCi0gICAgICogd2lsbCBiZSBpZ25vcmVkLiAgUmVmZXIgdG8KLSAgICAgKiB7QGxpbmsgI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCkgYWRkQ2FsbGJhY2t9IGZvciBkZXRhaWxzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZID0gMSA8PCAyOwotCi0gICAgLyoqCi0gICAgICogRmxhZyBmb3Ige0BsaW5rICNhZGRDYWxsYmFja306IFJlcXVlc3QgcGFzc2l2ZSByb3V0ZSBkaXNjb3Zlcnkgd2hpbGUgdGhpcwotICAgICAqIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQsIGV2ZW4gb24ge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNpc0xvd1JhbURldmljZSBsb3ctUkFNIGRldmljZXN9LgotICAgICAqIDxwIGNsYXNzPSJub3RlIj4KLSAgICAgKiBUaGlzIGZsYWcgaGFzIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIGxvdy1SQU0gZGV2aWNlcwotICAgICAqIHNpbmNlIGl0IG1heSBjYXVzZSBtYW55IG1lZGlhIHJvdXRlIHByb3ZpZGVycyB0byBiZSBzdGFydGVkIHNpbXVsdGFuZW91c2x5LgotICAgICAqIEl0IGlzIG11Y2ggYmV0dGVyIHRvIHVzZSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IGluc3RlYWQgdG8gYXZvaWQKLSAgICAgKiBwZXJmb3JtaW5nIHBhc3NpdmUgZGlzY292ZXJ5IG9uIHRoZXNlIGRldmljZXMgYWx0b2dldGhlci4gIFJlZmVyIHRvCi0gICAgICoge0BsaW5rICNhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IsIENhbGxiYWNrLCBpbnQpIGFkZENhbGxiYWNrfSBmb3IgZGV0YWlscy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlIGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTEJBQ0tfRkxBR19GT1JDRV9ESVNDT1ZFUlkgPSAxIDw8IDM7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2lzUm91dGVBdmFpbGFibGV9OiBJZ25vcmUgdGhlIGRlZmF1bHQgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBmbGFnIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBtYXRjaGluZyBub24tZGVmYXVsdCByb3V0ZSBpcyBhdmFpbGFibGUuCi0gICAgICogVGhpcyBjb25zdHJhaW50IG1heSBiZSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRvIG9mZmVyIHRoZSByb3V0ZSBjaG9vc2VyIGRpYWxvZwotICAgICAqIHRvIHRoZSB1c2VyLiAgVGhlcmUgaXMgbm8gcG9pbnQgb2ZmZXJpbmcgdGhlIGNob29zZXIgaWYgdGhlcmUgYXJlIG5vCi0gICAgICogbm9uLWRlZmF1bHQgY2hvaWNlcy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEUgPSAxIDw8IDA7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2lzUm91dGVBdmFpbGFibGV9OiBSZXF1aXJlIGFuIGFjdHVhbCByb3V0ZSB0byBiZSBtYXRjaGVkLgotICAgICAqIDxwPgotICAgICAqIElmIHRoaXMgZmxhZyBpcyBub3Qgc2V0LCB0aGVuIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX0gd2lsbCByZXR1cm4gdHJ1ZQotICAgICAqIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGRpc2NvdmVyIGEgbWF0Y2hpbmcgcm91dGUgZXZlbiBpZiBkaXNjb3ZlcnkgaXMgbm90IGluCi0gICAgICogcHJvZ3Jlc3Mgb3IgaWYgbm8gbWF0Y2hpbmcgcm91dGUgaGFzIHlldCBiZWVuIGZvdW5kLiAgVGhpcyBmZWF0dXJlIGlzIHVzZWQgdG8KLSAgICAgKiBzYXZlIHJlc291cmNlcyBieSByZW1vdmluZyB0aGUgbmVlZCB0byBwZXJmb3JtIHBhc3NpdmUgcm91dGUgZGlzY292ZXJ5IG9uCi0gICAgICoge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNpc0xvd1JhbURldmljZSBsb3ctUkFNIGRldmljZXN9LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGVuIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX0gd2lsbCBvbmx5IHJldHVybiB0cnVlIGlmCi0gICAgICogYSBtYXRjaGluZyByb3V0ZSBoYXMgYWN0dWFsbHkgYmVlbiBkaXNjb3ZlcmVkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVkFJTEFCSUxJVFlfRkxBR19SRVFVSVJFX01BVENIID0gMSA8PCAxOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1lZGlhIHJvdXRlciBzZXJ2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGV4dC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgYXBwbGljYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIGhvbGRpbmcgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIHRoZSByZXR1cm5lZAotICAgICAqIHtAbGluayBNZWRpYVJvdXRlcn0gaW5zdGFuY2UsIHN1Y2ggYXMgYnkgc3RvcmluZyB0aGUgaW5zdGFuY2UgaW4gYSBmaWVsZCBvZgotICAgICAqIHRoZSB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHl9LCB0byBlbnN1cmUgdGhhdCB0aGUgbWVkaWEgcm91dGVyIHJlbWFpbnMgYWxpdmUKLSAgICAgKiBhcyBsb25nIGFzIHRoZSBhcHBsaWNhdGlvbiBpcyB1c2luZyBpdHMgZmVhdHVyZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIEluIG90aGVyIHdvcmRzLCB0aGUgc3VwcG9ydCBsaWJyYXJ5IG9ubHkgaG9sZHMgYSB7QGxpbmsgV2Vha1JlZmVyZW5jZSB3ZWFrIHJlZmVyZW5jZX0KLSAgICAgKiB0byBlYWNoIG1lZGlhIHJvdXRlciBpbnN0YW5jZS4gIFdoZW4gdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBzdHJvbmcgcmVmZXJlbmNlcyB0byB0aGUKLSAgICAgKiBtZWRpYSByb3V0ZXIgaW5zdGFuY2UsIGFsbCBvZiBpdHMgY2FsbGJhY2tzIHdpbGwgYmUgcmVtb3ZlZCBhbmQgcm91dGUgZGlzY292ZXJ5Ci0gICAgICogd2lsbCBubyBsb25nZXIgYmUgcGVyZm9ybWVkIG9uIGl0cyBiZWhhbGYuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbWVkaWEgcm91dGVyIGluc3RhbmNlIGZvciB0aGUgY29udGV4dC4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGhvbGQKLSAgICAgKiBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QgYXMgbG9uZyBhcyBpdCBpcyBpbiB1c2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYVJvdXRlciBnZXRJbnN0YW5jZShATm9uTnVsbCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKHNHbG9iYWwgPT0gbnVsbCkgewotICAgICAgICAgICAgc0dsb2JhbCA9IG5ldyBHbG9iYWxNZWRpYVJvdXRlcihjb250ZXh0LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpKTsKLSAgICAgICAgICAgIHNHbG9iYWwuc3RhcnQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRSb3V0ZXIoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZXN9IGN1cnJlbnRseSBrbm93biB0bwotICAgICAqIHRoaXMgbWVkaWEgcm91dGVyLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFJvdXRlSW5mbz4gZ2V0Um91dGVzKCkgewotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0Um91dGVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUge0BsaW5rIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyByb3V0ZSBwcm92aWRlcnN9Ci0gICAgICogY3VycmVudGx5IGtub3duIHRvIHRoaXMgbWVkaWEgcm91dGVyLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFByb3ZpZGVySW5mbz4gZ2V0UHJvdmlkZXJzKCkgewotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0UHJvdmlkZXJzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGVmYXVsdCByb3V0ZSBmb3IgcGxheWluZyBtZWRpYSBjb250ZW50IG9uIHRoZSBzeXN0ZW0uCi0gICAgICogPHA+Ci0gICAgICogVGhlIHN5c3RlbSBhbHdheXMgcHJvdmlkZXMgYSBkZWZhdWx0IHJvdXRlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGRlZmF1bHQgcm91dGUsIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBSb3V0ZUluZm8gZ2V0RGVmYXVsdFJvdXRlKCkgewotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0RGVmYXVsdFJvdXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGJsdWV0b290aCByb3V0ZSBmb3IgcGxheWluZyBtZWRpYSBjb250ZW50IG9uIHRoZSBzeXN0ZW0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgYmx1ZXRvb3RoIHJvdXRlLCBpZiBleGlzdCwgb3RoZXJ3aXNlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIFJvdXRlSW5mbyBnZXRCbHVldG9vdGhSb3V0ZSgpIHsKLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIHJldHVybiBzR2xvYmFsLmdldEJsdWV0b290aFJvdXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZXhhbWluZSB0aGUgcm91dGUncwotICAgICAqIHtAbGluayBSb3V0ZUluZm8jZ2V0Q29udHJvbEZpbHRlcnMgbWVkaWEgY29udHJvbCBpbnRlbnQgZmlsdGVyc30gdG8gYXNzZXNzIHRoZQotICAgICAqIGNhcGFiaWxpdGllcyBvZiB0aGUgcm91dGUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gdXNlIGl0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5FeGFtcGxlPC9oMz4KLSAgICAgKiA8cHJlPgotICAgICAqIHB1YmxpYyBib29sZWFuIHBsYXlNb3ZpZSgpIHsKLSAgICAgKiAgICAgTWVkaWFSb3V0ZXIgbWVkaWFSb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgKiAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbWVkaWFSb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAqCi0gICAgICogICAgIC8vIEZpcnN0IHRyeSB1c2luZyB0aGUgcmVtb3RlIHBsYXliYWNrIGludGVyZmFjZSwgaWYgc3VwcG9ydGVkLgotICAgICAqICAgICBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykpIHsKLSAgICAgKiAgICAgICAgIC8vIFRoZSByb3V0ZSBzdXBwb3J0cyByZW1vdGUgcGxheWJhY2suCi0gICAgICogICAgICAgICAvLyBUcnkgdG8gc2VuZCBpdCB0aGUgVXJpIG9mIHRoZSBtb3ZpZSB0byBwbGF5LgotICAgICAqICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKTsKLSAgICAgKiAgICAgICAgIGludGVudC5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKLSAgICAgKiAgICAgICAgIGludGVudC5zZXREYXRhQW5kVHlwZSgiaHR0cDovL2V4YW1wbGUuY29tL3ZpZGVvcy9tb3ZpZS5tcDQiLCAidmlkZW8vbXA0Iik7Ci0gICAgICogICAgICAgICBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sUmVxdWVzdChpbnRlbnQpKSB7Ci0gICAgICogICAgICAgICAgICAgcm91dGUuc2VuZENvbnRyb2xSZXF1ZXN0KGludGVudCwgbnVsbCk7Ci0gICAgICogICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIHNlbnQgdGhlIHJlcXVlc3QgdG8gcGxheSB0aGUgbW92aWUKLSAgICAgKiAgICAgICAgIH0KLSAgICAgKiAgICAgfQotICAgICAqCi0gICAgICogICAgIC8vIElmIHJlbW90ZSBwbGF5YmFjayB3YXMgbm90IHBvc3NpYmxlLCB0aGVuIHBsYXkgbG9jYWxseS4KLSAgICAgKiAgICAgaWYgKHJvdXRlLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKSkgewotICAgICAqICAgICAgICAgLy8gVGhlIHJvdXRlIHN1cHBvcnRzIGxpdmUgdmlkZW8gc3RyZWFtaW5nLgotICAgICAqICAgICAgICAgLy8gUHJlcGFyZSB0byBwbGF5IGNvbnRlbnQgbG9jYWxseSBpbiBhIHdpbmRvdyBvciBpbiBhIHByZXNlbnRhdGlvbi4KLSAgICAgKiAgICAgICAgIHJldHVybiBwbGF5TW92aWVJbldpbmRvdygpOwotICAgICAqICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgLy8gTmVpdGhlciBpbnRlcmZhY2UgaXMgc3VwcG9ydGVkLCBzbyB3ZSBjYW4ndCBwbGF5IHRoZSBtb3ZpZSB0byB0aGlzIHJvdXRlLgotICAgICAqICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICogfQotICAgICAqIDwvcHJlPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0ZWQgcm91dGUsIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgbnVsbC4KLSAgICAgKgotICAgICAqIEBzZWUgUm91dGVJbmZvI2dldENvbnRyb2xGaWx0ZXJzCi0gICAgICogQHNlZSBSb3V0ZUluZm8jc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkKLSAgICAgKiBAc2VlIFJvdXRlSW5mbyNzdXBwb3J0c0NvbnRyb2xSZXF1ZXN0Ci0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgUm91dGVJbmZvIGdldFNlbGVjdGVkUm91dGUoKSB7Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgcm91dGUgaWYgaXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLCBvdGhlcndpc2UKLSAgICAgKiBzZWxlY3RzIHRoZSBkZWZhdWx0IHJvdXRlIGFuZCByZXR1cm5zIGl0LiBJZiB0aGVyZSBpcyBvbmUgbGl2ZSBhdWRpbyByb3V0ZQotICAgICAqICh1c3VhbGx5IEJsdWV0b290aCBBMkRQKSwgaXQgd2lsbCBiZSBzZWxlY3RlZCBpbnN0ZWFkIG9mIGRlZmF1bHQgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIG1hdGNoLgotICAgICAqIEByZXR1cm4gVGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgcm91dGUgaWYgaXQgbWF0Y2hlZCB0aGUgc2VsZWN0b3IsIG90aGVyd2lzZSB0aGUKLSAgICAgKiBuZXdseSBzZWxlY3RlZCBkZWZhdWx0IHJvdXRlIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgbnVsbC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZVNlbGVjdG9yCi0gICAgICogQHNlZSBSb3V0ZUluZm8jbWF0Y2hlc1NlbGVjdG9yCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgUm91dGVJbmZvIHVwZGF0ZVNlbGVjdGVkUm91dGUoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJ1cGRhdGVTZWxlY3RlZFJvdXRlOiAiICsgc2VsZWN0b3IpOwotICAgICAgICB9Ci0gICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHNHbG9iYWwuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICBpZiAoIXJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkgJiYgIXJvdXRlLm1hdGNoZXNTZWxlY3RvcihzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIHJvdXRlID0gc0dsb2JhbC5jaG9vc2VGYWxsYmFja1JvdXRlKCk7Ci0gICAgICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKHJvdXRlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcm91dGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VsZWN0cyB0aGUgc3BlY2lmaWVkIHJvdXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0byBzZWxlY3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0Um91dGUoQE5vbk51bGwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIGlmIChyb3V0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJzZWxlY3RSb3V0ZTogIiArIHJvdXRlKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKHJvdXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbnNlbGVjdHMgdGhlIGN1cnJlbnQgcm91bmQgYW5kIHNlbGVjdHMgdGhlIGRlZmF1bHQgcm91dGUgaW5zdGVhZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVhc29uIGdpdmVuIG11c3QgYmUgb25lIG9mOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9VTktOT1dOfTwvbGk+Ci0gICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEfTwvbGk+Ci0gICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fU1RPUFBFRH08L2xpPgotICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUR9PC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIGZvciBkaXNjb25uZWN0aW5nIHRoZSBjdXJyZW50IHJvdXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVuc2VsZWN0KGludCByZWFzb24pIHsKLSAgICAgICAgaWYgKHJlYXNvbiA8IE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9VTktOT1dOIHx8Ci0gICAgICAgICAgICAgICAgcmVhc29uID4gTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHJlYXNvbiB0byB1bnNlbGVjdCByb3V0ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIC8vIENob29zZSB0aGUgZmFsbGJhY2sgcm91dGUgaWYgaXQncyBub3QgYWxyZWFkeSBzZWxlY3RlZC4KLSAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZWxlY3QgdGhlIGRlZmF1bHQgcm91dGUuCi0gICAgICAgIFJvdXRlSW5mbyBmYWxsYmFja1JvdXRlID0gc0dsb2JhbC5jaG9vc2VGYWxsYmFja1JvdXRlKCk7Ci0gICAgICAgIGlmIChzR2xvYmFsLmdldFNlbGVjdGVkUm91dGUoKSAhPSBmYWxsYmFja1JvdXRlKSB7Ci0gICAgICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKGZhbGxiYWNrUm91dGUsIHJlYXNvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKHNHbG9iYWwuZ2V0RGVmYXVsdFJvdXRlKCksIHJlYXNvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSByb3V0ZSB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBzZWxlY3Rvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGFueSBhdmFpbGFibGUgcm91dGVzIHRoYXQgbWF0Y2ggdGhlCi0gICAgICogc2VsZWN0b3IgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgYXJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuIElmIHRoZQotICAgICAqIHtAbGluayAjQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEV9IGZsYWcgaXMgc3BlY2lmaWVkLCB0aGVuCi0gICAgICogdGhlIG1ldGhvZCB3aWxsIG9ubHkgY29uc2lkZXIgbm9uLWRlZmF1bHQgcm91dGVzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cCBjbGFzcz0ibm90ZSI+Ci0gICAgICogT24ge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNpc0xvd1JhbURldmljZSBsb3ctUkFNIGRldmljZXN9IHRoaXMgbWV0aG9kCi0gICAgICogd2lsbCByZXR1cm4gdHJ1ZSBpZiBpdCBpcyBwb3NzaWJsZSB0byBkaXNjb3ZlciBhIG1hdGNoaW5nIHJvdXRlIGV2ZW4gaWYKLSAgICAgKiBkaXNjb3ZlcnkgaXMgbm90IGluIHByb2dyZXNzIG9yIGlmIG5vIG1hdGNoaW5nIHJvdXRlIGhhcyB5ZXQgYmVlbiBmb3VuZC4KLSAgICAgKiBVc2Uge0BsaW5rICNBVkFJTEFCSUxJVFlfRkxBR19SRVFVSVJFX01BVENIfSB0byByZXF1aXJlIGFuIGFjdHVhbCBtYXRjaC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIG1hdGNoLgotICAgICAqIEBwYXJhbSBmbGFncyBGbGFncyB0byBjb250cm9sIHRoZSBkZXRlcm1pbmF0aW9uIG9mIHdoZXRoZXIgYSByb3V0ZSBtYXkgYmUKLSAgICAgKiAgICAgICAgICAgIGF2YWlsYWJsZS4gTWF5IGJlIHplcm8gb3Igc29tZSBjb21iaW5hdGlvbiBvZgotICAgICAqICAgICAgICAgICAge0BsaW5rICNBVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURX0gYW5kCi0gICAgICogICAgICAgICAgICB7QGxpbmsgI0FWQUlMQUJJTElUWV9GTEFHX1JFUVVJUkVfTUFUQ0h9LgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBhIG1hdGNoaW5nIHJvdXRlIG1heSBiZSBhdmFpbGFibGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNSb3V0ZUF2YWlsYWJsZShATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIGludCBmbGFncykgewotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIHJldHVybiBzR2xvYmFsLmlzUm91dGVBdmFpbGFibGUoc2VsZWN0b3IsIGZsYWdzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBkaXNjb3ZlciByb3V0ZXMgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IgYW5kIHRvIHJlY2VpdmUKLSAgICAgKiBldmVudHMgd2hlbiB0aGV5IGNoYW5nZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBjYWxsaW5nCi0gICAgICoge0BsaW5rICNhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IsIENhbGxiYWNrLCBpbnQpfSB3aXRob3V0IGZsYWdzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHJvdXRlIHNlbGVjdG9yIHRoYXQgaW5kaWNhdGVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdCB0aGUKLSAgICAgKiBjYWxsYmFjayB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gYWRkLgotICAgICAqIEBzZWUgI3JlbW92ZUNhbGxiYWNrCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBhZGRDYWxsYmFjayhzZWxlY3RvciwgY2FsbGJhY2ssIDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGRpc2NvdmVyIHJvdXRlcyB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBhbmQgdG8gcmVjZWl2ZQotICAgICAqIGV2ZW50cyB3aGVuIHRoZXkgY2hhbmdlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzZWxlY3RvciBkZXNjcmliZXMgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3YW50cyB0bwotICAgICAqIGRpc2NvdmVyLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBhcHBsaWNhdGlvbiB3YW50cyB0byB1c2UKLSAgICAgKiBsaXZlIGF1ZGlvIHJvdXRlcyB0aGVuIGl0IHNob3VsZCBpbmNsdWRlIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJTyBsaXZlIGF1ZGlvIG1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3J5fQotICAgICAqIGluIGl0cyBzZWxlY3RvciB3aGVuIGl0IGFkZHMgYSBjYWxsYmFjayB0byB0aGUgbWVkaWEgcm91dGVyLgotICAgICAqIFRoZSBzZWxlY3RvciBtYXkgaW5jbHVkZSBhbnkgbnVtYmVyIG9mIGNhdGVnb3JpZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHRoZSBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQsIHRoZW4gdGhlIHNlbGVjdG9yIGlzIGFkZGVkIHRvCi0gICAgICogdGhlIHNldCBvZiBzZWxlY3RvcnMgYmVpbmcgbW9uaXRvcmVkIGJ5IHRoZSBjYWxsYmFjay4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQnkgZGVmYXVsdCwgdGhlIGNhbGxiYWNrIHdpbGwgb25seSBiZSBpbnZva2VkIGZvciBldmVudHMgdGhhdCBhZmZlY3Qgcm91dGVzCi0gICAgICogdGhhdCBtYXRjaCB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLiAgRXZlbnQgZmlsdGVyaW5nIG1heSBiZSBkaXNhYmxlZCBieSBzcGVjaWZ5aW5nCi0gICAgICogdGhlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UU30gZmxhZyB3aGVuIHRoZSBjYWxsYmFjayBpcyByZWdpc3RlcmVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSB0aGUge0BsaW5rICNpc1JvdXRlQXZhaWxhYmxlfSBtZXRob2QgdG8gZGV0ZXJtaW5lCi0gICAgICogd2hldGhlciBpcyBpdCBwb3NzaWJsZSB0byBkaXNjb3ZlciBhIHJvdXRlIHdpdGggdGhlIGRlc2lyZWQgY2FwYWJpbGl0aWVzCi0gICAgICogYW5kIHRoZXJlZm9yZSB3aGV0aGVyIHRoZSBtZWRpYSByb3V0ZSBidXR0b24gc2hvdWxkIGJlIHNob3duIHRvIHRoZSB1c2VyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUge0BsaW5rICNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfSBmbGFnIHNob3VsZCBiZSB1c2VkIHdoaWxlIHRoZSBhcHBsaWNhdGlvbgotICAgICAqIGlzIGluIHRoZSBmb3JlZ3JvdW5kIHRvIHJlcXVlc3QgdGhhdCBwYXNzaXZlIGRpc2NvdmVyeSBiZSBwZXJmb3JtZWQgaWYgdGhlcmUgYXJlCi0gICAgICogc3VmZmljaWVudCByZXNvdXJjZXMgdG8gYWxsb3cgY29udGludW91cyBwYXNzaXZlIGRpc2NvdmVyeS4KLSAgICAgKiBPbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30gdGhpcyBmbGFnIHdpbGwgYmUKLSAgICAgKiBpZ25vcmVkIHRvIGNvbnNlcnZlIHJlc291cmNlcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19GT1JDRV9ESVNDT1ZFUll9IGZsYWcgc2hvdWxkIGJlIHVzZWQgd2hlbgotICAgICAqIHBhc3NpdmUgZGlzY292ZXJ5IGFic29sdXRlbHkgbXVzdCBiZSBwZXJmb3JtZWQsIGV2ZW4gb24gbG93LVJBTSBkZXZpY2VzLgotICAgICAqIFRoaXMgZmxhZyBoYXMgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBpbXBhY3Qgb24gbG93LVJBTSBkZXZpY2VzCi0gICAgICogc2luY2UgaXQgbWF5IGNhdXNlIG1hbnkgbWVkaWEgcm91dGUgcHJvdmlkZXJzIHRvIGJlIHN0YXJ0ZWQgc2ltdWx0YW5lb3VzbHkuCi0gICAgICogSXQgaXMgbXVjaCBiZXR0ZXIgdG8gdXNlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gaW5zdGVhZCB0byBhdm9pZAotICAgICAqIHBlcmZvcm1pbmcgcGFzc2l2ZSBkaXNjb3Zlcnkgb24gdGhlc2UgZGV2aWNlcyBhbHRvZ2V0aGVyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUge0BsaW5rICNDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU59IGZsYWcgc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUKLSAgICAgKiBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBpcyBzaG93aW5nIHRvIGNvbmZpcm0gdGhlIHByZXNlbmNlIG9mIGF2YWlsYWJsZQotICAgICAqIHJvdXRlcyB0aGF0IHRoZSB1c2VyIG1heSBjb25uZWN0IHRvLiAgVGhpcyBmbGFnIG1heSB1c2Ugc3Vic3RhbnRpYWxseSBtb3JlCi0gICAgICogcG93ZXIuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkV4YW1wbGU8L2gzPgotICAgICAqIDxwcmU+Ci0gICAgICogcHVibGljIGNsYXNzIE15QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0gICAgICogICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAgICAgKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5DYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgICogICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLSAgICAgKgotICAgICAqICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAqCi0gICAgICogICAgICAgICBtUm91dGVyID0gTWVkaWFyb3V0ZXIuZ2V0SW5zdGFuY2UodGhpcyk7Ci0gICAgICogICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTXlDYWxsYmFjaygpOwotICAgICAqICAgICAgICAgbVNlbGVjdG9yID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCkKLSAgICAgKiAgICAgICAgICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykKLSAgICAgKiAgICAgICAgICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKQotICAgICAqICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgKiAgICAgfQotICAgICAqCi0gICAgICogICAgIC8vIEFkZCB0aGUgY2FsbGJhY2sgb24gc3RhcnQgdG8gdGVsbCB0aGUgbWVkaWEgcm91dGVyIHdoYXQga2luZHMgb2Ygcm91dGVzCi0gICAgICogICAgIC8vIHRoZSBhcHBsaWNhdGlvbiBpcyBpbnRlcmVzdGVkIGluIHNvIHRoYXQgaXQgY2FuIHRyeSB0byBkaXNjb3ZlciBzdWl0YWJsZSBvbmVzLgotICAgICAqICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgewotICAgICAqICAgICAgICAgc3VwZXIub25TdGFydCgpOwotICAgICAqCi0gICAgICogICAgICAgICBtZWRpYVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywKLSAgICAgKiAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSk7Ci0gICAgICoKLSAgICAgKiAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1lZGlhUm91dGVyLnVwZGF0ZVNlbGVjdGVkUm91dGUobVNlbGVjdG9yKTsKLSAgICAgKiAgICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSByb3V0ZS4uLgotICAgICAqICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgLy8gUmVtb3ZlIHRoZSBzZWxlY3RvciBvbiBzdG9wIHRvIHRlbGwgdGhlIG1lZGlhIHJvdXRlciB0aGF0IGl0IG5vIGxvbmdlcgotICAgICAqICAgICAvLyBuZWVkcyB0byBpbnZlc3QgZWZmb3J0IHRyeWluZyB0byBkaXNjb3ZlciByb3V0ZXMgb2YgdGhlc2Uga2luZHMgZm9yIG5vdy4KLSAgICAgKiAgICAgcHVibGljIHZvaWQgb25TdG9wKCkgewotICAgICAqICAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gICAgICoKLSAgICAgKiAgICAgICAgIG1lZGlhUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICogICAgIH0KLSAgICAgKgotICAgICAqICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE15Q2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gICAgICogICAgICAgICAvLyBJbXBsZW1lbnQgY2FsbGJhY2sgbWV0aG9kcyBhcyBuZWVkZWQuCi0gICAgICogICAgIH0KLSAgICAgKiB9Ci0gICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgQSByb3V0ZSBzZWxlY3RvciB0aGF0IGluZGljYXRlcyB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlCi0gICAgICogY2FsbGJhY2sgd291bGQgbGlrZSB0byBkaXNjb3Zlci4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGFkZC4KLSAgICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3MgdG8gY29udHJvbCB0aGUgYmVoYXZpb3Igb2YgdGhlIGNhbGxiYWNrLgotICAgICAqIE1heSBiZSB6ZXJvIG9yIGEgY29tYmluYXRpb24gb2Yge0BsaW5rICNDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU59IGFuZAotICAgICAqIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UU30uCi0gICAgICogQHNlZSAjcmVtb3ZlQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDYWxsYmFjayhATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIEBOb25OdWxsIENhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgQENhbGxiYWNrRmxhZ3MgaW50IGZsYWdzKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImFkZENhbGxiYWNrOiBzZWxlY3Rvcj0iICsgc2VsZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjYWxsYmFjaz0iICsgY2FsbGJhY2sgKyAiLCBmbGFncz0iICsgSW50ZWdlci50b0hleFN0cmluZyhmbGFncykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2FsbGJhY2tSZWNvcmQgcmVjb3JkOwotICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2FsbGJhY2tSZWNvcmQoY2FsbGJhY2spOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICByZWNvcmQgPSBuZXcgQ2FsbGJhY2tSZWNvcmQodGhpcywgY2FsbGJhY2spOwotICAgICAgICAgICAgbUNhbGxiYWNrUmVjb3Jkcy5hZGQocmVjb3JkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlY29yZCA9IG1DYWxsYmFja1JlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHVwZGF0ZU5lZWRlZCA9IGZhbHNlOwotICAgICAgICBpZiAoKGZsYWdzICYgfnJlY29yZC5tRmxhZ3MpICE9IDApIHsKLSAgICAgICAgICAgIHJlY29yZC5tRmxhZ3MgfD0gZmxhZ3M7Ci0gICAgICAgICAgICB1cGRhdGVOZWVkZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcmVjb3JkLm1TZWxlY3Rvci5jb250YWlucyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIHJlY29yZC5tU2VsZWN0b3IgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIocmVjb3JkLm1TZWxlY3RvcikKLSAgICAgICAgICAgICAgICAgICAgLmFkZFNlbGVjdG9yKHNlbGVjdG9yKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgIHVwZGF0ZU5lZWRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVwZGF0ZU5lZWRlZCkgewotICAgICAgICAgICAgc0dsb2JhbC51cGRhdGVEaXNjb3ZlcnlSZXF1ZXN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgY2FsbGJhY2suICBJdCB3aWxsIG5vIGxvbmdlciByZWNlaXZlIGV2ZW50cyBhYm91dAotICAgICAqIGNoYW5nZXMgdG8gbWVkaWEgcm91dGVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZW1vdmUuCi0gICAgICogQHNlZSAjYWRkQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVDYWxsYmFjayhATm9uTnVsbCBDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlQ2FsbGJhY2s6IGNhbGxiYWNrPSIgKyBjYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2FsbGJhY2tSZWNvcmQoY2FsbGJhY2spOwotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgbUNhbGxiYWNrUmVjb3Jkcy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgc0dsb2JhbC51cGRhdGVEaXNjb3ZlcnlSZXF1ZXN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBmaW5kQ2FsbGJhY2tSZWNvcmQoQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNhbGxiYWNrUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgaWYgKG1DYWxsYmFja1JlY29yZHMuZ2V0KGkpLm1DYWxsYmFjayA9PSBjYWxsYmFjaykgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgYSBtZWRpYSByb3V0ZSBwcm92aWRlciB3aXRoaW4gdGhpcyBhcHBsaWNhdGlvbiBwcm9jZXNzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBwcm92aWRlciB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHByb3ZpZGVycyB0aGF0IGFsbCB7QGxpbmsgTWVkaWFSb3V0ZXJ9Ci0gICAgICogaW5zdGFuY2VzIHdpdGhpbiB0aGlzIHByb2Nlc3MgY2FuIHVzZSB0byBkaXNjb3ZlciByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3ZpZGVySW5zdGFuY2UgVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGluc3RhbmNlIHRvIGFkZC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZVByb3ZpZGVyCi0gICAgICogQHNlZSAjcmVtb3ZlQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm92aWRlcihATm9uTnVsbCBNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSkgewotICAgICAgICBpZiAocHJvdmlkZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwcm92aWRlckluc3RhbmNlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImFkZFByb3ZpZGVyOiAiICsgcHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc0dsb2JhbC5hZGRQcm92aWRlcihwcm92aWRlckluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbnJlZ2lzdGVycyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpdGhpbiB0aGlzIGFwcGxpY2F0aW9uIHByb2Nlc3MuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHByb3ZpZGVyIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIHByb3ZpZGVycyB0aGF0IGFsbCB7QGxpbmsgTWVkaWFSb3V0ZXJ9Ci0gICAgICogaW5zdGFuY2VzIHdpdGhpbiB0aGlzIHByb2Nlc3MgY2FuIHVzZSB0byBkaXNjb3ZlciByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3ZpZGVySW5zdGFuY2UgVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGluc3RhbmNlIHRvIHJlbW92ZS4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZVByb3ZpZGVyCi0gICAgICogQHNlZSAjYWRkQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm92aWRlcihATm9uTnVsbCBNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSkgewotICAgICAgICBpZiAocHJvdmlkZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwcm92aWRlckluc3RhbmNlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInJlbW92ZVByb3ZpZGVyOiAiICsgcHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc0dsb2JhbC5yZW1vdmVQcm92aWRlcihwcm92aWRlckluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgcmVtb3RlIGNvbnRyb2wgY2xpZW50IHRvIGVuYWJsZSByZW1vdGUgY29udHJvbCBvZiB0aGUgdm9sdW1lCi0gICAgICogb2YgdGhlIHNlbGVjdGVkIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZW1vdGUgY29udHJvbCBjbGllbnQgbXVzdCBoYXZlIHByZXZpb3VzbHkgYmVlbiByZWdpc3RlcmVkIHdpdGgKLSAgICAgKiB0aGUgYXVkaW8gbWFuYWdlciB1c2luZyB0aGUge0BsaW5rIGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyI3JlZ2lzdGVyUmVtb3RlQ29udHJvbENsaWVudAotICAgICAqIEF1ZGlvTWFuYWdlci5yZWdpc3RlclJlbW90ZUNvbnRyb2xDbGllbnR9IG1ldGhvZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVtb3RlQ29udHJvbENsaWVudCBUaGUge0BsaW5rIGFuZHJvaWQubWVkaWEuUmVtb3RlQ29udHJvbENsaWVudH0gdG8gcmVnaXN0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUmVtb3RlQ29udHJvbENsaWVudChATm9uTnVsbCBPYmplY3QgcmVtb3RlQ29udHJvbENsaWVudCkgewotICAgICAgICBpZiAocmVtb3RlQ29udHJvbENsaWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyZW1vdGVDb250cm9sQ2xpZW50IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImFkZFJlbW90ZUNvbnRyb2xDbGllbnQ6ICIgKyByZW1vdGVDb250cm9sQ2xpZW50KTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLmFkZFJlbW90ZUNvbnRyb2xDbGllbnQocmVtb3RlQ29udHJvbENsaWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIHJlbW90ZSBjb250cm9sIGNsaWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZW1vdGVDb250cm9sQ2xpZW50IFRoZSB7QGxpbmsgYW5kcm9pZC5tZWRpYS5SZW1vdGVDb250cm9sQ2xpZW50fQotICAgICAqICAgICAgICAgICAgdG8gdW5yZWdpc3Rlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KEBOb25OdWxsIE9iamVjdCByZW1vdGVDb250cm9sQ2xpZW50KSB7Ci0gICAgICAgIGlmIChyZW1vdGVDb250cm9sQ2xpZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJlbW90ZUNvbnRyb2xDbGllbnQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJyZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50OiAiICsgcmVtb3RlQ29udHJvbENsaWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgc0dsb2JhbC5yZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KHJlbW90ZUNvbnRyb2xDbGllbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHNlc3Npb24gdG8gZW5hYmxlIHJlbW90ZSBjb250cm9sIG9mIHRoZSB2b2x1bWUgb2YgdGhlCi0gICAgICogc2VsZWN0ZWQgcm91dGUuIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZgotICAgICAqIHtAbGluayAjYWRkUmVtb3RlQ29udHJvbENsaWVudH0gd2hlbiB1c2luZyBtZWRpYSBzZXNzaW9ucy4gU2V0IHRoZQotICAgICAqIHNlc3Npb24gdG8gbnVsbCB0byBjbGVhciBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZWRpYVNlc3Npb24gVGhlIHtAbGluayBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9ufSB0bwotICAgICAqICAgICAgICAgICAgdXNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvbihPYmplY3QgbWVkaWFTZXNzaW9uKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkTWVkaWFTZXNzaW9uOiAiICsgbWVkaWFTZXNzaW9uKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnNldE1lZGlhU2Vzc2lvbihtZWRpYVNlc3Npb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjb21wYXQgbWVkaWEgc2Vzc2lvbiB0byBlbmFibGUgcmVtb3RlIGNvbnRyb2wgb2YgdGhlIHZvbHVtZSBvZiB0aGUKLSAgICAgKiBzZWxlY3RlZCByb3V0ZS4gVGhpcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mCi0gICAgICoge0BsaW5rICNhZGRSZW1vdGVDb250cm9sQ2xpZW50fSB3aGVuIHVzaW5nIHtAbGluayBNZWRpYVNlc3Npb25Db21wYXR9LgotICAgICAqIFNldCB0aGUgc2Vzc2lvbiB0byBudWxsIHRvIGNsZWFyIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lZGlhU2Vzc2lvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvbkNvbXBhdChNZWRpYVNlc3Npb25Db21wYXQgbWVkaWFTZXNzaW9uKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkTWVkaWFTZXNzaW9uQ29tcGF0OiAiICsgbWVkaWFTZXNzaW9uKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnNldE1lZGlhU2Vzc2lvbkNvbXBhdChtZWRpYVNlc3Npb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb25Db21wYXQuVG9rZW4gZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKSB7Ci0gICAgICAgIHJldHVybiBzR2xvYmFsLmdldE1lZGlhU2Vzc2lvblRva2VuKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5zdXJlcyB0aGF0IGNhbGxzIGludG8gdGhlIG1lZGlhIHJvdXRlciBhcmUgb24gdGhlIGNvcnJlY3QgdGhyZWFkLgotICAgICAqIEl0IHBheXMgdG8gYmUgYSBsaXR0bGUgcGFyYW5vaWQgd2hlbiBnbG9iYWwgc3RhdGUgaW52YXJpYW50cyBhcmUgYXQgcmlzay4KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBjaGVja0NhbGxpbmdUaHJlYWQoKSB7Ci0gICAgICAgIGlmIChMb29wZXIubXlMb29wZXIoKSAhPSBMb29wZXIuZ2V0TWFpbkxvb3BlcigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgbWVkaWEgcm91dGVyIHNlcnZpY2UgbXVzdCBvbmx5IGJlICIKLSAgICAgICAgICAgICAgICAgICAgKyAiYWNjZXNzZWQgb24gdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbiB0aHJlYWQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgPFQ+IGJvb2xlYW4gZXF1YWwoVCBhLCBUIGIpIHsKLSAgICAgICAgcmV0dXJuIGEgPT0gYiB8fCAoYSAhPSBudWxsICYmIGIgIT0gbnVsbCAmJiBhLmVxdWFscyhiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBtZWRpYSByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBFYWNoIG1lZGlhIHJvdXRlIGhhcyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfQotICAgICAqIHtAbGluayAjZ2V0Q29udHJvbEZpbHRlcnMgaW50ZW50IGZpbHRlcnN9IHRoYXQgZGVzY3JpYmUgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUKLSAgICAgKiByb3V0ZSBhbmQgdGhlIG1hbm5lciBpbiB3aGljaCBpdCBpcyB1c2VkIGFuZCBjb250cm9sbGVkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJJbmZvIG1Qcm92aWRlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbURlc2NyaXB0b3JJZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVVuaXF1ZUlkOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtTmFtZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbURlc2NyaXB0aW9uOwotICAgICAgICBwcml2YXRlIFVyaSBtSWNvblVyaTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNvbm5lY3Rpbmc7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Db25uZWN0aW9uU3RhdGU7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ2FuRGlzY29ubmVjdDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPiBtQ29udHJvbEZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBsYXliYWNrVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBsYXliYWNrU3RyZWFtOwotICAgICAgICBwcml2YXRlIGludCBtRGV2aWNlVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVZvbHVtZUhhbmRsaW5nOwotICAgICAgICBwcml2YXRlIGludCBtVm9sdW1lOwotICAgICAgICBwcml2YXRlIGludCBtVm9sdW1lTWF4OwotICAgICAgICBwcml2YXRlIERpc3BsYXkgbVByZXNlbnRhdGlvbkRpc3BsYXk7Ci0gICAgICAgIHByaXZhdGUgaW50IG1QcmVzZW50YXRpb25EaXNwbGF5SWQgPSBQUkVTRU5UQVRJT05fRElTUExBWV9JRF9OT05FOwotICAgICAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOwotICAgICAgICBwcml2YXRlIEludGVudFNlbmRlciBtU2V0dGluZ3NJbnRlbnQ7Ci0gICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yIG1EZXNjcmlwdG9yOwotCi0gICAgICAgIEBJbnREZWYoe0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVELCBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkcsCi0gICAgICAgICAgICAgICAgQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUR9KQotICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgICAgIHByaXZhdGUgQGludGVyZmFjZSBDb25uZWN0aW9uU3RhdGUge30KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGRlZmF1bHQgY29ubmVjdGlvbiBzdGF0ZSBpbmRpY2F0aW5nIHRoZSByb3V0ZSBpcyBkaXNjb25uZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldENvbm5lY3Rpb25TdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQgPSAwOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIGNvbm5lY3Rpb24gc3RhdGUgaW5kaWNhdGluZyB0aGUgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZyBhbmQgaXMgbm90IHlldAotICAgICAgICAgKiByZWFkeSBmb3IgdXNlLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXRDb25uZWN0aW9uU3RhdGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORyA9IDE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgY29ubmVjdGlvbiBzdGF0ZSBpbmRpY2F0aW5nIHRoZSByb3V0ZSBpcyBjb25uZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldENvbm5lY3Rpb25TdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQgPSAyOwotCi0gICAgICAgIEBJbnREZWYoe1BMQVlCQUNLX1RZUEVfTE9DQUwsUExBWUJBQ0tfVFlQRV9SRU1PVEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgICAgIHByaXZhdGUgQGludGVyZmFjZSBQbGF5YmFja1R5cGUge30KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGRlZmF1bHQgcGxheWJhY2sgdHlwZSwgImxvY2FsIiwgaW5kaWNhdGluZyB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBtZWRpYQotICAgICAgICAgKiBpcyBoYXBwZW5pbmcgb24gdGhlIHNhbWUgZGV2aWNlIChlLmcuIGEgcGhvbmUsIGEgdGFibGV0KSBhcyB3aGVyZSBpdCBpcwotICAgICAgICAgKiBjb250cm9sbGVkIGZyb20uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldFBsYXliYWNrVHlwZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVFlQRV9MT0NBTCA9IDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgcGxheWJhY2sgdHlwZSBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGlzIGhhcHBlbmluZyBvbgotICAgICAgICAgKiBhIGRpZmZlcmVudCBkZXZpY2UgKGkuZS4gdGhlIHJlbW90ZSBkZXZpY2UpIHRoYW4gd2hlcmUgaXQgaXMgY29udHJvbGxlZCBmcm9tLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXRQbGF5YmFja1R5cGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1RZUEVfUkVNT1RFID0gMTsKLQotICAgICAgICBASW50RGVmKHtERVZJQ0VfVFlQRV9VTktOT1dOLCBERVZJQ0VfVFlQRV9UViwgREVWSUNFX1RZUEVfU1BFQUtFUiwgREVWSUNFX1RZUEVfQkxVRVRPT1RIfSkKLSAgICAgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotICAgICAgICBwcml2YXRlIEBpbnRlcmZhY2UgRGV2aWNlVHlwZSB7fQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVmYXVsdCByZWNlaXZlciBkZXZpY2UgdHlwZSBvZiB0aGUgcm91dGUgaW5kaWNhdGluZyB0aGUgdHlwZSBpcyB1bmtub3duLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXREZXZpY2VUeXBlCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfVFlQRV9VTktOT1dOID0gMDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQSByZWNlaXZlciBkZXZpY2UgdHlwZSBvZiB0aGUgcm91dGUgaW5kaWNhdGluZyB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBtZWRpYSBpcyBoYXBwZW5pbmcKLSAgICAgICAgICogb24gYSBUVi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0RGV2aWNlVHlwZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1RZUEVfVFYgPSAxOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIHJlY2VpdmVyIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZSBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGlzIGhhcHBlbmluZwotICAgICAgICAgKiBvbiBhIHNwZWFrZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldERldmljZVR5cGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9UWVBFX1NQRUFLRVIgPSAyOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIHJlY2VpdmVyIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZSBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGlzIGhhcHBlbmluZwotICAgICAgICAgKiBvbiBhIGJsdWV0b290aCBkZXZpY2Ugc3VjaCBhcyBhIGJsdWV0b290aCBzcGVha2VyLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXREZXZpY2VUeXBlCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfVFlQRV9CTFVFVE9PVEggPSAzOwotCi0gICAgICAgIEBJbnREZWYoe1BMQVlCQUNLX1ZPTFVNRV9GSVhFRCxQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgICAgIHByaXZhdGUgQGludGVyZmFjZSBQbGF5YmFja1ZvbHVtZSB7fQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQbGF5YmFjayBpbmZvcm1hdGlvbiBpbmRpY2F0aW5nIHRoZSBwbGF5YmFjayB2b2x1bWUgaXMgZml4ZWQsIGkuZS4gaXQgY2Fubm90IGJlCi0gICAgICAgICAqIGNvbnRyb2xsZWQgZnJvbSB0aGlzIG9iamVjdC4gQW4gZXhhbXBsZSBvZiBmaXhlZCBwbGF5YmFjayB2b2x1bWUgaXMgYSByZW1vdGUgcGxheWVyLAotICAgICAgICAgKiBwbGF5aW5nIG92ZXIgSERNSSB3aGVyZSB0aGUgdXNlciBwcmVmZXJzIHRvIGNvbnRyb2wgdGhlIHZvbHVtZSBvbiB0aGUgSERNSSBzaW5rLCByYXRoZXIKLSAgICAgICAgICogdGhhbiBhdHRlbnVhdGUgYXQgdGhlIHNvdXJjZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0Vm9sdW1lSGFuZGxpbmcKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1ZPTFVNRV9GSVhFRCA9IDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBsYXliYWNrIGluZm9ybWF0aW9uIGluZGljYXRpbmcgdGhlIHBsYXliYWNrIHZvbHVtZSBpcyB2YXJpYWJsZSBhbmQgY2FuIGJlIGNvbnRyb2xsZWQKLSAgICAgICAgICogZnJvbSB0aGlzIG9iamVjdC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0Vm9sdW1lSGFuZGxpbmcKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRSA9IDE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBkZWZhdWx0IHByZXNlbnRhdGlvbiBkaXNwbGF5IGlkIGluZGljYXRpbmcgbm8gcHJlc2VudGF0aW9uIGRpc3BsYXkgaXMgYXNzb2NpYXRlZAotICAgICAgICAgKiB3aXRoIHRoZSByb3V0ZS4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRVNFTlRBVElPTl9ESVNQTEFZX0lEX05PTkUgPSAtMTsKLQotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9HRU5FUkFMID0gMSA8PCAwOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9WT0xVTUUgPSAxIDw8IDE7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX1BSRVNFTlRBVElPTl9ESVNQTEFZID0gMSA8PCAyOwotCi0gICAgICAgIC8vIFNob3VsZCBtYXRjaCB0byBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuUEFDS0FHRV9OQU1FLgotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9NRURJQV9ST1VURV9QUk9WSURFUl9QQUNLQUdFX05BTUUgPSAiYW5kcm9pZCI7Ci0KLSAgICAgICAgUm91dGVJbmZvKFByb3ZpZGVySW5mbyBwcm92aWRlciwgU3RyaW5nIGRlc2NyaXB0b3JJZCwgU3RyaW5nIHVuaXF1ZUlkKSB7Ci0gICAgICAgICAgICBtUHJvdmlkZXIgPSBwcm92aWRlcjsKLSAgICAgICAgICAgIG1EZXNjcmlwdG9ySWQgPSBkZXNjcmlwdG9ySWQ7Ci0gICAgICAgICAgICBtVW5pcXVlSWQgPSB1bmlxdWVJZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm92aWRlciBvZiB0aGlzIG1lZGlhIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFByb3ZpZGVySW5mbyBnZXRQcm92aWRlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJvdmlkZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByb3V0ZSB1bmlxdWUgaWQgZnVuY3Rpb25zIGFzIGEgc3RhYmxlIGlkZW50aWZpZXIgYnkgd2hpY2ggdGhlIHJvdXRlIGlzIGtub3duLgotICAgICAgICAgKiBGb3IgZXhhbXBsZSwgYW4gYXBwbGljYXRpb24gY2FuIHVzZSB0aGlzIGlkIGFzIGEgdG9rZW4gdG8gcmVtZW1iZXIgdGhlCi0gICAgICAgICAqIHNlbGVjdGVkIHJvdXRlIGFjcm9zcyByZXN0YXJ0cyBvciB0byBjb21tdW5pY2F0ZSBpdHMgaWRlbnRpdHkgdG8gYSBzZXJ2aWNlLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHVuaXF1ZSBpZCBvZiB0aGUgcm91dGUsIG5ldmVyIG51bGwuCi0gICAgICAgICAqLwotICAgICAgICBATm9uTnVsbAotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1VbmlxdWVJZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcm91dGUgbmFtZSBpZGVudGlmaWVzIHRoZSBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgbmFtZSwgYW4gYWxpYXMsIG9yIGRldmljZSBzZXJpYWwgbnVtYmVyLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIGEgbWVkaWEgcm91dGUuICBUaGlzIGlzIHRoZSBzdHJpbmcgcHJlc2VudGVkCi0gICAgICAgICAqIHRvIHVzZXJzIHdobyBtYXkgc2VsZWN0IHRoaXMgYXMgdGhlIGFjdGl2ZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB1c2VyLXZpc2libGUgZGVzY3JpcHRpb24gb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJvdXRlIGRlc2NyaXB0aW9uIGRlc2NyaWJlcyB0aGUga2luZCBvZiBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgc3RyaW5nLCBhIG1vZGVsIG51bWJlciBvciBicmFuZCBvZiBkZXZpY2UuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJvdXRlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqLwotICAgICAgICBATnVsbGFibGUKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRpb247Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgVVJJIG9mIHRoZSBpY29uIHJlcHJlc2VudGluZyB0aGlzIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhpcyBpY29uIHdpbGwgYmUgdXNlZCBpbiBwaWNrZXIgVUlzIGlmIGF2YWlsYWJsZS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBVcmkgZ2V0SWNvblVyaSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSWNvblVyaTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyBlbmFibGVkIGFuZCBtYXkgYmUgc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGVuYWJsZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUVuYWJsZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nIGFuZCBpcyBub3QKLSAgICAgICAgICogeWV0IHJlYWR5IGZvciB1c2UuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmcuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhpcyByb3V0ZToge0BsaW5rICNDT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRH0sCi0gICAgICAgICAqIHtAbGluayAjQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HfSwgb3Ige0BsaW5rICNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRH0uCi0gICAgICAgICAqLwotICAgICAgICBAQ29ubmVjdGlvblN0YXRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db25uZWN0aW9uU3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcm91dGUgaXMgY3VycmVudGx5IHNlbGVjdGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjZ2V0U2VsZWN0ZWRSb3V0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0U2VsZWN0ZWRSb3V0ZSgpID09IHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcm91dGUgaXMgdGhlIGRlZmF1bHQgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIHRoZSBkZWZhdWx0IHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2dldERlZmF1bHRSb3V0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXREZWZhdWx0Um91dGUoKSA9PSB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGEgYmx1ZXRvb3RoIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBpcyBhIGJsdWV0b290aCByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYVJvdXRlciNnZXRCbHVldG9vdGhSb3V0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNCbHVldG9vdGgoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIHJldHVybiBzR2xvYmFsLmdldEJsdWV0b290aFJvdXRlKCkgPT0gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyB0aGUgZGVmYXVsdCByb3V0ZSBhbmQgdGhlIGRldmljZSBzcGVha2VyLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBpcyB0aGUgZGVmYXVsdCByb3V0ZSBhbmQgdGhlIGRldmljZSBzcGVha2VyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZXZpY2VTcGVha2VyKCkgewotICAgICAgICAgICAgaW50IGRlZmF1bHRBdWRpb1JvdXRlTmFtZVJlc291cmNlSWQgPSBSZXNvdXJjZXMuZ2V0U3lzdGVtKCkuZ2V0SWRlbnRpZmllcigKLSAgICAgICAgICAgICAgICAgICAgImRlZmF1bHRfYXVkaW9fcm91dGVfbmFtZSIsICJzdHJpbmciLCAiYW5kcm9pZCIpOwotICAgICAgICAgICAgcmV0dXJuIGlzRGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgICAgICYmIFJlc291cmNlcy5nZXRTeXN0ZW0oKS5nZXRUZXh0KGRlZmF1bHRBdWRpb1JvdXRlTmFtZVJlc291cmNlSWQpLmVxdWFscyhtTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0gZmlsdGVycyB0aGF0Ci0gICAgICAgICAqIGRlc2NyaWJlIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhpcyByb3V0ZSBhbmQgdGhlIG1lZGlhIGNvbnRyb2wgYWN0aW9ucyB0aGF0Ci0gICAgICAgICAqIGl0IHN1cHBvcnRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBpbnRlbnQgZmlsdGVycyB0aGF0IHNwZWNpZmllcyB0aGUgbWVkaWEgY29udHJvbCBpbnRlbnRzIHRoYXQKLSAgICAgICAgICogdGhpcyByb3V0ZSBzdXBwb3J0cy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQKLSAgICAgICAgICogQHNlZSAjc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkKLSAgICAgICAgICogQHNlZSAjc3VwcG9ydHNDb250cm9sUmVxdWVzdAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIExpc3Q8SW50ZW50RmlsdGVyPiBnZXRDb250cm9sRmlsdGVycygpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbEZpbHRlcnM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhdCBsZWFzdCBvbmUgb2YgdGhlIGNhcGFiaWxpdGllcwotICAgICAgICAgKiBkZXNjcmliZWQgYnkgYSBtZWRpYSByb3V0ZSBzZWxlY3Rvci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0aGF0IHNwZWNpZmllcyB0aGUgY2FwYWJpbGl0aWVzIHRvIGNoZWNrLgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGF0IGxlYXN0IG9uZSBvZiB0aGUgY2FwYWJpbGl0aWVzCi0gICAgICAgICAqIGRlc2NyaWJlZCBpbiB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzU2VsZWN0b3IoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yLm1hdGNoZXNDb250cm9sRmlsdGVycyhtQ29udHJvbEZpbHRlcnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGNhdGVnb3J5LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogTWVkaWEgY29udHJvbCBjYXRlZ29yaWVzIGRlc2NyaWJlIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhpcyByb3V0ZQotICAgICAgICAgKiBzdWNoIGFzIHdoZXRoZXIgaXQgc3VwcG9ydHMgbGl2ZSBhdWRpbyBzdHJlYW1pbmcgb3IgcmVtb3RlIHBsYXliYWNrLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjYXRlZ29yeSBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gY2F0ZWdvcnkKLSAgICAgICAgICogc3VjaCBhcyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfQVVESU99LAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfVklERU99LAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDS30sIG9yIGEgcHJvdmlkZXItZGVmaW5lZAotICAgICAgICAgKiBtZWRpYSBjb250cm9sIGNhdGVnb3J5LgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgaW50ZW50IGNhdGVnb3J5LgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKiBAc2VlICNnZXRDb250cm9sRmlsdGVycwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoQE5vbk51bGwgU3RyaW5nIGNhdGVnb3J5KSB7Ci0gICAgICAgICAgICBpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhdGVnb3J5IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbEZpbHRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycy5nZXQoaSkuaGFzQ2F0ZWdvcnkoY2F0ZWdvcnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSBjYXRlZ29yeSBhbmQgYWN0aW9uLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogTWVkaWEgY29udHJvbCBhY3Rpb25zIGRlc2NyaWJlIHNwZWNpZmljIHJlcXVlc3RzIHRoYXQgYW4gYXBwbGljYXRpb24KLSAgICAgICAgICogY2FuIGFzayBhIHJvdXRlIHRvIHBlcmZvcm0uCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5IEEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSBjYXRlZ29yeQotICAgICAgICAgKiBzdWNoIGFzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJT30sCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9WSURFT30sCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLfSwgb3IgYSBwcm92aWRlci1kZWZpbmVkCi0gICAgICAgICAqIG1lZGlhIGNvbnRyb2wgY2F0ZWdvcnkuCi0gICAgICAgICAqIEBwYXJhbSBhY3Rpb24gQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGFjdGlvbgotICAgICAgICAgKiBzdWNoIGFzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVl9LgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgaW50ZW50IGFjdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQKLSAgICAgICAgICogQHNlZSAjZ2V0Q29udHJvbEZpbHRlcnMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ29udHJvbEFjdGlvbihATm9uTnVsbCBTdHJpbmcgY2F0ZWdvcnksIEBOb25OdWxsIFN0cmluZyBhY3Rpb24pIHsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2F0ZWdvcnkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWN0aW9uIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbEZpbHRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG1Db250cm9sRmlsdGVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbHRlci5oYXNDYXRlZ29yeShjYXRlZ29yeSkgJiYgZmlsdGVyLmhhc0FjdGlvbihhY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSByZXF1ZXN0LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogTWVkaWEgY29udHJvbCByZXF1ZXN0cyBhcmUgdXNlZCB0byByZXF1ZXN0IHRoZSByb3V0ZSB0byBwZXJmb3JtCi0gICAgICAgICAqIGFjdGlvbnMgc3VjaCBhcyBzdGFydGluZyByZW1vdGUgcGxheWJhY2sgb2YgYSBtZWRpYSBpdGVtLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbnRlbnQgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fS4KLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSByb3V0ZSBjYW4gaGFuZGxlIHRoZSBzcGVjaWZpZWQgaW50ZW50LgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKiBAc2VlICNnZXRDb250cm9sRmlsdGVycwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb250cm9sUmVxdWVzdChATm9uTnVsbCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBpZiAoaW50ZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnRlbnQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIgPSBzR2xvYmFsLmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICAgICAgaW50IGNvdW50ID0gbUNvbnRyb2xGaWx0ZXJzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtQ29udHJvbEZpbHRlcnMuZ2V0KGkpLm1hdGNoKGNvbnRlbnRSZXNvbHZlciwgaW50ZW50LCB0cnVlLCBUQUcpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbmRzIGEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSByZXF1ZXN0IHRvIGJlIHBlcmZvcm1lZAotICAgICAgICAgKiBhc3luY2hyb25vdXNseSBieSB0aGUgcm91dGUncyBkZXN0aW5hdGlvbi4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIE1lZGlhIGNvbnRyb2wgcmVxdWVzdHMgYXJlIHVzZWQgdG8gcmVxdWVzdCB0aGUgcm91dGUgdG8gcGVyZm9ybQotICAgICAgICAgKiBhY3Rpb25zIHN1Y2ggYXMgc3RhcnRpbmcgcmVtb3RlIHBsYXliYWNrIG9mIGEgbWVkaWEgaXRlbS4KLSAgICAgICAgICogPC9wPjxwPgotICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlbGVjdGVkIHJvdXRlLiAgQ29udHJvbCByZXF1ZXN0cwotICAgICAgICAgKiBzZW50IHRvIHVuc2VsZWN0ZWQgcm91dGVzIHdpbGwgZmFpbC4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaW50ZW50IEEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0uCi0gICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIHtAbGluayBDb250cm9sUmVxdWVzdENhbGxiYWNrfSB0byBpbnZva2Ugd2l0aCB0aGUgcmVzdWx0Ci0gICAgICAgICAqIG9mIHRoZSByZXF1ZXN0LCBvciBudWxsIGlmIG5vIHJlc3VsdCBpcyByZXF1aXJlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlbmRDb250cm9sUmVxdWVzdChATm9uTnVsbCBJbnRlbnQgaW50ZW50LAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAoaW50ZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnRlbnQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgICAgIHNHbG9iYWwuc2VuZENvbnRyb2xSZXF1ZXN0KHRoaXMsIGludGVudCwgY2FsbGJhY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHR5cGUgb2YgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHR5cGUgb2YgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGU6IHtAbGluayAjUExBWUJBQ0tfVFlQRV9MT0NBTH0KLSAgICAgICAgICogb3Ige0BsaW5rICNQTEFZQkFDS19UWVBFX1JFTU9URX0uCi0gICAgICAgICAqLwotICAgICAgICBAUGxheWJhY2tUeXBlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tUeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja1R5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgYXVkaW8gc3RyZWFtIG92ZXIgd2hpY2ggdGhlIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlIGlzIHBlcmZvcm1lZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgc3RyZWFtIG92ZXIgd2hpY2ggdGhlIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlIGlzIHBlcmZvcm1lZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tTdHJlYW0oKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrU3RyZWFtOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgI0RFVklDRV9UWVBFX1RWfSBvciB7QGxpbmsgI0RFVklDRV9UWVBFX1NQRUFLRVJ9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXREZXZpY2VUeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZXZpY2VUeXBlOwotICAgICAgICB9Ci0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkgewotICAgICAgICAgICAgaWYgKGlzRGVmYXVsdCgpIHx8IG1EZXZpY2VUeXBlID09IERFVklDRV9UWVBFX0JMVUVUT09USCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHBsYXRmb3JtIHZlcnNpb24gMjMgb3IgYmVsb3cgd2hlcmUgdGhlIHN5c3RlbSByb3V0ZQotICAgICAgICAgICAgLy8gcHJvdmlkZXIgZG9lc24ndCBzcGVjaWZ5IGRldmljZSB0eXBlIGZvciBibHVldG9vdGggbWVkaWEgcm91dGVzLgotICAgICAgICAgICAgcmV0dXJuIGlzU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyKHRoaXMpCi0gICAgICAgICAgICAgICAgICAgICYmIHN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKQotICAgICAgICAgICAgICAgICAgICAmJiAhc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSByb3V0ZSBpcyBzZWxlY3RhYmxlLgotICAgICAgICAgKi8KLSAgICAgICAgYm9vbGVhbiBpc1NlbGVjdGFibGUoKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIHRlc3RzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIHN0aWxsIHZhbGlkIGFuZCBlbmFibGVkLgotICAgICAgICAgICAgLy8gVGhlIHJvdXRlIGRlc2NyaXB0b3IgZmllbGQgaXMgc2V0IHRvIG51bGwgd2hlbiB0aGUgcm91dGUgaXMgcmVtb3ZlZC4KLSAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRvciAhPSBudWxsICYmIG1FbmFibGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1N5c3RlbU1lZGlhUm91dGVQcm92aWRlcihNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHJldHVybiBUZXh0VXRpbHMuZXF1YWxzKHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKS5nZXRNZXRhZGF0YSgpLmdldFBhY2thZ2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIFNZU1RFTV9NRURJQV9ST1VURV9QUk9WSURFUl9QQUNLQUdFX05BTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgaG93IHZvbHVtZSBpcyBoYW5kbGVkIG9uIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBIb3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlOiB7QGxpbmsgI1BMQVlCQUNLX1ZPTFVNRV9GSVhFRH0KLSAgICAgICAgICogb3Ige0BsaW5rICNQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9LgotICAgICAgICAgKi8KLSAgICAgICAgQFBsYXliYWNrVm9sdW1lCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lSGFuZGxpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZvbHVtZUhhbmRsaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIGN1cnJlbnQgdm9sdW1lIGZvciB0aGlzIHJvdXRlLiBEZXBlbmRpbmcgb24gdGhlIHJvdXRlLCB0aGlzIG1heSBvbmx5Ci0gICAgICAgICAqIGJlIHZhbGlkIGlmIHRoZSByb3V0ZSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHZvbHVtZSBhdCB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRWb2x1bWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZvbHVtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIHZvbHVtZSBhdCB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBtYXhpbXVtIHZvbHVtZSBhdCB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoCi0gICAgICAgICAqIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRWb2x1bWVNYXgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZvbHVtZU1heDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHdoZXRoZXIgdGhpcyByb3V0ZSBzdXBwb3J0cyBkaXNjb25uZWN0aW5nIHdpdGhvdXQgaW50ZXJydXB0aW5nCi0gICAgICAgICAqIHBsYXliYWNrLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBjYW4gZGlzY29ubmVjdCB3aXRob3V0IHN0b3BwaW5nIHBsYXliYWNrLAotICAgICAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNhbkRpc2Nvbm5lY3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNhbkRpc2Nvbm5lY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVxdWVzdHMgYSB2b2x1bWUgY2hhbmdlIGZvciB0aGlzIHJvdXRlIGFzeW5jaHJvbm91c2x5LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhpcyBmdW5jdGlvbiBtYXkgb25seSBiZSBjYWxsZWQgb24gYSBzZWxlY3RlZCByb3V0ZS4gIEl0IHdpbGwgaGF2ZQotICAgICAgICAgKiBubyBlZmZlY3QgaWYgdGhlIHJvdXRlIGlzIGN1cnJlbnRseSB1bnNlbGVjdGVkLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2b2x1bWUgVGhlIG5ldyB2b2x1bWUgdmFsdWUgYmV0d2VlbiAwIGFuZCB7QGxpbmsgI2dldFZvbHVtZU1heH0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0U2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgc0dsb2JhbC5yZXF1ZXN0U2V0Vm9sdW1lKHRoaXMsIE1hdGgubWluKG1Wb2x1bWVNYXgsIE1hdGgubWF4KDAsIHZvbHVtZSkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXF1ZXN0cyBhbiBpbmNyZW1lbnRhbCB2b2x1bWUgdXBkYXRlIGZvciB0aGlzIHJvdXRlIGFzeW5jaHJvbm91c2x5LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhpcyBmdW5jdGlvbiBtYXkgb25seSBiZSBjYWxsZWQgb24gYSBzZWxlY3RlZCByb3V0ZS4gIEl0IHdpbGwgaGF2ZQotICAgICAgICAgKiBubyBlZmZlY3QgaWYgdGhlIHJvdXRlIGlzIGN1cnJlbnRseSB1bnNlbGVjdGVkLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkZWx0YSBUaGUgZGVsdGEgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHZvbHVtZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RVcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIGlmIChkZWx0YSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc0dsb2JhbC5yZXF1ZXN0VXBkYXRlVm9sdW1lKHRoaXMsIGRlbHRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB7QGxpbmsgRGlzcGxheX0gdGhhdCBzaG91bGQgYmUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gdG8gc2hvdwotICAgICAgICAgKiBhIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb259IG9uIGFuIGV4dGVybmFsIGRpc3BsYXkgd2hlbiB0aGlzIHJvdXRlIGlzIHNlbGVjdGVkLgotICAgICAgICAgKiBEZXBlbmRpbmcgb24gdGhlIHJvdXRlLCB0aGlzIG1heSBvbmx5IGJlIHZhbGlkIGlmIHRoZSByb3V0ZSBpcyBjdXJyZW50bHkKLSAgICAgICAgICogc2VsZWN0ZWQuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcHJlZmVycmVkIHByZXNlbnRhdGlvbiBkaXNwbGF5IG1heSBjaGFuZ2UgaW5kZXBlbmRlbnRseSBvZiB0aGUgcm91dGUKLSAgICAgICAgICogYmVpbmcgc2VsZWN0ZWQgb3IgdW5zZWxlY3RlZC4gIEZvciBleGFtcGxlLCB0aGUgcHJlc2VudGF0aW9uIGRpc3BsYXkKLSAgICAgICAgICogb2YgdGhlIGRlZmF1bHQgc3lzdGVtIHJvdXRlIG1heSBjaGFuZ2Ugd2hlbiBhbiBleHRlcm5hbCBIRE1JIGRpc3BsYXkgaXMgY29ubmVjdGVkCi0gICAgICAgICAqIG9yIGRpc2Nvbm5lY3RlZCBldmVuIHRob3VnaCB0aGUgcm91dGUgaXRzZWxmIGhhcyBub3QgY2hhbmdlZC4KLSAgICAgICAgICogPC9wPjxwPgotICAgICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gZXh0ZXJuYWwgZGlzcGxheSBhc3NvY2lhdGVkIHdpdGgKLSAgICAgICAgICogdGhlIHJvdXRlIG9yIGlmIHRoZSBkaXNwbGF5IGlzIG5vdCByZWFkeSB0byBzaG93IFVJIHlldC4KLSAgICAgICAgICogPC9wPjxwPgotICAgICAgICAgKiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGxpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGUgcHJlc2VudGF0aW9uIGRpc3BsYXkKLSAgICAgICAgICogdXNpbmcgdGhlIHtAbGluayBDYWxsYmFjayNvblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWR9IGNhbGxiYWNrIGFuZAotICAgICAgICAgKiBzaG93IG9yIGRpc21pc3MgaXRzIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb259IGFjY29yZGluZ2x5IHdoZW4gdGhlIGRpc3BsYXkKLSAgICAgICAgICogYmVjb21lcyBhdmFpbGFibGUgb3IgaXMgcmVtb3ZlZC4KLSAgICAgICAgICogPC9wPjxwPgotICAgICAgICAgKiBUaGlzIG1ldGhvZCBvbmx5IG1ha2VzIHNlbnNlIGZvcgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfVklERU8gbGl2ZSB2aWRlb30gcm91dGVzLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHByZWZlcnJlZCBwcmVzZW50YXRpb24gZGlzcGxheSB0byB1c2Ugd2hlbiB0aGlzIHJvdXRlIGlzCi0gICAgICAgICAqIHNlbGVjdGVkIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9WSURFTwotICAgICAgICAgKiBAc2VlIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbgotICAgICAgICAgKi8KLSAgICAgICAgQE51bGxhYmxlCi0gICAgICAgIHB1YmxpYyBEaXNwbGF5IGdldFByZXNlbnRhdGlvbkRpc3BsYXkoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIGlmIChtUHJlc2VudGF0aW9uRGlzcGxheUlkID49IDAgJiYgbVByZXNlbnRhdGlvbkRpc3BsYXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25EaXNwbGF5ID0gc0dsb2JhbC5nZXREaXNwbGF5KG1QcmVzZW50YXRpb25EaXNwbGF5SWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1QcmVzZW50YXRpb25EaXNwbGF5OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgaWQsIG9yIC0xIGlmIG5vbmUuCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgaW50IGdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJlc2VudGF0aW9uRGlzcGxheUlkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgYSBjb2xsZWN0aW9uIG9mIGV4dHJhIHByb3BlcnRpZXMgYWJvdXQgdGhpcyByb3V0ZSB0aGF0IHdlcmUgc3VwcGxpZWQKLSAgICAgICAgICogYnkgaXRzIG1lZGlhIHJvdXRlIHByb3ZpZGVyLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqLwotICAgICAgICBATnVsbGFibGUKLSAgICAgICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUV4dHJhczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIGFuIGludGVudCBzZW5kZXIgZm9yIGxhdW5jaGluZyBhIHNldHRpbmdzIGFjdGl2aXR5IGZvciB0aGlzCi0gICAgICAgICAqIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgQE51bGxhYmxlCi0gICAgICAgIHB1YmxpYyBJbnRlbnRTZW5kZXIgZ2V0U2V0dGluZ3NJbnRlbnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNldHRpbmdzSW50ZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbGVjdHMgdGhpcyBtZWRpYSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdCgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgc0dsb2JhbC5zZWxlY3RSb3V0ZSh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJNZWRpYVJvdXRlci5Sb3V0ZUluZm97IHVuaXF1ZUlkPSIgKyBtVW5pcXVlSWQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBuYW1lPSIgKyBtTmFtZQotICAgICAgICAgICAgICAgICAgICArICIsIGRlc2NyaXB0aW9uPSIgKyBtRGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgKyAiLCBpY29uVXJpPSIgKyBtSWNvblVyaQotICAgICAgICAgICAgICAgICAgICArICIsIGVuYWJsZWQ9IiArIG1FbmFibGVkCi0gICAgICAgICAgICAgICAgICAgICsgIiwgY29ubmVjdGluZz0iICsgbUNvbm5lY3RpbmcKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjb25uZWN0aW9uU3RhdGU9IiArIG1Db25uZWN0aW9uU3RhdGUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjYW5EaXNjb25uZWN0PSIgKyBtQ2FuRGlzY29ubmVjdAotICAgICAgICAgICAgICAgICAgICArICIsIHBsYXliYWNrVHlwZT0iICsgbVBsYXliYWNrVHlwZQotICAgICAgICAgICAgICAgICAgICArICIsIHBsYXliYWNrU3RyZWFtPSIgKyBtUGxheWJhY2tTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgKyAiLCBkZXZpY2VUeXBlPSIgKyBtRGV2aWNlVHlwZQotICAgICAgICAgICAgICAgICAgICArICIsIHZvbHVtZUhhbmRsaW5nPSIgKyBtVm9sdW1lSGFuZGxpbmcKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB2b2x1bWU9IiArIG1Wb2x1bWUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB2b2x1bWVNYXg9IiArIG1Wb2x1bWVNYXgKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBwcmVzZW50YXRpb25EaXNwbGF5SWQ9IiArIG1QcmVzZW50YXRpb25EaXNwbGF5SWQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBleHRyYXM9IiArIG1FeHRyYXMKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXR0aW5nc0ludGVudD0iICsgbVNldHRpbmdzSW50ZW50Ci0gICAgICAgICAgICAgICAgICAgICsgIiwgcHJvdmlkZXJQYWNrYWdlTmFtZT0iICsgbVByb3ZpZGVyLmdldFBhY2thZ2VOYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIH0iOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG1heWJlVXBkYXRlRGVzY3JpcHRvcihNZWRpYVJvdXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpbnQgY2hhbmdlcyA9IDA7Ci0gICAgICAgICAgICBpZiAobURlc2NyaXB0b3IgIT0gZGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIGNoYW5nZXMgPSB1cGRhdGVEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNoYW5nZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgdXBkYXRlRGVzY3JpcHRvcihNZWRpYVJvdXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpbnQgY2hhbmdlcyA9IDA7Ci0gICAgICAgICAgICBtRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtTmFtZSwgZGVzY3JpcHRvci5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1OYW1lID0gZGVzY3JpcHRvci5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghZXF1YWwobURlc2NyaXB0aW9uLCBkZXNjcmlwdG9yLmdldERlc2NyaXB0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IGRlc2NyaXB0b3IuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtSWNvblVyaSwgZGVzY3JpcHRvci5nZXRJY29uVXJpKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JY29uVXJpID0gZGVzY3JpcHRvci5nZXRJY29uVXJpKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtRW5hYmxlZCAhPSBkZXNjcmlwdG9yLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FbmFibGVkID0gZGVzY3JpcHRvci5pc0VuYWJsZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0aW5nICE9IGRlc2NyaXB0b3IuaXNDb25uZWN0aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RpbmcgPSBkZXNjcmlwdG9yLmlzQ29ubmVjdGluZygpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25TdGF0ZSAhPSBkZXNjcmlwdG9yLmdldENvbm5lY3Rpb25TdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uU3RhdGUgPSBkZXNjcmlwdG9yLmdldENvbm5lY3Rpb25TdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1Db250cm9sRmlsdGVycy5lcXVhbHMoZGVzY3JpcHRvci5nZXRDb250cm9sRmlsdGVycygpKSkgewotICAgICAgICAgICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzLmFkZEFsbChkZXNjcmlwdG9yLmdldENvbnRyb2xGaWx0ZXJzKCkpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrVHlwZSAhPSBkZXNjcmlwdG9yLmdldFBsYXliYWNrVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1R5cGUgPSBkZXNjcmlwdG9yLmdldFBsYXliYWNrVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrU3RyZWFtICE9IGRlc2NyaXB0b3IuZ2V0UGxheWJhY2tTdHJlYW0oKSkgewotICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tTdHJlYW0gPSBkZXNjcmlwdG9yLmdldFBsYXliYWNrU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtRGV2aWNlVHlwZSAhPSBkZXNjcmlwdG9yLmdldERldmljZVR5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICBtRGV2aWNlVHlwZSA9IGRlc2NyaXB0b3IuZ2V0RGV2aWNlVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVZvbHVtZUhhbmRsaW5nICE9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lSGFuZGxpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBtVm9sdW1lSGFuZGxpbmcgPSBkZXNjcmlwdG9yLmdldFZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUwgfCBDSEFOR0VfVk9MVU1FOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVZvbHVtZSAhPSBkZXNjcmlwdG9yLmdldFZvbHVtZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWUgPSBkZXNjcmlwdG9yLmdldFZvbHVtZSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1ZPTFVNRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1Wb2x1bWVNYXggIT0gZGVzY3JpcHRvci5nZXRWb2x1bWVNYXgoKSkgewotICAgICAgICAgICAgICAgICAgICBtVm9sdW1lTWF4ID0gZGVzY3JpcHRvci5nZXRWb2x1bWVNYXgoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTCB8IENIQU5HRV9WT0xVTUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUHJlc2VudGF0aW9uRGlzcGxheUlkICE9IGRlc2NyaXB0b3IuZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbkRpc3BsYXlJZCA9IGRlc2NyaXB0b3IuZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25EaXNwbGF5ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTCB8IENIQU5HRV9QUkVTRU5UQVRJT05fRElTUExBWTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtRXh0cmFzLCBkZXNjcmlwdG9yLmdldEV4dHJhcygpKSkgewotICAgICAgICAgICAgICAgICAgICBtRXh0cmFzID0gZGVzY3JpcHRvci5nZXRFeHRyYXMoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtU2V0dGluZ3NJbnRlbnQsIGRlc2NyaXB0b3IuZ2V0U2V0dGluZ3NBY3Rpdml0eSgpKSkgewotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NJbnRlbnQgPSBkZXNjcmlwdG9yLmdldFNldHRpbmdzQWN0aXZpdHkoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1DYW5EaXNjb25uZWN0ICE9IGRlc2NyaXB0b3IuY2FuRGlzY29ubmVjdEFuZEtlZXBQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNhbkRpc2Nvbm5lY3QgPSBkZXNjcmlwdG9yLmNhbkRpc2Nvbm5lY3RBbmRLZWVwUGxheWluZygpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1BSRVNFTlRBVElPTl9ESVNQTEFZOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGdldERlc2NyaXB0b3JJZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRvcklkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIEBoaWRlICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIgZ2V0UHJvdmlkZXJJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJvdmlkZXIuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5mb3JtYXRpb24gYWJvdXQgYSByb3V0ZSB0aGF0IGNvbnNpc3RzIG9mIG11bHRpcGxlIG90aGVyIHJvdXRlcyBpbiBhIGdyb3VwLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvdXRlR3JvdXAgZXh0ZW5kcyBSb3V0ZUluZm8gewotICAgICAgICBwcml2YXRlIExpc3Q8Um91dGVJbmZvPiBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICAgICAgUm91dGVHcm91cChQcm92aWRlckluZm8gcHJvdmlkZXIsIFN0cmluZyBkZXNjcmlwdG9ySWQsIFN0cmluZyB1bmlxdWVJZCkgewotICAgICAgICAgICAgc3VwZXIocHJvdmlkZXIsIGRlc2NyaXB0b3JJZCwgdW5pcXVlSWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiByb3V0ZXMgaW4gdGhpcyBncm91cAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRSb3V0ZUNvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIHJvdXRlIGluIHRoaXMgZ3JvdXAgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaW5kZXggSW5kZXggdG8gZmV0Y2gKLSAgICAgICAgICogQHJldHVybiBUaGUgcm91dGUgYXQgaW5kZXgKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBSb3V0ZUluZm8gZ2V0Um91dGVBdChpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUm91dGVzLmdldChpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgcm91dGVzIGluIHRoaXMgZ3JvdXAKLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgbGlzdCBvZiB0aGUgcm91dGVzIGluIHRoaXMgZ3JvdXAKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBMaXN0PFJvdXRlSW5mbz4gZ2V0Um91dGVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihzdXBlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnWycpOwotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQobVJvdXRlcy5nZXQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2IuYXBwZW5kKCddJyk7Ci0gICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBpbnQgbWF5YmVVcGRhdGVEZXNjcmlwdG9yKE1lZGlhUm91dGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKG1EZXNjcmlwdG9yICE9IGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICBtRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gZ3JvdXBNZW1iZXJJZHMgPSBkZXNjcmlwdG9yLmdldEdyb3VwTWVtYmVySWRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8Um91dGVJbmZvPiByb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IGdyb3VwTWVtYmVySWRzLnNpemUoKSAhPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZ3JvdXBNZW1iZXJJZCA6IGdyb3VwTWVtYmVySWRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdW5pcXVlSWQgPSBzR2xvYmFsLmdldFVuaXF1ZUlkKGdldFByb3ZpZGVyKCksIGdyb3VwTWVtYmVySWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIGdyb3VwTWVtYmVyID0gc0dsb2JhbC5nZXRSb3V0ZSh1bmlxdWVJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBNZW1iZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlcy5hZGQoZ3JvdXBNZW1iZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hhbmdlZCAmJiAhbVJvdXRlcy5jb250YWlucyhncm91cE1lbWJlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVzID0gcm91dGVzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIChjaGFuZ2VkID8gQ0hBTkdFX0dFTkVSQUwgOiAwKSB8IHN1cGVyLnVwZGF0ZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgb2JqZWN0IG1heSBiZSB1c2VkIHRvIGRldGVybWluZSB3aGljaCBtZWRpYSByb3V0ZSBwcm92aWRlciBoYXMKLSAgICAgKiBwdWJsaXNoZWQgYSBwYXJ0aWN1bGFyIHJvdXRlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb3ZpZGVySW5mbyB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZVByb3ZpZGVyIG1Qcm92aWRlckluc3RhbmNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8Um91dGVJbmZvPiBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlck1ldGFkYXRhIG1NZXRhZGF0YTsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1EZXNjcmlwdG9yOwotICAgICAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzb3VyY2VzOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJlc291cmNlc05vdEF2YWlsYWJsZTsKLQotICAgICAgICBQcm92aWRlckluZm8oTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICBtUHJvdmlkZXJJbnN0YW5jZSA9IHByb3ZpZGVyOwotICAgICAgICAgICAgbU1ldGFkYXRhID0gcHJvdmlkZXIuZ2V0TWV0YWRhdGEoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIHVuZGVybHlpbmcge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlcn0gaW5zdGFuY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyIGdldFByb3ZpZGVySW5zdGFuY2UoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIHJldHVybiBtUHJvdmlkZXJJbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWV0YWRhdGEuZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBjb21wb25lbnQgbmFtZSBvZiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQ29tcG9uZW50TmFtZSBnZXRDb21wb25lbnROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1NZXRhZGF0YS5nZXRDb21wb25lbnROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZXN9IHB1Ymxpc2hlZCBieSB0aGlzIHJvdXRlIHByb3ZpZGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIExpc3Q8Um91dGVJbmZvPiBnZXRSb3V0ZXMoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIHJldHVybiBtUm91dGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVzb3VyY2VzIGdldFJlc291cmNlcygpIHsKLSAgICAgICAgICAgIGlmIChtUmVzb3VyY2VzID09IG51bGwgJiYgIW1SZXNvdXJjZXNOb3RBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IHNHbG9iYWwuZ2V0UHJvdmlkZXJDb250ZXh0KHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBvYnRhaW4gcmVzb3VyY2VzIGZvciByb3V0ZSBwcm92aWRlciBwYWNrYWdlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXNOb3RBdmFpbGFibGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtUmVzb3VyY2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiB1cGRhdGVEZXNjcmlwdG9yKE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgaWYgKG1EZXNjcmlwdG9yICE9IGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICBtRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmluZFJvdXRlQnlEZXNjcmlwdG9ySWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtUm91dGVzLmdldChpKS5tRGVzY3JpcHRvcklkLmVxdWFscyhpZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIk1lZGlhUm91dGVyLlJvdXRlUHJvdmlkZXJJbmZveyBwYWNrYWdlTmFtZT0iICsgZ2V0UGFja2FnZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICArICIgfSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgZm9yIHJlY2VpdmluZyBldmVudHMgYWJvdXQgbWVkaWEgcm91dGluZyBjaGFuZ2VzLgotICAgICAqIEFsbCBtZXRob2RzIG9mIHRoaXMgaW50ZXJmYWNlIHdpbGwgYmUgY2FsbGVkIGZyb20gdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbiB0aHJlYWQuCi0gICAgICogPHA+Ci0gICAgICogQSBDYWxsYmFjayB3aWxsIG9ubHkgcmVjZWl2ZSBldmVudHMgcmVsZXZhbnQgdG8gcm91dGVzIHRoYXQgdGhlIGNhbGxiYWNrCi0gICAgICogd2FzIHJlZ2lzdGVyZWQgZm9yIHVubGVzcyB0aGUge0BsaW5rIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFN9Ci0gICAgICogZmxhZyB3YXMgc3BlY2lmaWVkIGluIHtAbGluayBNZWRpYVJvdXRlciNhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IsIENhbGxiYWNrLCBpbnQpfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCkKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyI3JlbW92ZUNhbGxiYWNrKENhbGxiYWNrKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN1cHBsaWVkIG1lZGlhIHJvdXRlIGJlY29tZXMgc2VsZWN0ZWQgYXMgdGhlIGFjdGl2ZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCBoYXMgYmVlbiBzZWxlY3RlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdXBwbGllZCBtZWRpYSByb3V0ZSBiZWNvbWVzIHVuc2VsZWN0ZWQgYXMgdGhlIGFjdGl2ZSByb3V0ZS4KLSAgICAgICAgICogRm9yIGRldGFpbGVkIHJlYXNvbiwgb3ZlcnJpZGUge0BsaW5rICNvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciwgUm91dGVJbmZvLCBpbnQpfQotICAgICAgICAgKiBpbnN0ZWFkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWVuIHVuc2VsZWN0ZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdXBwbGllZCBtZWRpYSByb3V0ZSBiZWNvbWVzIHVuc2VsZWN0ZWQgYXMgdGhlIGFjdGl2ZSByb3V0ZS4KLSAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FsbHMge0BsaW5rICNvblJvdXRlVW5zZWxlY3RlZH0uCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcmVhc29uIHByb3ZpZGVkIHdpbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgICAqIDx1bD4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fVU5LTk9XTn08L2xpPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ESVNDT05ORUNURUR9PC9saT4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fU1RPUFBFRH08L2xpPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEfTwvbGk+Ci0gICAgICAgICAqIDwvdWw+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRoYXQgaGFzIGJlZW4gdW5zZWxlY3RlZC4KLSAgICAgICAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIGZvciB1bnNlbGVjdGluZyB0aGUgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSwgaW50IHJlYXNvbikgewotICAgICAgICAgICAgb25Sb3V0ZVVuc2VsZWN0ZWQocm91dGVyLCByb3V0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSBoYXMgYmVlbiBhZGRlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCBoYXMgYmVjb21lIGF2YWlsYWJsZSBmb3IgdXNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSBoYXMgYmVlbiByZW1vdmVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBhdmFpbGFiaWxpdHkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgcHJvcGVydHkgb2YgdGhlIGluZGljYXRlZCBtZWRpYSByb3V0ZSBoYXMgY2hhbmdlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCB3YXMgY2hhbmdlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSdzIHZvbHVtZSBjaGFuZ2VzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB3aG9zZSB2b2x1bWUgY2hhbmdlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSdzIHByZXNlbnRhdGlvbiBkaXNwbGF5IGNoYW5nZXMuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgYmVjb21lcwotICAgICAgICAgKiBhdmFpbGFibGUsIGlzIHJlbW92ZWQgb3IgaGFzIGNoYW5nZXMgdG8gc29tZSBvZiBpdHMgcHJvcGVydGllcyAoc3VjaCBhcyBpdHMgc2l6ZSkuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgd2hvc2UgcHJlc2VudGF0aW9uIGRpc3BsYXkgY2hhbmdlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBSb3V0ZUluZm8jZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGhhcyBiZWVuIGFkZGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSBwcm92aWRlciB0aGF0IGhhcyBiZWNvbWUgYXZhaWxhYmxlIGZvciB1c2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBQcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGhhcyBiZWVuIHJlbW92ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGF2YWlsYWJpbGl0eS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBvZiB0aGUgaW5kaWNhdGVkIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGhhcyBjaGFuZ2VkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSBwcm92aWRlciB0aGF0IHdhcyBjaGFuZ2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBQcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIHdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgcmVzdWx0IG9mIGEgbWVkaWEgY29udHJvbCByZXF1ZXN0LgotICAgICAqCi0gICAgICogQHNlZSBSb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDb250cm9sUmVxdWVzdENhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgY29udHJvbCByZXF1ZXN0IHN1Y2NlZWRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBSZXN1bHQgZGF0YSwgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKiBDb250ZW50cyBkZXBlbmQgb24gdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBhY3Rpb259LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIGNvbnRyb2wgcmVxdWVzdCBmYWlscy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGVycm9yIEEgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2Ugd2hpY2ggbWF5IGJlIHNob3duIHRvIHRoZSB1c2VyLCBvciBudWxsCi0gICAgICAgICAqIGlmIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgaXMgdW5jbGVhci4KLSAgICAgICAgICogQHBhcmFtIGRhdGEgRXJyb3IgZGF0YSwgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKiBDb250ZW50cyBkZXBlbmQgb24gdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBhY3Rpb259LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBDYWxsYmFja1JlY29yZCB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgICAgICBwdWJsaWMgZmluYWwgQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLSAgICAgICAgcHVibGljIGludCBtRmxhZ3M7Ci0KLSAgICAgICAgcHVibGljIENhbGxiYWNrUmVjb3JkKE1lZGlhUm91dGVyIHJvdXRlciwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIgPSByb3V0ZXI7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGZpbHRlclJvdXRlRXZlbnQoUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1GbGFncyAmIENBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMpICE9IDAKLSAgICAgICAgICAgICAgICAgICAgfHwgcm91dGUubWF0Y2hlc1NlbGVjdG9yKG1TZWxlY3Rvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHbG9iYWwgc3RhdGUgZm9yIHRoZSBtZWRpYSByb3V0ZXIuCi0gICAgICogPHA+Ci0gICAgICogTWVkaWEgcm91dGVzIGFuZCBtZWRpYSByb3V0ZSBwcm92aWRlcnMgYXJlIGdsb2JhbCB0byB0aGUgcHJvY2VzczsgdGhlaXIKLSAgICAgKiBzdGF0ZSBhbmQgdGhlIGJ1bGsgb2YgdGhlIG1lZGlhIHJvdXRlciBpbXBsZW1lbnRhdGlvbiBsaXZlcyBoZXJlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBHbG9iYWxNZWRpYVJvdXRlcgotICAgICAgICAgICAgaW1wbGVtZW50cyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuU3luY0NhbGxiYWNrLAotICAgICAgICAgICAgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIuQ2FsbGJhY2sgewotICAgICAgICBmaW5hbCBDb250ZXh0IG1BcHBsaWNhdGlvbkNvbnRleHQ7Ci0gICAgICAgIGZpbmFsIEFycmF5TGlzdDxXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVyPj4gbVJvdXRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Um91dGVJbmZvPiBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFBhaXI8U3RyaW5nLCBTdHJpbmc+LCBTdHJpbmc+IG1VbmlxdWVJZE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UHJvdmlkZXJJbmZvPiBtUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQ+IG1SZW1vdGVDb250cm9sQ2xpZW50cyA9Ci0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGZpbmFsIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuUGxheWJhY2tJbmZvIG1QbGF5YmFja0luZm8gPQotICAgICAgICAgICAgICAgIG5ldyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LlBsYXliYWNrSW5mbygpOwotICAgICAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyQ2FsbGJhY2sgbVByb3ZpZGVyQ2FsbGJhY2sgPSBuZXcgUHJvdmlkZXJDYWxsYmFjaygpOwotICAgICAgICBmaW5hbCBDYWxsYmFja0hhbmRsZXIgbUNhbGxiYWNrSGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXIoKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEaXNwbGF5TWFuYWdlckNvbXBhdCBtRGlzcGxheU1hbmFnZXI7Ci0gICAgICAgIGZpbmFsIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlciBtU3lzdGVtUHJvdmlkZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtTG93UmFtOwotCi0gICAgICAgIHByaXZhdGUgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIgbVJlZ2lzdGVyZWRQcm92aWRlcldhdGNoZXI7Ci0gICAgICAgIHByaXZhdGUgUm91dGVJbmZvIG1EZWZhdWx0Um91dGU7Ci0gICAgICAgIHByaXZhdGUgUm91dGVJbmZvIG1CbHVldG9vdGhSb3V0ZTsKLSAgICAgICAgUm91dGVJbmZvIG1TZWxlY3RlZFJvdXRlOwotICAgICAgICBwcml2YXRlIFJvdXRlQ29udHJvbGxlciBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXI7Ci0gICAgICAgIC8vIEEgbWFwIGZyb20gcm91dGUgZGVzY3JpcHRvciBJRCB0byBSb3V0ZUNvbnRyb2xsZXIgZm9yIHRoZSBtZW1iZXIgcm91dGVzIGluIHRoZSBjdXJyZW50bHkKLSAgICAgICAgLy8gc2VsZWN0ZWQgcm91dGUgZ3JvdXAuCi0gICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgUm91dGVDb250cm9sbGVyPiBtUm91dGVDb250cm9sbGVyTWFwID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1EaXNjb3ZlcnlSZXF1ZXN0OwotICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvblJlY29yZCBtTWVkaWFTZXNzaW9uOwotICAgICAgICBNZWRpYVNlc3Npb25Db21wYXQgbVJjY01lZGlhU2Vzc2lvbjsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVNlc3Npb25Db21wYXQgbUNvbXBhdFNlc3Npb247Ci0gICAgICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uQ29tcGF0Lk9uQWN0aXZlQ2hhbmdlTGlzdGVuZXIgbVNlc3Npb25BY3RpdmVMaXN0ZW5lciA9Ci0gICAgICAgICAgICAgICAgbmV3IE1lZGlhU2Vzc2lvbkNvbXBhdC5PbkFjdGl2ZUNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFjdGl2ZUNoYW5nZWQoKSB7Ci0gICAgICAgICAgICAgICAgaWYobVJjY01lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUmNjTWVkaWFTZXNzaW9uLmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlbW90ZUNvbnRyb2xDbGllbnQobVJjY01lZGlhU2Vzc2lvbi5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUmVtb3RlQ29udHJvbENsaWVudChtUmNjTWVkaWFTZXNzaW9uLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgR2xvYmFsTWVkaWFSb3V0ZXIoQ29udGV4dCBhcHBsaWNhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgICAgIG1BcHBsaWNhdGlvbkNvbnRleHQgPSBhcHBsaWNhdGlvbkNvbnRleHQ7Ci0gICAgICAgICAgICBtRGlzcGxheU1hbmFnZXIgPSBEaXNwbGF5TWFuYWdlckNvbXBhdC5nZXRJbnN0YW5jZShhcHBsaWNhdGlvbkNvbnRleHQpOwotICAgICAgICAgICAgbUxvd1JhbSA9IEFjdGl2aXR5TWFuYWdlckNvbXBhdC5pc0xvd1JhbURldmljZSgKLSAgICAgICAgICAgICAgICAgICAgKEFjdGl2aXR5TWFuYWdlcilhcHBsaWNhdGlvbkNvbnRleHQuZ2V0U3lzdGVtU2VydmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkFDVElWSVRZX1NFUlZJQ0UpKTsKLQotICAgICAgICAgICAgLy8gQWRkIHRoZSBzeXN0ZW0gbWVkaWEgcm91dGUgcHJvdmlkZXIgZm9yIGludGVyb3BlcmF0aW5nIHdpdGgKLSAgICAgICAgICAgIC8vIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLiAgVGhpcyBvbmUgaXMgc3BlY2lhbCBhbmQgcmVjZWl2ZXMKLSAgICAgICAgICAgIC8vIHN5bmNocm9uaXphdGlvbiBtZXNzYWdlcyBmcm9tIHRoZSBtZWRpYSByb3V0ZXIuCi0gICAgICAgICAgICBtU3lzdGVtUHJvdmlkZXIgPSBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIub2J0YWluKGFwcGxpY2F0aW9uQ29udGV4dCwgdGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgICAgIGFkZFByb3ZpZGVyKG1TeXN0ZW1Qcm92aWRlcik7Ci0KLSAgICAgICAgICAgIC8vIFN0YXJ0IHdhdGNoaW5nIGZvciByb3V0ZXMgcHVibGlzaGVkIGJ5IHJlZ2lzdGVyZWQgbWVkaWEgcm91dGUKLSAgICAgICAgICAgIC8vIHByb3ZpZGVyIHNlcnZpY2VzLgotICAgICAgICAgICAgbVJlZ2lzdGVyZWRQcm92aWRlcldhdGNoZXIgPSBuZXcgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIoCi0gICAgICAgICAgICAgICAgICAgIG1BcHBsaWNhdGlvbkNvbnRleHQsIHRoaXMpOwotICAgICAgICAgICAgbVJlZ2lzdGVyZWRQcm92aWRlcldhdGNoZXIuc3RhcnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlciBnZXRSb3V0ZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlciByb3V0ZXI7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJvdXRlcnMuc2l6ZSgpOyAtLWkgPj0gMDsgKSB7Ci0gICAgICAgICAgICAgICAgcm91dGVyID0gbVJvdXRlcnMuZ2V0KGkpLmdldCgpOwotICAgICAgICAgICAgICAgIGlmIChyb3V0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVycy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3V0ZXIubUNvbnRleHQgPT0gY29udGV4dCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm91dGVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJvdXRlciA9IG5ldyBNZWRpYVJvdXRlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1Sb3V0ZXJzLmFkZChuZXcgV2Vha1JlZmVyZW5jZTxNZWRpYVJvdXRlcj4ocm91dGVyKSk7Ci0gICAgICAgICAgICByZXR1cm4gcm91dGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbnRlbnRSZXNvbHZlciBnZXRDb250ZW50UmVzb2x2ZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFwcGxpY2F0aW9uQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb250ZXh0IGdldFByb3ZpZGVyQ29udGV4dChTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS5lcXVhbHMoU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLlBBQ0tBR0VfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUFwcGxpY2F0aW9uQ29udGV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1BcHBsaWNhdGlvbkNvbnRleHQuY3JlYXRlUGFja2FnZUNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgQ29udGV4dC5DT05URVhUX1JFU1RSSUNURUQpOwotICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRGlzcGxheSBnZXREaXNwbGF5KGludCBkaXNwbGF5SWQpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGlzcGxheU1hbmFnZXIuZ2V0RGlzcGxheShkaXNwbGF5SWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VuZENvbnRyb2xSZXF1ZXN0KFJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50LCBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUgJiYgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGVDb250cm9sbGVyLm9uQ29udHJvbFJlcXVlc3QoaW50ZW50LCBjYWxsYmFjaykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2sub25FcnJvcihudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RTZXRWb2x1bWUoUm91dGVJbmZvIHJvdXRlLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUgJiYgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25TZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1Sb3V0ZUNvbnRyb2xsZXJNYXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBtUm91dGVDb250cm9sbGVyTWFwLmdldChyb3V0ZS5tRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25TZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0VXBkYXRlVm9sdW1lKFJvdXRlSW5mbyByb3V0ZSwgaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUgJiYgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25VcGRhdGVWb2x1bWUoZGVsdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFJvdXRlSW5mbyBnZXRSb3V0ZShTdHJpbmcgdW5pcXVlSWQpIHsKLSAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIGluZm8gOiBtUm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZm8ubVVuaXF1ZUlkLmVxdWFscyh1bmlxdWVJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZm87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdDxSb3V0ZUluZm8+IGdldFJvdXRlcygpIHsKLSAgICAgICAgICAgIHJldHVybiBtUm91dGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxQcm92aWRlckluZm8+IGdldFByb3ZpZGVycygpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJvdmlkZXJzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE5vbk51bGwgUm91dGVJbmZvIGdldERlZmF1bHRSb3V0ZSgpIHsKLSAgICAgICAgICAgIGlmIChtRGVmYXVsdFJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gb25jZSB0aGUgbWVkaWEgcm91dGVyIGhhcyBiZWVuIGZ1bGx5Ci0gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgYnV0IGl0IGlzIGdvb2QgdG8gY2hlY2sgZm9yIHRoZSBlcnJvciBpbiBjYXNlIHRoZXJlCi0gICAgICAgICAgICAgICAgLy8gaXMgYSBidWcgaW4gcHJvdmlkZXIgaW5pdGlhbGl6YXRpb24uCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gZGVmYXVsdCByb3V0ZS4gICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlRoZSBtZWRpYSByb3V0ZXIgaGFzIG5vdCB5ZXQgYmVlbiBmdWxseSBpbml0aWFsaXplZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtRGVmYXVsdFJvdXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgUm91dGVJbmZvIGdldEJsdWV0b290aFJvdXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1CbHVldG9vdGhSb3V0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBOb25OdWxsIFJvdXRlSW5mbyBnZXRTZWxlY3RlZFJvdXRlKCkgewotICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gb25jZSB0aGUgbWVkaWEgcm91dGVyIGhhcyBiZWVuIGZ1bGx5Ci0gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgYnV0IGl0IGlzIGdvb2QgdG8gY2hlY2sgZm9yIHRoZSBlcnJvciBpbiBjYXNlIHRoZXJlCi0gICAgICAgICAgICAgICAgLy8gaXMgYSBidWcgaW4gcHJvdmlkZXIgaW5pdGlhbGl6YXRpb24uCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlLiAgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGhlIG1lZGlhIHJvdXRlciBoYXMgbm90IHlldCBiZWVuIGZ1bGx5IGluaXRpYWxpemVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1TZWxlY3RlZFJvdXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZWxlY3RSb3V0ZShATm9uTnVsbCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHNlbGVjdFJvdXRlKHJvdXRlLCBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNlbGVjdFJvdXRlKEBOb25OdWxsIFJvdXRlSW5mbyByb3V0ZSwgaW50IHVuc2VsZWN0UmVhc29uKSB7Ci0gICAgICAgICAgICBpZiAoIW1Sb3V0ZXMuY29udGFpbnMocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JpbmcgYXR0ZW1wdCB0byBzZWxlY3QgcmVtb3ZlZCByb3V0ZTogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXJvdXRlLm1FbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JpbmcgYXR0ZW1wdCB0byBzZWxlY3QgZGlzYWJsZWQgcm91dGU6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3V0ZUludGVybmFsKHJvdXRlLCB1bnNlbGVjdFJlYXNvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JvdXRlQXZhaWxhYmxlKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciwgaW50IGZsYWdzKSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBPbiBsb3ctUkFNIGRldmljZXMsIGRvIG5vdCByZWx5IG9uIGFjdHVhbCBkaXNjb3ZlcnkgcmVzdWx0cyB1bmxlc3MgYXNrZWQgdG8uCi0gICAgICAgICAgICBpZiAoKGZsYWdzICYgQVZBSUxBQklMSVRZX0ZMQUdfUkVRVUlSRV9NQVRDSCkgPT0gMCAmJiBtTG93UmFtKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgYW55IGV4aXN0aW5nIHJvdXRlcyBtYXRjaCB0aGUgc2VsZWN0b3IuCi0gICAgICAgICAgICBmaW5hbCBpbnQgcm91dGVDb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3V0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBtUm91dGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEUpICE9IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyb3V0ZS5tYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSXQgZG9lc24ndCBsb29rIGxpa2Ugd2UgY2FuIGZpbmQgYSBtYXRjaGluZyByb3V0ZSByaWdodCBub3cuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVEaXNjb3ZlcnlSZXF1ZXN0KCkgewotICAgICAgICAgICAgLy8gQ29tYmluZSBhbGwgb2YgdGhlIGNhbGxiYWNrIHNlbGVjdG9ycyBhbmQgYWN0aXZlIHNjYW4gZmxhZ3MuCi0gICAgICAgICAgICBib29sZWFuIGRpc2NvdmVyID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIGFjdGl2ZVNjYW4gPSBmYWxzZTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUm91dGVycy5zaXplKCk7IC0taSA+PSAwOyApIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlciByb3V0ZXIgPSBtUm91dGVycy5nZXQoaSkuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvdXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXIubUNhbGxiYWNrUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2tSZWNvcmQgY2FsbGJhY2sgPSByb3V0ZXIubUNhbGxiYWNrUmVjb3Jkcy5nZXQoaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFNlbGVjdG9yKGNhbGxiYWNrLm1TZWxlY3Rvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNhbGxiYWNrLm1GbGFncyAmIENBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTikgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNjYW4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyID0gdHJ1ZTsgLy8gcGVyZm9ybSBhY3RpdmUgc2NhbiBpbXBsaWVzIHJlcXVlc3QgZGlzY292ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNhbGxiYWNrLm1GbGFncyAmIENBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1Mb3dSYW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY292ZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY2FsbGJhY2subUZsYWdzICYgQ0FMTEJBQ0tfRkxBR19GT1JDRV9ESVNDT1ZFUlkpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3ZlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IgPSBkaXNjb3ZlciA/IGJ1aWxkZXIuYnVpbGQoKSA6IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAgICAgICAgaWYgKG1EaXNjb3ZlcnlSZXF1ZXN0ICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgbURpc2NvdmVyeVJlcXVlc3QuZ2V0U2VsZWN0b3IoKS5lcXVhbHMoc2VsZWN0b3IpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EaXNjb3ZlcnlSZXF1ZXN0LmlzQWN0aXZlU2NhbigpID09IGFjdGl2ZVNjYW4pIHsKLSAgICAgICAgICAgICAgICByZXR1cm47IC8vIG5vIGNoYW5nZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmlzRW1wdHkoKSAmJiAhYWN0aXZlU2NhbikgewotICAgICAgICAgICAgICAgIC8vIERpc2NvdmVyeSBpcyBub3QgbmVlZGVkLgotICAgICAgICAgICAgICAgIGlmIChtRGlzY292ZXJ5UmVxdWVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbm8gY2hhbmdlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1EaXNjb3ZlcnlSZXF1ZXN0ID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gRGlzY292ZXJ5IGlzIG5lZWRlZC4KLSAgICAgICAgICAgICAgICBtRGlzY292ZXJ5UmVxdWVzdCA9IG5ldyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChzZWxlY3RvciwgYWN0aXZlU2Nhbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJVcGRhdGVkIGRpc2NvdmVyeSByZXF1ZXN0OiAiICsgbURpc2NvdmVyeVJlcXVlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRpc2NvdmVyICYmICFhY3RpdmVTY2FuICYmIG1Mb3dSYW0pIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJGb3JjaW5nIHBhc3NpdmUgcm91dGUgZGlzY292ZXJ5IG9uIGEgbG93LVJBTSBkZXZpY2UsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgInN5c3RlbSBwZXJmb3JtYW5jZSBtYXkgYmUgYWZmZWN0ZWQuICBQbGVhc2UgY29uc2lkZXIgdXNpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSBpbnN0ZWFkIG9mICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkNBTExCQUNLX0ZMQUdfRk9SQ0VfRElTQ09WRVJZLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBOb3RpZnkgcHJvdmlkZXJzLgotICAgICAgICAgICAgZmluYWwgaW50IHByb3ZpZGVyQ291bnQgPSBtUHJvdmlkZXJzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdmlkZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbVByb3ZpZGVycy5nZXQoaSkubVByb3ZpZGVySW5zdGFuY2Uuc2V0RGlzY292ZXJ5UmVxdWVzdChtRGlzY292ZXJ5UmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYWRkUHJvdmlkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRQcm92aWRlckluZm8ocHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gMS4gQWRkIHRoZSBwcm92aWRlciB0byB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgICBQcm92aWRlckluZm8gcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXJJbmZvKHByb3ZpZGVySW5zdGFuY2UpOwotICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMuYWRkKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUHJvdmlkZXIgYWRkZWQ6ICIgKyBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1BST1ZJREVSX0FEREVELCBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgLy8gMi4gQ3JlYXRlIHRoZSBwcm92aWRlcidzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgIHVwZGF0ZVByb3ZpZGVyQ29udGVudHMocHJvdmlkZXIsIHByb3ZpZGVySW5zdGFuY2UuZ2V0RGVzY3JpcHRvcigpKTsKLSAgICAgICAgICAgICAgICAvLyAzLiBSZWdpc3RlciB0aGUgcHJvdmlkZXIgY2FsbGJhY2suCi0gICAgICAgICAgICAgICAgcHJvdmlkZXJJbnN0YW5jZS5zZXRDYWxsYmFjayhtUHJvdmlkZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgLy8gNC4gU2V0IHRoZSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgICAgICAgICAgICBwcm92aWRlckluc3RhbmNlLnNldERpc2NvdmVyeVJlcXVlc3QobURpc2NvdmVyeVJlcXVlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3ZpZGVyKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kUHJvdmlkZXJJbmZvKHByb3ZpZGVySW5zdGFuY2UpOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAvLyAxLiBVbnJlZ2lzdGVyIHRoZSBwcm92aWRlciBjYWxsYmFjay4KLSAgICAgICAgICAgICAgICBwcm92aWRlckluc3RhbmNlLnNldENhbGxiYWNrKG51bGwpOwotICAgICAgICAgICAgICAgIC8vIDIuIENsZWFyIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgICAgICAgICAgICBwcm92aWRlckluc3RhbmNlLnNldERpc2NvdmVyeVJlcXVlc3QobnVsbCk7Ci0gICAgICAgICAgICAgICAgLy8gMy4gRGVsZXRlIHRoZSBwcm92aWRlcidzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB1cGRhdGVQcm92aWRlckNvbnRlbnRzKHByb3ZpZGVyLCBudWxsKTsKLSAgICAgICAgICAgICAgICAvLyA0LiBSZW1vdmUgdGhlIHByb3ZpZGVyIGZyb20gdGhlIGxpc3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlByb3ZpZGVyIHJlbW92ZWQ6ICIgKyBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1BST1ZJREVSX1JFTU9WRUQsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHVwZGF0ZVByb3ZpZGVyRGVzY3JpcHRvcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRQcm92aWRlckluZm8ocHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcHJvdmlkZXIncyBjb250ZW50cy4KLSAgICAgICAgICAgICAgICBQcm92aWRlckluZm8gcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUHJvdmlkZXJDb250ZW50cyhwcm92aWRlciwgZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBmaW5kUHJvdmlkZXJJbmZvKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUHJvdmlkZXJzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtUHJvdmlkZXJzLmdldChpKS5tUHJvdmlkZXJJbnN0YW5jZSA9PSBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQcm92aWRlckNvbnRlbnRzKFByb3ZpZGVySW5mbyBwcm92aWRlciwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIHByb3ZpZGVyRGVzY3JpcHRvcikgewotICAgICAgICAgICAgaWYgKHByb3ZpZGVyLnVwZGF0ZURlc2NyaXB0b3IocHJvdmlkZXJEZXNjcmlwdG9yKSkgewotICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBhbGwgZXhpc3Rpbmcgcm91dGVzIGFuZCByZW9yZGVyIHRoZW0gdG8gbWF0Y2gKLSAgICAgICAgICAgICAgICAvLyB0aGUgb3JkZXIgb2YgdGhlaXIgZGVzY3JpcHRvcnMuCi0gICAgICAgICAgICAgICAgaW50IHRhcmdldEluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkUm91dGVEZXNjcmlwdG9yQ2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChwcm92aWRlckRlc2NyaXB0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXJEZXNjcmlwdG9yLmlzVmFsaWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcm91dGVEZXNjcmlwdG9ycyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyRGVzY3JpcHRvci5nZXRSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCByb3V0ZUNvdW50ID0gcm91dGVEZXNjcmlwdG9ycy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGluZyByb3V0ZSBncm91cCdzIGNvbnRlbnRzIHJlcXVpcmVzIGFsbCBtZW1iZXIgcm91dGVzJyBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgZ3JvdXBzIHRvIHRoZSBsaXN0cyBhbmQgdXBkYXRlIHRoZW0gbGF0ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFBhaXI8Um91dGVJbmZvLCBNZWRpYVJvdXRlRGVzY3JpcHRvcj4+IGFkZGVkR3JvdXBzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFBhaXI8Um91dGVJbmZvLCBNZWRpYVJvdXRlRGVzY3JpcHRvcj4+IHVwZGF0ZWRHcm91cHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm91dGVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGVEZXNjcmlwdG9yID0gcm91dGVEZXNjcmlwdG9ycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gcm91dGVEZXNjcmlwdG9yLmdldElkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNvdXJjZUluZGV4ID0gcHJvdmlkZXIuZmluZFJvdXRlQnlEZXNjcmlwdG9ySWQoaWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMS4gQWRkIHRoZSByb3V0ZSB0byB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVuaXF1ZUlkID0gYXNzaWduUm91dGVVbmlxdWVJZChwcm92aWRlciwgaWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzR3JvdXAgPSByb3V0ZURlc2NyaXB0b3IuZ2V0R3JvdXBNZW1iZXJJZHMoKSAhPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBpc0dyb3VwID8gbmV3IFJvdXRlR3JvdXAocHJvdmlkZXIsIGlkLCB1bmlxdWVJZCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSb3V0ZUluZm8ocHJvdmlkZXIsIGlkLCB1bmlxdWVJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLm1Sb3V0ZXMuYWRkKHRhcmdldEluZGV4KyssIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlcy5hZGQocm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLiBDcmVhdGUgdGhlIHJvdXRlJ3MgY29udGVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dyb3VwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZEdyb3Vwcy5hZGQobmV3IFBhaXI8Pihyb3V0ZSwgcm91dGVEZXNjcmlwdG9yKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tYXliZVVwZGF0ZURlc2NyaXB0b3Iocm91dGVEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMuIE5vdGlmeSBjbGllbnRzIGFib3V0IGFkZGl0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgYWRkZWQ6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9BRERFRCwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZUluZGV4IDwgdGFyZ2V0SW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3Jpbmcgcm91dGUgZGVzY3JpcHRvciB3aXRoIGR1cGxpY2F0ZSBpZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcm91dGVEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxLiBSZW9yZGVyIHRoZSByb3V0ZSB3aXRoaW4gdGhlIGxpc3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHByb3ZpZGVyLm1Sb3V0ZXMuZ2V0KHNvdXJjZUluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc3dhcChwcm92aWRlci5tUm91dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCsrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gVXBkYXRlIHRoZSByb3V0ZSdzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGUgaW5zdGFuY2VvZiBSb3V0ZUdyb3VwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkR3JvdXBzLmFkZChuZXcgUGFpcjw+KHJvdXRlLCByb3V0ZURlc2NyaXB0b3IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMuIE5vdGlmeSBjbGllbnRzIGFib3V0IGNoYW5nZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlUm91dGVEZXNjcmlwdG9yQW5kTm90aWZ5KHJvdXRlLCByb3V0ZURlc2NyaXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIG5ldyBhbmQvb3IgZXhpc3RpbmcgZ3JvdXBzLgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChQYWlyPFJvdXRlSW5mbywgTWVkaWFSb3V0ZURlc2NyaXB0b3I+IHBhaXIgOiBhZGRlZEdyb3VwcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHBhaXIuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUubWF5YmVVcGRhdGVEZXNjcmlwdG9yKHBhaXIuc2Vjb25kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgYWRkZWQ6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX0FEREVELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFBhaXI8Um91dGVJbmZvLCBNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcGFpciA6IHVwZGF0ZWRHcm91cHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBwYWlyLmZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVSb3V0ZURlc2NyaXB0b3JBbmROb3RpZnkocm91dGUsIHBhaXIuc2Vjb25kKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIklnbm9yaW5nIGludmFsaWQgcHJvdmlkZXIgZGVzY3JpcHRvcjogIiArIHByb3ZpZGVyRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBEaXNwb3NlIGFsbCByZW1haW5pbmcgcm91dGVzIHRoYXQgZG8gbm90IGhhdmUgbWF0Y2hpbmcgZGVzY3JpcHRvcnMuCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHByb3ZpZGVyLm1Sb3V0ZXMuc2l6ZSgpIC0gMTsgaSA+PSB0YXJnZXRJbmRleDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIDEuIERlbGV0ZSB0aGUgcm91dGUncyBjb250ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcHJvdmlkZXIubVJvdXRlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIHJvdXRlLm1heWJlVXBkYXRlRGVzY3JpcHRvcihudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gMi4gUmVtb3ZlIHRoZSByb3V0ZSBmcm9tIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgICAgICBtUm91dGVzLnJlbW92ZShyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzZWxlY3RlZCByb3V0ZSBpZiBuZWVkZWQuCi0gICAgICAgICAgICAgICAgdXBkYXRlU2VsZWN0ZWRSb3V0ZUlmTmVlZGVkKHNlbGVjdGVkUm91dGVEZXNjcmlwdG9yQ2hhbmdlZCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3cgbm90aWZ5IGNsaWVudHMgYWJvdXQgcm91dGVzIHRoYXQgd2VyZSByZW1vdmVkLgotICAgICAgICAgICAgICAgIC8vIFdlIGRvIHRoaXMgYWZ0ZXIgdXBkYXRpbmcgdGhlIHNlbGVjdGVkIHJvdXRlIHRvIGVuc3VyZQotICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIgb2JzZXJ2ZXMgdGhlIG5ldyByb3V0ZQotICAgICAgICAgICAgICAgIC8vIHNlbGVjdGlvbiBiZWZvcmUgdGhlIHJlbW92YWwgc2luY2UgcmVtb3ZpbmcgdGhlIGN1cnJlbnRseQotICAgICAgICAgICAgICAgIC8vIHNlbGVjdGVkIHJvdXRlIG1heSBoYXZlIHNpZGUtZWZmZWN0cy4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gcHJvdmlkZXIubVJvdXRlcy5zaXplKCkgLSAxOyBpID49IHRhcmdldEluZGV4OyBpLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcHJvdmlkZXIubVJvdXRlcy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgcmVtb3ZlZDogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9SRU1PVkVELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gTm90aWZ5IHByb3ZpZGVyIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlByb3ZpZGVyIGNoYW5nZWQ6ICIgKyBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1BST1ZJREVSX0NIQU5HRUQsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IHVwZGF0ZVJvdXRlRGVzY3JpcHRvckFuZE5vdGlmeShSb3V0ZUluZm8gcm91dGUsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGVEZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpbnQgY2hhbmdlcyA9IHJvdXRlLm1heWJlVXBkYXRlRGVzY3JpcHRvcihyb3V0ZURlc2NyaXB0b3IpOwotICAgICAgICAgICAgaWYgKGNoYW5nZXMgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmICgoY2hhbmdlcyAmIFJvdXRlSW5mby5DSEFOR0VfR0VORVJBTCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIGNoYW5nZWQ6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfQ0hBTkdFRCwgcm91dGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKGNoYW5nZXMgJiBSb3V0ZUluZm8uQ0hBTkdFX1ZPTFVNRSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHZvbHVtZSBjaGFuZ2VkOiAiICsgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1ZPTFVNRV9DSEFOR0VELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoY2hhbmdlcyAmIFJvdXRlSW5mby5DSEFOR0VfUFJFU0VOVEFUSU9OX0RJU1BMQVkpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBwcmVzZW50YXRpb24gZGlzcGxheSBjaGFuZ2VkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNHX1JPVVRFX1BSRVNFTlRBVElPTl9ESVNQTEFZX0NIQU5HRUQsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2hhbmdlczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGFzc2lnblJvdXRlVW5pcXVlSWQoUHJvdmlkZXJJbmZvIHByb3ZpZGVyLCBTdHJpbmcgcm91dGVEZXNjcmlwdG9ySWQpIHsKLSAgICAgICAgICAgIC8vIEFsdGhvdWdoIHJvdXRlIGRlc2NyaXB0b3IgaWRzIGFyZSB1bmlxdWUgd2l0aGluIGEgcHJvdmlkZXIsIGl0J3MKLSAgICAgICAgICAgIC8vIHBvc3NpYmxlIGZvciB0aGVyZSB0byBiZSB0d28gcHJvdmlkZXJzIHdpdGggdGhlIHNhbWUgcGFja2FnZSBuYW1lLgotICAgICAgICAgICAgLy8gVGhlcmVmb3JlIHdlIG11c3QgZGVkdXBlIHRoZSBjb21wb3NpdGUgaWQuCi0gICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50TmFtZSA9IHByb3ZpZGVyLmdldENvbXBvbmVudE5hbWUoKS5mbGF0dGVuVG9TaG9ydFN0cmluZygpOwotICAgICAgICAgICAgU3RyaW5nIHVuaXF1ZUlkID0gY29tcG9uZW50TmFtZSArICI6IiArIHJvdXRlRGVzY3JpcHRvcklkOwotICAgICAgICAgICAgaWYgKGZpbmRSb3V0ZUJ5VW5pcXVlSWQodW5pcXVlSWQpIDwgMCkgewotICAgICAgICAgICAgICAgIG1VbmlxdWVJZE1hcC5wdXQobmV3IFBhaXI8Pihjb21wb25lbnROYW1lLCByb3V0ZURlc2NyaXB0b3JJZCksIHVuaXF1ZUlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdW5pcXVlSWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJFaXRoZXIgIiArIHJvdXRlRGVzY3JpcHRvcklkICsgIiBpc24ndCB1bmlxdWUgaW4gIiArIGNvbXBvbmVudE5hbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiIG9yIHdlJ3JlIHRyeWluZyB0byBhc3NpZ24gYSB1bmlxdWUgSUQgZm9yIGFuIGFscmVhZHkgYWRkZWQgcm91dGUiKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAyOyA7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBuZXdVbmlxdWVJZCA9IFN0cmluZy5mb3JtYXQoTG9jYWxlLlVTLCAiJXNfJWQiLCB1bmlxdWVJZCwgaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbmRSb3V0ZUJ5VW5pcXVlSWQobmV3VW5pcXVlSWQpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBtVW5pcXVlSWRNYXAucHV0KG5ldyBQYWlyPD4oY29tcG9uZW50TmFtZSwgcm91dGVEZXNjcmlwdG9ySWQpLCBuZXdVbmlxdWVJZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdVbmlxdWVJZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBmaW5kUm91dGVCeVVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVJvdXRlcy5nZXQoaSkubVVuaXF1ZUlkLmVxdWFscyh1bmlxdWVJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VW5pcXVlSWQoUHJvdmlkZXJJbmZvIHByb3ZpZGVyLCBTdHJpbmcgcm91dGVEZXNjcmlwdG9ySWQpIHsKLSAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnROYW1lID0gcHJvdmlkZXIuZ2V0Q29tcG9uZW50TmFtZSgpLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7Ci0gICAgICAgICAgICByZXR1cm4gbVVuaXF1ZUlkTWFwLmdldChuZXcgUGFpcjw+KGNvbXBvbmVudE5hbWUsIHJvdXRlRGVzY3JpcHRvcklkKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2VsZWN0ZWRSb3V0ZUlmTmVlZGVkKGJvb2xlYW4gc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkKSB7Ci0gICAgICAgICAgICAvLyBVcGRhdGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgICAgICAgIGlmIChtRGVmYXVsdFJvdXRlICE9IG51bGwgJiYgIW1EZWZhdWx0Um91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDbGVhcmluZyB0aGUgZGVmYXVsdCByb3V0ZSBiZWNhdXNlIGl0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImlzIG5vIGxvbmdlciBzZWxlY3RhYmxlOiAiICsgbURlZmF1bHRSb3V0ZSk7Ci0gICAgICAgICAgICAgICAgbURlZmF1bHRSb3V0ZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobURlZmF1bHRSb3V0ZSA9PSBudWxsICYmICFtUm91dGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogbVJvdXRlcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTeXN0ZW1EZWZhdWx0Um91dGUocm91dGUpICYmIHJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGVmYXVsdFJvdXRlID0gcm91dGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJGb3VuZCBkZWZhdWx0IHJvdXRlOiAiICsgbURlZmF1bHRSb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVXBkYXRlIGJsdWV0b290aCByb3V0ZS4KLSAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoUm91dGUgIT0gbnVsbCAmJiAhbUJsdWV0b290aFJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2xlYXJpbmcgdGhlIGJsdWV0b290aCByb3V0ZSBiZWNhdXNlIGl0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImlzIG5vIGxvbmdlciBzZWxlY3RhYmxlOiAiICsgbUJsdWV0b290aFJvdXRlKTsKLSAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoUm91dGUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhSb3V0ZSA9PSBudWxsICYmICFtUm91dGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogbVJvdXRlcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTeXN0ZW1MaXZlQXVkaW9Pbmx5Um91dGUocm91dGUpICYmIHJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoUm91dGUgPSByb3V0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkZvdW5kIGJsdWV0b290aCByb3V0ZTogIiArIG1CbHVldG9vdGhSb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVXBkYXRlIHNlbGVjdGVkIHJvdXRlLgotICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlID09IG51bGwgfHwgIW1TZWxlY3RlZFJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiVW5zZWxlY3RpbmcgdGhlIGN1cnJlbnQgcm91dGUgYmVjYXVzZSBpdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJpcyBubyBsb25nZXIgc2VsZWN0YWJsZTogIiArIG1TZWxlY3RlZFJvdXRlKTsKLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvdXRlSW50ZXJuYWwoY2hvb3NlRmFsbGJhY2tSb3V0ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04pOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBzZWxlY3RlZCByb3V0ZSBpcyBhIHJvdXRlIGdyb3VwLCBzZWxlY3QvdW5zZWxlY3Qgcm91dGUgY29udHJvbGxlcnMKLSAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIGFkZGVkL3JlbW92ZWQgcm91dGUgbWVtYmVycy4KLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgaW5zdGFuY2VvZiBSb3V0ZUdyb3VwKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8Um91dGVJbmZvPiByb3V0ZXMgPSAoKFJvdXRlR3JvdXApIG1TZWxlY3RlZFJvdXRlKS5nZXRSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQnVpbGQgYSBzZXQgb2YgZGVzY3JpcHRvciBJRHMgZm9yIHRoZSBuZXcgcm91dGUgZ3JvdXAuCi0gICAgICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IGlkU2V0ID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFJvdXRlSW5mbyByb3V0ZSA6IHJvdXRlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWRTZXQuYWRkKHJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVuc2VsZWN0IHJvdXRlIGNvbnRyb2xsZXJzIGZvciB0aGUgcmVtb3ZlZCByb3V0ZXMuCi0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFJvdXRlQ29udHJvbGxlcj4+IGl0ZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUNvbnRyb2xsZXJNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIFJvdXRlQ29udHJvbGxlcj4gZW50cnkgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaWRTZXQuY29udGFpbnMoZW50cnkuZ2V0S2V5KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25VbnNlbGVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBTZWxlY3Qgcm91dGUgY29udHJvbGxlcnMgZm9yIHRoZSBhZGRlZCByb3V0ZXMuCi0gICAgICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogcm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1Sb3V0ZUNvbnRyb2xsZXJNYXAuY29udGFpbnNLZXkocm91dGUubURlc2NyaXB0b3JJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uQ3JlYXRlUm91dGVDb250cm9sbGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tRGVzY3JpcHRvcklkLCBtU2VsZWN0ZWRSb3V0ZS5tRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5wdXQocm91dGUubURlc2NyaXB0b3JJZCwgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBwbGF5YmFjayBpbmZvIGJlY2F1c2UgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHJvdXRlIGhhdmUgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja0luZm9Gcm9tU2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgUm91dGVJbmZvIGNob29zZUZhbGxiYWNrUm91dGUoKSB7Ci0gICAgICAgICAgICAvLyBXaGVuIHRoZSBjdXJyZW50IHJvdXRlIGlzIHJlbW92ZWQgb3Igbm8gbG9uZ2VyIHNlbGVjdGFibGUsCi0gICAgICAgICAgICAvLyB3ZSB3YW50IHRvIHJldmVydCB0byBhIGxpdmUgYXVkaW8gcm91dGUgaWYgdGhlcmUgaXMKLSAgICAgICAgICAgIC8vIG9uZSAodXN1YWxseSBCbHVldG9vdGggQTJEUCkuICBGYWlsaW5nIHRoYXQsIHVzZQotICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgcm91dGUuCi0gICAgICAgICAgICBmb3IgKFJvdXRlSW5mbyByb3V0ZSA6IG1Sb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAocm91dGUgIT0gbURlZmF1bHRSb3V0ZQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXNTeXN0ZW1MaXZlQXVkaW9Pbmx5Um91dGUocm91dGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiByb3V0ZS5pc1NlbGVjdGFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm91dGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1EZWZhdWx0Um91dGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNTeXN0ZW1MaXZlQXVkaW9Pbmx5Um91dGUoUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gcm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpID09IG1TeXN0ZW1Qcm92aWRlcgotICAgICAgICAgICAgICAgICAgICAmJiByb3V0ZS5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykKLSAgICAgICAgICAgICAgICAgICAgJiYgIXJvdXRlLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1N5c3RlbURlZmF1bHRSb3V0ZShSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHJldHVybiByb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgPT0gbVN5c3RlbVByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICYmIHJvdXRlLm1EZXNjcmlwdG9ySWQuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5ERUZBVUxUX1JPVVRFX0lEKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZFJvdXRlSW50ZXJuYWwoQE5vbk51bGwgUm91dGVJbmZvIHJvdXRlLCBpbnQgdW5zZWxlY3RSZWFzb24pIHsKLSAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGUgZm9sbG93aW5nIGxvZ2dpbmcgd2hlbiBubyBsb25nZXIgbmVlZGVkLgotICAgICAgICAgICAgaWYgKHNHbG9iYWwgPT0gbnVsbCB8fCAobUJsdWV0b290aFJvdXRlICE9IG51bGwgJiYgcm91dGUuaXNEZWZhdWx0KCkpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RhY2tUcmFjZUVsZW1lbnRbXSBjYWxsU3RhY2sgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAvLyBjYWxsU3RhY2tbM10gaXMgdGhlIGNhbGxlciBvZiB0aGlzIG1ldGhvZC4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMzsgaSA8IGNhbGxTdGFjay5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdGFja1RyYWNlRWxlbWVudCBjYWxsZXIgPSBjYWxsU3RhY2tbaV07Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjYWxsZXIuZ2V0Q2xhc3NOYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjYWxsZXIuZ2V0TWV0aG9kTmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIjoiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoY2FsbGVyLmdldExpbmVOdW1iZXIoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc0dsb2JhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNldFNlbGVjdGVkUm91dGVJbnRlcm5hbCBpcyBjYWxsZWQgd2hpbGUgc0dsb2JhbCBpcyBudWxsOiBwa2dOYW1lPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1BcHBsaWNhdGlvbkNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSArICIsIGNhbGxlcnM9IiArIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRlZmF1bHQgcm91dGUgaXMgc2VsZWN0ZWQgd2hpbGUgYSBCVCByb3V0ZSBpcyBhdmFpbGFibGU6IHBrZ05hbWU9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUFwcGxpY2F0aW9uQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpICsgIiwgY2FsbGVycz0iICsgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgIT0gcm91dGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHVuc2VsZWN0ZWQ6ICIgKyBtU2VsZWN0ZWRSb3V0ZSArICIgcmVhc29uOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdW5zZWxlY3RSZWFzb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1VOU0VMRUNURUQsIG1TZWxlY3RlZFJvdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2VsZWN0UmVhc29uKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25VbnNlbGVjdCh1bnNlbGVjdFJlYXNvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVJvdXRlQ29udHJvbGxlck1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgOiBtUm91dGVDb250cm9sbGVyTWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVuc2VsZWN0KHVuc2VsZWN0UmVhc29uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUgPSByb3V0ZTsKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgPSByb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyLm9uU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBzZWxlY3RlZDogIiArIG1TZWxlY3RlZFJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfU0VMRUNURUQsIG1TZWxlY3RlZFJvdXRlKTsKLQotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSBpbnN0YW5jZW9mIFJvdXRlR3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxSb3V0ZUluZm8+IHJvdXRlcyA9ICgoUm91dGVHcm91cCkgbVNlbGVjdGVkUm91dGUpLmdldFJvdXRlcygpOwotICAgICAgICAgICAgICAgICAgICBtUm91dGVDb250cm9sbGVyTWFwLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHIgOiByb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5nZXRQcm92aWRlckluc3RhbmNlKCkub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5tRGVzY3JpcHRvcklkLCBtU2VsZWN0ZWRSb3V0ZS5tRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25TZWxlY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUNvbnRyb2xsZXJNYXAucHV0KHIubURlc2NyaXB0b3JJZCwgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja0luZm9Gcm9tU2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3lzdGVtUm91dGVTZWxlY3RlZEJ5RGVzY3JpcHRvcklkKFN0cmluZyBpZCkgewotICAgICAgICAgICAgLy8gU3lzdGVtIHJvdXRlIGlzIHNlbGVjdGVkLCBkbyBub3Qgc3luYyB0aGUgcm91dGUgd2Ugc2VsZWN0ZWQgYmVmb3JlLgotICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1NFTEVDVEVEKTsKLSAgICAgICAgICAgIGludCBwcm92aWRlckluZGV4ID0gZmluZFByb3ZpZGVySW5mbyhtU3lzdGVtUHJvdmlkZXIpOwotICAgICAgICAgICAgaWYgKHByb3ZpZGVySW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KHByb3ZpZGVySW5kZXgpOwotICAgICAgICAgICAgICAgIGludCByb3V0ZUluZGV4ID0gcHJvdmlkZXIuZmluZFJvdXRlQnlEZXNjcmlwdG9ySWQoaWQpOwotICAgICAgICAgICAgICAgIGlmIChyb3V0ZUluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIubVJvdXRlcy5nZXQocm91dGVJbmRleCkuc2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkUmVtb3RlQ29udHJvbENsaWVudChPYmplY3QgcmNjKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kUmVtb3RlQ29udHJvbENsaWVudFJlY29yZChyY2MpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQgcmVjb3JkID0gbmV3IFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQocmNjKTsKLSAgICAgICAgICAgICAgICBtUmVtb3RlQ29udHJvbENsaWVudHMuYWRkKHJlY29yZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKHJjYyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQgcmVjb3JkID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICAgICAgcmVjb3JkLmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvbihPYmplY3Qgc2Vzc2lvbikgewotICAgICAgICAgICAgc2V0TWVkaWFTZXNzaW9uUmVjb3JkKHNlc3Npb24gIT0gbnVsbCA/IG5ldyBNZWRpYVNlc3Npb25SZWNvcmQoc2Vzc2lvbikgOiBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvbkNvbXBhdChmaW5hbCBNZWRpYVNlc3Npb25Db21wYXQgc2Vzc2lvbikgewotICAgICAgICAgICAgbUNvbXBhdFNlc3Npb24gPSBzZXNzaW9uOwotICAgICAgICAgICAgaWYgKGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDIxKSB7Ci0gICAgICAgICAgICAgICAgc2V0TWVkaWFTZXNzaW9uUmVjb3JkKHNlc3Npb24gIT0gbnVsbCA/IG5ldyBNZWRpYVNlc3Npb25SZWNvcmQoc2Vzc2lvbikgOiBudWxsKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTQpIHsKLSAgICAgICAgICAgICAgICBpZiAobVJjY01lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQobVJjY01lZGlhU2Vzc2lvbi5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkpOwotICAgICAgICAgICAgICAgICAgICBtUmNjTWVkaWFTZXNzaW9uLnJlbW92ZU9uQWN0aXZlQ2hhbmdlTGlzdGVuZXIobVNlc3Npb25BY3RpdmVMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1SY2NNZWRpYVNlc3Npb24gPSBzZXNzaW9uOwotICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5hZGRPbkFjdGl2ZUNoYW5nZUxpc3RlbmVyKG1TZXNzaW9uQWN0aXZlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbi5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRSZW1vdGVDb250cm9sQ2xpZW50KHNlc3Npb24uZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRNZWRpYVNlc3Npb25SZWNvcmQoTWVkaWFTZXNzaW9uUmVjb3JkIG1lZGlhU2Vzc2lvblJlY29yZCkgewotICAgICAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uY2xlYXJWb2x1bWVIYW5kbGluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbiA9IG1lZGlhU2Vzc2lvblJlY29yZDsKLSAgICAgICAgICAgIGlmIChtZWRpYVNlc3Npb25SZWNvcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrSW5mb0Zyb21TZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTWVkaWFTZXNzaW9uQ29tcGF0LlRva2VuIGdldE1lZGlhU2Vzc2lvblRva2VuKCkgewotICAgICAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtTWVkaWFTZXNzaW9uLmdldFRva2VuKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Db21wYXRTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbXBhdFNlc3Npb24uZ2V0U2Vzc2lvblRva2VuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkIHJlY29yZCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkgPT0gcmNjKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQbGF5YmFja0luZm9Gcm9tU2VsZWN0ZWRSb3V0ZSgpIHsKLSAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby52b2x1bWUgPSBtU2VsZWN0ZWRSb3V0ZS5nZXRWb2x1bWUoKTsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvLnZvbHVtZU1heCA9IG1TZWxlY3RlZFJvdXRlLmdldFZvbHVtZU1heCgpOwotICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8udm9sdW1lSGFuZGxpbmcgPSBtU2VsZWN0ZWRSb3V0ZS5nZXRWb2x1bWVIYW5kbGluZygpOwotICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8ucGxheWJhY2tTdHJlYW0gPSBtU2VsZWN0ZWRSb3V0ZS5nZXRQbGF5YmFja1N0cmVhbSgpOwotICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8ucGxheWJhY2tUeXBlID0gbVNlbGVjdGVkUm91dGUuZ2V0UGxheWJhY2tUeXBlKCk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUmVtb3RlQ29udHJvbENsaWVudHMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkIHJlY29yZCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlY29yZC51cGRhdGVQbGF5YmFja0luZm8oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgPT0gZ2V0RGVmYXVsdFJvdXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtU2VsZWN0ZWRSb3V0ZSA9PSBnZXRCbHVldG9vdGhSb3V0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2NhbCByb3V0ZQotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5jbGVhclZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAVm9sdW1lUHJvdmlkZXJDb21wYXQuQ29udHJvbFR5cGUgaW50IGNvbnRyb2xUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXJDb21wYXQuVk9MVU1FX0NPTlRST0xfRklYRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrSW5mby52b2x1bWVIYW5kbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbFR5cGUgPSBWb2x1bWVQcm92aWRlckNvbXBhdC5WT0xVTUVfQ09OVFJPTF9BQlNPTFVURTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uY29uZmlndXJlVm9sdW1lKGNvbnRyb2xUeXBlLCBtUGxheWJhY2tJbmZvLnZvbHVtZU1heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby52b2x1bWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uY2xlYXJWb2x1bWVIYW5kbGluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUHJvdmlkZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVQcm92aWRlci5DYWxsYmFjayB7Ci0gICAgICAgICAgICBQcm92aWRlckNhbGxiYWNrKCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzY3JpcHRvckNoYW5nZWQoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVQcm92aWRlckRlc2NyaXB0b3IocHJvdmlkZXIsIGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNZWRpYVNlc3Npb25SZWNvcmQgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb25Db21wYXQgbU1zQ29tcGF0OwotCi0gICAgICAgICAgICBwcml2YXRlIEBWb2x1bWVQcm92aWRlckNvbXBhdC5Db250cm9sVHlwZSBpbnQgbUNvbnRyb2xUeXBlOwotICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbU1heFZvbHVtZTsKLSAgICAgICAgICAgIHByaXZhdGUgVm9sdW1lUHJvdmlkZXJDb21wYXQgbVZwQ29tcGF0OwotCi0gICAgICAgICAgICBwdWJsaWMgTWVkaWFTZXNzaW9uUmVjb3JkKE9iamVjdCBtZWRpYVNlc3Npb24pIHsKLSAgICAgICAgICAgICAgICBtTXNDb21wYXQgPSBNZWRpYVNlc3Npb25Db21wYXQuZnJvbU1lZGlhU2Vzc2lvbihtQXBwbGljYXRpb25Db250ZXh0LCBtZWRpYVNlc3Npb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgTWVkaWFTZXNzaW9uUmVjb3JkKE1lZGlhU2Vzc2lvbkNvbXBhdCBtZWRpYVNlc3Npb25Db21wYXQpIHsKLSAgICAgICAgICAgICAgICBtTXNDb21wYXQgPSBtZWRpYVNlc3Npb25Db21wYXQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZVZvbHVtZShAVm9sdW1lUHJvdmlkZXJDb21wYXQuQ29udHJvbFR5cGUgaW50IGNvbnRyb2xUeXBlLAotICAgICAgICAgICAgICAgICAgICBpbnQgbWF4LCBpbnQgY3VycmVudCkgewotICAgICAgICAgICAgICAgIGlmIChtVnBDb21wYXQgIT0gbnVsbCAmJiBjb250cm9sVHlwZSA9PSBtQ29udHJvbFR5cGUgJiYgbWF4ID09IG1NYXhWb2x1bWUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCBjaGFuZ2VkIGNvbnRyb2wgdHlwZSBvciBtYXgganVzdCBzZXQgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIG5ldyBjdXJyZW50IHZvbHVtZQotICAgICAgICAgICAgICAgICAgICBtVnBDb21wYXQuc2V0Q3VycmVudFZvbHVtZShjdXJyZW50KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IHByb3ZpZGVyIGFuZCB1cGRhdGUKLSAgICAgICAgICAgICAgICAgICAgbVZwQ29tcGF0ID0gbmV3IFZvbHVtZVByb3ZpZGVyQ29tcGF0KGNvbnRyb2xUeXBlLCBtYXgsIGN1cnJlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWVUbyhmaW5hbCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUucmVxdWVzdFNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BZGp1c3RWb2x1bWUoZmluYWwgaW50IGRpcmVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlLnJlcXVlc3RVcGRhdGVWb2x1bWUoZGlyZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICBtTXNDb21wYXQuc2V0UGxheWJhY2tUb1JlbW90ZShtVnBDb21wYXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgY2xlYXJWb2x1bWVIYW5kbGluZygpIHsKLSAgICAgICAgICAgICAgICBtTXNDb21wYXQuc2V0UGxheWJhY2tUb0xvY2FsKG1QbGF5YmFja0luZm8ucGxheWJhY2tTdHJlYW0pOwotICAgICAgICAgICAgICAgIG1WcENvbXBhdCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25Db21wYXQuVG9rZW4gZ2V0VG9rZW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1Nc0NvbXBhdC5nZXRTZXNzaW9uVG9rZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZAotICAgICAgICAgICAgICAgIGltcGxlbWVudHMgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5Wb2x1bWVDYWxsYmFjayB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgbVJjY0NvbXBhdDsKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRGlzY29ubmVjdGVkOwotCi0gICAgICAgICAgICBwdWJsaWMgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZChPYmplY3QgcmNjKSB7Ci0gICAgICAgICAgICAgICAgbVJjY0NvbXBhdCA9IFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQub2J0YWluKG1BcHBsaWNhdGlvbkNvbnRleHQsIHJjYyk7Ci0gICAgICAgICAgICAgICAgbVJjY0NvbXBhdC5zZXRWb2x1bWVDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja0luZm8oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRSZW1vdGVDb250cm9sQ2xpZW50KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtUmNjQ29tcGF0LmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKLSAgICAgICAgICAgICAgICBtRGlzY29ubmVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtUmNjQ29tcGF0LnNldFZvbHVtZUNhbGxiYWNrKG51bGwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5YmFja0luZm8oKSB7Ci0gICAgICAgICAgICAgICAgbVJjY0NvbXBhdC5zZXRQbGF5YmFja0luZm8obVBsYXliYWNrSW5mbyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1EaXNjb25uZWN0ZWQgJiYgbVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZS5yZXF1ZXN0U2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtRGlzY29ubmVjdGVkICYmIG1TZWxlY3RlZFJvdXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUucmVxdWVzdFVwZGF0ZVZvbHVtZShkaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ2FsbGJhY2tIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxDYWxsYmFja1JlY29yZD4gbVRlbXBDYWxsYmFja1JlY29yZHMgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PENhbGxiYWNrUmVjb3JkPigpOwotCi0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RZUEVfTUFTSyA9IDB4ZmYwMDsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVFlQRV9ST1VURSA9IDB4MDEwMDsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVFlQRV9QUk9WSURFUiA9IDB4MDIwMDsKLQotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX0FEREVEID0gTVNHX1RZUEVfUk9VVEUgfCAxOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1JFTU9WRUQgPSBNU0dfVFlQRV9ST1VURSB8IDI7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfQ0hBTkdFRCA9IE1TR19UWVBFX1JPVVRFIHwgMzsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9WT0xVTUVfQ0hBTkdFRCA9IE1TR19UWVBFX1JPVVRFIHwgNDsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9QUkVTRU5UQVRJT05fRElTUExBWV9DSEFOR0VEID0gTVNHX1RZUEVfUk9VVEUgfCA1OwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1NFTEVDVEVEID0gTVNHX1RZUEVfUk9VVEUgfCA2OwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1VOU0VMRUNURUQgPSBNU0dfVFlQRV9ST1VURSB8IDc7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19QUk9WSURFUl9BRERFRCA9IE1TR19UWVBFX1BST1ZJREVSIHwgMTsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19QUk9WSURFUl9SRU1PVkVEID0gTVNHX1RZUEVfUFJPVklERVIgfCAyOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BST1ZJREVSX0NIQU5HRUQgPSBNU0dfVFlQRV9QUk9WSURFUiB8IDM7Ci0KLSAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlcigpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcG9zdChpbnQgbXNnLCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICAgICAgb2J0YWluTWVzc2FnZShtc2csIG9iaikuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBvc3QoaW50IG1zZywgT2JqZWN0IG9iaiwgaW50IGFyZykgewotICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG9idGFpbk1lc3NhZ2UobXNnLCBvYmopOwotICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXJnMSA9IGFyZzsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLnNlbmRUb1RhcmdldCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2hhdCA9IG1zZy53aGF0OwotICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmogPSBtc2cub2JqOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBhcmcgPSBtc2cuYXJnMTsKLQotICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1TR19ST1VURV9DSEFOR0VECi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBnZXRTZWxlY3RlZFJvdXRlKCkuZ2V0SWQoKS5lcXVhbHMoKChSb3V0ZUluZm8pIG9iaikuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2VsZWN0ZWRSb3V0ZUlmTmVlZGVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFN5bmNocm9uaXplIHN0YXRlIHdpdGggdGhlIHN5c3RlbSBtZWRpYSByb3V0ZXIuCi0gICAgICAgICAgICAgICAgc3luY1dpdGhTeXN0ZW1Qcm92aWRlcih3aGF0LCBvYmopOwotCi0gICAgICAgICAgICAgICAgLy8gSW52b2tlIGFsbCByZWdpc3RlcmVkIGNhbGxiYWNrcy4KLSAgICAgICAgICAgICAgICAvLyBCdWlsZCBhIGxpc3Qgb2YgY2FsbGJhY2tzIGJlZm9yZSBpbnZva2luZyB0aGVtIGluIGNhc2UgY2FsbGJhY2tzCi0gICAgICAgICAgICAgICAgLy8gYXJlIGFkZGVkIG9yIHJlbW92ZWQgZHVyaW5nIGRpc3BhdGNoLgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUm91dGVycy5zaXplKCk7IC0taSA+PSAwOyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyIHJvdXRlciA9IG1Sb3V0ZXJzLmdldChpKS5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRlbXBDYWxsYmFja1JlY29yZHMuYWRkQWxsKHJvdXRlci5tQ2FsbGJhY2tSZWNvcmRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjYWxsYmFja0NvdW50ID0gbVRlbXBDYWxsYmFja1JlY29yZHMuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2sobVRlbXBDYWxsYmFja1JlY29yZHMuZ2V0KGkpLCB3aGF0LCBvYmosIGFyZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBtVGVtcENhbGxiYWNrUmVjb3Jkcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHN5bmNXaXRoU3lzdGVtUHJvdmlkZXIoaW50IHdoYXQsIE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHdoYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfQURERUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUHJvdmlkZXIub25TeW5jUm91dGVBZGRlZCgoUm91dGVJbmZvKSBvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1JFTU9WRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUHJvdmlkZXIub25TeW5jUm91dGVSZW1vdmVkKChSb3V0ZUluZm8pIG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlci5vblN5bmNSb3V0ZUNoYW5nZWQoKFJvdXRlSW5mbykgb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9TRUxFQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlci5vblN5bmNSb3V0ZVNlbGVjdGVkKChSb3V0ZUluZm8pIG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBpbnZva2VDYWxsYmFjayhDYWxsYmFja1JlY29yZCByZWNvcmQsIGludCB3aGF0LCBPYmplY3Qgb2JqLCBpbnQgYXJnKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZXIgcm91dGVyID0gcmVjb3JkLm1Sb3V0ZXI7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgY2FsbGJhY2sgPSByZWNvcmQubUNhbGxiYWNrOwotICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCAmIE1TR19UWVBFX01BU0spIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfVFlQRV9ST1VURTogewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUm91dGVJbmZvIHJvdXRlID0gKFJvdXRlSW5mbylvYmo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlY29yZC5maWx0ZXJSb3V0ZUV2ZW50KHJvdXRlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfQURERUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVBZGRlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfUkVNT1ZFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVJlbW92ZWQocm91dGVyLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVDaGFuZ2VkKHJvdXRlciwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9WT0xVTUVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVZvbHVtZUNoYW5nZWQocm91dGVyLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1BSRVNFTlRBVElPTl9ESVNQTEFZX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfU0VMRUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVTZWxlY3RlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfVU5TRUxFQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVVuc2VsZWN0ZWQocm91dGVyLCByb3V0ZSwgYXJnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19UWVBFX1BST1ZJREVSOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm92aWRlckluZm8gcHJvdmlkZXIgPSAoUHJvdmlkZXJJbmZvKW9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BST1ZJREVSX0FEREVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblByb3ZpZGVyQWRkZWQocm91dGVyLCBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BST1ZJREVSX1JFTU9WRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUHJvdmlkZXJSZW1vdmVkKHJvdXRlciwgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19QUk9WSURFUl9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblByb3ZpZGVyQ2hhbmdlZChyb3V0ZXIsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFTZXNzaW9uU3RhdHVzLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFTZXNzaW9uU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMDY1OTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhU2Vzc2lvblN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5UaW1lVXRpbHM7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBwbGF5YmFjayBzdGF0dXMgb2YgYSBtZWRpYSBzZXNzaW9uLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBwcm90b2NvbCBkZXNjcmliZWQgYnkgdGhlCi0gKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IE1lZGlhQ29udHJvbEludGVudH0gY2xhc3MuCi0gKiA8L3A+PHA+Ci0gKiBXaGVuIGEgbWVkaWEgc2Vzc2lvbiBpcyBjcmVhdGVkLCBpdCBpcyBpbml0aWFsbHkgaW4gdGhlCi0gKiB7QGxpbmsgI1NFU1NJT05fU1RBVEVfQUNUSVZFIGFjdGl2ZX0gc3RhdGUuICBXaGVuIHRoZSBtZWRpYSBzZXNzaW9uIGVuZHMKLSAqIG5vcm1hbGx5LCBpdCB0cmFuc2l0aW9ucyB0byB0aGUge0BsaW5rICNTRVNTSU9OX1NUQVRFX0VOREVEIGVuZGVkfSBzdGF0ZS4KLSAqIElmIHRoZSBtZWRpYSBzZXNzaW9uIGlzIGludmFsaWRhdGVkIGR1ZSB0byBhbm90aGVyIHNlc3Npb24gZm9yY2libHkgdGFraW5nCi0gKiBjb250cm9sIG9mIHRoZSByb3V0ZSwgdGhlbiBpdCB0cmFuc2l0aW9ucyB0byB0aGUKLSAqIHtAbGluayAjU0VTU0lPTl9TVEFURV9JTlZBTElEQVRFRCBpbnZhbGlkYXRlZH0gc3RhdGUuCi0gKiBSZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBvZiBlYWNoIHN0YXRlIGZvciBhbiBleHBsYW5hdGlvbiBvZiBpdHMgbWVhbmluZy4KLSAqIDwvcD48cD4KLSAqIFRvIG1vbml0b3Igc2Vzc2lvbiBzdGF0dXMsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgc3VwcGx5IGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IHRvIHVzZSBhcyB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcn0KLSAqIGZvciBhIGdpdmVuIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUQVJUX1NFU1NJT04gc2Vzc2lvbiBzdGFydCByZXF1ZXN0fS4KLSAqIDwvcD48cD4KLSAqIFRoaXMgb2JqZWN0IGlzIGltbXV0YWJsZSBvbmNlIGNyZWF0ZWQgdXNpbmcgYSB7QGxpbmsgQnVpbGRlcn0gaW5zdGFuY2UuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVNlc3Npb25TdGF0dXMgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJTUVTVEFNUCA9ICJ0aW1lc3RhbXAiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFU1NJT05fU1RBVEUgPSAic2Vzc2lvblN0YXRlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9RVUVVRV9QQVVTRUQgPSAicXVldWVQYXVzZWQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYVFJBUyA9ICJleHRyYXMiOwotCi0gICAgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0KLSAgICAvKioKLSAgICAgKiBTZXNzaW9uIHN0YXRlOiBBY3RpdmUuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNlc3Npb24gaXMgYWN0aXZlIGFuZCBpbiBjb250cm9sIG9mIHRoZSByb3V0ZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTl9TVEFURV9BQ1RJVkUgPSAwOwotCi0gICAgLyoqCi0gICAgICogU2Vzc2lvbiBzdGF0ZTogRW5kZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNlc3Npb24gd2FzIGVuZGVkIG5vcm1hbGx5IHVzaW5nIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OIGVuZCBzZXNzaW9ufSBhY3Rpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIEEgdGVybWluYXRlZCBtZWRpYSBzZXNzaW9uIGNhbm5vdCBiZSB1c2VkIGFueW1vcmUuICBUbyBwbGF5IG1vcmUgbWVkaWEsIHRoZQotICAgICAqIGFwcGxpY2F0aW9uIG11c3Qgc3RhcnQgYSBuZXcgc2Vzc2lvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTl9TVEFURV9FTkRFRCA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBTZXNzaW9uIHN0YXRlOiBJbnZhbGlkYXRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgc2Vzc2lvbiB3YXMgaW52YWxpZGF0ZWQgaW52b2x1bnRhcmlseSBkdWUgdG8KLSAgICAgKiBhbm90aGVyIHNlc3Npb24gdGFraW5nIGNvbnRyb2wgb2YgdGhlIHJvdXRlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBbiBpbnZhbGlkYXRlZCBtZWRpYSBzZXNzaW9uIGNhbm5vdCBiZSB1c2VkIGFueW1vcmUuICBUbyBwbGF5IG1vcmUgbWVkaWEsIHRoZQotICAgICAqIGFwcGxpY2F0aW9uIG11c3Qgc3RhcnQgYSBuZXcgc2Vzc2lvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTl9TVEFURV9JTlZBTElEQVRFRCA9IDI7Ci0KLSAgICBNZWRpYVNlc3Npb25TdGF0dXMoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRpbWVzdGFtcCBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXR1cyBpbmZvcm1hdGlvbiBpbgotICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSBib290IGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lfSB0aW1lIGJhc2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0dXMgdGltZXN0YW1wIGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lKCl9IHRpbWUgYmFzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRUaW1lc3RhbXAoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoS0VZX1RJTUVTVEFNUCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2Vzc2lvbiBzdGF0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlc3Npb24gc3RhdGUuICBPbmUgb2Yge0BsaW5rICNTRVNTSU9OX1NUQVRFX0FDVElWRX0sCi0gICAgICoge0BsaW5rICNTRVNTSU9OX1NUQVRFX0VOREVEfSwgb3Ige0BsaW5rICNTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNlc3Npb25TdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9TRVNTSU9OX1NUQVRFLCBTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlc3Npb24ncyBxdWV1ZSBpcyBwYXVzZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHNlc3Npb24ncyBxdWV1ZSBpcyBwYXVzZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNRdWV1ZVBhdXNlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfUVVFVUVfUEFVU0VEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyBzdGF0dXMgb2JqZWN0LgotICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIk1lZGlhU2Vzc2lvblN0YXR1c3sgIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoInRpbWVzdGFtcD0iKTsKLSAgICAgICAgVGltZVV0aWxzLmZvcm1hdER1cmF0aW9uKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gZ2V0VGltZXN0YW1wKCksIHJlc3VsdCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiBtcyBhZ28iKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBzZXNzaW9uU3RhdGU9IikuYXBwZW5kKHNlc3Npb25TdGF0ZVRvU3RyaW5nKGdldFNlc3Npb25TdGF0ZSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcXVldWVQYXVzZWQ9IikuYXBwZW5kKGlzUXVldWVQYXVzZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZXh0cmFzPSIpLmFwcGVuZChnZXRFeHRyYXMoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2Vzc2lvblN0YXRlVG9TdHJpbmcoaW50IHNlc3Npb25TdGF0ZSkgewotICAgICAgICBzd2l0Y2ggKHNlc3Npb25TdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBTRVNTSU9OX1NUQVRFX0FDVElWRToKLSAgICAgICAgICAgICAgICByZXR1cm4gImFjdGl2ZSI7Ci0gICAgICAgICAgICBjYXNlIFNFU1NJT05fU1RBVEVfRU5ERUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJlbmRlZCI7Ci0gICAgICAgICAgICBjYXNlIFNFU1NJT05fU1RBVEVfSU5WQUxJREFURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkYXRlZCI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcoc2Vzc2lvblN0YXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIGJ1bmRsZSBmb3Igc2VyaWFsaXphdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYXMgYSBidW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBhc0J1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEgYnVuZGxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBidW5kbGUgd2FzIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYVNlc3Npb25TdGF0dXMgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVNlc3Npb25TdGF0dXMoYnVuZGxlKSA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRlciBmb3Ige0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1cyBtZWRpYSBzZXNzaW9uIHN0YXR1cyBvYmplY3RzfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgc2Vzc2lvbiBzdGF0dXMgYnVpbGRlciB1c2luZyB0aGUgY3VycmVudCB0aW1lIGFzIHRoZQotICAgICAgICAgKiByZWZlcmVuY2UgdGltZXN0YW1wLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXRlIFRoZSBzZXNzaW9uIHN0YXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoaW50IHNlc3Npb25TdGF0ZSkgewotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIHNldFRpbWVzdGFtcChTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSk7Ci0gICAgICAgICAgICBzZXRTZXNzaW9uU3RhdGUoc2Vzc2lvblN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgc2Vzc2lvbiBzdGF0dXMgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBzdGF0dXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihNZWRpYVNlc3Npb25TdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGF0dXMgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShzdGF0dXMubUJ1bmRsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCi0gICAgICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSBib290IGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lfSB0aW1lIGJhc2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRUaW1lc3RhbXAobG9uZyBlbGFwc2VkUmVhbHRpbWVUaW1lc3RhbXApIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhLRVlfVElNRVNUQU1QLCBlbGFwc2VkUmVhbHRpbWVUaW1lc3RhbXApOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgc2Vzc2lvbiBzdGF0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFNlc3Npb25TdGF0ZShpbnQgc2Vzc2lvblN0YXRlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfU0VTU0lPTl9TVEFURSwgc2Vzc2lvblN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgd2hldGhlciB0aGUgcXVldWUgaXMgcGF1c2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UXVldWVQYXVzZWQoYm9vbGVhbiBxdWV1ZVBhdXNlZCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9RVUVVRV9QQVVTRUQsIHF1ZXVlUGF1c2VkKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYSBidW5kbGUgb2YgZXh0cmFzIGZvciB0aGlzIHN0YXR1cyBvYmplY3QuCi0gICAgICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgICAgICogYnkgYXBwbGljYXRpb25zLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RXh0cmFzKEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKEtFWV9FWFRSQVMsIGV4dHJhcyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCdWlsZHMgdGhlIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXMgbWVkaWEgc2Vzc2lvbiBzdGF0dXMgb2JqZWN0fS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25TdGF0dXMgYnVpbGQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvblN0YXR1cyhtQnVuZGxlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGU0ZTI4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX0RBVEFfUk9VVEVfSUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9EQVRBX1JPVVRFX0xJQlJBUllfR1JPVVA7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9EQVRBX1VOU0VMRUNUX1JFQVNPTjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfREFUQV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfQ1JFQVRFX1JPVVRFX0NPTlRST0xMRVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19SRUdJU1RFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19SRUxFQVNFX1JPVVRFX0NPTlRST0xMRVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfUk9VVEVfQ09OVFJPTF9SRVFVRVNUOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9NU0dfU0VMRUNUX1JPVVRFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1NFVF9ESVNDT1ZFUllfUkVRVUVTVDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19TRVRfUk9VVEVfVk9MVU1FOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9NU0dfVU5SRUdJU1RFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19VTlNFTEVDVF9ST1VURTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19VUERBVEVfUk9VVEVfVk9MVU1FOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9WRVJTSU9OX0NVUlJFTlQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9EQVRBX0VSUk9SOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfRkFJTEVEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19ERVNDUklQVE9SX0NIQU5HRUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0dFTkVSSUNfRkFJTFVSRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfR0VORVJJQ19TVUNDRVNTOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfTVNHX1JFR0lTVEVSRUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9WRVJTSU9OXzE7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuaXNWYWxpZFJlbW90ZU1lc3NlbmdlcjsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuRGVhZE9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlci5EZWF0aFJlY2lwaWVudDsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzZW5nZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2s7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBNYWludGFpbnMgYSBjb25uZWN0aW9uIHRvIGEgcGFydGljdWxhciBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlLgotICovCi1maW5hbCBjbGFzcyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIGV4dGVuZHMgTWVkaWFSb3V0ZVByb3ZpZGVyCi0gICAgICAgIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24gewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVQcm92aWRlclByb3h5IjsgIC8vIG1heC4gMjMgY2hhcnMKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgZmluYWwgQ29tcG9uZW50TmFtZSBtQ29tcG9uZW50TmFtZTsKLSAgICBmaW5hbCBQcml2YXRlSGFuZGxlciBtUHJpdmF0ZUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Q29udHJvbGxlcj4gbUNvbnRyb2xsZXJzID0gbmV3IEFycmF5TGlzdDxDb250cm9sbGVyPigpOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1TdGFydGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtQm91bmQ7Ci0gICAgcHJpdmF0ZSBDb25uZWN0aW9uIG1BY3RpdmVDb25uZWN0aW9uOwotICAgIHByaXZhdGUgYm9vbGVhbiBtQ29ubmVjdGlvblJlYWR5OwotCi0gICAgcHVibGljIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIoQ29udGV4dCBjb250ZXh0LCBDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgbmV3IFByb3ZpZGVyTWV0YWRhdGEoY29tcG9uZW50TmFtZSkpOwotCi0gICAgICAgIG1Db21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKLSAgICAgICAgbVByaXZhdGVIYW5kbGVyID0gbmV3IFByaXZhdGVIYW5kbGVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJvdXRlQ29udHJvbGxlciBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihATm9uTnVsbCBTdHJpbmcgcm91dGVJZCkgewotICAgICAgICBpZiAocm91dGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUlkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkLCBudWxsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKAotICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIHJvdXRlSWQsIEBOb25OdWxsIFN0cmluZyByb3V0ZUdyb3VwSWQpIHsKLSAgICAgICAgaWYgKHJvdXRlSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGVJZCBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyb3V0ZUdyb3VwSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGVHcm91cElkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkLCByb3V0ZUdyb3VwSWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWQoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBpZiAobUNvbm5lY3Rpb25SZWFkeSkgewotICAgICAgICAgICAgbUFjdGl2ZUNvbm5lY3Rpb24uc2V0RGlzY292ZXJ5UmVxdWVzdChyZXF1ZXN0KTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVCaW5kaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogQ29ubmVjdGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUJvdW5kKSB7Ci0gICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0KLSAgICAgICAgICAgIE1lc3NlbmdlciBtZXNzZW5nZXIgPSAoc2VydmljZSAhPSBudWxsID8gbmV3IE1lc3NlbmdlcihzZXJ2aWNlKSA6IG51bGwpOwotICAgICAgICAgICAgaWYgKGlzVmFsaWRSZW1vdGVNZXNzZW5nZXIobWVzc2VuZ2VyKSkgewotICAgICAgICAgICAgICAgIENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKG1lc3Nlbmdlcik7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24ucmVnaXN0ZXIoKSkgewotICAgICAgICAgICAgICAgICAgICBtQWN0aXZlQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb247Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBSZWdpc3RyYXRpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgdGhpcyArICI6IFNlcnZpY2UgcmV0dXJuZWQgaW52YWxpZCBtZXNzZW5nZXIgYmluZGVyIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU2VydmljZSBkaXNjb25uZWN0ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJTZXJ2aWNlIGNvbm5lY3Rpb24gIiArIG1Db21wb25lbnROYW1lLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ29tcG9uZW50TmFtZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgcmV0dXJuIG1Db21wb25lbnROYW1lLmdldFBhY2thZ2VOYW1lKCkuZXF1YWxzKHBhY2thZ2VOYW1lKQotICAgICAgICAgICAgICAgICYmIG1Db21wb25lbnROYW1lLmdldENsYXNzTmFtZSgpLmVxdWFscyhjbGFzc05hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgICAgICBpZiAoIW1TdGFydGVkKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBTdGFydGluZyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtU3RhcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICB1cGRhdGVCaW5kaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFN0b3BwaW5nIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB1cGRhdGVCaW5kaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWJpbmRJZkRpc2Nvbm5lY3RlZCgpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uID09IG51bGwgJiYgc2hvdWxkQmluZCgpKSB7Ci0gICAgICAgICAgICB1bmJpbmQoKTsKLSAgICAgICAgICAgIGJpbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVCaW5kaW5nKCkgewotICAgICAgICBpZiAoc2hvdWxkQmluZCgpKSB7Ci0gICAgICAgICAgICBiaW5kKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1bmJpbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRCaW5kKCkgewotICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgIC8vIEJpbmQgd2hlbmV2ZXIgdGhlcmUgaXMgYSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgICAgICAgIGlmIChnZXREaXNjb3ZlcnlSZXF1ZXN0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBCaW5kIHdoZW5ldmVyIHRoZSBhcHBsaWNhdGlvbiBoYXMgYW4gYWN0aXZlIHJvdXRlIGNvbnRyb2xsZXIuCi0gICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgb25lIG9mIHRoaXMgcHJvdmlkZXIncyByb3V0ZXMgaXMgc2VsZWN0ZWQuCi0gICAgICAgICAgICBpZiAoIW1Db250cm9sbGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJpbmQoKSB7Ci0gICAgICAgIGlmICghbUJvdW5kKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBCaW5kaW5nIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEludGVudCBzZXJ2aWNlID0gbmV3IEludGVudChNZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX0lOVEVSRkFDRSk7Ci0gICAgICAgICAgICBzZXJ2aWNlLnNldENvbXBvbmVudChtQ29tcG9uZW50TmFtZSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1Cb3VuZCA9IGdldENvbnRleHQoKS5iaW5kU2VydmljZShzZXJ2aWNlLCB0aGlzLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOwotICAgICAgICAgICAgICAgIGlmICghbUJvdW5kICYmIERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IEJpbmQgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogQmluZCBmYWlsZWQiLCBleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVuYmluZCgpIHsKLSAgICAgICAgaWYgKG1Cb3VuZCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogVW5iaW5kaW5nIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Cb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnVuYmluZFNlcnZpY2UodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFJvdXRlQ29udHJvbGxlciBjcmVhdGVSb3V0ZUNvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQsIFN0cmluZyByb3V0ZUdyb3VwSWQpIHsKLSAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcigpOwotICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZXMgPSBkZXNjcmlwdG9yLmdldFJvdXRlcygpOwotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gcm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlID0gcm91dGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAocm91dGUuZ2V0SWQoKS5lcXVhbHMocm91dGVJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gbmV3IENvbnRyb2xsZXIocm91dGVJZCwgcm91dGVHcm91cElkKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJzLmFkZChjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uUmVhZHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuYXR0YWNoQ29ubmVjdGlvbihtQWN0aXZlQ29ubmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlQmluZGluZygpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udHJvbGxlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25SZWFkeShDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLSAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uID09IGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIG1Db25uZWN0aW9uUmVhZHkgPSB0cnVlOwotICAgICAgICAgICAgYXR0YWNoQ29udHJvbGxlcnNUb0Nvbm5lY3Rpb24oKTsKLQotICAgICAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCA9IGdldERpc2NvdmVyeVJlcXVlc3QoKTsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQWN0aXZlQ29ubmVjdGlvbi5zZXREaXNjb3ZlcnlSZXF1ZXN0KHJlcXVlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25EaWVkKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gY29ubmVjdGlvbikgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU2VydmljZSBjb25uZWN0aW9uIGRpZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgb25Db25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBTdHJpbmcgZXJyb3IpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uID09IGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFNlcnZpY2UgY29ubmVjdGlvbiBlcnJvciAtICIgKyBlcnJvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bmJpbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgb25Db25uZWN0aW9uRGVzY3JpcHRvckNoYW5nZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uLAotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiA9PSBjb25uZWN0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBEZXNjcmlwdG9yIGNoYW5nZWQsIGRlc2NyaXB0b3I9IiArIGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0RGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkaXNjb25uZWN0KCkgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0RGVzY3JpcHRvcihudWxsKTsKLSAgICAgICAgICAgIG1Db25uZWN0aW9uUmVhZHkgPSBmYWxzZTsKLSAgICAgICAgICAgIGRldGFjaENvbnRyb2xsZXJzRnJvbUNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgb25Db250cm9sbGVyUmVsZWFzZWQoQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgICAgIG1Db250cm9sbGVycy5yZW1vdmUoY29udHJvbGxlcik7Ci0gICAgICAgIGNvbnRyb2xsZXIuZGV0YWNoQ29ubmVjdGlvbigpOwotICAgICAgICB1cGRhdGVCaW5kaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGF0dGFjaENvbnRyb2xsZXJzVG9Db25uZWN0aW9uKCkgewotICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbGxlcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIG1Db250cm9sbGVycy5nZXQoaSkuYXR0YWNoQ29ubmVjdGlvbihtQWN0aXZlQ29ubmVjdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGV0YWNoQ29udHJvbGxlcnNGcm9tQ29ubmVjdGlvbigpIHsKLSAgICAgICAgaW50IGNvdW50ID0gbUNvbnRyb2xsZXJzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBtQ29udHJvbGxlcnMuZ2V0KGkpLmRldGFjaENvbm5lY3Rpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ29udHJvbGxlciBleHRlbmRzIFJvdXRlQ29udHJvbGxlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Sb3V0ZUlkOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUm91dGVHcm91cElkOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtU2VsZWN0ZWQ7Ci0gICAgICAgIHByaXZhdGUgaW50IG1QZW5kaW5nU2V0Vm9sdW1lID0gLTE7Ci0gICAgICAgIHByaXZhdGUgaW50IG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGE7Ci0KLSAgICAgICAgcHJpdmF0ZSBDb25uZWN0aW9uIG1Db25uZWN0aW9uOwotICAgICAgICBwcml2YXRlIGludCBtQ29udHJvbGxlcklkOwotCi0gICAgICAgIHB1YmxpYyBDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkLCBTdHJpbmcgcm91dGVHcm91cElkKSB7Ci0gICAgICAgICAgICBtUm91dGVJZCA9IHJvdXRlSWQ7Ci0gICAgICAgICAgICBtUm91dGVHcm91cElkID0gcm91dGVHcm91cElkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYXR0YWNoQ29ubmVjdGlvbihDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIG1Db25uZWN0aW9uID0gY29ubmVjdGlvbjsKLSAgICAgICAgICAgIG1Db250cm9sbGVySWQgPSBjb25uZWN0aW9uLmNyZWF0ZVJvdXRlQ29udHJvbGxlcihtUm91dGVJZCwgbVJvdXRlR3JvdXBJZCk7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zZWxlY3RSb3V0ZShtQ29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdTZXRWb2x1bWUgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNldFZvbHVtZShtQ29udHJvbGxlcklkLCBtUGVuZGluZ1NldFZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nU2V0Vm9sdW1lID0gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi51cGRhdGVWb2x1bWUobUNvbnRyb2xsZXJJZCwgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YSk7Ci0gICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGEgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRldGFjaENvbm5lY3Rpb24oKSB7Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uLnJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIobUNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICAgICAgICAgIG1Db250cm9sbGVySWQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVsZWFzZSgpIHsKLSAgICAgICAgICAgIG9uQ29udHJvbGxlclJlbGVhc2VkKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VsZWN0KCkgewotICAgICAgICAgICAgbVNlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24uc2VsZWN0Um91dGUobUNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25VbnNlbGVjdCgpIHsKLSAgICAgICAgICAgIG9uVW5zZWxlY3QoTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVW5zZWxlY3QoaW50IHJlYXNvbikgewotICAgICAgICAgICAgbVNlbGVjdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uLnVuc2VsZWN0Um91dGUobUNvbnRyb2xsZXJJZCwgcmVhc29uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNldFZvbHVtZShpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uLnNldFZvbHVtZShtQ29udHJvbGxlcklkLCB2b2x1bWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ1NldFZvbHVtZSA9IHZvbHVtZTsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblVwZGF0ZVZvbHVtZShpbnQgZGVsdGEpIHsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24udXBkYXRlVm9sdW1lKG1Db250cm9sbGVySWQsIGRlbHRhKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YSArPSBkZWx0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRyb2xSZXF1ZXN0KEludGVudCBpbnRlbnQsIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1Db25uZWN0aW9uLnNlbmRDb250cm9sUmVxdWVzdChtQ29udHJvbGxlcklkLCBpbnRlbnQsIGNhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ29ubmVjdGlvbiBpbXBsZW1lbnRzIERlYXRoUmVjaXBpZW50IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZXNzZW5nZXIgbVNlcnZpY2VNZXNzZW5nZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUmVjZWl2ZUhhbmRsZXIgbVJlY2VpdmVIYW5kbGVyOwotICAgICAgICBwcml2YXRlIGZpbmFsIE1lc3NlbmdlciBtUmVjZWl2ZU1lc3NlbmdlcjsKLQotICAgICAgICBwcml2YXRlIGludCBtTmV4dFJlcXVlc3RJZCA9IDE7Ci0gICAgICAgIHByaXZhdGUgaW50IG1OZXh0Q29udHJvbGxlcklkID0gMTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVNlcnZpY2VWZXJzaW9uOyAvLyBub24temVybyB3aGVuIHJlZ2lzdHJhdGlvbiBjb21wbGV0ZQotCi0gICAgICAgIHByaXZhdGUgaW50IG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3BhcnNlQXJyYXk8Q29udHJvbFJlcXVlc3RDYWxsYmFjaz4gbVBlbmRpbmdDYWxsYmFja3MgPQotICAgICAgICAgICAgICAgIG5ldyBTcGFyc2VBcnJheTxDb250cm9sUmVxdWVzdENhbGxiYWNrPigpOwotCi0gICAgICAgIHB1YmxpYyBDb25uZWN0aW9uKE1lc3NlbmdlciBzZXJ2aWNlTWVzc2VuZ2VyKSB7Ci0gICAgICAgICAgICBtU2VydmljZU1lc3NlbmdlciA9IHNlcnZpY2VNZXNzZW5nZXI7Ci0gICAgICAgICAgICBtUmVjZWl2ZUhhbmRsZXIgPSBuZXcgUmVjZWl2ZUhhbmRsZXIodGhpcyk7Ci0gICAgICAgICAgICBtUmVjZWl2ZU1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIobVJlY2VpdmVIYW5kbGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyKCkgewotICAgICAgICAgICAgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCA9IG1OZXh0UmVxdWVzdElkKys7Ci0gICAgICAgICAgICBpZiAoIXNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfUkVHSVNURVIsCi0gICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQsCi0gICAgICAgICAgICAgICAgICAgIENMSUVOVF9WRVJTSU9OX0NVUlJFTlQsIG51bGwsIG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1TZXJ2aWNlTWVzc2VuZ2VyLmdldEJpbmRlcigpLmxpbmtUb0RlYXRoKHRoaXMsIDApOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyRGllZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfVU5SRUdJU1RFUiwgMCwgMCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBtUmVjZWl2ZUhhbmRsZXIuZGlzcG9zZSgpOwotICAgICAgICAgICAgbVNlcnZpY2VNZXNzZW5nZXIuZ2V0QmluZGVyKCkudW5saW5rVG9EZWF0aCh0aGlzLCAwKTsKLQotICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbFBlbmRpbmdDYWxsYmFja3MoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZmFpbFBlbmRpbmdDYWxsYmFja3MoKSB7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtUGVuZGluZ0NhbGxiYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnZhbHVlQXQoaSkub25FcnJvcihudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkdlbmVyaWNGYWlsdXJlKGludCByZXF1ZXN0SWQpIHsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0SWQgPT0gbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQgPSAwOwotICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvbkVycm9yKHRoaXMsICJSZWdpc3RyYXRpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrID0gbVBlbmRpbmdDYWxsYmFja3MuZ2V0KHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnJlbW92ZShyZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uRXJyb3IobnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uR2VuZXJpY1N1Y2Nlc3MoaW50IHJlcXVlc3RJZCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblJlZ2lzdGVyZWQoaW50IHJlcXVlc3RJZCwgaW50IHNlcnZpY2VWZXJzaW9uLAotICAgICAgICAgICAgICAgIEJ1bmRsZSBkZXNjcmlwdG9yQnVuZGxlKSB7Ci0gICAgICAgICAgICBpZiAobVNlcnZpY2VWZXJzaW9uID09IDAKLSAgICAgICAgICAgICAgICAgICAgJiYgcmVxdWVzdElkID09IG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQKLSAgICAgICAgICAgICAgICAgICAgJiYgc2VydmljZVZlcnNpb24gPj0gU0VSVklDRV9WRVJTSU9OXzEpIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkID0gMDsKLSAgICAgICAgICAgICAgICBtU2VydmljZVZlcnNpb24gPSBzZXJ2aWNlVmVyc2lvbjsKLSAgICAgICAgICAgICAgICBvbkNvbm5lY3Rpb25EZXNjcmlwdG9yQ2hhbmdlZCh0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5mcm9tQnVuZGxlKGRlc2NyaXB0b3JCdW5kbGUpKTsKLSAgICAgICAgICAgICAgICBvbkNvbm5lY3Rpb25SZWFkeSh0aGlzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uRGVzY3JpcHRvckNoYW5nZWQoQnVuZGxlIGRlc2NyaXB0b3JCdW5kbGUpIHsKLSAgICAgICAgICAgIGlmIChtU2VydmljZVZlcnNpb24gIT0gMCkgewotICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvbkRlc2NyaXB0b3JDaGFuZ2VkKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmZyb21CdW5kbGUoZGVzY3JpcHRvckJ1bmRsZSkpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db250cm9sUmVxdWVzdFN1Y2NlZWRlZChpbnQgcmVxdWVzdElkLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjayA9IG1QZW5kaW5nQ2FsbGJhY2tzLmdldChyZXF1ZXN0SWQpOwotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ0NhbGxiYWNrcy5yZW1vdmUocmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJlc3VsdChkYXRhKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ29udHJvbFJlcXVlc3RGYWlsZWQoaW50IHJlcXVlc3RJZCwgU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjayA9IG1QZW5kaW5nQ2FsbGJhY2tzLmdldChyZXF1ZXN0SWQpOwotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ0NhbGxiYWNrcy5yZW1vdmUocmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkVycm9yKGVycm9yLCBkYXRhKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBiaW5kZXJEaWVkKCkgewotICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgb25Db25uZWN0aW9uRGllZChDb25uZWN0aW9uLnRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBjcmVhdGVSb3V0ZUNvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQsIFN0cmluZyByb3V0ZUdyb3VwSWQpIHsKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQgPSBtTmV4dENvbnRyb2xsZXJJZCsrOwotICAgICAgICAgICAgQnVuZGxlIGRhdGEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBkYXRhLnB1dFN0cmluZyhDTElFTlRfREFUQV9ST1VURV9JRCwgcm91dGVJZCk7Ci0gICAgICAgICAgICBkYXRhLnB1dFN0cmluZyhDTElFTlRfREFUQV9ST1VURV9MSUJSQVJZX0dST1VQLCByb3V0ZUdyb3VwSWQpOwotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUiwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBkYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVySWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZWxlYXNlUm91dGVDb250cm9sbGVyKGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSLAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0Um91dGUoaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEUsCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB1bnNlbGVjdFJvdXRlKGludCBjb250cm9sbGVySWQsIGludCByZWFzb24pIHsKLSAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBleHRyYXMucHV0SW50KENMSUVOVF9EQVRBX1VOU0VMRUNUX1JFQVNPTiwgcmVhc29uKTsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEUsCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgZXh0cmFzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZShpbnQgY29udHJvbGxlcklkLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBCdW5kbGUgZGF0YSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGRhdGEucHV0SW50KENMSUVOVF9EQVRBX1ZPTFVNRSwgdm9sdW1lKTsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRSwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBkYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVZvbHVtZShpbnQgY29udHJvbGxlcklkLCBpbnQgZGVsdGEpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBkYXRhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgZGF0YS5wdXRJbnQoQ0xJRU5UX0RBVEFfVk9MVU1FLCBkZWx0YSk7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1VQREFURV9ST1VURV9WT0xVTUUsCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgZGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZW5kQ29udHJvbFJlcXVlc3QoaW50IGNvbnRyb2xsZXJJZCwgSW50ZW50IGludGVudCwKLSAgICAgICAgICAgICAgICBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpbnQgcmVxdWVzdElkID0gbU5leHRSZXF1ZXN0SWQrKzsKLSAgICAgICAgICAgIGlmIChzZW5kUmVxdWVzdChDTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCBjb250cm9sbGVySWQsIGludGVudCwgbnVsbCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0NhbGxiYWNrcy5wdXQocmVxdWVzdElkLCBjYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RGlzY292ZXJ5UmVxdWVzdChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1NFVF9ESVNDT1ZFUllfUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgMCwgcmVxdWVzdCAhPSBudWxsID8gcmVxdWVzdC5hc0J1bmRsZSgpIDogbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2VuZFJlcXVlc3QoaW50IHdoYXQsIGludCByZXF1ZXN0SWQsIGludCBhcmcsIE9iamVjdCBvYmosIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKCk7Ci0gICAgICAgICAgICBtc2cud2hhdCA9IHdoYXQ7Ci0gICAgICAgICAgICBtc2cuYXJnMSA9IHJlcXVlc3RJZDsKLSAgICAgICAgICAgIG1zZy5hcmcyID0gYXJnOwotICAgICAgICAgICAgbXNnLm9iaiA9IG9iajsKLSAgICAgICAgICAgIG1zZy5zZXREYXRhKGRhdGEpOwotICAgICAgICAgICAgbXNnLnJlcGx5VG8gPSBtUmVjZWl2ZU1lc3NlbmdlcjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VNZXNzZW5nZXIuc2VuZChtc2cpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoRGVhZE9iamVjdEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBzZXJ2aWNlIGRpZWQuCi0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBpZiAod2hhdCAhPSBDTElFTlRfTVNHX1VOUkVHSVNURVIpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IHNlbmQgbWVzc2FnZSB0byBzZXJ2aWNlLiIsIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBQcml2YXRlSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBQcml2YXRlSGFuZGxlcigpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXIgdGhhdCByZWNlaXZlcyBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbm5lciBjbGFzcyBpcyBzdGF0aWMgYW5kIG9ubHkgcmV0YWlucyBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBjb25uZWN0aW9uCi0gICAgICogdG8gcHJldmVudCB0aGUgY2xpZW50IGZyb20gYmVpbmcgbGVha2VkIGluIGNhc2UgdGhlIHNlcnZpY2UgaXMgaG9sZGluZyBhbgotICAgICAqIGFjdGl2ZSByZWZlcmVuY2UgdG8gdGhlIGNsaWVudCdzIG1lc3Nlbmdlci4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBoYW5kbGVyIHNob3VsZCBub3QgYmUgdXNlZCB0byBoYW5kbGUgYW55IG1lc3NhZ2VzIG90aGVyIHRoYW4gdGhvc2UKLSAgICAgKiB0aGF0IGNvbWUgZnJvbSB0aGUgc2VydmljZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVjZWl2ZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPENvbm5lY3Rpb24+IG1Db25uZWN0aW9uUmVmOwotCi0gICAgICAgIHB1YmxpYyBSZWNlaXZlSGFuZGxlcihDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIG1Db25uZWN0aW9uUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8Q29ubmVjdGlvbj4oY29ubmVjdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWYuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBtQ29ubmVjdGlvblJlZi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChjb25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2hhdCA9IG1zZy53aGF0OwotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXF1ZXN0SWQgPSBtc2cuYXJnMTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYXJnID0gbXNnLmFyZzI7Ci0gICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iaiA9IG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIGRhdGEgPSBtc2cucGVla0RhdGEoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NNZXNzYWdlKGNvbm5lY3Rpb24sIHdoYXQsIHJlcXVlc3RJZCwgYXJnLCBvYmosIGRhdGEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVW5oYW5kbGVkIG1lc3NhZ2UgZnJvbSBzZXJ2ZXI6ICIgKyBtc2cpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NNZXNzYWdlKENvbm5lY3Rpb24gY29ubmVjdGlvbiwKLSAgICAgICAgICAgICAgICBpbnQgd2hhdCwgaW50IHJlcXVlc3RJZCwgaW50IGFyZywgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFOgotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLm9uR2VuZXJpY0ZhaWx1cmUocmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUzoKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5vbkdlbmVyaWNTdWNjZXNzKHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19SRUdJU1RFUkVEOgotICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqIGluc3RhbmNlb2YgQnVuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5vblJlZ2lzdGVyZWQocmVxdWVzdElkLCBhcmcsIChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfREVTQ1JJUFRPUl9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqIGluc3RhbmNlb2YgQnVuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5vbkRlc2NyaXB0b3JDaGFuZ2VkKChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iaiBpbnN0YW5jZW9mIEJ1bmRsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24ub25Db250cm9sUmVxdWVzdFN1Y2NlZWRlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCAoQnVuZGxlKW9iaik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvciA9IChkYXRhID09IG51bGwgPyBudWxsIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRTdHJpbmcoU0VSVklDRV9EQVRBX0VSUk9SKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5vbkNvbnRyb2xSZXF1ZXN0RmFpbGVkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIGVycm9yLCAoQnVuZGxlKW9iaik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTFmNjQ3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLS8qKgotICogV2F0Y2hlcyBmb3IgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXMgdG8gYmUgaW5zdGFsbGVkLgotICogQWRkcyBhIHByb3ZpZGVyIHRvIHRoZSBtZWRpYSByb3V0ZXIgZm9yIGVhY2ggcmVnaXN0ZXJlZCBzZXJ2aWNlLgotICoKLSAqIEBzZWUgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcgotICovCi1maW5hbCBjbGFzcyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKLSAgICBwcml2YXRlIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIG1QYWNrYWdlTWFuYWdlcjsKLQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXI+IG1Qcm92aWRlcnMgPQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyPigpOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUnVubmluZzsKLQotICAgIHB1YmxpYyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlcihDb250ZXh0IGNvbnRleHQsIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKLSAgICAgICAgbVBhY2thZ2VNYW5hZ2VyID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgICAgICBpZiAoIW1SdW5uaW5nKSB7Ci0gICAgICAgICAgICBtUnVubmluZyA9IHRydWU7Ci0KLSAgICAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9BRERFRCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRU1PVkVEKTsKLSAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX0NIQU5HRUQpOwotICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfUkVQTEFDRUQpOwotICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfUkVTVEFSVEVEKTsKLSAgICAgICAgICAgIGZpbHRlci5hZGREYXRhU2NoZW1lKCJwYWNrYWdlIik7Ci0gICAgICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1TY2FuUGFja2FnZXNSZWNlaXZlciwgZmlsdGVyLCBudWxsLCBtSGFuZGxlcik7Ci0KLSAgICAgICAgICAgIC8vIFNjYW4gcGFja2FnZXMuCi0gICAgICAgICAgICAvLyBBbHNvIGhhcyB0aGUgc2lkZS1lZmZlY3Qgb2YgcmVzdGFydGluZyBwcm92aWRlcnMgaWYgbmVlZGVkLgotICAgICAgICAgICAgbUhhbmRsZXIucG9zdChtU2NhblBhY2thZ2VzUnVubmFibGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcCgpIHsKLSAgICAgICAgaWYgKG1SdW5uaW5nKSB7Ci0gICAgICAgICAgICBtUnVubmluZyA9IGZhbHNlOwotCi0gICAgICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobVNjYW5QYWNrYWdlc1JlY2VpdmVyKTsKLSAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtU2NhblBhY2thZ2VzUnVubmFibGUpOwotCi0gICAgICAgICAgICAvLyBTdG9wIGFsbCBwcm92aWRlcnMuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gbVByb3ZpZGVycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMuZ2V0KGkpLnN0b3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2NhblBhY2thZ2VzKCkgewotICAgICAgICBpZiAoIW1SdW5uaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgcHJvdmlkZXJzIGZvciBhbGwgbmV3IHNlcnZpY2VzLgotICAgICAgICAvLyBSZW9yZGVyIHRoZSBsaXN0IHNvIHRoYXQgcHJvdmlkZXJzIGxlZnQgYXQgdGhlIGVuZCB3aWxsIGJlIHRoZSBvbmVzIHRvIHJlbW92ZS4KLSAgICAgICAgaW50IHRhcmdldEluZGV4ID0gMDsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZS5TRVJWSUNFX0lOVEVSRkFDRSk7Ci0gICAgICAgIGZvciAoUmVzb2x2ZUluZm8gcmVzb2x2ZUluZm8gOiBtUGFja2FnZU1hbmFnZXIucXVlcnlJbnRlbnRTZXJ2aWNlcyhpbnRlbnQsIDApKSB7Ci0gICAgICAgICAgICBTZXJ2aWNlSW5mbyBzZXJ2aWNlSW5mbyA9IHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VJbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgc291cmNlSW5kZXggPSBmaW5kUHJvdmlkZXIoc2VydmljZUluZm8ucGFja2FnZU5hbWUsIHNlcnZpY2VJbmZvLm5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUoc2VydmljZUluZm8ucGFja2FnZU5hbWUsIHNlcnZpY2VJbmZvLm5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVycy5hZGQodGFyZ2V0SW5kZXgrKywgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2suYWRkUHJvdmlkZXIocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlSW5kZXggPj0gdGFyZ2V0SW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KHNvdXJjZUluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIuc3RhcnQoKTsgLy8gcmVzdGFydCB0aGUgcHJvdmlkZXIgaWYgbmVlZGVkCi0gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLnJlYmluZElmRGlzY29ubmVjdGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnN3YXAobVByb3ZpZGVycywgc291cmNlSW5kZXgsIHRhcmdldEluZGV4KyspOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlbW92ZSBwcm92aWRlcnMgZm9yIG1pc3Npbmcgc2VydmljZXMuCi0gICAgICAgIGlmICh0YXJnZXRJbmRleCA8IG1Qcm92aWRlcnMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVByb3ZpZGVycy5zaXplKCkgLSAxOyBpID49IHRhcmdldEluZGV4OyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrLnJlbW92ZVByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLnJlbW92ZShwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgcHJvdmlkZXIuc3RvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZmluZFByb3ZpZGVyKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICBpbnQgY291bnQgPSBtUHJvdmlkZXJzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXIuaGFzQ29tcG9uZW50TmFtZShwYWNrYWdlTmFtZSwgY2xhc3NOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG1TY2FuUGFja2FnZXNSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIHNjYW5QYWNrYWdlcygpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbVNjYW5QYWNrYWdlc1J1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgc2NhblBhY2thZ2VzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHVibGljIGludGVyZmFjZSBDYWxsYmFjayB7Ci0gICAgICAgIHZvaWQgYWRkUHJvdmlkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyKTsKLSAgICAgICAgdm9pZCByZW1vdmVQcm92aWRlcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjY0NDliLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci0KLS8qKgotICogUHJvdmlkZXMgYWNjZXNzIHRvIGZlYXR1cmVzIG9mIHRoZSByZW1vdGUgY29udHJvbCBjbGllbnQuCi0gKgotICogSGlkZGVuIGZvciBub3cgYnV0IHdlIG1pZ2h0IHdhbnQgdG8gbWFrZSB0aGlzIGF2YWlsYWJsZSB0byBhcHBsaWNhdGlvbnMKLSAqIGluIHRoZSBmdXR1cmUuCi0gKi8KLWFic3RyYWN0IGNsYXNzIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgewotICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbVJjYzsKLSAgICBwcm90ZWN0ZWQgVm9sdW1lQ2FsbGJhY2sgbVZvbHVtZUNhbGxiYWNrOwotCi0gICAgcHJvdGVjdGVkIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQoQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbVJjYyA9IHJjYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgb2J0YWluKENvbnRleHQgY29udGV4dCwgT2JqZWN0IHJjYykgewotICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDE2KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEplbGx5YmVhbkltcGwoY29udGV4dCwgcmNjKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IExlZ2FjeUltcGwoY29udGV4dCwgcmNjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSB7Ci0gICAgICAgIHJldHVybiBtUmNjOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgcGxheWJhY2sgaW5mb3JtYXRpb24uCi0gICAgICogTXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZSB0byBhdHRhY2ggdG8gdGhlIHJlbW90ZSBjb250cm9sIGNsaWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmZvIFRoZSBwbGF5YmFjayBpbmZvcm1hdGlvbi4gIE11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWJhY2tJbmZvKFBsYXliYWNrSW5mbyBpbmZvKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRvIHJlY2VpdmUgdm9sdW1lIGNoYW5nZSByZXF1ZXN0cyBmcm9tIHRoZSByZW1vdGUgY29udHJvbCBjbGllbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIHZvbHVtZSBjYWxsYmFjayB0byB1c2Ugb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZUNhbGxiYWNrKFZvbHVtZUNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1Wb2x1bWVDYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGxheWJhY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQbGF5YmFja0luZm8gewotICAgICAgICBwdWJsaWMgaW50IHZvbHVtZTsKLSAgICAgICAgcHVibGljIGludCB2b2x1bWVNYXg7Ci0gICAgICAgIHB1YmxpYyBpbnQgdm9sdW1lSGFuZGxpbmcgPSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVk9MVU1FX0ZJWEVEOwotICAgICAgICBwdWJsaWMgaW50IHBsYXliYWNrU3RyZWFtID0gQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQzsKLSAgICAgICAgcHVibGljIGludCBwbGF5YmFja1R5cGUgPSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVFlQRV9SRU1PVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdm9sdW1lIHVwZGF0ZXMgYXJlIHJlcXVlc3RlZCBieSB0aGUgcmVtb3RlIGNvbnRyb2wgY2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgVm9sdW1lQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHZvbHVtZSBzaG91bGQgYmUgaW5jcmVhc2VkIG9yIGRlY3JlYXNlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRpcmVjdGlvbiBBbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hldGhlciB0aGUgdm9sdW1lIGlzIHRvIGJlIGluY3JlYXNlZAotICAgICAgICAgKiAocG9zaXRpdmUgdmFsdWUpIG9yIGRlY3JlYXNlZCAobmVnYXRpdmUgdmFsdWUpLgotICAgICAgICAgKiBGb3IgYnVuZGxlZCBjaGFuZ2VzLCB0aGUgYWJzb2x1dGUgdmFsdWUgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgY2hhbmdlcwotICAgICAgICAgKiBpbiB0aGUgc2FtZSBkaXJlY3Rpb24sIGUuZy4gKzMgY29ycmVzcG9uZHMgdG8gdGhyZWUgInZvbHVtZSB1cCIgY2hhbmdlcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChpbnQgZGlyZWN0aW9uKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHZvbHVtZSBmb3IgdGhlIHJvdXRlIHNob3VsZCBiZSBzZXQgdG8gdGhlIGdpdmVuIHZhbHVlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdm9sdW1lIEFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgbmV3IHZvbHVtZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSB1c2VkLAotICAgICAgICAgKiBhbHdheXMgYmV0d2VlbiAwIGFuZCB0aGUgdmFsdWUgc2V0IGJ5IHtAbGluayBQbGF5YmFja0luZm8jdm9sdW1lTWF4fS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU2V0UmVxdWVzdChpbnQgdm9sdW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMZWdhY3kgaW1wbGVtZW50YXRpb24gZm9yIHBsYXRmb3JtIHZlcnNpb25zIHByaW9yIHRvIEplbGx5YmVhbi4KLSAgICAgKiBEb2VzIG5vdGhpbmcuCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIExlZ2FjeUltcGwgZXh0ZW5kcyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0IHsKLSAgICAgICAgcHVibGljIExlZ2FjeUltcGwoQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCByY2MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50YXRpb24gZm9yIEplbGx5YmVhbi4KLSAgICAgKgotICAgICAqIFRoZSBiYXNpYyBpZGVhIG9mIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgdG8gYXR0YWNoIHRoZSBSQ0MgdG8gYSBVc2VyUm91dGVJbmZvCi0gICAgICogaW4gb3JkZXIgdG8gaG9vayB1cCBzdHJlYW0gbWV0YWRhdGEgYW5kIHZvbHVtZSBjYWxsYmFja3MgYmVjYXVzZSB0aGVyZSBpcyBubwotICAgICAqIG90aGVyIEFQSSBhdmFpbGFibGUgdG8gZG8gc28gaW4gdGhpcyBwbGF0Zm9ybSB2ZXJzaW9uLiAgVGhlIFVzZXJSb3V0ZUluZm8gaXRzZWxmCi0gICAgICogaXMgbm90IGF0dGFjaGVkIHRvIHRoZSBNZWRpYVJvdXRlciBzbyBpdCBpcyB0cmFuc3BhcmVudCB0byB0aGUgdXNlci4KLSAgICAgKi8KLSAgICAvLyBAQFJlcXVpcmVzQXBpKDE2KQotICAgIHN0YXRpYyBjbGFzcyBKZWxseWJlYW5JbXBsIGV4dGVuZHMgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Sb3V0ZXJPYmo7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Vc2VyUm91dGVDYXRlZ29yeU9iajsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVVzZXJSb3V0ZU9iajsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1SZWdpc3RlcmVkOwotCi0gICAgICAgIHB1YmxpYyBKZWxseWJlYW5JbXBsKENvbnRleHQgY29udGV4dCwgT2JqZWN0IHJjYykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgcmNjKTsKLQotICAgICAgICAgICAgbVJvdXRlck9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmdldE1lZGlhUm91dGVyKGNvbnRleHQpOwotICAgICAgICAgICAgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlUm91dGVDYXRlZ29yeSgKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlck9iaiwgIiIsIGZhbHNlKTsKLSAgICAgICAgICAgIG1Vc2VyUm91dGVPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVVc2VyUm91dGUoCi0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJPYmosIG1Vc2VyUm91dGVDYXRlZ29yeU9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGxheWJhY2tJbmZvKFBsYXliYWNrSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby52b2x1bWUpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVNYXgoCi0gICAgICAgICAgICAgICAgICAgIG1Vc2VyUm91dGVPYmosIGluZm8udm9sdW1lTWF4KTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lSGFuZGxpbmcoCi0gICAgICAgICAgICAgICAgICAgIG1Vc2VyUm91dGVPYmosIGluZm8udm9sdW1lSGFuZGxpbmcpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRQbGF5YmFja1N0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby5wbGF5YmFja1N0cmVhbSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFBsYXliYWNrVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby5wbGF5YmFja1R5cGUpOwotCi0gICAgICAgICAgICBpZiAoIW1SZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgbVJlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lQ2FsbGJhY2sobVVzZXJSb3V0ZU9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVZvbHVtZUNhbGxiYWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVm9sdW1lQ2FsbGJhY2tXcmFwcGVyKHRoaXMpKSk7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRSZW1vdGVDb250cm9sQ2xpZW50KG1Vc2VyUm91dGVPYmosIG1SY2MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVm9sdW1lQ2FsbGJhY2tXcmFwcGVyCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYVJvdXRlckplbGx5YmVhbi5Wb2x1bWVDYWxsYmFjayB7Ci0gICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB0aGUgZnJhbWV3b3JrIG5ldmVyIHVucmVnaXN0ZXJzIGl0cyB2b2x1bWUgb2JzZXJ2ZXIgZnJvbQotICAgICAgICAgICAgLy8gdGhlIGF1ZGlvIHNlcnZpY2Ugc28gdGhlIFVzZXJSb3V0ZUluZm8gb2JqZWN0IG1heSBsZWFrIGFsb25nIHdpdGgKLSAgICAgICAgICAgIC8vIGFueSBjYWxsYmFja3MgdGhhdCB3ZSBhdHRhY2ggdG8gaXQuICBVc2UgYSB3ZWFrIHJlZmVyZW5jZSB0byBwcmV2ZW50Ci0gICAgICAgICAgICAvLyB0aGUgdm9sdW1lIGNhbGxiYWNrIGZyb20gaG9sZGluZyBzdHJvbmcgcmVmZXJlbmNlcyB0byBhbnl0aGluZyBpbXBvcnRhbnQuCi0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8SmVsbHliZWFuSW1wbD4gbUltcGxXZWFrOwotCi0gICAgICAgICAgICBwdWJsaWMgVm9sdW1lQ2FsbGJhY2tXcmFwcGVyKEplbGx5YmVhbkltcGwgaW1wbCkgewotICAgICAgICAgICAgICAgIG1JbXBsV2VhayA9IG5ldyBXZWFrUmVmZXJlbmNlPEplbGx5YmVhbkltcGw+KGltcGwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBKZWxseWJlYW5JbXBsIGltcGwgPSBtSW1wbFdlYWsuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGltcGwgIT0gbnVsbCAmJiBpbXBsLm1Wb2x1bWVDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGltcGwubVZvbHVtZUNhbGxiYWNrLm9uVm9sdW1lVXBkYXRlUmVxdWVzdChkaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgSmVsbHliZWFuSW1wbCBpbXBsID0gbUltcGxXZWFrLmdldCgpOwotICAgICAgICAgICAgICAgIGlmIChpbXBsICE9IG51bGwgJiYgaW1wbC5tVm9sdW1lQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbXBsLm1Wb2x1bWVDYWxsYmFjay5vblZvbHVtZVNldFJlcXVlc3Qodm9sdW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVtb3RlUGxheWJhY2tDbGllbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVQbGF5YmFja0NsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmUxNDk3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVQbGF5YmFja0NsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5PYmplY3RzQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIHBsYXlpbmcgbWVkaWEgb24gcmVtb3RlIHJvdXRlcyB1c2luZyB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sCi0gKiBkZWZpbmVkIGJ5IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnR9LgotICogPHA+Ci0gKiBUaGUgY2xpZW50IG1haW50YWlucyBzZXNzaW9uIHN0YXRlIGFuZCBvZmZlcnMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSBmb3IgaXNzdWluZwotICogcmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgaW50ZW50cyB0byBhIHNpbmdsZSByb3V0ZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFJlbW90ZVBsYXliYWNrQ2xpZW50IHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSZW1vdGVQbGF5YmFja0NsaWVudCI7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlOwotICAgIHByaXZhdGUgZmluYWwgQWN0aW9uUmVjZWl2ZXIgbUFjdGlvblJlY2VpdmVyOwotICAgIHByaXZhdGUgZmluYWwgUGVuZGluZ0ludGVudCBtSXRlbVN0YXR1c1BlbmRpbmdJbnRlbnQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQZW5kaW5nSW50ZW50IG1TZXNzaW9uU3RhdHVzUGVuZGluZ0ludGVudDsKLSAgICBwcml2YXRlIGZpbmFsIFBlbmRpbmdJbnRlbnQgbU1lc3NhZ2VQZW5kaW5nSW50ZW50OwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2s7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Sb3V0ZVN1cHBvcnRzUXVldWluZzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVJvdXRlU3VwcG9ydHNTZXNzaW9uTWFuYWdlbWVudDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVJvdXRlU3VwcG9ydHNNZXNzYWdpbmc7Ci0KLSAgICBTdHJpbmcgbVNlc3Npb25JZDsKLSAgICBTdGF0dXNDYWxsYmFjayBtU3RhdHVzQ2FsbGJhY2s7Ci0gICAgT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciBtT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSByZW1vdGUgcGxheWJhY2sgY2xpZW50IGZvciBhIHJvdXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJvdXRlIFRoZSBtZWRpYSByb3V0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVtb3RlUGxheWJhY2tDbGllbnQoQ29udGV4dCBjb250ZXh0LCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbVJvdXRlID0gcm91dGU7Ci0KLSAgICAgICAgSW50ZW50RmlsdGVyIGFjdGlvbkZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgYWN0aW9uRmlsdGVyLmFkZEFjdGlvbihBY3Rpb25SZWNlaXZlci5BQ1RJT05fSVRFTV9TVEFUVVNfQ0hBTkdFRCk7Ci0gICAgICAgIGFjdGlvbkZpbHRlci5hZGRBY3Rpb24oQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX1NFU1NJT05fU1RBVFVTX0NIQU5HRUQpOwotICAgICAgICBhY3Rpb25GaWx0ZXIuYWRkQWN0aW9uKEFjdGlvblJlY2VpdmVyLkFDVElPTl9NRVNTQUdFX1JFQ0VJVkVEKTsKLSAgICAgICAgbUFjdGlvblJlY2VpdmVyID0gbmV3IEFjdGlvblJlY2VpdmVyKCk7Ci0gICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtQWN0aW9uUmVjZWl2ZXIsIGFjdGlvbkZpbHRlcik7Ci0KLSAgICAgICAgSW50ZW50IGl0ZW1TdGF0dXNJbnRlbnQgPSBuZXcgSW50ZW50KEFjdGlvblJlY2VpdmVyLkFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEKTsKLSAgICAgICAgaXRlbVN0YXR1c0ludGVudC5zZXRQYWNrYWdlKGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgIG1JdGVtU3RhdHVzUGVuZGluZ0ludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KAotICAgICAgICAgICAgICAgIGNvbnRleHQsIDAsIGl0ZW1TdGF0dXNJbnRlbnQsIDApOwotCi0gICAgICAgIEludGVudCBzZXNzaW9uU3RhdHVzSW50ZW50ID0gbmV3IEludGVudChBY3Rpb25SZWNlaXZlci5BQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCk7Ci0gICAgICAgIHNlc3Npb25TdGF0dXNJbnRlbnQuc2V0UGFja2FnZShjb250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICBtU2Vzc2lvblN0YXR1c1BlbmRpbmdJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdCgKLSAgICAgICAgICAgICAgICBjb250ZXh0LCAwLCBzZXNzaW9uU3RhdHVzSW50ZW50LCAwKTsKLQotICAgICAgICBJbnRlbnQgbWVzc2FnZUludGVudCA9IG5ldyBJbnRlbnQoQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQpOwotICAgICAgICBtZXNzYWdlSW50ZW50LnNldFBhY2thZ2UoY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgbU1lc3NhZ2VQZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoCi0gICAgICAgICAgICAgICAgY29udGV4dCwgMCwgbWVzc2FnZUludGVudCwgMCk7Ci0gICAgICAgIGRldGVjdEZlYXR1cmVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVsZWFzZXMgcmVzb3VyY2VzIG93bmVkIGJ5IHRoZSBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLSAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1BY3Rpb25SZWNlaXZlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyByZW1vdGUgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcmVtb3RlIHBsYXliYWNrLCB0aGVuIG5vbmUgb2YgdGhlIGZ1bmN0aW9uYWxpdHkKLSAgICAgKiBvZmZlcmVkIGJ5IHRoZSBjbGllbnQgd2lsbCBiZSBhdmFpbGFibGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgYWxsIG9mIHRoZSBmb2xsb3dpbmcKLSAgICAgKiBhY3Rpb25zOiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIHBsYXl9LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFRUsgc2Vla30sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUyBnZXQgc3RhdHVzfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QQVVTRSBwYXVzZX0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FIHJlc3VtZX0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUCBzdG9wfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgcmVtb3RlIHBsYXliYWNrIGlzIHN1cHBvcnRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHF1ZXVpbmcgZmVhdHVyZXMuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcXVldWluZywgdGhlbiBhdCBtb3N0IG9uZSBtZWRpYSBpdGVtIGNhbiBiZSBwbGF5ZWQKLSAgICAgKiBhdCBhIHRpbWUgYW5kIHRoZSB7QGxpbmsgI2VucXVldWV9IG1ldGhvZCB3aWxsIG5vdCBiZSBhdmFpbGFibGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgYWxsIG9mIHRoZSBiYXNpYyByZW1vdGUgcGxheWJhY2sKLSAgICAgKiBhY3Rpb25zIGFuZCBhbGwgb2YgdGhlIGZvbGxvd2luZyBhY3Rpb25zOgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVNT1ZFIHJlbW92ZX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHF1ZXVpbmcgaXMgc3VwcG9ydGVkLiAgSW1wbGllcyB7QGxpbmsgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWR9Ci0gICAgICogaXMgYWxzbyB0cnVlLgotICAgICAqCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUXVldWluZ1N1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZVN1cHBvcnRzUXVldWluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHNlc3Npb24gbWFuYWdlbWVudCBmZWF0dXJlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBzZXNzaW9uIG1hbmFnZW1lbnQsIHRoZW4gdGhlIHNlc3Npb24gd2lsbAotICAgICAqIG5vdCBiZSBjcmVhdGVkIHVudGlsIHRoZSBmaXJzdCBtZWRpYSBpdGVtIGlzIHBsYXllZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGJhc2ljIHJlbW90ZSBwbGF5YmFjawotICAgICAqIGFjdGlvbnMgYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFjdGlvbnM6Ci0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTiBzdGFydCBzZXNzaW9ufSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMgZ2V0IHNlc3Npb24gc3RhdHVzfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTkRfU0VTU0lPTiBlbmQgc2Vzc2lvbn0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHNlc3Npb24gbWFuYWdlbWVudCBpcyBzdXBwb3J0ZWQuCi0gICAgICogSW1wbGllcyB7QGxpbmsgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWR9IGlzIGFsc28gdHJ1ZS4KLSAgICAgKgotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Nlc3Npb25NYW5hZ2VtZW50U3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlU3VwcG9ydHNTZXNzaW9uTWFuYWdlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIG1lc3NhZ2VzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgYWxsIG9mIHRoZSBiYXNpYyByZW1vdGUgcGxheWJhY2sKLSAgICAgKiBhY3Rpb25zIGFuZCBhbGwgb2YgdGhlIGZvbGxvd2luZyBhY3Rpb25zOgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUQVJUX1NFU1NJT04gc3RhcnQgc2Vzc2lvbn0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VORF9NRVNTQUdFIHNlbmQgbWVzc2FnZX0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT04gZW5kIHNlc3Npb259LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBzZXNzaW9uIG1hbmFnZW1lbnQgaXMgc3VwcG9ydGVkLgotICAgICAqIEltcGxpZXMge0BsaW5rICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkfSBpcyBhbHNvIHRydWUuCi0gICAgICoKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNZXNzYWdpbmdTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGVTdXBwb3J0c01lc3NhZ2luZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHNlc3Npb24gaWQgaWYgdGhlcmUgaXMgb25lLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY3VycmVudCBzZXNzaW9uIGlkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uSWQoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbklkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBpZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJdCBpcyB1c3VhbGx5IG5vdCBuZWNlc3NhcnkgdG8gc2V0IHRoZSBzZXNzaW9uIGlkIGV4cGxpY2l0bHkgc2luY2UKLSAgICAgKiBpdCBpcyBjcmVhdGVkIGFzIGEgc2lkZS1lZmZlY3Qgb2Ygb3RoZXIgcmVxdWVzdHMgc3VjaCBhcwotICAgICAqIHtAbGluayAjcGxheX0sIHtAbGluayAjZW5xdWV1ZX0sIGFuZCB7QGxpbmsgI3N0YXJ0U2Vzc2lvbn0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgbmV3IHNlc3Npb24gaWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uSWQoU3RyaW5nIHNlc3Npb25JZCkgewotICAgICAgICBpZiAoIU9iamVjdHNDb21wYXQuZXF1YWxzKG1TZXNzaW9uSWQsIHNlc3Npb25JZCkpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNlc3Npb24gaWQgaXMgbm93OiAiICsgc2Vzc2lvbklkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0gICAgICAgICAgICBpZiAobVN0YXR1c0NhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzQ2FsbGJhY2sub25TZXNzaW9uQ2hhbmdlZChzZXNzaW9uSWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjbGllbnQgY3VycmVudGx5IGhhcyBhIHNlc3Npb24uCi0gICAgICogPHA+Ci0gICAgICogRXF1aXZhbGVudCB0byBjaGVja2luZyB3aGV0aGVyIHtAbGluayAjZ2V0U2Vzc2lvbklkfSByZXR1cm5zIGEgbm9uLW51bGwgcmVzdWx0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGVyZSBpcyBhIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNTZXNzaW9uKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25JZCAhPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjYWxsYmFjayB0aGF0IHNob3VsZCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIHdoZW4gdGhlIHN0YXRlIG9mCi0gICAgICogbWVkaWEgc2Vzc2lvbnMgb3IgbWVkaWEgaXRlbXMgY3JlYXRlZCBieSB0aGlzIGluc3RhbmNlIG9mIHRoZSByZW1vdGUKLSAgICAgKiBwbGF5YmFjayBjbGllbnQgY2hhbmdlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY2FsbGJhY2sgc2hvdWxkIGJlIHNldCBiZWZvcmUgdGhlIHNlc3Npb24gaXMgY3JlYXRlZCBvciBhbnkgcGxheQotICAgICAqIGNvbW1hbmRzIGFyZSBpc3N1ZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBzZXQuICBNYXkgYmUgbnVsbCB0byByZW1vdmUgdGhlIHByZXZpb3VzIGNhbGxiYWNrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1c0NhbGxiYWNrKFN0YXR1c0NhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1TdGF0dXNDYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjYWxsYmFjayB0aGF0IHNob3VsZCByZWNlaXZlIG1lc3NhZ2VzIHdoZW4gYSBtZXNzYWdlIGlzIHNlbnQgZnJvbQotICAgICAqIG1lZGlhIHNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcyBpbnN0YW5jZSBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIGNsaWVudCBjaGFuZ2VzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBjYWxsYmFjayBzaG91bGQgYmUgc2V0IGJlZm9yZSB0aGUgc2Vzc2lvbiBpcyBjcmVhdGVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgY2FsbGJhY2sgdG8gc2V0LiAgTWF5IGJlIG51bGwgdG8gcmVtb3ZlIHRoZSBwcmV2aW91cyBjYWxsYmFjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyKE9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbU9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcGxheSBhIG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogQ2xlYXJzIHRoZSBxdWV1ZSBhbmQgc3RhcnRzIHBsYXlpbmcgdGhlIG5ldyBpdGVtIGltbWVkaWF0ZWx5LiAgSWYgdGhlIHF1ZXVlCi0gICAgICogd2FzIHByZXZpb3VzbHkgcGF1c2VkLCB0aGVuIGl0IGlzIHJlc3VtZWQgYXMgYSBzaWRlLWVmZmVjdCBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLiAgSWYgbm8gc2Vzc2lvbiBpcyBhdmFpbGFibGUsIHRoZW4KLSAgICAgKiBvbmUgaXMgY3JlYXRlZCBpbXBsaWNpdGx5LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBBQ1RJT05fUExBWX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGVudFVyaSBUaGUgY29udGVudCBVcmkgdG8gcGxheS4KLSAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIG1pbWUgdHlwZSBvZiB0aGUgY29udGVudCwgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAqIEBwYXJhbSBwb3NpdGlvbk1pbGxpcyBUaGUgaW5pdGlhbCBjb250ZW50IHBvc2l0aW9uIGZvciB0aGUgaXRlbSBpbiBtaWxsaXNlY29uZHMsCi0gICAgICogb3IgPGNvZGU+MDwvY29kZT4gdG8gc3RhcnQgYXQgdGhlIGJlZ2lubmluZy4KLSAgICAgKiBAcGFyYW0gbWV0YWRhdGEgVGhlIG1lZGlhIGl0ZW0gbWV0YWRhdGEgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWX0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcmVtb3RlIHBsYXliYWNrLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGxheShVcmkgY29udGVudFVyaSwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgbWV0YWRhdGEsCi0gICAgICAgICAgICBsb25nIHBvc2l0aW9uTWlsbGlzLCBCdW5kbGUgZXh0cmFzLCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcGxheU9yRW5xdWV1ZShjb250ZW50VXJpLCBtaW1lVHlwZSwgbWV0YWRhdGEsIHBvc2l0aW9uTWlsbGlzLAotICAgICAgICAgICAgICAgIGV4dHJhcywgY2FsbGJhY2ssIE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUExBWSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIGVucXVldWUgYSBtZWRpYSBpdGVtLgotICAgICAqIDxwPgotICAgICAqIEVucXVldWVzIGEgbmV3IGl0ZW0gdG8gcGxheS4gIElmIHRoZSBxdWV1ZSB3YXMgcHJldmlvdXNseSBwYXVzZWQsIHRoZW4gd2lsbAotICAgICAqIHJlbWFpbiBwYXVzZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLiAgSWYgbm8gc2Vzc2lvbiBpcyBhdmFpbGFibGUsIHRoZW4KLSAgICAgKiBvbmUgaXMgY3JlYXRlZCBpbXBsaWNpdGx5LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBBQ1RJT05fRU5RVUVVRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGVudFVyaSBUaGUgY29udGVudCBVcmkgdG8gZW5xdWV1ZS4KLSAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIG1pbWUgdHlwZSBvZiB0aGUgY29udGVudCwgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAqIEBwYXJhbSBwb3NpdGlvbk1pbGxpcyBUaGUgaW5pdGlhbCBjb250ZW50IHBvc2l0aW9uIGZvciB0aGUgaXRlbSBpbiBtaWxsaXNlY29uZHMsCi0gICAgICogb3IgPGNvZGU+MDwvY29kZT4gdG8gc3RhcnQgYXQgdGhlIGJlZ2lubmluZy4KLSAgICAgKiBAcGFyYW0gbWV0YWRhdGEgVGhlIG1lZGlhIGl0ZW0gbWV0YWRhdGEgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRX0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcXVldWluZy4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqIEBzZWUgI2lzUXVldWluZ1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVucXVldWUoVXJpIGNvbnRlbnRVcmksIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG1ldGFkYXRhLAotICAgICAgICAgICAgbG9uZyBwb3NpdGlvbk1pbGxpcywgQnVuZGxlIGV4dHJhcywgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHBsYXlPckVucXVldWUoY29udGVudFVyaSwgbWltZVR5cGUsIG1ldGFkYXRhLCBwb3NpdGlvbk1pbGxpcywKLSAgICAgICAgICAgICAgICBleHRyYXMsIGNhbGxiYWNrLCBNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VOUVVFVUUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwbGF5T3JFbnF1ZXVlKFVyaSBjb250ZW50VXJpLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBtZXRhZGF0YSwKLSAgICAgICAgICAgIGxvbmcgcG9zaXRpb25NaWxsaXMsIEJ1bmRsZSBleHRyYXMsCi0gICAgICAgICAgICBmaW5hbCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2ssIFN0cmluZyBhY3Rpb24pIHsKLSAgICAgICAgaWYgKGNvbnRlbnRVcmkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGVudFVyaSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3dJZlJlbW90ZVBsYXliYWNrTm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fRU5RVUVVRSkpIHsKLSAgICAgICAgICAgIHRocm93SWZRdWV1aW5nTm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChhY3Rpb24pOwotICAgICAgICBpbnRlbnQuc2V0RGF0YUFuZFR5cGUoY29udGVudFVyaSwgbWltZVR5cGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiwKLSAgICAgICAgICAgICAgICBtSXRlbVN0YXR1c1BlbmRpbmdJbnRlbnQpOwotICAgICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX01FVEFEQVRBLCBtZXRhZGF0YSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBvc2l0aW9uTWlsbGlzICE9IDApIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OLCBwb3NpdGlvbk1pbGxpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcGVyZm9ybUl0ZW1BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBudWxsLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gc2VlayB0byBhIG5ldyBwb3NpdGlvbiBpbiBhIG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogU2Vla3MgdG8gYSBuZXcgcG9zaXRpb24uICBJZiB0aGUgcXVldWUgd2FzIHByZXZpb3VzbHkgcGF1c2VkIHRoZW4gaXQKLSAgICAgKiByZW1haW5zIHBhdXNlZCBidXQgdGhlIGl0ZW0ncyBuZXcgcG9zaXRpb24gaXMgc3RpbGwgcmVtZW1iZXJlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRUVLIEFDVElPTl9TRUVLfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVtSWQgVGhlIGl0ZW0gaWQuCi0gICAgICogQHBhcmFtIHBvc2l0aW9uTWlsbGlzIFRoZSBuZXcgY29udGVudCBwb3NpdGlvbiBmb3IgdGhlIGl0ZW0gaW4gbWlsbGlzZWNvbmRzLAotICAgICAqIG9yIDxjb2RlPjA8L2NvZGU+IHRvIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcuCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VFS30gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRUVLCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlZWsoU3RyaW5nIGl0ZW1JZCwgbG9uZyBwb3NpdGlvbk1pbGxpcywgQnVuZGxlIGV4dHJhcywKLSAgICAgICAgICAgIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoaXRlbUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW1JZCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NFRUspOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fQ09OVEVOVF9QT1NJVElPTiwgcG9zaXRpb25NaWxsaXMpOwotICAgICAgICBwZXJmb3JtSXRlbUFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGl0ZW1JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TVEFUVVMgQUNUSU9OX0dFVF9TVEFUVVN9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU1RBVFVTfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TVEFUVVMKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2V0U3RhdHVzKFN0cmluZyBpdGVtSWQsIEJ1bmRsZSBleHRyYXMsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoaXRlbUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW1JZCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0dFVF9TVEFUVVMpOwotICAgICAgICBwZXJmb3JtSXRlbUFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGl0ZW1JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHJlbW92ZSBhIG1lZGlhIGl0ZW0gZnJvbSB0aGUgcXVldWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkUgQUNUSU9OX1JFTU9WRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlbUlkIFRoZSBpdGVtIGlkLgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFTU9WRX0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHF1ZXVpbmcuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVNT1ZFCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqIEBzZWUgI2lzUXVldWluZ1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcgaXRlbUlkLCBCdW5kbGUgZXh0cmFzLCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgaWYgKGl0ZW1JZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtSWQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHRocm93SWZRdWV1aW5nTm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9SRU1PVkUpOwotICAgICAgICBwZXJmb3JtSXRlbUFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGl0ZW1JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHBhdXNlIG1lZGlhIHBsYXliYWNrLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLiAgSWYgcGxheWJhY2sgaXMgYWxyZWFkeSBwYXVzZWQKLSAgICAgKiB0aGVuIHRoZSByZXF1ZXN0IGhhcyBubyBlZmZlY3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QQVVTRSBBQ1RJT05fUEFVU0V9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUEFVU0V9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUEFVU0UKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGF1c2UoQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QQVVTRSk7Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHJlc3VtZSAodW5wYXVzZSkgbWVkaWEgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBwbGF5YmFjayBpcyBub3QgcGF1c2VkCi0gICAgICogdGhlbiB0aGUgcmVxdWVzdCBoYXMgbm8gZWZmZWN0LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FIEFDVElPTl9SRVNVTUV9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFU1VNRQotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXN1bWUoQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9SRVNVTUUpOwotICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBzdG9wIG1lZGlhIHBsYXliYWNrIGFuZCBjbGVhciB0aGUgbWVkaWEgcGxheWJhY2sgcXVldWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiB0aGUgcXVldWUgaXMgYWxyZWFkeQotICAgICAqIGVtcHR5IHRoZW4gdGhlIHJlcXVlc3QgaGFzIG5vIGVmZmVjdC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUT1AgQUNUSU9OX1NUT1B9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUH0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVE9QCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TVE9QKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gc3RhcnQgYSBuZXcgbWVkaWEgcGxheWJhY2sgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgYXBwbGljYXRpb24gbXVzdCB3YWl0IGZvciB0aGUgY2FsbGJhY2sgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHJlcXVlc3QKLSAgICAgKiBpcyBjb21wbGV0ZSBiZWZvcmUgaXNzdWluZyBvdGhlciByZXF1ZXN0cyB0aGF0IGFmZmVjdCB0aGUgc2Vzc2lvbi4gIElmIHRoaXMKLSAgICAgKiByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWwgdGhlbiB0aGUgcHJldmlvdXMgc2Vzc2lvbiB3aWxsIGJlIGludmFsaWRhdGVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTiBBQ1RJT05fU1RBUlRfU0VTU0lPTn0KLSAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBzZXNzaW9uIG1hbmFnZW1lbnQuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTgotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKiBAc2VlICNpc1Nlc3Npb25NYW5hZ2VtZW50U3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRTZXNzaW9uKEJ1bmRsZSBleHRyYXMsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICB0aHJvd0lmU2Vzc2lvbk1hbmFnZW1lbnROb3RTdXBwb3J0ZWQoKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NUQVJUX1NFU1NJT04pOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiwKLSAgICAgICAgICAgICAgICBtU2Vzc2lvblN0YXR1c1BlbmRpbmdJbnRlbnQpOwotICAgICAgICBpZiAobVJvdXRlU3VwcG9ydHNNZXNzYWdpbmcpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfTUVTU0FHRV9SRUNFSVZFUiwgbU1lc3NhZ2VQZW5kaW5nSW50ZW50KTsKLSAgICAgICAgfQotICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG51bGwsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgbWVzc2FnZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFTkRfTUVTU0FHRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBBIGJ1bmRsZSBtZXNzYWdlIGRlbm90aW5nIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjRVhUUkFfTUVTU0FHRX0uCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBtZXNzYWdlcy4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRU5EX01FU1NBR0UKLSAgICAgKiBAc2VlICNpc01lc3NhZ2luZ1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKEJ1bmRsZSBtZXNzYWdlLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLSAgICAgICAgdGhyb3dJZk1lc3NhZ2VOb3RTdXBwb3J0ZWQoKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NFTkRfTUVTU0FHRSk7Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgbWVzc2FnZSwgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBnZXQgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgcGxheWJhY2sgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUwotICAgICAqIEFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVN9IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVU30gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHNlc3Npb24gbWFuYWdlbWVudC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICogQHNlZSAjaXNTZXNzaW9uTWFuYWdlbWVudFN1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdldFNlc3Npb25TdGF0dXMoQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZTZXNzaW9uTWFuYWdlbWVudE5vdFN1cHBvcnRlZCgpOwotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gZW5kIHRoZSBtZWRpYSBwbGF5YmFjayBzZXNzaW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLiAgSWYgdGhpcyByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWwsCi0gICAgICogdGhlIHtAbGluayAjZ2V0U2Vzc2lvbklkIHNlc3Npb24gaWQgcHJvcGVydHl9IHdpbGwgYmUgc2V0IHRvIG51bGwgYWZ0ZXIKLSAgICAgKiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OIEFDVElPTl9FTkRfU0VTU0lPTn0KLSAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTkRfU0VTU0lPTn0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHNlc3Npb24gbWFuYWdlbWVudC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTkRfU0VTU0lPTgotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKiBAc2VlICNpc1Nlc3Npb25NYW5hZ2VtZW50U3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kU2Vzc2lvbihCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZlNlc3Npb25NYW5hZ2VtZW50Tm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTkRfU0VTU0lPTik7Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1JdGVtQWN0aW9uKGZpbmFsIEludGVudCBpbnRlbnQsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2Vzc2lvbklkLCBmaW5hbCBTdHJpbmcgaXRlbUlkLAotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcywgZmluYWwgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGludGVudC5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKLSAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQsIHNlc3Npb25JZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0ZW1JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fSUQsIGl0ZW1JZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV4dHJhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmFzKGV4dHJhcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nUmVxdWVzdChpbnRlbnQpOwotICAgICAgICBtUm91dGUuc2VuZENvbnRyb2xSZXF1ZXN0KGludGVudCwgbmV3IE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkUmVzdWx0ID0gaW5mZXJNaXNzaW5nUmVzdWx0KHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCkpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cyA9IE1lZGlhU2Vzc2lvblN0YXR1cy5mcm9tQnVuZGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0QnVuZGxlKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX1NUQVRVUykpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkUmVzdWx0ID0gaW5mZXJNaXNzaW5nUmVzdWx0KGl0ZW1JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9JRCkpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cyA9IE1lZGlhSXRlbVN0YXR1cy5mcm9tQnVuZGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0QnVuZGxlKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX1NUQVRVUykpOwotICAgICAgICAgICAgICAgICAgICBhZG9wdFNlc3Npb24oc2Vzc2lvbklkUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25JZFJlc3VsdCAhPSBudWxsICYmIGl0ZW1JZFJlc3VsdCAhPSBudWxsICYmIGl0ZW1TdGF0dXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgcmVzdWx0IGZyb20gIiArIGludGVudC5nZXRBY3Rpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBkYXRhPSIgKyBidW5kbGVUb1N0cmluZyhkYXRhKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZFJlc3VsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uU3RhdHVzPSIgKyBzZXNzaW9uU3RhdHVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGl0ZW1JZD0iICsgaXRlbUlkUmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGl0ZW1TdGF0dXM9IiArIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25SZXN1bHQoZGF0YSwgc2Vzc2lvbklkUmVzdWx0LCBzZXNzaW9uU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtSWRSZXN1bHQsIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGhhbmRsZUludmFsaWRSZXN1bHQoaW50ZW50LCBjYWxsYmFjaywgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoaW50ZW50LCBjYWxsYmFjaywgZXJyb3IsIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGVyZm9ybVNlc3Npb25BY3Rpb24oZmluYWwgSW50ZW50IGludGVudCwgZmluYWwgU3RyaW5nIHNlc3Npb25JZCwKLSAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMsIGZpbmFsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpbnRlbnQuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyk7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX0lELCBzZXNzaW9uSWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChleHRyYXMgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhcyhleHRyYXMpOwotICAgICAgICB9Ci0gICAgICAgIGxvZ1JlcXVlc3QoaW50ZW50KTsKLSAgICAgICAgbVJvdXRlLnNlbmRDb250cm9sUmVxdWVzdChpbnRlbnQsIG5ldyBNZWRpYVJvdXRlci5Db250cm9sUmVxdWVzdENhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZFJlc3VsdCA9IGluZmVyTWlzc2luZ1Jlc3VsdChzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRTdHJpbmcoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQpKTsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMgPSBNZWRpYVNlc3Npb25TdGF0dXMuZnJvbUJ1bmRsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldEJ1bmRsZShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9TVEFUVVMpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRvcHRTZXNzaW9uKHNlc3Npb25JZFJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uSWRSZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgcmVzdWx0IGZyb20gIiArIGludGVudC5nZXRBY3Rpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBkYXRhPSIgKyBidW5kbGVUb1N0cmluZyhkYXRhKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZFJlc3VsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uU3RhdHVzPSIgKyBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25SZXN1bHQoZGF0YSwgc2Vzc2lvbklkUmVzdWx0LCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTkRfU0VTU0lPTikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHNlc3Npb25JZFJlc3VsdC5lcXVhbHMobVNlc3Npb25JZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2Vzc2lvbklkKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBoYW5kbGVJbnZhbGlkUmVzdWx0KGludGVudCwgY2FsbGJhY2ssIGRhdGEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKGludGVudCwgY2FsbGJhY2ssIGVycm9yLCBkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBhZG9wdFNlc3Npb24oU3RyaW5nIHNlc3Npb25JZCkgewotICAgICAgICBpZiAoc2Vzc2lvbklkICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldFNlc3Npb25JZChzZXNzaW9uSWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBoYW5kbGVJbnZhbGlkUmVzdWx0KEludGVudCBpbnRlbnQsIEFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgTG9nLncoVEFHLCAiUmVjZWl2ZWQgaW52YWxpZCByZXN1bHQgZGF0YSBmcm9tICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkKLSAgICAgICAgICAgICAgICArICI6IGRhdGE9IiArIGJ1bmRsZVRvU3RyaW5nKGRhdGEpKTsKLSAgICAgICAgY2FsbGJhY2sub25FcnJvcihudWxsLCBNZWRpYUNvbnRyb2xJbnRlbnQuRVJST1JfVU5LTk9XTiwgZGF0YSk7Ci0gICAgfQotCi0gICAgdm9pZCBoYW5kbGVFcnJvcihJbnRlbnQgaW50ZW50LCBBY3Rpb25DYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgIFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgZmluYWwgaW50IGNvZGU7Ci0gICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvZGUgPSBkYXRhLmdldEludChNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfRVJST1JfQ09ERSwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sSW50ZW50LkVSUk9SX1VOS05PV04pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29kZSA9IE1lZGlhQ29udHJvbEludGVudC5FUlJPUl9VTktOT1dOOwotICAgICAgICB9Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiUmVjZWl2ZWQgZXJyb3IgZnJvbSAiICsgaW50ZW50LmdldEFjdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICsgIjogZXJyb3I9IiArIGVycm9yCi0gICAgICAgICAgICAgICAgICAgICsgIiwgY29kZT0iICsgY29kZQotICAgICAgICAgICAgICAgICAgICArICIsIGRhdGE9IiArIGJ1bmRsZVRvU3RyaW5nKGRhdGEpKTsKLSAgICAgICAgfQotICAgICAgICBjYWxsYmFjay5vbkVycm9yKGVycm9yLCBjb2RlLCBkYXRhKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGV0ZWN0RmVhdHVyZXMoKSB7Ci0gICAgICAgIG1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2sgPSByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUExBWSkKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU0VFSykKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fR0VUX1NUQVRVUykKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUEFVU0UpCi0gICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1JFU1VNRSkKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU1RPUCk7Ci0gICAgICAgIG1Sb3V0ZVN1cHBvcnRzUXVldWluZyA9IG1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2sKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fRU5RVUVVRSkKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUkVNT1ZFKTsKLSAgICAgICAgbVJvdXRlU3VwcG9ydHNTZXNzaW9uTWFuYWdlbWVudCA9IG1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2sKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU1RBUlRfU0VTU0lPTikKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTkRfU0VTU0lPTik7Ci0gICAgICAgIG1Sb3V0ZVN1cHBvcnRzTWVzc2FnaW5nID0gZG9lc1JvdXRlU3VwcG9ydE1lc3NhZ2luZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiByb3V0ZVN1cHBvcnRzQWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZS5zdXBwb3J0c0NvbnRyb2xBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSywgYWN0aW9uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZG9lc1JvdXRlU3VwcG9ydE1lc3NhZ2luZygpIHsKLSAgICAgICAgZm9yIChJbnRlbnRGaWx0ZXIgZmlsdGVyIDogbVJvdXRlLmdldENvbnRyb2xGaWx0ZXJzKCkpIHsKLSAgICAgICAgICAgIGlmIChmaWx0ZXIuaGFzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU0VORF9NRVNTQUdFKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZlJlbW90ZVBsYXliYWNrTm90U3VwcG9ydGVkKCkgewotICAgICAgICBpZiAoIW1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2spIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcmVtb3RlIHBsYXliYWNrLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93SWZRdWV1aW5nTm90U3VwcG9ydGVkKCkgewotICAgICAgICBpZiAoIW1Sb3V0ZVN1cHBvcnRzUXVldWluZykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBxdWV1aW5nLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93SWZTZXNzaW9uTWFuYWdlbWVudE5vdFN1cHBvcnRlZCgpIHsKLSAgICAgICAgaWYgKCFtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0ICIKLSAgICAgICAgICAgICAgICAgICAgKyAic2Vzc2lvbiBtYW5hZ2VtZW50LiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93SWZNZXNzYWdlTm90U3VwcG9ydGVkKCkgewotICAgICAgICBpZiAoIW1Sb3V0ZVN1cHBvcnRzTWVzc2FnaW5nKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IG1lc3NhZ2UuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKSB7Ci0gICAgICAgIGlmIChtU2Vzc2lvbklkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgaW5mZXJNaXNzaW5nUmVzdWx0KFN0cmluZyByZXF1ZXN0LCBTdHJpbmcgcmVzdWx0KSB7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gUmVzdWx0IGlzIG1pc3NpbmcuCi0gICAgICAgICAgICByZXR1cm4gcmVxdWVzdDsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsIHx8IHJlcXVlc3QuZXF1YWxzKHJlc3VsdCkpIHsKLSAgICAgICAgICAgIC8vIFJlcXVlc3QgZGlkbid0IHNwZWNpZnkgYSB2YWx1ZSBvciByZXN1bHQgbWF0Y2hlcyByZXF1ZXN0LgotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICAvLyBSZXN1bHQgY29uZmxpY3RzIHdpdGggcmVxdWVzdC4KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dSZXF1ZXN0KEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJTZW5kaW5nIHJlcXVlc3Q6ICIgKyBpbnRlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBidW5kbGVUb1N0cmluZyhCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVuZGxlLnNpemUoKTsgLy8gZm9yY2UgYnVuZGxlIHRvIGJlIHVucGFyY2VsbGVkCi0gICAgICAgICAgICByZXR1cm4gYnVuZGxlLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICJudWxsIjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEFjdGlvblJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSVRFTV9TVEFUVVNfQ0hBTkdFRCA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5hY3Rpb25zLkFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NFU1NJT05fU1RBVFVTX0NIQU5HRUQgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuYWN0aW9ucy5BQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9NRVNTQUdFX1JFQ0VJVkVEID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLmFjdGlvbnMuQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQiOwotCi0gICAgICAgIEFjdGlvblJlY2VpdmVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQpOwotICAgICAgICAgICAgaWYgKHNlc3Npb25JZCA9PSBudWxsIHx8ICFzZXNzaW9uSWQuZXF1YWxzKG1TZXNzaW9uSWQpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGlzY2FyZGluZyBzcHVyaW91cyBzdGF0dXMgY2FsbGJhY2sgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAid2l0aCBtaXNzaW5nIG9yIGludmFsaWQgc2Vzc2lvbiBpZDogc2Vzc2lvbklkPSIgKyBzZXNzaW9uSWQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMgPSBNZWRpYVNlc3Npb25TdGF0dXMuZnJvbUJ1bmRsZSgKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldEJ1bmRsZUV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX1NUQVRVUykpOwotICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKEFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fSUQpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjYXJkaW5nIHNwdXJpb3VzIHN0YXR1cyBjYWxsYmFjayB3aXRoIG1pc3NpbmcgaXRlbSBpZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzID0gTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0QnVuZGxlRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fU1RBVFVTKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW1TdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjYXJkaW5nIHNwdXJpb3VzIHN0YXR1cyBjYWxsYmFjayB3aXRoIG1pc3NpbmcgaXRlbSBzdGF0dXMuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgaXRlbSBzdGF0dXMgY2FsbGJhY2s6IHNlc3Npb25JZD0iICsgc2Vzc2lvbklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uU3RhdHVzPSIgKyBzZXNzaW9uU3RhdHVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpdGVtSWQ9IiArIGl0ZW1JZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaXRlbVN0YXR1cz0iICsgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1TdGF0dXNDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0dXNDYWxsYmFjay5vbkl0ZW1TdGF0dXNDaGFuZ2VkKGludGVudC5nZXRFeHRyYXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMsIGl0ZW1JZCwgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEFDVElPTl9TRVNTSU9OX1NUQVRVU19DSEFOR0VEKSkgewotICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uU3RhdHVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGlzY2FyZGluZyBzcHVyaW91cyBtZWRpYSBzdGF0dXMgY2FsbGJhY2sgd2l0aCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJtaXNzaW5nIHNlc3Npb24gc3RhdHVzLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlY2VpdmVkIHNlc3Npb24gc3RhdHVzIGNhbGxiYWNrOiBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc2Vzc2lvblN0YXR1cz0iICsgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1TdGF0dXNDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0dXNDYWxsYmFjay5vblNlc3Npb25TdGF0dXNDaGFuZ2VkKGludGVudC5nZXRFeHRyYXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhBQ1RJT05fTUVTU0FHRV9SRUNFSVZFRCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgbWVzc2FnZSBjYWxsYmFjazogc2Vzc2lvbklkPSIgKyBzZXNzaW9uSWQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Pbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyLm9uTWVzc2FnZVJlY2VpdmVkKHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0QnVuZGxlRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX01FU1NBR0UpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGNhbGxiYWNrIHRoYXQgd2lsbCByZWNlaXZlIG1lZGlhIHN0YXR1cyB1cGRhdGVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU3RhdHVzQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN0YXR1cyBvZiBhIG1lZGlhIGl0ZW0gY2hhbmdlcy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIHJlc3VsdCBkYXRhIGJ1bmRsZS4KLSAgICAgICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBpZC4KLSAgICAgICAgICogQHBhcmFtIHNlc3Npb25TdGF0dXMgVGhlIHNlc3Npb24gc3RhdHVzLCBvciBudWxsIGlmIHVua25vd24uCi0gICAgICAgICAqIEBwYXJhbSBpdGVtSWQgVGhlIGl0ZW0gaWQuCi0gICAgICAgICAqIEBwYXJhbSBpdGVtU3RhdHVzIFRoZSBpdGVtIHN0YXR1cy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVN0YXR1c0NoYW5nZWQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGEgbWVkaWEgc2Vzc2lvbiBjaGFuZ2VzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmVzdWx0IGRhdGEgYnVuZGxlLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIGlkLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXR1cyBUaGUgc2Vzc2lvbiBzdGF0dXMsIG9yIG51bGwgaWYgdW5rbm93bi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2Vzc2lvblN0YXR1c0NoYW5nZWQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc2Vzc2lvbiBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIGNsaWVudCBjaGFuZ2VzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBuZXcgc2Vzc2lvbiBpZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2Vzc2lvbkNoYW5nZWQoU3RyaW5nIHNlc3Npb25JZCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmFzZSBjYWxsYmFjayB0eXBlIGZvciByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBY3Rpb25DYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIGNvbnRyb2wgcmVxdWVzdCBmYWlscy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGVycm9yIEEgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2Ugd2hpY2ggbWF5IGJlIHNob3duIHRvIHRoZSB1c2VyLCBvciBudWxsCi0gICAgICAgICAqIGlmIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgaXMgdW5jbGVhci4KLSAgICAgICAgICogQHBhcmFtIGNvZGUgVGhlIGVycm9yIGNvZGUsIG9yIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjRVJST1JfVU5LTk9XTn0gaWYgdW5rbm93bi4KLSAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIGVycm9yIGRhdGEgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgaW50IGNvZGUsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFjayBmb3IgcmVtb3RlIHBsYXliYWNrIHJlcXVlc3RzIHRoYXQgb3BlcmF0ZSBvbiBpdGVtcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEl0ZW1BY3Rpb25DYWxsYmFjayBleHRlbmRzIEFjdGlvbkNhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSByZXF1ZXN0IHN1Y2NlZWRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmVzdWx0IGRhdGEgYnVuZGxlLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIGlkLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXR1cyBUaGUgc2Vzc2lvbiBzdGF0dXMsIG9yIG51bGwgaWYgdW5rbm93bi4KLSAgICAgICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KLSAgICAgICAgICogQHBhcmFtIGl0ZW1TdGF0dXMgVGhlIGl0ZW0gc3RhdHVzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAotICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQsIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFjayBmb3IgcmVtb3RlIHBsYXliYWNrIHJlcXVlc3RzIHRoYXQgb3BlcmF0ZSBvbiBzZXNzaW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFNlc3Npb25BY3Rpb25DYWxsYmFjayBleHRlbmRzIEFjdGlvbkNhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSByZXF1ZXN0IHN1Y2NlZWRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmVzdWx0IGRhdGEgYnVuZGxlLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIGlkLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXR1cyBUaGUgc2Vzc2lvbiBzdGF0dXMsIG9yIG51bGwgaWYgdW5rbm93bi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLCBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBjYWxsYmFjayB0aGF0IHdpbGwgcmVjZWl2ZSBtZXNzYWdlcyBmcm9tIG1lZGlhIHNlc3Npb25zLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lc3NhZ2UgcmVjZWl2ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCi0gICAgICAgICAqIEBwYXJhbSBtZXNzYWdlIEEgYnVuZGxlIG1lc3NhZ2UgZGVub3Rpbmcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9NRVNTQUdFfS4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoU3RyaW5nIHNlc3Npb25JZCwgQnVuZGxlIG1lc3NhZ2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9TeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9TeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM4NDkxZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlJlcXVpcmVzQXBpOwotaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoqCi0gKiBQcm92aWRlcyByb3V0ZXMgZm9yIGJ1aWx0LWluIHN5c3RlbSBkZXN0aW5hdGlvbnMgc3VjaCBhcyB0aGUgbG9jYWwgZGlzcGxheQotICogYW5kIHNwZWFrZXIuICBPbiBKZWxseWJlYW4gYW5kIG5ld2VyIHBsYXRmb3JtIHJlbGVhc2VzLCBxdWVyaWVzIHRoZSBmcmFtZXdvcmsKLSAqIE1lZGlhUm91dGVyIGZvciBmcmFtZXdvcmstcHJvdmlkZWQgcm91dGVzIGFuZCByZWdpc3RlcnMgbm9uLWZyYW1ld29yay1wcm92aWRlZAotICogcm91dGVzIGFzIHVzZXIgcm91dGVzLgotICovCi1hYnN0cmFjdCBjbGFzcyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIgZXh0ZW5kcyBNZWRpYVJvdXRlUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfTkFNRSA9ICJhbmRyb2lkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JPVVRFX0lEID0gIkRFRkFVTFRfUk9VVEUiOwotCi0gICAgcHJvdGVjdGVkIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgbmV3IFByb3ZpZGVyTWV0YWRhdGEobmV3IENvbXBvbmVudE5hbWUoUEFDS0FHRV9OQU1FLAotICAgICAgICAgICAgICAgIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5jbGFzcy5nZXROYW1lKCkpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIgb2J0YWluKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgewotICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDI0KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFwaTI0SW1wbChjb250ZXh0LCBzeW5jQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSmVsbHliZWFuTXIySW1wbChjb250ZXh0LCBzeW5jQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTcpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSmVsbHliZWFuTXIxSW1wbChjb250ZXh0LCBzeW5jQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTYpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSmVsbHliZWFuSW1wbChjb250ZXh0LCBzeW5jQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTGVnYWN5SW1wbChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB3aGVuIGEgcm91dGUgaXMgYWRkZWQgdG8gc3luY2hyb25pemUgc3RhdGUgd2l0aAotICAgICAqIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlQWRkZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgd2hlbiBhIHJvdXRlIGlzIHJlbW92ZWQgdG8gc3luY2hyb25pemUgc3RhdGUgd2l0aAotICAgICAqIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlUmVtb3ZlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB3aGVuIGEgcm91dGUgaXMgY2hhbmdlZCB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoCi0gICAgICogdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gYSByb3V0ZSBpcyBzZWxlY3RlZCB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoCi0gICAgICogdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVTZWxlY3RlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFja3MgaW50byB0aGUgbWVkaWEgcm91dGVyIHRvIHN5bmNocm9uaXplIHN0YXRlIHdpdGggdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBTeW5jQ2FsbGJhY2sgewotICAgICAgICB2b2lkIG9uU3lzdGVtUm91dGVTZWxlY3RlZEJ5RGVzY3JpcHRvcklkKFN0cmluZyBpZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0U3lzdGVtUm91dGUoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExlZ2FjeSBpbXBsZW1lbnRhdGlvbiBmb3IgcGxhdGZvcm0gdmVyc2lvbnMgcHJpb3IgdG8gSmVsbHliZWFuLgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBMZWdhY3lJbXBsIGV4dGVuZHMgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyIHsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVFJFQU0gPSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IENPTlRST0xfRklMVEVSUzsKLSAgICAgICAgc3RhdGljIHsKLSAgICAgICAgICAgIEludGVudEZpbHRlciBmID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICAgICAgZi5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTyk7Ci0gICAgICAgICAgICBmLmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKLQotICAgICAgICAgICAgQ09OVFJPTF9GSUxURVJTID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KCk7Ci0gICAgICAgICAgICBDT05UUk9MX0ZJTFRFUlMuYWRkKGYpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgVm9sdW1lQ2hhbmdlUmVjZWl2ZXIgbVZvbHVtZUNoYW5nZVJlY2VpdmVyOwotICAgICAgICBpbnQgbUxhc3RSZXBvcnRlZFZvbHVtZSA9IC0xOwotCi0gICAgICAgIHB1YmxpYyBMZWdhY3lJbXBsKENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBtQXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKLSAgICAgICAgICAgIG1Wb2x1bWVDaGFuZ2VSZWNlaXZlciA9IG5ldyBWb2x1bWVDaGFuZ2VSZWNlaXZlcigpOwotCi0gICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVZvbHVtZUNoYW5nZVJlY2VpdmVyLAotICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50RmlsdGVyKFZvbHVtZUNoYW5nZVJlY2VpdmVyLlZPTFVNRV9DSEFOR0VEX0FDVElPTikpOwotICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBwdWJsaXNoUm91dGVzKCkgewotICAgICAgICAgICAgUmVzb3VyY2VzIHIgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICBpbnQgbWF4Vm9sdW1lID0gbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1NYXhWb2x1bWUoUExBWUJBQ0tfU1RSRUFNKTsKLSAgICAgICAgICAgIG1MYXN0UmVwb3J0ZWRWb2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShQTEFZQkFDS19TVFJFQU0pOwotICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IgZGVmYXVsdFJvdXRlID0gbmV3IE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUk9VVEVfSUQsIHIuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX3N5c3RlbV9yb3V0ZV9uYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZENvbnRyb2xGaWx0ZXJzKENPTlRST0xfRklMVEVSUykKLSAgICAgICAgICAgICAgICAgICAgLnNldFBsYXliYWNrU3RyZWFtKFBMQVlCQUNLX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgLnNldFBsYXliYWNrVHlwZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVFlQRV9MT0NBTCkKLSAgICAgICAgICAgICAgICAgICAgLnNldFZvbHVtZUhhbmRsaW5nKE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfVkFSSUFCTEUpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRWb2x1bWVNYXgobWF4Vm9sdW1lKQotICAgICAgICAgICAgICAgICAgICAuc2V0Vm9sdW1lKG1MYXN0UmVwb3J0ZWRWb2x1bWUpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotCi0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIHByb3ZpZGVyRGVzY3JpcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAuYWRkUm91dGUoZGVmYXVsdFJvdXRlKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgIHNldERlc2NyaXB0b3IocHJvdmlkZXJEZXNjcmlwdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkKSB7Ci0gICAgICAgICAgICBpZiAocm91dGVJZC5lcXVhbHMoREVGQVVMVF9ST1VURV9JRCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRSb3V0ZUNvbnRyb2xsZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgY2xhc3MgRGVmYXVsdFJvdXRlQ29udHJvbGxlciBleHRlbmRzIFJvdXRlQ29udHJvbGxlciB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShQTEFZQkFDS19TVFJFQU0sIHZvbHVtZSwgMCk7Ci0gICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVXBkYXRlVm9sdW1lKGludCBkZWx0YSkgewotICAgICAgICAgICAgICAgIGludCB2b2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShQTEFZQkFDS19TVFJFQU0pOwotICAgICAgICAgICAgICAgIGludCBtYXhWb2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbU1heFZvbHVtZShQTEFZQkFDS19TVFJFQU0pOwotICAgICAgICAgICAgICAgIGludCBuZXdWb2x1bWUgPSBNYXRoLm1pbihtYXhWb2x1bWUsIE1hdGgubWF4KDAsIHZvbHVtZSArIGRlbHRhKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1ZvbHVtZSAhPSB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoUExBWUJBQ0tfU1RSRUFNLCB2b2x1bWUsIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBjbGFzcyBWb2x1bWVDaGFuZ2VSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKLSAgICAgICAgICAgIC8vIFRoZXNlIGNvbnN0YW50cyBjb21lIGZyb20gQXVkaW9NYW5hZ2VyLgotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9MVU1FX0NIQU5HRURfQUNUSU9OID0KLSAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuVk9MVU1FX0NIQU5HRURfQUNUSU9OIjsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1ZPTFVNRV9TVFJFQU1fVFlQRSA9Ci0gICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLkVYVFJBX1ZPTFVNRV9TVFJFQU1fVFlQRSI7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9WT0xVTUVfU1RSRUFNX1ZBTFVFID0KLSAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuRVhUUkFfVk9MVU1FX1NUUkVBTV9WQUxVRSI7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFZPTFVNRV9DSEFOR0VEX0FDVElPTikpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHN0cmVhbVR5cGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoRVhUUkFfVk9MVU1FX1NUUkVBTV9UWVBFLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1UeXBlID09IFBMQVlCQUNLX1NUUkVBTSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHZvbHVtZSA9IGludGVudC5nZXRJbnRFeHRyYShFWFRSQV9WT0xVTUVfU1RSRUFNX1ZBTFVFLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9sdW1lID49IDAgJiYgdm9sdW1lICE9IG1MYXN0UmVwb3J0ZWRWb2x1bWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKZWxseWJlYW4gaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgLy8gQEBSZXF1aXJlc0FwaSgxNikKLSAgICBzdGF0aWMgY2xhc3MgSmVsbHliZWFuSW1wbCBleHRlbmRzIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlcgotICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYVJvdXRlckplbGx5YmVhbi5DYWxsYmFjaywgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVm9sdW1lQ2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPiBMSVZFX0FVRElPX0NPTlRST0xfRklMVEVSUzsKLSAgICAgICAgc3RhdGljIHsKLSAgICAgICAgICAgIEludGVudEZpbHRlciBmID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICAgICAgZi5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTyk7Ci0KLSAgICAgICAgICAgIExJVkVfQVVESU9fQ09OVFJPTF9GSUxURVJTID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KCk7Ci0gICAgICAgICAgICBMSVZFX0FVRElPX0NPTlRST0xfRklMVEVSUy5hZGQoZik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPiBMSVZFX1ZJREVPX0NPTlRST0xfRklMVEVSUzsKLSAgICAgICAgc3RhdGljIHsKLSAgICAgICAgICAgIEludGVudEZpbHRlciBmID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICAgICAgZi5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTyk7Ci0KLSAgICAgICAgICAgIExJVkVfVklERU9fQ09OVFJPTF9GSUxURVJTID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KCk7Ci0gICAgICAgICAgICBMSVZFX1ZJREVPX0NPTlRST0xfRklMVEVSUy5hZGQoZik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGZpbmFsIFN5bmNDYWxsYmFjayBtU3luY0NhbGxiYWNrOwotCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbVJvdXRlck9iajsKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtQ2FsbGJhY2tPYmo7Ci0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbVZvbHVtZUNhbGxiYWNrT2JqOwotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IG1Vc2VyUm91dGVDYXRlZ29yeU9iajsKLSAgICAgICAgcHJvdGVjdGVkIGludCBtUm91dGVUeXBlczsKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUFjdGl2ZVNjYW47Ci0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIG1DYWxsYmFja1JlZ2lzdGVyZWQ7Ci0KLSAgICAgICAgLy8gTWFpbnRhaW5zIGFuIGFzc29jaWF0aW9uIGZyb20gZnJhbWV3b3JrIHJvdXRlcyB0byBzdXBwb3J0IGxpYnJhcnkgcm91dGVzLgotICAgICAgICAvLyBOb3RlIHRoYXQgd2UgY2Fubm90IHVzZSB0aGUgdGFnIGZpZWxkIGZvciB0aGlzIGJlY2F1c2UgYW4gYXBwbGljYXRpb24gbWF5Ci0gICAgICAgIC8vIGhhdmUgcHVibGlzaGVkIGl0cyBvd24gdXNlciByb3V0ZXMgdG8gdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIgYW5kIGFscmVhZHkKLSAgICAgICAgLy8gdXNlZCB0aGUgdGFnIGZvciBpdHMgb3duIHB1cnBvc2VzLgotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQXJyYXlMaXN0PFN5c3RlbVJvdXRlUmVjb3JkPiBtU3lzdGVtUm91dGVSZWNvcmRzID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFN5c3RlbVJvdXRlUmVjb3JkPigpOwotCi0gICAgICAgIC8vIE1haW50YWlucyBhbiBhc3NvY2lhdGlvbiBmcm9tIHN1cHBvcnQgbGlicmFyeSByb3V0ZXMgdG8gZnJhbWV3b3JrIHJvdXRlcy4KLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEFycmF5TGlzdDxVc2VyUm91dGVSZWNvcmQ+IG1Vc2VyUm91dGVSZWNvcmRzID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFVzZXJSb3V0ZVJlY29yZD4oKTsKLQotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVySmVsbHliZWFuLlNlbGVjdFJvdXRlV29ya2Fyb3VuZCBtU2VsZWN0Um91dGVXb3JrYXJvdW5kOwotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVySmVsbHliZWFuLkdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQgbUdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQ7Ci0KLSAgICAgICAgcHVibGljIEplbGx5YmVhbkltcGwoQ29udGV4dCBjb250ZXh0LCBTeW5jQ2FsbGJhY2sgc3luY0NhbGxiYWNrKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1TeW5jQ2FsbGJhY2sgPSBzeW5jQ2FsbGJhY2s7Ci0gICAgICAgICAgICBtUm91dGVyT2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0TWVkaWFSb3V0ZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tPYmogPSBjcmVhdGVDYWxsYmFja09iaigpOwotICAgICAgICAgICAgbVZvbHVtZUNhbGxiYWNrT2JqID0gY3JlYXRlVm9sdW1lQ2FsbGJhY2tPYmooKTsKLQotICAgICAgICAgICAgUmVzb3VyY2VzIHIgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpOwotICAgICAgICAgICAgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlUm91dGVDYXRlZ29yeSgKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlck9iaiwgci5nZXRTdHJpbmcoUi5zdHJpbmcubXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lKSwgZmFsc2UpOwotCi0gICAgICAgICAgICB1cGRhdGVTeXN0ZW1Sb3V0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChyb3V0ZUlkKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3lzdGVtUm91dGVDb250cm9sbGVyKHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgICAgICBpbnQgbmV3Um91dGVUeXBlcyA9IDA7Ci0gICAgICAgICAgICBib29sZWFuIG5ld0FjdGl2ZVNjYW4gPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IgPSByZXF1ZXN0LmdldFNlbGVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGNhdGVnb3JpZXMgPSBzZWxlY3Rvci5nZXRDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGNhdGVnb3JpZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2F0ZWdvcnkgPSBjYXRlZ29yaWVzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNhdGVnb3J5LmVxdWFscyhNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JvdXRlVHlwZXMgfD0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX0FVRElPOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNhdGVnb3J5LmVxdWFscyhNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JvdXRlVHlwZXMgfD0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX1ZJREVPOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um91dGVUeXBlcyB8PSBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX1VTRVI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV3QWN0aXZlU2NhbiA9IHJlcXVlc3QuaXNBY3RpdmVTY2FuKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtUm91dGVUeXBlcyAhPSBuZXdSb3V0ZVR5cGVzIHx8IG1BY3RpdmVTY2FuICE9IG5ld0FjdGl2ZVNjYW4pIHsKLSAgICAgICAgICAgICAgICBtUm91dGVUeXBlcyA9IG5ld1JvdXRlVHlwZXM7Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZVNjYW4gPSBuZXdBY3RpdmVTY2FuOwotICAgICAgICAgICAgICAgIHVwZGF0ZVN5c3RlbVJvdXRlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChhZGRTeXN0ZW1Sb3V0ZU5vUHVibGlzaChyb3V0ZU9iaikpIHsKLSAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3lzdGVtUm91dGVzKCkgewotICAgICAgICAgICAgdXBkYXRlQ2FsbGJhY2soKTsKLSAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChPYmplY3Qgcm91dGVPYmogOiBNZWRpYVJvdXRlckplbGx5YmVhbi5nZXRSb3V0ZXMobVJvdXRlck9iaikpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VkIHw9IGFkZFN5c3RlbVJvdXRlTm9QdWJsaXNoKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGFkZFN5c3RlbVJvdXRlTm9QdWJsaXNoKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaikgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopIDwgMCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IGFzc2lnblJvdXRlSWQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG5ldyBTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaiwgaWQpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVN5c3RlbVJvdXRlRGVzY3JpcHRvcihyZWNvcmQpOwotICAgICAgICAgICAgICAgIG1TeXN0ZW1Sb3V0ZVJlY29yZHMuYWRkKHJlY29yZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBhc3NpZ25Sb3V0ZUlkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgLy8gVE9ETzogVGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIgc2hvdWxkIHN1cHBseSBhIHVuaXF1ZSByb3V0ZSBpZCB0aGF0Ci0gICAgICAgICAgICAvLyB3ZSBjYW4gdXNlIGhlcmUuICBGb3Igbm93IHdlIHVzZSBhIGhhc2ggb2YgdGhlIHJvdXRlIG5hbWUgYW5kIHRha2UgY2FyZQotICAgICAgICAgICAgLy8gdG8gZGVkdXBlIGl0LgotICAgICAgICAgICAgYm9vbGVhbiBpc0RlZmF1bHQgPSAoZ2V0RGVmYXVsdFJvdXRlKCkgPT0gcm91dGVPYmopOwotICAgICAgICAgICAgU3RyaW5nIGlkID0gaXNEZWZhdWx0ID8gREVGQVVMVF9ST1VURV9JRCA6Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoTG9jYWxlLlVTLCAiUk9VVEVfJTA4eCIsIGdldFJvdXRlTmFtZShyb3V0ZU9iaikuaGFzaENvZGUoKSk7Ci0gICAgICAgICAgICBpZiAoZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQoaWQpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAyOyA7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBuZXdJZCA9IFN0cmluZy5mb3JtYXQoTG9jYWxlLlVTLCAiJXNfJWQiLCBpZCwgaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKG5ld0lkKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0lkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Sb3V0ZVJlY29yZHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCk7Ci0gICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVZvbHVtZUNoYW5nZWQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBuZXdWb2x1bWUgPSBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0Vm9sdW1lKHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZvbHVtZSAhPSByZWNvcmQubVJvdXRlRGVzY3JpcHRvci5nZXRWb2x1bWUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3IgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlcihyZWNvcmQubVJvdXRlRGVzY3JpcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZvbHVtZShuZXdWb2x1bWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChpbnQgdHlwZSwgT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpZiAocm91dGVPYmogIT0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0U2VsZWN0ZWRSb3V0ZShtUm91dGVyT2JqLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5BTExfUk9VVEVfVFlQRVMpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZSBoYXMgYWxyZWFkeSBjaGFuZ2VkIHNvIHRoaXMgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICAvLyBpcyBzdGFsZS4gIERyb3AgaXQgdG8gcHJldmVudCBnZXR0aW5nIGludG8gc3luYyBsb29wcy4KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCB1c2VyUm91dGVSZWNvcmQgPSBnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgaWYgKHVzZXJSb3V0ZVJlY29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdXNlclJvdXRlUmVjb3JkLm1Sb3V0ZS5zZWxlY3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gU2VsZWN0IHRoZSByb3V0ZSBpZiBpdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY29tcGF0IG1lZGlhIHJvdXRlci4KLSAgICAgICAgICAgICAgICAvLyBJZiBub3QsIHdlIHdpbGwgc2VsZWN0IGl0IGluc3RlYWQgd2hlbiB0aGUgcm91dGUgaXMgYWRkZWQuCi0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIG1TeW5jQ2FsbGJhY2sub25TeXN0ZW1Sb3V0ZVNlbGVjdGVkQnlEZXNjcmlwdG9ySWQocmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3JJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKGludCB0eXBlLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gd2hlbiBhIHJvdXRlIGlzIHVuc2VsZWN0ZWQuCi0gICAgICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHdoZW4gYSByb3V0ZSBpcyBzZWxlY3RlZC4KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlR3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaiwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICAvLyBSb3V0ZSBncm91cGluZyBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbmdyb3VwZWQoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgZ3JvdXBPYmopIHsKLSAgICAgICAgICAgIC8vIFJvdXRlIGdyb3VwaW5nIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZSkgewotICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHJlY29yZCA9IGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICBpZiAocmVjb3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlLnJlcXVlc3RTZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVVwZGF0ZVJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChyZWNvcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGUucmVxdWVzdFVwZGF0ZVZvbHVtZShkaXJlY3Rpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlQWRkZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpICE9IHRoaXMpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgcm91dGVPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVVc2VyUm91dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCBtVXNlclJvdXRlQ2F0ZWdvcnlPYmopOwotICAgICAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBuZXcgVXNlclJvdXRlUmVjb3JkKHJvdXRlLCByb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLnNldFRhZyhyb3V0ZU9iaiwgcmVjb3JkKTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZUNhbGxiYWNrKHJvdXRlT2JqLCBtVm9sdW1lQ2FsbGJhY2tPYmopOwotICAgICAgICAgICAgICAgIHVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMocmVjb3JkKTsKLSAgICAgICAgICAgICAgICBtVXNlclJvdXRlUmVjb3Jkcy5hZGQocmVjb3JkKTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5hZGRVc2VyUm91dGUobVJvdXRlck9iaiwgcm91dGVPYmopOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbmV3bHkgYWRkZWQgcm91dGUgaXMgdGhlIGNvdW50ZXJwYXJ0IG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKLSAgICAgICAgICAgICAgICAvLyByb3V0ZSBpbiB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlciB0aGVuIGVuc3VyZSBpdCBpcyBzZWxlY3RlZCBpbgotICAgICAgICAgICAgICAgIC8vIHRoZSBjb21wYXQgbWVkaWEgcm91dGVyLgotICAgICAgICAgICAgICAgIE9iamVjdCByb3V0ZU9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmdldFNlbGVjdGVkUm91dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCBNZWRpYVJvdXRlckplbGx5YmVhbi5BTExfUk9VVEVfVFlQRVMpOwotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3JJZC5lcXVhbHMocm91dGUuZ2V0RGVzY3JpcHRvcklkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5zZWxlY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpICE9IHRoaXMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kVXNlclJvdXRlUmVjb3JkKHJvdXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gbVVzZXJSb3V0ZVJlY29yZHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLnNldFRhZyhyZWNvcmQubVJvdXRlT2JqLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVDYWxsYmFjayhyZWNvcmQubVJvdXRlT2JqLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4ucmVtb3ZlVXNlclJvdXRlKG1Sb3V0ZXJPYmosIHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpICE9IHRoaXMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kVXNlclJvdXRlUmVjb3JkKHJvdXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gbVVzZXJSb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhyZWNvcmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgaWYgKCFyb3V0ZS5pc1NlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGhhcyBhbHJlYWR5IGNoYW5nZWQgc28gdGhpcyBjYWxsYmFjawotICAgICAgICAgICAgICAgIC8vIGlzIHN0YWxlLiAgRHJvcCBpdCB0byBwcmV2ZW50IGdldHRpbmcgaW50byBzeW5jIGxvb3BzLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKSAhPSB0aGlzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFVzZXJSb3V0ZVJlY29yZChyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHJlY29yZCA9IG1Vc2VyUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdFJvdXRlKHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQocm91dGUuZ2V0RGVzY3JpcHRvcklkKCkpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0Um91dGUocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHVibGlzaFJvdXRlcygpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlcigpOwotICAgICAgICAgICAgaW50IGNvdW50ID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFJvdXRlKG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGkpLm1Sb3V0ZURlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXREZXNjcmlwdG9yKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgaW50IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGkpLm1Sb3V0ZU9iaiA9PSByb3V0ZU9iaikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgaW50IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKFN0cmluZyBpZCkgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaSkubVJvdXRlRGVzY3JpcHRvcklkLmVxdWFscyhpZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIGludCBmaW5kVXNlclJvdXRlUmVjb3JkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVVzZXJSb3V0ZVJlY29yZHMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Vc2VyUm91dGVSZWNvcmRzLmdldChpKS5tUm91dGUgPT0gcm91dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFVzZXJSb3V0ZVJlY29yZCBnZXRVc2VyUm91dGVSZWNvcmQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBPYmplY3QgdGFnID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFRhZyhyb3V0ZU9iaik7Ci0gICAgICAgICAgICByZXR1cm4gdGFnIGluc3RhbmNlb2YgVXNlclJvdXRlUmVjb3JkID8gKFVzZXJSb3V0ZVJlY29yZCl0YWcgOiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCkgewotICAgICAgICAgICAgLy8gV2UgbXVzdCBhbHdheXMgcmVjcmVhdGUgdGhlIHJvdXRlIGRlc2NyaXB0b3Igd2hlbiBtYWtpbmcgYW55IGNoYW5nZXMKLSAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhleSBhcmUgaW50ZW5kZWQgdG8gYmUgaW1tdXRhYmxlIG9uY2UgcHVibGlzaGVkLgotICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyID0gbmV3IE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVEZXNjcmlwdG9ySWQsIGdldFJvdXRlTmFtZShyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCwgYnVpbGRlcik7Ci0gICAgICAgICAgICByZWNvcmQubVJvdXRlRGVzY3JpcHRvciA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Um91dGVOYW1lKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgLy8gUm91dGVzIHNob3VsZCBub3QgaGF2ZSBudWxsIG5hbWVzIGJ1dCBpdCBtYXkgaGFwcGVuIGZvciBiYWRseSBjb25maWd1cmVkCi0gICAgICAgICAgICAvLyB1c2VyIHJvdXRlcy4gIFdlIHRvbGVyYXRlIHRoaXMgYnkgdXNpbmcgYW4gZW1wdHkgbmFtZSBzdHJpbmcgaGVyZSBidXQKLSAgICAgICAgICAgIC8vIHN1Y2ggdW5uYW1lZCByb3V0ZXMgd2lsbCBiZSBkaXNjYXJkZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB1cHN0cmVhbQotICAgICAgICAgICAgLy8gKHdpdGggYSBsb2cgbWVzc2FnZSBzbyB3ZSBjYW4gdHJhY2sgZG93biB0aGUgcHJvYmxlbSkuCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgbmFtZSA9IE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXROYW1lKHJvdXRlT2JqLCBnZXRDb250ZXh0KCkpOwotICAgICAgICAgICAgcmV0dXJuIG5hbWUgIT0gbnVsbCA/IG5hbWUudG9TdHJpbmcoKSA6ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgICAgICBpbnQgc3VwcG9ydGVkVHlwZXMgPSBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0U3VwcG9ydGVkVHlwZXMoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgaWYgKChzdXBwb3J0ZWRUeXBlcyAmIE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9BVURJTykgIT0gMCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbEZpbHRlcnMoTElWRV9BVURJT19DT05UUk9MX0ZJTFRFUlMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChzdXBwb3J0ZWRUeXBlcyAmIE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9WSURFTykgIT0gMCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbEZpbHRlcnMoTElWRV9WSURFT19DT05UUk9MX0ZJTFRFUlMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBidWlsZGVyLnNldFBsYXliYWNrVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFBsYXliYWNrVHlwZShyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFBsYXliYWNrU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0UGxheWJhY2tTdHJlYW0ocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRWb2x1bWUoCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRWb2x1bWUocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRWb2x1bWVNYXgoCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRWb2x1bWVNYXgocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRWb2x1bWVIYW5kbGluZygKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFZvbHVtZUhhbmRsaW5nKHJlY29yZC5tUm91dGVPYmopKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMoVXNlclJvdXRlUmVjb3JkIHJlY29yZCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXROYW1lKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFBsYXliYWNrVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRQbGF5YmFja1R5cGUoKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFBsYXliYWNrU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldFBsYXliYWNrU3RyZWFtKCkpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWUoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0Vm9sdW1lKCkpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVNYXgoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0Vm9sdW1lTWF4KCkpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVIYW5kbGluZygKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRWb2x1bWVIYW5kbGluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNhbGxiYWNrKCkgewotICAgICAgICAgICAgaWYgKG1DYWxsYmFja1JlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tSZWdpc3RlcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4ucmVtb3ZlQ2FsbGJhY2sobVJvdXRlck9iaiwgbUNhbGxiYWNrT2JqKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Sb3V0ZVR5cGVzICE9IDApIHsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tSZWdpc3RlcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5hZGRDYWxsYmFjayhtUm91dGVyT2JqLCBtUm91dGVUeXBlcywgbUNhbGxiYWNrT2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlQ2FsbGJhY2tPYmooKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlQ2FsbGJhY2sodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVZvbHVtZUNhbGxiYWNrT2JqKCkgewotICAgICAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVZvbHVtZUNhbGxiYWNrKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2VsZWN0Um91dGUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdFJvdXRlV29ya2Fyb3VuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdFJvdXRlV29ya2Fyb3VuZCA9IG5ldyBNZWRpYVJvdXRlckplbGx5YmVhbi5TZWxlY3RSb3V0ZVdvcmthcm91bmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TZWxlY3RSb3V0ZVdvcmthcm91bmQuc2VsZWN0Um91dGUobVJvdXRlck9iaiwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQUxMX1JPVVRFX1RZUEVTLCByb3V0ZU9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgICAgICBpZiAobUdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1HZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kID0gbmV3IE1lZGlhUm91dGVySmVsbHliZWFuLkdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZC5nZXREZWZhdWx0Um91dGUobVJvdXRlck9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRTeXN0ZW1Sb3V0ZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChyb3V0ZS5nZXREZXNjcmlwdG9ySWQoKSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCkubVJvdXRlT2JqOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVwcmVzZW50cyBhIHJvdXRlIHRoYXQgaXMgcHJvdmlkZWQgYnkgdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIKLSAgICAgICAgICogYW5kIHB1Ymxpc2hlZCBieSB0aGlzIHJvdXRlIHByb3ZpZGVyIHRvIHRoZSBzdXBwb3J0IGxpYnJhcnkgbWVkaWEgcm91dGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBTeXN0ZW1Sb3V0ZVJlY29yZCB7Ci0gICAgICAgICAgICBwdWJsaWMgZmluYWwgT2JqZWN0IG1Sb3V0ZU9iajsKLSAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbVJvdXRlRGVzY3JpcHRvcklkOwotICAgICAgICAgICAgcHVibGljIE1lZGlhUm91dGVEZXNjcmlwdG9yIG1Sb3V0ZURlc2NyaXB0b3I7IC8vIGFzc2lnbmVkIGltbWVkaWF0ZWx5IGFmdGVyIGNyZWF0aW9uCi0KLSAgICAgICAgICAgIHB1YmxpYyBTeXN0ZW1Sb3V0ZVJlY29yZChPYmplY3Qgcm91dGVPYmosIFN0cmluZyBpZCkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZU9iaiA9IHJvdXRlT2JqOwotICAgICAgICAgICAgICAgIG1Sb3V0ZURlc2NyaXB0b3JJZCA9IGlkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcHJlc2VudHMgYSByb3V0ZSB0aGF0IGlzIHByb3ZpZGVkIGJ5IHRoZSBzdXBwb3J0IGxpYnJhcnkgbWVkaWEgcm91dGVyCi0gICAgICAgICAqIGFuZCBwdWJsaXNoZWQgYnkgdGhpcyByb3V0ZSBwcm92aWRlciB0byB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgVXNlclJvdXRlUmVjb3JkIHsKLSAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlOwotICAgICAgICAgICAgcHVibGljIGZpbmFsIE9iamVjdCBtUm91dGVPYmo7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBVc2VyUm91dGVSZWNvcmQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgICAgICBtUm91dGUgPSByb3V0ZTsKLSAgICAgICAgICAgICAgICBtUm91dGVPYmogPSByb3V0ZU9iajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgU3lzdGVtUm91dGVDb250cm9sbGVyIGV4dGVuZHMgUm91dGVDb250cm9sbGVyIHsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Sb3V0ZU9iajsKLQotICAgICAgICAgICAgcHVibGljIFN5c3RlbVJvdXRlQ29udHJvbGxlcihPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgICAgICBtUm91dGVPYmogPSByb3V0ZU9iajsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNldFZvbHVtZShpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLnJlcXVlc3RTZXRWb2x1bWUobVJvdXRlT2JqLCB2b2x1bWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVXBkYXRlVm9sdW1lKGludCBkZWx0YSkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5yZXF1ZXN0VXBkYXRlVm9sdW1lKG1Sb3V0ZU9iaiwgZGVsdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSmVsbHliZWFuIE1SMSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICAvLyBAQFJlcXVpcmVzQXBpKDE3KQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEplbGx5YmVhbk1yMUltcGwgZXh0ZW5kcyBKZWxseWJlYW5JbXBsCi0gICAgICAgICAgICBpbXBsZW1lbnRzIE1lZGlhUm91dGVySmVsbHliZWFuTXIxLkNhbGxiYWNrIHsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5BY3RpdmVTY2FuV29ya2Fyb3VuZCBtQWN0aXZlU2Nhbldvcmthcm91bmQ7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuSXNDb25uZWN0aW5nV29ya2Fyb3VuZCBtSXNDb25uZWN0aW5nV29ya2Fyb3VuZDsKLQotICAgICAgICBwdWJsaWMgSmVsbHliZWFuTXIxSW1wbChDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIERpc3BsYXkgbmV3UHJlc2VudGF0aW9uRGlzcGxheSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Sb3V0ZUluZm8uZ2V0UHJlc2VudGF0aW9uRGlzcGxheShyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgaW50IG5ld1ByZXNlbnRhdGlvbkRpc3BsYXlJZCA9IChuZXdQcmVzZW50YXRpb25EaXNwbGF5ICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3UHJlc2VudGF0aW9uRGlzcGxheS5nZXREaXNwbGF5SWQoKSA6IC0xKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3UHJlc2VudGF0aW9uRGlzcGxheUlkCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSByZWNvcmQubVJvdXRlRGVzY3JpcHRvci5nZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlRGVzY3JpcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIocmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbkRpc3BsYXlJZChuZXdQcmVzZW50YXRpb25EaXNwbGF5SWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgICAgICBzdXBlci5vbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCwgYnVpbGRlcik7Ci0KLSAgICAgICAgICAgIGlmICghTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuUm91dGVJbmZvLmlzRW5hYmxlZChyZWNvcmQubVJvdXRlT2JqKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RpbmcocmVjb3JkKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q29ubmVjdGluZyh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRGlzcGxheSBwcmVzZW50YXRpb25EaXNwbGF5ID0KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuUm91dGVJbmZvLmdldFByZXNlbnRhdGlvbkRpc3BsYXkocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uRGlzcGxheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5zZXRQcmVzZW50YXRpb25EaXNwbGF5SWQocHJlc2VudGF0aW9uRGlzcGxheS5nZXREaXNwbGF5SWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBzdXBlci51cGRhdGVDYWxsYmFjaygpOwotCi0gICAgICAgICAgICBpZiAobUFjdGl2ZVNjYW5Xb3JrYXJvdW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQWN0aXZlU2Nhbldvcmthcm91bmQgPSBuZXcgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuQWN0aXZlU2Nhbldvcmthcm91bmQoCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCksIGdldEhhbmRsZXIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQWN0aXZlU2Nhbldvcmthcm91bmQuc2V0QWN0aXZlU2NhblJvdXRlVHlwZXMobUFjdGl2ZVNjYW4gPyBtUm91dGVUeXBlcyA6IDApOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlQ2FsbGJhY2tPYmooKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuY3JlYXRlQ2FsbGJhY2sodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgICAgICBpZiAobUlzQ29ubmVjdGluZ1dvcmthcm91bmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kID0gbmV3IE1lZGlhUm91dGVySmVsbHliZWFuTXIxLklzQ29ubmVjdGluZ1dvcmthcm91bmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtSXNDb25uZWN0aW5nV29ya2Fyb3VuZC5pc0Nvbm5lY3RpbmcocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKZWxseWJlYW4gTVIyIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIC8vIEBAUmVxdWlyZXNBcGkoMTgpCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmVsbHliZWFuTXIySW1wbCBleHRlbmRzIEplbGx5YmVhbk1yMUltcGwgewotICAgICAgICBwdWJsaWMgSmVsbHliZWFuTXIySW1wbChDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgICAgICBzdXBlci5vbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCwgYnVpbGRlcik7Ci0KLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBkZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLlJvdXRlSW5mby5nZXREZXNjcmlwdGlvbihyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZWxlY3RSb3V0ZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLnNlbGVjdFJvdXRlKG1Sb3V0ZXJPYmosCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLkFMTF9ST1VURV9UWVBFUywgcm91dGVPYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0RGVmYXVsdFJvdXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLmdldERlZmF1bHRSb3V0ZShtUm91dGVyT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVVc2VyUm91dGVQcm9wZXJ0aWVzKFVzZXJSb3V0ZVJlY29yZCByZWNvcmQpIHsKLSAgICAgICAgICAgIHN1cGVyLnVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMocmVjb3JkKTsKLQotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuVXNlclJvdXRlSW5mby5zZXREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tSZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4ucmVtb3ZlQ2FsbGJhY2sobVJvdXRlck9iaiwgbUNhbGxiYWNrT2JqKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUNhbGxiYWNrUmVnaXN0ZXJlZCA9IHRydWU7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMi5hZGRDYWxsYmFjayhtUm91dGVyT2JqLCBtUm91dGVUeXBlcywgbUNhbGxiYWNrT2JqLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTCi0gICAgICAgICAgICAgICAgICAgIHwgKG1BY3RpdmVTY2FuID8gTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOIDogMCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ29ubmVjdGluZyhTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQpIHsKLSAgICAgICAgICAgIHJldHVybiBNZWRpYVJvdXRlckplbGx5YmVhbk1yMi5Sb3V0ZUluZm8uaXNDb25uZWN0aW5nKHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBpMjQgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgLy8gQEBSZXF1aXJlc0FwaSgyNCkKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBcGkyNEltcGwgZXh0ZW5kcyBKZWxseWJlYW5NcjJJbXBsIHsKLSAgICAgICAgcHVibGljIEFwaTI0SW1wbChDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgICAgICBzdXBlci5vbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCwgYnVpbGRlcik7Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGV2aWNlVHlwZShNZWRpYVJvdXRlckFwaTI0LlJvdXRlSW5mby5nZXREZXZpY2VUeXBlKHJlY29yZC5tUm91dGVPYmopKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9wYWNrYWdlLmh0bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTJhYWYyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPgotCi08Ym9keT4KLQotPHA+Q29udGFpbnMgQVBJcyB0aGF0IGNvbnRyb2wgdGhlIHJvdXRpbmcgb2YgbWVkaWEgY2hhbm5lbHMgYW5kIHN0cmVhbXMgZnJvbSB0aGUgY3VycmVudCBkZXZpY2UKLSAgdG8gZXh0ZXJuYWwgc3BlYWtlcnMgYW5kIGRlc3RpbmF0aW9uIGRldmljZXMuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9CYXNlTGF5b3V0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9CYXNlTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNjQ3MWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvQmFzZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWV3R3JvdXBQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5NYXJnaW5MYXlvdXRQYXJhbXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgQmFzZUxheW91dCBleHRlbmRzIFZpZXdHcm91cEltcGwgewotICAgIHByaXZhdGUgZmluYWwgVmlld0dyb3VwIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIFZpZXdHcm91cFByb3ZpZGVyIG1TdXBlclByb3ZpZGVyOwotICAgIHByaXZhdGUgZmluYWwgVmlld0dyb3VwUHJvdmlkZXIgbVByaXZhdGVQcm92aWRlcjsKLQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFZpZXc+IG1NYXRjaFBhcmVudENoaWxkcmVuID0gbmV3IEFycmF5TGlzdDw+KDEpOwotCi0gICAgcHVibGljIEJhc2VMYXlvdXQoVmlld0dyb3VwIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyKSB7Ci0gICAgICAgIHN1cGVyKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIgPSBzdXBlclByb3ZpZGVyOwotICAgICAgICBtUHJpdmF0ZVByb3ZpZGVyID0gcHJpdmF0ZVByb3ZpZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNoZWNrTGF5b3V0UGFyYW1zX2ltcGwoTGF5b3V0UGFyYW1zIHApIHsKLSAgICAgICAgcmV0dXJuIHAgaW5zdGFuY2VvZiBNYXJnaW5MYXlvdXRQYXJhbXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExheW91dFBhcmFtcyBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXNfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNYXJnaW5MYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICByZXR1cm4gbmV3IE1hcmdpbkxheW91dFBhcmFtcyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCBhdHRycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKExheW91dFBhcmFtcyBscCkgewotICAgICAgICBpZiAobHAgaW5zdGFuY2VvZiBNYXJnaW5MYXlvdXRQYXJhbXMpIHsKLSAgICAgICAgICAgIHJldHVybiBscDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE1hcmdpbkxheW91dFBhcmFtcyhscCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25NZWFzdXJlX2ltcGwoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICBpbnQgY291bnQgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRDb3VudCgpOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gbWVhc3VyZU1hdGNoUGFyZW50Q2hpbGRyZW4gPQotICAgICAgICAgICAgICAgIFZpZXcuTWVhc3VyZVNwZWMuZ2V0TW9kZSh3aWR0aE1lYXN1cmVTcGVjKSAhPSBWaWV3Lk1lYXN1cmVTcGVjLkVYQUNUTFkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcuTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYykgIT0gVmlldy5NZWFzdXJlU3BlYy5FWEFDVExZOwotICAgICAgICBtTWF0Y2hQYXJlbnRDaGlsZHJlbi5jbGVhcigpOwotCi0gICAgICAgIGludCBtYXhIZWlnaHQgPSAwOwotICAgICAgICBpbnQgbWF4V2lkdGggPSAwOwotICAgICAgICBpbnQgY2hpbGRTdGF0ZSA9IDA7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbUluc3RhbmNlLmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2hpbGQuZ2V0VmlzaWJpbGl0eSgpICE9IFZpZXcuR09ORSkgewotICAgICAgICAgICAgICAgIG1Qcml2YXRlUHJvdmlkZXIubWVhc3VyZUNoaWxkV2l0aE1hcmdpbnNfaW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLCB3aWR0aE1lYXN1cmVTcGVjLCAwLCBoZWlnaHRNZWFzdXJlU3BlYywgMCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWFyZ2luTGF5b3V0UGFyYW1zIGxwID0gKE1hcmdpbkxheW91dFBhcmFtcykgY2hpbGQuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgICAgICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKSArIGxwLmxlZnRNYXJnaW4gKyBscC5yaWdodE1hcmdpbik7Ci0gICAgICAgICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5tYXgobWF4SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKSArIGxwLnRvcE1hcmdpbiArIGxwLmJvdHRvbU1hcmdpbik7Ci0gICAgICAgICAgICAgICAgY2hpbGRTdGF0ZSA9IGNoaWxkU3RhdGUgfCBjaGlsZC5nZXRNZWFzdXJlZFN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1lYXN1cmVNYXRjaFBhcmVudENoaWxkcmVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChscC53aWR0aCA9PSBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAuaGVpZ2h0ID09IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NYXRjaFBhcmVudENoaWxkcmVuLmFkZChjaGlsZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBY2NvdW50IGZvciBwYWRkaW5nIHRvbwotICAgICAgICBtYXhXaWR0aCArPSBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCkgKyBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpOwotICAgICAgICBtYXhIZWlnaHQgKz0gZ2V0UGFkZGluZ1RvcFdpdGhGb3JlZ3JvdW5kKCkgKyBnZXRQYWRkaW5nQm90dG9tV2l0aEZvcmVncm91bmQoKTsKLQotICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IG91ciBtaW5pbXVtIGhlaWdodCBhbmQgd2lkdGgKLSAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5tYXgobWF4SGVpZ2h0LCBtUHJpdmF0ZVByb3ZpZGVyLmdldFN1Z2dlc3RlZE1pbmltdW1IZWlnaHRfaW1wbCgpKTsKLSAgICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgbVByaXZhdGVQcm92aWRlci5nZXRTdWdnZXN0ZWRNaW5pbXVtV2lkdGhfaW1wbCgpKTsKLQotICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IG91ciBmb3JlZ3JvdW5kJ3MgbWluaW11bSBoZWlnaHQgYW5kIHdpZHRoCi0gICAgICAgIGZpbmFsIERyYXdhYmxlIGRyYXdhYmxlID0gbUluc3RhbmNlLmdldEZvcmVncm91bmQoKTsKLSAgICAgICAgaWYgKGRyYXdhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1heEhlaWdodCA9IE1hdGgubWF4KG1heEhlaWdodCwgZHJhd2FibGUuZ2V0TWluaW11bUhlaWdodCgpKTsKLSAgICAgICAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIGRyYXdhYmxlLmdldE1pbmltdW1XaWR0aCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1Qcml2YXRlUHJvdmlkZXIuc2V0TWVhc3VyZWREaW1lbnNpb25faW1wbCgKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVzb2x2ZVNpemVBbmRTdGF0ZShtYXhXaWR0aCwgd2lkdGhNZWFzdXJlU3BlYywgY2hpbGRTdGF0ZSksCi0gICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlc29sdmVTaXplQW5kU3RhdGUobWF4SGVpZ2h0LCBoZWlnaHRNZWFzdXJlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkU3RhdGUgPDwgVmlldy5NRUFTVVJFRF9IRUlHSFRfU1RBVEVfU0hJRlQpKTsKLQotICAgICAgICBjb3VudCA9IG1NYXRjaFBhcmVudENoaWxkcmVuLnNpemUoKTsKLSAgICAgICAgaWYgKGNvdW50ID4gMSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IG1NYXRjaFBhcmVudENoaWxkcmVuLmdldChpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBNYXJnaW5MYXlvdXRQYXJhbXMgbHAgPSAoTWFyZ2luTGF5b3V0UGFyYW1zKSBjaGlsZC5nZXRMYXlvdXRQYXJhbXMoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZFdpZHRoTWVhc3VyZVNwZWM7Ci0gICAgICAgICAgICAgICAgaWYgKGxwLndpZHRoID09IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gTWF0aC5tYXgoMCwgbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZ2V0UGFkZGluZ0xlZnRXaXRoRm9yZWdyb3VuZCgpIC0gZ2V0UGFkZGluZ1JpZ2h0V2l0aEZvcmVncm91bmQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbHAubGVmdE1hcmdpbiAtIGxwLnJpZ2h0TWFyZ2luKTsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRXaWR0aE1lYXN1cmVTcGVjID0gVmlldy5NZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIFZpZXcuTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRXaWR0aE1lYXN1cmVTcGVjID0gbUluc3RhbmNlLmdldENoaWxkTWVhc3VyZVNwZWMod2lkdGhNZWFzdXJlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCkgKyBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLmxlZnRNYXJnaW4gKyBscC5yaWdodE1hcmdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC53aWR0aCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkSGVpZ2h0TWVhc3VyZVNwZWM7Ci0gICAgICAgICAgICAgICAgaWYgKGxwLmhlaWdodCA9PSBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBNYXRoLm1heCgwLCBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZ2V0UGFkZGluZ1RvcFdpdGhGb3JlZ3JvdW5kKCkgLSBnZXRQYWRkaW5nQm90dG9tV2l0aEZvcmVncm91bmQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbHAudG9wTWFyZ2luIC0gbHAuYm90dG9tTWFyZ2luKTsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRIZWlnaHRNZWFzdXJlU3BlYyA9IFZpZXcuTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgVmlldy5NZWFzdXJlU3BlYy5FWEFDVExZKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjaGlsZEhlaWdodE1lYXN1cmVTcGVjID0gbUluc3RhbmNlLmdldENoaWxkTWVhc3VyZVNwZWMoaGVpZ2h0TWVhc3VyZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGFkZGluZ1RvcFdpdGhGb3JlZ3JvdW5kKCkgKyBnZXRQYWRkaW5nQm90dG9tV2l0aEZvcmVncm91bmQoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC50b3BNYXJnaW4gKyBscC5ib3R0b21NYXJnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAuaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjaGlsZC5tZWFzdXJlKGNoaWxkV2lkdGhNZWFzdXJlU3BlYywgY2hpbGRIZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkxheW91dF9pbXBsKGJvb2xlYW4gY2hhbmdlZCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgewotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRDb3VudCgpOwotCi0gICAgICAgIGZpbmFsIGludCBwYXJlbnRMZWZ0ID0gZ2V0UGFkZGluZ0xlZnRXaXRoRm9yZWdyb3VuZCgpOwotICAgICAgICBmaW5hbCBpbnQgcGFyZW50UmlnaHQgPSByaWdodCAtIGxlZnQgLSBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpOwotCi0gICAgICAgIGZpbmFsIGludCBwYXJlbnRUb3AgPSBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKTsKLSAgICAgICAgZmluYWwgaW50IHBhcmVudEJvdHRvbSA9IGJvdHRvbSAtIHRvcCAtIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IG1JbnN0YW5jZS5nZXRDaGlsZEF0KGkpOwotICAgICAgICAgICAgaWYgKGNoaWxkLmdldFZpc2liaWxpdHkoKSAhPSBWaWV3LkdPTkUpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBNYXJnaW5MYXlvdXRQYXJhbXMgbHAgPSAoTWFyZ2luTGF5b3V0UGFyYW1zKSBjaGlsZC5nZXRMYXlvdXRQYXJhbXMoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgIGludCBjaGlsZExlZnQ7Ci0gICAgICAgICAgICAgICAgaW50IGNoaWxkVG9wOwotCi0gICAgICAgICAgICAgICAgY2hpbGRMZWZ0ID0gcGFyZW50TGVmdCArIChwYXJlbnRSaWdodCAtIHBhcmVudExlZnQgLSB3aWR0aCkgLyAyICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxwLmxlZnRNYXJnaW4gLSBscC5yaWdodE1hcmdpbjsKLQotICAgICAgICAgICAgICAgIGNoaWxkVG9wID0gcGFyZW50VG9wICsgKHBhcmVudEJvdHRvbSAtIHBhcmVudFRvcCAtIGhlaWdodCkgLyAyICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxwLnRvcE1hcmdpbiAtIGxwLmJvdHRvbU1hcmdpbjsKLQotICAgICAgICAgICAgICAgIGNoaWxkLmxheW91dChjaGlsZExlZnQsIGNoaWxkVG9wLCBjaGlsZExlZnQgKyB3aWR0aCwgY2hpbGRUb3AgKyBoZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkRGVsYXlDaGlsZFByZXNzZWRTdGF0ZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UGFkZGluZ0xlZnRXaXRoRm9yZWdyb3VuZCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZS5pc0ZvcmVncm91bmRJbnNpZGVQYWRkaW5nKCkgPyBNYXRoLm1heChtSW5zdGFuY2UuZ2V0UGFkZGluZ0xlZnQoKSwgMCkgOgotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRQYWRkaW5nTGVmdCgpICsgMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZS5pc0ZvcmVncm91bmRJbnNpZGVQYWRkaW5nKCkgPyBNYXRoLm1heChtSW5zdGFuY2UuZ2V0UGFkZGluZ1JpZ2h0KCksIDApIDoKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuZ2V0UGFkZGluZ1JpZ2h0KCkgKyAwOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFBhZGRpbmdUb3BXaXRoRm9yZWdyb3VuZCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZS5pc0ZvcmVncm91bmRJbnNpZGVQYWRkaW5nKCkgPyBNYXRoLm1heChtSW5zdGFuY2UuZ2V0UGFkZGluZ1RvcCgpLCAwKSA6Ci0gICAgICAgICAgICAgICAgbUluc3RhbmNlLmdldFBhZGRpbmdUb3AoKSArIDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UGFkZGluZ0JvdHRvbVdpdGhGb3JlZ3JvdW5kKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nQm90dG9tKCksIDApIDoKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuZ2V0UGFkZGluZ0JvdHRvbSgpICsgMDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9NZWRpYUNvbnRyb2xWaWV3MkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L01lZGlhQ29udHJvbFZpZXcySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWZmMTUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L01lZGlhQ29udHJvbFZpZXcySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhQ29udHJvbFZpZXcyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlld0dyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbFZpZXcyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlByb2dyZXNzQmFyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlBvcHVwV2luZG93OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbGF0aXZlTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0Jhci5PblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUJ1dHRvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotcHVibGljIGNsYXNzIE1lZGlhQ29udHJvbFZpZXcySW1wbCBleHRlbmRzIEJhc2VMYXlvdXQgaW1wbGVtZW50cyBNZWRpYUNvbnRyb2xWaWV3MlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhQ29udHJvbFZpZXcyIjsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFDb250cm9sVmlldzIgbUluc3RhbmNlOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9LRVlfRlVMTFNDUkVFTiA9ICJmdWxsU2NyZWVuIjsKLQotICAgIC8vIFRPRE86IE1vdmUgdGhlc2UgY29uc3RhbnRzIHRvIHB1YmxpYyBhcGkgdG8gc3VwcG9ydCBjdXN0b20gdmlkZW8gdmlldy4KLSAgICAvLyBUT0RPOiBDb21iaW5lIHRoZXNlIGNvbnN0YW50cyBpbnRvIG9uZSByZWdhcmRpbmcgVHJhY2tJbmZvLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZJREVPX1RSQUNLX0NPVU5UID0gIlZpZGVvVHJhY2tDb3VudCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVVESU9fVFJBQ0tfQ09VTlQgPSAiQXVkaW9UcmFja0NvdW50IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TVUJUSVRMRV9UUkFDS19DT1VOVCA9ICJTdWJ0aXRsZVRyYWNrQ291bnQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BMQVlCQUNLX1NQRUVEID0gIlBsYXliYWNrU3BlZWQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFTEVDVEVEX0FVRElPX0lOREVYID0gIlNlbGVjdGVkQXVkaW9JbmRleCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VMRUNURURfU1VCVElUTEVfSU5ERVggPSAiU2VsZWN0ZWRTdWJ0aXRsZUluZGV4IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX1VQREFURV9UUkFDS19TVEFUVVMgPSAiVXBkYXRlVHJhY2tTdGF0dXMiOwotCi0gICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgb25jZSBpbnRlZ3JhdGluZyB3aXRoIE1lZGlhU2Vzc2lvbjIgJiBNZWRpYU1ldGFkYXRhMgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NUQVRFX0lTX0FEVkVSVElTRU1FTlQgPSAiTWVkaWFUeXBlQWR2ZXJ0aXNlbWVudCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9VUERBVEVfTUVESUFfVFlQRV9TVEFUVVMgPSAiVXBkYXRlTWVkaWFUeXBlU3RhdHVzIjsKLQotICAgIC8vIFN0cmluZyBmb3Igc2VuZGluZyBjb21tYW5kIHRvIHNob3cgc3VidGl0bGUgdG8gTWVkaWFTZXNzaW9uLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TSE9XX1NVQlRJVExFID0gInNob3dTdWJ0aXRsZSI7Ci0gICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gaGlkZSBzdWJ0aXRsZSB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX0hJREVfU1VCVElUTEUgPSAiaGlkZVN1YnRpdGxlIjsKLSAgICAvLyBUT0RPOiByZW1vdmUgb25jZSB0aGUgaW1wbGVtZW50YXRpb24gaXMgcmV2aXNlZAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfU0VUX0ZVTExTQ1JFRU4gPSAic2V0RnVsbHNjcmVlbiI7Ci0gICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gc2VsZWN0IGF1ZGlvIHRyYWNrIHRvIE1lZGlhU2Vzc2lvbi4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfU0VMRUNUX0FVRElPX1RSQUNLID0gIlNlbGVjdFRyYWNrIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBzZXQgcGxheWJhY2sgc3BlZWQgdG8gTWVkaWFTZXNzaW9uLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TRVRfUExBWUJBQ0tfU1BFRUQgPSAiU2V0UGxheWJhY2tTcGVlZCI7Ci0gICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gbXV0ZSBhdWRpbyB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX01VVEU9ICJNdXRlIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byB1bm11dGUgYXVkaW8gdG8gTWVkaWFTZXNzaW9uLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9VTk1VVEUgPSAiVW5tdXRlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfSEVMUCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfU1VCVElUTEVfVFJBQ0sgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX1ZJREVPX1FVQUxJVFkgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX01BSU4gPSA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TUEVFRF8xeF9JTkRFWCA9IDM7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfVFlQRV9ERUZBVUxUID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfVFlQRV9NVVNJQyA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FRElBX1RZUEVfQURWRVJUSVNFTUVOVCA9IDI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0VNQkVEREVEID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0ZVTEwgPSAxOwotICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBNaW5pbWFsIHNpemUgdHlwZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX01JTklNQUwgPSAyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9QUk9HUkVTUyA9IDEwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUFJPR1JFU1NfVVBEQVRFX1RJTUVfTVMgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVdJTkRfVElNRV9NUyA9IDEwMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGT1JXQVJEX1RJTUVfTVMgPSAzMDAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQURfU0tJUF9XQUlUX1RJTUVfTVMgPSA1MDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRV9OT05fRVhJU1RFTlQgPSAtMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfRU1QVFkgPSAiIjsKLQotICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXNvdXJjZXM7Ci0gICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xsZXIgbUNvbnRyb2xsZXI7Ci0gICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xsZXIuVHJhbnNwb3J0Q29udHJvbHMgbUNvbnRyb2xzOwotICAgIHByaXZhdGUgUGxheWJhY2tTdGF0ZSBtUGxheWJhY2tTdGF0ZTsKLSAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEgbU1ldGFkYXRhOwotICAgIHByaXZhdGUgaW50IG1EdXJhdGlvbjsKLSAgICBwcml2YXRlIGludCBtUHJldlN0YXRlOwotICAgIHByaXZhdGUgaW50IG1QcmV2V2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZIZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbU9yaWdpbmFsTGVmdEJhcldpZHRoOwotICAgIHByaXZhdGUgaW50IG1WaWRlb1RyYWNrQ291bnQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUF1ZGlvVHJhY2tDb3VudDsKLSAgICBwcml2YXRlIGludCBtU3VidGl0bGVUcmFja0NvdW50OwotICAgIHByaXZhdGUgaW50IG1TZXR0aW5nc01vZGU7Ci0gICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4OwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleDsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRWaWRlb1F1YWxpdHlJbmRleDsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRTcGVlZEluZGV4OwotICAgIHByaXZhdGUgaW50IG1FbWJlZGRlZFNldHRpbmdzSXRlbVdpZHRoOwotICAgIHByaXZhdGUgaW50IG1GdWxsU2V0dGluZ3NJdGVtV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbUVtYmVkZGVkU2V0dGluZ3NJdGVtSGVpZ2h0OwotICAgIHByaXZhdGUgaW50IG1GdWxsU2V0dGluZ3NJdGVtSGVpZ2h0OwotICAgIHByaXZhdGUgaW50IG1TZXR0aW5nc1dpbmRvd01hcmdpbjsKLSAgICBwcml2YXRlIGludCBtTWVkaWFUeXBlOwotICAgIHByaXZhdGUgaW50IG1TaXplVHlwZTsKLSAgICBwcml2YXRlIGxvbmcgbVBsYXliYWNrQWN0aW9uczsKLSAgICBwcml2YXRlIGJvb2xlYW4gbURyYWdnaW5nOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNGdWxsU2NyZWVuOwotICAgIHByaXZhdGUgYm9vbGVhbiBtT3ZlcmZsb3dFeHBhbmRlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzU3RvcHBlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVN1YnRpdGxlSXNFbmFibGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtU2Vla0F2YWlsYWJsZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzQWR2ZXJ0aXNlbWVudDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzTXV0ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRVWFVwZGF0ZTsKLQotICAgIC8vIFJlbGF0aW5nIHRvIFRpdGxlIEJhciBWaWV3Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbVJvb3Q7Ci0gICAgcHJpdmF0ZSBWaWV3IG1UaXRsZUJhcjsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7Ci0gICAgcHJpdmF0ZSBWaWV3IG1BZEV4dGVybmFsTGluazsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1CYWNrQnV0dG9uOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZUJ1dHRvbiBtUm91dGVCdXR0b247Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVJvdXRlU2VsZWN0b3I7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBDZW50ZXIgVmlldwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1DZW50ZXJWaWV3OwotICAgIHByaXZhdGUgVmlldyBtVHJhbnNwb3J0Q29udHJvbHM7Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtUGxheVBhdXNlQnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUZmd2RCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtUmV3QnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbU5leHRCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtUHJldkJ1dHRvbjsKLQotICAgIC8vIFJlbGF0aW5nIHRvIE1pbmltYWwgRXh0cmEgVmlldwotICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1NaW5pbWFsRXh0cmFWaWV3OwotCi0gICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyIFZpZXcKLSAgICBwcml2YXRlIFByb2dyZXNzQmFyIG1Qcm9ncmVzczsKLSAgICBwcml2YXRlIFZpZXcgbVByb2dyZXNzQnVmZmVyOwotCi0gICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBWaWV3Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUJvdHRvbUJhcjsKLQotICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgTGVmdCBWaWV3Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUJvdHRvbUJhckxlZnRWaWV3OwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1UaW1lVmlldzsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1FbmRUaW1lOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbUN1cnJlbnRUaW1lOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbUFkU2tpcFZpZXc7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIG1Gb3JtYXRCdWlsZGVyOwotICAgIHByaXZhdGUgRm9ybWF0dGVyIG1Gb3JtYXR0ZXI7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyIFJpZ2h0IFZpZXcKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtQm90dG9tQmFyUmlnaHRWaWV3OwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1CYXNpY0NvbnRyb2xzOwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1FeHRyYUNvbnRyb2xzOwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1DdXN0b21CdXR0b25zOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVN1YnRpdGxlQnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUZ1bGxTY3JlZW5CdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtT3ZlcmZsb3dCdXR0b25SaWdodDsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1PdmVyZmxvd0J1dHRvbkxlZnQ7Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtTXV0ZUJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1WaWRlb1F1YWxpdHlCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtU2V0dGluZ3NCdXR0b247Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtQWRSZW1haW5pbmdWaWV3OwotCi0gICAgLy8gUmVsYXRpbmcgdG8gU2V0dGluZ3MgTGlzdCBWaWV3Ci0gICAgcHJpdmF0ZSBMaXN0VmlldyBtU2V0dGluZ3NMaXN0VmlldzsKLSAgICBwcml2YXRlIFBvcHVwV2luZG93IG1TZXR0aW5nc1dpbmRvdzsKLSAgICBwcml2YXRlIFNldHRpbmdzQWRhcHRlciBtU2V0dGluZ3NBZGFwdGVyOwotICAgIHByaXZhdGUgU3ViU2V0dGluZ3NBZGFwdGVyIG1TdWJTZXR0aW5nc0FkYXB0ZXI7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVNldHRpbmdzTWFpblRleHRzTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtU2V0dGluZ3NTdWJUZXh0c0xpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PEludGVnZXI+IG1TZXR0aW5nc0ljb25JZHNMaXN0OwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1TdWJ0aXRsZURlc2NyaXB0aW9uc0xpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbUF1ZGlvVHJhY2tMaXN0OwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1WaWRlb1F1YWxpdHlMaXN0OwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1QbGF5YmFja1NwZWVkVGV4dExpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PEZsb2F0PiBtUGxheWJhY2tTcGVlZExpc3Q7Ci0KLSAgICBwdWJsaWMgTWVkaWFDb250cm9sVmlldzJJbXBsKE1lZGlhQ29udHJvbFZpZXcyIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyKSB7Ci0gICAgICAgIHN1cGVyKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBtUmVzb3VyY2VzID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgLy8gSW5mbGF0ZSBNZWRpYUNvbnRyb2xWaWV3MiBmcm9tIFhNTAotICAgICAgICBtUm9vdCA9IG1ha2VDb250cm9sbGVyVmlldygpOwotICAgICAgICBtSW5zdGFuY2UuYWRkVmlldyhtUm9vdCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uVG9rZW5faW1wbChTZXNzaW9uVG9rZW4yIHRva2VuKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25GdWxsU2NyZWVuTGlzdGVuZXJfaW1wbChNZWRpYUNvbnRyb2xWaWV3Mi5PbkZ1bGxTY3JlZW5MaXN0ZW5lciBsKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q29udHJvbGxlcl9pbXBsKE1lZGlhQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgICAgIG1Db250cm9sbGVyID0gY29udHJvbGxlcjsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNvbnRyb2xzID0gY29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpOwotICAgICAgICAgICAgLy8gU2V0IG1NZXRhZGF0YSBhbmQgbVBsYXliYWNrU3RhdGUgdG8gZXhpc3RpbmcgTWVkaWFTZXNzaW9uIHZhcmlhYmxlcyBzaW5jZSB0aGV5IG1heQotICAgICAgICAgICAgLy8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkCi0gICAgICAgICAgICBtUGxheWJhY2tTdGF0ZSA9IG1Db250cm9sbGVyLmdldFBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1Db250cm9sbGVyLmdldE1ldGFkYXRhKCk7Ci0gICAgICAgICAgICB1cGRhdGVEdXJhdGlvbigpOwotICAgICAgICAgICAgdXBkYXRlVGl0bGUoKTsKLQotICAgICAgICAgICAgbUNvbnRyb2xsZXIucmVnaXN0ZXJDYWxsYmFjayhuZXcgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2soKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRCdXR0b25WaXNpYmlsaXR5X2ltcGwoaW50IGJ1dHRvbiwgaW50IHZpc2liaWxpdHkpIHsKLSAgICAgICAgLy8gVE9ETzogYWRkIG1lbWJlciB2YXJpYWJsZXMgZm9yIEZhc3QtRm9yd2FyZC9QcnZpb3VzL1Jld2luZCBidXR0b25zIHRvIHNhdmUgdmlzaWJpbGl0eSBpbgotICAgICAgICAvLyBvcmRlciB0byBwcmV2ZW50IGJlaW5nIG92ZXJyaWRlbiBpbnNpZGUgdXBkYXRlTGF5b3V0KCkuCi0gICAgICAgIHN3aXRjaCAoYnV0dG9uKSB7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9QTEFZX1BBVVNFOgotICAgICAgICAgICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwgJiYgY2FuUGF1c2UoKSkgewotICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fRkZXRDoKLSAgICAgICAgICAgICAgICBpZiAobUZmd2RCdXR0b24gIT0gbnVsbCAmJiBjYW5TZWVrRm9yd2FyZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fUkVXOgotICAgICAgICAgICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwgJiYgY2FuU2Vla0JhY2t3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX05FWFQ6Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXh0QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9QUkVWOgotICAgICAgICAgICAgICAgIGlmIChtUHJldkJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fU1VCVElUTEU6Ci0gICAgICAgICAgICAgICAgaWYgKG1TdWJ0aXRsZUJ1dHRvbiAhPSBudWxsICYmIG1TdWJ0aXRsZVRyYWNrQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX0ZVTExfU0NSRUVOOgotICAgICAgICAgICAgICAgIGlmIChtRnVsbFNjcmVlbkJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fT1ZFUkZMT1c6Ci0gICAgICAgICAgICAgICAgaWYgKG1PdmVyZmxvd0J1dHRvblJpZ2h0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU92ZXJmbG93QnV0dG9uUmlnaHQuc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9NVVRFOgotICAgICAgICAgICAgICAgIGlmIChtTXV0ZUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NdXRlQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fU0VUVElOR1M6Ci0gICAgICAgICAgICAgICAgaWYgKG1TZXR0aW5nc0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc0J1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXF1ZXN0UGxheUJ1dHRvbkZvY3VzX2ltcGwoKSB7Ci0gICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24ucmVxdWVzdEZvY3VzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEFjY2Vzc2liaWxpdHlDbGFzc05hbWVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhQ29udHJvbFZpZXcyLmNsYXNzLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogU2hvdWxkIHRoaXMgZnVuY3Rpb24gYmUgcmVtb3ZlZD8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTWVhc3VyZV9pbXBsKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgc3VwZXIub25NZWFzdXJlX2ltcGwod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOwotCi0gICAgICAgIC8vIFVwZGF0ZSBsYXlvdXQgd2hlbiB0aGlzIHZpZXcncyB3aWR0aCBjaGFuZ2VzIGluIG9yZGVyIHRvIGF2b2lkIGFueSBVSSBvdmVybGFwIGJldHdlZW4KLSAgICAgICAgLy8gdHJhbnNwb3J0IGNvbnRyb2xzLgotICAgICAgICBpZiAobVByZXZXaWR0aCAhPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpCi0gICAgICAgICAgICAgICAgfHwgbVByZXZIZWlnaHQgIT0gbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCkgfHwgbU5lZWRVWFVwZGF0ZSkgewotICAgICAgICAgICAgLy8gRGlzbWlzcyBTZXR0aW5nc1dpbmRvdyBpZiBpdCBpcyBzaG93aW5nLgotICAgICAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKLQotICAgICAgICAgICAgLy8gVGhlc2Ugdmlld3MgbWF5IG5vdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgeWV0LgotICAgICAgICAgICAgaWYgKG1UcmFuc3BvcnRDb250cm9scy5nZXRXaWR0aCgpID09IDAgfHwgbVRpbWVWaWV3LmdldFdpZHRoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGN1cnJXaWR0aCA9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZFdpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgY3VyckhlaWdodCA9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAgICAgV2luZG93TWFuYWdlciBtYW5hZ2VyID0gKFdpbmRvd01hbmFnZXIpIG1JbnN0YW5jZS5nZXRDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7Ci0gICAgICAgICAgICBQb2ludCBzY3JlZW5TaXplID0gbmV3IFBvaW50KCk7Ci0gICAgICAgICAgICBtYW5hZ2VyLmdldERlZmF1bHREaXNwbGF5KCkuZ2V0U2l6ZShzY3JlZW5TaXplKTsKLSAgICAgICAgICAgIGludCBzY3JlZW5XaWR0aCA9IHNjcmVlblNpemUueDsKLSAgICAgICAgICAgIGludCBzY3JlZW5IZWlnaHQgPSBzY3JlZW5TaXplLnk7Ci0gICAgICAgICAgICBpbnQgZnVsbEljb25TaXplID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5tY3YyX2Z1bGxfaWNvbl9zaXplKTsKLSAgICAgICAgICAgIGludCBlbWJlZGRlZEljb25TaXplID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgICAgIFIuZGltZW4ubWN2Ml9lbWJlZGRlZF9pY29uX3NpemUpOwotICAgICAgICAgICAgaW50IG1hcmdpblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfaWNvbl9tYXJnaW4pOwotCi0gICAgICAgICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgQWR2ZXJ0aXNlbWVudCBNb2RlLgotICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9ERUZBVUxUKSB7Ci0gICAgICAgICAgICAgICAgLy8gTWF4IG51bWJlciBvZiBpY29ucyBpbnNpZGUgQm90dG9tQmFyUmlnaHRWaWV3IGZvciBNdXNpYyBtb2RlIGlzIDQuCi0gICAgICAgICAgICAgICAgaW50IG1heEljb25Db3VudCA9IDQ7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0KG1heEljb25Db3VudCwgZnVsbEljb25TaXplLCBlbWJlZGRlZEljb25TaXplLCBtYXJnaW5TaXplLCBjdXJyV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJySGVpZ2h0LCBzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1OZWVkVVhVcGRhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gT25lLXRpbWUgb3BlcmF0aW9uIGZvciBNdXNpYyBtZWRpYSB0eXBlCi0gICAgICAgICAgICAgICAgICAgIG1CYXNpY0NvbnRyb2xzLnJlbW92ZVZpZXcobU11dGVCdXR0b24pOwotICAgICAgICAgICAgICAgICAgICBtRXh0cmFDb250cm9scy5hZGRWaWV3KG1NdXRlQnV0dG9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvUXVhbGl0eUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU5lZWRVWFVwZGF0ZSA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgLy8gTWF4IG51bWJlciBvZiBpY29ucyBpbnNpZGUgQm90dG9tQmFyUmlnaHRWaWV3IGZvciBNdXNpYyBtb2RlIGlzIDMuCi0gICAgICAgICAgICAgICAgaW50IG1heEljb25Db3VudCA9IDM7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0KG1heEljb25Db3VudCwgZnVsbEljb25TaXplLCBlbWJlZGRlZEljb25TaXplLCBtYXJnaW5TaXplLCBjdXJyV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJySGVpZ2h0LCBzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QcmV2V2lkdGggPSBjdXJyV2lkdGg7Ci0gICAgICAgICAgICBtUHJldkhlaWdodCA9IGN1cnJIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETzogbW92ZSB0aGlzIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uLgotICAgICAgICAvLyBVcGRhdGUgdGl0bGUgYmFyIHBhcmFtZXRlcnMgaW4gb3JkZXIgdG8gYXZvaWQgb3ZlcmxhcCBiZXR3ZWVuIHRpdGxlIHZpZXcgYW5kIHRoZSByaWdodAotICAgICAgICAvLyBzaWRlIG9mIHRoZSB0aXRsZSBiYXIuCi0gICAgICAgIHVwZGF0ZVRpdGxlQmFyTGF5b3V0KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZF9pbXBsKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBzdXBlci5zZXRFbmFibGVkX2ltcGwoZW5hYmxlZCk7Ci0KLSAgICAgICAgLy8gVE9ETzogTWVyZ2UgdGhlIGJlbG93IGNvZGUgd2l0aCBkaXNhYmxlVW5zdXBwb3J0ZWRCdXR0b25zKCkuCi0gICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUZmd2RCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVJld0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUmV3QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1OZXh0QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1QcmV2QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Qcm9ncmVzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBkaXNhYmxlVW5zdXBwb3J0ZWRCdXR0b25zKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25WaXNpYmlsaXR5QWdncmVnYXRlZF9pbXBsKGJvb2xlYW4gaXNWaXNpYmxlKSB7Ci0gICAgICAgIHN1cGVyLm9uVmlzaWJpbGl0eUFnZ3JlZ2F0ZWRfaW1wbChpc1Zpc2libGUpOwotCi0gICAgICAgIGlmIChpc1Zpc2libGUpIHsKLSAgICAgICAgICAgIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKTsKLSAgICAgICAgICAgIG1JbnN0YW5jZS5yZW1vdmVDYWxsYmFja3MobVVwZGF0ZVByb2dyZXNzKTsKLSAgICAgICAgICAgIG1JbnN0YW5jZS5wb3N0KG1VcGRhdGVQcm9ncmVzcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UucmVtb3ZlQ2FsbGJhY2tzKG1VcGRhdGVQcm9ncmVzcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSb3V0ZVNlbGVjdG9yKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICBtUm91dGVTZWxlY3RvciA9IHNlbGVjdG9yOwotICAgICAgICBpZiAobVJvdXRlU2VsZWN0b3IgIT0gbnVsbCAmJiAhbVJvdXRlU2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBtUm91dGVCdXR0b24uc2V0Um91dGVTZWxlY3RvcihzZWxlY3RvciwgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOKTsKLSAgICAgICAgICAgIG1Sb3V0ZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUm91dGVCdXR0b24uc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFkpOwotICAgICAgICAgICAgbVJvdXRlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIFByb3RlY3RlZCBvciBwcml2YXRlIG1ldGhvZHMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BsYXlpbmcoKSB7Ci0gICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrU3RhdGUuZ2V0U3RhdGUoKSA9PSBQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkc7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldEN1cnJlbnRQb3NpdGlvbigpIHsKLSAgICAgICAgbVBsYXliYWNrU3RhdGUgPSBtQ29udHJvbGxlci5nZXRQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgbVBsYXliYWNrU3RhdGUuZ2V0UG9zaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRCdWZmZXJQZXJjZW50YWdlKCkgewotICAgICAgICBpZiAobUR1cmF0aW9uID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIG1QbGF5YmFja1N0YXRlID0gbUNvbnRyb2xsZXIuZ2V0UGxheWJhY2tTdGF0ZSgpOwotICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9uZyBidWZmZXJlZFBvcyA9IG1QbGF5YmFja1N0YXRlLmdldEJ1ZmZlcmVkUG9zaXRpb24oKTsKLSAgICAgICAgICAgIHJldHVybiAoYnVmZmVyZWRQb3MgPT0gLTEpID8gLTEgOiAoaW50KSAoYnVmZmVyZWRQb3MgKiAxMDAgLyBtRHVyYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5QYXVzZSgpIHsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAobVBsYXliYWNrU3RhdGUuZ2V0QWN0aW9ucygpICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0UpICE9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblNlZWtCYWNrd2FyZCgpIHsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAobVBsYXliYWNrU3RhdGUuZ2V0QWN0aW9ucygpICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EKSAhPSAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5TZWVrRm9yd2FyZCgpIHsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAobVBsYXliYWNrU3RhdGUuZ2V0QWN0aW9ucygpICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEKSAhPSAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdmlldyB0aGF0IGhvbGRzIHRoZSB3aWRnZXRzIHRoYXQgY29udHJvbCBwbGF5YmFjay4KLSAgICAgKiBEZXJpdmVkIGNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gY3JlYXRlIHRoZWlyIG93bi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgdmlldy4KLSAgICAgKiBAaGlkZSBUaGlzIGRvZXNuJ3Qgd29yayBhcyBhZHZlcnRpc2VkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFZpZXdHcm91cCBtYWtlQ29udHJvbGxlclZpZXcoKSB7Ci0gICAgICAgIFZpZXdHcm91cCByb290ID0gKFZpZXdHcm91cCkgQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICBSLmxheW91dC5tZWRpYV9jb250cm9sbGVyKTsKLSAgICAgICAgaW5pdENvbnRyb2xsZXJWaWV3KHJvb3QpOwotICAgICAgICByZXR1cm4gcm9vdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdENvbnRyb2xsZXJWaWV3KFZpZXdHcm91cCB2KSB7Ci0gICAgICAgIC8vIFJlbGF0aW5nIHRvIFRpdGxlIEJhciBWaWV3Ci0gICAgICAgIG1UaXRsZUJhciA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGl0bGVfYmFyKTsKLSAgICAgICAgbVRpdGxlVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGl0bGVfdGV4dCk7Ci0gICAgICAgIG1BZEV4dGVybmFsTGluayA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYWRfZXh0ZXJuYWxfbGluayk7Ci0gICAgICAgIG1CYWNrQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5iYWNrKTsKLSAgICAgICAgaWYgKG1CYWNrQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtQmFja0xpc3RlbmVyKTsKLSAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgICAgICBtUm91dGVCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLmNhc3QpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3Ci0gICAgICAgIG1DZW50ZXJWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5jZW50ZXJfdmlldyk7Ci0gICAgICAgIG1UcmFuc3BvcnRDb250cm9scyA9IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhSLmxheW91dC5lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMpOwotICAgICAgICBtQ2VudGVyVmlldy5hZGRWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gTWluaW1hbCBFeHRyYSBWaWV3Ci0gICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3ID0gKExpbmVhckxheW91dCkgdi5maW5kVmlld0J5SWQoUi5pZC5taW5pbWFsX2V4dHJhX3ZpZXcpOwotICAgICAgICBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zIHBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgKExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMpIG1NaW5pbWFsRXh0cmFWaWV3LmdldExheW91dFBhcmFtcygpOwotICAgICAgICBpbnQgaWNvblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfZW1iZWRkZWRfaWNvbl9zaXplKTsKLSAgICAgICAgaW50IG1hcmdpblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfaWNvbl9tYXJnaW4pOwotICAgICAgICBwYXJhbXMuc2V0TWFyZ2lucygwLCAoaWNvblNpemUgKyBtYXJnaW5TaXplICogMikgKiAoLTEpLCAwLCAwKTsKLSAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIgVmlldwotICAgICAgICBtUHJvZ3Jlc3MgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnByb2dyZXNzKTsKLSAgICAgICAgaWYgKG1Qcm9ncmVzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobVByb2dyZXNzIGluc3RhbmNlb2YgU2Vla0JhcikgewotICAgICAgICAgICAgICAgIFNlZWtCYXIgc2Vla2VyID0gKFNlZWtCYXIpIG1Qcm9ncmVzczsKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIobVNlZWtMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgc2Vla2VyLnNldFByb2dyZXNzRHJhd2FibGUobVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmN1c3RvbV9wcm9ncmVzcykpOwotICAgICAgICAgICAgICAgIHNlZWtlci5zZXRUaHVtYihtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuY3VzdG9tX3Byb2dyZXNzX3RodW1iKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0TWF4KE1BWF9QUk9HUkVTUyk7Ci0gICAgICAgIH0KLSAgICAgICAgbVByb2dyZXNzQnVmZmVyID0gdi5maW5kVmlld0J5SWQoUi5pZC5wcm9ncmVzc19idWZmZXIpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgVmlldwotICAgICAgICBtQm90dG9tQmFyID0gdi5maW5kVmlld0J5SWQoUi5pZC5ib3R0b21fYmFyKTsKLQotICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyIExlZnQgVmlldwotICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJvdHRvbV9iYXJfbGVmdCk7Ci0gICAgICAgIG1UaW1lVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGltZSk7Ci0gICAgICAgIG1FbmRUaW1lID0gdi5maW5kVmlld0J5SWQoUi5pZC50aW1lX2VuZCk7Ci0gICAgICAgIG1DdXJyZW50VGltZSA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGltZV9jdXJyZW50KTsKLSAgICAgICAgbUFkU2tpcFZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmFkX3NraXBfdGltZSk7Ci0gICAgICAgIG1Gb3JtYXRCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgbUZvcm1hdHRlciA9IG5ldyBGb3JtYXR0ZXIobUZvcm1hdEJ1aWxkZXIsIExvY2FsZS5nZXREZWZhdWx0KCkpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgUmlnaHQgVmlldwotICAgICAgICBtQm90dG9tQmFyUmlnaHRWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5ib3R0b21fYmFyX3JpZ2h0KTsKLSAgICAgICAgbUJhc2ljQ29udHJvbHMgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJhc2ljX2NvbnRyb2xzKTsKLSAgICAgICAgbUV4dHJhQ29udHJvbHMgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmV4dHJhX2NvbnRyb2xzKTsKLSAgICAgICAgbUN1c3RvbUJ1dHRvbnMgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmN1c3RvbV9idXR0b25zKTsKLSAgICAgICAgbVN1YnRpdGxlQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5zdWJ0aXRsZSk7Ci0gICAgICAgIGlmIChtU3VidGl0bGVCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtU3VidGl0bGVMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLmZ1bGxzY3JlZW4pOwotICAgICAgICBpZiAobUZ1bGxTY3JlZW5CdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GdWxsU2NyZWVuTGlzdGVuZXIpOwotICAgICAgICAgICAgLy8gVE9ETzogU2hvdyBGdWxsc2NyZWVuIGJ1dHRvbiB3aGVuIG9ubHkgaXQgaXMgcG9zc2libGUuCi0gICAgICAgIH0KLSAgICAgICAgbU92ZXJmbG93QnV0dG9uUmlnaHQgPSB2LmZpbmRWaWV3QnlJZChSLmlkLm92ZXJmbG93X3JpZ2h0KTsKLSAgICAgICAgaWYgKG1PdmVyZmxvd0J1dHRvblJpZ2h0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1PdmVyZmxvd0J1dHRvblJpZ2h0LnNldE9uQ2xpY2tMaXN0ZW5lcihtT3ZlcmZsb3dSaWdodExpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtT3ZlcmZsb3dCdXR0b25MZWZ0ID0gdi5maW5kVmlld0J5SWQoUi5pZC5vdmVyZmxvd19sZWZ0KTsKLSAgICAgICAgaWYgKG1PdmVyZmxvd0J1dHRvbkxlZnQgIT0gbnVsbCkgewotICAgICAgICAgICAgbU92ZXJmbG93QnV0dG9uTGVmdC5zZXRPbkNsaWNrTGlzdGVuZXIobU92ZXJmbG93TGVmdExpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtTXV0ZUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQubXV0ZSk7Ci0gICAgICAgIGlmIChtTXV0ZUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobU11dGVCdXR0b25MaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgbVNldHRpbmdzQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5zZXR0aW5ncyk7Ci0gICAgICAgIGlmIChtU2V0dGluZ3NCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVNldHRpbmdzQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtU2V0dGluZ3NCdXR0b25MaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgbVZpZGVvUXVhbGl0eUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQudmlkZW9fcXVhbGl0eSk7Ci0gICAgICAgIGlmIChtVmlkZW9RdWFsaXR5QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1WaWRlb1F1YWxpdHlCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1WaWRlb1F1YWxpdHlMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgbUFkUmVtYWluaW5nVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYWRfcmVtYWluaW5nKTsKLQotICAgICAgICAvLyBSZWxhdGluZyB0byBTZXR0aW5ncyBMaXN0IFZpZXcKLSAgICAgICAgaW5pdGlhbGl6ZVNldHRpbmdzTGlzdHMoKTsKLSAgICAgICAgbVNldHRpbmdzTGlzdFZpZXcgPSAoTGlzdFZpZXcpIEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgUi5sYXlvdXQuc2V0dGluZ3NfbGlzdCk7Ci0gICAgICAgIG1TZXR0aW5nc0FkYXB0ZXIgPSBuZXcgU2V0dGluZ3NBZGFwdGVyKG1TZXR0aW5nc01haW5UZXh0c0xpc3QsIG1TZXR0aW5nc1N1YlRleHRzTGlzdCwKLSAgICAgICAgICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdCk7Ci0gICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIgPSBuZXcgU3ViU2V0dGluZ3NBZGFwdGVyKG51bGwsIDApOwotICAgICAgICBtU2V0dGluZ3NMaXN0Vmlldy5zZXRBZGFwdGVyKG1TZXR0aW5nc0FkYXB0ZXIpOwotICAgICAgICBtU2V0dGluZ3NMaXN0Vmlldy5zZXRDaG9pY2VNb2RlKExpc3RWaWV3LkNIT0lDRV9NT0RFX1NJTkdMRSk7Ci0gICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobVNldHRpbmdzSXRlbUNsaWNrTGlzdGVuZXIpOwotCi0gICAgICAgIG1FbWJlZGRlZFNldHRpbmdzSXRlbVdpZHRoID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3dpZHRoKTsKLSAgICAgICAgbUZ1bGxTZXR0aW5nc0l0ZW1XaWR0aCA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9mdWxsX3NldHRpbmdzX3dpZHRoKTsKLSAgICAgICAgbUVtYmVkZGVkU2V0dGluZ3NJdGVtSGVpZ2h0ID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCk7Ci0gICAgICAgIG1GdWxsU2V0dGluZ3NJdGVtSGVpZ2h0ID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0KTsKLSAgICAgICAgbVNldHRpbmdzV2luZG93TWFyZ2luID0gKC0xKSAqIG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuZGltZW4ubWN2Ml9zZXR0aW5nc19vZmZzZXQpOwotICAgICAgICBtU2V0dGluZ3NXaW5kb3cgPSBuZXcgUG9wdXBXaW5kb3cobVNldHRpbmdzTGlzdFZpZXcsIG1FbWJlZGRlZFNldHRpbmdzSXRlbVdpZHRoLAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNhYmxlIHBhdXNlIG9yIHNlZWsgYnV0dG9ucyBpZiB0aGUgc3RyZWFtIGNhbm5vdCBiZSBwYXVzZWQgb3Igc2Vla2VkLgotICAgICAqIFRoaXMgcmVxdWlyZXMgdGhlIGNvbnRyb2wgaW50ZXJmYWNlIHRvIGJlIGEgTWVkaWFQbGF5ZXJDb250cm9sRXh0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobVBsYXlQYXVzZUJ1dHRvbiAhPSBudWxsICYmICFjYW5QYXVzZSgpKSB7Ci0gICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwgJiYgIWNhblNlZWtCYWNrd2FyZCgpKSB7Ci0gICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsICYmICFjYW5TZWVrRm9yd2FyZCgpKSB7Ci0gICAgICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUT0RPIFdoYXQgd2UgcmVhbGx5IHNob3VsZCBkbyBpcyBhZGQgYSBjYW5TZWVrIHRvIHRoZSBNZWRpYVBsYXllckNvbnRyb2wgaW50ZXJmYWNlOwotICAgICAgICAgICAgLy8gdGhpcyBzY2hlbWUgY2FuIGJyZWFrIHRoZSBjYXNlIHdoZW4gYXBwbGljYXRpb25zIHdhbnQgdG8gYWxsb3cgc2VlayB0aHJvdWdoIHRoZQotICAgICAgICAgICAgLy8gcHJvZ3Jlc3MgYmFyIGJ1dCBkaXNhYmxlIGZvcndhcmQvYmFja3dhcmQgYnV0dG9ucy4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBIb3dldmVyLCBjdXJyZW50bHkgdGhlIGZsYWdzIFNFRUtfQkFDS1dBUkRfQVZBSUxBQkxFLCBTRUVLX0ZPUldBUkRfQVZBSUxBQkxFLAotICAgICAgICAgICAgLy8gYW5kIFNFRUtfQVZBSUxBQkxFIGFyZSBhbGwgKHVuKXNldCB0b2dldGhlcjsgYXMgc3VjaCB0aGUgYWZvcmVtZW50aW9uZWQgaXNzdWUKLSAgICAgICAgICAgIC8vIHNob3VsZG4ndCBhcmlzZSBpbiBleGlzdGluZyBhcHBsaWNhdGlvbnMuCi0gICAgICAgICAgICBpZiAobVByb2dyZXNzICE9IG51bGwgJiYgIWNhblNlZWtCYWNrd2FyZCgpICYmICFjYW5TZWVrRm9yd2FyZCgpKSB7Ci0gICAgICAgICAgICAgICAgbVByb2dyZXNzLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yIGV4KSB7Ci0gICAgICAgICAgICAvLyBXZSB3ZXJlIGdpdmVuIGFuIG9sZCB2ZXJzaW9uIG9mIHRoZSBpbnRlcmZhY2UsIHRoYXQgZG9lc24ndCBoYXZlCi0gICAgICAgICAgICAvLyB0aGUgY2FuUGF1c2UvY2FuU2Vla1hZWiBtZXRob2RzLiBUaGlzIGlzIE9LLCBpdCBqdXN0IG1lYW5zIHdlCi0gICAgICAgICAgICAvLyBhc3N1bWUgdGhlIG1lZGlhIGNhbiBiZSBwYXVzZWQgYW5kIHNlZWtlZCwgYW5kIHNvIHdlIGRvbid0IGRpc2FibGUKLSAgICAgICAgICAgIC8vIHRoZSBidXR0b25zLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtVXBkYXRlUHJvZ3Jlc3MgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpbnQgcG9zID0gc2V0UHJvZ3Jlc3MoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNTaG93aW5nID0gbUluc3RhbmNlLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEU7Ci0gICAgICAgICAgICBpZiAoIW1EcmFnZ2luZyAmJiBpc1Nob3dpbmcgJiYgaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UucG9zdERlbGF5ZWQobVVwZGF0ZVByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9QUk9HUkVTU19VUERBVEVfVElNRV9NUyAtIChwb3MgJSBERUZBVUxUX1BST0dSRVNTX1VQREFURV9USU1FX01TKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3RyaW5nRm9yVGltZShpbnQgdGltZU1zKSB7Ci0gICAgICAgIGludCB0b3RhbFNlY29uZHMgPSB0aW1lTXMgLyAxMDAwOwotCi0gICAgICAgIGludCBzZWNvbmRzID0gdG90YWxTZWNvbmRzICUgNjA7Ci0gICAgICAgIGludCBtaW51dGVzID0gKHRvdGFsU2Vjb25kcyAvIDYwKSAlIDYwOwotICAgICAgICBpbnQgaG91cnMgPSB0b3RhbFNlY29uZHMgLyAzNjAwOwotCi0gICAgICAgIG1Gb3JtYXRCdWlsZGVyLnNldExlbmd0aCgwKTsKLSAgICAgICAgaWYgKGhvdXJzID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1Gb3JtYXR0ZXIuZm9ybWF0KCIlZDolMDJkOiUwMmQiLCBob3VycywgbWludXRlcywgc2Vjb25kcykudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtRm9ybWF0dGVyLmZvcm1hdCgiJTAyZDolMDJkIiwgbWludXRlcywgc2Vjb25kcykudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IHNldFByb2dyZXNzKCkgewotICAgICAgICBpZiAobUNvbnRyb2xsZXIgPT0gbnVsbCB8fCBtRHJhZ2dpbmcpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGludCBwb3NpdGlvbk9uUHJvZ3Jlc3NCYXIgPSAwOwotICAgICAgICBpbnQgY3VycmVudFBvc2l0aW9uID0gZ2V0Q3VycmVudFBvc2l0aW9uKCk7Ci0gICAgICAgIGlmIChtRHVyYXRpb24gPiAwKSB7Ci0gICAgICAgICAgICBwb3NpdGlvbk9uUHJvZ3Jlc3NCYXIgPSAoaW50KSAoTUFYX1BST0dSRVNTICogKGxvbmcpIGN1cnJlbnRQb3NpdGlvbiAvIG1EdXJhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Qcm9ncmVzcyAhPSBudWxsICYmIGN1cnJlbnRQb3NpdGlvbiAhPSBtRHVyYXRpb24pIHsKLSAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRQcm9ncmVzcyhwb3NpdGlvbk9uUHJvZ3Jlc3NCYXIpOwotICAgICAgICAgICAgLy8gSWYgdGhlIG1lZGlhIGlzIGEgbG9jYWwgZmlsZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBzZXQgYSBidWZmZXIsIHNvIHNldCBzZWNvbmRhcnkKLSAgICAgICAgICAgIC8vIHByb2dyZXNzIHRvIG1heGltdW0uCi0gICAgICAgICAgICBpZiAoZ2V0QnVmZmVyUGVyY2VudGFnZSgpIDwgMCkgewotICAgICAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRTZWNvbmRhcnlQcm9ncmVzcyhNQVhfUFJPR1JFU1MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0U2Vjb25kYXJ5UHJvZ3Jlc3MoZ2V0QnVmZmVyUGVyY2VudGFnZSgpICogMTApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1FbmRUaW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1FbmRUaW1lLnNldFRleHQoc3RyaW5nRm9yVGltZShtRHVyYXRpb24pKTsKLQotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ3VycmVudFRpbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgbUN1cnJlbnRUaW1lLnNldFRleHQoc3RyaW5nRm9yVGltZShjdXJyZW50UG9zaXRpb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSXNBZHZlcnRpc2VtZW50KSB7Ci0gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHJlbWFpbmluZyBudW1iZXIgb2Ygc2Vjb25kcyB1bnRpbCB0aGUgZmlyc3QgNSBzZWNvbmRzIG9mIHRoZQotICAgICAgICAgICAgLy8gYWR2ZXJ0aXNlbWVudC4KLSAgICAgICAgICAgIGlmIChtQWRTa2lwVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQb3NpdGlvbiA8PSBBRF9TS0lQX1dBSVRfVElNRV9NUykgewotICAgICAgICAgICAgICAgICAgICBpZiAobUFkU2tpcFZpZXcuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuR09ORSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBza2lwVGltZVRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hZF9za2lwX3dhaXRfdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEX1NLSVBfV0FJVF9USU1FX01TIC0gY3VycmVudFBvc2l0aW9uKSAvIDEwMDAgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1BZFNraXBWaWV3LnNldFRleHQoc2tpcFRpbWVUZXh0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAobUFkU2tpcFZpZXcuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0QnV0dG9uLmNsZWFyQ29sb3JGaWx0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIG51bWJlciBvZiBzZWNvbmRzIG9mIHRoZSBhZHZlcnRpc2VtZW50LgotICAgICAgICAgICAgaWYgKG1BZFJlbWFpbmluZ1ZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCByZW1haW5pbmdUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChtRHVyYXRpb24gLSBjdXJyZW50UG9zaXRpb24gPCAwKSA/IDAgOiAobUR1cmF0aW9uIC0gY3VycmVudFBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVtYWluaW5nVGltZVRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2FkX3JlbWFpbmluZ190aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nRm9yVGltZShyZW1haW5pbmdUaW1lKSk7Ci0gICAgICAgICAgICAgICAgbUFkUmVtYWluaW5nVmlldy5zZXRUZXh0KHJlbWFpbmluZ1RpbWVUZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3VycmVudFBvc2l0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0b2dnbGVQYXVzZVBsYXlTdGF0ZSgpIHsKLSAgICAgICAgaWYgKGlzUGxheWluZygpKSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMucGF1c2UoKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BsYXlfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcGxheV9idXR0b25fZGVzYykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNvbnRyb2xzLnBsYXkoKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BhdXNlX2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BhdXNlX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGVyZSBhcmUgdHdvIHNjZW5hcmlvcyB0aGF0IGNhbiB0cmlnZ2VyIHRoZSBzZWVrYmFyIGxpc3RlbmVyIHRvIHRyaWdnZXI6Ci0gICAgLy8KLSAgICAvLyBUaGUgZmlyc3QgaXMgdGhlIHVzZXIgdXNpbmcgdGhlIHRvdWNocGFkIHRvIGFkanVzdCB0aGUgcG9zaXRpdG9uIG9mIHRoZQotICAgIC8vIHNlZWtiYXIncyB0aHVtYi4gSW4gdGhpcyBjYXNlIG9uU3RhcnRUcmFja2luZ1RvdWNoIGlzIGNhbGxlZCBmb2xsb3dlZCBieQotICAgIC8vIGEgbnVtYmVyIG9mIG9uUHJvZ3Jlc3NDaGFuZ2VkIG5vdGlmaWNhdGlvbnMsIGNvbmNsdWRlZCBieSBvblN0b3BUcmFja2luZ1RvdWNoLgotICAgIC8vIFdlJ3JlIHNldHRpbmcgdGhlIGZpZWxkICJtRHJhZ2dpbmciIHRvIHRydWUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZHJhZ2dpbmcKLSAgICAvLyBzZXNzaW9uIHRvIGF2b2lkIGp1bXBzIGluIHRoZSBwb3NpdGlvbiBpbiBjYXNlIG9mIG9uZ29pbmcgcGxheWJhY2suCi0gICAgLy8KLSAgICAvLyBUaGUgc2Vjb25kIHNjZW5hcmlvIGludm9sdmVzIHRoZSB1c2VyIG9wZXJhdGluZyB0aGUgc2Nyb2xsIGJhbGwsIGluIHRoaXMKLSAgICAvLyBjYXNlIHRoZXJlIFdPTidUIEJFIG9uU3RhcnRUcmFja2luZ1RvdWNoL29uU3RvcFRyYWNraW5nVG91Y2ggbm90aWZpY2F0aW9ucywKLSAgICAvLyB3ZSB3aWxsIHNpbXBseSBhcHBseSB0aGUgdXBkYXRlZCBwb3NpdGlvbiB3aXRob3V0IHN1c3BlbmRpbmcgcmVndWxhciB1cGRhdGVzLgotICAgIHByaXZhdGUgZmluYWwgT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIgbVNlZWtMaXN0ZW5lciA9IG5ldyBPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgYmFyKSB7Ci0gICAgICAgICAgICBpZiAoIW1TZWVrQXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRHJhZ2dpbmcgPSB0cnVlOwotCi0gICAgICAgICAgICAvLyBCeSByZW1vdmluZyB0aGVzZSBwZW5kaW5nIHByb2dyZXNzIG1lc3NhZ2VzIHdlIG1ha2Ugc3VyZQotICAgICAgICAgICAgLy8gdGhhdCBhKSB3ZSB3b24ndCB1cGRhdGUgdGhlIHByb2dyZXNzIHdoaWxlIHRoZSB1c2VyIGFkanVzdHMKLSAgICAgICAgICAgIC8vIHRoZSBzZWVrYmFyIGFuZCBiKSBvbmNlIHRoZSB1c2VyIGlzIGRvbmUgZHJhZ2dpbmcgdGhlIHRodW1iCi0gICAgICAgICAgICAvLyB3ZSB3aWxsIHBvc3Qgb25lIG9mIHRoZXNlIG1lc3NhZ2VzIHRvIHRoZSBxdWV1ZSBhZ2FpbiBhbmQKLSAgICAgICAgICAgIC8vIHRoaXMgZW5zdXJlcyB0aGF0IHRoZXJlIHdpbGwgYmUgZXhhY3RseSBvbmUgbWVzc2FnZSBxdWV1ZWQgdXAuCi0gICAgICAgICAgICBtSW5zdGFuY2UucmVtb3ZlQ2FsbGJhY2tzKG1VcGRhdGVQcm9ncmVzcyk7Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHBsYXliYWNrIGlzIGN1cnJlbnRseSBzdG9wcGVkLiBJbiB0aGlzIGNhc2UsIHVwZGF0ZSB0aGUgcGF1c2UgYnV0dG9uIHRvCi0gICAgICAgICAgICAvLyBzaG93IHRoZSBwbGF5IGltYWdlIGluc3RlYWQgb2YgdGhlIHJlcGxheSBpbWFnZS4KLSAgICAgICAgICAgIGlmIChtSXNTdG9wcGVkKSB7Ci0gICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BsYXlfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOwotICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wbGF5X2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgbUlzU3RvcHBlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgYmFyLCBpbnQgcHJvZ3Jlc3MsIGJvb2xlYW4gZnJvbVVzZXIpIHsKLSAgICAgICAgICAgIGlmICghbVNlZWtBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWZyb21Vc2VyKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGludGVyZXN0ZWQgaW4gcHJvZ3JhbW1hdGljYWxseSBnZW5lcmF0ZWQgY2hhbmdlcyB0bwotICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9ncmVzcyBiYXIncyBwb3NpdGlvbi4KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUR1cmF0aW9uID4gMCkgewotICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IChpbnQpICgoKGxvbmcpIG1EdXJhdGlvbiAqIHByb2dyZXNzKSAvIE1BWF9QUk9HUkVTUyk7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xzLnNlZWtUbyhwb3NpdGlvbik7Ci0KLSAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRUaW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUaW1lLnNldFRleHQoc3RyaW5nRm9yVGltZShwb3NpdGlvbikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgYmFyKSB7Ci0gICAgICAgICAgICBpZiAoIW1TZWVrQXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbURyYWdnaW5nID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIHNldFByb2dyZXNzKCk7Ci0KLSAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHByb2dyZXNzIGlzIHByb3Blcmx5IHVwZGF0ZWQgaW4gdGhlIGZ1dHVyZSwKLSAgICAgICAgICAgIC8vIHRoZSBjYWxsIHRvIHNob3coKSBkb2VzIG5vdCBndWFyYW50ZWUgdGhpcyBiZWNhdXNlIGl0IGlzIGEKLSAgICAgICAgICAgIC8vIG5vLW9wIGlmIHdlIGFyZSBhbHJlYWR5IHNob3dpbmcuCi0gICAgICAgICAgICBtSW5zdGFuY2UucG9zdChtVXBkYXRlUHJvZ3Jlc3MpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVBsYXlQYXVzZUxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIHRvZ2dsZVBhdXNlUGxheVN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtUmV3TGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgaW50IHBvcyA9IGdldEN1cnJlbnRQb3NpdGlvbigpIC0gUkVXSU5EX1RJTUVfTVM7Ci0gICAgICAgICAgICBtQ29udHJvbHMuc2Vla1RvKHBvcyk7Ci0gICAgICAgICAgICBzZXRQcm9ncmVzcygpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUZmd2RMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBpbnQgcG9zID0gZ2V0Q3VycmVudFBvc2l0aW9uKCkgKyBGT1JXQVJEX1RJTUVfTVM7Ci0gICAgICAgICAgICBtQ29udHJvbHMuc2Vla1RvKHBvcyk7Ci0gICAgICAgICAgICBzZXRQcm9ncmVzcygpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbU5leHRMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMuc2tpcFRvTmV4dCgpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVByZXZMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMuc2tpcFRvUHJldmlvdXMoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1CYWNrTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtU3VidGl0bGVMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtU2V0dGluZ3NNb2RlID0gU0VUVElOR1NfTU9ERV9TVUJUSVRMRV9UUkFDSzsKLSAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0VGV4dHMobVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdCk7Ci0gICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldENoZWNrUG9zaXRpb24obVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KTsKLSAgICAgICAgICAgIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhtU3ViU2V0dGluZ3NBZGFwdGVyKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1WaWRlb1F1YWxpdHlMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtU2V0dGluZ3NNb2RlID0gU0VUVElOR1NfTU9ERV9WSURFT19RVUFMSVRZOwotICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRUZXh0cyhtVmlkZW9RdWFsaXR5TGlzdCk7Ci0gICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldENoZWNrUG9zaXRpb24obVNlbGVjdGVkVmlkZW9RdWFsaXR5SW5kZXgpOwotICAgICAgICAgICAgZGlzcGxheVNldHRpbmdzV2luZG93KG1TdWJTZXR0aW5nc0FkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUZ1bGxTY3JlZW5MaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzRW50ZXJpbmdGdWxsU2NyZWVuID0gIW1Jc0Z1bGxTY3JlZW47Ci0gICAgICAgICAgICAvLyBUT0RPOiBSZS1hcnJhbmdlIHRoZSBidXR0b24gbGF5b3V0cyBhY2NvcmRpbmcgdG8gdGhlIFVYLgotICAgICAgICAgICAgaWYgKGlzRW50ZXJpbmdGdWxsU2NyZWVuKSB7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19mdWxsc2NyZWVuX2V4aXQsIG51bGwpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19mdWxsc2NyZWVuLCBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGFyZ3MucHV0Qm9vbGVhbihBUkdVTUVOVF9LRVlfRlVMTFNDUkVFTiwgaXNFbnRlcmluZ0Z1bGxTY3JlZW4pOwotICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9TRVRfRlVMTFNDUkVFTiwgYXJncywgbnVsbCk7Ci0KLSAgICAgICAgICAgIG1Jc0Z1bGxTY3JlZW4gPSBpc0VudGVyaW5nRnVsbFNjcmVlbjsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1PdmVyZmxvd1JpZ2h0TGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbUJhc2ljQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUV4dHJhQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbU92ZXJmbG93TGVmdExpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1CYXNpY0NvbnRyb2xzLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1FeHRyYUNvbnRyb2xzLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1NdXRlQnV0dG9uTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgaWYgKCFtSXNNdXRlKSB7Ci0gICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19tdXRlLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9tdXRlZF9idXR0b25fZGVzYykpOwotICAgICAgICAgICAgICAgIG1Jc011dGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfTVVURSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1NdXRlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfdW5tdXRlLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml91bm11dGVkX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgbUlzTXV0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfVU5NVVRFLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1TZXR0aW5nc0J1dHRvbkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX01BSU47Ci0gICAgICAgICAgICBtU2V0dGluZ3NBZGFwdGVyLnNldFN1YlRleHRzKG1TZXR0aW5nc1N1YlRleHRzTGlzdCk7Ci0gICAgICAgICAgICBkaXNwbGF5U2V0dGluZ3NXaW5kb3cobVNldHRpbmdzQWRhcHRlcik7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIG1TZXR0aW5nc0l0ZW1DbGlja0xpc3RlbmVyCi0gICAgICAgICAgICA9IG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgewotICAgICAgICAgICAgc3dpdGNoIChtU2V0dGluZ3NNb2RlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRUSU5HU19NT0RFX01BSU46Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA9PSBTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldFRleHRzKG1BdWRpb1RyYWNrTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldENoZWNrUG9zaXRpb24obVNlbGVjdGVkQXVkaW9UcmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09IFNFVFRJTkdTX01PREVfUExBWUJBQ0tfU1BFRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0VGV4dHMobVBsYXliYWNrU3BlZWRUZXh0TGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldENoZWNrUG9zaXRpb24obVNlbGVjdGVkU3BlZWRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NNb2RlID0gU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PSBTRVRUSU5HU19NT0RFX0hFTFApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgotICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkaXNwbGF5U2V0dGluZ3NXaW5kb3cobVN1YlNldHRpbmdzQWRhcHRlcik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9BVURJT19UUkFDSzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4ID0gcG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvVHJhY2tDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEucHV0SW50KEtFWV9TRUxFQ1RFRF9BVURJT19JTkRFWCwgcG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfU0VMRUNUX0FVRElPX1RSQUNLLCBleHRyYSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3Quc2V0KFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuZ2V0TWFpblRleHQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfUExBWUJBQ0tfU1BFRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPSBtU2VsZWN0ZWRTcGVlZEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRTcGVlZEluZGV4ID0gcG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYS5wdXRGbG9hdChLRVlfUExBWUJBQ0tfU1BFRUQsIG1QbGF5YmFja1NwZWVkTGlzdC5nZXQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfU0VUX1BMQVlCQUNLX1NQRUVELCBleHRyYSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3Quc2V0KFNFVFRJTkdTX01PREVfUExBWUJBQ0tfU1BFRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuZ2V0TWFpblRleHQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfSEVMUDoKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9TVUJUSVRMRV9UUkFDSzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ID0gcG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGV4dHJhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLnB1dEludChLRVlfU0VMRUNURURfU1VCVElUTEVfSU5ERVgsIHBvc2l0aW9uIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TSE9XX1NVQlRJVExFLCBleHRyYSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfc3VidGl0bGVfb24sIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9jY19pc19vbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUlzRW5hYmxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfSElERV9TVUJUSVRMRSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfc3VidGl0bGVfb2ZmLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfY2NfaXNfb2ZmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVJc0VuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfVklERU9fUVVBTElUWToKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIHZpZGVvIHF1YWxpdHkKLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkVmlkZW9RdWFsaXR5SW5kZXggPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUR1cmF0aW9uKCkgewotICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtTWV0YWRhdGEuY29udGFpbnNLZXkoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfRFVSQVRJT04pKSB7Ci0gICAgICAgICAgICAgICAgbUR1cmF0aW9uID0gKGludCkgbU1ldGFkYXRhLmdldExvbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfRFVSQVRJT04pOwotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBwcm9ncmVzcyBiYXIKLSAgICAgICAgICAgICAgICBzZXRQcm9ncmVzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVRpdGxlKCkgewotICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtTWV0YWRhdGEuY29udGFpbnNLZXkoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUpKSB7Ci0gICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KG1NZXRhZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoZSB0aXRsZSBiYXIgaXMgbWFkZSB1cCBvZiB0d28gc2VwYXJhdGUgTGluZWFyTGF5b3V0cy4gSWYgdGhlIHN1bSBvZiB0aGUgdHdvIGJhcnMgYXJlCi0gICAgLy8gZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHRpdGxlIGJhciwgcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBsZWZ0IGJhciAod2hpY2ggbWFrZXMgdGhlCi0gICAgLy8gVGV4dFZpZXcgdGhhdCBjb250YWlucyB0aGUgdGl0bGUgb2YgdGhlIG1lZGlhIGZpbGUgc2hyaW5rKS4KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVGl0bGVCYXJMYXlvdXQoKSB7Ci0gICAgICAgIGlmIChtVGl0bGVCYXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHRpdGxlQmFyV2lkdGggPSBtVGl0bGVCYXIuZ2V0V2lkdGgoKTsKLQotICAgICAgICAgICAgVmlldyBsZWZ0QmFyID0gbVRpdGxlQmFyLmZpbmRWaWV3QnlJZChSLmlkLnRpdGxlX2Jhcl9sZWZ0KTsKLSAgICAgICAgICAgIFZpZXcgcmlnaHRCYXIgPSBtVGl0bGVCYXIuZmluZFZpZXdCeUlkKFIuaWQudGl0bGVfYmFyX3JpZ2h0KTsKLSAgICAgICAgICAgIGludCBsZWZ0QmFyV2lkdGggPSBsZWZ0QmFyLmdldFdpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgcmlnaHRCYXJXaWR0aCA9IHJpZ2h0QmFyLmdldFdpZHRoKCk7Ci0KLSAgICAgICAgICAgIFJlbGF0aXZlTGF5b3V0LkxheW91dFBhcmFtcyBwYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICAoUmVsYXRpdmVMYXlvdXQuTGF5b3V0UGFyYW1zKSBsZWZ0QmFyLmdldExheW91dFBhcmFtcygpOwotICAgICAgICAgICAgaWYgKGxlZnRCYXJXaWR0aCArIHJpZ2h0QmFyV2lkdGggPiB0aXRsZUJhcldpZHRoKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1zLndpZHRoID0gdGl0bGVCYXJXaWR0aCAtIHJpZ2h0QmFyV2lkdGg7Ci0gICAgICAgICAgICAgICAgbU9yaWdpbmFsTGVmdEJhcldpZHRoID0gbGVmdEJhcldpZHRoOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsZWZ0QmFyV2lkdGggKyByaWdodEJhcldpZHRoIDwgdGl0bGVCYXJXaWR0aCAmJiBtT3JpZ2luYWxMZWZ0QmFyV2lkdGggIT0gMCkgewotICAgICAgICAgICAgICAgIHBhcmFtcy53aWR0aCA9IG1PcmlnaW5hbExlZnRCYXJXaWR0aDsKLSAgICAgICAgICAgICAgICBtT3JpZ2luYWxMZWZ0QmFyV2lkdGggPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGVmdEJhci5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVBdWRpb01ldGFkYXRhKCkgewotICAgICAgICBpZiAobU1lZGlhVHlwZSAhPSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZVRleHQgPSAiIjsKLSAgICAgICAgICAgIFN0cmluZyBhcnRpc3RUZXh0ID0gIiI7Ci0gICAgICAgICAgICBpZiAobU1ldGFkYXRhLmNvbnRhaW5zS2V5KE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX1RJVExFKSkgewotICAgICAgICAgICAgICAgIHRpdGxlVGV4dCA9IG1NZXRhZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aXRsZVRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtTWV0YWRhdGEuY29udGFpbnNLZXkoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfQVJUSVNUKSkgewotICAgICAgICAgICAgICAgIGFydGlzdFRleHQgPSBtTWV0YWRhdGEuZ2V0U3RyaW5nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0FSVElTVCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFydGlzdFRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVcGRhdGUgdGl0bGUgZm9yIEVtYmVkZGVkIHNpemUgdHlwZQotICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KHRpdGxlVGV4dCArICIgLSAiICsgYXJ0aXN0VGV4dCk7Ci0KLSAgICAgICAgICAgIC8vIFNldCB0byB0cnVlIHRvIHVwZGF0ZSBsYXlvdXQgaW5zaWRlIG9uTWVhc3VyZSgpCi0gICAgICAgICAgICBtTmVlZFVYVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVMYXlvdXQoKSB7Ci0gICAgICAgIGlmIChtSXNBZHZlcnRpc2VtZW50KSB7Ci0gICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1UaW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgIG1BZFNraXBWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1BZFJlbWFpbmluZ1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbUFkRXh0ZXJuYWxMaW5rLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLQotICAgICAgICAgICAgbVByb2dyZXNzLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRDb2xvckZpbHRlcihSLmNvbG9yLmdyYXkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtUHJldkJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtVGltZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICBtQWRTa2lwVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtQWRSZW1haW5pbmdWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1BZEV4dGVybmFsTGluay5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIG1OZXh0QnV0dG9uLmNsZWFyQ29sb3JGaWx0ZXIoKTsKLSAgICAgICAgICAgIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVMYXlvdXQoaW50IG1heEljb25Db3VudCwgaW50IGZ1bGxJY29uU2l6ZSwgaW50IGVtYmVkZGVkSWNvblNpemUsCi0gICAgICAgICAgICAgaW50IG1hcmdpblNpemUsIGludCBjdXJyV2lkdGgsIGludCBjdXJySGVpZ2h0LCBpbnQgc2NyZWVuV2lkdGgsIGludCBzY3JlZW5IZWlnaHQpIHsKLSAgICAgICAgaW50IGZ1bGxCb3R0b21CYXJSaWdodFdpZHRoTWF4ID0gZnVsbEljb25TaXplICogbWF4SWNvbkNvdW50Ci0gICAgICAgICAgICAgICAgKyBtYXJnaW5TaXplICogKG1heEljb25Db3VudCAqIDIpOwotICAgICAgICBpbnQgZW1iZWRkZWRCb3R0b21CYXJSaWdodFdpZHRoTWF4ID0gZW1iZWRkZWRJY29uU2l6ZSAqIG1heEljb25Db3VudAotICAgICAgICAgICAgICAgICsgbWFyZ2luU2l6ZSAqIChtYXhJY29uQ291bnQgKiAyKTsKLSAgICAgICAgaW50IGZ1bGxXaWR0aCA9IG1UcmFuc3BvcnRDb250cm9scy5nZXRXaWR0aCgpICsgbVRpbWVWaWV3LmdldFdpZHRoKCkKLSAgICAgICAgICAgICAgICArIGZ1bGxCb3R0b21CYXJSaWdodFdpZHRoTWF4OwotICAgICAgICBpbnQgZW1iZWRkZWRXaWR0aCA9IG1UaW1lVmlldy5nZXRXaWR0aCgpICsgZW1iZWRkZWRCb3R0b21CYXJSaWdodFdpZHRoTWF4OwotICAgICAgICBpbnQgc2NyZWVuTWF4TGVuZ3RoID0gTWF0aC5tYXgoc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodCk7Ci0KLSAgICAgICAgaWYgKGZ1bGxXaWR0aCA+IHNjcmVlbk1heExlbmd0aCkgewotICAgICAgICAgICAgLy8gVE9ETzogc2NyZWVuIG1heSBiZSBzbWFsbGVyIHRoYW4gdGhlIGxlbmd0aCBuZWVkZWQgZm9yIEZ1bGwgc2l6ZS4KLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNGdWxsU2l6ZSA9IChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfREVGQVVMVCkgPyAoY3VycldpZHRoID09IHNjcmVlbk1heExlbmd0aCkgOgotICAgICAgICAgICAgICAgIChjdXJyV2lkdGggPT0gc2NyZWVuV2lkdGggJiYgY3VyckhlaWdodCA9PSBzY3JlZW5IZWlnaHQpOwotCi0gICAgICAgIGlmIChpc0Z1bGxTaXplKSB7Ci0gICAgICAgICAgICBpZiAobVNpemVUeXBlICE9IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0Rm9yU2l6ZUNoYW5nZShTSVpFX1RZUEVfRlVMTCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZW1iZWRkZWRXaWR0aCA8PSBjdXJyV2lkdGgpIHsKLSAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0VNQkVEREVEKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0Rm9yU2l6ZUNoYW5nZShTSVpFX1RZUEVfRU1CRURERUQpOwotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfTUlOSU1BTCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dEZvclNpemVDaGFuZ2UoU0laRV9UWVBFX01JTklNQUwpOwotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxheW91dEZvclNpemVDaGFuZ2UoaW50IHNpemVUeXBlKSB7Ci0gICAgICAgIG1TaXplVHlwZSA9IHNpemVUeXBlOwotICAgICAgICBSZWxhdGl2ZUxheW91dC5MYXlvdXRQYXJhbXMgdGltZVZpZXdQYXJhbXMgPQotICAgICAgICAgICAgICAgIChSZWxhdGl2ZUxheW91dC5MYXlvdXRQYXJhbXMpIG1UaW1lVmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgU2Vla0JhciBzZWVrZXIgPSAoU2Vla0JhcikgbVByb2dyZXNzOwotICAgICAgICBzd2l0Y2ggKG1TaXplVHlwZSkgewotICAgICAgICAgICAgY2FzZSBTSVpFX1RZUEVfRU1CRURERUQ6Ci0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyCi0gICAgICAgICAgICAgICAgbVRpdGxlQmFyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtQmFja0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBGdWxsIFNjcmVlbiBCdXR0b24KLSAgICAgICAgICAgICAgICBtTWluaW1hbEV4dHJhVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24gPSBtQm90dG9tQmFyUmlnaHRWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmZ1bGxzY3JlZW4pOwotICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRnVsbFNjcmVlbkxpc3RlbmVyKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3Ci0gICAgICAgICAgICAgICAgbUNlbnRlclZpZXcucmVtb3ZlQWxsVmlld3MoKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcucmVtb3ZlVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKFIubGF5b3V0LmVtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbUNlbnRlclZpZXcuYWRkVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyCi0gICAgICAgICAgICAgICAgc2Vla2VyLnNldFRodW1iKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5jdXN0b21fcHJvZ3Jlc3NfdGh1bWIpKTsKLSAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NCdWZmZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhcgotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIGlmICh0aW1lVmlld1BhcmFtcy5nZXRSdWxlKFJlbGF0aXZlTGF5b3V0LkxFRlRfT0YpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGltZVZpZXdQYXJhbXMucmVtb3ZlUnVsZShSZWxhdGl2ZUxheW91dC5MRUZUX09GKTsKLSAgICAgICAgICAgICAgICAgICAgdGltZVZpZXdQYXJhbXMuYWRkUnVsZShSZWxhdGl2ZUxheW91dC5SSUdIVF9PRiwgUi5pZC5ib3R0b21fYmFyX2xlZnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU0laRV9UWVBFX0ZVTEw6Ci0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyCi0gICAgICAgICAgICAgICAgbVRpdGxlQmFyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtQmFja0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBGdWxsIFNjcmVlbiBCdXR0b24KLSAgICAgICAgICAgICAgICBtTWluaW1hbEV4dHJhVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24gPSBtQm90dG9tQmFyUmlnaHRWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmZ1bGxzY3JlZW4pOwotICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRnVsbFNjcmVlbkxpc3RlbmVyKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3Ci0gICAgICAgICAgICAgICAgbUNlbnRlclZpZXcucmVtb3ZlQWxsVmlld3MoKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcucmVtb3ZlVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOwotICAgICAgICAgICAgICAgIG1UcmFuc3BvcnRDb250cm9scyA9IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhSLmxheW91dC5mdWxsX3RyYW5zcG9ydF9jb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbUJvdHRvbUJhckxlZnRWaWV3LmFkZFZpZXcobVRyYW5zcG9ydENvbnRyb2xzLCAwKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyCi0gICAgICAgICAgICAgICAgc2Vla2VyLnNldFRodW1iKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5jdXN0b21fcHJvZ3Jlc3NfdGh1bWIpKTsKLSAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NCdWZmZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhcgotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIGlmICh0aW1lVmlld1BhcmFtcy5nZXRSdWxlKFJlbGF0aXZlTGF5b3V0LlJJR0hUX09GKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVWaWV3UGFyYW1zLnJlbW92ZVJ1bGUoUmVsYXRpdmVMYXlvdXQuUklHSFRfT0YpOwotICAgICAgICAgICAgICAgICAgICB0aW1lVmlld1BhcmFtcy5hZGRSdWxlKFJlbGF0aXZlTGF5b3V0LkxFRlRfT0YsIFIuaWQuYm90dG9tX2Jhcl9yaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTSVpFX1RZUEVfTUlOSU1BTDoKLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBUaXRsZSBCYXIKLSAgICAgICAgICAgICAgICBtVGl0bGVCYXIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEZ1bGwgU2NyZWVuIEJ1dHRvbgotICAgICAgICAgICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbiA9IG1NaW5pbWFsRXh0cmFWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmZ1bGxzY3JlZW4pOwotICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRnVsbFNjcmVlbkxpc3RlbmVyKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3Ci0gICAgICAgICAgICAgICAgbUNlbnRlclZpZXcucmVtb3ZlQWxsVmlld3MoKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcucmVtb3ZlVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOwotICAgICAgICAgICAgICAgIG1UcmFuc3BvcnRDb250cm9scyA9IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhSLmxheW91dC5taW5pbWFsX3RyYW5zcG9ydF9jb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbUNlbnRlclZpZXcuYWRkVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyCi0gICAgICAgICAgICAgICAgc2Vla2VyLnNldFRodW1iKG51bGwpOwotICAgICAgICAgICAgICAgIG1Qcm9ncmVzc0J1ZmZlci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyCi0gICAgICAgICAgICAgICAgbUJvdHRvbUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbVRpbWVWaWV3LnNldExheW91dFBhcmFtcyh0aW1lVmlld1BhcmFtcyk7Ci0KLSAgICAgICAgaWYgKGlzUGxheWluZygpKSB7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wYXVzZV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wYXVzZV9idXR0b25fZGVzYykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wbGF5X2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUlzRnVsbFNjcmVlbikgewotICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2Z1bGxzY3JlZW5fZXhpdCwgbnVsbCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2Z1bGxzY3JlZW4sIG51bGwpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgVmlldyBpbmZsYXRlVHJhbnNwb3J0Q29udHJvbHMoaW50IGxheW91dElkKSB7Ci0gICAgICAgIFZpZXcgdiA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIGxheW91dElkKTsKLSAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQucGF1c2UpOwotICAgICAgICBpZiAobVBsYXlQYXVzZUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnJlcXVlc3RGb2N1cygpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVBsYXlQYXVzZUxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtRmZ3ZEJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQuZmZ3ZCk7Ci0gICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUZmd2RMaXN0ZW5lcik7Ci0gICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1SZXdCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnJldyk7Ci0gICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1SZXdMaXN0ZW5lcik7Ci0gICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETzogQWRkIHN1cHBvcnQgZm9yIE5leHQgYW5kIFByZXZpb3VzIGJ1dHRvbnMKLSAgICAgICAgbU5leHRCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLm5leHQpOwotICAgICAgICBpZiAobU5leHRCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1OZXh0TGlzdGVuZXIpOwotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgICAgIG1QcmV2QnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5wcmV2KTsKLSAgICAgICAgaWYgKG1QcmV2QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtUHJldkxpc3RlbmVyKTsKLSAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVNldHRpbmdzTGlzdHMoKSB7Ci0gICAgICAgIG1TZXR0aW5nc01haW5UZXh0c0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgbVNldHRpbmdzTWFpblRleHRzTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfdGV4dCkpOwotICAgICAgICBtU2V0dGluZ3NNYWluVGV4dHNMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9wbGF5YmFja19zcGVlZF90ZXh0KSk7Ci0gICAgICAgIG1TZXR0aW5nc01haW5UZXh0c0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2hlbHBfdGV4dCkpOwotCi0gICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX25vbmVfdGV4dCkpOwotICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nQXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmFycmF5Lk1lZGlhQ29udHJvbFZpZXcyX3BsYXliYWNrX3NwZWVkcylbUExBWUJBQ0tfU1BFRURfMXhfSU5ERVhdKTsKLSAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0LmFkZChSRVNPVVJDRV9FTVBUWSk7Ci0KLSAgICAgICAgbVNldHRpbmdzSWNvbklkc0xpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0gICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0LmFkZChSLmRyYXdhYmxlLmljX2F1ZGlvdHJhY2spOwotICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdC5hZGQoUi5kcmF3YWJsZS5pY19wbGF5X2NpcmNsZV9maWxsZWQpOwotICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdC5hZGQoUi5kcmF3YWJsZS5pY19oZWxwKTsKLQotICAgICAgICBtQXVkaW9UcmFja0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgbUF1ZGlvVHJhY2tMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19ub25lX3RleHQpKTsKLQotICAgICAgICBtVmlkZW9RdWFsaXR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBtVmlkZW9RdWFsaXR5TGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfdmlkZW9fcXVhbGl0eV9hdXRvX3RleHQpKTsKLQotICAgICAgICBtUGxheWJhY2tTcGVlZFRleHRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmdBcnJheShSLmFycmF5Lk1lZGlhQ29udHJvbFZpZXcyX3BsYXliYWNrX3NwZWVkcykpKTsKLSAgICAgICAgLy8gU2VsZWN0IHRoZSAiMXgiIHNwZWVkIGFzIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAgICBtU2VsZWN0ZWRTcGVlZEluZGV4ID0gUExBWUJBQ0tfU1BFRURfMXhfSU5ERVg7Ci0KLSAgICAgICAgbVBsYXliYWNrU3BlZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxGbG9hdD4oKTsKLSAgICAgICAgaW50W10gc3BlZWRzID0gbVJlc291cmNlcy5nZXRJbnRBcnJheShSLmFycmF5LnNwZWVkX211bHRpcGxpZWRfYnlfMTAwKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVlZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZsb2F0IHNwZWVkID0gKGZsb2F0KSBzcGVlZHNbaV0gLyAxMDAuMGY7Ci0gICAgICAgICAgICBtUGxheWJhY2tTcGVlZExpc3QuYWRkKHNwZWVkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkaXNwbGF5U2V0dGluZ3NXaW5kb3coQmFzZUFkYXB0ZXIgYWRhcHRlcikgewotICAgICAgICAvLyBTZXQgQWRhcHRlcgotICAgICAgICBtU2V0dGluZ3NMaXN0Vmlldy5zZXRBZGFwdGVyKGFkYXB0ZXIpOwotCi0gICAgICAgIC8vIFNldCB3aWR0aCBvZiB3aW5kb3cKLSAgICAgICAgaW50IGl0ZW1XaWR0aCA9IChtU2l6ZVR5cGUgPT0gU0laRV9UWVBFX0VNQkVEREVEKQotICAgICAgICAgICAgICAgID8gbUVtYmVkZGVkU2V0dGluZ3NJdGVtV2lkdGggOiBtRnVsbFNldHRpbmdzSXRlbVdpZHRoOwotICAgICAgICBtU2V0dGluZ3NXaW5kb3cuc2V0V2lkdGgoaXRlbVdpZHRoKTsKLQotICAgICAgICAvLyBDYWxjdWxhdGUgaGVpZ2h0IG9mIHdpbmRvdyBhbmQgc2hvdwotICAgICAgICBpbnQgaXRlbUhlaWdodCA9IChtU2l6ZVR5cGUgPT0gU0laRV9UWVBFX0VNQkVEREVEKQotICAgICAgICAgICAgICAgID8gbUVtYmVkZGVkU2V0dGluZ3NJdGVtSGVpZ2h0IDogbUZ1bGxTZXR0aW5nc0l0ZW1IZWlnaHQ7Ci0gICAgICAgIGludCB0b3RhbEhlaWdodCA9IGFkYXB0ZXIuZ2V0Q291bnQoKSAqIGl0ZW1IZWlnaHQ7Ci0gICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0gICAgICAgIG1TZXR0aW5nc1dpbmRvdy5zaG93QXNEcm9wRG93bihtSW5zdGFuY2UsIG1TZXR0aW5nc1dpbmRvd01hcmdpbiwKLSAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3dNYXJnaW4gLSB0b3RhbEhlaWdodCwgR3Jhdml0eS5CT1RUT00gfCBHcmF2aXR5LlJJR0hUKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIE1lZGlhQ29udHJvbGxlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFDb250cm9sbGVyLkNhbGxiYWNrIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWJhY2tTdGF0ZUNoYW5nZWQoUGxheWJhY2tTdGF0ZSBzdGF0ZSkgewotICAgICAgICAgICAgbVBsYXliYWNrU3RhdGUgPSBzdGF0ZTsKLQotICAgICAgICAgICAgLy8gVXBkYXRlIHBhdXNlIGJ1dHRvbiBkZXBlbmRpbmcgb24gcGxheWJhY2sgc3RhdGUgZm9yIHRoZSBmb2xsb3dpbmcgdHdvIHJlYXNvbnM6Ci0gICAgICAgICAgICAvLyAgIDEpIE5lZWQgdG8gaGFuZGxlIGNhc2Ugd2hlcmUgYXBwIGN1c3RvbWl6ZXMgcGxheWJhY2sgc3RhdGUgYmVoYXZpb3Igd2hlbiBhcHAKLSAgICAgICAgICAgIC8vICAgICAgYWN0aXZpdHkgaXMgcmVzdW1lZC4KLSAgICAgICAgICAgIC8vICAgMikgTmVlZCB0byBoYW5kbGUgY2FzZSB3aGVyZSB0aGUgbWVkaWEgZmlsZSByZWFjaGVzIGVuZCBvZiBkdXJhdGlvbi4KLSAgICAgICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZS5nZXRTdGF0ZSgpICE9IG1QcmV2U3RhdGUpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1QbGF5YmFja1N0YXRlLmdldFN0YXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wYXVzZV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wYXVzZV9idXR0b25fZGVzYykpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlbW92ZUNhbGxiYWNrcyhtVXBkYXRlUHJvZ3Jlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnBvc3QobVVwZGF0ZVByb2dyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wbGF5X2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBQbGF5YmFja1N0YXRlLlNUQVRFX1NUT1BQRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19yZXBsYXlfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcmVwbGF5X2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSXNTdG9wcGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QcmV2U3RhdGUgPSBtUGxheWJhY2tTdGF0ZS5nZXRTdGF0ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVBsYXliYWNrQWN0aW9ucyAhPSBtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCkpIHsKLSAgICAgICAgICAgICAgICBsb25nIG5ld0FjdGlvbnMgPSBtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCk7Ci0gICAgICAgICAgICAgICAgaWYgKChuZXdBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0UpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgobmV3QWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORCkgIT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU1lZGlhVHlwZSAhPSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgobmV3QWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX0ZBU1RfRk9SV0FSRCkgIT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU1lZGlhVHlwZSAhPSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChuZXdBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fU0VFS19UTykgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtU2Vla0F2YWlsYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVNlZWtBdmFpbGFibGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrQWN0aW9ucyA9IG5ld0FjdGlvbnM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCBidXR0b25zIGlmIGN1c3RvbSBhY3Rpb25zIGFyZSBwcmVzZW50LgotICAgICAgICAgICAgTGlzdDxQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbj4gY3VzdG9tQWN0aW9ucyA9IG1QbGF5YmFja1N0YXRlLmdldEN1c3RvbUFjdGlvbnMoKTsKLSAgICAgICAgICAgIG1DdXN0b21CdXR0b25zLnJlbW92ZUFsbFZpZXdzKCk7Ci0gICAgICAgICAgICBpZiAoY3VzdG9tQWN0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbiBhY3Rpb24gOiBjdXN0b21BY3Rpb25zKSB7Ci0gICAgICAgICAgICAgICAgICAgIEltYWdlQnV0dG9uIGJ1dHRvbiA9IG5ldyBJbWFnZUJ1dHRvbihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogQXR0cmlidXRlU2V0ICovLCAwIC8qIFN0eWxlICovKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQXBwbHkgUi5zdHlsZS5Cb3R0b21CYXJCdXR0b24gdG8gdGhpcyBidXR0b24gdXNpbmcgbGlicmFyeSBjb250ZXh0LgotICAgICAgICAgICAgICAgICAgICAvLyBSZWZlciBDb25zdHJ1Y3RvciB3aXRoIGFyZ3VtZW50IChpbnQgZGVmU3R5bGVSZXMpIG9mIFZpZXcuamF2YQotICAgICAgICAgICAgICAgICAgICBidXR0b24uc2V0SW1hZ2VSZXNvdXJjZShhY3Rpb24uZ2V0SWNvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldFRvb2x0aXBUZXh0KGFjdGlvbi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uU3RyaW5nID0gYWN0aW9uLmdldEFjdGlvbigpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEN1cnJlbnRseSwgd2UgYXJlIGp1c3Qgc2VuZGluZyBleHRyYXMgdGhhdCBjYW1lIGZyb20gc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyBpdCB0aGUgcmlnaHQgYmVoYXZpb3I/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xzLnNlbmRDdXN0b21BY3Rpb24oYWN0aW9uU3RyaW5nLCBhY3Rpb24uZ2V0RXh0cmFzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICBtQ3VzdG9tQnV0dG9ucy5hZGRWaWV3KGJ1dHRvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uTWV0YWRhdGFDaGFuZ2VkKE1lZGlhTWV0YWRhdGEgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICAgICAgdXBkYXRlRHVyYXRpb24oKTsKLSAgICAgICAgICAgIHVwZGF0ZVRpdGxlKCk7Ci0gICAgICAgICAgICB1cGRhdGVBdWRpb01ldGFkYXRhKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uRXZlbnQoU3RyaW5nIGV2ZW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9VUERBVEVfVFJBQ0tfU1RBVFVTOgotICAgICAgICAgICAgICAgICAgICBtVmlkZW9UcmFja0NvdW50ID0gZXh0cmFzLmdldEludChLRVlfVklERU9fVFJBQ0tfQ09VTlQpOwotICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBvbmUgb3IgbW9yZSBhdWRpbyB0cmFja3MsIGFuZCB0aGlzIGluZm9ybWF0aW9uIGhhcyBub3QgYmVlbgotICAgICAgICAgICAgICAgICAgICAvLyByZWZsZWN0ZWQgaW50byB0aGUgU2V0dGluZ3Mgd2luZG93IHlldCwgYXV0b21hdGljYWxseSBjaGVjayB0aGUgZmlyc3QgdHJhY2suCi0gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIEF1ZGlvIFRyYWNrIHNlbGVjdGlvbiB3aWxsIGJlIGRlZmF1bHRlZCB0byAiTm9uZSIuCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ291bnQgPSBleHRyYXMuZ2V0SW50KEtFWV9BVURJT19UUkFDS19DT1VOVCk7Ci0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvVHJhY2tDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZCBtb3JlIHRleHQgYWJvdXQgdHJhY2sgaW5mby4KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUF1ZGlvVHJhY2tDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRyYWNrID0gbVJlc291cmNlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19udW1iZXJfdGV4dCwgaSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrTGlzdC5hZGQodHJhY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hhbmdlIHN1YiB0ZXh0IGluc2lkZSB0aGUgU2V0dGluZ3Mgd2luZG93LgotICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0LnNldChTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9UcmFja0xpc3QuZ2V0KDApKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrTGlzdC5hZGQobVJlc291cmNlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX25vbmVfdGV4dCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9UcmFja0NvdW50ID09IDAgJiYgbUF1ZGlvVHJhY2tDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVR5cGUgPSBNRURJQV9UWVBFX01VU0lDOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlVHJhY2tDb3VudCA9IGV4dHJhcy5nZXRJbnQoS0VZX1NVQlRJVExFX1RSQUNLX0NPVU5UKTsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2tDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZURlc2NyaXB0aW9uc0xpc3QuYWRkKG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9zdWJ0aXRsZV9vZmZfdGV4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU3VidGl0bGVUcmFja0NvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHJhY2sgPSBtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX3RyYWNrX251bWJlcl90ZXh0LCBpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdC5hZGQodHJhY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX1VQREFURV9NRURJQV9UWVBFX1NUQVRVUzoKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZXdTdGF0dXMgPSBleHRyYXMuZ2V0Qm9vbGVhbihLRVlfU1RBVEVfSVNfQURWRVJUSVNFTUVOVCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0dXMgIT0gbUlzQWR2ZXJ0aXNlbWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUlzQWR2ZXJ0aXNlbWVudCA9IG5ld1N0YXR1czsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBTZXR0aW5nc0FkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlciB7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxJbnRlZ2VyPiBtSWNvbklkczsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbU1haW5UZXh0czsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVN1YlRleHRzOwotCi0gICAgICAgIHB1YmxpYyBTZXR0aW5nc0FkYXB0ZXIoTGlzdDxTdHJpbmc+IG1haW5UZXh0cywgQE51bGxhYmxlIExpc3Q8U3RyaW5nPiBzdWJUZXh0cywKLSAgICAgICAgICAgICAgICBATnVsbGFibGUgTGlzdDxJbnRlZ2VyPiBpY29uSWRzKSB7Ci0gICAgICAgICAgICBtTWFpblRleHRzID0gbWFpblRleHRzOwotICAgICAgICAgICAgbVN1YlRleHRzID0gc3ViVGV4dHM7Ci0gICAgICAgICAgICBtSWNvbklkcyA9IGljb25JZHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVTdWJUZXh0cyhMaXN0PFN0cmluZz4gc3ViVGV4dHMpIHsKLSAgICAgICAgICAgIG1TdWJUZXh0cyA9IHN1YlRleHRzOwotICAgICAgICAgICAgbm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFpblRleHQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICBpZiAobU1haW5UZXh0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgbU1haW5UZXh0cy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1NYWluVGV4dHMuZ2V0KHBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gUkVTT1VSQ0VfRU1QVFk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiAobU1haW5UZXh0cyA9PSBudWxsKSA/IDAgOiBtTWFpblRleHRzLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yi0tZG9lcyBub3QgaGF2ZSBhbnkgcHVycG9zZSBoZXJlCi0gICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0SXRlbShpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIC8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViLS1kb2VzIG5vdCBoYXZlIGFueSBwdXJwb3NlIGhlcmUKLSAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBjb250YWluZXIpIHsKLSAgICAgICAgICAgIFZpZXcgcm93OwotICAgICAgICAgICAgaWYgKG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRlVMTCkgewotICAgICAgICAgICAgICAgIHJvdyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5mdWxsX3NldHRpbmdzX2xpc3RfaXRlbSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJvdyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5lbWJlZGRlZF9zZXR0aW5nc19saXN0X2l0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVGV4dFZpZXcgbWFpblRleHRWaWV3ID0gKFRleHRWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQubWFpbl90ZXh0KTsKLSAgICAgICAgICAgIFRleHRWaWV3IHN1YlRleHRWaWV3ID0gKFRleHRWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQuc3ViX3RleHQpOwotICAgICAgICAgICAgSW1hZ2VWaWV3IGljb25WaWV3ID0gKEltYWdlVmlldykgcm93LmZpbmRWaWV3QnlJZChSLmlkLmljb24pOwotCi0gICAgICAgICAgICAvLyBTZXQgbWFpbiB0ZXh0Ci0gICAgICAgICAgICBtYWluVGV4dFZpZXcuc2V0VGV4dChtTWFpblRleHRzLmdldChwb3NpdGlvbikpOwotCi0gICAgICAgICAgICAvLyBSZW1vdmUgc3ViIHRleHQgYW5kIGNlbnRlciB0aGUgbWFpbiB0ZXh0IGlmIHN1YiB0ZXh0cyBkbyBub3QgZXhpc3QgYXQgYWxsIG9yIHRoZSBzdWIKLSAgICAgICAgICAgIC8vIHRleHQgYXQgdGhpcyBwYXJ0aWN1bGFyIHBvc2l0aW9uIGlzIGVtcHR5LgotICAgICAgICAgICAgaWYgKG1TdWJUZXh0cyA9PSBudWxsIHx8IG1TdWJUZXh0cy5nZXQocG9zaXRpb24pID09IFJFU09VUkNFX0VNUFRZKSB7Ci0gICAgICAgICAgICAgICAgc3ViVGV4dFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHNldCBzdWIgdGV4dC4KLSAgICAgICAgICAgICAgICBzdWJUZXh0Vmlldy5zZXRUZXh0KG1TdWJUZXh0cy5nZXQocG9zaXRpb24pKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmVtb3ZlIG1haW4gaWNvbiBhbmQgc2V0IHZpc2liaWxpdHkgdG8gZ29uZSBpZiBpY29ucyBhcmUgc2V0IHRvIG51bGwgb3IgdGhlIGljb24gYXQKLSAgICAgICAgICAgIC8vIHRoaXMgcGFydGljdWxhciBwb3NpdGlvbiBpcyBzZXQgdG8gUkVTT1VSQ0VfTk9OX0VYSVNURU5ULgotICAgICAgICAgICAgaWYgKG1JY29uSWRzID09IG51bGwgfHwgbUljb25JZHMuZ2V0KHBvc2l0aW9uKSA9PSBSRVNPVVJDRV9OT05fRVhJU1RFTlQpIHsKLSAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgc2V0IG1haW4gaWNvbi4KLSAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRJbWFnZURyYXdhYmxlKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUobUljb25JZHMuZ2V0KHBvc2l0aW9uKSwgbnVsbCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJvdzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFN1YlRleHRzKExpc3Q8U3RyaW5nPiBzdWJUZXh0cykgewotICAgICAgICAgICAgbVN1YlRleHRzID0gc3ViVGV4dHM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBleHRlbmQgdGhpcyBjbGFzcyBmcm9tIFNldHRpbmdzQWRhcHRlcgotICAgIHByaXZhdGUgY2xhc3MgU3ViU2V0dGluZ3NBZGFwdGVyIGV4dGVuZHMgQmFzZUFkYXB0ZXIgewotICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtVGV4dHM7Ci0gICAgICAgIHByaXZhdGUgaW50IG1DaGVja1Bvc2l0aW9uOwotCi0gICAgICAgIHB1YmxpYyBTdWJTZXR0aW5nc0FkYXB0ZXIoTGlzdDxTdHJpbmc+IHRleHRzLCBpbnQgY2hlY2tQb3NpdGlvbikgewotICAgICAgICAgICAgbVRleHRzID0gdGV4dHM7Ci0gICAgICAgICAgICBtQ2hlY2tQb3NpdGlvbiA9IGNoZWNrUG9zaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1haW5UZXh0KGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgaWYgKG1UZXh0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgbVRleHRzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVRleHRzLmdldChwb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFJFU09VUkNFX0VNUFRZOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1UZXh0cyA9PSBudWxsKSA/IDAgOiBtVGV4dHMuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIC8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViLS1kb2VzIG5vdCBoYXZlIGFueSBwdXJwb3NlIGhlcmUKLSAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRJdGVtKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWItLWRvZXMgbm90IGhhdmUgYW55IHB1cnBvc2UgaGVyZQotICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIGNvbnRhaW5lcikgewotICAgICAgICAgICAgVmlldyByb3c7Ci0gICAgICAgICAgICBpZiAobVNpemVUeXBlID09IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LmZ1bGxfc3ViX3NldHRpbmdzX2xpc3RfaXRlbSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJvdyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5lbWJlZGRlZF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRleHRWaWV3IHRleHRWaWV3ID0gKFRleHRWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQudGV4dCk7Ci0gICAgICAgICAgICBJbWFnZVZpZXcgY2hlY2tWaWV3ID0gKEltYWdlVmlldykgcm93LmZpbmRWaWV3QnlJZChSLmlkLmNoZWNrKTsKLQotICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dChtVGV4dHMuZ2V0KHBvc2l0aW9uKSk7Ci0gICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gbUNoZWNrUG9zaXRpb24pIHsKLSAgICAgICAgICAgICAgICBjaGVja1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcm93OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dHMoTGlzdDxTdHJpbmc+IHRleHRzKSB7Ci0gICAgICAgICAgICBtVGV4dHMgPSB0ZXh0czsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENoZWNrUG9zaXRpb24oaW50IGNoZWNrUG9zaXRpb24pIHsKLSAgICAgICAgICAgIG1DaGVja1Bvc2l0aW9uID0gY2hlY2tQb3NpdGlvbjsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1N1YnRpdGxlVmlldy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvU3VidGl0bGVWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YjJjZDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvU3VidGl0bGVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVDb250cm9sbGVyLkFuY2hvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5TdWJ0aXRsZVRyYWNrLlJlbmRlcmluZ1dpZGdldDsKLQotY2xhc3MgU3VidGl0bGVWaWV3IGV4dGVuZHMgRnJhbWVMYXlvdXQgaW1wbGVtZW50cyBBbmNob3IgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3VidGl0bGVWaWV3IjsKLQotICAgIHByaXZhdGUgUmVuZGVyaW5nV2lkZ2V0IG1TdWJ0aXRsZVdpZGdldDsKLSAgICBwcml2YXRlIFJlbmRlcmluZ1dpZGdldC5PbkNoYW5nZWRMaXN0ZW5lciBtU3VidGl0bGVzQ2hhbmdlZExpc3RlbmVyOwotCi0gICAgcHVibGljIFN1YnRpdGxlVmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVWaWV3KENvbnRleHQgY29udGV4dCwgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVWaWV3KENvbnRleHQgY29udGV4dCwgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdWJ0aXRsZVZpZXcoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGVXaWRnZXQoUmVuZGVyaW5nV2lkZ2V0IHN1YnRpdGxlV2lkZ2V0KSB7Ci0gICAgICAgIGlmIChtU3VidGl0bGVXaWRnZXQgPT0gc3VidGl0bGVXaWRnZXQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gYXR0YWNoZWRUb1dpbmRvdyA9IGlzQXR0YWNoZWRUb1dpbmRvdygpOwotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChhdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0Lm9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5zZXRPbkNoYW5nZWRMaXN0ZW5lcihudWxsKTsKLSAgICAgICAgfQotICAgICAgICBtU3VidGl0bGVXaWRnZXQgPSBzdWJ0aXRsZVdpZGdldDsKLQotICAgICAgICBpZiAoc3VidGl0bGVXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1TdWJ0aXRsZXNDaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TdWJ0aXRsZXNDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgUmVuZGVyaW5nV2lkZ2V0Lk9uQ2hhbmdlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2VkKFJlbmRlcmluZ1dpZGdldCByZW5kZXJpbmdXaWRnZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldFdpbGxOb3REcmF3KGZhbHNlKTsKLSAgICAgICAgICAgIHN1YnRpdGxlV2lkZ2V0LnNldE9uQ2hhbmdlZExpc3RlbmVyKG1TdWJ0aXRsZXNDaGFuZ2VkTGlzdGVuZXIpOwotCi0gICAgICAgICAgICBpZiAoYXR0YWNoZWRUb1dpbmRvdykgewotICAgICAgICAgICAgICAgIHN1YnRpdGxlV2lkZ2V0Lm9uQXR0YWNoZWRUb1dpbmRvdygpOwotICAgICAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldFdpbGxOb3REcmF3KHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMb29wZXIgZ2V0U3VidGl0bGVMb29wZXIoKSB7Ci0gICAgICAgIHJldHVybiBMb29wZXIuZ2V0TWFpbkxvb3BlcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7Ci0KLSAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VidGl0bGVXaWRnZXQub25BdHRhY2hlZFRvV2luZG93KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLQotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7Ci0gICAgICAgIHN1cGVyLm9uTGF5b3V0KGNoYW5nZWQsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7Ci0KLSAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBnZXRXaWR0aCgpIC0gZ2V0UGFkZGluZ0xlZnQoKSAtIGdldFBhZGRpbmdSaWdodCgpOwotICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IGdldEhlaWdodCgpIC0gZ2V0UGFkZGluZ1RvcCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOwotCi0gICAgICAgICAgICBtU3VidGl0bGVXaWRnZXQuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBzdXBlci5kcmF3KGNhbnZhcyk7Ci0KLSAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2F2ZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKLSAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoZ2V0UGFkZGluZ0xlZnQoKSwgZ2V0UGFkZGluZ1RvcCgpKTsKLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5kcmF3KGNhbnZhcyk7Ci0gICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoc2F2ZUNvdW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0QWNjZXNzaWJpbGl0eUNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIFN1YnRpdGxlVmlldy5jbGFzcy5nZXROYW1lKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9TdXJmYWNlVmlldy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9TdXJmYWNlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzkyZTg1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvU3VyZmFjZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3Mi5WSUVXX1RZUEVfU1VSRkFDRVZJRVc7Ci0KLWNsYXNzIFZpZGVvU3VyZmFjZVZpZXcgZXh0ZW5kcyBTdXJmYWNlVmlldyBpbXBsZW1lbnRzIFZpZGVvVmlld0ludGVyZmFjZSwgU3VyZmFjZUhvbGRlci5DYWxsYmFjayB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJWaWRlb1N1cmZhY2VWaWV3IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gU1RPUFNISVA6IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLSAgICBwcml2YXRlIFN1cmZhY2VIb2xkZXIgbVN1cmZhY2VIb2xkZXIgPSBudWxsOwotICAgIHByaXZhdGUgU3VyZmFjZUxpc3RlbmVyIG1TdXJmYWNlTGlzdGVuZXIgPSBudWxsOwotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXIyIG1NZWRpYVBsYXllcjsKLSAgICAvLyBBIGZsYWcgdG8gaW5kaWNhdGUgdGFraW5nIG92ZXIgb3RoZXIgdmlldyBzaG91bGQgYmUgcHJvY2VlZC4KLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzVGFraW5nT3Zlck9sZFZpZXc7Ci0gICAgcHJpdmF0ZSBWaWRlb1ZpZXdJbnRlcmZhY2UgbU9sZFZpZXc7Ci0KLQotICAgIHB1YmxpYyBWaWRlb1N1cmZhY2VWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1N1cmZhY2VWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1N1cmZhY2VWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKLSAgICAgICAgZ2V0SG9sZGVyKCkuYWRkQ2FsbGJhY2sodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKCk6IG1TdXJmYWNlSG9sZGVyOiAiICsgbVN1cmZhY2VIb2xkZXIpOwotICAgICAgICBpZiAobXAgPT0gbnVsbCB8fCAhaGFzQXZhaWxhYmxlU3VyZmFjZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbXAuc2V0RGlzcGxheShtU3VyZmFjZUhvbGRlcik7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFN1cmZhY2VMaXN0ZW5lcihTdXJmYWNlTGlzdGVuZXIgbCkgewotICAgICAgICBtU3VyZmFjZUxpc3RlbmVyID0gbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlKCkgewotICAgICAgICByZXR1cm4gVklFV19UWVBFX1NVUkZBQ0VWSUVXOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhUGxheWVyKE1lZGlhUGxheWVyMiBtcCkgewotICAgICAgICBtTWVkaWFQbGF5ZXIgPSBtcDsKLSAgICAgICAgaWYgKG1Jc1Rha2luZ092ZXJPbGRWaWV3KSB7Ci0gICAgICAgICAgICB0YWtlT3ZlcihtT2xkVmlldyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0YWtlT3ZlcihATm9uTnVsbCBWaWRlb1ZpZXdJbnRlcmZhY2Ugb2xkVmlldykgewotICAgICAgICBpZiAoYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKSkgewotICAgICAgICAgICAgKChWaWV3KSBvbGRWaWV3KS5zZXRWaXNpYmlsaXR5KEdPTkUpOwotICAgICAgICAgICAgbUlzVGFraW5nT3Zlck9sZFZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIG1PbGRWaWV3ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZVRha2VPdmVyRG9uZSh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Jc1Rha2luZ092ZXJPbGRWaWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgIG1PbGRWaWV3ID0gb2xkVmlldzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc0F2YWlsYWJsZVN1cmZhY2UoKSB7Ci0gICAgICAgIHJldHVybiAobVN1cmZhY2VIb2xkZXIgIT0gbnVsbCAmJiBtU3VyZmFjZUhvbGRlci5nZXRTdXJmYWNlKCkgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGltcGxlbWVudHMgU3VyZmFjZUhvbGRlci5DYWxsYmFjawotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDcmVhdGVkKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7Ci0gICAgICAgIExvZy5kKFRBRywgInN1cmZhY2VDcmVhdGVkOiBtU3VyZmFjZUhvbGRlcjogIiArIG1TdXJmYWNlSG9sZGVyICsgIiwgbmV3IGhvbGRlcjogIiArIGhvbGRlcik7Ci0gICAgICAgIG1TdXJmYWNlSG9sZGVyID0gaG9sZGVyOwotICAgICAgICBpZiAobUlzVGFraW5nT3Zlck9sZFZpZXcpIHsKLSAgICAgICAgICAgIHRha2VPdmVyKG1PbGRWaWV3KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKG1NZWRpYVBsYXllcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBSZWN0IHJlY3QgPSBtU3VyZmFjZUhvbGRlci5nZXRTdXJmYWNlRnJhbWUoKTsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlQ3JlYXRlZCh0aGlzLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZUNoYW5nZWQodGhpcywgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdXJmYWNlRGVzdHJveWVkKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7Ci0gICAgICAgIC8vIEFmdGVyIHdlIHJldHVybiBmcm9tIHRoaXMgd2UgY2FuJ3QgdXNlIHRoZSBzdXJmYWNlIGFueSBtb3JlCi0gICAgICAgIG1TdXJmYWNlSG9sZGVyID0gbnVsbDsKLSAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VEZXN0cm95ZWQodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBJbnZlc3RpZ2F0ZSB0aGUgd2F5IHRvIG1vdmUgb25NZWFzdXJlKCkgY29kZSBpbnRvIEZyYW1lTGF5b3V0LgotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIGludCB2aWRlb1dpZHRoID0gKG1NZWRpYVBsYXllciA9PSBudWxsKSA/IDAgOiBtTWVkaWFQbGF5ZXIuZ2V0VmlkZW9XaWR0aCgpOwotICAgICAgICBpbnQgdmlkZW9IZWlnaHQgPSAobU1lZGlhUGxheWVyID09IG51bGwpID8gMCA6IG1NZWRpYVBsYXllci5nZXRWaWRlb0hlaWdodCgpOwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uTWVhc3VyZSgiICsgTWVhc3VyZVNwZWMudG9TdHJpbmcod2lkdGhNZWFzdXJlU3BlYykgKyAiLCAiCi0gICAgICAgICAgICAgICAgICAgICsgTWVhc3VyZVNwZWMudG9TdHJpbmcoaGVpZ2h0TWVhc3VyZVNwZWMpICsgIikiKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBnZXRNZWFzdXJlZFdpZHRoKCkgKyAiLyIgKyBnZXRNZWFzdXJlZEhlaWdodCgpKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiB2aWV3U2l6ZTogIiArIGdldFdpZHRoKCkgKyAiLyIgKyBnZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICIgbVZpZGVvV2lkdGgvaGVpZ2h0OiAiICsgdmlkZW9XaWR0aCArICIsICIgKyB2aWRlb0hlaWdodCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgd2lkdGggPSBnZXREZWZhdWx0U2l6ZSh2aWRlb1dpZHRoLCB3aWR0aE1lYXN1cmVTcGVjKTsKLSAgICAgICAgaW50IGhlaWdodCA9IGdldERlZmF1bHRTaXplKHZpZGVvSGVpZ2h0LCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgaWYgKHZpZGVvV2lkdGggPiAwICYmIHZpZGVvSGVpZ2h0ID4gMCkgewotICAgICAgICAgICAgaW50IHdpZHRoU3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICAgICAgaW50IGhlaWdodFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgICAgIHdpZHRoID0gd2lkdGhTcGVjU2l6ZTsKLSAgICAgICAgICAgIGhlaWdodCA9IGhlaWdodFNwZWNTaXplOwotCi0gICAgICAgICAgICAvLyBmb3IgY29tcGF0aWJpbGl0eSwgd2UgYWRqdXN0IHNpemUgYmFzZWQgb24gYXNwZWN0IHJhdGlvCi0gICAgICAgICAgICBpZiAodmlkZW9XaWR0aCAqIGhlaWdodCA8IHdpZHRoICogdmlkZW9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICB3aWR0aCA9IGhlaWdodCAqIHZpZGVvV2lkdGggLyB2aWRlb0hlaWdodDsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW1hZ2UgdG9vIHdpZGUsIGNvcnJlY3RpbmcuIHdpZHRoOiAiICsgd2lkdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodmlkZW9XaWR0aCAqIGhlaWdodCA+IHdpZHRoICogdmlkZW9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHQgPSB3aWR0aCAqIHZpZGVvSGVpZ2h0IC8gdmlkZW9XaWR0aDsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW1hZ2UgdG9vIHRhbGwsIGNvcnJlY3RpbmcuIGhlaWdodDogIiArIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbm8gc2l6ZSB5ZXQsIGp1c3QgYWRvcHQgdGhlIGdpdmVuIHNwZWMgc2l6ZXMKLSAgICAgICAgfQotICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbih3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJlbmQgb2Ygb25NZWFzdXJlKCkiKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBnZXRNZWFzdXJlZFdpZHRoKCkgKyAiLyIgKyBnZXRNZWFzdXJlZEhlaWdodCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiVmlld1R5cGU6IFN1cmZhY2VWaWV3IC8gVmlzaWJpbGl0eTogIiArIGdldFZpc2liaWxpdHkoKQotICAgICAgICAgICAgICAgICsgIiAvIHN1cmZhY2VIb2xkZXI6ICIgKyBtU3VyZmFjZUhvbGRlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1RleHR1cmVWaWV3LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1RleHR1cmVWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNGEzYWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9UZXh0dXJlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TdXJmYWNlVGV4dHVyZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlJlcXVpcmVzQXBpOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVGV4dHVyZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3Mi5WSUVXX1RZUEVfVEVYVFVSRVZJRVc7Ci0KLUBSZXF1aXJlc0FwaSgyNikKLWNsYXNzIFZpZGVvVGV4dHVyZVZpZXcgZXh0ZW5kcyBUZXh0dXJlVmlldwotICAgICAgICBpbXBsZW1lbnRzIFZpZGVvVmlld0ludGVyZmFjZSwgVGV4dHVyZVZpZXcuU3VyZmFjZVRleHR1cmVMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJWaWRlb1RleHR1cmVWaWV3IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gU1RPUFNISVA6IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgU3VyZmFjZVRleHR1cmUgbVN1cmZhY2VUZXh0dXJlOwotICAgIHByaXZhdGUgU3VyZmFjZSBtU3VyZmFjZTsKLSAgICBwcml2YXRlIFN1cmZhY2VMaXN0ZW5lciBtU3VyZmFjZUxpc3RlbmVyOwotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXIyIG1NZWRpYVBsYXllcjsKLSAgICAvLyBBIGZsYWcgdG8gaW5kaWNhdGUgdGFraW5nIG92ZXIgb3RoZXIgdmlldyBzaG91bGQgYmUgcHJvY2VlZC4KLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzVGFraW5nT3Zlck9sZFZpZXc7Ci0gICAgcHJpdmF0ZSBWaWRlb1ZpZXdJbnRlcmZhY2UgbU9sZFZpZXc7Ci0KLSAgICBwdWJsaWMgVmlkZW9UZXh0dXJlVmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlkZW9UZXh0dXJlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlkZW9UZXh0dXJlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1RleHR1cmVWaWV3KAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7Ci0gICAgICAgIHNldFN1cmZhY2VUZXh0dXJlTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKCk6IG1TdXJmYWNlVGV4dHVyZTogIiArIG1TdXJmYWNlVGV4dHVyZSk7Ci0gICAgICAgIGlmIChtcCA9PSBudWxsIHx8ICFoYXNBdmFpbGFibGVTdXJmYWNlKCkpIHsKLSAgICAgICAgICAgIC8vIFN1cmZhY2UgaXMgbm90IHJlYWR5LgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1wLnNldFN1cmZhY2UobVN1cmZhY2UpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTdXJmYWNlTGlzdGVuZXIoU3VyZmFjZUxpc3RlbmVyIGwpIHsKLSAgICAgICAgbVN1cmZhY2VMaXN0ZW5lciA9IGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRWaWV3VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFZJRVdfVFlQRV9URVhUVVJFVklFVzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApIHsKLSAgICAgICAgbU1lZGlhUGxheWVyID0gbXA7Ci0gICAgICAgIGlmIChtSXNUYWtpbmdPdmVyT2xkVmlldykgewotICAgICAgICAgICAgdGFrZU92ZXIobU9sZFZpZXcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGFrZU92ZXIoQE5vbk51bGwgVmlkZW9WaWV3SW50ZXJmYWNlIG9sZFZpZXcpIHsKLSAgICAgICAgaWYgKGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKG1NZWRpYVBsYXllcikpIHsKLSAgICAgICAgICAgICgoVmlldykgb2xkVmlldykuc2V0VmlzaWJpbGl0eShHT05FKTsKLSAgICAgICAgICAgIG1Jc1Rha2luZ092ZXJPbGRWaWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICBtT2xkVmlldyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VUYWtlT3ZlckRvbmUodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtSXNUYWtpbmdPdmVyT2xkVmlldyA9IHRydWU7Ci0gICAgICAgICAgICBtT2xkVmlldyA9IG9sZFZpZXc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNBdmFpbGFibGVTdXJmYWNlKCkgewotICAgICAgICByZXR1cm4gKG1TdXJmYWNlVGV4dHVyZSAhPSBudWxsICYmICFtU3VyZmFjZVRleHR1cmUuaXNSZWxlYXNlZCgpICYmIG1TdXJmYWNlICE9IG51bGwpOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBpbXBsZW1lbnRzIFRleHR1cmVWaWV3LlN1cmZhY2VUZXh0dXJlTGlzdGVuZXIKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUZXh0dXJlQXZhaWxhYmxlKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2VUZXh0dXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlVGV4dHVyZUF2YWlsYWJsZTogbVN1cmZhY2VUZXh0dXJlOiAiICsgbVN1cmZhY2VUZXh0dXJlCi0gICAgICAgICAgICAgICAgKyAiLCBuZXcgc3VyZmFjZTogIiArIHN1cmZhY2VUZXh0dXJlKTsKLSAgICAgICAgbVN1cmZhY2VUZXh0dXJlID0gc3VyZmFjZVRleHR1cmU7Ci0gICAgICAgIG1TdXJmYWNlID0gbmV3IFN1cmZhY2UobVN1cmZhY2VUZXh0dXJlKTsKLSAgICAgICAgaWYgKG1Jc1Rha2luZ092ZXJPbGRWaWV3KSB7Ci0gICAgICAgICAgICB0YWtlT3ZlcihtT2xkVmlldyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlQ3JlYXRlZCh0aGlzLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVTaXplQ2hhbmdlZChTdXJmYWNlVGV4dHVyZSBzdXJmYWNlVGV4dHVyZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlQ2hhbmdlZCh0aGlzLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICAvLyByZXF1ZXN0TGF5b3V0KCk7ICAvLyBUT0RPOiBmaWd1cmUgb3V0IGlmIGl0IHNob3VsZCBiZSBjYWxsZWQgaGVyZT8KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUZXh0dXJlVXBkYXRlZChTdXJmYWNlVGV4dHVyZSBzdXJmYWNlKSB7Ci0gICAgICAgIC8vIG5vLW9wCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25TdXJmYWNlVGV4dHVyZURlc3Ryb3llZChTdXJmYWNlVGV4dHVyZSBzdXJmYWNlVGV4dHVyZSkgewotICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZURlc3Ryb3llZCh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBtU3VyZmFjZVRleHR1cmUgPSBudWxsOwotICAgICAgICBtU3VyZmFjZSA9IG51bGw7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIGludCB2aWRlb1dpZHRoID0gKG1NZWRpYVBsYXllciA9PSBudWxsKSA/IDAgOiBtTWVkaWFQbGF5ZXIuZ2V0VmlkZW9XaWR0aCgpOwotICAgICAgICBpbnQgdmlkZW9IZWlnaHQgPSAobU1lZGlhUGxheWVyID09IG51bGwpID8gMCA6IG1NZWRpYVBsYXllci5nZXRWaWRlb0hlaWdodCgpOwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uTWVhc3VyZSgiICsgTWVhc3VyZVNwZWMudG9TdHJpbmcod2lkdGhNZWFzdXJlU3BlYykgKyAiLCAiCi0gICAgICAgICAgICAgICAgICAgICsgTWVhc3VyZVNwZWMudG9TdHJpbmcoaGVpZ2h0TWVhc3VyZVNwZWMpICsgIikiKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBnZXRNZWFzdXJlZFdpZHRoKCkgKyAiLyIgKyBnZXRNZWFzdXJlZEhlaWdodCgpKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiB2aWV3U2l6ZTogIiArIGdldFdpZHRoKCkgKyAiLyIgKyBnZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICIgbVZpZGVvV2lkdGgvaGVpZ2h0OiAiICsgdmlkZW9XaWR0aCArICIsICIgKyB2aWRlb0hlaWdodCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgd2lkdGggPSBnZXREZWZhdWx0U2l6ZSh2aWRlb1dpZHRoLCB3aWR0aE1lYXN1cmVTcGVjKTsKLSAgICAgICAgaW50IGhlaWdodCA9IGdldERlZmF1bHRTaXplKHZpZGVvSGVpZ2h0LCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgaWYgKHZpZGVvV2lkdGggPiAwICYmIHZpZGVvSGVpZ2h0ID4gMCkgewotICAgICAgICAgICAgaW50IHdpZHRoU3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICAgICAgaW50IGhlaWdodFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgICAgIHdpZHRoID0gd2lkdGhTcGVjU2l6ZTsKLSAgICAgICAgICAgIGhlaWdodCA9IGhlaWdodFNwZWNTaXplOwotCi0gICAgICAgICAgICAvLyBmb3IgY29tcGF0aWJpbGl0eSwgd2UgYWRqdXN0IHNpemUgYmFzZWQgb24gYXNwZWN0IHJhdGlvCi0gICAgICAgICAgICBpZiAodmlkZW9XaWR0aCAqIGhlaWdodCA8IHdpZHRoICogdmlkZW9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICB3aWR0aCA9IGhlaWdodCAqIHZpZGVvV2lkdGggLyB2aWRlb0hlaWdodDsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW1hZ2UgdG9vIHdpZGUsIGNvcnJlY3RpbmcuIHdpZHRoOiAiICsgd2lkdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodmlkZW9XaWR0aCAqIGhlaWdodCA+IHdpZHRoICogdmlkZW9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHQgPSB3aWR0aCAqIHZpZGVvSGVpZ2h0IC8gdmlkZW9XaWR0aDsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW1hZ2UgdG9vIHRhbGwsIGNvcnJlY3RpbmcuIGhlaWdodDogIiArIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbm8gc2l6ZSB5ZXQsIGp1c3QgYWRvcHQgdGhlIGdpdmVuIHNwZWMgc2l6ZXMKLSAgICAgICAgfQotICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbih3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJlbmQgb2Ygb25NZWFzdXJlKCkiKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBnZXRNZWFzdXJlZFdpZHRoKCkgKyAiLyIgKyBnZXRNZWFzdXJlZEhlaWdodCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiVmlld1R5cGU6IFRleHR1cmVWaWV3IC8gVmlzaWJpbGl0eTogIiArIGdldFZpc2liaWxpdHkoKQotICAgICAgICAgICAgICAgICsgIiAvIHN1cmZhY2VUZXh0dXJlOiAiICsgbVN1cmZhY2VUZXh0dXJlOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3MkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVmlldzJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3Mjc5ZDYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3MkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9jdXNSZXF1ZXN0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjIuT25TdWJ0aXRsZURhdGFMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMkltcGw7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TdWJ0aXRsZURhdGE7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhUmV0cmlldmVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWV0YWRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5QbGF5YmFja1BhcmFtczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlRpbWVkVGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFDb250cm9sbGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXIuUGxheWJhY2tJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZGVvVmlldzJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWV3R3JvdXBQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sVmlldzI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3MjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmdyYXBoaWNzLnBhbGV0dGUuUGFsZXR0ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5Sb3V0ZVBsYXllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5DbG9zZWRDYXB0aW9uUmVuZGVyZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVDb250cm9sbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLlN1YnRpdGxlVHJhY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhSXRlbVN0YXR1czsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhQ29udHJvbEludGVudDsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgVmlkZW9WaWV3MkltcGwgZXh0ZW5kcyBCYXNlTGF5b3V0Ci0gICAgICAgIGltcGxlbWVudHMgVmlkZW9WaWV3MlByb3ZpZGVyLCBWaWRlb1ZpZXdJbnRlcmZhY2UuU3VyZmFjZUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZGVvVmlldzIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBTVE9QU0hJUDogTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9TSE9XX0NPTlRST0xMRVJfSU5URVJWQUxfTVMgPSAyMDAwOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWRlb1ZpZXcyIG1JbnN0YW5jZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9FUlJPUiA9IC0xOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9JRExFID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFJFUEFSSU5HID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFJFUEFSRUQgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QTEFZSU5HID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUEFVU0VEID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUExBWUJBQ0tfQ09NUExFVEVEID0gNTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1RSQUNLX0lOREVYID0gLTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgSU5WQUxJRF9TUEVFRCA9IDBmOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfVFlQRV9FTUJFRERFRCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfVFlQRV9GVUxMID0gMTsKLSAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgTWluaW1hbCBzaXplIHR5cGUuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfVFlQRV9NSU5JTUFMID0gMjsKLQotICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyOwotICAgIHByaXZhdGUgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7Ci0gICAgcHJpdmF0ZSBBdWRpb0F0dHJpYnV0ZXMgbUF1ZGlvQXR0cmlidXRlczsKLSAgICBwcml2YXRlIGludCBtQXVkaW9Gb2N1c1R5cGUgPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19HQUlOOyAvLyBsZWdhY3kgZm9jdXMgZ2FpbgotCi0gICAgcHJpdmF0ZSBQYWlyPEV4ZWN1dG9yLCBWaWRlb1ZpZXcyLk9uQ3VzdG9tQWN0aW9uTGlzdGVuZXI+IG1DdXN0b21BY3Rpb25MaXN0ZW5lclJlY29yZDsKLSAgICBwcml2YXRlIFZpZGVvVmlldzIuT25WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lciBtVmlld1R5cGVDaGFuZ2VkTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBWaWRlb1ZpZXcyLk9uRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lciBtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgVmlkZW9WaWV3SW50ZXJmYWNlIG1DdXJyZW50VmlldzsKLSAgICBwcml2YXRlIFZpZGVvVGV4dHVyZVZpZXcgbVRleHR1cmVWaWV3OwotICAgIHByaXZhdGUgVmlkZW9TdXJmYWNlVmlldyBtU3VyZmFjZVZpZXc7Ci0KLSAgICBwcml2YXRlIE1lZGlhUGxheWVyMiBtTWVkaWFQbGF5ZXI7Ci0gICAgcHJpdmF0ZSBEYXRhU291cmNlRGVzYyBtRHNkOwotICAgIHByaXZhdGUgTWVkaWFDb250cm9sVmlldzIgbU1lZGlhQ29udHJvbFZpZXc7Ci0gICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24gbU1lZGlhU2Vzc2lvbjsKLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbGxlciBtTWVkaWFDb250cm9sbGVyOwotICAgIHByaXZhdGUgTWV0YWRhdGEgbU1ldGFkYXRhOwotICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YTIgbU1lZGlhTWV0YWRhdGE7Ci0gICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhUmV0cmlldmVyIG1SZXRyaWV2ZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkVXBkYXRlTWVkaWFUeXBlOwotICAgIHByaXZhdGUgQnVuZGxlIG1NZWRpYVR5cGVEYXRhOwotICAgIHByaXZhdGUgU3RyaW5nIG1UaXRsZTsKLQotICAgIC8vIFRPRE86IG1vdmUgbXVzaWMgdmlldyBpbnNpZGUgU3VyZmFjZVZpZXcvVGV4dHVyZVZpZXcgb3IgaW1wbGVtZW50IFZpZGVvVmlld0ludGVyZmFjZS4KLSAgICBwcml2YXRlIFdpbmRvd01hbmFnZXIgbU1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlc291cmNlczsKLSAgICBwcml2YXRlIFZpZXcgbU11c2ljVmlldzsKLSAgICBwcml2YXRlIERyYXdhYmxlIG1NdXNpY0FsYnVtRHJhd2FibGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU11c2ljVGl0bGVUZXh0OwotICAgIHByaXZhdGUgU3RyaW5nIG1NdXNpY0FydGlzdFRleHQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc011c2ljTWVkaWFUeXBlOwotICAgIHByaXZhdGUgaW50IG1QcmV2V2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZIZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbURvbWluYW50Q29sb3I7Ci0gICAgcHJpdmF0ZSBpbnQgbVNpemVUeXBlOwotCi0gICAgcHJpdmF0ZSBQbGF5YmFja1N0YXRlLkJ1aWxkZXIgbVN0YXRlQnVpbGRlcjsKLSAgICBwcml2YXRlIExpc3Q8UGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24+IG1DdXN0b21BY3Rpb25MaXN0OwotICAgIHByaXZhdGUgaW50IG1UYXJnZXRTdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRCdWZmZXJQZXJjZW50YWdlOwotICAgIHByaXZhdGUgbG9uZyBtU2Vla1doZW5QcmVwYXJlZDsgIC8vIHJlY29yZGluZyB0aGUgc2VlayBwb3NpdGlvbiB3aGlsZSBwcmVwYXJpbmcKLQotICAgIHByaXZhdGUgaW50IG1WaWRlb1dpZHRoOwotICAgIHByaXZhdGUgaW50IG1WaWRlb0hlaWdodDsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0PEludGVnZXI+IG1WaWRlb1RyYWNrSW5kaWNlczsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxJbnRlZ2VyPiBtQXVkaW9UcmFja0luZGljZXM7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8UGFpcjxJbnRlZ2VyLCBTdWJ0aXRsZVRyYWNrPj4gbVN1YnRpdGxlVHJhY2tJbmRpY2VzOwotICAgIHByaXZhdGUgU3VidGl0bGVDb250cm9sbGVyIG1TdWJ0aXRsZUNvbnRyb2xsZXI7Ci0KLSAgICAvLyBzZWxlY3RlZCB2aWRlby9hdWRpby9zdWJ0aXRsZSB0cmFjayBpbmRleCBhcyBNZWRpYVBsYXllcjIgcmV0dXJucwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZFZpZGVvVHJhY2tJbmRleDsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXg7Ci0gICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4OwotCi0gICAgcHJpdmF0ZSBTdWJ0aXRsZVZpZXcgbVN1YnRpdGxlVmlldzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVN1YnRpdGxlRW5hYmxlZDsKLQotICAgIHByaXZhdGUgZmxvYXQgbVNwZWVkOwotICAgIC8vIFRPRE86IFJlbW92ZSBtRmFsbGJhY2tTcGVlZCB3aGVuIGludGVncmF0aW9uIHdpdGggTWVkaWFQbGF5ZXIyJ3MgbmV3IHNldFBsYXliYWNrUGFyYW1zKCkuCi0gICAgLy8gUmVmZXI6IGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMW56QWZuczZpMmhKM1JrYVVyZTNRTVQ2d3NEZWRKNU9OTGlBX09PQkZGWDgvZWRpdAotICAgIHByaXZhdGUgZmxvYXQgbUZhbGxiYWNrU3BlZWQ7ICAvLyBrZWVwIHRoZSBvcmlnaW5hbCBzcGVlZCBiZWZvcmUgJ3BhdXNlJyBpcyBjYWxsZWQuCi0gICAgcHJpdmF0ZSBmbG9hdCBtVm9sdW1lTGV2ZWxGbG9hdDsKLSAgICBwcml2YXRlIGludCBtVm9sdW1lTGV2ZWw7Ci0KLSAgICBwcml2YXRlIGxvbmcgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNczsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIgbU1lZGlhUm91dGVyOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1Sb3V0ZVNlbGVjdG9yOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIG1Sb3V0ZTsKLSAgICBwcml2YXRlIFJvdXRlUGxheWVyIG1Sb3V0ZVBsYXllcjsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgbVJvdXRlckNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyLkNhbGxiYWNrKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykpIHsKLSAgICAgICAgICAgICAgICAvLyBTdG9wIGxvY2FsIHBsYXliYWNrIChpZiBuZWNlc3NhcnkpCi0gICAgICAgICAgICAgICAgcmVzZXRQbGF5ZXIoKTsKLSAgICAgICAgICAgICAgICBtUm91dGUgPSByb3V0ZTsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIgPSBuZXcgUm91dGVQbGF5ZXIobUluc3RhbmNlLmdldENvbnRleHQoKSwgcm91dGUpOwotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5zZXRQbGF5ZXJFdmVudENhbGxiYWNrKG5ldyBSb3V0ZVBsYXllci5QbGF5ZXJFdmVudENhbGxiYWNrKCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25QbGF5ZXJTdGF0ZUNoYW5nZWQoTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUuQnVpbGRlciBwc0J1aWxkZXIgPSBuZXcgUGxheWJhY2tTdGF0ZS5CdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0QWN0aW9ucyhSb3V0ZVBsYXllci5QTEFZQkFDS19BQ1RJT05TKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcG9zaXRpb24gPSBpdGVtU3RhdHVzLmdldENvbnRlbnRQb3NpdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpdGVtU3RhdHVzLmdldFBsYXliYWNrU3RhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX1BFTkRJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX05PTkUsIHBvc2l0aW9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkcsIHBvc2l0aW9uLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX1BBVVNFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfUEFVU0VELCBwb3NpdGlvbiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX0JVRkZFUklORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfQlVGRkVSSU5HLCBwb3NpdGlvbiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX0ZJTklTSEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0U3RhdGUoUGxheWJhY2tTdGF0ZS5TVEFURV9TVE9QUEVELCBwb3NpdGlvbiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZQkFDS19DT01QTEVURUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBQbGF5YmFja1N0YXRlIHBiU3RhdGUgPSBwc0J1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0UGxheWJhY2tTdGF0ZShwYlN0YXRlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YS5CdWlsZGVyIG1tQnVpbGRlciA9IG5ldyBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1tQnVpbGRlci5wdXRMb25nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0RVUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtU3RhdHVzLmdldENvbnRlbnREdXJhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0TWV0YWRhdGEobW1CdWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgLy8gU3RhcnQgcmVtb3RlIHBsYXliYWNrIChpZiBuZWNlc3NhcnkpCi0gICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9wZW5WaWRlbyhtRHNkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwgaW50IHJlYXNvbikgewotICAgICAgICAgICAgaWYgKG1Sb3V0ZSAhPSBudWxsICYmIG1Sb3V0ZVBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Sb3V0ZSA9PSByb3V0ZSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVhc29uICE9IE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogUmVzdW1lIGxvY2FsIHBsYXliYWNrICAoaWYgbmVjZXNzYXJ5KQotICAgICAgICAgICAgICAgIG9wZW5WaWRlbyhtRHNkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwdWJsaWMgVmlkZW9WaWV3MkltcGwoVmlkZW9WaWV3MiBpbnN0YW5jZSwKLSAgICAgICAgICAgIFZpZXdHcm91cFByb3ZpZGVyIHN1cGVyUHJvdmlkZXIsIFZpZXdHcm91cFByb3ZpZGVyIHByaXZhdGVQcm92aWRlcikgewotICAgICAgICBzdXBlcihpbnN0YW5jZSwgc3VwZXJQcm92aWRlciwgcHJpdmF0ZVByb3ZpZGVyKTsKLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLCBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgbVZpZGVvV2lkdGggPSAwOwotICAgICAgICBtVmlkZW9IZWlnaHQgPSAwOwotICAgICAgICBtU3BlZWQgPSAxLjBmOwotICAgICAgICBtRmFsbGJhY2tTcGVlZCA9IG1TcGVlZDsKLSAgICAgICAgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ID0gSU5WQUxJRF9UUkFDS19JTkRFWDsKLSAgICAgICAgLy8gVE9ETzogYWRkIGF0dHJpYnV0ZXMgdG8gZ2V0IHRoaXMgdmFsdWUuCi0gICAgICAgIG1TaG93Q29udHJvbGxlckludGVydmFsTXMgPSBERUZBVUxUX1NIT1dfQ09OVFJPTExFUl9JTlRFUlZBTF9NUzsKLQotICAgICAgICBtQWNjZXNzaWJpbGl0eU1hbmFnZXIgPSBBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZShtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLQotICAgICAgICBtQXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlcikgbUluc3RhbmNlLmdldENvbnRleHQoKQotICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQVVESU9fU0VSVklDRSk7Ci0gICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSBuZXcgQXVkaW9BdHRyaWJ1dGVzLkJ1aWxkZXIoKS5zZXRVc2FnZShBdWRpb0F0dHJpYnV0ZXMuVVNBR0VfTUVESUEpCi0gICAgICAgICAgICAgICAgLnNldENvbnRlbnRUeXBlKEF1ZGlvQXR0cmlidXRlcy5DT05URU5UX1RZUEVfTU9WSUUpLmJ1aWxkKCk7Ci0gICAgICAgIG1JbnN0YW5jZS5zZXRGb2N1c2FibGUodHJ1ZSk7Ci0gICAgICAgIG1JbnN0YW5jZS5zZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKLSAgICAgICAgbUluc3RhbmNlLnJlcXVlc3RGb2N1cygpOwotCi0gICAgICAgIC8vIFRPRE86IHRyeSB0byBrZWVwIGEgc2luZ2xlIGNoaWxkIGF0IGEgdGltZSByYXRoZXIgdGhhbiBhbHdheXMgaGF2aW5nIGJvdGguCi0gICAgICAgIG1UZXh0dXJlVmlldyA9IG5ldyBWaWRlb1RleHR1cmVWaWV3KG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICBtU3VyZmFjZVZpZXcgPSBuZXcgVmlkZW9TdXJmYWNlVmlldyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgTGF5b3V0UGFyYW1zIHBhcmFtcyA9IG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLSAgICAgICAgbVRleHR1cmVWaWV3LnNldExheW91dFBhcmFtcyhwYXJhbXMpOwotICAgICAgICBtU3VyZmFjZVZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgIG1UZXh0dXJlVmlldy5zZXRTdXJmYWNlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIG1TdXJmYWNlVmlldy5zZXRTdXJmYWNlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1UZXh0dXJlVmlldyk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1TdXJmYWNlVmlldyk7Ci0KLSAgICAgICAgbVN1YnRpdGxlVmlldyA9IG5ldyBTdWJ0aXRsZVZpZXcobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0gICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0QmFja2dyb3VuZENvbG9yKDApOwotICAgICAgICBtSW5zdGFuY2UuYWRkVmlldyhtU3VidGl0bGVWaWV3KTsKLQotICAgICAgICBib29sZWFuIGVuYWJsZUNvbnRyb2xWaWV3ID0gKGF0dHJzID09IG51bGwpIHx8IGF0dHJzLmdldEF0dHJpYnV0ZUJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiwKLSAgICAgICAgICAgICAgICAiZW5hYmxlQ29udHJvbFZpZXciLCB0cnVlKTsKLSAgICAgICAgaWYgKGVuYWJsZUNvbnRyb2xWaWV3KSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldyA9IG5ldyBNZWRpYUNvbnRyb2xWaWV3MihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TdWJ0aXRsZUVuYWJsZWQgPSAoYXR0cnMgPT0gbnVsbCkgfHwgYXR0cnMuZ2V0QXR0cmlidXRlQm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiLAotICAgICAgICAgICAgICAgICJlbmFibGVTdWJ0aXRsZSIsIGZhbHNlKTsKLQotICAgICAgICAvLyBUT0RPOiBDaG9vc2UgVGV4dHVyZVZpZXcgd2hlbiBTdXJmYWNlVmlldyBjYW5ub3QgYmUgY3JlYXRlZC4KLSAgICAgICAgLy8gQ2hvb3NlIHN1cmZhY2UgdmlldyBieSBkZWZhdWx0Ci0gICAgICAgIGludCB2aWV3VHlwZSA9IChhdHRycyA9PSBudWxsKSA/IFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXCi0gICAgICAgICAgICAgICAgOiBhdHRycy5nZXRBdHRyaWJ1dGVJbnRWYWx1ZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiwKLSAgICAgICAgICAgICAgICAidmlld1R5cGUiLCBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVyk7Ci0gICAgICAgIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAidmlld1R5cGUgYXR0cmlidXRlIGlzIHN1cmZhY2VWaWV3LiIpOwotICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtQ3VycmVudFZpZXcgPSBtU3VyZmFjZVZpZXc7Ci0gICAgICAgIH0gZWxzZSBpZiAodmlld1R5cGUgPT0gVmlkZW9WaWV3Mi5WSUVXX1RZUEVfVEVYVFVSRVZJRVcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInZpZXdUeXBlIGF0dHJpYnV0ZSBpcyB0ZXh0dXJlVmlldy4iKTsKLSAgICAgICAgICAgIG1UZXh0dXJlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3VyZmFjZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUN1cnJlbnRWaWV3ID0gbVRleHR1cmVWaWV3OwotICAgICAgICB9Ci0KLSAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKLSAgICAgICAgYnVpbGRlci5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfQVVESU8pOwotICAgICAgICBidWlsZGVyLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTyk7Ci0gICAgICAgIG1Sb3V0ZVNlbGVjdG9yID0gYnVpbGRlci5idWlsZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhQ29udHJvbFZpZXcyX2ltcGwoTWVkaWFDb250cm9sVmlldzIgbWVkaWFDb250cm9sVmlldywgbG9uZyBpbnRlcnZhbE1zKSB7Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3ID0gbWVkaWFDb250cm9sVmlldzsKLSAgICAgICAgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNcyA9IGludGVydmFsTXM7Ci0gICAgICAgIC8vIFRPRE86IENhbGwgTWVkaWFDb250cm9sVmlldzIuc2V0Um91dGVTZWxlY3RvciBvbmx5IHdoZW4gY2FzdCBhdmFpbGFsYmUuCi0gICAgICAgICgoTWVkaWFDb250cm9sVmlldzJJbXBsKSBtTWVkaWFDb250cm9sVmlldy5nZXRQcm92aWRlcigpKS5zZXRSb3V0ZVNlbGVjdG9yKG1Sb3V0ZVNlbGVjdG9yKTsKLQotICAgICAgICBpZiAobUluc3RhbmNlLmlzQXR0YWNoZWRUb1dpbmRvdygpKSB7Ci0gICAgICAgICAgICBhdHRhY2hNZWRpYUNvbnRyb2xWaWV3KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFDb250cm9sbGVyIGdldE1lZGlhQ29udHJvbGxlcl9pbXBsKCkgewotICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNZWRpYVNlc3Npb24gaW5zdGFuY2UgaXMgbm90IGF2YWlsYWJsZS4iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbU1lZGlhQ29udHJvbGxlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2Vzc2lvblRva2VuMiBnZXRNZWRpYVNlc3Npb25Ub2tlbl9pbXBsKCkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFDb250cm9sVmlldzIgZ2V0TWVkaWFDb250cm9sVmlldzJfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1NZWRpYUNvbnRyb2xWaWV3OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBnZXRNZWRpYU1ldGFkYXRhX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtTWVkaWFNZXRhZGF0YTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYU1ldGFkYXRhX2ltcGwoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgLy8gVE9ETzogaW50ZWdyYXRlIHRoaXMgd2l0aCBNZWRpYVNlc3Npb24yI01lZGlhSXRlbTIKLSAgICAgICAgbU1lZGlhTWV0YWRhdGEgPSBtZXRhZGF0YTsKLQotICAgICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgaGFuZGxpbmcgd2Vic2l0ZSBsaW5rCi0gICAgICAgIG1NZWRpYVR5cGVEYXRhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBib29sZWFuIGlzQWQgPSBtZXRhZGF0YSA9PSBudWxsID8KLSAgICAgICAgICAgICAgICBmYWxzZSA6IG1ldGFkYXRhLmdldExvbmcoTWVkaWFNZXRhZGF0YTIuTUVUQURBVEFfS0VZX0FEVkVSVElTRU1FTlQpICE9IDA7Ci0gICAgICAgIG1NZWRpYVR5cGVEYXRhLnB1dEJvb2xlYW4oCi0gICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TVEFURV9JU19BRFZFUlRJU0VNRU5ULCBpc0FkKTsKLQotICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTWVkaWFTZXNzaW9uLnNlbmRTZXNzaW9uRXZlbnQoCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5FVkVOVF9VUERBVEVfTUVESUFfVFlQRV9TVEFUVVMsIG1NZWRpYVR5cGVEYXRhKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFVwZGF0ZSBsYXRlciBpbnNpZGUgT25QcmVwYXJlZExpc3RlbmVyIGFmdGVyIE1lZGlhU2Vzc2lvbiBpcyBpbml0aWFsaXplZC4KLSAgICAgICAgICAgIG1OZWVkVXBkYXRlTWVkaWFUeXBlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlRW5hYmxlZF9pbXBsKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIGlmIChlbmFibGUgIT0gbVN1YnRpdGxlRW5hYmxlZCkgewotICAgICAgICAgICAgc2VsZWN0T3JEZXNlbGVjdFN1YnRpdGxlKGVuYWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVN1YnRpdGxlRW5hYmxlZCA9IGVuYWJsZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N1YnRpdGxlRW5hYmxlZF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1YnRpdGxlRW5hYmxlZDsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiByZW1vdmUgc2V0U3BlZWRfaW1wbCBvbmNlIE1lZGlhQ29udHJvbGxlcjIgaXMgcmVhZHkuCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3BlZWRfaW1wbChmbG9hdCBzcGVlZCkgewotICAgICAgICBpZiAoc3BlZWQgPD0gMC4wZikgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5zdXBwb3J0ZWQgc3BlZWQgKCIgKyBzcGVlZCArICIpIGlzIGlnbm9yZWQuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbVNwZWVkID0gc3BlZWQ7Ci0gICAgICAgIGlmIChtTWVkaWFQbGF5ZXIgIT0gbnVsbCAmJiBtTWVkaWFQbGF5ZXIuaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgIGFwcGx5U3BlZWQoKTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QXVkaW9Gb2N1c1JlcXVlc3RfaW1wbChpbnQgZm9jdXNHYWluKSB7Ci0gICAgICAgIGlmIChmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfTk9ORQotICAgICAgICAgICAgICAgICYmIGZvY3VzR2FpbiAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19HQUlOCi0gICAgICAgICAgICAgICAgJiYgZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU5fVFJBTlNJRU5UCi0gICAgICAgICAgICAgICAgJiYgZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU5fVFJBTlNJRU5UX01BWV9EVUNLCi0gICAgICAgICAgICAgICAgJiYgZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU5fVFJBTlNJRU5UX0VYQ0xVU0lWRSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBhdWRpbyBmb2N1cyB0eXBlICIgKyBmb2N1c0dhaW4pOwotICAgICAgICB9Ci0gICAgICAgIG1BdWRpb0ZvY3VzVHlwZSA9IGZvY3VzR2FpbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0F0dHJpYnV0ZXNfaW1wbChBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIG51bGwgQXVkaW9BdHRyaWJ1dGVzIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUF1ZGlvQXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlkZW9QYXRoX2ltcGwoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgbUluc3RhbmNlLnNldFZpZGVvVXJpKFVyaS5wYXJzZShwYXRoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlkZW9VcmlfaW1wbChVcmkgdXJpKSB7Ci0gICAgICAgIG1JbnN0YW5jZS5zZXRWaWRlb1VyaSh1cmksIG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpZGVvVXJpX2ltcGwoVXJpIHVyaSwgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzKSB7Ci0gICAgICAgIERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBEYXRhU291cmNlRGVzYy5CdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuc2V0RGF0YVNvdXJjZShtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCB1cmksIGhlYWRlcnMsIG51bGwpOwotICAgICAgICBtSW5zdGFuY2Uuc2V0RGF0YVNvdXJjZShidWlsZGVyLmJ1aWxkKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhSXRlbV9pbXBsKE1lZGlhSXRlbTIgbWVkaWFJdGVtKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RGF0YVNvdXJjZV9pbXBsKERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICBtRHNkID0gZHNkOwotICAgICAgICBtU2Vla1doZW5QcmVwYXJlZCA9IDA7Ci0gICAgICAgIG9wZW5WaWRlbyhkc2QpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpZXdUeXBlX2ltcGwoaW50IHZpZXdUeXBlKSB7Ci0gICAgICAgIGlmICh2aWV3VHlwZSA9PSBtQ3VycmVudFZpZXcuZ2V0Vmlld1R5cGUoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFZpZGVvVmlld0ludGVyZmFjZSB0YXJnZXRWaWV3OwotICAgICAgICBpZiAodmlld1R5cGUgPT0gVmlkZW9WaWV3Mi5WSUVXX1RZUEVfVEVYVFVSRVZJRVcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInN3aXRjaGluZyB0byBUZXh0dXJlVmlldyIpOwotICAgICAgICAgICAgdGFyZ2V0VmlldyA9IG1UZXh0dXJlVmlldzsKLSAgICAgICAgfSBlbHNlIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic3dpdGNoaW5nIHRvIFN1cmZhY2VWaWV3Iik7Ci0gICAgICAgICAgICB0YXJnZXRWaWV3ID0gbVN1cmZhY2VWaWV3OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biB2aWV3IHR5cGU6ICIgKyB2aWV3VHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgKChWaWV3KSB0YXJnZXRWaWV3KS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIHRhcmdldFZpZXcudGFrZU92ZXIobUN1cnJlbnRWaWV3KTsKLSAgICAgICAgbUluc3RhbmNlLnJlcXVlc3RMYXlvdXQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQ3VycmVudFZpZXcuZ2V0Vmlld1R5cGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21BY3Rpb25zX2ltcGwoCi0gICAgICAgICAgICBMaXN0PFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uPiBhY3Rpb25MaXN0LAotICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IsIFZpZGVvVmlldzIuT25DdXN0b21BY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtQ3VzdG9tQWN0aW9uTGlzdCA9IGFjdGlvbkxpc3Q7Ci0gICAgICAgIG1DdXN0b21BY3Rpb25MaXN0ZW5lclJlY29yZCA9IG5ldyBQYWlyPD4oZXhlY3V0b3IsIGxpc3RlbmVyKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcGxheWJhY2sgYnVpbGRlciBpbiBvcmRlciB0byBjbGVhciBleGlzdGluZyB0aGUgY3VzdG9tIGFjdGlvbnMuCi0gICAgICAgIG1TdGF0ZUJ1aWxkZXIgPSBudWxsOwotICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lcl9pbXBsKFZpZGVvVmlldzIuT25WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lciBsKSB7Ci0gICAgICAgIG1WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lciA9IGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lcl9pbXBsKFZpZGVvVmlldzIuT25GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyIGwpIHsKLSAgICAgICAgbUZ1bGxTY3JlZW5SZXF1ZXN0TGlzdGVuZXIgPSBsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvd19pbXBsKCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3dfaW1wbCgpOwotCi0gICAgICAgIC8vIENyZWF0ZSBNZWRpYVNlc3Npb24KLSAgICAgICAgbU1lZGlhU2Vzc2lvbiA9IG5ldyBNZWRpYVNlc3Npb24obUluc3RhbmNlLmdldENvbnRleHQoKSwgIlZpZGVvVmlldzJNZWRpYVNlc3Npb24iKTsKLSAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRDYWxsYmFjayhuZXcgTWVkaWFTZXNzaW9uQ2FsbGJhY2soKSk7Ci0gICAgICAgIG1NZWRpYVNlc3Npb24uc2V0QWN0aXZlKHRydWUpOwotICAgICAgICBtTWVkaWFDb250cm9sbGVyID0gbU1lZGlhU2Vzc2lvbi5nZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIG1NZWRpYVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICBtTWVkaWFSb3V0ZXIuc2V0TWVkaWFTZXNzaW9uKG1NZWRpYVNlc3Npb24pOwotICAgICAgICBtTWVkaWFSb3V0ZXIuYWRkQ2FsbGJhY2sobVJvdXRlU2VsZWN0b3IsIG1Sb3V0ZXJDYWxsYmFjayk7Ci0gICAgICAgIGF0dGFjaE1lZGlhQ29udHJvbFZpZXcoKTsKLSAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgYWZ0ZXIgbW92aW5nIE1lZGlhU2Vzc2lvbiBjcmVhdGluZyBjb2RlIGluc2lkZSBpbml0aWFsaXppbmcgVmlkZW9WaWV3MgotICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBTVEFURV9QUkVQQVJFRCkgewotICAgICAgICAgICAgZXh0cmFjdFRyYWNrcygpOwotICAgICAgICAgICAgZXh0cmFjdE1ldGFkYXRhKCk7Ci0gICAgICAgICAgICBleHRyYWN0QXVkaW9NZXRhZGF0YSgpOwotICAgICAgICAgICAgaWYgKG1OZWVkVXBkYXRlTWVkaWFUeXBlKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZW5kU2Vzc2lvbkV2ZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLkVWRU5UX1VQREFURV9NRURJQV9UWVBFX1NUQVRVUywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVR5cGVEYXRhKTsKLSAgICAgICAgICAgICAgICBtTmVlZFVwZGF0ZU1lZGlhVHlwZSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3dfaW1wbCgpIHsKLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3dfaW1wbCgpOwotCi0gICAgICAgIG1NZWRpYVNlc3Npb24ucmVsZWFzZSgpOwotICAgICAgICBtTWVkaWFTZXNzaW9uID0gbnVsbDsKLSAgICAgICAgbU1lZGlhQ29udHJvbGxlciA9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBWaWRlb1ZpZXcyLmNsYXNzLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uVG91Y2hFdmVudCgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChldi5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVAgJiYgbU1lZGlhQ29udHJvbFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFtSXNNdXNpY01lZGlhVHlwZSB8fCBtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICB0b2dnbGVNZWRpYUNvbnRyb2xWaWV3VmlzaWJpbGl0eSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLm9uVG91Y2hFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKLSAgICAgICAgaWYgKGV2LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCAmJiBtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIW1Jc011c2ljTWVkaWFUeXBlIHx8IG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRlVMTCkgewotICAgICAgICAgICAgICAgIHRvZ2dsZU1lZGlhQ29udHJvbFZpZXdWaXNpYmlsaXR5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3VwZXIub25UcmFja2JhbGxFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaFRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICAvLyBUT0RPOiBUZXN0IHRvdWNoIGV2ZW50IGhhbmRsaW5nIGxvZ2ljIHRob3JvdWdobHkgYW5kIHNpbXBsaWZ5IHRoZSBsb2dpYy4KLSAgICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoVG91Y2hFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbk1lYXN1cmVfaW1wbChpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIHN1cGVyLm9uTWVhc3VyZV9pbXBsKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICBpZiAobUlzTXVzaWNNZWRpYVR5cGUpIHsKLSAgICAgICAgICAgIGlmIChtUHJldldpZHRoICE9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZFdpZHRoKCkKLSAgICAgICAgICAgICAgICAgICAgfHwgbVByZXZIZWlnaHQgIT0gbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICBpbnQgY3VycldpZHRoID0gbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKTsKLSAgICAgICAgICAgICAgICBpbnQgY3VyckhlaWdodCA9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAgICAgICAgIFBvaW50IHNjcmVlblNpemUgPSBuZXcgUG9pbnQoKTsKLSAgICAgICAgICAgICAgICBtTWFuYWdlci5nZXREZWZhdWx0RGlzcGxheSgpLmdldFNpemUoc2NyZWVuU2l6ZSk7Ci0gICAgICAgICAgICAgICAgaW50IHNjcmVlbldpZHRoID0gc2NyZWVuU2l6ZS54OwotICAgICAgICAgICAgICAgIGludCBzY3JlZW5IZWlnaHQgPSBzY3JlZW5TaXplLnk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY3VycldpZHRoID09IHNjcmVlbldpZHRoICYmIGN1cnJIZWlnaHQgPT0gc2NyZWVuSGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBvcmllbnRhdGlvbiA9IHJldHJpZXZlT3JpZW50YXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uID09IEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fTEFORFNDQVBFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRlTXVzaWNWaWV3KFIubGF5b3V0LmZ1bGxfbGFuZHNjYXBlX211c2ljKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZnVsbF9wb3J0cmFpdF9tdXNpYyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobVNpemVUeXBlICE9IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2l6ZVR5cGUgPSBTSVpFX1RZUEVfRlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBleGlzdGluZyBtRmFkZU91dCBjYWxsYmFjawotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcucmVtb3ZlQ2FsbGJhY2tzKG1GYWRlT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0VNQkVEREVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2l6ZVR5cGUgPSBTSVpFX1RZUEVfRU1CRURERUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRlTXVzaWNWaWV3KFIubGF5b3V0LmVtYmVkZGVkX211c2ljKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBuZXcgbUZhZGVPdXQgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnBvc3REZWxheWVkKG1GYWRlT3V0LCBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUHJldldpZHRoID0gY3VycldpZHRoOwotICAgICAgICAgICAgICAgIG1QcmV2SGVpZ2h0ID0gY3VyckhlaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlLlN1cmZhY2VMaXN0ZW5lcgotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChWaWV3IHZpZXcsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU3VyZmFjZUNyZWF0ZWQoKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQotICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlICsgIiwgd2lkdGgvaGVpZ2h0OiAiICsgd2lkdGggKyAiLyIgKyBoZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCAiICsgdmlldy50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVlZFRvU3RhcnQoKSkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBsYXkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZURlc3Ryb3llZChWaWV3IHZpZXcpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VEZXN0cm95ZWQoKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQotICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlICsgIiwgIiArIHZpZXcudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIC8vIFRPRE86IERvIHdlIG5lZWQgdG8gY2FsbCByZXF1ZXN0TGF5b3V0IGhlcmU/Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlQ2hhbmdlZCgpLiB3aWR0aC9oZWlnaHQ6ICIgKyB3aWR0aCArICIvIiArIGhlaWdodAotICAgICAgICAgICAgICAgICAgICArICIsICIgKyB2aWV3LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGFrZU92ZXJEb25lKFZpZGVvVmlld0ludGVyZmFjZSB2aWV3KSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlVGFrZU92ZXJEb25lKCkuIE5vdyBjdXJyZW50IHZpZXcgaXM6ICIgKyB2aWV3KTsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudFZpZXcgPSB2aWV3OwotICAgICAgICBpZiAobVZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lci5vblZpZXdUeXBlQ2hhbmdlZChtSW5zdGFuY2UsIHZpZXcuZ2V0Vmlld1R5cGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5lZWRUb1N0YXJ0KCkpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wbGF5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBQcm90ZWN0ZWQgb3IgcHJpdmF0ZSBtZXRob2RzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoTWVkaWFDb250cm9sVmlldygpIHsKLSAgICAgICAgLy8gR2V0IE1lZGlhQ29udHJvbGxlciBmcm9tIE1lZGlhU2Vzc2lvbiBhbmQgc2V0IGl0IGluc2lkZSBNZWRpYUNvbnRyb2xWaWV3Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldENvbnRyb2xsZXIobU1lZGlhU2Vzc2lvbi5nZXRDb250cm9sbGVyKCkpOwotCi0gICAgICAgIExheW91dFBhcmFtcyBwYXJhbXMgPQotICAgICAgICAgICAgICAgIG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1NZWRpYUNvbnRyb2xWaWV3LCBwYXJhbXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0luUGxheWJhY2tTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChtTWVkaWFQbGF5ZXIgIT0gbnVsbCB8fCBtUm91dGVQbGF5ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX0VSUk9SCi0gICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9JRExFCi0gICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9QUkVQQVJJTkc7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG5lZWRUb1N0YXJ0KCkgewotICAgICAgICByZXR1cm4gKG1NZWRpYVBsYXllciAhPSBudWxsIHx8IG1Sb3V0ZVBsYXllciAhPSBudWxsKQotICAgICAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfUExBWUlORwotICAgICAgICAgICAgICAgICYmIG1UYXJnZXRTdGF0ZSA9PSBTVEFURV9QTEFZSU5HOwotICAgIH0KLQotICAgIC8vIENyZWF0ZXMgYSBNZWRpYVBsYXllcjIgaW5zdGFuY2UgYW5kIHByZXBhcmUgcGxheWJhY2suCi0gICAgcHJpdmF0ZSB2b2lkIG9wZW5WaWRlbyhEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgVXJpIHVyaSA9IGRzZC5nZXRVcmkoKTsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzID0gZHNkLmdldFVyaUhlYWRlcnMoKTsKLSAgICAgICAgcmVzZXRQbGF5ZXIoKTsKLSAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgewotICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9wZW5WaWRlbyhkc2QpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQXVkaW9Gb2N1c1R5cGUgIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfTk9ORSkgewotICAgICAgICAgICAgLy8gVE9ETyB0aGlzIHNob3VsZCBoYXZlIGEgZm9jdXMgbGlzdGVuZXIKLSAgICAgICAgICAgIEF1ZGlvRm9jdXNSZXF1ZXN0IGZvY3VzUmVxdWVzdDsKLSAgICAgICAgICAgIGZvY3VzUmVxdWVzdCA9IG5ldyBBdWRpb0ZvY3VzUmVxdWVzdC5CdWlsZGVyKG1BdWRpb0ZvY3VzVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgLnNldEF1ZGlvQXR0cmlidXRlcyhtQXVkaW9BdHRyaWJ1dGVzKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgIG1BdWRpb01hbmFnZXIucmVxdWVzdEF1ZGlvRm9jdXMoZm9jdXNSZXF1ZXN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvcGVuVmlkZW8oKTogY3JlYXRpbmcgbmV3IE1lZGlhUGxheWVyMiBpbnN0YW5jZS4iKTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllciA9IG5ldyBNZWRpYVBsYXllcjJJbXBsKCk7Ci0gICAgICAgICAgICBtU3VyZmFjZVZpZXcuc2V0TWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKTsKLSAgICAgICAgICAgIG1UZXh0dXJlVmlldy5zZXRNZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpOwotICAgICAgICAgICAgbUN1cnJlbnRWaWV3LmFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKG1NZWRpYVBsYXllcik7Ci0KLSAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IG1JbnN0YW5jZS5nZXRDb250ZXh0KCk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBBZGQgdGltZWx5IGZpcmluZyBsb2dpYyBmb3IgbW9yZSBhY2N1cmF0ZSBzeW5jIGJldHdlZW4gQ0MgYW5kIHZpZGVvIGZyYW1lCi0gICAgICAgICAgICBtU3VidGl0bGVDb250cm9sbGVyID0gbmV3IFN1YnRpdGxlQ29udHJvbGxlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIucmVnaXN0ZXJSZW5kZXJlcihuZXcgQ2xvc2VkQ2FwdGlvblJlbmRlcmVyKGNvbnRleHQpKTsKLSAgICAgICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIuc2V0QW5jaG9yKChTdWJ0aXRsZUNvbnRyb2xsZXIuQW5jaG9yKSBtU3VidGl0bGVWaWV3KTsKLSAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yID0gbmV3IEV4ZWN1dG9yKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcnVubmFibGUucnVuKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXRNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKGV4ZWN1dG9yLCBtTWVkaWFQbGF5ZXIyQ2FsbGJhY2spOwotCi0gICAgICAgICAgICBtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UgPSAtMTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXREYXRhU291cmNlKGRzZCk7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0QXVkaW9BdHRyaWJ1dGVzKG1BdWRpb0F0dHJpYnV0ZXMpOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldE9uU3VidGl0bGVEYXRhTGlzdGVuZXIobVN1YnRpdGxlTGlzdGVuZXIpOwotICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgc2V0IHRoZSB0YXJnZXQgc3RhdGUgaGVyZSBlaXRoZXIsIGJ1dCBwcmVzZXJ2ZSB0aGUKLSAgICAgICAgICAgIC8vIHRhcmdldCBzdGF0ZSB0aGF0IHdhcyB0aGVyZSBiZWZvcmUuCi0gICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUFJFUEFSSU5HOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyLnByZXBhcmUoKTsKLQotICAgICAgICAgICAgLy8gU2F2ZSBmaWxlIG5hbWUgYXMgdGl0bGUgc2luY2UgdGhlIGZpbGUgbWF5IG5vdCBoYXZlIGEgdGl0bGUgTWV0YWRhdGEuCi0gICAgICAgICAgICBtVGl0bGUgPSB1cmkuZ2V0UGF0aCgpOwotICAgICAgICAgICAgU3RyaW5nIHNjaGVtZSA9IHVyaS5nZXRTY2hlbWUoKTsKLSAgICAgICAgICAgIGlmIChzY2hlbWUgIT0gbnVsbCAmJiBzY2hlbWUuZXF1YWxzKCJmaWxlIikpIHsKLSAgICAgICAgICAgICAgICBtVGl0bGUgPSB1cmkuZ2V0TGFzdFBhdGhTZWdtZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUmV0cmlldmVyID0gbmV3IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIoKTsKLSAgICAgICAgICAgIG1SZXRyaWV2ZXIuc2V0RGF0YVNvdXJjZShtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCB1cmkpOwotCi0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvcGVuVmlkZW8oKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBtVGFyZ2V0U3RhdGU9IiArIG1UYXJnZXRTdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9wZW4gY29udGVudDogIiArIHVyaSwgZXgpOwotICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0VSUk9SOwotICAgICAgICAgICAgbVRhcmdldFN0YXRlID0gU1RBVEVfRVJST1I7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIyQ2FsbGJhY2sub25FcnJvcihtTWVkaWFQbGF5ZXIsIGRzZCwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyLk1FRElBX0VSUk9SX1VOS05PV04sIE1lZGlhUGxheWVyMi5NRURJQV9FUlJPUl9JTyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJlc2V0IHRoZSBtZWRpYSBwbGF5ZXIgaW4gYW55IHN0YXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0UGxheWVyKCkgewotICAgICAgICBpZiAobU1lZGlhUGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhUGxheWVyMiBwbGF5ZXIgPSBtTWVkaWFQbGF5ZXI7Ci0gICAgICAgICAgICBuZXcgQXN5bmNUYXNrPE1lZGlhUGxheWVyMiwgVm9pZCwgVm9pZD4oKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIFZvaWQgZG9JbkJhY2tncm91bmQoTWVkaWFQbGF5ZXIyLi4uIHBsYXllcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogRml4IE5QRSB3aGlsZSBNZWRpYVBsYXllcjIuY2xvc2UoKQotICAgICAgICAgICAgICAgICAgICAvL3BsYXllcnNbMF0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfS5leGVjdXRlT25FeGVjdXRvcihBc3luY1Rhc2suU0VSSUFMX0VYRUNVVE9SLCBwbGF5ZXIpOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyID0gbnVsbDsKLSAgICAgICAgICAgIG1UZXh0dXJlVmlldy5zZXRNZWRpYVBsYXllcihudWxsKTsKLSAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRNZWRpYVBsYXllcihudWxsKTsKLSAgICAgICAgICAgIC8vbVBlbmRpbmdTdWJ0aXRsZVRyYWNrcy5jbGVhcigpOwotICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9JRExFOwotICAgICAgICAgICAgaWYgKG1BdWRpb0ZvY3VzVHlwZSAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5hYmFuZG9uQXVkaW9Gb2N1cyhudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtVmlkZW9XaWR0aCA9IDA7Ci0gICAgICAgIG1WaWRlb0hlaWdodCA9IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXliYWNrU3RhdGUoKSB7Ci0gICAgICAgIGlmIChtU3RhdGVCdWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEdldCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBwbGF5ZXIgZm9yIHRoaXMgc3RyZWFtCi0gICAgICAgICAgICBtTWV0YWRhdGEgPSBtTWVkaWFQbGF5ZXIuZ2V0TWV0YWRhdGEoTWVkaWFQbGF5ZXIyLk1FVEFEQVRBX0FMTCwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyLkJZUEFTU19NRVRBREFUQV9GSUxURVIpOwotCi0gICAgICAgICAgICAvLyBBZGQgUGxheSBhY3Rpb24gYXMgZGVmYXVsdAotICAgICAgICAgICAgbG9uZyBwbGF5YmFja0FjdGlvbnMgPSBQbGF5YmFja1N0YXRlLkFDVElPTl9QTEFZOwotICAgICAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtTWV0YWRhdGEuaGFzKE1ldGFkYXRhLlBBVVNFX0FWQUlMQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlBBVVNFX0FWQUlMQUJMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tBY3Rpb25zIHw9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuU0VFS19CQUNLV0FSRF9BVkFJTEFCTEUpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtTWV0YWRhdGEuZ2V0Qm9vbGVhbihNZXRhZGF0YS5TRUVLX0JBQ0tXQVJEX0FWQUlMQUJMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tBY3Rpb25zIHw9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFtTWV0YWRhdGEuaGFzKE1ldGFkYXRhLlNFRUtfRk9SV0FSRF9BVkFJTEFCTEUpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtTWV0YWRhdGEuZ2V0Qm9vbGVhbihNZXRhZGF0YS5TRUVLX0ZPUldBUkRfQVZBSUxBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuU0VFS19BVkFJTEFCTEUpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtTWV0YWRhdGEuZ2V0Qm9vbGVhbihNZXRhZGF0YS5TRUVLX0FWQUlMQUJMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tBY3Rpb25zIHw9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1NFRUtfVE87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gKFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORCB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX0ZBU1RfRk9SV0FSRCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBQbGF5YmFja1N0YXRlLkFDVElPTl9TRUVLX1RPKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TdGF0ZUJ1aWxkZXIgPSBuZXcgUGxheWJhY2tTdGF0ZS5CdWlsZGVyKCk7Ci0gICAgICAgICAgICBtU3RhdGVCdWlsZGVyLnNldEFjdGlvbnMocGxheWJhY2tBY3Rpb25zKTsKLQotICAgICAgICAgICAgaWYgKG1DdXN0b21BY3Rpb25MaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uIGFjdGlvbiA6IG1DdXN0b21BY3Rpb25MaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZUJ1aWxkZXIuYWRkQ3VzdG9tQWN0aW9uKGFjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1TdGF0ZUJ1aWxkZXIuc2V0U3RhdGUoZ2V0Q29ycmVzcG9uZGluZ1BsYXliYWNrU3RhdGUoKSwKLSAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCksIG1TcGVlZCk7Ci0gICAgICAgIGlmIChtQ3VycmVudFN0YXRlICE9IFNUQVRFX0VSUk9SCi0gICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX0lETEUKLSAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfUFJFUEFSSU5HKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiB0aGlzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIE1lZGlhUGxheWVyMi5nZXRCdWZmZXJlZFBvc2l0aW9uKCkgb25jZSBpdCBpcwotICAgICAgICAgICAgLy8gaW1wbGVtZW50ZWQuCi0gICAgICAgICAgICBpZiAobUN1cnJlbnRCdWZmZXJQZXJjZW50YWdlID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXRlQnVpbGRlci5zZXRCdWZmZXJlZFBvc2l0aW9uKC0xKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVN0YXRlQnVpbGRlci5zZXRCdWZmZXJlZFBvc2l0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIChtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UgLyAxMDAuMCAqIG1NZWRpYVBsYXllci5nZXREdXJhdGlvbigpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgUGxheWJhY2tTdGF0ZSBmb3IgTWVkaWFTZXNzaW9uCi0gICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIFBsYXliYWNrU3RhdGUgc3RhdGUgPSBtU3RhdGVCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgICAgICAgICBtTWVkaWFTZXNzaW9uLnNldFBsYXliYWNrU3RhdGUoc3RhdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0Q29ycmVzcG9uZGluZ1BsYXliYWNrU3RhdGUoKSB7Ci0gICAgICAgIHN3aXRjaCAobUN1cnJlbnRTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBTVEFURV9FUlJPUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9FUlJPUjsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfSURMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9OT05FOwotICAgICAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBsYXliYWNrU3RhdGUuU1RBVEVfQ09OTkVDVElORzsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBsYXliYWNrU3RhdGUuU1RBVEVfUEFVU0VEOwotICAgICAgICAgICAgY2FzZSBTVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX1BMQVlCQUNLX0NPTVBMRVRFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9TVE9QUEVEOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1GYWRlT3V0ID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgPT0gU1RBVEVfUExBWUlORykgewotICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHZvaWQgc2hvd0NvbnRyb2xsZXIoKSB7Ci0gICAgICAgIC8vIFRPRE86IERlY2lkZSB3aGF0IHRvIHNob3cgd2hlbiB0aGUgc3RhdGUgaXMgbm90IGluIHBsYXliYWNrIHN0YXRlCi0gICAgICAgIGlmIChtTWVkaWFDb250cm9sVmlldyA9PSBudWxsIHx8ICFpc0luUGxheWJhY2tTdGF0ZSgpCi0gICAgICAgICAgICAgICAgfHwgKG1Jc011c2ljTWVkaWFUeXBlICYmIG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRlVMTCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtTWVkaWFDb250cm9sVmlldy5yZW1vdmVDYWxsYmFja3MobUZhZGVPdXQpOwotICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIGlmIChtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zICE9IDAKLSAgICAgICAgICAgICYmICFtQWNjZXNzaWJpbGl0eU1hbmFnZXIuaXNUb3VjaEV4cGxvcmF0aW9uRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5wb3N0RGVsYXllZChtRmFkZU91dCwgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdG9nZ2xlTWVkaWFDb250cm9sVmlld1Zpc2liaWxpdHkoKSB7Ci0gICAgICAgIGlmIChtTWVkaWFDb250cm9sVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5yZW1vdmVDYWxsYmFja3MobUZhZGVPdXQpOwotICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhcHBseVNwZWVkKCkgewotICAgICAgICBQbGF5YmFja1BhcmFtcyBwYXJhbXMgPSBtTWVkaWFQbGF5ZXIuZ2V0UGxheWJhY2tQYXJhbXMoKS5hbGxvd0RlZmF1bHRzKCk7Ci0gICAgICAgIGlmIChtU3BlZWQgIT0gcGFyYW1zLmdldFNwZWVkKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1zLnNldFNwZWVkKG1TcGVlZCk7Ci0gICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldFBsYXliYWNrUGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgbUZhbGxiYWNrU3BlZWQgPSBtU3BlZWQ7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlBsYXliYWNrUGFyYW1zIGhhcyB1bnN1cHBvcnRlZCB2YWx1ZTogIiArIGUpOwotICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCByZXZpc2UgdGhpcyBwYXJ0IGFmdGVyIGludGVncmF0aW5nIHdpdGggTVAyLgotICAgICAgICAgICAgICAgIC8vIElmIG1TcGVlZCBoYWQgYW4gaWxsZWdhbCB2YWx1ZSBmb3Igc3BlZWQgcmF0ZSwgc3lzdGVtIHdpbGwgZGV0ZXJtaW5lIGJlc3QKLSAgICAgICAgICAgICAgICAvLyBoYW5kbGluZyAoc2VlIFBsYXliYWNrUGFyYW1zLkFVRElPX0ZBTExCQUNLX01PREVfREVGQVVMVCkuCi0gICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIHByZS1NUDIgcmV0dXJucyAwLjBmIHdoZW4gaXQgaXMgcGF1c2VkLiBJbiB0aGlzIGNhc2UsIFZpZGVvVmlldzIgd2lsbAotICAgICAgICAgICAgICAgIC8vIHVzZSBtRmFsbGJhY2tTcGVlZCBpbnN0ZWFkLgotICAgICAgICAgICAgICAgIGZsb2F0IGZhbGxiYWNrU3BlZWQgPSBtTWVkaWFQbGF5ZXIuZ2V0UGxheWJhY2tQYXJhbXMoKS5hbGxvd0RlZmF1bHRzKCkuZ2V0U3BlZWQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZmFsbGJhY2tTcGVlZCA+IDAuMGYpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZhbGxiYWNrU3BlZWQgPSBmYWxsYmFja1NwZWVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtU3BlZWQgPSBtRmFsbGJhY2tTcGVlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlbW90ZVBsYXliYWNrKCkgewotICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgUGxheWJhY2tJbmZvIHBsYXliYWNrSW5mbyA9IG1NZWRpYUNvbnRyb2xsZXIuZ2V0UGxheWJhY2tJbmZvKCk7Ci0gICAgICAgIHJldHVybiBwbGF5YmFja0luZm8gIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIHBsYXliYWNrSW5mby5nZXRQbGF5YmFja1R5cGUoKSA9PSBQbGF5YmFja0luZm8uUExBWUJBQ0tfVFlQRV9SRU1PVEU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbGVjdE9yRGVzZWxlY3RTdWJ0aXRsZShib29sZWFuIHNlbGVjdCkgewotICAgICAgICBpZiAoIWlzSW5QbGF5YmFja1N0YXRlKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0KSB7Ci0gICAgICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBtYWtlIHRoaXMgc2VsZWN0aW9uIGR5bmFtaWMKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBtU3VidGl0bGVUcmFja0luZGljZXMuZ2V0KDApLmZpcnN0OwotICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIuc2VsZWN0VHJhY2sobVN1YnRpdGxlVHJhY2tJbmRpY2VzLmdldCgwKS5zZWNvbmQpOwotICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZWxlY3RUcmFjayhtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpOwotICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCAhPSBJTlZBTElEX1RSQUNLX0lOREVYKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLmRlc2VsZWN0VHJhY2sobVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBJTlZBTElEX1RSQUNLX0lOREVYOwotICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RUcmFja3MoKSB7Ci0gICAgICAgIExpc3Q8TWVkaWFQbGF5ZXIyLlRyYWNrSW5mbz4gdHJhY2tJbmZvcyA9IG1NZWRpYVBsYXllci5nZXRUcmFja0luZm8oKTsKLSAgICAgICAgbVZpZGVvVHJhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIG1BdWRpb1RyYWNrSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBtU3VidGl0bGVUcmFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5yZXNldCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYWNrSW5mb3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGludCB0cmFja1R5cGUgPSB0cmFja0luZm9zLmdldChpKS5nZXRUcmFja1R5cGUoKTsKLSAgICAgICAgICAgIGlmICh0cmFja1R5cGUgPT0gTWVkaWFQbGF5ZXIyLlRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1ZJREVPKSB7Ci0gICAgICAgICAgICAgICAgbVZpZGVvVHJhY2tJbmRpY2VzLmFkZChpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2tUeXBlID09IE1lZGlhUGxheWVyMi5UcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9BVURJTykgewotICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrSW5kaWNlcy5hZGQoaSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRyYWNrVHlwZSA9PSBNZWRpYVBsYXllcjIuVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUKLSAgICAgICAgICAgICAgICAgICAgfHwgdHJhY2tUeXBlID09IE1lZGlhUGxheWVyMi5UcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQpIHsKLSAgICAgICAgICAgICAgICBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gbVN1YnRpdGxlQ29udHJvbGxlci5hZGRUcmFjayh0cmFja0luZm9zLmdldChpKS5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlVHJhY2tJbmRpY2VzLmFkZChuZXcgUGFpcjw+KGksIHRyYWNrKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFNlbGVjdCBmaXJzdCB0cmFja3MgYXMgZGVmYXVsdAotICAgICAgICBpZiAobVZpZGVvVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFZpZGVvVHJhY2tJbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1BdWRpb1RyYWNrSW5kaWNlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXggPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVmlkZW9UcmFja0luZGljZXMuc2l6ZSgpID09IDAgJiYgbUF1ZGlvVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1Jc011c2ljTWVkaWFUeXBlID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEJ1bmRsZSBkYXRhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBkYXRhLnB1dEludChNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX1ZJREVPX1RSQUNLX0NPVU5ULCBtVmlkZW9UcmFja0luZGljZXMuc2l6ZSgpKTsKLSAgICAgICAgZGF0YS5wdXRJbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9BVURJT19UUkFDS19DT1VOVCwgbUF1ZGlvVHJhY2tJbmRpY2VzLnNpemUoKSk7Ci0gICAgICAgIGRhdGEucHV0SW50KE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfU1VCVElUTEVfVFJBQ0tfQ09VTlQsIG1TdWJ0aXRsZVRyYWNrSW5kaWNlcy5zaXplKCkpOwotICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHNlbGVjdE9yRGVzZWxlY3RTdWJ0aXRsZShtU3VidGl0bGVFbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBtTWVkaWFTZXNzaW9uLnNlbmRTZXNzaW9uRXZlbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLkVWRU5UX1VQREFURV9UUkFDS19TVEFUVVMsIGRhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0TWV0YWRhdGEoKSB7Ci0gICAgICAgIC8vIEdldCBhbmQgc2V0IGR1cmF0aW9uIGFuZCB0aXRsZSB2YWx1ZXMgYXMgTWVkaWFNZXRhZGF0YSBmb3IgTWVkaWFDb250cm9sVmlldzIKLSAgICAgICAgTWVkaWFNZXRhZGF0YS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTWVkaWFNZXRhZGF0YS5CdWlsZGVyKCk7Ci0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCAmJiBtTWV0YWRhdGEuaGFzKE1ldGFkYXRhLlRJVExFKSkgewotICAgICAgICAgICAgbVRpdGxlID0gbU1ldGFkYXRhLmdldFN0cmluZyhNZXRhZGF0YS5USVRMRSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5wdXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUsIG1UaXRsZSk7Ci0gICAgICAgIGJ1aWxkZXIucHV0TG9uZygKLSAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9EVVJBVElPTiwgbU1lZGlhUGxheWVyLmdldER1cmF0aW9uKCkpOwotCi0gICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0TWV0YWRhdGEoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0QXVkaW9NZXRhZGF0YSgpIHsKLSAgICAgICAgaWYgKCFtSXNNdXNpY01lZGlhVHlwZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVJlc291cmNlcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0gICAgICAgIG1NYW5hZ2VyID0gKFdpbmRvd01hbmFnZXIpIG1JbnN0YW5jZS5nZXRDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkKLSAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKTsKLQotICAgICAgICBieXRlW10gYWxidW0gPSBtUmV0cmlldmVyLmdldEVtYmVkZGVkUGljdHVyZSgpOwotICAgICAgICBpZiAoYWxidW0gIT0gbnVsbCkgewotICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KGFsYnVtLCAwLCBhbGJ1bS5sZW5ndGgpOwotICAgICAgICAgICAgbU11c2ljQWxidW1EcmF3YWJsZSA9IG5ldyBCaXRtYXBEcmF3YWJsZShiaXRtYXApOwotCi0gICAgICAgICAgICAvLyBUT0RPOiByZXBsYWNlIHdpdGggdmlzdWFsaXplcgotICAgICAgICAgICAgUGFsZXR0ZS5nZW5lcmF0ZUFzeW5jKGJpdG1hcCwgbmV3IFBhbGV0dGUuUGFsZXR0ZUFzeW5jTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25HZW5lcmF0ZWQoUGFsZXR0ZSBwYWxldHRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZCBkb21pbmFudCBjb2xvciBmb3IgZGVmYXVsdCBhbGJ1bSBpbWFnZS4KLSAgICAgICAgICAgICAgICAgICAgbURvbWluYW50Q29sb3IgPSBwYWxldHRlLmdldERvbWluYW50Q29sb3IoMCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTXVzaWNWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NdXNpY1ZpZXcuc2V0QmFja2dyb3VuZENvbG9yKG1Eb21pbmFudENvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU11c2ljQWxidW1EcmF3YWJsZSA9IG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19kZWZhdWx0X2FsYnVtX2ltYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG1SZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX1RJVExFKTsKLSAgICAgICAgaWYgKHRpdGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NdXNpY1RpdGxlVGV4dCA9IHRpdGxlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU11c2ljVGl0bGVUZXh0ID0gbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9tdXNpY190aXRsZV91bmtub3duX3RleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGFydGlzdCA9IG1SZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX0FSVElTVCk7Ci0gICAgICAgIGlmIChhcnRpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgbU11c2ljQXJ0aXN0VGV4dCA9IGFydGlzdDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1NdXNpY0FydGlzdFRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2VuZCB0aXRsZSBhbmQgYXJ0aXN0IHN0cmluZyB0byBNZWRpYUNvbnRyb2xWaWV3MgotICAgICAgICBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5wdXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUsIG1NdXNpY1RpdGxlVGV4dCk7Ci0gICAgICAgIGJ1aWxkZXIucHV0U3RyaW5nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0FSVElTVCwgbU11c2ljQXJ0aXN0VGV4dCk7Ci0gICAgICAgIG1NZWRpYVNlc3Npb24uc2V0TWV0YWRhdGEoYnVpbGRlci5idWlsZCgpKTsKLQotICAgICAgICAvLyBEaXNwbGF5IEVtYmVkZGVkIG1vZGUgYXMgZGVmYXVsdAotICAgICAgICBtSW5zdGFuY2UucmVtb3ZlVmlldyhtU3VyZmFjZVZpZXcpOwotICAgICAgICBtSW5zdGFuY2UucmVtb3ZlVmlldyhtVGV4dHVyZVZpZXcpOwotICAgICAgICBpbmZsYXRlTXVzaWNWaWV3KFIubGF5b3V0LmVtYmVkZGVkX211c2ljKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCByZXRyaWV2ZU9yaWVudGF0aW9uKCkgewotICAgICAgICBEaXNwbGF5TWV0cmljcyBkbSA9IFJlc291cmNlcy5nZXRTeXN0ZW0oKS5nZXREaXNwbGF5TWV0cmljcygpOwotICAgICAgICBpbnQgd2lkdGggPSBkbS53aWR0aFBpeGVsczsKLSAgICAgICAgaW50IGhlaWdodCA9IGRtLmhlaWdodFBpeGVsczsKLQotICAgICAgICByZXR1cm4gKGhlaWdodCA+IHdpZHRoKSA/Ci0gICAgICAgICAgICAgICAgQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9QT1JUUkFJVCA6Ci0gICAgICAgICAgICAgICAgQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9MQU5EU0NBUEU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluZmxhdGVNdXNpY1ZpZXcoaW50IGxheW91dElkKSB7Ci0gICAgICAgIG1JbnN0YW5jZS5yZW1vdmVWaWV3KG1NdXNpY1ZpZXcpOwotCi0gICAgICAgIFZpZXcgdiA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIGxheW91dElkKTsKLSAgICAgICAgdi5zZXRCYWNrZ3JvdW5kQ29sb3IobURvbWluYW50Q29sb3IpOwotCi0gICAgICAgIEltYWdlVmlldyBhbGJ1bVZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmFsYnVtKTsKLSAgICAgICAgaWYgKGFsYnVtVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhbGJ1bVZpZXcuc2V0SW1hZ2VEcmF3YWJsZShtTXVzaWNBbGJ1bURyYXdhYmxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFRleHRWaWV3IHRpdGxlVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGl0bGUpOwotICAgICAgICBpZiAodGl0bGVWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRpdGxlVmlldy5zZXRUZXh0KG1NdXNpY1RpdGxlVGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBUZXh0VmlldyBhcnRpc3RWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5hcnRpc3QpOwotICAgICAgICBpZiAoYXJ0aXN0VmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhcnRpc3RWaWV3LnNldFRleHQobU11c2ljQXJ0aXN0VGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtTXVzaWNWaWV3ID0gdjsKLSAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobU11c2ljVmlldywgMCk7Ci0gICAgfQotCi0gICAgT25TdWJ0aXRsZURhdGFMaXN0ZW5lciBtU3VidGl0bGVMaXN0ZW5lciA9Ci0gICAgICAgICAgICBuZXcgT25TdWJ0aXRsZURhdGFMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1YnRpdGxlRGF0YShNZWRpYVBsYXllcjIgbXAsIFN1YnRpdGxlRGF0YSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdWJ0aXRsZURhdGEoKTogZ2V0VHJhY2tJbmRleDogIiArIGRhdGEuZ2V0VHJhY2tJbmRleCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZ2V0Q3VycmVudFBvc2l0aW9uOiAiICsgbXAuZ2V0Q3VycmVudFBvc2l0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBnZXRTdGFydFRpbWVVcygpOiAiICsgZGF0YS5nZXRTdGFydFRpbWVVcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZGlmZjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChkYXRhLmdldFN0YXJ0VGltZVVzKCkvMTAwMCAtIG1wLmdldEN1cnJlbnRQb3NpdGlvbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJtcywgZ2V0RHVyYXRpb25VcygpOiAiICsgZGF0YS5nZXREdXJhdGlvblVzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGRhdGEuZ2V0VHJhY2tJbmRleCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblN1YnRpdGxlRGF0YSgpOiBnZXRUcmFja0luZGV4OiAiICsgZGF0YS5nZXRUcmFja0luZGV4KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZWxlY3RlZCB0cmFjayBpbmRleDogIiArIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChQYWlyPEludGVnZXIsIFN1YnRpdGxlVHJhY2s+IHAgOiBtU3VidGl0bGVUcmFja0luZGljZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLmZpcnN0ID09IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VidGl0bGVUcmFjayB0cmFjayA9IHAuc2Vjb25kOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLm9uRGF0YShkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICBNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrIG1NZWRpYVBsYXllcjJDYWxsYmFjayA9Ci0gICAgICAgICAgICBuZXcgTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjaygpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblZpZGVvU2l6ZUNoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25WaWRlb1NpemVDaGFuZ2VkKCk6IHNpemU6ICIgKyB3aWR0aCArICIvIiArIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGggPSBtcC5nZXRWaWRlb1dpZHRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodCA9IG1wLmdldFZpZGVvSGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25WaWRlb1NpemVDaGFuZ2VkKCk6IG1WaWRlb1NpemU6IiArIG1WaWRlb1dpZHRoICsgIi8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvV2lkdGggIT0gMCAmJiBtVmlkZW9IZWlnaHQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aW1lZCB0ZXh0IHJlbGF0ZWQgY29kZSBsYXRlciBvbmNlIHJlbGV2YW50IFJlbmRlcmVyIGlzIGRlZmluZWQuCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBqdXN0IGZvciBkZWJ1Z2dpbmcgcHVycG9zZS4KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblRpbWVkVGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBUaW1lZFRleHQgdGV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGltZWRUZXh0OiAiICsgdGV4dC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwgaW50IGV4dHJhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX01FVEFEQVRBX1VQREFURSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdFRyYWNrcygpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUFJFUEFSRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25QcmVwYXJlZChtcCwgZHNkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX1BMQVlCQUNLX0NPTVBMRVRFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ29tcGxldGlvbihtcCwgZHNkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX0JVRkZFUklOR19VUERBVEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25CdWZmZXJpbmdVcGRhdGUobXAsIGRzZCwgZXh0cmEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgZnJhbWV3b3JrRXJyLCBpbnQgaW1wbEVycikgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkVycm9yOiAiICsgZnJhbWV3b3JrRXJyICsgIiwiICsgaW1wbEVycik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbGxDb21wbGV0ZWQoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuQ0FMTF9DT01QTEVURURfU0VFS19UTyAmJiBzdGF0dXMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG9uUHJlcGFyZWQoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJPblByZXBhcmVkTGlzdGVuZXIoKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUFJFUEFSRUQ7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhbmQgc2V0IHBsYXliYWNrIHN0YXRlIGZvciBNZWRpYUNvbnRyb2xWaWV3MgotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogY2hhbmdlIHRoaXMgdG8gc2VuZCBUcmFja0luZm9zIHRvIE1lZGlhQ29udHJvbFZpZXcyCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGNyZWF0ZSBNZWRpYVNlc3Npb24gd2hlbiBpbml0aWFsaXppbmcgVmlkZW9WaWV3MgotICAgICAgICAgICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0VHJhY2tzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0TWV0YWRhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RBdWRpb01ldGFkYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobU1lZGlhQ29udHJvbFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnQgdmlkZW9XaWR0aCA9IG1wLmdldFZpZGVvV2lkdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHZpZGVvSGVpZ2h0ID0gbXAuZ2V0VmlkZW9IZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBtU2Vla1doZW5QcmVwYXJlZCBtYXkgYmUgY2hhbmdlZCBhZnRlciBzZWVrVG8oKSBjYWxsCi0gICAgICAgICAgICAgICAgICAgIGxvbmcgc2Vla1RvUG9zaXRpb24gPSBtU2Vla1doZW5QcmVwYXJlZDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlZWtUb1Bvc2l0aW9uICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5zZWVrVG8oc2Vla1RvUG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvV2lkdGggIT0gMCAmJiB2aWRlb0hlaWdodCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9XaWR0aCAhPSBtVmlkZW9XaWR0aCB8fCB2aWRlb0hlaWdodCAhPSBtVmlkZW9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiT25QcmVwYXJlZExpc3RlbmVyKCkgOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiIHZpZGVvIHNpemU6ICIgKyB2aWRlb1dpZHRoICsgIi8iICsgdmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICIgbWVhc3VyZWRTaXplOiAiICsgbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKSArICIvIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICIgdmlld1NpemU6ICIgKyBtSW5zdGFuY2UuZ2V0V2lkdGgoKSArICIvIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUluc3RhbmNlLmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGggPSB2aWRlb1dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodCA9IHZpZGVvSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5yZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkVG9TdGFydCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgdGhlIHZpZGVvIHNpemUgeWV0LCBidXQgc2hvdWxkIHN0YXJ0IGFueXdheS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB2aWRlbyBzaXplIG1pZ2h0IGJlIHJlcG9ydGVkIHRvIHVzIGxhdGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRUb1N0YXJ0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG9uQ29tcGxldGlvbihNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUExBWUJBQ0tfQ09NUExFVEVEOwotICAgICAgICAgICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9QTEFZQkFDS19DT01QTEVURUQ7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0ZvY3VzVHlwZSAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmFiYW5kb25BdWRpb0ZvY3VzKG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG9uQnVmZmVyaW5nVXBkYXRlKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgcGVyY2VudCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UgPSBwZXJjZW50OwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgIHByaXZhdGUgY2xhc3MgTWVkaWFTZXNzaW9uQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVNlc3Npb24uQ2FsbGJhY2sgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Db21tYW5kKFN0cmluZyBjb21tYW5kLCBCdW5kbGUgYXJncywgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKLSAgICAgICAgICAgIGlmIChpc1JlbW90ZVBsYXliYWNrKCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25Db21tYW5kKGNvbW1hbmQsIGFyZ3MsIHJlY2VpdmVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfU0hPV19TVUJUSVRMRToKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJ0aXRsZUluZGV4ID0gYXJncy5nZXRJbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfU0VMRUNURURfU1VCVElUTEVfSU5ERVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkFMSURfVFJBQ0tfSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnRpdGxlSW5kZXggIT0gSU5WQUxJRF9UUkFDS19JTkRFWCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJ0aXRsZVRyYWNrSW5kZXggPSBtU3VidGl0bGVUcmFja0luZGljZXMuZ2V0KHN1YnRpdGxlSW5kZXgpLmZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJ0aXRsZVRyYWNrSW5kZXggIT0gbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCA9IHN1YnRpdGxlVHJhY2tJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnNldFN1YnRpdGxlRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9ISURFX1NVQlRJVExFOgotICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnNldFN1YnRpdGxlRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TRVRfRlVMTFNDUkVFTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5SZXF1ZXN0TGlzdGVuZXIub25GdWxsU2NyZWVuUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuZ2V0Qm9vbGVhbihNZWRpYUNvbnRyb2xWaWV3MkltcGwuQVJHVU1FTlRfS0VZX0ZVTExTQ1JFRU4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NFTEVDVF9BVURJT19UUkFDSzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb0luZGV4ID0gYXJncy5nZXRJbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TRUxFQ1RFRF9BVURJT19JTkRFWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9UUkFDS19JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9JbmRleCAhPSBJTlZBTElEX1RSQUNLX0lOREVYKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvVHJhY2tJbmRleCA9IG1BdWRpb1RyYWNrSW5kaWNlcy5nZXQoYXVkaW9JbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvVHJhY2tJbmRleCAhPSBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4ID0gYXVkaW9UcmFja0luZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2VsZWN0VHJhY2sobVNlbGVjdGVkQXVkaW9UcmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TRVRfUExBWUJBQ0tfU1BFRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzcGVlZCA9IGFyZ3MuZ2V0RmxvYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfUExBWUJBQ0tfU1BFRUQsIElOVkFMSURfU1BFRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwZWVkICE9IElOVkFMSURfU1BFRUQgJiYgc3BlZWQgIT0gbVNwZWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnNldFNwZWVkKHNwZWVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3BlZWQgPSBzcGVlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX01VVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lTGV2ZWwgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMsIDAsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfVU5NVVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQywgbVZvbHVtZUxldmVsLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNob3dDb250cm9sbGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DdXN0b21BY3Rpb24oU3RyaW5nIGFjdGlvbiwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkLmZpcnN0LmV4ZWN1dGUoKCkgLT4KLSAgICAgICAgICAgICAgICAgICAgbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkLnNlY29uZC5vbkN1c3RvbUFjdGlvbihhY3Rpb24sIGV4dHJhcykpOwotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXkoKSB7Ci0gICAgICAgICAgICBpZiAoaXNJblBsYXliYWNrU3RhdGUoKSAmJiAobUN1cnJlbnRWaWV3Lmhhc0F2YWlsYWJsZVN1cmZhY2UoKSB8fCBtSXNNdXNpY01lZGlhVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vblBsYXkoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhcHBseVNwZWVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5wbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVRhcmdldFN0YXRlID0gU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUGxheSgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNob3dDb250cm9sbGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgICAgIGlmIChpc0luUGxheWJhY2tTdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25QYXVzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUEFVU0VEOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobU1lZGlhUGxheWVyLmlzUGxheWluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5wYXVzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUEFVU0VEOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVRhcmdldFN0YXRlID0gU1RBVEVfUEFVU0VEOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25QYXVzZSgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNob3dDb250cm9sbGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZWVrVG8obG9uZyBwb3MpIHsKLSAgICAgICAgICAgIGlmIChpc0luUGxheWJhY2tTdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25TZWVrVG8ocG9zKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2Vla1RvKHBvcywgTWVkaWFQbGF5ZXIyLlNFRUtfUFJFVklPVVNfU1lOQyk7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWVrV2hlblByZXBhcmVkID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TZWVrV2hlblByZXBhcmVkID0gcG9zOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9uU3RvcCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXNldFBsYXllcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVmlld0ludGVyZmFjZS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3SW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NGQ0N2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3SW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotCi1pbnRlcmZhY2UgVmlkZW9WaWV3SW50ZXJmYWNlIHsKLSAgICAvKioKLSAgICAgKiBBc3NpZ25zIHRoZSB2aWV3J3Mgc3VyZmFjZSB0byB0aGUgZ2l2ZW4gTWVkaWFQbGF5ZXIyIGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1wIE1lZGlhUGxheWVyMgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3VyZmFjZSBpcyBzdWNjZXNzZnVsbHkgYXNzaWduZWQsIGZhbHNlIGlmIG5vdC4gSXQgd2lsbCBmYWlsIHRvIGFzc2lnbgotICAgICAqICAgICAgICAgaWYgYW55IG9mIE1lZGlhUGxheWVyMiBvciBzdXJmYWNlIGlzIHVuYXZhaWxhYmxlLgotICAgICAqLwotICAgIGJvb2xlYW4gYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKTsKLSAgICB2b2lkIHNldFN1cmZhY2VMaXN0ZW5lcihTdXJmYWNlTGlzdGVuZXIgbCk7Ci0gICAgaW50IGdldFZpZXdUeXBlKCk7Ci0gICAgdm9pZCBzZXRNZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApOwotCi0gICAgLyoqCi0gICAgICogVGFrZXMgb3ZlciBvbGRWaWV3LiBJdCBtZWFucyB0aGF0IHRoZSBNZWRpYVBsYXllcjIgd2lsbCBzdGFydCByZW5kZXJpbmcgb24gdGhpcyB2aWV3LgotICAgICAqIFRoZSB2aXNpYmlsaXR5IG9mIG9sZFZpZXcgd2lsbCBiZSBzZXQgYXMge0BsaW5rIFZpZXcuR09ORX0uIElmIHRoZSB2aWV3IGRvZXNuJ3QgaGF2ZSBhCi0gICAgICogTWVkaWFQbGF5ZXIyIGluc3RhbmNlIG9yIGl0cyBzdXJmYWNlIGlzIG5vdCBhdmFpbGFibGUsIHRoZSBhY3R1YWwgZXhlY3V0aW9uIGlzIGRlZmVycmVkIHVudGlsCi0gICAgICogYSBNZWRpYVBsYXllcjIgaW5zdGFuY2UgaXMgc2V0IGJ5IHtAbGluayAjc2V0TWVkaWFQbGF5ZXJ9IG9yIGl0cyBzdXJmYWNlIGJlY29tZXMgYXZhaWxhYmxlLgotICAgICAqIHtAbGluayBTdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlVGFrZU92ZXJEb25lfSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBhY3R1YWwgZXhlY3V0aW9uIGlzCi0gICAgICogZG9uZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvbGRWaWV3IFRoZSB2aWV3IHRoYXQgTWVkaWFQbGF5ZXIyIGlzIGN1cnJlbnRseSByZW5kZXJpbmcgb24uCi0gICAgICovCi0gICAgdm9pZCB0YWtlT3ZlcihATm9uTnVsbCBWaWRlb1ZpZXdJbnRlcmZhY2Ugb2xkVmlldyk7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHZpZXcncyBzdXJmYWNlIGlzIGF2YWlsYWJsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3VyZmFjZSBpcyBhdmFpbGFibGUuCi0gICAgICovCi0gICAgYm9vbGVhbiBoYXNBdmFpbGFibGVTdXJmYWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBpbnN0YW5jZSBvZiBWaWRlb1ZpZXdJbnRlcmZhY2UgY2FsbHMgdGhlc2Ugc3VyZmFjZSBub3RpZmljYXRpb24gbWV0aG9kcyBhY2NvcmRpbmdseSBpZgotICAgICAqIGEgbGlzdGVuZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZCB2aWEge0BsaW5rICNzZXRTdXJmYWNlTGlzdGVuZXIoU3VyZmFjZUxpc3RlbmVyKX0uCi0gICAgICovCi0gICAgaW50ZXJmYWNlIFN1cmZhY2VMaXN0ZW5lciB7Ci0gICAgICAgIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChWaWV3IHZpZXcsIGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0gICAgICAgIHZvaWQgb25TdXJmYWNlRGVzdHJveWVkKFZpZXcgdmlldyk7Ci0gICAgICAgIHZvaWQgb25TdXJmYWNlQ2hhbmdlZChWaWV3IHZpZXcsIGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0gICAgICAgIHZvaWQgb25TdXJmYWNlVGFrZU92ZXJEb25lKFZpZGVvVmlld0ludGVyZmFjZSB2aWV3KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWV3R3JvdXBJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWV3R3JvdXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMDY4MjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlld0dyb3VwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlld0dyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFZpZXdHcm91cEltcGwgaW1wbGVtZW50cyBWaWV3R3JvdXBQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3R3JvdXBQcm92aWRlciBtU3VwZXJQcm92aWRlcjsKLQotICAgIHB1YmxpYyBWaWV3R3JvdXBJbXBsKFZpZXdHcm91cCBpbnN0YW5jZSwKLSAgICAgICAgICAgIFZpZXdHcm91cFByb3ZpZGVyIHN1cGVyUHJvdmlkZXIsIFZpZXdHcm91cFByb3ZpZGVyIHByaXZhdGVQcm92aWRlcikgewotICAgICAgICBtU3VwZXJQcm92aWRlciA9IHN1cGVyUHJvdmlkZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93X2ltcGwoKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm9uQXR0YWNoZWRUb1dpbmRvd19pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3dfaW1wbCgpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25EZXRhY2hlZEZyb21XaW5kb3dfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0QWNjZXNzaWJpbGl0eUNsYXNzTmFtZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2V0QWNjZXNzaWJpbGl0eUNsYXNzTmFtZV9pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLm9uVG91Y2hFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLm9uVHJhY2tiYWxsRXZlbnRfaW1wbChldik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25GaW5pc2hJbmZsYXRlX2ltcGwoKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm9uRmluaXNoSW5mbGF0ZV9pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZF9pbXBsKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBtU3VwZXJQcm92aWRlci5zZXRFbmFibGVkX2ltcGwoZW5hYmxlZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25WaXNpYmlsaXR5QWdncmVnYXRlZF9pbXBsKGJvb2xlYW4gaXNWaXNpYmxlKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm9uVmlzaWJpbGl0eUFnZ3JlZ2F0ZWRfaW1wbChpc1Zpc2libGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTGF5b3V0X2ltcGwoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm9uTGF5b3V0X2ltcGwoY2hhbmdlZCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbk1lYXN1cmVfaW1wbChpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm9uTWVhc3VyZV9pbXBsKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFN1Z2dlc3RlZE1pbmltdW1XaWR0aF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2V0U3VnZ2VzdGVkTWluaW11bVdpZHRoX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFN1Z2dlc3RlZE1pbmltdW1IZWlnaHRfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmdldFN1Z2dlc3RlZE1pbmltdW1IZWlnaHRfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lYXN1cmVkRGltZW5zaW9uX2ltcGwoaW50IG1lYXN1cmVkV2lkdGgsIGludCBtZWFzdXJlZEhlaWdodCkgewotICAgICAgICBtU3VwZXJQcm92aWRlci5zZXRNZWFzdXJlZERpbWVuc2lvbl9pbXBsKG1lYXN1cmVkV2lkdGgsIG1lYXN1cmVkSGVpZ2h0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaFRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZGlzcGF0Y2hUb3VjaEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNoZWNrTGF5b3V0UGFyYW1zX2ltcGwoVmlld0dyb3VwLkxheW91dFBhcmFtcyBwKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5jaGVja0xheW91dFBhcmFtc19pbXBsKHApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtc19pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmlld0dyb3VwLkxheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2VuZXJhdGVMYXlvdXRQYXJhbXNfaW1wbChhdHRycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgZ2VuZXJhdGVMYXlvdXRQYXJhbXNfaW1wbChWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKGxwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxheUNoaWxkUHJlc3NlZFN0YXRlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5zaG91bGREZWxheUNoaWxkUHJlc3NlZFN0YXRlX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBtZWFzdXJlQ2hpbGRXaXRoTWFyZ2luc19pbXBsKFZpZXcgY2hpbGQsCi0gICAgICAgIGludCBwYXJlbnRXaWR0aE1lYXN1cmVTcGVjLCBpbnQgd2lkdGhVc2VkLCBpbnQgcGFyZW50SGVpZ2h0TWVhc3VyZVNwZWMsIGludCBoZWlnaHRVc2VkKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm1lYXN1cmVDaGlsZFdpdGhNYXJnaW5zX2ltcGwoY2hpbGQsCi0gICAgICAgICAgICAgICAgcGFyZW50V2lkdGhNZWFzdXJlU3BlYywgd2lkdGhVc2VkLCBwYXJlbnRIZWlnaHRNZWFzdXJlU3BlYywgaGVpZ2h0VXNlZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL0FuZHJvaWQubWsgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRkZmQyYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIFwKLSAgICBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicyBcCi0gICAgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKLSAgICBqdW5pdAotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCi0KLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBNZWRpYUNvbXBvbmVudHNUZXN0Ci0KLUxPQ0FMX0lOU1RSVU1FTlRBVElPTl9GT1IgOj0gTWVkaWFDb21wb25lbnRzCi0KLUxPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCi0KLUxPQ0FMX0NFUlRJRklDQVRFIDo9IHBsYXRmb3JtCi0KLWluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI1NTI2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEudGVzdHMiPgotCi0gICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9Ik1lZGlhIEFQSSBUZXN0Ij4KLSAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLQotICAgIDwhLS0KLSAgICBUbyBydW4gdGhlIHRlc3RzIHVzZSB0aGUgY29tbWFuZDoKLSAgICAiYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgY29tLmFuZHJvaWQubWVkaWEudGVzdHMvYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCi0gICAgLS0+Ci0gICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIgotICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZSIKLSAgICAgICAgYW5kcm9pZDpsYWJlbD0iTWVkaWEgQVBJIHRlc3QiIC8+Ci0KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50VGVzdC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uUGxheWxpc3RBZ2VudFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViMDg0OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by4qOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuT25EYXRhU291cmNlTWlzc2luZ0hlbHBlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLm1vY2tpdG8uTWF0Y2hlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi0vKioKLSAqIFRlc3RzIHtAbGluayBTZXNzaW9uUGxheWxpc3RBZ2VudH0uCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXNzaW9uUGxheWxpc3RBZ2VudFRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2Vzc2lvblBsYXlsaXN0QWdlbnRUZXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FJVF9USU1FX01TID0gMTAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9SRVBFQVRfTU9ERSA9IC0xMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfU0hVRkZMRV9NT0RFID0gLTEwMDsKLQotICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKLSAgICBwcml2YXRlIEV4ZWN1dG9yIG1IYW5kbGVyRXhlY3V0b3I7Ci0KLSAgICBwcml2YXRlIE9iamVjdCBtV2FpdExvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMkltcGwgbVNlc3Npb25JbXBsOwotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXJCYXNlIG1QbGF5ZXI7Ci0gICAgcHJpdmF0ZSBQbGF5ZXJFdmVudENhbGxiYWNrIG1QbGF5ZXJFdmVudENhbGxiYWNrOwotICAgIHByaXZhdGUgU2Vzc2lvblBsYXlsaXN0QWdlbnQgbUFnZW50OwotICAgIHByaXZhdGUgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBtRGF0YVNvdXJjZUhlbHBlcjsKLSAgICBwcml2YXRlIE15UGxheWxpc3RFdmVudENhbGxiYWNrIG1FdmVudENhbGxiYWNrOwotCi0gICAgcHVibGljIGNsYXNzIE15UGxheWxpc3RFdmVudENhbGxiYWNrIGV4dGVuZHMgTWVkaWFQbGF5bGlzdEFnZW50LlBsYXlsaXN0RXZlbnRDYWxsYmFjayB7Ci0gICAgICAgIGJvb2xlYW4gb25QbGF5bGlzdENoYW5nZWRDYWxsZWQ7Ci0gICAgICAgIGJvb2xlYW4gb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZENhbGxlZDsKLSAgICAgICAgYm9vbGVhbiBvblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkOwotICAgICAgICBib29sZWFuIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkOwotCi0gICAgICAgIHByaXZhdGUgT2JqZWN0IG1XYWl0TG9jazsKLQotICAgICAgICBwdWJsaWMgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2soT2JqZWN0IHdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtV2FpdExvY2sgPSB3YWl0TG9jazsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgb25QbGF5bGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXlsaXN0Q2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LAotICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIG9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtV2FpdExvY2subm90aWZ5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWRDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVwZWF0TW9kZUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIG9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgb25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBNeURhdGFTb3VyY2VIZWxwZXIgaW1wbGVtZW50cyBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBEYXRhU291cmNlRGVzYyBvbkRhdGFTb3VyY2VNaXNzaW5nKE1lZGlhU2Vzc2lvbjIgc2Vzc2lvbiwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbS5nZXRNZWRpYUlkKCkuY29udGFpbnMoIldJVEhPVVRfRFNEIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZURlc2MuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgIC5zZXREYXRhU291cmNlKGdldENvbnRleHQoKSwgVXJpLnBhcnNlKCJkc2Q6Ly90ZXN0IikpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRNZWRpYUlkKGl0ZW0uZ2V0TWVkaWFJZCgpKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBNb2NrUGxheWVyIGV4dGVuZHMgTWVkaWFQbGF5ZXJCYXNlIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHBsYXkoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcHJlcGFyZSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwYXVzZSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0KCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlZWtUbyhsb25nIHBvcykgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWVyU3RhdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldEJ1ZmZlcmluZ1N0YXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0QXVkaW9BdHRyaWJ1dGVzKEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEF1ZGlvQXR0cmlidXRlcyBnZXRBdWRpb0F0dHJpYnV0ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXREYXRhU291cmNlKERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHREYXRhU291cmNlKERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHREYXRhU291cmNlcyhMaXN0PERhdGFTb3VyY2VEZXNjPiBkc2RzKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIERhdGFTb3VyY2VEZXNjIGdldEN1cnJlbnREYXRhU291cmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbG9vcEN1cnJlbnQoYm9vbGVhbiBsb29wKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGxheWJhY2tTcGVlZChmbG9hdCBzcGVlZCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBsYXllclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0UGxheWVyVm9sdW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKEV4ZWN1dG9yIGUsIFBsYXllckV2ZW50Q2FsbGJhY2sgY2IpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhQbGF5ZXJFdmVudENhbGxiYWNrIGNiKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtQ29udGV4dCA9IGdldENvbnRleHQoKTsKLSAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgZGV4bWFrZXIgYnVnOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2RleG1ha2VyL2lzc3Vlcy9kZXRhaWw/aWQ9MgotICAgICAgICAvLyBEZXhtYWtlciBpcyB1c2VkIGJ5IG1vY2tpdG8uCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZGV4bWFrZXIuZGV4Y2FjaGUiLCBtQ29udGV4dC5nZXRDYWNoZURpcigpLmdldFBhdGgoKSk7Ci0KLSAgICAgICAgSGFuZGxlclRocmVhZCBoYW5kbGVyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIlNlc3Npb25QbGF5bGlzdEFnZW50Iik7Ci0gICAgICAgIGhhbmRsZXJUaHJlYWQuc3RhcnQoKTsKLSAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihoYW5kbGVyVGhyZWFkLmdldExvb3BlcigpKTsKLSAgICAgICAgbUhhbmRsZXJFeGVjdXRvciA9IChydW5uYWJsZSkgLT4gewotICAgICAgICAgICAgbUhhbmRsZXIucG9zdChydW5uYWJsZSk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgbVBsYXllciA9IG1vY2soTW9ja1BsYXllci5jbGFzcyk7Ci0gICAgICAgIGRvQW5zd2VyKGludm9jYXRpb24gLT4gewotICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IGludm9jYXRpb24uZ2V0QXJndW1lbnRzKCk7Ci0gICAgICAgICAgICBtUGxheWVyRXZlbnRDYWxsYmFjayA9IChQbGF5ZXJFdmVudENhbGxiYWNrKSBhcmdzWzFdOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0pLndoZW4obVBsYXllcikucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKE1hdGNoZXJzLmFueSgpLCBNYXRjaGVycy5hbnkoKSk7Ci0KLSAgICAgICAgbVNlc3Npb25JbXBsID0gbW9jayhNZWRpYVNlc3Npb24ySW1wbC5jbGFzcyk7Ci0gICAgICAgIG1EYXRhU291cmNlSGVscGVyID0gbmV3IE15RGF0YVNvdXJjZUhlbHBlcigpOwotICAgICAgICBtQWdlbnQgPSBuZXcgU2Vzc2lvblBsYXlsaXN0QWdlbnQobVNlc3Npb25JbXBsLCBtUGxheWVyKTsKLSAgICAgICAgbUFnZW50LnNldE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIobURhdGFTb3VyY2VIZWxwZXIpOwotICAgICAgICBtRXZlbnRDYWxsYmFjayA9IG5ldyBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayhtV2FpdExvY2spOwotICAgICAgICBtQWdlbnQucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2sobUhhbmRsZXJFeGVjdXRvciwgbUV2ZW50Q2FsbGJhY2spOwotICAgIH0KLQotICAgIEBBZnRlcgotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1IYW5kbGVyLmdldExvb3BlcigpLnF1aXRTYWZlbHkoKTsKLSAgICAgICAgbUhhbmRsZXIgPSBudWxsOwotICAgICAgICBtSGFuZGxlckV4ZWN1dG9yID0gbnVsbDsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBbmRHZXRTaHVmbGxlTW9kZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgc2h1ZmZsZU1vZGUgPSBtQWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKTsKLSAgICAgICAgaWYgKHNodWZmbGVNb2RlICE9IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORSkgewotICAgICAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgbUFnZW50LnNldFNodWZmbGVNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORSk7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkUsIG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0U2h1ZmZsZU1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9BTEwpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0FMTCwgbUFnZW50LmdldFNodWZmbGVNb2RlKCkpOwotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0U2h1ZmZsZU1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9HUk9VUCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVAsIG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpKTsKLQotICAgICAgICAvLyBJTlZBTElEX1NIVUZGTEVfTU9ERSB3aWxsIG5vdCBjaGFuZ2UgdGhlIHNodWZmbGUgbW9kZS4KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRTaHVmZmxlTW9kZShJTlZBTElEX1NIVUZGTEVfTU9ERSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUV2ZW50Q2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQLCBtQWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QW5kR2V0UmVwZWF0TW9kZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgcmVwZWF0TW9kZSA9IG1BZ2VudC5nZXRSZXBlYXRNb2RlKCk7Ci0gICAgICAgIGlmIChyZXBlYXRNb2RlICE9IE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORSk7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKLQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0FMTCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0FMTCwgbUFnZW50LmdldFJlcGVhdE1vZGUoKSk7Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9HUk9VUCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKLQotICAgICAgICAvLyBJTlZBTElEX1NIVUZGTEVfTU9ERSB3aWxsIG5vdCBjaGFuZ2UgdGhlIHNodWZmbGUgbW9kZS4KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKElOVkFMSURfUkVQRUFUX01PREUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfR1JPVVAsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNldFBsYXlsaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBsaXN0U2l6ZSA9IDEwOwotICAgICAgICBjcmVhdGVBbmRTZXRQbGF5bGlzdCgxMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0U2l6ZSwgbUFnZW50LmdldFBsYXlsaXN0KCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNraXBJdGVtcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbGlzdFNpemUgPSA1OwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0gY3JlYXRlQW5kU2V0UGxheWxpc3QobGlzdFNpemUpOwotCi0gICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FKTsKLSAgICAgICAgLy8gVGVzdCBza2lwVG9QbGF5bGlzdEl0ZW0KLSAgICAgICAgZm9yIChpbnQgaSA9IGxpc3RTaXplIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIG1BZ2VudC5za2lwVG9QbGF5bGlzdEl0ZW0ocGxheWxpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRlc3Qgc2tpcFRvTmV4dEl0ZW0KLSAgICAgICAgLy8gY3VyUGxheVBvcyA9IDAKLSAgICAgICAgZm9yIChpbnQgY3VyUGxheVBvcyA9IDA7IGN1clBsYXlQb3MgPCBsaXN0U2l6ZSAtIDE7ICsrY3VyUGxheVBvcykgewotICAgICAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY3VyUGxheVBvcyArIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgICAgICB9Ci0gICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdFNpemUgLSAxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBUZXN0IHNraXBUb1ByZXZpb3VzCi0gICAgICAgIC8vIGN1clBsYXlQb3MgPSBsaXN0U2l6ZSAtIDEKLSAgICAgICAgZm9yIChpbnQgY3VyUGxheVBvcyA9IGxpc3RTaXplIC0gMTsgY3VyUGxheVBvcyA+IDA7IC0tY3VyUGxheVBvcykgewotICAgICAgICAgICAgbUFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGN1clBsYXlQb3MgLSAxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgfQotICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMKTsKLSAgICAgICAgLy8gVGVzdCBza2lwVG9QcmV2aW91cyB3aXRoIHJlcGVhdCBtb2RlIGFsbAotICAgICAgICAvLyBjdXJQbGF5UG9zID0gMAotICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0U2l6ZSAtIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFRlc3Qgc2tpcFRvTmV4dCB3aXRoIHJlcGVhdCBtb2RlIGFsbAotICAgICAgICAvLyBjdXJQbGF5UG9zID0gbGlzdFNpemUgLSAxCi0gICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgbUFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICAvLyBjdXJQbGF5UG9zID0gbGlzdFNpemUgLSAxLCBuZXh0UGxheVBvcyA9IDAKLSAgICAgICAgLy8gVGVzdCBuZXh0IHBsYXkgcG9zIGFmdGVyIHNldHRpbmcgcmVwZWF0IG1vZGUgbm9uZS4KLSAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdFNpemUgLSAxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFZGl0UGxheWxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxpc3RTaXplID0gNTsKLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCA9IGNyZWF0ZUFuZFNldFBsYXlsaXN0KGxpc3RTaXplKTsKLQotICAgICAgICAvLyBUZXN0IGFkZCBpdGVtOiBbMCAoY3VyKSwgMSwgMiwgMywgNF0gLT4gWzAgKGN1ciksIDEsIDUsIDIsIDMsIDRdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgaXRlbV81ID0gZ2VuZXJhdGVNZWRpYUl0ZW0oNSk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5hZGQoMiwgaXRlbV81KTsKLSAgICAgICAgICAgIG1BZ2VudC5hZGRQbGF5bGlzdEl0ZW0oMiwgaXRlbV81KTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIC8vIE1vdmUgY3VycmVudDogWzAgKGN1ciksIDEsIDUsIDIsIDMsIDRdIC0+IFswLCAxLCA1IChjdXIpLCAyLCAzLCA0XQotICAgICAgICBtQWdlbnQuc2tpcFRvUGxheWxpc3RJdGVtKGl0ZW1fNSk7Ci0gICAgICAgIC8vIFJlbW92ZSBjdXJyZW50IGl0ZW06IFswLCAxLCA1IChjdXIpLCAyLCAzLCA0XSAtPiBbMCwgMSwgMiAoY3VyKSwgMywgNF0KLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShpdGVtXzUpOwotICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtXzUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgcHJldmlvdXMgaXRlbTogWzAsIDEsIDIgKGN1ciksIDMsIDRdIC0+IFswLCAyIChjdXIpLCAzLCA0XQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBNZWRpYUl0ZW0yIHByZXZpb3VzSXRlbSA9IHBsYXlsaXN0LmdldCgxKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShwcmV2aW91c0l0ZW0pOwotICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShwcmV2aW91c0l0ZW0pOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgbmV4dCBpdGVtOiBbMCwgMiAoY3VyKSwgMywgNF0gLT4gWzAsIDIgKGN1ciksIDRdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgbmV4dEl0ZW0gPSBwbGF5bGlzdC5nZXQoMik7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUobmV4dEl0ZW0pOwotICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShuZXh0SXRlbSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlcGxhY2UgaXRlbTogWzAsIDIgKGN1ciksIDRdIC0+IFswLCAyIChjdXIpLCA1XQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3Quc2V0KDIsIGl0ZW1fNSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVwbGFjZVBsYXlsaXN0SXRlbSgyLCBpdGVtXzUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBNb3ZlIGxhc3QgYW5kIHJlbW92ZSB0aGUgbGFzdCBpdGVtOiBbMCwgMiAoY3VyKSwgNV0gLT4gWzAsIDIsIDUgKGN1cildIC0+IFswLCAyIChjdXIpXQotICAgICAgICBNZWRpYUl0ZW0yIGxhc3RJdGVtID0gcGxheWxpc3QuZ2V0KDEpOwotICAgICAgICBtQWdlbnQuc2tpcFRvUGxheWxpc3RJdGVtKGxhc3RJdGVtKTsKLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShsYXN0SXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGxhc3RJdGVtKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIGFsbCBpdGVtcwotICAgICAgICBmb3IgKGludCBpID0gcGxheWxpc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IHBsYXlsaXN0LmdldChpKTsKLSAgICAgICAgICAgIG1BZ2VudC5za2lwVG9QbGF5bGlzdEl0ZW0oaXRlbSk7Ci0gICAgICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuTk9fVkFMSURfSVRFTVMsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgIH0KLQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheWxpc3RXaXRoSW52YWxpZEl0ZW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxpc3RTaXplID0gMjsKLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCA9IGNyZWF0ZUFuZFNldFBsYXlsaXN0KGxpc3RTaXplKTsKLQotICAgICAgICAvLyBBZGQgaXRlbTogWzAgKGN1ciksIDFdIC0+IFswIChjdXIpLCAzIChub19kc2QpLCAxXQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBNZWRpYUl0ZW0yIGludmFsaWRJdGVtMiA9IGdlbmVyYXRlTWVkaWFJdGVtV2l0aG91dERhdGFTb3VyY2VEZXNjKDIpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QuYWRkKDEsIGludmFsaWRJdGVtMik7Ci0gICAgICAgICAgICBtQWdlbnQuYWRkUGxheWxpc3RJdGVtKDEsIGludmFsaWRJdGVtMik7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFRlc3Qgc2tpcCB0byBuZXh0IGl0ZW06ICBbMCAoY3VyKSwgMiAobm9fZHNkKSwgMV0gLT4gWzAsIDIgKG5vX2RzZCksIDEgKGN1cildCi0gICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gVGVzdCBza2lwIHRvIHByZXZpb3VzIGl0ZW06IFswLCAyIChub19kc2QpLCAxIChjdXIpXSAtPiBbMCAoY3VyKSwgMiAobm9fZHNkKSwgMV0KLSAgICAgICAgbUFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIGN1cnJlbnQgaXRlbTogWzAgKGN1ciksIDIgKG5vX2RzZCksIDFdIC0+IFsyIChub19kc2QpLCAxIChjdXIpXQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBwbGF5bGlzdC5nZXQoMCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgY3VycmVudCBpdGVtOiBbMiAobm9fZHNkKSwgMSAoY3VyKV0gLT4gWzIgKG5vX2RzZCldCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIGl0ZW0gPSBwbGF5bGlzdC5nZXQoMSk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5OT19WQUxJRF9JVEVNUywgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gQWRkIGludmFsaWQgaXRlbTogWzIgKG5vX2RzZCldIC0+IFswIChub19kc2QpLCAyIChub19kc2QpXQotICAgICAgICBNZWRpYUl0ZW0yIGludmFsaWRJdGVtMCA9IGdlbmVyYXRlTWVkaWFJdGVtV2l0aG91dERhdGFTb3VyY2VEZXNjKDApOwotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QuYWRkKDAsIGludmFsaWRJdGVtMCk7Ci0gICAgICAgICAgICBtQWdlbnQuYWRkUGxheWxpc3RJdGVtKDAsIGludmFsaWRJdGVtMCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50Lk5PX1ZBTElEX0lURU1TLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBBZGQgdmFsaWQgaXRlbTogWzAgKG5vX2RzZCksIDIgKG5vX2RzZCldIC0+IFswIChub19kc2QpLCAxLCAyIChub19kc2QpXQotICAgICAgICBNZWRpYUl0ZW0yIGludmFsaWRJdGVtMSA9IGdlbmVyYXRlTWVkaWFJdGVtKDEpOwotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QuYWRkKDEsIGludmFsaWRJdGVtMSk7Ci0gICAgICAgICAgICBtQWdlbnQuYWRkUGxheWxpc3RJdGVtKDEsIGludmFsaWRJdGVtMSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlcGxhY2UgdGhlIHZhbGlkIGl0ZW0gd2l0aCBhbiBpbnZhbGlkIGl0ZW06Ci0gICAgICAgIC8vIFswIChub19kc2QpLCAxIChjdXIpLCAyIChub19kc2QpXSAtPiBbMCAobm9fZHNkKSwgMyAobm9fZHNkKSwgMiAobm9fZHNkKV0KLSAgICAgICAgTWVkaWFJdGVtMiBpbnZhbGlkSXRlbTMgPSBnZW5lcmF0ZU1lZGlhSXRlbVdpdGhvdXREYXRhU291cmNlRGVzYygzKTsKLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnNldCgxLCBpbnZhbGlkSXRlbTMpOwotICAgICAgICAgICAgbUFnZW50LnJlcGxhY2VQbGF5bGlzdEl0ZW0oMSwgaW52YWxpZEl0ZW0zKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuRU5EX09GX1BMQVlMSVNULCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5bGlzdEFmdGVyT25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxpc3RTaXplID0gMjsKLSAgICAgICAgdmVyaWZ5KG1QbGF5ZXIpLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhNYXRjaGVycy5hbnkoKSwgTWF0Y2hlcnMuYW55KCkpOwotCi0gICAgICAgIGNyZWF0ZUFuZFNldFBsYXlsaXN0KGxpc3RTaXplKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrLm9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKG1QbGF5ZXIsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrLm9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKG1QbGF5ZXIsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuRU5EX09GX1BMQVlMSVNULCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICBtQWdlbnQuc2tpcFRvTmV4dEl0ZW0oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50LkVORF9PRl9QTEFZTElTVCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX09ORSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5FTkRfT0ZfUExBWUxJU1QsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9BTEwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrLm9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKG1QbGF5ZXIsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrLm9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKG1QbGF5ZXIsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PE1lZGlhSXRlbTI+IGNyZWF0ZUFuZFNldFBsYXlsaXN0KGludCBsaXN0U2l6ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0U2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICBpdGVtcy5hZGQoZ2VuZXJhdGVNZWRpYUl0ZW0oaSkpOwotICAgICAgICB9Ci0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0UGxheWxpc3QoaXRlbXMsIG51bGwpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpdGVtczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UGxheWxpc3RFcXVhbHMoTGlzdDxNZWRpYUl0ZW0yPiBleHBlY3RlZCwgTGlzdDxNZWRpYUl0ZW0yPiBhY3R1YWwpIHsKLSAgICAgICAgaWYgKGV4cGVjdGVkID09IGFjdHVhbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoZXhwZWN0ZWQgIT0gbnVsbCAmJiBhY3R1YWwgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5zaXplKCksIGFjdHVhbC5zaXplKCkpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4cGVjdGVkLmdldChpKS5lcXVhbHMoYWN0dWFsLmdldChpKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUl0ZW0yIGdlbmVyYXRlTWVkaWFJdGVtV2l0aG91dERhdGFTb3VyY2VEZXNjKGludCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0yLkJ1aWxkZXIoMCkKLSAgICAgICAgICAgICAgICAuc2V0TWVkaWFJZCgiVEVTVF9NRURJQV9JRF9XSVRIT1VUX0RTRF8iICsga2V5KQotICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFJdGVtMiBnZW5lcmF0ZU1lZGlhSXRlbShpbnQga2V5KSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMi5CdWlsZGVyKDApCi0gICAgICAgICAgICAgICAgLnNldE1lZGlhSWQoIlRFU1RfTUVESUFfSURfIiArIGtleSkKLSAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9PV05FUlMgYi9wYWNrYWdlcy9PV05FUlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYzRjZWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvT1dORVJTCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1ha2Vyc3RlbkBnb29nbGUuY29tCi1kd2thbmdAZ29vZ2xlLmNvbQotamFld2FuQGdvb2dsZS5jb20KLW1hcmNvbmVAZ29vZ2xlLmNvbQotc3VuZ3Nvb0Bnb29nbGUuY29tCi13amlhQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL09XTkVSUyBiL3NlcnZpY2VzL09XTkVSUwppbmRleCBkNWQwMGRhLi42NmE0YmNiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9PV05FUlMKKysrIGIvc2VydmljZXMvT1dORVJTCkBAIC0xLDQgKzEsNyBAQAorY2h6QGdvb2dsZS5jb20KIGVsYXVyZW50QGdvb2dsZS5jb20KK2Vzc2lja0Bnb29nbGUuY29tCiBldGFsdmFsYUBnb29nbGUuY29tCiBna2FzdGVuQGdvb2dsZS5jb20KIGh1bmdhQGdvb2dsZS5jb20KK21hcmNvbmVAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tawppbmRleCA3NDE5ZTY0Li40MDk4MGE2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tawpAQCAtMiwyNCArMiw2IEBACiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotICAgIFNlcnZpY2VVdGlsaXRpZXMuY3BwCi0KLSMgRklYTUUgTW92ZSB0aGlzIGxpYnJhcnkgdG8gZnJhbWV3b3Jrcy9uYXRpdmUKLUxPQ0FMX01PRFVMRSA6PSBsaWJzZXJ2aWNldXRpbGl0eQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJsb2cgXAotICAgIGxpYmJpbmRlcgotCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCiBMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKICAgICBBdWRpb0ZsaW5nZXIuY3BwICAgICAgICAgICAgXAogICAgIFRocmVhZHMuY3BwICAgICAgICAgICAgICAgICBcCkBAIC0zMSw3ICsxMyw4IEBACiAgICAgUGF0Y2hQYW5lbC5jcHAgICAgICAgICAgICAgIFwKICAgICBTdGF0ZVF1ZXVlLmNwcCAgICAgICAgICAgICAgXAogICAgIEJ1ZkxvZy5jcHAgICAgICAgICAgICAgICAgICBcCi0gICAgVHlwZWRMb2dnZXIuY3BwCisgICAgVHlwZWRMb2dnZXIuY3BwICAgICAgICAgICAgIFwKKyAgICBOQkFJT19UZWUuY3BwICAgICAgICAgICAgICAgXAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IFwKQEAgLTQ5LDE3ICszMiwxOSBAQAogICAgIGxpYmJpbmRlciBcCiAgICAgbGliYXVkaW9jbGllbnQgXAogICAgIGxpYm1lZGlhbG9nc2VydmljZSBcCisgICAgbGlibWVkaWFtZXRyaWNzIFwKICAgICBsaWJtZWRpYXV0aWxzIFwKICAgICBsaWJuYmFpbyBcCiAgICAgbGlibmJsb2cgXAogICAgIGxpYnBvd2VybWFuYWdlciBcCi0gICAgbGlic2VydmljZXV0aWxpdHkgXAogICAgIGxpYm1lZGlhdXRpbHMgXAogICAgIGxpYm1lbXVucmVhY2hhYmxlIFwKLSAgICBsaWJtZWRpYV9oZWxwZXIKKyAgICBsaWJtZWRpYV9oZWxwZXIgXAorICAgIGxpYnZpYnJhdG9yCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgIGxpYmNwdXN0YXRzIFwKKyAgICBsaWJzbmRmaWxlIFwKIAogTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKIApAQCAtODIsNiArNjcsNyBAQAogTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KIAogTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKK0xPQ0FMX1NBTklUSVpFIDo9IGludGVnZXJfb3ZlcmZsb3cKIAogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDY4N2I1YTYuLmI4Zjg4Y2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCkBAIC0yMywxMiArMjMsMTMgQEAKICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL29zL0lFeHRlcm5hbFZpYnJhdG9yU2VydmljZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CkBAIC00Nyw3ICs0OCw3IEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiTkJBSU9fVGVlLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogCkBAIC01Niw3ICs1Nyw2IEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X2FlYy5oPgogCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3N0cmluZy5oPgogCiAjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL1Bvd2VyTWFuYWdlci5oPgogCkBAIC02NCw4ICs2NCw4IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGUuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlUmVhZGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL0JhdHRlcnlOb3RpZmllci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogCiAvLyNkZWZpbmUgQlVGTE9HX05ERUJVRyAwCkBAIC0xMDAsMTcgKzEwMCw2IEBACiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6bVNjcmVlblN0YXRlOwogCi0KLSNpZmRlZiBURUVfU0lOSwotYm9vbCBBdWRpb0ZsaW5nZXI6Om1UZWVTaW5rSW5wdXRFbmFibGVkID0gZmFsc2U7Ci1ib29sIEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtPdXRwdXRFbmFibGVkID0gZmFsc2U7Ci1ib29sIEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtUcmFja0VuYWJsZWQgPSBmYWxzZTsKLQotc2l6ZV90IEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtJbnB1dEZyYW1lcyA9IGtUZWVTaW5rSW5wdXRGcmFtZXNEZWZhdWx0Owotc2l6ZV90IEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtPdXRwdXRGcmFtZXMgPSBrVGVlU2lua091dHB1dEZyYW1lc0RlZmF1bHQ7Ci1zaXplX3QgQXVkaW9GbGluZ2VyOjptVGVlU2lua1RyYWNrRnJhbWVzID0ga1RlZVNpbmtUcmFja0ZyYW1lc0RlZmF1bHQ7Ci0jZW5kaWYKLQogLy8gSW4gb3JkZXIgdG8gYXZvaWQgaW52YWxpZGF0aW5nIG9mZmxvYWRlZCB0cmFja3MgZWFjaCB0aW1lIGEgVmlzdWFsaXplciBpcyB0dXJuZWQgb24gYW5kIG9mZgogLy8gd2UgZGVmaW5lIGEgbWluaW11bSB0aW1lIGR1cmluZyB3aGljaCBhIGdsb2JhbCBlZmZlY3QgaXMgY29uc2lkZXJlZCBlbmFibGVkLgogc3RhdGljIGNvbnN0IG5zZWNzX3Qga01pbkdsb2JhbEVmZmVjdEVuYWJsZXRpbWVOcyA9IHNlY29uZHMoNzIwMCk7CkBAIC0xMzQsNiArMTIzLDIxIEBACiAgICAgfQogfQogCisvLyBLZWVwIGEgc3Ryb25nIHJlZmVyZW5jZSB0byBleHRlcm5hbCB2aWJyYXRvciBzZXJ2aWNlCitzdGF0aWMgc3A8b3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZT4gc0V4dGVybmFsVmlicmF0b3JTZXJ2aWNlOworCitzdGF0aWMgc3A8b3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZT4gZ2V0RXh0ZXJuYWxWaWJyYXRvclNlcnZpY2UoKSB7CisgICAgaWYgKHNFeHRlcm5hbFZpYnJhdG9yU2VydmljZSA9PSAwKSB7CisgICAgICAgIHNwIDxJQmluZGVyPiBiaW5kZXIgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZSgKKyAgICAgICAgICAgIFN0cmluZzE2KCJleHRlcm5hbF92aWJyYXRvcl9zZXJ2aWNlIikpOworICAgICAgICBpZiAoYmluZGVyICE9IDApIHsKKyAgICAgICAgICAgIHNFeHRlcm5hbFZpYnJhdG9yU2VydmljZSA9CisgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8b3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZT4oYmluZGVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc0V4dGVybmFsVmlicmF0b3JTZXJ2aWNlOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0ZDo6c3RyaW5nIGZvcm1hdFRvU3RyaW5nKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewpAQCAtMTYwLDYgKzE2NCw3IEBACiAgICAgICBtVG90YWxNZW1vcnkoMCksCiAgICAgICBtQ2xpZW50U2hhcmVkSGVhcFNpemUoa01pbmltdW1DbGllbnRTaGFyZWRIZWFwU2l6ZUJ5dGVzKSwKICAgICAgIG1HbG9iYWxFZmZlY3RFbmFibGVUaW1lKDApLAorICAgICAgbVBhdGNoUGFuZWwodGhpcyksCiAgICAgICBtU3lzdGVtUmVhZHkoZmFsc2UpCiB7CiAgICAgLy8gdW5zaWduZWQgaW5zdGVhZCBvZiBhdWRpb191bmlxdWVfaWRfdXNlX3QsIGJlY2F1c2UgKysgb3BlcmF0b3IgaXMgdW5hdmFpbGFibGUgZm9yIGVudW0KQEAgLTE2OCw3ICsxNzMsNiBAQAogICAgICAgICBtTmV4dFVuaXF1ZUlkc1t1c2VdID0gQVVESU9fVU5JUVVFX0lEX1VTRV9NQVg7CiAgICAgfQogCi0gICAgZ2V0cGlkX2NhY2hlZCA9IGdldHBpZCgpOwogICAgIGNvbnN0IGJvb2wgZG9Mb2cgPSBwcm9wZXJ0eV9nZXRfYm9vbCgicm8udGVzdF9oYXJuZXNzIiwgZmFsc2UpOwogICAgIGlmIChkb0xvZykgewogICAgICAgICBtTG9nTWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihrTG9nTWVtb3J5U2l6ZSwgIkxvZ1dyaXRlcnMiLApAQCAtMTg1LDI3ICsxODksNiBAQAogICAgIG1FZmZlY3RzRmFjdG9yeUhhbCA9IEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjpjcmVhdGUoKTsKIAogICAgIG1NZWRpYUxvZ05vdGlmaWVyLT5ydW4oIk1lZGlhTG9nTm90aWZpZXIiKTsKLQotI2lmZGVmIFRFRV9TSU5LCi0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICh2b2lkKSBwcm9wZXJ0eV9nZXQoInJvLmRlYnVnZ2FibGUiLCB2YWx1ZSwgIjAiKTsKLSAgICBpbnQgZGVidWdnYWJsZSA9IGF0b2kodmFsdWUpOwotICAgIGludCB0ZWVFbmFibGVkID0gMDsKLSAgICBpZiAoZGVidWdnYWJsZSkgewotICAgICAgICAodm9pZCkgcHJvcGVydHlfZ2V0KCJhZi50ZWUiLCB2YWx1ZSwgIjAiKTsKLSAgICAgICAgdGVlRW5hYmxlZCA9IGF0b2kodmFsdWUpOwotICAgIH0KLSAgICAvLyBGSVhNRSBzeW1ib2xpYyBjb25zdGFudHMgaGVyZQotICAgIGlmICh0ZWVFbmFibGVkICYgMSkgewotICAgICAgICBtVGVlU2lua0lucHV0RW5hYmxlZCA9IHRydWU7Ci0gICAgfQotICAgIGlmICh0ZWVFbmFibGVkICYgMikgewotICAgICAgICBtVGVlU2lua091dHB1dEVuYWJsZWQgPSB0cnVlOwotICAgIH0KLSAgICBpZiAodGVlRW5hYmxlZCAmIDQpIHsKLSAgICAgICAgbVRlZVNpbmtUcmFja0VuYWJsZWQgPSB0cnVlOwotICAgIH0KLSNlbmRpZgogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6b25GaXJzdFJlZigpCkBAIC0yMjYsOCArMjA5LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIG1QYXRjaFBhbmVsID0gbmV3IFBhdGNoUGFuZWwodGhpcyk7Ci0KICAgICBtTW9kZSA9IEFVRElPX01PREVfTk9STUFMOwogCiAgICAgZ0F1ZGlvRmxpbmdlciA9IHRoaXM7CkBAIC0yNDMsNiArMjI0LDE0IEBACiAgICAgICAgIC8vIGNsb3NlT3V0cHV0X25vbnZpcnR1YWwoKSB3aWxsIHJlbW92ZSBzcGVjaWZpZWQgZW50cnkgZnJvbSBtUGxheWJhY2tUaHJlYWRzCiAgICAgICAgIGNsb3NlT3V0cHV0X25vbnZpcnR1YWwobVBsYXliYWNrVGhyZWFkcy5rZXlBdCgwKSk7CiAgICAgfQorICAgIHdoaWxlICghbU1tYXBUaHJlYWRzLmlzRW1wdHkoKSkgeworICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbyA9IG1NbWFwVGhyZWFkcy5rZXlBdCgwKTsKKyAgICAgICAgaWYgKG1NbWFwVGhyZWFkcy52YWx1ZUF0KDApLT5pc091dHB1dCgpKSB7CisgICAgICAgICAgICBjbG9zZU91dHB1dF9ub252aXJ0dWFsKGlvKTsgLy8gcmVtb3ZlcyBlbnRyeSBmcm9tIG1NbWFwVGhyZWFkcworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xvc2VJbnB1dF9ub252aXJ0dWFsKGlvKTsgIC8vIHJlbW92ZXMgZW50cnkgZnJvbSBtTW1hcFRocmVhZHMKKyAgICAgICAgfQorICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvSHdEZXZzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIC8vIG5vIG1IYXJkd2FyZUxvY2sgbmVlZGVkLCBhcyB0aGVyZSBhcmUgbm8gb3RoZXIgcmVmZXJlbmNlcyB0byB0aGlzCkBAIC0zMTEsMTMgKzMwMCwxNiBAQAogICAgICAgICBmdWxsQ29uZmlnLnNhbXBsZV9yYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKICAgICAgICAgZnVsbENvbmZpZy5jaGFubmVsX21hc2sgPSBjb25maWctPmNoYW5uZWxfbWFzazsKICAgICAgICAgZnVsbENvbmZpZy5mb3JtYXQgPSBjb25maWctPmZvcm1hdDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNlY29uZGFyeU91dHB1dHM7CiAgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKGF0dHIsICZpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtVHlwZSwgY2xpZW50LmNsaWVudFBpZCwgY2xpZW50LmNsaWVudFVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ1bGxDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQsICZwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCwgJnBvcnRJZCwgJnNlY29uZGFyeU91dHB1dHMpOworICAgICAgICBBTE9HV19JRighc2Vjb25kYXJ5T3V0cHV0cy5lbXB0eSgpLAorICAgICAgICAgICAgICAgICAiJXMgZG9lcyBub3Qgc3VwcG9ydCBzZWNvbmRhcnkgb3V0cHV0cywgaWdub3JpbmcgdGhlbSIsIF9fZnVuY19fKTsKICAgICB9IGVsc2UgewogICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGb3JBdHRyKGF0dHIsICZpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxTZXNzaW9uSWQsCkBAIC0zNDEsNyArMzMzLDcgQEAKICAgICAgICAgKnNlc3Npb25JZCA9IGFjdHVhbFNlc3Npb25JZDsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoZGlyZWN0aW9uID09IE1tYXBTdHJlYW1JbnRlcmZhY2U6OkRJUkVDVElPTl9PVVRQVVQpIHsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KGlvLCBzdHJlYW1UeXBlLCBhY3R1YWxTZXNzaW9uSWQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQocG9ydElkKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQocG9ydElkKTsKICAgICAgICAgfQpAQCAtMzUzLDYgKzM0NSwyNyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKKy8qIHN0YXRpYyAqLworaW50IEF1ZGlvRmxpbmdlcjo6b25FeHRlcm5hbFZpYnJhdGlvblN0YXJ0KGNvbnN0IHNwPG9zOjpFeHRlcm5hbFZpYnJhdGlvbj4mIGV4dGVybmFsVmlicmF0aW9uKSB7CisgICAgc3A8b3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZT4gZXZzID0gZ2V0RXh0ZXJuYWxWaWJyYXRvclNlcnZpY2UoKTsKKyAgICBpZiAoZXZzICE9IDApIHsKKyAgICAgICAgaW50MzJfdCByZXQ7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IGV2cy0+b25FeHRlcm5hbFZpYnJhdGlvblN0YXJ0KCpleHRlcm5hbFZpYnJhdGlvbiwgJnJldCk7CisgICAgICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBBdWRpb01peGVyOjpIQVBUSUNfU0NBTEVfTVVURTsKK30KKworLyogc3RhdGljICovCit2b2lkIEF1ZGlvRmxpbmdlcjo6b25FeHRlcm5hbFZpYnJhdGlvblN0b3AoY29uc3Qgc3A8b3M6OkV4dGVybmFsVmlicmF0aW9uPiYgZXh0ZXJuYWxWaWJyYXRpb24pIHsKKyAgICBzcDxvczo6SUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlPiBldnMgPSBnZXRFeHRlcm5hbFZpYnJhdG9yU2VydmljZSgpOworICAgIGlmIChldnMgIT0gMCkgeworICAgICAgICBldnMtPm9uRXh0ZXJuYWxWaWJyYXRpb25TdG9wKCpleHRlcm5hbFZpYnJhdGlvbik7CisgICAgfQorfQorCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF1ZGlvX2ludGVyZmFjZXNbXSA9IHsKICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSwKICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCwKQEAgLTQ3OCw3ICs0OTEsNyBAQAogICAgICAgICAgICAgbUhhcmR3YXJlTG9jay51bmxvY2soKTsKICAgICAgICAgfQogCi0gICAgICAgIGJvb2wgbG9ja2VkID0gZHVtcFRyeUxvY2sobUxvY2spOworICAgICAgICBjb25zdCBib29sIGxvY2tlZCA9IGR1bXBUcnlMb2NrKG1Mb2NrKTsKIAogICAgICAgICAvLyBmYWlsZWQgdG8gbG9jayAtIEF1ZGlvRmxpbmdlciBpcyBwcm9iYWJseSBkZWFkbG9ja2VkCiAgICAgICAgIGlmICghbG9ja2VkKSB7CkBAIC01MzQsMTIgKzU0NywyMiBAQAogICAgICAgICAgICAgZGV2LT5kdW1wKGZkKTsKICAgICAgICAgfQogCi0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgLy8gZHVtcCB0aGUgc2VyaWFsbHkgc2hhcmVkIHJlY29yZCB0ZWUgc2luawotICAgICAgICBpZiAobVJlY29yZFRlZVNvdXJjZSAhPSAwKSB7Ci0gICAgICAgICAgICBkdW1wVGVlKGZkLCBtUmVjb3JkVGVlU291cmNlLCBBVURJT19JT19IQU5ETEVfTk9ORSwgJ0MnKTsKLSAgICAgICAgfQotI2VuZGlmCisgICAgICAgIG1QYXRjaFBhbmVsLmR1bXAoZmQpOworCisgICAgICAgIC8vIGR1bXAgZXh0ZXJuYWwgc2V0UGFyYW1ldGVycworICAgICAgICBhdXRvIGR1bXBMb2dnZXIgPSBbZmRdKFNpbXBsZUxvZyYgbG9nZ2VyLCBjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiXG4lcyBzZXRQYXJhbWV0ZXJzOlxuIiwgbmFtZSk7CisgICAgICAgICAgICBsb2dnZXIuZHVtcChmZCwgIiAgICAiIC8qIHByZWZpeCAqLyk7CisgICAgICAgIH07CisgICAgICAgIGR1bXBMb2dnZXIobVJlamVjdGVkU2V0UGFyYW1ldGVyTG9nLCAiUmVqZWN0ZWQiKTsKKyAgICAgICAgZHVtcExvZ2dlcihtQXBwU2V0UGFyYW1ldGVyTG9nLCAiQXBwIik7CisgICAgICAgIGR1bXBMb2dnZXIobVN5c3RlbVNldFBhcmFtZXRlckxvZywgIlN5c3RlbSIpOworCisgICAgICAgIC8vIGR1bXAgaGlzdG9yaWNhbCB0aHJlYWRzIGluIHRoZSBsYXN0IDEwIHNlY29uZHMKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgdGhyZWFkTG9nID0gbVRocmVhZExvZy5kdW1wVG9TdHJpbmcoCisgICAgICAgICAgICAgICAgIkhpc3RvcmljYWwgVGhyZWFkIExvZyAiLCAwIC8qIGxpbmVzICovLAorICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzX2dldF9yZWFsX3RpbWVfbnMoKSAtIDEwICogNjAgKiBOQU5PU19QRVJfU0VDT05EKTsKKyAgICAgICAgd3JpdGUoZmQsIHRocmVhZExvZy5jX3N0cigpLCB0aHJlYWRMb2cuc2l6ZSgpKTsKIAogICAgICAgICBCVUZMT0dfUkVTRVQ7CiAKQEAgLTU0Nyw2ICs1NzAsMTAgQEAKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICB9CiAKKyNpZmRlZiBURUVfU0lOSworICAgICAgICAvLyBOQkFJT19UZWUgZHVtcCBpcyBzYWZlIHRvIGNhbGwgb3V0c2lkZSBvZiBBRiBsb2NrLgorICAgICAgICBOQkFJT19UZWU6OmR1bXBBbGwoZmQsICJfRFVNUCIpOworI2VuZGlmCiAgICAgICAgIC8vIGFwcGVuZCBhIGNvcHkgb2YgbWVkaWEubG9nIGhlcmUgYnkgZm9yd2FyZGluZyBmZCB0byBpdCwgYnV0IGRvbid0IGF0dGVtcHQKICAgICAgICAgLy8gdG8gbG9va3VwIHRoZSBzZXJ2aWNlIGlmIGl0J3Mgbm90IHJ1bm5pbmcsIGFzIGl0IHdpbGwgYmxvY2sgZm9yIGEgc2Vjb25kCiAgICAgICAgIGlmIChzTWVkaWFMb2dTZXJ2aWNlQXNCaW5kZXIgIT0gMCkgewpAQCAtNjYyLDExICs2ODksMTIgQEAKICAgICBzdGF0dXNfdCBsU3RhdHVzOwogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZTsKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNlY29uZGFyeU91dHB1dHM7CiAKICAgICBib29sIHVwZGF0ZVBpZCA9IChpbnB1dC5jbGllbnRJbmZvLmNsaWVudFBpZCA9PSAtMSk7CiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKICAgICB1aWRfdCBjbGllbnRVaWQgPSBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFVpZDsKLSAgICBpZiAoIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkpIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CiAgICAgICAgIEFMT0dXX0lGKGNsaWVudFVpZCAhPSBjYWxsaW5nVWlkLAogICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbGxpbmdVaWQsIGNsaWVudFVpZCk7CkBAIC02OTYsNyArNzI0LDcgQEAKIAogICAgIGxTdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigmaW5wdXQuYXR0ciwgJm91dHB1dC5vdXRwdXRJZCwgc2Vzc2lvbklkLCAmc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsICZpbnB1dC5jb25maWcsIGlucHV0LmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQsICZzZWNvbmRhcnlPdXRwdXRzKTsKIAogICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SIHx8IG91dHB1dC5vdXRwdXRJZCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2soKSBnZXRPdXRwdXRGb3JBdHRyKCkgcmV0dXJuIGVycm9yICVkIG9yIGludmFsaWQgb3V0cHV0IGhhbmRsZSIsIGxTdGF0dXMpOwpAQCAtNzY3LDYgKzc5NSw2MiBAQAogICAgICAgICBvdXRwdXQuYWZGcmFtZUNvdW50ID0gdGhyZWFkLT5mcmFtZUNvdW50KCk7CiAgICAgICAgIG91dHB1dC5hZlNhbXBsZVJhdGUgPSB0aHJlYWQtPnNhbXBsZVJhdGUoKTsKICAgICAgICAgb3V0cHV0LmFmTGF0ZW5jeU1zID0gdGhyZWFkLT5sYXRlbmN5KCk7CisgICAgICAgIG91dHB1dC5wb3J0SWQgPSBwb3J0SWQ7CisKKyAgICAgICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIC8vIENvbm5lY3Qgc2Vjb25kYXJ5IG91dHB1dHMuIEZhaWx1cmUgb24gYSBzZWNvbmRhcnkgb3V0cHV0IG11c3Qgbm90IGltcGVkIHRoZSBwcmltYXJ5CisgICAgICAgICAgICAvLyBBbnkgc2Vjb25kYXJ5IG91dHB1dCBzZXR1cCBmYWlsdXJlIHdpbGwgbGVhZCB0byBhIGRlc3luYyBiZXR3ZWVuIHRoZSBBUCBhbmQgQUYgdW50aWwKKyAgICAgICAgICAgIC8vIHRoZSB0cmFjayBpcyBkZXN0cm95ZWQuCisgICAgICAgICAgICBUZWVQYXRjaGVzIHRlZVBhdGNoZXM7CisgICAgICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IHNlY29uZGFyeU91dHB1dCA6IHNlY29uZGFyeU91dHB1dHMpIHsKKyAgICAgICAgICAgICAgICBQbGF5YmFja1RocmVhZCAqc2Vjb25kYXJ5VGhyZWFkID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKHNlY29uZGFyeU91dHB1dCk7CisgICAgICAgICAgICAgICAgaWYgKHNlY29uZGFyeVRocmVhZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJubyBwbGF5YmFjayB0aHJlYWQgZm91bmQgZm9yIHNlY29uZGFyeSBvdXRwdXQgJWQiLCBvdXRwdXQub3V0cHV0SWQpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IHN0ZDo6bGNtKHRocmVhZC0+ZnJhbWVDb3VudCgpLCBzZWNvbmRhcnlUaHJlYWQtPmZyYW1lQ291bnQoKSk7CisKKyAgICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisgICAgICAgICAgICAgICAgYXV0byBpbkNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9tYXNrX291dF90b19pbihpbnB1dC5jb25maWcuY2hhbm5lbF9tYXNrKTsKKyAgICAgICAgICAgICAgICBzcCBwYXRjaFJlY29yZCA9IG5ldyBSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkKG51bGxwdHIgLyogdGhyZWFkICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uZmlnLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIGJ1ZmZlciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwbnMgLyogdGltZW91dCAqLyk7CisgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGF0Y2hSZWNvcmQtPmluaXRDaGVjaygpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlNlY29uZGFyeSBvdXRwdXQgcGF0Y2hSZWNvcmQgaW5pdCBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNwIHBhdGNoVHJhY2sgPSBuZXcgUGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2soc2Vjb25kYXJ5VGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5zYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uZmlnLmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbmZpZy5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hSZWNvcmQtPmJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hSZWNvcmQtPmJ1ZmZlclNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBucyAvKiB0aW1lb3V0ICovKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBwYXRjaFRyYWNrLT5pbml0Q2hlY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJTZWNvbmRhcnkgb3V0cHV0IHBhdGNoVHJhY2sgaW5pdCBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRlZVBhdGNoZXMucHVzaF9iYWNrKHtwYXRjaFJlY29yZCwgcGF0Y2hUcmFja30pOworICAgICAgICAgICAgICAgIHNlY29uZGFyeVRocmVhZC0+YWRkUGF0Y2hUcmFjayhwYXRjaFRyYWNrKTsKKyAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBkb3duc3RyZWFtIHBhdGNoVHJhY2sgb24gdGhlIHNlY29uZGFyeVRocmVhZCB0ZW1wb3JhcmlseSBvdXRsaXZlcworICAgICAgICAgICAgICAgIC8vIG91ciBjcmVhdGVkIHRyYWNrLCBlbnN1cmUgdGhlIGNvcnJlc3BvbmRpbmcgcGF0Y2hSZWNvcmQgaXMgc3RpbGwgYWxpdmUuCisgICAgICAgICAgICAgICAgcGF0Y2hUcmFjay0+c2V0UGVlclByb3h5KHBhdGNoUmVjb3JkLCB0cnVlIC8qIGhvbGRSZWZlcmVuY2UgKi8pOworICAgICAgICAgICAgICAgIHBhdGNoUmVjb3JkLT5zZXRQZWVyUHJveHkocGF0Y2hUcmFjaywgZmFsc2UgLyogaG9sZFJlZmVyZW5jZSAqLyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFjay0+c2V0VGVlUGF0Y2hlcyhzdGQ6Om1vdmUodGVlUGF0Y2hlcykpOworICAgICAgICB9CiAKICAgICAgICAgLy8gbW92ZSBlZmZlY3QgY2hhaW4gdG8gdGhpcyBvdXRwdXQgdGhyZWFkIGlmIGFuIGVmZmVjdCBvbiBzYW1lIHNlc3Npb24gd2FzIHdhaXRpbmcKICAgICAgICAgLy8gZm9yIGEgdHJhY2sgdG8gYmUgY3JlYXRlZApAQCAtODEzLDcgKzg5Nyw3IEBACiAKIEV4aXQ6CiAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IgJiYgb3V0cHV0Lm91dHB1dElkICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG91dHB1dC5vdXRwdXRJZCwgc3RyZWFtVHlwZSwgc2Vzc2lvbklkKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQocG9ydElkKTsKICAgICB9CiAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CiAgICAgcmV0dXJuIHRyYWNrSGFuZGxlOwpAQCAtOTE3LDYgKzEwMDEsNDAgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKQoreworICAgIHN0YXR1c190IHJldCA9IGluaXRDaGVjaygpOworICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBjaGVjayBjYWxsaW5nIHBlcm1pc3Npb25zCisgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgLy8gY2hlY2sgcmFuZ2UKKyAgICBpZiAoaXNuYW4oYmFsYW5jZSkgfHwgZmFicyhiYWxhbmNlKSA+IDEuZikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAvLyBzaG9ydCBjdXQuCisgICAgaWYgKG1NYXN0ZXJCYWxhbmNlID09IGJhbGFuY2UpIHJldHVybiBOT19FUlJPUjsKKworICAgIG1NYXN0ZXJCYWxhbmNlID0gYmFsYW5jZTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5pc0R1cGxpY2F0aW5nKCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+c2V0TWFzdGVyQmFsYW5jZShiYWxhbmNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkKIHsKICAgICBzdGF0dXNfdCByZXQgPSBpbml0Q2hlY2soKTsKQEAgLTEwNTYsNiArMTE3NCwxMyBAQAogICAgIHJldHVybiBtYXN0ZXJWb2x1bWVfbCgpOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmdldE1hc3RlckJhbGFuY2UoZmxvYXQgKmJhbGFuY2UpIGNvbnN0Cit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAqYmFsYW5jZSA9IGdldE1hc3RlckJhbGFuY2VfbCgpOworICAgIHJldHVybiBOT19FUlJPUjsgLy8gaWYgY2FsbGVkIHRocm91Z2ggYmluZGVyLCBtYXkgcmV0dXJuIGEgdHJhbnNhY3Rpb25hbCBlcnJvcgorfQorCiBib29sIEF1ZGlvRmxpbmdlcjo6bWFzdGVyTXV0ZSgpIGNvbnN0CiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTEwNjcsNiArMTE5MiwxMSBAQAogICAgIHJldHVybiBtTWFzdGVyVm9sdW1lOwogfQogCitmbG9hdCBBdWRpb0ZsaW5nZXI6OmdldE1hc3RlckJhbGFuY2VfbCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1NYXN0ZXJCYWxhbmNlOworfQorCiBib29sIEF1ZGlvRmxpbmdlcjo6bWFzdGVyTXV0ZV9sKCkgY29uc3QKIHsKICAgICByZXR1cm4gbU1hc3Rlck11dGU7CkBAIC0xMDc4LDkgKzEyMDgsOSBAQAogICAgICAgICBBTE9HVygiY2hlY2tTdHJlYW1UeXBlKCkgaW52YWxpZCBzdHJlYW0gJWQiLCBzdHJlYW0pOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBwaWRfdCBjYWxsZXIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQgJiYgY2FsbGVyICE9IGdldHBpZF9jYWNoZWQpIHsKLSAgICAgICAgQUxPR1coImNoZWNrU3RyZWFtVHlwZSgpIHBpZCAlZCBjYW5ub3QgdXNlIGludGVybmFsIHN0cmVhbSB0eXBlICVkIiwgY2FsbGVyLCBzdHJlYW0pOworICAgIGNvbnN0IHVpZF90IGNhbGxlclVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCAmJiAhaXNBdWRpb1NlcnZlclVpZChjYWxsZXJVaWQpKSB7CisgICAgICAgIEFMT0dXKCJjaGVja1N0cmVhbVR5cGUoKSB1aWQgJWQgY2Fubm90IHVzZSBpbnRlcm5hbCBzdHJlYW0gdHlwZSAlZCIsIGNhbGxlclVpZCwgc3RyZWFtKTsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIApAQCAtMTE4MCw2ICsxMzEwLDIzIEBACiAgICAgfQogfQogCisvLyBmb3J3YXJkQXVkaW9Id1N5bmNUb0Rvd25zdHJlYW1QYXRjaGVzX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAordm9pZCBBdWRpb0ZsaW5nZXI6OmZvcndhcmRQYXJhbWV0ZXJzVG9Eb3duc3RyZWFtUGF0Y2hlc19sKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCB1cFN0cmVhbSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycywKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYpPiB1c2VUaHJlYWQpCit7CisgICAgc3RkOjp2ZWN0b3I8UGF0Y2hQYW5lbDo6U29mdHdhcmVQYXRjaD4gc3dQYXRjaGVzOworICAgIGlmIChtUGF0Y2hQYW5lbC5nZXREb3duc3RyZWFtU29mdHdhcmVQYXRjaGVzKHVwU3RyZWFtLCAmc3dQYXRjaGVzKSAhPSBPSykgcmV0dXJuOworICAgIEFMT0dWX0lGKCFzd1BhdGNoZXMuZW1wdHkoKSwgIiVzIGZvdW5kICV6dSBkb3duc3RyZWFtIHBhdGNoZXMgZm9yIHN0cmVhbSBJRCAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgc3dQYXRjaGVzLnNpemUoKSwgdXBTdHJlYW0pOworICAgIGZvciAoY29uc3QgYXV0byYgc3dQYXRjaCA6IHN3UGF0Y2hlcykgeworICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gZG93blN0cmVhbSA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChzd1BhdGNoLmdldFBsYXliYWNrVGhyZWFkSGFuZGxlKCkpOworICAgICAgICBpZiAoZG93blN0cmVhbSAhPSBOVUxMICYmICh1c2VUaHJlYWQgPT0gbnVsbHB0ciB8fCB1c2VUaHJlYWQoZG93blN0cmVhbSkpKSB7CisgICAgICAgICAgICBkb3duU3RyZWFtLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOworICAgICAgICB9CisgICAgfQorfQorCiAvLyBGaWx0ZXIgcmVzZXJ2ZWQga2V5cyBmcm9tIHNldFBhcmFtZXRlcnMoKSBiZWZvcmUgZm9yd2FyZGluZyB0byBhdWRpbyBIQUwgb3IgYWN0aW5nIHVwb24uCiAvLyBTb21lIGtleXMgYXJlIHVzZWQgZm9yIGF1ZGlvIHJvdXRpbmcgYW5kIGF1ZGlvIHBhdGggY29uZmlndXJhdGlvbiBhbmQgc2hvdWxkIGJlIHJlc2VydmVkIGZvciB1c2UKIC8vIGJ5IGF1ZGlvIHBvbGljeSBhbmQgYXVkaW8gZmxpbmdlciBmb3IgZnVuY3Rpb25hbCwgcHJpdmFjeSBhbmQgc2VjdXJpdHkgcmVhc29ucy4KQEAgLTEyMDAsMjMgKzEzNDcsMzkgQEAKICAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkU2FtcGxpbmdSYXRlcyksCiAgICAgfTsKIAotICAgIC8vIG11bHRpdXNlciBmcmllbmRseSBhcHAgSUQgY2hlY2sgZm9yIHJlcXVlc3RzIGNvbWluZyBmcm9tIGF1ZGlvc2VydmVyCi0gICAgaWYgKG11bHRpdXNlcl9nZXRfYXBwX2lkKGNhbGxpbmdVaWQpID09IEFJRF9BVURJT1NFUlZFUikgewotICAgICAgICByZXR1cm47CisgICAgaWYgKGlzQXVkaW9TZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKKyAgICAgICAgcmV0dXJuOyAvLyBubyBuZWVkIHRvIGZpbHRlciBpZiBhdWRpb3NlcnZlci4KICAgICB9CiAKICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleVZhbHVlUGFpcnMpOwogICAgIFN0cmluZzggdmFsdWU7CisgICAgQXVkaW9QYXJhbWV0ZXIgcmVqZWN0ZWRQYXJhbTsKICAgICBmb3IgKGF1dG8mIGtleSA6IGtSZXNlcnZlZFBhcmFtZXRlcnMpIHsKICAgICAgICAgaWYgKHBhcmFtLmdldChrZXksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR1coIiVzOiBmaWx0ZXJpbmcga2V5ICVzIHZhbHVlICVzIGZyb20gdWlkICVkIiwKLSAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBrZXkuc3RyaW5nKCksIHZhbHVlLnN0cmluZygpLCBjYWxsaW5nVWlkKTsKKyAgICAgICAgICAgIHJlamVjdGVkUGFyYW0uYWRkKGtleSwgdmFsdWUpOwogICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKGtleSk7CiAgICAgICAgIH0KICAgICB9CisgICAgbG9nRmlsdGVyZWRQYXJhbWV0ZXJzKHBhcmFtLnNpemUoKSArIHJlamVjdGVkUGFyYW0uc2l6ZSgpLCBrZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3RlZFBhcmFtLnNpemUoKSwgcmVqZWN0ZWRQYXJhbS50b1N0cmluZygpLCBjYWxsaW5nVWlkKTsKICAgICBrZXlWYWx1ZVBhaXJzID0gcGFyYW0udG9TdHJpbmcoKTsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OmxvZ0ZpbHRlcmVkUGFyYW1ldGVycyhzaXplX3Qgb3JpZ2luYWxLVlBTaXplLCBjb25zdCBTdHJpbmc4JiBvcmlnaW5hbEtWUHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZWplY3RlZEtWUFNpemUsIGNvbnN0IFN0cmluZzgmIHJlamVjdGVkS1ZQcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgY2FsbGluZ1VpZCkgeworICAgIGF1dG8gcHJlZml4ID0gU3RyaW5nODo6Zm9ybWF0KCJVSUQgJTVkIiwgY2FsbGluZ1VpZCk7CisgICAgYXV0byBzdWZmaXggPSBTdHJpbmc4Ojpmb3JtYXQoIiV6dSBLVlAgcmVjZWl2ZWQ6ICVzIiwgb3JpZ2luYWxLVlBTaXplLCBvcmlnaW5hbEtWUHMuY19zdHIoKSk7CisgICAgaWYgKHJlamVjdGVkS1ZQU2l6ZSAhPSAwKSB7CisgICAgICAgIGF1dG8gZXJyb3IgPSBTdHJpbmc4Ojpmb3JtYXQoIiV6dSBLVlAgcmVqZWN0ZWQ6ICVzIiwgcmVqZWN0ZWRLVlBTaXplLCByZWplY3RlZEtWUHMuY19zdHIoKSk7CisgICAgICAgIEFMT0dXKCIlczogJXMsICVzLCAlcyIsIF9fZnVuY19fLCBwcmVmaXguY19zdHIoKSwgZXJyb3IuY19zdHIoKSwgc3VmZml4LmNfc3RyKCkpOworICAgICAgICBtUmVqZWN0ZWRTZXRQYXJhbWV0ZXJMb2cubG9nKCIlcywgJXMsICVzIiwgcHJlZml4LmNfc3RyKCksIGVycm9yLmNfc3RyKCksIHN1ZmZpeC5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdXRvJiBsb2dnZXIgPSAoaXNTZXJ2aWNlVWlkKGNhbGxpbmdVaWQpID8gbVN5c3RlbVNldFBhcmFtZXRlckxvZyA6IG1BcHBTZXRQYXJhbWV0ZXJMb2cpOworICAgICAgICBsb2dnZXIubG9nKCIlcywgJXMiLCBwcmVmaXguY19zdHIoKSwgc3VmZml4LmNfc3RyKCkpOworICAgIH0KK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKQogewogICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXJzKCk6IGlvICVkLCBrZXl2YWx1ZSAlcywgY2FsbGluZyBwaWQgJWQgY2FsbGluZyB1aWQgJWQiLApAQCAtMTI5Niw3ICsxNDU5LDkgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAodGhyZWFkICE9IDApIHsKLSAgICAgICAgcmV0dXJuIHRocmVhZC0+c2V0UGFyYW1ldGVycyhmaWx0ZXJlZEtleVZhbHVlUGFpcnMpOworICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSB0aHJlYWQtPnNldFBhcmFtZXRlcnMoZmlsdGVyZWRLZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgZm9yd2FyZFBhcmFtZXRlcnNUb0Rvd25zdHJlYW1QYXRjaGVzX2wodGhyZWFkLT5pZCgpLCBmaWx0ZXJlZEtleVZhbHVlUGFpcnMpOworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KICAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQpAQCAtMTYzNiw3ICsxODAxLDcgQEAKICAgICBib29sIHVwZGF0ZVBpZCA9IChpbnB1dC5jbGllbnRJbmZvLmNsaWVudFBpZCA9PSAtMSk7CiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKICAgICB1aWRfdCBjbGllbnRVaWQgPSBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFVpZDsKLSAgICBpZiAoIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkpIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CiAgICAgICAgIEFMT0dXX0lGKGNsaWVudFVpZCAhPSBjYWxsaW5nVWlkLAogICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbGxpbmdVaWQsIGNsaWVudFVpZCk7CkBAIC0xNzUxLDYgKzE5MTYsNyBAQAogCiAgICAgb3V0cHV0LmNibGsgPSByZWNvcmRUcmFjay0+Z2V0Q2JsaygpOwogICAgIG91dHB1dC5idWZmZXJzID0gcmVjb3JkVHJhY2stPmdldEJ1ZmZlcnMoKTsKKyAgICBvdXRwdXQucG9ydElkID0gcG9ydElkOwogCiAgICAgLy8gcmV0dXJuIGhhbmRsZSB0byBjbGllbnQKICAgICByZWNvcmRIYW5kbGUgPSBuZXcgUmVjb3JkSGFuZGxlKHJlY29yZFRyYWNrKTsKQEAgLTE4NTQsNiArMjAyMCwxMCBAQAogCiAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7CiAgICAgfQorICAgIGlmIChzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkgPT0gMCkgeworICAgICAgICAvLyBBbiBNU0QgbW9kdWxlIGlzIGluc2VydGVkIGJlZm9yZSBoYXJkd2FyZSBtb2R1bGVzIGluIG9yZGVyIHRvIG1peCBlbmNvZGVkIHN0cmVhbXMuCisgICAgICAgIGZsYWdzID0gc3RhdGljX2Nhc3Q8QXVkaW9Id0RldmljZTo6RmxhZ3M+KGZsYWdzIHwgQXVkaW9Id0RldmljZTo6QUhXRF9JU19JTlNFUlQpOworICAgIH0KIAogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUgPSAoYXVkaW9fbW9kdWxlX2hhbmRsZV90KSBuZXh0VW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9NT0RVTEUpOwogICAgIG1BdWRpb0h3RGV2cy5hZGQoaGFuZGxlLCBuZXcgQXVkaW9Id0RldmljZShoYW5kbGUsIG5hbWUsIGRldiwgZmxhZ3MpKTsKQEAgLTE4ODUsNyArMjA1NSw3IEBACiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlLCBpbnQ2NF90IHRvdGFsTWVtb3J5KQogewogICAgIHVpZF90IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAodWlkICE9IEFJRF9TWVNURU0pIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPclN5c3RlbVNlcnZlclVpZCh1aWQpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTE5MzAsNiArMjEwMCwyOCBAQAogICAgIHJldHVybiBtQ2xpZW50U2hhcmVkSGVhcFNpemU7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoreworICAgIEFMT0dWKF9fZnVuY19fKTsKKworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGU7CisgICAgaWYgKGNvbmZpZy0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgIG1vZHVsZSA9IGNvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbW9kdWxlID0gY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9Id0RldnMuaW5kZXhPZktleShtb2R1bGUpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coIiVzKCkgYmFkIGh3IG1vZHVsZSAlZCIsIF9fZnVuY19fLCBtb2R1bGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBtQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7CisgICAgcmV0dXJuIGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCktPnNldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworfQorCiBhdWRpb19od19zeW5jX3QgQXVkaW9GbGluZ2VyOjpnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMTk3NSw3ICsyMTY3LDEwIEBACiAgICAgICAgIGlmIChzZXNzaW9ucyAmIFRocmVhZEJhc2U6OlRSQUNLX1NFU1NJT04pIHsKICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1Id0F2U3luYyksIHZhbHVlKTsKLSAgICAgICAgICAgIHRocmVhZC0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIFN0cmluZzgga2V5VmFsdWVQYWlycyA9IHBhcmFtLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB0aHJlYWQtPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICBmb3J3YXJkUGFyYW1ldGVyc1RvRG93bnN0cmVhbVBhdGNoZXNfbCh0aHJlYWQtPmlkKCksIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYgdGhyZWFkKSB7IHJldHVybiB0aHJlYWQtPnVzZXNId0F2U3luYygpOyB9KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtMjAyMSw3ICsyMjE2LDEwIEBACiAgICAgICAgIEFMT0dWKCJzZXRBdWRpb0h3U3luY0ZvclNlc3Npb25fbCBmb3VuZCBJRCAlZCBmb3Igc2Vzc2lvbiAlZCIsIHN5bmNJZCwgc2Vzc2lvbklkKTsKICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwogICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtSHdBdlN5bmMpLCBzeW5jSWQpOwotICAgICAgICB0aHJlYWQtPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgIFN0cmluZzgga2V5VmFsdWVQYWlycyA9IHBhcmFtLnRvU3RyaW5nKCk7CisgICAgICAgIHRocmVhZC0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgZm9yd2FyZFBhcmFtZXRlcnNUb0Rvd25zdHJlYW1QYXRjaGVzX2wodGhyZWFkLT5pZCgpLCBrZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgIFtdKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYgdGhyZWFkKSB7IHJldHVybiB0aHJlYWQtPnVzZXNId0F2U3luYygpOyB9KTsKICAgICB9CiB9CiAKQEAgLTIxMTEsNiArMjMwOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCwgdGhyZWFkLmdldCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1QbGF5YmFja1RocmVhZHMuYWRkKCpvdXRwdXQsIHRocmVhZCk7CisgICAgICAgICAgICBtUGF0Y2hQYW5lbC5ub3RpZnlTdHJlYW1PcGVuZWQob3V0SHdEZXYsICpvdXRwdXQpOwogICAgICAgICAgICAgcmV0dXJuIHRocmVhZDsKICAgICAgICAgfQogICAgIH0KQEAgLTIyMDksNiArMjQwOCw4IEBACiAgICAgICAgIGlmIChwbGF5YmFja1RocmVhZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HVigiY2xvc2VPdXRwdXQoKSAlZCIsIG91dHB1dCk7CiAKKyAgICAgICAgICAgIGR1bXBUb1RocmVhZExvZ19sKHBsYXliYWNrVGhyZWFkKTsKKwogICAgICAgICAgICAgaWYgKHBsYXliYWNrVGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6TUlYRVIpIHsKICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+aXNEdXBsaWNhdGluZygpKSB7CkBAIC0yMjQwLDEyICsyNDQxLDE0IEBACiAgICAgICAgICAgICBpZiAobW1hcFRocmVhZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGR1bXBUb1RocmVhZExvZ19sKG1tYXBUaHJlYWQpOwogICAgICAgICAgICAgbU1tYXBUaHJlYWRzLnJlbW92ZUl0ZW0ob3V0cHV0KTsKICAgICAgICAgICAgIEFMT0dEKCJjbG9zaW5nIG1tYXBUaHJlYWQgJXAiLCBtbWFwVGhyZWFkLmdldCgpKTsKICAgICAgICAgfQogICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gaW9EZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7CiAgICAgICAgIGlvRGVzYy0+bUlvSGFuZGxlID0gb3V0cHV0OwogICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoQVVESU9fT1VUUFVUX0NMT1NFRCwgaW9EZXNjKTsKKyAgICAgICAgbVBhdGNoUGFuZWwubm90aWZ5U3RyZWFtQ2xvc2VkKG91dHB1dCk7CiAgICAgfQogICAgIC8vIFRoZSB0aHJlYWQgZW50aXR5IChhY3RpdmUgdW5pdCBvZiBleGVjdXRpb24pIGlzIG5vIGxvbmdlciBydW5uaW5nIGhlcmUsCiAgICAgLy8gYnV0IHRoZSBUaHJlYWRCYXNlIGNvbnRhaW5lciBzdGlsbCBleGlzdHMuCkBAIC0yMjc0LDcgKzI0NzcsNyBAQAogICAgIGRlbGV0ZSBvdXQ7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpjbG9zZU91dHB1dEludGVybmFsX2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiB0aHJlYWQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VUaHJlYWRJbnRlcm5hbF9sKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYgdGhyZWFkKQogewogICAgIG1QbGF5YmFja1RocmVhZHMucmVtb3ZlSXRlbSh0aHJlYWQtPm1JZCk7CiAgICAgdGhyZWFkLT5leGl0KCk7CkBAIC0yMzI2LDcgKzI1MjksOCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG9wZW5JbnB1dF9sKG1vZHVsZSwgaW5wdXQsIGNvbmZpZywgKmRldmljZXMsIGFkZHJlc3MsIHNvdXJjZSwgZmxhZ3MpOworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG9wZW5JbnB1dF9sKAorICAgICAgICAgICAgbW9kdWxlLCBpbnB1dCwgY29uZmlnLCAqZGV2aWNlcywgYWRkcmVzcywgc291cmNlLCBmbGFncywgQVVESU9fREVWSUNFX05PTkUsIFN0cmluZzh7fSk7CiAKICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgLy8gbm90aWZ5IGNsaWVudCBwcm9jZXNzZXMgb2YgdGhlIG5ldyBpbnB1dCBjcmVhdGlvbgpAQCAtMjM0Miw3ICsyNTQ2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG91dHB1dERldmljZUFkZHJlc3MpCiB7CiAgICAgQXVkaW9Id0RldmljZSAqaW5Id0RldiA9IGZpbmRTdWl0YWJsZUh3RGV2X2wobW9kdWxlLCBkZXZpY2VzKTsKICAgICBpZiAoaW5Id0RldiA9PSBOVUxMKSB7CkBAIC0yMzUwLDYgKzI1NTYsOSBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKKyAgICAvLyBTb21lIGZsYWdzIGFyZSBzcGVjaWZpYyB0byBmcmFtZXdvcmsgYW5kIG11c3Qgbm90IGxlYWsgdG8gdGhlIEhBTC4KKyAgICBmbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+KGZsYWdzICYgfkFVRElPX0lOUFVUX0ZSQU1FV09SS19GTEFHUyk7CisKICAgICAvLyBBdWRpbyBQb2xpY3kgY2FuIHJlcXVlc3QgYSBzcGVjaWZpYyBoYW5kbGUgZm9yIGhhcmR3YXJlIGhvdHdvcmQuCiAgICAgLy8gVGhlIGdvYWwgaGVyZSBpcyBub3QgdG8gcmUtb3BlbiBhbiBhbHJlYWR5IG9wZW5lZCBpbnB1dC4KICAgICAvLyBJdCBpcyB0byB1c2UgYSBwcmUtYXNzaWduZWQgSS9PIGhhbmRsZS4KQEAgLTIzNjgsNyArMjU3Nyw4IEBACiAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBpbkh3SGFsID0gaW5Id0Rldi0+aHdEZXZpY2UoKTsKICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gaW5TdHJlYW07CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5Id0hhbC0+b3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgKmlucHV0LCBkZXZpY2VzLCAmaGFsY29uZmlnLCBmbGFncywgYWRkcmVzcy5zdHJpbmcoKSwgc291cmNlLCAmaW5TdHJlYW0pOworICAgICAgICAgICAgKmlucHV0LCBkZXZpY2VzLCAmaGFsY29uZmlnLCBmbGFncywgYWRkcmVzcy5zdHJpbmcoKSwgc291cmNlLAorICAgICAgICAgICAgb3V0cHV0RGV2aWNlLCBvdXRwdXREZXZpY2VBZGRyZXNzLCAmaW5TdHJlYW0pOwogICAgIEFMT0dWKCJvcGVuSW5wdXRfbCgpIG9wZW5JbnB1dFN0cmVhbSByZXR1cm5lZCBpbnB1dCAlcCwgZGV2aWNlcyAlI3gsIFNhbXBsaW5nUmF0ZSAlZCIKICAgICAgICAgICAgIiwgRm9ybWF0ICUjeCwgQ2hhbm5lbHMgJSN4LCBmbGFncyAlI3gsIHN0YXR1cyAlZCBhZGRyICVzIiwKICAgICAgICAgICAgIGluU3RyZWFtLmdldCgpLApAQCAtMjM5MSw3ICsyNjAxLDggQEAKICAgICAgICAgQUxPR1YoIm9wZW5JbnB1dF9sKCkgcmVvcGVuaW5nIHdpdGggcHJvcG9zZWQgc2FtcGxpbmcgcmF0ZSBhbmQgY2hhbm5lbCBtYXNrIik7CiAgICAgICAgIGluU3RyZWFtLmNsZWFyKCk7CiAgICAgICAgIHN0YXR1cyA9IGluSHdIYWwtPm9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICAqaW5wdXQsIGRldmljZXMsICZoYWxjb25maWcsIGZsYWdzLCBhZGRyZXNzLnN0cmluZygpLCBzb3VyY2UsICZpblN0cmVhbSk7CisgICAgICAgICAgICAgICAgKmlucHV0LCBkZXZpY2VzLCAmaGFsY29uZmlnLCBmbGFncywgYWRkcmVzcy5zdHJpbmcoKSwgc291cmNlLAorICAgICAgICAgICAgICAgIG91dHB1dERldmljZSwgb3V0cHV0RGV2aWNlQWRkcmVzcywgJmluU3RyZWFtKTsKICAgICAgICAgLy8gRklYTUUgbG9nIHRoaXMgbmV3IHN0YXR1czsgSEFMIHNob3VsZCBub3QgcHJvcG9zZSBhbnkgZnVydGhlciBjaGFuZ2VzCiAgICAgfQogCkBAIC0yNDA3LDU1ICsyNjE4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLmdldCgpKTsKICAgICAgICAgICAgIHJldHVybiB0aHJlYWQ7CiAgICAgICAgIH0gZWxzZSB7Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgICAgIC8vIFRyeSB0byByZS11c2UgbW9zdCByZWNlbnRseSB1c2VkIFBpcGUgdG8gYXJjaGl2ZSBhIGNvcHkgb2YgaW5wdXQgZm9yIGR1bXBzeXMsCi0gICAgICAgICAgICAvLyBvciAocmUtKWNyZWF0ZSBpZiBjdXJyZW50IFBpcGUgaXMgaWRsZSBhbmQgZG9lcyBub3QgbWF0Y2ggdGhlIG5ldyBmb3JtYXQKLSAgICAgICAgICAgIHNwPE5CQUlPX1Npbms+IHRlZVNpbms7Ci0gICAgICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgICAgICBURUVfU0lOS19OTywgICAgLy8gZG9uJ3QgY29weSBpbnB1dAotICAgICAgICAgICAgICAgIFRFRV9TSU5LX05FVywgICAvLyBjb3B5IGlucHV0IHVzaW5nIGEgbmV3IHBpcGUKLSAgICAgICAgICAgICAgICBURUVfU0lOS19PTEQsICAgLy8gY29weSBpbnB1dCB1c2luZyBhbiBleGlzdGluZyBwaXBlCi0gICAgICAgICAgICB9IGtpbmQ7Ci0gICAgICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhoYWxjb25maWcuc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGhhbGNvbmZpZy5jaGFubmVsX21hc2spLCBoYWxjb25maWcuZm9ybWF0KTsKLSAgICAgICAgICAgIGlmICghbVRlZVNpbmtJbnB1dEVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTk87Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFGb3JtYXRfaXNWYWxpZChmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05POwotICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVjb3JkVGVlU2luayA9PSAwKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05FVzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVJlY29yZFRlZVNpbmstPmdldFN0cm9uZ0NvdW50KCkgIT0gMSkgewotICAgICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19OTzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRm9ybWF0X2lzRXF1YWwoZm9ybWF0LCBtUmVjb3JkVGVlU2luay0+Zm9ybWF0KCkpKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX09MRDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05FVzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoa2luZCkgewotICAgICAgICAgICAgY2FzZSBURUVfU0lOS19ORVc6IHsKLSAgICAgICAgICAgICAgICBQaXBlICpwaXBlID0gbmV3IFBpcGUobVRlZVNpbmtJbnB1dEZyYW1lcywgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtmb3JtYXR9OwotICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBwaXBlLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICAgICAgICAgICAgICBQaXBlUmVhZGVyICpwaXBlUmVhZGVyID0gbmV3IFBpcGVSZWFkZXIoKnBpcGUpOwotICAgICAgICAgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgICAgIGluZGV4ID0gcGlwZVJlYWRlci0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7Ci0gICAgICAgICAgICAgICAgbVJlY29yZFRlZVNpbmsgPSBwaXBlOwotICAgICAgICAgICAgICAgIG1SZWNvcmRUZWVTb3VyY2UgPSBwaXBlUmVhZGVyOwotICAgICAgICAgICAgICAgIHRlZVNpbmsgPSBwaXBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVEVFX1NJTktfT0xEOgotICAgICAgICAgICAgICAgIHRlZVNpbmsgPSBtUmVjb3JkVGVlU2luazsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVEVFX1NJTktfTk86Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotI2VuZGlmCi0KICAgICAgICAgICAgIC8vIFN0YXJ0IHJlY29yZCB0aHJlYWQKICAgICAgICAgICAgIC8vIFJlY29yZFRocmVhZCByZXF1aXJlcyBib3RoIGlucHV0IGFuZCBvdXRwdXQgZGV2aWNlIGluZGljYXRpb24gdG8gZm9yd2FyZCB0byBhdWRpbwogICAgICAgICAgICAgLy8gcHJlIHByb2Nlc3NpbmcgbW9kdWxlcwpAQCAtMjQ2NSw5ICsyNjI3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU91dHB1dERldmljZV9sKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1SZWFkeQotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgdGVlU2luawotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBtUmVjb3JkVGhyZWFkcy5hZGQoKmlucHV0LCB0aHJlYWQpOwogICAgICAgICAgICAgQUxPR1YoIm9wZW5JbnB1dF9sKCkgY3JlYXRlZCByZWNvcmQgdGhyZWFkOiBJRCAlZCB0aHJlYWQgJXAiLCAqaW5wdXQsIHRocmVhZC5nZXQoKSk7CkBAIC0yNDk2LDYgKzI2NTUsOCBAQAogICAgICAgICBpZiAocmVjb3JkVGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIEFMT0dWKCJjbG9zZUlucHV0KCkgJWQiLCBpbnB1dCk7CiAKKyAgICAgICAgICAgIGR1bXBUb1RocmVhZExvZ19sKHJlY29yZFRocmVhZCk7CisKICAgICAgICAgICAgIC8vIElmIHdlIHN0aWxsIGhhdmUgZWZmZWN0IGNoYWlucywgaXQgbWVhbnMgdGhhdCBhIGNsaWVudCBzdGlsbCBob2xkcyBhIGhhbmRsZQogICAgICAgICAgICAgLy8gb24gYXQgbGVhc3Qgb25lIGVmZmVjdC4gV2UgbXVzdCBlaXRoZXIgbW92ZSB0aGUgY2hhaW4gdG8gYW4gZXhpc3RpbmcgdGhyZWFkIHdpdGggdGhlCiAgICAgICAgICAgICAvLyBzYW1lIHNlc3Npb24gSUQgb3IgcHV0IGl0IGFzaWRlIGluIGNhc2UgYSBuZXcgcmVjb3JkIHRocmVhZCBpcyBvcGVuZWQgZm9yIGEKQEAgLTI1MzgsNiArMjY5OSw3IEBACiAgICAgICAgICAgICBpZiAobW1hcFRocmVhZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGR1bXBUb1RocmVhZExvZ19sKG1tYXBUaHJlYWQpOwogICAgICAgICAgICAgbU1tYXBUaHJlYWRzLnJlbW92ZUl0ZW0oaW5wdXQpOwogICAgICAgICB9CiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBpb0Rlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKQEAgLTI1NjcsNyArMjcyOSw3IEBACiAgICAgZGVsZXRlIGluOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VJbnB1dEludGVybmFsX2woY29uc3Qgc3A8UmVjb3JkVGhyZWFkPiYgdGhyZWFkKQordm9pZCBBdWRpb0ZsaW5nZXI6OmNsb3NlVGhyZWFkSW50ZXJuYWxfbChjb25zdCBzcDxSZWNvcmRUaHJlYWQ+JiB0aHJlYWQpCiB7CiAgICAgbVJlY29yZFRocmVhZHMucmVtb3ZlSXRlbSh0aHJlYWQtPm1JZCk7CiAgICAgY2xvc2VJbnB1dEZpbmlzaCh0aHJlYWQpOwpAQCAtMjYwNSw3ICsyNzY3LDggQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHBpZF90IGNhbGxlciA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICBBTE9HVigiYWNxdWlyaW5nICVkIGZyb20gJWQsIGZvciAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyLCBwaWQpOwotICAgIGlmIChwaWQgIT0gLTEgJiYgKGNhbGxlciA9PSBnZXRwaWRfY2FjaGVkKSkgeworICAgIGNvbnN0IHVpZF90IGNhbGxlclVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAocGlkICE9IC0xICYmIGlzQXVkaW9TZXJ2ZXJVaWQoY2FsbGVyVWlkKSkgeyAvLyBjaGVjayBtdXN0IG1hdGNoIHJlbGVhc2VBdWRpb1Nlc3Npb25JZCgpCiAgICAgICAgIGNhbGxlciA9IHBpZDsKICAgICB9CiAKQEAgLTI2MzksNyArMjgwMiw4IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBwaWRfdCBjYWxsZXIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgQUxPR1YoInJlbGVhc2luZyAlZCBmcm9tICVkIGZvciAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyLCBwaWQpOwotICAgIGlmIChwaWQgIT0gLTEgJiYgKGNhbGxlciA9PSBnZXRwaWRfY2FjaGVkKSkgeworICAgIGNvbnN0IHVpZF90IGNhbGxlclVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAocGlkICE9IC0xICYmIGlzQXVkaW9TZXJ2ZXJVaWQoY2FsbGVyVWlkKSkgeyAvLyBjaGVjayBtdXN0IG1hdGNoIGFjcXVpcmVBdWRpb1Nlc3Npb25JZCgpCiAgICAgICAgIGNhbGxlciA9IHBpZDsKICAgICB9CiAgICAgc2l6ZV90IG51bSA9IG1BdWRpb1Nlc3Npb25SZWZzLnNpemUoKTsKQEAgLTI2NTYsOSArMjgyMCwxMCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQotICAgIC8vIElmIHRoZSBjYWxsZXIgaXMgbWVkaWFzZXJ2ZXIgaXQgaXMgbGlrZWx5IHRoYXQgdGhlIHNlc3Npb24gYmVpbmcgcmVsZWFzZWQgd2FzIGFjcXVpcmVkCisgICAgLy8gSWYgdGhlIGNhbGxlciBpcyBhdWRpb3NlcnZlciBpdCBpcyBsaWtlbHkgdGhhdCB0aGUgc2Vzc2lvbiBiZWluZyByZWxlYXNlZCB3YXMgYWNxdWlyZWQKICAgICAvLyBvbiBiZWhhbGYgb2YgYSBwcm9jZXNzIG5vdCBpbiBub3RpZmljYXRpb24gY2xpZW50cyBhbmQgd2UgaWdub3JlIHRoZSB3YXJuaW5nLgotICAgIEFMT0dXX0lGKGNhbGxlciAhPSBnZXRwaWRfY2FjaGVkLCAic2Vzc2lvbiBpZCAlZCBub3QgZm91bmQgZm9yIHBpZCAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyKTsKKyAgICBBTE9HV19JRighaXNBdWRpb1NlcnZlclVpZChjYWxsZXJVaWQpLAorICAgICAgICAgICAgInNlc3Npb24gaWQgJWQgbm90IGZvdW5kIGZvciBwaWQgJWQiLCBhdWRpb1Nlc3Npb24sIGNhbGxlcik7CiB9CiAKIGJvb2wgQXVkaW9GbGluZ2VyOjppc1Nlc3Npb25BY3F1aXJlZF9sKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24pCkBAIC0yNzMzLDYgKzI4OTgsMTcgQEAKICAgICByZXR1cm47CiB9CiAKKy8vIGR1bXBUb1RocmVhZExvZ19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKK3ZvaWQgQXVkaW9GbGluZ2VyOjpkdW1wVG9UaHJlYWRMb2dfbChjb25zdCBzcDxUaHJlYWRCYXNlPiAmdGhyZWFkKQoreworICAgIGF1ZGlvX3V0aWxzOjpGZFRvU3RyaW5nIGZkVG9TdHJpbmc7CisgICAgY29uc3QgaW50IGZkID0gZmRUb1N0cmluZy5mZCgpOworICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgIHRocmVhZC0+ZHVtcChmZCwge30gLyogYXJncyAqLyk7CisgICAgICAgIG1UaHJlYWRMb2cubG9ncygtMSAvKiB0aW1lICovLCBmZFRvU3RyaW5nLmdldFN0cmluZ0FuZENsb3NlKCkpOworICAgIH0KK30KKwogLy8gY2hlY2tUaHJlYWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCiBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2UgKkF1ZGlvRmxpbmdlcjo6Y2hlY2tUaHJlYWRfbChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3QKIHsKQEAgLTI5MzgsMTYgKzMxMTQsNzQgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBVdWlkLAotICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBUeXBlVXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSBjb25zdAogeworICAgIGlmIChwVXVpZCA9PSBOVUxMIHx8IHBUeXBlVXVpZCA9PSBOVUxMIHx8IGRlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeUhhbC5nZXQoKSkgewotICAgICAgICByZXR1cm4gbUVmZmVjdHNGYWN0b3J5SGFsLT5nZXREZXNjcmlwdG9yKHBVdWlkLCBkZXNjcmlwdG9yKTsKLSAgICB9IGVsc2UgeworCisgICAgaWYgKCFtRWZmZWN0c0ZhY3RvcnlIYWwuZ2V0KCkpIHsKICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CiAgICAgfQotfQogCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKCFFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6aXNOdWxsVXVpZChwVXVpZCkpIHsKKyAgICAgICAgLy8gSWYgdXVpZCBpcyBzcGVjaWZpZWQsIHJlcXVlc3QgZWZmZWN0IGRlc2NyaXB0b3IgZnJvbSB0aGF0LgorICAgICAgICBzdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPmdldERlc2NyaXB0b3IocFV1aWQsIGRlc2NyaXB0b3IpOworICAgIH0gZWxzZSBpZiAoIUVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjppc051bGxVdWlkKHBUeXBlVXVpZCkpIHsKKyAgICAgICAgLy8gSWYgdXVpZCBpcyBub3Qgc3BlY2lmaWVkLCBsb29rIGZvciBhbiBhdmFpbGFibGUgaW1wbGVtZW50YXRpb24KKyAgICAgICAgLy8gb2YgdGhlIHJlcXVpcmVkIHR5cGUgaW5zdGVhZC4KKworICAgICAgICAvLyBVc2UgYSB0ZW1wb3JhcnkgZGVzY3JpcHRvciB0byBhdm9pZCBtb2RpZnlpbmcgfGRlc2NyaXB0b3J8IGluIHRoZSBmYWlsdXJlIGNhc2UuCisgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYzsKKyAgICAgICAgZGVzYy5mbGFncyA9IDA7IC8vIHByZXZlbnQgY29tcGlsZXIgd2FybmluZworCisgICAgICAgIHVpbnQzMl90IG51bUVmZmVjdHMgPSAwOworICAgICAgICBzdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPnF1ZXJ5TnVtYmVyRWZmZWN0cygmbnVtRWZmZWN0cyk7CisgICAgICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgICAgICBBTE9HVygiZ2V0RWZmZWN0RGVzY3JpcHRvcigpIGVycm9yICVkIGZyb20gRmFjdG9yeUhhbCBxdWVyeU51bWJlckVmZmVjdHMiLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bUVmZmVjdHM7IGkrKykgeworICAgICAgICAgICAgc3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5SGFsLT5nZXREZXNjcmlwdG9yKGksICZkZXNjKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImdldEVmZmVjdERlc2NyaXB0b3IoKSBlcnJvciAlZCBmcm9tIEZhY3RvcnlIYWwgZ2V0RGVzY3JpcHRvciIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWVtY21wKCZkZXNjLnR5cGUsIHBUeXBlVXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgbWF0Y2hpbmcgdHlwZSBmb3VuZCBzYXZlIGVmZmVjdCBkZXNjcmlwdG9yLgorICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAqZGVzY3JpcHRvciA9IGRlc2M7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIHByZWZlcnJlZCBmbGFnIG9yIHRoaXMgZGVzY3JpcHRvciBtYXRjaGVzIHRoZSBwcmVmZXJyZWQKKyAgICAgICAgICAgICAgICAvLyBmbGFnLCBzdWNjZXNzISBJZiB0aGlzIGRlc2NyaXB0b3IgZG9lc24ndCBtYXRjaCB0aGUgcHJlZmVycmVkCisgICAgICAgICAgICAgICAgLy8gZmxhZywgY29udGludWUgZW51bWVyYXRpb24gaW4gY2FzZSBhIGJldHRlciBtYXRjaGluZyB2ZXJzaW9uIG9mIHRoaXMKKyAgICAgICAgICAgICAgICAvLyBlZmZlY3QgdHlwZSBpcyBhdmFpbGFibGUuIE5vdGUgdGhhdCB0aGlzIG1lYW5zIGlmIG5vIGVmZmVjdCB3aXRoIGEKKyAgICAgICAgICAgICAgICAvLyBjb3JyZWN0IGZsYWcgaXMgZm91bmQsIHRoZSBkZXNjcmlwdG9yIHJldHVybmVkIHdpbGwgY29ycmVzcG9uZCB0byB0aGUKKyAgICAgICAgICAgICAgICAvLyBsYXN0IGVmZmVjdCB0aGF0IGF0IGxlYXN0IGhhZCBhIG1hdGNoaW5nIHR5cGUgdXVpZCAoaWYgYW55KS4KKyAgICAgICAgICAgICAgICBpZiAocHJlZmVycmVkVHlwZUZsYWcgPT0gRUZGRUNUX0ZMQUdfVFlQRV9NQVNLIHx8CisgICAgICAgICAgICAgICAgICAgIChkZXNjLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBwcmVmZXJyZWRUeXBlRmxhZykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgICAgIEFMT0dXKCJnZXRFZmZlY3REZXNjcmlwdG9yKCk6IEVmZmVjdCBub3QgZm91bmQgYnkgdHlwZS4iKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoImdldEVmZmVjdERlc2NyaXB0b3IoKTogRWl0aGVyIHV1aWQgb3IgdHlwZSB1dWlkIG11c3QgYmUgbm9uLW51bGwgVVVJRHMuIik7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CiAKIHNwPElFZmZlY3Q+IEF1ZGlvRmxpbmdlcjo6Y3JlYXRlRWZmZWN0KAogICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzYywKQEAgLTI5NjYsNyArMzIwMCw3IEBACiAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjOwogCiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAocGlkID09IC0xIHx8ICFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpKSB7CisgICAgaWYgKHBpZCA9PSAtMSB8fCAhaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKICAgICAgICAgY29uc3QgcGlkX3QgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICAgICAgQUxPR1dfSUYocGlkICE9IC0xICYmIHBpZCAhPSBjYWxsaW5nUGlkLAogICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHBpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgcGlkICVkIiwKQEAgLTI5ODIsODQgKzMyMTYsNTUgQEAKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAotICAgIC8vIGNoZWNrIGF1ZGlvIHNldHRpbmdzIHBlcm1pc3Npb24gZm9yIGdsb2JhbCBlZmZlY3RzCi0gICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggJiYgIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIGxTdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8vIFNlc3Npb24gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UgaXMgcmVzZXJ2ZWQgZm9yIG91dHB1dCBzdGFnZSBlZmZlY3RzCi0gICAgLy8gdGhhdCBjYW4gb25seSBiZSBjcmVhdGVkIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyIChydW5uaW5nIGluIHNhbWUgcHJvY2VzcykKLSAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFICYmIGdldHBpZF9jYWNoZWQgIT0gcGlkKSB7Ci0gICAgICAgIGxTdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQogICAgIGlmIChtRWZmZWN0c0ZhY3RvcnlIYWwgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IG5vIGVmZmVjdHMgZmFjdG9yeSBoYWwiLCBfX2Z1bmNfXyk7CiAgICAgICAgIGxTdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotCi0gICAgICAgIGlmICghRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmlzTnVsbFV1aWQoJnBEZXNjLT51dWlkKSkgewotICAgICAgICAgICAgLy8gaWYgdXVpZCBpcyBzcGVjaWZpZWQsIHJlcXVlc3QgZWZmZWN0IGRlc2NyaXB0b3IKLSAgICAgICAgICAgIGxTdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPmdldERlc2NyaXB0b3IoJnBEZXNjLT51dWlkLCAmZGVzYyk7Ci0gICAgICAgICAgICBpZiAobFN0YXR1cyA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0KCkgZXJyb3IgJWQgZnJvbSBFZmZlY3RHZXREZXNjcmlwdG9yIiwgbFN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaWYgdXVpZCBpcyBub3Qgc3BlY2lmaWVkLCBsb29rIGZvciBhbiBhdmFpbGFibGUgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgIC8vIG9mIHRoZSByZXF1aXJlZCB0eXBlIGluIGVmZmVjdCBmYWN0b3J5Ci0gICAgICAgICAgICBpZiAoRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmlzTnVsbFV1aWQoJnBEZXNjLT50eXBlKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBubyBlZmZlY3QgdHlwZSIpOwotICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDMyX3QgbnVtRWZmZWN0cyA9IDA7Ci0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGQ7Ci0gICAgICAgICAgICBkLmZsYWdzID0gMDsgLy8gcHJldmVudCBjb21waWxlciB3YXJuaW5nCi0gICAgICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGxTdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPnF1ZXJ5TnVtYmVyRWZmZWN0cygmbnVtRWZmZWN0cyk7Ci0gICAgICAgICAgICBpZiAobFN0YXR1cyA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0KCkgZXJyb3IgJWQgZnJvbSBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMiLCBsU3RhdHVzKTsKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtRWZmZWN0czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbFN0YXR1cyA9IG1FZmZlY3RzRmFjdG9yeUhhbC0+Z2V0RGVzY3JpcHRvcihpLCAmZGVzYyk7Ci0gICAgICAgICAgICAgICAgaWYgKGxTdGF0dXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBlcnJvciAlZCBmcm9tIEVmZmVjdFF1ZXJ5RWZmZWN0IiwgbFN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobWVtY21wKCZkZXNjLnR5cGUsICZwRGVzYy0+dHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIG1hdGNoaW5nIHR5cGUgZm91bmQgc2F2ZSBlZmZlY3QgZGVzY3JpcHRvci4gSWYgdGhlIHNlc3Npb24gaXMKLSAgICAgICAgICAgICAgICAgICAgLy8gMCBhbmQgdGhlIGVmZmVjdCBpcyBub3QgYXV4aWxpYXJ5LCBjb250aW51ZSBlbnVtZXJhdGlvbiBpbiBjYXNlCi0gICAgICAgICAgICAgICAgICAgIC8vIGFuIGF1eGlsaWFyeSB2ZXJzaW9uIG9mIHRoaXMgZWZmZWN0IHR5cGUgaXMgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZCA9IGRlc2M7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBlZmZlY3Qgbm90IGZvdW5kIik7Ci0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRm9yIHNhbWUgZWZmZWN0IHR5cGUsIGNob3NlIGF1eGlsaWFyeSB2ZXJzaW9uIG92ZXIgaW5zZXJ0IHZlcnNpb24gaWYKLSAgICAgICAgICAgIC8vIGNvbm5lY3QgdG8gb3V0cHV0IG1peCAoQ29tcGxpYW5jZSB0byBPcGVuU0wgRVMpCi0gICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCAmJgotICAgICAgICAgICAgICAgICAgICAoZC5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgIT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKLSAgICAgICAgICAgICAgICBkZXNjID0gZDsKLSAgICAgICAgICAgIH0KKyAgICAvLyBjaGVjayBhdWRpbyBzZXR0aW5ncyBwZXJtaXNzaW9uIGZvciBnbG9iYWwgZWZmZWN0cworICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogbm8gcGVybWlzc2lvbiBmb3IgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYIiwgX19mdW5jX18pOworICAgICAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UpIHsKKyAgICAgICAgaWYgKCFpc0F1ZGlvU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG9ubHkgQVBNIGNhbiBjcmVhdGUgdXNpbmcgQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBsU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW8gPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQVBNIG11c3Qgc3BlY2lmeSBvdXRwdXQgd2hlbiB1c2luZyBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBnZW5lcmFsIHNlc3Npb25JZC4KKworICAgICAgICBpZiAoYXVkaW9fdW5pcXVlX2lkX2dldF91c2Uoc2Vzc2lvbklkKSAhPSBBVURJT19VTklRVUVfSURfVVNFX1NFU1NJT04pIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBzZXNzaW9uSWQgJWQiLCBfX2Z1bmNfXywgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgY2hlY2sgaWYgdGhlIGNhbGxpbmdVaWQgKGxpbWl0ZWQgdG8gcGlkKSBpcyBpbiBtQXVkaW9TZXNzaW9uUmVmcworICAgICAgICAvLyB0byBwcmV2ZW50IGNyZWF0aW5nIGFuIGVmZmVjdCB3aGVuIG9uZSBkb2Vzbid0IGFjdHVhbGx5IGhhdmUgdHJhY2sgd2l0aCB0aGF0IHNlc3Npb24/CiAgICAgfQorCiAgICAgeworICAgICAgICAvLyBHZXQgdGhlIGZ1bGwgZWZmZWN0IGRlc2NyaXB0b3IgZnJvbSB0aGUgdXVpZC90eXBlLgorICAgICAgICAvLyBJZiB0aGUgc2Vzc2lvbiBpcyB0aGUgb3V0cHV0IG1peCwgcHJlZmVyIGFuIGF1eGlsaWFyeSBlZmZlY3QsCisgICAgICAgIC8vIG90aGVyd2lzZSBubyBwcmVmZXJlbmNlLgorICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlID0gKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZIDogRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKTsKKyAgICAgICAgbFN0YXR1cyA9IGdldEVmZmVjdERlc2NyaXB0b3IoJnBEZXNjLT51dWlkLCAmcERlc2MtPnR5cGUsIHByZWZlcnJlZFR5cGUsICZkZXNjKTsKKyAgICAgICAgaWYgKGxTdGF0dXMgPCAwKSB7CisgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0KCkgZXJyb3IgJWQgZnJvbSBnZXRFZmZlY3REZXNjcmlwdG9yIiwgbFN0YXR1cyk7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KIAogICAgICAgICAvLyBEbyBub3QgYWxsb3cgYXV4aWxpYXJ5IGVmZmVjdHMgb24gYSBzZXNzaW9uIGRpZmZlcmVudCBmcm9tIDAgKG91dHB1dCBtaXgpCiAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYICYmCkBAIC0zMDk0LDM0ICszMjk5LDEzIEBACiAgICAgICAgIC8vIGJlY2F1c2Ugb2YgY29kZSBjaGVja2luZyBvdXRwdXQgd2hlbiBlbnRlcmluZyB0aGUgZnVuY3Rpb24uCiAgICAgICAgIC8vIE5vdGU6IGlvIGlzIG5ldmVyIDAgd2hlbiBjcmVhdGluZyBhbiBlZmZlY3Qgb24gYW4gaW5wdXQKICAgICAgICAgaWYgKGlvID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFKSB7Ci0gICAgICAgICAgICAgICAgLy8gb3V0cHV0IG11c3QgYmUgc3BlY2lmaWVkIGJ5IEF1ZGlvUG9saWN5TWFuYWdlciB3aGVuIHVzaW5nIHNlc3Npb24KLSAgICAgICAgICAgICAgICAvLyBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRQotICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gbG9vayBmb3IgdGhlIHRocmVhZCB3aGVyZSB0aGUgc3BlY2lmaWVkIGF1ZGlvIHNlc3Npb24gaXMgcHJlc2VudAotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+aGFzQXVkaW9TZXNzaW9uKHNlc3Npb25JZCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpbyA9IG1QbGF5YmFja1RocmVhZHMua2V5QXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlvID0gZmluZElvSGFuZGxlQnlTZXNzaW9uSWRfbChzZXNzaW9uSWQsIG1QbGF5YmFja1RocmVhZHMpOworICAgICAgICAgICAgaWYgKGlvID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgaW8gPSBmaW5kSW9IYW5kbGVCeVNlc3Npb25JZF9sKHNlc3Npb25JZCwgbVJlY29yZFRocmVhZHMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGlvID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVjb3JkVGhyZWFkcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAobVJlY29yZFRocmVhZHMudmFsdWVBdChpKS0+aGFzQXVkaW9TZXNzaW9uKHNlc3Npb25JZCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW8gPSBtUmVjb3JkVGhyZWFkcy5rZXlBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlvID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW1hcFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NbWFwVGhyZWFkcy52YWx1ZUF0KGkpLT5oYXNBdWRpb1Nlc3Npb24oc2Vzc2lvbklkKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbyA9IG1NbWFwVGhyZWFkcy5rZXlBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlvID0gZmluZElvSGFuZGxlQnlTZXNzaW9uSWRfbChzZXNzaW9uSWQsIG1NbWFwVGhyZWFkcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBJZiBubyBvdXRwdXQgdGhyZWFkIGNvbnRhaW5zIHRoZSByZXF1ZXN0ZWQgc2Vzc2lvbiBJRCwgZGVmYXVsdCB0bwogICAgICAgICAgICAgLy8gZmlyc3Qgb3V0cHV0LiBUaGUgZWZmZWN0IGNoYWluIHdpbGwgYmUgbW92ZWQgdG8gdGhlIGNvcnJlY3Qgb3V0cHV0CkBAIC0zMTMwLDYgKzMzMTQsMjEgQEAKICAgICAgICAgICAgICAgICBpbyA9IG1QbGF5YmFja1RocmVhZHMua2V5QXQoMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiY3JlYXRlRWZmZWN0KCkgZ290IGlvICVkIGZvciBlZmZlY3QgJXMiLCBpbywgZGVzYy5uYW1lKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaGVja1BsYXliYWNrVGhyZWFkX2woaW8pICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIGFsbG93IG9ubHkgb25lIGVmZmVjdCBjaGFpbiBwZXIgc2Vzc2lvbklkIG9uIG1QbGF5YmFja1RocmVhZHMuCisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBjaGVja0lvID0gbVBsYXliYWNrVGhyZWFkcy5rZXlBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAoaW8gPT0gY2hlY2tJbykgY29udGludWU7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2Vzc2lvblR5cGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5oYXNBdWRpb1Nlc3Npb24oc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBpZiAoKHNlc3Npb25UeXBlICYgVGhyZWFkQmFzZTo6RUZGRUNUX1NFU1NJT04pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBlZmZlY3QgJXMgaW8gJWQgZGVuaWVkIGJlY2F1c2Ugc2Vzc2lvbiAlZCBlZmZlY3QgZXhpc3RzIG9uIGlvICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGVzYy5uYW1lLCAoaW50KWlvLCAoaW50KXNlc3Npb25JZCwgKGludCljaGVja0lvKTsKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMjMyMzc5NzQiKTsKKyAgICAgICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBUaHJlYWRCYXNlICp0aHJlYWQgPSBjaGVja1JlY29yZFRocmVhZF9sKGlvKTsKICAgICAgICAgaWYgKHRocmVhZCA9PSBOVUxMKSB7CkBAIC0zMzc0LDEzNiArMzU3Myw2IEBACiB9CiAKIAotc3RydWN0IEVudHJ5IHsKLSNkZWZpbmUgVEVFX01BWF9GSUxFTkFNRSAzMiAvLyAlWSVtJWQlSCVNJVNfJWQud2F2ID0gNCsyKzIrMisyKzIrMSsxKzQrMSA9IDIxCi0gICAgY2hhciBtRmlsZU5hbWVbVEVFX01BWF9GSUxFTkFNRV07Ci19OwotCi1pbnQgY29tcGFyRW50cnkoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQotewotICAgIHJldHVybiBzdHJjbXAoKChjb25zdCBFbnRyeSAqKSBwMSktPm1GaWxlTmFtZSwgKChjb25zdCBFbnRyeSAqKSBwMiktPm1GaWxlTmFtZSk7Ci19Ci0KLSNpZmRlZiBURUVfU0lOSwotdm9pZCBBdWRpb0ZsaW5nZXI6OmR1bXBUZWUoaW50IGZkLCBjb25zdCBzcDxOQkFJT19Tb3VyY2U+JiBzb3VyY2UsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBjaGFyIHN1ZmZpeCkKLXsKLSAgICBOQkFJT19Tb3VyY2UgKnRlZVNvdXJjZSA9IHNvdXJjZS5nZXQoKTsKLSAgICBpZiAodGVlU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgLy8gLndhdiByb3RhdGlvbgotICAgICAgICAvLyBUaGVyZSBpcyBhIGJlbmlnbiByYWNlIGNvbmRpdGlvbiBpZiAyIHRocmVhZHMgY2FsbCB0aGlzIHNpbXVsdGFuZW91c2x5LgotICAgICAgICAvLyBUaGV5IHdvdWxkIGJvdGggdHJhdmVyc2UgdGhlIGRpcmVjdG9yeSwgYnV0IHRoZSByZXN1bHQgd291bGQgc2ltcGx5IGJlCi0gICAgICAgIC8vIGZhaWx1cmVzIGF0IHVubGluaygpIHdoaWNoIGFyZSBpZ25vcmVkLiAgSXQncyBhbHNvIHVubGlrZWx5IHNpbmNlCi0gICAgICAgIC8vIG5vcm1hbGx5IGR1bXBzeXMgaXMgb25seSBkb25lIGJ5IGJ1Z3JlcG9ydCBvciBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgICAgIGNoYXIgdGVlUGF0aFtQQVRIX01BWF0gPSAiL2RhdGEvbWlzYy9hdWRpb3NlcnZlciI7Ci0gICAgICAgIHNpemVfdCB0ZWVQYXRoTGVuID0gc3RybGVuKHRlZVBhdGgpOwotICAgICAgICBESVIgKmRpciA9IG9wZW5kaXIodGVlUGF0aCk7Ci0gICAgICAgIHRlZVBhdGhbdGVlUGF0aExlbisrXSA9ICcvJzsKLSAgICAgICAgaWYgKGRpciAhPSBOVUxMKSB7Ci0jZGVmaW5lIFRFRV9NQVhfU09SVCAyMCAvLyBudW1iZXIgb2YgZW50cmllcyB0byBzb3J0Ci0jZGVmaW5lIFRFRV9NQVhfS0VFUCAxMCAvLyBudW1iZXIgb2YgZW50cmllcyB0byBrZWVwCi0gICAgICAgICAgICBzdHJ1Y3QgRW50cnkgZW50cmllc1tURUVfTUFYX1NPUlRdOwotICAgICAgICAgICAgc2l6ZV90IGVudHJ5Q291bnQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKGVudHJ5Q291bnQgPCBURUVfTUFYX1NPUlQpIHsKLSAgICAgICAgICAgICAgICBlcnJubyA9IDA7IC8vIGNsZWFyIGVycm5vIGJlZm9yZSByZWFkZGlyKCkgdG8gdHJhY2sgcG90ZW50aWFsIGVycm9ycy4KLSAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZGlyZW50ICpyZXN1bHQgPSByZWFkZGlyKGRpcik7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXX0lGKGVycm5vICE9IDAsICJ0ZWUgcmVhZGRpcigpIGZhaWx1cmUgJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlIG5vbiAud2F2IGZpbGUgZW50cmllcwotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBuYW1lTGVuID0gc3RybGVuKHJlc3VsdC0+ZF9uYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZUxlbiA8PSA0IHx8IG5hbWVMZW4gPj0gVEVFX01BWF9GSUxFTkFNRSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKCZyZXN1bHQtPmRfbmFtZVtuYW1lTGVuIC0gNF0sICIud2F2IikpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICh2b2lkKWF1ZGlvX3V0aWxzX3N0cmxjcHkoZW50cmllc1tlbnRyeUNvdW50KytdLm1GaWxlTmFtZSwgcmVzdWx0LT5kX25hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKHZvaWQpIGNsb3NlZGlyKGRpcik7Ci0gICAgICAgICAgICBpZiAoZW50cnlDb3VudCA+IFRFRV9NQVhfS0VFUCkgewotICAgICAgICAgICAgICAgIHFzb3J0KGVudHJpZXMsIGVudHJ5Q291bnQsIHNpemVvZihFbnRyeSksIGNvbXBhckVudHJ5KTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5Q291bnQgLSBURUVfTUFYX0tFRVA7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBzdHJjcHkoJnRlZVBhdGhbdGVlUGF0aExlbl0sIGVudHJpZXNbaV0ubUZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQpIHVubGluayh0ZWVQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJ1bmFibGUgdG8gcm90YXRlIHRlZXMgaW4gJS4qczogJXNcbiIsIChpbnQpIHRlZVBhdGhMZW4sIHRlZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNoYXIgdGVlVGltZVsxNl07Ci0gICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgICAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKLSAgICAgICAgc3RydWN0IHRtIHRtOwotICAgICAgICBsb2NhbHRpbWVfcigmdHYudHZfc2VjLCAmdG0pOwotICAgICAgICBzdHJmdGltZSh0ZWVUaW1lLCBzaXplb2YodGVlVGltZSksICIlWSVtJWQlSCVNJVMiLCAmdG0pOwotICAgICAgICBzbnByaW50ZigmdGVlUGF0aFt0ZWVQYXRoTGVuXSwgc2l6ZW9mKHRlZVBhdGgpIC0gdGVlUGF0aExlbiwgIiVzXyVkXyVjLndhdiIsIHRlZVRpbWUsIGlkLAotICAgICAgICAgICAgICAgIHN1ZmZpeCk7Ci0gICAgICAgIC8vIGlmIDIgZHVtcHN5cyBhcmUgZG9uZSB3aXRoaW4gMSBzZWNvbmQsIGFuZCByb3RhdGlvbiBkaWRuJ3Qgd29yaywgdGhlbiBkaXNjYXJkIDJuZAotICAgICAgICBpbnQgdGVlRmQgPSBvcGVuKHRlZVBhdGgsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCB8IE9fTk9GT0xMT1csIFNfSVJVU1IgfCBTX0lXVVNSKTsKLSAgICAgICAgaWYgKHRlZUZkID49IDApIHsKLSAgICAgICAgICAgIC8vIEZJWE1FIHVzZSBsaWJzbmRmaWxlCi0gICAgICAgICAgICBjaGFyIHdhdkhlYWRlcls0NF07Ci0gICAgICAgICAgICBtZW1jcHkod2F2SGVhZGVyLAotICAgICAgICAgICAgICAgICJSSUZGXDBcMFwwXDBXQVZFZm10IFwyMFwwXDBcMFwxXDBcMlwwXDEwNFwyNTRcMFwwXDBcMFwwXDBcNFwwXDIwXDBkYXRhXDBcMFwwXDAiLAotICAgICAgICAgICAgICAgIHNpemVvZih3YXZIZWFkZXIpKTsKLSAgICAgICAgICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSB0ZWVTb3VyY2UtPmZvcm1hdCgpOwotICAgICAgICAgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpOwotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IEZvcm1hdF9zYW1wbGVSYXRlKGZvcm1hdCk7Ci0gICAgICAgICAgICBzaXplX3QgZnJhbWVTaXplID0gRm9ybWF0X2ZyYW1lU2l6ZShmb3JtYXQpOwotICAgICAgICAgICAgd2F2SGVhZGVyWzIyXSA9IGNoYW5uZWxDb3VudDsgICAgICAgLy8gbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgICAgICB3YXZIZWFkZXJbMjRdID0gc2FtcGxlUmF0ZTsgICAgICAgICAvLyBzYW1wbGUgcmF0ZQotICAgICAgICAgICAgd2F2SGVhZGVyWzI1XSA9IHNhbXBsZVJhdGUgPj4gODsKLSAgICAgICAgICAgIHdhdkhlYWRlclszMl0gPSBmcmFtZVNpemU7ICAgICAgICAgIC8vIGJsb2NrIGFsaWdubWVudAotICAgICAgICAgICAgd2F2SGVhZGVyWzMzXSA9IGZyYW1lU2l6ZSA+PiA4OwotICAgICAgICAgICAgd3JpdGUodGVlRmQsIHdhdkhlYWRlciwgc2l6ZW9mKHdhdkhlYWRlcikpOwotICAgICAgICAgICAgc2l6ZV90IHRvdGFsID0gMDsKLSAgICAgICAgICAgIGJvb2wgZmlyc3RSZWFkID0gdHJ1ZTsKLSNkZWZpbmUgVEVFX1NJTktfUkVBRCAxMDI0ICAgICAgICAgICAgICAgICAgICAgIC8vIGZyYW1lcyBwZXIgSS9PIG9wZXJhdGlvbgotICAgICAgICAgICAgdm9pZCAqYnVmZmVyID0gbWFsbG9jKFRFRV9TSU5LX1JFQUQgKiBmcmFtZVNpemUpOwotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCA9IFRFRV9TSU5LX1JFQUQ7Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBhY3R1YWwgPSB0ZWVTb3VyY2UtPnJlYWQoYnVmZmVyLCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgYm9vbCB3YXNGaXJzdFJlYWQgPSBmaXJzdFJlYWQ7Ci0gICAgICAgICAgICAgICAgZmlyc3RSZWFkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdHVhbCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWwgPT0gKHNzaXplX3QpIE9WRVJSVU4gJiYgd2FzRmlyc3RSZWFkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYWN0dWFsIDw9IChzc2l6ZV90KWNvdW50KTsKLSAgICAgICAgICAgICAgICB3cml0ZSh0ZWVGZCwgYnVmZmVyLCBhY3R1YWwgKiBmcmFtZVNpemUpOwotICAgICAgICAgICAgICAgIHRvdGFsICs9IGFjdHVhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUoYnVmZmVyKTsKLSAgICAgICAgICAgIGxzZWVrKHRlZUZkLCAob2ZmX3QpIDQsIFNFRUtfU0VUKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXAgPSA0NCArIHRvdGFsICogZnJhbWVTaXplIC0gODsKLSAgICAgICAgICAgIC8vIEZJWE1FIG5vdCBiaWctZW5kaWFuIHNhZmUKLSAgICAgICAgICAgIHdyaXRlKHRlZUZkLCAmdGVtcCwgc2l6ZW9mKHRlbXApKTsKLSAgICAgICAgICAgIGxzZWVrKHRlZUZkLCAob2ZmX3QpIDQwLCBTRUVLX1NFVCk7Ci0gICAgICAgICAgICB0ZW1wID0gIHRvdGFsICogZnJhbWVTaXplOwotICAgICAgICAgICAgLy8gRklYTUUgbm90IGJpZy1lbmRpYW4gc2FmZQotICAgICAgICAgICAgd3JpdGUodGVlRmQsICZ0ZW1wLCBzaXplb2YodGVtcCkpOwotICAgICAgICAgICAgY2xvc2UodGVlRmQpOwotICAgICAgICAgICAgLy8gVE9ETyBTaG91bGQgY3JlYXRlIGZpbGUgd2l0aCB0ZW1wb3JhcnkgbmFtZSBhbmQgdGhlbiByZW5hbWUgdG8gZmluYWwgaWYgbm9uLWVtcHR5LgotICAgICAgICAgICAgaWYgKHRvdGFsID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJ0ZWUgY29waWVkIHRvICVzXG4iLCB0ZWVQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVubGluayh0ZWVQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZHByaW50ZihmZCwgInVuYWJsZSB0byBjcmVhdGUgdGVlICVzOiAlc1xuIiwgdGVlUGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLSNlbmRpZgotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6b25UcmFuc2FjdCgKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAppbmRleCA5NjNhODdkLi5lYzVkZmIxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCkBAIC0yMSwxMyArMjEsMTkgQEAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSA8YXRvbWljPgogI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPGNocm9ubz4KICNpbmNsdWRlIDxkZXF1ZT4KICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bnVtZXJpYz4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW1pdHMuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvb3MvQm5FeHRlcm5hbFZpYnJhdGlvbkNvbnRyb2xsZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CkBAIC02Miw3ICs2OCwxMCBAQAogI2luY2x1ZGUgPG1lZGlhL0xpbmVhck1hcC5oPgogI2luY2x1ZGUgPG1lZGlhL1ZvbHVtZVNoYXBlci5oPgogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9GZFRvU3RyaW5nLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvU2ltcGxlTG9nLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvVGltZXN0YW1wVmVyaWZpZXIuaD4KIAogI2luY2x1ZGUgIkZhc3RDYXB0dXJlLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyLmgiCkBAIC03MSw2ICs4MCw3IEBACiAjaW5jbHVkZSAiQXVkaW9TdHJlYW1PdXQuaCIKICNpbmNsdWRlICJTcGRpZlN0cmVhbU91dC5oIgogI2luY2x1ZGUgIkF1ZGlvSHdEZXZpY2UuaCIKKyNpbmNsdWRlICJOQkFJT19UZWUuaCIKIAogI2luY2x1ZGUgPHBvd2VybWFuYWdlci9JUG93ZXJNYW5hZ2VyLmg+CiAKQEAgLTc4LDYgKzg4LDggQEAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvRWZmZWN0U2hhcmVkLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAKKyNpbmNsdWRlIDx2aWJyYXRvci9FeHRlcm5hbFZpYnJhdGlvbi5oPgorCiAjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9CbkF1ZGlvUmVjb3JkLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTEzMSw2ICsxNDMsMTAgQEAKICAgICB2aXJ0dWFsICAgICBmbG9hdCAgICAgICBtYXN0ZXJWb2x1bWUoKSBjb25zdDsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBtYXN0ZXJNdXRlKCkgY29uc3Q7CiAKKyAgICAvLyBCYWxhbmNlIHZhbHVlIG11c3QgYmUgd2l0aGluIC0xLmYgKGxlZnQgb25seSkgdG8gMS5mIChyaWdodCBvbmx5KSBpbmNsdXNpdmUuCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRNYXN0ZXJCYWxhbmNlKGZsb2F0ICpiYWxhbmNlKSBjb25zdCBvdmVycmlkZTsKKwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0U3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBtdXRlZCk7CkBAIC0yMDIsNiArMjE4LDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwVXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcFR5cGVVdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikgY29uc3Q7CiAKICAgICB2aXJ0dWFsIHNwPElFZmZlY3Q+IGNyZWF0ZUVmZmVjdCgKQEAgLTI3Niw2ICsyOTQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1tYXBTdHJlYW1DYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPE1tYXBTdHJlYW1JbnRlcmZhY2U+JiBpbnRlcmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqaGFuZGxlKTsKKworICAgIHN0YXRpYyBpbnQgb25FeHRlcm5hbFZpYnJhdGlvblN0YXJ0KGNvbnN0IHNwPG9zOjpFeHRlcm5hbFZpYnJhdGlvbj4mIGV4dGVybmFsVmlicmF0aW9uKTsKKyAgICBzdGF0aWMgdm9pZCBvbkV4dGVybmFsVmlicmF0aW9uU3RvcChjb25zdCBzcDxvczo6RXh0ZXJuYWxWaWJyYXRpb24+JiBleHRlcm5hbFZpYnJhdGlvbik7CiBwcml2YXRlOgogICAgIC8vIEZJWE1FIFRoZSA0MDAgaXMgdGVtcG9yYXJpbHkgdG9vIGhpZ2ggdW50aWwgYSBsZWFrIG9mIHdyaXRlcnMgaW4gbWVkaWEubG9nIGlzIGZpeGVkLgogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0xvZ01lbW9yeVNpemUgPSA0MDAgKiAxMDI0OwpAQCAtMzU3LDE2ICszNzgsMTcgQEAKICAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZFBjbVNpbmtDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgewogICAgICAgICBzd2l0Y2ggKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24oY2hhbm5lbE1hc2spKSB7CiAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9QT1NJVElPTjogewotICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gRkNDXzI7IC8vIHN0ZXJlbyBpcyBkZWZhdWx0Ci0gICAgICAgICAgICBpZiAoa0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMpIHsKLSAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIGlmIChjaGFubmVsQ291bnQgPCBGQ0NfMiAvLyBtb25vIGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBjaGFubmVsQ291bnQgPiBBdWRpb01peGVyOjpNQVhfTlVNX0NIQU5ORUxTKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBIYXB0aWMgY2hhbm5lbCBtYXNrIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgY2hhbm5lbCBwb3NpdGlvbiBtYXNrLgorICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKAorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzayAmIH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbWF4Q2hhbm5lbENvdW50ID0ga0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgPyBBdWRpb01peGVyOjpNQVhfTlVNX0NIQU5ORUxTIDogRkNDXzI7CisgICAgICAgICAgICBpZiAoY2hhbm5lbENvdW50IDwgRkNDXzIgLy8gbW9ubyBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZQorICAgICAgICAgICAgICAgICAgICB8fCBjaGFubmVsQ291bnQgPiBtYXhDaGFubmVsQ291bnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGNoYW5uZWxNYXNrIGlzIHRoZSAiY2Fub25pY2FsIiBvbmUgd2UgZXhwZWN0IGZvciB0aGUgY2hhbm5lbENvdW50LgotICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWxNYXNrID09IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpOworICAgICAgICAgICAgcmV0dXJuIGF1ZGlvX2NoYW5uZWxfcG9zaXRpb25fbWFza19pc19vdXRfY2Fub25pY2FsKGNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgIH0KICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX0lOREVYOgogICAgICAgICAgICAgaWYgKGtFbmFibGVFeHRlbmRlZENoYW5uZWxzKSB7CkBAIC00MTYsNiArNDM4LDExIEBACiAgICAgdm9pZCBkdW1wQ2xpZW50cyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogICAgIHZvaWQgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCisgICAgU2ltcGxlTG9nIG1UaHJlYWRMb2d7MTZ9OyAvLyAxNiBUaHJlYWQgaGlzdG9yeSBsaW1pdAorCisgICAgY2xhc3MgVGhyZWFkQmFzZTsKKyAgICB2b2lkIGR1bXBUb1RocmVhZExvZ19sKGNvbnN0IHNwPFRocmVhZEJhc2U+ICZ0aHJlYWQpOworCiAgICAgLy8gLS0tIENsaWVudCAtLS0KICAgICBjbGFzcyBDbGllbnQgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgcHVibGljOgpAQCAtNTAyLDYgKzUyOSw5IEBACiAgICAgY2xhc3MgRWZmZWN0Q2hhaW47CiAKICAgICBzdHJ1Y3QgQXVkaW9TdHJlYW1JbjsKKyAgICBzdHJ1Y3QgVGVlUGF0Y2g7CisgICAgdXNpbmcgVGVlUGF0Y2hlcyA9IHN0ZDo6dmVjdG9yPFRlZVBhdGNoPjsKKwogCiAgICAgc3RydWN0ICBzdHJlYW1fdHlwZV90IHsKICAgICAgICAgc3RyZWFtX3R5cGVfdCgpCkBAIC01MjgsNiArNTU4LDI2IEBACiAKICNpbmNsdWRlICJQYXRjaFBhbmVsLmgiCiAKKyAgICAvLyBGaW5kIGlvIGhhbmRsZSBieSBzZXNzaW9uIGlkLgorICAgIC8vIFByZWZlcmVuY2UgaXMgZ2l2ZW4gdG8gYW4gaW8gaGFuZGxlIHdpdGggYSBtYXRjaGluZyBlZmZlY3QgY2hhaW4gdG8gc2Vzc2lvbiBpZC4KKyAgICAvLyBJZiBub25lIGZvdW5kLCBBVURJT19JT19IQU5ETEVfTk9ORSBpcyByZXR1cm5lZC4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgZmluZElvSGFuZGxlQnlTZXNzaW9uSWRfbCgKKyAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIGNvbnN0IFQmIHRocmVhZHMpIHsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNlc3Npb25UeXBlID0gdGhyZWFkcy52YWx1ZUF0KGkpLT5oYXNBdWRpb1Nlc3Npb24oc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uVHlwZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaW8gPSB0aHJlYWRzLmtleUF0KGkpOworICAgICAgICAgICAgICAgIGlmICgoc2Vzc2lvblR5cGUgJiBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OkVGRkVDVF9TRVNTSU9OKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBlZmZlY3QgY2hhaW4gaGVyZS4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGlvOworICAgIH0KKwogICAgIC8vIHNlcnZlciBzaWRlIG9mIHRoZSBjbGllbnQncyBJQXVkaW9UcmFjawogICAgIGNsYXNzIFRyYWNrSGFuZGxlIDogcHVibGljIGFuZHJvaWQ6OkJuQXVkaW9UcmFjayB7CiAgICAgcHVibGljOgpAQCAtNTQwLDYgKzU5MCw3IEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcGF1c2UoKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpOwogICAgICAgICB2aXJ0dWFsIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIG92ZXJyaWRlOwpAQCAtNTY0LDYgKzYxNSwxMCBAQAogICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgc3RvcCgpOwogICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgZ2V0QWN0aXZlTWljcm9waG9uZXMoCiAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOworICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgc2V0TWljcm9waG9uZURpcmVjdGlvbigKKyAgICAgICAgICAgICAgICBpbnQgLyphdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90Ki8gZGlyZWN0aW9uKTsKKyAgICAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgIHNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKKwogICAgIHByaXZhdGU6CiAgICAgICAgIGNvbnN0IHNwPFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+IG1SZWNvcmRUcmFjazsKIApAQCAtNjA1LDcgKzY2MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgb3V0cHV0RGV2aWNlQWRkcmVzcyk7CiAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IG9wZW5PdXRwdXRfbChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKQEAgLTY3NSw2ICs3MzIsOSBAQAogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICB1cGRhdGVPcnBoYW5FZmZlY3RDaGFpbnMoY29uc3Qgc3A8RWZmZWN0TW9kdWxlPiYgZWZmZWN0KTsKIAogICAgICAgICAgICAgICAgIHZvaWQgYnJvYWNhc3RQYXJhbWV0ZXJzVG9SZWNvcmRUaHJlYWRzX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICAgICAgdm9pZCBmb3J3YXJkUGFyYW1ldGVyc1RvRG93bnN0cmVhbVBhdGNoZXNfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHVwU3RyZWFtLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYpPiB1c2VUaHJlYWQgPSBudWxscHRyKTsKIAogICAgIC8vIEF1ZGlvU3RyZWFtSW4gaXMgaW1tdXRhYmxlLCBzbyB0aGVpciBmaWVsZHMgYXJlIGNvbnN0LgogICAgIC8vIEZvciBlbXBoYXNpcywgd2UgY291bGQgYWxzbyBtYWtlIGFsbCBwb2ludGVycyB0byB0aGVtIGJlICJjb25zdCAqIiwKQEAgLTY5MSw2ICs3NTEsMTEgQEAKICAgICAgICAgICAgIGF1ZGlvSHdEZXYoZGV2KSwgc3RyZWFtKGluKSwgZmxhZ3MoZmxhZ3MpIHt9CiAgICAgfTsKIAorICAgIHN0cnVjdCBUZWVQYXRjaCB7CisgICAgICAgIHNwPFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ+IHBhdGNoUmVjb3JkOworICAgICAgICBzcDxQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjaz4gcGF0Y2hUcmFjazsKKyAgICB9OworCiAgICAgLy8gZm9yIG1BdWRpb1Nlc3Npb25SZWZzIG9ubHkKICAgICBzdHJ1Y3QgQXVkaW9TZXNzaW9uUmVmIHsKICAgICAgICAgQXVkaW9TZXNzaW9uUmVmKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uaWQsIHBpZF90IHBpZCkgOgpAQCAtNzUyLDYgKzgxNyw3IEBACiAgICAgICAgICAgICAgICAgLy8gbWVtYmVyIHZhcmlhYmxlcyBiZWxvdyBhcmUgcHJvdGVjdGVkIGJ5IG1Mb2NrCiAgICAgICAgICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hc3RlclZvbHVtZTsKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyTXV0ZTsKKyAgICAgICAgICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyQmFsYW5jZSA9IDAuZjsKICAgICAgICAgICAgICAgICAvLyBlbmQgb2YgdmFyaWFibGVzIHByb3RlY3RlZCBieSBtTG9jawogCiAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19pb19oYW5kbGVfdCwgc3A8UmVjb3JkVGhyZWFkPiA+ICAgIG1SZWNvcmRUaHJlYWRzOwpAQCAtNzY5LDYgKzgzNSw3IEBACiAgICAgICAgICAgICAgICAgVmVjdG9yPEF1ZGlvU2Vzc2lvblJlZio+IG1BdWRpb1Nlc3Npb25SZWZzOwogCiAgICAgICAgICAgICAgICAgZmxvYXQgICAgICAgbWFzdGVyVm9sdW1lX2woKSBjb25zdDsKKyAgICAgICAgICAgICAgICBmbG9hdCAgICAgICBnZXRNYXN0ZXJCYWxhbmNlX2woKSBjb25zdDsKICAgICAgICAgICAgICAgICBib29sICAgICAgICBtYXN0ZXJNdXRlX2woKSBjb25zdDsKICAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbG9hZEh3TW9kdWxlX2woY29uc3QgY2hhciAqbmFtZSk7CiAKQEAgLTc5MSw0NCArODU4LDE5IEBACiAKICAgICAvLyBmb3IgdXNlIGZyb20gZGVzdHJ1Y3RvcgogICAgIHN0YXR1c190ICAgIGNsb3NlT3V0cHV0X25vbnZpcnR1YWwoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKLSAgICB2b2lkICAgICAgICBjbG9zZU91dHB1dEludGVybmFsX2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiB0aHJlYWQpOworICAgIHZvaWQgICAgICAgIGNsb3NlVGhyZWFkSW50ZXJuYWxfbChjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIHRocmVhZCk7CiAgICAgc3RhdHVzX3QgICAgY2xvc2VJbnB1dF9ub252aXJ0dWFsKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKLSAgICB2b2lkICAgICAgICBjbG9zZUlucHV0SW50ZXJuYWxfbChjb25zdCBzcDxSZWNvcmRUaHJlYWQ+JiB0aHJlYWQpOworICAgIHZvaWQgICAgICAgIGNsb3NlVGhyZWFkSW50ZXJuYWxfbChjb25zdCBzcDxSZWNvcmRUaHJlYWQ+JiB0aHJlYWQpOwogICAgIHZvaWQgICAgICAgIHNldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbl9sKFBsYXliYWNrVGhyZWFkICp0aHJlYWQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOwogCiAgICAgc3RhdHVzX3QgICAgY2hlY2tTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKIAogICAgIHZvaWQgICAgICAgIGZpbHRlclJlc2VydmVkUGFyYW1ldGVycyhTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLCB1aWRfdCBjYWxsaW5nVWlkKTsKLQotI2lmZGVmIFRFRV9TSU5LCi0gICAgLy8gYWxsIHJlY29yZCB0aHJlYWRzIHNlcmlhbGx5IHNoYXJlIGEgY29tbW9uIHRlZSBzaW5rLCB3aGljaCBpcyByZS1jcmVhdGVkIG9uIGZvcm1hdCBjaGFuZ2UKLSAgICBzcDxOQkFJT19TaW5rPiAgIG1SZWNvcmRUZWVTaW5rOwotICAgIHNwPE5CQUlPX1NvdXJjZT4gbVJlY29yZFRlZVNvdXJjZTsKLSNlbmRpZgorICAgIHZvaWQgICAgICAgIGxvZ0ZpbHRlcmVkUGFyYW1ldGVycyhzaXplX3Qgb3JpZ2luYWxLVlBTaXplLCBjb25zdCBTdHJpbmc4JiBvcmlnaW5hbEtWUHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZWplY3RlZEtWUFNpemUsIGNvbnN0IFN0cmluZzgmIHJlamVjdGVkS1ZQcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgY2FsbGluZ1VpZCk7CiAKIHB1YmxpYzoKLQotI2lmZGVmIFRFRV9TSU5LCi0gICAgLy8gdGVlIHNpbmssIGlmIGVuYWJsZWQgYnkgcHJvcGVydHksIGFsbG93cyBkdW1wc3lzIHRvIHdyaXRlIG1vc3QgcmVjZW50IGF1ZGlvIHRvIC53YXYgZmlsZQotICAgIHN0YXRpYyB2b2lkIGR1bXBUZWUoaW50IGZkLCBjb25zdCBzcDxOQkFJT19Tb3VyY2U+JiBzb3VyY2UsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBjaGFyIHN1ZmZpeCk7Ci0KLSAgICAvLyB3aGV0aGVyIHRlZSBzaW5rIGlzIGVuYWJsZWQgYnkgcHJvcGVydHkKLSAgICBzdGF0aWMgYm9vbCBtVGVlU2lua0lucHV0RW5hYmxlZDsKLSAgICBzdGF0aWMgYm9vbCBtVGVlU2lua091dHB1dEVuYWJsZWQ7Ci0gICAgc3RhdGljIGJvb2wgbVRlZVNpbmtUcmFja0VuYWJsZWQ7Ci0KLSAgICAvLyBydW50aW1lIGNvbmZpZ3VyZWQgc2l6ZSBvZiBlYWNoIHRlZSBzaW5rIHBpcGUsIGluIGZyYW1lcwotICAgIHN0YXRpYyBzaXplX3QgbVRlZVNpbmtJbnB1dEZyYW1lczsKLSAgICBzdGF0aWMgc2l6ZV90IG1UZWVTaW5rT3V0cHV0RnJhbWVzOwotICAgIHN0YXRpYyBzaXplX3QgbVRlZVNpbmtUcmFja0ZyYW1lczsKLQotICAgIC8vIGNvbXBpbGUtdGltZSBkZWZhdWx0IHNpemUgb2YgdGVlIHNpbmsgcGlwZXMsIGluIGZyYW1lcwotICAgIC8vIDB4MjAwMDAwIHN0ZXJlbyAxNi1iaXQgUENNIGZyYW1lcyA9IDQ3LjUgc2Vjb25kcyBhdCA0NC4xIGtIeiwgOCBtZWdhYnl0ZXMKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZWVTaW5rSW5wdXRGcmFtZXNEZWZhdWx0ID0gMHgyMDAwMDA7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVGVlU2lua091dHB1dEZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZWVTaW5rVHJhY2tGcmFtZXNEZWZhdWx0ID0gMHgyMDAwMDA7Ci0jZW5kaWYKLQogICAgIC8vIFRoZXNlIG1ldGhvZHMgcmVhZCB2YXJpYWJsZXMgYXRvbWljYWxseSB3aXRob3V0IG1Mb2NrLAogICAgIC8vIHRob3VnaCB0aGUgdmFyaWFibGVzIGFyZSB1cGRhdGVkIHdpdGggbUxvY2suCiAgICAgYm9vbCAgICBpc0xvd1JhbURldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Jc0xvd1JhbURldmljZTsgfQpAQCAtODQzLDEwICs4ODUsMTUgQEAKIAogICAgIG5zZWNzX3QgbUdsb2JhbEVmZmVjdEVuYWJsZVRpbWU7ICAvLyB3aGVuIGEgZ2xvYmFsIGVmZmVjdCB3YXMgbGFzdCBlbmFibGVkCiAKLSAgICBzcDxQYXRjaFBhbmVsPiBtUGF0Y2hQYW5lbDsKKyAgICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKKyAgICBQYXRjaFBhbmVsIG1QYXRjaFBhbmVsOwogICAgIHNwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtRWZmZWN0c0ZhY3RvcnlIYWw7CiAKLSAgICBib29sICAgICAgICBtU3lzdGVtUmVhZHk7CisgICAgYm9vbCAgICAgICBtU3lzdGVtUmVhZHk7CisKKyAgICBTaW1wbGVMb2cgIG1SZWplY3RlZFNldFBhcmFtZXRlckxvZzsKKyAgICBTaW1wbGVMb2cgIG1BcHBTZXRQYXJhbWV0ZXJMb2c7CisgICAgU2ltcGxlTG9nICBtU3lzdGVtU2V0UGFyYW1ldGVyTG9nOwogfTsKIAogI3VuZGVmIElOQ0xVRElOR19GUk9NX0FVRElPRkxJTkdFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuaAppbmRleCBlYjgyNmM2Li5kNDI5OWIwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmgKQEAgLTM1LDYgKzM1LDkgQEAKICAgICBlbnVtIEZsYWdzIHsKICAgICAgICAgQUhXRF9DQU5fU0VUX01BU1RFUl9WT0xVTUUgID0gMHgxLAogICAgICAgICBBSFdEX0NBTl9TRVRfTUFTVEVSX01VVEUgICAgPSAweDIsCisgICAgICAgIC8vIE1lYW5zIHRoYXQgdGhpcyBpc24ndCBhIHRlcm1pbmFsIG1vZHVsZSwgYW5kIHNvZnR3YXJlIHBhdGNoZXMKKyAgICAgICAgLy8gYXJlIHVzZWQgdG8gdHJhbnNwb3J0IGF1ZGlvIGRhdGEgZnVydGhlci4KKyAgICAgICAgQUhXRF9JU19JTlNFUlQgICAgICAgICAgICAgID0gMHg0LAogICAgIH07CiAKICAgICBBdWRpb0h3RGV2aWNlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCkBAIC01NSw2ICs1OCwxMCBAQAogICAgICAgICByZXR1cm4gKDAgIT0gKG1GbGFncyAmIEFIV0RfQ0FOX1NFVF9NQVNURVJfTVVURSkpOwogICAgIH0KIAorICAgIGJvb2wgaXNJbnNlcnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoMCAhPSAobUZsYWdzICYgQUhXRF9JU19JTlNFUlQpKTsKKyAgICB9CisKICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbUhhbmRsZTsgfQogICAgIGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUoKSBjb25zdCB7IHJldHVybiBtTW9kdWxlTmFtZTsgfQogICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gaHdEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtSHdEZXZpY2U7IH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuY3BwCmluZGV4IDFkNGIzZmUuLmE2MGE1ZjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmNwcApAQCAtNjYsOCArNjYsOSBAQAogICAgIC8vIE1haW50YWluIGEgNjQtYml0IHJlbmRlciBwb3NpdGlvbiB1c2luZyB0aGUgMzItYml0IHJlc3VsdCBmcm9tIHRoZSBIQUwuCiAgICAgLy8gVGhpcyBkZWx0YSBjYWxjdWxhdGlvbiByZWxpZXMgb24gdGhlIGFyaXRobWV0aWMgb3ZlcmZsb3cgYmVoYXZpb3IKICAgICAvLyBvZiBpbnRlZ2Vycy4gRm9yIGV4YW1wbGUgKDEwMCAtIDB4RkZGRkZGRjApID0gMTE2LgotICAgIHVpbnQzMl90IHRydW5jYXRlZFBvc2l0aW9uID0gKHVpbnQzMl90KW1SZW5kZXJQb3NpdGlvbjsKLSAgICBpbnQzMl90IGRlbHRhSGFsUG9zaXRpb24gPSAoaW50MzJfdCkoaGFsUG9zaXRpb24gLSB0cnVuY2F0ZWRQb3NpdGlvbik7CisgICAgY29uc3QgdWludDMyX3QgdHJ1bmNhdGVkUG9zaXRpb24gPSAodWludDMyX3QpbVJlbmRlclBvc2l0aW9uOworICAgIGludDMyX3QgZGVsdGFIYWxQb3NpdGlvbjsgLy8gaW5pdGlhbGl6YXRpb24gbm90IG5lZWRlZCwgb3ZlcndpdHRlbiBieSBfX2J1aWx0aW5fc3ViX292ZXJmbG93KCkKKyAgICAodm9pZCkgX19idWlsdGluX3N1Yl9vdmVyZmxvdyhoYWxQb3NpdGlvbiwgdHJ1bmNhdGVkUG9zaXRpb24sICZkZWx0YUhhbFBvc2l0aW9uKTsKICAgICBpZiAoZGVsdGFIYWxQb3NpdGlvbiA+IDApIHsKICAgICAgICAgbVJlbmRlclBvc2l0aW9uICs9IGRlbHRhSGFsUG9zaXRpb247CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCmluZGV4IGIzZjVlZmQuLmVjYWViNTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKQEAgLTMxLDkgKzMxLDkgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMzA5LDggKzMwOSw4IEBACiAgICAgLy8gaW5wdXQgYW5kIG91dHB1dCBlZmZlY3QgYnVmZmVycyB3aXRob3V0IGFuIGludGVybWVkaWFyeSBlZmZlY3QgcHJvY2Vzcy4KICAgICAvLyBUT0RPOiBjb25zaWRlciBpbXBsZW1lbnRpbmcgY2hhbm5lbCBjb252ZXJzaW9uLgogICAgIGNvbnN0IHNpemVfdCBzYWZlSW5wdXRPdXRwdXRTYW1wbGVDb3VudCA9Ci0gICAgICAgICAgICBpbkNoYW5uZWxDb3VudCAhPSBvdXRDaGFubmVsQ291bnQgPyAwCi0gICAgICAgICAgICAgICAgICAgIDogb3V0Q2hhbm5lbENvdW50ICogc3RkOjptaW4oCisgICAgICAgICAgICBtSW5DaGFubmVsQ291bnRSZXF1ZXN0ZWQgIT0gbU91dENoYW5uZWxDb3VudFJlcXVlc3RlZCA/IDAKKyAgICAgICAgICAgICAgICAgICAgOiBtT3V0Q2hhbm5lbENvdW50UmVxdWVzdGVkICogc3RkOjptaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIuZnJhbWVDb3VudCk7CiAgICAgY29uc3QgYXV0byBhY2N1bXVsYXRlSW5wdXRUb091dHB1dCA9IFt0aGlzLCBzYWZlSW5wdXRPdXRwdXRTYW1wbGVDb3VudF0oKSB7CkBAIC00ODAsNyArNDgwLDEyIEBACiAgICAgICAgIC8vIGFjY3VtdWxhdGUgaW5wdXQgb250byBvdXRwdXQKICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gbUNoYWluLnByb21vdGUoKTsKICAgICAgICAgaWYgKGNoYWluLmdldCgpICE9IG51bGxwdHIgJiYgY2hhaW4tPmFjdGl2ZVRyYWNrQ250KCkgIT0gMCkgewotICAgICAgICAgICAgYWNjdW11bGF0ZUlucHV0VG9PdXRwdXQoKTsKKyAgICAgICAgICAgIC8vIHNpbWlsYXIgaGFuZGxpbmcgd2l0aCBkYXRhX2J5cGFzcyBhYm92ZS4KKyAgICAgICAgICAgIGlmIChtQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKKyAgICAgICAgICAgICAgICBhY2N1bXVsYXRlSW5wdXRUb091dHB1dCgpOworICAgICAgICAgICAgfSBlbHNlIHsgLy8gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUKKyAgICAgICAgICAgICAgICBjb3B5SW5wdXRUb091dHB1dCgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTEzMSw3ICsxMTM2LDggQEAKICAgICAvLyBpZiBjb250cm9sbGVyIGZsYWcgaXMgc2V0IChOb3RlIHRoYXQgY29udHJvbGxlciA9PSBUUlVFID0+IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMIHNldCkKICAgICBpZiAoaXNQcm9jZXNzRW5hYmxlZCgpICYmCiAgICAgICAgICAgICAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVk9MVU1FX01BU0spID09IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMIHx8Ci0gICAgICAgICAgICAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVk9MVU1FX0lORCkpIHsKKyAgICAgICAgICAgICAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVk9MVU1FX0lORCB8fAorICAgICAgICAgICAgIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19WT0xVTUVfTU9OSVRPUikpIHsKICAgICAgICAgdWludDMyX3Qgdm9sdW1lWzJdOwogICAgICAgICB1aW50MzJfdCAqcFZvbHVtZSA9IE5VTEw7CiAgICAgICAgIHVpbnQzMl90IHNpemUgPSBzaXplb2Yodm9sdW1lKTsKQEAgLTEzMjYsNiArMTMzMiw3IEBACiAgICAgY2FzZSBFRkZFQ1RfRkxBR19WT0xVTUVfTk9ORTogcy5hcHBlbmQoIm5vbmUiKTsgYnJlYWs7CiAgICAgY2FzZSBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTDogcy5hcHBlbmQoImltcGxlbWVudHMgY29udHJvbCIpOyBicmVhazsKICAgICBjYXNlIEVGRkVDVF9GTEFHX1ZPTFVNRV9JTkQ6IHMuYXBwZW5kKCJyZXF1aXJlcyBpbmRpY2F0aW9uIik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVk9MVU1FX01PTklUT1I6IHMuYXBwZW5kKCJtb25pdG9ycyB2b2x1bWUiKTsgYnJlYWs7CiAgICAgZGVmYXVsdDogcy5hcHBlbmQoInVua25vd24vcmVzZXJ2ZWQiKTsgYnJlYWs7CiAgICAgfQogICAgIHMuYXBwZW5kKCIsICIpOwpAQCAtMTQ5Myw2ICsxNTAwLDExIEBACiAKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQubGVuZ3RoKCkpOwogCisgICAgaWYgKG1FZmZlY3RJbnRlcmZhY2UgIT0gMCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiXHRFZmZlY3QgSUQgJWQgSEFMIGR1bXA6XG4iLCBtSWQpOworICAgICAgICAodm9pZCltRWZmZWN0SW50ZXJmYWNlLT5kdW1wKGZkKTsKKyAgICB9CisKICAgICBpZiAobG9ja2VkKSB7CiAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgIH0KQEAgLTE4NTksNyArMTg3MSw3IEBACiAgICAgYm9vbCBsb2NrZWQgPSBtQ2JsayAhPSBOVUxMICYmIEF1ZGlvRmxpbmdlcjo6ZHVtcFRyeUxvY2sobUNibGstPmxvY2spOwogCiAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiXHRcdFx0JTVkICAgICU1ZCAgJTNzICAgICUzcyAgJTV1ICAlNXVcbiIsCi0gICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZF9jYWNoZWQgOiBtQ2xpZW50LT5waWQoKSwKKyAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkKCkgOiBtQ2xpZW50LT5waWQoKSwKICAgICAgICAgICAgIG1Qcmlvcml0eSwKICAgICAgICAgICAgIG1IYXNDb250cm9sID8gInllcyIgOiAibm8iLAogICAgICAgICAgICAgbG9ja2VkID8gInllcyIgOiAibm8iLApAQCAtMjI3Miw3ICsyMjg0LDcgQEAKICAgICB9CiAgICAgLy8gdGhlbiBpbmRpY2F0ZSB2b2x1bWUgdG8gYWxsIG90aGVyIGVmZmVjdHMgaW4gY2hhaW4uCiAgICAgLy8gUGFzcyBhbHRlcmVkIHZvbHVtZSB0byBlZmZlY3RzIGJlZm9yZSB2b2x1bWUgY29udHJvbGxlcgotICAgIC8vIGFuZCByZXF1ZXN0ZWQgdm9sdW1lIHRvIGVmZmVjdHMgYWZ0ZXIgY29udHJvbGxlcgorICAgIC8vIGFuZCByZXF1ZXN0ZWQgdm9sdW1lIHRvIGVmZmVjdHMgYWZ0ZXIgY29udHJvbGxlciBvciB3aXRoIHZvbHVtZSBtb25pdG9yIGZsYWcKICAgICB1aW50MzJfdCBsVm9sID0gbmV3TGVmdDsKICAgICB1aW50MzJfdCByVm9sID0gbmV3UmlnaHQ7CiAKQEAgLTIyODUsNyArMjI5NywxMiBAQAogICAgICAgICAgICAgbFZvbCA9ICpsZWZ0OwogICAgICAgICAgICAgclZvbCA9ICpyaWdodDsKICAgICAgICAgfQotICAgICAgICBtRWZmZWN0c1tpXS0+c2V0Vm9sdW1lKCZsVm9sLCAmclZvbCwgZmFsc2UpOworICAgICAgICAvLyBQYXNzIHJlcXVlc3RlZCB2b2x1bWUgZGlyZWN0bHkgaWYgdGhpcyBpcyB2b2x1bWUgbW9uaXRvciBtb2R1bGUKKyAgICAgICAgaWYgKG1FZmZlY3RzW2ldLT5pc1ZvbHVtZU1vbml0b3IoKSkgeworICAgICAgICAgICAgbUVmZmVjdHNbaV0tPnNldFZvbHVtZShsZWZ0LCByaWdodCwgZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUVmZmVjdHNbaV0tPnNldFZvbHVtZSgmbFZvbCwgJnJWb2wsIGZhbHNlKTsKKyAgICAgICAgfQogICAgIH0KICAgICAqbGVmdCA9IG5ld0xlZnQ7CiAgICAgKnJpZ2h0ID0gbmV3UmlnaHQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaAppbmRleCAxNWEyNmVhLi41OGNlMzUxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKQEAgLTEzNCw2ICsxMzQsOSBAQAogICAgIGJvb2wgICAgICAgICAgICAgaXNWb2x1bWVDb250cm9sKCkgY29uc3QKICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMOyB9CisgICAgYm9vbCAgICAgICAgICAgICBpc1ZvbHVtZU1vbml0b3IoKSBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVk9MVU1FX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gRUZGRUNUX0ZMQUdfVk9MVU1FX01PTklUT1I7IH0KICAgICBzdGF0dXNfdCAgICAgICAgIHNldE9mZmxvYWRlZChib29sIG9mZmxvYWRlZCwgYXVkaW9faW9faGFuZGxlX3QgaW8pOwogICAgIGJvb2wgICAgICAgICAgICAgaXNPZmZsb2FkZWQoKSBjb25zdDsKICAgICB2b2lkICAgICAgICAgICAgIGFkZEVmZmVjdFRvSGFsX2woKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwCmluZGV4IGQwNjM3NzIuLmRkODRiZjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcApAQCAtMjAsNiArMjAsNyBAQAogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQVVESU8KIAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KICNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgpAQCAtMTYxLDcgKzE2MiwyMSBAQAogICAgIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKikgbUN1cnJlbnQ7CiAgICAgRmFzdENhcHR1cmVEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdENhcHR1cmVEdW1wU3RhdGUgKikgbUR1bXBTdGF0ZTsKICAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlOjpDb21tYW5kIGNvbW1hbmQgPSBtQ29tbWFuZDsKLSAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OworICAgIHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlciogZmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXIgPSBjdXJyZW50LT5tRmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXI7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIHBhdGNoQnVmZmVyOworCisgICAgaWYgKGZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyICE9IDApIHsKKyAgICAgICAgcGF0Y2hCdWZmZXIuZnJhbWVDb3VudCA9IH4wOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmcGF0Y2hCdWZmZXIpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBmcmFtZUNvdW50ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChwYXRjaEJ1ZmZlci5mcmFtZUNvdW50IDwgZnJhbWVDb3VudCkgeworICAgICAgICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgaXQgZG9lc24ndCBjYXVzZSBhbnkgaXNzdWVzIGlmIHdlIGp1c3QgZ2V0IGEgc21hbGwgYXZhaWxhYmxlCisgICAgICAgICAgICAvLyBidWZmZXIgZnJvbSB0aGUgYnVmZmVyIHByb3ZpZGVyLgorICAgICAgICAgICAgZnJhbWVDb3VudCA9IHBhdGNoQnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBpZiAoKGNvbW1hbmQgJiBGYXN0Q2FwdHVyZVN0YXRlOjpSRUFEKSAvKiYmIGlzV2FybSovKSB7CiAgICAgICAgIEFMT0dfQVNTRVJUKG1JbnB1dFNvdXJjZSAhPSBOVUxMKTsKQEAgLTE3Niw2ICsxOTEsNyBAQAogICAgICAgICAgICAgbVRvdGFsTmF0aXZlRnJhbWVzUmVhZCArPSBmcmFtZXNSZWFkOwogICAgICAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVzUmVhZCA9IG1Ub3RhbE5hdGl2ZUZyYW1lc1JlYWQ7CiAgICAgICAgICAgICBtUmVhZEJ1ZmZlclN0YXRlID0gZnJhbWVzUmVhZDsKKyAgICAgICAgICAgIHBhdGNoQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZXNSZWFkOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZHVtcFN0YXRlLT5tUmVhZEVycm9ycysrOwogICAgICAgICAgICAgbVJlYWRCdWZmZXJTdGF0ZSA9IDA7CkBAIC0xOTMsMTEgKzIwOSwxOCBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChtUmVhZEJ1ZmZlclN0YXRlID4gMCkgewogICAgICAgICAgICAgc3NpemVfdCBmcmFtZXNXcml0dGVuID0gbVBpcGVTaW5rLT53cml0ZShtUmVhZEJ1ZmZlciwgbVJlYWRCdWZmZXJTdGF0ZSk7Ci0gICAgICAgICAgICAvLyBGSVhNRSBUaGlzIHN1cHBvcnRzIGF0IG1vc3Qgb25lIGZhc3QgY2FwdHVyZSBjbGllbnQuCi0gICAgICAgICAgICAvLyAgICAgICBUbyBoYW5kbGUgbXVsdGlwbGUgY2xpZW50cyB0aGlzIGNvdWxkIGJlIGNvbnZlcnRlZCB0byBhbiBhcnJheSwKLSAgICAgICAgICAgIC8vICAgICAgIG9yIHdpdGggYSBsb3QgbW9yZSB3b3JrIHRoZSBjb250cm9sIGJsb2NrIGNvdWxkIGJlIHNoYXJlZCBieSBhbGwgY2xpZW50cy4KICAgICAgICAgICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IGN1cnJlbnQtPm1DYmxrOwotICAgICAgICAgICAgaWYgKGNibGsgIT0gTlVMTCAmJiBmcmFtZXNXcml0dGVuID4gMCkgeworICAgICAgICAgICAgaWYgKGZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGluZGljYXRlcyB0aGUgZmFzdCB0cmFjayBpcyBhIHBhdGNoIHJlY29yZCwgdXBkYXRlIHRoZSBjYmxrIGJ5CisgICAgICAgICAgICAgICAgLy8gY2FsbGluZyByZWxlYXNlQnVmZmVyKCkuCisgICAgICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChwYXRjaEJ1ZmZlci5yYXcsIGN1cnJlbnQtPm1GYXN0UGF0Y2hSZWNvcmRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBtUmVhZEJ1ZmZlciwgbUZvcm1hdC5tRm9ybWF0LCBmcmFtZXNXcml0dGVuICogbUZvcm1hdC5tQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICBwYXRjaEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzV3JpdHRlbjsKKyAgICAgICAgICAgICAgICBmYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmcGF0Y2hCdWZmZXIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjYmxrICE9IE5VTEwgJiYgZnJhbWVzV3JpdHRlbiA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSBUaGlzIHN1cHBvcnRzIGF0IG1vc3Qgb25lIGZhc3QgY2FwdHVyZSBjbGllbnQuCisgICAgICAgICAgICAgICAgLy8gICAgICAgVG8gaGFuZGxlIG11bHRpcGxlIGNsaWVudHMgdGhpcyBjb3VsZCBiZSBjb252ZXJ0ZWQgdG8gYW4gYXJyYXksCisgICAgICAgICAgICAgICAgLy8gICAgICAgb3Igd2l0aCBhIGxvdCBtb3JlIHdvcmsgdGhlIGNvbnRyb2wgYmxvY2sgY291bGQgYmUgc2hhcmVkIGJ5IGFsbCBjbGllbnRzLgogICAgICAgICAgICAgICAgIGludDMyX3QgcmVhciA9IGNibGstPnUubVN0cmVhbWluZy5tUmVhcjsKICAgICAgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlKGZyYW1lc1dyaXR0ZW4gKyByZWFyLCAmY2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyKTsKICAgICAgICAgICAgICAgICBjYmxrLT5tU2VydmVyICs9IGZyYW1lc1dyaXR0ZW47CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuaAppbmRleCA5YmNhMmQ0Li5kMjg3MjMyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX0NBUFRVUkVfU1RBVEVfSAogCiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSAiRmFzdFRocmVhZFN0YXRlLmgiCiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAKQEAgLTM3LDYgKzM4LDEwIEBACiAgICAgc2l6ZV90ICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBwZXIgZmFzdCBjYXB0dXJlIGJ1ZmZlcgogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogbUNibGs7ICAgICAgICAgIC8vIGNvbnRyb2wgYmxvY2sgZm9yIHRoZSBzaW5nbGUgZmFzdCBjbGllbnQsIG9yIE5VTEwKIAorICAgIGF1ZGlvX2Zvcm1hdF90ICBtRmFzdFBhdGNoUmVjb3JkRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlciogbUZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyID0gbnVsbHB0cjsgICAvLyBhIHJlZmVyZW5jZSB0byBhIHBhdGNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmQgaW4gZmFzdCBtb2RlCisKICAgICAvLyBFeHRlbmRzIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZAogICAgIHN0YXRpYyBjb25zdCBDb21tYW5kCiAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYWxzbyBwcm9jZXNzIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgYW5kIGNhbiBiZSAib3IiZWQ6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCmluZGV4IDc5YmI5ZmUuLmM1Yjk5NTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCkBAIC0zMiwxMyArMzIsMTQgQEAKICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKLSNpbmNsdWRlIDxjcHVzdGF0cy9DZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvU3RhdGlzdGljcy5oPgogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwogI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CiAjZW5kaWYKICNlbmRpZgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL21vbm9fYmxlbmQuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL21vbm9fYmxlbmQuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb01peGVyLmg+CiAjaW5jbHVkZSAiRmFzdE1peGVyLmgiCiAjaW5jbHVkZSAiVHlwZWRMb2dnZXIuaCIKQEAgLTQ3LDcgKzQ4LDggQEAKIAogLypzdGF0aWMqLyBjb25zdCBGYXN0TWl4ZXJTdGF0ZSBGYXN0TWl4ZXI6OnNJbml0aWFsOwogCi1GYXN0TWl4ZXI6OkZhc3RNaXhlcigpIDogRmFzdFRocmVhZCgiY3ljbGVfbXMiLCAibG9hZF91cyIpLAorRmFzdE1peGVyOjpGYXN0TWl4ZXIoYXVkaW9faW9faGFuZGxlX3QgcGFyZW50SW9IYW5kbGUpCisgICAgOiBGYXN0VGhyZWFkKCJjeWNsZV9tcyIsICJsb2FkX3VzIiksCiAgICAgLy8gbUZhc3RUcmFja05hbWVzCiAgICAgLy8gbUdlbmVyYXRpb25zCiAgICAgbU91dHB1dFNpbmsoTlVMTCksCkBAIC01OCw3ICs2MCw2IEBACiAgICAgbVNpbmtDaGFubmVsQ291bnQoRkNDXzIpLAogICAgIG1NaXhlckJ1ZmZlcihOVUxMKSwKICAgICBtTWl4ZXJCdWZmZXJTaXplKDApLAotICAgIG1NaXhlckJ1ZmZlckZvcm1hdChBVURJT19GT1JNQVRfUENNXzE2X0JJVCksCiAgICAgbU1peGVyQnVmZmVyU3RhdGUoVU5ERUZJTkVEKSwKICAgICBtRm9ybWF0KEZvcm1hdF9JbnZhbGlkKSwKICAgICBtU2FtcGxlUmF0ZSgwKSwKQEAgLTY2LDggKzY3LDExIEBACiAgICAgbVRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbigwKSwKICAgICAvLyB0aW1lc3RhbXAKICAgICBtTmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCgwKSwgICAvLyB0aGUgPSAwIGlzIHRvIHNpbGVuY2UgdGhlIGNvbXBpbGVyCi0gICAgbU1hc3Rlck1vbm8oZmFsc2UpCisgICAgbU1hc3Rlck1vbm8oZmFsc2UpLAorICAgIG1UaHJlYWRJb0hhbmRsZShwYXJlbnRJb0hhbmRsZSkKIHsKKyAgICAodm9pZCltVGhyZWFkSW9IYW5kbGU7IC8vIHByZXZlbnQgdW51c2VkIHdhcm5pbmcsIHNlZSBDKysxNyBbW21heWJlX3VudXNlZF1dCisKICAgICAvLyBGSVhNRSBwYXNzIHNJbml0aWFsIGFzIHBhcmFtZXRlciB0byBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yLCBhbmQgbWFrZSBpdCBzdGF0aWMgbG9jYWwKICAgICBtUHJldmlvdXMgPSAmc0luaXRpYWw7CiAgICAgbUN1cnJlbnQgPSAmc0luaXRpYWw7CkBAIC0xMzUsNiArMTM5LDc1IEBACiAgICAgfQogfQogCit2b2lkIEZhc3RNaXhlcjo6dXBkYXRlTWl4ZXJUcmFjayhpbnQgaW5kZXgsIFJlYXNvbiByZWFzb24pIHsKKyAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgbUN1cnJlbnQ7CisgICAgY29uc3QgRmFzdFRyYWNrICogY29uc3QgZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2luZGV4XTsKKworICAgIC8vIGNoZWNrIGFuZCB1cGRhdGUgZ2VuZXJhdGlvbgorICAgIGlmIChyZWFzb24gPT0gUkVBU09OX01PRElGWSAmJiBtR2VuZXJhdGlvbnNbaW5kZXhdID09IGZhc3RUcmFjay0+bUdlbmVyYXRpb24pIHsKKyAgICAgICAgcmV0dXJuOyAvLyBubyBjaGFuZ2Ugb24gYW4gYWxyZWFkeSBjb25maWd1cmVkIHRyYWNrLgorICAgIH0KKyAgICBtR2VuZXJhdGlvbnNbaW5kZXhdID0gZmFzdFRyYWNrLT5tR2VuZXJhdGlvbjsKKworICAgIC8vIG1NaXhlciA9PSBudWxscHRyIG9uIGNvbmZpZ3VyYXRpb24gZmFpbHVyZSAoY2hlY2sgZG9uZSBhZnRlciBnZW5lcmF0aW9uIHVwZGF0ZSkuCisgICAgaWYgKG1NaXhlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHJlYXNvbikgeworICAgIGNhc2UgUkVBU09OX1JFTU9WRToKKyAgICAgICAgbU1peGVyLT5kZXN0cm95KGluZGV4KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSRUFTT05fQUREOiB7CisgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IG1NaXhlci0+Y3JlYXRlKAorICAgICAgICAgICAgICAgIGluZGV4LCBmYXN0VHJhY2stPm1DaGFubmVsTWFzaywgZmFzdFRyYWNrLT5tRm9ybWF0LCBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IGNhbm5vdCBjcmVhdGUgZmFzdCB0cmFjayBpbmRleCIKKyAgICAgICAgICAgICAgICAiICVkLCBtYXNrICUjeCwgZm9ybWF0ICUjeCBpbiBBdWRpb01peGVyIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaW5kZXgsIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrLCBmYXN0VHJhY2stPm1Gb3JtYXQpOworICAgIH0KKyAgICAgICAgW1tmYWxsdGhyb3VnaF1dOyAgLy8gbm93IGZhbGx0aHJvdWdoIHRvIHVwZGF0ZSB0aGUgbmV3bHkgY3JlYXRlZCB0cmFjay4KKyAgICBjYXNlIFJFQVNPTl9NT0RJRlk6CisgICAgICAgIG1NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIoaW5kZXgsIGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyKTsKKworICAgICAgICBmbG9hdCB2bGYsIHZyZjsKKyAgICAgICAgaWYgKGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnN0IGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IHZsciA9IGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyLT5nZXRWb2x1bWVMUigpOworICAgICAgICAgICAgdmxmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19sZWZ0KHZscikpOworICAgICAgICAgICAgdnJmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZsZiA9IHZyZiA9IEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBzZXQgdm9sdW1lIHRvIGF2b2lkIHJhbXAgd2hlbmV2ZXIgdGhlIHRyYWNrIGlzIHVwZGF0ZWQgKG9yIGNyZWF0ZWQpLgorICAgICAgICAvLyBOb3RlOiB0aGlzIGRvZXMgbm90IGRpc3Rpbmd1aXNoIGZyb20gc3RhcnRpbmcgZnJlc2ggb3IKKyAgICAgICAgLy8gcmVzdW1pbmcgZnJvbSBhIHBhdXNlZCBzdGF0ZS4KKyAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoaW5kZXgsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7CisgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKGluZGV4LCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOworCisgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKGluZGV4LCBBdWRpb01peGVyOjpSRVNBTVBMRSwgQXVkaW9NaXhlcjo6UkVNT1ZFLCBudWxscHRyKTsKKyAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoaW5kZXgsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAodm9pZCAqKW1NaXhlckJ1ZmZlcik7CisgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKGluZGV4LCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULAorICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCltTWl4ZXJCdWZmZXJGb3JtYXQpOworICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihpbmRleCwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkZPUk1BVCwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tRm9ybWF0KTsKKyAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoaW5kZXgsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUNoYW5uZWxNYXNrKTsKKyAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoaW5kZXgsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KW1TaW5rQ2hhbm5lbE1hc2spOworICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihpbmRleCwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkhBUFRJQ19FTkFCTEVELAorICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQpOworICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihpbmRleCwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkhBUFRJQ19JTlRFTlNJVFksCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUhhcHRpY0ludGVuc2l0eSk7CisKKyAgICAgICAgbU1peGVyLT5lbmFibGUoaW5kZXgpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlczogaW52YWxpZCB1cGRhdGUgcmVhc29uICVkIiwgX19mdW5jX18sIHJlYXNvbik7CisgICAgfQorfQorCiB2b2lkIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSgpCiB7CiAgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIG1DdXJyZW50OwpAQCAtMTU1LDIwICsyMjgsMjUgQEAKICAgICBpZiAoY3VycmVudC0+bU91dHB1dFNpbmtHZW4gIT0gbU91dHB1dFNpbmtHZW4pIHsKICAgICAgICAgbU91dHB1dFNpbmsgPSBjdXJyZW50LT5tT3V0cHV0U2luazsKICAgICAgICAgbU91dHB1dFNpbmtHZW4gPSBjdXJyZW50LT5tT3V0cHV0U2lua0dlbjsKKyAgICAgICAgbVNpbmtDaGFubmVsTWFzayA9IGN1cnJlbnQtPm1TaW5rQ2hhbm5lbE1hc2s7CisgICAgICAgIG1CYWxhbmNlLnNldENoYW5uZWxNYXNrKG1TaW5rQ2hhbm5lbE1hc2spOwogICAgICAgICBpZiAobU91dHB1dFNpbmsgPT0gTlVMTCkgewogICAgICAgICAgICAgbUZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkOwogICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSAwOwogICAgICAgICAgICAgbVNpbmtDaGFubmVsQ291bnQgPSAwOwogICAgICAgICAgICAgbVNpbmtDaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICAgICAgICAgIG1BdWRpb0NoYW5uZWxDb3VudCA9IDA7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtRm9ybWF0ID0gbU91dHB1dFNpbmstPmZvcm1hdCgpOwogICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBGb3JtYXRfc2FtcGxlUmF0ZShtRm9ybWF0KTsKICAgICAgICAgICAgIG1TaW5rQ2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChtRm9ybWF0KTsKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVNpbmtDaGFubmVsQ291bnQgPiBBdWRpb01peGVyOjpNQVhfTlVNX0NIQU5ORUxTKTsKIAotICAgICAgICAgICAgLy8gVE9ETzogQWRkIGNoYW5uZWwgbWFzayB0byBOQkFJT19Gb3JtYXQKLSAgICAgICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBjaGFubmVsIG1hc2sgbXVzdCBiZSBhIHZhbGlkIHBvc2l0aW9uYWwgY2hhbm5lbCBtYXNrLgotICAgICAgICAgICAgbVNpbmtDaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChtU2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBpZiAobVNpbmtDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX05PTkUpIHsKKyAgICAgICAgICAgICAgICBtU2lua0NoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KG1TaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1BdWRpb0NoYW5uZWxDb3VudCA9IG1TaW5rQ2hhbm5lbENvdW50IC0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKAorICAgICAgICAgICAgICAgICAgICBtU2lua0NoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKICAgICAgICAgfQogICAgICAgICBkdW1wU3RhdGUtPm1TYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgfQpAQCAtMTgyLDE1ICsyNjAsMTUgQEAKICAgICAgICAgZnJlZShtU2lua0J1ZmZlcik7CiAgICAgICAgIG1TaW5rQnVmZmVyID0gTlVMTDsKICAgICAgICAgaWYgKGZyYW1lQ291bnQgPiAwICYmIG1TYW1wbGVSYXRlID4gMCkgewotICAgICAgICAgICAgLy8gVGhlIG1peGVyIHByb2R1Y2VzIGVpdGhlciAxNiBiaXQgUENNIG9yIGZsb2F0IG91dHB1dCwgc2VsZWN0Ci0gICAgICAgICAgICAvLyBmbG9hdCBvdXRwdXQgaWYgdGhlIEhBTCBzdXBwb3J0cyBoaWdoZXIgdGhhbiAxNiBiaXQgcHJlY2lzaW9uLgotICAgICAgICAgICAgbU1peGVyQnVmZmVyRm9ybWF0ID0gbUZvcm1hdC5tRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUID8KLSAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgOiBBVURJT19GT1JNQVRfUENNX0ZMT0FUOwogICAgICAgICAgICAgLy8gRklYTUUgbmV3IG1heSBibG9jayBmb3IgdW5ib3VuZGVkIHRpbWUgYXQgaW50ZXJuYWwgbXV0ZXggb2YgdGhlIGhlYXAKICAgICAgICAgICAgIC8vICAgICAgIGltcGxlbWVudGF0aW9uOyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSBub3JtYWwgbWl4ZXIgYWxsb2NhdGUgZm9yIHVzCiAgICAgICAgICAgICAvLyAgICAgICB0byBhdm9pZCBibG9ja2luZyBoZXJlIGFuZCB0byBwcmV2ZW50IHBvc3NpYmxlIHByaW9yaXR5IGludmVyc2lvbgogICAgICAgICAgICAgbU1peGVyID0gbmV3IEF1ZGlvTWl4ZXIoZnJhbWVDb3VudCwgbVNhbXBsZVJhdGUpOwogICAgICAgICAgICAgLy8gRklYTUUgU2VlIHRoZSBvdGhlciBGSVhNRSBhdCBGYXN0TWl4ZXI6OnNldE5CTG9nV3JpdGVyKCkKKyAgICAgICAgICAgIE5CTG9nOjp0aHJlYWRfcGFyYW1zX3QgcGFyYW1zOworICAgICAgICAgICAgcGFyYW1zLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgICAgICAgICAgcGFyYW1zLnNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIExPR19USFJFQURfUEFSQU1TKHBhcmFtcyk7CiAgICAgICAgICAgICBjb25zdCBzaXplX3QgbWl4ZXJGcmFtZVNpemUgPSBtU2lua0NoYW5uZWxDb3VudAogICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobU1peGVyQnVmZmVyRm9ybWF0KTsKICAgICAgICAgICAgIG1NaXhlckJ1ZmZlclNpemUgPSBtaXhlckZyYW1lU2l6ZSAqIGZyYW1lQ291bnQ7CkBAIC0yMjAsNiArMjk4LDEwIEBACiAgICAgICAgIHByZXZpb3VzVHJhY2tNYXNrID0gMDsKICAgICAgICAgbUZhc3RUcmFja3NHZW4gPSBjdXJyZW50LT5tRmFzdFRyYWNrc0dlbiAtIDE7CiAgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworI2lmZGVmIFRFRV9TSU5LCisgICAgICAgIG1UZWUuc2V0KG1Gb3JtYXQsIE5CQUlPX1RlZTo6VEVFX0ZMQUdfT1VUUFVUX1RIUkVBRCk7CisgICAgICAgIG1UZWUuc2V0SWQoc3RkOjpzdHJpbmcoIl8iKSArIHN0ZDo6dG9fc3RyaW5nKG1UaHJlYWRJb0hhbmRsZSkgKyAiX0YiKTsKKyNlbmRpZgogICAgIH0gZWxzZSB7CiAgICAgICAgIHByZXZpb3VzVHJhY2tNYXNrID0gcHJldmlvdXMtPm1UcmFja01hc2s7CiAgICAgfQpAQCAtMjI3LDIxICszMDksMTYgQEAKICAgICAvLyBjaGVjayBmb3IgY2hhbmdlIGluIGFjdGl2ZSB0cmFjayBzZXQKICAgICBjb25zdCB1bnNpZ25lZCBjdXJyZW50VHJhY2tNYXNrID0gY3VycmVudC0+bVRyYWNrTWFzazsKICAgICBkdW1wU3RhdGUtPm1UcmFja01hc2sgPSBjdXJyZW50VHJhY2tNYXNrOworICAgIGR1bXBTdGF0ZS0+bU51bVRyYWNrcyA9IHBvcGNvdW50KGN1cnJlbnRUcmFja01hc2spOwogICAgIGlmIChjdXJyZW50LT5tRmFzdFRyYWNrc0dlbiAhPSBtRmFzdFRyYWNrc0dlbikgewotICAgICAgICBBTE9HX0FTU0VSVChtTWl4ZXJCdWZmZXIgIT0gTlVMTCk7CiAKICAgICAgICAgLy8gcHJvY2VzcyByZW1vdmVkIHRyYWNrcyBmaXJzdCB0byBhdm9pZCBydW5uaW5nIG91dCBvZiB0cmFjayBuYW1lcwogICAgICAgICB1bnNpZ25lZCByZW1vdmVkVHJhY2tzID0gcHJldmlvdXNUcmFja01hc2sgJiB+Y3VycmVudFRyYWNrTWFzazsKICAgICAgICAgd2hpbGUgKHJlbW92ZWRUcmFja3MgIT0gMCkgewogICAgICAgICAgICAgaW50IGkgPSBfX2J1aWx0aW5fY3R6KHJlbW92ZWRUcmFja3MpOwogICAgICAgICAgICAgcmVtb3ZlZFRyYWNrcyAmPSB+KDEgPDwgaSk7Ci0gICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyID09IE5VTEwpOwotICAgICAgICAgICAgaWYgKG1NaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbU1peGVyLT5kZXN0cm95KGkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlTWl4ZXJUcmFjayhpLCBSRUFTT05fUkVNT1ZFKTsKICAgICAgICAgICAgIC8vIGRvbid0IHJlc2V0IHRyYWNrIGR1bXAgc3RhdGUsIHNpbmNlIG90aGVyIHNpZGUgaXMgaWdub3JpbmcgaXQKLSAgICAgICAgICAgIG1HZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247CiAgICAgICAgIH0KIAogICAgICAgICAvLyBub3cgcHJvY2VzcyBhZGRlZCB0cmFja3MKQEAgLTI0OSwzNiArMzI2LDcgQEAKICAgICAgICAgd2hpbGUgKGFkZGVkVHJhY2tzICE9IDApIHsKICAgICAgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eihhZGRlZFRyYWNrcyk7CiAgICAgICAgICAgICBhZGRlZFRyYWNrcyAmPSB+KDEgPDwgaSk7Ci0gICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKLSAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKmJ1ZmZlclByb3ZpZGVyID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXI7Ci0gICAgICAgICAgICBpZiAobU1peGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgbmFtZSA9IGk7IC8vIGZvciBjbGFyaXR5LCBjaG9vc2UgbmFtZSBhcyBmYXN0IHRyYWNrIGluZGV4LgotICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1NaXhlci0+Y3JlYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tRm9ybWF0LCBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpOwotICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBjYW5ub3QgY3JlYXRlIHRyYWNrIG5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAiICVkLCBtYXNrICUjeCwgZm9ybWF0ICUjeCwgc2Vzc2lvbklkICVkIGluIEF1ZGlvTWl4ZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1DaGFubmVsTWFzaywgZmFzdFRyYWNrLT5tRm9ybWF0LCBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpOwotICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgYnVmZmVyUHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1peGVyQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAvLyBuZXdseSBhbGxvY2F0ZWQgdHJhY2sgbmFtZXMgZGVmYXVsdCB0byBmdWxsIHNjYWxlIHZvbHVtZQotICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKW1NaXhlckJ1ZmZlckZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkZPUk1BVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1Gb3JtYXQpOwotICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpbVNpbmtDaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgbU1peGVyLT5lbmFibGUobmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtR2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOworICAgICAgICAgICAgdXBkYXRlTWl4ZXJUcmFjayhpLCBSRUFTT05fQUREKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGZpbmFsbHkgcHJvY2VzcyAocG90ZW50aWFsbHkpIG1vZGlmaWVkIHRyYWNrczsgdGhlc2UgdXNlIHRoZSBzYW1lIHNsb3QKQEAgLTI4Nyw0MCArMzM1LDEwIEBACiAgICAgICAgIHdoaWxlIChtb2RpZmllZFRyYWNrcyAhPSAwKSB7CiAgICAgICAgICAgICBpbnQgaSA9IF9fYnVpbHRpbl9jdHoobW9kaWZpZWRUcmFja3MpOwogICAgICAgICAgICAgbW9kaWZpZWRUcmFja3MgJj0gfigxIDw8IGkpOwotICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07Ci0gICAgICAgICAgICBpZiAoZmFzdFRyYWNrLT5tR2VuZXJhdGlvbiAhPSBtR2VuZXJhdGlvbnNbaV0pIHsKLSAgICAgICAgICAgICAgICAvLyB0aGlzIHRyYWNrIHdhcyBhY3R1YWxseSBtb2RpZmllZAotICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKmJ1ZmZlclByb3ZpZGVyID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXI7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYnVmZmVyUHJvdmlkZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1NaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuYW1lID0gaTsKLSAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCBidWZmZXJQcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmID0gQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmZik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVNT1ZFLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsICh2b2lkICopbU1peGVyQnVmZmVyRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkZPUk1BVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfTUFTSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCltU2lua0NoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBlbmFibGVkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1HZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGVNaXhlclRyYWNrKGksIFJFQVNPTl9NT0RJRlkpOwogICAgICAgICB9CiAKICAgICAgICAgbUZhc3RUcmFja3NHZW4gPSBjdXJyZW50LT5tRmFzdFRyYWNrc0dlbjsKLQotICAgICAgICBkdW1wU3RhdGUtPm1OdW1UcmFja3MgPSBwb3Bjb3VudChjdXJyZW50VHJhY2tNYXNrKTsKICAgICB9CiB9CiAKQEAgLTMyOCwxMyArMzQ2LDI0IEBACiB7CiAgICAgLy8gVE9ETzogcGFzcyBhbiBJRCBwYXJhbWV0ZXIgdG8gaW5kaWNhdGUgd2hpY2ggdGltZSBzZXJpZXMgd2Ugd2FudCB0byB3cml0ZSB0byBpbiBOQkxvZy5jcHAKICAgICAvLyBPcjogcGFzcyBib3RoIG9mIHRoZXNlIGludG8gYSBzaW5nbGUgY2FsbCB3aXRoIGEgYm9vbGVhbgotICAgIGlmIChtSXNXYXJtKSB7Ci0gICAgICAgIExPR19ISVNUX1RTKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTE9HX0FVRElPX1NUQVRFKCk7Ci0gICAgfQogICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSBtQ3VycmVudDsKICAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdE1peGVyRHVtcFN0YXRlICopIG1EdW1wU3RhdGU7CisKKyAgICBpZiAobUlzV2FybSkgeworICAgICAgICAvLyBMb2dnaW5nIHRpbWVzdGFtcHMgZm9yIEZhc3RNaXhlciBpcyBjdXJyZW50bHkgZGlzYWJsZWQgdG8gbWFrZSBtZW1vcnkgcm9vbSBmb3IgbG9nZ2luZworICAgICAgICAvLyBvdGhlciBzdGF0aXN0aWNzIGluIEZhc3RNaXhlci4KKyAgICAgICAgLy8gVG8gcmUtZW5hYmxlLCBkZWxldGUgdGhlICNpZmRlZiBGQVNUTUlYRVJfTE9HX0hJU1RfVFMgbGluZXMgKGFuZCB0aGUgI2VuZGlmIGxpbmVzKS4KKyNpZmRlZiBGQVNUTUlYRVJfTE9HX0hJU1RfVFMKKyAgICAgICAgTE9HX0hJU1RfVFMoKTsKKyNlbmRpZgorICAgICAgICAvL0FMT0dEKCJFcmljIEZhc3RNaXhlcjo6b25Xb3JrKCkgbUlzV2FybSIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGR1bXBTdGF0ZS0+bVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsKKyAgICAgICAgLy8gU2VlIGNvbW1lbnQgaW4gaWYgYmxvY2suCisjaWZkZWYgRkFTVE1JWEVSX0xPR19ISVNUX1RTCisgICAgICAgIExPR19BVURJT19TVEFURSgpOworI2VuZGlmCisgICAgfQogICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlOjpDb21tYW5kIGNvbW1hbmQgPSBtQ29tbWFuZDsKICAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OwogCkBAIC0zNzYsOCArNDA1LDggQEAKICAgICAgICAgICAgICAgICBmbG9hdCB2bGYgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSk7CiAgICAgICAgICAgICAgICAgZmxvYXQgdnJmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKTsKIAotICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7Ci0gICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmdnJmKTsKKyAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSQU1QX1ZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7CisgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkFNUF9WT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gRklYTUUgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZnJhbWVzUmVhZHkoKSBmb3IgZmFzdCB0cmFja3MKICAgICAgICAgICAgIC8vIHRha2VzIGEgdHJ5TG9jaywgd2hpY2ggY2FuIGJsb2NrCkBAIC00MzksMTcgKzQ2OCwyOSBAQAogICAgICAgICAgICAgbW9ub19ibGVuZChtTWl4ZXJCdWZmZXIsIG1NaXhlckJ1ZmZlckZvcm1hdCwgRm9ybWF0X2NoYW5uZWxDb3VudChtRm9ybWF0KSwgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmxpbWl0Ki8pOwogICAgICAgICB9CisKKyAgICAgICAgLy8gQmFsYW5jZSBtdXN0IHRha2UgZWZmZWN0IGFmdGVyIG1vbm8gY29udmVyc2lvbi4KKyAgICAgICAgLy8gbUJhbGFuY2UgZGV0ZWN0cyB6ZXJvIGJhbGFuY2Ugd2l0aGluIHRoZSBjbGFzcyBmb3Igc3BlZWQgKG5vdCBuZWVkZWQgaGVyZSkuCisgICAgICAgIG1CYWxhbmNlLnNldEJhbGFuY2UobU1hc3RlckJhbGFuY2UubG9hZCgpKTsKKyAgICAgICAgbUJhbGFuY2UucHJvY2VzcygoZmxvYXQgKiltTWl4ZXJCdWZmZXIsIGZyYW1lQ291bnQpOworCiAgICAgICAgIC8vIHByZXBhcmUgdGhlIGJ1ZmZlciB1c2VkIHRvIHdyaXRlIHRvIHNpbmsKICAgICAgICAgdm9pZCAqYnVmZmVyID0gbVNpbmtCdWZmZXIgIT0gTlVMTCA/IG1TaW5rQnVmZmVyIDogbU1peGVyQnVmZmVyOwogICAgICAgICBpZiAobUZvcm1hdC5tRm9ybWF0ICE9IG1NaXhlckJ1ZmZlckZvcm1hdCkgeyAvLyBzaW5rIGZvcm1hdCBub3QgdGhlIHNhbWUgYXMgbWl4ZXIgZm9ybWF0CiAgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGJ1ZmZlciwgbUZvcm1hdC5tRm9ybWF0LCBtTWl4ZXJCdWZmZXIsIG1NaXhlckJ1ZmZlckZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCAqIEZvcm1hdF9jaGFubmVsQ291bnQobUZvcm1hdCkpOwogICAgICAgICB9Ci0gICAgICAgIC8vIGlmIG5vbi1OVUxMLCB0aGVuIGR1cGxpY2F0ZSB3cml0ZSgpIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKLSAgICAgICAgTkJBSU9fU2luayogdGVlU2luazsKLSAgICAgICAgaWYgKCh0ZWVTaW5rID0gY3VycmVudC0+bVRlZVNpbmspICE9IE5VTEwpIHsKLSAgICAgICAgICAgICh2b2lkKSB0ZWVTaW5rLT53cml0ZShidWZmZXIsIGZyYW1lQ291bnQpOworICAgICAgICBpZiAobVNpbmtDaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgeworICAgICAgICAgICAgLy8gV2hlbiB0aGVyZSBhcmUgaGFwdGljIGNoYW5uZWxzLCB0aGUgc2FtcGxlIGRhdGEgaXMgcGFydGlhbGx5IGludGVybGVhdmVkLgorICAgICAgICAgICAgLy8gTWFrZSB0aGUgc2FtcGxlIGRhdGEgZnVsbHkgaW50ZXJsZWF2ZWQgaGVyZS4KKyAgICAgICAgICAgIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUoYnVmZmVyLCBtQXVkaW9DaGFubmVsQ291bnQsIGJ1ZmZlciwgbVNpbmtDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdC5tRm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShtQXVkaW9DaGFubmVsQ291bnQsIG1Gb3JtYXQubUZvcm1hdCkpOwogICAgICAgICB9CisgICAgICAgIC8vIGlmIG5vbi1OVUxMLCB0aGVuIGR1cGxpY2F0ZSB3cml0ZSgpIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKKyNpZmRlZiBURUVfU0lOSworICAgICAgICBtVGVlLndyaXRlKGJ1ZmZlciwgZnJhbWVDb3VudCk7CisjZW5kaWYKICAgICAgICAgLy8gRklYTUUgd3JpdGUoKSBpcyBub24tYmxvY2tpbmcgYW5kIGxvY2stZnJlZSBmb3IgYSBwcm9wZXJseSBpbXBsZW1lbnRlZCBOQkFJTyBzaW5rLAogICAgICAgICAvLyAgICAgICBidXQgdGhpcyBjb2RlIHNob3VsZCBiZSBtb2RpZmllZCB0byBoYW5kbGUgYm90aCBub24tYmxvY2tpbmcgYW5kIGJsb2NraW5nIHNpbmtzCiAgICAgICAgIGR1bXBTdGF0ZS0+bVdyaXRlU2VxdWVuY2UrKzsKQEAgLTQ3MCwzNSArNTExLDQ5IEBACiAgICAgICAgIG1BdHRlbXB0ZWRXcml0ZSA9IHRydWU7CiAgICAgICAgIC8vIEZJWE1FIGNvdW50ICMgb2Ygd3JpdGVzIGJsb2NrZWQgZXhjZXNzaXZlbHksIENQVSB1c2FnZSwgZXRjLiBmb3IgZHVtcAogCi0gICAgICAgIEV4dGVuZGVkVGltZXN0YW1wIHRpbWVzdGFtcDsgLy8gbG9jYWwKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU91dHB1dFNpbmstPmdldFRpbWVzdGFtcCh0aW1lc3RhbXApOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkID0KLSAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKLSAgICAgICAgICAgIGlmICh0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA8PSBtVG90YWxOYXRpdmVGcmFtZXNXcml0dGVuKSB7Ci0gICAgICAgICAgICAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPQotICAgICAgICAgICAgICAgICAgICBtVG90YWxOYXRpdmVGcmFtZXNXcml0dGVuIC0gdG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQ7Ci0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQorICAgICAgICBpZiAobUlzV2FybSkgeworICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgdGltZXN0YW1wOyAvLyBsb2NhbAorICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU91dHB1dFNpbmstPmdldFRpbWVzdGFtcCh0aW1lc3RhbXApOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVRpbWVzdGFtcFZlcmlmaWVyLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkID0KICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07Ci0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOworICAgICAgICAgICAgICAgIGlmICh0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA8PSBtVG90YWxOYXRpdmVGcmFtZXNXcml0dGVuKSB7CisgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gLSB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZDsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGNvbXBlbnNhdGUgZm9yIHNlcnZlciAtIGtlcm5lbCB0aW1lIGRpZmZlcmVuY2UgYW5kCisgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdXBkYXRlIGxhdGVuY3kgaWYgd2UgaGF2ZSB2YWxpZCBpbmZvLgorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKW1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkICogMTAwMCAvIG1TYW1wbGVSYXRlOworICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1MYXRlbmN5TXMgPSBsYXRlbmN5TXM7CisgICAgICAgICAgICAgICAgICAgIExPR19MQVRFTkNZKGxhdGVuY3lNcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSEFMIHJlcG9ydGVkIHRoYXQgbW9yZSBmcmFtZXMgd2VyZSBwcmVzZW50ZWQgdGhhbiB3ZXJlIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPSAwOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIEhBTCByZXBvcnRlZCB0aGF0IG1vcmUgZnJhbWVzIHdlcmUgcHJlc2VudGVkIHRoYW4gd2VyZSB3cml0dGVuCi0gICAgICAgICAgICAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPSAwOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVRpbWVzdGFtcFZlcmlmaWVyLmVycm9yKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0KLSAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gZmV0Y2ggc2VydmVyIHRpbWUgaWYgd2UgY2FuJ3QgZ2V0IHRpbWVzdGFtcAotICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0KLSAgICAgICAgICAgICAgICAgICAgc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGtlcm5lbCBjYWNoZWQgcG9zaXRpb24gYXMgdGhpcyBtYXkgZ2V0IHJhcGlkbHkgc3RhbGUKLSAgICAgICAgICAgIC8vIGlmIHdlIG5ldmVyIGdldCBhIG5ldyB2YWxpZCB0aW1lc3RhbXAKLSAgICAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gMDsKLSAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IC0xOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGZldGNoIHNlcnZlciB0aW1lIGlmIHdlIGNhbid0IGdldCB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPQorICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBrZXJuZWwgY2FjaGVkIHBvc2l0aW9uIGFzIHRoaXMgbWF5IGdldCByYXBpZGx5IHN0YWxlCisgICAgICAgICAgICAgICAgLy8gaWYgd2UgbmV2ZXIgZ2V0IGEgbmV3IHZhbGlkIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gMDsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSAtMTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaAppbmRleCAyMzVkMjNmLi45N2FiNjM1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oCkBAIC0xOCwxMCArMTgsMTIgQEAKICNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX0gKIAogI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9CYWxhbmNlLmg+CiAjaW5jbHVkZSAiRmFzdFRocmVhZC5oIgogI2luY2x1ZGUgIlN0YXRlUXVldWUuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXJTdGF0ZS5oIgogI2luY2x1ZGUgIkZhc3RNaXhlckR1bXBTdGF0ZS5oIgorI2luY2x1ZGUgIk5CQUlPX1RlZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMyLDEyICszNCwxNiBAQAogY2xhc3MgRmFzdE1peGVyIDogcHVibGljIEZhc3RUaHJlYWQgewogCiBwdWJsaWM6Ci0gICAgICAgICAgICBGYXN0TWl4ZXIoKTsKKyAgICAvKiogRmFzdE1peGVyIGNvbnN0cnVjdG9yIHRha2VzIGFzIHBhcmFtIHRoZSBwYXJlbnQgTWl4ZXJUaHJlYWQncyBpbyBoYW5kbGUgKGlkKQorICAgICAgICBmb3IgcHVycG9zZXMgb2YgaWRlbnRpZmljYXRpb24uICovCisgICAgZXhwbGljaXQgRmFzdE1peGVyKGF1ZGlvX2lvX2hhbmRsZV90IHRocmVhZElvSGFuZGxlKTsKICAgICB2aXJ0dWFsIH5GYXN0TWl4ZXIoKTsKIAogICAgICAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSogc3EoKTsKIAogICAgIHZpcnR1YWwgdm9pZCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubykgeyBtTWFzdGVyTW9uby5zdG9yZShtb25vKTsgLyogbWVtb3J5X29yZGVyX3NlcV9jc3QgKi8gfQorICAgIHZpcnR1YWwgdm9pZCBzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpIHsgbU1hc3RlckJhbGFuY2Uuc3RvcmUoYmFsYW5jZSk7IH0KKyAgICB2aXJ0dWFsIGZsb2F0IGdldE1hc3RlckJhbGFuY2UoKSBjb25zdCB7IHJldHVybiBtTWFzdGVyQmFsYW5jZS5sb2FkKCk7IH0KICAgICB2aXJ0dWFsIHZvaWQgc2V0Qm9vdHRpbWVPZmZzZXQoaW50NjRfdCBib290dGltZU9mZnNldCkgewogICAgICAgICBtQm9vdHRpbWVPZmZzZXQuc3RvcmUoYm9vdHRpbWVPZmZzZXQpOyAvKiBtZW1vcnlfb3JkZXJfc2VxX2NzdCAqLwogICAgIH0KQEAgLTUzLDYgKzU5LDE0IEBACiAgICAgdmlydHVhbCB2b2lkIG9uU3RhdGVDaGFuZ2UoKTsKICAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrKCk7CiAKKyAgICBlbnVtIFJlYXNvbiB7CisgICAgICAgIFJFQVNPTl9SRU1PVkUsCisgICAgICAgIFJFQVNPTl9BREQsCisgICAgICAgIFJFQVNPTl9NT0RJRlksCisgICAgfTsKKyAgICAvLyBjYWxsZWQgd2hlbiBhIGZhc3QgdHJhY2sgb2YgaW5kZXggaGFzIGJlZW4gcmVtb3ZlZCwgYWRkZWQsIG9yIG1vZGlmaWVkCisgICAgdm9pZCB1cGRhdGVNaXhlclRyYWNrKGludCBpbmRleCwgUmVhc29uIHJlYXNvbik7CisKICAgICAvLyBGSVhNRSB0aGVzZSBmb3JtZXIgbG9jYWwgdmFyaWFibGVzIG5lZWQgY29tbWVudHMKICAgICBzdGF0aWMgY29uc3QgRmFzdE1peGVyU3RhdGUgc0luaXRpYWw7CiAKQEAgLTcxLDcgKzg1LDkgQEAKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtU2lua0NoYW5uZWxNYXNrOwogICAgIHZvaWQqICAgICAgICAgICBtTWl4ZXJCdWZmZXI7ICAgICAgIC8vIG1peGVyIG91dHB1dCBidWZmZXIuCiAgICAgc2l6ZV90ICAgICAgICAgIG1NaXhlckJ1ZmZlclNpemU7Ci0gICAgYXVkaW9fZm9ybWF0X3QgIG1NaXhlckJ1ZmZlckZvcm1hdDsgLy8gbWl4ZXIgb3V0cHV0IGZvcm1hdDogQVVESU9fRk9STUFUX1BDTV8oMTZfQklUfEZMT0FUKS4KKyAgICBzdGF0aWMgY29uc3RleHByIGF1ZGlvX2Zvcm1hdF90IG1NaXhlckJ1ZmZlckZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisKKyAgICB1aW50MzJfdCAgICAgICAgbUF1ZGlvQ2hhbm5lbENvdW50OyAvLyBhdWRpbyBjaGFubmVsIGNvdW50LCBleGNsdWRlcyBoYXB0aWMgY2hhbm5lbHMuCiAKICAgICBlbnVtIHtVTkRFRklORUQsIE1JWEVELCBaRVJPRUR9IG1NaXhlckJ1ZmZlclN0YXRlOwogICAgIE5CQUlPX0Zvcm1hdCAgICBtRm9ybWF0OwpAQCAtODQsOSArMTAwLDE3IEBACiAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgbVRpbWVzdGFtcDsKICAgICBpbnQ2NF90ICAgICAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQ7CiAKKyAgICBhdWRpb191dGlsczo6QmFsYW5jZSBtQmFsYW5jZTsKKwogICAgIC8vIGFjY2Vzc2VkIHdpdGhvdXQgbG9jayBiZXR3ZWVuIG11bHRpcGxlIHRocmVhZHMuCiAgICAgc3RkOjphdG9taWNfYm9vbCBtTWFzdGVyTW9ubzsKKyAgICBzdGQ6OmF0b21pYzxmbG9hdD4gbU1hc3RlckJhbGFuY2V7fTsKICAgICBzdGQ6OmF0b21pY19pbnRfZmFzdDY0X3QgbUJvb3R0aW1lT2Zmc2V0OworCisgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgbVRocmVhZElvSGFuZGxlOyAvLyBwYXJlbnQgdGhyZWFkIGlkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKyNpZmRlZiBURUVfU0lOSworICAgIE5CQUlPX1RlZSAgICAgICBtVGVlOworI2VuZGlmCiB9OyAgLy8gY2xhc3MgRmFzdE1peGVyCiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcAppbmRleCAyZTRmYjhjLi5hNDJlMDljIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcApAQCAtMTksNyArMTksNyBAQAogCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKLSNpbmNsdWRlIDxjcHVzdGF0cy9DZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvU3RhdGlzdGljcy5oPgogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwogI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CiAjZW5kaWYKQEAgLTY4LDIxICs2OCwyMiBAQAogICAgIGRwcmludGYoZmQsICIgIEZhc3RNaXhlciBjb21tYW5kPSVzIHdyaXRlU2VxdWVuY2U9JXUgZnJhbWVzV3JpdHRlbj0ldVxuIgogICAgICAgICAgICAgICAgICIgICAgICAgICAgICBudW1UcmFja3M9JXUgd3JpdGVFcnJvcnM9JXUgdW5kZXJydW5zPSV1IG92ZXJydW5zPSV1XG4iCiAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIHNhbXBsZVJhdGU9JXUgZnJhbWVDb3VudD0lenUgbWVhc3VyZWRXYXJtdXA9JS4zZyBtcywgd2FybXVwQ3ljbGVzPSV1XG4iCi0gICAgICAgICAgICAgICAgIiAgICAgICAgICAgIG1peFBlcmlvZD0lLjJmIG1zXG4iLAorICAgICAgICAgICAgICAgICIgICAgICAgICAgICBtaXhQZXJpb2Q9JS4yZiBtcyBsYXRlbmN5PSUuMmYgbXNcbiIsCiAgICAgICAgICAgICAgICAgRmFzdE1peGVyU3RhdGU6OmNvbW1hbmRUb1N0cmluZyhtQ29tbWFuZCksIG1Xcml0ZVNlcXVlbmNlLCBtRnJhbWVzV3JpdHRlbiwKICAgICAgICAgICAgICAgICBtTnVtVHJhY2tzLCBtV3JpdGVFcnJvcnMsIG1VbmRlcnJ1bnMsIG1PdmVycnVucywKICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsIG1lYXN1cmVkV2FybXVwTXMsIG1XYXJtdXBDeWNsZXMsCi0gICAgICAgICAgICAgICAgbWl4UGVyaW9kU2VjICogMWUzKTsKKyAgICAgICAgICAgICAgICBtaXhQZXJpb2RTZWMgKiAxZTMsIG1MYXRlbmN5TXMpOworICAgIGRwcmludGYoZmQsICIgIEZhc3RNaXhlciBUaW1lc3RhbXAgc3RhdHM6ICVzXG4iLCBtVGltZXN0YW1wVmVyaWZpZXIudG9TdHJpbmcoKS5jX3N0cigpKTsKICNpZmRlZiBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCiAgICAgLy8gZmluZCB0aGUgaW50ZXJ2YWwgb2YgdmFsaWQgc2FtcGxlcwotICAgIHVpbnQzMl90IGJvdW5kcyA9IG1Cb3VuZHM7Ci0gICAgdWludDMyX3QgbmV3ZXN0T3BlbiA9IGJvdW5kcyAmIDB4RkZGRjsKKyAgICBjb25zdCB1aW50MzJfdCBib3VuZHMgPSBtQm91bmRzOworICAgIGNvbnN0IHVpbnQzMl90IG5ld2VzdE9wZW4gPSBib3VuZHMgJiAweEZGRkY7CiAgICAgdWludDMyX3Qgb2xkZXN0Q2xvc2VkID0gYm91bmRzID4+IDE2OwogCiAgICAgLy91aW50MzJfdCBuID0gKG5ld2VzdE9wZW4gLSBvbGRlc3RDbG9zZWQpICYgMHhGRkZGOwogICAgIHVpbnQzMl90IG47CiAgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdyhuZXdlc3RPcGVuLCBvbGRlc3RDbG9zZWQsICZuKTsKLSAgICBuID0gbiAmIDB4RkZGRjsKKyAgICBuICY9IDB4RkZGRjsKIAogICAgIGlmIChuID4gbVNhbXBsaW5nTikgewogICAgICAgICBBTE9HRSgidG9vIG1hbnkgc2FtcGxlcyAldSIsIG4pOwpAQCAtOTAsOSArOTEsOSBAQAogICAgIH0KICAgICAvLyBzdGF0aXN0aWNzIGZvciBtb25vdG9uaWMgKHdhbGwgY2xvY2spIHRpbWUsIHRocmVhZCByYXcgQ1BVIGxvYWQgaW4gdGltZSwgQ1BVIGNsb2NrIGZyZXF1ZW5jeSwKICAgICAvLyBhbmQgYWRqdXN0ZWQgQ1BVIGxvYWQgaW4gTUh6IG5vcm1hbGl6ZWQgZm9yIENQVSBjbG9jayBmcmVxdWVuY3kKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIHdhbGwsIGxvYWROczsKKyAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IHdhbGwsIGxvYWROczsKICNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIGtIeiwgbG9hZE1IejsKKyAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IGtIeiwgbG9hZE1IejsKICAgICB1aW50MzJfdCBwcmV2aW91c0NwdWtIeiA9IDA7CiAjZW5kaWYKICAgICAvLyBBc3N1bWluZyBhIG5vcm1hbCBkaXN0cmlidXRpb24gZm9yIGN5Y2xlIHRpbWVzLCB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zIG9uIGVpdGhlciBzaWRlIG9mCkBAIC0xMDcsMTggKzEwOCwxOCBAQAogICAgICAgICBpZiAodGFpbCAhPSBOVUxMKSB7CiAgICAgICAgICAgICB0YWlsW2pdID0gd2FsbE5zOwogICAgICAgICB9Ci0gICAgICAgIHdhbGwuc2FtcGxlKHdhbGxOcyk7CisgICAgICAgIHdhbGwuYWRkKHdhbGxOcyk7CiAgICAgICAgIHVpbnQzMl90IHNhbXBsZUxvYWROcyA9IG1Mb2FkTnNbaV07Ci0gICAgICAgIGxvYWROcy5zYW1wbGUoc2FtcGxlTG9hZE5zKTsKKyAgICAgICAgbG9hZE5zLmFkZChzYW1wbGVMb2FkTnMpOwogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwogICAgICAgICB1aW50MzJfdCBzYW1wbGVDcHVrSHogPSBtQ3B1a0h6W2ldOwogICAgICAgICAvLyBza2lwIGJhZCBrSHogc2FtcGxlcwogICAgICAgICBpZiAoKHNhbXBsZUNwdWtIeiAmIH4weEYpICE9IDApIHsKLSAgICAgICAgICAgIGtIei5zYW1wbGUoc2FtcGxlQ3B1a0h6ID4+IDQpOworICAgICAgICAgICAga0h6LmFkZChzYW1wbGVDcHVrSHogPj4gNCk7CiAgICAgICAgICAgICBpZiAoc2FtcGxlQ3B1a0h6ID09IHByZXZpb3VzQ3B1a0h6KSB7CiAgICAgICAgICAgICAgICAgZG91YmxlIG1lZ2FjeWNsZXMgPSAoZG91YmxlKSBzYW1wbGVMb2FkTnMgKiAoZG91YmxlKSAoc2FtcGxlQ3B1a0h6ID4+IDQpICogMWUtMTI7CiAgICAgICAgICAgICAgICAgZG91YmxlIGFkak1IeiA9IG1lZ2FjeWNsZXMgLyBtaXhQZXJpb2RTZWM7ICAvLyBfbm90XyB3YWxsTnMgKiAxZTkKLSAgICAgICAgICAgICAgICBsb2FkTUh6LnNhbXBsZShhZGpNSHopOworICAgICAgICAgICAgICAgIGxvYWRNSHouYWRkKGFkak1Ieik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcHJldmlvdXNDcHVrSHogPSBzYW1wbGVDcHVrSHo7CkBAIC0xMjYsNDIgKzEyNyw0MiBAQAogICAgIH0KICAgICBpZiAobikgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBTaW1wbGUgbW92aW5nIHN0YXRpc3RpY3Mgb3ZlciBsYXN0ICUuMWYgc2Vjb25kczpcbiIsCi0gICAgICAgICAgICAgICAgICAgIHdhbGwubigpICogbWl4UGVyaW9kU2VjKTsKKyAgICAgICAgICAgICAgICAgICAgd2FsbC5nZXROKCkgKiBtaXhQZXJpb2RTZWMpOwogICAgICAgICBkcHJpbnRmKGZkLCAiICAgIHdhbGwgY2xvY2sgdGltZSBpbiBtcyBwZXIgbWl4IGN5Y2xlOlxuIgogICAgICAgICAgICAgICAgICAgICAiICAgICAgbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iLAotICAgICAgICAgICAgICAgICAgICB3YWxsLm1lYW4oKSoxZS02LCB3YWxsLm1pbmltdW0oKSoxZS02LCB3YWxsLm1heGltdW0oKSoxZS02LAotICAgICAgICAgICAgICAgICAgICB3YWxsLnN0ZGRldigpKjFlLTYpOworICAgICAgICAgICAgICAgICAgICB3YWxsLmdldE1lYW4oKSoxZS02LCB3YWxsLmdldE1pbigpKjFlLTYsIHdhbGwuZ2V0TWF4KCkqMWUtNiwKKyAgICAgICAgICAgICAgICAgICAgd2FsbC5nZXRTdGREZXYoKSoxZS02KTsKICAgICAgICAgZHByaW50ZihmZCwgIiAgICByYXcgQ1BVIGxvYWQgaW4gdXMgcGVyIG1peCBjeWNsZTpcbiIKICAgICAgICAgICAgICAgICAgICAgIiAgICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgbG9hZE5zLm1lYW4oKSoxZS0zLCBsb2FkTnMubWluaW11bSgpKjFlLTMsIGxvYWROcy5tYXhpbXVtKCkqMWUtMywKLSAgICAgICAgICAgICAgICAgICAgbG9hZE5zLnN0ZGRldigpKjFlLTMpOworICAgICAgICAgICAgICAgICAgICBsb2FkTnMuZ2V0TWVhbigpKjFlLTMsIGxvYWROcy5nZXRNaW4oKSoxZS0zLCBsb2FkTnMuZ2V0TWF4KCkqMWUtMywKKyAgICAgICAgICAgICAgICAgICAgbG9hZE5zLmdldFN0ZERldigpKjFlLTMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIEZhc3RNaXhlciBzdGF0aXN0aWNzIGF2YWlsYWJsZSBjdXJyZW50bHlcbiIpOwogICAgIH0KICNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKICAgICBkcHJpbnRmKGZkLCAiICBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIE1IejpcbiIKICAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKLSAgICAgICAgICAgICAgICBrSHoubWVhbigpKjFlLTMsIGtIei5taW5pbXVtKCkqMWUtMywga0h6Lm1heGltdW0oKSoxZS0zLCBrSHouc3RkZGV2KCkqMWUtMyk7CisgICAgICAgICAgICAgICAga0h6LmdldE1lYW4oKSoxZS0zLCBrSHouZ2V0TWluKCkqMWUtMywga0h6LmdldE1heCgpKjFlLTMsIGtIei5nZXRTdGREZXYoKSoxZS0zKTsKICAgICBkcHJpbnRmKGZkLCAiICBhZGp1c3RlZCBDUFUgbG9hZCBpbiBNSHogKGkuZS4gbm9ybWFsaXplZCBmb3IgQ1BVIGNsb2NrIGZyZXF1ZW5jeSk6XG4iCiAgICAgICAgICAgICAgICAgIiAgICBtZWFuPSUuMWYgbWluPSUuMWYgbWF4PSUuMWYgc3RkZGV2PSUuMWZcbiIsCi0gICAgICAgICAgICAgICAgbG9hZE1Iei5tZWFuKCksIGxvYWRNSHoubWluaW11bSgpLCBsb2FkTUh6Lm1heGltdW0oKSwgbG9hZE1Iei5zdGRkZXYoKSk7CisgICAgICAgICAgICAgICAgbG9hZE1Iei5nZXRNZWFuKCksIGxvYWRNSHouZ2V0TWluKCksIGxvYWRNSHouZ2V0TWF4KCksIGxvYWRNSHouZ2V0U3RkRGV2KCkpOwogI2VuZGlmCiAgICAgaWYgKHRhaWwgIT0gTlVMTCkgewogICAgICAgICBxc29ydCh0YWlsLCBuLCBzaXplb2YodWludDMyX3QpLCBjb21wYXJlX3VpbnQzMl90KTsKICAgICAgICAgLy8gYXNzdW1lIHNhbWUgbnVtYmVyIG9mIHRhaWwgc2FtcGxlcyBvbiBlYWNoIHNpZGUsIGxlZnQgYW5kIHJpZ2h0CiAgICAgICAgIHVpbnQzMl90IGNvdW50ID0gbiAvIGtUYWlsRGVub21pbmF0b3I7Ci0gICAgICAgIENlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3MgbGVmdCwgcmlnaHQ7CisgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbGVmdCwgcmlnaHQ7CiAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgICAgICBsZWZ0LnNhbXBsZSh0YWlsW2ldKTsKLSAgICAgICAgICAgIHJpZ2h0LnNhbXBsZSh0YWlsW24gLSAoaSArIDEpXSk7CisgICAgICAgICAgICBsZWZ0LmFkZCh0YWlsW2ldKTsKKyAgICAgICAgICAgIHJpZ2h0LmFkZCh0YWlsW24gLSAoaSArIDEpXSk7CiAgICAgICAgIH0KICAgICAgICAgZHByaW50ZihmZCwgIiAgRGlzdHJpYnV0aW9uIG9mIG1peCBjeWNsZSB0aW1lcyBpbiBtcyBmb3IgdGhlIHRhaWxzICIKICAgICAgICAgICAgICAgICAgICAgIig+IH4zIHN0ZGRldiBvdXRsaWVycyk6XG4iCiAgICAgICAgICAgICAgICAgICAgICIgICAgbGVmdCB0YWlsOiBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIKICAgICAgICAgICAgICAgICAgICAgIiAgICByaWdodCB0YWlsOiBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIsCi0gICAgICAgICAgICAgICAgICAgIGxlZnQubWVhbigpKjFlLTYsIGxlZnQubWluaW11bSgpKjFlLTYsIGxlZnQubWF4aW11bSgpKjFlLTYsIGxlZnQuc3RkZGV2KCkqMWUtNiwKLSAgICAgICAgICAgICAgICAgICAgcmlnaHQubWVhbigpKjFlLTYsIHJpZ2h0Lm1pbmltdW0oKSoxZS02LCByaWdodC5tYXhpbXVtKCkqMWUtNiwKLSAgICAgICAgICAgICAgICAgICAgcmlnaHQuc3RkZGV2KCkqMWUtNik7CisgICAgICAgICAgICAgICAgICAgIGxlZnQuZ2V0TWVhbigpKjFlLTYsIGxlZnQuZ2V0TWluKCkqMWUtNiwgbGVmdC5nZXRNYXgoKSoxZS02LCBsZWZ0LmdldFN0ZERldigpKjFlLTYsCisgICAgICAgICAgICAgICAgICAgIHJpZ2h0LmdldE1lYW4oKSoxZS02LCByaWdodC5nZXRNaW4oKSoxZS02LCByaWdodC5nZXRNYXgoKSoxZS02LAorICAgICAgICAgICAgICAgICAgICByaWdodC5nZXRTdGREZXYoKSoxZS02KTsKICAgICAgICAgZGVsZXRlW10gdGFpbDsKICAgICB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuaAppbmRleCA4ZWYzMWQxLi45YjkxY2JjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9EVU1QX1NUQVRFX0gKIAogI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1RpbWVzdGFtcFZlcmlmaWVyLmg+CiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgIkZhc3RUaHJlYWREdW1wU3RhdGUuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXJTdGF0ZS5oIgpAQCAtNjYsNiArNjcsNyBAQAogCiAgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7ICAgIC8vIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHN0YWJsZSBjb3B5LCBub3QgdGhlIG9yaWdpbmFsCiAKKyAgICBkb3VibGUgICBtTGF0ZW5jeU1zID0gMC47ICAgLy8gbWVhc3VyZWQgbGF0ZW5jeSwgZGVmYXVsdCBvZiAwIGlmIG5vIHZhbGlkIHRpbWVzdGFtcCByZWFkLgogICAgIHVpbnQzMl90IG1Xcml0ZVNlcXVlbmNlOyAgICAvLyBpbmNyZW1lbnRlZCBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggd3JpdGUoKQogICAgIHVpbnQzMl90IG1GcmFtZXNXcml0dGVuOyAgICAvLyB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5CiAgICAgdWludDMyX3QgbU51bVRyYWNrczsgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBhY3RpdmUgZmFzdCB0cmFja3MKQEAgLTc0LDYgKzc2LDkgQEAKICAgICBzaXplX3QgICBtRnJhbWVDb3VudDsKICAgICB1aW50MzJfdCBtVHJhY2tNYXNrOyAgICAgICAgLy8gbWFzayBvZiBhY3RpdmUgdHJhY2tzCiAgICAgRmFzdFRyYWNrRHVtcCAgIG1UcmFja3NbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsKKworICAgIC8vIEZvciB0aW1lc3RhbXAgc3RhdGlzdGljcy4KKyAgICBUaW1lc3RhbXBWZXJpZmllcjxpbnQ2NF90IC8qIGZyYW1lIGNvdW50ICovLCBpbnQ2NF90IC8qIHRpbWUgbnMgKi8+IG1UaW1lc3RhbXBWZXJpZmllcjsKIH07CiAKIH0gICAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmNwcAppbmRleCAzNmQ4ZWVmLi5iOTg4NDJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAKQEAgLTM1LDcgKzM1LDcgQEAKIEZhc3RNaXhlclN0YXRlOjpGYXN0TWl4ZXJTdGF0ZSgpIDogRmFzdFRocmVhZFN0YXRlKCksCiAgICAgLy8gbUZhc3RUcmFja3MKICAgICBtRmFzdFRyYWNrc0dlbigwKSwgbVRyYWNrTWFzaygwKSwgbU91dHB1dFNpbmsoTlVMTCksIG1PdXRwdXRTaW5rR2VuKDApLAotICAgIG1GcmFtZUNvdW50KDApLCBtVGVlU2luayhOVUxMKQorICAgIG1GcmFtZUNvdW50KDApCiB7CiAgICAgaW50IG9rID0gcHRocmVhZF9vbmNlKCZzTWF4RmFzdFRyYWNrc09uY2UsIHNNYXhGYXN0VHJhY2tzSW5pdCk7CiAgICAgaWYgKG9rICE9IDApIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKaW5kZXggMmJlMWU5MS4uMzk2Yzc5NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL21pbmlmbG9hdC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvTWl4ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRlbmRlZEF1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CkBAIC00Nyw2ICs0OCw5IEBACiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgICAgbUNoYW5uZWxNYXNrOyAgICAvLyBBVURJT19DSEFOTkVMX09VVF9NT05PIG9yIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTwogICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgIG1Gb3JtYXQ7ICAgICAgICAgLy8gdHJhY2sgZm9ybWF0CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUdlbmVyYXRpb247ICAgICAvLyBpbmNyZW1lbnQgd2hlbiBhbnkgZmllbGQgaXMgYXNzaWduZWQKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBtSGFwdGljUGxheWJhY2tFbmFibGVkID0gZmFsc2U7IC8vIGhhcHRpYyBwbGF5YmFjayBpcyBlbmFibGVkIG9yIG5vdAorICAgIEF1ZGlvTWl4ZXI6OmhhcHRpY19pbnRlbnNpdHlfdCBtSGFwdGljSW50ZW5zaXR5ID0gQXVkaW9NaXhlcjo6SEFQVElDX1NDQUxFX01VVEU7IC8vIGludGVuc2l0eSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhcHRpYyBkYXRhCiB9OwogCiAvLyBSZXByZXNlbnRzIGEgc2luZ2xlIHN0YXRlIG9mIHRoZSBmYXN0IG1peGVyCkBAIC02OSw2ICs3Myw5IEBACiAgICAgTkJBSU9fU2luayogbU91dHB1dFNpbms7ICAgIC8vIEhBTCBvdXRwdXQgZGV2aWNlLCBtdXN0IGFscmVhZHkgYmUgbmVnb3RpYXRlZAogICAgIGludCAgICAgICAgIG1PdXRwdXRTaW5rR2VuOyAvLyBpbmNyZW1lbnQgd2hlbiBtT3V0cHV0U2luayBpcyBhc3NpZ25lZAogICAgIHNpemVfdCAgICAgIG1GcmFtZUNvdW50OyAgICAvLyBudW1iZXIgb2YgZnJhbWVzIHBlciBmYXN0IG1peCBidWZmZXIKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtU2lua0NoYW5uZWxNYXNrOyAvLyBJZiBub3QgQVVESU9fQ0hBTk5FTF9OT05FLCBzcGVjaWZpZXMgc2luayBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFzayB3aGVuIGl0IGNhbm5vdCBiZSBkaXJlY3RseSBjYWxjdWxhdGVkIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFubmVsIGNvdW50CiAKICAgICAvLyBFeHRlbmRzIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZAogICAgIHN0YXRpYyBjb25zdCBDb21tYW5kCkBAIC03Nyw5ICs4NCw2IEBACiAgICAgICAgIFdSSVRFID0gMHgxMCwgICAgICAgICAgIC8vIHdyaXRlIHRvIG91dHB1dCBzaW5rCiAgICAgICAgIE1JWF9XUklURSA9IDB4MTg7ICAgICAgIC8vIG1peCB0cmFja3MgYW5kIHdyaXRlIHRvIG91dHB1dCBzaW5rCiAKLSAgICAvLyBUaGlzIG1pZ2h0IGJlIGEgb25lLXRpbWUgY29uZmlndXJhdGlvbiByYXRoZXIgdGhhbiBwZXItc3RhdGUKLSAgICBOQkFJT19TaW5rKiBtVGVlU2luazsgICAgICAgLy8gaWYgbm9uLU5VTEwsIHRoZW4gZHVwbGljYXRlIHdyaXRlKClzIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKLQogICAgIC8vIG5ldmVyIHJldHVybnMgTlVMTDsgYXNzZXJ0cyBpZiBjb21tYW5kIGlzIGludmFsaWQKICAgICBzdGF0aWMgY29uc3QgY2hhciAqY29tbWFuZFRvU3RyaW5nKENvbW1hbmQgY29tbWFuZCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcAppbmRleCBkYzE1NDg3Li4wNGIzMmMyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CiAjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgogI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgpAQCAtNjUsOCArNjYsNiBAQAogICAgIC8qIG1NZWFzdXJlZFdhcm11cFRzKHswLCAwfSksICovCiAgICAgbVdhcm11cEN5Y2xlcygwKSwKICAgICBtV2FybXVwQ29uc2VjdXRpdmVJblJhbmdlQ3ljbGVzKDApLAotICAgIC8vIG1EdW1teU5CTG9nV3JpdGVyCi0gICAgbU5CTG9nV3JpdGVyKCZtRHVtbXlOQkxvZ1dyaXRlciksCiAgICAgbVRpbWVzdGFtcFN0YXR1cyhJTlZBTElEX09QRVJBVElPTiksCiAKICAgICBtQ29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OklOSVRJQUwpLApAQCAtOTMsNyArOTIsNyBAQAogewogICAgIC8vIExPR1Qgbm93IHdvcmtzIGV2ZW4gaWYgdGxOQkxvZ1dyaXRlciBpcyBudWxscHRyLCBidXQgd2UncmUgY29uc2lkZXJpbmcgY2hhbmdpbmcgdGhhdCwKICAgICAvLyBzbyB0aGlzIGluaXRpYWxpemF0aW9uIHBlcm1pdHMgYSBmdXR1cmUgY2hhbmdlIHRvIHJlbW92ZSB0aGUgY2hlY2sgZm9yIG51bGxwdHIuCi0gICAgdGxOQkxvZ1dyaXRlciA9ICZtRHVtbXlOQkxvZ1dyaXRlcjsKKyAgICB0bE5CTG9nV3JpdGVyID0gbUR1bW15TkJMb2dXcml0ZXIuZ2V0KCk7CiAgICAgZm9yICg7OykgewogCiAgICAgICAgIC8vIGVpdGhlciBuYW5vc2xlZXAsIHNjaGVkX3lpZWxkLCBvciBidXN5IHdhaXQKQEAgLTEyMyw5ICsxMjIsOSBAQAogCiAgICAgICAgICAgICAvLyBBcyBzb29uIGFzIHBvc3NpYmxlIG9mIGxlYXJuaW5nIG9mIGEgbmV3IGR1bXAgYXJlYSwgc3RhcnQgdXNpbmcgaXQKICAgICAgICAgICAgIG1EdW1wU3RhdGUgPSBuZXh0LT5tRHVtcFN0YXRlICE9IE5VTEwgPyBuZXh0LT5tRHVtcFN0YXRlIDogbUR1bW15RHVtcFN0YXRlOwotICAgICAgICAgICAgbU5CTG9nV3JpdGVyID0gbmV4dC0+bU5CTG9nV3JpdGVyICE9IE5VTEwgPyBuZXh0LT5tTkJMb2dXcml0ZXIgOiAmbUR1bW15TkJMb2dXcml0ZXI7Ci0gICAgICAgICAgICBzZXROQkxvZ1dyaXRlcihtTkJMb2dXcml0ZXIpOyAgIC8vIEZhc3RNaXhlciBpbmZvcm1zIGl0cyBBdWRpb01peGVyLCBGYXN0Q2FwdHVyZSBpZ25vcmVzCi0gICAgICAgICAgICB0bE5CTG9nV3JpdGVyID0gbU5CTG9nV3JpdGVyOworICAgICAgICAgICAgdGxOQkxvZ1dyaXRlciA9IG5leHQtPm1OQkxvZ1dyaXRlciAhPSBOVUxMID8KKyAgICAgICAgICAgICAgICAgICAgbmV4dC0+bU5CTG9nV3JpdGVyIDogbUR1bW15TkJMb2dXcml0ZXIuZ2V0KCk7CisgICAgICAgICAgICBzZXROQkxvZ1dyaXRlcih0bE5CTG9nV3JpdGVyKTsgLy8gRmFzdE1peGVyIGluZm9ybXMgaXRzIEF1ZGlvTWl4ZXIsIEZhc3RDYXB0dXJlIGlnbm9yZXMKIAogICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBhbHdheXMgaGF2ZSBhIHZhbGlkIHJlZmVyZW5jZSB0byB0aGUgcHJldmlvdXMgKG5vbi1pZGxlKSBzdGF0ZS4KICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHRoZSBzdGF0ZSBxdWV1ZSBvbmx5IGd1YXJhbnRlZXMgYWNjZXNzIHRvIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0YXRlcy4KQEAgLTI2MCw2ICsyNTksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbUlzV2FybSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tTWVhc3VyZWRXYXJtdXBUcyA9IG1NZWFzdXJlZFdhcm11cFRzOwogICAgICAgICAgICAgICAgICAgICAgICAgbUR1bXBTdGF0ZS0+bVdhcm11cEN5Y2xlcyA9IG1XYXJtdXBDeWNsZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgbWVhc3VyZWRXYXJtdXBNcyA9IChtTWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgKiAxZTMpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgKiAxZS02KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR19XQVJNVVBfVElNRShtZWFzdXJlZFdhcm11cE1zKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtU2xlZXBOcyA9IC0xOwpAQCAtMjcwLDYgKzI3Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigidW5kZXJydW46IHRpbWUgc2luY2UgbGFzdCBjeWNsZSAlZC4lMDNsZCBzZWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBzZWMsIG5zZWMgLyAxMDAwMDAwTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tVW5kZXJydW5zKys7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dfVU5ERVJSVU4oYXVkaW9fdXRpbHNfbnNfZnJvbV90aW1lc3BlYygmbmV3VHMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1JZ25vcmVOZXh0T3ZlcnJ1biA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnNlYyA8IG1PdmVycnVuTnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSWdub3JlTmV4dE92ZXJydW4pIHsKQEAgLTI3OSw2ICsyODIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJvdmVycnVuOiB0aW1lIHNpbmNlIGxhc3QgY3ljbGUgJWQuJTAzbGQgc2VjIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHNlYywgbnNlYyAvIDEwMDAwMDBMKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tT3ZlcnJ1bnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dfT1ZFUlJVTihhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZuZXdUcykpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBmb3JjZXMgYSBtaW5pbXVtIGN5Y2xlIHRpbWUuIEl0OgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gIC0gY29tcGVuc2F0ZXMgZm9yIGFuIGF1ZGlvIEhBTCB3aXRoIGppdHRlciBkdWUgdG8gc2FtcGxlIHJhdGUgY29udmVyc2lvbgpAQCAtMzM5LDYgKzM0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIHN0b3JlcyAjMSwgIzIsICMzIGFyZSBub3QgYXRvbWljIHdpdGggcmVzcGVjdCB0byBlYWNoIG90aGVyLAogICAgICAgICAgICAgICAgICAgICAvLyBvciB3aXRoIHJlc3BlY3QgdG8gc3RvcmUgIzQgYmVsb3cKICAgICAgICAgICAgICAgICAgICAgbUR1bXBTdGF0ZS0+bU1vbm90b25pY05zW2ldID0gbW9ub3RvbmljTnM7CisgICAgICAgICAgICAgICAgICAgIExPR19XT1JLX1RJTUUobW9ub3RvbmljTnMpOwogICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tTG9hZE5zW2ldID0gbG9hZE5zOwogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwogICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tQ3B1a0h6W2ldID0ga0h6OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmgKaW5kZXggMmE3MTQxNC4uM2Y2YjIwNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oCkBAIC03OCwxMiArNzgsMTEgQEAKICAgICB1bnNpZ25lZCAgICAgICAgbUNvbGRHZW47ICAgICAgIC8vIGxhc3Qgb2JzZXJ2ZWQgbUNvbGRHZW4KICAgICBib29sICAgICAgICAgICAgbUlzV2FybTsgICAgICAgIC8vIHRydWUgbWVhbnMgcmVhZHkgdG8gbWl4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsc2UgbWVhbnMgd2FpdCBmb3Igd2FybXVwIGJlZm9yZSBtaXhpbmcKLSAgICBzdHJ1Y3QgdGltZXNwZWMgbU1lYXN1cmVkV2FybXVwVHM7ICAvLyBob3cgbG9uZyBkaWQgaXQgdGFrZSBmb3Igd2FybXVwIHRvIGNvbXBsZXRlCi0gICAgdWludDMyX3QgICAgICAgIG1XYXJtdXBDeWNsZXM7ICAvLyBjb3VudGVyIG9mIG51bWJlciBvZiBsb29wIGN5Y2xlcyBkdXJpbmcgd2FybXVwIHBoYXNlCi0gICAgdWludDMyX3QgICAgICAgIG1XYXJtdXBDb25zZWN1dGl2ZUluUmFuZ2VDeWNsZXM7ICAgIC8vIG51bWJlciBvZiBjb25zZWN1dGl2ZSBjeWNsZXMgaW4gcmFuZ2UKLSAgICBOQkxvZzo6V3JpdGVyICAgbUR1bW15TkJMb2dXcml0ZXI7Ci0gICAgTkJMb2c6OldyaXRlciogIG1OQkxvZ1dyaXRlcjsgICAvLyBhbHdheXMgbm9uLW51bGxwdHI6IHJlYWwgTkJMb2c6OldyaXRlciogb3IgJm1EdW1teU5CTG9nV3JpdGVyCi0gICAgc3RhdHVzX3QgICAgICAgIG1UaW1lc3RhbXBTdGF0dXM7CisgICAgc3RydWN0IHRpbWVzcGVjICAgbU1lYXN1cmVkV2FybXVwVHM7ICAvLyBob3cgbG9uZyBkaWQgaXQgdGFrZSBmb3Igd2FybXVwIHRvIGNvbXBsZXRlCisgICAgdWludDMyX3QgICAgICAgICAgbVdhcm11cEN5Y2xlczsgIC8vIGNvdW50ZXIgb2YgbnVtYmVyIG9mIGxvb3AgY3ljbGVzIGR1cmluZyB3YXJtdXAgcGhhc2UKKyAgICB1aW50MzJfdCAgICAgICAgICBtV2FybXVwQ29uc2VjdXRpdmVJblJhbmdlQ3ljbGVzOyAgICAvLyBudW1iZXIgb2YgY29uc2VjdXRpdmUgY3ljbGVzIGluIHJhbmdlCisgICAgY29uc3Qgc3A8TkJMb2c6OldyaXRlcj4gbUR1bW15TkJMb2dXcml0ZXJ7bmV3IE5CTG9nOjpXcml0ZXIoKX07CisgICAgc3RhdHVzX3QgICAgICAgICAgbVRpbWVzdGFtcFN0YXR1czsKIAogICAgIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZCBtQ29tbWFuZDsKICAgICBib29sICAgICAgICAgICAgbUF0dGVtcHRlZFdyaXRlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9NbWFwVHJhY2tzLmgKaW5kZXggNmY1NDZjMy4uOTY4ZDVhYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oCkBAIC0yOCw2ICsyOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc091dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CkBAIC0zOSw4ICs0MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24pOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgc3RvcCgpOwogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNEaXJlY3QoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CiAKLSAgICAgc3RhdGljIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3RlY3RlZCBieSBNTWFwVGhyZWFkOjptTG9jawpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL05CQUlPX1RlZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTkJBSU9fVGVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzA4M2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL05CQUlPX1RlZS5jcHAKQEAgLTAsMCArMSw1MTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk5CQUlPX1RlZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZnV0dXJlPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc25kZmlsZS5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGVSZWFkZXIuaD4KKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJOQkFJT19UZWUuaCIKKworLy8gRW5hYmxlZCB3aXRoIFRFRV9TSU5LIGluIENvbmZpZ3VyYXRpb24uaAorI2lmZGVmIFRFRV9TSU5LCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoKKyBUZWUgZmlsZW5hbWVzIGdlbmVyYXRlZCBhcyBmb2xsb3dzOgorCisgImFmdGVlX0RhdGVfVGhyZWFkSWRfQ19yZWFzb24ud2F2IiBSZWNvcmRUaHJlYWQKKyAiYWZ0ZWVfRGF0ZV9UaHJlYWRJZF9NX3JlYXNvbi53YXYiIE1peGVyVGhyZWFkIChOb3JtYWwpCisgImFmdGVlX0RhdGVfVGhyZWFkSWRfRl9yZWFzb24ud2F2IiBNaXhlclRocmVhZCAoRmFzdCkKKyAiYWZ0ZWVfRGF0ZV9UaHJlYWRJZF9UcmFja0lkX1JfcmVhc29uLndhdiIgUmVjb3JkVHJhY2sKKyAiYWZ0ZWVfRGF0ZV9UaHJlYWRJZF9UcmFja0lkX1RyYWNrTmFtZV9UX3JlYXNvbi53YXYiIFBsYXliYWNrVHJhY2sKKworIHdoZXJlIERhdGUgPSBZWVlZbW1kZF9ISE1NU1NfTVNFQworCisgd2hlcmUgUmVhc29uID0gWyBEVE9SIHwgRFVNUCB8IFJFTU9WRSBdCisKKyBFeGFtcGxlczoKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODExXzAzOF8xM181N18yX1RfUkVNT1ZFLndhdgorICBhZnRlZV8yMDE4MDQyNF8xNTM4MTFfMjE4XzEzXzU3XzJfVF9SRU1PVkUud2F2CisgIGFmdGVlXzIwMTgwNDI0XzE1MzgxMV8zNzhfMTNfNTdfMl9UX1JFTU9WRS53YXYKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODI1XzE0N182Ml9DX0RVTVAud2F2CisgIGFmdGVlXzIwMTgwNDI0XzE1MzgyNV8xNDhfNjJfNTlfUl9EVU1QLndhdgorICBhZnRlZV8yMDE4MDQyNF8xNTM4MjVfMTQ5XzEzX0ZfRFVNUC53YXYKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODQyXzEyNV82Ml81OV9SX1JFTU9WRS53YXYKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODQyXzE2OF82Ml9DX0RUT1Iud2F2CisqLworCitzdGF0aWMgY29uc3RleHByIGNoYXIgREVGQVVMVF9QUkVGSVhbXSA9ICJhZnRlZV8iOworc3RhdGljIGNvbnN0ZXhwciBjaGFyIERFRkFVTFRfRElSRUNUT1JZW10gPSAiL2RhdGEvbWlzYy9hdWRpb3NlcnZlciI7CitzdGF0aWMgY29uc3RleHByIHNpemVfdCBERUZBVUxUX1RIUkVBRFBPT0xfU0laRSA9IDg7CisKKy8qKiBBdWRpb0ZpbGVIYW5kbGVyIG1hbmFnZXMgdGVtcG9yYXJ5IGF1ZGlvIHdhdiBmaWxlcyB3aXRoIGEgbGVhc3QgcmVjZW50bHkgY3JlYXRlZAorICAgIHJldGVudGlvbiBwb2xpY3kuCisKKyAgICBUaGUgdGVtcG9yYXJ5IGZpbGVuYW1lcyBhcmUgc3lzdGVtYXRpY2FsbHkgZ2VuZXJhdGVkLiBBIGNvbW1vbiBmaWxlbmFtZSBwcmVmaXgsCisgICAgc3RvcmFnZSBkaXJlY3RvcnksIGFuZCBjb25jdXJyZW5jeSBwb29sIGFyZSBwYXNzZWQgaW4gb24gY3JlYXRpbmcgdGhlIG9iamVjdC4KKworICAgIFRlbXBvcmFyeSBmaWxlcyBhcmUgY3JlYXRlZCBieSAiY3JlYXRlIiwgd2hpY2ggcmV0dXJucyBhIGZpbGVuYW1lIGdlbmVyYXRlZCBieQorCisgICAgcHJlZml4ICsgMTQgY2hhciBkYXRlICsgc3VmZml4CisKKyAgICBUT0RPIE1vdmUgdG8gYXVkaW9fdXRpbHMuCisgICAgVE9ETyBBdm9pZCBwb2ludGluZyB0d28gQXVkaW9GaWxlSGFuZGxlcnMgdG8gdGhlIHNhbWUgZGlyZWN0b3J5IGFuZCBwcmVmaXgKKyAgICBhcyB3ZSBkb24ndCBoYXZlIGEgcHJlZml4IHNwZWNpZmljIGxvY2sgZmlsZS4gKi8KKworY2xhc3MgQXVkaW9GaWxlSGFuZGxlciB7CitwdWJsaWM6CisKKyAgICBBdWRpb0ZpbGVIYW5kbGVyKGNvbnN0IHN0ZDo6c3RyaW5nICZwcmVmaXgsIGNvbnN0IHN0ZDo6c3RyaW5nICZkaXJlY3RvcnksIHNpemVfdCBwb29sKQorICAgICAgICA6IG1UaHJlYWRQb29sKHBvb2wpCisgICAgICAgICwgbVByZWZpeChwcmVmaXgpCisgICAgeworICAgICAgICAodm9pZClzZXREaXJlY3RvcnkoZGlyZWN0b3J5KTsKKyAgICB9CisKKyAgICAvKiogcmV0dXJucyBmaWxlbmFtZSBvZiBjcmVhdGVkIGF1ZGlvIGZpbGUsIGVsc2UgZW1wdHkgc3RyaW5nIG9uIGZhaWx1cmUuICovCisgICAgc3RkOjpzdHJpbmcgY3JlYXRlKAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzc2l6ZV90IC8qIGZyYW1lc19yZWFkICovCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqIC8qIGJ1ZmZlciAqLywgc2l6ZV90IC8qIHNpemVfaW5fZnJhbWVzICovKT4gcmVhZGVyLAorICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdWZmaXgpOworCitwcml2YXRlOgorICAgIC8qKiBzZXRzIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gdGhpcyBpcyBjdXJyZW50bHkgcHJpdmF0ZSB0byBhdm9pZCBjb25mdXNpb24KKyAgICAgICAgd2hlbiBjaGFuZ2luZyB3aGlsZSBwZW5kaW5nIG9wZXJhdGlvbnMgYXJlIG9jY3VycmluZyAoaXQncyBva2F5LCBidXQKKyAgICAgICAgd2Vha2x5IHN5bmNocm9uaXplZCkuICovCisgICAgc3RhdHVzX3Qgc2V0RGlyZWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nICZkaXJlY3RvcnkpOworCisgICAgLyoqIGNsZWFucyBjdXJyZW50IGRpcmVjdG9yeSBhbmQgcmV0dXJucyB0aGUgZGlyZWN0b3J5IG5hbWUgZG9uZS4gKi8KKyAgICBzdGF0dXNfdCBjbGVhbihzdGQ6OnN0cmluZyAqZGlyID0gbnVsbHB0cik7CisKKyAgICAvKiogY3JlYXRlcyBhbiBhdWRpbyBmaWxlIGZyb20gYSByZWFkZXIgZnVuY3RvciBwYXNzZWQgaW4uICovCisgICAgc3RhdHVzX3QgY3JlYXRlSW50ZXJuYWwoCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNzaXplX3QgLyogZnJhbWVzX3JlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICogLyogYnVmZmVyICovLCBzaXplX3QgLyogc2l6ZV9pbl9mcmFtZXMgKi8pPiByZWFkZXIsCisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lKTsKKworICAgIHN0YXRpYyBib29sIGlzRGlyZWN0b3J5VmFsaWQoY29uc3Qgc3RkOjpzdHJpbmcgJmRpcmVjdG9yeSkgeworICAgICAgICByZXR1cm4gZGlyZWN0b3J5LnNpemUoKSA+IDAgJiYgZGlyZWN0b3J5WzBdID09ICcvJzsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBnZW5lcmF0ZUZpbGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZzdWZmaXgpIGNvbnN0IHsKKyAgICAgICAgY2hhciBmaWxlVGltZVtzaXplb2YoIllZWVltbWRkX0hITU1TU19cMCIpXTsKKyAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworICAgICAgICBzdHJ1Y3QgdG0gdG07CisgICAgICAgIGxvY2FsdGltZV9yKCZ0di50dl9zZWMsICZ0bSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RyZnRpbWUoZmlsZVRpbWUsIHNpemVvZihmaWxlVGltZSksICIlWSVtJWRfJUglTSVTXyIsICZ0bSkgPT0gMCwKKyAgICAgICAgICAgICJpbmNvcnJlY3QgZmlsZVRpbWUgYnVmZmVyIik7CisgICAgICAgIGNoYXIgbXNlY1s0XTsKKyAgICAgICAgKHZvaWQpc25wcmludGYobXNlYywgc2l6ZW9mKG1zZWMpLCAiJTAzZCIsIChpbnQpKHR2LnR2X3VzZWMgLyAxMDAwKSk7CisgICAgICAgIHJldHVybiBtUHJlZml4ICsgZmlsZVRpbWUgKyBtc2VjICsgc3VmZml4ICsgIi53YXYiOworICAgIH0KKworICAgIGJvb2wgaXNNYW5hZ2VkRmlsZW5hbWUoY29uc3QgY2hhciAqbmFtZSkgeworICAgICAgICBjb25zdGV4cHIgc2l6ZV90IEZJTEVOQU1FX0xFTl9EQVRFID0gNCArIDIgKyAyIC8vICVZJW0lZCUKKyAgICAgICAgICAgICsgMSArIDIgKyAyICsgMiAvLyBfSCVNJVMKKyAgICAgICAgICAgICsgMSArIDM7IC8vX01TRUMKKyAgICAgICAgY29uc3Qgc2l6ZV90IHByZWZpeExlbiA9IG1QcmVmaXguc2l6ZSgpOworICAgICAgICBjb25zdCBzaXplX3QgbmFtZUxlbiA9IHN0cmxlbihuYW1lKTsKKworICAgICAgICAvLyByZWplY3Qgb24gc2l6ZSwgcHJlZml4LCBhbmQgLndhdgorICAgICAgICBpZiAobmFtZUxlbiA8IHByZWZpeExlbiArIEZJTEVOQU1FX0xFTl9EQVRFICsgNCAvKiAud2F2ICovCisgICAgICAgICAgICAgfHwgc3RybmNtcChuYW1lLCBtUHJlZml4LmNfc3RyKCksIHByZWZpeExlbikgIT0gMAorICAgICAgICAgICAgIHx8IHN0cmNtcChuYW1lICsgbmFtZUxlbiAtIDQsICIud2F2IikgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmFsaWRhdGUgZGF0ZSBwb3J0aW9uCisgICAgICAgIGNvbnN0IGNoYXIgKmRhdGUgPSBuYW1lICsgcHJlZml4TGVuOworICAgICAgICByZXR1cm4gc3RkOjphbGxfb2YoZGF0ZSwgZGF0ZSArIDgsIGlzZGlnaXQpCisgICAgICAgICAgICAmJiBkYXRlWzhdID09ICdfJworICAgICAgICAgICAgJiYgc3RkOjphbGxfb2YoZGF0ZSArIDksIGRhdGUgKyAxNSwgaXNkaWdpdCkKKyAgICAgICAgICAgICYmIGRhdGVbMTVdID09ICdfJworICAgICAgICAgICAgJiYgc3RkOjphbGxfb2YoZGF0ZSArIDE2LCBkYXRlICsgMTksIGlzZGlnaXQpOworICAgIH0KKworICAgIC8vIHlldCBhbm90aGVyIFRocmVhZFBvb2wgaW1wbGVtZW50YXRpb24uCisgICAgY2xhc3MgVGhyZWFkUG9vbCB7CisgICAgcHVibGljOgorICAgICAgICBUaHJlYWRQb29sKHNpemVfdCBzaXplKQorICAgICAgICAgICAgOiBtVGhyZWFkUG9vbFNpemUoc2l6ZSkKKyAgICAgICAgeyB9CisKKyAgICAgICAgLyoqIGxhdW5jaGVzIHRhc2sgIm5hbWUiIHdpdGggYXNzb2NpYXRlZCBmdW5jdGlvbiAiZnVuYyIuCisgICAgICAgICAgICBpZiB0aGUgdGhyZWFkcG9vbCBpcyBleGhhdXN0ZWQsIGl0IHdpbGwgbGF1bmNoIG9uIGNhbGxpbmcgZnVuY3Rpb24gKi8KKyAgICAgICAgc3RhdHVzX3QgbGF1bmNoKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KCk+IGZ1bmMpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6cGFpcjwKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZywgc3RkOjpmdXR1cmU8c3RhdHVzX3Q+Pj4gbUZ1dHVyZXM7IC8vIEdVQVJERURfQlkobUxvY2spCisKKyAgICAgICAgY29uc3Qgc2l6ZV90IG1UaHJlYWRQb29sU2l6ZTsKKyAgICB9IG1UaHJlYWRQb29sOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbVByZWZpeDsKKyAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6c3RyaW5nIG1EaXJlY3Rvcnk7ICAgICAgICAgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICBzdGQ6OmRlcXVlPHN0ZDo6c3RyaW5nPiBtRmlsZXM7IC8vIEdVQVJERURfQlkobUxvY2spICBzb3J0ZWQgbGlzdCBvZiBmaWxlcyBieSBjcmVhdGlvbiB0aW1lCisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBGUkFNRVNfUEVSX1JFQUQgPSAxMDI0OworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IE1BWF9GSUxFU19SRUFEID0gMTAyNDsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBNQVhfRklMRVNfS0VFUCA9IDMyOworfTsKKworLyogc3RhdGljICovCit2b2lkIE5CQUlPX1RlZTo6TkJBSU9fVGVlSW1wbDo6ZHVtcFRlZSgKKyAgICAgICAgaW50IGZkLCBjb25zdCBOQkFJT19TaW5rU291cmNlICZzaW5rU291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyAmc3VmZml4KQoreworICAgIC8vIFNpbmdsZXRvbi4gQ29uc3RydWN0ZWQgdGhyZWFkLXNhZmUgb24gZmlyc3QgY2FsbCwgbmV2ZXIgZGVzdHJveWVkLgorICAgIHN0YXRpYyBBdWRpb0ZpbGVIYW5kbGVyIGF1ZGlvRmlsZUhhbmRsZXIoCisgICAgICAgICAgICBERUZBVUxUX1BSRUZJWCwgREVGQVVMVF9ESVJFQ1RPUlksIERFRkFVTFRfVEhSRUFEUE9PTF9TSVpFKTsKKworICAgIGF1dG8gJnNvdXJjZSA9IHNpbmtTb3VyY2Uuc2Vjb25kOworICAgIGlmIChzb3VyY2UuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IHNvdXJjZS0+Zm9ybWF0KCk7CisgICAgYm9vbCBmaXJzdFJlYWQgPSB0cnVlOworICAgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lID0gYXVkaW9GaWxlSGFuZGxlci5jcmVhdGUoCisgICAgICAgICAgICAvLyB0aGlzIGZ1bmN0b3IgbXVzdCBub3QgaG9sZCByZWZlcmVuY2VzIHRvIHN0YWNrCisgICAgICAgICAgICBbZmlyc3RSZWFkLCBzaW5rU291cmNlXSAodm9pZCAqYnVmZmVyLCBzaXplX3QgZnJhbWVzKSBtdXRhYmxlIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byAmc291cmNlID0gc2lua1NvdXJjZS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgYWN0dWFsUmVhZCA9IHNvdXJjZS0+cmVhZChidWZmZXIsIGZyYW1lcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWxSZWFkID09IChzc2l6ZV90KU9WRVJSVU4gJiYgZmlyc3RSZWFkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNoZWNrIG9uY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFJlYWQgPSBzb3VyY2UtPnJlYWQoYnVmZmVyLCBmcmFtZXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZpcnN0UmVhZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWN0dWFsUmVhZDsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgRm9ybWF0X3NhbXBsZVJhdGUoZm9ybWF0KSwKKyAgICAgICAgICAgIEZvcm1hdF9jaGFubmVsQ291bnQoZm9ybWF0KSwKKyAgICAgICAgICAgIGZvcm1hdC5tRm9ybWF0LAorICAgICAgICAgICAgc3VmZml4KTsKKworICAgIGlmIChmZCA+PSAwICYmIGZpbGVuYW1lLnNpemUoKSA+IDApIHsKKyAgICAgICAgZHByaW50ZihmZCwgInRlZSB3cm90ZSB0byAlc1xuIiwgZmlsZW5hbWUuY19zdHIoKSk7CisgICAgfQorfQorCisvKiBzdGF0aWMgKi8KK05CQUlPX1RlZTo6TkJBSU9fVGVlSW1wbDo6TkJBSU9fU2lua1NvdXJjZSBOQkFJT19UZWU6Ok5CQUlPX1RlZUltcGw6Om1ha2VTaW5rU291cmNlKAorICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgJmZvcm1hdCwgc2l6ZV90IGZyYW1lcywgYm9vbCAqZW5hYmxlZCkKK3sKKyAgICBpZiAoRm9ybWF0X2lzVmFsaWQoZm9ybWF0KSAmJiBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdC5tRm9ybWF0KSkgeworICAgICAgICBQaXBlICpwaXBlID0gbmV3IFBpcGUoZnJhbWVzLCBmb3JtYXQpOworICAgICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7CisgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Zm9ybWF0fTsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IHBpcGUtPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOworICAgICAgICBpZiAoaW5kZXggIT0gMCkgeworICAgICAgICAgICAgQUxPR1coInBpcGUgZmFpbHVyZSB0byBuZWdvdGlhdGU6ICV6ZCIsIGluZGV4KTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBQaXBlUmVhZGVyICpwaXBlUmVhZGVyID0gbmV3IFBpcGVSZWFkZXIoKnBpcGUpOworICAgICAgICBudW1Db3VudGVyT2ZmZXJzID0gMDsKKyAgICAgICAgaW5kZXggPSBwaXBlUmVhZGVyLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKKyAgICAgICAgaWYgKGluZGV4ICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJwaXBlUmVhZGVyIGZhaWx1cmUgdG8gbmVnb3RpYXRlOiAlemQiLCBpbmRleCk7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuYWJsZWQgIT0gbnVsbHB0cikgKmVuYWJsZWQgPSB0cnVlOworICAgICAgICByZXR1cm4ge3BpcGUsIHBpcGVSZWFkZXJ9OworICAgIH0KK2V4aXQ6CisgICAgaWYgKGVuYWJsZWQgIT0gbnVsbHB0cikgKmVuYWJsZWQgPSBmYWxzZTsKKyAgICByZXR1cm4ge251bGxwdHIsIG51bGxwdHJ9OworfQorCitzdGQ6OnN0cmluZyBBdWRpb0ZpbGVIYW5kbGVyOjpjcmVhdGUoCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3NpemVfdCAvKiBmcmFtZXNfcmVhZCAqLworICAgICAgICAgICAgICAgICAgICAodm9pZCAqIC8qIGJ1ZmZlciAqLywgc2l6ZV90IC8qIHNpemVfaW5fZnJhbWVzICovKT4gcmVhZGVyLAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN1ZmZpeCkKK3sKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IGdlbmVyYXRlRmlsZW5hbWUoc3VmZml4KTsKKworICAgIGlmIChtVGhyZWFkUG9vbC5sYXVuY2goc3RkOjpzdHJpbmcoImNyZWF0ZSAiKSArIGZpbGVuYW1lLAorICAgICAgICAgICAgWz1dKCkgeyByZXR1cm4gY3JlYXRlSW50ZXJuYWwocmVhZGVyLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGZvcm1hdCwgZmlsZW5hbWUpOyB9KQorICAgICAgICAgICAgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lOworICAgIH0KKyAgICByZXR1cm4gIiI7Cit9CisKK3N0YXR1c190IEF1ZGlvRmlsZUhhbmRsZXI6OnNldERpcmVjdG9yeShjb25zdCBzdGQ6OnN0cmluZyAmZGlyZWN0b3J5KQoreworICAgIGlmICghaXNEaXJlY3RvcnlWYWxpZChkaXJlY3RvcnkpKSByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgLy8gVE9ETzogY29uc2lkZXIgdXNpbmcgc3RkOjpmaWxlc3lzdGVtIGluIEMrKzE3CisgICAgRElSICpkaXIgPSBvcGVuZGlyKGRpcmVjdG9yeS5jX3N0cigpKTsKKworICAgIGlmIChkaXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXM6IGNhbm5vdCBvcGVuIGRpcmVjdG9yeSAlcyIsIF9fZnVuY19fLCBkaXJlY3RvcnkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc2l6ZV90IHRvUmVtb3ZlID0gMDsKKyAgICBkZWNsdHlwZShtRmlsZXMpIGZpbGVzOworCisgICAgd2hpbGUgKGZpbGVzLnNpemUoKSA8IE1BWF9GSUxFU19SRUFEKSB7CisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgY29uc3Qgc3RydWN0IGRpcmVudCAqcmVzdWx0ID0gcmVhZGRpcihkaXIpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dXX0lGKGVycm5vICE9IDAsICIlczogcmVhZGRpciBmYWlsdXJlICVzIiwgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBpcyBpdCBhIG1hbmFnZWQgZmlsZW5hbWU/CisgICAgICAgIGlmICghaXNNYW5hZ2VkRmlsZW5hbWUocmVzdWx0LT5kX25hbWUpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmaWxlcy5lbXBsYWNlX2JhY2socmVzdWx0LT5kX25hbWUpOworICAgIH0KKyAgICAodm9pZCljbG9zZWRpcihkaXIpOworCisgICAgLy8gT1BUSU1JWkFUSU9OOiB3ZSBkb24ndCBuZWVkIHRvIHN0YXQgZWFjaCBmaWxlLCB0aGUgZmlsZW5hbWVzIG5hbWVzIGFyZQorICAgIC8vIGFscmVhZHkgKHJvdWdobHkpIG9yZGVyZWQgYnkgY3JlYXRpb24gZGF0ZS4gIHdlIHVzZSBzdGQ6OmRlcXVlIGluc3RlYWQKKyAgICAvLyBvZiBzdGQ6OnNldCBmb3IgZmFzdGVyIGluc2VydGlvbiBhbmQgc29ydGluZyB0aW1lcy4KKworICAgIGlmIChmaWxlcy5zaXplKCkgPiBNQVhfRklMRVNfS0VFUCkgeworICAgICAgICAvLyByZW1vdmVkIGZpbGVzIGNhbiB1c2UgYSBwYXJ0aXRpb24gKG5vIG5lZWQgdG8gZG8gYSBmdWxsIHNvcnQpLgorICAgICAgICB0b1JlbW92ZSA9IGZpbGVzLnNpemUoKSAtIE1BWF9GSUxFU19LRUVQOworICAgICAgICBzdGQ6Om50aF9lbGVtZW50KGZpbGVzLmJlZ2luKCksIGZpbGVzLmJlZ2luKCkgKyB0b1JlbW92ZSAtIDEsIGZpbGVzLmVuZCgpKTsKKyAgICB9CisKKyAgICAvLyBrZXB0IGZpbGVzIG11c3QgYmUgc29ydGVkLgorICAgIHN0ZDo6c29ydChmaWxlcy5iZWdpbigpICsgdG9SZW1vdmUsIGZpbGVzLmVuZCgpKTsKKworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKworICAgICAgICBtRGlyZWN0b3J5ID0gZGlyZWN0b3J5OworICAgICAgICBtRmlsZXMgPSBzdGQ6Om1vdmUoZmlsZXMpOworICAgIH0KKworICAgIGlmICh0b1JlbW92ZSA+IDApIHsgLy8gbGF1bmNoIGEgY2xlYW4gaW4gYmFja2dyb3VuZC4KKyAgICAgICAgKHZvaWQpbVRocmVhZFBvb2wubGF1bmNoKAorICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJjbGVhbmluZyAiKSArIGRpcmVjdG9yeSwgW3RoaXNdKCkgeyByZXR1cm4gY2xlYW4oKTsgfSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9GaWxlSGFuZGxlcjo6Y2xlYW4oc3RkOjpzdHJpbmcgKmRpcmVjdG9yeSkKK3sKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZmlsZXNUb1JlbW92ZTsKKyAgICBzdGQ6OnN0cmluZyBkaXI7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworCisgICAgICAgIGlmICghaXNEaXJlY3RvcnlWYWxpZChtRGlyZWN0b3J5KSkgcmV0dXJuIE5PX0lOSVQ7CisKKyAgICAgICAgZGlyID0gbURpcmVjdG9yeTsKKyAgICAgICAgaWYgKG1GaWxlcy5zaXplKCkgPiBNQVhfRklMRVNfS0VFUCkgeworICAgICAgICAgICAgc2l6ZV90IHRvUmVtb3ZlID0gbUZpbGVzLnNpemUoKSAtIE1BWF9GSUxFU19LRUVQOworCisgICAgICAgICAgICAvLyB1c2UgbW92ZSBhbmQgZXJhc2UgdG8gZWZmaWNpZW50bHkgdHJhbnNmZXIgc3RkOjpzdHJpbmcKKyAgICAgICAgICAgIHN0ZDo6bW92ZShtRmlsZXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgbUZpbGVzLmJlZ2luKCkgKyB0b1JlbW92ZSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKGZpbGVzVG9SZW1vdmUpKTsKKyAgICAgICAgICAgIG1GaWxlcy5lcmFzZShtRmlsZXMuYmVnaW4oKSwgbUZpbGVzLmJlZ2luKCkgKyB0b1JlbW92ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBkaXJwID0gZGlyICsgIi8iOworICAgIC8vIHJlbW92ZSBmaWxlcyBvdXRzaWRlIG9mIGxvY2sgZm9yIGJldHRlciBjb25jdXJyZW5jeS4KKyAgICBmb3IgKGNvbnN0IGF1dG8gJmZpbGUgOiBmaWxlc1RvUmVtb3ZlKSB7CisgICAgICAgICh2b2lkKXVubGluaygoZGlycCArIGZpbGUpLmNfc3RyKCkpOworICAgIH0KKworICAgIC8vIHJldHVybiB0aGUgZGlyZWN0b3J5IGlmIHJlcXVlc3RlZC4KKyAgICBpZiAoZGlyZWN0b3J5ICE9IG51bGxwdHIpIHsKKyAgICAgICAgKmRpcmVjdG9yeSA9IGRpcjsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb0ZpbGVIYW5kbGVyOjpUaHJlYWRQb29sOjpsYXVuY2goCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KCk+IGZ1bmMpCit7CisgICAgaWYgKG1UaHJlYWRQb29sU2l6ZSA+IDEpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1GdXR1cmVzLnNpemUoKSA+PSBtVGhyZWFkUG9vbFNpemUpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IG1GdXR1cmVzLmJlZ2luKCk7IGl0ICE9IG1GdXR1cmVzLmVuZCgpOykgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlbmFtZSA9IGl0LT5maXJzdDsKKyAgICAgICAgICAgICAgICBzdGQ6OmZ1dHVyZTxzdGF0dXNfdD4gJmZ1dHVyZSA9IGl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgaWYgKCFmdXR1cmUudmFsaWQoKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlLndhaXRfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDApKSA9PSBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogZnV0dXJlICVzIHJlYWR5IiwgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBpdCA9IG1GdXR1cmVzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IGZ1dHVyZSAlcyBub3QgcmVhZHkiLCBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtRnV0dXJlcy5zaXplKCkgPCBtVGhyZWFkUG9vbFNpemUpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogZGVmZXJyZWQgY2FsbGluZyAlcyIsIF9fZnVuY19fLCBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgbUZ1dHVyZXMuZW1wbGFjZV9iYWNrKG5hbWUsIHN0ZDo6YXN5bmMoc3RkOjpsYXVuY2g6OmFzeW5jLCBmdW5jKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIiVzOiBpbW1lZGlhdGUgY2FsbGluZyAlcyIsIF9fZnVuY19fLCBuYW1lLmNfc3RyKCkpOworICAgIHJldHVybiBmdW5jKCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmlsZUhhbmRsZXI6OmNyZWF0ZUludGVybmFsKAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNzaXplX3QgLyogZnJhbWVzX3JlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiAvKiBidWZmZXIgKi8sIHNpemVfdCAvKiBzaXplX2luX2ZyYW1lcyAqLyk+IHJlYWRlciwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlbmFtZSkKK3sKKyAgICAvLyBBdHRlbXB0IHRvIGNob29zZSB0aGUgYmVzdCBtYXRjaGluZyBmaWxlIGZvcm1hdC4KKyAgICAvLyBXZSBjYW4gY2hvb3NlIGFueSBzZl9mb3JtYXQKKyAgICAvLyBidXQgd3JpdGVGb3JtYXQgbXVzdCBiZSBvbmUgb2YgMTYsIDMyLCBmbG9hdAorICAgIC8vIGR1ZSB0byBzZl93cml0ZWYgY29tcGF0aWJpbGl0eS4KKyAgICBpbnQgc2ZfZm9ybWF0OworICAgIGF1ZGlvX2Zvcm1hdF90IHdyaXRlRm9ybWF0OworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzhfQklUOgorICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgIHNmX2Zvcm1hdCA9IFNGX0ZPUk1BVF9QQ01fMTY7CisgICAgICAgIHdyaXRlRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIEFMT0dWKCIlczogJXMgdXNpbmcgUENNXzE2IGZvciBmb3JtYXQgJSN4IiwgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCksIGZvcm1hdCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVDoKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDoKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOgorICAgICAgICBzZl9mb3JtYXQgPSBTRl9GT1JNQVRfUENNXzMyOworICAgICAgICB3cml0ZUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOworICAgICAgICBBTE9HVigiJXM6ICVzIHVzaW5nIFBDTV8zMiBmb3IgZm9ybWF0ICUjeCIsIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpLCBmb3JtYXQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgIHNmX2Zvcm1hdCA9IFNGX0ZPUk1BVF9GTE9BVDsKKyAgICAgICAgd3JpdGVGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgICAgICBBTE9HVigiJXM6ICVzIHVzaW5nIFBDTV9GTE9BVCBmb3IgZm9ybWF0ICUjeCIsIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpLCBmb3JtYXQpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAvLyBUT0RPOgorICAgICAgICAvLyBoYW5kbGUgYXVkaW9faGFzX3Byb3BvcnRpb25hbF9mcmFtZXMoKSBmb3JtYXRzLgorICAgICAgICAvLyBoYW5kbGUgY29tcHJlc3NlZCBmb3JtYXRzIGFzIHNpbmdsZSBieXRlIGZpbGVzLgorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGRpcmVjdG9yeTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBjbGVhbigmZGlyZWN0b3J5KTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIHN0ZDo6c3RyaW5nIGRpclByZWZpeCA9IGRpcmVjdG9yeSArICIvIjsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHBhdGggPSBkaXJQcmVmaXggKyBmaWxlbmFtZTsKKworICAgIC8qIGNvbnN0ICovIFNGX0lORk8gaW5mbyA9IHsKKyAgICAgICAgLmZyYW1lcyA9IDAsCisgICAgICAgIC5zYW1wbGVyYXRlID0gKGludClzYW1wbGVSYXRlLAorICAgICAgICAuY2hhbm5lbHMgPSAoaW50KWNoYW5uZWxDb3VudCwKKyAgICAgICAgLmZvcm1hdCA9IFNGX0ZPUk1BVF9XQVYgfCBzZl9mb3JtYXQsCisgICAgfTsKKyAgICBTTkRGSUxFICpzZiA9IHNmX29wZW4ocGF0aC5jX3N0cigpLCBTRk1fV1JJVEUsICZpbmZvKTsKKyAgICBpZiAoc2YgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc2l6ZV90IHRvdGFsID0gMDsKKyAgICB2b2lkICpidWZmZXIgPSBtYWxsb2MoRlJBTUVTX1BFUl9SRUFEICogc3RkOjptYXgoCisgICAgICAgICAgICBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHdyaXRlRm9ybWF0KSwgLy9vdXRwdXQgZnJhbWVzaXplCisgICAgICAgICAgICBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkpKTsgLy8gaW5wdXQgZnJhbWVzaXplCisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIHNmX2Nsb3NlKHNmKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGNvbnN0IHNzaXplX3QgYWN0dWFsUmVhZCA9IHJlYWRlcihidWZmZXIsIEZSQU1FU19QRVJfUkVBRCk7CisgICAgICAgIGlmIChhY3R1YWxSZWFkIDw9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29udmVydCBpbnB1dCBmb3JtYXQgdG8gd3JpdGVGb3JtYXQgYXMgbmVlZGVkLgorICAgICAgICBpZiAoZm9ybWF0ICE9IHdyaXRlRm9ybWF0KSB7CisgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHdyaXRlRm9ybWF0LCBidWZmZXIsIGZvcm1hdCwgYWN0dWFsUmVhZCAqIGluZm8uY2hhbm5lbHMpOworICAgICAgICB9CisKKyAgICAgICAgc3NpemVfdCByZWFsbHlXcml0dGVuOworICAgICAgICBzd2l0Y2ggKHdyaXRlRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICByZWFsbHlXcml0dGVuID0gc2Zfd3JpdGVmX3Nob3J0KHNmLCAoY29uc3QgaW50MTZfdCAqKWJ1ZmZlciwgYWN0dWFsUmVhZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDoKKyAgICAgICAgICAgIHJlYWxseVdyaXR0ZW4gPSBzZl93cml0ZWZfaW50KHNmLCAoY29uc3QgaW50MzJfdCAqKWJ1ZmZlciwgYWN0dWFsUmVhZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgcmVhbGx5V3JpdHRlbiA9IHNmX3dyaXRlZl9mbG9hdChzZiwgKGNvbnN0IGZsb2F0ICopYnVmZmVyLCBhY3R1YWxSZWFkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXM6ICVzIHdyaXRlRm9ybWF0OiAlI3giLCBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSwgd3JpdGVGb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVhbGx5V3JpdHRlbiA8IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogJXMgd3JpdGUgZXJyb3I6ICV6ZCIsIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpLCByZWFsbHlXcml0dGVuKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRvdGFsICs9IHJlYWxseVdyaXR0ZW47CisgICAgICAgIGlmIChyZWFsbHlXcml0dGVuIDwgYWN0dWFsUmVhZCkgeworICAgICAgICAgICAgQUxPR1coIiVzOiAlcyB3cml0ZSBzaG9ydCBjb3VudDogJXpkIDwgJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpLCByZWFsbHlXcml0dGVuLCBhY3R1YWxSZWFkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHNmX2Nsb3NlKHNmKTsKKyAgICBmcmVlKGJ1ZmZlcik7CisgICAgaWYgKHRvdGFsID09IDApIHsKKyAgICAgICAgKHZvaWQpdW5saW5rKHBhdGguY19zdHIoKSk7CisgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgfQorCisgICAgLy8gU3VjY2VzczogYWRkIG91ciBuYW1lIHRvIG1hbmFnZWQgZmlsZXMuCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICAvLyB3ZWFrIHN5bmNocm9uaXphdGlvbiAtIG9ubHkgdXBkYXRlIG1GaWxlcyBpZiB0aGUgZGlyZWN0b3J5IGhhc24ndCBjaGFuZ2VkLgorICAgICAgICBpZiAobURpcmVjdG9yeSA9PSBkaXJlY3RvcnkpIHsKKyAgICAgICAgICAgIG1GaWxlcy5lbXBsYWNlX2JhY2soZmlsZW5hbWUpOyAgLy8gYWRkIHRvIHRoZSBlbmQgdG8gcHJlc2VydmUgc29ydC4KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7IC8vIHJldHVybiBmdWxsIHBhdGgKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gVEVFX1NJTksKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9OQkFJT19UZWUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9OQkFJT19UZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWQ4Y2M4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL05CQUlPX1RlZS5oCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRW5hYmxlZCB3aXRoIFRFRV9TSU5LIGluIENvbmZpZ3VyYXRpb24uaAorI2lmbmRlZiBBTkRST0lEX05CQUlPX1RFRV9ICisjZGVmaW5lIEFORFJPSURfTkJBSU9fVEVFX0gKKworI2lmZGVmIFRFRV9TSU5LCisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVGhlIE5CQUlPX1RlZSB1c2VzIHRoZSBOQkFJTyBQaXBlIGFuZCBQaXBlUmVhZGVyIGZvciBub25ibG9ja2luZworICogZGF0YSBjb2xsZWN0aW9uLCBmb3IgZXZlbnR1YWwgZHVtcCB0byBsb2cgZmlsZXMuCisgKiBTZWUgaHR0cHM6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZGV2aWNlcy9hdWRpby9kZWJ1Z2dpbmcgZm9yIGhvdyB0bworICogZW5hYmxlIGJ5IHJvLmRlYnVnZ2FibGUgYW5kIGFmLnRlZSBwcm9wZXJ0aWVzLgorICoKKyAqIFRoZSB3cml0ZSgpIGludG8gdGhlIE5CQUlPX1RlZSBpcyB0aGVyZWZvcmUgbm9uYmxvY2tpbmcsCisgKiBidXQgY2hhbmdpbmcgTkJBSU9fVGVlIGZvcm1hdHMgd2l0aCBzZXQoKSBjYW5ub3QgYmUgZG9uZSBkdXJpbmcgYSB3cml0ZSgpOworICogdXN1YWxseSB0aGUgY2FsbGVyIGFscmVhZHkgaW1wbGVtZW50cyB0aGlzIG11dHVhbCBleGNsdXNpb24uCisgKgorICogQWxsIG90aGVyIGNhbGxzIGV4Y2VwdCBzZXQoKSB2cyB3cml0ZSgpIG1heSBvY2N1ciBhdCBhbnkgdGltZS4KKyAqCisgKiBkdW1wKCkgZGlzcnVwdGlvbiBpcyBtaW5pbWl6ZWQgdG8gdGhlIGNhbGxlciBzaW5jZSBzeXN0ZW0gY2FsbHMgYXJlIGV4ZWN1dGVkCisgKiBpbiBhbiBhc3luY2hyb25vdXMgdGhyZWFkICh3aGVuIHBvc3NpYmxlKS4KKyAqCisgKiBDdXJyZW50bHkgdGhlIE5CQUlPX1RlZSBpcyAiaGFyZHdpcmVkIiBmb3IgQXVkaW9GbGluZ2VyIHN1cHBvcnQuCisgKgorICogU29tZSBBdWRpb0ZsaW5nZXIgc3BlY2lmaWMgbm90ZXM6CisgKgorICogMSkgVGVlcyBjYXB0dXJlIG9ubHkgbGluZWFyIFBDTSBkYXRhLgorICogMikgVGVlcyB3aXRob3V0IGFueSBkYXRhIHdyaXR0ZW4gYXJlIGNvbnNpZGVyZWQgZW1wdHkgYW5kIGRvIG5vdCBnZW5lcmF0ZQorICogICAgYW55IG91dHB1dCBmaWxlcy4KKyAqIDIpIE9uY2UgYSBUZWUgZHVtcHMgZGF0YSwgaXQgaXMgY29uc2lkZXJlZCAiZW1wdGllZCIgYW5kIG5ldyBkYXRhCisgKiAgICBuZWVkcyB0byBiZSB3cml0dGVuIGJlZm9yZSBhbm90aGVyIFRlZSBmaWxlIGlzIGdlbmVyYXRlZC4KKyAqIDMpIFRlZSBmaWxlIGZvcm1hdCBpcworICogICAgV0FWIGludGVnZXIgUENNIDE2IGJpdCBmb3IgQVVESU9fRk9STUFUX1BDTV84X0JJVCwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCisgKiAgICBXQVYgaW50ZWdlciBQQ00gMzIgYml0IGZvciBBVURJT19GT1JNQVRfUENNXzhfMjRfQklULCBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklULgorICogICAgV0FWIGZsb2F0IFBDTSAzMiBiaXQgZm9yIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQuCisgKgorICogSW5wdXRfVGhyZWFkOgorICogMSkgQ2FwdHVyZSBidWZmZXIgaXMgdGVlZCB3aGVuIHJlYWQgZnJvbSB0aGUgSEFMLCBiZWZvcmUgcmVzYW1wbGluZyBmb3IgdGhlIEF1ZGlvUmVjb3JkCisgKiAgICBjbGllbnQuCisgKgorICogT3V0cHV0X1RocmVhZDoKKyAqIDEpIE1peGVyVGhyZWFkcyB3aWxsIHRlZSBhdCB0aGUgRmFzdE1peGVyIG91dHB1dCAoaWYgaXQgaGFzIG9uZSkgb3IgYXQgdGhlCisgKiAgICBOb3JtYWxNaXhlciBvdXRwdXQgKGlmIG5vIEZhc3RNaXhlcikuCisgKiAyKSBEdXBsaWNhdGluZ1RocmVhZHMgZG8gbm90IHRlZSBhbnkgbWl4ZWQgZGF0YS4gQXBwbHkgYSB0ZWUgb24gdGhlIGRvd25zdHJlYW0gT3V0cHV0VHJhY2sKKyAqICAgIG9yIG9uIHRoZSB1cHN0cmVhbSBwbGF5YmFjayBUcmFja3MuCisgKiAzKSBEaXJlY3RUaHJlYWRzIGFuZCBPZmZsb2FkVGhyZWFkcyBkbyBub3QgdGVlIGFueSBkYXRhLiBUaGUgdXBzdHJlYW0gdHJhY2sKKyAqICAgIChpZiBsaW5lYXIgUENNIGZvcm1hdCkgbWF5IGJlIHRlZWQgdG8gZGlzY292ZXIgZGF0YS4KKyAqIDQpIE1tYXBUaHJlYWRzIGFyZSBub3Qgc3VwcG9ydGVkLgorICoKKyAqIFRyYWNrczoKKyAqIDEpIFJlY29yZFRyYWNrcyBhbmQgcGxheWJhY2sgVHJhY2tzIHRlZSBhcyBkYXRhIGlzIGJlaW5nIHdyaXR0ZW4gdG8gb3IKKyAqICAgIHJlYWQgZnJvbSB0aGUgc2hhcmVkIGNsaWVudC1zZXJ2ZXIgdHJhY2sgYnVmZmVyIGJ5IHRoZSBhc3NvY2lhdGVkIFRocmVhZHMuCisgKiAyKSBUaGUgbWVjaGFuaXNtIGlzIG9uIHRoZSBBdWRpb0J1ZmZlclByb3ZpZGVyIHJlbGVhc2UoKSBzbyBsYXJnZSBzdGF0aWMgVHJhY2sKKyAqICAgIHBsYXliYWNrIG1heSBub3Qgc2hvdyBhbnkgVGVlIGRhdGEgZGVwZW5kaW5nIG9uIHdoZW4gaXQgaXMgcmVsZWFzZWQuCisgKiAzKSBXaGVuIGEgdHJhY2sgYmVjb21lcyBpbmFjdGl2ZSwgdGhlIFRocmVhZCB3aWxsIHRyaWdnZXIgYSBkdW1wLgorICovCisKK2NsYXNzIE5CQUlPX1RlZSB7CitwdWJsaWM6CisgICAgLyogVEVFX0ZMQUcgaXMgdXNlZCBpbiBzZXQoKSBhbmQgbXVzdCBtYXRjaCB0aGUgZmxhZ3MgZm9yIHRoZSBhZi50ZWUgcHJvcGVydHkKKyAgICAgICBnaXZlbiBpbiBodHRwczovL3NvdXJjZS5hbmRyb2lkLmNvbS9kZXZpY2VzL2F1ZGlvL2RlYnVnZ2luZworICAgICovCisgICAgZW51bSBURUVfRkxBRyB7CisgICAgICAgIFRFRV9GTEFHX05PTkUgPSAwLAorICAgICAgICBURUVfRkxBR19JTlBVVF9USFJFQUQgPSAoMSA8PCAwKSwgIC8vIHRyZWF0IGFzIGEgVGVlIGZvciBpbnB1dCAoQ2FwdHVyZSkgVGhyZWFkcworICAgICAgICBURUVfRkxBR19PVVRQVVRfVEhSRUFEID0gKDEgPDwgMSksIC8vIHRyZWF0IGFzIGEgVGVlIGZvciBvdXRwdXQgKFBsYXliYWNrKSBUaHJlYWRzCisgICAgICAgIFRFRV9GTEFHX1RSQUNLID0gKDEgPDwgMiksICAgICAgICAgLy8gdHJlYXQgYXMgYSBUZWUgZm9yIHRyYWNrcyAoUmVjb3JkIGFuZCBQbGF5YmFjaykKKyAgICB9OworCisgICAgTkJBSU9fVGVlKCkKKyAgICAgICAgOiBtVGVlKHN0ZDo6bWFrZV9zaGFyZWQ8TkJBSU9fVGVlSW1wbD4oKSkKKyAgICB7CisgICAgICAgIGdldFJ1bm5pbmdUZWVzKCkuYWRkKG1UZWUpOworICAgIH0KKworICAgIH5OQkFJT19UZWUoKSB7CisgICAgICAgIGdldFJ1bm5pbmdUZWVzKCkucmVtb3ZlKG1UZWUpOworICAgICAgICBkdW1wKC0xLCAiX0RUT1IiKTsgLy8gbG9nIGFueSBkYXRhIHJlbWFpbmluZyBpbiBUZWUuCisgICAgfQorCisgICAgLyoqCisgICAgICogXGJyaWVmIHNldCBpcyB1c2VkIGZvciBkZWZlcnJlZCBjb25maWd1cmF0aW9uIG9mIFRlZS4KKyAgICAgKgorICAgICAqICBNYXkgYmUgY2FsbGVkIGFueXRpbWUgZXhjZXB0IGNvbmN1cnJlbnRseSB3aXRoIHdyaXRlKCkuCisgICAgICoKKyAgICAgKiBccGFyYW0gZm9ybWF0IE5CQUlPX0Zvcm1hdCB1c2VkIHRvIG9wZW4gTkJBSU8gcGlwZXMKKyAgICAgKiBccGFyYW0gZmxhZ3MgKGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RldmljZXMvYXVkaW8vZGVidWdnaW5nKQorICAgICAqICAgICAgICAgICAgICAtIFRFRV9GTEFHX05PTkUgdG8gYnlwYXNzIGFmLnRlZSBwcm9wZXJ0eSBjaGVja3MgKGRlZmF1bHQpOworICAgICAqICAgICAgICAgICAgICAtIFRFRV9GTEFHX0lOUFVUX1RIUkVBRCB0byBjaGVjayBhZi50ZWUgaWYgaW5wdXQgdGhyZWFkIGxvZ2dpbmcgc2V0OworICAgICAqICAgICAgICAgICAgICAtIFRFRV9GTEFHX09VVFBVVF9USFJFQUQgdG8gY2hlY2sgYWYudGVlIGlmIG91dHB1dCB0aHJlYWQgbG9nZ2luZyBzZXQ7CisgICAgICogICAgICAgICAgICAgIC0gVEVFX0ZMQUdfVFJBQ0sgdG8gY2hlY2sgYWYudGVlIGlmIHRyYWNrIGxvZ2dpbmcgc2V0LgorICAgICAqIFxwYXJhbSBmcmFtZXMgbnVtYmVyIG9mIGZyYW1lcyB0byBvcGVuIHRoZSBOQkFJTyBwaXBlIChzZXQgdG8gMCB0byB1c2UgZGVmYXVsdCkuCisgICAgICoKKyAgICAgKiBccmV0dXJuCisgICAgICogICAgICAgICAtIE5PX0VSUk9SIG9uIHN1Y2Nlc3MgKG9yIGZvcm1hdCB1bmNoYW5nZWQpCisgICAgICogICAgICAgICAtIEJBRF9WQUxVRSBpZiBmb3JtYXQgb3IgZmxhZ3MgaW52YWxpZC4KKyAgICAgKiAgICAgICAgIC0gUEVSTUlTU0lPTl9ERU5JRUQgaWYgZmxhZ3Mgbm90IGFsbG93ZWQgYnkgYWYudGVlCisgICAgICovCisKKyAgICBzdGF0dXNfdCBzZXQoY29uc3QgTkJBSU9fRm9ybWF0ICZmb3JtYXQsCisgICAgICAgICAgICBURUVfRkxBRyBmbGFncyA9IFRFRV9GTEFHX05PTkUsIHNpemVfdCBmcmFtZXMgPSAwKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVGVlLT5zZXQoZm9ybWF0LCBmbGFncywgZnJhbWVzKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzZXQodWludDMyX3Qgc2FtcGxlUmF0ZSwgdWludDMyX3QgY2hhbm5lbENvdW50LCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICBURUVfRkxBRyBmbGFncyA9IFRFRV9GTEFHX05PTkUsIHNpemVfdCBmcmFtZXMgPSAwKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVGVlLT5zZXQoRm9ybWF0X2Zyb21fU1JfQyhzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGZvcm1hdCksIGZsYWdzLCBmcmFtZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFxicmllZiB3cml0ZSBkYXRhIHRvIHRoZSB0ZWUuCisgICAgICoKKyAgICAgKiBUaGlzIGNhbGwgaXMgbG9jayBmcmVlIChhcyBzaGFyZWQgcG9pbnRlciBhbmQgTkJBSU8gaXMgbG9jayBmcmVlKTsKKyAgICAgKiBtYXkgYmUgY2FsbGVkIHNpbXVsdGFuZW91cyB0byBhbGwgbWV0aG9kcyBleGNlcHQgc2V0KCkuCisgICAgICoKKyAgICAgKiBccGFyYW0gYnVmZmVyIHRvIHdyaXRlIHRvIHBpcGUuCisgICAgICogXHBhcmFtIGZyYW1lQ291bnQgaW4gZnJhbWVzIGFzIHNwZWNpZmllZCBieSB0aGUgZm9ybWF0IHBhc3NlZCB0byBzZXQoKQorICAgICAqLworCisgICAgdm9pZCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBmcmFtZUNvdW50KSBjb25zdCB7CisgICAgICAgIG1UZWUtPndyaXRlKGJ1ZmZlciwgZnJhbWVDb3VudCk7CisgICAgfQorCisgICAgLyoqIHNldHMgVGVlIGlkIHN0cmluZyB3aGljaCBpZGVudGlmaWVzIHRoZSBnZW5lcmF0ZWQgZmlsZSAoc2hvdWxkIGJlIHVuaXF1ZSkuICovCisgICAgdm9pZCBzZXRJZChjb25zdCBzdGQ6OnN0cmluZyAmaWQpIGNvbnN0IHsKKyAgICAgICAgbVRlZS0+c2V0SWQoaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFxicmllZiBkdW1wIHRoZSBhdWRpbyBjb250ZW50IHdyaXR0ZW4gdG8gdGhlIFRlZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IgdG8gd3JpdGUgZHVtcGVkIGZpbGVuYW1lIGZvciBsb2dnaW5nLCB1c2UgLTEgdG8gaWdub3JlLgorICAgICAqIFxwYXJhbSByZWFzb24gc3RyaW5nIHN1ZmZpeCB0byBhcHBlbmQgdG8gdGhlIGdlbmVyYXRlZCBmaWxlLgorICAgICAqLworICAgIHZvaWQgZHVtcChpbnQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFzb24gPSAiIikgY29uc3QgeworICAgICAgICBtVGVlLT5kdW1wKGZkLCByZWFzb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFxicmllZiBkdW1wIGFsbCBUZWVzIGN1cnJlbnRseSBhbGl2ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmZCBmaWxlIGRlc2NyaXB0b3IgdG8gd3JpdGUgZHVtcGVkIGZpbGVuYW1lIGZvciBsb2dnaW5nLCB1c2UgLTEgdG8gaWdub3JlLgorICAgICAqIFxwYXJhbSByZWFzb24gc3RyaW5nIHN1ZmZpeCB0byBhcHBlbmQgdG8gdGhlIGdlbmVyYXRlZCBmaWxlLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGR1bXBBbGwoaW50IGZkLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVhc29uID0gIiIpIHsKKyAgICAgICAgZ2V0UnVubmluZ1RlZXMoKS5kdW1wKGZkLCByZWFzb24pOworICAgIH0KKworcHJpdmF0ZToKKworICAgIC8qKiBUaGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGVlIC0gdGhlIGxpZmV0aW1lIGlzIHRocm91Z2gKKyAgICAgICAgYSBzaGFyZWQgcG9pbnRlciBzbyBkZXN0cnVjdGlvbiBvZiB0aGUgTkJBSU9fVGVlIGNvbnRhaW5lciBtYXkgcHJvY2VlZAorICAgICAgICBldmVuIHRob3VnaCBkdW1waW5nIGlzIG9jY3VycmluZy4gKi8KKyAgICBjbGFzcyBOQkFJT19UZWVJbXBsIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXR1c190IHNldChjb25zdCBOQkFJT19Gb3JtYXQgJmZvcm1hdCwgVEVFX0ZMQUcgZmxhZ3MsIHNpemVfdCBmcmFtZXMpIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgdGVlQ29uZmlnID0gcHJvcGVydHlfZ2V0X2Jvb2woInJvLmRlYnVnZ2FibGUiLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICA/IHByb3BlcnR5X2dldF9pbnQzMigiYWYudGVlIiwgMCkgOiAwOworCisgICAgICAgICAgICAvLyBjaGVjayB0aGUgdHlwZSBvZiBUZWUKKyAgICAgICAgICAgIGNvbnN0IFRFRV9GTEFHIHR5cGUgPSBURUVfRkxBRygKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiAoVEVFX0ZMQUdfSU5QVVRfVEhSRUFEIHwgVEVFX0ZMQUdfT1VUUFVUX1RIUkVBRCB8IFRFRV9GTEFHX1RSQUNLKSk7CisKKyAgICAgICAgICAgIC8vIHBhcmFtZXRlciBmbGFncyBjYW4ndCBzZWxlY3QgbXVsdGlwbGUgdHlwZXMuCisgICAgICAgICAgICBpZiAoX19idWlsdGluX3BvcGNvdW50KHR5cGUpID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIHR5cGUgaXMgc2V0LCB3ZSBjaGVjayB0byBzZWUgaWYgaXQgaXMgcGVybWl0dGVkIGJ5IGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICBpZiAodHlwZSAhPSAwICYmICh0eXBlICYgdGVlQ29uZmlnKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBkZXRlcm1pbmUgbnVtYmVyIG9mIGZyYW1lcyBmb3IgVGVlCisgICAgICAgICAgICBpZiAoZnJhbWVzID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBjb25zaWRlciB2YXJ5aW5nIGZyYW1lIGNvdW50IGJhc2VkIG9uIHR5cGUuCisgICAgICAgICAgICAgICAgZnJhbWVzID0gREVGQVVMVF9URUVfRlJBTUVTOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgY2hlY2sgbWluaW11bSBudW1iZXIgb2YgZnJhbWVzPworCisgICAgICAgICAgICAvLyBkb24ndCBkbyBhbnl0aGluZyBpZiBmb3JtYXQgYW5kIGZyYW1lcyBhcmUgdGhlIHNhbWUuCisgICAgICAgICAgICBpZiAoRm9ybWF0X2lzRXF1YWwoZm9ybWF0LCBtRm9ybWF0KSAmJiBmcmFtZXMgPT0gbUZyYW1lcykgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBlbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICBhdXRvIHNpbmtzb3VyY2UgPSBtYWtlU2lua1NvdXJjZShmb3JtYXQsIGZyYW1lcywgJmVuYWJsZWQpOworCisgICAgICAgICAgICAvLyBlbmFibGVkIGlzIHNldCBpZiBtYWtlU2lua1NvdXJjZSBpcyBzdWNjZXNzZnVsLgorICAgICAgICAgICAgLy8gTm90ZTogYXMgbWVudGlvbmVkIGluIE5CQUlPX1RlZTo6c2V0KCksIGRvbid0IGNhbGwgc2V0KCkgd2hpbGUgd3JpdGUoKSBpcworICAgICAgICAgICAgLy8gb25nb2luZy4KKyAgICAgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgICAgICAgICBtRm9ybWF0ID0gZm9ybWF0OyAvLyBjb3VsZCBnZXQgdGhpcyBmcm9tIHRoZSBTaW5rLgorICAgICAgICAgICAgICAgIG1GcmFtZXMgPSBmcmFtZXM7CisgICAgICAgICAgICAgICAgbVNpbmtTb3VyY2UgPSBzdGQ6Om1vdmUoc2lua3NvdXJjZSk7CisgICAgICAgICAgICAgICAgbUVuYWJsZWQuc3RvcmUodHJ1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0SWQoY29uc3Qgc3RkOjpzdHJpbmcgJmlkKSB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICAgICAgbUlkID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGR1bXAoaW50IGZkLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVhc29uKSB7CisgICAgICAgICAgICBpZiAoIW1EYXRhUmVhZHkuZXhjaGFuZ2UoZmFsc2UpKSByZXR1cm47CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdWZmaXg7CisgICAgICAgICAgICBOQkFJT19TaW5rU291cmNlIHNpbmtTb3VyY2U7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICBzdWZmaXggPSBtSWQgKyByZWFzb247CisgICAgICAgICAgICAgICAgc2lua1NvdXJjZSA9IG1TaW5rU291cmNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHVtcFRlZShmZCwgc2lua1NvdXJjZSwgc3VmZml4KTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgZnJhbWVDb3VudCkgeworICAgICAgICAgICAgaWYgKCFtRW5hYmxlZC5sb2FkKCkgfHwgZnJhbWVDb3VudCA9PSAwKSByZXR1cm47CisgICAgICAgICAgICAodm9pZCltU2lua1NvdXJjZS5maXJzdC0+d3JpdGUoYnVmZmVyLCBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgIG1EYXRhUmVhZHkuc3RvcmUodHJ1ZSk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIFRSSUNLWTogV2UgbmVlZCB0byBrZWVwIHRoZSBOQkFJT19TaW5rIGFuZCBOQkFJT19Tb3VyY2UgYm90aCBhbGl2ZSBhdCB0aGUgc2FtZSB0aW1lCisgICAgICAgIC8vIGJlY2F1c2UgUGlwZVJlYWRlciBob2xkcyBhIG5ha2VkIHJlZmVyZW5jZSAobm90IGEgc3Ryb25nIG9yIHdlYWsgcG9pbnRlcikgdG8gUGlwZS4KKyAgICAgICAgdXNpbmcgTkJBSU9fU2lua1NvdXJjZSA9IHN0ZDo6cGFpcjxzcDxOQkFJT19TaW5rPiwgc3A8TkJBSU9fU291cmNlPj47CisKKyAgICAgICAgc3RhdGljIHZvaWQgZHVtcFRlZShpbnQgZmQsIGNvbnN0IE5CQUlPX1NpbmtTb3VyY2UmIHNpbmtTb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWZmaXgpOworCisgICAgICAgIHN0YXRpYyBOQkFJT19TaW5rU291cmNlIG1ha2VTaW5rU291cmNlKAorICAgICAgICAgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCAmZm9ybWF0LCBzaXplX3QgZnJhbWVzLCBib29sICplbmFibGVkKTsKKworICAgICAgICAvLyAweDIwMDAwMCBzdGVyZW8gMTYtYml0IFBDTSBmcmFtZXMgPSA0Ny41IHNlY29uZHMgYXQgNDQuMSBrSHosIDggbWVnYWJ5dGVzCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IERFRkFVTFRfVEVFX0ZSQU1FUyA9IDB4MjAwMDAwOworCisgICAgICAgIC8vIGF0b21pYyBzdGF0dXMgY2hlY2tpbmcKKyAgICAgICAgc3RkOjphdG9taWM8Ym9vbD4gbUVuYWJsZWR7ZmFsc2V9OworICAgICAgICBzdGQ6OmF0b21pYzxib29sPiBtRGF0YVJlYWR5e2ZhbHNlfTsKKworICAgICAgICAvLyBsb2NrZWQgZHVtcCBpbmZvcm1hdGlvbgorICAgICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1JZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdVQVJERURfQlkobUxvY2spCisgICAgICAgIFRFRV9GTEFHIG1GbGFncyA9IFRFRV9GTEFHX05PTkU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdVQVJERURfQlkobUxvY2spCisgICAgICAgIE5CQUlPX0Zvcm1hdCBtRm9ybWF0ID0gRm9ybWF0X0ludmFsaWQ7ICAgICAgICAgICAgICAgICAgIC8vIEdVQVJERURfQlkobUxvY2spCisgICAgICAgIHNpemVfdCBtRnJhbWVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdVQVJERURfQlkobUxvY2spCisgICAgICAgIE5CQUlPX1NpbmtTb3VyY2UgbVNpbmtTb3VyY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdVQVJERURfQlkobUxvY2spCisgICAgfTsKKworICAgIC8qKiBSdW5uaW5nVGVlcyB0cmFja3MgY3VycmVudCBydW5uaW5nIHRlZXMgZm9yIGR1bXAgcHVycG9zZXMuCisgICAgICAgIEl0IGlzIGltcGxlbWVudGVkIHRvIGhhdmUgbWluaW1hbCBsb2NrZWQgcmVnaW9ucywgdG8gYmUgdHJhbnNwYXJlbnQgdG8gdGhlIGNhbGxlci4gKi8KKyAgICBjbGFzcyBSdW5uaW5nVGVlcyB7CisgICAgcHVibGljOgorICAgICAgICB2b2lkIGFkZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TkJBSU9fVGVlSW1wbD4gJnRlZSkgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgICAgIEFMT0dXX0lGKCFtVGVlcy5lbXBsYWNlKHRlZSkuc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAiJXM6ICVwIGFscmVhZHkgZXhpc3RzIGluIG1UZWVzIiwgX19mdW5jX18sIHRlZS5nZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlbW92ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TkJBSU9fVGVlSW1wbD4gJnRlZSkgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgICAgIEFMT0dXX0lGKG1UZWVzLmVyYXNlKHRlZSkgIT0gMSwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiAlcCBkb2Vzbid0IGV4aXN0IGluIG1UZWVzIiwgX19mdW5jX18sIHRlZS5nZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGR1bXAoaW50IGZkLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVhc29uKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8TkJBSU9fVGVlSW1wbD4+IHRlZXM7IC8vIHNhZmUgc25hcHNob3Qgb2YgdGVlcworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgICAgICAgICAgdGVlcy5pbnNlcnQodGVlcy5lbmQoKSwgbVRlZXMuYmVnaW4oKSwgbVRlZXMuZW5kKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZ0ZWUgOiB0ZWVzKSB7CisgICAgICAgICAgICAgICAgdGVlLT5kdW1wKGZkLCByZWFzb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBzdGQ6OnNldDxzdGQ6OnNoYXJlZF9wdHI8TkJBSU9fVGVlSW1wbD4+IG1UZWVzOyAvLyBHVUFSREVEX0JZKG1Mb2NrKQorICAgIH07CisKKyAgICAvLyBzaW5nbGV0b24KKyAgICBzdGF0aWMgUnVubmluZ1RlZXMgJmdldFJ1bm5pbmdUZWVzKCkgeworICAgICAgICBzdGF0aWMgUnVubmluZ1RlZXMgcnVubmluZ1RlZXM7CisgICAgICAgIHJldHVybiBydW5uaW5nVGVlczsKKyAgICB9CisKKyAgICAvLyBUaGUgTkJBSU8gVGVlSW1wbCBtYXkgaGF2ZSBsaWZldGltZSBsb25nZXIgdGhhbiBOQkFJT19UZWUgaWYKKyAgICAvLyBSdW5uaW5nVGVlczo6ZHVtcCgpIGlzIGJlaW5nIGNhbGxlZCBzaW11bHRhbmVvdXMgdG8gfk5CQUlPX1RlZSgpLgorICAgIC8vIFRoaXMgaXMgYWxsb3dlZCBmb3IgbWF4aW11bSBjb25jdXJyZW5jeS4KKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TkJBSU9fVGVlSW1wbD4gbVRlZTsKK307IC8vIE5CQUlPX1RlZQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBURUVfU0lOSworI2VuZGlmIC8vICFBTkRST0lEX05CQUlPX1RFRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKaW5kZXggZTVjYjhhMi4uYTIxMGE2ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcApAQCAtMjQsOCArMjQsOSBAQAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KIAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL1BhdGNoQnVpbGRlci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTQ5LDExMSArNTAsNzcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5saXN0QXVkaW9Qb3J0cyhudW1fcG9ydHMsIHBvcnRzKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIG1QYXRjaFBhbmVsLmxpc3RBdWRpb1BvcnRzKG51bV9wb3J0cywgcG9ydHMpOwogfQogCiAvKiBHZXQgc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgewotICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPmdldEF1ZGlvUG9ydChwb3J0KTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIG1QYXRjaFBhbmVsLmdldEF1ZGlvUG9ydChwb3J0KTsKIH0KIAotCiAvKiBDb25uZWN0IGEgcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgewotICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gsIGhhbmRsZSk7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBtUGF0Y2hQYW5lbC5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoLCBoYW5kbGUpOwogfQogCiAvKiBEaXNjb25uZWN0IGEgcGF0Y2ggKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5yZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUpOwotICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gbVBhdGNoUGFuZWwucmVsZWFzZUF1ZGlvUGF0Y2goaGFuZGxlKTsKIH0KIAotCiAvKiBMaXN0IGNvbm5lY3RlZCBhdWRpbyBwb3J0cyBhbmQgdGhleSBhdHRyaWJ1dGVzICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Omxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBhdGNoUGFuZWwgIT0gMCkgewotICAgICAgICByZXR1cm4gbVBhdGNoUGFuZWwtPmxpc3RBdWRpb1BhdGNoZXMobnVtX3BhdGNoZXMsIHBhdGNoZXMpOworICAgIHJldHVybiBtUGF0Y2hQYW5lbC5saXN0QXVkaW9QYXRjaGVzKG51bV9wYXRjaGVzLCBwYXRjaGVzKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpTb2Z0d2FyZVBhdGNoOjpnZXRMYXRlbmN5TXNfbChkb3VibGUgKmxhdGVuY3lNcykgY29uc3QKK3sKKyAgICBjb25zdCBhdXRvJiBpdGVyID0gbVBhdGNoUGFuZWwubVBhdGNoZXMuZmluZChtUGF0Y2hIYW5kbGUpOworICAgIGlmIChpdGVyICE9IG1QYXRjaFBhbmVsLm1QYXRjaGVzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBpdGVyLT5zZWNvbmQuZ2V0TGF0ZW5jeU1zKGxhdGVuY3lNcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7Ci19Ci0KLS8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5zZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7Ci19Ci0KLQotQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpQYXRjaFBhbmVsKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtQXVkaW9GbGluZ2VyKGF1ZGlvRmxpbmdlcikKLXsKLX0KLQotQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjp+UGF0Y2hQYW5lbCgpCi17CiB9CiAKIC8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6Omxpc3RBdWRpb1BvcnRzKHVuc2lnbmVkIGludCAqbnVtX3BvcnRzIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMgX191bnVzZWQpCiB7Ci0gICAgQUxPR1YoImxpc3RBdWRpb1BvcnRzIik7CisgICAgQUxPR1YoX19mdW5jX18pOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogLyogR2V0IHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0IF9fdW51c2VkKQogewotICAgIEFMT0dWKCJnZXRBdWRpb1BvcnQiKTsKKyAgICBBTE9HVihfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi0KIC8qIENvbm5lY3QgYSBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYWxIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICBzcDxBdWRpb0ZsaW5nZXI+IGF1ZGlvZmxpbmdlciA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOwogICAgIGlmIChoYW5kbGUgPT0gTlVMTCB8fCBwYXRjaCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgbnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIGhhbmRsZSAlZCIsCi0gICAgICAgICAgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzLCAqaGFuZGxlKTsKLSAgICBpZiAoYXVkaW9mbGluZ2VyID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQorICAgIEFMT0dWKCIlcygpIG51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCBoYW5kbGUgJWQiLAorICAgICAgICAgICAgX19mdW5jX18sIHBhdGNoLT5udW1fc291cmNlcywgcGF0Y2gtPm51bV9zaW5rcywgKmhhbmRsZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFsSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAKLSAgICBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID09IDAgfHwgcGF0Y2gtPm51bV9zb3VyY2VzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYIHx8Ci0gICAgICAgICAgICAocGF0Y2gtPm51bV9zaW5rcyA9PSAwICYmIHBhdGNoLT5udW1fc291cmNlcyAhPSAyKSB8fAotICAgICAgICAgICAgcGF0Y2gtPm51bV9zaW5rcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCkgeworICAgIGlmICghYXVkaW9fcGF0Y2hfaXNfdmFsaWQocGF0Y2gpIHx8IChwYXRjaC0+bnVtX3NpbmtzID09IDAgJiYgcGF0Y2gtPm51bV9zb3VyY2VzICE9IDIpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIC8vIGxpbWl0IG51bWJlciBvZiBzb3VyY2VzIHRvIDEgZm9yIG5vdyBvciAyIHNvdXJjZXMgZm9yIHNwZWNpYWwgY3Jvc3MgaHcgbW9kdWxlIGNhc2UuCkBAIC0xNjMsODEgKzEzMCw3MyBAQAogICAgIH0KIAogICAgIGlmICgqaGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgKmhhbmRsZSAhPSAwICYmIGluZGV4IDwgbVBhdGNoZXMuc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgICAgICBpZiAoKmhhbmRsZSA9PSBtUGF0Y2hlc1tpbmRleF0tPm1IYW5kbGUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHJlbW92aW5nIHBhdGNoIGhhbmRsZSAlZCIsICpoYW5kbGUpOwotICAgICAgICAgICAgICAgIGhhbEhhbmRsZSA9IG1QYXRjaGVzW2luZGV4XS0+bUhhbEhhbmRsZTsKLSAgICAgICAgICAgICAgICBQYXRjaCAqcmVtb3ZlZFBhdGNoID0gbVBhdGNoZXNbaW5kZXhdOwotICAgICAgICAgICAgICAgIC8vIGZyZWUgcmVzb3VyY2VzIG93bmVkIGJ5IHRoZSByZW1vdmVkIHBhdGNoIGlmIGFwcGxpY2FibGUKLSAgICAgICAgICAgICAgICAvLyAxKSBpZiBhIHNvZnR3YXJlIHBhdGNoIGlzIHByZXNlbnQsIHJlbGVhc2UgdGhlIHBsYXliYWNrIGFuZCBjYXB0dXJlIHRocmVhZHMgYW5kCi0gICAgICAgICAgICAgICAgLy8gdHJhY2tzIGNyZWF0ZWQuIFRoaXMgd2lsbCBhbHNvIHJlbGVhc2UgdGhlIGNvcnJlc3BvbmRpbmcgYXVkaW8gSEFMIHBhdGNoZXMKLSAgICAgICAgICAgICAgICBpZiAoKHJlbW92ZWRQYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChyZW1vdmVkUGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSkgewotICAgICAgICAgICAgICAgICAgICBjbGVhclBhdGNoQ29ubmVjdGlvbnMocmVtb3ZlZFBhdGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gMikgaWYgdGhlIG5ldyBwYXRjaCBhbmQgb2xkIHBhdGNoIHNvdXJjZSBvciBzaW5rIGFyZSBkZXZpY2VzIGZyb20gZGlmZmVyZW50Ci0gICAgICAgICAgICAgICAgLy8gaHcgbW9kdWxlcywgIGNsZWFyIHRoZSBhdWRpbyBIQUwgcGF0Y2hlcyBub3cgYmVjYXVzZSB0aGV5IHdpbGwgbm90IGJlIHVwZGF0ZWQKLSAgICAgICAgICAgICAgICAvLyBieSBjYWxsIHRvIGNyZWF0ZV9hdWRpb19wYXRjaCgpIGJlbG93IHdoaWNoIHdpbGwgaGFwcGVuIG9uIGEgZGlmZmVyZW50IEhXIG1vZHVsZQotICAgICAgICAgICAgICAgIGlmIChoYWxIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGh3TW9kdWxlID0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2guc291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGUpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUgPSByZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoLnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHBhdGNoLT5udW1fc2lua3MgPT0gMCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2guc2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBhdGNoLT5zaW5rc1swXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaC5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSBvbiAocGF0Y2gtPm51bV9zaW5rcyA9PSAwKTogdGhpcyBzaXR1YXRpb24gc2hvdWxkIG5vdCBoYXBwZW4gYXMKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIHNwZWNpYWwgcGF0Y2hlcyBhcmUgb25seSBjcmVhdGVkIGJ5IHRoZSBwb2xpY3kgbWFuYWdlciBidXQganVzdAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSwgc3lzdGVtYXRpY2FsbHkgY2xlYXIgdGhlIEhBTCBwYXRjaC4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCByZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoLm51bV9zaW5rcyBjYW5ub3QgYmUgMCBoZXJlIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbEhhbmRsZSB3b3VsZCBiZSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSBpbiB0aGlzIGNhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICBod01vZHVsZSA9IHJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2guc2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGh3TW9kdWxlICE9IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoaHdNb2R1bGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGh3RGV2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpLT5od0RldmljZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3RGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChoYWxIYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QYXRjaGVzLnJlbW92ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBkZWxldGUgcmVtb3ZlZFBhdGNoOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBhdXRvIGl0ZXIgPSBtUGF0Y2hlcy5maW5kKCpoYW5kbGUpOworICAgICAgICBpZiAoaXRlciAhPSBtUGF0Y2hlcy5lbmQoKSkgeworICAgICAgICAgICAgQUxPR1YoIiVzKCkgcmVtb3ZpbmcgcGF0Y2ggaGFuZGxlICVkIiwgX19mdW5jX18sICpoYW5kbGUpOworICAgICAgICAgICAgUGF0Y2ggJnJlbW92ZWRQYXRjaCA9IGl0ZXItPnNlY29uZDsKKyAgICAgICAgICAgIC8vIGZyZWUgcmVzb3VyY2VzIG93bmVkIGJ5IHRoZSByZW1vdmVkIHBhdGNoIGlmIGFwcGxpY2FibGUKKyAgICAgICAgICAgIC8vIDEpIGlmIGEgc29mdHdhcmUgcGF0Y2ggaXMgcHJlc2VudCwgcmVsZWFzZSB0aGUgcGxheWJhY2sgYW5kIGNhcHR1cmUgdGhyZWFkcyBhbmQKKyAgICAgICAgICAgIC8vIHRyYWNrcyBjcmVhdGVkLiBUaGlzIHdpbGwgYWxzbyByZWxlYXNlIHRoZSBjb3JyZXNwb25kaW5nIGF1ZGlvIEhBTCBwYXRjaGVzCisgICAgICAgICAgICBpZiAocmVtb3ZlZFBhdGNoLmlzU29mdHdhcmUoKSkgeworICAgICAgICAgICAgICAgIHJlbW92ZWRQYXRjaC5jbGVhckNvbm5lY3Rpb25zKHRoaXMpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gMikgaWYgdGhlIG5ldyBwYXRjaCBhbmQgb2xkIHBhdGNoIHNvdXJjZSBvciBzaW5rIGFyZSBkZXZpY2VzIGZyb20gZGlmZmVyZW50CisgICAgICAgICAgICAvLyBodyBtb2R1bGVzLCAgY2xlYXIgdGhlIGF1ZGlvIEhBTCBwYXRjaGVzIG5vdyBiZWNhdXNlIHRoZXkgd2lsbCBub3QgYmUgdXBkYXRlZAorICAgICAgICAgICAgLy8gYnkgY2FsbCB0byBjcmVhdGVfYXVkaW9fcGF0Y2goKSBiZWxvdyB3aGljaCB3aWxsIGhhcHBlbiBvbiBhIGRpZmZlcmVudCBIVyBtb2R1bGUKKyAgICAgICAgICAgIGlmIChyZW1vdmVkUGF0Y2gubUhhbEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBod01vZHVsZSA9IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggJm9sZFBhdGNoID0gcmVtb3ZlZFBhdGNoLm1BdWRpb1BhdGNoOworICAgICAgICAgICAgICAgIGlmIChvbGRQYXRjaC5zb3VyY2VzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRQYXRjaC5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlKSkgeworICAgICAgICAgICAgICAgICAgICBod01vZHVsZSA9IG9sZFBhdGNoLnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRjaC0+bnVtX3NpbmtzID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChvbGRQYXRjaC5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhdGNoLT5zaW5rc1swXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRQYXRjaC5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgb24gKHBhdGNoLT5udW1fc2lua3MgPT0gMCk6IHRoaXMgc2l0dWF0aW9uIHNob3VsZCBub3QgaGFwcGVuIGFzCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIHNwZWNpYWwgcGF0Y2hlcyBhcmUgb25seSBjcmVhdGVkIGJ5IHRoZSBwb2xpY3kgbWFuYWdlciBidXQganVzdAorICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlLCBzeXN0ZW1hdGljYWxseSBjbGVhciB0aGUgSEFMIHBhdGNoLgorICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgcmVtb3ZlZFBhdGNoLm1BdWRpb1BhdGNoLm51bV9zaW5rcyBjYW5ub3QgYmUgMCBoZXJlIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlZFBhdGNoLm1IYWxIYW5kbGUgd291bGQgYmUgQVVESU9fUEFUQ0hfSEFORExFX05PTkUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICBod01vZHVsZSA9IG9sZFBhdGNoLnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGh3RGV2aWNlID0gZmluZEh3RGV2aWNlQnlNb2R1bGUoaHdNb2R1bGUpOworICAgICAgICAgICAgICAgIGlmIChod0RldmljZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGh3RGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChyZW1vdmVkUGF0Y2gubUhhbEhhbmRsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBhdGNoZXMuZXJhc2UoaXRlcik7CisgICAgICAgICAgICByZW1vdmVTb2Z0d2FyZVBhdGNoRnJvbUluc2VydGVkTW9kdWxlcygqaGFuZGxlKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIFBhdGNoICpuZXdQYXRjaCA9IG5ldyBQYXRjaChwYXRjaCk7CisgICAgUGF0Y2ggbmV3UGF0Y2h7KnBhdGNofTsKKyAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaW5zZXJ0ZWRNb2R1bGUgPSBBVURJT19NT0RVTEVfSEFORExFX05PTkU7CiAKICAgICBzd2l0Y2ggKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUpIHsKICAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfREVWSUNFOiB7CiAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3Qgc3JjTW9kdWxlID0gcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGU7Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShzcmNNb2R1bGUpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBzcmNNb2R1bGUpOworICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGZpbmRBdWRpb0h3RGV2aWNlQnlNb2R1bGUoc3JjTW9kdWxlKTsKKyAgICAgICAgICAgIGlmICghYXVkaW9Id0RldmljZSkgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7CiAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgewogICAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgb25seSBvbmUgc2luayBpZiBjb25uZWN0aW9uIHRvIGEgbWl4IG9yIGFjcm9zcyBIVyBtb2R1bGVzCiAgICAgICAgICAgICAgICAgaWYgKChwYXRjaC0+c2lua3NbaV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0uZXh0Lm1peC5od19tb2R1bGUgIT0gc3JjTW9kdWxlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPSBzcmNNb2R1bGUpKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm51bV9zaW5rcyA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgbXVsdGlwbGUgc2lua3MgZm9yIG1peCBvciBhY3Jvc3MgbW9kdWxlcyBub3Qgc3VwcG9ydGVkIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyByZWplY3QgY29ubmVjdGlvbiB0byBkaWZmZXJlbnQgc2luayB0eXBlcwogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbaV0udHlwZSAhPSBwYXRjaC0+c2lua3NbMF0udHlwZSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGRpZmZlcmVudCBzaW5rIHR5cGVzIGluIHNhbWUgcGF0Y2ggbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBkaWZmZXJlbnQgc2luayB0eXBlcyBpbiBzYW1lIHBhdGNoIG5vdCBzdXBwb3J0ZWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIH0KQEAgLTI1Miw0MiArMjExLDU2IEBACiAgICAgICAgICAgICAgICAgKChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSAmJgogICAgICAgICAgICAgICAgICAoKHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPSBzcmNNb2R1bGUpIHx8CiAgICAgICAgICAgICAgICAgICAhYXVkaW9Id0RldmljZS0+c3VwcG9ydHNBdWRpb1BhdGNoZXMoKSkpKSB7CisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSA9IHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLnR5cGU7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBvdXRwdXREZXZpY2VBZGRyZXNzID0gU3RyaW5nOChwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID09IDIpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzFdLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX01JWCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXRjaC0+bnVtX3NpbmtzICE9IDAgJiYgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1sxXS5leHQubWl4Lmh3X21vZHVsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgaW52YWxpZCBzb3VyY2UgY29tYmluYXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGludmFsaWQgc291cmNlIGNvbWJpbmF0aW9uIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+Y2hlY2tQbGF5YmFja1RocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzFdLmV4dC5taXguaGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZCA9IChNaXhlclRocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1sxXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBjYW5ub3QgZ2V0IHBsYXliYWNrIHRocmVhZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgY2Fubm90IGdldCBwbGF5YmFjayB0aHJlYWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBwbGF5YmFjayB0aHJlYWQgaXMgcmV1c2VkLCBzbyBpdCBpcyBub3QgY2xvc2VkIHdoZW4gcGF0Y2ggaXMgY2xlYXJlZAorICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC5tUGxheWJhY2suc2V0VGhyZWFkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UGxheWJhY2tUaHJlYWQqPih0aHJlYWQuZ2V0KCkpLCBmYWxzZSAvKmNsb3NlVGhyZWFkKi8pOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLnR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgocGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPm9wZW5PdXRwdXRfbCgKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHBhdGNoLT5zaW5rc1swXS5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gcGF0Y2gtPnNpbmtzWzBdLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gcGF0Y2gtPnNpbmtzWzBdLmZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcGF0Y2gtPnNpbmtzWzBdLmZsYWdzLm91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLm9wZW5PdXRwdXRfbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUpOwotICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiYXVkaW9mbGluZ2VyLT5vcGVuT3V0cHV0X2woKSByZXR1cm5lZCAlcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkLmdldCgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm1BdWRpb0ZsaW5nZXIub3Blbk91dHB1dF9sKCkgcmV0dXJuZWQgJXAiLCB0aHJlYWQuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC5tUGxheWJhY2suc2V0VGhyZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8UGxheWJhY2tUaHJlYWQqPih0aHJlYWQuZ2V0KCkpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZTsKICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7CkBAIC0yOTcsNTIgKzI3MCw2NyBAQAogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c291cmNlc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHBhdGNoLT5zb3VyY2VzWzBdLnNhbXBsZV9yYXRlOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQtPnNhbXBsZVJhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gbmV3UGF0Y2gubVBsYXliYWNrLnRocmVhZCgpLT5zYW1wbGVSYXRlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c291cmNlc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgewogICAgICAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gcGF0Y2gtPnNvdXJjZXNbMF0uY2hhbm5lbF9tYXNrOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPQotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQobmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Y2hhbm5lbENvdW50KCkpOworICAgICAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gubVBsYXliYWNrLnRocmVhZCgpLT5jaGFubmVsQ291bnQoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c291cmNlc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCkgewogICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gcGF0Y2gtPnNvdXJjZXNbMF0uZm9ybWF0OwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5mb3JtYXQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG5ld1BhdGNoLm1QbGF5YmFjay50aHJlYWQoKS0+Zm9ybWF0KCk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUyA/CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5mbGFncy5pbnB1dCA6IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+b3BlbklucHV0X2woc3JjTW9kdWxlLAorICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIub3BlbklucHV0X2woc3JjTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FKTsKLSAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKil0aHJlYWQuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImF1ZGlvZmxpbmdlci0+b3BlbklucHV0X2woKSByZXR1cm5lZCAlcCBpbkNoYW5uZWxNYXNrICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLT5tUmVjb3JkVGhyZWFkLmdldCgpLCBjb25maWcuY2hhbm5lbF9tYXNrKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3UGF0Y2gtPm1SZWNvcmRUaHJlYWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2VBZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBBTE9HVigibUF1ZGlvRmxpbmdlci5vcGVuSW5wdXRfbCgpIHJldHVybmVkICVwIGluQ2hhbm5lbE1hc2sgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLmdldCgpLCBjb25maWcuY2hhbm5lbF9tYXNrKTsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMobmV3UGF0Y2gsIHBhdGNoKTsKKyAgICAgICAgICAgICAgICBuZXdQYXRjaC5tUmVjb3JkLnNldFRocmVhZChyZWludGVycHJldF9jYXN0PFJlY29yZFRocmVhZCo+KHRocmVhZC5nZXQoKSkpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ld1BhdGNoLmNyZWF0ZUNvbm5lY3Rpb25zKHRoaXMpOwogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9Id0RldmljZS0+aXNJbnNlcnQoKSkgeworICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZE1vZHVsZSA9IGF1ZGlvSHdEZXZpY2UtPmhhbmRsZSgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja1JlY29yZFRocmVhZF9sKAorICAgICAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLmNoZWNrUmVjb3JkVGhyZWFkX2woCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBiYWQgY2FwdHVyZSBJL08gaGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudChwYXRjaCwgJmhhbEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBzdGFsZSBhdWRpbyBwYXRjaCB3aXRoIHNhbWUgaW5wdXQgYXMgc2luayBpZiBhbnkKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBpdGVyIDogbVBhdGNoZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVyLnNlY29uZC5tQXVkaW9QYXRjaC5zaW5rc1swXS5leHQubWl4LmhhbmRsZSA9PSB0aHJlYWQtPmlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGF0Y2hlcy5lcmFzZShpdGVyLmZpcnN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gaHdEZXZpY2UgPSBhdWRpb0h3RGV2aWNlLT5od0RldmljZSgpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaC0+bnVtX3NvdXJjZXMsCkBAIC0zNTYsOSArMzQ0LDkgQEAKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfTUlYOiB7CiAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3Qgc3JjTW9kdWxlID0gIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaHdfbW9kdWxlOwotICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoc3JjTW9kdWxlKTsKKyAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9GbGluZ2VyLm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KHNyY01vZHVsZSk7CiAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIHNyY01vZHVsZSk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBfX2Z1bmNfXywgc3JjTW9kdWxlKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgfQpAQCAtMzY2LDggKzM1NCw4IEBACiAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IEFVRElPX0RFVklDRV9OT05FOwogICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGludmFsaWQgc2luayB0eXBlICVkIGZvciBtaXggc291cmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLnR5cGUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBpbnZhbGlkIHNpbmsgdHlwZSAlZCBmb3IgbWl4IHNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBhdGNoLT5zaW5rc1tpXS50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQpAQCAtMzc5LDMxOSArMzY3LDQ0OCBAQAogICAgICAgICAgICAgICAgIHR5cGUgfD0gcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5jaGVja1BsYXliYWNrVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0ZsaW5nZXIuY2hlY2tQbGF5YmFja1RocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgIHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tNbWFwVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgIHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIuY2hlY2tNbWFwVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGJhZCBwbGF5YmFjayBJL08gaGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgYmFkIHBsYXliYWNrIEkvTyBoYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gYXVkaW9mbGluZ2VyLT5wcmltYXJ5UGxheWJhY2tUaHJlYWRfbCgpKSB7CisgICAgICAgICAgICBpZiAodGhyZWFkID09IG1BdWRpb0ZsaW5nZXIucHJpbWFyeVBsYXliYWNrVGhyZWFkX2woKSkgewogICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKICAgICAgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIChpbnQpdHlwZSk7CiAKLSAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmJyb2FjYXN0UGFyYW1ldGVyc1RvUmVjb3JkVGhyZWFkc19sKHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIG1BdWRpb0ZsaW5nZXIuYnJvYWNhc3RQYXJhbWV0ZXJzVG9SZWNvcmRUaHJlYWRzX2wocGFyYW0udG9TdHJpbmcoKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudChwYXRjaCwgJmhhbEhhbmRsZSk7CisKKyAgICAgICAgICAgIC8vIHJlbW92ZSBzdGFsZSBhdWRpbyBwYXRjaCB3aXRoIHNhbWUgb3V0cHV0IGFzIHNvdXJjZSBpZiBhbnkKKyAgICAgICAgICAgIGZvciAoYXV0byYgaXRlciA6IG1QYXRjaGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKGl0ZXIuc2Vjb25kLm1BdWRpb1BhdGNoLnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUgPT0gdGhyZWFkLT5pZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1QYXRjaGVzLmVyYXNlKGl0ZXIuZmlyc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogZXhpdDoKLSAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHN0YXR1cyAlZCIsIHN0YXR1cyk7CisgICAgQUxPR1YoIiVzKCkgc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAqaGFuZGxlID0gKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSBhdWRpb2ZsaW5nZXItPm5leHRVbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX1BBVENIKTsKLSAgICAgICAgbmV3UGF0Y2gtPm1IYW5kbGUgPSAqaGFuZGxlOwotICAgICAgICBuZXdQYXRjaC0+bUhhbEhhbmRsZSA9IGhhbEhhbmRsZTsKLSAgICAgICAgbVBhdGNoZXMuYWRkKG5ld1BhdGNoKTsKLSAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBhZGRlZCBuZXcgcGF0Y2ggaGFuZGxlICVkIGhhbEhhbmRsZSAlZCIsICpoYW5kbGUsIGhhbEhhbmRsZSk7CisgICAgICAgICpoYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpIG1BdWRpb0ZsaW5nZXIubmV4dFVuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfUEFUQ0gpOworICAgICAgICBuZXdQYXRjaC5tSGFsSGFuZGxlID0gaGFsSGFuZGxlOworICAgICAgICBtUGF0Y2hlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoKmhhbmRsZSwgc3RkOjptb3ZlKG5ld1BhdGNoKSkpOworICAgICAgICBpZiAoaW5zZXJ0ZWRNb2R1bGUgIT0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICBhZGRTb2Z0d2FyZVBhdGNoVG9JbnNlcnRlZE1vZHVsZXMoaW5zZXJ0ZWRNb2R1bGUsICpoYW5kbGUpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCIlcygpIGFkZGVkIG5ldyBwYXRjaCBoYW5kbGUgJWQgaGFsSGFuZGxlICVkIiwgX19mdW5jX18sICpoYW5kbGUsIGhhbEhhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY2xlYXJQYXRjaENvbm5lY3Rpb25zKG5ld1BhdGNoKTsKLSAgICAgICAgZGVsZXRlIG5ld1BhdGNoOworICAgICAgICBuZXdQYXRjaC5jbGVhckNvbm5lY3Rpb25zKHRoaXMpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoUGF0Y2ggKnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqYXVkaW9QYXRjaCkKK0F1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2g6On5QYXRjaCgpCit7CisgICAgQUxPR0VfSUYoaXNTb2Z0d2FyZSgpLCAiU29mdHdhcmUgcGF0Y2ggY29ubmVjdGlvbnMgbGVha2VkICVkICVkIiwKKyAgICAgICAgICAgIG1SZWNvcmQuaGFuZGxlKCksIG1QbGF5YmFjay5oYW5kbGUoKSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2g6OmNyZWF0ZUNvbm5lY3Rpb25zKFBhdGNoUGFuZWwgKnBhbmVsKQogewogICAgIC8vIGNyZWF0ZSBwYXRjaCBmcm9tIHNvdXJjZSBkZXZpY2UgdG8gcmVjb3JkIHRocmVhZCBpbnB1dAotICAgIHN0cnVjdCBhdWRpb19wYXRjaCBzdWJQYXRjaDsKLSAgICBzdWJQYXRjaC5udW1fc291cmNlcyA9IDE7Ci0gICAgc3ViUGF0Y2guc291cmNlc1swXSA9IGF1ZGlvUGF0Y2gtPnNvdXJjZXNbMF07Ci0gICAgc3ViUGF0Y2gubnVtX3NpbmtzID0gMTsKLQotICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLT5nZXRBdWRpb1BvcnRDb25maWcoJnN1YlBhdGNoLnNpbmtzWzBdKTsKLSAgICBzdWJQYXRjaC5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlID0gQVVESU9fU09VUkNFX01JQzsKLQotICAgIHN0YXR1c190IHN0YXR1cyA9IGNyZWF0ZUF1ZGlvUGF0Y2goJnN1YlBhdGNoLCAmcGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFuZWwtPmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgICAgICBQYXRjaEJ1aWxkZXIoKS5hZGRTb3VyY2UobUF1ZGlvUGF0Y2guc291cmNlc1swXSkuCisgICAgICAgICAgICAgICAgYWRkU2luayhtUmVjb3JkLnRocmVhZCgpLCB7IC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDIH0pLnBhdGNoKCksCisgICAgICAgICAgICBtUmVjb3JkLmhhbmRsZVB0cigpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgKm1SZWNvcmQuaGFuZGxlUHRyKCkgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKICAgICAvLyBjcmVhdGUgcGF0Y2ggZnJvbSBwbGF5YmFjayB0aHJlYWQgb3V0cHV0IHRvIHNpbmsgZGV2aWNlCi0gICAgaWYgKGF1ZGlvUGF0Y2gtPm51bV9zaW5rcyAhPSAwKSB7Ci0gICAgICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmdldEF1ZGlvUG9ydENvbmZpZygmc3ViUGF0Y2guc291cmNlc1swXSk7Ci0gICAgICAgIHN1YlBhdGNoLnNpbmtzWzBdID0gYXVkaW9QYXRjaC0+c2lua3NbMF07Ci0gICAgICAgIHN0YXR1cyA9IGNyZWF0ZUF1ZGlvUGF0Y2goJnN1YlBhdGNoLCAmcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlKTsKKyAgICBpZiAobUF1ZGlvUGF0Y2gubnVtX3NpbmtzICE9IDApIHsKKyAgICAgICAgc3RhdHVzID0gcGFuZWwtPmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgICAgICAgICAgUGF0Y2hCdWlsZGVyKCkuYWRkU291cmNlKG1QbGF5YmFjay50aHJlYWQoKSkuYWRkU2luayhtQXVkaW9QYXRjaC5zaW5rc1swXSkucGF0Y2goKSwKKyAgICAgICAgICAgICAgICBtUGxheWJhY2suaGFuZGxlUHRyKCkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICptUGxheWJhY2suaGFuZGxlUHRyKCkgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgKm1QbGF5YmFjay5oYW5kbGVQdHIoKSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgIH0KIAogICAgIC8vIHVzZSBhIHBzZXVkbyBMQ00gYmV0d2VlbiBpbnB1dCBhbmQgb3V0cHV0IGZyYW1lY291bnQKLSAgICBzaXplX3QgcGxheWJhY2tGcmFtZUNvdW50ID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+ZnJhbWVDb3VudCgpOworICAgIHNpemVfdCBwbGF5YmFja0ZyYW1lQ291bnQgPSBtUGxheWJhY2sudGhyZWFkKCktPmZyYW1lQ291bnQoKTsKICAgICBpbnQgcGxheWJhY2tTaGlmdCA9IF9fYnVpbHRpbl9jdHoocGxheWJhY2tGcmFtZUNvdW50KTsKLSAgICBzaXplX3QgcmVjb3JkRnJhbWVjb3VudCA9IHBhdGNoLT5tUmVjb3JkVGhyZWFkLT5mcmFtZUNvdW50KCk7Ci0gICAgaW50IHNoaWZ0ID0gX19idWlsdGluX2N0eihyZWNvcmRGcmFtZWNvdW50KTsKKyAgICBzaXplX3QgcmVjb3JkRnJhbWVDb3VudCA9IG1SZWNvcmQudGhyZWFkKCktPmZyYW1lQ291bnQoKTsKKyAgICBpbnQgc2hpZnQgPSBfX2J1aWx0aW5fY3R6KHJlY29yZEZyYW1lQ291bnQpOwogICAgIGlmIChwbGF5YmFja1NoaWZ0IDwgc2hpZnQpIHsKICAgICAgICAgc2hpZnQgPSBwbGF5YmFja1NoaWZ0OwogICAgIH0KLSAgICBzaXplX3QgZnJhbWVDb3VudCA9IChwbGF5YmFja0ZyYW1lQ291bnQgKiByZWNvcmRGcmFtZWNvdW50KSA+PiBzaGlmdDsKLSAgICBBTE9HVigiY3JlYXRlUGF0Y2hDb25uZWN0aW9ucygpIHBsYXlmcmFtZUNvdW50ICV6dSByZWNvcmRGcmFtZWNvdW50ICV6dSBmcmFtZUNvdW50ICV6dSIsCi0gICAgICAgICAgcGxheWJhY2tGcmFtZUNvdW50LCByZWNvcmRGcmFtZWNvdW50LCBmcmFtZUNvdW50KTsKKyAgICBzaXplX3QgZnJhbWVDb3VudCA9IChwbGF5YmFja0ZyYW1lQ291bnQgKiByZWNvcmRGcmFtZUNvdW50KSA+PiBzaGlmdDsKKyAgICBBTE9HVigiJXMoKSBwbGF5ZnJhbWVDb3VudCAlenUgcmVjb3JkRnJhbWVDb3VudCAlenUgZnJhbWVDb3VudCAlenUiLAorICAgICAgICAgICAgX19mdW5jX18sIHBsYXliYWNrRnJhbWVDb3VudCwgcmVjb3JkRnJhbWVDb3VudCwgZnJhbWVDb3VudCk7CiAKICAgICAvLyBjcmVhdGUgYSBzcGVjaWFsIHJlY29yZCB0cmFjayB0byBjYXB0dXJlIGZyb20gcmVjb3JkIHRocmVhZAotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmNoYW5uZWxDb3VudCgpOworICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IG1QbGF5YmFjay50aHJlYWQoKS0+Y2hhbm5lbENvdW50KCk7CiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5DaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0Q2hhbm5lbE1hc2sgPSBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5jaGFubmVsTWFzaygpOwotICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5zYW1wbGVSYXRlKCk7Ci0gICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Zm9ybWF0KCk7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0Q2hhbm5lbE1hc2sgPSBtUGxheWJhY2sudGhyZWFkKCktPmNoYW5uZWxNYXNrKCk7CisgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IG1QbGF5YmFjay50aHJlYWQoKS0+c2FtcGxlUmF0ZSgpOworICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IG1QbGF5YmFjay50aHJlYWQoKS0+Zm9ybWF0KCk7CiAKLSAgICBwYXRjaC0+bVBhdGNoUmVjb3JkID0gbmV3IFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bVJlY29yZFRocmVhZC5nZXQoKSwKKyAgICBhdWRpb19mb3JtYXRfdCBpbnB1dEZvcm1hdCA9IG1SZWNvcmQudGhyZWFkKCktPmZvcm1hdCgpOworICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShpbnB1dEZvcm1hdCkpIHsKKyAgICAgICAgLy8gVGhlIHBsYXliYWNrVGhyZWFkIGZvcm1hdCB3aWxsIHNheSBQQ00gZm9yIElFQzYxOTM3IHBhY2tldGl6ZWQgc3RyZWFtLgorICAgICAgICAvLyBVc2UgcmVjb3JkVGhyZWFkIGZvcm1hdC4KKyAgICAgICAgZm9ybWF0ID0gaW5wdXRGb3JtYXQ7CisgICAgfQorICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgaW5wdXRGbGFncyA9IG1BdWRpb1BhdGNoLnNvdXJjZXNbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUyA/CisgICAgICAgICAgICBtQXVkaW9QYXRjaC5zb3VyY2VzWzBdLmZsYWdzLmlucHV0IDogQVVESU9fSU5QVVRfRkxBR19OT05FOworICAgIGlmIChzYW1wbGVSYXRlID09IG1SZWNvcmQudGhyZWFkKCktPnNhbXBsZVJhdGUoKSAmJgorICAgICAgICAgICAgaW5DaGFubmVsTWFzayA9PSBtUmVjb3JkLnRocmVhZCgpLT5jaGFubmVsTWFzaygpICYmCisgICAgICAgICAgICBtUmVjb3JkLnRocmVhZCgpLT5mYXN0VHJhY2tBdmFpbGFibGUoKSAmJgorICAgICAgICAgICAgbVJlY29yZC50aHJlYWQoKS0+aGFzRmFzdENhcHR1cmUoKSkgeworICAgICAgICAvLyBDcmVhdGUgYSBmYXN0IHRyYWNrIGlmIHRoZSByZWNvcmQgdGhyZWFkIGhhcyBmYXN0IGNhcHR1cmUgdG8gZ2V0IGJldHRlciBwZXJmb3JtYW5jZS4KKyAgICAgICAgLy8gT25seSBlbmFibGUgZmFzdCBtb2RlIHdoZW4gdGhlcmUgaXMgbm8gcmVzYW1wbGUgbmVlZGVkLgorICAgICAgICBpbnB1dEZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChpbnB1dEZsYWdzIHwgQVVESU9fSU5QVVRfRkxBR19GQVNUKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBGYXN0IG1vZGUgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGNhc2UuCisgICAgICAgIGlucHV0RmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKGlucHV0RmxhZ3MgJiB+QVVESU9fSU5QVVRfRkxBR19GQVNUKTsKKyAgICB9CisgICAgc3A8UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZD4gdGVtcFJlY29yZFRyYWNrID0gbmV3IChzdGQ6Om5vdGhyb3cpIFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVjb3JkLnRocmVhZCgpLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FKTsKLSAgICBpZiAocGF0Y2gtPm1QYXRjaFJlY29yZCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotICAgIHN0YXR1cyA9IHBhdGNoLT5tUGF0Y2hSZWNvcmQtPmluaXRDaGVjaygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRGbGFncyk7CisgICAgc3RhdHVzID0gbVJlY29yZC5jaGVja1RyYWNrKHRlbXBSZWNvcmRUcmFjay5nZXQoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICBwYXRjaC0+bVJlY29yZFRocmVhZC0+YWRkUGF0Y2hSZWNvcmQocGF0Y2gtPm1QYXRjaFJlY29yZCk7CisKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBvdXRwdXRGbGFncyA9IG1BdWRpb1BhdGNoLnNpbmtzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MgPworICAgICAgICAgICAgbUF1ZGlvUGF0Y2guc2lua3NbMF0uZmxhZ3Mub3V0cHV0IDogQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fUEFUQ0g7CisgICAgaWYgKG1BdWRpb1BhdGNoLm51bV9zb3VyY2VzID09IDIgJiYgbUF1ZGlvUGF0Y2guc291cmNlc1sxXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgLy8gInJldXNlIG9uZSBleGlzdGluZyBvdXRwdXQgbWl4IiBjYXNlCisgICAgICAgIHN0cmVhbVR5cGUgPSBtQXVkaW9QYXRjaC5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW07CisgICAgfQorICAgIGlmIChtUGxheWJhY2sudGhyZWFkKCktPmhhc0Zhc3RNaXhlcigpKSB7CisgICAgICAgIC8vIENyZWF0ZSBhIGZhc3QgdHJhY2sgaWYgdGhlIHBsYXliYWNrIHRocmVhZCBoYXMgZmFzdCBtaXhlciB0byBnZXQgYmV0dGVyIHBlcmZvcm1hbmNlLgorICAgICAgICBvdXRwdXRGbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKG91dHB1dEZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7CisgICAgfQogCiAgICAgLy8gY3JlYXRlIGEgc3BlY2lhbCBwbGF5YmFjayB0cmFjayB0byByZW5kZXIgdG8gcGxheWJhY2sgdGhyZWFkLgogICAgIC8vIHRoaXMgdHJhY2sgaXMgZ2l2ZW4gdGhlIHNhbWUgYnVmZmVyIGFzIHRoZSBQYXRjaFJlY29yZCBidWZmZXIKLSAgICBwYXRjaC0+bVBhdGNoVHJhY2sgPSBuZXcgUGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1BhdGNoLT5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW0sCisgICAgc3A8UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s+IHRlbXBQYXRjaFRyYWNrID0gbmV3IChzdGQ6Om5vdGhyb3cpIFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5YmFjay50aHJlYWQoKS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+YnVmZmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+YnVmZmVyU2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUpOwotICAgIHN0YXR1cyA9IHBhdGNoLT5tUGF0Y2hUcmFjay0+aW5pdENoZWNrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFJlY29yZFRyYWNrLT5idWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wUmVjb3JkVHJhY2stPmJ1ZmZlclNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGbGFncyk7CisgICAgc3RhdHVzID0gbVBsYXliYWNrLmNoZWNrVHJhY2sodGVtcFBhdGNoVHJhY2suZ2V0KCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+YWRkUGF0Y2hUcmFjayhwYXRjaC0+bVBhdGNoVHJhY2spOwogCiAgICAgLy8gdGllIHBsYXliYWNrIGFuZCByZWNvcmQgdHJhY2tzIHRvZ2V0aGVyCi0gICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+c2V0UGVlclByb3h5KHBhdGNoLT5tUGF0Y2hUcmFjay5nZXQoKSk7Ci0gICAgcGF0Y2gtPm1QYXRjaFRyYWNrLT5zZXRQZWVyUHJveHkocGF0Y2gtPm1QYXRjaFJlY29yZC5nZXQoKSk7CisgICAgbVJlY29yZC5zZXRUcmFja0FuZFBlZXIodGVtcFJlY29yZFRyYWNrLCB0ZW1wUGF0Y2hUcmFjayk7CisgICAgbVBsYXliYWNrLnNldFRyYWNrQW5kUGVlcih0ZW1wUGF0Y2hUcmFjaywgdGVtcFJlY29yZFRyYWNrKTsKIAogICAgIC8vIHN0YXJ0IGNhcHR1cmUgYW5kIHBsYXliYWNrCi0gICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+c3RhcnQoQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSwgQVVESU9fU0VTU0lPTl9OT05FKTsKLSAgICBwYXRjaC0+bVBhdGNoVHJhY2stPnN0YXJ0KCk7CisgICAgbVJlY29yZC50cmFjaygpLT5zdGFydChBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9OT05FLCBBVURJT19TRVNTSU9OX05PTkUpOworICAgIG1QbGF5YmFjay50cmFjaygpLT5zdGFydCgpOwogCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmNsZWFyUGF0Y2hDb25uZWN0aW9ucyhQYXRjaCAqcGF0Y2gpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2g6OmNsZWFyQ29ubmVjdGlvbnMoUGF0Y2hQYW5lbCAqcGFuZWwpCiB7Ci0gICAgc3A8QXVkaW9GbGluZ2VyPiBhdWRpb2ZsaW5nZXIgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKLSAgICBpZiAoYXVkaW9mbGluZ2VyID09IDApIHsKLSAgICAgICAgcmV0dXJuOworICAgIEFMT0dWKCIlcygpIG1SZWNvcmQuaGFuZGxlICVkIG1QbGF5YmFjay5oYW5kbGUgJWQiLAorICAgICAgICAgICAgX19mdW5jX18sIG1SZWNvcmQuaGFuZGxlKCksIG1QbGF5YmFjay5oYW5kbGUoKSk7CisgICAgbVJlY29yZC5zdG9wVHJhY2soKTsKKyAgICBtUGxheWJhY2suc3RvcFRyYWNrKCk7CisgICAgbVJlY29yZC5jbGVhclRyYWNrUGVlcigpOyAvLyBtUmVjb3JkIHN0b3AgaXMgc3luY2hyb25vdXMuIEJyZWFrIFBlZXJQcm94eSBzcDw+IGN5Y2xlLgorICAgIG1SZWNvcmQuY2xvc2VDb25uZWN0aW9ucyhwYW5lbCk7CisgICAgbVBsYXliYWNrLmNsb3NlQ29ubmVjdGlvbnMocGFuZWwpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlBhdGNoOjpnZXRMYXRlbmN5TXMoZG91YmxlICpsYXRlbmN5TXMpIGNvbnN0Cit7CisgICAgaWYgKCFpc1NvZnR3YXJlKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIGF1dG8gcmVjb3JkVHJhY2sgPSBtUmVjb3JkLmNvbnN0X3RyYWNrKCk7CisgICAgaWYgKHJlY29yZFRyYWNrLmdldCgpID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIGF1dG8gcGxheWJhY2tUcmFjayA9IG1QbGF5YmFjay5jb25zdF90cmFjaygpOworICAgIGlmIChwbGF5YmFja1RyYWNrLmdldCgpID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIC8vIExhdGVuY3kgaW5mb3JtYXRpb24gZm9yIHRyYWNrcyBtYXkgYmUgY2FsbGVkIHdpdGhvdXQgb2J0YWluaW5nCisgICAgLy8gdGhlIHVuZGVybHlpbmcgdGhyZWFkIGxvY2suCisgICAgLy8KKyAgICAvLyBXZSB1c2UgcmVjb3JkIHNlcnZlciBsYXRlbmN5ICsgcGxheWJhY2sgdHJhY2sgbGF0ZW5jeSAoZ2VuZXJhbGx5IHNtYWxsZXIgdGhhbiB0aGUKKyAgICAvLyByZXZlcnNlIGR1ZSB0byBpbnRlcm5hbCBiaWFzZXMpLgorICAgIC8vCisgICAgLy8gVE9ETzogaXMgdGhpcyBzdGFibGUgZW5vdWdoPyBDb25zaWRlciBhIFBhdGNoVHJhY2sgc3luY2hyb25pemVkIHZlcnNpb24gb2YgdGhpcy4KKworICAgIC8vIEZvciBQQ00gdHJhY2tzIGdldCBzZXJ2ZXIgbGF0ZW5jeS4KKyAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShyZWNvcmRUcmFjay0+Zm9ybWF0KCkpKSB7CisgICAgICAgIGRvdWJsZSByZWNvcmRTZXJ2ZXJMYXRlbmN5TXMsIHBsYXliYWNrVHJhY2tMYXRlbmN5TXM7CisgICAgICAgIGlmIChyZWNvcmRUcmFjay0+Z2V0U2VydmVyTGF0ZW5jeU1zKCZyZWNvcmRTZXJ2ZXJMYXRlbmN5TXMpID09IE9LCisgICAgICAgICAgICAgICAgJiYgcGxheWJhY2tUcmFjay0+Z2V0VHJhY2tMYXRlbmN5TXMoJnBsYXliYWNrVHJhY2tMYXRlbmN5TXMpID09IE9LKSB7CisgICAgICAgICAgICAqbGF0ZW5jeU1zID0gcmVjb3JkU2VydmVyTGF0ZW5jeU1zICsgcGxheWJhY2tUcmFja0xhdGVuY3lNczsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQogICAgIH0KIAotICAgIEFMT0dWKCJjbGVhclBhdGNoQ29ubmVjdGlvbnMoKSBwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlICVkIHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSAlZCIsCi0gICAgICAgICAgcGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSwgcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlKTsKKyAgICAvLyBTZWUgaWYga2VybmVsIGxhdGVuY2llcyBhcmUgYXZhaWxhYmxlLgorICAgIC8vIElmIHNvLCBkbyBhIGZyYW1lIGRpZmYgYW5kIHRpbWUgZGlmZmVyZW5jZSBjb21wdXRhdGlvbiB0byBlc3RpbWF0ZQorICAgIC8vIHRoZSB0b3RhbCBwYXRjaCBsYXRlbmN5LiBUaGlzIHJlcXVpcmVzIHRoYXQgZnJhbWUgY291bnRzIGFyZSByZXBvcnRlZCBieSB0aGUKKyAgICAvLyBIQUwgYXJlIG1hdGNoZWQgcHJvcGVybHkgaW4gdGhlIGNhc2Ugb2YgcmVjb3JkIG92ZXJydW5zIGFuZCBwbGF5YmFjayB1bmRlcnJ1bnMuCisgICAgVGhyZWFkQmFzZTo6VHJhY2tCYXNlOjpGcmFtZVRpbWUgcmVjb3JkRlR7fSwgcGxheUZUe307CisgICAgcmVjb3JkVHJhY2stPmdldEtlcm5lbEZyYW1lVGltZSgmcmVjb3JkRlQpOworICAgIHBsYXliYWNrVHJhY2stPmdldEtlcm5lbEZyYW1lVGltZSgmcGxheUZUKTsKKyAgICBpZiAocmVjb3JkRlQudGltZU5zID4gMCAmJiBwbGF5RlQudGltZU5zID4gMCkgeworICAgICAgICBjb25zdCBpbnQ2NF90IGZyYW1lRGlmZiA9IHJlY29yZEZULmZyYW1lcyAtIHBsYXlGVC5mcmFtZXM7CisgICAgICAgIGNvbnN0IGludDY0X3QgdGltZURpZmZOcyA9IHJlY29yZEZULnRpbWVOcyAtIHBsYXlGVC50aW1lTnM7CiAKLSAgICBpZiAocGF0Y2gtPm1QYXRjaFJlY29yZCAhPSAwKSB7Ci0gICAgICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPnN0b3AoKTsKLSAgICB9Ci0gICAgaWYgKHBhdGNoLT5tUGF0Y2hUcmFjayAhPSAwKSB7Ci0gICAgICAgIHBhdGNoLT5tUGF0Y2hUcmFjay0+c3RvcCgpOwotICAgIH0KLSAgICBpZiAocGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlKTsKLSAgICAgICAgcGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIH0KLSAgICBpZiAocGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSk7Ci0gICAgICAgIHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIH0KLSAgICBpZiAocGF0Y2gtPm1SZWNvcmRUaHJlYWQgIT0gMCkgewotICAgICAgICBpZiAocGF0Y2gtPm1QYXRjaFJlY29yZCAhPSAwKSB7Ci0gICAgICAgICAgICBwYXRjaC0+bVJlY29yZFRocmVhZC0+ZGVsZXRlUGF0Y2hSZWNvcmQocGF0Y2gtPm1QYXRjaFJlY29yZCk7CisgICAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHBhdGNoIHRyYWNrIGFuZCBwYXRjaCByZWNvcmQgaGF2ZSBhIGxhcmdlIHRpbWUgZGlzcGFyaXR5IGJlY2F1c2UKKyAgICAgICAgLy8gb25lIHRocmVhZCBydW5zIGJ1dCBhbm90aGVyIGlzIHN0b3BwZWQuICBXZSBhcmJpdHJhcmlseSBjaG9vc2UgdGhlIG1heGltdW0gdGltZXN0YW1wCisgICAgICAgIC8vIHRpbWUgZGlmZmVyZW5jZSBiYXNlZCBvbiBob3cgb2Z0ZW4gd2UgZXhwZWN0IHRoZSB0aW1lc3RhbXBzIHRvIHVwZGF0ZSBpbiBub3JtYWwgb3BlcmF0aW9uCisgICAgICAgIC8vICh0eXBpY2FsIHNob3VsZCBiZSBubyBtb3JlIHRoYW4gNTAgbXMpLgorICAgICAgICAvLworICAgICAgICAvLyBJZiB0aGUgdGltZXN0YW1wcyBhcmVuJ3Qgc2FtcGxlZCBjbG9zZSBlbm91Z2gsIHRoZSBwYXRjaCBsYXRlbmN5IGlzIG5vdAorICAgICAgICAvLyBjb25zaWRlcmVkIHZhbGlkLgorICAgICAgICAvLworICAgICAgICAvLyBUT0RPOiBjaGFuZ2UgdGhpcyBiYXNlZCBvbiBtb3JlIGV4cGVyaW1lbnRzLgorICAgICAgICBjb25zdGV4cHIgaW50NjRfdCBtYXhWYWxpZFRpbWVEaWZmTnMgPSAyMDAgKiBOQU5PU19QRVJfTUlMTElTRUNPTkQ7CisgICAgICAgIGlmIChzdGQ6OmFicyh0aW1lRGlmZk5zKSA8IG1heFZhbGlkVGltZURpZmZOcykgeworICAgICAgICAgICAgKmxhdGVuY3lNcyA9IGZyYW1lRGlmZiAqIDFlMyAvIHJlY29yZFRyYWNrLT5zYW1wbGVSYXRlKCkKKyAgICAgICAgICAgICAgICAgICAtIHRpbWVEaWZmTnMgKiAxZS02OworICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9Ci0gICAgICAgIGF1ZGlvZmxpbmdlci0+Y2xvc2VJbnB1dEludGVybmFsX2wocGF0Y2gtPm1SZWNvcmRUaHJlYWQpOwotICAgIH0KLSAgICBpZiAocGF0Y2gtPm1QbGF5YmFja1RocmVhZCAhPSAwKSB7Ci0gICAgICAgIGlmIChwYXRjaC0+bVBhdGNoVHJhY2sgIT0gMCkgewotICAgICAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+ZGVsZXRlUGF0Y2hUcmFjayhwYXRjaC0+bVBhdGNoVHJhY2spOwotICAgICAgICB9Ci0gICAgICAgIC8vIGlmIG51bSBzb3VyY2VzID09IDIgd2UgYXJlIHJldXNpbmcgYW4gZXhpc3RpbmcgcGxheWJhY2sgdGhyZWFkIHNvIHdlIGRvIG5vdCBjbG9zZSBpdAotICAgICAgICBpZiAocGF0Y2gtPm1BdWRpb1BhdGNoLm51bV9zb3VyY2VzICE9IDIpIHsKLSAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+Y2xvc2VPdXRwdXRJbnRlcm5hbF9sKHBhdGNoLT5tUGxheWJhY2tUaHJlYWQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwYXRjaC0+bVJlY29yZFRocmVhZCAhPSAwKSB7Ci0gICAgICAgIGlmIChwYXRjaC0+bVBhdGNoUmVjb3JkICE9IDApIHsKLSAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBwYXRjaC0+bVJlY29yZFRocmVhZC5jbGVhcigpOwotICAgIH0KLSAgICBpZiAocGF0Y2gtPm1QbGF5YmFja1RocmVhZCAhPSAwKSB7Ci0gICAgICAgIGlmIChwYXRjaC0+bVBhdGNoVHJhY2sgIT0gMCkgewotICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFRyYWNrLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC5jbGVhcigpOwogICAgIH0KIAorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworU3RyaW5nOCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlBhdGNoOjpkdW1wKGF1ZGlvX3BhdGNoX2hhbmRsZV90IG15SGFuZGxlKSBjb25zdAoreworICAgIC8vIFRPRE86IENvbnNpZGVyIHRhYmxlIGR1bXAgZm9ybSBmb3IgcGF0Y2hlcywganVzdCBsaWtlIHRyYWNrcy4KKyAgICBTdHJpbmc4IHJlc3VsdCA9IFN0cmluZzg6OmZvcm1hdCgiUGF0Y2ggJWQ6IHRocmVhZCAlcCA9PiB0aHJlYWQgJXAiLAorICAgICAgICAgICAgbXlIYW5kbGUsIG1SZWNvcmQuY29uc3RfdGhyZWFkKCkuZ2V0KCksIG1QbGF5YmFjay5jb25zdF90aHJlYWQoKS5nZXQoKSk7CisKKyAgICAvLyBhZGQgbGF0ZW5jeSBpZiBpdCBleGlzdHMKKyAgICBkb3VibGUgbGF0ZW5jeU1zOworICAgIGlmIChnZXRMYXRlbmN5TXMoJmxhdGVuY3lNcykgPT0gT0spIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBsYXRlbmN5OiAlLjJsZiBtcyIsIGxhdGVuY3lNcyk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIERpc2Nvbm5lY3QgYSBwYXRjaCAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCiB7Ci0gICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoIGhhbmRsZSAlZCIsIGhhbmRsZSk7CisgICAgQUxPR1YoIiVzIGhhbmRsZSAlZCIsIF9fZnVuY19fLCBoYW5kbGUpOwogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIHNpemVfdCBpbmRleDsKIAotICAgIHNwPEF1ZGlvRmxpbmdlcj4gYXVkaW9mbGluZ2VyID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7Ci0gICAgaWYgKGF1ZGlvZmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1QYXRjaGVzLnNpemUoKTsgaW5kZXgrKykgewotICAgICAgICBpZiAoaGFuZGxlID09IG1QYXRjaGVzW2luZGV4XS0+bUhhbmRsZSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGluZGV4ID09IG1QYXRjaGVzLnNpemUoKSkgeworICAgIGF1dG8gaXRlciA9IG1QYXRjaGVzLmZpbmQoaGFuZGxlKTsKKyAgICBpZiAoaXRlciA9PSBtUGF0Y2hlcy5lbmQoKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBQYXRjaCAqcmVtb3ZlZFBhdGNoID0gbVBhdGNoZXNbaW5kZXhdOwotICAgIG1QYXRjaGVzLnJlbW92ZUF0KGluZGV4KTsKKyAgICBQYXRjaCAmcmVtb3ZlZFBhdGNoID0gaXRlci0+c2Vjb25kOworICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAmcGF0Y2ggPSByZW1vdmVkUGF0Y2gubUF1ZGlvUGF0Y2g7CiAKLSAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoID0gJnJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2g7Ci0KLSAgICBzd2l0Y2ggKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUpIHsKKyAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgJnNyYyA9IHBhdGNoLnNvdXJjZXNbMF07CisgICAgc3dpdGNoIChzcmMudHlwZSkgewogICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U6IHsKLSAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBzcmNNb2R1bGUgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZTsKLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KHNyY01vZHVsZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInJlbGVhc2VBdWRpb1BhdGNoKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBzcmNNb2R1bGUpOworICAgICAgICAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBod0RldmljZSA9IGZpbmRId0RldmljZUJ5TW9kdWxlKHNyYy5leHQuZGV2aWNlLmh3X21vZHVsZSk7CisgICAgICAgICAgICBpZiAoaHdEZXZpY2UgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgX19mdW5jX18sIHNyYy5leHQuZGV2aWNlLmh3X21vZHVsZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocmVtb3ZlZFBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUgfHwKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZFBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIGNsZWFyUGF0Y2hDb25uZWN0aW9ucyhyZW1vdmVkUGF0Y2gpOworICAgICAgICAgICAgaWYgKHJlbW92ZWRQYXRjaC5pc1NvZnR3YXJlKCkpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVkUGF0Y2guY2xlYXJDb25uZWN0aW9ucyh0aGlzKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKLSAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPmNoZWNrUmVjb3JkVGhyZWFkX2woCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChwYXRjaC5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSA9IHBhdGNoLnNpbmtzWzBdLmV4dC5taXguaGFuZGxlOworICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIuY2hlY2tSZWNvcmRUaHJlYWRfbChpb0hhbmRsZSk7CiAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tNbWFwVGhyZWFkX2wocGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja01tYXBUaHJlYWRfbChpb0hhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInJlbGVhc2VBdWRpb1BhdGNoKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsIF9fZnVuY19fLCBpb0hhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHJlbW92ZWRQYXRjaC0+bUhhbEhhbmRsZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChyZW1vdmVkUGF0Y2gubUhhbEhhbmRsZSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGh3RGV2aWNlID0gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocmVtb3ZlZFBhdGNoLT5tSGFsSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocmVtb3ZlZFBhdGNoLm1IYWxIYW5kbGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9NSVg6IHsKLSAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBzcmNNb2R1bGUgPSAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5od19tb2R1bGU7Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShzcmNNb2R1bGUpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgc3JjTW9kdWxlKTsKKyAgICAgICAgICAgIGlmIChmaW5kSHdEZXZpY2VCeU1vZHVsZShzcmMuZXh0Lm1peC5od19tb2R1bGUpID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIF9fZnVuY19fLCBzcmMuZXh0Lm1peC5od19tb2R1bGUpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5jaGVja1BsYXliYWNrVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUgPSBzcmMuZXh0Lm1peC5oYW5kbGU7CisgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLmNoZWNrUGxheWJhY2tUaHJlYWRfbChpb0hhbmRsZSk7CiAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPmNoZWNrTW1hcFRocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLmNoZWNrTW1hcFRocmVhZF9sKGlvSGFuZGxlKTsKICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coInJlbGVhc2VBdWRpb1BhdGNoKCkgYmFkIHBsYXliYWNrIEkvTyBoYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBiYWQgcGxheWJhY2sgSS9PIGhhbmRsZSAlZCIsIF9fZnVuY19fLCBpb0hhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChyZW1vdmVkUGF0Y2gtPm1IYWxIYW5kbGUpOworICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChyZW1vdmVkUGF0Y2gubUhhbEhhbmRsZSk7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBkZWxldGUgcmVtb3ZlZFBhdGNoOworICAgIG1QYXRjaGVzLmVyYXNlKGl0ZXIpOworICAgIHJlbW92ZVNvZnR3YXJlUGF0Y2hGcm9tSW5zZXJ0ZWRNb2R1bGVzKGhhbmRsZSk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotCiAvKiBMaXN0IGNvbm5lY3RlZCBhdWRpbyBwb3J0cyBhbmQgdGhleSBhdHRyaWJ1dGVzICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6Omxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcyBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMgX191bnVzZWQpCiB7Ci0gICAgQUxPR1YoImxpc3RBdWRpb1BhdGNoZXMiKTsKKyAgICBBTE9HVihfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi0vKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Z2V0RG93bnN0cmVhbVNvZnR3YXJlUGF0Y2hlcygKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtLAorICAgICAgICBzdGQ6OnZlY3RvcjxBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlNvZnR3YXJlUGF0Y2g+ICpwYXRjaGVzKSBjb25zdAogewotICAgIEFMT0dWKCJzZXRBdWRpb1BvcnRDb25maWciKTsKLQotICAgIHNwPEF1ZGlvRmxpbmdlcj4gYXVkaW9mbGluZ2VyID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7Ci0gICAgaWYgKGF1ZGlvZmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgIGZvciAoY29uc3QgYXV0byYgbW9kdWxlIDogbUluc2VydGVkTW9kdWxlcykgeworICAgICAgICBpZiAobW9kdWxlLnNlY29uZC5zdHJlYW1zLmNvdW50KHN0cmVhbSkpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGF0Y2hIYW5kbGUgOiBtb2R1bGUuc2Vjb25kLnN3X3BhdGNoZXMpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvJiBwYXRjaF9pdGVyID0gbVBhdGNoZXMuZmluZChwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoX2l0ZXIgIT0gbVBhdGNoZXMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUGF0Y2ggJnBhdGNoID0gcGF0Y2hfaXRlci0+c2Vjb25kOworICAgICAgICAgICAgICAgICAgICBwYXRjaGVzLT5lbXBsYWNlX2JhY2soKnRoaXMsIHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLm1QbGF5YmFjay5jb25zdF90aHJlYWQoKS0+aWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC5tUmVjb3JkLmNvbnN0X3RocmVhZCgpLT5pZCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiU3RhbGUgcGF0Y2ggaGFuZGxlIGluIHRoZSBjYWNoZTogJWQiLCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CiAgICAgfQorICAgIC8vIFRoZSBzdHJlYW0gaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgb2YgaW5zZXJ0ZWQgbW9kdWxlcy4KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQogCi0gICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZTsKLSAgICBpZiAoY29uZmlnLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgbW9kdWxlID0gY29uZmlnLT5leHQuZGV2aWNlLmh3X21vZHVsZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtb2R1bGUgPSBjb25maWctPmV4dC5taXguaHdfbW9kdWxlOwordm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6Om5vdGlmeVN0cmVhbU9wZW5lZCgKKyAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSwgYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtKQoreworICAgIGlmIChhdWRpb0h3RGV2aWNlLT5pc0luc2VydCgpKSB7CisgICAgICAgIG1JbnNlcnRlZE1vZHVsZXNbYXVkaW9Id0RldmljZS0+aGFuZGxlKCldLnN0cmVhbXMuaW5zZXJ0KHN0cmVhbSk7CiAgICAgfQorfQogCi0gICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkobW9kdWxlKTsKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpub3RpZnlTdHJlYW1DbG9zZWQoYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtKQoreworICAgIGZvciAoYXV0byYgbW9kdWxlIDogbUluc2VydGVkTW9kdWxlcykgeworICAgICAgICBtb2R1bGUuc2Vjb25kLnN0cmVhbXMuZXJhc2Uoc3RyZWFtKTsKKyAgICB9Cit9CisKK0F1ZGlvSHdEZXZpY2UqIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6ZmluZEF1ZGlvSHdEZXZpY2VCeU1vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlKQoreworICAgIGlmIChtb2R1bGUgPT0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FKSByZXR1cm4gbnVsbHB0cjsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvRmxpbmdlci5tQXVkaW9Id0RldnMuaW5kZXhPZktleShtb2R1bGUpOwogICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInNldEF1ZGlvUG9ydENvbmZpZygpIGJhZCBodyBtb2R1bGUgJWQiLCBtb2R1bGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HVygiJXMoKSBiYWQgaHcgbW9kdWxlICVkIiwgX19mdW5jX18sIG1vZHVsZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvRmxpbmdlci5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7Cit9CisKK3NwPERldmljZUhhbEludGVyZmFjZT4gQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpmaW5kSHdEZXZpY2VCeU1vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlKQoreworICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBmaW5kQXVkaW9Id0RldmljZUJ5TW9kdWxlKG1vZHVsZSk7CisgICAgcmV0dXJuIGF1ZGlvSHdEZXZpY2UgPyBhdWRpb0h3RGV2aWNlLT5od0RldmljZSgpIDogbnVsbHB0cjsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmFkZFNvZnR3YXJlUGF0Y2hUb0luc2VydGVkTW9kdWxlcygKKyAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIG1JbnNlcnRlZE1vZHVsZXNbbW9kdWxlXS5zd19wYXRjaGVzLmluc2VydChoYW5kbGUpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6cmVtb3ZlU29mdHdhcmVQYXRjaEZyb21JbnNlcnRlZE1vZHVsZXMoCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBmb3IgKGF1dG8mIG1vZHVsZSA6IG1JbnNlcnRlZE1vZHVsZXMpIHsKKyAgICAgICAgbW9kdWxlLnNlY29uZC5zd19wYXRjaGVzLmVyYXNlKGhhbmRsZSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6ZHVtcChpbnQgZmQpIGNvbnN0Cit7CisgICAgU3RyaW5nOCBwYXRjaFBhbmVsRHVtcDsKKyAgICBjb25zdCBjaGFyICppbmRlbnQgPSAiICAiOworCisgICAgLy8gT25seSBkdW1wIHNvZnR3YXJlIHBhdGNoZXMuCisgICAgYm9vbCBoZWFkZXJQcmludGVkID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvJiBpdGVyIDogbVBhdGNoZXMpIHsKKyAgICAgICAgaWYgKGl0ZXIuc2Vjb25kLmlzU29mdHdhcmUoKSkgeworICAgICAgICAgICAgaWYgKCFoZWFkZXJQcmludGVkKSB7CisgICAgICAgICAgICAgICAgcGF0Y2hQYW5lbER1bXAgKz0gIlxuU29mdHdhcmUgcGF0Y2hlczpcbiI7CisgICAgICAgICAgICAgICAgaGVhZGVyUHJpbnRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXRjaFBhbmVsRHVtcC5hcHBlbmRGb3JtYXQoIiVzJXNcbiIsIGluZGVudCwgaXRlci5zZWNvbmQuZHVtcChpdGVyLmZpcnN0KS5zdHJpbmcoKSk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7Ci0gICAgcmV0dXJuIGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCktPnNldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIGhlYWRlclByaW50ZWQgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG1vZHVsZSA6IG1JbnNlcnRlZE1vZHVsZXMpIHsKKyAgICAgICAgaWYgKCFtb2R1bGUuc2Vjb25kLnN0cmVhbXMuZW1wdHkoKSB8fCAhbW9kdWxlLnNlY29uZC5zd19wYXRjaGVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmICghaGVhZGVyUHJpbnRlZCkgeworICAgICAgICAgICAgICAgIHBhdGNoUGFuZWxEdW1wICs9ICJcblRyYWNrZWQgaW5zZXJ0ZWQgbW9kdWxlczpcbiI7CisgICAgICAgICAgICAgICAgaGVhZGVyUHJpbnRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmc4IG1vZHVsZUR1bXAgPSBTdHJpbmc4Ojpmb3JtYXQoIk1vZHVsZSAlZDogSS9PIGhhbmRsZXM6ICIsIG1vZHVsZS5maXJzdCk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN0cmVhbSA6IG1vZHVsZS5zZWNvbmQuc3RyZWFtcykgeworICAgICAgICAgICAgICAgIG1vZHVsZUR1bXAuYXBwZW5kRm9ybWF0KCIlZCAiLCBzdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbW9kdWxlRHVtcC5hcHBlbmQoIjsgU1cgUGF0Y2hlczogIik7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhdGNoIDogbW9kdWxlLnNlY29uZC5zd19wYXRjaGVzKSB7CisgICAgICAgICAgICAgICAgbW9kdWxlRHVtcC5hcHBlbmRGb3JtYXQoIiVkICIsIHBhdGNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhdGNoUGFuZWxEdW1wLmFwcGVuZEZvcm1hdCgiJXMlc1xuIiwgaW5kZW50LCBtb2R1bGVEdW1wLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcGF0Y2hQYW5lbER1bXAuaXNFbXB0eSgpKSB7CisgICAgICAgIHdyaXRlKGZkLCBwYXRjaFBhbmVsRHVtcC5zdHJpbmcoKSwgcGF0Y2hQYW5lbER1bXAuc2l6ZSgpKTsKKyAgICB9CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5oCmluZGV4IGQzN2MwZDMuLjE4MWUyN2MgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuaApAQCAtMTksMTMgKzE5LDMzIEBACiAgICAgI2Vycm9yIFRoaXMgaGVhZGVyIGZpbGUgc2hvdWxkIG9ubHkgYmUgaW5jbHVkZWQgZnJvbSBBdWRpb0ZsaW5nZXIuaAogI2VuZGlmCiAKLWNsYXNzIFBhdGNoUGFuZWwgOiBwdWJsaWMgUmVmQmFzZSB7CisKKy8vIFBhdGNoUGFuZWwgaXMgY29uY2VhbGVkIHdpdGhpbiBBdWRpb0ZsaW5nZXIsIHRoZWlyIGxpZmV0aW1lcyBhcmUgdGhlIHNhbWUuCitjbGFzcyBQYXRjaFBhbmVsIHsKIHB1YmxpYzoKKyAgICBjbGFzcyBTb2Z0d2FyZVBhdGNoIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgU29mdHdhcmVQYXRjaChjb25zdCBQYXRjaFBhbmVsICZwYXRjaFBhbmVsLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBwbGF5YmFja1RocmVhZEhhbmRsZSwgYXVkaW9faW9faGFuZGxlX3QgcmVjb3JkVGhyZWFkSGFuZGxlKQorICAgICAgICAgICAgICAgIDogbVBhdGNoUGFuZWwocGF0Y2hQYW5lbCksIG1QYXRjaEhhbmRsZShwYXRjaEhhbmRsZSksCisgICAgICAgICAgICAgICAgICBtUGxheWJhY2tUaHJlYWRIYW5kbGUocGxheWJhY2tUaHJlYWRIYW5kbGUpLAorICAgICAgICAgICAgICAgICAgbVJlY29yZFRocmVhZEhhbmRsZShyZWNvcmRUaHJlYWRIYW5kbGUpIHt9CisgICAgICAgIFNvZnR3YXJlUGF0Y2goY29uc3QgU29mdHdhcmVQYXRjaCYpID0gZGVmYXVsdDsKKyAgICAgICAgU29mdHdhcmVQYXRjaCYgb3BlcmF0b3I9KGNvbnN0IFNvZnR3YXJlUGF0Y2gmKSA9IGRlZmF1bHQ7CiAKLSAgICBjbGFzcyBQYXRjaDsKKyAgICAgICAgLy8gTXVzdCBiZSBjYWxsZWQgdW5kZXIgQXVkaW9GbGluZ2VyOjptTG9jaworICAgICAgICBzdGF0dXNfdCBnZXRMYXRlbmN5TXNfbChkb3VibGUgKmxhdGVuY3lNcykgY29uc3Q7CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbVBhdGNoSGFuZGxlOyB9OworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRQbGF5YmFja1RocmVhZEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1QbGF5YmFja1RocmVhZEhhbmRsZTsgfTsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0UmVjb3JkVGhyZWFkSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbVJlY29yZFRocmVhZEhhbmRsZTsgfTsKKyAgICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IFBhdGNoUGFuZWwgJm1QYXRjaFBhbmVsOworICAgICAgICBjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGU7CisgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IG1QbGF5YmFja1RocmVhZEhhbmRsZTsKKyAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgbVJlY29yZFRocmVhZEhhbmRsZTsKKyAgICB9OwogCi0gICAgZXhwbGljaXQgUGF0Y2hQYW5lbChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIpOwotICAgIHZpcnR1YWwgflBhdGNoUGFuZWwoKTsKKyAgICBleHBsaWNpdCBQYXRjaFBhbmVsKEF1ZGlvRmxpbmdlciogYXVkaW9GbGluZ2VyKSA6IG1BdWRpb0ZsaW5nZXIoKmF1ZGlvRmxpbmdlcikge30KIAogICAgIC8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCiAgICAgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHModW5zaWduZWQgaW50ICpudW1fcG9ydHMsCkBAIC00NSw0NiArNjUsMTU3IEBACiAgICAgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMpOwogCi0gICAgLyogU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbiAqLwotICAgIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisgICAgLy8gUmV0cmlldmVzIGFsbCBjdXJyZW50bHkgZXN0cmFibGlzaGVkIHNvZnR3YXJlIHBhdGNoZXMgZm9yIGEgc3RyZWFtCisgICAgLy8gb3BlbmVkIG9uIGFuIGludGVybWVkaWF0ZSBtb2R1bGUuCisgICAgc3RhdHVzX3QgZ2V0RG93bnN0cmVhbVNvZnR3YXJlUGF0Y2hlcyhhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0sCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTb2Z0d2FyZVBhdGNoPiAqcGF0Y2hlcykgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKFBhdGNoICpwYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqYXVkaW9QYXRjaCk7Ci0gICAgdm9pZCBjbGVhclBhdGNoQ29ubmVjdGlvbnMoUGF0Y2ggKnBhdGNoKTsKKyAgICAvLyBOb3RpZmllcyBwYXRjaCBwYW5lbCBhYm91dCBhbGwgb3BlbmVkIGFuZCBjbG9zZWQgc3RyZWFtcy4KKyAgICB2b2lkIG5vdGlmeVN0cmVhbU9wZW5lZChBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0pOworICAgIHZvaWQgbm90aWZ5U3RyZWFtQ2xvc2VkKGF1ZGlvX2lvX2hhbmRsZV90IHN0cmVhbSk7CisKKyAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUaHJlYWRUeXBlLCB0eXBlbmFtZSBUcmFja1R5cGU+CisgICAgY2xhc3MgRW5kcG9pbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgRW5kcG9pbnQoKSA9IGRlZmF1bHQ7CisgICAgICAgIEVuZHBvaW50KGNvbnN0IEVuZHBvaW50JikgPSBkZWxldGU7CisgICAgICAgIEVuZHBvaW50JiBvcGVyYXRvcj0oY29uc3QgRW5kcG9pbnQmKSA9IGRlbGV0ZTsKKyAgICAgICAgRW5kcG9pbnQoRW5kcG9pbnQmJiBvdGhlcikgbm9leGNlcHQgeyBzd2FwKG90aGVyKTsgfQorICAgICAgICBFbmRwb2ludCYgb3BlcmF0b3I9KEVuZHBvaW50JiYgb3RoZXIpIG5vZXhjZXB0IHsKKyAgICAgICAgICAgIHN3YXAob3RoZXIpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIH5FbmRwb2ludCgpIHsKKyAgICAgICAgICAgIEFMT0dFX0lGKG1IYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICJBIG5vbiBlbXB0eSBQYXRjaCBFbmRwb2ludCBsZWFrZWQsIGhhbmRsZSAlZCIsIG1IYW5kbGUpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgY2hlY2tUcmFjayhUcmFja1R5cGUgKnRyYWNrT3JOdWxsKSBjb25zdCB7CisgICAgICAgICAgICBpZiAodHJhY2tPck51bGwgPT0gbnVsbHB0cikgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybiB0cmFja09yTnVsbC0+aW5pdENoZWNrKCk7CisgICAgICAgIH0KKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbUhhbmRsZTsgfQorICAgICAgICBzcDxUaHJlYWRUeXBlPiB0aHJlYWQoKSB7IHJldHVybiBtVGhyZWFkOyB9CisgICAgICAgIHNwPFRyYWNrVHlwZT4gdHJhY2soKSB7IHJldHVybiBtVHJhY2s7IH0KKyAgICAgICAgc3A8Y29uc3QgVGhyZWFkVHlwZT4gY29uc3RfdGhyZWFkKCkgY29uc3QgeyByZXR1cm4gbVRocmVhZDsgfQorICAgICAgICBzcDxjb25zdCBUcmFja1R5cGU+IGNvbnN0X3RyYWNrKCkgY29uc3QgeyByZXR1cm4gbVRyYWNrOyB9CisKKyAgICAgICAgdm9pZCBjbG9zZUNvbm5lY3Rpb25zKFBhdGNoUGFuZWwgKnBhbmVsKSB7CisgICAgICAgICAgICBpZiAobUhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIHBhbmVsLT5yZWxlYXNlQXVkaW9QYXRjaChtSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVRocmVhZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG1UcmFjayAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1UaHJlYWQtPmRlbGV0ZVBhdGNoVHJhY2sobVRyYWNrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1DbG9zZVRocmVhZCkgeworICAgICAgICAgICAgICAgICAgICBwYW5lbC0+bUF1ZGlvRmxpbmdlci5jbG9zZVRocmVhZEludGVybmFsX2wobVRocmVhZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90KiBoYW5kbGVQdHIoKSB7IHJldHVybiAmbUhhbmRsZTsgfQorICAgICAgICB2b2lkIHNldFRocmVhZChjb25zdCBzcDxUaHJlYWRUeXBlPiYgdGhyZWFkLCBib29sIGNsb3NlVGhyZWFkID0gdHJ1ZSkgeworICAgICAgICAgICAgbVRocmVhZCA9IHRocmVhZDsKKyAgICAgICAgICAgIG1DbG9zZVRocmVhZCA9IGNsb3NlVGhyZWFkOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgICAgICB2b2lkIHNldFRyYWNrQW5kUGVlcihjb25zdCBzcDxUcmFja1R5cGU+JiB0cmFjaywgY29uc3Qgc3A8VD4gJnBlZXIpIHsKKyAgICAgICAgICAgIG1UcmFjayA9IHRyYWNrOworICAgICAgICAgICAgbVRocmVhZC0+YWRkUGF0Y2hUcmFjayhtVHJhY2spOworICAgICAgICAgICAgbVRyYWNrLT5zZXRQZWVyUHJveHkocGVlciwgdHJ1ZSAvKiBob2xkUmVmZXJlbmNlICovKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGNsZWFyVHJhY2tQZWVyKCkgeyBpZiAobVRyYWNrKSBtVHJhY2stPmNsZWFyUGVlclByb3h5KCk7IH0KKyAgICAgICAgdm9pZCBzdG9wVHJhY2soKSB7IGlmIChtVHJhY2spIG1UcmFjay0+c3RvcCgpOyB9CisKKyAgICAgICAgdm9pZCBzd2FwKEVuZHBvaW50ICZvdGhlcikgbm9leGNlcHQgeworICAgICAgICAgICAgdXNpbmcgc3RkOjpzd2FwOworICAgICAgICAgICAgc3dhcChtVGhyZWFkLCBvdGhlci5tVGhyZWFkKTsKKyAgICAgICAgICAgIHN3YXAobUNsb3NlVGhyZWFkLCBvdGhlci5tQ2xvc2VUaHJlYWQpOworICAgICAgICAgICAgc3dhcChtSGFuZGxlLCBvdGhlci5tSGFuZGxlKTsKKyAgICAgICAgICAgIHN3YXAobVRyYWNrLCBvdGhlci5tVHJhY2spOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIHZvaWQgc3dhcChFbmRwb2ludCAmYSwgRW5kcG9pbnQgJmIpIG5vZXhjZXB0IHsKKyAgICAgICAgICAgIGEuc3dhcChiKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3A8VGhyZWFkVHlwZT4gbVRocmVhZDsKKyAgICAgICAgYm9vbCBtQ2xvc2VUaHJlYWQgPSB0cnVlOworICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgIHNwPFRyYWNrVHlwZT4gbVRyYWNrOworICAgIH07CiAKICAgICBjbGFzcyBQYXRjaCB7CiAgICAgcHVibGljOgotICAgICAgICBleHBsaWNpdCBQYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoKSA6Ci0gICAgICAgICAgICBtQXVkaW9QYXRjaCgqcGF0Y2gpLCBtSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwKLSAgICAgICAgICAgIG1IYWxIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpLCBtUmVjb3JkUGF0Y2hIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpLAotICAgICAgICAgICAgbVBsYXliYWNrUGF0Y2hIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHt9Ci0gICAgICAgIH5QYXRjaCgpIHt9CisgICAgICAgIGV4cGxpY2l0IFBhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAmcGF0Y2gpIDogbUF1ZGlvUGF0Y2gocGF0Y2gpIHt9CisgICAgICAgIH5QYXRjaCgpOworICAgICAgICBQYXRjaChjb25zdCBQYXRjaCYpID0gZGVsZXRlOworICAgICAgICBQYXRjaChQYXRjaCYmKSA9IGRlZmF1bHQ7CisgICAgICAgIFBhdGNoJiBvcGVyYXRvcj0oY29uc3QgUGF0Y2gmKSA9IGRlbGV0ZTsKKyAgICAgICAgUGF0Y2gmIG9wZXJhdG9yPShQYXRjaCYmKSA9IGRlZmF1bHQ7CiAKKyAgICAgICAgc3RhdHVzX3QgY3JlYXRlQ29ubmVjdGlvbnMoUGF0Y2hQYW5lbCAqcGFuZWwpOworICAgICAgICB2b2lkIGNsZWFyQ29ubmVjdGlvbnMoUGF0Y2hQYW5lbCAqcGFuZWwpOworICAgICAgICBib29sIGlzU29mdHdhcmUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbVJlY29yZC5oYW5kbGUoKSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSB8fAorICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2suaGFuZGxlKCkgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7IH0KKworICAgICAgICAvLyByZXR1cm5zIHRoZSBsYXRlbmN5IG9mIHRoZSBwYXRjaCAoZnJvbSByZWNvcmQgdG8gcGxheWJhY2spLgorICAgICAgICBzdGF0dXNfdCBnZXRMYXRlbmN5TXMoZG91YmxlICpsYXRlbmN5TXMpIGNvbnN0OworCisgICAgICAgIFN0cmluZzggZHVtcChhdWRpb19wYXRjaF9oYW5kbGVfdCBteUhhbmRsZSkgY29uc3Q7CisKKyAgICAgICAgLy8gTm90ZSB0aGF0IGF1ZGlvX3BhdGNoOjppZCBpcyBvbmx5IHVuaXF1ZSB3aXRoaW4gYSBIQUwgbW9kdWxlCiAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAgICAgICAgICAgICAgbUF1ZGlvUGF0Y2g7Ci0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgICAgbUhhbmRsZTsKICAgICAgICAgLy8gaGFuZGxlIGZvciBhdWRpbyBIQUwgcGF0Y2ggaGFuZGxlIHByZXNlbnQgb25seSB3aGVuIHRoZSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA+PSAzLjAKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgICBtSGFsSGFuZGxlOworICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICAgIG1IYWxIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgLy8gYmVsb3cgbWVtYmVycyBhcmUgdXNlZCBieSBhIHNvZnR3YXJlIGF1ZGlvIHBhdGNoIGNvbm5lY3RpbmcgYSBzb3VyY2UgZGV2aWNlIGZyb20gYQogICAgICAgICAvLyBnaXZlbiBhdWRpbyBIVyBtb2R1bGUgdG8gYSBzaW5rIGRldmljZSBvbiBhbiBvdGhlciBhdWRpbyBIVyBtb2R1bGUuCi0gICAgICAgIC8vIHBsYXliYWNrIHRocmVhZCBjcmVhdGVkIGJ5IGNyZWF0ZUF1ZGlvUGF0Y2goKSBhbmQgcmVsZWFzZWQgYnkgY2xlYXJQYXRjaENvbm5lY3Rpb25zKCkgaWYKLSAgICAgICAgLy8gbm8gZXhpc3RpbmcgcGxheWJhY2sgdGhyZWFkIGNhbiBiZSB1c2VkIGJ5IHRoZSBzb2Z0d2FyZSBwYXRjaAotICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gICAgICAgICAgICAgIG1QbGF5YmFja1RocmVhZDsKLSAgICAgICAgLy8gYXVkaW8gdHJhY2sgY3JlYXRlZCBieSBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyUGF0Y2hDb25uZWN0aW9ucygpCi0gICAgICAgIHNwPFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrPiAgbVBhdGNoVHJhY2s7Ci0gICAgICAgIC8vIHJlY29yZCB0aHJlYWQgY3JlYXRlZCBieSBjcmVhdGVBdWRpb1BhdGNoKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyUGF0Y2hDb25uZWN0aW9ucygpCi0gICAgICAgIHNwPFJlY29yZFRocmVhZD4gICAgICAgICAgICAgICAgbVJlY29yZFRocmVhZDsKLSAgICAgICAgLy8gYXVkaW8gcmVjb3JkIGNyZWF0ZWQgYnkgY3JlYXRlUGF0Y2hDb25uZWN0aW9ucygpIGFuZCByZWxlYXNlZCBieSBjbGVhclBhdGNoQ29ubmVjdGlvbnMoKQotICAgICAgICBzcDxSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkPiAgIG1QYXRjaFJlY29yZDsKLSAgICAgICAgLy8gaGFuZGxlIGZvciBhdWRpbyBwYXRjaCBjb25uZWN0aW5nIHNvdXJjZSBkZXZpY2UgdG8gcmVjb3JkIHRocmVhZCBpbnB1dC4KLSAgICAgICAgLy8gY3JlYXRlZCBieSBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyUGF0Y2hDb25uZWN0aW9ucygpCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgICAgbVJlY29yZFBhdGNoSGFuZGxlOwotICAgICAgICAvLyBoYW5kbGUgZm9yIGF1ZGlvIHBhdGNoIGNvbm5lY3RpbmcgcGxheWJhY2sgdGhyZWFkIG91dHB1dCB0byBzaW5rIGRldmljZQotICAgICAgICAvLyBjcmVhdGVkIGJ5IGNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoKSBhbmQgcmVsZWFzZWQgYnkgY2xlYXJQYXRjaENvbm5lY3Rpb25zKCkKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgICBtUGxheWJhY2tQYXRjaEhhbmRsZTsKLQorICAgICAgICAvLyB0aGUgb2JqZWN0cyBhcmUgY3JlYXRlZCBieSBjcmVhdGVDb25uZWN0aW9ucygpIGFuZCByZWxlYXNlZCBieSBjbGVhckNvbm5lY3Rpb25zKCkKKyAgICAgICAgLy8gcGxheWJhY2sgdGhyZWFkIGlzIGNyZWF0ZWQgaWYgbm8gZXhpc3RpbmcgcGxheWJhY2sgdGhyZWFkIGNhbiBiZSB1c2VkCisgICAgICAgIC8vIGNvbm5lY3RzIHBsYXliYWNrIHRocmVhZCBvdXRwdXQgdG8gc2luayBkZXZpY2UKKyAgICAgICAgRW5kcG9pbnQ8UGxheWJhY2tUaHJlYWQsIFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrPiBtUGxheWJhY2s7CisgICAgICAgIC8vIGNvbm5lY3RzIHNvdXJjZSBkZXZpY2UgdG8gcmVjb3JkIHRocmVhZCBpbnB1dAorICAgICAgICBFbmRwb2ludDxSZWNvcmRUaHJlYWQsIFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ+IG1SZWNvcmQ7CiAgICAgfTsKIAotcHJpdmF0ZToKLSAgICBjb25zdCB3cDxBdWRpb0ZsaW5nZXI+ICAgICAgbUF1ZGlvRmxpbmdlcjsKLSAgICBTb3J0ZWRWZWN0b3IgPFBhdGNoICo+ICAgICAgbVBhdGNoZXM7CisgICAgQXVkaW9Id0RldmljZSogZmluZEF1ZGlvSHdEZXZpY2VCeU1vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlKTsKKyAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGZpbmRId0RldmljZUJ5TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUpOworICAgIHZvaWQgYWRkU29mdHdhcmVQYXRjaFRvSW5zZXJ0ZWRNb2R1bGVzKAorICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICB2b2lkIHJlbW92ZVNvZnR3YXJlUGF0Y2hGcm9tSW5zZXJ0ZWRNb2R1bGVzKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICBBdWRpb0ZsaW5nZXIgJm1BdWRpb0ZsaW5nZXI7CisgICAgc3RkOjptYXA8YXVkaW9fcGF0Y2hfaGFuZGxlX3QsIFBhdGNoPiBtUGF0Y2hlczsKKworICAgIC8vIFRoaXMgbWFwIGFsbG93cyBnb2luZyBmcm9tIGEgdGhyZWFkIHRvICJkb3duc3RyZWFtIiBzb2Z0d2FyZSBwYXRjaGVzCisgICAgLy8gd2hlbiBhIHByb2Nlc3NpbmcgbW9kdWxlIGluc2VydGVkIGluIGJldHdlZW4uIEV4YW1wbGU6CisgICAgLy8KKyAgICAvLyAgZnJvbSBtYXAgdmFsdWUuc3RyZWFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAga2V5CisgICAgLy8gIFtNaXhlciB0aHJlYWRdIC0tPiBbVmlydHVhbCBvdXRwdXQgZGV2aWNlXSAtLT4gW1Byb2Nlc3NpbmcgbW9kdWxlXSAtLS1cCisgICAgLy8gICAgICAgW0hhcndhcmUgbW9kdWxlXSA8LS0gW1BoeXNpY2FsIG91dHB1dCBkZXZpY2VdIDwtLSBbUy9XIFBhdGNoXSA8LS0vCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBtYXAgdmFsdWUuc3dfcGF0Y2hlcworICAgIC8vCisgICAgLy8gVGhpcyBhbGxvd3MgdGhlIG1peGVyIHRocmVhZCB0byBsb29rIHVwIHRoZSB0aHJlYWRzIG9mIHRoZSBzb2Z0d2FyZSBwYXRjaAorICAgIC8vIGZvciBwcm9wYWdhdGluZyB0aW1pbmcgaW5mbywgcGFyYW1ldGVycywgZXRjLgorICAgIC8vCisgICAgLy8gVGhlIGN1cnJlbnQgYXNzdW1wdGlvbnMgYXJlOgorICAgIC8vICAgMSkgVGhlIHByb2Nlc3NpbmcgbW9kdWxlIGFjdHMgYXMgYSBtaXhlciB3aXRoIHNldmVyYWwgb3V0cHV0cyB3aGljaAorICAgIC8vICAgICAgcmVwcmVzZW50IGRpZmZlcmVudGx5IGRvd25taXhlZCBhbmQgLyBvciBlbmNvZGVkIHZlcnNpb25zIG9mIHRoZSBzYW1lCisgICAgLy8gICAgICBtaXhlZCBzdHJlYW0uIFRoZXJlIGlzIG5vIDE6MSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIHRoZSBpbnB1dCBzdHJlYW1zCisgICAgLy8gICAgICBhbmQgdGhlIHNvZnR3YXJlIHBhdGNoZXMsIGJ1dCByYXRoZXIgYSBOOk4gY29ycmVzcG9uZGVuY2UgYmV0d2VlbgorICAgIC8vICAgICAgYSBncm91cCBvZiBzdHJlYW1zIGFuZCBhIGdyb3VwIG9mIHBhdGNoZXMuCisgICAgLy8gICAyKSBUaGVyZSBhcmUgb25seSBhIGNvdXBsZSBvZiBpbnNlcnRlZCBwcm9jZXNzaW5nIG1vZHVsZXMgaW4gdGhlIHN5c3RlbSwKKyAgICAvLyAgICAgIHNvIHdoZW4gbG9va2luZyBmb3IgYSBzdHJlYW0gb3IgcGF0Y2ggaGFuZGxlIHdlIGNhbiBpdGVyYXRlIG92ZXIKKyAgICAvLyAgICAgIGFsbCBtb2R1bGVzLgorICAgIHN0cnVjdCBNb2R1bGVDb25uZWN0aW9ucyB7CisgICAgICAgIHN0ZDo6c2V0PGF1ZGlvX2lvX2hhbmRsZV90PiBzdHJlYW1zOworICAgICAgICBzdGQ6OnNldDxhdWRpb19wYXRjaF9oYW5kbGVfdD4gc3dfcGF0Y2hlczsKKyAgICB9OworICAgIHN0ZDo6bWFwPGF1ZGlvX21vZHVsZV9oYW5kbGVfdCwgTW9kdWxlQ29ubmVjdGlvbnM+IG1JbnNlcnRlZE1vZHVsZXM7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAppbmRleCBhNzhiZTk5Li4zNTczNzBlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaApAQCAtNDEsMjIgKzQxLDE1IEBACiAgICAgdmlydHVhbCAgICAgICAgICAgICB+VHJhY2soKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpIGNvbnN0OwogCi0gICAgc3RhdGljICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBhcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24gPSBBVURJT19TRVNTSU9OX05PTkUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCA9IEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24gPSBBVURJT19TRVNTSU9OX05PTkUpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgc3RvcCgpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgcGF1c2UoKTsKIAogICAgICAgICAgICAgdm9pZCAgICAgICAgZmx1c2goKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGRlc3Ryb3koKTsKLSAgICAgICAgICAgIGludCAgICAgICAgIG5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQotICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0TmFtZShpbnQgbmFtZSkgewotICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobU5hbWUgPj0gMCAmJiBuYW1lID49IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAiJXMgYm90aCBvbGQgbmFtZSAlZCBhbmQgbmV3IG5hbWUgJWQgYXJlIHZhbGlkIiwgX19mdW5jX18sIG1OYW1lLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBtTmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICB9CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoKSBjb25zdDsKIApAQCAtNjUsMTIgKzU4LDE1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc09mZmxvYWRlZCgpIGNvbnN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwOyB9Ci0gICAgICAgICAgICBib29sICAgICAgICBpc0RpcmVjdCgpIGNvbnN0IHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDA7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzRGlyZWN0KCkgY29uc3Qgb3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMDsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNPZmZsb2FkZWRPckRpcmVjdCgpIGNvbnN0IHsgcmV0dXJuIChtRmxhZ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIChBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkpICE9IDA7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzU3RhdGljKCkgY29uc3QgeyByZXR1cm4gIG1TaGFyZWRCdWZmZXIuZ2V0KCkgIT0gbnVsbHB0cjsgfQogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICBhdHRhY2hBdXhFZmZlY3QoaW50IEVmZmVjdElkKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldEF1eEJ1ZmZlcihpbnQgRWZmZWN0SWQsIGludDMyX3QgKmJ1ZmZlcik7CiAgICAgICAgICAgICBpbnQzMl90ICAgICAqYXV4QnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUF1eEJ1ZmZlcjsgfQpAQCAtODcsNiArODMsMTAgQEAKIAogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgIT0gMDsgfQogCisgICAgICAgICAgICBkb3VibGUgICAgICBidWZmZXJMYXRlbmN5TXMoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzU3RhdGljKCkgPyAwLiA6IFRyYWNrQmFzZTo6YnVmZmVyTGF0ZW5jeU1zKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKIC8vIGltcGxlbWVudCB2b2x1bWUgaGFuZGxpbmcuCiAgICAgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKQEAgLTExMSw2ICsxMTEsMjYgQEAKICAgICAvKiogQ29weSB0aGUgdHJhY2sgbWV0YWRhdGEgaW4gdGhlIHByb3ZpZGVkIGl0ZXJhdG9yLiBUaHJlYWQgc2FmZS4gKi8KICAgICB2aXJ0dWFsIHZvaWQgICAgY29weU1ldGFkYXRhVG8oTWV0YWRhdGFJbnNlcnRlciYgYmFja0luc2VydGVyKSBjb25zdDsKIAorICAgICAgICAgICAgLyoqIFJldHVybiBoYXB0aWMgcGxheWJhY2sgb2YgdGhlIHRyYWNrIGlzIGVuYWJsZWQgb3Igbm90LCB1c2VkIGluIG1peGVyLiAqLworICAgICAgICAgICAgYm9vbCAgICBnZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBtSGFwdGljUGxheWJhY2tFbmFibGVkOyB9CisgICAgICAgICAgICAvKiogU2V0IGhhcHRpYyBwbGF5YmFjayBvZiB0aGUgdHJhY2sgaXMgZW5hYmxlZCBvciBub3QsIHNob3VsZCBiZQorICAgICAgICAgICAgICogIHNldCBhZnRlciBxdWVyeSBvciBnZXQgY2FsbGJhY2sgZnJvbSB2aWJyYXRvciBzZXJ2aWNlICovCisgICAgICAgICAgICB2b2lkICAgIHNldEhhcHRpY1BsYXliYWNrRW5hYmxlZChib29sIGhhcHRpY1BsYXliYWNrRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBoYXB0aWNQbGF5YmFja0VuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiogUmV0dXJuIGF0IHdoYXQgaW50ZW5zaXR5IHRvIHBsYXkgaGFwdGljcywgdXNlZCBpbiBtaXhlci4gKi8KKyAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OmhhcHRpY19pbnRlbnNpdHlfdCBnZXRIYXB0aWNJbnRlbnNpdHkoKSBjb25zdCB7IHJldHVybiBtSGFwdGljSW50ZW5zaXR5OyB9CisgICAgICAgICAgICAvKiogU2V0IGludGVuc2l0eSBvZiBoYXB0aWMgcGxheWJhY2ssIHNob3VsZCBiZSBzZXQgYWZ0ZXIgcXVlcnlpbmcgdmlicmF0b3Igc2VydmljZS4gKi8KKyAgICAgICAgICAgIHZvaWQgICAgc2V0SGFwdGljSW50ZW5zaXR5KEF1ZGlvTWl4ZXI6OmhhcHRpY19pbnRlbnNpdHlfdCBoYXB0aWNJbnRlbnNpdHkpIHsKKyAgICAgICAgICAgICAgICBpZiAoQXVkaW9NaXhlcjo6aXNWYWxpZEhhcHRpY0ludGVuc2l0eShoYXB0aWNJbnRlbnNpdHkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1IYXB0aWNJbnRlbnNpdHkgPSBoYXB0aWNJbnRlbnNpdHk7CisgICAgICAgICAgICAgICAgICAgIHNldEhhcHRpY1BsYXliYWNrRW5hYmxlZChtSGFwdGljSW50ZW5zaXR5ICE9IEF1ZGlvTWl4ZXI6OkhBUFRJQ19TQ0FMRV9NVVRFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxvczo6RXh0ZXJuYWxWaWJyYXRpb24+IGdldEV4dGVybmFsVmlicmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbUV4dGVybmFsVmlicmF0aW9uOyB9CisKKyAgICAgICAgICAgIHZvaWQgICAgc2V0VGVlUGF0Y2hlcyhUZWVQYXRjaGVzIHRlZVBhdGNoZXMpOworCiBwcm90ZWN0ZWQ6CiAgICAgLy8gZm9yIG51bWVyb3VzCiAgICAgZnJpZW5kIGNsYXNzIFBsYXliYWNrVGhyZWFkOwpAQCAtMTIxLDggKzE0MSw4IEBACiAgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFRyYWNrKTsKIAogICAgIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKTsKLSAgICAvLyByZWxlYXNlQnVmZmVyKCkgbm90IG92ZXJyaWRkZW4KKyAgICBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKSBvdmVycmlkZTsKKyAgICB2b2lkIHJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpIG92ZXJyaWRlOwogCiAgICAgLy8gRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQogICAgIHZpcnR1YWwgc2l6ZV90IGZyYW1lc1JlYWR5KCkgY29uc3Q7CkBAIC0xNDAsNyArMTYwLDcgQEAKICAgICBib29sIGlzUmVzdW1lUGVuZGluZygpOwogICAgIHZvaWQgcmVzdW1lQWNrKCk7CiAgICAgdm9pZCB1cGRhdGVUcmFja0ZyYW1lSW5mbyhpbnQ2NF90IHRyYWNrRnJhbWVzUmVsZWFzZWQsIGludDY0X3Qgc2lua0ZyYW1lc1dyaXR0ZW4sCi0gICAgICAgICAgICBjb25zdCBFeHRlbmRlZFRpbWVzdGFtcCAmdGltZVN0YW1wKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGhhbFNhbXBsZVJhdGUsIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lU3RhbXApOwogCiAgICAgc3A8SU1lbW9yeT4gc2hhcmVkQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbVNoYXJlZEJ1ZmZlcjsgfQogCkBAIC0xNzEsNyArMTkxLDYgQEAKIAogICAgIGJvb2wgICAgICAgICAgICAgICAgbVJlc2V0RG9uZTsKICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW1UeXBlOwotICAgIGludCAgICAgICAgICAgICAgICAgbU5hbWU7CiAgICAgZWZmZWN0X2J1ZmZlcl90ICAgICAqbU1haW5CdWZmZXI7CiAKICAgICBpbnQzMl90ICAgICAgICAgICAgICptQXV4QnVmZmVyOwpAQCAtMTg4LDcgKzIwNywyOSBAQAogCiAgICAgc3A8bWVkaWE6OlZvbHVtZUhhbmRsZXI+ICBtVm9sdW1lSGFuZGxlcjsgLy8gaGFuZGxlcyBtdWx0aXBsZSBWb2x1bWVTaGFwZXIgY29uZmlncyBhbmQgb3BlcmF0aW9ucwogCisgICAgYm9vbCAgICAgICAgICAgICAgICBtSGFwdGljUGxheWJhY2tFbmFibGVkID0gZmFsc2U7IC8vIGluZGljYXRlcyBoYXB0aWMgcGxheWJhY2sgZW5hYmxlZCBvciBub3QKKyAgICAvLyBpbnRlbnNpdHkgdG8gcGxheSBoYXB0aWMgZGF0YQorICAgIEF1ZGlvTWl4ZXI6OmhhcHRpY19pbnRlbnNpdHlfdCBtSGFwdGljSW50ZW5zaXR5ID0gQXVkaW9NaXhlcjo6SEFQVElDX1NDQUxFX01VVEU7CisgICAgY2xhc3MgQXVkaW9WaWJyYXRpb25Db250cm9sbGVyIDogcHVibGljIG9zOjpCbkV4dGVybmFsVmlicmF0aW9uQ29udHJvbGxlciB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBBdWRpb1ZpYnJhdGlvbkNvbnRyb2xsZXIoVHJhY2sqIHRyYWNrKSA6IG1UcmFjayh0cmFjaykge30KKyAgICAgICAgYmluZGVyOjpTdGF0dXMgbXV0ZSgvKm91dCovIGJvb2wgKnJldCkgb3ZlcnJpZGU7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHVubXV0ZSgvKm91dCovIGJvb2wgKnJldCkgb3ZlcnJpZGU7CisgICAgcHJpdmF0ZToKKyAgICAgICAgVHJhY2sqIGNvbnN0IG1UcmFjazsKKyAgICB9OworICAgIHNwPEF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcj4gbUF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcjsKKyAgICBzcDxvczo6RXh0ZXJuYWxWaWJyYXRpb24+ICAgIG1FeHRlcm5hbFZpYnJhdGlvbjsKKwogcHJpdmF0ZToKKyAgICB2b2lkICAgICAgICAgICAgICAgIGludGVyY2VwdEJ1ZmZlcihjb25zdCBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGJ1ZmZlcik7CisgICAgLyoqIFdyaXRlIHRoZSBzb3VyY2UgZGF0YSBpbiB0aGUgYnVmZmVyIHByb3ZpZGVyLiBAcmV0dXJuIHdyaXR0ZW4gZnJhbWUgY291bnQuICovCisgICAgc2l6ZV90ICAgICAgICAgICAgICB3cml0ZUZyYW1lcyhBdWRpb0J1ZmZlclByb3ZpZGVyKiBkZXN0LCBjb25zdCB2b2lkKiBzcmMsIHNpemVfdCBmcmFtZUNvdW50KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgRj4KKyAgICB2b2lkICAgICAgICAgICAgICAgIGZvckVhY2hUZWVQYXRjaFRyYWNrKEYgZikgeworICAgICAgICBmb3IgKGF1dG8mIHRwIDogbVRlZVBhdGNoZXMpIHsgZih0cC5wYXRjaFRyYWNrKTsgfQorICAgIH07CisKICAgICAvLyBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgb25seSBmb3IgZmFzdCB0cmFja3MsIGFuZCBzaG91bGQgYmUgaW4gYSBzdWJjbGFzcwogICAgIGludCAgICAgICAgICAgICAgICAgbUZhc3RJbmRleDsgLy8gaW5kZXggd2l0aGluIEZhc3RNaXhlclN0YXRlOjptRmFzdFRyYWNrc1tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWl0aGVyIG1GYXN0SW5kZXggPT0gLTEgaWYgbm90IGlzRmFzdFRyYWNrKCkKQEAgLTIwOCw2ICsyNDksNyBAQAogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsKICAgICAvLyBJZiB0aGUgbGFzdCB0cmFjayBjaGFuZ2Ugd2FzIG5vdGlmaWVkIHRvIHRoZSBjbGllbnQgd2l0aCByZWFkQW5kQ2xlYXJIYXNDaGFuZ2VkCiAgICAgc3RkOjphdG9taWNfZmxhZyAgICAgbUNoYW5nZU5vdGlmaWVkID0gQVRPTUlDX0ZMQUdfSU5JVDsKKyAgICBUZWVQYXRjaGVzICBtVGVlUGF0Y2hlczsKIH07ICAvLyBlbmQgb2YgVHJhY2sKIAogCkBAIC0yMzMsNyArMjc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiA9IEFVRElPX1NFU1NJT05fTk9ORSk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wKCk7Ci0gICAgICAgICAgICBib29sICAgICAgICB3cml0ZSh2b2lkKiBkYXRhLCB1aW50MzJfdCBmcmFtZXMpOworICAgICAgICAgICAgc3NpemVfdCAgICAgd3JpdGUodm9pZCogZGF0YSwgdWludDMyX3QgZnJhbWVzKTsKICAgICAgICAgICAgIGJvb2wgICAgICAgIGJ1ZmZlclF1ZXVlRW1wdHkoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyUXVldWUuc2l6ZSgpID09IDA7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzQWN0aXZlKCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZTsgfQogICAgIGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQoKSBjb25zdCB7IHJldHVybiBtVGhyZWFkOyB9CkBAIC0yNDEsNiArMjgzLDE4IEBACiAgICAgICAgICAgICB2b2lkICAgICAgICBjb3B5TWV0YWRhdGFUbyhNZXRhZGF0YUluc2VydGVyJiBiYWNrSW5zZXJ0ZXIpIGNvbnN0IG92ZXJyaWRlOwogICAgIC8qKiBTZXQgdGhlIG1ldGFkYXRhcyBvZiB0aGUgdXBzdHJlYW0gdHJhY2tzLiBUaHJlYWQgc2FmZS4gKi8KICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldE1ldGFkYXRhcyhjb25zdCBTb3VyY2VNZXRhZGF0YXMmIG1ldGFkYXRhcyk7CisgICAgLyoqIHJldHVybnMgY2xpZW50IHRpbWVzdGFtcCB0byB0aGUgdXBzdHJlYW0gZHVwbGljYXRpbmcgdGhyZWFkLiAqLworICAgIEV4dGVuZGVkVGltZXN0YW1wICAgZ2V0Q2xpZW50UHJveHlUaW1lc3RhbXAoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VydmVyIC0ga2VybmVsIGRpZmZlcmVuY2UgaXMgbm90IHRydWUgbGF0ZW5jeSB3aGVuIGRyYWluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpLmUuIG1TZXJ2ZXJQcm94eS0+aXNEcmFpbmVkKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgdGltZXN0YW1wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBtQ2xpZW50UHJveHktPmdldFRpbWVzdGFtcCgmdGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbiBzdWNjZXNzLCB0aGUgdGltZXN0YW1wIExPQ0FUSU9OX1NFUlZFUiBhbmQgTE9DQVRJT05fS0VSTkVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW50cmllcyB3aWxsIGJlIHByb3Blcmx5IGZpbGxlZC4gSWYgZ2V0VGltZXN0YW1wKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB1bnN1Y2Nlc3NmdWwsIHRoZW4gYSBkZWZhdWx0IGluaXRpYWxpemVkIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh3aXRoIG1UaW1lTnNbXSBmaWxsZWQgd2l0aCAtMSdzKSBpcyByZXR1cm5lZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGltZXN0YW1wOworICAgICAgICAgICAgICAgICAgICAgICAgfQogCiBwcml2YXRlOgogICAgIHN0YXR1c190ICAgICAgICAgICAgb2J0YWluQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLApAQCAtMjU3LDYgKzMxMSw3IEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmU7CiAgICAgRHVwbGljYXRpbmdUaHJlYWQqIGNvbnN0ICAgIG1Tb3VyY2VUaHJlYWQ7IC8vIGZvciB3YWl0VGltZU1zKCkgaW4gd3JpdGUoKQogICAgIHNwPEF1ZGlvVHJhY2tDbGllbnRQcm94eT4gICBtQ2xpZW50UHJveHk7CisKICAgICAvKiogQXR0cmlidXRlcyBvZiB0aGUgc291cmNlIHRyYWNrcy4KICAgICAgKgogICAgICAqIFRoaXMgbWVtYmVyIG11c3QgYmUgYWNjZXNzZWQgd2l0aCBtVHJhY2tNZXRhZGF0YXNNdXRleCB0YWtlbi4KQEAgLTI3NCw3ICszMjksNyBAQAogfTsgIC8vIGVuZCBvZiBPdXRwdXRUcmFjawogCiAvLyBwbGF5YmFjayB0cmFjaywgdXNlZCBieSBQYXRjaFBhbmVsCi1jbGFzcyBQYXRjaFRyYWNrIDogcHVibGljIFRyYWNrLCBwdWJsaWMgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyIHsKK2NsYXNzIFBhdGNoVHJhY2sgOiBwdWJsaWMgVHJhY2ssIHB1YmxpYyBQYXRjaFRyYWNrQmFzZSB7CiBwdWJsaWM6CiAKICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGNoVHJhY2soUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkLApAQCAtMjg1LDcgKzM0MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaW1lb3V0JiB0aW1lb3V0ID0ge30pOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflBhdGNoVHJhY2soKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCA9CkBAIC0zMDEsMTIgKzM1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lT3V0ID0gTlVMTCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKFByb3h5OjpCdWZmZXIqIGJ1ZmZlcik7CiAKLSAgICAgICAgICAgIHZvaWQgc2V0UGVlclByb3h5KFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciAqcHJveHkpIHsgbVBlZXJQcm94eSA9IHByb3h5OyB9Ci0KIHByaXZhdGU6CiAgICAgICAgICAgICB2b2lkIHJlc3RhcnRJZkRpc2FibGVkKCk7CiAKLSAgICBzcDxDbGllbnRQcm94eT4gICAgICAgICAgICAgbVByb3h5OwotICAgIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciogICBtUGVlclByb3h5OwotICAgIHN0cnVjdCB0aW1lc3BlYyAgICAgICAgICAgICBtUGVlclRpbWVvdXQ7CiB9OyAgLy8gZW5kIG9mIFBhdGNoVHJhY2sKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAppbmRleCBmYzJkYmJiLi5hYjRhZjMzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCkBAIC01MSw3ICs1MSw3IEBACiAgICAgICAgICAgICBib29sICAgICAgICBzZXRPdmVyZmxvdygpIHsgYm9vbCB0bXAgPSBtT3ZlcmZsb3c7IG1PdmVyZmxvdyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG1wOyB9CiAKLSAgICBzdGF0aWMgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVN5bmNTdGFydEV2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KTsKQEAgLTYzLDEyICs2MywyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVzdGFtcCk7CiAKICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRmFzdFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgIT0gMDsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNEaXJlY3QoKSBjb25zdCBvdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAobUZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QpICE9IDA7IH0KIAogICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0U2lsZW5jZWQoYm9vbCBzaWxlbmNlZCkgeyBpZiAoIWlzUGF0Y2hUcmFjaygpKSBtU2lsZW5jZWQgPSBzaWxlbmNlZDsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNTaWxlbmNlZCgpIGNvbnN0IHsgcmV0dXJuIG1TaWxlbmNlZDsgfQogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CiAKKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOworICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOworCisgICAgc3RhdGljICBib29sICAgICAgICBjaGVja1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQykgPT0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgQXVkaW9GbGluZ2VyOyAgLy8gZm9yIG1TdGF0ZQogCkBAIC0xMDIsNyArMTEzLDcgQEAKIH07CiAKIC8vIHBsYXliYWNrIHRyYWNrLCB1c2VkIGJ5IFBhdGNoUGFuZWwKLWNsYXNzIFBhdGNoUmVjb3JkIDogdmlydHVhbCBwdWJsaWMgUmVjb3JkVHJhY2ssIHB1YmxpYyBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgeworY2xhc3MgUGF0Y2hSZWNvcmQgOiBwdWJsaWMgUmVjb3JkVHJhY2ssIHB1YmxpYyBQYXRjaFRyYWNrQmFzZSB7CiBwdWJsaWM6CiAKICAgICBQYXRjaFJlY29yZChSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCwKQEAgLTExMiw3ICsxMjMsOCBAQAogICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKKyAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVvdXQmIHRpbWVvdXQgPSB7fSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+UGF0Y2hSZWNvcmQoKTsKIAogICAgIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCkBAIC0xMjMsMTEgKzEzNSw0IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvYnRhaW5CdWZmZXIoUHJveHk6OkJ1ZmZlciAqYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdGltZU91dCA9IE5VTEwpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVsZWFzZUJ1ZmZlcihQcm94eTo6QnVmZmVyICpidWZmZXIpOwotCi0gICAgdm9pZCBzZXRQZWVyUHJveHkoUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyICpwcm94eSkgeyBtUGVlclByb3h5ID0gcHJveHk7IH0KLQotcHJpdmF0ZToKLSAgICBzcDxDbGllbnRQcm94eT4gICAgICAgICAgICAgbVByb3h5OwotICAgIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciogICBtUGVlclByb3h5OwotICAgIHN0cnVjdCB0aW1lc3BlYyAgICAgICAgICAgICBtUGVlclRpbWVvdXQ7CiB9OyAgLy8gZW5kIG9mIFBhdGNoUmVjb3JkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMjY3ZWEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YmluZGVyL0FwcE9wc01hbmFnZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25DYWNoZS5oPgotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKLQotLyogV2hlbiBwZXJmb3JtaW5nIHBlcm1pc3Npb24gY2hlY2tzIHdlIGRvIG5vdCB1c2UgcGVybWlzc2lvbiBjYWNoZSBmb3IKLSAqIHJ1bnRpbWUgcGVybWlzc2lvbnMgKHByb3RlY3Rpb24gbGV2ZWwgZGFuZ2Vyb3VzKSBhcyB0aGV5IG1heSBjaGFuZ2UgYXQKLSAqIHJ1bnRpbWUuIEFsbCBvdGhlciBwZXJtaXNzaW9ucyAocHJvdGVjdGlvbiBsZXZlbCBub3JtYWwgYW5kIGRhbmdlcm91cykKLSAqIGNhbiBiZSBjYWNoZWQgYXMgdGhleSBuZXZlciBjaGFuZ2UuIE9mIGNvdXJzZSBhbGwgcGVybWlzc2lvbiBjaGVja2VkCi0gKiBoZXJlIGFyZSBwbGF0Zm9ybSBkZWZpbmVkLgotICovCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIGNvbnN0IFN0cmluZzE2IHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKCJhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIik7Ci0KLS8vIE5vdCB2YWxpZCB1bnRpbCBpbml0aWFsaXplZCBieSBBdWRpb0ZsaW5nZXIgY29uc3RydWN0b3IuICBJdCB3b3VsZCBoYXZlIHRvIGJlCi0vLyByZS1pbml0aWFsaXplZCBpZiB0aGUgcHJvY2VzcyBjb250YWluaW5nIEF1ZGlvRmxpbmdlciBzZXJ2aWNlIGZvcmtzICh3aGljaCBpdCBkb2Vzbid0KS4KLS8vIFRoaXMgaXMgb2Z0ZW4gdXNlZCB0byB2YWxpZGF0ZSBiaW5kZXIgaW50ZXJmYWNlIGNhbGxzIHdpdGhpbiBhdWRpb3NlcnZlcgotLy8gKGUuZy4gQXVkaW9Qb2xpY3lNYW5hZ2VyIHRvIEF1ZGlvRmxpbmdlcikuCi1waWRfdCBnZXRwaWRfY2FjaGVkOwotCi0vLyBBIHRydXN0ZWQgY2FsbGluZyBVSUQgbWF5IHNwZWNpZnkgdGhlIGNsaWVudCBVSUQgYXMgcGFydCBvZiBhIGJpbmRlciBpbnRlcmZhY2UgY2FsbC4KLS8vIG90aGVyd2lzZSB0aGUgY2FsbGluZyBVSUQgbXVzdCBiZSBlcXVhbCB0byB0aGUgY2xpZW50IFVJRC4KLWJvb2wgaXNUcnVzdGVkQ2FsbGluZ1VpZCh1aWRfdCB1aWQpIHsKLSAgICBzd2l0Y2ggKHVpZCkgewotICAgIGNhc2UgQUlEX01FRElBOgotICAgIGNhc2UgQUlEX0FVRElPU0VSVkVSOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi1zdGF0aWMgU3RyaW5nMTYgcmVzb2x2ZUNhbGxpbmdQYWNrYWdlKFBlcm1pc3Npb25Db250cm9sbGVyJiBwZXJtaXNzaW9uQ29udHJvbGxlciwKLSAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCkgewotICAgIGlmIChvcFBhY2thZ2VOYW1lLnNpemUoKSA+IDApIHsKLSAgICAgICAgcmV0dXJuIG9wUGFja2FnZU5hbWU7Ci0gICAgfQotICAgIC8vIEluIHNvbWUgY2FzZXMgdGhlIGNhbGxpbmcgY29kZSBoYXMgbm8gYWNjZXNzIHRvIHRoZSBwYWNrYWdlIGl0IHJ1bnMgdW5kZXIuCi0gICAgLy8gRm9yIGV4YW1wbGUsIGNvZGUgdXNpbmcgdGhlIHdpbGhlbG0gZnJhbWV3b3JrJ3MgT3BlblNMLUVTIEFQSXMuIEluIHRoaXMKLSAgICAvLyBjYXNlIHdlIHdpbGwgZ2V0IHRoZSBwYWNrYWdlcyBmb3IgdGhlIGNhbGxpbmcgVUlEIGFuZCBwaWNrIHRoZSBmaXJzdCBvbmUKLSAgICAvLyBmb3IgYXR0cmlidXRpbmcgdGhlIGFwcCBvcC4gVGhpcyB3aWxsIHdvcmsgY29ycmVjdGx5IGZvciBydW50aW1lIHBlcm1pc3Npb25zCi0gICAgLy8gYXMgZm9yIGxlZ2FjeSBhcHBzIHdlIHdpbGwgdG9nZ2xlIHRoZSBhcHAgb3AgZm9yIGFsbCBwYWNrYWdlcyBpbiB0aGUgVUlELgotICAgIC8vIFRoZSBjYXZlYXQgaXMgdGhhdCB0aGUgb3BlcmF0aW9uIG1heSBiZSBhdHRyaWJ1dGVkIHRvIHRoZSB3cm9uZyBwYWNrYWdlIGFuZAotICAgIC8vIHN0YXRzIGJhc2VkIG9uIGFwcCBvcHMgbWF5IGJlIHNsaWdodGx5IG9mZi4KLSAgICBWZWN0b3I8U3RyaW5nMTY+IHBhY2thZ2VzOwotICAgIHBlcm1pc3Npb25Db250cm9sbGVyLmdldFBhY2thZ2VzRm9yVWlkKHVpZCwgcGFja2FnZXMpOwotICAgIGlmIChwYWNrYWdlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIk5vIHBhY2thZ2VzIGZvciB1aWQgJWQiLCB1aWQpOwotICAgICAgICByZXR1cm4gb3BQYWNrYWdlTmFtZTsgLy8gZW1wdHkgc3RyaW5nCi0gICAgfQotICAgIHJldHVybiBwYWNrYWdlc1swXTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9TZXJ2ZXJPclJvb3QodWlkX3QgdWlkKSB7Ci0gICAgLy8gQUlEX1JPT1QgaXMgT0sgZm9yIGNvbW1hbmQtbGluZSB0ZXN0cy4gIE5hdGl2ZSB1bmZvcmtlZCBhdWRpb3NlcnZlciBhbHdheXMgT0suCi0gICAgcmV0dXJuIHVpZCA9PSBBSURfUk9PVCB8fCB1aWQgPT0gQUlEX0FVRElPU0VSVkVSIDsKLX0KLQotc3RhdGljIGJvb2wgY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLAotICAgICAgICB1aWRfdCB1aWQsIGJvb2wgc3RhcnQpIHsKLSAgICAvLyBPa2F5IHRvIG5vdCB0cmFjayBpbiBhcHAgb3BzIGFzIGF1ZGlvIHNlcnZlciBpcyB1cyBhbmQgaWYKLSAgICAvLyBkZXZpY2UgaXMgcm9vdGVkIHNlY3VyaXR5IG1vZGVsIGlzIGNvbnNpZGVyZWQgY29tcHJvbWlzZWQuCi0gICAgaWYgKGlzQXVkaW9TZXJ2ZXJPclJvb3QodWlkKSkgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBXZSBzcGVjaWZ5IGEgcGlkIGFuZCB1aWQgaGVyZSBhcyBtZWRpYXNlcnZlciAoYWthIE1lZGlhUmVjb3JkZXIgb3IgU3RhZ2VGcmlnaHRSZWNvcmRlcikKLSAgICAvLyBtYXkgb3BlbiBhIHJlY29yZCB0cmFjayBvbiBiZWhhbGYgb2YgYSBjbGllbnQuICBOb3RlIHRoYXQgcGlkIG1heSBiZSBhIHRpZC4KLSAgICAvLyBJTVBPUlRBTlQ6IERPTidUIFVTRSBQZXJtaXNzaW9uQ2FjaGUgLSBSVU5USU1FIFBFUk1JU1NJT05TIENIQU5HRS4KLSAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwZXJtaXNzaW9uQ29udHJvbGxlcjsKLSAgICBjb25zdCBib29sIG9rID0gcGVybWlzc2lvbkNvbnRyb2xsZXIuY2hlY2tQZXJtaXNzaW9uKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvLCBwaWQsIHVpZCk7Ci0gICAgaWYgKCFvaykgewotICAgICAgICBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyAlcyIsIFN0cmluZzgoc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8pLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgU3RyaW5nMTYgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lID0gcmVzb2x2ZUNhbGxpbmdQYWNrYWdlKAotICAgICAgICAgICAgcGVybWlzc2lvbkNvbnRyb2xsZXIsIG9wUGFja2FnZU5hbWUsIHVpZCk7Ci0gICAgaWYgKHJlc29sdmVkT3BQYWNrYWdlTmFtZS5zaXplKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQXBwT3BzTWFuYWdlciBhcHBPcHM7Ci0gICAgY29uc3QgaW50MzJfdCBvcCA9IGFwcE9wcy5wZXJtaXNzaW9uVG9PcENvZGUoc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8pOwotICAgIGlmIChzdGFydCkgewotICAgICAgICBpZiAoYXBwT3BzLnN0YXJ0T3BOb1Rocm93KG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSwgLypzdGFydElmTW9kZURlZmF1bHQqLyBmYWxzZSkKLSAgICAgICAgICAgICAgICAhPSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0IGRlbmllZCBieSBhcHAgb3A6ICVkIiwgb3ApOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGFwcE9wcy5ub3RlT3Aob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lKSAhPSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0IGRlbmllZCBieSBhcHAgb3A6ICVkIiwgb3ApOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgcmVjb3JkaW5nQWxsb3dlZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKLSAgICByZXR1cm4gY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgLypzdGFydCovIGZhbHNlKTsKLX0KLQotYm9vbCBzdGFydFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKLSAgICAgcmV0dXJuIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwob3BQYWNrYWdlTmFtZSwgcGlkLCB1aWQsIC8qc3RhcnQqLyB0cnVlKTsKLX0KLQotdm9pZCBmaW5pc2hSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCkgewotICAgIC8vIE9rYXkgdG8gbm90IHRyYWNrIGluIGFwcCBvcHMgYXMgYXVkaW8gc2VydmVyIGlzIHVzIGFuZCBpZgotICAgIC8vIGRldmljZSBpcyByb290ZWQgc2VjdXJpdHkgbW9kZWwgaXMgY29uc2lkZXJlZCBjb21wcm9taXNlZC4KLSAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdCh1aWQpKSByZXR1cm47Ci0KLSAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwZXJtaXNzaW9uQ29udHJvbGxlcjsKLSAgICBTdHJpbmcxNiByZXNvbHZlZE9wUGFja2FnZU5hbWUgPSByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoCi0gICAgICAgICAgICBwZXJtaXNzaW9uQ29udHJvbGxlciwgb3BQYWNrYWdlTmFtZSwgdWlkKTsKLSAgICBpZiAocmVzb2x2ZWRPcFBhY2thZ2VOYW1lLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBcHBPcHNNYW5hZ2VyIGFwcE9wczsKLSAgICBjb25zdCBpbnQzMl90IG9wID0gYXBwT3BzLnBlcm1pc3Npb25Ub09wQ29kZShzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbyk7Ci0gICAgYXBwT3BzLmZpbmlzaE9wKG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSk7Ci19Ci0KLWJvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgewotICAgIGlmIChnZXRwaWRfY2FjaGVkID09IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSkgcmV0dXJuIHRydWU7Ci0gICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYXB0dXJlQXVkaW9PdXRwdXQoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX09VVFBVVCIpOwotICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzQ2FwdHVyZUF1ZGlvT3V0cHV0LCBwaWQsIHVpZCk7Ci0gICAgaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fT1VUUFVUIik7Ci0gICAgcmV0dXJuIG9rOwotfQotCi1ib29sIGNhcHR1cmVIb3R3b3JkQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgewotICAgIC8vIENBUFRVUkVfQVVESU9fSE9UV09SRCBwZXJtaXNzaW9uIGltcGxpZXMgUkVDT1JEX0FVRElPIHBlcm1pc3Npb24KLSAgICBib29sIG9rID0gcmVjb3JkaW5nQWxsb3dlZChTdHJpbmcxNigiIiksIHBpZCwgdWlkKTsKLQotICAgIGlmIChvaykgewotICAgICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVIb3R3b3JkQWxsb3dlZCgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRCIpOwotICAgICAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgotICAgICAgICBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzQ2FwdHVyZUhvdHdvcmRBbGxvd2VkKTsKLSAgICB9Ci0gICAgaWYgKCFvaykgQUxPR0UoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkQiKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLWJvb2wgc2V0dGluZ3NBbGxvd2VkKCkgewotICAgIGlmIChnZXRwaWRfY2FjaGVkID09IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSkgcmV0dXJuIHRydWU7Ci0gICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNBdWRpb1NldHRpbmdzKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIik7Ci0gICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KLSAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNBdWRpb1NldHRpbmdzKTsKLSAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIik7Ci0gICAgcmV0dXJuIG9rOwotfQotCi1ib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSB7Ci0gICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKLSAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgotICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc01vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQpOwotICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLWJvb2wgZHVtcEFsbG93ZWQoKSB7Ci0gICAgLy8gZG9uJ3Qgb3B0aW1pemUgZm9yIHNhbWUgcGlkLCBzaW5jZSBtZWRpYXNlcnZlciBuZXZlciBkdW1wcyBpdHNlbGYKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0R1bXAoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7Ci0gICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KLSAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNEdW1wKTsKLSAgICAvLyBjb252ZW50aW9uIGlzIGZvciBjYWxsZXIgdG8gZHVtcCBhbiBlcnJvciBtZXNzYWdlIHRvIGZkIGluc3RlYWQgb2YgbG9nZ2luZyBoZXJlCi0gICAgLy9pZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOwotICAgIHJldHVybiBvazsKLX0KLQotYm9vbCBtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgewotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5UGhvbmVTdGF0ZSgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9QSE9ORV9TVEFURSIpOwotICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzTW9kaWZ5UGhvbmVTdGF0ZSwgcGlkLCB1aWQpOwotICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfUEhPTkVfU1RBVEUiKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDVhZGExLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25Db250cm9sbGVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZXh0ZXJuIHBpZF90IGdldHBpZF9jYWNoZWQ7Ci1ib29sIGlzVHJ1c3RlZENhbGxpbmdVaWQodWlkX3QgdWlkKTsKLWJvb2wgcmVjb3JkaW5nQWxsb3dlZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotYm9vbCBzdGFydFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotdm9pZCBmaW5pc2hSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCk7Ci1ib29sIGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotYm9vbCBzZXR0aW5nc0FsbG93ZWQoKTsKLWJvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpOwotYm9vbCBkdW1wQWxsb3dlZCgpOwotYm9vbCBtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKaW5kZXggYzIzMjBiYy4uM2VjYjM3ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcApAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgpAQCAtMzYsNiArMzgsOCBAQAogCiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvQmFsYW5jZS5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbW9ub19ibGVuZC5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KQEAgLTYyLDggKzY2LDggQEAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKICNpbmNsdWRlICJGYXN0Q2FwdHVyZS5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKLSNpbmNsdWRlICJtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmgiCisjaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogCiAjaWZkZWYgQUREX0JBVFRFUllfREFUQQogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KQEAgLTcxLDcgKzc1LDcgQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfQ1BVX1VTQUdFCi0jaW5jbHVkZSA8Y3B1c3RhdHMvQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1N0YXRpc3RpY3MuaD4KICNpbmNsdWRlIDxjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5oPgogI2VuZGlmCiAKQEAgLTIwMCw3ICsyMDQsNyBAQAogLy8gSW5pdGlhbGx5IHRoaXMgaGVhcCBpcyB1c2VkIHRvIGFsbG9jYXRlIGNsaWVudCBidWZmZXJzIGZvciAiZmFzdCIgQXVkaW9SZWNvcmQuCiAvLyBFdmVudHVhbGx5IGl0IHdpbGwgYmUgdGhlIHNpbmdsZSBidWZmZXIgdGhhdCBGYXN0Q2FwdHVyZSB3cml0ZXMgaW50byB2aWEgSEFMIHJlYWQoKSwKIC8vIGFuZCB0aGF0IGFsbCAiZmFzdCIgQXVkaW9SZWNvcmQgY2xpZW50cyByZWFkIGZyb20uICBJbiBlaXRoZXIgY2FzZSwgdGhlIHNpemUgY2FuIGJlIHNtYWxsLgotc3RhdGljIGNvbnN0IHNpemVfdCBrUmVjb3JkVGhyZWFkUmVhZE9ubHlIZWFwU2l6ZSA9IDB4NDAwMDsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1JlY29yZFRocmVhZFJlYWRPbmx5SGVhcFNpemUgPSAweEQwMDA7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMzMzLDkgKzMzNyw5IEBACiAjaWZkZWYgREVCVUdfQ1BVX1VTQUdFCiBwcml2YXRlOgogICAgIFRocmVhZENwdVVzYWdlIG1DcHVVc2FnZTsgICAgICAgICAgIC8vIGluc3RhbnRhbmVvdXMgdGhyZWFkIENQVSB1c2FnZSBpbiB3YWxsIGNsb2NrIG5zCi0gICAgQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcyBtV2NTdGF0czsgLy8gc3RhdGlzdGljcyBvbiB0aHJlYWQgQ1BVIHVzYWdlIGluIHdhbGwgY2xvY2sgbnMKKyAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IG1XY1N0YXRzOyAvLyBzdGF0aXN0aWNzIG9uIHRocmVhZCBDUFUgdXNhZ2UgaW4gd2FsbCBjbG9jayBucwogCi0gICAgQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcyBtSHpTdGF0czsgLy8gc3RhdGlzdGljcyBvbiB0aHJlYWQgQ1BVIHVzYWdlIGluIGN5Y2xlcworICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbUh6U3RhdHM7IC8vIHN0YXRpc3RpY3Mgb24gdGhyZWFkIENQVSB1c2FnZSBpbiBjeWNsZXMKIAogICAgIGludCBtQ3B1TnVtOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocmVhZCdzIGN1cnJlbnQgQ1BVIG51bWJlcgogICAgIGludCBtQ3B1a0h6OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyZXF1ZW5jeSBvZiB0aHJlYWQncyBjdXJyZW50IENQVSBpbiBrSHoKQEAgLTM2MSw3ICszNjUsNyBAQAogCiAgICAgLy8gcmVjb3JkIHNhbXBsZSBmb3Igd2FsbCBjbG9jayBzdGF0aXN0aWNzCiAgICAgaWYgKHZhbGlkKSB7Ci0gICAgICAgIG1XY1N0YXRzLnNhbXBsZSh3Y05zKTsKKyAgICAgICAgbVdjU3RhdHMuYWRkKHdjTnMpOwogICAgIH0KIAogICAgIC8vIGdldCB0aGUgY3VycmVudCBDUFUgbnVtYmVyCkBAIC0zODAsMjYgKzM4NCwyNiBAQAogCiAgICAgLy8gaWYgbm8gY2hhbmdlIGluIENQVSBudW1iZXIgb3IgZnJlcXVlbmN5LCB0aGVuIHJlY29yZCBzYW1wbGUgZm9yIGN5Y2xlIHN0YXRpc3RpY3MKICAgICBpZiAodmFsaWQgJiYgbUNwdWtIeiA+IDApIHsKLSAgICAgICAgZG91YmxlIGN5Y2xlcyA9IHdjTnMgKiBjcHVrSHogKiAwLjAwMDAwMTsKLSAgICAgICAgbUh6U3RhdHMuc2FtcGxlKGN5Y2xlcyk7CisgICAgICAgIGNvbnN0IGRvdWJsZSBjeWNsZXMgPSB3Y05zICogY3B1a0h6ICogMC4wMDAwMDE7CisgICAgICAgIG1IelN0YXRzLmFkZChjeWNsZXMpOwogICAgIH0KIAotICAgIHVuc2lnbmVkIG4gPSBtV2NTdGF0cy5uKCk7CisgICAgY29uc3QgdW5zaWduZWQgbiA9IG1XY1N0YXRzLmdldE4oKTsKICAgICAvLyBtQ3B1VXNhZ2UuZWxhcHNlZCgpIGlzIGV4cGVuc2l2ZSwgc28gZG9uJ3QgY2FsbCBpdCBldmVyeSBsb29wCiAgICAgaWYgKChuICYgMTI3KSA9PSAxKSB7Ci0gICAgICAgIGxvbmcgbG9uZyBlbGFwc2VkID0gbUNwdVVzYWdlLmVsYXBzZWQoKTsKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIGVsYXBzZWQgPSBtQ3B1VXNhZ2UuZWxhcHNlZCgpOwogICAgICAgICBpZiAoZWxhcHNlZCA+PSBERUJVR19DUFVfVVNBR0UgKiAxMDAwMDAwMDAwTEwpIHsKLSAgICAgICAgICAgIGRvdWJsZSBwZXJMb29wID0gZWxhcHNlZCAvIChkb3VibGUpIG47Ci0gICAgICAgICAgICBkb3VibGUgcGVyTG9vcDEwMCA9IHBlckxvb3AgKiAwLjAxOwotICAgICAgICAgICAgZG91YmxlIHBlckxvb3AxayA9IHBlckxvb3AgKiAwLjAwMTsKLSAgICAgICAgICAgIGRvdWJsZSBtZWFuID0gbVdjU3RhdHMubWVhbigpOwotICAgICAgICAgICAgZG91YmxlIHN0ZGRldiA9IG1XY1N0YXRzLnN0ZGRldigpOwotICAgICAgICAgICAgZG91YmxlIG1pbmltdW0gPSBtV2NTdGF0cy5taW5pbXVtKCk7Ci0gICAgICAgICAgICBkb3VibGUgbWF4aW11bSA9IG1XY1N0YXRzLm1heGltdW0oKTsKLSAgICAgICAgICAgIGRvdWJsZSBtZWFuQ3ljbGVzID0gbUh6U3RhdHMubWVhbigpOwotICAgICAgICAgICAgZG91YmxlIHN0ZGRldkN5Y2xlcyA9IG1IelN0YXRzLnN0ZGRldigpOwotICAgICAgICAgICAgZG91YmxlIG1pbkN5Y2xlcyA9IG1IelN0YXRzLm1pbmltdW0oKTsKLSAgICAgICAgICAgIGRvdWJsZSBtYXhDeWNsZXMgPSBtSHpTdGF0cy5tYXhpbXVtKCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgcGVyTG9vcCA9IGVsYXBzZWQgLyAoZG91YmxlKSBuOworICAgICAgICAgICAgY29uc3QgZG91YmxlIHBlckxvb3AxMDAgPSBwZXJMb29wICogMC4wMTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBwZXJMb29wMWsgPSBwZXJMb29wICogMC4wMDE7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWVhbiA9IG1XY1N0YXRzLmdldE1lYW4oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBzdGRkZXYgPSBtV2NTdGF0cy5nZXRTdGREZXYoKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtaW5pbXVtID0gbVdjU3RhdHMuZ2V0TWluKCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWF4aW11bSA9IG1XY1N0YXRzLmdldE1heCgpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIG1lYW5DeWNsZXMgPSBtSHpTdGF0cy5nZXRNZWFuKCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgc3RkZGV2Q3ljbGVzID0gbUh6U3RhdHMuZ2V0U3RkRGV2KCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWluQ3ljbGVzID0gbUh6U3RhdHMuZ2V0TWluKCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWF4Q3ljbGVzID0gbUh6U3RhdHMuZ2V0TWF4KCk7CiAgICAgICAgICAgICBtQ3B1VXNhZ2UucmVzZXRFbGFwc2VkKCk7CiAgICAgICAgICAgICBtV2NTdGF0cy5yZXNldCgpOwogICAgICAgICAgICAgbUh6U3RhdHMucmVzZXQoKTsKQEAgLTQ1Myw1MCArNDU3LDYgQEAKICAgICB9CiB9CiAKLXN0ZDo6c3RyaW5nIGRldmljZXNUb1N0cmluZyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykKLXsKLSAgICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gICAgaWYgKGRldmljZXMgJiBBVURJT19ERVZJQ0VfQklUX0lOKSB7Ci0gICAgICAgIElucHV0RGV2aWNlQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZGV2aWNlcywgcmVzdWx0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhkZXZpY2VzLCByZXN1bHQpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGQ6OnN0cmluZyBpbnB1dEZsYWdzVG9TdHJpbmcoYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKLXsKLSAgICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gICAgSW5wdXRGbGFnQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZmxhZ3MsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RkOjpzdHJpbmcgb3V0cHV0RmxhZ3NUb1N0cmluZyhhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKLXsKLSAgICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gICAgT3V0cHV0RmxhZ0NvbnZlcnRlcjo6bWFza1RvU3RyaW5nKGZsYWdzLCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLWNvbnN0IGNoYXIgKnNvdXJjZVRvU3RyaW5nKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKLXsKLSAgICBzd2l0Y2ggKHNvdXJjZSkgewotICAgIGNhc2UgQVVESU9fU09VUkNFX0RFRkFVTFQ6ICAgICAgICAgICAgICByZXR1cm4gImRlZmF1bHQiOwotICAgIGNhc2UgQVVESU9fU09VUkNFX01JQzogICAgICAgICAgICAgICAgICByZXR1cm4gIm1pYyI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOiAgICAgICAgIHJldHVybiAidm9pY2UgdXBsaW5rIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzogICAgICAgcmV0dXJuICJ2b2ljZSBkb3dubGluayI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDogICAgICAgICAgIHJldHVybiAidm9pY2UgY2FsbCI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfQ0FNQ09SREVSOiAgICAgICAgICAgIHJldHVybiAiY2FtY29yZGVyIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjogICAgcmV0dXJuICJ2b2ljZSByZWNvZ25pdGlvbiI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjogIHJldHVybiAidm9pY2UgY29tbXVuaWNhdGlvbiI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDogICAgICAgIHJldHVybiAicmVtb3RlIHN1Ym1peCI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQ6ICAgICAgICAgIHJldHVybiAidW5wcm9jZXNzZWQiOwotICAgIGNhc2UgQVVESU9fU09VUkNFX0ZNX1RVTkVSOiAgICAgICAgICAgICByZXR1cm4gIkZNIHR1bmVyIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOiAgICAgICAgICAgICAgcmV0dXJuICJob3R3b3JkIjsKLSAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIjsKLSAgICB9Ci19Ci0KIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VGhyZWFkQmFzZShjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAogICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLCBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsIHR5cGVfdCB0eXBlLCBib29sIHN5c3RlbVJlYWR5KQogICAgIDogICBUaHJlYWQoZmFsc2UgLypjYW5DYWxsSmF2YSovKSwKQEAgLTUyOCw2ICs0ODgsOCBAQAogICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihtUG93ZXJNYW5hZ2VyKTsKICAgICAgICAgYmluZGVyLT51bmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCk7CiAgICAgfQorCisgICAgc2VuZFN0YXRpc3RpY3ModHJ1ZSAvKiBmb3JjZSAqLyk7CiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6cmVhZHlUb1J1bigpCkBAIC02MTEsNiArNTczLDE1IEBACiAvLyBzZW5kSW9Db25maWdFdmVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZElvQ29uZmlnRXZlbnRfbChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCkKIHsKKyAgICAvLyBUaGUgYXVkaW8gc3RhdGlzdGljcyBoaXN0b3J5IGlzIGV4cG9uZW50aWFsbHkgd2VpZ2h0ZWQgdG8gZm9yZ2V0IGV2ZW50cworICAgIC8vIGFib3V0IGZpdmUgb3IgbW9yZSBzZWNvbmRzIGluIHRoZSBwYXN0LiAgSW4gb3JkZXIgdG8gaGF2ZQorICAgIC8vIGNyaXNwZXIgc3RhdGlzdGljcyBmb3IgbWVkaWFtZXRyaWNzLCB3ZSByZXNldCB0aGUgc3RhdGlzdGljcyBvbgorICAgIC8vIGFuIElvQ29uZmlnRXZlbnQsIHRvIHJlZmxlY3QgZGlmZmVyZW50IHByb3BlcnRpZXMgZm9yIGEgbmV3IGRldmljZS4KKyAgICBtSW9KaXR0ZXJNcy5yZXNldCgpOworICAgIG1MYXRlbmN5TXMucmVzZXQoKTsKKyAgICBtUHJvY2Vzc1RpbWVNcy5yZXNldCgpOworICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisKICAgICBzcDxDb25maWdFdmVudD4gY29uZmlnRXZlbnQgPSAoQ29uZmlnRXZlbnQgKiluZXcgSW9Db25maWdFdmVudChldmVudCwgcGlkKTsKICAgICBzZW5kQ29uZmlnRXZlbnRfbChjb25maWdFdmVudCk7CiB9CkBAIC03MTEsOCArNjgyLDggQEAKICAgICAgICAgICAgIGV2ZW50LT5tU3RhdHVzID0gY3JlYXRlQXVkaW9QYXRjaF9sKCZkYXRhLT5tUGF0Y2gsICZkYXRhLT5tSGFuZGxlKTsKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXREZXZpY2UoKTsKICAgICAgICAgICAgIG1Mb2NhbExvZy5sb2coIkNGR19FVkVOVF9DUkVBVEVfQVVESU9fUEFUQ0g6IG9sZCBkZXZpY2UgJSN4ICglcykgbmV3IGRldmljZSAlI3ggKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClvbGREZXZpY2UsIGRldmljZXNUb1N0cmluZyhvbGREZXZpY2UpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCluZXdEZXZpY2UsIGRldmljZXNUb1N0cmluZyhuZXdEZXZpY2UpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpb2xkRGV2aWNlLCB0b1N0cmluZyhvbGREZXZpY2UpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCluZXdEZXZpY2UsIHRvU3RyaW5nKG5ld0RldmljZSkuY19zdHIoKSk7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQ0ZHX0VWRU5UX1JFTEVBU0VfQVVESU9fUEFUQ0g6IHsKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBvbGREZXZpY2UgPSBnZXREZXZpY2UoKTsKQEAgLTcyMSw4ICs2OTIsOCBAQAogICAgICAgICAgICAgZXZlbnQtPm1TdGF0dXMgPSByZWxlYXNlQXVkaW9QYXRjaF9sKGRhdGEtPm1IYW5kbGUpOwogICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldERldmljZSgpOwogICAgICAgICAgICAgbUxvY2FsTG9nLmxvZygiQ0ZHX0VWRU5UX1JFTEVBU0VfQVVESU9fUEFUQ0g6IG9sZCBkZXZpY2UgJSN4ICglcykgbmV3IGRldmljZSAlI3ggKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClvbGREZXZpY2UsIGRldmljZXNUb1N0cmluZyhvbGREZXZpY2UpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCluZXdEZXZpY2UsIGRldmljZXNUb1N0cmluZyhuZXdEZXZpY2UpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpb2xkRGV2aWNlLCB0b1N0cmluZyhvbGREZXZpY2UpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCluZXdEZXZpY2UsIHRvU3RyaW5nKG5ld0RldmljZSkuY19zdHIoKSk7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HX0FTU0VSVChmYWxzZSwgInByb2Nlc3NDb25maWdFdmVudHNfbCgpIHVua25vd24gZXZlbnQgdHlwZSAlZCIsIGV2ZW50LT5tVHlwZSk7CkBAIC03NDksNiArNzIwLDcgQEAKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24obWFzayk7CiAKICAgICBzd2l0Y2ggKHJlcHJlc2VudGF0aW9uKSB7CisgICAgLy8gVHJhdmVsIGFsbCBzaW5nbGUgYml0IGNoYW5uZWwgbWFzayB0byBjb252ZXJ0IGNoYW5uZWwgbWFzayB0byBzdHJpbmcuCiAgICAgY2FzZSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX1BPU0lUSU9OOiB7CiAgICAgICAgIGlmIChvdXRwdXQpIHsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCkgcy5hcHBlbmQoImZyb250LWxlZnQsICIpOwpAQCAtNzY5LDYgKzc0MSwxMCBAQAogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19MRUZUKSBzLmFwcGVuZCgidG9wLWJhY2stbGVmdCwgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0NFTlRFUikgcy5hcHBlbmQoInRvcC1iYWNrLWNlbnRlciwgIiApOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19SSUdIVCkgcy5hcHBlbmQoInRvcC1iYWNrLXJpZ2h0LCAiICk7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9TSURFX0xFRlQpIHMuYXBwZW5kKCJ0b3Atc2lkZS1sZWZ0LCAiICk7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9TSURFX1JJR0hUKSBzLmFwcGVuZCgidG9wLXNpZGUtcmlnaHQsICIgKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfSEFQVElDX0IpIHMuYXBwZW5kKCJoYXB0aWMtQiwgIiApOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9IQVBUSUNfQSkgcy5hcHBlbmQoImhhcHRpYy1BLCAiICk7CiAgICAgICAgICAgICBpZiAobWFzayAmIH5BVURJT19DSEFOTkVMX09VVF9BTEwpIHMuYXBwZW5kKCJ1bmtub3duLCAgIik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fTEVGVCkgcy5hcHBlbmQoImxlZnQsICIpOwpAQCAtNzgzLDYgKzc1OSwxMiBAQAogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1hfQVhJUykgcy5hcHBlbmQoIlgsICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1lfQVhJUykgcy5hcHBlbmQoIlksICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1pfQVhJUykgcy5hcHBlbmQoIlosICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0JBQ0tfTEVGVCkgcy5hcHBlbmQoImJhY2stbGVmdCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fQkFDS19SSUdIVCkgcy5hcHBlbmQoImJhY2stcmlnaHQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0NFTlRFUikgcy5hcHBlbmQoImNlbnRlciwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fTE9XX0ZSRVFVRU5DWSkgcy5hcHBlbmQoImxvdyBmcmVxLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9UT1BfTEVGVCkgcy5hcHBlbmQoInRvcC1sZWZ0LCAiICk7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVE9QX1JJR0hUKSBzLmFwcGVuZCgidG9wLXJpZ2h0LCAiICk7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LKSBzLmFwcGVuZCgidm9pY2UtdXBsaW5rLCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTkspIHMuYXBwZW5kKCJ2b2ljZS1kbmxpbmssICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiB+QVVESU9fQ0hBTk5FTF9JTl9BTEwpIHMuYXBwZW5kKCJ1bmtub3duLCAgIik7CkBAIC04NDEsOSArODIzLDQxIEBACiAgICAgICAgIGRwcmludGYoZmQsICIgbm9uZVxuIik7CiAgICAgfQogICAgIC8vIE5vdGU6IG91dHB1dCBkZXZpY2UgbWF5IGJlIHVzZWQgYnkgY2FwdHVyZSB0aHJlYWRzIGZvciBlZmZlY3RzIHN1Y2ggYXMgQUVDLgotICAgIGRwcmludGYoZmQsICIgIE91dHB1dCBkZXZpY2U6ICUjeCAoJXMpXG4iLCBtT3V0RGV2aWNlLCBkZXZpY2VzVG9TdHJpbmcobU91dERldmljZSkuY19zdHIoKSk7Ci0gICAgZHByaW50ZihmZCwgIiAgSW5wdXQgZGV2aWNlOiAlI3ggKCVzKVxuIiwgbUluRGV2aWNlLCBkZXZpY2VzVG9TdHJpbmcobUluRGV2aWNlKS5jX3N0cigpKTsKLSAgICBkcHJpbnRmKGZkLCAiICBBdWRpbyBzb3VyY2U6ICVkICglcylcbiIsIG1BdWRpb1NvdXJjZSwgc291cmNlVG9TdHJpbmcobUF1ZGlvU291cmNlKSk7CisgICAgZHByaW50ZihmZCwgIiAgT3V0cHV0IGRldmljZTogJSN4ICglcylcbiIsIG1PdXREZXZpY2UsIHRvU3RyaW5nKG1PdXREZXZpY2UpLmNfc3RyKCkpOworICAgIGRwcmludGYoZmQsICIgIElucHV0IGRldmljZTogJSN4ICglcylcbiIsIG1JbkRldmljZSwgdG9TdHJpbmcobUluRGV2aWNlKS5jX3N0cigpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBBdWRpbyBzb3VyY2U6ICVkICglcylcbiIsIG1BdWRpb1NvdXJjZSwgdG9TdHJpbmcobUF1ZGlvU291cmNlKS5jX3N0cigpKTsKKworICAgIC8vIER1bXAgdGltZXN0YW1wIHN0YXRpc3RpY3MgZm9yIHRoZSBUaHJlYWQgdHlwZXMgdGhhdCBzdXBwb3J0IGl0LgorICAgIGlmIChtVHlwZSA9PSBSRUNPUkQKKyAgICAgICAgICAgIHx8IG1UeXBlID09IE1JWEVSCisgICAgICAgICAgICB8fCBtVHlwZSA9PSBEVVBMSUNBVElORworICAgICAgICAgICAgfHwgbVR5cGUgPT0gRElSRUNUCisgICAgICAgICAgICB8fCBtVHlwZSA9PSBPRkZMT0FEKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIFRpbWVzdGFtcCBzdGF0czogJXNcbiIsIG1UaW1lc3RhbXBWZXJpZmllci50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICBkcHJpbnRmKGZkLCAiICBUaW1lc3RhbXAgY29ycmVjdGVkOiAlc1xuIiwgaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpID8gInllcyIgOiAibm8iKTsKKyAgICB9CisKKyAgICBpZiAobUxhc3RJb0JlZ2luTnMgPiAwKSB7IC8vIE1NQVAgbWF5IG5vdCBzZXQgdGhpcworICAgICAgICBkcHJpbnRmKGZkLCAiICBMYXN0ICVzIG9jY3VycmVkIChtc2Vjcyk6ICVsbGRcbiIsCisgICAgICAgICAgICAgICAgaXNPdXRwdXQoKSA/ICJ3cml0ZSIgOiAicmVhZCIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgKHN5c3RlbVRpbWUoKSAtIG1MYXN0SW9CZWdpbk5zKSAvIE5BTk9TX1BFUl9NSUxMSVNFQ09ORCk7CisgICAgfQorCisgICAgaWYgKG1Qcm9jZXNzVGltZU1zLmdldE4oKSA+IDApIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgUHJvY2VzcyB0aW1lIG1zIHN0YXRzOiAlc1xuIiwgbVByb2Nlc3NUaW1lTXMudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBpZiAobUlvSml0dGVyTXMuZ2V0TigpID4gMCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBIYWwgJXMgaml0dGVyIG1zIHN0YXRzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBpc091dHB1dCgpID8gIndyaXRlIiA6ICJyZWFkIiwKKyAgICAgICAgICAgICAgICBtSW9KaXR0ZXJNcy50b1N0cmluZygpLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmIChtTGF0ZW5jeU1zLmdldE4oKSA+IDApIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgVGhyZWFkbG9vcCAlcyBsYXRlbmN5IHN0YXRzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBpc091dHB1dCgpID8gIndyaXRlIiA6ICJyZWFkIiwKKyAgICAgICAgICAgICAgICBtTGF0ZW5jeU1zLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQogCiAgICAgaWYgKGxvY2tlZCkgewogICAgICAgICBtTG9jay51bmxvY2soKTsKQEAgLTE1MTksNyArMTUzMyw3IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6Z2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQogewogICAgIGNvbmZpZy0+dHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVg7CiAgICAgY29uZmlnLT5leHQubWl4LmhhbmRsZSA9IG1JZDsKQEAgLTE1NzEsNiArMTU4NSw5IEBACiAgICAgLS1tQmF0dGVyeUNvdW50ZXJbdHJhY2stPnVpZCgpXS5zZWNvbmQ7CiAgICAgLy8gbUxhdGVzdEFjdGl2ZVRyYWNrIGlzIG5vdCBjbGVhcmVkIGV2ZW4gaWYgaXMgdGhlIHNhbWUgYXMgdHJhY2suCiAgICAgbUhhc0NoYW5nZWQgPSB0cnVlOworI2lmZGVmIFRFRV9TSU5LCisgICAgdHJhY2stPmR1bXBUZWUoLTEgLyogZmQgKi8sICJfUkVNT1ZFIik7CisjZW5kaWYKICAgICByZXR1cm4gaW5kZXg7CiB9CiAKQEAgLTE2NDUsNiArMTY2Miw2NSBAQAogICAgIG1XYWl0V29ya0NWLmJyb2FkY2FzdCgpOwogfQogCisvLyBDYWxsIG9ubHkgZnJvbSB0aHJlYWRMb29wKCkgb3Igd2hlbiBpdCBpcyBpZGxlLgorLy8gRG8gbm90IGNhbGwgZnJvbSBoaWdoIHBlcmZvcm1hbmNlIGNvZGUgYXMgdGhpcyBtYXkgZG8gYmluZGVyIHJwYyB0byB0aGUgTWVkaWFNZXRyaWNzIHNlcnZpY2UuCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZFN0YXRpc3RpY3MoYm9vbCBmb3JjZSkKK3sKKyAgICAvLyBEbyBub3QgbG9nIGlmIHdlIGhhdmUgbm8gc3RhdHMuCisgICAgLy8gV2UgY2hvb3NlIHRoZSB0aW1lc3RhbXAgdmVyaWZpZXIgYmVjYXVzZSBpdCBpcyB0aGUgbW9zdCBsaWtlbHkgaXRlbSB0byBiZSBwcmVzZW50LgorICAgIGNvbnN0IGludDY0X3QgbnN0YXRzID0gbVRpbWVzdGFtcFZlcmlmaWVyLmdldE4oKSAtIG1MYXN0UmVjb3JkZWRUaW1lc3RhbXBWZXJpZmllck47CisgICAgaWYgKG5zdGF0cyA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBEb24ndCBsb2cgbW9yZSBmcmVxdWVudGx5IHRoYW4gb25jZSBwZXIgMTIgaG91cnMuCisgICAgLy8gV2UgdXNlIEJPT1RUSU1FIHRvIGluY2x1ZGUgc3VzcGVuZCB0aW1lLgorICAgIGNvbnN0IGludDY0X3QgdGltZU5zID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9CT09UVElNRSk7CisgICAgY29uc3QgaW50NjRfdCBzaW5jZU5zID0gdGltZU5zIC0gbUxhc3RSZWNvcmRlZFRpbWVOczsgLy8gb2sgaWYgbUxhc3RSZWNvcmRlZFRpbWVOcyA9IDAKKyAgICBpZiAoIWZvcmNlICYmIHNpbmNlTnMgPD0gMTIgKiBOQU5PU19QRVJfSE9VUikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUxhc3RSZWNvcmRlZFRpbWVzdGFtcFZlcmlmaWVyTiA9IG1UaW1lc3RhbXBWZXJpZmllci5nZXROKCk7CisgICAgbUxhc3RSZWNvcmRlZFRpbWVOcyA9IHRpbWVOczsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUFuYWx5dGljc0l0ZW0+IGl0ZW0oTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoImF1ZGlvdGhyZWFkIikpOworCisjZGVmaW5lIE1NX1BSRUZJWCAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC4iIC8vIGF2b2lkIGN1dC1uLXBhc3RlIGVycm9ycy4KKworICAgIC8vIHRocmVhZCBjb25maWd1cmF0aW9uCisgICAgaXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJpZCIsIChpbnQzMl90KW1JZCk7IC8vIElPIGhhbmRsZQorICAgIC8vIGl0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAicG9ydElkIiwgKGludDMyX3QpbVBvcnRJZCk7CisgICAgaXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggInR5cGUiLCB0aHJlYWRUeXBlVG9TdHJpbmcobVR5cGUpKTsKKyAgICBpdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggInNhbXBsZVJhdGUiLCAoaW50MzJfdCltU2FtcGxlUmF0ZSk7CisgICAgaXRlbS0+c2V0SW50NjQoTU1fUFJFRklYICJjaGFubmVsTWFzayIsIChpbnQ2NF90KW1DaGFubmVsTWFzayk7CisgICAgaXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggImVuY29kaW5nIiwgdG9TdHJpbmcobUZvcm1hdCkuY19zdHIoKSk7CisgICAgaXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJmcmFtZUNvdW50IiwgKGludDMyX3QpbUZyYW1lQ291bnQpOworICAgIGl0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJvdXREZXZpY2UiLCB0b1N0cmluZyhtT3V0RGV2aWNlKS5jX3N0cigpKTsKKyAgICBpdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAiaW5EZXZpY2UiLCB0b1N0cmluZyhtSW5EZXZpY2UpLmNfc3RyKCkpOworCisgICAgLy8gdGhyZWFkIHN0YXRpc3RpY3MKKyAgICBpZiAobUlvSml0dGVyTXMuZ2V0TigpID4gMCkgeworICAgICAgICBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJpb0ppdHRlck1zLm1lYW4iLCBtSW9KaXR0ZXJNcy5nZXRNZWFuKCkpOworICAgICAgICBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJpb0ppdHRlck1zLnN0ZCIsIG1Jb0ppdHRlck1zLmdldFN0ZERldigpKTsKKyAgICB9CisgICAgaWYgKG1Qcm9jZXNzVGltZU1zLmdldE4oKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAicHJvY2Vzc1RpbWVNcy5tZWFuIiwgbVByb2Nlc3NUaW1lTXMuZ2V0TWVhbigpKTsKKyAgICAgICAgaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAicHJvY2Vzc1RpbWVNcy5zdGQiLCBtUHJvY2Vzc1RpbWVNcy5nZXRTdGREZXYoKSk7CisgICAgfQorICAgIGNvbnN0IGF1dG8gdHNqaXR0ZXIgPSBtVGltZXN0YW1wVmVyaWZpZXIuZ2V0Sml0dGVyTXMoKTsKKyAgICBpZiAodHNqaXR0ZXIuZ2V0TigpID4gMCkgeworICAgICAgICBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJ0aW1lc3RhbXBKaXR0ZXJNcy5tZWFuIiwgdHNqaXR0ZXIuZ2V0TWVhbigpKTsKKyAgICAgICAgaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAidGltZXN0YW1wSml0dGVyTXMuc3RkIiwgdHNqaXR0ZXIuZ2V0U3RkRGV2KCkpOworICAgIH0KKyAgICBpZiAobUxhdGVuY3lNcy5nZXROKCkgPiAwKSB7CisgICAgICAgIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggImxhdGVuY3lNcy5tZWFuIiwgbUxhdGVuY3lNcy5nZXRNZWFuKCkpOworICAgICAgICBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJsYXRlbmN5TXMuc3RkIiwgbUxhdGVuY3lNcy5nZXRTdGREZXYoKSk7CisgICAgfQorCisgICAgaXRlbS0+c2VsZnJlY29yZCgpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgICAgIFBsYXliYWNrCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNjc0LDcgKzE3NTAsNyBAQAogICAgICAgICAvLyBtU3RyZWFtVHlwZXNbXSBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvciBib2R5CiAgICAgICAgIG1UcmFja3ModHlwZSA9PSBNSVhFUiksCiAgICAgICAgIG1PdXRwdXQob3V0cHV0KSwKLSAgICAgICAgbUxhc3RXcml0ZVRpbWUoLTEpLCBtTnVtV3JpdGVzKDApLCBtTnVtRGVsYXllZFdyaXRlcygwKSwgbUluV3JpdGUoZmFsc2UpLAorICAgICAgICBtTnVtV3JpdGVzKDApLCBtTnVtRGVsYXllZFdyaXRlcygwKSwgbUluV3JpdGUoZmFsc2UpLAogICAgICAgICBtTWl4ZXJTdGF0dXMoTUlYRVJfSURMRSksCiAgICAgICAgIG1NaXhlclN0YXR1c0lnbm9yaW5nRmFzdFRyYWNrcyhNSVhFUl9JRExFKSwKICAgICAgICAgbVN0YW5kYnlEZWxheU5zKEF1ZGlvRmxpbmdlcjo6bVN0YW5kYnlUaW1lSW5Oc2VjcyksCkBAIC0xNzA5LDEwICsxNzg1LDIxIEBACiAgICAgICAgIGlmIChtT3V0cHV0LT5hdWRpb0h3RGV2LT5jYW5TZXRNYXN0ZXJNdXRlKCkpIHsKICAgICAgICAgICAgIG1NYXN0ZXJNdXRlID0gZmFsc2U7CiAgICAgICAgIH0KKyAgICAgICAgbUlzTXNkRGV2aWNlID0gc3RyY21wKAorICAgICAgICAgICAgICAgIG1PdXRwdXQtPmF1ZGlvSHdEZXYtPm1vZHVsZU5hbWUoKSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkgPT0gMDsKICAgICB9CiAKICAgICByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCk7CiAKKyAgICAvLyBUT0RPOiBXZSBtYXkgYWxzbyBtYXRjaCBvbiBhZGRyZXNzIGFzIHdlbGwgYXMgZGV2aWNlIHR5cGUgZm9yCisgICAgLy8gQVVESU9fREVWSUNFX09VVF9CVVMsIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFAsIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWAorICAgIGlmICh0eXBlID09IE1JWEVSIHx8IHR5cGUgPT0gRElSRUNUKSB7CisgICAgICAgIG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2VzID0gKGF1ZGlvX2RldmljZXNfdClwcm9wZXJ0eV9nZXRfaW50NjQoCisgICAgICAgICAgICAgICAgImF1ZGlvLnRpbWVzdGFtcC5jb3JyZWN0ZWRfb3V0cHV0X2RldmljZXMiLAorICAgICAgICAgICAgICAgIChpbnQ2NF90KShtSXNNc2REZXZpY2UgPyBBVURJT19ERVZJQ0VfT1VUX0JVUyAvLyB0dXJuIG9uIGJ5IGRlZmF1bHQgZm9yIE1TRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVURJT19ERVZJQ0VfTk9ORSkpOworICAgIH0KKwogICAgIC8vICsrIG9wZXJhdG9yIGRvZXMgbm90IGNvbXBpbGUKICAgICBmb3IgKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX01JTjsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOwogICAgICAgICAgICAgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIChzdHJlYW0gKyAxKSkgewpAQCAtMTc3Myw3ICsxODYwLDcgQEAKICAgICBpZiAobnVtdHJhY2tzKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgb2Ygd2hpY2ggJXp1IGFyZSBhY3RpdmVcbiIsIG51bWFjdGl2ZSk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgbVRyYWNrc1swXS0+YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bXRyYWNrczsgKytpKSB7CiAgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKQEAgLTE3OTMsNyArMTg4MCw3IEBACiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgVGhlIGZvbGxvd2luZyB0cmFja3MgYXJlIGluIHRoZSBhY3RpdmUgbGlzdCBidXQiCiAgICAgICAgICAgICAgICAgIiBub3QgaW4gdGhlIHRyYWNrIGxpc3RcbiIpOwogICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0gICAgICAgIFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIG1BY3RpdmVUcmFja3NbMF0tPmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1hY3RpdmU7ICsraSkgewogICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKICAgICAgICAgICAgIGlmIChtVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgewpAQCAtMTgxMCw5ICsxODk3LDEyIEBACiB7CiAgICAgZHVtcEJhc2UoZmQsIGFyZ3MpOwogCisgICAgZHByaW50ZihmZCwgIiAgTWFzdGVyIG11dGU6ICVzXG4iLCBtTWFzdGVyTXV0ZSA/ICJvbiIgOiAib2ZmIik7CisgICAgaWYgKG1IYXB0aWNDaGFubmVsTWFzayAhPSBBVURJT19DSEFOTkVMX05PTkUpIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgSGFwdGljIGNoYW5uZWwgbWFzazogJSN4ICglcylcbiIsIG1IYXB0aWNDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFza1RvU3RyaW5nKG1IYXB0aWNDaGFubmVsTWFzaywgdHJ1ZSAvKiBvdXRwdXQgKi8pLmNfc3RyKCkpOworICAgIH0KICAgICBkcHJpbnRmKGZkLCAiICBOb3JtYWwgZnJhbWUgY291bnQ6ICV6dVxuIiwgbU5vcm1hbEZyYW1lQ291bnQpOwotICAgIGRwcmludGYoZmQsICIgIExhc3Qgd3JpdGUgb2NjdXJyZWQgKG1zZWNzKTogJWxsdVxuIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG5zMm1zKHN5c3RlbVRpbWUoKSAtIG1MYXN0V3JpdGVUaW1lKSk7CiAgICAgZHByaW50ZihmZCwgIiAgVG90YWwgd3JpdGVzOiAlZFxuIiwgbU51bVdyaXRlcyk7CiAgICAgZHByaW50ZihmZCwgIiAgRGVsYXllZCB3cml0ZXM6ICVkXG4iLCBtTnVtRGVsYXllZFdyaXRlcyk7CiAgICAgZHByaW50ZihmZCwgIiAgQmxvY2tlZCBpbiB3cml0ZTogJXNcbiIsIG1JbldyaXRlID8gInllcyIgOiAibm8iKTsKQEAgLTE4MjUsNyArMTkxNSw3IEBACiAgICAgQXVkaW9TdHJlYW1PdXQgKm91dHB1dCA9IG1PdXRwdXQ7CiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBvdXRwdXQgIT0gTlVMTCA/IG91dHB1dC0+ZmxhZ3MgOiBBVURJT19PVVRQVVRfRkxBR19OT05FOwogICAgIGRwcmludGYoZmQsICIgIEF1ZGlvU3RyZWFtT3V0OiAlcCBmbGFncyAlI3ggKCVzKVxuIiwKLSAgICAgICAgICAgIG91dHB1dCwgZmxhZ3MsIG91dHB1dEZsYWdzVG9TdHJpbmcoZmxhZ3MpLmNfc3RyKCkpOworICAgICAgICAgICAgb3V0cHV0LCBmbGFncywgdG9TdHJpbmcoZmxhZ3MpLmNfc3RyKCkpOwogICAgIGRwcmludGYoZmQsICIgIEZyYW1lcyB3cml0dGVuOiAlbGxkXG4iLCAobG9uZyBsb25nKW1GcmFtZXNXcml0dGVuKTsKICAgICBkcHJpbnRmKGZkLCAiICBTdXNwZW5kZWQgZnJhbWVzOiAlbGxkXG4iLCAobG9uZyBsb25nKW1TdXNwZW5kZWRGcmFtZXMpOwogICAgIGlmIChtUGlwZVNpbmsuZ2V0KCkgIT0gbnVsbHB0cikgewpAQCAtMTg4MCwxMSArMTk3MCwxNyBAQAogICAgIHN0YXR1c190IGxTdGF0dXM7CiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3Qgb3V0cHV0RmxhZ3MgPSBtT3V0cHV0LT5mbGFnczsKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCByZXF1ZXN0ZWRGbGFncyA9ICpmbGFnczsKKyAgICB1aW50MzJfdCBzYW1wbGVSYXRlOworCisgICAgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwICYmIGNoZWNrSU1lbW9yeShzaGFyZWRCdWZmZXIpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CiAKICAgICBpZiAoKnBTYW1wbGVSYXRlID09IDApIHsKICAgICAgICAgKnBTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgfQotICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSAqcFNhbXBsZVJhdGU7CisgICAgc2FtcGxlUmF0ZSA9ICpwU2FtcGxlUmF0ZTsKIAogICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgRkFTVCBmbGFnIGNvbnNpZGVyZWQgT0sgaWYgZmFzdCBtaXhlciBpcyBwcmVzZW50CiAgICAgaWYgKGhhc0Zhc3RNaXhlcigpKSB7CkBAIC0xOTA1LDcgKzIwMDEsNyBAQAogICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmCiAgICAgICAgICAgICAvLyBUT0RPOiBleHRyYWN0IGFzIGEgZGF0YSBsaWJyYXJ5IGZ1bmN0aW9uIHRoYXQgY2hlY2tzIHRoYXQgYSBjb21wdXRhdGlvbmFsbHkKICAgICAgICAgICAgIC8vIGV4cGVuc2l2ZSBkb3dubWl4ZXIgaXMgbm90IHJlcXVpcmVkOiBpc0Zhc3RPdXRwdXRDaGFubmVsQ29udmVyc2lvbigpCi0gICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gbUNoYW5uZWxNYXNrIHx8CisgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gKG1DaGFubmVsTWFzayB8IG1IYXB0aWNDaGFubmVsTWFzaykgfHwKICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyB8fAogICAgICAgICAgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICYmIG1DaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gKi8pKSAmJgpAQCAtMjE3NCw0OCArMjI3MCwxNyBAQAogfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3NpemVfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFja3M8VD46OmFkZChjb25zdCBzcDxUPiAmdHJhY2spCi17Ci0gICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1UcmFja3MuYWRkKHRyYWNrKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAvLyBzZXQgbmFtZSBmb3IgdHJhY2sgd2hlbiBhZGRpbmcuCi0gICAgICAgIGludCBuYW1lOwotICAgICAgICBpZiAobVVudXNlZFRyYWNrTmFtZXMuZW1wdHkoKSkgewotICAgICAgICAgICAgbmFtZSA9IG1UcmFja3Muc2l6ZSgpIC0gMTsgLy8gbmV3IG5hbWUgezAgLi4uIHNpemUtMX0uCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyByZXVzZSBzbWFsbGVzdCBuYW1lIGZvciBkZWxldGVkIHRyYWNrLgotICAgICAgICAgICAgYXV0byBpdCA9IG1VbnVzZWRUcmFja05hbWVzLmJlZ2luKCk7Ci0gICAgICAgICAgICBuYW1lID0gKml0OwotICAgICAgICAgICAgKHZvaWQpbVVudXNlZFRyYWNrTmFtZXMuZXJhc2UoaXQpOwotICAgICAgICB9Ci0gICAgICAgIHRyYWNrLT5zZXROYW1lKG5hbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoImNhbm5vdCBhZGQgdHJhY2siKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluZGV4OwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgogc3NpemVfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFja3M8VD46OnJlbW92ZShjb25zdCBzcDxUPiAmdHJhY2spCiB7Ci0gICAgY29uc3QgaW50IG5hbWUgPSB0cmFjay0+bmFtZSgpOworICAgIGNvbnN0IGludCB0cmFja0lkID0gdHJhY2stPmlkKCk7CiAgICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1UcmFja3MucmVtb3ZlKHRyYWNrKTsKICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAvLyBpbnZhbGlkYXRlIG5hbWUgd2hlbiByZW1vdmluZyBmcm9tIG1UcmFja3MuCi0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobmFtZSA8IDAsICJpbnZhbGlkIG5hbWUgJWQgZm9yIHRyYWNrIG9uIG1UcmFja3MiLCBuYW1lKTsKLQotICAgICAgICBpZiAobVNhdmVEZWxldGVkVHJhY2tOYW1lcykgeworICAgICAgICBpZiAobVNhdmVEZWxldGVkVHJhY2tJZHMpIHsKICAgICAgICAgICAgIC8vIFdlIGNhbid0IGRpcmVjdGx5IGFjY2VzcyBtQXVkaW9NaXhlciBzaW5jZSB0aGUgY2FsbGVyIG1heSBiZSBvdXRzaWRlIG9mIHRocmVhZExvb3AuCi0gICAgICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBhZGQgdG8gbURlbGV0ZWRUcmFja05hbWVzIHdoaWNoIGlzIHNvbGVseSB1c2VkIGZvciBtQXVkaW9NaXhlciB1cGRhdGUsCisgICAgICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBhZGQgdG8gbURlbGV0ZWRUcmFja0lkcyB3aGljaCBpcyBzb2xlbHkgdXNlZCBmb3IgbUF1ZGlvTWl4ZXIgdXBkYXRlLAogICAgICAgICAgICAgLy8gdG8gYmUgaGFuZGxlZCB3aGVuIE1peGVyVGhyZWFkOjpwcmVwYXJlVHJhY2tzX2woKSBuZXh0IGNoYW5nZXMgbUF1ZGlvTWl4ZXIuCi0gICAgICAgICAgICBtRGVsZXRlZFRyYWNrTmFtZXMuZW1wbGFjZShuYW1lKTsKKyAgICAgICAgICAgIG1EZWxldGVkVHJhY2tJZHMuZW1wbGFjZSh0cmFja0lkKTsKICAgICAgICAgfQotCi0gICAgICAgIG1VbnVzZWRUcmFja05hbWVzLmVtcGxhY2UobmFtZSk7Ci0gICAgICAgIHRyYWNrLT5zZXROYW1lKFQ6OlRSQUNLX05BTUVfUEVORElORyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihuYW1lID49IDAsCi0gICAgICAgICAgICAgICAgInZhbGlkIG5hbWUgJWQgZm9yIHRyYWNrIG5vdCBpbiBtVHJhY2tzIChyZXR1cm5lZCAlemQpIiwgbmFtZSwgaW5kZXgpOwogICAgIH0KICAgICByZXR1cm4gaW5kZXg7CiB9CkBAIC0yMjUxLDYgKzIzMTYsMTEgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6c2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKQoreworICAgIG1NYXN0ZXJCYWxhbmNlLnN0b3JlKGJhbGFuY2UpOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnNldE1hc3Rlck11dGUoYm9vbCBtdXRlZCkKIHsKICAgICBpZiAoaXNEdXBsaWNhdGluZygpKSB7CkBAIC0yMzAzLDE1ICsyMzczLDEzIEBACiAgICAgICAgIGlmICh0cmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKICAgICAgICAgICAgIFRyYWNrQmFzZTo6dHJhY2tfc3RhdGUgc3RhdGUgPSB0cmFjay0+bVN0YXRlOwogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQobUlkLCB0cmFjay0+c3RyZWFtVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgIC8vIGFib3J0IHRyYWNrIHdhcyBzdG9wcGVkL3BhdXNlZCB3aGlsZSB3ZSByZWxlYXNlZCB0aGUgbG9jawogICAgICAgICAgICAgaWYgKHN0YXRlICE9IHRyYWNrLT5tU3RhdGUpIHsKICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChtSWQsIHRyYWNrLT5zdHJlYW1UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRyYWNrLT5wb3J0SWQoKSk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMjM0MCw2ICsyNDA4LDI1IEBACiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zaGFyZWRCdWZmZXIoKSAhPSAwID8gVHJhY2s6OkZTX0ZJTExFRCA6IFRyYWNrOjpGU19GSUxMSU5HOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKCh0cmFjay0+Y2hhbm5lbE1hc2soKSAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgIT0gQVVESU9fQ0hBTk5FTF9OT05FCisgICAgICAgICAgICAgICAgJiYgbUhhcHRpY0NoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfTk9ORSkgeworICAgICAgICAgICAgLy8gVW5sb2NrIGR1ZSB0byBWaWJyYXRvclNlcnZpY2Ugd2lsbCBsb2NrIGZvciB0aGlzIGNhbGwgYW5kIHdpbGwKKyAgICAgICAgICAgIC8vIGNhbGwgVHJhY2tzLm11dGUvdW5tdXRlIHdoaWNoIGFsc28gcmVxdWlyZSB0aHJlYWQncyBsb2NrLgorICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBjb25zdCBpbnQgaW50ZW5zaXR5ID0gQXVkaW9GbGluZ2VyOjpvbkV4dGVybmFsVmlicmF0aW9uU3RhcnQoCisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5nZXRFeHRlcm5hbFZpYnJhdGlvbigpKTsKKyAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgIHRyYWNrLT5zZXRIYXB0aWNJbnRlbnNpdHkoc3RhdGljX2Nhc3Q8QXVkaW9NaXhlcjo6aGFwdGljX2ludGVuc2l0eV90PihpbnRlbnNpdHkpKTsKKyAgICAgICAgICAgIC8vIEhhcHRpYyBwbGF5YmFjayBzaG91bGQgYmUgZW5hYmxlZCBieSB2aWJyYXRvciBzZXJ2aWNlLgorICAgICAgICAgICAgaWYgKHRyYWNrLT5nZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIC8vIERpc2FibGUgaGFwdGljIHBsYXliYWNrIG9mIGFsbCBhY3RpdmUgdHJhY2sgdG8gZW5zdXJlIG9ubHkKKyAgICAgICAgICAgICAgICAvLyBvbmUgdHJhY2sgcGxheWluZyBoYXB0aWMgaWYgY3VycmVudCB0cmFjayBzaG91bGQgcGxheSBoYXB0aWMuCisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZ0IDogbUFjdGl2ZVRyYWNrcykgeworICAgICAgICAgICAgICAgICAgICB0LT5zZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHRyYWNrLT5tUmVzZXREb25lID0gZmFsc2U7CiAgICAgICAgIHRyYWNrLT5tUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgPSAwOwogICAgICAgICBtQWN0aXZlVHJhY2tzLmFkZCh0cmFjayk7CkBAIC0yNDA1LDYgKzI0OTIsMTQgQEAKICAgICByZXR1cm4gU3RyaW5nOCgpOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1PdXRwdXQgPT0gbnVsbHB0ciB8fCBtT3V0cHV0LT5zdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1PdXRwdXQtPnN0cmVhbS0+c2VsZWN0UHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbklkLCBwcm9ncmFtSWQpOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCkgewogICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBkZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7CiAgICAgQUxPR1YoIlBsYXliYWNrVGhyZWFkOjppb0NvbmZpZ0NoYW5nZWQsIHRocmVhZCAlcCwgZXZlbnQgJWQiLCB0aGlzLCBldmVudCk7CkBAIC0yNDYyLDYgKzI1NTcsMTEgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIC8vIHJlamVjdCBvdXQgb2Ygc2VxdWVuY2UgcmVxdWVzdHMKICAgICBpZiAoKG1EcmFpblNlcXVlbmNlICYgMSkgJiYgKHNlcXVlbmNlID09IG1EcmFpblNlcXVlbmNlKSkgeworICAgICAgICAvLyBSZWdpc3RlciBkaXNjb250aW51aXR5IHdoZW4gSFcgZHJhaW4gaXMgY29tcGxldGVkIGJlY2F1c2UgdGhhdCBjYW4gY2F1c2UKKyAgICAgICAgLy8gdGhlIHRpbWVzdGFtcCBmcmFtZSBwb3NpdGlvbiB0byByZXNldCB0byAwIGZvciBkaXJlY3QgYW5kIG9mZmxvYWQgdGhyZWFkcy4KKyAgICAgICAgLy8gKE91dCBvZiBzZXF1ZW5jZSByZXF1ZXN0cyBhcmUgaWdub3JlZCwgc2luY2UgdGhlIGRpc2NvbnRpbnVpdHkgd291bGQgYmUgaGFuZGxlZAorICAgICAgICAvLyBlbHNld2hlcmUsIGUuZy4gaW4gZmx1c2gpLgorICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOwogICAgICAgICBtRHJhaW5TZXF1ZW5jZSAmPSB+MTsKICAgICAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CiAgICAgfQpAQCAtMjQ4MSw2ICsyNTgxLDcgQEAKICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2spOwogICAgIH0KICAgICBtQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1DaGFubmVsTWFzayk7CisgICAgbUJhbGFuY2Uuc2V0Q2hhbm5lbE1hc2sobUNoYW5uZWxNYXNrKTsKIAogICAgIC8vIEdldCBhY3R1YWwgSEFMIGZvcm1hdC4KICAgICBzdGF0dXNfdCByZXN1bHQgPSBtT3V0cHV0LT5zdHJlYW0tPmdldEZvcm1hdCgmbUhBTEZvcm1hdCk7CkBAIC0yNjAwLDcgKzI3MDEsNyBAQAogICAgIGZyZWUobU1peGVyQnVmZmVyKTsKICAgICBtTWl4ZXJCdWZmZXIgPSBOVUxMOwogICAgIGlmIChtTWl4ZXJCdWZmZXJFbmFibGVkKSB7Ci0gICAgICAgIG1NaXhlckJ1ZmZlckZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7IC8vIGFsc28gdmFsaWQ6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgorICAgICAgICBtTWl4ZXJCdWZmZXJGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOyAvLyBubyBsb25nZXIgdmFsaWQ6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgogICAgICAgICBtTWl4ZXJCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50CiAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1NaXhlckJ1ZmZlckZvcm1hdCk7CiAgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtTWl4ZXJCdWZmZXIsIDMyLCBtTWl4ZXJCdWZmZXJTaXplKTsKQEAgLTI2MTQsNiArMjcxNSwxMSBAQAogICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbUVmZmVjdEJ1ZmZlciwgMzIsIG1FZmZlY3RCdWZmZXJTaXplKTsKICAgICB9CiAKKyAgICBtSGFwdGljQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7CisgICAgbUNoYW5uZWxNYXNrICY9IH5tSGFwdGljQ2hhbm5lbE1hc2s7CisgICAgbUhhcHRpY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtSGFwdGljQ2hhbm5lbE1hc2spOworICAgIG1DaGFubmVsQ291bnQgLT0gbUhhcHRpY0NoYW5uZWxDb3VudDsKKwogICAgIC8vIGZvcmNlIHJlY29uZmlndXJhdGlvbiBvZiBlZmZlY3QgY2hhaW5zIGFuZCBlbmdpbmVzIHRvIHRha2UgbmV3IGJ1ZmZlciBzaXplIGFuZCBhdWRpbwogICAgIC8vIHBhcmFtZXRlcnMgaW50byBhY2NvdW50CiAgICAgLy8gTm90ZSB0aGF0IG1Mb2NrIGlzIG5vdCBoZWxkIHdoZW4gcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpIGlzIGNhbGxlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvcgpAQCAtMjY4MiwyOCArMjc4OCw2IEBACiAgICAgfQogfQogCi0vLyBoYXNBdWRpb1Nlc3Npb25fbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAotdWludDMyX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6aGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3QKLXsKLSAgICB1aW50MzJfdCByZXN1bHQgPSAwOwotICAgIGlmIChnZXRFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCkgIT0gMCkgewotICAgICAgICByZXN1bHQgPSBFRkZFQ1RfU0VTU0lPTjsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKLSAgICAgICAgaWYgKHNlc3Npb25JZCA9PSB0cmFjay0+c2Vzc2lvbklkKCkgJiYgIXRyYWNrLT5pc0ludmFsaWQoKSkgewotICAgICAgICAgICAgcmVzdWx0IHw9IFRSQUNLX1NFU1NJT047Ci0gICAgICAgICAgICBpZiAodHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgfD0gRkFTVF9TRVNTSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRTdHJhdGVneUZvclNlc3Npb25fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKQogewogICAgIC8vIHNlc3Npb24gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYIGlzIHBsYWNlZCBpbiBzYW1lIHN0cmF0ZWd5IGFzIE1VU0lDIHN0cmVhbSBzbyB0aGF0CkBAIC0yNzgxLDI0ICsyODY1LDE4IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnRocmVhZExvb3BfcmVtb3ZlVHJhY2tzKAogICAgICAgICBjb25zdCBWZWN0b3I8IHNwPFRyYWNrPiA+JiB0cmFja3NUb1JlbW92ZSkKIHsKLSAgICBzaXplX3QgY291bnQgPSB0cmFja3NUb1JlbW92ZS5zaXplKCk7Ci0gICAgaWYgKGNvdW50ID4gMCkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMCA7IGkgPCBjb3VudCA7IGkrKykgewotICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2s+JiB0cmFjayA9IHRyYWNrc1RvUmVtb3ZlLml0ZW1BdChpKTsKLSAgICAgICAgICAgIGlmICh0cmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChtSWQsIHRyYWNrLT5zdHJlYW1UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAvLyBNaXNjZWxsYW5lb3VzIHRyYWNrIGNsZWFudXAgd2hlbiByZW1vdmVkIGZyb20gdGhlIGFjdGl2ZSBsaXN0LAorICAgIC8vIGNhbGxlZCB3aXRob3V0IFRocmVhZCBsb2NrIGJ1dCBzeW5jaHJvbml6ZWQgd2l0aCB0aHJlYWRMb29wIHByb2Nlc3NpbmcuCiAjaWZkZWYgQUREX0JBVFRFUllfREFUQQotICAgICAgICAgICAgICAgIC8vIHRvIHRyYWNrIHRoZSBzcGVha2VyIHVzYWdlCi0gICAgICAgICAgICAgICAgYWRkQmF0dGVyeURhdGEoSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhQXVkaW9GbGluZ2VyU3RvcCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1JZCwgdHJhY2stPnN0cmVhbVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiB0cmFjayA6IHRyYWNrc1RvUmVtb3ZlKSB7CisgICAgICAgIGlmICh0cmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKKyAgICAgICAgICAgIC8vIHRvIHRyYWNrIHRoZSBzcGVha2VyIHVzYWdlCisgICAgICAgICAgICBhZGRCYXR0ZXJ5RGF0YShJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFBdWRpb0ZsaW5nZXJTdG9wKTsKICAgICAgICAgfQogICAgIH0KKyNlbHNlCisgICAgKHZvaWQpdHJhY2tzVG9SZW1vdmU7IC8vIHN1cHByZXNzIHVudXNlZCB3YXJuaW5nCisjZW5kaWYKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpjaGVja1NpbGVudE1vZGVfbCgpCkBAIC0yODUwLDYgKzI5MjgsOSBAQAogICAgICAgICBBVFJBQ0VfRU5EKCk7CiAgICAgICAgIGlmIChmcmFtZXNXcml0dGVuID4gMCkgewogICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gZnJhbWVzV3JpdHRlbiAqIG1GcmFtZVNpemU7CisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgICAgIG1UZWUud3JpdGUoKGNoYXIgKiltU2lua0J1ZmZlciArIG9mZnNldCwgZnJhbWVzV3JpdHRlbik7CisjZW5kaWYKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGZyYW1lc1dyaXR0ZW47CiAgICAgICAgIH0KQEAgLTI5ODksNyArMzA3MCw3IEBACiAgICAgICAgIC8vIE9ubHkgb25lIGVmZmVjdCBjaGFpbiBjYW4gYmUgcHJlc2VudCBpbiBkaXJlY3Qgb3V0cHV0IHRocmVhZCBhbmQgaXQgdXNlcwogICAgICAgICAvLyB0aGUgc2luayBidWZmZXIgYXMgaW5wdXQKICAgICAgICAgaWYgKG1UeXBlICE9IERJUkVDVCkgewotICAgICAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQ7CisgICAgICAgICAgICBzaXplX3QgbnVtU2FtcGxlcyA9IG1Ob3JtYWxGcmFtZUNvdW50ICogKG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50KTsKICAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IG1BdWRpb0ZsaW5nZXItPm1FZmZlY3RzRmFjdG9yeUhhbC0+YWxsb2NhdGVCdWZmZXIoCiAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMgKiBzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSwKICAgICAgICAgICAgICAgICAgICAgJmhhbEluQnVmZmVyKTsKQEAgLTMxMzAsOCArMzIxMSw4IEBACiAgICAgVmVjdG9yPCBzcDxUcmFjaz4gPiB0cmFja3NUb1JlbW92ZTsKIAogICAgIG1TdGFuZGJ5VGltZU5zID0gc3lzdGVtVGltZSgpOwotICAgIG5zZWNzX3QgbGFzdFdyaXRlRmluaXNoZWQgPSAtMTsgLy8gdGltZSBsYXN0IHNlcnZlciB3cml0ZSBjb21wbGV0ZWQKLSAgICBpbnQ2NF90IGxhc3RGcmFtZXNXcml0dGVuID0gLTE7IC8vIHRyYWNrIGNoYW5nZXMgaW4gdGltZXN0YW1wIHNlcnZlciBmcmFtZXMgd3JpdHRlbgorICAgIGludDY0X3QgbGFzdExvb3BDb3VudFdyaXR0ZW4gPSAtMjsgLy8gbmV2ZXIgbWF0Y2hlcyAicHJldmlvdXMiIGxvb3AsIHdoZW4gbG9vcENvdW50ID0gMC4KKyAgICBpbnQ2NF90IGxhc3RGcmFtZXNXcml0dGVuID0gLTE7ICAgIC8vIHRyYWNrIGNoYW5nZXMgaW4gdGltZXN0YW1wIHNlcnZlciBmcmFtZXMgd3JpdHRlbgogCiAgICAgLy8gTUlYRVIKICAgICBuc2Vjc190IGxhc3RXYXJuaW5nID0gMDsKQEAgLTMxNjcsNyArMzI0OCwxOCBAQAogCiAgICAgY2hlY2tTaWxlbnRNb2RlX2woKTsKIAotICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKKyAgICAvLyBESVJFQ1QgYW5kIE9GRkxPQUQgdGhyZWFkcyBzaG91bGQgcmVzZXQgZnJhbWUgY291bnQgdG8gemVybyBvbiBzdG9wL2ZsdXNoCisgICAgLy8gVE9ETzogYWRkIGNvbmZpcm1hdGlvbiBjaGVja3M6CisgICAgLy8gMSkgRElSRUNUIHRocmVhZHMgYW5kIGxpbmVhciBQQ00gZm9ybWF0IHJlYWxseSByZXNldHMgdG8gMD8KKyAgICAvLyAyKSBJcyBmcmFtZSBjb3VudCByZWFsbHkgdmFsaWQgaWYgbm90IGxpbmVhciBwY20/CisgICAgLy8gMykgQXJlIGFsbCA2NCBiaXRzIG9mIHBvc2l0aW9uIHJldHVybmVkLCBub3QganVzdCBsb3dlc3QgMzIgYml0cz8KKyAgICBpZiAobVR5cGUgPT0gT0ZGTE9BRCB8fCBtVHlwZSA9PSBESVJFQ1QpIHsKKyAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLnNldERpc2NvbnRpbnVpdHlNb2RlKG1UaW1lc3RhbXBWZXJpZmllci5ESVNDT05USU5VSVRZX01PREVfWkVSTyk7CisgICAgfQorICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGxhc3REb3duc3RyZWFtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKworICAgIC8vIGxvb3BDb3VudCBpcyB1c2VkIGZvciBzdGF0aXN0aWNzIGFuZCBkaWFnbm9zdGljcy4KKyAgICBmb3IgKGludDY0X3QgbG9vcENvdW50ID0gMDsgIWV4aXRQZW5kaW5nKCk7ICsrbG9vcENvdW50KQogICAgIHsKICAgICAgICAgLy8gTG9nIG1lcmdlIHJlcXVlc3RzIGFyZSBwZXJmb3JtZWQgZHVyaW5nIEF1ZGlvRmxpbmdlciBiaW5kZXIgdHJhbnNhY3Rpb25zLCBidXQKICAgICAgICAgLy8gdGhhdCBkb2VzIG5vdCBjb3ZlciBhdWRpbyBwbGF5YmFjay4gSXQncyByZXF1ZXN0ZWQgaGVyZSBmb3IgdGhhdCByZWFzb24uCkBAIC0zMTc3LDYgKzMyNjksNDkgQEAKIAogICAgICAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+IGVmZmVjdENoYWluczsKIAorICAgICAgICAvLyBJZiB0aGUgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfQlVTLCBjaGVjayBmb3IgZG93bnN0cmVhbSBsYXRlbmN5LgorICAgICAgICAvLworICAgICAgICAvLyBOb3RlOiB3ZSBhY2Nlc3Mgb3V0RGV2aWNlKCkgb3V0c2lkZSBvZiBtTG9jay4KKyAgICAgICAgaWYgKGlzTXNkRGV2aWNlKCkgJiYgKG91dERldmljZSgpICYgQVVESU9fREVWSUNFX09VVF9CVVMpICE9IDApIHsKKyAgICAgICAgICAgIC8vIEhlcmUsIHdlIHRyeSBmb3IgdGhlIEFGIGxvY2ssIGJ1dCBkbyBub3QgYmxvY2sgb24gaXQgYXMgdGhlIGxhdGVuY3kKKyAgICAgICAgICAgIC8vIGlzIG1vcmUgaW5mb3JtYXRpb25hbC4KKyAgICAgICAgICAgIGlmIChtQXVkaW9GbGluZ2VyLT5tTG9jay50cnlMb2NrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXRjaFBhbmVsOjpTb2Z0d2FyZVBhdGNoPiBzd1BhdGNoZXM7CisgICAgICAgICAgICAgICAgZG91YmxlIGxhdGVuY3lNczsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBkb3duc3RyZWFtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRmxpbmdlci0+bVBhdGNoUGFuZWwuZ2V0RG93bnN0cmVhbVNvZnR3YXJlUGF0Y2hlcyhpZCgpLCAmc3dQYXRjaGVzKSA9PSBPSworICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3dQYXRjaGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN3UGF0Y2hlc1swXS5nZXRMYXRlbmN5TXNfbCgmbGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvd25zdHJlYW1QYXRjaEhhbmRsZSA9IHN3UGF0Y2hlc1swXS5nZXRQYXRjaEhhbmRsZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZG93bnN0cmVhbVBhdGNoSGFuZGxlICE9IGxhc3REb3duc3RyZWFtUGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGxhc3REb3duc3RyZWFtUGF0Y2hIYW5kbGUgPSBkb3duc3RyZWFtUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGRvd25zdHJlYW0gbGF0ZW5jeSAod2UgYXNzdW1lIGEgbWF4IHJlYXNvbmFibGUKKyAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZW5jeSBvZiA1IHNlY29uZHMpLgorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgbWluTGF0ZW5jeSA9IDAuLCBtYXhMYXRlbmN5ID0gNTAwMC47CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXRlbmN5TXMgPj0gbWluTGF0ZW5jeSAmJiBsYXRlbmN5TXMgPD0gbWF4TGF0ZW5jeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5ldyBkb3duc3RyZWFtIGxhdGVuY3kgJWxmIG1zIiwgbGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJvdXQgb2YgcmFuZ2UgZG93bnN0cmVhbSBsYXRlbmN5ICVsZiBtcyIsIGxhdGVuY3lNcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF0ZW5jeU1zIDwgbWluTGF0ZW5jeSkgbGF0ZW5jeU1zID0gbWluTGF0ZW5jeTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxhdGVuY3lNcyA+IG1heExhdGVuY3kpIGxhdGVuY3lNcyA9IG1heExhdGVuY3k7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmFkZChsYXRlbmN5TXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLT5tTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChsYXN0RG93bnN0cmVhbVBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgLy8gb3VyIGRldmljZSBpcyBubyBsb25nZXIgQVVESU9fREVWSUNFX09VVF9CVVMsIHJlc2V0IHBhdGNoIGhhbmRsZSBhbmQgc3RhdHMuCisgICAgICAgICAgICAgICAgbURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgbGFzdERvd25zdHJlYW1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgeyAvLyBzY29wZSBmb3IgbUxvY2sKIAogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTMxOTAsMTYgKzMzMjUsNTEgQEAKICAgICAgICAgICAgICAgICBsb2dTdHJpbmcgPSBOVUxMOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBDb2xsZWN0IHRpbWVzdGFtcCBzdGF0aXN0aWNzIGZvciB0aGUgUGxheWJhY2sgVGhyZWFkIHR5cGVzIHRoYXQgc3VwcG9ydCBpdC4KKyAgICAgICAgICAgIGlmIChtVHlwZSA9PSBNSVhFUgorICAgICAgICAgICAgICAgICAgICB8fCBtVHlwZSA9PSBEVVBMSUNBVElORworICAgICAgICAgICAgICAgICAgICB8fCBtVHlwZSA9PSBESVJFQ1QKKyAgICAgICAgICAgICAgICAgICAgfHwgbVR5cGUgPT0gT0ZGTE9BRCkgeyAvLyBubyBpbmRlbnRhdGlvbgogICAgICAgICAgICAgLy8gR2F0aGVyIHRoZSBmcmFtZXNSZWxlYXNlZCBjb3VudGVycyBmb3IgYWxsIGFjdGl2ZSB0cmFja3MsCiAgICAgICAgICAgICAvLyBhbmQgYXNzb2NpYXRlIHdpdGggdGhlIHNpbmsgZnJhbWVzIHdyaXR0ZW4gb3V0LiAgV2UgbmVlZAogICAgICAgICAgICAgLy8gdGhpcyB0byBjb252ZXJ0IHRoZSBzaW5rIHRpbWVzdGFtcCB0byB0aGUgdHJhY2sgdGltZXN0YW1wLgogICAgICAgICAgICAgYm9vbCBrZXJuZWxMb2NhdGlvblVwZGF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKG1Ob3JtYWxTaW5rICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgRHVwbGljYXRpbmdUaHJlYWQgbWF5IG5vdCBoYXZlIGEgbU5vcm1hbFNpbmsuCisgICAgICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCB0aW1lc3RhbXA7IC8vIHVzZSBwcml2YXRlIGNvcHkgdG8gZmV0Y2gKKyAgICAgICAgICAgIGlmIChtU3RhbmRieSkgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRocmVhZGxvb3BfZ2V0SGFsVGltZXN0YW1wX2woJnRpbWVzdGFtcCkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuYWRkKHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKKworICAgICAgICAgICAgICAgIGlmIChpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0JFRk9SRTogJWQgJWxsZCAlbGxkIiwgaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSk7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gY29ycmVjdGVkVGltZXN0YW1wID0gbVRpbWVzdGFtcFZlcmlmaWVyLmdldExhc3RDb3JyZWN0ZWRUaW1lc3RhbXAoKTsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY29ycmVjdGVkVGltZXN0YW1wLm1GcmFtZXM7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjb3JyZWN0ZWRUaW1lc3RhbXAubVRpbWVOczsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0FGVEVSOiAlZCAlbGxkICVsbGQiLCBpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBEb3duc3RyZWFtIGxhdGVuY3kgb25seSBhZGRlZCBpZiB0aW1lc3RhbXAgY29ycmVjdGlvbiBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICBpZiAobURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE4oKSA+IDApIHsgLy8gd2UgaGF2ZSBsYXRlbmN5IGluZm8uCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IG5ld1Bvc2l0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGludDY0X3QobURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE1lYW4oKSAqIG1TYW1wbGVSYXRlICogMWUtMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IHJldHJvZ3JhZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSBtYXgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1TdXNwZW5kZWRGcmFtZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIC8vIFdlIGFsd2F5cyBmZXRjaCB0aGUgdGltZXN0YW1wIGhlcmUgYmVjYXVzZSBvZnRlbiB0aGUgZG93bnN0cmVhbQogICAgICAgICAgICAgICAgIC8vIHNpbmsgd2lsbCBibG9jayB3aGlsZSB3cml0aW5nLgotICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wIHRpbWVzdGFtcDsgLy8gdXNlIHByaXZhdGUgY29weSB0byBmZXRjaAotICAgICAgICAgICAgICAgICh2b2lkKSBtTm9ybWFsU2luay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7CiAKICAgICAgICAgICAgICAgICAvLyBXZSBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHZhbGlkIGtlcm5lbCBwb3NpdGlvbiBpbiBjYXNlIHdlIGFyZSBpbiB1bmRlcnJ1bgogICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgbm9ybWFsIG1peGVyIHBlcmlvZCBpcyB0aGUgc2FtZSBhcyB0aGUgZmFzdCBtaXhlciBwZXJpb2QsIG9yIHRoZXJlCkBAIC0zMjI4LDcgKzMzOTgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgbVN1c3BlbmRlZEZyYW1lczsgLy8gYWRkIGZyYW1lcyBkaXNjYXJkZWQgd2hlbiBzdXNwZW5kZWQKICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQogICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5lcnJvcigpOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBtRnJhbWVzV3JpdHRlbiBmb3Igbm9uLW9mZmxvYWRlZCB0cmFja3MgYXJlIGNvbnRpZ3VvdXMKICAgICAgICAgICAgIC8vIGV2ZW4gYWZ0ZXIgc3RhbmRieSgpIGlzIGNhbGxlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIHRoZSB0cmFjayBmcmFtZQogICAgICAgICAgICAgLy8gdG8gc2luayBmcmFtZSBtYXBwaW5nLgpAQCAtMzI0NCwxMSArMzQxNywxMSBAQAogICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIHRpbWUgYmVmb3JlIHdlIGNhbGxlZCB0aGUgSEFMIHdyaXRlIC0gaXQgaXMgYSBiaXQgbW9yZSBhY2N1cmF0ZQogICAgICAgICAgICAgICAgICAgICAvLyB0byB3aGVuIHRoZSBzZXJ2ZXIgbGFzdCByZWFkIGRhdGEgdGhhbiB0aGUgY3VycmVudCB0aW1lIGhlcmUuCiAgICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmVuJ3Qgd3JpdHRlbiBhbnl0aGluZywgbUxhc3RXcml0ZVRpbWUgd2lsbCBiZSAtMQorICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IHdyaXR0ZW4gYW55dGhpbmcsIG1MYXN0SW9CZWdpbk5zIHdpbGwgYmUgLTEKICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHdlIHVzZSBzeXN0ZW1UaW1lKCkuCiAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0gbUZyYW1lc1dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9IG1MYXN0V3JpdGVUaW1lID09IC0xCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzeXN0ZW1UaW1lKCkgOiBtTGFzdFdyaXRlVGltZTsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0gbUxhc3RJb0JlZ2luTnMgPT0gLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHN5c3RlbVRpbWUoKSA6IG1MYXN0SW9CZWdpbk5zOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3A8VHJhY2s+ICZ0IDogbUFjdGl2ZVRyYWNrcykgewpAQCAtMzI1NiwxMCArMzQyOSwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdC0+dXBkYXRlVHJhY2tGcmFtZUluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlbGVhc2VkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhtRm9ybWF0KSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSBtVGltZXN0YW1wLmdldE91dHB1dFNlcnZlckxhdGVuY3lNcyhtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgaWYgKGxhdGVuY3lNcyAhPSAwLikgeyAvLyBub3RlIDAuIG1lYW5zIHRpbWVzdGFtcCBpcyBlbXB0eS4KKyAgICAgICAgICAgICAgICAgICAgbUxhdGVuY3lNcy5hZGQobGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gLy8gaWYgKG1UeXBlIC4uLiApIHsgLy8gbm8gaW5kZW50YXRpb24KICNpZiAwCiAgICAgICAgICAgICAvLyBsb2dGb3JtYXQgZXhhbXBsZQogICAgICAgICAgICAgaWYgKHogJSAxMDAgPT0gMCkgewpAQCAtMzMwMCw3ICszNDgzLDcgQEAKIAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCghbUFjdGl2ZVRyYWNrcy5zaXplKCkgJiYgc3lzdGVtVGltZSgpID4gbVN0YW5kYnlUaW1lTnMpIHx8CisgICAgICAgICAgICBpZiAoKG1BY3RpdmVUcmFja3MuaXNFbXB0eSgpICYmIHN5c3RlbVRpbWUoKSA+IG1TdGFuZGJ5VGltZU5zKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N1c3BlbmRlZCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gcHV0IGF1ZGlvIGhhcmR3YXJlIGludG8gc3RhbmRieSBhZnRlciBzaG9ydCBkZWxheQogICAgICAgICAgICAgICAgIGlmIChzaG91bGRTdGFuZGJ5X2woKSkgewpAQCAtMzMxMiw5ICszNDk1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBMT0dfQVVESU9fU1RBVEUoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHNlbmRTdGF0aXN0aWNzKGZhbHNlIC8qIGZvcmNlICovKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoIW1BY3RpdmVUcmFja3Muc2l6ZSgpICYmIG1Db25maWdFdmVudHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFja3MuaXNFbXB0eSgpICYmIG1Db25maWdFdmVudHMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGFib3V0IHRvIHdhaXQsIGZsdXNoIHRoZSBiaW5kZXIgY29tbWFuZCBidWZmZXIKICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogCkBAIC0zMzk0LDggKzM1NzgsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qbGltaXQqLyk7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgaWYgKCFoYXNGYXN0TWl4ZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBCYWxhbmNlIG11c3QgdGFrZSBlZmZlY3QgYWZ0ZXIgbW9ubyBjb252ZXJzaW9uLgorICAgICAgICAgICAgICAgICAgICAvLyBXZSBkbyBpdCBoZXJlIGlmIHRoZXJlIGlzIG5vIEZhc3RNaXhlci4KKyAgICAgICAgICAgICAgICAgICAgLy8gbUJhbGFuY2UgZGV0ZWN0cyB6ZXJvIGJhbGFuY2Ugd2l0aGluIHRoZSBjbGFzcyBmb3Igc3BlZWQgKG5vdCBuZWVkZWQgaGVyZSkuCisgICAgICAgICAgICAgICAgICAgIG1CYWxhbmNlLnNldEJhbGFuY2UobU1hc3RlckJhbGFuY2UubG9hZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbUJhbGFuY2UucHJvY2VzcygoZmxvYXQgKiltTWl4ZXJCdWZmZXIsIG1Ob3JtYWxGcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGJ1ZmZlciwgZm9ybWF0LCBtTWl4ZXJCdWZmZXIsIG1NaXhlckJ1ZmZlckZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCAqIChtQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCkpOworCisgICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgZ29pbmcgZGlyZWN0bHkgdG8gdGhlIHNpbmsgYW5kIHRoZXJlIGFyZSBoYXB0aWMgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGFkanVzdCBjaGFubmVscyBhcyB0aGUgc2FtcGxlIGRhdGEgaXMgcGFydGlhbGx5IGludGVybGVhdmVkCisgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgIGlmICghbUVmZmVjdEJ1ZmZlclZhbGlkICYmIG1IYXB0aWNDaGFubmVsQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUoYnVmZmVyLCBtQ2hhbm5lbENvdW50LCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShtQ2hhbm5lbENvdW50LCBmb3JtYXQpICogbU5vcm1hbEZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nID0gbUN1cnJlbnRXcml0ZUxlbmd0aDsKQEAgLTM0MzgsOCArMzY0MCwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmxpbWl0Ki8pOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoIWhhc0Zhc3RNaXhlcigpKSB7CisgICAgICAgICAgICAgICAgLy8gQmFsYW5jZSBtdXN0IHRha2UgZWZmZWN0IGFmdGVyIG1vbm8gY29udmVyc2lvbi4KKyAgICAgICAgICAgICAgICAvLyBXZSBkbyBpdCBoZXJlIGlmIHRoZXJlIGlzIG5vIEZhc3RNaXhlci4KKyAgICAgICAgICAgICAgICAvLyBtQmFsYW5jZSBkZXRlY3RzIHplcm8gYmFsYW5jZSB3aXRoaW4gdGhlIGNsYXNzIGZvciBzcGVlZCAobm90IG5lZWRlZCBoZXJlKS4KKyAgICAgICAgICAgICAgICBtQmFsYW5jZS5zZXRCYWxhbmNlKG1NYXN0ZXJCYWxhbmNlLmxvYWQoKSk7CisgICAgICAgICAgICAgICAgbUJhbGFuY2UucHJvY2VzcygoZmxvYXQgKiltRWZmZWN0QnVmZmVyLCBtTm9ybWFsRnJhbWVDb3VudCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQobVNpbmtCdWZmZXIsIG1Gb3JtYXQsIG1FZmZlY3RCdWZmZXIsIG1FZmZlY3RCdWZmZXJGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogKG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50KSk7CisgICAgICAgICAgICAvLyBUaGUgc2FtcGxlIGRhdGEgaXMgcGFydGlhbGx5IGludGVybGVhdmVkIHdoZW4gaGFwdGljIGNoYW5uZWxzIGV4aXN0LAorICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBhZGp1c3QgY2hhbm5lbHMgaGVyZS4KKyAgICAgICAgICAgIGlmIChtSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUobVNpbmtCdWZmZXIsIG1DaGFubmVsQ291bnQsIG1TaW5rQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1Gb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1DaGFubmVsQ291bnQsIG1Gb3JtYXQpICogbU5vcm1hbEZyYW1lQ291bnQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gZW5hYmxlIGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluCkBAIC0zNDQ5LDQzICszNjY3LDY4IEBACiAgICAgICAgICAgICAvLyBtU2xlZXBUaW1lVXMgPT0gMCBtZWFucyB3ZSBtdXN0IHdyaXRlIHRvIGF1ZGlvIGhhcmR3YXJlCiAgICAgICAgICAgICBpZiAobVNsZWVwVGltZVVzID09IDApIHsKICAgICAgICAgICAgICAgICBzc2l6ZV90IHJldCA9IDA7Ci0gICAgICAgICAgICAgICAgLy8gV2Ugc2F2ZSBsYXN0V3JpdGVGaW5pc2hlZCBoZXJlLCBhcyBwcmV2aW91c0xhc3RXcml0ZUZpbmlzaGVkLAotICAgICAgICAgICAgICAgIC8vIGZvciB0aHJvdHRsaW5nLiBPbiB0aHJlYWQgc3RhcnQsIHByZXZpb3VzTGFzdFdyaXRlRmluaXNoZWQgd2lsbCBiZQotICAgICAgICAgICAgICAgIC8vIHNldCB0byAtMSwgd2hpY2ggcHJvcGVybHkgcmVzdWx0cyBpbiBubyB0aHJvdHRsaW5nIGFmdGVyIHRoZSBmaXJzdCB3cml0ZS4KLSAgICAgICAgICAgICAgICBuc2Vjc190IHByZXZpb3VzTGFzdFdyaXRlRmluaXNoZWQgPSBsYXN0V3JpdGVGaW5pc2hlZDsKLSAgICAgICAgICAgICAgICBuc2Vjc190IGRlbHRhID0gMDsKKyAgICAgICAgICAgICAgICAvLyB3cml0ZVBlcmlvZE5zIGlzIHVwZGF0ZWQgPj0gMCB3aGVuIHJldCA+IDAuCisgICAgICAgICAgICAgICAgaW50NjRfdCB3cml0ZVBlcmlvZE5zID0gLTE7CiAgICAgICAgICAgICAgICAgaWYgKG1CeXRlc1JlbWFpbmluZykgewogICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSByZXdyaXRlIHRvIHJlZHVjZSBudW1iZXIgb2Ygc3lzdGVtIGNhbGxzCi0gICAgICAgICAgICAgICAgICAgIG1MYXN0V3JpdGVUaW1lID0gc3lzdGVtVGltZSgpOyAgLy8gYWxzbyB1c2VkIGZvciBkdW1wc3lzCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbGFzdElvQmVnaW5OcyA9IHN5c3RlbVRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgcmV0ID0gdGhyZWFkTG9vcF93cml0ZSgpOwotICAgICAgICAgICAgICAgICAgICBsYXN0V3JpdGVGaW5pc2hlZCA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBsYXN0V3JpdGVGaW5pc2hlZCAtIG1MYXN0V3JpdGVUaW1lOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGxhc3RJb0VuZE5zID0gc3lzdGVtVGltZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuICs9IHJldDsKICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1JlbWFpbmluZyAtPSByZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbiArPSByZXQgLyBtRnJhbWVTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBmcmFtZXMgPSByZXQgLyBtRnJhbWVTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW4gKz0gZnJhbWVzOworCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVBlcmlvZE5zID0gbGFzdElvRW5kTnMgLSBtTGFzdElvRW5kTnM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGluZm9ybWF0aW9uIHJlbGF0aW5nIHRvIHdyaXRlIHRpbWUuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9faGFzX3Byb3BvcnRpb25hbF9mcmFtZXMobUZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgaW4gYSBjb250aW51b3VzIG1peGluZyBjeWNsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX1JFQURZICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wQ291bnQgPT0gbGFzdExvb3BDb3VudFdyaXR0ZW4gKyAxKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIGppdHRlck1zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lc3RhbXBWZXJpZmllcjxpbnQ2NF90LCBpbnQ2NF90Pjo6Y29tcHV0ZUppdHRlck1zKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyYW1lcywgd3JpdGVQZXJpb2ROc30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMH0gLyogbGFzdFRpbWVzdGFtcCAqLywgbVNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgcHJvY2Vzc01zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYXN0SW9CZWdpbk5zIC0gbUxhc3RJb0VuZE5zKSAqIDFlLTY7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlvSml0dGVyTXMuYWRkKGppdHRlck1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByb2Nlc3NUaW1lTXMuYWRkKHByb2Nlc3NNcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgYmxvY2tlZCBkZXRlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGRlbHRhV3JpdGVOcyA9IGxhc3RJb0VuZE5zIC0gbGFzdElvQmVnaW5OczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVR5cGUgPT0gTUlYRVIgJiYgZGVsdGFXcml0ZU5zID4gbWF4UGVyaW9kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1EZWxheWVkV3JpdGVzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGFzdElvRW5kTnMgLSBsYXN0V2FybmluZykgPiBrV2FybmluZ1Rocm90dGxlTnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJ1bmRlcnJ1biIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIndyaXRlIGJsb2NrZWQgZm9yICVsbGQgbXNlY3MsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkIGRlbGF5ZWQgd3JpdGVzLCB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWRlbHRhV3JpdGVOcyAvIE5BTk9TX1BFUl9NSUxMSVNFQ09ORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bURlbGF5ZWRXcml0ZXMsIG1JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0V2FybmluZyA9IGxhc3RJb0VuZE5zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRpbWluZyBpbmZvLgorICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RJb0JlZ2luTnMgPSBsYXN0SW9CZWdpbk5zOworICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RJb0VuZE5zID0gbGFzdElvRW5kTnM7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TG9vcENvdW50V3JpdHRlbiA9IGxvb3BDb3VudDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9EUkFJTl9UUkFDSykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfRFJBSU5fQUxMKSkgewogICAgICAgICAgICAgICAgICAgICB0aHJlYWRMb29wX2RyYWluKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChtVHlwZSA9PSBNSVhFUiAmJiAhbVN0YW5kYnkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgYmxvY2tlZCBkZXRlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhID4gbWF4UGVyaW9kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTnVtRGVsYXllZFdyaXRlcysrOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsYXN0V3JpdGVGaW5pc2hlZCAtIGxhc3RXYXJuaW5nKSA+IGtXYXJuaW5nVGhyb3R0bGVOcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJ1bmRlcnJ1biIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJ3cml0ZSBibG9ja2VkIGZvciAlbGx1IG1zZWNzLCAlZCBkZWxheWVkIHdyaXRlcywgdGhyZWFkICVwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG5zMm1zKGRlbHRhKSwgbU51bURlbGF5ZWRXcml0ZXMsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RXYXJuaW5nID0gbGFzdFdyaXRlRmluaXNoZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZiAobVRocmVhZFRocm90dGxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19SRUFEWSAvLyB3ZSBhcmUgbWl4aW5nIChhY3RpdmUgdHJhY2tzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHJldCA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd3JvdGUgc29tZXRoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgd3JpdGVQZXJpb2ROcyA+IDApIHsgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHdyaXRlIHBlcmlvZCBpbmZvCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMaW1pdCBNaXhlclRocmVhZCBkYXRhIHByb2Nlc3NpbmcgdG8gbm8gbW9yZSB0aGFuIHR3aWNlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQgcHJvY2Vzc2luZyByYXRlLgogICAgICAgICAgICAgICAgICAgICAgICAgLy8KQEAgLTM1MDQsMTIgKzM3NDcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gdGhyZWFkTG9vcF9taXggKHNpZ25pZmljYW50IGZvciBoZWF2eSBtaXhpbmcsIGVzcGVjaWFsbHkKICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBvbiBsb3cgdGllciBwcm9jZXNzb3JzKQogCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIE9LIGlmIGRlbHRhTXMgKGFuZCBkZWx0YU5zKSBpcyBhbiBvdmVyZXN0aW1hdGUuCi0gICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IGRlbHRhTnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWx0YU5zID0gbGFzdFdyaXRlRmluaXNoZWQgLSBwcmV2aW91c0xhc3RXcml0ZUZpbmlzaGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0V3JpdGVGaW5pc2hlZCxwcmV2aW91c0xhc3RXcml0ZUZpbmlzaGVkLCAmZGVsdGFOcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGRlbHRhTXMgPSBkZWx0YU5zIC8gMTAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0J3MgT0sgaWYgZGVsdGFNcyBpcyBhbiBvdmVyZXN0aW1hdGUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZGVsdGFNcyA9IHdyaXRlUGVyaW9kTnMgLyBOQU5PU19QRVJfTUlMTElTRUNPTkQ7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdGhyb3R0bGVNcyA9IChpbnQzMl90KW1IYWxmQnVmZmVyTXMgLSBkZWx0YU1zOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzaWduZWQpbUhhbGZCdWZmZXJNcyA+PSB0aHJvdHRsZU1zICYmIHRocm90dGxlTXMgPiAwKSB7CkBAIC0zNTIyLDcgKzM3NjIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRUaHJvdHRsZVRpbWVNcyArPSB0aHJvdHRsZU1zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRocm90dGxlIG11c3QgYmUgYXR0cmlidXRlZCB0byB0aGUgcHJldmlvdXMgbWl4ZXIgbG9vcCdzIHdyaXRlIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhbGxvdyBiYWNrLXRvLWJhY2sgdGhyb3R0bGluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0V3JpdGVGaW5pc2hlZCArPSB0aHJvdHRsZU1zICogMTAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGFsc28gZW5zdXJlcyBwcm9wZXIgdGltaW5nIHN0YXRpc3RpY3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RJb0VuZE5zID0gc3lzdGVtVGltZSgpOyAgLy8gd2UgZmV0Y2ggdGhlIHdyaXRlIGVuZCB0aW1lIGFnYWluLgogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkaWZmID0gbVRocmVhZFRocm90dGxlVGltZU1zIC0gbVRocmVhZFRocm90dGxlRW5kTXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPiAwKSB7CkBAIC0zNjA1LDI0ICszODQ2LDM2IEBACiAvLyByZW1vdmVUcmFja3NfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZW1vdmVUcmFja3NfbChjb25zdCBWZWN0b3I8IHNwPFRyYWNrPiA+JiB0cmFja3NUb1JlbW92ZSkKIHsKLSAgICBzaXplX3QgY291bnQgPSB0cmFja3NUb1JlbW92ZS5zaXplKCk7Ci0gICAgaWYgKGNvdW50ID4gMCkgewotICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxUcmFjaz4mIHRyYWNrID0gdHJhY2tzVG9SZW1vdmUuaXRlbUF0KGkpOwotICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUodHJhY2spOwotICAgICAgICAgICAgQUxPR1YoInJlbW92ZVRyYWNrc19sIHJlbW92aW5nIHRyYWNrIG9uIHNlc3Npb24gJWQiLCB0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgaWYgKGNoYWluICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigic3RvcHBpbmcgdHJhY2sgb24gY2hhaW4gJXAgZm9yIHNlc3Npb24gSWQ6ICVkIiwgY2hhaW4uZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgICAgIGNoYWluLT5kZWNBY3RpdmVUcmFja0NudCgpOwotICAgICAgICAgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgdHJhY2sgOiB0cmFja3NUb1JlbW92ZSkgeworICAgICAgICBtQWN0aXZlVHJhY2tzLnJlbW92ZSh0cmFjayk7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IHJlbW92aW5nIHRyYWNrIG9uIHNlc3Npb24gJWQiLCBfX2Z1bmNfXywgdHJhY2stPmlkKCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2wodHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgaWYgKGNoYWluICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHN0b3BwaW5nIHRyYWNrIG9uIGNoYWluICVwIGZvciBzZXNzaW9uIElkOiAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB0cmFjay0+aWQoKSwgY2hhaW4uZ2V0KCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICBjaGFpbi0+ZGVjQWN0aXZlVHJhY2tDbnQoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiBhbiBleHRlcm5hbCBjbGllbnQgdHJhY2ssIGluZm9ybSBBUE0gd2UncmUgbm8gbG9uZ2VyIGFjdGl2ZSwgYW5kIHJlbW92ZSBpZiBuZWVkZWQuCisgICAgICAgIC8vIFdlIGRvIHRoaXMgdW5kZXIgbG9jayBzbyB0aGF0IHRoZSBzdGF0ZSBpcyBjb25zaXN0ZW50IGlmIHRoZSBUcmFjayBpcyBkZXN0cm95ZWQuCisgICAgICAgIGlmICh0cmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRyYWNrLT5wb3J0SWQoKSk7CiAgICAgICAgICAgICBpZiAodHJhY2stPmlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlVHJhY2tfbCh0cmFjayk7CisgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBpZiAodHJhY2stPmlzVGVybWluYXRlZCgpKSB7CisgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBvdXIgdHJhY2tzIHZlY3RvcgorICAgICAgICAgICAgcmVtb3ZlVHJhY2tfbCh0cmFjayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh0cmFjay0+Y2hhbm5lbE1hc2soKSAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgIT0gQVVESU9fQ0hBTk5FTF9OT05FCisgICAgICAgICAgICAgICAgJiYgbUhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgLy8gVW5sb2NrIGR1ZSB0byBWaWJyYXRvclNlcnZpY2Ugd2lsbCBsb2NrIGZvciB0aGlzIGNhbGwgYW5kIHdpbGwKKyAgICAgICAgICAgIC8vIGNhbGwgVHJhY2tzLm11dGUvdW5tdXRlIHdoaWNoIGFsc28gcmVxdWlyZSB0aHJlYWQncyBsb2NrLgorICAgICAgICAgICAgQXVkaW9GbGluZ2VyOjpvbkV4dGVybmFsVmlicmF0aW9uU3RvcCh0cmFjay0+Z2V0RXh0ZXJuYWxWaWJyYXRpb24oKSk7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIH0KICAgICB9Ci0KIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0VGltZXN0YW1wX2woQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkKQEAgLTM2MzksNiArMzg5MiwxNSBAQAogICAgICAgICB1aW50NjRfdCBwb3NpdGlvbjY0OwogICAgICAgICBpZiAobU91dHB1dC0+Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24oJnBvc2l0aW9uNjQsICZ0aW1lc3RhbXAubVRpbWUpID09IE9LKSB7CiAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gKHVpbnQzMl90KXBvc2l0aW9uNjQ7CisgICAgICAgICAgICBpZiAobURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE4oKSA+IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBwb3NpdGlvbk9mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkobURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE1lYW4oKSAqIG1TYW1wbGVSYXRlICogMWUtMyk7CisgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uT2Zmc2V0ID4gdGltZXN0YW1wLm1Qb3NpdGlvbikgeworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uIC09IHBvc2l0aW9uT2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogICAgIH0KQEAgLTM2NzEsNiArMzkzMyw3IEBACiAgICAgICAgIHR5cGUgfD0gcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZTsKICAgICB9CiAKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNpbmtQb3J0SWQgPSBwYXRjaC0+c2lua3NbMF0uaWQ7CiAjaWZkZWYgQUREX0JBVFRFUllfREFUQQogICAgIC8vIHdoZW4gY2hhbmdpbmcgdGhlIGF1ZGlvIG91dHB1dCBkZXZpY2UsIGNhbGwgYWRkQmF0dGVyeURhdGEgdG8gbm90aWZ5CiAgICAgLy8gdGhlIGNoYW5nZQpAQCAtMzcwMCw3ICszOTYzLDcgQEAKIAogICAgIC8vIG1QcmV2T3V0RGV2aWNlIGlzIHRoZSBsYXRlc3QgZGV2aWNlIHNldCBieSBjcmVhdGVBdWRpb1BhdGNoX2woKS4gSXQgaXMgbm90IHNldCB3aGVuCiAgICAgLy8gdGhlIHRocmVhZCBpcyBjcmVhdGVkIHNvIHRoYXQgdGhlIGZpcnN0IHBhdGNoIGNyZWF0aW9uIHRyaWdnZXJzIGFuIGlvQ29uZmlnQ2hhbmdlZCBjYWxsYmFjawotICAgIGJvb2wgY29uZmlnQ2hhbmdlZCA9IG1QcmV2T3V0RGV2aWNlICE9IHR5cGU7CisgICAgYm9vbCBjb25maWdDaGFuZ2VkID0gKG1QcmV2T3V0RGV2aWNlICE9IHR5cGUpIHx8IChtRGV2aWNlSWQgIT0gc2lua1BvcnRJZCk7CiAgICAgbU91dERldmljZSA9IHR5cGU7CiAgICAgbVBhdGNoID0gKnBhdGNoOwogCkBAIC0zNzI5LDYgKzM5OTIsNyBAQAogICAgIH0KICAgICBpZiAoY29uZmlnQ2hhbmdlZCkgewogICAgICAgICBtUHJldk91dERldmljZSA9IHR5cGU7CisgICAgICAgIG1EZXZpY2VJZCA9IHNpbmtQb3J0SWQ7CiAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTM3NzcsMTIgKzQwNDEsMTYgQEAKICAgICBkZXN0cm95VHJhY2tfbCh0cmFjayk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKIHsKLSAgICBUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBUaHJlYWRCYXNlOjp0b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOwogICAgIGNvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CiAgICAgY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZSA9IG1PdXRwdXQtPmF1ZGlvSHdEZXYtPmhhbmRsZSgpOwogICAgIGNvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworICAgIGlmIChtT3V0cHV0ICYmIG1PdXRwdXQtPmZsYWdzICE9IEFVRElPX09VVFBVVF9GTEFHX05PTkUpIHsKKyAgICAgICAgY29uZmlnLT5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICAgICAgY29uZmlnLT5mbGFncy5vdXRwdXQgPSBtT3V0cHV0LT5mbGFnczsKKyAgICB9CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM3OTgsNiArNDA2Niw3IEBACiAgICAgICAgIC8vIG1QaXBlU2luayBiZWxvdwogICAgICAgICAvLyBtTm9ybWFsU2luayBiZWxvdwogeworICAgIHNldE1hc3RlckJhbGFuY2UoYXVkaW9GbGluZ2VyLT5nZXRNYXN0ZXJCYWxhbmNlX2woKSk7CiAgICAgQUxPR1YoIk1peGVyVGhyZWFkKCkgaWQ9JWQgZGV2aWNlPSUjeCB0eXBlPSVkIiwgaWQsIGRldmljZSwgdHlwZSk7CiAgICAgQUxPR1YoIm1TYW1wbGVSYXRlPSV1LCBtQ2hhbm5lbE1hc2s9JSN4LCBtQ2hhbm5lbENvdW50PSV1LCBtRm9ybWF0PSUjeCwgbUZyYW1lU2l6ZT0lenUsICIKICAgICAgICAgICAgICJtRnJhbWVDb3VudD0lenUsIG1Ob3JtYWxGcmFtZUNvdW50PSV6dSIsCkBAIC0zODE0LDcgKzQwODMsOCBAQAogICAgIC8vIGNyZWF0ZSBhbiBOQkFJTyBzaW5rIGZvciB0aGUgSEFMIG91dHB1dCBzdHJlYW0sIGFuZCBuZWdvdGlhdGUKICAgICBtT3V0cHV0U2luayA9IG5ldyBBdWRpb1N0cmVhbU91dFNpbmsob3V0cHV0LT5zdHJlYW0pOwogICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge0Zvcm1hdF9mcm9tX1NSX0MobVNhbXBsZVJhdGUsIG1DaGFubmVsQ291bnQsIG1Gb3JtYXQpfTsKKyAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge0Zvcm1hdF9mcm9tX1NSX0MoCisgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQsIG1Gb3JtYXQpfTsKICNpZiAhTE9HX05ERUJVRwogICAgIHNzaXplX3QgaW5kZXggPQogI2Vsc2UKQEAgLTM4NTYsMTYgKzQxMjYsMTQgQEAKICAgICAgICAgICAgIC8vIGNoYW5nZSBvdXIgU2luayBmb3JtYXQgdG8gYWNjZXB0IG91ciBpbnRlcm1lZGlhdGUgcHJlY2lzaW9uCiAgICAgICAgICAgICBtRm9ybWF0ID0gZmFzdE1peGVyRm9ybWF0OwogICAgICAgICAgICAgZnJlZShtU2lua0J1ZmZlcik7Ci0gICAgICAgICAgICBtRnJhbWVTaXplID0gbUNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdCk7CisgICAgICAgICAgICBtRnJhbWVTaXplID0gYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50LCBtRm9ybWF0KTsKICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaW5rQnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUZyYW1lU2l6ZTsKICAgICAgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtU2lua0J1ZmZlciwgMzIsIHNpbmtCdWZmZXJTaXplKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGNyZWF0ZSBhIE1vbm9QaXBlIHRvIGNvbm5lY3Qgb3VyIHN1Ym1peCB0byBGYXN0TWl4ZXIKICAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IG1PdXRwdXRTaW5rLT5mb3JtYXQoKTsKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICBOQkFJT19Gb3JtYXQgb3JpZ2Zvcm1hdCA9IGZvcm1hdDsKLSNlbmRpZgorCiAgICAgICAgIC8vIGFkanVzdCBmb3JtYXQgdG8gbWF0Y2ggdGhhdCBvZiB0aGUgRmFzdCBNaXhlcgogICAgICAgICBBTE9HVigiZm9ybWF0IGNoYW5nZWQgZnJvbSAlI3ggdG8gJSN4IiwgZm9ybWF0Lm1Gb3JtYXQsIGZhc3RNaXhlckZvcm1hdCk7CiAgICAgICAgIGZvcm1hdC5tRm9ybWF0ID0gZmFzdE1peGVyRm9ybWF0OwpAQCAtMzg3Nyw3ICs0MTQ1LDcgQEAKICAgICAgICAgTW9ub1BpcGUgKm1vbm9QaXBlID0gbmV3IE1vbm9QaXBlKG1Ob3JtYWxGcmFtZUNvdW50ICogNCwgZm9ybWF0LCB0cnVlIC8qd3JpdGVDYW5CbG9jayovKTsKICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtmb3JtYXR9OwogICAgICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0jaWYgIUxPR19OREVCVUcgfHwgZGVmaW5lZChURUVfU0lOSykKKyNpZiAhTE9HX05ERUJVRwogICAgICAgICBzc2l6ZV90IGluZGV4ID0KICNlbHNlCiAgICAgICAgICh2b2lkKQpAQCAtMzg4OCwyNSArNDE1Niw4IEBACiAgICAgICAgICAgICAgICAgKG1vbm9QaXBlLT5tYXhGcmFtZXMoKSAqIDcpIC8gOCA6IG1Ob3JtYWxGcmFtZUNvdW50ICogMik7CiAgICAgICAgIG1QaXBlU2luayA9IG1vbm9QaXBlOwogCi0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgaWYgKG1UZWVTaW5rT3V0cHV0RW5hYmxlZCkgewotICAgICAgICAgICAgLy8gY3JlYXRlIGEgUGlwZSB0byBhcmNoaXZlIGEgY29weSBvZiBGYXN0TWl4ZXIncyBvdXRwdXQgZm9yIGR1bXBzeXMKLSAgICAgICAgICAgIFBpcGUgKnRlZVNpbmsgPSBuZXcgUGlwZShtVGVlU2lua091dHB1dEZyYW1lcywgb3JpZ2Zvcm1hdCk7Ci0gICAgICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzMlsxXSA9IHtvcmlnZm9ybWF0fTsKLSAgICAgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgaW5kZXggPSB0ZWVTaW5rLT5uZWdvdGlhdGUob2ZmZXJzMiwgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICAgICAgICAgIG1UZWVTaW5rID0gdGVlU2luazsKLSAgICAgICAgICAgIFBpcGVSZWFkZXIgKnRlZVNvdXJjZSA9IG5ldyBQaXBlUmVhZGVyKCp0ZWVTaW5rKTsKLSAgICAgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgaW5kZXggPSB0ZWVTb3VyY2UtPm5lZ290aWF0ZShvZmZlcnMyLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgICAgICAgICAgbVRlZVNvdXJjZSA9IHRlZVNvdXJjZTsKLSAgICAgICAgfQotI2VuZGlmCi0KICAgICAgICAgLy8gY3JlYXRlIGZhc3QgbWl4ZXIgYW5kIGNvbmZpZ3VyZSBpdCBpbml0aWFsbHkgd2l0aCBqdXN0IG9uZSBmYXN0IHRyYWNrIGZvciBvdXIgc3VibWl4Ci0gICAgICAgIG1GYXN0TWl4ZXIgPSBuZXcgRmFzdE1peGVyKCk7CisgICAgICAgIG1GYXN0TWl4ZXIgPSBuZXcgRmFzdE1peGVyKG1JZCk7CiAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgKnNxID0gbUZhc3RNaXhlci0+c3EoKTsKICNpZmRlZiBTVEFURV9RVUVVRV9EVU1QCiAgICAgICAgIHNxLT5zZXRPYnNlcnZlckR1bXAoJm1TdGF0ZVF1ZXVlT2JzZXJ2ZXJEdW1wKTsKQEAgLTM5MTcsOCArNDE2OCwxMCBAQAogICAgICAgICAvLyB3cmFwIHRoZSBzb3VyY2Ugc2lkZSBvZiB0aGUgTW9ub1BpcGUgdG8gbWFrZSBpdCBhbiBBdWRpb0J1ZmZlclByb3ZpZGVyCiAgICAgICAgIGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyID0gbmV3IFNvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIobmV3IE1vbm9QaXBlUmVhZGVyKG1vbm9QaXBlKSk7CiAgICAgICAgIGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID0gTlVMTDsKLSAgICAgICAgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2s7IC8vIG1QaXBlU2luayBjaGFubmVsIG1hc2sgZm9yIGF1ZGlvIHRvIEZhc3RNaXhlcgorICAgICAgICBmYXN0VHJhY2stPm1DaGFubmVsTWFzayA9IG1DaGFubmVsTWFzayB8IG1IYXB0aWNDaGFubmVsTWFzazsgLy8gbVBpcGVTaW5rIGNoYW5uZWwgbWFzayBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF1ZGlvIHRvIEZhc3RNaXhlcgogICAgICAgICBmYXN0VHJhY2stPm1Gb3JtYXQgPSBtRm9ybWF0OyAvLyBtUGlwZVNpbmsgZm9ybWF0IGZvciBhdWRpbyB0byBGYXN0TWl4ZXIKKyAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gbUhhcHRpY0NoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfTk9ORTsKICAgICAgICAgZmFzdFRyYWNrLT5tR2VuZXJhdGlvbisrOwogICAgICAgICBzdGF0ZS0+bUZhc3RUcmFja3NHZW4rKzsKICAgICAgICAgc3RhdGUtPm1UcmFja01hc2sgPSAxOwpAQCAtMzkyNiwyNCArNDE3OSwzMCBAQAogICAgICAgICBzdGF0ZS0+bU91dHB1dFNpbmsgPSBtT3V0cHV0U2luay5nZXQoKTsKICAgICAgICAgc3RhdGUtPm1PdXRwdXRTaW5rR2VuKys7CiAgICAgICAgIHN0YXRlLT5tRnJhbWVDb3VudCA9IG1GcmFtZUNvdW50OworICAgICAgICAvLyBzcGVjaWZ5IHNpbmsgY2hhbm5lbCBtYXNrIHdoZW4gaGFwdGljIGNoYW5uZWwgbWFzayBwcmVzZW50IGFzIGl0IGNhbiBub3QKKyAgICAgICAgLy8gYmUgY2FsY3VsYXRlZCBkaXJlY3RseSBmcm9tIGNoYW5uZWwgY291bnQKKyAgICAgICAgc3RhdGUtPm1TaW5rQ2hhbm5lbE1hc2sgPSBtSGFwdGljQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9OT05FCisgICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX05PTkUgOiBtQ2hhbm5lbE1hc2sgfCBtSGFwdGljQ2hhbm5lbE1hc2s7CiAgICAgICAgIHN0YXRlLT5tQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpDT0xEX0lETEU7CiAgICAgICAgIC8vIGFscmVhZHkgZG9uZSBpbiBjb25zdHJ1Y3RvciBpbml0aWFsaXphdGlvbiBsaXN0CiAgICAgICAgIC8vbUZhc3RNaXhlckZ1dGV4ID0gMDsKICAgICAgICAgc3RhdGUtPm1Db2xkRnV0ZXhBZGRyID0gJm1GYXN0TWl4ZXJGdXRleDsKICAgICAgICAgc3RhdGUtPm1Db2xkR2VuKys7CiAgICAgICAgIHN0YXRlLT5tRHVtcFN0YXRlID0gJm1GYXN0TWl4ZXJEdW1wU3RhdGU7Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgc3RhdGUtPm1UZWVTaW5rID0gbVRlZVNpbmsuZ2V0KCk7Ci0jZW5kaWYKICAgICAgICAgbUZhc3RNaXhlck5CTG9nV3JpdGVyID0gYXVkaW9GbGluZ2VyLT5uZXdXcml0ZXJfbChrRmFzdE1peGVyTG9nU2l6ZSwgIkZhc3RNaXhlciIpOwogICAgICAgICBzdGF0ZS0+bU5CTG9nV3JpdGVyID0gbUZhc3RNaXhlck5CTG9nV3JpdGVyLmdldCgpOwogICAgICAgICBzcS0+ZW5kKCk7CiAgICAgICAgIHNxLT5wdXNoKEZhc3RNaXhlclN0YXRlUXVldWU6OkJMT0NLX1VOVElMX1BVU0hFRCk7CiAKKyAgICAgICAgTkJMb2c6OnRocmVhZF9pbmZvX3QgaW5mbzsKKyAgICAgICAgaW5mby5pZCA9IG1JZDsKKyAgICAgICAgaW5mby50eXBlID0gTkJMb2c6OkZBU1RNSVhFUjsKKyAgICAgICAgbUZhc3RNaXhlck5CTG9nV3JpdGVyLT5sb2c8TkJMb2c6OkVWRU5UX1RIUkVBRF9JTkZPPihpbmZvKTsKKwogICAgICAgICAvLyBzdGFydCB0aGUgZmFzdCBtaXhlcgogICAgICAgICBtRmFzdE1peGVyLT5ydW4oIkZhc3RNaXhlciIsIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiAgICAgICAgIHBpZF90IHRpZCA9IG1GYXN0TWl4ZXItPmdldFRpZCgpOwotICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZF9jYWNoZWQsIHRpZCwga1ByaW9yaXR5RmFzdE1peGVyLCBmYWxzZSAvKmZvckFwcCovKTsKKyAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWQoKSwgdGlkLCBrUHJpb3JpdHlGYXN0TWl4ZXIsIGZhbHNlIC8qZm9yQXBwKi8pOwogICAgICAgICBzdHJlYW0oKS0+c2V0SGFsVGhyZWFkUHJpb3JpdHkoa1ByaW9yaXR5RmFzdE1peGVyKTsKIAogI2lmZGVmIEFVRElPX1dBVENIRE9HCkBAIC0zOTUyLDkgKzQyMTEsMTQgQEAKICAgICAgICAgbUF1ZGlvV2F0Y2hkb2ctPnNldER1bXAoJm1BdWRpb1dhdGNoZG9nRHVtcCk7CiAgICAgICAgIG1BdWRpb1dhdGNoZG9nLT5ydW4oIkF1ZGlvV2F0Y2hkb2ciLCBQUklPUklUWV9VUkdFTlRfQVVESU8pOwogICAgICAgICB0aWQgPSBtQXVkaW9XYXRjaGRvZy0+Z2V0VGlkKCk7Ci0gICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkX2NhY2hlZCwgdGlkLCBrUHJpb3JpdHlGYXN0TWl4ZXIsIGZhbHNlIC8qZm9yQXBwKi8pOworICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZCgpLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlciwgZmFsc2UgLypmb3JBcHAqLyk7CiAjZW5kaWYKLQorICAgIH0gZWxzZSB7CisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgLy8gT25seSB1c2UgdGhlIE1peGVyVGhyZWFkIHRlZSBpZiB0aGVyZSBpcyBubyBGYXN0TWl4ZXIuCisgICAgICAgIG1UZWUuc2V0KG1PdXRwdXRTaW5rLT5mb3JtYXQoKSwgTkJBSU9fVGVlOjpURUVfRkxBR19PVVRQVVRfVEhSRUFEKTsKKyAgICAgICAgbVRlZS5zZXRJZChzdGQ6OnN0cmluZygiXyIpICsgc3RkOjp0b19zdHJpbmcobUlkKSArICJfTSIpOworI2VuZGlmCiAgICAgfQogCiAgICAgc3dpdGNoIChrVXNlRmFzdE1peGVyKSB7CkBAIC00MDE4LDEyICs0MjgyLDYgQEAKICAgICByZXR1cm4gbGF0ZW5jeTsKIH0KIAotCi12b2lkIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OnRocmVhZExvb3BfcmVtb3ZlVHJhY2tzKGNvbnN0IFZlY3Rvcjwgc3A8VHJhY2s+ID4mIHRyYWNrc1RvUmVtb3ZlKQotewotICAgIFBsYXliYWNrVGhyZWFkOjp0aHJlYWRMb29wX3JlbW92ZVRyYWNrcyh0cmFja3NUb1JlbW92ZSk7Ci19Ci0KIHNzaXplX3QgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6dGhyZWFkTG9vcF93cml0ZSgpCiB7CiAgICAgLy8gRklYTUUgd2Ugc2hvdWxkIG9ubHkgZG8gb25lIHB1c2ggcGVyIGN5Y2xlOyBjb25maXJtIHRoaXMgaXMgdHJ1ZQpAQCAtNDIyMiwxNCArNDQ4MCwxNCBAQAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6bWl4ZXJfc3RhdGUgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6cHJlcGFyZVRyYWNrc19sKAogICAgICAgICBWZWN0b3I8IHNwPFRyYWNrPiA+ICp0cmFja3NUb1JlbW92ZSkKIHsKLSAgICAvLyBjbGVhbiB1cCBkZWxldGVkIHRyYWNrIG5hbWVzIGluIEF1ZGlvTWl4ZXIgYmVmb3JlIGFsbG9jYXRpbmcgbmV3IHRyYWNrcwotICAgICh2b2lkKW1UcmFja3MucHJvY2Vzc0RlbGV0ZWRUcmFja05hbWVzKFt0aGlzXShpbnQgbmFtZSkgewotICAgICAgICAvLyBmb3IgZWFjaCBuYW1lLCBkZXN0cm95IGl0IGluIHRoZSBBdWRpb01peGVyCi0gICAgICAgIGlmIChtQXVkaW9NaXhlci0+ZXhpc3RzKG5hbWUpKSB7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+ZGVzdHJveShuYW1lKTsKKyAgICAvLyBjbGVhbiB1cCBkZWxldGVkIHRyYWNrIGlkcyBpbiBBdWRpb01peGVyIGJlZm9yZSBhbGxvY2F0aW5nIG5ldyB0cmFja3MKKyAgICAodm9pZCltVHJhY2tzLnByb2Nlc3NEZWxldGVkVHJhY2tJZHMoW3RoaXNdKGludCB0cmFja0lkKSB7CisgICAgICAgIC8vIGZvciBlYWNoIHRyYWNrSWQsIGRlc3Ryb3kgaXQgaW4gdGhlIEF1ZGlvTWl4ZXIKKyAgICAgICAgaWYgKG1BdWRpb01peGVyLT5leGlzdHModHJhY2tJZCkpIHsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5kZXN0cm95KHRyYWNrSWQpOwogICAgICAgICB9CiAgICAgfSk7Ci0gICAgbVRyYWNrcy5jbGVhckRlbGV0ZWRUcmFja05hbWVzKCk7CisgICAgbVRyYWNrcy5jbGVhckRlbGV0ZWRUcmFja0lkcygpOwogCiAgICAgbWl4ZXJfc3RhdGUgbWl4ZXJTdGF0dXMgPSBNSVhFUl9JRExFOwogICAgIC8vIGZpbmQgb3V0IHdoaWNoIHRyYWNrcyBuZWVkIHRvIGJlIHByb2Nlc3NlZApAQCAtNDI3MCw2ICs0NTI4LDM4IEBACiAgICAgbU1peGVyQnVmZmVyVmFsaWQgPSBmYWxzZTsgIC8vIG1NaXhlckJ1ZmZlciBoYXMgbm8gdmFsaWQgZGF0YSB1bnRpbCBhcHByb3ByaWF0ZSB0cmFja3MgZm91bmQuCiAgICAgbUVmZmVjdEJ1ZmZlclZhbGlkID0gZmFsc2U7IC8vIG1FZmZlY3RCdWZmZXIgaGFzIG5vIHZhbGlkIGRhdGEgdW50aWwgdHJhY2tzIGZvdW5kLgogCisgICAgLy8gRGVmZXJyZWRPcGVyYXRpb25zIGhhbmRsZXMgc3RhdGlzdGljcyBhZnRlciBzZXR0aW5nIG1peGVyU3RhdHVzLgorICAgIGNsYXNzIERlZmVycmVkT3BlcmF0aW9ucyB7CisgICAgcHVibGljOgorICAgICAgICBEZWZlcnJlZE9wZXJhdGlvbnMobWl4ZXJfc3RhdGUgKm1peGVyU3RhdHVzKQorICAgICAgICAgICAgOiBtTWl4ZXJTdGF0dXMobWl4ZXJTdGF0dXMpIHsgfQorCisgICAgICAgIC8vIHdoZW4gbGVhdmluZyBzY29wZSwgdGFsbHkgZnJhbWVzIHByb3Blcmx5LgorICAgICAgICB+RGVmZXJyZWRPcGVyYXRpb25zKCkgeworICAgICAgICAgICAgLy8gVGFsbHkgdW5kZXJydW4gZnJhbWVzIG9ubHkgaWYgd2UgYXJlIGFjdHVhbGx5IG1peGluZyAoTUlYRVJfVFJBQ0tTX1JFQURZKQorICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IGlzIHdoZW4gdGhlIHVuZGVycnVuIG9jY3Vycy4KKyAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIEZhc3RUcmFja3MgYW5kIE5vcm1hbFRyYWNrcyBoZXJlLgorICAgICAgICAgICAgaWYgKCptTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX1JFQURZKSB7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZ1bmRlcnJ1biA6IG1VbmRlcnJ1bkZyYW1lcykgeworICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bi5maXJzdC0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bi5zZWNvbmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRhbGx5VW5kZXJydW5GcmFtZXMoKSBpcyBjYWxsZWQgdG8gdXBkYXRlIHRoZSB0cmFjayBjb3VudGVycworICAgICAgICAvLyB3aXRoIHRoZSBudW1iZXIgb2YgdW5kZXJydW4gZnJhbWVzIGZvciBhIHBhcnRpY3VsYXIgbWl4ZXIgcGVyaW9kLgorICAgICAgICAvLyBXZSBkZWZlciB0YWxseWluZyB1bnRpbCB3ZSBrbm93IHRoZSBmaW5hbCBtaXhlciBzdGF0dXMuCisgICAgICAgIHZvaWQgdGFsbHlVbmRlcnJ1bkZyYW1lcyhzcDxUcmFjaz4gdHJhY2ssIHNpemVfdCB1bmRlcnJ1bkZyYW1lcykgeworICAgICAgICAgICAgbVVuZGVycnVuRnJhbWVzLmVtcGxhY2VfYmFjayh0cmFjaywgdW5kZXJydW5GcmFtZXMpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBtaXhlcl9zdGF0ZSAqIGNvbnN0IG1NaXhlclN0YXR1czsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHNwPFRyYWNrPiwgc2l6ZV90Pj4gbVVuZGVycnVuRnJhbWVzOworICAgIH0gZGVmZXJyZWRPcGVyYXRpb25zKCZtaXhlclN0YXR1cyk7IC8vIGltcGxpY2l0IG5lc3RlZCBzY29wZSBmb3IgdmFyaWFibGUgY2FwdHVyZQorCisgICAgYm9vbCBub0Zhc3RIYXB0aWNUcmFjayA9IHRydWU7CiAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewogICAgICAgICBjb25zdCBzcDxUcmFjaz4gdCA9IG1BY3RpdmVUcmFja3NbaV07CiAKQEAgLTQyNzgsNiArNDU2OCw5IEBACiAKICAgICAgICAgLy8gcHJvY2VzcyBmYXN0IHRyYWNrcwogICAgICAgICBpZiAodHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKKyAgICAgICAgICAgIGlmICh0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBub0Zhc3RIYXB0aWNUcmFjayA9IGZhbHNlOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBJdCdzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgKHRob3VnaCB1bmxpa2VseSkgZm9yIGEgZmFzdCB0cmFjayB0byBiZSBjcmVhdGVkCiAgICAgICAgICAgICAvLyBhbmQgdGhlbiByZW1vdmVkIHdpdGhpbiB0aGUgc2FtZSBub3JtYWwgbWl4IGN5Y2xlLiAgVGhpcyBpcyBub3QgYSBwcm9ibGVtLCBhcwpAQCAtNDMwNCwxMyArNDU5NywxNCBAQAogICAgICAgICAgICAgdHJhY2stPm1PYnNlcnZlZFVuZGVycnVucyA9IHVuZGVycnVuczsKICAgICAgICAgICAgIC8vIGRvbid0IGNvdW50IHVuZGVycnVucyB0aGF0IG9jY3VyIHdoaWxlIHN0b3BwaW5nIG9yIHBhdXNpbmcKICAgICAgICAgICAgIC8vIG9yIHN0b3BwZWQgd2hpY2ggY2FuIG9jY3VyIHdoZW4gZmx1c2goKSBpcyBjYWxsZWQgd2hpbGUgYWN0aXZlCisgICAgICAgICAgICBzaXplX3QgdW5kZXJydW5GcmFtZXMgPSAwOwogICAgICAgICAgICAgaWYgKCEodHJhY2stPmlzU3RvcHBpbmcoKSB8fCB0cmFjay0+aXNQYXVzaW5nKCkgfHwgdHJhY2stPmlzU3RvcHBlZCgpKSAmJgogICAgICAgICAgICAgICAgICAgICByZWNlbnRVbmRlcnJ1bnMgPiAwKSB7CiAgICAgICAgICAgICAgICAgLy8gRklYTUUgZmFzdCBtaXhlciB3aWxsIHB1bGwgJiBtaXggcGFydGlhbCBidWZmZXJzLCBidXQgd2UgY291bnQgYXMgYSBmdWxsIHVuZGVycnVuCi0gICAgICAgICAgICAgICAgdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMocmVjZW50VW5kZXJydW5zICogbUZyYW1lQ291bnQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcygwKTsKKyAgICAgICAgICAgICAgICB1bmRlcnJ1bkZyYW1lcyA9IHJlY2VudFVuZGVycnVucyAqIG1GcmFtZUNvdW50OwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSW1tZWRpYXRlbHkgYWNjb3VudCBmb3IgRmFzdFRyYWNrIHVuZGVycnVucy4KKyAgICAgICAgICAgIHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKHVuZGVycnVuRnJhbWVzKTsKIAogICAgICAgICAgICAgLy8gVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBzdGF0ZSBtYWNoaW5lIGZvciBub3JtYWwgdHJhY2tzLAogICAgICAgICAgICAgLy8gd2l0aCBhIGZldyBtb2RpZmljYXRpb25zIGZvciBmYXN0IHRyYWNrcy4KQEAgLTQ0MDIsNiArNDY5Niw4IEBACiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID0gdnA7CiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrID0gdHJhY2stPm1DaGFubmVsTWFzazsKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tRm9ybWF0ID0gdHJhY2stPm1Gb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IHRyYWNrLT5nZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljSW50ZW5zaXR5ID0gdHJhY2stPmdldEhhcHRpY0ludGVuc2l0eSgpOwogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1HZW5lcmF0aW9uKys7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tVHJhY2tNYXNrIHw9IDEgPDwgajsKICAgICAgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKQEAgLTQ0NDcsNiArNDc0MywxMCBAQAogICAgICAgICAgICAgICAgIC8vIEF2b2lkcyBhIG1pc2xlYWRpbmcgZGlzcGxheSBpbiBkdW1wc3lzCiAgICAgICAgICAgICAgICAgdHJhY2stPm1PYnNlcnZlZFVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fRlVMTDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgIT0gdHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gdHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpOworICAgICAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCkBAIC00NDU2LDE5ICs0NzU2LDIxIEBACiAKICAgICAgICAgLy8gVGhlIGZpcnN0IHRpbWUgYSB0cmFjayBpcyBhZGRlZCB3ZSB3YWl0CiAgICAgICAgIC8vIGZvciBhbGwgaXRzIGJ1ZmZlcnMgdG8gYmUgZmlsbGVkIGJlZm9yZSBwcm9jZXNzaW5nIGl0Ci0gICAgICAgIGludCBuYW1lID0gdHJhY2stPm5hbWUoKTsKKyAgICAgICAgY29uc3QgaW50IHRyYWNrSWQgPSB0cmFjay0+aWQoKTsKIAogICAgICAgICAvLyBpZiBhbiBhY3RpdmUgdHJhY2sgZG9lc24ndCBleGlzdCBpbiB0aGUgQXVkaW9NaXhlciwgY3JlYXRlIGl0LgotICAgICAgICBpZiAoIW1BdWRpb01peGVyLT5leGlzdHMobmFtZSkpIHsKKyAgICAgICAgLy8gdXNlIHRoZSB0cmFja0lkIGFzIHRoZSBBdWRpb01peGVyIG5hbWUuCisgICAgICAgIGlmICghbUF1ZGlvTWl4ZXItPmV4aXN0cyh0cmFja0lkKSkgewogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvTWl4ZXItPmNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU2Vzc2lvbklkKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiJXM6IGNhbm5vdCBjcmVhdGUgdHJhY2sgbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgJWQsIG1hc2sgJSN4LCBmb3JtYXQgJSN4LCBzZXNzaW9uSWQgJWQgaW4gQXVkaW9NaXhlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbmFtZSwgdHJhY2stPm1DaGFubmVsTWFzaywgdHJhY2stPm1Gb3JtYXQsIHRyYWNrLT5tU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKTogQXVkaW9NaXhlciBjYW5ub3QgY3JlYXRlIHRyYWNrKCVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgbWFzayAlI3gsIGZvcm1hdCAlI3gsIHNlc3Npb25JZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdHJhY2tJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tQ2hhbm5lbE1hc2ssIHRyYWNrLT5tRm9ybWF0LCB0cmFjay0+bVNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CiAgICAgICAgICAgICAgICAgdHJhY2stPmludmFsaWRhdGUoKTsgLy8gY29uc2lkZXIgaXQgZGVhZC4KICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTQ0ODksNyArNDc5MSw3IEBACiAgICAgICAgIC8vIFRPRE86IE9OTFkgVVNFRCBGT1IgTEVHQUNZIFJFU0FNUExFUlMsIHJlbW92ZSB3aGVuIHRoZXkgYXJlIHJlbW92ZWQuCiAgICAgICAgIC8vIGFkZCBmcmFtZXMgYWxyZWFkeSBjb25zdW1lZCBidXQgbm90IHlldCByZWxlYXNlZCBieSB0aGUgcmVzYW1wbGVyCiAgICAgICAgIC8vIGJlY2F1c2UgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHkoKSB3aWxsIGluY2x1ZGUgdGhlc2UgZnJhbWVzCi0gICAgICAgIGRlc2lyZWRGcmFtZXMgKz0gbUF1ZGlvTWl4ZXItPmdldFVucmVsZWFzZWRGcmFtZXModHJhY2stPm5hbWUoKSk7CisgICAgICAgIGRlc2lyZWRGcmFtZXMgKz0gbUF1ZGlvTWl4ZXItPmdldFVucmVsZWFzZWRGcmFtZXModHJhY2tJZCk7CiAKICAgICAgICAgdWludDMyX3QgbWluRnJhbWVzID0gMTsKICAgICAgICAgaWYgKCh0cmFjay0+c2hhcmVkQnVmZmVyKCkgPT0gMCkgJiYgIXRyYWNrLT5pc1N0b3BwZWQoKSAmJiAhdHJhY2stPmlzUGF1c2luZygpICYmCkBAIC00NTAxLDEzICs0ODAzLDEzIEBACiAgICAgICAgIGlmIChBVFJBQ0VfRU5BQkxFRCgpKSB7CiAgICAgICAgICAgICAvLyBJIHdpc2ggd2UgaGFkIGZvcm1hdHRlZCB0cmFjZSBuYW1lcwogICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHJhY2VOYW1lKCJuUmR5Iik7Ci0gICAgICAgICAgICB0cmFjZU5hbWUgKz0gc3RkOjp0b19zdHJpbmcodHJhY2stPm5hbWUoKSk7CisgICAgICAgICAgICB0cmFjZU5hbWUgKz0gc3RkOjp0b19zdHJpbmcodHJhY2tJZCk7CiAgICAgICAgICAgICBBVFJBQ0VfSU5UKHRyYWNlTmFtZS5jX3N0cigpLCBmcmFtZXNSZWFkeSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChmcmFtZXNSZWFkeSA+PSBtaW5GcmFtZXMpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYKICAgICAgICAgICAgICAgICAhdHJhY2stPmlzUGF1c2VkKCkgJiYgIXRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkKICAgICAgICAgewotICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayAlZCBzPSUwOHggW09LXSBvbiB0aHJlYWQgJXAiLCBuYW1lLCBjYmxrLT5tU2VydmVyLCB0aGlzKTsKKyAgICAgICAgICAgIEFMT0dWVigidHJhY2soJWQpIHM9JTA4eCBbT0tdIG9uIHRocmVhZCAlcCIsIHRyYWNrSWQsIGNibGstPm1TZXJ2ZXIsIHRoaXMpOwogCiAgICAgICAgICAgICBtaXhlZFRyYWNrcysrOwogCkBAIC00NTI0LDkgKzQ4MjYsOSBAQAogICAgICAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1dpdGhFZmZlY3QrKzsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygicHJlcGFyZVRyYWNrc19sKCk6IHRyYWNrICVkIGF0dGFjaGVkIHRvIGVmZmVjdCBidXQgbm8gY2hhaW4gZm91bmQgb24gIgorICAgICAgICAgICAgICAgICAgICBBTE9HVygicHJlcGFyZVRyYWNrc19sKCk6IHRyYWNrKCVkKSBhdHRhY2hlZCB0byBlZmZlY3QgYnV0IG5vIGNoYWluIGZvdW5kIG9uICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vzc2lvbiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLCB0cmFjay0+c2Vzc2lvbklkKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtNDUzNyw5ICs0ODM5LDEyIEBACiAgICAgICAgICAgICAgICAgdHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPSBUcmFjazo6RlNfQUNUSVZFOwogICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UkVTVU1JTkcpIHsKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOwotICAgICAgICAgICAgICAgICAgICBwYXJhbSA9IEF1ZGlvTWl4ZXI6OlJBTVBfVk9MVU1FOworICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIG5ldyB0cmFjayBpcyBwYXVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQsIGRvIG5vdCByYW1wIG9uIHJlc3VtZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNibGstPm1TZXJ2ZXIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSBBdWRpb01peGVyOjpSQU1QX1ZPTFVNRTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLCBBdWRpb01peGVyOjpSRVNFVCwgTlVMTCk7CisgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcih0cmFja0lkLCBBdWRpb01peGVyOjpSRVNBTVBMRSwgQXVkaW9NaXhlcjo6UkVTRVQsIE5VTEwpOwogICAgICAgICAgICAgICAgIG1MZWZ0Vm9sRmxvYXQgPSAtMS4wOwogICAgICAgICAgICAgLy8gRklYTUUgc2hvdWxkIG5vdCBtYWtlIGEgZGVjaXNpb24gYmFzZWQgb24gbVNlcnZlcgogICAgICAgICAgICAgfSBlbHNlIGlmIChjYmxrLT5tU2VydmVyICE9IDApIHsKQEAgLTQ2MzUsMjQgKzQ5NDAsMjUgQEAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFhYWDogdGhlc2UgdGhpbmdzIERPTidUIG5lZWQgdG8gYmUgZG9uZSBlYWNoIHRpbWUKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCB0cmFjayk7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+ZW5hYmxlKG5hbWUpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKHRyYWNrSWQsIHRyYWNrKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5lbmFibGUodHJhY2tJZCk7CiAKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgcGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZ2bGYpOwotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJnZyZik7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIHBhcmFtLCBBdWRpb01peGVyOjpBVVhMRVZFTCwgJnZhZik7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKHRyYWNrSWQsIHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmdmxmKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIodHJhY2tJZCwgcGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcih0cmFja0lkLCBwYXJhbSwgQXVkaW9NaXhlcjo6QVVYTEVWRUwsICZ2YWYpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Rk9STUFULCAodm9pZCAqKXRyYWNrLT5mb3JtYXQoKSk7CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssICh2b2lkICopKHVpbnRwdHJfdCl0cmFjay0+Y2hhbm5lbE1hc2soKSk7CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKLSAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssICh2b2lkICopKHVpbnRwdHJfdCltQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpKG1DaGFubmVsTWFzayB8IG1IYXB0aWNDaGFubmVsTWFzaykpOwogICAgICAgICAgICAgLy8gbGltaXQgdHJhY2sgc2FtcGxlIHJhdGUgdG8gMiB4IG91dHB1dCBzYW1wbGUgcmF0ZSwgd2hpY2ggY2hhbmdlcyBhdCByZS1jb25maWd1cmF0aW9uCiAgICAgICAgICAgICB1aW50MzJfdCBtYXhTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGUgKiBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVg7CiAgICAgICAgICAgICB1aW50MzJfdCByZXFTYW1wbGVSYXRlID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFNhbXBsZVJhdGUoKTsKQEAgLTQ2NjIsMTQgKzQ5NjgsMTQgQEAKICAgICAgICAgICAgICAgICByZXFTYW1wbGVSYXRlID0gbWF4U2FtcGxlUmF0ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlNBTVBMRV9SQVRFLAogICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClyZXFTYW1wbGVSYXRlKTsKIAogICAgICAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgcGxheWJhY2tSYXRlID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFBsYXliYWNrUmF0ZSgpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VElNRVNUUkVUQ0gsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UExBWUJBQ0tfUkFURSwKICAgICAgICAgICAgICAgICAmcGxheWJhY2tSYXRlKTsKQEAgLTQ2OTAsMjkgKzQ5OTYsMzcgQEAKICAgICAgICAgICAgICAgICAgICAgJiYgKHRyYWNrLT5tYWluQnVmZmVyKCkgPT0gbVNpbmtCdWZmZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0cmFjay0+bWFpbkJ1ZmZlcigpID09IG1NaXhlckJ1ZmZlcikpIHsKICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwgKHZvaWQgKiltTWl4ZXJCdWZmZXJGb3JtYXQpOwogICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsICh2b2lkICopbU1peGVyQnVmZmVyKTsKICAgICAgICAgICAgICAgICAvLyBUT0RPOiBvdmVycmlkZSB0cmFjay0+bWFpbkJ1ZmZlcigpPwogICAgICAgICAgICAgICAgIG1NaXhlckJ1ZmZlclZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsICh2b2lkICopRUZGRUNUX0JVRkZFUl9GT1JNQVQpOwogICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsICh2b2lkICopdHJhY2stPm1haW5CdWZmZXIoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpBVVhfQlVGRkVSLCAodm9pZCAqKXRyYWNrLT5hdXhCdWZmZXIoKSk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6SEFQVElDX0VOQUJMRUQsICh2b2lkICopKHVpbnRwdHJfdCl0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCkpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICB0cmFja0lkLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkhBUFRJQ19JTlRFTlNJVFksICh2b2lkICopKHVpbnRwdHJfdCl0cmFjay0+Z2V0SGFwdGljSW50ZW5zaXR5KCkpOwogCiAgICAgICAgICAgICAvLyByZXNldCByZXRyeSBjb3VudAogICAgICAgICAgICAgdHJhY2stPm1SZXRyeUNvdW50ID0ga01heFRyYWNrUmV0cmllczsKQEAgLTQ3MjUsMTMgKzUwMzksMTMgQEAKICAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX1RSQUNLU19SRUFEWTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemVfdCB1bmRlcnJ1bkZyYW1lcyA9IDA7CiAgICAgICAgICAgICBpZiAoZnJhbWVzUmVhZHkgPCBkZXNpcmVkRnJhbWVzICYmICF0cmFjay0+aXNTdG9wcGVkKCkgJiYgIXRyYWNrLT5pc1BhdXNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInRyYWNrKCVwKSB1bmRlcnJ1biwgIGZyYW1lc1JlYWR5KCV6dSkgPCBmcmFtZXNEZXNpcmVkKCV6ZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2ssIGZyYW1lc1JlYWR5LCBkZXNpcmVkRnJhbWVzKTsKLSAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcyhkZXNpcmVkRnJhbWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMoMCk7CisgICAgICAgICAgICAgICAgQUxPR1YoInRyYWNrKCVkKSB1bmRlcnJ1biwgIGZyYW1lc1JlYWR5KCV6dSkgPCBmcmFtZXNEZXNpcmVkKCV6ZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwgZnJhbWVzUmVhZHksIGRlc2lyZWRGcmFtZXMpOworICAgICAgICAgICAgICAgIHVuZGVycnVuRnJhbWVzID0gZGVzaXJlZEZyYW1lczsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmVycmVkT3BlcmF0aW9ucy50YWxseVVuZGVycnVuRnJhbWVzKHRyYWNrLCB1bmRlcnJ1bkZyYW1lcyk7CiAKICAgICAgICAgICAgIC8vIGNsZWFyIGVmZmVjdCBjaGFpbiBpbnB1dCBidWZmZXIgaWYgYW4gYWN0aXZlIHRyYWNrIHVuZGVycnVucyB0byBhdm9pZCBzZW5kaW5nCiAgICAgICAgICAgICAvLyBwcmV2aW91cyBhdWRpbyBidWZmZXIgYWdhaW4gdG8gZWZmZWN0cwpAQCAtNDc0MCw3ICs1MDU0LDcgQEAKICAgICAgICAgICAgICAgICBjaGFpbi0+Y2xlYXJJbnB1dEJ1ZmZlcigpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBBTE9HVlYoInRyYWNrICVkIHM9JTA4eCBbTk9UIFJFQURZXSBvbiB0aHJlYWQgJXAiLCBuYW1lLCBjYmxrLT5tU2VydmVyLCB0aGlzKTsKKyAgICAgICAgICAgIEFMT0dWVigidHJhY2soJWQpIHM9JTA4eCBbTk9UIFJFQURZXSBvbiB0aHJlYWQgJXAiLCB0cmFja0lkLCBjYmxrLT5tU2VydmVyLCB0aGlzKTsKICAgICAgICAgICAgIGlmICgodHJhY2stPnNoYXJlZEJ1ZmZlcigpICE9IDApIHx8IHRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSB8fAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+aXNTdG9wcGVkKCkgfHwgdHJhY2stPmlzUGF1c2VkKCkpIHsKICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGNvbnN1bWVkIGFsbCB0aGUgYnVmZmVycyBvZiB0aGlzIHRyYWNrLgpAQCAtNDc1OSw3ICs1MDczLDggQEAKICAgICAgICAgICAgICAgICAvLyBObyBidWZmZXJzIGZvciB0aGlzIHRyYWNrLiBHaXZlIGl0IGEgZmV3IGNoYW5jZXMgdG8KICAgICAgICAgICAgICAgICAvLyBmaWxsIGEgYnVmZmVyLCB0aGVuIHJlbW92ZSBpdCBmcm9tIGFjdGl2ZSBsaXN0LgogICAgICAgICAgICAgICAgIGlmICgtLSh0cmFjay0+bVJldHJ5Q291bnQpIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koIkJVRkZFUiBUSU1FT1VUOiByZW1vdmUoJWQpIGZyb20gYWN0aXZlIGxpc3Qgb24gdGhyZWFkICVwIiwgbmFtZSwgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJCVUZGRVIgVElNRU9VVDogcmVtb3ZlKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IG9uIHRocmVhZCAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSB0byBjbGllbnQgcHJvY2VzcyB0aGF0IHRoZSB0cmFjayB3YXMgZGlzYWJsZWQgYmVjYXVzZSBvZiB1bmRlcnJ1bjsKICAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCB0aGVuIGF1dG9tYXRpY2FsbHkgY2FsbCBzdGFydCgpIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUKQEAgLTQ3NzIsMTMgKzUwODcsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfRU5BQkxFRDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+ZGlzYWJsZShuYW1lKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5kaXNhYmxlKHRyYWNrSWQpOwogICAgICAgICB9CiAKICAgICAgICAgfSAgIC8vIGxvY2FsIHZhcmlhYmxlIHNjb3BlIHRvIGF2b2lkIGdvdG8gd2FybmluZwogCiAgICAgfQogCisgICAgaWYgKG1IYXB0aWNDaGFubmVsTWFzayAhPSBBVURJT19DSEFOTkVMX05PTkUgJiYgc3EgIT0gTlVMTCkgeworICAgICAgICAvLyBXaGVuIHRoZXJlIGlzIG5vIGZhc3QgdHJhY2sgcGxheWluZyBoYXB0aWMgYW5kIEZhc3RNaXhlciBleGlzdHMsCisgICAgICAgIC8vIGVuYWJsaW5nIHRoZSBmaXJzdCBGYXN0VHJhY2ssIHdoaWNoIHByb3ZpZGVzIG1peGVkIGRhdGEgZnJvbSBub3JtYWwKKyAgICAgICAgLy8gdHJhY2tzLCB0byBwbGF5IGhhcHRpYyBkYXRhLgorICAgICAgICBGYXN0VHJhY2sgKmZhc3RUcmFjayA9ICZzdGF0ZS0+bUZhc3RUcmFja3NbMF07CisgICAgICAgIGlmIChmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgIT0gbm9GYXN0SGFwdGljVHJhY2spIHsKKyAgICAgICAgICAgIGZhc3RUcmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IG5vRmFzdEhhcHRpY1RyYWNrOworICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIFB1c2ggdGhlIG5ldyBGYXN0TWl4ZXIgc3RhdGUgaWYgbmVjZXNzYXJ5CiAgICAgYm9vbCBwYXVzZUF1ZGlvV2F0Y2hkb2cgPSBmYWxzZTsKICAgICBpZiAoZGlkTW9kaWZ5KSB7CkBAIC00ODMzLDkgKzUxNTksOSBAQAogICAgIC8vIG9mIHByZXBhcmVUcmFja3NfbCgpOyB0aGlzIHJlbGVhc2VzIGFueSBvdXRzdGFuZGluZyBidWZmZXIgYmFjayB0byB0aGUgdHJhY2suCiAgICAgLy8gU2VlIGFsc28gdGhlIGltcGxlbWVudGF0aW9uIG9mIGRlc3Ryb3lUcmFja19sKCkuCiAgICAgZm9yIChjb25zdCBhdXRvICZ0cmFjayA6ICp0cmFja3NUb1JlbW92ZSkgewotICAgICAgICBjb25zdCBpbnQgbmFtZSA9IHRyYWNrLT5uYW1lKCk7Ci0gICAgICAgIGlmIChtQXVkaW9NaXhlci0+ZXhpc3RzKG5hbWUpKSB7IC8vIE5vcm1hbCB0cmFja3MgaGVyZSwgZmFzdCB0cmFja3MgaW4gRmFzdE1peGVyLgotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIG51bGxwdHIgLyogYnVmZmVyUHJvdmlkZXIgKi8pOworICAgICAgICBjb25zdCBpbnQgdHJhY2tJZCA9IHRyYWNrLT5pZCgpOworICAgICAgICBpZiAobUF1ZGlvTWl4ZXItPmV4aXN0cyh0cmFja0lkKSkgeyAvLyBOb3JtYWwgdHJhY2tzIGhlcmUsIGZhc3QgdHJhY2tzIGluIEZhc3RNaXhlci4KKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRCdWZmZXJQcm92aWRlcih0cmFja0lkLCBudWxscHRyIC8qIGJ1ZmZlclByb3ZpZGVyICovKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTAwNCwxNyArNTMzMCwxNyBAQAogICAgICAgICAgICAgZGVsZXRlIG1BdWRpb01peGVyOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihtTm9ybWFsRnJhbWVDb3VudCwgbVNhbXBsZVJhdGUpOwogICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZ0cmFjayA6IG1UcmFja3MpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgbmFtZSA9IHRyYWNrLT5uYW1lKCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHRyYWNrSWQgPSB0cmFjay0+aWQoKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9NaXhlci0+Y3JlYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBjYW5ub3QgY3JlYXRlIHRyYWNrIG5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAiICVkLCBtYXNrICUjeCwgZm9ybWF0ICUjeCwgc2Vzc2lvbklkICVkIGluIEF1ZGlvTWl4ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCk6IEF1ZGlvTWl4ZXIgY2Fubm90IGNyZWF0ZSB0cmFjayglZCkiCisgICAgICAgICAgICAgICAgICAgICAgICAiIG1hc2sgJSN4LCBmb3JtYXQgJSN4LCBzZXNzaW9uSWQgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB0cmFjay0+bUNoYW5uZWxNYXNrLCB0cmFjay0+bUZvcm1hdCwgdHJhY2stPm1TZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwgdHJhY2stPm1DaGFubmVsTWFzaywgdHJhY2stPm1Gb3JtYXQsIHRyYWNrLT5tU2Vzc2lvbklkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICAgICAgfQpAQCAtNTAzMCw3ICs1MzU2LDkgQEAKICAgICBkcHJpbnRmKGZkLCAiICBUaHJlYWQgdGhyb3R0bGUgdGltZSAobXNlY3MpOiAldVxuIiwgbVRocmVhZFRocm90dGxlVGltZU1zKTsKICAgICBkcHJpbnRmKGZkLCAiICBBdWRpb01peGVyIHRyYWNrczogJXNcbiIsIG1BdWRpb01peGVyLT50cmFja05hbWVzKCkuY19zdHIoKSk7CiAgICAgZHByaW50ZihmZCwgIiAgTWFzdGVyIG1vbm86ICVzXG4iLCBtTWFzdGVyTW9ubyA/ICJvbiIgOiAib2ZmIik7Ci0KKyAgICBkcHJpbnRmKGZkLCAiICBNYXN0ZXIgYmFsYW5jZTogJWYgKCVzKVxuIiwgbU1hc3RlckJhbGFuY2UubG9hZCgpLAorICAgICAgICAgICAgKGhhc0Zhc3RNaXhlcigpID8gc3RkOjp0b19zdHJpbmcobUZhc3RNaXhlci0+Z2V0TWFzdGVyQmFsYW5jZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUJhbGFuY2UudG9TdHJpbmcoKSkuY19zdHIoKSk7CiAgICAgaWYgKGhhc0Zhc3RNaXhlcigpKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIEZhc3RNaXhlciB0aHJlYWQgJXAgdGlkPSVkIiwgbUZhc3RNaXhlci5nZXQoKSwgbUZhc3RNaXhlci0+Z2V0VGlkKCkpOwogCkBAIC01MDM4LDkgKzUzNjYsOSBAQAogICAgICAgICAvLyB3aGlsZSB3ZSBhcmUgZHVtcGluZyBpdC4gIEl0IG1heSBiZSBpbmNvbnNpc3RlbnQsIGJ1dCBpdCB3b24ndCBtdXRhdGUhCiAgICAgICAgIC8vIFRoaXMgaXMgYSBsYXJnZSBvYmplY3Qgc28gd2UgcGxhY2UgaXQgb24gdGhlIGhlYXAuCiAgICAgICAgIC8vIEZJWE1FIDI1OTcyOTU4OiBOZWVkIGFuIGludGVsbGlnZW50IGNvcHkgY29uc3RydWN0b3IgdGhhdCBkb2VzIG5vdCB0b3VjaCB1bnVzZWQgcGFnZXMuCi0gICAgICAgIGNvbnN0IEZhc3RNaXhlckR1bXBTdGF0ZSAqY29weSA9IG5ldyBGYXN0TWl4ZXJEdW1wU3RhdGUobUZhc3RNaXhlckR1bXBTdGF0ZSk7CisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxGYXN0TWl4ZXJEdW1wU3RhdGU+IGNvcHkgPQorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8RmFzdE1peGVyRHVtcFN0YXRlPihtRmFzdE1peGVyRHVtcFN0YXRlKTsKICAgICAgICAgY29weS0+ZHVtcChmZCk7Ci0gICAgICAgIGRlbGV0ZSBjb3B5OwogCiAjaWZkZWYgU1RBVEVfUVVFVUVfRFVNUAogICAgICAgICAvLyBTaW1pbGFyIGZvciBzdGF0ZSBxdWV1ZQpAQCAtNTA2MSwxMiArNTM4OSw2IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgZHByaW50ZihmZCwgIiAgTm8gRmFzdE1peGVyXG4iKTsKICAgICB9Ci0KLSNpZmRlZiBURUVfU0lOSwotICAgIC8vIFdyaXRlIHRoZSB0ZWUgb3V0cHV0IHRvIGEgLndhdiBmaWxlCi0gICAgZHVtcFRlZShmZCwgbVRlZVNvdXJjZSwgbUlkLCAnTScpOwotI2VuZGlmCi0KIH0KIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6aWRsZVNsZWVwVGltZVVzKCkgY29uc3QKQEAgLTUwOTMsMjMgKzU0MTUsMzQgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OkRpcmVjdE91dHB1dFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCi0gICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KQotICAgIDogICBQbGF5YmFja1RocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIGRldmljZSwgRElSRUNULCBzeXN0ZW1SZWFkeSkKLXsKLX0KLQotQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OkRpcmVjdE91dHB1dFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCi0gICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCB1aW50MzJfdCBkZXZpY2UsCisgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICBUaHJlYWRCYXNlOjp0eXBlX3QgdHlwZSwgYm9vbCBzeXN0ZW1SZWFkeSkKICAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIHR5cGUsIHN5c3RlbVJlYWR5KQotICAgICAgICAsIG1Wb2x1bWVTaGFwZXJBY3RpdmUoZmFsc2UpCiB7CisgICAgc2V0TWFzdGVyQmFsYW5jZShhdWRpb0ZsaW5nZXItPmdldE1hc3RlckJhbGFuY2VfbCgpKTsKIH0KIAogQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6On5EaXJlY3RPdXRwdXRUaHJlYWQoKQogewogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3sKKyAgICBQbGF5YmFja1RocmVhZDo6ZHVtcEludGVybmFscyhmZCwgYXJncyk7CisgICAgZHByaW50ZihmZCwgIiAgTWFzdGVyIGJhbGFuY2U6ICVmICBMZWZ0OiAlZiAgUmlnaHQ6ICVmXG4iLAorICAgICAgICAgICAgbU1hc3RlckJhbGFuY2UubG9hZCgpLCBtTWFzdGVyQmFsYW5jZUxlZnQsIG1NYXN0ZXJCYWxhbmNlUmlnaHQpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobU1hc3RlckJhbGFuY2UgIT0gYmFsYW5jZSkgeworICAgICAgICBtTWFzdGVyQmFsYW5jZS5zdG9yZShiYWxhbmNlKTsKKyAgICAgICAgbUJhbGFuY2UuY29tcHV0ZVN0ZXJlb0JhbGFuY2UoYmFsYW5jZSwgJm1NYXN0ZXJCYWxhbmNlTGVmdCwgJm1NYXN0ZXJCYWxhbmNlUmlnaHQpOworICAgICAgICBicm9hZGNhc3RfbCgpOworICAgIH0KK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6cHJvY2Vzc1ZvbHVtZV9sKFRyYWNrICp0cmFjaywgYm9vbCBsYXN0VHJhY2spCiB7CiAgICAgZmxvYXQgbGVmdCwgcmlnaHQ7CkBAIC01MTMzLDEyICs1NDY2LDEyIEBACiAgICAgICAgIGlmIChsZWZ0ID4gR0FJTl9GTE9BVF9VTklUWSkgewogICAgICAgICAgICAgbGVmdCA9IEdBSU5fRkxPQVRfVU5JVFk7CiAgICAgICAgIH0KLSAgICAgICAgbGVmdCAqPSB2OworICAgICAgICBsZWZ0ICo9IHYgKiBtTWFzdGVyQmFsYW5jZUxlZnQ7IC8vIERpcmVjdE91dHB1dFRocmVhZCBiYWxhbmNlIGFwcGxpZWQgYXMgdHJhY2sgdm9sdW1lCiAgICAgICAgIHJpZ2h0ID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKTsKICAgICAgICAgaWYgKHJpZ2h0ID4gR0FJTl9GTE9BVF9VTklUWSkgewogICAgICAgICAgICAgcmlnaHQgPSBHQUlOX0ZMT0FUX1VOSVRZOwogICAgICAgICB9Ci0gICAgICAgIHJpZ2h0ICo9IHY7CisgICAgICAgIHJpZ2h0ICo9IHYgKiBtTWFzdGVyQmFsYW5jZVJpZ2h0OwogICAgIH0KIAogICAgIGlmIChsYXN0VHJhY2spIHsKQEAgLTUxODAsNiArNTUxMywxMSBAQAogICAgICAgICAgICAgICAgIG1GbHVzaFBlbmRpbmcgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgfSBlbHNlIGlmIChwcmV2aW91c1RyYWNrID09IDApIHsKKyAgICAgICAgLy8gdGhlcmUgY291bGQgYmUgYW4gb2xkIHRyYWNrIGFkZGVkIGJhY2sgZHVyaW5nIHRyYWNrIHRyYW5zaXRpb24gZm9yIGRpcmVjdAorICAgICAgICAvLyBvdXRwdXQsIHNvIGFsd2F5cyBpc3N1ZXMgZmx1c2ggdG8gZmx1c2ggZGF0YSBvZiB0aGUgcHJldmlvdXMgdHJhY2sgaWYgaXQKKyAgICAgICAgLy8gd2FzIGFscmVhZHkgZGVzdHJveWVkIHdpdGggSEFMIHBhdXNlZCwgdGhlbiBmbHVzaCBjYW4gcmVzdW1lIHRoZSBwbGF5YmFjaworICAgICAgICBtRmx1c2hQZW5kaW5nID0gdHJ1ZTsKICAgICB9CiAgICAgUGxheWJhY2tUaHJlYWQ6Om9uQWRkTmV3VHJhY2tfbCgpOwogfQpAQCAtNTIxOCw3ICs1NTU2LDYgQEAKICAgICAgICAgICAgICAgICBkb0h3UGF1c2UgPSB0cnVlOwogICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKICAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+aXNGbHVzaFBlbmRpbmcoKSkgewogICAgICAgICAgICAgdHJhY2stPmZsdXNoQWNrKCk7CiAgICAgICAgICAgICBpZiAobGFzdCkgewpAQCAtNTI1Myw3ICs1NTkwLDcgQEAKICAgICAgICAgaWYgKCh0cmFjay0+ZnJhbWVzUmVhZHkoKSA+PSBtaW5GcmFtZXMpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYgIXRyYWNrLT5pc1BhdXNlZCgpICYmCiAgICAgICAgICAgICAgICAgIXRyYWNrLT5pc1N0b3BwaW5nXzIoKSAmJiAhdHJhY2stPmlzU3RvcHBlZCgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVlYoInRyYWNrICVkIHM9JTA4eCBbT0tdIiwgdHJhY2stPm5hbWUoKSwgY2Jsay0+bVNlcnZlcik7CisgICAgICAgICAgICBBTE9HVlYoInRyYWNrKCVkKSBzPSUwOHggW09LXSIsIHRyYWNrLT5pZCgpLCBjYmxrLT5tU2VydmVyKTsKIAogICAgICAgICAgICAgaWYgKHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID09IFRyYWNrOjpGU19GSUxMRUQpIHsKICAgICAgICAgICAgICAgICB0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9IFRyYWNrOjpGU19BQ1RJVkU7CkBAIC01MzE1LDcgKzU2NTIsOCBAQAogCiAgICAgICAgICAgICAgICAgaW50NjRfdCBmcmFtZXNXcml0dGVuID0gbUJ5dGVzV3JpdHRlbiAvIG1GcmFtZVNpemU7CiAgICAgICAgICAgICAgICAgaWYgKG1TdGFuZGJ5IHx8ICFsYXN0IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUoZnJhbWVzV3JpdHRlbiwgYXVkaW9IQUxGcmFtZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUoZnJhbWVzV3JpdHRlbiwgYXVkaW9IQUxGcmFtZXMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+aXNQYXVzZWQoKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzU3RvcHBpbmdfMigpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVE9QUEVEOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC01MzI5LDcgKzU2NjcsNyBAQAogICAgICAgICAgICAgICAgIC8vIGZpbGwgYSBidWZmZXIsIHRoZW4gcmVtb3ZlIGl0IGZyb20gYWN0aXZlIGxpc3QuCiAgICAgICAgICAgICAgICAgLy8gT25seSBjb25zaWRlciBsYXN0IHRyYWNrIHN0YXJ0ZWQgZm9yIG1peGVyIHN0YXRlIGNvbnRyb2wKICAgICAgICAgICAgICAgICBpZiAoLS0odHJhY2stPm1SZXRyeUNvdW50KSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJCVUZGRVIgVElNRU9VVDogcmVtb3ZlKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IiwgdHJhY2stPm5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJCVUZGRVIgVElNRU9VVDogcmVtb3ZlIHRyYWNrKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IiwgdHJhY2stPmlkKCkpOwogICAgICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgdG8gY2xpZW50IHByb2Nlc3MgdGhhdCB0aGUgdHJhY2sgd2FzIGRpc2FibGVkIGJlY2F1c2Ugb2YgdW5kZXJydW47CiAgICAgICAgICAgICAgICAgICAgIC8vIGl0IHdpbGwgdGhlbiBhdXRvbWF0aWNhbGx5IGNhbGwgc3RhcnQoKSB3aGVuIGRhdGEgaXMgYXZhaWxhYmxlCkBAIC01NTY4LDYgKzU5MDYsNyBAQAogICAgIG1PdXRwdXQtPmZsdXNoKCk7CiAgICAgbUh3UGF1c2VkID0gZmFsc2U7CiAgICAgbUZsdXNoUGVuZGluZyA9IGZhbHNlOworICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7IC8vIERJUkVDVCBhbmQgT0ZGTE9BREVEIGZsdXNoIHJlc2V0cyBmcmFtZSBjb3VudC4KIH0KIAogaW50NjRfdCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6Y29tcHV0ZVdhaXRUaW1lTnNfbCgpIGNvbnN0IHsKQEAgLTU4MTEsNyArNjE1MCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gIGVsc2UgaWYgKHRyYWNrLT5mcmFtZXNSZWFkeSgpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYKICAgICAgICAgICAgICAgICAhdHJhY2stPmlzUGF1c2VkKCkgJiYgIXRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSAmJiAhdHJhY2stPmlzU3RvcHBpbmdfMigpKSB7Ci0gICAgICAgICAgICBBTE9HVlYoIk9mZmxvYWRUaHJlYWQ6IHRyYWNrICVkIHM9JTA4eCBbT0tdIiwgdHJhY2stPm5hbWUoKSwgY2Jsay0+bVNlcnZlcik7CisgICAgICAgICAgICBBTE9HVlYoIk9mZmxvYWRUaHJlYWQ6IHRyYWNrKCVkKSBzPSUwOHggW09LXSIsIHRyYWNrLT5pZCgpLCBjYmxrLT5tU2VydmVyKTsKICAgICAgICAgICAgIGlmICh0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9PSBUcmFjazo6RlNfRklMTEVEKSB7CiAgICAgICAgICAgICAgICAgdHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPSBUcmFjazo6RlNfQUNUSVZFOwogICAgICAgICAgICAgICAgIGlmIChsYXN0KSB7CkBAIC01ODU1LDcgKzYxOTQsNyBAQAogICAgICAgICAgICAgICAgIG1peGVyU3RhdHVzID0gTUlYRVJfVFJBQ0tTX1JFQURZOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1ZWKCJPZmZsb2FkVGhyZWFkOiB0cmFjayAlZCBzPSUwOHggW05PVCBSRUFEWV0iLCB0cmFjay0+bmFtZSgpLCBjYmxrLT5tU2VydmVyKTsKKyAgICAgICAgICAgIEFMT0dWVigiT2ZmbG9hZFRocmVhZDogdHJhY2soJWQpIHM9JTA4eCBbTk9UIFJFQURZXSIsIHRyYWNrLT5pZCgpLCBjYmxrLT5tU2VydmVyKTsKICAgICAgICAgICAgIGlmICh0cmFjay0+aXNTdG9wcGluZ18xKCkpIHsKICAgICAgICAgICAgICAgICBpZiAoLS0odHJhY2stPm1SZXRyeUNvdW50KSA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIEhhcmR3YXJlIGJ1ZmZlciBjYW4gaG9sZCBhIGxhcmdlIGFtb3VudCBvZiBhdWRpbyBzbyB3ZSBtdXN0CkBAIC01OTAyLDYgKzYyNDEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnByZXNlbnRhdGlvbkNvbXBsZXRlKGZyYW1lc1dyaXR0ZW4sIGF1ZGlvSEFMRnJhbWVzKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnJlc2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOworICAgICAgICAgICAgICAgICAgICAvLyBESVJFQ1QgYW5kIE9GRkxPQURFRCBzdG9wIHJlc2V0cyBmcmFtZSBjb3VudHMuCisgICAgICAgICAgICAgICAgICAgIGlmICghbVVzZUFzeW5jV3JpdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IGdldCBleHBsaWNpdCBkcmFpbiBub3RpZmljYXRpb24gd2UgbXVzdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgZGlzY29udGludWl0eSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhpcyBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByZXZpb3VzICghbGFzdCkgb3IgdGhlIHVwY29taW5nIChsYXN0KSB0cmFjaworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYXZvaWQgc2tpcHBpbmcgdGhlIGRpc2NvbnRpbnVpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBObyBidWZmZXJzIGZvciB0aGlzIHRyYWNrLiBHaXZlIGl0IGEgZmV3IGNoYW5jZXMgdG8KQEAgLTU5MjMsOCArNjI3MCw4IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChydW5uaW5nKSB7IC8vIHN0aWxsIHJ1bm5pbmcsIGdpdmUgdXMgbW9yZSB0aW1lLgogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1SZXRyeUNvdW50ID0ga01heFRyYWNrUmV0cmllc09mZmxvYWQ7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiT2ZmbG9hZFRocmVhZDogQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSglZCkgZnJvbSBhY3RpdmUgbGlzdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5uYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIk9mZmxvYWRUaHJlYWQ6IEJVRkZFUiBUSU1FT1VUOiByZW1vdmUgdHJhY2soJWQpIGZyb20gYWN0aXZlIGxpc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+aWQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlbGwgY2xpZW50IHByb2Nlc3MgdGhhdCB0aGUgdHJhY2sgd2FzIGRpc2FibGVkIGJlY2F1c2Ugb2YgdW5kZXJydW47CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIHRoZW4gYXV0b21hdGljYWxseSBjYWxsIHN0YXJ0KCkgd2hlbiBkYXRhIGlzIGF2YWlsYWJsZQpAQCAtNjA2Nyw3ICs2NDE0LDIyIEBACiBzc2l6ZV90IEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OnRocmVhZExvb3Bfd3JpdGUoKQogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0VHJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG91dHB1dFRyYWNrc1tpXS0+d3JpdGUobVNpbmtCdWZmZXIsIHdyaXRlRnJhbWVzKTsKKyAgICAgICAgY29uc3Qgc3NpemVfdCBhY3R1YWxXcml0dGVuID0gb3V0cHV0VHJhY2tzW2ldLT53cml0ZShtU2lua0J1ZmZlciwgd3JpdGVGcmFtZXMpOworCisgICAgICAgIC8vIENvbnNpZGVyIHRoZSBmaXJzdCBPdXRwdXRUcmFjayBmb3IgdGltZXN0YW1wIGFuZCBmcmFtZSBjb3VudGluZy4KKworICAgICAgICAvLyBUaGUgdGhyZWFkTG9vcCgpIGdlbmVyYWxseSBhc3N1bWVzIHdyaXRpbmcgYSBmdWxsIHNpbmsgYnVmZmVyIHNpemUgYXQgYSB0aW1lLgorICAgICAgICAvLyBIZXJlLCB3ZSBjb3JyZWN0IGZvciB3cml0ZUZyYW1lcyBvZiAwIChhIHN0b3ApIG9yIHVuZGVycnVucyBiZWNhdXNlCisgICAgICAgIC8vIHdlIGFsd2F5cyBjbGFpbSBzdWNjZXNzLgorICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICBjb25zdCBzc2l6ZV90IGNvcnJlY3Rpb24gPSBtU2lua0J1ZmZlclNpemUgLyBtRnJhbWVTaXplIC0gYWN0dWFsV3JpdHRlbjsKKyAgICAgICAgICAgIEFMT0dEX0lGKGNvcnJlY3Rpb24gIT0gMCAmJiB3cml0ZUZyYW1lcyAhPSAwLAorICAgICAgICAgICAgICAgICAgICAiJXM6IHdyaXRlRnJhbWVzOiV1ICBhY3R1YWxXcml0dGVuOiV6ZCAgY29ycmVjdGlvbjolemQgIG1GcmFtZXNXcml0dGVuOiVsbGQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgd3JpdGVGcmFtZXMsIGFjdHVhbFdyaXR0ZW4sIGNvcnJlY3Rpb24sIChsb25nIGxvbmcpbUZyYW1lc1dyaXR0ZW4pOworICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW4gLT0gY29ycmVjdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IFJlcG9ydCBjb3JyZWN0aW9uIGZvciB0aGUgb3RoZXIgb3V0cHV0IHRyYWNrcyBhbmQgc2hvdyBpbiB0aGUgZHVtcC4KICAgICB9CiAgICAgbVN0YW5kYnkgPSBmYWxzZTsKICAgICByZXR1cm4gKHNzaXplX3QpbVNpbmtCdWZmZXJTaXplOwpAQCAtNjA5Miw3ICs2NDU0LDcgQEAKICAgICAgICAgc3MgPDwgIjoiOwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnRyYWNrIDogbU91dHB1dFRyYWNrcykgewogICAgICAgICAgICAgY29uc3Qgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gdHJhY2stPnRocmVhZCgpLnByb21vdGUoKTsKLSAgICAgICAgICAgIHNzIDw8ICIgKCIgPDwgdHJhY2stPm5hbWUoKSA8PCAiIDogIjsKKyAgICAgICAgICAgIHNzIDw8ICIgKCIgPDwgdHJhY2stPmlkKCkgPDwgIiA6ICI7CiAgICAgICAgICAgICBpZiAodGhyZWFkLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBzcyA8PCB0aHJlYWQuZ2V0KCkgPDwgIiwgIiA8PCB0aHJlYWQtPmlkKCk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNjIzMiw5ICs2NTk0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5c3RlbVJlYWR5Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBjb25zdCBzcDxOQkFJT19TaW5rPiYgdGVlU2luawotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOgogICAgIFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCwgb3V0RGV2aWNlLCBpbkRldmljZSwgUkVDT1JELCBzeXN0ZW1SZWFkeSksCiAgICAgbUlucHV0KGlucHV0KSwKQEAgLTYyNDIsOSArNjYwMSw2IEBACiAgICAgbVJzbXBJbkJ1ZmZlcihOVUxMKSwKICAgICAvLyBtUnNtcEluRnJhbWVzLCBtUnNtcEluRnJhbWVzUDIsIGFuZCBtUnNtcEluRnJhbWVzT0EgYXJlIHNldCBieSByZWFkSW5wdXRQYXJhbWV0ZXJzX2woKQogICAgIG1Sc21wSW5SZWFyKDApCi0jaWZkZWYgVEVFX1NJTksKLSAgICAsIG1UZWVTaW5rKHRlZVNpbmspCi0jZW5kaWYKICAgICAsIG1SZWFkT25seUhlYXAobmV3IE1lbW9yeURlYWxlcihrUmVjb3JkVGhyZWFkUmVhZE9ubHlIZWFwU2l6ZSwKICAgICAgICAgICAgICJSZWNvcmRUaHJlYWRSTyIsIE1lbW9yeUhlYXBCYXNlOjpSRUFEX09OTFkpKQogICAgIC8vIG1GYXN0Q2FwdHVyZSBiZWxvdwpAQCAtNjI2MSw4ICs2NjE3LDIwIEBACiAgICAgc25wcmludGYobVRocmVhZE5hbWUsIGtUaHJlYWROYW1lTGVuZ3RoLCAiQXVkaW9Jbl8lWCIsIGlkKTsKICAgICBtTkJMb2dXcml0ZXIgPSBhdWRpb0ZsaW5nZXItPm5ld1dyaXRlcl9sKGtMb2dTaXplLCBtVGhyZWFkTmFtZSk7CiAKKyAgICBpZiAobUlucHV0ICE9IG51bGxwdHIgJiYgbUlucHV0LT5hdWRpb0h3RGV2ICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUlzTXNkRGV2aWNlID0gc3RyY21wKAorICAgICAgICAgICAgICAgIG1JbnB1dC0+YXVkaW9Id0Rldi0+bW9kdWxlTmFtZSgpLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSA9PSAwOworICAgIH0KKwogICAgIHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpOwogCisgICAgLy8gVE9ETzogV2UgbWF5IGFsc28gbWF0Y2ggb24gYWRkcmVzcyBhcyB3ZWxsIGFzIGRldmljZSB0eXBlIGZvcgorICAgIC8vIEFVRElPX0RFVklDRV9JTl9CVVMsIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCwgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgKKyAgICBtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlcyA9IChhdWRpb19kZXZpY2VzX3QpcHJvcGVydHlfZ2V0X2ludDY0KAorICAgICAgICAgICAgImF1ZGlvLnRpbWVzdGFtcC5jb3JyZWN0ZWRfaW5wdXRfZGV2aWNlcyIsCisgICAgICAgICAgICAoaW50NjRfdCkobUlzTXNkRGV2aWNlID8gQVVESU9fREVWSUNFX0lOX0JVUyAvLyB0dXJuIG9uIGJ5IGRlZmF1bHQgZm9yIE1TRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFVRElPX0RFVklDRV9OT05FKSk7CisKICAgICAvLyBjcmVhdGUgYW4gTkJBSU8gc291cmNlIGZvciB0aGUgSEFMIGlucHV0IHN0cmVhbSwgYW5kIG5lZ290aWF0ZQogICAgIG1JbnB1dFNvdXJjZSA9IG5ldyBBdWRpb1N0cmVhbUluU291cmNlKGlucHV0LT5zdHJlYW0pOwogICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKQEAgLTYzNTksNyArNjcyNyw3IEBACiAgICAgICAgIC8vIHN0YXJ0IHRoZSBmYXN0IGNhcHR1cmUKICAgICAgICAgbUZhc3RDYXB0dXJlLT5ydW4oIkZhc3RDYXB0dXJlIiwgQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU8pOwogICAgICAgICBwaWRfdCB0aWQgPSBtRmFzdENhcHR1cmUtPmdldFRpZCgpOwotICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZF9jYWNoZWQsIHRpZCwga1ByaW9yaXR5RmFzdENhcHR1cmUsIGZhbHNlIC8qZm9yQXBwKi8pOworICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZCgpLCB0aWQsIGtQcmlvcml0eUZhc3RDYXB0dXJlLCBmYWxzZSAvKmZvckFwcCovKTsKICAgICAgICAgc3RyZWFtKCktPnNldEhhbFRocmVhZFByaW9yaXR5KGtQcmlvcml0eUZhc3RDYXB0dXJlKTsKICNpZmRlZiBBVURJT19XQVRDSERPRwogICAgICAgICAvLyBGSVhNRQpAQCAtNjM2Nyw2ICs2NzM1LDEwIEBACiAKICAgICAgICAgbUZhc3RUcmFja0F2YWlsID0gdHJ1ZTsKICAgICB9CisjaWZkZWYgVEVFX1NJTksKKyAgICBtVGVlLnNldChtSW5wdXRTb3VyY2UtPmZvcm1hdCgpLCBOQkFJT19UZWU6OlRFRV9GTEFHX0lOUFVUX1RIUkVBRCk7CisgICAgbVRlZS5zZXRJZChzdGQ6OnN0cmluZygiXyIpICsgc3RkOjp0b19zdHJpbmcobUlkKSArICJfQyIpOworI2VuZGlmCiBmYWlsZWQ6IDsKIAogICAgIC8vIEZJWE1FIG1Ob3JtYWxTb3VyY2UKQEAgLTY0MjcsOCArNjc5OSwxMCBAQAogICAgIC8vIHVzZWQgdG8gcmVxdWVzdCBhIGRlZmVycmVkIHNsZWVwLCB0byBiZSBleGVjdXRlZCBsYXRlciB3aGlsZSBtdXRleCBpcyB1bmxvY2tlZAogICAgIHVpbnQzMl90IHNsZWVwVXMgPSAwOwogCisgICAgaW50NjRfdCBsYXN0TG9vcENvdW50UmVhZCA9IC0yOyAgLy8gbmV2ZXIgbWF0Y2hlcyAicHJldmlvdXMiIGxvb3AsIHdoZW4gbG9vcENvdW50ID0gMC4KKwogICAgIC8vIGxvb3Agd2hpbGUgdGhlcmUgaXMgd29yayB0byBkbwotICAgIGZvciAoOzspIHsKKyAgICBmb3IgKGludDY0X3QgbG9vcENvdW50ID0gMDs7ICsrbG9vcENvdW50KSB7ICAvLyBsb29wQ291bnQgdXNlZCBmb3Igc3RhdGlzdGljcyB0cmFja2luZwogICAgICAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+IGVmZmVjdENoYWluczsKIAogICAgICAgICAvLyBhY3RpdmVUcmFja3MgYWNjdW11bGF0ZXMgYSBjb3B5IG9mIGEgc3Vic2V0IG9mIG1BY3RpdmVUcmFja3MKQEAgLTY0OTQsNiArNjg2OCw3IEBACiAKICAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6UEFVU0lORzoKICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUoYWN0aXZlVHJhY2spOworICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpQQVVTRUQ7CiAgICAgICAgICAgICAgICAgICAgIGRvQnJvYWRjYXN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgc2l6ZS0tOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTY1MTUsMTIgKzY4OTAsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgYWxsU3RvcHBlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpJRExFOgotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCisgICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OklETEU6ICAgIC8vIGNhbm5vdCBiZSBvbiBBY3RpdmVUcmFja3MgaWYgaWRsZQorICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpQQVVTRUQ6ICAvLyBjYW5ub3QgYmUgb24gQWN0aXZlVHJhY2tzIGlmIHBhdXNlZAorICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpTVE9QUEVEOiAvLyBjYW5ub3QgYmUgb24gQWN0aXZlVHJhY2tzIGlmIGRlc3Ryb3llZC90ZXJtaW5hdGVkCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5leHBlY3RlZCBhY3RpdmVUcmFja1N0YXRlICVkIiwgYWN0aXZlVHJhY2tTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzOiBVbmV4cGVjdGVkIGFjdGl2ZSB0cmFjayBzdGF0ZTolZCwgaWQ6JWQsIHRyYWNrczolenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBhY3RpdmVUcmFja1N0YXRlLCBhY3RpdmVUcmFjay0+aWQoKSwgc2l6ZSk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2tzLmFkZChhY3RpdmVUcmFjayk7CkBAIC02NTQ1LDcgKzY5MjAsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBzbGVlcCBpZiB0aGVyZSBhcmUgbm8gYWN0aXZlIHRyYWNrcyB0byBwcm9jZXNzCi0gICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2tzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2tzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIGlmIChzbGVlcFVzID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgc2xlZXBVcyA9IGtSZWNvcmRUaHJlYWRTbGVlcFVzOwogICAgICAgICAgICAgICAgIH0KQEAgLTY1OTYsNiArNjk3MSwxNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBkaWRNb2RpZnkgPSB0cnVlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogYWJwID0gKGZhc3RUcmFjayAhPSAwICYmIGZhc3RUcmFjay0+aXNQYXRjaFRyYWNrKCkpID8KKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBdWRpb0J1ZmZlclByb3ZpZGVyKj4oZmFzdFRyYWNrLmdldCgpKSA6IG51bGxwdHI7CisgICAgICAgICAgICBpZiAoc3RhdGUtPm1GYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlciAhPSBhYnApIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bUZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyID0gYWJwOworICAgICAgICAgICAgICAgIHN0YXRlLT5tRmFzdFBhdGNoUmVjb3JkRm9ybWF0ID0gZmFzdFRyYWNrID09IDAgPworICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQgOiBmYXN0VHJhY2stPmZvcm1hdCgpOworICAgICAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcS0+ZW5kKGRpZE1vZGlmeSk7CiAgICAgICAgICAgICBpZiAoZGlkTW9kaWZ5KSB7CiAgICAgICAgICAgICAgICAgc3EtPnB1c2goYmxvY2spOwpAQCAtNjYxOCwxMSArNzAwMSwxMSBAQAogCiAgICAgICAgIGludDMyX3QgcmVhciA9IG1Sc21wSW5SZWFyICYgKG1Sc21wSW5GcmFtZXNQMiAtIDEpOwogICAgICAgICBzc2l6ZV90IGZyYW1lc1JlYWQ7CisgICAgICAgIGNvbnN0IGludDY0X3QgbGFzdElvQmVnaW5OcyA9IHN5c3RlbVRpbWUoKTsgLy8gc3RhcnQgSU8gdGltaW5nCiAKICAgICAgICAgLy8gSWYgYW4gTkJBSU8gc291cmNlIGlzIHByZXNlbnQsIHVzZSBpdCB0byByZWFkIHRoZSBub3JtYWwgY2FwdHVyZSdzIGRhdGEKICAgICAgICAgaWYgKG1QaXBlU291cmNlICE9IDApIHsKLSAgICAgICAgICAgIHNpemVfdCBmcmFtZXNUb1JlYWQgPSBtQnVmZmVyU2l6ZSAvIG1GcmFtZVNpemU7Ci0gICAgICAgICAgICBmcmFtZXNUb1JlYWQgPSBtaW4obVJzbXBJbkZyYW1lc09BIC0gcmVhciwgbVJzbXBJbkZyYW1lc1AyIC8gMik7CisgICAgICAgICAgICBzaXplX3QgZnJhbWVzVG9SZWFkID0gbWluKG1Sc21wSW5GcmFtZXNPQSAtIHJlYXIsIG1Sc21wSW5GcmFtZXNQMiAvIDIpOwogCiAgICAgICAgICAgICAvLyBUaGUgYXVkaW8gZmlmbyByZWFkKCkgcmV0dXJucyBPVkVSUlVOIG9uIG92ZXJmbG93LCBhbmQgYWR2YW5jZXMgdGhlIHJlYWQgcG9pbnRlcgogICAgICAgICAgICAgLy8gdG8gdGhlIGZ1bGwgYnVmZmVyIHBvaW50IChjbGVhcmluZyB0aGUgb3ZlcmZsb3cgY29uZGl0aW9uKS4gIFVwb24gT1ZFUlJVTiBlcnJvciwKQEAgLTY2NzYsMTYgKzcwNTksMzQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGNvbnN0IGludDY0X3QgbGFzdElvRW5kTnMgPSBzeXN0ZW1UaW1lKCk7IC8vIGVuZCBJTyB0aW1pbmcKKwogICAgICAgICAvLyBVcGRhdGUgc2VydmVyIHRpbWVzdGFtcCB3aXRoIHNlcnZlciBzdGF0cwogICAgICAgICAvLyBzeXN0ZW1UaW1lKCkgaXMgb3B0aW9uYWwgaWYgdGhlIGhhcmR3YXJlIHN1cHBvcnRzIHRpbWVzdGFtcHMuCiAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdICs9IGZyYW1lc1JlYWQ7Ci0gICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0gbGFzdElvRW5kTnM7CiAKICAgICAgICAgLy8gVXBkYXRlIHNlcnZlciB0aW1lc3RhbXAgd2l0aCBrZXJuZWwgc3RhdHMKICAgICAgICAgaWYgKG1QaXBlU291cmNlLmdldCgpID09IG51bGxwdHIgLyogZG9uJ3Qgb2J0YWluIGZvciBGYXN0Q2FwdHVyZSwgY291bGQgYmxvY2sgKi8pIHsKICAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb24sIHRpbWU7Ci0gICAgICAgICAgICBpbnQgcmV0ID0gbUlucHV0LT5zdHJlYW0tPmdldENhcHR1cmVQb3NpdGlvbigmcG9zaXRpb24sICZ0aW1lKTsKLSAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGlmIChtU3RhbmRieSkgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1JbnB1dC0+c3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oJnBvc2l0aW9uLCAmdGltZSkgPT0gTk9fRVJST1IKKyAgICAgICAgICAgICAgICAgICAgJiYgdGltZSA+IG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSkgeworCisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmFkZChwb3NpdGlvbiwgdGltZSwgbVNhbXBsZVJhdGUpOworCisgICAgICAgICAgICAgICAgLy8gQ29ycmVjdCB0aW1lc3RhbXBzCisgICAgICAgICAgICAgICAgaWYgKGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQkVGT1JFOiAlZCAlbGxkICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKCksIChsb25nIGxvbmcpdGltZSwgKGxvbmcgbG9uZylwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gY29ycmVjdGVkVGltZXN0YW1wID0gbVRpbWVzdGFtcFZlcmlmaWVyLmdldExhc3RDb3JyZWN0ZWRUaW1lc3RhbXAoKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBjb3JyZWN0ZWRUaW1lc3RhbXAubUZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgdGltZSA9IGNvcnJlY3RlZFRpbWVzdGFtcC5tVGltZU5zOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQUZURVI6ICVkICVsbGQgJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQoKSwgKGxvbmcgbG9uZyl0aW1lLCAobG9uZyBsb25nKXBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IHBvc2l0aW9uOwogICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IHRpbWU7CiAgICAgICAgICAgICAgICAgLy8gTm90ZTogSW4gZ2VuZXJhbCByZWNvcmQgYnVmZmVycyBzaG91bGQgdGVuZCB0byBiZSBlbXB0eSBpbgpAQCAtNjY5Myw4ICs3MDk0LDE5IEBACiAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAvLyBBbHNvLCBpdCBpcyBub3QgYWR2YW50YWdlb3VzIHRvIGNhbGwgZ2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbiBkdXJpbmcgdGhlIHJlYWQKICAgICAgICAgICAgICAgICAvLyBhcyB0aGUgcmVhZCBvYnRhaW5zIGEgbG9jaywgcHJldmVudGluZyB0aGUgdGltZXN0YW1wIGNhbGwgZnJvbSBleGVjdXRpbmcuCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5lcnJvcigpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgLy8gRnJvbSB0aGUgdGltZXN0YW1wLCBpbnB1dCByZWFkIGxhdGVuY3kgaXMgbmVnYXRpdmUgb3V0cHV0IHdyaXRlIGxhdGVuY3kuCisgICAgICAgIGNvbnN0IGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSBtSW5wdXQgIT0gTlVMTCA/IG1JbnB1dC0+ZmxhZ3MgOiBBVURJT19JTlBVVF9GTEFHX05PTkU7CisgICAgICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSBSZWNvcmRUcmFjazo6Y2hlY2tTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKG1Gb3JtYXQsIGZsYWdzKQorICAgICAgICAgICAgICAgID8gLSBtVGltZXN0YW1wLmdldE91dHB1dFNlcnZlckxhdGVuY3lNcyhtU2FtcGxlUmF0ZSkgOiAwLjsKKyAgICAgICAgaWYgKGxhdGVuY3lNcyAhPSAwLikgeyAvLyBub3RlIDAuIG1lYW5zIHRpbWVzdGFtcCBpcyBlbXB0eS4KKyAgICAgICAgICAgIG1MYXRlbmN5TXMuYWRkKGxhdGVuY3lNcyk7CisgICAgICAgIH0KKwogICAgICAgICAvLyBVc2UgdGhpcyB0byB0cmFjayB0aW1lc3RhbXAgaW5mb3JtYXRpb24KICAgICAgICAgLy8gQUxPR0QoIiVzIiwgbVRpbWVzdGFtcC50b1N0cmluZygpLmNfc3RyKCkpOwogCkBAIC02NzA4LDEwICs3MTIwLDI5IEBACiAgICAgICAgICAgICBnb3RvIHVubG9jazsKICAgICAgICAgfQogICAgICAgICBBTE9HX0FTU0VSVChmcmFtZXNSZWFkID4gMCk7CisgICAgICAgIG1GcmFtZXNSZWFkICs9IGZyYW1lc1JlYWQ7CiAKLSAgICAgICAgaWYgKG1UZWVTaW5rICE9IDApIHsKLSAgICAgICAgICAgICh2b2lkKSBtVGVlU2luay0+d3JpdGUoKHVpbnQ4X3QqKW1Sc21wSW5CdWZmZXIgKyByZWFyICogbUZyYW1lU2l6ZSwgZnJhbWVzUmVhZCk7CisgICAgICAgIGlmIChhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhtRm9ybWF0KQorICAgICAgICAgICAgICAgICYmIGxvb3BDb3VudCA9PSBsYXN0TG9vcENvdW50UmVhZCArIDEpIHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgcmVhZFBlcmlvZE5zID0gbGFzdElvRW5kTnMgLSBtTGFzdElvRW5kTnM7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgaml0dGVyTXMgPQorICAgICAgICAgICAgICAgICAgICBUaW1lc3RhbXBWZXJpZmllcjxpbnQ2NF90LCBpbnQ2NF90Pjo6Y29tcHV0ZUppdHRlck1zKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcmFtZXNSZWFkLCByZWFkUGVyaW9kTnN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAwfSAvKiBsYXN0VGltZXN0YW1wICovLCBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgcHJvY2Vzc01zID0gKGxhc3RJb0JlZ2luTnMgLSBtTGFzdElvRW5kTnMpICogMWUtNjsKKworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgICAgIG1Jb0ppdHRlck1zLmFkZChqaXR0ZXJNcyk7CisgICAgICAgICAgICBtUHJvY2Vzc1RpbWVNcy5hZGQocHJvY2Vzc01zKTsKICAgICAgICAgfQorICAgICAgICAvLyB1cGRhdGUgdGltaW5nIGluZm8uCisgICAgICAgIG1MYXN0SW9CZWdpbk5zID0gbGFzdElvQmVnaW5OczsKKyAgICAgICAgbUxhc3RJb0VuZE5zID0gbGFzdElvRW5kTnM7CisgICAgICAgIGxhc3RMb29wQ291bnRSZWFkID0gbG9vcENvdW50OworCisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgKHZvaWQpbVRlZS53cml0ZSgodWludDhfdCopbVJzbXBJbkJ1ZmZlciArIHJlYXIgKiBtRnJhbWVTaXplLCBmcmFtZXNSZWFkKTsKKyNlbmRpZgogICAgICAgICAvLyBJZiBkZXN0aW5hdGlvbiBpcyBub24tY29udGlndW91cywgd2Ugbm93IGNvcnJlY3QgZm9yIHJlYWRpbmcgcGFzdCBlbmQgb2YgYnVmZmVyLgogICAgICAgICB7CiAgICAgICAgICAgICBzaXplX3QgcGFydDEgPSBtUnNtcEluRnJhbWVzUDIgLSByZWFyOwpAQCAtNjc2OSw5ICs3MjAwLDMzIEBACiAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gbWluKGZyYW1lc091dCwKICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uRnJhbWVzUG9zc2libGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luLCBtU2FtcGxlUmF0ZSwgYWN0aXZlVHJhY2stPm1TYW1wbGVSYXRlKSk7Ci0gICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBmcmFtZXMgZnJvbSB0aGUgUmVjb3JkVGhyZWFkIGJ1ZmZlciBwcm92aWRlciB0byB0aGUgUmVjb3JkVHJhY2sgYnVmZmVyCi0gICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gYWN0aXZlVHJhY2stPm1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPmNvbnZlcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVNpbmsucmF3LCBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLCBmcmFtZXNPdXQpOworCisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5pc0RpcmVjdCgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vIFJlY29yZEJ1ZmZlckNvbnZlcnRlciB1c2VkIGZvciBkaXJlY3Qgc3RyZWFtcy4gUGFzcworICAgICAgICAgICAgICAgICAgICAvLyBzdHJhaWdodCBmcm9tIFJlY29yZFRocmVhZCBidWZmZXIgdG8gUmVjb3JkVHJhY2sgYnVmZmVyLgorICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgYnVmZmVyOworICAgICAgICAgICAgICAgICAgICBidWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lc091dDsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWN0aXZlVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSyAmJiBidWZmZXIuZnJhbWVDb3VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVl9JRihidWZmZXIuZnJhbWVDb3VudCAhPSBmcmFtZXNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpIHJlYWQgbGVzcyB0aGFuIGV4cGVjdGVkICglenUgdnMgJXp1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBidWZmZXIuZnJhbWVDb3VudCwgZnJhbWVzT3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IGJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGFjdGl2ZVRyYWNrLT5tU2luay5yYXcsIGJ1ZmZlci5yYXcsIGJ1ZmZlci5mcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZidWZmZXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpIGNhbm5vdCBmaWxsIHJlcXVlc3QsIHN0YXR1czogJWQsIGZyYW1lQ291bnQ6ICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0YXR1cywgYnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBmcmFtZXMgZnJvbSB0aGUgUmVjb3JkVGhyZWFkIGJ1ZmZlciBwcm92aWRlciB0byB0aGUgUmVjb3JkVHJhY2sKKyAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IGFjdGl2ZVRyYWNrLT5tUmVjb3JkQnVmZmVyQ29udmVydGVyLT5jb252ZXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU2luay5yYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQpOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgPiAwICYmIChvdmVycnVuID09IE9WRVJSVU5fVU5LTk9XTikpIHsKICAgICAgICAgICAgICAgICAgICAgb3ZlcnJ1biA9IE9WRVJSVU5fRkFMU0U7CkBAIC02OTQyLDYgKzczOTcsMTIgQEAKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAorICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSAmJiAoKmZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QpID09IDApIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVJlY29yZFRyYWNrX2woKSBvbiBhbiBlbmNvZGVkIHN0cmVhbSByZXF1aXJlcyBBVURJT19JTlBVVF9GTEFHX0RJUkVDVCIpOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCiAgICAgaWYgKCpwU2FtcGxlUmF0ZSA9PSAwKSB7CiAgICAgICAgICpwU2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwogICAgIH0KQEAgLTcxMDcsOCArNzU2OCwxNCBAQAogICAgIHsKICAgICAgICAgLy8gVGhpcyBzZWN0aW9uIGlzIGEgcmVuZGV6dm91cyBiZXR3ZWVuIGJpbmRlciB0aHJlYWQgZXhlY3V0aW5nIHN0YXJ0KCkgYW5kIFJlY29yZFRocmVhZAogICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgIGlmIChyZWNvcmRUcmFjay0+aXNJbnZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KICAgICAgICAgaWYgKG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgPj0gMCkgewogICAgICAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTSU5HKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZW4ndCBzdG9wcGVkIHlldCAobW92ZWQgdG8gUEFVU0VEIGFuZCBub3QgaW4gbUFjdGl2ZVRyYWNrcykKKyAgICAgICAgICAgICAgICAvLyBzbyBubyBuZWVkIHRvIHN0YXJ0SW5wdXQoKS4KICAgICAgICAgICAgICAgICBBTE9HVigiYWN0aXZlIHJlY29yZCB0cmFjayBQQVVTSU5HIC0+IEFDVElWRSIpOwogICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC03MTI1LDE3ICs3NTkyLDM0IEBACiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgICAgICBpZiAocmVjb3JkVHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQ7Ci0gICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChyZWNvcmRUcmFjay0+cG9ydElkKCksICZzaWxlbmNlZCk7CisgICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChyZWNvcmRUcmFjay0+cG9ydElkKCkpOwogICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgLy8gRklYTUUgc2hvdWxkIHZlcmlmeSB0aGF0IHJlY29yZFRyYWNrIGlzIHN0aWxsIGluIG1BY3RpdmVUcmFja3MKKyAgICAgICAgICAgIGlmIChyZWNvcmRUcmFjay0+aXNJbnZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlNUQVJUSU5HXzEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RBUlRJTkdfMjsKKyAgICAgICAgICAgICAgICAgICAgLy8gU1RBUlRJTkdfMiBmb3JjZXMgZGVzdHJveSB0byBjYWxsIHN0b3BJbnB1dC4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5tU3RhdGUgIT0gVHJhY2tCYXNlOjpTVEFSVElOR18xKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogdW5zeW5jaHJvbml6ZWQgbVN0YXRlOiVkIGNoYW5nZSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCByZWNvcmRUcmFjay0+aWQoKSwgcmVjb3JkVHJhY2stPm1TdGF0ZSk7CisgICAgICAgICAgICAgICAgLy8gU29tZW9uZSBlbHNlIGhhcyBjaGFuZ2VkIHN0YXRlLCBsZXQgdGhlbSB0YWtlIG92ZXIsCisgICAgICAgICAgICAgICAgLy8gbGVhdmUgbVN0YXRlIGluIHRoZSBuZXcgc3RhdGUuCisgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB3ZSdyZSBvaywgYnV0IHBlcmhhcHMgc3RhcnRJbnB1dCBoYXMgZmFpbGVkCiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogc3RhcnRJbnB1dCBmYWlsZWQsIHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCByZWNvcmRUcmFjay0+aWQoKSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAvLyBXZSBhcmUgaW4gQWN0aXZlVHJhY2tzIGlmIFNUQVJUSU5HXzEgYW5kIHZhbGlkLCBzbyByZW1vdmUgZnJvbSBBY3RpdmVUcmFja3MsCisgICAgICAgICAgICAgICAgLy8gbGVhdmUgaW4gU1RBUlRJTkdfMSwgc28gZGVzdHJveSgpIHdpbGwgbm90IGNhbGwgc3RvcElucHV0LgogICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKHJlY29yZFRyYWNrKTsKICAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJSZWNvcmRUaHJlYWQ6OnN0YXJ0IGVycm9yICVkIiwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVjb3JkVHJhY2stPnNldFNpbGVuY2VkKHNpbGVuY2VkKTsKICAgICAgICAgfQogICAgICAgICAvLyBDYXRjaCB1cCB3aXRoIGN1cnJlbnQgYnVmZmVyIGluZGljZXMgaWYgdGhyZWFkIGlzIGFscmVhZHkgcnVubmluZy4KICAgICAgICAgLy8gVGhpcyBpcyB3aGF0IG1ha2VzIGEgbmV3IGNsaWVudCBkaXNjYXJkIGFsbCBidWZmZXJlZCBkYXRhLiAgSWYgdGhlIHRyYWNrJ3MgbVJzbXBJbkZyb250CkBAIC03MTQzLDI2ICs3NjI3LDE1IEBACiAgICAgICAgIC8vIHNlZSBwcmV2aW91c2x5IGJ1ZmZlcmVkIGRhdGEgYmVmb3JlIGl0IGNhbGxlZCBzdGFydCgpLCBidXQgd2l0aCBncmVhdGVyIHJpc2sgb2Ygb3ZlcnJ1bi4KIAogICAgICAgICByZWNvcmRUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwotICAgICAgICAvLyBjbGVhciBhbnkgY29udmVydGVyIHN0YXRlIGFzIG5ldyBkYXRhIHdpbGwgYmUgZGlzY29udGludW91cwotICAgICAgICByZWNvcmRUcmFjay0+bVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+cmVzZXQoKTsKKyAgICAgICAgaWYgKCFyZWNvcmRUcmFjay0+aXNEaXJlY3QoKSkgeworICAgICAgICAgICAgLy8gY2xlYXIgYW55IGNvbnZlcnRlciBzdGF0ZSBhcyBuZXcgZGF0YSB3aWxsIGJlIGRpc2NvbnRpbnVvdXMKKyAgICAgICAgICAgIHJlY29yZFRyYWNrLT5tUmVjb3JkQnVmZmVyQ29udmVydGVyLT5yZXNldCgpOworICAgICAgICB9CiAgICAgICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUQVJUSU5HXzI7CiAgICAgICAgIC8vIHNpZ25hbCB0aHJlYWQgdG8gc3RhcnQKICAgICAgICAgbVdhaXRXb3JrQ1YuYnJvYWRjYXN0KCk7Ci0gICAgICAgIGlmIChtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spIDwgMCkgewotICAgICAgICAgICAgQUxPR1YoIlJlY29yZCBmYWlsZWQgdG8gc3RhcnQiKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIGdvdG8gc3RhcnRFcnJvcjsKLSAgICAgICAgfQogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLQotc3RhcnRFcnJvcjoKLSAgICBpZiAocmVjb3JkVHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQocmVjb3JkVHJhY2stPnBvcnRJZCgpKTsKLSAgICB9Ci0gICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKLSAgICAvLyBGSVhNRSBJIHdvbmRlciB3aHkgd2UgZG8gbm90IHJlc2V0IHRoZSBzdGF0ZSBoZXJlPwotICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnN5bmNTdGFydEV2ZW50Q2FsbGJhY2soY29uc3Qgd3A8U3luY0V2ZW50PiYgZXZlbnQpCkBAIC03MTgxLDI0ICs3NjU0LDI4IEBACiBib29sIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzdG9wKFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrKSB7CiAgICAgQUxPR1YoIlJlY29yZFRocmVhZDo6c3RvcCIpOwogICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgLy8gaWYgd2UncmUgaW52YWxpZCwgd2UgY2FuJ3QgYmUgb24gdGhlIEFjdGl2ZVRyYWNrcy4KICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSA8IDAgfHwgcmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNJTkcpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICAvLyBub3RlIHRoYXQgdGhyZWFkTG9vcCBtYXkgc3RpbGwgYmUgcHJvY2Vzc2luZyB0aGUgdHJhY2sgYXQgdGhpcyBwb2ludCBbd2l0aG91dCBsb2NrXQogICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlBBVVNJTkc7Ci0gICAgLy8gc2lnbmFsIHRocmVhZCB0byBzdG9wCi0gICAgbVdhaXRXb3JrQ1YuYnJvYWRjYXN0KCk7Ci0gICAgLy8gZG8gbm90IHdhaXQgZm9yIG1TdGFydFN0b3BDb25kIGlmIGV4aXRpbmcKLSAgICBpZiAoZXhpdFBlbmRpbmcoKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIE5PVEU6IFdhaXRpbmcgaGVyZSBpcyBpbXBvcnRhbnQgdG8ga2VlcCBzdG9wIHN5bmNocm9ub3VzLgorICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciBwcm9wZXIgcGF0Y2hSZWNvcmQgcGVlciByZWxlYXNlLgorICAgIHdoaWxlIChyZWNvcmRUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORyAmJiAhcmVjb3JkVHJhY2stPmlzSW52YWxpZCgpKSB7CisgICAgICAgIG1XYWl0V29ya0NWLmJyb2FkY2FzdCgpOyAvLyBzaWduYWwgdGhyZWFkIHRvIHN0b3AKKyAgICAgICAgbVN0YXJ0U3RvcENvbmQud2FpdChtTG9jayk7CiAgICAgfQotICAgIC8vIEZJWE1FIGluY29ycmVjdCB1c2FnZSBvZiB3YWl0OiBubyBleHBsaWNpdCBwcmVkaWNhdGUgb3IgbG9vcAotICAgIG1TdGFydFN0b3BDb25kLndhaXQobUxvY2spOwotICAgIC8vIGlmIHdlIGhhdmUgYmVlbiByZXN0YXJ0ZWQsIHJlY29yZFRyYWNrIGlzIGluIG1BY3RpdmVUcmFja3MgaGVyZQotICAgIGlmIChleGl0UGVuZGluZygpIHx8IG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgPCAwKSB7CisKKyAgICBpZiAocmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNFRCkgeyAvLyBzdWNjZXNzZnVsIHN0b3AKICAgICAgICAgQUxPR1YoIlJlY29yZCBzdG9wcGVkIE9LIik7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KKworICAgIC8vIGRvbid0IGhhbmRsZSBhbnl0aGluZyAtIHdlJ3ZlIGJlZW4gaW52YWxpZGF0ZWQgb3IgcmVzdGFydGVkIGFuZCBpbiBhIGRpZmZlcmVudCBzdGF0ZQorICAgIEFMT0dXX0lGKCIlcyglZCk6IHVuc3luY2hyb25pemVkIHN0b3AsIHN0YXRlOiAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgcmVjb3JkVHJhY2stPmlkKCksIHJlY29yZFRyYWNrLT5tU3RhdGUpOwogICAgIHJldHVybiBmYWxzZTsKIH0KIApAQCAtNzI0MSw2ICs3NzE4LDIwIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pCit7CisgICAgQUxPR1YoInNldE1pY3JvcGhvbmVEaXJlY3Rpb24oJWQpIiwgZGlyZWN0aW9uKTsKKyAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgIHJldHVybiBtSW5wdXQtPnN0cmVhbS0+c2V0TWljcm9waG9uZURpcmVjdGlvbihkaXJlY3Rpb24pOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pCit7CisgICAgQUxPR1YoInNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbiglZikiLCB6b29tKTsKKyAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgIHJldHVybiBtSW5wdXQtPnN0cmVhbS0+c2V0TWljcm9waG9uZUZpZWxkRGltZW5zaW9uKHpvb20pOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjp1cGRhdGVNZXRhZGF0YV9sKCkKIHsKICAgICBpZiAobUlucHV0ID09IG51bGxwdHIgfHwgbUlucHV0LT5zdHJlYW0gPT0gbnVsbHB0ciB8fApAQCAtNzI5OSw4ICs3NzkwLDkgQEAKICAgICBBdWRpb1N0cmVhbUluICppbnB1dCA9IG1JbnB1dDsKICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gaW5wdXQgIT0gTlVMTCA/IGlucHV0LT5mbGFncyA6IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKICAgICBkcHJpbnRmKGZkLCAiICBBdWRpb1N0cmVhbUluOiAlcCBmbGFncyAlI3ggKCVzKVxuIiwKLSAgICAgICAgICAgIGlucHV0LCBmbGFncywgaW5wdXRGbGFnc1RvU3RyaW5nKGZsYWdzKS5jX3N0cigpKTsKLSAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgaW5wdXQsIGZsYWdzLCB0b1N0cmluZyhmbGFncykuY19zdHIoKSk7CisgICAgZHByaW50ZihmZCwgIiAgRnJhbWVzIHJlYWQ6ICVsbGRcbiIsIChsb25nIGxvbmcpbUZyYW1lc1JlYWQpOworICAgIGlmIChtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSkgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBObyBhY3RpdmUgcmVjb3JkIGNsaWVudHNcbiIpOwogICAgIH0KIApAQCAtNzMxNiw5ICs3ODA4LDkgQEAKICAgICAvLyB3aGlsZSB3ZSBhcmUgZHVtcGluZyBpdC4gIEl0IG1heSBiZSBpbmNvbnNpc3RlbnQsIGJ1dCBpdCB3b24ndCBtdXRhdGUhCiAgICAgLy8gVGhpcyBpcyBhIGxhcmdlIG9iamVjdCBzbyB3ZSBwbGFjZSBpdCBvbiB0aGUgaGVhcC4KICAgICAvLyBGSVhNRSAyNTk3Mjk1ODogTmVlZCBhbiBpbnRlbGxpZ2VudCBjb3B5IGNvbnN0cnVjdG9yIHRoYXQgZG9lcyBub3QgdG91Y2ggdW51c2VkIHBhZ2VzLgotICAgIGNvbnN0IEZhc3RDYXB0dXJlRHVtcFN0YXRlICpjb3B5ID0gbmV3IEZhc3RDYXB0dXJlRHVtcFN0YXRlKG1GYXN0Q2FwdHVyZUR1bXBTdGF0ZSk7CisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEZhc3RDYXB0dXJlRHVtcFN0YXRlPiBjb3B5ID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8RmFzdENhcHR1cmVEdW1wU3RhdGU+KG1GYXN0Q2FwdHVyZUR1bXBTdGF0ZSk7CiAgICAgY29weS0+ZHVtcChmZCk7Ci0gICAgZGVsZXRlIGNvcHk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQpAQCAtNzMzMiw3ICs3ODI0LDcgQEAKICAgICBpZiAobnVtdHJhY2tzKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgb2Ygd2hpY2ggJXp1IGFyZSBhY3RpdmVcbiIsIG51bWFjdGl2ZSk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgUmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgbVRyYWNrc1swXS0+YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bXRyYWNrcyA7ICsraSkgewogICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKICAgICAgICAgICAgIGlmICh0cmFjayAhPSAwKSB7CkBAIC03MzUyLDcgKzc4NDQsNyBAQAogICAgICAgICByZXN1bHQuYXBwZW5kKCIgIFRoZSBmb2xsb3dpbmcgdHJhY2tzIGFyZSBpbiB0aGUgYWN0aXZlIGxpc3QgYnV0IgogICAgICAgICAgICAgICAgICIgbm90IGluIHRoZSB0cmFjayBsaXN0XG4iKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwotICAgICAgICBSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOworICAgICAgICBtQWN0aXZlVHJhY2tzWzBdLT5hcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtYWN0aXZlOyArK2kpIHsKICAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1BY3RpdmVUcmFja3NbaV07CiAgICAgICAgICAgICBpZiAobVRyYWNrcy5pbmRleE9mKHRyYWNrKSA8IDApIHsKQEAgLTc2NDcsMTAgKzgxMzksMTUgQEAKIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBtSW5wdXQtPnN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKCZtU2FtcGxlUmF0ZSwgJm1DaGFubmVsTWFzaywgJm1IQUxGb3JtYXQpOwogICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzdWx0ICE9IE9LLCAiRXJyb3IgcmV0cmlldmluZyBhdWRpbyBwcm9wZXJ0aWVzIGZyb20gSEFMOiAlZCIsIHJlc3VsdCk7Ci0gICAgbUNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1DaGFubmVsTWFzayk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQ2hhbm5lbENvdW50ID4gRkNDXzgsICJIQUwgY2hhbm5lbCBjb3VudCAlZCA+ICVkIiwgbUNoYW5uZWxDb3VudCwgRkNDXzgpOwogICAgIG1Gb3JtYXQgPSBtSEFMRm9ybWF0OwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCksICJIQUwgZm9ybWF0ICUjeCBpcyBub3QgbGluZWFyIHBjbSIsIG1Gb3JtYXQpOworICAgIG1DaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtQ2hhbm5lbE1hc2spOworICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUNoYW5uZWxDb3VudCA+IEZDQ184LCAiSEFMIGNoYW5uZWwgY291bnQgJWQgPiAlZCIsCisgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCwgRkNDXzgpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENhbiBoYXZlIG1vcmUgdGhhdCBGQ0NfOCBjaGFubmVscyBpbiBlbmNvZGVkIHN0cmVhbXMuCisgICAgICAgIEFMT0dJKCJIQUwgZm9ybWF0ICUjeCBpcyBub3QgbGluZWFyIHBjbSIsIG1Gb3JtYXQpOworICAgIH0KICAgICByZXN1bHQgPSBtSW5wdXQtPnN0cmVhbS0+Z2V0RnJhbWVTaXplKCZtRnJhbWVTaXplKTsKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdCAhPSBPSywgIkVycm9yIHJldHJpZXZpbmcgZnJhbWUgc2l6ZSBmcm9tIEhBTDogJWQiLCByZXN1bHQpOwogICAgIHJlc3VsdCA9IG1JbnB1dC0+c3RyZWFtLT5nZXRCdWZmZXJTaXplKCZtQnVmZmVyU2l6ZSk7CkBAIC03NzAwLDI3ICs4MTk3LDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotLy8gaGFzQXVkaW9TZXNzaW9uX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLXVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpoYXNBdWRpb1Nlc3Npb25fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSBjb25zdAotewotICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gICAgaWYgKGdldEVmZmVjdENoYWluX2woc2Vzc2lvbklkKSAhPSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IEVGRkVDVF9TRVNTSU9OOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAoc2Vzc2lvbklkID09IG1UcmFja3NbaV0tPnNlc3Npb25JZCgpKSB7Ci0gICAgICAgICAgICByZXN1bHQgfD0gVFJBQ0tfU0VTU0lPTjsKLSAgICAgICAgICAgIGlmIChtVHJhY2tzW2ldLT5pc0Zhc3RUcmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0IHw9IEZBU1RfU0VTU0lPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQogS2V5ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90LCBib29sPiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c2Vzc2lvbklkcygpIGNvbnN0CiB7CiAgICAgS2V5ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90LCBib29sPiBpZHM7CkBAIC03NzU1LDcgKzgyMzEsNyBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbikKIHsKICAgICAvLyBvbmx5IG9uZSBjaGFpbiBwZXIgaW5wdXQgdGhyZWFkCi0gICAgaWYgKG1FZmZlY3RDaGFpbnMuc2l6ZSgpICE9IDApIHsKKyAgICBpZiAoIW1FZmZlY3RDaGFpbnMuaXNFbXB0eSgpKSB7CiAgICAgICAgIEFMT0dXKCJhZGRFZmZlY3RDaGFpbl9sKCkgYWxyZWFkeSBvbmUgY2hhaW4gJXAgb24gdGhyZWFkICVwIiwgY2hhaW4uZ2V0KCksIHRoaXMpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtNzc5NCw2ICs4MjcwLDcgQEAKIAogICAgIC8vIHN0b3JlIG5ldyBkZXZpY2UgYW5kIHNlbmQgdG8gZWZmZWN0cwogICAgIG1JbkRldmljZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkID0gcGF0Y2gtPnNvdXJjZXNbMF0uaWQ7CiAgICAgbVBhdGNoID0gKnBhdGNoOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgewogICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbChtSW5EZXZpY2UpOwpAQCAtNzgzNSw5ICs4MzEyLDEwIEBACiAgICAgICAgICpoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICB9CiAKLSAgICBpZiAobUluRGV2aWNlICE9IG1QcmV2SW5EZXZpY2UpIHsKKyAgICBpZiAoKG1JbkRldmljZSAhPSBtUHJldkluRGV2aWNlKSB8fCAobURldmljZUlkICE9IGRldmljZUlkKSkgewogICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICAgICAgbVByZXZJbkRldmljZSA9IG1JbkRldmljZTsKKyAgICAgICAgbURldmljZUlkID0gZGV2aWNlSWQ7CiAgICAgfQogCiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTc4NjAsMjQgKzgzMzgsMjggQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphZGRQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmFkZFBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBtVHJhY2tzLmFkZChyZWNvcmQpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkZWxldGVQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmRlbGV0ZVBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBkZXN0cm95VHJhY2tfbChyZWNvcmQpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKIHsKLSAgICBUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBUaHJlYWRCYXNlOjp0b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOwogICAgIGNvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LOwogICAgIGNvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBtSW5wdXQtPmF1ZGlvSHdEZXYtPmhhbmRsZSgpOwogICAgIGNvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IG1BdWRpb1NvdXJjZTsKKyAgICBpZiAobUlucHV0ICYmIG1JbnB1dC0+ZmxhZ3MgIT0gQVVESU9fSU5QVVRfRkxBR19OT05FKSB7CisgICAgICAgIGNvbmZpZy0+Y29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgICAgIGNvbmZpZy0+ZmxhZ3MuaW5wdXQgPSBtSW5wdXQtPmZsYWdzOworICAgIH0KIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzkzMCw3ICs4NDEyLDcgQEAKICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KQogICAgIDogVGhyZWFkQmFzZShhdWRpb0ZsaW5nZXIsIGlkLCBvdXREZXZpY2UsIGluRGV2aWNlLCBNTUFQLCBzeXN0ZW1SZWFkeSksCiAgICAgICBtU2Vzc2lvbklkKEFVRElPX1NFU1NJT05fTk9ORSksCi0gICAgICBtRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksIG1Qb3J0SWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCisgICAgICBtUG9ydElkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAogICAgICAgbUhhbFN0cmVhbShzdHJlYW0pLCBtSGFsRGV2aWNlKGh3RGV2LT5od0RldmljZSgpKSwgbUF1ZGlvSHdEZXYoaHdEZXYpLAogICAgICAgbUFjdGl2ZVRyYWNrcygmdGhpcy0+bUxvY2FsTG9nKSwKICAgICAgIG1IYWxWb2xGbG9hdCgtMS4wZiksIC8vIEluaXRpYWxpemUgdG8gaWxsZWdhbCB2YWx1ZSBzbyBpdCBhbHdheXMgZ2V0cyBzZXQgcHJvcGVybHkgbGF0ZXIuCkBAIC03OTY0LDcgKzg0NDYsNyBAQAogICAgIH0KICAgICAvLyBUaGlzIHdpbGwgZGVjcmVtZW50IHJlZmVyZW5jZXMgYW5kIG1heSBjYXVzZSB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhpcyB0aHJlYWQuCiAgICAgaWYgKGlzT3V0cHV0KCkpIHsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIG1TZXNzaW9uSWQpOworICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtUG9ydElkKTsKICAgICB9IGVsc2UgewogICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KG1Qb3J0SWQpOwogICAgIH0KQEAgLTgwNDMsNiArODUyNSw3IEBACiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0KICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOwogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkID0gbURldmljZUlkOworICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc2Vjb25kYXJ5T3V0cHV0czsKICAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoJm1BdHRyLCAmaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW0sCkBAIC04MDUxLDcgKzg1MzQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmRhcnlPdXRwdXRzKTsKKyAgICAgICAgQUxPR0RfSUYoIXNlY29uZGFyeU91dHB1dHMuZW1wdHkoKSwKKyAgICAgICAgICAgICAgICAgIk1tYXBUaHJlYWQ6OnN0YXJ0IGRvZXMgbm90IHN1cHBvcnQgc2Vjb25kYXJ5IG91dHB1dHMsIGlnbm9yaW5nIHRoZW0iKTsKICAgICB9IGVsc2UgewogICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZzsKICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gbVNhbXBsZVJhdGU7CkBAIC04MDc2LDIxICs4NTYyLDIwIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgYm9vbCBzaWxlbmNlZCA9IGZhbHNlOwogICAgIGlmIChpc091dHB1dCgpKSB7Ci0gICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dChtSWQsIHN0cmVhbVR5cGUoKSwgbVNlc3Npb25JZCk7CisgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dChwb3J0SWQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KHBvcnRJZCwgJnNpbGVuY2VkKTsKKyAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQocG9ydElkKTsKICAgICB9CiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIC8vIGFib3J0IGlmIHN0YXJ0IGlzIHJlamVjdGVkIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyCiAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiJXM6IGVycm9yIHN0YXJ0IHJlamVjdGVkIGJ5IEF1ZGlvUG9saWN5TWFuYWdlciA9ICVkIiwgX19GVU5DVElPTl9fLCByZXQpOwotICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgIT0gMCkgeworICAgICAgICBpZiAoIW1BY3RpdmVUcmFja3MuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgIGlmIChpc091dHB1dCgpKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIG1TZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQocG9ydElkKTsKICAgICAgICAgICAgIH0KQEAgLTgxMDEsMjEgKzg1ODYsMjEgQEAKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAorICAgIC8vIEdpdmVuIHRoYXQgTW1hcFRocmVhZDo6bUF0dHIgaXMgbXV0YWJsZSwgc2hvdWxkIGEgTW1hcFRyYWNrIGhhdmUgYXR0cmlidXRlcyA/CisgICAgc3A8TW1hcFRyYWNrPiB0cmFjayA9IG5ldyBNbWFwVHJhY2sodGhpcywgbUF0dHIsIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPdXRwdXQoKSwgY2xpZW50LmNsaWVudFVpZCwgY2xpZW50LmNsaWVudFBpZCwgcG9ydElkKTsKKwogICAgIGlmIChpc091dHB1dCgpKSB7CiAgICAgICAgIC8vIGZvcmNlIHZvbHVtZSB1cGRhdGUgd2hlbiBhIG5ldyB0cmFjayBpcyBhZGRlZAogICAgICAgICBtSGFsVm9sRmxvYXQgPSAtMS4wZjsKLSAgICB9IGVsc2UgaWYgKCFzaWxlbmNlZCkgewotICAgICAgICBmb3IgKGNvbnN0IHNwPE1tYXBUcmFjaz4gJnRyYWNrIDogbUFjdGl2ZVRyYWNrcykgewotICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1NpbGVuY2VkX2woKSAmJiB0cmFjay0+dWlkKCkgIT0gY2xpZW50LmNsaWVudFVpZCkKLSAgICAgICAgICAgICAgICB0cmFjay0+aW52YWxpZGF0ZSgpOworICAgIH0gZWxzZSBpZiAoIXRyYWNrLT5pc1NpbGVuY2VkX2woKSkgeworICAgICAgICBmb3IgKGNvbnN0IHNwPE1tYXBUcmFjaz4gJnQgOiBtQWN0aXZlVHJhY2tzKSB7CisgICAgICAgICAgICBpZiAodC0+aXNTaWxlbmNlZF9sKCkgJiYgdC0+dWlkKCkgIT0gY2xpZW50LmNsaWVudFVpZCkKKyAgICAgICAgICAgICAgICB0LT5pbnZhbGlkYXRlKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBHaXZlbiB0aGF0IE1tYXBUaHJlYWQ6Om1BdHRyIGlzIG11dGFibGUsIHNob3VsZCBhIE1tYXBUcmFjayBoYXZlIGF0dHJpYnV0ZXMgPwotICAgIHNwPE1tYXBUcmFjaz4gdHJhY2sgPSBuZXcgTW1hcFRyYWNrKHRoaXMsIG1BdHRyLCBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtU2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5jbGllbnRVaWQsIGNsaWVudC5jbGllbnRQaWQsIHBvcnRJZCk7CiAKLSAgICB0cmFjay0+c2V0U2lsZW5jZWRfbChzaWxlbmNlZCk7CiAgICAgbUFjdGl2ZVRyYWNrcy5hZGQodHJhY2spOwogICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2wobVNlc3Npb25JZCk7CiAgICAgaWYgKGNoYWluICE9IDApIHsKQEAgLTgxNjIsOCArODY0Nyw4IEBACiAKICAgICBtTG9jay51bmxvY2soKTsKICAgICBpZiAoaXNPdXRwdXQoKSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChtSWQsIHN0cmVhbVR5cGUoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRyYWNrLT5wb3J0SWQoKSk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KHRyYWNrLT5wb3J0SWQoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dCh0cmFjay0+cG9ydElkKCkpOwogICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KHRyYWNrLT5wb3J0SWQoKSk7CkBAIC04MTg4LDcgKzg2NzMsNyBAQAogICAgIGlmIChtSGFsU3RyZWFtID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSAhPSAwKSB7CisgICAgaWYgKCFtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIG1IYWxTdHJlYW0tPnN0YW5kYnkoKTsKQEAgLTgyMTksOSArODcwNCwxMSBAQAogCiAgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKQogICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBlZmZlY3RDaGFpbnM7CiAKKyAgICAgICAgeyAvLyB1bmRlciBUaHJlYWQgbG9jaworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCiAgICAgICAgIGlmIChtU2lnbmFsUGVuZGluZykgewogICAgICAgICAgICAgLy8gQSBzaWduYWwgd2FzIHJhaXNlZCB3aGlsZSB3ZSB3ZXJlIHVubG9ja2VkCiAgICAgICAgICAgICBtU2lnbmFsUGVuZGluZyA9IGZhbHNlOwpAQCAtODI1NiwxMCArODc0MywxMyBAQAogICAgICAgICB1cGRhdGVNZXRhZGF0YV9sKCk7CiAKICAgICAgICAgbG9ja0VmZmVjdENoYWluc19sKGVmZmVjdENoYWlucyk7CisgICAgICAgIH0gLy8gcmVsZWFzZSBUaHJlYWQgbG9jaworCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0Q2hhaW5zLnNpemUoKTsgaSArKykgewotICAgICAgICAgICAgZWZmZWN0Q2hhaW5zW2ldLT5wcm9jZXNzX2woKTsKKyAgICAgICAgICAgIGVmZmVjdENoYWluc1tpXS0+cHJvY2Vzc19sKCk7IC8vIFRocmVhZCBpcyBub3QgbG9ja2VkLCBidXQgZWZmZWN0IGNoYWluIGlzIGxvY2tlZAogICAgICAgICB9Ci0gICAgICAgIC8vIGVuYWJsZSBjaGFuZ2VzIGluIGVmZmVjdCBjaGFpbgorCisgICAgICAgIC8vIGVuYWJsZSBjaGFuZ2VzIGluIGVmZmVjdCBjaGFpbiwgaW5jbHVkaW5nIG1vdmluZyB0byBhbm90aGVyIHRocmVhZC4KICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7CiAgICAgICAgIC8vIEVmZmVjdCBjaGFpbnMgd2lsbCBiZSBhY3R1YWxseSBkZWxldGVkIGhlcmUgaWYgdGhleSB3ZXJlIHJlbW92ZWQgZnJvbQogICAgICAgICAvLyBtRWZmZWN0Q2hhaW5zIGxpc3QgZHVyaW5nIG1peGluZyBvciBlZmZlY3RzIHByb2Nlc3NpbmcKQEAgLTg0MTUsNyArODkwNSw3IEBACiAgICAgICAgICpoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICB9CiAKLSAgICBpZiAoaXNPdXRwdXQoKSAmJiBtUHJldk91dERldmljZSAhPSBtT3V0RGV2aWNlKSB7CisgICAgaWYgKGlzT3V0cHV0KCkgJiYgKG1QcmV2T3V0RGV2aWNlICE9IG1PdXREZXZpY2UgfHwgbURldmljZUlkICE9IGRldmljZUlkKSkgewogICAgICAgICBtUHJldk91dERldmljZSA9IHR5cGU7CiAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICAgICAgc3A8TW1hcFN0cmVhbUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CkBAIC04NDI2LDcgKzg5MTYsNyBAQAogICAgICAgICB9CiAgICAgICAgIG1EZXZpY2VJZCA9IGRldmljZUlkOwogICAgIH0KLSAgICBpZiAoIWlzT3V0cHV0KCkgJiYgbVByZXZJbkRldmljZSAhPSBtSW5EZXZpY2UpIHsKKyAgICBpZiAoIWlzT3V0cHV0KCkgJiYgKG1QcmV2SW5EZXZpY2UgIT0gbUluRGV2aWNlIHx8IG1EZXZpY2VJZCAhPSBkZXZpY2VJZCkpIHsKICAgICAgICAgbVByZXZJbkRldmljZSA9IHR5cGU7CiAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fSU5QVVRfQ09ORklHX0NIQU5HRUQpOwogICAgICAgICBzcDxNbWFwU3RyZWFtQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKQEAgLTg0NTksOSArODk0OSw5IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OmdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKIHsKLSAgICBUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBUaHJlYWRCYXNlOjp0b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOwogICAgIGlmIChpc091dHB1dCgpKSB7CiAgICAgICAgIGNvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CiAgICAgICAgIGNvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBtQXVkaW9Id0Rldi0+aGFuZGxlKCk7CkBAIC04NTIwLDI4ICs5MDEwLDYgQEAKICAgICByZXR1cm4gbUVmZmVjdENoYWlucy5zaXplKCk7CiB9CiAKLS8vIGhhc0F1ZGlvU2Vzc2lvbl9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi11aW50MzJfdCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Omhhc0F1ZGlvU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIGNvbnN0Ci17Ci0gICAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgICBpZiAoZ2V0RWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQpICE9IDApIHsKLSAgICAgICAgcmVzdWx0ID0gRUZGRUNUX1NFU1NJT047Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQWN0aXZlVHJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPE1tYXBUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwotICAgICAgICBpZiAoc2Vzc2lvbklkID09IHRyYWNrLT5zZXNzaW9uSWQoKSkgewotICAgICAgICAgICAgcmVzdWx0IHw9IFRSQUNLX1NFU1NJT047Ci0gICAgICAgICAgICBpZiAodHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgfD0gRkFTVF9TRVNTSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCiB2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6dGhyZWFkTG9vcF9zdGFuZGJ5KCkKIHsKICAgICBtSGFsU3RyZWFtLT5zdGFuZGJ5KCk7CkBAIC04NjI2LDcgKzkwOTQsNyBAQAogICAgIGRwcmludGYoZmQsICIgIEF0dHJpYnV0ZXM6IGNvbnRlbnQgdHlwZSAlZCB1c2FnZSAlZCBzb3VyY2UgJWRcbiIsCiAgICAgICAgICAgICBtQXR0ci5jb250ZW50X3R5cGUsIG1BdHRyLnVzYWdlLCBtQXR0ci5zb3VyY2UpOwogICAgIGRwcmludGYoZmQsICIgIFNlc3Npb246ICVkIHBvcnQgSWQ6ICVkXG4iLCBtU2Vzc2lvbklkLCBtUG9ydElkKTsKLSAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgPT0gMCkgeworICAgIGlmIChtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSkgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBObyBhY3RpdmUgY2xpZW50c1xuIik7CiAgICAgfQogfQpAQCAtODYzOSw3ICs5MTA3LDcgQEAKICAgICBjb25zdCBjaGFyICpwcmVmaXggPSAiICAgICI7CiAgICAgaWYgKG51bXRyYWNrcykgewogICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0gICAgICAgIE1tYXBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOworICAgICAgICBtQWN0aXZlVHJhY2tzWzBdLT5hcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzIDsgKytpKSB7CiAgICAgICAgICAgICBzcDxNbWFwVHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKQEAgLTg4NDUsNiArOTMxMywxNSBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBQbGF5YmFja1RocmVhZDo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit7CisgICAgTW1hcFRocmVhZDo6dG9BdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBpZiAobU91dHB1dCAmJiBtT3V0cHV0LT5mbGFncyAhPSBBVURJT19PVVRQVVRfRkxBR19OT05FKSB7CisgICAgICAgIGNvbmZpZy0+Y29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgICAgIGNvbmZpZy0+ZmxhZ3Mub3V0cHV0ID0gbU91dHB1dC0+ZmxhZ3M7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFBsYXliYWNrVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKIHsKICAgICBNbWFwVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGZkLCBhcmdzKTsKQEAgLTg4NjcsNyArOTM0NCwxMyBAQAogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Ok1tYXBDYXB0dXJlVGhyZWFkOjpleGl0U3RhbmRieSgpCiB7Ci0gICAgbUlucHV0LT5zdHJlYW0tPnNldEdhaW4oMS4wZik7CisgICAgeworICAgICAgICAvLyBtSW5wdXQgbWlnaHQgaGF2ZSBiZWVuIGNsZWFyZWQgYnkgY2xlYXJJbnB1dCgpCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGlmIChtSW5wdXQgIT0gbnVsbHB0ciAmJiBtSW5wdXQtPnN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtSW5wdXQtPnN0cmVhbS0+c2V0R2FpbigxLjBmKTsKKyAgICAgICAgfQorICAgIH0KICAgICByZXR1cm4gTW1hcFRocmVhZDo6ZXhpdFN0YW5kYnkoKTsKIH0KIApAQCAtODkzNSw0ICs5NDE4LDEzIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcENhcHR1cmVUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoreworICAgIE1tYXBUaHJlYWQ6OnRvQXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgaWYgKG1JbnB1dCAmJiBtSW5wdXQtPmZsYWdzICE9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSkgeworICAgICAgICBjb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgICAgICBjb25maWctPmZsYWdzLmlucHV0ID0gbUlucHV0LT5mbGFnczsKKyAgICB9Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCmluZGV4IGVhMjk0NTUuLjQ3ZTU4MGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaApAQCAtMjgxLDcgKzI4MSw3IEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpID0gMDsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgPSAwOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSA9IDA7CiAKIAogICAgICAgICAgICAgICAgIC8vIHNlZSBub3RlIGF0IGRlY2xhcmF0aW9uIG9mIG1TdGFuZGJ5LCBtT3V0RGV2aWNlIGFuZCBtSW5EZXZpY2UKQEAgLTM1Niw2ICszNTYsMjcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc0F1ZGlvU2Vzc2lvbl9sKHNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgICAgICAgICAgICAgdWludDMyX3QgaGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwgY29uc3QgVCYgdHJhY2tzKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gRUZGRUNUX1NFU1NJT047CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0cmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQmFzZT4mIHRyYWNrID0gdHJhY2tzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25JZCA9PSB0cmFjay0+c2Vzc2lvbklkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXRyYWNrLT5pc0ludmFsaWQoKSAgICAgICAvLyBub3QgeWV0IHJlbW92ZWQgZnJvbSB0cmFja3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICF0cmFjay0+aXNUZXJtaW5hdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gVFJBQ0tfU0VTU0lPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IEZBU1RfU0VTU0lPTjsgIC8vIGNhdXRpb24sIG9ubHkgcmVwcmVzZW50cyBmaXJzdCB0cmFjay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAvLyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBub3QgaW1wb3J0YW50IGFzIHRoZQogICAgICAgICAgICAgICAgIC8vIHN0cmF0ZWd5IGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgUGxheWJhY2tUaHJlYWQgd2hpY2ggaW1wbGVtZW50cyB0aGlzIG1ldGhvZAogICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCBfX3VudXNlZCkKQEAgLTM5Myw2ICs0MTQsMTUgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgYnJvYWRjYXN0X2woKTsKIAorICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgIGlzTXNkRGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUlzTXNkRGV2aWNlOyB9CisKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICAgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSA9IDA7CisKKyAgICAgICAgICAgICAgICAvLyBkZWxpdmVyIHN0YXRzIHRvIG1lZGlhbWV0cmljcy4KKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRTdGF0aXN0aWNzKGJvb2wgZm9yY2UpOworCiAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7CiAKIHByb3RlY3RlZDoKQEAgLTQzNCw2ICs0NjQsMTIgQEAKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRNYXN0ZXJNb25vX2woYm9vbCBtb25vIF9fdW51c2VkKSB7IH0KICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICByZXF1aXJlTW9ub0JsZW5kKCkgeyByZXR1cm4gZmFsc2U7IH0KIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlZCB3aXRoaW4gdGhlIHRocmVhZExvb3AgdG8gb2J0YWluIHRpbWVzdGFtcCBmcm9tIHRoZSBIQUwuCisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgdGhyZWFkbG9vcF9nZXRIYWxUaW1lc3RhbXBfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wICp0aW1lc3RhbXAgX191bnVzZWQpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgIGZyaWVuZCBjbGFzcyBBdWRpb0ZsaW5nZXI7ICAgICAgLy8gZm9yIG1FZmZlY3RDaGFpbnMKIAogICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVfdCAgICAgICAgICAgIG1UeXBlOwpAQCAtNDczLDYgKzUwOSwxMCBAQAogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1QcmV2T3V0RGV2aWNlOyAgIC8vIHByZXZpb3VzIG91dHB1dCBkZXZpY2UKICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICBtUHJldkluRGV2aWNlOyAgICAvLyBwcmV2aW91cyBpbnB1dCBkZXZpY2UKICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggICAgICBtUGF0Y2g7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogQGJyaWVmIG1EZXZpY2VJZCAgY3VycmVudCBkZXZpY2UgcG9ydCB1bmlxdWUgaWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1EZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgICAgICAgICAgbUF1ZGlvU291cmNlOwogCiAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgbUlkOwpAQCAtNDkzLDEwICs1MzMsMzEgQEAKICAgICAgICAgICAgICAgICBzcDxOQkxvZzo6V3JpdGVyPiAgICAgICBtTkJMb2dXcml0ZXI7CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVJlYWR5OwogICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wICAgICAgIG1UaW1lc3RhbXA7CisgICAgICAgICAgICAgICAgVGltZXN0YW1wVmVyaWZpZXI8IC8vIEZvciB0aW1lc3RhbXAgc3RhdGlzdGljcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgLyogZnJhbWUgY291bnQgKi8sIGludDY0X3QgLyogdGltZSBucyAqLz4gbVRpbWVzdGFtcFZlcmlmaWVyOworICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7CisKKyAgICAgICAgICAgICAgICAvLyBUaHJlYWRMb29wIHN0YXRpc3RpY3MgcGVyIGl0ZXJhdGlvbi4KKyAgICAgICAgICAgICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICBtTGFzdElvQmVnaW5OcyA9IC0xOworICAgICAgICAgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1MYXN0SW9FbmROcyA9IC0xOworCisgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgcmVhZCB1bmRlciBUaHJlYWRCYXNlIGxvY2sgKGlmIG5vdCBvbiB0aGUgdGhyZWFkTG9vcCB0aHJlYWQpLgorICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbUlvSml0dGVyTXN7MC45OTUgLyogYWxwaGEgKi99OworICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbVByb2Nlc3NUaW1lTXN7MC45OTUgLyogYWxwaGEgKi99OworICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbUxhdGVuY3lNc3swLjk5NSAvKiBhbHBoYSAqL307CisKKyAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSBsYXN0IGNvdW50IHdoZW4gd2UgZGVsaXZlcmVkIHN0YXRpc3RpY3MgdG8gbWVkaWFtZXRyaWNzLgorICAgICAgICAgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1MYXN0UmVjb3JkZWRUaW1lc3RhbXBWZXJpZmllck4gPSAwOworICAgICAgICAgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1MYXN0UmVjb3JkZWRUaW1lTnMgPSAwOyAgLy8gQk9PVFRJTUUgdG8gaW5jbHVkZSBzdXNwZW5kLgorCisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUlzTXNkRGV2aWNlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgLy8gQSBjb25kaXRpb24gdGhhdCBtdXN0IGJlIGV2YWx1YXRlZCBieSB0aGUgdGhyZWFkIGxvb3AgaGFzIGNoYW5nZWQgYW5kCiAgICAgICAgICAgICAgICAgLy8gd2UgbXVzdCBub3Qgd2FpdCBmb3IgYXN5bmMgd3JpdGUgY2FsbGJhY2sgaW4gdGhlIHRocmVhZCBsb29wIGJlZm9yZSBldmFsdWF0aW5nIGl0CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVNpZ25hbFBlbmRpbmc7CiAKKyNpZmRlZiBURUVfU0lOSworICAgICAgICAgICAgICAgIE5CQUlPX1RlZSAgICAgICAgICAgICAgIG1UZWU7CisjZW5kaWYKICAgICAgICAgICAgICAgICAvLyBBY3RpdmVUcmFja3MgaXMgYSBzb3J0ZWQgdmVjdG9yIG9mIHRyYWNrIHR5cGUgVCByZXByZXNlbnRpbmcgdGhlCiAgICAgICAgICAgICAgICAgLy8gYWN0aXZlIHRyYWNrcyBvZiB0aHJlYWRMb29wKCkgdG8gYmUgY29uc2lkZXJlZCBieSB0aGUgbG9ja2VkIHByZXBhcmUgcG9ydGlvbi4KICAgICAgICAgICAgICAgICAvLyBBY3RpdmVUcmFja3Mgc2hvdWxkIGJlIGFjY2Vzc2VkIHdpdGggdGhlIFRocmVhZEJhc2UgbG9jayBoZWxkLgpAQCAtNTQzLDYgKzYwNCw5IEBACiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBzaXplKCkgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVUcmFja3Muc2l6ZSgpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVUcmFja3MuaXNFbXB0eSgpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBpbmRleE9mKGNvbnN0IHNwPFQ+JiBpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVRyYWNrcy5pbmRleE9mKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC02NDUsNyArNzA5LDcgQEAKICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgdHlwZV90IHR5cGUsIGJvb2wgc3lzdGVtUmVhZHkpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflBsYXliYWNrVGhyZWFkKCk7CiAKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwpAQCAtNzA3LDYgKzc3MSw3IEBACiAKICAgICAgICAgICAgICAgICAvLyBWb2x1bWVJbnRlcmZhY2UKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdmFsdWUpOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgc2V0TWFzdGVyTXV0ZShib29sIG11dGVkKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGZsb2F0IHZhbHVlKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sIG11dGVkKTsKQEAgLTc2Niw3ICs4MzEsOSBAQAogCiAgICAgICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pOwogICAgICAgICAgICAgICAgIHZpcnR1YWwgc2l6ZV90IHJlbW92ZUVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbik7Ci0gICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBoYXNBdWRpb1Nlc3Npb25fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGhhc0F1ZGlvU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGhyZWFkQmFzZTo6aGFzQXVkaW9TZXNzaW9uX2woc2Vzc2lvbklkLCBtVHJhY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOwogCiAKQEAgLTc4NCw3ICs4NTEsNyBAQAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGFkZFBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hUcmFjaz4mIHRyYWNrKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkZWxldGVQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoVHJhY2s+JiB0cmFjayk7CiAKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKIAogICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgYXN5bmNocm9ub3VzIHNpZ25hbCB3YWl0IHRpbWUuCiAgICAgdmlydHVhbCAgICAgaW50NjRfdCAgICAgY29tcHV0ZVdhaXRUaW1lTnNfbCgpIGNvbnN0IHsgcmV0dXJuIElOVDY0X01BWDsgfQpAQCAtODAxLDYgKzg2OCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVRyYWNrcy5zaXplKCkgPCBQbGF5YmFja1RocmVhZDo6a01heFRyYWNrczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBib29sICAgICAgICBpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0RGV2aWNlICYgbVRpbWVzdGFtcENvcnJlY3RlZERldmljZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdWRpb19pc19vdXRwdXRfZGV2aWNlcyhkZXZpY2UpICYmIHBvcGNvdW50KGRldmljZSkgPiAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIHByb3RlY3RlZDoKICAgICAvLyB1cGRhdGVkIGJ5IHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKQogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQ7ICAvLyBub3JtYWwgbWl4ZXIgYW5kIGVmZmVjdHMKQEAgLTg4MCw2ICs5NTIsMTEgQEAKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW47CiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbjsgLy8gbm90IHJlc2V0IG9uIHN0YW5kYnkKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1TdXNwZW5kZWRGcmFtZXM7IC8vIG5vdCByZXNldCBvbiBzdGFuZGJ5CisKKyAgICAvLyBtSGFwdGljQ2hhbm5lbE1hc2sgYW5kIG1IYXB0aWNDaGFubmVsQ291bnQgd2lsbCBvbmx5IGJlIHZhbGlkIHdoZW4gdGhlIHRocmVhZCBzdXBwb3J0CisgICAgLy8gaGFwdGljIHBsYXliYWNrLgorICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICAgICAgICAgICAgbUhhcHRpY0NoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgbUhhcHRpY0NoYW5uZWxDb3VudCA9IDA7CiBwcml2YXRlOgogICAgIC8vIG1NYXN0ZXJNdXRlIGlzIGluIGJvdGggUGxheWJhY2tUaHJlYWQgYW5kIGluIEF1ZGlvRmxpbmdlci4gIFdoZW4gYQogICAgIC8vIFBsYXliYWNrVGhyZWFkIG5lZWRzIHRvIGZpbmQgb3V0IGlmIG1hc3Rlci1tdXRlZCwgaXQgY2hlY2tzIGl0J3MgbG9jYWwKQEAgLTkzNSwxNiArMTAxMiwxOSBAQAogICAgIHZpcnR1YWwgdm9pZCBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgdm9pZCAgICAgICAgZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCi0gICAgLy8gVGhlIFRyYWNrcyBjbGFzcyBtYW5hZ2VzIG5hbWVzIGZvciBhbGwgdHJhY2tzCi0gICAgLy8gYWRkZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgVGhyZWFkLgorICAgIC8vIFRoZSBUcmFja3MgY2xhc3MgbWFuYWdlcyB0cmFja3MgYWRkZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgVGhyZWFkLgogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgIGNsYXNzIFRyYWNrcyB7CiAgICAgcHVibGljOgotICAgICAgICBUcmFja3MoYm9vbCBzYXZlRGVsZXRlZFRyYWNrTmFtZXMpIDoKLSAgICAgICAgICAgIG1TYXZlRGVsZXRlZFRyYWNrTmFtZXMoc2F2ZURlbGV0ZWRUcmFja05hbWVzKSB7IH0KKyAgICAgICAgVHJhY2tzKGJvb2wgc2F2ZURlbGV0ZWRUcmFja0lkcykgOgorICAgICAgICAgICAgbVNhdmVEZWxldGVkVHJhY2tJZHMoc2F2ZURlbGV0ZWRUcmFja0lkcykgeyB9CiAKICAgICAgICAgLy8gU29ydGVkVmVjdG9yIG1ldGhvZHMKLSAgICAgICAgc3NpemVfdCAgICAgICAgIGFkZChjb25zdCBzcDxUPiAmdHJhY2spOworICAgICAgICBzc2l6ZV90ICAgICAgICAgYWRkKGNvbnN0IHNwPFQ+ICZ0cmFjaykgeworICAgICAgICAgICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1UcmFja3MuYWRkKHRyYWNrKTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5kZXggPCAwLCAiY2Fubm90IGFkZCB0cmFjayIpOworICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICB9CiAgICAgICAgIHNzaXplX3QgICAgICAgICByZW1vdmUoY29uc3Qgc3A8VD4gJnRyYWNrKTsKICAgICAgICAgc2l6ZV90ICAgICAgICAgIHNpemUoKSBjb25zdCB7CiAgICAgICAgICAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7CkBAIC05NjUsMjggKzEwNDUsMTkgQEAKICAgICAgICAgICAgIHJldHVybiBtVHJhY2tzLmVuZCgpOwogICAgICAgICB9CiAKLSAgICAgICAgc2l6ZV90ICAgICAgICAgIHByb2Nlc3NEZWxldGVkVHJhY2tOYW1lcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50KT4gZikgewotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBtRGVsZXRlZFRyYWNrTmFtZXMuc2l6ZSgpOwotICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpbnQgbmFtZSA6IG1EZWxldGVkVHJhY2tOYW1lcykgewotICAgICAgICAgICAgICAgICAgICBmKG5hbWUpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgc2l6ZV90ICAgICAgICAgIHByb2Nlc3NEZWxldGVkVHJhY2tJZHMoc3RkOjpmdW5jdGlvbjx2b2lkKGludCk+IGYpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgaW50IHRyYWNrSWQgOiBtRGVsZXRlZFRyYWNrSWRzKSB7CisgICAgICAgICAgICAgICAgZih0cmFja0lkKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICAgICAgcmV0dXJuIG1EZWxldGVkVHJhY2tJZHMuc2l6ZSgpOwogICAgICAgICB9CiAKLSAgICAgICAgdm9pZCAgICAgICAgICAgIGNsZWFyRGVsZXRlZFRyYWNrTmFtZXMoKSB7IG1EZWxldGVkVHJhY2tOYW1lcy5jbGVhcigpOyB9CisgICAgICAgIHZvaWQgICAgICAgICAgICBjbGVhckRlbGV0ZWRUcmFja0lkcygpIHsgbURlbGV0ZWRUcmFja0lkcy5jbGVhcigpOyB9CiAKICAgICBwcml2YXRlOgotICAgICAgICAvLyBUcmFjayBuYW1lcyBwZW5kaW5nIGRlbGV0aW9uIGZvciBNSVhFUiB0eXBlIHRocmVhZHMKLSAgICAgICAgY29uc3QgYm9vbCBtU2F2ZURlbGV0ZWRUcmFja05hbWVzOyAvLyB0cnVlIHRvIGVuYWJsZSB0cmFja2luZwotICAgICAgICBzdGQ6OnNldDxpbnQ+IG1EZWxldGVkVHJhY2tOYW1lczsKLQotICAgICAgICAvLyBGYXN0IGxvb2t1cCBvZiBwcmV2aW91c2x5IGRlbGV0ZWQgdHJhY2sgbmFtZXMgZm9yIHJldXNlLgotICAgICAgICAvLyBUaGlzIGlzIGFuIGFyYml0cmFyeSBkZWNpc2lvbiAoYWN0dWFsbHkgYW55IG5vbi1uZWdhdGl2ZQotICAgICAgICAvLyBpbnRlZ2VyIHRoYXQgaXNuJ3QgaW4gbVRyYWNrc1sqXS0+bmFtZXMoKSBjb3VsZCBiZSB1c2VkKSAtIHdlIGF0dGVtcHQKLSAgICAgICAgLy8gdG8gdXNlIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBhdmFpbGFibGUgbmFtZS4KLSAgICAgICAgc3RkOjpzZXQ8aW50PiBtVW51c2VkVHJhY2tOYW1lczsKKyAgICAgICAgLy8gVHJhY2tzIHBlbmRpbmcgZGVsZXRpb24gZm9yIE1JWEVSIHR5cGUgdGhyZWFkcworICAgICAgICBjb25zdCBib29sIG1TYXZlRGVsZXRlZFRyYWNrSWRzOyAvLyB0cnVlIHRvIGVuYWJsZSB0cmFja2luZworICAgICAgICBzdGQ6OnNldDxpbnQ+IG1EZWxldGVkVHJhY2tJZHM7CiAKICAgICAgICAgU29ydGVkVmVjdG9yPHNwPFQ+PiBtVHJhY2tzOyAvLyB3cmFwcGVkIFNvcnRlZFZlY3Rvci4KICAgICB9OwpAQCAtOTk3LDcgKzEwNjgsOCBAQAogICAgIEF1ZGlvU3RyZWFtT3V0ICAgICAgICAgICAgICAgICAgKm1PdXRwdXQ7CiAKICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJWb2x1bWU7Ci0gICAgbnNlY3NfdCAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFdyaXRlVGltZTsKKyAgICBzdGQ6OmF0b21pYzxmbG9hdD4gICAgICAgICAgICAgIG1NYXN0ZXJCYWxhbmNle307CisgICAgYXVkaW9fdXRpbHM6OkJhbGFuY2UgICAgICAgICAgICBtQmFsYW5jZTsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1Xcml0ZXM7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtRGVsYXllZFdyaXRlczsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbldyaXRlOwpAQCAtMTA1NiwxNiArMTEyOCwxMyBAQAogICAgIHNwPE5CQUlPX1Npbms+ICAgICAgICAgIG1QaXBlU2luazsKICAgICAvLyBUaGUgY3VycmVudCBzaW5rIGZvciB0aGUgbm9ybWFsIG1peGVyIHRvIHdyaXRlIGl0J3MgKHN1YiltaXgsIG1PdXRwdXRTaW5rIG9yIG1QaXBlU2luawogICAgIHNwPE5CQUlPX1Npbms+ICAgICAgICAgIG1Ob3JtYWxTaW5rOwotI2lmZGVmIFRFRV9TSU5LCi0gICAgLy8gRm9yIGR1bXBzeXMKLSAgICBzcDxOQkFJT19TaW5rPiAgICAgICAgICBtVGVlU2luazsKLSAgICBzcDxOQkFJT19Tb3VyY2U+ICAgICAgICBtVGVlU291cmNlOwotI2VuZGlmCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNjcmVlblN0YXRlOyAgIC8vIGNhY2hlZCBjb3B5IG9mIGdTY3JlZW5TdGF0ZQogICAgIC8vIFRPRE86IGFkZCBjb21tZW50IGFuZCBhZGp1c3Qgc2l6ZSBhcyBuZWVkZWQKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90ICAgICBrRmFzdE1peGVyTG9nU2l6ZSA9IDggKiAxMDI0OwogICAgIHNwPE5CTG9nOjpXcml0ZXI+ICAgICAgIG1GYXN0TWl4ZXJOQkxvZ1dyaXRlcjsKIAorICAgIC8vIERvd25zdHJlYW0gcGF0Y2ggbGF0ZW5jeSwgYXZhaWxhYmxlIGlmIG1Eb3duc3RyZWFtTGF0ZW5jeVN0YXRNcy5nZXROKCkgPiAwLgorICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbURvd25zdHJlYW1MYXRlbmN5U3RhdE1zezAuOTk5fTsKIAogcHVibGljOgogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGhhc0Zhc3RNaXhlcigpIGNvbnN0ID0gMDsKQEAgLTExMjEsNyArMTE5MCw2IEBACiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdGhyZWFkTG9vcF9zdGFuZGJ5KCk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdGhyZWFkTG9vcF9taXgoKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0aHJlYWRMb29wX3NsZWVwVGltZSgpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRocmVhZExvb3BfcmVtb3ZlVHJhY2tzKGNvbnN0IFZlY3Rvcjwgc3A8VHJhY2s+ID4mIHRyYWNrc1RvUmVtb3ZlKTsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBjb3JyZWN0TGF0ZW5jeV9sKHVpbnQzMl90IGxhdGVuY3kpIGNvbnN0OwogCiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCkBAIC0xMTU0LDYgKzEyMjIsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtRmFzdE1peGVyRHVtcFN0YXRlLm1UcmFja3NbZmFzdEluZGV4XS5tVW5kZXJydW5zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHRocmVhZGxvb3BfZ2V0SGFsVGltZXN0YW1wX2woCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCAqdGltZXN0YW1wKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTm9ybWFsU2luay5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbU5vcm1hbFNpbmstPmdldFRpbWVzdGFtcCgqdGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICBzZXRNYXN0ZXJNb25vX2woYm9vbCBtb25vKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hc3Rlck1vbm8uc3RvcmUobW9ubyk7CkBAIC0xMTY1LDIxICsxMjQxLDM3IEBACiAgICAgICAgICAgICAgICAgLy8gQmxlbmRpbmcgd2l0aCBsaW1pdGVyIGlzIG5vdCBpZGVtcG90ZW50LAogICAgICAgICAgICAgICAgIC8vIGFuZCBibGVuZGluZyB3aXRob3V0IGxpbWl0ZXIgaXMgaWRlbXBvdGVudCBidXQgaW5lZmZpY2llbnQgdG8gZG8gdHdpY2UuCiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICByZXF1aXJlTW9ub0JsZW5kKCkgeyByZXR1cm4gbU1hc3Rlck1vbm8ubG9hZCgpICYmICFoYXNGYXN0TWl4ZXIoKTsgfQorCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICBzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyQmFsYW5jZS5zdG9yZShiYWxhbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzRmFzdE1peGVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZhc3RNaXhlci0+c2V0TWFzdGVyQmFsYW5jZShiYWxhbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiB9OwogCiBjbGFzcyBEaXJlY3RPdXRwdXRUaHJlYWQgOiBwdWJsaWMgUGxheWJhY2tUaHJlYWQgewogcHVibGljOgogCiAgICAgRGlyZWN0T3V0cHV0VGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGJvb2wgc3lzdGVtUmVhZHkpOworICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSkKKyAgICAgICAgOiBEaXJlY3RPdXRwdXRUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIERJUkVDVCwgc3lzdGVtUmVhZHkpIHsgfQorCiAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfkRpcmVjdE91dHB1dFRocmVhZCgpOwogCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCk7CisKICAgICAvLyBUaHJlYWQgdmlydHVhbHMKIAogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cyk7CisKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CisKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBmbHVzaEh3X2woKTsKIAorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSkgb3ZlcnJpZGU7CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBhY3RpdmVTbGVlcFRpbWVVcygpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGlkbGVTbGVlcFRpbWVVcygpIGNvbnN0OwpAQCAtMTE5NSwxMCArMTI4NywxMCBAQAogCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgb25BZGROZXdUcmFja19sKCk7CiAKLSAgICBib29sIG1Wb2x1bWVTaGFwZXJBY3RpdmU7CisgICAgYm9vbCBtVm9sdW1lU2hhcGVyQWN0aXZlID0gZmFsc2U7CiAKICAgICBEaXJlY3RPdXRwdXRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIHVpbnQzMl90IGRldmljZSwgVGhyZWFkQmFzZTo6dHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgVGhyZWFkQmFzZTo6dHlwZV90IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5c3RlbVJlYWR5KTsKICAgICB2b2lkIHByb2Nlc3NWb2x1bWVfbChUcmFjayAqdHJhY2ssIGJvb2wgbGFzdFRyYWNrKTsKIApAQCAtMTIwNywxMCArMTI5OSwzMSBAQAogCiAgICAgd3A8VHJhY2s+ICAgICAgICAgICAgICAgbVByZXZpb3VzVHJhY2s7ICAgICAgICAgLy8gdXNlZCB0byBkZXRlY3QgdHJhY2sgc3dpdGNoCiAKKyAgICAvLyBUaGlzIG11c3QgYmUgaW5pdGlhbGl6ZWQgZm9yIGluaXRpYWwgY29uZGl0aW9uIG9mIG1NYXN0ZXJCYWxhbmNlID0gMCAoZGlzYWJsZWQpLgorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJCYWxhbmNlTGVmdCA9IDEuZjsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtTWFzdGVyQmFsYW5jZVJpZ2h0ID0gMS5mOworCiBwdWJsaWM6CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaGFzRmFzdE1peGVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KIAogICAgIHZpcnR1YWwgICAgIGludDY0X3QgICAgIGNvbXB1dGVXYWl0VGltZU5zX2woKSBjb25zdCBvdmVycmlkZTsKKworICAgIHN0YXR1c190ICAgIHRocmVhZGxvb3BfZ2V0SGFsVGltZXN0YW1wX2woRXh0ZW5kZWRUaW1lc3RhbXAgKnRpbWVzdGFtcCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAvLyBGb3IgRElSRUNUIGFuZCBPRkZMT0FEIHRocmVhZHMsIHF1ZXJ5IHRoZSBvdXRwdXQgc2luayBkaXJlY3RseS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1PdXRwdXQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdXBvc2l0aW9uNjQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0LT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVwb3NpdGlvbjY0LCAmdGltZSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoaW50NjRfdCl1cG9zaXRpb242NDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYXVkaW9fdXRpbHNfbnNfZnJvbV90aW1lc3BlYygmdGltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICB9CiB9OwogCiBjbGFzcyBPZmZsb2FkVGhyZWFkIDogcHVibGljIERpcmVjdE91dHB1dFRocmVhZCB7CkBAIC0xMzE4LDYgKzE0MzEsMjIgQEAKICAgICBTb3J0ZWRWZWN0b3IgPCBzcDxPdXRwdXRUcmFjaz4gPiAgbU91dHB1dFRyYWNrczsKIHB1YmxpYzoKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBoYXNGYXN0TWl4ZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHRocmVhZGxvb3BfZ2V0SGFsVGltZXN0YW1wX2woCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCAqdGltZXN0YW1wKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIGlmIChtT3V0cHV0VHJhY2tzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIC8vIGZvcndhcmQgdGhlIGZpcnN0IE91dHB1dFRyYWNrJ3Mga2VybmVsIGluZm9ybWF0aW9uIGZvciB0aW1lc3RhbXAuCisgICAgICAgICAgICBjb25zdCBFeHRlbmRlZFRpbWVzdGFtcCB0cmFja1RpbWVzdGFtcCA9CisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRUcmFja3NbMF0tPmdldENsaWVudFByb3h5VGltZXN0YW1wKCk7CisgICAgICAgICAgICBpZiAodHJhY2tUaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA+IDApIHsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tUaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1RpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOyAgLy8gZGlzY2FyZCBzZXJ2ZXIgdGltZXN0YW1wIC0gdGhhdCdzIGlnbm9yZWQuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KIH07CiAKIC8vIHJlY29yZCB0aHJlYWQKQEAgLTEzNzYsOSArMTUwNSw2IEBACiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgYm9vbCBzeXN0ZW1SZWFkeQotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgICAgICAgICAgICAgICwgY29uc3Qgc3A8TkJBSU9fU2luaz4mIHRlZVNpbmsKLSNlbmRpZgogICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgdmlydHVhbCAgICAgflJlY29yZFRocmVhZCgpOwogCkBAIC0xNDI1LDcgKzE1NTEsNyBAQAogICAgICAgICAgICAgLy8gcmV0dXJuIHRydWUgaWYgdGhlIGNhbGxlciBzaG91bGQgdGhlbiBkbyBpdCdzIHBhcnQgb2YgdGhlIHN0b3BwaW5nIHByb2Nlc3MKICAgICAgICAgICAgIGJvb2wgICAgICAgIHN0b3AoUmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrKTsKIAotICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiogY2xlYXJJbnB1dCgpOwogICAgICAgICAgICAgdmlydHVhbCBzcDxTdHJlYW1IYWxJbnRlcmZhY2U+IHN0cmVhbSgpIGNvbnN0OwogCkBAIC0xNDM5LDE1ICsxNTY1LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CiAKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGFkZFBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGRlbGV0ZVBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFkZFBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgZGVsZXRlUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCk7CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpOwogICAgIHZpcnR1YWwgdWludDMyX3QgICAgZ2V0SW5wdXRGcmFtZXNMb3N0KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbik7CiAgICAgdmlydHVhbCBzaXplX3QgcmVtb3ZlRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKLSAgICB2aXJ0dWFsIHVpbnQzMl90IGhhc0F1ZGlvU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIGNvbnN0OworICAgICAgICAgICAgdWludDMyX3QgaGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWRCYXNlOjpoYXNBdWRpb1Nlc3Npb25fbChzZXNzaW9uSWQsIG1UcmFja3MpOworICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIHNldCBvZiB1bmlxdWUgc2Vzc2lvbiBJRHMgYWNyb3NzIGFsbCB0cmFja3MuCiAgICAgICAgICAgICAvLyBUaGUga2V5cyBhcmUgdGhlIHNlc3Npb24gSURzLCBhbmQgdGhlIGFzc29jaWF0ZWQgdmFsdWVzIGFyZSBtZWFuaW5nbGVzcy4KQEAgLTE0NjEsNyArMTU4OSw3IEBACiAKICAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lQ291bnQoKSBjb25zdCB7IHJldHVybiBtRnJhbWVDb3VudDsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaGFzRmFzdENhcHR1cmUoKSBjb25zdCB7IHJldHVybiBtRmFzdENhcHR1cmUgIT0gMDsgfQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgZ2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5X2woY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOwpAQCAtMTQ3OSw4ICsxNjA3LDE4IEBACiAKICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKIAorICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0TWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7CisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CisKICAgICAgICAgICAgIHZvaWQgICAgICAgIHVwZGF0ZU1ldGFkYXRhX2woKSBvdmVycmlkZTsKIAorICAgICAgICAgICAgYm9vbCAgICAgICAgZmFzdFRyYWNrQXZhaWxhYmxlKCkgY29uc3QgeyByZXR1cm4gbUZhc3RUcmFja0F2YWlsOyB9CisKKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2tzIHBvcGNvdW50IGZvciBleGFjdGx5IG9uZSBkZXZpY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF1ZGlvX2lzX2lucHV0X2RldmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbkRldmljZSAmIG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIHByaXZhdGU6CiAgICAgICAgICAgICAvLyBFbnRlciBzdGFuZGJ5IGlmIG5vdCBhbHJlYWR5IGluIHN0YW5kYnksIGFuZCBzZXQgbVN0YW5kYnkgZmxhZwogICAgICAgICAgICAgdm9pZCAgICBzdGFuZGJ5SWZOb3RBbHJlYWR5SW5TdGFuZGJ5KCk7CkBAIC0xNTA4LDggKzE2NDYsNiBAQAogICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJblJlYXI7ICAgIC8vIGxhc3QgZmlsbGVkIGZyYW1lICsgMQogCiAgICAgICAgICAgICAvLyBGb3IgZHVtcHN5cwotICAgICAgICAgICAgY29uc3Qgc3A8TkJBSU9fU2luaz4gICAgICAgICAgICAgICAgbVRlZVNpbms7Ci0KICAgICAgICAgICAgIGNvbnN0IHNwPE1lbW9yeURlYWxlcj4gICAgICAgICAgICAgIG1SZWFkT25seUhlYXA7CiAKICAgICAgICAgICAgIC8vIG9uZS10aW1lIGluaXRpYWxpemF0aW9uLCBubyBsb2NrcyByZXF1aXJlZApAQCAtMTU1Miw2ICsxNjg4LDggQEAKICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GYXN0VHJhY2tBdmFpbDsgICAgLy8gdHJ1ZSBpZiBmYXN0IHRyYWNrIGF2YWlsYWJsZQogICAgICAgICAgICAgLy8gY29tbW9uIHN0YXRlIHRvIGFsbCByZWNvcmQgdGhyZWFkcwogICAgICAgICAgICAgc3RkOjphdG9taWNfYm9vbCAgICAgICAgICAgICAgICAgICAgbUJ0TnJlY1N1c3BlbmRlZDsKKworICAgICAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1JlYWQgPSAwOyAgICAvLyBjb250aW51b3VzIHJ1bm5pbmcgY291bnRlci4KIH07CiAKIGNsYXNzIE1tYXBUaHJlYWQgOiBwdWJsaWMgVGhyZWFkQmFzZQpAQCAtMTYwNCw3ICsxNzQyLDcgQEAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgcmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwogCiAgICAgdmlydHVhbCAgICAgc3A8U3RyZWFtSGFsSW50ZXJmYWNlPiBzdHJlYW0oKSBjb25zdCB7IHJldHVybiBtSGFsU3RyZWFtOyB9CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgYWRkRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKQEAgLTE2MTIsNyArMTc1MCwxMCBAQAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGNoZWNrRWZmZWN0Q29tcGF0aWJpbGl0eV9sKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKIAotICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGhhc0F1ZGlvU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIGNvbnN0OworICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIGhhc0F1ZGlvU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogdXNpbmcgbUFjdGl2ZVRyYWNrcyBhcyBubyBtVHJhY2tzIGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWRCYXNlOjpoYXNBdWRpb1Nlc3Npb25fbChzZXNzaW9uSWQsIG1BY3RpdmVUcmFja3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBzZXRTeW5jRXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpOwogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGlzVmFsaWRTeW5jRXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpIGNvbnN0OwogCkBAIC0xNjI3LDcgKzE3NjgsNyBAQAogICAgICAgICAgICAgICAgIC8vIFNldHMgdGhlIFVJRCByZWNvcmRzIHNpbGVuY2UKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQgX191bnVzZWQsIGJvb2wgc2lsZW5jZWQgX191bnVzZWQpIHt9CiAKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKQEAgLTE2MzUsNyArMTc3Niw2IEBACiAKICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgICAgICBtQXR0cjsKICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkOwotICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1EZXZpY2VJZDsKICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtUG9ydElkOwogCiAgICAgICAgICAgICAgICAgd3A8TW1hcFN0cmVhbUNhbGxiYWNrPiAgbUNhbGxiYWNrOwpAQCAtMTY4OCw2ICsxODI4LDggQEAKIAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHVwZGF0ZU1ldGFkYXRhX2woKSBvdmVycmlkZTsKIAorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKwogcHJvdGVjdGVkOgogCiAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgICAgIG1TdHJlYW1UeXBlOwpAQCAtMTcxNiw2ICsxODU4LDggQEAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICBwcm9jZXNzVm9sdW1lX2woKSBvdmVycmlkZTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpIG92ZXJyaWRlOwogCisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgICAgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCiBwcm90ZWN0ZWQ6CiAKICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUluKiAgbUlucHV0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCmluZGV4IGNjZmI2OWYuLjQ0MDJkOTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKQEAgLTI1LDEzICsyNSwxMyBAQAogcHVibGljOgogICAgIGVudW0gdHJhY2tfc3RhdGUgewogICAgICAgICBJRExFLAotICAgICAgICBGTFVTSEVELAorICAgICAgICBGTFVTSEVELCAgICAgICAgLy8gZm9yIFBsYXliYWNrVHJhY2tzIG9ubHkKICAgICAgICAgU1RPUFBFRCwKICAgICAgICAgLy8gbmV4dCAyIHN0YXRlcyBhcmUgY3VycmVudGx5IHVzZWQgZm9yIGZhc3QgdHJhY2tzCiAgICAgICAgIC8vIGFuZCBvZmZsb2FkZWQgdHJhY2tzIG9ubHkKICAgICAgICAgU1RPUFBJTkdfMSwgICAgIC8vIHdhaXRpbmcgZm9yIGZpcnN0IHVuZGVycnVuCiAgICAgICAgIFNUT1BQSU5HXzIsICAgICAvLyB3YWl0aW5nIGZvciBwcmVzZW50YXRpb24gY29tcGxldGUKLSAgICAgICAgUkVTVU1JTkcsCisgICAgICAgIFJFU1VNSU5HLCAgICAgICAvLyBmb3IgUGxheWJhY2tUcmFja3Mgb25seQogICAgICAgICBBQ1RJVkUsCiAgICAgICAgIFBBVVNJTkcsCiAgICAgICAgIFBBVVNFRCwKQEAgLTU0LDExICs1NCw2IEBACiAgICAgICAgIFRZUEVfUEFUQ0gsCiAgICAgfTsKIAotICAgIGVudW0gewotICAgICAgICBUUkFDS19OQU1FX1BFTkRJTkcgPSAtMSwKLSAgICAgICAgVFJBQ0tfTkFNRV9GQUlMVVJFID0gLTIsCi0gICAgfTsKLQogICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tCYXNlKFRocmVhZEJhc2UgKnRocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIG1BdHRyLApAQCAtOTEsNiArODYsNyBAQAogICAgICAgICAgICAgdm9pZCogICAgICAgYnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlcjsgfQogICAgICAgICAgICAgc2l6ZV90ICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXJTaXplOyB9CiAgICAgdmlydHVhbCBib29sICAgICAgICBpc0Zhc3RUcmFjaygpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRGlyZWN0KCkgY29uc3QgPSAwOwogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNPdXRwdXRUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX09VVFBVVCk7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzUGF0Y2hUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX1BBVENIKTsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNFeHRlcm5hbFRyYWNrKCkgY29uc3QgeyByZXR1cm4gIWlzT3V0cHV0VHJhY2soKSAmJiAhaXNQYXRjaFRyYWNrKCk7IH0KQEAgLTk4LDggKzk0LDExMSBAQAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgaW52YWxpZGF0ZSgpIHsgbUlzSW52YWxpZCA9IHRydWU7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzSW52YWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1Jc0ludmFsaWQ7IH0KIAorICAgICAgICAgICAgdm9pZCAgICAgICAgdGVybWluYXRlKCkgeyBtVGVybWluYXRlZCA9IHRydWU7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzVGVybWluYXRlZCgpIGNvbnN0IHsgcmV0dXJuIG1UZXJtaW5hdGVkOyB9CisKICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgIGF0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBtQXR0cjsgfQogCisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgICAgdm9pZCAgICAgICAgIGR1bXBUZWUoaW50IGZkLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVhc29uKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZWUuZHVtcChmZCwgcmVhc29uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAvKiogcmV0dXJucyB0aGUgYnVmZmVyIGNvbnRlbnRzIHNpemUgY29udmVydGVkIHRvIHRpbWUgaW4gbWlsbGlzZWNvbmRzCisgICAgICAgICAgICAgKiBmb3IgUENNIFBsYXliYWNrIG9yIFJlY29yZCBzdHJlYW1pbmcgdHJhY2tzLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHplcm8gZm9yCisgICAgICAgICAgICAgKiBQQ00gc3RhdGljIHRyYWNrcyBhbmQgbm90IGRlZmluZWQgZm9yIG5vbi1QQ00gdHJhY2tzLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRob3V0IHRoZSB0aHJlYWQgbG9jay4KKyAgICAgICAgICAgICAqLworICAgIHZpcnR1YWwgZG91YmxlICAgICAgYnVmZmVyTGF0ZW5jeU1zKCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmVyUHJveHktPmZyYW1lc1JlYWR5U2FmZSgpICogMTAwMCAvIHNhbXBsZVJhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqIHJldHVybnMgd2hldGhlciB0aGUgdHJhY2sgc3VwcG9ydHMgc2VydmVyIGxhdGVuY3kgY29tcHV0YXRpb24uCisgICAgICAgICAgICAgKiBUaGlzIGlzIHNldCBpbiB0aGUgY29uc3RydWN0b3IgYW5kIGNvbnN0YW50IHRocm91Z2hvdXQgdGhlIHRyYWNrIGxpZmV0aW1lLgorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgpIGNvbnN0IHsgcmV0dXJuIG1TZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkOyB9CisKKyAgICAgICAgICAgIC8qKiBjb21wdXRlcyB0aGUgc2VydmVyIGxhdGVuY3kgZm9yIFBDTSBQbGF5YmFjayBvciBSZWNvcmQgdHJhY2sKKyAgICAgICAgICAgICAqIHRvIHRoZSBkZXZpY2Ugc2luay9zb3VyY2UuICBUaGlzIGlzIHRoZSB0aW1lIGZvciB0aGUgbmV4dCBmcmFtZSBpbiB0aGUgdHJhY2sgYnVmZmVyCisgICAgICAgICAgICAgKiB3cml0dGVuIG9yIHJlYWQgZnJvbSB0aGUgc2VydmVyIHRocmVhZCB0byB0aGUgZGV2aWNlIHNvdXJjZSBvciBzaW5rLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRob3V0IHRoZSB0aHJlYWQgbG9jaywgYnV0IGxhdGVuY3lNcyBhbmQgZnJvbVRyYWNrCisgICAgICAgICAgICAgKiBtYXkgYmUgbm90IGJlIHN5bmNocm9uaXplZC4gRm9yIGV4YW1wbGUgUGF0Y2hQYW5lbCBtYXkgbm90IG9idGFpbiB0aGUKKyAgICAgICAgICAgICAqIHRocmVhZCBsb2NrIGJlZm9yZSBjYWxsaW5nLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFxwYXJhbSBsYXRlbmN5TXMgb24gc3VjY2VzcyBpcyBzZXQgdG8gdGhlIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzIG9mIHRoZQorICAgICAgICAgICAgICogICAgICAgIG5leHQgZnJhbWUgd3JpdHRlbi9yZWFkIGJ5IHRoZSBzZXJ2ZXIgdGhyZWFkIHRvL2Zyb20gdGhlIHRyYWNrIGJ1ZmZlcgorICAgICAgICAgICAgICogICAgICAgIGZyb20gdGhlIGRldmljZSBzb3VyY2Uvc2luay4KKyAgICAgICAgICAgICAqIFxwYXJhbSBmcm9tVHJhY2sgb24gc3VjY2VzcyBpcyBzZXQgdG8gdHJ1ZSBpZiBsYXRlbmN5IHdhcyBjb21wdXRlZCBkaXJlY3RseQorICAgICAgICAgICAgICogICAgICAgIGZyb20gdGhlIHRyYWNrIHRpbWVzdGFtcDsgb3RoZXJ3aXNlIHNldCB0byBmYWxzZSBpZiBsYXRlbmN5IHdhcworICAgICAgICAgICAgICogICAgICAgIGVzdGltYXRlZCBmcm9tIHRoZSBzZXJ2ZXIgdGltZXN0YW1wLgorICAgICAgICAgICAgICogICAgICAgIGZyb21UcmFjayBtYXkgYmUgbnVsbHB0ciBvciBvbWl0dGVkIGlmIG5vdCByZXF1aXJlZC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBccmV0dXJucyBPSyBvciBJTlZBTElEX09QRVJBVElPTiBvbiBmYWlsdXJlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRTZXJ2ZXJMYXRlbmN5TXMoZG91YmxlICpsYXRlbmN5TXMsIGJvb2wgKmZyb21UcmFjayA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBubyB0aHJlYWQgbG9jayBpcyBhY3F1aXJlZCwgdGhlc2UgYXRvbWljcyBhcmUgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3luY2hyb25pemVkIHdpdGggZWFjaCBvdGhlciwgY29uc2lkZXJlZCBhIGJlbmlnbiByYWNlLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIHNlcnZlckxhdGVuY3lNcyA9IG1TZXJ2ZXJMYXRlbmN5TXMubG9hZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJMYXRlbmN5TXMgPT0gMC4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbVRyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZyb21UcmFjayA9IG1TZXJ2ZXJMYXRlbmN5RnJvbVRyYWNrLmxvYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxhdGVuY3lNcyA9IHNlcnZlckxhdGVuY3lNczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKiBjb21wdXRlcyB0aGUgdG90YWwgY2xpZW50IGxhdGVuY3kgZm9yIFBDTSBQbGF5YmFjayBvciBSZWNvcmQgdHJhY2tzCisgICAgICAgICAgICAgKiBmb3IgdGhlIG5leHQgY2xpZW50IGFwcCBhY2Nlc3MgdG8gdGhlIGRldmljZSBzaW5rL3NvdXJjZTsgaS5lLiB0aGUKKyAgICAgICAgICAgICAqIHNlcnZlciBsYXRlbmN5IHBsdXMgdGhlIGJ1ZmZlciBsYXRlbmN5LgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRob3V0IHRoZSB0aHJlYWQgbG9jaywgYnV0IGxhdGVuY3lNcyBhbmQgZnJvbVRyYWNrCisgICAgICAgICAgICAgKiBtYXkgYmUgbm90IGJlIHN5bmNocm9uaXplZC4gRm9yIGV4YW1wbGUgUGF0Y2hQYW5lbCBtYXkgbm90IG9idGFpbiB0aGUKKyAgICAgICAgICAgICAqIHRocmVhZCBsb2NrIGJlZm9yZSBjYWxsaW5nLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFxwYXJhbSBsYXRlbmN5TXMgb24gc3VjY2VzcyBpcyBzZXQgdG8gdGhlIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzIG9mIHRoZQorICAgICAgICAgICAgICogICAgICAgIG5leHQgZnJhbWUgd3JpdHRlbi9yZWFkIGJ5IHRoZSBjbGllbnQgYXBwIHRvL2Zyb20gdGhlIHRyYWNrIGJ1ZmZlcgorICAgICAgICAgICAgICogICAgICAgIGZyb20gdGhlIGRldmljZSBzaW5rL3NvdXJjZS4KKyAgICAgICAgICAgICAqIFxwYXJhbSBmcm9tVHJhY2sgb24gc3VjY2VzcyBpcyBzZXQgdG8gdHJ1ZSBpZiBsYXRlbmN5IHdhcyBjb21wdXRlZCBkaXJlY3RseQorICAgICAgICAgICAgICogICAgICAgIGZyb20gdGhlIHRyYWNrIHRpbWVzdGFtcDsgb3RoZXJ3aXNlIHNldCB0byBmYWxzZSBpZiBsYXRlbmN5IHdhcworICAgICAgICAgICAgICogICAgICAgIGVzdGltYXRlZCBmcm9tIHRoZSBzZXJ2ZXIgdGltZXN0YW1wLgorICAgICAgICAgICAgICogICAgICAgIGZyb21UcmFjayBtYXkgYmUgbnVsbHB0ciBvciBvbWl0dGVkIGlmIG5vdCByZXF1aXJlZC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBccmV0dXJucyBPSyBvciBJTlZBTElEX09QRVJBVElPTiBvbiBmYWlsdXJlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRUcmFja0xhdGVuY3lNcyhkb3VibGUgKmxhdGVuY3lNcywgYm9vbCAqZnJvbVRyYWNrID0gbnVsbHB0cikgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzZXJ2ZXJMYXRlbmN5TXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0U2VydmVyTGF0ZW5jeU1zKCZzZXJ2ZXJMYXRlbmN5TXMsIGZyb21UcmFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGF0ZW5jeU1zID0gc2VydmVyTGF0ZW5jeU1zICsgYnVmZmVyTGF0ZW5jeU1zKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgbWFraW5nIHRoaXMgZXh0ZXJuYWwuCisgICAgICAgICAgIHN0cnVjdCBGcmFtZVRpbWUgeworICAgICAgICAgICAgICAgaW50NjRfdCBmcmFtZXM7CisgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVOczsKKyAgICAgICAgICAgfTsKKworICAgICAgICAgICAvLyBLZXJuZWxGcmFtZVRpbWUgaXMgdXBkYXRlZCBwZXIgIm1peCIgcGVyaW9kIGV2ZW4gZm9yIG5vbi1wY20gdHJhY2tzLgorICAgICAgICAgICB2b2lkICAgICAgICAgZ2V0S2VybmVsRnJhbWVUaW1lKEZyYW1lVGltZSAqZnQpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpmdCA9IG1LZXJuZWxGcmFtZVRpbWUubG9hZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1Gb3JtYXQ7IH0KKyAgICAgICAgICAgaW50IGlkKCkgY29uc3QgeyByZXR1cm4gbUlkOyB9CisKIHByb3RlY3RlZDoKICAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVHJhY2tCYXNlKTsKIApAQCAtMTExLDggKzIxMCw2IEBACiAgICAgLy8gYnV0IHB1dHRpbmcgaXQgaW4gVHJhY2tCYXNlIGF2b2lkcyB0aGUgY29tcGxleGl0eSBvZiB2aXJ0dWFsIGluaGVyaXRhbmNlCiAgICAgdmlydHVhbCBzaXplX3QgIGZyYW1lc1JlYWR5KCkgY29uc3QgeyByZXR1cm4gU0laRV9NQVg7IH0KIAotICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1Gb3JtYXQ7IH0KLQogICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQ7IH0KIAogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxNYXNrOyB9CkBAIC0xMzQsMTQgKzIzMSw2IEBACiAgICAgICAgIHJldHVybiBtU3RhdGUgPT0gU1RPUFBJTkdfMjsKICAgICB9CiAKLSAgICBib29sIGlzVGVybWluYXRlZCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1UZXJtaW5hdGVkOwotICAgIH0KLQotICAgIHZvaWQgdGVybWluYXRlKCkgewotICAgICAgICBtVGVybWluYXRlZCA9IHRydWU7Ci0gICAgfQotCiAgICAgLy8gVXBwZXIgY2FzZSBjaGFyYWN0ZXJzIGFyZSBmaW5hbCBzdGF0ZXMuCiAgICAgLy8gTG93ZXIgY2FzZSBjaGFyYWN0ZXJzIGFyZSB0cmFuc2l0b3J5LgogICAgIGNvbnN0IGNoYXIgKmdldFRyYWNrU3RhdGVTdHJpbmcoKSBjb25zdCB7CkBAIC0yMDgsMTMgKzI5NywxOSBAQAogICAgIGNvbnN0IGJvb2wgICAgICAgICAgbUlzT3V0OwogICAgIHNwPFNlcnZlclByb3h5PiAgICAgbVNlcnZlclByb3h5OwogICAgIGNvbnN0IGludCAgICAgICAgICAgbUlkOwotICAgIHNwPE5CQUlPX1Npbms+ICAgICAgbVRlZVNpbms7Ci0gICAgc3A8TkJBSU9fU291cmNlPiAgICBtVGVlU291cmNlOworI2lmZGVmIFRFRV9TSU5LCisgICAgTkJBSU9fVGVlICAgICAgICAgICBtVGVlOworI2VuZGlmCiAgICAgYm9vbCAgICAgICAgICAgICAgICBtVGVybWluYXRlZDsKICAgICB0cmFja190eXBlICAgICAgICAgIG1UeXBlOyAgICAgIC8vIG11c3QgYmUgb25lIG9mIFRZUEVfREVGQVVMVCwgVFlQRV9PVVRQVVQsIFRZUEVfUEFUQ0ggLi4uCiAgICAgYXVkaW9faW9faGFuZGxlX3QgICBtVGhyZWFkSW9IYW5kbGU7IC8vIEkvTyBoYW5kbGUgb2YgdGhlIHRocmVhZCB0aGUgdHJhY2sgaXMgYXR0YWNoZWQgdG8KICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1Qb3J0SWQ7IC8vIHVuaXF1ZSBJRCBmb3IgdGhpcyB0cmFjayB1c2VkIGJ5IGF1ZGlvIHBvbGljeQogICAgIGJvb2wgICAgICAgICAgICAgICAgbUlzSW52YWxpZDsgLy8gbm9uLXJlc2V0dGFibGUgbGF0Y2gsIHNldCBieSBpbnZhbGlkYXRlKCkKKworICAgIGJvb2wgICAgICAgICAgICAgICAgbVNlcnZlckxhdGVuY3lTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICBzdGQ6OmF0b21pYzxib29sPiAgIG1TZXJ2ZXJMYXRlbmN5RnJvbVRyYWNre307IC8vIGxhdGVuY3kgZnJvbSB0cmFjayBvciBzZXJ2ZXIgdGltZXN0YW1wLgorICAgIHN0ZDo6YXRvbWljPGRvdWJsZT4gbVNlcnZlckxhdGVuY3lNc3t9OyAgICAgICAgLy8gbGFzdCBsYXRlbmN5IHB1c2hlZCBmcm9tIHNlcnZlciB0aHJlYWQuCisgICAgc3RkOjphdG9taWM8RnJhbWVUaW1lPiBtS2VybmVsRnJhbWVUaW1le307ICAgICAvLyBsYXN0IGZyYW1lIHRpbWUgb24ga2VybmVsIHNpZGUuCiB9OwogCiAvLyBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IFBhdGNoVHJhY2sgYW5kIFBhdGNoUmVjb3JkLgpAQCAtMjI5LDMgKzMyNCwyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqcmVxdWVzdGVkID0gTlVMTCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVsZWFzZUJ1ZmZlcihQcm94eTo6QnVmZmVyKiBidWZmZXIpID0gMDsKIH07CisKK2NsYXNzIFBhdGNoVHJhY2tCYXNlIDogcHVibGljIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlcgoreworcHVibGljOgorICAgIHVzaW5nIFRpbWVvdXQgPSBzdGQ6Om9wdGlvbmFsPHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kcz47CisgICAgICAgICAgICAgICAgICAgICAgICBQYXRjaFRyYWNrQmFzZShzcDxDbGllbnRQcm94eT4gcHJveHksIGNvbnN0IFRocmVhZEJhc2UmIHRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVvdXQmIHRpbWVvdXQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0UGVlclRpbWVvdXQoc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzIHRpbWVvdXQpOworICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgICAgICAgICB2b2lkICAgICAgICBzZXRQZWVyUHJveHkoY29uc3Qgc3A8VD4gJnByb3h5LCBib29sIGhvbGRSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGVlclJlZmVyZW5jZUhvbGQgPSBob2xkUmVmZXJlbmNlID8gcHJveHkgOiBudWxscHRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QZWVyUHJveHkgPSBwcm94eS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgICAgICAgIGNsZWFyUGVlclByb3h5KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QZWVyUmVmZXJlbmNlSG9sZC5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QZWVyUHJveHkgPSBudWxscHRyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgY29uc3Qgc3A8Q2xpZW50UHJveHk+ICAgICAgIG1Qcm94eTsKKyAgICBzcDxSZWZCYXNlPiAgICAgICAgICAgICAgICAgbVBlZXJSZWZlcmVuY2VIb2xkOyAgIC8vIGtlZXBzIG1QZWVyUHJveHkgYWxpdmUgZHVyaW5nIGFjY2Vzcy4KKyAgICBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIqICAgbVBlZXJQcm94eSA9IG51bGxwdHI7CisgICAgc3RydWN0IHRpbWVzcGVjICAgICAgICAgICAgIG1QZWVyVGltZW91dHt9OworCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcAppbmRleCA2ZDI1ZmI5Li41YTQzNjk2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcApAQCAtMjgsMTEgKzI4LDExIEBACiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL1JlY29yZEJ1ZmZlckNvbnZlcnRlci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL21pbmlmbG9hdC5oPgogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC01Niw2ICs1Niw4IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgICAgIFRyYWNrQmFzZQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6OlRyYWNrQmFzZSIKIAogc3RhdGljIHZvbGF0aWxlIGludDMyX3QgbmV4dFRyYWNrSWQgPSA1NTsKIApAQCAtOTcsMTQgKzk5LDE1IEBACiAgICAgICAgIG1JZChhbmRyb2lkX2F0b21pY19pbmMoJm5leHRUcmFja0lkKSksCiAgICAgICAgIG1UZXJtaW5hdGVkKGZhbHNlKSwKICAgICAgICAgbVR5cGUodHlwZSksCi0gICAgICAgIG1UaHJlYWRJb0hhbmRsZSh0aHJlYWQtPmlkKCkpLAorICAgICAgICBtVGhyZWFkSW9IYW5kbGUodGhyZWFkID8gdGhyZWFkLT5pZCgpIDogQVVESU9fSU9fSEFORExFX05PTkUpLAogICAgICAgICBtUG9ydElkKHBvcnRJZCksCiAgICAgICAgIG1Jc0ludmFsaWQoZmFsc2UpCiB7CiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAoIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkgfHwgY2xpZW50VWlkID09IEFVRElPX1VJRF9JTlZBTElEKSB7CisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChjYWxsaW5nVWlkKSB8fCBjbGllbnRVaWQgPT0gQVVESU9fVUlEX0lOVkFMSUQpIHsKICAgICAgICAgQUxPR1dfSUYoY2xpZW50VWlkICE9IEFVRElPX1VJRF9JTlZBTElEICYmIGNsaWVudFVpZCAhPSBjYWxsaW5nVWlkLAotICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwgX19GVU5DVElPTl9fLCBjYWxsaW5nVWlkLCBjbGllbnRVaWQpOworICAgICAgICAgICAgICAgICIlcyglZCk6IHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLAorICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBjYWxsaW5nVWlkLCBjbGllbnRVaWQpOwogICAgICAgICBjbGllbnRVaWQgPSBjYWxsaW5nVWlkOwogICAgIH0KICAgICAvLyBjbGllbnRVaWQgY29udGFpbnMgdGhlIHVpZCBvZiB0aGUgYXBwIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgdHJhY2ssIHNvIHdlIGNhbiBibGFtZQpAQCAtMTQ0LDcgKzE0Nyw3IEBACiAgICAgICAgIG1DYmxrTWVtb3J5ID0gY2xpZW50LT5oZWFwKCktPmFsbG9jYXRlKHNpemUpOwogICAgICAgICBpZiAobUNibGtNZW1vcnkgPT0gMCB8fAogICAgICAgICAgICAgICAgIChtQ2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCAqPihtQ2Jsa01lbW9yeS0+cG9pbnRlcigpKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBBdWRpb1RyYWNrIHNpemU9JXp1Iiwgc2l6ZSk7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBub3QgZW5vdWdoIG1lbW9yeSBmb3IgQXVkaW9UcmFjayBzaXplPSV6dSIsIF9fZnVuY19fLCBtSWQsIHNpemUpOwogICAgICAgICAgICAgY2xpZW50LT5oZWFwKCktPmR1bXAoIkF1ZGlvVHJhY2siKTsKICAgICAgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0xNTIsNyArMTU1LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBtQ2JsayA9IChhdWRpb190cmFja19jYmxrX3QgKikgbWFsbG9jKHNpemUpOwogICAgICAgICBpZiAobUNibGsgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBBdWRpb1RyYWNrIHNpemU9JXp1Iiwgc2l6ZSk7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBub3QgZW5vdWdoIG1lbW9yeSBmb3IgQXVkaW9UcmFjayBzaXplPSV6dSIsIF9fZnVuY19fLCBtSWQsIHNpemUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQpAQCAtMTY2LDcgKzE2OSw4IEBACiAgICAgICAgICAgICBpZiAocm9IZWFwID09IDAgfHwKICAgICAgICAgICAgICAgICAgICAgKG1CdWZmZXJNZW1vcnkgPSByb0hlYXAtPmFsbG9jYXRlKGJ1ZmZlclNpemUpKSA9PSAwIHx8CiAgICAgICAgICAgICAgICAgICAgIChtQnVmZmVyID0gbUJ1ZmZlck1lbW9yeS0+cG9pbnRlcigpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciByZWFkLW9ubHkgYnVmZmVyIHNpemU9JXp1IiwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogbm90IGVub3VnaCBtZW1vcnkgZm9yIHJlYWQtb25seSBidWZmZXIgc2l6ZT0lenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgYnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICAgICAgaWYgKHJvSGVhcCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHJvSGVhcC0+ZHVtcCgiYnVmZmVyIik7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjA1LDI3ICsyMDksMTIgQEAKICAgICAgICAgICAgIG1CdWZmZXIgPSBidWZmZXI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImludmFsaWQgYWxsb2NhdGlvbiB0eXBlOiAlZCIsIChpbnQpYWxsb2MpOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXMoJWQpOiBpbnZhbGlkIGFsbG9jYXRpb24gdHlwZTogJWQiLCBfX2Z1bmNfXywgbUlkLCAoaW50KWFsbG9jKTsKICAgICAgICAgfQogICAgICAgICBtQnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7CiAKICNpZmRlZiBURUVfU0lOSwotICAgICAgICBpZiAobVRlZVNpbmtUcmFja0VuYWJsZWQpIHsKLSAgICAgICAgICAgIE5CQUlPX0Zvcm1hdCBwaXBlRm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCwgbUZvcm1hdCk7Ci0gICAgICAgICAgICBpZiAoRm9ybWF0X2lzVmFsaWQocGlwZUZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICBQaXBlICpwaXBlID0gbmV3IFBpcGUobVRlZVNpbmtUcmFja0ZyYW1lcywgcGlwZUZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7cGlwZUZvcm1hdH07Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IHBpcGUtPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgICAgICAgICAgICAgIFBpcGVSZWFkZXIgKnBpcGVSZWFkZXIgPSBuZXcgUGlwZVJlYWRlcigqcGlwZSk7Ci0gICAgICAgICAgICAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBwaXBlUmVhZGVyLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICAgICAgICAgICAgICBtVGVlU2luayA9IHBpcGU7Ci0gICAgICAgICAgICAgICAgbVRlZVNvdXJjZSA9IHBpcGVSZWFkZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbVRlZS5zZXQoc2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCwgZm9ybWF0LCBOQkFJT19UZWU6OlRFRV9GTEFHX1RSQUNLKTsKICNlbmRpZgogCiAgICAgfQpAQCAtMjQ0LDkgKzIzMyw2IEBACiAKIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VHJhY2tCYXNlOjp+VHJhY2tCYXNlKCkKIHsKLSNpZmRlZiBURUVfU0lOSwotICAgIGR1bXBUZWUoLTEsIG1UZWVTb3VyY2UsIG1JZCwgJ1QnKTsKLSNlbmRpZgogICAgIC8vIGRlbGV0ZSB0aGUgcHJveHkgYmVmb3JlIGRlbGV0aW5nIHRoZSBzaGFyZWQgbWVtb3J5IGl0IHJlZmVycyB0bywgdG8gYXZvaWQgZGFuZ2xpbmcgcmVmZXJlbmNlCiAgICAgbVNlcnZlclByb3h5LmNsZWFyKCk7CiAgICAgaWYgKG1DYmxrICE9IE5VTEwpIHsKQEAgLTI3NCw5ICsyNjAsNyBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlRyYWNrQmFzZTo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKICNpZmRlZiBURUVfU0lOSwotICAgIGlmIChtVGVlU2luayAhPSAwKSB7Ci0gICAgICAgICh2b2lkKSBtVGVlU2luay0+d3JpdGUoYnVmZmVyLT5yYXcsIGJ1ZmZlci0+ZnJhbWVDb3VudCk7Ci0gICAgfQorICAgIG1UZWUud3JpdGUoYnVmZmVyLT5yYXcsIGJ1ZmZlci0+ZnJhbWVDb3VudCk7CiAjZW5kaWYKIAogICAgIFNlcnZlclByb3h5OjpCdWZmZXIgYnVmOwpAQCAtMjkzLDkgKzI3NywzMiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpQYXRjaFRyYWNrQmFzZTo6UGF0Y2hUcmFja0Jhc2Uoc3A8Q2xpZW50UHJveHk+IHByb3h5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkQmFzZSYgdGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGltZW91dCYgdGltZW91dCkKKyAgICA6IG1Qcm94eShwcm94eSkKK3sKKyAgICBpZiAodGltZW91dCkgeworICAgICAgICBzZXRQZWVyVGltZW91dCgqdGltZW91dCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRG91YmxlIGJ1ZmZlciBtaXhlcgorICAgICAgICB1aW50NjRfdCBtaXhCdWZmZXJOcyA9ICgodWludDY0X3QpMiAqIHRocmVhZC5mcmFtZUNvdW50KCkgKiAxMDAwMDAwMDAwKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLnNhbXBsZVJhdGUoKTsKKyAgICAgICAgc2V0UGVlclRpbWVvdXQoc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRze21peEJ1ZmZlck5zfSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6UGF0Y2hUcmFja0Jhc2U6OnNldFBlZXJUaW1lb3V0KHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kcyB0aW1lb3V0KSB7CisgICAgbVBlZXJUaW1lb3V0LnR2X3NlYyA9IHRpbWVvdXQuY291bnQoKSAvIHN0ZDo6bmFubzo6ZGVuOworICAgIG1QZWVyVGltZW91dC50dl9uc2VjID0gdGltZW91dC5jb3VudCgpICUgc3RkOjpuYW5vOjpkZW47Cit9CisKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICBQbGF5YmFjawogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6OlRyYWNrSGFuZGxlIgogCiBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpUcmFja0hhbmRsZShjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjaz4mIHRyYWNrKQogICAgIDogQm5BdWRpb1RyYWNrKCksCkBAIC0zNDAsNiArMzQ3LDEwIEBACiAgICAgcmV0dXJuIG1UcmFjay0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgeworICAgIHJldHVybiBtVHJhY2stPnNlbGVjdFByZXNlbnRhdGlvbihwcmVzZW50YXRpb25JZCwgcHJvZ3JhbUlkKTsKK30KKwogVm9sdW1lU2hhcGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6YXBwbHlWb2x1bWVTaGFwZXIoCiAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCiAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSB7CkBAIC0zNjgsNiArMzc5LDggQEAKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6OlRyYWNrIgogCiAvLyBUcmFjayBjb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgYW5kIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpUcmFjaygKQEAgLTM5Nyw3ICs0MTAsNiBAQAogICAgIC8vIG1SZXRyeUNvdW50IGluaXRpYWxpemVkIGxhdGVyIHdoZW4gbmVlZGVkCiAgICAgbVNoYXJlZEJ1ZmZlcihzaGFyZWRCdWZmZXIpLAogICAgIG1TdHJlYW1UeXBlKHN0cmVhbVR5cGUpLAotICAgIG1OYW1lKFRSQUNLX05BTUVfRkFJTFVSRSksICAvLyBzZXQgdG8gVFJBQ0tfTkFNRV9QRU5ESU5HIG9uIGNvbnN0cnVjdG9yIHN1Y2Nlc3MuCiAgICAgbU1haW5CdWZmZXIodGhyZWFkLT5zaW5rQnVmZmVyKCkpLAogICAgIG1BdXhCdWZmZXIoTlVMTCksCiAgICAgbUF1eEVmZmVjdElkKDApLCBtSGFzVm9sdW1lQ29udHJvbGxlcihmYWxzZSksCkBAIC00MTcsOCArNDI5LDggQEAKICAgICAvLyBjbGllbnQgPT0gMCBpbXBsaWVzIHNoYXJlZEJ1ZmZlciA9PSAwCiAgICAgQUxPR19BU1NFUlQoIShjbGllbnQgPT0gMCAmJiBzaGFyZWRCdWZmZXIgIT0gMCkpOwogCi0gICAgQUxPR1ZfSUYoc2hhcmVkQnVmZmVyICE9IDAsICJzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlenUiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwKLSAgICAgICAgICAgIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBBTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgIiVzKCVkKTogc2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJXp1IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLCBzaGFyZWRCdWZmZXItPnNpemUoKSk7CiAKICAgICBpZiAobUNibGsgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CkBAIC00MzQsNyArNDQ2LDcgQEAKICAgICBtU2VydmVyUHJveHkgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5OwogCiAgICAgaWYgKCF0aHJlYWQtPmlzVHJhY2tBbGxvd2VkX2woY2hhbm5lbE1hc2ssIGZvcm1hdCwgc2Vzc2lvbklkLCB1aWQpKSB7Ci0gICAgICAgIEFMT0dFKCJubyBtb3JlIHRyYWNrcyBhdmFpbGFibGUiKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogbm8gbW9yZSB0cmFja3MgYXZhaWxhYmxlIiwgX19mdW5jX18sIG1JZCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgLy8gb25seSBhbGxvY2F0ZSBhIGZhc3QgdHJhY2sgaW5kZXggaWYgd2Ugd2VyZSBhYmxlIHRvIGFsbG9jYXRlIGEgbm9ybWFsIHRyYWNrIG5hbWUKQEAgLTQ1MywxMiArNDY1LDI0IEBACiAgICAgICAgIG1GYXN0SW5kZXggPSBpOwogICAgICAgICB0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbE1hc2sgJj0gfigxIDw8IGkpOwogICAgIH0KLSAgICBtTmFtZSA9IFRSQUNLX05BTUVfUEVORElORzsKKworICAgIG1TZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkID0gdGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6TUlYRVIKKyAgICAgICAgICAgIHx8IHRocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6OkRVUExJQ0FUSU5HOworI2lmZGVmIFRFRV9TSU5LCisgICAgbVRlZS5zZXRJZChzdGQ6OnN0cmluZygiXyIpICsgc3RkOjp0b19zdHJpbmcobVRocmVhZElvSGFuZGxlKQorICAgICAgICAgICAgKyAiXyIgKyBzdGQ6OnRvX3N0cmluZyhtSWQpICsgIl9UIik7CisjZW5kaWYKKworICAgIGlmIChjaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgeworICAgICAgICBtQXVkaW9WaWJyYXRpb25Db250cm9sbGVyID0gbmV3IEF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcih0aGlzKTsKKyAgICAgICAgbUV4dGVybmFsVmlicmF0aW9uID0gbmV3IG9zOjpFeHRlcm5hbFZpYnJhdGlvbigKKyAgICAgICAgICAgICAgICBtVWlkLCAiIiAvKiBwa2cgKi8sIG1BdHRyLCBtQXVkaW9WaWJyYXRpb25Db250cm9sbGVyKTsKKyAgICB9CiB9CiAKIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjp+VHJhY2soKQogewotICAgIEFMT0dWKCJQbGF5YmFja1RocmVhZDo6VHJhY2sgZGVzdHJ1Y3RvciIpOworICAgIEFMT0dWKCIlcyglZCkiLCBfX2Z1bmNfXywgbUlkKTsKIAogICAgIC8vIFRoZSBkZXN0cnVjdG9yIHdvdWxkIGNsZWFyIG1TaGFyZWRCdWZmZXIsCiAgICAgLy8gYnV0IGl0IHdpbGwgbm90IHB1c2ggdGhlIGRlY3JlbWVudGVkIHJlZmVyZW5jZSBjb3VudCwKQEAgLTQ3Miw3ICs0OTYsNyBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmluaXRDaGVjaygpIGNvbnN0CiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVHJhY2tCYXNlOjppbml0Q2hlY2soKTsKLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIG1OYW1lID09IFRSQUNLX05BTUVfRkFJTFVSRSkgeworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgbUNibGsgPT0gbnVsbHB0cikgewogICAgICAgICBzdGF0dXMgPSBOT19NRU1PUlk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CkBAIC00OTgsMTggKzUyMiwyMSBAQAogICAgICAgICAgICAgd2FzQWN0aXZlID0gcGxheWJhY2tUaHJlYWQtPmRlc3Ryb3lUcmFja19sKHRoaXMpOwogICAgICAgICB9CiAgICAgICAgIGlmIChpc0V4dGVybmFsVHJhY2soKSAmJiAhd2FzQWN0aXZlKSB7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtVGhyZWFkSW9IYW5kbGUsIG1TdHJlYW1UeXBlLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1Qb3J0SWQpOwogICAgICAgICB9CiAgICAgfQorICAgIGZvckVhY2hUZWVQYXRjaFRyYWNrKFtdKGF1dG8gcGF0Y2hUcmFjaykgeyBwYXRjaFRyYWNrLT5kZXN0cm95KCk7IH0pOwogfQogCi0vKnN0YXRpYyovIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiVCBOYW1lIEFjdGl2ZSBDbGllbnQgU2Vzc2lvbiBTICBGbGFncyAiCi0gICAgICAgICAgICAgICAgICAiICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlICIKLSAgICAgICAgICAgICAgICAgICJTVCAgTCBkQiAgUiBkQiAgVlMgZEIgIgotICAgICAgICAgICAgICAgICAgIiAgU2VydmVyIEZybUNudCAgRnJtUmR5IEYgVW5kZXJydW5zICBGbHVzaGVkICIKLSAgICAgICAgICAgICAgICAgICJNYWluIEJ1ZiAgQXV4IEJ1ZlxuIik7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiVHlwZSAgICAgSWQgQWN0aXZlIENsaWVudCBTZXNzaW9uIFBvcnQgSWQgUyAgRmxhZ3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgRm9ybWF0IENobiBtYXNrICBTUmF0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiU1QgVXNnIENUICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgRyBkYiAgTCBkQiAgUiBkQiAgVlMgZEIgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgU2VydmVyIEZybUNudCAgRnJtUmR5IEYgVW5kZXJydW5zICBGbHVzaGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgIiVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKCkgPyAiICAgTGF0ZW5jeSIgOiAiIik7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSkKQEAgLTUxOCw3ICs1NDUsNyBAQAogICAgIHN3aXRjaCAobVR5cGUpIHsKICAgICBjYXNlIFRZUEVfREVGQVVMVDoKICAgICBjYXNlIFRZUEVfT1VUUFVUOgotICAgICAgICBpZiAobVNoYXJlZEJ1ZmZlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChpc1N0YXRpYygpKSB7CiAgICAgICAgICAgICB0cmFja1R5cGUgPSAnUyc7IC8vIHN0YXRpYwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdHJhY2tUeXBlID0gJyAnOyAvLyBub3JtYWwKQEAgLTUzMiwxMyArNTU5LDkgQEAKICAgICB9CiAKICAgICBpZiAoaXNGYXN0VHJhY2soKSkgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJGJWMgJTNkIiwgdHJhY2tUeXBlLCBtRmFzdEluZGV4KTsKLSAgICB9IGVsc2UgaWYgKG1OYW1lID09IFRSQUNLX05BTUVfUEVORElORykgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyBwZW5kIiwgdHJhY2tUeXBlKTsKLSAgICB9IGVsc2UgaWYgKG1OYW1lID09IFRSQUNLX05BTUVfRkFJTFVSRSkgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyBmYWlsIiwgdHJhY2tUeXBlKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiRiVkICVjICU2ZCIsIG1GYXN0SW5kZXgsIHRyYWNrVHlwZSwgbUlkKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyAlNGQiLCB0cmFja1R5cGUsIG1OYW1lKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgJWMgJTZkIiwgdHJhY2tUeXBlLCBtSWQpOwogICAgIH0KIAogICAgIGNoYXIgbm93SW5VbmRlcnJ1bjsKQEAgLTU5MywyMiArNjE2LDI3IEBACiAgICAgICAgICAgICA/ICdyJyAvKiBidWZmZXIgcmVkdWNlZCAqLzogYnVmZmVyU2l6ZUluRnJhbWVzID4gbUZyYW1lQ291bnQKICAgICAgICAgICAgICAgICAgICAgPyAnZScgLyogZXJyb3IgKi8gOiAnICcgLyogaWRlbnRpY2FsICovOwogCi0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTdzICU2dSAlN3UgJTJzIDB4JTAzWCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlMDhYICU2dSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiJTJ1ICU1LjJnICU1LjJnICU1LjJnJWMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOFggJTZ6dSVjICU2enUgJWMgJTl1JWMgJTd1ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDh6WCAlMDh6WFxuIiwKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlN3MgJTZ1ICU3dSAlN3UgJTJzIDB4JTAzWCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlMDhYICU2dSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJTJ1ICUzeCAlMnggIgorICAgICAgICAgICAgICAgICAgICAgICAgIiU1LjJnICU1LjJnICU1LjJnICU1LjJnJWMgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiUwOFggJTZ6dSVjICU2enUgJWMgJTl1JWMgJTd1IiwKICAgICAgICAgICAgIGFjdGl2ZSA/ICJ5ZXMiIDogIm5vIiwKLSAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkX2NhY2hlZCA6IG1DbGllbnQtPnBpZCgpLAorICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWQoKSA6IG1DbGllbnQtPnBpZCgpLAogICAgICAgICAgICAgbVNlc3Npb25JZCwKKyAgICAgICAgICAgIG1Qb3J0SWQsCiAgICAgICAgICAgICBnZXRUcmFja1N0YXRlU3RyaW5nKCksCiAgICAgICAgICAgICBtQ2Jsay0+bUZsYWdzLAogCiAgICAgICAgICAgICBtRm9ybWF0LAogICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0U2FtcGxlUmF0ZSgpLAorICAgICAgICAgICAgc2FtcGxlUmF0ZSgpLAogCiAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKKyAgICAgICAgICAgIG1BdHRyLnVzYWdlLAorICAgICAgICAgICAgbUF0dHIuY29udGVudF90eXBlLAorCisgICAgICAgICAgICAyMC4wICogbG9nMTAobUZpbmFsVm9sdW1lKSwKICAgICAgICAgICAgIDIwLjAgKiBsb2cxMChmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSkpLAogICAgICAgICAgICAgMjAuMCAqIGxvZzEwKGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSkpLAogICAgICAgICAgICAgMjAuMCAqIGxvZzEwKHZzVm9sdW1lLmZpcnN0KSwgLy8gVm9sdW1lU2hhcGVyKHMpIHRvdGFsIHZvbHVtZQpAQCAtNjIxLDExICs2NDksMjEgQEAKICAgICAgICAgICAgIGZpbGxpbmdTdGF0dXMsCiAgICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRVbmRlcnJ1bkZyYW1lcygpLAogICAgICAgICAgICAgbm93SW5VbmRlcnJ1biwKLSAgICAgICAgICAgICh1bnNpZ25lZCltQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNGbHVzaGVkKCkgJSAxMDAwMDAwMCwKLQotICAgICAgICAgICAgKHNpemVfdCltTWFpbkJ1ZmZlciwgLy8gdXNlICV6WCBhcyAlcCBhcHBlbmRzIDB4Ci0gICAgICAgICAgICAoc2l6ZV90KW1BdXhCdWZmZXIgICAvLyB1c2UgJXpYIGFzICVwIGFwcGVuZHMgMHgKKyAgICAgICAgICAgICh1bnNpZ25lZCltQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNGbHVzaGVkKCkgJSAxMDAwMDAwMAogICAgICAgICAgICAgKTsKKworICAgIGlmIChpc1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoKSkgeworICAgICAgICBkb3VibGUgbGF0ZW5jeU1zOworICAgICAgICBib29sIGZyb21UcmFjazsKKyAgICAgICAgaWYgKGdldFRyYWNrTGF0ZW5jeU1zKCZsYXRlbmN5TXMsICZmcm9tVHJhY2spID09IE9LKSB7CisgICAgICAgICAgICAvLyBTaG93IGxhdGVuY3kgaW4gbXNlYywgZm9sbG93ZWQgYnkgJ3QnIGlmIGZyb20gdHJhY2sgdGltZXN0YW1wICh0aGUgbW9zdCBhY2N1cmF0ZSkKKyAgICAgICAgICAgIC8vIG9yICdrJyBpZiBlc3RpbWF0ZWQgZnJvbSBrZXJuZWwgYmVjYXVzZSB0cmFjayBmcmFtZXMgaGF2ZW4ndCBiZWVuIHByZXNlbnRlZCB5ZXQuCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgJTcuMmxmICVjIiwgbGF0ZW5jeU1zLCBmcm9tVHJhY2sgPyAndCcgOiAnaycpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTEwcyIsIG1DYmxrLT5tU2VydmVyICE9IDAgPyAidW5hdmFpbCIgOiAibmV3Iik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKIH0KIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnNhbXBsZVJhdGUoKSBjb25zdCB7CkBAIC02MzMsOCArNjcxLDcgQEAKIH0KIAogLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpnZXROZXh0QnVmZmVyKAotICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewogICAgIFNlcnZlclByb3h5OjpCdWZmZXIgYnVmOwogICAgIHNpemVfdCBkZXNpcmVkRnJhbWVzID0gYnVmZmVyLT5mcmFtZUNvdW50OwpAQCAtNjQzLDE2ICs2ODAsNzIgQEAKICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBidWYubUZyYW1lQ291bnQ7CiAgICAgYnVmZmVyLT5yYXcgPSBidWYubVJhdzsKICAgICBpZiAoYnVmLm1GcmFtZUNvdW50ID09IDAgJiYgIWlzU3RvcHBpbmcoKSAmJiAhaXNTdG9wcGVkKCkgJiYgIWlzUGF1c2VkKCkpIHsKLSAgICAgICAgQUxPR1YoInVuZGVycnVuLCAgZnJhbWVzUmVhZHkoJXp1KSA8IGZyYW1lc0Rlc2lyZWQoJXpkKSwgc3RhdGU6ICVkIiwKLSAgICAgICAgICAgICAgICBidWYubUZyYW1lQ291bnQsIGRlc2lyZWRGcmFtZXMsIG1TdGF0ZSk7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IHVuZGVycnVuLCAgZnJhbWVzUmVhZHkoJXp1KSA8IGZyYW1lc0Rlc2lyZWQoJXpkKSwgc3RhdGU6ICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBidWYubUZyYW1lQ291bnQsIGRlc2lyZWRGcmFtZXMsIG1TdGF0ZSk7CiAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMoZGVzaXJlZEZyYW1lcyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcygwKTsKICAgICB9Ci0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQoreworICAgIGludGVyY2VwdEJ1ZmZlcigqYnVmZmVyKTsKKyAgICBUcmFja0Jhc2U6OnJlbGVhc2VCdWZmZXIoYnVmZmVyKTsKK30KKworLy8gVE9ETzogY29tcGVuc2F0ZSBmb3IgdGltZSBzaGlmdCBiZXR3ZWVuIEhXIG1vZHVsZXMuCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjppbnRlcmNlcHRCdWZmZXIoCisgICAgICAgIGNvbnN0IEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciYgc291cmNlQnVmZmVyKSB7CisgICAgYXV0byBzdGFydCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gc291cmNlQnVmZmVyLmZyYW1lQ291bnQ7CisgICAgaWYgKGZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICByZXR1cm47ICAvLyBObyBhdWRpbyB0byBpbnRlcmNlcHQuCisgICAgICAgIC8vIEFkZGl0aW9uYWxseSBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXI6Om9idGFpbkJ1ZmZlciAoY2FsbGVkIGJ5IFBhdGhUcmFjazo6Z2V0TmV4dEJ1ZmZlcikKKyAgICAgICAgLy8gZG9lcyBub3QgYWxsb3cgMCBmcmFtZSBzaXplIHJlcXVlc3QgY29udHJhcnkgdG8gZ2V0TmV4dEJ1ZmZlcgorICAgIH0KKyAgICBmb3IgKGF1dG8mIHRlZVBhdGNoIDogbVRlZVBhdGNoZXMpIHsKKyAgICAgICAgUmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZCogcGF0Y2hSZWNvcmQgPSB0ZWVQYXRjaC5wYXRjaFJlY29yZC5nZXQoKTsKKworICAgICAgICBzaXplX3QgZnJhbWVzV3JpdHRlbiA9IHdyaXRlRnJhbWVzKHBhdGNoUmVjb3JkLCBzb3VyY2VCdWZmZXIuaTgsIGZyYW1lQ291bnQpOworICAgICAgICAvLyBPbiBidWZmZXIgd3JhcCwgdGhlIGJ1ZmZlciBmcmFtZSBjb3VudCB3aWxsIGJlIGxlc3MgdGhhbiByZXF1ZXN0ZWQsCisgICAgICAgIC8vIHdoZW4gdGhpcyBoYXBwZW5zIGEgc2Vjb25kIGJ1ZmZlciBuZWVkcyB0byBiZSB1c2VkIHRvIHdyaXRlIHRoZSBsZWZ0b3ZlciBhdWRpbworICAgICAgICBzaXplX3QgZnJhbWVzTGVmdCA9IGZyYW1lQ291bnQgLSBmcmFtZXNXcml0dGVuOworICAgICAgICBpZiAoZnJhbWVzV3JpdHRlbiAhPSAwICYmIGZyYW1lc0xlZnQgIT0gMCkgeworICAgICAgICAgICAgZnJhbWVzV3JpdHRlbiArPQorICAgICAgICAgICAgICAgIHdyaXRlRnJhbWVzKHBhdGNoUmVjb3JkLCBzb3VyY2VCdWZmZXIuaTggKyBmcmFtZXNXcml0dGVuICogbUZyYW1lU2l6ZSwgZnJhbWVzTGVmdCk7CisgICAgICAgICAgICBmcmFtZXNMZWZ0ID0gZnJhbWVDb3VudCAtIGZyYW1lc1dyaXR0ZW47CisgICAgICAgIH0KKyAgICAgICAgQUxPR1dfSUYoZnJhbWVzTGVmdCAhPSAwLCAiJXMoJWQpIFBhdGNoUmVjb3JkICVkIGNhbiBub3QgcHJvdmlkZSBiaWcgZW5vdWdoICIKKyAgICAgICAgICAgICAgICAgImJ1ZmZlciAlenUvJXp1LCBkcm9wcGluZyAlenUgZnJhbWVzIiwgX19mdW5jX18sIG1JZCwgcGF0Y2hSZWNvcmQtPm1JZCwKKyAgICAgICAgICAgICAgICAgZnJhbWVzV3JpdHRlbiwgZnJhbWVDb3VudCwgZnJhbWVzTGVmdCk7CisgICAgfQorICAgIGF1dG8gc3BlbnQgPSBjZWlsPHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHM+KHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpIC0gc3RhcnQpOworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKyAgICAvLyBBdmVyYWdlIGlzIH4yMHVzIHBlciB0cmFjaywgdGhpcyBzaG91bGQgdmlydHVhbGx5IG5ldmVyIGJlIGxvZ2dlZCAoTG9nZ2luZyB0YWtlcyA+MjAwdXMpCisgICAgQUxPR0RfSUYoc3BlbnQgPiAyMDB1cywgIiVzOiB0b29rICVsbGR1cyB0byBpbnRlcmNlcHQgJXp1IHRyYWNrcyIsIF9fZnVuY19fLAorICAgICAgICAgICAgIHNwZW50LmNvdW50KCksIG1UZWVQYXRjaGVzLnNpemUoKSk7Cit9CisKK3NpemVfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6d3JpdGVGcmFtZXMoQXVkaW9CdWZmZXJQcm92aWRlciogZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCkgeworICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBwYXRjaEJ1ZmZlcjsKKyAgICBwYXRjaEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICBhdXRvIHN0YXR1cyA9IGRlc3QtPmdldE5leHRCdWZmZXIoJnBhdGNoQnVmZmVyKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgQUxPR1coIiVzIFBhdGhSZWNvcmQgZ2V0TmV4dEJ1ZmZlciBmYWlsZWQgd2l0aCBlcnJvciAlZDogJXMiLAorICAgICAgICAgICAgIF9fZnVuY19fLCBzdGF0dXMsIHN0cmVycm9yKC1zdGF0dXMpKTsKKyAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgQUxPR19BU1NFUlQocGF0Y2hCdWZmZXIuZnJhbWVDb3VudCA8PSBmcmFtZUNvdW50KTsKKyAgICBtZW1jcHkocGF0Y2hCdWZmZXIucmF3LCBzcmMsIHBhdGNoQnVmZmVyLmZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKKyAgICBhdXRvIGZyYW1lc1dyaXR0ZW4gPSBwYXRjaEJ1ZmZlci5mcmFtZUNvdW50OworICAgIGRlc3QtPnJlbGVhc2VCdWZmZXIoJnBhdGNoQnVmZmVyKTsKKyAgICByZXR1cm4gZnJhbWVzV3JpdHRlbjsKK30KKwogLy8gcmVsZWFzZUJ1ZmZlcigpIGlzIG5vdCBvdmVycmlkZGVuCiAKIC8vIEV4dGVuZGVkQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKQEAgLTY4Miw2ICs3NzUsMTMgQEAKICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5zZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKIAogICAgIC8vIFdlIGRvIG5vdCBzZXQgZHJhaW5lZCBoZXJlLCBhcyBGYXN0VHJhY2sgdGltZXN0YW1wIG1heSBub3QgZ28gdG8gdmVyeSBsYXN0IGZyYW1lLgorCisgICAgLy8gQ29tcHV0ZSBsYXRlbmN5LgorICAgIC8vIFRPRE86IENvbnNpZGVyIHdoZXRoZXIgdGhlIHNlcnZlciBsYXRlbmN5IG1heSBiZSBwYXNzZWQgaW4gYnkgRmFzdE1peGVyCisgICAgLy8gYXMgYSBjb25zdGFudCBmb3IgYWxsIGFjdGl2ZSBGYXN0VHJhY2tzLgorICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSB0aW1lc3RhbXAuZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKHNhbXBsZVJhdGUoKSk7CisgICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2suc3RvcmUodHJ1ZSk7CisgICAgbVNlcnZlckxhdGVuY3lNcy5zdG9yZShsYXRlbmN5TXMpOwogfQogCiAvLyBEb24ndCBjYWxsIGZvciBmYXN0IHRyYWNrczsgdGhlIGZyYW1lc1JlYWR5KCkgY291bGQgcmVzdWx0IGluIHByaW9yaXR5IGludmVyc2lvbgpAQCAtNzEwLDggKzgxMCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uIF9fdW51c2VkKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIEFMT0dWKCJzdGFydCglZCksIGNhbGxpbmcgcGlkICVkIHNlc3Npb24gJWQiLAotICAgICAgICAgICAgbU5hbWUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwgbVNlc3Npb25JZCk7CisgICAgQUxPR1YoIiVzKCVkKTogY2FsbGluZyBwaWQgJWQgc2Vzc2lvbiAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksIG1TZXNzaW9uSWQpOwogCiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CkBAIC03MzcsMTQgKzgzNywxNyBAQAogICAgICAgICAgICAgaWYgKG1SZXN1bWVUb1N0b3BwaW5nKSB7CiAgICAgICAgICAgICAgICAgLy8gaGFwcGVuZWQgd2UgbmVlZCB0byByZXN1bWUgdG8gU1RPUFBJTkdfMQogICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RPUFBJTkdfMTsKLSAgICAgICAgICAgICAgICBBTE9HVigiUEFVU0VEID0+IFNUT1BQSU5HXzEgKCVkKSBvbiB0aHJlYWQgJXAiLCBtTmFtZSwgdGhpcyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogUEFVU0VEID0+IFNUT1BQSU5HXzEgb24gdGhyZWFkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbVN0YXRlID0gVHJhY2tCYXNlOjpSRVNVTUlORzsKLSAgICAgICAgICAgICAgICBBTE9HVigiUEFVU0VEID0+IFJFU1VNSU5HICglZCkgb24gdGhyZWFkICVwIiwgbU5hbWUsIHRoaXMpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IFBBVVNFRCA9PiBSRVNVTUlORyBvbiB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOwotICAgICAgICAgICAgQUxPR1YoIj8gPT4gQUNUSVZFICglZCkgb24gdGhyZWFkICVwIiwgbU5hbWUsIHRoaXMpOworICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogPyA9PiBBQ1RJVkUgb24gdGhyZWFkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gc3RhdGVzIHRvIHJlc2V0IHBvc2l0aW9uIGluZm8gZm9yIG5vbi1vZmZsb2FkZWQvZGlyZWN0IHRyYWNrcwpAQCAtNzkwLDEyICs4OTMsMTUgQEAKICAgICB9IGVsc2UgewogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgfQorICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgZm9yRWFjaFRlZVBhdGNoVHJhY2soW10oYXV0byBwYXRjaFRyYWNrKSB7IHBhdGNoVHJhY2stPnN0YXJ0KCk7IH0pOworICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpzdG9wKCkKIHsKLSAgICBBTE9HVigic3RvcCglZCksIGNhbGxpbmcgcGlkICVkIiwgbU5hbWUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CisgICAgQUxPR1YoIiVzKCVkKTogY2FsbGluZyBwaWQgJWQiLCBfX2Z1bmNfXywgbUlkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CkBAIC04MTksMTUgKzkyNSwxNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5icm9hZGNhc3RfbCgpOwotICAgICAgICAgICAgQUxPR1YoIm5vdCBzdG9wcGluZy9zdG9wcGVkID0+IHN0b3BwaW5nL3N0b3BwZWQgKCVkKSBvbiB0aHJlYWQgJXAiLCBtTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQpOworICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogbm90IHN0b3BwaW5nL3N0b3BwZWQgPT4gc3RvcHBpbmcvc3RvcHBlZCBvbiB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCAoaW50KW1UaHJlYWRJb0hhbmRsZSk7CiAgICAgICAgIH0KICAgICB9CisgICAgZm9yRWFjaFRlZVBhdGNoVHJhY2soW10oYXV0byBwYXRjaFRyYWNrKSB7IHBhdGNoVHJhY2stPnN0b3AoKTsgfSk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnBhdXNlKCkKIHsKLSAgICBBTE9HVigicGF1c2UoJWQpLCBjYWxsaW5nIHBpZCAlZCIsIG1OYW1lLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOworICAgIEFMT0dWKCIlcyglZCk6IGNhbGxpbmcgcGlkICVkIiwgX19mdW5jX18sIG1JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOwpAQCAtODQ2LDcgKzk1Myw4IEBACiAgICAgICAgIGNhc2UgQUNUSVZFOgogICAgICAgICBjYXNlIFJFU1VNSU5HOgogICAgICAgICAgICAgbVN0YXRlID0gUEFVU0lORzsKLSAgICAgICAgICAgIEFMT0dWKCJBQ1RJVkUvUkVTVU1JTkcgPT4gUEFVU0lORyAoJWQpIG9uIHRocmVhZCAlcCIsIG1OYW1lLCB0aHJlYWQuZ2V0KCkpOworICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogQUNUSVZFL1JFU1VNSU5HID0+IFBBVVNJTkcgb24gdGhyZWFkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOwogICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPmJyb2FkY2FzdF9sKCk7CiAgICAgICAgICAgICBicmVhazsKIApAQCAtODU0LDExICs5NjIsMTMgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQorICAgIC8vIFBhdXNpbmcgdGhlIFRlZVBhdGNoIHRvIGF2b2lkIGEgZ2xpdGNoIG9uIHVuZGVycnVuLCBhdCB0aGUgY29zdCBvZiBidWZmZXJlZCBhdWRpbyBsb3NzLgorICAgIGZvckVhY2hUZWVQYXRjaFRyYWNrKFtdKGF1dG8gcGF0Y2hUcmFjaykgeyBwYXRjaFRyYWNrLT5wYXVzZSgpOyB9KTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6Zmx1c2goKQogewotICAgIEFMT0dWKCJmbHVzaCglZCkiLCBtTmFtZSk7CisgICAgQUxPR1YoIiVzKCVkKSIsIF9fZnVuY19fLCBtSWQpOwogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CkBAIC04ODAsMTEgKzk5MCwxMiBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQUxPR1YoImZsdXNoOiBvZmZsb2FkIGZsdXNoIik7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBvZmZsb2FkIGZsdXNoIiwgX19mdW5jX18sIG1JZCk7CiAgICAgICAgICAgICByZXNldCgpOwogCiAgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUT1BQSU5HXzEgfHwgbVN0YXRlID09IFNUT1BQSU5HXzIpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiZmx1c2hlZCBpbiBTVE9QUElOR18xIG9yIDIgc3RhdGUsIGNoYW5nZSBzdGF0ZSB0byBBQ1RJVkUiKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBmbHVzaGVkIGluIFNUT1BQSU5HXzEgb3IgMiBzdGF0ZSwgY2hhbmdlIHN0YXRlIHRvIEFDVElWRSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBBQ1RJVkU7CiAgICAgICAgICAgICB9CiAKQEAgLTkxNCw2ICsxMDI1LDggQEAKICAgICAgICAgLy8gYmVjYXVzZSB0aGUgaGFyZHdhcmUgYnVmZmVyIGNvdWxkIGhvbGQgYSBsYXJnZSBhbW91bnQgb2YgYXVkaW8KICAgICAgICAgcGxheWJhY2tUaHJlYWQtPmJyb2FkY2FzdF9sKCk7CiAgICAgfQorICAgIC8vIEZsdXNoIHRoZSBUZWUgdG8gYXZvaWQgb24gcmVzdW1lIHBsYXlpbmcgb2xkIGRhdGEgYW5kIGdsaXRjaGluZyBvbiB0aGUgdHJhbnNpdGlvbiB0byBuZXcgZGF0YQorICAgIGZvckVhY2hUZWVQYXRjaFRyYWNrKFtdKGF1dG8gcGF0Y2hUcmFjaykgeyBwYXRjaFRyYWNrLT5mbHVzaCgpOyB9KTsKIH0KIAogLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aHJlYWQgbG9jayBoZWxkCkBAIC05NDksNyArMTA2Miw3IEBACiB7CiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJ0aHJlYWQgaXMgZGVhZCIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiB0aHJlYWQgaXMgZGVhZCIsIF9fZnVuY19fLCBtSWQpOwogICAgICAgICByZXR1cm4gRkFJTEVEX1RSQU5TQUNUSU9OOwogICAgIH0gZWxzZSBpZiAoKHRocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6OkRJUkVDVCkgfHwKICAgICAgICAgICAgICAgICAgICAgKHRocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6Ok9GRkxPQUQpKSB7CkBAIC05NTksNiArMTA3MiwxOSBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsCisgICAgICAgIGludCBwcm9ncmFtSWQpIHsKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgQUxPR0UoInRocmVhZCBpcyBkZWFkIik7CisgICAgICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfSBlbHNlIGlmICgodGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6RElSRUNUKSB8fCAodGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6T0ZGTE9BRCkpIHsKKyAgICAgICAgRGlyZWN0T3V0cHV0VGhyZWFkICpkaXJlY3RPdXRwdXRUaHJlYWQgPSBzdGF0aWNfY2FzdDxEaXJlY3RPdXRwdXRUaHJlYWQqPih0aHJlYWQuZ2V0KCkpOworICAgICAgICByZXR1cm4gZGlyZWN0T3V0cHV0VGhyZWFkLT5zZWxlY3RQcmVzZW50YXRpb24ocHJlc2VudGF0aW9uSWQsIHByb2dyYW1JZCk7CisgICAgfQorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKwogVm9sdW1lU2hhcGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmFwcGx5Vm9sdW1lU2hhcGVyKAogICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAogICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikKQEAgLTk2OSw4ICsxMDk1LDEwIEBACiAgICAgICAgIGNvbnN0IFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbjo6T3B0aW9uRmxhZyBvcHRpb25GbGFnCiAgICAgICAgICAgICA9IGNvbmZpZ3VyYXRpb24tPmdldE9wdGlvbkZsYWdzKCk7CiAgICAgICAgIGlmICgob3B0aW9uRmxhZyAmIFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbjo6T1BUSU9OX0ZMQUdfQ0xPQ0tfVElNRSkgPT0gMCkgewotICAgICAgICAgICAgQUxPR1coIiVzIHRyYWNrcyBkbyBub3Qgc3VwcG9ydCBmcmFtZSBjb3VudGVkIFZvbHVtZVNoYXBlciwiCi0gICAgICAgICAgICAgICAgICAgICIgdXNpbmcgY2xvY2sgdGltZSBpbnN0ZWFkIiwgaXNPZmZsb2FkZWQoKSA/ICJPZmZsb2FkIiA6ICJEaXJlY3QiKTsKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6ICVzIHRyYWNrcyBkbyBub3Qgc3VwcG9ydCBmcmFtZSBjb3VudGVkIFZvbHVtZVNoYXBlciwiCisgICAgICAgICAgICAgICAgICAgICIgdXNpbmcgY2xvY2sgdGltZSBpbnN0ZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKKyAgICAgICAgICAgICAgICAgICAgaXNPZmZsb2FkZWQoKSA/ICJPZmZsb2FkIiA6ICJEaXJlY3QiKTsKICAgICAgICAgICAgIG5ld0NvbmZpZ3VyYXRpb24gPSBuZXcgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uKCpjb25maWd1cmF0aW9uKTsKICAgICAgICAgICAgIG5ld0NvbmZpZ3VyYXRpb24tPnNldE9wdGlvbkZsYWdzKAogICAgICAgICAgICAgICAgIFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbjo6T3B0aW9uRmxhZyhvcHRpb25GbGFnCkBAIC05ODUsNyArMTExMyw3IEBACiAgICAgICAgIC8vIFNpZ25hbCB0aHJlYWQgdG8gZmV0Y2ggbmV3IHZvbHVtZS4KICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgICAgIGlmICh0aHJlYWQgIT0gMCkgewotICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKICAgICAgICAgICAgIHRocmVhZC0+YnJvYWRjYXN0X2woKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwMTcsNiArMTE0NSwxMSBAQAogICAgIH07CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnNldFRlZVBhdGNoZXMoVGVlUGF0Y2hlcyB0ZWVQYXRjaGVzKSB7CisgICAgZm9yRWFjaFRlZVBhdGNoVHJhY2soW10oYXV0byBwYXRjaFRyYWNrKSB7IHBhdGNoVHJhY2stPmRlc3Ryb3koKTsgfSk7CisgICAgbVRlZVBhdGNoZXMgPSBzdGQ6Om1vdmUodGVlUGF0Y2hlcyk7Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkKIHsKICAgICBpZiAoIWlzT2ZmbG9hZGVkKCkgJiYgIWlzRGlyZWN0KCkpIHsKQEAgLTExMDUsMTEgKzEyMzgsMTQgQEAKICAgICAvLyB0byBkZXRlY3Qgd2hlbiBhbGwgZnJhbWVzIGhhdmUgYmVlbiBwbGF5ZWQuIEluIHRoaXMgY2FzZSBmcmFtZXNXcml0dGVuIGlzbid0CiAgICAgLy8gdXNlZnVsIGJlY2F1c2UgaXQgZG9lc24ndCBhbHdheXMgcmVmbGVjdCB3aGV0aGVyIHRoZXJlIGlzIGRhdGEgaW4gdGhlIGgvdwogICAgIC8vIGJ1ZmZlcnMsIHBhcnRpY3VsYXJseSBpZiBhIHRyYWNrIGhhcyBiZWVuIHBhdXNlZCBhbmQgcmVzdW1lZCBkdXJpbmcgZHJhaW5pbmcKLSAgICBBTE9HVigicHJlc2VudGF0aW9uQ29tcGxldGUoKSBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgJWxsZCBmcmFtZXNXcml0dGVuICVsbGQiLAorICAgIEFMT0dWKCIlcyglZCk6IHByZXNlbnRhdGlvbkNvbXBsZXRlKCkgbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzICVsbGQgZnJhbWVzV3JpdHRlbiAlbGxkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCiAgICAgICAgICAgICAobG9uZyBsb25nKW1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcywgKGxvbmcgbG9uZylmcmFtZXNXcml0dGVuKTsKICAgICBpZiAobVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzID09IDApIHsKICAgICAgICAgbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzID0gZnJhbWVzV3JpdHRlbiArIGF1ZGlvSGFsRnJhbWVzOwotICAgICAgICBBTE9HVigicHJlc2VudGF0aW9uQ29tcGxldGUoKSByZXNldDogbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzICVsbGQgYXVkaW9IYWxGcmFtZXMgJXp1IiwKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogcHJlc2VudGF0aW9uQ29tcGxldGUoKSByZXNldDoiCisgICAgICAgICAgICAgICAgIiBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgJWxsZCBhdWRpb0hhbEZyYW1lcyAlenUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCiAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMsIGF1ZGlvSGFsRnJhbWVzKTsKICAgICB9CiAKQEAgLTExNzUsNyArMTMxMSw4IEBACiAgICAgaWYgKGlzVGVybWluYXRlZCgpIHx8IG1TdGF0ZSA9PSBQQVVTRUQgfHwKICAgICAgICAgICAgICgoZnJhbWVzUmVhZHkoKSA9PSAwKSAmJiAoKG1TaGFyZWRCdWZmZXIgIT0gMCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1TdGF0ZSA9PSBTVE9QUEVEKSkpKSB7Ci0gICAgICAgIEFMT0dXKCJUcmFjazo6c2V0U3luY0V2ZW50KCkgaW4gaW52YWxpZCBzdGF0ZSAlZCBvbiBzZXNzaW9uICVkICVzIG1vZGUsIGZyYW1lc1JlYWR5ICV6dSIsCisgICAgICAgIEFMT0dXKCIlcyglZCk6IGluIGludmFsaWQgc3RhdGUgJWQgb24gc2Vzc2lvbiAlZCAlcyBtb2RlLCBmcmFtZXNSZWFkeSAlenUiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLAogICAgICAgICAgICAgICBtU3RhdGUsIG1TZXNzaW9uSWQsIChtU2hhcmVkQnVmZmVyICE9IDApID8gInN0YXRpYyIgOiAic3RyZWFtIiwgZnJhbWVzUmVhZHkoKSk7CiAgICAgICAgIGV2ZW50LT5jYW5jZWwoKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTI0Niw3ICsxMzgzLDE3IEBACiAvL1RvIGJlIGNhbGxlZCB3aXRoIHRocmVhZCBsb2NrIGhlbGQKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnVwZGF0ZVRyYWNrRnJhbWVJbmZvKAogICAgICAgICBpbnQ2NF90IHRyYWNrRnJhbWVzUmVsZWFzZWQsIGludDY0X3Qgc2lua0ZyYW1lc1dyaXR0ZW4sCi0gICAgICAgIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lU3RhbXApIHsKKyAgICAgICAgdWludDMyX3QgaGFsU2FtcGxlUmF0ZSwgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVTdGFtcCkgeworICAgLy8gTWFrZSB0aGUga2VybmVsIGZyYW1ldGltZSBhdmFpbGFibGUuCisgICAgY29uc3QgRnJhbWVUaW1lIGZ0eworICAgICAgICAgICAgdGltZVN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgIHRpbWVTdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdfTsKKyAgICAvLyBBTE9HRCgiRnJhbWVUaW1lOiAlbGxkICVsbGQiLCAobG9uZyBsb25nKWZ0LmZyYW1lcywgKGxvbmcgbG9uZylmdC50aW1lTnMpOworICAgIG1LZXJuZWxGcmFtZVRpbWUuc3RvcmUoZnQpOworICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgLy91cGRhdGUgZnJhbWUgbWFwCiAgICAgbUZyYW1lTWFwLnB1c2godHJhY2tGcmFtZXNSZWxlYXNlZCwgc2lua0ZyYW1lc1dyaXR0ZW4pOwogCkBAIC0xMjU1LDYgKzE0MDIsNyBAQAogICAgIC8vIE91ciB0aW1lc3RhbXBzIGFyZSBvbmx5IHVwZGF0ZWQgd2hlbiB0aGUgdHJhY2sgaXMgb24gdGhlIFRocmVhZCBhY3RpdmUgbGlzdC4KICAgICAvLyBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRyYWNrcyBhcmUgbm90IHJlbW92ZWQgYmVmb3JlIGZ1bGwgZHJhaW4uCiAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgbG9jYWwgPSB0aW1lU3RhbXA7CisgICAgYm9vbCBkcmFpbmVkID0gdHJ1ZTsgLy8gZGVmYXVsdCBhc3N1bWUgZHJhaW5lZCwgaWYgbm8gc2VydmVyIGluZm8gZm91bmQKICAgICBib29sIGNoZWNrZWQgPSBmYWxzZTsKICAgICBmb3IgKGludCBpID0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX01BWCAtIDE7CiAgICAgICAgICAgICBpID49IEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVI7IC0taSkgewpAQCAtMTI2MywyMSArMTQxMSw2NCBAQAogICAgICAgICAgICAgbG9jYWwubVBvc2l0aW9uW2ldID0gbUZyYW1lTWFwLmZpbmRYKGxvY2FsLm1Qb3NpdGlvbltpXSk7CiAgICAgICAgICAgICAvLyBjaGVjayBkcmFpbiBzdGF0ZSBmcm9tIHRoZSBsYXRlc3Qgc3RhZ2UgaW4gdGhlIHBpcGVsaW5lLgogICAgICAgICAgICAgaWYgKCFjaGVja2VkICYmIGkgPD0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTCkgewotICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnNldERyYWluZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5tUG9zaXRpb25baV0gPj0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKSk7CisgICAgICAgICAgICAgICAgZHJhaW5lZCA9IGxvY2FsLm1Qb3NpdGlvbltpXSA+PSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWxlYXNlZCgpOwogICAgICAgICAgICAgICAgIGNoZWNrZWQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIGlmICghY2hlY2tlZCkgeyAvLyBubyBzZXJ2ZXIgaW5mbywgYXNzdW1lIGRyYWluZWQuCi0gICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnNldERyYWluZWQodHJ1ZSk7Ci0gICAgfQorCisgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+c2V0RHJhaW5lZChkcmFpbmVkKTsKICAgICAvLyBTZXQgY29ycmVjdGlvbiBmb3IgZmx1c2hlZCBmcmFtZXMgdGhhdCBhcmUgbm90IGFjY291bnRlZCBmb3IgaW4gcmVsZWFzZWQuCiAgICAgbG9jYWwubUZsdXNoZWQgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNGbHVzaGVkKCk7CiAgICAgbVNlcnZlclByb3h5LT5zZXRUaW1lc3RhbXAobG9jYWwpOworCisgICAgLy8gQ29tcHV0ZSBsYXRlbmN5IGluZm8uCisgICAgY29uc3QgYm9vbCB1c2VUcmFja1RpbWVzdGFtcCA9ICFkcmFpbmVkOworICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSB1c2VUcmFja1RpbWVzdGFtcAorICAgICAgICAgICAgPyBsb2NhbC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMoc2FtcGxlUmF0ZSgpKQorICAgICAgICAgICAgOiB0aW1lU3RhbXAuZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKGhhbFNhbXBsZVJhdGUpOworCisgICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2suc3RvcmUodXNlVHJhY2tUaW1lc3RhbXApOworICAgIG1TZXJ2ZXJMYXRlbmN5TXMuc3RvcmUobGF0ZW5jeU1zKTsKK30KKworYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OkF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcjo6bXV0ZSgKKyAgICAgICAgLypvdXQqLyBib29sICpyZXQpIHsKKyAgICAqcmV0ID0gZmFsc2U7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRyYWNrLT5tVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodGhyZWFkICE9IDApIHsKKyAgICAgICAgLy8gTG9jayBmb3IgdXBkYXRpbmcgbUhhcHRpY1BsYXliYWNrRW5hYmxlZC4KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOworICAgICAgICBQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQgPSAoUGxheWJhY2tUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisgICAgICAgIGlmICgobVRyYWNrLT5jaGFubmVsTWFzaygpICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSAhPSBBVURJT19DSEFOTkVMX05PTkUKKyAgICAgICAgICAgICAgICAmJiBwbGF5YmFja1RocmVhZC0+bUhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1UcmFjay0+c2V0SGFwdGljUGxheWJhY2tFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICpyZXQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OkF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcjo6dW5tdXRlKAorICAgICAgICAvKm91dCovIGJvb2wgKnJldCkgeworICAgICpyZXQgPSBmYWxzZTsKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVHJhY2stPm1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICAvLyBMb2NrIGZvciB1cGRhdGluZyBtSGFwdGljUGxheWJhY2tFbmFibGVkLgorICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CisgICAgICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgaWYgKChtVHJhY2stPmNoYW5uZWxNYXNrKCkgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpICE9IEFVRElPX0NIQU5ORUxfTk9ORQorICAgICAgICAgICAgICAgICYmIHBsYXliYWNrVGhyZWFkLT5tSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICAgICAgbVRyYWNrLT5zZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAqcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpPdXRwdXRUcmFjayIKIAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2s6Ok91dHB1dFRyYWNrKAogICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkLApAQCAtMTI5OSw5ICsxNDkwLDkgQEAKICAgICBpZiAobUNibGsgIT0gTlVMTCkgewogICAgICAgICBtT3V0QnVmZmVyLmZyYW1lQ291bnQgPSAwOwogICAgICAgICBwbGF5YmFja1RocmVhZC0+bVRyYWNrcy5hZGQodGhpcyk7Ci0gICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjayBjb25zdHJ1Y3RvciBtQ2JsayAlcCwgbUJ1ZmZlciAlcCwgIgorICAgICAgICBBTE9HVigiJXMoKTogbUNibGsgJXAsIG1CdWZmZXIgJXAsICIKICAgICAgICAgICAgICAgICAiZnJhbWVDb3VudCAlenUsIG1DaGFubmVsTWFzayAweCUwOHgiLAotICAgICAgICAgICAgICAgIG1DYmxrLCBtQnVmZmVyLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtQ2JsaywgbUJ1ZmZlciwKICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBtQ2hhbm5lbE1hc2spOwogICAgICAgICAvLyBzaW5jZSBjbGllbnQgYW5kIHNlcnZlciBhcmUgaW4gdGhlIHNhbWUgcHJvY2VzcywKICAgICAgICAgLy8gdGhlIGJ1ZmZlciBoYXMgdGhlIHNhbWUgdmlydHVhbCBhZGRyZXNzIG9uIGJvdGggc2lkZXMKQEAgLTEzMTEsNyArMTUwMiw4IEBACiAgICAgICAgIG1DbGllbnRQcm94eS0+c2V0U2VuZExldmVsKDAuMCk7CiAgICAgICAgIG1DbGllbnRQcm94eS0+c2V0U2FtcGxlUmF0ZShzYW1wbGVSYXRlKTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiRXJyb3IgY3JlYXRpbmcgb3V0cHV0IHRyYWNrIG9uIHRocmVhZCAlcCIsIHBsYXliYWNrVGhyZWFkKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogRXJyb3IgY3JlYXRpbmcgb3V0cHV0IHRyYWNrIG9uIHRocmVhZCAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOwogICAgIH0KIH0KIApAQCAtMTM0Miw3ICsxNTM0LDcgQEAKICAgICBtQWN0aXZlID0gZmFsc2U7CiB9CiAKLWJvb2wgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2s6OndyaXRlKHZvaWQqIGRhdGEsIHVpbnQzMl90IGZyYW1lcykKK3NzaXplX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2s6OndyaXRlKHZvaWQqIGRhdGEsIHVpbnQzMl90IGZyYW1lcykKIHsKICAgICBCdWZmZXIgKnBJbkJ1ZmZlcjsKICAgICBCdWZmZXIgaW5CdWZmZXI7CkBAIC0xMzczLDggKzE1NjUsOSBAQAogICAgICAgICAgICAgbnNlY3NfdCBzdGFydFRpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvYnRhaW5CdWZmZXIoJm1PdXRCdWZmZXIsIHdhaXRUaW1lTGVmdE1zKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IE5PVF9FTk9VR0hfREFUQSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgbm8gbW9yZSBvdXRwdXQgYnVmZmVyczsgc3RhdHVzICVkIiwgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWQudW5zYWZlX2dldCgpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHRocmVhZCAlZCBubyBtb3JlIG91dHB1dCBidWZmZXJzOyBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbVRocmVhZElvSGFuZGxlLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlckZ1bGwgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTQxMCw4ICsxNjAzLDkgQEAKICAgICAgICAgICAgICAgICBpZiAocEluQnVmZmVyICE9ICZpbkJ1ZmZlcikgewogICAgICAgICAgICAgICAgICAgICBkZWxldGUgcEluQnVmZmVyOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVigiT3V0cHV0VHJhY2s6OndyaXRlKCkgJXAgdGhyZWFkICVwIHJlbGVhc2VkIG92ZXJmbG93IGJ1ZmZlciAlenUiLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZC51bnNhZmVfZ2V0KCksIG1CdWZmZXJRdWV1ZS5zaXplKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHRocmVhZCAlZCByZWxlYXNlZCBvdmVyZmxvdyBidWZmZXIgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KW1UaHJlYWRJb0hhbmRsZSwgbUJ1ZmZlclF1ZXVlLnNpemUoKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTQyOSwxMSArMTYyMywxNCBAQAogICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+cmF3ID0gcEluQnVmZmVyLT5tQnVmZmVyOwogICAgICAgICAgICAgICAgIG1lbWNweShwSW5CdWZmZXItPnJhdywgaW5CdWZmZXIucmF3LCBpbkJ1ZmZlci5mcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLmFkZChwSW5CdWZmZXIpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgYWRkaW5nIG92ZXJmbG93IGJ1ZmZlciAlenUiLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZC51bnNhZmVfZ2V0KCksIG1CdWZmZXJRdWV1ZS5zaXplKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHRocmVhZCAlZCBhZGRpbmcgb3ZlcmZsb3cgYnVmZmVyICV6dSIsIF9fZnVuY19fLCBtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KW1UaHJlYWRJb0hhbmRsZSwgbUJ1ZmZlclF1ZXVlLnNpemUoKSk7CisgICAgICAgICAgICAgICAgLy8gYXVkaW8gZGF0YSBpcyBjb25zdW1lZCAoc3RvcmVkIGxvY2FsbHkpOyBzZXQgZnJhbWVDb3VudCB0byAwLgorICAgICAgICAgICAgICAgIGluQnVmZmVyLmZyYW1lQ291bnQgPSAwOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiT3V0cHV0VHJhY2s6OndyaXRlKCkgJXAgdGhyZWFkICVwIG5vIG1vcmUgb3ZlcmZsb3cgYnVmZmVycyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkLnVuc2FmZV9nZXQoKSwgdGhpcyk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogdGhyZWFkICVkIG5vIG1vcmUgb3ZlcmZsb3cgYnVmZmVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCAoaW50KW1UaHJlYWRJb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogcmV0dXJuIGVycm9yIGZvciB0aGlzLgogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTQ0NCw3ICsxNjQxLDcgQEAKICAgICAgICAgc3RvcCgpOwogICAgIH0KIAotICAgIHJldHVybiBvdXRwdXRCdWZmZXJGdWxsOworICAgIHJldHVybiBmcmFtZXMgLSBpbkJ1ZmZlci5mcmFtZUNvdW50OyAgLy8gbnVtYmVyIG9mIGZyYW1lcyBjb25zdW1lZC4KIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPdXRwdXRUcmFjazo6Y29weU1ldGFkYXRhVG8oTWV0YWRhdGFJbnNlcnRlciYgYmFja0luc2VydGVyKSBjb25zdApAQCAtMTQ5Niw2ICsxNjkzLDEwIEBACiAgICAgfQogfQogCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6UGF0Y2hUcmFjayIKKwogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6UGF0Y2hUcmFjayhQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKQEAgLTE1MDQsMzEgKzE3MDUsMjkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGltZW91dCYgdGltZW91dCkKICAgICA6ICAgVHJhY2socGxheWJhY2tUaHJlYWQsIE5VTEwsIHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdHt9IC8qIGN1cnJlbnRseSB1bnVzZWQgZm9yIHBhdGNoIHRyYWNrICovLAogICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlclNpemUsIG51bGxwdHIgLyogc2hhcmVkQnVmZmVyICovLAotICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX05PTkUsIGdldHVpZCgpLCBmbGFncywgVFlQRV9QQVRDSCksCi0gICAgICAgICAgICAgIG1Qcm94eShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIHRydWUsIHRydWUpKQorICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX05PTkUsIEFJRF9BVURJT1NFUlZFUiwgZmxhZ3MsIFRZUEVfUEFUQ0gpLAorICAgICAgICBQYXRjaFRyYWNrQmFzZShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIHRydWUsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAqcGxheWJhY2tUaHJlYWQsIHRpbWVvdXQpCiB7Ci0gICAgdWludDY0X3QgbWl4QnVmZmVyTnMgPSAoKHVpbnQ2NF90KTIgKiBwbGF5YmFja1RocmVhZC0+ZnJhbWVDb3VudCgpICogMTAwMDAwMDAwMCkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1RocmVhZC0+c2FtcGxlUmF0ZSgpOwotICAgIG1QZWVyVGltZW91dC50dl9zZWMgPSBtaXhCdWZmZXJOcyAvIDEwMDAwMDAwMDA7Ci0gICAgbVBlZXJUaW1lb3V0LnR2X25zZWMgPSAoaW50KSAobWl4QnVmZmVyTnMgJSAxMDAwMDAwMDAwKTsKLQotICAgIEFMT0dWKCJQYXRjaFRyYWNrICVwIHNhbXBsZVJhdGUgJWQgbVBlZXJUaW1lb3V0ICVkLiUwM2Qgc2VjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgc2FtcGxlUmF0ZSwKKyAgICBBTE9HVigiJXMoJWQpOiBzYW1wbGVSYXRlICVkIG1QZWVyVGltZW91dCAlZC4lMDNkIHNlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbVBlZXJUaW1lb3V0LnR2X3NlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkobVBlZXJUaW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKSk7CiB9CiAKIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6On5QYXRjaFRyYWNrKCkKIHsKKyAgICBBTE9HVigiJXMoJWQpIiwgX19mdW5jX18sIG1JZCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OnN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IFRyYWNrOjpzdGFydChldmVudCwgdHJpZ2dlclNlc3Npb24pOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKQEAgLTE1NDIsMTEgKzE3NDEsMTEgQEAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OmdldE5leHRCdWZmZXIoCiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewotICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIlBhdGNoVHJhY2s6OmdldE5leHRCdWZmZXIoKSBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5Iik7CisgICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiJXMoJWQpOiBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5IiwgX19mdW5jX18sIG1JZCk7CiAgICAgUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgYnVmLm1GcmFtZUNvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1QZWVyUHJveHktPm9idGFpbkJ1ZmZlcigmYnVmLCAmbVBlZXJUaW1lb3V0KTsKLSAgICBBTE9HVl9JRihzdGF0dXMgIT0gTk9fRVJST1IsICJQYXRjaFRyYWNrKCkgJXAgZ2V0TmV4dEJ1ZmZlciBzdGF0dXMgJWQiLCB0aGlzLCBzdGF0dXMpOworICAgIEFMT0dWX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgIiVzKCVkKTogZ2V0TmV4dEJ1ZmZlciBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgbUlkLCBzdGF0dXMpOwogICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IGJ1Zi5tRnJhbWVDb3VudDsKICAgICBpZiAoYnVmLm1GcmFtZUNvdW50ID09IDApIHsKICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOwpAQCAtMTU1Nyw3ICsxNzU2LDcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewotICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIlBhdGNoVHJhY2s6OnJlbGVhc2VCdWZmZXIoKSBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5Iik7CisgICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiJXMoJWQpOiBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5IiwgX19mdW5jX18sIG1JZCk7CiAgICAgUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgYnVmLm1GcmFtZUNvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OwogICAgIGJ1Zi5tUmF3ID0gYnVmZmVyLT5yYXc7CkBAIC0xNTkyLDcgKzE3OTEsNyBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpyZXN0YXJ0SWZEaXNhYmxlZCgpCiB7CiAgICAgaWYgKGFuZHJvaWRfYXRvbWljX2FuZCh+Q0JMS19ESVNBQkxFRCwgJm1DYmxrLT5tRmxhZ3MpICYgQ0JMS19ESVNBQkxFRCkgewotICAgICAgICBBTE9HVygiUGF0Y2hUcmFjazo6cmVsZWFzZUJ1ZmZlcigpIGRpc2FibGVkIGR1ZSB0byBwcmV2aW91cyB1bmRlcnJ1biwgcmVzdGFydGluZyIpOworICAgICAgICBBTE9HVygiJXMoJWQpOiBkaXNhYmxlZCBkdWUgdG8gcHJldmlvdXMgdW5kZXJydW4sIHJlc3RhcnRpbmciLCBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgc3RhcnQoKTsKICAgICB9CiB9CkBAIC0xNjAwLDYgKzE3OTksOCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICBSZWNvcmQKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpSZWNvcmRIYW5kbGUiCiAKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpSZWNvcmRIYW5kbGUoCiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjaz4mIHJlY29yZFRyYWNrKQpAQCAtMTYxNSw3ICsxODE2LDcgQEAKIAogYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OnN0YXJ0KGludCAvKkF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QqLyBldmVudCwKICAgICAgICAgaW50IC8qYXVkaW9fc2Vzc2lvbl90Ki8gdHJpZ2dlclNlc3Npb24pIHsKLSAgICBBTE9HVigiUmVjb3JkSGFuZGxlOjpzdGFydCgpIik7CisgICAgQUxPR1YoIiVzKCkiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCgKICAgICAgICAgbVJlY29yZFRyYWNrLT5zdGFydCgoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdClldmVudCwgKGF1ZGlvX3Nlc3Npb25fdCkgdHJpZ2dlclNlc3Npb24pKTsKIH0KQEAgLTE2MjYsMTggKzE4MjcsMzIgQEAKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6c3RvcF9ub252aXJ0dWFsKCkgewotICAgIEFMT0dWKCJSZWNvcmRIYW5kbGU6OnN0b3AoKSIpOworICAgIEFMT0dWKCIlcygpIiwgX19mdW5jX18pOwogICAgIG1SZWNvcmRUcmFjay0+c3RvcCgpOwogfQogCiBiaW5kZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCiAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKSB7Ci0gICAgQUxPR1YoIlJlY29yZEhhbmRsZTo6Z2V0QWN0aXZlTWljcm9waG9uZXMoKSIpOworICAgIEFMT0dWKCIlcygpIiwgX19mdW5jX18pOwogICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoCiAgICAgICAgICAgICBtUmVjb3JkVHJhY2stPmdldEFjdGl2ZU1pY3JvcGhvbmVzKGFjdGl2ZU1pY3JvcGhvbmVzKSk7CiB9CiAKK2JpbmRlcjo6U3RhdHVzIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpzZXRNaWNyb3Bob25lRGlyZWN0aW9uKAorICAgICAgICBpbnQgLyphdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90Ki8gZGlyZWN0aW9uKSB7CisgICAgQUxPR1YoIiVzKCkiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVChtUmVjb3JkVHJhY2stPnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90PihkaXJlY3Rpb24pKSk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgeworICAgIEFMT0dWKCIlcygpIiwgX19mdW5jX18pOworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QobVJlY29yZFRyYWNrLT5zZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSkpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6UmVjb3JkVHJhY2siCiAKIC8vIFJlY29yZFRyYWNrIGNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBhbmQgVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpSZWNvcmRUcmFjaygKQEAgLTE2NzIsMTggKzE4ODcsMjAgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIG1SZWNvcmRCdWZmZXJDb252ZXJ0ZXIgPSBuZXcgUmVjb3JkQnVmZmVyQ29udmVydGVyKAotICAgICAgICAgICAgdGhyZWFkLT5tQ2hhbm5lbE1hc2ssIHRocmVhZC0+bUZvcm1hdCwgdGhyZWFkLT5tU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmb3JtYXQsIHNhbXBsZVJhdGUpOwotICAgIC8vIENoZWNrIGlmIHRoZSBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIgY29uc3RydWN0aW9uIHdhcyBzdWNjZXNzZnVsLgotICAgIC8vIElmIG5vdCwgZG9uJ3QgY29udGludWUgd2l0aCBjb25zdHJ1Y3Rpb24uCi0gICAgLy8KLSAgICAvLyBOT1RFOiBJdCB3b3VsZCBiZSBleHRyZW1lbHkgcmFyZSB0aGF0IHRoZSByZWNvcmQgdHJhY2sgY2Fubm90IGJlIGNyZWF0ZWQKLSAgICAvLyBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlLCBidXQgYSBwZW5kaW5nIG9yIGZ1dHVyZSBkZXZpY2UgY2hhbmdlIHdvdWxkIG1ha2UKLSAgICAvLyB0aGUgcmVjb3JkIHRyYWNrIGNvbmZpZ3VyYXRpb24gdmFsaWQuCi0gICAgaWYgKG1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJSZWNvcmRUcmFjayB1bmFibGUgdG8gY3JlYXRlIHJlY29yZCBidWZmZXIgY29udmVydGVyIik7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAoIWlzRGlyZWN0KCkpIHsKKyAgICAgICAgbVJlY29yZEJ1ZmZlckNvbnZlcnRlciA9IG5ldyBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIoCisgICAgICAgICAgICAgICAgdGhyZWFkLT5tQ2hhbm5lbE1hc2ssIHRocmVhZC0+bUZvcm1hdCwgdGhyZWFkLT5tU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZm9ybWF0LCBzYW1wbGVSYXRlKTsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIFJlY29yZEJ1ZmZlckNvbnZlcnRlciBjb25zdHJ1Y3Rpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAgIC8vIElmIG5vdCwgZG9uJ3QgY29udGludWUgd2l0aCBjb25zdHJ1Y3Rpb24uCisgICAgICAgIC8vCisgICAgICAgIC8vIE5PVEU6IEl0IHdvdWxkIGJlIGV4dHJlbWVseSByYXJlIHRoYXQgdGhlIHJlY29yZCB0cmFjayBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAgICAvLyBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlLCBidXQgYSBwZW5kaW5nIG9yIGZ1dHVyZSBkZXZpY2UgY2hhbmdlIHdvdWxkIG1ha2UKKyAgICAgICAgLy8gdGhlIHJlY29yZCB0cmFjayBjb25maWd1cmF0aW9uIHZhbGlkLgorICAgICAgICBpZiAobVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IFJlY29yZFRyYWNrIHVuYWJsZSB0byBjcmVhdGUgcmVjb3JkIGJ1ZmZlciBjb252ZXJ0ZXIiLCBfX2Z1bmNfXywgbUlkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIG1TZXJ2ZXJQcm94eSA9IG5ldyBBdWRpb1JlY29yZFNlcnZlclByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LApAQCAtMTY5NCwxMiArMTkxMSwyMCBAQAogICAgIGlmIChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICBBTE9HX0FTU0VSVCh0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbCk7CiAgICAgICAgIHRocmVhZC0+bUZhc3RUcmFja0F2YWlsID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVE9ETzogb25seSBOb3JtYWwgUmVjb3JkIGhhcyB0aW1lc3RhbXBzIChGYXN0IFJlY29yZCBkb2VzIG5vdCkuCisgICAgICAgIG1TZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkID0gY2hlY2tTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKG1Gb3JtYXQsIGZsYWdzKTsKICAgICB9CisjaWZkZWYgVEVFX1NJTksKKyAgICBtVGVlLnNldElkKHN0ZDo6c3RyaW5nKCJfIikgKyBzdGQ6OnRvX3N0cmluZyhtVGhyZWFkSW9IYW5kbGUpCisgICAgICAgICAgICArICJfIiArIHN0ZDo6dG9fc3RyaW5nKG1JZCkKKyAgICAgICAgICAgICsgIl9SIik7CisjZW5kaWYKIH0KIAogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjp+UmVjb3JkVHJhY2soKQogewotICAgIEFMT0dWKCIlcyIsIF9fZnVuY19fKTsKKyAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgbVJlY29yZEJ1ZmZlckNvbnZlcnRlcjsKICAgICBkZWxldGUgbVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOwogfQpAQCAtMTc1NiwxNyArMTk4MSwzNCBAQAogICAgIC8vIHNlZSBjb21tZW50cyBhdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6ZGVzdHJveSgpCiAgICAgc3A8UmVjb3JkVHJhY2s+IGtlZXAodGhpcyk7CiAgICAgewotICAgICAgICBpZiAoaXNFeHRlcm5hbFRyYWNrKCkpIHsKLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gQUNUSVZFIHx8IG1TdGF0ZSA9PSBSRVNVTUlORykgewotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQobVBvcnRJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KG1Qb3J0SWQpOwotICAgICAgICB9CisgICAgICAgIHRyYWNrX3N0YXRlIHByaW9yU3RhdGUgPSBtU3RhdGU7CiAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKICAgICAgICAgICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKSB0aHJlYWQuZ2V0KCk7Ci0gICAgICAgICAgICByZWNvcmRUaHJlYWQtPmRlc3Ryb3lUcmFja19sKHRoaXMpOworICAgICAgICAgICAgcHJpb3JTdGF0ZSA9IG1TdGF0ZTsKKyAgICAgICAgICAgIHJlY29yZFRocmVhZC0+ZGVzdHJveVRyYWNrX2wodGhpcyk7IC8vIG1vdmUgbVN0YXRlIHRvIFNUT1BQRUQsIHRlcm1pbmF0ZQorICAgICAgICB9CisgICAgICAgIC8vIEFQTSBwb3J0aWQvY2xpZW50IG1hbmFnZW1lbnQgZG9uZSBvdXRzaWRlIG9mIGxvY2suCisgICAgICAgIC8vIE5PVEU6IGlmIHRocmVhZCBkb2Vzbid0IGV4aXN0LCB0aGUgaW5wdXQgZGVzY3JpcHRvciBwcm9iYWJseSBkb2Vzbid0IGVpdGhlci4KKyAgICAgICAgaWYgKGlzRXh0ZXJuYWxUcmFjaygpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHByaW9yU3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgQUNUSVZFOiAgICAgLy8gaW52YWxpZGF0ZWQgd2hpbGUgc3RpbGwgYWN0aXZlCisgICAgICAgICAgICBjYXNlIFNUQVJUSU5HXzI6IC8vIGludmFsaWRhdGVkL3N0YXJ0LWFib3J0ZWQgYWZ0ZXIgc3RhcnRJbnB1dCBzdWNjZXNzZnVsbHkgY2FsbGVkCisgICAgICAgICAgICBjYXNlIFBBVVNJTkc6ICAgIC8vIGludmFsaWRhdGVkIHdoaWxlIGluIHRoZSBtaWRkbGUgb2Ygc3RvcCgpIHBhdXNpbmcgKHN0aWxsIGFjdGl2ZSkKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KG1Qb3J0SWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNUQVJUSU5HXzE6IC8vIGludmFsaWRhdGVkL3N0YXJ0LWFib3J0ZWQgYW5kIHN0YXJ0SW5wdXQgbm90IHN1Y2Nlc3NmdWwKKyAgICAgICAgICAgIGNhc2UgUEFVU0VEOiAgICAgLy8gT0ssIG5vdCBhY3RpdmUKKyAgICAgICAgICAgIGNhc2UgSURMRTogICAgICAgLy8gT0ssIG5vdCBhY3RpdmUKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTVE9QUEVEOiAgICAvLyB1bmV4cGVjdGVkIChkZXN0cm95ZWQpCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzKCVkKTogaW52YWxpZCBwcmlvciBzdGF0ZTogJWQiLCBfX2Z1bmNfXywgbUlkLCBwcmlvclN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQobVBvcnRJZCk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0xNzgzLDMxICsyMDI1LDUwIEBACiB9CiAKIAotLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiQWN0aXZlIENsaWVudCBTZXNzaW9uIFMgIEZsYWdzICAgRm9ybWF0IENobiBtYXNrICBTUmF0ZSAgIFNlcnZlciBGcm1DbnQgU2lsXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJBY3RpdmUgICAgIElkIENsaWVudCBTZXNzaW9uIFBvcnQgSWQgIFMgIEZsYWdzICAiCisgICAgICAgICAgICAgICAgICAgICAgICAiIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgU291cmNlICAiCisgICAgICAgICAgICAgICAgICAgICAgICAiIFNlcnZlciBGcm1DbnQgRnJtUmR5IFNpbCVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKCkgPyAiICAgTGF0ZW5jeSIgOiAiIik7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjphcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMlNXMgJTZ1ICU3dSAlMnMgMHglMDNYICIKLSAgICAgICAgICAgICIlMDhYICUwOFggJTZ1ICIKLSAgICAgICAgICAgICIlMDhYICU2enUgJTNjXG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjJTVzICU2ZCAlNnUgJTd1ICU3dSAgJTJzIDB4JTAzWCAiCisgICAgICAgICAgICAiJTA4WCAlMDhYICU2dSAlNlggIgorICAgICAgICAgICAgIiUwOFggJTZ6dSAlNnp1ICUzYyIsCiAgICAgICAgICAgICBpc0Zhc3RUcmFjaygpID8gJ0YnIDogJyAnLAogICAgICAgICAgICAgYWN0aXZlID8gInllcyIgOiAibm8iLAotICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCisgICAgICAgICAgICBtSWQsCisgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZCgpIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgbVBvcnRJZCwKICAgICAgICAgICAgIGdldFRyYWNrU3RhdGVTdHJpbmcoKSwKICAgICAgICAgICAgIG1DYmxrLT5tRmxhZ3MsCiAKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIG1BdHRyLnNvdXJjZSwKIAogICAgICAgICAgICAgbUNibGstPm1TZXJ2ZXIsCiAgICAgICAgICAgICBtRnJhbWVDb3VudCwKKyAgICAgICAgICAgIG1TZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHlTYWZlKCksCiAgICAgICAgICAgICBpc1NpbGVuY2VkKCkgPyAncycgOiAnbicKICAgICAgICAgICAgICk7CisgICAgaWYgKGlzU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgpKSB7CisgICAgICAgIGRvdWJsZSBsYXRlbmN5TXM7CisgICAgICAgIGJvb2wgZnJvbVRyYWNrOworICAgICAgICBpZiAoZ2V0VHJhY2tMYXRlbmN5TXMoJmxhdGVuY3lNcywgJmZyb21UcmFjaykgPT0gT0spIHsKKyAgICAgICAgICAgIC8vIFNob3cgbGF0ZW5jeSBpbiBtc2VjLCBmb2xsb3dlZCBieSAndCcgaWYgZnJvbSB0cmFjayB0aW1lc3RhbXAgKHRoZSBtb3N0IGFjY3VyYXRlKQorICAgICAgICAgICAgLy8gb3IgJ2snIGlmIGVzdGltYXRlZCBmcm9tIGtlcm5lbCAodXN1YWxseSBmb3IgZGVidWdnaW5nKS4KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAlNy4ybGYgJWMiLCBsYXRlbmN5TXMsIGZyb21UcmFjayA/ICd0JyA6ICdrJyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlMTBzIiwgbUNibGstPm1TZXJ2ZXIgIT0gMCA/ICJ1bmF2YWlsIiA6ICJuZXciKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6aGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpCkBAIC0xODM3LDYgKzIwOTgsMTYgQEAKICAgICAgICAgaW50NjRfdCB0cmFja0ZyYW1lc1JlbGVhc2VkLCBpbnQ2NF90IHNvdXJjZUZyYW1lc1JlYWQsCiAgICAgICAgIHVpbnQzMl90IGhhbFNhbXBsZVJhdGUsIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lc3RhbXApCiB7CisgICAvLyBNYWtlIHRoZSBrZXJuZWwgZnJhbWV0aW1lIGF2YWlsYWJsZS4KKyAgICBjb25zdCBGcmFtZVRpbWUgZnR7CisgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF19OworICAgIC8vIEFMT0dEKCJGcmFtZVRpbWU6ICVsbGQgJWxsZCIsIChsb25nIGxvbmcpZnQuZnJhbWVzLCAobG9uZyBsb25nKWZ0LnRpbWVOcyk7CisgICAgbUtlcm5lbEZyYW1lVGltZS5zdG9yZShmdCk7CisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBFeHRlbmRlZFRpbWVzdGFtcCBsb2NhbCA9IHRpbWVzdGFtcDsKIAogICAgIC8vIENvbnZlcnQgSEFMIGZyYW1lcyB0byBzZXJ2ZXItc2lkZSB0cmFjayBmcmFtZXMgYXQgdHJhY2sgc2FtcGxlIHJhdGUuCkBAIC0xODUwLDYgKzIxMjEsMTUgQEAKICAgICAgICAgfQogICAgIH0KICAgICBtU2VydmVyUHJveHktPnNldFRpbWVzdGFtcChsb2NhbCk7CisKKyAgICAvLyBDb21wdXRlIGxhdGVuY3kgaW5mby4KKyAgICBjb25zdCBib29sIHVzZVRyYWNrVGltZXN0YW1wID0gdHJ1ZTsgLy8gdXNlIHRyYWNrIHVubGVzcyBkZWJ1Z2dpbmcuCisgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IC0gKHVzZVRyYWNrVGltZXN0YW1wCisgICAgICAgICAgICA/IGxvY2FsLmdldE91dHB1dFNlcnZlckxhdGVuY3lNcyhzYW1wbGVSYXRlKCkpCisgICAgICAgICAgICA6IHRpbWVzdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMoaGFsU2FtcGxlUmF0ZSkpOworCisgICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2suc3RvcmUodXNlVHJhY2tUaW1lc3RhbXApOworICAgIG1TZXJ2ZXJMYXRlbmN5TXMuc3RvcmUobGF0ZW5jeU1zKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKQEAgLTE4NjQsNiArMjE0NCwzMSBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpzZXRNaWNyb3Bob25lRGlyZWN0aW9uKAorICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgeworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisgICAgICAgIHJldHVybiByZWNvcmRUaHJlYWQtPnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oZGlyZWN0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpzZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgeworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisgICAgICAgIHJldHVybiByZWNvcmRUaHJlYWQtPnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6OlBhdGNoUmVjb3JkIgorCiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6OlBhdGNoUmVjb3JkKFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKQEAgLTE4NzEsMzggKzIxNzYsMzcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVvdXQmIHRpbWVvdXQpCiAgICAgOiAgIFJlY29yZFRyYWNrKHJlY29yZFRocmVhZCwgTlVMTCwKICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3R7fSAvKiBjdXJyZW50bHkgdW51c2VkIGZvciBwYXRjaCB0cmFjayAqLywKICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgQVVESU9fU0VTU0lPTl9OT05FLCBnZXR1aWQoKSwgZmxhZ3MsIFRZUEVfUEFUQ0gpLAotICAgICAgICAgICAgICAgIG1Qcm94eShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIGZhbHNlLCB0cnVlKSkKKyAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlclNpemUsIEFVRElPX1NFU1NJT05fTk9ORSwgQUlEX0FVRElPU0VSVkVSLAorICAgICAgICAgICAgICAgIGZsYWdzLCBUWVBFX1BBVENIKSwKKyAgICAgICAgUGF0Y2hUcmFja0Jhc2UobmV3IENsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplLCBmYWxzZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICpyZWNvcmRUaHJlYWQsIHRpbWVvdXQpCiB7Ci0gICAgdWludDY0X3QgbWl4QnVmZmVyTnMgPSAoKHVpbnQ2NF90KTIgKiByZWNvcmRUaHJlYWQtPmZyYW1lQ291bnQoKSAqIDEwMDAwMDAwMDApIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRUaHJlYWQtPnNhbXBsZVJhdGUoKTsKLSAgICBtUGVlclRpbWVvdXQudHZfc2VjID0gbWl4QnVmZmVyTnMgLyAxMDAwMDAwMDAwOwotICAgIG1QZWVyVGltZW91dC50dl9uc2VjID0gKGludCkgKG1peEJ1ZmZlck5zICUgMTAwMDAwMDAwMCk7Ci0KLSAgICBBTE9HVigiUGF0Y2hSZWNvcmQgJXAgc2FtcGxlUmF0ZSAlZCBtUGVlclRpbWVvdXQgJWQuJTAzZCBzZWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBzYW1wbGVSYXRlLAorICAgIEFMT0dWKCIlcyglZCk6IHNhbXBsZVJhdGUgJWQgbVBlZXJUaW1lb3V0ICVkLiUwM2Qgc2VjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCltUGVlclRpbWVvdXQudHZfc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShtUGVlclRpbWVvdXQudHZfbnNlYyAvIDEwMDAwMDApKTsKIH0KIAogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkOjp+UGF0Y2hSZWNvcmQoKQogeworICAgIEFMT0dWKCIlcyglZCkiLCBfX2Z1bmNfXywgbUlkKTsKIH0KIAogLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZDo6Z2V0TmV4dEJ1ZmZlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCiB7Ci0gICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiUGF0Y2hSZWNvcmQ6OmdldE5leHRCdWZmZXIoKSBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5Iik7CisgICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiJXMoJWQpOiBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5IiwgX19mdW5jX18sIG1JZCk7CiAgICAgUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgYnVmLm1GcmFtZUNvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1QZWVyUHJveHktPm9idGFpbkJ1ZmZlcigmYnVmLCAmbVBlZXJUaW1lb3V0KTsKICAgICBBTE9HVl9JRihzdGF0dXMgIT0gTk9fRVJST1IsCi0gICAgICAgICAgICAgIlBhdGNoUmVjb3JkKCkgJXAgbVBlZXJQcm94eS0+b2J0YWluQnVmZmVyIHN0YXR1cyAlZCIsIHRoaXMsIHN0YXR1cyk7CisgICAgICAgICAgICAgIiVzKCVkKTogbVBlZXJQcm94eS0+b2J0YWluQnVmZmVyIHN0YXR1cyAlZCIsIF9fZnVuY19fLCBtSWQsIHN0YXR1cyk7CiAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gYnVmLm1GcmFtZUNvdW50OwogICAgIGlmIChidWYubUZyYW1lQ291bnQgPT0gMCkgewogICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CkBAIC0xOTEzLDcgKzIyMTcsNyBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZDo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKLSAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFJlY29yZDo6cmVsZWFzZUJ1ZmZlcigpIGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiKTsKKyAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICIlcyglZCk6IGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiLCBfX2Z1bmNfXywgbUlkKTsKICAgICBQcm94eTo6QnVmZmVyIGJ1ZjsKICAgICBidWYubUZyYW1lQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CiAgICAgYnVmLm1SYXcgPSBidWZmZXItPnJhdzsKQEAgLTE5MzIsNyArMjIzNiw5IEBACiAgICAgbVByb3h5LT5yZWxlYXNlQnVmZmVyKGJ1ZmZlcik7CiB9CiAKLQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6Ok1tYXBUcmFjayIKIAogQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6Ok1tYXBUcmFjayhUaHJlYWRCYXNlICp0aHJlYWQsCiAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwKQEAgLTE5NDAsMTMgKzIyNDYsMTQgQEAKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgYm9vbCBpc091dCwKICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBOVUxMLCBhdHRyLCBzYW1wbGVSYXRlLCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgKHNpemVfdCkwIC8qIGZyYW1lQ291bnQgKi8sCiAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sCi0gICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgZmFsc2UgLyogaXNPdXQgKi8sCisgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgaXNPdXQsCiAgICAgICAgICAgICAgICAgICBBTExPQ19OT05FLAogICAgICAgICAgICAgICAgICAgVFlQRV9ERUZBVUxULCBwb3J0SWQpLAogICAgICAgICBtUGlkKHBpZCksIG1TaWxlbmNlZChmYWxzZSksIG1TaWxlbmNlZE5vdGlmaWVkKGZhbHNlKQpAQCAtMTk2Myw3ICsyMjcwLDcgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OnN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQgX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiBfX3VudXNlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24gX191bnVzZWQpCiB7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMTk5NCwxOSArMjMwMSwyOCBAQAogewogfQogCi0vKnN0YXRpYyovIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiQ2xpZW50IFNlc3Npb24gICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJDbGllbnQgU2Vzc2lvbiBQb3J0IElkICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlIEZsYWdzICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNPdXQoKSA/ICJVc2cgQ1QiOiAiU291cmNlIik7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OmFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSBfX3VudXNlZCkKIHsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlNnUgJTd1ICUwOFggJTA4WCAlNnVcbiIsCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTZ1ICU3dSAlN3UgJTA4WCAlMDhYICU2dSAweCUwM1ggIiwKICAgICAgICAgICAgIG1QaWQsCiAgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgbVBvcnRJZCwKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIG1BdHRyLmZsYWdzKTsKKyAgICBpZiAoaXNPdXQoKSkgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlM3ggJTJ4IiwgbUF0dHIudXNhZ2UsIG1BdHRyLmNvbnRlbnRfdHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTZ4IiwgbUF0dHIuc291cmNlKTsKKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaAppbmRleCAzOGMzYzAyLi42ZWYxOWJmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaApAQCAtOTcsOCArOTcsNDIgQEAKICNkZWZpbmUgTE9HX0FVRElPX1NUQVRFKCkgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAogICAgICAgICB4LT5sb2dFdmVudEhpc3RUcyhOQkxvZzo6RVZFTlRfQVVESU9fU1RBVEUsIGhhc2goX19GSUxFX18sIF9fTElORV9fKSk7IH0gd2hpbGUoMCkKIAorLy8gTG9nIHRoZSBkaWZmZXJlbmNlIGJld3RlZW4gZnJhbWVzIHByZXNlbnRlZCBieSBIQUwgYW5kIGZyYW1lcyB3cml0dGVuIHRvIEhBTCBvdXRwdXQgc2luaywKKy8vIGRpdmlkZWQgYnkgdGhlIHNhbXBsZSByYXRlLiBQYXJhbWV0ZXIgbXMgaXMgb2YgdHlwZSBkb3VibGUuCisjZGVmaW5lIExPR19MQVRFTkNZKG1zKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCisgICAgICAgIHgtPmxvZzxOQkxvZzo6RVZFTlRfTEFURU5DWT4obXMpOyB9IHdoaWxlICgwKQorCisvLyBSZWNvcmQgdGhyZWFkIG92ZXJydW4gZXZlbnQgbmFub3NlY29uZCB0aW1lc3RhbXAuIFBhcmFtZXRlciBucyBpcyBhbiBpbnQ2NF90LgorI2RlZmluZSBMT0dfT1ZFUlJVTihucykgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAorICAgICAgICB4LT5sb2c8TkJMb2c6OkVWRU5UX09WRVJSVU4+KG5zKTsgfSB3aGlsZSAoMCkKKworLy8gUmVjb3JkIHRocmVhZCBpbmZvLiBUaGlzIGN1cnJlbnRseSBpbmNsdWRlcyB0eXBlLCBmcmFtZUNvdW50LCBhbmQgc2FtcGxlUmF0ZS4KKy8vIFBhcmFtZXRlciB0eXBlIGlzIHRocmVhZF9pbmZvX3QgYXMgZGVmaW5lZCBpbiBOQkxvZy5oLgorI2RlZmluZSBMT0dfVEhSRUFEX0lORk8oaW5mbykgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgXAorICAgICAgICBpZiAoeCAhPSBudWxscHRyKSB4LT5sb2c8TkJMb2c6OkVWRU5UX1RIUkVBRF9JTkZPPihpbmZvKTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBMT0dfVEhSRUFEX1BBUkFNUyhwYXJhbXMpIGRvIHtOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgXAorICAgICAgICBpZiAoeCAhPSBudWxscHRyKSB4LT5sb2c8TkJMb2c6OkVWRU5UX1RIUkVBRF9QQVJBTVM+KHBhcmFtcyk7IH0gd2hpbGUgKDApCisKKy8vIFJlY29yZCB0aHJlYWQgdW5kZXJydW4gZXZlbnQgbmFub3NlY29uZCB0aW1lc3RhbXAuIFBhcmFtZXRlciBucyBpcyBhbiBpbnQ2NF90LgorI2RlZmluZSBMT0dfVU5ERVJSVU4obnMpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKKyAgICAgICAgeC0+bG9nPE5CTG9nOjpFVkVOVF9VTkRFUlJVTj4obnMpOyB9IHdoaWxlICgwKQorCisvLyBSZWNvcmQgdGhyZWFkIHdhcm11cCB0aW1lIGluIG1pbGxpc2Vjb25kcy4gUGFyYW1ldGVyIG1zIGlzIG9mIHR5cGUgZG91YmxlLgorI2RlZmluZSBMT0dfV0FSTVVQX1RJTUUobXMpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKKyAgICAgICAgeC0+bG9nPE5CTG9nOjpFVkVOVF9XQVJNVVBfVElNRT4obXMpOyB9IHdoaWxlICgwKQorCisvLyBSZWNvcmQgYSB0eXBlZCBlbnRyeSB0aGF0IHJlcHJlc2VudHMgYSB0aHJlYWQncyB3b3JrIHRpbWUgaW4gbmFub3NlY29uZHMuCisvLyBQYXJhbWV0ZXIgbnMgc2hvdWxkIGJlIG9mIHR5cGUgdWludDMyX3QuCisjZGVmaW5lIExPR19XT1JLX1RJTUUobnMpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKKyAgICAgICAgeC0+bG9nPE5CTG9nOjpFVkVOVF9XT1JLX1RJTUU+KG5zKTsgfSB3aGlsZSAoMCkKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogZXh0ZXJuICJDIiB7CisvLyBUT0RPIGNvbnNpZGVyIGFkZGluZyBhIHRocmVhZF9sb2NhbCBOQkxvZzo6V3JpdGVyIHRsRHVtbXlOQkxvZ1dyaXRlciBhbmQgdGhlbgorLy8gaW5pdGlhbGl6ZSBiZWxvdyB0bE5CTG9nV3JpdGVyIHRvICZ0bER1bW15TkJMb2dXcml0ZXIgdG8gcmVtb3ZlIHRoZSBuZWVkIHRvCisvLyBjaGVjayBmb3IgbnVsbHB0ciBldmVyeSB0aW1lLiBBbHNvIHJlZHVjZXMgdGhlIG5lZWQgdG8gYWRkIGEgbmV3IGxvZ2dpbmcgbWFjcm8gYWJvdmUKKy8vIGVhY2ggdGltZSB3ZSB3YW50IHRvIGxvZyBhIG5ldyB0eXBlLgogZXh0ZXJuIHRocmVhZF9sb2NhbCBOQkxvZzo6V3JpdGVyICp0bE5CTG9nV3JpdGVyOwogfQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKaW5kZXggNGM5MGJiNS4uM2JhZGRhMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCkBAIC0xMSw5ICsxMSwxMCBAQAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS91dGlsaXRpZXMKKworTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9wb2xpY3ljb21tb24gXAorICAgIGxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzIFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGliY3V0aWxzIFwKQEAgLTIyLDExICsyMywxNSBAQAogICAgIGxpYmJpbmRlciBcCiAgICAgbGliYXVkaW9jbGllbnQgXAogICAgIGxpYmhhcmR3YXJlX2xlZ2FjeSBcCi0gICAgbGlic2VydmljZXV0aWxpdHkgXAogICAgIGxpYmF1ZGlvcG9saWN5bWFuYWdlciBcCiAgICAgbGlibWVkaWFfaGVscGVyIFwKICAgICBsaWJtZWRpYW1ldHJpY3MgXAotICAgIGxpYmVmZmVjdHNjb25maWcKKyAgICBsaWJtZWRpYXV0aWxzIFwKKyAgICBsaWJlZmZlY3RzY29uZmlnIFwKKyAgICBsaWJzZW5zb3Jwcml2YWN5CisKK0xPQ0FMX0VYUE9SVF9TSEFSRURfTElCUkFSWV9IRUFERVJTIDo9IFwKKyAgICBsaWJzZW5zb3Jwcml2YWN5CiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwpAQCAtNDgsNiArNTMsNyBAQAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlidXRpbHMgXAogICAgIGxpYmxvZyBcCisgICAgbGliYXVkaW9wb2xpY3kgXAogICAgIGxpYnNvdW5kdHJpZ2dlcgogCiBpZmVxICgkKFVTRV9DT05GSUdVUkFCTEVfQVVESU9fUE9MSUNZKSwgMSkKQEAgLTU2LDEwICs2Miw2IEBACiAkKGVycm9yIENvbmZpZ3VyYWJsZSBwb2xpY3kgZG9lcyBub3Qgc3VwcG9ydCBsZWdhY3kgY29uZiBmaWxlKQogZW5kaWYgI2lmbmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQogCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKLSAgICBwYXJhbWV0ZXItZnJhbWV3b3JrLnBvbGljeSBcCi0gICAgYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYgXAotCiBMT0NBTF9DX0lOQ0xVREVTICs9IGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUKIExPQ0FMX0NfSU5DTFVERVMgKz0gZnJhbWV3b3Jrcy9hdi9pbmNsdWRlCiAKQEAgLTcyLDkgKzc0LDExIEBACiBlbmRpZiAjIGlmZXEgKCQoVVNFX0NPTkZJR1VSQUJMRV9BVURJT19QT0xJQ1kpLCAxKQogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCisKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmF1ZGlvcG9saWN5Y29tbW9uIFwKKyAgICBsaWJhdWRpb3BvbGljeWVuZ2luZV9pbnRlcmZhY2VfaGVhZGVycwogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKQEAgLTgyLDkgKzg2LDkgQEAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlibWVkaWFfaGVscGVyCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYm1lZGlhbWV0cmljcwogCi1pZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJ4bWwyCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmJpbmRlciBsaWJoaWRsYmFzZSBsaWJ4bWwyCiAKK2lmZXEgKCQoVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORiksIDEpCiBMT0NBTF9DRkxBR1MgKz0gLURVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCiBlbmRpZiAjaWZlcSAoJChVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GKSwgMSkKIApAQCAtMTEwLDggKzExNCwxMSBAQAogICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKKworTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9wb2xpY3ljb21tb24gXAorICAgIGxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzCiAKIExPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCmluZGV4IDQ4MTJiMWYuLmFjYmZjOWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaApAQCAtNTgsMjcgKzU4LDE1IEBACiAgICAgdHlwZWRlZiBlbnVtIHsKICAgICAgICAgQVBJX0lOUFVUX0lOVkFMSUQgPSAtMSwKICAgICAgICAgQVBJX0lOUFVUX0xFR0FDWSAgPSAwLC8vIGUuZy4gYXVkaW8gcmVjb3JkaW5nIGZyb20gYSBtaWNyb3Bob25lCi0gICAgICAgIEFQSV9JTlBVVF9NSVhfQ0FQVFVSRSwvLyB1c2VkIGZvciAicmVtb3RlIHN1Ym1peCIsIGNhcHR1cmUgb2YgdGhlIG1lZGlhIHRvIHBsYXkgaXQgcmVtb3RlbHkKKyAgICAgICAgQVBJX0lOUFVUX01JWF9DQVBUVVJFLC8vIHVzZWQgZm9yICJyZW1vdGUgc3VibWl4IiBsZWdhY3kgbW9kZSAobm8gREFQKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcHR1cmUgb2YgdGhlIG1lZGlhIHRvIHBsYXkgaXQgcmVtb3RlbHkKICAgICAgICAgQVBJX0lOUFVUX01JWF9FWFRfUE9MSUNZX1JFUk9VVEUsLy8gdXNlZCBmb3IgcGxhdGZvcm0gYXVkaW8gcmVyb3V0aW5nLCB3aGVyZSBtaXhlcyBhcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlZCBieSBleHRlcm5hbCBhbmQgZHluYW1pY2FsbHkgaW5zdGFsbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvbGljaWVzIHdoaWNoIHJlcm91dGUgYXVkaW8gbWl4ZXMKKyAgICAgICAgQVBJX0lOUFVUX01JWF9QVUJMSUNfQ0FQVFVSRV9QTEFZQkFDSywgIC8vIHVzZWQgZm9yIHBsYXliYWNrIGNhcHR1cmUgd2l0aCBhIE1lZGlhUHJvamVjdGlvbgogICAgICAgICBBUElfSU5QVVRfVEVMRVBIT05ZX1JYLCAvLyB1c2VkIGZvciBjYXB0dXJlIGZyb20gdGVsZXBob255IFJYIHBhdGgKICAgICB9IGlucHV0X3R5cGVfdDsKIAotICAgIGVudW0gewotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTk9ORSA9IDAsCi0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMID0gKDEgPDwgMCksICAgICAgLy8gQ29uY3VycmVuY3kgd2l0aCBhIGNhbGwKLSAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkUgPSAoMSA8PCAxKSwgICAvLyBDb25jdXJyZW5jeSB3aXRoIGFub3RoZXIgY2FwdHVyZQotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfSE9UV09SRCA9ICgxIDw8IDIpLCAgIC8vIENvbmN1cnJlbmN5IHdpdGggYSBob3R3b3JkCi0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9QUkVFTVBUID0gKDEgPDwgMyksICAgLy8gcHJlLWVtcHRlZCBzb21lb25lCi0gICAgICAgICAgICAgICAgLy8gTkI6IHByZWVtcHQgaXMgbWFya2VkIG9uIGEgc3VjY2Vzc2Z1bCByZXR1cm4sIG90aGVycyBhcmUgb24gZmFpbGluZyBjYWxscwotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTEFTVCA9ICgxIDw8IDQpLAotCi0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9BTEwgPSAoQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0xBU1QgLSAxKSwKLSAgICB9OwotCi0gICAgdHlwZWRlZiB1aW50MzJfdCBjb25jdXJyZW5jeV90eXBlX19tYXNrX3Q7Ci0KIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeUludGVyZmFjZSgpIHt9CiAgICAgLy8KQEAgLTg5LDE0ICs3NywxNiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgPSAwOwogICAgIC8vIHJldHJpZXZlIGEgZGV2aWNlIGNvbm5lY3Rpb24gc3RhdHVzCiAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKSA9IDA7CiAgICAgLy8gaW5kaWNhdGUgYSBjaGFuZ2UgaW4gZGV2aWNlIGNvbmZpZ3VyYXRpb24KICAgICB2aXJ0dWFsIHN0YXR1c190IGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgPSAwOwogICAgIC8vIGluZGljYXRlIGEgY2hhbmdlIGluIHBob25lIHN0YXRlLiBWYWxpZCBwaG9uZXMgc3RhdGVzIGFyZSBkZWZpbmVkIGJ5IGF1ZGlvX21vZGVfdAogICAgIHZpcnR1YWwgdm9pZCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkgPSAwOwogICAgIC8vIGZvcmNlIHVzaW5nIGEgc3BlY2lmaWMgZGV2aWNlIGNhdGVnb3J5IGZvciB0aGUgc3BlY2lmaWVkIHVzYWdlCkBAIC0xMjIsMTkgKzExMiwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cykgPSAwOwogICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgb3V0cHV0IHN0YXJ0cyBiZWluZyB1c2VkIGJ5IGNvcnJlc3BvbmRpbmcgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIG91dHB1dCBzdG9wcyBiZWluZyB1c2VkIGJ5IGNvcnJlc3BvbmRpbmcgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIC8vIHJlbGVhc2VzIHRoZSBvdXRwdXQuCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKIAogICAgIC8vIHJlcXVlc3QgYW4gaW5wdXQgYXBwcm9wcmlhdGUgZm9yIHJlY29yZCBmcm9tIHRoZSBzdXBwbGllZCBkZXZpY2Ugd2l0aCBzdXBwbGllZCBwYXJhbWV0ZXJzLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKQEAgLTE0NywxNiArMTMyLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfdHlwZV90ICppbnB1dFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7CiAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdGFydHMgYmVpbmcgdXNlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNpbGVuY2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgKmNvbmN1cnJlbmN5KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdG9wcyBiZWluZyB1c2VkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKICAgICAvLyByZWxlYXNlcyB0aGUgaW5wdXQuCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogCiAgICAgLy8KICAgICAvLyB2b2x1bWUgY29udHJvbCBmdW5jdGlvbnMKQEAgLTE4MSw2ICsxNjEsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgpID0gMDsKKwogICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHN0cmVhbSB0eXBlCiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwogCkBAIC0yMDYsNiArMTk5LDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKSA9IDA7CiAKICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBvZmZsb2FkSW5mbykgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKQEAgLTIzMywxMSArMjI4LDE1IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyUG9saWN5TWl4ZXMoVmVjdG9yPEF1ZGlvTWl4PiBtaXhlcykgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQorICAgICAgICAgICAgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck1vbm8oYm9vbCBtb25vKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNb25vKGJvb2wgKm1vbm8pID0gMDsKQEAgLTI1MSw3ICsyNTAsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkICAgICBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpOworICAgIHZpcnR1YWwgYm9vbCAgICAgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgc2V0QXBwU3RhdGUodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90ICZwcm9kdWN0U3RyYXRlZ3kpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3VwcykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCAmdm9sdW1lR3JvdXApID0gMDsKIH07CiAKIApAQCAtMzI0LDExICszMzgsNiBAQAogICAgIC8vIGZ1bmN0aW9uIGVuYWJsaW5nIHRvIHJlY2VpdmUgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25zIGRpcmVjdGx5IGZyb20gYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIHRvIGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgogICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKSA9IDA7CiAKLSAgICAvLyByZXF1ZXN0IHRoZSBwbGF5YmFjayBvZiBhIHRvbmUgb24gdGhlIHNwZWNpZmllZCBzdHJlYW06IHVzZWQgZm9yIGluc3RhbmNlIHRvIHJlcGxhY2Ugbm90aWZpY2F0aW9uIHNvdW5kcyB3aGVuIHBsYXlpbmcKLSAgICAvLyBvdmVyIGEgdGVsZXBob255IGRldmljZSBkdXJpbmcgYSBwaG9uZSBjYWxsLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BUb25lKCkgPSAwOwotCiAgICAgLy8gc2V0IGRvd24gbGluayBhdWRpbyB2b2x1bWUuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCkgPSAwOwogCkBAIC0zNTMsMTUgKzM2MiwyMCBAQAogCiAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKSA9IDA7CisKICAgICB2aXJ0dWFsIGF1ZGlvX3VuaXF1ZV9pZF90IG5ld0F1ZGlvVW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3VzZV90IHVzZSkgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlICpjbGllbnRDb25maWcsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSAqZGV2aWNlQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKSA9IDA7CiB9OwogCiBleHRlcm4gIkMiIEF1ZGlvUG9saWN5SW50ZXJmYWNlKiBjcmVhdGVBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9URVNUX01BUFBJTkcgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk0ZmQ4NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDEwIEBACit7CisgICJwcmVzdWJtaXQiOiBbCisgICAgeworICAgICAgICJuYW1lIjogImF1ZGlvcG9saWN5X3Rlc3RzIgorICAgIH0sCisgICAgeworICAgICAgICJuYW1lIjogInN5c3RlbWF1ZGlvX3Rlc3RzIgorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTI1YjlhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0IEBACitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeWNvbW1vbiIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Sb3V0aW5nU3RyYXRlZ3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1JvdXRpbmdTdHJhdGVneS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzg5NjdlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1JvdXRpbmdTdHJhdGVneS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIG1lZGlhIHN0b3BwZWQgcGxheWluZyBkdXJpbmcgd2hpY2ggd2UgY29uc2lkZXIgdGhhdCB0aGUKLS8vIHNvbmlmaWNhdGlvbiBzaG91bGQgYmUgYXMgdW5vYnRydXNpdmUgYXMgZHVyaW5nIHRoZSB0aW1lIG1lZGlhIHdhcyBwbGF5aW5nLgotI2RlZmluZSBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSA1MDAwCi0KLWVudW0gcm91dGluZ19zdHJhdGVneSB7Ci0gICAgU1RSQVRFR1lfTUVESUEsCi0gICAgU1RSQVRFR1lfUEhPTkUsCi0gICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLAotICAgIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMLAotICAgIFNUUkFURUdZX0RUTUYsCi0gICAgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwKLSAgICBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIsCi0gICAgU1RSQVRFR1lfQUNDRVNTSUJJTElUWSwKLSAgICBTVFJBVEVHWV9SRVJPVVRJTkcsCi0gICAgTlVNX1NUUkFURUdJRVMKLX07Ci0KLX07IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1ZvbHVtZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKaW5kZXggZmMwMTJhMi4uNTYxZjEwMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKQEAgLTE2LDEwICsxNiwzMCBAQAogCiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworCisvKioKKyAqIFZvbHVtZVNvdXJjZSBpcyB0aGUgZGlzY3JpbWluZW50IGZvciB2b2x1bWUgbWFuYWdlbWVudCBvbiBhbiBvdXRwdXQuCisgKiBJdCB1c2VkIHRvIGJlIHRoZSBzdHJlYW0gdHlwZSBieSBsZWdhY3ksIGl0IG1heSBiZSBob3N0IHZvbHVtZSBncm91cCBvciBhIHZvbHVtZSBjdXJ2ZXMgaWYKKyAqIHdlIGFsbG93IHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBjdXJ2ZSBwZXIgdm9sdW1lIGdyb3VwIChtYW5kYXRvcnkgdG8gZ2V0IHJpZCBvZiBBdWRpb1NlcnZlcgorICogc3RyZWFtIGFsaWFzZXMuCisgKi8KK2VudW0gVm9sdW1lU291cmNlIDogc3RkOjp1bmRlcmx5aW5nX3R5cGU8dm9sdW1lX2dyb3VwX3Q+Ojp0eXBlOworc3RhdGljIGNvbnN0IFZvbHVtZVNvdXJjZSBWT0xVTUVfU09VUkNFX05PTkUgPSBzdGF0aWNfY2FzdDxWb2x1bWVTb3VyY2U+KFZPTFVNRV9HUk9VUF9OT05FKTsKKworc3RhdGljIGlubGluZSBWb2x1bWVTb3VyY2Ugc3RyZWFtVG9Wb2x1bWVTb3VyY2UoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Vm9sdW1lU291cmNlPihzdHJlYW0pOworfQorCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwogLy8gQWJzb2x1dGUgbWluIHZvbHVtZSBpbiBkQiAoY2FuIGJlIHJlcHJlc2VudGVkIGluIHNpbmdsZSBwcmVjaXNpb24gbm9ybWFsIGZsb2F0IHZhbHVlKQogI2RlZmluZSBWT0xVTUVfTUlOX0RCICgtNzU4KQogCkBAIC0xMzQsNiArMTU0LDcgQEAKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U6CiAgICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQTsKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU6CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVDoKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI6CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZOgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvcG9saWN5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaAppbmRleCA5YmQ2OGUxLi42MDVmYzFjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaApAQCAtMTcsOSArMTcsMjAgQEAKICNwcmFnbWEgb25jZQogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIFN0cmVhbVR5cGVWZWN0b3IgPSBzdGQ6OnZlY3RvcjxhdWRpb19zdHJlYW1fdHlwZV90PjsKKworc3RhdGljIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBkZWZhdWx0QXR0ciA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogc3RhdGljIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGdEeW5hbWljRm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CiAKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSA9IDUwMDA7CisKIC8vIEZvciBtaXhlZCBvdXRwdXQgYW5kIGlucHV0cywgdGhlIHBvbGljeSB3aWxsIHVzZSBtYXggbWl4ZXIgc2FtcGxpbmcgcmF0ZXMuCiAvLyBEbyBub3QgbGltaXQgc2FtcGxpbmcgcmF0ZSBvdGhlcndpc2UKICNkZWZpbmUgU0FNUExFX1JBVEVfSFpfTUFYIDE5MjAwMApAQCAtMzIsMTQgKzQzLDYgQEAKICNkZWZpbmUgTUFYX01JWEVSX0NIQU5ORUxfQ09VTlQgRkNDXzgKIAogLyoqCi0gKiBBIGRldmljZSBtYXNrIGZvciBhbGwgYXVkaW8gaW5wdXQgZGV2aWNlcyB0aGF0IGFyZSBjb25zaWRlcmVkICJ2aXJ0dWFsIiB3aGVuIGV2YWx1YXRpbmcKLSAqIGFjdGl2ZSBpbnB1dHMgaW4gZ2V0QWN0aXZlSW5wdXRzKCkKLSAqLwotI2RlZmluZSBBUE1fQVVESU9fSU5fREVWSUNFX1ZJUlRVQUxfQUxMIChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWHxcCi0gICAgICAgIEFVRElPX0RFVklDRV9JTl9CVVN8QVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSKQotCi0KLS8qKgogICogQSBkZXZpY2UgbWFzayBmb3IgYWxsIGF1ZGlvIGlucHV0IGFuZCBvdXRwdXQgZGV2aWNlcyB3aGVyZSBtYXRjaGluZyBpbnB1dHMvb3V0cHV0cyBvbiBkZXZpY2UKICAqIHR5cGUgYWxvbmUgaXMgbm90IGVub3VnaDogdGhlIGFkZHJlc3MgbXVzdCBtYXRjaCB0b28KICAqLwpAQCAtNjgsMjMgKzcxLDYgQEAKIH0KIAogLyoqCi0gKiBDaGVjayBpZiB0aGUgaW5wdXQgZGV2aWNlIGdpdmVuIGlzIGNvbnNpZGVyZWQgYXMgYSB2aXJ0dWFsIGRldmljZS4KLSAqCi0gKiBAcGFyYW1baW5dIGRldmljZSB0byBjb25zaWRlcgotICoKLSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIGEgdmlydHVhbCBvbmUsIGZhbHNlIG90aGVyd2lzZS4KLSAqLwotc3RhdGljIGlubGluZSBib29sIGlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi17Ci0gICAgaWYgKChkZXZpY2UgJiBBVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSB7Ci0gICAgICAgIGRldmljZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICAgICAgaWYgKChwb3Bjb3VudChkZXZpY2UpID09IDEpICYmICgoZGV2aWNlICYgfkFQTV9BVURJT19JTl9ERVZJQ0VfVklSVFVBTF9BTEwpID09IDApKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoqCiAgKiBDaGVjayB3aGV0aGVyIHRoZSBkZXZpY2UgdHlwZSBpcyBvbmUKICAqIHdoZXJlIGFkZHJlc3NlcyBhcmUgdXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIG9uZSBjb25uZWN0ZWQgZGV2aWNlIGFuZCBhbm90aGVyCiAgKgpAQCAtMTAxLDYgKzg3LDIxIEBACiB9CiAKIC8qKgorICogQ2hlY2sgd2hldGhlciBhdWRpbyBkZXZpY2UgaGFzIGVuY29kaW5nIGNhcGFiaWxpdHkuCisgKgorICogQHBhcmFtW2luXSBkZXZpY2UgdG8gY29uc2lkZXIKKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgZGV2aWNlIGhhcyBlbmNvZGluZyBjYXBhYmlsaXR5LCBmYWxzZSBvdGhlcndpc2UuLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgZGV2aWNlX2hhc19lbmNvZGluZ19jYXBhYmlsaXR5KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyoqCiAgKiBSZXR1cm5zIHRoZSBwcmlvcml0eSBvZiBhIGdpdmVuIGF1ZGlvIHNvdXJjZSBmb3IgY2FwdHVyZS4gVGhlIHByaW9yaXR5IGlzIHVzZWQgd2hlbiBtb3JlIHRoYW4gb25lCiAgKiBjYXB0dXJlIHNlc3Npb24gaXMgYWN0aXZlIG9uIGEgZ2l2ZW4gaW5wdXQgc3RyZWFtIHRvIGRldGVybWluZSB3aGljaCBzZXNzaW9uIGRyaXZlcyByb3V0aW5nIGFuZAogICogZWZmZWN0IGNvbmZpZ3VyYXRpb24uCkBAIC0xMDgsNyArMTA5LDEwIEBACiAgKiBAcGFyYW1baW5dIGlucHV0U291cmNlIHRvIGNvbnNpZGVyLiBWYWxpZCBzb3VyY2VzIGFyZToKICAqIC0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04KICAqIC0gQVVESU9fU09VUkNFX0NBTUNPUkRFUgorICogLSBBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0UKKyAqIC0gQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VECiAgKiAtIEFVRElPX1NPVVJDRV9NSUMKKyAqIC0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFCiAgKiAtIEFVRElPX1NPVVJDRV9GTV9UVU5FUgogICogLSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04KICAqIC0gQVVESU9fU09VUkNFX0hPVFdPUkQKQEAgLTEyMSwxMCArMTI1LDE2IEBACiB7CiAgICAgc3dpdGNoIChpbnB1dFNvdXJjZSkgewogICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT046Ci0gICAgICAgIHJldHVybiA2OworICAgICAgICByZXR1cm4gOTsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6Ci0gICAgICAgIHJldHVybiA1OworICAgICAgICByZXR1cm4gODsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRToKKyAgICAgICAgcmV0dXJuIDc7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQ6CisgICAgICAgIHJldHVybiA2OwogICAgIGNhc2UgQVVESU9fU09VUkNFX01JQzoKKyAgICAgICAgcmV0dXJuIDU7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0U6CiAgICAgICAgIHJldHVybiA0OwogICAgIGNhc2UgQVVESU9fU09VUkNFX0ZNX1RVTkVSOgogICAgICAgICByZXR1cm4gMzsKQEAgLTE1MiwzICsxNjIsMjUgQEAKICAgICB9CiAgICAgcmV0dXJuIGZvcm1hdDEgPT0gZm9ybWF0MjsKIH0KKworLyoqCisgKiBAYnJpZWYgaGFzU3RyZWFtIGNoZWNrcyBpZiBhIGdpdmVuIHN0cmVhbSB0eXBlIGlzIGZvdW5kIGluIHRoZSBsaXN0IG9mIHN0cmVhbXMKKyAqIEBwYXJhbSBzdHJlYW1zIGNvbGxlY3Rpb24gb2Ygc3RyZWFtIHR5cGVzIHRvIGNvbnNpZGVyLgorICogQHBhcmFtIHN0cmVhbVR5cGUgdG8gY29uc2lkZXIKKyAqIEByZXR1cm4gdHJ1ZSBpZiB2b2ljZSBzdHJlYW0gaXMgZm91bmQgaW4gdGhlIGdpdmVuIHN0cmVhbXMsIGZhbHNlIG90aGVyd2lzZQorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaGFzU3RyZWFtKGNvbnN0IGFuZHJvaWQ6OlN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKK3sKKyAgICByZXR1cm4gc3RkOjpmaW5kKGJlZ2luKHN0cmVhbXMpLCBlbmQoc3RyZWFtcyksIHN0cmVhbVR5cGUpICE9IGVuZChzdHJlYW1zKTsKK30KKworLyoqCisgKiBAYnJpZWYgaGFzVm9pY2VTdHJlYW0gY2hlY2tzIGlmIGEgdm9pY2Ugc3RyZWFtIGlzIGZvdW5kIGluIHRoZSBsaXN0IG9mIHN0cmVhbXMKKyAqIEBwYXJhbSBzdHJlYW1zIGNvbGxlY3Rpb24gdG8gY29uc2lkZXIuCisgKiBAcmV0dXJuIHRydWUgaWYgdm9pY2Ugc3RyZWFtIGlzIGZvdW5kIGluIHRoZSBnaXZlbiBzdHJlYW1zLCBmYWxzZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGlubGluZSBib29sIGhhc1ZvaWNlU3RyZWFtKGNvbnN0IGFuZHJvaWQ6OlN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbXMpCit7CisgICAgcmV0dXJuIGhhc1N0cmVhbShzdHJlYW1zLCBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkwMzdhMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5icApAQCAtMCwwICsxLDUxIEBACitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAiLAorICAgICAgICAic3JjL0F1ZGlvR2Fpbi5jcHAiLAorICAgICAgICAic3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9QYXRjaC5jcHAiLAorICAgICAgICAic3JjL0F1ZGlvUG9saWN5TWl4LmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9Qb3J0LmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9Qcm9maWxlLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9Sb3V0ZS5jcHAiLAorICAgICAgICAic3JjL0NsaWVudERlc2NyaXB0b3IuY3BwIiwKKyAgICAgICAgInNyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcCIsCisgICAgICAgICJzcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAiLAorICAgICAgICAic3JjL0h3TW9kdWxlLmNwcCIsCisgICAgICAgICJzcmMvSU9Qcm9maWxlLmNwcCIsCisgICAgICAgICJzcmMvU2VyaWFsaXplci5jcHAiLAorICAgICAgICAic3JjL1NvdW5kVHJpZ2dlclNlc3Npb24uY3BwIiwKKyAgICAgICAgInNyYy9UeXBlQ29udmVydGVyLmNwcCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ4bWwyIiwKKyAgICBdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsibGlibWVkaWEiXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9wb2xpY3ljb21tb24iLAorICAgIF0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJsaWJhdWRpb3BvbGljeWNvbW1vbiJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI0YzVjYy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICBzcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAgXAotICAgIHNyYy9BdWRpb0dhaW4uY3BwIFwKLSAgICBzcmMvSHdNb2R1bGUuY3BwIFwKLSAgICBzcmMvSU9Qcm9maWxlLmNwcCBcCi0gICAgc3JjL0F1ZGlvUG9ydC5jcHAgXAotICAgIHNyYy9BdWRpb1Byb2ZpbGUuY3BwIFwKLSAgICBzcmMvQXVkaW9Sb3V0ZS5jcHAgXAotICAgIHNyYy9BdWRpb1BvbGljeU1peC5jcHAgXAotICAgIHNyYy9BdWRpb1BhdGNoLmNwcCBcCi0gICAgc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcCBcCi0gICAgc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAgXAotICAgIHNyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcCBcCi0gICAgc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwIFwKLSAgICBzcmMvU291bmRUcmlnZ2VyU2Vzc2lvbi5jcHAgXAotICAgIHNyYy9TZXNzaW9uUm91dGUuY3BwIFwKLSAgICBzcmMvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmNwcCBcCi0gICAgc3JjL1ZvbHVtZUN1cnZlLmNwcCBcCi0gICAgc3JjL1R5cGVDb252ZXJ0ZXIuY3BwIFwKLSAgICBzcmMvQXVkaW9TZXNzaW9uLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYm1lZGlhIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGlibG9nIFwKLQotTE9DQUxfRVhQT1JUX1NIQVJFRF9MSUJSQVJZX0hFQURFUlMgOj0gbGlibWVkaWEKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L3V0aWxpdGllcyBcCi0gICAgc3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL2luY2x1ZGUgXAotCi1pZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQotCi1MT0NBTF9TUkNfRklMRVMgKz0gc3JjL1NlcmlhbGl6ZXIuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlieG1sMgotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBleHRlcm5hbC9saWJ4bWwyL2luY2x1ZGUgXAotCi1lbHNlCi0KLUxPQ0FMX1NSQ19GSUxFUyArPSBcCi0gICAgc3JjL0NvbmZpZ1BhcnNpbmdVdGlscy5jcHAgXAotICAgIHNyYy9TdHJlYW1EZXNjcmlwdG9yLmNwcCBcCi0gICAgc3JjL0dhaW5zLmNwcAotCi1lbmRpZiAjaWZlcSAoJChVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GKSwgMSkKLQotTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9IFwKLSAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKLQotTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKLQotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLQotTE9DQUxfTU9EVUxFIDo9IGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Db2xsZWN0aW9ucy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvQ29sbGVjdGlvbnMuaAppbmRleCBmODZlNzVhLi5hOTQ4ZWE5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Db2xsZWN0aW9ucy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0NvbGxlY3Rpb25zLmgKQEAgLTM4LDcgKzM4LDcgQEAKIGNsYXNzIEF1ZGlvUm91dGVWZWN0b3IgOiBwdWJsaWMgVmVjdG9yPHNwPEF1ZGlvUm91dGU+ID4KIHsKIHB1YmxpYzoKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9HYWluLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9HYWluLmgKaW5kZXggNGFjNTA4Zi4uNGFmOTNlMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvR2Fpbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0dhaW4uaApAQCAtMTgsNyArMTgsOSBAQAogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTMsMTcgKzU1LDQxIEBACiAgICAgaW50IGdldE1heFJhbXBJbk1zKCkgY29uc3QgeyByZXR1cm4gbUdhaW4ubWF4X3JhbXBfbXM7IH0KIAogICAgIC8vIFRPRE86IHJlbW92ZSBkdW1wIGZyb20gaGVyZSAoc3BsaXQgc2VyaWFsaXphdGlvbikKLSAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CiAKICAgICB2b2lkIGdldERlZmF1bHRDb25maWcoc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpOwogICAgIHN0YXR1c190IGNoZWNrQ29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKTsKIAorICAgIHZvaWQgc2V0VXNlRm9yVm9sdW1lKGJvb2wgY2FuVXNlRm9yVm9sdW1lKSB7IG1Vc2VGb3JWb2x1bWUgPSBjYW5Vc2VGb3JWb2x1bWU7IH0KKyAgICBib29sIGNhblVzZUZvclZvbHVtZSgpIGNvbnN0IHsgcmV0dXJuIG1Vc2VGb3JWb2x1bWU7IH0KKwogICAgIGNvbnN0IHN0cnVjdCBhdWRpb19nYWluICZnZXRHYWluKCkgY29uc3QgeyByZXR1cm4gbUdhaW47IH0KIAogcHJpdmF0ZToKICAgICBpbnQgICAgICAgICAgICAgICBtSW5kZXg7CiAgICAgc3RydWN0IGF1ZGlvX2dhaW4gbUdhaW47CiAgICAgYm9vbCAgICAgICAgICAgICAgbVVzZUluQ2hhbm5lbE1hc2s7CisgICAgYm9vbCAgICAgICAgICAgICAgbVVzZUZvclZvbHVtZSA9IGZhbHNlOworfTsKKworY2xhc3MgQXVkaW9HYWlucyA6IHB1YmxpYyBzdGQ6OnZlY3RvcjxzcDxBdWRpb0dhaW4+ID4KK3sKK3B1YmxpYzoKKyAgICBib29sIGNhblVzZUZvclZvbHVtZSgpIGNvbnN0CisgICAgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmdhaW46ICp0aGlzKSB7CisgICAgICAgICAgICBpZiAoZ2Fpbi0+Y2FuVXNlRm9yVm9sdW1lKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50MzJfdCBhZGQoY29uc3Qgc3A8QXVkaW9HYWluPiBnYWluKQorICAgIHsKKyAgICAgICAgcHVzaF9iYWNrKGdhaW4pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMjk2MzIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIEkvTyBkZXNjcmlwdG9ycyB0byBpbXBsZW1lbnQgc28gaW5mb3JtYXRpb24gYWJvdXQgdGhlaXIgY29udGV4dAorICogY2FuIGJlIHF1ZXJpZWQgYW5kIHVwZGF0ZWQuCisgKi8KK2NsYXNzIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+QXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UoKSB7fTsKKworICAgIHZpcnR1YWwgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRDb25maWcoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOworfTsKKwordGVtcGxhdGUgPGNsYXNzIElvRGVzY3JpcHRvciwgY2xhc3MgRmlsdGVyPgorc3A8RGV2aWNlRGVzY3JpcHRvcj4gZmluZFByZWZlcnJlZERldmljZSgKKyAgICAgICAgSW9EZXNjcmlwdG9yJiBkZXNjLCBGaWx0ZXIgZmlsdGVyLCBib29sJiBhY3RpdmUsIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcykKK3sKKyAgICBhdXRvIGFjdGl2ZUNsaWVudHMgPSBkZXNjLT5jbGllbnRzTGlzdCh0cnVlIC8qYWN0aXZlT25seSovKTsKKyAgICBhdXRvIGFjdGl2ZUNsaWVudHNXaXRoUm91dGUgPQorICAgICAgICBkZXNjLT5jbGllbnRzTGlzdCh0cnVlIC8qYWN0aXZlT25seSovLCBmaWx0ZXIsIHRydWUgLypwcmVmZXJyZWREZXZpY2UqLyk7CisgICAgYWN0aXZlID0gYWN0aXZlQ2xpZW50cy5zaXplKCkgPiAwOworICAgIGlmIChhY3RpdmUgJiYgYWN0aXZlQ2xpZW50cy5zaXplKCkgPT0gYWN0aXZlQ2xpZW50c1dpdGhSb3V0ZS5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGRldmljZXMuZ2V0RGV2aWNlRnJvbUlkKGFjdGl2ZUNsaWVudHNXaXRoUm91dGVbMF0tPnByZWZlcnJlZERldmljZUlkKCkpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwordGVtcGxhdGUgPGNsYXNzIElvQ29sbGVjdGlvbiwgY2xhc3MgRmlsdGVyPgorc3A8RGV2aWNlRGVzY3JpcHRvcj4gZmluZFByZWZlcnJlZERldmljZSgKKyAgICAgICAgSW9Db2xsZWN0aW9uJiBpb0NvbGxlY3Rpb24sIEZpbHRlciBmaWx0ZXIsIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcykKK3sKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpb0NvbGxlY3Rpb24uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYXV0byBkZXNjID0gaW9Db2xsZWN0aW9uLnZhbHVlQXQoaSk7CisgICAgICAgIGJvb2wgYWN0aXZlOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBjdXJEZXZpY2UgPSBmaW5kUHJlZmVycmVkRGV2aWNlKGRlc2MsIGZpbHRlciwgYWN0aXZlLCBkZXZpY2VzKTsKKyAgICAgICAgaWYgKGFjdGl2ZSAmJiBjdXJEZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0gZWxzZSBpZiAoY3VyRGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGN1ckRldmljZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oCmluZGV4IGIyNWQ2ZDQuLmUwNzFmZTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oCkBAIC0xNiwzNiArMTYsNDUgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlICJBdWRpb1BvcnQuaCIKLSNpbmNsdWRlICJBdWRpb1Nlc3Npb24uaCIKLSNpbmNsdWRlICJBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIuaCIKLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgIkF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCisjaW5jbHVkZSAiQ2xpZW50RGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJFZmZlY3REZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiSU9Qcm9maWxlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgSU9Qcm9maWxlOwotY2xhc3MgQXVkaW9NaXg7CitjbGFzcyBBdWRpb1BvbGljeU1peDsKK2NsYXNzIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlOwogCiAvLyBkZXNjcmlwdG9yIGZvciBhdWRpbyBpbnB1dHMuIFVzZWQgdG8gbWFpbnRhaW4gY3VycmVudCBjb25maWd1cmF0aW9uIG9mIGVhY2ggb3BlbmVkIGF1ZGlvIGlucHV0CiAvLyBhbmQga2VlcCB0cmFjayBvZiB0aGUgdXNhZ2Ugb2YgdGhpcyBpbnB1dC4KLWNsYXNzIEF1ZGlvSW5wdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnLCBwdWJsaWMgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyCitjbGFzcyBBdWRpb0lucHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydENvbmZpZywgcHVibGljIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlCisgICAgLCBwdWJsaWMgQ2xpZW50TWFwSGFuZGxlcjxSZWNvcmRDbGllbnREZXNjcmlwdG9yPgogewogcHVibGljOgogICAgIGV4cGxpY2l0IEF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRJZCgpIGNvbnN0OwogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRNb2R1bGVIYW5kbGUoKSBjb25zdDsKLSAgICB1aW50MzJfdCBnZXRPcGVuUmVmQ291bnQoKSBjb25zdDsKIAotICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIChtRGV2aWNlICE9IG51bGxwdHIpID8KKyAgICAgICAgICAgICAgICAgICAgbURldmljZS0+dHlwZSgpIDogQVVESU9fREVWSUNFX05PTkU7IH0KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2UoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlOyB9CisgICAgdm9pZCBzZXREZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSkgeyBtRGV2aWNlID0gZGV2aWNlOyB9CisgICAgRGV2aWNlVmVjdG9yIHN1cHBvcnRlZERldmljZXMoKSBjb25zdCAgeworICAgICAgICByZXR1cm4gbVByb2ZpbGUgIT0gbnVsbHB0ciA/IG1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkgOiAgRGV2aWNlVmVjdG9yKCk7IH0KIAotICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgICAgICAgIG1Jb0hhbmRsZTsgICAgICAgLy8gaW5wdXQgaGFuZGxlCi0gICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgICAgICAgbURldmljZTsgICAgICAgICAvLyBjdXJyZW50IGRldmljZSB0aGlzIGlucHV0IGlzIHJvdXRlZCB0bwotICAgIEF1ZGlvTWl4ICAgICAgICAgICAgICAgICAgICAgICptUG9saWN5TWl4OyAgICAgLy8gbm9uIE5VTEwgd2hlbiB1c2VkIGJ5IGEgZHluYW1pYyBwb2xpY3kKLSAgICBjb25zdCBzcDxJT1Byb2ZpbGU+ICAgICAgICAgICBtUHJvZmlsZTsgICAgICAgIC8vIEkvTyBwcm9maWxlIHRoaXMgb3V0cHV0IGRlcml2ZXMgZnJvbQorICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOworCisgICAgYXVkaW9faW9faGFuZGxlX3QgICBtSW9IYW5kbGUgPSBBVURJT19JT19IQU5ETEVfTk9ORTsgLy8gaW5wdXQgaGFuZGxlCisgICAgd3A8QXVkaW9Qb2xpY3lNaXg+ICBtUG9saWN5TWl4OyAgICAgICAgICAgICAgICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQorICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gbVByb2ZpbGU7ICAgICAgICAgICAgICAgICAgICAgLy8gSS9PIHByb2ZpbGUgdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tCiAKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCiAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwpAQCAtNTUsNDMgKzY0LDUwIEBACiAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdD4gZ2V0UHJlZW1wdGVkU2Vzc2lvbnMoKSBjb25zdDsKICAgICBib29sIGhhc1ByZWVtcHRlZFNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pIGNvbnN0OwogICAgIHZvaWQgY2xlYXJQcmVlbXB0ZWRTZXNzaW9ucygpOwotICAgIGJvb2wgaXNBY3RpdmUoKSBjb25zdDsKKyAgICBib29sIGlzQWN0aXZlKCkgY29uc3QgeyByZXR1cm4gbUdsb2JhbEFjdGl2ZUNvdW50ID4gMDsgfQogICAgIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdDsKLSAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZShib29sIGFjdGl2ZU9ubHkgPSBmYWxzZSkgY29uc3Q7CisgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKCkgY29uc3Q7CiAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlcigpIGNvbnN0OwotICAgIHN0YXR1c190IGFkZEF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiYgYXVkaW9TZXNzaW9uKTsKLSAgICBzdGF0dXNfdCByZW1vdmVBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIHNwPEF1ZGlvU2Vzc2lvbj4gZ2V0QXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSBjb25zdDsKLSAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGdldEF1ZGlvU2Vzc2lvbnMoYm9vbCBhY3RpdmVPbmx5KSBjb25zdDsKLSAgICBzaXplX3QgZ2V0QXVkaW9TZXNzaW9uQ291bnQoYm9vbCBhY3RpdmVPbmx5KSBjb25zdDsKLSAgICBhdWRpb19zb3VyY2VfdCBnZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdDsKLQotICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlcgotICAgIHZpcnR1YWwgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRDb25maWcoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGdldEhpZ2hlc3RQcmlvcml0eUF0dHJpYnV0ZXMoKSBjb25zdDsKKyAgICB2b2lkIHNldENsaWVudEFjdGl2ZShjb25zdCBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBib29sIGFjdGl2ZSk7CisgICAgaW50MzJfdCBhY3RpdmVDb3VudCgpIHsgcmV0dXJuIG1HbG9iYWxBY3RpdmVDb3VudDsgfQorICAgIHZvaWQgdHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsIGJvb2wgZW5hYmxlZCk7CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gZ2V0RW5hYmxlZEVmZmVjdHMoKSBjb25zdDsKKyAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZQorICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZ2V0Q29uZmlnKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgb3ZlcnJpZGU7CiAKICAgICBzdGF0dXNfdCBvcGVuKGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCiAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0KTsKICAgICAvLyBDYWxsZWQgd2hlbiBhIHN0cmVhbSBpcyBhYm91dCB0byBiZSBzdGFydGVkLgotICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBBdWRpb1Nlc3Npb246OmNoYW5nZUFjdGl2ZUNvdW50KDEpCisgICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIHNldENsaWVudEFjdGl2ZShjbGllbnQsIHRydWUpCiAgICAgc3RhdHVzX3Qgc3RhcnQoKTsKICAgICAvLyBDYWxsZWQgYWZ0ZXIgYSBzdHJlYW0gaXMgc3RvcHBlZAotICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBBdWRpb1Nlc3Npb246OmNoYW5nZUFjdGl2ZUNvdW50KC0xKQorICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBzZXRDbGllbnRBY3RpdmUoY2xpZW50LCBmYWxzZSkKICAgICB2b2lkIHN0b3AoKTsKICAgICB2b2lkIGNsb3NlKCk7CiAKLXByaXZhdGU6Ci0gICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgbVBhdGNoSGFuZGxlOwotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgICAgICAgIG1JZDsKLSAgICAvLyBhdWRpbyBzZXNzaW9ucyBhdHRhY2hlZCB0byB0aGlzIGlucHV0Ci0gICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiAgICAgICAgbVNlc3Npb25zOworICAgIFJlY29yZENsaWVudFZlY3RvciBnZXRDbGllbnRzRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHNMaXN0KGJvb2wgYWN0aXZlT25seSA9IGZhbHNlLAorICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBBVURJT19TT1VSQ0VfREVGQVVMVCwgYm9vbCBwcmVmZXJyZWREZXZpY2VPbmx5ID0gZmFsc2UpIGNvbnN0OworCisgICAgdm9pZCBzZXRBcHBTdGF0ZSh1aWRfdCB1aWQsIGFwcF9zdGF0ZV90IHN0YXRlKTsKKworICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIENsaWVudE1hcEhhbmRsZXI8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4KKyAgICB2b2lkIGFkZENsaWVudChjb25zdCBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiAmY2xpZW50KSBvdmVycmlkZTsKKworIHByaXZhdGU6CisKKyAgICB2b2lkIHVwZGF0ZUNsaWVudFJlY29yZGluZ0NvbmZpZ3VyYXRpb24oaW50IGV2ZW50LCBjb25zdCBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50KTsKKworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgIG1JZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbURldmljZSA9IG51bGxwdHI7IC8qKjwgY3VycmVudCBkZXZpY2UgdGhpcyBpbnB1dCBpcyByb3V0ZWQgdG8gKi8KKwogICAgIC8vIEJlY2F1c2UgYSBwcmVlbXB0aWJsZSBjYXB0dXJlIHNlc3Npb24gY2FuIHByZWVtcHQgYW5vdGhlciBvbmUsIHdlIGVuZCB1cCBpbiBhbiBlbmRsZXNzIGxvb3AKICAgICAvLyBzaXR1YXRpb24gd2VyZSBlYWNoIHNlc3Npb24gaXMgYWxsb3dlZCB0byByZXN0YXJ0IGFmdGVyIGJlaW5nIHByZWVtcHRlZCwKICAgICAvLyB0aHVzIHByZWVtcHRpbmcgdGhlIG90aGVyIG9uZSB3aGljaCByZXN0YXJ0cyBhbmQgc28gb24uCkBAIC05OSw3ICsxMTUsOSBAQAogICAgIC8vIGEgcGFydGljdWxhciBpbnB1dCBzdGFydGVkIGFuZCBwcmV2ZW50IHByZWVtcHRpb24gb2YgdGhpcyBhY3RpdmUgaW5wdXQgYnkgdGhpcyBzZXNzaW9uLgogICAgIC8vIFdlIGFsc28gaW5oZXJpdCBzZXNzaW9ucyBmcm9tIHRoZSBwcmVlbXB0ZWQgaW5wdXQgdG8gYXZvaWQgYSAzIHdheSBwcmVlbXB0aW9uIGxvb3AgZXRjLi4uCiAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdD4gbVByZWVtcHRlZFNlc3Npb25zOwotICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICptQ2xpZW50SW50ZXJmYWNlOworICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICogY29uc3QgbUNsaWVudEludGVyZmFjZTsKKyAgICBpbnQzMl90IG1HbG9iYWxBY3RpdmVDb3VudCA9IDA7ICAvLyBub24tY2xpZW50LXNwZWNpZmljIGFjdGl2aXR5IHJlZiBjb3VudAorICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIG1FbmFibGVkRWZmZWN0czsKIH07CiAKIGNsYXNzIEF1ZGlvSW5wdXRDb2xsZWN0aW9uIDoKQEAgLTExMSwxOSArMTI5LDMxIEBACiAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGdldElucHV0RnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0OwogCiAgICAgLy8gY291bnQgYWN0aXZlIGNhcHR1cmUgc2Vzc2lvbnMgdXNpbmcgb25lIG9mIHRoZSBzcGVjaWZpZWQgZGV2aWNlcy4KLSAgICAvLyBpZ25vcmUgZGV2aWNlcyBpZiBBVURJT19ERVZJQ0VfSU5fREVGQVVMVCBpcyBwYXNzZWQKLSAgICB1aW50MzJfdCBhY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IEFVRElPX0RFVklDRV9JTl9ERUZBVUxUKSBjb25zdDsKKyAgICAvLyBpZ25vcmUgZGV2aWNlcyBpZiBlbXB0eSB2ZWN0b3IgaXMgcGFzc2VkCisgICAgdWludDMyX3QgYWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdDsKIAogICAgIC8qKgogICAgICAqIHJldHVybiBpbyBoYW5kbGUgb2YgYWN0aXZlIGlucHV0IG9yIDAgaWYgbm8gaW5wdXQgaXMgYWN0aXZlCiAgICAgICogT25seSBjb25zaWRlcnMgaW5wdXRzIGZyb20gcGh5c2ljYWwgZGV2aWNlcyAoZS5nLiBtYWluIG1pYywgaGVhZHNldCBtaWMpIHdoZW4KICAgICAgKiBpZ25vcmVWaXJ0dWFsSW5wdXRzIGlzIHRydWUuCiAgICAgICovCi0gICAgVmVjdG9yPHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBnZXRBY3RpdmVJbnB1dHMoYm9vbCBpZ25vcmVWaXJ0dWFsSW5wdXRzID0gdHJ1ZSk7CisgICAgVmVjdG9yPHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBnZXRBY3RpdmVJbnB1dHMoKTsKIAotICAgIGF1ZGlvX2RldmljZXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkgY29uc3Q7CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGdldElucHV0Rm9yQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICB2b2lkIHRyYWNrRWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0LCBib29sIGVuYWJsZWQpOworCisgICAgLyoqCisgICAgKiBAYnJpZWYgY2xlYXJTZXNzaW9uUm91dGVzRm9yRGV2aWNlOiB3aGVuIGEgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCwgYW5kIGlmIHRoaXMgZGV2aWNlIGhhcworICAgICogYmVlbiBjaG9zZW4gYXMgdGhlIHByZWZlcnJlZCBkZXZpY2UgYnkgYW55IGNsaWVudCwgdGhlIHBvbGljeSBtYW5hZ2VyIHNoYWxsCisgICAgKiBwcmV2ZW50IGZyb20gdXNpbmcgdGhpcyBkZXZpY2UgYW55IG1vcmUgYnkgY2xlYXJpbmcgYWxsIHRoZSBzZXNzaW9uIHJvdXRlcyBpbnZvbHZpbmcgdGhpcworICAgICogZGV2aWNlLgorICAgICogSW4gb3RoZXIgd29yZHMsIHRoZSBwcmVmZXJyZWQgZGV2aWNlIHBvcnQgaWQgb2YgdGhlc2UgY2xpZW50cyB3aWxsIGJlIHJlc2V0dGVkIHRvIE5PTkUuCisgICAgKiBAcGFyYW0gZGlzY29ubmVjdGVkRGV2aWNlIGRldmljZSB0byBiZSBkaXNjb25uZWN0ZWQKKyAgICAqLworICAgIHZvaWQgY2xlYXJTZXNzaW9uUm91dGVzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkaXNjb25uZWN0ZWREZXZpY2UpOworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiB9OwogCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaAppbmRleCA1ZTVkMzhiLi5jZDU0MDg1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oCkBAIC0xNiw1NSArMTYsMjM0IEBACiAKICNwcmFnbWEgb25jZQogCisjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlICJBdWRpb1BvcnQuaCIKLSNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgIkF1ZGlvU291cmNlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCisjaW5jbHVkZSAiQ2xpZW50RGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgSU9Qcm9maWxlOwotY2xhc3MgQXVkaW9NaXg7CitjbGFzcyBBdWRpb1BvbGljeU1peDsKIGNsYXNzIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlOwotY2xhc3MgRGV2aWNlRGVzY3JpcHRvcjsKKworY2xhc3MgQWN0aXZpdHlUcmFja2luZworeworcHVibGljOgorICAgIHZpcnR1YWwgfkFjdGl2aXR5VHJhY2tpbmcoKSA9IGRlZmF1bHQ7CisgICAgYm9vbCBpc0FjdGl2ZSh1aW50MzJfdCBpblBhc3RNcyA9IDAsIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0CisgICAgeworICAgICAgICBpZiAobUFjdGl2aXR5Q291bnQgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5QYXN0TXMgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChzeXNUaW1lID09IDApIHsKKyAgICAgICAgICAgIHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5zMm1zKHN5c1RpbWUgLSBtU3RvcFRpbWUpIDwgaW5QYXN0TXMpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdm9pZCBjaGFuZ2VBY3Rpdml0eUNvdW50KGludCBkZWx0YSkKKyAgICB7CisgICAgICAgIGlmICgoZGVsdGEgKyAoaW50KW1BY3Rpdml0eUNvdW50KSA8IDApIHsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzOiBpbnZhbGlkIGRlbHRhICVkLCByZWZDb3VudCAlZCIsIF9fZnVuY19fLCBkZWx0YSwgbUFjdGl2aXR5Q291bnQpOworICAgICAgICB9CisgICAgICAgIG1BY3Rpdml0eUNvdW50ICs9IGRlbHRhOworICAgICAgICBpZiAoIW1BY3Rpdml0eUNvdW50KSB7CisgICAgICAgICAgICBzZXRTdG9wVGltZShzeXN0ZW1UaW1lKCkpOworICAgICAgICB9CisgICAgfQorICAgIHVpbnQzMl90IGdldEFjdGl2aXR5Q291bnQoKSBjb25zdCB7IHJldHVybiBtQWN0aXZpdHlDb3VudDsgfQorICAgIG5zZWNzX3QgZ2V0U3RvcFRpbWUoKSBjb25zdCB7IHJldHVybiBtU3RvcFRpbWU7IH0KKyAgICB2b2lkIHNldFN0b3BUaW1lKG5zZWNzX3Qgc3RvcFRpbWUpIHsgbVN0b3BUaW1lID0gc3RvcFRpbWU7IH0KKworICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKKyAgICB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIEFjdGl2aXR5Q291bnQ6ICVkLCBTdG9wVGltZTogJSIgUFJJZDY0ICIsICIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5Q291bnQoKSwgZ2V0U3RvcFRpbWUoKSk7CisgICAgfQorcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtQWN0aXZpdHlDb3VudCA9IDA7CisgICAgbnNlY3NfdCBtU3RvcFRpbWUgPSAwOworfTsKKworLyoqCisgKiBAYnJpZWYgVm9sdW1lQWN0aXZpdHk6IGl0IHRyYWNrcyB0aGUgYWN0aXZpdHkgZm9yIHZvbHVtZSBwb2xpY3kgKHZvbHVtZSBpbmRleCwgbXV0ZSwKKyAqIG1lbW9yaXplIHByZXZpb3VzIHN0b3AsIGFuZCBzdG9yZSBtdXRlIGlmIGluY29tcGF0aWJsZSBkZXZpY2Ugd2l0aCBhbm90aGVyIHN0cmF0ZWd5LgorICovCitjbGFzcyBWb2x1bWVBY3Rpdml0eSA6IHB1YmxpYyBBY3Rpdml0eVRyYWNraW5nCit7CitwdWJsaWM6CisgICAgYm9vbCBpc011dGVkKCkgY29uc3QgeyByZXR1cm4gbU11dGVDb3VudCA+IDA7IH0KKyAgICBpbnQgZ2V0TXV0ZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbU11dGVDb3VudDsgfQorICAgIGludCBpbmNNdXRlQ291bnQoKSB7IHJldHVybiArK21NdXRlQ291bnQ7IH0KKyAgICBpbnQgZGVjTXV0ZUNvdW50KCkgeyByZXR1cm4gbU11dGVDb3VudCA+IDAgPyAtLW1NdXRlQ291bnQgOiAtMTsgfQorCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Qgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIEFjdGl2aXR5VHJhY2tpbmc6OmR1bXAoZHN0LCBzcGFjZXMpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLCBWb2x1bWU6ICUuMDNmLCBNdXRlQ291bnQ6ICUwMmRcbiIsIG1DdXJWb2x1bWVEYiwgbU11dGVDb3VudCk7CisgICAgfQorICAgIHZvaWQgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiKSB7IG1DdXJWb2x1bWVEYiA9IHZvbHVtZURiOyB9CisgICAgZmxvYXQgZ2V0Vm9sdW1lKCkgY29uc3QgeyByZXR1cm4gbUN1clZvbHVtZURiOyB9CisKK3ByaXZhdGU6CisgICAgaW50IG1NdXRlQ291bnQgPSAwOyAvKio8IG11dGUgcmVxdWVzdCBjb3VudGVyICovCisgICAgZmxvYXQgbUN1clZvbHVtZURiID0gTkFOOyAvKio8IGN1cnJlbnQgdm9sdW1lIGluIGRCLiAqLworfTsKKy8qKgorICogTm90ZTogdm9sdW1lIGFjdGl2aXRpZXMgc2hhbGwgYmUgaW5kZXhlZCBieSBDdXJ2ZXNJZCBpZiB3ZSB3YW50IHRvIGFsbG93IG11bHRpcGxlCisgKiBjdXJ2ZXMgcGVyIHZvbHVtZSBzb3VyY2UsIGluZmVycmluZyBhIG11dGUgbWFuYWdlbWVudCBvciB2b2x1bWUgYmFsYW5jaW5nIGJldHdlZW4gSFcgYW5kIFNXIGlzCisgKiBkb25lCisgKi8KK3VzaW5nIFZvbHVtZUFjdGl2aXRpZXMgPSBzdGQ6Om1hcDxWb2x1bWVTb3VyY2UsIFZvbHVtZUFjdGl2aXR5PjsKKworLyoqCisgKiBAYnJpZWYgVGhlIEFjdGl2aXR5IGNsYXNzOiBpdCB0cmFja3MgdGhlIGFjdGl2aXR5IGZvciB2b2x1bWUgcG9saWN5ICh2b2x1bWUgaW5kZXgsIG11dGUsCisgKiBtZW1vcml6ZSBwcmV2aW91cyBzdG9wLCBhbmQgc3RvcmUgbXV0ZSBpZiBpbmNvbXBhdGlibGUgZGV2aWNlIHdpdGggYW5vdGhlciBzdHJhdGVneS4KKyAqIEhhdmluZyB0aGlzIGNsYXNzIHByZXZlbnRzIGZyb20gbG9vcGluZyBvbiBhbGwgYXR0cmlidXRlcyAobGVnYWN5IHN0cmVhbXMpIG9mIHRoZSBzdHJhdGVneQorICovCitjbGFzcyBSb3V0aW5nQWN0aXZpdHkgOiBwdWJsaWMgQWN0aXZpdHlUcmFja2luZworeworcHVibGljOgorICAgIHZvaWQgc2V0TXV0ZWRCeURldmljZSggYm9vbCBpc011dGVkKSB7IG1Jc011dGVkQnlEZXZpY2UgPSBpc011dGVkOyB9CisgICAgYm9vbCBpc011dGVkQnlEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtSXNNdXRlZEJ5RGV2aWNlOyB9CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIEFjdGl2aXR5VHJhY2tpbmc6OmR1bXAoZHN0LCBzcGFjZXMpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4iKTsKKyAgICB9Citwcml2YXRlOgorICAgIC8qKgorICAgICAqIHN0cmF0ZWdpZXMgbXV0ZWQgYmVjYXVzZSBvZiBpbmNvbXBhdGlibGUgZGV2aWNlIHNlbGVjdGlvbi4KKyAgICAgKiBTZWUgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKCkKKyAgICAgKi8KKyAgICBib29sIG1Jc011dGVkQnlEZXZpY2UgPSBmYWxzZTsKK307Cit1c2luZyBSb3V0aW5nQWN0aXZpdGllcyA9IHN0ZDo6bWFwPHByb2R1Y3Rfc3RyYXRlZ3lfdCwgUm91dGluZ0FjdGl2aXR5PjsKIAogLy8gZGVzY3JpcHRvciBmb3IgYXVkaW8gb3V0cHV0cy4gVXNlZCB0byBtYWludGFpbiBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBvcGVuZWQgYXVkaW8gb3V0cHV0CiAvLyBhbmQga2VlcCB0cmFjayBvZiB0aGUgdXNhZ2Ugb2YgdGhpcyBvdXRwdXQgYnkgZWFjaCBhdWRpbyBzdHJlYW0gdHlwZS4KLWNsYXNzIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydENvbmZpZworY2xhc3MgQXVkaW9PdXRwdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnLCBwdWJsaWMgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UKKyAgICAsIHB1YmxpYyBDbGllbnRNYXBIYW5kbGVyPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4KIHsKIHB1YmxpYzoKICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8QXVkaW9Qb3J0PiYgcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CiAgICAgdmlydHVhbCB+QXVkaW9PdXRwdXREZXNjcmlwdG9yKCkge30KIAotICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKICAgICB2b2lkICAgICAgICBsb2coY29uc3QgY2hhciogaW5kZW50KTsKIAogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0SWQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgc2hhcmVzSHdNb2R1bGVXaXRoKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpOwotICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IHN1cHBvcnRlZERldmljZXMoKTsKKyAgICB2aXJ0dWFsIERldmljZVZlY3RvciBkZXZpY2VzKCkgY29uc3QgeyByZXR1cm4gbURldmljZXM7IH0KKyAgICBib29sIHNoYXJlc0h3TW9kdWxlV2l0aChjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKTsKKyAgICB2aXJ0dWFsIERldmljZVZlY3RvciBzdXBwb3J0ZWREZXZpY2VzKCkgY29uc3QgIHsgcmV0dXJuIG1EZXZpY2VzOyB9CiAgICAgdmlydHVhbCBib29sIGlzRHVwbGljYXRlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgdmlydHVhbCB1aW50MzJfdCBsYXRlbmN5KCkgeyByZXR1cm4gMDsgfQogICAgIHZpcnR1YWwgYm9vbCBpc0ZpeGVkVm9sdW1lKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwotICAgIHZpcnR1YWwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzdWJPdXRwdXQxKCkgeyByZXR1cm4gMDsgfQotICAgIHZpcnR1YWwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzdWJPdXRwdXQyKCkgeyByZXR1cm4gMDsgfQotICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgdmlydHVhbCBib29sIHNldFZvbHVtZShmbG9hdCB2b2x1bWVEYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIGNvbnN0IFN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpOwotICAgIHZpcnR1YWwgdm9pZCBjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGRlbHRhKTsKIAotICAgIGJvb2wgaXNBY3RpdmUodWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKLSAgICBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3Q7CisgICAgLyoqCisgICAgICogQGJyaWVmIHNldFN0b3BUaW1lIHNldCB0aGUgc3RvcCB0aW1lIGR1ZSB0byB0aGUgY2xpZW50IHN0b3BwYWdlIG9yIGEgcmUgcm91dGluZyBvZiB0aGlzCisgICAgICogY2xpZW50CisgICAgICogQHBhcmFtIGNsaWVudCB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHBhcmFtIHN5c1RpbWUgd2hlbiB0aGUgY2xpZW50IHN0b3BwZWQvd2FzIHJlcm91dGVkCisgICAgICovCisgICAgdm9pZCBzZXRTdG9wVGltZShjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIG5zZWNzX3Qgc3lzVGltZSk7CisKKyAgICAvKioKKyAgICAgKiBDaGFuZ2VzIHRoZSBjbGllbnQtPmFjdGl2ZSgpIHN0YXRlIGFuZCB0aGUgb3V0cHV0IGRlc2NyaXB0b3IncyBnbG9iYWwgYWN0aXZlIGNvdW50LAorICAgICAqIGFsb25nIHdpdGggdGhlIHN0cmVhbSBhY3RpdmUgY291bnQgYW5kIG1BY3RpdmVDbGllbnRzLgorICAgICAqIFRoZSBjbGllbnQgbXVzdCBiZSBwcmV2aW91c2x5IGFkZGVkIGJ5IHRoZSBiYXNlIGNsYXNzIGFkZENsaWVudCgpLgorICAgICAqIEluIGNhc2Ugb2YgZHVwbGljYXRpbmcgdGhyZWFkLCBjbGllbnQgc2hhbGwgYmUgYWRkZWQgb24gdGhlIGR1cGxpY2F0ZWQgdGhyZWFkLCBub3Qgb24gdGhlCisgICAgICogaW52b2x2ZWQgb3V0cHV0cyBidXQgc2V0Q2xpZW50QWN0aXZlIHdpbGwgYmUgY2FsbGVkIG9uIGFsbCBvdXRwdXQgdG8gdHJhY2sgc3RyYXRlZ3kgYW5kCisgICAgICogYWN0aXZlIGNsaWVudCBmb3IgYSBnaXZlbiBvdXRwdXQuCisgICAgICogQWN0aXZlIHJlZiBjb3VudCBvZiB0aGUgY2xpZW50IHdpbGwgYmUgaW5jcmVtZW50ZWQvZGVjcmVtZW50ZWQgdGhyb3VnaCBzZXRBY3RpdmUgQVBJCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHNldENsaWVudEFjdGl2ZShjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKTsKKworICAgIGJvb2wgaXNBY3RpdmUodWludDMyX3QgaW5QYXN0TXMpIGNvbnN0OworICAgIGJvb2wgaXNBY3RpdmUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSA9IFZPTFVNRV9TT1VSQ0VfTk9ORSwKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCwKKyAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OworICAgIGJvb2wgaXNBbnlBY3RpdmUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZVRvSWdub3JlKSBjb25zdDsKKworICAgIHN0ZDo6dmVjdG9yPFZvbHVtZVNvdXJjZT4gZ2V0QWN0aXZlVm9sdW1lU291cmNlcygpIGNvbnN0IHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Vm9sdW1lU291cmNlPiBhY3RpdmVMaXN0OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBtVm9sdW1lQWN0aXZpdGllcykgeworICAgICAgICAgICAgaWYgKGl0ZXIuc2Vjb25kLmlzQWN0aXZlKCkpIHsKKyAgICAgICAgICAgICAgICBhY3RpdmVMaXN0LnB1c2hfYmFjayhpdGVyLmZpcnN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWN0aXZlTGlzdDsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0QWN0aXZpdHlDb3VudChWb2x1bWVTb3VyY2UgdnMpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbVZvbHVtZUFjdGl2aXRpZXMuZmluZCh2cykgIT0gc3RkOjplbmQobVZvbHVtZUFjdGl2aXRpZXMpPworICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQWN0aXZpdGllcy5hdCh2cykuZ2V0QWN0aXZpdHlDb3VudCgpIDogMDsKKyAgICB9CisgICAgYm9vbCBpc011dGVkKFZvbHVtZVNvdXJjZSB2cykgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtVm9sdW1lQWN0aXZpdGllcy5maW5kKHZzKSAhPSBzdGQ6OmVuZChtVm9sdW1lQWN0aXZpdGllcyk/CisgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVBY3Rpdml0aWVzLmF0KHZzKS5pc011dGVkKCkgOiBmYWxzZTsKKyAgICB9CisgICAgaW50IGdldE11dGVDb3VudChWb2x1bWVTb3VyY2UgdnMpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbVZvbHVtZUFjdGl2aXRpZXMuZmluZCh2cykgIT0gc3RkOjplbmQobVZvbHVtZUFjdGl2aXRpZXMpPworICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQWN0aXZpdGllcy5hdCh2cykuZ2V0TXV0ZUNvdW50KCkgOiAwOworICAgIH0KKyAgICBpbnQgaW5jTXV0ZUNvdW50KFZvbHVtZVNvdXJjZSB2cykKKyAgICB7CisgICAgICAgIHJldHVybiBtVm9sdW1lQWN0aXZpdGllc1t2c10uaW5jTXV0ZUNvdW50KCk7CisgICAgfQorICAgIGludCBkZWNNdXRlQ291bnQoVm9sdW1lU291cmNlIHZzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Wb2x1bWVBY3Rpdml0aWVzW3ZzXS5kZWNNdXRlQ291bnQoKTsKKyAgICB9CisgICAgdm9pZCBzZXRDdXJWb2x1bWUoVm9sdW1lU291cmNlIHZzLCBmbG9hdCB2b2x1bWVEYikKKyAgICB7CisgICAgICAgIC8vIEV2ZW4gaWYgbm90IGFjdGl2aXR5IGZvciB0aGlzIHNvdXJjZSByZWdpc3RlcmVkLCBuZWVkIHRvIGNyZWF0ZSBhbnl3YXkKKyAgICAgICAgbVZvbHVtZUFjdGl2aXRpZXNbdnNdLnNldFZvbHVtZSh2b2x1bWVEYik7CisgICAgfQorICAgIGZsb2F0IGdldEN1clZvbHVtZShWb2x1bWVTb3VyY2UgdnMpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbVZvbHVtZUFjdGl2aXRpZXMuZmluZCh2cykgIT0gc3RkOjplbmQobVZvbHVtZUFjdGl2aXRpZXMpID8KKyAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUFjdGl2aXRpZXMuYXQodnMpLmdldFZvbHVtZSgpIDogTkFOOworICAgIH0KKworICAgIGJvb2wgaXNTdHJhdGVneUFjdGl2ZShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMsIHVpbnQzMl90IGluUGFzdE1zID0gMCwgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtUm91dGluZ0FjdGl2aXRpZXMuZmluZChwcykgIT0gc3RkOjplbmQobVJvdXRpbmdBY3Rpdml0aWVzKT8KKyAgICAgICAgICAgICAgICAgICAgbVJvdXRpbmdBY3Rpdml0aWVzLmF0KHBzKS5pc0FjdGl2ZShpblBhc3RNcywgc3lzVGltZSkgOiBmYWxzZTsKKyAgICB9CisgICAgYm9vbCBpc1N0cmF0ZWd5TXV0ZWRCeURldmljZShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbVJvdXRpbmdBY3Rpdml0aWVzLmZpbmQocHMpICE9IHN0ZDo6ZW5kKG1Sb3V0aW5nQWN0aXZpdGllcyk/CisgICAgICAgICAgICAgICAgICAgIG1Sb3V0aW5nQWN0aXZpdGllcy5hdChwcykuaXNNdXRlZEJ5RGV2aWNlKCkgOiBmYWxzZTsKKyAgICB9CisgICAgdm9pZCBzZXRTdHJhdGVneU11dGVkQnlEZXZpY2UocHJvZHVjdF9zdHJhdGVneV90IHBzLCBib29sIGlzTXV0ZWQpCisgICAgeworICAgICAgICBtUm91dGluZ0FjdGl2aXRpZXNbcHNdLnNldE11dGVkQnlEZXZpY2UoaXNNdXRlZCk7CisgICAgfQogCiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKQEAgLTczLDIyICsyNTIsNTggQEAKIAogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRNb2R1bGVIYW5kbGUoKSBjb25zdDsKIAotICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbVBhdGNoSGFuZGxlOyB9OwotICAgIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSB7IG1QYXRjaEhhbmRsZSA9IGhhbmRsZTsgfTsKKyAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZQorICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZ2V0Q29uZmlnKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgb3ZlcnJpZGU7CiAKLSAgICBzcDxBdWRpb1BvcnQ+ICAgICAgIG1Qb3J0OwotICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlOyAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGRldmljZSB0aGlzIG91dHB1dCBpcyByb3V0ZWQgdG8KLSAgICB1aW50MzJfdCBtUmVmQ291bnRbQVVESU9fU1RSRUFNX0NOVF07IC8vIG51bWJlciBvZiBzdHJlYW1zIG9mIGVhY2ggdHlwZSB1c2luZyB0aGlzIG91dHB1dAotICAgIG5zZWNzX3QgbVN0b3BUaW1lW0FVRElPX1NUUkVBTV9DTlRdOwotICAgIGZsb2F0IG1DdXJWb2x1bWVbQVVESU9fU1RSRUFNX0NOVF07ICAgLy8gY3VycmVudCBzdHJlYW0gdm9sdW1lIGluIGRCCi0gICAgaW50IG1NdXRlQ291bnRbQVVESU9fU1RSRUFNX0NOVF07ICAgICAvLyBtdXRlIHJlcXVlc3QgY291bnRlcgotICAgIGJvb2wgbVN0cmF0ZWd5TXV0ZWRCeURldmljZVtOVU1fU1RSQVRFR0lFU107IC8vIHN0cmF0ZWdpZXMgbXV0ZWQgYmVjYXVzZSBvZiBpbmNvbXBhdGlibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXZpY2Ugc2VsZWN0aW9uLiBTZWUgY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcygpCi0gICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKm1DbGllbnRJbnRlcmZhY2U7CisgICAgVHJhY2tDbGllbnRWZWN0b3IgY2xpZW50c0xpc3QoYm9vbCBhY3RpdmVPbmx5ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5ID0gUFJPRFVDVF9TVFJBVEVHWV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJlZmVycmVkRGV2aWNlT25seSA9IGZhbHNlKSBjb25zdDsKKworICAgIC8vIG92ZXJyaWRlIENsaWVudE1hcEhhbmRsZXIgdG8gYWJvcnQgd2hlbiByZW1vdmluZyBhIGNsaWVudCB3aGVuIGFjdGl2ZS4KKyAgICB2b2lkIHJlbW92ZUNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgb3ZlcnJpZGUgeworICAgICAgICBhdXRvIGNsaWVudCA9IGdldENsaWVudChwb3J0SWQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNsaWVudC5nZXQoKSA9PSBudWxscHRyLAorICAgICAgICAgICAgICAgICIlcyglZCk6IG5vbmV4aXN0ZW50IGNsaWVudCBwb3J0SWQgJWQiLCBfX2Z1bmNfXywgbUlkLCBwb3J0SWQpOworICAgICAgICAvLyBpdCBpcyBwb3NzaWJsZSB0aGF0IHdoZW4gYSBjbGllbnQgaXMgcmVtb3ZlZCwgd2UgY291bGQgcmVtb3ZlIGl0cworICAgICAgICAvLyBhc3NvY2lhdGVkIGFjdGl2ZSBjb3VudCBieSBjYWxsaW5nIGNoYW5nZVN0cmVhbUFjdGl2ZUNvdW50KCksCisgICAgICAgIC8vIGJ1dCB0aGF0IHdvdWxkIGJlIGhpZGluZyBhIHByb2JsZW0sIHNvIHdlIGxvZyBmYXRhbCBpbnN0ZWFkLgorICAgICAgICBhdXRvIGNsaWVudEl0ZXIgPSBzdGQ6OmZpbmQoYmVnaW4obUFjdGl2ZUNsaWVudHMpLCBlbmQobUFjdGl2ZUNsaWVudHMpLCBjbGllbnQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNsaWVudEl0ZXIgIT0gbUFjdGl2ZUNsaWVudHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVkKSByZW1vdmluZyBjbGllbnQgcG9ydElkICVkIHdoaWNoIGlzIGFjdGl2ZSAoY291bnQgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBwb3J0SWQsIGNsaWVudC0+Z2V0QWN0aXZpdHlDb3VudCgpKTsKKyAgICAgICAgQ2xpZW50TWFwSGFuZGxlcjxUcmFja0NsaWVudERlc2NyaXB0b3I+OjpyZW1vdmVDbGllbnQocG9ydElkKTsKKyAgICB9CisKKyAgICBjb25zdCBUcmFja0NsaWVudFZlY3RvciYgZ2V0QWN0aXZlQ2xpZW50cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVDbGllbnRzOworICAgIH0KKworICAgIGJvb2wgdXNlSHdHYWluKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAhZGV2aWNlcygpLmlzRW1wdHkoKSA/IGRldmljZXMoKS5pdGVtQXQoMCktPmhhc0dhaW5Db250cm9sbGVyKCkgOiBmYWxzZTsKKyAgICB9CisKKyAgICBEZXZpY2VWZWN0b3IgbURldmljZXM7IC8qKjwgY3VycmVudCBkZXZpY2VzIHRoaXMgb3V0cHV0IGlzIHJvdXRlZCB0byAqLworICAgIHdwPEF1ZGlvUG9saWN5TWl4PiBtUG9saWN5TWl4OyAgLy8gbm9uIE5VTEwgd2hlbiB1c2VkIGJ5IGEgZHluYW1pYyBwb2xpY3kKIAogcHJvdGVjdGVkOgotICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZTsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZDsKKyAgICBjb25zdCBzcDxBdWRpb1BvcnQ+IG1Qb3J0OworICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICogY29uc3QgbUNsaWVudEludGVyZmFjZTsKKyAgICB1aW50MzJfdCBtR2xvYmFsQWN0aXZlQ291bnQgPSAwOyAgLy8gbm9uLWNsaWVudC1zcGVjaWZpYyBhY3RpdmUgY291bnQKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisKKyAgICAvLyBUaGUgQWN0aXZlQ2xpZW50cyBzaG93cyB0aGUgY2xpZW50cyB0aGF0IGNvbnRyaWJ1dGUgdG8gdGhlIEBWb2x1bWVTb3VyY2UgY291bnRzCisgICAgLy8gYW5kIG1heSBpbmNsdWRlIHVwc3RyZWFtIGNsaWVudHMgZnJvbSBhIGR1cGxpY2F0aW5nIHRocmVhZC4KKyAgICAvLyBDb21wYXJlIHdpdGggdGhlIENsaWVudE1hcCAobUNsaWVudHMpIHdoaWNoIGFyZSBleHRlcm5hbCBBdWRpb1RyYWNrIGNsaWVudHMgb2YgdGhlCisgICAgLy8gb3V0cHV0IGRlc2NyaXB0b3IgKGFuZCBkbyBub3QgY291bnQgaW50ZXJuYWwgUGF0Y2hUcmFja3MpLgorICAgIFRyYWNrQ2xpZW50VmVjdG9yIG1BY3RpdmVDbGllbnRzOworCisgICAgUm91dGluZ0FjdGl2aXRpZXMgbVJvdXRpbmdBY3Rpdml0aWVzOyAvKio8IHRyYWNrIHJvdXRpbmcgYWN0aXZpdHkgb24gdGhpcyBvdXB1dC4qLworCisgICAgVm9sdW1lQWN0aXZpdGllcyBtVm9sdW1lQWN0aXZpdGllczsgLyoqPCB0cmFjayB2b2x1bWUgYWN0aXZpdHkgb24gdGhpcyBvdXB1dC4qLwogfTsKIAogLy8gQXVkaW8gb3V0cHV0IGRyaXZlbiBieSBhIHNvZnR3YXJlIG1peGVyIGluIGF1ZGlvIGZsaW5nZXIuCkBAIC05OSwxOSArMzE0LDI2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CiAgICAgdmlydHVhbCB+U3dBdWRpb091dHB1dERlc2NyaXB0b3IoKSB7fQogCi0gICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOwotCi0gICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIHNoYXJlc0h3TW9kdWxlV2l0aChjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKTsKLSAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBzdXBwb3J0ZWREZXZpY2VzKCk7CisgICAgICAgICAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIERldmljZVZlY3RvciBkZXZpY2VzKCkgY29uc3Q7CisgICAgdm9pZCBzZXREZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgeyBtRGV2aWNlcyA9IGRldmljZXM7IH0KKyAgICBib29sIHNoYXJlc0h3TW9kdWxlV2l0aChjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpOworICAgIHZpcnR1YWwgRGV2aWNlVmVjdG9yIHN1cHBvcnRlZERldmljZXMoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKICAgICB2aXJ0dWFsIHVpbnQzMl90IGxhdGVuY3koKTsKICAgICB2aXJ0dWFsIGJvb2wgaXNEdXBsaWNhdGVkKCkgY29uc3QgeyByZXR1cm4gKG1PdXRwdXQxICE9IE5VTEwgJiYgbU91dHB1dDIgIT0gTlVMTCk7IH0KICAgICB2aXJ0dWFsIGJvb2wgaXNGaXhlZFZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKLSAgICB2aXJ0dWFsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MSgpIHsgcmV0dXJuIG1PdXRwdXQxOyB9Ci0gICAgdmlydHVhbCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHN1Yk91dHB1dDIoKSB7IHJldHVybiBtT3V0cHV0MjsgfQotICAgIHZpcnR1YWwgdm9pZCBjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGRlbHRhKTsKLSAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzdWJPdXRwdXQxKCkgeyByZXR1cm4gbU91dHB1dDE7IH0KKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MigpIHsgcmV0dXJuIG1PdXRwdXQyOyB9CisgICAgdm9pZCBzZXRDbGllbnRBY3RpdmUoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBib29sIGFjdGl2ZSkgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRBbGxDbGllbnRzSW5hY3RpdmUoKQorICAgIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBjbGllbnRzTGlzdCh0cnVlKSkgeworICAgICAgICAgICAgc2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCBjb25zdCBTdHJlYW1UeXBlVmVjdG9yICZzdHJlYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKTsKQEAgLTEyMCw0OCArMzQyLDcyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CiAKLSAgICAgICAgICAgIHN0YXR1c190IG9wZW4oY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0KTsKLSAgICAgICAgICAgIC8vIENhbGxlZCB3aGVuIGEgc3RyZWFtIGlzIGFib3V0IHRvIGJlIHN0YXJ0ZWQKLSAgICAgICAgICAgIC8vIE5vdGU6IGNhbGxlZCBiZWZvcmUgY2hhbmdlUmVmQ291bnQoMSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGFydCgpOwotICAgICAgICAgICAgLy8gQ2FsbGVkIGFmdGVyIGEgc3RyZWFtIGlzIHN0b3BwZWQuCi0gICAgICAgICAgICAvLyBOb3RlOiBjYWxsZWQgYWZ0ZXIgY2hhbmdlUmVmQ291bnQoLTEpOwotICAgICAgICAgICAgdm9pZCBzdG9wKCk7Ci0gICAgICAgICAgICB2b2lkIGNsb3NlKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBvcGVuRHVwbGljYXRpbmcoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUpOworICAgICAgICBzdGF0dXNfdCBvcGVuKGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQpOworCisgICAgICAgIC8vIENhbGxlZCB3aGVuIGEgc3RyZWFtIGlzIGFib3V0IHRvIGJlIHN0YXJ0ZWQKKyAgICAgICAgLy8gTm90ZTogY2FsbGVkIGJlZm9yZSBzZXRDbGllbnRBY3RpdmUodHJ1ZSk7CisgICAgICAgIHN0YXR1c190IHN0YXJ0KCk7CisgICAgICAgIC8vIENhbGxlZCBhZnRlciBhIHN0cmVhbSBpcyBzdG9wcGVkLgorICAgICAgICAvLyBOb3RlOiBjYWxsZWQgYWZ0ZXIgc2V0Q2xpZW50QWN0aXZlKGZhbHNlKTsKKyAgICAgICAgdm9pZCBzdG9wKCk7CisgICAgICAgIHZvaWQgY2xvc2UoKTsKKyAgICAgICAgc3RhdHVzX3Qgb3BlbkR1cGxpY2F0aW5nKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgc3VwcG9ydHNEZXZpY2UKKyAgICAgKiBAcGFyYW0gZGV2aWNlIHRvIGJlIGNoZWNrZWQgYWdhaW5zdAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIHN1cHBvcnRlZCBieSB0eXBlIChmb3Igbm9uIGJ1cyAvIHJlbW90ZSBzdWJtaXggZGV2aWNlcyksCisgICAgICogICAgICAgICB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkIChib3RoIHR5cGUgYW5kIGFkZHJlc3MpIGZvciBidXMgLyByZW1vdGUgc3VibWl4CisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIHN1cHBvcnRzRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIHN1cHBvcnRzQWxsRGV2aWNlcworICAgICAqIEBwYXJhbSBkZXZpY2VzIHRvIGJlIGNoZWNrZWQgYWdhaW5zdAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIHdlYWtseSBzdXBwb3J0ZWQgYnkgdHlwZSAoZS5nLiBmb3Igbm9uIGJ1cyAvIHJzdWJtaXggZGV2aWNlcyksCisgICAgICogICAgICAgICB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkIChib3RoIHR5cGUgYW5kIGFkZHJlc3MpIGZvciBidXMgLyByZW1vdGUgc3VibWl4CisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIHN1cHBvcnRzQWxsRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGZpbHRlclN1cHBvcnRlZERldmljZXMgdGFrZXMgYSB2ZWN0b3Igb2YgZGV2aWNlcyBhbmQgZmlsdGVycyB0aGVtIGFjY29yZGluZyB0byB0aGUKKyAgICAgKiBkZXZpY2Ugc3VwcG9ydGVkIGJ5IHRoaXMgb3V0cHV0ICh0aGUgcHJvZmlsZSBmcm9tIHdoaWNoIHRoaXMgb3V0cHV0IGRlcml2ZXMgZnJvbSkKKyAgICAgKiBAcGFyYW0gZGV2aWNlcyByZWZlcmVuY2UgZGV2aWNlIHZlY3RvciB0byBiZSBmaWx0ZXJlZAorICAgICAqIEByZXR1cm4gdmVjdG9yIG9mIGRldmljZXMgZmlsdGVyZWQgZnJvbSB0aGUgc3VwcG9ydGVkIGRldmljZXMgb2YgdGhpcyBvdXRwdXQgKHdlYWtseSBvciBub3QKKyAgICAgKiBkZXBlbmRpbmcgb24gdGhlIGRldmljZSB0eXBlKQorICAgICAqLworICAgIERldmljZVZlY3RvciBmaWx0ZXJTdXBwb3J0ZWREZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3Q7CiAKICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IG1Qcm9maWxlOyAgICAgICAgICAvLyBJL08gcHJvZmlsZSB0aGlzIG91dHB1dCBkZXJpdmVzIGZyb20KICAgICBhdWRpb19pb19oYW5kbGVfdCBtSW9IYW5kbGU7ICAgICAgICAgICAvLyBvdXRwdXQgaGFuZGxlCiAgICAgdWludDMyX3QgbUxhdGVuY3k7ICAgICAgICAgICAgICAgICAgLy8KICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBtRmxhZ3M7ICAgLy8KLSAgICBBdWRpb01peCAqbVBvbGljeU1peDsgICAgICAgICAgICAgLy8gbm9uIE5VTEwgd2hlbiB1c2VkIGJ5IGEgZHluYW1pYyBwb2xpY3kKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbU91dHB1dDE7ICAgIC8vIHVzZWQgYnkgZHVwbGljYXRlZCBvdXRwdXRzOiBmaXJzdCBvdXRwdXQKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbU91dHB1dDI7ICAgIC8vIHVzZWQgYnkgZHVwbGljYXRlZCBvdXRwdXRzOiBzZWNvbmQgb3V0cHV0CiAgICAgdWludDMyX3QgbURpcmVjdE9wZW5Db3VudDsgLy8gbnVtYmVyIG9mIGNsaWVudHMgdXNpbmcgdGhpcyBvdXRwdXQgKGRpcmVjdCBvdXRwdXRzIG9ubHkpCiAgICAgYXVkaW9fc2Vzc2lvbl90IG1EaXJlY3RDbGllbnRTZXNzaW9uOyAvLyBzZXNzaW9uIGlkIG9mIHRoZSBkaXJlY3Qgb3V0cHV0IGNsaWVudAotICAgIHVpbnQzMl90IG1HbG9iYWxSZWZDb3VudDsgIC8vIG5vbi1zdHJlYW0tc3BlY2lmaWMgcmVmIGNvdW50CiB9OwogCiAvLyBBdWRpbyBvdXRwdXQgZHJpdmVuIGJ5IGFuIGlucHV0IGRldmljZSBkaXJlY3RseS4KIGNsYXNzIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9PdXRwdXREZXNjcmlwdG9yCiB7CiBwdWJsaWM6Ci0gICAgSHdBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiYgc291cmNlLAorICAgIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CiAgICAgdmlydHVhbCB+SHdBdWRpb091dHB1dERlc2NyaXB0b3IoKSB7fQogCi0gICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOworICAgICAgICAgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBzdXBwb3J0ZWREZXZpY2VzKCk7Ci0gICAgdmlydHVhbCBib29sIHNldFZvbHVtZShmbG9hdCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgY29uc3QgU3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSk7CkBAIC0xNzAsNyArNDE2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKIAotICAgIGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gbVNvdXJjZTsKKyAgICBjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBtU291cmNlOwogCiB9OwogCkBAIC0xNzgsMjUgKzQyNCw1MiBAQAogICAgICAgICBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19pb19oYW5kbGVfdCwgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ID4KIHsKIHB1YmxpYzoKLSAgICBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgIGJvb2wgaXNBY3RpdmUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKIAogICAgIC8qKgotICAgICAqIHJldHVybiB3aGV0aGVyIGEgc3RyZWFtIGlzIHBsYXlpbmcgcmVtb3RlbHksIG92ZXJyaWRlIHRvIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZgorICAgICAqIHJldHVybiB3aGV0aGVyIGFueSBzb3VyY2UgY29udHJpYnV0aW5nIHRvIFZvbHVtZVNvdXJjZSBpcyBwbGF5aW5nIHJlbW90ZWx5LCBvdmVycmlkZQorICAgICAqIHRvIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZgogICAgICAqIGxvY2FsL3JlbW90ZSBwbGF5YmFjaywgdXNlZCBmb3IgaW5zdGFuY2UgYnkgbm90aWZpY2F0aW9uIG1hbmFnZXIgdG8gbm90IG1ha2UKICAgICAgKiBtZWRpYSBwbGF5ZXJzIGxvc2UgYXVkaW8gZm9jdXMgd2hlbiBub3QgcGxheWluZyBsb2NhbGx5CiAgICAgICogRm9yIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uLCAicmVtb3RlbHkiIG1lYW5zIHBsYXlpbmcgZHVyaW5nIHNjcmVlbiBtaXJyb3Jpbmcgd2hpY2gKICAgICAgKiB1c2VzIGFuIG91dHB1dCBmb3IgcGxheWJhY2sgd2l0aCBhIG5vbi1lbXB0eSwgbm9uICIwIiBhZGRyZXNzLgogICAgICAqLwotICAgIGJvb2wgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKKyAgICBib29sIGlzQWN0aXZlUmVtb3RlbHkoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKIAogICAgIC8qKgotICAgICAqIHJldHVybiB3aGV0aGVyIGEgc3RyZWFtIGlzIHBsYXlpbmcsIGJ1dCBub3Qgb24gYSAicmVtb3RlIiBkZXZpY2UuCisgICAgICogcmV0dXJuIHdoZXRoZXIgYW55IHNvdXJjZSBjb250cmlidXRpbmcgdG8gVm9sdW1lU291cmNlIGlzIHBsYXlpbmcsIGJ1dCBub3Qgb24gYSAicmVtb3RlIgorICAgICAqIGRldmljZS4KICAgICAgKiBPdmVycmlkZSB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YgYSBsb2NhbC9yZW1vdGUgcGxheWJhY2suCiAgICAgICogVXNlZCBmb3IgaW5zdGFuY2UgYnkgcG9saWN5IG1hbmFnZXIgdG8gYWx0ZXIgdGhlIHNwZWFrZXIgcGxheWJhY2sgKCJzcGVha2VyIHNhZmUiIGJlaGF2aW9yKQogICAgICAqIHdoZW4gbWVkaWEgcGxheXMgb3Igbm90IGxvY2FsbHkuCiAgICAgICogRm9yIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uLCAicmVtb3RlbHkiIG1lYW5zIHBsYXlpbmcgZHVyaW5nIHNjcmVlbiBtaXJyb3JpbmcuCiAgICAgICovCi0gICAgYm9vbCBpc1N0cmVhbUFjdGl2ZUxvY2FsbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgYm9vbCBpc0FjdGl2ZUxvY2FsbHkoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBpc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlIGNoZWNrcyBpZiB0aGUgZ2l2ZW4gc3RyYXRlZ3kgaXMgYWN0aXZlIChvciB3YXMgYWN0aXZlCisgICAgICogaW4gdGhlIHBhc3QpIG9uIHRoZSBnaXZlbiBvdXRwdXQgYW5kIGFsbCB0aGUgb3V0cHV0cyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgSFcgTW9kdWxlCisgICAgICogdGhlIHNhbWUgbW9kdWxlIHRoYW4gdGhlIGdpdmVuIG91dHB1dAorICAgICAqIEBwYXJhbSBvdXRwdXREZXNjIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gcHMgcHJvZHVjdCBzdHJhdGVneSB0byBiZSBjaGVja2VkIHVwb24gYWN0aXZpdHkgc3RhdHVzCisgICAgICogQHBhcmFtIGluUGFzdE1zIGlmIDAsIGNoZWNrIGN1cnJlbnRseSwgb3RoZXJ3aXNlLCBjaGVjayBpbiB0aGUgcGFzdAorICAgICAqIEBwYXJhbSBzeXNUaW1lIHNoYWxsIGJlIHNldCBpZiByZXF1ZXN0IGlzIGRvbmUgZm9yIHRoZSBwYXN0IGFjdGl2aXR5LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbiBvdXRwdXQgZm9sbG93aW5nIHRoZSBzdHJhdGVneSBpcyBhY3RpdmUgb24gdGhlIHNhbWUgbW9kdWxlIHRoYW4gZGVzYywKKyAgICAgKiBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIGlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUocHJvZHVjdF9zdHJhdGVneV90IHBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCwgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgY2xlYXJTZXNzaW9uUm91dGVzRm9yRGV2aWNlOiB3aGVuIGEgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCwgYW5kIGlmIHRoaXMgZGV2aWNlIGhhcworICAgICAqIGJlZW4gY2hvc2VuIGFzIHRoZSBwcmVmZXJyZWQgZGV2aWNlIGJ5IGFueSBjbGllbnQsIHRoZSBwb2xpY3kgbWFuYWdlciBzaGFsbAorICAgICAqIHByZXZlbnQgZnJvbSB1c2luZyB0aGlzIGRldmljZSBhbnkgbW9yZSBieSBjbGVhcmluZyBhbGwgdGhlIHNlc3Npb24gcm91dGVzIGludm9sdmluZyB0aGlzCisgICAgICogZGV2aWNlLgorICAgICAqIEluIG90aGVyIHdvcmRzLCB0aGUgcHJlZmVycmVkIGRldmljZSBwb3J0IGlkIG9mIHRoZXNlIGNsaWVudHMgd2lsbCBiZSByZXNldHRlZCB0byBOT05FLgorICAgICAqIEBwYXJhbSBkaXNjb25uZWN0ZWREZXZpY2UgZGV2aWNlIHRvIGJlIGRpc2Nvbm5lY3RlZAorICAgICAqLworICAgIHZvaWQgY2xlYXJTZXNzaW9uUm91dGVzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkaXNjb25uZWN0ZWREZXZpY2UpOwogCiAgICAgLyoqCiAgICAgICogcmV0dXJucyB0aGUgQTJEUCBvdXRwdXQgaGFuZGxlIGlmIGl0IGlzIG9wZW4gb3IgMCBvdGhlcndpc2UKQEAgLTIxOCwyNyArNDkxLDUzIEBACiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGdldFByaW1hcnlPdXRwdXQoKSBjb25zdDsKIAogICAgIC8qKgotICAgICAqIHJldHVybiB0cnVlIGlmIGFueSBvdXRwdXQgaXMgcGxheWluZyBhbnl0aGluZyBiZXNpZGVzIHRoZSBzdHJlYW0gdG8gaWdub3JlCisgICAgICogQGJyaWVmIGlzQW55T3V0cHV0QWN0aXZlIGNoZWNrcyBpZiBhbnkgb3V0cHV0IGlzIGFjdGl2ZSAoYWthIHBsYXlpbmcpIGV4Y2VwdCB0aGUgb25lKHMpIHRoYXQKKyAgICAgKiBob2xkIHRoZSB2b2x1bWUgc291cmNlIHRvIGJlIGlnbm9yZWQKKyAgICAgKiBAcGFyYW0gdm9sdW1lU291cmNlVG9JZ25vcmUgc291cmNlIG5vdCB0byBiZSBjb25zaWRlcmVkIGluIHRoZSBhY3Rpdml0eSBkZXRlY3Rpb24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW55IG91dHB1dCBpcyBhY3RpdmUgZm9yIGFueSB2b2x1bWUgc291cmNlIGV4Y2VwdCB0aGUgb25lIHRvIGJlIGlnbm9yZWQKICAgICAgKi8KLSAgICBib29sIGlzQW55T3V0cHV0QWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVG9JZ25vcmUpIGNvbnN0OworICAgIGJvb2wgaXNBbnlPdXRwdXRBY3RpdmUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZVRvSWdub3JlKSBjb25zdAorICAgIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNBbnlBY3RpdmUodm9sdW1lU291cmNlVG9JZ25vcmUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAogICAgIGF1ZGlvX2RldmljZXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGdldE91dHB1dEZvckNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIH07CiAKIGNsYXNzIEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uIDoKICAgICAgICAgcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjwgYXVkaW9faW9faGFuZGxlX3QsIHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiA+CiB7CiBwdWJsaWM6Ci0gICAgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKKyAgICBib29sIGlzQWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CiAKICAgICAvKioKLSAgICAgKiByZXR1cm4gdHJ1ZSBpZiBhbnkgb3V0cHV0IGlzIHBsYXlpbmcgYW55dGhpbmcgYmVzaWRlcyB0aGUgc3RyZWFtIHRvIGlnbm9yZQorICAgICAqIEBicmllZiBpc0FueU91dHB1dEFjdGl2ZSBjaGVja3MgaWYgYW55IG91dHB1dCBpcyBhY3RpdmUgKGFrYSBwbGF5aW5nKSBleGNlcHQgdGhlIG9uZShzKSB0aGF0CisgICAgICogaG9sZCB0aGUgdm9sdW1lIHNvdXJjZSB0byBiZSBpZ25vcmVkCisgICAgICogQHBhcmFtIHZvbHVtZVNvdXJjZVRvSWdub3JlIHNvdXJjZSBub3QgdG8gYmUgY29uc2lkZXJlZCBpbiB0aGUgYWN0aXZpdHkgZGV0ZWN0aW9uCisgICAgICogQHJldHVybiB0cnVlIGlmIGFueSBvdXRwdXQgaXMgYWN0aXZlIGZvciBhbnkgdm9sdW1lIHNvdXJjZSBleGNlcHQgdGhlIG9uZSB0byBiZSBpZ25vcmVkCiAgICAgICovCi0gICAgYm9vbCBpc0FueU91dHB1dEFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVRvSWdub3JlKSBjb25zdDsKKyAgICBib29sIGlzQW55T3V0cHV0QWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2VUb0lnbm9yZSkgY29uc3QKKyAgICB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJm91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQW55QWN0aXZlKHZvbHVtZVNvdXJjZVRvSWdub3JlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiB9OwogCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oCmluZGV4IGMxYzNmM2MuLjA4NDNmZWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMCw3ICszMSw3IEBACiBwdWJsaWM6CiAgICAgQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLCB1aWRfdCB1aWQpOwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKIAogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGU7CiAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIG1QYXRjaDsKQEAgLTQ3LDcgKzQ4LDcgQEAKIAogICAgIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKSBjb25zdDsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeUNvbmZpZy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5Q29uZmlnLmgKaW5kZXggNDNmNmVkNi4uMjI2NGQ4ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5Q29uZmlnLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5Q29uZmlnLmgKQEAgLTE2LDggKzE2LDEwIEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCiAjaW5jbHVkZSA8QXVkaW9HYWluLmg+Ci0jaW5jbHVkZSA8Vm9sdW1lQ3VydmUuaD4KICNpbmNsdWRlIDxBdWRpb1BvcnQuaD4KICNpbmNsdWRlIDxBdWRpb1BhdGNoLmg+CiAjaW5jbHVkZSA8RGV2aWNlRGVzY3JpcHRvci5oPgpAQCAtMjgsNyArMzAsNiBAQAogI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWl4Lmg+CiAjaW5jbHVkZSA8RWZmZWN0RGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPFNvdW5kVHJpZ2dlclNlc3Npb24uaD4KLSNpbmNsdWRlIDxTZXNzaW9uUm91dGUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zOCwyMSArMzksMjAgQEAKICAgICBBdWRpb1BvbGljeUNvbmZpZyhId01vZHVsZUNvbGxlY3Rpb24gJmh3TW9kdWxlcywKICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVJbnB1dERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRlZmF1bHRPdXRwdXREZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gKnZvbHVtZXMgPSBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0T3V0cHV0RGV2aWNlKQogICAgICAgICA6IG1Id01vZHVsZXMoaHdNb2R1bGVzKSwKICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyhhdmFpbGFibGVPdXRwdXREZXZpY2VzKSwKICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzKGF2YWlsYWJsZUlucHV0RGV2aWNlcyksCi0gICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2VzKGRlZmF1bHRPdXRwdXREZXZpY2VzKSwKLSAgICAgICAgICBtVm9sdW1lQ3VydmVzKHZvbHVtZXMpLAorICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlKGRlZmF1bHRPdXRwdXREZXZpY2UpLAogICAgICAgICAgIG1Jc1NwZWFrZXJEcmNFbmFibGVkKGZhbHNlKQogICAgIHt9CiAKLSAgICB2b2lkIHNldFZvbHVtZXMoY29uc3QgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiAmdm9sdW1lcykKLSAgICB7Ci0gICAgICAgIGlmIChtVm9sdW1lQ3VydmVzICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICptVm9sdW1lQ3VydmVzID0gdm9sdW1lczsKLSAgICAgICAgfQorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRTb3VyY2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU291cmNlOworICAgIH0KKworICAgIHZvaWQgc2V0U291cmNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlKSB7CisgICAgICAgIG1Tb3VyY2UgPSBmaWxlOwogICAgIH0KIAogICAgIHZvaWQgc2V0SHdNb2R1bGVzKGNvbnN0IEh3TW9kdWxlQ29sbGVjdGlvbiAmaHdNb2R1bGVzKQpAQCAtMTAwLDUxICsxMDAsODMgQEAKIAogICAgIHZvaWQgc2V0RGVmYXVsdE91dHB1dERldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGVmYXVsdERldmljZSkKICAgICB7Ci0gICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlcyA9IGRlZmF1bHREZXZpY2U7CisgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlID0gZGVmYXVsdERldmljZTsKICAgICB9CiAKLSAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZ2V0RGVmYXVsdE91dHB1dERldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1EZWZhdWx0T3V0cHV0RGV2aWNlczsgfQorICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZnZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbURlZmF1bHRPdXRwdXREZXZpY2U7IH0KIAogICAgIHZvaWQgc2V0RGVmYXVsdCh2b2lkKQogICAgIHsKLSAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2VzID0gbmV3IERldmljZURlc2NyaXB0b3IoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKTsKLSAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZTsKKyAgICAgICAgbVNvdXJjZSA9ICJBdWRpb1BvbGljeUNvbmZpZzo6c2V0RGVmYXVsdCI7CisgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKTsKKyAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShBdWRpb1Byb2ZpbGU6OmNyZWF0ZUZ1bGxEeW5hbWljKCkpOwogICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZWZhdWx0SW5wdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpOwotICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5hZGQobURlZmF1bHRPdXRwdXREZXZpY2VzKTsKKyAgICAgICAgZGVmYXVsdElucHV0RGV2aWNlLT5hZGRBdWRpb1Byb2ZpbGUoQXVkaW9Qcm9maWxlOjpjcmVhdGVGdWxsRHluYW1pYygpKTsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBtaWNQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZSgKKyAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9JTl9NT05PLCA4MDAwKTsKKyAgICAgICAgZGVmYXVsdElucHV0RGV2aWNlLT5hZGRBdWRpb1Byb2ZpbGUobWljUHJvZmlsZSk7CisgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChtRGVmYXVsdE91dHB1dERldmljZSk7CiAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuYWRkKGRlZmF1bHRJbnB1dERldmljZSk7CiAKLSAgICAgICAgbW9kdWxlID0gbmV3IEh3TW9kdWxlKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKTsKKyAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG5ldyBId01vZHVsZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSwgMiAvKmhhbFZlcnNpb25NYWpvciovKTsKKyAgICAgICAgbUh3TW9kdWxlcy5hZGQobW9kdWxlKTsKKyAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UtPmF0dGFjaChtb2R1bGUpOworICAgICAgICBkZWZhdWx0SW5wdXREZXZpY2UtPmF0dGFjaChtb2R1bGUpOwogCi0gICAgICAgIHNwPE91dHB1dFByb2ZpbGU+IG91dFByb2ZpbGU7Ci0gICAgICAgIG91dFByb2ZpbGUgPSBuZXcgT3V0cHV0UHJvZmlsZShTdHJpbmc4KCJwcmltYXJ5IikpOwotICAgICAgICBvdXRQcm9maWxlLT5hdHRhY2gobW9kdWxlKTsKKyAgICAgICAgc3A8T3V0cHV0UHJvZmlsZT4gb3V0UHJvZmlsZSA9IG5ldyBPdXRwdXRQcm9maWxlKFN0cmluZzgoInByaW1hcnkiKSk7CiAgICAgICAgIG91dFByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZSgKICAgICAgICAgICAgICAgICBuZXcgQXVkaW9Qcm9maWxlKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sIDQ0MTAwKSk7Ci0gICAgICAgIG91dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtRGVmYXVsdE91dHB1dERldmljZXMpOworICAgICAgICBvdXRQcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UobURlZmF1bHRPdXRwdXREZXZpY2UpOwogICAgICAgICBvdXRQcm9maWxlLT5zZXRGbGFncyhBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKTsKICAgICAgICAgbW9kdWxlLT5hZGRPdXRwdXRQcm9maWxlKG91dFByb2ZpbGUpOwogCi0gICAgICAgIHNwPElucHV0UHJvZmlsZT4gaW5Qcm9maWxlOwotICAgICAgICBpblByb2ZpbGUgPSBuZXcgSW5wdXRQcm9maWxlKFN0cmluZzgoInByaW1hcnkiKSk7Ci0gICAgICAgIGluUHJvZmlsZS0+YXR0YWNoKG1vZHVsZSk7Ci0gICAgICAgIGluUHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKAotICAgICAgICAgICAgICAgIG5ldyBBdWRpb1Byb2ZpbGUoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIEFVRElPX0NIQU5ORUxfSU5fTU9OTywgODAwMCkpOworICAgICAgICBzcDxJbnB1dFByb2ZpbGU+IGluUHJvZmlsZSA9IG5ldyBJbnB1dFByb2ZpbGUoU3RyaW5nOCgicHJpbWFyeSIpKTsKKyAgICAgICAgaW5Qcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUobWljUHJvZmlsZSk7CiAgICAgICAgIGluUHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKGRlZmF1bHRJbnB1dERldmljZSk7CiAgICAgICAgIG1vZHVsZS0+YWRkSW5wdXRQcm9maWxlKGluUHJvZmlsZSk7CiAKLSAgICAgICAgbUh3TW9kdWxlcy5hZGQobW9kdWxlKTsKKyAgICAgICAgc2V0RGVmYXVsdFN1cnJvdW5kRm9ybWF0cygpOworICAgIH0KKworICAgIC8vIFN1cnJvdW5kIGZvcm1hdHMsIHdpdGggYW4gb3B0aW9uYWwgbGlzdCBvZiBzdWJmb3JtYXRzIHRoYXQgYXJlIGVxdWl2YWxlbnQgZnJvbSB1c2VycycgUE9WLgorICAgIHVzaW5nIFN1cnJvdW5kRm9ybWF0cyA9IHN0ZDo6dW5vcmRlcmVkX21hcDxhdWRpb19mb3JtYXRfdCwgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90Pj47CisKKyAgICBjb25zdCBTdXJyb3VuZEZvcm1hdHMgJmdldFN1cnJvdW5kRm9ybWF0cygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbVN1cnJvdW5kRm9ybWF0czsKKyAgICB9CisKKyAgICB2b2lkIHNldFN1cnJvdW5kRm9ybWF0cyhjb25zdCBTdXJyb3VuZEZvcm1hdHMgJnN1cnJvdW5kRm9ybWF0cykKKyAgICB7CisgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMgPSBzdXJyb3VuZEZvcm1hdHM7CisgICAgfQorCisgICAgdm9pZCBzZXREZWZhdWx0U3Vycm91bmRGb3JtYXRzKCkKKyAgICB7CisgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMgPSB7CisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0FDMywge319LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9FX0FDMywge319LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9EVFMsIHt9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfRFRTX0hELCB7fX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0FBQ19MQywgeworICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX0hFX1YxLCBBVURJT19GT1JNQVRfQUFDX0hFX1YyLCBBVURJT19GT1JNQVRfQUFDX0VMRCwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19YSEV9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfRE9MQllfVFJVRUhELCB7fX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0VfQUMzX0pPQywge319LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9BQzQsIHt9fX07CiAgICAgfQogCiBwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1Tb3VyY2U7CiAgICAgSHdNb2R1bGVDb2xsZWN0aW9uICZtSHdNb2R1bGVzOyAvKio8IENvbGxlY3Rpb24gb2YgTW9kdWxlLCB3aXRoIFByb2ZpbGVzLCBpLmUuIE1peCBQb3J0cy4gKi8KICAgICBEZXZpY2VWZWN0b3IgJm1BdmFpbGFibGVPdXRwdXREZXZpY2VzOwogICAgIERldmljZVZlY3RvciAmbUF2YWlsYWJsZUlucHV0RGV2aWNlczsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmbURlZmF1bHRPdXRwdXREZXZpY2VzOwotICAgIFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gKm1Wb2x1bWVDdXJ2ZXM7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm1EZWZhdWx0T3V0cHV0RGV2aWNlOwogICAgIC8vIFRPRE86IHJlbW92ZSB3aGVuIGxlZ2FjeSBjb25mIGZpbGUgaXMgcmVtb3ZlZC4gdHJ1ZSBvbiBkZXZpY2VzIHRoYXQgdXNlIERSQyBvbiB0aGUKICAgICAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiBwYXRoIHRvIGJvb3N0IHNvZnQgc291bmRzLCB1c2VkIHRvIGFkanVzdCB2b2x1bWUgY3VydmVzIGFjY29yZGluZ2x5LgogICAgIC8vIE5vdGU6IHJlbW92ZSBhbHNvIHNwZWFrZXJfZHJjX2VuYWJsZWQgZnJvbSBnbG9iYWwgY29uZmlndXJhdGlvbiBvZiBYTUwgY29uZmlnIGZpbGUuCiAgICAgYm9vbCBtSXNTcGVha2VyRHJjRW5hYmxlZDsKKyAgICBTdXJyb3VuZEZvcm1hdHMgbVN1cnJvdW5kRm9ybWF0czsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmgKaW5kZXggOGZjNmZlOS4uN2E5YzI2ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmgKQEAgLTE2LDM3ICsxNiwzNCBAQAogCiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAotbmFtZXNwYWNlIGFuZHJvaWQgeworI2luY2x1ZGUgPERldmljZURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxBdWRpb091dHB1dERlc2NyaXB0b3IuaD4KIAotY2xhc3MgU3dBdWRpb091dHB1dERlc2NyaXB0b3I7CituYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8qKgogICogY3VzdG9tIG1peCBlbnRyeSBpbiBtUG9saWN5TWl4ZXMKICAqLwotY2xhc3MgQXVkaW9Qb2xpY3lNaXggOiBwdWJsaWMgUmVmQmFzZSB7CitjbGFzcyBBdWRpb1BvbGljeU1peCA6IHB1YmxpYyBBdWRpb01peCwgcHVibGljIFJlZkJhc2UgewogcHVibGljOgotICAgIEF1ZGlvUG9saWN5TWl4KCkge30KKyAgICBBdWRpb1BvbGljeU1peChjb25zdCBBdWRpb01peCAmbWl4KSA6IEF1ZGlvTWl4KG1peCkge30KKyAgICBBdWRpb1BvbGljeU1peChjb25zdCBBdWRpb1BvbGljeU1peCYpID0gZGVsZXRlOworICAgIEF1ZGlvUG9saWN5TWl4JiBvcGVyYXRvcj0oY29uc3QgQXVkaW9Qb2xpY3lNaXgmKSA9IGRlbGV0ZTsKIAotICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmZ2V0T3V0cHV0KCkgY29uc3Q7CisgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZnZXRPdXRwdXQoKSBjb25zdCB7IHJldHVybiBtT3V0cHV0OyB9CisgICAgdm9pZCBzZXRPdXRwdXQoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZvdXRwdXQpIHsgbU91dHB1dCA9IG91dHB1dDsgfQorICAgIHZvaWQgY2xlYXJPdXRwdXQoKSB7IG1PdXRwdXQuY2xlYXIoKTsgfQogCi0gICAgdm9pZCBzZXRPdXRwdXQoc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZvdXRwdXQpOwotCi0gICAgdm9pZCBjbGVhck91dHB1dCgpOwotCi0gICAgYW5kcm9pZDo6QXVkaW9NaXggKmdldE1peCgpOwotCi0gICAgdm9pZCBzZXRNaXgoQXVkaW9NaXggJm1peCk7Ci0KLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OwogCiBwcml2YXRlOgotICAgIEF1ZGlvTWl4ICAgIG1NaXg7ICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvIHBvbGljeSBtaXggZGVzY3JpcHRvcgogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0OyAgLy8gQ29ycmVzcG9uZGluZyBvdXRwdXQgc3RyZWFtCiB9OwogCkBAIC02NiwyMSArNjMsMzkgQEAKICAgICAgKiBUcnkgdG8gZmluZCBhbiBvdXRwdXQgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZXMuCiAgICAgICoKICAgICAgKiBAcGFyYW1baW5dIGF0dHJpYnV0ZXMgdG8gY29uc2lkZXIgZm93ciB0aGUgcmVzZWFyY2ggb2Ygb3V0cHV0IGRlc2NyaXB0b3IuCi0gICAgICogQHBhcmFtW291dF0gZGVzYyB0byByZXR1cm4gaWYgYW4gb3V0cHV0IGNvdWxkIGJlIGZvdW5kLgotICAgICAqCi0gICAgICogQHJldHVybiBOT19FUlJPUiBpZiBhbiBvdXRwdXQgd2FzIGZvdW5kIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlIChpbiB0aGlzIGNhc2UsIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciBvdXRwdXQgcGFyYW0gaXMgaW5pdGlhbGl6ZWQpLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW1bb3V0XSBkZXNjIHRvIHJldHVybiBpZiBhbiBwcmltYXJ5IG91dHB1dCBjb3VsZCBiZSBmb3VuZC4KKyAgICAgKiBAcGFyYW1bb3V0XSBzZWNvbmRhcnlEZXNjIG90aGVyIGRlc2MgdGhhdCB0aGUgYXVkaW8gc2hvdWxkIGJlIHJvdXRlZCB0by4KICAgICAgKi8KLSAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLCB1aWRfdCB1aWQsCi0gICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJmRlc2MpOworICAgIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzLCB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZwcmltYXJ5RGVzYywKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+ICpzZWNvbmRhcnlEZXNjcyk7CiAKLSAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVEZXZpY2VUeXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXggKipwb2xpY3lNaXgpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmYXZhaWxhYmxlRGV2aWNlVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+ICpwb2xpY3lNaXgpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgZ2V0SW5wdXRNaXhGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyLCBBdWRpb01peCAqKnBvbGljeU1peCk7CisgICAgLyoqCisgICAgICogQGJyaWVmIHRyeSB0byBmaW5kIGEgbWF0Y2hpbmcgbWl4IGZvciBhIGdpdmVuIG91dHB1dCBkZXNjcmlwdG9yIGFuZCByZXR1cm5zIHRoZSBhc3NvY2lhdGVkCisgICAgICogb3V0cHV0IGRldmljZS4KKyAgICAgKiBAcGFyYW0gb3V0cHV0IHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBsaXN0IG9mIG91dHB1dCBkZXZpY2VzIGN1cnJlbnRseSByZWFjaGFibGUKKyAgICAgKiBAcmV0dXJuIGRldmljZSBzZWxlY3RlZCBmcm9tIHRoZSBtaXggYXR0YWNoZWQgdG8gdGhlIG91dHB1dCwgbnVsbCBwb2ludGVyIG90aGVyd2lzZQorICAgICAqLworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZUFuZE1peEZvck91dHB1dChjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICBzdGF0dXNfdCBnZXRJbnB1dE1peEZvckF0dHIoYXVkaW9fYXR0cmlidXRlc190IGF0dHIsIHNwPEF1ZGlvUG9saWN5TWl4PiAqcG9saWN5TWl4KTsKKworICAgIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworICAgIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKTsKKyAgICBzdGF0dXNfdCBnZXREZXZpY2VzRm9yVWlkKHVpZF90IHVpZCwgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKSBjb25zdDsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OworCitwcml2YXRlOgorICAgIGVudW0gY2xhc3MgTWl4TWF0Y2hTdGF0dXMgeyBNQVRDSCwgTk9fTUFUQ0gsIElOVkFMSURfTUlYIH07CisgICAgTWl4TWF0Y2hTdGF0dXMgbWl4TWF0Y2goY29uc3QgQXVkaW9NaXgqIG1peCwgc2l6ZV90IG1peEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcywgdWlkX3QgdWlkKTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaAppbmRleCAwOWE4NmRkLi4yZDE4MmJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb3J0LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9ydC5oCkBAIC0xOCw2ICsxOCw3IEBACiAKICNpbmNsdWRlICJBdWRpb0NvbGxlY3Rpb25zLmgiCiAjaW5jbHVkZSAiQXVkaW9Qcm9maWxlLmgiCisjaW5jbHVkZSAiQXVkaW9HYWluLmgiCiAjaW5jbHVkZSAiSGFuZGxlR2VuZXJhdG9yLmgiCiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtMjksOSArMzAsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBId01vZHVsZTsKLWNsYXNzIEF1ZGlvR2FpbjsKIGNsYXNzIEF1ZGlvUm91dGU7Ci10eXBlZGVmIFZlY3RvcjxzcDxBdWRpb0dhaW4+ID4gQXVkaW9HYWluQ29sbGVjdGlvbjsKIAogY2xhc3MgQXVkaW9Qb3J0IDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSwgcHJpdmF0ZSBIYW5kbGVHZW5lcmF0b3I8YXVkaW9fcG9ydF9oYW5kbGVfdD4KIHsKQEAgLTQ5LDggKzQ4LDggQEAKIAogICAgIHZpcnR1YWwgY29uc3QgU3RyaW5nOCBnZXRUYWdOYW1lKCkgY29uc3QgPSAwOwogCi0gICAgdm9pZCBzZXRHYWlucyhjb25zdCBBdWRpb0dhaW5Db2xsZWN0aW9uICZnYWlucykgeyBtR2FpbnMgPSBnYWluczsgfQotICAgIGNvbnN0IEF1ZGlvR2FpbkNvbGxlY3Rpb24gJmdldEdhaW5zKCkgY29uc3QgeyByZXR1cm4gbUdhaW5zOyB9CisgICAgdm9pZCBzZXRHYWlucyhjb25zdCBBdWRpb0dhaW5zICZnYWlucykgeyBtR2FpbnMgPSBnYWluczsgfQorICAgIGNvbnN0IEF1ZGlvR2FpbnMgJmdldEdhaW5zKCkgY29uc3QgeyByZXR1cm4gbUdhaW5zOyB9CiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0RmxhZ3ModWludDMyX3QgZmxhZ3MpCiAgICAgewpAQCAtNjUsNiArNjQsNyBAQAogICAgIHVpbnQzMl90IGdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9CiAKICAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7CiAgICAgYm9vbCBpc0F0dGFjaGVkKCkgeyByZXR1cm4gbU1vZHVsZSAhPSAwOyB9CiAKICAgICAvLyBBdWRpbyBwb3J0IElEcyBhcmUgaW4gYSBkaWZmZXJlbnQgbmFtZXNwYWNlIHRoYW4gQXVkaW9GbGluZ2VyIHVuaXF1ZSBJRHMKQEAgLTExNiw2ICsxMTYsNyBAQAogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRNb2R1bGVIYW5kbGUoKSBjb25zdDsKICAgICB1aW50MzJfdCBnZXRNb2R1bGVWZXJzaW9uTWFqb3IoKSBjb25zdDsKICAgICBjb25zdCBjaGFyICpnZXRNb2R1bGVOYW1lKCkgY29uc3Q7CisgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1Nb2R1bGU7IH0KIAogICAgIGJvb2wgdXNlSW5wdXRDaGFubmVsTWFzaygpIGNvbnN0CiAgICAgewpAQCAtMTMyLDE2ICsxMzMsMTcgQEAKICAgICB2b2lkIGFkZFJvdXRlKGNvbnN0IHNwPEF1ZGlvUm91dGU+ICZyb3V0ZSkgeyBtUm91dGVzLmFkZChyb3V0ZSk7IH0KICAgICBjb25zdCBBdWRpb1JvdXRlVmVjdG9yICZnZXRSb3V0ZXMoKSBjb25zdCB7IHJldHVybiBtUm91dGVzOyB9CiAKLSAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKKwogICAgIHZvaWQgbG9nKGNvbnN0IGNoYXIqIGluZGVudCkgY29uc3Q7CiAKLSAgICBBdWRpb0dhaW5Db2xsZWN0aW9uIG1HYWluczsgLy8gZ2FpbiBjb250cm9sbGVycwotICAgIHNwPEh3TW9kdWxlPiBtTW9kdWxlOyAgICAgICAgICAgICAgICAgLy8gYXVkaW8gSFcgbW9kdWxlIGV4cG9zaW5nIHRoaXMgSS9PIHN0cmVhbQorICAgIEF1ZGlvR2FpbnMgbUdhaW5zOyAvLyBnYWluIGNvbnRyb2xsZXJzCiAKIHByaXZhdGU6CiAgICAgdm9pZCBwaWNrQ2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgJmNoYW5uZWxNYXNrLCBjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzKSBjb25zdDsKICAgICB2b2lkIHBpY2tTYW1wbGluZ1JhdGUodWludDMyX3QgJnJhdGUsY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxpbmdSYXRlcykgY29uc3Q7CiAKKyAgICBzcDxId01vZHVsZT4gbU1vZHVsZTsgICAgICAgICAgICAgICAgIC8vIGF1ZGlvIEhXIG1vZHVsZSBleHBvc2luZyB0aGlzIEkvTyBzdHJlYW0KICAgICBTdHJpbmc4ICBtTmFtZTsKICAgICBhdWRpb19wb3J0X3R5cGVfdCBtVHlwZTsKICAgICBhdWRpb19wb3J0X3JvbGVfdCBtUm9sZTsKQEAgLTE1MywyMiArMTU1LDIyIEBACiBjbGFzcyBBdWRpb1BvcnRDb25maWcgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCiB7CiBwdWJsaWM6Ci0gICAgQXVkaW9Qb3J0Q29uZmlnKCk7Ci0gICAgdmlydHVhbCB+QXVkaW9Qb3J0Q29uZmlnKCkge30KLQogICAgIHN0YXR1c190IGFwcGx5QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqYmFja3VwQ29uZmlnID0gTlVMTCk7CiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgYm9vbCBoYXNTYW1lSHdNb2R1bGVBcyhjb25zdCBzcDxBdWRpb1BvcnRDb25maWc+JiBvdGhlcikgY29uc3QgewotICAgICAgICByZXR1cm4gKG90aGVyICE9IDApICYmCisgICAgICAgIHJldHVybiAob3RoZXIgIT0gMCkgJiYgKG90aGVyLT5nZXRBdWRpb1BvcnQoKSAhPSAwKSAmJiAoZ2V0QXVkaW9Qb3J0KCkgIT0gMCkgJiYKICAgICAgICAgICAgICAgICAob3RoZXItPmdldEF1ZGlvUG9ydCgpLT5nZXRNb2R1bGVIYW5kbGUoKSA9PSBnZXRBdWRpb1BvcnQoKS0+Z2V0TW9kdWxlSGFuZGxlKCkpOwogICAgIH0KLSAgICB1aW50MzJfdCBtU2FtcGxpbmdSYXRlOwotICAgIGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbUNoYW5uZWxNYXNrOwotICAgIHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyBtR2FpbjsKKyAgICBib29sIGhhc0dhaW5Db250cm9sbGVyKGJvb2wgY2FuVXNlRm9yVm9sdW1lID0gZmFsc2UpIGNvbnN0OworCisgICAgdW5zaWduZWQgaW50IG1TYW1wbGluZ1JhdGUgPSAwdTsKKyAgICBhdWRpb19mb3JtYXRfdCBtRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbUNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgIHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyBtR2FpbiA9IHsgLmluZGV4ID0gLTEgfTsKKyAgICB1bmlvbiBhdWRpb19pb19mbGFncyBtRmxhZ3MgPSB7IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSB9OwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUHJvZmlsZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUHJvZmlsZS5oCmluZGV4IDg3NDFjNjYuLmI1ODhkNTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Byb2ZpbGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qcm9maWxlLmgKQEAgLTE2LDkxICsxNiw4NCBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgInBvbGljeS5oIgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlICJwb2xpY3kuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB0eXBlZGVmIFNvcnRlZFZlY3Rvcjx1aW50MzJfdD4gU2FtcGxlUmF0ZVZlY3RvcjsKLXR5cGVkZWYgU29ydGVkVmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiBDaGFubmVsc1ZlY3RvcjsKIHR5cGVkZWYgVmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiBGb3JtYXRWZWN0b3I7CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZsZWZ0LCBjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJnJpZ2h0KTsKK2Jvb2wgb3BlcmF0b3I9PSAoY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZsZWZ0LCBjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJnJpZ2h0KQoreworICAgIGlmIChsZWZ0LnNpemUoKSAhPSByaWdodC5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcmlnaHQuc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIGlmIChsZWZ0W2luZGV4XSAhPSByaWdodFtpbmRleF0pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIG9wZXJhdG9yIT0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmbGVmdCwgY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZyaWdodCkKK3sKKyAgICByZXR1cm4gIShsZWZ0ID09IHJpZ2h0KTsKK30KKworY2xhc3MgQ2hhbm5lbHNWZWN0b3IgOiBwdWJsaWMgU29ydGVkVmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PgoreworcHVibGljOgorICAgIENoYW5uZWxzVmVjdG9yKCkgPSBkZWZhdWx0OworICAgIENoYW5uZWxzVmVjdG9yKGNvbnN0IENoYW5uZWxzVmVjdG9yJikgPSBkZWZhdWx0OworICAgIENoYW5uZWxzVmVjdG9yKGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4mIHN2KSA6CisgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHN2KSB7fQorICAgIENoYW5uZWxzVmVjdG9yJiBvcGVyYXRvcj0oY29uc3QgQ2hhbm5lbHNWZWN0b3ImKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBBcHBsaWVzIGF1ZGlvX2NoYW5uZWxfbWFza19vdXRfdG9faW4gdG8gYWxsIGVsZW1lbnRzIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisgICAgQ2hhbm5lbHNWZWN0b3IgYXNJbk1hc2soKSBjb25zdDsKKyAgICAvLyBBcHBsaWVzIGF1ZGlvX2NoYW5uZWxfbWFza19pbl90b19vdXQgdG8gYWxsIGVsZW1lbnRzIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisgICAgQ2hhbm5lbHNWZWN0b3IgYXNPdXRNYXNrKCkgY29uc3Q7Cit9OwogCiBjbGFzcyBBdWRpb1Byb2ZpbGUgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCiB7CiBwdWJsaWM6Ci0gICAgQXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2tzLAotICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUpIDoKLSAgICAgICAgbU5hbWUoU3RyaW5nOCgiIikpLAotICAgICAgICBtRm9ybWF0KGZvcm1hdCkKLSAgICB7Ci0gICAgICAgIG1DaGFubmVsTWFza3MuYWRkKGNoYW5uZWxNYXNrcyk7Ci0gICAgICAgIG1TYW1wbGluZ1JhdGVzLmFkZChzYW1wbGluZ1JhdGUpOwotICAgIH0KKyAgICBzdGF0aWMgc3A8QXVkaW9Qcm9maWxlPiBjcmVhdGVGdWxsRHluYW1pYygpOwogCisgICAgQXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2tzLCB1aW50MzJfdCBzYW1wbGluZ1JhdGUpOwogICAgIEF1ZGlvUHJvZmlsZShhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgIGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MsCi0gICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsaW5nUmF0ZUNvbGxlY3Rpb24pIDoKLSAgICAgICAgbU5hbWUoU3RyaW5nOCgiIikpLAotICAgICAgICBtRm9ybWF0KGZvcm1hdCksCi0gICAgICAgIG1DaGFubmVsTWFza3MoY2hhbm5lbE1hc2tzKSwKLSAgICAgICAgbVNhbXBsaW5nUmF0ZXMoc2FtcGxpbmdSYXRlQ29sbGVjdGlvbikKLSAgICB7fQorICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGluZ1JhdGVDb2xsZWN0aW9uKTsKIAogICAgIGF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1Gb3JtYXQ7IH0KLQotICAgIHZvaWQgc2V0Q2hhbm5lbHMoY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcykKLSAgICB7Ci0gICAgICAgIGlmIChtSXNEeW5hbWljQ2hhbm5lbHMpIHsKLSAgICAgICAgICAgIG1DaGFubmVsTWFza3MgPSBjaGFubmVsTWFza3M7Ci0gICAgICAgIH0KLSAgICB9CiAgICAgY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmdldENoYW5uZWxzKCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxNYXNrczsgfQotCi0gICAgdm9pZCBzZXRTYW1wbGVSYXRlcyhjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGVSYXRlcykKLSAgICB7Ci0gICAgICAgIGlmIChtSXNEeW5hbWljUmF0ZSkgewotICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZXMgPSBzYW1wbGVSYXRlczsKLSAgICAgICAgfQotICAgIH0KICAgICBjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZnZXRTYW1wbGVSYXRlcygpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGluZ1JhdGVzOyB9CisgICAgdm9pZCBzZXRDaGFubmVscyhjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzKTsKKyAgICB2b2lkIHNldFNhbXBsZVJhdGVzKGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsZVJhdGVzKTsKIAorICAgIHZvaWQgY2xlYXIoKTsKICAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBoYXNWYWxpZEZvcm1hdCgpICYmIGhhc1ZhbGlkUmF0ZXMoKSAmJiBoYXNWYWxpZENoYW5uZWxzKCk7IH0KLQotICAgIHZvaWQgY2xlYXIoKQotICAgIHsKLSAgICAgICAgaWYgKG1Jc0R5bmFtaWNDaGFubmVscykgewotICAgICAgICAgICAgbUNoYW5uZWxNYXNrcy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSXNEeW5hbWljUmF0ZSkgewotICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZXMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlubGluZSBib29sIHN1cHBvcnRzQ2hhbm5lbHMoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbHMpIGNvbnN0CisgICAgYm9vbCBzdXBwb3J0c0NoYW5uZWxzKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxzKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1DaGFubmVsTWFza3MuaW5kZXhPZihjaGFubmVscykgPj0gMDsKICAgICB9Ci0gICAgaW5saW5lIGJvb2wgc3VwcG9ydHNSYXRlKHVpbnQzMl90IHJhdGUpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbVNhbXBsaW5nUmF0ZXMuaW5kZXhPZihyYXRlKSA+PSAwOwotICAgIH0KKyAgICBib29sIHN1cHBvcnRzUmF0ZSh1aW50MzJfdCByYXRlKSBjb25zdCB7IHJldHVybiBtU2FtcGxpbmdSYXRlcy5pbmRleE9mKHJhdGUpID49IDA7IH0KIAogICAgIHN0YXR1c190IGNoZWNrRXhhY3QodWludDMyX3QgcmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbHMsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7Ci0KICAgICBzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAmdXBkYXRlZENoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHBvcnRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlKSBjb25zdDsKLQogICAgIHN0YXR1c190IGNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZ1cGRhdGVkU2FtcGxpbmdSYXRlKSBjb25zdDsKIApAQCAtMTE5LDcgKzExMiw3IEBACiAKICAgICBib29sIGlzRHluYW1pYygpIHsgcmV0dXJuIG1Jc0R5bmFtaWNGb3JtYXQgfHwgbUlzRHluYW1pY0NoYW5uZWxzIHx8IG1Jc0R5bmFtaWNSYXRlOyB9CiAKLSAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBTdHJpbmc4ICBtTmFtZTsKQEAgLTEzNiwyMTMgKzEyOSw0OCBAQAogY2xhc3MgQXVkaW9Qcm9maWxlVmVjdG9yIDogcHVibGljIFZlY3RvcjxzcDxBdWRpb1Byb2ZpbGU+ID4KIHsKIHB1YmxpYzoKLSAgICBzc2l6ZV90IGFkZChjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlKQotICAgIHsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IFZlY3Rvcjo6YWRkKHByb2ZpbGUpOwotICAgICAgICAvLyB3ZSBzb3J0IGZyb20gd29yc3QgdG8gYmVzdCwgc28gdGhhdCBBVURJT19GT1JNQVRfREVGQVVMVCBpcyBhbHdheXMgdGhlIGZpcnN0IGVudHJ5LgotICAgICAgICAvLyBUT0RPOiBjb21wYXJlRm9ybWF0cyBjb3VsZCBiZSBhIGxhbWJkYSB0byBjb252ZXJ0IGJldHdlZW4gcG9pbnRlci10by1mb3JtYXQgdG8gZm9ybWF0OgotICAgICAgICAvLyBbXShjb25zdCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0MSwgY29uc3QgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdDIpIHsKLSAgICAgICAgLy8gICAgIHJldHVybiBjb21wYXJlRm9ybWF0cygqZm9ybWF0MSwgKmZvcm1hdDIpOwotICAgICAgICAvLyB9Ci0gICAgICAgIHNvcnQoY29tcGFyZUZvcm1hdHMpOwotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotCisgICAgc3NpemVfdCBhZGQoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZSk7CiAgICAgLy8gVGhpcyBBUEkgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSB0aGUgcG9saWN5IG1hbmFnZXIgb25jZSByZXRyaWV2aW5nIGNhcGFiaWxpdGllcwogICAgIC8vIGZvciBhIHByb2ZpbGUgd2l0aCBkeW5hbWljIGZvcm1hdCwgcmF0ZSBhbmQgY2hhbm5lbHMgYXR0cmlidXRlcwotICAgIHNzaXplX3QgYWRkUHJvZmlsZUZyb21IYWwoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZVRvQWRkKQotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgdmFsaWQgcHJvZmlsZSB0byBhZGQ6Ci0gICAgICAgIGlmICghcHJvZmlsZVRvQWRkLT5oYXNWYWxpZEZvcm1hdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkQ2hhbm5lbHMoKSAmJiAhcHJvZmlsZVRvQWRkLT5oYXNWYWxpZFJhdGVzKCkpIHsKLSAgICAgICAgICAgIEZvcm1hdFZlY3RvciBmb3JtYXRzOwotICAgICAgICAgICAgZm9ybWF0cy5hZGQocHJvZmlsZVRvQWRkLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICBzZXRGb3JtYXRzKEZvcm1hdFZlY3Rvcihmb3JtYXRzKSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmIHByb2ZpbGVUb0FkZC0+aGFzVmFsaWRSYXRlcygpKSB7Ci0gICAgICAgICAgICBzZXRTYW1wbGVSYXRlc0Zvcihwcm9maWxlVG9BZGQtPmdldFNhbXBsZVJhdGVzKCksIHByb2ZpbGVUb0FkZC0+Z2V0Rm9ybWF0KCkpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmICFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkUmF0ZXMoKSkgewotICAgICAgICAgICAgc2V0Q2hhbm5lbHNGb3IocHJvZmlsZVRvQWRkLT5nZXRDaGFubmVscygpLCBwcm9maWxlVG9BZGQtPmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIC8vIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgcHJvZmlsZSB0byBhdm9pZCBkdXBsaWNhdGVzCi0gICAgICAgIGZvciAoc2l6ZV90IHByb2ZpbGVJbmRleCA9IDA7IHByb2ZpbGVJbmRleCA8IHNpemUoKTsgcHJvZmlsZUluZGV4KyspIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUgPSBpdGVtQXQocHJvZmlsZUluZGV4KTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5pc1ZhbGlkKCkgJiYgcHJvZmlsZSA9PSBwcm9maWxlVG9BZGQpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRvCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGVJbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7IC8vIHNldCB0aGUgZm9ybWF0IGFzIGR5bmFtaWMgdG8gYWxsb3cgcmVtb3ZhbAotICAgICAgICByZXR1cm4gYWRkKHByb2ZpbGVUb0FkZCk7Ci0gICAgfQotCi0gICAgc3A8QXVkaW9Qcm9maWxlPiBnZXRGaXJzdFZhbGlkUHJvZmlsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXRlbUF0KGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGJvb2wgaGFzVmFsaWRQcm9maWxlKCkgY29uc3QgeyByZXR1cm4gZ2V0Rmlyc3RWYWxpZFByb2ZpbGUoKSAhPSAwOyB9CisgICAgc3NpemVfdCBhZGRQcm9maWxlRnJvbUhhbChjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlVG9BZGQpOwogCiAgICAgc3RhdHVzX3QgY2hlY2tFeGFjdFByb2ZpbGUodWludDMyX3Qgc2FtcGxpbmdSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OwotCiAgICAgc3RhdHVzX3QgY2hlY2tDb21wYXRpYmxlUHJvZmlsZSh1aW50MzJfdCAmc2FtcGxpbmdSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAmY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAmZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgcG9ydFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCBwb3J0Um9sZSkgY29uc3Q7CisgICAgdm9pZCBjbGVhclByb2ZpbGVzKCk7CisgICAgLy8gQXNzdW1pbmcgdGhhdCB0aGlzIHByb2ZpbGUgdmVjdG9yIGNvbnRhaW5zIGlucHV0IHByb2ZpbGVzLAorICAgIC8vIGZpbmQgdGhlIGJlc3QgbWF0Y2hpbmcgY29uZmlnIGZyb20gJ291dHB1dFByb2ZpbGVzJywgYWNjb3JkaW5nIHRvCisgICAgLy8gdGhlIGdpdmVuIHByZWZlcmVuY2VzIGZvciBhdWRpbyBmb3JtYXRzIGFuZCBjaGFubmVsIG1hc2tzLgorICAgIC8vIE5vdGU6IHN0ZDo6dmVjdG9ycyBhcmUgdXNlZCBiZWNhdXNlIHNwZWNpYWxpemVkIGNvbnRhaW5lcnMgZm9yIGZvcm1hdHMKKyAgICAvLyAgICAgICBhbmQgY2hhbm5lbHMgY2FuIGJlIHNvcnRlZCBhbmQgdXNlIHRoZWlyIG93biBvcmRlcmluZy4KKyAgICBzdGF0dXNfdCBmaW5kQmVzdE1hdGNoaW5nT3V0cHV0Q29uZmlnKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgb3V0cHV0UHJvZmlsZXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4mIHByZWZlcnJlZEZvcm1hdHMsIC8vIG9yZGVyOiBtb3N0IHByZWYgLT4gbGVhc3QgcHJlZgorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+JiBwcmVmZXJyZWRPdXRwdXRDaGFubmVscywKKyAgICAgICAgICAgIGJvb2wgcHJlZmVySGlnaGVyU2FtcGxpbmdSYXRlcywKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlICpiZXN0T3V0cHV0Q29uZmlnKSBjb25zdDsKIAotICAgIEZvcm1hdFZlY3RvciBnZXRTdXBwb3J0ZWRGb3JtYXRzKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIEZvcm1hdFZlY3RvciBzdXBwb3J0ZWRGb3JtYXRzOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5oYXNWYWxpZEZvcm1hdCgpKSB7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydGVkRm9ybWF0cy5hZGQoaXRlbUF0KGkpLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cHBvcnRlZEZvcm1hdHM7Ci0gICAgfQorICAgIHNwPEF1ZGlvUHJvZmlsZT4gZ2V0Rmlyc3RWYWxpZFByb2ZpbGUoKSBjb25zdDsKKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGdldEZpcnN0VmFsaWRQcm9maWxlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7CisgICAgYm9vbCBoYXNWYWxpZFByb2ZpbGUoKSBjb25zdCB7IHJldHVybiBnZXRGaXJzdFZhbGlkUHJvZmlsZSgpICE9IDA7IH0KIAotICAgIGJvb2wgaGFzRHluYW1pY1Byb2ZpbGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+aXNEeW5hbWljKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNEeW5hbWljRm9ybWF0KCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQcm9maWxlRm9yKGdEeW5hbWljRm9ybWF0KSAhPSAwOwotICAgIH0KLQotICAgIGJvb2wgaGFzRHluYW1pY0NoYW5uZWxzRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKLSAgICB7Ci0gICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljQ2hhbm5lbHMoKSkgewotICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2wgaGFzRHluYW1pY1JhdGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNSYXRlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQorICAgIEZvcm1hdFZlY3RvciBnZXRTdXBwb3J0ZWRGb3JtYXRzKCkgY29uc3Q7CisgICAgYm9vbCBoYXNEeW5hbWljQ2hhbm5lbHNGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKKyAgICBib29sIGhhc0R5bmFtaWNGb3JtYXQoKSBjb25zdCB7IHJldHVybiBnZXRQcm9maWxlRm9yKGdEeW5hbWljRm9ybWF0KSAhPSAwOyB9CisgICAgYm9vbCBoYXNEeW5hbWljUHJvZmlsZSgpIGNvbnN0OworICAgIGJvb2wgaGFzRHluYW1pY1JhdGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKIAogICAgIC8vIE9uZSBhdWRpbyBwcm9maWxlIHdpbGwgYmUgYWRkZWQgZm9yIGVhY2ggZm9ybWF0IHN1cHBvcnRlZCBieSBBdWRpbyBIQUwKLSAgICB2b2lkIHNldEZvcm1hdHMoY29uc3QgRm9ybWF0VmVjdG9yICZmb3JtYXRzKQotICAgIHsKLSAgICAgICAgLy8gT25seSBhbGxvdyB0byBjaGFuZ2UgdGhlIGZvcm1hdCBvZiBkeW5hbWljIHByb2ZpbGUKLSAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBkeW5hbWljRm9ybWF0UHJvZmlsZSA9IGdldFByb2ZpbGVGb3IoZ0R5bmFtaWNGb3JtYXQpOwotICAgICAgICBpZiAoZHluYW1pY0Zvcm1hdFByb2ZpbGUgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZm9ybWF0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXRzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljRm9ybWF0UHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCkpOwotICAgICAgICAgICAgcHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsKLSAgICAgICAgICAgIHByb2ZpbGUtPnNldER5bmFtaWNDaGFubmVscyhkeW5hbWljRm9ybWF0UHJvZmlsZS0+aXNEeW5hbWljQ2hhbm5lbHMoKSk7Ci0gICAgICAgICAgICBwcm9maWxlLT5zZXREeW5hbWljUmF0ZShkeW5hbWljRm9ybWF0UHJvZmlsZS0+aXNEeW5hbWljUmF0ZSgpKTsKLSAgICAgICAgICAgIGFkZChwcm9maWxlKTsKLSAgICAgICAgfQotICAgIH0KKyAgICB2b2lkIHNldEZvcm1hdHMoY29uc3QgRm9ybWF0VmVjdG9yICZmb3JtYXRzKTsKIAotICAgIHZvaWQgY2xlYXJQcm9maWxlcygpCi0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gc2l6ZSgpOyBpICE9IDA7ICkgewotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KC0taSk7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+aXNEeW5hbWljRm9ybWF0KCkgJiYgcHJvZmlsZS0+aGFzVmFsaWRGb3JtYXQoKSkgewotICAgICAgICAgICAgICAgIHJlbW92ZUF0KGkpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvZmlsZS0+Y2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0Ci0gICAgewotICAgICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICAgICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBQcm9maWxlczpcbiIsIHNwYWNlcywgIiIpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc1Byb2ZpbGUgJXp1OiIsIHNwYWNlcyArIDQsICIiLCBpKTsKLSAgICAgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgICAgIGl0ZW1BdChpKS0+ZHVtcChmZCwgc3BhY2VzICsgOCk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgdm9pZCBzZXRTYW1wbGVSYXRlc0Zvcihjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGVSYXRlcywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNSYXRlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+aGFzVmFsaWRSYXRlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY3JlYXRlIGEgbmV3IHByb2ZpbGUgd2l0aCBzYW1lIGZvcm1hdAotICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGVUb0FkZCA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0LCBwcm9maWxlLT5nZXRDaGFubmVscygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZXMpOwotICAgICAgICAgICAgICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7IC8vIG5lZWQgdG8gc2V0IHRvIGFsbG93IGNsZWFuaW5nCi0gICAgICAgICAgICAgICAgICAgIGFkZChwcm9maWxlVG9BZGQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPnNldFNhbXBsZVJhdGVzKHNhbXBsZVJhdGVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBzZXRDaGFubmVsc0Zvcihjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCi0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY0NoYW5uZWxzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+aGFzVmFsaWRDaGFubmVscygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY3JlYXRlIGEgbmV3IHByb2ZpbGUgd2l0aCBzYW1lIGZvcm1hdAotICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGVUb0FkZCA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0LCBjaGFubmVsTWFza3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOyAvLyBuZWVkIHRvIHNldCB0byBhbGxvdyBjbGVhbmluZwotICAgICAgICAgICAgICAgICAgICBhZGQocHJvZmlsZVRvQWRkKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5zZXRDaGFubmVscyhjaGFubmVsTWFza3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzcDxBdWRpb1Byb2ZpbGU+IGdldFByb2ZpbGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgc3A8QXVkaW9Qcm9maWxlPiBnZXRQcm9maWxlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7CisgICAgdm9pZCBzZXRTYW1wbGVSYXRlc0Zvcihjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGVSYXRlcywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKKyAgICB2b2lkIHNldENoYW5uZWxzRm9yKGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CiAKICAgICBzdGF0aWMgaW50IGNvbXBhcmVGb3JtYXRzKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gKnByb2ZpbGUxLCBjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICpwcm9maWxlMik7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUm91dGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1JvdXRlLmgKaW5kZXggNmIyNGZkZS4uMDM1N2ZmNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUm91dGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Sb3V0ZS5oCkBAIC00Niw3ICs0NiwyMCBAQAogCiAgICAgYXVkaW9fcm91dGVfdHlwZV90IGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBtVHlwZTsgfQogCi0gICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7CisgICAgLyoqCisgICAgICogQGJyaWVmIHN1cHBvcnRzUGF0Y2ggY2hlY2tzIGlmIGFuIGF1ZGlvIHBhdGNoIGlzIHN1cHBvcnRlZCBieSBhIFJvdXRlIGRlY2xhcmVkIGluCisgICAgICogdGhlIGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBmaWxlLgorICAgICAqIElmIHRoZSBwYXRjaCBpcyBzdXBwb3J0ZWQgbmF0aXZlbHkgYnkgYW4gQXVkaW9IQUwgKHdoaWNoIHN1cHBvcnRzIG9mIGNvdXJzZSBSb3V0aW5nIEFQSSAzLjApLAorICAgICAqIGF1ZGlvcG9saWN5IHdpbGwgbm90IHJlcXVlc3QgQXVkaW9GbGluZ2VyIHRvIHVzZSBhIHNvZnR3YXJlIGJyaWRnZSB0byByZWFsaXplIGEgcGF0Y2gKKyAgICAgKiBiZXR3ZWVuIDIgcG9ydHMuCisgICAgICogQHBhcmFtIHNyY1BvcnQgKGFrYSB0aGUgc291cmNlKSB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHBhcmFtIGRzdFBvcnQgKGFrYSB0aGUgc2luaykgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYXVkaW8gcm91dGUgc3VwcG9ydHMgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgc2luayBhbmQgdGhlIHNvdXJjZSwKKyAgICAgKiBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIHN1cHBvcnRzUGF0Y2goY29uc3Qgc3A8QXVkaW9Qb3J0PiAmc3JjUG9ydCwgY29uc3Qgc3A8QXVkaW9Qb3J0PiAmZHN0UG9ydCkgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBBdWRpb1BvcnRWZWN0b3IgbVNvdXJjZXM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNTI0N2QuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oPgotI2luY2x1ZGUgIkF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlOwotCi1jbGFzcyBBdWRpb1Nlc3Npb24gOiBwdWJsaWMgUmVmQmFzZSwgcHVibGljIEF1ZGlvU2Vzc2lvbkluZm9VcGRhdGVMaXN0ZW5lcgotewotcHVibGljOgotICAgIEF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgQXVkaW9NaXgqIHBvbGljeU1peCwKLSAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7Ci0KLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKLQotICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbVJlY29yZENsaWVudEluZm8uc2Vzc2lvbjsgfQotICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKCljb25zdCB7IHJldHVybiBtUmVjb3JkQ2xpZW50SW5mby5zb3VyY2U7IH0KLSAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBtQ29uZmlnLmZvcm1hdDsgfQotICAgIHVpbnQzMl90IHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtQ29uZmlnLnNhbXBsZV9yYXRlOyB9Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2soKSBjb25zdCB7IHJldHVybiBtQ29uZmlnLmNoYW5uZWxfbWFzazsgfQotICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KLSAgICB1aWRfdCB1aWQoKSBjb25zdCB7IHJldHVybiBtUmVjb3JkQ2xpZW50SW5mby51aWQ7IH0KLSAgICB2b2lkIHNldFVpZCh1aWRfdCB1aWQpIHsgbVJlY29yZENsaWVudEluZm8udWlkID0gdWlkOyB9Ci0gICAgYm9vbCBtYXRjaGVzKGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4gJm90aGVyKSBjb25zdDsKLSAgICBib29sIGlzU291bmRUcmlnZ2VyKCkgY29uc3QgeyByZXR1cm4gbUlzU291bmRUcmlnZ2VyOyB9Ci0gICAgdm9pZCBzZXRTaWxlbmNlZChib29sIHNpbGVuY2VkKSB7IG1TaWxlbmNlZCA9IHNpbGVuY2VkOyB9Ci0gICAgYm9vbCBpc1NpbGVuY2VkKCkgY29uc3QgeyByZXR1cm4gbVNpbGVuY2VkOyB9Ci0gICAgdWludDMyX3Qgb3BlbkNvdW50KCkgY29uc3QgeyByZXR1cm4gbU9wZW5Db3VudDsgfSA7Ci0gICAgdWludDMyX3QgYWN0aXZlQ291bnQoKSBjb25zdCB7IHJldHVybiBtQWN0aXZlQ291bnQ7IH0gOwotCi0gICAgdWludDMyX3QgY2hhbmdlT3BlbkNvdW50KGludCBkZWx0YSk7Ci0gICAgdWludDMyX3QgY2hhbmdlQWN0aXZlQ291bnQoaW50IGRlbHRhKTsKLQotICAgIHZvaWQgc2V0SW5mb1Byb3ZpZGVyKEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciAqcHJvdmlkZXIpOwotICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIEF1ZGlvU2Vzc2lvbkluZm9VcGRhdGVMaXN0ZW5lcgotICAgIHZpcnR1YWwgdm9pZCBvblNlc3Npb25JbmZvVXBkYXRlKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgcmVjb3JkX2NsaWVudF9pbmZvX3QgbVJlY29yZENsaWVudEluZm87Ci0gICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIG1Db25maWc7Ci0gICAgY29uc3QgYXVkaW9faW5wdXRfZmxhZ3NfdCBtRmxhZ3M7Ci0gICAgYm9vbCAgbUlzU291bmRUcmlnZ2VyOwotICAgIGJvb2wgbVNpbGVuY2VkOwotICAgIHVpbnQzMl90ICBtT3BlbkNvdW50OwotICAgIHVpbnQzMl90ICBtQWN0aXZlQ291bnQ7Ci0gICAgQXVkaW9NaXgqIG1Qb2xpY3lNaXg7IC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5Ci0gICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UqIG1DbGllbnRJbnRlcmZhY2U7Ci0gICAgY29uc3QgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyKiBtSW5mb1Byb3ZpZGVyOwotfTsKLQotY2xhc3MgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiA6Ci0gICAgcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19zZXNzaW9uX3QsIHNwPEF1ZGlvU2Vzc2lvbj4gPiwKLSAgICBwdWJsaWMgQXVkaW9TZXNzaW9uSW5mb1VwZGF0ZUxpc3RlbmVyCi17Ci1wdWJsaWM6Ci0gICAgc3RhdHVzX3QgYWRkU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiYgYXVkaW9TZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIgKnByb3ZpZGVyKTsKLQotICAgIHN0YXR1c190IHJlbW92ZVNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotCi0gICAgdWludDMyX3QgZ2V0T3BlbkNvdW50KCkgY29uc3Q7Ci0KLSAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGdldEFjdGl2ZVNlc3Npb25zKCkgY29uc3Q7Ci0gICAgc2l6ZV90IGdldEFjdGl2ZVNlc3Npb25Db3VudCgpIGNvbnN0OwotICAgIGJvb2wgaGFzQWN0aXZlU2Vzc2lvbigpIGNvbnN0OwotICAgIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdDsKLSAgICBhdWRpb19zb3VyY2VfdCBnZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdDsKLQotICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIEF1ZGlvU2Vzc2lvbkluZm9VcGRhdGVMaXN0ZW5lcgotICAgIHZpcnR1YWwgdm9pZCBvblNlc3Npb25JbmZvVXBkYXRlKCkgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMDM3ZmMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBpbnB1dCBkZXNjcmlwdG9ycyB0byBpbXBsZW1lbnQgc28gZGVwZW5kZW50IGF1ZGlvIHNlc3Npb25zIGNhbiBxdWVyeSBpbmZvcm1hdGlvbgotICogYWJvdXQgdGhlaXIgY29udGV4dAotICovCi1jbGFzcyBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5BdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIoKSB7fTsKLQotICAgIHZpcnR1YWwgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRDb25maWcoKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3QgPSAwOwotCi19OwotCi1jbGFzcyBBdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5BdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIoKSB7fTsKLQotICAgIHZpcnR1YWwgdm9pZCBvblNlc3Npb25JbmZvVXBkYXRlKCkgY29uc3QgPSAwOzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1NvdXJjZURlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1NvdXJjZURlc2NyaXB0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ5MGY0Mi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KLSNpbmNsdWRlIDxBdWRpb1BhdGNoLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3dBdWRpb091dHB1dERlc2NyaXB0b3I7Ci1jbGFzcyBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjsKLWNsYXNzIERldmljZURlc2NyaXB0b3I7Ci0KLWNsYXNzIEF1ZGlvU291cmNlRGVzY3JpcHRvcjogcHVibGljIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICBBdWRpb1NvdXJjZURlc2NyaXB0b3IoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlLCBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkgOgotICAgICAgICBtRGV2aWNlKGRldmljZSksIG1BdHRyaWJ1dGVzKCphdHRyaWJ1dGVzKSwgbVVpZCh1aWQpIHt9Ci0gICAgdmlydHVhbCB+QXVkaW9Tb3VyY2VEZXNjcmlwdG9yKCkge30KLQotICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1QYXRjaERlc2MtPm1IYW5kbGU7IH0KLQotICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKLQotICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IG1EZXZpY2U7Ci0gICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IG1BdHRyaWJ1dGVzOwotICAgIHVpZF90IG1VaWQ7Ci0gICAgc3A8QXVkaW9QYXRjaD4gbVBhdGNoRGVzYzsKLSAgICB3cDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbVN3T3V0cHV0OwotICAgIHdwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtSHdPdXRwdXQ7Ci19OwotCi1jbGFzcyBBdWRpb1NvdXJjZUNvbGxlY3Rpb24gOgotICAgICAgICBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19wYXRjaF9oYW5kbGVfdCwgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiA+Ci17Ci1wdWJsaWM6Ci0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NsaWVudERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9DbGllbnREZXNjcmlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJiMjI1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9DbGllbnREZXNjcmlwdG9yLmgKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KKyNpbmNsdWRlIDxWb2x1bWUuaD4KKyNpbmNsdWRlICJBdWRpb1BhdGNoLmgiCisjaW5jbHVkZSAiRWZmZWN0RGVzY3JpcHRvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERldmljZURlc2NyaXB0b3I7CitjbGFzcyBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjsKK2NsYXNzIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOworCitjbGFzcyBDbGllbnREZXNjcmlwdG9yOiBwdWJsaWMgUmVmQmFzZQoreworcHVibGljOgorICAgIENsaWVudERlc2NyaXB0b3IoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIHVpZF90IHVpZCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLCBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcHJlZmVycmVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlID0gZmFsc2UpIDoKKyAgICAgICAgbVBvcnRJZChwb3J0SWQpLCBtVWlkKHVpZCksIG1TZXNzaW9uSWQoc2Vzc2lvbklkKSwgbUF0dHJpYnV0ZXMoYXR0cmlidXRlcyksCisgICAgICAgIG1Db25maWcoY29uZmlnKSwgbVByZWZlcnJlZERldmljZUlkKHByZWZlcnJlZERldmljZUlkKSwgbUFjdGl2ZShmYWxzZSksCisgICAgICAgIG1QcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UoaXNQcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2Upe30KKyAgICB+Q2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHRvU2hvcnRTdHJpbmcoKSBjb25zdDsKKworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKCkgY29uc3QgeyByZXR1cm4gbVBvcnRJZDsgfQorICAgIHVpZF90IHVpZCgpIGNvbnN0IHsgcmV0dXJuIG1VaWQ7IH0KKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1TZXNzaW9uSWQ7IH07CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBtQXR0cmlidXRlczsgfQorICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnKCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZzsgfQorICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcHJlZmVycmVkRGV2aWNlSWQoKSBjb25zdCB7IHJldHVybiBtUHJlZmVycmVkRGV2aWNlSWQ7IH07CisgICAgdm9pZCBzZXRQcmVmZXJyZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90IHByZWZlcnJlZERldmljZUlkKSB7CisgICAgICAgIG1QcmVmZXJyZWREZXZpY2VJZCA9IHByZWZlcnJlZERldmljZUlkOworICAgIH0KKyAgICBib29sIGlzUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlKCkgY29uc3QgeyByZXR1cm4gbVByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZTsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRBY3RpdmUoYm9vbCBhY3RpdmUpIHsgbUFjdGl2ZSA9IGFjdGl2ZTsgfQorICAgIGJvb2wgYWN0aXZlKCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZTsgfQorICAgIGJvb2wgaGFzUHJlZmVycmVkRGV2aWNlKGJvb2wgYWN0aXZlT25seSA9IGZhbHNlKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUHJlZmVycmVkRGV2aWNlSWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSAmJiAoIWFjdGl2ZU9ubHkgfHwgbUFjdGl2ZSk7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgbVBvcnRJZDsgIC8vIHVuaXF1ZSBJZCBmb3IgdGhpcyBjbGllbnQKKyAgICBjb25zdCB1aWRfdCBtVWlkOyAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBVSUQKKyAgICBjb25zdCBhdWRpb19zZXNzaW9uX3QgbVNlc3Npb25JZDsgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiBJRAorICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBtQXR0cmlidXRlczsgLy8gdXNhZ2UuLi4KKyAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IG1Db25maWc7CisgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUHJlZmVycmVkRGV2aWNlSWQ7ICAvLyBzZWxlY3RlZCBpbnB1dCBkZXZpY2UgcG9ydCBJRAorICAgICAgICAgIGJvb2wgbUFjdGl2ZTsKKyAgICAgICAgICBib29sIG1QcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UgPSBmYWxzZTsKK307CisKK2NsYXNzIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjogcHVibGljIENsaWVudERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBUcmFja0NsaWVudERlc2NyaXB0b3IoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIHVpZF90IHVpZCwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHByZWZlcnJlZERldmljZUlkLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8d3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiBzZWNvbmRhcnlPdXRwdXRzKSA6CisgICAgICAgIENsaWVudERlc2NyaXB0b3IocG9ydElkLCB1aWQsIHNlc3Npb25JZCwgYXR0cmlidXRlcywgY29uZmlnLCBwcmVmZXJyZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZSksCisgICAgICAgIG1TdHJlYW0oc3RyZWFtKSwgbVN0cmF0ZWd5KHN0cmF0ZWd5KSwgbVZvbHVtZVNvdXJjZSh2b2x1bWVTb3VyY2UpLCBtRmxhZ3MoZmxhZ3MpLAorICAgICAgICBtU2Vjb25kYXJ5T3V0cHV0cyhzdGQ6Om1vdmUoc2Vjb25kYXJ5T3V0cHV0cykpIHt9CisgICAgflRyYWNrQ2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHVzaW5nIENsaWVudERlc2NyaXB0b3I6OmR1bXA7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdCBvdmVycmlkZTsKKyAgICBzdGQ6OnN0cmluZyB0b1Nob3J0U3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQorICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbVN0cmVhbTsgfQorICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJhdGVneTsgfQorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4mIGdldFNlY29uZGFyeU91dHB1dHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU2Vjb25kYXJ5T3V0cHV0czsKKyAgICB9OworICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UoKSBjb25zdCB7IHJldHVybiBtVm9sdW1lU291cmNlOyB9CisKKyAgICB2b2lkIHNldEFjdGl2ZShib29sIGFjdGl2ZSkgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIGludCBkZWx0YSA9IGFjdGl2ZSA/IDEgOiAtMTsKKyAgICAgICAgY2hhbmdlQWN0aXZpdHlDb3VudChkZWx0YSk7CisgICAgfQorICAgIHZvaWQgY2hhbmdlQWN0aXZpdHlDb3VudChpbnQgZGVsdGEpCisgICAgeworICAgICAgICBpZiAoZGVsdGEgPiAwKSB7CisgICAgICAgICAgICBtQWN0aXZpdHlDb3VudCArPSBkZWx0YTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIW1BY3Rpdml0eUNvdW50LCAiJXMoJXMpIGludmFsaWQgZGVsdGEgJWQsIGluYWN0aXZlIGNsaWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdG9TaG9ydFN0cmluZygpLmNfc3RyKCksIGRlbHRhKTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdGljX2Nhc3Q8aW50PihtQWN0aXZpdHlDb3VudCkgPCAtZGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglcykgaW52YWxpZCBkZWx0YSAlZCwgYWN0aXZlIGNsaWVudCBjb3VudCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdG9TaG9ydFN0cmluZygpLmNfc3RyKCksIGRlbHRhLCBtQWN0aXZpdHlDb3VudCk7CisgICAgICAgICAgICBtQWN0aXZpdHlDb3VudCArPSBkZWx0YTsKKyAgICAgICAgfQorICAgICAgICBDbGllbnREZXNjcmlwdG9yOjpzZXRBY3RpdmUobUFjdGl2aXR5Q291bnQgPiAwKTsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0QWN0aXZpdHlDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1BY3Rpdml0eUNvdW50OyB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOworICAgIGNvbnN0IHByb2R1Y3Rfc3RyYXRlZ3lfdCBtU3RyYXRlZ3k7CisgICAgY29uc3QgVm9sdW1lU291cmNlIG1Wb2x1bWVTb3VyY2U7CisgICAgY29uc3QgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gbVNlY29uZGFyeU91dHB1dHM7CisKKyAgICAvKioKKyAgICAgKiByZXF1aXJlZCBmb3IgZHVwbGljYXRpbmcgdGhyZWFkLCBwcmV2ZW50IGZyb20gcmVtb3ZpbmcgYWN0aXZlIGNsaWVudCBmcm9tIGFuIG91dHB1dAorICAgICAqIGludm9sdmVkIGluIGEgZHVwbGljYXRpb24uCisgICAgICovCisgICAgdWludDMyX3QgbUFjdGl2aXR5Q291bnQgPSAwOworfTsKKworY2xhc3MgUmVjb3JkQ2xpZW50RGVzY3JpcHRvcjogcHVibGljIENsaWVudERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBSZWNvcmRDbGllbnREZXNjcmlwdG9yKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCB1aWRfdCB1aWQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHByZWZlcnJlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLCBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLCBib29sIGlzU291bmRUcmlnZ2VyKSA6CisgICAgICAgIENsaWVudERlc2NyaXB0b3IocG9ydElkLCB1aWQsIHNlc3Npb25JZCwgYXR0cmlidXRlcywgY29uZmlnLCBwcmVmZXJyZWREZXZpY2VJZCksCisgICAgICAgIG1Tb3VyY2Uoc291cmNlKSwgbUZsYWdzKGZsYWdzKSwgbUlzU291bmRUcmlnZ2VyKGlzU291bmRUcmlnZ2VyKSwgbUFwcFN0YXRlKEFQUF9TVEFURV9JRExFKSB7fQorICAgIH5SZWNvcmRDbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdXNpbmcgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKCkgY29uc3QgeyByZXR1cm4gbVNvdXJjZTsgfQorICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KKyAgICBib29sIGlzU291bmRUcmlnZ2VyKCkgY29uc3QgeyByZXR1cm4gbUlzU291bmRUcmlnZ2VyOyB9CisgICAgdm9pZCBzZXRBcHBTdGF0ZShhcHBfc3RhdGVfdCBhcHBTdGF0ZSkgeyBtQXBwU3RhdGUgPSBhcHBTdGF0ZTsgfQorICAgIGFwcF9zdGF0ZV90IGFwcFN0YXRlKCkgeyByZXR1cm4gbUFwcFN0YXRlOyB9CisgICAgYm9vbCBpc1NpbGVuY2VkKCkgY29uc3QgeyByZXR1cm4gbUFwcFN0YXRlID09IEFQUF9TVEFURV9JRExFOyB9CisgICAgdm9pZCB0cmFja0VmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdCwgYm9vbCBlbmFibGVkKTsKKyAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBnZXRFbmFibGVkRWZmZWN0cygpIGNvbnN0IHsgcmV0dXJuIG1FbmFibGVkRWZmZWN0czsgfQorCitwcml2YXRlOgorICAgIGNvbnN0IGF1ZGlvX3NvdXJjZV90IG1Tb3VyY2U7CisgICAgY29uc3QgYXVkaW9faW5wdXRfZmxhZ3NfdCBtRmxhZ3M7CisgICAgY29uc3QgYm9vbCBtSXNTb3VuZFRyaWdnZXI7CisgICAgICAgICAgYXBwX3N0YXRlX3QgbUFwcFN0YXRlOworICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIG1FbmFibGVkRWZmZWN0czsKK307CisKK2NsYXNzIFNvdXJjZUNsaWVudERlc2NyaXB0b3I6IHB1YmxpYyBUcmFja0NsaWVudERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICBTb3VyY2VDbGllbnREZXNjcmlwdG9yKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCB1aWRfdCB1aWQsIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4mIHBhdGNoRGVzYywgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIHNyY0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlKTsKKyAgICB+U291cmNlQ2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYygpIGNvbnN0IHsgcmV0dXJuIG1QYXRjaERlc2M7IH0KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtU3JjRGV2aWNlOyB9OworICAgIHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzd091dHB1dCgpIGNvbnN0IHsgcmV0dXJuIG1Td091dHB1dDsgfQorICAgIHZvaWQgc2V0U3dPdXRwdXQoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBzd091dHB1dCk7CisgICAgd3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IGh3T3V0cHV0KCkgY29uc3QgeyByZXR1cm4gbUh3T3V0cHV0OyB9CisgICAgdm9pZCBzZXRId091dHB1dChjb25zdCBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGh3T3V0cHV0KTsKKworICAgIHVzaW5nIENsaWVudERlc2NyaXB0b3I6OmR1bXA7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdCBvdmVycmlkZTsKKworIHByaXZhdGU6CisgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4gbVBhdGNoRGVzYzsKKyAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtU3JjRGV2aWNlOworICAgIHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtU3dPdXRwdXQ7CisgICAgd3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IG1Id091dHB1dDsKK307CisKK2NsYXNzIFNvdXJjZUNsaWVudENvbGxlY3Rpb24gOgorICAgIHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX3BvcnRfaGFuZGxlX3QsIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+ID4KK3sKK3B1YmxpYzoKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKK307CisKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4gPiBUcmFja0NsaWVudFZlY3RvcjsKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+ID4gUmVjb3JkQ2xpZW50VmVjdG9yOworCisvLyBBIE1hcCB0aGF0IGFzc29jaWF0ZXMgYSBwb3J0SWQgd2l0aCBhIGNsaWVudCAodHlwZSBUKQorLy8gd2hpY2ggaXMgZWl0aGVyIFRyYWNrQ2xpZW50RGVzY3JpcHRvciBvciBSZWNvcmRDbGllbnREZXNjcmlwdG9yLgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQ2xpZW50TWFwSGFuZGxlciB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+Q2xpZW50TWFwSGFuZGxlcigpID0gZGVmYXVsdDsKKworICAgIC8vIFRyYWNrIGNsaWVudCBtYW5hZ2VtZW50CisgICAgdmlydHVhbCB2b2lkIGFkZENsaWVudChjb25zdCBzcDxUPiAmY2xpZW50KSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gY2xpZW50LT5wb3J0SWQoKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighbUNsaWVudHMuZW1wbGFjZShwb3J0SWQsIGNsaWVudCkuc2Vjb25kLAorICAgICAgICAgICAgICAgICIlcyglZCk6IGF0dGVtcHRpbmcgdG8gYWRkIGNsaWVudCB0aGF0IGFscmVhZHkgZXhpc3RzIiwgX19mdW5jX18sIHBvcnRJZCk7CisgICAgfQorICAgIHNwPFQ+IGdldENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgY29uc3QgeworICAgICAgICBhdXRvIGl0ID0gbUNsaWVudHMuZmluZChwb3J0SWQpOworICAgICAgICBpZiAoaXQgPT0gbUNsaWVudHMuZW5kKCkpIHJldHVybiBudWxscHRyOworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIHJlbW92ZUNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgeworICAgICAgICBhdXRvIGl0ID0gbUNsaWVudHMuZmluZChwb3J0SWQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGl0ID09IG1DbGllbnRzLmVuZCgpLAorICAgICAgICAgICAgICAgICIlcyglZCk6IGNsaWVudCBkb2VzIG5vdCBleGlzdCIsIF9fZnVuY19fLCBwb3J0SWQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGl0LT5zZWNvbmQtPmFjdGl2ZSgpLAorICAgICAgICAgICAgICAgICIlcyglZCk6IHJlbW92aW5nIGNsaWVudCBzdGlsbCBhY3RpdmUhIiwgX19mdW5jX18sIHBvcnRJZCk7CisgICAgICAgICh2b2lkKW1DbGllbnRzLmVyYXNlKGl0KTsKKyAgICB9CisgICAgc2l6ZV90IGdldENsaWVudENvdW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudHMuc2l6ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IHsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQ6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGNsaWVudC0+ZHVtcChkc3QsIDIsIGluZGV4KyspOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaGVscGVyIHR5cGVzCisgICAgdXNpbmcgQ2xpZW50TWFwID0gc3RkOjptYXA8YXVkaW9fcG9ydF9oYW5kbGVfdCwgc3A8VD4+OworICAgIHVzaW5nIENsaWVudE1hcEl0ZXJhdG9yID0gdHlwZW5hbWUgQ2xpZW50TWFwOjpjb25zdF9pdGVyYXRvcjsgIC8vIENsaWVudE1hcCBpcyBjb25zdCBxdWFsaWZpZWQKKyAgICBjbGFzcyBDbGllbnRJdGVyYWJsZSB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBDbGllbnRJdGVyYWJsZShjb25zdCBDbGllbnRNYXBIYW5kbGVyPFQ+ICZyZWYpIDogbUNsaWVudE1hcEhhbmRsZXIocmVmKSB7IH0KKworICAgICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIC8vIHRyYWl0cworICAgICAgICAgICAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnOworICAgICAgICAgICAgdXNpbmcgdmFsdWVfdHlwZSA9IHNwPFQ+OworICAgICAgICAgICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gcHRyZGlmZl90OworICAgICAgICAgICAgdXNpbmcgcG9pbnRlciA9IGNvbnN0IHNwPFQ+KjsgICAgLy8gTm90ZTogY29uc3QKKyAgICAgICAgICAgIHVzaW5nIHJlZmVyZW5jZSA9IGNvbnN0IHNwPFQ+JjsgIC8vIE5vdGU6IGNvbnN0CisKKyAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICBleHBsaWNpdCBpdGVyYXRvcihjb25zdCBDbGllbnRNYXBJdGVyYXRvciAmaXQpIDogbUl0KGl0KSB7IH0KKyAgICAgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgICAgLyogcHJlZml4ICovICAgICB7ICsrbUl0OyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgICAgIHJlZmVyZW5jZSBvcGVyYXRvciogKCkgY29uc3QgICAgICAgICAgICAgICB7IHJldHVybiBtSXQtPnNlY29uZDsgfQorICAgICAgICAgICAgcmVmZXJlbmNlIG9wZXJhdG9yLT4oKSBjb25zdCAgICAgICAgICAgICAgIHsgcmV0dXJuIG1JdC0+c2Vjb25kOyB9IC8vIGFzIGlmIHNwPD4KKyAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBvcGVyYXRvci0oY29uc3QgaXRlcmF0b3ImIHJocykge3JldHVybiBtSXQgLSByaHMubUl0OyB9CisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIHJocykgY29uc3QgeyByZXR1cm4gbUl0ID09IHJocy5tSXQ7IH0KKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgcmhzKSBjb25zdCB7IHJldHVybiBtSXQgIT0gcmhzLm1JdDsgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgQ2xpZW50TWFwSXRlcmF0b3IgbUl0OworICAgICAgICB9OworCisgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3J7bUNsaWVudE1hcEhhbmRsZXIubUNsaWVudHMuYmVnaW4oKX07IH0KKyAgICAgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3J7bUNsaWVudE1hcEhhbmRsZXIubUNsaWVudHMuZW5kKCl9OyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBDbGllbnRNYXBIYW5kbGVyPFQ+JiBtQ2xpZW50TWFwSGFuZGxlcjsgLy8gaXRlcmF0aW5nIGRvZXMgbm90IG1vZGlmeSBtYXAuCisgICAgfTsKKworICAgIC8vIHJldHVybiBhbiBpdGVyYWJsZSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHJhbmdlLWJhc2VkLWZvciB0byBlbnVtZXJhdGUgY2xpZW50cy4KKyAgICAvLyB0aGlzIGl0ZXJhYmxlIGRvZXMgbm90IGFsbG93IG1vZGlmaWNhdGlvbiwgaXQgc2hvdWxkIGJlIHVzZWQgYXMgYSB0ZW1wb3JhcnkuCisgICAgQ2xpZW50SXRlcmFibGUgZ2V0Q2xpZW50SXRlcmFibGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDbGllbnRJdGVyYWJsZXsqdGhpc307CisgICAgfQorCitwcml2YXRlOgorICAgIC8vIENsaWVudE1hcCBtYXBzIGEgcG9ydElkIHRvIGEgY2xpZW50IGRlc2NyaXB0b3IgKGJvdGggdW5pcXVlbHkgaWRlbnRpZnkgZWFjaCBvdGhlcikuCisgICAgQ2xpZW50TWFwIG1DbGllbnRzOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NvbmZpZ1BhcnNpbmdVdGlscy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NvbmZpZ1BhcnNpbmdVdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA3ODU0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Db25maWdQYXJzaW5nVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkF1ZGlvUG9saWN5Q29uZmlnLmgiCi0jaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgotI2luY2x1ZGUgIkh3TW9kdWxlLmgiCi0jaW5jbHVkZSAiYXVkaW9fcG9saWN5X2NvbmYuaCIKLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZWZpbml0aW9ucyBmb3IgYXVkaW9fcG9saWN5LmNvbmYgZmlsZSBwYXJzaW5nCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIENvbmZpZ1BhcnNpbmdVdGlscwotewotcHVibGljOgotICAgIHN0YXRpYyBzdGF0dXNfdCBsb2FkQ29uZmlnKGNvbnN0IGNoYXIgKnBhdGgsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyB2b2lkIGxvYWRBdWRpb1BvcnRHYWluKGNub2RlICpyb290LCBBdWRpb1BvcnQgJmF1ZGlvUG9ydCwgaW50IGluZGV4KTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkQXVkaW9Qb3J0R2FpbnMoY25vZGUgKnJvb3QsIEF1ZGlvUG9ydCAmYXVkaW9Qb3J0KTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkRGV2aWNlRGVzY3JpcHRvckdhaW5zKGNub2RlICpyb290LCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlRGVzYyk7Ci0gICAgc3RhdGljIHN0YXR1c190IGxvYWRId01vZHVsZURldmljZShjbm9kZSAqcm9vdCwgRGV2aWNlVmVjdG9yICZkZXZpY2VzKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgbG9hZEh3TW9kdWxlUHJvZmlsZShjbm9kZSAqcm9vdCwgc3A8SHdNb2R1bGU+ICZtb2R1bGUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpOwotICAgIHN0YXRpYyB2b2lkIGxvYWREZXZpY2VzRnJvbVRhZyhjb25zdCBjaGFyICp0YWcsIERldmljZVZlY3RvciAmZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRlY2xhcmVkRGV2aWNlcyk7Ci0gICAgc3RhdGljIHZvaWQgbG9hZEh3TW9kdWxlcyhjbm9kZSAqcm9vdCwgSHdNb2R1bGVDb2xsZWN0aW9uICZod01vZHVsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SHdNb2R1bGU+ICZwcmltYXJ5TW9kdWxlKTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkTW9kdWxlR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBjb25zdCBzcDxId01vZHVsZT4gJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBsb2FkSHdNb2R1bGUoY25vZGUgKnJvb3QsIHNwPEh3TW9kdWxlPiAmbW9kdWxlLCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oCmluZGV4IDkyYTRjM2UuLmNjNDNmZTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaApAQCAtMzEsMTUgKzMxLDMxIEBACiBwdWJsaWM6CiAgICAgIC8vIE5vdGUgdGhhdCBlbXB0eSBuYW1lIHJlZmVycyBieSBjb252ZW50aW9uIHRvIGEgZ2VuZXJpYyBkZXZpY2UuCiAgICAgZXhwbGljaXQgRGV2aWNlRGVzY3JpcHRvcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCAmdGFnTmFtZSA9IFN0cmluZzgoIiIpKTsKKyAgICBEZXZpY2VEZXNjcmlwdG9yKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBGb3JtYXRWZWN0b3IgJmVuY29kZWRGb3JtYXRzLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmdGFnTmFtZSA9IFN0cmluZzgoIiIpKTsKIAogICAgIHZpcnR1YWwgfkRldmljZURlc2NyaXB0b3IoKSB7fQogCiAgICAgdmlydHVhbCBjb25zdCBTdHJpbmc4IGdldFRhZ05hbWUoKSBjb25zdCB7IHJldHVybiBtVGFnTmFtZTsgfQogCiAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZTsgfQorICAgIFN0cmluZzggYWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIG1BZGRyZXNzOyB9CisgICAgdm9pZCBzZXRBZGRyZXNzKGNvbnN0IFN0cmluZzggJmFkZHJlc3MpIHsgbUFkZHJlc3MgPSBhZGRyZXNzOyB9CisKKyAgICBjb25zdCBGb3JtYXRWZWN0b3ImIGVuY29kZWRGb3JtYXRzKCkgY29uc3QgeyByZXR1cm4gbUVuY29kZWRGb3JtYXRzOyB9CisKKyAgICBhdWRpb19mb3JtYXRfdCBnZXRFbmNvZGVkRm9ybWF0KCkgeyByZXR1cm4gbUN1cnJlbnRFbmNvZGVkRm9ybWF0OyB9CisKKyAgICB2b2lkIHNldEVuY29kZWRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgICAgIG1DdXJyZW50RW5jb2RlZEZvcm1hdCA9IGZvcm1hdDsKKyAgICB9CiAKICAgICBib29sIGVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgb3RoZXIpIGNvbnN0OwogCisgICAgYm9vbCBoYXNDdXJyZW50RW5jb2RlZEZvcm1hdCgpIGNvbnN0OworCisgICAgYm9vbCBzdXBwb3J0c0Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpOworCiAgICAgLy8gQXVkaW9Qb3J0Q29uZmlnCiAgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0IHsgcmV0dXJuIChBdWRpb1BvcnQqKSB0aGlzOyB9CiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLApAQCAtNDcsNDQgKzYzLDE0MSBAQAogCiAgICAgLy8gQXVkaW9Qb3J0CiAgICAgdmlydHVhbCB2b2lkIGF0dGFjaChjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSk7CisgICAgdmlydHVhbCB2b2lkIGRldGFjaCgpOworCiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgaW1wb3J0QXVkaW9Qb3J0KGNvbnN0IHNwPEF1ZGlvUG9ydD4mIHBvcnQsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CiAKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldElkKCkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCwgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4LCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKICAgICB2b2lkIGxvZygpIGNvbnN0OwotCi0gICAgU3RyaW5nOCBtQWRkcmVzczsKKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0OwogCiBwcml2YXRlOgorICAgIFN0cmluZzggbUFkZHJlc3N7IiJ9OwogICAgIFN0cmluZzggbVRhZ05hbWU7IC8vIFVuaXF1ZSBodW1hbiByZWFkYWJsZSBpZGVudGlmaWVyIGZvciBhIGRldmljZSBwb3J0IGZvdW5kIGluIGNvbmYgZmlsZS4KICAgICBhdWRpb19kZXZpY2VzX3QgICAgIG1EZXZpY2VUeXBlOwotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUlkOwotCi1mcmllbmQgY2xhc3MgRGV2aWNlVmVjdG9yOworICAgIEZvcm1hdFZlY3RvciAgICAgICAgbUVuY29kZWRGb3JtYXRzOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBhdWRpb19mb3JtYXRfdCAgICAgIG1DdXJyZW50RW5jb2RlZEZvcm1hdDsKIH07CiAKIGNsYXNzIERldmljZVZlY3RvciA6IHB1YmxpYyBTb3J0ZWRWZWN0b3I8c3A8RGV2aWNlRGVzY3JpcHRvcj4gPgogewogcHVibGljOgogICAgIERldmljZVZlY3RvcigpIDogU29ydGVkVmVjdG9yKCksIG1EZXZpY2VUeXBlcyhBVURJT19ERVZJQ0VfTk9ORSkge30KKyAgICBleHBsaWNpdCBEZXZpY2VWZWN0b3IoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIDogRGV2aWNlVmVjdG9yKCkKKyAgICB7CisgICAgICAgIGFkZChpdGVtKTsKKyAgICB9CiAKICAgICBzc2l6ZV90IGFkZChjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSk7CiAgICAgdm9pZCBhZGQoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKTsKICAgICBzc2l6ZV90IHJlbW92ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSk7CisgICAgdm9pZCByZW1vdmUoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKTsKICAgICBzc2l6ZV90IGluZGV4T2YoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0OwogCiAgICAgYXVkaW9fZGV2aWNlc190IHR5cGVzKCkgY29uc3QgeyByZXR1cm4gbURldmljZVR5cGVzOyB9CiAKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpIGNvbnN0OwotICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGVzKSBjb25zdDsKKyAgICAvLyBJZiAnYWRkcmVzcycgaXMgZW1wdHkgYW5kICdjb2RlYycgaXMgQVVESU9fRk9STUFUX0RFRkFVTFQsIGEgZGV2aWNlIHdpdGggYSBub24tZW1wdHkKKyAgICAvLyBhZGRyZXNzIG1heSBiZSByZXR1cm5lZCBpZiB0aGVyZSBpcyBubyBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkICd0eXBlJyBhbmQgZW1wdHkgYWRkcmVzcy4KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzggJmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGNvZGVjKSBjb25zdDsKKyAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhhdWRpb19kZXZpY2VzX3QgdHlwZXMpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldERldmljZUZyb21JZAorICAgICAqIEBwYXJhbSBpZCBvZiB0aGUgRGV2aWNlRGVzY3JpcHRvciB0byBzZWFjaCAoYWthIFBvcnQgaGFuZGxlKS4KKyAgICAgKiBAcmV0dXJuIERldmljZURlc2NyaXB0b3IgYXNzb2NpYXRlZCB0byBwb3J0IGlkIGlmIGZvdW5kLCBudWxscHRyIG90aGVyd2lzZS4gSWYgdGhlIGlkIGlzCisgICAgICogZXF1YWwgdG8gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwgaXQgYWxzbyByZXR1cm5zIGEgbnVsbHB0ci4KKyAgICAgKi8KICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlRnJvbVRhZ05hbWUoY29uc3QgU3RyaW5nOCAmdGFnTmFtZSkgY29uc3Q7Ci0gICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGcm9tVHlwZUFkZHIoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpIGNvbnN0OworICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0OworICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VUeXBlc0Zyb21Id01vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlKSBjb25zdDsKIAotICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0OworICAgIGJvb2wgY29udGFpbnMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0IHsgcmV0dXJuIGluZGV4T2YoaXRlbSkgPj0gMDsgfQogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcyA9IDAsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OworICAgIC8qKgorICAgICAqIEBicmllZiBjb250YWluc0F0TGVhc3RPbmUKKyAgICAgKiBAcGFyYW0gZGV2aWNlcyB2ZWN0b3Igb2YgZGV2aWNlcyB0byBjaGVjayBhZ2FpbnN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgRGV2aWNlVmVjdG9yIGNvbnRhaW5zIGF0IGxpc3Qgb25lIG9mIHRoZSBkZXZpY2VzIGZyb20gdGhlIGdpdmVuIHZlY3Rvci4KKyAgICAgKi8KKyAgICBib29sIGNvbnRhaW5zQXRMZWFzdE9uZShjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGNvbnRhaW5zQWxsRGV2aWNlcworICAgICAqIEBwYXJhbSBkZXZpY2VzIHZlY3RvciBvZiBkZXZpY2VzIHRvIGNoZWNrIGFnYWluc3QuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBEZXZpY2VWZWN0b3IgY29udGFpbnMgYWxsIHRoZSBkZXZpY2VzIGZyb20gdGhlIGdpdmVuIHZlY3RvcgorICAgICAqLworICAgIGJvb2wgY29udGFpbnNBbGxEZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZmlsdGVyIHRoZSBkZXZpY2VzIHN1cHBvcnRlZCBieSB0aGlzIGNvbGxlY3Rpb24gYWdhaW5zdCBhbm90aGVyIGNvbGxlY3Rpb24KKyAgICAgKiBAcGFyYW0gZGV2aWNlcyB0byBmaWx0ZXIgYWdhaW5zdAorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBEZXZpY2VWZWN0b3IgZmlsdGVyKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgbWVyZ2UgdHdvIHZlY3RvcnMuIEFzIFNvcnRlZFZlY3RvciBJbXBsZW1lbnRhdGlvbiBpcyBidWdneSAoaXQgZG9lcyBub3QgY2hlY2sgdGhlIHNpemUKKyAgICAgKiBvZiB0aGUgZGVzdGluYXRpb24gdmVjdG9yLCBvbmx5IG9mIHRoZSBzb3VyY2UsIGl0IHByb3ZpZGVzIGEgc2FmZSBpbXBsZW1lbnRhdGlvbgorICAgICAqIEBwYXJhbSBkZXZpY2VzIHNvdXJjZSBkZXZpY2UgdmVjdG9yIHRvIG1lcmdlIHdpdGgKKyAgICAgKiBAcmV0dXJuIHNpemUgb2YgdGhlIG1lcmdlZCB2ZWN0b3IuCisgICAgICovCisgICAgc3NpemVfdCBtZXJnZShjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpCisgICAgeworICAgICAgICBpZiAoaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBhZGQoZGV2aWNlcyk7CisgICAgICAgICAgICByZXR1cm4gc2l6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTb3J0ZWRWZWN0b3I6Om1lcmdlKGRldmljZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBicmllZiBvcGVyYXRvciA9PSBEZXZpY2VWZWN0b3IgYXJlIGVxdWFscyBpZiBhbGwgdGhlIERldmljZURlc2NyaXB0b3IgY2FuIGJlIGZvdW5kIChha2EKKyAgICAgKiBEZXZpY2VEZXNjcmlwdG9yIHdpdGggc2FtZSB0eXBlIGFuZCBhZGRyZXNzKSBhbmQgdGhlIHZlY3RvciBoYXMgc2FtZSBzaXplLgorICAgICAqIEBwYXJhbSByaWdodCBEZXZpY2VWZWN0b3IgdG8gY29tcGFyZSB0by4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcmlnaHQgY29udGFpbnMgdGhlIHNhbWUgZGV2aWNlIGFuZCBoYXMgdGhlIHNhbWUgc2l6ZS4KKyAgICAgKi8KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgRGV2aWNlVmVjdG9yICZyaWdodCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChzaXplKCkgIT0gcmlnaHQuc2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZkZXZpY2UgOiAqdGhpcykgeworICAgICAgICAgICAgaWYgKHJpZ2h0LmluZGV4T2YoZGV2aWNlKSA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IERldmljZVZlY3RvciAmcmlnaHQpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0ocmlnaHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRGaXJzdFZhbGlkQWRkcmVzcworICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IHZhbGlkIGFkZHJlc3Mgb2YgYSBsaXN0IG9mIGRldmljZSwgIiIgaWYgbm8gZGV2aWNlIHdpdGggdmFsaWQgYWRkcmVzcworICAgICAqIGZvdW5kLgorICAgICAqIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGhlbHBzIG1haW50YWluaW5nIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgd2hlcmUgd2UgdXNlZCB0byBoYXZlIGEKKyAgICAgKiBkZXZpY2VzIG1hc2sgYW5kIGFuIGFkZHJlc3MuCisgICAgICovCisgICAgU3RyaW5nOCBnZXRGaXJzdFZhbGlkQWRkcmVzcygpIGNvbnN0CisgICAgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6ICp0aGlzKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlLT5hZGRyZXNzKCkgIT0gIiIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlLT5hZGRyZXNzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0cmluZzgoIiIpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBjb25zdCBTdHJpbmc4ICZ0YWcsIGludCBzcGFjZXMgPSAwLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICB2b2lkIHJlZnJlc2hUeXBlcygpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9FZmZlY3REZXNjcmlwdG9yLmgKaW5kZXggMDQ4MzFjNi4uN2YwMWRjNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oCkBAIC0xNiwyNSArMTYsMzggQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLQogY2xhc3MgRWZmZWN0RGVzY3JpcHRvciA6IHB1YmxpYyBSZWZCYXNlCiB7CiBwdWJsaWM6Ci0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworICAgIEVmZmVjdERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgYm9vbCBpc011c2ljRWZmZWN0LAorICAgICAgICAgICAgICAgICAgICAgaW50IGlkLCBpbnQgaW8sIGludCBzZXNzaW9uKSA6CisgICAgICAgIG1JZChpZCksIG1JbyhpbyksIG1TZXNzaW9uKHNlc3Npb24pLCBtRW5hYmxlZChmYWxzZSksCisgICAgICAgIG1Jc011c2ljRWZmZWN0KGlzTXVzaWNFZmZlY3QpCisgICAgeworICAgICAgICBtZW1jcHkgKCZtRGVzYywgZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICB9CiAKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCkgY29uc3Q7CisKKyAgICBpbnQgbUlkOyAgICAgICAgICAgICAgICAvLyBlZmZlY3QgdW5pcXVlIElECiAgICAgaW50IG1JbzsgICAgICAgICAgICAgICAgLy8gaW8gdGhlIGVmZmVjdCBpcyBhdHRhY2hlZCB0bwotICAgIHJvdXRpbmdfc3RyYXRlZ3kgbVN0cmF0ZWd5OyAvLyByb3V0aW5nIHN0cmF0ZWd5IHRoZSBlZmZlY3QgaXMgYXNzb2NpYXRlZCB0bwogICAgIGludCBtU2Vzc2lvbjsgICAgICAgICAgICAgICAvLyBhdWRpbyBzZXNzaW9uIHRoZSBlZmZlY3QgaXMgb24KICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IG1EZXNjOyAgLy8gZWZmZWN0IGRlc2NyaXB0b3IKICAgICBib29sIG1FbmFibGVkOyAgICAgICAgICAgICAgLy8gZW5hYmxlZCBzdGF0ZTogQ1BVIGxvYWQgYmVpbmcgdXNlZCBvciBub3QKKworICAgIGJvb2wgaXNNdXNpY0VmZmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1Jc011c2ljRWZmZWN0OyB9CisKK3ByaXZhdGU6CisgICAgYm9vbCBtSXNNdXNpY0VmZmVjdDsKIH07CiAKIGNsYXNzIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIDogcHVibGljIEtleWVkVmVjdG9yPGludCwgc3A8RWZmZWN0RGVzY3JpcHRvcj4gPgpAQCAtNDMsMTQgKzU2LDE2IEBACiAgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24oKTsKIAogICAgIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LCBpbnQgc2Vzc2lvbiwgaW50IGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwgaW50IGlkLCBib29sIGlzTXVzaWNFZmZlY3QpOwogICAgIHN0YXR1c190IHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKTsKKyAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBnZXRFZmZlY3QoaW50IGlkKSBjb25zdDsKICAgICBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKTsKKyAgICBib29sICAgICBpc0VmZmVjdEVuYWJsZWQoaW50IGlkKSBjb25zdDsKICAgICB1aW50MzJfdCBnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpIGNvbnN0OwogICAgIHVpbnQzMl90IGdldE1heEVmZmVjdHNNZW1vcnkoKSBjb25zdDsKLSAgICBib29sIGlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCk7CisgICAgYm9vbCBpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3REZXNjLCBib29sIGVuYWJsZWQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0dhaW5zLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvR2FpbnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IyMjlhNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvR2FpbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPFN0cmVhbURlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdHJlYW1EZXNjcmlwdG9yOwotCi1jbGFzcyBHYWlucwotewotcHVibGljIDoKLSAgICBzdGF0aWMgZmxvYXQgdm9sSW5kZXhUb0RiKGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnBvaW50LCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleEluVWkpOwotCi0gICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmUKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICAvLyBkZWZhdWx0IHZvbHVtZSBjdXJ2ZSBmb3IgbWVkaWEgc3RyYXRlZ3kKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3Igbm9uLW1lZGlhIGF1ZGlvIG9uIGV4dCBtZWRpYSBvdXRwdXRzIChIRE1JLCBMaW5lLCBldGMpCi0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3IgbWVkaWEgc3RyYXRlZ3kgb24gc3BlYWtlcnMKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF07Ci0gICAgLy8gdm9sdW1lIGN1cnZlIGZvciBzb25pZmljYXRpb24gc3RyYXRlZ3kgb24gc3BlYWtlcnMKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0xpbmVhclZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU2lsZW50Vm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNGdWxsU2NhbGVWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmVzIHBlciBzdHJlYW0gYW5kIGRldmljZSBjYXRlZ29yeS4gU2VlIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoKQotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpzVm9sdW1lUHJvZmlsZXNbQVVESU9fU1RSRUFNX0NOVF1bREVWSUNFX0NBVEVHT1JZX0NOVF07Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSHdNb2R1bGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCmluZGV4IGNiOWY0OWUuLmViMzRkYTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCkBAIC00Niw2ICs0NiwyMiBAQAogCiAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZnZXREZWNsYXJlZERldmljZXMoKSBjb25zdCB7IHJldHVybiBtRGVjbGFyZWREZXZpY2VzOyB9CiAgICAgdm9pZCBzZXREZWNsYXJlZERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKTsKKyAgICBEZXZpY2VWZWN0b3IgZ2V0QWxsRGV2aWNlcygpIGNvbnN0CisgICAgeworICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG1EZWNsYXJlZERldmljZXM7CisgICAgICAgIGRldmljZXMubWVyZ2UobUR5bmFtaWNEZXZpY2VzKTsKKyAgICAgICAgcmV0dXJuIGRldmljZXM7CisgICAgfQorICAgIHZvaWQgYWRkRHluYW1pY0RldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKQorICAgIHsKKyAgICAgICAgbUR5bmFtaWNEZXZpY2VzLmFkZChkZXZpY2UpOworICAgIH0KKworICAgIGJvb2wgcmVtb3ZlRHluYW1pY0RldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1EeW5hbWljRGV2aWNlcy5yZW1vdmUoZGV2aWNlKSA+PSAwOworICAgIH0KKyAgICBEZXZpY2VWZWN0b3IgZ2V0RHluYW1pY0RldmljZXMoKSBjb25zdCB7IHJldHVybiBtRHluYW1pY0RldmljZXM7IH0KIAogICAgIGNvbnN0IElucHV0UHJvZmlsZUNvbGxlY3Rpb24gJmdldElucHV0UHJvZmlsZXMoKSBjb25zdCB7IHJldHVybiBtSW5wdXRQcm9maWxlczsgfQogICAgIGNvbnN0IE91dHB1dFByb2ZpbGVDb2xsZWN0aW9uICZnZXRPdXRwdXRQcm9maWxlcygpIGNvbnN0IHsgcmV0dXJuIG1PdXRwdXRQcm9maWxlczsgfQpAQCAtODEsOCArOTcsMTkgQEAKICAgICAgICAgcmV0dXJuIG1Qb3J0cy5maW5kQnlUYWdOYW1lKHRhZ05hbWUpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEBicmllZiBzdXBwb3J0c1BhdGNoIGNoZWNrcyBpZiBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIDIgcG9ydHMgYmVsb2dpbmcgdG8gdGhpcyBId01vZHVsZQorICAgICAqIGlzIHN1cHBvcnRlZCBieSBhIEh3TW9kdWxlLiBUaGUgcG9ydHMgYW5kIHRoZSByb3V0ZSBzaGFsbCBiZSBkZWNsYXJlZCBpbiB0aGUKKyAgICAgKiBhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgZmlsZS4KKyAgICAgKiBAcGFyYW0gc3JjUG9ydCAoYWthIHRoZSBzb3VyY2UpIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gZHN0UG9ydCAoYWthIHRoZSBzaW5rKSB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBId01vZHVsZSBzdXBwb3J0cyB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBzaW5rIGFuZCB0aGUgc291cmNlLAorICAgICAqIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgc3VwcG9ydHNQYXRjaChjb25zdCBzcDxBdWRpb1BvcnQ+ICZzcmNQb3J0LCBjb25zdCBzcDxBdWRpb1BvcnQ+ICZkc3RQb3J0KSBjb25zdDsKKwogICAgIC8vIFRPRE8gcmVtb3ZlIGZyb20gaGVyZSAoc3BsaXQgc2VyaWFsaXphdGlvbikKLSAgICB2b2lkIGR1bXAoaW50IGZkKTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIAogcHJpdmF0ZToKICAgICB2b2lkIHJlZnJlc2hTdXBwb3J0ZWREZXZpY2VzKCk7CkBAIC05Myw2ICsxMjAsNyBAQAogICAgIElucHV0UHJvZmlsZUNvbGxlY3Rpb24gbUlucHV0UHJvZmlsZXM7ICAvLyBpbnB1dCBwcm9maWxlcyBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlCiAgICAgdWludDMyX3QgbUhhbFZlcnNpb247IC8vIGF1ZGlvIEhBTCBBUEkgdmVyc2lvbgogICAgIERldmljZVZlY3RvciBtRGVjbGFyZWREZXZpY2VzOyAvLyBkZXZpY2VzIGRlY2xhcmVkIGluIGF1ZGlvX3BvbGljeSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgRGV2aWNlVmVjdG9yIG1EeW5hbWljRGV2aWNlczsgLyoqPCBkZXZpY2VzIHRoYXQgY2FuIGJlIGFkZGVkL3JlbW92ZWQgYXQgcnVudGltZSAoZS5nLiByc2J1bWl4KSovCiAgICAgQXVkaW9Sb3V0ZVZlY3RvciBtUm91dGVzOwogICAgIEF1ZGlvUG9ydFZlY3RvciBtUG9ydHM7CiB9OwpAQCAtMTAyLDE0ICsxMzAsNjQgQEAKIHB1YmxpYzoKICAgICBzcDxId01vZHVsZT4gZ2V0TW9kdWxlRnJvbU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7CiAKLSAgICBzcDxId01vZHVsZT4gZ2V0TW9kdWxlRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0OworICAgIHNwPEh3TW9kdWxlPiBnZXRNb2R1bGVGb3JEZXZpY2VUeXBlcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSBjb25zdDsKIAotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZURlc2NyaXB0b3IoY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1hdGNoQWRyZXNzID0gdHJ1ZSkgY29uc3Q7CisgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZUZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CisgICAgRGV2aWNlVmVjdG9yIGdldEF2YWlsYWJsZURldmljZXNGcm9tTW9kdWxlTmFtZShjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVEZXZpY2VzKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXREZXZpY2VEZXNjcmlwdG9yIHJldHVybnMgYSBkZXZpY2UgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHRvIHRoZSBkZXZpY2UgdHlwZSBhbmQKKyAgICAgKiBkZXZpY2UgYWRkcmVzcyAoaWYgbWF0Y2hBZGRyZXNzIGlzIHRydWUpLgorICAgICAqIEl0IG1heSBsb29wIHR3aWNlIG9uIGFsbCBtb2R1bGVzIHRvIGNoZWNrIGlmIGFsbG93VG9DcmVhdGUgaXMgdHJ1ZQorICAgICAqICAgICAgLWZpcnN0IGxvb3Agd2lsbCBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIGZvdW5kIG9uIGEgbW9kdWxlIHNpbmNlIGRlY2xhcmVkIGluIHRoZSBsaXN0CisgICAgICogb2YgZGV2aWNlIHBvcnQgaW4gY29uZmlndXJhdGlvbiBmaWxlCisgICAgICogICAgICAtKGFsbG93VG9DcmVhdGUgaXMgdHJ1ZSlzZWNvbmQgbG9vcCB3aWxsIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgd2Vha2x5IHN1cHBvcnRlZCBieSBvbmUKKyAgICAgKiBvciBtb3JlIHByb2ZpbGVzIG9uIGEgZ2l2ZW4gbW9kdWxlIGFuZCB3aWxsIGFkZCBhcyBhIHN1cHBvcnRlZCBkZXZpY2UgZm9yIHRoaXMgbW9kdWxlLgorICAgICAqICAgICAgIFRoZSBkZXZpY2Ugd2lsbCBhbHNvIGJlIGFkZGVkIHRvIHRoZSBkeW5hbWljIGxpc3Qgb2YgZGV2aWNlIG9mIHRoaXMgbW9kdWxlCisgICAgICogQHBhcmFtIHR5cGUgb2YgdGhlIGRldmljZSByZXF1ZXN0ZWQKKyAgICAgKiBAcGFyYW0gYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHJlcXVlc3RlZAorICAgICAqIEBwYXJhbSBuYW1lIG9mIHRoZSBkZXZpY2UgdGhhdCByZXF1ZXN0ZWQKKyAgICAgKiBAcGFyYW0gZW5jb2RlZEZvcm1hdCBpZiBub3QgQVVESU9fRk9STUFUX0RFRkFVTFQsIG11c3QgbWF0Y2ggb25lIHN1cHBvcnRlZCBmb3JtYXQKKyAgICAgKiBAcGFyYW0gbWF0Y2hBZGRyZXNzIHRydWUgaWYgYSBzdHJvbmcgbWF0Y2ggaXMgcmVxdWlyZWQKKyAgICAgKiBAcGFyYW0gYWxsb3dUb0NyZWF0ZSB0cnVlIGlmIGFsbG93ZWQgdG8gY3JlYXRlIGR5bmFtaWMgZGV2aWNlIChlLmcuIGhkbWksIHVzYi4uLikKKyAgICAgKiBAcmV0dXJuIGRldmljZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgdG8gdGhlIHR5cGUgKGFuZCBhZGRyZXNzIGlmIG1hdGNoQWRkcmVzcyBpcyB0cnVlKQorICAgICAqLworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZURlc2NyaXB0b3IoY29uc3QgYXVkaW9fZGV2aWNlc190IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG93VG9DcmVhdGUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2hBZGRyZXNzID0gdHJ1ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgY3JlYXRlRGV2aWNlIGNyZWF0ZXMgYSBuZXcgZGV2aWNlIGZyb20gdGhlIHR5cGUgYW5kIGFkZHJlc3MgZ2l2ZW4uIEl0IGNoZWNrcyB0aGF0CisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBkZXZpY2UgdHlwZSwgYSBtb2R1bGUgaXMgc3VwcG9ydGluZyB0aGlzIGRldmljZSAod2VhayBjaGVjaykuCisgICAgICogVGhpcyBjb25jZXJucyBvbmx5IGR5bmFtaWMgZGV2aWNlLCBha2EgZGV2aWNlIHdpdGggYSBzcGVjaWZpYyBhZGRyZXNzIGFuZCBub3QKKyAgICAgKiBhbHJlYWR5IHN1cHBvcnRlZCBieSBtb2R1bGUvdW5kZXJseWluZyBwcm9maWxlcy4KKyAgICAgKiBAcGFyYW0gdHlwZSBvZiB0aGUgZGV2aWNlIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gbmFtZSBvZiB0aGUgZGV2aWNlIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcmV0dXJuIGRldmljZSBkZXNjcmlwdG9yIGlmIGEgbW9kdWxlIGlzIHN1cHBvcnRpbmcgdGhpcyB0eXBlLCBudWxscHRyIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBjcmVhdGVEZXZpY2UoY29uc3QgYXVkaW9fZGV2aWNlc190IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGNsZWFuVXBGb3JEZXZpY2U6IGxvb3Agb24gYWxsIHByb2ZpbGVzIG9mIGFsbCBtb2R1bGVzIHRvIHJlbW92ZSBkZXZpY2UgZnJvbQorICAgICAqIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBkZXZpY2UuIElmIHRoaXMgZGV2aWNlIGlzIGEgZHluYW1pYyBkZXZpY2UgKGFrYSBhIGRldmljZSBub3QgaW4gdGhlCisgICAgICogeG1sIGZpbGUgd2l0aCBhIHJ1bnRpbWUgYWRkcmVzcyksIGl0IGlzIGFsc28gcmVtb3ZlZCBmcm9tIHRoZSBtb2R1bGUgY29sbGVjdGlvbiBvZiBkeW5hbWljCisgICAgICogZGV2aWNlcy4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIHRoYXQgaGFzIGJlZW4gZGlzY29ubmVjdGVkCisgICAgICovCisgICAgdm9pZCBjbGVhblVwRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpOworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmgKaW5kZXggNjdhYzliYy4uZTBiNTZkNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lPUHJvZmlsZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaApAQCAtMzUsNyArMzUsNyBAQAogcHVibGljOgogICAgIElPUHJvZmlsZShjb25zdCBTdHJpbmc4ICZuYW1lLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlKQogICAgICAgICA6IEF1ZGlvUG9ydChuYW1lLCBBVURJT19QT1JUX1RZUEVfTUlYLCByb2xlKSwKLSAgICAgICAgICBtYXhPcGVuQ291bnQoKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgPyAxIDogMCksCisgICAgICAgICAgbWF4T3BlbkNvdW50KDEpLAogICAgICAgICAgIGN1ck9wZW5Db3VudCgwKSwKICAgICAgICAgICBtYXhBY3RpdmVDb3VudCgxKSwKICAgICAgICAgICBjdXJBY3RpdmVDb3VudCgwKSB7fQpAQCAtNTcsMTIgKzU3LDI1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBpbnB1dCBhbmQgZGlyZWN0IG91dHB1dCwgYW5kIGlzIG5vdCB1c2VkIGZvciBvdGhlciBvdXRwdXQuCi0gICAgLy8gSWYgcGFyYW1ldGVyIHVwZGF0ZWRTYW1wbGluZ1JhdGUgaXMgbm9uLU5VTEwsIGl0IGlzIGFzc2lnbmVkIHRoZSBhY3R1YWwgc2FtcGxlIHJhdGUuCi0gICAgLy8gRm9yIGlucHV0LCBmbGFncyBpcyBpbnRlcnByZXRlZCBhcyBhdWRpb19pbnB1dF9mbGFnc190LgotICAgIC8vIFRPRE86IG1lcmdlIGF1ZGlvX291dHB1dF9mbGFnc190IGFuZCBhdWRpb19pbnB1dF9mbGFnc190LgotICAgIGJvb2wgaXNDb21wYXRpYmxlUHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgIC8qKgorICAgICAqIEBicmllZiBpc0NvbXBhdGlibGVQcm9maWxlOiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBpbnB1dCBhbmQgZGlyZWN0IG91dHB1dCwKKyAgICAgKiBhbmQgaXMgbm90IHVzZWQgZm9yIG90aGVyIG91dHB1dC4KKyAgICAgKiBDaGVja3MgaWYgdGhlIElPIHByb2ZpbGUgaXMgY29tcGF0aWJsZSB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICAgICAqIEZvciBpbnB1dCwgZmxhZ3MgaXMgaW50ZXJwcmV0ZWQgYXMgYXVkaW9faW5wdXRfZmxhZ3NfdC4KKyAgICAgKiBUT0RPOiBtZXJnZSBhdWRpb19vdXRwdXRfZmxhZ3NfdCBhbmQgYXVkaW9faW5wdXRfZmxhZ3NfdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXZpY2VzIHZlY3RvciBvZiBkZXZpY2VzIHRvIGJlIGNoZWNrZWQgZm9yIGNvbXBhdGliaWxpdHkKKyAgICAgKiBAcGFyYW0gc2FtcGxpbmdSYXRlIHRvIGJlIGNoZWNrZWQgZm9yIGNvbXBhdGliaWxpdHkuIE11c3QgYmUgc3BlY2lmaWVkCisgICAgICogQHBhcmFtIHVwZGF0ZWRTYW1wbGluZ1JhdGUgaWYgbm9uLU5VTEwsIGl0IGlzIGFzc2lnbmVkIHRoZSBhY3R1YWwgc2FtcGxlIHJhdGUuCisgICAgICogQHBhcmFtIGZvcm1hdCB0byBiZSBjaGVja2VkIGZvciBjb21wYXRpYmlsaXR5LiBNdXN0IGJlIHNwZWNpZmllZAorICAgICAqIEBwYXJhbSB1cGRhdGVkRm9ybWF0IGlmIG5vbi1OVUxMLCBpdCBpcyBhc3NpZ25lZCB0aGUgYWN0dWFsIGZvcm1hdAorICAgICAqIEBwYXJhbSBjaGFubmVsTWFzayB0byBiZSBjaGVja2VkIGZvciBjb21wYXRpYmlsaXR5LiBNdXN0IGJlIHNwZWNpZmllZAorICAgICAqIEBwYXJhbSB1cGRhdGVkQ2hhbm5lbE1hc2sgaWYgbm9uLU5VTEwsIGl0IGlzIGFzc2lnbmVkIHRoZSBhY3R1YWwgY2hhbm5lbCBtYXNrCisgICAgICogQHBhcmFtIGZsYWdzIHRvIGJlIGNoZWNrZWQgZm9yIGNvbXBhdGliaWxpdHkKKyAgICAgKiBAcGFyYW0gZXhhY3RNYXRjaFJlcXVpcmVkRm9ySW5wdXRGbGFncyB0cnVlIGlmIGV4YWN0IG1hdGNoIGlzIHJlcXVpcmVkIG9uIGZsYWdzCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9maWxlIGlzIGNvbXBhdGlibGUsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIGlzQ29tcGF0aWJsZVByb2ZpbGUoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp1cGRhdGVkU2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCkBAIC03Myw1NCArODYsNjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXhhY3RNYXRjaFJlcXVpcmVkRm9ySW5wdXRGbGFncyA9IGZhbHNlKSBjb25zdDsKIAotICAgIHZvaWQgZHVtcChpbnQgZmQpOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogICAgIHZvaWQgbG9nKCk7CiAKICAgICBib29sIGhhc1N1cHBvcnRlZERldmljZXMoKSBjb25zdCB7IHJldHVybiAhbVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpOyB9CiAKLSAgICBib29sIHN1cHBvcnREZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKKyAgICBib29sIHN1cHBvcnRzRGV2aWNlVHlwZXMoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKICAgICB7CiAgICAgICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlcyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZTsKKyAgICAgICAgICAgIGlmIChkZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIChkZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTik7CiAgICAgfQogCi0gICAgYm9vbCBzdXBwb3J0RGV2aWNlQWRkcmVzcyhjb25zdCBTdHJpbmc4ICZhZGRyZXNzKSBjb25zdAorICAgIC8qKgorICAgICAqIEBicmllZiBzdXBwb3J0c0RldmljZQorICAgICAqIEBwYXJhbSBkZXZpY2UgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0CisgICAgICogICAgICAgIGZvcmNlQ2hlY2tPbkFkZHJlc3MgaWYgdHJ1ZSwgY2hlY2sgb24gdHlwZSBhbmQgYWRkcmVzcyB3aGF0ZXZlciB0aGUgdHlwZSwgb3RoZXJ3aXNlCisgICAgICogICAgICAgIHRoZSBhZGRyZXNzIGVuZm9yY2VtZW50IGlzIGxpbWl0ZWQgdG8gIm9mZmljYWwgZGV2aWNlcyIgdGhhdCBkaXN0aW5ndWlzaGUgb24gYWRkcmVzcworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIHN1cHBvcnRlZCBieSB0eXBlIChmb3Igbm9uIGJ1cyAvIHJlbW90ZSBzdWJtaXggZGV2aWNlcyksCisgICAgICogICAgICAgICB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkIChib3RoIHR5cGUgYW5kIGFkZHJlc3MpIGZvciBidXMgLyByZW1vdGUgc3VibWl4CisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIHN1cHBvcnRzRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsIGJvb2wgZm9yY2VDaGVja09uQWRkcmVzcyA9IGZhbHNlKSBjb25zdAogICAgIHsKLSAgICAgICAgcmV0dXJuIG1TdXBwb3J0ZWREZXZpY2VzWzBdLT5tQWRkcmVzcyA9PSBhZGRyZXNzOwotICAgIH0KLQotICAgIC8vIGNob3NlIGZpcnN0IGRldmljZSBwcmVzZW50IGluIG1TdXBwb3J0ZWREZXZpY2VzIGFsc28gcGFydCBvZiBkZXZpY2VUeXBlCi0gICAgYXVkaW9fZGV2aWNlc190IGdldFN1cHBvcnRlZERldmljZUZvclR5cGUoYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUpIGNvbnN0Ci0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayAgPCBtU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGsrKykgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByb2ZpbGVUeXBlID0gbVN1cHBvcnRlZERldmljZXNba10tPnR5cGUoKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlVHlwZSAmIGRldmljZVR5cGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvZmlsZVR5cGU7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UtPnR5cGUoKSkgJiYgIWZvcmNlQ2hlY2tPbkFkZHJlc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBwb3J0c0RldmljZVR5cGVzKGRldmljZS0+dHlwZSgpKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgIHJldHVybiBtU3VwcG9ydGVkRGV2aWNlcy5jb250YWlucyhkZXZpY2UpOwogICAgIH0KIAotICAgIGF1ZGlvX2RldmljZXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCk7IH0KKyAgICBib29sIGRldmljZVN1cHBvcnRzRW5jb2RlZEZvcm1hdHMoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyByZXF1aXJlZCBmb3IgaXNPZmZsb2FkU3VwcG9ydGVkKCkgY2hlY2sKKyAgICAgICAgfQorICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9CisgICAgICAgICAgICBtU3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKGRldmljZSk7CisgICAgICAgIGlmICghZGV2aWNlTGlzdC5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZGV2aWNlTGlzdC5pdGVtQXQoMCktPmhhc0N1cnJlbnRFbmNvZGVkRm9ybWF0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAogICAgIHZvaWQgY2xlYXJTdXBwb3J0ZWREZXZpY2VzKCkgeyBtU3VwcG9ydGVkRGV2aWNlcy5jbGVhcigpOyB9CiAgICAgdm9pZCBhZGRTdXBwb3J0ZWREZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSkKICAgICB7CiAgICAgICAgIG1TdXBwb3J0ZWREZXZpY2VzLmFkZChkZXZpY2UpOwogICAgIH0KLQorICAgIHZvaWQgcmVtb3ZlU3VwcG9ydGVkRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpCisgICAgeworICAgICAgICBtU3VwcG9ydGVkRGV2aWNlcy5yZW1vdmUoZGV2aWNlKTsKKyAgICB9CiAgICAgdm9pZCBzZXRTdXBwb3J0ZWREZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykKICAgICB7CiAgICAgICAgIG1TdXBwb3J0ZWREZXZpY2VzID0gZGV2aWNlczsKICAgICB9CiAKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRTdXBwb3J0ZWREZXZpY2VCeUFkZHJlc3MoYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcykgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtU3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2UodHlwZSwgYWRkcmVzcyk7Ci0gICAgfQotCiAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZnZXRTdXBwb3J0ZWREZXZpY2VzKCkgY29uc3QgeyByZXR1cm4gbVN1cHBvcnRlZERldmljZXM7IH0KIAogICAgIGJvb2wgY2FuT3Blbk5ld0lvKCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lWb2x1bWVDdXJ2ZXMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwODQ0NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8Vm9sdW1lLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJVm9sdW1lQ3VydmVzCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+SVZvbHVtZUN1cnZlcygpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBjYW5CZU11dGVkKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4TWluKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1heCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGZsb2F0IHZvbEluZGV4VG9EYihkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlLCBpbnQgaW5kZXhJblVpKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRWb2x1bWUoaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpID0gMDsKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPGF1ZGlvX2F0dHJpYnV0ZXNfdD4gZ2V0QXR0cmlidXRlcygpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPGF1ZGlvX3N0cmVhbV90eXBlX3Q+IGdldFN0cmVhbVR5cGVzKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcyA9IDAsIGJvb2wgY3VydmVQb2ludHMgPSBmYWxzZSkgY29uc3QgPSAwOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmNmIwOC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPFZvbHVtZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIElWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+SVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24oKSA9IGRlZmF1bHQ7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgYWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSA9IDA7Ci0gICAgdmlydHVhbCBib29sIGNhbkJlTXV0ZWQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1pbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7Ci0gICAgdmlydHVhbCBpbnQgZ2V0Vm9sdW1lSW5kZXhNYXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIGZsb2F0IHZvbEluZGV4VG9EYihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZGV2aWNlX2NhdGVnb3J5IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoYm9vbCAvKmlzU3BlYWtlckRyY0VuYWJsZWQqLykge30KLSAgICB2aXJ0dWFsIHZvaWQgc3dpdGNoVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzcmMsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZHN0KSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIHJlc3RvcmVPcmlnaW5Wb2x1bWVDdXJ2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaFZvbHVtZUN1cnZlKHN0cmVhbSwgc3RyZWFtKTsKLSAgICB9Ci0gICAgdmlydHVhbCBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdCA9IDA7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2VyaWFsaXplci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NlcmlhbGl6ZXIuaAppbmRleCAyOWRlODQ4Li40OGM0MTQ3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2VyaWFsaXplci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXJpYWxpemVyLmgKQEAgLTE3LDIyMyArMTcsOSBAQAogI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlICJBdWRpb1BvbGljeUNvbmZpZy5oIgotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLQotc3RydWN0IF94bWxOb2RlOwotc3RydWN0IF94bWxEb2M7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IEF1ZGlvR2FpblRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbW9kZVtdOyAvKio8IGdhaW4gbW9kZXMgc3VwcG9ydGVkLCBlLmcuIEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUy4gKi8KLSAgICAgICAgLyoqIGNvbnRyb2xsZWQgY2hhbm5lbHMsIG5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUy4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgY2hhbm5lbE1hc2tbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWluVmFsdWVNQltdOyAvKio8IG1pbiB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWF4VmFsdWVNQltdOyAvKio8IG1heCB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZGVmYXVsdFZhbHVlTUJbXTsgLyoqPCBkZWZhdWx0IHZhbHVlIGluIG1pbGxpYmVsLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBzdGVwVmFsdWVNQltdOyAvKio8IHN0ZXAgdmFsdWUgaW4gbWlsbGliZWwuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1pblJhbXBNc1tdOyAvKio8IG5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9SQU1QLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtYXhSYW1wTXNbXTsgLyoqPCAubmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX1JBTVAgKi8KLSAgICB9OwotCi0gICAgdHlwZWRlZiBBdWRpb0dhaW4gRWxlbWVudDsKLSAgICB0eXBlZGVmIHNwPEVsZW1lbnQ+IFB0ckVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBBdWRpb0dhaW5Db2xsZWN0aW9uIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiB2b2lkICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwotCi0gICAgLy8gR2FpbiBoYXMgbm8gY2hpbGQKLX07Ci0KLS8vIEEgcHJvZmlsZSBzZWN0aW9uIGNvbnRhaW5zIGEgbmFtZSwgIG9uZSBhdWRpbyBmb3JtYXQgYW5kIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcwotLy8gYW5kIGNoYW5uZWwgbWFza3MgZm9yIHRoaXMgZm9ybWF0Ci1zdHJ1Y3QgQXVkaW9Qcm9maWxlVHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBuYW1lW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHNhbXBsaW5nUmF0ZXNbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZm9ybWF0W107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGNoYW5uZWxNYXNrc1tdOwotICAgIH07Ci0KLSAgICB0eXBlZGVmIEF1ZGlvUHJvZmlsZSBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8QXVkaW9Qcm9maWxlPiBQdHJFbGVtZW50OwotICAgIHR5cGVkZWYgQXVkaW9Qcm9maWxlVmVjdG9yIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiB2b2lkICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwotfTsKLQotc3RydWN0IE1peFBvcnRUcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb2xsZWN0aW9uVGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgcm9sZVtdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBmbGFnc1tdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtYXhPcGVuQ291bnRbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWF4QWN0aXZlQ291bnRbXTsKLSAgICB9OwotCi0gICAgdHlwZWRlZiBJT1Byb2ZpbGUgRWxlbWVudDsKLSAgICB0eXBlZGVmIHNwPEVsZW1lbnQ+IFB0ckVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBJT1Byb2ZpbGVDb2xsZWN0aW9uIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiB2b2lkICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwotCi0gICAgLy8gQ2hpbGRyZW4gYXJlOiBHYWluVHJhaXRzCi19OwotCi1zdHJ1Y3QgRGV2aWNlUG9ydFRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgdGFnTmFtZVtdOyAvKio8ICA8ZGV2aWNlIHRhZyBuYW1lPjogYW55IHN0cmluZyB3aXRob3V0IHNwYWNlLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciB0eXBlW107IC8qKjwgPGRldmljZSB0eXBlPi4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgcm9sZVtdOyAvKio8IDxkZXZpY2Ugcm9sZTogc2luayBvciBzb3VyY2U+LiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciByb2xlU291cmNlW107IC8qKjwgPGF0dHJpYnV0ZSByb2xlIHNvdXJjZSB2YWx1ZT4uICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGFkZHJlc3NbXTsgLyoqPCBvcHRpb25hbDogZGV2aWNlIGFkZHJlc3MsIGNoYXIgc3RyaW5nIGxlc3MgdGhhbiA2NC4gKi8KLSAgICB9OwotICAgIHR5cGVkZWYgRGV2aWNlRGVzY3JpcHRvciBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8RGV2aWNlRGVzY3JpcHRvcj4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIERldmljZVZlY3RvciBDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgdm9pZCAqUHRyU2VyaWFsaXppbmdDdHg7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKLSAgICAvLyBDaGlsZHJlbiBhcmU6IEdhaW5UcmFpdHMgKG9wdGlvbm5hbCkKLX07Ci0KLXN0cnVjdCBSb3V0ZVRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgdHlwZVtdOyAvKio8IDxyb3V0ZSB0eXBlPjogbWl4IG9yIG11eC4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgdHlwZU1peFtdOyAvKio8IHR5cGUgYXR0cmlidXRlIG1peCB2YWx1ZS4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc2lua1tdOyAvKio8IDxzaW5rOiBpbnZvbHZlZCBpbiB0aGlzIHJvdXRlPi4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc291cmNlc1tdOyAvKio8IHNvdXJjZXM6IGFsbCBzb3VyY2UgdGhhdCBjYW4gYmUgaW52b2x2ZWQgaW4gdGhpcyByb3V0ZS4gKi8KLSAgICB9OwotICAgIHR5cGVkZWYgQXVkaW9Sb3V0ZSBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8QXVkaW9Sb3V0ZT4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIEF1ZGlvUm91dGVWZWN0b3IgQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIEh3TW9kdWxlICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBjdHgpOwotfTsKLQotc3RydWN0IE1vZHVsZVRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0KLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY2hpbGRBdHRhY2hlZERldmljZXNUYWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNoaWxkQXR0YWNoZWREZXZpY2VUYWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBuYW1lW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXTsKLSAgICB9OwotCi0gICAgdHlwZWRlZiBId01vZHVsZSBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8RWxlbWVudD4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIEh3TW9kdWxlQ29sbGVjdGlvbiBDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgQXVkaW9Qb2xpY3lDb25maWcgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Ci0KLSAgICAvLyBDaGlsZHJlbiBhcmU6IG1peFBvcnRUcmFpdHMsIGRldmljZVBvcnRUcmFpdHMgYW5kIHJvdXRlVHJhaXRzCi0gICAgLy8gTmVlZCB0byBjYWxsIGRlc2VyaWFsaXplIG9uIGVhY2ggY2hpbGQKLX07Ci0KLXN0cnVjdCBHbG9iYWxDb25maWdUcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHNwZWFrZXJEcmNFbmFibGVkW107Ci0gICAgfTsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShjb25zdCBfeG1sTm9kZSAqcm9vdCwgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZyk7Ci19OwotCi1zdHJ1Y3QgVm9sdW1lVHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgdm9sdW1lUG9pbnRUYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc3RyZWFtW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGRldmljZUNhdGVnb3J5W107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHJlZmVyZW5jZVtdOwotICAgIH07Ci0KLSAgICB0eXBlZGVmIFZvbHVtZUN1cnZlIEVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBzcDxWb2x1bWVDdXJ2ZT4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIHZvaWQgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Ci0KLSAgICAvLyBObyBDaGlsZAotfTsKLQotY2xhc3MgUG9saWN5U2VyaWFsaXplcgotewotcHJpdmF0ZToKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgcm9vdE5hbWU7Ci0KLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdmVyc2lvbkF0dHJpYnV0ZTsKLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgZ01ham9yOyAvKio8IHRoZSBtYWpvciBudW1iZXIgb2YgdGhlIHBvbGljeSB4bWwgZm9ybWF0IHZlcnNpb24uICovCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGdNaW5vcjsgLyoqPCB0aGUgbWlub3IgbnVtYmVyIG9mIHRoZSBwb2xpY3kgeG1sIGZvcm1hdCB2ZXJzaW9uLiAqLwotCi1wdWJsaWM6Ci0gICAgUG9saWN5U2VyaWFsaXplcigpOwotICAgIHN0YXR1c190IGRlc2VyaWFsaXplKGNvbnN0IGNoYXIgKnN0ciwgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZyk7Ci0KLXByaXZhdGU6Ci0gICAgdHlwZWRlZiBBdWRpb1BvbGljeUNvbmZpZyBFbGVtZW50OwotCi0gICAgc3RkOjpzdHJpbmcgbVJvb3RFbGVtZW50TmFtZTsKLSAgICBzdGQ6OnN0cmluZyBtVmVyc2lvbjsKLQotICAgIC8vIENoaWxkcmVuIGFyZTogTW9kdWxlc1RyYWl0cywgVm9sdW1lVHJhaXRzCi19Oworc3RhdHVzX3QgZGVzZXJpYWxpemVBdWRpb1BvbGljeUZpbGUoY29uc3QgY2hhciAqZmlsZU5hbWUsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpOwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2Vzc2lvblJvdXRlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2Vzc2lvblJvdXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYjQ0NDAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1Nlc3Npb25Sb3V0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZURlc2NyaXB0b3I7Ci1jbGFzcyBEZXZpY2VWZWN0b3I7Ci0KLWNsYXNzIFNlc3Npb25Sb3V0ZSA6IHB1YmxpYyBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgLy8gRm9yIElucHV0IChTb3VyY2UpIHJvdXRlcywgdXNlIFNUUkVBTV9UWVBFX05BICgiTkEiID0gIm5vdCBhcHBsaWNhYmxlKWZvciB0aGUKLSAgICAvLyBzdHJlYW1UeXBlIGFyZ3VtZW50Ci0gICAgc3RhdGljIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgU1RSRUFNX1RZUEVfTkEgPSBBVURJT19TVFJFQU1fREVGQVVMVDsKLQotICAgIC8vIEZvciBPdXRwdXQgKFNpbmspIHJvdXRlcywgdXNlIFNPVVJDRV9UWVBFX05BICgiTkEiID0gIm5vdCBhcHBsaWNhYmxlIikgZm9yIHRoZQotICAgIC8vIHNvdXJjZSBhcmd1bWVudAotCi0gICAgc3RhdGljIGNvbnN0IGF1ZGlvX3NvdXJjZV90IFNPVVJDRV9UWVBFX05BID0gQVVESU9fU09VUkNFX0RFRkFVTFQ7Ci0KLSAgICBTZXNzaW9uUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCi0gICAgICAgIDogbVVpZCh1aWQpLAotICAgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLAotICAgICAgICAgIG1EZXZpY2VEZXNjcmlwdG9yKGRldmljZURlc2NyaXB0b3IpLAotICAgICAgICAgIG1SZWZDb3VudCgwKSwKLSAgICAgICAgICBtQWN0aXZpdHlDb3VudCgwKSwKLSAgICAgICAgICBtQ2hhbmdlZChmYWxzZSksCi0gICAgICAgICAgbVN0cmVhbVR5cGUoc3RyZWFtVHlwZSksCi0gICAgICAgICAgbVNvdXJjZShzb3VyY2UpCi0gICAge30KLQotICAgIHZvaWQgbG9nKGNvbnN0IGNoYXIqIHByZWZpeCk7Ci0KLSAgICBib29sIGlzQWN0aXZlT3JDaGFuZ2VkKCkgewotICAgICAgICByZXR1cm4gKG1EZXZpY2VEZXNjcmlwdG9yICE9IDApICYmIChtQ2hhbmdlZCB8fCAobUFjdGl2aXR5Q291bnQgPiAwKSk7Ci0gICAgfQotCi0gICAgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgIG1VaWQ7Ci0gICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgICAgIG1TZXNzaW9uOwotICAgIHNwPERldmljZURlc2NyaXB0b3I+ICAgICAgICBtRGV2aWNlRGVzY3JpcHRvcjsKLQotICAgIC8vICJyZWZlcmVuY2UiIGNvdW50aW5nCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWZDb3VudDsgICAgICAvLyArLy0gb24gcmVmZXJlbmNlcwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlDb3VudDsgLy8gKy8tIG9uIHN0YXJ0L3N0b3AKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5nZWQ7Ci0gICAgLy8gZm9yIG91dHB1dHMKLSAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICAgbVN0cmVhbVR5cGU7Ci0gICAgLy8gZm9yIGlucHV0cwotICAgIGNvbnN0IGF1ZGlvX3NvdXJjZV90ICAgICAgICBtU291cmNlOwotfTsKLQotY2xhc3MgU2Vzc2lvblJvdXRlTWFwOiBwdWJsaWMgS2V5ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90LCBzcDxTZXNzaW9uUm91dGU+ID4KLXsKLXB1YmxpYzoKLSAgICAvLyBUaGVzZSBjb25zdGFudHMgaWRlbnRpZnkgdGhlIFNlc3Npb25Sb3V0TWFwIGFzIGhvbGRpbmcgRUlUSEVSIGlucHV0IHJvdXRlcywKLSAgICAvLyBvciBvdXRwdXQgcm91dGVzLiAgQW4gZXJyb3Igd2lsbCBvY2N1ciBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYWRkIGEgU2Vzc2lvblJvdXRlCi0gICAgLy8gb2JqZWN0IHdpdGggbVN0cmVhbVR5cGUgPT0gU1RSRUFNX1RZUEVfTkEgKGkuZS4gYW4gaW5wdXQgU2Vzc2lvblJvdXRlKSB0byBhCi0gICAgLy8gU2Vzc2lvblJvdXRNYXAgdGhhdCBpcyBtYXJrZWQgZm9yIG91dHB1dCAoaS5lLiBtTWFwVHlwZSA9PSBTRVNTSU9OX1JPVVRFX01BUF9PVVRQVVQpCi0gICAgLy8gYW5kIHNpbWlsYXJseSAgZm9yIG91dHB1dCBTZXNzaW9uUm91dGVzIGFuZCBJbnB1dCBTZXNzaW9uUm91dGVNYXBzLgotICAgIHR5cGVkZWYgZW51bQotICAgIHsKLSAgICAgICAgTUFQVFlQRV9JTlBVVCA9IDAsCi0gICAgICAgIE1BUFRZUEVfT1VUUFVUID0gMQotICAgIH0gc2Vzc2lvbl9yb3V0ZV9tYXBfdHlwZV90OwotCi0gICAgZXhwbGljaXQgU2Vzc2lvblJvdXRlTWFwKHNlc3Npb25fcm91dGVfbWFwX3R5cGVfdCBtYXBUeXBlKSA6Ci0gICAgICAgIG1NYXBUeXBlKG1hcFR5cGUpCi0gICAge30KLQotICAgIGJvb2wgaGFzUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotCi0gICAgdm9pZCByZW1vdmVSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0KLSAgICBpbnQgaW5jUm91dGVBY3Rpdml0eShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgaW50IGRlY1JvdXRlQWN0aXZpdHkoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIGJvb2wgZ2V0QW5kQ2xlYXJSb3V0ZUNoYW5nZWQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOyAvLyBhbHNvIGNsZWFycyB0aGUgY2hhbmdlZCBmbGFnCi0gICAgdm9pZCBsb2coY29uc3QgY2hhciogY2FwdGlvbik7Ci0gICAgYXVkaW9fZGV2aWNlc190IGdldEFjdGl2ZURldmljZUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGF2YWlsYWJsZURldmljZXMpOwotICAgIC8vIFNwZWNpZnkgYW4gT3V0cHV0KFNpbmspIHJvdXRlIGJ5IHBhc3NpbmcgU2Vzc2lvblJvdXRlOjpTT1VSQ0VfVFlQRV9OQSBpbiB0aGUKLSAgICAvLyBzb3VyY2UgYXJndW1lbnQuCi0gICAgLy8gU3BlY2lmeSBhbiBJbnB1dChTb3VyY2UpIHJvdXQgYnkgcGFzc2luZyBTZXNzaW9uUm91dGU6OkFVRElPX1NUUkVBTV9ERUZBVUxUCi0gICAgLy8gaW4gdGhlIHN0cmVhbVR5cGUgYXJndW1lbnQuCi0gICAgdm9pZCBhZGRSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2VEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKLQotcHJpdmF0ZToKLSAgICAvLyBVc2VkIHRvIG1hcmsgYSBTZXNzaW9uUm91dGUgYXMgZm9yIGVpdGhlciBpbnB1dHMgKG1NYXBUeXBlID09IGtTZXNzaW9uUm91dGVNYXBfSW5wdXQpCi0gICAgLy8gb3Igb3V0cHV0cyAobU1hcFR5cGUgPT0ga1Nlc3Npb25Sb3V0ZU1hcF9PdXRwdXQpCi0gICAgY29uc3Qgc2Vzc2lvbl9yb3V0ZV9tYXBfdHlwZV90IG1NYXBUeXBlOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1N0cmVhbURlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TdHJlYW1EZXNjcmlwdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYjEwMzcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1N0cmVhbURlc2NyaXB0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oIgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0cmVhbSBkZXNjcmlwdG9yIHVzZWQgZm9yIHZvbHVtZSBjb250cm9sCi1jbGFzcyBTdHJlYW1EZXNjcmlwdG9yCi17Ci1wdWJsaWM6Ci0gICAgU3RyZWFtRGVzY3JpcHRvcigpOwotCi0gICAgaW50IGdldFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0OwotICAgIGJvb2wgY2FuQmVNdXRlZCgpIGNvbnN0IHsgcmV0dXJuIG1DYW5CZU11dGVkOyB9Ci0gICAgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpOwotICAgIHZvaWQgYWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCk7Ci0gICAgaW50IGdldFZvbHVtZUluZGV4TWluKCkgY29uc3QgeyByZXR1cm4gbUluZGV4TWluOyB9Ci0gICAgaW50IGdldFZvbHVtZUluZGV4TWF4KCkgY29uc3QgeyByZXR1cm4gbUluZGV4TWF4OyB9Ci0gICAgdm9pZCBzZXRWb2x1bWVJbmRleE1pbihpbnQgdm9sSW5kZXhNaW4pOwotICAgIHZvaWQgc2V0Vm9sdW1lSW5kZXhNYXgoaW50IHZvbEluZGV4TWF4KTsKLSAgICBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0Ci0gICAgewotICAgICAgICBkZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpOwotICAgICAgICByZXR1cm4gbUluZGV4Q3VyLmluZGV4T2ZLZXkoZGV2aWNlKSA+PSAwOwotICAgIH0KLQotICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRWb2x1bWVDdXJ2ZVBvaW50KGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqcG9pbnQpOwotICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKmdldFZvbHVtZUN1cnZlUG9pbnQoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1Wb2x1bWVDdXJ2ZVtkZXZpY2VDYXRlZ29yeV07Ci0gICAgfQotCi1wcml2YXRlOgotICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfQ05UXTsKLSAgICBLZXllZFZlY3RvcjxhdWRpb19kZXZpY2VzX3QsIGludD4gbUluZGV4Q3VyOyAvKio8IGN1cnJlbnQgdm9sdW1lIGluZGV4IHBlciBkZXZpY2UuICovCi0gICAgaW50IG1JbmRleE1pbjsgLyoqPCBtaW4gdm9sdW1lIGluZGV4LiAqLwotICAgIGludCBtSW5kZXhNYXg7IC8qKjwgbWF4IHZvbHVtZSBpbmRleC4gKi8KLSAgICBib29sIG1DYW5CZU11dGVkOyAvKio8IHRydWUgaXMgdGhlIHN0cmVhbSBjYW4gYmUgbXV0ZWQuICovCi19OwotCi0vKioKLSAqIHN0cmVhbSBkZXNjcmlwdG9ycyBjb2xsZWN0aW9uIGZvciB2b2x1bWUgY29udHJvbAotICovCi1jbGFzcyBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbiA6IHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fc3RyZWFtX3R5cGVfdCwgU3RyZWFtRGVzY3JpcHRvcj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbgotewotcHVibGljOgotICAgIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgIHZpcnR1YWwgdm9pZCBhZGRDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOwotICAgIHZpcnR1YWwgYm9vbCBjYW5CZU11dGVkKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1pbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZUZvcihzdHJlYW0pLmdldFZvbHVtZUluZGV4TWluKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlRm9yKHN0cmVhbSkuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKTsKLSAgICB9Ci0gICAgdmlydHVhbCBpbnQgZ2V0Vm9sdW1lSW5kZXhNYXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gdmFsdWVGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleE1heCgpOwotICAgIH0KLSAgICB2aXJ0dWFsIGZsb2F0IHZvbEluZGV4VG9EYihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZGV2aWNlX2NhdGVnb3J5IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KTsKLSAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcyhib29sIGlzU3BlYWtlckRyY0VuYWJsZWQpOwotICAgIHZpcnR1YWwgdm9pZCBzd2l0Y2hWb2x1bWVDdXJ2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVNyYywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ec3QpOwotICAgIHZpcnR1YWwgYm9vbCBoYXNWb2x1bWVJbmRleEZvckRldmljZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZUZvcihzdHJlYW0pLmhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGRldmljZSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBzZXRWb2x1bWVDdXJ2ZVBvaW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnBvaW50KTsKLSAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpnZXRWb2x1bWVDdXJ2ZVBvaW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5KSBjb25zdDsKLSAgICB2b2lkIHNldFZvbHVtZUluZGV4TWluKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLGludCB2b2xJbmRleE1pbik7Ci0gICAgdm9pZCBzZXRWb2x1bWVJbmRleE1heChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSxpbnQgdm9sSW5kZXhNYXgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1R5cGVDb252ZXJ0ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9UeXBlQ29udmVydGVyLmgKaW5kZXggNjNjMTlkMS4uNmIwNDc2YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1R5cGVDb252ZXJ0ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVHlwZUNvbnZlcnRlci5oCkBAIC0yMywyNiArMjMsMTAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgRGV2aWNlQ2F0ZWdvcnlUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGRldmljZV9jYXRlZ29yeSBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IE1peFR5cGVUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGludDMyX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBSb3V0ZUZsYWdUcmFpdHMKLXsKLSAgICB0eXBlZGVmIHVpbnQzMl90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgUnVsZVRyYWl0cwotewotICAgIHR5cGVkZWYgdWludDMyX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKK3N0cnVjdCBSdWxlVHJhaXRzIDogcHVibGljIERlZmF1bHRUcmFpdHM8dWludDMyX3Q+IHt9OwordXNpbmcgRGV2aWNlQ2F0ZWdvcnlUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGRldmljZV9jYXRlZ29yeT47CitzdHJ1Y3QgTWl4VHlwZVRyYWl0cyA6IHB1YmxpYyBEZWZhdWx0VHJhaXRzPGludDMyX3Q+IHt9Oworc3RydWN0IFJvdXRlRmxhZ1RyYWl0cyA6IHB1YmxpYyBEZWZhdWx0VHJhaXRzPHVpbnQzMl90PiB7fTsKIAogdHlwZWRlZiBUeXBlQ29udmVydGVyPERldmljZUNhdGVnb3J5VHJhaXRzPiBEZXZpY2VDYXRlZ29yeUNvbnZlcnRlcjsKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxNaXhUeXBlVHJhaXRzPiBNaXhUeXBlQ29udmVydGVyOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1ZvbHVtZUN1cnZlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVm9sdW1lQ3VydmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2YjJiNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVm9sdW1lQ3VydmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oIgotI2luY2x1ZGUgPHBvbGljeS5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEN1cnZlUG9pbnQKLXsKLSAgICBDdXJ2ZVBvaW50KCkge30KLSAgICBDdXJ2ZVBvaW50KGludCBpbmRleCwgaW50IGF0dGVudWF0aW9uSW5NYikgOgotICAgICAgICBtSW5kZXgoaW5kZXgpLCBtQXR0ZW51YXRpb25Jbk1iKGF0dGVudWF0aW9uSW5NYikge30KLSAgICB1aW50MzJfdCBtSW5kZXg7Ci0gICAgaW50IG1BdHRlbnVhdGlvbkluTWI7Ci19OwotCi1pbmxpbmUgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IEN1cnZlUG9pbnQgJmxocywgY29uc3QgQ3VydmVQb2ludCAmcmhzKQotewotICAgIHJldHVybiBsaHMubUluZGV4IDwgcmhzLm1JbmRleDsKLX0KLQotLy8gQSB2b2x1bWUgY3VydmUgZm9yIGEgZ2l2ZW4gdXNlIGNhc2UgYW5kIGRldmljZSBjYXRlZ29yeQotLy8gSXQgY29udGFpbnMgb2YgbGlzdCBvZiBwb2ludHMgb2YgdGhpcyBjdXJ2ZSBleHByZXNzaW5nIHRoZSBhdHRlbnVhdGlvbiBpbiBNaWxsaWJlbHMgZm9yCi0vLyBhIGdpdmVuIHZvbHVtZSBpbmRleCBmcm9tIDAgdG8gMTAwCi1jbGFzcyBWb2x1bWVDdXJ2ZSA6IHB1YmxpYyBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgVm9sdW1lQ3VydmUoZGV2aWNlX2NhdGVnb3J5IGRldmljZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIDoKLSAgICAgICAgbURldmljZUNhdGVnb3J5KGRldmljZSksIG1TdHJlYW1UeXBlKHN0cmVhbSkge30KLQotICAgIGRldmljZV9jYXRlZ29yeSBnZXREZXZpY2VDYXRlZ29yeSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VDYXRlZ29yeTsgfQotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0U3RyZWFtVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1UeXBlOyB9Ci0KLSAgICB2b2lkIGFkZChjb25zdCBDdXJ2ZVBvaW50ICZwb2ludCkgeyBtQ3VydmVQb2ludHMuYWRkKHBvaW50KTsgfQotCi0gICAgZmxvYXQgdm9sSW5kZXhUb0RiKGludCBpbmRleEluVWksIGludCB2b2xJbmRleE1pbiwgaW50IHZvbEluZGV4TWF4KSBjb25zdDsKLQotICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIFNvcnRlZFZlY3RvcjxDdXJ2ZVBvaW50PiBtQ3VydmVQb2ludHM7Ci0gICAgZGV2aWNlX2NhdGVnb3J5IG1EZXZpY2VDYXRlZ29yeTsKLSAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW1UeXBlOwotfTsKLQotLy8gVm9sdW1lIEN1cnZlcyBmb3IgYSBnaXZlbiB1c2UgY2FzZSBpbmRleGVkIGJ5IGRldmljZSBjYXRlZ29yeQotY2xhc3MgVm9sdW1lQ3VydmVzRm9yU3RyZWFtIDogcHVibGljIEtleWVkVmVjdG9yPGRldmljZV9jYXRlZ29yeSwgc3A8Vm9sdW1lQ3VydmU+ID4KLXsKLXB1YmxpYzoKLSAgICBWb2x1bWVDdXJ2ZXNGb3JTdHJlYW0oKSA6IG1JbmRleE1pbigwKSwgbUluZGV4TWF4KDEpLCBtQ2FuQmVNdXRlZCh0cnVlKQotICAgIHsKLSAgICAgICAgbUluZGV4Q3VyLmFkZChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSwgMCk7Ci0gICAgfQotCi0gICAgc3A8Vm9sdW1lQ3VydmU+IGdldEN1cnZlc0ZvcihkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlKSBjb25zdAotICAgIHsKLSAgICAgICAgaWYgKGluZGV4T2ZLZXkoZGV2aWNlKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZUZvcihkZXZpY2UpOwotICAgIH0KLQotICAgIGludCBnZXRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAotICAgIHsKLSAgICAgICAgZGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKLSAgICAgICAgLy8gdGhlcmUgaXMgYWx3YXlzIGEgdmFsaWQgZW50cnkgZm9yIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FCi0gICAgICAgIGlmIChtSW5kZXhDdXIuaW5kZXhPZktleShkZXZpY2UpIDwgMCkgewotICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1JbmRleEN1ci52YWx1ZUZvcihkZXZpY2UpOwotICAgIH0KLQotICAgIGJvb2wgY2FuQmVNdXRlZCgpIGNvbnN0IHsgcmV0dXJuIG1DYW5CZU11dGVkOyB9Ci0gICAgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpIHsgbUluZGV4Q3VyLmNsZWFyKCk7IH0KLSAgICB2b2lkIGFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgaW5kZXgpIHsgbUluZGV4Q3VyLmFkZChkZXZpY2UsIGluZGV4KTsgfQotCi0gICAgdm9pZCBzZXRWb2x1bWVJbmRleE1pbihpbnQgdm9sSW5kZXhNaW4pIHsgbUluZGV4TWluID0gdm9sSW5kZXhNaW47IH0KLSAgICBpbnQgZ2V0Vm9sdW1lSW5kZXhNaW4oKSBjb25zdCB7IHJldHVybiBtSW5kZXhNaW47IH0KLQotICAgIHZvaWQgc2V0Vm9sdW1lSW5kZXhNYXgoaW50IHZvbEluZGV4TWF4KSB7IG1JbmRleE1heCA9IHZvbEluZGV4TWF4OyB9Ci0gICAgaW50IGdldFZvbHVtZUluZGV4TWF4KCkgY29uc3QgeyByZXR1cm4gbUluZGV4TWF4OyB9Ci0KLSAgICBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0Ci0gICAgewotICAgICAgICBkZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpOwotICAgICAgICByZXR1cm4gbUluZGV4Q3VyLmluZGV4T2ZLZXkoZGV2aWNlKSA+PSAwOwotICAgIH0KLQotICAgIGNvbnN0IHNwPFZvbHVtZUN1cnZlPiBnZXRPcmlnaW5Wb2x1bWVDdXJ2ZShkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkpIGNvbnN0Ci0gICAgewotICAgICAgICBBTE9HX0FTU0VSVChtT3JpZ2luVm9sdW1lQ3VydmVzLmluZGV4T2ZLZXkoZGV2aWNlQ2F0ZWdvcnkpID49IDAsICJJbnZhbGlkIGRldmljZSBjYXRlZ29yeSIpOwotICAgICAgICByZXR1cm4gbU9yaWdpblZvbHVtZUN1cnZlcy52YWx1ZUZvcihkZXZpY2VDYXRlZ29yeSk7Ci0gICAgfQotICAgIHZvaWQgc2V0Vm9sdW1lQ3VydmUoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LCBjb25zdCBzcDxWb2x1bWVDdXJ2ZT4gJnZvbHVtZUN1cnZlKQotICAgIHsKLSAgICAgICAgQUxPR19BU1NFUlQoaW5kZXhPZktleShkZXZpY2VDYXRlZ29yeSkgPj0gMCwgIkludmFsaWQgZGV2aWNlIGNhdGVnb3J5IGZvciBWb2x1bWUgQ3VydmUiKTsKLSAgICAgICAgcmVwbGFjZVZhbHVlRm9yKGRldmljZUNhdGVnb3J5LCB2b2x1bWVDdXJ2ZSk7Ci0gICAgfQotCi0gICAgc3NpemVfdCBhZGQoY29uc3Qgc3A8Vm9sdW1lQ3VydmU+ICZ2b2x1bWVDdXJ2ZSkKLSAgICB7Ci0gICAgICAgIGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSA9IHZvbHVtZUN1cnZlLT5nZXREZXZpY2VDYXRlZ29yeSgpOwotICAgICAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShkZXZpY2VDYXRlZ29yeSk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2Ygb3JpZ2luYWwgVm9sdW1lIEN1cnZlcyBwZXIgZGV2aWNlIGNhdGVnb3J5IGluIG9yZGVyIHRvIHN3aXRjaCBjdXJ2ZXMuCi0gICAgICAgICAgICBtT3JpZ2luVm9sdW1lQ3VydmVzLmFkZChkZXZpY2VDYXRlZ29yeSwgdm9sdW1lQ3VydmUpOwotICAgICAgICAgICAgcmV0dXJuIEtleWVkVmVjdG9yOjphZGQoZGV2aWNlQ2F0ZWdvcnksIHZvbHVtZUN1cnZlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotCi0gICAgZmxvYXQgdm9sSW5kZXhUb0RiKGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXQsIGludCBpbmRleEluVWkpIGNvbnN0Ci0gICAgewotICAgICAgICBzcDxWb2x1bWVDdXJ2ZT4gdmMgPSBnZXRDdXJ2ZXNGb3IoZGV2aWNlQ2F0KTsKLSAgICAgICAgaWYgKHZjICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiB2Yy0+dm9sSW5kZXhUb0RiKGluZGV4SW5VaSwgbUluZGV4TWluLCBtSW5kZXhNYXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgZGV2aWNlIGNhdGVnb3J5ICVkIGZvciBWb2x1bWUgQ3VydmUiLCBkZXZpY2VDYXQpOwotICAgICAgICAgICAgcmV0dXJuIDAuMGY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBib29sIGN1cnZlUG9pbnRzID0gZmFsc2UpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIEtleWVkVmVjdG9yPGRldmljZV9jYXRlZ29yeSwgc3A8Vm9sdW1lQ3VydmU+ID4gbU9yaWdpblZvbHVtZUN1cnZlczsKLSAgICBLZXllZFZlY3RvcjxhdWRpb19kZXZpY2VzX3QsIGludD4gbUluZGV4Q3VyOyAvKio8IGN1cnJlbnQgdm9sdW1lIGluZGV4IHBlciBkZXZpY2UuICovCi0gICAgaW50IG1JbmRleE1pbjsgLyoqPCBtaW4gdm9sdW1lIGluZGV4LiAqLwotICAgIGludCBtSW5kZXhNYXg7IC8qKjwgbWF4IHZvbHVtZSBpbmRleC4gKi8KLSAgICBib29sIG1DYW5CZU11dGVkOyAvKio8IHRydWUgaXMgdGhlIHN0cmVhbSBjYW4gYmUgbXV0ZWQuICovCi19OwotCi0vLyBDb2xsZWN0aW9uIG9mIFZvbHVtZSBDdXJ2ZXMgaW5kZXhlZCBieSB1c2UgY2FzZQotY2xhc3MgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiA6IHB1YmxpYyBLZXllZFZlY3RvcjxhdWRpb19zdHJlYW1fdHlwZV90LCBWb2x1bWVDdXJ2ZXNGb3JTdHJlYW0+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbgotewotcHVibGljOgotICAgIFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24oKQotICAgIHsKLSAgICAgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGNvbGxlY3Rpb24gb2YgY3VydmVzCi0gICAgICAgIGZvciAoc3NpemVfdCBpID0gMCA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4oaSk7Ci0gICAgICAgICAgICBLZXllZFZlY3Rvcjo6YWRkKHN0cmVhbSwgVm9sdW1lQ3VydmVzRm9yU3RyZWFtKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gT25jZSBYTUwgaGFzIGJlZW4gcGFyc2VkLCBtdXN0IGJlIGNhbGwgZmlyc3QgdG8gc2FuaXR5IGNoZWNrIHRhYmxlIGFuZCBpbml0aWFsaXplIGluZGV4ZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KQotICAgIHsKLSAgICAgICAgZWRpdFZhbHVlQXQoc3RyZWFtKS5zZXRWb2x1bWVJbmRleE1pbihpbmRleE1pbik7Ci0gICAgICAgIGVkaXRWYWx1ZUF0KHN0cmVhbSkuc2V0Vm9sdW1lSW5kZXhNYXgoaW5kZXhNYXgpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLSAgICB7Ci0gICAgICAgIGVkaXRDdXJ2ZXNGb3Ioc3RyZWFtKS5jbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgYWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgaW5kZXgpCi0gICAgewotICAgICAgICBlZGl0Q3VydmVzRm9yKHN0cmVhbSkuYWRkQ3VycmVudFZvbHVtZUluZGV4KGRldmljZSwgaW5kZXgpOwotICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wgY2FuQmVNdXRlZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgeyByZXR1cm4gZ2V0Q3VydmVzRm9yKHN0cmVhbSkuY2FuQmVNdXRlZCgpOyB9Ci0KLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1pbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDdXJ2ZXNGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleE1pbigpOwotICAgIH0KLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1heChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDdXJ2ZXNGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleE1heCgpOwotICAgIH0KLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDdXJ2ZXNGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleChkZXZpY2UpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgc3dpdGNoVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1TcmMsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtRHN0KQotICAgIHsKLSAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVzRm9yU3RyZWFtICZzb3VyY2VDdXJ2ZXMgPSBnZXRDdXJ2ZXNGb3Ioc3RyZWFtU3JjKTsKLSAgICAgICAgVm9sdW1lQ3VydmVzRm9yU3RyZWFtICZkc3RDdXJ2ZXMgPSBlZGl0Q3VydmVzRm9yKHN0cmVhbURzdCk7Ci0gICAgICAgIEFMT0dfQVNTRVJUKHNvdXJjZUN1cnZlcy5zaXplKCkgPT0gZHN0Q3VydmVzLnNpemUoKSwgImRldmljZSBjYXRlZ29yeSBub3QgYWxpZ25lZCIpOwotICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgc291cmNlQ3VydmVzLnNpemUoKTsgaW5kZXgrKykgewotICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGNhdCA9IHNvdXJjZUN1cnZlcy5rZXlBdChpbmRleCk7Ci0gICAgICAgICAgICBkc3RDdXJ2ZXMuc2V0Vm9sdW1lQ3VydmUoY2F0LCBzb3VyY2VDdXJ2ZXMuZ2V0T3JpZ2luVm9sdW1lQ3VydmUoY2F0KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdmlydHVhbCBmbG9hdCB2b2xJbmRleFRvRGIoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGRldmljZV9jYXRlZ29yeSBjYXQsIGludCBpbmRleEluVWkpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gZ2V0Q3VydmVzRm9yKHN0cmVhbSkudm9sSW5kZXhUb0RiKGNhdCwgaW5kZXhJblVpKTsKLSAgICB9Ci0gICAgdmlydHVhbCBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEN1cnZlc0ZvcihzdHJlYW0pLmhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGRldmljZSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7Ci0KLSAgICBzc2l6ZV90IGFkZChjb25zdCBzcDxWb2x1bWVDdXJ2ZT4gJnZvbHVtZUN1cnZlKQotICAgIHsKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gdm9sdW1lQ3VydmUtPmdldFN0cmVhbVR5cGUoKTsKLSAgICAgICAgcmV0dXJuIGVkaXRDdXJ2ZXNGb3Ioc3RyZWFtVHlwZSkuYWRkKHZvbHVtZUN1cnZlKTsKLSAgICB9Ci0gICAgVm9sdW1lQ3VydmVzRm9yU3RyZWFtICZlZGl0Q3VydmVzRm9yKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotICAgIHsKLSAgICAgICAgQUxPR19BU1NFUlQoaW5kZXhPZktleShzdHJlYW0pID49IDAsICJJbnZhbGlkIHN0cmVhbSB0eXBlIGZvciBWb2x1bWUgQ3VydmUiKTsKLSAgICAgICAgcmV0dXJuIGVkaXRWYWx1ZUF0KHN0cmVhbSk7Ci0gICAgfQotICAgIGNvbnN0IFZvbHVtZUN1cnZlc0ZvclN0cmVhbSAmZ2V0Q3VydmVzRm9yKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAotICAgIHsKLSAgICAgICAgQUxPR19BU1NFUlQoaW5kZXhPZktleShzdHJlYW0pID49IDAsICJJbnZhbGlkIHN0cmVhbSB0eXBlIGZvciBWb2x1bWUgQ3VydmUiKTsKLSAgICAgICAgcmV0dXJuIHZhbHVlRm9yKHN0cmVhbSk7Ci0gICAgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcAppbmRleCBjYTY3Yjg3Li5jOTBhNTgyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcApAQCAtMzUsMjIgKzM1LDE2IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXN0YXR1c190IEF1ZGlvUm91dGVWZWN0b3I6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAordm9pZCBBdWRpb1JvdXRlVmVjdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKICAgICBpZiAoaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuJSpzQXVkaW8gUm91dGVzICglenUpOlxuIiwgc3BhY2VzLCAiIiwgc2l6ZSgpKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuJSpzQXVkaW8gUm91dGVzICglenUpOlxuIiwgc3BhY2VzLCAiIiwgc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gUm91dGUgJXp1OlxuIiwgc3BhY2VzLCAiIiwgaSArIDEpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIGl0ZW1BdChpKS0+ZHVtcChmZCwgNCk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFJvdXRlICV6dTpcbiIsIHNwYWNlcywgIiIsIGkgKyAxKTsKKyAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGRzdCwgNCk7CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9HYWluLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvR2Fpbi5jcHAKaW5kZXggMTkzZDRhNi4uMjcyNTg3MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9HYWluLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0dhaW4uY3BwCkBAIC05OCwzMiArOTgsMTcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXZvaWQgQXVkaW9HYWluOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAordm9pZCBBdWRpb0dhaW46OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNHYWluICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbW9kZTogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubW9kZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gY2hhbm5lbF9tYXNrOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5jaGFubmVsX21hc2spOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1pbl92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1pbl92YWx1ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWF4X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3ZhbHVlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBkZWZhdWx0X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uZGVmYXVsdF92YWx1ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc3RlcF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLnN0ZXBfdmFsdWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1pbl9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWluX3JhbXBfbXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1heF9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3JhbXBfbXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNHYWluICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbW9kZTogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubW9kZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gY2hhbm5lbF9tYXNrOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5jaGFubmVsX21hc2spOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1pbl92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1pbl92YWx1ZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbWF4X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3ZhbHVlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBkZWZhdWx0X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uZGVmYXVsdF92YWx1ZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gc3RlcF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLnN0ZXBfdmFsdWUpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1pbl9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWluX3JhbXBfbXMpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIG1heF9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3JhbXBfbXMpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKaW5kZXggMWUwNjQwYy4uNjM1ZGU2ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcApAQCAtMTcsMjIgKzE3LDIwIEBACiAjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9JbnB1dERlc2NyaXB0b3IiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKLSNpbmNsdWRlIDxBdWRpb1BvbGljeUludGVyZmFjZS5oPgotI2luY2x1ZGUgIkF1ZGlvSW5wdXREZXNjcmlwdG9yLmgiCi0jaW5jbHVkZSAiSU9Qcm9maWxlLmgiCi0jaW5jbHVkZSAiQXVkaW9HYWluLmgiCi0jaW5jbHVkZSAiSHdNb2R1bGUuaCIKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgogI2luY2x1ZGUgPHBvbGljeS5oPgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5SW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiQXVkaW9JbnB1dERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKKyNpbmNsdWRlICJBdWRpb1BvbGljeU1peC5oIgorI2luY2x1ZGUgIkh3TW9kdWxlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogQXVkaW9JbnB1dERlc2NyaXB0b3I6OkF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKLSAgICA6IG1Jb0hhbmRsZSgwKSwKLSAgICAgIG1EZXZpY2UoQVVESU9fREVWSUNFX05PTkUpLCBtUG9saWN5TWl4KE5VTEwpLAotICAgICAgbVByb2ZpbGUocHJvZmlsZSksIG1QYXRjaEhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSksIG1JZCgwKSwKLSAgICAgIG1DbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKQorICAgIDogbVByb2ZpbGUocHJvZmlsZSkKKyAgICAsICBtQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSkKIHsKICAgICBpZiAocHJvZmlsZSAhPSBOVUxMKSB7CiAgICAgICAgIHByb2ZpbGUtPnBpY2tBdWRpb1Byb2ZpbGUobVNhbXBsaW5nUmF0ZSwgbUNoYW5uZWxNYXNrLCBtRm9ybWF0KTsKQEAgLTUwLDE5ICs0OCwxNCBAQAogICAgIHJldHVybiBtUHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCk7CiB9CiAKLXVpbnQzMl90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRPcGVuUmVmQ291bnQoKSBjb25zdAotewotICAgIHJldHVybiBtU2Vzc2lvbnMuZ2V0T3BlbkNvdW50KCk7Ci19Ci0KIGF1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldElkKCkgY29uc3QKIHsKICAgICByZXR1cm4gbUlkOwogfQogCi1hdWRpb19zb3VyY2VfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6aW5wdXRTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdAorYXVkaW9fc291cmNlX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnNvdXJjZSgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIGdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZShhY3RpdmVPbmx5KTsKKyAgICByZXR1cm4gZ2V0SGlnaGVzdFByaW9yaXR5QXR0cmlidXRlcygpLnNvdXJjZTsKIH0KIAogdm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCkBAIC04Myw3ICs3Niw3IEBACiAgICAgZHN0Q29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKICAgICBkc3RDb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7CiAgICAgZHN0Q29uZmlnLT5leHQubWl4LmhhbmRsZSA9IG1Jb0hhbmRsZTsKLSAgICBkc3RDb25maWctPmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBpbnB1dFNvdXJjZSgpOworICAgIGRzdENvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IHNvdXJjZSgpOwogfQogCiB2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKQEAgLTExOCw1NyArMTExLDU1IEBACiAgICAgbVByZWVtcHRlZFNlc3Npb25zLmNsZWFyKCk7CiB9CiAKLWJvb2wgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmlzQWN0aXZlKCkgY29uc3QgewotICAgIHJldHVybiBtU2Vzc2lvbnMuaGFzQWN0aXZlU2Vzc2lvbigpOwotfQotCiBib29sIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5pc1NvdXJjZUFjdGl2ZShzb3VyY2UpOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoY2xpZW50LT5hY3RpdmUoKSAmJgorICAgICAgICAgICAgKChjbGllbnQtPnNvdXJjZSgpID09IHNvdXJjZSkgfHwKKyAgICAgICAgICAgICAgICAoKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pICYmCisgICAgICAgICAgICAgICAgICAgIChjbGllbnQtPnNvdXJjZSgpID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJgorICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmlzU291bmRUcmlnZ2VyKCkpKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOwogfQogCi1hdWRpb19zb3VyY2VfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGJvb2wgYWN0aXZlT25seSkgY29uc3QKK2F1ZGlvX2F0dHJpYnV0ZXNfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0SGlnaGVzdFByaW9yaXR5QXR0cmlidXRlcygpIGNvbnN0CiB7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7IC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfREVGQVVMVCB9OwogCi0gICAgcmV0dXJuIG1TZXNzaW9ucy5nZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoYWN0aXZlT25seSk7CisgICAgZm9yIChib29sIGFjdGl2ZU9ubHkgOiB7IHRydWUsIGZhbHNlIH0pIHsKKyAgICAgICAgaW50MzJfdCB0b3BQcmlvcml0eSA9IC0xOworICAgICAgICBhcHBfc3RhdGVfdCB0b3BTdGF0ZSA9IEFQUF9TVEFURV9JRExFOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmIChhY3RpdmVPbmx5ICYmICFjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXBwX3N0YXRlX3QgY3VyU3RhdGUgPSBjbGllbnQtPmFwcFN0YXRlKCk7CisgICAgICAgICAgICBpZiAoY3VyU3RhdGUgPj0gdG9wU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGN1clByaW9yaXR5ID0gc291cmNlX3ByaW9yaXR5KGNsaWVudC0+c291cmNlKCkpOworICAgICAgICAgICAgICAgIGlmIChjdXJQcmlvcml0eSA+IHRvcFByaW9yaXR5KSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBjbGllbnQtPmF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgdG9wUHJpb3JpdHkgPSBjdXJQcmlvcml0eTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG9wU3RhdGUgPSBjdXJTdGF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYXR0cmlidXRlcy5zb3VyY2UgIT0gQVVESU9fU09VUkNFX0RFRkFVTFQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhdHRyaWJ1dGVzOwogfQogCiBib29sIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjppc1NvdW5kVHJpZ2dlcigpIGNvbnN0IHsKLSAgICAvLyBzb3VuZCB0cmlnZ2VyIGFuZCBub24gc291bmQgdHJpZ2dlciBzZXNzaW9ucyBhcmUgbm90IG1peGVkCi0gICAgLy8gb24gYSBnaXZlbiBpbnB1dAotICAgIHJldHVybiBtU2Vzc2lvbnMudmFsdWVBdCgwKS0+aXNTb3VuZFRyaWdnZXIoKTsKLX0KLQotc3A8QXVkaW9TZXNzaW9uPiBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0QXVkaW9TZXNzaW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy52YWx1ZUZvcihzZXNzaW9uKTsKLX0KLQotQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0QXVkaW9TZXNzaW9ucyhib29sIGFjdGl2ZU9ubHkpIGNvbnN0Ci17Ci0gICAgaWYgKGFjdGl2ZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9ucy5nZXRBY3RpdmVTZXNzaW9ucygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbnM7CisgICAgLy8gc291bmQgdHJpZ2dlciBhbmQgbm9uIHNvdW5kIHRyaWdnZXIgY2xpZW50cyBhcmUgbm90IG1peGVkIG9uIGEgZ2l2ZW4gaW5wdXQKKyAgICAvLyBzbyBjaGVjayBvbmx5IGZpcnN0IGNsaWVudAorICAgIGlmIChnZXRDbGllbnRDb3VudCgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLX0KLQotc2l6ZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRBdWRpb1Nlc3Npb25Db3VudChib29sIGFjdGl2ZU9ubHkpIGNvbnN0Ci17Ci0gICAgaWYgKGFjdGl2ZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9ucy5nZXRBY3RpdmVTZXNzaW9uQ291bnQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbVNlc3Npb25zLnNpemUoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjphZGRBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiYgYXVkaW9TZXNzaW9uKSB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5hZGRTZXNzaW9uKHNlc3Npb24sIGF1ZGlvU2Vzc2lvbiwgLypBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIqL3RoaXMpOwotfQotCi1zdGF0dXNfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6cmVtb3ZlQXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5yZW1vdmVTZXNzaW9uKHNlc3Npb24pOworICAgIHJldHVybiBnZXRDbGllbnRJdGVyYWJsZSgpLmJlZ2luKCktPmlzU291bmRUcmlnZ2VyKCk7CiB9CiAKIGF1ZGlvX3BhdGNoX2hhbmRsZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRQYXRjaEhhbmRsZSgpIGNvbnN0CkBAIC0xNzksNyArMTcwLDExIEBACiB2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCiB7CiAgICAgbVBhdGNoSGFuZGxlID0gaGFuZGxlOwotICAgIG1TZXNzaW9ucy5vblNlc3Npb25JbmZvVXBkYXRlKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgICAgICB1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQsIGNsaWVudCk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIGF1ZGlvX2NvbmZpZ19iYXNlX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldENvbmZpZygpIGNvbnN0CkBAIC0xOTAsOCArMTg1LDcgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6Om9wZW4oY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQpCkBAIC0yMDgsMjQgKzIwMiwyNiBAQAogCiAgICAgbURldmljZSA9IGRldmljZTsKIAotICAgIEFMT0dWKCJvcGVuaW5nIGlucHV0IGZvciBkZXZpY2UgJTA4eCBhZGRyZXNzICVzIHByb2ZpbGUgJXAgbmFtZSAlcyIsCi0gICAgICAgICAgbURldmljZSwgYWRkcmVzcy5zdHJpbmcoKSwgbVByb2ZpbGUuZ2V0KCksIG1Qcm9maWxlLT5nZXROYW1lKCkuc3RyaW5nKCkpOworICAgIEFMT0dWKCJvcGVuaW5nIGlucHV0IGZvciBkZXZpY2UgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKKyAgICAgICAgICBtRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIG1Qcm9maWxlLmdldCgpLCBtUHJvZmlsZS0+Z2V0TmFtZSgpLnN0cmluZygpKTsKKworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gbURldmljZS0+dHlwZSgpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUNsaWVudEludGVyZmFjZS0+b3BlbklucHV0KG1Qcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2UtPmFkZHJlc3MoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRGV2aWNlICE9IGRldmljZSwKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1EZXZpY2UtPnR5cGUoKSAhPSBkZXZpY2VUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIiVzIG9wZW5JbnB1dCByZXR1cm5lZCBkZXZpY2UgJTA4eCB3aGVuIGdpdmVuIGRldmljZSAlMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbURldmljZSwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbURldmljZS0+dHlwZSgpLCBkZXZpY2VUeXBlKTsKIAogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigqaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIG9wZW5JbnB1dCByZXR1cm5lZCBpbnB1dCBoYW5kbGUgJWQgZm9yIGRldmljZSAlMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICppbnB1dCwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgb3BlbklucHV0IHJldHVybmVkIGlucHV0IGhhbmRsZSAlZCBmb3IgZGV2aWNlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICppbnB1dCwgbURldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IGxDb25maWcuc2FtcGxlX3JhdGU7CiAgICAgICAgIG1DaGFubmVsTWFzayA9IGxDb25maWcuY2hhbm5lbF9tYXNrOwogICAgICAgICBtRm9ybWF0ID0gbENvbmZpZy5mb3JtYXQ7CkBAIC0yMzksNyArMjM1LDcgQEAKIAogc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnN0YXJ0KCkKIHsKLSAgICBpZiAoZ2V0QXVkaW9TZXNzaW9uQ291bnQodHJ1ZS8qYWN0aXZlT25seSovKSA9PSAxKSB7CisgICAgaWYgKCFpc0FjdGl2ZSgpKSB7CiAgICAgICAgIGlmICghbVByb2ZpbGUtPmNhblN0YXJ0TmV3SW8oKSkgewogICAgICAgICAgICAgQUxPR0koIiVzIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCAlZCIsIF9fZnVuY19fLCBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMjYyLDQyICsyNTgsMTg5IEBACiB2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpjbG9zZSgpCiB7CiAgICAgaWYgKG1Jb0hhbmRsZSAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAvLyBjbGVhbiB1cCBhY3RpdmUgY2xpZW50cyBpZiBhbnkgKGNhbiBoYXBwZW4gaWYgY2xvc2UoKSBpcyBjYWxsZWQgdG8gZm9yY2UKKyAgICAgICAgLy8gY2xpZW50cyB0byByZWNvbm5lY3QKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBjbGllbnQgd2l0aCBwb3J0IElEICVkIHN0aWxsIGFjdGl2ZSBvbiBpbnB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjbGllbnQtPnBvcnRJZCgpLCBtSWQpOworICAgICAgICAgICAgICAgIHNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBzdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KG1Jb0hhbmRsZSk7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVByb2ZpbGUtPmN1ck9wZW5Db3VudCA8IDEsICIlcyBwcm9maWxlIG9wZW4gY291bnQgJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb2ZpbGUtPmN1ck9wZW5Db3VudCk7Ci0gICAgICAgIC8vIGRvIG5vdCBjYWxsIHN0b3AoKSBoZXJlIGFzIHN0b3AoKSBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgYWZ0ZXIKLSAgICAgICAgLy8gQXVkaW9TZXNzaW9uOjpjaGFuZ2VBY3RpdmVDb3VudCgtMSkgYW5kIHdlIGRvbid0IGtub3cgaG93IG1hbnkgc2Vzc2lvbnMKLSAgICAgICAgLy8gYXJlIHN0aWxsIGFjdGl2ZSBhdCB0aGlzIHRpbWUKLSAgICAgICAgaWYgKGlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudC0tOwotICAgICAgICB9CisKICAgICAgICAgbVByb2ZpbGUtPmN1ck9wZW5Db3VudC0tOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1Qcm9maWxlLT5jdXJPcGVuQ291bnQgPCAgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50LAorICAgICAgICAgICAgICAgICIlcyglZCk6IG1Qcm9maWxlLT5jdXJPcGVuQ291bnQgJWQgPCBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQgJWQuIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBtUHJvZmlsZS0+Y3VyT3BlbkNvdW50LCBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQpOwogICAgICAgICBtSW9IYW5kbGUgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICB9CiB9CiAKLXN0YXR1c190IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmFkZENsaWVudChjb25zdCBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiAmY2xpZW50KSB7CisgICAgQ2xpZW50TWFwSGFuZGxlcjxSZWNvcmRDbGllbnREZXNjcmlwdG9yPjo6YWRkQ2xpZW50KGNsaWVudCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FbmFibGVkRWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUVuYWJsZWRFZmZlY3RzLnZhbHVlQXQoaSktPm1TZXNzaW9uID09IGNsaWVudC0+c2Vzc2lvbigpKSB7CisgICAgICAgICAgICBjbGllbnQtPnRyYWNrRWZmZWN0RW5hYmxlZChtRW5hYmxlZEVmZmVjdHMudmFsdWVBdChpKSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnNldENsaWVudEFjdGl2ZShjb25zdCBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBib29sIGFjdGl2ZSkKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGdldENsaWVudChjbGllbnQtPnBvcnRJZCgpKSA9PSBudWxscHRyLAorICAgICAgICAiJXMoJWQpIGRvZXMgbm90IGV4aXN0IG9uIGlucHV0IGRlc2NyaXB0b3IiLCBfX2Z1bmNfXywgY2xpZW50LT5wb3J0SWQoKSk7CisgICAgaWYgKGFjdGl2ZSA9PSBjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSUQ6ICVkXG4iLCBnZXRJZCgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcm1hdDogJWRcbiIsIG1Gb3JtYXQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBEZXZpY2VzICUwOHhcbiIsIG1EZXZpY2UpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAvLyBIYW5kbGUgbm9uLWNsaWVudC1zcGVjaWZpYyBhY3Rpdml0eSByZWYgY291bnQKKyAgICBpbnQzMl90IG9sZEdsb2JhbEFjdGl2ZUNvdW50ID0gbUdsb2JhbEFjdGl2ZUNvdW50OworICAgIGlmICghYWN0aXZlICYmIG1HbG9iYWxBY3RpdmVDb3VudCA8IDEpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXMoJWQpIGludmFsaWQgZGVhY3RpdmF0aW9uIHdpdGggZ2xvYmFsQWN0aXZlQ291bnQgJWQiLAorICAgICAgICAgICAgICAgX19mdW5jX18sIGNsaWVudC0+cG9ydElkKCksIG1HbG9iYWxBY3RpdmVDb3VudCk7CisgICAgICAgIC8vIG1HbG9iYWxBY3RpdmVDb3VudCA9IDE7CisgICAgfQorICAgIGNvbnN0IGludCBkZWx0YSA9IGFjdGl2ZSA/IDEgOiAtMTsKKyAgICBtR2xvYmFsQWN0aXZlQ291bnQgKz0gZGVsdGE7CiAKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gbVBvbGljeU1peC5wcm9tb3RlKCk7CisgICAgaWYgKChvbGRHbG9iYWxBY3RpdmVDb3VudCA9PSAwKSAmJiAobUdsb2JhbEFjdGl2ZUNvdW50ID4gMCkpIHsKKyAgICAgICAgaWYgKChwb2xpY3lNaXggIT0gTlVMTCkgJiYgKChwb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKHBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfTUlYSU5HKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoKG9sZEdsb2JhbEFjdGl2ZUNvdW50ID4gMCkgJiYgKG1HbG9iYWxBY3RpdmVDb3VudCA9PSAwKSkgeworICAgICAgICBpZiAoKHBvbGljeU1peCAhPSBOVUxMKSAmJiAoKHBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUocG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9JRExFKTsKKyAgICAgICAgfQorICAgIH0KIAotICAgIG1TZXNzaW9ucy5kdW1wKGZkLCAxKTsKKyAgICBjbGllbnQtPnNldEFjdGl2ZShhY3RpdmUpOwogCi0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIGludCBldmVudCA9IGFjdGl2ZSA/IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQgOiBSRUNPUkRfQ09ORklHX0VWRU5UX1NUT1A7CisgICAgdXBkYXRlQ2xpZW50UmVjb3JkaW5nQ29uZmlndXJhdGlvbihldmVudCwgY2xpZW50KTsKKworfQorCit2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjp1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKAorICAgIGludCBldmVudCwgY29uc3Qgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCkKK3sKKyAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IHNlc3Npb25Db25maWcgPSBjbGllbnQtPmNvbmZpZygpOworICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190IHJlY29yZENsaWVudEluZm97Y2xpZW50LT51aWQoKSwgY2xpZW50LT5zZXNzaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPnNvdXJjZSgpLCBjbGllbnQtPnBvcnRJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5pc1NpbGVuY2VkKCl9OworICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnID0gZ2V0Q29uZmlnKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzOworICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIGVmZmVjdHNMaXN0ID0gY2xpZW50LT5nZXRFbmFibGVkRWZmZWN0cygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0c0xpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY2xpZW50RWZmZWN0cy5wdXNoX2JhY2soZWZmZWN0c0xpc3QudmFsdWVBdChpKS0+bURlc2MpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHM7CisgICAgZWZmZWN0c0xpc3QgPSBnZXRFbmFibGVkRWZmZWN0cygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0c0xpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZWZmZWN0cy5wdXNoX2JhY2soZWZmZWN0c0xpc3QudmFsdWVBdChpKS0+bURlc2MpOworICAgIH0KKworICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgJnJlY29yZENsaWVudEluZm8sICZzZXNzaW9uQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRFZmZlY3RzLCAmY29uZmlnLCBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGF0Y2hIYW5kbGUsIHNvdXJjZSgpKTsKK30KKworUmVjb3JkQ2xpZW50VmVjdG9yIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRDbGllbnRzRm9yU2Vzc2lvbigKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50czsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgaWYgKGNsaWVudC0+c2Vzc2lvbigpID09IHNlc3Npb24pIHsKKyAgICAgICAgICAgIGNsaWVudHMucHVzaF9iYWNrKGNsaWVudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNsaWVudHM7Cit9CisKK1JlY29yZENsaWVudFZlY3RvciBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Y2xpZW50c0xpc3QoYm9vbCBhY3RpdmVPbmx5LCBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJlZmVycmVkRGV2aWNlT25seSkgY29uc3QKK3sKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50czsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgaWYgKCghYWN0aXZlT25seSB8fCBjbGllbnQtPmFjdGl2ZSgpKQorICAgICAgICAgICAgJiYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCB8fCBzb3VyY2UgPT0gY2xpZW50LT5zb3VyY2UoKSkKKyAgICAgICAgICAgICYmICghcHJlZmVycmVkRGV2aWNlT25seSB8fCBjbGllbnQtPmhhc1ByZWZlcnJlZERldmljZSgpKSkgeworICAgICAgICAgICAgY2xpZW50cy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2xpZW50czsKK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6dHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkKQoreworICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIG1FbmFibGVkRWZmZWN0cy5yZXBsYWNlVmFsdWVGb3IoZWZmZWN0LT5tSWQsIGVmZmVjdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUVuYWJsZWRFZmZlY3RzLnJlbW92ZUl0ZW0oZWZmZWN0LT5tSWQpOworICAgIH0KKworICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzID0gZ2V0Q2xpZW50c0ZvclNlc3Npb24oKGF1ZGlvX3Nlc3Npb25fdCllZmZlY3QtPm1TZXNzaW9uKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGNsaWVudHMpIHsKKyAgICAgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gY2xpZW50RWZmZWN0ID0gY2xpZW50LT5nZXRFbmFibGVkRWZmZWN0cygpLmdldEVmZmVjdChlZmZlY3QtPm1JZCk7CisgICAgICAgIGJvb2wgY2hhbmdlZCA9IChlbmFibGVkICYmIGNsaWVudEVmZmVjdCA9PSBudWxscHRyKQorICAgICAgICAgICAgICAgIHx8ICghZW5hYmxlZCAmJiBjbGllbnRFZmZlY3QgIT0gbnVsbHB0cik7CisgICAgICAgIGNsaWVudC0+dHJhY2tFZmZlY3RFbmFibGVkKGVmZmVjdCwgZW5hYmxlZCk7CisgICAgICAgIGlmIChjaGFuZ2VkICYmIGNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgICAgIHVwZGF0ZUNsaWVudFJlY29yZGluZ0NvbmZpZ3VyYXRpb24oUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCwgY2xpZW50KTsKKyAgICAgICAgfQorICAgIH0KK30KKworRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldEVuYWJsZWRFZmZlY3RzKCkgY29uc3QKK3sKKyAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBlbmFibGVkRWZmZWN0czsKKyAgICAvLyByZXBvcnQgZWZmZWN0cyBmb3IgaGlnaGVzdCBwcmlvcml0eSBhY3RpdmUgc291cmNlIGFzIGFwcGxpZWQgdG8gYWxsIGNsaWVudHMKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50cyA9CisgICAgICAgIGNsaWVudHNMaXN0KHRydWUgLyphY3RpdmVPbmx5Ki8sIHNvdXJjZSgpLCBmYWxzZSAvKnByZWZlcnJlZERldmljZU9ubHkqLyk7CisgICAgaWYgKGNsaWVudHMuc2l6ZSgpID4gMCkgeworICAgICAgICBlbmFibGVkRWZmZWN0cyA9IGNsaWVudHNbMF0tPmdldEVuYWJsZWRFZmZlY3RzKCk7CisgICAgfQorICAgIHJldHVybiBlbmFibGVkRWZmZWN0czsKK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c2V0QXBwU3RhdGUodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSkgeworICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzID0gY2xpZW50c0xpc3QoZmFsc2UgLyphY3RpdmVPbmx5Ki8pOworCisgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBjbGllbnRzKSB7CisgICAgICAgIGlmICh1aWQgPT0gY2xpZW50LT51aWQoKSkgeworICAgICAgICAgICAgYm9vbCB3YXNTaWxlbmNlZCA9IGNsaWVudC0+aXNTaWxlbmNlZCgpOworICAgICAgICAgICAgY2xpZW50LT5zZXRBcHBTdGF0ZShzdGF0ZSk7CisgICAgICAgICAgICBpZiAoY2xpZW50LT5hY3RpdmUoKSAmJiB3YXNTaWxlbmNlZCAhPSBjbGllbnQtPmlzU2lsZW5jZWQoKSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZUNsaWVudFJlY29yZGluZ0NvbmZpZ3VyYXRpb24oUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCwgY2xpZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBJRDogJWRcbiIsIGdldElkKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIERldmljZXMgJXNcbiIsIG1EZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgZ2V0RW5hYmxlZEVmZmVjdHMoKS5kdW1wKGRzdCwgMSAvKnNwYWNlcyovLCBmYWxzZSAvKnZlcmJvc2UqLyk7CisgICAgZHN0LT5hcHBlbmQoIiBBdWRpb1JlY29yZCBDbGllbnRzOlxuIik7CisgICAgQ2xpZW50TWFwSGFuZGxlcjxSZWNvcmRDbGllbnREZXNjcmlwdG9yPjo6ZHVtcChkc3QpOworICAgIGRzdC0+YXBwZW5kKCJcbiIpOwogfQogCiBib29sIEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0CkBAIC0zMjIsNTYgKzQ2NSw3NCBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi11aW50MzJfdCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6YWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMoYXVkaW9fZGV2aWNlc190IGRldmljZXMpIGNvbnN0Cit1aW50MzJfdCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6YWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAogewogICAgIHVpbnQzMl90IGNvdW50ID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXREZXNjcmlwdG9yID0gdmFsdWVBdChpKTsKICAgICAgICAgaWYgKGlucHV0RGVzY3JpcHRvci0+aXNBY3RpdmUoKSAmJgotICAgICAgICAgICAgICAgICgoZGV2aWNlcyA9PSBBVURJT19ERVZJQ0VfSU5fREVGQVVMVCkgfHwKLSAgICAgICAgICAgICAgICAgKChpbnB1dERlc2NyaXB0b3ItPm1EZXZpY2UgJiBkZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApKSkgeworICAgICAgICAgICAgICAgIChkZXZpY2VzLmlzRW1wdHkoKSB8fCBkZXZpY2VzLmNvbnRhaW5zKGlucHV0RGVzY3JpcHRvci0+Z2V0RGV2aWNlKCkpKSkgewogICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gY291bnQ7CiB9CiAKLVZlY3RvcjxzcCA8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gQXVkaW9JbnB1dENvbGxlY3Rpb246OmdldEFjdGl2ZUlucHV0cyhib29sIGlnbm9yZVZpcnR1YWxJbnB1dHMpCitWZWN0b3I8c3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpnZXRBY3RpdmVJbnB1dHMoKQogewogICAgIFZlY3RvcjxzcCA8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gYWN0aXZlSW5wdXRzOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewogICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gIGlucHV0RGVzY3JpcHRvciA9IHZhbHVlQXQoaSk7Ci0gICAgICAgIGlmICgoaW5wdXREZXNjcmlwdG9yLT5pc0FjdGl2ZSgpKQotICAgICAgICAgICAgICAgICYmICghaWdub3JlVmlydHVhbElucHV0cyB8fAotICAgICAgICAgICAgICAgICAgICAhaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoaW5wdXREZXNjcmlwdG9yLT5tRGV2aWNlKSkpIHsKKyAgICAgICAgaWYgKGlucHV0RGVzY3JpcHRvci0+aXNBY3RpdmUoKSkgewogICAgICAgICAgICAgYWN0aXZlSW5wdXRzLmFkZChpbnB1dERlc2NyaXB0b3IpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBhY3RpdmVJbnB1dHM7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6Z2V0U3VwcG9ydGVkRGV2aWNlcyhhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUpIGNvbnN0CitzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gQXVkaW9JbnB1dENvbGxlY3Rpb246OmdldElucHV0Rm9yQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSB2YWx1ZUZvcihoYW5kbGUpOwotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gaW5wdXREZXNjLT5tUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlc1R5cGUoKTsKLSAgICByZXR1cm4gZGV2aWNlczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAoaW5wdXREZXNjLT5nZXRDbGllbnQocG9ydElkKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXREZXNjOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOwogfQogCi1zdGF0dXNfdCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Cit2b2lkIEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjp0cmFja0VmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5JbnB1dHMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gSW5wdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChpbnB1dERlc2MtPm1Jb0hhbmRsZSA9PSBlZmZlY3QtPm1JbykgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0RGVzYy0+dHJhY2tFZmZlY3RFbmFibGVkKGVmZmVjdCwgZW5hYmxlZCk7CisgICAgICAgIH0KICAgICB9Cit9CiAKLSAgICByZXR1cm4gTk9fRVJST1I7Cit2b2lkIEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpjbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2UoCisgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRpc2Nvbm5lY3RlZERldmljZSkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGlucHV0RGVzYy0+Z2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudC0+cHJlZmVycmVkRGV2aWNlSWQoKSA9PSBkaXNjb25uZWN0ZWREZXZpY2UtPmdldElkKCkpIHsKKyAgICAgICAgICAgICAgICBjbGllbnQtPnNldFByZWZlcnJlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZCgiXG5JbnB1dHMgZHVtcDpcbiIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIi0gSW5wdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QpOworICAgIH0KIH0KIAogfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKaW5kZXggOTliNDVjOC4uOTdiN2EwMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCkBAIC0xOSwxMCArMTksMTIgQEAKIAogI2luY2x1ZGUgPEF1ZGlvUG9saWN5SW50ZXJmYWNlLmg+CiAjaW5jbHVkZSAiQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNaXguaCIKICNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKICNpbmNsdWRlICJBdWRpb0dhaW4uaCIKICNpbmNsdWRlICJWb2x1bWUuaCIKICNpbmNsdWRlICJId01vZHVsZS5oIgorI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CiAKQEAgLTM0LDE5ICszNiw4IEBACiAKIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPEF1ZGlvUG9ydD4mIHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQotICAgIDogbVBvcnQocG9ydCksIG1EZXZpY2UoQVVESU9fREVWSUNFX05PTkUpLAotICAgICAgbUNsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpLCBtUGF0Y2hIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpLCBtSWQoMCkKKyAgICA6IG1Qb3J0KHBvcnQpLCBtQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSkKIHsKLSAgICAvLyBjbGVhciB1c2FnZSBjb3VudCBmb3IgYWxsIHN0cmVhbSB0eXBlcwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7Ci0gICAgICAgIG1SZWZDb3VudFtpXSA9IDA7Ci0gICAgICAgIG1DdXJWb2x1bWVbaV0gPSAtMS4wOwotICAgICAgICBtTXV0ZUNvdW50W2ldID0gMDsKLSAgICAgICAgbVN0b3BUaW1lW2ldID0gMDsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7Ci0gICAgICAgIG1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSBmYWxzZTsKLSAgICB9CiAgICAgaWYgKG1Qb3J0LmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgbVBvcnQtPnBpY2tBdWRpb1Byb2ZpbGUobVNhbXBsaW5nUmF0ZSwgbUNoYW5uZWxNYXNrLCBtRm9ybWF0KTsKICAgICAgICAgaWYgKG1Qb3J0LT5tR2FpbnMuc2l6ZSgpID4gMCkgewpAQCAtNTUsNDggKzQ2LDg4IEBACiAgICAgfQogfQogCithdWRpb19jb25maWdfYmFzZV90IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Z2V0Q29uZmlnKCkgY29uc3QKK3sKKyAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IHsgLnNhbXBsZV9yYXRlID0gbVNhbXBsaW5nUmF0ZSwgLmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzaywKKyAgICAgICAgICAgIC5mb3JtYXQgPSBtRm9ybWF0IH07CisgICAgcmV0dXJuIGNvbmZpZzsKK30KKwogYXVkaW9fbW9kdWxlX2hhbmRsZV90IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Z2V0TW9kdWxlSGFuZGxlKCkgY29uc3QKIHsKICAgICByZXR1cm4gbVBvcnQuZ2V0KCkgIT0gbnVsbHB0ciA/IG1Qb3J0LT5nZXRNb2R1bGVIYW5kbGUoKSA6IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORTsKIH0KIAorYXVkaW9fcGF0Y2hfaGFuZGxlX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpnZXRQYXRjaEhhbmRsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1QYXRjaEhhbmRsZTsKK30KKwordm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBtUGF0Y2hIYW5kbGUgPSBoYW5kbGU7Cit9CisKIGF1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpnZXRJZCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1JZDsKIH0KIAotYXVkaW9fZGV2aWNlc190IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZGV2aWNlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbURldmljZTsKLX0KLQotYXVkaW9fZGV2aWNlc190IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydGVkRGV2aWNlcygpCi17Ci0gICAgcmV0dXJuIG1EZXZpY2U7Ci19Ci0KIGJvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzaGFyZXNId01vZHVsZVdpdGgoCiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpCiB7Ci0gICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgIHJldHVybiBzaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYy0+c3ViT3V0cHV0MSgpKSB8fAotICAgICAgICAgICAgICAgICAgICBzaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYy0+c3ViT3V0cHV0MigpKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gaGFzU2FtZUh3TW9kdWxlQXMob3V0cHV0RGVzYyk7Ci0gICAgfQorICAgIHJldHVybiBoYXNTYW1lSHdNb2R1bGVBcyhvdXRwdXREZXNjKTsKIH0KIAotdm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSkKK3ZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRTdG9wVGltZShjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIG5zZWNzX3Qgc3lzVGltZSkKIHsKLSAgICBpZiAoKGRlbHRhICsgKGludCltUmVmQ291bnRbc3RyZWFtXSkgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJjaGFuZ2VSZWZDb3VudCgpIGludmFsaWQgZGVsdGEgJWQgZm9yIHN0cmVhbSAlZCwgcmVmQ291bnQgJWQiLAotICAgICAgICAgICAgICBkZWx0YSwgc3RyZWFtLCBtUmVmQ291bnRbc3RyZWFtXSk7Ci0gICAgICAgIG1SZWZDb3VudFtzdHJlYW1dID0gMDsKKyAgICBtVm9sdW1lQWN0aXZpdGllc1tjbGllbnQtPnZvbHVtZVNvdXJjZSgpXS5zZXRTdG9wVGltZShzeXNUaW1lKTsKKyAgICBtUm91dGluZ0FjdGl2aXRpZXNbY2xpZW50LT5zdHJhdGVneSgpXS5zZXRTdG9wVGltZShzeXNUaW1lKTsKK30KKwordm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldENsaWVudEFjdGl2ZShjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKQoreworICAgIGF1dG8gY2xpZW50SXRlciA9IHN0ZDo6ZmluZChiZWdpbihtQWN0aXZlQ2xpZW50cyksIGVuZChtQWN0aXZlQ2xpZW50cyksIGNsaWVudCk7CisgICAgaWYgKGFjdGl2ZSA9PSAoY2xpZW50SXRlciAhPSBlbmQobUFjdGl2ZUNsaWVudHMpKSkgeworICAgICAgICBBTE9HVygiJXMoJXMpOiBpZ25vcmVkIGFjdGl2ZTogJWQsIGN1cnJlbnQgc3RyZWFtIGNvdW50ICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIGNsaWVudC0+dG9TaG9ydFN0cmluZygpLmNfc3RyKCksIGFjdGl2ZSwKKyAgICAgICAgICAgICAgbVJvdXRpbmdBY3Rpdml0aWVzLmF0KGNsaWVudC0+c3RyYXRlZ3koKSkuZ2V0QWN0aXZpdHlDb3VudCgpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBtUmVmQ291bnRbc3RyZWFtXSArPSBkZWx0YTsKLSAgICBBTE9HVigiY2hhbmdlUmVmQ291bnQoKSBzdHJlYW0gJWQsIGNvdW50ICVkIiwgc3RyZWFtLCBtUmVmQ291bnRbc3RyZWFtXSk7CisgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICBtQWN0aXZlQ2xpZW50cy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQWN0aXZlQ2xpZW50cy5lcmFzZShjbGllbnRJdGVyKTsKKyAgICB9CisgICAgY29uc3QgaW50IGRlbHRhID0gYWN0aXZlID8gMSA6IC0xOworICAgIC8vIElmIHBzIGlzIHVua25vd24sIGl0IGlzIHRpbWUgdG8gdHJhY2sgaXQhCisgICAgbVJvdXRpbmdBY3Rpdml0aWVzW2NsaWVudC0+c3RyYXRlZ3koKV0uY2hhbmdlQWN0aXZpdHlDb3VudChkZWx0YSk7CisgICAgbVZvbHVtZUFjdGl2aXRpZXNbY2xpZW50LT52b2x1bWVTb3VyY2UoKV0uY2hhbmdlQWN0aXZpdHlDb3VudChkZWx0YSk7CisKKyAgICAvLyBIYW5kbGUgbm9uLWNsaWVudC1zcGVjaWZpYyBhY3Rpdml0eSByZWYgY291bnQKKyAgICBpbnQzMl90IG9sZEdsb2JhbEFjdGl2ZUNvdW50ID0gbUdsb2JhbEFjdGl2ZUNvdW50OworICAgIGlmICghYWN0aXZlICYmIG1HbG9iYWxBY3RpdmVDb3VudCA8IDEpIHsKKyAgICAgICAgQUxPR1coIiVzKCVzKTogaW52YWxpZCBkZWFjdGl2YXRpb24gd2l0aCBnbG9iYWxSZWZDb3VudCAlZCIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBjbGllbnQtPnRvU2hvcnRTdHJpbmcoKS5jX3N0cigpLCBtR2xvYmFsQWN0aXZlQ291bnQpOworICAgICAgICBtR2xvYmFsQWN0aXZlQ291bnQgPSAxOworICAgIH0KKyAgICBtR2xvYmFsQWN0aXZlQ291bnQgKz0gZGVsdGE7CisKKyAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gbVBvbGljeU1peC5wcm9tb3RlKCk7CisgICAgaWYgKChwb2xpY3lNaXggIT0gTlVMTCkgJiYgKChwb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpIHsKKyAgICAgICAgaWYgKChvbGRHbG9iYWxBY3RpdmVDb3VudCA9PSAwKSB8fCAobUdsb2JhbEFjdGl2ZUNvdW50ID09IDApKSB7CisgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgIG1HbG9iYWxBY3RpdmVDb3VudCA+IDAgPyBNSVhfU1RBVEVfTUlYSU5HIDogTUlYX1NUQVRFX0lETEUpOworICAgICAgICB9CisgICAgfQorICAgIGNsaWVudC0+c2V0QWN0aXZlKGFjdGl2ZSk7Cit9CisKK2Jvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0FjdGl2ZShWb2x1bWVTb3VyY2UgdnMsIHVpbnQzMl90IGluUGFzdE1zLCBuc2Vjc190IHN5c1RpbWUpIGNvbnN0Cit7CisgICAgcmV0dXJuICh2cyA9PSBWT0xVTUVfU09VUkNFX05PTkUpID8KKyAgICAgICAgICAgICAgICBpc0FjdGl2ZShpblBhc3RNcykgOiAobVZvbHVtZUFjdGl2aXRpZXMuZmluZCh2cykgIT0gc3RkOjplbmQobVZvbHVtZUFjdGl2aXRpZXMpPworICAgICAgICAgICAgICAgIG1Wb2x1bWVBY3Rpdml0aWVzLmF0KHZzKS5pc0FjdGl2ZShpblBhc3RNcywgc3lzVGltZSkgOiBmYWxzZSk7CiB9CiAKIGJvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0FjdGl2ZSh1aW50MzJfdCBpblBhc3RNcykgY29uc3QKQEAgLTEwNSw1NCArMTM2LDM1IEBACiAgICAgaWYgKGluUGFzdE1zICE9IDApIHsKICAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBpZiAoaSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBtVm9sdW1lQWN0aXZpdGllcykgeworICAgICAgICBpZiAoaXRlci5maXJzdCA9PSBzdHJlYW1Ub1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fUEFUQ0gpKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBpZiAoaXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgIGlmIChpdGVyLnNlY29uZC5pc0FjdGl2ZShpblBhc3RNcywgc3lzVGltZSkpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSkgY29uc3QKLXsKLSAgICBpZiAobVJlZkNvdW50W3N0cmVhbV0gIT0gMCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGluUGFzdE1zID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoc3lzVGltZSA9PSAwKSB7Ci0gICAgICAgIHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgfQotICAgIGlmIChuczJtcyhzeXNUaW1lIC0gbVN0b3BUaW1lW3N0cmVhbV0pIDwgaW5QYXN0TXMpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotCiBib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNGaXhlZFZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlIF9fdW51c2VkKQogewogICAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZShmbG9hdCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlIF9fdW51c2VkLAorYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZShmbG9hdCB2b2x1bWVEYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyZWFtVHlwZVZlY3RvciAmLypzdHJlYW1zKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAvKmRldmljZSovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQogewogICAgIC8vIFdlIGFjdHVhbGx5IGNoYW5nZSB0aGUgdm9sdW1lIGlmOgogICAgIC8vIC0gdGhlIGZsb2F0IHZhbHVlIHJldHVybmVkIGJ5IGNvbXB1dGVWb2x1bWUoKSBjaGFuZ2VkCiAgICAgLy8gLSB0aGUgZm9yY2UgZmxhZyBpcyBzZXQKLSAgICBpZiAodm9sdW1lICE9IG1DdXJWb2x1bWVbc3RyZWFtXSB8fCBmb3JjZSkgewotICAgICAgICBBTE9HVigic2V0Vm9sdW1lKCkgZm9yIHN0cmVhbSAlZCwgdm9sdW1lICVmLCBkZWxheSAlZCIsIHN0cmVhbSwgdm9sdW1lLCBkZWxheU1zKTsKLSAgICAgICAgbUN1clZvbHVtZVtzdHJlYW1dID0gdm9sdW1lOworICAgIGlmICh2b2x1bWVEYiAhPSBnZXRDdXJWb2x1bWUodm9sdW1lU291cmNlKSB8fCBmb3JjZSkgeworICAgICAgICBBTE9HVigiJXMgZm9yIHZvbHVtZVNyYyAlZCwgdm9sdW1lICVmLCBkZWxheSAlZCIsIF9fZnVuY19fLCB2b2x1bWVTb3VyY2UsIHZvbHVtZURiLCBkZWxheU1zKTsKKyAgICAgICAgc2V0Q3VyVm9sdW1lKHZvbHVtZVNvdXJjZSwgdm9sdW1lRGIpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTg0LDMyICsxOTYsNTUgQEAKICAgICBwb3J0LT5leHQubWl4Lmh3X21vZHVsZSA9IGdldE1vZHVsZUhhbmRsZSgpOwogfQogCi1zdGF0dXNfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQorVHJhY2tDbGllbnRWZWN0b3IgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjbGllbnRzTGlzdChib29sIGFjdGl2ZU9ubHksIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcmVmZXJyZWREZXZpY2VPbmx5KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIElEOiAlZFxuIiwgbUlkKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcm1hdDogJTA4eFxuIiwgbUZvcm1hdCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIERldmljZXMgJTA4eFxuIiwgZGV2aWNlKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU3RyZWFtIHZvbHVtZSByZWZDb3VudCBtdXRlQ291bnRcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlMDJkICAgICAlLjAzZiAgICAgJTAyZCAgICAgICAlMDJkXG4iLAotICAgICAgICAgICAgICAgICBpLCBtQ3VyVm9sdW1lW2ldLCBtUmVmQ291bnRbaV0sIG1NdXRlQ291bnRbaV0pOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgVHJhY2tDbGllbnRWZWN0b3IgY2xpZW50czsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgaWYgKCghYWN0aXZlT25seSB8fCBjbGllbnQtPmFjdGl2ZSgpKQorICAgICAgICAgICAgJiYgKHN0cmF0ZWd5ID09IFBST0RVQ1RfU1RSQVRFR1lfTk9ORSB8fCBzdHJhdGVneSA9PSBjbGllbnQtPnN0cmF0ZWd5KCkpCisgICAgICAgICAgICAmJiAoIXByZWZlcnJlZERldmljZU9ubHkgfHwKKyAgICAgICAgICAgICAgICAoY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UoKSAmJiAhY2xpZW50LT5pc1ByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZSgpKSkpIHsKKyAgICAgICAgICAgIGNsaWVudHMucHVzaF9iYWNrKGNsaWVudCk7CisgICAgICAgIH0KICAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgcmV0dXJuIGNsaWVudHM7Cit9CiAKLSAgICByZXR1cm4gTk9fRVJST1I7Citib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNBbnlBY3RpdmUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZVRvSWdub3JlKSBjb25zdAoreworICAgIHJldHVybiBzdGQ6OmZpbmRfaWYoYmVnaW4obUFjdGl2ZUNsaWVudHMpLCBlbmQobUFjdGl2ZUNsaWVudHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgWyZ2b2x1bWVTb3VyY2VUb0lnbm9yZV0oY29uc3QgYXV0byAmY2xpZW50KSB7CisgICAgICAgIHJldHVybiBjbGllbnQtPnZvbHVtZVNvdXJjZSgpICE9IHZvbHVtZVNvdXJjZVRvSWdub3JlOyB9KSAhPSBlbmQobUFjdGl2ZUNsaWVudHMpOworfQorCit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBJRDogJWRcbiIsIG1JZCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBGb3JtYXQ6ICUwOHhcbiIsIG1Gb3JtYXQpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBEZXZpY2VzOiAlc1xuIiwgZGV2aWNlcygpLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBHbG9iYWwgYWN0aXZlIGNvdW50OiAldVxuIiwgbUdsb2JhbEFjdGl2ZUNvdW50KTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBtUm91dGluZ0FjdGl2aXRpZXMpIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBQcm9kdWN0IFN0cmF0ZWd5IGlkOiAlZCIsIGl0ZXIuZmlyc3QpOworICAgICAgICBpdGVyLnNlY29uZC5kdW1wKGRzdCwgNCk7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Wb2x1bWVBY3Rpdml0aWVzKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgVm9sdW1lIEFjdGl2aXRpZXMgaWQ6ICVkIiwgaXRlci5maXJzdCk7CisgICAgICAgIGl0ZXIuc2Vjb25kLmR1bXAoZHN0LCA0KTsKKyAgICB9CisgICAgZHN0LT5hcHBlbmQoIiBBdWRpb1RyYWNrIENsaWVudHM6XG4iKTsKKyAgICBDbGllbnRNYXBIYW5kbGVyPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj46OmR1bXAoZHN0KTsKKyAgICBkc3QtPmFwcGVuZCgiXG4iKTsKKyAgICBpZiAoIW1BY3RpdmVDbGllbnRzLmVtcHR5KCkpIHsKKyAgICAgICAgZHN0LT5hcHBlbmQoIiBBdWRpb1RyYWNrIGFjdGl2ZSAoc3RyZWFtKSBjbGllbnRzOlxuIik7CisgICAgICAgIHNpemVfdCBpbmRleCA9IDA7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogbUFjdGl2ZUNsaWVudHMpIHsKKyAgICAgICAgICAgIGNsaWVudC0+ZHVtcChkc3QsIDIsIGluZGV4KyspOworICAgICAgICB9CisgICAgICAgIGRzdC0+YXBwZW5kKCIgXG4iKTsKKyAgICB9CiB9CiAKIHZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpsb2coY29uc3QgY2hhciogaW5kZW50KQpAQCAtMjIzLDQzICsyNTgsMzQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQogICAgIDogQXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIGNsaWVudEludGVyZmFjZSksCiAgICAgbVByb2ZpbGUocHJvZmlsZSksIG1Jb0hhbmRsZShBVURJT19JT19IQU5ETEVfTk9ORSksIG1MYXRlbmN5KDApLAotICAgIG1GbGFncygoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpMCksIG1Qb2xpY3lNaXgoTlVMTCksCisgICAgbUZsYWdzKChhdWRpb19vdXRwdXRfZmxhZ3NfdCkwKSwKICAgICBtT3V0cHV0MSgwKSwgbU91dHB1dDIoMCksIG1EaXJlY3RPcGVuQ291bnQoMCksCi0gICAgbURpcmVjdENsaWVudFNlc3Npb24oQVVESU9fU0VTU0lPTl9OT05FKSwgbUdsb2JhbFJlZkNvdW50KDApCisgICAgbURpcmVjdENsaWVudFNlc3Npb24oQVVESU9fU0VTU0lPTl9OT05FKQogewogICAgIGlmIChwcm9maWxlICE9IE5VTEwpIHsKICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KXByb2ZpbGUtPmdldEZsYWdzKCk7CiAgICAgfQogfQogCi1zdGF0dXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit2b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBMYXRlbmN5OiAlZFxuIiwgbUxhdGVuY3kpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRmxhZ3MgJTA4eFxuIiwgbUZsYWdzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoZmQpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgTGF0ZW5jeTogJWRcbiIsIG1MYXRlbmN5KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEZsYWdzICUwOHhcbiIsIG1GbGFncyk7CisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGRzdCk7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZGV2aWNlKCkgY29uc3QKK0RldmljZVZlY3RvciBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZGV2aWNlcygpIGNvbnN0CiB7CiAgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgIHJldHVybiAoYXVkaW9fZGV2aWNlc190KShtT3V0cHV0MS0+bURldmljZSB8IG1PdXRwdXQyLT5tRGV2aWNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbURldmljZTsKKyAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZXMgPSBtT3V0cHV0MS0+ZGV2aWNlcygpOworICAgICAgICBkZXZpY2VzLm1lcmdlKG1PdXRwdXQyLT5kZXZpY2VzKCkpOworICAgICAgICByZXR1cm4gZGV2aWNlczsKICAgICB9CisgICAgcmV0dXJuIG1EZXZpY2VzOwogfQogCiBib29sIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzaGFyZXNId01vZHVsZVdpdGgoCi0gICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpCisgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYykKIHsKICAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKICAgICAgICAgcmV0dXJuIG1PdXRwdXQxLT5zaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYykgfHwgbU91dHB1dDItPnNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjKTsKQEAgLTI3MSwxMiArMjk3LDM5IEBACiAgICAgfQogfQogCi1hdWRpb19kZXZpY2VzX3QgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRlZERldmljZXMoKQorRGV2aWNlVmVjdG9yIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzdXBwb3J0ZWREZXZpY2VzKCkgY29uc3QKIHsKICAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpKG1PdXRwdXQxLT5zdXBwb3J0ZWREZXZpY2VzKCkgfCBtT3V0cHV0Mi0+c3VwcG9ydGVkRGV2aWNlcygpKTsKKyAgICAgICAgRGV2aWNlVmVjdG9yIHN1cHBvcnRlZERldmljZXMgPSBtT3V0cHV0MS0+c3VwcG9ydGVkRGV2aWNlcygpOworICAgICAgICBzdXBwb3J0ZWREZXZpY2VzLm1lcmdlKG1PdXRwdXQyLT5zdXBwb3J0ZWREZXZpY2VzKCkpOworICAgICAgICByZXR1cm4gc3VwcG9ydGVkRGV2aWNlczsKKyAgICB9CisgICAgcmV0dXJuIG1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCk7Cit9CisKK2Jvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRzRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN1cHBvcnRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpOworfQorCitib29sIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzdXBwb3J0c0FsbERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAoreworICAgIHJldHVybiBzdXBwb3J0ZWREZXZpY2VzKCkuY29udGFpbnNBbGxEZXZpY2VzKGRldmljZXMpOworfQorCitEZXZpY2VWZWN0b3IgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmZpbHRlclN1cHBvcnRlZERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAoreworICAgIERldmljZVZlY3RvciBmaWx0ZXJlZERldmljZXMgPSBzdXBwb3J0ZWREZXZpY2VzKCk7CisgICAgcmV0dXJuIGZpbHRlcmVkRGV2aWNlcy5maWx0ZXIoZGV2aWNlcyk7Cit9CisKK2Jvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmRldmljZVN1cHBvcnRzRW5jb2RlZEZvcm1hdHMoYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIChtT3V0cHV0MS0+ZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhkZXZpY2UpCisgICAgICAgICAgICAgICAgICAgIHx8IG1PdXRwdXQyLT5kZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGRldmljZSkpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlc1R5cGUoKTsKKyAgICAgICByZXR1cm4gbVByb2ZpbGUtPmRldmljZVN1cHBvcnRzRW5jb2RlZEZvcm1hdHMoZGV2aWNlKTsKICAgICB9CiB9CiAKQEAgLTI4OSw0MSArMzQyLDE2IEBACiAgICAgfQogfQogCi12b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEpCit2b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRDbGllbnRBY3RpdmUoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBib29sIGFjdGl2ZSkKIHsKICAgICAvLyBmb3J3YXJkIHVzYWdlIGNvdW50IGNoYW5nZSB0byBhdHRhY2hlZCBvdXRwdXRzCiAgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgIG1PdXRwdXQxLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIGRlbHRhKTsKLSAgICAgICAgbU91dHB1dDItPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgZGVsdGEpOworICAgICAgICBtT3V0cHV0MS0+c2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgYWN0aXZlKTsKKyAgICAgICAgbU91dHB1dDItPnNldENsaWVudEFjdGl2ZShjbGllbnQsIGFjdGl2ZSk7CiAgICAgfQotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCBkZWx0YSk7Ci0KLSAgICAvLyBoYW5kbGUgc3RyZWFtLWluZGVwZW5kZW50IHJlZiBjb3VudAotICAgIHVpbnQzMl90IG9sZEdsb2JhbFJlZkNvdW50ID0gbUdsb2JhbFJlZkNvdW50OwotICAgIGlmICgoZGVsdGEgKyAoaW50KW1HbG9iYWxSZWZDb3VudCkgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJjaGFuZ2VSZWZDb3VudCgpIGludmFsaWQgZGVsdGEgJWQgZ2xvYmFsUmVmQ291bnQgJWQiLCBkZWx0YSwgbUdsb2JhbFJlZkNvdW50KTsKLSAgICAgICAgbUdsb2JhbFJlZkNvdW50ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBtR2xvYmFsUmVmQ291bnQgKz0gZGVsdGE7Ci0gICAgfQotICAgIGlmICgob2xkR2xvYmFsUmVmQ291bnQgPT0gMCkgJiYgKG1HbG9iYWxSZWZDb3VudCA+IDApKSB7Ci0gICAgICAgIGlmICgobVBvbGljeU1peCAhPSBOVUxMKSAmJiAoKG1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKG1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfTUlYSU5HKTsKLSAgICAgICAgfQotCi0gICAgfSBlbHNlIGlmICgob2xkR2xvYmFsUmVmQ291bnQgPiAwKSAmJiAobUdsb2JhbFJlZkNvdW50ID09IDApKSB7Ci0gICAgICAgIGlmICgobVBvbGljeU1peCAhPSBOVUxMKSAmJiAoKG1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKG1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfSURMRSk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRDbGllbnRBY3RpdmUoY2xpZW50LCBhY3RpdmUpOwogfQogCi0KIGJvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzRml4ZWRWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSkKIHsKICAgICAvLyB1bml0IGdhaW4gaWYgcmVyb3V0aW5nIHRvIGV4dGVybmFsIHBvbGljeQpAQCAtMzY0LDM0ICszOTIsNzIgQEAKICAgICAgICAgICAgIG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgPyBBVURJT19MQVRFTkNZX0xPVyA6IEFVRElPX0xBVEVOQ1lfTk9STUFMOwogfQogCi1ib29sIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2cywgY29uc3QgU3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtVHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCiB7Ci0gICAgYm9vbCBjaGFuZ2VkID0gQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUodm9sdW1lLCBzdHJlYW0sIGRldmljZSwgZGVsYXlNcywgZm9yY2UpOwotCi0gICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgLy8gRm9yY2UgVk9JQ0VfQ0FMTCB0byB0cmFjayBCTFVFVE9PVEhfU0NPIHN0cmVhbSB2b2x1bWUgd2hlbiBibHVldG9vdGggYXVkaW8gaXMKLSAgICAgICAgLy8gZW5hYmxlZAotICAgICAgICBmbG9hdCB2b2x1bWUgPSBWb2x1bWU6OkRiVG9BbXBsKG1DdXJWb2x1bWVbc3RyZWFtXSk7Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08pIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIHZvbHVtZSwgbUlvSGFuZGxlLCBkZWxheU1zKTsKLSAgICAgICAgfQotICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2b2x1bWUsIG1Jb0hhbmRsZSwgZGVsYXlNcyk7CisgICAgU3RyZWFtVHlwZVZlY3RvciBzdHJlYW1zID0gc3RyZWFtVHlwZXM7CisgICAgaWYgKCFBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZSh2b2x1bWVEYiwgdnMsIHN0cmVhbVR5cGVzLCBkZXZpY2UsIGRlbGF5TXMsIGZvcmNlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiBjaGFuZ2VkOworICAgIGlmIChzdHJlYW1zLmVtcHR5KCkpIHsKKyAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2soQVVESU9fU1RSRUFNX01VU0lDKTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2VQb3J0IDogZGV2aWNlcygpKSB7CisgICAgICAgIC8vIEFQTSBsb29wcyBvbiBhbGwgZ3JvdXAsIHNvIGZpbHRlciBvbiBhY3RpdmUgZ3JvdXAgdG8gc2V0IHRoZSBwb3J0IGdhaW4sCisgICAgICAgIC8vIGxldCB0aGUgb3RoZXIgZ3JvdXBzIHNldCB0aGUgc3RyZWFtIHZvbHVtZSBhcyBwZXIgbGVnYWN5CisgICAgICAgIC8vIFRPRE86IFBhc3MgaW4gdGhlIGRldmljZSBhZGRyZXNzIGFuZCBjaGVjayBhZ2FpbnN0IGl0LgorICAgICAgICBpZiAoZGV2aWNlID09IGRldmljZVBvcnQtPnR5cGUoKSAmJgorICAgICAgICAgICAgICAgIGRldmljZVBvcnQtPmhhc0dhaW5Db250cm9sbGVyKHRydWUpICYmIGlzQWN0aXZlKHZzKSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBkZXZpY2UgJXMgaGFzIGdhaW4gY29udHJvbGxlciIsIF9fZnVuY19fLCBkZXZpY2VQb3J0LT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgLy8gQHRvZG86IGhlcmUgd2UgbWlnaHQgYmUgaW4gdHJvdWJsZSBpZiB0aGUgU3dPdXRwdXQgaGFzIHNldmVyYWwgYWN0aXZlIGNsaWVudHMgd2l0aAorICAgICAgICAgICAgLy8gZGlmZmVyZW50IFZvbHVtZSBTb3VyY2UgKG9yIGlmIHdlIGFsbG93IHNldmVyYWwgY3VydmVzIHdpdGhpbiBzYW1lIHZvbHVtZSBncm91cCkKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBAdG9kbzogZGVmYXVsdCBzdHJlYW0gdm9sdW1lIHRvIG1heCAoMCkgd2hlbiB1c2luZyBIVyBQb3J0IGdhaW4/CisgICAgICAgICAgICBmbG9hdCB2b2x1bWVBbXBsID0gVm9sdW1lOjpEYlRvQW1wbCgwKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtIDogc3RyZWFtcykgeworICAgICAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZUFtcGwsIG1Jb0hhbmRsZSwgZGVsYXlNcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEF1ZGlvR2FpbnMgZ2FpbnMgPSBkZXZpY2VQb3J0LT5nZXRHYWlucygpOworICAgICAgICAgICAgaW50IGdhaW5NaW5WYWx1ZUluTWIgPSBnYWluc1swXS0+Z2V0TWluVmFsdWVJbk1iKCk7CisgICAgICAgICAgICBpbnQgZ2Fpbk1heFZhbHVlSW5NYiA9IGdhaW5zWzBdLT5nZXRNYXhWYWx1ZUluTWIoKTsKKyAgICAgICAgICAgIGludCBnYWluU3RlcFZhbHVlSW5NYiA9IGdhaW5zWzBdLT5nZXRTdGVwVmFsdWVJbk1iKCk7CisgICAgICAgICAgICBpbnQgZ2FpblZhbHVlTWIgPSAoKHZvbHVtZURiICogMTAwKS8gZ2FpblN0ZXBWYWx1ZUluTWIpICogZ2FpblN0ZXBWYWx1ZUluTWI7CisgICAgICAgICAgICBnYWluVmFsdWVNYiA9IHN0ZDo6bWF4KGdhaW5NaW5WYWx1ZUluTWIsIHN0ZDo6bWluKGdhaW5WYWx1ZU1iLCBnYWluTWF4VmFsdWVJbk1iKSk7CisKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnIGNvbmZpZyA9IHt9OworICAgICAgICAgICAgZGV2aWNlUG9ydC0+dG9BdWRpb1BvcnRDb25maWcoJmNvbmZpZyk7CisgICAgICAgICAgICBjb25maWcuY29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19HQUlOOworICAgICAgICAgICAgY29uZmlnLmdhaW4udmFsdWVzWzBdID0gZ2FpblZhbHVlTWI7CisgICAgICAgICAgICByZXR1cm4gbUNsaWVudEludGVyZmFjZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZjb25maWcsIDApID09IE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIC8vIEZvcmNlIFZPSUNFX0NBTEwgdG8gdHJhY2sgQkxVRVRPT1RIX1NDTyBzdHJlYW0gdm9sdW1lIHdoZW4gYmx1ZXRvb3RoIGF1ZGlvIGlzIGVuYWJsZWQKKyAgICBmbG9hdCB2b2x1bWVBbXBsID0gVm9sdW1lOjpEYlRvQW1wbChnZXRDdXJWb2x1bWUodnMpKTsKKyAgICBpZiAoaGFzU3RyZWFtKHN0cmVhbXMsIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPKSkgeworICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIHZvbHVtZUFtcGwsIG1Jb0hhbmRsZSwgZGVsYXlNcyk7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtIDogc3RyZWFtcykgeworICAgICAgICBBTE9HVigiJXMgb3V0cHV0ICVkIGZvciB2b2x1bWVTb3VyY2UgJWQsIHZvbHVtZSAlZiwgZGVsYXkgJWQgc3RyZWFtPSVzIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIG1Jb0hhbmRsZSwgdnMsIHZvbHVtZURiLCBkZWxheU1zLCB0b1N0cmluZyhzdHJlYW0pLmNfc3RyKCkpOworICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2b2x1bWVBbXBsLCBtSW9IYW5kbGUsIGRlbGF5TXMpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdHVzX3QgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6Om9wZW4oY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQpCiB7CisgICAgbURldmljZXMgPSBkZXZpY2VzOworICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MgPSBkZXZpY2VzLmdldEZpcnN0VmFsaWRBZGRyZXNzKCk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGRldmljZXMudHlwZXMoKTsKKwogICAgIGF1ZGlvX2NvbmZpZ190IGxDb25maWc7CiAgICAgaWYgKGNvbmZpZyA9PSBudWxscHRyKSB7CiAgICAgICAgIGxDb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CkBAIC00MDIsNyArNDY4LDYgQEAKICAgICAgICAgbENvbmZpZyA9ICpjb25maWc7CiAgICAgfQogCi0gICAgbURldmljZSA9IGRldmljZTsKICAgICAvLyBpZiB0aGUgc2VsZWN0ZWQgcHJvZmlsZSBpcyBvZmZsb2FkZWQgYW5kIG5vIG9mZmxvYWQgaW5mbyB3YXMgc3BlY2lmaWVkLAogICAgIC8vIGNyZWF0ZSBhIGRlZmF1bHQgb25lCiAgICAgaWYgKChtUHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICYmCkBAIC00MjAsMTkgKzQ4NSwxOSBAQAogCiAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShtRmxhZ3MgfCBmbGFncyk7CiAKLSAgICBBTE9HVigib3BlbmluZyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IGFkZHJlc3MgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKLSAgICAgICAgICBtRGV2aWNlLCBhZGRyZXNzLnN0cmluZygpLCBtUHJvZmlsZS5nZXQoKSwgbVByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7CisgICAgQUxPR1YoIm9wZW5pbmcgb3V0cHV0IGZvciBkZXZpY2UgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKKyAgICAgICAgICBtRGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksIG1Qcm9maWxlLmdldCgpLCBtUHJvZmlsZS0+Z2V0TmFtZSgpLnN0cmluZygpKTsKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IG1DbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQobVByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1MYXRlbmN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzKTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1EZXZpY2UgIT0gZGV2aWNlLAorICAgIExPR19BTFdBWVNfRkFUQUxfSUYobURldmljZXMudHlwZXMoKSAhPSBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgb3Blbk91dHB1dCByZXR1cm5lZCBkZXZpY2UgJTA4eCB3aGVuIGdpdmVuIGRldmljZSAlMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbURldmljZSwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbURldmljZXMudHlwZXMoKSwgZGV2aWNlKTsKIAogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigqb3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FLApAQCAtNDkxLDYgKzU1NiwxNyBAQAogdm9pZCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Y2xvc2UoKQogewogICAgIGlmIChtSW9IYW5kbGUgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgLy8gY2xlYW4gdXAgYWN0aXZlIGNsaWVudHMgaWYgYW55IChjYW4gaGFwcGVuIGlmIGNsb3NlKCkgaXMgY2FsbGVkIHRvIGZvcmNlCisgICAgICAgIC8vIGNsaWVudHMgdG8gcmVjb25uZWN0CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMgY2xpZW50IHdpdGggcG9ydCBJRCAlZCBzdGlsbCBhY3RpdmUgb24gb3V0cHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2xpZW50LT5wb3J0SWQoKSwgbUlkKTsKKyAgICAgICAgICAgICAgICBzZXRDbGllbnRBY3RpdmUoY2xpZW50LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CiAgICAgICAgIHBhcmFtLmFkZChTdHJpbmc4KCJjbG9zaW5nIiksIFN0cmluZzgoInRydWUiKSk7CiAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobUlvSGFuZGxlLCBwYXJhbS50b1N0cmluZygpKTsKQEAgLTQ5OSwxMSArNTc1LDYgQEAKIAogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1Qcm9maWxlLT5jdXJPcGVuQ291bnQgPCAxLCAiJXMgcHJvZmlsZSBvcGVuIGNvdW50ICV1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQpOwotICAgICAgICAvLyBkbyBub3QgY2FsbCBzdG9wKCkgaGVyZSBhcyBzdG9wKCkgaXMgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIGFmdGVyIGNoYW5nZVJlZkNvdW50KC0xKQotICAgICAgICAvLyBhbmQgd2UgZG9uJ3Qga25vdyBob3cgbWFueSBzdHJlYW1zIGFyZSBzdGlsbCBhY3RpdmUgYXQgdGhpcyB0aW1lCi0gICAgICAgIGlmIChpc0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgICBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQtLTsKLSAgICAgICAgfQogICAgICAgICBtUHJvZmlsZS0+Y3VyT3BlbkNvdW50LS07CiAgICAgICAgIG1Jb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIH0KQEAgLTUzNCw1NSArNjA1LDQyIEBACiB9CiAKIC8vIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yIGltcGxlbWVudGF0aW9uCi1Id0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6SHdBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiYgc291cmNlLAorSHdBdWRpb091dHB1dERlc2NyaXB0b3I6Okh3QXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKLSAgICA6IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihzb3VyY2UtPm1EZXZpY2UsIGNsaWVudEludGVyZmFjZSksCisgICAgOiBBdWRpb091dHB1dERlc2NyaXB0b3Ioc291cmNlLT5zcmNEZXZpY2UoKSwgY2xpZW50SW50ZXJmYWNlKSwKICAgICAgIG1Tb3VyY2Uoc291cmNlKQogewogfQogCi1zdGF0dXNfdCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit2b2lkIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChmZCk7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJTb3VyY2U6XG4iKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgbVNvdXJjZS0+ZHVtcChmZCk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydGVkRGV2aWNlcygpCi17Ci0gICAgcmV0dXJuIG1EZXZpY2U7CisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGRzdCk7CisgICAgZHN0LT5hcHBlbmQoIlNvdXJjZTpcbiIpOworICAgIG1Tb3VyY2UtPmR1bXAoZHN0LCAwLCAwKTsKIH0KIAogdm9pZCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0CiB7Ci0gICAgbVNvdXJjZS0+bURldmljZS0+dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOworICAgIG1Tb3VyY2UtPnNyY0RldmljZSgpLT50b0F1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7CiB9CiAKIHZvaWQgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAogewotICAgIG1Tb3VyY2UtPm1EZXZpY2UtPnRvQXVkaW9Qb3J0KHBvcnQpOworICAgIG1Tb3VyY2UtPnNyY0RldmljZSgpLT50b0F1ZGlvUG9ydChwb3J0KTsKIH0KIAogCi1ib29sIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorYm9vbCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIGNvbnN0IFN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCiB7Ci0gICAgYm9vbCBjaGFuZ2VkID0gQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUodm9sdW1lLCBzdHJlYW0sIGRldmljZSwgZGVsYXlNcywgZm9yY2UpOworICAgIGJvb2wgY2hhbmdlZCA9CisgICAgICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKHZvbHVtZURiLCB2b2x1bWVTb3VyY2UsIHN0cmVhbXMsIGRldmljZSwgZGVsYXlNcywgZm9yY2UpOwogCiAgICAgaWYgKGNoYW5nZWQpIHsKICAgICAgIC8vIFRPRE86IHVzZSBnYWluIGNvbnRyb2xsZXIgb24gc291cmNlIGRldmljZSBpZiBhbnkgdG8gYWRqdXN0IHZvbHVtZQpAQCAtNTkxLDM5ICs2NDksMzggQEAKIH0KIAogLy8gU3dBdWRpb091dHB1dENvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24KLWJvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK2Jvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzQWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewogICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRoaXMtPnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdGhpcy0+dmFsdWVBdChpKTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSh2b2x1bWVTb3VyY2UsIGluUGFzdE1zLCBzeXNUaW1lKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmVhbUFjdGl2ZUxvY2FsbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAorYm9vbCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNBY3RpdmVMb2NhbGx5KFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewogICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRoaXMtPnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdGhpcy0+dmFsdWVBdChpKTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpCi0gICAgICAgICAgICAgICAgJiYgKChvdXRwdXREZXNjLT5kZXZpY2UoKSAmIEFQTV9BVURJT19PVVRfREVWSUNFX1JFTU9URV9BTEwpID09IDApKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSh2b2x1bWVTb3VyY2UsIGluUGFzdE1zLCBzeXNUaW1lKQorICAgICAgICAgICAgICAgICYmICgob3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCkgJiBBUE1fQVVESU9fT1VUX0RFVklDRV9SRU1PVEVfQUxMKSA9PSAwKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Citib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0FjdGl2ZVJlbW90ZWx5KFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewogICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKLSAgICAgICAgaWYgKCgob3V0cHV0RGVzYy0+ZGV2aWNlKCkgJiBBUE1fQVVESU9fT1VUX0RFVklDRV9SRU1PVEVfQUxMKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgIGlmICgoKG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpICYgQVBNX0FVRElPX09VVF9ERVZJQ0VfUkVNT1RFX0FMTCkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc0FjdGl2ZSh2b2x1bWVTb3VyY2UsIGluUGFzdE1zLCBzeXNUaW1lKSkgewogICAgICAgICAgICAgLy8gZG8gbm90IGNvbnNpZGVyIHJlIHJvdXRpbmcgKHdoZW4gdGhlIG91dHB1dCBpcyBnb2luZyB0byBhIGR5bmFtaWMgcG9saWN5KQogICAgICAgICAgICAgLy8gYXMgInJlbW90ZSBwbGF5YmFjayIKICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKQEAgLTYzNCwxMSArNjkxLDI4IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcywgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG90aGVyRGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChkZXNjLT5zaGFyZXNId01vZHVsZVdpdGgob3RoZXJEZXNjKSAmJgorICAgICAgICAgICAgICAgIG90aGVyRGVzYy0+aXNTdHJhdGVneUFjdGl2ZShwcywgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIGF1ZGlvX2lvX2hhbmRsZV90IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRBMmRwT3V0cHV0KCkgY29uc3QKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKLSAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiBvdXRwdXREZXNjLT5kZXZpY2UoKSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApIHsKKyAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJgorICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpICAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFAgJiYKKyAgICAgICAgICAgICBvdXRwdXREZXNjLT5kZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKAorICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCkpIHsKICAgICAgICAgICAgIHJldHVybiB0aGlzLT5rZXlBdChpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTY1MCwxMiArNzI0LDExIEBACiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHByaW1hcnlPdXRwdXQgPSBnZXRQcmltYXJ5T3V0cHV0KCk7CiAKICAgICBpZiAoKHByaW1hcnlPdXRwdXQgIT0gTlVMTCkgJiYgKHByaW1hcnlPdXRwdXQtPm1Qcm9maWxlICE9IE5VTEwpCi0gICAgICAgICYmIChwcmltYXJ5T3V0cHV0LT5tUHJvZmlsZS0+bU1vZHVsZSAhPSBOVUxMKSkgewotICAgICAgICBzcDxId01vZHVsZT4gcHJpbWFyeUh3TW9kdWxlID0gcHJpbWFyeU91dHB1dC0+bVByb2ZpbGUtPm1Nb2R1bGU7Ci0gICAgICAgIFZlY3RvciA8c3A8SU9Qcm9maWxlPj4gcHJpbWFyeUh3TW9kdWxlT3V0cHV0UHJvZmlsZXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5SHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJpbWFyeUh3TW9kdWxlT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwcmltYXJ5SHdNb2R1bGVPdXRwdXRQcm9maWxlc1tpXS0+c3VwcG9ydERldmljZShBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSkgeworICAgICAgICAmJiAocHJpbWFyeU91dHB1dC0+bVByb2ZpbGUtPmdldE1vZHVsZSgpICE9IE5VTEwpKSB7CisgICAgICAgIHNwPEh3TW9kdWxlPiBwcmltYXJ5SHdNb2R1bGUgPSBwcmltYXJ5T3V0cHV0LT5tUHJvZmlsZS0+Z2V0TW9kdWxlKCk7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZvdXRwdXRQcm9maWxlIDogcHJpbWFyeUh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpKSB7CisgICAgICAgICAgICBpZiAob3V0cHV0UHJvZmlsZS0+c3VwcG9ydHNEZXZpY2VUeXBlcyhBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSkgewogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC02OTAsODkgKzc2Myw1OSBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1ib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0FueU91dHB1dEFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVRvSWdub3JlKSBjb25zdAorc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRPdXRwdXRGb3JDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgZm9yIChzaXplX3QgcyA9IDAgOyBzIDwgQVVESU9fU1RSRUFNX0NOVCA7IHMrKykgewotICAgICAgICBpZiAocyA9PSAoc2l6ZV90KSBzdHJlYW1Ub0lnbm9yZSkgewotICAgICAgICAgICAgY29udGludWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5nZXRDbGllbnQocG9ydElkKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gb3V0cHV0RGVzYzsKICAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3NdICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmNsZWFyU2Vzc2lvblJvdXRlc0ZvckRldmljZSgKKyAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRpc2Nvbm5lY3RlZERldmljZSkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogb3V0cHV0RGVzYy0+Z2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudC0+cHJlZmVycmVkRGV2aWNlSWQoKSA9PSBkaXNjb25uZWN0ZWREZXZpY2UtPmdldElkKCkpIHsKKyAgICAgICAgICAgICAgICBjbGllbnQtPnNldFByZWZlcnJlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKIH0KIAotYXVkaW9fZGV2aWNlc190IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRTdXBwb3J0ZWREZXZpY2VzKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkgY29uc3QKK3ZvaWQgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVGb3IoaGFuZGxlKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IG91dHB1dERlc2MtPm1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpOwotICAgIHJldHVybiBkZXZpY2VzOwotfQotCi0KLXN0YXR1c190IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuT3V0cHV0cyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGRzdC0+YXBwZW5kKCJcbk91dHB1dHMgZHVtcDpcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIi0gT3V0cHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0KTsKICAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIC8vIEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uIGltcGxlbWVudGF0aW9uCi1ib29sIEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Citib29sIEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0FjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKIHsKICAgICBuc2Vjc190IHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aGlzLT5zaXplKCk7IGkrKykgewogICAgICAgICBjb25zdCBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHRoaXMtPnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZShzdHJlYW0sIGluUGFzdE1zLCBzeXNUaW1lKSkgeworICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUodm9sdW1lU291cmNlLCBpblBhc3RNcywgc3lzVGltZSkpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNBbnlPdXRwdXRBY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ub0lnbm9yZSkgY29uc3QKK3ZvaWQgSHdBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGZvciAoc2l6ZV90IHMgPSAwIDsgcyA8IEFVRElPX1NUUkVBTV9DTlQgOyBzKyspIHsKLSAgICAgICAgaWYgKHMgPT0gKHNpemVfdCkgc3RyZWFtVG9JZ25vcmUpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc10gIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdHVzX3QgSHdBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5PdXRwdXRzIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmQoIlxuT3V0cHV0cyBkdW1wOlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIE91dHB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QpOwogICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9QYXRjaC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcAppbmRleCBhOWZlNDhkLi4zYTRkYjkwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcApAQCAtMzQsNTMgKzM0LDI3IEBACiB7CiB9CiAKLXN0YXR1c190IEF1ZGlvUGF0Y2g6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0CitzdGF0aWMgdm9pZCBkdW1wUGF0Y2hFbmRwb2ludHMoCisgICAgICAgIFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgY29uc3QgY2hhciAqcHJlZml4LCBpbnQgY291bnQsIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnICpjZmdzKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzQXVkaW8gcGF0Y2ggJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBoYW5kbGU6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUhhbmRsZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gYXVkaW8gZmxpbmdlciBoYW5kbGU6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUFmUGF0Y2hIYW5kbGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG93bmVyIHVpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtVWlkKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSAlZCBzb3VyY2VzOlxuIiwgc3BhY2VzLCAiIiwgbVBhdGNoLm51bV9zb3VyY2VzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGF0Y2gubnVtX3NvdXJjZXM7IGkrKykgewotICAgICAgICBpZiAobVBhdGNoLnNvdXJjZXNbaV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXZpY2U7Ci0gICAgICAgICAgICBkZXZpY2VUb1N0cmluZyhtUGF0Y2guc291cmNlc1tpXS5leHQuZGV2aWNlLnR5cGUsIGRldmljZSk7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIERldmljZSBJRCAlZCAlc1xuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc291cmNlc1tpXS5pZCwKLSAgICAgICAgICAgICAgICAgICAgIGRldmljZS5jX3N0cigpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWcgJmNmZyA9IGNmZ3NbaV07CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMgIFslcyAlZF0gIiwgc3BhY2VzLCAiIiwgcHJlZml4LCBpICsgMSk7CisgICAgICAgIGlmIChjZmcudHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiRGV2aWNlIElEICVkICVzIiwgY2ZnLmlkLCB0b1N0cmluZyhjZmcuZXh0LmRldmljZS50eXBlKS5jX3N0cigpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gTWl4IElEICVkIEkvTyBoYW5kbGUgJWRcbiIsIHNwYWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNvdXJjZXNbaV0uaWQsIG1QYXRjaC5zb3VyY2VzW2ldLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJNaXggSUQgJWQgSS9PIGhhbmRsZSAlZCIsIGNmZy5pZCwgY2ZnLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kKCJcbiIpOwogICAgIH0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtICVkIHNpbmtzOlxuIiwgc3BhY2VzLCAiIiwgbVBhdGNoLm51bV9zaW5rcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhdGNoLm51bV9zaW5rczsgaSsrKSB7Ci0gICAgICAgIGlmIChtUGF0Y2guc2lua3NbaV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXZpY2U7Ci0gICAgICAgICAgICBkZXZpY2VUb1N0cmluZyhtUGF0Y2guc2lua3NbaV0uZXh0LmRldmljZS50eXBlLCBkZXZpY2UpOwotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBEZXZpY2UgSUQgJWQgJXNcbiIsIHNwYWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNpbmtzW2ldLmlkLAotICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmNfc3RyKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBNaXggSUQgJWQgSS9PIGhhbmRsZSAlZFxuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc2lua3NbaV0uaWQsIG1QYXRjaC5zaW5rc1tpXS5leHQubWl4LmhhbmRsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIH0KK30KIAotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKK3ZvaWQgQXVkaW9QYXRjaDo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzUGF0Y2ggJWQ6IG93bmVyIHVpZCAlNGQsIGhhbmRsZSAlMmQsIGFmIGhhbmRsZSAlMmRcbiIsCisgICAgICAgICAgICBzcGFjZXMsICIiLCBpbmRleCArIDEsIG1VaWQsIG1IYW5kbGUsIG1BZlBhdGNoSGFuZGxlKTsKKyAgICBkdW1wUGF0Y2hFbmRwb2ludHMoZHN0LCBzcGFjZXMsICJzcmMgIiwgbVBhdGNoLm51bV9zb3VyY2VzLCBtUGF0Y2guc291cmNlcyk7CisgICAgZHVtcFBhdGNoRW5kcG9pbnRzKGRzdCwgc3BhY2VzLCAic2luayIsIG1QYXRjaC5udW1fc2lua3MsIG1QYXRjaC5zaW5rcyk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uOjphZGRBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKQEAgLTE2MSwxNiArMTM1LDEyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BhdGNoQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Cit2b2lkIEF1ZGlvUGF0Y2hDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkF1ZGlvIFBhdGNoZXM6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmQoIlxuQXVkaW8gUGF0Y2hlczpcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCwgMiwgaSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0LCAyLCBpKTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAKaW5kZXggMDg5MzBmMS4uZjcyODljYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcApAQCAtMjcsODkgKzI3LDUzIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotdm9pZCBBdWRpb1BvbGljeU1peDo6c2V0T3V0cHV0KHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmb3V0cHV0KQordm9pZCBBdWRpb1BvbGljeU1peDo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKIHsKLSAgICBtT3V0cHV0ID0gb3V0cHV0OwotfQotCi1jb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJkF1ZGlvUG9saWN5TWl4OjpnZXRPdXRwdXQoKSBjb25zdAotewotICAgIHJldHVybiBtT3V0cHV0OwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWl4OjpjbGVhck91dHB1dCgpCi17Ci0gICAgbU91dHB1dC5jbGVhcigpOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWl4OjpzZXRNaXgoQXVkaW9NaXggJm1peCkKLXsKLSAgICBtTWl4ID0gbWl4OwotfQotCi1hbmRyb2lkOjpBdWRpb01peCAqQXVkaW9Qb2xpY3lNaXg6OmdldE1peCgpCi17Ci0gICAgcmV0dXJuICZtTWl4OwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1peDo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0F1ZGlvIFBvbGljeSBNaXggJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0F1ZGlvIFBvbGljeSBNaXggJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCArIDEpOwogICAgIHN0ZDo6c3RyaW5nIG1peFR5cGVMaXRlcmFsOwotICAgIGlmICghTWl4VHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcobU1peC5tTWl4VHlwZSwgbWl4VHlwZUxpdGVyYWwpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNvbnZlcnQgbWl4IHR5cGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1NaXgubU1peFR5cGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGlmICghTWl4VHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcobU1peFR5cGUsIG1peFR5cGVMaXRlcmFsKSkgeworICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjb252ZXJ0IG1peCB0eXBlICVkIiwgX19GVU5DVElPTl9fLCBtTWl4VHlwZSk7CisgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtaXggdHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIG1peFR5cGVMaXRlcmFsLmNfc3RyKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBtaXggdHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIG1peFR5cGVMaXRlcmFsLmNfc3RyKCkpOworCiAgICAgc3RkOjpzdHJpbmcgcm91dGVGbGFnTGl0ZXJhbDsKLSAgICBSb3V0ZUZsYWdUeXBlQ29udmVydGVyOjptYXNrVG9TdHJpbmcobU1peC5tUm91dGVGbGFncywgcm91dGVGbGFnTGl0ZXJhbCk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBSb3V0ZSBGbGFnczogJXNcbiIsIHNwYWNlcywgIiIsIHJvdXRlRmxhZ0xpdGVyYWwuY19zdHIoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHN0ZDo6c3RyaW5nIGRldmljZUxpdGVyYWw7Ci0gICAgZGV2aWNlVG9TdHJpbmcobU1peC5tRGV2aWNlVHlwZSwgZGV2aWNlTGl0ZXJhbCk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBkZXZpY2UgdHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIGRldmljZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZGV2aWNlIGFkZHJlc3M6ICVzXG4iLCBzcGFjZXMsICIiLCBtTWl4Lm1EZXZpY2VBZGRyZXNzLnN0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgUm91dGVGbGFnVHlwZUNvbnZlcnRlcjo6bWFza1RvU3RyaW5nKG1Sb3V0ZUZsYWdzLCByb3V0ZUZsYWdMaXRlcmFsKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBSb3V0ZSBGbGFnczogJXNcbiIsIHNwYWNlcywgIiIsIHJvdXRlRmxhZ0xpdGVyYWwuY19zdHIoKSk7CisKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBkZXZpY2UgdHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIHRvU3RyaW5nKG1EZXZpY2VUeXBlKS5jX3N0cigpKTsKKworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGRldmljZSBhZGRyZXNzOiAlc1xuIiwgc3BhY2VzLCAiIiwgbURldmljZUFkZHJlc3Muc3RyaW5nKCkpOwogCiAgICAgaW50IGluZGV4Q3JpdGVyaW9uID0gMDsKLSAgICBmb3IgKGNvbnN0IGF1dG8gJmNyaXRlcmlvbiA6IG1NaXgubUNyaXRlcmlhKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gQ3JpdGVyaW9uICVkOlxuIiwgc3BhY2VzICsgMiwgIiIsIGluZGV4Q3JpdGVyaW9uKyspOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZm9yIChjb25zdCBhdXRvICZjcml0ZXJpb24gOiBtQ3JpdGVyaWEpIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gQ3JpdGVyaW9uICVkOlxuIiwgc3BhY2VzICsgMiwgIiIsIGluZGV4Q3JpdGVyaW9uKyspOworCiAgICAgICAgIHN0ZDo6c3RyaW5nIHVzYWdlTGl0ZXJhbDsKICAgICAgICAgaWYgKCFVc2FnZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGNyaXRlcmlvbi5tVmFsdWUubVVzYWdlLCB1c2FnZUxpdGVyYWwpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjb252ZXJ0IHVzYWdlICVkIiwgX19GVU5DVElPTl9fLCBjcml0ZXJpb24ubVZhbHVlLm1Vc2FnZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gVXNhZ2U6JXNcbiIsIHNwYWNlcyArIDQsICIiLCB1c2FnZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgaWYgKG1NaXgubU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFVzYWdlOiVzXG4iLCBzcGFjZXMgKyA0LCAiIiwgdXNhZ2VMaXRlcmFsLmNfc3RyKCkpOworCisgICAgICAgIGlmIChtTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZUxpdGVyYWw7CiAgICAgICAgICAgICBpZiAoIVNvdXJjZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGNyaXRlcmlvbi5tVmFsdWUubVNvdXJjZSwgc291cmNlTGl0ZXJhbCkpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjb252ZXJ0IHNvdXJjZSAlZCIsIF9fRlVOQ1RJT05fXywgY3JpdGVyaW9uLm1WYWx1ZS5tU291cmNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gU291cmNlOiVzXG4iLCBzcGFjZXMgKyA0LCAiIiwgc291cmNlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFNvdXJjZTolc1xuIiwgc3BhY2VzICsgNCwgIiIsIHNvdXJjZUxpdGVyYWwuY19zdHIoKSk7CisKICAgICAgICAgfQotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFVpZDolZFxuIiwgc3BhY2VzICsgNCwgIiIsIGNyaXRlcmlvbi5tVmFsdWUubVVpZCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gVWlkOiVkXG4iLCBzcGFjZXMgKyA0LCAiIiwgY3JpdGVyaW9uLm1WYWx1ZS5tVWlkKTsKKwogICAgICAgICBzdGQ6OnN0cmluZyBydWxlTGl0ZXJhbDsKICAgICAgICAgaWYgKCFSdWxlVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcoY3JpdGVyaW9uLm1SdWxlLCBydWxlTGl0ZXJhbCkpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNvbnZlcnQgc291cmNlICVkIiwgX19GVU5DVElPTl9fLGNyaXRlcmlvbi5tUnVsZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gUnVsZTolc1xuIiwgc3BhY2VzICsgNCwgIiIsIHJ1bGVMaXRlcmFsLmNfc3RyKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFJ1bGU6JXNcbiIsIHNwYWNlcyArIDQsICIiLCBydWxlTGl0ZXJhbC5jX3N0cigpKTsKICAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OnJlZ2lzdGVyTWl4KGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsIEF1ZGlvTWl4IG1peCwKQEAgLTEyMCwxMiArODQsMTEgQEAKICAgICAgICAgQUxPR0UoInJlZ2lzdGVyUG9saWN5TWl4ZXMoKTogbWl4IGZvciBhZGRyZXNzICVzIGFscmVhZHkgcmVnaXN0ZXJlZCIsIGFkZHJlc3Muc3RyaW5nKCkpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gbmV3IEF1ZGlvUG9saWN5TWl4KCk7Ci0gICAgcG9saWN5TWl4LT5zZXRNaXgobWl4KTsKKyAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gbmV3IEF1ZGlvUG9saWN5TWl4KG1peCk7CiAgICAgYWRkKGFkZHJlc3MsIHBvbGljeU1peCk7CiAKICAgICBpZiAoZGVzYyAhPSAwKSB7Ci0gICAgICAgIGRlc2MtPm1Qb2xpY3lNaXggPSBwb2xpY3lNaXgtPmdldE1peCgpOworICAgICAgICBkZXNjLT5tUG9saWN5TWl4ID0gcG9saWN5TWl4OwogICAgICAgICBwb2xpY3lNaXgtPnNldE91dHB1dChkZXNjKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtMTY1LDEzNyArMTI4LDIwMCBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpnZXRPdXRwdXRGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLCB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZkZXNjKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpnZXRPdXRwdXRGb3JBdHRyKAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMsIHVpZF90IHVpZCwgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZwcmltYXJ5RGVzYywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiAqc2Vjb25kYXJ5RGVzY3MpCiB7CiAgICAgQUxPR1YoImdldE91dHB1dEZvckF0dHIoKSBxdWVyeWluZyAlenUgbWl4ZXM6Iiwgc2l6ZSgpKTsKLSAgICBkZXNjID0gMDsKKyAgICBwcmltYXJ5RGVzYyA9IDA7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewogICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gdmFsdWVBdChpKTsKLSAgICAgICAgQXVkaW9NaXggKm1peCA9IHBvbGljeU1peC0+Z2V0TWl4KCk7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBwb2xpY3lEZXNjID0gcG9saWN5TWl4LT5nZXRPdXRwdXQoKTsKKyAgICAgICAgaWYgKCFwb2xpY3lEZXNjKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IFNraXBpbmcgJXp1OiBNaXggaGFzIG5vIG91dHB1dCIsIF9fZnVuY19fLCBpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgewotICAgICAgICAgICAgLy8gVE9ETyBpZiBhZGRpbmcgbW9yZSBwbGF5ZXIgcnVsZXMgKGN1cnJlbnRseSBvbmx5IDIpLCBtYWtlIHJ1bGUgaGFuZGxpbmcgImdlbmVyaWMiCi0gICAgICAgICAgICAvLyAgICAgIGFzIHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgaW4gdGhlIHRyZWF0bWVudCBvZiB1c2FnZS0gb3IgdWlkLWJhc2VkIHJ1bGVzCi0gICAgICAgICAgICBib29sIGhhc1VzYWdlTWF0Y2hSdWxlcyA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbCBoYXNVc2FnZUV4Y2x1ZGVSdWxlcyA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbCB1c2FnZU1hdGNoRm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2wgdXNhZ2VFeGNsdXNpb25Gb3VuZCA9IGZhbHNlOworICAgICAgICBjb25zdCBib29sIHByaW1hcnlPdXRwdXRNaXggPSAhaXNfbWl4X2xvb3BiYWNrX3JlbmRlcihwb2xpY3lNaXgtPm1Sb3V0ZUZsYWdzKTsKIAotICAgICAgICAgICAgYm9vbCBoYXNVaWRNYXRjaFJ1bGVzID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sIGhhc1VpZEV4Y2x1ZGVSdWxlcyA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbCB1aWRNYXRjaEZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sIHVpZEV4Y2x1c2lvbkZvdW5kID0gZmFsc2U7CisgICAgICAgIGlmIChwcmltYXJ5T3V0cHV0TWl4ICYmIHByaW1hcnlEZXNjICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogU2tpcGluZyAlenU6IFByaW1hcnkgb3V0cHV0IGFscmVhZHkgZm91bmQiLCBfX2Z1bmNfXywgaSk7CisgICAgICAgICAgICBjb250aW51ZTsgLy8gUHJpbWFyeSBvdXRwdXQgYWxyZWFkeSBmb3VuZAorICAgICAgICB9CiAKLSAgICAgICAgICAgIGJvb2wgaGFzQWRkck1hdGNoID0gZmFsc2U7CisgICAgICAgIHN3aXRjaCAobWl4TWF0Y2gocG9saWN5TWl4LmdldCgpLCBpLCBhdHRyaWJ1dGVzLCB1aWQpKSB7CisgICAgICAgICAgICBjYXNlIE1peE1hdGNoU3RhdHVzOjpJTlZBTElEX01JWDogcmV0dXJuIEJBRF9WQUxVRTsgLy8gVE9ETzogRG8gd2UgcmVhbGx5IHdhbnQgdG8gYWJvcnQ/CisgICAgICAgICAgICBjYXNlIE1peE1hdGNoU3RhdHVzOjpOT19NQVRDSDoKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6IE1peCAlenU6IGRvZXMgbm90IG1hdGNoIiwgX19mdW5jX18sIGkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIHRoZSBtaXgKKyAgICAgICAgICAgIGNhc2UgTWl4TWF0Y2hTdGF0dXM6Ok1BVENIOjsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBpdGVyYXRlIG92ZXIgYWxsIG1peCBjcml0ZXJpYSB0byBsaXN0IHdoYXQgcnVsZXMgdGhpcyBtaXggY29udGFpbnMKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbWl4LT5tQ3JpdGVyaWEuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiIGdldE91dHB1dEZvckF0dHI6IG1peCAlenU6IGluc3BlY3RpbmcgbWl4IGNyaXRlcmlhICV6dSBvZiAlenUiLAotICAgICAgICAgICAgICAgICAgICAgICAgaSwgaiwgbWl4LT5tQ3JpdGVyaWEuc2l6ZSgpKTsKLQotICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGFkZHJlc3MgbWF0Y2gsIHByaW9yaXRpemUgdGhhdCBtYXRjaAotICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKGF0dHJpYnV0ZXMudGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJuY21wKGF0dHJpYnV0ZXMudGFncyArIHN0cmxlbigiYWRkcj0iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gc3RybGVuKCJhZGRyPSIpIC0gMSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBoYXNBZGRyTWF0Y2ggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1peC0+bUNyaXRlcmlhW2pdLm1SdWxlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRToKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0bWl4IGhhcyBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRSBmb3IgdXNhZ2UgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Vc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgIGhhc1VzYWdlTWF0Y2hSdWxlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlID09IGF0dHJpYnV0ZXMudXNhZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIG9uZSBtYXRjaCBhZ2FpbnN0IGFsbCBhbGxvd2VkIHVzYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2VNYXRjaEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJVTEVfRVhDTFVERV9BVFRSSUJVVEVfVVNBR0U6Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9FWENMVURFX0FUVFJJQlVURV9VU0FHRSBmb3IgdXNhZ2UgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVXNhZ2UpOwotICAgICAgICAgICAgICAgICAgICBoYXNVc2FnZUV4Y2x1ZGVSdWxlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlID09IGF0dHJpYnV0ZXMudXNhZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIHRoaXMgdXNhZ2UgaXMgdG8gYmUgZXhjbHVkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlRXhjbHVzaW9uRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUlVMRV9NQVRDSF9VSUQ6Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9NQVRDSF9VSUQgZm9yIHVpZCAlZCIsIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkKTsKLSAgICAgICAgICAgICAgICAgICAgaGFzVWlkTWF0Y2hSdWxlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVpZCA9PSB1aWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIG9uZSBVSUQgbWF0Y2ggYWdhaW5zdCBhbGwgYWxsb3dlZCBVSURzCi0gICAgICAgICAgICAgICAgICAgICAgICB1aWRNYXRjaEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJVTEVfRVhDTFVERV9VSUQ6Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9FWENMVURFX1VJRCBmb3IgdWlkICVkIiwgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQpOwotICAgICAgICAgICAgICAgICAgICBoYXNVaWRFeGNsdWRlUnVsZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAobWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQgPT0gdWlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCB0aGlzIFVJRCBpcyB0byBiZSBleGNsdWRlZAotICAgICAgICAgICAgICAgICAgICAgICAgdWlkRXhjbHVzaW9uRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNvbnNpc3RlbmN5IGNoZWNrczogZm9yIGVhY2ggImRpbWVuc2lvbiIgb2YgcnVsZXMgKHVzYWdlLCB1aWQuLi4pLCB3ZSBjYW4KLSAgICAgICAgICAgICAgICAvLyBvbmx5IGhhdmUgTUFUQ0ggcnVsZXMsIG9yIEVYQ0xVREUgcnVsZXMgaW4gZWFjaCBkaW1lbnNpb24sIG5vdCBhIGNvbWJpbmF0aW9uCi0gICAgICAgICAgICAgICAgaWYgKGhhc1VzYWdlTWF0Y2hSdWxlcyAmJiBoYXNVc2FnZUV4Y2x1ZGVSdWxlcykgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cjogaW52YWxpZCBjb21iaW5hdGlvbiBvZiBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFIGluIG1peCAlenUiLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGhhc1VpZE1hdGNoUnVsZXMgJiYgaGFzVWlkRXhjbHVkZVJ1bGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyOiBpbnZhbGlkIGNvbWJpbmF0aW9uIG9mIFJVTEVfTUFUQ0hfVUlEIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYW5kIFJVTEVfRVhDTFVERV9VSUQgaW4gbWl4ICV6dSIsIGkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICgoaGFzVXNhZ2VFeGNsdWRlUnVsZXMgJiYgdXNhZ2VFeGNsdXNpb25Gb3VuZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChoYXNVaWRFeGNsdWRlUnVsZXMgJiYgdWlkRXhjbHVzaW9uRm91bmQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBzdG9wIGl0ZXJhdGluZyBvbiBjcml0ZXJpYSBiZWNhdXNlIGFuIGV4Y2x1c2lvbiB3YXMgZm91bmQgKHdpbGwgZmFpbCkKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0vL2l0ZXJhdGUgb24gbWl4IGNyaXRlcmlhCi0KLSAgICAgICAgICAgIC8vIGRldGVybWluZSBpZiBleGl0aW5nIG9uIHN1Y2Nlc3MgKG9yIGltcGxpY2l0IGZhaWx1cmUgYXMgZGVzYyBpcyAwKQotICAgICAgICAgICAgaWYgKGhhc0FkZHJNYXRjaCB8fAotICAgICAgICAgICAgICAgICAgICAhKChoYXNVc2FnZUV4Y2x1ZGVSdWxlcyAmJiB1c2FnZUV4Y2x1c2lvbkZvdW5kKSB8fAotICAgICAgICAgICAgICAgICAgICAgIChoYXNVc2FnZU1hdGNoUnVsZXMgJiYgIXVzYWdlTWF0Y2hGb3VuZCkgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgKGhhc1VpZEV4Y2x1ZGVSdWxlcyAmJiB1aWRFeGNsdXNpb25Gb3VuZCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAoaGFzVWlkTWF0Y2hSdWxlcyAmJiAhdWlkTWF0Y2hGb3VuZCkpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0Z2V0T3V0cHV0Rm9yQXR0ciB3aWxsIHVzZSBtaXggJXp1IiwgaSk7Ci0gICAgICAgICAgICAgICAgZGVzYyA9IHBvbGljeU1peC0+Z2V0T3V0cHV0KCk7CisgICAgICAgIHBvbGljeURlc2MtPm1Qb2xpY3lNaXggPSBwb2xpY3lNaXg7CisgICAgICAgIGlmIChwcmltYXJ5T3V0cHV0TWl4KSB7CisgICAgICAgICAgICBwcmltYXJ5RGVzYyA9IHBvbGljeURlc2M7CisgICAgICAgICAgICBBTE9HVigiJXM6IE1peCAlenU6IHNldCBwcmltYXJ5IGRlc2MiLCBfX2Z1bmNfXywgaSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocG9saWN5RGVzYy0+bUlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBNaXggJXp1IGlnbm9yZWQgYXMgc2Vjb25kYXJ5T3V0cHV0IGJlY2F1c2Ugbm90IG9wZW5lZCB5ZXQiLCBfX2Z1bmNfXywgaSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogQWRkIGEgc2Vjb25kYXJ5IGRlc2MgJXp1IiwgX19mdW5jX18sIGkpOworICAgICAgICAgICAgICAgIHNlY29uZGFyeURlc2NzLT5wdXNoX2JhY2socG9saWN5RGVzYyk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChwcmltYXJ5RGVzYyA9PSBudWxscHRyICYmIHNlY29uZGFyeURlc2NzLT5lbXB0eSgpKSA/IEJBRF9WQUxVRSA6IE5PX0VSUk9SOworfQogCi0gICAgICAgIH0gZWxzZSBpZiAobWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFICYmCi0gICAgICAgICAgICAgICAgICAgIHN0cm5jbXAoYXR0cmlidXRlcy50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDAgJiYKK0F1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6TWl4TWF0Y2hTdGF0dXMgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjptaXhNYXRjaCgKKyAgICAgICAgY29uc3QgQXVkaW9NaXgqIG1peCwgc2l6ZV90IG1peEluZGV4LCBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMsIHVpZF90IHVpZCkgeworCisgICAgaWYgKG1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAvLyBMb29wYmFjayByZW5kZXIgbWl4ZXMgYXJlIGNyZWF0ZWQgZnJvbSBhIHB1YmxpYyBBUEkgYW5kIHRodXMgcmVzdHJpY3RlZAorICAgICAgICAvLyB0byBub24gc2Vuc2libGUgYXVkaW8gdGhhdCBoYXZlIG5vdCBvcHRlZCBvdXQuCisgICAgICAgIGlmIChpc19taXhfbG9vcGJhY2tfcmVuZGVyKG1peC0+bVJvdXRlRmxhZ3MpKSB7CisgICAgICAgICAgICBpZiAoKGF0dHJpYnV0ZXMuZmxhZ3MgJiBBVURJT19GTEFHX05PX0NBUFRVUkUpID09IEFVRElPX0ZMQUdfTk9fQ0FQVFVSRSkgeworICAgICAgICAgICAgICAgIHJldHVybiBNaXhNYXRjaFN0YXR1czo6Tk9fTUFUQ0g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIShhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX1VOS05PV04gfHwKKyAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMudXNhZ2UgPT0gQVVESU9fVVNBR0VfTUVESUEgfHwKKyAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMudXNhZ2UgPT0gQVVESU9fVVNBR0VfR0FNRSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6Ok5PX01BVENIOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFRPRE8gaWYgYWRkaW5nIG1vcmUgcGxheWVyIHJ1bGVzIChjdXJyZW50bHkgb25seSAyKSwgbWFrZSBydWxlIGhhbmRsaW5nICJnZW5lcmljIgorICAgICAgICAvLyAgICAgIGFzIHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgaW4gdGhlIHRyZWF0bWVudCBvZiB1c2FnZS0gb3IgdWlkLWJhc2VkIHJ1bGVzCisgICAgICAgIGJvb2wgaGFzVXNhZ2VNYXRjaFJ1bGVzID0gZmFsc2U7CisgICAgICAgIGJvb2wgaGFzVXNhZ2VFeGNsdWRlUnVsZXMgPSBmYWxzZTsKKyAgICAgICAgYm9vbCB1c2FnZU1hdGNoRm91bmQgPSBmYWxzZTsKKyAgICAgICAgYm9vbCB1c2FnZUV4Y2x1c2lvbkZvdW5kID0gZmFsc2U7CisKKyAgICAgICAgYm9vbCBoYXNVaWRNYXRjaFJ1bGVzID0gZmFsc2U7CisgICAgICAgIGJvb2wgaGFzVWlkRXhjbHVkZVJ1bGVzID0gZmFsc2U7CisgICAgICAgIGJvb2wgdWlkTWF0Y2hGb3VuZCA9IGZhbHNlOworICAgICAgICBib29sIHVpZEV4Y2x1c2lvbkZvdW5kID0gZmFsc2U7CisKKyAgICAgICAgYm9vbCBoYXNBZGRyTWF0Y2ggPSBmYWxzZTsKKworICAgICAgICAvLyBpdGVyYXRlIG92ZXIgYWxsIG1peCBjcml0ZXJpYSB0byBsaXN0IHdoYXQgcnVsZXMgdGhpcyBtaXggY29udGFpbnMKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtaXgtPm1Dcml0ZXJpYS5zaXplKCk7IGorKykgeworICAgICAgICAgICAgQUxPR1YoIiBnZXRPdXRwdXRGb3JBdHRyOiBtaXggJXp1OiBpbnNwZWN0aW5nIG1peCBjcml0ZXJpYSAlenUgb2YgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgbWl4SW5kZXgsIGosIG1peC0+bUNyaXRlcmlhLnNpemUoKSk7CisKKyAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGFkZHJlc3MgbWF0Y2gsIHByaW9yaXRpemUgdGhhdCBtYXRjaAorICAgICAgICAgICAgaWYgKHN0cm5jbXAoYXR0cmlidXRlcy50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDAgJiYKICAgICAgICAgICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MgKyBzdHJsZW4oImFkZHI9IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSBzdHJsZW4oImFkZHI9IikgLSAxKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzYyA9IHBvbGljeU1peC0+Z2V0T3V0cHV0KCk7CisgICAgICAgICAgICAgICAgaGFzQWRkck1hdGNoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChtaXgtPm1Dcml0ZXJpYVtqXS5tUnVsZSkgeworICAgICAgICAgICAgY2FzZSBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRToKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRtaXggaGFzIFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFIGZvciB1c2FnZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVXNhZ2UpOworICAgICAgICAgICAgICAgIGhhc1VzYWdlTWF0Y2hSdWxlcyA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVXNhZ2UgPT0gYXR0cmlidXRlcy51c2FnZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBvbmUgbWF0Y2ggYWdhaW5zdCBhbGwgYWxsb3dlZCB1c2FnZXMKKyAgICAgICAgICAgICAgICAgICAgdXNhZ2VNYXRjaEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJVTEVfRVhDTFVERV9BVFRSSUJVVEVfVVNBR0U6CisgICAgICAgICAgICAgICAgQUxPR1YoIlx0bWl4IGhhcyBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFIGZvciB1c2FnZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlKTsKKyAgICAgICAgICAgICAgICBoYXNVc2FnZUV4Y2x1ZGVSdWxlcyA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVXNhZ2UgPT0gYXR0cmlidXRlcy51c2FnZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCB0aGlzIHVzYWdlIGlzIHRvIGJlIGV4Y2x1ZGVkCisgICAgICAgICAgICAgICAgICAgIHVzYWdlRXhjbHVzaW9uRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlVMRV9NQVRDSF9VSUQ6CisgICAgICAgICAgICAgICAgQUxPR1YoIlx0bWl4IGhhcyBSVUxFX01BVENIX1VJRCBmb3IgdWlkICVkIiwgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQpOworICAgICAgICAgICAgICAgIGhhc1VpZE1hdGNoUnVsZXMgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVpZCA9PSB1aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgb25lIFVJRCBtYXRjaCBhZ2FpbnN0IGFsbCBhbGxvd2VkIFVJRHMKKyAgICAgICAgICAgICAgICAgICAgdWlkTWF0Y2hGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSVUxFX0VYQ0xVREVfVUlEOgorICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9FWENMVURFX1VJRCBmb3IgdWlkICVkIiwgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQpOworICAgICAgICAgICAgICAgIGhhc1VpZEV4Y2x1ZGVSdWxlcyA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkID09IHVpZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCB0aGlzIFVJRCBpcyB0byBiZSBleGNsdWRlZAorICAgICAgICAgICAgICAgICAgICB1aWRFeGNsdXNpb25Gb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29uc2lzdGVuY3kgY2hlY2tzOiBmb3IgZWFjaCAiZGltZW5zaW9uIiBvZiBydWxlcyAodXNhZ2UsIHVpZC4uLiksIHdlIGNhbgorICAgICAgICAgICAgLy8gb25seSBoYXZlIE1BVENIIHJ1bGVzLCBvciBFWENMVURFIHJ1bGVzIGluIGVhY2ggZGltZW5zaW9uLCBub3QgYSBjb21iaW5hdGlvbgorICAgICAgICAgICAgaWYgKGhhc1VzYWdlTWF0Y2hSdWxlcyAmJiBoYXNVc2FnZUV4Y2x1ZGVSdWxlcykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyOiBpbnZhbGlkIGNvbWJpbmF0aW9uIG9mIFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBhbmQgUlVMRV9FWENMVURFX0FUVFJJQlVURV9VU0FHRSBpbiBtaXggJXp1IiwgbWl4SW5kZXgpOworICAgICAgICAgICAgICAgIHJldHVybiBNaXhNYXRjaFN0YXR1czo6SU5WQUxJRF9NSVg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFzVWlkTWF0Y2hSdWxlcyAmJiBoYXNVaWRFeGNsdWRlUnVsZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cjogaW52YWxpZCBjb21iaW5hdGlvbiBvZiBSVUxFX01BVENIX1VJRCIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYW5kIFJVTEVfRVhDTFVERV9VSUQgaW4gbWl4ICV6dSIsIG1peEluZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6OklOVkFMSURfTUlYOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGhhc1VzYWdlRXhjbHVkZVJ1bGVzICYmIHVzYWdlRXhjbHVzaW9uRm91bmQpCisgICAgICAgICAgICAgICAgICAgIHx8IChoYXNVaWRFeGNsdWRlUnVsZXMgJiYgdWlkRXhjbHVzaW9uRm91bmQpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7IC8vIHN0b3AgaXRlcmF0aW5nIG9uIGNyaXRlcmlhIGJlY2F1c2UgYW4gZXhjbHVzaW9uIHdhcyBmb3VuZCAod2lsbCBmYWlsKQorICAgICAgICAgICAgfQorCisgICAgICAgIH0vL2l0ZXJhdGUgb24gbWl4IGNyaXRlcmlhCisKKyAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIGV4aXRpbmcgb24gc3VjY2VzcyAob3IgaW1wbGljaXQgZmFpbHVyZSBhcyBkZXNjIGlzIDApCisgICAgICAgIGlmIChoYXNBZGRyTWF0Y2ggfHwKKyAgICAgICAgICAgICAgICAhKChoYXNVc2FnZUV4Y2x1ZGVSdWxlcyAmJiB1c2FnZUV4Y2x1c2lvbkZvdW5kKSB8fAorICAgICAgICAgICAgICAgICAgKGhhc1VzYWdlTWF0Y2hSdWxlcyAmJiAhdXNhZ2VNYXRjaEZvdW5kKSAgfHwKKyAgICAgICAgICAgICAgICAgIChoYXNVaWRFeGNsdWRlUnVsZXMgJiYgdWlkRXhjbHVzaW9uRm91bmQpIHx8CisgICAgICAgICAgICAgICAgICAoaGFzVWlkTWF0Y2hSdWxlcyAmJiAhdWlkTWF0Y2hGb3VuZCkpKSB7CisgICAgICAgICAgICBBTE9HVigiXHRnZXRPdXRwdXRGb3JBdHRyIHdpbGwgdXNlIG1peCAlenUiLCBtaXhJbmRleCk7CisgICAgICAgICAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6Ok1BVENIOwogICAgICAgICB9Ci0gICAgICAgIGlmIChkZXNjICE9IDApIHsKLSAgICAgICAgICAgIGRlc2MtPm1Qb2xpY3lNaXggPSBtaXg7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisKKyAgICB9IGVsc2UgaWYgKG1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFICYmCisgICAgICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCAmJgorICAgICAgICAgICAgICAgIHN0cm5jbXAoYXR0cmlidXRlcy50YWdzICsgc3RybGVuKCJhZGRyPSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIHN0cmxlbigiYWRkcj0iKSAtIDEpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBNaXhNYXRjaFN0YXR1czo6TUFUQ0g7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6Ok5PX01BVENIOwogfQogCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCAqKnBvbGljeU1peCkKK3NwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0RGV2aWNlQW5kTWl4Rm9yT3V0cHV0KAorICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJm91dHB1dCwKKyAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzKQogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgQXVkaW9NaXggKm1peCA9IHZhbHVlQXQoaSktPmdldE1peCgpOworICAgICAgICBpZiAodmFsdWVBdChpKS0+Z2V0T3V0cHV0KCkgPT0gb3V0cHV0KSB7CisgICAgICAgICAgICAvLyBUaGlzIERlc2MgaXMgaW52b2x2ZWQgaW4gYSBNaXgsIHdoaWNoIGhhcyB0aGUgaGlnaGVzdCBwcmlvCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IHZhbHVlQXQoaSktPm1EZXZpY2VUeXBlOworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gdmFsdWVBdChpKS0+bURldmljZUFkZHJlc3M7CisgICAgICAgICAgICBBTE9HVigiJXM6IGRldmljZSAoMHgleCwgYWRkcj0lcykgZm9yY2VkIGJ5IG1peCIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZVR5cGUsIGFkZHJlc3MuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UoZGV2aWNlVHlwZSwgYWRkcmVzcywgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQogCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKAorICAgICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbERldmljZXMsCisgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiAqcG9saWN5TWl4KSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQXVkaW9Qb2xpY3lNaXggKm1peCA9IHZhbHVlQXQoaSkuZ2V0KCk7CiAgICAgICAgIGlmIChtaXgtPm1NaXhUeXBlICE9IE1JWF9UWVBFX1JFQ09SREVSUykgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KQEAgLTMwNCwyMCArMzMwLDI2IEBACiAgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tU291cmNlID09IGlucHV0U291cmNlKSB8fAogICAgICAgICAgICAgICAgKFJVTEVfRVhDTFVERV9BVFRSSUJVVEVfQ0FQVFVSRV9QUkVTRVQgPT0gbWl4LT5tQ3JpdGVyaWFbal0ubVJ1bGUgJiYKICAgICAgICAgICAgICAgICAgICAgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Tb3VyY2UgIT0gaW5wdXRTb3VyY2UpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGF2YWlsRGV2aWNlcyAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb2xpY3lNaXggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8vIGFzc3VtaW5nIFBvbGljeU1peCBvbmx5IGZvciByZW1vdGUgc3VibWl4IGZvciBpbnB1dAorICAgICAgICAgICAgICAgIC8vIHNvIG1peC0+bURldmljZVR5cGUgY2FuIG9ubHkgYmUgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYCisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYOworICAgICAgICAgICAgICAgIGF1dG8gbWl4RGV2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsRGV2aWNlcy5nZXREZXZpY2UoZGV2aWNlLCBtaXgtPm1EZXZpY2VBZGRyZXNzLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICAgICAgaWYgKG1peERldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb2xpY3lNaXggIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICAgICAgKnBvbGljeU1peCA9IG1peDsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtaXhEZXZpY2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpnZXRJbnB1dE1peEZvckF0dHIoYXVkaW9fYXR0cmlidXRlc190IGF0dHIsIEF1ZGlvTWl4ICoqcG9saWN5TWl4KQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpnZXRJbnB1dE1peEZvckF0dHIoCisgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyLCBzcDxBdWRpb1BvbGljeU1peD4gKnBvbGljeU1peCkKIHsKICAgICBpZiAoc3RybmNtcChhdHRyLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgIT0gMCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMzI3LDkgKzM1OSw4IEBACiAjaWZkZWYgTE9HX05ERUJVRwogICAgIEFMT0dWKCJnZXRJbnB1dE1peEZvckF0dHIgbG9va2luZyBmb3IgYWRkcmVzcyAlc1xuICBtaXhlcyBhdmFpbGFibGU6IiwgYWRkcmVzcy5zdHJpbmcoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peCA9IHZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBBdWRpb01peCAqbWl4ID0gcG9saWN5TWl4LT5nZXRNaXgoKTsKLSAgICAgICAgICAgIEFMT0dWKCJcdG1peCAlenUgYWRkcmVzcz0lcyIsIGksIG1peC0+bURldmljZUFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IGF1ZGlvUG9saWN5TWl4ID0gdmFsdWVBdChpKTsKKyAgICAgICAgICAgIEFMT0dWKCJcdG1peCAlenUgYWRkcmVzcz0lcyIsIGksIGF1ZGlvUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSk7CiAgICAgfQogI2VuZGlmCiAKQEAgLTMzOSwyNCArMzcwLDEwNiBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBzcDxBdWRpb1BvbGljeU1peD4gYXVkaW9Qb2xpY3lNaXggPSB2YWx1ZUF0KGluZGV4KTsKLSAgICBBdWRpb01peCAqbWl4ID0gYXVkaW9Qb2xpY3lNaXgtPmdldE1peCgpOwogCi0gICAgaWYgKG1peC0+bU1peFR5cGUgIT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgIGlmIChhdWRpb1BvbGljeU1peC0+bU1peFR5cGUgIT0gTUlYX1RZUEVfUExBWUVSUykgewogICAgICAgICBBTE9HVygiZ2V0SW5wdXRNaXhGb3JBdHRyKCkgYmFkIHBvbGljeSBtaXggdHlwZSBmb3IgYWRkcmVzcyAlcyIsIGFkZHJlc3Muc3RyaW5nKCkpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICAqcG9saWN5TWl4ID0gbWl4OworICAgIGlmIChwb2xpY3lNaXggIT0gbnVsbHB0cikgeworICAgICAgICAqcG9saWN5TWl4ID0gYXVkaW9Qb2xpY3lNaXg7CisgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBzdGQ6OnN0cmluZyBsb2coIlxuQXVkaW8gUG9saWN5IE1peDpcbiIpOwotICAgIHdyaXRlKGZkLCBsb2cuY19zdHIoKSwgbG9nLnNpemUoKSk7CitzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OnNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLAorICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIHsKKyAgICAvLyByZW1vdmUgZXhpc3RpbmcgcnVsZXMgZm9yIHRoaXMgdWlkCisgICAgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWQpOworCisgICAgLy8gZm9yIGVhY2ggcGxheWVyIG1peDogYWRkIGEgcnVsZSB0byBtYXRjaCBvciBleGNsdWRlIHRoZSB1aWQgYmFzZWQgb24gdGhlIGRldmljZQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCwgMiwgaSk7CisgICAgICAgIGNvbnN0IEF1ZGlvUG9saWN5TWl4ICptaXggPSB2YWx1ZUF0KGkpLmdldCgpOworICAgICAgICBpZiAobWl4LT5tTWl4VHlwZSAhPSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBjaGVjayBpZiB0aGlzIG1peCBnb2VzIHRvIGEgZGV2aWNlIGluIHRoZSBsaXN0IG9mIGRldmljZXMKKyAgICAgICAgYm9vbCBkZXZpY2VNYXRjaCA9IGZhbHNlOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGRldmljZXMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2VzW2pdLm1UeXBlID09IG1peC0+bURldmljZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgJiYgZGV2aWNlc1tqXS5tQWRkcmVzcyA9PSBtaXgtPm1EZXZpY2VBZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlTWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2VNYXRjaCkgeworICAgICAgICAgICAgbWl4LT5zZXRNYXRjaFVpZCh1aWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdGhpcyBtaXggZG9lc24ndCBnbyB0byBvbmUgb2YgdGhlIGxpc3RlZCBkZXZpY2VzIGZvciB0aGUgZ2l2ZW4gdWlkLAorICAgICAgICAgICAgLy8gbW9kaWZ5IGl0cyBydWxlcyB0byBleGNsdWRlIHRoZSB1aWQKKyAgICAgICAgICAgIG1peC0+c2V0RXhjbHVkZVVpZCh1aWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OnJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKSB7CisgICAgLy8gZm9yIGVhY2ggcGxheWVyIG1peDogcmVtb3ZlIGV4aXN0aW5nIHJ1bGVzIHRoYXQgbWF0Y2ggb3IgZXhjbHVkZSB0aGlzIHVpZAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYm9vbCBmb3VuZFVpZFJ1bGUgPSBmYWxzZTsKKyAgICAgICAgY29uc3QgQXVkaW9Qb2xpY3lNaXggKm1peCA9IHZhbHVlQXQoaSkuZ2V0KCk7CisgICAgICAgIGlmIChtaXgtPm1NaXhUeXBlICE9IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gY3JpdGVyaWFUb1JlbW92ZTsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtaXgtPm1Dcml0ZXJpYS5zaXplKCk7IGorKykgeworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgcnVsZSA9IG1peC0+bUNyaXRlcmlhW2pdLm1SdWxlOworICAgICAgICAgICAgLy8gaXMgdGhpcyBydWxlIGFmZmVjdGluZyB0aGUgdWlkPworICAgICAgICAgICAgaWYgKChydWxlID09IFJVTEVfRVhDTFVERV9VSUQgfHwgcnVsZSA9PSBSVUxFX01BVENIX1VJRCkKKyAgICAgICAgICAgICAgICAgICAgJiYgdWlkID09IG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkKSB7CisgICAgICAgICAgICAgICAgZm91bmRVaWRSdWxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjcml0ZXJpYVRvUmVtb3ZlLmluc2VydChjcml0ZXJpYVRvUmVtb3ZlLmJlZ2luKCksIGopOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmb3VuZFVpZFJ1bGUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgY3JpdGVyaWFUb1JlbW92ZS5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhLnJlbW92ZUF0KGNyaXRlcmlhVG9SZW1vdmVbal0pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpnZXREZXZpY2VzRm9yVWlkKHVpZF90IHVpZCwKKyAgICAgICAgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKSBjb25zdCB7CisgICAgLy8gZm9yIGVhY2ggcGxheWVyIG1peDogZmluZCBydWxlcyB0aGF0IGRvbid0IGV4Y2x1ZGUgdGhpcyB1aWQsIGFuZCBhZGQgdGhlIGRldmljZSB0byB0aGUgbGlzdAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYm9vbCBydWxlQWxsb3dzVWlkID0gdHJ1ZTsKKyAgICAgICAgY29uc3QgQXVkaW9Qb2xpY3lNaXggKm1peCA9IHZhbHVlQXQoaSkuZ2V0KCk7CisgICAgICAgIGlmIChtaXgtPm1NaXhUeXBlICE9IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbWl4LT5tQ3JpdGVyaWEuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHJ1bGUgPSBtaXgtPm1Dcml0ZXJpYVtqXS5tUnVsZTsKKyAgICAgICAgICAgIGlmIChydWxlID09IFJVTEVfRVhDTFVERV9VSUQKKyAgICAgICAgICAgICAgICAgICAgJiYgdWlkID09IG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkKSB7CisgICAgICAgICAgICAgICAgcnVsZUFsbG93c1VpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChydWxlQWxsb3dzVWlkKSB7CisgICAgICAgICAgICBkZXZpY2VzLmFkZChBdWRpb0RldmljZVR5cGVBZGRyKG1peC0+bURldmljZVR5cGUsIG1peC0+bURldmljZUFkZHJlc3MpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZCgiXG5BdWRpbyBQb2xpY3kgTWl4OlxuIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgMiwgaSk7CisgICAgfQorfQorCiB9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvcnQuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb3J0LmNwcAppbmRleCBkODU1NjJlLi5hNjZjNjk1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvcnQuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9ydC5jcHAKQEAgLTMxLDkgKzMxLDE1IEBACiAvLyAtLS0gQXVkaW9Qb3J0IGNsYXNzIGltcGxlbWVudGF0aW9uCiB2b2lkIEF1ZGlvUG9ydDo6YXR0YWNoKGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKQogeworICAgIEFMT0dWKCIlczogYXR0YWNoaW5nIG1vZHVsZSAlcyB0byBwb3J0ICVzIiwgX19GVU5DVElPTl9fLCBnZXRNb2R1bGVOYW1lKCksIG1OYW1lLnN0cmluZygpKTsKICAgICBtTW9kdWxlID0gbW9kdWxlOwogfQogCit2b2lkIEF1ZGlvUG9ydDo6ZGV0YWNoKCkKK3sKKyAgICBtTW9kdWxlID0gbnVsbHB0cjsKK30KKwogLy8gTm90ZSB0aGF0IGlzIGEgZGlmZmVyZW50IG5hbWVzcGFjZSB0aGFuIEF1ZGlvRmxpbmdlciB1bmlxdWUgSURzCiBhdWRpb19wb3J0X2hhbmRsZV90IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCkKIHsKQEAgLTM1NCwyNiArMzYwLDE4IEBACiAgICAgcmV0dXJuIG1HYWluc1tpbmRleF0tPmNoZWNrQ29uZmlnKGdhaW5Db25maWcpOwogfQogCi12b2lkIEF1ZGlvUG9ydDo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSkgY29uc3QKK3ZvaWQgQXVkaW9Qb3J0OjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlKSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCiAgICAgaWYgKCFtTmFtZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuc3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuc3RyaW5nKCkpOwogICAgIH0KICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICBtUHJvZmlsZXMuZHVtcChmZCwgc3BhY2VzKTsKKyAgICAgICAgbVByb2ZpbGVzLmR1bXAoZHN0LCBzcGFjZXMpOwogCiAgICAgICAgIGlmIChtR2FpbnMuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZ2FpbnM6XG4iLCBzcGFjZXMsICIiKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGJ1ZmZlcjsKLSAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gZ2FpbnM6XG4iLCBzcGFjZXMsICIiKTsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUdhaW5zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUdhaW5zW2ldLT5kdW1wKGZkLCBzcGFjZXMgKyAyLCBpKTsKKyAgICAgICAgICAgICAgICBtR2FpbnNbaV0tPmR1bXAoZHN0LCBzcGFjZXMgKyAyLCBpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTM4NiwyMiArMzg0LDEyIEBACiAKIC8vIC0tLSBBdWRpb1BvcnRDb25maWcgY2xhc3MgaW1wbGVtZW50YXRpb24KIAotQXVkaW9Qb3J0Q29uZmlnOjpBdWRpb1BvcnRDb25maWcoKQotewotICAgIG1TYW1wbGluZ1JhdGUgPSAwOwotICAgIG1DaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKLSAgICBtRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7Ci0gICAgbWVtc2V0KCZtR2FpbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZykpOwotICAgIG1HYWluLmluZGV4ID0gLTE7Ci19Ci0KIHN0YXR1c190IEF1ZGlvUG9ydENvbmZpZzo6YXBwbHlBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqYmFja3VwQ29uZmlnKQogewotICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBsb2NhbEJhY2t1cENvbmZpZzsKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbG9jYWxCYWNrdXBDb25maWcgPSB7IC5jb25maWdfbWFzayA9IGNvbmZpZy0+Y29uZmlnX21hc2sgfTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKIAotICAgIGxvY2FsQmFja3VwQ29uZmlnLmNvbmZpZ19tYXNrID0gY29uZmlnLT5jb25maWdfbWFzazsKICAgICB0b0F1ZGlvUG9ydENvbmZpZygmbG9jYWxCYWNrdXBDb25maWcpOwogCiAgICAgc3A8QXVkaW9Qb3J0PiBhdWRpb3BvcnQgPSBnZXRBdWRpb1BvcnQoKTsKQEAgLTQyNSw2ICs0MTMsOSBAQAogICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfR0FJTikgewogICAgICAgICBtR2FpbiA9IGNvbmZpZy0+Z2FpbjsKICAgICB9CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUykgeworICAgICAgICBtRmxhZ3MgPSBjb25maWctPmZsYWdzOworICAgIH0KIAogZXhpdDoKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CkBAIC00MzYsMzMgKzQyNywzOCBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK25hbWVzcGFjZSB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIHVwZGF0ZUZpZWxkKAorICAgICAgICBjb25zdCBUJiBwb3J0Q29uZmlnRmllbGQsIFQgYXVkaW9fcG9ydF9jb25maWc6Oipwb3J0X2NvbmZpZ19maWVsZCwKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnLAorICAgICAgICB1bnNpZ25lZCBpbnQgY29uZmlnTWFzaywgVCBkZWZhdWx0VmFsdWUpCit7CisgICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBjb25maWdNYXNrKSB7CisgICAgICAgIGlmICgoc3JjQ29uZmlnICE9IG51bGxwdHIpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgY29uZmlnTWFzaykpIHsKKyAgICAgICAgICAgIGRzdENvbmZpZy0+KnBvcnRfY29uZmlnX2ZpZWxkID0gc3JjQ29uZmlnLT4qcG9ydF9jb25maWdfZmllbGQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkc3RDb25maWctPipwb3J0X2NvbmZpZ19maWVsZCA9IHBvcnRDb25maWdGaWVsZDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRzdENvbmZpZy0+KnBvcnRfY29uZmlnX2ZpZWxkID0gZGVmYXVsdFZhbHVlOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UKKwogdm9pZCBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAogewotICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKLSAgICAgICAgZHN0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9IG1TYW1wbGluZ1JhdGU7Ci0gICAgICAgIGlmICgoc3JjQ29uZmlnICE9IE5VTEwpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPnNhbXBsZV9yYXRlID0gc3JjQ29uZmlnLT5zYW1wbGVfcmF0ZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRzdENvbmZpZy0+c2FtcGxlX3JhdGUgPSAwOwotICAgIH0KLSAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgewotICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzazsKLSAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IHNyY0NvbmZpZy0+Y2hhbm5lbF9tYXNrOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0Q29uZmlnLT5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7Ci0gICAgfQotICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Zm9ybWF0ID0gbUZvcm1hdDsKLSAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPmZvcm1hdCA9IHNyY0NvbmZpZy0+Zm9ybWF0OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0Q29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICB9CisgICAgdXBkYXRlRmllbGQobVNhbXBsaW5nUmF0ZSwgJmF1ZGlvX3BvcnRfY29uZmlnOjpzYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgIGRzdENvbmZpZywgc3JjQ29uZmlnLCBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSwgMHUpOworICAgIHVwZGF0ZUZpZWxkKG1DaGFubmVsTWFzaywgJmF1ZGlvX3BvcnRfY29uZmlnOjpjaGFubmVsX21hc2ssCisgICAgICAgICAgICBkc3RDb25maWcsIHNyY0NvbmZpZywgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KUFVRElPX0NIQU5ORUxfTk9ORSk7CisgICAgdXBkYXRlRmllbGQobUZvcm1hdCwgJmF1ZGlvX3BvcnRfY29uZmlnOjpmb3JtYXQsCisgICAgICAgICAgICBkc3RDb25maWcsIHNyY0NvbmZpZywgQVVESU9fUE9SVF9DT05GSUdfRk9STUFULCBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisKICAgICBzcDxBdWRpb1BvcnQ+IGF1ZGlvcG9ydCA9IGdldEF1ZGlvUG9ydCgpOwogICAgIGlmICgoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pICYmIGF1ZGlvcG9ydCAhPSBOVUxMKSB7CiAgICAgICAgIGRzdENvbmZpZy0+Z2FpbiA9IG1HYWluOwpAQCAtNDc4LDYgKzQ3NCwxOSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJj0gfkFVRElPX1BPUlRfQ09ORklHX0dBSU47CiAgICAgfQorCisgICAgdXBkYXRlRmllbGQobUZsYWdzLCAmYXVkaW9fcG9ydF9jb25maWc6OmZsYWdzLAorICAgICAgICAgICAgZHN0Q29uZmlnLCBzcmNDb25maWcsIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTLCB7IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSB9KTsKK30KKworYm9vbCBBdWRpb1BvcnRDb25maWc6Omhhc0dhaW5Db250cm9sbGVyKGJvb2wgY2FuVXNlRm9yVm9sdW1lKSBjb25zdAoreworICAgIHNwPEF1ZGlvUG9ydD4gYXVkaW9wb3J0ID0gZ2V0QXVkaW9Qb3J0KCk7CisgICAgaWYgKGF1ZGlvcG9ydCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGNhblVzZUZvclZvbHVtZSA/IGF1ZGlvcG9ydC0+Z2V0R2FpbnMoKS5jYW5Vc2VGb3JWb2x1bWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhdWRpb3BvcnQtPmdldEdhaW5zKCkuc2l6ZSgpID4gMDsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qcm9maWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUHJvZmlsZS5jcHAKaW5kZXggZmQ2ZmMxYy4uYTY0NWUwMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qcm9maWxlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Byb2ZpbGUuY3BwCkBAIC0xNCwyMCArMTQsMTEyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKICNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1Byb2ZpbGUiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKLSNpbmNsdWRlICJBdWRpb1Byb2ZpbGUuaCIKLSNpbmNsdWRlICJBdWRpb1BvcnQuaCIKLSNpbmNsdWRlICJId01vZHVsZS5oIgotI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgorI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgorI2luY2x1ZGUgIkF1ZGlvUHJvZmlsZS5oIgorI2luY2x1ZGUgIkh3TW9kdWxlLmgiCisjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK0NoYW5uZWxzVmVjdG9yIENoYW5uZWxzVmVjdG9yOjphc0luTWFzaygpIGNvbnN0Cit7CisgICAgQ2hhbm5lbHNWZWN0b3IgaW5NYXNrVmVjdG9yOworICAgIGZvciAoY29uc3QgYXV0byYgY2hhbm5lbCA6ICp0aGlzKSB7CisgICAgICAgIGlmIChhdWRpb19jaGFubmVsX21hc2tfb3V0X3RvX2luKGNoYW5uZWwpICE9IEFVRElPX0NIQU5ORUxfSU5WQUxJRCkgeworICAgICAgICAgICAgaW5NYXNrVmVjdG9yLmFkZChhdWRpb19jaGFubmVsX21hc2tfb3V0X3RvX2luKGNoYW5uZWwpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW5NYXNrVmVjdG9yOworfQorCitDaGFubmVsc1ZlY3RvciBDaGFubmVsc1ZlY3Rvcjo6YXNPdXRNYXNrKCkgY29uc3QKK3sKKyAgICBDaGFubmVsc1ZlY3RvciBvdXRNYXNrVmVjdG9yOworICAgIGZvciAoY29uc3QgYXV0byYgY2hhbm5lbCA6ICp0aGlzKSB7CisgICAgICAgIGlmIChhdWRpb19jaGFubmVsX21hc2tfaW5fdG9fb3V0KGNoYW5uZWwpICE9IEFVRElPX0NIQU5ORUxfSU5WQUxJRCkgeworICAgICAgICAgICAgb3V0TWFza1ZlY3Rvci5hZGQoYXVkaW9fY2hhbm5lbF9tYXNrX2luX3RvX291dChjaGFubmVsKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG91dE1hc2tWZWN0b3I7Cit9CisKK2Jvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEF1ZGlvUHJvZmlsZSAmbGVmdCwgY29uc3QgQXVkaW9Qcm9maWxlICZjb21wYXJlVG8pCit7CisgICAgcmV0dXJuIChsZWZ0LmdldEZvcm1hdCgpID09IGNvbXBhcmVUby5nZXRGb3JtYXQoKSkgJiYKKyAgICAgICAgICAgIChsZWZ0LmdldENoYW5uZWxzKCkgPT0gY29tcGFyZVRvLmdldENoYW5uZWxzKCkpICYmCisgICAgICAgICAgICAobGVmdC5nZXRTYW1wbGVSYXRlcygpID09IGNvbXBhcmVUby5nZXRTYW1wbGVSYXRlcygpKTsKK30KKworc3RhdGljIEF1ZGlvUHJvZmlsZSogY3JlYXRlRnVsbER5bmFtaWNJbXBsKCkKK3sKKyAgICBBdWRpb1Byb2ZpbGUqIGR5bmFtaWNQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShnRHluYW1pY0Zvcm1hdCwKKyAgICAgICAgICAgIENoYW5uZWxzVmVjdG9yKCksIFNhbXBsZVJhdGVWZWN0b3IoKSk7CisgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7CisgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNDaGFubmVscyh0cnVlKTsKKyAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY1JhdGUodHJ1ZSk7CisgICAgcmV0dXJuIGR5bmFtaWNQcm9maWxlOworfQorCisvLyBzdGF0aWMKK3NwPEF1ZGlvUHJvZmlsZT4gQXVkaW9Qcm9maWxlOjpjcmVhdGVGdWxsRHluYW1pYygpCit7CisgICAgc3RhdGljIHNwPEF1ZGlvUHJvZmlsZT4gZHluYW1pY1Byb2ZpbGUgPSBjcmVhdGVGdWxsRHluYW1pY0ltcGwoKTsKKyAgICByZXR1cm4gZHluYW1pY1Byb2ZpbGU7Cit9CisKK0F1ZGlvUHJvZmlsZTo6QXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSkgOgorICAgICAgICBtTmFtZShTdHJpbmc4KCIiKSksCisgICAgICAgIG1Gb3JtYXQoZm9ybWF0KQoreworICAgIG1DaGFubmVsTWFza3MuYWRkKGNoYW5uZWxNYXNrcyk7CisgICAgbVNhbXBsaW5nUmF0ZXMuYWRkKHNhbXBsaW5nUmF0ZSk7Cit9CisKK0F1ZGlvUHJvZmlsZTo6QXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGluZ1JhdGVDb2xsZWN0aW9uKSA6CisgICAgICAgIG1OYW1lKFN0cmluZzgoIiIpKSwKKyAgICAgICAgbUZvcm1hdChmb3JtYXQpLAorICAgICAgICBtQ2hhbm5lbE1hc2tzKGNoYW5uZWxNYXNrcyksCisgICAgICAgIG1TYW1wbGluZ1JhdGVzKHNhbXBsaW5nUmF0ZUNvbGxlY3Rpb24pIHt9CisKK3ZvaWQgQXVkaW9Qcm9maWxlOjpzZXRDaGFubmVscyhjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzKQoreworICAgIGlmIChtSXNEeW5hbWljQ2hhbm5lbHMpIHsKKyAgICAgICAgbUNoYW5uZWxNYXNrcyA9IGNoYW5uZWxNYXNrczsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qcm9maWxlOjpzZXRTYW1wbGVSYXRlcyhjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGVSYXRlcykKK3sKKyAgICBpZiAobUlzRHluYW1pY1JhdGUpIHsKKyAgICAgICAgbVNhbXBsaW5nUmF0ZXMgPSBzYW1wbGVSYXRlczsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qcm9maWxlOjpjbGVhcigpCit7CisgICAgaWYgKG1Jc0R5bmFtaWNDaGFubmVscykgeworICAgICAgICBtQ2hhbm5lbE1hc2tzLmNsZWFyKCk7CisgICAgfQorICAgIGlmIChtSXNEeW5hbWljUmF0ZSkgeworICAgICAgICBtU2FtcGxpbmdSYXRlcy5jbGVhcigpOworICAgIH0KK30KKwogc3RhdHVzX3QgQXVkaW9Qcm9maWxlOjpjaGVja0V4YWN0KHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAogewpAQCAtMzksMjcgKzEzMSw2IEBACiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1ib29sIG9wZXJhdG9yID09IChjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJmxlZnQsIGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmcmlnaHQpCi17Ci0gICAgaWYgKGxlZnQuc2l6ZSgpICE9IHJpZ2h0LnNpemUoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGZvcihzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHJpZ2h0LnNpemUoKTsgaW5kZXgrKykgewotICAgICAgICBpZiAobGVmdFtpbmRleF0gIT0gcmlnaHRbaW5kZXhdKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEF1ZGlvUHJvZmlsZSAmbGVmdCwgY29uc3QgQXVkaW9Qcm9maWxlICZjb21wYXJlVG8pCi17Ci0gICAgcmV0dXJuIChsZWZ0LmdldEZvcm1hdCgpID09IGNvbXBhcmVUby5nZXRGb3JtYXQoKSkgJiYKLSAgICAgICAgICAgIChsZWZ0LmdldENoYW5uZWxzKCkgPT0gY29tcGFyZVRvLmdldENoYW5uZWxzKCkpICYmCi0gICAgICAgICAgICAobGVmdC5nZXRTYW1wbGVSYXRlcygpID09IGNvbXBhcmVUby5nZXRTYW1wbGVSYXRlcygpKTsKLX0KLQogc3RhdHVzX3QgQXVkaW9Qcm9maWxlOjpjaGVja0NvbXBhdGlibGVTYW1wbGluZ1JhdGUodWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJnVwZGF0ZWRTYW1wbGluZ1JhdGUpIGNvbnN0CiB7CkBAIC0xODIsNDcgKzI1Myw3OSBAQAogICAgIHJldHVybiBiZXN0TWF0Y2ggPiAwID8gTk9fRVJST1IgOiBCQURfVkFMVUU7CiB9CiAKLXZvaWQgQXVkaW9Qcm9maWxlOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKK3ZvaWQgQXVkaW9Qcm9maWxlOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVzJXMlc1xuIiwgbUlzRHluYW1pY0Zvcm1hdCA/ICJbZHluYW1pYyBmb3JtYXRdIiA6ICIiLAorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlcyVzJXNcbiIsIG1Jc0R5bmFtaWNGb3JtYXQgPyAiW2R5bmFtaWMgZm9ybWF0XSIgOiAiIiwKICAgICAgICAgICAgICBtSXNEeW5hbWljQ2hhbm5lbHMgPyAiW2R5bmFtaWMgY2hhbm5lbHNdIiA6ICIiLAogICAgICAgICAgICAgIG1Jc0R5bmFtaWNSYXRlID8gIltkeW5hbWljIHJhdGVzXSIgOiAiIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIGlmIChtTmFtZS5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbmFtZTogJXNcbiIsIHNwYWNlcywgIiIsIG1OYW1lLnN0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuc3RyaW5nKCkpOwogICAgIH0KICAgICBzdGQ6OnN0cmluZyBmb3JtYXRMaXRlcmFsOwogICAgIGlmIChGb3JtYXRDb252ZXJ0ZXI6OnRvU3RyaW5nKG1Gb3JtYXQsIGZvcm1hdExpdGVyYWwpKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZm9ybWF0OiAlc1xuIiwgc3BhY2VzLCAiIiwgZm9ybWF0TGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBmb3JtYXQ6ICVzXG4iLCBzcGFjZXMsICIiLCBmb3JtYXRMaXRlcmFsLmNfc3RyKCkpOwogICAgIH0KICAgICBpZiAoIW1TYW1wbGluZ1JhdGVzLmlzRW1wdHkoKSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHNhbXBsaW5nIHJhdGVzOiIsIHNwYWNlcywgIiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIHNhbXBsaW5nIHJhdGVzOiIsIHNwYWNlcywgIiIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlZCIsIG1TYW1wbGluZ1JhdGVzW2ldKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaSA9PSAobVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIC0gMSkgPyAiIiA6ICIsICIpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiVkIiwgbVNhbXBsaW5nUmF0ZXNbaV0pOworICAgICAgICAgICAgZHN0LT5hcHBlbmQoaSA9PSAobVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIC0gMSkgPyAiIiA6ICIsICIpOwogICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgICAgIGRzdC0+YXBwZW5kKCJcbiIpOwogICAgIH0KIAogICAgIGlmICghbUNoYW5uZWxNYXNrcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBjaGFubmVsIG1hc2tzOiIsIHNwYWNlcywgIiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGNoYW5uZWwgbWFza3M6Iiwgc3BhY2VzLCAiIik7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiMHglMDR4IiwgbUNoYW5uZWxNYXNrc1tpXSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1DaGFubmVsTWFza3Muc2l6ZSgpIC0gMSkgPyAiIiA6ICIsICIpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIjB4JTA0eCIsIG1DaGFubmVsTWFza3NbaV0pOworICAgICAgICAgICAgZHN0LT5hcHBlbmQoaSA9PSAobUNoYW5uZWxNYXNrcy5zaXplKCkgLSAxKSA/ICIiIDogIiwgIik7CiAgICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CiAgICAgfQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworfQorCitzc2l6ZV90IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6YWRkKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUpCit7CisgICAgc3NpemVfdCBpbmRleCA9IFZlY3Rvcjo6YWRkKHByb2ZpbGUpOworICAgIC8vIHdlIHNvcnQgZnJvbSB3b3JzdCB0byBiZXN0LCBzbyB0aGF0IEFVRElPX0ZPUk1BVF9ERUZBVUxUIGlzIGFsd2F5cyB0aGUgZmlyc3QgZW50cnkuCisgICAgLy8gVE9ETzogY29tcGFyZUZvcm1hdHMgY291bGQgYmUgYSBsYW1iZGEgdG8gY29udmVydCBiZXR3ZWVuIHBvaW50ZXItdG8tZm9ybWF0IHRvIGZvcm1hdDoKKyAgICAvLyBbXShjb25zdCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0MSwgY29uc3QgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdDIpIHsKKyAgICAvLyAgICAgcmV0dXJuIGNvbXBhcmVGb3JtYXRzKCpmb3JtYXQxLCAqZm9ybWF0Mik7CisgICAgLy8gfQorICAgIHNvcnQoY29tcGFyZUZvcm1hdHMpOworICAgIHJldHVybiBpbmRleDsKK30KKworc3NpemVfdCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmFkZFByb2ZpbGVGcm9tSGFsKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGVUb0FkZCkKK3sKKyAgICAvLyBDaGVjayB2YWxpZCBwcm9maWxlIHRvIGFkZDoKKyAgICBpZiAoIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRGb3JtYXQoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghcHJvZmlsZVRvQWRkLT5oYXNWYWxpZENoYW5uZWxzKCkgJiYgIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRSYXRlcygpKSB7CisgICAgICAgIEZvcm1hdFZlY3RvciBmb3JtYXRzOworICAgICAgICBmb3JtYXRzLmFkZChwcm9maWxlVG9BZGQtPmdldEZvcm1hdCgpKTsKKyAgICAgICAgc2V0Rm9ybWF0cyhGb3JtYXRWZWN0b3IoZm9ybWF0cykpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkQ2hhbm5lbHMoKSAmJiBwcm9maWxlVG9BZGQtPmhhc1ZhbGlkUmF0ZXMoKSkgeworICAgICAgICBzZXRTYW1wbGVSYXRlc0Zvcihwcm9maWxlVG9BZGQtPmdldFNhbXBsZVJhdGVzKCksIHByb2ZpbGVUb0FkZC0+Z2V0Rm9ybWF0KCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmICFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkUmF0ZXMoKSkgeworICAgICAgICBzZXRDaGFubmVsc0Zvcihwcm9maWxlVG9BZGQtPmdldENoYW5uZWxzKCksIHByb2ZpbGVUb0FkZC0+Z2V0Rm9ybWF0KCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gR28gdGhyb3VnaCB0aGUgbGlzdCBvZiBwcm9maWxlIHRvIGF2b2lkIGR1cGxpY2F0ZXMKKyAgICBmb3IgKHNpemVfdCBwcm9maWxlSW5kZXggPSAwOyBwcm9maWxlSW5kZXggPCBzaXplKCk7IHByb2ZpbGVJbmRleCsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUgPSBpdGVtQXQocHJvZmlsZUluZGV4KTsKKyAgICAgICAgaWYgKHByb2ZpbGUtPmlzVmFsaWQoKSAmJiBwcm9maWxlID09IHByb2ZpbGVUb0FkZCkgeworICAgICAgICAgICAgLy8gTm90aGluZyB0byBkbworICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGVJbmRleDsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7IC8vIHNldCB0aGUgZm9ybWF0IGFzIGR5bmFtaWMgdG8gYWxsb3cgcmVtb3ZhbAorICAgIHJldHVybiBhZGQocHJvZmlsZVRvQWRkKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qcm9maWxlVmVjdG9yOjpjaGVja0V4YWN0UHJvZmlsZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCkBAIC0yODEsNiArMzg0LDIyOCBAQAogICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKK3ZvaWQgQXVkaW9Qcm9maWxlVmVjdG9yOjpjbGVhclByb2ZpbGVzKCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gc2l6ZSgpOyBpICE9IDA7ICkgeworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoLS1pKTsKKyAgICAgICAgaWYgKHByb2ZpbGUtPmlzRHluYW1pY0Zvcm1hdCgpICYmIHByb2ZpbGUtPmhhc1ZhbGlkRm9ybWF0KCkpIHsKKyAgICAgICAgICAgIHJlbW92ZUF0KGkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcHJvZmlsZS0+Y2xlYXIoKTsKKyAgICB9Cit9CisKKy8vIFJldHVybnMgYW4gaW50ZXJzZWN0aW9uIGJldHdlZW4gdHdvIHBvc3NpYmx5IHVuc29ydGVkIHZlY3RvcnMgYW5kIHRoZSBjb250ZW50cyBvZiAnb3JkZXInLgorLy8gVGhlIHJlc3VsdCBpcyBvcmRlcmVkIGFjY29yZGluZyB0byAnb3JkZXInLgordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgT3JkZXI+CitzdGQ6OnZlY3Rvcjx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiBpbnRlcnNlY3RGaWx0ZXJBbmRPcmRlcigKKyAgICAgICAgY29uc3QgVCYgaW5wdXQxLCBjb25zdCBUJiBpbnB1dDIsIGNvbnN0IE9yZGVyJiBvcmRlcikKK3sKKyAgICBzdGQ6OnNldDx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiBzZXQxe2lucHV0MS5iZWdpbigpLCBpbnB1dDEuZW5kKCl9OworICAgIHN0ZDo6c2V0PHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IHNldDJ7aW5wdXQyLmJlZ2luKCksIGlucHV0Mi5lbmQoKX07CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gY29tbW9uOworICAgIHN0ZDo6c2V0X2ludGVyc2VjdGlvbihzZXQxLmJlZ2luKCksIHNldDEuZW5kKCksIHNldDIuYmVnaW4oKSwgc2V0Mi5lbmQoKSwKKyAgICAgICAgICAgIHN0ZDo6aW5zZXJ0ZXIoY29tbW9uLCBjb21tb24uYmVnaW4oKSkpOworICAgIHN0ZDo6dmVjdG9yPHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IHJlc3VsdDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGUgOiBvcmRlcikgeworICAgICAgICBpZiAoY29tbW9uLmZpbmQoZSkgIT0gY29tbW9uLmVuZCgpKSByZXN1bHQucHVzaF9iYWNrKGUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBJbnRlcnNlY3QgdHdvIHBvc3NpYmx5IHVuc29ydGVkIHZlY3RvcnMsIHJldHVybiBjb21tb24gZWxlbWVudHMgYWNjb3JkaW5nIHRvICdjb21wJyBvcmRlcmluZy4KKy8vICdjb21wJyBpcyBhIGNvbXBhcmF0b3IgZnVuY3Rpb24uCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBDb21wYXJlPgorc3RkOjp2ZWN0b3I8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gaW50ZXJzZWN0QW5kT3JkZXIoCisgICAgICAgIGNvbnN0IFQmIGlucHV0MSwgY29uc3QgVCYgaW5wdXQyLCBDb21wYXJlIGNvbXApCit7CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZSwgQ29tcGFyZT4gc2V0MXtpbnB1dDEuYmVnaW4oKSwgaW5wdXQxLmVuZCgpLCBjb21wfTsKKyAgICBzdGQ6OnNldDx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlLCBDb21wYXJlPiBzZXQye2lucHV0Mi5iZWdpbigpLCBpbnB1dDIuZW5kKCksIGNvbXB9OworICAgIHN0ZDo6dmVjdG9yPHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IHJlc3VsdDsKKyAgICBzdGQ6OnNldF9pbnRlcnNlY3Rpb24oc2V0MS5iZWdpbigpLCBzZXQxLmVuZCgpLCBzZXQyLmJlZ2luKCksIHNldDIuZW5kKCksCisgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIocmVzdWx0KSwgY29tcCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgQXVkaW9Qcm9maWxlVmVjdG9yOjpmaW5kQmVzdE1hdGNoaW5nT3V0cHV0Q29uZmlnKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgb3V0cHV0UHJvZmlsZXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4mIHByZWZlcnJlZEZvcm1hdHMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4mIHByZWZlcnJlZE91dHB1dENoYW5uZWxzLAorICAgICAgICAgICAgYm9vbCBwcmVmZXJIaWdoZXJTYW1wbGluZ1JhdGVzLAorICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2UgKmJlc3RPdXRwdXRDb25maWcpIGNvbnN0Cit7CisgICAgYXV0byBmb3JtYXRzID0gaW50ZXJzZWN0RmlsdGVyQW5kT3JkZXIoZ2V0U3VwcG9ydGVkRm9ybWF0cygpLAorICAgICAgICAgICAgb3V0cHV0UHJvZmlsZXMuZ2V0U3VwcG9ydGVkRm9ybWF0cygpLCBwcmVmZXJyZWRGb3JtYXRzKTsKKyAgICAvLyBQaWNrIHRoZSBiZXN0IGNvbXBhdGlibGUgcHJvZmlsZS4KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGYgOiBmb3JtYXRzKSB7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gaW5wdXRQcm9maWxlID0gZ2V0Rmlyc3RWYWxpZFByb2ZpbGVGb3IoZik7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gb3V0cHV0UHJvZmlsZSA9IG91dHB1dFByb2ZpbGVzLmdldEZpcnN0VmFsaWRQcm9maWxlRm9yKGYpOworICAgICAgICBpZiAoaW5wdXRQcm9maWxlID09IG51bGxwdHIgfHwgb3V0cHV0UHJvZmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIGNoYW5uZWxzID0gaW50ZXJzZWN0RmlsdGVyQW5kT3JkZXIoaW5wdXRQcm9maWxlLT5nZXRDaGFubmVscygpLmFzT3V0TWFzaygpLAorICAgICAgICAgICAgICAgIG91dHB1dFByb2ZpbGUtPmdldENoYW5uZWxzKCksIHByZWZlcnJlZE91dHB1dENoYW5uZWxzKTsKKyAgICAgICAgaWYgKGNoYW5uZWxzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGF1dG8gc2FtcGxlUmF0ZXMgPSBwcmVmZXJIaWdoZXJTYW1wbGluZ1JhdGVzID8KKyAgICAgICAgICAgICAgICBpbnRlcnNlY3RBbmRPcmRlcihpbnB1dFByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCksIG91dHB1dFByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmdyZWF0ZXI8dHlwZW5hbWUgU2FtcGxlUmF0ZVZlY3Rvcjo6dmFsdWVfdHlwZT4oKSkgOgorICAgICAgICAgICAgICAgIGludGVyc2VjdEFuZE9yZGVyKGlucHV0UHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSwgb3V0cHV0UHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGVzczx0eXBlbmFtZSBTYW1wbGVSYXRlVmVjdG9yOjp2YWx1ZV90eXBlPigpKTsKKyAgICAgICAgaWYgKHNhbXBsZVJhdGVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEFMT0dEKCIlcygpIGZvdW5kIGNoYW5uZWwgbWFzayAlI3ggYW5kIHNhbXBsZSByYXRlICVkIGZvciBmb3JtYXQgJSN4LiIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sICpjaGFubmVscy5iZWdpbigpLCAqc2FtcGxlUmF0ZXMuYmVnaW4oKSwgZik7CisgICAgICAgIGJlc3RPdXRwdXRDb25maWctPmZvcm1hdCA9IGY7CisgICAgICAgIGJlc3RPdXRwdXRDb25maWctPnNhbXBsZV9yYXRlID0gKnNhbXBsZVJhdGVzLmJlZ2luKCk7CisgICAgICAgIGJlc3RPdXRwdXRDb25maWctPmNoYW5uZWxfbWFzayA9ICpjaGFubmVscy5iZWdpbigpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3NwPEF1ZGlvUHJvZmlsZT4gQXVkaW9Qcm9maWxlVmVjdG9yOjpnZXRGaXJzdFZhbGlkUHJvZmlsZSgpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVtQXQoaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3NwPEF1ZGlvUHJvZmlsZT4gQXVkaW9Qcm9maWxlVmVjdG9yOjpnZXRGaXJzdFZhbGlkUHJvZmlsZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5pc1ZhbGlkKCkgJiYgaXRlbUF0KGkpLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVtQXQoaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0Zvcm1hdFZlY3RvciBBdWRpb1Byb2ZpbGVWZWN0b3I6OmdldFN1cHBvcnRlZEZvcm1hdHMoKSBjb25zdAoreworICAgIEZvcm1hdFZlY3RvciBzdXBwb3J0ZWRGb3JtYXRzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+aGFzVmFsaWRGb3JtYXQoKSkgeworICAgICAgICAgICAgc3VwcG9ydGVkRm9ybWF0cy5hZGQoaXRlbUF0KGkpLT5nZXRGb3JtYXQoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN1cHBvcnRlZEZvcm1hdHM7Cit9CisKK2Jvb2wgQXVkaW9Qcm9maWxlVmVjdG9yOjpoYXNEeW5hbWljQ2hhbm5lbHNGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOworICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY0NoYW5uZWxzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1Byb2ZpbGVWZWN0b3I6Omhhc0R5bmFtaWNQcm9maWxlKCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmlzRHluYW1pYygpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQXVkaW9Qcm9maWxlVmVjdG9yOjpoYXNEeW5hbWljUmF0ZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7CisgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljUmF0ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQXVkaW9Qcm9maWxlVmVjdG9yOjpzZXRGb3JtYXRzKGNvbnN0IEZvcm1hdFZlY3RvciAmZm9ybWF0cykKK3sKKyAgICAvLyBPbmx5IGFsbG93IHRvIGNoYW5nZSB0aGUgZm9ybWF0IG9mIGR5bmFtaWMgcHJvZmlsZQorICAgIHNwPEF1ZGlvUHJvZmlsZT4gZHluYW1pY0Zvcm1hdFByb2ZpbGUgPSBnZXRQcm9maWxlRm9yKGdEeW5hbWljRm9ybWF0KTsKKyAgICBpZiAoZHluYW1pY0Zvcm1hdFByb2ZpbGUgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZm9ybWF0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdHNbaV0sCisgICAgICAgICAgICAgICAgZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmdldENoYW5uZWxzKCksCisgICAgICAgICAgICAgICAgZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCkpOworICAgICAgICBwcm9maWxlLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOworICAgICAgICBwcm9maWxlLT5zZXREeW5hbWljQ2hhbm5lbHMoZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmlzRHluYW1pY0NoYW5uZWxzKCkpOworICAgICAgICBwcm9maWxlLT5zZXREeW5hbWljUmF0ZShkeW5hbWljRm9ybWF0UHJvZmlsZS0+aXNEeW5hbWljUmF0ZSgpKTsKKyAgICAgICAgYWRkKHByb2ZpbGUpOworICAgIH0KK30KKwordm9pZCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFByb2ZpbGVzOlxuIiwgc3BhY2VzLCAiIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzUHJvZmlsZSAlenU6Iiwgc3BhY2VzICsgNCwgIiIsIGkpOworICAgICAgICBpdGVtQXQoaSktPmR1bXAoZHN0LCBzcGFjZXMgKyA4KTsKKyAgICB9Cit9CisKK3NwPEF1ZGlvUHJvZmlsZT4gQXVkaW9Qcm9maWxlVmVjdG9yOjpnZXRQcm9maWxlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmdldEZvcm1hdCgpID09IGZvcm1hdCkgeworICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBBdWRpb1Byb2ZpbGVWZWN0b3I6OnNldFNhbXBsZVJhdGVzRm9yKAorICAgICAgICBjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGVSYXRlcywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOworICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY1JhdGUoKSkgeworICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmhhc1ZhbGlkUmF0ZXMoKSkgeworICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY3JlYXRlIGEgbmV3IHByb2ZpbGUgd2l0aCBzYW1lIGZvcm1hdAorICAgICAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZVRvQWRkID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXQsIHByb2ZpbGUtPmdldENoYW5uZWxzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlcyk7CisgICAgICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOyAvLyBuZWVkIHRvIHNldCB0byBhbGxvdyBjbGVhbmluZworICAgICAgICAgICAgICAgIGFkZChwcm9maWxlVG9BZGQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcm9maWxlLT5zZXRTYW1wbGVSYXRlcyhzYW1wbGVSYXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qcm9maWxlVmVjdG9yOjpzZXRDaGFubmVsc0Zvcihjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7CisgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljQ2hhbm5lbHMoKSkgeworICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmhhc1ZhbGlkQ2hhbm5lbHMoKSkgeworICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gY3JlYXRlIGEgbmV3IHByb2ZpbGUgd2l0aCBzYW1lIGZvcm1hdAorICAgICAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZVRvQWRkID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXQsIGNoYW5uZWxNYXNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCkpOworICAgICAgICAgICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsgLy8gbmVlZCB0byBzZXQgdG8gYWxsb3cgY2xlYW5pbmcKKyAgICAgICAgICAgICAgICBhZGQocHJvZmlsZVRvQWRkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJvZmlsZS0+c2V0Q2hhbm5lbHMoY2hhbm5lbE1hc2tzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gc3RhdGljCiBpbnQgQXVkaW9Qcm9maWxlVmVjdG9yOjpjb21wYXJlRm9ybWF0cyhjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICpwcm9maWxlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gKnByb2ZpbGUyKQogewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Sb3V0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcAppbmRleCA3OWFkMWY3Li43OWYwOTE5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcApAQCAtMjQsMjkgKzI0LDMyIEBACiBuYW1lc3BhY2UgYW5kcm9pZAogewogCi12b2lkIEF1ZGlvUm91dGU6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAordm9pZCBBdWRpb1JvdXRlOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gVHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIG1UeXBlID09IEFVRElPX1JPVVRFX01VWCA/ICJNdXgiIDogIk1peCIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gU2luazogJXNcbiIsIHNwYWNlcywgIiIsIG1TaW5rLT5nZXRUYWdOYW1lKCkuc3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFR5cGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtVHlwZSA9PSBBVURJT19ST1VURV9NVVggPyAiTXV4IiA6ICJNaXgiKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBTaW5rOiAlc1xuIiwgc3BhY2VzLCAiIiwgbVNpbmstPmdldFRhZ05hbWUoKS5zdHJpbmcoKSk7CiAgICAgaWYgKG1Tb3VyY2VzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gU291cmNlczogXG4iLCBzcGFjZXMsICIiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBTb3VyY2VzOiBcbiIsIHNwYWNlcywgIiIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMlcyBcbiIsIHNwYWNlcyArIDQsICIiLCBtU291cmNlc1tpXS0+Z2V0VGFnTmFtZSgpLnN0cmluZygpKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMlcyBcbiIsIHNwYWNlcyArIDQsICIiLCBtU291cmNlc1tpXS0+Z2V0VGFnTmFtZSgpLnN0cmluZygpKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIGRzdC0+YXBwZW5kKCJcbiIpOworfQogCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Citib29sIEF1ZGlvUm91dGU6OnN1cHBvcnRzUGF0Y2goY29uc3Qgc3A8QXVkaW9Qb3J0PiAmc3JjUG9ydCwgY29uc3Qgc3A8QXVkaW9Qb3J0PiAmZHN0UG9ydCkgY29uc3QKK3sKKyAgICBpZiAobVNpbmsgPT0gMCB8fCBkc3RQb3J0ID09IDAgfHwgZHN0UG9ydCAhPSBtU2luaykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEFMT0dWKCIlczogc2lua3MgJXMgbWF0Y2hpbmciLCBfX0ZVTkNUSU9OX18sIG1TaW5rLT5nZXRUYWdOYW1lKCkuc3RyaW5nKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmc291cmNlUG9ydCA6IG1Tb3VyY2VzKSB7CisgICAgICAgIGlmIChzb3VyY2VQb3J0ID09IHNyY1BvcnQpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogc291cmNlcyAlcyBtYXRjaGluZyIsIF9fRlVOQ1RJT05fXywgc291cmNlUG9ydC0+Z2V0VGFnTmFtZSgpLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKIH0KIAogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU2Vzc2lvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZGE0NmIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvU2Vzc2lvbiIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPEF1ZGlvUG9saWN5SW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSAicG9saWN5LmgiCi0jaW5jbHVkZSAiQXVkaW9TZXNzaW9uLmgiCi0jaW5jbHVkZSAiQXVkaW9HYWluLmgiCi0jaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgotCi0jaW5jbHVkZSA8bG9nL2xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1BdWRpb1Nlc3Npb246OkF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTb3VuZFRyaWdnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCogcG9saWN5TWl4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkgOgotICAgIG1SZWNvcmRDbGllbnRJbmZvKHsgLnVpZCA9IHVpZCwgLnNlc3Npb24gPSBzZXNzaW9uLCAuc291cmNlID0gaW5wdXRTb3VyY2V9KSwKLSAgICBtQ29uZmlnKHsgLmZvcm1hdCA9IGZvcm1hdCwgLnNhbXBsZV9yYXRlID0gc2FtcGxlUmF0ZSwgLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrfSksCi0gICAgbUZsYWdzKGZsYWdzKSwgbUlzU291bmRUcmlnZ2VyKGlzU291bmRUcmlnZ2VyKSwKLSAgICBtT3BlbkNvdW50KDEpLCBtQWN0aXZlQ291bnQoMCksIG1Qb2xpY3lNaXgocG9saWN5TWl4KSwgbUNsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpLAotICAgIG1JbmZvUHJvdmlkZXIoTlVMTCkKLXsKLX0KLQotdWludDMyX3QgQXVkaW9TZXNzaW9uOjpjaGFuZ2VPcGVuQ291bnQoaW50IGRlbHRhKQotewotICAgIGlmICgoZGVsdGEgKyAoaW50KW1PcGVuQ291bnQpIDwgMCkgewotICAgICAgICBBTE9HVygiJXMgaW52YWxpZCBkZWx0YSAlZCwgb3BlbiBjb3VudCAlZCIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGVsdGEsIG1PcGVuQ291bnQpOwotICAgICAgICBtT3BlbkNvdW50ID0gKHVpbnQzMl90KSgtZGVsdGEpOwotICAgIH0KLSAgICBtT3BlbkNvdW50ICs9IGRlbHRhOwotICAgIEFMT0dWKCIlcyBvcGVuIGNvdW50ICVkIiwgX19GVU5DVElPTl9fLCBtT3BlbkNvdW50KTsKLSAgICByZXR1cm4gbU9wZW5Db3VudDsKLX0KLQotdWludDMyX3QgQXVkaW9TZXNzaW9uOjpjaGFuZ2VBY3RpdmVDb3VudChpbnQgZGVsdGEpCi17Ci0gICAgY29uc3QgdWludDMyX3Qgb2xkQWN0aXZlQ291bnQgPSBtQWN0aXZlQ291bnQ7Ci0gICAgaWYgKChkZWx0YSArIChpbnQpbUFjdGl2ZUNvdW50KSA8IDApIHsKLSAgICAgICAgQUxPR1coIiVzIGludmFsaWQgZGVsdGEgJWQsIGFjdGl2ZSBjb3VudCAlZCIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGVsdGEsIG1BY3RpdmVDb3VudCk7Ci0gICAgICAgIG1BY3RpdmVDb3VudCA9ICh1aW50MzJfdCkoLWRlbHRhKTsKLSAgICB9Ci0gICAgbUFjdGl2ZUNvdW50ICs9IGRlbHRhOwotICAgIEFMT0dWKCIlcyBhY3RpdmUgY291bnQgJWQiLCBfX0ZVTkNUSU9OX18sIG1BY3RpdmVDb3VudCk7Ci0gICAgaW50IGV2ZW50ID0gUkVDT1JEX0NPTkZJR19FVkVOVF9OT05FOwotCi0gICAgaWYgKChvbGRBY3RpdmVDb3VudCA9PSAwKSAmJiAobUFjdGl2ZUNvdW50ID4gMCkpIHsKLSAgICAgICAgZXZlbnQgPSBSRUNPUkRfQ09ORklHX0VWRU5UX1NUQVJUOwotICAgIH0gZWxzZSBpZiAoKG9sZEFjdGl2ZUNvdW50ID4gMCkgJiYgKG1BY3RpdmVDb3VudCA9PSAwKSkgewotICAgICAgICBldmVudCA9IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RPUDsKLSAgICB9Ci0KLSAgICBpZiAoZXZlbnQgIT0gUkVDT1JEX0NPTkZJR19FVkVOVF9OT05FKSB7Ci0gICAgICAgIC8vIER5bmFtaWMgcG9saWN5IGNhbGxiYWNrOgotICAgICAgICAvLyBpZiBpbnB1dCBtYXBzIHRvIGEgZHluYW1pYyBwb2xpY3kgd2l0aCBhbiBhY3Rpdml0eSBsaXN0ZW5lciwgbm90aWZ5IG9mIHN0YXRlIGNoYW5nZQotICAgICAgICBpZiAoKG1Qb2xpY3lNaXggIT0gTlVMTCkgJiYgKChtUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShtUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgKGV2ZW50ID09IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQpID8gTUlYX1NUQVRFX01JWElORyA6IE1JWF9TVEFURV9JRExFKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlY29yZGluZyBjb25maWd1cmF0aW9uIGNhbGxiYWNrOgotICAgICAgICBjb25zdCBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIqIHByb3ZpZGVyID0gbUluZm9Qcm92aWRlcjsKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBkZXZpY2VDb25maWcgPSAocHJvdmlkZXIgIT0gTlVMTCkgPyBwcm92aWRlci0+Z2V0Q29uZmlnKCkgOgotICAgICAgICAgICAgICAgIEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOwotICAgICAgICBjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSA9IChwcm92aWRlciAhPSBOVUxMKSA/IHByb3ZpZGVyLT5nZXRQYXRjaEhhbmRsZSgpIDoKLSAgICAgICAgICAgICAgICBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgaWYgKHBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsICZtUmVjb3JkQ2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgJm1Db25maWcsICZkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBtQWN0aXZlQ291bnQ7Ci19Ci0KLWJvb2wgQXVkaW9TZXNzaW9uOjptYXRjaGVzKGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4gJm90aGVyKSBjb25zdAotewotICAgIGlmIChvdGhlci0+c2Vzc2lvbigpID09IG1SZWNvcmRDbGllbnRJbmZvLnNlc3Npb24gJiYKLSAgICAgICAgb3RoZXItPmlucHV0U291cmNlKCkgPT0gbVJlY29yZENsaWVudEluZm8uc291cmNlICYmCi0gICAgICAgIG90aGVyLT5mb3JtYXQoKSA9PSBtQ29uZmlnLmZvcm1hdCAmJgotICAgICAgICBvdGhlci0+c2FtcGxlUmF0ZSgpID09IG1Db25maWcuc2FtcGxlX3JhdGUgJiYKLSAgICAgICAgb3RoZXItPmNoYW5uZWxNYXNrKCkgPT0gbUNvbmZpZy5jaGFubmVsX21hc2sgJiYKLSAgICAgICAgb3RoZXItPmZsYWdzKCkgPT0gbUZsYWdzICYmCi0gICAgICAgIG90aGVyLT51aWQoKSA9PSBtUmVjb3JkQ2xpZW50SW5mby51aWQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBBdWRpb1Nlc3Npb246OnNldEluZm9Qcm92aWRlcihBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIgKnByb3ZpZGVyKQotewotICAgIG1JbmZvUHJvdmlkZXIgPSBwcm92aWRlcjsKLX0KLQotdm9pZCBBdWRpb1Nlc3Npb246Om9uU2Vzc2lvbkluZm9VcGRhdGUoKSBjb25zdAotewotICAgIGlmIChtQWN0aXZlQ291bnQgPiAwKSB7Ci0gICAgICAgIC8vIHJlc2VuZCB0aGUgY2FsbGJhY2sgYWZ0ZXIgcmVxdWVyeWluZyB0aGUgaW5mb3JtYXRpb25zIGZyb20gdGhlIGluZm8gcHJvdmlkZXIKLSAgICAgICAgY29uc3QgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyKiBwcm92aWRlciA9IG1JbmZvUHJvdmlkZXI7Ci0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgZGV2aWNlQ29uZmlnID0gKHByb3ZpZGVyICE9IE5VTEwpID8gcHJvdmlkZXItPmdldENvbmZpZygpIDoKLSAgICAgICAgICAgICAgICBBVURJT19DT05GSUdfQkFTRV9JTklUSUFMSVpFUjsKLSAgICAgICAgY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgPSAocHJvdmlkZXIgIT0gTlVMTCkgPyBwcm92aWRlci0+Z2V0UGF0Y2hIYW5kbGUoKSA6Ci0gICAgICAgICAgICAgICAgQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgIGlmIChwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQsCi0gICAgICAgICAgICAgICAgICAgICZtUmVjb3JkQ2xpZW50SW5mbywgJm1Db25maWcsICZkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9TZXNzaW9uOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzQXVkaW8gc2Vzc2lvbiAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHNlc3Npb246ICUyZFxuIiwgc3BhY2VzLCAiIiwgbVJlY29yZENsaWVudEluZm8uc2Vzc2lvbik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3duZXIgdWlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1SZWNvcmRDbGllbnRJbmZvLnVpZCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaW5wdXQgc291cmNlOiAlZFxuIiwgc3BhY2VzLCAiIiwgbVJlY29yZENsaWVudEluZm8uc291cmNlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBmb3JtYXQ6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1Db25maWcuZm9ybWF0KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzYW1wbGU6ICVkXG4iLCBzcGFjZXMsICIiLCBtQ29uZmlnLnNhbXBsZV9yYXRlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBjaGFubmVsIG1hc2s6ICUwOHhcbiIsCi0gICAgICAgICAgICAgc3BhY2VzLCAiIiwgbUNvbmZpZy5jaGFubmVsX21hc2spOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGlzIHNvdW5kdHJpZ2dlcjogJXNcbiIsCi0gICAgICAgICAgICAgc3BhY2VzLCAiIiwgbUlzU291bmRUcmlnZ2VyID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3BlbiBjb3VudDogJWRcbiIsIHNwYWNlcywgIiIsIG1PcGVuQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGFjdGl2ZSBjb3VudDogJWRcbiIsIHNwYWNlcywgIiIsIG1BY3RpdmVDb3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjphZGRTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+JiBhdWRpb1Nlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciAqcHJvdmlkZXIpCi17Ci0gICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoc2Vzc2lvbik7Ci0KLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICBBTE9HVygiYWRkU2Vzc2lvbigpIHNlc3Npb24gJWQgYWxyZWFkeSBpbiIsIHNlc3Npb24pOwotICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7Ci0gICAgfQotICAgIGF1ZGlvU2Vzc2lvbi0+c2V0SW5mb1Byb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICBhZGQoc2Vzc2lvbiwgYXVkaW9TZXNzaW9uKTsKLSAgICBBTE9HVigiYWRkU2Vzc2lvbigpIHNlc3Npb24gJWQgIGNsaWVudCAlZCBzb3VyY2UgJWQiLAotICAgICAgICAgICAgc2Vzc2lvbiwgYXVkaW9TZXNzaW9uLT51aWQoKSwgYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb246OnJlbW92ZVNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoc2Vzc2lvbik7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJyZW1vdmVTZXNzaW9uKCkgc2Vzc2lvbiAlZCBub3QgaW4iLCBzZXNzaW9uKTsKLSAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOwotICAgIH0KLSAgICBBTE9HVigicmVtb3ZlU2Vzc2lvbigpIHNlc3Npb24gJWQiLCBzZXNzaW9uKTsKLSAgICB2YWx1ZUF0KGluZGV4KS0+c2V0SW5mb1Byb3ZpZGVyKE5VTEwpOwotICAgIHJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdWludDMyX3QgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6Z2V0T3BlbkNvdW50KCkgY29uc3QKLXsKLSAgICB1aW50MzJfdCBvcGVuQ291bnQgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgb3BlbkNvdW50ICs9IHZhbHVlQXQoaSktPm9wZW5Db3VudCgpOwotICAgIH0KLSAgICByZXR1cm4gb3BlbkNvdW50OwotfQotCi1BdWRpb1Nlc3Npb25Db2xsZWN0aW9uIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb246OmdldEFjdGl2ZVNlc3Npb25zKCkgY29uc3QKLXsKLSAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGFjdGl2ZVNlc3Npb25zOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKHZhbHVlQXQoaSktPmFjdGl2ZUNvdW50KCkgIT0gMCkgewotICAgICAgICAgICAgYWN0aXZlU2Vzc2lvbnMuYWRkKHZhbHVlQXQoaSktPnNlc3Npb24oKSwgdmFsdWVBdChpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGFjdGl2ZVNlc3Npb25zOwotfQotCi1zaXplX3QgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6Z2V0QWN0aXZlU2Vzc2lvbkNvdW50KCkgY29uc3QKLXsKLSAgICBzaXplX3QgYWN0aXZlQ291bnQgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKHZhbHVlQXQoaSktPmFjdGl2ZUNvdW50KCkgIT0gMCkgewotICAgICAgICAgICAgYWN0aXZlQ291bnQrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYWN0aXZlQ291bnQ7Ci19Ci0KLWJvb2wgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6aGFzQWN0aXZlU2Vzc2lvbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEFjdGl2ZVNlc3Npb25Db3VudCgpICE9IDA7Ci19Ci0KLWJvb2wgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdAotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiAgYXVkaW9TZXNzaW9uID0gdmFsdWVBdChpKTsKLSAgICAgICAgLy8gQVVESU9fU09VUkNFX0hPVFdPUkQgaXMgZXF1aXZhbGVudCB0byBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04gb25seSBpZiBpdAotICAgICAgICAvLyBjb3JyZXNwb25kcyB0byBhbiBhY3RpdmUgY2FwdHVyZSB0cmlnZ2VyZWQgYnkgYSBoYXJkd2FyZSBob3R3b3JkIHJlY29nbml0aW9uCi0gICAgICAgIGlmIChhdWRpb1Nlc3Npb24tPmFjdGl2ZUNvdW50KCkgPiAwICYmCi0gICAgICAgICAgICAgICAgKChhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCkgPT0gc291cmNlKSB8fAotICAgICAgICAgICAgICAgICgoc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTikgJiYKLSAgICAgICAgICAgICAgICAgKGF1ZGlvU2Vzc2lvbi0+aW5wdXRTb3VyY2UoKSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYKLSAgICAgICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5pc1NvdW5kVHJpZ2dlcigpKSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYXVkaW9fc291cmNlX3QgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6Z2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGJvb2wgYWN0aXZlT25seSkgY29uc3QKLXsKLSAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBBVURJT19TT1VSQ0VfREVGQVVMVDsKLSAgICBpbnQzMl90IHByaW9yaXR5ID0gLTE7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4gIGF1ZGlvU2Vzc2lvbiA9IHZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChhY3RpdmVPbmx5ICYmIGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQzMl90IGN1clByaW9yaXR5ID0gc291cmNlX3ByaW9yaXR5KGF1ZGlvU2Vzc2lvbi0+aW5wdXRTb3VyY2UoKSk7Ci0gICAgICAgIGlmIChjdXJQcmlvcml0eSA+IHByaW9yaXR5KSB7Ci0gICAgICAgICAgICBwcmlvcml0eSA9IGN1clByaW9yaXR5OwotICAgICAgICAgICAgc291cmNlID0gYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzb3VyY2U7Ci19Ci0KLXZvaWQgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6b25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0Ci17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICB2YWx1ZUF0KGkpLT5vblNlc3Npb25JbmZvVXBkYXRlKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNBdWRpbyBTZXNzaW9uczpcbiIsIHNwYWNlcywgIiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQsIHNwYWNlcyArIDIsIGkpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU291cmNlRGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1NvdXJjZURlc2NyaXB0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTMzZTU3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU291cmNlRGVzY3JpcHRvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvU291cmNlRGVzY3JpcHRvciIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgotI2luY2x1ZGUgPEh3TW9kdWxlLmg+Ci0jaW5jbHVkZSA8QXVkaW9HYWluLmg+Ci0jaW5jbHVkZSA8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8RGV2aWNlRGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPElPUHJvZmlsZS5oPgotI2luY2x1ZGUgPEF1ZGlvT3V0cHV0RGVzY3JpcHRvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXR1c190IEF1ZGlvU291cmNlRGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJtU3RyZWFtOiAlZFxuIiwgYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZSgmbUF0dHJpYnV0ZXMpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAibURldmljZTpcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBtRGV2aWNlLT5kdW1wKGZkLCAyICwgMCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0KLXN0YXR1c190IEF1ZGlvU291cmNlQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkF1ZGlvIHNvdXJjZXMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gU291cmNlICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi19OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9DbGllbnREZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NsaWVudERlc2NyaXB0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMDdhYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9DbGllbnREZXNjcmlwdG9yLmNwcApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNX0NsaWVudERlc2NyaXB0b3IiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxUeXBlQ29udmVydGVyLmg+CisjaW5jbHVkZSAiQXVkaW9HYWluLmgiCisjaW5jbHVkZSAiQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiQXVkaW9QYXRjaC5oIgorI2luY2x1ZGUgIkNsaWVudERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGQ6OnN0cmluZyBDbGllbnREZXNjcmlwdG9yOjp0b1Nob3J0U3RyaW5nKCkgY29uc3QKK3sKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKworICAgIHNzIDw8ICJQb3J0SWQ6ICIgPDwgbVBvcnRJZCA8PCAiIFNlc3Npb25JZDogIiA8PCBtU2Vzc2lvbklkIDw8ICIgVWlkOiAiIDw8IG1VaWQ7CisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCit2b2lkIENsaWVudERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0NsaWVudCAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFBvcnQgSWQ6ICVkIFNlc3Npb24gSWQ6ICVkIFVJRDogJWRcbiIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICAgbVBvcnRJZCwgbVNlc3Npb25JZCwgbVVpZCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gRm9ybWF0OiAlMDh4IFNhbXBsaW5nIHJhdGU6ICVkIENoYW5uZWxzOiAlMDh4XG4iLCBzcGFjZXMsICIiLAorICAgICAgICAgICAgIG1Db25maWcuZm9ybWF0LCBtQ29uZmlnLnNhbXBsZV9yYXRlLCBtQ29uZmlnLmNoYW5uZWxfbWFzayk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gQXR0cmlidXRlczogJXNcbiIsIHNwYWNlcywgIiIsIHRvU3RyaW5nKG1BdHRyaWJ1dGVzKS5jX3N0cigpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBQcmVmZXJyZWQgRGV2aWNlIElkOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtUHJlZmVycmVkRGV2aWNlSWQpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFN0YXRlOiAlc1xuIiwgc3BhY2VzLCAiIiwgbUFjdGl2ZSA/ICJBY3RpdmUiIDogIkluYWN0aXZlIik7Cit9CisKK3ZvaWQgVHJhY2tDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIENsaWVudERlc2NyaXB0b3I6OmR1bXAoZHN0LCBzcGFjZXMsIGluZGV4KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBTdHJlYW06ICVkIGZsYWdzOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtU3RyZWFtLCBtRmxhZ3MpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFJlZmNvdW50OiAlZFxuIiwgc3BhY2VzLCAiIiwgbUFjdGl2aXR5Q291bnQpOworfQorCitzdGQ6OnN0cmluZyBUcmFja0NsaWVudERlc2NyaXB0b3I6OnRvU2hvcnRTdHJpbmcoKSBjb25zdAoreworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworCisgICAgc3MgPDwgQ2xpZW50RGVzY3JpcHRvcjo6dG9TaG9ydFN0cmluZygpIDw8ICIgU3RyZWFtOiAiIDw8IG1TdHJlYW07CisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCit2b2lkIFJlY29yZENsaWVudERlc2NyaXB0b3I6OnRyYWNrRWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0LCBib29sIGVuYWJsZWQpCit7CisgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgbUVuYWJsZWRFZmZlY3RzLnJlcGxhY2VWYWx1ZUZvcihlZmZlY3QtPm1JZCwgZWZmZWN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRW5hYmxlZEVmZmVjdHMucmVtb3ZlSXRlbShlZmZlY3QtPm1JZCk7CisgICAgfQorfQorCit2b2lkIFJlY29yZENsaWVudERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChkc3QsIHNwYWNlcywgaW5kZXgpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFNvdXJjZTogJWQgZmxhZ3M6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1Tb3VyY2UsIG1GbGFncyk7CisgICAgbUVuYWJsZWRFZmZlY3RzLmR1bXAoZHN0LCBzcGFjZXMgKyAyIC8qc3BhY2VzKi8sIGZhbHNlIC8qdmVyYm9zZSovKTsKK30KKworU291cmNlQ2xpZW50RGVzY3JpcHRvcjo6U291cmNlQ2xpZW50RGVzY3JpcHRvcihhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgdWlkX3QgdWlkLAorICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsIGNvbnN0IHNwPEF1ZGlvUGF0Y2g+JiBwYXRjaERlc2MsCisgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgc3JjRGV2aWNlLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSkgOgorICAgIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjo6VHJhY2tDbGllbnREZXNjcmlwdG9yKHBvcnRJZCwgdWlkLCBBVURJT19TRVNTSU9OX05PTkUsIGF0dHJpYnV0ZXMsCisgICAgICAgIEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSLCBBVURJT19QT1JUX0hBTkRMRV9OT05FLAorICAgICAgICBzdHJlYW0sIHN0cmF0ZWd5LCB2b2x1bWVTb3VyY2UsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsIGZhbHNlLAorICAgICAgICB7fSAvKiBTb3VyY2VzIGRvIG5vdCBzdXBwb3J0IHNlY29uZGFyeSBvdXRwdXRzKi8pLAorICAgICAgICBtUGF0Y2hEZXNjKHBhdGNoRGVzYyksIG1TcmNEZXZpY2Uoc3JjRGV2aWNlKQoreworfQorCit2b2lkIFNvdXJjZUNsaWVudERlc2NyaXB0b3I6OnNldFN3T3V0cHV0KGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgc3dPdXRwdXQpCit7CisgICAgbVN3T3V0cHV0ID0gc3dPdXRwdXQ7Cit9CisKK3ZvaWQgU291cmNlQ2xpZW50RGVzY3JpcHRvcjo6c2V0SHdPdXRwdXQoY29uc3Qgc3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+JiBod091dHB1dCkKK3sKKyAgICBtSHdPdXRwdXQgPSBod091dHB1dDsKK30KKwordm9pZCBTb3VyY2VDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChkc3QsIHNwYWNlcywgaW5kZXgpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIERldmljZTpcbiIsIHNwYWNlcywgIiIpOworICAgIG1TcmNEZXZpY2UtPmR1bXAoZHN0LCAyLCAwKTsKK30KKwordm9pZCBTb3VyY2VDbGllbnRDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZCgiXG5BdWRpbyBzb3VyY2VzOlxuIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgMiwgaSk7CisgICAgfQorfQorCit9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Db25maWdQYXJzaW5nVXRpbHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUxMDVmNS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Db25maWdQYXJzaW5nVXRpbHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6Q29uZmlnUGFyc2luZ1V0aWxzIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSAiQ29uZmlnUGFyc2luZ1V0aWxzLmgiCi0jaW5jbHVkZSAiQXVkaW9HYWluLmgiCi0jaW5jbHVkZSAiSU9Qcm9maWxlLmgiCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0gYXVkaW9fcG9saWN5LmNvbmYgZmlsZSBwYXJzaW5nCi0KLS8vc3RhdGljCi12b2lkIENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEF1ZGlvUG9ydEdhaW4oY25vZGUgKnJvb3QsIEF1ZGlvUG9ydCAmYXVkaW9Qb3J0LCBpbnQgaW5kZXgpCi17Ci0gICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKLQotICAgIHNwPEF1ZGlvR2Fpbj4gZ2FpbiA9IG5ldyBBdWRpb0dhaW4oaW5kZXgsIGF1ZGlvUG9ydC51c2VJbnB1dENoYW5uZWxNYXNrKCkpOwotCi0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01PREUpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldE1vZGUoR2Fpbk1vZGVDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fQ0hBTk5FTFMpID09IDApIHsKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2s7Ci0gICAgICAgICAgICBpZiAoYXVkaW9Qb3J0LnVzZUlucHV0Q2hhbm5lbE1hc2soKSkgewotICAgICAgICAgICAgICAgIGlmIChJbnB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcobm9kZS0+dmFsdWUsIG1hc2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdhaW4tPnNldENoYW5uZWxNYXNrKG1hc2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKE91dHB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcobm9kZS0+dmFsdWUsIG1hc2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdhaW4tPnNldENoYW5uZWxNYXNrKG1hc2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NSU5fVkFMVUUpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldE1pblZhbHVlSW5NYihhdG9pKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUFYX1ZBTFVFKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXRNYXhWYWx1ZUluTWIoYXRvaShub2RlLT52YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX0RFRkFVTFRfVkFMVUUpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldERlZmF1bHRWYWx1ZUluTWIoYXRvaShub2RlLT52YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX1NURVBfVkFMVUUpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldFN0ZXBWYWx1ZUluTWIoYXRvaShub2RlLT52YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01JTl9SQU1QX01TKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXRNaW5SYW1wSW5NcyhhdG9pKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUFYX1JBTVBfTVMpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldE1heFJhbXBJbk1zKGF0b2kobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgfQotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0KLSAgICBBTE9HVigibG9hZEdhaW4oKSBhZGRpbmcgbmV3IGdhaW4gbW9kZSAlMDh4IGNoYW5uZWwgbWFzayAlMDh4IG1pbiBtQiAlZCBtYXggbUIgJWQiLAotICAgICAgICAgIGdhaW4tPmdldE1vZGUoKSwgZ2Fpbi0+Z2V0Q2hhbm5lbE1hc2soKSwgZ2Fpbi0+Z2V0TWluVmFsdWVJbk1iKCksCi0gICAgICAgICAgZ2Fpbi0+Z2V0TWF4VmFsdWVJbk1iKCkpOwotCi0gICAgaWYgKGdhaW4tPmdldE1vZGUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYXVkaW9Qb3J0Lm1HYWlucy5hZGQoZ2Fpbik7Ci19Ci0KLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQXVkaW9Qb3J0R2FpbnMoY25vZGUgKnJvb3QsIEF1ZGlvUG9ydCAmYXVkaW9Qb3J0KQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBBTE9HVigibG9hZEdhaW5zKCkgbG9hZGluZyBnYWluICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgIGxvYWRBdWRpb1BvcnRHYWluKG5vZGUsIGF1ZGlvUG9ydCwgaW5kZXgrKyk7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLX0KLQotLy9zdGF0aWMKLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkRGV2aWNlRGVzY3JpcHRvckdhaW5zKGNub2RlICpyb290LCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlRGVzYykKLXsKLSAgICBsb2FkQXVkaW9Qb3J0R2FpbnMocm9vdCwgKmRldmljZURlc2MpOwotICAgIGlmIChkZXZpY2VEZXNjLT5tR2FpbnMuc2l6ZSgpID4gMCkgewotICAgICAgICBkZXZpY2VEZXNjLT5tR2FpbnNbMF0tPmdldERlZmF1bHRDb25maWcoJmRldmljZURlc2MtPm1HYWluKTsKLSAgICB9Ci19Ci0KLS8vc3RhdGljCi1zdGF0dXNfdCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRId01vZHVsZURldmljZShjbm9kZSAqcm9vdCwgRGV2aWNlVmVjdG9yICZkZXZpY2VzKQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0KLSAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IEFVRElPX0RFVklDRV9OT05FOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQVBNX0RFVklDRV9UWVBFKSA9PSAwKSB7Ci0gICAgICAgICAgICBkZXZpY2VGcm9tU3RyaW5nKG5vZGUtPnZhbHVlLCB0eXBlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICBpZiAodHlwZSA9PSBBVURJT19ERVZJQ0VfTk9ORSB8fAotICAgICAgICAgICAgKCFhdWRpb19pc19pbnB1dF9kZXZpY2UodHlwZSkgJiYgIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UodHlwZSkpKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkRGV2aWNlKCkgYmFkIHR5cGUgJTA4eCIsIHR5cGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IodHlwZSwgU3RyaW5nOChyb290LT5uYW1lKSk7Ci0KLSAgICBub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBBUE1fREVWSUNFX0FERFJFU1MpID09IDApIHsKLSAgICAgICAgICAgIGRldmljZURlc2MtPm1BZGRyZXNzID0gU3RyaW5nOCgoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQ0hBTk5FTFNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlRGVzYy0+YWRkQXVkaW9Qcm9maWxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvUHJvZmlsZShnRHluYW1pY0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRDaGFubmVsTWFza3NGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlUmF0ZVZlY3RvcigpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRldmljZURlc2MtPmFkZEF1ZGlvUHJvZmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdWRpb1Byb2ZpbGUoZ0R5bmFtaWNGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dENoYW5uZWxNYXNrc0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVSYXRlVmVjdG9yKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTlNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBsb2FkRGV2aWNlRGVzY3JpcHRvckdhaW5zKG5vZGUsIGRldmljZURlc2MpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLQotICAgIEFMT0dWKCJsb2FkRGV2aWNlKCkgYWRkaW5nIGRldmljZSB0YWcgKGxpdGVyYWwgdHlwZSkgJXMgdHlwZSAlMDh4IGFkZHJlc3MgJXMiLAotICAgICAgICAgIGRldmljZURlc2MtPmdldFRhZ05hbWUoKS5zdHJpbmcoKSwgdHlwZSwgZGV2aWNlRGVzYy0+bUFkZHJlc3Muc3RyaW5nKCkpOwotCi0gICAgZGV2aWNlcy5hZGQoZGV2aWNlRGVzYyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vL3N0YXRpYwotc3RhdHVzX3QgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkSHdNb2R1bGVQcm9maWxlKGNub2RlICpyb290LCBzcDxId01vZHVsZT4gJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCByb2xlKQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0KLSAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBuZXcgSU9Qcm9maWxlKFN0cmluZzgocm9vdC0+bmFtZSksIHJvbGUpOwotCi0gICAgQXVkaW9Qcm9maWxlVmVjdG9yIGF1ZGlvUHJvZmlsZXM7Ci0gICAgU2FtcGxlUmF0ZVZlY3RvciBzYW1wbGVSYXRlczsKLSAgICBDaGFubmVsc1ZlY3RvciBjaGFubmVsczsKLSAgICBGb3JtYXRWZWN0b3IgZm9ybWF0czsKLQotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgRk9STUFUU19UQUcpID09IDAgJiYKLSAgICAgICAgICAgICAgICBzdHJjbXAobm9kZS0+dmFsdWUsIERZTkFNSUNfVkFMVUVfVEFHKSAhPSAwKSB7Ci0gICAgICAgICAgICBmb3JtYXRzID0gZm9ybWF0c0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBTQU1QTElOR19SQVRFU19UQUcpID09IDAgJiYKLSAgICAgICAgICAgICAgICAgIHN0cmNtcChub2RlLT52YWx1ZSwgRFlOQU1JQ19WQUxVRV9UQUcpICE9IDApIHsKLSAgICAgICAgICAgIGNvbGxlY3Rpb25Gcm9tU3RyaW5nPFNhbXBsZVJhdGVUcmFpdHM+KG5vZGUtPnZhbHVlLCBzYW1wbGVSYXRlcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIENIQU5ORUxTX1RBRykgPT0gMCAmJgotICAgICAgICAgICAgICAgICAgIHN0cmNtcChub2RlLT52YWx1ZSwgRFlOQU1JQ19WQUxVRV9UQUcpICE9IDApIHsKLSAgICAgICAgICAgIGlmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7Ci0gICAgICAgICAgICAgICAgY2hhbm5lbHMgPSBpbnB1dENoYW5uZWxNYXNrc0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjaGFubmVscyA9IG91dHB1dENoYW5uZWxNYXNrc0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBERVZJQ0VTX1RBRykgPT0gMCkgewotICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7Ci0gICAgICAgICAgICBsb2FkRGV2aWNlc0Zyb21UYWcobm9kZS0+dmFsdWUsIGRldmljZXMsIG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkpOwotICAgICAgICAgICAgcHJvZmlsZS0+c2V0U3VwcG9ydGVkRGV2aWNlcyhkZXZpY2VzKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgRkxBR1NfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykgewotICAgICAgICAgICAgICAgIHByb2ZpbGUtPnNldEZsYWdzKElucHV0RmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZS0+c2V0RmxhZ3MoT3V0cHV0RmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTlNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBsb2FkQXVkaW9Qb3J0R2FpbnMobm9kZSwgKnByb2ZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICBpZiAoZm9ybWF0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGdEeW5hbWljRm9ybWF0LCBjaGFubmVscywgc2FtcGxlUmF0ZXMpOwotICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7Ci0gICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0NoYW5uZWxzKGNoYW5uZWxzLmlzRW1wdHkoKSk7Ci0gICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY1JhdGUoc2FtcGxlUmF0ZXMuaXNFbXB0eSgpKTsKLSAgICAgICAgYXVkaW9Qcm9maWxlcy5hZGQocHJvZmlsZVRvQWRkKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbiwgZm9yIGVhY2ggZm9ybWF0LCBjcmVhdGVzIGEgcHJvZmlsZSB3aXRoIHRoZSBzYW1lCi0gICAgICAgICAgICAvLyBjb2xsZWN0aW9uIG9mIHJhdGUgYW5kIGNoYW5uZWxzLgotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdHNbaV0sIGNoYW5uZWxzLCBzYW1wbGVSYXRlcyk7Ci0gICAgICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQoZm9ybWF0c1tpXSA9PSBnRHluYW1pY0Zvcm1hdCk7Ci0gICAgICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNDaGFubmVscyhjaGFubmVscy5pc0VtcHR5KCkpOwotICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljUmF0ZShzYW1wbGVSYXRlcy5pc0VtcHR5KCkpOwotICAgICAgICAgICAgYXVkaW9Qcm9maWxlcy5hZGQocHJvZmlsZVRvQWRkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcm9maWxlLT5zZXRBdWRpb1Byb2ZpbGVzKGF1ZGlvUHJvZmlsZXMpOwotICAgIEFMT0dXX0lGKCFwcm9maWxlLT5oYXNTdXBwb3J0ZWREZXZpY2VzKCksICJsb2FkJXMoKSBpbnZhbGlkIHN1cHBvcnRlZCBkZXZpY2VzIiwKLSAgICAgICAgICAgICByb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LID8gIklucHV0IiA6ICJPdXRwdXQiKTsKLSAgICBpZiAocHJvZmlsZS0+aGFzU3VwcG9ydGVkRGV2aWNlcygpKSB7Ci0gICAgICAgIEFMT0dWKCJsb2FkJXMoKSBhZGRpbmcgU3VwcG9ydGVkIERldmljZXMgJTA0eCwgbUZsYWdzICUwNHgiLAotICAgICAgICAgICAgICByb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LID8gIklucHV0IiA6ICJPdXRwdXQiLAotICAgICAgICAgICAgICBwcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpLCBwcm9maWxlLT5nZXRGbGFncygpKTsKLSAgICAgICAgcmV0dXJuIG1vZHVsZS0+YWRkUHJvZmlsZShwcm9maWxlKTsKLSAgICB9Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQotLy9zdGF0aWMKLXN0YXR1c190IENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEh3TW9kdWxlKGNub2RlICpyb290LCBzcDxId01vZHVsZT4gJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBERVZJQ0VTX1RBRyk7Ci0gICAgaWYgKG5vZGUgIT0gTlVMTCkgewotICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgICAgIERldmljZVZlY3RvciBkZXZpY2VzOwotICAgICAgICB3aGlsZSAobm9kZSkgewotICAgICAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZSgpIGxvYWRpbmcgZGV2aWNlICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCB0bXBTdGF0dXMgPSBsb2FkSHdNb2R1bGVEZXZpY2Uobm9kZSwgZGV2aWNlcyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRtcFN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgICB9Ci0gICAgICAgIG1vZHVsZS0+c2V0RGVjbGFyZWREZXZpY2VzKGRldmljZXMpOwotICAgIH0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgT1VUUFVUU19UQUcpOwotICAgIGlmIChub2RlICE9IE5VTEwpIHsKLSAgICAgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgICAgICB3aGlsZSAobm9kZSkgewotICAgICAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZSgpIGxvYWRpbmcgb3V0cHV0ICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCB0bXBTdGF0dXMgPSBsb2FkSHdNb2R1bGVQcm9maWxlKG5vZGUsIG1vZHVsZSwgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRtcFN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgICB9Ci0gICAgfQotICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBJTlBVVFNfVEFHKTsKLSAgICBpZiAobm9kZSAhPSBOVUxMKSB7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICAgICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIGlucHV0ICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCB0bXBTdGF0dXMgPSBsb2FkSHdNb2R1bGVQcm9maWxlKG5vZGUsIG1vZHVsZSwgQVVESU9fUE9SVF9ST0xFX1NJTkspOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgfQotICAgIH0KLSAgICBsb2FkTW9kdWxlR2xvYmFsQ29uZmlnKHJvb3QsIG1vZHVsZSwgY29uZmlnKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi0vL3N0YXRpYwotdm9pZCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRId01vZHVsZXMoY25vZGUgKnJvb3QsIEh3TW9kdWxlQ29sbGVjdGlvbiAmaHdNb2R1bGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZykKLXsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEFVRElPX0hXX01PRFVMRV9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlcygpIGxvYWRpbmcgbW9kdWxlICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBuZXcgSHdNb2R1bGUobm9kZS0+bmFtZSk7Ci0gICAgICAgIGlmIChsb2FkSHdNb2R1bGUobm9kZSwgbW9kdWxlLCBjb25maWcpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBod01vZHVsZXMuYWRkKG1vZHVsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotfQotCi0vL3N0YXRpYwotdm9pZCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWREZXZpY2VzRnJvbVRhZyhjb25zdCBjaGFyICp0YWcsIERldmljZVZlY3RvciAmZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZWNsYXJlZERldmljZXMpCi17Ci0gICAgY2hhciAqdGFnTGl0ZXJhbCA9IHN0cm5kdXAodGFnLCBzdHJsZW4odGFnKSk7Ci0gICAgY2hhciAqZGV2VGFnID0gc3RydG9rKHRhZ0xpdGVyYWwsIEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IpOwotICAgIHdoaWxlIChkZXZUYWcgIT0gTlVMTCkgewotICAgICAgICBpZiAoc3RybGVuKGRldlRhZykgIT0gMCkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGU7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlRnJvbVN0cmluZyhkZXZUYWcsIHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgaW5CaXQgPSB0eXBlICYgQVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICAgICAgICAgICAgICB0eXBlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgICAgICAgICAgICAgIHdoaWxlICh0eXBlKSB7Ci0gICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgc2luZ2xlVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbkJpdCB8ICgxIDw8ICgzMSAtIF9fYnVpbHRpbl9jbHoodHlwZSkpKTsKLSAgICAgICAgICAgICAgICAgICAgdHlwZSAmPSB+c2luZ2xlVHlwZTsKLSAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2ID0gbmV3IERldmljZURlc2NyaXB0b3Ioc2luZ2xlVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIGRldmljZXMuYWRkKGRldik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VGcm9tVGFnTmFtZShTdHJpbmc4KGRldlRhZykpOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2VEZXNjICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlRGVzYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRldlRhZyA9IHN0cnRvayhOVUxMLCBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKTsKLSAgICB9Ci0gICAgZnJlZSh0YWdMaXRlcmFsKTsKLX0KLQotLy9zdGF0aWMKLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkTW9kdWxlR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBjb25zdCBzcDxId01vZHVsZT4gJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpCi17Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBHTE9CQUxfQ09ORklHX1RBRyk7Ci0KLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRGV2aWNlVmVjdG9yIGRlY2xhcmVkRGV2aWNlczsKLSAgICBpZiAobW9kdWxlICE9IE5VTEwpIHsKLSAgICAgICAgZGVjbGFyZWREZXZpY2VzID0gbW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKTsKLSAgICB9Ci0KLSAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChBVFRBQ0hFRF9PVVRQVVRfREVWSUNFU19UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzOwotICAgICAgICAgICAgbG9hZERldmljZXNGcm9tVGFnKG5vZGUtPnZhbHVlLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBkZWNsYXJlZERldmljZXMpOwotICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBBdHRhY2hlZCBPdXRwdXQgRGV2aWNlcyAlMDh4IiwKLSAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSk7Ci0gICAgICAgICAgICBjb25maWcuYWRkQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyhhdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoREVGQVVMVF9PVVRQVVRfREVWSUNFX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwotICAgICAgICAgICAgZGV2aWNlRnJvbVN0cmluZyhub2RlLT52YWx1ZSwgZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZWZhdWx0T3V0cHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBjb25maWcuc2V0RGVmYXVsdE91dHB1dERldmljZShkZWZhdWx0T3V0cHV0RGV2aWNlKTsKLSAgICAgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1EZWZhdWx0T3V0cHV0RGV2aWNlICUwOHgiLCBkZWZhdWx0T3V0cHV0RGV2aWNlLT50eXBlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVygibG9hZEdsb2JhbENvbmZpZygpIGRlZmF1bHQgZGV2aWNlIG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoQVRUQUNIRURfSU5QVVRfREVWSUNFU19UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVJbnB1dERldmljZXM7Ci0gICAgICAgICAgICBsb2FkRGV2aWNlc0Zyb21UYWcobm9kZS0+dmFsdWUsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgZGVjbGFyZWREZXZpY2VzKTsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgQXZhaWxhYmxlIElucHV0RGV2aWNlcyAlMDh4IiwgYXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkpOwotICAgICAgICAgICAgY29uZmlnLmFkZEF2YWlsYWJsZUlucHV0RGV2aWNlcyhhdmFpbGFibGVJbnB1dERldmljZXMpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChBVURJT19IQUxfVkVSU0lPTl9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIHVpbnQzMl90IG1ham9yLCBtaW5vcjsKLSAgICAgICAgICAgIHNzY2FuZigoY2hhciAqKW5vZGUtPnZhbHVlLCAiJXUuJXUiLCAmbWFqb3IsICZtaW5vcik7Ci0gICAgICAgICAgICBtb2R1bGUtPnNldEhhbFZlcnNpb24obWFqb3IsIG1pbm9yKTsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgbUhhbFZlcnNpb24gPSBtYWpvciAldSBtaW5vciAldSIsIG1ham9yLCBtaW5vcik7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotfQotCi0vL3N0YXRpYwotdm9pZCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRHbG9iYWxDb25maWcoY25vZGUgKnJvb3QsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxId01vZHVsZT4mIHByaW1hcnlNb2R1bGUpCi17Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBHTE9CQUxfQ09ORklHX1RBRyk7Ci0KLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAoU1BFQUtFUl9EUkNfRU5BQkxFRF9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIGJvb2wgc3BlYWtlckRyY0VuYWJsZWQ7Ci0gICAgICAgICAgICBpZiAodXRpbGl0aWVzOjpjb252ZXJ0VG88c3RkOjpzdHJpbmcsIGJvb2w+KG5vZGUtPnZhbHVlLCBzcGVha2VyRHJjRW5hYmxlZCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1TcGVha2VyRHJjRW5hYmxlZCA9ICVkIiwgc3BlYWtlckRyY0VuYWJsZWQpOwotICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRTcGVha2VyRHJjRW5hYmxlZChzcGVha2VyRHJjRW5hYmxlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotICAgIGxvYWRNb2R1bGVHbG9iYWxDb25maWcocm9vdCwgcHJpbWFyeU1vZHVsZSwgY29uZmlnKTsKLX0KLQotLy9zdGF0aWMKLXN0YXR1c190IENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZENvbmZpZyhjb25zdCBjaGFyICpwYXRoLCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKQotewotICAgIGNub2RlICpyb290OwotICAgIGNoYXIgKmRhdGE7Ci0KLSAgICBkYXRhID0gKGNoYXIgKilsb2FkX2ZpbGUocGF0aCwgTlVMTCk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcm9vdCA9IGNvbmZpZ19ub2RlKCIiLCAiIik7Ci0gICAgY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7Ci0KLSAgICBId01vZHVsZUNvbGxlY3Rpb24gaHdNb2R1bGVzOwotICAgIGxvYWRId01vZHVsZXMocm9vdCwgaHdNb2R1bGVzLCBjb25maWcpOwotCi0gICAgLy8gbGVnYWN5IGF1ZGlvX3BvbGljeS5jb25mIGZpbGVzIGhhdmUgb25lIGdsb2JhbF9jb25maWd1cmF0aW9uIHNlY3Rpb24sIGF0dGFjaGVkIHRvIHByaW1hcnkuCi0gICAgbG9hZEdsb2JhbENvbmZpZyhyb290LCBjb25maWcsIGh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSkpOwotCi0gICAgY29uZmlnLnNldEh3TW9kdWxlcyhod01vZHVsZXMpOwotCi0gICAgY29uZmlnX2ZyZWUocm9vdCk7Ci0gICAgZnJlZShyb290KTsKLSAgICBmcmVlKGRhdGEpOwotCi0gICAgQUxPR0koImxvYWRBdWRpb1BvbGljeUNvbmZpZygpIGxvYWRlZCAlc1xuIiwgcGF0aCk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAKaW5kZXggMTljMjA2Mi4uOTE5NjFkMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAKQEAgLTE4LDYgKzE4LDggQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3N0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgogI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKICNpbmNsdWRlICJBdWRpb0dhaW4uaCIKQEAgLTI2LDE0ICsyOCwzMCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBEZXZpY2VEZXNjcmlwdG9yOjpEZXZpY2VEZXNjcmlwdG9yKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4ICZ0YWdOYW1lKSA6CisgICAgICAgIERldmljZURlc2NyaXB0b3IodHlwZSwgRm9ybWF0VmVjdG9ye30sIHRhZ05hbWUpCit7Cit9CisKK0RldmljZURlc2NyaXB0b3I6OkRldmljZURlc2NyaXB0b3IoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IEZvcm1hdFZlY3RvciAmZW5jb2RlZEZvcm1hdHMsCisgICAgICAgIGNvbnN0IFN0cmluZzggJnRhZ05hbWUpIDoKICAgICBBdWRpb1BvcnQoU3RyaW5nOCgiIiksIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsCiAgICAgICAgICAgICAgIGF1ZGlvX2lzX291dHB1dF9kZXZpY2UodHlwZSkgPyBBVURJT19QT1JUX1JPTEVfU0lOSyA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU09VUkNFKSwKLSAgICBtQWRkcmVzcygiIiksIG1UYWdOYW1lKHRhZ05hbWUpLCBtRGV2aWNlVHlwZSh0eXBlKSwgbUlkKDApCisgICAgbVRhZ05hbWUodGFnTmFtZSksIG1EZXZpY2VUeXBlKHR5cGUpLCBtRW5jb2RlZEZvcm1hdHMoZW5jb2RlZEZvcm1hdHMpCiB7CisgICAgbUN1cnJlbnRFbmNvZGVkRm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CiAgICAgaWYgKHR5cGUgPT0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVggfHwgdHlwZSA9PSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVggKSB7CiAgICAgICAgIG1BZGRyZXNzID0gU3RyaW5nOCgiMCIpOwogICAgIH0KKyAgICAvKiBJZiBmcmFtZXdvcmsgcnVucyBhZ2FpbnN0IGEgcHJlIDUuMCBBdWRpbyBIQUwsIGVuY29kZWQgZm9ybWF0cyBhcmUgYWJzZW50IGZyb20gdGhlIGNvbmZpZy4KKyAgICAgKiBGSVhNRTogQVBNIHNob3VsZCBrbm93IHRoZSB2ZXJzaW9uIG9mIHRoZSBIQUwgYW5kIGRvbid0IGFkZCB0aGUgZm9ybWF0cyBmb3IgVjUuMC4KKyAgICAgKiBGb3Igbm93LCB0aGUgd29ya2Fyb3VuZCB0byByZW1vdmUgQUMzIGFuZCBJRUM2MTkzNyBzdXBwb3J0IG9uIEhETUkgaXMgdG8gZGVjbGFyZQorICAgICAqIHNvbWV0aGluZyBsaWtlICdlbmNvZGVkRm9ybWF0cz0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiJyBvbiB0aGUgSERNSSBkZXZpY2VQb3J0LgorICAgICAqLworICAgIGlmICh0eXBlID09IEFVRElPX0RFVklDRV9PVVRfSERNSSAmJiBtRW5jb2RlZEZvcm1hdHMuaXNFbXB0eSgpKSB7CisgICAgICAgIG1FbmNvZGVkRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0FDMyk7CisgICAgICAgIG1FbmNvZGVkRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0lFQzYxOTM3KTsKKyAgICB9CiB9CiAKIGF1ZGlvX3BvcnRfaGFuZGxlX3QgRGV2aWNlRGVzY3JpcHRvcjo6Z2V0SWQoKSBjb25zdApAQCAtNDcsMTUgKzY1LDU3IEBACiAgICAgbUlkID0gZ2V0TmV4dFVuaXF1ZUlkKCk7CiB9CiAKK3ZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6ZGV0YWNoKCkgeworICAgIG1JZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgQXVkaW9Qb3J0OjpkZXRhY2goKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgY2hlY2tFcXVhbChjb25zdCBUJiBmMSwgY29uc3QgVCYgZjIpCit7CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gczEoZjEuYmVnaW4oKSwgZjEuZW5kKCkpOworICAgIHN0ZDo6c2V0PHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IHMyKGYyLmJlZ2luKCksIGYyLmVuZCgpKTsKKyAgICByZXR1cm4gczEgPT0gczI7Cit9CisKIGJvb2wgRGV2aWNlRGVzY3JpcHRvcjo6ZXF1YWxzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBvdGhlcikgY29uc3QKIHsKICAgICAvLyBEZXZpY2VzIGFyZSBjb25zaWRlcmVkIGVxdWFsIGlmIHRoZXk6CiAgICAgLy8gLSBhcmUgb2YgdGhlIHNhbWUgdHlwZSAoYSBkZXZpY2UgdHlwZSBjYW5ub3QgYmUgQVVESU9fREVWSUNFX05PTkUpCiAgICAgLy8gLSBoYXZlIHRoZSBzYW1lIGFkZHJlc3MKKyAgICAvLyAtIGhhdmUgdGhlIHNhbWUgZW5jb2RpbmdGb3JtYXRzIChpZiBkZXZpY2Ugc3VwcG9ydHMgZW5jb2RpbmcpCiAgICAgaWYgKG90aGVyID09IDApIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gKG1EZXZpY2VUeXBlID09IG90aGVyLT5tRGV2aWNlVHlwZSkgJiYgKG1BZGRyZXNzID09IG90aGVyLT5tQWRkcmVzcyk7CisKKyAgICByZXR1cm4gKG1EZXZpY2VUeXBlID09IG90aGVyLT5tRGV2aWNlVHlwZSkgJiYgKG1BZGRyZXNzID09IG90aGVyLT5tQWRkcmVzcykgJiYKKyAgICAgICAgICAgY2hlY2tFcXVhbChtRW5jb2RlZEZvcm1hdHMsIG90aGVyLT5tRW5jb2RlZEZvcm1hdHMpOworfQorCitib29sIERldmljZURlc2NyaXB0b3I6Omhhc0N1cnJlbnRFbmNvZGVkRm9ybWF0KCkgY29uc3QKK3sKKyAgICBpZiAoIWRldmljZV9oYXNfZW5jb2RpbmdfY2FwYWJpbGl0eSh0eXBlKCkpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAobUVuY29kZWRGb3JtYXRzLmlzRW1wdHkoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gKG1DdXJyZW50RW5jb2RlZEZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCk7Cit9CisKK2Jvb2wgRGV2aWNlRGVzY3JpcHRvcjo6c3VwcG9ydHNGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQoreworICAgIGlmIChtRW5jb2RlZEZvcm1hdHMuaXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byYgZGV2Rm9ybWF0IDogbUVuY29kZWRGb3JtYXRzKSB7CisgICAgICAgIGlmIChkZXZGb3JtYXQgPT0gZm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgRGV2aWNlVmVjdG9yOjpyZWZyZXNoVHlwZXMoKQpAQCAtNzAsNyArMTMwLDcgQEAKIHNzaXplX3QgRGV2aWNlVmVjdG9yOjppbmRleE9mKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKSBjb25zdAogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW0tPmVxdWFscyhpdGVtQXQoaSkpKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmVxdWFscyhpdGVtKSkgeyAvLyBpdGVtIG1heSBiZSBudWxsIHNwPD4sIGkuZS4gQVVESU9fREVWSUNFX05PTkUKICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTIxLDcwICsxODEsODQgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1hdWRpb19kZXZpY2VzX3QgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0Cit2b2lkIERldmljZVZlY3Rvcjo6cmVtb3ZlKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykKIHsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IEFVRElPX0RFVklDRV9OT05FOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1BdChpKS0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gbW9kdWxlSGFuZGxlKSB7Ci0gICAgICAgICAgICBkZXZpY2VzIHw9IGl0ZW1BdChpKS0+dHlwZSgpOworICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogZGV2aWNlcykgeworICAgICAgICByZW1vdmUoZGV2aWNlKTsKKyAgICB9Cit9CisKK0RldmljZVZlY3RvciBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tSHdNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSkgY29uc3QKK3sKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6ICp0aGlzKSB7CisgICAgICAgIGlmIChkZXZpY2UtPmdldE1vZHVsZUhhbmRsZSgpID09IG1vZHVsZUhhbmRsZSkgeworICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZGV2aWNlczsKIH0KIAotc3A8RGV2aWNlRGVzY3JpcHRvcj4gRGV2aWNlVmVjdG9yOjpnZXREZXZpY2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpIGNvbnN0CithdWRpb19kZXZpY2VzX3QgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VUeXBlc0Zyb21Id01vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlKSBjb25zdAoreworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlcyA9IEFVRElPX0RFVklDRV9OT05FOworICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGRldmljZS0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gbW9kdWxlSGFuZGxlKSB7CisgICAgICAgICAgICBkZXZpY2VUeXBlcyB8PSBkZXZpY2UtPnR5cGUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlVHlwZXM7Cit9CisKK3NwPERldmljZURlc2NyaXB0b3I+IERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAogewogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIGlmIChpdGVtQXQoaSktPnR5cGUoKSA9PSB0eXBlKSB7Ci0gICAgICAgICAgICBpZiAoYWRkcmVzcyA9PSAiIiB8fCBpdGVtQXQoaSktPm1BZGRyZXNzID09IGFkZHJlc3MpIHsKKyAgICAgICAgICAgIC8vIElmIGZvcm1hdCBpcyBzcGVjaWZpZWQsIG1hdGNoIGl0IGFuZCBpZ25vcmUgYWRkcmVzcworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGlmIGFkZHJlc3MgaXMgc3BlY2lmaWVkIG1hdGNoIGl0CisgICAgICAgICAgICAvLyBPdGhlcndpc2UgYWx3YXlzIG1hdGNoCisgICAgICAgICAgICBpZiAoKChhZGRyZXNzID09ICIiIHx8IGl0ZW1BdChpKS0+YWRkcmVzcygpID09IGFkZHJlc3MpICYmCisgICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgfHwKKyAgICAgICAgICAgICAgICAoaXRlbUF0KGkpLT5zdXBwb3J0c0Zvcm1hdChmb3JtYXQpICYmIGZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCkpIHsKICAgICAgICAgICAgICAgICBkZXZpY2UgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+bUFkZHJlc3MgPT0gYWRkcmVzcykgeworICAgICAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPmFkZHJlc3MoKSA9PSBhZGRyZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpnZXREZXZpY2UoKSBmb3IgdHlwZSAlMDh4IGFkZHJlc3MgJXMgZm91bmQgJXAiLAotICAgICAgICAgIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCksIGRldmljZS5nZXQoKSk7CisgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6JXMoKSBmb3IgdHlwZSAlMDh4IGFkZHJlc3MgXCIlc1wiIGZvdW5kICVwIGZvcm1hdCAlMDh4IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCB0eXBlLCBhZGRyZXNzLnN0cmluZygpLCBkZXZpY2UuZ2V0KCksIGZvcm1hdCk7CiAgICAgcmV0dXJuIGRldmljZTsKIH0KIAogc3A8RGV2aWNlRGVzY3JpcHRvcj4gRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3QKIHsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6ICp0aGlzKSB7Ci0gICAgICAgIGlmIChkZXZpY2UtPmdldElkKCkgPT0gaWQpIHsKLSAgICAgICAgICAgIHJldHVybiBkZXZpY2U7CisgICAgaWYgKGlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiAqdGhpcykgeworICAgICAgICAgICAgaWYgKGRldmljZS0+Z2V0SWQoKSA9PSBpZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2U7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLURldmljZVZlY3RvciBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZShhdWRpb19kZXZpY2VzX3QgdHlwZSkgY29uc3QKK0RldmljZVZlY3RvciBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZU1hc2soYXVkaW9fZGV2aWNlc190IHR5cGUpIGNvbnN0CiB7CiAgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CiAgICAgYm9vbCBpc091dHB1dCA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKHR5cGUpOwogICAgIHR5cGUgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IChpIDwgc2l6ZSgpKSAmJiAodHlwZSAhPSBBVURJT19ERVZJQ0VfTk9ORSk7IGkrKykgewotICAgICAgICBib29sIGN1cklzT3V0cHV0ID0gYXVkaW9faXNfb3V0cHV0X2RldmljZXMoaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSk7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJUeXBlID0gaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgICAgICBib29sIGN1cklzT3V0cHV0ID0gYXVkaW9faXNfb3V0cHV0X2RldmljZXMoaXRlbUF0KGkpLT50eXBlKCkpOworICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyVHlwZSA9IGl0ZW1BdChpKS0+dHlwZSgpICYgfkFVRElPX0RFVklDRV9CSVRfSU47CiAgICAgICAgIGlmICgoaXNPdXRwdXQgPT0gY3VySXNPdXRwdXQpICYmICgodHlwZSAmIGN1clR5cGUpICE9IDApKSB7CiAgICAgICAgICAgICBkZXZpY2VzLmFkZChpdGVtQXQoaSkpOwogICAgICAgICAgICAgdHlwZSAmPSB+Y3VyVHlwZTsKLSAgICAgICAgICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZSgpIGZvciB0eXBlICV4IGZvdW5kICVwIiwKLSAgICAgICAgICAgICAgICAgIGl0ZW1BdChpKS0+dHlwZSgpLCBpdGVtQXQoaSkuZ2V0KCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBkZXZpY2VzOwotfQotCi1EZXZpY2VWZWN0b3IgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGVBZGRyKAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykgY29uc3QKLXsKLSAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6ICp0aGlzKSB7Ci0gICAgICAgIGlmIChkZXZpY2UtPnR5cGUoKSA9PSB0eXBlICYmIGRldmljZS0+bUFkZHJlc3MgPT0gYWRkcmVzcykgewotICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OiVzKCkgZm9yIHR5cGUgJTA4eCBmb3VuZCAlcCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBpdGVtQXQoaSktPnR5cGUoKSwgaXRlbUF0KGkpLmdldCgpKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZGV2aWNlczsKQEAgLTIwMCwyMCArMjc0LDE1IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXN0YXR1c190IERldmljZVZlY3Rvcjo6ZHVtcChpbnQgZmQsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlKSBjb25zdAordm9pZCBEZXZpY2VWZWN0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBjb25zdCBTdHJpbmc4ICZ0YWcsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSkgY29uc3QKIHsKICAgICBpZiAoaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gJXMgZGV2aWNlczpcbiIsIHNwYWNlcywgIiIsIHRhZy5zdHJpbmcoKSk7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtICVzIGRldmljZXM6XG4iLCBzcGFjZXMsICIiLCB0YWcuc3RyaW5nKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGZkLCBzcGFjZXMgKyAyLCBpLCB2ZXJib3NlKTsKKyAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGRzdCwgc3BhY2VzICsgMiwgaSwgdmVyYm9zZSk7CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogdm9pZCBEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKQEAgLTI0NiwxOSArMzE1LDE4IEBACiAgICAgLy8gd2l0aG91dCB0aGUgdGVzdD8KICAgICAvLyBUaGlzIGhhcyBiZWVuIGRlbW9uc3RyYXRlZCB0byBOT1QgYmUgdHJ1ZSAoYXQgc3RhcnQgdXApCiAgICAgLy8gQUxPR19BU1NFUlQobU1vZHVsZSAhPSBOVUxMKTsKLSAgICBkc3RDb25maWctPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0KLSAgICAgICAgICAgIG1Nb2R1bGUgIT0gMCA/IG1Nb2R1bGUtPmdldEhhbmRsZSgpIDogQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOworICAgIGRzdENvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBnZXRNb2R1bGVIYW5kbGUoKTsKICAgICAodm9pZClhdWRpb191dGlsc19zdHJsY3B5X3plcm9maWxsKGRzdENvbmZpZy0+ZXh0LmRldmljZS5hZGRyZXNzLCBtQWRkcmVzcy5zdHJpbmcoKSk7CiB9CiAKIHZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0CiB7Ci0gICAgQUxPR1YoIkRldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KCkgaGFuZGxlICVkIHR5cGUgJXgiLCBtSWQsIG1EZXZpY2VUeXBlKTsKKyAgICBBTE9HVigiRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoKSBoYW5kbGUgJWQgdHlwZSAlMDh4IiwgbUlkLCBtRGV2aWNlVHlwZSk7CiAgICAgQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydChwb3J0KTsKICAgICBwb3J0LT5pZCA9IG1JZDsKICAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7CiAgICAgcG9ydC0+ZXh0LmRldmljZS50eXBlID0gbURldmljZVR5cGU7Ci0gICAgcG9ydC0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBtTW9kdWxlLT5nZXRIYW5kbGUoKTsKKyAgICBwb3J0LT5leHQuZGV2aWNlLmh3X21vZHVsZSA9IGdldE1vZHVsZUhhbmRsZSgpOwogICAgICh2b2lkKWF1ZGlvX3V0aWxzX3N0cmxjcHlfemVyb2ZpbGwocG9ydC0+ZXh0LmRldmljZS5hZGRyZXNzLCBtQWRkcmVzcy5zdHJpbmcoKSk7CiB9CiAKQEAgLTI3MCw0MiArMzM4LDcxIEBACiAgICAgcG9ydC0+cGlja0F1ZGlvUHJvZmlsZShtU2FtcGxpbmdSYXRlLCBtQ2hhbm5lbE1hc2ssIG1Gb3JtYXQpOwogfQogCi1zdGF0dXNfdCBEZXZpY2VEZXNjcmlwdG9yOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4LCBib29sIHZlcmJvc2UpIGNvbnN0Cit2b2lkIERldmljZURlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsIGJvb2wgdmVyYm9zZSkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0RldmljZSAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzRGV2aWNlICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXggKyAxKTsKICAgICBpZiAobUlkICE9IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtSWQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1JZCk7CiAgICAgfQogICAgIGlmICghbVRhZ05hbWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gdGFnIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtVGFnTmFtZS5zdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gdGFnIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtVGFnTmFtZS5zdHJpbmcoKSk7CiAgICAgfQotICAgIHN0ZDo6c3RyaW5nIGRldmljZUxpdGVyYWw7Ci0gICAgaWYgKGRldmljZVRvU3RyaW5nKG1EZXZpY2VUeXBlLCBkZXZpY2VMaXRlcmFsKSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHR5cGU6ICUtNDhzXG4iLCBzcGFjZXMsICIiLCBkZXZpY2VMaXRlcmFsLmNfc3RyKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotICAgIGlmIChtQWRkcmVzcy5zaXplKCkgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGFkZHJlc3M6ICUtMzJzXG4iLCBzcGFjZXMsICIiLCBtQWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgQXVkaW9Qb3J0OjpkdW1wKGZkLCBzcGFjZXMsIHZlcmJvc2UpOwogCi0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIHR5cGU6ICUtNDhzXG4iLCBzcGFjZXMsICIiLCA6OmFuZHJvaWQ6OnRvU3RyaW5nKG1EZXZpY2VUeXBlKS5jX3N0cigpKTsKKworICAgIGlmIChtQWRkcmVzcy5zaXplKCkgIT0gMCkgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBhZGRyZXNzOiAlLTMyc1xuIiwgc3BhY2VzLCAiIiwgbUFkZHJlc3Muc3RyaW5nKCkpOworICAgIH0KKyAgICBBdWRpb1BvcnQ6OmR1bXAoZHN0LCBzcGFjZXMsIHZlcmJvc2UpOworfQorCitzdGQ6OnN0cmluZyBEZXZpY2VEZXNjcmlwdG9yOjp0b1N0cmluZygpIGNvbnN0Cit7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3N0cmVhbTsKKyAgICBzc3RyZWFtIDw8ICJ0eXBlOjB4IiA8PCBzdGQ6OmhleCA8PCB0eXBlKCkgPDwgIixAOiIgPDwgbUFkZHJlc3M7CisgICAgcmV0dXJuIHNzdHJlYW0uc3RyKCk7Cit9CisKK3N0ZDo6c3RyaW5nIERldmljZVZlY3Rvcjo6dG9TdHJpbmcoKSBjb25zdAoreworICAgIGlmIChpc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIHsiQVVESU9fREVWSUNFX05PTkUifTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0ID0geyJ7In07CisgICAgZm9yIChjb25zdCBhdXRvICZkZXZpY2UgOiAqdGhpcykgeworICAgICAgICBpZiAoZGV2aWNlICE9ICpiZWdpbigpKSB7CisgICAgICAgICAgIHJlc3VsdCArPSAiOyI7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ICs9IGRldmljZS0+dG9TdHJpbmcoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdCArICJ9IjsKK30KKworRGV2aWNlVmVjdG9yIERldmljZVZlY3Rvcjo6ZmlsdGVyKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3QKK3sKKyAgICBEZXZpY2VWZWN0b3IgZmlsdGVyZWREZXZpY2VzOworICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGRldmljZXMuY29udGFpbnMoZGV2aWNlKSkgeworICAgICAgICAgICAgZmlsdGVyZWREZXZpY2VzLmFkZChkZXZpY2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmaWx0ZXJlZERldmljZXM7Cit9CisKK2Jvb2wgRGV2aWNlVmVjdG9yOjpjb250YWluc0F0TGVhc3RPbmUoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAoreworICAgIHJldHVybiAhZmlsdGVyKGRldmljZXMpLmlzRW1wdHkoKTsKK30KKworYm9vbCBEZXZpY2VWZWN0b3I6OmNvbnRhaW5zQWxsRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZpbHRlcihkZXZpY2VzKS5zaXplKCkgPT0gZGV2aWNlcy5zaXplKCk7CiB9CiAKIHZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6bG9nKCkgY29uc3QKIHsKLSAgICBzdGQ6OnN0cmluZyBkZXZpY2U7Ci0gICAgZGV2aWNlVG9TdHJpbmcobURldmljZVR5cGUsIGRldmljZSk7Ci0gICAgQUxPR0koIkRldmljZSBpZDolZCB0eXBlOjB4JVg6JXMsIGFkZHI6JXMiLCBtSWQsICBtRGV2aWNlVHlwZSwgZGV2aWNlLmNfc3RyKCksCisgICAgQUxPR0koIkRldmljZSBpZDolZCB0eXBlOjB4JTA4WDolcywgYWRkcjolcyIsIG1JZCwgIG1EZXZpY2VUeXBlLAorICAgICAgICAgIDo6YW5kcm9pZDo6dG9TdHJpbmcobURldmljZVR5cGUpLmNfc3RyKCksCiAgICAgICAgICAgbUFkZHJlc3Muc3RyaW5nKCkpOwogCiAgICAgQXVkaW9Qb3J0Ojpsb2coIiAgIik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCmluZGV4IDdiMjM0MWUuLjg5Zjk4OTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCkBAIC0yMiwyNSArMjIsMTQgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3ZvaWQgRWZmZWN0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSS9POiAlZFxuIiwgbUlvKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFN0cmF0ZWd5OiAlZFxuIiwgbVN0cmF0ZWd5KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFNlc3Npb246ICVkXG4iLCBtU2Vzc2lvbik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBOYW1lOiAlc1xuIiwgIG1EZXNjLm5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJXNcbiIsICBtRW5hYmxlZCA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzSUQ6ICVkXG4iLCBzcGFjZXMsICIiLCBtSWQpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNJL086ICVkXG4iLCBzcGFjZXMsICIiLCBtSW8pOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNNdXNpYyBFZmZlY3Q6ICVzXG4iLCBzcGFjZXMsICIiLCBpc011c2ljRWZmZWN0KCk/ICJ5ZXMiIDogIm5vIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1Nlc3Npb246ICVkXG4iLCBzcGFjZXMsICIiLCBtU2Vzc2lvbik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc05hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCAgbURlc2MubmFtZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyVzXG4iLCBzcGFjZXMsICIiLCAgbUVuYWJsZWQgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKIH0KIAogRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OkVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uKCkgOgpAQCAtNTMsMTAgKzQyLDE0IEBACiAKIHN0YXR1c190IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpyZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQsIGJvb2wgaXNNdXNpY0VmZmVjdCkKIHsKKyAgICBpZiAoZ2V0RWZmZWN0KGlkKSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlcyBlZmZlY3QgJXMgYWxyZWFkeSByZWdpc3RlcmVkIiwgX19GVU5DVElPTl9fLCBkZXNjLT5uYW1lKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKwogICAgIGlmIChtVG90YWxFZmZlY3RzTWVtb3J5ICsgZGVzYy0+bWVtb3J5VXNhZ2UgPiBnZXRNYXhFZmZlY3RzTWVtb3J5KCkpIHsKICAgICAgICAgQUxPR1coInJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5IGxpbWl0IGV4Y2VlZGVkIGZvciBGeCAlcywgTWVtb3J5ICVkIEtCIiwKICAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCBkZXNjLT5tZW1vcnlVc2FnZSk7CkBAIC02NiwzNCArNTksMzMgQEAKICAgICBpZiAobVRvdGFsRWZmZWN0c01lbW9yeSA+IG1Ub3RhbEVmZmVjdHNNZW1vcnlNYXhVc2VkKSB7CiAgICAgICAgIG1Ub3RhbEVmZmVjdHNNZW1vcnlNYXhVc2VkID0gbVRvdGFsRWZmZWN0c01lbW9yeTsKICAgICB9Ci0gICAgQUxPR1YoInJlZ2lzdGVyRWZmZWN0KCkgZWZmZWN0ICVzLCBpbyAlZCwgc3RyYXRlZ3kgJWQgc2Vzc2lvbiAlZCBpZCAlZCIsCi0gICAgICAgICAgICBkZXNjLT5uYW1lLCBpbywgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKKyAgICBBTE9HVigicmVnaXN0ZXJFZmZlY3QoKSBlZmZlY3QgJXMsIGlvICVkLCBzZXNzaW9uICVkIGlkICVkIiwKKyAgICAgICAgICAgIGRlc2MtPm5hbWUsIGlvLCBzZXNzaW9uLCBpZCk7CiAgICAgQUxPR1YoInJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5ICVkLCB0b3RhbCBtZW1vcnkgJWQiLCBkZXNjLT5tZW1vcnlVc2FnZSwgbVRvdGFsRWZmZWN0c01lbW9yeSk7CiAKLSAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gbmV3IEVmZmVjdERlc2NyaXB0b3IoKTsKLSAgICBtZW1jcHkgKCZlZmZlY3REZXNjLT5tRGVzYywgZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKLSAgICBlZmZlY3REZXNjLT5tSW8gPSBpbzsKLSAgICBlZmZlY3REZXNjLT5tU3RyYXRlZ3kgPSBzdGF0aWNfY2FzdDxyb3V0aW5nX3N0cmF0ZWd5PihzdHJhdGVneSk7Ci0gICAgZWZmZWN0RGVzYy0+bVNlc3Npb24gPSBzZXNzaW9uOwotICAgIGVmZmVjdERlc2MtPm1FbmFibGVkID0gZmFsc2U7Ci0KKyAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gbmV3IEVmZmVjdERlc2NyaXB0b3IoZGVzYywgaXNNdXNpY0VmZmVjdCwgaWQsIGlvLCBzZXNzaW9uKTsKICAgICBhZGQoaWQsIGVmZmVjdERlc2MpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCitzcDxFZmZlY3REZXNjcmlwdG9yPiBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6Z2V0RWZmZWN0KGludCBpZCkgY29uc3QKIHsKICAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShpZCk7CiAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIHVua25vd24gZWZmZWN0IElEICVkIiwgaWQpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlQXQoaW5kZXgpOworfQorCitzdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCit7CisgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IGdldEVmZmVjdChpZCk7CisgICAgaWYgKGVmZmVjdERlc2MgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXMgdW5rbm93biBlZmZlY3QgSUQgJWQiLCBfX0ZVTkNUSU9OX18sIGlkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSB2YWx1ZUF0KGluZGV4KTsKLQotICAgIHNldEVmZmVjdEVuYWJsZWQoZWZmZWN0RGVzYywgZmFsc2UpOwotCiAgICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgPCBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSkgewogICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIG1lbW9yeSAlZCB0b28gYmlnIGZvciB0b3RhbCAlZCIsCiAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOwpAQCAtMTE5LDYgKzExMSwxNCBAQAogICAgIHJldHVybiBzZXRFZmZlY3RFbmFibGVkKHZhbHVlQXQoaW5kZXgpLCBlbmFibGVkKTsKIH0KIAorYm9vbCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6aXNFZmZlY3RFbmFibGVkKGludCBpZCkgY29uc3QKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShpZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB2YWx1ZUF0KGluZGV4KS0+bUVuYWJsZWQ7Cit9CiAKIHN0YXR1c190IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpzZXRFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3REZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkKQpAQCAtMTUwLDExICsxNTAsMTEgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWJvb2wgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OmlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkKK2Jvb2wgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OmlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkgY29uc3QKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSB2YWx1ZUF0KGkpOwotICAgICAgICBpZiAoZWZmZWN0RGVzYy0+bUVuYWJsZWQgJiYgKGVmZmVjdERlc2MtPm1TdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgJiYKKyAgICAgICAgaWYgKGVmZmVjdERlc2MtPm1FbmFibGVkICYmIChlZmZlY3REZXNjLT5pc011c2ljRWZmZWN0KCkpICYmCiAgICAgICAgICAgICAgICAgKChlZmZlY3REZXNjLT5tRGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX09GRkxPQURfU1VQUE9SVEVEKSA9PSAwKSkgewogICAgICAgICAgICAgQUxPR1YoImlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdCAlcyBlbmFibGVkIG9uIHNlc3Npb24gJWQiLAogICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubmFtZSwgZWZmZWN0RGVzYy0+bVNlc3Npb24pOwpAQCAtMTc0LDI0ICsxNzQsMjIgQEAKICAgICByZXR1cm4gTUFYX0VGRkVDVFNfTUVNT1JZOwogfQogCi1zdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpCit2b2lkIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlKSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAotICAgICAgICAgICAgIlxuVG90YWwgRWZmZWN0cyBDUFU6ICVmIE1JUFMsIFRvdGFsIEVmZmVjdHMgbWVtb3J5OiAlZCBLQiwgTWF4IG1lbW9yeSB1c2VkOiAlZCBLQlxuIiwKLSAgICAgICAgICAgICAoZmxvYXQpbVRvdGFsRWZmZWN0c0NwdUxvYWQvMTAsIG1Ub3RhbEVmZmVjdHNNZW1vcnksIG1Ub3RhbEVmZmVjdHNNZW1vcnlNYXhVc2VkKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJSZWdpc3RlcmVkIGVmZmVjdHM6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIEVmZmVjdCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KAorICAgICAgICAgICAgIlxuJSpzVG90YWwgRWZmZWN0cyBDUFU6ICVmIE1JUFMsICIKKyAgICAgICAgICAgICJUb3RhbCBFZmZlY3RzIG1lbW9yeTogJWQgS0IsIE1heCBtZW1vcnkgdXNlZDogJWQgS0JcbiIsCisgICAgICAgICAgICBzcGFjZXMsICIiLAorICAgICAgICAgICAgKGZsb2F0KSBtVG90YWxFZmZlY3RzQ3B1TG9hZCAvIDEwLAorICAgICAgICAgICAgbVRvdGFsRWZmZWN0c01lbW9yeSwKKyAgICAgICAgICAgIG1Ub3RhbEVmZmVjdHNNZW1vcnlNYXhVc2VkKTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNFZmZlY3RzOlxuIiwgc3BhY2VzLCAiIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBFZmZlY3QgJWQ6XG4iLCBzcGFjZXMsICIiLCBrZXlBdChpKSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0LCBzcGFjZXMgKyAyKTsKKyAgICB9CiB9CiAKIH07IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0dhaW5zLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0dhaW5zLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQwN2ExNy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9HYWlucy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQVBNOjpHYWlucyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotLy8jZGVmaW5lIFZFUllfVkVSQk9TRV9MT0dHSU5HCi0jaWZkZWYgVkVSWV9WRVJCT1NFX0xPR0dJTkcKLSNkZWZpbmUgQUxPR1ZWIEFMT0dWCi0jZWxzZQotI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCi0jZW5kaWYKLQotI2luY2x1ZGUgIkdhaW5zLmgiCi0jaW5jbHVkZSA8Vm9sdW1lLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBFbmdpbmVkZWZhdWx0Ci1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC00OS41Zn0sIHszMywgLTMzLjVmfSwgezY2LCAtMTcuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTU4LjBmfSwgezIwLCAtNDAuMGZ9LCB7NjAsIC0xNy4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtNTguMGZ9LCB7MjAsIC00MC4wZn0sIHs2MCwgLTIxLjBmfSwgezEwMCwgLTEwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC01Ni4wZn0sIHsyMCwgLTM0LjBmfSwgezYwLCAtMTEuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC01NS4wZn0sIHsyMCwgLTQzLjBmfSwgezg2LCAtMTIuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtMjkuN2Z9LCB7MzMsIC0yMC4xZn0sIHs2NiwgLTEwLjJmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTM1LjdmfSwgezMzLCAtMjYuMWZ9LCB7NjYsIC0xMy4yZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi0vLyBBVURJT19TVFJFQU1fU1lTVEVNLCBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSBhbmQgQVVESU9fU1RSRUFNX0RUTUYgdm9sdW1lIHRyYWNrcwotLy8gQVVESU9fU1RSRUFNX1JJTkcgb24gcGhvbmVzIGFuZCBBVURJT19TVFJFQU1fTVVTSUMgb24gdGFibGV0cy4KLS8vIEFVRElPX1NUUkVBTV9EVE1GIHRyYWNrcyBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCB3aGlsZSBpbiBjYWxsIChTZWUgQXVkaW9TZXJ2aWNlLmphdmEpLgotLy8gVGhlIHJhbmdlIGlzIGNvbnN0cmFpbmVkIGJldHdlZW4gLTI0ZEIgYW5kIC02ZEIgb3ZlciBzcGVha2VyIGFuZCAtMzBkQiBhbmQgLTE4ZEIgb3ZlciBoZWFkc2V0LgotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC0yNC4wZn0sIHszMywgLTE4LjBmfSwgezY2LCAtMTIuMGZ9LCB7MTAwLCAtNi4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTM0LjBmfSwgezMzLCAtMjQuMGZ9LCB7NjYsIC0xNS4wZn0sIHsxMDAsIC02LjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtMzAuMGZ9LCB7MzMsIC0yNi4wZn0sIHs2NiwgLTIyLjBmfSwgezEwMCwgLTE4LjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezAsIC00Mi4wZn0sIHszMywgLTI4LjBmfSwgezY2LCAtMTQuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezAsIC0yNC4wZn0sIHszMywgLTE2LjBmfSwgezY2LCAtOC4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0xpbmVhclZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MCwgLTk2LjBmfSwgezMzLCAtNjguMGZ9LCB7NjYsIC0zNC4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c1NpbGVudFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MCwgLTk2LjBmfSwgezEsIC05Ni4wZn0sIHsyLCAtOTYuMGZ9LCB7MTAwLCAtOTYuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MCwgMC4wZn0sIHsxLCAwLjBmfSwgezIsIDAuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtMTI4LjBmfSwgezIwLCAtODAuMGZ9LCB7NjAsIC00MC4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpHYWluczo6c1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9DTlRdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtERVZJQ0VfQ0FURUdPUllfQ05UXSA9IHsKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX1NZU1RFTQotICAgICAgICBHYWluczo6c0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX1JJTkcKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9NVVNJQwotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9BTEFSTQotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTgotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08KLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUKLSAgICAgICAgR2FpbnM6OnNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgIC8vIEFVRElPX1NUUkVBTV9EVE1GCi0gICAgICAgIEdhaW5zOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9UVFMKLSAgICAgIC8vICJUcmFuc21pdHRlZCBUaHJvdWdoIFNwZWFrZXIiOiBhbHdheXMgc2lsZW50IGV4Y2VwdCBvbiBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c1NpbGVudFZvbHVtZUN1cnZlLCAgICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c1NpbGVudFZvbHVtZUN1cnZlLCAgICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNTaWxlbnRWb2x1bWVDdXJ2ZSwgICAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX1JFUk9VVElORwotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX1BBVENICi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi19OwotCi0vL3N0YXRpYwotZmxvYXQgR2FpbnM6OnZvbEluZGV4VG9EYihjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpjdXJ2ZSwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgsIGludCBpbmRleEluVWkpCi17Ci0gICAgLy8gdGhlIHZvbHVtZSBpbmRleCBpbiB0aGUgVUkgaXMgcmVsYXRpdmUgdG8gdGhlIG1pbiBhbmQgbWF4IHZvbHVtZSBpbmRpY2VzIGZvciB0aGlzIHN0cmVhbSB0eXBlCi0gICAgaW50IG5iU3RlcHMgPSAxICsgY3VydmVbVm9sdW1lOjpWT0xNQVhdLm1JbmRleCAtIGN1cnZlW1ZvbHVtZTo6Vk9MTUlOXS5tSW5kZXg7Ci0gICAgaW50IHZvbElkeCA9IChuYlN0ZXBzICogKGluZGV4SW5VaSAtIGluZGV4TWluKSkgLyAoaW5kZXhNYXggLSBpbmRleE1pbik7Ci0KLSAgICAvLyBmaW5kIHdoYXQgcGFydCBvZiB0aGUgY3VydmUgdGhpcyBpbmRleCB2b2x1bWUgYmVsb25ncyB0bywgb3IgaWYgaXQncyBvdXQgb2YgYm91bmRzCi0gICAgaW50IHNlZ21lbnQgPSAwOwotICAgIGlmICh2b2xJZHggPCBjdXJ2ZVtWb2x1bWU6OlZPTE1JTl0ubUluZGV4KSB7ICAgICAgICAgLy8gb3V0IG9mIGJvdW5kcwotICAgICAgICByZXR1cm4gVk9MVU1FX01JTl9EQjsKLSAgICB9IGVsc2UgaWYgKHZvbElkeCA8IGN1cnZlW1ZvbHVtZTo6Vk9MS05FRTFdLm1JbmRleCkgewotICAgICAgICBzZWdtZW50ID0gMDsKLSAgICB9IGVsc2UgaWYgKHZvbElkeCA8IGN1cnZlW1ZvbHVtZTo6Vk9MS05FRTJdLm1JbmRleCkgewotICAgICAgICBzZWdtZW50ID0gMTsKLSAgICB9IGVsc2UgaWYgKHZvbElkeCA8PSBjdXJ2ZVtWb2x1bWU6OlZPTE1BWF0ubUluZGV4KSB7Ci0gICAgICAgIHNlZ21lbnQgPSAyOwotICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0IG9mIGJvdW5kcwotICAgICAgICByZXR1cm4gMC4wZjsKLSAgICB9Ci0KLSAgICAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBpbiB0aGUgYXR0ZW51YXRpb24gdGFibGUgaW4gZEIKLSAgICBmbG9hdCBkZWNpYmVscyA9IGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uICsKLSAgICAgICAgICAgICgoZmxvYXQpKHZvbElkeCAtIGN1cnZlW3NlZ21lbnRdLm1JbmRleCkpICoKLSAgICAgICAgICAgICAgICAoIChjdXJ2ZVtzZWdtZW50KzFdLm1EQkF0dGVudWF0aW9uIC0KLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uKSAvCi0gICAgICAgICAgICAgICAgICAgICgoZmxvYXQpKGN1cnZlW3NlZ21lbnQrMV0ubUluZGV4IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgpKSApOwotCi0gICAgQUxPR1ZWKCJWT0xVTUUgdm9sIGluZGV4PVslZCAlZCAlZF0sIGRCPVslLjFmICUuMWYgJS4xZl0iLAotICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubUluZGV4LCB2b2xJZHgsCi0gICAgICAgICAgICBjdXJ2ZVtzZWdtZW50KzFdLm1JbmRleCwKLSAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uLAotICAgICAgICAgICAgZGVjaWJlbHMsCi0gICAgICAgICAgICBjdXJ2ZVtzZWdtZW50KzFdLm1EQkF0dGVudWF0aW9uKTsKLQotICAgIHJldHVybiBkZWNpYmVsczsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwCmluZGV4IGFlZjdkYmUuLmVjN2ZmNTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAKQEAgLTUxLDcgKzUxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSkpOwogCiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKGRldmljZSk7Ci0gICAgZGV2RGVzYy0+bUFkZHJlc3MgPSBhZGRyZXNzOworICAgIGRldkRlc2MtPnNldEFkZHJlc3MoYWRkcmVzcyk7CisgICAgYWRkRHluYW1pY0RldmljZShkZXZEZXNjKTsKKyAgICAvLyBSZWNpcHJvY2FsbHkgYXR0YWNoIHRoZSBkZXZpY2UgdG8gdGhlIG1vZHVsZQorICAgIGRldkRlc2MtPmF0dGFjaCh0aGlzKTsKICAgICBwcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UoZGV2RGVzYyk7CiAKICAgICByZXR1cm4gYWRkT3V0cHV0UHJvZmlsZShwcm9maWxlKTsKQEAgLTk3LDYgKzEwMCw5IEBACiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgaWYgKG1PdXRwdXRQcm9maWxlc1tpXS0+Z2V0TmFtZSgpID09IG5hbWUpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogbU91dHB1dFByb2ZpbGVzW2ldLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVEeW5hbWljRGV2aWNlKGRldmljZSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtT3V0cHV0UHJvZmlsZXMucmVtb3ZlQXQoaSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTEzLDcgKzExOSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUpKTsKIAogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihkZXZpY2UpOwotICAgIGRldkRlc2MtPm1BZGRyZXNzID0gYWRkcmVzczsKKyAgICBkZXZEZXNjLT5zZXRBZGRyZXNzKGFkZHJlc3MpOworICAgIGFkZER5bmFtaWNEZXZpY2UoZGV2RGVzYyk7CisgICAgLy8gUmVjaXByb2NhbGx5IGF0dGFjaCB0aGUgZGV2aWNlIHRvIHRoZSBtb2R1bGUKKyAgICBkZXZEZXNjLT5hdHRhY2godGhpcyk7CiAgICAgcHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKGRldkRlc2MpOwogCiAgICAgQUxPR1YoImFkZElucHV0UHJvZmlsZSgpIG5hbWUgJXMgcmF0ZSAlZCBtYXNrIDB4JTA4eCIsCkBAIC0xMjYsNiArMTM1LDkgQEAKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGlmIChtSW5wdXRQcm9maWxlc1tpXS0+Z2V0TmFtZSgpID09IG5hbWUpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogbUlucHV0UHJvZmlsZXNbaV0tPmdldFN1cHBvcnRlZERldmljZXMoKSkgeworICAgICAgICAgICAgICAgIHJlbW92ZUR5bmFtaWNEZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1JbnB1dFByb2ZpbGVzLnJlbW92ZUF0KGkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTIxOCwzNyArMjMwLDM3IEBACiAgICAgbUhhbmRsZSA9IGhhbmRsZTsKIH0KIAotdm9pZCBId01vZHVsZTo6ZHVtcChpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Citib29sIEh3TW9kdWxlOjpzdXBwb3J0c1BhdGNoKGNvbnN0IHNwPEF1ZGlvUG9ydD4gJnNyY1BvcnQsIGNvbnN0IHNwPEF1ZGlvUG9ydD4gJmRzdFBvcnQpIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnJvdXRlIDogbVJvdXRlcykgeworICAgICAgICBpZiAocm91dGUtPnN1cHBvcnRzUGF0Y2goc3JjUG9ydCwgZHN0UG9ydCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSBuYW1lOiAlc1xuIiwgZ2V0TmFtZSgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIGhhbmRsZTogJWRcbiIsIG1IYW5kbGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIC0gdmVyc2lvbjogJXUuJXVcbiIsIGdldEhhbFZlcnNpb25NYWpvcigpLCBnZXRIYWxWZXJzaW9uTWlub3IoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwordm9pZCBId01vZHVsZTo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgLSBuYW1lOiAlc1xuIiwgZ2V0TmFtZSgpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAtIGhhbmRsZTogJWRcbiIsIG1IYW5kbGUpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgIC0gdmVyc2lvbjogJXUuJXVcbiIsIGdldEhhbFZlcnNpb25NYWpvcigpLCBnZXRIYWxWZXJzaW9uTWlub3IoKSk7CiAgICAgaWYgKG1PdXRwdXRQcm9maWxlcy5zaXplKCkpIHsKLSAgICAgICAgd3JpdGUoZmQsICIgIC0gb3V0cHV0czpcbiIsIHN0cmxlbigiICAtIG91dHB1dHM6XG4iKSk7CisgICAgICAgIGRzdC0+YXBwZW5kKCIgIC0gb3V0cHV0czpcbiIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIG91dHB1dCAlenU6XG4iLCBpKTsKLSAgICAgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgICAgIG1PdXRwdXRQcm9maWxlc1tpXS0+ZHVtcChmZCk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAgIG91dHB1dCAlenU6XG4iLCBpKTsKKyAgICAgICAgICAgIG1PdXRwdXRQcm9maWxlc1tpXS0+ZHVtcChkc3QpOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtSW5wdXRQcm9maWxlcy5zaXplKCkpIHsKLSAgICAgICAgd3JpdGUoZmQsICIgIC0gaW5wdXRzOlxuIiwgc3RybGVuKCIgIC0gaW5wdXRzOlxuIikpOworICAgICAgICBkc3QtPmFwcGVuZCgiICAtIGlucHV0czpcbiIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgaW5wdXQgJXp1OlxuIiwgaSk7Ci0gICAgICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgICAgICBtSW5wdXRQcm9maWxlc1tpXS0+ZHVtcChmZCk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAgIGlucHV0ICV6dTpcbiIsIGkpOworICAgICAgICAgICAgbUlucHV0UHJvZmlsZXNbaV0tPmR1bXAoZHN0KTsKICAgICAgICAgfQogICAgIH0KLSAgICBtRGVjbGFyZWREZXZpY2VzLmR1bXAoZmQsIFN0cmluZzgoIkRlY2xhcmVkIiksICAyLCB0cnVlKTsKLSAgICBtUm91dGVzLmR1bXAoZmQsIDIpOworICAgIG1EZWNsYXJlZERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIkRlY2xhcmVkIiksIDIsIHRydWUpOworICAgIG1EeW5hbWljRGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiRHluYW1pYyIpLCAgMiwgdHJ1ZSk7CisgICAgbVJvdXRlcy5kdW1wKGRzdCwgMik7CiB9CiAKIHNwIDxId01vZHVsZT4gSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXRNb2R1bGVGcm9tTmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdApAQCAtMjYxLDY0ICsyNzMsMTYwIEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXNwIDxId01vZHVsZT4gSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXRNb2R1bGVGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKK3NwIDxId01vZHVsZT4gSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXRNb2R1bGVGb3JEZXZpY2VUeXBlcyhhdWRpb19kZXZpY2VzX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSBjb25zdAogewogICAgIGZvciAoY29uc3QgYXV0byYgbW9kdWxlIDogKnRoaXMpIHsKLSAgICAgICAgY29uc3QgYXV0byYgcHJvZmlsZXMgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkgPworICAgICAgICBjb25zdCBhdXRvJiBwcm9maWxlcyA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2UodHlwZSkgPwogICAgICAgICAgICAgICAgIG1vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKSA6IG1vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpOwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHByb2ZpbGUgOiBwcm9maWxlcykgewotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnREZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGU7CisgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydHNEZXZpY2VUeXBlcyh0eXBlKSkgeworICAgICAgICAgICAgICAgIGlmIChlbmNvZGVkRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBkZWNsYXJlZERldmljZXMgPSBtb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpOworICAgICAgICAgICAgICAgICAgICBzcCA8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWREZXZpY2VzLmdldERldmljZSh0eXBlLCBTdHJpbmc4KCksIGVuY29kZWRGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlRGVzYykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBudWxscHRyOwogfQogCi1zcDxEZXZpY2VEZXNjcmlwdG9yPiBId01vZHVsZUNvbGxlY3Rpb246OmdldERldmljZURlc2NyaXB0b3IoY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1hdGNoQWRyZXNzKSBjb25zdAorc3A8SHdNb2R1bGU+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0TW9kdWxlRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpIGNvbnN0CiB7Ci0gICAgU3RyaW5nOCBhZGRyZXNzID0gKGRldmljZV9hZGRyZXNzID09IG51bGxwdHIpID8gU3RyaW5nOCgiIikgOiBTdHJpbmc4KGRldmljZV9hZGRyZXNzKTsKKyAgICByZXR1cm4gZ2V0TW9kdWxlRm9yRGV2aWNlVHlwZXMoZGV2aWNlLT50eXBlKCksIGVuY29kZWRGb3JtYXQpOworfQorCitEZXZpY2VWZWN0b3IgSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXRBdmFpbGFibGVEZXZpY2VzRnJvbU1vZHVsZU5hbWUoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IERldmljZVZlY3RvciAmYXZhaWxhYmxlRGV2aWNlcykgY29uc3QKK3sKKyAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gZ2V0TW9kdWxlRnJvbU5hbWUobmFtZSk7CisgICAgaWYgKG1vZHVsZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IoKTsKKyAgICB9CisgICAgcmV0dXJuIGF2YWlsYWJsZURldmljZXMuZ2V0RGV2aWNlc0Zyb21Id01vZHVsZShtb2R1bGUtPmdldEhhbmRsZSgpKTsKK30KKworc3A8RGV2aWNlRGVzY3JpcHRvcj4gSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXREZXZpY2VEZXNjcmlwdG9yKGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb3dUb0NyZWF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1hdGNoQWRkcmVzcykgY29uc3QKK3sKKyAgICBTdHJpbmc4IGRldkFkZHJlc3MgPSAoYWRkcmVzcyA9PSBudWxscHRyIHx8ICFtYXRjaEFkZHJlc3MpID8gU3RyaW5nOCgiIikgOiBTdHJpbmc4KGFkZHJlc3MpOwogICAgIC8vIGhhbmRsZSBsZWdhY3kgcmVtb3RlIHN1Ym1peCBjYXNlIHdoZXJlIHRoZSBhZGRyZXNzIHdhcyBub3QgYWx3YXlzIHNwZWNpZmllZAotICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgJiYgKGFkZHJlc3MubGVuZ3RoKCkgPT0gMCkpIHsKLSAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKKyAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2VUeXBlKSAmJiAoZGV2QWRkcmVzcy5sZW5ndGgoKSA9PSAwKSkgeworICAgICAgICBkZXZBZGRyZXNzID0gU3RyaW5nOCgiMCIpOwogICAgIH0KIAogICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiAqdGhpcykgewotICAgICAgICBEZXZpY2VWZWN0b3IgZGVjbGFyZWREZXZpY2VzID0gaHdNb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpOwotICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IGRlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVBZGRyKGRldmljZSwgYWRkcmVzcyk7Ci0gICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKKyAgICAgICAgRGV2aWNlVmVjdG9yIG1vZHVsZURldmljZXMgPSBod01vZHVsZS0+Z2V0QWxsRGV2aWNlcygpOworICAgICAgICBhdXRvIG1vZHVsZURldmljZSA9IG1vZHVsZURldmljZXMuZ2V0RGV2aWNlKGRldmljZVR5cGUsIGRldkFkZHJlc3MsIGVuY29kZWRGb3JtYXQpOworICAgICAgICBpZiAobW9kdWxlRGV2aWNlKSB7CisgICAgICAgICAgICBpZiAoZW5jb2RlZEZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICAgICAgICAgIG1vZHVsZURldmljZS0+c2V0RW5jb2RlZEZvcm1hdChlbmNvZGVkRm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1vZHVsZURldmljZS0+c2V0QWRkcmVzcyhkZXZBZGRyZXNzKTsKKyAgICAgICAgICAgIGlmIChhbGxvd1RvQ3JlYXRlKSB7CisgICAgICAgICAgICAgICAgbW9kdWxlRGV2aWNlLT5hdHRhY2goaHdNb2R1bGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1vZHVsZURldmljZTsKICAgICAgICAgfQotICAgICAgICBpZiAoIW1hdGNoQWRyZXNzKSB7Ci0gICAgICAgICAgICBkZXZpY2VMaXN0ID0gZGVjbGFyZWREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKKyAgICB9CisgICAgaWYgKCFhbGxvd1RvQ3JlYXRlKSB7CisgICAgICAgIEFMT0dWKCIlczogY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJXMgJTA0eCBhZGRyZXNzICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICBuYW1lLCBkZXZpY2VUeXBlLCBhZGRyZXNzKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBjcmVhdGVEZXZpY2UoZGV2aWNlVHlwZSwgYWRkcmVzcywgbmFtZSwgZW5jb2RlZEZvcm1hdCk7Cit9CisKK3NwPERldmljZURlc2NyaXB0b3I+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Y3JlYXRlRGV2aWNlKGNvbnN0IGF1ZGlvX2RldmljZXNfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSBjb25zdAoreworICAgIHNwPEh3TW9kdWxlPiBod01vZHVsZSA9IGdldE1vZHVsZUZvckRldmljZVR5cGVzKHR5cGUsIGVuY29kZWRGb3JtYXQpOworICAgIGlmIChod01vZHVsZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJTA0eCBhZGRyZXNzICVzIiwgX19GVU5DVElPTl9fLCB0eXBlLAorICAgICAgICAgICAgICBhZGRyZXNzKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKHR5cGUsIFN0cmluZzgobmFtZSkpOworICAgIGRldmljZS0+c2V0TmFtZShTdHJpbmc4KG5hbWUpKTsKKyAgICBkZXZpY2UtPnNldEFkZHJlc3MoU3RyaW5nOChhZGRyZXNzKSk7CisgICAgZGV2aWNlLT5zZXRFbmNvZGVkRm9ybWF0KGVuY29kZWRGb3JtYXQpOworCisgIC8vIEFkZCB0aGUgZGV2aWNlIHRvIHRoZSBsaXN0IG9mIGR5bmFtaWMgZGV2aWNlcworICAgIGh3TW9kdWxlLT5hZGREeW5hbWljRGV2aWNlKGRldmljZSk7CisgICAgLy8gUmVjaXByb2NhbGx5IGF0dGFjaCB0aGUgZGV2aWNlIHRvIHRoZSBtb2R1bGUKKyAgICBkZXZpY2UtPmF0dGFjaChod01vZHVsZSk7CisgICAgQUxPR0QoIiVzOiBhZGRpbmcgZHluYW1pYyBkZXZpY2UgJXMgdG8gbW9kdWxlICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKKworICAgIGNvbnN0IGF1dG8gJnByb2ZpbGVzID0gKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UodHlwZSkgPyBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKSk7CisgICAgZm9yIChjb25zdCBhdXRvICZwcm9maWxlIDogcHJvZmlsZXMpIHsKKyAgICAgICAgLy8gQWRkIHRoZSBkZXZpY2UgYXMgc3VwcG9ydGVkIHRvIGFsbCBwcm9maWxlIHN1cHBvcnRpbmcgIndlYWtseSIgb3Igbm90IHRoZSBkZXZpY2UKKyAgICAgICAgLy8gYWNjb3JkaW5nIHRvIGl0cyB0eXBlCisgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0c0RldmljZShkZXZpY2UsIGZhbHNlIC8qbWF0Y2hBZHJlc3MqLykpIHsKKworICAgICAgICAgICAgLy8gQHRvZG8gcXVpZCBvZiBhdWRpbyBwcm9maWxlPyBpbXBvcnQgdGhlIHByb2ZpbGUgZnJvbSBkZXZpY2Ugb2YgdGhlIHNhbWUgdHlwZT8KKyAgICAgICAgICAgIGNvbnN0IGF1dG8gJmlzb1R5cGVEZXZpY2VGb3JQcm9maWxlID0KKyAgICAgICAgICAgICAgICBwcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkuZ2V0RGV2aWNlKHR5cGUsIFN0cmluZzgoKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgZGV2aWNlLT5pbXBvcnRBdWRpb1BvcnQoaXNvVHlwZURldmljZUZvclByb2ZpbGUsIHRydWUgLyogZm9yY2UgKi8pOworCisgICAgICAgICAgICBBTE9HVigiJXM6IGFkZGluZyBkZXZpY2UgJXMgdG8gcHJvZmlsZSAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBwcm9maWxlLT5nZXRUYWdOYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICBwcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlOworfQorCit2b2lkIEh3TW9kdWxlQ29sbGVjdGlvbjo6Y2xlYW5VcEZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKQoreworICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiAqdGhpcykgeworICAgICAgICBEZXZpY2VWZWN0b3IgbW9kdWxlRGV2aWNlcyA9IGh3TW9kdWxlLT5nZXRBbGxEZXZpY2VzKCk7CisgICAgICAgIGlmICghbW9kdWxlRGV2aWNlcy5jb250YWlucyhkZXZpY2UpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBkZXZpY2UtPmRldGFjaCgpOworICAgICAgICAvLyBPbmx5IHJlbW92ZSBmcm9tIGR5bmFtaWMgbGlzdCwgbm90IGZyb20gZGVjbGFyZWQgbGlzdCEhIQorICAgICAgICBpZiAoIWh3TW9kdWxlLT5nZXREeW5hbWljRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBod01vZHVsZS0+cmVtb3ZlRHluYW1pY0RldmljZShkZXZpY2UpOworICAgICAgICBBTE9HVigiJXM6IHJlbW92ZWQgZHluYW1pYyBkZXZpY2UgJXMgZnJvbSBtb2R1bGUgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKKworICAgICAgICBjb25zdCBJT1Byb2ZpbGVDb2xsZWN0aW9uICZwcm9maWxlcyA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlLT50eXBlKCkpID8KKyAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkgOiBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnByb2ZpbGUgOiBwcm9maWxlcykgeworICAgICAgICAgICAgLy8gRm9yIGNsZWFudXAsIHN0cm9uZyBtYXRjaCBpcyByZXF1aXJlZAorICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnRzRGV2aWNlKGRldmljZSwgdHJ1ZSAvKm1hdGNoQWRyZXNzKi8pKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiByZW1vdmluZyBkZXZpY2UgJXMgZnJvbSBwcm9maWxlICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBwcm9maWxlLT5nZXRUYWdOYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcHJvZmlsZS0+cmVtb3ZlU3VwcG9ydGVkRGV2aWNlKGRldmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlKTsKLSAgICBkZXZEZXNjLT5zZXROYW1lKFN0cmluZzgoZGV2aWNlX25hbWUpKTsKLSAgICBkZXZEZXNjLT5tQWRkcmVzcyA9IGFkZHJlc3M7Ci0gICAgcmV0dXJuIGRldkRlc2M7CiB9CiAKLXN0YXR1c190IEh3TW9kdWxlQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Cit2b2lkIEh3TW9kdWxlQ29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkhXIE1vZHVsZXMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBkc3QtPmFwcGVuZCgiXG5IVyBNb2R1bGVzIGR1bXA6XG4iKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gSFcgTW9kdWxlICV6dTpcbiIsIGkgKyAxKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICBpdGVtQXQoaSktPmR1bXAoZmQpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLSBIVyBNb2R1bGUgJXp1OlxuIiwgaSArIDEpOworICAgICAgICBpdGVtQXQoaSktPmR1bXAoZHN0KTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwCmluZGV4IDM5MGVhMzYuLmZlMmVhZWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcApAQCAtMjUsMTEgKzI1LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vLyBjaGVja3MgaWYgdGhlIElPIHByb2ZpbGUgaXMgY29tcGF0aWJsZSB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgotLy8gU2FtcGxpbmcgcmF0ZSwgZm9ybWF0IGFuZCBjaGFubmVsIG1hc2sgbXVzdCBiZSBzcGVjaWZpZWQgaW4gb3JkZXIgdG8KLS8vIGdldCBhIHZhbGlkIGEgbWF0Y2gKLWJvb2wgSU9Qcm9maWxlOjppc0NvbXBhdGlibGVQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorYm9vbCBJT1Byb2ZpbGU6OmlzQ29tcGF0aWJsZVByb2ZpbGUoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnVwZGF0ZWRTYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCkBAIC00NiwxNCArNDIsOCBAQAogICAgICAgICAgICAgZ2V0VHlwZSgpID09IEFVRElPX1BPUlRfVFlQRV9NSVggJiYgZ2V0Um9sZSgpID09IEFVRElPX1BPUlRfUk9MRV9TSU5LOwogICAgIEFMT0dfQVNTRVJUKGlzUGxheWJhY2tUaHJlYWQgIT0gaXNSZWNvcmRUaHJlYWQpOwogCi0KLSAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgIC8vIGp1c3QgY2hlY2sgdHlwZXMgaWYgbXVsdGlwbGUgZGV2aWNlcyBhcmUgc2VsZWN0ZWQKLSAgICAgICAgaWYgKHBvcGNvdW50KGRldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSA+IDEpIHsKLSAgICAgICAgICAgIGlmICgobVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIGRldmljZSkgIT0gZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1TdXBwb3J0ZWREZXZpY2VzLmdldERldmljZShkZXZpY2UsIGFkZHJlc3MpID09IDApIHsKKyAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIGlmICghbVN1cHBvcnRlZERldmljZXMuY29udGFpbnNBbGxEZXZpY2VzKGRldmljZXMpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMTMsMTYgKzEwMywxMSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIElPUHJvZmlsZTo6ZHVtcChpbnQgZmQpCit2b2lkIElPUHJvZmlsZTo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7CisgICAgQXVkaW9Qb3J0OjpkdW1wKGRzdCwgNCk7CiAKLSAgICBBdWRpb1BvcnQ6OmR1bXAoZmQsIDQpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIC0gZmxhZ3M6IDB4JTA0eCIsIGdldEZsYWdzKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAgIC0gZmxhZ3M6IDB4JTA0eCIsIGdldEZsYWdzKCkpOwogICAgIHN0ZDo6c3RyaW5nIGZsYWdzTGl0ZXJhbDsKICAgICBpZiAoZ2V0Um9sZSgpID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7CiAgICAgICAgIElucHV0RmxhZ0NvbnZlcnRlcjo6bWFza1RvU3RyaW5nKGdldEZsYWdzKCksIGZsYWdzTGl0ZXJhbCk7CkBAIC0xMzAsMjEgKzExNSwxNCBAQAogICAgICAgICBPdXRwdXRGbGFnQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZ2V0RmxhZ3MoKSwgZmxhZ3NMaXRlcmFsKTsKICAgICB9CiAgICAgaWYgKCFmbGFnc0xpdGVyYWwuZW1wdHkoKSkgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgKCVzKSIsIGZsYWdzTGl0ZXJhbC5jX3N0cigpKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAoJXMpIiwgZmxhZ3NMaXRlcmFsLmNfc3RyKCkpOwogICAgIH0KLSAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIG1TdXBwb3J0ZWREZXZpY2VzLmR1bXAoZmQsIFN0cmluZzgoIlN1cHBvcnRlZCIpLCA0LCBmYWxzZSk7Ci0KLSAgICByZXN1bHQuY2xlYXIoKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbiAgICAtIG1heE9wZW5Db3VudDogJXUgLSBjdXJPcGVuQ291bnQ6ICV1XG4iLAorICAgIGRzdC0+YXBwZW5kKCJcbiIpOworICAgIG1TdXBwb3J0ZWREZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCJTdXBwb3J0ZWQiKSwgNCwgZmFsc2UpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiAgICAtIG1heE9wZW5Db3VudDogJXUgLSBjdXJPcGVuQ291bnQ6ICV1XG4iLAogICAgICAgICAgICAgIG1heE9wZW5Db3VudCwgY3VyT3BlbkNvdW50KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIC0gbWF4QWN0aXZlQ291bnQ6ICV1IC0gY3VyQWN0aXZlQ291bnQ6ICV1XG4iLAorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgICAgLSBtYXhBY3RpdmVDb3VudDogJXUgLSBjdXJBY3RpdmVDb3VudDogJXVcbiIsCiAgICAgICAgICAgICAgbWF4QWN0aXZlQ291bnQsIGN1ckFjdGl2ZUNvdW50KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIH0KIAogdm9pZCBJT1Byb2ZpbGU6OmxvZygpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXJpYWxpemVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwCmluZGV4IGEyNTMxMTMuLjVmODIwYzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwCkBAIC0xNywyNDEgKzE3LDQzMiBAQAogI2RlZmluZSBMT0dfVEFHICJBUE06OlNlcmlhbGl6ZXIiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKLSNpbmNsdWRlICJTZXJpYWxpemVyLmgiCi0jaW5jbHVkZSA8bWVkaWEvY29udmVydC5oPgotI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgogI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KICNpbmNsdWRlIDxsaWJ4bWwveGluY2x1ZGUuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxpc3RyZWFtPgotCi11c2luZyBzdGQ6OnN0cmluZzsKKyNpbmNsdWRlIDxtZWRpYS9jb252ZXJ0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlICJTZXJpYWxpemVyLmgiCisjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cmluZyBnZXRYbWxBdHRyaWJ1dGUoY29uc3QgeG1sTm9kZSAqY3VyLCBjb25zdCBjaGFyICphdHRyaWJ1dGUpCituYW1lc3BhY2UgeworCisvLyBUT0RPKG1uYWdhbm92KTogQ29uc2lkZXIgZmluZGluZyBhbiBhbHRlcm5hdGl2ZSBmb3IgdXNpbmcgSElETCBjb2RlLgordXNpbmcgaGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIGhhcmR3YXJlOjpTdGF0dXM7Cit1c2luZyB1dGlsaXRpZXM6OmNvbnZlcnRUbzsKKwordGVtcGxhdGU8dHlwZW5hbWUgRSwgdHlwZW5hbWUgQz4KK3N0cnVjdCBBbmRyb2lkQ29sbGVjdGlvblRyYWl0cyB7CisgICAgdHlwZWRlZiBzcDxFPiBFbGVtZW50OworICAgIHR5cGVkZWYgQyBDb2xsZWN0aW9uOworICAgIHR5cGVkZWYgdm9pZCogUHRyU2VyaWFsaXppbmdDdHg7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgYWRkRWxlbWVudFRvQ29sbGVjdGlvbihjb25zdCBFbGVtZW50ICZlbGVtZW50LCBDb2xsZWN0aW9uICpjb2xsZWN0aW9uKSB7CisgICAgICAgIHJldHVybiBjb2xsZWN0aW9uLT5hZGQoZWxlbWVudCkgPj0gMCA/IE5PX0VSUk9SIDogQkFEX1ZBTFVFOworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEM+CitzdHJ1Y3QgU3RkQ29sbGVjdGlvblRyYWl0cyB7CisgICAgdHlwZWRlZiBDIENvbGxlY3Rpb247CisgICAgdHlwZWRlZiB0eXBlbmFtZSBDOjp2YWx1ZV90eXBlIEVsZW1lbnQ7CisgICAgdHlwZWRlZiB2b2lkKiBQdHJTZXJpYWxpemluZ0N0eDsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRFbGVtZW50VG9Db2xsZWN0aW9uKGNvbnN0IEVsZW1lbnQgJmVsZW1lbnQsIENvbGxlY3Rpb24gKmNvbGxlY3Rpb24pIHsKKyAgICAgICAgYXV0byBwYWlyID0gY29sbGVjdGlvbi0+aW5zZXJ0KGVsZW1lbnQpOworICAgICAgICByZXR1cm4gcGFpci5zZWNvbmQgPyBOT19FUlJPUiA6IEJBRF9WQUxVRTsKKyAgICB9Cit9OworCitzdHJ1Y3QgQXVkaW9HYWluVHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPEF1ZGlvR2FpbiwgQXVkaW9HYWlucz4KIHsKLSAgICB4bWxDaGFyICp4bWxWYWx1ZSA9IHhtbEdldFByb3AoY3VyLCAoY29uc3QgeG1sQ2hhciopYXR0cmlidXRlKTsKLSAgICBpZiAoeG1sVmFsdWUgPT0gTlVMTCkgeworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gImdhaW4iOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJnYWlucyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgLyoqIGdhaW4gbW9kZXMgc3VwcG9ydGVkLCBlLmcuIEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUy4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptb2RlID0gIm1vZGUiOworICAgICAgICAvKiogY29udHJvbGxlZCBjaGFubmVscywgbmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNoYW5uZWxNYXNrID0gImNoYW5uZWxfbWFzayI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWluVmFsdWVNQiA9ICJtaW5WYWx1ZU1CIjsgLyoqPCBtaW4gdmFsdWUgaW4gbWlsbGliZWwuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWF4VmFsdWVNQiA9ICJtYXhWYWx1ZU1CIjsgLyoqPCBtYXggdmFsdWUgaW4gbWlsbGliZWwuICovCisgICAgICAgIC8qKiBkZWZhdWx0IHZhbHVlIGluIG1pbGxpYmVsLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmRlZmF1bHRWYWx1ZU1CID0gImRlZmF1bHRWYWx1ZU1CIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzdGVwVmFsdWVNQiA9ICJzdGVwVmFsdWVNQiI7IC8qKjwgc3RlcCB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KKyAgICAgICAgLyoqIG5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9SQU1QLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm1pblJhbXBNcyA9ICJtaW5SYW1wTXMiOworICAgICAgICAvKiogbmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX1JBTVAuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWF4UmFtcE1zID0gIm1heFJhbXBNcyI7CisgICAgICAgIC8qKiBuZWVkZWQgdG8gYWxsb3cgdXNlIHNldFBvcnRHYWluIGluc3RlYWQgb2Ygc2V0U3RyZWFtVm9sdW1lLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnVzZUZvclZvbHVtZSA9ICJ1c2VGb3JWb2x1bWUiOworCisgICAgfTsKKworICAgIHN0YXRpYyBSZXR1cm48RWxlbWVudD4gZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOworICAgIC8vIE5vIGNoaWxkcmVuCit9OworCisvLyBBIHByb2ZpbGUgc2VjdGlvbiBjb250YWlucyBhIG5hbWUsICBvbmUgYXVkaW8gZm9ybWF0IGFuZCB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMKKy8vIGFuZCBjaGFubmVsIG1hc2tzIGZvciB0aGlzIGZvcm1hdAorc3RydWN0IEF1ZGlvUHJvZmlsZVRyYWl0cyA6IHB1YmxpYyBBbmRyb2lkQ29sbGVjdGlvblRyYWl0czxBdWRpb1Byb2ZpbGUsIEF1ZGlvUHJvZmlsZVZlY3Rvcj4KK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJwcm9maWxlIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAicHJvZmlsZXMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqc2FtcGxpbmdSYXRlcyA9ICJzYW1wbGluZ1JhdGVzIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpmb3JtYXQgPSAiZm9ybWF0IjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjaGFubmVsTWFza3MgPSAiY2hhbm5lbE1hc2tzIjsKKyAgICB9OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Cit9OworCitzdHJ1Y3QgTWl4UG9ydFRyYWl0cyA6IHB1YmxpYyBBbmRyb2lkQ29sbGVjdGlvblRyYWl0czxJT1Byb2ZpbGUsIElPUHJvZmlsZUNvbGxlY3Rpb24+Cit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAibWl4UG9ydCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gIm1peFBvcnRzIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm5hbWUgPSAibmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcm9sZSA9ICJyb2xlIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyb2xlU291cmNlID0gInNvdXJjZSI7IC8qKjwgPGF0dHJpYnV0ZSByb2xlIHNvdXJjZSB2YWx1ZT4uICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqZmxhZ3MgPSAiZmxhZ3MiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm1heE9wZW5Db3VudCA9ICJtYXhPcGVuQ291bnQiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm1heEFjdGl2ZUNvdW50ID0gIm1heEFjdGl2ZUNvdW50IjsKKyAgICB9OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CisgICAgLy8gQ2hpbGRyZW46IEdhaW5UcmFpdHMKK307CisKK3N0cnVjdCBEZXZpY2VQb3J0VHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPERldmljZURlc2NyaXB0b3IsIERldmljZVZlY3Rvcj4KK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJkZXZpY2VQb3J0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAiZGV2aWNlUG9ydHMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIC8qKiAgPGRldmljZSB0YWcgbmFtZT46IGFueSBzdHJpbmcgd2l0aG91dCBzcGFjZS4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWdOYW1lID0gInRhZ05hbWUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnR5cGUgPSAidHlwZSI7IC8qKjwgPGRldmljZSB0eXBlPi4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyb2xlID0gInJvbGUiOyAvKio8IDxkZXZpY2Ugcm9sZTogc2luayBvciBzb3VyY2U+LiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnJvbGVTb3VyY2UgPSAic291cmNlIjsgLyoqPCA8YXR0cmlidXRlIHJvbGUgc291cmNlIHZhbHVlPi4gKi8KKyAgICAgICAgLyoqIG9wdGlvbmFsOiBkZXZpY2UgYWRkcmVzcywgY2hhciBzdHJpbmcgbGVzcyB0aGFuIDY0LiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSAiYWRkcmVzcyI7CisgICAgICAgIC8qKiBvcHRpb25hbDogdGhlIGxpc3Qgb2YgZW5jb2RlZCBhdWRpbyBmb3JtYXRzIHRoYXQgYXJlIGtub3duIHRvIGJlIHN1cHBvcnRlZC4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICplbmNvZGVkRm9ybWF0cyA9ICJlbmNvZGVkRm9ybWF0cyI7CisgICAgfTsKKworICAgIHN0YXRpYyBSZXR1cm48RWxlbWVudD4gZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOworICAgIC8vIENoaWxkcmVuOiBHYWluVHJhaXRzIChvcHRpb25hbCkKK307CisKK3N0cnVjdCBSb3V0ZVRyYWl0cyA6IHB1YmxpYyBBbmRyb2lkQ29sbGVjdGlvblRyYWl0czxBdWRpb1JvdXRlLCBBdWRpb1JvdXRlVmVjdG9yPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gInJvdXRlIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAicm91dGVzIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnR5cGUgPSAidHlwZSI7IC8qKjwgPHJvdXRlIHR5cGU+OiBtaXggb3IgbXV4LiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnR5cGVNaXggPSAibWl4IjsgLyoqPCB0eXBlIGF0dHJpYnV0ZSBtaXggdmFsdWUuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqc2luayA9ICJzaW5rIjsgLyoqPCA8c2luazogaW52b2x2ZWQgaW4gdGhpcyByb3V0ZT4uICovCisgICAgICAgIC8qKiBzb3VyY2VzOiBhbGwgc291cmNlIHRoYXQgY2FuIGJlIGludm9sdmVkIGluIHRoaXMgcm91dGUuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqc291cmNlcyA9ICJzb3VyY2VzIjsKKyAgICB9OworCisgICAgdHlwZWRlZiBId01vZHVsZSAqUHRyU2VyaWFsaXppbmdDdHg7CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKK307CisKK3N0cnVjdCBNb2R1bGVUcmFpdHMgOiBwdWJsaWMgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHM8SHdNb2R1bGUsIEh3TW9kdWxlQ29sbGVjdGlvbj4KK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJtb2R1bGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJtb2R1bGVzIjsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY2hpbGRBdHRhY2hlZERldmljZXNUYWcgPSAiYXR0YWNoZWREZXZpY2VzIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNoaWxkQXR0YWNoZWREZXZpY2VUYWcgPSAiaXRlbSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjaGlsZERlZmF1bHRPdXRwdXREZXZpY2VUYWcgPSAiZGVmYXVsdE91dHB1dERldmljZSI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpuYW1lID0gIm5hbWUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnZlcnNpb24gPSAiaGFsVmVyc2lvbiI7CisgICAgfTsKKworICAgIHR5cGVkZWYgQXVkaW9Qb2xpY3lDb25maWcgKlB0clNlcmlhbGl6aW5nQ3R4OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CisgICAgLy8gQ2hpbGRyZW46IG1peFBvcnRUcmFpdHMsIGRldmljZVBvcnRUcmFpdHMsIGFuZCByb3V0ZVRyYWl0cworICAgIC8vIE5lZWQgdG8gY2FsbCBkZXNlcmlhbGl6ZSBvbiBlYWNoIGNoaWxkCit9OworCitzdHJ1Y3QgR2xvYmFsQ29uZmlnVHJhaXRzCit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiZ2xvYmFsQ29uZmlndXJhdGlvbiI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzcGVha2VyRHJjRW5hYmxlZCA9ICJzcGVha2VyX2RyY19lbmFibGVkIjsKKyAgICB9OworCisgICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKnJvb3QsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpOworfTsKKworc3RydWN0IFN1cnJvdW5kU291bmRUcmFpdHMKK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJzdXJyb3VuZFNvdW5kIjsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKTsKKyAgICAvLyBDaGlsZHJlbjogU3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0cworfTsKKworc3RydWN0IFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHMgOiBwdWJsaWMgU3RkQ29sbGVjdGlvblRyYWl0czxBdWRpb1BvbGljeUNvbmZpZzo6U3Vycm91bmRGb3JtYXRzPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gImZvcm1hdCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gImZvcm1hdHMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzdWJmb3JtYXRzID0gInN1YmZvcm1hdHMiOworICAgIH07CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKK307CisKK2NsYXNzIFBvbGljeVNlcmlhbGl6ZXIKK3sKK3B1YmxpYzoKKyAgICBQb2xpY3lTZXJpYWxpemVyKCkgOiBtVmVyc2lvbntzdGQ6OnRvX3N0cmluZyhnTWFqb3IpICsgIi4iICsgc3RkOjp0b19zdHJpbmcoZ01pbm9yKX0KKyAgICB7CisgICAgICAgIEFMT0dWKCIlczogVmVyc2lvbj0lcyBSb290PSVzIiwgX19mdW5jX18sIG1WZXJzaW9uLmNfc3RyKCksIHJvb3ROYW1lKTsKKyAgICB9CisgICAgc3RhdHVzX3QgZGVzZXJpYWxpemUoY29uc3QgY2hhciAqY29uZmlnRmlsZSwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZyk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyb290TmFtZSA9ICJhdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24iOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdmVyc2lvbkF0dHJpYnV0ZSA9ICJ2ZXJzaW9uIjsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGdNYWpvciA9IDE7IC8qKjwgdGhlIG1ham9yIG51bWJlciBvZiB0aGUgcG9saWN5IHhtbCBmb3JtYXQgdmVyc2lvbi4gKi8KKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGdNaW5vciA9IDA7IC8qKjwgdGhlIG1pbm9yIG51bWJlciBvZiB0aGUgcG9saWN5IHhtbCBmb3JtYXQgdmVyc2lvbi4gKi8KKworICAgIHR5cGVkZWYgQXVkaW9Qb2xpY3lDb25maWcgRWxlbWVudDsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1WZXJzaW9uOworCisgICAgLy8gQ2hpbGRyZW46IE1vZHVsZXNUcmFpdHMsIFZvbHVtZVRyYWl0cywgU3Vycm91bmRTb3VuZFRyYWl0cyAob3B0aW9uYWwpCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NvbnN0ZXhwciB2b2lkICgqeG1sRGVsZXRlcikoVCogdCk7Cit0ZW1wbGF0ZSA8PgorY29uc3RleHByIGF1dG8geG1sRGVsZXRlcjx4bWxEb2M+ID0geG1sRnJlZURvYzsKKy8vIGh0dHA6Ly9iLzExMTA2NzI3NyAtIEFkZCBiYWNrIGNvbnN0ZXhwciB3aGVuIHdlIHN3aXRjaCB0byBDKysxNy4KK3RlbXBsYXRlIDw+CithdXRvIHhtbERlbGV0ZXI8eG1sQ2hhcj4gPSBbXSh4bWxDaGFyICpzKSB7IHhtbEZyZWUocyk7IH07CisKKy8qKiBAcmV0dXJuIGEgdW5pcXVlX3B0ciB3aXRoIHRoZSBjb3JyZWN0IGRlbGV0ZXIgZm9yIHRoZSBsaWJ4bWwyIG9iamVjdC4gKi8KK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3RleHByIGF1dG8gbWFrZV94bWxVbmlxdWUoVCAqdCkgeworICAgIC8vIFdyYXAgZGVsZXRlciBpbiBsYW1iZGEgdG8gZW5hYmxlIGVtcHR5IGJhc2Ugb3B0aW1pemF0aW9uCisgICAgYXV0byBkZWxldGVyID0gW10oVCAqdCkgeyB4bWxEZWxldGVyPFQ+KHQpOyB9OworICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8VCwgZGVjbHR5cGUoZGVsZXRlcik+e3QsIGRlbGV0ZXJ9OworfQorCitzdGQ6OnN0cmluZyBnZXRYbWxBdHRyaWJ1dGUoY29uc3QgeG1sTm9kZSAqY3VyLCBjb25zdCBjaGFyICphdHRyaWJ1dGUpCit7CisgICAgYXV0byB4bWxWYWx1ZSA9IG1ha2VfeG1sVW5pcXVlKHhtbEdldFByb3AoY3VyLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihhdHRyaWJ1dGUpKSk7CisgICAgaWYgKHhtbFZhbHVlID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuICIiOwogICAgIH0KLSAgICBzdHJpbmcgdmFsdWUoKGNvbnN0IGNoYXIqKXhtbFZhbHVlKTsKLSAgICB4bWxGcmVlKHhtbFZhbHVlKTsKKyAgICBzdGQ6OnN0cmluZyB2YWx1ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih4bWxWYWx1ZS5nZXQoKSkpOwogICAgIHJldHVybiB2YWx1ZTsKIH0KIAotdXNpbmcgdXRpbGl0aWVzOjpjb252ZXJ0VG87Ci0KLWNvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVNlcmlhbGl6ZXI6OnJvb3ROYW1lID0gImF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiI7Ci1jb25zdCBjaGFyICpjb25zdCBQb2xpY3lTZXJpYWxpemVyOjp2ZXJzaW9uQXR0cmlidXRlID0gInZlcnNpb24iOwotY29uc3QgdWludDMyX3QgUG9saWN5U2VyaWFsaXplcjo6Z01ham9yID0gMTsKLWNvbnN0IHVpbnQzMl90IFBvbGljeVNlcmlhbGl6ZXI6OmdNaW5vciA9IDA7Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ1JlZmVyZW5jZUVsZW1lbnROYW1lID0gInJlZmVyZW5jZSI7Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ1JlZmVyZW5jZUF0dHJpYnV0ZU5hbWUgPSAibmFtZSI7Ci0KIHRlbXBsYXRlIDxjbGFzcyBUcmFpdD4KLXN0YXRpYyB2b2lkIGdldFJlZmVyZW5jZShjb25zdCBfeG1sTm9kZSAqcm9vdCwgY29uc3QgX3htbE5vZGUgKiZyZWZOb2RlLCBjb25zdCBzdHJpbmcgJnJlZk5hbWUpCitjb25zdCB4bWxOb2RlKiBnZXRSZWZlcmVuY2UoY29uc3QgeG1sTm9kZSAqY3VyLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVmTmFtZSkKIHsKLSAgICBjb25zdCBfeG1sTm9kZSAqY29sID0gcm9vdDsKLSAgICB3aGlsZSAoY29sICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCF4bWxTdHJjbXAoY29sLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojpjb2xsZWN0aW9uVGFnKSkgewotICAgICAgICAgICAgY29uc3QgeG1sTm9kZSAqY3VyID0gY29sLT5jaGlsZHJlbjsKLSAgICAgICAgICAgIHdoaWxlIChjdXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmICgoIXhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopZ1JlZmVyZW5jZUVsZW1lbnROYW1lKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBnUmVmZXJlbmNlQXR0cmlidXRlTmFtZSk7CisgICAgZm9yICg7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihUcmFpdDo6Y29sbGVjdGlvblRhZykpKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gY3VyLT5jaGlsZHJlbjsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworICAgICAgICAgICAgICAgIGlmICgoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihUcmFpdDo6cmVmZXJlbmNlVGFnKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIFRyYWl0OjpBdHRyaWJ1dGVzOjpyZWZlcmVuY2VOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZk5hbWUgPT0gbmFtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVmTm9kZSA9IGN1cjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdXIgPSBjdXItPm5leHQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgY29sID0gY29sLT5uZXh0OwogICAgIH0KLSAgICByZXR1cm47CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFpdD4KLXN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZUNvbGxlY3Rpb24oX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBUcmFpdDo6Q29sbGVjdGlvbiAmY29sbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OlB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCkKK3N0YXR1c190IGRlc2VyaWFsaXplQ29sbGVjdGlvbihjb25zdCB4bWxOb2RlICpjdXIsCisgICAgICAgIHR5cGVuYW1lIFRyYWl0OjpDb2xsZWN0aW9uICpjb2xsZWN0aW9uLAorICAgICAgICB0eXBlbmFtZSBUcmFpdDo6UHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KQogewotICAgIGNvbnN0IHhtbE5vZGUgKnJvb3QgPSBjdXItPnhtbENoaWxkcmVuTm9kZTsKLSAgICB3aGlsZSAocm9vdCAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICh4bWxTdHJjbXAocm9vdC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6Y29sbGVjdGlvblRhZykgJiYKLSAgICAgICAgICAgICAgICB4bWxTdHJjbXAocm9vdC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6dGFnKSkgewotICAgICAgICAgICAgcm9vdCA9IHJvb3QtPm5leHQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKKyAgICBmb3IgKGN1ciA9IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gTlVMTDsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihUcmFpdDo6Y29sbGVjdGlvblRhZykpKSB7CisgICAgICAgICAgICBjaGlsZCA9IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlOworICAgICAgICB9IGVsc2UgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihUcmFpdDo6dGFnKSkpIHsKKyAgICAgICAgICAgIGNoaWxkID0gY3VyOwogICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gcm9vdDsKLSAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OmNvbGxlY3Rpb25UYWcpKSB7Ci0gICAgICAgICAgICBjaGlsZCA9IGNoaWxkLT54bWxDaGlsZHJlbk5vZGU7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGNoaWxkICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojp0YWcpKSB7Ci0gICAgICAgICAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OlB0ckVsZW1lbnQgZWxlbWVudDsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBUcmFpdDo6ZGVzZXJpYWxpemUoZG9jLCBjaGlsZCwgZWxlbWVudCwgc2VyaWFsaXppbmdDb250ZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uLmFkZChlbGVtZW50KSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgYWRkIGVsZW1lbnQgdG8gJXMgY29sbGVjdGlvbiIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaXQ6OmNvbGxlY3Rpb25UYWcpOworICAgICAgICBmb3IgKDsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworICAgICAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KFRyYWl0Ojp0YWcpKSkgeworICAgICAgICAgICAgICAgIGF1dG8gZWxlbWVudCA9IFRyYWl0OjpkZXNlcmlhbGl6ZShjaGlsZCwgc2VyaWFsaXppbmdDb250ZXh0KTsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVHJhaXQ6OmFkZEVsZW1lbnRUb0NvbGxlY3Rpb24oZWxlbWVudCwgY29sbGVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IGFkZCBlbGVtZW50IHRvICVzIGNvbGxlY3Rpb24iLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFpdDo6Y29sbGVjdGlvblRhZyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0OwogICAgICAgICB9Ci0gICAgICAgIGlmICgheG1sU3RyY21wKHJvb3QtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OnRhZykpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihUcmFpdDo6dGFnKSkpIHsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQotICAgICAgICByb290ID0gcm9vdC0+bmV4dDsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1jb25zdCBjaGFyICpjb25zdCBBdWRpb0dhaW5UcmFpdHM6OnRhZyA9ICJnYWluIjsKLWNvbnN0IGNoYXIgKmNvbnN0IEF1ZGlvR2FpblRyYWl0czo6Y29sbGVjdGlvblRhZyA9ICJnYWlucyI7Ci0KLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjptb2RlW10gPSAibW9kZSI7Ci1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6Y2hhbm5lbE1hc2tbXSA9ICJjaGFubmVsX21hc2siOwotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6Om1pblZhbHVlTUJbXSA9ICJtaW5WYWx1ZU1CIjsKLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjptYXhWYWx1ZU1CW10gPSAibWF4VmFsdWVNQiI7Ci1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6ZGVmYXVsdFZhbHVlTUJbXSA9ICJkZWZhdWx0VmFsdWVNQiI7Ci1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6c3RlcFZhbHVlTUJbXSA9ICJzdGVwVmFsdWVNQiI7Ci1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6bWluUmFtcE1zW10gPSAibWluUmFtcE1zIjsKLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjptYXhSYW1wTXNbXSA9ICJtYXhSYW1wTXMiOwotCi1zdGF0dXNfdCBBdWRpb0dhaW5UcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKi8qZG9jKi8sIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZnYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQorUmV0dXJuPEF1ZGlvR2FpblRyYWl0czo6RWxlbWVudD4gQXVkaW9HYWluVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsCisgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCiB7CiAgICAgc3RhdGljIHVpbnQzMl90IGluZGV4ID0gMDsKLSAgICBnYWluID0gbmV3IEVsZW1lbnQoaW5kZXgrKywgdHJ1ZSk7CisgICAgRWxlbWVudCBnYWluID0gbmV3IEF1ZGlvR2FpbihpbmRleCsrLCB0cnVlKTsKIAotICAgIHN0cmluZyBtb2RlID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6Om1vZGUpOworICAgIHN0ZDo6c3RyaW5nIG1vZGUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjptb2RlKTsKICAgICBpZiAoIW1vZGUuZW1wdHkoKSkgewogICAgICAgICBnYWluLT5zZXRNb2RlKEdhaW5Nb2RlQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhtb2RlKSk7CiAgICAgfQogCi0gICAgc3RyaW5nIGNoYW5uZWxzTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpjaGFubmVsTWFzayk7CisgICAgc3RkOjpzdHJpbmcgY2hhbm5lbHNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6Y2hhbm5lbE1hc2spOwogICAgIGlmICghY2hhbm5lbHNMaXRlcmFsLmVtcHR5KCkpIHsKICAgICAgICAgZ2Fpbi0+c2V0Q2hhbm5lbE1hc2soY2hhbm5lbE1hc2tGcm9tU3RyaW5nKGNoYW5uZWxzTGl0ZXJhbCkpOwogICAgIH0KIAotICAgIHN0cmluZyBtaW5WYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjptaW5WYWx1ZU1CKTsKKyAgICBzdGQ6OnN0cmluZyBtaW5WYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om1pblZhbHVlTUIpOwogICAgIGludDMyX3QgbWluVmFsdWVNQjsKICAgICBpZiAoIW1pblZhbHVlTUJMaXRlcmFsLmVtcHR5KCkgJiYgY29udmVydFRvKG1pblZhbHVlTUJMaXRlcmFsLCBtaW5WYWx1ZU1CKSkgewogICAgICAgICBnYWluLT5zZXRNaW5WYWx1ZUluTWIobWluVmFsdWVNQik7CiAgICAgfQogCi0gICAgc3RyaW5nIG1heFZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6Om1heFZhbHVlTUIpOworICAgIHN0ZDo6c3RyaW5nIG1heFZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bWF4VmFsdWVNQik7CiAgICAgaW50MzJfdCBtYXhWYWx1ZU1COwogICAgIGlmICghbWF4VmFsdWVNQkxpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8obWF4VmFsdWVNQkxpdGVyYWwsIG1heFZhbHVlTUIpKSB7CiAgICAgICAgIGdhaW4tPnNldE1heFZhbHVlSW5NYihtYXhWYWx1ZU1CKTsKICAgICB9CiAKLSAgICBzdHJpbmcgZGVmYXVsdFZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmRlZmF1bHRWYWx1ZU1CKTsKKyAgICBzdGQ6OnN0cmluZyBkZWZhdWx0VmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpkZWZhdWx0VmFsdWVNQik7CiAgICAgaW50MzJfdCBkZWZhdWx0VmFsdWVNQjsKICAgICBpZiAoIWRlZmF1bHRWYWx1ZU1CTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyhkZWZhdWx0VmFsdWVNQkxpdGVyYWwsIGRlZmF1bHRWYWx1ZU1CKSkgewogICAgICAgICBnYWluLT5zZXREZWZhdWx0VmFsdWVJbk1iKGRlZmF1bHRWYWx1ZU1CKTsKICAgICB9CiAKLSAgICBzdHJpbmcgc3RlcFZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnN0ZXBWYWx1ZU1CKTsKKyAgICBzdGQ6OnN0cmluZyBzdGVwVmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzdGVwVmFsdWVNQik7CiAgICAgdWludDMyX3Qgc3RlcFZhbHVlTUI7CiAgICAgaWYgKCFzdGVwVmFsdWVNQkxpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8oc3RlcFZhbHVlTUJMaXRlcmFsLCBzdGVwVmFsdWVNQikpIHsKICAgICAgICAgZ2Fpbi0+c2V0U3RlcFZhbHVlSW5NYihzdGVwVmFsdWVNQik7CiAgICAgfQogCi0gICAgc3RyaW5nIG1pblJhbXBNc0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6bWluUmFtcE1zKTsKKyAgICBzdGQ6OnN0cmluZyBtaW5SYW1wTXNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bWluUmFtcE1zKTsKICAgICB1aW50MzJfdCBtaW5SYW1wTXM7CiAgICAgaWYgKCFtaW5SYW1wTXNMaXRlcmFsLmVtcHR5KCkgJiYgY29udmVydFRvKG1pblJhbXBNc0xpdGVyYWwsIG1pblJhbXBNcykpIHsKICAgICAgICAgZ2Fpbi0+c2V0TWluUmFtcEluTXMobWluUmFtcE1zKTsKICAgICB9CiAKLSAgICBzdHJpbmcgbWF4UmFtcE1zTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjptYXhSYW1wTXMpOworICAgIHN0ZDo6c3RyaW5nIG1heFJhbXBNc0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjptYXhSYW1wTXMpOwogICAgIHVpbnQzMl90IG1heFJhbXBNczsKICAgICBpZiAoIW1heFJhbXBNc0xpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8obWF4UmFtcE1zTGl0ZXJhbCwgbWF4UmFtcE1zKSkgewogICAgICAgICBnYWluLT5zZXRNYXhSYW1wSW5NcyhtYXhSYW1wTXMpOwogICAgIH0KLSAgICBBTE9HVigiJXM6IGFkZGluZyBuZXcgZ2FpbiBtb2RlICUwOHggY2hhbm5lbCBtYXNrICUwOHggbWluIG1CICVkIG1heCBtQiAlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICBnYWluLT5nZXRNb2RlKCksIGdhaW4tPmdldENoYW5uZWxNYXNrKCksIGdhaW4tPmdldE1pblZhbHVlSW5NYigpLAotICAgICAgICAgIGdhaW4tPmdldE1heFZhbHVlSW5NYigpKTsKLQotICAgIGlmIChnYWluLT5nZXRNb2RlKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIHN0ZDo6c3RyaW5nIHVzZUZvclZvbHVtZUxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjp1c2VGb3JWb2x1bWUpOworICAgIGJvb2wgdXNlRm9yVm9sdW1lID0gZmFsc2U7CisgICAgaWYgKCF1c2VGb3JWb2x1bWVMaXRlcmFsLmVtcHR5KCkgJiYgY29udmVydFRvKHVzZUZvclZvbHVtZUxpdGVyYWwsIHVzZUZvclZvbHVtZSkpIHsKKyAgICAgICAgZ2Fpbi0+c2V0VXNlRm9yVm9sdW1lKHVzZUZvclZvbHVtZSk7CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBBTE9HVigiJXM6IGFkZGluZyBuZXcgZ2FpbiBtb2RlICUwOHggY2hhbm5lbCBtYXNrICUwOHggbWluIG1CICVkIG1heCBtQiAlZCBVc2VGb3JWb2x1bWU6ICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywgZ2Fpbi0+Z2V0TW9kZSgpLCBnYWluLT5nZXRDaGFubmVsTWFzaygpLCBnYWluLT5nZXRNaW5WYWx1ZUluTWIoKSwKKyAgICAgICAgICBnYWluLT5nZXRNYXhWYWx1ZUluTWIoKSwgdXNlRm9yVm9sdW1lKTsKKworICAgIGlmIChnYWluLT5nZXRNb2RlKCkgIT0gMCkgeworICAgICAgICByZXR1cm4gZ2FpbjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgIH0KIH0KIAotY29uc3QgY2hhciAqY29uc3QgQXVkaW9Qcm9maWxlVHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gInByb2ZpbGVzIjsKLWNvbnN0IGNoYXIgKmNvbnN0IEF1ZGlvUHJvZmlsZVRyYWl0czo6dGFnID0gInByb2ZpbGUiOwotCi1jb25zdCBjaGFyIEF1ZGlvUHJvZmlsZVRyYWl0czo6QXR0cmlidXRlczo6bmFtZVtdID0gIm5hbWUiOwotY29uc3QgY2hhciBBdWRpb1Byb2ZpbGVUcmFpdHM6OkF0dHJpYnV0ZXM6OnNhbXBsaW5nUmF0ZXNbXSA9ICJzYW1wbGluZ1JhdGVzIjsKLWNvbnN0IGNoYXIgQXVkaW9Qcm9maWxlVHJhaXRzOjpBdHRyaWJ1dGVzOjpmb3JtYXRbXSA9ICJmb3JtYXQiOwotY29uc3QgY2hhciBBdWRpb1Byb2ZpbGVUcmFpdHM6OkF0dHJpYnV0ZXM6OmNoYW5uZWxNYXNrc1tdID0gImNoYW5uZWxNYXNrcyI7Ci0KLXN0YXR1c190IEF1ZGlvUHJvZmlsZVRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqLypkb2MqLywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJnByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCitSZXR1cm48QXVkaW9Qcm9maWxlVHJhaXRzOjpFbGVtZW50PiBBdWRpb1Byb2ZpbGVUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwKKyAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKLSAgICBzdHJpbmcgc2FtcGxpbmdSYXRlcyA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpzYW1wbGluZ1JhdGVzKTsKLSAgICBzdHJpbmcgZm9ybWF0ID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmZvcm1hdCk7Ci0gICAgc3RyaW5nIGNoYW5uZWxzID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmNoYW5uZWxNYXNrcyk7CisgICAgc3RkOjpzdHJpbmcgc2FtcGxpbmdSYXRlcyA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnNhbXBsaW5nUmF0ZXMpOworICAgIHN0ZDo6c3RyaW5nIGZvcm1hdCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OmZvcm1hdCk7CisgICAgc3RkOjpzdHJpbmcgY2hhbm5lbHMgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpjaGFubmVsTWFza3MpOwogCi0gICAgcHJvZmlsZSA9IG5ldyBFbGVtZW50KGZvcm1hdEZyb21TdHJpbmcoZm9ybWF0LCBnRHluYW1pY0Zvcm1hdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrc0Zyb21TdHJpbmcoY2hhbm5lbHMsICIsIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXNGcm9tU3RyaW5nKHNhbXBsaW5nUmF0ZXMsICIsIikpOworICAgIEVsZW1lbnQgcHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0RnJvbVN0cmluZyhmb3JtYXQsIGdEeW5hbWljRm9ybWF0KSwKKyAgICAgICAgICAgIGNoYW5uZWxNYXNrc0Zyb21TdHJpbmcoY2hhbm5lbHMsICIsIiksCisgICAgICAgICAgICBzYW1wbGluZ1JhdGVzRnJvbVN0cmluZyhzYW1wbGluZ1JhdGVzLCAiLCIpKTsKIAogICAgIHByb2ZpbGUtPnNldER5bmFtaWNGb3JtYXQocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZ0R5bmFtaWNGb3JtYXQpOwogICAgIHByb2ZpbGUtPnNldER5bmFtaWNDaGFubmVscyhwcm9maWxlLT5nZXRDaGFubmVscygpLmlzRW1wdHkoKSk7CiAgICAgcHJvZmlsZS0+c2V0RHluYW1pY1JhdGUocHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKS5pc0VtcHR5KCkpOwogCi0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJldHVybiBwcm9maWxlOwogfQogCi0KLWNvbnN0IGNoYXIgKmNvbnN0IE1peFBvcnRUcmFpdHM6OmNvbGxlY3Rpb25UYWcgPSAibWl4UG9ydHMiOwotY29uc3QgY2hhciAqY29uc3QgTWl4UG9ydFRyYWl0czo6dGFnID0gIm1peFBvcnQiOwotCi1jb25zdCBjaGFyIE1peFBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6Om5hbWVbXSA9ICJuYW1lIjsKLWNvbnN0IGNoYXIgTWl4UG9ydFRyYWl0czo6QXR0cmlidXRlczo6cm9sZVtdID0gInJvbGUiOwotY29uc3QgY2hhciBNaXhQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjpmbGFnc1tdID0gImZsYWdzIjsKLWNvbnN0IGNoYXIgTWl4UG9ydFRyYWl0czo6QXR0cmlidXRlczo6bWF4T3BlbkNvdW50W10gPSAibWF4T3BlbkNvdW50IjsKLWNvbnN0IGNoYXIgTWl4UG9ydFRyYWl0czo6QXR0cmlidXRlczo6bWF4QWN0aXZlQ291bnRbXSA9ICJtYXhBY3RpdmVDb3VudCI7Ci0KLXN0YXR1c190IE1peFBvcnRUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmNoaWxkLCBQdHJFbGVtZW50ICZtaXhQb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKK1JldHVybjxNaXhQb3J0VHJhaXRzOjpFbGVtZW50PiBNaXhQb3J0VHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjaGlsZCwKKyAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKLSAgICBzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bmFtZSk7CiAgICAgaWYgKG5hbWUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjpuYW1lLCBuYW1lLmNfc3RyKCkpOwotICAgIHN0cmluZyByb2xlID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpyb2xlKTsKKyAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyByb2xlID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpyb2xlKTsKICAgICBpZiAocm9sZS5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnJvbGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnJvbGUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBBTE9HVigiJXM6IFJvbGU9JXMiLCBfX0ZVTkNUSU9OX18sIHJvbGUuY19zdHIoKSk7Ci0gICAgYXVkaW9fcG9ydF9yb2xlX3QgcG9ydFJvbGUgPSByb2xlID09ICJzb3VyY2UiID8gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSA6IEFVRElPX1BPUlRfUk9MRV9TSU5LOworICAgIEFMT0dWKCIlczogUm9sZT0lcyIsIF9fZnVuY19fLCByb2xlLmNfc3RyKCkpOworICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlID0gKHJvbGUgPT0gQXR0cmlidXRlczo6cm9sZVNvdXJjZSkgPworICAgICAgICAgICAgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSA6IEFVRElPX1BPUlRfUk9MRV9TSU5LOwogCi0gICAgbWl4UG9ydCA9IG5ldyBFbGVtZW50KFN0cmluZzgobmFtZS5jX3N0cigpKSwgcG9ydFJvbGUpOworICAgIEVsZW1lbnQgbWl4UG9ydCA9IG5ldyBJT1Byb2ZpbGUoU3RyaW5nOChuYW1lLmNfc3RyKCkpLCBwb3J0Um9sZSk7CiAKICAgICBBdWRpb1Byb2ZpbGVUcmFpdHM6OkNvbGxlY3Rpb24gcHJvZmlsZXM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvUHJvZmlsZVRyYWl0cz4oZG9jLCBjaGlsZCwgcHJvZmlsZXMsIE5VTEwpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb1Byb2ZpbGVUcmFpdHM+KGNoaWxkLCAmcHJvZmlsZXMsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CiAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSkgewotICAgICAgICBzcCA8QXVkaW9Qcm9maWxlPiBkeW5hbWljUHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoZ0R5bmFtaWNGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsc1ZlY3RvcigpLCBTYW1wbGVSYXRlVmVjdG9yKCkpOwotICAgICAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsKLSAgICAgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNDaGFubmVscyh0cnVlKTsKLSAgICAgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNSYXRlKHRydWUpOwotICAgICAgICBwcm9maWxlcy5hZGQoZHluYW1pY1Byb2ZpbGUpOworICAgICAgICBwcm9maWxlcy5hZGQoQXVkaW9Qcm9maWxlOjpjcmVhdGVGdWxsRHluYW1pYygpKTsKICAgICB9CiAgICAgbWl4UG9ydC0+c2V0QXVkaW9Qcm9maWxlcyhwcm9maWxlcyk7CiAKLSAgICBzdHJpbmcgZmxhZ3MgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OmZsYWdzKTsKKyAgICBzdGQ6OnN0cmluZyBmbGFncyA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6ZmxhZ3MpOwogICAgIGlmICghZmxhZ3MuZW1wdHkoKSkgewogICAgICAgICAvLyBTb3VyY2Ugcm9sZQogICAgICAgICBpZiAocG9ydFJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgewpAQCAtMjYxLDUyICs0NTIsNDYgQEAKICAgICAgICAgICAgIG1peFBvcnQtPnNldEZsYWdzKElucHV0RmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcoZmxhZ3MpKTsKICAgICAgICAgfQogICAgIH0KLSAgICBzdHJpbmcgbWF4T3BlbkNvdW50ID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjptYXhPcGVuQ291bnQpOworICAgIHN0ZDo6c3RyaW5nIG1heE9wZW5Db3VudCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bWF4T3BlbkNvdW50KTsKICAgICBpZiAoIW1heE9wZW5Db3VudC5lbXB0eSgpKSB7CiAgICAgICAgIGNvbnZlcnRUbyhtYXhPcGVuQ291bnQsIG1peFBvcnQtPm1heE9wZW5Db3VudCk7CiAgICAgfQotICAgIHN0cmluZyBtYXhBY3RpdmVDb3VudCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bWF4QWN0aXZlQ291bnQpOworICAgIHN0ZDo6c3RyaW5nIG1heEFjdGl2ZUNvdW50ID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjptYXhBY3RpdmVDb3VudCk7CiAgICAgaWYgKCFtYXhBY3RpdmVDb3VudC5lbXB0eSgpKSB7CiAgICAgICAgIGNvbnZlcnRUbyhtYXhBY3RpdmVDb3VudCwgbWl4UG9ydC0+bWF4QWN0aXZlQ291bnQpOwogICAgIH0KICAgICAvLyBEZXNlcmlhbGl6ZSBjaGlsZHJlbgogICAgIEF1ZGlvR2FpblRyYWl0czo6Q29sbGVjdGlvbiBnYWluczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9HYWluVHJhaXRzPihkb2MsIGNoaWxkLCBnYWlucywgTlVMTCk7CisgICAgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvR2FpblRyYWl0cz4oY2hpbGQsICZnYWlucywgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIH0KICAgICBtaXhQb3J0LT5zZXRHYWlucyhnYWlucyk7CiAKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgcmV0dXJuIG1peFBvcnQ7CiB9CiAKLWNvbnN0IGNoYXIgKmNvbnN0IERldmljZVBvcnRUcmFpdHM6OnRhZyA9ICJkZXZpY2VQb3J0IjsKLWNvbnN0IGNoYXIgKmNvbnN0IERldmljZVBvcnRUcmFpdHM6OmNvbGxlY3Rpb25UYWcgPSAiZGV2aWNlUG9ydHMiOwotCi1jb25zdCBjaGFyIERldmljZVBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OnRhZ05hbWVbXSA9ICJ0YWdOYW1lIjsKLWNvbnN0IGNoYXIgRGV2aWNlUG9ydFRyYWl0czo6QXR0cmlidXRlczo6dHlwZVtdID0gInR5cGUiOwotY29uc3QgY2hhciBEZXZpY2VQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjpyb2xlW10gPSAicm9sZSI7Ci1jb25zdCBjaGFyIERldmljZVBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OmFkZHJlc3NbXSA9ICJhZGRyZXNzIjsKLWNvbnN0IGNoYXIgRGV2aWNlUG9ydFRyYWl0czo6QXR0cmlidXRlczo6cm9sZVNvdXJjZVtdID0gInNvdXJjZSI7Ci0KLXN0YXR1c190IERldmljZVBvcnRUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmRldmljZURlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQorUmV0dXJuPERldmljZVBvcnRUcmFpdHM6OkVsZW1lbnQ+IERldmljZVBvcnRUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwKKyAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKLSAgICBzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjp0YWdOYW1lKTsKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6dGFnTmFtZSk7CiAgICAgaWYgKG5hbWUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjp0YWdOYW1lKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjp0YWdOYW1lKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjp0YWdOYW1lLCBuYW1lLmNfc3RyKCkpOwotICAgIHN0cmluZyB0eXBlTmFtZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjp0eXBlKTsKKyAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6dGFnTmFtZSwgbmFtZS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyB0eXBlTmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnR5cGUpOwogICAgIGlmICh0eXBlTmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gdHlwZSBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIG5hbWUuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogbm8gdHlwZSBmb3IgJXMiLCBfX2Z1bmNfXywgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjp0eXBlLCB0eXBlTmFtZS5jX3N0cigpKTsKLSAgICBzdHJpbmcgcm9sZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpyb2xlKTsKKyAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6dHlwZSwgdHlwZU5hbWUuY19zdHIoKSk7CisgICAgc3RkOjpzdHJpbmcgcm9sZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnJvbGUpOwogICAgIGlmIChyb2xlLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6cm9sZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6cm9sZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6cm9sZSwgcm9sZS5jX3N0cigpKTsKKyAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6cm9sZSwgcm9sZS5jX3N0cigpKTsKICAgICBhdWRpb19wb3J0X3JvbGVfdCBwb3J0Um9sZSA9IChyb2xlID09IEF0dHJpYnV0ZXM6OnJvbGVTb3VyY2UpID8KICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU09VUkNFIDogQVVESU9fUE9SVF9ST0xFX1NJTks7CiAKQEAgLTMxNCwzMzggKzQ5OSwzMDEgQEAKICAgICBpZiAoIWRldmljZUZyb21TdHJpbmcodHlwZU5hbWUsIHR5cGUpIHx8CiAgICAgICAgICAgICAoIWF1ZGlvX2lzX2lucHV0X2RldmljZSh0eXBlKSAmJiBwb3J0Um9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB8fAogICAgICAgICAgICAgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlcyh0eXBlKSAmJiBwb3J0Um9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykpIHsKLSAgICAgICAgQUxPR1coIiVzOiBiYWQgdHlwZSAlMDh4IiwgX19GVU5DVElPTl9fLCB0eXBlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR1coIiVzOiBiYWQgdHlwZSAlMDh4IiwgX19mdW5jX18sIHR5cGUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBkZXZpY2VEZXNjID0gbmV3IEVsZW1lbnQodHlwZSwgU3RyaW5nOChuYW1lLmNfc3RyKCkpKTsKKyAgICBzdGQ6OnN0cmluZyBlbmNvZGVkRm9ybWF0c0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjplbmNvZGVkRm9ybWF0cyk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6OmVuY29kZWRGb3JtYXRzLCBlbmNvZGVkRm9ybWF0c0xpdGVyYWwuY19zdHIoKSk7CisgICAgRm9ybWF0VmVjdG9yIGVuY29kZWRGb3JtYXRzOworICAgIGlmICghZW5jb2RlZEZvcm1hdHNMaXRlcmFsLmVtcHR5KCkpIHsKKyAgICAgICAgZW5jb2RlZEZvcm1hdHMgPSBmb3JtYXRzRnJvbVN0cmluZyhlbmNvZGVkRm9ybWF0c0xpdGVyYWwsICIgIik7CisgICAgfQorICAgIEVsZW1lbnQgZGV2aWNlRGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKHR5cGUsIGVuY29kZWRGb3JtYXRzLCBTdHJpbmc4KG5hbWUuY19zdHIoKSkpOwogCi0gICAgc3RyaW5nIGFkZHJlc3MgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6YWRkcmVzcyk7CisgICAgc3RkOjpzdHJpbmcgYWRkcmVzcyA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OmFkZHJlc3MpOwogICAgIGlmICghYWRkcmVzcy5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dWKCIlczogYWRkcmVzcz0lcyBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGFkZHJlc3MuY19zdHIoKSwgbmFtZS5jX3N0cigpKTsKLSAgICAgICAgZGV2aWNlRGVzYy0+bUFkZHJlc3MgPSBTdHJpbmc4KGFkZHJlc3MuY19zdHIoKSk7CisgICAgICAgIEFMT0dWKCIlczogYWRkcmVzcz0lcyBmb3IgJXMiLCBfX2Z1bmNfXywgYWRkcmVzcy5jX3N0cigpLCBuYW1lLmNfc3RyKCkpOworICAgICAgICBkZXZpY2VEZXNjLT5zZXRBZGRyZXNzKFN0cmluZzgoYWRkcmVzcy5jX3N0cigpKSk7CiAgICAgfQogCiAgICAgQXVkaW9Qcm9maWxlVHJhaXRzOjpDb2xsZWN0aW9uIHByb2ZpbGVzOwotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb1Byb2ZpbGVUcmFpdHM+KGRvYywgcm9vdCwgcHJvZmlsZXMsIE5VTEwpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb1Byb2ZpbGVUcmFpdHM+KGN1ciwgJnByb2ZpbGVzLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfQogICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgc3AgPEF1ZGlvUHJvZmlsZT4gZHluYW1pY1Byb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKGdEeW5hbWljRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbHNWZWN0b3IoKSwgU2FtcGxlUmF0ZVZlY3RvcigpKTsKLSAgICAgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7Ci0gICAgICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljQ2hhbm5lbHModHJ1ZSk7Ci0gICAgICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljUmF0ZSh0cnVlKTsKLSAgICAgICAgcHJvZmlsZXMuYWRkKGR5bmFtaWNQcm9maWxlKTsKKyAgICAgICAgcHJvZmlsZXMuYWRkKEF1ZGlvUHJvZmlsZTo6Y3JlYXRlRnVsbER5bmFtaWMoKSk7CiAgICAgfQogICAgIGRldmljZURlc2MtPnNldEF1ZGlvUHJvZmlsZXMocHJvZmlsZXMpOwogCiAgICAgLy8gRGVzZXJpYWxpemUgQXVkaW9HYWluIGNoaWxkcmVuCi0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvR2FpblRyYWl0cz4oZG9jLCByb290LCBkZXZpY2VEZXNjLT5tR2FpbnMsIE5VTEwpOwotICAgIEFMT0dWKCIlczogYWRkaW5nIGRldmljZSB0YWcgJXMgdHlwZSAlMDh4IGFkZHJlc3MgJXMiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgZGV2aWNlRGVzYy0+Z2V0TmFtZSgpLnN0cmluZygpLCB0eXBlLCBkZXZpY2VEZXNjLT5tQWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb0dhaW5UcmFpdHM+KGN1ciwgJmRldmljZURlc2MtPm1HYWlucywgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIH0KKyAgICBBTE9HVigiJXM6IGFkZGluZyBkZXZpY2UgdGFnICVzIHR5cGUgJTA4eCBhZGRyZXNzICVzIiwgX19mdW5jX18sCisgICAgICAgICAgZGV2aWNlRGVzYy0+Z2V0TmFtZSgpLnN0cmluZygpLCB0eXBlLCBkZXZpY2VEZXNjLT5hZGRyZXNzKCkuc3RyaW5nKCkpOworICAgIHJldHVybiBkZXZpY2VEZXNjOwogfQogCi1jb25zdCBjaGFyICpjb25zdCBSb3V0ZVRyYWl0czo6dGFnID0gInJvdXRlIjsKLWNvbnN0IGNoYXIgKmNvbnN0IFJvdXRlVHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gInJvdXRlcyI7Ci0KLWNvbnN0IGNoYXIgUm91dGVUcmFpdHM6OkF0dHJpYnV0ZXM6OnR5cGVbXSA9ICJ0eXBlIjsKLWNvbnN0IGNoYXIgUm91dGVUcmFpdHM6OkF0dHJpYnV0ZXM6OnR5cGVNaXhbXSA9ICJtaXgiOwotY29uc3QgY2hhciBSb3V0ZVRyYWl0czo6QXR0cmlidXRlczo6c2lua1tdID0gInNpbmsiOwotY29uc3QgY2hhciBSb3V0ZVRyYWl0czo6QXR0cmlidXRlczo6c291cmNlc1tdID0gInNvdXJjZXMiOwotCi0KLXN0YXR1c190IFJvdXRlVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICovKmRvYyovLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBjdHgpCitSZXR1cm48Um91dGVUcmFpdHM6OkVsZW1lbnQ+IFJvdXRlVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IGN0eCkKIHsKLSAgICBzdHJpbmcgdHlwZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjp0eXBlKTsKKyAgICBzdGQ6OnN0cmluZyB0eXBlID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6dHlwZSk7CiAgICAgaWYgKHR5cGUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjp0eXBlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjp0eXBlKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9CiAgICAgYXVkaW9fcm91dGVfdHlwZV90IHJvdXRlVHlwZSA9ICh0eXBlID09IEF0dHJpYnV0ZXM6OnR5cGVNaXgpID8KICAgICAgICAgICAgICAgICBBVURJT19ST1VURV9NSVggOiBBVURJT19ST1VURV9NVVg7CiAKLSAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIEF0dHJpYnV0ZXM6OnR5cGUsIHR5cGUuY19zdHIoKSk7Ci0gICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KHJvdXRlVHlwZSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6OnR5cGUsIHR5cGUuY19zdHIoKSk7CisgICAgRWxlbWVudCByb3V0ZSA9IG5ldyBBdWRpb1JvdXRlKHJvdXRlVHlwZSk7CiAKLSAgICBzdHJpbmcgc2lua0F0dHIgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6c2luayk7CisgICAgc3RkOjpzdHJpbmcgc2lua0F0dHIgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzaW5rKTsKICAgICBpZiAoc2lua0F0dHIuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpzaW5rKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpzaW5rKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9CiAgICAgLy8gQ29udmVydCBTaW5rIG5hbWUgdG8gcG9ydCBwb2ludGVyCiAgICAgc3A8QXVkaW9Qb3J0PiBzaW5rID0gY3R4LT5maW5kUG9ydEJ5VGFnTmFtZShTdHJpbmc4KHNpbmtBdHRyLmNfc3RyKCkpKTsKICAgICBpZiAoc2luayA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gc2luayBmb3VuZCB3aXRoIG5hbWU9JXMiLCBfX0ZVTkNUSU9OX18sIHNpbmtBdHRyLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IG5vIHNpbmsgZm91bmQgd2l0aCBuYW1lPSVzIiwgX19mdW5jX18sIHNpbmtBdHRyLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBlbGVtZW50LT5zZXRTaW5rKHNpbmspOworICAgIHJvdXRlLT5zZXRTaW5rKHNpbmspOwogCi0gICAgc3RyaW5nIHNvdXJjZXNBdHRyID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnNvdXJjZXMpOworICAgIHN0ZDo6c3RyaW5nIHNvdXJjZXNBdHRyID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c291cmNlcyk7CiAgICAgaWYgKHNvdXJjZXNBdHRyLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6c291cmNlcyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6c291cmNlcyk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIC8vIFRva2VuaXplIGFuZCBDb252ZXJ0IFNvdXJjZXMgbmFtZSB0byBwb3J0IHBvaW50ZXIKICAgICBBdWRpb1BvcnRWZWN0b3Igc291cmNlczsKLSAgICBjaGFyICpzb3VyY2VzTGl0ZXJhbCA9IHN0cm5kdXAoc291cmNlc0F0dHIuY19zdHIoKSwgc3RybGVuKHNvdXJjZXNBdHRyLmNfc3RyKCkpKTsKLSAgICBjaGFyICpkZXZUYWcgPSBzdHJ0b2soc291cmNlc0xpdGVyYWwsICIsIik7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gc291cmNlc0xpdGVyYWx7c3RybmR1cCgKKyAgICAgICAgICAgICAgICBzb3VyY2VzQXR0ci5jX3N0cigpLCBzdHJsZW4oc291cmNlc0F0dHIuY19zdHIoKSkpfTsKKyAgICBjaGFyICpkZXZUYWcgPSBzdHJ0b2soc291cmNlc0xpdGVyYWwuZ2V0KCksICIsIik7CiAgICAgd2hpbGUgKGRldlRhZyAhPSBOVUxMKSB7CiAgICAgICAgIGlmIChzdHJsZW4oZGV2VGFnKSAhPSAwKSB7CiAgICAgICAgICAgICBzcDxBdWRpb1BvcnQ+IHNvdXJjZSA9IGN0eC0+ZmluZFBvcnRCeVRhZ05hbWUoU3RyaW5nOChkZXZUYWcpKTsKICAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogbm8gc291cmNlIGZvdW5kIHdpdGggbmFtZT0lcyIsIF9fRlVOQ1RJT05fXywgZGV2VGFnKTsKLSAgICAgICAgICAgICAgICBmcmVlKHNvdXJjZXNMaXRlcmFsKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogbm8gc291cmNlIGZvdW5kIHdpdGggbmFtZT0lcyIsIF9fZnVuY19fLCBkZXZUYWcpOworICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzb3VyY2VzLmFkZChzb3VyY2UpOwogICAgICAgICB9CiAgICAgICAgIGRldlRhZyA9IHN0cnRvayhOVUxMLCAiLCIpOwogICAgIH0KLSAgICBmcmVlKHNvdXJjZXNMaXRlcmFsKTsKIAotICAgIHNpbmstPmFkZFJvdXRlKGVsZW1lbnQpOworICAgIHNpbmstPmFkZFJvdXRlKHJvdXRlKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8QXVkaW9Qb3J0PiBzb3VyY2UgPSBzb3VyY2VzLml0ZW1BdChpKTsKLSAgICAgICAgc291cmNlLT5hZGRSb3V0ZShlbGVtZW50KTsKKyAgICAgICAgc291cmNlLT5hZGRSb3V0ZShyb3V0ZSk7CiAgICAgfQotICAgIGVsZW1lbnQtPnNldFNvdXJjZXMoc291cmNlcyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJvdXRlLT5zZXRTb3VyY2VzKHNvdXJjZXMpOworICAgIHJldHVybiByb3V0ZTsKIH0KIAotY29uc3QgY2hhciAqY29uc3QgTW9kdWxlVHJhaXRzOjpjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZyA9ICJhdHRhY2hlZERldmljZXMiOwotY29uc3QgY2hhciAqY29uc3QgTW9kdWxlVHJhaXRzOjpjaGlsZEF0dGFjaGVkRGV2aWNlVGFnID0gIml0ZW0iOwotY29uc3QgY2hhciAqY29uc3QgTW9kdWxlVHJhaXRzOjpjaGlsZERlZmF1bHRPdXRwdXREZXZpY2VUYWcgPSAiZGVmYXVsdE91dHB1dERldmljZSI7Ci0KLWNvbnN0IGNoYXIgKmNvbnN0IE1vZHVsZVRyYWl0czo6dGFnID0gIm1vZHVsZSI7Ci1jb25zdCBjaGFyICpjb25zdCBNb2R1bGVUcmFpdHM6OmNvbGxlY3Rpb25UYWcgPSAibW9kdWxlcyI7Ci0KLWNvbnN0IGNoYXIgTW9kdWxlVHJhaXRzOjpBdHRyaWJ1dGVzOjpuYW1lW10gPSAibmFtZSI7Ci1jb25zdCBjaGFyIE1vZHVsZVRyYWl0czo6QXR0cmlidXRlczo6dmVyc2lvbltdID0gImhhbFZlcnNpb24iOwotCi1zdGF0dXNfdCBNb2R1bGVUcmFpdHM6OmRlc2VyaWFsaXplKHhtbERvY1B0ciBkb2MsIGNvbnN0IHhtbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggY3R4KQorUmV0dXJuPE1vZHVsZVRyYWl0czo6RWxlbWVudD4gTW9kdWxlVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IGN0eCkKIHsKLSAgICBzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bmFtZSk7CiAgICAgaWYgKG5hbWUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9CiAgICAgdWludDMyX3QgdmVyc2lvbk1ham9yID0gMCwgdmVyc2lvbk1pbm9yID0gMDsKLSAgICBzdHJpbmcgdmVyc2lvbkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6dmVyc2lvbik7CisgICAgc3RkOjpzdHJpbmcgdmVyc2lvbkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjp2ZXJzaW9uKTsKICAgICBpZiAoIXZlcnNpb25MaXRlcmFsLmVtcHR5KCkpIHsKICAgICAgICAgc3NjYW5mKHZlcnNpb25MaXRlcmFsLmNfc3RyKCksICIldS4ldSIsICZ2ZXJzaW9uTWFqb3IsICZ2ZXJzaW9uTWlub3IpOwotICAgICAgICBBTE9HVigiJXM6IG1IYWxWZXJzaW9uID0gbWFqb3IgJXUgbWlub3IgJXUiLCAgX19GVU5DVElPTl9fLAorICAgICAgICBBTE9HVigiJXM6IG1IYWxWZXJzaW9uID0gbWFqb3IgJXUgbWlub3IgJXUiLCAgX19mdW5jX18sCiAgICAgICAgICAgICAgIHZlcnNpb25NYWpvciwgdmVyc2lvbk1ham9yKTsKICAgICB9CiAKLSAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CiAKLSAgICBtb2R1bGUgPSBuZXcgRWxlbWVudChuYW1lLmNfc3RyKCksIHZlcnNpb25NYWpvciwgdmVyc2lvbk1pbm9yKTsKKyAgICBFbGVtZW50IG1vZHVsZSA9IG5ldyBId01vZHVsZShuYW1lLmNfc3RyKCksIHZlcnNpb25NYWpvciwgdmVyc2lvbk1pbm9yKTsKIAogICAgIC8vIERlc2VyaWFsaXplIGNoaWxkcmVuczogQXVkaW8gTWl4IFBvcnQsIEF1ZGlvIERldmljZSBQb3J0cyAoU291cmNlL1NpbmspLCBBdWRpbyBSb3V0ZXMKICAgICBNaXhQb3J0VHJhaXRzOjpDb2xsZWN0aW9uIG1peFBvcnRzOwotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxNaXhQb3J0VHJhaXRzPihkb2MsIHJvb3QsIG1peFBvcnRzLCBOVUxMKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248TWl4UG9ydFRyYWl0cz4oY3VyLCAmbWl4UG9ydHMsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CiAgICAgbW9kdWxlLT5zZXRQcm9maWxlcyhtaXhQb3J0cyk7CiAKICAgICBEZXZpY2VQb3J0VHJhaXRzOjpDb2xsZWN0aW9uIGRldmljZVBvcnRzOwotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxEZXZpY2VQb3J0VHJhaXRzPihkb2MsIHJvb3QsIGRldmljZVBvcnRzLCBOVUxMKTsKKyAgICBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248RGV2aWNlUG9ydFRyYWl0cz4oY3VyLCAmZGV2aWNlUG9ydHMsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CiAgICAgbW9kdWxlLT5zZXREZWNsYXJlZERldmljZXMoZGV2aWNlUG9ydHMpOwogCiAgICAgUm91dGVUcmFpdHM6OkNvbGxlY3Rpb24gcm91dGVzOwotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxSb3V0ZVRyYWl0cz4oZG9jLCByb290LCByb3V0ZXMsIG1vZHVsZS5nZXQoKSk7CisgICAgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPFJvdXRlVHJhaXRzPihjdXIsICZyb3V0ZXMsIG1vZHVsZS5nZXQoKSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIH0KICAgICBtb2R1bGUtPnNldFJvdXRlcyhyb3V0ZXMpOwogCi0gICAgY29uc3QgeG1sTm9kZSAqY2hpbGRyZW4gPSByb290LT54bWxDaGlsZHJlbk5vZGU7Ci0gICAgd2hpbGUgKGNoaWxkcmVuICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGRyZW4tPm5hbWUsIChjb25zdCB4bWxDaGFyICopY2hpbGRBdHRhY2hlZERldmljZXNUYWcpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXM6ICVzICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCB0YWcsIGNoaWxkQXR0YWNoZWREZXZpY2VzVGFnKTsKLSAgICAgICAgICAgIGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gY2hpbGRyZW4tPnhtbENoaWxkcmVuTm9kZTsKLSAgICAgICAgICAgIHdoaWxlIChjaGlsZCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopY2hpbGRBdHRhY2hlZERldmljZVRhZykpIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sQ2hhciAqYXR0YWNoZWREZXZpY2UgPSB4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNoZWREZXZpY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBjaGlsZEF0dGFjaGVkRGV2aWNlVGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKWF0dGFjaGVkRGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkuZ2V0RGV2aWNlRnJvbVRhZ05hbWUoU3RyaW5nOCgoY29uc3QgY2hhciopYXR0YWNoZWREZXZpY2UpKTsKKyAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmNoaWxkcmVuID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7IGNoaWxkcmVuICE9IE5VTEw7CisgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLT5uZXh0KSB7CisgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkcmVuLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZykpKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6ICVzICVzIGZvdW5kIiwgX19mdW5jX18sIHRhZywgY2hpbGRBdHRhY2hlZERldmljZXNUYWcpOworICAgICAgICAgICAgZm9yIChjb25zdCB4bWxOb2RlICpjaGlsZCA9IGNoaWxkcmVuLT54bWxDaGlsZHJlbk5vZGU7IGNoaWxkICE9IE5VTEw7CisgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oY2hpbGRBdHRhY2hlZERldmljZVRhZykpKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gYXR0YWNoZWREZXZpY2UgPSBtYWtlX3htbFVuaXF1ZSh4bWxOb2RlTGlzdEdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLT5kb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaGVkRGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBjaGlsZEF0dGFjaGVkRGV2aWNlVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihhdHRhY2hlZERldmljZS5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gbW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRnJvbVRhZ05hbWUoU3RyaW5nOChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoZWREZXZpY2UuZ2V0KCkpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmFkZEF2YWlsYWJsZURldmljZShkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sRnJlZShhdHRhY2hlZERldmljZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZHJlbi0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKiljaGlsZERlZmF1bHRPdXRwdXREZXZpY2VUYWcpKSB7Ci0gICAgICAgICAgICB4bWxDaGFyICpkZWZhdWx0T3V0cHV0RGV2aWNlID0geG1sTm9kZUxpc3RHZXRTdHJpbmcoZG9jLCBjaGlsZHJlbi0+eG1sQ2hpbGRyZW5Ob2RlLCAxKTs7Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdE91dHB1dERldmljZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBjaGlsZERlZmF1bHRPdXRwdXREZXZpY2VUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKWRlZmF1bHRPdXRwdXREZXZpY2UpOwotICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpLmdldERldmljZUZyb21UYWdOYW1lKFN0cmluZzgoKGNvbnN0IGNoYXIqKWRlZmF1bHRPdXRwdXREZXZpY2UpKTsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGRyZW4tPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihjaGlsZERlZmF1bHRPdXRwdXREZXZpY2VUYWcpKSkgeworICAgICAgICAgICAgYXV0byBkZWZhdWx0T3V0cHV0RGV2aWNlID0gbWFrZV94bWxVbmlxdWUoeG1sTm9kZUxpc3RHZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4tPmRvYywgY2hpbGRyZW4tPnhtbENoaWxkcmVuTm9kZSwgMSkpOworICAgICAgICAgICAgaWYgKGRlZmF1bHRPdXRwdXREZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBjaGlsZERlZmF1bHRPdXRwdXREZXZpY2VUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihkZWZhdWx0T3V0cHV0RGV2aWNlLmdldCgpKSk7CisgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gbW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKS5nZXREZXZpY2VGcm9tVGFnTmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGVmYXVsdE91dHB1dERldmljZS5nZXQoKSkpKTsKICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlICE9IDAgJiYgY3R4LT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBjdHgtPnNldERlZmF1bHRPdXRwdXREZXZpY2UoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBkZWZhdWx0IGlzICUwOHgiLCBfX0ZVTkNUSU9OX18sIGN0eC0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpLT50eXBlKCkpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IGRlZmF1bHQgaXMgJTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGN0eC0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpLT50eXBlKCkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB4bWxGcmVlKGRlZmF1bHRPdXRwdXREZXZpY2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4tPm5leHQ7CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gbW9kdWxlOwogfQogCi1jb25zdCBjaGFyICpjb25zdCBHbG9iYWxDb25maWdUcmFpdHM6OnRhZyA9ICJnbG9iYWxDb25maWd1cmF0aW9uIjsKLQotY29uc3QgY2hhciBHbG9iYWxDb25maWdUcmFpdHM6OkF0dHJpYnV0ZXM6OnNwZWFrZXJEcmNFbmFibGVkW10gPSAic3BlYWtlcl9kcmNfZW5hYmxlZCI7Ci0KLQotc3RhdHVzX3QgR2xvYmFsQ29uZmlnVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpCitzdGF0dXNfdCBHbG9iYWxDb25maWdUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKnJvb3QsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpCiB7Ci0gICAgY29uc3QgeG1sTm9kZSAqcm9vdCA9IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlOwotICAgIHdoaWxlIChyb290ICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCF4bWxTdHJjbXAocm9vdC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKil0YWcpKSB7Ci0gICAgICAgICAgICBzdHJpbmcgc3BlYWtlckRyY0VuYWJsZWQgPQotICAgICAgICAgICAgICAgICAgICBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6c3BlYWtlckRyY0VuYWJsZWQpOworICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY3VyID0gcm9vdC0+eG1sQ2hpbGRyZW5Ob2RlOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4odGFnKSkpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNwZWFrZXJEcmNFbmFibGVkID0KKyAgICAgICAgICAgICAgICAgICAgZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c3BlYWtlckRyY0VuYWJsZWQpOwogICAgICAgICAgICAgYm9vbCBpc1NwZWFrZXJEcmNFbmFibGVkOwogICAgICAgICAgICAgaWYgKCFzcGVha2VyRHJjRW5hYmxlZC5lbXB0eSgpICYmCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUbzxzdHJpbmcsIGJvb2w+KHNwZWFrZXJEcmNFbmFibGVkLCBpc1NwZWFrZXJEcmNFbmFibGVkKSkgewotICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRTcGVha2VyRHJjRW5hYmxlZChpc1NwZWFrZXJEcmNFbmFibGVkKTsKKyAgICAgICAgICAgICAgICAgICAgY29udmVydFRvPHN0ZDo6c3RyaW5nLCBib29sPihzcGVha2VyRHJjRW5hYmxlZCwgaXNTcGVha2VyRHJjRW5hYmxlZCkpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPnNldFNwZWFrZXJEcmNFbmFibGVkKGlzU3BlYWtlckRyY0VuYWJsZWQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9Ci0gICAgICAgIHJvb3QgPSByb290LT5uZXh0OwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLQotY29uc3QgY2hhciAqY29uc3QgVm9sdW1lVHJhaXRzOjp0YWcgPSAidm9sdW1lIjsKLWNvbnN0IGNoYXIgKmNvbnN0IFZvbHVtZVRyYWl0czo6Y29sbGVjdGlvblRhZyA9ICJ2b2x1bWVzIjsKLWNvbnN0IGNoYXIgKmNvbnN0IFZvbHVtZVRyYWl0czo6dm9sdW1lUG9pbnRUYWcgPSAicG9pbnQiOwotCi1jb25zdCBjaGFyIFZvbHVtZVRyYWl0czo6QXR0cmlidXRlczo6c3RyZWFtW10gPSAic3RyZWFtIjsKLWNvbnN0IGNoYXIgVm9sdW1lVHJhaXRzOjpBdHRyaWJ1dGVzOjpkZXZpY2VDYXRlZ29yeVtdID0gImRldmljZUNhdGVnb3J5IjsKLWNvbnN0IGNoYXIgVm9sdW1lVHJhaXRzOjpBdHRyaWJ1dGVzOjpyZWZlcmVuY2VbXSA9ICJyZWYiOwotCi1zdGF0dXNfdCBWb2x1bWVUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCitzdGF0dXNfdCBTdXJyb3VuZFNvdW5kVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQogewotICAgIHN0cmluZyBzdHJlYW1UeXBlTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpzdHJlYW0pOwotICAgIGlmIChzdHJlYW1UeXBlTGl0ZXJhbC5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnN0cmVhbSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZTsKLSAgICBpZiAoIVN0cmVhbVR5cGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyZWFtVHlwZUxpdGVyYWwsIHN0cmVhbVR5cGUpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogSW52YWxpZCAlcyIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6c3RyZWFtKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3RyaW5nIGRldmljZUNhdGVnb3J5TGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpkZXZpY2VDYXRlZ29yeSk7Ci0gICAgaWYgKGRldmljZUNhdGVnb3J5TGl0ZXJhbC5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OmRldmljZUNhdGVnb3J5KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5OwotICAgIGlmICghRGV2aWNlQ2F0ZWdvcnlDb252ZXJ0ZXI6OmZyb21TdHJpbmcoZGV2aWNlQ2F0ZWdvcnlMaXRlcmFsLCBkZXZpY2VDYXRlZ29yeSkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkICVzPSVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpkZXZpY2VDYXRlZ29yeSwKLSAgICAgICAgICAgICAgZGV2aWNlQ2F0ZWdvcnlMaXRlcmFsLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KKyAgICBjb25maWctPnNldERlZmF1bHRTdXJyb3VuZEZvcm1hdHMoKTsKIAotICAgIHN0cmluZyByZWZlcmVuY2VOYW1lID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnJlZmVyZW5jZSk7Ci0gICAgY29uc3QgX3htbE5vZGUgKnJlZiA9IE5VTEw7Ci0gICAgaWYgKCFyZWZlcmVuY2VOYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgZ2V0UmVmZXJlbmNlPFZvbHVtZVRyYWl0cz4ocm9vdC0+cGFyZW50LCByZWYsIHJlZmVyZW5jZU5hbWUpOwotICAgICAgICBpZiAocmVmID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogTm8gcmVmZXJlbmNlIFB0ciBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIHJlZmVyZW5jZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KGRldmljZUNhdGVnb3J5LCBzdHJlYW1UeXBlKTsKLQotICAgIGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gcmVmZXJlbmNlTmFtZS5lbXB0eSgpID8gcm9vdC0+eG1sQ2hpbGRyZW5Ob2RlIDogcmVmLT54bWxDaGlsZHJlbk5vZGU7Ci0gICAgd2hpbGUgKGNoaWxkICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopdm9sdW1lUG9pbnRUYWcpKSB7Ci0gICAgICAgICAgICB4bWxDaGFyICpwb2ludERlZmluaXRpb24gPSB4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpOzsKLSAgICAgICAgICAgIGlmIChwb2ludERlZmluaXRpb24gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgZm9yIChjb25zdCB4bWxOb2RlICpjdXIgPSByb290LT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPih0YWcpKSkgeworICAgICAgICAgICAgQXVkaW9Qb2xpY3lDb25maWc6OlN1cnJvdW5kRm9ybWF0cyBmb3JtYXRzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHM+KAorICAgICAgICAgICAgICAgICAgICBjdXIsICZmb3JtYXRzLCBudWxscHRyKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPnNldFN1cnJvdW5kRm9ybWF0cyhmb3JtYXRzKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCIlczogJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgKGNvbnN0IGNoYXIqKXBvaW50RGVmaW5pdGlvbik7Ci0gICAgICAgICAgICBWZWN0b3I8aW50MzJfdD4gcG9pbnQ7Ci0gICAgICAgICAgICBjb2xsZWN0aW9uRnJvbVN0cmluZzxEZWZhdWx0VHJhaXRzPGludDMyX3Q+ID4oKGNvbnN0IGNoYXIqKXBvaW50RGVmaW5pdGlvbiwgcG9pbnQsICIsIik7Ci0gICAgICAgICAgICBpZiAocG9pbnQuc2l6ZSgpICE9IDIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXM6ICVzIiwgX19GVU5DVElPTl9fLCB2b2x1bWVQb2ludFRhZywKLSAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopcG9pbnREZWZpbml0aW9uKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxlbWVudC0+YWRkKEN1cnZlUG9pbnQocG9pbnRbMF0sIHBvaW50WzFdKSk7Ci0gICAgICAgICAgICB4bWxGcmVlKHBvaW50RGVmaW5pdGlvbik7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KLSAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1Qb2xpY3lTZXJpYWxpemVyOjpQb2xpY3lTZXJpYWxpemVyKCkgOiBtUm9vdEVsZW1lbnROYW1lKHJvb3ROYW1lKQorUmV0dXJuPFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHM6OkVsZW1lbnQ+IFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHM6OmRlc2VyaWFsaXplKAorICAgICAgICBjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCiB7Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKLSAgICBvc3MgPDwgZ01ham9yIDw8ICIuIiA8PCBnTWlub3I7Ci0gICAgbVZlcnNpb24gPSBvc3Muc3RyKCk7Ci0gICAgQUxPR1YoIiVzOiBWZXJzaW9uPSVzIFJvb3Q9JXMiLCBfX0ZVTkNUSU9OX18sIG1WZXJzaW9uLmNfc3RyKCksIG1Sb290RWxlbWVudE5hbWUuY19zdHIoKSk7CisgICAgc3RkOjpzdHJpbmcgZm9ybWF0TGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIGlmIChmb3JtYXRMaXRlcmFsLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCBmb3IgYSBzdXJyb3VuZCBmb3JtYXQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6bmFtZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgfQorICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IGZvcm1hdEZyb21TdHJpbmcoZm9ybWF0TGl0ZXJhbCk7CisgICAgaWYgKGZvcm1hdCA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICBBTE9HRSgiJXM6IFVucmVjb2duaXplZCBmb3JtYXQgJXMiLCBfX2Z1bmNfXywgZm9ybWF0TGl0ZXJhbC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgRWxlbWVudCBwYWlyID0gc3RkOjptYWtlX3BhaXIoZm9ybWF0LCBDb2xsZWN0aW9uOjptYXBwZWRfdHlwZXt9KTsKKworICAgIHN0ZDo6c3RyaW5nIHN1YmZvcm1hdHNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c3ViZm9ybWF0cyk7CisgICAgaWYgKHN1YmZvcm1hdHNMaXRlcmFsLmVtcHR5KCkpIHJldHVybiBwYWlyOworICAgIEZvcm1hdFZlY3RvciBzdWJmb3JtYXRzID0gZm9ybWF0c0Zyb21TdHJpbmcoc3ViZm9ybWF0c0xpdGVyYWwsICIgIik7CisgICAgZm9yIChjb25zdCBhdXRvJiBzdWJmb3JtYXQgOiBzdWJmb3JtYXRzKSB7CisgICAgICAgIGF1dG8gcmVzdWx0ID0gcGFpci5zZWNvbmQuaW5zZXJ0KHN1YmZvcm1hdCk7CisgICAgICAgIGlmICghcmVzdWx0LnNlY29uZCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgYWRkIHN1YmZvcm1hdCAleCB0byBjb2xsZWN0aW9uIiwgX19mdW5jX18sIHN1YmZvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwYWlyOwogfQogCi1zdGF0dXNfdCBQb2xpY3lTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZShjb25zdCBjaGFyICpjb25maWdGaWxlLCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKQorc3RhdHVzX3QgUG9saWN5U2VyaWFsaXplcjo6ZGVzZXJpYWxpemUoY29uc3QgY2hhciAqY29uZmlnRmlsZSwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZykKIHsKLSAgICB4bWxEb2NQdHIgZG9jOwotICAgIGRvYyA9IHhtbFBhcnNlRmlsZShjb25maWdGaWxlKTsKLSAgICBpZiAoZG9jID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgcGFyc2UgJXMgZG9jdW1lbnQuIiwgX19GVU5DVElPTl9fLCBjb25maWdGaWxlKTsKKyAgICBhdXRvIGRvYyA9IG1ha2VfeG1sVW5pcXVlKHhtbFBhcnNlRmlsZShjb25maWdGaWxlKSk7CisgICAgaWYgKGRvYyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlICVzIGRvY3VtZW50LiIsIF9fZnVuY19fLCBjb25maWdGaWxlKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgeG1sTm9kZVB0ciBjdXIgPSB4bWxEb2NHZXRSb290RWxlbWVudChkb2MpOwotICAgIGlmIChjdXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZSAlcyBkb2N1bWVudDogZW1wdHkuIiwgX19GVU5DVElPTl9fLCBjb25maWdGaWxlKTsKLSAgICAgICAgeG1sRnJlZURvYyhkb2MpOworICAgIHhtbE5vZGVQdHIgcm9vdCA9IHhtbERvY0dldFJvb3RFbGVtZW50KGRvYy5nZXQoKSk7CisgICAgaWYgKHJvb3QgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZSAlcyBkb2N1bWVudDogZW1wdHkuIiwgX19mdW5jX18sIGNvbmZpZ0ZpbGUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBpZiAoeG1sWEluY2x1ZGVQcm9jZXNzKGRvYykgPCAwKSB7Ci0gICAgICAgICBBTE9HRSgiJXM6IGxpYnhtbCBmYWlsZWQgdG8gcmVzb2x2ZSBYSW5jbHVkZXMgb24gJXMgZG9jdW1lbnQuIiwgX19GVU5DVElPTl9fLCBjb25maWdGaWxlKTsKKyAgICBpZiAoeG1sWEluY2x1ZGVQcm9jZXNzKGRvYy5nZXQoKSkgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogbGlieG1sIGZhaWxlZCB0byByZXNvbHZlIFhJbmNsdWRlcyBvbiAlcyBkb2N1bWVudC4iLCBfX2Z1bmNfXywgY29uZmlnRmlsZSk7CiAgICAgfQogCi0gICAgaWYgKHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopIG1Sb290RWxlbWVudE5hbWUuY19zdHIoKSkpICB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgcm9vdCBlbGVtZW50IGZvdW5kIGluIHhtbCBkYXRhICVzLiIsIF9fRlVOQ1RJT05fXywgbVJvb3RFbGVtZW50TmFtZS5jX3N0cigpLAotICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKWN1ci0+bmFtZSk7Ci0gICAgICAgIHhtbEZyZWVEb2MoZG9jKTsKKyAgICBpZiAoeG1sU3RyY21wKHJvb3QtPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KHJvb3ROYW1lKSkpICB7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgcm9vdCBlbGVtZW50IGZvdW5kIGluIHhtbCBkYXRhICVzLiIsIF9fZnVuY19fLCByb290TmFtZSwKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihyb290LT5uYW1lKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgc3RyaW5nIHZlcnNpb24gPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCB2ZXJzaW9uQXR0cmlidXRlKTsKKyAgICBzdGQ6OnN0cmluZyB2ZXJzaW9uID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIHZlcnNpb25BdHRyaWJ1dGUpOwogICAgIGlmICh2ZXJzaW9uLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyB2ZXJzaW9uIGZvdW5kIGluIHJvb3Qgbm9kZSAlcyIsIF9fRlVOQ1RJT05fXywgbVJvb3RFbGVtZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyB2ZXJzaW9uIGZvdW5kIGluIHJvb3Qgbm9kZSAlcyIsIF9fZnVuY19fLCByb290TmFtZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIGlmICh2ZXJzaW9uICE9IG1WZXJzaW9uKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVmVyc2lvbiBkb2VzIG5vdCBtYXRjaDsgZXhwZWN0ICVzIGdvdCAlcyIsIF9fRlVOQ1RJT05fXywgbVZlcnNpb24uY19zdHIoKSwKKyAgICAgICAgQUxPR0UoIiVzOiBWZXJzaW9uIGRvZXMgbm90IG1hdGNoOyBleHBlY3QgJXMgZ290ICVzIiwgX19mdW5jX18sIG1WZXJzaW9uLmNfc3RyKCksCiAgICAgICAgICAgICAgIHZlcnNpb24uY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIC8vIExldHMgZGVzZXJpYWxpemUgY2hpbGRyZW4KICAgICAvLyBNb2R1bGVzCiAgICAgTW9kdWxlVHJhaXRzOjpDb2xsZWN0aW9uIG1vZHVsZXM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPE1vZHVsZVRyYWl0cz4oZG9jLCBjdXIsIG1vZHVsZXMsICZjb25maWcpOwotICAgIGNvbmZpZy5zZXRId01vZHVsZXMobW9kdWxlcyk7Ci0KLSAgICAvLyBkZXNlcmlhbGl6ZSB2b2x1bWUgc2VjdGlvbgotICAgIFZvbHVtZVRyYWl0czo6Q29sbGVjdGlvbiB2b2x1bWVzOwotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxWb2x1bWVUcmFpdHM+KGRvYywgY3VyLCB2b2x1bWVzLCAmY29uZmlnKTsKLSAgICBjb25maWcuc2V0Vm9sdW1lcyh2b2x1bWVzKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248TW9kdWxlVHJhaXRzPihyb290LCAmbW9kdWxlcywgY29uZmlnKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGNvbmZpZy0+c2V0SHdNb2R1bGVzKG1vZHVsZXMpOwogCiAgICAgLy8gR2xvYmFsIENvbmZpZ3VyYXRpb24KLSAgICBHbG9iYWxDb25maWdUcmFpdHM6OmRlc2VyaWFsaXplKGN1ciwgY29uZmlnKTsKKyAgICBHbG9iYWxDb25maWdUcmFpdHM6OmRlc2VyaWFsaXplKHJvb3QsIGNvbmZpZyk7CiAKLSAgICB4bWxGcmVlRG9jKGRvYyk7CisgICAgLy8gU3Vycm91bmQgY29uZmlndXJhdGlvbgorICAgIFN1cnJvdW5kU291bmRUcmFpdHM6OmRlc2VyaWFsaXplKHJvb3QsIGNvbmZpZyk7CisKICAgICByZXR1cm4gYW5kcm9pZDo6T0s7CiB9CiAKK30gIC8vIG5hbWVzcGFjZQorCitzdGF0dXNfdCBkZXNlcmlhbGl6ZUF1ZGlvUG9saWN5RmlsZShjb25zdCBjaGFyICpmaWxlTmFtZSwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZykKK3sKKyAgICBQb2xpY3lTZXJpYWxpemVyIHNlcmlhbGl6ZXI7CisgICAgcmV0dXJuIHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZmlsZU5hbWUsIGNvbmZpZyk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1Nlc3Npb25Sb3V0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXNzaW9uUm91dGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjA2NTI2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1Nlc3Npb25Sb3V0ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQVBNX1Nlc3Npb25Sb3V0ZSIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgIlNlc3Npb25Sb3V0ZS5oIgotI2luY2x1ZGUgIkh3TW9kdWxlLmgiCi0jaW5jbHVkZSAiQXVkaW9HYWluLmgiCi0jaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLSBTZXNzaW9uUm91dGUgY2xhc3MgaW1wbGVtZW50YXRpb24KLXZvaWQgU2Vzc2lvblJvdXRlOjpsb2coY29uc3QgY2hhciogcHJlZml4KQotewotICAgIEFMT0dJKCIlc1tTZXNzaW9uUm91dGUgc3RybToweCVYLCBzcmM6JWQsIHNlc3M6MHglWCwgZGV2OjB4JVggcmVmczolZCBhY3Q6JWQiLAotICAgICAgICAgIHByZWZpeCwgbVN0cmVhbVR5cGUsIG1Tb3VyY2UsIG1TZXNzaW9uLAotICAgICAgICAgIG1EZXZpY2VEZXNjcmlwdG9yICE9IDAgPyBtRGV2aWNlRGVzY3JpcHRvci0+dHlwZSgpIDogQVVESU9fREVWSUNFX05PTkUsCi0gICAgICAgICAgbVJlZkNvdW50LCBtQWN0aXZpdHlDb3VudCk7Ci19Ci0KLS8vIC0tLSBTZXNzaW9uUm91dGVNYXAgY2xhc3MgaW1wbGVtZW50YXRpb24KLWJvb2wgU2Vzc2lvblJvdXRlTWFwOjpoYXNSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICByZXR1cm4gaW5kZXhPZktleShzZXNzaW9uKSA+PSAwICYmIHZhbHVlRm9yKHNlc3Npb24pLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwOwotfQotCi1ib29sIFNlc3Npb25Sb3V0ZU1hcDo6Z2V0QW5kQ2xlYXJSb3V0ZUNoYW5nZWQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgaWYgKGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCkgewotICAgICAgICBpZiAodmFsdWVGb3Ioc2Vzc2lvbiktPm1DaGFuZ2VkKSB7Ci0gICAgICAgICAgICB2YWx1ZUZvcihzZXNzaW9uKS0+bUNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBTZXNzaW9uUm91dGVNYXA6OnJlbW92ZVJvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgPyB2YWx1ZUZvcihzZXNzaW9uKSA6IDA7Ci0gICAgaWYgKHJvdXRlICE9IDApIHsKLSAgICAgICAgQUxPR19BU1NFUlQocm91dGUtPm1SZWZDb3VudCA+IDApOwotICAgICAgICAtLXJvdXRlLT5tUmVmQ291bnQ7Ci0gICAgICAgIGlmIChyb3V0ZS0+bVJlZkNvdW50IDw9IDApIHsKLSAgICAgICAgICAgIHJlbW92ZUl0ZW0oc2Vzc2lvbik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWludCBTZXNzaW9uUm91dGVNYXA6OmluY1JvdXRlQWN0aXZpdHkoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCA/IHZhbHVlRm9yKHNlc3Npb24pIDogMDsKLSAgICByZXR1cm4gcm91dGUgIT0gMCA/ICsrKHJvdXRlLT5tQWN0aXZpdHlDb3VudCkgOiAtMTsKLX0KLQotaW50IFNlc3Npb25Sb3V0ZU1hcDo6ZGVjUm91dGVBY3Rpdml0eShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gaW5kZXhPZktleShzZXNzaW9uKSA+PSAwID8gdmFsdWVGb3Ioc2Vzc2lvbikgOiAwOwotICAgIGlmIChyb3V0ZSAhPSAwICYmIHJvdXRlLT5tQWN0aXZpdHlDb3VudCA+IDApIHsKLSAgICAgICAgcmV0dXJuIC0tKHJvdXRlLT5tQWN0aXZpdHlDb3VudCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLX0KLQotdm9pZCBTZXNzaW9uUm91dGVNYXA6OmxvZyhjb25zdCBjaGFyKiBjYXB0aW9uKQotewotICAgIEFMT0dJKCIlcyAtLS0tIiwgY2FwdGlvbik7Ci0gICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHNpemUoKTsgaW5kZXgrKykgewotICAgICAgICB2YWx1ZUF0KGluZGV4KS0+bG9nKCIgICIpOwotICAgIH0KLX0KLQotdm9pZCBTZXNzaW9uUm91dGVNYXA6OmFkZFJvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQotewotICAgIGlmIChtTWFwVHlwZSA9PSBNQVBUWVBFX0lOUFVUICYmIHN0cmVhbVR5cGUgIT0gU2Vzc2lvblJvdXRlOjpTVFJFQU1fVFlQRV9OQSkgewotICAgICAgICBBTE9HRSgiQWRkaW5nIE91dHB1dCBSb3V0ZSB0byBJbnB1dFJvdXRlTWFwIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKG1NYXBUeXBlID09IE1BUFRZUEVfT1VUUFVUICYmIHNvdXJjZSAhPSBTZXNzaW9uUm91dGU6OlNPVVJDRV9UWVBFX05BKSB7Ci0gICAgICAgIEFMT0dFKCJBZGRpbmcgSW5wdXQgUm91dGUgdG8gT3V0cHV0Um91dGVNYXAiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgPyB2YWx1ZUZvcihzZXNzaW9uKSA6IDA7Ci0KLSAgICBpZiAocm91dGUgIT0gMCkgewotICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSAwIHx8IHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwKSB7Ci0gICAgICAgICAgICByb3V0ZS0+bUNoYW5nZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJvdXRlLT5tUmVmQ291bnQrKzsKLSAgICAgICAgcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICB9IGVsc2UgewotICAgICAgICByb3V0ZSA9IG5ldyBTZXNzaW9uUm91dGUoc2Vzc2lvbiwgc3RyZWFtVHlwZSwgc291cmNlLCBkZXNjcmlwdG9yLCB1aWQpOwotICAgICAgICByb3V0ZS0+bVJlZkNvdW50Kys7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yICE9IDApIHsKLSAgICAgICAgICAgIHJvdXRlLT5tQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkKHNlc3Npb24sIHJvdXRlKTsKLSAgICB9Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBTZXNzaW9uUm91dGVNYXA6OmdldEFjdGl2ZURldmljZUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBhdmFpbGFibGVEZXZpY2VzKQotewotICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBzaXplKCk7IGluZGV4KyspIHsKLSAgICAgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IHZhbHVlQXQoaW5kZXgpOwotICAgICAgICBpZiAoc3RyZWFtVHlwZSA9PSByb3V0ZS0+bVN0cmVhbVR5cGUgJiYgcm91dGUtPmlzQWN0aXZlT3JDaGFuZ2VkKCkKLSAgICAgICAgICAgICAgICAmJiByb3V0ZS0+bURldmljZURlc2NyaXB0b3IgIT0gMCkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvci0+dHlwZSgpOwotICAgICAgICAgICAgaWYgKCFhdmFpbGFibGVEZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TdHJlYW1EZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTY0OWZiLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6Vm9sdW1lcyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotLy8jZGVmaW5lIFZFUllfVkVSQk9TRV9MT0dHSU5HCi0jaWZkZWYgVkVSWV9WRVJCT1NFX0xPR0dJTkcKLSNkZWZpbmUgQUxPR1ZWIEFMT0dWCi0jZWxzZQotI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCi0jZW5kaWYKLQotI2luY2x1ZGUgIlN0cmVhbURlc2NyaXB0b3IuaCIKLSNpbmNsdWRlICJHYWlucy5oIgotI2luY2x1ZGUgInBvbGljeS5oIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0gU3RyZWFtRGVzY3JpcHRvciBjbGFzcyBpbXBsZW1lbnRhdGlvbgotCi1TdHJlYW1EZXNjcmlwdG9yOjpTdHJlYW1EZXNjcmlwdG9yKCkKLSAgICA6ICAgbUluZGV4TWluKDApLCBtSW5kZXhNYXgoMSksIG1DYW5CZU11dGVkKHRydWUpCi17Ci0gICAgLy8gSW5pdGlhbGl6ZSB0aGUgY3VycmVudCBzdHJlYW0ncyBpbmRleCB0byBtSW5kZXhNYXggc28gdm9sdW1lIGlzbid0IDAgaW4KLSAgICAvLyBjYXNlcyB3aGVyZSB0aGUgSmF2YSBsYXllciBkb2Vzbid0IGNhbGwgaW50byB0aGUgYXVkaW8gcG9saWN5IHNlcnZpY2UgdG8KLSAgICAvLyBzZXQgdGhlIGRlZmF1bHQgdm9sdW1lLgotICAgIG1JbmRleEN1ci5hZGQoQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUsIG1JbmRleE1heCk7Ci19Ci0KLWludCBTdHJlYW1EZXNjcmlwdG9yOjpnZXRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAotewotICAgIGRldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7Ci0gICAgLy8gdGhlcmUgaXMgYWx3YXlzIGEgdmFsaWQgZW50cnkgZm9yIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FCi0gICAgaWYgKG1JbmRleEN1ci5pbmRleE9mS2V5KGRldmljZSkgPCAwKSB7Ci0gICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FOwotICAgIH0KLSAgICByZXR1cm4gbUluZGV4Q3VyLnZhbHVlRm9yKGRldmljZSk7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6Y2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoKQotewotICAgIG1JbmRleEN1ci5jbGVhcigpOwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3I6OmFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgaW5kZXgpCi17Ci0gICAgbUluZGV4Q3VyLmFkZChkZXZpY2UsIGluZGV4KTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yOjpzZXRWb2x1bWVJbmRleE1pbihpbnQgdm9sSW5kZXhNaW4pCi17Ci0gICAgbUluZGV4TWluID0gdm9sSW5kZXhNaW47Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6c2V0Vm9sdW1lSW5kZXhNYXgoaW50IHZvbEluZGV4TWF4KQotewotICAgIG1JbmRleE1heCA9IHZvbEluZGV4TWF4OwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3I6OnNldFZvbHVtZUN1cnZlUG9pbnQoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnBvaW50KQotewotICAgIG1Wb2x1bWVDdXJ2ZVtkZXZpY2VDYXRlZ29yeV0gPSBwb2ludDsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVzICAgICAgICAgJTAyZCAgICAgICAgICUwMmQgICAgICAgICAiLAotICAgICAgICAgICAgIG1DYW5CZU11dGVkID8gInRydWUgIiA6ICJmYWxzZSIsIG1JbmRleE1pbiwgbUluZGV4TWF4KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5kZXhDdXIuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJTA0eCA6ICUwMmQsICIsCi0gICAgICAgICAgICAgICAgIG1JbmRleEN1ci5rZXlBdChpKSwKLSAgICAgICAgICAgICAgICAgbUluZGV4Q3VyLnZhbHVlQXQoaSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLX0KLQotU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OlN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uKCkKLXsKLSAgICBmb3IgKHNpemVfdCBzdHJlYW0gPSAwIDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsgc3RyZWFtKyspIHsKLSAgICAgICAgYWRkKHN0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHN0cmVhbSksIFN0cmVhbURlc2NyaXB0b3IoKSk7Ci0gICAgfQotfQotCi1ib29sIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjpjYW5CZU11dGVkKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIHJldHVybiB2YWx1ZUF0KHN0cmVhbSkuY2FuQmVNdXRlZCgpOwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjpjbGVhckN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICBlZGl0VmFsdWVBdChzdHJlYW0pLmNsZWFyQ3VycmVudFZvbHVtZUluZGV4KCk7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgaW5kZXgpCi17Ci0gICAgZWRpdFZhbHVlQXQoc3RyZWFtKS5hZGRDdXJyZW50Vm9sdW1lSW5kZXgoZGV2aWNlLCBpbmRleCk7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OnNldFZvbHVtZUN1cnZlUG9pbnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqcG9pbnQpCi17Ci0gICAgZWRpdFZhbHVlQXQoc3RyZWFtKS5zZXRWb2x1bWVDdXJ2ZVBvaW50KGRldmljZUNhdGVnb3J5LCBwb2ludCk7Ci19Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKlN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjpnZXRWb2x1bWVDdXJ2ZVBvaW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5KSBjb25zdAotewotICAgIHJldHVybiB2YWx1ZUF0KHN0cmVhbSkuZ2V0Vm9sdW1lQ3VydmVQb2ludChkZXZpY2VDYXRlZ29yeSk7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OnNldFZvbHVtZUluZGV4TWluKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLGludCB2b2xJbmRleE1pbikKLXsKLSAgICByZXR1cm4gZWRpdFZhbHVlQXQoc3RyZWFtKS5zZXRWb2x1bWVJbmRleE1pbih2b2xJbmRleE1pbik7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OnNldFZvbHVtZUluZGV4TWF4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLGludCB2b2xJbmRleE1heCkKLXsKLSAgICByZXR1cm4gZWRpdFZhbHVlQXQoc3RyZWFtKS5zZXRWb2x1bWVJbmRleE1heCh2b2xJbmRleE1heCk7Ci19Ci0KLWZsb2F0IFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjp2b2xJbmRleFRvRGIoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGRldmljZV9jYXRlZ29yeSBjYXRlZ29yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4SW5VaSkgY29uc3QKLXsKLSAgICBjb25zdCBTdHJlYW1EZXNjcmlwdG9yICZzdHJlYW1EZXNjID0gdmFsdWVBdChzdHJlYW0pOwotICAgIHJldHVybiBHYWluczo6dm9sSW5kZXhUb0RiKHN0cmVhbURlc2MuZ2V0Vm9sdW1lQ3VydmVQb2ludChjYXRlZ29yeSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzYy5nZXRWb2x1bWVJbmRleE1pbigpLCBzdHJlYW1EZXNjLmdldFZvbHVtZUluZGV4TWF4KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhJblVpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCkKLXsKLSAgICBBTE9HVigiaW5pdFN0cmVhbVZvbHVtZSgpIHN0cmVhbSAlZCwgbWluICVkLCBtYXggJWQiLCBzdHJlYW0gLCBpbmRleE1pbiwgaW5kZXhNYXgpOwotICAgIGlmIChpbmRleE1pbiA8IDAgfHwgaW5kZXhNaW4gPj0gaW5kZXhNYXgpIHsKLSAgICAgICAgQUxPR1coImluaXRTdHJlYW1Wb2x1bWUoKSBpbnZhbGlkIGluZGV4IGxpbWl0cyBmb3Igc3RyZWFtICVkLCBtaW4gJWQsIG1heCAlZCIsCi0gICAgICAgICAgICAgIHN0cmVhbSAsIGluZGV4TWluLCBpbmRleE1heCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHNldFZvbHVtZUluZGV4TWluKHN0cmVhbSwgaW5kZXhNaW4pOwotICAgIHNldFZvbHVtZUluZGV4TWF4KHN0cmVhbSwgaW5kZXhNYXgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6aW5pdGlhbGl6ZVZvbHVtZUN1cnZlcyhib29sIGlzU3BlYWtlckRyY0VuYWJsZWQpCi17Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBERVZJQ0VfQ0FURUdPUllfQ05UOyBqKyspIHsKLSAgICAgICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4oaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGRldmljZV9jYXRlZ29yeT4oaiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5zOjpzVm9sdW1lUHJvZmlsZXNbaV1bal0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgYXZhaWxhYmlsaXR5IG9mIERSQyBvbiBzcGVha2VyIHBhdGg6IGlmIGF2YWlsYWJsZSwgb3ZlcnJpZGUgc29tZSBvZiB0aGUgc3BlYWtlciBjdXJ2ZXMKLSAgICBpZiAoaXNTcGVha2VyRHJjRW5hYmxlZCkgewotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9TWVNURU0sIERFVklDRV9DQVRFR09SWV9TUEVBS0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlRHJjKTsKLSAgICAgICAgc2V0Vm9sdW1lQ3VydmVQb2ludChBVURJT19TVFJFQU1fUklORywgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmMpOwotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9BTEFSTSwgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmMpOwotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04sIERFVklDRV9DQVRFR09SWV9TUEVBS0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjKTsKLSAgICAgICAgc2V0Vm9sdW1lQ3VydmVQb2ludChBVURJT19TVFJFQU1fTVVTSUMsIERFVklDRV9DQVRFR09SWV9TUEVBS0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmMpOwotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZLCBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlRHJjKTsKLSAgICB9Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OnN3aXRjaFZvbHVtZUN1cnZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtU3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ec3QpCi17Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBERVZJQ0VfQ0FURUdPUllfQ05UOyBqKyspIHsKLSAgICAgICAgc2V0Vm9sdW1lQ3VydmVQb2ludChzdHJlYW1Ec3QsIHN0YXRpY19jYXN0PGRldmljZV9jYXRlZ29yeT4oaiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNWb2x1bWVQcm9maWxlc1tzdHJlYW1TcmNdW2pdKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuU3RyZWFtcyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgICAgICAiIFN0cmVhbSAgQ2FuIGJlIG11dGVkICBJbmRleCBNaW4gIEluZGV4IE1heCAgSW5kZXggQ3VyIFtkZXZpY2UgOiBpbmRleF0uLi5cbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlMDJ6dSAgICAgICIsIGkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSkuZHVtcChmZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9UeXBlQ29udmVydGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1R5cGVDb252ZXJ0ZXIuY3BwCmluZGV4IDZmNDhlYWUuLjdjNzZkOGEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1R5cGVDb252ZXJ0ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1R5cGVDb252ZXJ0ZXIuY3BwCkBAIC00NSw2ICs0NSw3IEBACiBjb25zdCBSb3V0ZUZsYWdUeXBlQ29udmVydGVyOjpUYWJsZSBSb3V0ZUZsYWdUeXBlQ29udmVydGVyOjptVGFibGVbXSA9IHsKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLX0FORF9SRU5ERVIpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShNSVhfUk9VVEVfRkxBR19BTEwpLAogICAgIFRFUk1JTkFUT1IKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjM2YxYmMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVm9sdW1lQ3VydmUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6Vm9sdW1lQ3VydmUiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlICJWb2x1bWVDdXJ2ZS5oIgotI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1mbG9hdCBWb2x1bWVDdXJ2ZTo6dm9sSW5kZXhUb0RiKGludCBpbmRleEluVWksIGludCB2b2xJbmRleE1pbiwgaW50IHZvbEluZGV4TWF4KSBjb25zdAotewotICAgIEFMT0dfQVNTRVJUKCFtQ3VydmVQb2ludHMuaXNFbXB0eSgpLCAiSW52YWxpZCB2b2x1bWUgY3VydmUiKTsKLQotICAgIHNpemVfdCBuYkN1cnZlUG9pbnRzID0gbUN1cnZlUG9pbnRzLnNpemUoKTsKLSAgICAvLyB0aGUgdm9sdW1lIGluZGV4IGluIHRoZSBVSSBpcyByZWxhdGl2ZSB0byB0aGUgbWluIGFuZCBtYXggdm9sdW1lIGluZGljZXMgZm9yIHRoaXMgc3RyZWFtCi0gICAgaW50IG5iU3RlcHMgPSAxICsgbUN1cnZlUG9pbnRzW25iQ3VydmVQb2ludHMgLSAxXS5tSW5kZXggLSBtQ3VydmVQb2ludHNbMF0ubUluZGV4OwotICAgIGlmIChpbmRleEluVWkgPCB2b2xJbmRleE1pbikgewotICAgICAgICBBTE9HVigiVk9MVU1FIHJlbWFwcGluZyBpbmRleCBmcm9tICVkIHRvIG1pbiBpbmRleCAlZCIsIGluZGV4SW5VaSwgdm9sSW5kZXhNaW4pOwotICAgICAgICBpbmRleEluVWkgPSB2b2xJbmRleE1pbjsKLSAgICB9IGVsc2UgaWYgKGluZGV4SW5VaSA+IHZvbEluZGV4TWF4KSB7Ci0gICAgICAgIEFMT0dWKCJWT0xVTUUgcmVtYXBwaW5nIGluZGV4IGZyb20gJWQgdG8gbWF4IGluZGV4ICVkIiwgaW5kZXhJblVpLCB2b2xJbmRleE1heCk7Ci0gICAgICAgIGluZGV4SW5VaSA9IHZvbEluZGV4TWF4OwotICAgIH0KLSAgICBpbnQgdm9sSWR4ID0gKG5iU3RlcHMgKiAoaW5kZXhJblVpIC0gdm9sSW5kZXhNaW4pKSAvICh2b2xJbmRleE1heCAtIHZvbEluZGV4TWluKTsKLQotICAgIC8vIFdoZXJlIHdvdWxkIHRoaXMgdm9sdW1lIGluZGV4IGJlZW4gaW5zZXJ0ZWQgaW4gdGhlIGN1cnZlIHBvaW50Ci0gICAgc2l6ZV90IGluZGV4SW5VaVBvc2l0aW9uID0gbUN1cnZlUG9pbnRzLm9yZGVyT2YoQ3VydmVQb2ludCh2b2xJZHgsIDApKTsKLSAgICBpZiAoaW5kZXhJblVpUG9zaXRpb24gPj0gbmJDdXJ2ZVBvaW50cykgewotICAgICAgICAvL3VzZSBsYXN0IHBvaW50IG9mIHRhYmxlCi0gICAgICAgIHJldHVybiBtQ3VydmVQb2ludHNbbmJDdXJ2ZVBvaW50cyAtIDFdLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGY7Ci0gICAgfQotICAgIGlmIChpbmRleEluVWlQb3NpdGlvbiA9PSAwKSB7Ci0gICAgICAgIGlmIChpbmRleEluVWlQb3NpdGlvbiAhPSBtQ3VydmVQb2ludHNbMF0ubUluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gVk9MVU1FX01JTl9EQjsgLy8gb3V0IG9mIGJvdW5kcwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ3VydmVQb2ludHNbMF0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZjsKLSAgICB9Ci0gICAgLy8gbGluZWFyIGludGVycG9sYXRpb24gaW4gdGhlIGF0dGVudWF0aW9uIHRhYmxlIGluIGRCCi0gICAgZmxvYXQgZGVjaWJlbHMgPSAobUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZikgKwotICAgICAgICAgICAgKChmbG9hdCkodm9sSWR4IC0gbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUluZGV4KSkgKgotICAgICAgICAgICAgICAgICggKChtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb25dLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGYpIC0KLSAgICAgICAgICAgICAgICAgICAgICAgIChtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmKSkgLwotICAgICAgICAgICAgICAgICAgICAoKGZsb2F0KShtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb25dLm1JbmRleCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUluZGV4KSkgKTsKLQotICAgIEFMT0dWKCJWT0xVTUUgbURldmljZUNhdGVnb3J5ICVkLCBtU3RyZWFtVHlwZSAlZCB2b2wgaW5kZXg9WyVkICVkICVkXSwgZEI9WyUuMWYgJS4xZiAlLjFmXSIsCi0gICAgICAgICAgICBtRGV2aWNlQ2F0ZWdvcnksIG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUluZGV4LCB2b2xJZHgsCi0gICAgICAgICAgICBtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb25dLm1JbmRleCwKLSAgICAgICAgICAgICgoZmxvYXQpbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZiksIGRlY2liZWxzLAotICAgICAgICAgICAgKChmbG9hdCltQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb25dLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGYpKTsKLQotICAgIHJldHVybiBkZWNpYmVsczsKLX0KLQotdm9pZCBWb2x1bWVDdXJ2ZTo6ZHVtcChpbnQgZmQpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIHsiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ3VydmVQb2ludHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiKCUzZCwgJTVkKSIsCi0gICAgICAgICAgICAgICAgIG1DdXJ2ZVBvaW50c1tpXS5tSW5kZXgsIG1DdXJ2ZVBvaW50c1tpXS5tQXR0ZW51YXRpb25Jbk1iKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1DdXJ2ZVBvaW50cy5zaXplKCkgLSAxKSA/ICIgfVxuIiA6ICIsICIpOwotICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLX0KLQotdm9pZCBWb2x1bWVDdXJ2ZXNGb3JTdHJlYW06OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzID0gMCwgYm9vbCBjdXJ2ZVBvaW50cykgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIGlmICghY3VydmVQb2ludHMpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMgICAgICAgICAlMDJkICAgICAgICAgJTAyZCAgICAgICAgICIsCi0gICAgICAgICAgICAgICAgIG1DYW5CZU11dGVkID8gInRydWUgIiA6ICJmYWxzZSIsIG1JbmRleE1pbiwgbUluZGV4TWF4KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbmRleEN1ci5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJTA0eCA6ICUwMmQsICIsIG1JbmRleEN1ci5rZXlBdChpKSwgbUluZGV4Q3VyLnZhbHVlQXQoaSkpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzdGQ6OnN0cmluZyBkZXZpY2VDYXRMaXRlcmFsOwotICAgICAgICBEZXZpY2VDYXRlZ29yeUNvbnZlcnRlcjo6dG9TdHJpbmcoa2V5QXQoaSksIGRldmljZUNhdExpdGVyYWwpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMgJXMgOiIsCi0gICAgICAgICAgICAgICAgIHNwYWNlcywgIiIsIGRldmljZUNhdExpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7Ci0gICAgfQotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci19Ci0KLXN0YXR1c190IFZvbHVtZUN1cnZlc0NvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5TdHJlYW1zIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAotICAgICAgICAgICAgICIgU3RyZWFtICBDYW4gYmUgbXV0ZWQgIEluZGV4IE1pbiAgSW5kZXggTWF4ICBJbmRleCBDdXIgW2RldmljZSA6IGluZGV4XS4uLlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMnp1ICAgICAgIiwgaSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS5kdW1wKGZkKTsKLSAgICB9Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5Wb2x1bWUgQ3VydmVzIGZvciBVc2UgQ2FzZXMgKGFrYSBTdHJlYW0gdHlwZXMpIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzdGQ6OnN0cmluZyBzdHJlYW1UeXBlTGl0ZXJhbDsKLSAgICAgICAgU3RyZWFtVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcoa2V5QXQoaSksIHN0cmVhbVR5cGVMaXRlcmFsKTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAotICAgICAgICAgICAgICAgICAiICVzICglMDJ6dSk6IEN1cnZlIHBvaW50cyBmb3IgZGV2aWNlIGNhdGVnb3J5IChpbmRleCwgYXR0ZW51YXRpb24gaW4gbWlsbGliZWwpXG4iLAotICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlTGl0ZXJhbC5jX3N0cigpLCBpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLmR1bXAoZmQsIDIsIHRydWUpOwotICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKaW5kZXggMzc5ZjdlNS4uYjI4MzgxYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0xODUsMTQgKzE4NSwyNyBAQAogICAgICAgICA8IS0tIEJsdWV0b290aCBBdWRpbyBIQUwgLS0+CiAgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9ImJsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KIAorICAgICAgICA8IS0tIE1TRCBBdWRpbyBIQUwgKG9wdGlvbmFsKSAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0ibXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIvPgorCiAgICAgPC9tb2R1bGVzPgogICAgIDwhLS0gRW5kIG9mIE1vZHVsZXMgc2VjdGlvbiAtLT4KIAotICAgIDwhLS0gVm9sdW1lIHNlY3Rpb24gLS0+CisgICAgPCEtLSBWb2x1bWUgc2VjdGlvbjoKKyAgICAgICAgSU1QT1JUQU5UIE5PVEU6IFZvbHVtZSB0YWJsZXMgaGF2ZSBiZWVuIG1vdmVkIHRvIGVuZ2luZSBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgS2VlcCBpdCBoZXJlIGZvciBsZWdhY3kuCisgICAgICAgICAgICAgICAgICAgICAgICBFbmdpbmUgd2lsbCBmYWxsYmFjayBvbiB0aGVzZSBmaWxlcyBpZiBub25lIGFyZSBwcm92aWRlZCBieSBlbmdpbmUuCisgICAgIC0tPgogCiAgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X3ZvbHVtZXMueG1sIi8+CiAgICAgPHhpOmluY2x1ZGUgaHJlZj0iZGVmYXVsdF92b2x1bWVfdGFibGVzLnhtbCIvPgogCiAgICAgPCEtLSBFbmQgb2YgVm9sdW1lIHNlY3Rpb24gLS0+CiAKKyAgICA8IS0tIFN1cnJvdW5kIFNvdW5kIGNvbmZpZ3VyYXRpb24gLS0+CisKKyAgICA8eGk6aW5jbHVkZSBocmVmPSJzdXJyb3VuZF9zb3VuZF9jb25maWd1cmF0aW9uXzVfMC54bWwiLz4KKworICAgIDwhLS0gRW5kIG9mIFN1cnJvdW5kIFNvdW5kIGNvbmZpZ3VyYXRpb24gLS0+CisKIDwvYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2JsdWV0b290aF9sZWdhY3lfaGFsLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9ibHVldG9vdGhfbGVnYWN5X2hhbC54bWwKaW5kZXggYTc1ZjFjYi4uYjRjYzFkMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2JsdWV0b290aF9sZWdhY3lfaGFsLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fYmx1ZXRvb3RoX2xlZ2FjeV9oYWwueG1sCkBAIC0xODUsMTQgKzE4NSwyNyBAQAogICAgICAgICA8IS0tIEhlYXJpbmcgYWlkIEF1ZGlvIEhBTCAtLT4KICAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0iaGVhcmluZ19haWRfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CiAKKyAgICAgICAgPCEtLSBNU0QgQXVkaW8gSEFMIChvcHRpb25hbCkgLS0+CisgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9Im1zZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KKwogICAgIDwvbW9kdWxlcz4KICAgICA8IS0tIEVuZCBvZiBNb2R1bGVzIHNlY3Rpb24gLS0+CiAKLSAgICA8IS0tIFZvbHVtZSBzZWN0aW9uIC0tPgorICAgIDwhLS0gVm9sdW1lIHNlY3Rpb246CisgICAgICAgIElNUE9SVEFOVCBOT1RFOiBWb2x1bWUgdGFibGVzIGhhdmUgYmVlbiBtb3ZlZCB0byBlbmdpbmUgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIEtlZXAgaXQgaGVyZSBmb3IgbGVnYWN5LgorICAgICAgICAgICAgICAgICAgICAgICAgRW5naW5lIHdpbGwgZmFsbGJhY2sgb24gdGhlc2UgZmlsZXMgaWYgbm9uZSBhcmUgcHJvdmlkZWQgYnkgZW5naW5lLgorICAgICAtLT4KIAogICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCIvPgogICAgIDx4aTppbmNsdWRlIGhyZWY9ImRlZmF1bHRfdm9sdW1lX3RhYmxlcy54bWwiLz4KIAogICAgIDwhLS0gRW5kIG9mIFZvbHVtZSBzZWN0aW9uIC0tPgogCisgICAgPCEtLSBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0ic3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIi8+CisKKyAgICA8IS0tIEVuZCBvZiBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCiA8L2F1ZGlvUG9saWN5Q29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9nZW5lcmljLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9nZW5lcmljLnhtbAppbmRleCA1ODc2OGMzLi45YWQ2MDlkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpYy54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2dlbmVyaWMueG1sCkBAIC0zMCwxMSArMzAsMjEgQEAKICAgICA8L21vZHVsZXM+CiAgICAgPCEtLSBFbmQgb2YgTW9kdWxlcyBzZWN0aW9uIC0tPgogCi0gICAgPCEtLSBWb2x1bWUgc2VjdGlvbiAtLT4KKyAgICA8IS0tIFZvbHVtZSBzZWN0aW9uOgorICAgICAgICBJTVBPUlRBTlQgTk9URTogVm9sdW1lIHRhYmxlcyBoYXZlIGJlZW4gbW92ZWQgdG8gZW5naW5lIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICBLZWVwIGl0IGhlcmUgZm9yIGxlZ2FjeS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEVuZ2luZSB3aWxsIGZhbGxiYWNrIG9uIHRoZXNlIGZpbGVzIGlmIG5vbmUgYXJlIHByb3ZpZGVkIGJ5IGVuZ2luZS4KKyAgICAgLS0+CiAKICAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfdm9sdW1lcy54bWwiLz4KICAgICA8eGk6aW5jbHVkZSBocmVmPSJkZWZhdWx0X3ZvbHVtZV90YWJsZXMueG1sIi8+CiAKICAgICA8IS0tIEVuZCBvZiBWb2x1bWUgc2VjdGlvbiAtLT4KIAorICAgIDwhLS0gU3Vycm91bmQgU291bmQgY29uZmlndXJhdGlvbiAtLT4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9InN1cnJvdW5kX3NvdW5kX2NvbmZpZ3VyYXRpb25fNV8wLnhtbCIvPgorCisgICAgPCEtLSBFbmQgb2YgU3Vycm91bmQgU291bmQgY29uZmlndXJhdGlvbiAtLT4KKwogPC9hdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpY190di54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpY190di54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYxY2EzMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9nZW5lcmljX3R2LnhtbApAQCAtMCwwICsxLDQ5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxhdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24gdmVyc2lvbj0iMS4wIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisgICAgPCEtLSB2ZXJzaW9uIHNlY3Rpb24gY29udGFpbnMgYSDigJx2ZXJzaW9u4oCdIHRhZyBpbiB0aGUgZm9ybSDigJxtYWpvci5taW5vcuKAnSBlLmcgdmVyc2lvbj3igJ0xLjDigJ0gLS0+CisKKyAgICA8IS0tIEdsb2JhbCBjb25maWd1cmF0aW9uIERlY2FsYXJhdGlvbiAtLT4KKyAgICA8Z2xvYmFsQ29uZmlndXJhdGlvbiBzcGVha2VyX2RyY19lbmFibGVkPSJmYWxzZSIvPgorCisgICAgPG1vZHVsZXM+CisgICAgICAgIDwhLS0gUHJpbWFyeSBBdWRpbyBIQUwgLS0+CisgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9InByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fdHYueG1sIi8+CisKKyAgICAgICAgPCEtLSBVc2IgQXVkaW8gSEFMIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJ1c2JfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CisKKyAgICAgICAgPCEtLSBSZW1vdGUgU3VibWl4IEF1ZGlvIEhBTCAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0icl9zdWJtaXhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CisKKyAgICA8L21vZHVsZXM+CisgICAgPCEtLSBFbmQgb2YgTW9kdWxlcyBzZWN0aW9uIC0tPgorCisgICAgPCEtLSBWb2x1bWUgc2VjdGlvbiAtLT4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImRlZmF1bHRfdm9sdW1lX3RhYmxlcy54bWwiLz4KKworICAgIDwhLS0gRW5kIG9mIFZvbHVtZSBzZWN0aW9uIC0tPgorCisgICAgPCEtLSBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0ic3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIi8+CisKKyAgICA8IS0tIEVuZCBvZiBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCis8L2F1ZGlvUG9saWN5Q29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9zdHViLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9zdHViLnhtbAppbmRleCAyNmMzODFmLi44MzUwZWI4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fc3R1Yi54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX3N0dWIueG1sCkBAIC0xNSw2ICsxNSw5IEBACiAtLT4KIAogPGF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgICA8IS0tIEdsb2JhbCBjb25maWd1cmF0aW9uIERlY2FsYXJhdGlvbiAtLT4KKyAgICA8Z2xvYmFsQ29uZmlndXJhdGlvbiBzcGVha2VyX2RyY19lbmFibGVkPSJmYWxzZSIvPgorCiAgICAgPG1vZHVsZXM+CiAgICAgICAgIDwhLS0gU3R1YiBBdWRpbyBIQUwgLS0+CiAgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9InN0dWJfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CkBAIC0yNiw1ICsyOSw2IEBACiAKICAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfdm9sdW1lcy54bWwiLz4KICAgICA8eGk6aW5jbHVkZSBocmVmPSJkZWZhdWx0X3ZvbHVtZV90YWJsZXMueG1sIi8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ic3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIi8+CiAKIDwvYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL21zZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjE3YmM2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL21zZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSw3OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3LTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBNdWx0aSBTdHJlYW0gRGVjb2RlciBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBmaWxlIC0tPgorPG1vZHVsZSBuYW1lPSJtc2QiIGhhbFZlcnNpb249IjIuMCI+CisgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgPGl0ZW0+TVMxMiBJbnB1dDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+TVMxMiBPdXRwdXQ8L2l0ZW0+CisgICAgPC9hdHRhY2hlZERldmljZXM+CisgICAgPG1peFBvcnRzPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJtczEyIGlucHV0IiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibXMxMiBjb21wcmVzc2VkIGlucHV0IiByb2xlPSJzb3VyY2UiCisgICAgICAgICAgICAgICAgZmxhZ3M9IkFVRElPX09VVFBVVF9GTEFHX0RJUkVDVHxBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEfEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORyI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDM19KT0MiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyxBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSxBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDNCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgICAgICA8IS0tIFRoZSBIVyBBViBTeW5jIGZsYWcgaXMgbm90IHJlcXVpcmVkLCBidXQgaXMgcmVjb21tZW5kZWQgLS0+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9Im1zMTIgb3V0cHV0IiByb2xlPSJzaW5rIiBmbGFncz0iQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMSIvPgorICAgICAgICA8L21peFBvcnQ+CisgICA8L21peFBvcnRzPgorICAgPGRldmljZVBvcnRzPgorICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9Ik1TMTIgSW5wdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQlVTIiAgcm9sZT0ic2luayI+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUMzIgorICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIi8+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfRV9BQzMiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDM19KT0MiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyxBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSxBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUM0IgorICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iTVMxMiBPdXRwdXQiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CVVMiICByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICA8L2RldmljZVBvcnRzPgorICAgIDxyb3V0ZXM+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Ik1TMTIgSW5wdXQiIHNvdXJjZXM9Im1zMTIgaW5wdXQsbXMxMiBjb21wcmVzc2VkIGlucHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Im1zMTIgb3V0cHV0IiBzb3VyY2VzPSJNUzEyIE91dHB1dCIvPgorICAgIDwvcm91dGVzPgorPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKaW5kZXggNWI3YWU3Zi4uZWVkYzk2YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtMSw1ICsxLDUgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIERlZmF1bHQgUHJpbWFyeSBBdWRpbyBIQUwgTW9kdWxlIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGluY2x1ZGUgZmxpZSAtLT4KKzwhLS0gRGVmYXVsdCBQcmltYXJ5IEF1ZGlvIEhBTCBNb2R1bGUgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gaW5jbHVkZSBmaWxlIC0tPgogPG1vZHVsZSBuYW1lPSJwcmltYXJ5IiBoYWxWZXJzaW9uPSIyLjAiPgogICAgIDxhdHRhY2hlZERldmljZXM+CiAgICAgICAgIDxpdGVtPlNwZWFrZXI8L2l0ZW0+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl90di54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl90di54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI2MDE1YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX3R2LnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBEZWZhdWx0IFByaW1hcnkgQXVkaW8gSEFMIE1vZHVsZSBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBpbmNsdWRlIGZpbGUgZm9yIFRWIC0tPgorPG1vZHVsZSBuYW1lPSJwcmltYXJ5IiBoYWxWZXJzaW9uPSIyLjAiPgorICAgIDxhdHRhY2hlZERldmljZXM+CisgICAgICAgIDxpdGVtPlNwZWFrZXI8L2l0ZW0+CisgICAgPC9hdHRhY2hlZERldmljZXM+CisgICAgPGRlZmF1bHRPdXRwdXREZXZpY2U+U3BlYWtlcjwvZGVmYXVsdE91dHB1dERldmljZT4KKyAgICA8bWl4UG9ydHM+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9InByaW1hcnkgb3V0cHV0IiByb2xlPSJzb3VyY2UiIGZsYWdzPSJBVURJT19PVVRQVVRfRkxBR19QUklNQVJZIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L21peFBvcnQ+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImRpcmVjdCIgcm9sZT0ic291cmNlIiBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIiAvPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJ0dW5uZWwiIHJvbGU9InNvdXJjZSIKKyAgICAgICAgICAgICAgICAgZmxhZ3M9IkFVRElPX09VVFBVVF9GTEFHX0RJUkVDVHxBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DIiAvPgorICAgPC9taXhQb3J0cz4KKyAgIDxkZXZpY2VQb3J0cz4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iU3BlYWtlciIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9TUEVBS0VSIiByb2xlPSJzaW5rIiAvPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJPdXQgQXV4IERpZ2l0YWwiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUwiIHJvbGU9InNpbmsiCisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRGb3JtYXRzPSJBVURJT19GT1JNQVRfQUMzIEFVRElPX0ZPUk1BVF9JRUM2MTkzNyIgLz4KKyAgICA8L2RldmljZVBvcnRzPgorICAgIDxyb3V0ZXM+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IlNwZWFrZXIiIHNvdXJjZXM9InByaW1hcnkgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Ik91dCBBdXggRGlnaXRhbCIgc291cmNlcz0icHJpbWFyeSBvdXRwdXQsZGlyZWN0LHR1bm5lbCIvPgorICAgIDwvcm91dGVzPgorPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvc3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3N1cnJvdW5kX3NvdW5kX2NvbmZpZ3VyYXRpb25fNV8wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTBhMTgxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3N1cnJvdW5kX3NvdW5kX2NvbmZpZ3VyYXRpb25fNV8wLnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8c3Vycm91bmRTb3VuZD4KKyAgPCEtLSBFYWNoIG9mIHRoZSBsaXN0ZWQgZm9ybWF0cyBnZXRzIGFuIGVudHJ5IGluIFN1cnJvdW5kIFNldHRpbmdzIGRpYWxvZyBvbiBUViBkZXZpY2VzLgorICAgICAgIFRoZXJlIG11c3QgYmUgYSBjb3JyZXNwb25kaW5nIEphdmEgRU5DT0RJTkdfLi4uIGNvbnRhbnQgZGVmaW5lZCBpbiBBdWRpb0Zvcm1hdC5qYXZhLAorICAgICAgIGFuZCBhIGRpc3BsYXkgbmFtZSBkZWZpbmVkIGluIEF1ZGlvRm9ybWF0LnRvRGlzcGxheU5hbWUuIEZvciB0aGUgZm9ybWF0cyB0aGF0IGRvbid0CisgICAgICAgbmVlZCBhIGRlZGljYXRlZCBTdXJyb25kIFNldHRpbmdzIGRpYWxvZyBlbnRyeSwgYSBzdWJmb3JtYXRzIGxpc3QgaGFzIHRvIGJlIHVzZWQuIC0tPgorICA8Zm9ybWF0cz4KKyAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9BQzMiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfRV9BQzMiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfRV9BQzNfSk9DIiAvPgorICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0RPTEJZX1RSVUVIRCIgLz4KKyAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9EVFMiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfRFRTX0hEIiAvPgorICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0FBQ19MQyIgc3ViZm9ybWF0cz0iQVVESU9fRk9STUFUX0FBQ19IRV9WMSBBVURJT19GT1JNQVRfQUFDX0hFX1YyIEFVRElPX0ZPUk1BVF9BQUNfRUxEIEFVRElPX0ZPUk1BVF9BQUNfWEhFIiAvPgorICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0FDNCIgLz4KKyAgPC9mb3JtYXRzPgorPC9zdXJyb3VuZFNvdW5kPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvQW5kcm9pZC5tawpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQubWsKcmVuYW1lIHRvIHNlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9BbmRyb2lkLm1rCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA3NzVhZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vQW5kcm9pZC5icApAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5ZW5naW5lX2NvbW1vbl9oZWFkZXJzIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeWVuZ2luZV9jb21tb24iLAorICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy9FbmdpbmVCYXNlLmNwcCIsCisgICAgICAgICJzcmMvUHJvZHVjdFN0cmF0ZWd5LmNwcCIsCisgICAgICAgICJzcmMvVm9sdW1lQ3VydmUuY3BwIiwKKyAgICAgICAgInNyYy9Wb2x1bWVHcm91cC5jcHAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeWNvbW1vbiIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZV9jb21tb25faGVhZGVycyIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZV9pbnRlcmZhY2VfaGVhZGVycyIsCisgICAgXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZV9jb21tb25faGVhZGVycyIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW9wb2xpY3ljb21wb25lbnRzIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lX2NvbmZpZyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9FbmdpbmVCYXNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvRW5naW5lQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZGM3OGYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvRW5naW5lQmFzZS5oCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxFbmdpbmVDb25maWcuaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxQcm9kdWN0U3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxWb2x1bWVHcm91cC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKKworY2xhc3MgRW5naW5lQmFzZSA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICAvLy8KKyAgICAvLy8gZnJvbSBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UKKyAgICAvLy8KKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBpbml0Q2hlY2soKSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpIG92ZXJyaWRlOworCisgICAgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtUGhvbmVTdGF0ZTsgfQorCisgICAgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3Qgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIHJldHVybiBtRm9yY2VVc2VbdXNhZ2VdOworICAgIH0KKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gLypkZXZEZXNjKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCAvKnN0YXRlKi8pIG92ZXJyaWRlCisgICAgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdCBvdmVycmlkZTsKKworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdCBvdmVycmlkZTsKKworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBnZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBTdHJlYW1UeXBlVmVjdG9yIGdldFN0cmVhbVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGdldEFsbEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdCBvdmVycmlkZTsKKworICAgIFN0cmF0ZWd5VmVjdG9yIGdldE9yZGVyZWRQcm9kdWN0U3RyYXRlZ2llcygpIGNvbnN0IG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpIGNvbnN0IG92ZXJyaWRlOworCisgICAgVm9sdW1lQ3VydmVzICpnZXRWb2x1bWVDdXJ2ZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBWb2x1bWVDdXJ2ZXMgKmdldFZvbHVtZUN1cnZlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0IG92ZXJyaWRlOworCisgICAgSVZvbHVtZUN1cnZlcyAqZ2V0Vm9sdW1lQ3VydmVzRm9yVm9sdW1lR3JvdXAodm9sdW1lX2dyb3VwX3QgZ3JvdXApIGNvbnN0IG92ZXJyaWRlCisgICAgeworICAgICAgIHJldHVybiBtVm9sdW1lR3JvdXBzLmZpbmQoZ3JvdXApICE9IGVuZChtVm9sdW1lR3JvdXBzKSA/CisgICAgICAgICAgICAgICAgICAgbVZvbHVtZUdyb3Vwcy5hdChncm91cCktPmdldFZvbHVtZUN1cnZlcygpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICBWb2x1bWVHcm91cFZlY3RvciBnZXRWb2x1bWVHcm91cHMoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZvbHVtZV9ncm91cF90IGdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdm9sdW1lX2dyb3VwX3QgZ2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdCBvdmVycmlkZTsKKworICAgIHN0YXR1c190IGxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Qgb3ZlcnJpZGU7CisKKworICAgIGVuZ2luZUNvbmZpZzo6UGFyc2luZ1Jlc3VsdCBsb2FkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWcoKTsKKworICAgIGNvbnN0IFByb2R1Y3RTdHJhdGVneU1hcCAmZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKSBjb25zdCB7IHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXM7IH0KKworICAgIFByb2R1Y3RTdHJhdGVneU1hcCAmZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKSB7IHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXM7IH0KKworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OworCisgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUJ5TmFtZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgY29uc3Q7CisKKyAgICBBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqZ2V0QXBtT2JzZXJ2ZXIoKSBjb25zdCB7IHJldHVybiBtQXBtT2JzZXJ2ZXI7IH0KKworICAgIGlubGluZSBib29sIGlzSW5DYWxsKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBpc19zdGF0ZV9pbl9jYWxsKGdldFBob25lU3RhdGUoKSk7CisgICAgfQorCisgICAgVm9sdW1lU291cmNlIHRvVm9sdW1lU291cmNlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFZvbHVtZVNvdXJjZT4oZ2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKHN0cmVhbSkpOworICAgIH0KKworICAgIHN0YXR1c190IHN3aXRjaFZvbHVtZUN1cnZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtU3JjLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbURzdCk7CisKKyAgICBzdGF0dXNfdCByZXN0b3JlT3JpZ2luVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworCisgcHJpdmF0ZToKKyAgICBBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqbUFwbU9ic2VydmVyID0gbnVsbHB0cjsKKworICAgIFByb2R1Y3RTdHJhdGVneU1hcCBtUHJvZHVjdFN0cmF0ZWdpZXM7CisgICAgVm9sdW1lR3JvdXBNYXAgbVZvbHVtZUdyb3VwczsKKyAgICBhdWRpb19tb2RlX3QgbVBob25lU3RhdGUgPSBBVURJT19NT0RFX05PUk1BTDsgIC8qKjwgY3VycmVudCBwaG9uZSBzdGF0ZS4gKi8KKworICAgIC8qKiBjdXJyZW50IGZvcmNlZCB1c2UgY29uZmlndXJhdGlvbi4gKi8KKyAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVF0gPSB7fTsKK307CisKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1Byb2R1Y3RTdHJhdGVneS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1Byb2R1Y3RTdHJhdGVneS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMmExOTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvUHJvZHVjdFN0cmF0ZWd5LmgKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlZvbHVtZUdyb3VwLmgiCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8SGFuZGxlR2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQGJyaWVmIFRoZSBQcm9kdWN0U3RyYXRlZ3kgY2xhc3MgZGVzY3JpYmVzIGZvciBlYWNoIHByb2R1Y3Rfc3RyYXRlZ3lfdCBpZGVudGlmaWVyIHRoZQorICogYXNzb2NpYXRlZCBhdWRpbyBhdHRyaWJ1dGVzLCB0aGUgZGV2aWNlIHR5cGVzIHRvIHVzZSwgdGhlIGRldmljZSBhZGRyZXNzIHRvIHVzZS4KKyAqIFRoZSBpZGVudGlmaWVyIGlzIHZvbHVudGFyaWx5IG5vdCBzdHJvbmdseSB0eXBlZCBpbiBvcmRlciB0byBiZSBleHRlbnNpYmxlIGJ5IE9FTS4KKyAqLworY2xhc3MgUHJvZHVjdFN0cmF0ZWd5IDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSwgcHJpdmF0ZSBIYW5kbGVHZW5lcmF0b3I8dWludDMyX3Q+Cit7Citwcml2YXRlOgorICAgIHN0cnVjdCBBdWRpb0F0dHJpYnV0ZXMgeworICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVDsKKyAgICAgICAgdm9sdW1lX2dyb3VwX3QgbVZvbHVtZUdyb3VwID0gVk9MVU1FX0dST1VQX05PTkU7CisgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBtQXR0cmlidXRlcyA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CisgICAgfTsKKworICAgIHVzaW5nIEF1ZGlvQXR0cmlidXRlc1ZlY3RvciA9IHN0ZDo6dmVjdG9yPEF1ZGlvQXR0cmlidXRlcz47CisKK3B1YmxpYzoKKyAgICBQcm9kdWN0U3RyYXRlZ3koY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpOworCisgICAgdm9pZCBhZGRBdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYXVkaW9BdHRyaWJ1dGVzKTsKKworICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OkF1ZGlvQXR0cmlidXRlcz4gbGlzdEF1ZGlvQXR0cmlidXRlcygpIGNvbnN0OworCisgICAgc3RkOjpzdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisgICAgQXR0cmlidXRlc1ZlY3RvciBnZXRBdWRpb0F0dHJpYnV0ZXMoKSBjb25zdDsKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtSWQ7IH0KKyAgICBTdHJlYW1UeXBlVmVjdG9yIGdldFN1cHBvcnRlZFN0cmVhbXMoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBtYXRjaGVzIGNoZWNrcyBpZiB0aGUgZ2l2ZW4gYXVkaW8gYXR0cmlidXRlcyBzaGFsbCBmb2xsb3cgdGhlIHN0cmF0ZWd5LgorICAgICAqICAgICAgICBPcmRlciBvZiB0aGUgYXR0cmlidXRlcyB3aXRoaW4gYSBzdHJhdGVneSBtYXR0ZXJzLgorICAgICAqICAgICAgICBJZiBvbmx5IHRoZSB1c2FnZSBpcyBhdmFpbGFibGUsIHRoZSBjaGVjayBpcyBwZXJmb3JtZWQgb24gdGhlIHVzYWdlcyBvZiB0aGUgZ2l2ZW4KKyAgICAgKiAgICAgICAgYXR0cmlidXRlcywgb3RoZXJ3aXNlIGFsbCBmaWVsZHMgbXVzdCBtYXRjaC4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyB0byBjb25zaWRlcgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhdHRyaWJ1dGVzIG1hdGNoZXMgd2l0aCB0aGUgc3RyYXRlZ3ksIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIG1hdGNoZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMpIGNvbnN0OworCisgICAgYm9vbCBzdXBwb3J0U3RyZWFtVHlwZShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW1UeXBlKSBjb25zdDsKKworICAgIHZvaWQgc2V0RGV2aWNlQWRkcmVzcyhjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcykKKyAgICB7CisgICAgICAgIG1EZXZpY2VBZGRyZXNzID0gYWRkcmVzczsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBnZXREZXZpY2VBZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gbURldmljZUFkZHJlc3M7IH0KKworICAgIHZvaWQgc2V0RGV2aWNlVHlwZXMoYXVkaW9fZGV2aWNlc190IGRldmljZXMpCisgICAgeworICAgICAgICBtQXBwbGljYWJsZURldmljZXMgPSBkZXZpY2VzOworICAgIH0KKworICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VUeXBlcygpIGNvbnN0IHsgcmV0dXJuIG1BcHBsaWNhYmxlRGV2aWNlczsgfQorCisgICAgYXVkaW9fYXR0cmlidXRlc190IGdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IGdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3Q7CisKKyAgICB2b2x1bWVfZ3JvdXBfdCBnZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdDsKKworICAgIHZvbHVtZV9ncm91cF90IGdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Q7CisKKyAgICB2b2x1bWVfZ3JvdXBfdCBnZXREZWZhdWx0Vm9sdW1lR3JvdXAoKSBjb25zdDsKKworICAgIGJvb2wgaXNEZWZhdWx0KCkgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgbU5hbWU7CisKKyAgICBBdWRpb0F0dHJpYnV0ZXNWZWN0b3IgbUF0dHJpYnV0ZXNWZWN0b3I7CisKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgbUlkOworCisgICAgc3RkOjpzdHJpbmcgbURldmljZUFkZHJlc3M7IC8qKjwgRGV2aWNlIGFkZHJlc3MgYXBwbGljYWJsZSBmb3IgdGhpcyBzdHJhdGVneSwgbWF5YmUgZW1wdHkgKi8KKworICAgIC8qKgorICAgICAqIEFwcGxpY2FibGUgZGV2aWNlKHMpIHR5cGUgbWFzayBmb3IgdGhpcyBzdHJhdGVneS4KKyAgICAgKi8KKyAgICBhdWRpb19kZXZpY2VzX3QgbUFwcGxpY2FibGVEZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7Cit9OworCitjbGFzcyBQcm9kdWN0U3RyYXRlZ3lNYXAgOiBwdWJsaWMgc3RkOjptYXA8cHJvZHVjdF9zdHJhdGVneV90LCBzcDxQcm9kdWN0U3RyYXRlZ3k+ID4KK3sKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgaW5pdGlhbGl6ZTogc2V0IGRlZmF1bHQgcHJvZHVjdCBzdHJhdGVneSBpbiBjYWNoZS4KKyAgICAgKi8KKyAgICB2b2lkIGluaXRpYWxpemUoKTsKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlLiBUaGUgb3JkZXIgb2YgdGhlIHZlY3RvciBpcyBkaW1lbnNpb25uaW5nLgorICAgICAqIEBwYXJhbSBhdHRyCisgICAgICogQHJldHVybiBhcHBsaWNhYmxlIHByb2R1Y3Qgc3RyYXRlZ3kgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUsIGRlZmF1bHQgaWYgbm9uZSBhcHBsaWNhYmxlLgorICAgICAqLworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3Q7CisKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKKworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBnZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Q7CisKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IGdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0QXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneSBjYW4gYmUgY2FsbGVkIGZyb20KKyAgICAgKiAgICAgICAgQXVkaW9NYW5hZ2VyOiBpbiB0aGlzIGNhc2UsIHRoZSBwcm9kdWN0IHN0cmF0ZWd5IElTIHRoZSBmb3JtZXIgcm91dGluZyBzdHJhdGVneQorICAgICAqICAgICAgICBDYXJBdWRpb01hbmFnZXI6IGluIHRoaXMgY2FzZSwgdGhlIHByb2R1Y3Qgc3RyYXRlZ3kgSVMgdGhlIGNhciB1c2FnZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFtnZXRBdWRpb0F0dHJpYnV0ZXNGb3JDYXJVc2FnZV0KKyAgICAgKiAgICAgICAgT2VtRXh0ZW5zaW9uOiBpbiB0aGlzIGNhc2UsIHRoZSBwcm9kdWN0IHN0cmF0ZWd5IElTIHRoZSBPZW0gdXNhZ2UKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJhdGVneQorICAgICAqIEByZXR1cm4gYXVkaW8gYXR0cmlidXRlcyAob3IgYXQgbGVhc3Qgb25lIG9mIHRoZSBhdHRyaWJ1dGVzKSBmb2xsb3dpbmcgdGhlIGdpdmVuIHN0cmF0ZWd5LgorICAgICAqLworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBnZXRBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgY29uc3Q7CisKKyAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBjb25zdDsKKworICAgIHN0ZDo6c3RyaW5nIGdldERldmljZUFkZHJlc3NGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBjb25zdDsKKworICAgIHZvbHVtZV9ncm91cF90IGdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0OworCisgICAgdm9sdW1lX2dyb3VwX3QgZ2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKKworICAgIHZvbHVtZV9ncm91cF90IGdldERlZmF1bHRWb2x1bWVHcm91cCgpIGNvbnN0OworCisgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldERlZmF1bHQoKSBjb25zdDsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgbURlZmF1bHRTdHJhdGVneSA9IFBST0RVQ1RfU1RSQVRFR1lfTk9ORTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1ZvbHVtZUN1cnZlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQzMTRlMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJJVm9sdW1lQ3VydmVzLmgiCisjaW5jbHVkZSA8cG9saWN5Lmg+CisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPEhhbmRsZUdlbmVyYXRvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEN1cnZlUG9pbnQKK3sKKyAgICBDdXJ2ZVBvaW50KCkge30KKyAgICBDdXJ2ZVBvaW50KGludCBpbmRleCwgaW50IGF0dGVudWF0aW9uSW5NYikgOgorICAgICAgICBtSW5kZXgoaW5kZXgpLCBtQXR0ZW51YXRpb25Jbk1iKGF0dGVudWF0aW9uSW5NYikge30KKyAgICB1aW50MzJfdCBtSW5kZXg7CisgICAgaW50IG1BdHRlbnVhdGlvbkluTWI7Cit9OworCitpbmxpbmUgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IEN1cnZlUG9pbnQgJmxocywgY29uc3QgQ3VydmVQb2ludCAmcmhzKQoreworICAgIHJldHVybiBsaHMubUluZGV4IDwgcmhzLm1JbmRleDsKK30KKworLy8gQSB2b2x1bWUgY3VydmUgZm9yIGEgZ2l2ZW4gdXNlIGNhc2UgYW5kIGRldmljZSBjYXRlZ29yeQorLy8gSXQgY29udGFpbnMgb2YgbGlzdCBvZiBwb2ludHMgb2YgdGhpcyBjdXJ2ZSBleHByZXNzaW5nIHRoZSBhdHRlbnVhdGlvbiBpbiBNaWxsaWJlbHMgZm9yCisvLyBhIGdpdmVuIHZvbHVtZSBpbmRleCBmcm9tIDAgdG8gMTAwCitjbGFzcyBWb2x1bWVDdXJ2ZSA6IHB1YmxpYyBSZWZCYXNlCit7CitwdWJsaWM6CisgICAgVm9sdW1lQ3VydmUoZGV2aWNlX2NhdGVnb3J5IGRldmljZSkgOiBtRGV2aWNlQ2F0ZWdvcnkoZGV2aWNlKSB7fQorCisgICAgdm9pZCBhZGQoY29uc3QgQ3VydmVQb2ludCAmcG9pbnQpIHsgbUN1cnZlUG9pbnRzLmFkZChwb2ludCk7IH0KKworICAgIGZsb2F0IHZvbEluZGV4VG9EYihpbnQgaW5kZXhJblVpLCBpbnQgdm9sSW5kZXhNaW4sIGludCB2b2xJbmRleE1heCkgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCwgYm9vbCBjdXJ2ZVBvaW50cyA9IGZhbHNlKSBjb25zdDsKKworICAgIGRldmljZV9jYXRlZ29yeSBnZXREZXZpY2VDYXRlZ29yeSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VDYXRlZ29yeTsgfQorCitwcml2YXRlOgorICAgIGNvbnN0IGRldmljZV9jYXRlZ29yeSBtRGV2aWNlQ2F0ZWdvcnk7CisgICAgU29ydGVkVmVjdG9yPEN1cnZlUG9pbnQ+IG1DdXJ2ZVBvaW50czsKK307CisKKy8vIFZvbHVtZSBDdXJ2ZXMgZm9yIGEgZ2l2ZW4gdXNlIGNhc2UgaW5kZXhlZCBieSBkZXZpY2UgY2F0ZWdvcnkKK2NsYXNzIFZvbHVtZUN1cnZlcyA6IHB1YmxpYyBLZXllZFZlY3RvcjxkZXZpY2VfY2F0ZWdvcnksIHNwPFZvbHVtZUN1cnZlPiA+LAorICAgICAgICAgICAgICAgICAgICAgcHVibGljIElWb2x1bWVDdXJ2ZXMKK3sKK3B1YmxpYzoKKyAgICBWb2x1bWVDdXJ2ZXMoaW50IGluZGV4TWluID0gMCwgaW50IGluZGV4TWF4ID0gMTAwKSA6CisgICAgICAgIG1JbmRleE1pbihpbmRleE1pbiksIG1JbmRleE1heChpbmRleE1heCkKKyAgICB7CisgICAgICAgIGFkZEN1cnJlbnRWb2x1bWVJbmRleChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSwgMCk7CisgICAgfQorICAgIHN0YXR1c190IGluaXRWb2x1bWUoaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpIG92ZXJyaWRlCisgICAgeworICAgICAgICBtSW5kZXhNaW4gPSBpbmRleE1pbjsKKyAgICAgICAgbUluZGV4TWF4ID0gaW5kZXhNYXg7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBzcDxWb2x1bWVDdXJ2ZT4gZ2V0Q3VydmVzRm9yKGRldmljZV9jYXRlZ29yeSBkZXZpY2UpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoaW5kZXhPZktleShkZXZpY2UpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlRm9yKGRldmljZSk7CisgICAgfQorCisgICAgdmlydHVhbCBpbnQgZ2V0Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKKyAgICB7CisgICAgICAgIGRldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7CisgICAgICAgIC8vIHRoZXJlIGlzIGFsd2F5cyBhIHZhbGlkIGVudHJ5IGZvciBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRQorICAgICAgICBpZiAobUluZGV4Q3VyLmZpbmQoZGV2aWNlKSA9PSBlbmQobUluZGV4Q3VyKSkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1JbmRleEN1ci5hdChkZXZpY2UpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBjYW5CZU11dGVkKCkgY29uc3QgeyByZXR1cm4gbUNhbkJlTXV0ZWQ7IH0KKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoKSB7IG1JbmRleEN1ci5jbGVhcigpOyB9CisgICAgdm9pZCBhZGRDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGluZGV4KSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgbUluZGV4Q3VyW2RldmljZV0gPSBpbmRleDsKKyAgICB9CisKKyAgICBpbnQgZ2V0Vm9sdW1lSW5kZXhNaW4oKSBjb25zdCB7IHJldHVybiBtSW5kZXhNaW47IH0KKworICAgIGludCBnZXRWb2x1bWVJbmRleE1heCgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleE1heDsgfQorCisgICAgYm9vbCBoYXNWb2x1bWVJbmRleEZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAorICAgIHsKKyAgICAgICAgZGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIG1JbmRleEN1ci5maW5kKGRldmljZSkgIT0gZW5kKG1JbmRleEN1cik7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3dpdGNoQ3VydmVzRnJvbShjb25zdCBWb2x1bWVDdXJ2ZXMgJnJlZmVyZW5jZUN1cnZlcykKKyAgICB7CisgICAgICAgIGlmIChzaXplKCkgIT0gcmVmZXJlbmNlQ3VydmVzLnNpemUoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzISBkZXZpY2UgY2F0ZWdvcnkgbm90IGFsaWduZWQsIGNhbm5vdCBzd2l0Y2giLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBzaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGRldmljZV9jYXRlZ29yeSBjYXQgPSBrZXlBdChpbmRleCk7CisgICAgICAgICAgICBzZXRWb2x1bWVDdXJ2ZShjYXQsIHJlZmVyZW5jZUN1cnZlcy5nZXRPcmlnaW5Wb2x1bWVDdXJ2ZShjYXQpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIHN0YXR1c190IHJlc3RvcmVPcmlnaW5Wb2x1bWVDdXJ2ZSgpCisgICAgeworICAgICAgICByZXR1cm4gc3dpdGNoQ3VydmVzRnJvbSgqdGhpcyk7CisgICAgfQorCisgICAgY29uc3Qgc3A8Vm9sdW1lQ3VydmU+IGdldE9yaWdpblZvbHVtZUN1cnZlKGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSkgY29uc3QKKyAgICB7CisgICAgICAgIEFMT0dfQVNTRVJUKG1PcmlnaW5Wb2x1bWVDdXJ2ZXMuaW5kZXhPZktleShkZXZpY2VDYXRlZ29yeSkgPj0gMCwgIkludmFsaWQgZGV2aWNlIGNhdGVnb3J5Iik7CisgICAgICAgIHJldHVybiBtT3JpZ2luVm9sdW1lQ3VydmVzLnZhbHVlRm9yKGRldmljZUNhdGVnb3J5KTsKKyAgICB9CisgICAgdm9pZCBzZXRWb2x1bWVDdXJ2ZShkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksIGNvbnN0IHNwPFZvbHVtZUN1cnZlPiAmdm9sdW1lQ3VydmUpCisgICAgeworICAgICAgICBBTE9HX0FTU0VSVChpbmRleE9mS2V5KGRldmljZUNhdGVnb3J5KSA+PSAwLCAiSW52YWxpZCBkZXZpY2UgY2F0ZWdvcnkgZm9yIFZvbHVtZSBDdXJ2ZSIpOworICAgICAgICByZXBsYWNlVmFsdWVGb3IoZGV2aWNlQ2F0ZWdvcnksIHZvbHVtZUN1cnZlKTsKKyAgICB9CisKKyAgICBzc2l6ZV90IGFkZChjb25zdCBzcDxWb2x1bWVDdXJ2ZT4gJnZvbHVtZUN1cnZlKQorICAgIHsKKyAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5ID0gdm9sdW1lQ3VydmUtPmdldERldmljZUNhdGVnb3J5KCk7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGRldmljZUNhdGVnb3J5KTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgLy8gS2VlcCB0cmFjayBvZiBvcmlnaW5hbCBWb2x1bWUgQ3VydmVzIHBlciBkZXZpY2UgY2F0ZWdvcnkgaW4gb3JkZXIgdG8gc3dpdGNoIGN1cnZlcy4KKyAgICAgICAgICAgIG1PcmlnaW5Wb2x1bWVDdXJ2ZXMuYWRkKGRldmljZUNhdGVnb3J5LCB2b2x1bWVDdXJ2ZSk7CisgICAgICAgICAgICByZXR1cm4gS2V5ZWRWZWN0b3I6OmFkZChkZXZpY2VDYXRlZ29yeSwgdm9sdW1lQ3VydmUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGZsb2F0IHZvbEluZGV4VG9EYihkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0LCBpbnQgaW5kZXhJblVpKSBjb25zdAorICAgIHsKKyAgICAgICAgc3A8Vm9sdW1lQ3VydmU+IHZjID0gZ2V0Q3VydmVzRm9yKGRldmljZUNhdCk7CisgICAgICAgIGlmICh2YyAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gdmMtPnZvbEluZGV4VG9EYihpbmRleEluVWksIG1JbmRleE1pbiwgbUluZGV4TWF4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGRldmljZSBjYXRlZ29yeSAlZCBmb3IgVm9sdW1lIEN1cnZlIiwgZGV2aWNlQ2F0KTsKKyAgICAgICAgICAgIHJldHVybiAwLjBmOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgYWRkQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpCisgICAgeworICAgICAgICBtQXR0cmlidXRlcy5wdXNoX2JhY2soYXR0cik7CisgICAgfQorICAgIEF0dHJpYnV0ZXNWZWN0b3IgZ2V0QXR0cmlidXRlcygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1BdHRyaWJ1dGVzOyB9CisgICAgdm9pZCBhZGRTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQorICAgIHsKKyAgICAgICAgbVN0cmVhbXMucHVzaF9iYWNrKHN0cmVhbSk7CisgICAgfQorICAgIFN0cmVhbVR5cGVWZWN0b3IgZ2V0U3RyZWFtVHlwZXMoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtU3RyZWFtczsgfQorCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcyA9IDAsIGJvb2wgY3VydmVQb2ludHMgPSBmYWxzZSkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgS2V5ZWRWZWN0b3I8ZGV2aWNlX2NhdGVnb3J5LCBzcDxWb2x1bWVDdXJ2ZT4gPiBtT3JpZ2luVm9sdW1lQ3VydmVzOworICAgIHN0ZDo6bWFwPGF1ZGlvX2RldmljZXNfdCwgaW50PiBtSW5kZXhDdXI7IC8qKjwgY3VycmVudCB2b2x1bWUgaW5kZXggcGVyIGRldmljZS4gKi8KKyAgICBpbnQgbUluZGV4TWluOyAvKio8IG1pbiB2b2x1bWUgaW5kZXguICovCisgICAgaW50IG1JbmRleE1heDsgLyoqPCBtYXggdm9sdW1lIGluZGV4LiAqLworICAgIGNvbnN0IGJvb2wgbUNhbkJlTXV0ZWQgPSB0cnVlOyAvKio8IHRydWUgaXMgdGhlIHN0cmVhbSBjYW4gYmUgbXV0ZWQuICovCisKKyAgICBBdHRyaWJ1dGVzVmVjdG9yIG1BdHRyaWJ1dGVzOworICAgIFN0cmVhbVR5cGVWZWN0b3IgbVN0cmVhbXM7IC8qKjwgS2VlcCBpdCBmb3IgbGVnYWN5LiAqLworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1ZvbHVtZUdyb3VwLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvVm9sdW1lR3JvdXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzRiNDA2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1ZvbHVtZUdyb3VwLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Vm9sdW1lQ3VydmUuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8SGFuZGxlR2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgVm9sdW1lR3JvdXAgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlLCBwcml2YXRlIEhhbmRsZUdlbmVyYXRvcjx1aW50MzJfdD4KK3sKK3B1YmxpYzoKKyAgICBWb2x1bWVHcm91cChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpOworICAgIHN0ZDo6c3RyaW5nIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorICAgIHZvbHVtZV9ncm91cF90IGdldElkKCkgY29uc3QgeyByZXR1cm4gbUlkOyB9CisKKyAgICB2b2lkIGFkZChjb25zdCBzcDxWb2x1bWVDdXJ2ZT4gJmN1cnZlKTsKKworICAgIFZvbHVtZUN1cnZlcyAqZ2V0Vm9sdW1lQ3VydmVzKCkgeyByZXR1cm4gJm1Hcm91cFZvbHVtZUN1cnZlczsgfQorCisgICAgdm9pZCBhZGRTdXBwb3J0ZWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cik7CisgICAgQXR0cmlidXRlc1ZlY3RvciBnZXRTdXBwb3J0ZWRBdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gbUdyb3VwVm9sdW1lQ3VydmVzLmdldEF0dHJpYnV0ZXMoKTsgfQorCisgICAgdm9pZCBhZGRTdXBwb3J0ZWRTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgIFN0cmVhbVR5cGVWZWN0b3IgZ2V0U3RyZWFtVHlwZXMoKSBjb25zdCB7IHJldHVybiBtR3JvdXBWb2x1bWVDdXJ2ZXMuZ2V0U3RyZWFtVHlwZXMoKTsgfQorCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcyA9IDApIGNvbnN0OworCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1OYW1lOworICAgIGNvbnN0IHZvbHVtZV9ncm91cF90IG1JZDsKKyAgICBWb2x1bWVDdXJ2ZXMgbUdyb3VwVm9sdW1lQ3VydmVzOworfTsKKworY2xhc3MgVm9sdW1lR3JvdXBNYXAgOiBwdWJsaWMgc3RkOjptYXA8dm9sdW1lX2dyb3VwX3QsIHNwPFZvbHVtZUdyb3VwPiA+Cit7CitwdWJsaWM6CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcyA9IDApIGNvbnN0OworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lQmFzZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2E3ZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lQmFzZS5jcHAKQEAgLTAsMCArMSwyODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb2xpY3lFbmdpbmUvQmFzZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkVuZ2luZUJhc2UuaCIKKyNpbmNsdWRlICJFbmdpbmVEZWZhdWx0Q29uZmlnLmgiCisjaW5jbHVkZSA8VHlwZUNvbnZlcnRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKKwordm9pZCBFbmdpbmVCYXNlOjpzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpCit7CisgICAgQUxPR19BU1NFUlQob2JzZXJ2ZXIgIT0gTlVMTCwgIkludmFsaWQgQXVkaW8gUG9saWN5IE1hbmFnZXIgb2JzZXJ2ZXIiKTsKKyAgICBtQXBtT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKK30KKworc3RhdHVzX3QgRW5naW5lQmFzZTo6aW5pdENoZWNrKCkKK3sKKyAgICByZXR1cm4gKG1BcG1PYnNlcnZlciAhPSBudWxscHRyKT8gTk9fRVJST1IgOiBOT19JTklUOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKK3sKKyAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIHN0YXRlICVkIiwgc3RhdGUpOworCisgICAgaWYgKHN0YXRlIDwgMCB8fCBzdGF0ZSA+PSBBVURJT19NT0RFX0NOVCkgeworICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIGludmFsaWQgc3RhdGUgJWQiLCBzdGF0ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKHN0YXRlID09IG1QaG9uZVN0YXRlICkgeworICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIHNldHRpbmcgc2FtZSBzdGF0ZSAlZCIsIHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBzdG9yZSBwcmV2aW91cyBwaG9uZSBzdGF0ZSBmb3IgbWFuYWdlbWVudCBvZiBzb25pZmljYXRpb24gc3RyYXRlZ3kgYmVsb3cKKyAgICBpbnQgb2xkU3RhdGUgPSBtUGhvbmVTdGF0ZTsKKyAgICBtUGhvbmVTdGF0ZSA9IHN0YXRlOworCisgICAgaWYgKCFpc19zdGF0ZV9pbl9jYWxsKG9sZFN0YXRlKSAmJiBpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKSkgeworICAgICAgICBBTE9HVigiICBFbnRlcmluZyBjYWxsIGluIHNldFBob25lU3RhdGUoKSIpOworICAgICAgICBzd2l0Y2hWb2x1bWVDdXJ2ZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgQVVESU9fU1RSRUFNX0RUTUYpOworICAgIH0gZWxzZSBpZiAoaXNfc3RhdGVfaW5fY2FsbChvbGRTdGF0ZSkgJiYgIWlzX3N0YXRlX2luX2NhbGwoc3RhdGUpKSB7CisgICAgICAgIEFMT0dWKCIgIEV4aXRpbmcgY2FsbCBpbiBzZXRQaG9uZVN0YXRlKCkiKTsKKyAgICAgICAgcmVzdG9yZU9yaWdpblZvbHVtZUN1cnZlKEFVRElPX1NUUkVBTV9EVE1GKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitwcm9kdWN0X3N0cmF0ZWd5X3QgRW5naW5lQmFzZTo6Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Qcm9kdWN0U3RyYXRlZ2llcy5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGF0dHIpOworfQorCithdWRpb19zdHJlYW1fdHlwZV90IEVuZ2luZUJhc2U6OmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QKK3sKKyAgICByZXR1cm4gbVByb2R1Y3RTdHJhdGVnaWVzLmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKGF0dHIpOworfQorCithdWRpb19hdHRyaWJ1dGVzX3QgRW5naW5lQmFzZTo6Z2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Qcm9kdWN0U3RyYXRlZ2llcy5nZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShzdHJlYW0pOworfQorCitwcm9kdWN0X3N0cmF0ZWd5X3QgRW5naW5lQmFzZTo6Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXMuZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7Cit9CisKK3Byb2R1Y3Rfc3RyYXRlZ3lfdCBFbmdpbmVCYXNlOjpnZXRQcm9kdWN0U3RyYXRlZ3lCeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVByb2R1Y3RTdHJhdGVnaWVzKSB7CisgICAgICAgIGlmIChpdGVyLnNlY29uZC0+Z2V0TmFtZSgpID09IG5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVyLnNlY29uZC0+Z2V0SWQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUFJPRFVDVF9TVFJBVEVHWV9OT05FOworfQorCitlbmdpbmVDb25maWc6OlBhcnNpbmdSZXN1bHQgRW5naW5lQmFzZTo6bG9hZEF1ZGlvUG9saWN5RW5naW5lQ29uZmlnKCkKK3sKKyAgICBhdXRvIGxvYWRQcm9kdWN0U3RyYXRlZ2llcyA9CisgICAgICAgICAgICBbXShhdXRvJiBzdHJhdGVneUNvbmZpZ3MsIGF1dG8mIHByb2R1Y3RTdHJhdGVnaWVzLCBhdXRvJiB2b2x1bWVHcm91cHMpIHsKKyAgICAgICAgZm9yIChhdXRvJiBzdHJhdGVneUNvbmZpZyA6IHN0cmF0ZWd5Q29uZmlncykgeworICAgICAgICAgICAgc3A8UHJvZHVjdFN0cmF0ZWd5PiBzdHJhdGVneSA9IG5ldyBQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3lDb25maWcubmFtZSk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmdyb3VwIDogc3RyYXRlZ3lDb25maWcuYXR0cmlidXRlc0dyb3VwcykgeworICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gJml0ZXIgPSBzdGQ6OmZpbmRfaWYoYmVnaW4odm9sdW1lR3JvdXBzKSwgZW5kKHZvbHVtZUdyb3VwcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmZ3JvdXBdKGNvbnN0IGF1dG8gJnZvbHVtZUdyb3VwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXAudm9sdW1lR3JvdXAgPT0gdm9sdW1lR3JvdXAuc2Vjb25kLT5nZXROYW1lKCk7IH0pOworICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGl0ZXIgIT0gZW5kKHZvbHVtZUdyb3VwcyksICJJbnZhbGlkIFZvbHVtZSBHcm91cCBOYW1lICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cC52b2x1bWVHcm91cC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBpZiAoZ3JvdXAuc3RyZWFtICE9IEFVRElPX1NUUkVBTV9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgICAgIGl0ZXItPnNlY29uZC0+YWRkU3VwcG9ydGVkU3RyZWFtKGdyb3VwLnN0cmVhbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmYXR0ciA6IGdyb3VwLmF0dHJpYnV0ZXNWZWN0KSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5LT5hZGRBdHRyaWJ1dGVzKHtncm91cC5zdHJlYW0sIGl0ZXItPnNlY29uZC0+Z2V0SWQoKSwgYXR0cn0pOworICAgICAgICAgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPmFkZFN1cHBvcnRlZEF0dHJpYnV0ZXMoYXR0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5SWQgPSBzdHJhdGVneS0+Z2V0SWQoKTsKKyAgICAgICAgICAgIHByb2R1Y3RTdHJhdGVnaWVzW3N0cmF0ZWd5SWRdID0gc3RyYXRlZ3k7CisgICAgICAgIH0KKyAgICB9OworICAgIGF1dG8gbG9hZFZvbHVtZUdyb3VwcyA9IFtdKGF1dG8gJnZvbHVtZUNvbmZpZ3MsIGF1dG8gJnZvbHVtZUdyb3VwcykgeworICAgICAgICBmb3IgKGF1dG8gJnZvbHVtZUNvbmZpZyA6IHZvbHVtZUNvbmZpZ3MpIHsKKyAgICAgICAgICAgIHNwPFZvbHVtZUdyb3VwPiB2b2x1bWVHcm91cCA9IG5ldyBWb2x1bWVHcm91cCh2b2x1bWVDb25maWcubmFtZSwgdm9sdW1lQ29uZmlnLmluZGV4TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZUNvbmZpZy5pbmRleE1heCk7CisgICAgICAgICAgICB2b2x1bWVHcm91cHNbdm9sdW1lR3JvdXAtPmdldElkKCldID0gdm9sdW1lR3JvdXA7CisKKyAgICAgICAgICAgIGZvciAoYXV0byAmY29uZmlnQ3VydmUgOiB2b2x1bWVDb25maWcudm9sdW1lQ3VydmVzKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdCA9IERFVklDRV9DQVRFR09SWV9TUEVBS0VSOworICAgICAgICAgICAgICAgIGlmICghRGV2aWNlQ2F0ZWdvcnlDb252ZXJ0ZXI6OmZyb21TdHJpbmcoY29uZmlnQ3VydmUuZGV2aWNlQ2F0ZWdvcnksIGRldmljZUNhdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkICVzIiwgX19GVU5DVElPTl9fLCBjb25maWdDdXJ2ZS5kZXZpY2VDYXRlZ29yeS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNwPFZvbHVtZUN1cnZlPiBjdXJ2ZSA9IG5ldyBWb2x1bWVDdXJ2ZShkZXZpY2VDYXQpOworICAgICAgICAgICAgICAgIGZvciAoYXV0byAmcG9pbnQgOiBjb25maWdDdXJ2ZS5jdXJ2ZVBvaW50cykgeworICAgICAgICAgICAgICAgICAgICBjdXJ2ZS0+YWRkKHtwb2ludC5pbmRleCwgcG9pbnQuYXR0ZW51YXRpb25Jbk1ifSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZvbHVtZUdyb3VwLT5hZGQoY3VydmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICBhdXRvIHJlc3VsdCA9IGVuZ2luZUNvbmZpZzo6cGFyc2UoKTsKKyAgICBpZiAocmVzdWx0LnBhcnNlZENvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlczogTm8gY29uZmlndXJhdGlvbiBmb3VuZCwgdXNpbmcgZGVmYXVsdCBtYXRjaGluZyBwaG9uZSBleHBlcmllbmNlLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGVuZ2luZUNvbmZpZzo6Q29uZmlnIGNvbmZpZyA9IGdEZWZhdWx0RW5naW5lQ29uZmlnOworICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCByZXQgPSBlbmdpbmVDb25maWc6OnBhcnNlTGVnYWN5Vm9sdW1lcyhjb25maWcudm9sdW1lR3JvdXBzKTsKKyAgICAgICAgcmVzdWx0ID0ge3N0ZDo6bWFrZV91bmlxdWU8ZW5naW5lQ29uZmlnOjpDb25maWc+KGNvbmZpZyksCisgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KHJldCA9PSBOT19FUlJPUiA/IDAgOiAxKX07CisgICAgfQorICAgIEFMT0dFX0lGKHJlc3VsdC5uYlNraXBwZWRFbGVtZW50ICE9IDAsICJza2lwcGVkICV6dSBlbGVtZW50cyIsIHJlc3VsdC5uYlNraXBwZWRFbGVtZW50KTsKKyAgICBsb2FkVm9sdW1lR3JvdXBzKHJlc3VsdC5wYXJzZWRDb25maWctPnZvbHVtZUdyb3VwcywgbVZvbHVtZUdyb3Vwcyk7CisgICAgbG9hZFByb2R1Y3RTdHJhdGVnaWVzKHJlc3VsdC5wYXJzZWRDb25maWctPnByb2R1Y3RTdHJhdGVnaWVzLCBtUHJvZHVjdFN0cmF0ZWdpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cHMpOworICAgIG1Qcm9kdWN0U3RyYXRlZ2llcy5pbml0aWFsaXplKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworU3RyYXRlZ3lWZWN0b3IgRW5naW5lQmFzZTo6Z2V0T3JkZXJlZFByb2R1Y3RTdHJhdGVnaWVzKCkgY29uc3QKK3sKKyAgICBhdXRvIGZpbmRCeUZsYWcgPSBbXShjb25zdCBhdXRvICZwcm9kdWN0U3RyYXRlZ2llcywgYXV0byBmbGFnKSB7CisgICAgICAgIHJldHVybiBzdGQ6OmZpbmRfaWYoYmVnaW4ocHJvZHVjdFN0cmF0ZWdpZXMpLCBlbmQocHJvZHVjdFN0cmF0ZWdpZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXShjb25zdCBhdXRvICZzdHJhdGVneSkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZhdHRyaWJ1dGVzIDogc3RyYXRlZ3kuc2Vjb25kLT5nZXRBdWRpb0F0dHJpYnV0ZXMoKSkgeworICAgICAgICAgICAgICAgIGlmICgoYXR0cmlidXRlcy5mbGFncyAmIGZsYWcpID09IGZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9KTsKKyAgICB9OworICAgIGF1dG8gc3RyYXRlZ2llcyA9IG1Qcm9kdWN0U3RyYXRlZ2llczsKKyAgICBhdXRvIGVuZm9yY2VkQXVkaWJsZVN0cmF0ZWd5SXRlciA9IGZpbmRCeUZsYWcoc3RyYXRlZ2llcywgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKTsKKworICAgIGlmIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCAmJgorICAgICAgICAgICAgZW5mb3JjZWRBdWRpYmxlU3RyYXRlZ3lJdGVyICE9IHN0cmF0ZWdpZXMuZW5kKCkpIHsKKyAgICAgICAgYXV0byBlbmZvcmNlZEF1ZGlibGVTdHJhdGVneSA9ICplbmZvcmNlZEF1ZGlibGVTdHJhdGVneUl0ZXI7CisgICAgICAgIHN0cmF0ZWdpZXMuZXJhc2UoZW5mb3JjZWRBdWRpYmxlU3RyYXRlZ3lJdGVyKTsKKyAgICAgICAgc3RyYXRlZ2llcy5pbnNlcnQoYmVnaW4oc3RyYXRlZ2llcyksIGVuZm9yY2VkQXVkaWJsZVN0cmF0ZWd5KTsKKyAgICB9CisgICAgU3RyYXRlZ3lWZWN0b3Igb3JkZXJlZFN0cmF0ZWdpZXM7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogc3RyYXRlZ2llcykgeworICAgICAgICBvcmRlcmVkU3RyYXRlZ2llcy5wdXNoX2JhY2soaXRlci5zZWNvbmQtPmdldElkKCkpOworICAgIH0KKyAgICByZXR1cm4gb3JkZXJlZFN0cmF0ZWdpZXM7Cit9CisKK1N0cmVhbVR5cGVWZWN0b3IgRW5naW5lQmFzZTo6Z2V0U3RyZWFtVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdAoreworICAgIC8vIEBUT0RPIGRlZmF1bHQgbXVzaWMgc3RyZWFtIHRvIGNvbnRyb2wgdm9sdW1lIGlmIG5vIGdyb3VwPworICAgIHJldHVybiAobVByb2R1Y3RTdHJhdGVnaWVzLmZpbmQocHMpICE9IGVuZChtUHJvZHVjdFN0cmF0ZWdpZXMpKSA/CisgICAgICAgICAgICAgICAgbVByb2R1Y3RTdHJhdGVnaWVzLmF0KHBzKS0+Z2V0U3VwcG9ydGVkU3RyZWFtcygpIDoKKyAgICAgICAgICAgICAgICBTdHJlYW1UeXBlVmVjdG9yKEFVRElPX1NUUkVBTV9NVVNJQyk7Cit9CisKK0F0dHJpYnV0ZXNWZWN0b3IgRW5naW5lQmFzZTo6Z2V0QWxsQXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMpIGNvbnN0Cit7CisgICAgcmV0dXJuIChtUHJvZHVjdFN0cmF0ZWdpZXMuZmluZChwcykgIT0gZW5kKG1Qcm9kdWN0U3RyYXRlZ2llcykpID8KKyAgICAgICAgICAgICAgICBtUHJvZHVjdFN0cmF0ZWdpZXMuYXQocHMpLT5nZXRBdWRpb0F0dHJpYnV0ZXMoKSA6IEF0dHJpYnV0ZXNWZWN0b3IoKTsKK30KKworc3RhdHVzX3QgRW5naW5lQmFzZTo6bGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVByb2R1Y3RTdHJhdGVnaWVzKSB7CisgICAgICAgIGNvbnN0IGF1dG8gJnByb2R1Y3RTdHJhdGVneSA9IGl0ZXIuc2Vjb25kOworICAgICAgICBzdHJhdGVnaWVzLnB1c2hfYmFjaygKKyAgICAgICAge3Byb2R1Y3RTdHJhdGVneS0+Z2V0TmFtZSgpLCBwcm9kdWN0U3RyYXRlZ3ktPmxpc3RBdWRpb0F0dHJpYnV0ZXMoKSwKKyAgICAgICAgIHByb2R1Y3RTdHJhdGVneS0+Z2V0SWQoKX0pOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK1ZvbHVtZUN1cnZlcyAqRW5naW5lQmFzZTo6Z2V0Vm9sdW1lQ3VydmVzRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0Cit7CisgICAgdm9sdW1lX2dyb3VwX3Qgdm9sR3IgPSBtUHJvZHVjdFN0cmF0ZWdpZXMuZ2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGF0dHIpOworICAgIGNvbnN0IGF1dG8gJml0ZXIgPSBtVm9sdW1lR3JvdXBzLmZpbmQodm9sR3IpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaXRlciA9PSBzdGQ6OmVuZChtVm9sdW1lR3JvdXBzKSwgIk5vIHZvbHVtZSBncm91cHMgZm9yICVzIiwgdG9TdHJpbmcoYXR0cikuY19zdHIoKSk7CisgICAgcmV0dXJuIG1Wb2x1bWVHcm91cHMuYXQodm9sR3IpLT5nZXRWb2x1bWVDdXJ2ZXMoKTsKK30KKworVm9sdW1lQ3VydmVzICpFbmdpbmVCYXNlOjpnZXRWb2x1bWVDdXJ2ZXNGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIHZvbHVtZV9ncm91cF90IHZvbEdyID0gbVByb2R1Y3RTdHJhdGVnaWVzLmdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZShzdHJlYW0pOworICAgIGlmICh2b2xHciA9PSBWT0xVTUVfR1JPVVBfTk9ORSkgeworICAgICAgICB2b2xHciA9IG1Qcm9kdWN0U3RyYXRlZ2llcy5nZXREZWZhdWx0Vm9sdW1lR3JvdXAoKTsKKyAgICB9CisgICAgY29uc3QgYXV0byAmaXRlciA9IG1Wb2x1bWVHcm91cHMuZmluZCh2b2xHcik7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpdGVyID09IHN0ZDo6ZW5kKG1Wb2x1bWVHcm91cHMpLCAiTm8gdm9sdW1lIGdyb3VwcyBmb3IgJXMiLAorICAgICAgICAgICAgICAgIHRvU3RyaW5nKHN0cmVhbSkuY19zdHIoKSk7CisgICAgcmV0dXJuIG1Wb2x1bWVHcm91cHMuYXQodm9sR3IpLT5nZXRWb2x1bWVDdXJ2ZXMoKTsKK30KKworc3RhdHVzX3QgRW5naW5lQmFzZTo6c3dpdGNoVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1TcmMsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtRHN0KQoreworICAgIGF1dG8gc3JjQ3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzRm9yU3RyZWFtVHlwZShzdHJlYW1TcmMpOworICAgIGF1dG8gZHN0Q3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzRm9yU3RyZWFtVHlwZShzdHJlYW1Ec3QpOworCisgICAgaWYgKHNyY0N1cnZlcyA9PSBudWxscHRyIHx8IGRzdEN1cnZlcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBkc3RDdXJ2ZXMtPnN3aXRjaEN1cnZlc0Zyb20oKnNyY0N1cnZlcyk7Cit9CisKK3N0YXR1c190IEVuZ2luZUJhc2U6OnJlc3RvcmVPcmlnaW5Wb2x1bWVDdXJ2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBWb2x1bWVDdXJ2ZXMgKmN1cnZlcyA9IGdldFZvbHVtZUN1cnZlc0ZvclN0cmVhbVR5cGUoc3RyZWFtKTsKKyAgICByZXR1cm4gY3VydmVzICE9IG51bGxwdHIgPyBjdXJ2ZXMtPnN3aXRjaEN1cnZlc0Zyb20oKmN1cnZlcykgOiBCQURfVkFMVUU7Cit9CisKK1ZvbHVtZUdyb3VwVmVjdG9yIEVuZ2luZUJhc2U6OmdldFZvbHVtZUdyb3VwcygpIGNvbnN0Cit7CisgICAgVm9sdW1lR3JvdXBWZWN0b3IgZ3JvdXA7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVZvbHVtZUdyb3VwcykgeworICAgICAgICBncm91cC5wdXNoX2JhY2soaXRlci5maXJzdCk7CisgICAgfQorICAgIHJldHVybiBncm91cDsKK30KKwordm9sdW1lX2dyb3VwX3QgRW5naW5lQmFzZTo6Z2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QKK3sKKyAgICByZXR1cm4gbVByb2R1Y3RTdHJhdGVnaWVzLmdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhhdHRyKTsKK30KKwordm9sdW1lX2dyb3VwX3QgRW5naW5lQmFzZTo6Z2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXMuZ2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKHN0cmVhbSk7Cit9CisKK3N0YXR1c190IEVuZ2luZUJhc2U6Omxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVZvbHVtZUdyb3VwcykgeworICAgICAgICBncm91cHMucHVzaF9iYWNrKHtpdGVyLnNlY29uZC0+Z2V0TmFtZSgpLCBpdGVyLnNlY29uZC0+Z2V0SWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlci5zZWNvbmQtPmdldFN1cHBvcnRlZEF0dHJpYnV0ZXMoKSwgaXRlci5zZWNvbmQtPmdldFN0cmVhbVR5cGVzKCl9KTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEVuZ2luZUJhc2U6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAoreworICAgIG1Qcm9kdWN0U3RyYXRlZ2llcy5kdW1wKGRzdCwgMik7CisgICAgbVZvbHVtZUdyb3Vwcy5kdW1wKGRzdCwgMik7Cit9CisKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lRGVmYXVsdENvbmZpZy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lRGVmYXVsdENvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZGUwZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVEZWZhdWx0Q29uZmlnLmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisvKioKKyAqIEBicmllZiBBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzIGhhcmQgY29kZWQgYXJyYXkgb2Ygc3RyYXRlZ2llcyB0byBmaWxsIG5ldyBlbmdpbmUgQVBJIGNvbnRyYWN0LgorICovCitjb25zdCBlbmdpbmVDb25maWc6OlByb2R1Y3RTdHJhdGVnaWVzIGdPcmRlcmVkU3RyYXRlZ2llcyA9IHsKKyAgICB7IlNUUkFURUdZX1BIT05FIiwKKyAgICAgeworICAgICAgICAgeyJwaG9uZSIsIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCAiQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwiLAorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04sIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLAorICAgICAgICAgICAgIiJ9fSwKKyAgICAgICAgIH0sCisgICAgICAgICB7InNjbyIsIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPLCAiQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08iLAorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX1NDTywKKyAgICAgICAgICAgICIifX0sCisgICAgICAgICB9CisgICAgIH0sCisgICAgfSwKKyAgICB7IlNUUkFURUdZX1NPTklGSUNBVElPTiIsCisgICAgIHsKKyAgICAgICAgIHsicmluZyIsIEFVRElPX1NUUkVBTV9SSU5HLCAiQVVESU9fU1RSRUFNX1JJTkciLAorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkUsCisgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9fQorICAgICAgICAgfSwKKyAgICAgICAgIHsiYWxhcm0iLCBBVURJT19TVFJFQU1fQUxBUk0sICJBVURJT19TVFJFQU1fQUxBUk0iLAorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0FMQVJNLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9fSwKKyAgICAgICAgIH0KKyAgICAgfSwKKyAgICB9LAorICAgIHsiU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSIsCisgICAgIHsKKyAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUsICJBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSIsCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsCisgICAgICAgICAgICBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQsICIifX0KKyAgICAgICAgIH0KKyAgICAgfSwKKyAgICB9LAorICAgIHsiU1RSQVRFR1lfQUNDRVNTSUJJTElUWSIsCisgICAgIHsKKyAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksICJBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSIsCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZLAorICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0KKyAgICAgICAgIH0KKyAgICAgfSwKKyAgICB9LAorICAgIHsiU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwiLAorICAgICB7CisgICAgICAgICB7IiIsIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04sICJBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OIiwKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1QsCisgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQsCisgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQsCisgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVCwKKyAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0KKyAgICAgICAgICB9CisgICAgICAgICB9CisgICAgIH0sCisgICAgfSwKKyAgICB7IlNUUkFURUdZX01FRElBIiwKKyAgICAgeworICAgICAgICAgeyJtdXNpYyIsIEFVRElPX1NUUkVBTV9NVVNJQywgIkFVRElPX1NUUkVBTV9NVVNJQyIsCisgICAgICAgICAgeworICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX01FRElBLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0dBTUUsIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfQVNTSVNUQU5ULCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSwKKyAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifQorICAgICAgICAgIH0sCisgICAgICAgICB9LAorICAgICAgICAgeyJzeXN0ZW0iLCBBVURJT19TVFJFQU1fU1lTVEVNLCAiQVVESU9fU1RSRUFNX1NZU1RFTSIsCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04sCisgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9fQorICAgICAgICAgfQorICAgICB9LAorICAgIH0sCisgICAgeyJTVFJBVEVHWV9EVE1GIiwKKyAgICAgeworICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fRFRNRiwgIkFVRElPX1NUUkVBTV9EVE1GIiwKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HLAorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifQorICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgfSwKKyAgICB9LAorICAgIHsiU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSIiwKKyAgICAgeworICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fVFRTLCAiQVVESU9fU1RSRUFNX1RUUyIsCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsCisgICAgICAgICAgICBBVURJT19GTEFHX0JFQUNPTiwgIiJ9fQorICAgICAgICAgfQorICAgICB9LAorICAgIH0sCisgICAgeyJTVFJBVEVHWV9SRVJPVVRJTkciLAorICAgICB7CisgICAgICAgICB7IiIsIEFVRElPX1NUUkVBTV9SRVJPVVRJTkcsICJBVURJT19TVFJFQU1fUkVST1VUSU5HIiwKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9fQorICAgICAgICAgfQorICAgICB9LAorICAgIH0sCisgICAgeyJTVFJBVEVHWV9QQVRDSCIsCisgICAgIHsKKyAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX1BBVENILCAiQVVESU9fU1RSRUFNX1BBVENIIiwKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9fQorICAgICAgICAgfQorICAgICB9LAorICAgIH0KK307CisKK2NvbnN0IGVuZ2luZUNvbmZpZzo6Q29uZmlnIGdEZWZhdWx0RW5naW5lQ29uZmlnID0geworICAgIDEuMCwKKyAgICBnT3JkZXJlZFN0cmF0ZWdpZXMsCisgICAge30sCisgICAge30sCisgICAge30KK307Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Qcm9kdWN0U3RyYXRlZ3kuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvUHJvZHVjdFN0cmF0ZWd5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzRmMTkwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvUHJvZHVjdFN0cmF0ZWd5LmNwcApAQCAtMCwwICsxLDMxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZS9Qcm9kdWN0U3RyYXRlZ3kiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJQcm9kdWN0U3RyYXRlZ3kuaCIKKworI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitQcm9kdWN0U3RyYXRlZ3k6OlByb2R1Y3RTdHJhdGVneShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgOgorICAgIG1OYW1lKG5hbWUpLAorICAgIG1JZChzdGF0aWNfY2FzdDxwcm9kdWN0X3N0cmF0ZWd5X3Q+KEhhbmRsZUdlbmVyYXRvcjx1aW50MzJfdD46OmdldE5leHRIYW5kbGUoKSkpCit7Cit9CisKK3ZvaWQgUHJvZHVjdFN0cmF0ZWd5OjphZGRBdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYXVkaW9BdHRyaWJ1dGVzKQoreworICAgIG1BdHRyaWJ1dGVzVmVjdG9yLnB1c2hfYmFjayhhdWRpb0F0dHJpYnV0ZXMpOworfQorCitzdGQ6OnZlY3RvcjxhbmRyb2lkOjpBdWRpb0F0dHJpYnV0ZXM+IFByb2R1Y3RTdHJhdGVneTo6bGlzdEF1ZGlvQXR0cmlidXRlcygpIGNvbnN0Cit7CisgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6QXVkaW9BdHRyaWJ1dGVzPiBhbmRyb2lkQWE7CisgICAgZm9yIChjb25zdCBhdXRvICZhdHRyIDogbUF0dHJpYnV0ZXNWZWN0b3IpIHsKKyAgICAgICAgYW5kcm9pZEFhLnB1c2hfYmFjayh7YXR0ci5tVm9sdW1lR3JvdXAsIGF0dHIubVN0cmVhbSwgYXR0ci5tQXR0cmlidXRlc30pOworICAgIH0KKyAgICByZXR1cm4gYW5kcm9pZEFhOworfQorCitBdHRyaWJ1dGVzVmVjdG9yIFByb2R1Y3RTdHJhdGVneTo6Z2V0QXVkaW9BdHRyaWJ1dGVzKCkgY29uc3QKK3sKKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGF0dHJWZWN0b3I7CisgICAgZm9yIChjb25zdCBhdXRvICZhdHRyR3JvdXAgOiBtQXR0cmlidXRlc1ZlY3RvcikgeworICAgICAgICBhdHRyVmVjdG9yLnB1c2hfYmFjayhhdHRyR3JvdXAubUF0dHJpYnV0ZXMpOworICAgIH0KKyAgICBpZiAobm90IGF0dHJWZWN0b3IuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gYXR0clZlY3RvcjsKKyAgICB9CisgICAgcmV0dXJuIHsgQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUiB9OworfQorCitib29sIFByb2R1Y3RTdHJhdGVneTo6bWF0Y2hlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cikgY29uc3QKK3sKKyAgICByZXR1cm4gc3RkOjpmaW5kX2lmKGJlZ2luKG1BdHRyaWJ1dGVzVmVjdG9yKSwgZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsmYXR0cl0oY29uc3QgYXV0byAmc3VwcG9ydGVkQXR0cikgeworICAgICAgICByZXR1cm4gQXVkaW9Qcm9kdWN0U3RyYXRlZ3k6OmF0dHJpYnV0ZXNNYXRjaGVzKHN1cHBvcnRlZEF0dHIubUF0dHJpYnV0ZXMsIGF0dHIpOworICAgIH0pICE9IGVuZChtQXR0cmlidXRlc1ZlY3Rvcik7Cit9CisKK2F1ZGlvX3N0cmVhbV90eXBlX3QgUHJvZHVjdFN0cmF0ZWd5OjpnZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcygKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdAoreworICAgIGNvbnN0IGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihiZWdpbihtQXR0cmlidXRlc1ZlY3RvciksIGVuZChtQXR0cmlidXRlc1ZlY3RvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmYXR0cl0oY29uc3QgYXV0byAmc3VwcG9ydGVkQXR0cikgeworICAgICAgICByZXR1cm4gQXVkaW9Qcm9kdWN0U3RyYXRlZ3k6OmF0dHJpYnV0ZXNNYXRjaGVzKHN1cHBvcnRlZEF0dHIubUF0dHJpYnV0ZXMsIGF0dHIpOyB9KTsKKyAgICByZXR1cm4gaXRlciAhPSBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpID8gaXRlci0+bVN0cmVhbSA6IEFVRElPX1NUUkVBTV9ERUZBVUxUOworfQorCithdWRpb19hdHRyaWJ1dGVzX3QgUHJvZHVjdFN0cmF0ZWd5OjpnZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIGNvbnN0Cit7CisgICAgY29uc3QgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGJlZ2luKG1BdHRyaWJ1dGVzVmVjdG9yKSwgZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzdHJlYW1UeXBlXShjb25zdCBhdXRvICZzdXBwb3J0ZWRBdHRyKSB7CisgICAgICAgIHJldHVybiBzdXBwb3J0ZWRBdHRyLm1TdHJlYW0gPT0gc3RyZWFtVHlwZTsgfSk7CisgICAgcmV0dXJuIGl0ZXIgIT0gZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKSA/IGl0ZXItPm1BdHRyaWJ1dGVzIDogQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKK30KKworYm9vbCBQcm9kdWN0U3RyYXRlZ3k6OmlzRGVmYXVsdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0ZDo6ZmluZF9pZihiZWdpbihtQXR0cmlidXRlc1ZlY3RvciksIGVuZChtQXR0cmlidXRlc1ZlY3RvciksIFtdKGNvbnN0IGF1dG8gJmF0dHIpIHsKKyAgICAgICAgcmV0dXJuIGF0dHIubUF0dHJpYnV0ZXMgPT0gZGVmYXVsdEF0dHI7IH0pICE9IGVuZChtQXR0cmlidXRlc1ZlY3Rvcik7Cit9CisKK1N0cmVhbVR5cGVWZWN0b3IgUHJvZHVjdFN0cmF0ZWd5OjpnZXRTdXBwb3J0ZWRTdHJlYW1zKCkgY29uc3QKK3sKKyAgICBTdHJlYW1UeXBlVmVjdG9yIHN0cmVhbXM7CisgICAgZm9yIChjb25zdCBhdXRvICZzdXBwb3J0ZWRBdHRyIDogbUF0dHJpYnV0ZXNWZWN0b3IpIHsKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChiZWdpbihzdHJlYW1zKSwgZW5kKHN0cmVhbXMpLCBzdXBwb3J0ZWRBdHRyLm1TdHJlYW0pID09IGVuZChzdHJlYW1zKSAmJgorICAgICAgICAgICAgICAgIHN1cHBvcnRlZEF0dHIubVN0cmVhbSAhPSBBVURJT19TVFJFQU1fREVGQVVMVCkgeworICAgICAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2soc3VwcG9ydGVkQXR0ci5tU3RyZWFtKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RyZWFtczsKK30KKworYm9vbCBQcm9kdWN0U3RyYXRlZ3k6OnN1cHBvcnRTdHJlYW1UeXBlKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbVR5cGUpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0ZDo6ZmluZF9pZihiZWdpbihtQXR0cmlidXRlc1ZlY3RvciksIGVuZChtQXR0cmlidXRlc1ZlY3RvciksCisgICAgICAgICAgICAgICAgICAgICAgICBbJnN0cmVhbVR5cGVdKGNvbnN0IGF1dG8gJnN1cHBvcnRlZEF0dHIpIHsKKyAgICAgICAgcmV0dXJuIHN1cHBvcnRlZEF0dHIubVN0cmVhbSA9PSBzdHJlYW1UeXBlOyB9KSAhPSBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpOworfQorCit2b2x1bWVfZ3JvdXBfdCBQcm9kdWN0U3RyYXRlZ3k6OmdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZzdXBwb3J0ZWRBdHRyIDogbUF0dHJpYnV0ZXNWZWN0b3IpIHsKKyAgICAgICAgaWYgKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5OjphdHRyaWJ1dGVzTWF0Y2hlcyhzdXBwb3J0ZWRBdHRyLm1BdHRyaWJ1dGVzLCBhdHRyKSkgeworICAgICAgICAgICAgcmV0dXJuIHN1cHBvcnRlZEF0dHIubVZvbHVtZUdyb3VwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWT0xVTUVfR1JPVVBfTk9ORTsKK30KKwordm9sdW1lX2dyb3VwX3QgUHJvZHVjdFN0cmF0ZWd5OjpnZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZzdXBwb3J0ZWRBdHRyIDogbUF0dHJpYnV0ZXNWZWN0b3IpIHsKKyAgICAgICAgaWYgKHN1cHBvcnRlZEF0dHIubVN0cmVhbSA9PSBzdHJlYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBwb3J0ZWRBdHRyLm1Wb2x1bWVHcm91cDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVk9MVU1FX0dST1VQX05PTkU7Cit9CisKK3ZvbHVtZV9ncm91cF90IFByb2R1Y3RTdHJhdGVneTo6Z2V0RGVmYXVsdFZvbHVtZUdyb3VwKCkgY29uc3QKK3sKKyAgICBjb25zdCBhdXRvICZpdGVyID0gc3RkOjpmaW5kX2lmKGJlZ2luKG1BdHRyaWJ1dGVzVmVjdG9yKSwgZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJmF0dHIpIHtyZXR1cm4gYXR0ci5tQXR0cmlidXRlcyA9PSBkZWZhdWx0QXR0cjt9KTsKKyAgICByZXR1cm4gaXRlciAhPSBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpID8gaXRlci0+bVZvbHVtZUdyb3VwIDogVk9MVU1FX0dST1VQX05PTkU7Cit9CisKK3ZvaWQgUHJvZHVjdFN0cmF0ZWd5OjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4lKnMtJXMgKGlkOiAlZClcbiIsIHNwYWNlcywgIiIsIG1OYW1lLmNfc3RyKCksIG1JZCk7CisgICAgc3RkOjpzdHJpbmcgZGV2aWNlTGl0ZXJhbDsKKyAgICBpZiAoIU91dHB1dERldmljZUNvbnZlcnRlcjo6dG9TdHJpbmcobUFwcGxpY2FibGVEZXZpY2VzLCBkZXZpY2VMaXRlcmFsKSkgeworICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjb252ZXJ0IGRldmljZSAlZCIsIF9fRlVOQ1RJT05fXywgbUFwcGxpY2FibGVEZXZpY2VzKTsKKyAgICB9CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1NlbGVjdGVkIERldmljZToge3R5cGU6JXMsIEA6JXN9XG4iLCBzcGFjZXMgKyAyLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGl0ZXJhbC5jX3N0cigpLCBtRGV2aWNlQWRkcmVzcy5jX3N0cigpKTsKKworICAgIGZvciAoY29uc3QgYXV0byAmYXR0ciA6IG1BdHRyaWJ1dGVzVmVjdG9yKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNHcm91cDogJWQgc3RyZWFtOiAlc1xuIiwgc3BhY2VzICsgMywgIiIsIGF0dHIubVZvbHVtZUdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjp0b1N0cmluZyhhdHRyLm1TdHJlYW0pLmNfc3RyKCkpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzIEF0dHJpYnV0ZXM6ICIsIHNwYWNlcyArIDMsICIiKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgYXR0U3RyID0KKyAgICAgICAgICAgICAgICBhdHRyLm1BdHRyaWJ1dGVzID09IGRlZmF1bHRBdHRyID8gInsgQW55IH0iIDogYW5kcm9pZDo6dG9TdHJpbmcoYXR0ci5tQXR0cmlidXRlcyk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlc1xuIiwgYXR0U3RyLmNfc3RyKCkpOworICAgIH0KK30KKworcHJvZHVjdF9zdHJhdGVneV90IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcygKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6ICp0aGlzKSB7CisgICAgICAgIGlmIChpdGVyLnNlY29uZC0+bWF0Y2hlcyhhdHRyKSkgeworICAgICAgICAgICAgcmV0dXJuIGl0ZXIuc2Vjb25kLT5nZXRJZCgpOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCIlczogTm8gbWF0Y2hpbmcgcHJvZHVjdCBzdHJhdGVneSBmb3IgYXR0cmlidXRlcyAlcywgcmV0dXJuIGRlZmF1bHQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgdG9TdHJpbmcoYXR0cikuY19zdHIoKSk7CisgICAgcmV0dXJuIGdldERlZmF1bHQoKTsKK30KKworYXVkaW9fYXR0cmlidXRlc190IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogKnRoaXMpIHsKKyAgICAgICAgY29uc3QgYXV0byBzdHJhdGVneSA9IGl0ZXIuc2Vjb25kOworICAgICAgICBpZiAoc3RyYXRlZ3ktPnN1cHBvcnRTdHJlYW1UeXBlKHN0cmVhbSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJhdGVneS0+Z2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoc3RyZWFtKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiJXM6IE5vIHByb2R1Y3Qgc3RyYXRlZ3kgZm9yIHN0cmVhbSAlcywgdXNpbmcgZGVmYXVsdCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICB0b1N0cmluZyhzdHJlYW0pLmNfc3RyKCkpOworICAgIHJldHVybiB7fTsKK30KKworYXVkaW9fc3RyZWFtX3R5cGVfdCBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogKnRoaXMpIHsKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBpdGVyLnNlY29uZC0+Z2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoYXR0cik7CisgICAgICAgIGlmIChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJlYW07CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIiVzOiBObyBwcm9kdWN0IHN0cmF0ZWd5IGZvciBhdHRyaWJ1dGVzICVzLCB1c2luZyBkZWZhdWx0IChha2EgTVVTSUMpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgIHRvU3RyaW5nKGF0dHIpLmNfc3RyKCkpOworICAgIHJldHVybiAgQVVESU9fU1RSRUFNX01VU0lDOworfQorCitwcm9kdWN0X3N0cmF0ZWd5X3QgUHJvZHVjdFN0cmF0ZWd5TWFwOjpnZXREZWZhdWx0KCkgY29uc3QKK3sKKyAgICBpZiAobURlZmF1bHRTdHJhdGVneSAhPSBQUk9EVUNUX1NUUkFURUdZX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0U3RyYXRlZ3k7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6ICp0aGlzKSB7CisgICAgICAgIGlmIChpdGVyLnNlY29uZC0+aXNEZWZhdWx0KCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogdXNpbmcgZGVmYXVsdCAlcyIsIF9fRlVOQ1RJT05fXywgaXRlci5zZWNvbmQtPmdldE5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVyLnNlY29uZC0+Z2V0SWQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HRSgiJXM6IE5vIGRlZmF1bHQgcHJvZHVjdCBzdHJhdGVneSBkZWZpbmVkIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gUFJPRFVDVF9TVFJBVEVHWV9OT05FOworfQorCithdWRpb19hdHRyaWJ1dGVzX3QgUHJvZHVjdFN0cmF0ZWd5TWFwOjpnZXRBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KAorICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIGNvbnN0Cit7CisgICAgaWYgKGZpbmQoc3RyYXRlZ3kpID09IGVuZCgpKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkICVkIHN0cmF0ZWd5IHJlcXVlc3RlZCIsIHN0cmF0ZWd5KTsKKyAgICAgICAgcmV0dXJuIEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CisgICAgfQorICAgIHJldHVybiBhdChzdHJhdGVneSktPmdldEF1ZGlvQXR0cmlidXRlcygpWzBdOworfQorCitwcm9kdWN0X3N0cmF0ZWd5X3QgUHJvZHVjdFN0cmF0ZWd5TWFwOjpnZXRQcm9kdWN0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGl0ZXIuc2Vjb25kLT5zdXBwb3J0U3RyZWFtVHlwZShzdHJlYW0pKSB7CisgICAgICAgICAgICByZXR1cm4gaXRlci5zZWNvbmQtPmdldElkKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIiVzOiBObyBwcm9kdWN0IHN0cmF0ZWd5IGZvciBzdHJlYW0gJWQsIHVzaW5nIGRlZmF1bHQiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbSk7CisgICAgcmV0dXJuIGdldERlZmF1bHQoKTsKK30KKworCithdWRpb19kZXZpY2VzX3QgUHJvZHVjdFN0cmF0ZWd5TWFwOjpnZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneSgKKyAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBjb25zdAoreworICAgIGlmIChmaW5kKHN0cmF0ZWd5KSA9PSBlbmQoKSkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCAlZCBzdHJhdGVneSByZXF1ZXN0ZWQsIHJldHVybmluZyBkZXZpY2UgZm9yIGRlZmF1bHQgc3RyYXRlZ3kiLCBzdHJhdGVneSk7CisgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBkZWZhdWx0U3RyYXRlZ3kgPSBnZXREZWZhdWx0KCk7CisgICAgICAgIGlmIChkZWZhdWx0U3RyYXRlZ3kgPT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FKSB7CisgICAgICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGF0KGdldERlZmF1bHQoKSktPmdldERldmljZVR5cGVzKCk7CisgICAgfQorICAgIHJldHVybiBhdChzdHJhdGVneSktPmdldERldmljZVR5cGVzKCk7Cit9CisKK3N0ZDo6c3RyaW5nIFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0RGV2aWNlQWRkcmVzc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3QgcHNJZCkgY29uc3QKK3sKKyAgICBpZiAoZmluZChwc0lkKSA9PSBlbmQoKSkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCAlZCBzdHJhdGVneSByZXF1ZXN0ZWQsIHJldHVybmluZyBkZXZpY2UgZm9yIGRlZmF1bHQgc3RyYXRlZ3kiLCBwc0lkKTsKKyAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IGRlZmF1bHRTdHJhdGVneSA9IGdldERlZmF1bHQoKTsKKyAgICAgICAgaWYgKGRlZmF1bHRTdHJhdGVneSA9PSBQUk9EVUNUX1NUUkFURUdZX05PTkUpIHsKKyAgICAgICAgICAgIHJldHVybiB7fTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXQoZ2V0RGVmYXVsdCgpKS0+Z2V0RGV2aWNlQWRkcmVzcygpOworICAgIH0KKyAgICByZXR1cm4gYXQocHNJZCktPmdldERldmljZUFkZHJlc3MoKTsKK30KKwordm9sdW1lX2dyb3VwX3QgUHJvZHVjdFN0cmF0ZWd5TWFwOjpnZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6ICp0aGlzKSB7CisgICAgICAgIHZvbHVtZV9ncm91cF90IGdyb3VwID0gaXRlci5zZWNvbmQtPmdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhhdHRyKTsKKyAgICAgICAgaWYgKGdyb3VwICE9IFZPTFVNRV9HUk9VUF9OT05FKSB7CisgICAgICAgICAgICByZXR1cm4gZ3JvdXA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGdldERlZmF1bHRWb2x1bWVHcm91cCgpOworfQorCit2b2x1bWVfZ3JvdXBfdCBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiAqdGhpcykgeworICAgICAgICB2b2x1bWVfZ3JvdXBfdCBncm91cCA9IGl0ZXIuc2Vjb25kLT5nZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoc3RyZWFtKTsKKyAgICAgICAgaWYgKGdyb3VwICE9IFZPTFVNRV9HUk9VUF9OT05FKSB7CisgICAgICAgICAgICByZXR1cm4gZ3JvdXA7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1coIiVzOiBubyB2b2x1bWUgZ3JvdXAgZm9yICVzLCB1c2luZyBkZWZhdWx0IiwgX19mdW5jX18sIHRvU3RyaW5nKHN0cmVhbSkuY19zdHIoKSk7CisgICAgcmV0dXJuIGdldERlZmF1bHRWb2x1bWVHcm91cCgpOworfQorCit2b2x1bWVfZ3JvdXBfdCBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldERlZmF1bHRWb2x1bWVHcm91cCgpIGNvbnN0Cit7CisgICAgcHJvZHVjdF9zdHJhdGVneV90IGRlZmF1bHRTdHJhdGVneSA9IGdldERlZmF1bHQoKTsKKyAgICBpZiAoZGVmYXVsdFN0cmF0ZWd5ID09IFBST0RVQ1RfU1RSQVRFR1lfTk9ORSkgeworICAgICAgICByZXR1cm4gVk9MVU1FX0dST1VQX05PTkU7CisgICAgfQorICAgIHJldHVybiBhdChkZWZhdWx0U3RyYXRlZ3kpLT5nZXREZWZhdWx0Vm9sdW1lR3JvdXAoKTsKK30KKwordm9pZCBQcm9kdWN0U3RyYXRlZ3lNYXA6OmluaXRpYWxpemUoKQoreworICAgIG1EZWZhdWx0U3RyYXRlZ3kgPSBnZXREZWZhdWx0KCk7CisgICAgQUxPR19BU1NFUlQobURlZmF1bHRTdHJhdGVneSAhPSBQUk9EVUNUX1NUUkFURUdZX05PTkUsICJObyBkZWZhdWx0IHByb2R1Y3Qgc3RyYXRlZ3kgZm91bmQiKTsKK30KKwordm9pZCBQcm9kdWN0U3RyYXRlZ3lNYXA6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNQcm9kdWN0IFN0cmF0ZWdpZXMgZHVtcDoiLCBzcGFjZXMsICIiKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiAqdGhpcykgeworICAgICAgICBpdGVyLnNlY29uZC0+ZHVtcChkc3QsIHNwYWNlcyArIDIpOworICAgIH0KK30KKworfQorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM1MjU3OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1ZvbHVtZUN1cnZlLmNwcApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpWb2x1bWVDdXJ2ZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIlZvbHVtZUN1cnZlLmgiCisjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgorI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitmbG9hdCBWb2x1bWVDdXJ2ZTo6dm9sSW5kZXhUb0RiKGludCBpbmRleEluVWksIGludCB2b2xJbmRleE1pbiwgaW50IHZvbEluZGV4TWF4KSBjb25zdAoreworICAgIEFMT0dfQVNTRVJUKCFtQ3VydmVQb2ludHMuaXNFbXB0eSgpLCAiSW52YWxpZCB2b2x1bWUgY3VydmUiKTsKKyAgICBpZiAodm9sSW5kZXhNaW4gPCAwIHx8IHZvbEluZGV4TWF4IDwgMCkgeworICAgICAgICAvLyBJbiBvcmRlciB0byBsZXQgQXVkaW9TZXJ2aWNlIGluaXRpYWxpemUgdGhlIG1pbiBhbmQgbWF4LCBjb252ZW50aW9uIGlzIHRvIHVzZSAtMQorICAgICAgICByZXR1cm4gTkFOOworICAgIH0KKyAgICBpZiAoaW5kZXhJblVpIDwgdm9sSW5kZXhNaW4pIHsKKyAgICAgICAgLy8gYW4gaW5kZXggb2YgMCBtZWFucyBtdXRlIHJlcXVlc3Qgd2hlbiB2b2xJbmRleE1pbiA+IDAKKyAgICAgICAgaWYgKGluZGV4SW5VaSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigiVk9MVU1FIGZvcmNpbmcgbXV0ZSBmb3IgaW5kZXggMCB3aXRoIG1pbiBpbmRleCAlZCIsIHZvbEluZGV4TWluKTsKKyAgICAgICAgICAgIHJldHVybiBWT0xVTUVfTUlOX0RCOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJWT0xVTUUgcmVtYXBwaW5nIGluZGV4IGZyb20gJWQgdG8gbWluIGluZGV4ICVkIiwgaW5kZXhJblVpLCB2b2xJbmRleE1pbik7CisgICAgICAgIGluZGV4SW5VaSA9IHZvbEluZGV4TWluOworICAgIH0gZWxzZSBpZiAoaW5kZXhJblVpID4gdm9sSW5kZXhNYXgpIHsKKyAgICAgICAgQUxPR1YoIlZPTFVNRSByZW1hcHBpbmcgaW5kZXggZnJvbSAlZCB0byBtYXggaW5kZXggJWQiLCBpbmRleEluVWksIHZvbEluZGV4TWF4KTsKKyAgICAgICAgaW5kZXhJblVpID0gdm9sSW5kZXhNYXg7CisgICAgfQorCisgICAgc2l6ZV90IG5iQ3VydmVQb2ludHMgPSBtQ3VydmVQb2ludHMuc2l6ZSgpOworICAgIC8vIHRoZSB2b2x1bWUgaW5kZXggaW4gdGhlIFVJIGlzIHJlbGF0aXZlIHRvIHRoZSBtaW4gYW5kIG1heCB2b2x1bWUgaW5kaWNlcyBmb3IgdGhpcyBzdHJlYW0KKyAgICBpbnQgbmJTdGVwcyA9IDEgKyBtQ3VydmVQb2ludHNbbmJDdXJ2ZVBvaW50cyAtIDFdLm1JbmRleCAtIG1DdXJ2ZVBvaW50c1swXS5tSW5kZXg7CisgICAgaW50IHZvbElkeCA9IChuYlN0ZXBzICogKGluZGV4SW5VaSAtIHZvbEluZGV4TWluKSkgLyAodm9sSW5kZXhNYXggLSB2b2xJbmRleE1pbik7CisKKyAgICAvLyBXaGVyZSB3b3VsZCB0aGlzIHZvbHVtZSBpbmRleCBiZWVuIGluc2VydGVkIGluIHRoZSBjdXJ2ZSBwb2ludAorICAgIHNpemVfdCBpbmRleEluVWlQb3NpdGlvbiA9IG1DdXJ2ZVBvaW50cy5vcmRlck9mKEN1cnZlUG9pbnQodm9sSWR4LCAwKSk7CisgICAgaWYgKGluZGV4SW5VaVBvc2l0aW9uID49IG5iQ3VydmVQb2ludHMpIHsKKyAgICAgICAgLy91c2UgbGFzdCBwb2ludCBvZiB0YWJsZQorICAgICAgICByZXR1cm4gbUN1cnZlUG9pbnRzW25iQ3VydmVQb2ludHMgLSAxXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmOworICAgIH0KKyAgICBpZiAoaW5kZXhJblVpUG9zaXRpb24gPT0gMCkgeworICAgICAgICBpZiAoaW5kZXhJblVpUG9zaXRpb24gIT0gbUN1cnZlUG9pbnRzWzBdLm1JbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIFZPTFVNRV9NSU5fREI7IC8vIG91dCBvZiBib3VuZHMKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUN1cnZlUG9pbnRzWzBdLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGY7CisgICAgfQorICAgIC8vIGxpbmVhciBpbnRlcnBvbGF0aW9uIGluIHRoZSBhdHRlbnVhdGlvbiB0YWJsZSBpbiBkQgorICAgIGZsb2F0IGRlY2liZWxzID0gKG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbiAtIDFdLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGYpICsKKyAgICAgICAgICAgICgoZmxvYXQpKHZvbElkeCAtIG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbiAtIDFdLm1JbmRleCkpICoKKyAgICAgICAgICAgICAgICAoICgobUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAobUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZikpIC8KKyAgICAgICAgICAgICAgICAgICAgKChmbG9hdCkobUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uXS5tSW5kZXggLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbiAtIDFdLm1JbmRleCkpICk7CisKKyAgICBBTE9HVigiVk9MVU1FIHZvbCBpbmRleD1bJWQgJWQgJWRdLCBkQj1bJS4xZiAlLjFmICUuMWZdIiwKKyAgICAgICAgICAgIG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbiAtIDFdLm1JbmRleCwgdm9sSWR4LAorICAgICAgICAgICAgbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uXS5tSW5kZXgsCisgICAgICAgICAgICAoKGZsb2F0KW1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbiAtIDFdLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGYpLCBkZWNpYmVscywKKyAgICAgICAgICAgICgoZmxvYXQpbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmKSk7CisKKyAgICByZXR1cm4gZGVjaWJlbHM7Cit9CisKK3ZvaWQgVm9sdW1lQ3VydmU6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBib29sIGN1cnZlUG9pbnRzKSBjb25zdAoreworICAgIGlmICghY3VydmVQb2ludHMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBkc3QtPmFwcGVuZCgiIHsiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DdXJ2ZVBvaW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzKCUzZCwgJTVkKSIsIHNwYWNlcywgIiIsIG1DdXJ2ZVBvaW50c1tpXS5tSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJ2ZVBvaW50c1tpXS5tQXR0ZW51YXRpb25Jbk1iKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoaSA9PSAobUN1cnZlUG9pbnRzLnNpemUoKSAtIDEpID8gIiB9XG4iIDogIiwgIik7CisgICAgfQorfQorCit2b2lkIFZvbHVtZUN1cnZlczo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGJvb2wgY3VydmVQb2ludHMpIGNvbnN0Cit7CisgICAgaWYgKCFjdXJ2ZVBvaW50cykgeworLy8gICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMlMDJkICAgICAgJXMgICAgICAgICAlMDNkICAgICAgICAlMDNkICAgICAgICAiLCBzcGFjZXMsICIiLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW0sIG1DYW5CZU11dGVkID8gInRydWUgIiA6ICJmYWxzZSIsIG1JbmRleE1pbiwgbUluZGV4TWF4KTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyBDYW4gYmUgbXV0ZWQgIEluZGV4IE1pbiAgSW5kZXggTWF4ICBJbmRleCBDdXIgW2RldmljZSA6IGluZGV4XS4uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VzICsgMSwgIiIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzICVzICAgICAgICAgJTAyZCAgICAgICAgICUwMmQgICAgICAgICAiLCBzcGFjZXMgKyAxLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbkJlTXV0ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwgbUluZGV4TWluLCBtSW5kZXhNYXgpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBtSW5kZXhDdXIpIHsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlMDR4IDogJTAyZCwgIiwgcGFpci5maXJzdCwgcGFpci5zZWNvbmQpOworICAgICAgICB9CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHN0cmVhbU5hbWVzOworICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtIDogbVN0cmVhbXMpIHsKKyAgICAgICAgc3RyZWFtTmFtZXMgKz0gYW5kcm9pZDo6dG9TdHJpbmcoc3RyZWFtKSArICIoIitzdGQ6OnRvX3N0cmluZyhzdHJlYW0pKyIpICI7CisgICAgfQorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNWb2x1bWUgQ3VydmVzIFN0cmVhbXMvQXR0cmlidXRlcywgQ3VydmUgcG9pbnRzIFN0cmVhbXMgZm9yIGRldmljZSIKKyAgICAgICAgICAgICAgICAgICAgICAiIGNhdGVnb3J5IChpbmRleCwgYXR0ZW51YXRpb24gaW4gbWlsbGliZWwpXG4iLCBzcGFjZXMsICIiKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzIFN0cmVhbXM6ICVzIFxuIiwgc3BhY2VzLCAiIiwgc3RyZWFtTmFtZXMuY19zdHIoKSk7CisgICAgaWYgKCFtQXR0cmlidXRlcy5lbXB0eSgpKSBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzIEF0dHJpYnV0ZXM6Iiwgc3BhY2VzLCAiIik7CisgICAgZm9yIChjb25zdCBhdXRvICZhdHRyaWJ1dGVzIDogbUF0dHJpYnV0ZXMpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgYXR0U3RyID0gYXR0cmlidXRlcyA9PSBkZWZhdWx0QXR0ciA/ICJ7IEFueSB9IiA6IGFuZHJvaWQ6OnRvU3RyaW5nKGF0dHJpYnV0ZXMpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzICVzXG4iLCBhdHRyaWJ1dGVzID09IG1BdHRyaWJ1dGVzLmZyb250KCkgPyAwIDogc3BhY2VzICsgMTMsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRTdHIuY19zdHIoKSk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGV2aWNlQ2F0TGl0ZXJhbDsKKyAgICAgICAgRGV2aWNlQ2F0ZWdvcnlDb252ZXJ0ZXI6OnRvU3RyaW5nKGtleUF0KGkpLCBkZXZpY2VDYXRMaXRlcmFsKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyAlcyA6Iiwgc3BhY2VzLCAiIiwgZGV2aWNlQ2F0TGl0ZXJhbC5jX3N0cigpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIDEsIHRydWUpOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvVm9sdW1lR3JvdXAuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvVm9sdW1lR3JvdXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxODk4MDcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Wb2x1bWVHcm91cC5jcHAKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZS9Wb2x1bWVHcm91cCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIlZvbHVtZUdyb3VwLmgiCisjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vCisvLyBWb2x1bWVHcm91cCBpbXBsZW1lbnRhdGlvbgorLy8KK1ZvbHVtZUdyb3VwOjpWb2x1bWVHcm91cChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpIDoKKyAgICBtTmFtZShuYW1lKSwgbUlkKHN0YXRpY19jYXN0PHZvbHVtZV9ncm91cF90PihIYW5kbGVHZW5lcmF0b3I8dWludDMyX3Q+OjpnZXROZXh0SGFuZGxlKCkpKSwKKyAgICBtR3JvdXBWb2x1bWVDdXJ2ZXMoVm9sdW1lQ3VydmVzKGluZGV4TWluLCBpbmRleE1heCkpCit7Cit9CisKK3ZvaWQgVm9sdW1lR3JvdXA6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiUqcy0lcyAoaWQ6ICVkKVxuIiwgc3BhY2VzLCAiIiwgbU5hbWUuY19zdHIoKSwgbUlkKTsKKyAgICBtR3JvdXBWb2x1bWVDdXJ2ZXMuZHVtcChkc3QsIHNwYWNlcyArIDIsIHRydWUpOworICAgIG1Hcm91cFZvbHVtZUN1cnZlcy5kdW1wKGRzdCwgc3BhY2VzICsgMiwgZmFsc2UpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiIpOworfQorCit2b2lkIFZvbHVtZUdyb3VwOjphZGQoY29uc3Qgc3A8Vm9sdW1lQ3VydmU+ICZjdXJ2ZSkKK3sKKyAgICBtR3JvdXBWb2x1bWVDdXJ2ZXMuYWRkKGN1cnZlKTsKK30KKwordm9pZCBWb2x1bWVHcm91cDo6YWRkU3VwcG9ydGVkQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpCit7CisgICAgbUdyb3VwVm9sdW1lQ3VydmVzLmFkZEF0dHJpYnV0ZXMoYXR0cik7Cit9CisKK3ZvaWQgVm9sdW1lR3JvdXA6OmFkZFN1cHBvcnRlZFN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBtR3JvdXBWb2x1bWVDdXJ2ZXMuYWRkU3RyZWFtVHlwZShzdHJlYW0pOworfQorCisvLworLy8gVm9sdW1lR3JvdXBNYXAgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIFZvbHVtZUdyb3VwTWFwOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4lKnNWb2x1bWUgR3JvdXBzIGR1bXA6Iiwgc3BhY2VzLCAiIik7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogKnRoaXMpIHsKKyAgICAgICAgaXRlci5zZWNvbmQtPmR1bXAoZHN0LCBzcGFjZXMgKyAyKTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNzJmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMSBAQAorY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeWVuZ2luZV9jb25maWciLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZXh0ZXJuYWwvbGlieG1sMi9pbmNsdWRlIiwKKyAgICAgICAgImV4dGVybmFsL2ljdS9pY3U0Yy9zb3VyY2UvY29tbW9uIiwKKyAgICBdLAorICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy9FbmdpbmVDb25maWcuY3BwIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgICAgICAibGliYW5kcm9pZGljdSIsCisgICAgICAgICJsaWJ4bWwyIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9wb2xpY3ljb21tb24iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL2luY2x1ZGUvRW5naW5lQ29uZmlnLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL2luY2x1ZGUvRW5naW5lQ29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y1ZWQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvaW5jbHVkZS9FbmdpbmVDb25maWcuaApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCitzdHJ1Y3QgX3htbE5vZGU7CitzdHJ1Y3QgX3htbERvYzsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVuZ2luZUNvbmZpZyB7CisKKy8qKiBEZWZhdWx0IHBhdGggb2YgYXVkaW8gcG9saWN5IHVzYWdlcyBjb25maWd1cmF0aW9uIGZpbGUuICovCitjb25zdGV4cHIgY2hhciBERUZBVUxUX1BBVEhbXSA9ICIvdmVuZG9yL2V0Yy9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sIjsKKworLyoqIERpcmVjdG9yaWVzIHdoZXJlIHRoZSBlZmZlY3QgbGlicmFyaWVzIHdpbGwgYmUgc2VhcmNoIGZvci4gKi8KK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBQT0xJQ1lfVVNBR0VfTElCUkFSWV9QQVRIW10gPSB7Ii9vZG0vZXRjLyIsICIvdmVuZG9yL2V0Yy8iLCAiL3N5c3RlbS9ldGMvIn07CisKK3VzaW5nIEF0dHJpYnV0ZXNWZWN0b3IgPSBzdGQ6OnZlY3RvcjxhdWRpb19hdHRyaWJ1dGVzX3Q+OwordXNpbmcgU3RyZWFtVmVjdG9yID0gc3RkOjp2ZWN0b3I8YXVkaW9fc3RyZWFtX3R5cGVfdD47CisKK3N0cnVjdCBBdHRyaWJ1dGVzR3JvdXAgeworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW07CisgICAgc3RkOjpzdHJpbmcgdm9sdW1lR3JvdXA7CisgICAgQXR0cmlidXRlc1ZlY3RvciBhdHRyaWJ1dGVzVmVjdDsKK307CisKK3VzaW5nIEF0dHJpYnV0ZXNHcm91cHMgPSBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGVzR3JvdXA+OworCitzdHJ1Y3QgQ3VydmVQb2ludCB7CisgICAgaW50IGluZGV4OworICAgIGludCBhdHRlbnVhdGlvbkluTWI7Cit9OwordXNpbmcgQ3VydmVQb2ludHMgPSBzdGQ6OnZlY3RvcjxDdXJ2ZVBvaW50PjsKKworc3RydWN0IFZvbHVtZUN1cnZlIHsKKyAgICBzdGQ6OnN0cmluZyBkZXZpY2VDYXRlZ29yeTsKKyAgICBDdXJ2ZVBvaW50cyBjdXJ2ZVBvaW50czsKK307Cit1c2luZyBWb2x1bWVDdXJ2ZXMgPSBzdGQ6OnZlY3RvcjxWb2x1bWVDdXJ2ZT47CisKK3N0cnVjdCBWb2x1bWVHcm91cCB7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBpbnQgaW5kZXhNaW47CisgICAgaW50IGluZGV4TWF4OworICAgIFZvbHVtZUN1cnZlcyB2b2x1bWVDdXJ2ZXM7Cit9OwordXNpbmcgVm9sdW1lR3JvdXBzID0gc3RkOjp2ZWN0b3I8Vm9sdW1lR3JvdXA+OworCitzdHJ1Y3QgUHJvZHVjdFN0cmF0ZWd5IHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIEF0dHJpYnV0ZXNHcm91cHMgYXR0cmlidXRlc0dyb3VwczsKK307CisKK3VzaW5nIFByb2R1Y3RTdHJhdGVnaWVzID0gc3RkOjp2ZWN0b3I8UHJvZHVjdFN0cmF0ZWd5PjsKKwordXNpbmcgVmFsdWVQYWlyID0gc3RkOjpwYWlyPHVpbnQzMl90LCBzdGQ6OnN0cmluZz47Cit1c2luZyBWYWx1ZVBhaXJzID0gc3RkOjp2ZWN0b3I8VmFsdWVQYWlyPjsKKworc3RydWN0IENyaXRlcmlvblR5cGUKK3sKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIGJvb2wgaXNJbmNsdXNpdmU7CisgICAgVmFsdWVQYWlycyB2YWx1ZVBhaXJzOworfTsKKwordXNpbmcgQ3JpdGVyaW9uVHlwZXMgPSBzdGQ6OnZlY3RvcjxDcml0ZXJpb25UeXBlPjsKKworc3RydWN0IENyaXRlcmlvbgoreworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgc3RkOjpzdHJpbmcgdHlwZU5hbWU7CisgICAgc3RkOjpzdHJpbmcgZGVmYXVsdExpdGVyYWxWYWx1ZTsKK307CisKK3VzaW5nIENyaXRlcmlhID0gc3RkOjp2ZWN0b3I8Q3JpdGVyaW9uPjsKKworc3RydWN0IENvbmZpZyB7CisgICAgZmxvYXQgdmVyc2lvbjsKKyAgICBQcm9kdWN0U3RyYXRlZ2llcyBwcm9kdWN0U3RyYXRlZ2llczsKKyAgICBDcml0ZXJpYSBjcml0ZXJpYTsKKyAgICBDcml0ZXJpb25UeXBlcyBjcml0ZXJpb25UeXBlczsKKyAgICBWb2x1bWVHcm91cHMgdm9sdW1lR3JvdXBzOworfTsKKworLyoqIFJlc3VsdCBvZiBgcGFyc2UoY29uc3QgY2hhciopYCAqLworc3RydWN0IFBhcnNpbmdSZXN1bHQgeworICAgIC8qKiBQYXJzZWQgY29uZmlnLCBudWxscHRyIGlmIHRoZSB4bWwgbGliIGNvdWxkIG5vdCBsb2FkIHRoZSBmaWxlICovCisgICAgc3RkOjp1bmlxdWVfcHRyPENvbmZpZz4gcGFyc2VkQ29uZmlnOworICAgIHNpemVfdCBuYlNraXBwZWRFbGVtZW50OyAvLzwgTnVtYmVyIG9mIHNraXBwZWQgaW52YWxpZCBwcm9kdWN0IHN0cmF0ZWdpZXMKK307CisKKy8qKiBQYXJzZXMgdGhlIHByb3ZpZGVkIGF1ZGlvIHBvbGljeSB1c2FnZSBjb25maWd1cmF0aW9uLgorICogQHJldHVybiBhdWRpbyBwb2xpY3kgdXNhZ2UgQHNlZSBDb25maWcKKyAqLworUGFyc2luZ1Jlc3VsdCBwYXJzZShjb25zdCBjaGFyKiBwYXRoID0gREVGQVVMVF9QQVRIKTsKK2FuZHJvaWQ6OnN0YXR1c190IHBhcnNlTGVnYWN5Vm9sdW1lcyhWb2x1bWVHcm91cHMgJnZvbHVtZUdyb3Vwcyk7CisKK30gLy8gbmFtZXNwYWNlIGVuZ2luZUNvbmZpZworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9zcmMvRW5naW5lQ29uZmlnLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvc3JjL0VuZ2luZUNvbmZpZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFkNzczOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvc3JjL0VuZ2luZUNvbmZpZy5jcHAKQEAgLTAsMCArMSw2OTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb2xpY3lFbmdpbmUvQ29uZmlnIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiRW5naW5lQ29uZmlnLmgiCisjaW5jbHVkZSA8cG9saWN5Lmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvY29udmVydC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaWJ4bWwveGluY2x1ZGUuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGlzdHJlYW0+CisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIHV0aWxpdGllczo6Y29udmVydFRvOworCituYW1lc3BhY2UgZW5naW5lQ29uZmlnIHsKKworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpnVmVyc2lvbkF0dHJpYnV0ZSA9ICJ2ZXJzaW9uIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnUmVmZXJlbmNlRWxlbWVudE5hbWUgPSAicmVmZXJlbmNlIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnUmVmZXJlbmNlQXR0cmlidXRlTmFtZSA9ICJuYW1lIjsKKwordGVtcGxhdGU8dHlwZW5hbWUgRSwgdHlwZW5hbWUgQz4KK3N0cnVjdCBCYXNlU2VyaWFsaXplclRyYWl0cyB7CisgICAgdHlwZWRlZiBFIEVsZW1lbnQ7CisgICAgdHlwZWRlZiBDIENvbGxlY3Rpb247CisgICAgdHlwZWRlZiB2b2lkKiBQdHJTZXJpYWxpemluZ0N0eDsKK307CisKK3N0cnVjdCBBdHRyaWJ1dGVzR3JvdXBUcmFpdHMgOiBwdWJsaWMgQmFzZVNlcmlhbGl6ZXJUcmFpdHM8QXR0cmlidXRlc0dyb3VwLCBBdHRyaWJ1dGVzR3JvdXBzPiB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiQXR0cmlidXRlc0dyb3VwIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAiQXR0cmlidXRlc0dyb3VwcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcyB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzdHJlYW1UeXBlID0gInN0cmVhbVR5cGUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnZvbHVtZUdyb3VwID0gInZvbHVtZUdyb3VwIjsKKyAgICB9OworICAgIHN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBDb2xsZWN0aW9uICZwcyk7Cit9OworCitzdHJ1Y3QgUHJvZHVjdFN0cmF0ZWd5VHJhaXRzIDogcHVibGljIEJhc2VTZXJpYWxpemVyVHJhaXRzPFByb2R1Y3RTdHJhdGVneSwgUHJvZHVjdFN0cmF0ZWdpZXM+IHsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJQcm9kdWN0U3RyYXRlZ3kiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJQcm9kdWN0U3RyYXRlZ2llcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcyB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICB9OworICAgIHN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBDb2xsZWN0aW9uICZwcyk7Cit9Oworc3RydWN0IFZhbHVlVHJhaXRzIDogcHVibGljIEJhc2VTZXJpYWxpemVyVHJhaXRzPFZhbHVlUGFpciwgVmFsdWVQYWlycz4geworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gInZhbHVlIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAidmFsdWVzIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpsaXRlcmFsID0gImxpdGVyYWwiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm51bWVyaWNhbCA9ICJudW1lcmljYWwiOworICAgIH07CisKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmY29sbGVjdGlvbik7Cit9Oworc3RydWN0IENyaXRlcmlvblR5cGVUcmFpdHMgOiBwdWJsaWMgQmFzZVNlcmlhbGl6ZXJUcmFpdHM8Q3JpdGVyaW9uVHlwZSwgQ3JpdGVyaW9uVHlwZXM+IHsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJjcml0ZXJpb25fdHlwZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gImNyaXRlcmlvbl90eXBlcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcyB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0eXBlID0gInR5cGUiOworICAgIH07CisKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmY29sbGVjdGlvbik7Cit9Oworc3RydWN0IENyaXRlcmlvblRyYWl0cyA6IHB1YmxpYyBCYXNlU2VyaWFsaXplclRyYWl0czxDcml0ZXJpb24sIENyaXRlcmlhPiB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiY3JpdGVyaW9uIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAiY3JpdGVyaWEiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm5hbWUgPSAibmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdHlwZSA9ICJ0eXBlIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpkZWZhdWx0VmFsID0gImRlZmF1bHQiOworICAgIH07CisKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmY29sbGVjdGlvbik7Cit9Oworc3RydWN0IFZvbHVtZVRyYWl0cyA6IHB1YmxpYyBCYXNlU2VyaWFsaXplclRyYWl0czxWb2x1bWVDdXJ2ZSwgVm9sdW1lQ3VydmVzPiB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAidm9sdW1lIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAidm9sdW1lcyI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp2b2x1bWVQb2ludFRhZyA9ICJwb2ludCI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcyB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqZGV2aWNlQ2F0ZWdvcnkgPSAiZGV2aWNlQ2F0ZWdvcnkiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnN0cmVhbSA9ICJzdHJlYW0iOyAvLyBGb3IgbGVnYWN5IHZvbHVtZSBjdXJ2ZXMKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyZWZlcmVuY2UgPSAicmVmIjsgLyoqPCBGb3Igdm9sdW1lIGN1cnZlcyBmYWN0b3JpemF0aW9uLiAqLworICAgIH07CisKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmY29sbGVjdGlvbik7Cit9Oworc3RydWN0IFZvbHVtZUdyb3VwVHJhaXRzIDogcHVibGljIEJhc2VTZXJpYWxpemVyVHJhaXRzPFZvbHVtZUdyb3VwLCBWb2x1bWVHcm91cHM+IHsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJ2b2x1bWVHcm91cCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gInZvbHVtZUdyb3VwcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcyB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzdHJlYW0gPSAic3RyZWFtIjsgLy8gRm9yIGxlZ2FjeSB2b2x1bWUgY3VydmVzCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqaW5kZXhNaW4gPSAiaW5kZXhNaW4iOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmluZGV4TWF4ID0gImluZGV4TWF4IjsKKyAgICB9OworCisgICAgc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gJmNvbGxlY3Rpb24pOworfTsKKwordXNpbmcgeG1sQ2hhclVuaXF1ZSA9IHN0ZDo6dW5pcXVlX3B0cjx4bWxDaGFyLCBkZWNsdHlwZSh4bWxGcmVlKT47CisKK3N0ZDo6c3RyaW5nIGdldFhtbEF0dHJpYnV0ZShjb25zdCB4bWxOb2RlICpjdXIsIGNvbnN0IGNoYXIgKmF0dHJpYnV0ZSkKK3sKKyAgICB4bWxDaGFyVW5pcXVlIGNoYXJQdHIoeG1sR2V0UHJvcChjdXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhciAqPihhdHRyaWJ1dGUpKSwgeG1sRnJlZSk7CisgICAgaWYgKGNoYXJQdHIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gIiI7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHZhbHVlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGNoYXJQdHIuZ2V0KCkpKTsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIGdldFJlZmVyZW5jZShjb25zdCBfeG1sTm9kZSAqcm9vdCwgY29uc3QgX3htbE5vZGUgKiZyZWZOb2RlLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnKQoreworICAgIGZvciAocm9vdCA9IHJvb3QtPnhtbENoaWxkcmVuTm9kZTsgcm9vdCAhPSBOVUxMOyByb290ID0gcm9vdC0+bmV4dCkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChyb290LT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKWNvbGxlY3Rpb25UYWcpKSB7CisgICAgICAgICAgICBmb3IgKHhtbE5vZGUgKmN1ciA9IHJvb3QtPnhtbENoaWxkcmVuTm9kZTsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICAgICAgICAgIGlmICgoIXhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopZ1JlZmVyZW5jZUVsZW1lbnROYW1lKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIGdSZWZlcmVuY2VBdHRyaWJ1dGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlZk5hbWUgPT0gbmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVmTm9kZSA9IGN1cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFpdD4KK3N0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZUNvbGxlY3Rpb24oX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBUcmFpdDo6Q29sbGVjdGlvbiAmY29sbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICZuYlNraXBwZWRFbGVtZW50KQoreworICAgIGZvciAoY3VyID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OmNvbGxlY3Rpb25UYWcpICYmCisgICAgICAgICAgICB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojp0YWcpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCB4bWxOb2RlICpjaGlsZCA9IGN1cjsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OmNvbGxlY3Rpb25UYWcpKSB7CisgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLT54bWxDaGlsZHJlbk5vZGU7CisgICAgICAgIH0KKyAgICAgICAgZm9yICg7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojp0YWcpKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVHJhaXQ6OmRlc2VyaWFsaXplKGRvYywgY2hpbGQsIGNvbGxlY3Rpb24pOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgbmJTa2lwcGVkRWxlbWVudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OnRhZykpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqYXR0cmlidXRlc0F0dHJpYnV0ZVJlZiA9ICJhdHRyaWJ1dGVzUmVmIjsgLyoqPCBmb3IgZmFjdG9yaXphdGlvbi4gKi8KKworc3RhdGljIHN0YXR1c190IHBhcnNlQXR0cmlidXRlcyhjb25zdCBfeG1sTm9kZSAqY3VyLCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMpCit7CisgICAgZm9yICg7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQ29udGVudFR5cGUiKSkpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRUeXBlWG1sID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgInZhbHVlIik7CisgICAgICAgICAgICBhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZTsKKyAgICAgICAgICAgIGlmIChub3QgQXVkaW9Db250ZW50VHlwZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhjb250ZW50VHlwZVhtbC5jX3N0cigpLCBjb250ZW50VHlwZSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjb250ZW50IHR5cGUgJXMiLCBjb250ZW50VHlwZVhtbC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBjb250ZW50VHlwZTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBjb250ZW50IHR5cGUgJXMiLCAgX19GVU5DVElPTl9fLCBjb250ZW50VHlwZVhtbC5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJVc2FnZSIpKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdXNhZ2VYbWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCAidmFsdWUiKTsKKyAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2U7CisgICAgICAgICAgICBpZiAobm90IFVzYWdlVHlwZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyh1c2FnZVhtbC5jX3N0cigpLCB1c2FnZSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCB1c2FnZSAlcyIsIHVzYWdlWG1sLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRyaWJ1dGVzLnVzYWdlID0gdXNhZ2U7CisgICAgICAgICAgICBBTE9HVigiJXMgdXNhZ2UgJXMiLCAgX19GVU5DVElPTl9fLCB1c2FnZVhtbC5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJGbGFncyIpKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmxhZ3MgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCAidmFsdWUiKTsKKworICAgICAgICAgICAgQUxPR1YoIiVzIGZsYWdzICVzIiwgIF9fRlVOQ1RJT05fXywgZmxhZ3MuY19zdHIoKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGVzLmZsYWdzID0gQXVkaW9GbGFnQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhmbGFncywgIiAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJCdW5kbGUiKSkpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGJ1bmRsZUtleSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsICJrZXkiKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGJ1bmRsZVZhbHVlID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgInZhbHVlIik7CisKKyAgICAgICAgICAgIEFMT0dWKCIlcyBCdW5kbGUgJXMgJXMiLCAgX19GVU5DVElPTl9fLCBidW5kbGVLZXkuY19zdHIoKSwgYnVuZGxlVmFsdWUuY19zdHIoKSk7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRhZ3MoYnVuZGxlS2V5ICsgIj0iICsgYnVuZGxlVmFsdWUpOworICAgICAgICAgICAgc3RkOjpzdHJuY3B5KGF0dHJpYnV0ZXMudGFncywgdGFncy5jX3N0cigpLCBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZUF0dHJpYnV0ZXMoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMpIHsKKyAgICAvLyBSZXRyaWV2ZSBjb250ZW50IHR5cGUsIHVzYWdlLCBmbGFncywgYW5kIGJ1bmRsZSBmcm9tIHhtbAorICAgIGZvciAoOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGlmIChub3QgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkF0dHJpYnV0ZXMiKSkpIHsKKyAgICAgICAgICAgIGNvbnN0IHhtbE5vZGUgKmF0dHJOb2RlID0gY3VyOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgYXR0clJlZiA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIGF0dHJpYnV0ZXNBdHRyaWJ1dGVSZWYpOworICAgICAgICAgICAgaWYgKCFhdHRyUmVmLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBnZXRSZWZlcmVuY2UoeG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKSwgYXR0ck5vZGUsIGF0dHJSZWYsIGF0dHJpYnV0ZXNBdHRyaWJ1dGVSZWYpOworICAgICAgICAgICAgICAgIGlmIChhdHRyTm9kZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogTm8gcmVmZXJlbmNlIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgYXR0clJlZi5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplQXR0cmlidXRlcyhkb2MsIGF0dHJOb2RlLT54bWxDaGlsZHJlbk5vZGUsIGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlQXR0cmlidXRlcyhhdHRyTm9kZS0+eG1sQ2hpbGRyZW5Ob2RlLCBhdHRyaWJ1dGVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm90IHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJDb250ZW50VHlwZSIpKSB8fAorICAgICAgICAgICAgICAgIG5vdCB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiVXNhZ2UiKSkgfHwKKyAgICAgICAgICAgICAgICBub3QgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkZsYWdzIikpIHx8CisgICAgICAgICAgICAgICAgbm90IHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJCdW5kbGUiKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUF0dHJpYnV0ZXMoY3VyLCBhdHRyaWJ1dGVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemVBdHRyaWJ1dGVzQ29sbGVjdGlvbihfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzVmVjdG9yICZjb2xsZWN0aW9uKQoreworICAgIHN0YXR1c190IHJldCA9IEJBRF9WQUxVRTsKKyAgICAvLyBFaXRoZXIgd2UgZG8gcHJvdmlkZSBvbmx5IG9uZSBhdHRyaWJ1dGVzIG9yIGEgY29sbGVjdGlvbiBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcworICAgIGZvciAoY3VyID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKG5vdCB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQXR0cmlidXRlcyIpKSB8fAorICAgICAgICAgICAgICAgIG5vdCB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQ29udGVudFR5cGUiKSkgfHwKKyAgICAgICAgICAgICAgICBub3QgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIlVzYWdlIikpIHx8CisgICAgICAgICAgICAgICAgbm90IHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJGbGFncyIpKSB8fAorICAgICAgICAgICAgICAgIG5vdCB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQnVuZGxlIikpKSB7CisgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CisgICAgICAgICAgICByZXQgPSBkZXNlcmlhbGl6ZUF0dHJpYnV0ZXMoZG9jLCBjdXIsIGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24ucHVzaF9iYWNrKGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBkb25lIGlmIHRoZSAiQXR0cmlidXRlcyIgYmFsaXNlIGlzIG9taXR0ZWQsIG9ubHkgb25lIEF0dHJpYnV0ZXMgaXMgYWxsb3dlZAorICAgICAgICAgICAgICAgIGlmICh4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQXR0cmlidXRlcyIpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBBdHRyaWJ1dGVzR3JvdXBUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uICZhdHRyaWJ1dGVzR3JvdXApCit7CisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgaWYgKG5hbWUuZW1wdHkoKSkgeworICAgICAgICBBTE9HVigiQXR0cmlidXRlc0dyb3VwVHJhaXRzIE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIH0KKyAgICBBTE9HVigiJXM6ICVzID0gJXMiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CisKKyAgICBzdGQ6OnN0cmluZyB2b2x1bWVHcm91cCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6dm9sdW1lR3JvdXApOworICAgIGlmICh2b2x1bWVHcm91cC5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gYXR0cmlidXRlICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjp2b2x1bWVHcm91cCk7CisgICAgfQorICAgIEFMT0dWKCIlczogJXMgPSAlcyIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6dm9sdW1lR3JvdXAsIHZvbHVtZUdyb3VwLmNfc3RyKCkpOworCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CisgICAgc3RkOjpzdHJpbmcgc3RyZWFtVHlwZVhtbCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6c3RyZWFtVHlwZSk7CisgICAgaWYgKHN0cmVhbVR5cGVYbWwuZW1wdHkoKSkgeworICAgICAgICBBTE9HVigiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6c3RyZWFtVHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIiVzOiAlcyA9ICVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpzdHJlYW1UeXBlLCBzdHJlYW1UeXBlWG1sLmNfc3RyKCkpOworICAgICAgICBpZiAobm90IFN0cmVhbVR5cGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyZWFtVHlwZVhtbC5jX3N0cigpLCBzdHJlYW1UeXBlKSkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgc3RyZWFtIHR5cGUgJXMiLCBzdHJlYW1UeXBlWG1sLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGF0dHJpYnV0ZXNWZWN0OworICAgIGRlc2VyaWFsaXplQXR0cmlidXRlc0NvbGxlY3Rpb24oZG9jLCBjaGlsZCwgYXR0cmlidXRlc1ZlY3QpOworCisgICAgYXR0cmlidXRlc0dyb3VwLnB1c2hfYmFjayh7bmFtZSwgc3RyZWFtVHlwZSwgdm9sdW1lR3JvdXAsIGF0dHJpYnV0ZXNWZWN0fSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBWYWx1ZVRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqLypkb2MqLywgY29uc3QgX3htbE5vZGUgKmNoaWxkLCBDb2xsZWN0aW9uICZ2YWx1ZXMpCit7CisgICAgc3RkOjpzdHJpbmcgbGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bGl0ZXJhbCk7CisgICAgaWYgKGxpdGVyYWwuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bGl0ZXJhbCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHVpbnQzMl90IG51bWVyaWNhbCA9IDA7CisgICAgc3RkOjpzdHJpbmcgbnVtZXJpY2FsVGFnID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpudW1lcmljYWwpOworICAgIGlmIChudW1lcmljYWxUYWcuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bGl0ZXJhbCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICghY29udmVydFRvKG51bWVyaWNhbFRhZywgbnVtZXJpY2FsKSkgeworICAgICAgICBBTE9HRSgiJXM6IDogSW52YWxpZCB2YWx1ZSglcykiLCBfX0ZVTkNUSU9OX18sIG51bWVyaWNhbFRhZy5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgdmFsdWVzLnB1c2hfYmFjayh7bnVtZXJpY2FsLCBsaXRlcmFsfSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBDcml0ZXJpb25UeXBlVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gJmNyaXRlcmlvblR5cGVzKQoreworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBhdHRyaWJ1dGUgJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigiJXM6ICVzICVzID0gJXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKKworICAgIHN0ZDo6c3RyaW5nIHR5cGUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OnR5cGUpOworICAgIGlmICh0eXBlLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBhdHRyaWJ1dGUgJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnR5cGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigiJXM6ICVzICVzID0gJXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6dHlwZSwgdHlwZS5jX3N0cigpKTsKKyAgICBib29sIGlzSW5jbHVzaXZlKHR5cGUgPT0gImluY2x1c2l2ZSIpOworCisgICAgVmFsdWVQYWlycyBwYWlyczsKKyAgICBzaXplX3QgbmJTa2lwcGVkRWxlbWVudHMgPSAwOworICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxWYWx1ZVRyYWl0cz4oZG9jLCBjaGlsZCwgcGFpcnMsIG5iU2tpcHBlZEVsZW1lbnRzKTsKKyAgICBjcml0ZXJpb25UeXBlcy5wdXNoX2JhY2soe25hbWUsIGlzSW5jbHVzaXZlLCBwYWlyc30pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQ3JpdGVyaW9uVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICovKmRvYyovLCBjb25zdCBfeG1sTm9kZSAqY2hpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gJmNyaXRlcmlhKQoreworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBhdHRyaWJ1dGUgJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigiJXM6ICVzID0gJXMiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CisKKyAgICBzdGQ6OnN0cmluZyBkZWZhdWx0VmFsdWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OmRlZmF1bHRWYWwpOworICAgIGlmIChkZWZhdWx0VmFsdWUuZW1wdHkoKSkgeworICAgICAgICAvLyBOb3QgbWFuZGF0b3J5IHRvIHByb3ZpZGUgYSBkZWZhdWx0IHZhbHVlIGZvciBhIGNyaXRlcmlvbiwgZXZlbiBpdCBpcyByZWNvbW1hbmRlZC4uLgorICAgICAgICBBTE9HVigiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCAoYnV0IHJlY29tbWFuZGVkKSIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6ZGVmYXVsdFZhbCk7CisgICAgfQorICAgIEFMT0dWKCIlczogJXMgPSAlcyIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6ZGVmYXVsdFZhbCwgZGVmYXVsdFZhbHVlLmNfc3RyKCkpOworCisgICAgc3RkOjpzdHJpbmcgdHlwZU5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OnR5cGUpOworICAgIGlmICh0eXBlTmFtZS5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gYXR0cmlidXRlICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiAlcyA9ICVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjp0eXBlLCB0eXBlTmFtZS5jX3N0cigpKTsKKworICAgIGNyaXRlcmlhLnB1c2hfYmFjayh7bmFtZSwgdHlwZU5hbWUsIGRlZmF1bHRWYWx1ZX0pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgUHJvZHVjdFN0cmF0ZWd5VHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmc3RyYXRlZ2llcykKK3sKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICBpZiAobmFtZS5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCJQcm9kdWN0U3RyYXRlZ3lUcmFpdHMgTm8gYXR0cmlidXRlICVzIGZvdW5kIiwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCIlczogJXMgPSAlcyIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKKworICAgIHNpemVfdCBza2lwcGVkID0gMDsKKyAgICBBdHRyaWJ1dGVzR3JvdXBzIGF0dHJHcm91cHM7CisgICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF0dHJpYnV0ZXNHcm91cFRyYWl0cz4oZG9jLCBjaGlsZCwgYXR0ckdyb3Vwcywgc2tpcHBlZCk7CisKKyAgICBzdHJhdGVnaWVzLnB1c2hfYmFjayh7bmFtZSwgYXR0ckdyb3Vwc30pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgVm9sdW1lVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBDb2xsZWN0aW9uICZ2b2x1bWVzKQoreworICAgIHN0ZDo6c3RyaW5nIGRldmljZUNhdGVnb3J5ID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmRldmljZUNhdGVnb3J5KTsKKyAgICBpZiAoZGV2aWNlQ2F0ZWdvcnkuZW1wdHkoKSkgeworICAgICAgICBBTE9HVygiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpkZXZpY2VDYXRlZ29yeSk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHJlZmVyZW5jZU5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6cmVmZXJlbmNlKTsKKyAgICBjb25zdCBfeG1sTm9kZSAqcmVmID0gTlVMTDsKKyAgICBpZiAoIXJlZmVyZW5jZU5hbWUuZW1wdHkoKSkgeworICAgICAgICBnZXRSZWZlcmVuY2UoeG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKSwgcmVmLCByZWZlcmVuY2VOYW1lLCBjb2xsZWN0aW9uVGFnKTsKKyAgICAgICAgaWYgKHJlZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE5vIHJlZmVyZW5jZSBQdHIgZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCByZWZlcmVuY2VOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBSZXRyaWV2ZSBjdXJ2ZSBwb2ludCBmcm9tIHJlZmVyZW5jZSBlbGVtZW50IGlmIGZvdW5kIG9yIGRpcmVjdGx5IGZyb20gY3VycmVudCBjdXJ2ZQorICAgIEN1cnZlUG9pbnRzIGN1cnZlUG9pbnRzOworICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY2hpbGQgPSByZWZlcmVuY2VOYW1lLmVtcHR5KCkgPworICAgICAgICAgcm9vdC0+eG1sQ2hpbGRyZW5Ob2RlIDogcmVmLT54bWxDaGlsZHJlbk5vZGU7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopdm9sdW1lUG9pbnRUYWcpKSB7CisgICAgICAgICAgICB4bWxDaGFyVW5pcXVlIHBvaW50WG1sKHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSksIHhtbEZyZWUpOworICAgICAgICAgICAgaWYgKHBvaW50WG1sID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIiVzOiAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBvaW50WG1sLmdldCgpKSk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHBvaW50OworICAgICAgICAgICAgY29sbGVjdGlvbkZyb21TdHJpbmc8RGVmYXVsdFRyYWl0czxpbnQ+PigKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBvaW50WG1sLmdldCgpKSwgcG9pbnQsICIsIik7CisgICAgICAgICAgICBpZiAocG9pbnQuc2l6ZSgpICE9IDIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXM6ICVzIiwgX19mdW5jX18sIHZvbHVtZVBvaW50VGFnLAorICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBvaW50WG1sLmdldCgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnZlUG9pbnRzLnB1c2hfYmFjayh7cG9pbnRbMF0sIHBvaW50WzFdfSk7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9sdW1lcy5wdXNoX2JhY2soeyBkZXZpY2VDYXRlZ29yeSwgY3VydmVQb2ludHMgfSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBWb2x1bWVHcm91cFRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgQ29sbGVjdGlvbiAmdm9sdW1lcykKK3sKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIGludCBpbmRleE1pbiA9IDA7CisgICAgaW50IGluZGV4TWF4ID0gMDsKKyAgICBTdHJlYW1WZWN0b3Igc3RyZWFtcyA9IHt9OworICAgIEF0dHJpYnV0ZXNWZWN0b3IgYXR0cmlidXRlc1ZlY3QgPSB7fTsKKworICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY2hpbGQgPSByb290LT54bWxDaGlsZHJlbk5vZGU7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgaWYgKG5vdCB4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopQXR0cmlidXRlczo6bmFtZSkpIHsKKyAgICAgICAgICAgIHhtbENoYXJVbmlxdWUgbmFtZVhtbCh4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpLCB4bWxGcmVlKTsKKyAgICAgICAgICAgIGlmIChuYW1lWG1sID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmFtZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KG5hbWVYbWwuZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChub3QgeG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKUF0dHJpYnV0ZXM6OmluZGV4TWluKSkgeworICAgICAgICAgICAgeG1sQ2hhclVuaXF1ZSBpbmRleE1pblhtbCh4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpLCB4bWxGcmVlKTsKKyAgICAgICAgICAgIGlmIChpbmRleE1pblhtbCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGV4TWluTGl0ZXJhbChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihpbmRleE1pblhtbC5nZXQoKSkpOworICAgICAgICAgICAgaWYgKCFjb252ZXJ0VG8oaW5kZXhNaW5MaXRlcmFsLCBpbmRleE1pbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChub3QgeG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKUF0dHJpYnV0ZXM6OmluZGV4TWF4KSkgeworICAgICAgICAgICAgeG1sQ2hhclVuaXF1ZSBpbmRleE1heFhtbCh4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpLCB4bWxGcmVlKTsKKyAgICAgICAgICAgIGlmIChpbmRleE1heFhtbCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGV4TWF4TGl0ZXJhbChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihpbmRleE1heFhtbC5nZXQoKSkpOworICAgICAgICAgICAgaWYgKCFjb252ZXJ0VG8oaW5kZXhNYXhMaXRlcmFsLCBpbmRleE1heCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGRlc2VyaWFsaXplQXR0cmlidXRlc0NvbGxlY3Rpb24oZG9jLCByb290LCBhdHRyaWJ1dGVzVmVjdCk7CisKKyAgICBzdGQ6OnN0cmluZyBzdHJlYW1OYW1lczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmVhbSA6IHN0cmVhbXMpIHsKKyAgICAgICAgc3RyZWFtTmFtZXMgKz0gYW5kcm9pZDo6dG9TdHJpbmcoc3RyZWFtKSArICIgIjsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgYXR0cm1OYW1lczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHIgOiBhdHRyaWJ1dGVzVmVjdCkgeworICAgICAgICBhdHRybU5hbWVzICs9IGFuZHJvaWQ6OnRvU3RyaW5nKGF0dHIpICsgIlxuIjsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBncm91cD0lcyBpbmRleE1pbj0lZCwgaW5kZXhNYXg9JWQgc3RyZWFtcz0lcyBhdHRyaWJ1dGVzPSVzIiwKKyAgICAgICAgICBfX2Z1bmNfXywgbmFtZS5jX3N0cigpLCBpbmRleE1pbiwgaW5kZXhNYXgsIHN0cmVhbU5hbWVzLmNfc3RyKCksIGF0dHJtTmFtZXMuY19zdHIoICkpOworCisgICAgVm9sdW1lQ3VydmVzIGdyb3VwVm9sdW1lQ3VydmVzOworICAgIHNpemVfdCBza2lwcGVkID0gMDsKKyAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Vm9sdW1lVHJhaXRzPihkb2MsIHJvb3QsIGdyb3VwVm9sdW1lQ3VydmVzLCBza2lwcGVkKTsKKyAgICB2b2x1bWVzLnB1c2hfYmFjayh7IG5hbWUsIGluZGV4TWluLCBpbmRleE1heCwgZ3JvdXBWb2x1bWVDdXJ2ZXMgfSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmxlZ2FjeVZvbHVtZWNvbGxlY3Rpb25UYWcgPSAidm9sdW1lcyI7CitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmxlZ2FjeVZvbHVtZVRhZyA9ICJ2b2x1bWUiOworCitzdGF0dXNfdCBkZXNlcmlhbGl6ZUxlZ2FjeVZvbHVtZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVm9sdW1lQ3VydmVzPiAmbGVnYWN5Vm9sdW1lcykKK3sKKyAgICBzdGQ6OnN0cmluZyBzdHJlYW1UeXBlTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsICJzdHJlYW0iKTsKKyAgICBpZiAoc3RyZWFtVHlwZUxpdGVyYWwuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSBzdHJlYW0gZm91bmQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIGRldmljZUNhdGVnb3J5TGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsICJkZXZpY2VDYXRlZ29yeSIpOworICAgIGlmIChkZXZpY2VDYXRlZ29yeUxpdGVyYWwuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSBkZXZpY2VDYXRlZ29yeSBmb3VuZCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgcmVmZXJlbmNlTmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsICJyZWYiKTsKKyAgICBjb25zdCB4bWxOb2RlICpyZWYgPSBOVUxMOworICAgIGlmICghcmVmZXJlbmNlTmFtZS5lbXB0eSgpKSB7CisgICAgICAgIGdldFJlZmVyZW5jZSh4bWxEb2NHZXRSb290RWxlbWVudChkb2MpLCByZWYsIHJlZmVyZW5jZU5hbWUsIGxlZ2FjeVZvbHVtZWNvbGxlY3Rpb25UYWcpOworICAgICAgICBpZiAocmVmID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogTm8gcmVmZXJlbmNlIFB0ciBmb3VuZCBmb3IgJXMiLCBfX2Z1bmNfXywgcmVmZXJlbmNlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiVzOiByZWZlcmVuY2UgZm91bmQgZm9yICVzIiwgX19mdW5jX18sIHJlZmVyZW5jZU5hbWUuY19zdHIoKSk7CisgICAgfQorICAgIEN1cnZlUG9pbnRzIGN1cnZlUG9pbnRzOworICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY2hpbGQgPSByZWZlcmVuY2VOYW1lLmVtcHR5KCkgPworICAgICAgICAgY3VyLT54bWxDaGlsZHJlbk5vZGUgOiByZWYtPnhtbENoaWxkcmVuTm9kZTsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilWb2x1bWVUcmFpdHM6OnZvbHVtZVBvaW50VGFnKSkgeworICAgICAgICAgICAgeG1sQ2hhclVuaXF1ZSBwb2ludFhtbCh4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpLCB4bWxGcmVlKTsKKyAgICAgICAgICAgIGlmIChwb2ludFhtbCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCIlczogJXM9JXMiLCBfX2Z1bmNfXywgbGVnYWN5Vm9sdW1lVGFnLAorICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocG9pbnRYbWwuZ2V0KCkpKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gcG9pbnQ7CisgICAgICAgICAgICBjb2xsZWN0aW9uRnJvbVN0cmluZzxEZWZhdWx0VHJhaXRzPGludD4+KAorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocG9pbnRYbWwuZ2V0KCkpLCBwb2ludCwgIiwiKTsKKyAgICAgICAgICAgIGlmIChwb2ludC5zaXplKCkgIT0gMikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCAlczogJXMiLCBfX2Z1bmNfXywgVm9sdW1lVHJhaXRzOjp2b2x1bWVQb2ludFRhZywKKyAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwb2ludFhtbC5nZXQoKSkpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJ2ZVBvaW50cy5wdXNoX2JhY2soe3BvaW50WzBdLCBwb2ludFsxXX0pOworICAgICAgICB9CisgICAgfQorICAgIGxlZ2FjeVZvbHVtZXNbc3RyZWFtVHlwZUxpdGVyYWxdLnB1c2hfYmFjayh7IGRldmljZUNhdGVnb3J5TGl0ZXJhbCwgY3VydmVQb2ludHMgfSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemVMZWdhY3lWb2x1bWVDb2xsZWN0aW9uKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lR3JvdXBzICZ2b2x1bWVHcm91cHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAmbmJTa2lwcGVkRWxlbWVudCkKK3sKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVm9sdW1lQ3VydmVzPiBsZWdhY3lWb2x1bWVNYXA7CisgICAgZm9yIChjdXIgPSBjdXItPnhtbENoaWxkcmVuTm9kZTsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBpZiAoeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilsZWdhY3lWb2x1bWVjb2xsZWN0aW9uVGFnKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgeG1sTm9kZSAqY2hpbGQgPSBjdXItPnhtbENoaWxkcmVuTm9kZTsKKyAgICAgICAgZm9yICg7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKWxlZ2FjeVZvbHVtZVRhZykpIHsKKworICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplTGVnYWN5Vm9sdW1lKGRvYywgY2hpbGQsIGxlZ2FjeVZvbHVtZU1hcCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBuYlNraXBwZWRFbGVtZW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byAmdm9sdW1lTWFwSXRlciA6IGxlZ2FjeVZvbHVtZU1hcCkgeworICAgICAgICAvLyBJbiBvcmRlciB0byBsZXQgQXVkaW9TZXJ2aWNlIHNldHRpbmcgdGhlIG1pbiBhbmQgbWF4IChjb21wYXRpYmlsaXR5KSwgc2V0IE1pbiBhbmQgTWF4CisgICAgICAgIC8vIHRvIC0xIGV4Y2VwdCBmb3IgcHJpdmF0ZSBzdHJlYW1zCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZTsKKyAgICAgICAgaWYgKCFTdHJlYW1UeXBlQ29udmVydGVyOjpmcm9tU3RyaW5nKHZvbHVtZU1hcEl0ZXIuZmlyc3QsIHN0cmVhbVR5cGUpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgc3RyZWFtICVzIiwgX19mdW5jX18sIHZvbHVtZU1hcEl0ZXIuZmlyc3QuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGludCBpbmRleE1pbiA9IHN0cmVhbVR5cGUgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQgPyAwIDogLTE7CisgICAgICAgIGludCBpbmRleE1heCA9IHN0cmVhbVR5cGUgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQgPyAxMDAgOiAtMTsKKyAgICAgICAgdm9sdW1lR3JvdXBzLnB1c2hfYmFjayh7IHZvbHVtZU1hcEl0ZXIuZmlyc3QsIGluZGV4TWluLCBpbmRleE1heCwgdm9sdW1lTWFwSXRlci5zZWNvbmQgfSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworUGFyc2luZ1Jlc3VsdCBwYXJzZShjb25zdCBjaGFyKiBwYXRoKSB7CisgICAgeG1sRG9jUHRyIGRvYzsKKyAgICBkb2MgPSB4bWxQYXJzZUZpbGUocGF0aCk7CisgICAgaWYgKGRvYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlIGRvY3VtZW50ICVzIiwgX19GVU5DVElPTl9fLCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIHtudWxscHRyLCAwfTsKKyAgICB9CisgICAgeG1sTm9kZVB0ciBjdXIgPSB4bWxEb2NHZXRSb290RWxlbWVudChkb2MpOworICAgIGlmIChjdXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZTogZW1wdHkgZG9jdW1lbnQgJXMiLCBfX0ZVTkNUSU9OX18sIHBhdGgpOworICAgICAgICB4bWxGcmVlRG9jKGRvYyk7CisgICAgICAgIHJldHVybiB7bnVsbHB0ciwgMH07CisgICAgfQorICAgIGlmICh4bWxYSW5jbHVkZVByb2Nlc3MoZG9jKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBsaWJ4bWwgZmFpbGVkIHRvIHJlc29sdmUgWEluY2x1ZGVzIG9uIGRvY3VtZW50ICVzIiwgX19GVU5DVElPTl9fLCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIHtudWxscHRyLCAwfTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgdmVyc2lvbiA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIGdWZXJzaW9uQXR0cmlidXRlKTsKKyAgICBpZiAodmVyc2lvbi5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gdmVyc2lvbiBmb3VuZCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIHtudWxscHRyLCAwfTsKKyAgICB9CisgICAgc2l6ZV90IG5iU2tpcHBlZEVsZW1lbnRzID0gMDsKKyAgICBhdXRvIGNvbmZpZyA9IHN0ZDo6bWFrZV91bmlxdWU8Q29uZmlnPigpOworICAgIGNvbmZpZy0+dmVyc2lvbiA9IHN0ZDo6c3RvZih2ZXJzaW9uKTsKKyAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248UHJvZHVjdFN0cmF0ZWd5VHJhaXRzPigKKyAgICAgICAgICAgICAgICBkb2MsIGN1ciwgY29uZmlnLT5wcm9kdWN0U3RyYXRlZ2llcywgbmJTa2lwcGVkRWxlbWVudHMpOworICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxDcml0ZXJpb25UcmFpdHM+KAorICAgICAgICAgICAgICAgIGRvYywgY3VyLCBjb25maWctPmNyaXRlcmlhLCBuYlNraXBwZWRFbGVtZW50cyk7CisgICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPENyaXRlcmlvblR5cGVUcmFpdHM+KAorICAgICAgICAgICAgICAgIGRvYywgY3VyLCBjb25maWctPmNyaXRlcmlvblR5cGVzLCBuYlNraXBwZWRFbGVtZW50cyk7CisgICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPFZvbHVtZUdyb3VwVHJhaXRzPigKKyAgICAgICAgICAgICAgICBkb2MsIGN1ciwgY29uZmlnLT52b2x1bWVHcm91cHMsIG5iU2tpcHBlZEVsZW1lbnRzKTsKKworICAgIHJldHVybiB7c3RkOjptb3ZlKGNvbmZpZyksIG5iU2tpcHBlZEVsZW1lbnRzfTsKK30KKworYW5kcm9pZDo6c3RhdHVzX3QgcGFyc2VMZWdhY3lWb2x1bWVGaWxlKGNvbnN0IGNoYXIqIHBhdGgsIFZvbHVtZUdyb3VwcyAmdm9sdW1lR3JvdXBzKSB7CisgICAgeG1sRG9jUHRyIGRvYzsKKyAgICBkb2MgPSB4bWxQYXJzZUZpbGUocGF0aCk7CisgICAgaWYgKGRvYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlIGRvY3VtZW50ICVzIiwgX19GVU5DVElPTl9fLCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgeG1sTm9kZVB0ciBjdXIgPSB4bWxEb2NHZXRSb290RWxlbWVudChkb2MpOworICAgIGlmIChjdXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZTogZW1wdHkgZG9jdW1lbnQgJXMiLCBfX0ZVTkNUSU9OX18sIHBhdGgpOworICAgICAgICB4bWxGcmVlRG9jKGRvYyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICh4bWxYSW5jbHVkZVByb2Nlc3MoZG9jKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBsaWJ4bWwgZmFpbGVkIHRvIHJlc29sdmUgWEluY2x1ZGVzIG9uIGRvY3VtZW50ICVzIiwgX19GVU5DVElPTl9fLCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc2l6ZV90IG5iU2tpcHBlZEVsZW1lbnRzID0gMDsKKyAgICByZXR1cm4gZGVzZXJpYWxpemVMZWdhY3lWb2x1bWVDb2xsZWN0aW9uKGRvYywgY3VyLCB2b2x1bWVHcm91cHMsIG5iU2tpcHBlZEVsZW1lbnRzKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmtDb25maWdMb2NhdGlvbkxpc3RbXSA9IHsiL29kbS9ldGMiLCAiL3ZlbmRvci9ldGMiLCAiL3N5c3RlbS9ldGMifTsKK3N0YXRpYyBjb25zdCBpbnQga0NvbmZpZ0xvY2F0aW9uTGlzdFNpemUgPQorICAgICAgICAoc2l6ZW9mKGtDb25maWdMb2NhdGlvbkxpc3QpIC8gc2l6ZW9mKGtDb25maWdMb2NhdGlvbkxpc3RbMF0pKTsKK3N0YXRpYyBjb25zdCBpbnQgZ0FwbVhtbENvbmZpZ0ZpbGVQYXRoTWF4TGVuZ3RoID0gMTI4OworCitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmFwbVhtbENvbmZpZ0ZpbGVOYW1lID0gImF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCI7CitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmFwbUEyZHBPZmZsb2FkRGlzYWJsZWRYbWxDb25maWdGaWxlTmFtZSA9CisgICAgICAgICJhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9hMmRwX29mZmxvYWRfZGlzYWJsZWQueG1sIjsKKworYW5kcm9pZDo6c3RhdHVzX3QgcGFyc2VMZWdhY3lWb2x1bWVzKFZvbHVtZUdyb3VwcyAmdm9sdW1lR3JvdXBzKSB7CisgICAgY2hhciBhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGVbZ0FwbVhtbENvbmZpZ0ZpbGVQYXRoTWF4TGVuZ3RoXTsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IGZpbGVOYW1lczsKKyAgICBzdGF0dXNfdCByZXQ7CisKKyAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInJvLmJsdWV0b290aC5hMmRwX29mZmxvYWQuc3VwcG9ydGVkIiwgZmFsc2UpICYmCisgICAgICAgICAgICBwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5ibHVldG9vdGguYTJkcF9vZmZsb2FkLmRpc2FibGVkIiwgZmFsc2UpKSB7CisgICAgICAgIC8vIEEyRFAgb2ZmbG9hZCBzdXBwb3J0ZWQgYnV0IGRpc2FibGVkOiB0cnkgdG8gdXNlIHNwZWNpYWwgWE1MIGZpbGUKKyAgICAgICAgZmlsZU5hbWVzLnB1c2hfYmFjayhhcG1BMmRwT2ZmbG9hZERpc2FibGVkWG1sQ29uZmlnRmlsZU5hbWUpOworICAgIH0KKyAgICBmaWxlTmFtZXMucHVzaF9iYWNrKGFwbVhtbENvbmZpZ0ZpbGVOYW1lKTsKKworICAgIGZvciAoY29uc3QgY2hhciogZmlsZU5hbWUgOiBmaWxlTmFtZXMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ29uZmlnTG9jYXRpb25MaXN0U2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBzbnByaW50ZihhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsIHNpemVvZihhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUpLAorICAgICAgICAgICAgICAgICAgICAgIiVzLyVzIiwga0NvbmZpZ0xvY2F0aW9uTGlzdFtpXSwgZmlsZU5hbWUpOworICAgICAgICAgICAgcmV0ID0gcGFyc2VMZWdhY3lWb2x1bWVGaWxlKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgdm9sdW1lR3JvdXBzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK30gLy8gbmFtZXNwYWNlIGVuZ2luZUNvbmZpZworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYTQyYjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeWVuZ2luZV9pbnRlcmZhY2VfaGVhZGVycyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaAppbmRleCAwNDU5NGY1Li5iN2ZkMDMxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmgKQEAgLTE3LDcgKzE3LDEwIEBACiAjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmg+Ci0jaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmg+CisjaW5jbHVkZSA8SVZvbHVtZUN1cnZlcy5oPgorI2luY2x1ZGUgPHBvbGljeS5oPgogI2luY2x1ZGUgPFZvbHVtZS5oPgogI2luY2x1ZGUgPEh3TW9kdWxlLmg+CiAjaW5jbHVkZSA8RGV2aWNlRGVzY3JpcHRvci5oPgpAQCAtMjgsNiArMzEsMTAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBEZXZpY2VTdHJhdGVneU1hcCA9IHN0ZDo6bWFwPHByb2R1Y3Rfc3RyYXRlZ3lfdCwgRGV2aWNlVmVjdG9yPjsKK3VzaW5nIFN0cmF0ZWd5VmVjdG9yID0gc3RkOjp2ZWN0b3I8cHJvZHVjdF9zdHJhdGVneV90PjsKK3VzaW5nIFZvbHVtZUdyb3VwVmVjdG9yID0gc3RkOjp2ZWN0b3I8dm9sdW1lX2dyb3VwX3Q+OworCiAvKioKICAqIFRoaXMgaW50ZXJmYWNlIGlzIGRlZGljYXRlZCB0byB0aGUgcG9saWN5IG1hbmFnZXIgdGhhdCBhIFBvbGljeSBFbmdpbmUgc2hhbGwgaW1wbGVtZW50LgogICovCkBAIC01MCw0MiArNTcsNiBAQAogICAgIHZpcnR1YWwgdm9pZCBzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpID0gMDsKIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgaW5wdXQgZGV2aWNlIHNlbGVjdGVkIGZvciBhIGdpdmVuIGlucHV0IHNvdXJjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gaW5wdXRTb3VyY2UgdG8gZ2V0IHRoZSBzZWxlY3RlZCBpbnB1dCBkZXZpY2UgYXNzb2NpYXRlZCB0bwotICAgICAqCi0gICAgICogQHJldHVybiBzZWxlY3RlZCBpbnB1dCBkZXZpY2UgZm9yIHRoZSBnaXZlbiBpbnB1dCBzb3VyY2UsIG1heSBiZSBub25lIGlmIGVycm9yLgotICAgICAqLwotICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKSBjb25zdCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG91dHB1dCBkZXZpY2UgYXNzb2NpYXRlZCB0byBhIGdpdmVuIHN0cmF0ZWd5LgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSBzdHJlYW0gdHlwZSBmb3Igd2hpY2ggdGhlIHNlbGVjdGVkIG91cHV0IGRldmljZSBpcyByZXF1ZXN0ZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHNlbGVjdGVkIG91cHV0IGRldmljZSBmb3IgdGhlIGdpdmVuIHN0cmF0ZWd5LCBtYXkgYmUgbm9uZSBpZiBlcnJvci4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0YXRlZ3kpIGNvbnN0ID0gMDsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3RyYXRlZ3kgc2VsZWN0ZWQgZm9yIGEgZ2l2ZW4gc3RyZWFtIHR5cGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHN0cmVhbTogZm9yIHdoaWNoIHRoZSBzZWxlY3RlZCBzdHJhdGVneSBmb2xsb3dlZCBieSBpcyByZXF1ZXN0ZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHN0cmF0ZWd5IHRvIGJlIGZvbGxvd2VkLgotICAgICAqLwotICAgIHZpcnR1YWwgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBzdHJhdGVneSBzZWxlY3RlZCBmb3IgYSBnaXZlbiB1c2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gdXNhZ2UgdG8gZ2V0IHRoZSBzZWxlY3RlZCBzdHJhdGVneSBmb2xsb3dlZCBieS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gc3RyYXRlZ3kgdG8gYmUgZm9sbG93ZWQuCi0gICAgICovCi0gICAgdmlydHVhbCByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSkgPSAwOwotCi0gICAgLyoqCiAgICAgICogU2V0IHRoZSBUZWxlcGhvbnkgTW9kZS4KICAgICAgKgogICAgICAqIEBwYXJhbVtpbl0gbW9kZTogQW5kcm9pZCBQaG9uZSBzdGF0ZSAobm9ybWFsLCByaW5ndG9uZSwgY3N2LCBpbiBjb21tdW5pY2F0aW9uKQpAQCAtMTMzLDYgKzEwNCwxOTYgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSkgPSAwOwogCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzdHJhdGVneSBzZWxlY3RlZCBmb3IgYSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBhdWRpbyBhdHRyaWJ1dGVzIHRvIGdldCB0aGUgc2VsZWN0ZWQgQHByb2R1Y3Rfc3RyYXRlZ3lfdCBmb2xsb3dlZCBieS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQHByb2R1Y3Rfc3RyYXRlZ3lfdCB0byBiZSBmb2xsb3dlZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMgcmV0cmlldmVzIHRoZSBkZXZpY2VzIHRvIGJlIHVzZWQgZm9yIGdpdmVuCisgICAgICogYXVkaW8gYXR0cmlidXRlcy4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBvZiB0aGUgb3V0cHV0IHJlcXVlc3RpbmcgRGV2aWNlKHMpIHNlbGVjdGlvbgorICAgICAqIEBwYXJhbSBwcmVmZXJlZERldmljZSB2YWxpZCByZWZlcmVuY2UgaWYgYSBwcmVmZXJlZCBkZXZpY2UgaXMgcmVxdWVzdGVkLCBudWxscHRyIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gZnJvbUNhY2hlIGlmIHRydWUsIHRoZSBkZXZpY2UgaXMgcmV0dXJuZWQgZnJvbSBpbnRlcm5hbCBjYWNoZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBpdCBpcyBkZXRlcm1pbmVkIGJ5IGN1cnJlbnQgc3RhdGUgKGRldmljZSBjb25uZWN0ZWQscGhvbmUgc3RhdGUsCisgICAgICogICAgICAgICAgICAgICAgICBmb3JjZSB1c2UsIGEyZHAgb3V0cHV0Li4uKQorICAgICAqIEByZXR1cm4gdmVjdG9yIG9mIHNlbGVjdGVkIGRldmljZSBkZXNjcmlwdG9ycy4KKyAgICAgKiAgICAgICAgIEFwcHJvcHJpYXRlIGRldmljZSBmb3Igc3RyZWFtcyBoYW5kbGVkIGJ5IHRoZSBzcGVjaWZpZWQgYXVkaW8gYXR0cmlidXRlcyBhY2NvcmRpbmcKKyAgICAgKiAgICAgICAgIHRvIGN1cnJlbnQgcGhvbmUgc3RhdGUsIGZvcmNlZCBzdGF0ZXMsIGNvbm5lY3RlZCBkZXZpY2VzLi4uCisgICAgICogICAgICAgICBpZiBmcm9tQ2FjaGUgaXMgdHJ1ZSwgdGhlIGRldmljZSBpcyByZXR1cm5lZCBmcm9tIGludGVybmFsIGNhY2hlLAorICAgICAqICAgICAgICAgb3RoZXJ3aXNlIGl0IGlzIGRldGVybWluZWQgYnkgY3VycmVudCBzdGF0ZSAoZGV2aWNlIGNvbm5lY3RlZCxwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLAorICAgICAqICAgICAgICAgYTJkcCBvdXRwdXQuLi4pCisgICAgICogVGhpcyBhbGxvd3MgdG86CisgICAgICogICAgICAxIHNwZWVkIHVwIHByb2Nlc3Mgd2hlbiB0aGUgc3RhdGUgaXMgc3RhYmxlICh3aGVuIHN0YXJ0aW5nIG9yIHN0b3BwaW5nIGFuIG91dHB1dCkKKyAgICAgKiAgICAgIDIgYWNjZXNzIHRvIGVpdGhlciBjdXJyZW50IGRldmljZSBzZWxlY3Rpb24gKGZyb21DYWNoZSA9PSB0cnVlKSBvcgorICAgICAqICAgICAgImZ1dHVyZSIgZGV2aWNlIHNlbGVjdGlvbiAoZnJvbUNhY2hlID09IGZhbHNlKSB3aGVuIGNhbGxlZCBmcm9tIGEgY29udGV4dAorICAgICAqICAgICAgd2hlcmUgY29uZGl0aW9ucyBhcmUgY2hhbmdpbmcgKHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpLCBzZXRQaG9uZVN0YXRlKCkuLi4pIEFORAorICAgICAqICAgICAgYmVmb3JlIG1hbmFnZXIgdXBkYXRlcyBpdHMgb3V0cHV0cy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIERldmljZVZlY3RvciBnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKKyAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZwcmVmZXJlZERldmljZSA9IG51bGxwdHIsCisgICAgICAgICAgICBib29sIGZyb21DYWNoZSA9IGZhbHNlKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbSBMZWdhY3kgZnVuY3Rpb24gcmV0cmlldmluZyBkZXZpY2VzIGZyb20gYSBzdHJlYW0gdHlwZS4KKyAgICAgKiBAcGFyYW0gc3RyZWFtIHR5cGUgb2YgdGhlIG91dHB1dCByZXF1ZXN0aW5nIERldmljZShzKSBzZWxlY3Rpb24KKyAgICAgKiBAcGFyYW0gZnJvbUNhY2hlIGlmIHRydWUsIHRoZSBkZXZpY2UgaXMgcmV0dXJuZWQgZnJvbSBpbnRlcm5hbCBjYWNoZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBpdCBpcyBkZXRlcm1pbmVkIGJ5IGN1cnJlbnQgc3RhdGUgKGRldmljZSBjb25uZWN0ZWQscGhvbmUgc3RhdGUsCisgICAgICogICAgICAgICAgICAgICAgICBmb3JjZSB1c2UsIGEyZHAgb3V0cHV0Li4uKQorICAgICAqIEByZXR1cm4gYXBwcm9wcmlhdGUgZGV2aWNlIGZvciBzdHJlYW1zIGhhbmRsZWQgYnkgdGhlIHNwZWNpZmllZCBhdWRpbyBhdHRyaWJ1dGVzIGFjY29yZGluZworICAgICAqICAgICAgICAgdG8gY3VycmVudCBwaG9uZSBzdGF0ZSwgZm9yY2VkIHN0YXRlcywgY29ubmVjdGVkIGRldmljZXMuLi4KKyAgICAgKiAgICAgICAgIGlmIGZyb21DYWNoZSBpcyB0cnVlLCB0aGUgZGV2aWNlIGlzIHJldHVybmVkIGZyb20gaW50ZXJuYWwgY2FjaGUsCisgICAgICogICAgICAgICBvdGhlcndpc2UgaXQgaXMgZGV0ZXJtaW5lZCBieSBjdXJyZW50IHN0YXRlIChkZXZpY2UgY29ubmVjdGVkLHBob25lIHN0YXRlLCBmb3JjZSB1c2UsCisgICAgICogICAgICAgICBhMmRwIG91dHB1dC4uLikKKyAgICAgKiBUaGlzIGFsbG93cyB0bzoKKyAgICAgKiAgICAgIDEgc3BlZWQgdXAgcHJvY2VzcyB3aGVuIHRoZSBzdGF0ZSBpcyBzdGFibGUgKHdoZW4gc3RhcnRpbmcgb3Igc3RvcHBpbmcgYW4gb3V0cHV0KQorICAgICAqICAgICAgMiBhY2Nlc3MgdG8gZWl0aGVyIGN1cnJlbnQgZGV2aWNlIHNlbGVjdGlvbiAoZnJvbUNhY2hlID09IHRydWUpIG9yCisgICAgICogICAgICAiZnV0dXJlIiBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gZmFsc2UpIHdoZW4gY2FsbGVkIGZyb20gYSBjb250ZXh0CisgICAgICogICAgICB3aGVyZSBjb25kaXRpb25zIGFyZSBjaGFuZ2luZyAoc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCksIHNldFBob25lU3RhdGUoKS4uLikgQU5ECisgICAgICogICAgICBiZWZvcmUgbWFuYWdlciB1cGRhdGVzIGl0cyBvdXRwdXRzLgorICAgICAqLworICAgIHZpcnR1YWwgRGV2aWNlVmVjdG9yIGdldE91dHB1dERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSA9IGZhbHNlKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGlucHV0IGRldmljZSBzZWxlY3RlZCBmb3IgZ2l2ZW4gYXVkaW8gYXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gYXR0ciBhdWRpbyBhdHRyaWJ1dGVzIHRvIGNvbnNpZGVyCisgICAgICogQHBhcmFtW291dF0gbWl4IHRvIGJlIHVzZWQgaWYgYSBtaXggaGFzIGJlZW4gaW5zdGFsbGVkIGZvciB0aGUgZ2l2ZW4gYXVkaW8gYXR0cmlidXRlcy4KKyAgICAgKiBAcmV0dXJuIHNlbGVjdGVkIGlucHV0IGRldmljZSBmb3IgdGhlIGF1ZGlvIGF0dHJpYnV0ZXMsIG1heSBiZSBudWxsIGlmIGVycm9yLgorICAgICAqLworICAgIHZpcnR1YWwgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBzcDxBdWRpb1BvbGljeU1peD4gKm1peCA9IG51bGxwdHIpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGVnYWN5IHN0cmVhbSB0eXBlIGZvciBhIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGF1ZGlvIGF0dHJpYnV0ZXMgdG8gZ2V0IHRoZSBhc3NvY2lhdGVkIGF1ZGlvX3N0cmVhbV90eXBlX3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGF1ZGlvX3N0cmVhbV90eXBlX3QgYXNzb2NpYXRlZCB0byB0aGUgYXR0cmlidXRlcy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRBdHRyaWJ1dGVzRm9yU3RyZWFtIGdldCB0aGUgYXVkaW8gYXR0cmlidXRlcyBmcm9tIGxlZ2FjeSBzdHJlYW0gdHlwZQorICAgICAqIEF0dHJpYnV0ZXMgcmV0dXJuZWQgbWlnaHQgb25seSBiZSB1c2VkIHRvIGNoZWNrIHVwb24gcm91dGluZyBkZWNpc2lvbiwgbm90IHZvbHVtZSBkZWNpc2lvbnMuCisgICAgICogQHBhcmFtIHN0cmVhbSB0byBjb25zaWRlcgorICAgICAqIEByZXR1cm4gYXVkaW8gYXR0cmlidXRlcyBtYXRjaGluZyB0aGUgbGVnYWN5IHN0cmVhbSB0eXBlCisgICAgICovCisgICAgdmlydHVhbCBhdWRpb19hdHRyaWJ1dGVzX3QgZ2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRTdHJlYW1UeXBlc0ZvclByb2R1Y3RTdHJhdGVneSByZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgbGVnYWN5IHN0cmVhbSB0eXBlIGZvbGxvd2luZworICAgICAqIHRoZSBnaXZlbiBwcm9kdWN0IHN0cmF0ZWd5CisgICAgICogQHBhcmFtIHBzIHByb2R1Y3Qgc3RyYXRlZ3kgdG8gY29uc2lkZXIKKyAgICAgKiBAcmV0dXJuIGFzc29jaWF0ZWQgbGVnYWN5IFN0cmVhbSBUeXBlcyB2ZWN0b3Igb2YgdGhlIGdpdmVuIHByb2R1Y3Qgc3RyYXRlZ3kKKyAgICAgKi8KKyAgICB2aXJ0dWFsIFN0cmVhbVR5cGVWZWN0b3IgZ2V0U3RyZWFtVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0QWxsQXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneSByZXRyaWV2ZXMgYWxsIHRoZSBhdHRyaWJ1dGVzIGZvbGxvd2luZyB0aGUgZ2l2ZW4KKyAgICAgKiBwcm9kdWN0IHN0cmF0ZWd5LiBBbnkgYXR0cmlidXRlcyB0aGF0ICJtYXRjaGVzIiB3aXRoIHRoaXMgb25lIHdpbGwgZm9sbG93IHRoZSBwcm9kdWN0CisgICAgICogc3RyYXRlZ3kuCisgICAgICogIm1hdGNoaW5nIiBtZWFucyB0aGUgdXNhZ2Ugc2hhbGwgbWF0Y2ggaWYgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgaGFzIGEgZGVmaW5lZCB1c2FnZSwgQU5ECisgICAgICogY29udGVudCB0eXBlIHNoYWxsIG1hdGNoIGlmIHJlZmVyZW5jZSBhdHRyaWJ1dGVzIGhhcyBhIGRlZmluZWQgY29udGVudCB0eXBlIEFORAorICAgICAqIGZsYWdzIHNoYWxsIG1hdGNoIGlmIHJlZmVyZW5jZSBhdHRyaWJ1dGVzIGhhcyBkZWZpbmVkIGZsYWdzIEFORAorICAgICAqIHRhZ3Mgc2hhbGwgbWF0Y2ggaWYgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgaGFzIGRlZmluZWQgdGFncy4KKyAgICAgKiBAcGFyYW0gcHMgcHJvZHVjdCBzdHJhdGVneSB0byBjb25zaWRlcgorICAgICAqIEByZXR1cm4gdmVjdG9yIG9mIHByb2R1Y3Qgc3RyYXRlZ3kgaWRzLCBlbXB0eSBpZiB1bmtub3duIHN0cmF0ZWd5LgorICAgICAqLworICAgIHZpcnR1YWwgQXR0cmlidXRlc1ZlY3RvciBnZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcykgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldE9yZGVyZWRBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzCisgICAgICogQHJldHVybiBwcmlvcml0eSBvcmRlcmVkIHByb2R1Y3Qgc3RyYXRlZ2llcyB0byBoZWxwIHRoZSBBdWRpb1BvbGljeU1hbmFnZXIgZXZhbHVhdGluZyB0aGUKKyAgICAgKiBkZXZpY2Ugc2VsZWN0aW9uIHBlciBvdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBwcmlvcml0aXplZCBzdHJhdGVnaWVzLgorICAgICAqLworICAgIHZpcnR1YWwgU3RyYXRlZ3lWZWN0b3IgZ2V0T3JkZXJlZFByb2R1Y3RTdHJhdGVnaWVzKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIHVwZGF0ZURldmljZVNlbGVjdGlvbkNhY2hlLiBEZXZpY2Ugc2VsZWN0aW9uIGZvciBBdWRpb0F0dHJpYnV0ZSAvIFN0cmVhbXMgaXMgY2FjaGVkCisgICAgICogaW4gdGhlIGVuZ2luZSBpbiBvcmRlciB0byBzcGVlZCB1cCBwcm9jZXNzIHdoZW4gdGhlIGF1ZGlvIHN5c3RlbSBpcyBzdGFibGUuCisgICAgICogV2hlbiBhIGRldmljZSBpcyBjb25uZWN0ZWQsIHRoZSBhbmRyb2lkIG1vZGUgaXMgY2hhbmdlZCwgZW5naW5lIGlzIG5vdGlmaWVkIGFuZCBjYW4gdXBkYXRlCisgICAgICogdGhlIGNhY2hlLgorICAgICAqIFdoZW4gc3RhcnRpbmcgLyBzdG9wcGluZyBhbiBvdXRwdXQgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uLCB0aGUgZW5naW5lCisgICAgICogbmVlZHMgdG8gdXBkYXRlIHRoZSBjYWNoZSB1cG9uIHRoaXMgZnVuY3Rpb24gY2FsbC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlRGV2aWNlU2VsZWN0aW9uQ2FjaGUoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMuIEludHJvc3BlY3Rpb24gQVBJIHRvIHJldHJpZXZlIGEgY29sbGVjdGlvbiBvZgorICAgICAqIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yIHRoYXQgYWxsb3dzIHRvIGJ1aWxkIEF1ZGlvQXR0cmlidXRlcyBhY2NvcmRpbmcgdG8gYQorICAgICAqIHByb2R1Y3Rfc3RyYXRlZ3kgd2hpY2ggaXMganVzdCBhbiBpbmRleC4gSXQgaGFzIGFsc28gYSBodW1hbiByZWFkYWJsZSBuYW1lIHRvIGhlbHAgdGhlCisgICAgICogQ2FyL09lbS9BdWRpb01hbmFnZXIgaWRlbnRpeWluZyB0aGUgdXNlIGNhc2UuCisgICAgICogQHBhcmFtIHN0cmF0ZWdpZXMgY29sbGVjdGlvbi4KKyAgICAgKiBAcmV0dXJuIE9LIGlmIHRoZSBsaXN0IGhhcyBiZWVuIHJldHJpZXZlZCwgZXJyb3IgY29kZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0Vm9sdW1lQ3VydmVzRm9yQXR0cmlidXRlcyByZXRyaWV2ZXMgdGhlIFZvbHVtZSBDdXJ2ZXMgaW50ZXJmYWNlIGZvciB0aGUKKyAgICAgKiAgICAgICAgcmVxdWVzdGVkIEF1ZGlvIEF0dHJpYnV0ZXMuCisgICAgICogQHBhcmFtIGF0dHIgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEByZXR1cm4gSVZvbHVtZUN1cnZlcyBpbnRlcmZhY2UgcG9pbnRlciBpZiBmb3VuZCwgbnVsbHB0ciBvdGhlcndpc2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIElWb2x1bWVDdXJ2ZXMgKmdldFZvbHVtZUN1cnZlc0ZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0Vm9sdW1lQ3VydmVzRm9yU3RyZWFtVHlwZSByZXRyaWV2ZXMgdGhlIFZvbHVtZSBDdXJ2ZXMgaW50ZXJmYWNlIGZvciB0aGUgc3RyZWFtCisgICAgICogQHBhcmFtIHN0cmVhbSB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiBJVm9sdW1lQ3VydmVzIGludGVyZmFjZSBwb2ludGVyIGlmIGZvdW5kLCBudWxscHRyIG90aGVyd2lzZQorICAgICAqLworICAgIHZpcnR1YWwgSVZvbHVtZUN1cnZlcyAqZ2V0Vm9sdW1lQ3VydmVzRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldFZvbHVtZUN1cnZlc0ZvclZvbHVtZUdyb3VwIHJldHJpZXZlcyB0aGUgVm9sdW1lIEN1cnZlcyBpbnRlcmZhY2UgZm9yIHZvbHVtZSBncm91cAorICAgICAqIEBwYXJhbSBncm91cCB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiBJVm9sdW1lQ3VydmVzIGludGVyZmFjZSBwb2ludGVyIGlmIGZvdW5kLCBudWxscHRyIG90aGVyd2lzZQorICAgICAqLworICAgIHZpcnR1YWwgSVZvbHVtZUN1cnZlcyAqZ2V0Vm9sdW1lQ3VydmVzRm9yVm9sdW1lR3JvdXAodm9sdW1lX2dyb3VwX3QgZ3JvdXApIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRWb2x1bWVHcm91cHMgcmV0cmlldmVzIHRoZSBjb2xsZWN0aW9uIG9mIHZvbHVtZSBncm91cHMuCisgICAgICogQHJldHVybiB2ZWN0b3Igb2Ygdm9sdW1lIGdyb3VwcworICAgICAqLworICAgIHZpcnR1YWwgVm9sdW1lR3JvdXBWZWN0b3IgZ2V0Vm9sdW1lR3JvdXBzKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyBnZXRzIHRoZSBhcHByb3ByaWF0ZSB2b2x1bWUgZ3JvdXAgdG8gYmUgdXNlZCBmb3IgYSBnaXZlbgorICAgICAqIEF1ZGlvIEF0dHJpYnV0ZXMuCisgICAgICogQHBhcmFtIGF0dHIgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEByZXR1cm4gdm9sdW1lIGdyb3VwIGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMsIGRlZmF1bHQgZ3JvdXAgaWYgbm9uZQorICAgICAqIGFwcGxpY2FibGUsIFZPTFVNRV9HUk9VUF9OT05FIGlmIG5vIGRlZmF1bHQgZ3JvdXAgZGVmaW5lZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvbHVtZV9ncm91cF90IGdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUgZ2V0cyB0aGUgYXBwcm9wcmlhdGUgdm9sdW1lIGdyb3VwIHRvIGJlIHVzZWQgZm9yIGEgZ2l2ZW4KKyAgICAgKiBsZWdhY3kgc3RyZWFtIHR5cGUKKyAgICAgKiBAcGFyYW0gc3RyZWFtIHR5cGUgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEByZXR1cm4gdm9sdW1lIGdyb3VwIGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIHN0cmVhbSB0eXBlLCBkZWZhdWx0IGdyb3VwIGlmIG5vbmUgYXBwbGljYWJsZSwKKyAgICAgKiBWT0xVTUVfR1JPVVBfTk9ORSBpZiBubyBkZWZhdWx0IGdyb3VwIGRlZmluZWQuCisgICAgICovCisgICAgdmlydHVhbCB2b2x1bWVfZ3JvdXBfdCBnZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBsaXN0QXVkaW9Wb2x1bWVHcm91cHMgaW50cm9zcGVjdGlvbiBBUEkgdG8gZ2V0IHRoZSBBdWRpbyBWb2x1bWUgR3JvdXBzLCBha2EKKyAgICAgKiBmb3JtZXIgc3RyZWFtIGFsaWFzZXMgaW4gQXVkaW8gU2VydmljZSwgZGVmaW5pbmcgdm9sdW1lIGN1cnZlcyBhdHRhY2hlZCB0byBvbmUgb3IgbW9yZQorICAgICAqIEF1ZGlvIEF0dHJpYnV0ZXMuCisgICAgICogQHBhcmFtIGdyb3VwcworICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIHZvbHVtZSBncm91cHMgd2VyZSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3VwcykgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCA9IDA7CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UoKSB7fQogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaAppbmRleCBiNzkwMmNmLi40M2JhNjI1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlci5oCkBAIC0xNiw3ICsxNiw2IEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSA8SVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24uaD4KICNpbmNsdWRlIDxBdWRpb0dhaW4uaD4KICNpbmNsdWRlIDxBdWRpb1BvcnQuaD4KICNpbmNsdWRlIDxBdWRpb1BhdGNoLmg+CkBAIC01MSw4ICs1MCw2IEBACiAKICAgICB2aXJ0dWFsIGNvbnN0IERldmljZVZlY3RvciAmZ2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiAmZ2V0Vm9sdW1lQ3VydmVzKCkgPSAwOwotCiAgICAgdmlydHVhbCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZ2V0RGVmYXVsdE91dHB1dERldmljZSgpIGNvbnN0ID0gMDsKIAogcHJvdGVjdGVkOgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvQW5kcm9pZC5tawppbmRleCBjMjEwNWU5Li44NGE0NDIyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvQW5kcm9pZC5tawpAQCAtMTEsMTQgKzExLDExIEBACiAgICAgc3JjL0VuZ2luZS5jcHAgXAogICAgIHNyYy9FbmdpbmVJbnN0YW5jZS5jcHAgXAogICAgIHNyYy9TdHJlYW0uY3BwIFwKLSAgICBzcmMvU3RyYXRlZ3kuY3BwIFwKLSAgICBzcmMvVXNhZ2UuY3BwIFwKICAgICBzcmMvSW5wdXRTb3VyY2UuY3BwIFwKIAogYXVkaW9fcG9saWN5X2VuZ2luZV9pbmNsdWRlc19jb21tb24gOj0gXAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlCiAKIExPQ0FMX0NGTEFHUyArPSBcCiAgICAgLVdhbGwgXApAQCAtMzIsOCArMjksMTEgQEAKICAgICAkKGF1ZGlvX3BvbGljeV9lbmdpbmVfaW5jbHVkZXNfY29tbW9uKSBcCiAgICAgJChUQVJHRVRfT1VUX0hFQURFUlMpL2h3IFwKICAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZnJhbWV3b3Jrcy1hdikgXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCisKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmF1ZGlvcG9saWN5Y29tbW9uIFwKKyAgICBsaWJhdWRpb3BvbGljeWVuZ2luZV9pbnRlcmZhY2VfaGVhZGVycwogCiBMT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQogCkBAIC00MiwxNiArNDIsMTkgQEAKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgICAgbGliYXVkaW9wb2xpY3lwZnd3cmFwcGVyIFwKLSAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKKyAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMgXAorICAgIGxpYmF1ZGlvcG9saWN5ZW5naW5lX2NvbW1vbiBcCisgICAgbGliYXVkaW9wb2xpY3llbmdpbmVfY29uZmlnIFwKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGlibG9nIFwKLSAgICBsaWJjdXRpbHMgXAogICAgIGxpYnV0aWxzIFwKICAgICBsaWJsb2cgXAorICAgIGxpYmN1dGlscyBcCiAgICAgbGliYXVkaW91dGlscyBcCiAgICAgbGlicGFyYW1ldGVyIFwKICAgICBsaWJtZWRpYV9oZWxwZXIgXAorICAgIGxpYmF1ZGlvcG9saWN5IFwKICAgICBsaWJ4bWwyCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9BbmRyb2lkLm1rCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQubWsKY29weSB0byBzZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL0FuZHJvaWQubWsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcyNzFiNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTQ5IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK1RPT0xTIDo9IGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzCitQUk9WSVNJT05fQ1JJVEVSSU9OX1RZUEVTIDo9ICQoVE9PTFMpL3Byb3Zpc2lvbl9jcml0ZXJpb25fdHlwZXNfZnJvbV9hbmRyb2lkX2hlYWRlcnMubWsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENPTkZJR1VSQVRJT04gVE9QIEZJTEUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBwaG9uZV9jb25maWd1cmFibGUpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IHBob25lLyQoTE9DQUxfTU9EVUxFKQorCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwgIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbAorCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IHBob25lLyQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IHBob25lLyQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gcGhvbmUvJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2VuZGlmICMgaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwgcGhvbmVfY29uZmlndXJhYmxlKQorCisKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSBjYXJlbXVfY29uZmlndXJhYmxlKSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEFVVE9NT1RJVkUgQ09ORklHVVJBVElPTiBUT1AgRklMRQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gYXV0b21vdGl2ZS8kKExPQ0FMX01PRFVMRSkKKworTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX3ZvbHVtZXMueG1sCisKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworZW5kaWYgI2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSBjYXJlbXVfY29uZmlndXJhYmxlKSkKKworaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwgYXV0b21vdGl2ZV9jb25maWd1cmFibGUpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDT05GSUdVUkFUSU9OIEZJTEVTCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gYXV0b21vdGl2ZS8kKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9fcG9saWN5X2VuZ2luZV92b2x1bWVzLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IGF1dG9tb3RpdmUvJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2VuZGlmICNpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSkKKworaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwgY2FyZW11X2NvbmZpZ3VyYWJsZSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENPTkZJR1VSQVRJT04gRklMRVMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBjYXJlbXUvJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfdm9sdW1lcy54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBjYXJlbXUvJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2VuZGlmICNpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBjYXJlbXVfY29uZmlndXJhYmxlKQorCitpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCQoZmlsdGVyICQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTikscGhvbmVfY29uZmlndXJhYmxlIGF1dG9tb3RpdmVfY29uZmlndXJhYmxlIGNhcmVtdV9jb25maWd1cmFibGUpKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IGNvbW1vbi8kKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9IFwKKyAgICAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCisKK0FORFJPSURfQVVESU9fQkFTRV9IRUFERVJfRklMRSA6PSBzeXN0ZW0vbWVkaWEvYXVkaW8vaW5jbHVkZS9zeXN0ZW0vYXVkaW8tYmFzZS5oCitBVURJT19QT0xJQ1lfQ09ORklHVVJBVElPTl9GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKK0NSSVRFUklPTl9UWVBFU19GSUxFIDo9ICQoTE9DQUxfUEFUSCkvY29tbW9uLyQoTE9DQUxfTU9EVUxFKS5pbgorCitpbmNsdWRlICQoUFJPVklTSU9OX0NSSVRFUklPTl9UWVBFUykKKworZW5kaWYgI2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxwaG9uZV9jb25maWd1cmFibGUgYXV0b21vdGl2ZV9jb25maWd1cmFibGUgY2FyZW11X2NvbmZpZ3VyYWJsZSkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvYXV0b21vdGl2ZS9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUvYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGExNDBhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUvYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgICAtLT4KKworPGNvbmZpZ3VyYXRpb24gdmVyc2lvbj0iMS4wIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisKKyAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwiLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwiLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfdm9sdW1lcy54bWwiLz4KKworPC9jb25maWd1cmF0aW9uPgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvYXV0b21vdGl2ZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvYXV0b21vdGl2ZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ4N2RhOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbApAQCAtMCwwICsxLDE3MCBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPFByb2R1Y3RTdHJhdGVnaWVzPgorICAgIDwhLS0gT0VNIFVzYWdlcyAtLT4KKyAgICA8IS0tIHByb2R1Y3Rfc3RyYXRlZ3kgd2lsbCBiZSBkZWZpbmVkIGFjY29yZGluZyB0aGlzIG9yZGVyCisgICAgcHJvZHVjdF9zdHJhdGVneSBpcyBvZW1fdHJhZmZpY19hbm91bmNlbWVudCBpZiBhbGwgdGhlIGNvbmRpdGlvbnMgYXJlIHNhdGlzZmllZCBmb3IKKyAgICBBdWRpb0F0dHJpYnV0ZXMgYWEKKworICAgIGludCB0eXBlID0gMDsKKyAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKKyAgICB0eXBlID0gYnVuZGxlLmdldEludChLRVlfT0VNX1RZUEUsIDApOworICAgIH0KKyAgICBpZigKKyAgICAoIGFhLm1Db250ZW50VHlwZSA9PSBBdWRpb0F0dHJpYnV0ZXMuQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCApICYmCisgICAgKCBhYS5tVXNhZ2UgPT0gQXVkaW9BdHRyaWJ1dGVzLkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSApICYmCisgICAgKCB0eXBlID09IDEgKSApCisgICAgLS0+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9Im9lbV90cmFmZmljX2Fub3VuY2VtZW50Ij4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCB2b2x1bWVHcm91cD0ib2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQiPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPgorICAgICAgICAgICAgPCEtLSAgdHJhZmZpY19hbm5vdWNlbWVudCA9IDEgLS0+CisgICAgICAgICAgICA8QnVuZGxlIGtleT0ib2VtIiB2YWx1ZT0iMSIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9Im9lbV9zdHJhdGVneV8xIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCB2b2x1bWVHcm91cD0ib2VtX2FkYXNfMiI+CisgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0giLz4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFIi8+CisgICAgICAgICAgICA8QnVuZGxlIGtleT0ib2VtIiB2YWx1ZT0iMiIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9Im9lbV9zdHJhdGVneV8yIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCB2b2x1bWVHcm91cD0ib2VtX2FkYXNfMyI+CisgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0giLz4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFIi8+CisgICAgICAgICAgICA8QnVuZGxlIGtleT0ib2VtIiB2YWx1ZT0iMyIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDwhLS0gQ2FyIFVzYWdlcyAtLT4KKyAgICA8IS0tIEtlZXAgdGhvc2UgbGluZXMgb25seSBmb3IgY2FyIC0tPgorICAgIDwhLS0gQ2hlY2sgY2FyIGNvbmRpdGlvbnMgaWYgYW55IE9FTSBjb25kaXRpb25zIG1hdGNoZWQgLS0+CisgICAgPCEtLSBBcyBkZWZpbmVkIGJ5IENhckF1ZGlvQXR0cmlidXRlc1V0aWwuamF2YSAtLT4KKyAgICA8IS0tIHByb2R1Y3Rfc3RyYXRlZ3kgd2lsbCBiZSBkZWZpbmVkIGFjY29yZGluZyB0aGlzIG9yZGVyCisgICAgcHJvZHVjdF9zdHJhdGVneSBpcyByYWRpbyBpZiBhbGwgdGhlIGNvbmRpdGlvbnMgYXJlIHNhdGlzZmllZCBmb3IgQXVkaW9BdHRyaWJ1dGVzIGFhCisKKyAgICAgICAgaW50IHR5cGUgPSBDQVJfQVVESU9fVFlQRV9ERUZBVUxUOworICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKKyAgICAgICAgdHlwZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX0NBUl9BVURJT19UWVBFLCBDQVJfQVVESU9fVFlQRV9ERUZBVUxUKTsKKyAgICAgICAgfQorICAgICAgICBpZigKKyAgICAgICAgKCBhYS5tQ29udGVudFR5cGUgPT0gQXVkaW9BdHRyaWJ1dGVzLkFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0ggKSAmJgorICAgICAgICAoIGFhLm1Vc2FnZSA9PSBBdWRpb0F0dHJpYnV0ZXMuQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFICkgJiYKKyAgICAgICAgKCB0eXBlID09IENBUl9BVURJT19UWVBFX1JBRElPICkgKQorICAgICAgICAtLT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9InJhZGlvIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCB2b2x1bWVHcm91cD0ibWVkaWFfY2FyX2F1ZGlvX3R5cGVfMyI+CisgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQyIvPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9NRURJQSIvPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9ImNhcl9hdWRpb190eXBlIiB2YWx1ZT0iMyIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9ImV4dF9hdWRpb19zb3VyY2UiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHZvbHVtZUdyb3VwPSJtZWRpYV9jYXJfYXVkaW9fdHlwZV83Ij4KKyAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDIi8+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX01FRElBIi8+CisgICAgICAgICAgICA8QnVuZGxlIGtleT0iY2FyX2F1ZGlvX3R5cGUiIHZhbHVlPSI3Ii8+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0idm9pY2VfY29tbWFuZCI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9InNwZWVjaCI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4KKyAgICAgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0giLz4KKyAgICAgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPgorICAgICAgICAgICAgICAgIDwhLS0gIENBUl9BVURJT19UWVBFX1ZPSUNFX0NPTU1BTkQgPSAxIC0tPgorICAgICAgICAgICAgICAgIDxCdW5kbGUga2V5PSJjYXJfYXVkaW9fdHlwZSIgdmFsdWU9IjEiLz4KKyAgICAgICAgICAgIDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTlQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9InNhZmV0eV9hbGVydCI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9InN5c3RlbSI+CisgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT04iLz4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OIi8+CisgICAgICAgICAgICA8IS0tICBDQVJfQVVESU9fVFlQRV9TQUZFVFlfQUxFUlQgPSAyIC0tPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9ImNhcl9hdWRpb190eXBlIiB2YWx1ZT0iMiIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDwhLS0gVG8gYmUgY2hlY2tlZAorICAgIENBUl9BVURJT19UWVBFX0NBUlNFUlZJQ0VfQk9UVE9NCisgICAgQ0FSX0FVRElPX1RZUEVfQ0FSU0VSVklDRV9DQVJfUFJPWFkKKyAgICBDQVJfQVVESU9fVFlQRV9DQVJTRVJWSUNFX01FRElBX01VVEUKKyAgICAtLT4KKworICAgIDwhLS0gR2VuZXJpYyBVc2FnZXMgLS0+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJtdXNpYyI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX01VU0lDIiB2b2x1bWVHcm91cD0ibWVkaWEiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTUVESUEiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfR0FNRSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8IS0tIERlZmF1bHQgcHJvZHVjdCBzdHJhdGVneSBoYXMgZW1wdHkgYXR0cmlidXRlcyAtLT4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPjwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9Im5hdl9ndWlkYW5jZSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9InNwZWVjaCI+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9InZvaWNlX2NhbGwiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIiB2b2x1bWVHcm91cD0icGhvbmUiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkciLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyIgdm9sdW1lR3JvdXA9InBob25lIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8RmxhZ3MgdmFsdWU9IkFVRElPX0ZMQUdfU0NPIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJhbGFybSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0FMQVJNIiB2b2x1bWVHcm91cD0icmluZyI+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FMQVJNIi8+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0icmluZyI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1JJTkciIHZvbHVtZUdyb3VwPSJyaW5nIj4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORSIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9Im5vdGlmaWNhdGlvbiI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiIgdm9sdW1lR3JvdXA9InJpbmciPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0ic3lzdGVtIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fU1lTVEVNIiB2b2x1bWVHcm91cD0ic3lzdGVtIj4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04iLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJ0dHMiPgorICAgICAgICA8IS0tIFRUUyBzdHJlYW0gTVVTVCBCRSBNQU5BR0VEIE9VVFNJREUgZGVmYXVsdCBwcm9kdWN0IHN0cmF0ZWd5IGlmIE5PIERFRElDQVRFRCBPVVRQVVQKKyAgICAgICAgICAgICBmb3IgVFRTLCBvdGhlcndpc2Ugd2hlbiBiZWFjb24gaGFwcGVucywgZGVmYXVsdCBzdHJhdGVneSBpcyAuLi4gbXV0ZWQuCisgICAgICAgICAgICAgSWYgaXQgaXMgbWVkaWEsIGl0IGlzIGFubm95aW5nLi4uIC0tPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9UVFMiIHZvbHVtZUdyb3VwPSJ0dHMiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxGbGFncyB2YWx1ZT0iQVVESU9fRkxBR19CRUFDT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKzwvUHJvZHVjdFN0cmF0ZWdpZXM+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL2F1ZGlvX3BvbGljeV9lbmdpbmVfdm9sdW1lcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvYXV0b21vdGl2ZS9hdWRpb19wb2xpY3lfZW5naW5lX3ZvbHVtZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYzNkNzcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvYXV0b21vdGl2ZS9hdWRpb19wb2xpY3lfZW5naW5lX3ZvbHVtZXMueG1sCkBAIC0wLDAgKzEsMTkyIEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICAgLS0+CisKKzwhLS0gVm9sdW1lIEdyb3VwcyBUYWJsZXMgaW5jbHVkZWQgYnkgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSAtLT4KKzwhLS0gTm90ZToKKyAgICAgICAgSXQgaXMgVkFMSUQgdG8gaGF2ZSBhIGdyb3VwIHdpdGhvdXQgYXR0cmlidXRlcyBpZiBhIHByb2R1Y3Qgc3RyYXRlZ3kgaXMgZm9sbG93aW5nCisgICAgICAgIHRoaXMgZ3JvdXAgZm9yIGFsbCBhdHRyaWJ1dGVzLgorICAgICAgICBPdGhlcndpc2UsIGF0dHJpYnV0ZXMgbXVzdCBiZSBzcGVjaWZpZWQKKy0tPgorCis8dm9sdW1lR3JvdXBzPgorICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+b2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQ8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCis8IS0tIE9FTSBBREFTIGlzIGEgdm9sdW1lIGdyb3VwIHRoYXQgaGFzIGEgc2luZ2xlIHBvcnQgZ2FpbiAodGhpcyBpcyB0aGUgcmVhc29uIHdoeSBpdCBpcyBhIGdyb3VwCisgICAgIGJ1dCBtYXkgaG9zdCBkaWZmZXJlbnQgc3RyZWFtcy4KKyAgICAgQSBwcmlvcml0eSBtdXN0IGJlIGdpdmVuIGFtb25nIHRoZW0gKGVpdGhlciB0aGV5IGFyZSBtdWx0dWFseSBleGNsdWlzdmUsIHNvIHRoZSB2b2x1bWUKKyAgICAgd2lsbCBiZSB0aGUgb25lIG9mIHRoZSBjdXJyZW50bHkgYWNpdHZlIHN0cmVhbSwgb3RoZXJ3aXNlIGEgcHJpb3JpdHkgbXVzdCBiZSBnaXZlbiBieQorICAgICBhbnkgbWVhbi4gLS0+CisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5vZW1fYWRhc18yPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD40MDwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPm9lbV9hZGFzXzM8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTI0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0xNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiPgorICAgICAgICAgICAgPHBvaW50PjAsLTI0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0xNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKzwhLS0gTUVESUEgaXMgYSB2b2x1bWUgZ3JvdXAgdGhhdCBoYXMgYSBzaW5nbGUgcG9ydCBnYWluICh0aGlzIGlzIHRoZSByZWFzb24gd2h5IGl0IGlzIGEgZ3JvdXAKKyAgICAgYnV0IG1heSBob3N0IGRpZmZlcmVudCBzdHJlYW1zLgorICAgICBBIHByaW9yaXR5IG11c3QgYmUgZ2l2ZW4gYW1vbmcgdGhlbSAoZWl0aGVyIHRoZXkgYXJlIG11bHR1YWx5IGV4Y2x1c2l2ZSwgc28gdGhlIHZvbHVtZQorICAgICB3aWxsIGJlIHRoZSBvbmUgb2YgdGhlIGFjdGl2ZSBzdHJlYW0gd2l0aCBoaWdoZXN0IHByaW9yaXR5IChPUkRFUiBNQVRURVJTKSB1bmxlc3MgdGhlIGN1cnZlcworICAgICBmb2xsb3dlZCB3aWxsIHRoZSB0aGUgY3VydmVzIGZvciB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZXMuLS0+CisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5tZWRpYV9jYXJfYXVkaW9fdHlwZV8zPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD40MDwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPm1lZGlhX2Nhcl9hdWRpb190eXBlXzc8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTI0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0xNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5tZWRpYTwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+c3BlZWNoPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MTwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD40MDwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+c3lzdGVtPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD40MDwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+cGhvbmU8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4xPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5yaW5nPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD40MDwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+dHRzPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4xNTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0wPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+Cis8L3ZvbHVtZUdyb3Vwcz4KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NhcmVtdS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY2FyZW11L2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDg3ZGE5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NhcmVtdS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKQEAgLTAsMCArMSwxNzAgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxQcm9kdWN0U3RyYXRlZ2llcz4KKyAgICA8IS0tIE9FTSBVc2FnZXMgLS0+CisgICAgPCEtLSBwcm9kdWN0X3N0cmF0ZWd5IHdpbGwgYmUgZGVmaW5lZCBhY2NvcmRpbmcgdGhpcyBvcmRlcgorICAgIHByb2R1Y3Rfc3RyYXRlZ3kgaXMgb2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQgaWYgYWxsIHRoZSBjb25kaXRpb25zIGFyZSBzYXRpc2ZpZWQgZm9yCisgICAgQXVkaW9BdHRyaWJ1dGVzIGFhCisKKyAgICBpbnQgdHlwZSA9IDA7CisgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7CisgICAgdHlwZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX09FTV9UWVBFLCAwKTsKKyAgICB9CisgICAgaWYoCisgICAgKCBhYS5tQ29udGVudFR5cGUgPT0gQXVkaW9BdHRyaWJ1dGVzLkFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0ggKSAmJgorICAgICggYWEubVVzYWdlID09IEF1ZGlvQXR0cmlidXRlcy5BVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UgKSAmJgorICAgICggdHlwZSA9PSAxICkgKQorICAgIC0tPgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJvZW1fdHJhZmZpY19hbm91bmNlbWVudCI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9Im9lbV90cmFmZmljX2Fub3VuY2VtZW50Ij4KKyAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCIvPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4KKyAgICAgICAgICAgIDwhLS0gIHRyYWZmaWNfYW5ub3VjZW1lbnQgPSAxIC0tPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9Im9lbSIgdmFsdWU9IjEiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJvZW1fc3RyYXRlZ3lfMSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9Im9lbV9hZGFzXzIiPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9Im9lbSIgdmFsdWU9IjIiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJvZW1fc3RyYXRlZ3lfMiI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9Im9lbV9hZGFzXzMiPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9Im9lbSIgdmFsdWU9IjMiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIENhciBVc2FnZXMgLS0+CisgICAgPCEtLSBLZWVwIHRob3NlIGxpbmVzIG9ubHkgZm9yIGNhciAtLT4KKyAgICA8IS0tIENoZWNrIGNhciBjb25kaXRpb25zIGlmIGFueSBPRU0gY29uZGl0aW9ucyBtYXRjaGVkIC0tPgorICAgIDwhLS0gQXMgZGVmaW5lZCBieSBDYXJBdWRpb0F0dHJpYnV0ZXNVdGlsLmphdmEgLS0+CisgICAgPCEtLSBwcm9kdWN0X3N0cmF0ZWd5IHdpbGwgYmUgZGVmaW5lZCBhY2NvcmRpbmcgdGhpcyBvcmRlcgorICAgIHByb2R1Y3Rfc3RyYXRlZ3kgaXMgcmFkaW8gaWYgYWxsIHRoZSBjb25kaXRpb25zIGFyZSBzYXRpc2ZpZWQgZm9yIEF1ZGlvQXR0cmlidXRlcyBhYQorCisgICAgICAgIGludCB0eXBlID0gQ0FSX0FVRElPX1RZUEVfREVGQVVMVDsKKyAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7CisgICAgICAgIHR5cGUgPSBidW5kbGUuZ2V0SW50KEtFWV9DQVJfQVVESU9fVFlQRSwgQ0FSX0FVRElPX1RZUEVfREVGQVVMVCk7CisgICAgICAgIH0KKyAgICAgICAgaWYoCisgICAgICAgICggYWEubUNvbnRlbnRUeXBlID09IEF1ZGlvQXR0cmlidXRlcy5BVURJT19DT05URU5UX1RZUEVfU1BFRUNIICkgJiYKKyAgICAgICAgKCBhYS5tVXNhZ2UgPT0gQXVkaW9BdHRyaWJ1dGVzLkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSApICYmCisgICAgICAgICggdHlwZSA9PSBDQVJfQVVESU9fVFlQRV9SQURJTyApICkKKyAgICAgICAgLS0+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJyYWRpbyI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9Im1lZGlhX2Nhcl9hdWRpb190eXBlXzMiPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfTVVTSUMiLz4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTUVESUEiLz4KKyAgICAgICAgICAgIDxCdW5kbGUga2V5PSJjYXJfYXVkaW9fdHlwZSIgdmFsdWU9IjMiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJleHRfYXVkaW9fc291cmNlIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCB2b2x1bWVHcm91cD0ibWVkaWFfY2FyX2F1ZGlvX3R5cGVfNyI+CisgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQyIvPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9NRURJQSIvPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9ImNhcl9hdWRpb190eXBlIiB2YWx1ZT0iNyIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9InZvaWNlX2NvbW1hbmQiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHZvbHVtZUdyb3VwPSJzcGVlY2giPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+CisgICAgICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+CisgICAgICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4KKyAgICAgICAgICAgICAgICA8IS0tICBDQVJfQVVESU9fVFlQRV9WT0lDRV9DT01NQU5EID0gMSAtLT4KKyAgICAgICAgICAgICAgICA8QnVuZGxlIGtleT0iY2FyX2F1ZGlvX3R5cGUiIHZhbHVlPSIxIi8+CisgICAgICAgICAgICA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFkiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5UIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJzYWZldHlfYWxlcnQiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHZvbHVtZUdyb3VwPSJzeXN0ZW0iPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OIi8+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTiIvPgorICAgICAgICAgICAgPCEtLSAgQ0FSX0FVRElPX1RZUEVfU0FGRVRZX0FMRVJUID0gMiAtLT4KKyAgICAgICAgICAgIDxCdW5kbGUga2V5PSJjYXJfYXVkaW9fdHlwZSIgdmFsdWU9IjIiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIFRvIGJlIGNoZWNrZWQKKyAgICBDQVJfQVVESU9fVFlQRV9DQVJTRVJWSUNFX0JPVFRPTQorICAgIENBUl9BVURJT19UWVBFX0NBUlNFUlZJQ0VfQ0FSX1BST1hZCisgICAgQ0FSX0FVRElPX1RZUEVfQ0FSU0VSVklDRV9NRURJQV9NVVRFCisgICAgLS0+CisKKyAgICA8IS0tIEdlbmVyaWMgVXNhZ2VzIC0tPgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0ibXVzaWMiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9NVVNJQyIgdm9sdW1lR3JvdXA9Im1lZGlhIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX01FRElBIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0dBTUUiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPCEtLSBEZWZhdWx0IHByb2R1Y3Qgc3RyYXRlZ3kgaGFzIGVtcHR5IGF0dHJpYnV0ZXMgLS0+CisgICAgICAgICAgICA8QXR0cmlidXRlcz48L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJuYXZfZ3VpZGFuY2UiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHZvbHVtZUdyb3VwPSJzcGVlY2giPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJ2b2ljZV9jYWxsIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCIgdm9sdW1lR3JvdXA9InBob25lIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08iIHZvbHVtZUdyb3VwPSJwaG9uZSI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPEZsYWdzIHZhbHVlPSJBVURJT19GTEFHX1NDTyIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iYWxhcm0iPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9BTEFSTSIgdm9sdW1lR3JvdXA9InJpbmciPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BTEFSTSIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9InJpbmciPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9SSU5HIiB2b2x1bWVHcm91cD0icmluZyI+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkUiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJub3RpZmljYXRpb24iPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iIHZvbHVtZUdyb3VwPSJyaW5nIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9InN5c3RlbSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1NZU1RFTSIgdm9sdW1lR3JvdXA9InN5c3RlbSI+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OIi8+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0idHRzIj4KKyAgICAgICAgPCEtLSBUVFMgc3RyZWFtIE1VU1QgQkUgTUFOQUdFRCBPVVRTSURFIGRlZmF1bHQgcHJvZHVjdCBzdHJhdGVneSBpZiBOTyBERURJQ0FURUQgT1VUUFVUCisgICAgICAgICAgICAgZm9yIFRUUywgb3RoZXJ3aXNlIHdoZW4gYmVhY29uIGhhcHBlbnMsIGRlZmF1bHQgc3RyYXRlZ3kgaXMgLi4uIG11dGVkLgorICAgICAgICAgICAgIElmIGl0IGlzIG1lZGlhLCBpdCBpcyBhbm5veWluZy4uLiAtLT4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fVFRTIiB2b2x1bWVHcm91cD0idHRzIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8RmxhZ3MgdmFsdWU9IkFVRElPX0ZMQUdfQkVBQ09OIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+Cis8L1Byb2R1Y3RTdHJhdGVnaWVzPgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY2FyZW11L2F1ZGlvX3BvbGljeV9lbmdpbmVfdm9sdW1lcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY2FyZW11L2F1ZGlvX3BvbGljeV9lbmdpbmVfdm9sdW1lcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVjM2Q3NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jYXJlbXUvYXVkaW9fcG9saWN5X2VuZ2luZV92b2x1bWVzLnhtbApAQCAtMCwwICsxLDE5MiBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgIC0tPgorCis8IS0tIFZvbHVtZSBHcm91cHMgVGFibGVzIGluY2x1ZGVkIGJ5IEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUgLS0+Cis8IS0tIE5vdGU6CisgICAgICAgIEl0IGlzIFZBTElEIHRvIGhhdmUgYSBncm91cCB3aXRob3V0IGF0dHJpYnV0ZXMgaWYgYSBwcm9kdWN0IHN0cmF0ZWd5IGlzIGZvbGxvd2luZworICAgICAgICB0aGlzIGdyb3VwIGZvciBhbGwgYXR0cmlidXRlcy4KKyAgICAgICAgT3RoZXJ3aXNlLCBhdHRyaWJ1dGVzIG11c3QgYmUgc3BlY2lmaWVkCistLT4KKworPHZvbHVtZUdyb3Vwcz4KKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPm9lbV90cmFmZmljX2Fub3VuY2VtZW50PC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD40MDwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKworPCEtLSBPRU0gQURBUyBpcyBhIHZvbHVtZSBncm91cCB0aGF0IGhhcyBhIHNpbmdsZSBwb3J0IGdhaW4gKHRoaXMgaXMgdGhlIHJlYXNvbiB3aHkgaXQgaXMgYSBncm91cAorICAgICBidXQgbWF5IGhvc3QgZGlmZmVyZW50IHN0cmVhbXMuCisgICAgIEEgcHJpb3JpdHkgbXVzdCBiZSBnaXZlbiBhbW9uZyB0aGVtIChlaXRoZXIgdGhleSBhcmUgbXVsdHVhbHkgZXhjbHVpc3ZlLCBzbyB0aGUgdm9sdW1lCisgICAgIHdpbGwgYmUgdGhlIG9uZSBvZiB0aGUgY3VycmVudGx5IGFjaXR2ZSBzdHJlYW0sIG90aGVyd2lzZSBhIHByaW9yaXR5IG11c3QgYmUgZ2l2ZW4gYnkKKyAgICAgYW55IG1lYW4uIC0tPgorICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+b2VtX2FkYXNfMjwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5vZW1fYWRhc18zPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD40MDwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCis8IS0tIE1FRElBIGlzIGEgdm9sdW1lIGdyb3VwIHRoYXQgaGFzIGEgc2luZ2xlIHBvcnQgZ2FpbiAodGhpcyBpcyB0aGUgcmVhc29uIHdoeSBpdCBpcyBhIGdyb3VwCisgICAgIGJ1dCBtYXkgaG9zdCBkaWZmZXJlbnQgc3RyZWFtcy4KKyAgICAgQSBwcmlvcml0eSBtdXN0IGJlIGdpdmVuIGFtb25nIHRoZW0gKGVpdGhlciB0aGV5IGFyZSBtdWx0dWFseSBleGNsdXNpdmUsIHNvIHRoZSB2b2x1bWUKKyAgICAgd2lsbCBiZSB0aGUgb25lIG9mIHRoZSBhY3RpdmUgc3RyZWFtIHdpdGggaGlnaGVzdCBwcmlvcml0eSAoT1JERVIgTUFUVEVSUykgdW5sZXNzIHRoZSBjdXJ2ZXMKKyAgICAgZm9sbG93ZWQgd2lsbCB0aGUgdGhlIGN1cnZlcyBmb3IgdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGVzLi0tPgorICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+bWVkaWFfY2FyX2F1ZGlvX3R5cGVfMzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5tZWRpYV9jYXJfYXVkaW9fdHlwZV83PC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD40MDwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+bWVkaWE8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTI0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0xNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnNwZWVjaDwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjE8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnN5c3RlbTwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnBob25lPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MTwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD40MDwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+cmluZzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnR0czwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorPC92b2x1bWVHcm91cHM+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jb21tb24vYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY29tbW9uL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjODJiMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY29tbW9uL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y3JpdGVyaWE+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJBdmFpbGFibGVJbnB1dERldmljZXMiIHR5cGU9IklucHV0RGV2aWNlc01hc2tUeXBlIiBkZWZhdWx0PSJub25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiB0eXBlPSJPdXRwdXREZXZpY2VzTWFza1R5cGUiIGRlZmF1bHQ9Im5vbmUiLz4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IkF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMiIHR5cGU9Ik91dHB1dERldmljZXNBZGRyZXNzZXNUeXBlIiBkZWZhdWx0PSJub25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJBdmFpbGFibGVJbnB1dERldmljZXNBZGRyZXNzZXMiIHR5cGU9IklucHV0RGV2aWNlc0FkZHJlc3Nlc1R5cGUiIGRlZmF1bHQ9Im5vbmUiLz4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IlRlbGVwaG9ueU1vZGUiIHR5cGU9IkFuZHJvaWRNb2RlVHlwZSIgZGVmYXVsdD0iTm9ybWFsIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIHR5cGU9IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvblR5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iRm9yY2VVc2VGb3JNZWRpYSIgdHlwZT0iRm9yY2VVc2VGb3JNZWRpYVR5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iRm9yY2VVc2VGb3JSZWNvcmQiIHR5cGU9IkZvcmNlVXNlRm9yUmVjb3JkVHlwZSIgZGVmYXVsdD0iRm9yY2VOb25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJGb3JjZVVzZUZvckRvY2siIHR5cGU9IkZvcmNlVXNlRm9yRG9ja1R5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iRm9yY2VVc2VGb3JTeXN0ZW0iIHR5cGU9IkZvcmNlVXNlRm9yU3lzdGVtVHlwZSIgZGVmYXVsdD0iRm9yY2VOb25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyIgdHlwZT0iRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW9UeXBlIiBkZWZhdWx0PSJGb3JjZU5vbmUiLz4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IkZvcmNlVXNlRm9yRW5jb2RlZFN1cnJvdW5kIiB0eXBlPSJGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZFR5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iRm9yY2VVc2VGb3JWaWJyYXRlUmluZ2luZyIgdHlwZT0iRm9yY2VVc2VGb3JWaWJyYXRlUmluZ2luZ1R5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorPC9jcml0ZXJpYT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jb21tb24vYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sLmluIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NvbW1vbi9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxNzM2OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jb21tb24vYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sLmluCkBAIC0wLDAgKzEsOTYgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y3JpdGVyaW9uX3R5cGVzPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJPdXRwdXREZXZpY2VzTWFza1R5cGUiIHR5cGU9ImluY2x1c2l2ZSIvPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJJbnB1dERldmljZXNNYXNrVHlwZSIgdHlwZT0iaW5jbHVzaXZlIi8+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9Ik91dHB1dERldmljZXNBZGRyZXNzZXNUeXBlIiB0eXBlPSJpbmNsdXNpdmUiPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPCEtLSBsZWdhY3kgcmVtb3RlIHN1Ym1peCAtLT4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSIwIiBudW1lcmljYWw9IjEiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iSW5wdXREZXZpY2VzQWRkcmVzc2VzVHlwZSIgdHlwZT0iaW5jbHVzaXZlIi8+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IkFuZHJvaWRNb2RlVHlwZSIgdHlwZT0iZXhjbHVzaXZlIi8+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IkJvb2xlYW5UeXBlIiB0eXBlPSJleGNsdXNpdmUiPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZhbHNlIiBudW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJUcnVlIiBudW1lcmljYWw9IjEiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uVHlwZSIgdHlwZT0iZXhjbHVzaXZlIj4KKyAgICAgICAgPHZhbHVlcz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZU5vbmUiIG51bWVyaWNhbD0iMCIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlU3BlYWtlciIgbnVtZXJpY2FsPSIxIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VCdFNjbyIgbnVtZXJpY2FsPSIzIi8+CisgICAgICAgIDwvdmFsdWVzPgorICAgIDwvY3JpdGVyaW9uX3R5cGU+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IkZvcmNlVXNlRm9yTWVkaWFUeXBlIiB0eXBlPSJleGNsdXNpdmUiPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlTm9uZSIgbnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VTcGVha2VyIiBudW1lcmljYWw9IjEiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUhlYWRwaG9uZXMiIG51bWVyaWNhbD0iMiIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlQnRBMmRwIiBudW1lcmljYWw9IjQiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZVdpcmVkQWNjZXNzb3J5IiBudW1lcmljYWw9IjUiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUFuYWxvZ0RvY2siIG51bWVyaWNhbD0iOCIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlRGlnaXRhbERvY2siIG51bWVyaWNhbD0iOSIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlTm9CdEEyZHAiIG51bWVyaWNhbD0iMTAiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iRm9yY2VVc2VGb3JSZWNvcmRUeXBlIiB0eXBlPSJleGNsdXNpdmUiPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlTm9uZSIgbnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VCdFNjbyIgbnVtZXJpY2FsPSIzIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VXaXJlZEFjY2Vzc29yeSIgbnVtZXJpY2FsPSI1Ii8+CisgICAgICAgIDwvdmFsdWVzPgorICAgIDwvY3JpdGVyaW9uX3R5cGU+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IkZvcmNlVXNlRm9yRG9ja1R5cGUiIHR5cGU9ImV4Y2x1c2l2ZSI+CisgICAgICAgIDx2YWx1ZXM+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VOb25lIiBudW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZVdpcmVkQWNjZXNzb3J5IiBudW1lcmljYWw9IjUiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUJ0Q2FyRG9jayIgbnVtZXJpY2FsPSI2Ii8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VCdERlc2tEb2NrIiBudW1lcmljYWw9IjciLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUFuYWxvZ0RvY2siIG51bWVyaWNhbD0iOCIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlRGlnaXRhbERvY2siIG51bWVyaWNhbD0iOSIvPgorICAgICAgICA8L3ZhbHVlcz4KKyAgICA8L2NyaXRlcmlvbl90eXBlPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJGb3JjZVVzZUZvclN5c3RlbVR5cGUiIHR5cGU9ImV4Y2x1c2l2ZSIgPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlTm9uZSIgbnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VTeXN0ZW1FbmZvcmNlZCIgbnVtZXJpY2FsPSIxMSIvPgorICAgICAgICA8L3ZhbHVlcz4KKyAgICA8L2NyaXRlcmlvbl90eXBlPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpb1R5cGUiIHR5cGU9ImV4Y2x1c2l2ZSI+CisgICAgICAgIDx2YWx1ZXM+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VOb25lIiBudW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZCIgbnVtZXJpY2FsPSIxMiIvPgorICAgICAgICA8L3ZhbHVlcz4KKyAgICA8L2NyaXRlcmlvbl90eXBlPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZFR5cGUiIHR5cGU9ImV4Y2x1c2l2ZSI+CisgICAgICAgIDx2YWx1ZXM+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VOb25lIiBudW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUVuY29kZWRTdXJyb3VuZE5ldmVyIiBudW1lcmljYWw9IjEzIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VFbmNvZGVkU3Vycm91bmRBbHdheXMiIG51bWVyaWNhbD0iMTQiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iRm9yY2VVc2VGb3JWaWJyYXRlUmluZ2luZ1R5cGUiIHR5cGU9ImV4Y2x1c2l2ZSI+CisgICAgICAgIDx2YWx1ZXM+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VOb25lIiBudW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUJ0U2NvIiBudW1lcmljYWw9IjMiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKzwvY3JpdGVyaW9uX3R5cGVzPgorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhMzNiNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgIC0tPgorCis8Y29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sIi8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbCIvPgorCis8L2NvbmZpZ3VyYXRpb24+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfZGVmYXVsdF9zdHJlYW1fdm9sdW1lcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlNmRkNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sCkBAIC0wLDAgKzEsMTM2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBEZWZhdWx0IFZvbHVtZSBUYWJsZXMgaW5jbHVkZWQgYnkgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSAtLT4KKzwhLS0gRnVsbCBEZWZhdWx0IFZvbHVtZSB0YWJsZSBmb3IgYWxsIGRldmljZSBjYXRlZ29yeSAtLT4KKzx2b2x1bWVzPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRnVsbCBTY2FsZSByZWZlcmVuY2UgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MCwwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiPgorICAgICAgICA8cG9pbnQ+MCwtOTYwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsLTk2MDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgU3lzdGVtIHJlZmVyZW5jZSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC0yNDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjMzLC0xODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjY2LC0xMjAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwtNjAwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgTWVkaWEgcmVmZXJlbmNlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS1EZWZhdWx0IFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTQ5NTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MzMsLTMzNTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjYsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBpcyBTcGVha2VyIE1lZGlhIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9TWVNURU1fVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgaXMgU3BlYWtlciBTeXN0ZW0gVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtNDY4MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD40MiwtMjA3MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD44NSwtNTQwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLURlZmF1bHQgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtNDk1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4zMywtMzM1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42NiwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgaXMgRXh0IE1lZGlhIFN5c3RlbSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0yMTAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwtMTAwMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IEhlYXJpbmcgQWlkIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTEyNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC04MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgICAgPCEtLSBOb24tbXV0YWJsZSBkZWZhdWx0IHZvbHVtZSBjdXJ2ZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gICAgICogZmlyc3QgcG9pbnQgaXMgYWx3YXlzIGZvciBpbmRleCAwICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tICAgICAqIGF0dGVudWF0aW9uIGlzIHNtYWxsIGVub3VnaCB0aGF0IHN0cmVhbSBjYW4gc3RpbGwgYmUgaGVhcmQgLS0+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IG5vbi1tdXRhYmxlIHJlZmVyZW5jZSBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICAgICAgYmFzZWQgb24gREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS1EZWZhdWx0IG5vbi1tdXRhYmxlIFZvbHVtZSBDdXJ2ZSBmb3IgaGVhZHNldCAtLT4KKyAgICA8IS0tICAgIGJhc2VkIG9uIERFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtNDk1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4zMywtMzM1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42NiwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX1NQRUFLRVJfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgbm9uLW11dGFibGUgU3BlYWtlciBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICBiYXNlZCBvbiBERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS1EZWZhdWx0IG5vbi1tdXRhYmxlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICA8IS0tICAgIGJhc2VkIG9uIERFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTQ5NTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MzMsLTMzNTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjYsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9FWFRfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgbm9uLW11dGFibGUgRXh0IE1lZGlhIFN5c3RlbSBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICAgYmFzZWQgb24gREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTIxMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLC0xMDAwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgbm9uLW11dGFibGUgSGVhcmluZyBBaWQgVm9sdW1lIEN1cnZlIC0tPgorICAgIDwhLS0gICAgIGJhc2VkIG9uIERFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtMTI3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTgwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorPC92b2x1bWVzPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5ODc0MwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKQEAgLTAsMCArMSwxMTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgIC0tPgorCis8UHJvZHVjdFN0cmF0ZWdpZXM+CisKKyAgICA8IS0tICJoaWRkZW4gc3RyYXRlZ2llcyIgbGlrZSBUVFMsIGVuZm9yY2VkIGF1ZGlibGU6CisgICAgICAgICAgICBTaGFsbCB3ZSBleHBvc2UgdGhlbSBoZXJlIG9yIGtlZXAgaXQgaGFyZCBjb2RlZCAtLT4KKworICAgIDwhLS0gVXNlZCB0byBpZGVudGlmeSB0aGUgdm9sdW1lIG9mIGF1ZGlvIHN0cmVhbXMgZm9yIGVuZm9yY2VkIHN5c3RlbSBzb3VuZHMgaW4gY2VydGFpbgorICAgICAgICAgY291bnRyaWVzIChlLmcuIGNhbWVyYSBpbiBKYXBhbikKKyAgICAgICAgIFRoaXMgc3RyYXRlZ3kgd2lsbCBvbmx5IGhhdmUgaGlnaGVyIHByaW9yaXR5IHRoYW4gcGhvbmUgaWYgZm9yY2UgZm9yIHN5c3RlbSBpcyBzZXQgdG8KKyAgICAgICAgIGVuZm9yY2VkLiAtLT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfUEhPTkUiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIiB2b2x1bWVHcm91cD0idm9pY2VfY2FsbCI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08iIHZvbHVtZUdyb3VwPSJibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8RmxhZ3MgdmFsdWU9IkFVRElPX0ZMQUdfU0NPIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1NPTklGSUNBVElPTiI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1JJTkciIHZvbHVtZUdyb3VwPSJyaW5nIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkUiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQUxBUk0iIHZvbHVtZUdyb3VwPSJhbGFybSI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BTEFSTSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSIgdm9sdW1lR3JvdXA9ImVuZm9yY2VkX2F1ZGlibGUiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxGbGFncyB2YWx1ZT0iQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX0FDQ0VTU0lCSUxJVFkiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIiB2b2x1bWVHcm91cD0iYWNjZXNzaWJpbGl0eSI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFkiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iIHZvbHVtZUdyb3VwPSJub3RpZmljYXRpb24iPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1QiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9NRURJQSI+CisgICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9NVVNJQyIgdm9sdW1lR3JvdXA9Im11c2ljIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX01FRElBIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0dBTUUiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5UIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz48L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9TWVNURU0iIHZvbHVtZUdyb3VwPSJzeXN0ZW0iPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfRFRNRiI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0RUTUYiIHZvbHVtZUdyb3VwPSJkdG1mIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORyIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPCEtLSBVc2VkIHRvIGlkZW50aWZ5IHRoZSB2b2x1bWUgb2YgYXVkaW8gc3RyZWFtcyBleGNsdXNpdmVseSB0cmFuc21pdHRlZCB0aHJvdWdoIHRoZSAgc3BlYWtlcgorICAgICAgICAgKFRUUykgb2YgdGhlIGRldmljZSAtLT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1RUUyIgdm9sdW1lR3JvdXA9InR0cyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPEZsYWdzIHZhbHVlPSJBVURJT19GTEFHX0JFQUNPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPCEtLSBSb3V0aW5nIFN0cmF0ZWd5IHJlcm91dGluZyBtYXkgYmUgcmVtb3ZlZCBhcyBmb2xsb3dpbmcgbWVkaWE/Pz8gLS0+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9SRVJPVVRJTkciPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9SRVJPVVRJTkciIHZvbHVtZUdyb3VwPSJyZXJvdXRpbmciPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+PC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDwhLS0gRGVmYXVsdCBwcm9kdWN0IHN0cmF0ZWd5IGhhcyBlbXB0eSBhdHRyaWJ1dGVzIC0tPgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfUEFUQ0giPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9QQVRDSCIgdm9sdW1lR3JvdXA9InBhdGNoIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPjwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKworPC9Qcm9kdWN0U3RyYXRlZ2llcz4KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwN2ExODQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9zdHJlYW1fdm9sdW1lcy54bWwKQEAgLTAsMCArMSwyMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIFZvbHVtZSBzZWN0aW9uIGRlZmluZXMgYSB2b2x1bWUgY3VydmUgZm9yIGEgZ2l2ZW4gdXNlIGNhc2UgYW5kIGRldmljZSBjYXRlZ29yeS4KK0l0IGNvbnRhaW5zIGEgbGlzdCBvZiBwb2ludHMgb2YgdGhpcyBjdXJ2ZSBleHByZXNzaW5nIHRoZSBhdHRlbnVhdGlvbiBpbiBNaWxsaWJlbHMgZm9yIGEgZ2l2ZW4KK3ZvbHVtZSBpbmRleCBmcm9tIDAgdG8gMTAwLgorPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT3igJ3igJ0+Cis8cG9pbnQ+MCwtOTYwMDwvcG9pbnQ+Cis8cG9pbnQ+MTAwLDA8L3BvaW50PgorPC92b2x1bWU+CistLT4KKworPHZvbHVtZUdyb3Vwcz4KKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnZvaWNlX2NhbGw8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4xPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjcwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC05MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+c3lzdGVtPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjEsLTMwMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMjIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLC0xODAwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4xLC01MTAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD41NywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NzEsLTI1MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50Pjg1LC0yMzAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTIxMDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPCEtLXZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8tLT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+cmluZzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NzwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPm11c2ljPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4yNTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5hbGFybTwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjE8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NzwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0VYVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+bm90aWZpY2F0aW9uPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9TWVNURU1fVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPmJsdWV0b290aF9zY288L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTI0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0xNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5lbmZvcmNlZF9hdWRpYmxlPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjEsLTMwMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMjIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLC0xODAwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4xLC0zNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD43MSwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLC0yMDAwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDwhLS12b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvLS0+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPmR0bWY8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjEsLTMwMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMjIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLC0xODAwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4xLC00MDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD43MSwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLC0xNDAwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDwhLS12b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvLS0+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnR0czwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJTSUxFTlRfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJTSUxFTlRfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iU0lMRU5UX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iU0lMRU5UX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPmFjY2Vzc2liaWxpdHk8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4xPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5yZXJvdXRpbmc8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5wYXRjaDwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+Cis8L3ZvbHVtZUdyb3Vwcz4KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUvQXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUvQXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oCmluZGV4IGE1OTdlODcuLmVmYzY5ZGEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlL0F1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmgKQEAgLTE5LDEwICsxOSw4IEBACiBjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2U7CiBjbGFzcyBBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZTsKIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgewogCiBjbGFzcyBFbmdpbmU7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaAppbmRleCAyZTI5YTliLi4xZmMyMjY0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZS9BdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oCkBAIC0xNiwxMCArMTYsMTEgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KICNpbmNsdWRlIDxFbmdpbmVEZWZpbml0aW9uLmg+CiAjaW5jbHVkZSA8Vm9sdW1lLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db21tb25UeXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CkBAIC0zNiwxOSArMzcsNiBAQAogewogcHVibGljOgogICAgIC8qKgotICAgICAqIEFkZCBhIHN0cmF0ZWd5IHRvIHRoZSBlbmdpbmUKLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gbmFtZSBvZiB0aGUgc3RyYXRlZ3kgdG8gYWRkCi0gICAgICogQHBhcmFtW2luXSBpZGVudGlmaWVyOiB0aGUgbnVtZXJpY2FsIHZhbHVlIGFzc29jaWF0ZWQgdG8gdGhpcyBtZW1iZXIuIEl0IE1VU1QgbWF0Y2ggZWl0aGVyCi0gICAgICogICAgICAgICAgICBzeXN0ZW0vYXVkaW8uaCBvciBzeXN0ZW0vYXVkaW9fcG9saWN5LmggZW51bXJhdGlvbiB2YWx1ZSBpbiBvcmRlciB0byBsaW5rIHRoZQotICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyIGNvbnRyb2xlZCBieSB0aGUgUEZXIGFuZCB0aGUgcG9saWN5IG1hbmFnZXIgY29tcG9uZW50LgotICAgICAqCi0gICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgc3RyYXRlZ3kgaGFzIGJlZW4gYWRkZWQgc3VjY2Vzc2Z1bGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KLSAgICAgKgotICAgICAqLwotICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgYWRkU3RyYXRlZ3koY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIHJvdXRpbmdfc3RyYXRlZ3kgaWQpID0gMDsKLQotICAgIC8qKgogICAgICAqIEFkZCBhIHN0cmVhbXMgdG8gdGhlIGVuZ2luZS4KICAgICAgKgogICAgICAqIEBwYXJhbVtpbl0gbmFtZSBvZiB0aGUgc3RyZWFtIHRvIGFkZApAQCAtNjIsMTkgKzUwLDYgQEAKICAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IGFkZFN0cmVhbShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBpZCkgPSAwOwogCiAgICAgLyoqCi0gICAgICogQWRkIGEgdXNhZ2UgdG8gdGhlIGVuZ2luZQotICAgICAqCi0gICAgICogQHBhcmFtW2luXSBuYW1lIG9mIHRoZSB1c2FnZSB0byBhZGQKLSAgICAgKiBAcGFyYW1baW5dIGlkZW50aWZpZXI6IHRoZSBudW1lcmljYWwgdmFsdWUgYXNzb2NpYXRlZCB0byB0aGlzIG1lbWJlci4gSXQgTVVTVCBtYXRjaCBlaXRoZXIKLSAgICAgKiAgICAgICAgICAgIHN5c3RlbS9hdWRpby5oIG9yIHN5c3RlbS9hdWRpb19wb2xpY3kuaCBlbnVtcmF0aW9uIHZhbHVlIGluIG9yZGVyIHRvIGxpbmsgdGhlCi0gICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgY29udHJvbGVkIGJ5IHRoZSBQRlcgYW5kIHRoZSBwb2xpY3kgbWFuYWdlciBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSB1c2FnZSBoYXMgYmVlbiBhZGRlZCBzdWNjZXNzZnVsbHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgotICAgICAqCi0gICAgICovCi0gICAgdmlydHVhbCBhbmRyb2lkOjpzdGF0dXNfdCBhZGRVc2FnZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYXVkaW9fdXNhZ2VfdCBpZCkgPSAwOwotCi0gICAgLyoqCiAgICAgICogQWRkIGFuIGlucHV0IHNvdXJjZSB0byB0aGUgZW5naW5lCiAgICAgICoKICAgICAgKiBAcGFyYW1baW5dIG5hbWUgb2YgdGhlIGlucHV0IHNvdXJjZSB0byBhZGQKQEAgLTg4LDI2ICs2Myw2IEBACiAgICAgdmlydHVhbCBhbmRyb2lkOjpzdGF0dXNfdCBhZGRJbnB1dFNvdXJjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYXVkaW9fc291cmNlX3QgaWQpID0gMDsKIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgZGV2aWNlIHRvIGJlIHVzZWQgYnkgYSBzdHJhdGVneS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gc3RyYXRlZ3k6IG5hbWUgb2YgdGhlIHN0cmF0ZWd5IGZvciB3aGljaCB0aGUgZGV2aWNlIHRvIHVzZSBoYXMgdG8gYmUgc2V0Ci0gICAgICogQHBhcmFtW2luXSBkZXZpY2VzOyBtYXNrIG9mIGRldmljZXMgdG8gYmUgdXNlZCBmb3IgdGhlIGdpdmVuIHN0cmF0ZWd5LgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2VzIHdlcmUgc2V0IGNvcnJlY2x0eSBmb3IgdGhpcyBzdHJhdGVneSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCBzZXREZXZpY2VGb3JTdHJhdGVneShjb25zdCByb3V0aW5nX3N0cmF0ZWd5ICZzdHJhdGVneSwgYXVkaW9fZGV2aWNlc190IGRldmljZXMpID0gMDsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc3RyYXRlZ3kgdG8gYmUgZm9sbG93ZWQgYnkgYSBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHN0cmVhbTogbmFtZSBvZiB0aGUgc3RyZWFtIGZvciB3aGljaCB0aGUgc3RyYXRlZ3kgdG8gdXNlIGhhcyB0byBiZSBzZXQKLSAgICAgKiBAcGFyYW1baW5dIHN0cmF0ZWd5IHRvIGZvbGxvdyBmb3IgdGhlIGdpdmVuIHN0cmVhbS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyYXRlZ3kgd2VyZSBzZXQgY29ycmVjbHR5IGZvciB0aGlzIHN0cmVhbSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCBzZXRTdHJhdGVneUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW0sIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpID0gMDsKLQotICAgIC8qKgogICAgICAqIFNldCB0aGUgc3RyYXRlZ3kgdG8gYmUgZm9sbG93ZWQgYnkgYSBzdHJlYW0uCiAgICAgICoKICAgICAgKiBAcGFyYW1baW5dIHN0cmVhbTogbmFtZSBvZiB0aGUgc3RyZWFtIGZvciB3aGljaCB0aGUgc3RyYXRlZ3kgdG8gdXNlIGhhcyB0byBiZSBzZXQKQEAgLTExOSwxNiArNzQsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnZvbHVtZVByb2ZpbGUpID0gMDsKIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgc3RyYXRlZ3kgdG8gYmUgZm9sbG93ZWQgYnkgYSB1c2FnZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gdXNhZ2U6IG5hbWUgb2YgdGhlIHVzYWdlIGZvciB3aGljaCB0aGUgc3RyYXRlZ3kgdG8gdXNlIGhhcyB0byBiZSBzZXQKLSAgICAgKiBAcGFyYW1baW5dIHN0cmF0ZWd5IHRvIGZvbGxvdyBmb3IgdGhlIGdpdmVuIHVzYWdlLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdHJhdGVneSB3ZXJlIHNldCBjb3JyZWNsdHkgZm9yIHRoaXMgdXNhZ2UsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgc2V0U3RyYXRlZ3lGb3JVc2FnZShjb25zdCBhdWRpb191c2FnZV90ICZ1c2FnZSwgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkgPSAwOwotCi0gICAgLyoqCiAgICAgICogU2V0IHRoZSBpbnB1dCBkZXZpY2UgdG8gYmUgdXNlZCBieSBhbiBpbnB1dCBzb3VyY2UuCiAgICAgICoKICAgICAgKiBAcGFyYW1baW5dIGlucHV0U291cmNlOiBuYW1lIG9mIHRoZSBpbnB1dCBzb3VyY2UgZm9yIHdoaWNoIHRoZSBkZXZpY2UgdG8gdXNlIGhhcyB0byBiZSBzZXQKQEAgLTEzOSw2ICs4NCwyMiBAQAogICAgIHZpcnR1YWwgYm9vbCBzZXREZXZpY2VGb3JJbnB1dFNvdXJjZShjb25zdCBhdWRpb19zb3VyY2VfdCAmaW5wdXRTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXREZXZpY2VBZGRyZXNzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcykgPSAwOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZXZpY2UgdG8gYmUgdXNlZCBieSBhIHByb2R1Y3Qgc3RyYXRlZ3kuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHN0cmF0ZWd5OiBuYW1lIG9mIHRoZSBwcm9kdWN0IHN0cmF0ZWd5IGZvciB3aGljaCB0aGUgZGV2aWNlIHRvIHVzZSBoYXMgdG8gYmUgc2V0CisgICAgICogQHBhcmFtW2luXSBkZXZpY2VzOyBtYXNrIG9mIGRldmljZXMgdG8gYmUgdXNlZCBmb3IgdGhlIGdpdmVuIHN0cmF0ZWd5LgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2VzIHdlcmUgc2V0IGNvcnJlY2x0eSBmb3IgdGhpcyBzdHJhdGVneSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBzZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lCeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MpID0gMDsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlKCkge30KIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQW5kcm9pZC5tawppbmRleCBiYWFlZmQyLi43ODJmZTgzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0FuZHJvaWQubWsKQEAgLTcsMTU2ICs3LDE3NiBAQAogIwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLWlmZXEgKDEsIDApCi0KIExPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKIAoraWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwkKGZpbHRlciAkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLHBob25lX2NvbmZpZ3VyYWJsZSBhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSBjYXJlbXVfY29uZmlndXJhYmxlIG5vLW91dHB1dF9jb25maWd1cmFibGUgbm8taW5wdXRfY29uZmlndXJhYmxlKSkKKwogUEZXX0NPUkUgOj0gZXh0ZXJuYWwvcGFyYW1ldGVyLWZyYW1ld29yawotQlVJTERfUEZXX1NFVFRJTkdTIDo9ICQoUEZXX0NPUkUpL3N1cHBvcnQvYW5kcm9pZC9idWlsZF9wZndfc2V0dGluZ3MubWsKKyNAVE9ETzogdXBzdHJlYW0gbmV3IGRvbWFpbiBnZW5lcmF0b3IKKyNCVUlMRF9QRldfU0VUVElOR1MgOj0gJChQRldfQ09SRSkvc3VwcG9ydC9hbmRyb2lkL2J1aWxkX3Bmd19zZXR0aW5ncy5tawogUEZXX0RFRkFVTFRfU0NIRU1BU19ESVIgOj0gJChQRldfQ09SRSkvdXBzdHJlYW0vc2NoZW1hcwogUEZXX1NDSEVNQVNfRElSIDo9ICQoUEZXX0RFRkFVTFRfU0NIRU1BU19ESVIpCiAKK1RPT0xTIDo9IGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzCitCVUlMRF9QRldfU0VUVElOR1MgOj0gJChUT09MUykvYnVpbGRfYXVkaW9fcGZ3X3NldHRpbmdzLm1rCisKK1BST1ZJU0lPTl9TVFJBVEVHSUVTX1NUUlVDVFVSRSA6PSAkKFRPT0xTKS9wcm92aXNpb25fc3RyYXRlZ2llc19zdHJ1Y3R1cmUubWsKKworZW5kaWYKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIENPTkZJR1VSQVRJT04gRklMRVMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMjIyMjIyMjIFBvbGljeSBQRlcgdG9wIGxldmVsIGZpbGUgIyMjIyMjIyMjCiAKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxwaG9uZV9jb25maWd1cmFibGUgYXV0b21vdGl2ZV9jb25maWd1cmFibGUgY2FyZW11X2NvbmZpZ3VyYWJsZSkpCisKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogTE9DQUxfTU9EVUxFIDo9IFBhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yaworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrCiBMT0NBTF9TUkNfRklMRVMgOj0gJChMT0NBTF9NT0RVTEUpLmluCiAKKyMgZXh0ZXJuYWwvcGFyYW1ldGVyLWZyYW1ld29yayBwcmV2ZW50cyBmcm9tIHVzaW5nIGRlYnVnIGludGVyZmFjZQogQVVESU9fUEFUVEVSTiA9IEBUVU5JTkdfQUxMT1dFREAKLWlmZXEgKCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpLHVzZXIpCisjaWZlcSAoJChUQVJHRVRfQlVJTERfVkFSSUFOVCksdXNlcikKIEFVRElPX1ZBTFVFID0gZmFsc2UKLWVsc2UKLUFVRElPX1ZBTFVFID0gdHJ1ZQotZW5kaWYKKyNlbHNlCisjQVVESU9fVkFMVUUgPSB0cnVlCisjZW5kaWYKIAotTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCA6PSAkKGhpZGUpIHNlZCAtaSAtZSAnc3wkKEFVRElPX1BBVFRFUk4pfCQoQVVESU9fVkFMVUUpfGcnICQoTE9DQUxfTU9EVUxFX1BBVEgpLyQoTE9DQUxfTU9EVUxFKQorTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCA6PSAkKGhpZGUpIHNlZCAtaSAtZSAnc3wkKEFVRElPX1BBVFRFUk4pfCQoQVVESU9fVkFMVUUpfGcnICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS8kKExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIKS8kKExPQ0FMX01PRFVMRSkKIAogaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQogCi0KLSMjIyMjIyMjIyMgUG9saWN5IFBGVyBTdHJ1Y3R1cmVzICMjIyMjIyMjIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBQb2xpY3lDbGFzcy54bWwKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKLUxPQ0FMX1NSQ19GSUxFUyA6PSBTdHJ1Y3R1cmUvJChMT0NBTF9NT0RVTEUpCi1pbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisjIyMjIyMjIyMjIFBvbGljeSBQRlcgQ29tbW9uIFN0cnVjdHVyZXMgIyMjIyMjIyMjCiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogTE9DQUxfTU9EVUxFIDo9IFBvbGljeVN1YnN5c3RlbS54bWwKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiBMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKIExPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAogICAgIFBvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwgXAorICAgIFByb2R1Y3RTdHJhdGVnaWVzLnhtbCBcCiAgICAgUG9saWN5U3Vic3lzdGVtLVZvbHVtZS54bWwgXAogICAgIGxpYnBvbGljeS1zdWJzeXN0ZW0gXAogCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKLUxPQ0FMX1NSQ19GSUxFUyA6PSBTdHJ1Y3R1cmUvJChMT0NBTF9NT0RVTEUpCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKK0xPQ0FMX1NSQ19GSUxFUyA6PSBjb21tb24vU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFKQogaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQogCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIExPQ0FMX01PRFVMRSA6PSBQb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9TdHJ1Y3R1cmUvUG9saWN5Ci1MT0NBTF9TUkNfRklMRVMgOj0gU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFKQorTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKK0xPQ0FMX1NSQ19GSUxFUyA6PSBjb21tb24vU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFKQogaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQogCi0jIyMjIyMjIyMgUG9saWN5IFBGVyBTZXR0aW5ncyAjIyMjIyMjIyMKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5Ci1MT0NBTF9NT0RVTEVfU1RFTSA6PSBQb2xpY3lDb25maWd1cmFibGVEb21haW5zLnhtbAorTE9DQUxfTU9EVUxFIDo9IFBvbGljeUNsYXNzLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU2V0dGluZ3MvUG9saWN5Ci1MT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSBcCi0gICAgICAgIFBvbGljeUNsYXNzLnhtbCBcCi0gICAgICAgIFBvbGljeVN1YnN5c3RlbS54bWwgXAotICAgICAgICBQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAotCi1pZmVxICgkKHBmd19yZWJ1aWxkX3NldHRpbmdzKSx0cnVlKQotUEZXX1RPUExFVkVMX0ZJTEUgOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAotUEZXX0NSSVRFUklBX0ZJTEUgOj0gJChMT0NBTF9QQVRIKS9wb2xpY3lfY3JpdGVyaWEudHh0Ci1QRldfRUREX0ZJTEVTIDo9IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X21lZGlhLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9waG9uZS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfZHRtZi5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfZW5mb3JjZWRfYXVkaWJsZS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9yZXJvdXRpbmcucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9zdHJhdGVneV9mb3Jfc3RyZWFtLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9pbnB1dF9zb3VyY2UucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy92b2x1bWVzLnBmdwotCi1pbmNsdWRlICQoQlVJTERfUEZXX1NFVFRJTkdTKQotZWxzZQotIyBVc2UgdGhlIGV4aXN0aW5nIGZpbGUKLUxPQ0FMX1NSQ19GSUxFUyA6PSBTZXR0aW5ncy8kKExPQ0FMX01PRFVMRV9TVEVNKQorTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKK0xPQ0FMX1NSQ19GSUxFUyA6PSBjb21tb24vU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFKQogaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQotZW5kaWYgIyBwZndfcmVidWlsZF9zZXR0aW5ncworCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IFByb2R1Y3RTdHJhdGVnaWVzLnhtbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sCitBVURJT19QT0xJQ1lfRU5HSU5FX0NPTkZJR1VSQVRJT05fRklMRSA6PSBcCisgICAgJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKK1NUUkFURUdJRVNfU1RSVUNUVVJFX0ZJTEUgOj0gJChMT0NBTF9QQVRIKS9jb21tb24vU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFKS5pbgorCitpbmNsdWRlICQoUFJPVklTSU9OX1NUUkFURUdJRVNfU1RSVUNUVVJFKQorCitlbmRpZiAjaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwkKGZpbHRlciAkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLHBob25lX2NvbmZpZ3VyYWJsZSBhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSBjYXJlbXVfY29uZmlndXJhYmxlKSkKKworIyMjIyMjIyMjIyBQb2xpY3kgUEZXIEV4YW1wbGUgU3RydWN0dXJlcyAjIyMjIyMjIyMKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxuby1vdXRwdXRfY29uZmlndXJhYmxlIG5vLWlucHV0X2NvbmZpZ3VyYWJsZSkpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IFBvbGljeVN1YnN5c3RlbS1uby1zdHJhdGVneS54bWwKK0xPQ0FMX01PRFVMRV9TVEVNIDo9IFBvbGljeVN1YnN5c3RlbS54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAorICAgIFBvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwgXAorICAgIFBvbGljeVN1YnN5c3RlbS1Wb2x1bWUueG1sIFwKKyAgICBsaWJwb2xpY3ktc3Vic3lzdGVtIFwKKworTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gcGFyYW1ldGVyLWZyYW1ld29yay9TdHJ1Y3R1cmUvUG9saWN5CitMT0NBTF9TUkNfRklMRVMgOj0gY29tbW9uL1N0cnVjdHVyZS8kKExPQ0FMX01PRFVMRV9TVEVNKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitlbmRpZiAjIGlmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxuby1vdXRwdXRfY29uZmlndXJhYmxlIG5vLWlucHV0X2NvbmZpZ3VyYWJsZSkpCiAKICMjIyMjIyMjIyBQb2xpY3kgUEZXIFNldHRpbmdzIC0gTm8gT3V0cHV0ICMjIyMjIyMjIworaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxuby1vdXRwdXRfY29uZmlndXJhYmxlKQorCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrLnBvbGljeS5uby1vdXRwdXQKK0xPQ0FMX01PRFVMRSA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrLnBvbGljeQogTE9DQUxfTU9EVUxFX1NURU0gOj0gUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy1Ob091dHB1dERldmljZS54bWwKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gcGFyYW1ldGVyLWZyYW1ld29yay9TZXR0aW5ncy9Qb2xpY3kKLUxPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9IFwKLSAgICAgICAgUG9saWN5Q2xhc3MueG1sIFwKLSAgICAgICAgUG9saWN5U3Vic3lzdGVtLnhtbCBcCi0gICAgICAgIFBhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sIFwKKyAgICBQb2xpY3lTdWJzeXN0ZW0tbm8tc3RyYXRlZ3kueG1sIFwKKyAgICBQb2xpY3lDbGFzcy54bWwgXAorICAgIFBhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCiAKLVBGV19UT1BMRVZFTF9GSUxFIDo9ICQoVEFSR0VUX09VVF9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKLVBGV19DUklURVJJQV9GSUxFIDo9ICQoTE9DQUxfUEFUSCkvcG9saWN5X2NyaXRlcmlhLnR4dAorUEZXX1RPUExFVkVMX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKK1BGV19DUklURVJJT05fVFlQRVNfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sCitQRldfQ1JJVEVSSUFfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwKIFBGV19FRERfRklMRVMgOj0gXAogICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzTm9PdXRwdXQvZGV2aWNlX2Zvcl9zdHJhdGVnaWVzLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3N0cmVhbS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl91c2FnZS5wZncgXAogICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3JfaW5wdXRfc291cmNlLnBmdyBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3Mvdm9sdW1lcy5wZncKIAogaW5jbHVkZSAkKEJVSUxEX1BGV19TRVRUSU5HUykKLQorZW5kaWYgIyBpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLG5vLW91dHB1dF9jb25maWd1cmFibGUpCiAjIyMjIyMjIyMgUG9saWN5IFBGVyBTZXR0aW5ncyAtIE5vIElucHV0ICMjIyMjIyMjIworaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxuby1pbnB1dF9jb25maWd1cmFibGUpCisKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5Lm5vLWlucHV0CitMT0NBTF9NT0RVTEUgOj0gcGFyYW1ldGVyLWZyYW1ld29yay5wb2xpY3kKIExPQ0FMX01PRFVMRV9TVEVNIDo9IFBvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMtTm9JbnB1dERldmljZS54bWwKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gcGFyYW1ldGVyLWZyYW1ld29yay9TZXR0aW5ncy9Qb2xpY3kKLUxPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9IFwKLSAgICAgICAgUG9saWN5Q2xhc3MueG1sIFwKLSAgICAgICAgUG9saWN5U3Vic3lzdGVtLnhtbCBcCi0gICAgICAgIFBhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sIFwKKyAgICBQb2xpY3lTdWJzeXN0ZW0tbm8tc3RyYXRlZ3kueG1sIFwKKyAgICBQb2xpY3lDbGFzcy54bWwgXAorICAgIFBhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCiAKLVBGV19UT1BMRVZFTF9GSUxFIDo9ICQoVEFSR0VUX09VVF9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKLVBGV19DUklURVJJQV9GSUxFIDo9ICQoTE9DQUxfUEFUSCkvcG9saWN5X2NyaXRlcmlhLnR4dAorUEZXX1RPUExFVkVMX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKK1BGV19DUklURVJJT05fVFlQRVNfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sCitQRldfQ1JJVEVSSUFfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwKIFBGV19FRERfRklMRVMgOj0gXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfbWVkaWEucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Bob25lLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9kdG1mLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2FjY2Vzc2liaWxpdHkucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Jlcm91dGluZy5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl9zdHJlYW0ucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9zdHJhdGVneV9mb3JfdXNhZ2UucGZ3IFwKICAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5nc05vSW5wdXQvZGV2aWNlX2Zvcl9pbnB1dF9zb3VyY2UucGZ3IFwKICAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy92b2x1bWVzLnBmdwogCiBpbmNsdWRlICQoQlVJTERfUEZXX1NFVFRJTkdTKQogCi1lbmRpZiAjIGlmZXEgKDEsIDApCitlbmRpZiAjaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxuby1pbnB1dF9jb25maWd1cmFibGUpCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBSZWN1cnNpdmUgY2FsbCBzdWItZm9sZGVyIEFuZHJvaWQubWsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKKworCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0Nhci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwY2E4ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDU4IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQE5PVEU6CisjIEF1ZGlvIFBvbGljeSBFbmdpbmUgY29uZmlndXJhYmxlIGV4YW1wbGUgZm9yIGdlbmVyaWMgZGV2aWNlIGJ1aWxkCisjCisjIEFueSB2ZW5kb3Igc2hhbGwgaGF2ZSBpdHMgb3duIGNvbmZpZ3VyYXRpb24gd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIGRldmljZSBmb2xkZXIKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSkKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworUEZXX0NPUkUgOj0gZXh0ZXJuYWwvcGFyYW1ldGVyLWZyYW1ld29yaworUEZXX0RFRkFVTFRfU0NIRU1BU19ESVIgOj0gJChQRldfQ09SRSkvdXBzdHJlYW0vc2NoZW1hcworUEZXX1NDSEVNQVNfRElSIDo9ICQoUEZXX0RFRkFVTFRfU0NIRU1BU19ESVIpCisKK1RPT0xTIDo9IGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzCitCVUlMRF9QRldfU0VUVElOR1MgOj0gJChUT09MUykvYnVpbGRfYXVkaW9fcGZ3X3NldHRpbmdzLm1rCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENPTkZJR1VSQVRJT04gRklMRVMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMjIyMjIyMjIFBvbGljeSBQRlcgU3RydWN0dXJlcyAjIyMjIyMjIyMKKyMjIyMjIyMjIyBQb2xpY3kgUEZXIFNldHRpbmdzICMjIyMjIyMjIworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gcGFyYW1ldGVyLWZyYW1ld29yay5wb2xpY3kKK0xPQ0FMX01PRFVMRV9TVEVNIDo9IFBvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU2V0dGluZ3MvUG9saWN5CisKK1BGV19FRERfRklMRVMgOj0gXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVnaWVzLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvLi4vU2V0dGluZ3MvZGV2aWNlX2Zvcl9pbnB1dF9zb3VyY2UucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9TZXR0aW5ncy92b2x1bWVzLnBmdworCitMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSBcCisgICAgJChQRldfRUREX0ZJTEVTKQorCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKKyAgICBQb2xpY3lTdWJzeXN0ZW0ueG1sIFwKKyAgICBQb2xpY3lDbGFzcy54bWwgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwgXAorICAgIFBhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCisKK1BGV19DUklURVJJT05fVFlQRVNfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sCitQRldfQ1JJVEVSSUFfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwKKworUEZXX1RPUExFVkVMX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKKworUEZXX1NDSEVNQVNfRElSIDo9ICQoUEZXX0RFRkFVTFRfU0NIRU1BU19ESVIpCisKK2luY2x1ZGUgJChCVUlMRF9QRldfU0VUVElOR1MpCisKK2VuZGlmICNpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0Nhci9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ2llcy5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXIvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWdpZXMucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YWQ1OTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXIvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWdpZXMucGZ3CkBAIC0wLDAgKzEsNzYwIEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVnaWVzCisJc3VwRG9tYWluOiBPZW1UcmFmZmljQW5vdW5jZW1lbnQKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV90cmFmZmljX2Fub3VuY2VtZW50L2RldmljZV9hZGRyZXNzID0gQlVTMDhfT0VNMQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwOF9PRU0xCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fdHJhZmZpY19hbm91bmNlbWVudC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV90cmFmZmljX2Fub3VuY2VtZW50L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisJc3VwRG9tYWluOiBPZW1TdHJhdGVneTEKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8xL2RldmljZV9hZGRyZXNzID0gQlVTMDhfT0VNMQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwOF9PRU0xCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8xL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKworCXN1cERvbWFpbjogT2VtU3RyYXRlZ3kyCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8yL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMi9kZXZpY2VfYWRkcmVzcyA9IEJVUzA4X09FTTEKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDhfT0VNMQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDAKKworCisKKwlzdXBEb21haW46IFJhZGlvCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3JhZGlvL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yYWRpby9kZXZpY2VfYWRkcmVzcyA9IEJVUzA5X09FTTIKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDlfT0VNMgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmFkaW8vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yYWRpby9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWJ1cyA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3JhZGlvL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMAorCisJc3VwRG9tYWluOiBFeHRBdWRpb1NvdXJjZQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL2RldmljZV9hZGRyZXNzID0gQlVTMDlfT0VNMgorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwOV9PRU0yCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZXh0X2F1ZGlvX3NvdXJjZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDAKKworCisKKwlzdXBEb21haW46IFZvaWNlQ29tbWFuZAorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jb21tYW5kL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jb21tYW5kL2RldmljZV9hZGRyZXNzID0gQlVTMDJfVk9JQ0VfQ09NTUFORAorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwMl9WT0lDRV9DT01NQU5ECisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jb21tYW5kL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY29tbWFuZC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWJ1cyA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogU2FmZXR5QWxlcnQKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zYWZldHlfYWxlcnQvZGV2aWNlX2FkZHJlc3MgPSBCVVMwMF9NRURJQQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwMF9NRURJQQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJYnVzID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IE11c2ljCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL211c2ljL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tdXNpYy9kZXZpY2VfYWRkcmVzcyA9IEJVUzAwX01FRElBCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAwX01FRElBCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tdXNpYy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL211c2ljL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJYnVzID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbXVzaWMvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKworCisJc3VwRG9tYWluOiBOYXZHdWlkYW5jZQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9uYXZfZ3VpZGFuY2Uvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25hdl9ndWlkYW5jZS9kZXZpY2VfYWRkcmVzcyA9IEJVUzAxX05BVl9HVUlEQU5DRQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwMV9OQVZfR1VJREFOQ0UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25hdl9ndWlkYW5jZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25hdl9ndWlkYW5jZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWJ1cyA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25hdl9ndWlkYW5jZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDAKKworCisJc3VwRG9tYWluOiBWb2ljZUNhbGwKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY2FsbC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY2FsbC9kZXZpY2VfYWRkcmVzcyA9IEJVUzA0X0NBTEwKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDRfQ0FMTAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY2FsbC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NhbGwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQlidXMgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jYWxsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IEFsYXJtCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FsYXJtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hbGFybS9kZXZpY2VfYWRkcmVzcyA9IEJVUzA1X0FMQVJNCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzA1X0FMQVJNCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hbGFybS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FsYXJtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJYnVzID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWxhcm0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogUmluZworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL2RldmljZV9hZGRyZXNzID0gQlVTMDNfQ0FMTF9SSU5HCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAzX0NBTExfUklORworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Jpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQlidXMgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IE5vdGlmaWNhdGlvbgorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9ub3RpZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25vdGlmaWNhdGlvbi9kZXZpY2VfYWRkcmVzcyA9IEJVUzA2X05PVElGSUNBVElPTgorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwNl9OT1RJRklDQVRJT04KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25vdGlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25vdGlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWJ1cyA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25vdGlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDAKKworCisJc3VwRG9tYWluOiBTeXN0ZW0KKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc3lzdGVtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zeXN0ZW0vZGV2aWNlX2FkZHJlc3MgPSBCVVMwN19TWVNURU1fU09VTkQKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDdfU1lTVEVNX1NPVU5ECisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zeXN0ZW0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zeXN0ZW0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQlidXMgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zeXN0ZW0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKwlzdXBEb21haW46IFR0cworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy90dHMvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3R0cy9kZXZpY2VfYWRkcmVzcyA9IEJVUzAwX01FRElBCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAwX01FRElBCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy90dHMvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy90dHMvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXJFbXUvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0NhckVtdS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYThmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXJFbXUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDU4IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQE5PVEU6CisjIEF1ZGlvIFBvbGljeSBFbmdpbmUgY29uZmlndXJhYmxlIGV4YW1wbGUgZm9yIGdlbmVyaWMgZGV2aWNlIGJ1aWxkCisjCisjIEFueSB2ZW5kb3Igc2hhbGwgaGF2ZSBpdHMgb3duIGNvbmZpZ3VyYXRpb24gd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIGRldmljZSBmb2xkZXIKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBjYXJlbXVfY29uZmlndXJhYmxlKQorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitQRldfQ09SRSA6PSBleHRlcm5hbC9wYXJhbWV0ZXItZnJhbWV3b3JrCitQRldfREVGQVVMVF9TQ0hFTUFTX0RJUiA6PSAkKFBGV19DT1JFKS91cHN0cmVhbS9zY2hlbWFzCitQRldfU0NIRU1BU19ESVIgOj0gJChQRldfREVGQVVMVF9TQ0hFTUFTX0RJUikKKworVE9PTFMgOj0gZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMKK0JVSUxEX1BGV19TRVRUSU5HUyA6PSAkKFRPT0xTKS9idWlsZF9hdWRpb19wZndfc2V0dGluZ3MubWsKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ09ORklHVVJBVElPTiBGSUxFUworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyMjIyMjIyMgUG9saWN5IFBGVyBTdHJ1Y3R1cmVzICMjIyMjIyMjIworIyMjIyMjIyMjIFBvbGljeSBQRlcgU2V0dGluZ3MgIyMjIyMjIyMjCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrLnBvbGljeQorTE9DQUxfTU9EVUxFX1NURU0gOj0gUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy54bWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gcGFyYW1ldGVyLWZyYW1ld29yay9TZXR0aW5ncy9Qb2xpY3kKKworUEZXX0VERF9GSUxFUyA6PSBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWdpZXMucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9TZXR0aW5ncy9kZXZpY2VfZm9yX2lucHV0X3NvdXJjZS5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL1NldHRpbmdzL3ZvbHVtZXMucGZ3CisKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9IFwKKyAgICAkKFBGV19FRERfRklMRVMpCisKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAorICAgIFBvbGljeVN1YnN5c3RlbS54bWwgXAorICAgIFBvbGljeUNsYXNzLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbCBcCisgICAgUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKKworUEZXX0NSSVRFUklPTl9UWVBFU19GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwKK1BGV19DUklURVJJQV9GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbAorCitQRldfVE9QTEVWRUxfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAorCitQRldfU0NIRU1BU19ESVIgOj0gJChQRldfREVGQVVMVF9TQ0hFTUFTX0RJUikKKworaW5jbHVkZSAkKEJVSUxEX1BGV19TRVRUSU5HUykKKworZW5kaWYgI2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksIGNhcmVtdV9jb25maWd1cmFibGUpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXJFbXUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWdpZXMucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyRW11L1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVnaWVzLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTM0NjRmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyRW11L1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVnaWVzLnBmdwpAQCAtMCwwICsxLDY5MCBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JQcm9kdWN0U3RyYXRlZ2llcworCXN1cERvbWFpbjogT2VtVHJhZmZpY0Fub3VuY2VtZW50CisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV90cmFmZmljX2Fub3VuY2VtZW50L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fdHJhZmZpY19hbm91bmNlbWVudC9kZXZpY2VfYWRkcmVzcyA9IEJVUzAwX01FRElBCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAwX01FRElBCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fdHJhZmZpY19hbm91bmNlbWVudC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV90cmFmZmljX2Fub3VuY2VtZW50L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisJc3VwRG9tYWluOiBPZW1TdHJhdGVneTEKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8xL2RldmljZV9hZGRyZXNzID0gQlVTMDJfT0VNMQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwMl9PRU0xCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8xL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKworCXN1cERvbWFpbjogT2VtU3RyYXRlZ3kyCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8yL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMi9kZXZpY2VfYWRkcmVzcyA9IEJVUzAxX05BVl9HVUlEQU5DRQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwMV9OQVZfR1VJREFOQ0UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8yL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCisJc3VwRG9tYWluOiBSYWRpbworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yYWRpby9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmFkaW8vZGV2aWNlX2FkZHJlc3MgPSBCVVMwMF9NRURJQQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwMF9NRURJQQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmFkaW8vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yYWRpby9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDAKKworCXN1cERvbWFpbjogRXh0QXVkaW9Tb3VyY2UKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZXh0X2F1ZGlvX3NvdXJjZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZXh0X2F1ZGlvX3NvdXJjZS9kZXZpY2VfYWRkcmVzcyA9IEJVUzAwX01FRElBCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAwX01FRElBCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZXh0X2F1ZGlvX3NvdXJjZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDAKKworCisKKwlzdXBEb21haW46IFZvaWNlQ29tbWFuZAorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jb21tYW5kL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jb21tYW5kL2RldmljZV9hZGRyZXNzID0gQlVTMDRfVk9JQ0UKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDRfVk9JQ0UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jb21tYW5kL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IFNhZmV0eUFsZXJ0CisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NhZmV0eV9hbGVydC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L2RldmljZV9hZGRyZXNzID0gQlVTMDBfTUVESUEKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDBfTUVESUEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NhZmV0eV9hbGVydC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NhZmV0eV9hbGVydC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDAKKworCisJc3VwRG9tYWluOiBNdXNpYworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tdXNpYy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbXVzaWMvZGV2aWNlX2FkZHJlc3MgPSBCVVMwMF9NRURJQQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwMF9NRURJQQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbXVzaWMvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tdXNpYy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDAKKworCisKKwlzdXBEb21haW46IE5hdkd1aWRhbmNlCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25hdl9ndWlkYW5jZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbmF2X2d1aWRhbmNlL2RldmljZV9hZGRyZXNzID0gQlVTMDFfTkFWX0dVSURBTkNFCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAxX05BVl9HVUlEQU5DRQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbmF2X2d1aWRhbmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbmF2X2d1aWRhbmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IFZvaWNlQ2FsbAorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jYWxsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jYWxsL2RldmljZV9hZGRyZXNzID0gQlVTMDRfVk9JQ0UKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDRfVk9JQ0UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NhbGwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jYWxsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IEFsYXJtCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FsYXJtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hbGFybS9kZXZpY2VfYWRkcmVzcyA9IEJVUzAwX01FRElBCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAwX01FRElBCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hbGFybS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FsYXJtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IFJpbmcKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmluZy9kZXZpY2VfYWRkcmVzcyA9IEJVUzA0X1ZPSUNFCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzA0X1ZPSUNFCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDAKKworCisJc3VwRG9tYWluOiBOb3RpZmljYXRpb24KKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbm90aWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9ub3RpZmljYXRpb24vZGV2aWNlX2FkZHJlc3MgPSBCVVMwMF9NRURJQQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwMF9NRURJQQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbm90aWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbm90aWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IFN5c3RlbQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zeXN0ZW0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3N5c3RlbS9kZXZpY2VfYWRkcmVzcyA9IEJVUzAzX1NZU1RFTV9TT1VORAorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwM19TWVNURU1fU09VTkQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3N5c3RlbS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3N5c3RlbS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDAKKworCXN1cERvbWFpbjogVHRzCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3R0cy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdHRzL2RldmljZV9hZGRyZXNzID0gQlVTMDBfTUVESUEKKyAKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAwX01FRElBCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy90dHMvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy90dHMvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbC5pbiBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sLmluCmluZGV4IGY1NjE1Y2QuLmY4MGEwN2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sLmluCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sLmluCkBAIC0xLDYgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KIDxQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgU3lzdGVtQ2xhc3NOYW1lPSJQb2xpY3kiIFNlcnZlclBvcnQ9IjUwMTkiIFR1bmluZ0FsbG93ZWQ9IkBUVU5JTkdfQUxMT1dFREAiPgorICAgIFN5c3RlbUNsYXNzTmFtZT0iUG9saWN5IiBTZXJ2ZXJQb3J0PSIvZGV2L3NvY2tldC9hdWRpb3NlcnZlci9wb2xpY3lfZGVidWciCisgICAgVHVuaW5nQWxsb3dlZD0iQFRVTklOR19BTExPV0VEQCI+CiAKICAgICA8U3Vic3lzdGVtUGx1Z2lucz4KICAgICAgICAgPExvY2F0aW9uIEZvbGRlcj0iIj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxODQ1YjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNjYgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBATk9URToKKyMgQXVkaW8gUG9saWN5IEVuZ2luZSBjb25maWd1cmFibGUgZXhhbXBsZSBmb3IgZ2VuZXJpYyBkZXZpY2UgYnVpbGQKKyMKKyMgQW55IHZlbmRvciBzaGFsbCBoYXZlIGl0cyBvd24gY29uZmlndXJhdGlvbiB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgZGV2aWNlIGZvbGRlcgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksIHBob25lX2NvbmZpZ3VyYWJsZSkKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitQRldfQ09SRSA6PSBleHRlcm5hbC9wYXJhbWV0ZXItZnJhbWV3b3JrCitQRldfREVGQVVMVF9TQ0hFTUFTX0RJUiA6PSAkKFBGV19DT1JFKS91cHN0cmVhbS9zY2hlbWFzCitQRldfU0NIRU1BU19ESVIgOj0gJChQRldfREVGQVVMVF9TQ0hFTUFTX0RJUikKKworVE9PTFMgOj0gZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMKK0JVSUxEX1BGV19TRVRUSU5HUyA6PSAkKFRPT0xTKS9idWlsZF9hdWRpb19wZndfc2V0dGluZ3MubWsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENPTkZJR1VSQVRJT04gRklMRVMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyBQb2xpY3kgUEZXIFN0cnVjdHVyZXMgIyMjIyMjIyMjCisjIyMjIyMjIyMgUG9saWN5IFBGVyBTZXR0aW5ncyAjIyMjIyMjIyMKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5CitMT0NBTF9NT0RVTEVfU1RFTSA6PSBQb2xpY3lDb25maWd1cmFibGVEb21haW5zLnhtbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrL1NldHRpbmdzL1BvbGljeQorCitQRldfRUREX0ZJTEVTIDo9IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9TZXR0aW5ncy9kZXZpY2VfZm9yX2lucHV0X3NvdXJjZS5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL1NldHRpbmdzL3ZvbHVtZXMucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfbWVkaWEucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9kdG1mLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcGhvbmUucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfc29uaWZpY2F0aW9uLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9yZXJvdXRpbmcucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcGF0Y2gucGZ3CisKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9IFwKKyAgICAkKFBGV19FRERfRklMRVMpCisKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAorICAgIFBvbGljeVN1YnN5c3RlbS54bWwgXAorICAgIFBvbGljeUNsYXNzLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbCBcCisgICAgUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKKworUEZXX0NSSVRFUklPTl9UWVBFU19GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwKK1BGV19DUklURVJJQV9GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbAorCitQRldfVE9QTEVWRUxfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAorCitQRldfU0NIRU1BU19ESVIgOj0gJChQRldfREVGQVVMVF9TQ0hFTUFTX0RJUikKKworaW5jbHVkZSAkKEJVSUxEX1BGV19TRVRUSU5HUykKKworZW5kaWYgI2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksIHBob25lX2NvbmZpZ3VyYWJsZSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2U5M2RlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2FjY2Vzc2liaWxpdHkucGZ3CkBAIC0wLDAgKzEsNTk2IEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCisJc3VwRG9tYWluOiBBY2Nlc3NpYmlsaXR5CisJCSMKKwkJIyBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZIGZvbGxvd3MgU1RSQVRFR1lfUEhPTkUgaWYgaW4gY2FsbCB3aWRlbHkgc3BlYWtpbmcKKwkJIyBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZIGZvbGxvd3MgU1RSQVRFR1lfTUVESUEgb3RoZXJ3aXNlCisJCSMKKwkJIyBPdGhlciBjYXNlIGFyZSBoYW5kbGVkIHByb2dyYW1tYXRpY2FsbHkgaGFzIGludm9sdmluZyBhY3Rpdml0eSBvZiBzdHJlYW1zLgorCQkjCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBDYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWlwID0gMAorCQkJCQlidXMgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKworCQlkb21haW46IERldmljZQorCQkJY29uZjogUmVtb3RlU3VibWl4CisJCQkJIworCQkJCSMgQWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgMAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAxCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHAKKwkJCQkjCisJCQkJIyBBY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmUKKwkJCQkjCisJCQkJIyBBY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCSMKKwkJCQkjIEFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEZvcmNlU3BlYWtlcldoZW5Ob3RJbkNhbGwKKwkJCQkjCisJCQkJIyBBY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvQ2Fya2l0CisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDEKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjbworCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAxCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJIworCQkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCSMgYnV0IExpbmUgaGFzIGEgbG93ZXIgcHJpb3JpdHkgdGhhbiBXaXJlZEhlYWRzZXQgaW4gdGhpcyBjYXNlLgorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKKwkJCQkJIworCQkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAxCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJIworCQkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5CisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5CisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBVU0IgYWNjZXNzb3J5IG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogRGd0bERvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBEZ3RsRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsCisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEF1eERpZ2l0YWwKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IEhkbWkgbm90IHJlYWNoYWJsZSBpbiBjYWxsCisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMQorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5CisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBFYXJwaWVjZQorCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2R0bWYucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2R0bWYucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NDI2YzYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfZHRtZi5wZncKQEAgLTAsMCArMSw2MjUgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yUHJvZHVjdFN0cmF0ZWdpZXMKKwlzdXBEb21haW46IER0bWYKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJYnVzID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvZGV2aWNlX2FkZHJlc3MgPQorCisJCWRvbWFpbjogRGV2aWNlMgorCQkJY29uZjogUmVtb3RlU3VibWl4CisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgMAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAxCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogRm9yY2VTcGVha2VyV2hlbk5vdEluQ2FsbAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyBJc05vdCBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMQorCisJCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0CisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvCisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAxCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJIworCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkjIGJ1dCBMaW5lIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gV2lyZWRIZWFkc2V0IGluIHRoaXMgY2FzZS4KKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkc2V0CisJCQkJCSMKKwkJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMQorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJIworCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5CisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5CisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAxCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBVU0IgYWNjZXNzb3J5IG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgRGd0bERvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogSGRtaQorCQkJCSMKKwkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgSGRtaSBub3QgcmVhY2hhYmxlIGluIGNhbGwKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAxCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5CisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogRWFycGllY2UKKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEVhcnBpZWNlCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBTcGVha2VyCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJZG9tYWluOiBBcmMKKwkJCSMKKwkJCSMgRFRNRiBzdHJhdGVneSBmb2xsb3dzIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkjIHRoZXNlIGZvbGxvd2luZyBkb21haW5zIGNvbnNpc3RzIGluIGRldmljZShzKSB0aGF0IGNhbiBjby1leGlzdCB3aXRoIG90aGVycworCQkJIyBlLmcuIEFSQywgU1BESUYsIEFVWF9MSU5FCisJCQkjCisJCQljb25mOiBTZWxlY3RlZAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWlBcmMKKworCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyA9IDAKKworCQlkb21haW46IFNwZGlmCisJCQkjCisJCQkjIERUTUYgc3RyYXRlZ3kgZm9sbG93cyBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKKwkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQorCQkJIworCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGRpZgorCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMAorCisJCWRvbWFpbjogQXV4TGluZQorCQkJIworCQkJIyBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCisJCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKKwkJCSMKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQXV4TGluZQorCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lID0gMApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYWE5YWMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfZW5mb3JjZWRfYXVkaWJsZS5wZncKQEAgLTAsMCArMSwzNjEgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yUHJvZHVjdFN0cmF0ZWd5CisKKwlzdXBEb21haW46IEVuZm9yY2VkQXVkaWJsZQorCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBDYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQkjIG5vIGVuZm9yY2VkX2F1ZGlibGUgb24gcmVtb3RlIHN1Ym1peCAoZS5nLiBXRkQpCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCWJ1cyA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKworCQlkb21haW46IFNwZWFrZXIKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJIworCQkJCSMgc3RyYXRlZ3kgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSB1c2VzIHNhbWUgcm91dGluZyBwb2xpY3kgYXMgU1RSQVRFR1lfU09OSUZJQ0FUSU9OCisJCQkJIyBleGNlcHQ6CisJCQkJIyAgICAtIHdoZW4gaW4gY2FsbCB3aGVyZSBpdCBkb2Vzbid0IGRlZmF1bHQgdG8gU1RSQVRFR1lfUEhPTkUgYmVoYXZpb3IKKwkJCQkjICAgIC0gaW4gY291bnRyaWVzIHdoZXJlIG5vdCBlbmZvcmNlZCBpbiB3aGljaCBjYXNlIGl0IGZvbGxvd3MgU1RSQVRFR1lfTUVESUEKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJQU5ZCisJCQkJCUZvcmNlVXNlRm9yU3lzdGVtIElzIEZvcmNlU3lzdGVtRW5mb3JjZWQKKwkJCQkJQUxMCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzIEZvcmNlU3BlYWtlcgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBSZW1vdGVTdWJtaXgKKwkJCQkJCUFOWQorCQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgQmx1ZXRvb3RoQTJkcAorCQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBTcGVha2VyIGlzIGFsc28gdGhlIGZhbGxiYWNrIGRldmljZSBpZiBhbnkgb2YgdGhlIGRldmljZSBmcm9tIERldmljZTIgZG9tYWluCisJCQkJCSMgaXMgc2VsZWN0ZWQuCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFJlbW90ZVN1Ym1peAorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBMaW5lCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHNldAorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiRGV2aWNlCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIERndGxEb2NrSGVhZHNldAorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBIZG1pCisJCQkJCQlBTlkKKwkJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCQkJCQkJCUZvcmNlVXNlRm9yRG9jayBJc05vdCBGb3JjZUFuYWxvZ0RvY2sKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCisJCWRvbWFpbjogRGV2aWNlMgorCQkJY29uZjogUmVtb3RlU3VibWl4CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIDAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMQorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogTGluZQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMQorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBVc2JBY2Nlc3NvcnkKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBVc2JEZXZpY2UKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBIZG1pCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jaworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBOb0RldmljZQorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X21lZGlhLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9tZWRpYS5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkMzU1YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9tZWRpYS5wZncKQEAgLTAsMCArMSwzNDAgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yUHJvZHVjdFN0cmF0ZWd5CisJc3VwRG9tYWluOiBNZWRpYQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCWJ1cyA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvZGV2aWNlX2FkZHJlc3MgPQorCisJCWRvbWFpbjogRGV2aWNlMgorCQkJY29uZjogUmVtb3RlU3VibWl4CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIDAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMQorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBGb3JjZVNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzIEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCSMKKwkJCQkjIElmIGhkbWkgc3lzdGVtIGF1ZGlvIG1vZGUgaXMgb24sIHJlbW92ZSBzcGVha2VyIG91dCBvZiBvdXRwdXQgbGlzdC4KKwkJCQkjCisJCQkJRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gSXNOb3QgRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDEKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBVc2JBY2Nlc3NvcnkKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogRGd0bERvY2tIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBBdXhEaWdpdGFsCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCSMKKwkJCQkjIElmIGhkbWkgc3lzdGVtIGF1ZGlvIG1vZGUgaXMgb24sIHJlbW92ZSBzcGVha2VyIG91dCBvZiBvdXRwdXQgbGlzdC4KKwkJCQkjCisJCQkJRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gSXNOb3QgRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQlkb21haW46IEFyYworCQkJIworCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKKwkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQorCQkJIworCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWlBcmMKKworCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjID0gMAorCisJCWRvbWFpbjogU3BkaWYKKwkJCSMKKwkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCisJCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKKwkJCSMKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGRpZgorCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYgPSAwCisKKwkJZG9tYWluOiBBdXhMaW5lCisJCQljb25mOiBTZWxlY3RlZAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQXV4TGluZQorCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcGF0Y2gucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3BhdGNoLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmNjMDkwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3BhdGNoLnBmdwpAQCAtMCwwICsxLDM2IEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogUGF0Y2gKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGF0Y2gvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCWJ1cyA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGF0Y2gvZGV2aWNlX2FkZHJlc3MgPQorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9waG9uZS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcGhvbmUucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OTNkNGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcGhvbmUucGZ3CkBAIC0wLDAgKzEsNDgzIEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogUGhvbmUKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQkjIG5vIHNvbmlmaWNhdGlvbiBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJYnVzID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL2RldmljZV9hZGRyZXNzID0KKworCQlkb21haW46IERldmljZQorCQkJY29uZjogU2NvQ2Fya2l0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMQorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlTm9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDEKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKwkJCQlBTlkKKwkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlTm9uZQorCQkJCQlBTEwKKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQkJCSMKKwkJCQkJCSMgSW4gY2FzZSBvZiBGb3JjZSBTcGVha2VyLCBwcmlvcml0eSBiZXR3ZWVuIGRldmljZSBhbmQgYWNjZXNzb3J5IGFyZQorCQkJCQkJIyBpbnZlcnRlZCBjb21wYXJlZCB0byBGb3JjZSBOb25lIG9yIEJ0IFNjbworCQkJCQkJIworCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEhkbWkKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMQorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogRWFycGllY2UKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEVhcnBpZWNlCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIG9uIGRlZmF1bHQgb3V0cHV0IGRldmljZSB3aGljaCBjYW4gYmUgc3BlYWtlciBmb3IgZXhhbXBsZQorCQkJCSMKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKworCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9yZXJvdXRpbmcucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZjg4MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdwpAQCAtMCwwICsxLDM2IEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogUmVyb3V0aW5nCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJYnVzID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yZXJvdXRpbmcvZGV2aWNlX2FkZHJlc3MgPQorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3NvbmlmaWNhdGlvbi5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRlZGVlYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3CkBAIC0wLDAgKzEsNDkwIEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogU29uaWZpY2F0aW9uCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsIGJ1dCBIRE1JIGlzIG5vdCByZWFjaGFibGUKKwkJCQkJIworCQkJCQloZG1pID0gMAorCQkJCQlidXMgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9kZXZpY2VfYWRkcmVzcyA9CisKKwkJZG9tYWluOiBTcGVha2VyCisKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBFTkZPUkNFRF9BVURJQkxFIGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJCSMKKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgTGluZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCisJCWRvbWFpbjogRGV2aWNlMgorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogU2NvQ2Fya2l0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvQ2Fya2l0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMQorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFNjb0hlYWRzZXQKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFNjbworCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIyBidXQgTGluZSBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIFdpcmVkSGVhZHNldCBpbiB0aGlzIGNhc2UuCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHNldAorCQkJCQkjCisJCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDEKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCQkjCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJCSMKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAxCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBVU0IgQWNjZXNzb3J5IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgRGd0bERvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgQW5sZ0RvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jaworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBFYXJwaWVjZQorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogTm9uZQorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhM2RkNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3CkBAIC0wLDAgKzEsNTM2IEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogU29uaWZpY2F0aW9uUmVzcGVjdGZ1bAorCQkjCisJCSMgU29uaWZpY2lhdGlvbiBSZXNwZWN0ZnVsIGZvbGxvd3M6CisJCSMJLSBJZiBpbiBjYWxsOiBTdHJhdGVneSBzb25pZmljYXRpb24gKHRoYXQgZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpbiBjYWxsIGFsc28uLi4pCisJCSMJLSBJZiBub3QgaW4gY2FsbCBBTkQgYSBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlIHJlbW90ZWx5OiBTdHJhdGVneSBzb25pZmljYXRpb24gKHRoYXQKKwkJIyAgICAgZm9sbG93cyBlbmZvcmNlZCBhdWRpYmxlLCB3aGljaCBmb2xsb3dzIG1lZGlhKQorCQkjCS0gaWYgbm90IGluIGNhbGwgYW5kIG5vIG11c2ljIHN0cmVhbSBhY3RpdmUgcmVtb3RlbHkgYW5kIG11c2ljIHN0cmVhbSBhY3RpdmUpOiBzdHJhdGVneQorCQkjICAgICBtZWRpYQorCQkjICAgLSBPdGhlcndpc2UgZm9sbG93cyBzb25pZmljYXRpb24gYnkgcmVwbGFjaW5nIHNwZWFrZXIgd2l0aCBzcGVha2VyIHNhZmUgaWYgc3BlYWtlciBpcworCQkjCSAgc2VsZWN0ZWQuCisJCSMKKwkJIyBDYXNlIG9mIHN0cmVhbSBhY3RpdmUgaGFuZGxlZCBwcm9ncmFtbWF0aWNhbGx5CisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvZGV2aWNlX2FkZHJlc3MgPQorCisJCWRvbWFpbjogU3BlYWtlcnMKKworCQkJY29uZjogU3BlYWtlclNhZmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXJTYWZlCisJCQkJIworCQkJCSMgRm9sbG93cyBzb25pZmljYXRpb24gc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgYW5kIHJlcGxhY2Ugc3BlYWtlciBieSBzcGVha2VyIHNhZmUKKwkJCQkjIGlmIGFuZCBvbmx5IGlmIHNwZWFrZXIgb25seSBzZWxlY3RlZAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXJfc2FmZSA9IDEKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgRm9sbG93cyBzb25pZmljYXRpb24gc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBjYWxsCisJCQkJCQkjCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlzcGVha2VyID0gMQorCisJCQljb25mOiBOb25lCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJZG9tYWluOiBEZXZpY2UyCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvQ2Fya2l0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0NhcmtpdAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCUFOWQorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJCSMKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJCQkjCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkjIGJ1dCBMaW5lIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gV2lyZWRIZWFkc2V0IGluIHRoaXMgY2FzZS4KKwkJCQkJIworCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAxCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJQU5ZCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkJIworCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkJCSMKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBVc2JEZXZpY2UKKwkJCQlBTlkKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCQkjCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCQkJIworCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBVc2JBY2Nlc3NvcnkKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IFVzYkFjY2Vzc29yeSBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgRGd0bERvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQXV4RGlnaXRhbAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgSERNSSBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMQorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBFYXJwaWVjZQorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEVhcnBpZWNlCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZjNzY3MAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3CkBAIC0wLDAgKzEsNDMgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yUHJvZHVjdFN0cmF0ZWd5CisJc3VwRG9tYWluOiBUcmFuc21pdHRlZFRocm91Z2hTcGVha2VyCisJCWRvbWFpbjogVW5yZWFjaGVhYmxlRGV2aWNlcworCQkJY29uZjogQ2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlidXMgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9kZXZpY2VfYWRkcmVzcyA9CisKKwkJZG9tYWluOiBTcGVha2VyCisJCQljb25mOiBTZWxlY3RlZAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9Qb2xpY3lDb25maWd1cmFibGVEb21haW5zLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL1BvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sCmluZGV4IGI0M2Y4M2IuLjA3MTA0NDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL1BvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL1BvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sCkBAIC04NDcyLDcgKzg0NzIsNyBAQAogICAgIDxDb25maWd1cmF0aW9ucz4KICAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNvbmlmaWNhdGlvbiI+CiAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KLSAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IlJpbmdUb25lIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJSaW5ndG9uZSIvPgogICAgICAgICA8L0NvbXBvdW5kUnVsZT4KICAgICAgIDwvQ29uZmlndXJhdGlvbj4KICAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlBob25lIj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2FjY2Vzc2liaWxpdHkucGZ3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjExOTgwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncKKysrIC9kZXYvbnVsbApAQCAtMSw1OTMgKzAsMCBAQAotc3VwRG9tYWluOiBEZXZpY2VGb3JTdHJhdGVneQotCi0Jc3VwRG9tYWluOiBBY2Nlc3NpYmlsaXR5Ci0JCSMKLQkJIyBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZIGZvbGxvd3MgU1RSQVRFR1lfUEhPTkUgaWYgaW4gY2FsbCB3aWRlbHkgc3BlYWtpbmcKLQkJIyBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZIGZvbGxvd3MgU1RSQVRFR1lfTUVESUEgb3RoZXJ3aXNlCi0JCSMKLQkJIyBPdGhlciBjYXNlIGFyZSBoYW5kbGVkIHByb2dyYW1tYXRpY2FsbHkgaGFzIGludm9sdmluZyBhY3Rpdml0eSBvZiBzdHJlYW1zLgotCQkjCi0JCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCi0JCQljb25mOiBDYWxpYnJhdGlvbgotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJaGRtaV9hcmMgPSAwCi0JCQkJCXNwZGlmID0gMAotCQkJCQlhdXhfbGluZSA9IDAKLQkJCQkJZm0gPSAwCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlpcCA9IDAKLQkJCQkJYnVzID0gMAotCQkJCQlzdHViID0gMAotCi0JCWRvbWFpbjogRGV2aWNlCi0JCQljb25mOiBSZW1vdGVTdWJtaXgKLQkJCQkjCi0JCQkJIyBBY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgUmVtb3RlU3VibWl4Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAxCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHAKLQkJCQkjCi0JCQkJIyBBY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lCi0JCQkJIwotCQkJCSMgQWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJIwotCQkJCSMgQWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEZvcmNlU3BlYWtlcldoZW5Ob3RJbkNhbGwKLQkJCQkjCi0JCQkJIyBBY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aFNjb0NhcmtpdAotCQkJCSMKLQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvQ2Fya2l0Ci0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMQotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvSGVhZHNldAotCQkJCSMKLQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aFNjbwotCQkJCSMKLQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMQotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCSMKLQkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIyBidXQgTGluZSBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIFdpcmVkSGVhZHNldCBpbiB0aGlzIGNhc2UuCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHNldAotCQkJCQkjCi0JCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAxCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkc2V0Ci0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQkjCi0JCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBVc2JEZXZpY2UKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCSMKLQkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQotCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMQotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBVc2JBY2Nlc3NvcnkKLQkJCQkjCi0JCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IFVTQiBhY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRGd0bERvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBEZ3RsRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBBdXhEaWdpdGFsCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBIZG1pIG5vdCByZWFjaGFibGUgaW4gY2FsbAotCQkJCSMKLQkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAxCi0KLQkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAotCQkJCSMKLQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgQW5sZ0RvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbAotCQkJCSMKLQkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jawotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBFYXJwaWVjZQotCQkJCSMKLQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMQotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMQotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRGVmYXVsdAotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9kdG1mLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfZHRtZi5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4M2M3NDEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9kdG1mLnBmdworKysgL2Rldi9udWxsCkBAIC0xLDYyMyArMCwwIEBACi1zdXBEb21haW46IERldmljZUZvclN0cmF0ZWd5Ci0KLQlzdXBEb21haW46IER0bWYKLQotCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcwotCQkJY29uZjogQ2FsaWJyYXRpb24KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWZtID0gMAotCQkJCQlzcGVha2VyX3NhZmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlpcCA9IDAKLQkJCQkJYnVzID0gMAotCQkJCQlzdHViID0gMAotCi0JCWRvbWFpbjogRGV2aWNlMgotCQkJY29uZjogUmVtb3RlU3VibWl4Ci0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMQotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCSMKLQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcwotCQkJCSMKLQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEZvcmNlU3BlYWtlcldoZW5Ob3RJbkNhbGwKLQkJCQkjCi0JCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gSXNOb3QgRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAxCi0KLQkJCWNvbmY6IEJsdWV0b290aFNjb0hlYWRzZXQKLQkJCQkjCi0JCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvCi0JCQkJIwotCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMQotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCSMKLQkJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IExpbmUKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJCSMgYnV0IExpbmUgaGFzIGEgbG93ZXIgcHJpb3JpdHkgdGhhbiBXaXJlZEhlYWRzZXQgaW4gdGhpcyBjYXNlLgotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKLQkJCQkJIwotCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMQotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRzZXQKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCSMKLQkJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBVc2JEZXZpY2UKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCSMKLQkJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDEKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBVc2JBY2Nlc3NvcnkKLQkJCQkjCi0JCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IFVTQiBhY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IERndGxEb2NrSGVhZHNldAotCQkJCSMKLQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgRGd0bERvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbAotCQkJCSMKLQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEhkbWkKLQkJCQkjCi0JCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IEhkbWkgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAotCQkJCSMKLQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgQW5sZ0RvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbAotCQkJCSMKLQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogRWFycGllY2UKLQkJCQkjCi0JCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEVhcnBpZWNlCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDEKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogU3BlYWtlcgotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyBJc05vdCBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQotCQkJY29uZjogRGVmYXVsdAotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJZG9tYWluOiBBcmMKLQkJCSMKLQkJCSMgRFRNRiBzdHJhdGVneSBmb2xsb3dzIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkjIHRoZXNlIGZvbGxvd2luZyBkb21haW5zIGNvbnNpc3RzIGluIGRldmljZShzKSB0aGF0IGNhbiBjby1leGlzdCB3aXRoIG90aGVycwotCQkJIyBlLmcuIEFSQywgU1BESUYsIEFVWF9MSU5FCi0JCQkjCi0JCQljb25mOiBTZWxlY3RlZAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWlBcmMKLQotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjID0gMQotCi0JCQljb25mOiBOb3RTZWxlY3RlZAotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjID0gMAotCi0JCWRvbWFpbjogU3BkaWYKLQkJCSMKLQkJCSMgRFRNRiBzdHJhdGVneSBmb2xsb3dzIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkjIHRoZXNlIGZvbGxvd2luZyBkb21haW5zIGNvbnNpc3RzIGluIGRldmljZShzKSB0aGF0IGNhbiBjby1leGlzdCB3aXRoIG90aGVycwotCQkJIyBlLmcuIEFSQywgU1BESUYsIEFVWF9MSU5FCi0JCQkjCi0JCQljb25mOiBTZWxlY3RlZAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZGlmCi0KLQkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiA9IDEKLQotCQkJY29uZjogTm90U2VsZWN0ZWQKLQkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiA9IDAKLQotCQlkb21haW46IEF1eExpbmUKLQkJCSMKLQkJCSMgRFRNRiBzdHJhdGVneSBmb2xsb3dzIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkjIHRoZXNlIGZvbGxvd2luZyBkb21haW5zIGNvbnNpc3RzIGluIGRldmljZShzKSB0aGF0IGNhbiBjby1leGlzdCB3aXRoIG90aGVycwotCQkJIyBlLmcuIEFSQywgU1BESUYsIEFVWF9MSU5FCi0JCQkjCi0JCQljb25mOiBTZWxlY3RlZAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEF1eExpbmUKLQotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lID0gMQotCi0JCQljb25mOiBOb3RTZWxlY3RlZAotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lID0gMApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfZW5mb3JjZWRfYXVkaWJsZS5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MDQ2MzEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdworKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi1zdXBEb21haW46IERldmljZUZvclN0cmF0ZWd5Ci0KLQlzdXBEb21haW46IEVuZm9yY2VkQXVkaWJsZQotCi0JCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCi0JCQljb25mOiBDYWxpYnJhdGlvbgotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJIyBubyBlbmZvcmNlZF9hdWRpYmxlIG9uIHJlbW90ZSBzdWJtaXggKGUuZy4gV0ZEKQotCQkJCQloZG1pX2FyYyA9IDAKLQkJCQkJc3BkaWYgPSAwCi0JCQkJCWF1eF9saW5lID0gMAotCQkJCQlzcGVha2VyX3NhZmUgPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCWZtID0gMAotCQkJCQlzdHViID0gMAotCi0JCWRvbWFpbjogU3BlYWtlcgotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQkjCi0JCQkJIyBzdHJhdGVneSBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFIHVzZXMgc2FtZSByb3V0aW5nIHBvbGljeSBhcyBTVFJBVEVHWV9TT05JRklDQVRJT04KLQkJCQkjIGV4Y2VwdDoKLQkJCQkjICAgIC0gd2hlbiBpbiBjYWxsIHdoZXJlIGl0IGRvZXNuJ3QgZGVmYXVsdCB0byBTVFJBVEVHWV9QSE9ORSBiZWhhdmlvcgotCQkJCSMgICAgLSBpbiBjb3VudHJpZXMgd2hlcmUgbm90IGVuZm9yY2VkIGluIHdoaWNoIGNhc2UgaXQgZm9sbG93cyBTVFJBVEVHWV9NRURJQQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQlBTlkKLQkJCQkJRm9yY2VVc2VGb3JTeXN0ZW0gSXMgRm9yY2VTeXN0ZW1FbmZvcmNlZAotCQkJCQlBTEwKLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFJlbW90ZVN1Ym1peAotCQkJCQkJQU5ZCi0JCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBCbHVldG9vdGhBMmRwCi0JCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcwotCQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIFNwZWFrZXIgaXMgYWxzbyB0aGUgZmFsbGJhY2sgZGV2aWNlIGlmIGFueSBvZiB0aGUgZGV2aWNlIGZyb20gRGV2aWNlMiBkb21haW4KLQkJCQkJIyBpcyBzZWxlY3RlZC4KLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgUmVtb3RlU3VibWl4Ci0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHBob25lCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIExpbmUKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkc2V0Ci0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JEZXZpY2UKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEhkbWkKLQkJCQkJCUFOWQotCQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJCQkJRm9yY2VVc2VGb3JEb2NrIElzTm90IEZvcmNlQW5hbG9nRG9jawotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMQotCi0JCQljb25mOiBOb3RTZWxlY3RlZAotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQotCQlkb21haW46IERldmljZTIKLQkJCWNvbmY6IFJlbW90ZVN1Ym1peAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgUmVtb3RlU3VibWl4Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAxCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcwotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHBob25lCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDEKLQotCQkJY29uZjogV2lyZWRIZWFkc2V0Ci0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDEKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFVzYkFjY2Vzc29yeQotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBVc2JEZXZpY2UKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAxCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogRGd0bERvY2tIZWFkc2V0Ci0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEhkbWkKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jawotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogTm9EZXZpY2UKLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X21lZGlhLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfbWVkaWEucGZ3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGI2YWUwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfbWVkaWEucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLWRvbWFpbkdyb3VwOiBEZXZpY2VGb3JTdHJhdGVneQotCi0JZG9tYWluR3JvdXA6IE1lZGlhCi0KLQkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKLQkJCWNvbmY6IENhbGlicmF0aW9uCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZm0gPSAwCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJaXAgPSAwCi0JCQkJCWJ1cyA9IDAKLQkJCQkJc3R1YiA9IDAKLQotCQlkb21haW46IERldmljZTIKLQkJCWNvbmY6IFJlbW90ZVN1Ym1peAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgUmVtb3RlU3VibWl4Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAxCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHAKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VCdFNjbwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMQotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEZvcmNlU3BlYWtlcgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCi0JCQkJIwotCQkJCSMgSWYgaGRtaSBzeXN0ZW0gYXVkaW8gbW9kZSBpcyBvbiwgcmVtb3ZlIHNwZWFrZXIgb3V0IG9mIG91dHB1dCBsaXN0LgotCQkJCSMKLQkJCQlGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyBJc05vdCBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDEKLQkJCQkJaGRtaSA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRwaG9uZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlsaW5lID0gMQotCi0JCQljb25mOiBXaXJlZEhlYWRzZXQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBVc2JBY2Nlc3NvcnkKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBVc2JEZXZpY2UKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMQotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBBdXhEaWdpdGFsCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMQotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jawotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCi0JCQkJIwotCQkJCSMgSWYgaGRtaSBzeXN0ZW0gYXVkaW8gbW9kZSBpcyBvbiwgcmVtb3ZlIHNwZWFrZXIgb3V0IG9mIG91dHB1dCBsaXN0LgotCQkJCSMKLQkJCQlGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyBJc05vdCBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZUJ0U2NvCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMQotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IERlZmF1bHQKLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJZG9tYWluOiBBcmMKLQkJCSMKLQkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCi0JCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKLQkJCSMKLQkJCWNvbmY6IFNlbGVjdGVkCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pQXJjCi0KLQkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjID0gMAotCi0JCWRvbWFpbjogU3BkaWYKLQkJCSMKLQkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCi0JCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKLQkJCSMKLQkJCWNvbmY6IFNlbGVjdGVkCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGRpZgotCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMQotCi0JCQljb25mOiBOb3RTZWxlY3RlZAotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiA9IDAKLQotCQlkb21haW46IEF1eExpbmUKLQkJCWNvbmY6IFNlbGVjdGVkCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBdXhMaW5lCi0KLQkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lID0gMApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9waG9uZS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Bob25lLnBmdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM3MWFkOS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Bob25lLnBmdworKysgL2Rldi9udWxsCkBAIC0xLDQ4MyArMCwwIEBACi1zdXBEb21haW46IERldmljZUZvclN0cmF0ZWd5Ci0KLQlzdXBEb21haW46IFBob25lCi0KLQkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKLQkJCWNvbmY6IENhbGlicmF0aW9uCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJIyBubyBzb25pZmljYXRpb24gb24gcmVtb3RlIHN1Ym1peCAoZS5nLiBXRkQpCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWhkbWlfYXJjID0gMAotCQkJCQlhdXhfbGluZSA9IDAKLQkJCQkJc3BkaWYgPSAwCi0JCQkJCWZtID0gMAotCQkJCQlzcGVha2VyX3NhZmUgPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBEZXZpY2UKLQkJCWNvbmY6IFNjb0NhcmtpdAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvQ2Fya2l0Ci0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aFNjbwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAxCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCSMKLQkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCi0JCQkJIyBvciBGT1JDRV9OT05FCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VOb25lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VOb25lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHBob25lCi0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkc2V0Ci0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDEKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IExpbmUKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAxCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCSMKLQkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCi0JCQkJIyBvciBGT1JDRV9OT05FCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCi0JCQkJQU5ZCi0JCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0JCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKLQkJCQkJQUxMCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCi0JCQkJCQkjCi0JCQkJCQkjIEluIGNhc2Ugb2YgRm9yY2UgU3BlYWtlciwgcHJpb3JpdHkgYmV0d2VlbiBkZXZpY2UgYW5kIGFjY2Vzc29yeSBhcmUKLQkJCQkJCSMgaW52ZXJ0ZWQgY29tcGFyZWQgdG8gRm9yY2UgTm9uZSBvciBCdCBTY28KLQkJCQkJCSMKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5Ci0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAxCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogVXNiQWNjZXNzb3J5Ci0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMQotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IERndGxEb2NrSGVhZHNldAotCQkJCSMKLQkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCi0JCQkJIyBvciBGT1JDRV9OT05FCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBIZG1pCi0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAxCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogRWFycGllY2UKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEVhcnBpZWNlCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAxCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBTcGVha2VyCi0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMQotCi0JCQljb25mOiBEZWZhdWx0Ci0JCQkJIwotCQkJCSMgRmFsbGJhY2sgb24gZGVmYXVsdCBvdXRwdXQgZGV2aWNlIHdoaWNoIGNhbiBiZSBzcGVha2VyIGZvciBleGFtcGxlCi0JCQkJIwotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Jlcm91dGluZy5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Jlcm91dGluZy5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTYyZjcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9yZXJvdXRpbmcucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLWRvbWFpbkdyb3VwOiBEZXZpY2VGb3JTdHJhdGVneQotCi0JZG9tYWluR3JvdXA6IFJlcm91dGluZwotCQkjCi0JCSMgRmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneQotCQkjCi0JCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCi0JCQljb25mOiBDYWxpYnJhdGlvbgotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQloZG1pX2FyYyA9IDAKLQkJCQkJc3BkaWYgPSAwCi0JCQkJCWF1eF9saW5lID0gMAotCQkJCQlmbSA9IDAKLQkJCQkJc3BlYWtlcl9zYWZlID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlpcCA9IDAKLQkJCQkJYnVzID0gMAotCQkJCQlzdHViID0gMAotCi0JCWRvbWFpbjogRGV2aWNlMgotCQkJY29uZjogUmVtb3RlU3VibWl4Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMQotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHAKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmUKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEZvcmNlU3BlYWtlcgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAxCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRwaG9uZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMQotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IExpbmUKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMQotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBVc2JBY2Nlc3NvcnkKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogVXNiRGV2aWNlCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAxCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IERndGxEb2NrSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBBdXhEaWdpdGFsCi0JCQkJIwotCQkJCSMgUmVyb3V0aW5nIGlzIHNpbWlsYXIgdG8gbWVkaWEgYW5kIHNvbmlmaWNhdGlvbiAoZXhlcHQgaGVyZTogc29uaWZpY2F0aW9uIGlzIG5vdCBhbGxvd2VkIG9uIEhETUkpCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDEKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAxCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBEZWZhdWx0Ci0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDc0MGQxLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uLnBmdworKysgL2Rldi9udWxsCkBAIC0xLDQ5MCArMCwwIEBACi1zdXBEb21haW46IERldmljZUZvclN0cmF0ZWd5Ci0KLQlzdXBEb21haW46IFNvbmlmaWNhdGlvbgotCi0JCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCi0JCQljb25mOiBDYWxpYnJhdGlvbgotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQkjIG5vIHNvbmlmaWNhdGlvbiBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJaGRtaV9hcmMgPSAwCi0JCQkJCXNwZGlmID0gMAotCQkJCQlmbSA9IDAKLQkJCQkJc3BlYWtlcl9zYWZlID0gMAotCQkJCQlhdXhfbGluZSA9IDAKLQkJCQkJIwotCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgYnV0IEhETUkgaXMgbm90IHJlYWNoYWJsZQotCQkJCQkjCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBTcGVha2VyCi0KLQkJCWNvbmY6IFNlbGVjdGVkCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCi0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBFTkZPUkNFRF9BVURJQkxFIGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJQUxMCi0JCQkJCQkjCi0JCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJCSMKLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgTGluZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJZG9tYWluOiBEZXZpY2UyCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHAKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcwotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBTY29DYXJraXQKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMQotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFNjb0hlYWRzZXQKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBTY28KLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMQotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHBob25lCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMQotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IExpbmUKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIyBidXQgTGluZSBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIFdpcmVkSGVhZHNldCBpbiB0aGlzIGNhc2UuCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHNldAotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAxCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0Ci0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkJIwotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogVXNiRGV2aWNlCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkJIwotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAxCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogVXNiQWNjZXNzb3J5Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBVU0IgQWNjZXNzb3J5IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IERndGxEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBBbmxnRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBFYXJwaWVjZQotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDEKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IE5vbmUKLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY3M2M0Zi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdworKysgL2Rldi9udWxsCkBAIC0xLDU1MyArMCwwIEBACi1kb21haW5Hcm91cDogRGV2aWNlRm9yU3RyYXRlZ3kKLQotCWRvbWFpbkdyb3VwOiBTb25pZmljYXRpb25SZXNwZWN0ZnVsCi0JCSMKLQkJIyBTb25pZmljaWF0aW9uIFJlc3BlY3RmdWwgZm9sbG93czoKLQkJIwktIElmIGluIGNhbGw6IFN0cmF0ZWd5IHNvbmlmaWNhdGlvbiAodGhhdCBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGluIGNhbGwgYWxzby4uLikKLQkJIwktIElmIG5vdCBpbiBjYWxsIEFORCBhIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUgcmVtb3RlbHk6IFN0cmF0ZWd5IHNvbmlmaWNhdGlvbiAodGhhdAotCQkjICAgICBmb2xsb3dzIGVuZm9yY2VkIGF1ZGlibGUsIHdoaWNoIGZvbGxvd3MgbWVkaWEpCi0JCSMJLSBpZiBub3QgaW4gY2FsbCBhbmQgbm8gbXVzaWMgc3RyZWFtIGFjdGl2ZSByZW1vdGVseSBhbmQgbXVzaWMgc3RyZWFtIGFjdGl2ZSk6IHN0cmF0ZWd5Ci0JCSMgICAgIG1lZGlhCi0JCSMgICAtIE90aGVyd2lzZSBmb2xsb3dzIHNvbmlmaWNhdGlvbiBieSByZXBsYWNpbmcgc3BlYWtlciB3aXRoIHNwZWFrZXIgc2FmZSBpZiBzcGVha2VyIGlzCi0JCSMJICBzZWxlY3RlZC4KLQkJIwotCQkjIENhc2Ugb2Ygc3RyZWFtIGFjdGl2ZSBoYW5kbGVkIHByb2dyYW1tYXRpY2FsbHkKLQotCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcwotCQkJY29uZjogQ2FsaWJyYXRpb24KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQloZG1pX2FyYyA9IDAKLQkJCQkJYXV4X2xpbmUgPSAwCi0JCQkJCXNwZGlmID0gMAotCQkJCQlmbSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlpcCA9IDAKLQkJCQkJYnVzID0gMAotCQkJCQlzdHViID0gMAotCi0JCWRvbWFpbjogU3BlYWtlcnMKLQotCQkJY29uZjogU3BlYWtlclNhZmUKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXJTYWZlCi0JCQkJIwotCQkJCSMgRm9sbG93cyBzb25pZmljYXRpb24gc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgYW5kIHJlcGxhY2Ugc3BlYWtlciBieSBzcGVha2VyIHNhZmUKLQkJCQkjIGlmIGFuZCBvbmx5IGlmIHNwZWFrZXIgb25seSBzZWxlY3RlZAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyX3NhZmUgPSAxCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIEZvbGxvd3Mgc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJQUxMCi0JCQkJCQkjCi0JCQkJCQkjIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgY2FsbAotCQkJCQkJIwotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBMaW5lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyX3NhZmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAxCi0KLQkJCWNvbmY6IE5vbmUKLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyX3NhZmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJZG9tYWluOiBEZXZpY2UyCi0JCQljb25mOiBCbHVldG9vdGhBMmRwCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvQ2Fya2l0Ci0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0NhcmtpdAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvSGVhZHNldAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY28KLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRwaG9uZQotCQkJCUFOWQotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJCSMKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJQUxMCi0JCQkJCQkjCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJCQkjCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIyBidXQgTGluZSBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIFdpcmVkSGVhZHNldCBpbiB0aGlzIGNhc2UuCi0JCQkJCSMKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkc2V0Ci0JCQkJCSMKLQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRzZXQKLQkJCQlBTlkKLQkJCQkJQUxMCi0JCQkJCQkjCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJCQkjCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCUFMTAotCQkJCQkJIwotCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQotCQkJCQkJIwotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBVc2JEZXZpY2UKLQkJCQlBTlkKLQkJCQkJQUxMCi0JCQkJCQkjCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJCQkjCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCUFMTAotCQkJCQkJIwotCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQotCQkJCQkJIwotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDEKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogVXNiQWNjZXNzb3J5Ci0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBVc2JBY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRGd0bERvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBEZ3RsRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQXV4RGlnaXRhbAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgSERNSSBub3QgcmVhY2hhYmxlIGluIGNhbGwuCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDEKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBBbmxnRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEVhcnBpZWNlCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMQotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IE5vbmUKLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjljMjExLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyLnBmdworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLXN1cERvbWFpbjogRGV2aWNlRm9yU3RyYXRlZ3kKLQotCXN1cERvbWFpbjogVHJhbnNtaXR0ZWRUaHJvdWdoU3BlYWtlcgotCQlkb21haW46IFVucmVhY2hlYWJsZURldmljZXMKLQkJCWNvbmY6IENhbGlicmF0aW9uCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWhkbWlfYXJjID0gMAotCQkJCQlzcGRpZiA9IDAKLQkJCQkJYXV4X2xpbmUgPSAwCi0JCQkJCWZtID0gMAotCQkJCQlzcGVha2VyX3NhZmUgPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJaXAgPSAwCi0JCQkJCWJ1cyA9IDAKLQkJCQkJc3R1YiA9IDAKLQotCQlkb21haW46IFNwZWFrZXIKLQkJCWNvbmY6IFNlbGVjdGVkCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDEKLQotCQkJY29uZjogTm90U2VsZWN0ZWQKLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3N0cmVhbS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9zdHJhdGVneV9mb3Jfc3RyZWFtLnBmdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk0MGI5ZC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9zdHJhdGVneV9mb3Jfc3RyZWFtLnBmdworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLWRvbWFpbjogU3RyYXRlZ3lGb3JTdHJlYW0KLQotCWNvbmY6IENhbGlicmF0aW9uCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gcGhvbmUKLQkJIwotCQkjIE5PVEU6IFNZU1RFTSBzdHJlYW0gdXNlcyBNRURJQSBzdHJhdGVneSBiZWNhdXNlIG11dGluZyBtdXNpYyBhbmQgc3dpdGNoaW5nIG91dHB1dHMKLQkJIyB3aGlsZSBrZXkgY2xpY2tzIGFyZSBwbGF5ZWQgcHJvZHVjZXMgYSBwb29yIHJlc3VsdAotCQkjCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBtZWRpYQotCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL3JpbmcvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHNvbmlmaWNhdGlvbgotCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBtZWRpYQotCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBzb25pZmljYXRpb24KLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHNvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gcGhvbmUKLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBlbmZvcmNlZF9hdWRpYmxlCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gZHRtZgotCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gYWNjZXNzaWJpbGl0eQotCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gcmVyb3V0aW5nCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl91c2FnZS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9zdHJhdGVneV9mb3JfdXNhZ2UucGZ3CmluZGV4IGIzMTE1ZTcuLmZiZWE5ZTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl91c2FnZS5wZncKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdwpAQCAtMjQsNyArMjQsNyBAQAogCQkJIyBJbiBjYXNlIG9mIFJpbmcgb3IgQWxhcm0gc3RyZWFtIHR5cGUgYWN0aXZlLCBzd2l0Y2hpbmcgdG8gc29uaWZpY2F0aW9uCiAJCQkjIEB0b2RvOiBoYW5kbGUgdGhpcyBkeW5hbWljIGNhc2UuIEFzIGEgV0EsIHVzaW5nIFJpbmd0b25lIG1vZGUuLi4KIAkJCSMKLQkJCVRlbGVwaG9ueU1vZGUgSXMgUmluZ1RvbmUKKwkJCVRlbGVwaG9ueU1vZGUgSXMgUmluZ3RvbmUKIAogCQkJL1BvbGljeS9wb2xpY3kvdXNhZ2VzL2Fzc2lzdGFuY2VfYWNjZXNzaWJpbGl0eS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gc29uaWZpY2F0aW9uCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzTm9PdXRwdXQvZGV2aWNlX2Zvcl9zdHJhdGVnaWVzLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzTm9PdXRwdXQvZGV2aWNlX2Zvcl9zdHJhdGVnaWVzLnBmdwppbmRleCA5MTdkNGE3Li5mOTIzNjEwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5nc05vT3V0cHV0L2RldmljZV9mb3Jfc3RyYXRlZ2llcy5wZncKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3NOb091dHB1dC9kZXZpY2VfZm9yX3N0cmF0ZWdpZXMucGZ3CkBAIC05LDcgKzksNyBAQAogCQkJCWJsdWV0b290aF9zY28gPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCWJsdWV0b290aF9hMmRwID0gMD4KKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAogCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCiAJCQkJaGRtaSA9IDAKQEAgLTM3LDcgKzM3LDcgQEAKIAkJCQlibHVldG9vdGhfc2NvID0gMAogCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQlibHVldG9vdGhfYTJkcCA9IDA+CisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAogCQkJCWhkbWkgPSAwCkBAIC02NSw3ICs2NSw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApAQCAtOTMsNyArOTMsNyBAQAogCQkJCWJsdWV0b290aF9zY28gPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCWJsdWV0b290aF9hMmRwID0gMD4KKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAogCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCiAJCQkJaGRtaSA9IDAKQEAgLTEyMSw3ICsxMjEsNyBAQAogCQkJCWJsdWV0b290aF9zY28gPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCWJsdWV0b290aF9hMmRwID0gMD4KKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAogCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCiAJCQkJaGRtaSA9IDAKQEAgLTE0OSw3ICsxNDksNyBAQAogCQkJCWJsdWV0b290aF9zY28gPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCWJsdWV0b290aF9hMmRwID0gMD4KKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAogCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCiAJCQkJaGRtaSA9IDAKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCQkJCWJsdWV0b290aF9zY28gPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCWJsdWV0b290aF9hMmRwID0gMD4KKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAogCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCiAJCQkJaGRtaSA9IDAKQEAgLTIwNSw3ICsyMDUsNyBAQAogCQkJCWJsdWV0b290aF9zY28gPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCWJsdWV0b290aF9hMmRwID0gMD4KKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAogCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCiAJCQkJaGRtaSA9IDAKQEAgLTIzMyw3ICsyMzMsNyBAQAogCQkJCWJsdWV0b290aF9zY28gPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCWJsdWV0b290aF9hMmRwID0gMD4KKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAogCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCiAJCQkJaGRtaSA9IDAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MWU0NGEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxDb21wb25lbnRUeXBlU2V0IHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgotICAgICAgICAgICAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iU2NoZW1hcy9Db21wb25lbnRUeXBlU2V0LnhzZCI+Ci0gICAgPCEtLSBPdXRwdXQgZGV2aWNlcyBkZWZpbml0aW9uIGFzIGEgYml0ZmllbGQgZm9yIHRoZSBzdXBwb3J0ZWQgZGV2aWNlcyBwZXIgb3V0cHV0Ci0gICAgcHJvZmlsZS4gSXQgbXVzdCBtYXRjaCB3aXRoIHRoZSBvdXRwdXQgZGV2aWNlIGVudW0gcGFyYW1ldGVyLgotICAgIC0tPgotICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0xPQkFMIENPTVBPTkVOVFMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0xPQkFMIENPTVBPTkVOVFMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJPdXRwdXREZXZpY2VzTWFzayIgRGVzY3JpcHRpb249IjMydGggYml0IGlzIG5vdCBhbGxvd2VkIGFzIGRlZGljYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaW5wdXQgZGV2aWNlcyBkZXRlY3Rpb24iPgotICAgICAgICA8Qml0UGFyYW1ldGVyQmxvY2sgTmFtZT0ibWFzayIgU2l6ZT0iMzIiPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSIgU2l6ZT0iMSIgUG9zPSIwIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiIFNpemU9IjEiIFBvcz0iMSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjIiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIiBTaXplPSIxIiBQb3M9IjMiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyIgU2l6ZT0iMSIgUG9zPSI0Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCIgU2l6ZT0iMSIgUG9zPSI1Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0IiBTaXplPSIxIiBQb3M9IjYiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiIFNpemU9IjEiIFBvcz0iNyIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIiBTaXplPSIxIiBQb3M9IjgiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciIgU2l6ZT0iMSIgUG9zPSI5Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiIFNpemU9IjEiIFBvcz0iMTAiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iMTEiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iMTIiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSIgU2l6ZT0iMSIgUG9zPSIxMyIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIiBTaXplPSIxIiBQb3M9IjE0Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiIFNpemU9IjEiIFBvcz0iMTUiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4IiBTaXplPSIxIiBQb3M9IjE2Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiIFNpemU9IjEiIFBvcz0iMTciLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaV9hcmMiIFNpemU9IjEiIFBvcz0iMTgiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiIFNpemU9IjEiIFBvcz0iMTkiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iIFNpemU9IjEiIFBvcz0iMjAiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYXV4X2xpbmUiIFNpemU9IjEiIFBvcz0iMjEiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIiBTaXplPSIxIiBQb3M9IjIyIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImlwIiBTaXplPSIxIiBQb3M9IjIzIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1cyIgU2l6ZT0iMSIgUG9zPSIyNCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzdHViIiBTaXplPSIxIiBQb3M9IjMwIi8+Ci0gICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+Ci0gICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgPCEtLSBJbnB1dCBkZXZpY2VzIGRlZmluaXRpb24gYXMgYSBiaXRmaWVsZCBmb3IgdGhlIHN1cHBvcnRlZCBkZXZpY2VzIHBlciBJbnB1dAotICAgIHByb2ZpbGUuIEl0IG11c3QgbWF0Y2ggd2l0aCB0aGUgSW5wdXQgZGV2aWNlIGVudW0gcGFyYW1ldGVyLgotICAgIC0tPgotICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0RGV2aWNlc01hc2siPgotICAgICAgICA8Qml0UGFyYW1ldGVyQmxvY2sgTmFtZT0ibWFzayIgU2l6ZT0iMzIiPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjb21tdW5pY2F0aW9uIiBTaXplPSIxIiBQb3M9IjAiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW1iaWVudCIgU2l6ZT0iMSIgUG9zPSIxIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIiBTaXplPSIxIiBQb3M9IjIiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjMiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSI0Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiIFNpemU9IjEiIFBvcz0iNSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfcngiIFNpemU9IjEiIFBvcz0iNiIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJiYWNrX21pYyIgU2l6ZT0iMSIgUG9zPSI3Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiIFNpemU9IjEiIFBvcz0iOCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSI5Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjEwIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiIFNpemU9IjEiIFBvcz0iMTEiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSIgU2l6ZT0iMSIgUG9zPSIxMiIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbV90dW5lciIgU2l6ZT0iMSIgUG9zPSIxMyIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0dl90dW5lciIgU2l6ZT0iMSIgUG9zPSIxNCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIiBTaXplPSIxIiBQb3M9IjE1Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIiBTaXplPSIxIiBQb3M9IjE2Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIiBTaXplPSIxIiBQb3M9IjE3Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imxvb3BiYWNrIiBTaXplPSIxIiBQb3M9IjE4Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImlwIiBTaXplPSIxIiBQb3M9IjE5Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1cyIgU2l6ZT0iMSIgUG9zPSIyMCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzdHViIiBTaXplPSIxIiBQb3M9IjMwIi8+Ci0gICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+Ci0gICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iT3V0cHV0RmxhZ3MiCi0gICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249InRoZSBhdWRpbyBvdXRwdXQgZmxhZ3Mgc2VydmUgdHdvIHB1cnBvc2VzOgotICAgICAgICAgICAgICAgICAgICAtIHdoZW4gYW4gQXVkaW9UcmFjayBpcyBjcmVhdGVkIHRoZXkgaW5kaWNhdGUgYSB3aXNoIHRvIGJlIGNvbm5lY3RlZCB0byBhbgotICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBzdHJlYW0gd2l0aCBhdHRyaWJ1dGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmbGFncy4KLSAgICAgICAgICAgICAgICAgICAgLSB3aGVuIHByZXNlbnQgaW4gYW4gb3V0cHV0IHByb2ZpbGUgZGVzY3JpcHRvciBsaXN0ZWQgZm9yIGEgcGFydGljdWxhciBhdWRpbwotICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlIG1vZHVsZSwgdGhleSBpbmRpY2F0ZSB0aGF0IGFuIG91dHB1dCBzdHJlYW0gY2FuIGJlIG9wZW5lZCB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgdGhlIGF0dHJpYnV0ZXMgaW5kaWNhdGVkIGJ5IHRoZSBmbGFncy4KLSAgICAgICAgICAgICAgICAgICAgVGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHdpbGwgdHJ5IHRvIG1hdGNoIHRoZSBmbGFncyBpbiB0aGUgcmVxdWVzdAotICAgICAgICAgICAgICAgICAgICAod2hlbiBnZXRPdXB1dCgpIGlzIGNhbGxlZCkgdG8gYW4gYXZhaWxhYmxlIG91dHB1dCBzdHJlYW0uIj4KLSAgICAgICAgPEJpdFBhcmFtZXRlckJsb2NrIE5hbWU9Im1hc2siIFNpemU9IjMyIj4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGlyZWN0IiBTaXplPSIxIiBQb3M9IjAiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icHJpbWFyeSIgU2l6ZT0iMSIgUG9zPSIxIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZhc3QiIFNpemU9IjEiIFBvcz0iMiIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZWVwX2J1ZmZlciIgU2l6ZT0iMSIgUG9zPSIzIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImNvbXByZXNzX29mZmxvYWQiIFNpemU9IjEiIFBvcz0iNCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJub25fYmxvY2tpbmciIFNpemU9IjEiIFBvcz0iNSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJod19hdl9zeW5jIiBTaXplPSIxIiBQb3M9IjYiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idHRzIiBTaXplPSIxIiBQb3M9IjciLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmF3IiBTaXplPSIxIiBQb3M9IjgiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3luYyIgU2l6ZT0iMSIgUG9zPSI5Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImllYzk1OF9ub25hdWRpbyIgU2l6ZT0iMSIgUG9zPSIxMCIvPgotICAgICAgICA8L0JpdFBhcmFtZXRlckJsb2NrPgotICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0RmxhZ3MiCi0gICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IlRoZSBhdWRpbyBpbnB1dCBmbGFncyBhcmUgYW5hbG9nb3VzIHRvIGF1ZGlvIG91dHB1dCBmbGFncy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudGx5IHRoZXkgYXJlIHVzZWQgb25seSB3aGVuIGFuIEF1ZGlvUmVjb3JkIGlzIGNyZWF0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGluZGljYXRlIGEgcHJlZmVyZW5jZSB0byBiZSBjb25uZWN0ZWQgdG8gYW4gaW5wdXQgc3RyZWFtIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgZmxhZ3MuIj4KLSAgICAgICAgPEJpdFBhcmFtZXRlckJsb2NrIE5hbWU9Im1hc2siIFNpemU9IjMyIj4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZmFzdCIgU2l6ZT0iMSIgUG9zPSIwIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imh3X2hvdHdvcmQiIFNpemU9IjEiIFBvcz0iMiIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyYXciIFNpemU9IjEiIFBvcz0iMyIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzeW5jIiBTaXplPSIxIiBQb3M9IjQiLz4KLSAgICAgICAgPC9CaXRQYXJhbWV0ZXJCbG9jaz4KLSAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dFNvdXJjZXNNYXNrIiBEZXNjcmlwdGlvbj0iVGhlIGF1ZGlvIGlucHV0IHNvdXJjZSBpcyBhbHNvIGtub3duCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIHRoZSB1c2UgY2FzZS4iPgotICAgICAgICA8Qml0UGFyYW1ldGVyQmxvY2sgTmFtZT0ibWFzayIgU2l6ZT0iMzIiPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZWZhdWx0IiBTaXplPSIxIiBQb3M9IjAiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibWljIiBTaXplPSIxIiBQb3M9IjEiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idm9pY2VfdXBsaW5rIiBTaXplPSIxIiBQb3M9IjIiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idm9pY2VfZG93bmxpbmsiIFNpemU9IjEiIFBvcz0iMyIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ2b2ljZV9jYWxsIiBTaXplPSIxIiBQb3M9IjQiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY2FtY29yZGVyIiBTaXplPSIxIiBQb3M9IjUiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idm9pY2VfcmVjb2duaXRpb24iIFNpemU9IjEiIFBvcz0iNiIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ2b2ljZV9jb21tdW5pY2F0aW9uIiBTaXplPSIxIiBQb3M9IjciLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCIgU2l6ZT0iMSIgUG9zPSI4Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVucHJvY2Vzc2VkIiBTaXplPSIxIiBQb3M9IjkiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm1fdHVuZXIiIFNpemU9IjEiIFBvcz0iMTAiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaG90d29yZCIgU2l6ZT0iMSIgUG9zPSIxMSIvPgotICAgICAgICA8L0JpdFBhcmFtZXRlckJsb2NrPgotICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgIDwhLS0gUm91dGluZyBTdHJhdGVneSBkZWZpbml0aW9uIGFzIGFuIGVudW1lcmF0aW9uLiBOdW1lcmljYWwgdmFsdWUgbXVzdCBtYXRjaCB0aGUgdmFsdWUKLSAgICAgICAgIG9mIHRoZSByb3V0aW5nIHN0cmF0ZWd5IGluIHBvbGljeSBoZWFkZXIgZmlsZS4gLS0+Ci0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyYXRlZ3kiPgotICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSIgU2l6ZT0iMzIiPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJtZWRpYSIgTnVtZXJpY2FsPSIwIi8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InBob25lIiBOdW1lcmljYWw9IjEiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0ic29uaWZpY2F0aW9uIiBOdW1lcmljYWw9IjIiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0ic29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwiIE51bWVyaWNhbD0iMyIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJkdG1mIiBOdW1lcmljYWw9IjQiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0iZW5mb3JjZWRfYXVkaWJsZSIgTnVtZXJpY2FsPSI1Ii8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InRyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlciIgTnVtZXJpY2FsPSI2Ii8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9ImFjY2Vzc2liaWxpdHkiIE51bWVyaWNhbD0iNyIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJyZXJvdXRpbmciIE51bWVyaWNhbD0iOCIvPgotICAgICAgICA8L0VudW1QYXJhbWV0ZXI+Ci0gICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkFURUdZIENPTU1PTiBUWVBFUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyYXRlZ3lDb25maWciIE1hcHBpbmc9IlN0cmF0ZWd5OiclMSciPgotICAgICAgICA8Q29tcG9uZW50IE5hbWU9InNlbGVjdGVkX291dHB1dF9kZXZpY2VzIiBUeXBlPSJPdXRwdXREZXZpY2VzTWFzayIvPgotICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJBVEVHWSBDT01NT04gVFlQRVMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIENPTU1PTiBUWVBFUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iVm9sdW1lUHJvZmlsZVR5cGUiPgotICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJ2b2x1bWVfcHJvZmlsZSIgU2l6ZT0iMzIiPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJ2b2ljZV9jYWxsIiBOdW1lcmljYWw9IjAiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0ic3lzdGVtIiBOdW1lcmljYWw9IjEiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0icmluZyIgTnVtZXJpY2FsPSIyIi8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9Im11c2ljIiBOdW1lcmljYWw9IjMiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0iYWxhcm0iIE51bWVyaWNhbD0iNCIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJub3RpZmljYXRpb24iIE51bWVyaWNhbD0iNSIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJibHVldG9vdGhfc2NvIiBOdW1lcmljYWw9IjYiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0iZW5mb3JjZWRfYXVkaWJsZSIgTnVtZXJpY2FsPSI3Ii8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9ImR0bWYiIE51bWVyaWNhbD0iOCIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJ0dHMiIE51bWVyaWNhbD0iOSIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJhY2Nlc3NpYmlsaXR5IiBOdW1lcmljYWw9IjEwIi8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InJlcm91dGluZyIgTnVtZXJpY2FsPSIxMSIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJwYXRjaCIgTnVtZXJpY2FsPSIxMiIvPgotICAgICAgICA8L0VudW1QYXJhbWV0ZXI+Ci0gICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyZWFtIj4KLSAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhcHBsaWNhYmxlX3N0cmF0ZWd5IiBUeXBlPSJTdHJhdGVneSIvPgotICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFwcGxpY2FibGVfdm9sdW1lX3Byb2ZpbGUiIFR5cGU9IlZvbHVtZVByb2ZpbGVUeXBlIgotICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJWb2x1bWUgcHJvZmlsZSBmb2xsb3dlZCBieSBhIGdpdmVuIHN0cmVhbSB0eXBlLiIvPgotICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gQ09NTU9OIFRZUEVTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFVTQUdFIENPTU1PTiBUWVBFUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iVXNhZ2UiPgotICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFwcGxpY2FibGVfc3RyYXRlZ3kiIFR5cGU9IlN0cmF0ZWd5IiBNYXBwaW5nPSJVc2FnZTonJTEnIi8+Ci0gICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFVTQUdFIENPTU1PTiBUWVBFUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlBVVCBTT1VSQ0UgQ09NTU9OIFRZUEVTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dFNvdXJjZSI+Ci0gICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UiIFR5cGU9IklucHV0RGV2aWNlc01hc2siCi0gICAgICAgICAgICAgICAgICAgTWFwcGluZz0iSW5wdXRTb3VyY2U6JyUxJyIgRGVzY3JpcHRpb249IlNlbGVjdGVkIElucHV0IGRldmljZSIvPgotICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlBVVCBTT1VSQ0UgQ09NTU9OIFRZUEVTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi08L0NvbXBvbmVudFR5cGVTZXQ+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDljMzU2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08U3Vic3lzdGVtIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgotICAgICAgICAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iU2NoZW1hcy9TdWJzeXN0ZW0ueHNkIgotICAgICAgICAgICBOYW1lPSJwb2xpY3kiIFR5cGU9IlBvbGljeSI+Ci0KLSAgICA8Q29tcG9uZW50TGlicmFyeT4KLSAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0gICAgICAgIDwhLS0gQ29tbW9uIFR5cGVzIGRlZmludGlvbiAtLT4KLSAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0iUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbCIvPgotCi0gICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBHTE9CQUwgQ09NUE9ORU5UUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSQVRFR1kgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJhdGVnaWVzIiBEZXNjcmlwdGlvbj0iSWRlbnRpZmllciBtdXN0IG1hdGNoIHRoZSBlbnVtIHZhbHVlIHRvIG1ha2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpbmsgYmV0d2VlbiB0aGUgUG9saWN5TWFuYWdlciBhbmQgUEZXIj4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibWVkaWEiIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIiBNYXBwaW5nPSJBbWVuZDE6TWVkaWEsSWRlbnRpZmllcjowIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InBob25lIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIgTWFwcGluZz0iQW1lbmQxOlBob25lLElkZW50aWZpZXI6MSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzb25pZmljYXRpb24iIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpTb25pZmljYXRpb24sSWRlbnRpZmllcjoyIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InNvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlNvbmlmaWNhdGlvblJlc3BlY3RmdWwsSWRlbnRpZmllcjozIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImR0bWYiIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIiBNYXBwaW5nPSJBbWVuZDE6RHRtZixJZGVudGlmaWVyOjQiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZW5mb3JjZWRfYXVkaWJsZSIgVHlwZT0iU3RyYXRlZ3lDb25maWciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpFbmZvcmNlZEF1ZGlibGUsSWRlbnRpZmllcjo1Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InRyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlciIgVHlwZT0iU3RyYXRlZ3lDb25maWciCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpUcmFuc21pdHRlZFRocm91Z2hTcGVha2VyLElkZW50aWZpZXI6NiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhY2Nlc3NpYmlsaXR5IiBUeXBlPSJTdHJhdGVneUNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkFjY2Vzc2liaWxpdHksSWRlbnRpZmllcjo3Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJlcm91dGluZyIgVHlwZT0iU3RyYXRlZ3lDb25maWciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlJlcm91dGluZyxJZGVudGlmaWVyOjgiLz4KLSAgICAgICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJBVEVHWSBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyZWFtcyIgRGVzY3JpcHRpb249ImFzc29jaWF0ZWQgdG8gYXVkaW9fc3RyZWFtX3R5cGVfdCBkZWZpbml0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIG1hcHBpbmcgbXVzdCBtYXRjaCB0aGUgdmFsdWUgb2YgdGhlIGVudW0iPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jYWxsIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IlN0cmVhbTpWb2ljZUNhbGwsSWRlbnRpZmllcjowIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InN5c3RlbSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJTdHJlYW06U3lzdGVtLElkZW50aWZpZXI6MSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyaW5nIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IlN0cmVhbTpSaW5nLElkZW50aWZpZXI6MiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJtdXNpYyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJTdHJlYW06TXVzaWMsSWRlbnRpZmllcjozIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFsYXJtIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IlN0cmVhbTpBbGFybSxJZGVudGlmaWVyOjQiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uIiBUeXBlPSJTdHJlYW0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iU3RyZWFtOk5vdGlmaWNhdGlvbixJZGVudGlmaWVyOjUiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYmx1ZXRvb3RoX3NjbyIgVHlwZT0iU3RyZWFtIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJTdHJlYW06Qmx1ZXRvb3RoU2NvLElkZW50aWZpZXI6NiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJlbmZvcmNlZF9hdWRpYmxlIiBUeXBlPSJTdHJlYW0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IlN0cmVhbTpFbmZvcmNlQXVkaWJsZSxJZGVudGlmaWVyOjciCi0gICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJTb3VuZHMgdGhhdCBjYW5ub3QgYmUgbXV0ZWQgYnkgdXNlciBhbmQgbXVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgcm91dGVkIHRvIHNwZWFrZXIiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZHRtZiIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJTdHJlYW06RHRtZixJZGVudGlmaWVyOjgiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idHRzIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IlN0cmVhbTpUdHMsSWRlbnRpZmllcjo5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxheXMgb3ZlciBzcGVha2VyIG9ubHksIHNpbGVudCBvbiBvdGhlciBkZXZpY2VzIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFjY2Vzc2liaWxpdHkiIFR5cGU9IlN0cmVhbSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iU3RyZWFtOkFjY2Vzc2liaWxpdHksSWRlbnRpZmllcjoxMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkZvciBhY2Nlc3NpYmlsaXR5IHRhbGsgYmFjayBwcm9tcHRzIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJlcm91dGluZyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJTdHJlYW06UmVyb3V0aW5nLElkZW50aWZpZXI6MTEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJGb3IgZHluYW1pYyBwb2xpY3kgb3V0cHV0IG1peGVzIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InBhdGNoIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IlN0cmVhbTpQYXRjaCxJZGVudGlmaWVyOjEyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGludGVybmFsIGF1ZGlvIGZsaW5nZXIgdHJhY2tzLiBGaXhlZCB2b2x1bWUiLz4KLSAgICAgICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFVTQUdFIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iVXNhZ2VzIiBEZXNjcmlwdGlvbj0iYXNzb2NpYXRlZCB0byBhdWRpb191c2FnZV90IGRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgbWFwcGluZyBtdXN0IG1hdGNoIHRoZSB2YWx1ZSBvZiB0aGUgZW51bSI+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InVua25vd24iIFR5cGU9IlVzYWdlIiBNYXBwaW5nPSJBbWVuZDE6VW5rbm93bixJZGVudGlmaWVyOjAiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibWVkaWEiIFR5cGU9IlVzYWdlIiBNYXBwaW5nPSJBbWVuZDE6TWVkaWEsSWRlbnRpZmllcjoxIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NvbW11bmljYXRpb24iIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VDb21tdW5pY2F0aW9uLElkZW50aWZpZXI6MiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jb21tdW5pY2F0aW9uX3NpZ25hbGxpbmciIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VDb21tdW5pY2F0aW9uU2lnbmFsbGluZyxJZGVudGlmaWVyOjMiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWxhcm0iIFR5cGU9IlVzYWdlIiBNYXBwaW5nPSJBbWVuZDE6QWxhcm0sSWRlbnRpZmllcjo0Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbiIgVHlwZT0iVXNhZ2UiIE1hcHBpbmc9IkFtZW5kMTpOb3RpZmljYXRpb24sSWRlbnRpZmllcjo1Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl90ZWxlcGhvbnlfcmluZ3RvbmUiIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uVGVsZXBob255UmluZ3RvbmUsSWRlbnRpZmllcjo2Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX3JlcXVlc3QiIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uQ29tbXVuaWNhdGlvblJlcXVlc3QsSWRlbnRpZmllcjo3Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX2luc3RhbnQiIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uQ29tbXVuaWNhdGlvbkluc3RhbnQsSWRlbnRpZmllcjo4Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX2RlbGF5ZWQiIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uQ29tbXVuaWNhdGlvbkRlbGF0ZWQsSWRlbnRpZmllcjo5Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbl9ldmVudCIgVHlwZT0iVXNhZ2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOk5vdGlmaWNhdGlvbkV2ZW50LElkZW50aWZpZXI6MTAiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXNzaXN0YW5jZV9hY2Nlc3NpYmlsaXR5IiBUeXBlPSJVc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkFzc2lzdGFuY2VBY2Nlc3NpYmlsaXR5LElkZW50aWZpZXI6MTEiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXNzaXN0YW5jZV9uYXZpZ2F0aW9uX2d1aWRhbmNlIiBUeXBlPSJVc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkFzc2lzdGFuY2VOYXZpZ2F0aW9uR3VpZGFuY2UsSWRlbnRpZmllcjoxMiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhc3Npc3RhbmNlX3NvbmlmaWNhdGlvbiIgVHlwZT0iVXNhZ2UiCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpBc3Npc3RhbmNlU29uaWZpY2F0aW9uLElkZW50aWZpZXI6MTMiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZ2FtZSIgVHlwZT0iVXNhZ2UiIE1hcHBpbmc9IkFtZW5kMTpCbHVldG9vdGhTY28sSWRlbnRpZmllcjoxNCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2aXJ0dWFsX3NvdXJjZSIgVHlwZT0iVXNhZ2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6VmlydHVhbFNvdXJjZSxJZGVudGlmaWVyOjE1Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFzc2lzdGFudCIgVHlwZT0iVXNhZ2UiIE1hcHBpbmc9IkFtZW5kMTpBc3Npc3RhbnQsSWRlbnRpZmllcjoxNiIvPgotICAgICAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFVTQUdFIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlBVVCBTT1VSQ0UgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dFNvdXJjZXMiIERlc2NyaXB0aW9uPSJhc3NvY2lhdGVkIHRvIGF1ZGlvX3NvdXJjZV90IGRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgbWFwcGluZyBtdXN0IG1hdGNoIHRoZSB2YWx1ZSBvZiB0aGUgZW51bSI+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImRlZmF1bHQiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJBbWVuZDE6RGVmYXVsdCxJZGVudGlmaWVyOjAiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibWljIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iQW1lbmQxOk1pYyxJZGVudGlmaWVyOjEiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfdXBsaW5rIiBUeXBlPSJJbnB1dFNvdXJjZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VVcGxpbmssSWRlbnRpZmllcjoyIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2Rvd25saW5rIiBUeXBlPSJJbnB1dFNvdXJjZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpWb2ljZURvd25saW5rLElkZW50aWZpZXI6MyIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jYWxsIiBUeXBlPSJJbnB1dFNvdXJjZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlZvaWNlQ2FsbCxJZGVudGlmaWVyOjQiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iY2FtY29yZGVyIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iQW1lbmQxOkNhbWNvcmRlcixJZGVudGlmaWVyOjUiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfcmVjb2duaXRpb24iIFR5cGU9IklucHV0U291cmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlZvaWNlUmVjb2duaXRpb24sSWRlbnRpZmllcjo2Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NvbW11bmljYXRpb24iIFR5cGU9IklucHV0U291cmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VDb21tdW5pY2F0aW9uLElkZW50aWZpZXI6NyIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyZW1vdGVfc3VibWl4IiBUeXBlPSJJbnB1dFNvdXJjZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlJlbW90ZVN1Ym1peCxJZGVudGlmaWVyOjgiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idW5wcm9jZXNzZWQiIFR5cGU9IklucHV0U291cmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6VW5wcm9jZXNzZWQsSWRlbnRpZmllcjo5Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImZtX3R1bmVyIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iQW1lbmQxOkZtVHVuZXIsSWRlbnRpZmllcjoxOTk4Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImhvdHdvcmQiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJBbWVuZDE6SG90d29yZCxJZGVudGlmaWVyOjE5OTkiLz4KLSAgICAgICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlBVVCBTT1VSQ0UgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICA8L0NvbXBvbmVudExpYnJhcnk+Ci0KLSAgICA8SW5zdGFuY2VEZWZpbml0aW9uPgotICAgICAgICA8Q29tcG9uZW50IE5hbWU9InN0cmVhbXMiIFR5cGU9IlN0cmVhbXMiLz4KLSAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzdHJhdGVnaWVzIiBUeXBlPSJTdHJhdGVnaWVzIi8+Ci0gICAgICAgIDxDb21wb25lbnQgTmFtZT0iaW5wdXRfc291cmNlcyIgVHlwZT0iSW5wdXRTb3VyY2VzIi8+Ci0gICAgICAgIDxDb21wb25lbnQgTmFtZT0idXNhZ2VzIiBUeXBlPSJVc2FnZXMiLz4KLSAgICA8L0luc3RhbmNlRGVmaW5pdGlvbj4KLTwvU3Vic3lzdGVtPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU3RydWN0dXJlL1BvbGljeUNsYXNzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUG9saWN5Q2xhc3MueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5Q2xhc3MueG1sCnJlbmFtZSB0byBzZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9jb21tb24vU3RydWN0dXJlL1BvbGljeUNsYXNzLnhtbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YzVlZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9jb21tb24vU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwKQEAgLTAsMCArMSwxODIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Q29tcG9uZW50VHlwZVNldCB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgICAgICAgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IlNjaGVtYXMvQ29tcG9uZW50VHlwZVNldC54c2QiPgorICAgIDwhLS0gT3V0cHV0IGRldmljZXMgZGVmaW5pdGlvbiBhcyBhIGJpdGZpZWxkIGZvciB0aGUgc3VwcG9ydGVkIGRldmljZXMgcGVyIG91dHB1dAorICAgIHByb2ZpbGUuIEl0IG11c3QgbWF0Y2ggd2l0aCB0aGUgb3V0cHV0IGRldmljZSBlbnVtIHBhcmFtZXRlci4KKyAgICAtLT4KKyAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iT3V0cHV0RGV2aWNlc01hc2siIERlc2NyaXB0aW9uPSIzMnRoIGJpdCBpcyBub3QgYWxsb3dlZCBhcyBkZWRpY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGlucHV0IGRldmljZXMgZGV0ZWN0aW9uIj4KKyAgICAgICAgPEJpdFBhcmFtZXRlckJsb2NrIE5hbWU9Im1hc2siIFNpemU9IjMyIj4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiIFNpemU9IjEiIFBvcz0iMCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIiBTaXplPSIxIiBQb3M9IjEiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSIyIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSIgU2l6ZT0iMSIgUG9zPSIzIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iIFNpemU9IjEiIFBvcz0iNCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iNSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCIgU2l6ZT0iMSIgUG9zPSI2Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIiBTaXplPSIxIiBQb3M9IjciLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyIgU2l6ZT0iMSIgUG9zPSI4Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiIFNpemU9IjEiIFBvcz0iOSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIiBTaXplPSIxIiBQb3M9IjEwIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjExIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjEyIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiIFNpemU9IjEiIFBvcz0iMTMiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSIgU2l6ZT0iMSIgUG9zPSIxNCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4IiBTaXplPSIxIiBQb3M9IjE1Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCIgU2l6ZT0iMSIgUG9zPSIxNiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIiBTaXplPSIxIiBQb3M9IjE3Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWlfYXJjIiBTaXplPSIxIiBQb3M9IjE4Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIiBTaXplPSIxIiBQb3M9IjE5Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtIiBTaXplPSIxIiBQb3M9IjIwIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImF1eF9saW5lIiBTaXplPSIxIiBQb3M9IjIxIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSIgU2l6ZT0iMSIgUG9zPSIyMiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJpcCIgU2l6ZT0iMSIgUG9zPSIyMyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidXMiIFNpemU9IjEiIFBvcz0iMjQiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icHJveHkiIFNpemU9IjEiIFBvcz0iMjUiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iMjYiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGVhcmluZ19haWQiIFNpemU9IjEiIFBvcz0iMjciLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWNob19jYW5jZWxsZXIiIFNpemU9IjEiIFBvcz0iMjgiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3R1YiIgU2l6ZT0iMSIgUG9zPSIzMCIvPgorICAgICAgICA8L0JpdFBhcmFtZXRlckJsb2NrPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgIDwhLS0gSW5wdXQgZGV2aWNlcyBkZWZpbml0aW9uIGFzIGEgYml0ZmllbGQgZm9yIHRoZSBzdXBwb3J0ZWQgZGV2aWNlcyBwZXIgSW5wdXQKKyAgICBwcm9maWxlLiBJdCBtdXN0IG1hdGNoIHdpdGggdGhlIElucHV0IGRldmljZSBlbnVtIHBhcmFtZXRlci4KKyAgICAtLT4KKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dERldmljZXNNYXNrIj4KKyAgICAgICAgPEJpdFBhcmFtZXRlckJsb2NrIE5hbWU9Im1hc2siIFNpemU9IjMyIj4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tbXVuaWNhdGlvbiIgU2l6ZT0iMSIgUG9zPSIwIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFtYmllbnQiIFNpemU9IjEiIFBvcz0iMSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyIgU2l6ZT0iMSIgUG9zPSIyIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCIgU2l6ZT0iMSIgUG9zPSIzIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iNCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIiBTaXplPSIxIiBQb3M9IjUiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3J4IiBTaXplPSIxIiBQb3M9IjYiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiIFNpemU9IjEiIFBvcz0iNyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4IiBTaXplPSIxIiBQb3M9IjgiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iOSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSIxMCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5IiBTaXplPSIxIiBQb3M9IjExIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiIFNpemU9IjEiIFBvcz0iMTIiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm1fdHVuZXIiIFNpemU9IjEiIFBvcz0iMTMiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idHZfdHVuZXIiIFNpemU9IjEiIFBvcz0iMTQiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSIgU2l6ZT0iMSIgUG9zPSIxNSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiIgU2l6ZT0iMSIgUG9zPSIxNiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCIgU2l6ZT0iMSIgUG9zPSIxNyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsb29wYmFjayIgU2l6ZT0iMSIgUG9zPSIxOCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJpcCIgU2l6ZT0iMSIgUG9zPSIxOSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidXMiIFNpemU9IjEiIFBvcz0iMjAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icHJveHkiIFNpemU9IjEiIFBvcz0iMjEiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iMjIiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2JsZSIgU2l6ZT0iMSIgUG9zPSIyMyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzdHViIiBTaXplPSIxIiBQb3M9IjMwIi8+CisgICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iT3V0cHV0RmxhZ3MiCisgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249InRoZSBhdWRpbyBvdXRwdXQgZmxhZ3Mgc2VydmUgdHdvIHB1cnBvc2VzOgorICAgICAgICAgICAgICAgICAgICAtIHdoZW4gYW4gQXVkaW9UcmFjayBpcyBjcmVhdGVkIHRoZXkgaW5kaWNhdGUgYSB3aXNoIHRvIGJlIGNvbm5lY3RlZCB0byBhbgorICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBzdHJlYW0gd2l0aCBhdHRyaWJ1dGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmbGFncy4KKyAgICAgICAgICAgICAgICAgICAgLSB3aGVuIHByZXNlbnQgaW4gYW4gb3V0cHV0IHByb2ZpbGUgZGVzY3JpcHRvciBsaXN0ZWQgZm9yIGEgcGFydGljdWxhciBhdWRpbworICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlIG1vZHVsZSwgdGhleSBpbmRpY2F0ZSB0aGF0IGFuIG91dHB1dCBzdHJlYW0gY2FuIGJlIG9wZW5lZCB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgdGhlIGF0dHJpYnV0ZXMgaW5kaWNhdGVkIGJ5IHRoZSBmbGFncy4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHdpbGwgdHJ5IHRvIG1hdGNoIHRoZSBmbGFncyBpbiB0aGUgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAod2hlbiBnZXRPdXB1dCgpIGlzIGNhbGxlZCkgdG8gYW4gYXZhaWxhYmxlIG91dHB1dCBzdHJlYW0uIj4KKyAgICAgICAgPEJpdFBhcmFtZXRlckJsb2NrIE5hbWU9Im1hc2siIFNpemU9IjMyIj4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGlyZWN0IiBTaXplPSIxIiBQb3M9IjAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icHJpbWFyeSIgU2l6ZT0iMSIgUG9zPSIxIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZhc3QiIFNpemU9IjEiIFBvcz0iMiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZWVwX2J1ZmZlciIgU2l6ZT0iMSIgUG9zPSIzIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImNvbXByZXNzX29mZmxvYWQiIFNpemU9IjEiIFBvcz0iNCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJub25fYmxvY2tpbmciIFNpemU9IjEiIFBvcz0iNSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJod19hdl9zeW5jIiBTaXplPSIxIiBQb3M9IjYiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idHRzIiBTaXplPSIxIiBQb3M9IjciLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmF3IiBTaXplPSIxIiBQb3M9IjgiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3luYyIgU2l6ZT0iMSIgUG9zPSI5Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImllYzk1OF9ub25hdWRpbyIgU2l6ZT0iMSIgUG9zPSIxMCIvPgorICAgICAgICA8L0JpdFBhcmFtZXRlckJsb2NrPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0RmxhZ3MiCisgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IlRoZSBhdWRpbyBpbnB1dCBmbGFncyBhcmUgYW5hbG9nb3VzIHRvIGF1ZGlvIG91dHB1dCBmbGFncy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudGx5IHRoZXkgYXJlIHVzZWQgb25seSB3aGVuIGFuIEF1ZGlvUmVjb3JkIGlzIGNyZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGluZGljYXRlIGEgcHJlZmVyZW5jZSB0byBiZSBjb25uZWN0ZWQgdG8gYW4gaW5wdXQgc3RyZWFtIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgZmxhZ3MuIj4KKyAgICAgICAgPEJpdFBhcmFtZXRlckJsb2NrIE5hbWU9Im1hc2siIFNpemU9IjMyIj4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZmFzdCIgU2l6ZT0iMSIgUG9zPSIwIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imh3X2hvdHdvcmQiIFNpemU9IjEiIFBvcz0iMiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyYXciIFNpemU9IjEiIFBvcz0iMyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzeW5jIiBTaXplPSIxIiBQb3M9IjQiLz4KKyAgICAgICAgPC9CaXRQYXJhbWV0ZXJCbG9jaz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dFNvdXJjZXNNYXNrIiBEZXNjcmlwdGlvbj0iVGhlIGF1ZGlvIGlucHV0IHNvdXJjZSBpcyBhbHNvIGtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIHRoZSB1c2UgY2FzZS4iPgorICAgICAgICA8Qml0UGFyYW1ldGVyQmxvY2sgTmFtZT0ibWFzayIgU2l6ZT0iMzIiPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZWZhdWx0IiBTaXplPSIxIiBQb3M9IjAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibWljIiBTaXplPSIxIiBQb3M9IjEiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idm9pY2VfdXBsaW5rIiBTaXplPSIxIiBQb3M9IjIiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idm9pY2VfZG93bmxpbmsiIFNpemU9IjEiIFBvcz0iMyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ2b2ljZV9jYWxsIiBTaXplPSIxIiBQb3M9IjQiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY2FtY29yZGVyIiBTaXplPSIxIiBQb3M9IjUiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idm9pY2VfcmVjb2duaXRpb24iIFNpemU9IjEiIFBvcz0iNiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ2b2ljZV9jb21tdW5pY2F0aW9uIiBTaXplPSIxIiBQb3M9IjciLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCIgU2l6ZT0iMSIgUG9zPSI4Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVucHJvY2Vzc2VkIiBTaXplPSIxIiBQb3M9IjkiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm1fdHVuZXIiIFNpemU9IjEiIFBvcz0iMTAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaG90d29yZCIgU2l6ZT0iMSIgUG9zPSIxMSIvPgorICAgICAgICA8L0JpdFBhcmFtZXRlckJsb2NrPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gQ09NTU9OIFRZUEVTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJWb2x1bWVQcm9maWxlVHlwZSI+CisgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InZvbHVtZV9wcm9maWxlIiBTaXplPSIzMiI+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InZvaWNlX2NhbGwiIE51bWVyaWNhbD0iMCIvPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJzeXN0ZW0iIE51bWVyaWNhbD0iMSIvPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJyaW5nIiBOdW1lcmljYWw9IjIiLz4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0ibXVzaWMiIE51bWVyaWNhbD0iMyIvPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJhbGFybSIgTnVtZXJpY2FsPSI0Ii8+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9Im5vdGlmaWNhdGlvbiIgTnVtZXJpY2FsPSI1Ii8+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9ImJsdWV0b290aF9zY28iIE51bWVyaWNhbD0iNiIvPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJlbmZvcmNlZF9hdWRpYmxlIiBOdW1lcmljYWw9IjciLz4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0iZHRtZiIgTnVtZXJpY2FsPSI4Ii8+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InR0cyIgTnVtZXJpY2FsPSI5Ii8+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9ImFjY2Vzc2liaWxpdHkiIE51bWVyaWNhbD0iMTAiLz4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0icmVyb3V0aW5nIiBOdW1lcmljYWw9IjExIi8+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InBhdGNoIiBOdW1lcmljYWw9IjEyIi8+CisgICAgICAgIDwvRW51bVBhcmFtZXRlcj4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJlYW0iICBNYXBwaW5nPSJTdHJlYW0iPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFwcGxpY2FibGVfdm9sdW1lX3Byb2ZpbGUiIFR5cGU9IlZvbHVtZVByb2ZpbGVUeXBlIgorICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJWb2x1bWUgcHJvZmlsZSBmb2xsb3dlZCBieSBhIGdpdmVuIHN0cmVhbSB0eXBlLiIvPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gQ09NTU9OIFRZUEVTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBDT01NT04gVFlQRVMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0U291cmNlIj4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhcHBsaWNhYmxlX2lucHV0X2RldmljZSIgVHlwZT0iSW5wdXREZXZpY2VzTWFzayIKKyAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJJbnB1dFNvdXJjZSIgRGVzY3JpcHRpb249IlNlbGVjdGVkIElucHV0IGRldmljZSIvPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlBVVCBTT1VSQ0UgQ09NTU9OIFRZUEVTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFBST0RVQ1QgU1RSQVRFR1kgQ09NTU9OIFRZUEVTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJQcm9kdWN0U3RyYXRlZ3kiIE1hcHBpbmc9IlByb2R1Y3RTdHJhdGVneSI+CisgICAgICAgIDxDb21wb25lbnQgTmFtZT0ic2VsZWN0ZWRfb3V0cHV0X2RldmljZXMiIFR5cGU9Ik91dHB1dERldmljZXNNYXNrIi8+CisgICAgICAgIDxTdHJpbmdQYXJhbWV0ZXIgTmFtZT0iZGV2aWNlX2FkZHJlc3MiIE1heExlbmd0aD0iMjU2IgorICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJpZiBhbnksIGRldmljZSBhZGRyZXNzIGFzc29jaWF0ZWQiLz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgUFJPRFVDVCBTVFJBVEVHWSBDT01NT04gVFlQRVMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKzwvQ29tcG9uZW50VHlwZVNldD4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLW5vLXN0cmF0ZWd5LnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLW5vLXN0cmF0ZWd5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGU3NTM3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0tbm8tc3RyYXRlZ3kueG1sCkBAIC0wLDAgKzEsNzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8U3Vic3lzdGVtIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgorICAgICAgICAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iU2NoZW1hcy9TdWJzeXN0ZW0ueHNkIgorICAgICAgICAgICBOYW1lPSJwb2xpY3kiIFR5cGU9IlBvbGljeSI+CisKKyAgICA8Q29tcG9uZW50TGlicmFyeT4KKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisgICAgICAgIDwhLS0gQ29tbW9uIFR5cGVzIGRlZmludGlvbiAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0iUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbCIvPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBHTE9CQUwgQ09NUE9ORU5UUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyZWFtcyIgRGVzY3JpcHRpb249ImFzc29jaWF0ZWQgdG8gYXVkaW9fc3RyZWFtX3R5cGVfdCBkZWZpbml0aW9uIj4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY2FsbCIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InN5c3RlbSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9TWVNURU0iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmluZyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9SSU5HIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im11c2ljIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX01VU0lDIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFsYXJtIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0FMQVJNIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbiIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYmx1ZXRvb3RoX3NjbyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImVuZm9yY2VkX2F1ZGlibGUiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSIKKyAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IlNvdW5kcyB0aGF0IGNhbm5vdCBiZSBtdXRlZCBieSB1c2VyIGFuZCBtdXN0IGJlIHJvdXRlZCB0byBzcGVha2VyIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImR0bWYiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fRFRNRiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ0dHMiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fVFRTIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyLiBQbGF5cyBvdmVyIHNwZWFrZXIgb25seSwgc2lsZW50IG9uIG90aGVyIGRldmljZXMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWNjZXNzaWJpbGl0eSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGFjY2Vzc2liaWxpdHkgdGFsayBiYWNrIHByb21wdHMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmVyb3V0aW5nIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1JFUk9VVElORyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkZvciBkeW5hbWljIHBvbGljeSBvdXRwdXQgbWl4ZXMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icGF0Y2giIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fUEFUQ0giCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJGb3IgaW50ZXJuYWwgYXVkaW8gZmxpbmdlciB0cmFja3MuIEZpeGVkIHZvbHVtZSIvPgorICAgICAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkVBTSBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXRTb3VyY2VzIiBEZXNjcmlwdGlvbj0iYXNzb2NpYXRlZCB0byBhdWRpb19zb3VyY2VfdCBkZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIG1hcHBpbmcgbXVzdCBtYXRjaCB0aGUgdmFsdWUgb2YgdGhlIGVudW0iPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJkZWZhdWx0IiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfREVGQVVMVCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJtaWMiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9NSUMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfdXBsaW5rIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9VUExJTksiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfZG93bmxpbmsiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTksiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY2FsbCIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX0NBTEwiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iY2FtY29yZGVyIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfQ0FNQ09SREVSIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX3JlY29nbml0aW9uIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NvbW11bmljYXRpb24iIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJlbW90ZV9zdWJtaXgiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InVucHJvY2Vzc2VkIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZm1fdHVuZXIiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9GTV9UVU5FUiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJob3R3b3JkIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfSE9UV09SRCIvPgorICAgICAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgIDwvQ29tcG9uZW50TGlicmFyeT4KKworICAgIDxJbnN0YW5jZURlZmluaXRpb24+CisgICAgICAgIDxDb21wb25lbnQgTmFtZT0ic3RyZWFtcyIgVHlwZT0iU3RyZWFtcyIvPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImlucHV0X3NvdXJjZXMiIFR5cGU9IklucHV0U291cmNlcyIvPgorICAgIDwvSW5zdGFuY2VEZWZpbml0aW9uPgorPC9TdWJzeXN0ZW0+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9jb21tb24vU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9jb21tb24vU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1Y2UyYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLnhtbApAQCAtMCwwICsxLDg4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFN1YnN5c3RlbSB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgICAgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IlNjaGVtYXMvU3Vic3lzdGVtLnhzZCIKKyAgICAgICAgICAgTmFtZT0icG9saWN5IiBUeXBlPSJQb2xpY3kiPgorCisgICAgPENvbXBvbmVudExpYnJhcnk+CisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBHTE9CQUwgQ09NUE9ORU5UUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorICAgICAgICA8IS0tIENvbW1vbiBUeXBlcyBkZWZpbnRpb24gLS0+CisgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9IlBvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwiLz4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0iUHJvZHVjdFN0cmF0ZWdpZXMueG1sIi8+CisKKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0xPQkFMIENPTVBPTkVOVFMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkVBTSBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlN0cmVhbXMiIERlc2NyaXB0aW9uPSJhc3NvY2lhdGVkIHRvIGF1ZGlvX3N0cmVhbV90eXBlX3QgZGVmaW5pdGlvbiI+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NhbGwiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzeXN0ZW0iIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fU1lTVEVNIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJpbmciIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fUklORyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJtdXNpYyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9NVVNJQyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhbGFybSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9BTEFSTSIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJub3RpZmljYXRpb24iIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImJsdWV0b290aF9zY28iIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJlbmZvcmNlZF9hdWRpYmxlIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUiCisgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJTb3VuZHMgdGhhdCBjYW5ub3QgYmUgbXV0ZWQgYnkgdXNlciBhbmQgbXVzdCBiZSByb3V0ZWQgdG8gc3BlYWtlciIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJkdG1mIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0RUTUYiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idHRzIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1RUUyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IlRyYW5zbWl0dGVkIFRocm91Z2ggU3BlYWtlci4gUGxheXMgb3ZlciBzcGVha2VyIG9ubHksIHNpbGVudCBvbiBvdGhlciBkZXZpY2VzIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFjY2Vzc2liaWxpdHkiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkZvciBhY2Nlc3NpYmlsaXR5IHRhbGsgYmFjayBwcm9tcHRzIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJlcm91dGluZyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9SRVJPVVRJTkciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJGb3IgZHluYW1pYyBwb2xpY3kgb3V0cHV0IG1peGVzIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InBhdGNoIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1BBVENIIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGludGVybmFsIGF1ZGlvIGZsaW5nZXIgdHJhY2tzLiBGaXhlZCB2b2x1bWUiLz4KKyAgICAgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0U291cmNlcyIgRGVzY3JpcHRpb249ImFzc29jaWF0ZWQgdG8gYXVkaW9fc291cmNlX3QgZGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciBtYXBwaW5nIG11c3QgbWF0Y2ggdGhlIHZhbHVlIG9mIHRoZSBlbnVtIj4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZGVmYXVsdCIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX0RFRkFVTFQiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibWljIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfTUlDIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX3VwbGluayIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2Rvd25saW5rIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NhbGwiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9DQUxMIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImNhbWNvcmRlciIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX0NBTUNPUkRFUiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9yZWNvZ25pdGlvbiIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jb21tdW5pY2F0aW9uIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyZW1vdGVfc3VibWl4IiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ1bnByb2Nlc3NlZCIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImZtX3R1bmVyIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfRk1fVFVORVIiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iaG90d29yZCIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX0hPVFdPUkQiLz4KKyAgICAgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlBVVCBTT1VSQ0UgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisgICAgPC9Db21wb25lbnRMaWJyYXJ5PgorCisgICAgPEluc3RhbmNlRGVmaW5pdGlvbj4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzdHJlYW1zIiBUeXBlPSJTdHJlYW1zIi8+CisgICAgICAgIDxDb21wb25lbnQgTmFtZT0iaW5wdXRfc291cmNlcyIgVHlwZT0iSW5wdXRTb3VyY2VzIi8+CisgICAgICAgIDxDb21wb25lbnQgTmFtZT0icHJvZHVjdF9zdHJhdGVnaWVzIiBUeXBlPSJQcm9kdWN0U3RyYXRlZ2llcyIvPgorICAgIDwvSW5zdGFuY2VEZWZpbml0aW9uPgorPC9TdWJzeXN0ZW0+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9jb21tb24vU3RydWN0dXJlL1Byb2R1Y3RTdHJhdGVnaWVzLnhtbC5pbiBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUHJvZHVjdFN0cmF0ZWdpZXMueG1sLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NjBiMjUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9jb21tb24vU3RydWN0dXJlL1Byb2R1Y3RTdHJhdGVnaWVzLnhtbC5pbgpAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPENvbXBvbmVudFR5cGVTZXQgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCisgICAgICAgICAgICAgIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSJTY2hlbWFzL0NvbXBvbmVudFR5cGVTZXQueHNkIj4KKworICA8IS0tIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGUgdGhlIHN0cmF0ZWd5IHN0cnVjdHVyZSBwbHVnaW4gZmlsZSBmcm9tIEVuZ2luZSBDb25maWd1cmF0aW9uIFhNTCBmaWxlCisgICAgICAgIENvbXBvbmVudCBOYW1lPSJ4eHgiIFR5cGU9IlByb2R1Y3RTdHJhdGVneSIvLS0+CisgIDxDb21wb25lbnRUeXBlIE5hbWU9IlByb2R1Y3RTdHJhdGVnaWVzIiBEZXNjcmlwdGlvbj0iIj4KKyAgPC9Db21wb25lbnRUeXBlPgorCis8L0NvbXBvbmVudFR5cGVTZXQ+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9wb2xpY3lfY3JpdGVyaWEudHh0IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvcG9saWN5X2NyaXRlcmlhLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgwY2JlMS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9wb2xpY3lfY3JpdGVyaWEudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotRXhjbHVzaXZlQ3JpdGVyaW9uIFRlbGVwaG9ueU1vZGUgICAgICAgICAgICAgICAgOiAgIE5vcm1hbCAgICAgICAgICBSaW5nVG9uZSAgICAgICAgICAgICAgICBJbkNhbGwgICAgICAgICAgICAgIEluQ29tbXVuaWNhdGlvbgotSW5jbHVzaXZlQ3JpdGVyaW9uIEF2YWlsYWJsZUlucHV0RGV2aWNlcyAgICAgICAgOiAgIENvbW11bmljYXRpb24gQW1iaWVudCBCdWlsdGluTWljIEJsdWV0b290aFNjb0hlYWRzZXQgV2lyZWRIZWFkc2V0IEhkbWkgVGVsZXBob255UnggQmFja01pYyBSZW1vdGVTdWJtaXggQW5sZ0RvY2tIZWFkc2V0IERndGxEb2NrSGVhZHNldCBVc2JBY2Nlc3NvcnkgVXNiRGV2aWNlIEZtVHVuZXIgVHZUdW5lciBMaW5lIFNwZGlmIEJsdWV0b290aEEyZHAgTG9vcGJhY2sgSXAgQnVzIFN0dWIKLUluY2x1c2l2ZUNyaXRlcmlvbiBBdmFpbGFibGVPdXRwdXREZXZpY2VzICAgICAgIDogICBFYXJwaWVjZSBTcGVha2VyIFdpcmVkU3BlYWtlciBXaXJlZEhlYWRzZXQgV2lyZWRIZWFkcGhvbmUgQmx1ZXRvb3RoU2NvIEJsdWV0b290aFNjb0hlYWRzZXQgQmx1ZXRvb3RoU2NvQ2Fya2l0IEJsdWV0b290aEEyZHAgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIgSGRtaSBBbmxnRG9ja0hlYWRzZXQgRGd0bERvY2tIZWFkc2V0IFVzYkFjY2Vzc29yeSBVc2JEZXZpY2UgUmVtb3RlU3VibWl4IFRlbGVwaG9ueVR4IExpbmUgSGRtaUFyYyBTcGRpZiBGbSBBdXhMaW5lIFNwZWFrZXJTYWZlIElwIEJ1cyBTdHViCi1FeGNsdXNpdmVDcml0ZXJpb24gRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uICAgICA6ICAgRm9yY2VOb25lICAgICAgIEZvcmNlU3BlYWtlciAgICAgICAgICAgIEZvcmNlQnRTY28KLUV4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvck1lZGlhICAgICAgICAgICAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VTcGVha2VyCQkJRm9yY2VIZWFkcGhvbmVzICAgICAgICAgRm9yY2VCdEEyZHAgICAgICAgICBGb3JjZVdpcmVkQWNjZXNzb3J5IEZvcmNlQW5hbG9nRG9jayBGb3JjZURpZ2l0YWxEb2NrICAgIEZvcmNlTm9CdEEyZHAgICAgICAgRm9yY2VTeXN0ZW1FbmZvcmNlZAotRXhjbHVzaXZlQ3JpdGVyaW9uIEZvcmNlVXNlRm9yUmVjb3JkICAgICAgICAgICAgOiAgIEZvcmNlTm9uZSAgICAgICBGb3JjZUJ0U2NvICAgICAgICAgICAgICBGb3JjZVdpcmVkQWNjZXNzb3J5Ci1FeGNsdXNpdmVDcml0ZXJpb24gRm9yY2VVc2VGb3JEb2NrICAgICAgICAgICAgICA6ICAgRm9yY2VOb25lICAgICAgIEZvcmNlV2lyZWRBY2Nlc3NvcnkgICAgIEZvcmNlQnRDYXJEb2NrICAgICAgRm9yY2VCdERlc2tEb2NrICAgICBGb3JjZUFuYWxvZ0RvY2sgRm9yY2VEaWdpdGFsRG9jawotRXhjbHVzaXZlQ3JpdGVyaW9uIEZvcmNlVXNlRm9yU3lzdGVtICAgICAgICAgICAgOiAgIEZvcmNlTm9uZSAgICAgICBGb3JjZVN5c3RlbUVuZm9yY2VkCi1FeGNsdXNpdmVDcml0ZXJpb24gRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gICA6ICAgRm9yY2VOb25lICAgICAgIEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCi1FeGNsdXNpdmVDcml0ZXJpb24gRm9yY2VVc2VGb3JFbmNvZGVkU3Vycm91bmQgICA6ICAgRm9yY2VOb25lICAgICAgIEZvcmNlRW5jb2RlZFN1cnJvdW5kTmV2ZXIgICBGb3JjZUVuY29kZWRTdXJyb3VuZEFsd2F5cwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vQW5kcm9pZC5tawppbmRleCAzNTU5Y2YxLi40NzA2ZDdkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vQW5kcm9pZC5tawpAQCAtOCwxMCArOCw5IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gXAogICAgIFBvbGljeVN1YnN5c3RlbUJ1aWxkZXIuY3BwIFwKICAgICBQb2xpY3lTdWJzeXN0ZW0uY3BwIFwKLSAgICBTdHJhdGVneS5jcHAgXAogICAgIElucHV0U291cmNlLmNwcCBcCiAgICAgU3RyZWFtLmNwcCBcCi0gICAgVXNhZ2UuY3BwCisgICAgUHJvZHVjdFN0cmF0ZWd5LmNwcAogCiBMT0NBTF9DRkxBR1MgKz0gXAogICAgIC1XYWxsIFwKQEAgLTIxLDE4ICsyMCwyNSBAQAogICAgIC1mdmlzaWJpbGl0eT1oaWRkZW4KIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlIFwKKyAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGliYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmFibGUgIFwKICAgICBsaWJwYXJhbWV0ZXIgXAorICAgIGxpYm1lZGlhX2hlbHBlciBcCiAgICAgbGlibG9nIFwKIAorTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9wb2xpY3ljb21tb24gXAorICAgIGxpYmF1ZGlvY2xpZW50X2hlYWRlcnMgXAorICAgIGxpYmJhc2VfaGVhZGVycworCiBMT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQogCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYnBmd191dGlsaXR5CitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJwZndfdXRpbGl0eSBcCisgICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiBMT0NBTF9NT0RVTEUgOj0gbGlicG9saWN5LXN1YnN5c3RlbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5jcHAKaW5kZXggZWFjNGVmZS4uZjkxZjhkNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vSW5wdXRTb3VyY2UuY3BwCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSAiSW5wdXRTb3VyY2UuaCIKICNpbmNsdWRlICJQb2xpY3lNYXBwaW5nS2V5cy5oIgogI2luY2x1ZGUgIlBvbGljeVN1YnN5c3RlbS5oIgorI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KIAogdXNpbmcgc3RkOjpzdHJpbmc7CiAKQEAgLTMzLDkgKzM0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQtPmdldEJlbG9uZ2luZ1N1YnN5c3RlbSgpKSksCiAgICAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlKG1Qb2xpY3lTdWJzeXN0ZW0tPmdldFBvbGljeVBsdWdpbkludGVyZmFjZSgpKQogewotICAgIG1JZCA9IHN0YXRpY19jYXN0PGF1ZGlvX3NvdXJjZV90Pihjb250ZXh0LmdldEl0ZW1Bc0ludGVnZXIoTWFwcGluZ0tleUlkZW50aWZpZXIpKTsKKyAgICBzdGQ6OnN0cmluZyBuYW1lKGNvbnRleHQuZ2V0SXRlbShNYXBwaW5nS2V5TmFtZSkpOworCisgICAgaWYobm90IGFuZHJvaWQ6OlNvdXJjZVR5cGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcobmFtZSwgbUlkKSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJJbnZhbGlkIElucHV0IFNvdXJjZSBuYW1lOiAlcywgaW52YWxpZCBYTUwgc3RydWN0dXJlIGZpbGUiLCBuYW1lLmNfc3RyKCkpOworICAgIH0KICAgICAvLyBEZWNsYXJlcyB0aGUgc3RyYXRlZ3kgdG8gYXVkaW8gcG9saWN5IGVuZ2luZQotICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPmFkZElucHV0U291cmNlKGdldEZvcm1hdHRlZE1hcHBpbmdWYWx1ZSgpLCBtSWQpOworICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPmFkZElucHV0U291cmNlKG5hbWUsIG1JZCk7CiB9CiAKIGJvb2wgSW5wdXRTb3VyY2U6OnNlbmRUb0hXKHN0cmluZyAmIC8qZXJyb3IqLykKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5jcHAKaW5kZXggOThkMTBhOS4uOGJkN2Y2NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5jcHAKQEAgLTE3LDEwICsxNyw5IEBACiAjaW5jbHVkZSAiUG9saWN5U3Vic3lzdGVtLmgiCiAjaW5jbHVkZSAiU3Vic3lzdGVtT2JqZWN0RmFjdG9yeS5oIgogI2luY2x1ZGUgIlBvbGljeU1hcHBpbmdLZXlzLmgiCi0jaW5jbHVkZSAiU3RyYXRlZ3kuaCIKICNpbmNsdWRlICJTdHJlYW0uaCIKICNpbmNsdWRlICJJbnB1dFNvdXJjZS5oIgotI2luY2x1ZGUgIlVzYWdlLmgiCisjaW5jbHVkZSAiUHJvZHVjdFN0cmF0ZWd5LmgiCiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxBdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0zNiw5ICszNSw4IEBACiAKIAogY29uc3QgY2hhciAqY29uc3QgUG9saWN5U3Vic3lzdGVtOjptU3RyZWFtQ29tcG9uZW50TmFtZSA9ICJTdHJlYW0iOwotY29uc3QgY2hhciAqY29uc3QgUG9saWN5U3Vic3lzdGVtOjptU3RyYXRlZ3lDb21wb25lbnROYW1lID0gIlN0cmF0ZWd5IjsKIGNvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVN1YnN5c3RlbTo6bUlucHV0U291cmNlQ29tcG9uZW50TmFtZSA9ICJJbnB1dFNvdXJjZSI7Ci1jb25zdCBjaGFyICpjb25zdCBQb2xpY3lTdWJzeXN0ZW06Om1Vc2FnZUNvbXBvbmVudE5hbWUgPSAiVXNhZ2UiOworY29uc3QgY2hhciAqY29uc3QgUG9saWN5U3Vic3lzdGVtOjptUHJvZHVjdFN0cmF0ZWd5Q29tcG9uZW50TmFtZSA9ICJQcm9kdWN0U3RyYXRlZ3kiOwogCiBQb2xpY3lTdWJzeXN0ZW06OlBvbGljeVN1YnN5c3RlbShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgY29yZTo6bG9nOjpMb2dnZXIgJmxvZ2dlcikKICAgICA6IENTdWJzeXN0ZW0obmFtZSwgbG9nZ2VyKSwKQEAgLTY1LDIyICs2MywxNiBAQAogICAgIGFkZFN1YnN5c3RlbU9iamVjdEZhY3RvcnkoCiAgICAgICAgIG5ldyBUU3Vic3lzdGVtT2JqZWN0RmFjdG9yeTxTdHJlYW0+KAogICAgICAgICAgICAgbVN0cmVhbUNvbXBvbmVudE5hbWUsCi0gICAgICAgICAgICAoMSA8PCBNYXBwaW5nS2V5SWRlbnRpZmllcikpCi0gICAgICAgICk7Ci0gICAgYWRkU3Vic3lzdGVtT2JqZWN0RmFjdG9yeSgKLSAgICAgICAgbmV3IFRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5PFN0cmF0ZWd5PigKLSAgICAgICAgICAgIG1TdHJhdGVneUNvbXBvbmVudE5hbWUsCi0gICAgICAgICAgICAoMSA8PCBNYXBwaW5nS2V5QW1lbmQxKSB8ICgxIDw8IE1hcHBpbmdLZXlJZGVudGlmaWVyKSkKLSAgICAgICAgKTsKLSAgICBhZGRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5KAotICAgICAgICBuZXcgVFN1YnN5c3RlbU9iamVjdEZhY3Rvcnk8VXNhZ2U+KAotICAgICAgICAgICAgbVVzYWdlQ29tcG9uZW50TmFtZSwKLSAgICAgICAgICAgICgxIDw8IE1hcHBpbmdLZXlBbWVuZDEpIHwgKDEgPDwgTWFwcGluZ0tleUlkZW50aWZpZXIpKQorICAgICAgICAgICAgKDEgPDwgTWFwcGluZ0tleU5hbWUpKQogICAgICAgICApOwogICAgIGFkZFN1YnN5c3RlbU9iamVjdEZhY3RvcnkoCiAgICAgICAgIG5ldyBUU3Vic3lzdGVtT2JqZWN0RmFjdG9yeTxJbnB1dFNvdXJjZT4oCiAgICAgICAgICAgICBtSW5wdXRTb3VyY2VDb21wb25lbnROYW1lLAotICAgICAgICAgICAgKDEgPDwgTWFwcGluZ0tleUFtZW5kMSkgfCAoMSA8PCBNYXBwaW5nS2V5SWRlbnRpZmllcikpCisgICAgICAgICAgICAoMSA8PCBNYXBwaW5nS2V5TmFtZSkpCisgICAgICAgICk7CisgICAgYWRkU3Vic3lzdGVtT2JqZWN0RmFjdG9yeSgKKyAgICAgICAgbmV3IFRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5PFByb2R1Y3RTdHJhdGVneT4oCisgICAgICAgICAgICBtUHJvZHVjdFN0cmF0ZWd5Q29tcG9uZW50TmFtZSwgKDEgPDwgTWFwcGluZ0tleU5hbWUpKQogICAgICAgICApOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtLmgKaW5kZXggODIyZWViOS4uOWJmMWMyMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uaApAQCAtNTMsNyArNTMsNiBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtS2V5QW1lbmQzOyAvKio8IGFtZW5kMyBrZXkgbWFwcGluZyBzdHJpbmcuICovCiAKICAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVN0cmVhbUNvbXBvbmVudE5hbWU7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1TdHJhdGVneUNvbXBvbmVudE5hbWU7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1JbnB1dFNvdXJjZUNvbXBvbmVudE5hbWU7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1Vc2FnZUNvbXBvbmVudE5hbWU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1Qcm9kdWN0U3RyYXRlZ3lDb21wb25lbnROYW1lOwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJkOTQ1NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuY3BwCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiUHJvZHVjdFN0cmF0ZWd5LmgiCisjaW5jbHVkZSAiUG9saWN5TWFwcGluZ0tleXMuaCIKKyNpbmNsdWRlICJQb2xpY3lTdWJzeXN0ZW0uaCIKKwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBhbmRyb2lkOjpwcm9kdWN0X3N0cmF0ZWd5X3Q7CisKK1Byb2R1Y3RTdHJhdGVneTo6UHJvZHVjdFN0cmF0ZWd5KGNvbnN0IHN0cmluZyAmbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDTWFwcGluZ0NvbnRleHQgJmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgY29yZTo6bG9nOjpMb2dnZXImIGxvZ2dlcikKKyAgICA6IENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QoaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0tleUFtZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1hcHBpbmdLZXlBbWVuZEVuZCAtIE1hcHBpbmdLZXlBbWVuZDEgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCkKK3sKKyAgICBzdGQ6OnN0cmluZyBuYW1lKGNvbnRleHQuZ2V0SXRlbShNYXBwaW5nS2V5TmFtZSkpOworCisgICAgQUxPR19BU1NFUlQoaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICE9IG51bGxwdHIsICJJbnZhbGlkIENvbmZpZ3VyYWJsZSBFbGVtZW50Iik7CisgICAgbVBvbGljeVN1YnN5c3RlbSA9IHN0YXRpY19jYXN0PGNvbnN0IFBvbGljeVN1YnN5c3RlbSAqPigKKyAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQtPmdldEJlbG9uZ2luZ1N1YnN5c3RlbSgpKTsKKyAgICBBTE9HX0FTU0VSVChtUG9saWN5U3Vic3lzdGVtICE9IG51bGxwdHIsICJJbnZhbGlkIFBvbGljeSBTdWJzeXN0ZW0iKTsKKworICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgPSBtUG9saWN5U3Vic3lzdGVtLT5nZXRQb2xpY3lQbHVnaW5JbnRlcmZhY2UoKTsKKyAgICBBTE9HX0FTU0VSVChtUG9saWN5UGx1Z2luSW50ZXJmYWNlICE9IG51bGxwdHIsICJJbnZhbGlkIFBvbGljeSBQbHVnaW4gSW50ZXJmYWNlIik7CisKKyAgICBtSWQgPSBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5nZXRQcm9kdWN0U3RyYXRlZ3lCeU5hbWUobmFtZSk7CisKKyAgICBBTE9HX0FTU0VSVChtSWQgIT0gUFJPRFVDVF9TVFJBVEVHWV9JTlZBTElELCAiUHJvZHVjdCBTdHJhdGVneSAlcyBub3QgZm91bmQiLCBuYW1lLmNfc3RyKCkpOworCisgICAgQUxPR0UoIlByb2R1Y3QgU3RyYXRlZ3kgJXMgYWRkZWQiLCBuYW1lLmNfc3RyKCkpOworfQorCitib29sIFByb2R1Y3RTdHJhdGVneTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQoreworICAgIERldmljZSBkZXZpY2VQYXJhbXM7CisgICAgYmxhY2tib2FyZFJlYWQoJmRldmljZVBhcmFtcywgc2l6ZW9mKGRldmljZVBhcmFtcykpOworCisgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kobUlkLCBkZXZpY2VQYXJhbXMuYXBwbGljYWJsZURldmljZSk7CisgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0RGV2aWNlQWRkcmVzc0ZvclByb2R1Y3RTdHJhdGVneShtSWQsIGRldmljZVBhcmFtcy5kZXZpY2VBZGRyZXNzKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDRmMDgyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkZvcm1hdHRlZFN1YnN5c3RlbU9iamVjdC5oIgorI2luY2x1ZGUgIkluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC5oIgorI2luY2x1ZGUgIk1hcHBpbmdDb250ZXh0LmgiCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK2NsYXNzIFBvbGljeVN1YnN5c3RlbTsKKworY2xhc3MgUHJvZHVjdFN0cmF0ZWd5IDogcHVibGljIENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QKK3sKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IG1NYXhTdHJpbmdTaXplID0gMjU3OyAvKio8IG1heCBzdHJpbmcgc2l6ZSAocGx1cyB6ZXJvIHRlcm1pbmFsKS4gKi8KKworICAgIHN0cnVjdCBEZXZpY2UKKyAgICB7CisgICAgICAgIHVpbnQzMl90IGFwcGxpY2FibGVEZXZpY2U7IC8qKjwgYXBwbGljYWJsZSBkZXZpY2UgZm9yIHRoaXMgc3RyYXRlZ3kuICovCisgICAgICAgIGNoYXIgZGV2aWNlQWRkcmVzc1ttTWF4U3RyaW5nU2l6ZV07IC8qKjwgZGV2aWNlIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RyYXRlZ3kuICovCisgICAgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworcHVibGljOgorICAgIFByb2R1Y3RTdHJhdGVneShjb25zdCBzdGQ6OnN0cmluZyAmbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKKyAgICAgICAgICAgICBjb25zdCBDTWFwcGluZ0NvbnRleHQgJmNvbnRleHQsCisgICAgICAgICAgICAgY29yZTo6bG9nOjpMb2dnZXImIGxvZ2dlcik7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGJvb2wgc2VuZFRvSFcoc3RkOjpzdHJpbmcgJmVycm9yKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKm1Qb2xpY3lTdWJzeXN0ZW07IC8qKjwgUm91dGUgc3Vic3l0ZW0gcGx1Z2luLiAqLworCisgICAgYW5kcm9pZDo6cHJvZHVjdF9zdHJhdGVneV90IG1JZDsKKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSB0byBjb21tdW5pY2F0ZSB3aXRoIEF1ZGlvIFBvbGljeSBFbmdpbmUuCisgICAgICovCisgICAgYW5kcm9pZDo6QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKm1Qb2xpY3lQbHVnaW5JbnRlcmZhY2U7Cit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmF0ZWd5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NmMzYTguLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmF0ZWd5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiU3RyYXRlZ3kuaCIKLSNpbmNsdWRlICJQb2xpY3lNYXBwaW5nS2V5cy5oIgotI2luY2x1ZGUgIlBvbGljeVN1YnN5c3RlbS5oIgotCi11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIGFuZHJvaWQ6OnJvdXRpbmdfc3RyYXRlZ3k7Ci0KLVN0cmF0ZWd5OjpTdHJhdGVneShjb25zdCBzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0LAotICAgICAgICAgICAgICAgICAgIGNvcmU6OmxvZzo6TG9nZ2VyJiBsb2dnZXIpCi0gICAgOiBDRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0KGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmdLZXlBbWVuZDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNYXBwaW5nS2V5QW1lbmRFbmQgLSBNYXBwaW5nS2V5QW1lbmQxICsgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQpLAotICAgICAgbVBvbGljeVN1YnN5c3RlbShzdGF0aWNfY2FzdDxjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQtPmdldEJlbG9uZ2luZ1N1YnN5c3RlbSgpKSksCi0gICAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlKG1Qb2xpY3lTdWJzeXN0ZW0tPmdldFBvbGljeVBsdWdpbkludGVyZmFjZSgpKQotewotICAgIG1JZCA9IHN0YXRpY19jYXN0PHJvdXRpbmdfc3RyYXRlZ3k+KGNvbnRleHQuZ2V0SXRlbUFzSW50ZWdlcihNYXBwaW5nS2V5SWRlbnRpZmllcikpOwotCi0gICAgLy8gRGVjbGFyZXMgdGhlIHN0cmF0ZWd5IHRvIGF1ZGlvIHBvbGljeSBlbmdpbmUKLSAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5hZGRTdHJhdGVneShnZXRGb3JtYXR0ZWRNYXBwaW5nVmFsdWUoKSwgbUlkKTsKLX0KLQotYm9vbCBTdHJhdGVneTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQotewotICAgIHVpbnQzMl90IGFwcGxpY2FibGVPdXRwdXREZXZpY2U7Ci0gICAgYmxhY2tib2FyZFJlYWQoJmFwcGxpY2FibGVPdXRwdXREZXZpY2UsIHNpemVvZihhcHBsaWNhYmxlT3V0cHV0RGV2aWNlKSk7Ci0gICAgcmV0dXJuIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPnNldERldmljZUZvclN0cmF0ZWd5KG1JZCwgYXBwbGljYWJsZU91dHB1dERldmljZSk7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyYXRlZ3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDJiODJjLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0LmgiCi0jaW5jbHVkZSAiSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LmgiCi0jaW5jbHVkZSAiTWFwcGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlIDxBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oPgotI2luY2x1ZGUgPHN0cmluZz4KLQotY2xhc3MgUG9saWN5U3Vic3lzdGVtOwotCi1jbGFzcyBTdHJhdGVneSA6IHB1YmxpYyBDRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0Ci17Ci1wdWJsaWM6Ci0gICAgU3RyYXRlZ3koY29uc3Qgc3RkOjpzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKLSAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCi0gICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0LAotICAgICAgICAgICAgIGNvcmU6OmxvZzo6TG9nZ2VyJiBsb2dnZXIpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBib29sIHNlbmRUb0hXKHN0ZDo6c3RyaW5nICZlcnJvcik7Ci0KLXByaXZhdGU6Ci0gICAgY29uc3QgUG9saWN5U3Vic3lzdGVtICptUG9saWN5U3Vic3lzdGVtOyAvKio8IFJvdXRlIHN1YnN5dGVtIHBsdWdpbi4gKi8KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSB0byBjb21tdW5pY2F0ZSB3aXRoIEF1ZGlvIFBvbGljeSBFbmdpbmUuCi0gICAgICovCi0gICAgYW5kcm9pZDo6QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKm1Qb2xpY3lQbHVnaW5JbnRlcmZhY2U7Ci0KLSAgICBhbmRyb2lkOjpyb3V0aW5nX3N0cmF0ZWd5IG1JZDsgLyoqPCBzdHJhdGVneSBpZGVudGlmaWVyIHRvIGxpbmsgd2l0aCBhdWRpby5oLiovCi19OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyZWFtLmNwcAppbmRleCBjNjQyYTIzLi41MjMwZTBlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyZWFtLmNwcApAQCAtMTcsOSArMTcsOSBAQAogI2luY2x1ZGUgIlN0cmVhbS5oIgogI2luY2x1ZGUgIlBvbGljeU1hcHBpbmdLZXlzLmgiCiAjaW5jbHVkZSAiUG9saWN5U3Vic3lzdGVtLmgiCisjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgogCiB1c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIGFuZHJvaWQ6OnJvdXRpbmdfc3RyYXRlZ3k7CiAKIFN0cmVhbTo6U3RyZWFtKGNvbnN0IHN0cmluZyAmLyptYXBwaW5nVmFsdWUqLywKICAgICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKQEAgLTI5LDEwICsyOSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LT5nZXRCZWxvbmdpbmdTdWJzeXN0ZW0oKSkpLAogICAgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZShtUG9saWN5U3Vic3lzdGVtLT5nZXRQb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSkKIHsKLSAgICBtSWQgPSBzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90Pihjb250ZXh0LmdldEl0ZW1Bc0ludGVnZXIoTWFwcGluZ0tleUlkZW50aWZpZXIpKTsKKyAgICBzdGQ6OnN0cmluZyBuYW1lKGNvbnRleHQuZ2V0SXRlbShNYXBwaW5nS2V5TmFtZSkpOworCisgICAgaWYgKG5vdCBhbmRyb2lkOjpTdHJlYW1UeXBlQ29udmVydGVyOjpmcm9tU3RyaW5nKG5hbWUsIG1JZCkpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSW52YWxpZCBTdHJlYW0gdHlwZSBuYW1lOiAlcywgaW52YWxpZCBYTUwgc3RydWN0dXJlIGZpbGUiLCBuYW1lLmNfc3RyKCkpOworICAgIH0KIAogICAgIC8vIERlY2xhcmVzIHRoZSBzdHJhdGVneSB0byBhdWRpbyBwb2xpY3kgZW5naW5lCi0gICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+YWRkU3RyZWFtKGdldEZvcm1hdHRlZE1hcHBpbmdWYWx1ZSgpLCBtSWQpOworICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPmFkZFN0cmVhbShuYW1lLCBtSWQpOwogfQogCiBib29sIFN0cmVhbTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQpAQCAtNDAsMTEgKzQ0LDggQEAKICAgICBBcHBsaWNhYmxlIHBhcmFtczsKICAgICBibGFja2JvYXJkUmVhZCgmcGFyYW1zLCBzaXplb2YocGFyYW1zKSk7CiAKLSAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5zZXRTdHJhdGVneUZvclN0cmVhbShtSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8cm91dGluZ19zdHJhdGVneT4ocGFyYW1zLnN0cmF0ZWd5KSk7Ci0KLSAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5zZXRWb2x1bWVQcm9maWxlRm9yU3RyZWFtKG1JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHBhcmFtcy52b2x1bWVQcm9maWxlKSk7CisgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0Vm9sdW1lUHJvZmlsZUZvclN0cmVhbSgKKyAgICAgICAgICAgICAgICBtSWQsIHN0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHBhcmFtcy52b2x1bWVQcm9maWxlKSk7CiAKICAgICByZXR1cm4gdHJ1ZTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5oCmluZGV4IDRhODc1ZGIuLmUwY2UyZmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyZWFtLmgKQEAgLTI5LDcgKzI5LDYgQEAKIHByaXZhdGU6CiAgICAgc3RydWN0IEFwcGxpY2FibGUKICAgICB7Ci0gICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5OyAvKio8IGFwcGxpY2FibGUgc3RyYXRlZ3kgZm9yIHRoaXMgc3RyZWFtLiAqLwogICAgICAgICB1aW50MzJfdCB2b2x1bWVQcm9maWxlOyAvKio8IGFwcGxpY2FibGUgc3RyYXRlZ3kgZm9yIHRoaXMgc3RyZWFtLiAqLwogICAgIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Vc2FnZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODE5OWY4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Vc2FnZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlVzYWdlLmgiCi0jaW5jbHVkZSAiUG9saWN5TWFwcGluZ0tleXMuaCIKLSNpbmNsdWRlICJQb2xpY3lTdWJzeXN0ZW0uaCIKLQotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBhbmRyb2lkOjpyb3V0aW5nX3N0cmF0ZWd5OwotCi1Vc2FnZTo6VXNhZ2UoY29uc3Qgc3RyaW5nICZtYXBwaW5nVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IENNYXBwaW5nQ29udGV4dCAmY29udGV4dCwgY29yZTo6bG9nOjpMb2dnZXIgJmxvZ2dlcikKLSAgICA6IENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QoaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0tleUFtZW5kMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1hcHBpbmdLZXlBbWVuZEVuZCAtIE1hcHBpbmdLZXlBbWVuZDEgKyAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCksCi0gICAgICBtUG9saWN5U3Vic3lzdGVtKHN0YXRpY19jYXN0PGNvbnN0IFBvbGljeVN1YnN5c3RlbSAqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC0+Z2V0QmVsb25naW5nU3Vic3lzdGVtKCkpKSwKLSAgICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UobVBvbGljeVN1YnN5c3RlbS0+Z2V0UG9saWN5UGx1Z2luSW50ZXJmYWNlKCkpCi17Ci0gICAgbUlkID0gc3RhdGljX2Nhc3Q8YXVkaW9fdXNhZ2VfdD4oY29udGV4dC5nZXRJdGVtQXNJbnRlZ2VyKE1hcHBpbmdLZXlJZGVudGlmaWVyKSk7Ci0KLSAgICAvLyBEZWNsYXJlcyB0aGUgc3RyYXRlZ3kgdG8gYXVkaW8gcG9saWN5IGVuZ2luZQotICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPmFkZFVzYWdlKGdldEZvcm1hdHRlZE1hcHBpbmdWYWx1ZSgpLCBtSWQpOwotfQotCi1ib29sIFVzYWdlOjpzZW5kVG9IVyhzdHJpbmcgJiAvKmVycm9yKi8pCi17Ci0gICAgdWludDMyX3QgYXBwbGljYWJsZVN0cmF0ZWd5OwotICAgIGJsYWNrYm9hcmRSZWFkKCZhcHBsaWNhYmxlU3RyYXRlZ3ksIHNpemVvZihhcHBsaWNhYmxlU3RyYXRlZ3kpKTsKLSAgICByZXR1cm4gbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0U3RyYXRlZ3lGb3JVc2FnZShtSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8cm91dGluZ19zdHJhdGVneT4oYXBwbGljYWJsZVN0cmF0ZWd5KSk7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Vc2FnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjAyMDRmLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Vc2FnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0LmgiCi0jaW5jbHVkZSAiSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LmgiCi0jaW5jbHVkZSAiTWFwcGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlIDxBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oPgotI2luY2x1ZGUgPHN0cmluZz4KLQotY2xhc3MgUG9saWN5U3Vic3lzdGVtOwotCi1jbGFzcyBVc2FnZSA6IHB1YmxpYyBDRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0Ci17Ci1wdWJsaWM6Ci0gICAgVXNhZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKLSAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCi0gICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0LAotICAgICAgICAgIGNvcmU6OmxvZzo6TG9nZ2VyJiBsb2dnZXIpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBib29sIHNlbmRUb0hXKHN0ZDo6c3RyaW5nICZlcnJvcik7Ci0KLXByaXZhdGU6Ci0gICAgY29uc3QgUG9saWN5U3Vic3lzdGVtICptUG9saWN5U3Vic3lzdGVtOyAvKio8IFJvdXRlIHN1YnN5dGVtIHBsdWdpbi4gKi8KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSB0byBjb21tdW5pY2F0ZSB3aXRoIEF1ZGlvIFBvbGljeSBFbmdpbmUuCi0gICAgICovCi0gICAgYW5kcm9pZDo6QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKm1Qb2xpY3lQbHVnaW5JbnRlcmZhY2U7Ci0KLSAgICBhdWRpb191c2FnZV90IG1JZDsgLyoqPCB1c2FnZSBpZGVudGlmaWVyIHRvIGxpbmsgd2l0aCBhdWRpby5oLiAqLwotfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zZXBvbGljeS9hdWRpb3NlcnZlci50ZSBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zZXBvbGljeS9hdWRpb3NlcnZlci50ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDQxZDQyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NlcG9saWN5L2F1ZGlvc2VydmVyLnRlCkBAIC0wLDAgKzEsNCBAQAordXNlcmRlYnVnX29yX2VuZyhgCisgIGFsbG93IGF1ZGlvc2VydmVyIGF1ZGlvc2VydmVyX3NvY2tldDpkaXIgcndfZGlyX3Blcm1zOworICBhbGxvdyBhdWRpb3NlcnZlciBhdWRpb3NlcnZlcl9zb2NrZXQ6c29ja19maWxlIGNyZWF0ZV9maWxlX3Blcm1zOworJykKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zZXBvbGljeS9maWxlLnRlIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NlcG9saWN5L2ZpbGUudGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiMTkzNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zZXBvbGljeS9maWxlLnRlCkBAIC0wLDAgKzEsMiBAQAorIyBQb2xpY3kgRW5naW5lIHJlbW90ZSBjb25uZWN0aW9uIGZvciBydW50aW1lIGRlYnVnIG9mIHBhcmFtZXRlciBmcmFtZXdvcmsKK3R5cGUgYXVkaW9zZXJ2ZXJfc29ja2V0LCBmaWxlX3R5cGUsIGNvcmVkb21haW5fc29ja2V0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NlcG9saWN5L2ZpbGVfY29udGV4dHMgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc2Vwb2xpY3kvZmlsZV9jb250ZXh0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTBmY2NlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NlcG9saWN5L2ZpbGVfY29udGV4dHMKQEAgLTAsMCArMSBAQAorL2Rldi9zb2NrZXQvYXVkaW9zZXJ2ZXIoLy4qKT8gICAgdTpvYmplY3RfcjphdWRpb3NlcnZlcl9zb2NrZXQ6czAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvQ29sbGVjdGlvbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Db2xsZWN0aW9uLmgKaW5kZXggYjcyZGVkOC4uMDJiNDFjYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Db2xsZWN0aW9uLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Db2xsZWN0aW9uLmgKQEAgLTE4LDggKzE4LDYgQEAKIAogI2luY2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJTdHJlYW0uaCIKLSNpbmNsdWRlICJTdHJhdGVneS5oIgotI2luY2x1ZGUgIlVzYWdlLmgiCiAjaW5jbHVkZSAiSW5wdXRTb3VyY2UuaCIKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KQEAgLTI4LDEwICsyNiw4IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3RyaW5nPgogCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CiAKIC8qKgogICogQ29sbGVjdGlvbiBvZiBwb2xpY3kgZWxlbWVudCBhcyBhIG1hcCBpbmRleGVkIHdpdGggYSB0aGVpciBVSUQgdHlwZS4KQEAgLTE0OSwxNSArMTQ1LDkgQEAKIHRlbXBsYXRlIDw+CiBzdHJ1Y3QgQ29sbGVjdGlvbjxzdGQ6OnN0cmluZz46OmNvbGxlY3Rpb25TdXBwb3J0ZWQge307CiB0ZW1wbGF0ZSA8Pgotc3RydWN0IENvbGxlY3Rpb248YXVkaW9fdXNhZ2VfdD46OmNvbGxlY3Rpb25TdXBwb3J0ZWQge307Ci10ZW1wbGF0ZSA8Pgogc3RydWN0IENvbGxlY3Rpb248YXVkaW9fc291cmNlX3Q+Ojpjb2xsZWN0aW9uU3VwcG9ydGVkIHt9OwotdGVtcGxhdGUgPD4KLXN0cnVjdCBDb2xsZWN0aW9uPHJvdXRpbmdfc3RyYXRlZ3k+Ojpjb2xsZWN0aW9uU3VwcG9ydGVkIHt9OwogCi10eXBlZGVmIENvbGxlY3Rpb248cm91dGluZ19zdHJhdGVneT4gU3RyYXRlZ3lDb2xsZWN0aW9uOwogdHlwZWRlZiBDb2xsZWN0aW9uPGF1ZGlvX3N0cmVhbV90eXBlX3Q+IFN0cmVhbUNvbGxlY3Rpb247Ci10eXBlZGVmIENvbGxlY3Rpb248YXVkaW9fdXNhZ2VfdD4gVXNhZ2VDb2xsZWN0aW9uOwogdHlwZWRlZiBDb2xsZWN0aW9uPGF1ZGlvX3NvdXJjZV90PiBJbnB1dFNvdXJjZUNvbGxlY3Rpb247CiAKIH0gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbGVtZW50LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VsZW1lbnQuaAppbmRleCA1MmU3N2U1Li45Nzk1MGQ4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VsZW1lbnQuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VsZW1lbnQuaApAQCAtMjIsMTAgKzIyLDggQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgewogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5PgogY2xhc3MgRWxlbWVudApAQCAtNjQsNyArNjIsNyBAQAogCiAgICAgLyoqCiAgICAgICogQSBQb2xpY3kgZWxlbWVudCBtYXkgaW1wbGVtZW50IGdldHRlci9zZXR0ZXIgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCi0gICAgICogUHJvcGVydHkgbWF5IGJlIHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CisgICAgICogUHJvcGVydHkgbWF5IGJlIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CiAgICAgICogb3IgYSBzdHJpbmcuCiAgICAgICoKICAgICAgKiBAdHBhcmFtIFByb3BlcnR5IGZvciB3aGljaCB0aGlzIHBvbGljeSBlbGVtZW50IGhhcyBzZXR0ZXIgLyBnZXR0ZXIuCkBAIC03NSw3ICs3Myw3IEBACiAKICAgICAvKioKICAgICAgKiBBIFBvbGljeSBlbGVtZW50IG1heSBpbXBsZW1lbnQgZ2V0dGVyL3NldHRlciBmdW5jdGlvbiBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KLSAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgcm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKKyAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKICAgICAgKiBvciBhIHN0cmluZy4KICAgICAgKgogICAgICAqIEB0cGFyYW0gUHJvcGVydHkgZm9yIHdoaWNoIHRoaXMgcG9saWN5IGVsZW1lbnQgaGFzIHNldHRlciAvIGdldHRlci4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmNwcAppbmRleCAwZDE4ZmZhLi44OWFhYTg0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuY3BwCkBAIC0yNSw5MiArMjUsNjMgQEAKICNlbmRpZgogCiAjaW5jbHVkZSAiRW5naW5lLmgiCi0jaW5jbHVkZSAiU3RyYXRlZ3kuaCIKICNpbmNsdWRlICJTdHJlYW0uaCIKICNpbmNsdWRlICJJbnB1dFNvdXJjZS5oIgotI2luY2x1ZGUgIlVzYWdlLmgiCisKKyNpbmNsdWRlIDxFbmdpbmVDb25maWcuaD4KICNpbmNsdWRlIDxwb2xpY3kuaD4KKyNpbmNsdWRlIDxBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oPgogI2luY2x1ZGUgPFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmg+CiAKIHVzaW5nIHN0ZDo6c3RyaW5nOwogdXNpbmcgc3RkOjptYXA7CiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17Ci10ZW1wbGF0ZSA8PgotU3RyYXRlZ3lDb2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248cm91dGluZ19zdHJhdGVneT4oKQotewotICAgIHJldHVybiBtU3RyYXRlZ3lDb2xsZWN0aW9uOwotfQorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CisKIHRlbXBsYXRlIDw+CiBTdHJlYW1Db2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fc3RyZWFtX3R5cGVfdD4oKQogewogICAgIHJldHVybiBtU3RyZWFtQ29sbGVjdGlvbjsKIH0KIHRlbXBsYXRlIDw+Ci1Vc2FnZUNvbGxlY3Rpb24gJkVuZ2luZTo6Z2V0Q29sbGVjdGlvbjxhdWRpb191c2FnZV90PigpCi17Ci0gICAgcmV0dXJuIG1Vc2FnZUNvbGxlY3Rpb247Ci19Ci10ZW1wbGF0ZSA8PgogSW5wdXRTb3VyY2VDb2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fc291cmNlX3Q+KCkKIHsKICAgICByZXR1cm4gbUlucHV0U291cmNlQ29sbGVjdGlvbjsKIH0KIAogdGVtcGxhdGUgPD4KLWNvbnN0IFN0cmF0ZWd5Q29sbGVjdGlvbiAmRW5naW5lOjpnZXRDb2xsZWN0aW9uPHJvdXRpbmdfc3RyYXRlZ3k+KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbVN0cmF0ZWd5Q29sbGVjdGlvbjsKLX0KLXRlbXBsYXRlIDw+CiBjb25zdCBTdHJlYW1Db2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fc3RyZWFtX3R5cGVfdD4oKSBjb25zdAogewogICAgIHJldHVybiBtU3RyZWFtQ29sbGVjdGlvbjsKIH0KIHRlbXBsYXRlIDw+Ci1jb25zdCBVc2FnZUNvbGxlY3Rpb24gJkVuZ2luZTo6Z2V0Q29sbGVjdGlvbjxhdWRpb191c2FnZV90PigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1Vc2FnZUNvbGxlY3Rpb247Ci19Ci10ZW1wbGF0ZSA8PgogY29uc3QgSW5wdXRTb3VyY2VDb2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fc291cmNlX3Q+KCkgY29uc3QKIHsKICAgICByZXR1cm4gbUlucHV0U291cmNlQ29sbGVjdGlvbjsKIH0KIAotRW5naW5lOjpFbmdpbmUoKQotICAgIDogbU1hbmFnZXJJbnRlcmZhY2UodGhpcyksCi0gICAgICBtUGx1Z2luSW50ZXJmYWNlKHRoaXMpLAotICAgICAgbVBvbGljeVBhcmFtZXRlck1ncihuZXcgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIoKSksCi0gICAgICBtQXBtT2JzZXJ2ZXIoTlVMTCkKK0VuZ2luZTo6RW5naW5lKCkgOiBtUG9saWN5UGFyYW1ldGVyTWdyKG5ldyBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcigpKQogeworICAgIHN0YXR1c190IGxvYWRSZXN1bHQgPSBsb2FkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWcoKTsKKyAgICBpZiAobG9hZFJlc3VsdCA8IDApIHsKKyAgICAgICAgQUxPR0UoIlBvbGljeSBFbmdpbmUgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkLiIpOworICAgIH0KIH0KIAogRW5naW5lOjp+RW5naW5lKCkKIHsKLSAgICBtU3RyYXRlZ3lDb2xsZWN0aW9uLmNsZWFyKCk7CiAgICAgbVN0cmVhbUNvbGxlY3Rpb24uY2xlYXIoKTsKICAgICBtSW5wdXRTb3VyY2VDb2xsZWN0aW9uLmNsZWFyKCk7Ci0gICAgbVVzYWdlQ29sbGVjdGlvbi5jbGVhcigpOwotfQotCi0KLXZvaWQgRW5naW5lOjpzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpCi17Ci0gICAgQUxPR19BU1NFUlQob2JzZXJ2ZXIgIT0gTlVMTCwgIkludmFsaWQgQXVkaW8gUG9saWN5IE1hbmFnZXIgb2JzZXJ2ZXIiKTsKLSAgICBtQXBtT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKIH0KIAogc3RhdHVzX3QgRW5naW5lOjppbml0Q2hlY2soKQogewotICAgIGlmIChtUG9saWN5UGFyYW1ldGVyTWdyID09IE5VTEwgfHwgbVBvbGljeVBhcmFtZXRlck1nci0+c3RhcnQoKSAhPSBOT19FUlJPUikgeworICAgIGlmIChtUG9saWN5UGFyYW1ldGVyTWdyID09IG51bGxwdHIgfHwgbVBvbGljeVBhcmFtZXRlck1nci0+c3RhcnQoKSAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBzdGFydCBQb2xpY3kgUEZXIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiAobUFwbU9ic2VydmVyICE9IE5VTEwpPyBOT19FUlJPUiA6IE5PX0lOSVQ7CisgICAgcmV0dXJuIEVuZ2luZUJhc2U6OmluaXRDaGVjaygpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5PgpAQCAtMTM4LDU1ICsxMDksMTYgQEAKICAgICByZXR1cm4gZWxlbWVudC0+dGVtcGxhdGUgZ2V0PFByb3BlcnR5PigpOwogfQogCi1yb3V0aW5nX3N0cmF0ZWd5IEVuZ2luZTo6TWFuYWdlckludGVyZmFjZUltcGw6OmdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSkKK2Jvb2wgRW5naW5lOjpzZXRWb2x1bWVQcm9maWxlRm9yU3RyZWFtKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnByb2ZpbGUpCiB7Ci0gICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFByb3BlcnR5Rm9yS2V5PHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3VzYWdlX3Q+KHVzYWdlKTsKLX0KLQotYXVkaW9fZGV2aWNlc190IEVuZ2luZTo6TWFuYWdlckludGVyZmFjZUltcGw6OmdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpIGNvbnN0Ci17Ci0gICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMgPSBtUG9saWN5RW5naW5lLT5tQXBtT2JzZXJ2ZXItPmdldE91dHB1dHMoKTsKLQotICAgIC8qKiBUaGlzIGlzIHRoZSBvbmx5IGNhc2UgaGFuZGxlZCBwcm9ncmFtbWF0aWNhbGx5IGJlY2F1c2UgdGhlIFBGVyBpcyB1bmFibGUgdG8ga25vdyB0aGUKLSAgICAgKiBhY3Rpdml0eSBvZiBzdHJlYW1zLgotICAgICAqCi0gICAgICogLVdoaWxlIG1lZGlhIGlzIHBsYXlpbmcgb24gYSByZW1vdGUgZGV2aWNlLCB1c2UgdGhlIHRoZSBzb25pZmljYXRpb24gYmVoYXZpb3IuCi0gICAgICogTm90ZSB0aGF0IHdlIHRlc3QgdGhpcyB1c2VjYXNlIGJlZm9yZSB0ZXN0aW5nIGlmIG1lZGlhIGlzIHBsYXlpbmcgYmVjYXVzZQotICAgICAqIHRoZSBpc1N0cmVhbUFjdGl2ZSgpIG1ldGhvZCBvbmx5IGluZm9ybXMgYWJvdXQgdGhlIGFjdGl2aXR5IG9mIGEgc3RyZWFtLCBub3QKLSAgICAgKiBpZiBpdCdzIGZvciBsb2NhbCBwbGF5YmFjay4gTm90ZSBhbHNvIHRoYXQgd2UgdXNlIHRoZSBzYW1lIGRlbGF5IGJldHdlZW4gYm90aCB0ZXN0cwotICAgICAqCi0gICAgICogLVdoZW4gbWVkaWEgaXMgbm90IHBsYXlpbmcgYW55bW9yZSwgZmFsbCBiYWNrIG9uIHRoZSBzb25pZmljYXRpb24gYmVoYXZpb3IKLSAgICAgKi8KLSAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwgJiYKLSAgICAgICAgICAgICFpc19zdGF0ZV9pbl9jYWxsKGdldFBob25lU3RhdGUoKSkgJiYKLSAgICAgICAgICAgICFvdXRwdXRzLmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoQVVESU9fU1RSRUFNX01VU0lDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpICYmCi0gICAgICAgICAgICBvdXRwdXRzLmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpKSB7Ci0gICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIHJvdXRpbmdfc3RyYXRlZ3k+KFNUUkFURUdZX01FRElBKTsKLSAgICB9Ci0gICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgJiYKLSAgICAgICAgKG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX1JJTkcpIHx8IG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX0FMQVJNKSkpIHsKLSAgICAgICAgICAgIC8vIGRvIG5vdCByb3V0ZSBhY2Nlc3NpYmlsaXR5IHByb21wdHMgdG8gYSBkaWdpdGFsIG91dHB1dCBjdXJyZW50bHkgY29uZmlndXJlZCB3aXRoIGEKLSAgICAgICAgICAgIC8vIGNvbXByZXNzZWQgZm9ybWF0IGFzIHRoZXkgd291bGQgbGlrZWx5IG5vdCBiZSBtaXhlZCBhbmQgZHJvcHBlZC4KLSAgICAgICAgICAgIC8vIERldmljZSBGb3IgU29uaWZpY2F0aW9uIGNvbmYgZmlsZSBoYXMgSERNSSwgU1BESUYgYW5kIEhETUkgQVJDIHVucmVhY2hlYWJsZS4KLSAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX2RldmljZXNfdCwgcm91dGluZ19zdHJhdGVneT4oCi0gICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1NPTklGSUNBVElPTik7Ci0gICAgfQotICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIHJvdXRpbmdfc3RyYXRlZ3k+KHN0cmF0ZWd5KTsKLX0KLQotYm9vbCBFbmdpbmU6OlBsdWdpbkludGVyZmFjZUltcGw6OnNldFZvbHVtZVByb2ZpbGVGb3JTdHJlYW0oY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmcHJvZmlsZSkKLXsKLSAgICBpZiAobVBvbGljeUVuZ2luZS0+c2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlKSkgewotICAgICAgICBtUG9saWN5RW5naW5lLT5tQXBtT2JzZXJ2ZXItPmdldFZvbHVtZUN1cnZlcygpLnN3aXRjaFZvbHVtZUN1cnZlKHByb2ZpbGUsIHN0cmVhbSk7CisgICAgaWYgKHNldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHN0cmVhbSwgcHJvZmlsZSkpIHsKKyAgICAgICAgc3dpdGNoVm9sdW1lQ3VydmUocHJvZmlsZSwgc3RyZWFtKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHksIHR5cGVuYW1lIEtleT4KIGJvb2wgRW5naW5lOjpzZXRQcm9wZXJ0eUZvcktleShjb25zdCBQcm9wZXJ0eSAmcHJvcGVydHksIGNvbnN0IEtleSAma2V5KQogewpAQCAtMjAwLDcgKzEzMiwxMSBAQAogCiBzdGF0dXNfdCBFbmdpbmU6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpCiB7Ci0gICAgcmV0dXJuIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldFBob25lU3RhdGUobW9kZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBvbGljeVBhcmFtZXRlck1nci0+c2V0UGhvbmVTdGF0ZShtb2RlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBFbmdpbmVCYXNlOjpzZXRQaG9uZVN0YXRlKG1vZGUpOwogfQogCiBhdWRpb19tb2RlX3QgRW5naW5lOjpnZXRQaG9uZVN0YXRlKCkgY29uc3QKQEAgLTIxMSw3ICsxNDcsMTEgQEAKIHN0YXR1c190IEVuZ2luZTo6c2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKIHsKLSAgICByZXR1cm4gbVBvbGljeVBhcmFtZXRlck1nci0+c2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBvbGljeVBhcmFtZXRlck1nci0+c2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gRW5naW5lQmFzZTo6c2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZyk7CiB9CiAKIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgRW5naW5lOjpnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpIGNvbnN0CkBAIC0yMjAsMjggKzE2MCwyMTYgQEAKIH0KIAogc3RhdHVzX3QgRW5naW5lOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCAvKnN0YXRlKi8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpCiB7CisgICAgbVBvbGljeVBhcmFtZXRlck1nci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldkRlc2MsIHN0YXRlKTsKKwogICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldkRlc2MtPnR5cGUoKSkpIHsKICAgICAgICAgcmV0dXJuIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldEF2YWlsYWJsZU91dHB1dERldmljZXMoCi0gICAgICAgICAgICAgICAgICAgIG1BcG1PYnNlcnZlci0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpLnR5cGVzKCkpOworICAgICAgICAgICAgICAgICAgICBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCkudHlwZXMoKSk7CiAgICAgfSBlbHNlIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2RGVzYy0+dHlwZSgpKSkgewogICAgICAgICByZXR1cm4gbVBvbGljeVBhcmFtZXRlck1nci0+c2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKAotICAgICAgICAgICAgICAgICAgICBtQXBtT2JzZXJ2ZXItPmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpLnR5cGVzKCkpOworICAgICAgICAgICAgICAgICAgICBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKS50eXBlcygpKTsKICAgICB9CiAgICAgcmV0dXJuIEJBRF9UWVBFOwogfQogCitzdGF0dXNfdCBFbmdpbmU6OmxvYWRBdWRpb1BvbGljeUVuZ2luZUNvbmZpZygpCit7CisgICAgYXV0byByZXN1bHQgPSBFbmdpbmVCYXNlOjpsb2FkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWcoKTsKKworICAgIC8vIEN1c3RvbSBYTUwgUGFyc2luZworICAgIGF1dG8gbG9hZENyaXRlcmlhPSBbdGhpc10oY29uc3QgYXV0byYgY29uZmlnQ3JpdGVyaWEsIGNvbnN0IGF1dG8mIGNvbmZpZ0NyaXRlcmlvblR5cGVzKSB7CisgICAgICAgIGZvciAoYXV0byYgY3JpdGVyaW9uIDogY29uZmlnQ3JpdGVyaWEpIHsKKyAgICAgICAgICAgIGVuZ2luZUNvbmZpZzo6Q3JpdGVyaW9uVHlwZSBjcml0ZXJpb25UeXBlOworICAgICAgICAgICAgZm9yIChhdXRvICZjb25maWdDcml0ZXJpb25UeXBlIDogY29uZmlnQ3JpdGVyaW9uVHlwZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29uZmlnQ3JpdGVyaW9uVHlwZS5uYW1lID09IGNyaXRlcmlvbi50eXBlTmFtZSkgeworICAgICAgICAgICAgICAgICAgICBjcml0ZXJpb25UeXBlID0gY29uZmlnQ3JpdGVyaW9uVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR19BU1NFUlQobm90IGNyaXRlcmlvblR5cGUubmFtZS5lbXB0eSgpLCAiSW52YWxpZCBjcml0ZXJpb24gdHlwZSBmb3IgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uLm5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBtUG9saWN5UGFyYW1ldGVyTWdyLT5hZGRDcml0ZXJpb24oY3JpdGVyaW9uLm5hbWUsIGNyaXRlcmlvblR5cGUuaXNJbmNsdXNpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uVHlwZS52YWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvbi5kZWZhdWx0TGl0ZXJhbFZhbHVlKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBsb2FkQ3JpdGVyaWEocmVzdWx0LnBhcnNlZENvbmZpZy0+Y3JpdGVyaWEsIHJlc3VsdC5wYXJzZWRDb25maWctPmNyaXRlcmlvblR5cGVzKTsKKyAgICByZXR1cm4gcmVzdWx0Lm5iU2tpcHBlZEVsZW1lbnQgPT0gMD8gTk9fRVJST1IgOiBCQURfVkFMVUU7Cit9CisKK0RldmljZVZlY3RvciBFbmdpbmU6OmdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdAoreworICAgIGNvbnN0IGF1dG8gcHJvZHVjdFN0cmF0ZWdpZXMgPSBnZXRQcm9kdWN0U3RyYXRlZ2llcygpOworICAgIGlmIChwcm9kdWN0U3RyYXRlZ2llcy5maW5kKHBzKSA9PSBwcm9kdWN0U3RyYXRlZ2llcy5lbmQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyeWluZyB0byBnZXQgZGV2aWNlIG9uIGludmFsaWQgc3RyYXRlZ3kgJWQiLCBfX0ZVTkNUSU9OX18sIHBzKTsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKyAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7CisgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRPdXRwdXRzKCk7CisgICAgdWludDMyX3QgYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7CisKKyAgICAvKiogVGhpcyBpcyB0aGUgb25seSBjYXNlIGhhbmRsZWQgcHJvZ3JhbW1hdGljYWxseSBiZWNhdXNlIHRoZSBQRlcgaXMgdW5hYmxlIHRvIGtub3cgdGhlCisgICAgICogYWN0aXZpdHkgb2Ygc3RyZWFtcy4KKyAgICAgKgorICAgICAqIC1XaGlsZSBtZWRpYSBpcyBwbGF5aW5nIG9uIGEgcmVtb3RlIGRldmljZSwgdXNlIHRoZSB0aGUgc29uaWZpY2F0aW9uIGJlaGF2aW9yLgorICAgICAqIE5vdGUgdGhhdCB3ZSB0ZXN0IHRoaXMgdXNlY2FzZSBiZWZvcmUgdGVzdGluZyBpZiBtZWRpYSBpcyBwbGF5aW5nIGJlY2F1c2UKKyAgICAgKiB0aGUgaXNTdHJlYW1BY3RpdmUoKSBtZXRob2Qgb25seSBpbmZvcm1zIGFib3V0IHRoZSBhY3Rpdml0eSBvZiBhIHN0cmVhbSwgbm90CisgICAgICogaWYgaXQncyBmb3IgbG9jYWwgcGxheWJhY2suIE5vdGUgYWxzbyB0aGF0IHdlIHVzZSB0aGUgc2FtZSBkZWxheSBiZXR3ZWVuIGJvdGggdGVzdHMKKyAgICAgKgorICAgICAqIC1XaGVuIG1lZGlhIGlzIG5vdCBwbGF5aW5nIGFueW1vcmUsIGZhbGwgYmFjayBvbiB0aGUgc29uaWZpY2F0aW9uIGJlaGF2aW9yCisgICAgICovCisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBpZiAocHMgPT0gZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04pICYmCisgICAgICAgICAgICAhaXNfc3RhdGVfaW5fY2FsbChnZXRQaG9uZVN0YXRlKCkpICYmCisgICAgICAgICAgICAhb3V0cHV0cy5pc0FjdGl2ZVJlbW90ZWx5KHN0cmVhbVRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9NVVNJQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSAmJgorICAgICAgICAgICAgb3V0cHV0cy5pc0FjdGl2ZShzdHJlYW1Ub1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTVVTSUMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkpIHsKKyAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5Rm9yTWVkaWEgPQorICAgICAgICAgICAgICAgIGdldFByb2R1Y3RTdHJhdGVneUZvclN0cmVhbShBVURJT19TVFJFQU1fTVVTSUMpOworICAgICAgICBkZXZpY2VzID0gcHJvZHVjdFN0cmF0ZWdpZXMuZ2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3lGb3JNZWRpYSk7CisgICAgfSBlbHNlIGlmIChwcyA9PSBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JTdHJlYW0oQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpICYmCisgICAgICAgIChvdXRwdXRzLmlzQWN0aXZlKHN0cmVhbVRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9SSU5HKSkgfHwKKyAgICAgICAgIG91dHB1dHMuaXNBY3RpdmUoc3RyZWFtVG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0FMQVJNKSkpKSB7CisgICAgICAgICAgICAvLyBkbyBub3Qgcm91dGUgYWNjZXNzaWJpbGl0eSBwcm9tcHRzIHRvIGEgZGlnaXRhbCBvdXRwdXQgY3VycmVudGx5IGNvbmZpZ3VyZWQgd2l0aCBhCisgICAgICAgICAgICAvLyBjb21wcmVzc2VkIGZvcm1hdCBhcyB0aGV5IHdvdWxkIGxpa2VseSBub3QgYmUgbWl4ZWQgYW5kIGRyb3BwZWQuCisgICAgICAgICAgICAvLyBEZXZpY2UgRm9yIFNvbmlmaWNhdGlvbiBjb25mIGZpbGUgaGFzIEhETUksIFNQRElGIGFuZCBIRE1JIEFSQyB1bnJlYWNoZWFibGUuCisgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneU5vdGlmaWNhdGlvbiA9IGdldFByb2R1Y3RTdHJhdGVneUZvclN0cmVhbShBVURJT19TVFJFQU1fUklORyk7CisgICAgICAgIGRldmljZXMgPSBwcm9kdWN0U3RyYXRlZ2llcy5nZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneU5vdGlmaWNhdGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGV2aWNlcyA9IHByb2R1Y3RTdHJhdGVnaWVzLmdldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHBzKTsKKyAgICB9CisgICAgaWYgKGRldmljZXMgPT0gQVVESU9fREVWSUNFX05PTkUgfHwKKyAgICAgICAgICAgIChkZXZpY2VzICYgYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUpID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIGRldmljZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCktPnR5cGUoKTsKKyAgICAgICAgQUxPR0VfSUYoZGV2aWNlcyA9PSBBVURJT19ERVZJQ0VfTk9ORSwgIiVzOiBubyB2YWxpZCBkZWZhdWx0IGRldmljZSBkZWZpbmVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcihnZXRBcG1PYnNlcnZlcigpLT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkpOworICAgIH0KKyAgICBpZiAoLypkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZXMpKi8gZGV2aWNlcyA9PSBBVURJT19ERVZJQ0VfT1VUX0JVUykgeworICAgICAgICAvLyBXZSBkbyBleHBlY3Qgb25seSBvbmUgZGV2aWNlIGZvciB0aGVzZSB0eXBlcyBvZiBkZXZpY2VzCisgICAgICAgIC8vIENyaXRlcmlvbiBkZXZpY2UgYWRkcmVzcyBnYXJhbnRlZSB0aGlzIG9uZSBpcyBhdmFpbGFibGUKKyAgICAgICAgLy8gSWYgdGhpcyBjcml0ZXJpb24gaXMgbm90IHdpc2hlZCwgbmVlZCB0byBlbnN1cmUgdGhpcyBkZXZpY2UgaXMgYXZhaWxhYmxlCisgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcyhwcm9kdWN0U3RyYXRlZ2llcy5nZXREZXZpY2VBZGRyZXNzRm9yUHJvZHVjdFN0cmF0ZWd5KHBzKS5jX3N0cigpKTsKKyAgICAgICAgQUxPR1YoIiVzOmRldmljZSAweCV4ICVzICVkIiwgX19GVU5DVElPTl9fLCBkZXZpY2VzLCBhZGRyZXNzLmNfc3RyKCksIHBzKTsKKyAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcihhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpKTsKKyAgICB9CisgICAgQUxPR1YoIiVzOmRldmljZSAweCV4ICVkIiwgX19GVU5DVElPTl9fLCBkZXZpY2VzLCBwcyk7CisgICAgcmV0dXJuIGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhkZXZpY2VzKTsKK30KKworRGV2aWNlVmVjdG9yIEVuZ2luZTo6Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnByZWZlcnJlZERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKSBjb25zdAoreworICAgIC8vIEZpcnN0IGNoZWNrIGZvciBleHBsaWN0IHJvdXRpbmcgZGV2aWNlCisgICAgaWYgKHByZWZlcnJlZERldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCIlcyBleHBsaWNpdCBSb3V0aW5nIG9uIGRldmljZSAlcyIsIF9fZnVuY19fLCBwcmVmZXJyZWREZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IocHJlZmVycmVkRGV2aWNlKTsKKyAgICB9CisgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5ID0gZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7CisgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRPdXRwdXRzKCk7CisgICAgLy8KKyAgICAvLyBAVE9ETzogd2hhdCBpcyB0aGUgcHJpb3JpdHkgb2YgZXhwbGljaXQgcm91dGluZz8gU2hhbGwgaXQgYmUgY29uc2lkZXJlZCBmaXJzdCBhcyBpdCB1c2VkIHRvCisgICAgLy8gYmUgYnkgQVBNPworICAgIC8vCisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIGFsbCBhY3RpdmUgY2xpZW50cyBoYXZlIGEgcHJlZmVycmVkIHJvdXRlIGluIHdoaWNoCisgICAgLy8gY2FzZSB0aGUgbGFzdCBhY3RpdmUgY2xpZW50IHJvdXRlIGlzIHVzZWQKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBmaW5kUHJlZmVycmVkRGV2aWNlKG91dHB1dHMsIHN0cmF0ZWd5LCBhdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKKyAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcihkZXZpY2UpOworICAgIH0KKworICAgIHJldHVybiBmcm9tQ2FjaGU/IG1EZXZpY2VzRm9yU3RyYXRlZ2llcy5hdChzdHJhdGVneSkgOiBnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5KTsKK30KKworRGV2aWNlVmVjdG9yIEVuZ2luZTo6Z2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBmcm9tQ2FjaGUpIGNvbnN0Cit7CisgICAgYXV0byBhdHRyaWJ1dGVzID0gRW5naW5lQmFzZTo6Z2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoc3RyZWFtKTsKKyAgICByZXR1cm4gZ2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgbnVsbHB0ciwgZnJvbUNhY2hlKTsKK30KKworc3A8RGV2aWNlRGVzY3JpcHRvcj4gRW5naW5lOjpnZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+ICptaXgpIGNvbnN0Cit7CisgICAgY29uc3QgYXV0byAmcG9saWN5TWl4ZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdWRpb1BvbGljeU1peENvbGxlY3Rpb24oKTsKKyAgICBjb25zdCBhdXRvICZhdmFpbGFibGVJbnB1dERldmljZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKTsKKyAgICBjb25zdCBhdXRvICZpbnB1dHMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRJbnB1dHMoKTsKKyAgICBzdGQ6OnN0cmluZyBhZGRyZXNzOworICAgIC8vCisgICAgLy8gRXhwbGljaXQgUm91dGluZyA/Pz8gd2hhdCBpcyB0aGUgcHJpb3JpdHkgb2YgZXhwbGljaXQgcm91dGluZz8gU2hhbGwgaXQgYmUgY29uc2lkZXJlZAorICAgIC8vIGZpcnN0IGFzIGl0IHVzZWQgdG8gYmUgYnkgQVBNPworICAgIC8vCisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIGFsbCBhY3RpdmUgY2xpZW50cyBoYXZlIGEgcHJlZmVycmVkIHJvdXRlIGluIHdoaWNoCisgICAgLy8gY2FzZSB0aGUgbGFzdCBhY3RpdmUgY2xpZW50IHJvdXRlIGlzIHVzZWQKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQorICAgICAgICAgICAgZmluZFByZWZlcnJlZERldmljZShpbnB1dHMsIGF0dHIuc291cmNlLCBhdmFpbGFibGVJbnB1dERldmljZXMpOworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZGV2aWNlOworICAgIH0KKworICAgIGRldmljZSA9IHBvbGljeU1peGVzLmdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGF0dHIuc291cmNlLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG1peCk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBkZXZpY2U7CisgICAgfQorCisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSBnZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIGF1ZGlvX3NvdXJjZV90PihhdHRyLnNvdXJjZSk7CisKKyAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoZGV2aWNlVHlwZSkpIHsKKyAgICAgICAgYWRkcmVzcyA9ICIwIjsKKyAgICAgICAgc3RkOjpzaXplX3QgcG9zOworICAgICAgICBzdGQ6OnN0cmluZyB0YWdzIHsgYXR0ci50YWdzIH07CisgICAgICAgIGlmICgocG9zID0gdGFncy5maW5kKCJhZGRyPSIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgYWRkcmVzcyA9IHRhZ3Muc3Vic3RyKHBvcyArIHN0ZDo6c3RybGVuKCJhZGRyPSIpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZShkZXZpY2VUeXBlLCBTdHJpbmc4KGFkZHJlc3MuY19zdHIoKSksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKK30KKwordm9pZCBFbmdpbmU6OnVwZGF0ZURldmljZVNlbGVjdGlvbkNhY2hlKCkKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBnZXRQcm9kdWN0U3RyYXRlZ2llcygpKSB7CisgICAgICAgIGNvbnN0IGF1dG8gJnN0cmF0ZWd5ID0gaXRlci5zZWNvbmQ7CisgICAgICAgIG1EZXZpY2VzRm9yU3RyYXRlZ2llc1tzdHJhdGVneS0+Z2V0SWQoKV0gPSBnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5LT5nZXRJZCgpKTsKKyAgICB9Cit9CisKK3ZvaWQgRW5naW5lOjpzZXREZXZpY2VBZGRyZXNzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKQoreworICAgIGlmIChnZXRQcm9kdWN0U3RyYXRlZ2llcygpLmZpbmQoc3RyYXRlZ3kpID09IGdldFByb2R1Y3RTdHJhdGVnaWVzKCkuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcnlpbmcgdG8gc2V0IGFkZHJlc3MgJXMgb24gaW52YWxpZCBzdHJhdGVneSAlZCIsIF9fRlVOQ1RJT05fXywgYWRkcmVzcy5jX3N0cigpLAorICAgICAgICAgICAgICBzdHJhdGVneSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKS5hdChzdHJhdGVneSktPnNldERldmljZUFkZHJlc3MoYWRkcmVzcyk7Cit9CisKK2Jvb2wgRW5naW5lOjpzZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQoreworICAgIGlmIChnZXRQcm9kdWN0U3RyYXRlZ2llcygpLmZpbmQoc3RyYXRlZ3kpID09IGdldFByb2R1Y3RTdHJhdGVnaWVzKCkuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzZXQgZGV2aWNlICVkIG9uIGludmFsaWQgc3RyYXRlZ3kgJWQiLCBfX0ZVTkNUSU9OX18sIGRldmljZXMsIHN0cmF0ZWd5KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBnZXRQcm9kdWN0U3RyYXRlZ2llcygpLmF0KHN0cmF0ZWd5KS0+c2V0RGV2aWNlVHlwZXMoZGV2aWNlcyk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKIHRlbXBsYXRlIDw+CiBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UgKkVuZ2luZTo6cXVlcnlJbnRlcmZhY2UoKQogewotICAgIHJldHVybiAmbU1hbmFnZXJJbnRlcmZhY2U7CisgICAgcmV0dXJuIHRoaXM7CiB9CiAKIHRlbXBsYXRlIDw+CiBBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZSAqRW5naW5lOjpxdWVyeUludGVyZmFjZSgpCiB7Ci0gICAgcmV0dXJuICZtUGx1Z2luSW50ZXJmYWNlOworICAgIHJldHVybiB0aGlzOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oCmluZGV4IDMyOGQyM2QuLjQ2NjJlN2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuaApAQCAtMTYsMjIgKzE2LDIwIEBACiAKICNwcmFnbWEgb25jZQogCi0KKyNpbmNsdWRlICJFbmdpbmVCYXNlLmgiCiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaD4KICNpbmNsdWRlICJDb2xsZWN0aW9uLmgiCiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17CituYW1lc3BhY2UgYW5kcm9pZCB7CiBjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlcjsKIAotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CiAKIGNsYXNzIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOwogY2xhc3MgVm9sdW1lUHJvZmlsZTsKIAotY2xhc3MgRW5naW5lCitjbGFzcyBFbmdpbmUgOiBwdWJsaWMgRW5naW5lQmFzZSwgQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UKIHsKIHB1YmxpYzoKICAgICBFbmdpbmUoKTsKQEAgLTQwLDEzMiArMzgsNjkgQEAKICAgICB0ZW1wbGF0ZSA8Y2xhc3MgUmVxdWVzdGVkSW50ZXJmYWNlPgogICAgIFJlcXVlc3RlZEludGVyZmFjZSAqcXVlcnlJbnRlcmZhY2UoKTsKIAotcHJpdmF0ZToKLSAgICAvLy8gSW50ZXJmYWNlIG1lbWJlcnMKLSAgICBjbGFzcyBNYW5hZ2VySW50ZXJmYWNlSW1wbCA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UKKyAgICAvLy8KKyAgICAvLy8gZnJvbSBFbmdpbmVCYXNlCisgICAgLy8vCisgICAgYW5kcm9pZDo6c3RhdHVzX3QgaW5pdENoZWNrKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKSBvdmVycmlkZTsKKworICAgIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKSBvdmVycmlkZTsKKworICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdCBvdmVycmlkZTsKKworICAgIGFuZHJvaWQ6OnN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpIG92ZXJyaWRlOworCisgICAgRGV2aWNlVmVjdG9yIGdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnByZWZlcmVkRGV2aWNlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUgPSBmYWxzZSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBEZXZpY2VWZWN0b3IgZ2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSA9IGZhbHNlKSBjb25zdCBvdmVycmlkZTsKKworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgc3A8QXVkaW9Qb2xpY3lNaXg+ICptaXggPSBudWxscHRyKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZvaWQgdXBkYXRlRGV2aWNlU2VsZWN0aW9uQ2FjaGUoKSBvdmVycmlkZTsKKworICAgIC8vLworICAgIC8vLyBmcm9tIEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlCisgICAgLy8vCisgICAgc3RhdHVzX3QgYWRkU3RyZWFtKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgb3ZlcnJpZGUKICAgICB7Ci0gICAgcHVibGljOgotICAgICAgICBNYW5hZ2VySW50ZXJmYWNlSW1wbChFbmdpbmUgKnBvbGljeUVuZ2luZSkKLSAgICAgICAgICAgIDogbVBvbGljeUVuZ2luZShwb2xpY3lFbmdpbmUpIHt9Ci0KLSAgICAgICAgdmlydHVhbCBhbmRyb2lkOjpzdGF0dXNfdCBpbml0Q2hlY2soKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+aW5pdENoZWNrKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCB2b2lkIHNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcikKLSAgICAgICAgewotICAgICAgICAgICAgbVBvbGljeUVuZ2luZS0+c2V0T2JzZXJ2ZXIob2JzZXJ2ZXIpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCBhdWRpb19zb3VyY2VfdD4oaW5wdXRTb3VyY2UpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RhdGVneSkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFByb3BlcnR5Rm9yS2V5PHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldFBob25lU3RhdGUobW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQaG9uZVN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0Rm9yY2VVc2UodXNhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZEZXNjLCBzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIEVuZ2luZSAqbVBvbGljeUVuZ2luZTsKLSAgICB9IG1NYW5hZ2VySW50ZXJmYWNlOwotCi0gICAgY2xhc3MgUGx1Z2luSW50ZXJmYWNlSW1wbCA6IHB1YmxpYyBBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZQorICAgICAgICByZXR1cm4gYWRkPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KG5hbWUsIHN0cmVhbSk7CisgICAgfQorICAgIHN0YXR1c190IGFkZElucHV0U291cmNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb19zb3VyY2VfdCBzb3VyY2UpIG92ZXJyaWRlCiAgICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgUGx1Z2luSW50ZXJmYWNlSW1wbChFbmdpbmUgKnBvbGljeUVuZ2luZSkKLSAgICAgICAgICAgIDogbVBvbGljeUVuZ2luZShwb2xpY3lFbmdpbmUpIHt9CisgICAgICAgIHJldHVybiBhZGQ8YXVkaW9fc291cmNlX3Q+KG5hbWUsIHNvdXJjZSk7CisgICAgfQorICAgIGJvb2wgc2V0Vm9sdW1lUHJvZmlsZUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnZvbHVtZVByb2ZpbGUpIG92ZXJyaWRlOwogCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyYXRlZ3koY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5hZGQ8cm91dGluZ19zdHJhdGVneT4obmFtZSwgc3RyYXRlZ3kpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyZWFtKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmFkZDxhdWRpb19zdHJlYW1fdHlwZV90PihuYW1lLCBzdHJlYW0pOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkVXNhZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3VzYWdlX3QgdXNhZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5hZGQ8YXVkaW9fdXNhZ2VfdD4obmFtZSwgdXNhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkSW5wdXRTb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmFkZDxhdWRpb19zb3VyY2VfdD4obmFtZSwgc291cmNlKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2V0RGV2aWNlRm9yU3RyYXRlZ3koY29uc3Qgcm91dGluZ19zdHJhdGVneSAmc3RyYXRlZ3ksIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCByb3V0aW5nX3N0cmF0ZWd5PihkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3kpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBzZXRTdHJhdGVneUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0UHJvcGVydHlGb3JLZXk8cm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lUHJvZmlsZUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnZvbHVtZVByb2ZpbGUpOworICAgIGJvb2wgc2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoY29uc3QgYXVkaW9fc291cmNlX3QgJmlucHV0U291cmNlLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX2RldmljZXNfdCwgYXVkaW9fc291cmNlX3Q+KGRldmljZSwgaW5wdXRTb3VyY2UpOworICAgIH0KKyAgICB2b2lkIHNldERldmljZUFkZHJlc3NGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKSBvdmVycmlkZTsKIAotICAgICAgICB2aXJ0dWFsIGJvb2wgc2V0U3RyYXRlZ3lGb3JVc2FnZShjb25zdCBhdWRpb191c2FnZV90ICZ1c2FnZSwgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldFByb3BlcnR5Rm9yS2V5PHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3VzYWdlX3Q+KHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoY29uc3QgYXVkaW9fc291cmNlX3QgJmlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX2RldmljZXNfdCwgYXVkaW9fc291cmNlX3Q+KGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFNvdXJjZSk7Ci0gICAgICAgIH0KKyAgICBib29sIHNldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMpIG92ZXJyaWRlOwogCi0gICAgcHJpdmF0ZToKLSAgICAgICAgRW5naW5lICptUG9saWN5RW5naW5lOwotICAgIH0gbVBsdWdpbkludGVyZmFjZTsKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0UHJvZHVjdFN0cmF0ZWd5QnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgcmV0dXJuIEVuZ2luZUJhc2U6OmdldFByb2R1Y3RTdHJhdGVneUJ5TmFtZShuYW1lKTsKKyAgICB9CiAKIHByaXZhdGU6CiAgICAgLyogQ29weSBmYWNpbGl0aWVzIGFyZSBwdXQgcHJpdmF0ZSB0byBkaXNhYmxlIGNvcHkuICovCiAgICAgRW5naW5lKGNvbnN0IEVuZ2luZSAmb2JqZWN0KTsKICAgICBFbmdpbmUgJm9wZXJhdG9yPShjb25zdCBFbmdpbmUgJm9iamVjdCk7CiAKLSAgICB2b2lkIHNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcik7Ci0KLSAgICBib29sIHNldFZvbHVtZVByb2ZpbGVGb3JTdHJlYW0oY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnRzICZwb2ludHMpOwotCi0gICAgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0gICAgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSk7Ci0gICAgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSBjb25zdDsKLSAgICBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKLSAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3Q7Ci0gICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSk7Ci0gICAgU3RyYXRlZ3lDb2xsZWN0aW9uIG1TdHJhdGVneUNvbGxlY3Rpb247IC8qKjwgU3RyYXRlZ2llcyBpbmRleGVkIGJ5IHRoZWlyIGVudW0gaWQuICovCiAgICAgU3RyZWFtQ29sbGVjdGlvbiBtU3RyZWFtQ29sbGVjdGlvbjsgLyoqPCBTdHJlYW1zIGluZGV4ZWQgYnkgdGhlaXIgZW51bSBpZC4gICovCi0gICAgVXNhZ2VDb2xsZWN0aW9uIG1Vc2FnZUNvbGxlY3Rpb247IC8qKjwgVXNhZ2VzIGluZGV4ZWQgYnkgdGhlaXIgZW51bSBpZC4gKi8KICAgICBJbnB1dFNvdXJjZUNvbGxlY3Rpb24gbUlucHV0U291cmNlQ29sbGVjdGlvbjsgLyoqPCBJbnB1dCBzb3VyY2VzIGluZGV4ZWQgYnkgdGhlaXIgZW51bSBpZC4gKi8KIAogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXk+CkBAIC0xODYsMTIgKzEyMSwxNiBAQAogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eSwgdHlwZW5hbWUgS2V5PgogICAgIGJvb2wgc2V0UHJvcGVydHlGb3JLZXkoY29uc3QgUHJvcGVydHkgJnByb3BlcnR5LCBjb25zdCBLZXkgJmtleSk7CiAKKyAgICBzdGF0dXNfdCBsb2FkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWcoKTsKKworICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgY29uc3Q7CisKICAgICAvKioKICAgICAgKiBQb2xpY3kgUGFyYW1ldGVyIE1hbmFnZXIgaGlkZGVuIHRocm91Z2ggYSB3cmFwcGVyLgogICAgICAqLwogICAgIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyICptUG9saWN5UGFyYW1ldGVyTWdyOwogCi0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm1BcG1PYnNlcnZlcjsKKyAgICBEZXZpY2VTdHJhdGVneU1hcCBtRGV2aWNlc0ZvclN0cmF0ZWdpZXM7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lSW5zdGFuY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmVJbnN0YW5jZS5jcHAKaW5kZXggOWFhODliMi4uMjQ0MjU5MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmVJbnN0YW5jZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmVJbnN0YW5jZS5jcHAKQEAgLTIxLDEwICsyMSw4IEBACiAKIHVzaW5nIHN0ZDo6c3RyaW5nOwogCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CiAKIEVuZ2luZUluc3RhbmNlOjpFbmdpbmVJbnN0YW5jZSgpCiB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuY3BwCmluZGV4IGFlMzlmZWYuLmQyNTJkM2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuY3BwCkBAIC0yMCwxMyArMjAsMTMgQEAKIAogdXNpbmcgc3RkOjpzdHJpbmc7CiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKKwogc3RhdHVzX3QgRWxlbWVudDxhdWRpb19zb3VyY2VfdD46OnNldElkZW50aWZpZXIoYXVkaW9fc291cmNlX3QgaWRlbnRpZmllcikKIHsKLSAgICBpZiAoaWRlbnRpZmllciA+IEFVRElPX1NPVVJDRV9NQVggJiYgaWRlbnRpZmllciAhPSBBVURJT19TT1VSQ0VfSE9UV09SRCkgeworICAgIGlmIChpZGVudGlmaWVyID4gQVVESU9fU09VUkNFX01BWCAmJiBpZGVudGlmaWVyICE9IEFVRElPX1NPVVJDRV9IT1RXT1JECisgICAgICAgICYmIGlkZW50aWZpZXIgIT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSICYmIGlkZW50aWZpZXIgIT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIG1JZGVudGlmaWVyID0gaWRlbnRpZmllcjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuaAppbmRleCA2YzQ5OGRjLi5lMTg2NWNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5oCkBAIC0xOCwxMCArMTgsOCBAQAogCiAjaW5jbHVkZSAiRWxlbWVudC5oIgogCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CiAKIC8qKgogICogU3BlY2lhbGl6YXRpb24gb2YgcG9saWN5IGJhc2UgY2xhc3MgZWxlbWVudCBmb3IgYXVkaW9fc291cmNlX3QKQEAgLTYxLDcgKzU5LDcgQEAKIAogICAgIC8qKgogICAgICAqIEEgUG9saWN5IGVsZW1lbnQgbWF5IGltcGxlbWVudCBnZXR0ZXIvc2V0dGVyIGZ1bmN0aW9uIGZvciBhIGdpdmVuIHByb3BlcnR5LgotICAgICAqIFByb3BlcnR5IG1heSBiZSByb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAorICAgICAqIFByb3BlcnR5IG1heSBiZSBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAogICAgICAqIG9yIGEgc3RyaW5nLgogICAgICAqLwogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyYXRlZ3kuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Mzk5MTQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUG9saWN5RW5naW5lL1N0cmF0ZWd5IgotCi0jaW5jbHVkZSAiU3RyYXRlZ3kuaCIKLQotdXNpbmcgc3RkOjpzdHJpbmc7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17Ci0KLXN0YXR1c190IEVsZW1lbnQ8cm91dGluZ19zdHJhdGVneT46OnNldElkZW50aWZpZXIocm91dGluZ19zdHJhdGVneSBpZGVudGlmaWVyKQotewotICAgIGlmIChpZGVudGlmaWVyID49IE5VTV9TVFJBVEVHSUVTKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIG1JZGVudGlmaWVyID0gaWRlbnRpZmllcjsKLSAgICBBTE9HRCgiJXM6IFN0cmF0ZWd5ICVzIGlkZW50aWZpZXIgMHglWCIsIF9fRlVOQ1RJT05fXywgZ2V0TmFtZSgpLmNfc3RyKCksIGlkZW50aWZpZXIpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIGRldmljZSBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kuCi0gKiBJdCBjaGVja3MgaWYgdGhlIG91dHB1dCBkZXZpY2UgaXMgdmFsaWQuCi0gKgotICogQHBhcmFtW2luXSBkZXZpY2VzIHNlbGVjdGVkIGZvciB0aGUgZ2l2ZW4gc3RyYXRlZ3kuCi0gKgotICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgZGV2aWNlIGlzIGVpdGhlciB2YWxpZCBvciBub25lLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KLSAqLwotdGVtcGxhdGUgPD4KLXN0YXR1c190IEVsZW1lbnQ8cm91dGluZ19zdHJhdGVneT46OnNldDxhdWRpb19kZXZpY2VzX3Q+KGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQotewotICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZXMoZGV2aWNlcykgfHwgZGV2aWNlcyA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICBBTE9HRSgiJXM6IHRyeWluZyB0byBzZXQgYW4gaW52YWxpZCBkZXZpY2UgMHglWCBmb3Igc3RyYXRlZ3kgJXMiLAotICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZXMsIGdldE5hbWUoKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgQUxPR0QoIiVzOiAweCVYIGZvciBzdHJhdGVneSAlcyIsIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgZ2V0TmFtZSgpLmNfc3RyKCkpOwotICAgIG1BcHBsaWNhYmxlRGV2aWNlcyA9IGRldmljZXM7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi10ZW1wbGF0ZSA8PgotYXVkaW9fZGV2aWNlc190IEVsZW1lbnQ8cm91dGluZ19zdHJhdGVneT46OmdldDxhdWRpb19kZXZpY2VzX3Q+KCkgY29uc3QKLXsKLSAgICBBTE9HVigiJXM6IDB4JVggZm9yIHN0cmF0ZWd5ICVzIiwgX19GVU5DVElPTl9fLCBtQXBwbGljYWJsZURldmljZXMsIGdldE5hbWUoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gbUFwcGxpY2FibGVEZXZpY2VzOwotfQotCi19IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU3ZDU1Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyYXRlZ3kuaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkVsZW1lbnQuaCIKLSNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKLQotLyoqCi0gKiBAdHBhcmFtIGF1ZGlvX2RldmljZXNfdDogQXBwbGljYWJsZSBvdXRwdXQgZGV2aWNlKHMpIGZvciB0aGlzIHN0cmF0ZWd5LgotICovCi10ZW1wbGF0ZSA8PgotY2xhc3MgRWxlbWVudDxyb3V0aW5nX3N0cmF0ZWd5PgotewotcHVibGljOgotICAgIEVsZW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCi0gICAgICAgIDogbU5hbWUobmFtZSksCi0gICAgICAgICAgbUFwcGxpY2FibGVEZXZpY2VzKEFVRElPX0RFVklDRV9OT05FKQotICAgIHt9Ci0gICAgfkVsZW1lbnQoKSB7fQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZGVudGlmaWVyIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQKLSAgICAgKgotICAgICAqIEByZXR1cm5zIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhpcyBwb2xpY3kgZWxlbWVudAotICAgICAqLwotICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBwb2xpY3kgZWxlbWVudC4KLSAgICAqCi0gICAgKiBAdHBhcmFtIEtleSB0eXBlIG9mIHRoZSB1bmlxdWUgaWRlbnRpZmllci4KLSAgICAqIEBwYXJhbVtpbl0gaWRlbnRpZmllciB0byBiZSBzZXQuCi0gICAgKgotICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgaWRlbnRpZmllciBpcyB2YWxpZCBhbmQgc2V0IGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCi0gICAgKi8KLSAgICBzdGF0dXNfdCBzZXRJZGVudGlmaWVyKHJvdXRpbmdfc3RyYXRlZ3kgaWRlbnRpZmllcik7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGlzIHBvbGljeSBlbGVtZW50LgotICAgICAqLwotICAgIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0SWRlbnRpZmllcigpIGNvbnN0IHsgcmV0dXJuIG1JZGVudGlmaWVyOyB9Ci0KLSAgICAvKioKLSAgICAgKiBBIFBvbGljeSBlbGVtZW50IG1heSBpbXBsZW1lbnQgZ2V0dGVyL3NldHRlciBmdW5jdGlvbiBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KLSAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgcm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKLSAgICAgKiBvciBhIHN0cmluZy4KLSAgICAgKi8KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHk+Ci0gICAgUHJvcGVydHkgZ2V0KCkgY29uc3Q7Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHk+Ci0gICAgc3RhdHVzX3Qgc2V0KFByb3BlcnR5IHByb3BlcnR5KTsKLQotcHJpdmF0ZToKLSAgICAvKiBDb3B5IGZhY2lsaXRpZXMgYXJlIHB1dCBwcml2YXRlIHRvIGRpc2FibGUgY29weS4gKi8KLSAgICBFbGVtZW50KGNvbnN0IEVsZW1lbnQgJm9iamVjdCk7Ci0gICAgRWxlbWVudCAmb3BlcmF0b3I9KGNvbnN0IEVsZW1lbnQgJm9iamVjdCk7Ci0KLSAgICBzdGQ6OnN0cmluZyBtTmFtZTsgLyoqPCBVbmlxdWUgbGl0ZXJhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCi0gICAgcm91dGluZ19zdHJhdGVneSBtSWRlbnRpZmllcjsgLyoqPCBVbmlxdWUgbnVtZXJpY2FsIElkZW50aWZpZXIgb2YgYSBwb2xpY3kgYmFzZSBlbGVtZW50Ki8KLQotICAgIGF1ZGlvX2RldmljZXNfdCBtQXBwbGljYWJsZURldmljZXM7IC8qKjwgQXBwbGljYWJsZSBvdXRwdXQgZGV2aWNlKHMpIGZvciB0aGlzIHN0cmF0ZWd5LiAqLwotfTsKLQotdHlwZWRlZiBFbGVtZW50PHJvdXRpbmdfc3RyYXRlZ3k+IFN0cmF0ZWd5OwotCi19IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmVhbS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmVhbS5jcHAKaW5kZXggMGVkMzY0Zi4uMjk3ZWIwMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmNwcApAQCAtMjEsMTAgKzIxLDggQEAKIAogdXNpbmcgc3RkOjpzdHJpbmc7CiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKIAogc3RhdHVzX3QgRWxlbWVudDxhdWRpb19zdHJlYW1fdHlwZV90Pjo6c2V0SWRlbnRpZmllcihhdWRpb19zdHJlYW1fdHlwZV90IGlkZW50aWZpZXIpCiB7CkBAIC0zNiwzMiArMzQsNiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotLyoqCi0qIFNldCB0aGUgc3RyYXRlZ3kgdG8gZm9sbG93IGZvciB0aGlzIHN0cmVhbS4KLSogSXQgY2hlY2tzIGlmIHRoZSBzdHJhdGVneSBpcyB2YWxpZC4KLSoKLSogQHBhcmFtW2luXSBzdHJhdGVneSB0byBiZSBmb2xsb3dlZC4KLSoKLSogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgc3RyYXRlZ3kgaXMgc2V0IGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCi0qLwotdGVtcGxhdGUgPD4KLXN0YXR1c190IEVsZW1lbnQ8YXVkaW9fc3RyZWFtX3R5cGVfdD46OnNldDxyb3V0aW5nX3N0cmF0ZWd5Pihyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQotewotICAgIGlmIChzdHJhdGVneSA+PSBOVU1fU1RSQVRFR0lFUykgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBtQXBwbGljYWJsZVN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0gICAgQUxPR0QoIiVzOiAweCVYIGZvciBTdHJlYW0gJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmF0ZWd5LCBnZXROYW1lKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi10ZW1wbGF0ZSA8Pgotcm91dGluZ19zdHJhdGVneSBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+OjpnZXQ8cm91dGluZ19zdHJhdGVneT4oKSBjb25zdAotewotICAgIEFMT0dWKCIlczogMHglWCBmb3IgU3RyZWFtICVzIiwgX19GVU5DVElPTl9fLCBtQXBwbGljYWJsZVN0cmF0ZWd5LCBnZXROYW1lKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIG1BcHBsaWNhYmxlU3RyYXRlZ3k7Ci19Ci0KIHRlbXBsYXRlIDw+CiBzdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+OjpzZXQ8YXVkaW9fc3RyZWFtX3R5cGVfdD4oYXVkaW9fc3RyZWFtX3R5cGVfdCB2b2x1bWVQcm9maWxlKQogewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmgKaW5kZXggNjkwMjAwMy4uYTRmZGQzOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmVhbS5oCkBAIC0xOCwyMyArMTgsMjAgQEAKIAogI2luY2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJFbmdpbmVEZWZpbml0aW9uLmgiCi0jaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CiAjaW5jbHVkZSA8bWFwPgogCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CisKIC8qKgotICogQHRwYXJhbSByb3V0aW5nX3N0cmF0ZWd5OiBBcHBsaWNhYmxlIHN0cmF0ZWd5IGZvciB0aGlzIHN0cmVhbS4KKyAqIEB0cGFyYW0gcHJvZHVjdF9zdHJhdGVneV90OiBBcHBsaWNhYmxlIHN0cmF0ZWd5IGZvciB0aGlzIHN0cmVhbS4KICAqLwogdGVtcGxhdGUgPD4KIGNsYXNzIEVsZW1lbnQ8YXVkaW9fc3RyZWFtX3R5cGVfdD4KIHsKIHB1YmxpYzoKICAgICBFbGVtZW50KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKQotICAgICAgICA6IG1OYW1lKG5hbWUpLAotICAgICAgICAgIG1BcHBsaWNhYmxlU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEpCisgICAgICAgIDogbU5hbWUobmFtZSkKICAgICB7fQogICAgIH5FbGVtZW50KCkge30KIApAQCAtNjIsNyArNTksNyBAQAogCiAgICAgLyoqCiAgICAgICogQSBQb2xpY3kgZWxlbWVudCBtYXkgaW1wbGVtZW50IGdldHRlci9zZXR0ZXIgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCi0gICAgICogUHJvcGVydHkgbWF5IGJlIHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CisgICAgICogUHJvcGVydHkgbWF5IGJlICBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAogICAgICAqIG9yIGEgc3RyaW5nLgogICAgICAqLwogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KQEAgLTc5LDggKzc2LDYgQEAKICAgICBzdGQ6OnN0cmluZyBtTmFtZTsgLyoqPCBVbmlxdWUgbGl0ZXJhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtSWRlbnRpZmllcjsgLyoqPCBVbmlxdWUgbnVtZXJpY2FsIElkZW50aWZpZXIgb2YgYSBwb2xpY3kgYmFzZSBlbGVtZW50Ki8KIAotICAgIHJvdXRpbmdfc3RyYXRlZ3kgbUFwcGxpY2FibGVTdHJhdGVneTsgLyoqPCBBcHBsaWNhYmxlIHN0cmF0ZWd5IGZvciB0aGlzIHN0cmVhbS4gKi8KLQogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVZvbHVtZVByb2ZpbGU7IC8qKjwgVm9sdW1lIFByb2ZpbGUgZm9sbG93ZWQgYnkgdGhpcyBzdHJlYW0uICovCiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1VzYWdlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvVXNhZ2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDIwODI4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvVXNhZ2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZS9Vc2FnZSIKLQotI2luY2x1ZGUgIlVzYWdlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17Ci0KLXN0YXR1c190IEVsZW1lbnQ8YXVkaW9fdXNhZ2VfdD46OnNldElkZW50aWZpZXIoYXVkaW9fdXNhZ2VfdCBpZGVudGlmaWVyKQotewotICAgIGlmIChpZGVudGlmaWVyID4gQVVESU9fVVNBR0VfTUFYKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIG1JZGVudGlmaWVyID0gaWRlbnRpZmllcjsKLSAgICBBTE9HRCgiJXM6IFVzYWdlICVzIGhhcyBpZGVudGlmaWVyIDB4JVgiLCBfX0ZVTkNUSU9OX18sIGdldE5hbWUoKS5jX3N0cigpLCBpZGVudGlmaWVyKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXRlbXBsYXRlIDw+Ci1zdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3VzYWdlX3Q+OjpzZXQ8cm91dGluZ19zdHJhdGVneT4ocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKLXsKLSAgICBpZiAoc3RyYXRlZ3kgPj0gTlVNX1NUUkFURUdJRVMpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgQUxPR0QoIiVzOiAlZCBmb3IgVXNhZ2UgJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmF0ZWd5LCBnZXROYW1lKCkuY19zdHIoKSk7Ci0gICAgbUFwcGxpY2FibGVTdHJhdGVneSA9IHN0cmF0ZWd5OwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdGVtcGxhdGUgPD4KLXJvdXRpbmdfc3RyYXRlZ3kgRWxlbWVudDxhdWRpb191c2FnZV90Pjo6Z2V0PHJvdXRpbmdfc3RyYXRlZ3k+KCkgY29uc3QKLXsKLSAgICBBTE9HRCgiJXM6ICVkIGZvciBVc2FnZSAlcyIsIF9fRlVOQ1RJT05fXywgbUFwcGxpY2FibGVTdHJhdGVneSwgZ2V0TmFtZSgpLmNfc3RyKCkpOwotICAgIHJldHVybiBtQXBwbGljYWJsZVN0cmF0ZWd5OwotfQotCi19IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1VzYWdlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1VzYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OWUwZTAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Vc2FnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiRWxlbWVudC5oIgotI2luY2x1ZGUgPFJvdXRpbmdTdHJhdGVneS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQotewotCi0vKioKLSAqIEB0cGFyYW0gcm91dGluZ19zdHJhdGVneTogQXBwbGljYWJsZSBzdHJhdGVneSBmb3IgdGhpcyB1c2FnZS4KLSAqLwotdGVtcGxhdGUgPD4KLWNsYXNzIEVsZW1lbnQ8YXVkaW9fdXNhZ2VfdD4KLXsKLXB1YmxpYzoKLSAgICBFbGVtZW50KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKQotICAgICAgICA6IG1OYW1lKG5hbWUpLAotICAgICAgICAgIG1BcHBsaWNhYmxlU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEpCi0gICAge30KLSAgICB+RWxlbWVudCgpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlkZW50aWZpZXIgb2YgdGhpcyBwb2xpY3kgZWxlbWVudAotICAgICAqCi0gICAgICogQHJldHVybnMgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGlzIHBvbGljeSBlbGVtZW50Ci0gICAgICovCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHBvbGljeSBlbGVtZW50LgotICAgICoKLSAgICAqIEB0cGFyYW0gS2V5IHR5cGUgb2YgdGhlIHVuaXF1ZSBpZGVudGlmaWVyLgotICAgICogQHBhcmFtW2luXSBpZGVudGlmaWVyIHRvIGJlIHNldC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBpZGVudGlmaWVyIGlzIHZhbGlkIGFuZCBzZXQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KLSAgICAqLwotICAgIHN0YXR1c190IHNldElkZW50aWZpZXIoYXVkaW9fdXNhZ2VfdCBpZGVudGlmaWVyKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQuCi0gICAgICovCi0gICAgYXVkaW9fdXNhZ2VfdCBnZXRJZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gbUlkZW50aWZpZXI7IH0KLQotICAgIC8qKgotICAgICAqIEEgUG9saWN5IGVsZW1lbnQgbWF5IGltcGxlbWVudCBnZXR0ZXIvc2V0dGVyIGZ1bmN0aW9uIGZvciBhIGdpdmVuIHByb3BlcnR5LgotICAgICAqIFByb3BlcnR5IG1heSBiZSByb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAotICAgICAqIG9yIGEgc3RyaW5nLgotICAgICAqLwotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KLSAgICBQcm9wZXJ0eSBnZXQoKSBjb25zdDsKLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KLSAgICBzdGF0dXNfdCBzZXQoUHJvcGVydHkgcHJvcGVydHkpOwotCi1wcml2YXRlOgotICAgIC8qIENvcHkgZmFjaWxpdGllcyBhcmUgcHV0IHByaXZhdGUgdG8gZGlzYWJsZSBjb3B5LiAqLwotICAgIEVsZW1lbnQoY29uc3QgRWxlbWVudCAmb2JqZWN0KTsKLSAgICBFbGVtZW50ICZvcGVyYXRvcj0oY29uc3QgRWxlbWVudCAmb2JqZWN0KTsKLQotICAgIHN0ZDo6c3RyaW5nIG1OYW1lOyAvKio8IFVuaXF1ZSBsaXRlcmFsIElkZW50aWZpZXIgb2YgYSBwb2xpY3kgYmFzZSBlbGVtZW50Ki8KLSAgICBhdWRpb191c2FnZV90IG1JZGVudGlmaWVyOyAvKio8IFVuaXF1ZSBudW1lcmljYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLwotICAgIHJvdXRpbmdfc3RyYXRlZ3kgbUFwcGxpY2FibGVTdHJhdGVneTsgLyoqPCBBcHBsaWNhYmxlIHN0cmF0ZWd5IGZvciB0aGlzIHVzYWdlLiAqLwotfTsKLQotdHlwZWRlZiBFbGVtZW50PGF1ZGlvX3VzYWdlX3Q+IFVzYWdlOwotCi19IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMTY5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDYwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3B5dGhvbl9kZWZhdWx0cyB7CisgICAgbmFtZTogInRvb2xzX2RlZmF1bHQiLAorICAgIHZlcnNpb246IHsKKyAgICAgICAgcHkyOiB7CisgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgICAgICB9LAorICAgICAgICBweTM6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CisKK3B5dGhvbl9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImJ1aWxkUG9saWN5Q3JpdGVyaW9uVHlwZXMucHkiLAorICAgIG1haW46ICJidWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJidWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5IiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbInRvb2xzX2RlZmF1bHQiXSwKK30KKworcHl0aG9uX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAiZG9tYWluR2VuZXJhdG9yUG9saWN5LnB5IiwKKyAgICBtYWluOiAiZG9tYWluR2VuZXJhdG9yUG9saWN5LnB5IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJkb21haW5HZW5lcmF0b3JQb2xpY3kucHkiLAorICAgIF0sCisgICAgZGVmYXVsdHM6IFsidG9vbHNfZGVmYXVsdCJdLAorICAgIGxpYnM6IFsKKyAgICAgICAgIkVkZFBhcnNlci5weSIsCisgICAgICAgICJob3N0Q29uZmlnLnB5IiwKKyAgICAgICAgIlBGV1NjcmlwdEdlbmVyYXRvci5weSIsCisgICAgXSwKKyAgICByZXF1aXJlZDogWworICAgICAgICAiZG9tYWluR2VuZXJhdG9yQ29ubmVjdG9yIiwKKyAgICBdLAorfQorCitweXRob25fYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJidWlsZFN0cmF0ZWdpZXNTdHJ1Y3R1cmVGaWxlLnB5IiwKKyAgICBtYWluOiAiYnVpbGRTdHJhdGVnaWVzU3RydWN0dXJlRmlsZS5weSIsCisgICAgc3JjczogWworICAgICAgICAiYnVpbGRTdHJhdGVnaWVzU3RydWN0dXJlRmlsZS5weSIsCisgICAgXSwKKyAgICBkZWZhdWx0czogWyJ0b29sc19kZWZhdWx0Il0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRQb2xpY3lDcml0ZXJpb25UeXBlcy5weSBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBmYjcwYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRQb2xpY3lDcml0ZXJpb25UeXBlcy5weQpAQCAtMCwwICsxLDI0MyBAQAorIyEvdXNyL2Jpbi9weXRob24KKworIworIyBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgb3MKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHhtbC5ldHJlZS5FbGVtZW50VHJlZSBhcyBFVAoraW1wb3J0IHhtbC5ldHJlZS5FbGVtZW50SW5jbHVkZSBhcyBFSQoraW1wb3J0IHhtbC5kb20ubWluaWRvbSBhcyBNSU5JRE9NCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdAorCisjCisjIEhlbHBlciBzY3JpcHQgdGhhdCBoZWxwcyB0byBmZWVkIGF0IGJ1aWxkIHRpbWUgdGhlIFhNTCBjcml0ZXJpb24gdHlwZXMgZmlsZSB1c2VkIGJ5CisjIHRoZSBlbmdpbmVjb25maWd1cmFibGUgdG8gc3RhcnQgdGhlIHBhcmFtZXRlci1mcmFtZXdvcmsuCisjIEl0IHByZXZlbnRzIHRvIGZpbGwgdGhlbSBtYW51YWxseSBhbmQgYXZvaWQgZGl2ZXJnZW5jZXMgd2l0aCBhbmRyb2lkLgorIworIyBUaGUgRGV2aWNlIFR5cGVzIGNyaXRlcmlvbiB0eXBlcyBhcmUgZmVkIGZyb20gYXVkaW8tYmFzZS5oIGZpbGUgd2l0aCB0aGUgb3B0aW9uCisjICAgICAgICAgICAtLWFuZHJvaWRhdWRpb2Jhc2VoZWFkZXIgPHBhdGgvdG8vYW5kcm9pZC9hdWRpby9iYXNlL2ZpbGUvYXVkaW8tYmFzZS5oPgorIworIyBUaGUgRGV2aWNlIEFkZHJlc3NlcyBjcml0ZXJpb24gdHlwZXMgYXJlIGZlZCBmcm9tIHRoZSBhdWRpbyBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlCisjIGluIG9yZGVyIHRvIGRpc2NvdmVyIGFsbCB0aGUgZGV2aWNlcyBmb3Igd2hpY2ggdGhlIGFkZHJlc3MgbWF0dGVyLgorIyAgICAgICAgICAgLS1hdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlIDxwYXRoL3RvL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbD4KKyMKKyMgVGhlIHJlZmVyZW5jZSBmaWxlIG9mIGNyaXRlcmlvbiB0eXBlcyBtdXN0IGFsc28gYmUgc2V0IGFzIGFuIGlucHV0IG9mIHRoZSBzY3JpcHQ6CisjICAgICAgICAgICAtLWNyaXRlcmlvbnR5cGVzIDxwYXRoL3RvL2NyaXRlcmlvbi9maWxlL2F1ZGlvX2NyaXRlcmlvbl90eXBlcy54bWwuaW4+CisjCisjIEF0IGxhc3QsIHRoZSBvdXRwdXQgb2YgdGhlIHNjcmlwdCBzaGFsbCBiZSBzZXQgYWxzbzoKKyMgICAgICAgICAgIC0tb3V0cHV0ZmlsZSA8cGF0aC90by9vdXQvdmVuZG9yL2V0Yy9hdWRpb19jcml0ZXJpb25fdHlwZXMueG1sPgorIworCitkZWYgcGFyc2VBcmdzKCk6CisgICAgYXJncGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249IlBhcmFtZXRlci1GcmFtZXdvcmsgWE1MIFwKKyAgICAgICAgYXVkaW8gY3JpdGVyaW9uIHR5cGUgZmlsZSBnZW5lcmF0b3IuXG5cCisgICAgICAgIEV4aXQgd2l0aCB0aGUgbnVtYmVyIG9mIChyZWNvdmVyYWJsZSBvciBub3QpIGVycm9yIHRoYXQgb2NjdXJlZC4iKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tYW5kcm9pZGF1ZGlvYmFzZWhlYWRlcicsCisgICAgICAgICAgICBoZWxwPSJBbmRyb2lkIEF1ZGlvIEJhc2UgQyBoZWFkZXIgZmlsZSwgTWFuZGF0b3J5LiIsCisgICAgICAgICAgICBtZXRhdmFyPSJBTkRST0lEX0FVRElPX0JBU0VfSEVBREVSIiwKKyAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3InKSwKKyAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlJywKKyAgICAgICAgICAgIGhlbHA9IkFuZHJvaWQgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSwgTWFuZGF0b3J5LiIsCisgICAgICAgICAgICBtZXRhdmFyPSIoQVVESU9fUE9MSUNZX0NPTkZJR1VSQVRJT05fRklMRSkiLAorICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncicpLAorICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWNyaXRlcmlvbnR5cGVzJywKKyAgICAgICAgICAgIGhlbHA9IkNyaXRlcmlvbiB0eXBlcyBYTUwgYmFzZSBmaWxlLCBpbiBcCisgICAgICAgICAgICAnPGNyaXRlcmlvbl90eXBlcz4gXAorICAgICAgICAgICAgICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSIiIHR5cGU9PGluY2x1c2l2ZXxleGNsdXNpdmU+IHZhbHVlcz08dmFsdWUxLHZhbHVlMiwuLi4+Lz4nIFwKKyAgICAgICAgZm9ybWF0LiBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IkNSSVRFUklPTl9UWVBFX0ZJTEUiLAorICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncicpLAorICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW91dHB1dGZpbGUnLAorICAgICAgICAgICAgaGVscD0iQ3JpdGVyaW9uIHR5cGVzIG91dHB1dGZpbGUgZmlsZS4gTWFuZGF0b3J5LiIsCisgICAgICAgICAgICBtZXRhdmFyPSJDUklURVJJT05fVFlQRV9PVVRQVVRfRklMRSIsCisgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCd3JyksCisgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tdmVyYm9zZScsCisgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnKQorCisgICAgcmV0dXJuIGFyZ3BhcnNlci5wYXJzZV9hcmdzKCkKKworCitkZWYgZ2VuZXJhdGVYbWxDcml0ZXJpb25UeXBlc0ZpbGUoY3JpdGVyaW9uVHlwZXMsIGFkZHJlc3NDcml0ZXJpYSwgY3JpdGVyaW9uVHlwZXNGaWxlLCBvdXRwdXRGaWxlKToKKworICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIGNyaXRlcmlvblR5cGVzRmlsZSB7fSIuZm9ybWF0KGNyaXRlcmlvblR5cGVzRmlsZSkpCisgICAgY3JpdGVyaW9uX3R5cGVzX2luX3RyZWUgPSBFVC5wYXJzZShjcml0ZXJpb25UeXBlc0ZpbGUpCisKKyAgICBjcml0ZXJpb25fdHlwZXNfcm9vdCA9IGNyaXRlcmlvbl90eXBlc19pbl90cmVlLmdldHJvb3QoKQorCisgICAgZm9yIGNyaXRlcmlvbl9uYW1lLCB2YWx1ZXNfZGljdCBpbiBjcml0ZXJpb25UeXBlcy5pdGVtcygpOgorICAgICAgICBmb3IgY3JpdGVyaW9uX3R5cGUgaW4gY3JpdGVyaW9uX3R5cGVzX3Jvb3QuZmluZGFsbCgnY3JpdGVyaW9uX3R5cGUnKToKKyAgICAgICAgICAgIGlmIGNyaXRlcmlvbl90eXBlLmdldCgnbmFtZScpID09IGNyaXRlcmlvbl9uYW1lOgorICAgICAgICAgICAgICAgIHZhbHVlc19ub2RlID0gRVQuU3ViRWxlbWVudChjcml0ZXJpb25fdHlwZSwgInZhbHVlcyIpCisgICAgICAgICAgICAgICAgb3JkZXJlZF92YWx1ZXMgPSBPcmRlcmVkRGljdChzb3J0ZWQodmFsdWVzX2RpY3QuaXRlbXMoKSwga2V5PWxhbWJkYSB4OiB4WzFdKSkKKyAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBvcmRlcmVkX3ZhbHVlcy5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlID0gRVQuU3ViRWxlbWVudCh2YWx1ZXNfbm9kZSwgInZhbHVlIikKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ251bWVyaWNhbCcsIHN0cih2YWx1ZSkpCisgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUuc2V0KCdsaXRlcmFsJywga2V5KQorCisgICAgaWYgYWRkcmVzc0NyaXRlcmlhOgorICAgICAgICBmb3IgY3JpdGVyaW9uX25hbWUsIHZhbHVlc19saXN0IGluIGFkZHJlc3NDcml0ZXJpYS5pdGVtcygpOgorICAgICAgICAgICAgZm9yIGNyaXRlcmlvbl90eXBlIGluIGNyaXRlcmlvbl90eXBlc19yb290LmZpbmRhbGwoJ2NyaXRlcmlvbl90eXBlJyk6CisgICAgICAgICAgICAgICAgaWYgY3JpdGVyaW9uX3R5cGUuZ2V0KCduYW1lJykgPT0gY3JpdGVyaW9uX25hbWU6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlc19ub2RlID0gRVQuU3ViRWxlbWVudChjcml0ZXJpb25fdHlwZSwgInZhbHVlcyIpCisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMAorICAgICAgICAgICAgICAgICAgICBmb3IgdmFsdWUgaW4gdmFsdWVzX2xpc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlID0gRVQuU3ViRWxlbWVudCh2YWx1ZXNfbm9kZSwgInZhbHVlIiwgbGl0ZXJhbD12YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUuc2V0KCdudW1lcmljYWwnLCBzdHIoMSA8PCBpbmRleCkpCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxCisKKyAgICB4bWxzdHIgPSBFVC50b3N0cmluZyhjcml0ZXJpb25fdHlwZXNfcm9vdCwgZW5jb2Rpbmc9J3V0ZjgnLCBtZXRob2Q9J3htbCcpCisgICAgcmVwYXJzZWQgPSBNSU5JRE9NLnBhcnNlU3RyaW5nKHhtbHN0cikKKyAgICBwcmV0dHlYbWxTdHIgPSByZXBhcnNlZC50b3ByZXR0eXhtbChuZXdsPSdcclxuJykKKyAgICBwcmV0dHlYbWxTdHIgPSBvcy5saW5lc2VwLmpvaW4oW3MgZm9yIHMgaW4gcHJldHR5WG1sU3RyLnNwbGl0bGluZXMoKSBpZiBzLnN0cmlwKCldKQorICAgIG91dHB1dEZpbGUud3JpdGUocHJldHR5WG1sU3RyLmVuY29kZSgndXRmLTgnKSkKKworZGVmIGNhcGl0YWxpemVMaW5lKGxpbmUpOgorICAgIHJldHVybiAnICcuam9pbigody5jYXBpdGFsaXplKCkgZm9yIHcgaW4gbGluZS5zcGxpdCgnICcpKSkKKworCisjCisjIFBhcnNlIHRoZSBhdWRpbyBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlIGFuZCBvdXRwdXQgYSBkaWN0aW9uYXJ5IG9mIGRldmljZSBjcml0ZXJpYSBhZGRyZXNzZXMKKyMKK2RlZiBwYXJzZUFuZHJvaWRBdWRpb1BvbGljeUNvbmZpZ3VyYXRpb25GaWxlKGF1ZGlvcG9saWN5Y29uZmlndXJhdGlvbmZpbGUpOgorCisgICAgbG9nZ2luZy5pbmZvKCJDaGVja2luZyBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBmaWxlIHt9Ii5mb3JtYXQoYXVkaW9wb2xpY3ljb25maWd1cmF0aW9uZmlsZSkpCisgICAgIworICAgICMgZXh0cmFjdCBhbGwgZGV2aWNlcyBhZGRyZXNzZXMgZnJvbSBhdWRpbyBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlCisgICAgIworICAgIGFkZHJlc3NfY3JpdGVyaWFfbWFwcGluZ190YWJsZSA9IHsKKyAgICAgICAgJ3NpbmsnIDogIk91dHB1dERldmljZXNBZGRyZXNzZXNUeXBlIiwKKyAgICAgICAgJ3NvdXJjZScgOiAiSW5wdXREZXZpY2VzQWRkcmVzc2VzVHlwZSIgfQorCisgICAgYWRkcmVzc19jcml0ZXJpYSA9IHsKKyAgICAgICAgJ091dHB1dERldmljZXNBZGRyZXNzZXNUeXBlJyA6IFtdLAorICAgICAgICAnSW5wdXREZXZpY2VzQWRkcmVzc2VzVHlwZScgOiBbXSB9CisKKyAgICBvbGRXb3JraW5nRGlyID0gb3MuZ2V0Y3dkKCkKKyAgICBwcmludCAiQ3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAlcyIgJSBvbGRXb3JraW5nRGlyCisKKyAgICBuZXdEaXIgPSBvcy5wYXRoLmpvaW4ob2xkV29ya2luZ0RpciAsIGF1ZGlvcG9saWN5Y29uZmlndXJhdGlvbmZpbGUubmFtZSkKKworICAgIHBvbGljeV9pbl90cmVlID0gRVQucGFyc2UoYXVkaW9wb2xpY3ljb25maWd1cmF0aW9uZmlsZSkKKyAgICBvcy5jaGRpcihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5ub3JtcGF0aChuZXdEaXIpKSkKKworICAgIHByaW50ICJuZXcgd29ya2luZyBkaXJlY3RvcnkgJXMiICUgb3MuZ2V0Y3dkKCkKKworICAgIHBvbGljeV9yb290ID0gcG9saWN5X2luX3RyZWUuZ2V0cm9vdCgpCisgICAgRUkuaW5jbHVkZShwb2xpY3lfcm9vdCkKKworICAgIG9zLmNoZGlyKG9sZFdvcmtpbmdEaXIpCisKKyAgICBmb3IgZGV2aWNlIGluIHBvbGljeV9yb290Lml0ZXIoJ2RldmljZVBvcnQnKToKKyAgICAgICAgZm9yIGtleSBpbiBhZGRyZXNzX2NyaXRlcmlhX21hcHBpbmdfdGFibGUua2V5cygpOgorICAgICAgICAgICAgaWYgZGV2aWNlLmdldCgncm9sZScpID09IGtleSBhbmQgZGV2aWNlLmdldCgnYWRkcmVzcycpIDoKKyAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oInt9OiA8e30+Ii5mb3JtYXQoa2V5LCBkZXZpY2UuZ2V0KCdhZGRyZXNzJykpKQorICAgICAgICAgICAgICAgIGFkZHJlc3NfY3JpdGVyaWFbYWRkcmVzc19jcml0ZXJpYV9tYXBwaW5nX3RhYmxlW2tleV1dLmFwcGVuZChkZXZpY2UuZ2V0KCdhZGRyZXNzJykpCisKKyAgICBmb3IgY3JpdGVyaWEgaW4gYWRkcmVzc19jcml0ZXJpYToKKyAgICAgICAgdmFsdWVzID0gJywnLmpvaW4oYWRkcmVzc19jcml0ZXJpYVtjcml0ZXJpYV0pCisgICAgICAgIGxvZ2dpbmcuaW5mbygie306IDx7fT4iLmZvcm1hdChjcml0ZXJpYSwgdmFsdWVzKSkKKworICAgIHJldHVybiBhZGRyZXNzX2NyaXRlcmlhCisKKyMKKyMgUGFyc2UgdGhlIGF1ZGlvLWJhc2UuaCBmaWxlIGFuZCBvdXRwdXQgYSBkaWN0aW9uYXJ5IG9mIGFuZHJvaWQgZGVwZW5kZW50IGNyaXRlcmlvbiB0eXBlczoKKyMgICAtQW5kcm9pZCBNb2RlCisjICAgLU91dHB1dCBkZXZpY2VzIHR5cGUKKyMgICAtSW5wdXQgZGV2aWNlcyB0eXBlCisjCitkZWYgcGFyc2VBbmRyb2lkQXVkaW9GaWxlKGFuZHJvaWRhdWRpb2Jhc2VoZWFkZXJGaWxlKToKKyAgICAjCisgICAgIyBBZGFwdGF0aW9uIHRhYmxlIGJldHdlZW4gQW5kcm9pZCBFbnVtZXJhdGlvbiBwcmVmaXggYW5kIEF1ZGlvIFBGVyBDcml0ZXJpb24gdHlwZSBuYW1lcworICAgICMKKyAgICBjcml0ZXJpb25fbWFwcGluZ190YWJsZSA9IHsKKyAgICAgICAgJ0FVRElPX01PREUnIDogIkFuZHJvaWRNb2RlVHlwZSIsCisgICAgICAgICdBVURJT19ERVZJQ0VfT1VUJyA6ICJPdXRwdXREZXZpY2VzTWFza1R5cGUiLAorICAgICAgICAnQVVESU9fREVWSUNFX0lOJyA6ICJJbnB1dERldmljZXNNYXNrVHlwZSJ9CisKKyAgICBhbGxfY3JpdGVyaWEgPSB7CisgICAgICAgICdBbmRyb2lkTW9kZVR5cGUnIDoge30sCisgICAgICAgICdPdXRwdXREZXZpY2VzTWFza1R5cGUnIDoge30sCisgICAgICAgICdJbnB1dERldmljZXNNYXNrVHlwZScgOiB7fSB9CisKKyAgICAjCisgICAgIyBfQ05ULCBfTUFYLCBfQUxMIGFuZCBfTk9ORSBhcmUgcHJvaGliaXRlZCB2YWx1ZXMgYXMgdGhlciBhcmUganVzdCBoZWxwZXJzIGZvciBlbnVtIHVzZXJzLgorICAgICMKKyAgICBpZ25vcmVkX3ZhbHVlcyA9IFsgJ0NOVCcsICdNQVgnLCAnQUxMJywgJ05PTkUnIF0KKworICAgIGNyaXRlcmlhX3BhdHRlcm4gPSByZS5jb21waWxlKAorICAgICAgICByIlxzKig/UDx0eXBlPig/OiIrJ3wnLmpvaW4oY3JpdGVyaW9uX21hcHBpbmdfdGFibGUua2V5cygpKSArICIpKVxfIiBcCisgICAgICAgIHIiKD9QPGxpdGVyYWw+KD8hIiArICd8Jy5qb2luKGlnbm9yZWRfdmFsdWVzKSArICIpXHcqKVxzKj1ccyoiIFwKKyAgICAgICAgciIoP1A8dmFsdWVzPig/OjBbeFhdKT9bMC05YS1mQS1GXSspIikKKworICAgIGxvZ2dpbmcuaW5mbygiQ2hlY2tpbmcgQW5kcm9pZCBIZWFkZXIgZmlsZSB7fSIuZm9ybWF0KGFuZHJvaWRhdWRpb2Jhc2VoZWFkZXJGaWxlKSkKKworICAgIGZvciBsaW5lX251bWJlciwgbGluZSBpbiBlbnVtZXJhdGUoYW5kcm9pZGF1ZGlvYmFzZWhlYWRlckZpbGUpOgorICAgICAgICBtYXRjaCA9IGNyaXRlcmlhX3BhdHRlcm4ubWF0Y2gobGluZSkKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICBsb2dnaW5nLmRlYnVnKCJUaGUgZm9sbG93aW5nIGxpbmUgaXMgVkFMSUQ6IHt9Ont9XG57fSIuZm9ybWF0KAorICAgICAgICAgICAgICAgIGFuZHJvaWRhdWRpb2Jhc2VoZWFkZXJGaWxlLm5hbWUsIGxpbmVfbnVtYmVyLCBsaW5lKSkKKworICAgICAgICAgICAgY3JpdGVyaW9uX25hbWUgPSBjcml0ZXJpb25fbWFwcGluZ190YWJsZVttYXRjaC5ncm91cGRpY3QoKVsndHlwZSddXQorICAgICAgICAgICAgbGl0ZXJhbCA9ICcnLmpvaW4oKHcuY2FwaXRhbGl6ZSgpIGZvciB3IGluIG1hdGNoLmdyb3VwZGljdCgpWydsaXRlcmFsJ10uc3BsaXQoJ18nKSkpCisgICAgICAgICAgICBudW1lcmljYWxfdmFsdWUgPSBtYXRjaC5ncm91cGRpY3QoKVsndmFsdWVzJ10KKworICAgICAgICAgICAgIyBmb3IgQVVESU9fREVWSUNFX0lOOiBuZWVkIHRvIHJlbW92ZSBzaWduIGJpdAorICAgICAgICAgICAgaWYgY3JpdGVyaW9uX25hbWUgPT0gIklucHV0RGV2aWNlc01hc2tUeXBlIjoKKyAgICAgICAgICAgICAgICBudW1lcmljYWxfdmFsdWUgPSBzdHIoaW50KG51bWVyaWNhbF92YWx1ZSwgMCkgJiB+MjE0NzQ4MzY0OCkKKworICAgICAgICAgICAgIyBSZW1vdmUgZHVwbGljYXRlZCBudW1lcmljYWwgdmFsdWVzCisgICAgICAgICAgICBpZiBpbnQobnVtZXJpY2FsX3ZhbHVlLCAwKSBpbiBhbGxfY3JpdGVyaWFbY3JpdGVyaW9uX25hbWVdLnZhbHVlcygpOgorICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiY3JpdGVyaW9uIHt9IGR1cGxpY2F0ZWQgdmFsdWVzOiIuZm9ybWF0KGNyaXRlcmlvbl9uYW1lKSkKKyAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oInt9Ont9Ii5mb3JtYXQobnVtZXJpY2FsX3ZhbHVlLCBsaXRlcmFsKSkKKyAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIktFRVBJTkcgTEFURVNUIikKKyAgICAgICAgICAgICAgICBmb3Iga2V5IGluIGFsbF9jcml0ZXJpYVtjcml0ZXJpb25fbmFtZV0ua2V5cygpOgorICAgICAgICAgICAgICAgICAgICBpZiBhbGxfY3JpdGVyaWFbY3JpdGVyaW9uX25hbWVdW2tleV0gPT0gaW50KG51bWVyaWNhbF92YWx1ZSwgMCk6CisgICAgICAgICAgICAgICAgICAgICAgICBkZWwgYWxsX2NyaXRlcmlhW2NyaXRlcmlvbl9uYW1lXVtrZXldCisKKyAgICAgICAgICAgIGFsbF9jcml0ZXJpYVtjcml0ZXJpb25fbmFtZV1bbGl0ZXJhbF0gPSBpbnQobnVtZXJpY2FsX3ZhbHVlLCAwKQorCisgICAgICAgICAgICBsb2dnaW5nLmRlYnVnKCJ0eXBlOnt9LCIuZm9ybWF0KGNyaXRlcmlvbl9uYW1lKSkKKyAgICAgICAgICAgIGxvZ2dpbmcuZGVidWcoIml0ZXJhbDp7fSwiLmZvcm1hdChsaXRlcmFsKSkKKyAgICAgICAgICAgIGxvZ2dpbmcuZGVidWcoInZhbHVlczp7fS4iLmZvcm1hdChudW1lcmljYWxfdmFsdWUpKQorCisgICAgcmV0dXJuIGFsbF9jcml0ZXJpYQorCisKK2RlZiBtYWluKCk6CisgICAgbG9nZ2luZy5yb290LnNldExldmVsKGxvZ2dpbmcuSU5GTykKKyAgICBhcmdzID0gcGFyc2VBcmdzKCkKKworICAgIGFsbF9jcml0ZXJpYSA9IHBhcnNlQW5kcm9pZEF1ZGlvRmlsZShhcmdzLmFuZHJvaWRhdWRpb2Jhc2VoZWFkZXIpCisKKyAgICBhZGRyZXNzX2NyaXRlcmlhID0gcGFyc2VBbmRyb2lkQXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uRmlsZShhcmdzLmF1ZGlvcG9saWN5Y29uZmlndXJhdGlvbmZpbGUpCisKKyAgICBjcml0ZXJpb25fdHlwZXMgPSBhcmdzLmNyaXRlcmlvbnR5cGVzCisKKyAgICBnZW5lcmF0ZVhtbENyaXRlcmlvblR5cGVzRmlsZShhbGxfY3JpdGVyaWEsIGFkZHJlc3NfY3JpdGVyaWEsIGNyaXRlcmlvbl90eXBlcywgYXJncy5vdXRwdXRmaWxlKQorCisjIElmIHRoaXMgZmlsZSBpcyBkaXJlY3RseSBleGVjdXRlZAoraWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBleGl0KG1haW4oKSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZFN0cmF0ZWdpZXNTdHJ1Y3R1cmVGaWxlLnB5IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkU3RyYXRlZ2llc1N0cnVjdHVyZUZpbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWU3MGIyNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZFN0cmF0ZWdpZXNTdHJ1Y3R1cmVGaWxlLnB5CkBAIC0wLDAgKzEsMTM5IEBACisjIS91c3IvYmluL3B5dGhvbgorCisjCisjIENvcHlyaWdodCAyMDE5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBvcworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIGFzIEVUCitpbXBvcnQgeG1sLmV0cmVlLkVsZW1lbnRJbmNsdWRlIGFzIEVJCitpbXBvcnQgeG1sLmRvbS5taW5pZG9tIGFzIE1JTklET00KK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CisKKyMKKyMgSGVscGVyIHNjcmlwdCB0aGF0IGhlbHBzIHRvIGZlZWQgYXQgYnVpbGQgdGltZSB0aGUgWE1MIFByb2R1Y3QgU3RyYXRlZ2llcyBTdHJ1Y3R1cmUgZmlsZSBmaWxlIHVzZWQKKyMgYnkgdGhlIGVuZ2luZWNvbmZpZ3VyYWJsZSB0byBzdGFydCB0aGUgcGFyYW1ldGVyLWZyYW1ld29yay4KKyMgSXQgcHJldmVudHMgdG8gZmlsbCB0aGVtIG1hbnVhbGx5IGFuZCBhdm9pZCBkaXZlcmdlbmNlcyB3aXRoIGFuZHJvaWQuCisjCisjIFRoZSBQcm9kdWN0IFN0cmF0ZWdpZXMgU3RydWN0dXJlIGZpbGUgaXMgZmVkIGZyb20gdGhlIGF1ZGlvIHBvbGljeSBlbmdpbmUgY29uZmlndXJhdGlvbiBmaWxlCisjIGluIG9yZGVyIHRvIGRpc2NvdmVyIGFsbCB0aGUgc3RyYXRlZ2llcyBhdmFpbGFibGUgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLgorIyAgICAgICAgICAgLS1hdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYXRpb25maWxlIDxwYXRoL3RvL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWw+CisjCisjIFRoZSByZWZlcmVuY2UgZmlsZSBvZiBQcm9kdWN0U3RyYXRlZ2llcyBzdHJ1Y3R1cmUgbXVzdCBhbHNvIGJlIHNldCBhcyBhbiBpbnB1dCBvZiB0aGUgc2NyaXB0OgorIyAgICAgICAgICAgLS1wcm9kdWN0c3RyYXRlZ2llc3N0cnVjdHVyZWZpbGUgPHBhdGgvdG8vc3RydWN0dXJlL2ZpbGUvUHJvZHVjdFN0cmF0ZWdpZXMueG1sLmluPgorIworIyBBdCBsYXN0LCB0aGUgb3V0cHV0IG9mIHRoZSBzY3JpcHQgc2hhbGwgYmUgc2V0IGFsc286CisjICAgICAgICAgICAtLW91dHB1dGZpbGUgPHBhdGgvdG8vb3V0LzxzeXN0ZW18dmVuZG9yfG9kbT4vZXRjL1Byb2R1Y3RTdHJhdGVnaWVzLnhtbD4KKyMKKworZGVmIHBhcnNlQXJncygpOgorICAgIGFyZ3BhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPSJQYXJhbWV0ZXItRnJhbWV3b3JrIFhNTCBcCisgICAgICAgIHByb2R1Y3Qgc3RyYXRlZ2llcyBzdHJ1Y3R1cmUgZmlsZSBnZW5lcmF0b3IuXG5cCisgICAgICAgIEV4aXQgd2l0aCB0aGUgbnVtYmVyIG9mIChyZWNvdmVyYWJsZSBvciBub3QpIGVycm9yIHRoYXQgb2NjdXJlZC4iKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmF0aW9uZmlsZScsCisgICAgICAgICAgICBoZWxwPSJBbmRyb2lkIEF1ZGlvIFBvbGljeSBFbmdpbmUgQ29uZmlndXJhdGlvbiBmaWxlLCBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IihBVURJT19QT0xJQ1lfRU5HSU5FX0NPTkZJR1VSQVRJT05fRklMRSkiLAorICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncicpLAorICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXByb2R1Y3RzdHJhdGVnaWVzc3RydWN0dXJlZmlsZScsCisgICAgICAgICAgICBoZWxwPSJQcm9kdWN0IFN0cmF0ZWdpZXMgU3RydWN0dXJlIFhNTCBiYXNlIGZpbGUsIE1hbmRhdG9yeS4iLAorICAgICAgICAgICAgbWV0YXZhcj0iU1RSQVRFR0lFU19TVFJVQ1RVUkVfRklMRSIsCisgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJyksCisgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tb3V0cHV0ZmlsZScsCisgICAgICAgICAgICBoZWxwPSJQcm9kdWN0IFN0cmF0ZWdpZXMgU3RydWN0dXJlIG91dHB1dCBmaWxlLCBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IlNUUkFURUdJRVNfU1RSVUNUVVJFX09VVFBVVF9GSUxFIiwKKyAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3cnKSwKKyAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJib3NlJywKKyAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisKKyAgICByZXR1cm4gYXJncGFyc2VyLnBhcnNlX2FyZ3MoKQorCisKK2RlZiBnZW5lcmF0ZVhtbFN0cnVjdHVyZUZpbGUoc3RyYXRlZ2llcywgc3RyYXRlZ3lTdHJ1Y3R1cmVJbkZpbGUsIG91dHB1dEZpbGUpOgorCisgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgc3RyYXRlZ3lTdHJ1Y3R1cmVJbkZpbGUge30iLmZvcm1hdChzdHJhdGVneVN0cnVjdHVyZUluRmlsZSkpCisgICAgc3RyYXRlZ2llc19pbl90cmVlID0gRVQucGFyc2Uoc3RyYXRlZ3lTdHJ1Y3R1cmVJbkZpbGUpCisKKyAgICBzdHJhdGVnaWVzX3Jvb3QgPSBzdHJhdGVnaWVzX2luX3RyZWUuZ2V0cm9vdCgpCisgICAgc3RyYXRlZ3lfY29tcG9uZW50cyA9IHN0cmF0ZWdpZXNfcm9vdC5maW5kKCdDb21wb25lbnRUeXBlJykKKworICAgIGZvciBzdHJhdGVneV9uYW1lIGluIHN0cmF0ZWdpZXM6CisgICAgICAgIGNvbnRleHRfbWFwcGluZyA9ICIiLmpvaW4obWFwKHN0ciwgWyJOYW1lOiIsIHN0cmF0ZWd5X25hbWVdKSkKKyAgICAgICAgc3RyYXRlZ3lfcGZ3X25hbWUgPSBzdHJhdGVneV9uYW1lLnJlcGxhY2UoJ1NUUkFURUdZXycsICcnKS5sb3dlcigpCisgICAgICAgIHN0cmF0ZWd5X2NvbXBvbmVudF9ub2RlID0gRVQuU3ViRWxlbWVudChzdHJhdGVneV9jb21wb25lbnRzLCAiQ29tcG9uZW50IiwgTmFtZT1zdHJhdGVneV9wZndfbmFtZSwgVHlwZT0iUHJvZHVjdFN0cmF0ZWd5IiwgTWFwcGluZz1jb250ZXh0X21hcHBpbmcpCisKKyAgICB4bWxzdHIgPSBFVC50b3N0cmluZyhzdHJhdGVnaWVzX3Jvb3QsIGVuY29kaW5nPSd1dGY4JywgbWV0aG9kPSd4bWwnKQorICAgIHJlcGFyc2VkID0gTUlOSURPTS5wYXJzZVN0cmluZyh4bWxzdHIpCisgICAgcHJldHR5WG1sU3RyID0gcmVwYXJzZWQudG9wcmV0dHl4bWwobmV3bD0nXHJcbicpCisgICAgcHJldHR5WG1sU3RyID0gb3MubGluZXNlcC5qb2luKFtzIGZvciBzIGluIHByZXR0eVhtbFN0ci5zcGxpdGxpbmVzKCkgaWYgcy5zdHJpcCgpXSkKKyAgICBvdXRwdXRGaWxlLndyaXRlKHByZXR0eVhtbFN0ci5lbmNvZGUoJ3V0Zi04JykpCisKK2RlZiBjYXBpdGFsaXplTGluZShsaW5lKToKKyAgICByZXR1cm4gJyAnLmpvaW4oKHcuY2FwaXRhbGl6ZSgpIGZvciB3IGluIGxpbmUuc3BsaXQoJyAnKSkpCisKKworIworIyBQYXJzZSB0aGUgYXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgb3V0cHV0IGEgZGljdGlvbmFyeSBvZiBkZXZpY2UgY3JpdGVyaWEgYWRkcmVzc2VzCisjCitkZWYgcGFyc2VBbmRyb2lkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWd1cmF0aW9uRmlsZShhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYXRpb25maWxlKToKKworICAgIGxvZ2dpbmcuaW5mbygiQ2hlY2tpbmcgQXVkaW8gUG9saWN5IEVuZ2luZSBDb25maWd1cmF0aW9uIGZpbGUge30iLmZvcm1hdChhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYXRpb25maWxlKSkKKyAgICAjCisgICAgIyBleHRyYWN0IGFsbCBwcm9kdWN0IHN0cmF0ZWdpZXMgbmFtZSBmcm9tIGF1ZGlvIHBvbGljeSBlbmdpbmUgY29uZmlndXJhdGlvbiBmaWxlCisgICAgIworICAgIHN0cmF0ZWd5X25hbWVzID0gW10KKworICAgIG9sZFdvcmtpbmdEaXIgPSBvcy5nZXRjd2QoKQorICAgIHByaW50ICJDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ICVzIiAlIG9sZFdvcmtpbmdEaXIKKworICAgIG5ld0RpciA9IG9zLnBhdGguam9pbihvbGRXb3JraW5nRGlyICwgYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmF0aW9uZmlsZS5uYW1lKQorCisgICAgcG9saWN5X2VuZ2luZV9pbl90cmVlID0gRVQucGFyc2UoYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmF0aW9uZmlsZSkKKyAgICBvcy5jaGRpcihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5ub3JtcGF0aChuZXdEaXIpKSkKKworICAgIHByaW50ICJuZXcgd29ya2luZyBkaXJlY3RvcnkgJXMiICUgb3MuZ2V0Y3dkKCkKKworICAgIHBvbGljeV9lbmdpbmVfcm9vdCA9IHBvbGljeV9lbmdpbmVfaW5fdHJlZS5nZXRyb290KCkKKyAgICBFSS5pbmNsdWRlKHBvbGljeV9lbmdpbmVfcm9vdCkKKworICAgIG9zLmNoZGlyKG9sZFdvcmtpbmdEaXIpCisKKyAgICBmb3Igc3RyYXRlZ3kgaW4gcG9saWN5X2VuZ2luZV9yb290Lml0ZXIoJ1Byb2R1Y3RTdHJhdGVneScpOgorICAgICAgICBzdHJhdGVneV9uYW1lcy5hcHBlbmQoc3RyYXRlZ3kuZ2V0KCduYW1lJykpCisKKyAgICByZXR1cm4gc3RyYXRlZ3lfbmFtZXMKKworCitkZWYgbWFpbigpOgorICAgIGxvZ2dpbmcucm9vdC5zZXRMZXZlbChsb2dnaW5nLklORk8pCisgICAgYXJncyA9IHBhcnNlQXJncygpCisKKyAgICBzdHJhdGVnaWVzID0gcGFyc2VBbmRyb2lkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWd1cmF0aW9uRmlsZShhcmdzLmF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhdGlvbmZpbGUpCisKKyAgICBwcm9kdWN0X3N0cmF0ZWdpZXNfc3RydWN0dXJlID0gYXJncy5wcm9kdWN0c3RyYXRlZ2llc3N0cnVjdHVyZWZpbGUKKworICAgIGdlbmVyYXRlWG1sU3RydWN0dXJlRmlsZShzdHJhdGVnaWVzLCBwcm9kdWN0X3N0cmF0ZWdpZXNfc3RydWN0dXJlLCBhcmdzLm91dHB1dGZpbGUpCisKKyMgSWYgdGhpcyBmaWxlIGlzIGRpcmVjdGx5IGV4ZWN1dGVkCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGV4aXQobWFpbigpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkX2F1ZGlvX3Bmd19zZXR0aW5ncy5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZF9hdWRpb19wZndfc2V0dGluZ3MubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4NjQ2OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZF9hdWRpb19wZndfc2V0dGluZ3MubWsKQEAgLTAsMCArMSwzNSBAQAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5taworCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0NSSVRFUklPTl9UWVBFU19GSUxFIDo9ICQoUEZXX0NSSVRFUklPTl9UWVBFU19GSUxFKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9UT09MIDo9IGRvbWFpbkdlbmVyYXRvclBvbGljeS5weQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9UT1BMRVZFTF9GSUxFIDo9ICQoUEZXX1RPUExFVkVMX0ZJTEUpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0NSSVRFUklBX0ZJTEUgOj0gJChQRldfQ1JJVEVSSUFfRklMRSkKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogTVlfVFVOSU5HX0ZJTEUgOj0gJChQRldfVFVOSU5HX0ZJTEUpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0VERF9GSUxFUyA6PSAkKFBGV19FRERfRklMRVMpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0RPTUFJTl9GSUxFUyA6PSAkKFBGV19ET01BSU5fRklMRVMpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX1NDSEVNQVNfRElSIDo9ICQoUEZXX1NDSEVNQVNfRElSKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9DUklURVJJT05fVFlQRVNfRklMRSA6PSAkKFBGV19DUklURVJJT05fVFlQRVNfRklMRSkKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9SRVFVSVJFRF9NT0RVTEVTKSAkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKSBkb21haW5HZW5lcmF0b3JQb2xpY3kucHkKKworCSIkKE1ZX1RPT0wpIiAtLXZhbGlkYXRlIFwKKwkJLS10b3BsZXZlbC1jb25maWcgIiQoTVlfVE9QTEVWRUxfRklMRSkiIFwKKwkJLS1jcml0ZXJpYSAiJChNWV9DUklURVJJQV9GSUxFKSIgXAorCQktLWNyaXRlcmlvbnR5cGVzICIkKE1ZX0NSSVRFUklPTl9UWVBFU19GSUxFKSIgXAorCQktLWluaXRpYWwtc2V0dGluZ3MgJChNWV9UVU5JTkdfRklMRSkgXAorCQktLWFkZC1lZGRzICQoTVlfRUREX0ZJTEVTKSBcCisJCS0tYWRkLWRvbWFpbnMgJChNWV9ET01BSU5fRklMRVMpIFwKKwkJLS1zY2hlbWFzLWRpciAkKE1ZX1NDSEVNQVNfRElSKSA+ICIkQCIKKworCisjIENsZWFyIHZhcmlhYmxlcyBmb3IgZnVydGhlciB1c2UKK1BGV19UT1BMRVZFTF9GSUxFIDo9CitQRldfU1RSVUNUVVJFX0ZJTEVTIDo9CitQRldfQ1JJVEVSSUFfRklMRSA6PQorUEZXX0NSSVRFUklPTl9UWVBFU19GSUxFIDo9CitQRldfVFVOSU5HX0ZJTEUgOj0KK1BGV19FRERfRklMRVMgOj0KK1BGV19ET01BSU5fRklMRVMgOj0KK1BGV19TQ0hFTUFTX0RJUiA6PSAkKFBGV19ERUZBVUxUX1NDSEVNQVNfRElSKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2RvbWFpbkdlbmVyYXRvclBvbGljeS5weSBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9kb21haW5HZW5lcmF0b3JQb2xpY3kucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzkyOTQwMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9kb21haW5HZW5lcmF0b3JQb2xpY3kucHkKQEAgLTAsMCArMSwyNjggQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKKyMKKyMgQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IEVkZFBhcnNlcgorZnJvbSBQRldTY3JpcHRHZW5lcmF0b3IgaW1wb3J0IFBmd1NjcmlwdFRyYW5zbGF0b3IKK2ltcG9ydCBob3N0Q29uZmlnCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBvcworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIGFzIEVUCisKKyMKKyMgSW4gb3JkZXIgdG8gYnVpbGQgdGhlIFhNTCBTZXR0aW5ncyBmaWxlIGF0IGJ1aWxkIHRpbWUsIGFuIGluc3RhbmNlIG9mIHRoZSBwYXJhbWV0ZXItZnJhbWV3b3JrCisjIHNoYWxsIGJlIHN0YXJ0ZWQgYW5kIGZlZCB3aXRoIGFsbCB0aGUgY3JpdGVyaW9uIHR5cGVzL2NyaXRlcmlhIHRoYXQgd2lsbCBiZSB1c2VkIGJ5CisjIHRoZSBlbmdpbmVjb25maWd1cmFibGUuCisjIFRoaXMgc2NyaXB0cyBhbGxvd3MgZ2VuZXJhdGVzIHRoZSBzZXR0aW5ncyBmcm9tIHRoZSBzYW1lIGF1ZGlvX2NyaXRlcmlvbl90eXBlcy54bWwgLworIyBhdWRpb19jcml0ZXJpYS54bWwgZmlsZXMgdXNlZCBhdCBydW4gdGltZSBieSB0aGUgZW5naW5lY29uZmlndXJhYmxlCisjCisKK2RlZiBwYXJzZUFyZ3MoKToKKyAgICBhcmdwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj0iUGFyYW1ldGVyLUZyYW1ld29yayBYTUwgXAorICAgICAgICBTZXR0aW5ncyBmaWxlIGdlbmVyYXRvci5cblwKKyAgICAgICAgRXhpdCB3aXRoIHRoZSBudW1iZXIgb2YgKHJlY292ZXJhYmxlIG9yIG5vdCkgZXJyb3IgdGhhdCBvY2N1cmVkLiIpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS10b3BsZXZlbC1jb25maWcnLAorICAgICAgICAgICAgaGVscD0iVG9wLWxldmVsIHBhcmFtZXRlci1mcmFtZXdvcmsgY29uZmlndXJhdGlvbiBmaWxlLiBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IlRPUExFVkVMX0NPTkZJR19GSUxFIiwKKyAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1jcml0ZXJpYScsCisgICAgICAgICAgICBoZWxwPSJDcml0ZXJpYSBmaWxlLCBpbiBYTUwgZm9ybWF0OiBcCisgICAgICAgICAgICAgICAgICBpbiAnPGNyaXRlcmlhPiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIDxjcml0ZXJpb24gbmFtZT0iIiB0eXBlPSIiLz4gXAorICAgICAgICAgICAgICAgICAgICAgIDwvY3JpdGVyaWE+JyBcCisgICAgICAgIGZvcm1hdC4gTWFuZGF0b3J5LiIsCisgICAgICAgICAgICBtZXRhdmFyPSJDUklURVJJQV9GSUxFIiwKKyAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3InKSwKKyAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1jcml0ZXJpb250eXBlcycsCisgICAgICAgICAgICBoZWxwPSJDcml0ZXJpb24gdHlwZXMgWE1MIGZpbGUsIGluIFwKKyAgICAgICAgICAgICc8Y3JpdGVyaW9uX3R5cGVzPiBcCisgICAgICAgICAgICAgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IiIgdHlwZT08aW5jbHVzaXZlfGV4Y2x1c2l2ZT4gdmFsdWVzPTx2YWx1ZTEsdmFsdWUyLC4uLj4vPiBcCisgICAgICAgICAgICAgPC9jcml0ZXJpb25fdHlwZXM+JyBcCisgICAgICAgIGZvcm1hdC4gTWFuZGF0b3J5LiIsCisgICAgICAgICAgICBtZXRhdmFyPSJDUklURVJJT05fVFlQRV9GSUxFIiwKKyAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3InKSwKKyAgICAgICAgICAgIHJlcXVpcmVkPUZhbHNlKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0taW5pdGlhbC1zZXR0aW5ncycsCisgICAgICAgICAgICBoZWxwPSJJbml0aWFsIFhNTCBzZXR0aW5ncyBmaWxlIChjb250YWluaW5nIGEgXAorICAgICAgICA8Q29uZmlndXJhYmxlRG9tYWlucz4gIHRhZyIsCisgICAgICAgICAgICBuYXJncz0nPycsCisgICAgICAgICAgICBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICBtZXRhdmFyPSJYTUxfU0VUVElOR1NfRklMRSIpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hZGQtZG9tYWlucycsCisgICAgICAgICAgICBoZWxwPSJMaXN0IG9mIHNpbmdsZSBkb21haW4gZmlsZXMgKGVhY2ggY29udGFpbmluZyBhIHNpbmdsZSBcCisgICAgICAgIDxDb25maWd1cmFibGVEb21haW4+IHRhZyIsCisgICAgICAgICAgICBtZXRhdmFyPSJYTUxfRE9NQUlOX0ZJTEUiLAorICAgICAgICAgICAgbmFyZ3M9JyonLAorICAgICAgICAgICAgZGVzdD0neG1sX2RvbWFpbl9maWxlcycsCisgICAgICAgICAgICBkZWZhdWx0PVtdKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tYWRkLWVkZHMnLAorICAgICAgICAgICAgaGVscD0iTGlzdCBvZiBmaWxlcyBpbiBFREQgc3ludGF4IChha2EgXCIucGZ3XCIgZmlsZXMpIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IkVERF9GSUxFIiwKKyAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3InKSwKKyAgICAgICAgICAgIG5hcmdzPScqJywKKyAgICAgICAgICAgIGRlZmF1bHQ9W10sCisgICAgICAgICAgICBkZXN0PSdlZGRfZmlsZXMnKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tc2NoZW1hcy1kaXInLAorICAgICAgICAgICAgaGVscD0iRGlyZWN0b3J5IG9mIHBhcmFtZXRlci1mcmFtZXdvcmsgWE1MIFNjaGVtYXMgZm9yIGdlbmVyYXRpb24gXAorICAgICAgICB2YWxpZGF0aW9uIiwKKyAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSkKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXRhcmdldC1zY2hlbWFzLWRpcicsCisgICAgICAgICAgICBoZWxwPSJJZ25vcmVkLiBLZXB0IGZvciByZXRyby1jb21wYXRpYmlsaXR5IikKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXZhbGlkYXRlJywKKyAgICAgICAgICAgIGhlbHA9IlZhbGlkYXRlIHRoZSBzZXR0aW5ncyBhZ2FpbnN0IFhNTCBzY2hlbWFzIiwKKyAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJib3NlJywKKyAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisKKyAgICByZXR1cm4gYXJncGFyc2VyLnBhcnNlX2FyZ3MoKQorCisjCisjIFBhcnNlcyBhdWRpb19jcml0ZXJpb25fdHlwZXMueG1sIC8gYXVkaW9fY3JpdGVyaWEueG1sIGZpbGVzIHVzZWQgYXQgcnVuIHRpbWUgYnkgdGhlCisjIGVuZ2luZWNvbmZpZ3VyYWJsZSBhbmQgb3V0cHV0cyBhIGRpY3Rpb25uYXJ5IG9mIGNyaXRlcmlhLgorIyBGb3IgZWFjaCBjcml0ZXJpYSwgdGhlIG5hbWUsIHR5cGUgKGFrYSBpbmNsdXNpdmUgKGJpdGZpZWxkKSBvciBleGNsdXNpdmUgKGVudW0pLCB0aGUgdmFsdWVzCisjIGFyZSBwcm92aWRlZC4KKyMKK2RlZiBwYXJzZUNyaXRlcmlhQW5kQ3JpdGVyaW9uVHlwZXMoY3JpdGVyaWFGaWxlLCBjcml0ZXJpb25UeXBlc0ZpbGUpOgorICAgICMgUGFyc2UgY3JpdGVyaWEgYW5kIGNyaXRlcmlvbiB0eXBlcyBYTUwgZmlsZXMKKyAgICAjCisgICAgY3JpdGVyaWFfdHJlZSA9IEVULnBhcnNlKGNyaXRlcmlhRmlsZSkKKyAgICBsb2dnaW5nLmluZm8oIkltcG9ydGluZyBjcml0ZXJpYUZpbGUge30iLmZvcm1hdChjcml0ZXJpYUZpbGUpKQorICAgIGNyaXRlcmlvbl90eXBlc190cmVlID0gRVQucGFyc2UoY3JpdGVyaW9uVHlwZXNGaWxlKQorICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIGNyaXRlcmlvblR5cGVzRmlsZSB7fSIuZm9ybWF0KGNyaXRlcmlvblR5cGVzRmlsZSkpCisKKyAgICBjcml0ZXJpYV9yb290ID0gY3JpdGVyaWFfdHJlZS5nZXRyb290KCkKKyAgICBjcml0ZXJpb25fdHlwZXNfcm9vdCA9IGNyaXRlcmlvbl90eXBlc190cmVlLmdldHJvb3QoKQorCisgICAgYWxsX2NyaXRlcmlhID0gW10KKyAgICBmb3IgY3JpdGVyaW9uIGluIGNyaXRlcmlhX3Jvb3QuZmluZGFsbCgnY3JpdGVyaW9uJyk6CisgICAgICAgIGNyaXRlcmlvbl9uYW1lID0gY3JpdGVyaW9uLmdldCgnbmFtZScpCisgICAgICAgIHR5cGVfbmFtZSA9IGNyaXRlcmlvbi5nZXQoJ3R5cGUnKQorICAgICAgICBsb2dnaW5nLmluZm8oIkltcG9ydGluZyBjcml0ZXJpb25fbmFtZSB7fSIuZm9ybWF0KGNyaXRlcmlvbl9uYW1lKSkKKyAgICAgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgdHlwZV9uYW1lIHt9Ii5mb3JtYXQodHlwZV9uYW1lKSkKKworICAgICAgICBmb3IgY3JpdGVyaW9uX3R5cGVzIGluIGNyaXRlcmlvbl90eXBlc190cmVlLmZpbmRhbGwoJ2NyaXRlcmlvbl90eXBlJyk6CisgICAgICAgICAgICBjcml0ZXJpb25fdHlwZV9uYW1lID0gY3JpdGVyaW9uX3R5cGVzLmdldCgnbmFtZScpCisgICAgICAgICAgICBpZiBjcml0ZXJpb25fdHlwZV9uYW1lID09IHR5cGVfbmFtZToKKyAgICAgICAgICAgICAgICBjcml0ZXJpb25faW5jbHVzaXZlbmVzcyA9IGNyaXRlcmlvbl90eXBlcy5nZXQoJ3R5cGUnKQorCisgICAgICAgICAgICAgICAgY3JpdGVyaW9uX3ZhbHVlcyA9IFtdCisKKyAgICAgICAgICAgICAgICB2YWx1ZXNfbm9kZSA9IGNyaXRlcmlvbl90eXBlcy5maW5kKCd2YWx1ZXMnKQorICAgICAgICAgICAgICAgIGlmIHZhbHVlc19ub2RlOgorICAgICAgICAgICAgICAgICAgICBmb3IgdmFsdWUgaW4gdmFsdWVzX25vZGUuZmluZGFsbCgndmFsdWUnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvbl92YWx1ZXMuYXBwZW5kKHZhbHVlLmdldCgnbGl0ZXJhbCcpKQorCisgICAgICAgICAgICAgICAgaWYgbGVuKGNyaXRlcmlvbl92YWx1ZXMpID09IDA6CisgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvbl92YWx1ZXMuYXBwZW5kKCcnKQorCisgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgY3JpdGVyaW9uX3R5cGVfbmFtZSB7fSIuZm9ybWF0KGNyaXRlcmlvbl90eXBlX25hbWUpKQorICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIGNyaXRlcmlvbl9pbmNsdXNpdmVuZXNzIHt9Ii5mb3JtYXQoY3JpdGVyaW9uX2luY2x1c2l2ZW5lc3MpKQorICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIGNyaXRlcmlvbl92YWx1ZXMge30iLmZvcm1hdChjcml0ZXJpb25fdmFsdWVzKSkKKworICAgICAgICAgICAgICAgIGFsbF9jcml0ZXJpYS5hcHBlbmQoeworICAgICAgICAgICAgICAgICAgICAibmFtZSIgOiBjcml0ZXJpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgImluY2x1c2l2ZSIgOiBjcml0ZXJpb25faW5jbHVzaXZlbmVzcywKKyAgICAgICAgICAgICAgICAgICAgInZhbHVlcyIgOiBjcml0ZXJpb25fdmFsdWVzfSkKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgcmV0dXJuIGFsbF9jcml0ZXJpYQorCisjCisjIFBhcnNlcyB0aGUgRWRkIGZpbGVzIChha2EgLnBmdyBleHRlbnNpb24gZmlsZSksIHdoaWNoIGlzIGEgc2ltcGxpZmllZCBsYW5ndWFnZSB0byB3cml0ZSB0aGUKKyMgcGFyYW1ldGVyIGZyYW1ld29yayBzZXR0aW5ncy4KKyMKK2RlZiBwYXJzZUVkZChFRERGaWxlcyk6CisgICAgcGFyc2VkX2VkZHMgPSBbXQorCisgICAgZm9yIGVkZF9maWxlIGluIEVEREZpbGVzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByb290ID0gRWRkUGFyc2VyLlBhcnNlcigpLnBhcnNlKGVkZF9maWxlKQorICAgICAgICBleGNlcHQgRWRkUGFyc2VyLk15U3ludGF4RXJyb3IgYXMgZXg6CisgICAgICAgICAgICBsb2dnaW5nLmNyaXRpY2FsKHN0cihleCkpCisgICAgICAgICAgICBsb2dnaW5nLmluZm8oIkVYSVQgT04gRkFJTFVSRSIpCisgICAgICAgICAgICBleGl0KDIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcm9vdC5wcm9wYWdhdGUoKQorICAgICAgICBleGNlcHQgRWRkUGFyc2VyLk15UHJvcGFnYXRpb25FcnJvciwgZXggOgorICAgICAgICAgICAgbG9nZ2luZy5jcml0aWNhbChzdHIoZXgpKQorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJFWElUIE9OIEZBSUxVUkUiKQorICAgICAgICAgICAgZXhpdCgxKQorCisgICAgICAgIHBhcnNlZF9lZGRzLmFwcGVuZCgoZWRkX2ZpbGUubmFtZSwgcm9vdCkpCisgICAgcmV0dXJuIHBhcnNlZF9lZGRzCisKKyMKKyMgR2VuZXJhdGVzIGFsbCB0aGUgcmVxdWlyZWQgY29tbWFuZHMgdG8gYmUgc2VudCB0byB0aGUgaW5zdGFuY2Ugb2YgcGFyYW1ldGVyLWZyYW1ld29yayBsYXVuY2hlZAorIyBhdCBydW50aW1lIHRvIGdlbmVyYXRlIHRoZSBYTUwgU2V0dGluZ3MgZmlsZS4KKyMgSXQgdGFrZXMgYXMgaW5wdXQgdGhlIGNvbGxlY3Rpb24gb2YgY3JpdGVyaWEsIHRoZSBkb21haW5zIGFuZCB0aGUgc2ltcGxpZmllZCBzZXR0aW5ncyByZWFkIGZyb20KKyMgcGZ3LgorIworZGVmIGdlbmVyYXRlRG9tYWluQ29tbWFuZHMobG9nZ2luZywgYWxsX2NyaXRlcmlhLCBpbml0aWFsX3NldHRpbmdzLCB4bWxfZG9tYWluX2ZpbGVzLCBwYXJzZWRfZWRkcyk6CisgICAgICAgICMgY3JlYXRlIGFuZCBpbmplY3QgYWxsIHRoZSBjcml0ZXJpYQorICAgICAgICBsb2dnaW5nLmluZm8oIkNyZWF0aW5nIGFsbCBjcml0ZXJpYSIpCisgICAgICAgIGZvciBjcml0ZXJpb24gaW4gYWxsX2NyaXRlcmlhOgorICAgICAgICAgICAgeWllbGQgWyJjcmVhdGVTZWxlY3Rpb25Dcml0ZXJpb24iLCBjcml0ZXJpb25bJ2luY2x1c2l2ZSddLAorICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvblsnbmFtZSddXSArIGNyaXRlcmlvblsndmFsdWVzJ10KKworICAgICAgICB5aWVsZCBbInN0YXJ0Il0KKworICAgICAgICAjIEltcG9ydCBpbml0aWFsIHNldHRpbmdzIGZpbGUKKyAgICAgICAgaWYgaW5pdGlhbF9zZXR0aW5nczoKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIGluaXRpYWwgc2V0dGluZ3MgZmlsZSB7fSIuZm9ybWF0KGluaXRpYWxfc2V0dGluZ3MpKQorICAgICAgICAgICAgeWllbGQgWyJpbXBvcnREb21haW5zV2l0aFNldHRpbmdzWE1MIiwgaW5pdGlhbF9zZXR0aW5nc10KKworICAgICAgICAjIEltcG9ydCBlYWNoIHN0YW5kYWxvbmUgZG9tYWluIGZpbGVzCisgICAgICAgIGZvciBkb21haW5fZmlsZSBpbiB4bWxfZG9tYWluX2ZpbGVzOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgc2luZ2xlIGRvbWFpbiBmaWxlIHt9Ii5mb3JtYXQoZG9tYWluX2ZpbGUpKQorICAgICAgICAgICAgeWllbGQgWyJpbXBvcnREb21haW5XaXRoU2V0dGluZ3NYTUwiLCBkb21haW5fZmlsZV0KKworICAgICAgICAjIEdlbmVyYXRlIHRoZSBzY3JpcHQgZm9yIGVhY2ggRUREIGZpbGUKKyAgICAgICAgZm9yIGZpbGVuYW1lLCBwYXJzZWRfZWRkIGluIHBhcnNlZF9lZGRzOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJUcmFuc2xhdGluZyBhbmQgaW5qZWN0aW5nIEVERCBmaWxlIHt9Ii5mb3JtYXQoZmlsZW5hbWUpKQorICAgICAgICAgICAgdHJhbnNsYXRvciA9IFBmd1NjcmlwdFRyYW5zbGF0b3IoKQorICAgICAgICAgICAgcGFyc2VkX2VkZC50cmFuc2xhdGUodHJhbnNsYXRvcikKKyAgICAgICAgICAgIGZvciBjb21tYW5kIGluIHRyYW5zbGF0b3IuZ2V0U2NyaXB0KCk6CisgICAgICAgICAgICAgICAgeWllbGQgY29tbWFuZAorCisjCisjIEVudHJ5IHBvaW50IG9mIHRoZSBkb21haW4gZ2VuZXJhdG9yLgorIyAgICAgICAtUGFyc2VzIENyaXRlcmlvbiB0eXBlcyBhbmQgY3JpdGVyaWEgZmlsZXMKKyMgICAgICAgLVBhcnNlcyBzZXR0aW5ncyB3cml0dGVuIGluIHNpbXBsaWZpZWQgcGZ3IGxhbmd1YWdlLgorIyAgICAgICAtTGF1bmNoZXMgYSBwYXJhbWV0ZXItZnJhbWV3b3JrCisjICAgICAgIC1UcmFuc2xhdGVzIHRoZSBzZXR0aW5ncyBpbnRvIGNvbW1hbmQgdGhhdCBjYW4gYmUgaW50ZXJwcmV0ZWQgYnkgcGFyYW1ldGVyLWZyYW1ld29yay4KKyMgICAgICAgLVVzZSB0aGUgZXhwb3J0cyBjb21tYW5kIGFuZCBvdXRwdXQgdGhlbSBpbiBYTUwgU2V0dGluZ3MgZmlsZS4KKyMKK2RlZiBtYWluKCk6CisgICAgbG9nZ2luZy5yb290LnNldExldmVsKGxvZ2dpbmcuSU5GTykKKyAgICBhcmdzID0gcGFyc2VBcmdzKCkKKworICAgIGFsbF9jcml0ZXJpYSA9IHBhcnNlQ3JpdGVyaWFBbmRDcml0ZXJpb25UeXBlcyhhcmdzLmNyaXRlcmlhLCBhcmdzLmNyaXRlcmlvbnR5cGVzKQorCisgICAgIworICAgICMgRUREIGZpbGVzIChha2EgIi5wZnciIGZpbGVzKQorICAgICMKKyAgICBwYXJzZWRfZWRkcyA9IHBhcnNlRWRkKGFyZ3MuZWRkX2ZpbGVzKQorCisgICAgIyBXZSBuZWVkIHRvIG1vZGlmeSB0aGUgdG9wbGV2ZWwgY29uZmlndXJhdGlvbiBmaWxlIHRvIGFjY291bnQgZm9yIGRpZmZlcmVuY2VzCisgICAgIyBiZXR3ZWVuIGRldmVsb3BtZW50IHNldHVwIGFuZCB0YXJnZXQgKGluc3RhbGxhdGlvbikgc2V0dXAsIGluIHBhcnRpY3VsYXIsIHRoZQorICAgICMgVHVuaW5nTXdpdGggb2RlIG11c3QgYmUgZW5mb3JjZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB3aWxsIGJlIGFsbG93ZWQgb24gdGhlIHRhcmdldAorICAgIGZha2VfdG9wbGV2ZWxfY29uZmlnID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKG1vZGU9J3cnLCBkZWxldGU9RmFsc2UsIHN1ZmZpeD0iLnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4PSJUTVBkb21haW5HZW5lcmF0b3JQRkNvbmZpZ18iKQorCisgICAgaW5zdGFsbF9wYXRoID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgoYXJncy50b3BsZXZlbF9jb25maWcpKQorICAgIGhvc3RDb25maWcuY29uZmlndXJlKAorICAgICAgICAgICAgaW5maWxlPWFyZ3MudG9wbGV2ZWxfY29uZmlnLAorICAgICAgICAgICAgb3V0ZmlsZT1mYWtlX3RvcGxldmVsX2NvbmZpZywKKyAgICAgICAgICAgIHN0cnVjdFBhdGg9aW5zdGFsbF9wYXRoKQorICAgIGZha2VfdG9wbGV2ZWxfY29uZmlnLmNsb3NlKCkKKworICAgICMgQ3JlYXRlIHRoZSBjb25uZWN0b3IuIFBpcGUgaXRzIGlucHV0IHRvIHVzIGluIG9yZGVyIHRvIHdyaXRlIGNvbW1hbmRzOworICAgICMgY29ubmVjdCBpdHMgb3V0cHV0IHRvIHN0ZG91dCBpbiBvcmRlciB0byBoYXZlIGl0IGR1bXAgdGhlIGRvbWFpbnMKKyAgICAjIHRoZXJlOyBjb25uZWN0IGl0cyBlcnJvciBvdXRwdXQgdG8gc3RkZXJyLgorICAgIGNvbm5lY3RvciA9IHN1YnByb2Nlc3MuUG9wZW4oWyJkb21haW5HZW5lcmF0b3JDb25uZWN0b3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZha2VfdG9wbGV2ZWxfY29uZmlnLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcmJvc2UnIGlmIGFyZ3MudmVyYm9zZSBlbHNlICduby12ZXJib3NlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsaWRhdGUnIGlmIGFyZ3MudmFsaWRhdGUgZWxzZSAnbm8tdmFsaWRhdGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Muc2NoZW1hc19kaXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN5cy5zdGRvdXQsIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN5cy5zdGRlcnIpCisKKyAgICBpbml0aWFsX3NldHRpbmdzID0gTm9uZQorICAgIGlmIGFyZ3MuaW5pdGlhbF9zZXR0aW5nczoKKyAgICAgICAgaW5pdGlhbF9zZXR0aW5ncyA9IG9zLnBhdGgucmVhbHBhdGgoYXJncy5pbml0aWFsX3NldHRpbmdzKQorCisgICAgZm9yIGNvbW1hbmQgaW4gZ2VuZXJhdGVEb21haW5Db21tYW5kcyhsb2dnaW5nLCBhbGxfY3JpdGVyaWEsIGluaXRpYWxfc2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnhtbF9kb21haW5fZmlsZXMsIHBhcnNlZF9lZGRzKToKKyAgICAgICAgY29ubmVjdG9yLnN0ZGluLndyaXRlKCdcMCcuam9pbihjb21tYW5kKSkKKyAgICAgICAgY29ubmVjdG9yLnN0ZGluLndyaXRlKCJcbiIpCisKKyAgICAjIENsb3NpbmcgdGhlIGNvbm5lY3RvcidzIGlucHV0IHRyaWdnZXJzIHRoZSBkb21haW4gZ2VuZXJhdGlvbgorICAgIGNvbm5lY3Rvci5zdGRpbi5jbG9zZSgpCisgICAgY29ubmVjdG9yLndhaXQoKQorICAgIG9zLnJlbW92ZShmYWtlX3RvcGxldmVsX2NvbmZpZy5uYW1lKQorICAgIHJldHVybiBjb25uZWN0b3IucmV0dXJuY29kZQorCisjIElmIHRoaXMgZmlsZSBpcyBkaXJlY3RseSBleGVjdXRlZAoraWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBleGl0KG1haW4oKSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9wcm92aXNpb25fY3JpdGVyaW9uX3R5cGVzX2Zyb21fYW5kcm9pZF9oZWFkZXJzLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL3Byb3Zpc2lvbl9jcml0ZXJpb25fdHlwZXNfZnJvbV9hbmRyb2lkX2hlYWRlcnMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWViZGZkNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9wcm92aXNpb25fY3JpdGVyaW9uX3R5cGVzX2Zyb21fYW5kcm9pZF9oZWFkZXJzLm1rCkBAIC0wLDAgKzEsMjMgQEAKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKKworJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9DUklURVJJT05fVFlQRVNfRklMRSA6PSAkKENSSVRFUklPTl9UWVBFU19GSUxFKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9BTkRST0lEX0FVRElPX0JBU0VfSEVBREVSX0ZJTEUgOj0gJChBTkRST0lEX0FVRElPX0JBU0VfSEVBREVSX0ZJTEUpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0FVRElPX1BPTElDWV9DT05GSUdVUkFUSU9OX0ZJTEUgOj0gJChBVURJT19QT0xJQ1lfQ09ORklHVVJBVElPTl9GSUxFKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9DUklURVJJT05fVE9PTCA6PSAkKEhPU1RfT1VUKS9iaW4vYnVpbGRQb2xpY3lDcml0ZXJpb25UeXBlcy5weQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1JFUVVJUkVEX01PRFVMRVMpICQoTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMpIFwKKyAgICAkKENSSVRFUklPTl9UWVBFU19GSUxFKSBcCisgICAgJChBTkRST0lEX0FVRElPX0JBU0VfSEVBREVSX0ZJTEUpCisKKwkiJChNWV9DUklURVJJT05fVE9PTCkiIFwKKwkJLS1hbmRyb2lkYXVkaW9iYXNlaGVhZGVyICIkKE1ZX0FORFJPSURfQVVESU9fQkFTRV9IRUFERVJfRklMRSkiIFwKKwkJLS1hdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlICIkKE1ZX0FVRElPX1BPTElDWV9DT05GSUdVUkFUSU9OX0ZJTEUpIiBcCisJCS0tY3JpdGVyaW9udHlwZXMgIiQoTVlfQ1JJVEVSSU9OX1RZUEVTX0ZJTEUpIiBcCisJCS0tb3V0cHV0ZmlsZSAiJChAKSIKKworIyBDbGVhciB2YXJpYWJsZXMgZm9yIGZ1cnRoZXIgdXNlCitDUklURVJJT05fVFlQRVNfRklMRSA6PQorQU5EUk9JRF9BVURJT19CQVNFX0hFQURFUl9GSUxFIDo9CitBVURJT19QT0xJQ1lfQ09ORklHVVJBVElPTl9GSUxFIDo9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvcHJvdmlzaW9uX3N0cmF0ZWdpZXNfc3RydWN0dXJlLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL3Byb3Zpc2lvbl9zdHJhdGVnaWVzX3N0cnVjdHVyZS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmM5MzhjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL3Byb3Zpc2lvbl9zdHJhdGVnaWVzX3N0cnVjdHVyZS5tawpAQCAtMCwwICsxLDIxIEBACitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCisKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogTVlfU1RSQVRFR0lFU19TVFJVQ1RVUkVfRklMRSA6PSAkKFNUUkFURUdJRVNfU1RSVUNUVVJFX0ZJTEUpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0FVRElPX1BPTElDWV9FTkdJTkVfQ09ORklHVVJBVElPTl9GSUxFIDo9ICQoQVVESU9fUE9MSUNZX0VOR0lORV9DT05GSUdVUkFUSU9OX0ZJTEUpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX1BST1ZJU0lPTl9UT09MIDo9ICQoSE9TVF9PVVQpL2Jpbi9idWlsZFN0cmF0ZWdpZXNTdHJ1Y3R1cmVGaWxlLnB5CiskKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUkVRVUlSRURfTU9EVUxFUykgJChMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUykgXAorICAgIGJ1aWxkU3RyYXRlZ2llc1N0cnVjdHVyZUZpbGUucHkgXAorICAgICQoU1RSQVRFR0lFU19TVFJVQ1RVUkVfRklMRSkgXAorICAgICQoQVVESU9fUE9MSUNZX0VOR0lORV9DT05GSUdVUkFUSU9OX0ZJTEUpCisKKwkiJChNWV9QUk9WSVNJT05fVE9PTCkiIFwKKwkJLS1hdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYXRpb25maWxlICIkKE1ZX0FVRElPX1BPTElDWV9FTkdJTkVfQ09ORklHVVJBVElPTl9GSUxFKSIgXAorCQktLXByb2R1Y3RzdHJhdGVnaWVzc3RydWN0dXJlZmlsZSAiJChNWV9TVFJBVEVHSUVTX1NUUlVDVFVSRV9GSUxFKSIgXAorCQktLW91dHB1dGZpbGUgIiQoQCkiCisKKyMgQ2xlYXIgdmFyaWFibGVzIGZvciBmdXJ0aGVyIHVzZQorU1RSQVRFR0lFU19TVFJVQ1RVUkVfRklMRSA6PQorQVVESU9fUE9MSUNZX0VOR0lORV9DT05GSUdVUkFUSU9OX0ZJTEUgOj0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLm1rCmluZGV4IDM2ZTBmNDIuLmM3ZDhkMzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvQW5kcm9pZC5tawpAQCAtMTAsMTMgKzEwLDIyIEBACiAgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlIFwKICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzL2NvbnZlcnQgXAorICAgIGV4dGVybmFsL2xpYnhtbDIvaW5jbHVkZSBcCisgICAgZXh0ZXJuYWwvaWN1L2ljdTRjL3NvdXJjZS9jb21tb24KIAotTE9DQUxfU1JDX0ZJTEVTOj0gUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuY3BwCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYnBhcmFtZXRlciBcCi0gICAgbGlibWVkaWFfaGVscGVyCisgICAgbGlibWVkaWFfaGVscGVyIFwKKyAgICBsaWJ4bWwyCisKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmF1ZGlvcG9saWN5Y29tbW9uCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwogCiBMT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQogCkBAIC0yOCwxNSArMzcsMyBAQAogCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDT05GSUdVUkFUSU9OIEZJTEUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIHNwZWNpZmljIG1hbmFnZW1lbnQgb2YgYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0VUQykKLUxPQ0FMX1NSQ19GSUxFUyA6PSBjb25maWcvJChMT0NBTF9NT0RVTEUpCi1pbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAKaW5kZXggOWIwNDQyZS4uNGI1NzQ0NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmNwcApAQCAtMTgsNyArMTgsNiBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCiAjaW5jbHVkZSAiUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuaCIKLSNpbmNsdWRlICJhdWRpb19wb2xpY3lfY3JpdGVyaWFfY29uZi5oIgogI2luY2x1ZGUgPFBhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yLmg+CiAjaW5jbHVkZSA8U2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZS5oPgogI2luY2x1ZGUgPFNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZS5oPgpAQCAtNTYsMTUgKzU1LDM3IEBACiAgICAgfQogfTsKIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKIAogdXNpbmcgdXRpbGl0aWVzOjpjb252ZXJ0VG87CiAKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgeworCiBjb25zdCBjaGFyICpjb25zdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bVBvbGljeVBmd0RlZmF1bHRDb25mRmlsZU5hbWUgPQogICAgICIvZXRjL3BhcmFtZXRlci1mcmFtZXdvcmsvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwiOworY29uc3QgY2hhciAqY29uc3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6Om1Qb2xpY3lQZndWZW5kb3JDb25mRmlsZU5hbWUgPQorICAgICIvdmVuZG9yL2V0Yy9wYXJhbWV0ZXItZnJhbWV3b3JrL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sIjsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdJbnB1dERldmljZUNyaXRlcmlvbk5hbWUgPSAiQXZhaWxhYmxlSW5wdXREZXZpY2VzIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnT3V0cHV0RGV2aWNlQ3JpdGVyaW9uTmFtZSA9ICJBdmFpbGFibGVPdXRwdXREZXZpY2VzIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnUGhvbmVTdGF0ZUNyaXRlcmlvbk5hbWUgPSAiVGVsZXBob255TW9kZSI7CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ091dHB1dERldmljZUFkZHJlc3NDcml0ZXJpb25OYW1lID0gIkF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMiOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdJbnB1dERldmljZUFkZHJlc3NDcml0ZXJpb25OYW1lID0gIkF2YWlsYWJsZUlucHV0RGV2aWNlc0FkZHJlc3NlcyI7CisKKy8qKgorICogT3JkZXIgTVVTVCBiZSBhbGlnbiB3aXRoIGRlZmludGlpb24gb2YgYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHdpdGhpbiBhdWRpb19wb2xpY3kuaAorICovCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ0ZvcmNlVXNlQ3JpdGVyaW9uVGFnW0FVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UXSA9Cit7CisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0gPSAgICAgICAgIkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIsCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdID0gICAgICAgICAgICAgICAgIkZvcmNlVXNlRm9yTWVkaWEiLAorICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0gPSAgICAgICAgICAgICAgICJGb3JjZVVzZUZvclJlY29yZCIsCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DS10gPSAgICAgICAgICAgICAgICAgIkZvcmNlVXNlRm9yRG9jayIsCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSA9ICAgICAgICAgICAgICAgIkZvcmNlVXNlRm9yU3lzdGVtIiwKKyAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJT10gPSAgICAiRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8iLAorICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkRdID0gICAgICJGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZCIsCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfVklCUkFURV9SSU5HSU5HXSA9ICAgICAgIkZvcmNlVXNlRm9yVmlicmF0ZVJpbmdpbmciCit9OwogCiB0ZW1wbGF0ZSA8Pgogc3RydWN0IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpwYXJhbWV0ZXJNYW5hZ2VyRWxlbWVudFN1cHBvcnRlZDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPiB7fTsKQEAgLTc1LDE4ICs5Niw0MyBAQAogICAgIDogbVBmd0Nvbm5lY3RvckxvZ2dlcihuZXcgUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3JMb2dnZXIpCiB7CiAgICAgLy8gQ29ubmVjdG9yCi0gICAgbVBmd0Nvbm5lY3RvciA9IG5ldyBDUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3IobVBvbGljeVBmd0RlZmF1bHRDb25mRmlsZU5hbWUpOworICAgIGlmIChhY2Nlc3MobVBvbGljeVBmd1ZlbmRvckNvbmZGaWxlTmFtZSwgUl9PSykgPT0gMCkgeworICAgICAgICBtUGZ3Q29ubmVjdG9yID0gbmV3IENQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvcihtUG9saWN5UGZ3VmVuZG9yQ29uZkZpbGVOYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtUGZ3Q29ubmVjdG9yID0gbmV3IENQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvcihtUG9saWN5UGZ3RGVmYXVsdENvbmZGaWxlTmFtZSk7CisgICAgfQogCiAgICAgLy8gTG9nZ2VyCiAgICAgbVBmd0Nvbm5lY3Rvci0+c2V0TG9nZ2VyKG1QZndDb25uZWN0b3JMb2dnZXIpOworfQogCi0gICAgLy8gTG9hZCBjcml0ZXJpYSBmaWxlCi0gICAgaWYgKChsb2FkQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZpZyhnQXVkaW9Qb2xpY3lDcml0ZXJpYVZlbmRvckNvbmZGaWxlUGF0aCkgIT0gTk9fRVJST1IpICYmCi0gICAgICAgIChsb2FkQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZpZyhnQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZGaWxlUGF0aCkgIT0gTk9fRVJST1IpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTmVpdGhlciB2ZW5kb3IgY29uZiBmaWxlICglcykgbm9yIHN5c3RlbSBjb25mIGZpbGUgKCVzKSBjb3VsZCBiZSBmb3VuZCIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZ0F1ZGlvUG9saWN5Q3JpdGVyaWFWZW5kb3JDb25mRmlsZVBhdGgsCi0gICAgICAgICAgICAgIGdBdWRpb1BvbGljeUNyaXRlcmlhQ29uZkZpbGVQYXRoKTsKK3N0YXR1c190IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjphZGRDcml0ZXJpb24oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGJvb2wgaXNJbmNsdXNpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlUGFpcnMgcGFpcnMsIGNvbnN0IHN0ZDo6c3RyaW5nICZkZWZhdWx0VmFsdWUpCit7CisgICAgQUxPR19BU1NFUlQobm90IGlzU3RhcnRlZCgpLCAiQ2Fubm90IGFkZCBhIGNyaXRlcmlvbiBpZiBQRlcgaXMgYWxyZWFkeSBzdGFydGVkIik7CisgICAgYXV0byBjcml0ZXJpb25UeXBlID0gbVBmd0Nvbm5lY3Rvci0+Y3JlYXRlU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZShpc0luY2x1c2l2ZSk7CisKKyAgICBmb3IgKGF1dG8gcGFpciA6IHBhaXJzKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGVycm9yOworICAgICAgICBBTE9HVigiJXM6IEFkZGluZyBwYWlyICVkLCVzIGZvciBjcml0ZXJpb25UeXBlICVzIiwgX19GVU5DVElPTl9fLCBwYWlyLmZpcnN0LAorICAgICAgICAgICAgICBwYWlyLnNlY29uZC5jX3N0cigpLCBuYW1lLmNfc3RyKCkpOworICAgICAgICBjcml0ZXJpb25UeXBlLT5hZGRWYWx1ZVBhaXIocGFpci5maXJzdCwgcGFpci5zZWNvbmQsIGVycm9yKTsKICAgICB9CisgICAgQUxPR19BU1NFUlQobVBvbGljeUNyaXRlcmlhLmZpbmQobmFtZSkgPT0gbVBvbGljeUNyaXRlcmlhLmVuZCgpLAorICAgICAgICAgICAgICAgICIlczogQ3JpdGVyaW9uICVzIGFscmVhZHkgYWRkZWQiLCBfX0ZVTkNUSU9OX18sIG5hbWUuY19zdHIoKSk7CisKKyAgICBhdXRvIGNyaXRlcmlvbiA9IG1QZndDb25uZWN0b3ItPmNyZWF0ZVNlbGVjdGlvbkNyaXRlcmlvbihuYW1lLCBjcml0ZXJpb25UeXBlKTsKKyAgICBtUG9saWN5Q3JpdGVyaWFbbmFtZV0gPSBjcml0ZXJpb247CisKKyAgICBpZiAobm90IGRlZmF1bHRWYWx1ZS5lbXB0eSgpKSB7CisgICAgICAgIGludCBudW1lcmljYWxWYWx1ZSA9IDA7CisgICAgICAgIGlmIChub3QgY3JpdGVyaW9uVHlwZS0+Z2V0TnVtZXJpY2FsVmFsdWUoZGVmYXVsdFZhbHVlLmNfc3RyKCksIG51bWVyaWNhbFZhbHVlKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOyB0cnlpbmcgdG8gYXBwbHkgaW52YWxpZCBkZWZhdWx0IGxpdGVyYWwgdmFsdWUgKCVzKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBjcml0ZXJpb24tPnNldENyaXRlcmlvblN0YXRlKG51bWVyaWNhbFZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6flBhcmFtZXRlck1hbmFnZXJXcmFwcGVyKCkKQEAgLTExMiwxMTIgKzE1OCw2IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi0KLXZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmFkZENyaXRlcmlvblR5cGUoY29uc3Qgc3RyaW5nICZ0eXBlTmFtZSwgYm9vbCBpc0luY2x1c2l2ZSkKLXsKLSAgICBBTE9HX0FTU0VSVChtUG9saWN5Q3JpdGVyaW9uVHlwZXMuZmluZCh0eXBlTmFtZSkgPT0gbVBvbGljeUNyaXRlcmlvblR5cGVzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICJDcml0ZXJpb25UeXBlICVzIGFscmVhZHkgYWRkZWQiLCB0eXBlTmFtZS5jX3N0cigpKTsKLSAgICBBTE9HRCgiJXM6IEFkZGluZyBuZXcgY3JpdGVyaW9uVHlwZSAlcyIsIF9fRlVOQ1RJT05fXywgdHlwZU5hbWUuY19zdHIoKSk7Ci0KLSAgICBtUG9saWN5Q3JpdGVyaW9uVHlwZXNbdHlwZU5hbWVdID0gbVBmd0Nvbm5lY3Rvci0+Y3JlYXRlU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZShpc0luY2x1c2l2ZSk7Ci19Ci0KLXZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmFkZENyaXRlcmlvblR5cGVWYWx1ZVBhaXIoCi0gICAgY29uc3Qgc3RyaW5nICZ0eXBlTmFtZSwKLSAgICB1aW50MzJfdCBudW1lcmljVmFsdWUsCi0gICAgY29uc3Qgc3RyaW5nICZsaXRlcmFsVmFsdWUpCi17Ci0gICAgQUxPR19BU1NFUlQobVBvbGljeUNyaXRlcmlvblR5cGVzLmZpbmQodHlwZU5hbWUpICE9IG1Qb2xpY3lDcml0ZXJpb25UeXBlcy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAiQ3JpdGVyaW9uVHlwZSAlcyBub3QgZm91bmQiLCB0eXBlTmFtZS5jX3N0cigpKTsKLSAgICBBTE9HVigiJXM6IEFkZGluZyBuZXcgdmFsdWUgcGFpciAoJWQsJXMpIGZvciBjcml0ZXJpb25UeXBlICVzIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgIG51bWVyaWNWYWx1ZSwgbGl0ZXJhbFZhbHVlLmNfc3RyKCksIHR5cGVOYW1lLmNfc3RyKCkpOwotICAgIElTZWxlY3Rpb25Dcml0ZXJpb25UeXBlSW50ZXJmYWNlICpjcml0ZXJpb25UeXBlID0gbVBvbGljeUNyaXRlcmlvblR5cGVzW3R5cGVOYW1lXTsKLSAgICBzdGQ6OnN0cmluZyBlcnJvcjsKLSAgICBjcml0ZXJpb25UeXBlLT5hZGRWYWx1ZVBhaXIobnVtZXJpY1ZhbHVlLCBsaXRlcmFsVmFsdWUsIGVycm9yKTsKLX0KLQotdm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZENyaXRlcmlvblR5cGUoY25vZGUgKnJvb3QsIGJvb2wgaXNJbmNsdXNpdmUpCi17Ci0gICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7Ci0gICAgY25vZGUgKm5vZGU7Ci0gICAgZm9yIChub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7IG5vZGUgIT0gTlVMTDsgbm9kZSA9IG5vZGUtPm5leHQpIHsKLQotICAgICAgICBBTE9HX0FTU0VSVChub2RlICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKLSAgICAgICAgY29uc3QgY2hhciAqdHlwZU5hbWUgPSBub2RlLT5uYW1lOwotICAgICAgICBjaGFyICp2YWx1ZU5hbWVzID0gc3RybmR1cChub2RlLT52YWx1ZSwgc3RybGVuKG5vZGUtPnZhbHVlKSk7Ci0KLSAgICAgICAgYWRkQ3JpdGVyaW9uVHlwZSh0eXBlTmFtZSwgaXNJbmNsdXNpdmUpOwotCi0gICAgICAgIHVpbnQzMl90IGluZGV4ID0gMDsKLSAgICAgICAgY2hhciAqY3R4OwotICAgICAgICBjaGFyICp2YWx1ZU5hbWUgPSBzdHJ0b2tfcih2YWx1ZU5hbWVzLCAiLCIsICZjdHgpOwotICAgICAgICB3aGlsZSAodmFsdWVOYW1lICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChzdHJsZW4odmFsdWVOYW1lKSAhPSAwKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBDb25mIGZpbGUgbWF5IHVzZSBvciBub3QgcGFpciwgaWYgbm8gcGFpciwgdXNlIGluY3JlbWVudGFsIGluZGV4LCBlbHNlCi0gICAgICAgICAgICAgICAgLy8gdXNlIHByb3ZpZGVkIGluZGV4LgotICAgICAgICAgICAgICAgIGlmIChzdHJjaHIodmFsdWVOYW1lLCAnOicpICE9IE5VTEwpIHsKLQotICAgICAgICAgICAgICAgICAgICBjaGFyICpmaXJzdCA9IHN0cnRvayh2YWx1ZU5hbWUsICI6Iik7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgKnNlY29uZCA9IHN0cnRvayhOVUxMLCAiOiIpOwotICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVCgoZmlyc3QgIT0gTlVMTCkgJiYgKHN0cmxlbihmaXJzdCkgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlY29uZCAhPSBOVUxMKSAmJiAoc3RybGVuKHNlY29uZCkgIT0gMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHZhbHVlIHBhaXIiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnZlcnRUbzxzdHJpbmcsIHVpbnQzMl90PihmaXJzdCwgaW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgaW5kZXgoJXMpIGZvdW5kIiwgX19GVU5DVElPTl9fLCBmaXJzdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYWRkQ3JpdGVyaW9uVHlwZVZhbHVlUGFpcih0eXBlTmFtZSwgaW5kZXgsIHNlY29uZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwZndJbmRleCA9IGlzSW5jbHVzaXZlID8gMSA8PCBpbmRleCA6IGluZGV4OwotICAgICAgICAgICAgICAgICAgICBhZGRDcml0ZXJpb25UeXBlVmFsdWVQYWlyKHR5cGVOYW1lLCBwZndJbmRleCwgdmFsdWVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWx1ZU5hbWUgPSBzdHJ0b2tfcihOVUxMLCAiLCIsICZjdHgpOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUodmFsdWVOYW1lcyk7Ci0gICAgfQotfQotCi12b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpsb2FkSW5jbHVzaXZlQ3JpdGVyaW9uVHlwZShjbm9kZSAqcm9vdCkKLXsKLSAgICBBTE9HX0FTU0VSVChyb290ICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIGdJbmNsdXNpdmVDcml0ZXJpb25UeXBlVGFnLmNfc3RyKCkpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2FkQ3JpdGVyaW9uVHlwZShub2RlLCB0cnVlKTsKLX0KLQotdm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZEV4Y2x1c2l2ZUNyaXRlcmlvblR5cGUoY25vZGUgKnJvb3QpCi17Ci0gICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBnRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZVRhZy5jX3N0cigpKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbG9hZENyaXRlcmlvblR5cGUobm9kZSwgZmFsc2UpOwotfQotCi12b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpwYXJzZUNoaWxkcmVuKGNub2RlICpyb290LCBzdHJpbmcgJmRlZmF1bHRWYWx1ZSwgc3RyaW5nICZ0eXBlKQotewotICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOwotICAgIGNub2RlICpub2RlOwotICAgIGZvciAobm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOyBub2RlICE9IE5VTEw7IG5vZGUgPSBub2RlLT5uZXh0KSB7Ci0gICAgICAgIEFMT0dfQVNTRVJUKG5vZGUgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOwotCi0gICAgICAgIGlmIChzdHJpbmcobm9kZS0+bmFtZSkgPT0gZ0RlZmF1bHRUYWcpIHsKLSAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IG5vZGUtPnZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmluZyhub2RlLT5uYW1lKSA9PSBnVHlwZVRhZykgewotICAgICAgICAgICAgdHlwZSA9IG5vZGUtPnZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIEFMT0dFKCIlczogVW5yZWNvZ25pemVkICVzICVzIG5vZGUiLCBfX0ZVTkNUSU9OX18sIG5vZGUtPm5hbWUsIG5vZGUtPnZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBUICpQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6Z2V0RWxlbWVudChjb25zdCBzdHJpbmcgJm5hbWUsIHN0ZDo6bWFwPHN0cmluZywgVCAqPiAmZWxlbWVudHNNYXApCiB7CkBAIC0yMzYsOTcgKzE3Niw2IEBACiAgICAgcmV0dXJuIGl0ICE9IGVsZW1lbnRzTWFwLmVuZCgpID8gaXQtPnNlY29uZCA6IE5VTEw7CiB9CiAKLXZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmxvYWRDcml0ZXJpYShjbm9kZSAqcm9vdCkKLXsKLSAgICBBTE9HX0FTU0VSVChyb290ICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIGdDcml0ZXJpb25UYWcuY19zdHIoKSk7Ci0KLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCIlczogbm8gaW5jbHVzaXZlIGNyaXRlcmlhIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsgbm9kZSAhPSBOVUxMOyBub2RlID0gbm9kZS0+bmV4dCkgewotICAgICAgICBsb2FkQ3JpdGVyaW9uKG5vZGUpOwotICAgIH0KLX0KLQotdm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6YWRkQ3JpdGVyaW9uKGNvbnN0IHN0cmluZyAmbmFtZSwgY29uc3Qgc3RyaW5nICZ0eXBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyAmZGVmYXVsdExpdGVyYWxWYWx1ZSkKLXsKLSAgICBBTE9HX0FTU0VSVChtUG9saWN5Q3JpdGVyaWEuZmluZChuYW1lKSA9PSBtUG9saWN5Q3JpdGVyaWEuZW5kKCksCi0gICAgICAgICAgICAgICAgIlJvdXRlIENyaXRlcmlvbiAlcyBhbHJlYWR5IGFkZGVkIiwgbmFtZS5jX3N0cigpKTsKLQotICAgIElTZWxlY3Rpb25Dcml0ZXJpb25UeXBlSW50ZXJmYWNlICpjcml0ZXJpb25UeXBlID0KLSAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvblR5cGVJbnRlcmZhY2U+KHR5cGVOYW1lLCBtUG9saWN5Q3JpdGVyaW9uVHlwZXMpOwotCi0gICAgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KLSAgICAgICAgICAgIG1QZndDb25uZWN0b3ItPmNyZWF0ZVNlbGVjdGlvbkNyaXRlcmlvbihuYW1lLCBjcml0ZXJpb25UeXBlKTsKLQotICAgIG1Qb2xpY3lDcml0ZXJpYVtuYW1lXSA9IGNyaXRlcmlvbjsKLSAgICBpbnQgbnVtZXJpY2FsVmFsdWUgPSAwOwotICAgIGlmICghY3JpdGVyaW9uVHlwZS0+Z2V0TnVtZXJpY2FsVmFsdWUoZGVmYXVsdExpdGVyYWxWYWx1ZS5jX3N0cigpLCAgbnVtZXJpY2FsVmFsdWUpKSB7Ci0gICAgICAgIEFMT0dFKCIlczsgdHJ5aW5nIHRvIGFwcGx5IGludmFsaWQgZGVmYXVsdCBsaXRlcmFsIHZhbHVlICglcykiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgIGRlZmF1bHRMaXRlcmFsVmFsdWUuY19zdHIoKSk7Ci0gICAgfQotICAgIGNyaXRlcmlvbi0+c2V0Q3JpdGVyaW9uU3RhdGUobnVtZXJpY2FsVmFsdWUpOwotfQotCi12b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpsb2FkQ3JpdGVyaW9uKGNub2RlICpyb290KQotewotICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOwotICAgIGNvbnN0IGNoYXIgKmNyaXRlcmlvbk5hbWUgPSByb290LT5uYW1lOwotCi0gICAgQUxPR19BU1NFUlQobVBvbGljeUNyaXRlcmlhLmZpbmQoY3JpdGVyaW9uTmFtZSkgPT0gbVBvbGljeUNyaXRlcmlhLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICJDcml0ZXJpb24gJXMgYWxyZWFkeSBhZGRlZCIsIGNyaXRlcmlvbk5hbWUpOwotCi0gICAgc3RyaW5nIHBhcmFtS2V5TmFtZSA9ICIiOwotICAgIHN0cmluZyBwYXRoID0gIiI7Ci0gICAgc3RyaW5nIHR5cGVOYW1lID0gIiI7Ci0gICAgc3RyaW5nIGRlZmF1bHRWYWx1ZSA9ICIiOwotCi0gICAgcGFyc2VDaGlsZHJlbihyb290LCBkZWZhdWx0VmFsdWUsIHR5cGVOYW1lKTsKLQotICAgIGFkZENyaXRlcmlvbihjcml0ZXJpb25OYW1lLCB0eXBlTmFtZSwgZGVmYXVsdFZhbHVlKTsKLX0KLQotdm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZENvbmZpZyhjbm9kZSAqcm9vdCkKLXsKLSAgICBBTE9HX0FTU0VSVChyb290ICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIGdQb2xpY3lDb25mVGFnLmNfc3RyKCkpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coIiVzOiBDb3VsZCBub3QgZmluZCBub2RlIGZvciBwZnciLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFMT0dEKCIlczogTG9hZGluZyBjb25mIGZvciBwZnciLCBfX0ZVTkNUSU9OX18pOwotICAgIGxvYWRJbmNsdXNpdmVDcml0ZXJpb25UeXBlKG5vZGUpOwotICAgIGxvYWRFeGNsdXNpdmVDcml0ZXJpb25UeXBlKG5vZGUpOwotICAgIGxvYWRDcml0ZXJpYShub2RlKTsKLX0KLQotCi1zdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZEF1ZGlvUG9saWN5Q3JpdGVyaWFDb25maWcoY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgICBBTE9HX0FTU0VSVChwYXRoICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGU6IGVtcHR5IHBhdGgiKTsKLSAgICBjbm9kZSAqcm9vdDsKLSAgICBjaGFyICpkYXRhOwotICAgIEFMT0dEKCIlcyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgZGF0YSA9IChjaGFyICopbG9hZF9maWxlKHBhdGgsIE5VTEwpOwotICAgIGlmIChkYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOwotICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgIlVuYWJsZSB0byBhbGxvY2F0ZSBhIGNvbmZpZ3VyYXRpb24gbm9kZSIpOwotICAgIGNvbmZpZ19sb2FkKHJvb3QsIGRhdGEpOwotCi0gICAgbG9hZENvbmZpZyhyb290KTsKLQotICAgIGNvbmZpZ19mcmVlKHJvb3QpOwotICAgIGZyZWUocm9vdCk7Ci0gICAgZnJlZShkYXRhKTsKLSAgICBBTE9HRCgiJXM6IGxvYWRlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCiBib29sIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjppc1N0YXJ0ZWQoKQogewogICAgIHJldHVybiBtUGZ3Q29ubmVjdG9yICYmIG1QZndDb25uZWN0b3ItPmlzU3RhcnRlZCgpOwpAQCAtMzM1LDkgKzE4NCw5IEBACiBzdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSkKIHsKICAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPQotICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnUGhvbmVTdGF0ZUNyaXRlcmlvblRhZywgbVBvbGljeUNyaXRlcmlhKTsKKyAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ1Bob25lU3RhdGVDcml0ZXJpb25OYW1lLCBtUG9saWN5Q3JpdGVyaWEpOwogICAgIGlmIChjcml0ZXJpb24gPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdQaG9uZVN0YXRlQ3JpdGVyaW9uVGFnLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdQaG9uZVN0YXRlQ3JpdGVyaW9uTmFtZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIGlmICghaXNWYWx1ZVZhbGlkRm9yQ3JpdGVyaW9uKGNyaXRlcmlvbiwgc3RhdGljX2Nhc3Q8aW50Pihtb2RlKSkpIHsKQEAgLTM1MSw5ICsyMDAsOSBAQAogYXVkaW9fbW9kZV90IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpnZXRQaG9uZVN0YXRlKCkgY29uc3QKIHsKICAgICBjb25zdCBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPQotICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnUGhvbmVTdGF0ZUNyaXRlcmlvblRhZywgbVBvbGljeUNyaXRlcmlhKTsKKyAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ1Bob25lU3RhdGVDcml0ZXJpb25OYW1lLCBtUG9saWN5Q3JpdGVyaWEpOwogICAgIGlmIChjcml0ZXJpb24gPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdQaG9uZVN0YXRlQ3JpdGVyaW9uVGFnLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdQaG9uZVN0YXRlQ3JpdGVyaW9uTmFtZSk7CiAgICAgICAgIHJldHVybiBBVURJT19NT0RFX05PUk1BTDsKICAgICB9CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGF1ZGlvX21vZGVfdD4oY3JpdGVyaW9uLT5nZXRDcml0ZXJpb25TdGF0ZSgpKTsKQEAgLTM3MCw3ICsyMTksNyBAQAogICAgIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiA9CiAgICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGdGb3JjZVVzZUNyaXRlcmlvblRhZ1t1c2FnZV0sIG1Qb2xpY3lDcml0ZXJpYSk7CiAgICAgaWYgKGNyaXRlcmlvbiA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ0ZvcmNlVXNlQ3JpdGVyaW9uVGFnW3VzYWdlXS5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnRm9yY2VVc2VDcml0ZXJpb25UYWdbdXNhZ2VdKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgaWYgKCFpc1ZhbHVlVmFsaWRGb3JDcml0ZXJpb24oY3JpdGVyaW9uLCBzdGF0aWNfY2FzdDxpbnQ+KGNvbmZpZykpKSB7CkBAIC0zOTAsNyArMjM5LDcgQEAKICAgICBjb25zdCBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPQogICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnRm9yY2VVc2VDcml0ZXJpb25UYWdbdXNhZ2VdLCBtUG9saWN5Q3JpdGVyaWEpOwogICAgIGlmIChjcml0ZXJpb24gPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdGb3JjZVVzZUNyaXRlcmlvblRhZ1t1c2FnZV0uY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ0ZvcmNlVXNlQ3JpdGVyaW9uVGFnW3VzYWdlXSk7CiAgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3Q+KGNyaXRlcmlvbi0+Z2V0Q3JpdGVyaW9uU3RhdGUoKSk7CkBAIC00MDQsMTIgKzI1Myw0NSBAQAogICAgIHJldHVybiBpbnRlcmZhY2UtPmdldExpdGVyYWxWYWx1ZSh2YWx1ZVRvQ2hlY2ssIGxpdGVyYWxWYWx1ZSk7CiB9CiAKK3N0YXR1c190IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKQoreworICAgIHN0ZDo6c3RyaW5nIGNyaXRlcmlvbk5hbWUgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldkRlc2MtPnR5cGUoKSkgPworICAgICAgICAgICAgICAgIGdPdXRwdXREZXZpY2VBZGRyZXNzQ3JpdGVyaW9uTmFtZSA6IGdJbnB1dERldmljZUFkZHJlc3NDcml0ZXJpb25OYW1lOworCisgICAgQUxPR1YoIiVzOiBkZXZpY2Ugd2l0aCBhZGRyZXNzICVzICVzIiwgX19GVU5DVElPTl9fLCBkZXZEZXNjLT5hZGRyZXNzKCkuc3RyaW5nKCksCisgICAgICAgICAgc3RhdGUgIT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEU/ICJkaXNjb25uZWN0ZWQiIDogImNvbm5lY3RlZCIpOworICAgIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiA9CisgICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGNyaXRlcmlvbk5hbWUsIG1Qb2xpY3lDcml0ZXJpYSk7CisKKyAgICBpZiAoY3JpdGVyaW9uID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBjcml0ZXJpb25OYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgYXV0byBjcml0ZXJpb25UeXBlID0gY3JpdGVyaW9uLT5nZXRDcml0ZXJpb25UeXBlKCk7CisgICAgaW50IGRldmljZUFkZHJlc3NJZDsKKyAgICBpZiAobm90IGNyaXRlcmlvblR5cGUtPmdldE51bWVyaWNhbFZhbHVlKGRldkRlc2MtPmFkZHJlc3MoKS5zdHJpbmcoKSwgZGV2aWNlQWRkcmVzc0lkKSkgeworICAgICAgICBBTE9HVygiJXM6IHVua25vd24gZGV2aWNlIGFkZHJlc3MgcmVwb3J0ZWQgKCVzKSIsIF9fRlVOQ1RJT05fXywgZGV2RGVzYy0+YWRkcmVzcygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gQkFEX1RZUEU7CisgICAgfQorICAgIGludCBjdXJyZW50VmFsdWVNYXNrID0gY3JpdGVyaW9uLT5nZXRDcml0ZXJpb25TdGF0ZSgpOworICAgIGlmIChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkgeworICAgICAgICBjdXJyZW50VmFsdWVNYXNrIHw9IGRldmljZUFkZHJlc3NJZDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGN1cnJlbnRWYWx1ZU1hc2sgJj0gfmRldmljZUFkZHJlc3NJZDsKKyAgICB9CisgICAgY3JpdGVyaW9uLT5zZXRDcml0ZXJpb25TdGF0ZShjdXJyZW50VmFsdWVNYXNrKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIHN0YXR1c190IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpzZXRBdmFpbGFibGVJbnB1dERldmljZXMoYXVkaW9fZGV2aWNlc190IGlucHV0RGV2aWNlcykKIHsKICAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPQotICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnSW5wdXREZXZpY2VDcml0ZXJpb25UYWcsIG1Qb2xpY3lDcml0ZXJpYSk7CisgICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGdJbnB1dERldmljZUNyaXRlcmlvbk5hbWUsIG1Qb2xpY3lDcml0ZXJpYSk7CiAgICAgaWYgKGNyaXRlcmlvbiA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ0lucHV0RGV2aWNlQ3JpdGVyaW9uVGFnLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdJbnB1dERldmljZUNyaXRlcmlvbk5hbWUpOwogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQogICAgIGNyaXRlcmlvbi0+c2V0Q3JpdGVyaW9uU3RhdGUoaW5wdXREZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pOwpAQCAtNDIwLDkgKzMwMiw5IEBACiBzdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6c2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcyhhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlcykKIHsKICAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPQotICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnT3V0cHV0RGV2aWNlQ3JpdGVyaW9uVGFnLCBtUG9saWN5Q3JpdGVyaWEpOworICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnT3V0cHV0RGV2aWNlQ3JpdGVyaW9uTmFtZSwgbVBvbGljeUNyaXRlcmlhKTsKICAgICBpZiAoY3JpdGVyaW9uID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnT3V0cHV0RGV2aWNlQ3JpdGVyaW9uVGFnLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdPdXRwdXREZXZpY2VDcml0ZXJpb25OYW1lKTsKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KICAgICBjcml0ZXJpb24tPnNldENyaXRlcmlvblN0YXRlKG91dHB1dERldmljZXMpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvYXVkaW9fcG9saWN5X2NyaXRlcmlhX2NvbmYuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2F1ZGlvX3BvbGljeV9jcml0ZXJpYV9jb25mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZmQxNzYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvYXVkaW9fcG9saWN5X2NyaXRlcmlhX2NvbmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyAgICAgIERlZmluaXRpb25zIGZvciBhdWRpbyBwb2xpY3kgY3JpdGVyaWEgY29uZmlndXJhdGlvbiBmaWxlIChhdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZikgICAvLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLS8vICAgICAgQFRPRE86IHNjcmlwdGVkIGZyb20gYXVkaW8uaCAmIGF1ZGlvX3BvbGljeSxoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ0F1ZGlvUG9saWN5Q3JpdGVyaWFDb25mRmlsZVBhdGggPQotICAgICIvc3lzdGVtL2V0Yy9hdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZiI7Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ0F1ZGlvUG9saWN5Q3JpdGVyaWFWZW5kb3JDb25mRmlsZVBhdGggPQotICAgICIvdmVuZG9yL2V0Yy9hdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZiI7Ci0KLS8qKgotICogUEZXIGluc3RhbmNlcyB0YWdzCi0gKi8KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ1BvbGljeUNvbmZUYWcgPSAiUG9saWN5IjsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ0RlZmF1bHRUYWcgPSAiRGVmYXVsdCI7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdUeXBlVGFnID0gIlR5cGUiOwotCi0vKioKLSAqIFBGVyBlbGVtZW50cyB0YWdzCi0gKi8KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ0luY2x1c2l2ZUNyaXRlcmlvblR5cGVUYWcgPSAiSW5jbHVzaXZlQ3JpdGVyaW9uVHlwZSI7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdFeGNsdXNpdmVDcml0ZXJpb25UeXBlVGFnID0gIkV4Y2x1c2l2ZUNyaXRlcmlvblR5cGUiOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnQ3JpdGVyaW9uVGFnID0gIkNyaXRlcmlvbiI7Ci0KLS8qKgotICogUEZXIGtub3duIGNyaXRlcmlvbiB0YWdzCi0gKi8KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ0lucHV0RGV2aWNlQ3JpdGVyaW9uVGFnID0gIkF2YWlsYWJsZUlucHV0RGV2aWNlcyI7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdPdXRwdXREZXZpY2VDcml0ZXJpb25UYWcgPSAiQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyI7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdQaG9uZVN0YXRlQ3JpdGVyaW9uVGFnID0gIlRlbGVwaG9ueU1vZGUiOwotCi0vKioKLSAqIE9yZGVyIE1VU1QgYmUgYWxpZ24gd2l0aCBkZWZpbnRpaW9uIG9mIGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB3aXRoaW4gYXVkaW9fcG9saWN5LmgKLSAqLwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGdGb3JjZVVzZUNyaXRlcmlvblRhZ1tBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVF0gPQotewotICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dID0gICAgICAgICJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iLAotICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSA9ICAgICAgICAgICAgICAgICJGb3JjZVVzZUZvck1lZGlhIiwKLSAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdID0gICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JSZWNvcmQiLAotICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0tdID0gICAgICAgICAgICAgICAgICJGb3JjZVVzZUZvckRvY2siLAotICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPSAgICAgICAgICAgICAgICJGb3JjZVVzZUZvclN5c3RlbSIsCi0gICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU9dID0gICAgIkZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIiwKLSAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EXSA9ICAgICAiRm9yY2VVc2VGb3JFbmNvZGVkU3Vycm91bmQiLAotICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1ZJQlJBVEVfUklOR0lOR10gPSAgICAgICJGb3JjZVVzZUZvclZpYnJhdGVSaW5naW5nIgotfTsKLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2NvbmZpZy9hdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZiBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2NvbmZpZy9hdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQzZDVhNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9jb25maWcvYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIEBOT1RFOgotIyBBdWRpbyBQb2xpY3kgQ3JpdGVyaWEgZmlsZSBleGFtcGxlIGZvciBnZW5lcmljIGRldmljZSBidWlsZAotIwotIyBBbnkgdmVuZG9yIHNoYWxsIGhhdmUgaXRzIG93biBjb25maWd1cmF0aW9uIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZyBkZXZpY2UgZm9sZGVyCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENyaXRlcmlvbiB0eXBlIEV4YW1wbGU6Ci0jIEZvciBlYWNoIGNyaXRlcmlvbiwgYSBjb3VwbGUgb2YgbnVtZXJpY2FsLCBsaXRlcmFsIHZhbHVlcyBtdXN0IGJlIHByb3ZpZGVkIHRvIHRoZSBQRlcuCi0jIFRoZSBudW1lcmljYWwgcGFydCBpcyBub3QgbWFuZGF0b3J5LiBJZiBub3QgZmlsbGVkIGJ5IHRoZSB1c2VyLCBhIGRlZmF1bHQgbnVtZXJpY2FsIHZhbHVlIHdpbGwgYmUKLSMgYXV0b21hdGljYWxseSBwcm92aWRlZCBieSBhdWRpbyBIQUwgdXNpbmcgdGhlIGZvbGxvd2luZyBsb2dpYzoKLSMgICAtIEV4Y2x1c2l2ZSBjcml0ZXJpb246Ci0jICAgICAgICAgICogMCAtPiBmaXJzdCBsaXRlcmFsIHZhbHVlLAotIyAgICAgICAgICAqIDEgLT4gc2Vjb25kIGxpdGVyYWwgdmFsdWUsCi0jICAgICAgICAgICAgICAgLi4uCi0jICAgICAgICAgICogTiAtPiAoTisxKXRoIGxpdGVyYWwgdmFsdWUuCi0jICAgLSBJbmNsdXNpdmUgY3JpdGVyaW9uOgotIyAgICAgICAgICAqIDEgPDwgMCAtPiBmaXJzdCBsaXRlcmFsIHZhbHVlLAotIyAgICAgICAgICAqIDEgPDwgMSAtPiBzZWNvbmQgbGl0ZXJhbCB2YWx1ZSwKLSMgICAgICAgICAgICAgICAuLi4KLSMgICAgICAgICAgKiAxIDw8IE4gLT4gKE4rMSl0aCBsaXRlcmFsIHZhbHVlLAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFBvbGljeSB7Ci0jICAgIEluY2x1c2l2ZUNyaXRlcmlvblR5cGV8RXhjbHVzaXZlQ3JpdGVyaW9uVHlwZSB7Ci0jICAgICAgICA8Q3JpdGVyaW9uIE5hbWU+ICBbbnVtZXJpY2FsIHZhbHVlIDE6XTxsaXRlcmFsIHZhbHVlIDE+LFtudW1lcmljYWwgdmFsdWUgMjpdPGxpdGVyYWwgdmFsdWUgMj4sPGxpdGVyYWwgdmFsdWUgMz4sLi4uCi0jICAgIH0KLSMgfQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ3JpdGVyaW9uOgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFBvbGljeSB7Ci0jICAgIENyaXRlcmlvbiB7Ci0jICAgICAgICA8Q3JpdGVyaW9uIE5hbWU+IHsKLSMgICAgICAgICAgICBUeXBlICAgICAgICAgICAgPENyaXRlcmlvbiB0eXBlIG5hbWU+Ci0jICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIDxkZWZhdWx0IHZhbHVlIG9mIHRoZSBjcml0ZXJpb24+Ci0jICAgICAgICB9Ci0jICAgIH0KLSMgfQotCi1Qb2xpY3kgewotICAgIEluY2x1c2l2ZUNyaXRlcmlvblR5cGUgewotICAgICAgICAjCi0gICAgICAgICMgRE8gTk9UIENIQU5HRSBPUkRFUi4gVGhpcyBkZWZpbml0aW9uIG11c3QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mCi0gICAgICAgICMgQVVESU9fREVWSUNFX09VVF8qIHdpdGhpbiA8c3lzdGVtL2F1ZGlvLmg+IGZpbGUgb2YgYW5kcm9pZC4KLSAgICAgICAgIwotICAgICAgICBPdXRwdXREZXZpY2VzTWFza1R5cGUgICBFYXJwaWVjZSxTcGVha2VyLFdpcmVkSGVhZHNldCxXaXJlZEhlYWRwaG9uZSxCbHVldG9vdGhTY28sQmx1ZXRvb3RoU2NvSGVhZHNldCxCbHVldG9vdGhTY29DYXJraXQsQmx1ZXRvb3RoQTJkcCxCbHVldG9vdGhBMmRwSGVhZHBob25lcyxCbHVldG9vdGhBMmRwU3BlYWtlcixIZG1pLEFubGdEb2NrSGVhZHNldCxEZ3RsRG9ja0hlYWRzZXQsVXNiQWNjZXNzb3J5LFVzYkRldmljZSxSZW1vdGVTdWJtaXgsVGVsZXBob255VHgsTGluZSxIZG1pQXJjLFNwZGlmLEZtLEF1eExpbmUsU3BlYWtlclNhZmUKLSAgICAgICAgIwotICAgICAgICAjIERPIE5PVCBDSEFOR0UgT1JERVIuIFRoaXMgZGVmaW5pdGlvbiBtdXN0IGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZgotICAgICAgICAjIEFVRElPX0RFVklDRV9JTl8qIHdpdGhpbiA8c3lzdGVtL2F1ZGlvLmg+IGZpbGUgb2YgYW5kcm9pZC4KLSAgICAgICAgIyBOb3RlIGFsc28gdGhhdCBkaXJlY3Rpb24gYml0IHdpbGwgYmUgZGVjaW1hdGVkIGJ5IEF1ZGlvSEFMIGluIG9yZGVyIHRvIGFsbG93IHVzaW5nIGEgbWFzawotICAgICAgICAjIHdpdGggdGhlIGNhcmRpbmFsaXR5IG9mIDEgYmV0d2VlbiBhIGJpdCBhbmQgYW4gaW5wdXQgZGV2aWNlLgotICAgICAgICAjCi0gICAgICAgIElucHV0RGV2aWNlc01hc2tUeXBlICAgIENvbW11bmljYXRpb24sQW1iaWVudCxCdWlsdGluTWljLEJsdWV0b290aFNjb0hlYWRzZXQsV2lyZWRIZWFkc2V0LEhkbWksVGVsZXBob255UngsQmFja01pYyxSZW1vdGVTdWJtaXgsQW5sZ0RvY2tIZWFkc2V0LERndGxEb2NrSGVhZHNldCxVc2JBY2Nlc3NvcnksVXNiRGV2aWNlLEZtVHVuZXIsVHZUdW5lLExpbmUsU3BkaWYsQmx1ZXRvb3RoQTJkcCxMb29wYmFjawotICAgIH0KLSAgICBFeGNsdXNpdmVDcml0ZXJpb25UeXBlIHsKLSAgICAgICAgIwotICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlIGF1ZGlvX21vZGVfdAotICAgICAgICAjIGZyb20gc3lzdGVtL2F1ZGlvLmgKLSAgICAgICAgIwotICAgICAgICBBbmRyb2lkTW9kZVR5cGUgICAgIDA6Tm9ybWFsLDE6UmluZ1RvbmUsMjpJbkNhbGwsMzpJbkNvbW11bmljYXRpb24KLSAgICAgICAgIwotICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlCi0gICAgICAgICMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jb25maWdfdCBmcm9tIHN5c3RlbS9hdWRpby5oCi0gICAgICAgICMKLSAgICAgICAgRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uVHlwZSAgICAwOkZvcmNlTm9uZSwxOkZvcmNlU3BlYWtlciwzOkZvcmNlQnRTY28KLSAgICAgICAgIwotICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlCi0gICAgICAgICMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jb25maWdfdCBmcm9tIHN5c3RlbS9hdWRpby5oCi0gICAgICAgICMKLSAgICAgICAgRm9yY2VVc2VGb3JNZWRpYVR5cGUgICAgICAgICAgICAwOkZvcmNlTm9uZSwxOkZvcmNlU3BlYWtlciwyOkZvcmNlSGVhZHBob25lcyw0OkZvcmNlQnRBMmRwLDU6Rm9yY2VXaXJlZEFjY2Vzc29yeSw4OkZvcmNlQW5hbG9nRG9jayw5OkZvcmNlRGlnaXRhbERvY2ssMTA6Rm9yY2VOb0J0QTJkcAotICAgICAgICAjCi0gICAgICAgICMgVGhlIHZhbHVlcyBvZiB0aGUgbW9kZSBNVVNUIGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKLSAgICAgICAgIyBhdWRpb19wb2xpY3lfZm9yY2VkX2NvbmZpZ190IGZyb20gc3lzdGVtL2F1ZGlvLmgKLSAgICAgICAgIwotICAgICAgICBGb3JjZVVzZUZvclJlY29yZFR5cGUgICAgICAgICAgIDA6Rm9yY2VOb25lLDM6Rm9yY2VCdFNjbyw1OkZvcmNlV2lyZWRBY2Nlc3NvcnkKLSAgICAgICAgIwotICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlCi0gICAgICAgICMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jb25maWdfdCBmcm9tIHN5c3RlbS9hdWRpby5oCi0gICAgICAgICMKLSAgICAgICAgRm9yY2VVc2VGb3JEb2NrVHlwZSAgICAgICAgICAgICAwOkZvcmNlTm9uZSw1OkZvcmNlV2lyZWRBY2Nlc3NvcnksNjpGb3JjZUJ0Q2FyRG9jayw3OkZvcmNlQnREZXNrRG9jayw4OkZvcmNlQW5hbG9nRG9jayw5OkZvcmNlRGlnaXRhbERvY2sKLSAgICAgICAgIwotICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlCi0gICAgICAgICMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jb25maWdfdCBmcm9tIHN5c3RlbS9hdWRpby5oCi0gICAgICAgICMKLSAgICAgICAgRm9yY2VVc2VGb3JTeXN0ZW1UeXBlICAgICAgICAgICAwOkZvcmNlTm9uZSwxMTpGb3JjZVN5c3RlbUVuZm9yY2VkCi0gICAgICAgICMKLSAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAotICAgICAgICAjCi0gICAgICAgIEZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvVHlwZSAgMDpGb3JjZU5vbmUsMTI6Rm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKLSAgICAgICAgIwotICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlCi0gICAgICAgICMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jb25maWdfdCBmcm9tIHN5c3RlbS9hdWRpb19wb2xpY3kuaAotICAgICAgICAjCi0gICAgICAgIEZvcmNlVXNlRm9yRW5jb2RlZFN1cnJvdW5kVHlwZSAgMDpGb3JjZU5vbmUsMTM6Rm9yY2VFbmNvZGVkU3Vycm91bmROZXZlciwxNDpGb3JjZUVuY29kZWRTdXJyb3VuZEFsd2F5cwotICAgIH0KLQotICAgIENyaXRlcmlvbiB7Ci0gICAgICAgIEF2YWlsYWJsZUlucHV0RGV2aWNlcyB7Ci0gICAgICAgICAgICBUeXBlICAgICAgICAgICAgSW5wdXREZXZpY2VzTWFza1R5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBub25lCi0gICAgICAgIH0KLSAgICAgICAgQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyB7Ci0gICAgICAgICAgICBUeXBlICAgICAgICAgICAgT3V0cHV0RGV2aWNlc01hc2tUeXBlCi0gICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgbm9uZQotICAgICAgICB9Ci0gICAgICAgIFRlbGVwaG9ueU1vZGUgewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEFuZHJvaWRNb2RlVHlwZQotICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIE5vcm1hbAotICAgICAgICB9Ci0gICAgICAgIEZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiB7Ci0gICAgICAgICAgICBUeXBlICAgICAgICAgICAgRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uVHlwZQotICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIEZvcmNlTm9uZQotICAgICAgICB9Ci0gICAgICAgIEZvcmNlVXNlRm9yTWVkaWEgewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEZvcmNlVXNlRm9yTWVkaWFUeXBlCi0gICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgRm9yY2VOb25lCi0gICAgICAgIH0KLSAgICAgICAgRm9yY2VVc2VGb3JSZWNvcmQgewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEZvcmNlVXNlRm9yUmVjb3JkVHlwZQotICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIEZvcmNlTm9uZQotICAgICAgICB9Ci0gICAgICAgIEZvcmNlVXNlRm9yRG9jayB7Ci0gICAgICAgICAgICBUeXBlICAgICAgICAgICAgRm9yY2VVc2VGb3JEb2NrVHlwZQotICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIEZvcmNlTm9uZQotICAgICAgICB9Ci0gICAgICAgIEZvcmNlVXNlRm9yU3lzdGVtIHsKLSAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvclN5c3RlbVR5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKLSAgICAgICAgfQotICAgICAgICBGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyB7Ci0gICAgICAgICAgICBUeXBlICAgICAgICAgICAgRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW9UeXBlCi0gICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgRm9yY2VOb25lCi0gICAgICAgIH0KLSAgICAgICAgRm9yY2VVc2VGb3JFbmNvZGVkU3Vycm91bmQgewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEZvcmNlVXNlRm9yRW5jb2RlZFN1cnJvdW5kVHlwZQotICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIEZvcmNlTm9uZQotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9pbmNsdWRlL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9pbmNsdWRlL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmgKaW5kZXggNGMxYWNmZS4uNWJmYWQyOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvaW5jbHVkZS9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2luY2x1ZGUvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuaApAQCAtMTYsMTAgKzE2LDE1IEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8QXVkaW9HYWluLmg+CisjaW5jbHVkZSA8QXVkaW9Qb3J0Lmg+CisjaW5jbHVkZSA8SHdNb2R1bGUuaD4KKyNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1JXTG9jay5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDxsaXN0PgogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxzdHJpbmc+CkBAIC0yNywyNyArMzIsMjAgQEAKIAogY2xhc3MgQ1BhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yOwogY2xhc3MgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZTsKLWNsYXNzIElTZWxlY3Rpb25Dcml0ZXJpb25UeXBlSW50ZXJmYWNlOwogc3RydWN0IGNub2RlOwogCiBjbGFzcyBQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvckxvZ2dlcjsKIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgeworCit1c2luZyBWYWx1ZVBhaXIgPSBzdGQ6OnBhaXI8dWludDMyX3QsIHN0ZDo6c3RyaW5nPjsKK3VzaW5nIFZhbHVlUGFpcnMgPSBzdGQ6OnZlY3RvcjxWYWx1ZVBhaXI+OwogCiBjbGFzcyBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcgogewogcHJpdmF0ZToKLSAgICB0eXBlZGVmIHN0ZDo6cGFpcjxpbnQsIGNvbnN0IGNoYXIgKj4gQ3JpdGVyaW9uVHlwZVZhbHVlUGFpcjsKLQotICAgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKj4gQ3JpdGVyaW9uQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZSAqPiBDcml0ZXJpb25UeXBlQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIENyaXRlcmlvbkNvbGxlY3Rpb246Oml0ZXJhdG9yIENyaXRlcmlvbk1hcEl0ZXJhdG9yOwotICAgIHR5cGVkZWYgQ3JpdGVyaW9uQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3IgQ3JpdGVyaW9uTWFwQ29uc3RJdGVyYXRvcjsKLSAgICB0eXBlZGVmIENyaXRlcmlvblR5cGVDb2xsZWN0aW9uOjppdGVyYXRvciBDcml0ZXJpb25UeXBlTWFwSXRlcmF0b3I7Ci0gICAgdHlwZWRlZiBDcml0ZXJpb25UeXBlQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3IgQ3JpdGVyaWFUeXBlTWFwQ29uc3RJdGVyYXRvcjsKKyAgICB1c2luZyBDcml0ZXJpYSA9IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICo+OwogCiBwdWJsaWM6CiAgICAgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIoKTsKQEAgLTEyMCw2ICsxMTgsMjAgQEAKICAgICAgKi8KICAgICBzdGF0dXNfdCBzZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2VzKTsKIAorICAgIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGFkZENyaXRlcmlvbiB0byB0aGUgcG9saWN5IHBmdworICAgICAqIEBwYXJhbSBuYW1lIG9mIHRoZSBjcml0ZXJpb24KKyAgICAgKiBAcGFyYW0gaXNJbmNsdXNpdmUgaWYgdHJ1ZSwgaW5jbHVzaXZlLCBpZiBmYWxzZSBleGNsdXNpdmUgY3JpdGVyaW9uIHR5cGUKKyAgICAgKiBAcGFyYW0gcGFpcnMgb2YgbnVtZXJpY2FsL2xpdGVyYWwgdmFsdWVzIG9mIHRoZSBjcml0ZXJpb24KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHByb3ZpZGVkIGFzIGxpdGVyYWwuCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHN0YXR1c190IGFkZENyaXRlcmlvbihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYm9vbCBpc0luY2x1c2l2ZSwgVmFsdWVQYWlycyBwYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmRlZmF1bHRWYWx1ZSk7CisKIHByaXZhdGU6CiAgICAgLyoqCiAgICAgICogQXBwbHkgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHBsYXRmb3JtIG9uIHRoZSBwb2xpY3kgcGFyYW1ldGVyIG1hbmFnZXIuCkBAIC0xMzMsOTYgKzE0NSw3IEBACiAgICAgICovCiAgICAgdm9pZCBhcHBseVBsYXRmb3JtQ29uZmlndXJhdGlvbigpOwogCi0gICAgLyoqCi0gICAgICogTG9hZCB0aGUgY3JpdGVyaW9uIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gcGF0aCBDcml0ZXJpb24gY29uZiBmaWxlIHBhdGguCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlzIHBhcnNpbmcgc3VjY2Vzc2Z1bCwgZXJyb3IgY29kZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgc3RhdHVzX3QgbG9hZEF1ZGlvUG9saWN5Q3JpdGVyaWFDb25maWcoY29uc3QgY2hhciAqcGF0aCk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBjcml0ZXJpb24gdHlwZSB0byBBdWRpb1BvbGljeVBmdy4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gdHlwZU5hbWUgb2YgdGhlIFBGVyBjcml0ZXJpb24gdHlwZS4KLSAgICAgKiBAcGFyYW1baW5dIGlzSW5jbHVzaXZlIGF0dHJpYnV0ZSBvZiB0aGUgY3JpdGVyaW9uIHR5cGUuCi0gICAgICovCi0gICAgdm9pZCBhZGRDcml0ZXJpb25UeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICZ0eXBlTmFtZSwgYm9vbCBpc0luY2x1c2l2ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBjcml0ZXJpb24gdHlwZSB2YWx1ZSBwYWlyIHRvIEF1ZGlvUG9saWN5UGZ3LgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSB0eXBlTmFtZSBjcml0ZXJpb24gdHlwZSBuYW1lIHRvIHdoaWNoIHRoaXMgdmFsdWUgcGFpciBpcyBhZGRlZCB0by4KLSAgICAgKiBAcGFyYW1baW5dIG51bWVyaWMgcGFydCBvZiB0aGUgdmFsdWUgcGFpci4KLSAgICAgKiBAcGFyYW1baW5dIGxpdGVyYWwgcGFydCBvZiB0aGUgdmFsdWUgcGFpci4KLSAgICAgKi8KLSAgICB2b2lkIGFkZENyaXRlcmlvblR5cGVWYWx1ZVBhaXIoY29uc3Qgc3RkOjpzdHJpbmcgJnR5cGVOYW1lLCB1aW50MzJfdCBudW1lcmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbGl0ZXJhbCk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBjcml0ZXJpb24gdG8gQXVkaW9Qb2xpY3lQZncuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIG5hbWUgb2YgdGhlIFBGVyBjcml0ZXJpb24uCi0gICAgICogQHBhcmFtW2luXSB0eXBlTmFtZSBjcml0ZXJpb24gdHlwZSBuYW1lIHRvIHdoaWNoIHRoaXMgY3JpdGVyaW9uIGlzIGFzc29jaWF0ZWQgdG8uCi0gICAgICogQHBhcmFtW2luXSBkZWZhdWx0TGl0ZXJhbFZhbHVlIG9mIHRoZSBQRlcgY3JpdGVyaW9uLgotICAgICAqLwotICAgIHZvaWQgYWRkQ3JpdGVyaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZ0eXBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZGVmYXVsdExpdGVyYWxWYWx1ZSk7Ci0gICAgLyoqCi0gICAgICogUGFyc2UgYW5kIGxvYWQgdGhlIGluY2x1c2l2ZSBjcml0ZXJpb24gdHlwZSBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICovCi0gICAgdm9pZCBsb2FkSW5jbHVzaXZlQ3JpdGVyaW9uVHlwZShjbm9kZSAqcm9vdCk7Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhbmQgbG9hZCB0aGUgZXhjbHVzaXZlIGNyaXRlcmlvbiB0eXBlIGZyb20gY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSByb290IG5vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKi8KLSAgICB2b2lkIGxvYWRFeGNsdXNpdmVDcml0ZXJpb25UeXBlKGNub2RlICpyb290KTsKLQotICAgIC8qKgotICAgICAqIFBhcnNlIGFuZCBsb2FkIHRoZSBjcml0ZXJpYSBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICovCi0gICAgdm9pZCBsb2FkQ3JpdGVyaWEoY25vZGUgKnJvb3QpOwotCi0gICAgLyoqCi0gICAgICogUGFyc2UgYW5kIGxvYWQgYSBjcml0ZXJpb24gZnJvbSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqLwotICAgIHZvaWQgbG9hZENyaXRlcmlvbihjbm9kZSAqcm9vdCk7Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhbmQgbG9hZCB0aGUgY3JpdGVyaW9uIHR5cGVzIGZyb20gY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSByb290IG5vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQotICAgICAqIEBwYXJhbVtpbl0gaXNJbmNsdXNpdmUgdHJ1ZSBpZiBpbmNsdXNpdmUsIGZhbHNlIGlzIGV4Y2x1c2l2ZS4KLSAgICAgKi8KLSAgICB2b2lkIGxvYWRDcml0ZXJpb25UeXBlKGNub2RlICpyb290LCBib29sIGlzSW5jbHVzaXZlKTsKLQotICAgIC8qKgotICAgICAqIExvYWQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICovCi0gICAgdm9pZCBsb2FkQ29uZmlnKGNub2RlICpyb290KTsKLQotICAgIC8qKgotICAgICAqIFBhcnNlIGFuZCBsb2FkIHRoZSBjaGlkcmVuIG5vZGUgZnJvbSBhIGdpdmVuIHJvb3Qgbm9kZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKLSAgICAgKiBAcGFyYW1bb3V0XSBkZWZhdWx0VmFsdWUgb2YgdGhlIHBhcmFtZXRlciBtYW5hZ2VyIGVsZW1lbnQgdG8gcmV0cmlldmUuCi0gICAgICogQHBhcmFtW291dF0gdHlwZSBvZiB0aGUgcGFyYW1ldGVyIG1hbmFnZXIgZWxlbWVudCB0byByZXRyaWV2ZS4KLSAgICAqLwotICAgIHZvaWQgcGFyc2VDaGlsZHJlbihjbm9kZSAqcm9vdCwgc3RkOjpzdHJpbmcgJmRlZmF1bHRWYWx1ZSwgc3RkOjpzdHJpbmcgJnR5cGUpOwotCi0gICAgLyoqCisgICAgIC8qKgogICAgICAqIFJldHJpZXZlIGFuIGVsZW1lbnQgZnJvbSBhIG1hcCBieSBpdHMgbmFtZS4KICAgICAgKgogICAgICAqIEB0cGFyYW0gVCB0eXBlIG9mIGVsZW1lbnQgdG8gc2VhcmNoLgpAQCAtMjY2LDggKzE4OSw3IEBACiAKICAgICBib29sIGlzVmFsdWVWYWxpZEZvckNyaXRlcmlvbihJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24sIGludCB2YWx1ZVRvQ2hlY2spOwogCi0gICAgQ3JpdGVyaW9uVHlwZUNvbGxlY3Rpb24gbVBvbGljeUNyaXRlcmlvblR5cGVzOyAvKio8IFBvbGljeSBDcml0ZXJpb24gVHlwZSBtYXAuICovCi0gICAgQ3JpdGVyaW9uQ29sbGVjdGlvbiBtUG9saWN5Q3JpdGVyaWE7IC8qKjwgUG9saWN5IENyaXRlcmlvbiBNYXAuICovCisgICAgQ3JpdGVyaWEgbVBvbGljeUNyaXRlcmlhOyAvKio8IFBvbGljeSBDcml0ZXJpb24gTWFwLiAqLwogCiAgICAgQ1BhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yICptUGZ3Q29ubmVjdG9yOyAvKio8IFBvbGljeSBQYXJhbWV0ZXIgTWFuYWdlciBjb25uZWN0b3IuICovCiAgICAgUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3JMb2dnZXIgKm1QZndDb25uZWN0b3JMb2dnZXI7IC8qKjwgUG9saWN5IFBGVyBsb2dnZXIuICovCkBAIC0yODQsNiArMjA2LDcgQEAKICAgICBzdHJ1Y3QgcGFyYW1ldGVyTWFuYWdlckVsZW1lbnRTdXBwb3J0ZWQ7CiAKICAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVBvbGljeVBmd0RlZmF1bHRDb25mRmlsZU5hbWU7IC8qKjwgRGVmYXVsdCBQb2xpY3kgUEZXIHRvcCBmaWxlIG5hbWUuKi8KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVBvbGljeVBmd1ZlbmRvckNvbmZGaWxlTmFtZTsgLyoqPCBWZW5kb3IgUG9saWN5IFBGVyB0b3AgZmlsZSBuYW1lLiovCiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjQyYzZhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzIgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9wb2xpY3llbmdpbmVkZWZhdWx0IiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvRW5naW5lLmNwcCIsCisgICAgICAgICJzcmMvRW5naW5lSW5zdGFuY2UuY3BwIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeWNvbW1vbiIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZV9pbnRlcmZhY2VfaGVhZGVycyIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW9wb2xpY3ljb21wb25lbnRzIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lX2NvbW1vbiIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZV9jb25maWciLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5IiwKKyAgICAgICAgImxpYnhtbDIiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzN2Q1YmIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi0jIENvbXBvbmVudCBidWlsZAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgc3JjL0VuZ2luZS5jcHAgXAotICAgIHNyYy9FbmdpbmVJbnN0YW5jZS5jcHAgXAotCi1hdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbiA6PSBcCi0gICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UKLQotTE9DQUxfQ0ZMQUdTICs9IFwKLSAgICAtV2FsbCBcCi0gICAgLVdlcnJvciBcCi0gICAgLVdleHRyYSBcCi0KLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSBcCi0gICAgJChhdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbikKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChhdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbikgXAotICAgICQoVEFSR0VUX09VVF9IRUFERVJTKS9odyBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGZyYW1ld29ya3MtYXYpIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYmlvbmljKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZQotCi1MT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotCi1MT0NBTF9NT0RVTEUgOj0gbGliYXVkaW9wb2xpY3llbmdpbmVkZWZhdWx0Ci1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IGxpYmJhc2VfaGVhZGVycwotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKLSAgICBsaWJsb2cgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYm1lZGlhX2hlbHBlcgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL0FuZHJvaWQubWsKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5tawpjb3B5IHRvIHNlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL0FuZHJvaWQubWsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmFkYWM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDggQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENPTkZJR1VSQVRJT04gVE9QIEZJTEUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBwaG9uZV9kZWZhdWx0KQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBwaG9uZS8kKExPQ0FMX01PRFVMRSkKKworTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbAorCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IHBob25lLyQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IHBob25lLyQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gcGhvbmUvJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2VuZGlmICMgaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwgcGhvbmVfZGVmYXVsdCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2EzM2I0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgIC0tPgorCis8Y29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sIi8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbCIvPgorCis8L2NvbmZpZ3VyYXRpb24+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWU2ZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sCkBAIC0wLDAgKzEsMTM2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBEZWZhdWx0IFZvbHVtZSBUYWJsZXMgaW5jbHVkZWQgYnkgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSAtLT4KKzwhLS0gRnVsbCBEZWZhdWx0IFZvbHVtZSB0YWJsZSBmb3IgYWxsIGRldmljZSBjYXRlZ29yeSAtLT4KKzx2b2x1bWVzPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRnVsbCBTY2FsZSByZWZlcmVuY2UgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MCwwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiPgorICAgICAgICA8cG9pbnQ+MCwtOTYwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsLTk2MDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgU3lzdGVtIHJlZmVyZW5jZSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC0yNDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjMzLC0xODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjY2LC0xMjAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwtNjAwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgTWVkaWEgcmVmZXJlbmNlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS1EZWZhdWx0IFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTQ5NTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MzMsLTMzNTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjYsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBpcyBTcGVha2VyIE1lZGlhIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9TWVNURU1fVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgaXMgU3BlYWtlciBTeXN0ZW0gVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtNDY4MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD40MiwtMjA3MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD44NSwtNTQwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLURlZmF1bHQgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtNDk1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4zMywtMzM1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42NiwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgaXMgRXh0IE1lZGlhIFN5c3RlbSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0yMTAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwtMTAwMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IEhlYXJpbmcgQWlkIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTEyNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC04MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgICAgPCEtLSBOb24tbXV0YWJsZSBkZWZhdWx0IHZvbHVtZSBjdXJ2ZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gICAgICogZmlyc3QgcG9pbnQgaXMgYWx3YXlzIGZvciBpbmRleCAwICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tICAgICAqIGF0dGVudWF0aW9uIGlzIHNtYWxsIGVub3VnaCB0aGF0IHN0cmVhbSBjYW4gc3RpbGwgYmUgaGVhcmQgLS0+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IG5vbi1tdXRhYmxlIHJlZmVyZW5jZSBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICAgICAgYmFzZWQgb24gREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS1EZWZhdWx0IG5vbi1tdXRhYmxlIFZvbHVtZSBDdXJ2ZSBmb3IgaGVhZHNldCAtLT4KKyAgICA8IS0tICAgIGJhc2VkIG9uIERFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtNDk1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4zMywtMzM1MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42NiwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX1NQRUFLRVJfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgbm9uLW11dGFibGUgU3BlYWtlciBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICBiYXNlZCBvbiBERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS1EZWZhdWx0IG5vbi1tdXRhYmxlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICA8IS0tICAgIGJhc2VkIG9uIERFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTQ5NTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MzMsLTMzNTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjYsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9FWFRfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgbm9uLW11dGFibGUgRXh0IE1lZGlhIFN5c3RlbSBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICAgYmFzZWQgb24gREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTU4MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTIxMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLC0xMDAwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgbm9uLW11dGFibGUgSGVhcmluZyBBaWQgVm9sdW1lIEN1cnZlIC0tPgorICAgIDwhLS0gICAgIGJhc2VkIG9uIERFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtMTI3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MjAsLTgwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjAsLTQwMDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorPC92b2x1bWVzPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzk4NzQzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKQEAgLTAsMCArMSwxMTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgIC0tPgorCis8UHJvZHVjdFN0cmF0ZWdpZXM+CisKKyAgICA8IS0tICJoaWRkZW4gc3RyYXRlZ2llcyIgbGlrZSBUVFMsIGVuZm9yY2VkIGF1ZGlibGU6CisgICAgICAgICAgICBTaGFsbCB3ZSBleHBvc2UgdGhlbSBoZXJlIG9yIGtlZXAgaXQgaGFyZCBjb2RlZCAtLT4KKworICAgIDwhLS0gVXNlZCB0byBpZGVudGlmeSB0aGUgdm9sdW1lIG9mIGF1ZGlvIHN0cmVhbXMgZm9yIGVuZm9yY2VkIHN5c3RlbSBzb3VuZHMgaW4gY2VydGFpbgorICAgICAgICAgY291bnRyaWVzIChlLmcuIGNhbWVyYSBpbiBKYXBhbikKKyAgICAgICAgIFRoaXMgc3RyYXRlZ3kgd2lsbCBvbmx5IGhhdmUgaGlnaGVyIHByaW9yaXR5IHRoYW4gcGhvbmUgaWYgZm9yY2UgZm9yIHN5c3RlbSBpcyBzZXQgdG8KKyAgICAgICAgIGVuZm9yY2VkLiAtLT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfUEhPTkUiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIiB2b2x1bWVHcm91cD0idm9pY2VfY2FsbCI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08iIHZvbHVtZUdyb3VwPSJibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8RmxhZ3MgdmFsdWU9IkFVRElPX0ZMQUdfU0NPIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1NPTklGSUNBVElPTiI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1JJTkciIHZvbHVtZUdyb3VwPSJyaW5nIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkUiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQUxBUk0iIHZvbHVtZUdyb3VwPSJhbGFybSI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BTEFSTSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSIgdm9sdW1lR3JvdXA9ImVuZm9yY2VkX2F1ZGlibGUiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxGbGFncyB2YWx1ZT0iQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX0FDQ0VTU0lCSUxJVFkiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIiB2b2x1bWVHcm91cD0iYWNjZXNzaWJpbGl0eSI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFkiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iIHZvbHVtZUdyb3VwPSJub3RpZmljYXRpb24iPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1QiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9NRURJQSI+CisgICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9NVVNJQyIgdm9sdW1lR3JvdXA9Im11c2ljIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX01FRElBIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0dBTUUiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5UIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz48L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9TWVNURU0iIHZvbHVtZUdyb3VwPSJzeXN0ZW0iPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfRFRNRiI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0RUTUYiIHZvbHVtZUdyb3VwPSJkdG1mIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORyIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPCEtLSBVc2VkIHRvIGlkZW50aWZ5IHRoZSB2b2x1bWUgb2YgYXVkaW8gc3RyZWFtcyBleGNsdXNpdmVseSB0cmFuc21pdHRlZCB0aHJvdWdoIHRoZSAgc3BlYWtlcgorICAgICAgICAgKFRUUykgb2YgdGhlIGRldmljZSAtLT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1RUUyIgdm9sdW1lR3JvdXA9InR0cyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPEZsYWdzIHZhbHVlPSJBVURJT19GTEFHX0JFQUNPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPCEtLSBSb3V0aW5nIFN0cmF0ZWd5IHJlcm91dGluZyBtYXkgYmUgcmVtb3ZlZCBhcyBmb2xsb3dpbmcgbWVkaWE/Pz8gLS0+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9SRVJPVVRJTkciPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9SRVJPVVRJTkciIHZvbHVtZUdyb3VwPSJyZXJvdXRpbmciPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+PC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDwhLS0gRGVmYXVsdCBwcm9kdWN0IHN0cmF0ZWd5IGhhcyBlbXB0eSBhdHRyaWJ1dGVzIC0tPgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfUEFUQ0giPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9QQVRDSCIgdm9sdW1lR3JvdXA9InBhdGNoIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPjwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKworPC9Qcm9kdWN0U3RyYXRlZ2llcz4KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9zdHJlYW1fdm9sdW1lcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA3YTE4NAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9zdHJlYW1fdm9sdW1lcy54bWwKQEAgLTAsMCArMSwyMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIFZvbHVtZSBzZWN0aW9uIGRlZmluZXMgYSB2b2x1bWUgY3VydmUgZm9yIGEgZ2l2ZW4gdXNlIGNhc2UgYW5kIGRldmljZSBjYXRlZ29yeS4KK0l0IGNvbnRhaW5zIGEgbGlzdCBvZiBwb2ludHMgb2YgdGhpcyBjdXJ2ZSBleHByZXNzaW5nIHRoZSBhdHRlbnVhdGlvbiBpbiBNaWxsaWJlbHMgZm9yIGEgZ2l2ZW4KK3ZvbHVtZSBpbmRleCBmcm9tIDAgdG8gMTAwLgorPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT3igJ3igJ0+Cis8cG9pbnQ+MCwtOTYwMDwvcG9pbnQ+Cis8cG9pbnQ+MTAwLDA8L3BvaW50PgorPC92b2x1bWU+CistLT4KKworPHZvbHVtZUdyb3Vwcz4KKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnZvaWNlX2NhbGw8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4xPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjcwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC05MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+c3lzdGVtPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjEsLTMwMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMjIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLC0xODAwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4xLC01MTAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD41NywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NzEsLTI1MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50Pjg1LC0yMzAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTIxMDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPCEtLXZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8tLT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+cmluZzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NzwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPm11c2ljPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4yNTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5hbGFybTwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjE8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NzwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0VYVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+bm90aWZpY2F0aW9uPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9TWVNURU1fVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPmJsdWV0b290aF9zY288L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTI0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0xNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5lbmZvcmNlZF9hdWRpYmxlPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjEsLTMwMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMjIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLC0xODAwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4xLC0zNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD43MSwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLC0yMDAwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDwhLS12b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvLS0+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPmR0bWY8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjEsLTMwMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMjIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLC0xODAwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4xLC00MDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD43MSwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLC0xNDAwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDwhLS12b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvLS0+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnR0czwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJTSUxFTlRfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJTSUxFTlRfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iU0lMRU5UX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iU0lMRU5UX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPmFjY2Vzc2liaWxpdHk8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4xPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5yZXJvdXRpbmc8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5wYXRjaDwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+Cis8L3ZvbHVtZUdyb3Vwcz4KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAKaW5kZXggZTg2YWU1Zi4uNjZhNjk2NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaD4KICNpbmNsdWRlIDxBdWRpb1BvcnQuaD4KICNpbmNsdWRlIDxJT1Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oPgogI2luY2x1ZGUgPHBvbGljeS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTM4LDYwICszOSwzMyBAQAogbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQogewogCitzdHJ1Y3QgbGVnYWN5X3N0cmF0ZWd5X21hcCB7IGNvbnN0IGNoYXIgKm5hbWU7IGxlZ2FjeV9zdHJhdGVneSBpZDsgfTsKK3N0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxsZWdhY3lfc3RyYXRlZ3lfbWFwPiBnTGVnYWN5U3RyYXRlZ3kgPSB7CisgICAgeyAiU1RSQVRFR1lfTk9ORSIsIFNUUkFURUdZX05PTkUgfSwKKyAgICB7ICJTVFJBVEVHWV9NRURJQSIsIFNUUkFURUdZX01FRElBIH0sCisgICAgeyAiU1RSQVRFR1lfUEhPTkUiLCBTVFJBVEVHWV9QSE9ORSB9LAorICAgIHsgIlNUUkFURUdZX1NPTklGSUNBVElPTiIsIFNUUkFURUdZX1NPTklGSUNBVElPTiB9LAorICAgIHsgIlNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMIiwgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwgfSwKKyAgICB7ICJTVFJBVEVHWV9EVE1GIiwgU1RSQVRFR1lfRFRNRiB9LAorICAgIHsgIlNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUiLCBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFIH0sCisgICAgeyAiU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSIiwgU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSIH0sCisgICAgeyAiU1RSQVRFR1lfQUNDRVNTSUJJTElUWSIsIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgfSwKKyAgICB7ICJTVFJBVEVHWV9SRVJPVVRJTkciLCBTVFJBVEVHWV9SRVJPVVRJTkcgfSwKKyAgICB7ICJTVFJBVEVHWV9QQVRDSCIsIFNUUkFURUdZX1JFUk9VVElORyB9LCAvLyBib2lsZXIgdG8gbWFuYWdlIHN0cmVhbSBwYXRjaCB2b2x1bWUKK307CisKIEVuZ2luZTo6RW5naW5lKCkKLSAgICA6IG1NYW5hZ2VySW50ZXJmYWNlKHRoaXMpLAotICAgICAgbVBob25lU3RhdGUoQVVESU9fTU9ERV9OT1JNQUwpLAotICAgICAgbUFwbU9ic2VydmVyKE5VTEwpCiB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVDsgaSsrKSB7Ci0gICAgICAgIG1Gb3JjZVVzZVtpXSA9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FOworICAgIGF1dG8gcmVzdWx0ID0gRW5naW5lQmFzZTo6bG9hZEF1ZGlvUG9saWN5RW5naW5lQ29uZmlnKCk7CisgICAgQUxPR0VfSUYocmVzdWx0Lm5iU2tpcHBlZEVsZW1lbnQgIT0gMCwKKyAgICAgICAgICAgICAiUG9saWN5IEVuZ2luZSBjb25maWd1cmF0aW9uIGlzIHBhcnRpYWxseSBpbnZhbGlkLCBza2lwcGVkICV6dSBlbGVtZW50cyIsCisgICAgICAgICAgICAgcmVzdWx0Lm5iU2tpcHBlZEVsZW1lbnQpOworCisgICAgZm9yIChjb25zdCBhdXRvICZzdHJhdGVneSA6IGdMZWdhY3lTdHJhdGVneSkgeworICAgICAgICBtTGVnYWN5U3RyYXRlZ3lNYXBbZ2V0UHJvZHVjdFN0cmF0ZWd5QnlOYW1lKHN0cmF0ZWd5Lm5hbWUpXSA9IHN0cmF0ZWd5LmlkOwogICAgIH0KIH0KIAotRW5naW5lOjp+RW5naW5lKCkKLXsKLX0KLQotdm9pZCBFbmdpbmU6OnNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcikKLXsKLSAgICBBTE9HX0FTU0VSVChvYnNlcnZlciAhPSBOVUxMLCAiSW52YWxpZCBBdWRpbyBQb2xpY3kgTWFuYWdlciBvYnNlcnZlciIpOwotICAgIG1BcG1PYnNlcnZlciA9IG9ic2VydmVyOwotfQotCi1zdGF0dXNfdCBFbmdpbmU6OmluaXRDaGVjaygpCi17Ci0gICAgcmV0dXJuIChtQXBtT2JzZXJ2ZXIgIT0gTlVMTCkgPyAgTk9fRVJST1IgOiBOT19JTklUOwotfQotCi1zdGF0dXNfdCBFbmdpbmU6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKQotewotICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkgc3RhdGUgJWQiLCBzdGF0ZSk7Ci0KLSAgICBpZiAoc3RhdGUgPCAwIHx8IHN0YXRlID49IEFVRElPX01PREVfQ05UKSB7Ci0gICAgICAgIEFMT0dXKCJzZXRQaG9uZVN0YXRlKCkgaW52YWxpZCBzdGF0ZSAlZCIsIHN0YXRlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdGUgPT0gbVBob25lU3RhdGUgKSB7Ci0gICAgICAgIEFMT0dXKCJzZXRQaG9uZVN0YXRlKCkgc2V0dGluZyBzYW1lIHN0YXRlICVkIiwgc3RhdGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIC8vIHN0b3JlIHByZXZpb3VzIHBob25lIHN0YXRlIGZvciBtYW5hZ2VtZW50IG9mIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBiZWxvdwotICAgIGludCBvbGRTdGF0ZSA9IG1QaG9uZVN0YXRlOwotICAgIG1QaG9uZVN0YXRlID0gc3RhdGU7Ci0KLSAgICBpZiAoIWlzX3N0YXRlX2luX2NhbGwob2xkU3RhdGUpICYmIGlzX3N0YXRlX2luX2NhbGwoc3RhdGUpKSB7Ci0gICAgICAgIEFMT0dWKCIgIEVudGVyaW5nIGNhbGwgaW4gc2V0UGhvbmVTdGF0ZSgpIik7Ci0gICAgICAgIG1BcG1PYnNlcnZlci0+Z2V0Vm9sdW1lQ3VydmVzKCkuc3dpdGNoVm9sdW1lQ3VydmUoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX0RUTUYpOwotICAgIH0gZWxzZSBpZiAoaXNfc3RhdGVfaW5fY2FsbChvbGRTdGF0ZSkgJiYgIWlzX3N0YXRlX2luX2NhbGwoc3RhdGUpKSB7Ci0gICAgICAgIEFMT0dWKCIgIEV4aXRpbmcgY2FsbCBpbiBzZXRQaG9uZVN0YXRlKCkiKTsKLSAgICAgICAgbUFwbU9ic2VydmVyLT5nZXRWb2x1bWVDdXJ2ZXMoKS5yZXN0b3JlT3JpZ2luVm9sdW1lQ3VydmUoQVVESU9fU1RSRUFNX0RUTUYpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KIHN0YXR1c190IEVuZ2luZTo6c2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKIHsKICAgICBzd2l0Y2godXNhZ2UpIHsKQEAgLTEwMSw3ICs3NSw2IEBACiAgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX0NPTU1VTklDQVRJT04iLCBjb25maWcpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUE6CiAgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0hFQURQSE9ORVMgJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9BMkRQICYmCkBAIC0xMTIsNyArODUsNiBAQAogICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9NRURJQSIsIGNvbmZpZyk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkQ6CiAgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTyAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1dJUkVEX0FDQ0VTU09SWSAmJgpAQCAtMTIwLDcgKzkyLDYgQEAKICAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfUkVDT1JEIiwgY29uZmlnKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0s6CiAgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUgJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9DQVJfRE9DSyAmJgpAQCAtMTMwLDIxICsxMDEsMTggQEAKICAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfRElHSVRBTF9ET0NLKSB7CiAgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX0RPQ0siLCBjb25maWcpOwogICAgICAgICB9Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU06CiAgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUgJiYKICAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSB7CiAgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX1NZU1RFTSIsIGNvbmZpZyk7CiAgICAgICAgIH0KLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPOgogICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmCiAgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0hETUlfU1lTVEVNX0FVRElPX0VORk9SQ0VEKSB7CiAgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgSERNSV9TWVNURU1fQVVESU8iLCBjb25maWcpOwogICAgICAgICB9Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EOgogICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmCkBAIC0xNTQsMTA5ICsxMjIsMjUgQEAKICAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBFTkNPREVEX1NVUlJPVU5EIiwgY29uZmlnKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1ZJQlJBVEVfUklOR0lORzoKICAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkgewogICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9WSUJSQVRFX1JJTkdJTkciLCBjb25maWcpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIHVzYWdlICVkIiwgdXNhZ2UpOwogICAgICAgICBicmVhazsgLy8gVE9ETyByZXR1cm4gQkFEX1ZBTFVFPwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgcmV0dXJuIEVuZ2luZUJhc2U6OnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOwogfQogCi1yb3V0aW5nX3N0cmF0ZWd5IEVuZ2luZTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgLy8gc3RyZWFtIHRvIHN0cmF0ZWd5IG1hcHBpbmcKLSAgICBzd2l0Y2ggKHN0cmVhbSkgewotICAgIGNhc2UgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw6Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1BIT05FOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX1JJTkc6Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fQUxBUk06Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT047Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fRFRNRjoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX0RUTUY7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR0UoInVua25vd24gc3RyZWFtIHR5cGUgJWQiLCBzdHJlYW0pOwotICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9TWVNURU06Ci0gICAgICAgIC8vIE5PVEU6IFNZU1RFTSBzdHJlYW0gdXNlcyBNRURJQSBzdHJhdGVneSBiZWNhdXNlIG11dGluZyBtdXNpYyBhbmQgc3dpdGNoaW5nIG91dHB1dHMKLSAgICAgICAgLy8gd2hpbGUga2V5IGNsaWNrcyBhcmUgcGxheWVkIHByb2R1Y2VzIGEgcG9vciByZXN1bHQKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9NVVNJQzoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX01FRElBOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX1RUUzoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUjsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfQUNDRVNTSUJJTElUWTsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9SRVJPVVRJTkc6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9SRVJPVVRJTkc7Ci0gICAgfQotfQotCi1yb3V0aW5nX3N0cmF0ZWd5IEVuZ2luZTo6Z2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKQotewotICAgIC8vIHVzYWdlIHRvIHN0cmF0ZWd5IG1hcHBpbmcKLSAgICBzd2l0Y2ggKHVzYWdlKSB7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTlQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX01FRElBOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfUEhPTkU7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX0RUTUY7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1NPTklGSUNBVElPTjsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX01FRElBOwotICAgIH0KLX0KLQotYXVkaW9fZGV2aWNlc190IEVuZ2luZTo6Z2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkgY29uc3QKLXsKLSAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyA9IG1BcG1PYnNlcnZlci0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOwotICAgIERldmljZVZlY3RvciBhdmFpbGFibGVJbnB1dERldmljZXMgPSBtQXBtT2JzZXJ2ZXItPmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpOwotCi0gICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMgPSBtQXBtT2JzZXJ2ZXItPmdldE91dHB1dHMoKTsKLQotICAgIHJldHVybiBnZXREZXZpY2VGb3JTdHJhdGVneUludChzdHJhdGVneSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzLCAodWludDMyX3QpQVVESU9fREVWSUNFX05PTkUpOwotfQotCi0KLWF1ZGlvX2RldmljZXNfdCBFbmdpbmU6OmdldERldmljZUZvclN0cmF0ZWd5SW50KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAotICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzLAotICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cywKLSAgICAgICAgdWludDMyX3Qgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSkgY29uc3QKK2F1ZGlvX2RldmljZXNfdCBFbmdpbmU6OmdldERldmljZUZvclN0cmF0ZWd5SW50KGxlZ2FjeV9zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZUlucHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSkgY29uc3QKIHsKICAgICB1aW50MzJfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKICAgICB1aW50MzJfdCBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSA9CkBAIC0yNjksMTYgKzE1MywxNyBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw6Ci0gICAgICAgIGlmIChpc0luQ2FsbCgpIHx8IG91dHB1dHMuaXNTdHJlYW1BY3RpdmVMb2NhbGx5KEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkgeworICAgICAgICBpZiAoaXNJbkNhbGwoKSB8fCBvdXRwdXRzLmlzQWN0aXZlTG9jYWxseShzdHJlYW1Ub1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkpKSB7CiAgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneUludCgKICAgICAgICAgICAgICAgICAgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMsCiAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZVR5cGVzVG9JZ25vcmUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYm9vbCBtZWRpYV9hY3RpdmVfbG9jYWxseSA9Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNTdHJlYW1BY3RpdmVMb2NhbGx5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpCi0gICAgICAgICAgICAgICAgICAgIHx8IG91dHB1dHMuaXNTdHJlYW1BY3RpdmVMb2NhbGx5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZLCBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNBY3RpdmVMb2NhbGx5KHN0cmVhbVRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9NVVNJQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKQorICAgICAgICAgICAgICAgICAgICB8fCBvdXRwdXRzLmlzQWN0aXZlTG9jYWxseSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKTsKICAgICAgICAgICAgIC8vIHJvdXRpbmcgaXMgc2FtZSBhcyBtZWRpYSB3aXRob3V0IHRoZSAicmVtb3RlIiBkZXZpY2UKICAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5SW50KFNUUkFURUdZX01FRElBLAogICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLApAQCAtMzE1LDE0ICsyMDAsMTQgQEAKICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eERldmljZSA9IGdldERldmljZUZvcklucHV0U291cmNlKEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OKTsKICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gcHJpbWFyeU91dHB1dCA9IG91dHB1dHMuZ2V0UHJpbWFyeU91dHB1dCgpOwogICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsUHJpbWFyeUlucHV0RGV2aWNlcyA9Ci0gICAgICAgICAgICAgICAgIGF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKHByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZVR5cGVzRnJvbUh3TW9kdWxlKHByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpKTsKIAogICAgICAgICAgICAgLy8gVE9ETzogZ2V0UHJpbWFyeU91dHB1dCByZXR1cm4gb25seSBkZXZpY2VzIGZyb20gZmlyc3QgbW9kdWxlIGluCiAgICAgICAgICAgICAvLyBhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwsIGhlYXJpbmcgYWlkIGlzIG5vdCB0aGVyZSwgYnV0IGl0J3MKICAgICAgICAgICAgIC8vIGEgcHJpbWFyeSBkZXZpY2UKICAgICAgICAgICAgIC8vIEZJWE1FOiB0aGlzIGlzIG5vdCB0aGUgcmlnaHQgd2F5IG9mIHNvbHZpbmcgdGhpcyBwcm9ibGVtCiAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxQcmltYXJ5T3V0cHV0RGV2aWNlcyA9Ci0gICAgICAgICAgICAgICAgKHByaW1hcnlPdXRwdXQtPnN1cHBvcnRlZERldmljZXMoKSB8IEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpICYKKyAgICAgICAgICAgICAgICAocHJpbWFyeU91dHB1dC0+c3VwcG9ydGVkRGV2aWNlcygpLnR5cGVzKCkgfCBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEKSAmCiAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOwogCiAgICAgICAgICAgICBpZiAoKChhdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmCkBAIC0zMzQsNyArMjE5LDcgQEAKICAgICAgICAgfQogICAgICAgICAvLyBmb3IgcGhvbmUgc3RyYXRlZ3ksIHdlIGZpcnN0IGNvbnNpZGVyIHRoZSBmb3JjZWQgdXNlIGFuZCB0aGVuIHRoZSBhdmFpbGFibGUgZGV2aWNlcyBieQogICAgICAgICAvLyBvcmRlciBvZiBwcmlvcml0eQotICAgICAgICBzd2l0Y2ggKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dKSB7CisgICAgICAgIHN3aXRjaCAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OKSkgewogICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ086CiAgICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkgfHwgc3RyYXRlZ3kgIT0gU1RSQVRFR1lfRFRNRikgewogICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVDsKQEAgLTM1Miw3ICsyMzcsNyBAQAogICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CiAgICAgICAgICAgICAvLyB3aGVuIG5vdCBpbiBhIHBob25lIGNhbGwsIHBob25lIHN0cmF0ZWd5IHNob3VsZCByb3V0ZSBTVFJFQU1fVk9JQ0VfQ0FMTCB0byBBMkRQCiAgICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUEpICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgogICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5pc0EyZHBTdXBwb3J0ZWQoKSkgewogICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUDsKICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKQEAgLTM4Niw3ICsyNzEsNyBAQAogICAgICAgICAgICAgLy8gd2hlbiBub3QgaW4gYSBwaG9uZSBjYWxsLCBwaG9uZSBzdHJhdGVneSBzaG91bGQgcm91dGUgU1RSRUFNX1ZPSUNFX0NBTEwgdG8KICAgICAgICAgICAgIC8vIEEyRFAgc3BlYWtlciB3aGVuIGZvcmNpbmcgdG8gc3BlYWtlciBvdXRwdXQKICAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgotICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgorICAgICAgICAgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQTJkcFN1cHBvcnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI7CiAgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CkBAIC00MTAsOSArMjk1LDkgQEAKIAogICAgIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OOgogCi0gICAgICAgIC8vIElmIGluY2FsbCwganVzdCBzZWxlY3QgdGhlIFNUUkFURUdZX1BIT05FIGRldmljZTogVGhlIHJlc3Qgb2YgdGhlIGJlaGF2aW9yIGlzIGhhbmRsZWQgYnkKLSAgICAgICAgLy8gaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkuCi0gICAgICAgIGlmIChpc0luQ2FsbCgpIHx8IG91dHB1dHMuaXNTdHJlYW1BY3RpdmVMb2NhbGx5KEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkgeworICAgICAgICAvLyBJZiBpbmNhbGwsIGp1c3Qgc2VsZWN0IHRoZSBTVFJBVEVHWV9QSE9ORSBkZXZpY2UKKyAgICAgICAgaWYgKGlzSW5DYWxsKCkgfHwKKyAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQWN0aXZlTG9jYWxseShzdHJlYW1Ub1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkpKSB7CiAgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneUludCgKICAgICAgICAgICAgICAgICAgICAgU1RSQVRFR1lfUEhPTkUsIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cywKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSk7CkBAIC00MjcsNyArMzEyLDcgQEAKICAgICAgICAgLy8gICAtIGluIGNvdW50cmllcyB3aGVyZSBub3QgZW5mb3JjZWQgaW4gd2hpY2ggY2FzZSBpdCBmb2xsb3dzIFNUUkFURUdZX01FRElBCiAKICAgICAgICAgaWYgKChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHx8Ci0gICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkpIHsKKyAgICAgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpKSB7CiAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKICAgICAgICAgfQogCkBAIC00NDMsOSArMzI4LDkgQEAKICAgICAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ087CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBVc2UgT05MWSBCbHVldG9vdGggU0NPIG91dHB1dCB3aGVuIHJpbmdpbmcgaW4gdmlicmF0aW9uIG1vZGUKLSAgICAgICAgICAgIGlmICghKChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpCisgICAgICAgICAgICBpZiAoISgoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpCiAgICAgICAgICAgICAgICAgICAgICYmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfVklCUkFURV9SSU5HSU5HXQorICAgICAgICAgICAgICAgIGlmIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1ZJQlJBVEVfUklOR0lORykKICAgICAgICAgICAgICAgICAgICAgICAgID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZTIgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSA9IGRldmljZTI7CkBAIC00NTQsNyArMzM5LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBVc2UgYm90aCBCbHVldG9vdGggU0NPIGFuZCBwaG9uZSBkZWZhdWx0IG91dHB1dCB3aGVuIHJpbmdpbmcgaW4gbm9ybWFsIG1vZGUKLSAgICAgICAgICAgIGlmIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB7CisgICAgICAgICAgICBpZiAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB7CiAgICAgICAgICAgICAgICAgaWYgKChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpKSB7CkBAIC00NzYsNyArMzYxLDcgQEAKICAgICAgICAgICAgIC8vIGNvbXByZXNzZWQgZm9ybWF0IGFzIHRoZXkgd291bGQgbGlrZWx5IG5vdCBiZSBtaXhlZCBhbmQgZHJvcHBlZC4KICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IGRlc2MtPmRldmljZSgpICYKKyAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IGRlc2MtPmRldmljZXMoKS50eXBlcygpICYKICAgICAgICAgICAgICAgICAgICAgKEFVRElPX0RFVklDRV9PVVRfSERNSSB8IEFVRElPX0RFVklDRV9PVVRfU1BESUYgfCBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDKTsKICAgICAgICAgICAgICAgICBpZiAoZGVzYy0+aXNBY3RpdmUoKSAmJiAhYXVkaW9faXNfbGluZWFyX3BjbShkZXNjLT5tRm9ybWF0KSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcyAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewpAQCAtNDg0LDkgKzM2OSw5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyA9Ci0gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlKTsKLSAgICAgICAgICAgIGlmIChvdXRwdXRzLmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9SSU5HKSB8fAotICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9BTEFSTSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRzLmlzQWN0aXZlKHN0cmVhbVRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9SSU5HKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5pc0FjdGl2ZShzdHJlYW1Ub1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQUxBUk0pKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBnZXREZXZpY2VGb3JTdHJhdGVneUludCgKICAgICAgICAgICAgICAgICAgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMsCiAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZVR5cGVzVG9JZ25vcmUpOwpAQCAtNTA3LDcgKzM5Miw3IEBACiAgICAgICAgIGlmIChzdHJhdGVneSAhPSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHsKICAgICAgICAgICAgIC8vIG5vIHNvbmlmaWNhdGlvbiBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKICAgICAgICAgICAgIGlmIChhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiMCIpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiMCIpLCBBVURJT19GT1JNQVRfREVGQVVMVCkgIT0gMCkgewogICAgICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUxNywxMSArNDAyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZVR5cGVzVG9JZ25vcmUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgLy8gRklYTUU6IEZpbmQgYSBiZXR0ZXIgc29sdXRpb24gdG8gcHJldmVudCByb3V0aW5nIHRvIEJUIGhlYXJpbmcgYWlkKGIvMTIyOTMxMjYxKS4KKyAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSAmJgorICAgICAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkpIHsKICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSAmJgotICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCisgICAgICAgICAgICAgICAgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUEpICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgogICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQTJkcFN1cHBvcnRlZCgpKSB7CiAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOwogICAgICAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKQEAgLTUzMiw3ICs0MTksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKLSAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVIpKSB7CisgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVIpKSB7CiAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKQEAgLTU2MSw3ICs0NDgsNyBAQAogICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTDsKICAgICAgICAgfQogICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmCi0gICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0tdID09IEFVRElPX1BPTElDWV9GT1JDRV9BTkFMT0dfRE9DSykpIHsKKyAgICAgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQU5BTE9HX0RPQ0spKSB7CiAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUOwogICAgICAgICB9CiAgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CkBAIC01ODIsNyArNDY5LDcgQEAKIAogICAgICAgICAvLyBJZiBoZG1pIHN5c3RlbSBhdWRpbyBtb2RlIGlzIG9uLCByZW1vdmUgc3BlYWtlciBvdXQgb2Ygb3V0cHV0IGxpc3QuCiAgICAgICAgIGlmICgoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpICYmCi0gICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU9dID09CisgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJTykgPT0KICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfSERNSV9TWVNURU1fQVVESU9fRU5GT1JDRUQpKSB7CiAgICAgICAgICAgICBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKICAgICAgICAgfQpAQCAtNjA0LDcgKzQ5MSw3IEBACiAKICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CiAgICAgICAgIEFMT0dWKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIG5vIGRldmljZSBmb3VuZCBmb3Igc3RyYXRlZ3kgJWQiLCBzdHJhdGVneSk7Ci0gICAgICAgIGRldmljZSA9IG1BcG1PYnNlcnZlci0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpLT50eXBlKCk7CisgICAgICAgIGRldmljZSA9IGdldEFwbU9ic2VydmVyKCktPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+dHlwZSgpOwogICAgICAgICBBTE9HRV9JRihkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUsCiAgICAgICAgICAgICAgICAgICJnZXREZXZpY2VGb3JTdHJhdGVneSgpIG5vIGRlZmF1bHQgZGV2aWNlIGRlZmluZWQiKTsKICAgICB9CkBAIC02MTUsOSArNTAyLDkgQEAKIAogYXVkaW9fZGV2aWNlc190IEVuZ2luZTo6Z2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpIGNvbnN0CiB7Ci0gICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gbUFwbU9ic2VydmVyLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7Ci0gICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVJbnB1dERldmljZXMgPSBtQXBtT2JzZXJ2ZXItPmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpOwotICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gbUFwbU9ic2VydmVyLT5nZXRPdXRwdXRzKCk7CisgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOworICAgIGNvbnN0IERldmljZVZlY3RvciAmYXZhaWxhYmxlSW5wdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCk7CisgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRPdXRwdXRzKCk7CiAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZURldmljZVR5cGVzID0gYXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKIAogICAgIHVpbnQzMl90IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwpAQCAtNjMyLDYgKzUxOSw3IEBACiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEOgogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOgogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1BFUkZPUk1BTkNFOgogICAgICAgICAgICAgaW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpAQCAtNjUxLDcgKzUzOSw3IEBACiAgICAgY2FzZSBBVURJT19TT1VSQ0VfTUlDOgogICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgewogICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFA7Ci0gICAgfSBlbHNlIGlmICgobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSAmJgorICAgIH0gZWxzZSBpZiAoKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSAmJgogICAgICAgICAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSkgewogICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUOwogICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCkgewpAQCAtNjcxLDEyICs1NTksMTEgQEAKICAgICAgICAgaWYgKChnZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSAmJgogICAgICAgICAgICAgICAgIChhdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCkgPT0gMCkgewogICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBwcmltYXJ5T3V0cHV0ID0gb3V0cHV0cy5nZXRQcmltYXJ5T3V0cHV0KCk7Ci0gICAgICAgICAgICBhdmFpbGFibGVEZXZpY2VUeXBlcyA9Ci0gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKHByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpKQotICAgICAgICAgICAgICAgICAgICAmIH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgICAgICAgICAgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPSBhdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlVHlwZXNGcm9tSHdNb2R1bGUoCisgICAgICAgICAgICAgICAgICAgIHByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOwogICAgICAgICB9CiAKLSAgICAgICAgc3dpdGNoIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSkgeworICAgICAgICBzd2l0Y2ggKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTikpIHsKICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPOgogICAgICAgICAgICAgLy8gaWYgU0NPIGRldmljZSBpcyByZXF1ZXN0ZWQgYnV0IG5vIFNDTyBkZXZpY2UgaXMgYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gZGVmYXVsdCBjYXNlCiAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSB7CkBAIC03MTAsNyArNTk3LDcgQEAKICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjoKICAgICBjYXNlIEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRDoKICAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOgotICAgICAgICBpZiAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmCisgICAgICAgIGlmIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRCkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTyAmJgogICAgICAgICAgICAgICAgIGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkgewogICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKICAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSB7CkBAIC03MzksMTYgKzYyNiwzMiBAQAogICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEw7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0U6CisgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVDsKKyAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVCkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VUOworICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFOworICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDoKICAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpIHsKICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwotICAgICBjYXNlIEFVRElPX1NPVVJDRV9GTV9UVU5FUjoKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9GTV9UVU5FUjoKICAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSKSB7CiAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fRk1fVFVORVI7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0U6CisgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9FQ0hPX1JFRkVSRU5DRSkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0VDSE9fUkVGRVJFTkNFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIEFMT0dXKCJnZXREZXZpY2VGb3JJbnB1dFNvdXJjZSgpIGludmFsaWQgaW5wdXQgc291cmNlICVkIiwgaW5wdXRTb3VyY2UpOwogICAgICAgICBicmVhazsKQEAgLTc2NSwxMCArNjY4LDEwNyBAQAogICAgIHJldHVybiBkZXZpY2U7CiB9CiAKK3ZvaWQgRW5naW5lOjp1cGRhdGVEZXZpY2VTZWxlY3Rpb25DYWNoZSgpCit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKSkgeworICAgICAgICBjb25zdCBhdXRvICZzdHJhdGVneSA9IGl0ZXIuc2Vjb25kOworICAgICAgICBhdXRvIGRldmljZXMgPSBnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5LT5nZXRJZCgpKTsKKyAgICAgICAgbURldmljZXNGb3JTdHJhdGVnaWVzW3N0cmF0ZWd5LT5nZXRJZCgpXSA9IGRldmljZXM7CisgICAgICAgIHN0cmF0ZWd5LT5zZXREZXZpY2VUeXBlcyhkZXZpY2VzLnR5cGVzKCkpOworICAgICAgICBzdHJhdGVneS0+c2V0RGV2aWNlQWRkcmVzcyhkZXZpY2VzLmdldEZpcnN0VmFsaWRBZGRyZXNzKCkuY19zdHIoKSk7CisgICAgfQorfQorCitEZXZpY2VWZWN0b3IgRW5naW5lOjpnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgY29uc3QKK3sKKyAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKTsKKyAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCk7CisgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRPdXRwdXRzKCk7CisKKyAgICBhdXRvIGxlZ2FjeVN0cmF0ZWd5ID0gbUxlZ2FjeVN0cmF0ZWd5TWFwLmZpbmQoc3RyYXRlZ3kpICE9IGVuZChtTGVnYWN5U3RyYXRlZ3lNYXApID8KKyAgICAgICAgICAgICAgICBtTGVnYWN5U3RyYXRlZ3lNYXAuYXQoc3RyYXRlZ3kpIDogU1RSQVRFR1lfTk9ORTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IGdldERldmljZUZvclN0cmF0ZWd5SW50KGxlZ2FjeVN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClBVURJT19ERVZJQ0VfTk9ORSk7CisgICAgcmV0dXJuIGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhkZXZpY2VzKTsKK30KKworRGV2aWNlVmVjdG9yIEVuZ2luZTo6Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnByZWZlcnJlZERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKSBjb25zdAoreworICAgIC8vIEZpcnN0IGNoZWNrIGZvciBleHBsaWN0IHJvdXRpbmcgZGV2aWNlCisgICAgaWYgKHByZWZlcnJlZERldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCIlcyBleHBsaWNpdCBSb3V0aW5nIG9uIGRldmljZSAlcyIsIF9fZnVuY19fLCBwcmVmZXJyZWREZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IocHJlZmVycmVkRGV2aWNlKTsKKyAgICB9CisgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5ID0gZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7CisgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRPdXRwdXRzKCk7CisgICAgLy8KKyAgICAvLyBAVE9ETzogd2hhdCBpcyB0aGUgcHJpb3JpdHkgb2YgZXhwbGljaXQgcm91dGluZz8gU2hhbGwgaXQgYmUgY29uc2lkZXJlZCBmaXJzdCBhcyBpdCB1c2VkIHRvCisgICAgLy8gYmUgYnkgQVBNPworICAgIC8vCisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIGFsbCBhY3RpdmUgY2xpZW50cyBoYXZlIGEgcHJlZmVycmVkIHJvdXRlIGluIHdoaWNoCisgICAgLy8gY2FzZSB0aGUgbGFzdCBhY3RpdmUgY2xpZW50IHJvdXRlIGlzIHVzZWQKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBmaW5kUHJlZmVycmVkRGV2aWNlKG91dHB1dHMsIHN0cmF0ZWd5LCBhdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKKyAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcihkZXZpY2UpOworICAgIH0KKworICAgIHJldHVybiBmcm9tQ2FjaGU/IG1EZXZpY2VzRm9yU3RyYXRlZ2llcy5hdChzdHJhdGVneSkgOiBnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5KTsKK30KKworRGV2aWNlVmVjdG9yIEVuZ2luZTo6Z2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBmcm9tQ2FjaGUpIGNvbnN0Cit7CisgICAgYXV0byBhdHRyaWJ1dGVzID0gZ2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoc3RyZWFtKTsKKyAgICByZXR1cm4gZ2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgbnVsbHB0ciwgZnJvbUNhY2hlKTsKK30KKworc3A8RGV2aWNlRGVzY3JpcHRvcj4gRW5naW5lOjpnZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+ICptaXgpIGNvbnN0Cit7CisgICAgY29uc3QgYXV0byAmcG9saWN5TWl4ZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdWRpb1BvbGljeU1peENvbGxlY3Rpb24oKTsKKyAgICBjb25zdCBhdXRvICZhdmFpbGFibGVJbnB1dERldmljZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKTsKKyAgICBjb25zdCBhdXRvICZpbnB1dHMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRJbnB1dHMoKTsKKyAgICBzdGQ6OnN0cmluZyBhZGRyZXNzOworCisgICAgLy8KKyAgICAvLyBFeHBsaWNpdCBSb3V0aW5nID8/PyB3aGF0IGlzIHRoZSBwcmlvcml0eSBvZiBleHBsaWNpdCByb3V0aW5nPyBTaGFsbCBpdCBiZSBjb25zaWRlcmVkCisgICAgLy8gZmlyc3QgYXMgaXQgdXNlZCB0byBiZSBieSBBUE0/CisgICAgLy8KKyAgICAvLyBIb25vciBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3RzIG9ubHkgaWYgYWxsIGFjdGl2ZSBjbGllbnRzIGhhdmUgYSBwcmVmZXJyZWQgcm91dGUgaW4gd2hpY2gKKyAgICAvLyBjYXNlIHRoZSBsYXN0IGFjdGl2ZSBjbGllbnQgcm91dGUgaXMgdXNlZAorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9CisgICAgICAgICAgICBmaW5kUHJlZmVycmVkRGV2aWNlKGlucHV0cywgYXR0ci5zb3VyY2UsIGF2YWlsYWJsZUlucHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBkZXZpY2U7CisgICAgfQorCisgICAgZGV2aWNlID0gcG9saWN5TWl4ZXMuZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoYXR0ci5zb3VyY2UsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgbWl4KTsKKyAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGRldmljZTsKKyAgICB9CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdHRyLnNvdXJjZSk7CisKKyAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoZGV2aWNlVHlwZSkpIHsKKyAgICAgICAgYWRkcmVzcyA9ICIwIjsKKyAgICAgICAgc3RkOjpzaXplX3QgcG9zOworICAgICAgICBzdGQ6OnN0cmluZyB0YWdzIHsgYXR0ci50YWdzIH07CisgICAgICAgIGlmICgocG9zID0gdGFncy5maW5kKCJhZGRyPSIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgYWRkcmVzcyA9IHRhZ3Muc3Vic3RyKHBvcyArIHN0ZDo6c3RybGVuKCJhZGRyPSIpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZShkZXZpY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoYWRkcmVzcy5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7Cit9CisKIHRlbXBsYXRlIDw+CiBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UgKkVuZ2luZTo6cXVlcnlJbnRlcmZhY2UoKQogewotICAgIHJldHVybiAmbU1hbmFnZXJJbnRlcmZhY2U7CisgICAgcmV0dXJuIHRoaXM7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuaAppbmRleCAwNjE4NmMxLi5kNWRmYWNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuaApAQCAtMTYsNyArMTYsNyBAQAogCiAjcHJhZ21hIG9uY2UKIAotCisjaW5jbHVkZSAiRW5naW5lQmFzZS5oIgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oIgogI2luY2x1ZGUgPEF1ZGlvR2Fpbi5oPgogI2luY2x1ZGUgPHBvbGljeS5oPgpAQCAtMjksMTE0ICsyOSw2NyBAQAogbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQogewogCi1jbGFzcyBFbmdpbmUKK2VudW0gbGVnYWN5X3N0cmF0ZWd5IHsKKyAgICBTVFJBVEVHWV9OT05FID0gLTEsCisgICAgU1RSQVRFR1lfTUVESUEsCisgICAgU1RSQVRFR1lfUEhPTkUsCisgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLAorICAgIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMLAorICAgIFNUUkFURUdZX0RUTUYsCisgICAgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwKKyAgICBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIsCisgICAgU1RSQVRFR1lfQUNDRVNTSUJJTElUWSwKKyAgICBTVFJBVEVHWV9SRVJPVVRJTkcsCit9OworCitjbGFzcyBFbmdpbmUgOiBwdWJsaWMgRW5naW5lQmFzZQogewogcHVibGljOgogICAgIEVuZ2luZSgpOwotICAgIHZpcnR1YWwgfkVuZ2luZSgpOworICAgIHZpcnR1YWwgfkVuZ2luZSgpID0gZGVmYXVsdDsKIAogICAgIHRlbXBsYXRlIDxjbGFzcyBSZXF1ZXN0ZWRJbnRlcmZhY2U+CiAgICAgUmVxdWVzdGVkSW50ZXJmYWNlICpxdWVyeUludGVyZmFjZSgpOwogCiBwcml2YXRlOgotICAgIC8vLyBJbnRlcmZhY2UgbWVtYmVycwotICAgIGNsYXNzIE1hbmFnZXJJbnRlcmZhY2VJbXBsIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZQotICAgIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGV4cGxpY2l0IE1hbmFnZXJJbnRlcmZhY2VJbXBsKEVuZ2luZSAqcG9saWN5RW5naW5lKQotICAgICAgICAgICAgOiBtUG9saWN5RW5naW5lKHBvbGljeUVuZ2luZSkge30KKyAgICAvLy8KKyAgICAvLy8gZnJvbSBFbmdpbmVCYXNlLCBzbyBmcm9tIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZQorICAgIC8vLworICAgIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykgb3ZlcnJpZGU7CiAKLSAgICAgICAgdmlydHVhbCB2b2lkIHNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcikKLSAgICAgICAgewotICAgICAgICAgICAgbVBvbGljeUVuZ2luZS0+c2V0T2JzZXJ2ZXIob2JzZXJ2ZXIpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmluaXRDaGVjaygpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0U3RyYXRlZ3lGb3JVc2FnZSh1c2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0UGhvbmVTdGF0ZShtb2RlKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFBob25lU3RhdGUoKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRGb3JjZVVzZSh1c2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gLypkZXZEZXNjKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCAvKnN0YXRlKi8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIEVuZ2luZSAqbVBvbGljeUVuZ2luZTsKLSAgICB9IG1NYW5hZ2VySW50ZXJmYWNlOworICAgIERldmljZVZlY3RvciBnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZwcmVmZXJlZERldmljZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlID0gZmFsc2UpIGNvbnN0IG92ZXJyaWRlOworCisgICAgRGV2aWNlVmVjdG9yIGdldE91dHB1dERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUgPSBmYWxzZSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIHNwPEF1ZGlvUG9saWN5TWl4PiAqbWl4ID0gbnVsbHB0cikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHVwZGF0ZURldmljZVNlbGVjdGlvbkNhY2hlKCkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAgICAgLyogQ29weSBmYWNpbGl0aWVzIGFyZSBwdXQgcHJpdmF0ZSB0byBkaXNhYmxlIGNvcHkuICovCiAgICAgRW5naW5lKGNvbnN0IEVuZ2luZSAmb2JqZWN0KTsKICAgICBFbmdpbmUgJm9wZXJhdG9yPShjb25zdCBFbmdpbmUgJm9iamVjdCk7CiAKLSAgICB2b2lkIHNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcik7Ci0KLSAgICBzdGF0dXNfdCBpbml0Q2hlY2soKTsKLQotICAgIGlubGluZSBib29sIGlzSW5DYWxsKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBpc19zdGF0ZV9pbl9jYWxsKG1QaG9uZVN0YXRlKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKTsKLSAgICBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbVBob25lU3RhdGU7Ci0gICAgfQotICAgIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOwotICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1Gb3JjZVVzZVt1c2FnZV07Ci0gICAgfQogICAgIHN0YXR1c190IHNldERlZmF1bHREZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSk7CiAKLSAgICByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpIGNvbnN0OwotICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneUludChyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZU91dHB1dERldmljZXMsCi0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzLAotICAgICAgICAgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMsCi0gICAgICAgICAgICB1aW50MzJfdCBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKSBjb25zdDsKKyAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQobGVnYWN5X3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZUlucHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG91dHB1dERldmljZVR5cGVzVG9JZ25vcmUpIGNvbnN0OworCisgICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBjb25zdDsKKwogICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkgY29uc3Q7Ci0gICAgYXVkaW9fbW9kZV90IG1QaG9uZVN0YXRlOyAgLyoqPCBjdXJyZW50IHBob25lIHN0YXRlLiAqLwogCi0gICAgLyoqIGN1cnJlbnQgZm9yY2VkIHVzZSBjb25maWd1cmF0aW9uLiAqLwotICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UXTsKKyAgICBEZXZpY2VTdHJhdGVneU1hcCBtRGV2aWNlc0ZvclN0cmF0ZWdpZXM7CiAKLSAgICBBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqbUFwbU9ic2VydmVyOworICAgIHN0ZDo6bWFwPHByb2R1Y3Rfc3RyYXRlZ3lfdCwgbGVnYWN5X3N0cmF0ZWd5PiBtTGVnYWN5U3RyYXRlZ3lNYXA7CiB9OwogfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcAppbmRleCBmZDQ5NDczLi41NTc0ZTFjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKQEAgLTM4LDIxICszOCwyMCBAQAogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxhdWRpb19wb2xpY3lfY29uZi5oPgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5TWFuYWdlci5oIgotI2lmbmRlZiBVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCi0jaW5jbHVkZSA8Q29uZmlnUGFyc2luZ1V0aWxzLmg+Ci0jaW5jbHVkZSA8U3RyZWFtRGVzY3JpcHRvci5oPgotI2VuZGlmCiAjaW5jbHVkZSA8U2VyaWFsaXplci5oPgogI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKICNpbmNsdWRlIDxwb2xpY3kuaD4KQEAgLTY3LDI1ICs2NiwxNSBAQAogLy8gbWVkaWEgLyBub3RpZmljYXRpb24gLyBzeXN0ZW0gdm9sdW1lLgogY29uc3RleHByIGZsb2F0IElOX0NBTExfRUFSUElFQ0VfSEVBRFJPT01fREIgPSAzLmY7CiAKLSNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCi0vLyBBcnJheSBvZiBhbGwgc3Vycm91bmQgZm9ybWF0cy4KLXN0YXRpYyBjb25zdCBhdWRpb19mb3JtYXRfdCBTVVJST1VORF9GT1JNQVRTW10gPSB7Ci0gICAgQVVESU9fRk9STUFUX0FDMywKLSAgICBBVURJT19GT1JNQVRfRV9BQzMsCi0gICAgQVVESU9fRk9STUFUX0RUUywKLSAgICBBVURJT19GT1JNQVRfRFRTX0hELAotICAgIEFVRElPX0ZPUk1BVF9BQUNfTEMsCi0gICAgQVVESU9fRk9STUFUX0RPTEJZX1RSVUVIRCwKLSAgICBBVURJT19GT1JNQVRfRV9BQzNfSk9DLAotfTsKLS8vIEFycmF5IG9mIGFsbCBBQUMgZm9ybWF0cy4gV2hlbiBBQUMgaXMgZW5hYmxlZCBieSB1c2VycywgYWxsIEFBQyBmb3JtYXRzIHNob3VsZCBiZSBlbmFibGVkLgotc3RhdGljIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IEFBQ19GT1JNQVRTW10gPSB7Ci0gICAgQVVESU9fRk9STUFUX0FBQ19MQywKLSAgICBBVURJT19GT1JNQVRfQUFDX0hFX1YxLAotICAgIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjIsCi0gICAgQVVESU9fRk9STUFUX0FBQ19FTEQsCi0gICAgQVVESU9fRk9STUFUX0FBQ19YSEUsCi19OworLy8gQ29tcHJlc3NlZCBmb3JtYXRzIGZvciBNU0QgbW9kdWxlLCBvcmRlcmVkIGZyb20gbW9zdCBwcmVmZXJyZWQgdG8gbGVhc3QgcHJlZmVycmVkLgorc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiBjb21wcmVzc2VkRm9ybWF0c09yZGVyID0ge3sKKyAgICAgICAgQVVESU9fRk9STUFUX01BVF8yXzEsIEFVRElPX0ZPUk1BVF9NQVRfMl8wLCBBVURJT19GT1JNQVRfRV9BQzMsCisgICAgICAgIEFVRElPX0ZPUk1BVF9BQzMsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIH19OworLy8gQ2hhbm5lbCBtYXNrcyBmb3IgTVNEIG1vZHVsZSwgM0QgPiAyRCA+IDFEIG9yZGVyaW5nIChtb3N0IHByZWZlcnJlZCB0byBsZWFzdCBwcmVmZXJyZWQpLgorc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiBzdXJyb3VuZENoYW5uZWxNYXNrc09yZGVyID0ge3sKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMVBPSU5UMiwgQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMFBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMVBPSU5UMiwgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIH19OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBBdWRpb1BvbGljeUludGVyZmFjZSBpbXBsZW1lbnRhdGlvbgpAQCAtOTQsNDMgKzgzLDQ5IEBACiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoZGV2aWNlLCBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoZGV2aWNlLCBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0KTsKICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZkZXZpY2VfYWRkcmVzcykKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKQogewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtKGRldmljZV9hZGRyZXNzKTsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbShkZXZpY2UtPmFkZHJlc3MoKSk7CiAgICAgY29uc3QgU3RyaW5nOCBrZXkoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUgPwogICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1Db25uZWN0IDogQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbURpc2Nvbm5lY3QpOwotICAgIHBhcmFtLmFkZEludChrZXksIGRldmljZSk7CisgICAgcGFyYW0uYWRkSW50KGtleSwgZGV2aWNlLT50eXBlKCkpOwogICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKEFVRElPX0lPX0hBTkRMRV9OT05FLCBwYXJhbS50b1N0cmluZygpKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoYXVkaW9fZGV2aWNlc190IGRldmljZSwKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKIHsKLSAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KCkgZGV2aWNlOiAweCVYLCBzdGF0ZSAlZCwgYWRkcmVzcyAlcyBuYW1lICVzIiwKLSAgICAgICAgICAgIGRldmljZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7CisgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludCgpIGRldmljZTogMHglWCwgc3RhdGUgJWQsIGFkZHJlc3MgJXMgbmFtZSAlcyBmb3JtYXQgMHglWCIsCisgICAgICAgICAgICBkZXZpY2VUeXBlLCBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0KTsKIAogICAgIC8vIGNvbm5lY3QvZGlzY29ubmVjdCBvbmx5IDEgZGV2aWNlIGF0IGEgdGltZQotICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlVHlwZSkgJiYgIWF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2VUeXBlKSkgcmV0dXJuIEJBRF9WQUxVRTsKIAotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQotICAgICAgICAgICAgbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKGRldmljZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQorICAgICAgICAgICAgbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKGRldmljZVR5cGUsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSwgZW5jb2RlZEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSk7CisgICAgaWYgKGRldmljZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CiAKICAgICAvLyBoYW5kbGUgb3V0cHV0IGRldmljZXMKLSAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7CisgICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlVHlwZSkpIHsKICAgICAgICAgU29ydGVkVmVjdG9yIDxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKIAotICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihkZXZEZXNjKTsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YoZGV2aWNlKTsKIAogICAgICAgICAvLyBzYXZlIGEgY29weSBvZiB0aGUgb3BlbmVkIG91dHB1dCBkZXNjcmlwdG9ycyBiZWZvcmUgYW55IG91dHB1dCBpcyBvcGVuZWQgb3IgY2xvc2VkCiAgICAgICAgIC8vIGJ5IGNoZWNrT3V0cHV0c0ZvckRldmljZSgpLiBUaGlzIHdpbGwgYmUgbmVlZGVkIGJ5IGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpCkBAIC0xNDAsMjEgKzEzNSwyMyBAQAogICAgICAgICAvLyBoYW5kbGUgb3V0cHV0IGRldmljZSBjb25uZWN0aW9uCiAgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEU6IHsKICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBhbHJlYWR5IGNvbm5lY3RlZDogJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGRldmljZSBhbHJlYWR5IGNvbm5lY3RlZDogJXMiLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBjb25uZWN0aW5nIGRldmljZSAleCIsIGRldmljZSk7CisgICAgICAgICAgICBBTE9HVigiJXMoKSBjb25uZWN0aW5nIGRldmljZSAlcyBmb3JtYXQgJXgiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIGVuY29kZWRGb3JtYXQpOwogCiAgICAgICAgICAgICAvLyByZWdpc3RlciBuZXcgZGV2aWNlIGFzIGF2YWlsYWJsZQotICAgICAgICAgICAgaW5kZXggPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5hZGQoZGV2RGVzYyk7CisgICAgICAgICAgICBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChkZXZpY2UpOwogICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGb3JEZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGb3JEZXZpY2UoZGV2aWNlLCBlbmNvZGVkRm9ybWF0KTsKICAgICAgICAgICAgICAgICBpZiAobW9kdWxlID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0QoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNvdWxkIG5vdCBmaW5kIEhXIG1vZHVsZSBmb3IgZGV2aWNlICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGV2RGVzYyk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBjb3VsZCBub3QgZmluZCBIVyBtb2R1bGUgZm9yIGRldmljZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldmljZSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIG1vZHVsZSBuYW1lPSVzIiwgbW9kdWxlLT5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+YXR0YWNoKG1vZHVsZSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CkBAIC0xNjIsOTMgKzE1OSwxMjQgQEAKIAogICAgICAgICAgICAgLy8gQmVmb3JlIGNoZWNraW5nIG91dHB1dHMsIGJyb2FkY2FzdCBjb25uZWN0IGV2ZW50IHRvIGFsbG93IEhBTCB0byByZXRyaWV2ZSBkeW5hbWljCiAgICAgICAgICAgICAvLyBwYXJhbWV0ZXJzIG9uIG5ld2x5IGNvbm5lY3RlZCBkZXZpY2VzIChpbnN0ZWFkIG9mIG9wZW5pbmcgdGhlIG91dHB1dHMuLi4pCi0gICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwgZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUpOwogCi0gICAgICAgICAgICBpZiAoY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBvdXRwdXRzLCBkZXZEZXNjLT5tQWRkcmVzcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGV2RGVzYyk7CisgICAgICAgICAgICBpZiAoY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgc3RhdGUsIG91dHB1dHMpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldmljZSk7CiAKLSAgICAgICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgbUh3TW9kdWxlcy5jbGVhblVwRm9yRGV2aWNlKGRldmljZSk7CisKKyAgICAgICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBQcm9wYWdhdGUgZGV2aWNlIGF2YWlsYWJpbGl0eSB0byBFbmdpbmUKLSAgICAgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZEZXNjLCBzdGF0ZSk7CisgICAgICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSk7CiAKICAgICAgICAgICAgIC8vIG91dHB1dHMgc2hvdWxkIG5ldmVyIGJlIGVtcHR5IGhlcmUKICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG91dHB1dHMuc2l6ZSgpICE9IDAsICJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKToiCiAgICAgICAgICAgICAgICAgICAgICJjaGVja091dHB1dHNGb3JEZXZpY2UoKSByZXR1cm5lZCBubyBvdXRwdXRzIGJ1dCBzdGF0dXMgT0siKTsKLSAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBjaGVja091dHB1dHNGb3JEZXZpY2UoKSByZXR1cm5lZCAlenUgb3V0cHV0cyIsCi0gICAgICAgICAgICAgICAgICBvdXRwdXRzLnNpemUoKSk7CisgICAgICAgICAgICBBTE9HVigiJXMoKSBjaGVja091dHB1dHNGb3JEZXZpY2UoKSByZXR1cm5lZCAlenUgb3V0cHV0cyIsIF9fZnVuY19fLCBvdXRwdXRzLnNpemUoKSk7CiAKICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlIGRpc2Nvbm5lY3Rpb24KICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOiB7CiAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBub3QgY29ubmVjdGVkOiAleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgZGV2aWNlIG5vdCBjb25uZWN0ZWQ6ICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkaXNjb25uZWN0aW5nIG91dHB1dCBkZXZpY2UgJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgQUxPR1YoIiVzKCkgZGlzY29ubmVjdGluZyBvdXRwdXQgZGV2aWNlICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKIAogICAgICAgICAgICAgLy8gU2VuZCBEaXNjb25uZWN0IHRvIEhBTHMKLSAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLCBkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSk7CiAKICAgICAgICAgICAgIC8vIHJlbW92ZSBkZXZpY2UgZnJvbSBhdmFpbGFibGUgb3V0cHV0IGRldmljZXMKLSAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKyAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZpY2UpOwogCi0gICAgICAgICAgICBjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2RGVzYywgc3RhdGUsIG91dHB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIG1PdXRwdXRzLmNsZWFyU2Vzc2lvblJvdXRlc0ZvckRldmljZShkZXZpY2UpOworCisgICAgICAgICAgICBjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBzdGF0ZSwgb3V0cHV0cyk7CisKKyAgICAgICAgICAgIC8vIFJlc2V0IGFjdGl2ZSBkZXZpY2UgY29kZWMKKyAgICAgICAgICAgIGRldmljZS0+c2V0RW5jb2RlZEZvcm1hdChBVURJT19GT1JNQVRfREVGQVVMVCk7CiAKICAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBkZXZpY2UgYXZhaWxhYmlsaXR5IHRvIEVuZ2luZQotICAgICAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldkRlc2MsIHN0YXRlKTsKKyAgICAgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlKTsKICAgICAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIHN0YXRlOiAleCIsIHN0YXRlKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIGludmFsaWQgc3RhdGU6ICV4IiwgX19mdW5jX18sIHN0YXRlKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBjaGVja0EyZHBTdXNwZW5kIG11c3QgcnVuIGJlZm9yZSBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMgc28gdGhhdCBBMkRQCi0gICAgICAgIC8vIG91dHB1dCBpcyBzdXNwZW5kZWQgYmVmb3JlIGFueSB0cmFja3MgYXJlIG1vdmVkIHRvIGl0Ci0gICAgICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKLSAgICAgICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7Ci0gICAgICAgIC8vIG91dHB1dHMgbXVzdCBiZSBjbG9zZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkgaXMgZXhlY3V0ZWQKLSAgICAgICAgaWYgKCFvdXRwdXRzLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBObyBuZWVkIHRvIGV2YWx1YXRlIHBsYXliYWNrIHJvdXRpbmcgd2hlbiBjb25uZWN0aW5nIGEgcmVtb3RlIHN1Ym1peAorICAgICAgICAvLyBvdXRwdXQgZGV2aWNlIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeSBvZiB0eXBlIHJlY29yZGVyIGFzIG5vCisgICAgICAgIC8vIHBsYXliYWNrIHVzZSBjYXNlIGlzIGFmZmVjdGVkLgorICAgICAgICBib29sIGRvQ2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzID0gdHJ1ZTsKKyAgICAgICAgaWYgKGRldmljZS0+dHlwZSgpID09IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWAorICAgICAgICAgICAgICAgICYmIHN0cm5jbXAoZGV2aWNlX2FkZHJlc3MsICIwIiwgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgIT0gMCkgewogICAgICAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgOiBvdXRwdXRzKSB7CiAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgICAgICAgICAgICAgIC8vIGNsb3NlIHVudXNlZCBvdXRwdXRzIGFmdGVyIGRldmljZSBkaXNjb25uZWN0aW9uIG9yIGRpcmVjdCBvdXRwdXRzIHRoYXQgaGF2ZSBiZWVuCi0gICAgICAgICAgICAgICAgLy8gb3BlbmVkIGJ5IGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHRvIHF1ZXJ5IGR5bmFtaWMgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgIGlmICgoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gZGVzYy0+bVBvbGljeU1peC5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHBvbGljeU1peCAhPSBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBwb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUworICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3RybmNtcChkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBkb0NoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjaGVjayBhZ2FpbiBhZnRlciBjbG9zaW5nIEEyRFAgb3V0cHV0IHRvIHJlc2V0IG1BMmRwU3VzcGVuZGVkIGlmIG5lZWRlZAotICAgICAgICAgICAgY2hlY2tBMmRwU3VzcGVuZCgpOwogICAgICAgICB9CiAKLSAgICAgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKLSAgICAgICAgaWYgKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX0lOX0NBTEwgJiYgaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZSk7CisgICAgICAgIGF1dG8gY2hlY2tDbG9zZU91dHB1dHMgPSBbJl0oKSB7CisgICAgICAgICAgICAvLyBvdXRwdXRzIG11c3QgYmUgY2xvc2VkIGFmdGVyIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpIGlzIGV4ZWN1dGVkCisgICAgICAgICAgICBpZiAoIW91dHB1dHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgOiBvdXRwdXRzKSB7CisgICAgICAgICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2UgdW51c2VkIG91dHB1dHMgYWZ0ZXIgZGV2aWNlIGRpc2Nvbm5lY3Rpb24gb3IgZGlyZWN0IG91dHB1dHMgdGhhdCBoYXZlCisgICAgICAgICAgICAgICAgICAgIC8vIGJlZW4gb3BlbmVkIGJ5IGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHRvIHF1ZXJ5IGR5bmFtaWMgcGFyYW1ldGVycworICAgICAgICAgICAgICAgICAgICBpZiAoKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgQTJEUCBhZ2FpbiBhZnRlciBjbG9zaW5nIEEyRFAgb3V0cHV0IHRvIHJlc2V0IG1BMmRwU3VzcGVuZGVkIGlmIG5lZWRlZAorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9OworCisgICAgICAgIGlmIChkb0NoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcykgeworICAgICAgICAgICAgY2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKGNoZWNrQ2xvc2VPdXRwdXRzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoZWNrQ2xvc2VPdXRwdXRzKCk7CiAgICAgICAgIH0KKworICAgICAgICBpZiAobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCAmJiBoYXNQcmltYXJ5T3V0cHV0KCkpIHsKKyAgICAgICAgICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2VzKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgbXNkT3V0RGV2aWNlcyA9IGdldE1zZEF1ZGlvT3V0RGV2aWNlcygpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CiAgICAgICAgICAgICBpZiAoKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSAhPSBBVURJT19NT0RFX0lOX0NBTEwpIHx8IChkZXNjICE9IG1QcmltYXJ5T3V0cHV0KSkgewotICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UoZGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMoZGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKTsKICAgICAgICAgICAgICAgICAvLyBkbyBub3QgZm9yY2UgZGV2aWNlIGNoYW5nZSBvbiBkdXBsaWNhdGVkIG91dHB1dCBiZWNhdXNlIGlmIGRldmljZSBpcyAwLCBpdCB3aWxsCiAgICAgICAgICAgICAgICAgLy8gYWxzbyBmb3JjZSBhIGRldmljZSAwIGZvciB0aGUgdHdvIG91dHB1dHMgaXQgaXMgZHVwbGljYXRlZCB0byB3aGljaCBtYXkgb3ZlcnJpZGUKICAgICAgICAgICAgICAgICAvLyBhIHZhbGlkIGRldmljZSBzZWxlY3Rpb24gb24gdGhvc2Ugb3V0cHV0cy4KLSAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gIWRlc2MtPmlzRHVwbGljYXRlZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoIWRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKQorICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSAobXNkT3V0RGV2aWNlcy5pc0VtcHR5KCkgfHwgbXNkT3V0RGV2aWNlcyAhPSBkZXNjLT5kZXZpY2VzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhZGVzYy0+aXNEdXBsaWNhdGVkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2VUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHdheXMgZm9yY2Ugd2hlbiBkaXNjb25uZWN0aW5nIChhIG5vbi1kdXBsaWNhdGVkIGRldmljZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpKTsKLSAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UoZGVzYywgbmV3RGV2aWNlLCBmb3JjZSwgMCk7CisgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhkZXNjLCBuZXdEZXZpY2VzLCBmb3JjZSwgMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgewotICAgICAgICAgICAgY2xlYW5VcEZvckRldmljZShkZXZEZXNjKTsKKyAgICAgICAgICAgIGNsZWFuVXBGb3JEZXZpY2UoZGV2aWNlKTsKICAgICAgICAgfQogCiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKQEAgLTI1Niw2NyArMjg0LDY2IEBACiAgICAgfSAgLy8gZW5kIGlmIGlzIG91dHB1dCBkZXZpY2UKIAogICAgIC8vIGhhbmRsZSBpbnB1dCBkZXZpY2VzCi0gICAgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpKSB7CisgICAgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2VUeXBlKSkgewogICAgICAgICBTb3J0ZWRWZWN0b3IgPGF1ZGlvX2lvX2hhbmRsZV90PiBpbnB1dHM7CiAKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihkZXZEZXNjKTsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihkZXZpY2UpOwogICAgICAgICBzd2l0Y2ggKHN0YXRlKQogICAgICAgICB7CiAgICAgICAgIC8vIGhhbmRsZSBpbnB1dCBkZXZpY2UgY29ubmVjdGlvbgogICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFOiB7CiAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2UgYWxyZWFkeSBjb25uZWN0ZWQ6ICVkIiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBkZXZpY2UgYWxyZWFkeSBjb25uZWN0ZWQ6ICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGb3JEZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZShkZXZpY2UsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKTogY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCk6IGNvdWxkIG5vdCBmaW5kIEhXIG1vZHVsZSBmb3IgZGV2aWNlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBCZWZvcmUgY2hlY2tpbmcgaW50cHV0cywgYnJvYWRjYXN0IGNvbm5lY3QgZXZlbnQgdG8gYWxsb3cgSEFMIHRvIHJldHJpZXZlIGR5bmFtaWMKICAgICAgICAgICAgIC8vIHBhcmFtZXRlcnMgb24gbmV3bHkgY29ubmVjdGVkIGRldmljZXMgKGluc3RlYWQgb2Ygb3BlbmluZyB0aGUgaW5wdXRzLi4uKQotICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlKTsKIAotICAgICAgICAgICAgaWYgKGNoZWNrSW5wdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBpbnB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIGlmIChjaGVja0lucHV0c0ZvckRldmljZShkZXZpY2UsIHN0YXRlLCBpbnB1dHMpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSk7CisKKyAgICAgICAgICAgICAgICBtSHdNb2R1bGVzLmNsZWFuVXBGb3JEZXZpY2UoZGV2aWNlKTsKKwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaW5kZXggPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmFkZChkZXZEZXNjKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpbmRleF0tPmF0dGFjaChtb2R1bGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmFkZChkZXZpY2UpIDwgMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBkZXZpY2UgYXZhaWxhYmlsaXR5IHRvIEVuZ2luZQotICAgICAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldkRlc2MsIHN0YXRlKTsKKyAgICAgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlKTsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlIGRpc2Nvbm5lY3Rpb24KICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOiB7CiAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBub3QgY29ubmVjdGVkOiAlZCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgZGV2aWNlIG5vdCBjb25uZWN0ZWQ6ICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkaXNjb25uZWN0aW5nIGlucHV0IGRldmljZSAleCIsIGRldmljZSk7CisgICAgICAgICAgICBBTE9HVigiJXMoKSBkaXNjb25uZWN0aW5nIGlucHV0IGRldmljZSAlcyIsIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKICAgICAgICAgICAgIC8vIFNldCBEaXNjb25uZWN0IHRvIEhBTHMKLSAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLCBkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSk7CiAKLSAgICAgICAgICAgIGNoZWNrSW5wdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBpbnB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKTsKLSAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOworICAgICAgICAgICAgY2hlY2tJbnB1dHNGb3JEZXZpY2UoZGV2aWNlLCBzdGF0ZSwgaW5wdXRzKTsKKyAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMucmVtb3ZlKGRldmljZSk7CiAKICAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBkZXZpY2UgYXZhaWxhYmlsaXR5IHRvIEVuZ2luZQotICAgICAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldkRlc2MsIHN0YXRlKTsKKyAgICAgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlKTsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgc3RhdGU6ICV4Iiwgc3RhdGUpOworICAgICAgICAgICAgQUxPR0UoIiVzKCkgaW52YWxpZCBzdGF0ZTogJXgiLCBfX2Z1bmNfXywgc3RhdGUpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogCkBAIC0zMjYsMTkgKzM1MywxOSBAQAogICAgICAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOwogCiAgICAgICAgIGlmIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMICYmIGhhc1ByaW1hcnlPdXRwdXQoKSkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2UpOworICAgICAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZXMpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHsKLSAgICAgICAgICAgIGNsZWFuVXBGb3JEZXZpY2UoZGV2RGVzYyk7CisgICAgICAgICAgICBjbGVhblVwRm9yRGV2aWNlKGRldmljZSk7CiAgICAgICAgIH0KIAogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9IC8vIGVuZCBpZiBpcyBpbnB1dCBkZXZpY2UKIAotICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIGRldmljZTogJXgiLCBkZXZpY2UpOworICAgIEFMT0dXKCIlcygpIGludmFsaWQgZGV2aWNlOiAlcyIsIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIApAQCAtMzQ2LDExICszNzMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKIHsKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KLSAgICAgICAgICAgIG1Id01vZHVsZXMuZ2V0RGV2aWNlRGVzY3JpcHRvcihkZXZpY2UsIGRldmljZV9hZGRyZXNzLCAiIiwKKyAgICAgICAgICAgIG1Id01vZHVsZXMuZ2V0RGV2aWNlRGVzY3JpcHRvcihkZXZpY2UsIGRldmljZV9hZGRyZXNzLCAiIiwgQVVESU9fRk9STUFUX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogYWxsb3dUb0NyZWF0ZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RybGVuKGRldmljZV9hZGRyZXNzKSAhPSAwKS8qbWF0Y2hBZGRyZXNzKi8pOwogCiAgICAgaWYgKGRldkRlc2MgPT0gMCkgewotICAgICAgICBBTE9HVygiZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgdW5kZWNsYXJlZCBkZXZpY2UsIHR5cGUgJTA4eCwgYWRkcmVzczogJXMiLAorICAgICAgICBBTE9HVigiZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgdW5kZWNsYXJlZCBkZXZpY2UsIHR5cGUgJTA4eCwgYWRkcmVzczogJXMiLAogICAgICAgICAgICAgICBkZXZpY2UsIGRldmljZV9hZGRyZXNzKTsKICAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7CiAgICAgfQpAQCAtMzYyLDU1ICszOTAsNjUgQEAKICAgICB9IGVsc2UgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpKSB7CiAgICAgICAgIGRldmljZVZlY3RvciA9ICZtQXZhaWxhYmxlSW5wdXREZXZpY2VzOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIGRldmljZSB0eXBlICUwOHgiLCBkZXZpY2UpOworICAgICAgICBBTE9HVygiJXMoKSBpbnZhbGlkIGRldmljZSB0eXBlICUwOHgiLCBfX2Z1bmNfXywgZGV2aWNlKTsKICAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7CiAgICAgfQogCi0gICAgcmV0dXJuIChkZXZpY2VWZWN0b3ItPmdldERldmljZShkZXZpY2UsIFN0cmluZzgoZGV2aWNlX2FkZHJlc3MpKSAhPSAwKSA/CisgICAgcmV0dXJuIChkZXZpY2VWZWN0b3ItPmdldERldmljZSgKKyAgICAgICAgICAgICAgICBkZXZpY2UsIFN0cmluZzgoZGV2aWNlX2FkZHJlc3MpLCBBVURJT19GT1JNQVRfREVGQVVMVCkgIT0gMCkgPwogICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUgOiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKIHsKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgU3RyaW5nOCByZXBseTsKICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKICAgICBpbnQgaXNSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQgPSAwOwogCi0gICAgQUxPR1YoImhhbmRsZURldmljZUNvbmZpZ0NoYW5nZSgoKSBkZXZpY2U6IDB4JVgsIGFkZHJlc3MgJXMgbmFtZSAlcyIsCi0gICAgICAgICAgZGV2aWNlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOworICAgIEFMT0dWKCJoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoKCkgZGV2aWNlOiAweCVYLCBhZGRyZXNzICVzIG5hbWUgJXMgZW5jb2RlZEZvcm1hdDogMHglWCIsCisgICAgICAgICAgZGV2aWNlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUsIGVuY29kZWRGb3JtYXQpOwogCiAgICAgLy8gY29ubmVjdC9kaXNjb25uZWN0IG9ubHkgMSBkZXZpY2UgYXQgYSB0aW1lCiAgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkgJiYgIWF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpKSByZXR1cm4gQkFEX1ZBTFVFOwogCiAgICAgLy8gQ2hlY2sgaWYgdGhlIGRldmljZSBpcyBjdXJyZW50bHkgY29ubmVjdGVkCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9Ci0gICAgICAgICAgICBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOwotICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKGRldkRlc2MpOwotICAgIGlmIChpbmRleCA8IDApIHsKKyAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlRGV2aWNlcyA9IGdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKTsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IGF2YWlsYWJsZURldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhkZXZpY2UpOworICAgIGlmIChkZXZpY2VMaXN0LmVtcHR5KCkpIHsKICAgICAgICAgLy8gTm90aGluZyB0byBkbzogZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7CiAKICAgICAvLyBGb3Igb2ZmbG9hZGVkIEEyRFAsIEh3IG1vZHVsZXMgbWF5IGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8KLSAgICAvLyBjb25maWd1cmUgY29kZWNzLiBDaGVjayBpZiBhbnkgb2YgdGhlIGxvYWRlZCBodyBtb2R1bGVzCi0gICAgLy8gc3VwcG9ydHMgdGhpcy4KLSAgICAvLyBJZiBzdXBwb3J0ZWQsIHNlbmQgYSBzZXQgcGFyYW1ldGVyIHRvIGNvbmZpZ3VyZSBBMkRQIGNvZGVjcwotICAgIC8vIGFuZCByZXR1cm4uIE5vIG5lZWQgdG8gdG9nZ2xlIGRldmljZSBzdGF0ZS4KKyAgICAvLyBjb25maWd1cmUgY29kZWNzLgorICAgIC8vIEhhbmRsZSB0d28gc3BlY2lmaWMgY2FzZXMgYnkgc2VuZGluZyBhIHNldCBwYXJhbWV0ZXIgdG8KKyAgICAvLyBjb25maWd1cmUgQTJEUCBjb2RlY3MuIE5vIG5lZWQgdG8gdG9nZ2xlIGRldmljZSBzdGF0ZS4KKyAgICAvLyBDYXNlIDE6IEEyRFAgYWN0aXZlIGRldmljZSBzd2l0Y2hlcyBmcm9tIHByaW1hcnkgdG8gcHJpbWFyeQorICAgIC8vIG1vZHVsZQorICAgIC8vIENhc2UgMjogQTJEUCBkZXZpY2UgY29uZmlnIGNoYW5nZXMgb24gcHJpbWFyeSBtb2R1bGUuCiAgICAgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApIHsKLSAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycygKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fSU9fSEFORExFX05PTkUsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJlY29uZmlnQTJkcFN1cHBvcnRlZCkpOwotICAgICAgICBBdWRpb1BhcmFtZXRlciByZXBsaWVkUGFyYW1ldGVycyhyZXBseSk7Ci0gICAgICAgIHJlcGxpZWRQYXJhbWV0ZXJzLmdldEludCgKLSAgICAgICAgICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQpLCBpc1JlY29uZmlnQTJkcFN1cHBvcnRlZCk7Ci0gICAgICAgIGlmIChpc1JlY29uZmlnQTJkcFN1cHBvcnRlZCkgewotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBrZXkoQXVkaW9QYXJhbWV0ZXI6OmtleVJlY29uZmlnQTJkcCk7Ci0gICAgICAgICAgICBwYXJhbS5hZGQoa2V5LCBTdHJpbmc4KCJ0cnVlIikpOwotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGb3JEZXZpY2VUeXBlcyhkZXZpY2UsIGVuY29kZWRGb3JtYXQpOworICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgcHJpbWFyeUhhbmRsZSA9IG1QcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKTsKKyAgICAgICAgaWYgKGF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCkuY29udGFpbnMoZGV2RGVzYykgJiYKKyAgICAgICAgICAgKG1vZHVsZSAhPSAwICYmIG1vZHVsZS0+Z2V0SGFuZGxlKCkgPT0gcHJpbWFyeUhhbmRsZSkpIHsKKyAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JT19IQU5ETEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJlY29uZmlnQTJkcFN1cHBvcnRlZCkpOworICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcmVwbGllZFBhcmFtZXRlcnMocmVwbHkpOworICAgICAgICAgICAgcmVwbGllZFBhcmFtZXRlcnMuZ2V0SW50KAorICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQpLCBpc1JlY29uZmlnQTJkcFN1cHBvcnRlZCk7CisgICAgICAgICAgICBpZiAoaXNSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGtleShBdWRpb1BhcmFtZXRlcjo6a2V5UmVjb25maWdBMmRwKTsKKyAgICAgICAgICAgICAgICBwYXJhbS5hZGQoa2V5LCBTdHJpbmc4KCJ0cnVlIikpOworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKEFVRElPX0lPX0hBTkRMRV9OT05FLCBwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBkZXZEZXNjLT5zZXRFbmNvZGVkRm9ybWF0KGVuY29kZWRGb3JtYXQpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtNDE4LDcgKzQ1Niw4IEBACiAgICAgLy8gVGhpcyB3aWxsIGZvcmNlIHJlYWRpbmcgYWdhaW4gdGhlIGRldmljZSBjb25maWd1cmF0aW9uCiAgICAgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5nZXRFbmNvZGVkRm9ybWF0KCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR1coImhhbmRsZURldmljZUNvbmZpZ0NoYW5nZSgpIGVycm9yIGRpc2FibGluZyBjb25uZWN0aW9uIHN0YXRlOiAlZCIsCiAgICAgICAgICAgICAgIHN0YXR1cyk7CkBAIC00MjcsNyArNDY2LDcgQEAKIAogICAgIHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUsIGVuY29kZWRGb3JtYXQpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR1coImhhbmRsZURldmljZUNvbmZpZ0NoYW5nZSgpIGVycm9yIGVuYWJsaW5nIGNvbm5lY3Rpb24gc3RhdGU6ICVkIiwKICAgICAgICAgICAgICAgc3RhdHVzKTsKQEAgLTQzNywxNiArNDc2LDQwIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUNhbGxSb3V0aW5nKGF1ZGlvX2RldmljZXNfdCByeERldmljZSwgdWludDMyX3QgZGVsYXlNcykKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cykKK3sKKyAgICBBTE9HVigiZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgpIik7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBmb3JtYXRTZXQ7CisgICAgc3A8SHdNb2R1bGU+IHByaW1hcnlNb2R1bGUgPQorICAgICAgICAgICAgbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSk7CisgICAgRGV2aWNlVmVjdG9yIGRlY2xhcmVkRGV2aWNlcyA9IHByaW1hcnlNb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpLmdldERldmljZXNGcm9tVHlwZU1hc2soCisgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IGRlY2xhcmVkRGV2aWNlcykgeworICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KGRldmljZS0+ZW5jb2RlZEZvcm1hdHMoKS5iZWdpbigpLCBkZXZpY2UtPmVuY29kZWRGb3JtYXRzKCkuZW5kKCkpOworICAgIH0KKyAgICBmb3JtYXRzLT5hc3NpZ24oZm9ybWF0U2V0LmJlZ2luKCksIGZvcm1hdFNldC5lbmQoKSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVDYWxsUm91dGluZyhjb25zdCBEZXZpY2VWZWN0b3IgJnJ4RGV2aWNlcywgdWludDMyX3QgZGVsYXlNcykKIHsKICAgICBib29sIGNyZWF0ZVR4UGF0Y2ggPSBmYWxzZTsKKyAgICBib29sIGNyZWF0ZVJ4UGF0Y2ggPSBmYWxzZTsKICAgICB1aW50MzJfdCBtdXRlV2FpdE1zID0gMDsKIAotICAgIGlmKCFoYXNQcmltYXJ5T3V0cHV0KCkgfHwgbVByaW1hcnlPdXRwdXQtPmRldmljZSgpID09IEFVRElPX0RFVklDRV9PVVRfU1RVQikgeworICAgIGlmKCFoYXNQcmltYXJ5T3V0cHV0KCkgfHwgbVByaW1hcnlPdXRwdXQtPmRldmljZXMoKS50eXBlcygpID09IEFVRElPX0RFVklDRV9PVVRfU1RVQikgewogICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKICAgICB9Ci0gICAgYXVkaW9fZGV2aWNlc190IHR4RGV2aWNlID0gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04pOwotICAgIEFMT0dWKCJ1cGRhdGVDYWxsUm91dGluZyBkZXZpY2UgcnhEZXZpY2UgJTA4eCB0eERldmljZSAlMDh4IiwgcnhEZXZpY2UsIHR4RGV2aWNlKTsKKyAgICBBTE9HX0FTU0VSVCghcnhEZXZpY2VzLmlzRW1wdHkoKSwgInVwZGF0ZUNhbGxSb3V0aW5nKCkgbm8gc2VsZWN0ZWQgb3V0cHV0IGRldmljZSIpOworCisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSB7IC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiB9OworICAgIGF1dG8gdHhTb3VyY2VEZXZpY2UgPSBtRW5naW5lLT5nZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoYXR0cik7CisgICAgQUxPR19BU1NFUlQodHhTb3VyY2VEZXZpY2UgIT0gMCwgInVwZGF0ZUNhbGxSb3V0aW5nKCkgaW5wdXQgc2VsZWN0ZWQgZGV2aWNlIG5vdCBhdmFpbGFibGUiKTsKKworICAgIEFMT0dWKCJ1cGRhdGVDYWxsUm91dGluZyBkZXZpY2UgcnhEZXZpY2UgJXMgdHhEZXZpY2UgJXMiLAorICAgICAgICAgIHJ4RGV2aWNlcy5pdGVtQXQoMCktPnRvU3RyaW5nKCkuY19zdHIoKSwgdHhTb3VyY2VEZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKICAgICAvLyByZWxlYXNlIGV4aXN0aW5nIFJYIHBhdGNoIGlmIGFueQogICAgIGlmIChtQ2FsbFJ4UGF0Y2ggIT0gMCkgewpAQCAtNDU5LDU3ICs1MjIsOTIgQEAKICAgICAgICAgbUNhbGxUeFBhdGNoLmNsZWFyKCk7CiAgICAgfQogCi0gICAgLy8gSWYgdGhlIFJYIGRldmljZSBpcyBvbiB0aGUgcHJpbWFyeSBIVyBtb2R1bGUsIHRoZW4gdXNlIGxlZ2FjeSByb3V0aW5nIG1ldGhvZCBmb3Igdm9pY2UgY2FsbHMKLSAgICAvLyB2aWEgc2V0T3V0cHV0RGV2aWNlKCkgb24gcHJpbWFyeSBvdXRwdXQuCi0gICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgdHdvIGF1ZGlvIHBhdGNoZXMgZm9yIFRYIGFuZCBSWCBwYXRoLgotICAgIGlmIChhdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpICYgcnhEZXZpY2UpIHsKLSAgICAgICAgbXV0ZVdhaXRNcyA9IHNldE91dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2UsIHRydWUsIGRlbGF5TXMpOworICAgIGF1dG8gdGVsZXBob255UnhNb2R1bGUgPQorICAgICAgICBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZVR5cGVzKEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICBhdXRvIHRlbGVwaG9ueVR4TW9kdWxlID0KKyAgICAgICAgbUh3TW9kdWxlcy5nZXRNb2R1bGVGb3JEZXZpY2VUeXBlcyhBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgIC8vIHJldHJpZXZlIFJ4IFNvdXJjZSBhbmQgVHggU2luayBkZXZpY2UgZGVzY3JpcHRvcnMKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiByeFNvdXJjZURldmljZSA9CisgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlKEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IHR4U2lua0RldmljZSA9CisgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKworICAgIC8vIFJYIGFuZCBUWCBUZWxlcGhvbnkgZGV2aWNlIGFyZSBkZWNsYXJlZCBieSBQcmltYXJ5IEF1ZGlvIEhBTAorICAgIGlmIChpc1ByaW1hcnlNb2R1bGUodGVsZXBob255UnhNb2R1bGUpICYmIGlzUHJpbWFyeU1vZHVsZSh0ZWxlcGhvbnlUeE1vZHVsZSkgJiYKKyAgICAgICAgICAgICh0ZWxlcGhvbnlSeE1vZHVsZS0+Z2V0SGFsVmVyc2lvbk1ham9yKCkgPj0gMykpIHsKKyAgICAgICAgaWYgKHJ4U291cmNlRGV2aWNlID09IDAgfHwgdHhTaW5rRGV2aWNlID09IDApIHsKKyAgICAgICAgICAgIC8vIFJYIC8gVFggVGVsZXBob255IGRldmljZShzKSBpcyhhcmUpIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlCisgICAgICAgICAgICBBTE9HRSgidXBkYXRlQ2FsbFJvdXRpbmcoKSBubyB0ZWxlcGhvbnkgVHggYW5kL29yIFJYIGRldmljZSIpOworICAgICAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7CisgICAgICAgIH0KKyAgICAgICAgLy8gZG8gbm90IGNyZWF0ZSBhIHBhdGNoIChha2EgU3cgQnJpZGdpbmcpIGlmIFByaW1hcnkgSFcgbW9kdWxlIGhhcyBkZWNsYXJlZCBzdXBwb3J0aW5nIGEKKyAgICAgICAgLy8gcm91dGUgYmV0d2VlbiB0ZWxlcGhvbnkgUlggdG8gU2luayBkZXZpY2UgYW5kIFNvdXJjZSBkZXZpY2UgdG8gdGVsZXBob255IFRYCisgICAgICAgIGNvbnN0IGF1dG8gJnByaW1hcnlNb2R1bGUgPSB0ZWxlcGhvbnlSeE1vZHVsZTsKKyAgICAgICAgY3JlYXRlUnhQYXRjaCA9ICFwcmltYXJ5TW9kdWxlLT5zdXBwb3J0c1BhdGNoKHJ4U291cmNlRGV2aWNlLCByeERldmljZXMuaXRlbUF0KDApKTsKKyAgICAgICAgY3JlYXRlVHhQYXRjaCA9ICFwcmltYXJ5TW9kdWxlLT5zdXBwb3J0c1BhdGNoKHR4U291cmNlRGV2aWNlLCB0eFNpbmtEZXZpY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIElmIHRoZSBSWCBkZXZpY2UgaXMgb24gdGhlIHByaW1hcnkgSFcgbW9kdWxlLCB0aGVuIHVzZSBsZWdhY3kgcm91dGluZyBtZXRob2QgZm9yCisgICAgICAgIC8vIHZvaWNlIGNhbGxzIHZpYSBzZXRPdXRwdXREZXZpY2UoKSBvbiBwcmltYXJ5IG91dHB1dC4KKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgdHdvIGF1ZGlvIHBhdGNoZXMgZm9yIFRYIGFuZCBSWCBwYXRoLgorICAgICAgICBjcmVhdGVSeFBhdGNoID0gIShhdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpLmNvbnRhaW5zKHJ4RGV2aWNlcy5pdGVtQXQoMCkpKSAmJgorICAgICAgICAgICAgICAgIChyeFNvdXJjZURldmljZSAhPSAwKTsKICAgICAgICAgLy8gSWYgdGhlIFRYIGRldmljZSBpcyBhbHNvIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZSwgc2V0T3V0cHV0RGV2aWNlKCkgd2lsbCB0YWtlIGNhcmUKICAgICAgICAgLy8gb2YgaXQgZHVlIHRvIGxlZ2FjeSBpbXBsZW1lbnRhdGlvbi4gSWYgbm90LCBjcmVhdGUgYSBwYXRjaC4KLSAgICAgICAgaWYgKChhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkgJiB0eERldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKQotICAgICAgICAgICAgICAgID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICBjcmVhdGVUeFBhdGNoID0gdHJ1ZTsKLSAgICAgICAgfQorICAgICAgICBjcmVhdGVUeFBhdGNoID0gIShhdmFpbGFibGVQcmltYXJ5TW9kdWxlSW5wdXREZXZpY2VzKCkuY29udGFpbnModHhTb3VyY2VEZXZpY2UpKSAmJgorICAgICAgICAgICAgICAgICh0eFNpbmtEZXZpY2UgIT0gMCk7CisgICAgfQorICAgIC8vIFVzZSBsZWdhY3kgcm91dGluZyBtZXRob2QgZm9yIHZvaWNlIGNhbGxzIHZpYSBzZXRPdXRwdXREZXZpY2UoKSBvbiBwcmltYXJ5IG91dHB1dC4KKyAgICAvLyBPdGhlcndpc2UsIGNyZWF0ZSB0d28gYXVkaW8gcGF0Y2hlcyBmb3IgVFggYW5kIFJYIHBhdGguCisgICAgaWYgKCFjcmVhdGVSeFBhdGNoKSB7CisgICAgICAgIG11dGVXYWl0TXMgPSBzZXRPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCByeERldmljZXMsIHRydWUsIGRlbGF5TXMpOwogICAgIH0gZWxzZSB7IC8vIGNyZWF0ZSBSWCBwYXRoIGF1ZGlvIHBhdGNoCi0gICAgICAgIG1DYWxsUnhQYXRjaCA9IGNyZWF0ZVRlbGVwaG9ueVBhdGNoKHRydWUgLyppc1J4Ki8sIHJ4RGV2aWNlLCBkZWxheU1zKTsKLSAgICAgICAgY3JlYXRlVHhQYXRjaCA9IHRydWU7CisgICAgICAgIG1DYWxsUnhQYXRjaCA9IGNyZWF0ZVRlbGVwaG9ueVBhdGNoKHRydWUgLyppc1J4Ki8sIHJ4RGV2aWNlcy5pdGVtQXQoMCksIGRlbGF5TXMpOworCisgICAgICAgIC8vIElmIHRoZSBUWCBkZXZpY2UgaXMgb24gdGhlIHByaW1hcnkgSFcgbW9kdWxlIGJ1dCBSWCBkZXZpY2UgaXMKKyAgICAgICAgLy8gb24gb3RoZXIgSFcgbW9kdWxlLCBTaW5rTWV0YURhdGEgb2YgdGVsZXBob255IGlucHV0IHNob3VsZCBoYW5kbGUgaXQKKyAgICAgICAgLy8gYXNzdW1pbmcgdGhlIGRldmljZSB1c2VzIGF1ZGlvIEhBTCBWNS4wIGFuZCBhYm92ZQogICAgIH0KICAgICBpZiAoY3JlYXRlVHhQYXRjaCkgeyAvLyBjcmVhdGUgVFggcGF0aCBhdWRpbyBwYXRjaAotICAgICAgICBtQ2FsbFR4UGF0Y2ggPSBjcmVhdGVUZWxlcGhvbnlQYXRjaChmYWxzZSAvKmlzUngqLywgdHhEZXZpY2UsIGRlbGF5TXMpOworICAgICAgICBtQ2FsbFR4UGF0Y2ggPSBjcmVhdGVUZWxlcGhvbnlQYXRjaChmYWxzZSAvKmlzUngqLywgdHhTb3VyY2VEZXZpY2UsIGRlbGF5TXMpOwogICAgIH0KIAogICAgIHJldHVybiBtdXRlV2FpdE1zOwogfQogCiBzcDxBdWRpb1BhdGNoPiBBdWRpb1BvbGljeU1hbmFnZXI6OmNyZWF0ZVRlbGVwaG9ueVBhdGNoKAotICAgICAgICBib29sIGlzUngsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHVpbnQzMl90IGRlbGF5TXMpIHsKLSAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7Ci0gICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgICAgIGJvb2wgaXNSeCwgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwgdWludDMyX3QgZGVsYXlNcykgeworICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CiAKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiB0eFNvdXJjZURldmljZURlc2M7CisgICAgaWYgKGRldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KICAgICBpZiAoaXNSeCkgewotICAgICAgICBmaWxsQXVkaW9Qb3J0Q29uZmlnRm9yRGV2aWNlKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBkZXZpY2UsICZwYXRjaC5zaW5rc1swXSk7Ci0gICAgICAgIGZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UoCi0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywgQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCwgJnBhdGNoLnNvdXJjZXNbMF0pOworICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU2luayhkZXZpY2UpLgorICAgICAgICAgICAgICAgIGFkZFNvdXJjZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZSgKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCwgU3RyaW5nOCgpLCBBVURJT19GT1JNQVRfREVGQVVMVCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHR4U291cmNlRGV2aWNlRGVzYyA9IGZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UoCi0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywgZGV2aWNlLCAmcGF0Y2guc291cmNlc1swXSk7Ci0gICAgICAgIGZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UoCi0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMsIEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYLCAmcGF0Y2guc2lua3NbMF0pOworICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKGRldmljZSkuCisgICAgICAgICAgICAgICAgYWRkU2luayhtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UoCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYLCBTdHJpbmc4KCksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSk7CiAgICAgfQogCi0gICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSA9IGlzUnggPyBkZXZpY2UgOiBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWDsKLSAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKG91dHB1dERldmljZSwgbU91dHB1dHMpOworICAgIC8vIEBUT0RPOiBzdGlsbCBpZ25vcmluZyB0aGUgYWRkcmVzcywgb3Igbm90IGRlYWxpbmcgcGxhdGZvcm0gd2l0aCBtdXRsaXBsZSB0ZWxlcGhvbnlkZXZpY2VzCisgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gb3V0cHV0RGV2aWNlID0gaXNSeCA/CisgICAgICAgICAgICAgICAgZGV2aWNlIDogbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKAorICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCwgU3RyaW5nOCgpLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0KKyAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2VzKERldmljZVZlY3RvcihvdXRwdXREZXZpY2UpLCBtT3V0cHV0cyk7CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKICAgICAvLyByZXF1ZXN0IHRvIHJldXNlIGV4aXN0aW5nIG91dHB1dCBzdHJlYW0gaWYgb25lIGlzIGFscmVhZHkgb3BlbmVkIHRvIHJlYWNoIHRoZSB0YXJnZXQgZGV2aWNlCiAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksCi0gICAgICAgICAgICAgICAgIiVzKCkgJSN4IGRldmljZSBvdXRwdXQgJWQgaXMgZHVwbGljYXRlZCIsIF9fZnVuY19fLCBvdXRwdXREZXZpY2UsIG91dHB1dCk7Ci0gICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzFdKTsKLSAgICAgICAgcGF0Y2guc291cmNlc1sxXS5leHQubWl4LnVzZWNhc2Uuc3RyZWFtID0gQVVESU9fU1RSRUFNX1BBVENIOwotICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDI7CisgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwgIiVzKCkgJXMgZGV2aWNlIG91dHB1dCAlZCBpcyBkdXBsaWNhdGVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBvdXRwdXQpOworICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKG91dHB1dERlc2MsIHsgLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9QQVRDSCB9KTsKICAgICB9CiAKICAgICBpZiAoIWlzUngpIHsKQEAgLTUxOCwzOSArNjE2LDUwIEBACiAgICAgICAgIC8vIGNhbGwgVFggZGV2aWNlIGJ1dCB0aGlzIGluZm9ybWF0aW9uIGlzIG5vdCBpbiB0aGUgYXVkaW8gcGF0Y2ggYW5kIGxvZ2ljIGhlcmUgbXVzdCBiZQogICAgICAgICAvLyBzeW1tZXRyaWMgdG8gdGhlIG9uZSBpbiBzdGFydElucHV0KCkKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKSkgewotICAgICAgICAgICAgaWYgKGFjdGl2ZURlc2MtPmhhc1NhbWVId01vZHVsZUFzKHR4U291cmNlRGV2aWNlRGVzYykpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGFjdGl2ZVNlc3Npb25zID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZURlc2MtPmdldEF1ZGlvU2Vzc2lvbnModHJ1ZSAvKmFjdGl2ZU9ubHkqLyk7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBhY3RpdmVTZXNzaW9ucy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYWN0aXZlU2Vzc2lvbiA9IGFjdGl2ZVNlc3Npb25zLmtleUF0KGopOwotICAgICAgICAgICAgICAgICAgICBzdG9wSW5wdXQoYWN0aXZlRGVzYy0+bUlvSGFuZGxlLCBhY3RpdmVTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0KGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSwgYWN0aXZlU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFjdGl2ZURlc2MtPmhhc1NhbWVId01vZHVsZUFzKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICBjbG9zZUFjdGl2ZUNsaWVudHMoYWN0aXZlRGVzYyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmYWZQYXRjaEhhbmRsZSwgZGVsYXlNcyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgICAgICBwYXRjaEJ1aWxkZXIucGF0Y2goKSwgJmFmUGF0Y2hIYW5kbGUsIGRlbGF5TXMpOwogICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwKICAgICAgICAgICAgICIlcygpIGVycm9yICVkIGNyZWF0aW5nICVzIGF1ZGlvIHBhdGNoIiwgX19mdW5jX18sIHN0YXR1cywgaXNSeCA/ICJSWCIgOiAiVFgiKTsKICAgICBzcDxBdWRpb1BhdGNoPiBhdWRpb1BhdGNoOwogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgYXVkaW9QYXRjaCA9IG5ldyBBdWRpb1BhdGNoKCZwYXRjaCwgbVVpZENhY2hlZCk7CisgICAgICAgIGF1ZGlvUGF0Y2ggPSBuZXcgQXVkaW9QYXRjaChwYXRjaEJ1aWxkZXIucGF0Y2goKSwgbVVpZENhY2hlZCk7CiAgICAgICAgIGF1ZGlvUGF0Y2gtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKICAgICAgICAgYXVkaW9QYXRjaC0+bVVpZCA9IG1VaWRDYWNoZWQ7CiAgICAgfQogICAgIHJldHVybiBhdWRpb1BhdGNoOwogfQogCi1zcDxEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UoCi0gICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywgYXVkaW9fZGV2aWNlc190IGRldmljZSwgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgewotICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gZGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKK3NwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZmluZERldmljZSgKKyAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdCB7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSBkZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soZGV2aWNlKTsKICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCiAgICAgICAgICAgICAiJXMoKSBzZWxlY3RlZCBkZXZpY2UgdHlwZSAlI3ggaXMgbm90IGluIGRldmljZXMgbGlzdCIsIF9fZnVuY19fLCBkZXZpY2UpOwotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKLSAgICBkZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOwotICAgIHJldHVybiBkZXZpY2VEZXNjOworICAgIHJldHVybiBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TW9kdWxlRGV2aWNlVHlwZXMoCisgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywgY29uc3QgY2hhciAqbW9kdWxlSWQpIGNvbnN0IHsKKyAgICBzcDxId01vZHVsZT4gbW9kID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShtb2R1bGVJZCk7CisgICAgcmV0dXJuIG1vZCAhPSAwID8gZGV2aWNlcy5nZXREZXZpY2VUeXBlc0Zyb21Id01vZHVsZShtb2QtPmdldEhhbmRsZSgpKSA6IEFVRElPX0RFVklDRV9OT05FOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNEZXZpY2VPZk1vZHVsZSgKKyAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsIGNvbnN0IGNoYXIgKm1vZHVsZUlkKSBjb25zdCB7CisgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUobW9kdWxlSWQpOworICAgIGlmIChtb2R1bGUgIT0gMCkgeworICAgICAgICByZXR1cm4gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21Id01vZHVsZShtb2R1bGUtPmdldEhhbmRsZSgpKQorICAgICAgICAgICAgICAgIC5pbmRleE9mKGRldkRlc2MpICE9IE5BTUVfTk9UX0ZPVU5ECisgICAgICAgICAgICAgICAgfHwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKG1vZHVsZS0+Z2V0SGFuZGxlKCkpCisgICAgICAgICAgICAgICAgLmluZGV4T2YoZGV2RGVzYykgIT0gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKQpAQCAtNTY0LDE0ICs2NzMsOCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIC8vLyBPcGVuczogY2FuIHRoZXNlIGxpbmUgYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHN3aXRjaCBvZiB2b2x1bWUgY3VydmVzPz8/Ci0gICAgLy8gaWYgbGVhdmluZyBjYWxsIHN0YXRlLCBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGFjdGl2ZSBzdHJlYW1zCi0gICAgLy8gcGVydGFpbmluZyB0byBzb25pZmljYXRpb24gc3RyYXRlZ3kgc2VlIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpCiAgICAgaWYgKGlzU3RhdGVJbkNhbGwob2xkU3RhdGUpKSB7CiAgICAgICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkgaW4gY2FsbCBzdGF0ZSBtYW5hZ2VtZW50OiBuZXcgc3RhdGUgaXMgJWQiLCBzdGF0ZSk7Ci0gICAgICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgc3RyZWFtKyspIHsKLSAgICAgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIGZhbHNlLCB0cnVlKTsKLSAgICAgICAgfQotCiAgICAgICAgIC8vIGZvcmNlIHJlZXZhbHVhdGluZyBhY2Nlc3NpYmlsaXR5IHJvdXRpbmcgd2hlbiBjYWxsIHN0b3BzCiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKTsKICAgICB9CkBAIC01ODQsNDggKzY4Nyw0NyBAQAogICAgICAgICAgICAgICAgICAgfHwgKGlzX3N0YXRlX2luX2NhbGwoc3RhdGUpICYmIChzdGF0ZSAhPSBvbGRTdGF0ZSkpKTsKIAogICAgIC8vIGNoZWNrIGZvciBkZXZpY2UgYW5kIG91dHB1dCBjaGFuZ2VzIHRyaWdnZXJlZCBieSBuZXcgcGhvbmUgc3RhdGUKLSAgICBjaGVja0EyZHBTdXNwZW5kKCk7Ci0gICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7Ci0gICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKyAgICBjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoKTsKIAogICAgIGludCBkZWxheU1zID0gMDsKICAgICBpZiAoaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKICAgICAgICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOworICAgICAgICBhdXRvIG11c2ljU3RyYXRlZ3kgPSBzdHJlYW1Ub1N0cmF0ZWd5KEFVRElPX1NUUkVBTV9NVVNJQyk7CisgICAgICAgIGF1dG8gc29uaWZpY2F0aW9uU3RyYXRlZ3kgPSBzdHJlYW1Ub1N0cmF0ZWd5KEFVRElPX1NUUkVBTV9BTEFSTSk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgICAgIC8vIG11dGUgbWVkaWEgYW5kIHNvbmlmaWNhdGlvbiBzdHJhdGVnaWVzIGFuZCBkZWxheSBkZXZpY2Ugc3dpdGNoIGJ5IHRoZSBsYXJnZXN0CiAgICAgICAgICAgICAvLyBsYXRlbmN5IG9mIGFueSBvdXRwdXQgd2hlcmUgZWl0aGVyIHN0cmF0ZWd5IGlzIGFjdGl2ZS4KICAgICAgICAgICAgIC8vIFRoaXMgYXZvaWQgc2VuZGluZyB0aGUgcmluZyB0b25lIG9yIG11c2ljIHRhaWwgaW50byB0aGUgZWFycGllY2Ugb3IgaGVhZHNldC4KLSAgICAgICAgICAgIGlmICgoaXNTdHJhdGVneUFjdGl2ZShkZXNjLCBTVFJBVEVHWV9NRURJQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNUaW1lKSB8fAotICAgICAgICAgICAgICAgICBpc1N0cmF0ZWd5QWN0aXZlKGRlc2MsIFNUUkFURUdZX1NPTklGSUNBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNUaW1lKSkgJiYKKyAgICAgICAgICAgIGlmICgoZGVzYy0+aXNTdHJhdGVneUFjdGl2ZShtdXNpY1N0cmF0ZWd5LCBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSwgc3lzVGltZSkgfHwKKyAgICAgICAgICAgICAgICAgZGVzYy0+aXNTdHJhdGVneUFjdGl2ZShzb25pZmljYXRpb25TdHJhdGVneSwgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzVGltZSkpICYmCiAgICAgICAgICAgICAgICAgICAgIChkZWxheU1zIDwgKGludClkZXNjLT5sYXRlbmN5KCkqMikpIHsKICAgICAgICAgICAgICAgICBkZWxheU1zID0gZGVzYy0+bGF0ZW5jeSgpKjI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfTUVESUEsIHRydWUsIGRlc2MpOwotICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCBmYWxzZSwgZGVzYywgTVVURV9USU1FX01TLAotICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCB0cnVlIC8qZnJvbUNhY2hlKi8pKTsKLSAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9TT05JRklDQVRJT04sIHRydWUsIGRlc2MpOwotICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX1NPTklGSUNBVElPTiwgZmFsc2UsIGRlc2MsIE1VVEVfVElNRV9NUywKLSAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04sIHRydWUgLypmcm9tQ2FjaGUqLykpOworICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKG11c2ljU3RyYXRlZ3ksIHRydWUsIGRlc2MpOworICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKG11c2ljU3RyYXRlZ3ksIGZhbHNlLCBkZXNjLCBNVVRFX1RJTUVfTVMsCisgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9NRURJQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgdHJ1ZSAvKmZyb21DYWNoZSovKS50eXBlcygpKTsKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzb25pZmljYXRpb25TdHJhdGVneSwgdHJ1ZSwgZGVzYyk7CisgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc29uaWZpY2F0aW9uU3RyYXRlZ3ksIGZhbHNlLCBkZXNjLCBNVVRFX1RJTUVfTVMsCisgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9BTEFSTSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgdHJ1ZSAvKmZyb21DYWNoZSovKS50eXBlcygpKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChoYXNQcmltYXJ5T3V0cHV0KCkpIHsKLSAgICAgICAgLy8gTm90ZSB0aGF0IGRlc3BpdGUgdGhlIGZhY3QgdGhhdCBnZXROZXdPdXRwdXREZXZpY2UoKSBpcyBjYWxsZWQgb24gdGhlIHByaW1hcnkgb3V0cHV0LAorICAgICAgICAvLyBOb3RlIHRoYXQgZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IGdldE5ld091dHB1dERldmljZXMoKSBpcyBjYWxsZWQgb24gdGhlIHByaW1hcnkgb3V0cHV0LAogICAgICAgICAvLyB0aGUgZGV2aWNlIHJldHVybmVkIGlzIG5vdCBuZWNlc3NhcmlseSByZWFjaGFibGUgdmlhIHRoaXMgb3V0cHV0Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCByeERldmljZSA9IGdldE5ld091dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIERldmljZVZlY3RvciByeERldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKICAgICAgICAgLy8gZm9yY2Ugcm91dGluZyBjb21tYW5kIHRvIGF1ZGlvIGhhcmR3YXJlIHdoZW4gZW5kaW5nIGNhbGwKICAgICAgICAgLy8gZXZlbiBpZiBubyBkZXZpY2UgY2hhbmdlIGlzIG5lZWRlZAotICAgICAgICBpZiAoaXNTdGF0ZUluQ2FsbChvbGRTdGF0ZSkgJiYgcnhEZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgIHJ4RGV2aWNlID0gbVByaW1hcnlPdXRwdXQtPmRldmljZSgpOworICAgICAgICBpZiAoaXNTdGF0ZUluQ2FsbChvbGRTdGF0ZSkgJiYgcnhEZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcnhEZXZpY2VzID0gbVByaW1hcnlPdXRwdXQtPmRldmljZXMoKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKLSAgICAgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKHJ4RGV2aWNlLCBkZWxheU1zKTsKKyAgICAgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKHJ4RGV2aWNlcywgZGVsYXlNcyk7CiAgICAgICAgIH0gZWxzZSBpZiAob2xkU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7CiAgICAgICAgICAgICBpZiAobUNhbGxSeFBhdGNoICE9IDApIHsKICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gobUNhbGxSeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgMCk7CkBAIC02MzUsNDAgKzczNywzMCBAQAogICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChtQ2FsbFR4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCAwKTsKICAgICAgICAgICAgICAgICBtQ2FsbFR4UGF0Y2guY2xlYXIoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldE91dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2UsIGZvcmNlLCAwKTsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlcywgZm9yY2UsIDApOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCByeERldmljZSwgZm9yY2UsIDApOworICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2VzLCBmb3JjZSwgMCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyByZWV2YWx1YXRlIHJvdXRpbmcgb24gYWxsIG91dHB1dHMgaW4gY2FzZSB0cmFja3MgaGF2ZSBiZWVuIHN0YXJ0ZWQgZHVyaW5nIHRoZSBjYWxsCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UoZGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKGRlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyk7CiAgICAgICAgIGlmIChzdGF0ZSAhPSBBVURJT19NT0RFX0lOX0NBTEwgfHwgZGVzYyAhPSBtUHJpbWFyeU91dHB1dCkgewotICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKGRlc2MsIG5ld0RldmljZSwgKG5ld0RldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSksIDAgLypkZWxheU1zKi8pOworICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhkZXNjLCBuZXdEZXZpY2VzLCAhbmV3RGV2aWNlcy5pc0VtcHR5KCksIDAgLypkZWxheU1zKi8pOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gaWYgZW50ZXJpbmcgaW4gY2FsbCBzdGF0ZSwgaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBhY3RpdmUgc3RyZWFtcwotICAgIC8vIHBlcnRhaW5pbmcgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHNlZSBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKQogICAgIGlmIChpc1N0YXRlSW5DYWxsKHN0YXRlKSkgewogICAgICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIGluIGNhbGwgc3RhdGUgbWFuYWdlbWVudDogbmV3IHN0YXRlIGlzICVkIiwgc3RhdGUpOwotICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgfQotCiAgICAgICAgIC8vIGZvcmNlIHJlZXZhbHVhdGluZyBhY2Nlc3NpYmlsaXR5IHJvdXRpbmcgd2hlbiBjYWxsIHN0YXJ0cwogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSk7CiAgICAgfQogCiAgICAgLy8gRmxhZyB0aGF0IHJpbmd0b25lIHZvbHVtZSBtdXN0IGJlIGxpbWl0ZWQgdG8gbXVzaWMgdm9sdW1lIHVudGlsIHdlIGV4aXQgTU9ERV9SSU5HVE9ORQotICAgIGlmIChzdGF0ZSA9PSBBVURJT19NT0RFX1JJTkdUT05FICYmCi0gICAgICAgIGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVkpKSB7Ci0gICAgICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZSA9IGZhbHNlOwotICAgIH0KKyAgICBtTGltaXRSaW5ndG9uZVZvbHVtZSA9IChzdGF0ZSA9PSBBVURJT19NT0RFX1JJTkdUT05FICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSkpOwogfQogCiBhdWRpb19tb2RlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRQaG9uZVN0YXRlKCkgewpAQCAtNjc2LDcgKzc2OCw3IEBACiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQogewogICAgIEFMT0dWKCJzZXRGb3JjZVVzZSgpIHVzYWdlICVkLCBjb25maWcgJWQsIG1QaG9uZVN0YXRlICVkIiwgdXNhZ2UsIGNvbmZpZywgbUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpKTsKICAgICBpZiAoY29uZmlnID09IG1FbmdpbmUtPmdldEZvcmNlVXNlKHVzYWdlKSkgewpAQCAtNjkyLDkgKzc4NCw3IEBACiAgICAgICAgICAgICAodXNhZ2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pOwogCiAgICAgLy8gY2hlY2sgZm9yIGRldmljZSBhbmQgb3V0cHV0IGNoYW5nZXMgdHJpZ2dlcmVkIGJ5IG5ldyBmb3JjZSB1c2FnZQotICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKLSAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKLSAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOworICAgIGNoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcygpOwogCiAgICAgLy9GSVhNRTogd29ya2Fyb3VuZCBmb3IgdHJ1bmNhdGVkIHRvdWNoIHNvdW5kcwogICAgIC8vIHRvIGJlIHJlbW92ZWQgd2hlbiB0aGUgcHJvYmxlbSBpcyBoYW5kbGVkIGJ5IHN5c3RlbSBVSQpAQCAtNzA0LDI2ICs3OTQsMjcgQEAKICAgICAgICAgZGVsYXlNcyA9IFRPVUNIX1NPVU5EX0ZJWEVEX0RFTEFZX01TOwogICAgIH0KICAgICBpZiAobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCAmJiBoYXNQcmltYXJ5T3V0cHV0KCkpIHsKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgd2FpdE1zID0gdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlLCBkZWxheU1zKTsKKyAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICB3YWl0TXMgPSB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2VzLCBkZWxheU1zKTsKICAgICB9CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyk7CiAgICAgICAgIGlmICgobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpICE9IEFVRElPX01PREVfSU5fQ0FMTCkgfHwgKG91dHB1dERlc2MgIT0gbVByaW1hcnlPdXRwdXQpKSB7Ci0gICAgICAgICAgICB3YWl0TXMgPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgbmV3RGV2aWNlLCAobmV3RGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKKyAgICAgICAgICAgIC8vIEFzIGRvbmUgaW4gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlLCB3ZSBjb3VsZCBhbHNvIGZpeCBkZWZhdWx0IGRldmljZSBpc3N1ZSBieQorICAgICAgICAgICAgLy8gcHJldmVudGluZyB0aGUgZm9yY2UgcmUtcm91dGluZyBpbiBjYXNlIG9mIGRlZmF1bHQgZGV2IHRoYXQgZGlzdGluZ3Vpc2hlcyBvbiBhZGRyZXNzLgorICAgICAgICAgICAgLy8gTGV0J3MgZ2l2ZSBiYWNrIHRvIGVuZ2luZSBmdWxsIGRldmljZSBjaG9pY2UgZGVjaXNpb24gaG93ZXZlci4KKyAgICAgICAgICAgIHdhaXRNcyA9IHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYywgbmV3RGV2aWNlcywgIW5ld0RldmljZXMuaXNFbXB0eSgpLCBkZWxheU1zKTsKICAgICAgICAgfQotICAgICAgICBpZiAoZm9yY2VWb2x1bWVSZWV2YWwgJiYgKG5ld0RldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkpIHsKLSAgICAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXREZXNjLCBuZXdEZXZpY2UsIHdhaXRNcywgdHJ1ZSk7CisgICAgICAgIGlmIChmb3JjZVZvbHVtZVJlZXZhbCAmJiAhbmV3RGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXREZXNjLCBuZXdEZXZpY2VzLnR5cGVzKCksIHdhaXRNcywgdHJ1ZSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdGl2ZURlc2MgOiBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpKSB7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdJbnB1dERldmljZShhY3RpdmVEZXNjKTsKKyAgICAgICAgYXV0byBuZXdEZXZpY2UgPSBnZXROZXdJbnB1dERldmljZShhY3RpdmVEZXNjKTsKICAgICAgICAgLy8gRm9yY2UgbmV3IGlucHV0IHNlbGVjdGlvbiBpZiB0aGUgbmV3IGRldmljZSBjYW4gbm90IGJlIHJlYWNoZWQgdmlhIGN1cnJlbnQgaW5wdXQKLSAgICAgICAgaWYgKGFjdGl2ZURlc2MtPm1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkudHlwZXMoKSAmCi0gICAgICAgICAgICAgICAgKG5ld0RldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSkgeworICAgICAgICBpZiAoYWN0aXZlRGVzYy0+bVByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKS5jb250YWlucyhuZXdEZXZpY2UpKSB7CiAgICAgICAgICAgICBzZXRJbnB1dERldmljZShhY3RpdmVEZXNjLT5tSW9IYW5kbGUsIG5ld0RldmljZSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjbG9zZUlucHV0KGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSk7CkBAIC03MzYsMjggKzgyNywzMSBAQAogICAgIEFMT0dWKCJzZXRTeXN0ZW1Qcm9wZXJ0eSgpIHByb3BlcnR5ICVzLCB2YWx1ZSAlcyIsIHByb3BlcnR5LCB2YWx1ZSk7CiB9CiAKLS8vIEZpbmQgYSBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgY29tcGF0aWJsZSB3aXRoIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCwgZXZlbiBpZiB0aGUgaW5wdXQgZmxhZ3MgZG8KLS8vIG5vdCBleHBsaWNpdGx5IHJlcXVlc3QgYSBkaXJlY3Qgb3V0cHV0Ci1zcDxJT1Byb2ZpbGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQorLy8gRmluZCBhbiBvdXRwdXQgcHJvZmlsZSBjb21wYXRpYmxlIHdpdGggdGhlIHBhcmFtZXRlcnMgcGFzc2VkLiBXaGVuICJkaXJlY3RPbmx5IiBpcyBzZXQsIHJlc3RyaWN0CisvLyBzZWFyY2ggdG8gcHJvZmlsZXMgZm9yIGRpcmVjdCBvdXRwdXRzLgorc3A8SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFByb2ZpbGVGb3JPdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXJlY3RPbmx5KQogewotICAgIC8vIG9ubHkgcmV0YWluIGZsYWdzIHRoYXQgd2lsbCBkcml2ZSB0aGUgZGlyZWN0IG91dHB1dCBwcm9maWxlIHNlbGVjdGlvbgotICAgIC8vIGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtSZWxldmFudEZsYWdzID0KLSAgICAgICAgICAgIChBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCB8Ci0gICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCk7Ci0gICAgZmxhZ3MgPQotICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKChmbGFncyAmIGtSZWxldmFudEZsYWdzKSB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgaWYgKGRpcmVjdE9ubHkpIHsKKyAgICAgICAgLy8gb25seSByZXRhaW4gZmxhZ3MgdGhhdCB3aWxsIGRyaXZlIHRoZSBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgc2VsZWN0aW9uCisgICAgICAgIC8vIGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrUmVsZXZhbnRGbGFncyA9CisgICAgICAgICAgICAgICAgKEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIHwKKyAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCk7CisgICAgICAgIGZsYWdzID0KKyAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoKGZsYWdzICYga1JlbGV2YW50RmxhZ3MpIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICB9CiAKICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGU7CiAKICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgewogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGN1clByb2ZpbGUgOiBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKSkgewotICAgICAgICAgICAgaWYgKCFjdXJQcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZSwgU3RyaW5nOCgiIiksCisgICAgICAgICAgICBpZiAoIWN1clByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLCBOVUxMIC8qdXBkYXRlZFNhbXBsaW5nUmF0ZSovLAogICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIE5VTEwgLyp1cGRhdGVkRm9ybWF0Ki8sCiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBOVUxMIC8qdXBkYXRlZENoYW5uZWxNYXNrKi8sCkBAIC03NjUsMTAgKzg1OSwxNiBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gcmVqZWN0IHByb2ZpbGVzIG5vdCBjb3JyZXNwb25kaW5nIHRvIGEgZGV2aWNlIGN1cnJlbnRseSBhdmFpbGFibGUKLSAgICAgICAgICAgIGlmICgobUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIGN1clByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXNUeXBlKCkpID09IDApIHsKKyAgICAgICAgICAgIGlmICghbUF2YWlsYWJsZU91dHB1dERldmljZXMuY29udGFpbnNBdExlYXN0T25lKGN1clByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKSkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGlmIHNldmVyYWwgcHJvZmlsZXMgYXJlIGNvbXBhdGlibGUsIGdpdmUgcHJpb3JpdHkgdG8gb25lIHdpdGggb2ZmbG9hZCBjYXBhYmlsaXR5CisgICAgICAgICAgICAvLyByZWplY3QgcHJvZmlsZXMgaWYgY29ubmVjdGVkIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IGNvZGVjCisgICAgICAgICAgICBpZiAoIWN1clByb2ZpbGUtPmRldmljZVN1cHBvcnRzRW5jb2RlZEZvcm1hdHMoZGV2aWNlcy50eXBlcygpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFkaXJlY3RPbmx5KSByZXR1cm4gY3VyUHJvZmlsZTsKKyAgICAgICAgICAgIC8vIHdoZW4gc2VhcmNoaW5nIGZvciBkaXJlY3Qgb3V0cHV0cywgaWYgc2V2ZXJhbCBwcm9maWxlcyBhcmUgY29tcGF0aWJsZSwgZ2l2ZSBwcmlvcml0eQorICAgICAgICAgICAgLy8gdG8gb25lIHdpdGggb2ZmbG9hZCBjYXBhYmlsaXR5CiAgICAgICAgICAgICBpZiAocHJvZmlsZSAhPSAwICYmICgoY3VyUHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDApKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CkBAIC03ODMsOCArODgzLDcgQEAKIAogYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCiB7Ci0gICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JTdHJlYW0oc3RyZWFtLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKIAogICAgIC8vIE5vdGUgdGhhdCByZWxhdGVkIG1ldGhvZCBnZXRPdXRwdXRGb3JBdHRyKCkgdXNlcyBnZXRPdXRwdXRGb3JEZXZpY2UoKSBub3Qgc2VsZWN0T3V0cHV0KCkuCiAgICAgLy8gV2UgdXNlIHNlbGVjdE91dHB1dCgpIGhlcmUgc2luY2Ugd2UgZG9uJ3QgaGF2ZSB0aGUgZGVzaXJlZCBBdWRpb1RyYWNrIHNhbXBsZSByYXRlLApAQCAtNzkyLDEzICs4OTEsMTUyIEBACiAgICAgLy8gZ2V0T3V0cHV0KCkgc29sZWx5IG9uIGF1ZGlvX3N0cmVhbV90eXBlIHN1Y2ggYXMgQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoKQogICAgIC8vIGFuZCBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCkuCiAKLSAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgbU91dHB1dHMpOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2VzKGRldmljZXMsIG1PdXRwdXRzKTsKICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgQVVESU9fRk9STUFUX0lOVkFMSUQpOwogCi0gICAgQUxPR1YoImdldE91dHB1dCgpIHN0cmVhbSAlZCBzZWxlY3RlZCBkZXZpY2UgJTA4eCwgb3V0cHV0ICVkIiwgc3RyZWFtLCBkZXZpY2UsIG91dHB1dCk7CisgICAgQUxPR1YoImdldE91dHB1dCgpIHN0cmVhbSAlZCBzZWxlY3RlZCBkZXZpY2VzICVzLCBvdXRwdXQgJWQiLCBzdHJlYW0sCisgICAgICAgICAgZGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksIG91dHB1dCk7CiAgICAgcmV0dXJuIG91dHB1dDsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRBdWRpb0F0dHJpYnV0ZXMoYXVkaW9fYXR0cmlidXRlc190ICpkc3RBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICpzcmNBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzcmNTdHJlYW0pCit7CisgICAgaWYgKHNyY0F0dHIgIT0gTlVMTCkgeworICAgICAgICBpZiAoIWlzVmFsaWRBdHRyaWJ1dGVzKHNyY0F0dHIpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCBhdHRyaWJ1dGVzOiB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgIHNyY0F0dHItPnVzYWdlLCBzcmNBdHRyLT5jb250ZW50X3R5cGUsIHNyY0F0dHItPmZsYWdzLAorICAgICAgICAgICAgICAgICAgICBzcmNBdHRyLT50YWdzKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgKmRzdEF0dHIgPSAqc3JjQXR0cjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoc3JjU3RyZWFtIDwgQVVESU9fU1RSRUFNX01JTiB8fCBzcmNTdHJlYW0gPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogIGludmFsaWQgc3RyZWFtIHR5cGUiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgICpkc3RBdHRyID0gbUVuZ2luZS0+Z2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoc3JjU3RyZWFtKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckF0dHJJbnQoCisgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcmVzdWx0QXR0ciwKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgYm9vbCAqaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UsCisgICAgICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gKnNlY29uZGFyeURlc2NzKQoreworICAgIERldmljZVZlY3RvciBvdXRwdXREZXZpY2VzOworICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcmVxdWVzdGVkUG9ydElkID0gKnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgRGV2aWNlVmVjdG9yIG1zZERldmljZXMgPSBnZXRNc2RBdWRpb091dERldmljZXMoKTsKKyAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiByZXF1ZXN0ZWREZXZpY2UgPQorICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocmVxdWVzdGVkUG9ydElkKTsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvQXR0cmlidXRlcyhyZXN1bHRBdHRyLCBhdHRyLCAqc3RyZWFtKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgICpzdHJlYW0gPSBtRW5naW5lLT5nZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcygqcmVzdWx0QXR0cik7CisKKyAgICBBTE9HVigiJXMoKSBhdHRyaWJ1dGVzPSVzIHN0cmVhbT0lcyBzZXNzaW9uICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICB0b1N0cmluZygqcmVzdWx0QXR0cikuY19zdHIoKSwgdG9TdHJpbmcoKnN0cmVhbSkuY19zdHIoKSwgc2Vzc2lvbiwgcmVxdWVzdGVkUG9ydElkKTsKKworICAgIC8vIFRoZSBwcmltYXJ5IG91dHB1dCBpcyB0aGUgZXhwbGljaXQgcm91dGluZyAoZWcuIHNldFByZWZlcnJlZERldmljZSkgaWYgc3BlY2lmaWVkLAorICAgIC8vICAgICAgIG90aGVyd2lzZSwgZmFsbGJhY2sgdG8gdGhlIGR5bmFtaWMgcG9saWNpZXMsIGlmIG5vbmUgbWF0Y2gsIHF1ZXJ5IHRoZSBlbmdpbmUuCisgICAgLy8gU2Vjb25kYXJ5IG91dHB1dHMgYXJlIGFsd2F5cyBmb3VuZCBieSBkeW5hbWljIHBvbGljaWVzIGFzIHRoZSBlbmdpbmUgZG8gbm90IHN1cHBvcnQgdGhlbQorICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBwb2xpY3lEZXNjOworICAgIGlmIChtUG9saWN5TWl4ZXMuZ2V0T3V0cHV0Rm9yQXR0cigqcmVzdWx0QXR0ciwgdWlkLCBwb2xpY3lEZXNjLCBzZWNvbmRhcnlEZXNjcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcG9saWN5RGVzYyA9IG51bGxwdHI7IC8vIHJlc2V0IGdldE91dHB1dEZvckF0dHIgaW4gY2FzZSBvZiBmYWlsdXJlCisgICAgICAgIHNlY29uZGFyeURlc2NzLT5jbGVhcigpOworICAgIH0KKyAgICAvLyBFeHBsaWNpdCByb3V0aW5nIGlzIGhpZ2hlciBwcmlvcml0eSB0aGVuIGFueSBkeW5hbWljIHBvbGljeSBwcmltYXJ5IG91dHB1dAorICAgIGJvb2wgdXNlUHJpbWFyeU91dHB1dEZyb21Qb2xpY3lNaXhlcyA9IHJlcXVlc3RlZERldmljZSA9PSBudWxscHRyICYmIHBvbGljeURlc2MgIT0gbnVsbHB0cjsKKworICAgIC8vIEZJWE1FOiBpbiBjYXNlIG9mIFJFTkRFUiBwb2xpY3ksIHRoZSBvdXRwdXQgY2FwYWJpbGl0aWVzIHNob3VsZCBiZSBjaGVja2VkCisgICAgaWYgKCh1c2VQcmltYXJ5T3V0cHV0RnJvbVBvbGljeU1peGVzIHx8ICFzZWNvbmRhcnlEZXNjcy0+ZW1wdHkoKSkKKyAgICAgICAgJiYgIWF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpKSB7CisgICAgICAgIEFMT0dEKCIlczogcmVqZWN0aW5nIHJlcXVlc3QgYXMgZHluYW1pYyBhdWRpbyBwb2xpY3kgb25seSBzdXBwb3J0IHBjbSIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKHVzZVByaW1hcnlPdXRwdXRGcm9tUG9saWN5TWl4ZXMpIHsKKyAgICAgICAgKm91dHB1dCA9IHBvbGljeURlc2MtPm1Jb0hhbmRsZTsKKyAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IG1peCA9IHBvbGljeURlc2MtPm1Qb2xpY3lNaXgucHJvbW90ZSgpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UobWl4LT5tRGV2aWNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IGRldmljZURlc2MgIT0gMCA/IGRldmljZURlc2MtPmdldElkKCkgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIHJldHVybnMgb3V0cHV0ICVkIiwgKm91dHB1dCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgLy8gVmlydHVhbCBzb3VyY2VzIG11c3QgYWx3YXlzIGJlIGR5bmFtaWNhbHkgb3IgZXhwbGljaXRseSByb3V0ZWQKKyAgICBpZiAocmVzdWx0QXR0ci0+dXNhZ2UgPT0gQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UpIHsKKyAgICAgICAgQUxPR1coImdldE91dHB1dEZvckF0dHIoKSBubyBwb2xpY3kgbWl4IGZvdW5kIGZvciB1c2FnZSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAvLyBleHBsaWNpdCByb3V0aW5nIG1hbmFnZWQgYnkgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kgaW4gQVBNIGlzIG5vdyBoYW5kbGVkIGJ5IGVuZ2luZQorICAgIC8vIGluIG9yZGVyIHRvIGxldCB0aGUgY2hvaWNlIG9mIHRoZSBvcmRlciB0byBmdXR1cmUgdmVuZG9yIGVuZ2luZQorICAgIG91dHB1dERldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygqcmVzdWx0QXR0ciwgcmVxdWVzdGVkRGV2aWNlLCBmYWxzZSk7CisKKyAgICBpZiAoKHJlc3VsdEF0dHItPmZsYWdzICYgQVVESU9fRkxBR19IV19BVl9TWU5DKSAhPSAwKSB7CisgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoKmZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7CisgICAgfQorCisgICAgLy8gU2V0IGluY2FsbCBtdXNpYyBvbmx5IGlmIGRldmljZSB3YXMgZXhwbGljaXRseSBzZXQsIGFuZCBmYWxsYmFjayB0byB0aGUgZGV2aWNlIHdoaWNoIGlzCisgICAgLy8gY2hvc2VuIGJ5IHRoZSBlbmdpbmUgaWYgbm90LgorICAgIC8vIEZJWE1FOiBwcm92aWRlIGEgbW9yZSBnZW5lcmljIGFwcHJvYWNoIHdoaWNoIGlzIG5vdCBkZXZpY2Ugc3BlY2lmaWMgYW5kIG1vdmUgdGhpcyBiYWNrCisgICAgLy8gdG8gZ2V0T3V0cHV0Rm9yRGV2aWNlLgorICAgIC8vIFRPRE86IFJlbW92ZSBjaGVjayBvZiBBVURJT19TVFJFQU1fTVVTSUMgb25jZSBtaWdyYXRpb24gaXMgY29tcGxldGVkIG9uIHRoZSBhcHAgc2lkZS4KKyAgICBpZiAob3V0cHV0RGV2aWNlcy50eXBlcygpID09IEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYICYmCisgICAgICAgICgqc3RyZWFtID09IEFVRElPX1NUUkVBTV9NVVNJQyAgfHwgcmVzdWx0QXR0ci0+dXNhZ2UgPT0gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTikgJiYKKyAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkgJiYKKyAgICAgICAgaXNJbkNhbGwoKSkgeworICAgICAgICBpZiAocmVxdWVzdGVkUG9ydElkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdClBVURJT19PVVRQVVRfRkxBR19JTkNBTExfTVVTSUM7CisgICAgICAgICAgICAqaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoIiVzKCkgZGV2aWNlICVzLCBzYW1wbGluZyByYXRlICVkLCBmb3JtYXQgJSN4LCBjaGFubmVsIG1hc2sgJSN4LCBmbGFncyAlI3ggc3RyZWFtICVzIiwKKyAgICAgICAgICBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LAorICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCAqZmxhZ3MsIHRvU3RyaW5nKCpzdHJlYW0pLmNfc3RyKCkpOworCisgICAgKm91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIGlmICghbXNkRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgKm91dHB1dCA9IGdldE91dHB1dEZvckRldmljZXMobXNkRGV2aWNlcywgc2Vzc2lvbiwgKnN0cmVhbSwgY29uZmlnLCBmbGFncyk7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG91dHB1dERldmljZXMuaXNFbXB0eSgpID8gbnVsbHB0ciA6IG91dHB1dERldmljZXMuaXRlbUF0KDApOworICAgICAgICBpZiAoKm91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSAmJiBzZXRNc2RQYXRjaChkZXZpY2UpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HVigiJXMoKSBVc2luZyBNU0QgZGV2aWNlcyAlcyBpbnN0ZWFkIG9mIGRldmljZXMgJXMiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1zZERldmljZXMudG9TdHJpbmcoKS5jX3N0cigpLCBvdXRwdXREZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICBvdXRwdXREZXZpY2VzID0gbXNkRGV2aWNlczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAqb3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRGV2aWNlcyhvdXRwdXREZXZpY2VzLCBzZXNzaW9uLCAqc3RyZWFtLCBjb25maWcsCisgICAgICAgICAgICAgICAgZmxhZ3MsIGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19NVVRFX0hBUFRJQyk7CisgICAgfQorICAgIGlmICgqb3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IGdldEZpcnN0RGV2aWNlSWQob3V0cHV0RGV2aWNlcyk7CisKKyAgICBBTE9HVigiJXMgcmV0dXJucyBvdXRwdXQgJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCIsIF9fZnVuY19fLCAqb3V0cHV0LCAqc2VsZWN0ZWREZXZpY2VJZCk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKQEAgLTgwNywxMTEgKzEwNDUsNzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKQogewotICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzOwotICAgIGlmIChhdHRyICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCFpc1ZhbGlkQXR0cmlidXRlcyhhdHRyKSkgewotICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHIoKSBpbnZhbGlkIGF0dHJpYnV0ZXM6IHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAotICAgICAgICAgICAgICAgICAgYXR0ci0+dXNhZ2UsIGF0dHItPmNvbnRlbnRfdHlwZSwgYXR0ci0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgICBhdHRyLT50YWdzKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgYXR0cmlidXRlcyA9ICphdHRyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICgqc3RyZWFtIDwgQVVESU9fU1RSRUFNX01JTiB8fCAqc3RyZWFtID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cigpOiAgaW52YWxpZCBzdHJlYW0gdHlwZSIpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBzdHJlYW1fdHlwZV90b19hdWRpb19hdHRyaWJ1dGVzKCpzdHJlYW0sICZhdHRyaWJ1dGVzKTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgZXhpc3RpbmcgY2xpZW50IGZvciB0aGlzIHBvcnQgSUQKLSAgICBpZiAoKnBvcnRJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOwotICAgIH0KLQotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjOwotICAgIGlmIChtUG9saWN5TWl4ZXMuZ2V0T3V0cHV0Rm9yQXR0cihhdHRyaWJ1dGVzLCB1aWQsIGRlc2MpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dfQVNTRVJUKGRlc2MgIT0gMCwgIkludmFsaWQgZGVzYyByZXR1cm5lZCBieSBnZXRPdXRwdXRGb3JBdHRyIik7Ci0gICAgICAgIGlmICghYXVkaW9faGFzX3Byb3BvcnRpb25hbF9mcmFtZXMoY29uZmlnLT5mb3JtYXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgICpzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoJmF0dHJpYnV0ZXMpOwotICAgICAgICAqb3V0cHV0ID0gZGVzYy0+bUlvSGFuZGxlOwotICAgICAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIHJldHVybnMgb3V0cHV0ICVkIiwgKm91dHB1dCk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgaWYgKGF0dHJpYnV0ZXMudXNhZ2UgPT0gQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UpIHsKLSAgICAgICAgQUxPR1coImdldE91dHB1dEZvckF0dHIoKSBubyBwb2xpY3kgbWl4IGZvdW5kIGZvciB1c2FnZSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgdXNhZ2U9JWQsIGNvbnRlbnQ9JWQsIHRhZz0lcyBmbGFncz0lMDh4IgotICAgICAgICAgICAgIiBzZXNzaW9uICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQiLAotICAgICAgICAgICAgYXR0cmlidXRlcy51c2FnZSwgYXR0cmlidXRlcy5jb250ZW50X3R5cGUsIGF0dHJpYnV0ZXMudGFncywgYXR0cmlidXRlcy5mbGFncywKLSAgICAgICAgICAgIHNlc3Npb24sICpzZWxlY3RlZERldmljZUlkKTsKLQotICAgICpzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoJmF0dHJpYnV0ZXMpOwotCi0gICAgLy8gRXhwbGljaXQgcm91dGluZz8KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjOwotICAgIGlmICgqc2VsZWN0ZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIGRldmljZURlc2MgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoKnNlbGVjdGVkRGV2aWNlSWQpOwotICAgIH0KLSAgICBtT3V0cHV0Um91dGVzLmFkZFJvdXRlKHNlc3Npb24sICpzdHJlYW0sIFNlc3Npb25Sb3V0ZTo6U09VUkNFX1RZUEVfTkEsIGRldmljZURlc2MsIHVpZCk7Ci0KLSAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gKHJvdXRpbmdfc3RyYXRlZ3kpIGdldFN0cmF0ZWd5Rm9yQXR0cigmYXR0cmlidXRlcyk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLQotICAgIGlmICgoYXR0cmlidXRlcy5mbGFncyAmIEFVRElPX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgewotICAgICAgICAqZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKCpmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpOwotICAgIH0KLQotICAgIC8vIFNldCBpbmNhbGwgbXVzaWMgb25seSBpZiBkZXZpY2Ugd2FzIGV4cGxpY2l0bHkgc2V0LCBhbmQgZmFsbGJhY2sgdG8gdGhlIGRldmljZSB3aGljaCBpcwotICAgIC8vIGNob3NlbiBieSB0aGUgZW5naW5lIGlmIG5vdC4KLSAgICAvLyBGSVhNRTogcHJvdmlkZSBhIG1vcmUgZ2VuZXJpYyBhcHByb2FjaCB3aGljaCBpcyBub3QgZGV2aWNlIHNwZWNpZmljIGFuZCBtb3ZlIHRoaXMgYmFjawotICAgIC8vIHRvIGdldE91dHB1dEZvckRldmljZS4KLSAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYICYmCi0gICAgICAgICpzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDICYmCi0gICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpICYmCi0gICAgICAgIGlzSW5DYWxsKCkpIHsKLSAgICAgICAgaWYgKCpzZWxlY3RlZERldmljZUlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdClBVURJT19PVVRQVVRfRkxBR19JTkNBTExfTVVTSUM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBtRW5naW5lLT5nZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIGRldmljZSAweCV4LCBzYW1wbGluZyByYXRlICVkLCBmb3JtYXQgJSN4LCBjaGFubmVsIG1hc2sgJSN4LCAiCi0gICAgICAgICAgImZsYWdzICUjeCIsCi0gICAgICAgICAgZGV2aWNlLCBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssICpmbGFncyk7Ci0KLSAgICAqb3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRGV2aWNlKGRldmljZSwgc2Vzc2lvbiwgKnN0cmVhbSwgY29uZmlnLCBmbGFncyk7Ci0gICAgaWYgKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgbU91dHB1dFJvdXRlcy5yZW1vdmVSb3V0ZShzZXNzaW9uKTsKKyAgICAvLyBUaGUgc3VwcGxpZWQgcG9ydElkIG11c3QgYmUgQVVESU9fUE9SVF9IQU5ETEVfTk9ORQorICAgIGlmICgqcG9ydElkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KKyAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHJlcXVlc3RlZFBvcnRJZCA9ICpzZWxlY3RlZERldmljZUlkOworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCByZXN1bHRBdHRyOworICAgIGJvb2wgaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UgPSBmYWxzZTsKKyAgICBzdGQ6OnZlY3RvcjxzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+IHNlY29uZGFyeU91dHB1dERlc2NzOworICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IHJlcXVlc3RlZERldmljZSA9CisgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocmVxdWVzdGVkUG9ydElkKTsKIAotICAgIERldmljZVZlY3RvciBvdXRwdXREZXZpY2VzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7Ci0gICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBvdXRwdXREZXZpY2VzLnNpemUoKSA+IDAgPyBvdXRwdXREZXZpY2VzLml0ZW1BdCgwKS0+Z2V0SWQoKQotICAgICAgICAgICAgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIC8vIFByZXZlbnQgZnJvbSBzdG9yaW5nIGludmFsaWQgcmVxdWVzdGVkIGRldmljZSBpZCBpbiBjbGllbnRzCisgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBzYW5pdGl6ZWRSZXF1ZXN0ZWRQb3J0SWQgPQorICAgICAgcmVxdWVzdGVkRGV2aWNlICE9IG51bGxwdHIgPyByZXF1ZXN0ZWRQb3J0SWQgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICpzZWxlY3RlZERldmljZUlkID0gc2FuaXRpemVkUmVxdWVzdGVkUG9ydElkOwogCi0gICAgQUxPR1YoIiAgZ2V0T3V0cHV0Rm9yQXR0cigpIHJldHVybnMgb3V0cHV0ICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQiLCAqb3V0cHV0LCAqc2VsZWN0ZWREZXZpY2VJZCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0T3V0cHV0Rm9yQXR0ckludCgmcmVzdWx0QXR0ciwgb3V0cHV0LCBzZXNzaW9uLCBhdHRyLCBzdHJlYW0sIHVpZCwKKyAgICAgICAgICAgIGNvbmZpZywgZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsICZpc1JlcXVlc3RlZERldmljZUZvckV4Y2x1c2l2ZVVzZSwKKyAgICAgICAgICAgICZzZWNvbmRhcnlPdXRwdXREZXNjcyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzdGQ6OnZlY3Rvcjx3cDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+IHdlYWtTZWNvbmRhcnlPdXRwdXREZXNjczsKKyAgICBmb3IgKGF1dG8mIHNlY29uZGFyeURlc2MgOiBzZWNvbmRhcnlPdXRwdXREZXNjcykgeworICAgICAgICBzZWNvbmRhcnlPdXRwdXRzLT5wdXNoX2JhY2soc2Vjb25kYXJ5RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgd2Vha1NlY29uZGFyeU91dHB1dERlc2NzLnB1c2hfYmFjayhzZWNvbmRhcnlEZXNjKTsKKyAgICB9CisKKyAgICBhdWRpb19jb25maWdfYmFzZV90IGNsaWVudENvbmZpZyA9IHsuc2FtcGxlX3JhdGUgPSBjb25maWctPnNhbXBsZV9yYXRlLAorICAgICAgICAuZm9ybWF0ID0gY29uZmlnLT5mb3JtYXQsCisgICAgICAgIC5jaGFubmVsX21hc2sgPSBjb25maWctPmNoYW5uZWxfbWFzayB9OworICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOworCisgICAgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiBjbGllbnREZXNjID0KKyAgICAgICAgbmV3IFRyYWNrQ2xpZW50RGVzY3JpcHRvcigqcG9ydElkLCB1aWQsIHNlc3Npb24sIHJlc3VsdEF0dHIsIGNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW5pdGl6ZWRSZXF1ZXN0ZWRQb3J0SWQsICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhyZXN1bHRBdHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1ZvbHVtZVNvdXJjZShyZXN1bHRBdHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZmxhZ3MsIGlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZSh3ZWFrU2Vjb25kYXJ5T3V0cHV0RGVzY3MpKTsKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKCpvdXRwdXQpOworICAgIG91dHB1dERlc2MtPmFkZENsaWVudChjbGllbnREZXNjKTsKKworICAgIEFMT0dWKCIlcygpIHJldHVybnMgb3V0cHV0ICVkIHJlcXVlc3RlZFBvcnRJZCAlZCBzZWxlY3RlZERldmljZUlkICVkIGZvciBwb3J0IElEICVkIiwgX19mdW5jX18sCisgICAgICAgICAgKm91dHB1dCwgcmVxdWVzdGVkUG9ydElkLCAqc2VsZWN0ZWREZXZpY2VJZCwgKnBvcnRJZCk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0Rm9yRGV2aWNlKAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JEZXZpY2VzKAorICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzKQorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCisgICAgICAgIGJvb2wgZm9yY2VNdXRpbmdIYXB0aWMpCiB7CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogCisgICAgLy8gRGlzY2FyZCBoYXB0aWMgY2hhbm5lbCBtYXNrIHdoZW4gZm9yY2luZyBtdXRpbmcgaGFwdGljIGNoYW5uZWxzLgorICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gZm9yY2VNdXRpbmdIYXB0aWMKKyAgICAgICAgICAgID8gKGNvbmZpZy0+Y2hhbm5lbF9tYXNrICYgfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgOiBjb25maWctPmNoYW5uZWxfbWFzazsKKwogICAgIC8vIG9wZW4gYSBkaXJlY3Qgb3V0cHV0IGlmIHJlcXVpcmVkIGJ5IHNwZWNpZmllZCBwYXJhbWV0ZXJzCiAgICAgLy9mb3JjZSBkaXJlY3QgZmxhZyBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0OiBvZmZsb2FkaW5nIGltcGxpZXMgYSBkaXJlY3Qgb3V0cHV0IHN0cmVhbQogICAgIC8vIGFuZCBhbGwgY29tbW9uIGJlaGF2aW9ycyBhcmUgZHJpdmVuIGJ5IGNoZWNraW5nIG9ubHkgdGhlIGRpcmVjdCBmbGFnCkBAIC05MzQsNyArMTEzNCw4IEBACiAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVFRTKSB7CiAgICAgICAgICpmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX1RUUzsKICAgICB9IGVsc2UgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCAmJgotICAgICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpICYmCisgICAgICAgICAgICAgICAoKmZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfSU5DQUxMX01VU0lDKSA9PSAwKSB7CiAgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOwogICAgICAgICBBTE9HVigiU2V0IFZvSVAgYW5kIERpcmVjdCBvdXRwdXQgZmxhZ3MgZm9yIFBDTSBmb3JtYXQiKTsKQEAgLTk0Nyw3ICsxMTQ4LDcgQEAKICAgICAvLyBhbmQgbm90IGV4cGxpY2l0bHkgcmVxdWVzdGVkCiAgICAgaWYgKCgoKmZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSA9PSAwKSAmJgogICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkgJiYgY29uZmlnLT5zYW1wbGVfcmF0ZSA8PSBTQU1QTEVfUkFURV9IWl9NQVggJiYKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWctPmNoYW5uZWxfbWFzaykgPD0gMikgeworICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKSA8PSAyKSB7CiAgICAgICAgIGdvdG8gbm9uX2RpcmVjdF9vdXRwdXQ7CiAgICAgfQogCkBAIC05NjAsMTEgKzExNjEsMTIgQEAKIAogICAgIGlmICgoKCpmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDApIHx8CiAgICAgICAgICAgICAhKG1FZmZlY3RzLmlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkgfHwgbU1hc3Rlck1vbm8pKSB7Ci0gICAgICAgIHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkqZmxhZ3MpOworICAgICAgICBwcm9maWxlID0gZ2V0UHJvZmlsZUZvck91dHB1dChkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkqZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogZGlyZWN0T25seSAqLyk7CiAgICAgfQogCiAgICAgaWYgKHByb2ZpbGUgIT0gMCkgewpAQCAtOTc2LDEwICsxMTc4LDEwIEBACiAgICAgICAgICAgICAgICAgLy8gYW5kIGNvbmZpZ3VyZWQgd2l0aCBzYW1lIHBhcmFtZXRlcnMKICAgICAgICAgICAgICAgICBpZiAoKGNvbmZpZy0+c2FtcGxlX3JhdGUgPT0gZGVzYy0+bVNhbXBsaW5nUmF0ZSkgJiYKICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+Zm9ybWF0ID09IGRlc2MtPm1Gb3JtYXQpICYmCi0gICAgICAgICAgICAgICAgICAgIChjb25maWctPmNoYW5uZWxfbWFzayA9PSBkZXNjLT5tQ2hhbm5lbE1hc2spICYmCisgICAgICAgICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBkZXNjLT5tQ2hhbm5lbE1hc2spICYmCiAgICAgICAgICAgICAgICAgICAgIChzZXNzaW9uID09IGRlc2MtPm1EaXJlY3RDbGllbnRTZXNzaW9uKSkgewogICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRGlyZWN0T3BlbkNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dJKCJnZXRPdXRwdXRGb3JEZXZpY2UoKSByZXVzaW5nIGRpcmVjdCBvdXRwdXQgJWQgZm9yIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgICAgICAgICBBTE9HSSgiJXMgcmV1c2luZyBkaXJlY3Qgb3V0cHV0ICVkIGZvciBzZXNzaW9uICVkIiwgX19mdW5jX18sIAogICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMua2V5QXQoaSksIHNlc3Npb24pOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbU91dHB1dHMua2V5QXQoaSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtOTkzLDIxICsxMTk1LDM2IEBACiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0KICAgICAgICAgICAgICAgICBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwogCi0gICAgICAgIERldmljZVZlY3RvciBvdXRwdXREZXZpY2VzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7Ci0gICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG91dHB1dERldmljZXMuc2l6ZSgpID4gMCA/IG91dHB1dERldmljZXMuaXRlbUF0KDApLT5tQWRkcmVzcwotICAgICAgICAgICAgICAgIDogU3RyaW5nOCgiIik7CisgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGdldEZpcnN0RGV2aWNlQWRkcmVzcyhkZXZpY2VzKTsKIAotICAgICAgICBzdGF0dXMgPSBvdXRwdXREZXNjLT5vcGVuKGNvbmZpZywgZGV2aWNlLCBhZGRyZXNzLCBzdHJlYW0sICpmbGFncywgJm91dHB1dCk7CisgICAgICAgIC8vIE1TRCBwYXRjaCBtYXkgYmUgdXNpbmcgdGhlIG9ubHkgb3V0cHV0IHN0cmVhbSB0aGF0IGNhbiBzZXJ2aWNlIHRoaXMgcmVxdWVzdC4gUmVsZWFzZQorICAgICAgICAvLyBNU0QgcGF0Y2ggdG8gcHJpb3JpdGl6ZSB0aGlzIHJlcXVlc3Qgb3ZlciBhbnkgYWN0aXZlIG91dHB1dCBvbiBNU0QuCisgICAgICAgIEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIG1zZFBhdGNoZXMgPSBnZXRNc2RQYXRjaGVzKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbXNkUGF0Y2hlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3QgYXV0byYgcGF0Y2ggPSBtc2RQYXRjaGVzW2ldOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwYXRjaC0+bVBhdGNoLm51bV9zaW5rczsgKytqKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rID0gJnBhdGNoLT5tUGF0Y2guc2lua3Nbal07CisgICAgICAgICAgICAgICAgaWYgKHNpbmstPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHNpbmstPmV4dC5kZXZpY2UudHlwZSAmIGRldmljZXMudHlwZXMoKSkgIT0gQVVESU9fREVWSUNFX05PTkUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChhZGRyZXNzLmlzRW1wdHkoKSB8fCBzdHJuY21wKHNpbmstPmV4dC5kZXZpY2UuYWRkcmVzcywgYWRkcmVzcy5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gtPm1IYW5kbGUsIG1VaWRDYWNoZWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBvdXRwdXREZXNjLT5vcGVuKGNvbmZpZywgZGV2aWNlcywgc3RyZWFtLCAqZmxhZ3MsICZvdXRwdXQpOwogCiAgICAgICAgIC8vIG9ubHkgYWNjZXB0IGFuIG91dHB1dCB3aXRoIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVycwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CiAgICAgICAgICAgICAoY29uZmlnLT5zYW1wbGVfcmF0ZSAhPSAwICYmIGNvbmZpZy0+c2FtcGxlX3JhdGUgIT0gb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSkgfHwKICAgICAgICAgICAgIChjb25maWctPmZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCAmJiBjb25maWctPmZvcm1hdCAhPSBvdXRwdXREZXNjLT5tRm9ybWF0KSB8fAotICAgICAgICAgICAgKGNvbmZpZy0+Y2hhbm5lbF9tYXNrICE9IDAgJiYgY29uZmlnLT5jaGFubmVsX21hc2sgIT0gb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrKSkgewotICAgICAgICAgICAgQUxPR1YoImdldE91dHB1dEZvckRldmljZSgpIGZhaWxlZCBvcGVuaW5nIGRpcmVjdCBvdXRwdXQ6IG91dHB1dCAlZCBzYW1wbGUgcmF0ZSAlZCAlZCwiCi0gICAgICAgICAgICAgICAgICAgICJmb3JtYXQgJWQgJWQsIGNoYW5uZWwgbWFzayAlMDR4ICUwNHgiLCBvdXRwdXQsIGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICAoY2hhbm5lbE1hc2sgIT0gMCAmJiBjaGFubmVsTWFzayAhPSBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICBBTE9HVigiJXMgZmFpbGVkIG9wZW5pbmcgZGlyZWN0IG91dHB1dDogb3V0cHV0ICVkIHNhbXBsZSByYXRlICVkICVkLCIgCisgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgJWQgJWQsIGNoYW5uZWwgbWFzayAlMDR4ICUwNHgiLCBfX2Z1bmNfXywgb3V0cHV0LCBjb25maWctPnNhbXBsZV9yYXRlLAogICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlLCBjb25maWctPmZvcm1hdCwgb3V0cHV0RGVzYy0+bUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spOwogICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmNsb3NlKCk7CiAgICAgICAgICAgICB9CkBAIC0xMDE4LDE0ICsxMjM1LDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgIH0KLSAgICAgICAgb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPSAwOwotICAgICAgICBvdXRwdXREZXNjLT5tU3RvcFRpbWVbc3RyZWFtXSA9IDA7CiAgICAgICAgIG91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQgPSAxOwogICAgICAgICBvdXRwdXREZXNjLT5tRGlyZWN0Q2xpZW50U2Vzc2lvbiA9IHNlc3Npb247CiAKICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7CiAgICAgICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKLSAgICAgICAgQUxPR1YoImdldE91dHB1dEZvckRldmljZSgpIHJldHVybnMgbmV3IGRpcmVjdCBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICBBTE9HVigiJXMgcmV0dXJucyBuZXcgZGlyZWN0IG91dHB1dCAlZCIsIF9fZnVuY19fLCBvdXRwdXQpOwogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgIHJldHVybiBvdXRwdXQ7CiAgICAgfQpAQCAtMTA0NiwzMCArMTI2MSwxODggQEAKICAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkpIHsKICAgICAgICAgLy8gZ2V0IHdoaWNoIG91dHB1dCBpcyBzdWl0YWJsZSBmb3IgdGhlIHNwZWNpZmllZCBzdHJlYW0uIFRoZSBhY3R1YWwKICAgICAgICAgLy8gcm91dGluZyBjaGFuZ2Ugd2lsbCBoYXBwZW4gd2hlbiBzdGFydE91dHB1dCgpIHdpbGwgYmUgY2FsbGVkCi0gICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBtT3V0cHV0cyk7CisgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2VzKGRldmljZXMsIG1PdXRwdXRzKTsKIAogICAgICAgICAvLyBhdCB0aGlzIHN0YWdlIHdlIHNob3VsZCBpZ25vcmUgdGhlIERJUkVDVCBmbGFnIGFzIG5vIGRpcmVjdCBvdXRwdXQgY291bGQgYmUgZm91bmQgZWFybGllcgogICAgICAgICAqZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKCpmbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOwotICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgKmZsYWdzLCBjb25maWctPmZvcm1hdCk7CisgICAgICAgIG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLCAqZmxhZ3MsIGNvbmZpZy0+Zm9ybWF0LCBjaGFubmVsTWFzaywgY29uZmlnLT5zYW1wbGVfcmF0ZSk7CiAgICAgfQotICAgIEFMT0dXX0lGKChvdXRwdXQgPT0gMCksICJnZXRPdXRwdXRGb3JEZXZpY2UoKSBjb3VsZCBub3QgZmluZCBvdXRwdXQgZm9yIHN0cmVhbSAlZCwgIgorICAgIEFMT0dXX0lGKChvdXRwdXQgPT0gMCksICJnZXRPdXRwdXRGb3JEZXZpY2VzKCkgY291bGQgbm90IGZpbmQgb3V0cHV0IGZvciBzdHJlYW0gJWQsICIKICAgICAgICAgICAgICJzYW1wbGluZyByYXRlICVkLCBmb3JtYXQgJSN4LCBjaGFubmVscyAlI3gsIGZsYWdzICUjeCIsCi0gICAgICAgICAgICBzdHJlYW0sIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgKmZsYWdzKTsKKyAgICAgICAgICAgIHN0cmVhbSwgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNoYW5uZWxNYXNrLCAqZmxhZ3MpOwogCiAgICAgcmV0dXJuIG91dHB1dDsKIH0KIAorc3A8RGV2aWNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNc2RBdWRpb0luRGV2aWNlKCkgY29uc3QgeworICAgIGF1dG8gbXNkSW5EZXZpY2VzID0gbUh3TW9kdWxlcy5nZXRBdmFpbGFibGVEZXZpY2VzRnJvbU1vZHVsZU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMpOworICAgIHJldHVybiBtc2RJbkRldmljZXMuaXNFbXB0eSgpPyBudWxscHRyIDogbXNkSW5EZXZpY2VzLml0ZW1BdCgwKTsKK30KKworRGV2aWNlVmVjdG9yIEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TXNkQXVkaW9PdXREZXZpY2VzKCkgY29uc3QgeworICAgIHJldHVybiBtSHdNb2R1bGVzLmdldEF2YWlsYWJsZURldmljZXNGcm9tTW9kdWxlTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7Cit9CisKK2NvbnN0IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TXNkUGF0Y2hlcygpIGNvbnN0IHsKKyAgICBBdWRpb1BhdGNoQ29sbGVjdGlvbiBtc2RQYXRjaGVzOworICAgIHNwPEh3TW9kdWxlPiBtc2RNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpOworICAgIGlmIChtc2RNb2R1bGUgIT0gMCkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1BhdGNoZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGkpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwYXRjaC0+bVBhdGNoLm51bV9zb3VyY2VzOyArK2opIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSA9ICZwYXRjaC0+bVBhdGNoLnNvdXJjZXNbal07CisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UtPmV4dC5kZXZpY2UuaHdfbW9kdWxlID09IG1zZE1vZHVsZS0+Z2V0SGFuZGxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNkUGF0Y2hlcy5hZGRBdWRpb1BhdGNoKHBhdGNoLT5tSGFuZGxlLCBwYXRjaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtc2RQYXRjaGVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEJlc3RNc2RBdWRpb1Byb2ZpbGVGb3IoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm91dHB1dERldmljZSwKKyAgICAgICAgYm9vbCBod0F2U3luYywgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZUNvbmZpZywgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtDb25maWcpIGNvbnN0Cit7CisgICAgc3A8SHdNb2R1bGU+IG1zZE1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCk7CisgICAgaWYgKG1zZE1vZHVsZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcygpIHVuYWJsZSB0byBnZXQgTVNEIG1vZHVsZSIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHNwPEh3TW9kdWxlPiBkZXZpY2VNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZShvdXRwdXREZXZpY2UsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICBpZiAoZGV2aWNlTW9kdWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgdW5hYmxlIHRvIGdldCBtb2R1bGUgZm9yICVzIiwgX19mdW5jX18sIG91dHB1dERldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGNvbnN0IElucHV0UHJvZmlsZUNvbGxlY3Rpb24gJmlucHV0UHJvZmlsZXMgPSBtc2RNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKTsKKyAgICBpZiAoaW5wdXRQcm9maWxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgbm8gaW5wdXQgcHJvZmlsZXMgZm9yIE1TRCBtb2R1bGUiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBjb25zdCBPdXRwdXRQcm9maWxlQ29sbGVjdGlvbiAmb3V0cHV0UHJvZmlsZXMgPSBkZXZpY2VNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCk7CisgICAgaWYgKG91dHB1dFByb2ZpbGVzLmlzRW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXMoKSBubyBvdXRwdXQgcHJvZmlsZXMgZm9yIGRldmljZSAlcyIsIF9fZnVuY19fLCBvdXRwdXREZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgbXNkUHJvZmlsZXM7CisgICAgLy8gRWFjaCBJT1Byb2ZpbGUgcmVwcmVzZW50cyBhIE1peFBvcnQgZnJvbSBhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmluUHJvZmlsZSA6IGlucHV0UHJvZmlsZXMpIHsKKyAgICAgICAgaWYgKGh3QXZTeW5jID09ICgoaW5Qcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DKSAhPSAwKSkgeworICAgICAgICAgICAgbXNkUHJvZmlsZXMuYXBwZW5kVmVjdG9yKGluUHJvZmlsZS0+Z2V0QXVkaW9Qcm9maWxlcygpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgZGV2aWNlUHJvZmlsZXM7CisgICAgZm9yIChjb25zdCBhdXRvICZvdXRQcm9maWxlIDogb3V0cHV0UHJvZmlsZXMpIHsKKyAgICAgICAgaWYgKGh3QXZTeW5jID09ICgob3V0UHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpICE9IDApKSB7CisgICAgICAgICAgICBkZXZpY2VQcm9maWxlcy5hcHBlbmRWZWN0b3Iob3V0UHJvZmlsZS0+Z2V0QXVkaW9Qcm9maWxlcygpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgYmVzdFNpbmtDb25maWc7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbXNkUHJvZmlsZXMuZmluZEJlc3RNYXRjaGluZ091dHB1dENvbmZpZyhkZXZpY2VQcm9maWxlcywKKyAgICAgICAgICAgIGNvbXByZXNzZWRGb3JtYXRzT3JkZXIsIHN1cnJvdW5kQ2hhbm5lbE1hc2tzT3JkZXIsIHRydWUgLypwcmVmZXJIaWdoZXJTYW1wbGluZ1JhdGVzKi8sCisgICAgICAgICAgICAmYmVzdFNpbmtDb25maWcpOworICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0QoIiVzKCkgbm8gbWF0Y2hpbmcgcHJvZmlsZXMgZm91bmQgZm9yIGRldmljZTogJXMsIGh3QXZTeW5jOiAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG91dHB1dERldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBod0F2U3luYyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHNpbmtDb25maWctPnNhbXBsZV9yYXRlID0gYmVzdFNpbmtDb25maWcuc2FtcGxlX3JhdGU7CisgICAgc2lua0NvbmZpZy0+Y2hhbm5lbF9tYXNrID0gYmVzdFNpbmtDb25maWcuY2hhbm5lbF9tYXNrOworICAgIHNpbmtDb25maWctPmZvcm1hdCA9IGJlc3RTaW5rQ29uZmlnLmZvcm1hdDsKKyAgICAvLyBGb3IgZW5jb2RlZCBzdHJlYW1zIGZvcmNlIGRpcmVjdCBmbGFnIHRvIHByZXZlbnQgZG93bnN0cmVhbSBtaXhpbmcuCisgICAgc2lua0NvbmZpZy0+ZmxhZ3Mub3V0cHV0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KAorICAgICAgICAgICAgc2lua0NvbmZpZy0+ZmxhZ3Mub3V0cHV0IHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBzb3VyY2VDb25maWctPnNhbXBsZV9yYXRlID0gYmVzdFNpbmtDb25maWcuc2FtcGxlX3JhdGU7CisgICAgLy8gU3BlY2lmeSBleGFjdCBjaGFubmVsIG1hc2sgdG8gcHJldmVudCBndWVzc2luZyBieSBiaXQgY291bnQgaW4gUGF0Y2hQYW5lbC4KKyAgICBzb3VyY2VDb25maWctPmNoYW5uZWxfbWFzayA9IGF1ZGlvX2NoYW5uZWxfbWFza19vdXRfdG9faW4oYmVzdFNpbmtDb25maWcuY2hhbm5lbF9tYXNrKTsKKyAgICBzb3VyY2VDb25maWctPmZvcm1hdCA9IGJlc3RTaW5rQ29uZmlnLmZvcm1hdDsKKyAgICAvLyBDb3B5IGlucHV0IHN0cmVhbSBkaXJlY3RseSB3aXRob3V0IGFueSBwcm9jZXNzaW5nIChlLmcuIHJlc2FtcGxpbmcpLgorICAgIHNvdXJjZUNvbmZpZy0+ZmxhZ3MuaW5wdXQgPSBzdGF0aWNfY2FzdDxhdWRpb19pbnB1dF9mbGFnc190PigKKyAgICAgICAgICAgIHNvdXJjZUNvbmZpZy0+ZmxhZ3MuaW5wdXQgfCBBVURJT19JTlBVVF9GTEFHX0RJUkVDVCk7CisgICAgaWYgKGh3QXZTeW5jKSB7CisgICAgICAgIHNpbmtDb25maWctPmZsYWdzLm91dHB1dCA9IHN0YXRpY19jYXN0PGF1ZGlvX291dHB1dF9mbGFnc190PigKKyAgICAgICAgICAgICAgICBzaW5rQ29uZmlnLT5mbGFncy5vdXRwdXQgfCBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKTsKKyAgICAgICAgc291cmNlQ29uZmlnLT5mbGFncy5pbnB1dCA9IHN0YXRpY19jYXN0PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+KAorICAgICAgICAgICAgICAgIHNvdXJjZUNvbmZpZy0+ZmxhZ3MuaW5wdXQgfCBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkMpOworICAgIH0KKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgY29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSB8CisgICAgICAgICAgICBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0sgfCBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQgfCBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICBzaW5rQ29uZmlnLT5jb25maWdfbWFzayB8PSBjb25maWdfbWFzazsKKyAgICBzb3VyY2VDb25maWctPmNvbmZpZ19tYXNrIHw9IGNvbmZpZ19tYXNrOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworUGF0Y2hCdWlsZGVyIEF1ZGlvUG9saWN5TWFuYWdlcjo6YnVpbGRNc2RQYXRjaChjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmb3V0cHV0RGV2aWNlKSBjb25zdAoreworICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CisgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShnZXRNc2RBdWRpb0luRGV2aWNlKCkpLmFkZFNpbmsob3V0cHV0RGV2aWNlKTsKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBzb3VyY2VDb25maWcgPSBwYXRjaEJ1aWxkZXIucGF0Y2goKS0+c291cmNlc1swXTsKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBzaW5rQ29uZmlnID0gcGF0Y2hCdWlsZGVyLnBhdGNoKCktPnNpbmtzWzBdOworICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2hldGhlciBNU0QgbW9kdWxlIGhhcyBIV19BVl9TWU5DIGZsYWcgc2V0IGluIHRoZSBBUCBjb25maWcgZmlsZS4KKyAgICAvLyBGb3Igbm93LCB3ZSBqdXN0IGZvcmNlZnVsbHkgdHJ5IHdpdGggSHdBdlN5bmMgZmlyc3QuCisgICAgc3RhdHVzX3QgcmVzID0gZ2V0QmVzdE1zZEF1ZGlvUHJvZmlsZUZvcihvdXRwdXREZXZpY2UsIHRydWUgLypod0F2U3luYyovLAorICAgICAgICAgICAgJnNvdXJjZUNvbmZpZywgJnNpbmtDb25maWcpID09IE5PX0VSUk9SID8gTk9fRVJST1IgOgorICAgICAgICAgICAgZ2V0QmVzdE1zZEF1ZGlvUHJvZmlsZUZvcigKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlLCBmYWxzZSAvKmh3QXZTeW5jKi8sICZzb3VyY2VDb25maWcsICZzaW5rQ29uZmlnKTsKKyAgICBpZiAocmVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIEZvdW5kIGEgbWF0Y2hpbmcgcHJvZmlsZSBmb3IgZW5jb2RlZCBhdWRpby4gUmUtY3JlYXRlIFBhdGNoQnVpbGRlciB3aXRoIHRoaXMgY29uZmlnLgorICAgICAgICByZXR1cm4gKFBhdGNoQnVpbGRlcigpKS5hZGRTb3VyY2Uoc291cmNlQ29uZmlnKS5hZGRTaW5rKHNpbmtDb25maWcpOworICAgIH0KKyAgICBBTE9HVigiJXMoKSBubyBtYXRjaGluZyBwcm9maWxlIGZvdW5kLiBGYWxsIHRocm91Z2ggdG8gZGVmYXVsdCBQQ00gcGF0Y2giCisgICAgICAgICAgICAiIHN1cHBvcnRpbmcgUENNIGZvcm1hdCBjb252ZXJzaW9uLiIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gcGF0Y2hCdWlsZGVyOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldE1zZFBhdGNoKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZvdXRwdXREZXZpY2UpIHsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBvdXRwdXREZXZpY2U7CisgICAgaWYgKGRldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIFVzZSBtZWRpYSBzdHJhdGVneSBmb3IgdW5zcGVjaWZpZWQgb3V0cHV0IGRldmljZS4gVGhpcyBzaG91bGQgb25seQorICAgICAgICAvLyBvY2N1ciBvbiBjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoKS4gRGV2aWNlIGNvbm5lY3Rpb24gZXZlbnRzIG1heQorICAgICAgICAvLyB0aGVyZWZvcmUgaW52YWxpZGF0ZSBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3RzLgorICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKSwgbnVsbHB0ciwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZGV2aWNlcy5pc0VtcHR5KCksICJubyBvdXRwdWRldmljZSB0byBzZXQgTXNkIFBhdGNoIik7CisgICAgICAgIGRldmljZSA9IGRldmljZXMuaXRlbUF0KDApOworICAgIH0KKyAgICBBTE9HVigiJXMoKSBmb3IgZGV2aWNlICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyID0gYnVpbGRNc2RQYXRjaChkZXZpY2UpOworICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCogcGF0Y2ggPSBwYXRjaEJ1aWxkZXIucGF0Y2goKTsKKyAgICBjb25zdCBBdWRpb1BhdGNoQ29sbGVjdGlvbiBtc2RQYXRjaGVzID0gZ2V0TXNkUGF0Y2hlcygpOworICAgIGlmICghbXNkUGF0Y2hlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtc2RQYXRjaGVzLnNpemUoKSA+IDEsCisgICAgICAgICAgICAgICAgIlRoZSBjdXJyZW50IE1TRCBwcm90b3R5cGUgb25seSBzdXBwb3J0cyBvbmUgb3V0cHV0IHBhdGNoIik7CisgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IGN1cnJlbnRQYXRjaCA9IG1zZFBhdGNoZXMudmFsdWVBdCgwKTsKKyAgICAgICAgaWYgKGF1ZGlvX3BhdGNoZXNfYXJlX2VxdWFsKCZjdXJyZW50UGF0Y2gtPm1QYXRjaCwgcGF0Y2gpKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2goY3VycmVudFBhdGNoLT5tSGFuZGxlLCBtVWlkQ2FjaGVkKTsKKyAgICB9CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5zdGFsbFBhdGNoKF9fZnVuY19fLCAtMSAvKmluZGV4Ki8sIG51bGxwdHIgLypwYXRjaEhhbmRsZSovLAorICAgICAgICAgICAgcGF0Y2gsIDAgLypkZWxheU1zKi8sIG1VaWRDYWNoZWQsIG51bGxwdHIgLypwYXRjaERlc2NQdHIqLyk7CisgICAgQUxPR0VfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAiJXMoKSBlcnJvciAlZCBjcmVhdGluZyBNU0QgYXVkaW8gcGF0Y2giLCBfX2Z1bmNfXywgc3RhdHVzKTsKKyAgICBBTE9HSV9JRihzdGF0dXMgPT0gTk9fRVJST1IsICIlcygpIFBhdGNoIGNyZWF0ZWQgZnJvbSBNU0RfSU4gdG8gIgorICAgICAgICAgICAiZGV2aWNlOiVzIChmb3JtYXQ6JSN4IGNoYW5uZWxzOiUjeCBzYW1wbGVyYXRlOiVkKSIsIF9fZnVuY19fLAorICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBwYXRjaC0+c291cmNlc1swXS5mb3JtYXQsCisgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uY2hhbm5lbF9tYXNrLCBwYXRjaC0+c291cmNlc1swXS5zYW1wbGVfcmF0ZSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZWxlY3RPdXRwdXQoY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSkKIHsKICAgICAvLyBzZWxlY3Qgb25lIG91dHB1dCBhbW9uZyBzZXZlcmFsIHRoYXQgcHJvdmlkZSBhIHBhdGggdG8gYSBwYXJ0aWN1bGFyIGRldmljZSBvciBzZXQgb2YKLSAgICAvLyBkZXZpY2VzICh0aGUgbGlzdCB3YXMgcHJldmlvdXNseSBidWlsZCBieSBnZXRPdXRwdXRzRm9yRGV2aWNlKCkpLgorICAgIC8vIGRldmljZXMgKHRoZSBsaXN0IHdhcyBwcmV2aW91c2x5IGJ1aWxkIGJ5IGdldE91dHB1dHNGb3JEZXZpY2VzKCkpLgogICAgIC8vIFRoZSBwcmlvcml0eSBpcyBhcyBmb2xsb3dzOgotICAgIC8vIDE6IHRoZSBvdXRwdXQgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgcmVxdWVzdGVkIHBvbGljeSBmbGFncwotICAgIC8vIDI6IHRoZSBvdXRwdXQgd2l0aCB0aGUgYml0IGRlcHRoIHRoZSBjbG9zZXN0IHRvIHRoZSByZXF1ZXN0ZWQgb25lCi0gICAgLy8gMzogdGhlIHByaW1hcnkgb3V0cHV0Ci0gICAgLy8gNDogdGhlIGZpcnN0IG91dHB1dCBpbiB0aGUgbGlzdAorICAgIC8vIDE6IHRoZSBvdXRwdXQgc3VwcG9ydGluZyBoYXB0aWMgcGxheWJhY2sgd2hlbiByZXF1ZXN0aW5nIGhhcHRpYyBwbGF5YmFjaworICAgIC8vIDI6IHRoZSBvdXRwdXQgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgcmVxdWVzdGVkIHBvbGljeSBmbGFncworICAgIC8vIDM6IHRoZSBvdXRwdXQgd2l0aCB0aGUgYml0IGRlcHRoIHRoZSBjbG9zZXN0IHRvIHRoZSByZXF1ZXN0ZWQgb25lCisgICAgLy8gNDogdGhlIHByaW1hcnkgb3V0cHV0CisgICAgLy8gNTogdGhlIGZpcnN0IG91dHB1dCBpbiB0aGUgbGlzdAogCiAgICAgaWYgKG91dHB1dHMuc2l6ZSgpID09IDApIHsKICAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwpAQCAtMTA3OSwxOCArMTQ1Miw0NiBAQAogICAgIH0KIAogICAgIGludCBtYXhDb21tb25GbGFncyA9IDA7CisgICAgY29uc3Qgc2l6ZV90IGhhcHRpY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzaygKKyAgICAgICAgICAgIGNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRGb3JGbGFncyA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dEZvclByaW1hcnkgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRGb3JGb3JtYXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICBhdWRpb19mb3JtYXRfdCBiZXN0Rm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CiAgICAgYXVkaW9fZm9ybWF0X3QgYmVzdEZvcm1hdEZvckZsYWdzID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CiAKKyAgICAvLyBGbGFncyB3aGljaCBtdXN0IGJlIHByZXNlbnQgb24gYm90aCB0aGUgcmVxdWVzdCBhbmQgdGhlIHNlbGVjdGVkIG91dHB1dAorICAgIHN0YXRpYyBjb25zdCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBrTWFuZGF0ZWRGbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkKKyAgICAgICAgKEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMgfCBBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRKTsKKwogICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0IDogb3V0cHV0cykgewogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CiAgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIGhhcHRpYyBjaGFubmVsIGlzIHNwZWNpZmllZCwgdXNlIHRoZSBoYXB0aWMgb3V0cHV0IGlmIHByZXNlbnQuCisgICAgICAgICAgICAvLyBXaGVuIHVzaW5nIGhhcHRpYyBvdXRwdXQsIHNhbWUgYXVkaW8gZm9ybWF0IGFuZCBzYW1wbGUgcmF0ZSBhcmUgcmVxdWlyZWQuCisgICAgICAgICAgICBpZiAoaGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIC8vIElmIGhhcHRpYyBjaGFubmVsIGlzIHNwZWNpZmllZCwgdXNlIHRoZSBmaXJzdCBvdXRwdXQgdGhhdAorICAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgaGFwdGljIHBsYXliYWNrLgorICAgICAgICAgICAgICAgIGlmIChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpID49IGhhcHRpY0NoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0ID09IG91dHB1dERlc2MtPm1Gb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHNhbXBsaW5nUmF0ZSA9PSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBXaGVuIGhhcHRpYyBjaGFubmVsIGlzIG5vdCBzcGVjaWZpZWQsIHNraXAgaGFwdGljIG91dHB1dC4KKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoa01hbmRhdGVkRmxhZ3MgJiBmbGFncykgIT0KKyAgICAgICAgICAgICAgICAoa01hbmRhdGVkRmxhZ3MgJiBvdXRwdXREZXNjLT5tUHJvZmlsZS0+Z2V0RmxhZ3MoKSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLy8gaWYgYSB2YWxpZCBmb3JtYXQgaXMgc3BlY2lmaWVkLCBza2lwIG91dHB1dCBpZiBub3QgY29tcGF0aWJsZQogICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRCkgewogICAgICAgICAgICAgICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CkBAIC0xMTM4LDY3ICsxNTM5LDMyIEBACiAgICAgcmV0dXJuIG91dHB1dHNbMF07CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgQUxPR1YoInN0YXJ0T3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLAotICAgICAgICAgIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInN0YXJ0T3V0cHV0KCkgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgIEFMT0dWKCIlcyBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLmdldE91dHB1dEZvckNsaWVudChwb3J0SWQpOworICAgIGlmIChvdXRwdXREZXNjID09IDApIHsKKyAgICAgICAgQUxPR1coInN0YXJ0T3V0cHV0KCkgbm8gb3V0cHV0IGZvciBjbGllbnQgJWQiLCBwb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKyAgICBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+IGNsaWVudCA9IG91dHB1dERlc2MtPmdldENsaWVudChwb3J0SWQpOwogCi0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKKyAgICBBTE9HVigic3RhcnRPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsCisgICAgICAgICAgb3V0cHV0RGVzYy0+bUlvSGFuZGxlLCBjbGllbnQtPnN0cmVhbSgpLCBjbGllbnQtPnNlc3Npb24oKSk7CiAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvdXRwdXREZXNjLT5zdGFydCgpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKLSAgICAvLyBSb3V0aW5nPwotICAgIG1PdXRwdXRSb3V0ZXMuaW5jUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKLQotICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2U7Ci0gICAgQXVkaW9NaXggKnBvbGljeU1peCA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciAqYWRkcmVzcyA9IE5VTEw7Ci0gICAgaWYgKG91dHB1dERlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCkgewotICAgICAgICBwb2xpY3lNaXggPSBvdXRwdXREZXNjLT5tUG9saWN5TWl4OwotICAgICAgICBhZGRyZXNzID0gcG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKTsKLSAgICAgICAgaWYgKChwb2xpY3lNaXgtPm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSA9PSBNSVhfUk9VVEVfRkxBR19SRU5ERVIpIHsKLSAgICAgICAgICAgIG5ld0RldmljZSA9IHBvbGljeU1peC0+bURldmljZVR5cGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuZXdEZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1PdXRwdXRSb3V0ZXMuZ2V0QW5kQ2xlYXJSb3V0ZUNoYW5nZWQoc2Vzc2lvbikpIHsKLSAgICAgICAgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICBpZiAobmV3RGV2aWNlICE9IG91dHB1dERlc2MtPmRldmljZSgpKSB7Ci0gICAgICAgICAgICBjaGVja1N0cmF0ZWd5Um91dGUoZ2V0U3RyYXRlZ3koc3RyZWFtKSwgb3V0cHV0KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG5ld0RldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwotICAgIH0KLQotICAgIHVpbnQzMl90IGRlbGF5TXMgPSAwOwotCi0gICAgc3RhdHVzID0gc3RhcnRTb3VyY2Uob3V0cHV0RGVzYywgc3RyZWFtLCBuZXdEZXZpY2UsIGFkZHJlc3MsICZkZWxheU1zKTsKKyAgICB1aW50MzJfdCBkZWxheU1zOworICAgIHN0YXR1cyA9IHN0YXJ0U291cmNlKG91dHB1dERlc2MsIGNsaWVudCwgJmRlbGF5TXMpOwogCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBtT3V0cHV0Um91dGVzLmRlY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7CiAgICAgICAgIG91dHB1dERlc2MtPnN0b3AoKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgLy8gQXV0b21hdGljYWxseSBlbmFibGUgdGhlIHJlbW90ZSBzdWJtaXggaW5wdXQgd2hlbiBvdXRwdXQgaXMgc3RhcnRlZCBvbiBhIHJlIHJvdXRpbmcgbWl4Ci0gICAgLy8gb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKLSAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UobmV3RGV2aWNlKSAmJiBwb2xpY3lNaXggIT0gTlVMTCAmJgotICAgICAgICAgICAgcG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKLSAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICJyZW1vdGUtc3VibWl4Iik7Ci0gICAgfQotCiAgICAgaWYgKGRlbGF5TXMgIT0gMCkgewogICAgICAgICB1c2xlZXAoZGVsYXlNcyAqIDEwMDApOwogICAgIH0KQEAgLTEyMDYsMTkgKzE1NzIsMjIgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0U291cmNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRlbGF5TXMpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0U291cmNlKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZGVsYXlNcykKIHsKICAgICAvLyBjYW5ub3Qgc3RhcnQgcGxheWJhY2sgb2YgU1RSRUFNX1RUUyBpZiBhbnkgb3RoZXIgb3V0cHV0IGlzIGJlaW5nIHVzZWQKICAgICB1aW50MzJfdCBiZWFjb25NdXRlTGF0ZW5jeSA9IDA7CiAKICAgICAqZGVsYXlNcyA9IDA7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBjbGllbnQtPnN0cmVhbSgpOworICAgIGF1dG8gY2xpZW50Vm9sU3JjID0gY2xpZW50LT52b2x1bWVTb3VyY2UoKTsKKyAgICBhdXRvIGNsaWVudFN0cmF0ZWd5ID0gY2xpZW50LT5zdHJhdGVneSgpOworICAgIGF1dG8gY2xpZW50QXR0ciA9IGNsaWVudC0+YXR0cmlidXRlcygpOwogICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1RUUykgewogICAgICAgICBBTE9HVigiXHQgZm91bmQgQkVBQ09OIHN0cmVhbSIpOwotICAgICAgICBpZiAoIW1UdHNPdXRwdXRBdmFpbGFibGUgJiYgbU91dHB1dHMuaXNBbnlPdXRwdXRBY3RpdmUoQVVESU9fU1RSRUFNX1RUUyAvKnN0cmVhbVRvSWdub3JlKi8pKSB7CisgICAgICAgIGlmICghbVR0c091dHB1dEF2YWlsYWJsZSAmJiBtT3V0cHV0cy5pc0FueU91dHB1dEFjdGl2ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9UVFMpIC8qc291cmNlVG9JZ25vcmUqLykpIHsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJlYWNvbk11dGVMYXRlbmN5ID0gaGFuZGxlRXZlbnRGb3JCZWFjb24oU1RBUlRJTkdfQkVBQ09OKTsKQEAgLTEyMzMsNiArMTYwMiwyMyBAQAogICAgIGJvb2wgZm9yY2UgPSAhb3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJgogICAgICAgICAgICAgKG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkgPT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpOwogCisgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CisgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peCA9IG91dHB1dERlc2MtPm1Qb2xpY3lNaXgucHJvbW90ZSgpOworICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSBOVUxMOworICAgIGlmIChwb2xpY3lNaXggIT0gTlVMTCkgeworICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlVHlwZTsKKyAgICAgICAgYWRkcmVzcyA9IHBvbGljeU1peC0+bURldmljZUFkZHJlc3Muc3RyaW5nKCk7CisgICAgICAgIGlmICgocG9saWN5TWl4LT5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgPT0gTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSB7CisgICAgICAgICAgICBuZXdEZXZpY2VUeXBlID0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmV3RGV2aWNlVHlwZSA9IHBvbGljeU1peC0+bURldmljZVR5cGU7CisgICAgICAgIH0KKyAgICAgICAgc3AgZGV2aWNlID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKG5ld0RldmljZVR5cGUsIFN0cmluZzgoYWRkcmVzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgQUxPR19BU1NFUlQoZGV2aWNlLCAiJXM6IG5vIGRldmljZSBmb3VuZCB0PSV1LCBhPSVzIiwgX19mdW5jX18sIG5ld0RldmljZVR5cGUsIGFkZHJlc3MpOworICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpOworICAgIH0KKwogICAgIC8vIHJlcXVpcmVzTXV0ZUNoZWNrIGlzIGZhbHNlIHdoZW4gd2UgY2FuIGJ5cGFzcyBtdXRlIHN0cmF0ZWd5LgogICAgIC8vIEl0IGNvdmVycyBhIGNvbW1vbiBjYXNlIHdoZW4gdGhlcmUgaXMgbm8gbWF0ZXJpYWxseSBhY3RpdmUgYXVkaW8KICAgICAvLyBhbmQgbXV0aW5nIHdvdWxkIHJlc3VsdCBpbiB1bm5lY2Vzc2FyeSBkZWxheSBhbmQgZHJvcHBlZCBhdWRpby4KQEAgLTEyNDIsMzEgKzE2MjgsMzcgQEAKICAgICAvLyBpbmNyZW1lbnQgdXNhZ2UgY291bnQgZm9yIHRoaXMgc3RyZWFtIG9uIHRoZSByZXF1ZXN0ZWQgb3V0cHV0OgogICAgIC8vIE5PVEUgdGhhdCB0aGUgdXNhZ2UgY291bnQgaXMgdGhlIHNhbWUgZm9yIGR1cGxpY2F0ZWQgb3V0cHV0IGFuZCBoYXJkd2FyZSBvdXRwdXQgd2hpY2ggaXMKICAgICAvLyBuZWNlc3NhcnkgZm9yIGEgY29ycmVjdCBjb250cm9sIG9mIGhhcmR3YXJlIG91dHB1dCByb3V0aW5nIGJ5IHN0YXJ0T3V0cHV0KCkgYW5kIHN0b3BPdXRwdXQoKQotICAgIG91dHB1dERlc2MtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgMSk7CisgICAgb3V0cHV0RGVzYy0+c2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgdHJ1ZSk7CiAKLSAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9NVVNJQykgeworICAgIGlmIChjbGllbnQtPmhhc1ByZWZlcnJlZERldmljZSh0cnVlKSkgeworICAgICAgICBkZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgaWYgKGRldmljZXMgIT0gb3V0cHV0RGVzYy0+ZGV2aWNlcygpKSB7CisgICAgICAgICAgICBjaGVja1N0cmF0ZWd5Um91dGUoY2xpZW50U3RyYXRlZ3ksIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZm9sbG93c1NhbWVSb3V0aW5nKGNsaWVudEF0dHIsIGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTUVESUEpKSkgewogICAgICAgICBzZWxlY3RPdXRwdXRGb3JNdXNpY0VmZmVjdHMoKTsKICAgICB9CiAKLSAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPT0gMSB8fCBkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICBpZiAob3V0cHV0RGVzYy0+Z2V0QWN0aXZpdHlDb3VudChjbGllbnRWb2xTcmMpID09IDEgfHwgIWRldmljZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgIC8vIHN0YXJ0aW5nIGFuIG91dHB1dCBiZWluZyByZXJvdXRlZD8KLSAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgZGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBpZiAoZGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGRldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwogICAgICAgICB9Ci0KLSAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7Ci0gICAgICAgIGJvb2wgc2hvdWxkV2FpdCA9IChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZWFjb25NdXRlTGF0ZW5jeSA+IDApOworICAgICAgICBib29sIHNob3VsZFdhaXQgPQorICAgICAgICAgICAgKGZvbGxvd3NTYW1lUm91dGluZyhjbGllbnRBdHRyLCBhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX0FMQVJNKSkgfHwKKyAgICAgICAgICAgICBmb2xsb3dzU2FtZVJvdXRpbmcoY2xpZW50QXR0ciwgYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9OT1RJRklDQVRJT04pKSB8fAorICAgICAgICAgICAgIChiZWFjb25NdXRlTGF0ZW5jeSA+IDApKTsKICAgICAgICAgdWludDMyX3Qgd2FpdE1zID0gYmVhY29uTXV0ZUxhdGVuY3k7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CiAgICAgICAgICAgICBpZiAoZGVzYyAhPSBvdXRwdXREZXNjKSB7CiAgICAgICAgICAgICAgICAgLy8gQW4gb3V0cHV0IGhhcyBhIHNoYXJlZCBkZXZpY2UgaWYKICAgICAgICAgICAgICAgICAvLyAtIG1hbmFnZWQgYnkgdGhlIHNhbWUgaHcgbW9kdWxlCiAgICAgICAgICAgICAgICAgLy8gLSBzdXBwb3J0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGRldmljZQogICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgc2hhcmVkRGV2aWNlID0gb3V0cHV0RGVzYy0+c2hhcmVzSHdNb2R1bGVXaXRoKGRlc2MpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpICYgZGV2aWNlKSAhPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICghZGVzYy0+ZmlsdGVyU3VwcG9ydGVkRGV2aWNlcyhkZXZpY2VzKS5pc0VtcHR5KCkpOwogCiAgICAgICAgICAgICAgICAgLy8gZm9yY2UgYSBkZXZpY2UgY2hhbmdlIGlmIGFueSBvdGhlciBvdXRwdXQgaXM6CiAgICAgICAgICAgICAgICAgLy8gLSBtYW5hZ2VkIGJ5IHRoZSBzYW1lIGh3IG1vZHVsZQpAQCAtMTI3Niw3ICsxNjY4LDcgQEAKICAgICAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZSBhdWRpbyBIQUwgbXVzdCByZWNlaXZlIHRoZSBuZXcgZGV2aWNlIHNlbGVjdGlvbiBzbyB0aGF0IGl0IGNhbgogICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgZGV2aWNlIGN1cnJlbnRseSBzZWxlY3RlZCBieSB0aGUgb3RoZXIgb3V0cHV0LgogICAgICAgICAgICAgICAgIGlmIChzaGFyZWREZXZpY2UgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmRldmljZSgpICE9IGRldmljZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+ZGV2aWNlcygpICE9IGRldmljZXMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmdldFBhdGNoSGFuZGxlKCkgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKICAgICAgICAgICAgICAgICAgICAgZm9yY2UgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KQEAgLTEyOTksMjUgKzE2OTEsMjEgQEAKICAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IHVpbnQzMl90IG11dGVXYWl0TXMgPQotICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBkZXZpY2UsIGZvcmNlLCAwLCBOVUxMLCBhZGRyZXNzLCByZXF1aXJlc011dGVDaGVjayk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBmb3Igc29uaWZpY2F0aW9uIHdoaWxlIGluIGNhbGwKLSAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihzdHJlYW0sIHRydWUsIGZhbHNlKTsKLSAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYywgZGV2aWNlcywgZm9yY2UsIDAsIE5VTEwsIHJlcXVpcmVzTXV0ZUNoZWNrKTsKIAogICAgICAgICAvLyBhcHBseSB2b2x1bWUgcnVsZXMgZm9yIGN1cnJlbnQgc3RyZWFtIGFuZCBkZXZpY2UgaWYgbmVjZXNzYXJ5Ci0gICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXgoc3RyZWFtLCBvdXRwdXREZXNjLT5kZXZpY2UoKSksCisgICAgICAgIGF1dG8gJmN1cnZlcyA9IGdldFZvbHVtZUN1cnZlcyhjbGllbnQtPmF0dHJpYnV0ZXMoKSk7CisgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKGN1cnZlcywgY2xpZW50LT52b2x1bWVTb3VyY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVzLmdldFZvbHVtZUluZGV4KG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKSk7CiAKICAgICAgICAgLy8gdXBkYXRlIHRoZSBvdXRwdXRzIGlmIHN0YXJ0aW5nIGFuIG91dHB1dCB3aXRoIGEgc3RyZWFtIHRoYXQgY2FuIGFmZmVjdCBub3RpZmljYXRpb24KICAgICAgICAgLy8gcm91dGluZwogICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKHN0cmVhbSk7CiAKICAgICAgICAgLy8gZm9yY2UgcmVldmFsdWF0aW5nIGFjY2Vzc2liaWxpdHkgcm91dGluZyB3aGVuIHJpbmd0b25lIG9yIGFsYXJtIHN0YXJ0cwotICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB7CisgICAgICAgIGlmIChmb2xsb3dzU2FtZVJvdXRpbmcoY2xpZW50QXR0ciwgYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9BTEFSTSkpKSB7CiAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSk7CiAgICAgICAgIH0KIApAQCAtMTMzNiw1NiArMTcyNCwzOCBAQAogCiAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSAmJgogICAgICAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKLSAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX1NPTklGSUNBVElPTiwgdHJ1ZSwgb3V0cHV0RGVzYyk7CisgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzdHJlYW1Ub1N0cmF0ZWd5KEFVRElPX1NUUkVBTV9BTEFSTSksIHRydWUsIG91dHB1dERlc2MpOwogICAgIH0KIAotICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUgJiYKLSAgICAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSB7Ci0gICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9TT05JRklDQVRJT04sIHRydWUsIG91dHB1dERlc2MpOworICAgIC8vIEF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0YXJ0ZWQgb24gYSByZSByb3V0aW5nIG1peAorICAgIC8vIG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCisgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGRldmljZXMudHlwZXMoKSkgJiYgcG9saWN5TWl4ICE9IE5VTEwgJiYKKyAgICAgICAgcG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKKyAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbW90ZS1zdWJtaXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgIH0KIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgQUxPR1YoInN0b3BPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInN0b3BPdXRwdXQoKSB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgQUxPR1YoIiVzIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMuZ2V0T3V0cHV0Rm9yQ2xpZW50KHBvcnRJZCk7CisgICAgaWYgKG91dHB1dERlc2MgPT0gMCkgeworICAgICAgICBBTE9HVygic3RvcE91dHB1dCgpIG5vIG91dHB1dCBmb3IgY2xpZW50ICVkIiwgcG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiBjbGllbnQgPSBvdXRwdXREZXNjLT5nZXRDbGllbnQocG9ydElkKTsKIAotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7CisgICAgQUxPR1YoInN0b3BPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsCisgICAgICAgICAgb3V0cHV0RGVzYy0+bUlvSGFuZGxlLCBjbGllbnQtPnN0cmVhbSgpLCBjbGllbnQtPnNlc3Npb24oKSk7CiAKLSAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPT0gMSkgewotICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IGRpc2FibGUgdGhlIHJlbW90ZSBzdWJtaXggaW5wdXQgd2hlbiBvdXRwdXQgaXMgc3RvcHBlZCBvbiBhCi0gICAgICAgIC8vIHJlIHJvdXRpbmcgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCi0gICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShvdXRwdXREZXNjLT5tRGV2aWNlKSAmJgotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCAmJgotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgewotICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgInJlbW90ZS1zdWJtaXgiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFJvdXRpbmc/Ci0gICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSA9IGZhbHNlOwotICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA+IDApIHsKLSAgICAgICAgaW50IGFjdGl2aXR5Q291bnQgPSBtT3V0cHV0Um91dGVzLmRlY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7Ci0gICAgICAgIGZvcmNlRGV2aWNlVXBkYXRlID0gKG1PdXRwdXRSb3V0ZXMuaGFzUm91dGUoc2Vzc2lvbikgJiYgKGFjdGl2aXR5Q291bnQgPT0gMCkpOwotCi0gICAgICAgIGlmIChmb3JjZURldmljZVVwZGF0ZSkgewotICAgICAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKGdldFN0cmF0ZWd5KHN0cmVhbSksIEFVRElPX0lPX0hBTkRMRV9OT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BTb3VyY2Uob3V0cHV0RGVzYywgc3RyZWFtLCBmb3JjZURldmljZVVwZGF0ZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcFNvdXJjZShvdXRwdXREZXNjLCBjbGllbnQpOwogCiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiApIHsKICAgICAgICAgb3V0cHV0RGVzYy0+c3RvcCgpOwpAQCAtMTM5Myw1MiArMTc2Myw2NiBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcFNvdXJjZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSkKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcFNvdXJjZShjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50KQogewogICAgIC8vIGFsd2F5cyBoYW5kbGUgc3RyZWFtIHN0b3AsIGNoZWNrIHdoaWNoIHN0cmVhbSB0eXBlIGlzIHN0b3BwaW5nCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBjbGllbnQtPnN0cmVhbSgpOworICAgIGF1dG8gY2xpZW50Vm9sU3JjID0gY2xpZW50LT52b2x1bWVTb3VyY2UoKTsKKwogICAgIGhhbmRsZUV2ZW50Rm9yQmVhY29uKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVFRTID8gU1RPUFBJTkdfQkVBQ09OIDogU1RPUFBJTkdfT1VUUFVUKTsKIAotICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIHNvbmlmaWNhdGlvbiB3aGlsZSBpbiBjYWxsCi0gICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKHN0cmVhbSwgZmFsc2UsIGZhbHNlKTsKLSAgICB9CisgICAgaWYgKG91dHB1dERlc2MtPmdldEFjdGl2aXR5Q291bnQoY2xpZW50Vm9sU3JjKSA+IDApIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmdldEFjdGl2aXR5Q291bnQoY2xpZW50Vm9sU3JjKSA9PSAxKSB7CisgICAgICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IGRpc2FibGUgdGhlIHJlbW90ZSBzdWJtaXggaW5wdXQgd2hlbiBvdXRwdXQgaXMgc3RvcHBlZCBvbiBhCisgICAgICAgICAgICAvLyByZSByb3V0aW5nIG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUworICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peCA9IG91dHB1dERlc2MtPm1Qb2xpY3lNaXgucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpKSAmJgorICAgICAgICAgICAgICAgIHBvbGljeU1peCAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgcG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKKyAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdGUtc3VibWl4IiwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJvb2wgZm9yY2VEZXZpY2VVcGRhdGUgPSBmYWxzZTsKKyAgICAgICAgaWYgKGNsaWVudC0+aGFzUHJlZmVycmVkRGV2aWNlKHRydWUpKSB7CisgICAgICAgICAgICBjaGVja1N0cmF0ZWd5Um91dGUoY2xpZW50LT5zdHJhdGVneSgpLCBBVURJT19JT19IQU5ETEVfTk9ORSk7CisgICAgICAgICAgICBmb3JjZURldmljZVVwZGF0ZSA9IHRydWU7CisgICAgICAgIH0KIAotICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA+IDApIHsKICAgICAgICAgLy8gZGVjcmVtZW50IHVzYWdlIGNvdW50IG9mIHRoaXMgc3RyZWFtIG9uIHRoZSBvdXRwdXQKLSAgICAgICAgb3V0cHV0RGVzYy0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCAtMSk7CisgICAgICAgIG91dHB1dERlc2MtPnNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKTsKIAogICAgICAgICAvLyBzdG9yZSB0aW1lIGF0IHdoaWNoIHRoZSBzdHJlYW0gd2FzIHN0b3BwZWQgLSBzZWUgaXNTdHJlYW1BY3RpdmUoKQotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPT0gMCB8fCBmb3JjZURldmljZVVwZGF0ZSkgewotICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVN0b3BUaW1lW3N0cmVhbV0gPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBpZiAob3V0cHV0RGVzYy0+Z2V0QWN0aXZpdHlDb3VudChjbGllbnRWb2xTcmMpID09IDAgfHwgZm9yY2VEZXZpY2VVcGRhdGUpIHsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPnNldFN0b3BUaW1lKGNsaWVudCwgc3lzdGVtVGltZSgpKTsKKyAgICAgICAgICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKICAgICAgICAgICAgIC8vIGRlbGF5IHRoZSBkZXZpY2Ugc3dpdGNoIGJ5IHR3aWNlIHRoZSBsYXRlbmN5IGJlY2F1c2Ugc3RvcE91dHB1dCgpIGlzIGV4ZWN1dGVkIHdoZW4KICAgICAgICAgICAgIC8vIHRoZSB0cmFjayBzdG9wKCkgY29tbWFuZCBpcyByZWNlaXZlZCBhbmQgYXQgdGhhdCB0aW1lIHRoZSBhdWRpbyB0cmFjayBidWZmZXIgY2FuCiAgICAgICAgICAgICAvLyBzdGlsbCBjb250YWluIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBkcmFpbmVkLiBUaGUgbGF0ZW5jeSBvbmx5IGNvdmVycyB0aGUgYXVkaW8gSEFMCiAgICAgICAgICAgICAvLyBhbmQga2VybmVsIGJ1ZmZlcnMuIEFsc28gdGhlIGxhdGVuY3kgZG9lcyBub3QgYWx3YXlzIGluY2x1ZGUgYWRkaXRpb25hbCBkZWxheSBpbiB0aGUKICAgICAgICAgICAgIC8vIGF1ZGlvIHBhdGggKGF1ZGlvIERTUCwgQ09ERUMgLi4uKQotICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIG5ld0RldmljZSwgZmFsc2UsIG91dHB1dERlc2MtPmxhdGVuY3koKSoyKTsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYywgbmV3RGV2aWNlcywgZmFsc2UsIG91dHB1dERlc2MtPmxhdGVuY3koKSoyKTsKIAogICAgICAgICAgICAgLy8gZm9yY2UgcmVzdG9yaW5nIHRoZSBkZXZpY2Ugc2VsZWN0aW9uIG9uIG90aGVyIGFjdGl2ZSBvdXRwdXRzIGlmIGl0IGRpZmZlcnMgZnJvbSB0aGUKICAgICAgICAgICAgIC8vIG9uZSBiZWluZyBzZWxlY3RlZCBmb3IgdGhpcyBvdXRwdXQKICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMgPSBvdXRwdXREZXNjLT5sYXRlbmN5KCkqMjsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgICAgICAgICBpZiAoZGVzYyAhPSBvdXRwdXREZXNjICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5pc0FjdGl2ZSgpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5zaGFyZXNId01vZHVsZVdpdGgoZGVzYykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChuZXdEZXZpY2UgIT0gZGVzYy0+ZGV2aWNlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UyID0gZ2V0TmV3T3V0cHV0RGV2aWNlKGRlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZGVzYy0+ZGV2aWNlKCkgIT0gbmV3RGV2aWNlMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIChuZXdEZXZpY2VzICE9IGRlc2MtPmRldmljZXMoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMyID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhkZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IGRlc2MtPmRldmljZXMoKSAhPSBuZXdEZXZpY2VzMjsKIAotICAgICAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UoZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RldmljZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOworICAgICAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKGRlc2MsIG5ld0RldmljZXMyLCBmb3JjZSwgZGVsYXlNcyk7CisKICAgICAgICAgICAgICAgICAgICAgLy8gcmUtYXBwbHkgZGV2aWNlIHNwZWNpZmljIHZvbHVtZSBpZiBub3QgZG9uZSBieSBzZXRPdXRwdXREZXZpY2UoKQogICAgICAgICAgICAgICAgICAgICBpZiAoIWZvcmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMoZGVzYywgbmV3RGV2aWNlMiwgZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMoZGVzYywgbmV3RGV2aWNlczIudHlwZXMoKSwgZGVsYXlNcyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xNDQ4LDEwICsxODMyLDEwIEBACiAKICAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSAmJgogICAgICAgICAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSB7Ci0gICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmYWxzZSwgb3V0cHV0RGVzYyk7CisgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyZWFtVG9TdHJhdGVneShBVURJT19TVFJFQU1fUklORyksIGZhbHNlLCBvdXRwdXREZXNjKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDKSB7CisgICAgICAgIGlmIChmb2xsb3dzU2FtZVJvdXRpbmcoY2xpZW50LT5hdHRyaWJ1dGVzKCksIGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTUVESUEpKSkgewogICAgICAgICAgICAgc2VsZWN0T3V0cHV0Rm9yTXVzaWNFZmZlY3RzKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtMTQ2MSwzNSArMTg0NSw0MSBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiBfX3VudXNlZCkKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0KCkgJWQiLCBvdXRwdXQpOwotICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygicmVsZWFzZU91dHB1dCgpIHJlbGVhc2luZyB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgQUxPR1YoIiVzIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMuZ2V0T3V0cHV0Rm9yQ2xpZW50KHBvcnRJZCk7CisgICAgaWYgKG91dHB1dERlc2MgPT0gMCkgeworICAgICAgICAvLyBJZiBhbiBvdXRwdXQgZGVzY3JpcHRvciBpcyBjbG9zZWQgZHVlIHRvIGEgZGV2aWNlIHJvdXRpbmcgY2hhbmdlLAorICAgICAgICAvLyB0aGVuIHRoZXJlIGFyZSByYWNlIGNvbmRpdGlvbnMgd2l0aCByZWxlYXNlT3V0cHV0IGZyb20gdHJhY2tzCisgICAgICAgIC8vIHRoYXQgbWF5IGJlIGRlc3Ryb3llZCAod2l0aCBubyBQbGF5YmFja1RocmVhZCkgb3IgYSBQbGF5YmFja1RocmVhZAorICAgICAgICAvLyBkZXN0cm95ZWQgc2hvcnRseSB0aGVyZWFmdGVyLgorICAgICAgICAvLworICAgICAgICAvLyBIZXJlIHdlIGp1c3QgbG9nIGEgd2FybmluZywgaW5zdGVhZCBvZiBhIGZhdGFsIGVycm9yLgorICAgICAgICBBTE9HVygicmVsZWFzZU91dHB1dCgpIG5vIG91dHB1dCBmb3IgY2xpZW50ICVkIiwgcG9ydElkKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIFJvdXRpbmcKLSAgICBtT3V0cHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOworICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0KCkgJWQiLCBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwogCi0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKLSAgICBpZiAoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7Ci0gICAgICAgIGlmIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50IDw9IDApIHsKKyAgICBpZiAob3V0cHV0RGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50IDw9IDApIHsKICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlT3V0cHV0KCkgaW52YWxpZCBvcGVuIGNvdW50ICVkIGZvciBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRGlyZWN0T3BlbkNvdW50LCBvdXRwdXQpOworICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCwgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBpZiAoLS1kZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApIHsKLSAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgIGlmICgtLW91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQgPT0gMCkgeworICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgfQogICAgIH0KKyAgICAvLyBzdG9wT3V0cHV0KCkgbmVlZHMgdG8gYmUgc3VjY2Vzc2Z1bGx5IGNhbGxlZCBiZWZvcmUgcmVsZWFzZU91dHB1dCgpCisgICAgLy8gb3RoZXJ3aXNlIHRoZXJlIG1heSBiZSBpbmFjY3VyYXRlIHN0cmVhbSByZWZlcmVuY2UgY291bnRzLgorICAgIC8vIFRoaXMgaXMgY2hlY2tlZCBpbiBvdXRwdXREZXNjLT5yZW1vdmVDbGllbnQgYmVsb3cuCisgICAgb3V0cHV0RGVzYy0+cmVtb3ZlQ2xpZW50KHBvcnRJZCk7CiB9CiAKLQogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCkBAIC0xNTAwLDI4ICsxODkwLDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF90eXBlX3QgKmlucHV0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKIHsKLSAgICBBTE9HVigiZ2V0SW5wdXRGb3JBdHRyKCkgc291cmNlICVkLCBzYW1wbGluZyByYXRlICVkLCBmb3JtYXQgJSN4LCBjaGFubmVsIG1hc2sgJSN4LCIKLSAgICAgICAgICAgICJzZXNzaW9uICVkLCBmbGFncyAlI3giLAotICAgICAgICAgIGF0dHItPnNvdXJjZSwgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBzZXNzaW9uLCBmbGFncyk7CisgICAgQUxPR1YoIiVzKCkgc291cmNlICVkLCBzYW1wbGluZyByYXRlICVkLCBmb3JtYXQgJSN4LCBjaGFubmVsIG1hc2sgJSN4LCBzZXNzaW9uICVkLCAiCisgICAgICAgICAgImZsYWdzICUjeCBhdHRyaWJ1dGVzPSVzIiwgX19mdW5jX18sIGF0dHItPnNvdXJjZSwgY29uZmlnLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssIHNlc3Npb24sIGZsYWdzLCB0b1N0cmluZygqYXR0cikuY19zdHIoKSk7CiAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICAvLyBoYW5kbGUgbGVnYWN5IHJlbW90ZSBzdWJtaXggY2FzZSB3aGVyZSB0aGUgYWRkcmVzcyB3YXMgbm90IGFsd2F5cyBzcGVjaWZpZWQKLSAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKICAgICBhdWRpb19zb3VyY2VfdCBoYWxJbnB1dFNvdXJjZTsKLSAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSA9IGF0dHItPnNvdXJjZTsKLSAgICBBdWRpb01peCAqcG9saWN5TWl4ID0gTlVMTDsKLSAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzOworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gKmF0dHI7CisgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peDsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2U7CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYzsKKyAgICBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiBjbGllbnREZXNjOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcmVxdWVzdGVkRGV2aWNlSWQgPSAqc2VsZWN0ZWREZXZpY2VJZDsKKyAgICBib29sIGlzU291bmRUcmlnZ2VyOwogCi0gICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUKSB7Ci0gICAgICAgIGlucHV0U291cmNlID0gQVVESU9fU09VUkNFX01JQzsKKyAgICAvLyBUaGUgc3VwcGxpZWQgcG9ydElkIG11c3QgYmUgQVVESU9fUE9SVF9IQU5ETEVfTk9ORQorICAgIGlmICgqcG9ydElkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChhdHRyLT5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQpIHsKKyAgICAgICAgYXR0cmlidXRlcy5zb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOwogICAgIH0KIAogICAgIC8vIEV4cGxpY2l0IHJvdXRpbmc/Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYzsKLSAgICBpZiAoKnNlbGVjdGVkRGV2aWNlSWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewotICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoKnNlbGVjdGVkRGV2aWNlSWQpOwotICAgIH0KLSAgICBtSW5wdXRSb3V0ZXMuYWRkUm91dGUoc2Vzc2lvbiwgU2Vzc2lvblJvdXRlOjpTVFJFQU1fVFlQRV9OQSwgaW5wdXRTb3VyY2UsIGRldmljZURlc2MsIHVpZCk7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZXhwbGljaXRSb3V0aW5nRGV2aWNlID0gCisgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZCgqc2VsZWN0ZWREZXZpY2VJZCk7CiAKICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIG1tYXAgY2FwdHVyZTogaWYgYW4gaW5wdXQgSU8gaGFuZGxlIGlzIHNwZWNpZmllZCwgd2UgcmV1c2UgdGhpcyBpbnB1dCBpZgogICAgIC8vIHBvc3NpYmxlCkBAIC0xNTM0LDggKzE5MjgsOCBAQAogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgc3A8QXVkaW9TZXNzaW9uPiBhdWRpb1Nlc3Npb24gPSBpbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbihzZXNzaW9uKTsKLSAgICAgICAgaWYgKGF1ZGlvU2Vzc2lvbiA9PSAwKSB7CisgICAgICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzID0gaW5wdXREZXNjLT5nZXRDbGllbnRzRm9yU2Vzc2lvbihzZXNzaW9uKTsKKyAgICAgICAgaWYgKGNsaWVudHMuc2l6ZSgpID09IDApIHsKICAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCAqaW5wdXQpOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBlcnJvcjsKQEAgLTE1NDQsNzUgKzE5MzgsNzEgQEAKICAgICAgICAgLy8gVGhlIHNlY29uZCBjYWxsIGlzIGZvciB0aGUgZmlyc3QgYWN0aXZlIGNsaWVudCBhbmQgc2V0cyB0aGUgVUlELiBBbnkgZnVydGhlciBjYWxsCiAgICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGEgbmV3IGNsaWVudCBhbmQgaXMgb25seSBwZXJtaXR0ZWQgZnJvbSB0aGUgc2FtZSBVSUQuCiAgICAgICAgIC8vIElmIHRoZSBmaXJzdCBVSUQgaXMgc2lsZW5jZWQsIGFsbG93IGEgbmV3IFVJRCBjb25uZWN0aW9uIGFuZCByZXBsYWNlIHdpdGggbmV3IFVJRAotICAgICAgICBpZiAoYXVkaW9TZXNzaW9uLT5vcGVuQ291bnQoKSA9PSAxKSB7Ci0gICAgICAgICAgICBhdWRpb1Nlc3Npb24tPnNldFVpZCh1aWQpOwotICAgICAgICB9IGVsc2UgaWYgKGF1ZGlvU2Vzc2lvbi0+dWlkKCkgIT0gdWlkKSB7Ci0gICAgICAgICAgICBpZiAoIWF1ZGlvU2Vzc2lvbi0+aXNTaWxlbmNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGJhZCB1aWQgJWQgZm9yIHNlc3Npb24gJWQgdWlkICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICB1aWQsIHNlc3Npb24sIGF1ZGlvU2Vzc2lvbi0+dWlkKCkpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGlmIChjbGllbnRzLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogY2xpZW50cykgeworICAgICAgICAgICAgICAgIC8vIFRoZSBjbGllbnQgbWFwIGlzIG9yZGVyZWQgYnkga2V5IHZhbHVlcyAocG9ydElkKSBhbmQgcG9ydElkcyBhcmUgYWxsb2NhdGVkCisgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50YWx5LiBTbyB0aGUgZmlyc3QgY2xpZW50IGluIHRoaXMgbGlzdCBpcyB0aGUgb25lIG9wZW5lZCBieSBhdWRpbyBmbGluZ2VyCisgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgbW1hcCBzdHJlYW0gaXMgY3JlYXRlZCBhbmQgc2hvdWxkIGJlIGlnbm9yZWQgYXMgaXQgZG9lcyBub3QgY29ycmVzcG9uZAorICAgICAgICAgICAgICAgIC8vIHRvIGFuIGFjdHVhbCBjbGllbnQKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50ID09ICpjbGllbnRzLmNiZWdpbigpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodWlkICE9IGNsaWVudC0+dWlkKCkgJiYgIWNsaWVudC0+aXNTaWxlbmNlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSBiYWQgdWlkICVkIGZvciBjbGllbnQgJWQgdWlkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLCBjbGllbnQtPnBvcnRJZCgpLCBjbGllbnQtPnVpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5zZXRVaWQodWlkKTsKLSAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbi0+c2V0U2lsZW5jZWQoZmFsc2UpOwogICAgICAgICB9Ci0gICAgICAgIGF1ZGlvU2Vzc2lvbi0+Y2hhbmdlT3BlbkNvdW50KDEpOwogICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0xFR0FDWTsKLSAgICAgICAgaWYgKCpwb3J0SWQgPT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoaW5wdXREZXNjLT5tRGV2aWNlKTsKLSAgICAgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBpbnB1dERldmljZXMuc2l6ZSgpID4gMCA/IGlucHV0RGV2aWNlcy5pdGVtQXQoMCktPmdldElkKCkKLSAgICAgICAgICAgICAgICA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7Ci0gICAgICAgIEFMT0dJKCIlcyByZXVzaW5nIE1NQVAgaW5wdXQgJWQgZm9yIHNlc3Npb24gJWQiLCBfX0ZVTkNUSU9OX18sICppbnB1dCwgc2Vzc2lvbik7CisgICAgICAgIGRldmljZSA9IGlucHV0RGVzYy0+Z2V0RGV2aWNlKCk7CiAKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICBBTE9HSSgiJXMgcmV1c2luZyBNTUFQIGlucHV0ICVkIGZvciBzZXNzaW9uICVkIiwgX19GVU5DVElPTl9fLCAqaW5wdXQsIHNlc3Npb24pOworICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogCiAgICAgKmlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9JTlZBTElEOwogCi0gICAgaGFsSW5wdXRTb3VyY2UgPSBpbnB1dFNvdXJjZTsKKyAgICBoYWxJbnB1dFNvdXJjZSA9IGF0dHJpYnV0ZXMuc291cmNlOwogCi0gICAgLy8gVE9ETzogY2hlY2sgZm9yIGV4aXN0aW5nIGNsaWVudCBmb3IgdGhpcyBwb3J0IElECi0gICAgaWYgKCpwb3J0SWQgPT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewotICAgICAgICAqcG9ydElkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKLSAgICB9Ci0KLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlOwotCi0gICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYICYmCi0gICAgICAgICAgICBzdHJuY21wKGF0dHItPnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCkgewotICAgICAgICBzdGF0dXMgPSBtUG9saWN5TWl4ZXMuZ2V0SW5wdXRNaXhGb3JBdHRyKCphdHRyLCAmcG9saWN5TWl4KTsKKyAgICBpZiAoYXR0cmlidXRlcy5zb3VyY2UgPT0gQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVggJiYKKyAgICAgICAgICAgIHN0cm5jbXAoYXR0cmlidXRlcy50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gbVBvbGljeU1peGVzLmdldElucHV0TWl4Rm9yQXR0cihhdHRyaWJ1dGVzLCAmcG9saWN5TWl4KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQotICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX01JWF9FWFRfUE9MSUNZX1JFUk9VVEU7Ci0gICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYOwotICAgICAgICBhZGRyZXNzID0gU3RyaW5nOChhdHRyLT50YWdzICsgc3RybGVuKCJhZGRyPSIpKTsKKyAgICAgICAgaWYgKGlzX21peF9sb29wYmFja19yZW5kZXIocG9saWN5TWl4LT5tUm91dGVGbGFncykpIHsKKyAgICAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTUlYX1BVQkxJQ19DQVBUVVJFX1BMQVlCQUNLOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9NSVhfRVhUX1BPTElDWV9SRVJPVVRFOworICAgICAgICB9CisgICAgICAgIGRldmljZSA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlKEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGF0dHItPnRhZ3MgKyBzdHJsZW4oImFkZHI9IikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UsICZwb2xpY3lNaXgpOwotICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgY291bGQgbm90IGZpbmQgZGV2aWNlIGZvciBzb3VyY2UgJWQiLCBpbnB1dFNvdXJjZSk7CisgICAgICAgIGlmIChleHBsaWNpdFJvdXRpbmdEZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZGV2aWNlID0gZXhwbGljaXRSb3V0aW5nRGV2aWNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUHJldmVudCBmcm9tIHN0b3JpbmcgaW52YWxpZCByZXF1ZXN0ZWQgZGV2aWNlIGlkIGluIGNsaWVudHMKKyAgICAgICAgICAgIHJlcXVlc3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIGRldmljZSA9IG1FbmdpbmUtPmdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCAmcG9saWN5TWl4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSBjb3VsZCBub3QgZmluZCBkZXZpY2UgZm9yIHNvdXJjZSAlZCIsIGF0dHJpYnV0ZXMuc291cmNlKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBvbGljeU1peCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBhZGRyZXNzID0gcG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzczsKLSAgICAgICAgICAgIGlmIChwb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgewotICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGFuIGV4dGVybmFsIHBvbGljeSwgYnV0IHRoaXMgaW5wdXQgaXMgYXR0YWNoZWQgdG8gYSBtaXggb2YgcmVjb3JkZXJzLAotICAgICAgICAgICAgICAgIC8vIG1lYW5pbmcgaXQgcmVjZWl2ZXMgYXVkaW8gaW5qZWN0ZWQgaW50byB0aGUgZnJhbWV3b3JrLCBzbyB0aGUgcmVjb3JkZXIgZG9lc24ndAotICAgICAgICAgICAgICAgIC8vIGtub3cgYWJvdXQgaXQgYW5kIGlzIHRoZXJlZm9yZSBjb25zaWRlcmVkICJsZWdhY3kiCi0gICAgICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9MRUdBQ1k7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHJlY29yZGluZyBhIG1peCBvZiBwbGF5ZXJzIGRlZmluZWQgYnkgYW4gZXh0ZXJuYWwgcG9saWN5LCB3ZSdyZSByZXJvdXRpbmcgZm9yCi0gICAgICAgICAgICAgICAgLy8gYW4gZXh0ZXJuYWwgcG9saWN5Ci0gICAgICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9NSVhfRVhUX1BPTElDWV9SRVJPVVRFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CisgICAgICAgIGlmIChwb2xpY3lNaXgpIHsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTLCAiSW52YWxpZCBNaXggVHlwZSIpOworICAgICAgICAgICAgLy8gdGhlcmUgaXMgYW4gZXh0ZXJuYWwgcG9saWN5LCBidXQgdGhpcyBpbnB1dCBpcyBhdHRhY2hlZCB0byBhIG1peCBvZiByZWNvcmRlcnMsCisgICAgICAgICAgICAvLyBtZWFuaW5nIGl0IHJlY2VpdmVzIGF1ZGlvIGluamVjdGVkIGludG8gdGhlIGZyYW1ld29yaywgc28gdGhlIHJlY29yZGVyIGRvZXNuJ3QKKyAgICAgICAgICAgIC8vIGtub3cgYWJvdXQgaXQgYW5kIGlzIHRoZXJlZm9yZSBjb25zaWRlcmVkICJsZWdhY3kiCisgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0xFR0FDWTsKKyAgICAgICAgfSBlbHNlIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShkZXZpY2UtPnR5cGUoKSkpIHsKICAgICAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTUlYX0NBUFRVUkU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgpIHsKKyAgICAgICAgfSBlbHNlIGlmIChkZXZpY2UtPnR5cGUoKSA9PSBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKSB7CiAgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX1RFTEVQSE9OWV9SWDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTEVHQUNZOwpAQCAtMTYyMCw0MyArMjAxMCw0OSBAQAogCiAgICAgfQogCi0gICAgKmlucHV0ID0gZ2V0SW5wdXRGb3JEZXZpY2UoZGV2aWNlLCBhZGRyZXNzLCBzZXNzaW9uLCB1aWQsIGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4KTsKKyAgICAqaW5wdXQgPSBnZXRJbnB1dEZvckRldmljZShkZXZpY2UsIHNlc3Npb24sIGF0dHJpYnV0ZXMsIGNvbmZpZywgZmxhZ3MsIHBvbGljeU1peCk7CiAgICAgaWYgKCppbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKLSAgICBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICpzZWxlY3RlZERldmljZUlkID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5nZXRJZCgpCi0gICAgICAgICAgICA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CitleGl0OgogCi0gICAgQUxPR1YoImdldElucHV0Rm9yQXR0cigpIHJldHVybnMgaW5wdXQgJWQgdHlwZSAlZCBzZWxlY3RlZERldmljZUlkICVkIiwKLSAgICAgICAgICAgICppbnB1dCwgKmlucHV0VHlwZSwgKnNlbGVjdGVkRGV2aWNlSWQpOworICAgICpzZWxlY3RlZERldmljZUlkID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5jb250YWlucyhkZXZpY2UpID8KKyAgICAgICAgICAgICAgICBkZXZpY2UtPmdldElkKCkgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworCisgICAgaXNTb3VuZFRyaWdnZXIgPSBhdHRyaWJ1dGVzLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCAmJgorICAgICAgICBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uKSA+IDA7CisgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisKKyAgICBjbGllbnREZXNjID0gbmV3IFJlY29yZENsaWVudERlc2NyaXB0b3IoKnBvcnRJZCwgdWlkLCBzZXNzaW9uLCAqYXR0ciwgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkRGV2aWNlSWQsIGF0dHJpYnV0ZXMuc291cmNlLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTb3VuZFRyaWdnZXIpOworICAgIGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoKmlucHV0KTsKKyAgICBpbnB1dERlc2MtPmFkZENsaWVudChjbGllbnREZXNjKTsKKworICAgIEFMT0dWKCJnZXRJbnB1dEZvckF0dHIoKSByZXR1cm5zIGlucHV0ICVkIHR5cGUgJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCBmb3IgcG9ydCBJRCAlZCIsCisgICAgICAgICAgICAqaW5wdXQsICppbnB1dFR5cGUsICpzZWxlY3RlZERldmljZUlkLCAqcG9ydElkKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIAogZXJyb3I6Ci0gICAgbUlucHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dEZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MsCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0Rm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXggKnBvbGljeU1peCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Qb2xpY3lNaXg+ICZwb2xpY3lNaXgpCiB7CiAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICBhdWRpb19zb3VyY2VfdCBoYWxJbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOworICAgIGF1ZGlvX3NvdXJjZV90IGhhbElucHV0U291cmNlID0gYXR0cmlidXRlcy5zb3VyY2U7CiAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlciA9IGZhbHNlOwogCi0gICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CisgICAgaWYgKGF0dHJpYnV0ZXMuc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CiAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uKTsKICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgIGlucHV0ID0gbVNvdW5kVHJpZ2dlclNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb24pOwpAQCAtMTY2Niw3ICsyMDYyLDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGhhbElucHV0U291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiAmJgorICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlcy5zb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04gJiYKICAgICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpKSB7CiAgICAgICAgIGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fSU5QVVRfRkxBR19WT0lQX1RYKTsKICAgICB9CkBAIC0xNjgxLDggKzIwNzcsNyBAQAogICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgcHJvZmlsZUZsYWdzID0gZmxhZ3M7CiAgICAgZm9yICg7OykgewogICAgICAgICBwcm9maWxlRm9ybWF0ID0gY29uZmlnLT5mb3JtYXQ7IC8vIHJlc2V0IGVhY2ggdGltZSB0aHJvdWdoIGxvb3AsIGluIGNhc2UgaXQgaXMgdXBkYXRlZAotICAgICAgICBwcm9maWxlID0gZ2V0SW5wdXRQcm9maWxlKGRldmljZSwgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlU2FtcGxpbmdSYXRlLCBwcm9maWxlRm9ybWF0LCBwcm9maWxlQ2hhbm5lbE1hc2ssCisgICAgICAgIHByb2ZpbGUgPSBnZXRJbnB1dFByb2ZpbGUoZGV2aWNlLCBwcm9maWxlU2FtcGxpbmdSYXRlLCBwcm9maWxlRm9ybWF0LCBwcm9maWxlQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZUZsYWdzKTsKICAgICAgICAgaWYgKHByb2ZpbGUgIT0gMCkgewogICAgICAgICAgICAgYnJlYWs7IC8vIHN1Y2Nlc3MKQEAgLTE2OTEsOSArMjA4Niw5IEBACiAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZUZsYWdzICE9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSkgewogICAgICAgICAgICAgcHJvZmlsZUZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FOyAvLyByZXRyeQogICAgICAgICB9IGVsc2UgeyAvLyBmYWlsCi0gICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JEZXZpY2UoKSBjb3VsZCBub3QgZmluZCBwcm9maWxlIGZvciBkZXZpY2UgMHglWCwgIgotICAgICAgICAgICAgICAgICAgInNhbXBsaW5nIHJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWwgbWFzayAweCVYLCBmbGFncyAlI3giLAotICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgZmxhZ3MpOworICAgICAgICAgICAgQUxPR1coIiVzIGNvdWxkIG5vdCBmaW5kIHByb2ZpbGUgZm9yIGRldmljZSAlcywgc2FtcGxpbmcgcmF0ZSAldSwgZm9ybWF0ICUjeCwgIgorICAgICAgICAgICAgICAgICAgImNoYW5uZWwgbWFzayAweCVYLCBmbGFncyAlI3giLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIAorICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBmbGFncyk7CiAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNzA4LDg2ICsyMTAzLDQxIEBACiAgICAgICAgIHJldHVybiBpbnB1dDsKICAgICB9CiAKLSAgICBzcDxBdWRpb1Nlc3Npb24+IGF1ZGlvU2Vzc2lvbiA9IG5ldyBBdWRpb1Nlc3Npb24oc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NvdW5kVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4LCBtcENsaWVudEludGVyZmFjZSk7Ci0KLS8vIEZJWE1FOiBkaXNhYmxlIGNvbmN1cnJlbnQgY2FwdHVyZSB1bnRpbCBVSSBpcyByZWFkeQotI2lmIDAKLSAgICAvLyByZXVzZSBhbiBvcGVuIGlucHV0IGlmIHBvc3NpYmxlCi0gICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IHJldXNlZElucHV0RGVzYzsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIC8vIHJldXNlIGlucHV0IGlmOgotICAgICAgICAvLyAtIGl0IHNoYXJlcyB0aGUgc2FtZSBwcm9maWxlCi0gICAgICAgIC8vICAgICAgQU5ECi0gICAgICAgIC8vIC0gaXQgaXMgbm90IGEgcmVyb3V0ZSBzdWJtaXggaW5wdXQKLSAgICAgICAgLy8gICAgICBBTkQKLSAgICAgICAgLy8gLSBpdCBpczogbm90IHVzZWQgZm9yIHNvdW5kIHRyaWdnZXIKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgT1IKLSAgICAgICAgLy8gICAgICAgICAgdXNlZCBmb3Igc291bmQgdHJpZ2dlciBhbmQgYWxsIGNsaWVudHMgdXNlIHRoZSBzYW1lIHNlc3Npb24gSUQKLSAgICAgICAgLy8KLSAgICAgICAgaWYgKChwcm9maWxlID09IGRlc2MtPm1Qcm9maWxlKSAmJgotICAgICAgICAgICAgKGlzU291bmRUcmlnZ2VyID09IGRlc2MtPmlzU291bmRUcmlnZ2VyKCkpICYmCi0gICAgICAgICAgICAhaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoZGV2aWNlKSkgewotCi0gICAgICAgICAgICBzcDxBdWRpb1Nlc3Npb24+IGFzID0gZGVzYy0+Z2V0QXVkaW9TZXNzaW9uKHNlc3Npb24pOwotICAgICAgICAgICAgaWYgKGFzICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3QgYWxsb3cgdW5tYXRjaGluZyBwcm9wZXJ0aWVzIG9uIHNhbWUgc2Vzc2lvbgotICAgICAgICAgICAgICAgIGlmIChhcy0+bWF0Y2hlcyhhdWRpb1Nlc3Npb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzLT5jaGFuZ2VPcGVuQ291bnQoMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yRGV2aWNlKCkgcmVjb3JkIHdpdGggZGlmZmVyZW50IGF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgZXhpc3RzIGZvciBzZXNzaW9uICVkIiwgc2Vzc2lvbik7CisgICAgaWYgKCFwcm9maWxlLT5jYW5PcGVuTmV3SW8oKSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyApIHsKKyAgICAgICAgICAgIHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZSAhPSBwcm9maWxlKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpZiBzb3VuZCB0cmlnZ2VyLCByZXVzZSBpbnB1dCBpZiB1c2VkIGJ5IG90aGVyIHNvdW5kIHRyaWdnZXIgb24gc2FtZSBzZXNzaW9uCisgICAgICAgICAgICAvLyBlbHNlCisgICAgICAgICAgICAvLyAgICByZXVzZSBpbnB1dCBpZiBhY3RpdmUgY2xpZW50IGFwcCBpcyBub3QgaW4gSURMRSBzdGF0ZQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzID0gZGVzYy0+Y2xpZW50c0xpc3QoKTsKKyAgICAgICAgICAgIGJvb2wgZG9DbG9zZSA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBjbGllbnRzKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzU291bmRUcmlnZ2VyICE9IGNsaWVudC0+aXNTb3VuZFRyaWdnZXIoKSkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzU291bmRUcmlnZ2VyKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudC0+aXNTb3VuZFRyaWdnZXIoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBjbGllbnQtPnNlc3Npb24oKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2MtPm1Jb0hhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudC0+YWN0aXZlKCkgJiYgY2xpZW50LT5hcHBTdGF0ZSgpICE9IEFQUF9TVEFURV9JRExFKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXNjLT5tSW9IYW5kbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRvQ2xvc2UgPSB0cnVlOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZXVzZSB0aGUgYWxyZWFkeSBvcGVuZWQgaW5wdXQgc3RyZWFtIG9uIHRoaXMgcHJvZmlsZSBpZjoKLSAgICAgICAgICAgIC8vIC0gdGhlIG5ldyBjYXB0dXJlIHNvdXJjZSBpcyBiYWNrZ3JvdW5kIE9SCi0gICAgICAgICAgICAvLyAtIHRoZSBwYXRoIHJlcXVlc3RlZCBjb25maWd1cmF0aW9ucyBtYXRjaCBPUgotICAgICAgICAgICAgLy8gLSB0aGUgbmV3IHNvdXJjZSBwcmlvcml0eSBpcyBsZXNzIHRoYW4gdGhlIGhpZ2hlc3Qgc291cmNlIHByaW9yaXR5IG9uIHRoaXMgaW5wdXQKLSAgICAgICAgICAgIC8vIElmIHRoZSBpbnB1dCBzdHJlYW0gY2Fubm90IGJlIHJldXNlZCwgY2xvc2UgaXQgYmVmb3JlIG9wZW5pbmcgYSBuZXcgc3RyZWFtCi0gICAgICAgICAgICAvLyBvbiB0aGUgc2FtZSBwcm9maWxlIGZvciB0aGUgbmV3IGNsaWVudCBzbyB0aGF0IHRoZSByZXF1ZXN0ZWQgcGF0aCBjb25maWd1cmF0aW9uCi0gICAgICAgICAgICAvLyBjYW4gYmUgc2VsZWN0ZWQuCi0gICAgICAgICAgICBpZiAoIWlzQ29uY3VycmVudFNvdXJjZShpbnB1dFNvdXJjZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKChkZXNjLT5tU2FtcGxpbmdSYXRlICE9IHNhbXBsaW5nUmF0ZSB8fAotICAgICAgICAgICAgICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgIT0gY29uZmlnLT5jaGFubmVsX21hc2sgfHwKLSAgICAgICAgICAgICAgICAgICAgIWF1ZGlvX2Zvcm1hdHNfbWF0Y2goZGVzYy0+bUZvcm1hdCwgY29uZmlnLT5mb3JtYXQpKSAmJgotICAgICAgICAgICAgICAgICAgICAoc291cmNlX3ByaW9yaXR5KGRlc2MtPmdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZShmYWxzZSAvKmFjdGl2ZU9ubHkqLykpIDwKLSAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9wcmlvcml0eShpbnB1dFNvdXJjZSkpKSkgewotICAgICAgICAgICAgICAgIHJldXNlZElucHV0RGVzYyA9IGRlc2M7Ci0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoZG9DbG9zZSkgeworICAgICAgICAgICAgICAgIGNsb3NlSW5wdXQoZGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGVzYy0+YWRkQXVkaW9TZXNzaW9uKHNlc3Npb24sIGF1ZGlvU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiByZXVzaW5nIGlucHV0ICVkIiwgX19GVU5DVElPTl9fLCBtSW5wdXRzLmtleUF0KGkpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUlucHV0cy5rZXlBdChpKTsKKyAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAocmV1c2VkSW5wdXREZXNjICE9IDApIHsKLSAgICAgICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBzZXNzaW9ucyA9IHJldXNlZElucHV0RGVzYy0+Z2V0QXVkaW9TZXNzaW9ucyhmYWxzZSAvKmFjdGl2ZU9ubHkqLyk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2Vzc2lvbnMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBjdXJyZW50U2Vzc2lvbiA9IHNlc3Npb25zLmtleUF0KGopOwotICAgICAgICAgICAgc3RvcElucHV0KHJldXNlZElucHV0RGVzYy0+bUlvSGFuZGxlLCBjdXJyZW50U2Vzc2lvbik7Ci0gICAgICAgICAgICByZWxlYXNlSW5wdXQocmV1c2VkSW5wdXREZXNjLT5tSW9IYW5kbGUsIGN1cnJlbnRTZXNzaW9uKTsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKCFwcm9maWxlLT5jYW5PcGVuTmV3SW8oKSkgewotICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgfQotCiAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcihwcm9maWxlLCBtcENsaWVudEludGVyZmFjZSk7CiAKICAgICBhdWRpb19jb25maWdfdCBsQ29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwpAQCAtMTc5NSwxNCArMjE0NSw3IEBACiAgICAgbENvbmZpZy5jaGFubmVsX21hc2sgPSBwcm9maWxlQ2hhbm5lbE1hc2s7CiAgICAgbENvbmZpZy5mb3JtYXQgPSBwcm9maWxlRm9ybWF0OwogCi0gICAgaWYgKGFkZHJlc3MgPT0gIiIpIHsKLSAgICAgICAgRGV2aWNlVmVjdG9yIGlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7Ci0gICAgICAgIC8vIHRoZSBpbnB1dHMgdmVjdG9yIG11c3QgYmUgb2Ygc2l6ZSA+PSAxLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBoZXJlCi0gICAgICAgIGFkZHJlc3MgPSBpbnB1dERldmljZXMuc2l6ZSgpID4gMCA/IGlucHV0RGV2aWNlcy5pdGVtQXQoMCktPm1BZGRyZXNzIDogU3RyaW5nOCgiIik7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5wdXREZXNjLT5vcGVuKCZsQ29uZmlnLCBkZXZpY2UsIGFkZHJlc3MsCi0gICAgICAgICAgICBoYWxJbnB1dFNvdXJjZSwgcHJvZmlsZUZsYWdzLCAmaW5wdXQpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGlucHV0RGVzYy0+b3BlbigmbENvbmZpZywgZGV2aWNlLCBoYWxJbnB1dFNvdXJjZSwgcHJvZmlsZUZsYWdzLCAmaW5wdXQpOwogCiAgICAgLy8gb25seSBhY2NlcHQgaW5wdXQgd2l0aCB0aGUgZXhhY3QgcmVxdWVzdGVkIHNldCBvZiBwYXJhbWV0ZXJzCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCBpbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSB8fApAQCAtMTgxOSw3ICsyMTYyLDYgQEAKICAgICB9CiAKICAgICBpbnB1dERlc2MtPm1Qb2xpY3lNaXggPSBwb2xpY3lNaXg7Ci0gICAgaW5wdXREZXNjLT5hZGRBdWRpb1Nlc3Npb24oc2Vzc2lvbiwgYXVkaW9TZXNzaW9uKTsKIAogICAgIGFkZElucHV0KGlucHV0LCBpbnB1dERlc2MpOwogICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKQEAgLTE4MjcsMzg5ICsyMTY5LDE3OCBAQAogICAgIHJldHVybiBpbnB1dDsKIH0KIAotLy9zdGF0aWMKLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0NvbmN1cnJlbnRTb3VyY2UoYXVkaW9fc291cmNlX3Qgc291cmNlKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIHJldHVybiAoc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB8fAotICAgICAgICAgICAgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pIHx8Ci0gICAgICAgICAgICAoc291cmNlID09IEFVRElPX1NPVVJDRV9GTV9UVU5FUik7Ci19CisgICAgQUxPR1YoIiVzIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKIAotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzQ29uY3VyZW50Q2FwdHVyZUFsbG93ZWQoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dERlc2MsCi0gICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4mIGF1ZGlvU2Vzc2lvbikKLXsKLSAgICAvLyBEbyBub3QgYWxsb3cgY2FwdHVyZSBpZiBhbiBhY3RpdmUgdm9pY2UgY2FsbCBpcyB1c2luZyBhIHNvZnR3YXJlIHBhdGNoIGFuZAotICAgIC8vIHRoZSBjYWxsIFRYIHNvdXJjZSBkZXZpY2UgaXMgb24gdGhlIHNhbWUgSFcgbW9kdWxlLgotICAgIC8vIEZJWE1FOiB3b3VsZCBiZSBiZXR0ZXIgdG8gcmVmaW5lIHRvIG9ubHkgaW5wdXRzIHdob3NlIHByb2ZpbGUgY29ubmVjdHMgdG8gdGhlCi0gICAgLy8gY2FsbCBUWCBkZXZpY2UgYnV0IHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGluIHRoZSBhdWRpbyBwYXRjaAotICAgIGlmIChtQ2FsbFR4UGF0Y2ggIT0gMCAmJgotICAgICAgICBpbnB1dERlc2MtPmdldE1vZHVsZUhhbmRsZSgpID09IG1DYWxsVHhQYXRjaC0+bVBhdGNoLnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIHN0YXJ0aW5nIGNvbmN1cnJlbnQgY2FwdHVyZSBpcyBlbmFibGVkIGlmOgotICAgIC8vIDEpIGNhcHR1cmluZyBmb3IgcmUtcm91dGluZwotICAgIC8vIDIpIGNhcHR1cmluZyBmb3IgSE9UV09SRCBzb3VyY2UKLSAgICAvLyAzKSBjYXB0dXJpbmcgZm9yIEZNIFRVTkVSIHNvdXJjZQotICAgIC8vIDMpIEFsbCBvdGhlciBhY3RpdmUgY2FwdHVyZXMgYXJlIGVpdGhlciBmb3IgcmUtcm91dGluZyBvciBIT1RXT1JECi0KLSAgICBpZiAoaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoaW5wdXREZXNjLT5tRGV2aWNlKSB8fAotICAgICAgICAgICAgaXNDb25jdXJyZW50U291cmNlKGF1ZGlvU2Vzc2lvbi0+aW5wdXRTb3VyY2UoKSkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVJbnB1dCA6IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCkpIHsKLSAgICAgICAgaWYgKCFpc0NvbmN1cnJlbnRTb3VyY2UoYWN0aXZlSW5wdXQtPmlucHV0U291cmNlKHRydWUpKSAmJgotICAgICAgICAgICAgICAgICFpc192aXJ0dWFsX2lucHV0X2RldmljZShhY3RpdmVJbnB1dC0+bURldmljZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBGSVhNRTogcmVtb3ZlIHdoZW4gY29uY3VycmVudCBjYXB0dXJlIGlzIHJlYWR5LiBUaGlzIGlzIGEgaGFjayB0byB3b3JrIGFyb3VuZCBidWcgYi82MzA4MzUzNy4KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlKCkgewotICAgIGlmICghbUhhc0NvbXB1dGVkU291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSkgewotICAgICAgICBib29sIHNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUgPSBmYWxzZTsKLSAgICAgICAgdW5zaWduZWQgaW50IG51bU1vZHVsZXMgPSAwOwotICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciogbk1vZHVsZXMgPSBOVUxMOwotCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IFNvdW5kVHJpZ2dlcjo6bGlzdE1vZHVsZXMobk1vZHVsZXMsICZudW1Nb2R1bGVzKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBudW1Nb2R1bGVzICE9IDApIHsKLSAgICAgICAgICAgIG5Nb2R1bGVzID0gKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yKikgY2FsbG9jKAotICAgICAgICAgICAgICAgICAgICBudW1Nb2R1bGVzLCBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IpKTsKLSAgICAgICAgICAgIGlmIChuTW9kdWxlcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgIC8vIFdlIGZhaWxlZCB0byBtYWxsb2MgdGhlIGJ1ZmZlciwgc28ganVzdCBzYXkgbm8gZm9yIG5vdywgYW5kIGhvcGUgdGhhdCB3ZSBoYXZlIG1vcmUKLSAgICAgICAgICAgICAgLy8gcmFtIHRoZSBuZXh0IHRpbWUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCi0gICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciBtb2R1bGUgZGVzY3JpcHRvcnMiKTsKLSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXMgPSBTb3VuZFRyaWdnZXI6Omxpc3RNb2R1bGVzKG5Nb2R1bGVzLCAmbnVtTW9kdWxlcyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgc291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1Nb2R1bGVzOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgc291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSAmPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Nb2R1bGVzW2ldLnByb3BlcnRpZXMuY29uY3VycmVudF9jYXB0dXJlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUobk1vZHVsZXMpOwotICAgICAgICB9Ci0gICAgICAgIG1Tb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlID0gc291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZTsKLSAgICAgICAgbUhhc0NvbXB1dGVkU291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiBtU291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZTsKLX0KLQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaWxlbmNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgKmNvbmN1cnJlbmN5KQotewotCi0gICAgQUxPR1YoIkF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dChpbnB1dDolZCwgc2Vzc2lvbjolZCwgc2lsZW5jZWQ6JWQsIGNvbmN1cnJlbmN5OiVkKSIsCi0gICAgICAgICAgICBpbnB1dCwgc2Vzc2lvbiwgc2lsZW5jZWQsICpjb25jdXJyZW5jeSk7Ci0KLSAgICAqY29uY3VycmVuY3kgPSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTk9ORTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoKSB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLmdldElucHV0Rm9yQ2xpZW50KHBvcnRJZCk7CisgICAgaWYgKGlucHV0RGVzYyA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlcyBubyBpbnB1dCBmb3IgY2xpZW50ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKLQotICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYXVkaW9TZXNzaW9uID0gaW5wdXREZXNjLT5nZXRBdWRpb1Nlc3Npb24oc2Vzc2lvbik7Ci0gICAgaWYgKGF1ZGlvU2Vzc2lvbiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdGFydElucHV0KCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotLy8gRklYTUU6IGRpc2FibGUgY29uY3VycmVudCBjYXB0dXJlIHVudGlsIFVJIGlzIHJlYWR5Ci0jaWYgMAotICAgIGlmICghaXNDb25jdXJlbnRDYXB0dXJlQWxsb3dlZChpbnB1dERlc2MsIGF1ZGlvU2Vzc2lvbikpIHsKLSAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoJWQpIGZhaWxlZDogb3RoZXIgaW5wdXQgYWxyZWFkeSBzdGFydGVkIiwgaW5wdXQpOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gaW5wdXREZXNjLT5tSW9IYW5kbGU7CisgICAgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gY2xpZW50ID0gaW5wdXREZXNjLT5nZXRDbGllbnQocG9ydElkKTsKKyAgICBpZiAoY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICBBTE9HVygiJXMgaW5wdXQgJWQgY2xpZW50ICVkIGFscmVhZHkgc3RhcnRlZCIsIF9fRlVOQ1RJT05fXywgaW5wdXQsIGNsaWVudC0+cG9ydElkKCkpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMOworICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gY2xpZW50LT5zZXNzaW9uKCk7CisKKyAgICBBTE9HVigiJXMgaW5wdXQ6JWQsIHNlc3Npb246JWQpIiwgX19GVU5DVElPTl9fLCBpbnB1dCwgc2Vzc2lvbik7CisKKyAgICBWZWN0b3I8c3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+PiBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5wdXREZXNjLT5zdGFydCgpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgaWYgKG1JbnB1dHMuYWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMoKSAhPSAwKSB7Ci0gICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FQVFVSRTsKLSAgICB9Ci0jZWxzZQotICAgIGlmICghaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoaW5wdXREZXNjLT5tRGV2aWNlKSkgewotICAgICAgICBpZiAobUNhbGxUeFBhdGNoICE9IDAgJiYKLSAgICAgICAgICAgIGlucHV0RGVzYy0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gbUNhbGxUeFBhdGNoLT5tUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSkgewotICAgICAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoJWQpIGZhaWxlZDogY2FsbCBpbiBwcm9ncmVzcyIsIGlucHV0KTsKLSAgICAgICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FMTDsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQogCi0gICAgICAgIFZlY3RvcjxzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4+IGFjdGl2ZUlucHV0cyA9IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCk7Ci0KLSAgICAgICAgLy8gSWYgYSBVSUQgaXMgaWRsZSBhbmQgcmVjb3JkcyBzaWxlbmNlIGFuZCBhbm90aGVyIG5vdCBzaWxlbmNlZCByZWNvcmRpbmcgc3RhcnRzCi0gICAgICAgIC8vIGZyb20gYW5vdGhlciBVSUQgKGlkbGUgb3IgYWN0aXZlKSB3ZSBzdG9wIHRoZSBjdXJyZW50IGlkbGUgVUlEIHJlY29yZGluZyBpbgotICAgICAgICAvLyBmYXZvciBvZiB0aGUgbmV3IG9uZSAtICJUaGVyZSBjYW4gYmUgb25seSBvbmUiIFRNCi0gICAgICAgIGlmICghc2lsZW5jZWQpIHsKLSAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlRGVzYyA6IGFjdGl2ZUlucHV0cykgewotICAgICAgICAgICAgICAgIGlmICgoYXVkaW9TZXNzaW9uLT5mbGFncygpICYgQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVEZXNjLT5nZXRJZCgpID09IGlucHV0RGVzYy0+Z2V0SWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBhY3RpdmVTZXNzaW9ucyA9IGFjdGl2ZURlc2MtPmdldEF1ZGlvU2Vzc2lvbnMoCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qYWN0aXZlT25seSovKTsKLSAgICAgICAgICAgICAgICBzcDxBdWRpb1Nlc3Npb24+IGFjdGl2ZVNlc3Npb24gPSBhY3RpdmVTZXNzaW9ucy52YWx1ZUF0KDApOwotICAgICAgICAgICAgICAgIGlmIChhY3RpdmVTZXNzaW9uLT5pc1NpbGVuY2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYWN0aXZlSW5wdXQgPSBhY3RpdmVEZXNjLT5tSW9IYW5kbGU7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhY3RpdmVTZXNzaW9uSWQgPSBhY3RpdmVTZXNzaW9uLT5zZXNzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3BJbnB1dChhY3RpdmVJbnB1dCwgYWN0aXZlU2Vzc2lvbklkKTsKLSAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0KGFjdGl2ZUlucHV0LCBhY3RpdmVTZXNzaW9uSWQpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigic3RhcnRJbnB1dCglZCkgc3RvcHBpbmcgc2lsZW5jZWQgaW5wdXQgJWQiLCBpbnB1dCwgYWN0aXZlSW5wdXQpOwotICAgICAgICAgICAgICAgICAgICBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlRGVzYyA6IGFjdGl2ZUlucHV0cykgewotICAgICAgICAgICAgaWYgKChhdWRpb1Nlc3Npb24tPmZsYWdzKCkgJiBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgYWN0aXZlRGVzYy0+Z2V0SWQoKSA9PSBpbnB1dERlc2MtPmdldElkKCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgYWN0aXZlU291cmNlID0gYWN0aXZlRGVzYy0+aW5wdXRTb3VyY2UodHJ1ZSk7Ci0gICAgICAgICAgICBpZiAoYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlRGVzYy0+aGFzUHJlZW1wdGVkU2Vzc2lvbihzZXNzaW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoJWQpIGZhaWxlZCBmb3IgSE9UV09SRDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3RoZXIgaW5wdXQgJWQgYWxyZWFkeSBzdGFydGVkIGZvciBIT1RXT1JEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBhY3RpdmVEZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9IT1RXT1JEOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoInN0YXJ0SW5wdXQoJWQpIGZhaWxlZCBmb3IgSE9UV09SRDogb3RoZXIgaW5wdXQgJWQgYWxyZWFkeSBzdGFydGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FQVFVSRTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVNvdXJjZSAhPSBBVURJT19TT1VSQ0VfSE9UV09SRCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygic3RhcnRJbnB1dCglZCkgZmFpbGVkOiBvdGhlciBpbnB1dCAlZCBhbHJlYWR5IHN0YXJ0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgYWN0aXZlRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgKmNvbmN1cnJlbmN5IHw9IEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBzb3VuZCB0cmlnZ2VyIHNlc3Npb24gc3VwcG9ydHMgY29uY3VycmVudCBjYXB0dXJlIGlmIHRoZQotICAgICAgICAvLyBpbnB1dCBpcyBhbHNvIGEgc291bmQgdHJpZ2dlciBpbnB1dC4gT3RoZXJ3aXNlLCB3ZSBzaG91bGQgcHJlZW1wdCBhbnkgaG90d29yZCBzdHJlYW0KLSAgICAgICAgLy8gdGhhdCdzIHJ1bm5pbmcuCi0gICAgICAgIGNvbnN0IGJvb2wgYWxsb3dDb25jdXJyZW50V2l0aFNvdW5kVHJpZ2dlciA9Ci0gICAgICAgICAgICBpbnB1dERlc2MtPmlzU291bmRUcmlnZ2VyKCkgPyBzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlKCkgOiBmYWxzZTsKLQotICAgICAgICAvLyBpZiBjYXB0dXJlIGlzIGFsbG93ZWQsIHByZWVtcHQgY3VycmVudGx5IGFjdGl2ZSBIT1RXT1JEIGNhcHR1cmVzCi0gICAgICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlRGVzYyA6IGFjdGl2ZUlucHV0cykgewotICAgICAgICAgICAgaWYgKGFsbG93Q29uY3VycmVudFdpdGhTb3VuZFRyaWdnZXIgJiYgYWN0aXZlRGVzYy0+aXNTb3VuZFRyaWdnZXIoKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBhY3RpdmVTb3VyY2UgPSBhY3RpdmVEZXNjLT5pbnB1dFNvdXJjZSh0cnVlKTsKLSAgICAgICAgICAgIGlmIChhY3RpdmVTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGFjdGl2ZVNlc3Npb25zID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZURlc2MtPmdldEF1ZGlvU2Vzc2lvbnModHJ1ZSAvKmFjdGl2ZU9ubHkqLyk7Ci0gICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGFjdGl2ZVNlc3Npb24gPSBhY3RpdmVTZXNzaW9ucy5rZXlBdCgwKTsKLSAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhY3RpdmVIYW5kbGUgPSBhY3RpdmVEZXNjLT5tSW9IYW5kbGU7Ci0gICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdD4gc2Vzc2lvbnMgPSBhY3RpdmVEZXNjLT5nZXRQcmVlbXB0ZWRTZXNzaW9ucygpOwotICAgICAgICAgICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfUFJFRU1QVDsKLSAgICAgICAgICAgICAgICBzZXNzaW9ucy5hZGQoYWN0aXZlU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgaW5wdXREZXNjLT5zZXRQcmVlbXB0ZWRTZXNzaW9ucyhzZXNzaW9ucyk7Ci0gICAgICAgICAgICAgICAgc3RvcElucHV0KGFjdGl2ZUhhbmRsZSwgYWN0aXZlU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0KGFjdGl2ZUhhbmRsZSwgYWN0aXZlU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInN0YXJ0SW5wdXQoJWQpIGZvciBIT1RXT1JEIHByZWVtcHRpbmcgSE9UV09SRCBpbnB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQotICAgIC8vIE1ha2Ugc3VyZSB3ZSBzdGFydCB3aXRoIHRoZSBjb3JyZWN0IHNpbGVuY2Ugc3RhdGUKLSAgICBhdWRpb1Nlc3Npb24tPnNldFNpbGVuY2VkKHNpbGVuY2VkKTsKLQotICAgIC8vIGluY3JlbWVudCBhY3Rpdml0eSBjb3VudCBiZWZvcmUgY2FsbGluZyBnZXROZXdJbnB1dERldmljZSgpIGJlbG93IGFzIG9ubHkgYWN0aXZlIHNlc3Npb25zCisgIC8vIGluY3JlbWVudCBhY3Rpdml0eSBjb3VudCBiZWZvcmUgY2FsbGluZyBnZXROZXdJbnB1dERldmljZSgpIGJlbG93IGFzIG9ubHkgYWN0aXZlIHNlc3Npb25zCiAgICAgLy8gYXJlIGNvbnNpZGVyZWQgZm9yIGRldmljZSBzZWxlY3Rpb24KLSAgICBhdWRpb1Nlc3Npb24tPmNoYW5nZUFjdGl2ZUNvdW50KDEpOworICAgIGlucHV0RGVzYy0+c2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgdHJ1ZSk7CiAKLSAgICAvLyBSb3V0aW5nPwotICAgIG1JbnB1dFJvdXRlcy5pbmNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOworICAgIC8vIGluZGljYXRlIGFjdGl2ZSBjYXB0dXJlIHRvIHNvdW5kIHRyaWdnZXIgc2VydmljZSBpZiBzdGFydGluZyBjYXB0dXJlIGZyb20gYSBtaWMgb24KKyAgICAvLyBwcmltYXJ5IEhXIG1vZHVsZQorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYyk7CisgICAgc2V0SW5wdXREZXZpY2UoaW5wdXQsIGRldmljZSwgdHJ1ZSAvKiBmb3JjZSAqLyk7CiAKLSAgICBpZiAoYXVkaW9TZXNzaW9uLT5hY3RpdmVDb3VudCgpID09IDEgfHwgbUlucHV0Um91dGVzLmdldEFuZENsZWFyUm91dGVDaGFuZ2VkKHNlc3Npb24pKSB7Ci0gICAgICAgIC8vIGluZGljYXRlIGFjdGl2ZSBjYXB0dXJlIHRvIHNvdW5kIHRyaWdnZXIgc2VydmljZSBpZiBzdGFydGluZyBjYXB0dXJlIGZyb20gYSBtaWMgb24KLSAgICAgICAgLy8gcHJpbWFyeSBIVyBtb2R1bGUKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYyk7Ci0gICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0LCBkZXZpY2UsIHRydWUgLyogZm9yY2UgKi8pOwotCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGlucHV0RGVzYy0+c3RhcnQoKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgbUlucHV0Um91dGVzLmRlY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7Ci0gICAgICAgICAgICBhdWRpb1Nlc3Npb24tPmNoYW5nZUFjdGl2ZUNvdW50KC0xKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgaWYgKGlucHV0RGVzYy0+YWN0aXZlQ291bnQoKSAgPT0gMSkgeworICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gaW5wdXREZXNjLT5tUG9saWN5TWl4LnByb21vdGUoKTsKKyAgICAgICAgLy8gaWYgaW5wdXQgbWFwcyB0byBhIGR5bmFtaWMgcG9saWN5IHdpdGggYW4gYWN0aXZpdHkgbGlzdGVuZXIsIG5vdGlmeSBvZiBzdGF0ZSBjaGFuZ2UKKyAgICAgICAgaWYgKChwb2xpY3lNaXggIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAmJiAoKHBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKHBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9NSVhJTkcpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGlucHV0RGVzYy0+Z2V0QXVkaW9TZXNzaW9uQ291bnQodHJ1ZS8qYWN0aXZlT25seSovKSA9PSAxKSB7Ci0gICAgICAgICAgICAvLyBpZiBpbnB1dCBtYXBzIHRvIGEgZHluYW1pYyBwb2xpY3kgd2l0aCBhbiBhY3Rpdml0eSBsaXN0ZW5lciwgbm90aWZ5IG9mIHN0YXRlIGNoYW5nZQotICAgICAgICAgICAgaWYgKChpbnB1dERlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9NSVhJTkcpOwotICAgICAgICAgICAgfQorICAgICAgICBEZXZpY2VWZWN0b3IgcHJpbWFyeUlucHV0RGV2aWNlcyA9IGF2YWlsYWJsZVByaW1hcnlNb2R1bGVJbnB1dERldmljZXMoKTsKKyAgICAgICAgaWYgKHByaW1hcnlJbnB1dERldmljZXMuY29udGFpbnMoZGV2aWNlKSAmJgorICAgICAgICAgICAgICAgIG1JbnB1dHMuYWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMocHJpbWFyeUlucHV0RGV2aWNlcykgPT0gMSkgeworICAgICAgICAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUodHJ1ZSk7CisgICAgICAgIH0KIAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByaW1hcnlJbnB1dERldmljZXMgPSBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCk7Ci0gICAgICAgICAgICBpZiAoKChkZXZpY2UgJiBwcmltYXJ5SW5wdXREZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApICYmCi0gICAgICAgICAgICAgICAgICAgIG1JbnB1dHMuYWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMocHJpbWFyeUlucHV0RGV2aWNlcykgPT0gMSkgewotICAgICAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKHRydWUpOworICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGVuYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdGFydGVkIGlmIG5vdAorICAgICAgICAvLyB1c2VkIGJ5IGEgcG9saWN5IG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUworICAgICAgICAvLyBGb3IgcmVtb3RlIHN1Ym1peCAoYSB2aXJ0dWFsIGRldmljZSksIHdlIG9wZW4gb25seSBvbmUgaW5wdXQgcGVyIGNhcHR1cmUgcmVxdWVzdC4KKyAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+Z2V0RGV2aWNlVHlwZSgpKSkgeworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7CisgICAgICAgICAgICBpZiAocG9saWN5TWl4ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gU3RyaW5nOCgiMCIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gcG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzczsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYXV0b21hdGljYWxseSBlbmFibGUgdGhlIHJlbW90ZSBzdWJtaXggb3V0cHV0IHdoZW4gaW5wdXQgaXMgc3RhcnRlZCBpZiBub3QKLSAgICAgICAgICAgIC8vIHVzZWQgYnkgYSBwb2xpY3kgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCi0gICAgICAgICAgICAvLyBGb3IgcmVtb3RlIHN1Ym1peCAoYSB2aXJ0dWFsIGRldmljZSksIHdlIG9wZW4gb25seSBvbmUgaW5wdXQgcGVyIGNhcHR1cmUgcmVxdWVzdC4KLSAgICAgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IGlucHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzICE9ICIiKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgInJlbW90ZS1zdWJtaXgiKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWRkcmVzcyAhPSAiIikgeworICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsICJyZW1vdGUtc3VibWl4IiwgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR1YoIkF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dCgpIGlucHV0IHNvdXJjZSA9ICVkIiwgYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpKTsKKyAgICBBTE9HVigiJXMgaW5wdXQgJWQgc291cmNlID0gJWQgZXhpdCIsIF9fRlVOQ1RJT05fXywgaW5wdXQsIGNsaWVudC0+c291cmNlKCkpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgQUxPR1YoInN0b3BJbnB1dCgpIGlucHV0ICVkIiwgaW5wdXQpOwotICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgQUxPR1YoIiVzIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLmdldElucHV0Rm9yQ2xpZW50KHBvcnRJZCk7CisgICAgaWYgKGlucHV0RGVzYyA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlcyBubyBpbnB1dCBmb3IgY2xpZW50ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKLQotICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYXVkaW9TZXNzaW9uID0gaW5wdXREZXNjLT5nZXRBdWRpb1Nlc3Npb24oc2Vzc2lvbik7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic3RvcElucHV0KCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGlmIChhdWRpb1Nlc3Npb24tPmFjdGl2ZUNvdW50KCkgPT0gMCkgewotICAgICAgICBBTE9HVygic3RvcElucHV0KCkgaW5wdXQgJWQgYWxyZWFkeSBzdG9wcGVkIiwgaW5wdXQpOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gaW5wdXREZXNjLT5tSW9IYW5kbGU7CisgICAgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gY2xpZW50ID0gaW5wdXREZXNjLT5nZXRDbGllbnQocG9ydElkKTsKKyAgICBpZiAoIWNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgQUxPR1coIiVzIGlucHV0ICVkIGNsaWVudCAlZCBhbHJlYWR5IHN0b3BwZWQiLCBfX0ZVTkNUSU9OX18sIGlucHV0LCBjbGllbnQtPnBvcnRJZCgpKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIGF1ZGlvU2Vzc2lvbi0+Y2hhbmdlQWN0aXZlQ291bnQoLTEpOworICAgIGlucHV0RGVzYy0+c2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgZmFsc2UpOwogCi0gICAgLy8gUm91dGluZz8KLSAgICBtSW5wdXRSb3V0ZXMuZGVjUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKLQotICAgIGlmIChhdWRpb1Nlc3Npb24tPmFjdGl2ZUNvdW50KCkgPT0gMCkgewotICAgICAgICBpbnB1dERlc2MtPnN0b3AoKTsKLSAgICAgICAgaWYgKGlucHV0RGVzYy0+aXNBY3RpdmUoKSkgewotICAgICAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXQsIGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYyksIGZhbHNlIC8qIGZvcmNlICovKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCi0gICAgICAgICAgICBpZiAoKGlucHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAmJiAoKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkgewotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX0lETEUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGRpc2FibGUgdGhlIHJlbW90ZSBzdWJtaXggb3V0cHV0IHdoZW4gaW5wdXQgaXMgc3RvcHBlZCBpZiBub3QKLSAgICAgICAgICAgIC8vIHVzZWQgYnkgYSBwb2xpY3kgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCi0gICAgICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoaW5wdXREZXNjLT5tRGV2aWNlKSkgewotICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgoIiIpOwotICAgICAgICAgICAgICAgIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXggPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gU3RyaW5nOCgiMCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYWRkcmVzcyAhPSAiIikgewotICAgICAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsICJyZW1vdGUtc3VibWl4Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gaW5wdXREZXNjLT5tRGV2aWNlOwotICAgICAgICAgICAgcmVzZXRJbnB1dERldmljZShpbnB1dCk7Ci0KLSAgICAgICAgICAgIC8vIGluZGljYXRlIGluYWN0aXZlIGNhcHR1cmUgdG8gc291bmQgdHJpZ2dlciBzZXJ2aWNlIGlmIHN0b3BwaW5nIGNhcHR1cmUgZnJvbSBhIG1pYyBvbgotICAgICAgICAgICAgLy8gcHJpbWFyeSBIVyBtb2R1bGUKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmltYXJ5SW5wdXREZXZpY2VzID0gYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpOwotICAgICAgICAgICAgaWYgKCgoZGV2aWNlICYgcHJpbWFyeUlucHV0RGV2aWNlcyAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgICAgICBtSW5wdXRzLmFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKHByaW1hcnlJbnB1dERldmljZXMpID09IDApIHsKLSAgICAgICAgICAgICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZShmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dERlc2MtPmNsZWFyUHJlZW1wdGVkU2Vzc2lvbnMoKTsKKyAgICBpbnB1dERlc2MtPnN0b3AoKTsKKyAgICBpZiAoaW5wdXREZXNjLT5pc0FjdGl2ZSgpKSB7CisgICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0LCBnZXROZXdJbnB1dERldmljZShpbnB1dERlc2MpLCBmYWxzZSAvKiBmb3JjZSAqLyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peCA9IGlucHV0RGVzYy0+bVBvbGljeU1peC5wcm9tb3RlKCk7CisgICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCisgICAgICAgIGlmICgocG9saWN5TWl4ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgJiYgKChwb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfSURMRSk7CiAgICAgICAgIH0KKworICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGRpc2FibGUgdGhlIHJlbW90ZSBzdWJtaXggb3V0cHV0IHdoZW4gaW5wdXQgaXMgc3RvcHBlZCBpZiBub3QKKyAgICAgICAgLy8gdXNlZCBieSBhIHBvbGljeSBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKKyAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+Z2V0RGV2aWNlVHlwZSgpKSkgeworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7CisgICAgICAgICAgICBpZiAocG9saWN5TWl4ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gU3RyaW5nOCgiMCIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gcG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhZGRyZXNzICE9ICIiKSB7CisgICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgInJlbW90ZS1zdWJtaXgiLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVzZXRJbnB1dERldmljZShpbnB1dCk7CisKKyAgICAgICAgLy8gaW5kaWNhdGUgaW5hY3RpdmUgY2FwdHVyZSB0byBzb3VuZCB0cmlnZ2VyIHNlcnZpY2UgaWYgc3RvcHBpbmcgY2FwdHVyZSBmcm9tIGEgbWljIG9uCisgICAgICAgIC8vIHByaW1hcnkgSFcgbW9kdWxlCisgICAgICAgIERldmljZVZlY3RvciBwcmltYXJ5SW5wdXREZXZpY2VzID0gYXZhaWxhYmxlUHJpbWFyeU1vZHVsZUlucHV0RGV2aWNlcygpOworICAgICAgICBpZiAocHJpbWFyeUlucHV0RGV2aWNlcy5jb250YWlucyhpbnB1dERlc2MtPmdldERldmljZSgpKSAmJgorICAgICAgICAgICAgICAgIG1JbnB1dHMuYWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMocHJpbWFyeUlucHV0RGV2aWNlcykgPT0gMCkgeworICAgICAgICAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUoZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGlucHV0RGVzYy0+Y2xlYXJQcmVlbXB0ZWRTZXNzaW9ucygpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBBTE9HVigicmVsZWFzZUlucHV0KCkgJWQiLCBpbnB1dCk7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygicmVsZWFzZUlucHV0KCkgcmVsZWFzaW5nIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgQUxPR1YoIiVzIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLmdldElucHV0Rm9yQ2xpZW50KHBvcnRJZCk7CisgICAgaWYgKGlucHV0RGVzYyA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlcyBubyBpbnB1dCBmb3IgY2xpZW50ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IGNsaWVudCA9IGlucHV0RGVzYy0+Z2V0Q2xpZW50KHBvcnRJZCk7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBpbnB1dERlc2MtPm1Jb0hhbmRsZTsKIAotICAgIC8vIFJvdXRpbmcKLSAgICBtSW5wdXRSb3V0ZXMucmVtb3ZlUm91dGUoc2Vzc2lvbik7CisgICAgQUxPR1YoIiVzICVkIiwgX19GVU5DVElPTl9fLCBpbnB1dCk7CiAKLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKLSAgICBBTE9HX0FTU0VSVChpbnB1dERlc2MgIT0gMCk7CisgICAgaW5wdXREZXNjLT5yZW1vdmVDbGllbnQocG9ydElkKTsKIAotICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYXVkaW9TZXNzaW9uID0gaW5wdXREZXNjLT5nZXRBdWRpb1Nlc3Npb24oc2Vzc2lvbik7Ci0gICAgaWYgKGF1ZGlvU2Vzc2lvbiA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJyZWxlYXNlSW5wdXQoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoYXVkaW9TZXNzaW9uLT5vcGVuQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJyZWxlYXNlSW5wdXQoKSBpbnZhbGlkIG9wZW4gY291bnQgJWQgb24gc2Vzc2lvbiAlZCIsCi0gICAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbi0+b3BlbkNvdW50KCksIHNlc3Npb24pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGF1ZGlvU2Vzc2lvbi0+Y2hhbmdlT3BlbkNvdW50KC0xKSA9PSAwKSB7Ci0gICAgICAgIGlucHV0RGVzYy0+cmVtb3ZlQXVkaW9TZXNzaW9uKHNlc3Npb24pOwotICAgIH0KLQotICAgIGlmIChpbnB1dERlc2MtPmdldE9wZW5SZWZDb3VudCgpID4gMCkgewotICAgICAgICBBTE9HVigicmVsZWFzZUlucHV0KCkgZXhpdCA+IDAiKTsKKyAgICBpZiAoaW5wdXREZXNjLT5nZXRDbGllbnRDb3VudCgpID4gMCkgeworICAgICAgICBBTE9HVigiJXMoJWQpICV6dSBjbGllbnRzIHJlbWFpbmluZyIsIF9fZnVuY19fLCBwb3J0SWQsIGlucHV0RGVzYy0+Z2V0Q2xpZW50Q291bnQoKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBjbG9zZUlucHV0KGlucHV0KTsKICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7Ci0gICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpIGV4aXQiKTsKKyAgICBBTE9HVigiJXMgZXhpdCIsIF9fRlVOQ1RJT05fXyk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZUFjdGl2ZUNsaWVudHMoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dCkKK3sKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50cyA9IGlucHV0LT5jbGllbnRzTGlzdCh0cnVlKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogY2xpZW50cykgeworICAgICAgICBjbG9zZUNsaWVudChjbGllbnQtPnBvcnRJZCgpKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZUNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKK3sKKyAgICBzdG9wSW5wdXQocG9ydElkKTsKKyAgICByZWxlYXNlSW5wdXQocG9ydElkKTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsb3NlQWxsSW5wdXRzKCkgewpAQCAtMjIyNiw3ICsyMzU3LDYgQEAKICAgICAgICAgfQogICAgICAgICBpbnB1dERlc2MtPmNsb3NlKCk7CiAgICAgfQotICAgIG1JbnB1dFJvdXRlcy5jbGVhcigpOwogICAgIG1JbnB1dHMuY2xlYXIoKTsKICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZShmYWxzZSk7CiAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKQEAgLTIyMzYsMTkgKzIzNjYsMjEgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCkKIHsKICAgICBBTE9HVigiaW5pdFN0cmVhbVZvbHVtZSgpIHN0cmVhbSAlZCwgbWluICVkLCBtYXggJWQiLCBzdHJlYW0gLCBpbmRleE1pbiwgaW5kZXhNYXgpOwotICAgIG1Wb2x1bWVDdXJ2ZXMtPmluaXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgIGlmIChpbmRleE1pbiA8IDAgfHwgaW5kZXhNYXggPCAwKSB7CisgICAgICAgIEFMT0dFKCIlcyBmb3Igc3RyZWFtICVkOiBpbnZhbGlkIG1pbiAlZCBvciBtYXggJWQiLCBfX2Z1bmNfXywgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBnZXRWb2x1bWVDdXJ2ZXMoc3RyZWFtKS5pbml0Vm9sdW1lKGluZGV4TWluLCBpbmRleE1heCk7CiAKICAgICAvLyBpbml0aWFsaXplIG90aGVyIHByaXZhdGUgc3RyZWFtIHZvbHVtZXMgd2hpY2ggZm9sbG93IHRoaXMgb25lCiAgICAgZm9yIChpbnQgY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBjdXJTdHJlYW0rKykgewogICAgICAgICBpZiAoIXN0cmVhbXNNYXRjaEZvcnZvbHVtZShzdHJlYW0sIChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmluaXRTdHJlYW1Wb2x1bWUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgICAgICBnZXRWb2x1bWVDdXJ2ZXMoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKS5pbml0Vm9sdW1lKGluZGV4TWluLCBpbmRleE1heCk7CiAgICAgfQogfQogCkBAIC0yMjU2LDEzICsyMzg4LDE3OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCiB7CisgICAgYXV0byBhdHRyaWJ1dGVzID0gbUVuZ2luZS0+Z2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoc3RyZWFtKTsKKyAgICBhdXRvIHZvbHVtZUdyb3VwID0gbUVuZ2luZS0+Z2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgaWYgKHZvbHVtZUdyb3VwID09IFZPTFVNRV9HUk9VUF9OT05FKSB7CisgICAgICAgIEFMT0dFKCIlczogbm8gZ3JvdXAgbWF0Y2hpbmcgd2l0aCBzdHJlYW0gJXMiLCBfX0ZVTkNUSU9OX18sIHRvU3RyaW5nKHN0cmVhbSkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCIlczogc3RyZWFtICVzIGF0dHJpYnV0ZXM9JXMiLCBfX2Z1bmNfXywKKyAgICAgICAgICB0b1N0cmluZyhzdHJlYW0pLmNfc3RyKCksIHRvU3RyaW5nKGF0dHJpYnV0ZXMpLmNfc3RyKCkpOworICAgIHJldHVybiBzZXRWb2x1bWVHcm91cEluZGV4KGdldFZvbHVtZUN1cnZlcyhzdHJlYW0pLCB2b2x1bWVHcm91cCwgaW5kZXgsIGRldmljZSwgYXR0cmlidXRlcyk7Cit9CiAKLSAgICAvLyBWT0lDRV9DQUxMIGFuZCBCTFVFVE9PVEhfU0NPIHN0cmVhbSBoYXZlIG1pblZvbHVtZUluZGV4ID4gMCBidXQKLSAgICAvLyBjYW4gYmUgbXV0ZWQgZGlyZWN0bHkgYnkgYW4gYXBwIHRoYXQgaGFzIE1PRElGWV9QSE9ORV9TVEFURSBwZXJtaXNzaW9uLgotICAgIGlmICgoKGluZGV4IDwgbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXhNaW4oc3RyZWFtKSkgJiYKLSAgICAgICAgICAgICEoKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCB8fCBzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08pICYmCi0gICAgICAgICAgICBpbmRleCA9PSAwKSkgfHwKLSAgICAgICAgICAgIChpbmRleCA+IG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWF4KHN0cmVhbSkpKSB7CitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIC8vIGlmIGRldmljZSBpcyBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSwgcmV0dXJuIHZvbHVtZSBmb3IgZGV2aWNlIHNlbGVjdGVkIGZvciB0aGlzCisgICAgLy8gc3RyZWFtIGJ5IHRoZSBlbmdpbmUuCisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSkgeworICAgICAgICBkZXZpY2UgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKHN0cmVhbSwgdHJ1ZSAvKmZyb21DYWNoZSovKS50eXBlcygpOworICAgIH0KKyAgICByZXR1cm4gZ2V0Vm9sdW1lSW5kZXgoZ2V0Vm9sdW1lQ3VydmVzKHN0cmVhbSksICppbmRleCwgZGV2aWNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICAvLyBHZXQgVm9sdW1lIGdyb3VwIG1hdGNoaW5nIHRoZSBBdWRpbyBBdHRyaWJ1dGVzCisgICAgYXV0byB2b2x1bWVHcm91cCA9IG1FbmdpbmUtPmdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhhdHRyKTsKKyAgICBpZiAodm9sdW1lR3JvdXAgPT0gVk9MVU1FX0dST1VQX05PTkUpIHsKKyAgICAgICAgQUxPR0QoIiVzOiBjb3VsZCBub3QgZmluZCBncm91cCBtYXRjaGluZyB3aXRoICVzIiwgX19GVU5DVElPTl9fLCB0b1N0cmluZyhhdHRyKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBncm91cCAlZCBtYXRjaGluZyB3aXRoICVzIiwgX19GVU5DVElPTl9fLCB2b2x1bWVHcm91cCwgdG9TdHJpbmcoYXR0cikuY19zdHIoKSk7CisgICAgcmV0dXJuIHNldFZvbHVtZUdyb3VwSW5kZXgoZ2V0Vm9sdW1lQ3VydmVzKGF0dHIpLCB2b2x1bWVHcm91cCwgaW5kZXgsIGRldmljZSwgYXR0cik7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0Vm9sdW1lR3JvdXBJbmRleChJVm9sdW1lQ3VydmVzICZjdXJ2ZXMsIHZvbHVtZV9ncm91cF90IGdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzKQoreworICAgIEFMT0dWVigiJXM6IGdyb3VwPSVkIiwgX19mdW5jX18sIGdyb3VwKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBWb2x1bWVTb3VyY2UgdnMgPSB0b1ZvbHVtZVNvdXJjZShncm91cCk7CisgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5ID0gbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKworICAgIHN0YXR1cyA9IHNldFZvbHVtZUN1cnZlSW5kZXgoaW5kZXgsIGRldmljZSwgY3VydmVzKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCIlcyBmYWlsZWQgdG8gc2V0IGN1cnZlIGluZGV4IGZvciBncm91cCAlZCBkZXZpY2UgMHglWCIsIF9fZnVuY19fLCBncm91cCwgZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgLy8gdXBkYXRlIHZvbHVtZSBvbiBhbGwgb3V0cHV0cyBhbmQgc3RyZWFtcyBtYXRjaGluZyB0aGUgZm9sbG93aW5nOgorICAgIC8vIC0gVGhlIHJlcXVlc3RlZCBzdHJlYW0gKG9yIGEgc3RyZWFtIG1hdGNoaW5nIGZvciB2b2x1bWUgY29udHJvbCkgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQKKyAgICAvLyAtIFRoZSBkZXZpY2UgKG9yIGRldmljZXMpIHNlbGVjdGVkIGJ5IHRoZSBlbmdpbmUgZm9yIHRoaXMgc3RyZWFtIGluY2x1ZGVzCisgICAgLy8gdGhlIHJlcXVlc3RlZCBkZXZpY2UKKyAgICAvLyAtIEZvciBub24gZGVmYXVsdCByZXF1ZXN0ZWQgZGV2aWNlLCBjdXJyZW50bHkgc2VsZWN0ZWQgZGV2aWNlIG9uIHRoZSBvdXRwdXQgaXMgZWl0aGVyIHRoZQorICAgIC8vIHJlcXVlc3RlZCBkZXZpY2Ugb3Igb25lIG9mIHRoZSBkZXZpY2VzIHNlbGVjdGVkIGJ5IHRoZSBlbmdpbmUgZm9yIHRoaXMgc3RyZWFtCisgICAgLy8gLSBGb3IgZGVmYXVsdCByZXF1ZXN0ZWQgZGV2aWNlIChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSksIGFwcGx5IHZvbHVtZSBvbmx5IGlmCisgICAgLy8gbm8gc3BlY2lmaWMgZGV2aWNlIHZvbHVtZSB2YWx1ZSBleGlzdHMgZm9yIGN1cnJlbnRseSBzZWxlY3RlZCBkZXZpY2UuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXNjLT5kZXZpY2VzKCkudHlwZXMoKSk7CisKKyAgICAgICAgLy8gSW50ZXIgLyBpbnRyYSB2b2x1bWUgZ3JvdXAgcHJpb3JpdHkgbWFuYWdlbWVudDogTG9vcCBvbiBzdHJhdGVnaWVzIGFycmFuZ2VkIGJ5IHByaW9yaXR5CisgICAgICAgIC8vIElmIGEgaGlnaGVyIHByaW9yaXR5IHN0cmF0ZWd5IGlzIGFjdGl2ZSwgYW5kIHRoZSBvdXRwdXQgaXMgcm91dGVkIHRvIGEgZGV2aWNlIHdpdGggYQorICAgICAgICAvLyBIVyBHYWluIG1hbmFnZW1lbnQsIGRvIG5vdCBjaGFuZ2UgdGhlIHZvbHVtZQorICAgICAgICBib29sIGFwcGx5Vm9sdW1lID0gZmFsc2U7CisgICAgICAgIGlmIChkZXNjLT51c2VId0dhaW4oKSkgeworICAgICAgICAgICAgaWYgKCEoZGVzYy0+aXNBY3RpdmUoZ3JvdXApIHx8IGlzSW5DYWxsKCkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnByb2R1Y3RTdHJhdGVneSA6IG1FbmdpbmUtPmdldE9yZGVyZWRQcm9kdWN0U3RyYXRlZ2llcygpKSB7CisgICAgICAgICAgICAgICAgYXV0byBhY3RpdmVDbGllbnRzID0gZGVzYy0+Y2xpZW50c0xpc3QodHJ1ZSAvKmFjdGl2ZU9ubHkqLywgcHJvZHVjdFN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qcHJlZmVycmVkRGV2aWNlKi8pOworICAgICAgICAgICAgICAgIGlmIChhY3RpdmVDbGllbnRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJvb2wgaXNQcmVlbXB0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBib29sIGlzSGlnaGVyUHJpb3JpdHkgPSBwcm9kdWN0U3RyYXRlZ3kgPCBzdHJhdGVneTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGFjdGl2ZUNsaWVudHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzSGlnaGVyUHJpb3JpdHkgJiYgKGNsaWVudC0+dm9sdW1lU291cmNlKCkgIT0gdnMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IFN0cmF0ZWd5PSVkIChcbnJlcXVlc3RlcjpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZ3JvdXAgJWQsIHZvbHVtZUdyb3VwPSVkIGF0dHJpYnV0ZXM9JXMpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGhpZ2hlciBwcmlvcml0eSBzb3VyY2UgYWN0aXZlOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB2b2x1bWVHcm91cD0lZCBhdHRyaWJ1dGVzPSVzKSBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgb24gb3V0cHV0ICV6dSwgYmFpbGluZyBvdXQiLCBfX2Z1bmNfXywgcHJvZHVjdFN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAsIGdyb3VwLCB0b1N0cmluZyhhdHRyaWJ1dGVzKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT52b2x1bWVTb3VyY2UoKSwgdG9TdHJpbmcoY2xpZW50LT5hdHRyaWJ1dGVzKCkpLmNfc3RyKCksIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlWb2x1bWUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJlZW1wdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGNvbnRpbnVlIGZvciBsb29wIHRvIGVuc3VyZSBubyBoaWdoZXIgcHJpbyBjbGllbnRzIHJ1bm5pbmcgb24gb3V0cHV0CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnQtPnZvbHVtZVNvdXJjZSgpID09IHZzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBseVZvbHVtZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlzUHJlZW1wdGVkIHx8IGFwcGx5Vm9sdW1lKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghYXBwbHlWb2x1bWUpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gbmV4dCBvdXRwdXQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1c190IHZvbFN0YXR1cyA9IGNoZWNrQW5kU2V0Vm9sdW1lKGN1cnZlcywgdnMsIGluZGV4LCBkZXNjLCBjdXJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodnMgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1NZU1RFTSk/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPVUNIX1NPVU5EX0ZJWEVEX0RFTEFZX01TIDogMCkpOworICAgICAgICAgICAgaWYgKHZvbFN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHZvbFN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byBjdXJWb2xHcm91cCA6IGdldFZvbHVtZUdyb3VwcygpKSB7CisgICAgICAgICAgICBWb2x1bWVTb3VyY2UgY3VyVm9sU3JjID0gdG9Wb2x1bWVTb3VyY2UoY3VyVm9sR3JvdXApOworICAgICAgICAgICAgaWYgKGN1clZvbFNyYyAhPSB2cykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEoZGVzYy0+aXNBY3RpdmUodnMpIHx8IGlzSW5DYWxsKCkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyU3JjRGV2aWNlOworICAgICAgICAgICAgYXV0byAmY3VyQ3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzKGN1clZvbFNyYyk7CisgICAgICAgICAgICBhdXRvIGN1ckN1cnZBdHRycyA9IGN1ckN1cnZlcy5nZXRBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICBpZiAoIWN1ckN1cnZBdHRycy5lbXB0eSgpICYmIGN1ckN1cnZBdHRycy5mcm9udCgpICE9IGRlZmF1bHRBdHRyKSB7CisgICAgICAgICAgICAgICAgYXV0byBhdHRyID0gY3VyQ3VydkF0dHJzLmZyb250KCk7CisgICAgICAgICAgICAgICAgY3VyU3JjRGV2aWNlID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0ciwgbnVsbHB0ciwgZmFsc2UpLnR5cGVzKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFjdXJDdXJ2ZXMuZ2V0U3RyZWFtVHlwZXMoKS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYXV0byBzdHJlYW0gPSBjdXJDdXJ2ZXMuZ2V0U3RyZWFtVHlwZXMoKS5mcm9udCgpOworICAgICAgICAgICAgICAgIGN1clNyY0RldmljZSA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JTdHJlYW0oc3RyZWFtLCBmYWxzZSkudHlwZXMoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHNyYyAlZDogbm8gdmFsaWQgYXR0cmlidXRlcyBub3Igc3RyZWFtIixfX2Z1bmNfXywgY3VyVm9sU3JjKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1clNyY0RldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGN1clNyY0RldmljZSk7CisgICAgICAgICAgICBpZiAoKGRldmljZSAhPSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSkgJiYgKChjdXJEZXZpY2UgJiBkZXZpY2UpID09IDApKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FKSB7CisgICAgICAgICAgICAgICAgY3VyU3JjRGV2aWNlIHw9IGRldmljZTsKKyAgICAgICAgICAgICAgICBhcHBseVZvbHVtZSA9IChjdXJEZXZpY2UgJiBjdXJTcmNEZXZpY2UpICE9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFwcGx5Vm9sdW1lID0gIWN1cnZlcy5oYXNWb2x1bWVJbmRleEZvckRldmljZShjdXJTcmNEZXZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFwcGx5Vm9sdW1lKSB7CisgICAgICAgICAgICAgICAgLy9GSVhNRTogd29ya2Fyb3VuZCBmb3IgdHJ1bmNhdGVkIHRvdWNoIHNvdW5kcworICAgICAgICAgICAgICAgIC8vIGRlbGF5ZWQgdm9sdW1lIGNoYW5nZSBmb3Igc3lzdGVtIHN0cmVhbSB0byBiZSByZW1vdmVkIHdoZW4gdGhlIHByb2JsZW0gaXMKKyAgICAgICAgICAgICAgICAvLyBoYW5kbGVkIGJ5IHN5c3RlbSBVSQorICAgICAgICAgICAgICAgIHN0YXR1c190IHZvbFN0YXR1cyA9IGNoZWNrQW5kU2V0Vm9sdW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckN1cnZlcywgY3VyVm9sU3JjLCBpbmRleCwgZGVzYywgY3VyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodnMgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1NZU1RFTSkpPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9VQ0hfU09VTkRfRklYRURfREVMQVlfTVMgOiAwKSk7CisgICAgICAgICAgICAgICAgaWYgKHZvbFN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB2b2xTdGF0dXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKGdyb3VwLCAwIC8qZmxhZ3MqLyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRWb2x1bWVDdXJ2ZUluZGV4KGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElWb2x1bWVDdXJ2ZXMgJnZvbHVtZUN1cnZlcykKK3sKKyAgICAvLyBWT0lDRV9DQUxMIHN0cmVhbSBoYXMgbWluVm9sdW1lSW5kZXggPiAwICBidXQgY2FuIGJlIG11dGVkIGRpcmVjdGx5IGJ5IGFuCisgICAgLy8gYXBwIHRoYXQgaGFzIE1PRElGWV9QSE9ORV9TVEFURSBwZXJtaXNzaW9uLgorICAgIGJvb2wgaGFzVm9pY2UgPSBoYXNWb2ljZVN0cmVhbSh2b2x1bWVDdXJ2ZXMuZ2V0U3RyZWFtVHlwZXMoKSk7CisgICAgaWYgKCgoaW5kZXggPCB2b2x1bWVDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXhNaW4oKSkgJiYgIShoYXNWb2ljZSAmJiBpbmRleCA9PSAwKSkgfHwKKyAgICAgICAgICAgIChpbmRleCA+IHZvbHVtZUN1cnZlcy5nZXRWb2x1bWVJbmRleE1heCgpKSkgeworICAgICAgICBBTE9HRCgiJXM6IHdyb25nIGluZGV4ICVkIG1pbj0lZCBtYXg9JWQiLCBfX0ZVTkNUSU9OX18sIGluZGV4LAorICAgICAgICAgICAgICB2b2x1bWVDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXhNaW4oKSwgdm9sdW1lQ3VydmVzLmdldFZvbHVtZUluZGV4TWF4KCkpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgewpAQCAtMjI3MCw5MCArMjU2OCw0OSBAQAogICAgIH0KIAogICAgIC8vIEZvcmNlIG1heCB2b2x1bWUgaWYgc3RyZWFtIGNhbm5vdCBiZSBtdXRlZAotICAgIGlmICghbVZvbHVtZUN1cnZlcy0+Y2FuQmVNdXRlZChzdHJlYW0pKSBpbmRleCA9IG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWF4KHN0cmVhbSk7CisgICAgaWYgKCF2b2x1bWVDdXJ2ZXMuY2FuQmVNdXRlZCgpKSBpbmRleCA9IHZvbHVtZUN1cnZlcy5nZXRWb2x1bWVJbmRleE1heCgpOwogCi0gICAgQUxPR1YoInNldFN0cmVhbVZvbHVtZUluZGV4KCkgc3RyZWFtICVkLCBkZXZpY2UgJTA4eCwgaW5kZXggJWQiLAotICAgICAgICAgIHN0cmVhbSwgZGV2aWNlLCBpbmRleCk7Ci0KLSAgICAvLyB1cGRhdGUgb3RoZXIgcHJpdmF0ZSBzdHJlYW0gdm9sdW1lcyB3aGljaCBmb2xsb3cgdGhpcyBvbmUKLSAgICBmb3IgKGludCBjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IGN1clN0cmVhbSsrKSB7Ci0gICAgICAgIGlmICghc3RyZWFtc01hdGNoRm9ydm9sdW1lKHN0cmVhbSwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgbVZvbHVtZUN1cnZlcy0+YWRkQ3VycmVudFZvbHVtZUluZGV4KChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSwgZGV2aWNlLCBpbmRleCk7Ci0gICAgfQotCi0gICAgLy8gdXBkYXRlIHZvbHVtZSBvbiBhbGwgb3V0cHV0cyBhbmQgc3RyZWFtcyBtYXRjaGluZyB0aGUgZm9sbG93aW5nOgotICAgIC8vIC0gVGhlIHJlcXVlc3RlZCBzdHJlYW0gKG9yIGEgc3RyZWFtIG1hdGNoaW5nIGZvciB2b2x1bWUgY29udHJvbCkgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQKLSAgICAvLyAtIFRoZSBkZXZpY2UgKG9yIGRldmljZXMpIHNlbGVjdGVkIGJ5IHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc3RyZWFtIGluY2x1ZGVzCi0gICAgLy8gdGhlIHJlcXVlc3RlZCBkZXZpY2UKLSAgICAvLyAtIEZvciBub24gZGVmYXVsdCByZXF1ZXN0ZWQgZGV2aWNlLCBjdXJyZW50bHkgc2VsZWN0ZWQgZGV2aWNlIG9uIHRoZSBvdXRwdXQgaXMgZWl0aGVyIHRoZQotICAgIC8vIHJlcXVlc3RlZCBkZXZpY2Ugb3Igb25lIG9mIHRoZSBkZXZpY2VzIHNlbGVjdGVkIGJ5IHRoZSBzdHJhdGVneQotICAgIC8vIC0gRm9yIGRlZmF1bHQgcmVxdWVzdGVkIGRldmljZSAoQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUpLCBhcHBseSB2b2x1bWUgb25seSBpZgotICAgIC8vIG5vIHNwZWNpZmljIGRldmljZSB2b2x1bWUgdmFsdWUgZXhpc3RzIGZvciBjdXJyZW50bHkgc2VsZWN0ZWQgZGV2aWNlLgotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyRGV2aWNlID0gZGVzYy0+ZGV2aWNlKCk7Ci0gICAgICAgIGZvciAoaW50IGN1clN0cmVhbSA9IDA7IGN1clN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgY3VyU3RyZWFtKyspIHsKLSAgICAgICAgICAgIGlmICghc3RyZWFtc01hdGNoRm9ydm9sdW1lKHN0cmVhbSwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCEoZGVzYy0+aXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSB8fAotICAgICAgICAgICAgICAgICAgICAoaXNJbkNhbGwoKSAmJiAoY3VyU3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGN1clN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKTsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJTdHJlYW1EZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShnZXREZXZpY2VGb3JTdHJhdGVneSgKLSAgICAgICAgICAgICAgICAgICAgY3VyU3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pKTsKLSAgICAgICAgICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FKSAmJgotICAgICAgICAgICAgICAgICAgICAoKGN1clN0cmVhbURldmljZSAmIGRldmljZSkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2wgYXBwbHlWb2x1bWU7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FKSB7Ci0gICAgICAgICAgICAgICAgY3VyU3RyZWFtRGV2aWNlIHw9IGRldmljZTsKLSAgICAgICAgICAgICAgICBhcHBseVZvbHVtZSA9IChWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShjdXJEZXZpY2UpICYgY3VyU3RyZWFtRGV2aWNlKSAhPSAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhcHBseVZvbHVtZSA9ICFtVm9sdW1lQ3VydmVzLT5oYXNWb2x1bWVJbmRleEZvckRldmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgY3VyU3RyZWFtRGV2aWNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGFwcGx5Vm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgLy9GSVhNRTogd29ya2Fyb3VuZCBmb3IgdHJ1bmNhdGVkIHRvdWNoIHNvdW5kcwotICAgICAgICAgICAgICAgIC8vIGRlbGF5ZWQgdm9sdW1lIGNoYW5nZSBmb3Igc3lzdGVtIHN0cmVhbSB0byBiZSByZW1vdmVkIHdoZW4gdGhlIHByb2JsZW0gaXMKLSAgICAgICAgICAgICAgICAvLyBoYW5kbGVkIGJ5IHN5c3RlbSBVSQotICAgICAgICAgICAgICAgIHN0YXR1c190IHZvbFN0YXR1cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja0FuZFNldFZvbHVtZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0sIGluZGV4LCBkZXNjLCBjdXJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fU1lTVEVNKSA/IFRPVUNIX1NPVU5EX0ZJWEVEX0RFTEFZX01TIDogMCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZvbFN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB2b2xTdGF0dXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7CisgICAgQUxPR1YoIiVzIGRldmljZSAlMDh4LCBpbmRleCAlZCIsIF9fRlVOQ1RJT05fXyAsIGRldmljZSwgaW5kZXgpOworICAgIHZvbHVtZUN1cnZlcy5hZGRDdXJyZW50Vm9sdW1lSW5kZXgoZGV2aWNlLCBpbmRleCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKIHsKLSAgICBpZiAoaW5kZXggPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIC8vIGlmIGRldmljZSBpcyBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSwgcmV0dXJuIHZvbHVtZSBmb3IgZGV2aWNlIHNlbGVjdGVkIGZvciB0aGlzCisgICAgLy8gc3RyZWFtIGJ5IHRoZSBlbmdpbmUuCisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSkgeworICAgICAgICBkZXZpY2UgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyLCBudWxscHRyLCB0cnVlIC8qZnJvbUNhY2hlKi8pLnR5cGVzKCk7CiAgICAgfQorICAgIHJldHVybiBnZXRWb2x1bWVJbmRleChnZXRWb2x1bWVDdXJ2ZXMoYXR0ciksIGluZGV4LCBkZXZpY2UpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFZvbHVtZUluZGV4KGNvbnN0IElWb2x1bWVDdXJ2ZXMgJmN1cnZlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKK3sKICAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICAvLyBpZiBkZXZpY2UgaXMgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUsIHJldHVybiB2b2x1bWUgZm9yIGRldmljZSBjb3JyZXNwb25kaW5nIHRvCi0gICAgLy8gdGhlIHN0cmF0ZWd5IHRoZSBzdHJlYW0gYmVsb25ncyB0by4KLSAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KGdldFN0cmF0ZWd5KHN0cmVhbSksIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgfQogICAgIGRldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7CisgICAgaW5kZXggPSBjdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKTsKKyAgICBBTE9HVigiJXM6IGRldmljZSAlMDh4IGluZGV4ICVkIiwgX19GVU5DVElPTl9fLCBkZXZpY2UsIGluZGV4KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CiAKLSAgICAqaW5kZXggPSAgbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXgoc3RyZWFtLCBkZXZpY2UpOwotICAgIEFMT0dWKCJnZXRTdHJlYW1Wb2x1bWVJbmRleCgpIHN0cmVhbSAlZCBkZXZpY2UgJTA4eCBpbmRleCAlZCIsIHN0cmVhbSwgZGV2aWNlLCAqaW5kZXgpOworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCkKK3sKKyAgICBpbmRleCA9IGdldFZvbHVtZUN1cnZlcyhhdHRyKS5nZXRWb2x1bWVJbmRleE1pbigpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCkKK3sKKyAgICBpbmRleCA9IGdldFZvbHVtZUN1cnZlcyhhdHRyKS5nZXRWb2x1bWVJbmRleE1heCgpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMjM2OCw5ICsyNjI1LDkgQEAKICAgICAvLyAzOiBUaGUgcHJpbWFyeSBvdXRwdXQKICAgICAvLyA0OiB0aGUgZmlyc3Qgb3V0cHV0IGluIHRoZSBsaXN0CiAKLSAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koQVVESU9fU1RSRUFNX01VU0lDKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBtT3V0cHV0cyk7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKSwgbnVsbHB0ciwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZXMoZGV2aWNlcywgbU91dHB1dHMpOwogCiAgICAgaWYgKG91dHB1dHMuc2l6ZSgpID09IDApIHsKICAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwpAQCAtMjM4Niw3ICsyNjQzLDcgQEAKIAogICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IG91dHB1dHMpIHsKICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICAgICAgICAgIGlmIChhY3RpdmVPbmx5ICYmICFkZXNjLT5pc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMpKSB7CisgICAgICAgICAgICBpZiAoYWN0aXZlT25seSAmJiAhZGVzYy0+aXNBY3RpdmUoc3RyZWFtVG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX01VU0lDKSkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJzZWxlY3RPdXRwdXRGb3JNdXNpY0VmZmVjdHMgYWN0aXZlT25seSAlZCBvdXRwdXQgJWQgZmxhZ3MgMHglMDh4IiwKQEAgLTI0NDEsMjQgKzI2OTgsNDYgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gbUVmZmVjdHMucmVnaXN0ZXJFZmZlY3QoZGVzYywgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7CisgICAgcmV0dXJuIG1FZmZlY3RzLnJlZ2lzdGVyRWZmZWN0KGRlc2MsIGlvLCBzZXNzaW9uLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmF0ZWd5ID09IHN0cmVhbVRvU3RyYXRlZ3koQVVESU9fU1RSRUFNX01VU0lDKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSA9PSBQUk9EVUNUX1NUUkFURUdZX05PTkUpKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK3sKKyAgICBpZiAobUVmZmVjdHMuZ2V0RWZmZWN0KGlkKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAobUVmZmVjdHMuaXNFZmZlY3RFbmFibGVkKGlkKSkgeworICAgICAgICBBTE9HVygiJXMgZWZmZWN0ICVkIGVuYWJsZWQiLCBfX0ZVTkNUSU9OX18sIGlkKTsKKyAgICAgICAgc2V0RWZmZWN0RW5hYmxlZChpZCwgZmFsc2UpOworICAgIH0KKyAgICByZXR1cm4gbUVmZmVjdHMudW5yZWdpc3RlckVmZmVjdChpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3QgPSBtRWZmZWN0cy5nZXRFZmZlY3QoaWQpOworICAgIGlmIChlZmZlY3QgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUVmZmVjdHMuc2V0RWZmZWN0RW5hYmxlZChpZCwgZW5hYmxlZCk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBtSW5wdXRzLnRyYWNrRWZmZWN0RW5hYmxlZChlZmZlY3QsIGVuYWJsZWQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewotICAgIGJvb2wgYWN0aXZlID0gZmFsc2U7Ci0gICAgZm9yIChpbnQgY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UICYmICFhY3RpdmU7IGN1clN0cmVhbSsrKSB7Ci0gICAgICAgIGlmICghc3RyZWFtc01hdGNoRm9ydm9sdW1lKHN0cmVhbSwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgYWN0aXZlID0gbU91dHB1dHMuaXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtLCBpblBhc3RNcyk7Ci0gICAgfQotICAgIHJldHVybiBhY3RpdmU7CisgICAgcmV0dXJuIG1PdXRwdXRzLmlzQWN0aXZlKHRvVm9sdW1lU291cmNlKHN0cmVhbSksIGluUGFzdE1zKTsKIH0KIAogYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewotICAgIHJldHVybiBtT3V0cHV0cy5pc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KHN0cmVhbSwgaW5QYXN0TXMpOworICAgIHJldHVybiBtT3V0cHV0cy5pc0FjdGl2ZVJlbW90ZWx5KHRvVm9sdW1lU291cmNlKHN0cmVhbSksIGluUGFzdE1zKTsKIH0KIAogYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKQEAgLTI1MDMsMzMgKzI3ODIsNDUgQEAKICAgICBzcDxId01vZHVsZT4gclN1Ym1peE1vZHVsZTsKICAgICAvLyBleGFtaW5lIGVhY2ggbWl4J3Mgcm91dGUgdHlwZQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWl4ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgLy8gd2Ugb25seSBzdXBwb3J0IE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSyBvciBNSVhfUk9VVEVfRkxBR19SRU5ERVIsIG5vdCB0aGUgY29tYmluYXRpb24KLSAgICAgICAgaWYgKChtaXhlc1tpXS5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX0FMTCkgPT0gTUlYX1JPVVRFX0ZMQUdfQUxMKSB7CisgICAgICAgIEF1ZGlvTWl4IG1peCA9IG1peGVzW2ldOworICAgICAgICAvLyBPbmx5IGNhcHR1cmUgb2YgcGxheWJhY2sgaXMgYWxsb3dlZCBpbiBMT09QX0JBQ0sgJiBSRU5ERVIgbW9kZQorICAgICAgICBpZiAoaXNfbWl4X2xvb3BiYWNrX3JlbmRlcihtaXgubVJvdXRlRmxhZ3MpICYmIG1peC5tTWl4VHlwZSAhPSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgUG9saWN5IE1peCAlenUgb2YgJXp1OiAiCisgICAgICAgICAgICAgICAgICAiT25seSBjYXB0dXJlIG9mIHBsYXliYWNrIGlzIGFsbG93ZWQgaW4gTE9PUF9CQUNLICYgUkVOREVSIG1vZGUiLAorICAgICAgICAgICAgICAgICAgIGksIG1peGVzLnNpemUoKSk7CiAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmICgobWl4ZXNbaV0ubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spID09IE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgewotICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyUG9saWN5TWl4ZXMoKSBtaXggJXp1IG9mICV6dSBpcyBMT09QX0JBQ0siLCBpLCBtaXhlcy5zaXplKCkpOworICAgICAgICAvLyBMT09QX0JBQ0sgYW5kIExPT1BfQkFDSyB8IFJFTkRFUiBoYXZlIHRoZSBzYW1lIHJlbW90ZSBzdWJtaXggYmFja2VuZCBhbmQgYXJlIGhhbmRsZWQKKyAgICAgICAgLy8gaW4gdGhlIHNhbWUgd2F5LgorICAgICAgICBpZiAoKG1peC5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgPT0gTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSB7CisgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJQb2xpY3lNaXhlcygpIG1peCAlenUgb2YgJXp1IGlzIExPT1BfQkFDSyAlZCIsIGksIG1peGVzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgIG1peC5tUm91dGVGbGFncyk7CiAgICAgICAgICAgICBpZiAoclN1Ym1peE1vZHVsZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgclN1Ym1peE1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoCiAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUkVNT1RFX1NVQk1JWCk7CiAgICAgICAgICAgICAgICAgaWYgKHJTdWJtaXhNb2R1bGUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiIFVuYWJsZSB0byBmaW5kIGF1ZGlvIG1vZHVsZSBmb3Igc3VibWl4LCBhYm9ydGluZyBtaXggJXp1IHJlZ2lzdHJhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZmluZCBhdWRpbyBtb2R1bGUgZm9yIHN1Ym1peCwgYWJvcnRpbmcgbWl4ICV6dSByZWdpc3RyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpOwogICAgICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXhlc1tpXS5tRGV2aWNlQWRkcmVzczsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peC5tRGV2aWNlQWRkcmVzczsKKyAgICAgICAgICAgIGlmIChtaXgubU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgICAgIG1peC5tRGV2aWNlVHlwZSA9IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtaXgubURldmljZVR5cGUgPSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMucmVnaXN0ZXJNaXgoYWRkcmVzcywgbWl4ZXNbaV0sIDAgLypvdXRwdXQgZGVzYyovKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCIgRXJyb3IgcmVnaXN0ZXJpbmcgbWl4ICV6dSBmb3IgYWRkcmVzcyAlcyIsIGksIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy5yZWdpc3Rlck1peChhZGRyZXNzLCBtaXgsIDAgLypvdXRwdXQgZGVzYyovKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciByZWdpc3RlcmluZyBtaXggJXp1IGZvciBhZGRyZXNzICVzIiwgaSwgYWRkcmVzcy5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdWRpb19jb25maWdfdCBvdXRwdXRDb25maWcgPSBtaXhlc1tpXS5tRm9ybWF0OwotICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgaW5wdXRDb25maWcgPSBtaXhlc1tpXS5tRm9ybWF0OworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3Qgb3V0cHV0Q29uZmlnID0gbWl4Lm1Gb3JtYXQ7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBpbnB1dENvbmZpZyA9IG1peC5tRm9ybWF0OwogICAgICAgICAgICAgLy8gTk9URTogYXVkaW8gZmxpbmdlciBtaXhlciBkb2VzIG5vdCBzdXBwb3J0IG1vbm8gb3V0cHV0OiBjb25maWd1cmUgcmVtb3RlIHN1Ym1peCBIQUwgaW4KICAgICAgICAgICAgIC8vIHN0ZXJlbyBhbmQgbGV0IGF1ZGlvIGZsaW5nZXIgZG8gdGhlIGNoYW5uZWwgY29udmVyc2lvbiBpZiBuZWVkZWQuCiAgICAgICAgICAgICBvdXRwdXRDb25maWcuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwpAQCAtMjUzOSwzMSArMjgzMCwzNyBAQAogICAgICAgICAgICAgclN1Ym1peE1vZHVsZS0+YWRkSW5wdXRQcm9maWxlKGFkZHJlc3MsICZpbnB1dENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsIGFkZHJlc3MpOwogCi0gICAgICAgICAgICBpZiAobWl4ZXNbaV0ubU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgaWYgKG1peC5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7CiAgICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAogICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCiAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgobWl4ZXNbaV0ubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19SRU5ERVIpID09IE1JWF9ST1VURV9GTEFHX1JFTkRFUikgewotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gbWl4ZXNbaV0ubURldmljZUFkZHJlc3M7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gbWl4ZXNbaV0ubURldmljZVR5cGU7CisgICAgICAgIH0gZWxzZSBpZiAoKG1peC5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX1JFTkRFUikgPT0gTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSB7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXgubURldmljZUFkZHJlc3M7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IG1peC5tRGV2aWNlVHlwZTsKICAgICAgICAgICAgIEFMT0dWKCIgcmVnaXN0ZXJQb2xpY3lNaXhlcygpIG1peCAlenUgb2YgJXp1IGlzIFJFTkRFUiwgZGV2PTB4JVggYWRkcj0lcyIsCi0gICAgICAgICAgICAgICAgICAgIGksIG1peGVzLnNpemUoKSwgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgaSwgbWl4ZXMuc2l6ZSgpLCB0eXBlLCBhZGRyZXNzLnN0cmluZygpKTsKKworICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgICAgICBtaXgubURldmljZVR5cGUsIG1peC5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgpLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYm9vbCBmb3VuZE91dHB1dCA9IGZhbHNlOwogICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDAgOyBqIDwgbU91dHB1dHMuc2l6ZSgpIDsgaisrKSB7CiAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGopOwotICAgICAgICAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUZvcihkZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoKHBhdGNoICE9IDApICYmIChwYXRjaC0+bVBhdGNoLm51bV9zaW5rcyAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBhdGNoLT5tUGF0Y2guc2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBhdGNoLT5tUGF0Y2guc2lua3NbMF0uZXh0LmRldmljZS50eXBlID09IGRldmljZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChzdHJuY21wKHBhdGNoLT5tUGF0Y2guc2lua3NbMF0uZXh0LmRldmljZS5hZGRyZXNzLCBhZGRyZXNzLnN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnJlZ2lzdGVyTWl4KGFkZHJlc3MsIG1peGVzW2ldLCBkZXNjKSAhPSBOT19FUlJPUikgeworCisgICAgICAgICAgICAgICAgaWYgKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMucmVnaXN0ZXJNaXgoYWRkcmVzcywgbWl4LCBkZXNjKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCByZWdpc3RlciBtaXggUkVOREVSLCAgZGV2PTB4JVggYWRkcj0lcyIsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRPdXRwdXQgPSB0cnVlOwpAQCAtMjU3NCwxMiArMjg3MSwxMiBAQAogCiAgICAgICAgICAgICBpZiAocmVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiBFcnJvciByZWdpc3RlcmluZyBtaXggJXp1IGZvciBkZXZpY2UgMHglWCBhZGRyICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGksIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpLCB0eXBlLCBhZGRyZXNzLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZvdW5kT3V0cHV0KSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiBPdXRwdXQgbm90IGZvdW5kIGZvciBtaXggJXp1IGZvciBkZXZpY2UgMHglWCBhZGRyICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGksIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpLCB0eXBlLCBhZGRyZXNzLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTI2MjAsMTggKzI5MTcsMTggQEAKICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpICB7CiAgICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAogICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLCBhZGRyZXNzLnN0cmluZygpKSA9PQogICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkgIHsKICAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAogICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJTdWJtaXhNb2R1bGUtPnJlbW92ZU91dHB1dFByb2ZpbGUoYWRkcmVzcyk7CiAgICAgICAgICAgICByU3VibWl4TW9kdWxlLT5yZW1vdmVJbnB1dFByb2ZpbGUoYWRkcmVzcyk7CiAKLSAgICAgICAgfSBpZiAoKG1peC5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX1JFTkRFUikgPT0gTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSB7CisgICAgICAgIH0gZWxzZSBpZiAoKG1peC5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX1JFTkRFUikgPT0gTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSB7CiAgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnVucmVnaXN0ZXJNaXgobWl4Lm1EZXZpY2VBZGRyZXNzKSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMjY0MSw1NyArMjkzOCwxMTcgQEAKICAgICByZXR1cm4gcmVzOwogfQogCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZHVtcE1hbnVhbFN1cnJvdW5kRm9ybWF0cyhTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGNvbnN0ZXhwciBzaXplX3QgYXVkaW9Gb3JtYXRQcmVmaXhMZW4gPSBzaXplb2YoIkFVRElPX0ZPUk1BVF8iKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZtdCA6IG1NYW51YWxTdXJyb3VuZEZvcm1hdHMpIHsKKyAgICAgICAgaWYgKGkrKyAhPSAwKSBkc3QtPmFwcGVuZCgiLCAiKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgc2ZtdDsKKyAgICAgICAgRm9ybWF0Q29udmVydGVyOjp0b1N0cmluZyhmbXQsIHNmbXQpOworICAgICAgICBkc3QtPmFwcGVuZChzZm10LnNpemUoKSA+PSBhdWRpb0Zvcm1hdFByZWZpeExlbiA/CisgICAgICAgICAgICAgICAgc2ZtdC5jX3N0cigpICsgYXVkaW9Gb3JtYXRQcmVmaXhMZW4gLSAxIDogc2ZtdC5jX3N0cigpKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsCisgICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgeworICAgIEFMT0dWKCIlcygpIHVpZD0lZCBudW0gZGV2aWNlcyAlenUiLCBfX0ZVTkNUSU9OX18sIHVpZCwgZGV2aWNlcy5zaXplKCkpOworICAgIC8vIHVpZC9kZXZpY2UgYWZmaW5pdHkgaXMgb25seSBmb3Igb3V0cHV0IGRldmljZXMKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZXNbaV0ubVR5cGUpKSB7CisgICAgICAgICAgICBBTE9HRSgic2V0VWlkRGV2aWNlQWZmaW5pdGllcygpIGRldmljZT0lMDh4IGlzIE5PVCBhbiBvdXRwdXQgZGV2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlc1tpXS5tVHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorICAgIHN0YXR1c190IHJlcyA9ICBtUG9saWN5TWl4ZXMuc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWQsIGRldmljZXMpOworICAgIGlmIChyZXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gcmVldmFsdWF0ZSBvdXRwdXRzIGZvciBhbGwgZ2l2ZW4gZGV2aWNlcworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlc1tpXS5tVHlwZSwgZGV2aWNlc1tpXS5tQWRkcmVzcywgU3RyaW5nOCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKKyAgICAgICAgICAgIGlmIChjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2RGVzYywgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoInNldFVpZERldmljZUFmZmluaXRpZXMoKSBlcnJvciBpbiBjaGVja091dHB1dHNGb3JEZXZpY2UgZm9yIGRldmljZT0lMDh4IgorICAgICAgICAgICAgICAgICAgICAgICAgIiBhZGRyPSVzIiwgZGV2aWNlc1tpXS5tVHlwZSwgZGV2aWNlc1tpXS5tQWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpIHsKKyAgICBBTE9HVigiJXMoKSB1aWQ9JWQiLCBfX0ZVTkNUSU9OX18sIHVpZCk7CisgICAgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+IGRldmljZXM7CisgICAgc3RhdHVzX3QgcmVzID0gIG1Qb2xpY3lNaXhlcy5nZXREZXZpY2VzRm9yVWlkKHVpZCwgZGV2aWNlcyk7CisgICAgaWYgKHJlcyA9PSBOT19FUlJPUikgeworICAgICAgICAvLyByZWV2YWx1YXRlIG91dHB1dHMgZm9yIGFsbCBmb3VuZCBkZXZpY2VzCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG1Id01vZHVsZXMuZ2V0RGV2aWNlRGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlc1tpXS5tVHlwZSwgZGV2aWNlc1tpXS5tQWRkcmVzcywgU3RyaW5nOCgpLAorICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHM7CisgICAgICAgICAgICBpZiAoY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGRldkRlc2MsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzKCkgZXJyb3IgaW4gY2hlY2tPdXRwdXRzRm9yRGV2aWNlIGZvciBkZXZpY2U9JTA4eCBhZGRyPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlc1tpXS5tVHlwZSwgZGV2aWNlc1tpXS5tQWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbkF1ZGlvUG9saWN5TWFuYWdlciBEdW1wOiAlcFxuIiwgdGhpcyk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBQcmltYXJ5IE91dHB1dDogJWRcbiIsCisgICAgICAgICAgICAgaGFzUHJpbWFyeU91dHB1dCgpID8gbVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSA6IEFVRElPX0lPX0hBTkRMRV9OT05FKTsKKyAgICBzdGQ6OnN0cmluZyBzdGF0ZUxpdGVyYWw7CisgICAgQXVkaW9Nb2RlQ29udmVydGVyOjp0b1N0cmluZyhtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCksIHN0YXRlTGl0ZXJhbCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBQaG9uZSBzdGF0ZTogJXNcbiIsIHN0YXRlTGl0ZXJhbC5jX3N0cigpKTsKKyAgICBjb25zdCBjaGFyKiBmb3JjZVVzZXNbQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlRdID0geworICAgICAgICAiY29tbXVuaWNhdGlvbnMiLCAibWVkaWEiLCAicmVjb3JkIiwgImRvY2siLCAic3lzdGVtIiwKKyAgICAgICAgIkhETUkgc3lzdGVtIGF1ZGlvIiwgImVuY29kZWQgc3Vycm91bmQgb3V0cHV0IiwgInZpYnJhdGUgcmluZ2luZyIgfTsKKyAgICBmb3IgKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCBpID0gQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OOworICAgICAgICAgaSA8IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UOyBpID0gKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCkoKGludClpICsgMSkpIHsKKyAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBmb3JjZVVzZVZhbHVlID0gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoaSk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRm9yY2UgdXNlIGZvciAlczogJWQiLCBmb3JjZVVzZXNbaV0sIGZvcmNlVXNlVmFsdWUpOworICAgICAgICBpZiAoaSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQgJiYKKyAgICAgICAgICAgICAgICBmb3JjZVVzZVZhbHVlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCkgeworICAgICAgICAgICAgZHN0LT5hcHBlbmQoIiAoTUFOVUFMOiAiKTsKKyAgICAgICAgICAgIGR1bXBNYW51YWxTdXJyb3VuZEZvcm1hdHMoZHN0KTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kKCIpIik7CisgICAgICAgIH0KKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CisgICAgfQorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgVFRTIG91dHB1dCAlc2F2YWlsYWJsZVxuIiwgbVR0c091dHB1dEF2YWlsYWJsZSA/ICIiIDogIm5vdCAiKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIE1hc3RlciBtb25vOiAlc1xuIiwgbU1hc3Rlck1vbm8gPyAib24iIDogIm9mZiIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ29uZmlnIHNvdXJjZTogJXNcbiIsIG1Db25maWcuZ2V0U291cmNlKCkuY19zdHIoKSk7IC8vIGdldENvbmZpZyBub3QgY29uc3QKKyAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiQXZhaWxhYmxlIG91dHB1dCIpKTsKKyAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCJBdmFpbGFibGUgaW5wdXQiKSk7CisgICAgbUh3TW9kdWxlc0FsbC5kdW1wKGRzdCk7CisgICAgbU91dHB1dHMuZHVtcChkc3QpOworICAgIG1JbnB1dHMuZHVtcChkc3QpOworICAgIG1FZmZlY3RzLmR1bXAoZHN0KTsKKyAgICBtQXVkaW9QYXRjaGVzLmR1bXAoZHN0KTsKKyAgICBtUG9saWN5TWl4ZXMuZHVtcChkc3QpOworICAgIG1BdWRpb1NvdXJjZXMuZHVtcChkc3QpOworCisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuUG9saWN5IEVuZ2luZSBkdW1wOlxuIik7CisgICAgbUVuZ2luZS0+ZHVtcChkc3QpOworfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmR1bXAoaW50IGZkKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5BdWRpb1BvbGljeU1hbmFnZXIgRHVtcDogJXBcbiIsIHRoaXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBQcmltYXJ5IE91dHB1dDogJWRcbiIsCi0gICAgICAgICAgICAgaGFzUHJpbWFyeU91dHB1dCgpID8gbVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSA6IEFVRElPX0lPX0hBTkRMRV9OT05FKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc3RkOjpzdHJpbmcgc3RhdGVMaXRlcmFsOwotICAgIEF1ZGlvTW9kZUNvbnZlcnRlcjo6dG9TdHJpbmcobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpLCBzdGF0ZUxpdGVyYWwpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBQaG9uZSBzdGF0ZTogJXNcbiIsIHN0YXRlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgY29tbXVuaWNhdGlvbnMgJWRcbiIsCi0gICAgICAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIG1lZGlhICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIHJlY29yZCAlZFxuIiwgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkQpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgZG9jayAlZFxuIiwgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIHN5c3RlbSAlZFxuIiwgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgaGRtaSBzeXN0ZW0gYXVkaW8gJWRcbiIsCi0gICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JjZSB1c2UgZm9yIGVuY29kZWQgc3Vycm91bmQgb3V0cHV0ICVkXG4iLAotICAgICAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBUVFMgb3V0cHV0ICVzXG4iLCBtVHRzT3V0cHV0QXZhaWxhYmxlID8gImF2YWlsYWJsZSIgOiAibm90IGF2YWlsYWJsZSIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgTWFzdGVyIG1vbm86ICVzXG4iLCBtTWFzdGVyTW9ubyA/ICJvbiIgOiAib2ZmIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCisgICAgZHVtcCgmcmVzdWx0KTsKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmR1bXAoZmQsIFN0cmluZzgoIkF2YWlsYWJsZSBvdXRwdXQiKSk7Ci0gICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5kdW1wKGZkLCBTdHJpbmc4KCJBdmFpbGFibGUgaW5wdXQiKSk7Ci0gICAgbUh3TW9kdWxlc0FsbC5kdW1wKGZkKTsKLSAgICBtT3V0cHV0cy5kdW1wKGZkKTsKLSAgICBtSW5wdXRzLmR1bXAoZmQpOwotICAgIG1Wb2x1bWVDdXJ2ZXMtPmR1bXAoZmQpOwotICAgIG1FZmZlY3RzLmR1bXAoZmQpOwotICAgIG1BdWRpb1BhdGNoZXMuZHVtcChmZCk7Ci0gICAgbVBvbGljeU1peGVzLmR1bXAoZmQpOwotCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC0yNzEyLDEyICszMDY5LDkgQEAKICAgICB9CiAKICAgICAvLyBDaGVjayBpZiBvZmZsb2FkIGhhcyBiZWVuIGRpc2FibGVkCi0gICAgY2hhciBwcm9wVmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJhdWRpby5vZmZsb2FkLmRpc2FibGUiLCBwcm9wVmFsdWUsICIwIikpIHsKLSAgICAgICAgaWYgKGF0b2kocHJvcFZhbHVlKSAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigib2ZmbG9hZCBkaXNhYmxlZCBieSBhdWRpby5vZmZsb2FkLmRpc2FibGU9JXMiLCBwcm9wVmFsdWUgKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQorICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgiYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIiwgZmFsc2UgLyogZGVmYXVsdF92YWx1ZSAqLykpIHsKKyAgICAgICAgQUxPR1YoIm9mZmxvYWQgZGlzYWJsZWQgYnkgYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvLyBDaGVjayBpZiBzdHJlYW0gdHlwZSBpcyBtdXNpYywgdGhlbiBvbmx5IGFsbG93IG9mZmxvYWQgYXMgb2Ygbm93LgpAQCAtMjczNiw5ICszMDkwLDEyIEBACiAgICAgfQogCiAgICAgLy9JZiBkdXJhdGlvbiBpcyBsZXNzIHRoYW4gbWluaW11bSB2YWx1ZSBkZWZpbmVkIGluIHByb3BlcnR5LCByZXR1cm4gZmFsc2UKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzIiwgcHJvcFZhbHVlLCBOVUxMKSkgewotICAgICAgICBpZiAob2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPCAoYXRvaShwcm9wVmFsdWUpICogMTAwMDAwMCApKSB7Ci0gICAgICAgICAgICBBTE9HVigiT2ZmbG9hZCBkZW5pZWQgYnkgZHVyYXRpb24gPCBhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzKD0lcykiLCBwcm9wVmFsdWUpOworICAgIGNvbnN0IGludCBtaW5fZHVyYXRpb25fc2VjcyA9IHByb3BlcnR5X2dldF9pbnQzMigKKyAgICAgICAgICAgICJhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzIiwgLTEgLyogZGVmYXVsdF92YWx1ZSAqLyk7CisgICAgaWYgKG1pbl9kdXJhdGlvbl9zZWNzID49IDApIHsKKyAgICAgICAgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgbWluX2R1cmF0aW9uX3NlY3MgKiAxMDAwMDAwTEwpIHsKKyAgICAgICAgICAgIEFMT0dWKCJPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MoPSVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1pbl9kdXJhdGlvbl9zZWNzKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAob2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPCBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MgKiAxMDAwMDAwKSB7CkBAIC0yNzU4LDE1ICszMTE1LDM0IEBACiAKICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYSBwcm9maWxlIHRvIHN1cHBvcnQgdGhpcy4KICAgICAvLyBBVURJT19ERVZJQ0VfTk9ORQotICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoQVVESU9fREVWSUNFX05PTkUgLyppZ25vcmUgZGV2aWNlICovLAorICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JPdXRwdXQoRGV2aWNlVmVjdG9yKCkgLyppZ25vcmUgZGV2aWNlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mby5zYW1wbGVfcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mby5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGRpcmVjdE9ubHkgKi8pOwogICAgIEFMT0dWKCJpc09mZmxvYWRTdXBwb3J0ZWQoKSBwcm9maWxlICVzZm91bmQiLCBwcm9maWxlICE9IDAgPyAiIiA6ICJOT1QgIik7CiAgICAgcmV0dXJuIChwcm9maWxlICE9IDApOwogfQogCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgeworICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG91dHB1dF9mbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CisgICAgYXVkaW9fZmxhZ3NfdG9fYXVkaW9fb3V0cHV0X2ZsYWdzKGF0dHJpYnV0ZXMuZmxhZ3MsICZvdXRwdXRfZmxhZ3MpOworICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JPdXRwdXQoRGV2aWNlVmVjdG9yKCkgLyppZ25vcmUgZGV2aWNlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBkaXJlY3RPbmx5ICovKTsKKyAgICBBTE9HVigiJXMoKSBwcm9maWxlICVzZm91bmQgd2l0aCBuYW1lOiAlcywgIgorICAgICAgICAic2FtcGxlIHJhdGU6ICV1LCBmb3JtYXQ6IDB4JXgsIGNoYW5uZWxfbWFzazogMHgleCwgb3V0cHV0IGZsYWdzOiAweCV4IiwKKyAgICAgICAgX19GVU5DVElPTl9fLCBwcm9maWxlICE9IDAgPyAiIiA6ICJOT1QgIiwKKyAgICAgICAgKHByb2ZpbGUgIT0gMCA/IHByb2ZpbGUtPmdldFRhZ05hbWUoKS5zdHJpbmcoKSA6ICJudWxsIiksCisgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSwgY29uZmlnLmZvcm1hdCwgY29uZmlnLmNoYW5uZWxfbWFzaywgb3V0cHV0X2ZsYWdzKTsKKyAgICByZXR1cm4gKHByb2ZpbGUgIT0gMCk7Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6bGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCkBAIC0yODc1LDggKzMyNTEsNyBAQAogICAgIH0KICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG51bSBzb3VyY2VzICVkIG51bSBzaW5rcyAlZCIsIHBhdGNoLT5udW1fc291cmNlcywgcGF0Y2gtPm51bV9zaW5rcyk7CiAKLSAgICBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID09IDAgfHwgcGF0Y2gtPm51bV9zb3VyY2VzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYIHx8Ci0gICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzID09IDAgfHwgcGF0Y2gtPm51bV9zaW5rcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCkgeworICAgIGlmICghYXVkaW9fcGF0Y2hfaXNfdmFsaWQocGF0Y2gpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIC8vIG9ubHkgb25lIHNvdXJjZSBwZXIgYXVkaW8gcGF0Y2ggc3VwcG9ydGVkIGZvciBub3cKQEAgLTI5NDgsOCArMzMyMyw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5tUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZEZXNjLT50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzLAorICAgICAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5tUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShEZXZpY2VWZWN0b3IoZGV2RGVzYyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLnNhbXBsZV9yYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgLy8gdXBkYXRlZFNhbXBsaW5nUmF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5mb3JtYXQsCkBAIC0yOTcwLDcgKzMzNDQsNyBAQAogICAgICAgICAvLyBUT0RPOiByZWNvbmZpZ3VyZSBvdXRwdXQgZm9ybWF0IGFuZCBjaGFubmVscyBoZXJlCiAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0dGluZyBkZXZpY2UgJTA4eCBvbiBvdXRwdXQgJWQiLAogICAgICAgICAgICAgICBkZXZpY2VzLnR5cGVzKCksIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBkZXZpY2VzLnR5cGVzKCksIHRydWUsIDAsIGhhbmRsZSk7CisgICAgICAgIHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYywgZGV2aWNlcywgdHJ1ZSwgMCwgaGFuZGxlKTsKICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKmhhbmRsZSk7CiAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgICAgICBpZiAocGF0Y2hEZXNjICE9IDAgJiYgcGF0Y2hEZXNjICE9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCkpIHsKQEAgLTI5OTksMTQgKzMzNzMsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9CiAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKLSAgICAgICAgICAgIGlmIChkZXZEZXNjID09IDApIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICghaW5wdXREZXNjLT5tUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZEZXNjLT50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+bUFkZHJlc3MsCisgICAgICAgICAgICBpZiAoIWlucHV0RGVzYy0+bVByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoRGV2aWNlVmVjdG9yKGRldmljZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLnNhbXBsZV9yYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIC8qdXBkYXRlZFNhbXBsZVJhdGUqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5mb3JtYXQsCkBAIC0zMDIwLDkgKzMzOTMsOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFRPRE86IHJlY29uZmlndXJlIG91dHB1dCBmb3JtYXQgYW5kIGNoYW5uZWxzIGhlcmUKLSAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0dGluZyBkZXZpY2UgJTA4eCBvbiBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT50eXBlKCksIGlucHV0RGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0RGVzYy0+bUlvSGFuZGxlLCBkZXZEZXNjLT50eXBlKCksIHRydWUsIGhhbmRsZSk7CisgICAgICAgICAgICBBTE9HVigiJXMoKSBzZXR0aW5nIGRldmljZSAlcyBvbiBvdXRwdXQgJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBpbnB1dERlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dERlc2MtPm1Jb0hhbmRsZSwgZGV2aWNlLCB0cnVlLCBoYW5kbGUpOwogICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKmhhbmRsZSk7CiAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCAmJiBwYXRjaERlc2MgIT0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KSkgewpAQCAtMzA0MiwxNiArMzQxNSwxNiBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZURlc2MgPQorICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlID0KICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocGF0Y2gtPnNvdXJjZXNbMF0uaWQpOwotICAgICAgICAgICAgaWYgKHNyY0RldmljZURlc2MgPT0gMCkgeworICAgICAgICAgICAgaWYgKHNyY0RldmljZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy91cGRhdGUgc291cmNlIGFuZCBzaW5rIHdpdGggb3VyIG93biBkYXRhIGFzIHRoZSBkYXRhIHBhc3NlZCBpbiB0aGUgcGF0Y2ggbWF5CiAgICAgICAgICAgICAvLyBiZSBpbmNvbXBsZXRlLgogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIG5ld1BhdGNoID0gKnBhdGNoOwotICAgICAgICAgICAgc3JjRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld1BhdGNoLnNvdXJjZXNbMF0sICZwYXRjaC0+c291cmNlc1swXSk7CisgICAgICAgICAgICBzcmNEZXZpY2UtPnRvQXVkaW9Qb3J0Q29uZmlnKCZuZXdQYXRjaC5zb3VyY2VzWzBdLCAmcGF0Y2gtPnNvdXJjZXNbMF0pOwogCiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgewogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbaV0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CkBAIC0zMDU5LDI5ICszNDMyLDI5IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzaW5rRGV2aWNlRGVzYyA9CisgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocGF0Y2gtPnNpbmtzW2ldLmlkKTsKLSAgICAgICAgICAgICAgICBpZiAoc2lua0RldmljZURlc2MgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChzaW5rRGV2aWNlID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2lua0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZuZXdQYXRjaC5zaW5rc1tpXSwgJnBhdGNoLT5zaW5rc1tpXSk7CisgICAgICAgICAgICAgICAgc2lua0RldmljZS0+dG9BdWRpb1BvcnRDb25maWcoJm5ld1BhdGNoLnNpbmtzW2ldLCAmcGF0Y2gtPnNpbmtzW2ldKTsKIAogICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHNvZnR3YXJlIGJyaWRnZSBpbiBQYXRjaFBhbmVsIGlmOgogICAgICAgICAgICAgICAgIC8vIC0gc291cmNlIGFuZCBzaW5rIGRldmljZXMgYXJlIG9uIGRpZmZlcmVudCBIVyBtb2R1bGVzIE9SCiAgICAgICAgICAgICAgICAgLy8gLSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA8IDMuMAotICAgICAgICAgICAgICAgIGlmICghc3JjRGV2aWNlRGVzYy0+aGFzU2FtZUh3TW9kdWxlQXMoc2lua0RldmljZURlc2MpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoc3JjRGV2aWNlRGVzYy0+bU1vZHVsZS0+Z2V0SGFsVmVyc2lvbk1ham9yKCkgPCAzKSkgeworICAgICAgICAgICAgICAgIC8vIC0gYXVkaW8gSEFMIHZlcnNpb24gaXMgPj0gMy4wIGJ1dCBubyByb3V0ZSBoYXMgYmVlbiBkZWNsYXJlZCBiZXR3ZWVuIGRldmljZXMKKyAgICAgICAgICAgICAgICBpZiAoIXNyY0RldmljZS0+aGFzU2FtZUh3TW9kdWxlQXMoc2lua0RldmljZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChzcmNEZXZpY2UtPmdldE1vZHVsZVZlcnNpb25NYWpvcigpIDwgMykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICFzcmNEZXZpY2UtPmdldE1vZHVsZSgpLT5zdXBwb3J0c1BhdGNoKHNyY0RldmljZSwgc2lua0RldmljZSkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBvbmx5IG9uZSBzaW5rIGRldmljZSBmb3Igbm93IHRvIHNpbXBsaWZ5IG91dHB1dCBzZWxlY3Rpb24gbG9naWMKICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5udW1fc2lua3MgPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0c0ZvckRldmljZShzaW5rRGV2aWNlRGVzYy0+dHlwZSgpLCBtT3V0cHV0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0c0ZvckRldmljZXMoRGV2aWNlVmVjdG9yKHNpbmtEZXZpY2UpLCBtT3V0cHV0cyk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzaW5rIGRldmljZSBpcyByZWFjaGFibGUgdmlhIGFuIG9wZW5lZCBvdXRwdXQgc3RyZWFtLCByZXF1ZXN0IHRvIGdvIHZpYQogICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG91dHB1dCBzdHJlYW0gYnkgYWRkaW5nIGEgc2Vjb25kIHNvdXJjZSB0byB0aGUgcGF0Y2ggZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQpOworICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cyk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKQEAgLTMwOTUsMjggKzM0NjgsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgZnJvbSByb3V0aW5nIGNhcGFiaWxpdGllcyBpbiBjb25maWcgZmlsZSBhbmQgb3RoZXIgY29uZmxpY3RpbmcgcGF0Y2hlcwogCi0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmbmV3UGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBwYXRjaCBwYW5lbCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goJm5ld1BhdGNoLCB1aWQpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IG5ld1BhdGNoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgICAgICAqaGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOwotICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnN0YWxsUGF0Y2goX19mdW5jX18sIGluZGV4LCBoYW5kbGUsICZuZXdQYXRjaCwgMCwgdWlkLCAmcGF0Y2hEZXNjKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIGNvdWxkIG5vdCBjb25uZWN0IGRldmljZSBwYXRjaCwgZXJyb3IgJWQiLAogICAgICAgICAgICAgICAgIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMzE1NiwxMSArMzUwOSwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogCi0gICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyksCi0gICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmV3T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICB9IGVsc2UgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewogICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewogICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMuZ2V0SW5wdXRGcm9tSWQocGF0Y2gtPnNpbmtzWzBdLmlkKTsKQEAgLTMyNDksMTAgKzM2MDIsMTAgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgYmFja3VwQ29uZmlnOworICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBiYWNrdXBDb25maWcgPSB7fTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvcnRDb25maWctPmFwcGx5QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZywgJmJhY2t1cENvbmZpZyk7CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbmV3Q29uZmlnOworICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbmV3Q29uZmlnID0ge307CiAgICAgICAgIGF1ZGlvUG9ydENvbmZpZy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld0NvbmZpZywgY29uZmlnKTsKICAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnNldEF1ZGlvUG9ydENvbmZpZygmbmV3Q29uZmlnLCAwKTsKICAgICB9CkBAIC0zMjgwLDMxICszNjMzLDMxIEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tTdHJhdGVneVJvdXRlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91cHR1dFRvU2tpcCkKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja1N0cmF0ZWd5Um91dGUocHJvZHVjdF9zdHJhdGVneV90IHBzLCBhdWRpb19pb19oYW5kbGVfdCBvdXB0dXRUb1NraXApCiB7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgbU91dHB1dHMpOworICAgIC8vIFRha2UgdGhlIGZpcnN0IGF0dHJpYnV0ZXMgZm9sbG93aW5nIHRoZSBwcm9kdWN0IHN0cmF0ZWd5IGFzIGl0IGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIHJvdXRlZAorICAgIC8vIGRldmljZS4gQWxsIGF0dHJpYnV0ZXMgd2loaW4gYSBzdHJhdGVneSBmb2xsb3dzIHRoZSBzYW1lICJyb3V0aW5nIHN0cmF0ZWd5IgorICAgIGF1dG8gYXR0cmlidXRlcyA9IG1FbmdpbmUtPmdldEFsbEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHMpLmZyb250KCk7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBudWxscHRyLCBmYWxzZSk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZXMoZGV2aWNlcywgbU91dHB1dHMpOwogICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbU91dHB1dHMuc2l6ZSgpOyBqKyspIHsKICAgICAgICAgaWYgKG1PdXRwdXRzLmtleUF0KGopID09IG91cHR1dFRvU2tpcCkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGopOwotICAgICAgICBpZiAoIWlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgKHJvdXRpbmdfc3RyYXRlZ3kpc3RyYXRlZ3kpKSB7CisgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShwcykpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIC8vIElmIHRoZSBkZWZhdWx0IGRldmljZSBmb3IgdGhpcyBzdHJhdGVneSBpcyBvbiBhbm90aGVyIG91dHB1dCBtaXgsCiAgICAgICAgIC8vIGludmFsaWRhdGUgYWxsIHRyYWNrcyBpbiB0aGlzIHN0cmF0ZWd5IHRvIGZvcmNlIHJlIGNvbm5lY3Rpb24uCiAgICAgICAgIC8vIE90aGVyd2lzZSBzZWxlY3QgbmV3IGRldmljZSBvbiB0aGUgb3V0cHV0IG1peC4KICAgICAgICAgaWYgKG91dHB1dHMuaW5kZXhPZihtT3V0cHV0cy5rZXlBdChqKSkgPCAwKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSkgPT0gc3RyYXRlZ3kpIHsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGF1dG8gc3RyZWFtIDogbUVuZ2luZS0+Z2V0U3RyZWFtVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHMpKSB7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oc3RyZWFtKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgbmV3RGV2aWNlLCBmYWxzZSk7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYywgZ2V0TmV3T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKSwgZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMzMxMiwxMyArMzY2NSwxOCBAQAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsZWFyU2Vzc2lvblJvdXRlcyh1aWRfdCB1aWQpCiB7CiAgICAgLy8gcmVtb3ZlIG91dHB1dCByb3V0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdWlkCi0gICAgU29ydGVkVmVjdG9yPHJvdXRpbmdfc3RyYXRlZ3k+IGFmZmVjdGVkU3RyYXRlZ2llczsKLSAgICBmb3IgKHNzaXplX3QgaSA9IChzc2l6ZV90KW1PdXRwdXRSb3V0ZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pICB7Ci0gICAgICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBtT3V0cHV0Um91dGVzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChyb3V0ZS0+bVVpZCA9PSB1aWQpIHsKLSAgICAgICAgICAgIG1PdXRwdXRSb3V0ZXMucmVtb3ZlSXRlbXNBdChpKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZS0+bURldmljZURlc2NyaXB0b3IgIT0gMCkgewotICAgICAgICAgICAgICAgIGFmZmVjdGVkU3RyYXRlZ2llcy5hZGQoZ2V0U3RyYXRlZ3kocm91dGUtPm1TdHJlYW1UeXBlKSk7CisgICAgc3RkOjp2ZWN0b3I8cHJvZHVjdF9zdHJhdGVneV90PiBhZmZlY3RlZFN0cmF0ZWdpZXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IG91dHB1dERlc2MtPmdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQtPmhhc1ByZWZlcnJlZERldmljZSgpICYmIGNsaWVudC0+dWlkKCkgPT0gdWlkKSB7CisgICAgICAgICAgICAgICAgY2xpZW50LT5zZXRQcmVmZXJyZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKyAgICAgICAgICAgICAgICBhdXRvIGNsaWVudFN0cmF0ZWd5ID0gY2xpZW50LT5zdHJhdGVneSgpOworICAgICAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQoYmVnaW4oYWZmZWN0ZWRTdHJhdGVnaWVzKSwgZW5kKGFmZmVjdGVkU3RyYXRlZ2llcyksIGNsaWVudFN0cmF0ZWd5KSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgZW5kKGFmZmVjdGVkU3RyYXRlZ2llcykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFmZmVjdGVkU3RyYXRlZ2llcy5wdXNoX2JhY2soY2xpZW50LT5zdHJhdGVneSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTMzMjksMTIgKzM2ODcsMTIgQEAKIAogICAgIC8vIHJlbW92ZSBpbnB1dCByb3V0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdWlkCiAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX3NvdXJjZV90PiBhZmZlY3RlZFNvdXJjZXM7Ci0gICAgZm9yIChzc2l6ZV90IGkgPSAoc3NpemVfdCltSW5wdXRSb3V0ZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pICB7Ci0gICAgICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBtSW5wdXRSb3V0ZXMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKHJvdXRlLT5tVWlkID09IHVpZCkgewotICAgICAgICAgICAgbUlucHV0Um91dGVzLnJlbW92ZUl0ZW1zQXQoaSk7Ci0gICAgICAgICAgICBpZiAocm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yICE9IDApIHsKLSAgICAgICAgICAgICAgICBhZmZlY3RlZFNvdXJjZXMuYWRkKHJvdXRlLT5tU291cmNlKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBpbnB1dERlc2MtPmdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQtPmhhc1ByZWZlcnJlZERldmljZSgpICYmIGNsaWVudC0+dWlkKCkgPT0gdWlkKSB7CisgICAgICAgICAgICAgICAgY2xpZW50LT5zZXRQcmVmZXJyZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKyAgICAgICAgICAgICAgICBhZmZlY3RlZFNvdXJjZXMuYWRkKGNsaWVudC0+c291cmNlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMzM0Miw3ICszNzAwLDcgQEAKICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGlucHV0c1RvQ2xvc2U7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChhZmZlY3RlZFNvdXJjZXMuaW5kZXhPZihpbnB1dERlc2MtPmlucHV0U291cmNlKCkpID49IDApIHsKKyAgICAgICAgaWYgKGFmZmVjdGVkU291cmNlcy5pbmRleE9mKGlucHV0RGVzYy0+c291cmNlKCkpID49IDApIHsKICAgICAgICAgICAgIGlucHV0c1RvQ2xvc2UuYWRkKGlucHV0RGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgfQogICAgIH0KQEAgLTMzNTQsOCArMzcxMiw4IEBACiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xlYXJBdWRpb1NvdXJjZXModWlkX3QgdWlkKQogewogICAgIGZvciAoc3NpemVfdCBpID0gKHNzaXplX3QpbUF1ZGlvU291cmNlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgIHsKLSAgICAgICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoc291cmNlRGVzYy0+bVVpZCA9PSB1aWQpIHsKKyAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKHNvdXJjZURlc2MtPnVpZCgpID09IHVpZCkgewogICAgICAgICAgICAgc3RvcEF1ZGlvU291cmNlKG1BdWRpb1NvdXJjZXMua2V5QXQoaSkpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzM2Nyw4NyArMzcyNSwxMTAgQEAKIHsKICAgICAqc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpbXBDbGllbnRJbnRlcmZhY2UtPm5ld0F1ZGlvVW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9TRVNTSU9OKTsKICAgICAqaW9IYW5kbGUgPSAoYXVkaW9faW9faGFuZGxlX3QpbXBDbGllbnRJbnRlcmZhY2UtPm5ld0F1ZGlvVW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9JTlBVVCk7Ci0gICAgKmRldmljZSA9IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKEFVRElPX1NPVVJDRV9IT1RXT1JEKTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IHsgLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9IT1RXT1JEIH07CisgICAgKmRldmljZSA9IG1FbmdpbmUtPmdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcyhhdHRyKS0+dHlwZSgpOwogCiAgICAgcmV0dXJuIG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5hY3F1aXJlU2Vzc2lvbigqc2Vzc2lvbiwgKmlvSGFuZGxlKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKIHsKLSAgICBBTE9HVigiJXMgc291cmNlICVwIGF0dHJpYnV0ZXMgJXAgaGFuZGxlICVwIiwgX19GVU5DVElPTl9fLCBzb3VyY2UsIGF0dHJpYnV0ZXMsIGhhbmRsZSk7Ci0gICAgaWYgKHNvdXJjZSA9PSBOVUxMIHx8IGF0dHJpYnV0ZXMgPT0gTlVMTCB8fCBoYW5kbGUgPT0gTlVMTCkgeworICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgKnBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisKKyAgICBpZiAoc291cmNlID09IE5VTEwgfHwgYXR0cmlidXRlcyA9PSBOVUxMIHx8IHBvcnRJZCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCIlcyBpbnZhbGlkIGFyZ3VtZW50OiBzb3VyY2UgJXAgYXR0cmlidXRlcyAlcCBoYW5kbGUgJXAiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNvdXJjZSwgYXR0cmlidXRlcywgcG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICAqaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0KICAgICBpZiAoc291cmNlLT5yb2xlICE9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgfHwKICAgICAgICAgICAgIHNvdXJjZS0+dHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgIEFMT0dWKCIlcyBJTlZBTElEX09QRVJBVElPTiBzb3VyY2UtPnJvbGUgJWQgc291cmNlLT50eXBlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2UtPnJvbGUsIHNvdXJjZS0+dHlwZSk7CisgICAgICAgIEFMT0dXKCIlcyBJTlZBTElEX09QRVJBVElPTiBzb3VyY2UtPnJvbGUgJWQgc291cmNlLT50eXBlICVkIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzb3VyY2UtPnJvbGUsIHNvdXJjZS0+dHlwZSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2VEZXNjID0KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2UgPQogICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2Uoc291cmNlLT5leHQuZGV2aWNlLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChzb3VyY2UtPmV4dC5kZXZpY2UuYWRkcmVzcykpOwotICAgIGlmIChzcmNEZXZpY2VEZXNjID09IDApIHsKLSAgICAgICAgQUxPR1YoIiVzIHNvdXJjZS0+ZXh0LmRldmljZS50eXBlICUwOHggbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCBzb3VyY2UtPmV4dC5kZXZpY2UudHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHNvdXJjZS0+ZXh0LmRldmljZS5hZGRyZXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICBpZiAoc3JjRGV2aWNlID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzIHNvdXJjZS0+ZXh0LmRldmljZS50eXBlICUwOHggbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCBzb3VyY2UtPmV4dC5kZXZpY2UudHlwZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlRGVzYyA9Ci0gICAgICAgICAgICBuZXcgQXVkaW9Tb3VyY2VEZXNjcmlwdG9yKHNyY0RldmljZURlc2MsIGF0dHJpYnV0ZXMsIHVpZCk7CiAKLSAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggZHVtbXlQYXRjaDsKKyAgICAqcG9ydElkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKKworICAgIHN0cnVjdCBhdWRpb19wYXRjaCBkdW1teVBhdGNoID0ge307CiAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goJmR1bW15UGF0Y2gsIHVpZCk7Ci0gICAgc291cmNlRGVzYy0+bVBhdGNoRGVzYyA9IHBhdGNoRGVzYzsKKworICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZURlc2MgPQorICAgICAgICBuZXcgU291cmNlQ2xpZW50RGVzY3JpcHRvcigqcG9ydElkLCB1aWQsICphdHRyaWJ1dGVzLCBwYXRjaERlc2MsIHNyY0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoKmF0dHJpYnV0ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKCphdHRyaWJ1dGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Wb2x1bWVTb3VyY2UoKmF0dHJpYnV0ZXMpKTsKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3RBdWRpb1NvdXJjZShzb3VyY2VEZXNjKTsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1BdWRpb1NvdXJjZXMuYWRkKHNvdXJjZURlc2MtPmdldEhhbmRsZSgpLCBzb3VyY2VEZXNjKTsKLSAgICAgICAgKmhhbmRsZSA9IHNvdXJjZURlc2MtPmdldEhhbmRsZSgpOworICAgICAgICBtQXVkaW9Tb3VyY2VzLmFkZCgqcG9ydElkLCBzb3VyY2VEZXNjKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiYgc291cmNlRGVzYykKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQogewotICAgIEFMT0dWKCIlcyBoYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPmdldEhhbmRsZSgpKTsKKyAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CiAKICAgICAvLyBtYWtlIHN1cmUgd2Ugb25seSBoYXZlIG9uZSBwYXRjaCBwZXIgc291cmNlLgogICAgIGRpc2Nvbm5lY3RBdWRpb1NvdXJjZShzb3VyY2VEZXNjKTsKIAotICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSAocm91dGluZ19zdHJhdGVneSkgZ2V0U3RyYXRlZ3lGb3JBdHRyKCZzb3VyY2VEZXNjLT5tQXR0cmlidXRlcyk7Ci0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoJnNvdXJjZURlc2MtPm1BdHRyaWJ1dGVzKTsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2VEZXNjID0gc291cmNlRGVzYy0+bURldmljZTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHNvdXJjZURlc2MtPmF0dHJpYnV0ZXMoKTsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHNvdXJjZURlc2MtPnN0cmVhbSgpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZSA9IHNvdXJjZURlc2MtPnNyY0RldmljZSgpOwogCi0gICAgYXVkaW9fZGV2aWNlc190IHNpbmtEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgdHJ1ZSk7Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZURlc2MgPQotICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKHNpbmtEZXZpY2UsIFN0cmluZzgoIiIpKTsKKyAgICBEZXZpY2VWZWN0b3Igc2lua0RldmljZXMgPQorICAgICAgICAgICAgbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgbnVsbHB0ciwgdHJ1ZSk7CisgICAgQUxPR19BU1NFUlQoIXNpbmtEZXZpY2VzLmlzRW1wdHkoKSwgImNvbm5lY3RBdWRpb1NvdXJjZSgpOiBubyBkZXZpY2UgZm91bmQgZm9yIGF0dHJpYnV0ZXMiKTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzaW5rRGV2aWNlID0gc2lua0RldmljZXMuaXRlbUF0KDApOworICAgIEFMT0dfQVNTRVJUKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNvbnRhaW5zKHNpbmtEZXZpY2UpLCAiJXM6IERldmljZSAlcyBub3QgYXZhaWxhYmxlIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNpbmtEZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCA9ICZzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjLT5tUGF0Y2g7CiAKLSAgICBpZiAoc3JjRGV2aWNlRGVzYy0+Z2V0QXVkaW9Qb3J0KCktPm1Nb2R1bGUtPmdldEhhbmRsZSgpID09Ci0gICAgICAgICAgICBzaW5rRGV2aWNlRGVzYy0+Z2V0QXVkaW9Qb3J0KCktPm1Nb2R1bGUtPmdldEhhbmRsZSgpICYmCi0gICAgICAgICAgICBzcmNEZXZpY2VEZXNjLT5nZXRBdWRpb1BvcnQoKS0+bU1vZHVsZS0+Z2V0SGFsVmVyc2lvbk1ham9yKCkgPj0gMyAmJgotICAgICAgICAgICAgc3JjRGV2aWNlRGVzYy0+Z2V0QXVkaW9Qb3J0KCktPm1HYWlucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIEFMT0dWKCIlcyBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wIiwgX19GVU5DVElPTl9fKTsKKyAgICBpZiAoc3JjRGV2aWNlLT5oYXNTYW1lSHdNb2R1bGVBcyhzaW5rRGV2aWNlKSAmJgorICAgICAgICAgICAgc3JjRGV2aWNlLT5nZXRNb2R1bGVWZXJzaW9uTWFqb3IoKSA+PSAzICYmCisgICAgICAgICAgICBzaW5rRGV2aWNlLT5nZXRNb2R1bGUoKS0+c3VwcG9ydHNQYXRjaChzcmNEZXZpY2UsIHNpbmtEZXZpY2UpICYmCisgICAgICAgICAgICBzcmNEZXZpY2UtPmdldEF1ZGlvUG9ydCgpLT5tR2FpbnMuc2l6ZSgpID4gMCkgeworICAgICAgICBBTE9HVigiJXMgRGV2aWNlIHRvIERldmljZSByb3V0ZSBzdXBwb3J0ZWQgYnkgPj0zLjAgSEFMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgLy8gVE9ETzogbWF5IGV4cGxpY2l0bHkgc3BlY2lmeSB3aGV0aGVyIHdlIHNob3VsZCB1c2UgSFcgb3IgU1cgcGF0Y2gKICAgICAgICAgLy8gICBjcmVhdGUgcGF0Y2ggYmV0d2VlbiBzcmMgZGV2aWNlIGFuZCBvdXRwdXQgZGV2aWNlCiAgICAgICAgIC8vICAgY3JlYXRlIEh3b3V0cHV0IGFuZCBhZGQgdG8gbUh3T3V0cHV0cwogICAgIH0gZWxzZSB7Ci0gICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2Uoc2lua0RldmljZSwgbU91dHB1dHMpOwotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPQotICAgICAgICAgICAgICAgIHNlbGVjdE91dHB1dChvdXRwdXRzLCBBVURJT19PVVRQVVRfRkxBR19OT05FLCBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCByZXN1bHRBdHRyOworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBzb3VyY2VEZXNjLT5jb25maWcoKS5zYW1wbGVfcmF0ZTsKKyAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IHNvdXJjZURlc2MtPmNvbmZpZygpLmNoYW5uZWxfbWFzazsKKyAgICAgICAgY29uZmlnLmZvcm1hdCA9IHNvdXJjZURlc2MtPmNvbmZpZygpLmZvcm1hdDsKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICBib29sIGlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlID0gZmFsc2U7CisgICAgICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gc2Vjb25kYXJ5T3V0cHV0czsKKyAgICAgICAgZ2V0T3V0cHV0Rm9yQXR0ckludCgmcmVzdWx0QXR0ciwgJm91dHB1dCwgQVVESU9fU0VTU0lPTl9OT05FLAorICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzLCAmc3RyZWFtLCBzb3VyY2VEZXNjLT51aWQoKSwgJmNvbmZpZywgJmZsYWdzLAorICAgICAgICAgICAgICAgICZzZWxlY3RlZERldmljZUlkLCAmaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UsCisgICAgICAgICAgICAgICAgJnNlY29uZGFyeU91dHB1dHMpOwogICAgICAgICBpZiAob3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgbm8gb3V0cHV0IGZvciBkZXZpY2UgJTA4eCIsIF9fRlVOQ1RJT05fXywgc2lua0RldmljZSk7CisgICAgICAgICAgICBBTE9HVigiJXMgbm8gb3V0cHV0IGZvciBkZXZpY2UgJTA4eCIsIF9fRlVOQ1RJT05fXywgc2lua0RldmljZXMudHlwZXMoKSk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwogICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IGlzIGR1cGxpY2F0ZWQiLCBfX0ZVTkNUSU9OX18sIHNpbmtEZXZpY2UpOworICAgICAgICAgICAgQUxPR1YoIiVzIG91dHB1dCBmb3IgZGV2aWNlICUwOHggaXMgZHVwbGljYXRlZCIsIF9fRlVOQ1RJT05fXywgc2lua0RldmljZXMudHlwZXMoKSk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0RGVzYy0+c3RhcnQoKTsKQEAgLTM0NjAsNTEgKzM4NDEsNTYgQEAKICAgICAgICAgLy8gYmUgY29ubmVjdGVkIGFzIHdlbGwgYXMgdGhlIHN0cmVhbSB0eXBlIGZvciB2b2x1bWUgY29udHJvbAogICAgICAgICAvLyAtIHRoZSBzaW5rIGlzIGRlZmluZWQgYnkgd2hhdGV2ZXIgb3V0cHV0IGRldmljZSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgZm9yIHRoZSBvdXRwdXQKICAgICAgICAgLy8gdGhvdWdoIHdoaWNoIHRoaXMgcGF0Y2ggaXMgcm91dGVkLgotICAgICAgICBwYXRjaC0+bnVtX3NpbmtzID0gMDsKLSAgICAgICAgcGF0Y2gtPm51bV9zb3VyY2VzID0gMjsKLSAgICAgICAgc3JjRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLT5zb3VyY2VzWzBdLCBOVUxMKTsKLSAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLT5zb3VyY2VzWzFdLCBOVUxMKTsKLSAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IHN0cmVhbTsKLSAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gsCisgICAgICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CisgICAgICAgIHBhdGNoQnVpbGRlci5hZGRTb3VyY2Uoc3JjRGV2aWNlKS5hZGRTb3VyY2Uob3V0cHV0RGVzYywgeyAuc3RyZWFtID0gc3RyZWFtIH0pOworICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaEJ1aWxkZXIucGF0Y2goKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwogICAgICAgICBBTE9HVigiJXMgcGF0Y2ggcGFuZWwgcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSk7CisgICAgICAgIHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tUGF0Y2ggPSAqcGF0Y2hCdWlsZGVyLnBhdGNoKCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIEFMT0dXKCIlcyBwYXRjaCBwYW5lbCBjb3VsZCBub3QgY29ubmVjdCBkZXZpY2UgcGF0Y2gsIGVycm9yICVkIiwKICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQorCisgICAgICAgIGlmIChvdXRwdXREZXNjLT5nZXRDbGllbnQoc291cmNlRGVzYy0+cG9ydElkKCkpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyBzb3VyY2UgcG9ydElkIGhhcyBhbHJlYWR5IGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0RGVzYyIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXREZXNjLT5hZGRDbGllbnQoc291cmNlRGVzYyk7CisKICAgICAgICAgdWludDMyX3QgZGVsYXlNcyA9IDA7Ci0gICAgICAgIHN0YXR1cyA9IHN0YXJ0U291cmNlKG91dHB1dERlc2MsIHN0cmVhbSwgc2lua0RldmljZSwgTlVMTCwgJmRlbGF5TXMpOworICAgICAgICBzdGF0dXMgPSBzdGFydFNvdXJjZShvdXRwdXREZXNjLCBzb3VyY2VEZXNjLCAmZGVsYXlNcyk7CiAKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHNvdXJjZURlc2MtPm1QYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChzb3VyY2VEZXNjLT5wYXRjaERlc2MoKS0+bUFmUGF0Y2hIYW5kbGUsIDApOwogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQotICAgICAgICBzb3VyY2VEZXNjLT5tU3dPdXRwdXQgPSBvdXRwdXREZXNjOworICAgICAgICBzb3VyY2VEZXNjLT5zZXRTd091dHB1dChvdXRwdXREZXNjKTsKICAgICAgICAgaWYgKGRlbGF5TXMgIT0gMCkgewogICAgICAgICAgICAgdXNsZWVwKGRlbGF5TXMgKiAxMDAwKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHNvdXJjZURlc2MtPm1QYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICBhZGRBdWRpb1BhdGNoKHNvdXJjZURlc2MtPm1QYXRjaERlc2MtPm1IYW5kbGUsIHNvdXJjZURlc2MtPm1QYXRjaERlc2MpOworICAgIHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgYWRkQXVkaW9QYXRjaChzb3VyY2VEZXNjLT5wYXRjaERlc2MoKS0+bUhhbmRsZSwgc291cmNlRGVzYy0+cGF0Y2hEZXNjKCkpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgX191bnVzZWQpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlRm9yKGhhbmRsZSk7Ci0gICAgQUxPR1YoIiVzIGhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywgaGFuZGxlKTsKKyAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUZvcihwb3J0SWQpOworICAgIEFMT0dWKCIlcyBwb3J0IElEICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwogICAgIGlmIChzb3VyY2VEZXNjID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzIHVua25vd24gc291cmNlIGZvciBoYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sIGhhbmRsZSk7CisgICAgICAgIEFMT0dXKCIlcyB1bmtub3duIHNvdXJjZSBmb3IgcG9ydCBJRCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGlzY29ubmVjdEF1ZGlvU291cmNlKHNvdXJjZURlc2MpOwogCi0gICAgbUF1ZGlvU291cmNlcy5yZW1vdmVJdGVtKGhhbmRsZSk7CisgICAgbUF1ZGlvU291cmNlcy5yZW1vdmVJdGVtKHBvcnRJZCk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzU0OSw1MSArMzkzNSw3IEBACiBmbG9hdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmVhbVZvbHVtZURCKAogICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQogewotICAgIHJldHVybiBjb21wdXRlVm9sdW1lKHN0cmVhbSwgaW5kZXgsIGRldmljZSk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3VwcG9ydGVkRm9ybWF0cyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXRWZWN0b3ImIGZvcm1hdHMpIHsKLSAgICBpZiAoaW9IYW5kbGUgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgU3RyaW5nOCByZXBseTsKLSAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKAotICAgICAgICAgICAgaW9IYW5kbGUsIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZEZvcm1hdHMpKTsKLSAgICBBTE9HVigiJXM6IHN1cHBvcnRlZCBmb3JtYXRzICVzIiwgX19GVU5DVElPTl9fLCByZXBseS5zdHJpbmcoKSk7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcmVwbGllZFBhcmFtZXRlcnMocmVwbHkpOwotICAgIGlmIChyZXBsaWVkUGFyYW1ldGVycy5nZXQoCi0gICAgICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRGb3JtYXRzKSwgcmVwbHkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIHJldHJpZXZlIGZvcm1hdCwgYmFpbGluZyBvdXQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBmb3IgKGF1dG8gZm9ybWF0IDogZm9ybWF0c0Zyb21TdHJpbmcocmVwbHkuc3RyaW5nKCkpKSB7Ci0gICAgICAgIC8vIE9ubHkgQVVESU9fRk9STUFUX0FBQ19MQyB3aWxsIGJlIHVzZWQgaW4gU2V0dGluZ3MgVUkgZm9yIGFsbCBBQUMgZm9ybWF0cy4KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKEFBQ19GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZm9ybWF0ID09IEFBQ19GT1JNQVRTW2ldKSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX0FBQ19MQzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBib29sIGV4aXN0ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZm9ybWF0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBmb3JtYXRzW2ldKSB7Ci0gICAgICAgICAgICAgICAgZXhpc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJvb2wgaXNTdXJyb3VuZEZvcm1hdCA9IGZhbHNlOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoU1VSUk9VTkRfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgaWYgKFNVUlJPVU5EX0ZPUk1BVFNbaV0gPT0gZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgaXNTdXJyb3VuZEZvcm1hdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFleGlzdCAmJiBpc1N1cnJvdW5kRm9ybWF0KSB7Ci0gICAgICAgICAgICBmb3JtYXRzLmFkZChmb3JtYXQpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gY29tcHV0ZVZvbHVtZShnZXRWb2x1bWVDdXJ2ZXMoc3RyZWFtKSwgdG9Wb2x1bWVTb3VyY2Uoc3RyZWFtKSwgaW5kZXgsIGRldmljZSk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3Vycm91bmRGb3JtYXRzKHVuc2lnbmVkIGludCAqbnVtU3Vycm91bmRGb3JtYXRzLApAQCAtMzYwNSwyNjEgKzM5NDcsMTk5IEBACiAgICAgICAgICAgICAoc3Vycm91bmRGb3JtYXRzID09IE5VTEwgfHwgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCA9PSBOVUxMKSkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgQUxPR1YoImdldFN1cnJvdW5kRm9ybWF0cygpIG51bVN1cnJvdW5kRm9ybWF0cyAlZCBzdXJyb3VuZEZvcm1hdHMgJXAgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCAlcCIsCi0gICAgICAgICAgICAqbnVtU3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHMsIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQpOwotCi0gICAgLy8gT25seSByZXR1cm4gdmFsdWUgaWYgdGhlcmUgaXMgSERNSSBvdXRwdXQuCi0gICAgaWYgKChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX09VVF9IRE1JKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9CisgICAgQUxPR1YoIiVzKCkgbnVtU3Vycm91bmRGb3JtYXRzICVkIHN1cnJvdW5kRm9ybWF0cyAlcCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkICVwIHJlcG9ydGVkICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCAqbnVtU3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHMsIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQsIHJlcG9ydGVkKTsKIAogICAgIHNpemVfdCBmb3JtYXRzV3JpdHRlbiA9IDA7CiAgICAgc2l6ZV90IGZvcm1hdHNNYXggPSAqbnVtU3Vycm91bmRGb3JtYXRzOwotICAgICpudW1TdXJyb3VuZEZvcm1hdHMgPSAwOwotICAgIEZvcm1hdFZlY3RvciBmb3JtYXRzOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gZm9ybWF0czsgLy8gVXNlcyBwcmltYXJ5IHN1cnJvdW5kIGZvcm1hdHMgb25seQogICAgIGlmIChyZXBvcnRlZCkgewotICAgICAgICAvLyBPbmx5IGdldCBzdXJyb3VuZCBmb3JtYXRzIHdoaWNoIGFyZSByZXBvcnRlZCBieSBkZXZpY2UuCi0gICAgICAgIC8vIEZpcnN0IGxpc3QgYWxyZWFkeSBvcGVuIG91dHB1dHMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0hETUk7Ci0gICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKLSAgICAgICAgYm9vbCByZXBvcnRlZEZvcm1hdEZvdW5kID0gZmFsc2U7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1czsKLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2M7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiAoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpICYgZGV2aWNlKSkgewotICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBPcGVuIGFuIG91dHB1dCB0byBxdWVyeSBkeW5hbWljIHBhcmFtZXRlcnMuCi0gICAgICAgIERldmljZVZlY3RvciBoZG1pT3V0cHV0RGV2aWNlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSgKLSAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0hETUkpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhkbWlPdXRwdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBoZG1pT3V0cHV0RGV2aWNlc1tpXS0+bUFkZHJlc3M7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKClbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0RGV2aWNlKEFVRElPX0RFVklDRV9PVVRfSERNSSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5zdXBwb3J0RGV2aWNlQWRkcmVzcyhhZGRyZXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3V0cHV0cy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXRzLml0ZW1BdChqKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiBkZXNjLT5tUHJvZmlsZSA9PSBwcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqICE9IG91dHB1dHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZ2V0U3VwcG9ydGVkRm9ybWF0cyhvdXRwdXRzLml0ZW1BdChqKSwgZm9ybWF0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWRGb3JtYXRGb3VuZCB8PSAoc3RhdHVzID09IE5PX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9maWxlLT5jYW5PcGVuTmV3SW8oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJNYXggT3V0cHV0IG51bWJlciAldSBhbHJlYWR5IG9wZW5lZCBmb3IgdGhpcyBwcm9maWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tYXhPcGVuQ291bnQsIHByb2ZpbGUtPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm9wZW5pbmcgb3V0cHV0IGZvciBkZXZpY2UgJTA4eCB3aXRoIHBhcmFtcyAlcyBwcm9maWxlICVwIG5hbWUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpLCBwcm9maWxlLmdldCgpLCBwcm9maWxlLT5nZXROYW1lKCkuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyA9IG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihwcm9maWxlLCBtcENsaWVudEludGVyZmFjZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2MtPm9wZW4obnVsbHB0ciwgZGV2aWNlLCBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBnZXRTdXBwb3J0ZWRGb3JtYXRzKG91dHB1dCwgZm9ybWF0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWRGb3JtYXRGb3VuZCB8PSAoc3RhdHVzID09IE5PX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAvLyBSZXR1cm4gZm9ybWF0cyBmcm9tIGFsbCBkZXZpY2UgcHJvZmlsZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiByZXNvbHZlZCBieQorICAgICAgICAvLyBjaGVja091dHB1dHNGb3JEZXZpY2UoKS4KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV07CisgICAgICAgICAgICBGb3JtYXRWZWN0b3Igc3VwcG9ydGVkRm9ybWF0cyA9CisgICAgICAgICAgICAgICAgICAgIGRldmljZS0+Z2V0QXVkaW9Qb3J0KCktPmdldEF1ZGlvUHJvZmlsZXMoKS5nZXRTdXBwb3J0ZWRGb3JtYXRzKCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHN1cHBvcnRlZEZvcm1hdHMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKS5jb3VudChzdXBwb3J0ZWRGb3JtYXRzW2pdKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuaW5zZXJ0KHN1cHBvcnRlZEZvcm1hdHNbal0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWlyLnNlY29uZC5jb3VudChzdXBwb3J0ZWRGb3JtYXRzW2pdKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy5pbnNlcnQocGFpci5maXJzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBpZiAoIXJlcG9ydGVkRm9ybWF0Rm91bmQpIHsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKFNVUlJPVU5EX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgIGZvcm1hdHMuYWRkKFNVUlJPVU5EX0ZPUk1BVFNbaV0pOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpKSB7CisgICAgICAgICAgICBmb3JtYXRzLmluc2VydChwYWlyLmZpcnN0KTsKICAgICAgICAgfQogICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAqbnVtU3Vycm91bmRGb3JtYXRzID0gZm9ybWF0cy5zaXplKCk7CisgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBmb3JjZVVzZSA9IG1FbmdpbmUtPmdldEZvcmNlVXNlKAorICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZvcm1hdDogZm9ybWF0cykgewogICAgICAgICBpZiAoZm9ybWF0c1dyaXR0ZW4gPCBmb3JtYXRzTWF4KSB7Ci0gICAgICAgICAgICBzdXJyb3VuZEZvcm1hdHNbZm9ybWF0c1dyaXR0ZW5dID0gZm9ybWF0c1tpXTsKLSAgICAgICAgICAgIGJvb2wgZm9ybWF0RW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGZvcm1hdHNbaV0gPT0gQVVESU9fRk9STUFUX0FBQ19MQykgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGorKykgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXRFbmFibGVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmZpbmQoQUFDX0ZPUk1BVFNbaV0pICE9IG1TdXJyb3VuZEZvcm1hdHMuZW5kKCk7CisgICAgICAgICAgICBzdXJyb3VuZEZvcm1hdHNbZm9ybWF0c1dyaXR0ZW5dID0gZm9ybWF0OworICAgICAgICAgICAgYm9vbCBmb3JtYXRFbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHN3aXRjaCAoZm9yY2VVc2UpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTDoKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0RW5hYmxlZCA9IG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuY291bnQoZm9ybWF0KSAhPSAwOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvcm1hdEVuYWJsZWQgPSBtU3Vycm91bmRGb3JtYXRzLmZpbmQoZm9ybWF0c1tpXSkgIT0gbVN1cnJvdW5kRm9ybWF0cy5lbmQoKTsKKyAgICAgICAgICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX05FVkVSOgorICAgICAgICAgICAgICAgICAgICBmb3JtYXRFbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8vIEFVVE8gb3IgQUxXQVlTID0+IHRydWUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdXJyb3VuZEZvcm1hdHNFbmFibGVkW2Zvcm1hdHNXcml0dGVuKytdID0gZm9ybWF0RW5hYmxlZDsKICAgICAgICAgfQotICAgICAgICAoKm51bVN1cnJvdW5kRm9ybWF0cykrKzsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKQogewotICAgIC8vIENoZWNrIGlmIGF1ZGlvIGZvcm1hdCBpcyBhIHN1cnJvdW5kIGZvcm1hdHMuCi0gICAgYm9vbCBpc1N1cnJvdW5kRm9ybWF0ID0gZmFsc2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKFNVUlJPVU5EX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgaWYgKGF1ZGlvRm9ybWF0ID09IFNVUlJPVU5EX0ZPUk1BVFNbaV0pIHsKLSAgICAgICAgICAgIGlzU3Vycm91bmRGb3JtYXQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFpc1N1cnJvdW5kRm9ybWF0KSB7CisgICAgQUxPR1YoIiVzKCkgZm9ybWF0IDB4JVggZW5hYmxlZCAlZCIsIF9fZnVuY19fLCBhdWRpb0Zvcm1hdCwgZW5hYmxlZCk7CisgICAgY29uc3QgYXV0byYgZm9ybWF0SXRlciA9IG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkuZmluZChhdWRpb0Zvcm1hdCk7CisgICAgaWYgKGZvcm1hdEl0ZXIgPT0gbUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKS5lbmQoKSkgeworICAgICAgICBBTE9HVygiJXMoKSBmb3JtYXQgMHglWCBpcyBub3QgYSBrbm93biBzdXJyb3VuZCBmb3JtYXQiLCBfX2Z1bmNfXywgYXVkaW9Gb3JtYXQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIC8vIFNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIE1BTlVBTC4KLSAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlID0gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoCi0gICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EKTsKLSAgICBpZiAoZm9yY2VVc2UgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTUFOVUFMKSB7CisgICAgaWYgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCkgIT0KKyAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCkgeworICAgICAgICBBTE9HVygiJXMoKSBub3QgaW4gbWFudWFsIG1vZGUgZm9yIHN1cnJvdW5kIHNvdW5kIGZvcm1hdCBzZWxlY3Rpb24iLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBpZiAoKG1TdXJyb3VuZEZvcm1hdHMuZmluZChhdWRpb0Zvcm1hdCkgIT0gbVN1cnJvdW5kRm9ybWF0cy5lbmQoKSAmJiBlbmFibGVkKQotICAgICAgICAgICAgfHwgKG1TdXJyb3VuZEZvcm1hdHMuZmluZChhdWRpb0Zvcm1hdCkgPT0gbVN1cnJvdW5kRm9ybWF0cy5lbmQoKSAmJiAhZW5hYmxlZCkpIHsKKyAgICBpZiAoKG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuY291bnQoYXVkaW9Gb3JtYXQpICE9IDApID09IGVuYWJsZWQpIHsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIAotICAgIC8vIFRoZSBvcGVyYXRpb24gaXMgdmFsaWQgb25seSB3aGVuIHRoZXJlIGlzIEhETUkgb3V0cHV0IGF2YWlsYWJsZS4KLSAgICBpZiAoKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfT1VUX0hETUkpID09IDApIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQorICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gc3Vycm91bmRGb3JtYXRzQmFja3VwKG1NYW51YWxTdXJyb3VuZEZvcm1hdHMpOwogICAgIGlmIChlbmFibGVkKSB7Ci0gICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfQUFDX0xDKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmluc2VydChBQUNfRk9STUFUU1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmluc2VydChhdWRpb0Zvcm1hdCk7CisgICAgICAgIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KGF1ZGlvRm9ybWF0KTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdWJGb3JtYXQgOiBmb3JtYXRJdGVyLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KHN1YkZvcm1hdCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0FBQ19MQykgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKEFBQ19GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5lcmFzZShBQUNfRk9STUFUU1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmVyYXNlKGF1ZGlvRm9ybWF0KTsKKyAgICAgICAgbU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5lcmFzZShhdWRpb0Zvcm1hdCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgc3ViRm9ybWF0IDogZm9ybWF0SXRlci0+c2Vjb25kKSB7CisgICAgICAgICAgICBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmVyYXNlKHN1YkZvcm1hdCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYzsKICAgICBib29sIHByb2ZpbGVVcGRhdGVkID0gZmFsc2U7Ci0gICAgRGV2aWNlVmVjdG9yIGhkbWlPdXRwdXREZXZpY2VzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKAorICAgIERldmljZVZlY3RvciBoZG1pT3V0cHV0RGV2aWNlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soCiAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0hETUkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGRtaU91dHB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgLy8gU2ltdWxhdGUgcmVjb25uZWN0aW9uIHRvIHVwZGF0ZSBlbmFibGVkIHN1cnJvdW5kIHNvdW5kIGZvcm1hdHMuCi0gICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGhkbWlPdXRwdXREZXZpY2VzW2ldLT5tQWRkcmVzczsKKyAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaGRtaU91dHB1dERldmljZXNbaV0tPmFkZHJlc3MoKTsKICAgICAgICAgU3RyaW5nOCBuYW1lID0gaGRtaU91dHB1dERldmljZXNbaV0tPmdldE5hbWUoKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfSERNSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9IRE1JLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICBwcm9maWxlVXBkYXRlZCB8PSAoc3RhdHVzID09IE5PX0VSUk9SKTsKICAgICB9Ci0gICAgRGV2aWNlVmVjdG9yIGhkbWlJbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSgKKyAgICAvLyBGSVhNRTogV2h5IGRvaW5nIHRoaXMgZm9yIGlucHV0IEhETUkgZGV2aWNlcyBpZiB3ZSBkb24ndCBhdWdtZW50IHRoZWlyIHJlcG9ydGVkIGZvcm1hdHM/CisgICAgRGV2aWNlVmVjdG9yIGhkbWlJbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soCiAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0hETUkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGRtaUlucHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewogICAgICAgICAvLyBTaW11bGF0ZSByZWNvbm5lY3Rpb24gdG8gdXBkYXRlIGVuYWJsZWQgc3Vycm91bmQgc291bmQgZm9ybWF0cy4KLSAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaGRtaUlucHV0RGV2aWNlc1tpXS0+bUFkZHJlc3M7CisgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGhkbWlJbnB1dERldmljZXNbaV0tPmFkZHJlc3MoKTsKICAgICAgICAgU3RyaW5nOCBuYW1lID0gaGRtaUlucHV0RGV2aWNlc1tpXS0+Z2V0TmFtZSgpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX0hETUksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9IRE1JLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICBwcm9maWxlVXBkYXRlZCB8PSAoc3RhdHVzID09IE5PX0VSUk9SKTsKICAgICB9CiAKLSAgICAvLyBVbmRvIHRoZSBzdXJyb3VuZCBmb3JtYXRzIGNoYW5nZSBkdWUgdG8gbm8gYXVkaW8gcHJvZmlsZXMgdXBkYXRlZC4KICAgICBpZiAoIXByb2ZpbGVVcGRhdGVkKSB7Ci0gICAgICAgIGlmIChlbmFibGVkKSB7Ci0gICAgICAgICAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0FBQ19MQykgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmVyYXNlKEFBQ19GT1JNQVRTW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuZXJhc2UoYXVkaW9Gb3JtYXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9BQUNfTEMpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoQUFDX0ZPUk1BVFNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoYXVkaW9Gb3JtYXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIEFMT0dXKCIlcygpIG5vIGF1ZGlvIHByb2ZpbGVzIHVwZGF0ZWQsIHVuZG9pbmcgc3Vycm91bmQgZm9ybWF0cyBjaGFuZ2UiLCBfX2Z1bmNfXyk7CisgICAgICAgIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMgPSBzdGQ6Om1vdmUoc3Vycm91bmRGb3JtYXRzQmFja3VwKTsKICAgICB9CiAKICAgICByZXR1cm4gcHJvZmlsZVVwZGF0ZWQgPyBOT19FUlJPUiA6IElOVkFMSURfT1BFUkFUSU9OOwogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEFwcFN0YXRlKHVpZF90IHVpZCwgYXBwX3N0YXRlX3Qgc3RhdGUpCiB7Ci0gICAgQUxPR1YoIkF1ZGlvUG9saWN5TWFuYWdlcjpzZXRSZWNvcmRTaWxlbmNlZCh1aWQ6JWQsIHNpbGVuY2VkOiVkKSIsIHVpZCwgc2lsZW5jZWQpOworICAgIEFMT0dWKCIlcyh1aWQ6JWQsIHN0YXRlOiVkKSIsIF9fZnVuY19fLCB1aWQsIHN0YXRlKTsKIAotICAgIFZlY3RvcjxzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0aXZlSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBhY3RpdmVEZXNjID0gYWN0aXZlSW5wdXRzW2ldOwotICAgICAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGFjdGl2ZVNlc3Npb25zID0gYWN0aXZlRGVzYy0+Z2V0QXVkaW9TZXNzaW9ucyh0cnVlKTsKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBhY3RpdmVTZXNzaW9ucy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgc3A8QXVkaW9TZXNzaW9uPiBhY3RpdmVTZXNzaW9uID0gYWN0aXZlU2Vzc2lvbnMudmFsdWVBdChqKTsKLSAgICAgICAgICAgIGlmIChhY3RpdmVTZXNzaW9uLT51aWQoKSA9PSB1aWQpIHsKLSAgICAgICAgICAgICAgICBhY3RpdmVTZXNzaW9uLT5zZXRTaWxlbmNlZChzaWxlbmNlZCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzID0gaW5wdXREZXNjLT5jbGllbnRzTGlzdChmYWxzZSAvKmFjdGl2ZU9ubHkqLyk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogY2xpZW50cykgeworICAgICAgICAgICAgaWYgKHVpZCA9PSBjbGllbnQtPnVpZCgpKSB7CisgICAgICAgICAgICAgICAgY2xpZW50LT5zZXRBcHBTdGF0ZShzdGF0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZGlzY29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpCiB7Ci0gICAgQUxPR1YoIiVzIGhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlRGVzYy0+Z2V0SGFuZGxlKCkpOworICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7CisgICAgICAgIGNvbnN0IE91dHB1dFByb2ZpbGVDb2xsZWN0aW9uICZvdXRwdXRQcm9maWxlcyA9IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJm91dFByb2ZpbGUgOiBvdXRwdXRQcm9maWxlcykgeworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgYXVkaW9Qb3J0OworICAgICAgICAgICAgb3V0UHJvZmlsZS0+dG9BdWRpb1BvcnQoJmF1ZGlvUG9ydCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF1ZGlvUG9ydC5udW1fY2hhbm5lbF9tYXNrczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvUG9ydC5jaGFubmVsX21hc2tzW2ldICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CiAKLSAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlRm9yKHNvdXJjZURlc2MtPm1QYXRjaERlc2MtPm1IYW5kbGUpOworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkaXNjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpCit7CisgICAgQUxPR1YoIiVzIHBvcnQgSWQgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPnBvcnRJZCgpKTsKKworICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVGb3Ioc291cmNlRGVzYy0+cGF0Y2hEZXNjKCktPm1IYW5kbGUpOwogICAgIGlmIChwYXRjaERlc2MgPT0gMCkgewogICAgICAgICBBTE9HVygiJXMgc291cmNlIGhhcyBubyBwYXRjaCB3aXRoIGhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUhhbmRsZSk7CisgICAgICAgICAgICAgIHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tSGFuZGxlKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgcmVtb3ZlQXVkaW9QYXRjaChzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjLT5tSGFuZGxlKTsKKyAgICByZW1vdmVBdWRpb1BhdGNoKHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tSGFuZGxlKTsKIAotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gc3RyZWFtVHlwZWZyb21BdHRyaWJ1dGVzSW50KCZzb3VyY2VEZXNjLT5tQXR0cmlidXRlcyk7Ci0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHN3T3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPm1Td091dHB1dC5wcm9tb3RlKCk7CisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHN3T3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPnN3T3V0cHV0KCkucHJvbW90ZSgpOwogICAgIGlmIChzd091dHB1dERlc2MgIT0gMCkgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wU291cmNlKHN3T3V0cHV0RGVzYywgc3RyZWFtLCBmYWxzZSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BTb3VyY2Uoc3dPdXRwdXREZXNjLCBzb3VyY2VEZXNjKTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgc3dPdXRwdXREZXNjLT5zdG9wKCk7CiAgICAgICAgIH0KICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBod091dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5tSHdPdXRwdXQucHJvbW90ZSgpOworICAgICAgICBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaHdPdXRwdXREZXNjID0gc291cmNlRGVzYy0+aHdPdXRwdXQoKS5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChod091dHB1dERlc2MgIT0gMCkgewogICAgICAgICAgIC8vICAgcmVsZWFzZSBwYXRjaCBiZXR3ZWVuIHNyYyBkZXZpY2UgYW5kIG91dHB1dCBkZXZpY2UKICAgICAgICAgICAvLyAgIGNsb3NlIEh3b3V0cHV0IGFuZCByZW1vdmUgZnJvbSBtSHdPdXRwdXRzCkBAIC0zODcwLDE2ICs0MTUwLDE1IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U291cmNlRm9yU3RyYXRlZ3lPbk91dHB1dCgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQorc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTb3VyY2VGb3JBdHRyaWJ1dGVzT25PdXRwdXQoCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKQogewotICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlOworICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1NvdXJjZXMuc2l6ZSgpOyBpKyspICB7Ci0gICAgICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKLSAgICAgICAgcm91dGluZ19zdHJhdGVneSBzb3VyY2VTdHJhdGVneSA9Ci0gICAgICAgICAgICAgICAgKHJvdXRpbmdfc3RyYXRlZ3kpIGdldFN0cmF0ZWd5Rm9yQXR0cigmc291cmNlRGVzYy0+bUF0dHJpYnV0ZXMpOwotICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPm1Td091dHB1dC5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChzb3VyY2VTdHJhdGVneSA9PSBzdHJhdGVneSAmJiBvdXRwdXREZXNjICE9IDAgJiYgb3V0cHV0RGVzYy0+bUlvSGFuZGxlID09IG91dHB1dCkgeworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPnN3T3V0cHV0KCkucHJvbW90ZSgpOworICAgICAgICBpZiAoZm9sbG93c1NhbWVSb3V0aW5nKGF0dHIsIHNvdXJjZURlc2MtPmF0dHJpYnV0ZXMoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjICE9IDAgJiYgb3V0cHV0RGVzYy0+bUlvSGFuZGxlID09IG91dHB1dCkgewogICAgICAgICAgICAgc291cmNlID0gc291cmNlRGVzYzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zODk1LDcgKzQxNzQsNiBAQAogICAgIHJldHVybiBtQXVkaW9Qb3J0R2VuZXJhdGlvbisrOwogfQogCi0jaWZkZWYgVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORgogLy8gVHJlYmxpemVkIGF1ZGlvIHBvbGljeSB4bWwgY29uZmlnIHdpbGwgYmUgbG9jYXRlZCBpbiAvb2RtL2V0YyBvciAvdmVuZG9yL2V0Yy4KIHN0YXRpYyBjb25zdCBjaGFyICprQ29uZmlnTG9jYXRpb25MaXN0W10gPQogICAgICAgICB7Ii9vZG0vZXRjIiwgIi92ZW5kb3IvZXRjIiwgIi9zeXN0ZW0vZXRjIn07CkBAIC0zOTI0LDQzICs0MjAyLDMzIEBACiAKICAgICBmb3IgKGNvbnN0IGNoYXIqIGZpbGVOYW1lIDogZmlsZU5hbWVzKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0NvbmZpZ0xvY2F0aW9uTGlzdFNpemU7IGkrKykgewotICAgICAgICAgICAgUG9saWN5U2VyaWFsaXplciBzZXJpYWxpemVyOwogICAgICAgICAgICAgc25wcmludGYoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlLCBzaXplb2YoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlKSwKICAgICAgICAgICAgICAgICAgICAgICIlcy8lcyIsIGtDb25maWdMb2NhdGlvbkxpc3RbaV0sIGZpbGVOYW1lKTsKLSAgICAgICAgICAgIHJldCA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlLCBjb25maWcpOworICAgICAgICAgICAgcmV0ID0gZGVzZXJpYWxpemVBdWRpb1BvbGljeUZpbGUoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlLCAmY29uZmlnKTsKICAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBjb25maWcuc2V0U291cmNlKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcmV0OwogfQotI2VuZGlmCiAKIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIC8qZm9yVGVzdGluZyovKQogICAgIDoKLSAgICBtVWlkQ2FjaGVkKGdldHVpZCgpKSwKKyAgICBtVWlkQ2FjaGVkKEFJRF9BVURJT1NFUlZFUiksIC8vIG5vIG5lZWQgdG8gY2FsbCBnZXR1aWQoKSwgdGhlcmUncyBvbmx5IG9uZSBvZiB1cyBydW5uaW5nLgogICAgIG1wQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSksCiAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUoZmFsc2UpLCBtTGFzdFZvaWNlVm9sdW1lKC0xLjBmKSwKICAgICBtQTJkcFN1c3BlbmRlZChmYWxzZSksCi0jaWZkZWYgVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORgotICAgIG1Wb2x1bWVDdXJ2ZXMobmV3IFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24oKSksCi0gICAgbUNvbmZpZyhtSHdNb2R1bGVzQWxsLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywKLSAgICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlLCBzdGF0aWNfY2FzdDxWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uKj4obVZvbHVtZUN1cnZlcy5nZXQoKSkpLAotI2Vsc2UKLSAgICBtVm9sdW1lQ3VydmVzKG5ldyBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbigpKSwKLSAgICBtQ29uZmlnKG1Id01vZHVsZXNBbGwsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLAotICAgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UpLAotI2VuZGlmCisgICAgbUNvbmZpZyhtSHdNb2R1bGVzQWxsLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywgbURlZmF1bHRPdXRwdXREZXZpY2UpLAogICAgIG1BdWRpb1BvcnRHZW5lcmF0aW9uKDEpLAogICAgIG1CZWFjb25NdXRlUmVmQ291bnQoMCksCiAgICAgbUJlYWNvblBsYXlpbmdSZWZDb3VudCgwKSwKICAgICBtQmVhY29uTXV0ZWQoZmFsc2UpLAogICAgIG1UdHNPdXRwdXRBdmFpbGFibGUoZmFsc2UpLAogICAgIG1NYXN0ZXJNb25vKGZhbHNlKSwKLSAgICBtTXVzaWNFZmZlY3RPdXRwdXQoQVVESU9fSU9fSEFORExFX05PTkUpLAotICAgIG1IYXNDb21wdXRlZFNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUoZmFsc2UpCisgICAgbU11c2ljRWZmZWN0T3V0cHV0KEFVRElPX0lPX0hBTkRMRV9OT05FKQogewogfQogCkBAIC0zOTcxLDIxICs0MjM5LDIyIEBACiAgICAgaW5pdGlhbGl6ZSgpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6bG9hZENvbmZpZygpIHsKLSNpZmRlZiBVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCi0gICAgaWYgKGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lYbWxDb25maWcoZ2V0Q29uZmlnKCkpICE9IE5PX0VSUk9SKSB7Ci0jZWxzZQotICAgIGlmICgoQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQ29uZmlnKEFVRElPX1BPTElDWV9WRU5ET1JfQ09ORklHX0ZJTEUsIGdldENvbmZpZygpKSAhPSBOT19FUlJPUikKLSAgICAgICAgICAgJiYgKENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZENvbmZpZyhBVURJT19QT0xJQ1lfQ09ORklHX0ZJTEUsIGdldENvbmZpZygpKSAhPSBOT19FUlJPUikpIHsKKy8vICBUaGlzIGNoZWNrIGlzIHRvIGNhdGNoIGFueSBsZWdhY3kgcGxhdGZvcm0gdXBkYXRpbmcgdG8gUSB3aXRob3V0IGhhdmluZworLy8gIHN3aXRjaGVkIHRvIFhNTCBzaW5jZSBpdHMgZGVwcmVjYXRpb24gb24gTy4KKy8vIFRPRE86IGFmdGVyIFEgcmVsZWFzZSwgcmVtb3ZlIHRoaXMgY2hlY2sgYW5kIGZsYWcgYXMgWE1MIGlzIG5vdyB0aGUgb25seQorLy8gICAgICAgIG9wdGlvbiBhbmQgYWxsIGxlZ2FjeSBwbGF0Zm9ybSBzaG91bGQgaGF2ZSB0cmFuc2l0aW9uZWQgdG8gWE1MLgorI2lmbmRlZiBVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCisjZXJyb3IgQXVkaW8gcG9saWN5IG5vIGxvbmdlciBzdXBwb3J0cyBsZWdhY3kgLmNvbmYgY29uZmlndXJhdGlvbiBmb3JtYXQKICNlbmRpZgorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6bG9hZENvbmZpZygpIHsKKyAgICBpZiAoZGVzZXJpYWxpemVBdWRpb1BvbGljeVhtbENvbmZpZyhnZXRDb25maWcoKSkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBsb2FkIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUsIHNldHRpbmcgZGVmYXVsdHMiKTsKICAgICAgICAgZ2V0Q29uZmlnKCkuc2V0RGVmYXVsdCgpOwogICAgIH0KIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0aWFsaXplKCkgewotICAgIG1Wb2x1bWVDdXJ2ZXMtPmluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoZ2V0Q29uZmlnKCkuaXNTcGVha2VyRHJjRW5hYmxlZCgpKTsKLQogICAgIC8vIE9uY2UgcG9saWN5IGNvbmZpZyBoYXMgYmVlbiBwYXJzZWQsIHJldHJpZXZlIGFuIGluc3RhbmNlIG9mIHRoZSBlbmdpbmUgYW5kIGluaXRpYWxpemUgaXQuCiAgICAgYXVkaW9fcG9saWN5OjpFbmdpbmVJbnN0YW5jZSAqZW5naW5lSW5zdGFuY2UgPSBhdWRpb19wb2xpY3k6OkVuZ2luZUluc3RhbmNlOjpnZXRJbnN0YW5jZSgpOwogICAgIGlmICghZW5naW5lSW5zdGFuY2UpIHsKQEAgLTQwMDcsOCArNDI3Niw2IEBACiAKICAgICAvLyBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBhbmQgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyBub3cgY29udGFpbiBhbGwgYXR0YWNoZWQgZGV2aWNlcwogICAgIC8vIG9wZW4gYWxsIG91dHB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcwotICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGlucHV0RGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlc0FsbCkgewogICAgICAgICBod01vZHVsZS0+c2V0SGFuZGxlKG1wQ2xpZW50SW50ZXJmYWNlLT5sb2FkSHdNb2R1bGUoaHdNb2R1bGUtPmdldE5hbWUoKSkpOwogICAgICAgICBpZiAoaHdNb2R1bGUtPmdldEhhbmRsZSgpID09IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORSkgewpAQCAtNDAzNyw1MSArNDMwNCw0OSBAQAogICAgICAgICAgICAgaWYgKChvdXRQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJvZmlsZVR5cGUgPSBvdXRQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpOwotICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT50eXBlKCkpICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUgPSBtRGVmYXVsdE91dHB1dERldmljZS0+dHlwZSgpOworICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZzdXBwb3J0ZWREZXZpY2VzID0gb3V0UHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpOworICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsUHJvZmlsZURldmljZXMgPSBzdXBwb3J0ZWREZXZpY2VzLmZpbHRlcihtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzdXBwb3J0ZWREZXZpY2UgPSAwOworICAgICAgICAgICAgaWYgKHN1cHBvcnRlZERldmljZXMuY29udGFpbnMobURlZmF1bHRPdXRwdXREZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgc3VwcG9ydGVkRGV2aWNlID0gbURlZmF1bHRPdXRwdXREZXZpY2U7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGNob3NlIGZpcnN0IGRldmljZSBwcmVzZW50IGluIHByb2ZpbGUncyBTdXBwb3J0ZWREZXZpY2VzIGFsc28gcGFydCBvZgotICAgICAgICAgICAgICAgIC8vIG91dHB1dERldmljZVR5cGVzCi0gICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUgPSBvdXRQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VGb3JUeXBlKG91dHB1dERldmljZVR5cGVzKTsKKyAgICAgICAgICAgICAgICAvLyBjaG9vc2UgZmlyc3QgZGV2aWNlIHByZXNlbnQgaW4gcHJvZmlsZSdzIFN1cHBvcnRlZERldmljZXMgYWxzbyBwYXJ0IG9mCisgICAgICAgICAgICAgICAgLy8gbUF2YWlsYWJsZU91dHB1dERldmljZXMuCisgICAgICAgICAgICAgICAgaWYgKGF2YWlsUHJvZmlsZURldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdXBwb3J0ZWREZXZpY2UgPSBhdmFpbFByb2ZpbGVEZXZpY2VzLml0ZW1BdCgwKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgocHJvZmlsZVR5cGUgJiBvdXRwdXREZXZpY2VUeXBlcykgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jb250YWlucyhzdXBwb3J0ZWREZXZpY2UpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihvdXRQcm9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZzdXBwb3J0ZWREZXZpY2VzID0gb3V0UHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpOwotICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzRm9yVHlwZSA9IHN1cHBvcnRlZERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKHByb2ZpbGVUeXBlKTsKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGRldmljZXNGb3JUeXBlLnNpemUoKSA+IDAgPyBkZXZpY2VzRm9yVHlwZS5pdGVtQXQoMCktPm1BZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgIDogU3RyaW5nOCgiIik7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dERlc2MtPm9wZW4obnVsbHB0ciwgcHJvZmlsZVR5cGUsIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX0RFRkFVTFQsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZvdXRwdXQpOwotCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvdXRwdXREZXNjLT5vcGVuKG51bGxwdHIsIERldmljZVZlY3RvcihzdXBwb3J0ZWREZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkNhbm5vdCBvcGVuIG91dHB1dCBzdHJlYW0gZm9yIGRldmljZSAlMDh4IG9uIGh3IG1vZHVsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICBod01vZHVsZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBkZXYgOiBzdXBwb3J0ZWREZXZpY2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKGRldik7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmICFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPmlzQXR0YWNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5hdHRhY2goaHdNb2R1bGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUHJpbWFyeU91dHB1dCA9PSAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkgewotICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dCA9IG91dHB1dERlc2M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFkZE91dHB1dChvdXRwdXQsIG91dHB1dERlc2MpOwotICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgQUxPR1coIkNhbm5vdCBvcGVuIG91dHB1dCBzdHJlYW0gZm9yIGRldmljZXMgJXMgb24gaHcgbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWREZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6IGF2YWlsUHJvZmlsZURldmljZXMpIHsKKyAgICAgICAgICAgICAgICAvLyBnaXZlIGEgdmFsaWQgSUQgdG8gYW4gYXR0YWNoZWQgZGV2aWNlIG9uY2UgY29uZmlybWVkIGl0IGlzIHJlYWNoYWJsZQorICAgICAgICAgICAgICAgIGlmICghZGV2aWNlLT5pc0F0dGFjaGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5hdHRhY2goaHdNb2R1bGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUHJpbWFyeU91dHB1dCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgIG91dFByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSB7CisgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQgPSBvdXRwdXREZXNjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvcihzdXBwb3J0ZWREZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICAgfQogICAgICAgICAvLyBvcGVuIGlucHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzIHRvIHZhbGlkYXRlCiAgICAgICAgIC8vIG1BdmFpbGFibGVJbnB1dERldmljZXMgbGlzdApAQCAtNDA5Niw4NSArNDM2MSw2OCBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gY2hvc2UgZmlyc3QgZGV2aWNlIHByZXNlbnQgaW4gcHJvZmlsZSdzIFN1cHBvcnRlZERldmljZXMgYWxzbyBwYXJ0IG9mCi0gICAgICAgICAgICAvLyBpbnB1dERldmljZVR5cGVzCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJvZmlsZVR5cGUgPSBpblByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZUZvclR5cGUoaW5wdXREZXZpY2VUeXBlcyk7Ci0KLSAgICAgICAgICAgIGlmICgocHJvZmlsZVR5cGUgJiBpbnB1dERldmljZVR5cGVzKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBhdmFpbGFibGUgaW5wdXQgZGV2aWNlcworICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZzdXBwb3J0ZWREZXZpY2VzID0gaW5Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCk7CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxQcm9maWxlRGV2aWNlcyA9IHN1cHBvcnRlZERldmljZXMuZmlsdGVyKG1BdmFpbGFibGVJbnB1dERldmljZXMpOworICAgICAgICAgICAgaWYgKGF2YWlsUHJvZmlsZURldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnB1dCBkZXZpY2UgbGlzdCBpcyBlbXB0eSEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9CiAgICAgICAgICAgICAgICAgICAgIG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcihpblByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKIAotICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKHByb2ZpbGVUeXBlKTsKLSAgICAgICAgICAgIC8vICAgdGhlIGlucHV0cyB2ZWN0b3IgbXVzdCBiZSBvZiBzaXplID49IDEsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGNyYXNoIGhlcmUKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGlucHV0RGV2aWNlcy5zaXplKCkgPiAwID8gaW5wdXREZXZpY2VzLml0ZW1BdCgwKS0+bUFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmc4KCIiKTsKLSAgICAgICAgICAgIEFMT0dWKCIgIGZvciBpbnB1dCBkZXZpY2UgMHgleCB1c2luZyBhZGRyZXNzICVzIiwgcHJvZmlsZVR5cGUsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICAgICAgQUxPR0VfSUYoaW5wdXREZXZpY2VzLnNpemUoKSA9PSAwLCAiSW5wdXQgZGV2aWNlIGxpc3QgaXMgZW1wdHkhIik7Ci0KICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnB1dERlc2MtPm9wZW4obnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsUHJvZmlsZURldmljZXMuaXRlbUF0KDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCk7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldiA6IGluUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2YoZGV2KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSBhIHZhbGlkIElEIHRvIGFuIGF0dGFjaGVkIGRldmljZSBvbmNlIGNvbmZpcm1lZCBpdCBpcyByZWFjaGFibGUKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2luZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGV2RGVzYy0+aXNBdHRhY2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+YXR0YWNoKGh3TW9kdWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5pbXBvcnRBdWRpb1BvcnQoaW5Qcm9maWxlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnB1dERlc2MtPmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dXKCJDYW5ub3Qgb3BlbiBpbnB1dCBzdHJlYW0gZm9yIGRldmljZSAlMDh4IG9uIGh3IG1vZHVsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUsCisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIkNhbm5vdCBvcGVuIGlucHV0IHN0cmVhbSBmb3IgZGV2aWNlICVzIG9uIGh3IG1vZHVsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgYXZhaWxQcm9maWxlRGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUtPmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6IGF2YWlsUHJvZmlsZURldmljZXMpIHsKKyAgICAgICAgICAgICAgICAvLyBnaXZlIGEgdmFsaWQgSUQgdG8gYW4gYXR0YWNoZWQgZGV2aWNlIG9uY2UgY29uZmlybWVkIGl0IGlzIHJlYWNoYWJsZQorICAgICAgICAgICAgICAgIGlmICghZGV2aWNlLT5pc0F0dGFjaGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5hdHRhY2goaHdNb2R1bGUpOworICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmltcG9ydEF1ZGlvUG9ydChpblByb2ZpbGUsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlucHV0RGVzYy0+Y2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KICAgICAvLyBtYWtlIHN1cmUgYWxsIGF0dGFjaGVkIGRldmljZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBhIHVuaXF1ZSBJRAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKTspIHsKLSAgICAgICAgaWYgKCFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+aXNBdHRhY2hlZCgpKSB7Ci0gICAgICAgICAgICBBTE9HVygiT3V0cHV0IGRldmljZSAlMDh4IHVucmVhY2hhYmxlIiwgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPnR5cGUoKSk7Ci0gICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUobUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0pOwotICAgICAgICAgICAgY29udGludWU7CisgICAgYXV0byBjaGVja0FuZFNldEF2YWlsYWJsZSA9IFt0aGlzXShhdXRvJiBkZXZpY2VzKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV2aWNlcy5zaXplKCk7KSB7CisgICAgICAgICAgICBjb25zdCBhdXRvICZkZXZpY2UgPSBkZXZpY2VzW2ldOworICAgICAgICAgICAgaWYgKCFkZXZpY2UtPmlzQXR0YWNoZWQoKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJkZXZpY2UgJXMgaXMgdW5yZWFjaGFibGUiLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgZGV2aWNlcy5yZW1vdmUoZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIERldmljZSBpcyBub3cgdmFsaWRhdGVkIGFuZCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIGF2YWlsYWJsZSBkZXZpY2VzIG9mIHRoZSBlbmdpbmUKKyAgICAgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKTsKKyAgICAgICAgICAgIGkrKzsKICAgICAgICAgfQotICAgICAgICAvLyBUaGUgZGV2aWNlIGlzIG5vdyB2YWxpZGF0ZWQgYW5kIGNhbiBiZSBhcHBlbmRlZCB0byB0aGUgYXZhaWxhYmxlIGRldmljZXMgb2YgdGhlIGVuZ2luZQotICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUobUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSk7Ci0gICAgICAgIGkrKzsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7KSB7Ci0gICAgICAgIGlmICghbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+aXNBdHRhY2hlZCgpKSB7Ci0gICAgICAgICAgICBBTE9HVygiSW5wdXQgZGV2aWNlICUwOHggdW5yZWFjaGFibGUiLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT50eXBlKCkpOwotICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5yZW1vdmUobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBUaGUgZGV2aWNlIGlzIG5vdyB2YWxpZGF0ZWQgYW5kIGNhbiBiZSBhcHBlbmRlZCB0byB0aGUgYXZhaWxhYmxlIGRldmljZXMgb2YgdGhlIGVuZ2luZQotICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKTsKLSAgICAgICAgaSsrOwotICAgIH0KKyAgICB9OworICAgIGNoZWNrQW5kU2V0QXZhaWxhYmxlKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKKyAgICBjaGVja0FuZFNldEF2YWlsYWJsZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzKTsKKwogICAgIC8vIG1ha2Ugc3VyZSBkZWZhdWx0IGRldmljZSBpcyByZWFjaGFibGUKLSAgICBpZiAobURlZmF1bHRPdXRwdXREZXZpY2UgPT0gMCB8fCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKG1EZWZhdWx0T3V0cHV0RGV2aWNlKSA8IDApIHsKLSAgICAgICAgQUxPR0UoIkRlZmF1bHQgZGV2aWNlICUwOHggaXMgdW5yZWFjaGFibGUiLCBtRGVmYXVsdE91dHB1dERldmljZS0+dHlwZSgpKTsKKyAgICBpZiAobURlZmF1bHRPdXRwdXREZXZpY2UgPT0gMCB8fCAhbUF2YWlsYWJsZU91dHB1dERldmljZXMuY29udGFpbnMobURlZmF1bHRPdXRwdXREZXZpY2UpKSB7CisgICAgICAgIEFMT0dFX0lGKG1EZWZhdWx0T3V0cHV0RGV2aWNlICE9IDAsICJEZWZhdWx0IGRldmljZSAlcyBpcyB1bnJlYWNoYWJsZSIsCisgICAgICAgICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgIH0KICAgICAvLyBJZiBtaWNyb3Bob25lcyBhZGRyZXNzIGlzIGVtcHR5LCBzZXQgaXQgYWNjb3JkaW5nIHRvIGRldmljZSB0eXBlCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bUFkZHJlc3MuaXNFbXB0eSgpKSB7CisgICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5hZGRyZXNzKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+dHlwZSgpID09IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgewotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPm1BZGRyZXNzID0gU3RyaW5nOChBVURJT19CT1RUT01fTUlDUk9QSE9ORV9BRERSRVNTKTsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5zZXRBZGRyZXNzKFN0cmluZzgoQVVESU9fQk9UVE9NX01JQ1JPUEhPTkVfQUREUkVTUykpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT50eXBlKCkgPT0gQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSB7Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bUFkZHJlc3MgPSBTdHJpbmc4KEFVRElPX0JBQ0tfTUlDUk9QSE9ORV9BRERSRVNTKTsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5zZXRBZGRyZXNzKFN0cmluZzgoQVVESU9fQkFDS19NSUNST1BIT05FX0FERFJFU1MpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTQyMDUsNyArNDQ1Myw3IEBACiAgICBtSW5wdXRzLmNsZWFyKCk7CiAgICBtSHdNb2R1bGVzLmNsZWFyKCk7CiAgICBtSHdNb2R1bGVzQWxsLmNsZWFyKCk7Ci0gICBtU3Vycm91bmRGb3JtYXRzLmNsZWFyKCk7CisgICBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmNsZWFyKCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdENoZWNrKCkKQEAgLTQyMzgsNDQgKzQ0ODYsMjggQEAKICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZmluZElvSGFuZGxlc0J5QWRkcmVzcyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGRlc2MgLyppbiovLAotICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlIC8qaW4qLywKLSAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcyAvKmluKi8sCi0gICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMgLypvdXQqLykgewotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQotICAgICAgICBkZXNjLT5tUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlQnlBZGRyZXNzKGRldmljZSwgYWRkcmVzcyk7Ci0gICAgaWYgKGRldkRlc2MgIT0gMCkgewotICAgICAgICBBTE9HVigiZmluZElvSGFuZGxlc0J5QWRkcmVzcygpOiBhZGRpbmcgb3BlbmVkIG91dHB1dCAlZCBvbiBzYW1lIGFkZHJlc3MgJXMiLAotICAgICAgICAgICAgICBkZXNjLT5tSW9IYW5kbGUsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICBvdXRwdXRzLmFkZChkZXNjLT5tSW9IYW5kbGUpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzKQogewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBkZXZEZXNjLT50eXBlKCk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSBkZXZpY2UtPnR5cGUoKTsKKyAgICBjb25zdCBTdHJpbmc4ICZhZGRyZXNzID0gZGV2aWNlLT5hZGRyZXNzKCk7CiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2M7CiAKLSAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgeworICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2VUeXBlKSkgewogICAgICAgICAvLyBlcmFzZSBhbGwgY3VycmVudCBzYW1wbGUgcmF0ZXMsIGZvcm1hdHMgYW5kIGNoYW5uZWwgbWFza3MKLSAgICAgICAgZGV2RGVzYy0+Y2xlYXJBdWRpb1Byb2ZpbGVzKCk7CisgICAgICAgIGRldmljZS0+Y2xlYXJBdWRpb1Byb2ZpbGVzKCk7CiAgICAgfQogCiAgICAgaWYgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKSB7CiAgICAgICAgIC8vIGZpcnN0IGxpc3QgYWxyZWFkeSBvcGVuIG91dHB1dHMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiAoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpICYgZGV2aWNlKSkgewotICAgICAgICAgICAgICAgIGlmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG9wZW5lZCBvdXRwdXQgJWQiLCBtT3V0cHV0cy5rZXlBdChpKSk7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiICBjaGVja2luZyBhZGRyZXNzIG1hdGNoIGR1ZSB0byBkZXZpY2UgMHgleCIsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmRJb0hhbmRsZXNCeUFkZHJlc3MoZGVzYywgZGV2aWNlLCBhZGRyZXNzLCBvdXRwdXRzKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIGRlc2MtPnN1cHBvcnRzRGV2aWNlKGRldmljZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgZGVzYy0+ZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhkZXZpY2VUeXBlKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG9wZW5lZCBvdXRwdXQgJWQgb24gZGV2aWNlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cy5rZXlBdChpKSwgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyB0aGVuIGxvb2sgZm9yIG91dHB1dCBwcm9maWxlcyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKQEAgLTQyODMsMTMgKzQ1MTUsMTAgQEAKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkuc2l6ZSgpOyBqKyspIHsKICAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKVtqXTsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+c3VwcG9ydERldmljZUFkZHJlc3MoYWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChwcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00Mjk3LDcgKzQ1MjYsNyBAQAogICAgICAgICBBTE9HVigiICBmb3VuZCAlenUgcHJvZmlsZXMsICV6dSBvdXRwdXRzIiwgcHJvZmlsZXMuc2l6ZSgpLCBvdXRwdXRzLnNpemUoKSk7CiAKICAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSAmJiBvdXRwdXRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBObyBvdXRwdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJTA0eCIsIGRldmljZSk7CisgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IE5vIG91dHB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAlMDR4IiwgZGV2aWNlVHlwZSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAKQEAgLTQzMTMsOCArNDU0Miw4IEBACiAgICAgICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiBkZXNjLT5tUHJvZmlsZSA9PSBwcm9maWxlKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoaW5nIHByb2ZpbGU6IHNhdmUgdGhlIHNhbXBsZSByYXRlcywgZm9ybWF0IGFuZCBjaGFubmVsIG1hc2tzIHN1cHBvcnRlZAogICAgICAgICAgICAgICAgICAgICAvLyBieSB0aGUgcHJvZmlsZSBpbiBvdXIgZGV2aWNlIGRlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC00MzMwLDE2ICs0NTU5LDE2IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEFMT0dWKCJvcGVuaW5nIG91dHB1dCBmb3IgZGV2aWNlICUwOHggd2l0aCBwYXJhbXMgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKLSAgICAgICAgICAgICAgICAgIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSwgcHJvZmlsZS5nZXQoKSwgcHJvZmlsZS0+Z2V0TmFtZSgpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgIGRldmljZVR5cGUsIGFkZHJlc3Muc3RyaW5nKCksIHByb2ZpbGUuZ2V0KCksIHByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7CiAgICAgICAgICAgICBkZXNjID0gbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzYy0+b3BlbihudWxscHRyLCBkZXZpY2UsIGFkZHJlc3MsCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKG51bGxwdHIsIERldmljZVZlY3RvcihkZXZpY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7CiAKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAvLyBIZXJlIGlzIHdoZXJlIHRoZSBvdXRfc2V0X3BhcmFtZXRlcnMoKSBmb3IgY2FyZCAmIGRldmljZSBnZXRzIGNhbGxlZAogICAgICAgICAgICAgICAgIGlmICghYWRkcmVzcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlLCBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlVHlwZSwgYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG91dHB1dCwgU3RyaW5nOChwYXJhbSkpOwogICAgICAgICAgICAgICAgICAgICBmcmVlKHBhcmFtKTsKICAgICAgICAgICAgICAgICB9CkBAIC00MzU4LDcgKzQ1ODcsOCBAQAogICAgICAgICAgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmNoYW5uZWxfbWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uZm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKIAotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKCZjb25maWcsIGRldmljZSwgYWRkcmVzcywgQVVESU9fU1RSRUFNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2MtPm9wZW4oJmNvbmZpZywgRGV2aWNlVmVjdG9yKGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwpAQCAtNDM2NywxNCArNDU5NywxNSBAQAogCiAgICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBkZXNjKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSAmJiBhZGRyZXNzICE9ICIwIikgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2VUeXBlKSAmJiBhZGRyZXNzICE9ICIwIikgewogICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMuZ2V0QXVkaW9Qb2xpY3lNaXgoYWRkcmVzcywgcG9saWN5TWl4KSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjYW5ub3QgZmluZCBwb2xpY3kgZm9yIGFkZHJlc3MgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy5nZXRBdWRpb1BvbGljeU1peChhZGRyZXNzLCBwb2xpY3lNaXgpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4LT5zZXRPdXRwdXQoZGVzYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bVBvbGljeU1peCA9IHBvbGljeU1peDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIGNhbm5vdCBmaW5kIHBvbGljeSBmb3IgYWRkcmVzcyAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lNaXgtPnNldE91dHB1dChkZXNjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1Qb2xpY3lNaXggPSBwb2xpY3lNaXgtPmdldE1peCgpOwogCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpID09IDApICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQcmltYXJ5T3V0cHV0KCkpIHsKQEAgLTQ0MDYsMjggKzQ2MzcsMjggQEAKICAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gb3V0cHV0IGZvciBkZXZpY2UgJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBvdXRwdXQgZm9yIGRldmljZSAleCIsIGRldmljZVR5cGUpOwogICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJlbW92ZUF0KHByb2ZpbGVfaW5kZXgpOwogICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgtLTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQob3V0cHV0KTsKICAgICAgICAgICAgICAgICAvLyBMb2FkIGRpZ2l0YWwgZm9ybWF0IGluZm8gb25seSBmb3IgZGlnaXRhbCBkZXZpY2VzCi0gICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOworICAgICAgICAgICAgICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2VUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogc2V0T3V0cHV0RGV2aWNlKGRldj0weCV4LCBhZGRyPSVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKGRlc2MsIGRldmljZSwgdHJ1ZS8qZm9yY2UqLywgMC8qZGVsYXkqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLypwYXRjaCBoYW5kbGUqLywgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBzZXRPdXRwdXREZXZpY2VzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZXMoZGVzYywgRGV2aWNlVmVjdG9yKGRldmljZSksIHRydWUvKmZvcmNlKi8sIDAvKmRlbGF5Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTC8qcGF0Y2ggaGFuZGxlKi8pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBvdXRwdXQgJWQiLCBvdXRwdXQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBObyBvdXRwdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJTA0eCIsIGRldmljZSk7CisgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IE5vIG91dHB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAlMDR4IiwgZGV2aWNlVHlwZSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsgLy8gRGlzY29ubmVjdApAQCAtNDQzNiwxMCArNDY2NywxMCBAQAogICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CiAgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gZXhhY3QgbWF0Y2ggb24gZGV2aWNlCi0gICAgICAgICAgICAgICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSA9PSBkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmRJb0hhbmRsZXNCeUFkZHJlc3MoZGVzYywgZGV2aWNlLCBhZGRyZXNzLCBvdXRwdXRzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpICYgbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2VUeXBlKSAmJiBkZXNjLT5zdXBwb3J0c0RldmljZShkZXZpY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBkZXNjLT5kZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGRldmljZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jb250YWluc0F0TGVhc3RPbmUoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGRpc2Nvbm5lY3RpbmcgYWRkaW5nIG91dHB1dCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMua2V5QXQoaSkpOwogICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChtT3V0cHV0cy5rZXlBdChpKSk7CkBAIC00NDUwLDcgKzQ2ODEsNyBAQAogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgewogICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKS5zaXplKCk7IGorKykgewogICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpW2pdOwotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlKSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xlYXJpbmcgZGlyZWN0IG91dHB1dCBwcm9maWxlICV6dSBvbiBtb2R1bGUgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGosIGh3TW9kdWxlLT5nZXROYW1lKCkpOwpAQCAtNDQ2MiwyNCArNDY5MywyMiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0lucHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tJbnB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBpbnB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIGlucHV0cykKIHsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZGV2RGVzYy0+dHlwZSgpOwogICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBkZXNjOwogCi0gICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKKyAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlLT50eXBlKCkpKSB7CiAgICAgICAgIC8vIGVyYXNlIGFsbCBjdXJyZW50IHNhbXBsZSByYXRlcywgZm9ybWF0cyBhbmQgY2hhbm5lbCBtYXNrcwotICAgICAgICBkZXZEZXNjLT5jbGVhckF1ZGlvUHJvZmlsZXMoKTsKKyAgICAgICAgZGV2aWNlLT5jbGVhckF1ZGlvUHJvZmlsZXMoKTsKICAgICB9CiAKICAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpIHsKICAgICAgICAgLy8gZmlyc3QgbGlzdCBhbHJlYWR5IG9wZW4gaW5wdXRzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQogICAgICAgICBmb3IgKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKICAgICAgICAgICAgIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOwotICAgICAgICAgICAgaWYgKGRlc2MtPm1Qcm9maWxlLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZS0+c3VwcG9ydHNEZXZpY2VUeXBlcyhkZXZpY2UtPnR5cGUoKSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG9wZW5lZCBpbnB1dCAlZCIsIG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKICAgICAgICAgICAgICAgIGlucHV0cy5hZGQobUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOwogICAgICAgICAgICAgfQpAQCAtNDQ5MywxOSArNDcyMiwxNiBAQAogICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4KyspIHsKICAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpW3Byb2ZpbGVfaW5kZXhdOwogCi0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnREZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPnN1cHBvcnREZXZpY2VBZGRyZXNzKGFkZHJlc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQocHJvZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCwgaHdNb2R1bGUtPmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgcHJvZmlsZSAlenUgZnJvbSBtb2R1bGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpICYmIGlucHV0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBObyBpbnB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAweCVYIiwgZGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dXKCIlczogTm8gaW5wdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogCkBAIC00NTIwLDggKzQ3NDYsOCBAQAogICAgICAgICAgICAgZm9yIChpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKICAgICAgICAgICAgICAgICBkZXNjID0gbUlucHV0cy52YWx1ZUF0KGlucHV0X2luZGV4KTsKICAgICAgICAgICAgICAgICBpZiAoZGVzYy0+bVByb2ZpbGUgPT0gcHJvZmlsZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlLT50eXBlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC00NTQwLDE0ICs0NzY2LDE0IEBACiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzYy0+b3BlbihudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0KTsKIAogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MgPSBkZXZpY2UtPmFkZHJlc3MoKTsKICAgICAgICAgICAgICAgICBpZiAoIWFkZHJlc3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKGRldmljZSwgYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKGRldmljZS0+dHlwZSgpLCBhZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXQsIFN0cmluZzgocGFyYW0pKTsKICAgICAgICAgICAgICAgICAgICAgZnJlZShwYXJhbSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDU2NCwyMCArNDc5MCwyMSBAQAogICAgICAgICAgICAgfSAvLyBlbmRpZiBpbnB1dCAhPSAwCiAKICAgICAgICAgICAgIGlmIChpbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja0lucHV0c0ZvckRldmljZSgpIGNvdWxkIG5vdCBvcGVuIGlucHV0IGZvciBkZXZpY2UgMHglWCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzIGNvdWxkIG5vdCBvcGVuIGlucHV0IGZvciBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgIAorICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgcHJvZmlsZXMucmVtb3ZlQXQocHJvZmlsZV9pbmRleCk7CiAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleC0tOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpbnB1dHMuYWRkKGlucHV0KTsKLSAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZS0+dHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBpbnB1dCAlZCIsIGlucHV0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSAvLyBlbmQgc2NhbiBwcm9maWxlcwogCiAgICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBObyBpbnB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAweCVYIiwgZGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dXKCIlczogTm8gaW5wdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtNDU4NSw3ICs0ODEyLDcgQEAKICAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9wZW5lZCBpbnB1dCBpcyBub3QgbmVlZGVkIGFueSBtb3JlIGFmdGVyIGRpc2Nvbm5lY3Rpbmcgb25lIGRldmljZQogICAgICAgICBmb3IgKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKICAgICAgICAgICAgIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOwotICAgICAgICAgICAgaWYgKCEoZGVzYy0+bVByb2ZpbGUtPnN1cHBvcnREZXZpY2UobUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpKSkpIHsKKyAgICAgICAgICAgIGlmICghbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5jb250YWluc0F0TGVhc3RPbmUoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBkaXNjb25uZWN0aW5nIGFkZGluZyBpbnB1dCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOwogICAgICAgICAgICAgICAgIGlucHV0cy5hZGQobUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOwpAQCAtNDU5Nyw3ICs0ODI0LDcgQEAKICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCA8IGh3TW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCkuc2l6ZSgpOwogICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4KyspIHsKICAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpW3Byb2ZpbGVfaW5kZXhdOwotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlKSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogY2xlYXJpbmcgZGlyZWN0IGlucHV0IHByb2ZpbGUgJXp1IG9uIG1vZHVsZSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmNsZWFyQXVkaW9Qcm9maWxlcygpOwpAQCAtNDYxNCwzOCArNDg0MSwzMSBAQAogewogICAgIEFMT0dWKCJjbG9zZU91dHB1dCglZCkiLCBvdXRwdXQpOwogCi0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgIGlmIChvdXRwdXREZXNjID09IE5VTEwpIHsKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gY2xvc2luZ091dHB1dCA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgaWYgKGNsb3NpbmdPdXRwdXQgPT0gTlVMTCkgewogICAgICAgICBBTE9HVygiY2xvc2VPdXRwdXQoKSB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgbVBvbGljeU1peGVzLmNsb3NlT3V0cHV0KG91dHB1dERlc2MpOworICAgIG1Qb2xpY3lNaXhlcy5jbG9zZU91dHB1dChjbG9zaW5nT3V0cHV0KTsKIAogICAgIC8vIGxvb2sgZm9yIGR1cGxpY2F0ZWQgb3V0cHV0cyBjb25uZWN0ZWQgdG8gdGhlIG91dHB1dCBiZWluZyByZW1vdmVkLgogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGR1cE91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoZHVwT3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYKLSAgICAgICAgICAgICAgICAoZHVwT3V0cHV0RGVzYy0+bU91dHB1dDEgPT0gb3V0cHV0RGVzYyB8fAotICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1PdXRwdXQyID09IG91dHB1dERlc2MpKSB7Ci0gICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYzI7Ci0gICAgICAgICAgICBpZiAoZHVwT3V0cHV0RGVzYy0+bU91dHB1dDEgPT0gb3V0cHV0RGVzYykgewotICAgICAgICAgICAgICAgIG91dHB1dERlc2MyID0gZHVwT3V0cHV0RGVzYy0+bU91dHB1dDI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dHB1dERlc2MyID0gZHVwT3V0cHV0RGVzYy0+bU91dHB1dDE7Ci0gICAgICAgICAgICB9CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkdXBPdXRwdXQgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoZHVwT3V0cHV0LT5pc0R1cGxpY2F0ZWQoKSAmJgorICAgICAgICAgICAgICAgIChkdXBPdXRwdXQtPm1PdXRwdXQxID09IGNsb3NpbmdPdXRwdXQgfHwgZHVwT3V0cHV0LT5tT3V0cHV0MiA9PSBjbG9zaW5nT3V0cHV0KSkgeworICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHJlbWFpbmluZ091dHB1dCA9CisgICAgICAgICAgICAgICAgZHVwT3V0cHV0LT5tT3V0cHV0MSA9PSBjbG9zaW5nT3V0cHV0ID8gZHVwT3V0cHV0LT5tT3V0cHV0MiA6IGR1cE91dHB1dC0+bU91dHB1dDE7CiAgICAgICAgICAgICAvLyBBcyBhbGwgYWN0aXZlIHRyYWNrcyBvbiBkdXBsaWNhdGVkIG91dHB1dCB3aWxsIGJlIGRlbGV0ZWQsCiAgICAgICAgICAgICAvLyBhbmQgYXMgdGhleSB3ZXJlIGFsc28gcmVmZXJlbmNlZCBvbiB0aGUgb3RoZXIgb3V0cHV0LCB0aGUgcmVmZXJlbmNlCiAgICAgICAgICAgICAvLyBjb3VudCBmb3IgdGhlaXIgc3RyZWFtIHR5cGUgbXVzdCBiZSBhZGp1c3RlZCBhY2NvcmRpbmdseSBvbgogICAgICAgICAgICAgLy8gdGhlIG90aGVyIG91dHB1dC4KLSAgICAgICAgICAgIGJvb2wgd2FzQWN0aXZlID0gb3V0cHV0RGVzYzItPmlzQWN0aXZlKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEFVRElPX1NUUkVBTV9DTlQ7IGorKykgewotICAgICAgICAgICAgICAgIGludCByZWZDb3VudCA9IGR1cE91dHB1dERlc2MtPm1SZWZDb3VudFtqXTsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjMi0+Y2hhbmdlUmVmQ291bnQoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaiwtcmVmQ291bnQpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgYm9vbCB3YXNBY3RpdmUgPSByZW1haW5pbmdPdXRwdXQtPmlzQWN0aXZlKCk7CisgICAgICAgICAgICAvLyBOb3RlOiBuby1vcCBvbiB0aGUgY2xvc2luZyBvdXRwdXQgd2hlcmUgYWxsIGNsaWVudHMgaGFzIGFscmVhZHkgYmVlbiBzZXQgaW5hY3RpdmUKKyAgICAgICAgICAgIGR1cE91dHB1dC0+c2V0QWxsQ2xpZW50c0luYWN0aXZlKCk7CiAgICAgICAgICAgICAvLyBzdG9wKCkgd2lsbCBiZSBhIG5vIG9wIGlmIHRoZSBvdXRwdXQgaXMgc3RpbGwgYWN0aXZlIGJ1dCBpcyBuZWVkZWQgaW4gY2FzZSBhbGwKICAgICAgICAgICAgIC8vIGFjdGl2ZSBzdHJlYW1zIHJlZmNvdW50cyB3aGVyZSBjbGVhcmVkIGFib3ZlCiAgICAgICAgICAgICBpZiAod2FzQWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYzItPnN0b3AoKTsKKyAgICAgICAgICAgICAgICByZW1haW5pbmdPdXRwdXQtPnN0b3AoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGR1cGxpY2F0ZWRPdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChpKTsKICAgICAgICAgICAgIEFMT0dWKCJjbG9zZU91dHB1dCgpIGNsb3NpbmcgYWxzbyBkdXBsaWNhdGVkIG91dHB1dCAlZCIsIGR1cGxpY2F0ZWRPdXRwdXQpOwpAQCAtNDY1Nyw3ICs0ODc3LDcgQEAKIAogICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CiAKLSAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoY2xvc2luZ091dHB1dC0+Z2V0UGF0Y2hIYW5kbGUoKSk7CiAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKICAgICAgICAgKHZvaWQpIC8qc3RhdHVzX3Qgc3RhdHVzKi8gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOwpAQCAtNDY2NSwxMCArNDg4NSwyNiBAQAogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgIH0KIAotICAgIG91dHB1dERlc2MtPmNsb3NlKCk7CisgICAgY2xvc2luZ091dHB1dC0+Y2xvc2UoKTsKIAogICAgIHJlbW92ZU91dHB1dChvdXRwdXQpOwogICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKKworICAgIC8vIE1TRCBwYXRjaGVzIG1heSBoYXZlIGJlZW4gcmVsZWFzZWQgdG8gc3VwcG9ydCBhIG5vbi1NU0QgZGlyZWN0IG91dHB1dC4gUmVzZXQgTVNEIHBhdGNoIGlmCisgICAgLy8gbm8gZGlyZWN0IG91dHB1dHMgYXJlIG9wZW4uCisgICAgaWYgKCFnZXRNc2RBdWRpb091dERldmljZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgYm9vbCBkaXJlY3RPdXRwdXRPcGVuID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0c1tpXS0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CisgICAgICAgICAgICAgICAgZGlyZWN0T3V0cHV0T3BlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFkaXJlY3RPdXRwdXRPcGVuKSB7CisgICAgICAgICAgICBBTE9HVigibm8gZGlyZWN0IG91dHB1dHMgb3BlbiwgcmVzZXQgTVNEIHBhdGNoIik7CisgICAgICAgICAgICBzZXRNc2RQYXRjaCgpOworICAgICAgICB9CisgICAgfQogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKQEAgLTQ2ODMsNiArNDkxOSw3IEBACiAKICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwogCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gaW5wdXREZXNjLT5nZXREZXZpY2UoKTsKICAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7CiAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKQEAgLTQ2OTMsNTEgKzQ5MzAsNjcgQEAKIAogICAgIGlucHV0RGVzYy0+Y2xvc2UoKTsKICAgICBtSW5wdXRzLnJlbW92ZUl0ZW0oaW5wdXQpOworCisgICAgRGV2aWNlVmVjdG9yIHByaW1hcnlJbnB1dERldmljZXMgPSBhdmFpbGFibGVQcmltYXJ5TW9kdWxlSW5wdXREZXZpY2VzKCk7CisgICAgaWYgKHByaW1hcnlJbnB1dERldmljZXMuY29udGFpbnMoZGV2aWNlKSAmJgorICAgICAgICAgICAgbUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhwcmltYXJ5SW5wdXREZXZpY2VzKSA9PSAwKSB7CisgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKKyAgICB9CiB9CiAKLVNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRzRm9yRGV2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24mIG9wZW5PdXRwdXRzKQorU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dHNGb3JEZXZpY2VzKAorICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAorICAgICAgICAgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24mIG9wZW5PdXRwdXRzKQogewogICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKIAotICAgIEFMT0dWVigiZ2V0T3V0cHV0c0ZvckRldmljZSgpIGRldmljZSAlMDR4IiwgZGV2aWNlKTsKKyAgICBBTE9HVlYoIiVzKCkgZGV2aWNlcyAlcyIsIF9fZnVuY19fLCBkZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvcGVuT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBBTE9HVlYoIm91dHB1dCAlenUgaXNEdXBsaWNhdGVkPSVkIGRldmljZT0lMDR4IiwKKyAgICAgICAgQUxPR1ZWKCJvdXRwdXQgJXp1IGlzRHVwbGljYXRlZD0lZCBkZXZpY2U9JXMiLAogICAgICAgICAgICAgICAgIGksIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPmlzRHVwbGljYXRlZCgpLAotICAgICAgICAgICAgICAgIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPnN1cHBvcnRlZERldmljZXMoKSk7Ci0gICAgICAgIGlmICgoZGV2aWNlICYgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+c3VwcG9ydGVkRGV2aWNlcygpKSA9PSBkZXZpY2UpIHsKLSAgICAgICAgICAgIEFMT0dWVigiZ2V0T3V0cHV0c0ZvckRldmljZSgpIGZvdW5kIG91dHB1dCAlZCIsIG9wZW5PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5zdXBwb3J0ZWREZXZpY2VzKCkudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgaWYgKG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPnN1cHBvcnRzQWxsRGV2aWNlcyhkZXZpY2VzKQorICAgICAgICAgICAgICAgICYmIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPmRldmljZVN1cHBvcnRzRW5jb2RlZEZvcm1hdHMoZGV2aWNlcy50eXBlcygpKSkgeworICAgICAgICAgICAgQUxPR1ZWKCIlcygpIGZvdW5kIG91dHB1dCAlZCIsIF9fZnVuY19fLCBvcGVuT3V0cHV0cy5rZXlBdChpKSk7CiAgICAgICAgICAgICBvdXRwdXRzLmFkZChvcGVuT3V0cHV0cy5rZXlBdChpKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIG91dHB1dHM7CiB9CiAKLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp2ZWN0b3JzRXF1YWwoU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMyKQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcyhzdGQ6OmZ1bmN0aW9uPGJvb2woKT4gb25PdXRwdXRzQ2hlY2tlZCkKIHsKLSAgICBpZiAob3V0cHV0czEuc2l6ZSgpICE9IG91dHB1dHMyLnNpemUoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gY2hlY2tBMmRwU3VzcGVuZCBtdXN0IHJ1biBiZWZvcmUgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzIHNvIHRoYXQgQTJEUAorICAgIC8vIG91dHB1dCBpcyBzdXNwZW5kZWQgYmVmb3JlIGFueSB0cmFja3MgYXJlIG1vdmVkIHRvIGl0CisgICAgY2hlY2tBMmRwU3VzcGVuZCgpOworICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOworICAgIGNoZWNrU2Vjb25kYXJ5T3V0cHV0cygpOworICAgIGlmIChvbk91dHB1dHNDaGVja2VkICE9IG51bGxwdHIgJiYgb25PdXRwdXRzQ2hlY2tlZCgpKSBjaGVja0EyZHBTdXNwZW5kKCk7CisgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKyAgICBpZiAobUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSAhPSAwKSB7CisgICAgICAgIHNldE1zZFBhdGNoKCk7CiAgICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0czEuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG91dHB1dHMxW2ldICE9IG91dHB1dHMyW2ldKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dEZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6Zm9sbG93c1NhbWVSb3V0aW5nKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmbEF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmckF0dHIpIGNvbnN0CiB7Ci0gICAgYXVkaW9fZGV2aWNlc190IG9sZERldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCB0cnVlIC8qZnJvbUNhY2hlKi8pOwotICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzcmNPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShvbGREZXZpY2UsIG1QcmV2aW91c091dHB1dHMpOwotICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZHN0T3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UobmV3RGV2aWNlLCBtT3V0cHV0cyk7CisgICAgcmV0dXJuIG1FbmdpbmUtPmdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMobEF0dHIpID09CisgICAgICAgICAgICBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKHJBdHRyKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpCit7CisgICAgYXV0byBwc0lkID0gbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhhdHRyKTsKKworICAgIERldmljZVZlY3RvciBvbGREZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0ciwgMCwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHIsIDAsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc3JjT3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2VzKG9sZERldmljZXMsIG1QcmV2aW91c091dHB1dHMpOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZHN0T3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2VzKG5ld0RldmljZXMsIG1PdXRwdXRzKTsKIAogICAgIC8vIGFsc28gdGFrZSBpbnRvIGFjY291bnQgZXh0ZXJuYWwgcG9saWN5LXJlbGF0ZWQgY2hhbmdlczogYWRkIGFsbCBvdXRwdXRzIHdoaWNoIGFyZQogICAgIC8vIGFzc29jaWF0ZWQgd2l0aCBwb2xpY2llcyBpbiB0aGUgImJlZm9yZSIgYW5kICJhZnRlciIgb3V0cHV0IHZlY3RvcnMKLSAgICBBTE9HVlYoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKTogcG9saWN5IHJlbGF0ZWQgb3V0cHV0cyIpOworICAgIEFMT0dWVigiJXMoKTogcG9saWN5IHJlbGF0ZWQgb3V0cHV0cyIsIF9fZnVuY19fKTsKICAgICBmb3IgKHNpemVfdCBpID0gMCA7IGkgPCBtUHJldmlvdXNPdXRwdXRzLnNpemUoKSA7IGkrKykgewogICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1QcmV2aW91c091dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgaWYgKGRlc2MgIT0gMCAmJiBkZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpIHsKQEAgLTQ3NTMsNyArNTAwNiw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIXZlY3RvcnNFcXVhbChzcmNPdXRwdXRzLGRzdE91dHB1dHMpKSB7CisgICAgaWYgKHNyY091dHB1dHMgIT0gZHN0T3V0cHV0cykgewogICAgICAgICAvLyBnZXQgbWF4aW11bSBsYXRlbmN5IG9mIGFsbCBzb3VyY2Ugb3V0cHV0cyB0byBkZXRlcm1pbmUgdGhlIG1pbmltdW0gbXV0ZSB0aW1lIGd1YXJhbnRlZWluZwogICAgICAgICAvLyBhdWRpbyBmcm9tIGludmFsaWRhdGVkIHRyYWNrcyB3aWxsIGJlIHJlbmRlcmVkIHdoZW4gdW5tdXRpbmcKICAgICAgICAgdWludDMyX3QgbWF4TGF0ZW5jeSA9IDA7CkBAIC00NzYzLDQ4ICs1MDE2LDY0IEBACiAgICAgICAgICAgICAgICAgbWF4TGF0ZW5jeSA9IGRlc2MtPmxhdGVuY3koKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIHN0cmF0ZWd5ICVkLCBtb3ZpbmcgZnJvbSBvdXRwdXQgJWQgdG8gb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgc3RyYXRlZ3ksIHNyY091dHB1dHNbMF0sIGRzdE91dHB1dHNbMF0pOworICAgICAgICBBTE9HVl9JRighKHNyY091dHB1dHMuaXNFbXB0eSgpIHx8IGRzdE91dHB1dHMuaXNFbXB0eSgpKSwKKyAgICAgICAgICAgICAgIiVzOiBzdHJhdGVneSAlZCwgbW92aW5nIGZyb20gb3V0cHV0ICVzIHRvIG91dHB1dCAlcyIsIF9fZnVuY19fLCBwc0lkLAorICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhzcmNPdXRwdXRzWzBdKS5jX3N0cigpLAorICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhkc3RPdXRwdXRzWzBdKS5jX3N0cigpKTsKICAgICAgICAgLy8gbXV0ZSBzdHJhdGVneSB3aGlsZSBtb3ZpbmcgdHJhY2tzIGZyb20gb25lIG91dHB1dCB0byBhbm90aGVyCiAgICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0IDogc3JjT3V0cHV0cykgewogICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtUHJldmlvdXNPdXRwdXRzLnZhbHVlRm9yKHNyY091dCk7Ci0gICAgICAgICAgICBpZiAoZGVzYyAhPSAwICYmIGlzU3RyYXRlZ3lBY3RpdmUoZGVzYywgc3RyYXRlZ3kpKSB7Ci0gICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHN0cmF0ZWd5LCB0cnVlLCBkZXNjKTsKLSAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyYXRlZ3ksIGZhbHNlLCBkZXNjLCBtYXhMYXRlbmN5ICogTEFURU5DWV9NVVRFX0ZBQ1RPUiwgbmV3RGV2aWNlKTsKKyAgICAgICAgICAgIGlmIChkZXNjICE9IDAgJiYgZGVzYy0+aXNTdHJhdGVneUFjdGl2ZShwc0lkKSkgeworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShwc0lkLCB0cnVlLCBkZXNjKTsKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUocHNJZCwgZmFsc2UsIGRlc2MsIG1heExhdGVuY3kgKiBMQVRFTkNZX01VVEVfRkFDVE9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEZXZpY2VzLnR5cGVzKCkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBzb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICBnZXRTb3VyY2VGb3JTdHJhdGVneU9uT3V0cHV0KHNyY091dCwgc3RyYXRlZ3kpOworICAgICAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlID0gZ2V0U291cmNlRm9yQXR0cmlidXRlc09uT3V0cHV0KHNyY091dCwgYXR0cik7CiAgICAgICAgICAgICBpZiAoc291cmNlICE9IDApewogICAgICAgICAgICAgICAgIGNvbm5lY3RBdWRpb1NvdXJjZShzb3VyY2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gTW92ZSBlZmZlY3RzIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJhdGVneSBmcm9tIHByZXZpb3VzIG91dHB1dCB0byBuZXcgb3V0cHV0Ci0gICAgICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgeworICAgICAgICAvLyBNb3ZlIGVmZmVjdHMgYXNzb2NpYXRlZCB0byB0aGlzIHN0cmVhbSBmcm9tIHByZXZpb3VzIG91dHB1dCB0byBuZXcgb3V0cHV0CisgICAgICAgIGlmIChmb2xsb3dzU2FtZVJvdXRpbmcoYXR0ciwgYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9NRURJQSkpKSB7CiAgICAgICAgICAgICBzZWxlY3RPdXRwdXRGb3JNdXNpY0VmZmVjdHMoKTsKICAgICAgICAgfQotICAgICAgICAvLyBNb3ZlIHRyYWNrcyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kgZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSkgPT0gc3RyYXRlZ3kpIHsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgLy8gTW92ZSB0cmFja3MgYXNzb2NpYXRlZCB0byB0aGlzIHN0cmVhbSAoYW5kIGxpbmtlZCkgZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAorICAgICAgICBmb3IgKGF1dG8gc3RyZWFtIDogIG1FbmdpbmUtPmdldFN0cmVhbVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHBzSWQpKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShzdHJlYW0pOwogICAgICAgICB9CiAgICAgfQogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKIHsKLSAgICBpZiAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpCi0gICAgICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSk7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSk7Ci0gICAgaWYgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKQotICAgICAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRFRNRik7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9SRVJPVVRJTkcpOworICAgIGZvciAoY29uc3QgYXV0byAmc3RyYXRlZ3kgOiBtRW5naW5lLT5nZXRPcmRlcmVkUHJvZHVjdFN0cmF0ZWdpZXMoKSkgeworICAgICAgICBhdXRvIGF0dHJpYnV0ZXMgPSBtRW5naW5lLT5nZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5KS5mcm9udCgpOworICAgICAgICBjaGVja091dHB1dEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tTZWNvbmRhcnlPdXRwdXRzKCkgeworICAgIHN0ZDo6c2V0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+IHN0cmVhbXNUb0ludmFsaWRhdGU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2NyaXB0b3IgPSBtT3V0cHV0c1tpXTsKKyAgICAgICAgZm9yIChjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQgOiBvdXRwdXREZXNjcmlwdG9yLT5nZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICAvLyBGSVhNRSBjb2RlIGR1cGxpY2F0ZWQgZnJvbSBnZXRPdXRwdXRGb3JBdHRySW50CisgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYzsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gc2Vjb25kYXJ5RGVzY3M7CisgICAgICAgICAgICBtUG9saWN5TWl4ZXMuZ2V0T3V0cHV0Rm9yQXR0cihjbGllbnQtPmF0dHJpYnV0ZXMoKSwgY2xpZW50LT51aWQoKSwgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmRhcnlEZXNjcyk7CisgICAgICAgICAgICBpZiAoIXN0ZDo6ZXF1YWwoY2xpZW50LT5nZXRTZWNvbmRhcnlPdXRwdXRzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmdldFNlY29uZGFyeU91dHB1dHMoKS5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlEZXNjcy5iZWdpbigpLCBzZWNvbmRhcnlEZXNjcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1zVG9JbnZhbGlkYXRlLmluc2VydChjbGllbnQtPnN0cmVhbSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtIDogc3RyZWFtc1RvSW52YWxpZGF0ZSkgeworICAgICAgICBBTE9HRCgiJXMgSW52YWxpZGF0ZSBzdHJlYW0gJWQgZHVlIHRvIHNlY29uZGFyeSBvdXRwdXQgY2hhbmdlIiwgX19mdW5jX18sIHN0cmVhbSk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKHN0cmVhbSk7CisgICAgfQogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBMmRwU3VzcGVuZCgpCkBAIC00ODU3LDEwOCArNTEyNiw4NyBAQAogICAgIH0KIH0KIAotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TmV3T3V0cHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpCitEZXZpY2VWZWN0b3IgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXROZXdPdXRwdXREZXZpY2VzKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpCiB7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgIERldmljZVZlY3RvciBkZXZpY2VzOwogCiAgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwogICAgICAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQpIHsKLSAgICAgICAgICAgIEFMT0dWKCJnZXROZXdPdXRwdXREZXZpY2UoKSBkZXZpY2UgJTA4eCBmb3JjZWQgYnkgcGF0Y2ggJWQiLAotICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlKCksIG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwotICAgICAgICAgICAgcmV0dXJuIG91dHB1dERlc2MtPmRldmljZSgpOworICAgICAgICAgICAgQUxPR1YoIiVzIGRldmljZSAlcyBmb3JjZWQgYnkgcGF0Y2ggJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZXMoKS50b1N0cmluZygpLmNfc3RyKCksIG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOworICAgICAgICAgICAgcmV0dXJuICBvdXRwdXREZXNjLT5kZXZpY2VzKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBDaGVjayBpZiBhbiBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3QgZXhpc3RzIGZvciBhbiBhY3RpdmUgc3RyZWFtIG9uIHRoaXMgb3V0cHV0IGFuZAotICAgIC8vIHVzZSBpdCBpbiBwcmlvcml0eSBiZWZvcmUgYW55IG90aGVyIHJ1bGUKLSAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZm9yY2VkRGV2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgbU91dHB1dFJvdXRlcy5nZXRBY3RpdmVEZXZpY2VGb3JTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIG5vIGNsaWVudCB1c2luZyBkZWZhdWx0IHJvdXRpbmcgaXMgYWN0aXZlIG9uIHRoaXMKKyAgICAvLyBpbnB1dDogYSBzcGVjaWZpYyBhcHAgY2FuIG5vdCBmb3JjZSByb3V0aW5nIGZvciBvdGhlciBhcHBzIGJ5IHNldHRpbmcgYSBwcmVmZXJyZWQgZGV2aWNlLgorICAgIGJvb2wgYWN0aXZlOyAvLyB1bnVzZWQKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQorICAgICAgICBmaW5kUHJlZmVycmVkRGV2aWNlKG91dHB1dERlc2MsIFBST0RVQ1RfU1RSQVRFR1lfTk9ORSwgYWN0aXZlLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IoZGV2aWNlKTsKKyAgICB9CiAKLSAgICAgICAgICAgIGlmIChmb3JjZWREZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZm9yY2VkRGV2aWNlOwotICAgICAgICAgICAgfQorICAgIC8vIExlZ2FjeSBFbmdpbmUgY2Fubm90IHRha2UgY2FyZSBvZiBidXMgZGV2aWNlcyBhbmQgbWl4LCBzbyB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgY29uZmxpY3QKKyAgICAvLyBvZiBzZXRGb3JjZVVzZSAvIERlZmF1bHQgQnVzIGRldmljZSBoZXJlCisgICAgZGV2aWNlID0gbVBvbGljeU1peGVzLmdldERldmljZUFuZE1peEZvck91dHB1dChvdXRwdXREZXNjLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IoZGV2aWNlKTsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnByb2R1Y3RTdHJhdGVneSA6IG1FbmdpbmUtPmdldE9yZGVyZWRQcm9kdWN0U3RyYXRlZ2llcygpKSB7CisgICAgICAgIFN0cmVhbVR5cGVWZWN0b3Igc3RyZWFtcyA9IG1FbmdpbmUtPmdldFN0cmVhbVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3RTdHJhdGVneSk7CisgICAgICAgIGF1dG8gYXR0ciA9IG1FbmdpbmUtPmdldEFsbEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdFN0cmF0ZWd5KS5mcm9udCgpOworCisgICAgICAgIGlmICgoaGFzVm9pY2VTdHJlYW0oc3RyZWFtcykgJiYKKyAgICAgICAgICAgICAoaXNJbkNhbGwoKSB8fCBtT3V0cHV0cy5pc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKHByb2R1Y3RTdHJhdGVneSwgb3V0cHV0RGVzYykpKSB8fAorICAgICAgICAgICAgICgoaGFzU3RyZWFtKHN0cmVhbXMsIEFVRElPX1NUUkVBTV9BTEFSTSkgfHwgaGFzU3RyZWFtKHN0cmVhbXMsIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSkgJiYKKyAgICAgICAgICAgICAgICBtT3V0cHV0cy5pc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKHByb2R1Y3RTdHJhdGVneSwgb3V0cHV0RGVzYykpIHx8CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShwcm9kdWN0U3RyYXRlZ3kpKSB7CisgICAgICAgICAgICAvLyBSZXRyaWV2YWwgb2YgZGV2aWNlcyBmb3Igdm9pY2UgREwgaXMgZG9uZSBvbiBwcmltYXJ5IG91dHB1dCBwcm9maWxlLCBjYW5ub3QKKyAgICAgICAgICAgIC8vIGNoZWNrIHRoZSByb3V0ZSAod291bGQgZm9yY2UgbW9kaWZ5aW5nIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhpcyBwcm9maWxlKQorICAgICAgICAgICAgZGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHIsIG51bGxwdHIsIGZyb21DYWNoZSk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KLQotICAgIC8vIGNoZWNrIHRoZSBmb2xsb3dpbmcgYnkgb3JkZXIgb2YgcHJpb3JpdHkgdG8gcmVxdWVzdCBhIHJvdXRpbmcgY2hhbmdlIGlmIG5lY2Vzc2FyeToKLSAgICAvLyAxOiB0aGUgc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZSBpcyBhY3RpdmUgYW5kIGVuZm9yY2VkIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBlbmZvcmNlZCBhdWRpYmxlCi0gICAgLy8gMjogd2UgYXJlIGluIGNhbGwgb3IgdGhlIHN0cmF0ZWd5IHBob25lIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgcGhvbmUKLSAgICAvLyAzOiB0aGUgc3RyYXRlZ3kgc29uaWZpY2F0aW9uIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgc29uaWZpY2F0aW9uCi0gICAgLy8gNDogdGhlIHN0cmF0ZWd5IGZvciBlbmZvcmNlZCBhdWRpYmxlIGlzIGFjdGl2ZSBidXQgbm90IGVuZm9yY2VkIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgdGhlIGRldmljZSBmb3Igc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZQotICAgIC8vIDU6IHRoZSBzdHJhdGVneSBhY2Nlc3NpYmlsaXR5IGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgYWNjZXNzaWJpbGl0eQotICAgIC8vIDY6IHRoZSBzdHJhdGVneSAicmVzcGVjdGZ1bCIgc29uaWZpY2F0aW9uIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgInJlc3BlY3RmdWwiIHNvbmlmaWNhdGlvbgotICAgIC8vIDc6IHRoZSBzdHJhdGVneSBtZWRpYSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IG1lZGlhCi0gICAgLy8gODogdGhlIHN0cmF0ZWd5IERUTUYgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBEVE1GCi0gICAgLy8gOTogdGhlIHN0cmF0ZWd5IGZvciBiZWFjb24sIGEuay5hLiAidHJhbnNtaXR0ZWQgdGhyb3VnaCBzcGVha2VyIiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IHQtdC1zCi0KLSAgICAvLyBGSVhNRTogZXh0ZW5kIHVzZSBvZiBpc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKCkgdG8gYWxsIHN0cmF0ZWdpZXMKLSAgICAvLyB3aXRoIGEgcmVmaW5lZCBydWxlIGNvbnNpZGVyaW5nIG11dHVhbGx5IGV4Y2x1c2l2ZSBkZXZpY2VzICh1c2luZyBzYW1lIGJhY2tlbmQpCi0gICAgLy8gYXMgb3Bwb3NlZCB0byBhbGwgc3RyZWFtcyBvbiB0aGUgc2FtZSBhdWRpbyBIQUwgbW9kdWxlLgotICAgIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpICYmCi0gICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc0luQ2FsbCgpIHx8Ci0gICAgICAgICAgICAgICBpc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKG91dHB1dERlc2MsIFNUUkFURUdZX1BIT05FKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0FDQ0VTU0lCSUxJVFksIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfTUVESUEpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9EVE1GKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9EVE1GLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfUkVST1VUSU5HKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9SRVJPVVRJTkcsIGZyb21DYWNoZSk7Ci0gICAgfQotCi0gICAgQUxPR1YoImdldE5ld091dHB1dERldmljZSgpIHNlbGVjdGVkIGRldmljZSAleCIsIGRldmljZSk7Ci0gICAgcmV0dXJuIGRldmljZTsKKyAgICBBTE9HVigiJXMgc2VsZWN0ZWQgZGV2aWNlcyAlcyIsIF9fZnVuY19fLCBkZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgcmV0dXJuIGRldmljZXM7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE5ld0lucHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXREZXNjKQorc3A8RGV2aWNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXROZXdJbnB1dERldmljZSgKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dERlc2MpCiB7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKIAogICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwogICAgICAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQpIHsKLSAgICAgICAgICAgIEFMT0dWKCJnZXROZXdJbnB1dERldmljZSgpIGRldmljZSAlMDh4IGZvcmNlZCBieSBwYXRjaCAlZCIsCi0gICAgICAgICAgICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UsIGlucHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gaW5wdXREZXNjLT5tRGV2aWNlOworICAgICAgICAgICAgQUxPR1YoImdldE5ld0lucHV0RGV2aWNlKCkgZGV2aWNlICVzIGZvcmNlZCBieSBwYXRjaCAlZCIsCisgICAgICAgICAgICAgICAgICBpbnB1dERlc2MtPmdldERldmljZSgpLT50b1N0cmluZygpLmNfc3RyKCksIGlucHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7CisgICAgICAgICAgICByZXR1cm4gaW5wdXREZXNjLT5nZXREZXZpY2UoKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIElmIHdlIGFyZSBub3QgaW4gY2FsbCBhbmQgbm8gY2xpZW50IGlzIGFjdGl2ZSBvbiB0aGlzIGlucHV0LCB0aGlzIG1ldGhvZHMgcmV0dXJucwotICAgIC8vIEFVRElPX0RFVklDRV9OT05FLCBjYXVzaW5nIHRoZSBwYXRjaCBvbiB0aGUgaW5wdXQgc3RyZWFtIHRvIGJlIHJlbGVhc2VkLgotICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IGlucHV0RGVzYy0+Z2V0SGlnaGVzdFByaW9yaXR5U291cmNlKHRydWUgLyphY3RpdmVPbmx5Ki8pOwotICAgIGlmIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQgJiYgaXNJbkNhbGwoKSkgewotICAgICAgICBzb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKKyAgICAvLyBIb25vciBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3RzIG9ubHkgaWYgbm8gY2xpZW50IHVzaW5nIGRlZmF1bHQgcm91dGluZyBpcyBhY3RpdmUgb24gdGhpcworICAgIC8vIGlucHV0OiBhIHNwZWNpZmljIGFwcCBjYW4gbm90IGZvcmNlIHJvdXRpbmcgZm9yIG90aGVyIGFwcHMgYnkgc2V0dGluZyBhIHByZWZlcnJlZCBkZXZpY2UuCisgICAgYm9vbCBhY3RpdmU7CisgICAgZGV2aWNlID0gZmluZFByZWZlcnJlZERldmljZShpbnB1dERlc2MsIEFVRElPX1NPVVJDRV9ERUZBVUxULCBhY3RpdmUsIG1BdmFpbGFibGVJbnB1dERldmljZXMpOworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZGV2aWNlOwogICAgIH0KLSAgICBpZiAoc291cmNlICE9IEFVRElPX1NPVVJDRV9ERUZBVUxUKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKHNvdXJjZSk7CisKKyAgICAvLyBJZiB3ZSBhcmUgbm90IGluIGNhbGwgYW5kIG5vIGNsaWVudCBpcyBhY3RpdmUgb24gdGhpcyBpbnB1dCwgdGhpcyBtZXRob2RzIHJldHVybnMKKyAgICAvLyBhIG51bGwgc3A8PiwgY2F1c2luZyB0aGUgcGF0Y2ggb24gdGhlIGlucHV0IHN0cmVhbSB0byBiZSByZWxlYXNlZC4KKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IGlucHV0RGVzYy0+Z2V0SGlnaGVzdFByaW9yaXR5QXR0cmlidXRlcygpOworICAgIGlmIChhdHRyaWJ1dGVzLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCAmJiBpc0luQ2FsbCgpKSB7CisgICAgICAgIGF0dHJpYnV0ZXMuc291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT047CisgICAgfQorICAgIGlmIChhdHRyaWJ1dGVzLnNvdXJjZSAhPSBBVURJT19TT1VSQ0VfREVGQVVMVCkgeworICAgICAgICBkZXZpY2UgPSBtRW5naW5lLT5nZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CiAgICAgfQogCiAgICAgcmV0dXJuIGRldmljZTsKQEAgLTQ5NjksNjUgKzUyMTcsNTAgQEAKICAgICByZXR1cm4gKHN0cmVhbTEgPT0gc3RyZWFtMik7CiB9CiAKLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKLSAgICByZXR1cm4gKHVpbnQzMl90KWdldFN0cmF0ZWd5KHN0cmVhbSk7Ci19Ci0KIGF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKICAgICAvLyBCeSBjaGVja2luZyB0aGUgcmFuZ2Ugb2Ygc3RyZWFtIGJlZm9yZSBjYWxsaW5nIGdldFN0cmF0ZWd5LCB3ZSBhdm9pZAotICAgIC8vIGdldFN0cmF0ZWd5J3MgYmVoYXZpb3IgZm9yIGludmFsaWQgc3RyZWFtcy4gIGdldFN0cmF0ZWd5IHdvdWxkIGRvIGEgQUxPR0UKLSAgICAvLyBhbmQgdGhlbiByZXR1cm4gU1RSQVRFR1lfTUVESUEsIGJ1dCB3ZSB3YW50IHRvIHJldHVybiB0aGUgZW1wdHkgc2V0LgotICAgIGlmIChzdHJlYW0gPCAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgMCB8fCBzdHJlYW0gPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKKyAgICAvLyBnZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtJ3MgYmVoYXZpb3IgZm9yIGludmFsaWQgc3RyZWFtcy4KKyAgICAvLyBlbmdpbmUncyBnZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtIHdvdWxkIGZhbGxiYWNrIG9uIGl0cyBkZWZhdWx0IGJlaGF2aW9yIChtb3N0IHByb2JhYmx5CisgICAgLy8gZGV2aWNlIGZvciBtdXNpYyBzdHJlYW0pLCBidXQgd2Ugd2FudCB0byByZXR1cm4gdGhlIGVtcHR5IHNldC4KKyAgICBpZiAoc3RyZWFtIDwgQVVESU9fU1RSRUFNX01JTiB8fCBzdHJlYW0gPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKICAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOwogICAgIH0KLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IEFVRElPX0RFVklDRV9OT05FOwotICAgIGZvciAoaW50IGN1clN0cmVhbSA9IDA7IGN1clN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgY3VyU3RyZWFtKyspIHsKLSAgICAgICAgaWYgKCFzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCAoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSB7CisgICAgRGV2aWNlVmVjdG9yIGFjdGl2ZURldmljZXM7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CisgICAgZm9yIChhdWRpb19zdHJlYW1fdHlwZV90IGN1clN0cmVhbSA9IEFVRElPX1NUUkVBTV9NSU47IGN1clN0cmVhbSA8IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UOworICAgICAgICAgY3VyU3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIChjdXJTdHJlYW0gKyAxKSkgeworICAgICAgICBpZiAoIXN0cmVhbXNNYXRjaEZvcnZvbHVtZShzdHJlYW0sIGN1clN0cmVhbSkpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgY3VyU3RyYXRlZ3kgPSBnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pOwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyRGV2aWNlcyA9Ci0gICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKHJvdXRpbmdfc3RyYXRlZ3kpY3VyU3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IGdldE91dHB1dHNGb3JEZXZpY2UoY3VyRGV2aWNlcywgbU91dHB1dHMpKSB7CisgICAgICAgIERldmljZVZlY3RvciBjdXJEZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShjdXJTdHJlYW0sIGZhbHNlLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIGRldmljZXMubWVyZ2UoY3VyRGV2aWNlcyk7CisgICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0IDogZ2V0T3V0cHV0c0ZvckRldmljZXMoY3VyRGV2aWNlcywgbU91dHB1dHMpKSB7CiAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkpIHsKLSAgICAgICAgICAgICAgICBjdXJEZXZpY2VzIHw9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKHN0cmVhbVRvVm9sdW1lU291cmNlKChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkpKSB7CisgICAgICAgICAgICAgICAgYWN0aXZlRGV2aWNlcy5tZXJnZShvdXRwdXREZXNjLT5kZXZpY2VzKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGRldmljZXMgfD0gY3VyRGV2aWNlczsKICAgICB9CiAKKyAgICAvLyBGYXZvciBkZXZpY2VzIHNlbGVjdGVkIG9uIGFjdGl2ZSBzdHJlYW1zIGlmIGFueSB0byByZXBvcnQgY29ycmVjdCBkZXZpY2UgaW4gY2FzZSBvZgorICAgIC8vIGV4cGxpY2l0IGRldmljZSBzZWxlY3Rpb24KKyAgICBpZiAoIWFjdGl2ZURldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIGRldmljZXMgPSBhY3RpdmVEZXZpY2VzOworICAgIH0KICAgICAvKkZpbHRlciBTUEVBS0VSX1NBRkUgb3V0IG9mIHJlc3VsdHMsIGFzIEF1ZGlvU2VydmljZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKICAgICAgIGFuZCBkb2Vzbid0IHJlYWxseSBuZWVkIHRvLiovCi0gICAgaWYgKGRldmljZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkgewotICAgICAgICBkZXZpY2VzIHw9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgZGV2aWNlcyAmPSB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU7CisgICAgRGV2aWNlVmVjdG9yIHNwZWFrZXJTYWZlRGV2aWNlcyA9IGRldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSk7CisgICAgaWYgKCFzcGVha2VyU2FmZURldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIGRldmljZXMubWVyZ2UobUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpKTsKKyAgICAgICAgZGV2aWNlcy5yZW1vdmUoc3BlYWtlclNhZmVEZXZpY2VzKTsKICAgICB9Ci0gICAgcmV0dXJuIGRldmljZXM7Ci19Ci0KLXJvdXRpbmdfc3RyYXRlZ3kgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJhdGVneShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKLXsKLSAgICBBTE9HX0FTU0VSVChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX1BBVENILCJnZXRTdHJhdGVneSgpIGNhbGxlZCBmb3IgQVVESU9fU1RSRUFNX1BBVENIIik7Ci0gICAgcmV0dXJuIG1FbmdpbmUtPmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7Ci19Ci0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyYXRlZ3lGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikgewotICAgIC8vIGZsYWdzIHRvIHN0cmF0ZWd5IG1hcHBpbmcKLSAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19CRUFDT04pID09IEFVRElPX0ZMQUdfQkVBQ09OKSB7Ci0gICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUjsKLSAgICB9Ci0gICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgPT0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSB7Ci0gICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU7Ci0gICAgfQotICAgIC8vIHVzYWdlIHRvIHN0cmF0ZWd5IG1hcHBpbmcKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1FbmdpbmUtPmdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXR0ci0+dXNhZ2UpKTsKKyAgICByZXR1cm4gZGV2aWNlcy50eXBlcygpOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgewogICAgIHN3aXRjaChzdHJlYW0pIHsKICAgICBjYXNlIEFVRElPX1NUUkVBTV9NVVNJQzoKLSAgICAgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCk7CisgICAgICAgIGNoZWNrT3V0cHV0Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX05PVElGSUNBVElPTikpOwogICAgICAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgpAQCAtNTA3OCwxMSArNTMxMSwxMCBAQAogICAgICAgICAvLyBtdXRlL3VubXV0ZSBBVURJT19TVFJFQU1fVFRTIG9uIGFsbCBvdXRwdXRzCiAgICAgICAgIEFMT0dWKCJcdCBtdXRpbmcgJWQiLCBtdXRlKTsKICAgICAgICAgdWludDMyX3QgbWF4TGF0ZW5jeSA9IDA7CisgICAgICAgIGF1dG8gdHRzVm9sdW1lU291cmNlID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1RUUyk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgIHNldFN0cmVhbU11dGUoQVVESU9fU1RSRUFNX1RUUywgbXV0ZS8qb24qLywKLSAgICAgICAgICAgICAgICAgICAgZGVzYywKLSAgICAgICAgICAgICAgICAgICAgMCAvKmRlbGF5Ki8sIEFVRElPX0RFVklDRV9OT05FKTsKKyAgICAgICAgICAgIHNldFZvbHVtZVNvdXJjZU11dGUodHRzVm9sdW1lU291cmNlLCBtdXRlLypvbiovLCBkZXNjLCAwIC8qZGVsYXkqLywgQVVESU9fREVWSUNFX05PTkUpOwogICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbGF0ZW5jeSA9IGRlc2MtPmxhdGVuY3koKSAqIDI7CiAgICAgICAgICAgICBpZiAobGF0ZW5jeSA+IG1heExhdGVuY3kpIHsKICAgICAgICAgICAgICAgICBtYXhMYXRlbmN5ID0gbGF0ZW5jeTsKQEAgLTUwOTQsNDAgKzUzMjYsMTQgQEAKICAgICByZXR1cm4gMDsKIH0KIAotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKQotewotICAgIC8vIENoZWNrIGlmIGFuIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdCBleGlzdHMgZm9yIGEgc3RyZWFtIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUKLSAgICAvLyBzcGVjaWZpZWQgc3RyYXRlZ3kgYW5kIHVzZSBpdCBpbiBwcmlvcml0eSBvdmVyIGRlZmF1bHQgcm91dGluZyBydWxlcy4KLSAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pID09IHN0cmF0ZWd5KSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZm9yY2VkRGV2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgbU91dHB1dFJvdXRlcy5nZXRBY3RpdmVEZXZpY2VGb3JTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7Ci0gICAgICAgICAgICBpZiAoZm9yY2VkRGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZvcmNlZERldmljZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChmcm9tQ2FjaGUpIHsKLSAgICAgICAgQUxPR1ZWKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIGZyb20gY2FjaGUgc3RyYXRlZ3kgJWQsIGRldmljZSAleCIsCi0gICAgICAgICAgICAgIHN0cmF0ZWd5LCBtRGV2aWNlRm9yU3RyYXRlZ3lbc3RyYXRlZ3ldKTsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2VGb3JTdHJhdGVneVtzdHJhdGVneV07Ci0gICAgfQotICAgIHJldHVybiBtRW5naW5lLT5nZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSk7Ci19Ci0KIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpCiB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7Ci0gICAgICAgIG1EZXZpY2VGb3JTdHJhdGVneVtpXSA9IGdldERldmljZUZvclN0cmF0ZWd5KChyb3V0aW5nX3N0cmF0ZWd5KWksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgIH0KKyAgICBtRW5naW5lLT51cGRhdGVEZXZpY2VTZWxlY3Rpb25DYWNoZSgpOwogICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKIH0KIAogdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByZXZEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZwcmV2RGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zKQogewogICAgIC8vIG11dGUvdW5tdXRlIHN0cmF0ZWdpZXMgdXNpbmcgYW4gaW5jb21wYXRpYmxlIGRldmljZSBjb21iaW5hdGlvbgpAQCAtNTEzOCwzNCArNTM0NCwzNiBAQAogICAgIH0KIAogICAgIHVpbnQzMl90IG11dGVXYWl0TXMgPSAwOwotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKLSAgICBib29sIHNob3VsZE11dGUgPSBvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmIChwb3Bjb3VudChkZXZpY2UpID49IDIpOworICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gb3V0cHV0RGVzYy0+ZGV2aWNlcygpOworICAgIGJvb2wgc2hvdWxkTXV0ZSA9IG91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYgKGRldmljZXMuc2l6ZSgpID49IDIpOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgY3VyRGV2aWNlID0gY3VyRGV2aWNlICYgb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpOwotICAgICAgICBib29sIG11dGUgPSBzaG91bGRNdXRlICYmIChjdXJEZXZpY2UgJiBkZXZpY2UpICYmIChjdXJEZXZpY2UgIT0gZGV2aWNlKTsKKyAgICBhdXRvIHByb2R1Y3RTdHJhdGVnaWVzID0gbUVuZ2luZS0+Z2V0T3JkZXJlZFByb2R1Y3RTdHJhdGVnaWVzKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZwcm9kdWN0U3RyYXRlZ3kgOiBwcm9kdWN0U3RyYXRlZ2llcykgeworICAgICAgICBhdXRvIGF0dHJpYnV0ZXMgPSBtRW5naW5lLT5nZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3RTdHJhdGVneSkuZnJvbnQoKTsKKyAgICAgICAgRGV2aWNlVmVjdG9yIGN1ckRldmljZXMgPQorICAgICAgICAgICAgICAgIG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIG51bGxwdHIsIGZhbHNlLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIGN1ckRldmljZXMgPSBjdXJEZXZpY2VzLmZpbHRlcihvdXRwdXREZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpOworICAgICAgICBib29sIG11dGUgPSBzaG91bGRNdXRlICYmIGN1ckRldmljZXMuY29udGFpbnNBdExlYXN0T25lKGRldmljZXMpICYmIGN1ckRldmljZXMgIT0gZGV2aWNlczsKICAgICAgICAgYm9vbCBkb011dGUgPSBmYWxzZTsKIAotICAgICAgICBpZiAobXV0ZSAmJiAhb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSkgeworICAgICAgICBpZiAobXV0ZSAmJiAhb3V0cHV0RGVzYy0+aXNTdHJhdGVneU11dGVkQnlEZXZpY2UocHJvZHVjdFN0cmF0ZWd5KSkgewogICAgICAgICAgICAgZG9NdXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKCFtdXRlICYmIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0peworICAgICAgICAgICAgb3V0cHV0RGVzYy0+c2V0U3RyYXRlZ3lNdXRlZEJ5RGV2aWNlKHByb2R1Y3RTdHJhdGVneSwgdHJ1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIW11dGUgJiYgb3V0cHV0RGVzYy0+aXNTdHJhdGVneU11dGVkQnlEZXZpY2UocHJvZHVjdFN0cmF0ZWd5KSkgewogICAgICAgICAgICAgZG9NdXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSBmYWxzZTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPnNldFN0cmF0ZWd5TXV0ZWRCeURldmljZShwcm9kdWN0U3RyYXRlZ3ksIGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZG9NdXRlKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1PdXRwdXRzLnNpemUoKTsgaisrKSB7CiAgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChqKTsKICAgICAgICAgICAgICAgICAvLyBza2lwIG91dHB1dCBpZiBpdCBkb2VzIG5vdCBzaGFyZSBhbnkgZGV2aWNlIHdpdGggY3VycmVudCBvdXRwdXQKLSAgICAgICAgICAgICAgICBpZiAoKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSAmIG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgaWYgKCFkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkuY29udGFpbnNBdExlYXN0T25lKG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWVigiY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcygpICVzIHN0cmF0ZWd5ICV6dSAoY3VyRGV2aWNlICUwNHgpIiwKLSAgICAgICAgICAgICAgICAgICAgICBtdXRlID8gIm11dGluZyIgOiAidW5tdXRpbmciLCBpLCBjdXJEZXZpY2UpOwotICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCBtdXRlLCBkZXNjLCBtdXRlID8gMCA6IGRlbGF5TXMpOwotICAgICAgICAgICAgICAgIGlmIChpc1N0cmF0ZWd5QWN0aXZlKGRlc2MsIChyb3V0aW5nX3N0cmF0ZWd5KWkpKSB7CisgICAgICAgICAgICAgICAgQUxPR1ZWKCIlcygpICVzIChjdXJEZXZpY2UgJXMpIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgbXV0ZSA/ICJtdXRpbmciIDogInVubXV0aW5nIiwgY3VyRGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShwcm9kdWN0U3RyYXRlZ3ksIG11dGUsIGRlc2MsIG11dGUgPyAwIDogZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUocHJvZHVjdFN0cmF0ZWd5KSkgewogICAgICAgICAgICAgICAgICAgICBpZiAobXV0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IHNob3VsZCBub3QgbmVlZCB0byBkb3VibGUgbGF0ZW5jeSBpZiB2b2x1bWUgY291bGQgYmUgYXBwbGllZAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgYnkgdGhlIGF1ZGlvZmxpbmdlciBtaXhlci4gV2UgbXVzdCBhY2NvdW50IGZvciB0aGUgZGVsYXkKQEAgLTUxODMsMjIgKzUzOTEsMTkgQEAKIAogICAgIC8vIHRlbXBvcmFyeSBtdXRlIG91dHB1dCBpZiBkZXZpY2Ugc2VsZWN0aW9uIGNoYW5nZXMgdG8gYXZvaWQgdm9sdW1lIGJ1cnN0cyBkdWUgdG8KICAgICAvLyBkaWZmZXJlbnQgcGVyIGRldmljZSB2b2x1bWVzCi0gICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYgKGRldmljZSAhPSBwcmV2RGV2aWNlKSkgeworICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmIChkZXZpY2VzICE9IHByZXZEZXZpY2VzKSkgewogICAgICAgICB1aW50MzJfdCB0ZW1wTXV0ZVdhaXRNcyA9IG91dHB1dERlc2MtPmxhdGVuY3koKSAqIDI7CiAgICAgICAgIC8vIHRlbXBvcmFyeSBtdXRlIGR1cmF0aW9uIGlzIGNvbnNlcnZhdGl2ZWx5IHNldCB0byA0IHRpbWVzIHRoZSByZXBvcnRlZCBsYXRlbmN5CiAgICAgICAgIHVpbnQzMl90IHRlbXBNdXRlRHVyYXRpb25NcyA9IG91dHB1dERlc2MtPmxhdGVuY3koKSAqIDQ7CiAgICAgICAgIGlmIChtdXRlV2FpdE1zIDwgdGVtcE11dGVXYWl0TXMpIHsKICAgICAgICAgICAgIG11dGVXYWl0TXMgPSB0ZW1wTXV0ZVdhaXRNczsKICAgICAgICAgfQotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgewotICAgICAgICAgICAgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgKHJvdXRpbmdfc3RyYXRlZ3kpaSkpIHsKLSAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3Qgc3RhcnQgdGhlIHRlbXBvcmFyeSBtdXRlIHBlcmlvZCB0b28gZWFybHkgaW4gY2FzZSBvZgotICAgICAgICAgICAgICAgIC8vIGRlbGF5ZWQgZGV2aWNlIGNoYW5nZQotICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCB0cnVlLCBvdXRwdXREZXNjLCBkZWxheU1zKTsKLSAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoKHJvdXRpbmdfc3RyYXRlZ3kpaSwgZmFsc2UsIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMgKyB0ZW1wTXV0ZUR1cmF0aW9uTXMsIGRldmljZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmYWN0aXZlVnMgOiBvdXRwdXREZXNjLT5nZXRBY3RpdmVWb2x1bWVTb3VyY2VzKCkpIHsKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlIGRvIG5vdCBzdGFydCB0aGUgdGVtcG9yYXJ5IG11dGUgcGVyaW9kIHRvbyBlYXJseSBpbiBjYXNlIG9mCisgICAgICAgICAgICAvLyBkZWxheWVkIGRldmljZSBjaGFuZ2UKKyAgICAgICAgICAgIHNldFZvbHVtZVNvdXJjZU11dGUoYWN0aXZlVnMsIHRydWUsIG91dHB1dERlc2MsIGRlbGF5TXMpOworICAgICAgICAgICAgc2V0Vm9sdW1lU291cmNlTXV0ZShhY3RpdmVWcywgZmFsc2UsIG91dHB1dERlc2MsIGRlbGF5TXMgKyB0ZW1wTXV0ZUR1cmF0aW9uTXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMudHlwZXMoKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTUyMTEsNDYgKzU0MTYsNDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXF1aXJlc011dGVDaGVjaykKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0T3V0cHV0RGV2aWNlcyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVxdWlyZXNNdXRlQ2hlY2spCiB7Ci0gICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIGRldmljZSAlMDR4IGRlbGF5TXMgJWQiLCBkZXZpY2UsIGRlbGF5TXMpOwotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOworICAgIEFMT0dWKCIlcyBkZXZpY2UgJXMgZGVsYXlNcyAlZCIsIF9fZnVuY19fLCBkZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwgZGVsYXlNcyk7CiAgICAgdWludDMyX3QgbXV0ZVdhaXRNczsKIAogICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICBtdXRlV2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPnN1Yk91dHB1dDEoKSwgZGV2aWNlLCBmb3JjZSwgZGVsYXlNcywKLSAgICAgICAgICAgICAgICBudWxscHRyIC8qIHBhdGNoSGFuZGxlICovLCBudWxscHRyIC8qIGFkZHJlc3MgKi8sIHJlcXVpcmVzTXV0ZUNoZWNrKTsKLSAgICAgICAgbXV0ZVdhaXRNcyArPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+c3ViT3V0cHV0MigpLCBkZXZpY2UsIGZvcmNlLCBkZWxheU1zLAotICAgICAgICAgICAgICAgIG51bGxwdHIgLyogcGF0Y2hIYW5kbGUgKi8sIG51bGxwdHIgLyogYWRkcmVzcyAqLywgcmVxdWlyZXNNdXRlQ2hlY2spOworICAgICAgICBtdXRlV2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLT5zdWJPdXRwdXQxKCksIGRldmljZXMsIGZvcmNlLCBkZWxheU1zLAorICAgICAgICAgICAgICAgIG51bGxwdHIgLyogcGF0Y2hIYW5kbGUgKi8sIHJlcXVpcmVzTXV0ZUNoZWNrKTsKKyAgICAgICAgbXV0ZVdhaXRNcyArPSBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MtPnN1Yk91dHB1dDIoKSwgZGV2aWNlcywgZm9yY2UsIGRlbGF5TXMsCisgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBwYXRjaEhhbmRsZSAqLywgcmVxdWlyZXNNdXRlQ2hlY2spOwogICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKICAgICB9Ci0gICAgLy8gbm8gbmVlZCB0byBwcm9jZWVkIGlmIG5ldyBkZXZpY2UgaXMgbm90IEFVRElPX0RFVklDRV9OT05FIGFuZCBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQKLSAgICAvLyBvdXRwdXQgcHJvZmlsZQotICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSAmJgotICAgICAgICAgICAgKChkZXZpY2UgJiBvdXRwdXREZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpID09IEFVRElPX0RFVklDRV9OT05FKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9CiAKICAgICAvLyBmaWx0ZXIgZGV2aWNlcyBhY2NvcmRpbmcgdG8gb3V0cHV0IHNlbGVjdGVkCi0gICAgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkoZGV2aWNlICYgb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKTsKKyAgICBEZXZpY2VWZWN0b3IgZmlsdGVyZWREZXZpY2VzID0gb3V0cHV0RGVzYy0+ZmlsdGVyU3VwcG9ydGVkRGV2aWNlcyhkZXZpY2VzKTsKKyAgICBEZXZpY2VWZWN0b3IgcHJldkRldmljZXMgPSBvdXRwdXREZXNjLT5kZXZpY2VzKCk7CiAKLSAgICBhdWRpb19kZXZpY2VzX3QgcHJldkRldmljZSA9IG91dHB1dERlc2MtPm1EZXZpY2U7CisgICAgLy8gbm8gbmVlZCB0byBwcm9jZWVkIGlmIG5ldyBkZXZpY2UgaXMgbm90IEFVRElPX0RFVklDRV9OT05FIGFuZCBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQKKyAgICAvLyBvdXRwdXQgcHJvZmlsZSBvciBpZiBuZXcgZGV2aWNlIGlzIG5vdCBzdXBwb3J0ZWQgQU5EIHByZXZpb3VzIGRldmljZShzKSBpcyhhcmUpIHN0aWxsCisgICAgLy8gYXZhaWxhYmxlIChvdGhlcndpc2UgcmVzZXQgZGV2aWNlIG11c3QgYmUgZG9uZSBvbiB0aGUgb3V0cHV0KQorICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkgJiYgZmlsdGVyZWREZXZpY2VzLmlzRW1wdHkoKSAmJgorICAgICAgICAgICAgIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmZpbHRlcihwcmV2RGV2aWNlcykuZW1wdHkoKSkgeworICAgICAgICBBTE9HVigiJXM6IHVuc3VwcG9ydGVkIGRldmljZSAlcyBmb3Igb3V0cHV0IiwgX19mdW5jX18sIGRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0gICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIHByZXZEZXZpY2UgMHglMDR4IiwgcHJldkRldmljZSk7CisgICAgQUxPR1YoInNldE91dHB1dERldmljZXMoKSBwcmV2RGV2aWNlICVzIiwgcHJldkRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKIAotICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKKyAgICBpZiAoIWZpbHRlcmVkRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgb3V0cHV0RGVzYy0+c2V0RGV2aWNlcyhmaWx0ZXJlZERldmljZXMpOwogICAgIH0KIAogICAgIC8vIGlmIHRoZSBvdXRwdXRzIGFyZSBub3QgbWF0ZXJpYWxseSBhY3RpdmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gbXV0ZS4KICAgICBpZiAocmVxdWlyZXNNdXRlQ2hlY2spIHsKLSAgICAgICAgbXV0ZVdhaXRNcyA9IGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMob3V0cHV0RGVzYywgcHJldkRldmljZSwgZGVsYXlNcyk7CisgICAgICAgIG11dGVXYWl0TXMgPSBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKG91dHB1dERlc2MsIHByZXZEZXZpY2VzLCBkZWxheU1zKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiJXM6IHN1cHByZXNzaW5nIGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMiLCBfX2Z1bmNfXyk7CiAgICAgICAgIG11dGVXYWl0TXMgPSAwOwpAQCAtNTI2MSw4OSArNTQ2NiwzMiBAQAogICAgIC8vICAgICAgT1IgdGhlIHJlcXVlc3RlZCBkZXZpY2UgaXMgdGhlIHNhbWUgYXMgY3VycmVudCBkZXZpY2UKICAgICAvLyAgQU5EIGZvcmNlIGlzIG5vdCBzcGVjaWZpZWQKICAgICAvLyAgQU5EIHRoZSBvdXRwdXQgaXMgY29ubmVjdGVkIGJ5IGEgdmFsaWQgYXVkaW8gcGF0Y2guCi0gICAgLy8gRG9pbmcgdGhpcyBjaGVjayBoZXJlIGFsbG93cyB0aGUgY2FsbGVyIHRvIGNhbGwgc2V0T3V0cHV0RGV2aWNlKCkgd2l0aG91dCBjb25kaXRpb25zCi0gICAgaWYgKChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUgfHwgZGV2aWNlID09IHByZXZEZXZpY2UpICYmCi0gICAgICAgICFmb3JjZSAmJgotICAgICAgICBvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpICE9IDApIHsKLSAgICAgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIHNldHRpbmcgc2FtZSBkZXZpY2UgMHglMDR4IG9yIG51bGwgZGV2aWNlIiwgZGV2aWNlKTsKKyAgICAvLyBEb2luZyB0aGlzIGNoZWNrIGhlcmUgYWxsb3dzIHRoZSBjYWxsZXIgdG8gY2FsbCBzZXRPdXRwdXREZXZpY2VzKCkgd2l0aG91dCBjb25kaXRpb25zCisgICAgaWYgKChmaWx0ZXJlZERldmljZXMuaXNFbXB0eSgpIHx8IGZpbHRlcmVkRGV2aWNlcyA9PSBwcmV2RGV2aWNlcykgJiYKKyAgICAgICAgICAgICFmb3JjZSAmJiBvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpICE9IDApIHsKKyAgICAgICAgQUxPR1YoIiVzIHNldHRpbmcgc2FtZSBkZXZpY2UgJXMgb3IgbnVsbCBkZXZpY2UsIGZvcmNlPSVkLCBwYXRjaCBoYW5kbGU9JWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgZmlsdGVyZWREZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwgZm9yY2UsIG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwogICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKICAgICB9CiAKLSAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgY2hhbmdpbmcgZGV2aWNlIik7CisgICAgQUxPR1YoIiVzIGNoYW5naW5nIGRldmljZSB0byAlcyIsIF9fZnVuY19fLCBmaWx0ZXJlZERldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKIAogICAgIC8vIGRvIHRoZSByb3V0aW5nCi0gICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgIGlmIChmaWx0ZXJlZERldmljZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgIHJlc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGRlbGF5TXMsIE5VTEwpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0OwotICAgICAgICBpZiAoKGFkZHJlc3MgPT0gTlVMTCkgfHwgKHN0cmxlbihhZGRyZXNzKSA9PSAwKSkgewotICAgICAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZUFkZHIoZGV2aWNlLCBTdHJpbmc4KGFkZHJlc3MpKTsKKyAgICAgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKKyAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShvdXRwdXREZXNjKTsKKyAgICAgICAgQUxPR19BU1NFUlQoZmlsdGVyZWREZXZpY2VzLnNpemUoKSA8PSBBVURJT19QQVRDSF9QT1JUU19NQVgsICJUb28gbWFueSBzaW5rIHBvcnRzIik7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmZmlsdGVyZWREZXZpY2UgOiBmaWx0ZXJlZERldmljZXMpIHsKKyAgICAgICAgICAgIHBhdGNoQnVpbGRlci5hZGRTaW5rKGZpbHRlcmVkRGV2aWNlKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzBdKTsKLSAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICAgICAgICAgIHBhdGNoLm51bV9zaW5rcyA9IDA7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldmljZUxpc3Quc2l6ZSgpICYmIGkgPCBBVURJT19QQVRDSF9QT1JUU19NQVg7IGkrKykgewotICAgICAgICAgICAgICAgIGRldmljZUxpc3QuaXRlbUF0KGkpLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbaV0pOwotICAgICAgICAgICAgICAgIHBhdGNoLm51bV9zaW5rcysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3NpemVfdCBpbmRleDsKLSAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSAmJiAqcGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPCBBdWRpb1BhdGNoPiBwYXRjaERlc2M7Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKLSAgICAgICAgICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBjcmVhdGVBdWRpb1BhdGNoIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIgotICAgICAgICAgICAgICAgICAgICAibnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSwgcGF0Y2gubnVtX3NvdXJjZXMsIHBhdGNoLm51bV9zaW5rcyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgmcGF0Y2gsIG1VaWRDYWNoZWQpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IHBhdGNoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgKnBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5zZXRQYXRjaEhhbmRsZShwYXRjaERlc2MtPm1IYW5kbGUpOwotICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGluZm9ybSBhbGwgaW5wdXQgYXMgd2VsbAotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXREZXNjcmlwdG9yID0gbUlucHV0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKCFpc192aXJ0dWFsX2lucHV0X2RldmljZShpbnB1dERlc2NyaXB0b3ItPm1EZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgaW5wdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOwotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogaW5mb3JtIGlucHV0ICVkIG9mIGRldmljZTolZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci0+bUlvSGFuZGxlLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIGlucHV0Q21kLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSxkZXZpY2UpOwotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKGlucHV0RGVzY3JpcHRvci0+bUlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Q21kLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgaW5zdGFsbFBhdGNoKF9fZnVuY19fLCBwYXRjaEhhbmRsZSwgb3V0cHV0RGVzYy5nZXQoKSwgcGF0Y2hCdWlsZGVyLnBhdGNoKCksIGRlbGF5TXMpOwogICAgIH0KIAogICAgIC8vIHVwZGF0ZSBzdHJlYW0gdm9sdW1lcyBhY2NvcmRpbmcgdG8gbmV3IGRldmljZQotICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXREZXNjLCBkZXZpY2UsIGRlbGF5TXMpOworICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXREZXNjLCBmaWx0ZXJlZERldmljZXMudHlwZXMoKSwgZGVsYXlNcyk7CiAKICAgICByZXR1cm4gbXV0ZVdhaXRNczsKIH0KQEAgLTUzNzIsNjMgKzU1MjAsMzAgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRJbnB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogCiAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoaW5wdXQpOwotICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSAmJiAoKGRldmljZSAhPSBpbnB1dERlc2MtPm1EZXZpY2UpIHx8IGZvcmNlKSkgewotICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisgICAgaWYgKChkZXZpY2UgIT0gbnVsbHB0cikgJiYgKChkZXZpY2UgIT0gaW5wdXREZXNjLT5nZXREZXZpY2UoKSkgfHwgZm9yY2UpKSB7CisgICAgICAgIGlucHV0RGVzYy0+c2V0RGV2aWNlKGRldmljZSk7CiAKLSAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7Ci0gICAgICAgICAgICBpbnB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1swXSk7CisgICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmNvbnRhaW5zKGRldmljZSkpIHsKKyAgICAgICAgICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CisgICAgICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU2luayhpbnB1dERlc2MsCiAgICAgICAgICAgICAvLyBBVURJT19TT1VSQ0VfSE9UV09SRCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk6CiAgICAgICAgICAgICAvLyBoYW5kbGVkIGFzIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiBieSB0aGUgYXVkaW8gSEFMCi0gICAgICAgICAgICBpZiAocGF0Y2guc2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCAmJgotICAgICAgICAgICAgICAgICAgICAhaW5wdXREZXNjLT5pc1NvdW5kVHJpZ2dlcigpKSB7Ci0gICAgICAgICAgICAgICAgcGF0Y2guc2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgICAgICAgICAgICAgICAgIFtpbnB1dERlc2NdKGNvbnN0IFBhdGNoQnVpbGRlcjo6bWl4X3VzZWNhc2VfdCYgdXNlY2FzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSB1c2VjYXNlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYgIWlucHV0RGVzYy0+aXNTb3VuZFRyaWdnZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OyB9KS4KICAgICAgICAgICAgIC8vb25seSBvbmUgaW5wdXQgZGV2aWNlIGZvciBub3cKLSAgICAgICAgICAgIGRldmljZUxpc3QuaXRlbUF0KDApLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7Ci0gICAgICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4OwotICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlICYmICpwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpwYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjOwotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICAgICAgQUxPR1YoInNldElucHV0RGV2aWNlKCkgY3JlYXRlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgmcGF0Y2gsIG1VaWRDYWNoZWQpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IHBhdGNoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgKnBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnB1dERlc2MtPnNldFBhdGNoSGFuZGxlKHBhdGNoRGVzYy0+bUhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhZGRTb3VyY2UoZGV2aWNlKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGluc3RhbGxQYXRjaChfX2Z1bmNfXywgcGF0Y2hIYW5kbGUsIGlucHV0RGVzYy5nZXQoKSwgcGF0Y2hCdWlsZGVyLnBhdGNoKCksIDApOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CkBAIC01NDU3LDggKzU1NzIsNyBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXNwPElPUHJvZmlsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dFByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKK3NwPElPUHJvZmlsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dFByb2ZpbGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QmIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QmIGNoYW5uZWxNYXNrLApAQCAtNTQ3OCw3ICs1NTkyLDcgQEAKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwcm9maWxlIDogaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKSkgewogICAgICAgICAgICAgLy8gcHJvZmlsZS0+bG9nKCk7CiAgICAgICAgICAgICAvL3VwZGF0ZWRGb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2UsIGFkZHJlc3MsIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgIGlmIChwcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKERldmljZVZlY3RvcihkZXZpY2UpLCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxpbmdSYXRlICAvKnVwZGF0ZWRTYW1wbGluZ1JhdGUqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JtYXQsICAgICAgIC8qdXBkYXRlZEZvcm1hdCovCkBAIC01NDg5LDcgKzU2MDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmV4YWN0TWF0Y2hSZXF1aXJlZEZvcklucHV0RmxhZ3MqLykpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gcHJvZmlsZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmaXJzdEluZXhhY3QgPT0gbnVsbHB0ciAmJiBwcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZSwgYWRkcmVzcywKKyAgICAgICAgICAgIGlmIChmaXJzdEluZXhhY3QgPT0gbnVsbHB0ciAmJiBwcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKERldmljZVZlY3RvcihkZXZpY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVwZGF0ZWRTYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCkBAIC01NTEzLDgzICs1NjI3LDUxIEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLQotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCAqKnBvbGljeU1peCkKLXsKLSAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICBhdWRpb19kZXZpY2VzX3Qgc2VsZWN0ZWREZXZpY2VGcm9tTWl4ID0KLSAgICAgICAgICAgbVBvbGljeU1peGVzLmdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGlucHV0U291cmNlLCBhdmFpbGFibGVEZXZpY2VUeXBlcywgcG9saWN5TWl4KTsKLQotICAgIGlmIChzZWxlY3RlZERldmljZUZyb21NaXggIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgcmV0dXJuIHNlbGVjdGVkRGV2aWNlRnJvbU1peDsKLSAgICB9Ci0gICAgcmV0dXJuIGdldERldmljZUZvcklucHV0U291cmNlKGlucHV0U291cmNlKTsKLX0KLQotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpCi17Ci0gICAgLy8gUm91dGluZwotICAgIC8vIFNjYW4gdGhlIHdob2xlIFJvdXRlTWFwIHRvIHNlZSBpZiB3ZSBoYXZlIGFuIGV4cGxpY2l0IHJvdXRlOgotICAgIC8vIGlmIHRoZSBpbnB1dCBzb3VyY2UgaW4gdGhlIFJvdXRlTWFwIGlzIHRoZSBzYW1lIGFzIHRoZSBhcmd1bWVudCBhYm92ZSwKLSAgICAvLyBhbmQgYWN0aXZpdHkgY291bnQgaXMgbm9uLXplcm8gYW5kIHRoZSBkZXZpY2UgaW4gdGhlIHJvdXRlIGRlc2NyaXB0b3IgaXMgYXZhaWxhYmxlCi0gICAgLy8gdGhlbiBzZWxlY3QgdGhpcyBkZXZpY2UuCi0gICAgZm9yIChzaXplX3Qgcm91dGVJbmRleCA9IDA7IHJvdXRlSW5kZXggPCBtSW5wdXRSb3V0ZXMuc2l6ZSgpOyByb3V0ZUluZGV4KyspIHsKLSAgICAgICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBtSW5wdXRSb3V0ZXMudmFsdWVBdChyb3V0ZUluZGV4KTsKLSAgICAgICAgIGlmICgoaW5wdXRTb3VyY2UgPT0gcm91dGUtPm1Tb3VyY2UpICYmIHJvdXRlLT5pc0FjdGl2ZU9yQ2hhbmdlZCgpICYmCi0gICAgICAgICAgICAgICAgIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2Yocm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yKSA+PSAwKSkgewotICAgICAgICAgICAgIHJldHVybiByb3V0ZS0+bURldmljZURlc2NyaXB0b3ItPnR5cGUoKTsKLSAgICAgICAgIH0KLSAgICAgfQotCi0gICAgIHJldHVybiBtRW5naW5lLT5nZXREZXZpY2VGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSk7Ci19Ci0KLWZsb2F0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29tcHV0ZVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKK2Zsb2F0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29tcHV0ZVZvbHVtZShJVm9sdW1lQ3VydmVzICZjdXJ2ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKIHsKLSAgICBmbG9hdCB2b2x1bWVEQiA9IG1Wb2x1bWVDdXJ2ZXMtPnZvbEluZGV4VG9EYihzdHJlYW0sIFZvbHVtZTo6Z2V0RGV2aWNlQ2F0ZWdvcnkoZGV2aWNlKSwgaW5kZXgpOworICAgIGZsb2F0IHZvbHVtZURiID0gY3VydmVzLnZvbEluZGV4VG9EYihWb2x1bWU6OmdldERldmljZUNhdGVnb3J5KGRldmljZSksIGluZGV4KTsKIAogICAgIC8vIGhhbmRsZSB0aGUgY2FzZSBvZiBhY2Nlc3NpYmlsaXR5IGFjdGl2ZSB3aGlsZSBhIHJpbmd0b25lIGlzIHBsYXlpbmc6IGlmIHRoZSByaW5ndG9uZSBpcyBtdWNoCiAgICAgLy8gbG91ZGVyIHRoYW4gdGhlIGFjY2Vzc2liaWxpdHkgcHJvbXB0LCB0aGUgcHJvbXB0IGNhbm5vdCBiZSBoZWFyZCwgdGh1cyBtYXNraW5nIHRoZSB0b3VjaAogICAgIC8vIGV4cGxvcmF0aW9uIG9mIHRoZSBkaWFsZXIgVUkuIEluIHRoaXMgc2l0dWF0aW9uLCBicmluZyB0aGUgYWNjZXNzaWJpbGl0eSB2b2x1bWUgY2xvc2VyIHRvCiAgICAgLy8gdGhlIHJpbmd0b25lIHZvbHVtZQotICAgIGlmICgoc3RyZWFtID09IEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKQotICAgICAgICAgICAgJiYgKEFVRElPX01PREVfUklOR1RPTkUgPT0gbUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpKQotICAgICAgICAgICAgJiYgaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX1JJTkcsIDApKSB7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHJpbmdWb2x1bWVEQiA9IGNvbXB1dGVWb2x1bWUoQVVESU9fU1RSRUFNX1JJTkcsIGluZGV4LCBkZXZpY2UpOwotICAgICAgICByZXR1cm4gcmluZ1ZvbHVtZURCIC0gNCA+IHZvbHVtZURCID8gcmluZ1ZvbHVtZURCIC0gNCA6IHZvbHVtZURCOworICAgIGNvbnN0IGF1dG8gY2FsbFZvbHVtZVNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKKyAgICBjb25zdCBhdXRvIHJpbmdWb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fUklORyk7CisgICAgY29uc3QgYXV0byBtdXNpY1ZvbHVtZVNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9NVVNJQyk7CisgICAgY29uc3QgYXV0byBhbGFybVZvbHVtZVNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9BTEFSTSk7CisKKyAgICBpZiAodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKQorICAgICAgICAgICAgJiYgKEFVRElPX01PREVfUklOR1RPTkUgPT0gbUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpKSAmJgorICAgICAgICAgICAgbU91dHB1dHMuaXNBY3RpdmUocmluZ1ZvbHVtZVNyYywgMCkpIHsKKyAgICAgICAgYXV0byAmcmluZ0N1cnZlcyA9IGdldFZvbHVtZUN1cnZlcyhBVURJT19TVFJFQU1fUklORyk7CisgICAgICAgIGNvbnN0IGZsb2F0IHJpbmdWb2x1bWVEYiA9IGNvbXB1dGVWb2x1bWUocmluZ0N1cnZlcywgcmluZ1ZvbHVtZVNyYywgaW5kZXgsIGRldmljZSk7CisgICAgICAgIHJldHVybiByaW5nVm9sdW1lRGIgLSA0ID4gdm9sdW1lRGIgPyByaW5nVm9sdW1lRGIgLSA0IDogdm9sdW1lRGI7CiAgICAgfQogCi0gICAgLy8gaW4tY2FsbDogYWx3YXlzIGNhcCBlYXJwaWVjZSB2b2x1bWUgYnkgdm9pY2Ugdm9sdW1lICsgc29tZSBsb3cgaGVhZHJvb20KLSAgICBpZiAoKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UpICYmCi0gICAgICAgICAgICAoaXNJbkNhbGwoKSB8fCBtT3V0cHV0cy5pc1N0cmVhbUFjdGl2ZUxvY2FsbHkoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKSkgewotICAgICAgICBzd2l0Y2ggKHN0cmVhbSkgewotICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9TWVNURU06Ci0gICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1JJTkc6Ci0gICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgotICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9BTEFSTToKLSAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOgotICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOgotICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9EVE1GOgotICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZOiB7Ci0gICAgICAgICAgICBpbnQgdm9pY2VWb2x1bWVJbmRleCA9Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXgoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UpOwotICAgICAgICAgICAgY29uc3QgZmxvYXQgbWF4Vm9pY2VWb2xEYiA9Ci0gICAgICAgICAgICAgICAgY29tcHV0ZVZvbHVtZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgdm9pY2VWb2x1bWVJbmRleCwgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSkKKyAgICAvLyBpbi1jYWxsOiBhbHdheXMgY2FwIHZvbHVtZSBieSB2b2ljZSB2b2x1bWUgKyBzb21lIGxvdyBoZWFkcm9vbQorICAgIGlmICgodm9sdW1lU291cmNlICE9IGNhbGxWb2x1bWVTcmMgJiYgKGlzSW5DYWxsKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cy5pc0FjdGl2ZUxvY2FsbHkoY2FsbFZvbHVtZVNyYykpKSAmJgorICAgICAgICAgICAgKHZvbHVtZVNvdXJjZSA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fU1lTVEVNKSB8fAorICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSByaW5nVm9sdW1lU3JjIHx8IHZvbHVtZVNvdXJjZSA9PSBtdXNpY1ZvbHVtZVNyYyB8fAorICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSBhbGFybVZvbHVtZVNyYyB8fAorICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OKSB8fAorICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSkgfHwKKyAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0RUTUYpIHx8CisgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKSkpIHsKKyAgICAgICAgYXV0byAmdm9pY2VDdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXMoY2FsbFZvbHVtZVNyYyk7CisgICAgICAgIGludCB2b2ljZVZvbHVtZUluZGV4ID0gdm9pY2VDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKTsKKyAgICAgICAgY29uc3QgZmxvYXQgbWF4Vm9pY2VWb2xEYiA9CisgICAgICAgICAgICAgICAgY29tcHV0ZVZvbHVtZSh2b2ljZUN1cnZlcywgY2FsbFZvbHVtZVNyYywgdm9pY2VWb2x1bWVJbmRleCwgZGV2aWNlKQogICAgICAgICAgICAgICAgICsgSU5fQ0FMTF9FQVJQSUVDRV9IRUFEUk9PTV9EQjsKLSAgICAgICAgICAgIGlmICh2b2x1bWVEQiA+IG1heFZvaWNlVm9sRGIpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiY29tcHV0ZVZvbHVtZSgpIHN0cmVhbSAlZCBhdCB2b2w9JWYgb3ZlcnJpZGVuIGJ5IHN0cmVhbSAlZCBhdCB2b2w9JWYiLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCB2b2x1bWVEQiwgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIG1heFZvaWNlVm9sRGIpOwotICAgICAgICAgICAgICAgIHZvbHVtZURCID0gbWF4Vm9pY2VWb2xEYjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHZvbHVtZURiID4gbWF4Vm9pY2VWb2xEYikgeworICAgICAgICAgICAgQUxPR1YoIiVzIHZvbHVtZSBzb3VyY2UgJWQgYXQgdm9sPSVmIG92ZXJyaWRlbiBieSB2b2x1bWUgZ3JvdXAgJWQgYXQgdm9sPSVmIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICB2b2x1bWVTb3VyY2UsIHZvbHVtZURiLCBjYWxsVm9sdW1lU3JjLCBtYXhWb2ljZVZvbERiKTsKKyAgICAgICAgICAgIHZvbHVtZURiID0gbWF4Vm9pY2VWb2xEYjsKICAgICAgICAgfQogICAgIH0KLQogICAgIC8vIGlmIGEgaGVhZHNldCBpcyBjb25uZWN0ZWQsIGFwcGx5IHRoZSBmb2xsb3dpbmcgcnVsZXMgdG8gcmluZyB0b25lcyBhbmQgbm90aWZpY2F0aW9ucwogICAgIC8vIHRvIGF2b2lkIHNvdW5kIGxldmVsIGJ1cnN0cyBpbiB1c2VyJ3MgZWFyczoKICAgICAvLyAtIGFsd2F5cyBhdHRlbnVhdGUgbm90aWZpY2F0aW9ucyB2b2x1bWUgYnkgNmRCCkBAIC01NTk3LDExMCArNTY3OSwxMzcgQEAKICAgICAvLyBzcGVha2VyIGlzIHBhcnQgb2YgdGhlIHNlbGVjdCBkZXZpY2VzCiAgICAgLy8gLSBpZiBtdXNpYyBpcyBwbGF5aW5nLCBhbHdheXMgbGltaXQgdGhlIHZvbHVtZSB0byBjdXJyZW50IG11c2ljIHZvbHVtZSwKICAgICAvLyB3aXRoIGEgbWluaW11bSB0aHJlc2hvbGQgYXQgLTM2ZEIgc28gdGhhdCBub3RpZmljYXRpb24gaXMgYWx3YXlzIHBlcmNlaXZlZC4KLSAgICBjb25zdCByb3V0aW5nX3N0cmF0ZWd5IHN0cmVhbV9zdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7Ci0gICAgaWYgKChkZXZpY2UgJiAoQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCB8Ci0gICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgfAotICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUIHwKLSAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FIHwKLSAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQgfAotICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCkpICYmCi0gICAgICAgICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikKLSAgICAgICAgICAgICAgICB8fCAoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKQotICAgICAgICAgICAgICAgIHx8IChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1NZU1RFTSkKLSAgICAgICAgICAgICAgICB8fCAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSAmJgotICAgICAgICAgICAgICAgICAgICAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSkpICYmCi0gICAgICAgICAgICBtVm9sdW1lQ3VydmVzLT5jYW5CZU11dGVkKHN0cmVhbSkpIHsKKyAgICBpZiAoKGRldmljZSAmIChBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQIHwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTIHwKKyAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQgfCBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSB8CisgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVCB8IEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpKSAmJgorICAgICAgICAgICAgKCh2b2x1bWVTb3VyY2UgPT0gYWxhcm1Wb2x1bWVTcmMgfHwKKyAgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHJpbmdWb2x1bWVTcmMpIHx8CisgICAgICAgICAgICAgKHZvbHVtZVNvdXJjZSA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OKSkgfHwKKyAgICAgICAgICAgICAodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9TWVNURU0pKSB8fAorICAgICAgICAgICAgICgodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSkgJiYKKyAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkpKSAmJgorICAgICAgICAgICAgY3VydmVzLmNhbkJlTXV0ZWQoKSkgeworCiAgICAgICAgIC8vIHdoZW4gdGhlIHBob25lIGlzIHJpbmdpbmcgd2UgbXVzdCBjb25zaWRlciB0aGF0IG11c2ljIGNvdWxkIGhhdmUgYmVlbiBwYXVzZWQganVzdCBiZWZvcmUKICAgICAgICAgLy8gYnkgdGhlIG11c2ljIGFwcGxpY2F0aW9uIGFuZCBiZWhhdmUgYXMgaWYgbXVzaWMgd2FzIGFjdGl2ZSBpZiB0aGUgbGFzdCBtdXNpYyB0cmFjayB3YXMKICAgICAgICAgLy8ganVzdCBzdG9wcGVkCiAgICAgICAgIGlmIChpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZKSB8fAogICAgICAgICAgICAgICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lKSB7Ci0gICAgICAgICAgICB2b2x1bWVEQiArPSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfRkFDVE9SX0RCOwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG11c2ljRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICBmbG9hdCBtdXNpY1ZvbERCID0gY29tcHV0ZVZvbHVtZShBVURJT19TVFJFQU1fTVVTSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleChBVURJT19TVFJFQU1fTVVTSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXNpY0RldmljZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXNpY0RldmljZSk7Ci0gICAgICAgICAgICBmbG9hdCBtaW5Wb2xEQiA9IChtdXNpY1ZvbERCID4gU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX01JTl9EQikgPwotICAgICAgICAgICAgICAgICAgICBtdXNpY1ZvbERCIDogU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX01JTl9EQjsKLSAgICAgICAgICAgIGlmICh2b2x1bWVEQiA+IG1pblZvbERCKSB7Ci0gICAgICAgICAgICAgICAgdm9sdW1lREIgPSBtaW5Wb2xEQjsKLSAgICAgICAgICAgICAgICBBTE9HVigiY29tcHV0ZVZvbHVtZSBsaW1pdGluZyB2b2x1bWUgdG8gJWYgbXVzaWNWb2wgJWYiLCBtaW5Wb2xEQiwgbXVzaWNWb2xEQik7CisgICAgICAgICAgICB2b2x1bWVEYiArPSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfRkFDVE9SX0RCOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG11c2ljRGV2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9NRURJQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIHRydWUgLypmcm9tQ2FjaGUqLykudHlwZXMoKTsKKyAgICAgICAgICAgIGF1dG8gJm11c2ljQ3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzKEFVRElPX1NUUkVBTV9NVVNJQyk7CisgICAgICAgICAgICBmbG9hdCBtdXNpY1ZvbERiID0gY29tcHV0ZVZvbHVtZShtdXNpY0N1cnZlcywgbXVzaWNWb2x1bWVTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXNpY0N1cnZlcy5nZXRWb2x1bWVJbmRleChtdXNpY0RldmljZSksIG11c2ljRGV2aWNlKTsKKyAgICAgICAgICAgIGZsb2F0IG1pblZvbERiID0gKG11c2ljVm9sRGIgPiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOX0RCKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBtdXNpY1ZvbERiIDogU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX01JTl9EQjsKKyAgICAgICAgICAgIGlmICh2b2x1bWVEYiA+IG1pblZvbERiKSB7CisgICAgICAgICAgICAgICAgdm9sdW1lRGIgPSBtaW5Wb2xEYjsKKyAgICAgICAgICAgICAgICBBTE9HVigiY29tcHV0ZVZvbHVtZSBsaW1pdGluZyB2b2x1bWUgdG8gJWYgbXVzaWNWb2wgJWYiLCBtaW5Wb2xEYiwgbXVzaWNWb2xEYik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZGV2aWNlICYgKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAgfAotICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUykpIHsKICAgICAgICAgICAgICAgICAvLyBvbiBBMkRQLCBhbHNvIGVuc3VyZSBub3RpZmljYXRpb24gdm9sdW1lIGlzIG5vdCB0b28gbG93IGNvbXBhcmVkIHRvIG1lZGlhIHdoZW4KICAgICAgICAgICAgICAgICAvLyBpbnRlbmRlZCB0byBiZSBwbGF5ZWQKLSAgICAgICAgICAgICAgICBpZiAoKHZvbHVtZURCID4gLTk2LjBmKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKG11c2ljVm9sREIgLSBTT05JRklDQVRJT05fQTJEUF9NQVhfTUVESUFfRElGRl9EQiA+IHZvbHVtZURCKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiY29tcHV0ZVZvbHVtZSBpbmNyZWFzaW5nIHZvbHVtZSBmb3Igc3RyZWFtPSVkIGRldmljZT0weCVYIGZyb20gJWYgdG8gJWYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZURCLCBtdXNpY1ZvbERCIC0gU09OSUZJQ0FUSU9OX0EyRFBfTUFYX01FRElBX0RJRkZfREIpOwotICAgICAgICAgICAgICAgICAgICB2b2x1bWVEQiA9IG11c2ljVm9sREIgLSBTT05JRklDQVRJT05fQTJEUF9NQVhfTUVESUFfRElGRl9EQjsKKyAgICAgICAgICAgICAgICBpZiAoKHZvbHVtZURiID4gLTk2LjBmKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKG11c2ljVm9sRGIgLSBTT05JRklDQVRJT05fQTJEUF9NQVhfTUVESUFfRElGRl9EQiA+IHZvbHVtZURiKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXMgaW5jcmVhc2luZyB2b2x1bWUgZm9yIHZvbHVtZSBzb3VyY2U9JWQgZGV2aWNlPTB4JVggZnJvbSAlZiB0byAlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB2b2x1bWVTb3VyY2UsIGRldmljZSwgdm9sdW1lRGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljVm9sRGIgLSBTT05JRklDQVRJT05fQTJEUF9NQVhfTUVESUFfRElGRl9EQik7CisgICAgICAgICAgICAgICAgICAgIHZvbHVtZURiID0gbXVzaWNWb2xEYiAtIFNPTklGSUNBVElPTl9BMkRQX01BWF9NRURJQV9ESUZGX0RCOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmICgoVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKSAhPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpIHx8Ci0gICAgICAgICAgICAgICAgc3RyZWFtX3N0cmF0ZWd5ICE9IFNUUkFURUdZX1NPTklGSUNBVElPTikgewotICAgICAgICAgICAgdm9sdW1lREIgKz0gU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX0ZBQ1RPUl9EQjsKKyAgICAgICAgICAgICAgICAgICAoISh2b2x1bWVTb3VyY2UgPT0gYWxhcm1Wb2x1bWVTcmMgfHwgdm9sdW1lU291cmNlID09IHJpbmdWb2x1bWVTcmMpKSkgeworICAgICAgICAgICAgdm9sdW1lRGIgKz0gU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX0ZBQ1RPUl9EQjsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiB2b2x1bWVEQjsKKyAgICByZXR1cm4gdm9sdW1lRGI7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBbmRTZXRWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKK2ludCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlc2NhbGVWb2x1bWVJbmRleChpbnQgc3JjSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzcmNTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBkc3RTdHJlYW0pCiB7Ci0gICAgLy8gZG8gbm90IGNoYW5nZSBhY3R1YWwgc3RyZWFtIHZvbHVtZSBpZiB0aGUgc3RyZWFtIGlzIG11dGVkCi0gICAgaWYgKG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSAhPSAwKSB7Ci0gICAgICAgIEFMT0dWVigiY2hlY2tBbmRTZXRWb2x1bWUoKSBzdHJlYW0gJWQgbXV0ZWQgY291bnQgJWQiLAotICAgICAgICAgICAgICBzdHJlYW0sIG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSk7CisgICAgaWYgKHNyY1N0cmVhbSA9PSBkc3RTdHJlYW0pIHsKKyAgICAgICAgcmV0dXJuIHNyY0luZGV4OworICAgIH0KKyAgICBhdXRvICZzcmNDdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXMoc3JjU3RyZWFtKTsKKyAgICBhdXRvICZkc3RDdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXMoZHN0U3RyZWFtKTsKKyAgICBmbG9hdCBtaW5TcmMgPSAoZmxvYXQpc3JjQ3VydmVzLmdldFZvbHVtZUluZGV4TWluKCk7CisgICAgZmxvYXQgbWF4U3JjID0gKGZsb2F0KXNyY0N1cnZlcy5nZXRWb2x1bWVJbmRleE1heCgpOworICAgIGZsb2F0IG1pbkRzdCA9IChmbG9hdClkc3RDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXhNaW4oKTsKKyAgICBmbG9hdCBtYXhEc3QgPSAoZmxvYXQpZHN0Q3VydmVzLmdldFZvbHVtZUluZGV4TWF4KCk7CisKKyAgICAvLyBwcmVzZXJ2ZSBtdXRlIHJlcXVlc3Qgb3IgY29ycmVjdCByYW5nZQorICAgIGlmIChzcmNJbmRleCA8IG1pblNyYykgeworICAgICAgICBpZiAoc3JjSW5kZXggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgc3JjSW5kZXggPSBtaW5TcmM7CisgICAgfSBlbHNlIGlmIChzcmNJbmRleCA+IG1heFNyYykgeworICAgICAgICBzcmNJbmRleCA9IG1heFNyYzsKKyAgICB9CisgICAgcmV0dXJuIChpbnQpKG1pbkRzdCArICgoc3JjSW5kZXggLSBtaW5TcmMpICogKG1heERzdCAtIG1pbkRzdCkpIC8gKG1heFNyYyAtIG1pblNyYykpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrQW5kU2V0Vm9sdW1lKElWb2x1bWVDdXJ2ZXMgJmN1cnZlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKK3sKKyAgICAvLyBkbyBub3QgY2hhbmdlIGFjdHVhbCBhdHRyaWJ1dGVzIHZvbHVtZSBpZiB0aGUgYXR0cmlidXRlcyBpcyBtdXRlZAorICAgIGlmIChvdXRwdXREZXNjLT5pc011dGVkKHZvbHVtZVNvdXJjZSkpIHsKKyAgICAgICAgQUxPR1ZWKCIlczogdm9sdW1lIHNvdXJjZSAlZCBtdXRlZCBjb3VudCAlZCBhY3RpdmU9JWQiLCBfX2Z1bmNfXywgdm9sdW1lU291cmNlLAorICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+Z2V0TXV0ZUNvdW50KHZvbHVtZVNvdXJjZSksIG91dHB1dERlc2MtPmlzQWN0aXZlKHZvbHVtZVNvdXJjZSkpOwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQorICAgIFZvbHVtZVNvdXJjZSBjYWxsVm9sU3JjID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOworICAgIFZvbHVtZVNvdXJjZSBidFNjb1ZvbFNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPKTsKKyAgICBib29sIGlzVm9pY2VWb2xTcmMgPSBjYWxsVm9sU3JjID09IHZvbHVtZVNvdXJjZTsKKyAgICBib29sIGlzQnRTY29Wb2xTcmMgPSBidFNjb1ZvbFNyYyA9PSB2b2x1bWVTb3VyY2U7CisKICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlRm9yQ29tbSA9CiAgICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pOwogICAgIC8vIGRvIG5vdCBjaGFuZ2UgaW4gY2FsbCB2b2x1bWUgaWYgYmx1ZXRvb3RoIGlzIGNvbm5lY3RlZCBhbmQgdmljZSB2ZXJzYQotICAgIGlmICgoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMICYmIGZvcmNlVXNlRm9yQ29tbSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB8fAotICAgICAgICAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPICYmIGZvcmNlVXNlRm9yQ29tbSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSkgewotICAgICAgICBBTE9HVigiY2hlY2tBbmRTZXRWb2x1bWUoKSBjYW5ub3Qgc2V0IHN0cmVhbSAlZCB2b2x1bWUgd2l0aCBmb3JjZSB1c2UgPSAlZCBmb3IgY29tbSIsCi0gICAgICAgICAgICAgc3RyZWFtLCBmb3JjZVVzZUZvckNvbW0pOworICAgIC8vIGlmIHNjbyBhbmQgY2FsbCBmb2xsb3cgc2FtZSBjdXJ2ZXMsIGJ5cGFzcyBmb3JjZVVzZUZvckNvbW0KKyAgICBpZiAoKGNhbGxWb2xTcmMgIT0gYnRTY29Wb2xTcmMpICYmCisgICAgICAgICAgICAoKGlzVm9pY2VWb2xTcmMgJiYgZm9yY2VVc2VGb3JDb21tID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHx8CisgICAgICAgICAgICAgKGlzQnRTY29Wb2xTcmMgJiYgZm9yY2VVc2VGb3JDb21tICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pKSkgeworICAgICAgICBBTE9HVigiJXMgY2Fubm90IHNldCB2b2x1bWUgZ3JvdXAgJWQgdm9sdW1lIHdpdGggZm9yY2UgdXNlID0gJWQgZm9yIGNvbW0iLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICB2b2x1bWVTb3VyY2UsIGZvcmNlVXNlRm9yQ29tbSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0KICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgIGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgICAgICBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKTsKICAgICB9CiAKLSAgICBmbG9hdCB2b2x1bWVEYiA9IGNvbXB1dGVWb2x1bWUoc3RyZWFtLCBpbmRleCwgZGV2aWNlKTsKKyAgICBmbG9hdCB2b2x1bWVEYiA9IGNvbXB1dGVWb2x1bWUoY3VydmVzLCB2b2x1bWVTb3VyY2UsIGluZGV4LCBkZXZpY2UpOwogICAgIGlmIChvdXRwdXREZXNjLT5pc0ZpeGVkVm9sdW1lKGRldmljZSkgfHwKICAgICAgICAgICAgIC8vIEZvcmNlIFZvSVAgdm9sdW1lIHRvIG1heCBmb3IgYmx1ZXRvb3RoIFNDTwotICAgICAgICAgICAgKChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgfHwgc3RyZWFtID09IEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPKSAmJgotICAgICAgICAgICAgIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9TQ08pICE9IDApKSB7CisgICAgICAgICAgICAoKGlzVm9pY2VWb2xTcmMgfHwgaXNCdFNjb1ZvbFNyYykgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX1NDTykgIT0gMCkpIHsKICAgICAgICAgdm9sdW1lRGIgPSAwLjBmOwogICAgIH0KKyAgICBvdXRwdXREZXNjLT5zZXRWb2x1bWUodm9sdW1lRGIsIHZvbHVtZVNvdXJjZSwgY3VydmVzLmdldFN0cmVhbVR5cGVzKCksIGRldmljZSwgZGVsYXlNcywgZm9yY2UpOwogCi0gICAgb3V0cHV0RGVzYy0+c2V0Vm9sdW1lKHZvbHVtZURiLCBzdHJlYW0sIGRldmljZSwgZGVsYXlNcywgZm9yY2UpOwotCi0gICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCB8fAotICAgICAgICBzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08pIHsKKyAgICBpZiAoaXNWb2ljZVZvbFNyYyB8fCBpc0J0U2NvVm9sU3JjKSB7CiAgICAgICAgIGZsb2F0IHZvaWNlVm9sdW1lOwogICAgICAgICAvLyBGb3JjZSB2b2ljZSB2b2x1bWUgdG8gbWF4IGZvciBibHVldG9vdGggU0NPIGFzIHZvbHVtZSBpcyBtYW5hZ2VkIGJ5IHRoZSBoZWFkc2V0Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpIHsKLSAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gKGZsb2F0KWluZGV4LyhmbG9hdCltVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleE1heChzdHJlYW0pOworICAgICAgICBpZiAoaXNWb2ljZVZvbFNyYykgeworICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAoZmxvYXQpaW5kZXgvKGZsb2F0KWN1cnZlcy5nZXRWb2x1bWVJbmRleE1heCgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAxLjA7CiAgICAgICAgIH0KLQogICAgICAgICBpZiAodm9pY2VWb2x1bWUgIT0gbUxhc3RWb2ljZVZvbHVtZSkgewogICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFZvaWNlVm9sdW1lKHZvaWNlVm9sdW1lLCBkZWxheU1zKTsKICAgICAgICAgICAgIG1MYXN0Vm9pY2VWb2x1bWUgPSB2b2ljZVZvbHVtZTsKICAgICAgICAgfQogICAgIH0KLQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtNTcxMCw2MyArNTgxOSw2OCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKIHsKICAgICBBTE9HVlYoImFwcGx5U3RyZWFtVm9sdW1lcygpIGZvciBkZXZpY2UgJTA4eCIsIGRldmljZSk7Ci0KLSAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXgoKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBkZXZpY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnZvbHVtZUdyb3VwIDogbUVuZ2luZS0+Z2V0Vm9sdW1lR3JvdXBzKCkpIHsKKyAgICAgICAgYXV0byAmY3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzKHRvVm9sdW1lU291cmNlKHZvbHVtZUdyb3VwKSk7CisgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKGN1cnZlcywgdG9Wb2x1bWVTb3VyY2Uodm9sdW1lR3JvdXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKSwgb3V0cHV0RGVzYywgZGV2aWNlLCBkZWxheU1zLCBmb3JjZSk7CiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3RyYXRlZ3lNdXRlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3RyYXRlZ3lNdXRlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgc3RkOjp2ZWN0b3I8Vm9sdW1lU291cmNlPiBzb3VyY2VzVG9NdXRlOworICAgIGZvciAoYXV0byBhdHRyaWJ1dGVzOiBtRW5naW5lLT5nZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5KSkgeworICAgICAgICBBTE9HVlYoIiVzKCkgYXR0cmlidXRlcyAlcywgbXV0ZSAlZCwgb3V0cHV0IElEICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICB0b1N0cmluZyhhdHRyaWJ1dGVzKS5jX3N0cigpLCBvbiwgb3V0cHV0RGVzYy0+Z2V0SWQoKSk7CisgICAgICAgIFZvbHVtZVNvdXJjZSBzb3VyY2UgPSB0b1ZvbHVtZVNvdXJjZShhdHRyaWJ1dGVzKTsKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChiZWdpbihzb3VyY2VzVG9NdXRlKSwgZW5kKHNvdXJjZXNUb011dGUpLCBzb3VyY2UpID09IGVuZChzb3VyY2VzVG9NdXRlKSkgeworICAgICAgICAgICAgc291cmNlc1RvTXV0ZS5wdXNoX2JhY2soc291cmNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGF1dG8gc291cmNlIDogc291cmNlc1RvTXV0ZSkgeworICAgICAgICBzZXRWb2x1bWVTb3VyY2VNdXRlKHNvdXJjZSwgb24sIG91dHB1dERlc2MsIGRlbGF5TXMsIGRldmljZSk7CisgICAgfQorCit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRWb2x1bWVTb3VyY2VNdXRlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFjdGl2ZU9ubHkpCiB7Ci0gICAgQUxPR1ZWKCJzZXRTdHJhdGVneU11dGUoKSBzdHJhdGVneSAlZCwgbXV0ZSAlZCwgb3V0cHV0IElEICVkIiwKLSAgICAgICAgICAgc3RyYXRlZ3ksIG9uLCBvdXRwdXREZXNjLT5nZXRJZCgpKTsKLSAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pID09IHN0cmF0ZWd5KSB7Ci0gICAgICAgICAgICBzZXRTdHJlYW1NdXRlKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgb24sIG91dHB1dERlc2MsIGRlbGF5TXMsIGRldmljZSk7Ci0gICAgICAgIH0KKyAgICBpZiAoYWN0aXZlT25seSAmJiAhb3V0cHV0RGVzYy0+aXNBY3RpdmUodm9sdW1lU291cmNlKSkgeworICAgICAgICByZXR1cm47CiAgICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgIGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgICAgICBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKTsKICAgICB9Ci0KLSAgICBBTE9HVlYoInNldFN0cmVhbU11dGUoKSBzdHJlYW0gJWQsIG11dGUgJWQsIG1NdXRlQ291bnQgJWQgZGV2aWNlICUwNHgiLAotICAgICAgICAgIHN0cmVhbSwgb24sIG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSwgZGV2aWNlKTsKLQorICAgIGF1dG8gJmN1cnZlcyA9IGdldFZvbHVtZUN1cnZlcyh2b2x1bWVTb3VyY2UpOwogICAgIGlmIChvbikgewotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKLSAgICAgICAgICAgIGlmIChtVm9sdW1lQ3VydmVzLT5jYW5CZU11dGVkKHN0cmVhbSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSkpIHsKLSAgICAgICAgICAgICAgICBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sIDAsIG91dHB1dERlc2MsIGRldmljZSwgZGVsYXlNcyk7CisgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNNdXRlZCh2b2x1bWVTb3VyY2UpKSB7CisgICAgICAgICAgICBpZiAoY3VydmVzLmNhbkJlTXV0ZWQoKSAmJgorICAgICAgICAgICAgICAgICAgICAodm9sdW1lU291cmNlICE9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSB8fAorICAgICAgICAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PQorICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSkpIHsKKyAgICAgICAgICAgICAgICBjaGVja0FuZFNldFZvbHVtZShjdXJ2ZXMsIHZvbHVtZVNvdXJjZSwgMCwgb3V0cHV0RGVzYywgZGV2aWNlLCBkZWxheU1zKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAvLyBpbmNyZW1lbnQgbU11dGVDb3VudCBhZnRlciBjYWxsaW5nIGNoZWNrQW5kU2V0Vm9sdW1lKCkgc28gdGhhdCB2b2x1bWUgY2hhbmdlIGlzIG5vdCBpZ25vcmVkCi0gICAgICAgIG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSsrOworICAgICAgICAvLyBpbmNyZW1lbnQgbU11dGVDb3VudCBhZnRlciBjYWxsaW5nIGNoZWNrQW5kU2V0Vm9sdW1lKCkgc28gdGhhdCB2b2x1bWUgY2hhbmdlIGlzIG5vdAorICAgICAgICAvLyBpZ25vcmVkCisgICAgICAgIG91dHB1dERlc2MtPmluY011dGVDb3VudCh2b2x1bWVTb3VyY2UpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0gPT0gMCkgewotICAgICAgICAgICAgQUxPR1YoInNldFN0cmVhbU11dGUoKSB1bm11dGluZyBub24gbXV0ZWQgc3RyZWFtISIpOworICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzTXV0ZWQodm9sdW1lU291cmNlKSkgeworICAgICAgICAgICAgQUxPR1YoIiVzIHVubXV0aW5nIG5vbiBtdXRlZCBhdHRyaWJ1dGVzISIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBpZiAoLS1vdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0gPT0gMCkgewotICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXgoc3RyZWFtLCBkZXZpY2UpLAorICAgICAgICBpZiAob3V0cHV0RGVzYy0+ZGVjTXV0ZUNvdW50KHZvbHVtZVNvdXJjZSkgPT0gMCkgeworICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoY3VydmVzLCB2b2x1bWVTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKQEAgLTU3NzQsMTA2ICs1ODg4LDkgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0YXJ0aW5nLCBib29sIHN0YXRlQ2hhbmdlKQotewotICAgIGlmKCFoYXNQcmltYXJ5T3V0cHV0KCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIGlmIHRoZSBzdHJlYW0gcGVydGFpbnMgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGFuZCB3ZSBhcmUgaW4gY2FsbCB3ZSBtdXN0Ci0gICAgLy8gbXV0ZSB0aGUgc3RyZWFtIGlmIGl0IGlzIGxvdyB2aXNpYmlsaXR5LiBJZiBpdCBpcyBoaWdoIHZpc2liaWxpdHksIHdlIG11c3QgcGxheSBhIHRvbmUKLSAgICAvLyBpbiB0aGUgZGV2aWNlIHVzZWQgZm9yIHBob25lIHN0cmF0ZWd5IGFuZCBwbGF5IHRoZSB0b25lIGlmIHRoZSBzZWxlY3RlZCBkZXZpY2UgZG9lcyBub3QKLSAgICAvLyBpbnRlcmZlcmUgd2l0aCB0aGUgZGV2aWNlIHVzZWQgZm9yIHBob25lIHN0cmF0ZWd5Ci0gICAgLy8gaWYgc3RhdGVDaGFuZ2UgaXMgdHJ1ZSwgd2UgYXJlIGNhbGxlZCBmcm9tIHNldFBob25lU3RhdGUoKSBhbmQgd2UgbXVzdCBtdXRlIG9yIHVubXV0ZSBhcwotICAgIC8vIG1hbnkgdGltZXMgYXMgdGhlcmUgYXJlIGFjdGl2ZSB0cmFja3Mgb24gdGhlIG91dHB1dAotICAgIGNvbnN0IHJvdXRpbmdfc3RyYXRlZ3kgc3RyZWFtX3N0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKLSAgICBpZiAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHx8Ci0gICAgICAgICAgICAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkpKSB7Ci0gICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbVByaW1hcnlPdXRwdXQ7Ci0gICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBzdHJlYW0gJWQgc3RhcnRpbmcgJWQgZGV2aWNlICV4IHN0YXRlQ2hhbmdlICVkIiwKLSAgICAgICAgICAgICAgICBzdHJlYW0sIHN0YXJ0aW5nLCBvdXRwdXREZXNjLT5tRGV2aWNlLCBzdGF0ZUNoYW5nZSk7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSkgewotICAgICAgICAgICAgaW50IG11dGVDb3VudCA9IDE7Ci0gICAgICAgICAgICBpZiAoc3RhdGVDaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICBtdXRlQ291bnQgPSBvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdWRpb19pc19sb3dfdmlzaWJpbGl0eShzdHJlYW0pKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGxvdyB2aXNpYmlsaXR5LCBtdXRlQ291bnQgJWQiLCBtdXRlQ291bnQpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXV0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHN0YXJ0aW5nLCBtUHJpbWFyeU91dHB1dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgaGlnaCB2aXNpYmlsaXR5Iik7Ci0gICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmRldmljZSgpICYKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FLCB0cnVlIC8qZnJvbUNhY2hlKi8pKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBoaWdoIHZpc2liaWxpdHkgbXV0ZWQsIG11dGVDb3VudCAlZCIsIG11dGVDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXV0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0cmVhbU11dGUoc3RyZWFtLCBzdGFydGluZywgbVByaW1hcnlPdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzdGFydGluZykgewotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3RhcnRUb25lKEFVRElPX1BPTElDWV9UT05FX0lOX0NBTExfTk9USUZJQ0FUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3RvcFRvbmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWF1ZGlvX3N0cmVhbV90eXBlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKQotewotICAgIC8vIGZsYWdzIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKLSAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSA9PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOwotICAgIH0KLSAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19TQ08pID09IEFVRElPX0ZMQUdfU0NPKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzsKLSAgICB9Ci0gICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQkVBQ09OKSA9PSBBVURJT19GTEFHX0JFQUNPTikgewotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1RUUzsKLSAgICB9Ci0KLSAgICAvLyB1c2FnZSB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCi0gICAgc3dpdGNoIChhdHRyLT51c2FnZSkgewotICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5UOgotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9TWVNURU07Ci0gICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9EVE1GOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BTEFSTTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fUklORzsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIH0KLX0KLQogYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzVmFsaWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcGFhKQogewotICAgIC8vIGhhcyBmbGFncyB0aGF0IG1hcCB0byBhIHN0cmF0ZWd5PworICAgIC8vIGhhcyBmbGFncyB0aGF0IG1hcCB0byBhIHN0cmVhbSB0eXBlPwogICAgIGlmICgocGFhLT5mbGFncyAmIChBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQgfCBBVURJT19GTEFHX1NDTyB8IEFVRElPX0ZMQUdfQkVBQ09OKSkgIT0gMCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC01OTA0LDM3ICs1OTIxLDYgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RyYXRlZ3lBY3RpdmUoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksIHVpbnQzMl90IGluUGFzdE1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAotewotICAgIGlmICgoc3lzVGltZSA9PSAwKSAmJiAoaW5QYXN0TXMgIT0gMCkpIHsKLSAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgaSsrKSB7Ci0gICAgICAgIGlmICgoKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KWkpID09IHN0cmF0ZWd5KSB8fAotICAgICAgICAgICAgICAgIChOVU1fU1RSQVRFR0lFUyA9PSBzdHJhdGVneSkpICYmCi0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LCB1aW50MzJfdCBpblBhc3RNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSkgY29uc3QKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPnNoYXJlc0h3TW9kdWxlV2l0aChkZXNjKQotICAgICAgICAgICAgJiYgaXNTdHJhdGVneUFjdGl2ZShkZXNjLCBzdHJhdGVneSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpCiB7CiAgICAgcmV0dXJuIG1FbmdpbmUtPmdldEZvcmNlVXNlKHVzYWdlKTsKQEAgLTU5NTMsMTAgKzU5MzksMTAgQEAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbGVhblVwRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2VEZXNjKQogewogICAgIGZvciAoc3NpemVfdCBpID0gKHNzaXplX3QpbUF1ZGlvU291cmNlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgIHsKLSAgICAgICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoc291cmNlRGVzYy0+bURldmljZS0+ZXF1YWxzKGRldmljZURlc2MpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgcmVsZWFzaW5nIGF1ZGlvIHNvdXJjZSAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlRGVzYy0+Z2V0SGFuZGxlKCkpOwotICAgICAgICAgICAgc3RvcEF1ZGlvU291cmNlKHNvdXJjZURlc2MtPmdldEhhbmRsZSgpKTsKKyAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKHNvdXJjZURlc2MtPnNyY0RldmljZSgpLT5lcXVhbHMoZGV2aWNlRGVzYykpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyByZWxlYXNpbmcgYXVkaW8gc291cmNlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CisgICAgICAgICAgICBzdG9wQXVkaW9Tb3VyY2Uoc291cmNlRGVzYy0+cG9ydElkKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC01OTgyLDEyOSArNTk2OCw2NyBAQAogICAgICAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MtPm1VaWQpOwogICAgICAgICB9CiAgICAgfQorCisgICAgbUlucHV0cy5jbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2UoZGV2aWNlRGVzYyk7CisKKyAgICBtSHdNb2R1bGVzLmNsZWFuVXBGb3JEZXZpY2UoZGV2aWNlRGVzYyk7CiB9CiAKLS8vIE1vZGlmeSB0aGUgbGlzdCBvZiBzdXJyb3VuZCBzb3VuZCBmb3JtYXRzIHN1cHBvcnRlZC4KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmaWx0ZXJTdXJyb3VuZEZvcm1hdHMoRm9ybWF0VmVjdG9yICpmb3JtYXRzUHRyKSB7Ci0gICAgRm9ybWF0VmVjdG9yICZmb3JtYXRzID0gKmZvcm1hdHNQdHI7Ci0gICAgLy8gVE9ETyBTZXQgdGhpcyBiYXNlZCBvbiBDb25maWcgcHJvcGVydGllcy4KLSAgICBjb25zdCBib29sIGFsd2F5c0ZvcmNlQUMzID0gdHJ1ZTsKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjptb2RpZnlTdXJyb3VuZEZvcm1hdHMoCisgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBGb3JtYXRWZWN0b3IgKmZvcm1hdHNQdHIpIHsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IGVuZm9yY2VkU3Vycm91bmQoCisgICAgICAgICAgICBkZXZEZXNjLT5lbmNvZGVkRm9ybWF0cygpLmJlZ2luKCksIGRldkRlc2MtPmVuY29kZWRGb3JtYXRzKCkuZW5kKCkpOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gYWxsU3Vycm91bmQ7ICAvLyBBIGZsYXQgc2V0IG9mIGFsbCBrbm93biBzdXJyb3VuZCBmb3JtYXRzCisgICAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKSkgeworICAgICAgICBhbGxTdXJyb3VuZC5pbnNlcnQocGFpci5maXJzdCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgc3ViZm9ybWF0IDogcGFpci5zZWNvbmQpIGFsbFN1cnJvdW5kLmluc2VydChzdWJmb3JtYXQpOworICAgIH0KIAogICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZm9yY2VVc2UgPSBtRW5naW5lLT5nZXRGb3JjZVVzZSgKICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCk7CiAgICAgQUxPR0QoIiVzOiBmb3JjZWQgdXNlID0gJWQiLCBfX0ZVTkNUSU9OX18sIGZvcmNlVXNlKTsKKyAgICAvLyBUaGlzIGlzIHRoZSByZXN1bHRpbmcgc2V0IG9mIGZvcm1hdHMgZGVwZW5kaW5nIG9uIHRoZSBzdXJyb3VuZCBtb2RlOgorICAgIC8vICAgJ2FsbCBzdXJyb3VuZCcgPSBhbGxTdXJyb3VuZAorICAgIC8vICAgJ2VuZm9yY2VkIHN1cnJvdW5kJyA9IGVuZm9yY2VkU3Vycm91bmQgW21heSBpbmNsdWRlIElFQzY5MTM3IHdoaWNoIGlzbid0IHJhdyBzdXJyb3VuZCBmbXRdCisgICAgLy8gICAnbm9uLXN1cnJvdW5kJyA9IG5vdCBpbiAnYWxsIHN1cnJvdW5kJyBhbmQgbm90IGluICdlbmZvcmNlZCBzdXJyb3VuZCcKKyAgICAvLyAgICdtYW51YWwgc3Vycm91bmQnID0gbU1hbnVhbFN1cnJvdW5kRm9ybWF0cworICAgIC8vIEFVVE86ICAgZm9ybWF0cyB2ICdlbmZvcmNlZCBzdXJyb3VuZCcKKyAgICAvLyBBTFdBWVM6IGZvcm1hdHMgdiAnYWxsIHN1cnJvdW5kJyB2ICdlbmZvcmNlZCBzdXJyb3VuZCcKKyAgICAvLyBORVZFUjogIGZvcm1hdHMgXiAnbm9uLXN1cnJvdW5kJworICAgIC8vIE1BTlVBTDogZm9ybWF0cyBeICgnbm9uLXN1cnJvdW5kJyB2ICdtYW51YWwgc3Vycm91bmQnIHYgKElFQzY5MTM3IF4gJ2VuZm9yY2VkIHN1cnJvdW5kJykpCiAKLSAgICAvLyBJZiBNQU5VQUwsIGtlZXAgdGhlIHN1cHBvcnRlZCBzdXJyb3VuZCBzb3VuZCBmb3JtYXRzIGFzIGN1cnJlbnQgZW5hYmxlZCBvbmVzLgorICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gZm9ybWF0U2V0OworICAgIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwKKyAgICAgICAgICAgIHx8IGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX05FVkVSKSB7CisgICAgICAgIC8vIGZvcm1hdFNldCBpcyAoZm9ybWF0cyBeICdub24tc3Vycm91bmQnKQorICAgICAgICBmb3IgKGF1dG8gZm9ybWF0SXRlciA9IGZvcm1hdHNQdHItPmJlZ2luKCk7IGZvcm1hdEl0ZXIgIT0gZm9ybWF0c1B0ci0+ZW5kKCk7ICsrZm9ybWF0SXRlcikgeworICAgICAgICAgICAgaWYgKGFsbFN1cnJvdW5kLmNvdW50KCpmb3JtYXRJdGVyKSA9PSAwICYmIGVuZm9yY2VkU3Vycm91bmQuY291bnQoKmZvcm1hdEl0ZXIpID09IDApIHsKKyAgICAgICAgICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KCpmb3JtYXRJdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvcm1hdFNldC5pbnNlcnQoZm9ybWF0c1B0ci0+YmVnaW4oKSwgZm9ybWF0c1B0ci0+ZW5kKCkpOworICAgIH0KKyAgICBmb3JtYXRzUHRyLT5jbGVhcigpOyAgLy8gUmUtZmlsbGVkIGZyb20gdGhlIGZvcm1hdFNldCBhdCB0aGUgZW5kLgorCiAgICAgaWYgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCkgewotICAgICAgICBmb3JtYXRzLmNsZWFyKCk7Ci0gICAgICAgIGZvciAoYXV0byBpdCA9IG1TdXJyb3VuZEZvcm1hdHMuYmVnaW4oKTsgaXQgIT0gbVN1cnJvdW5kRm9ybWF0cy5lbmQoKTsgaXQrKykgewotICAgICAgICAgICAgZm9ybWF0cy5hZGQoKml0KTsKKyAgICAgICAgZm9ybWF0U2V0Lmluc2VydChtTWFudWFsU3Vycm91bmRGb3JtYXRzLmJlZ2luKCksIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuZW5kKCkpOworICAgICAgICAvLyBFbmFibGUgSUVDNjE5Mzcgd2hlbiBpbiBNQU5VQUwgbW9kZSBpZiBpdCdzIGVuZm9yY2VkIGZvciB0aGlzIGRldmljZS4KKyAgICAgICAgaWYgKGVuZm9yY2VkU3Vycm91bmQuY291bnQoQVVESU9fRk9STUFUX0lFQzYxOTM3KSAhPSAwKSB7CisgICAgICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KEFVRElPX0ZPUk1BVF9JRUM2MTkzNyk7CiAgICAgICAgIH0KLSAgICAgICAgLy8gQWx3YXlzIGVuYWJsZSBJRUM2MTkzNyB3aGVuIGluIE1BTlVBTCBtb2RlLgotICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfSUVDNjE5MzcpOwotICAgIH0gZWxzZSB7IC8vIE5FVkVSLCBBVVRPIG9yIEFMV0FZUwotICAgICAgICAvLyBBbmFseXplIG9yaWdpbmFsIHN1cHBvcnQgZm9yIHZhcmlvdXMgZm9ybWF0cy4KLSAgICAgICAgYm9vbCBzdXBwb3J0c0FDMyA9IGZhbHNlOwotICAgICAgICBib29sIHN1cHBvcnRzT3RoZXJTdXJyb3VuZCA9IGZhbHNlOwotICAgICAgICBib29sIHN1cHBvcnRzSUVDNjE5MzcgPSBmYWxzZTsKLSAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5jbGVhcigpOwotICAgICAgICBmb3IgKHNzaXplX3QgZm9ybWF0SW5kZXggPSAwOyBmb3JtYXRJbmRleCA8IChzc2l6ZV90KWZvcm1hdHMuc2l6ZSgpOyBmb3JtYXRJbmRleCsrKSB7Ci0gICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBmb3JtYXRzW2Zvcm1hdEluZGV4XTsKLSAgICAgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfQUMzOgotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0c0FDMyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0VfQUMzOgotICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUUzoKLSAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFNfSEQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIEFMV0FZUywgcmVtb3ZlIGFsbCBvdGhlciBzdXJyb3VuZCBmb3JtYXRzIGhlcmUKLSAgICAgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2Ugd2lsbCBhZGQgdGhlbSBsYXRlci4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUykgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy5yZW1vdmVBdChmb3JtYXRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRJbmRleC0tOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzT3RoZXJTdXJyb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0lFQzYxOTM3OgotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0c0lFQzYxOTM3ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9CisgICAgfSBlbHNlIGlmIChmb3JjZVVzZSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9ORVZFUikgeyAvLyBBVVRPIG9yIEFMV0FZUworICAgICAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTKSB7CisgICAgICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KGFsbFN1cnJvdW5kLmJlZ2luKCksIGFsbFN1cnJvdW5kLmVuZCgpKTsKICAgICAgICAgfQotCi0gICAgICAgIC8vIE1vZGlmeSBmb3JtYXRzIGJhc2VkIG9uIHN1cnJvdW5kIHByZWZlcmVuY2VzLgotICAgICAgICAvLyBJZiBORVZFUiwgcmVtb3ZlIHN1cHBvcnQgZm9yIHN1cnJvdW5kIGZvcm1hdHMuCi0gICAgICAgIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9ORVZFUikgewotICAgICAgICAgICAgaWYgKHN1cHBvcnRzQUMzIHx8IHN1cHBvcnRzT3RoZXJTdXJyb3VuZCB8fCBzdXBwb3J0c0lFQzYxOTM3KSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHN1cnJvdW5kIHNvdW5kIHJlbGF0ZWQgZm9ybWF0cy4KLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBmb3JtYXRJbmRleCA9IDA7IGZvcm1hdEluZGV4IDwgZm9ybWF0cy5zaXplKCk7ICkgewotICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBmb3JtYXRzW2Zvcm1hdEluZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGZvcm1hdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfQUMzOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRV9BQzM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFNfSEQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9JRUM2MTkzNzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLnJlbW92ZUF0KGZvcm1hdEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0SW5kZXgrKzsgLy8ga2VlcCBpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN1cHBvcnRzQUMzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydHNPdGhlclN1cnJvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydHNJRUM2MTkzNyA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeyAvLyBBVVRPIG9yIEFMV0FZUwotICAgICAgICAgICAgLy8gTW9zdCBUVnMgc3VwcG9ydCBBQzMgZXZlbiBpZiB0aGV5IGRvIG5vdCByZXBvcnQgaXQgaW4gdGhlIEVESUQuCi0gICAgICAgICAgICBpZiAoKGFsd2F5c0ZvcmNlQUMzIHx8IChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpKQotICAgICAgICAgICAgICAgICAgICAmJiAhc3VwcG9ydHNBQzMpIHsKLSAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfQUMzKTsKLSAgICAgICAgICAgICAgICBzdXBwb3J0c0FDMyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIEFMV0FZUywgYWRkIHN1cHBvcnQgZm9yIHJhdyBzdXJyb3VuZCBmb3JtYXRzIGlmIGFsbCBhcmUgbWlzc2luZy4KLSAgICAgICAgICAgIC8vIFRoaXMgYXNzdW1lcyB0aGF0IGlmIGFueSBvZiB0aGVzZSBmb3JtYXRzIGFyZSByZXBvcnRlZCBieSB0aGUgSEFMCi0gICAgICAgICAgICAvLyB0aGVuIHRoZSByZXBvcnQgaXMgdmFsaWQgYW5kIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuCi0gICAgICAgICAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTKSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0VfQUMzKTsKLSAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfRFRTKTsKLSAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfRFRTX0hEKTsKLSAgICAgICAgICAgICAgICBzdXBwb3J0c090aGVyU3Vycm91bmQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBZGQgc3VwcG9ydCBmb3IgSUVDNjE5MzcgaWYgYW55IHJhdyBzdXJyb3VuZCBzdXBwb3J0ZWQuCi0gICAgICAgICAgICAvLyBUaGUgSEFMIGNvdWxkIGRvIHRoaXMgYnV0IGFkZCBpdCBoZXJlLCBqdXN0IGluIGNhc2UuCi0gICAgICAgICAgICBpZiAoKHN1cHBvcnRzQUMzIHx8IHN1cHBvcnRzT3RoZXJTdXJyb3VuZCkgJiYgIXN1cHBvcnRzSUVDNjE5MzcpIHsKLSAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfSUVDNjE5MzcpOwotICAgICAgICAgICAgICAgIHN1cHBvcnRzSUVDNjE5MzcgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBZGQgcmVwb3J0ZWQgc3Vycm91bmQgc291bmQgZm9ybWF0cyB0byBlbmFibGVkIHN1cnJvdW5kIGZvcm1hdHMuCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBmb3JtYXRJbmRleCA9IDA7IGZvcm1hdEluZGV4IDwgZm9ybWF0cy5zaXplKCk7IGZvcm1hdEluZGV4KyspIHsKLSAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBmb3JtYXRzW2Zvcm1hdEluZGV4XTsKLSAgICAgICAgICAgICAgICBzd2l0Y2goZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0FDMzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRV9BQzM6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUUzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRFRTX0hEOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9BQUNfTEM6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RPTEJZX1RSVUVIRDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRV9BQzNfSk9DOgotICAgICAgICAgICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGZvcm1hdFNldC5pbnNlcnQoZW5mb3JjZWRTdXJyb3VuZC5iZWdpbigpLCBlbmZvcmNlZFN1cnJvdW5kLmVuZCgpKTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBmb3JtYXQgOiBmb3JtYXRTZXQpIHsKKyAgICAgICAgZm9ybWF0c1B0ci0+cHVzaChmb3JtYXQpOwogICAgIH0KIH0KIAotLy8gTW9kaWZ5IHRoZSBsaXN0IG9mIGNoYW5uZWwgbWFza3Mgc3VwcG9ydGVkLgotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmZpbHRlclN1cnJvdW5kQ2hhbm5lbE1hc2tzKENoYW5uZWxzVmVjdG9yICpjaGFubmVsTWFza3NQdHIpIHsKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjptb2RpZnlTdXJyb3VuZENoYW5uZWxNYXNrcyhDaGFubmVsc1ZlY3RvciAqY2hhbm5lbE1hc2tzUHRyKSB7CiAgICAgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcyA9ICpjaGFubmVsTWFza3NQdHI7CiAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBmb3JjZVVzZSA9IG1FbmdpbmUtPmdldEZvcmNlVXNlKAogICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EKTsKQEAgLTYxMzQsMTYgKzYwNTgsMTcgQEAKICAgICAgICAgLy8gSWYgbm90IHRoZW4gYWRkIDUuMSBzdXBwb3J0LgogICAgICAgICBpZiAoIXN1cHBvcnRzNWRvdDEpIHsKICAgICAgICAgICAgIGNoYW5uZWxNYXNrcy5hZGQoQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSk7Ci0gICAgICAgICAgICBBTE9HSSgiJXM6IGZvcmNlIEFMV0FZUywgc28gYWRkaW5nIGNoYW5uZWxNYXNrIGZvciA1LjEgc3Vycm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgQUxPR0koIiVzOiBmb3JjZSBNQU5VQUwgb3IgQUxXQVlTLCBzbyBhZGRpbmcgY2hhbm5lbE1hc2sgZm9yIDUuMSBzdXJyb3VuZCIsIF9fZnVuY19fKTsKICAgICAgICAgfQogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUF1ZGlvUHJvZmlsZXMoYXVkaW9fZGV2aWNlc190IGRldmljZSwKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVBdWRpb1Byb2ZpbGVzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgJnByb2ZpbGVzKQogewogICAgIFN0cmluZzggcmVwbHk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGRldkRlc2MtPnR5cGUoKTsKIAogICAgIC8vIEZvcm1hdCBNVVNUIGJlIGNoZWNrZWQgZmlyc3QgdG8gdXBkYXRlIHRoZSBsaXN0IG9mIEF1ZGlvUHJvZmlsZQogICAgIGlmIChwcm9maWxlcy5oYXNEeW5hbWljRm9ybWF0KCkpIHsKQEAgLTYxNTcsOCArNjA4Miw5IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgRm9ybWF0VmVjdG9yIGZvcm1hdHMgPSBmb3JtYXRzRnJvbVN0cmluZyhyZXBseS5zdHJpbmcoKSk7Ci0gICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JKSB7Ci0gICAgICAgICAgICBmaWx0ZXJTdXJyb3VuZEZvcm1hdHMoJmZvcm1hdHMpOworICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfSERNSQorICAgICAgICAgICAgICAgIHx8IGlzRGV2aWNlT2ZNb2R1bGUoZGV2RGVzYywgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkpIHsKKyAgICAgICAgICAgIG1vZGlmeVN1cnJvdW5kRm9ybWF0cyhkZXZEZXNjLCAmZm9ybWF0cyk7CiAgICAgICAgIH0KICAgICAgICAgcHJvZmlsZXMuc2V0Rm9ybWF0cyhmb3JtYXRzKTsKICAgICB9CkBAIC02MTkwLDggKzYxMTYsOSBAQAogICAgICAgICAgICAgaWYgKHJlcGxpZWRQYXJhbWV0ZXJzLmdldCgKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMpLCByZXBseSkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3MgPSBjaGFubmVsTWFza3NGcm9tU3RyaW5nKHJlcGx5LnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfSERNSSkgewotICAgICAgICAgICAgICAgICAgICBmaWx0ZXJTdXJyb3VuZENoYW5uZWxNYXNrcygmY2hhbm5lbE1hc2tzKTsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfSERNSQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNEZXZpY2VPZk1vZHVsZShkZXZEZXNjLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSkgeworICAgICAgICAgICAgICAgICAgICBtb2RpZnlTdXJyb3VuZENoYW5uZWxNYXNrcygmY2hhbm5lbE1hc2tzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTYxOTksNCArNjEyNiw1OCBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbnN0YWxsUGF0Y2goY29uc3QgY2hhciAqY2FsbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UgKmlvRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KAorICAgICAgICAgICAgcGF0Y2hIYW5kbGUgJiYgKnBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FID8KKyAgICAgICAgICAgICpwYXRjaEhhbmRsZSA6IGlvRGVzY3JpcHRvci0+Z2V0UGF0Y2hIYW5kbGUoKSk7CisgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjOworICAgIHN0YXR1c190IHN0YXR1cyA9IGluc3RhbGxQYXRjaCgKKyAgICAgICAgICAgIGNhbGxlciwgaW5kZXgsIHBhdGNoSGFuZGxlLCBwYXRjaCwgZGVsYXlNcywgbVVpZENhY2hlZCwgJnBhdGNoRGVzYyk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBpb0Rlc2NyaXB0b3ItPnNldFBhdGNoSGFuZGxlKHBhdGNoRGVzYy0+bUhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5zdGFsbFBhdGNoKGNvbnN0IGNoYXIgKmNhbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BhdGNoPiAqcGF0Y2hEZXNjUHRyKQoreworICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gsICZhZlBhdGNoSGFuZGxlLCBkZWxheU1zKTsKKyAgICBBTE9HVigiJXMoKSBBRjo6Y3JlYXRlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCBudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQiLAorICAgICAgICAgICAgY2FsbGVyLCBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUsIHBhdGNoLT5udW1fc291cmNlcywgcGF0Y2gtPm51bV9zaW5rcyk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaChwYXRjaCwgdWlkKTsKKyAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSAqcGF0Y2g7CisgICAgICAgIH0KKyAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgICAgIGlmIChwYXRjaEhhbmRsZSkgeworICAgICAgICAgICAgKnBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOworICAgICAgICB9CisgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgfQorICAgIGlmIChwYXRjaERlc2NQdHIpICpwYXRjaERlc2NQdHIgPSBwYXRjaERlc2M7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaAppbmRleCA0OGUwNDcyLi4xZmM2MWU1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaApAQCAtMTcsNiArMTcsNyBAQAogI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KIApAQCAtMzAsNiArMzEsNyBAQAogI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9QYXRjaEJ1aWxkZXIuaD4KICNpbmNsdWRlICJBdWRpb1BvbGljeUludGVyZmFjZS5oIgogCiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CkBAIC0zOCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lDb25maWcuaD4KICNpbmNsdWRlIDxBdWRpb1BvcnQuaD4KICNpbmNsdWRlIDxBdWRpb1BhdGNoLmg+CisjaW5jbHVkZSA8QXVkaW9Qcm9maWxlLmg+CiAjaW5jbHVkZSA8RGV2aWNlRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPElPUHJvZmlsZS5oPgogI2luY2x1ZGUgPEh3TW9kdWxlLmg+CkBAIC00Niw4ICs0OSw3IEBACiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNaXguaD4KICNpbmNsdWRlIDxFZmZlY3REZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8U291bmRUcmlnZ2VyU2Vzc2lvbi5oPgotI2luY2x1ZGUgPFNlc3Npb25Sb3V0ZS5oPgotI2luY2x1ZGUgPFZvbHVtZUN1cnZlLmg+CisjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTk1LDEyICs5NywxNCBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7CkBAIC0xMDksMjQgKzExMywxOSBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0U3lzdGVtUHJvcGVydHkoY29uc3QgY2hhciogcHJvcGVydHksIGNvbnN0IGNoYXIqIHZhbHVlKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKICAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKSBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLApAQCAtMTM4LDIwICsxMzcsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKIAogICAgICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0YXJ0cyBiZWluZyB1c2VkLgotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgKmNvbmN1cnJlbmN5KTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0b3BzIGJlaW5nIHVzZWQuCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgY2xvc2VBbGxJbnB1dHMoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgaW5pdFN0cmVhbVZvbHVtZTogZXZlbiBpZiB0aGUgZW5naW5lIHZvbHVtZSBmaWxlcyBwcm92aWRlcyBtaW4gYW5kIG1heCwga2VlcCB0aGlzCisgICAgICAgICAqIGFwaSBmb3IgY29tcGF0aWJpbGl0eSByZWFzb24uCisgICAgICAgICAqIEF1ZGlvU2VydmVyIHdpbGwgZ2V0IHRoZSBtaW4gYW5kIG1heCBhbmQgbWF5IG92ZXJ3cml0ZSB0aGVtIGlmOgorICAgICAgICAgKiAgICAgIC11c2luZyBwcm9wZXJ0eSAoaGlnaGVzdCBwcmlvcml0eSkKKyAgICAgICAgICogICAgICAtbm90IGRlZmluZWQgKC0xIGJ5IGNvbnZlbnRpb24pLCBjYXNlIHdoZW4gc3RpbGwgdXNpbmcgYXBtIHZvbHVtZSB0YWJsZXMgWE1MIGZpbGVzCisgICAgICAgICAqIEBwYXJhbSBzdHJlYW0gdG8gYmUgY29uc2lkZXJlZAorICAgICAgICAgKiBAcGFyYW0gaW5kZXhNaW4gdG8gc2V0CisgICAgICAgICAqIEBwYXJhbSBpbmRleE1heCB0byBzZXQKKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdm9pZCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwpAQCAtMTU5LDEwICsxNjEsMzYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwogCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpOworCisgICAgICAgIHN0YXR1c190IHNldFZvbHVtZUdyb3VwSW5kZXgoSVZvbHVtZUN1cnZlcyAmdm9sdW1lQ3VydmVzLCB2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzKTsKKworICAgICAgICBzdGF0dXNfdCBzZXRWb2x1bWVDdXJ2ZUluZGV4KGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElWb2x1bWVDdXJ2ZXMgJnZvbHVtZUN1cnZlcyk7CisKKyAgICAgICAgc3RhdHVzX3QgZ2V0Vm9sdW1lSW5kZXgoY29uc3QgSVZvbHVtZUN1cnZlcyAmY3VydmVzLCBpbnQgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdDsKKwogICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQotICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzCi0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cik7CisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJlYW1Ub1N0cmF0ZWd5KHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmVhbVRvU3RyYXRlZ3koYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGF1dG8gYXR0cmlidXRlcyA9IG1FbmdpbmUtPmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgICAgICAgICByZXR1cm4gbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIHJldHVybiB0aGUgZW5hYmxlZCBvdXRwdXQgZGV2aWNlcyBmb3IgdGhlIGdpdmVuIHN0cmVhbSB0eXBlCiAgICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwpAQCAtMTczLDE0ICsyMDEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtRWZmZWN0cy51bnJlZ2lzdGVyRWZmZWN0KGlkKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtRWZmZWN0cy5zZXRFZmZlY3RFbmFibGVkKGlkLCBlbmFibGVkKTsKLSAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKTsKIAogICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CiAgICAgICAgIC8vIHJldHVybiB3aGV0aGVyIGEgc3RyZWFtIGlzIHBsYXlpbmcgcmVtb3RlbHksIG92ZXJyaWRlIHRvIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZgpAQCAtMTkzLDEwICsyMTUsMTcgQEAKIAogICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdDsKIAotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKyAgICAgICAgLy8gaGVscGVycyBmb3IgZHVtcChpbnQgZmQpCisgICAgICAgIHZvaWQgZHVtcE1hbnVhbFN1cnJvdW5kRm9ybWF0cyhTdHJpbmc4ICpkc3QpIGNvbnN0OworICAgICAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKKworICAgICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgb3ZlcnJpZGU7CiAKICAgICAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgb2ZmbG9hZEluZm8pOwogCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpOworCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLApAQCAtMjI2LDEyICsyNTUsMTUgQEAKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyUG9saWN5TWl4ZXMoY29uc3QgVmVjdG9yPEF1ZGlvTWl4PiYgbWl4ZXMpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJQb2xpY3lNaXhlcyhWZWN0b3I8QXVkaW9NaXg+IG1peGVzKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKTsKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTW9ubyhib29sIG1vbm8pOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck1vbm8oYm9vbCAqbW9ubyk7CkBAIC0yNDQsMTAgKzI3NiwzNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCk7CiAKLSAgICAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gc3RyZWFtIHR5cGUKLSAgICAgICAgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKTsKIAotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldEFwcFN0YXRlKHVpZF90IHVpZCwgYXBwX3N0YXRlX3Qgc3RhdGUpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1FbmdpbmUtPmxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKHN0cmF0ZWdpZXMpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJvZHVjdFN0cmF0ZWd5ID0gbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhhYS5nZXRBdHRyaWJ1dGVzKCkpOworICAgICAgICAgICAgcmV0dXJuIHByb2R1Y3RTdHJhdGVneSAhPSBQUk9EVUNUX1NUUkFURUdZX05PTkUgPyBOT19FUlJPUiA6IEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3VwcykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1FbmdpbmUtPmxpc3RBdWRpb1ZvbHVtZUdyb3Vwcyhncm91cHMpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgJnZvbHVtZUdyb3VwKQorICAgICAgICB7CisgICAgICAgICAgICB2b2x1bWVHcm91cCA9IG1FbmdpbmUtPmdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhhYS5nZXRBdHRyaWJ1dGVzKCkpOworICAgICAgICAgICAgcmV0dXJuIHZvbHVtZUdyb3VwICE9IFZPTFVNRV9HUk9VUF9OT05FID8gTk9fRVJST1IgOiBCQURfVkFMVUU7CisgICAgICAgIH0KIAogcHJvdGVjdGVkOgogICAgICAgICAvLyBBIGNvbnN0cnVjdG9yIHRoYXQgYWxsb3dzIG1vcmUgZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlciBpbml0aWFsaXphdGlvbiBwcm9jZXNzLApAQCAtMjk0LDY3ICszNTIsODQgQEAKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIG1BdmFpbGFibGVJbnB1dERldmljZXM7CiAgICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiAmZ2V0Vm9sdW1lQ3VydmVzKCkgeyByZXR1cm4gKm1Wb2x1bWVDdXJ2ZXM7IH0KICAgICAgICAgdmlydHVhbCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZ2V0RGVmYXVsdE91dHB1dERldmljZSgpIGNvbnN0CiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBtRGVmYXVsdE91dHB1dERldmljZTsKICAgICAgICAgfQogCisgICAgICAgIHN0ZDo6dmVjdG9yPHZvbHVtZV9ncm91cF90PiBnZXRWb2x1bWVHcm91cHMoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbUVuZ2luZS0+Z2V0Vm9sdW1lR3JvdXBzKCk7CisgICAgICAgIH0KKworICAgICAgICBWb2x1bWVTb3VyY2UgdG9Wb2x1bWVTb3VyY2Uodm9sdW1lX2dyb3VwX3Qgdm9sdW1lR3JvdXApIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxWb2x1bWVTb3VyY2U+KHZvbHVtZUdyb3VwKTsKKyAgICAgICAgfQorICAgICAgICBWb2x1bWVTb3VyY2UgdG9Wb2x1bWVTb3VyY2UoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdG9Wb2x1bWVTb3VyY2UobUVuZ2luZS0+Z2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpKTsKKyAgICAgICAgfQorICAgICAgICBWb2x1bWVTb3VyY2UgdG9Wb2x1bWVTb3VyY2UoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0b1ZvbHVtZVNvdXJjZShtRW5naW5lLT5nZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoc3RyZWFtKSk7CisgICAgICAgIH0KKyAgICAgICAgSVZvbHVtZUN1cnZlcyAmZ2V0Vm9sdW1lQ3VydmVzKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UpCisgICAgICAgIHsKKyAgICAgICAgICBhdXRvICpjdXJ2ZXMgPSBtRW5naW5lLT5nZXRWb2x1bWVDdXJ2ZXNGb3JWb2x1bWVHcm91cCgKKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9sdW1lX2dyb3VwX3Q+KHZvbHVtZVNvdXJjZSkpOworICAgICAgICAgIEFMT0dfQVNTRVJUKGN1cnZlcyAhPSBudWxscHRyLCAiTm8gY3VydmVzIGZvciB2b2x1bWUgc291cmNlICVkIiwgdm9sdW1lU291cmNlKTsKKyAgICAgICAgICByZXR1cm4gKmN1cnZlczsKKyAgICAgICAgfQorICAgICAgICBJVm9sdW1lQ3VydmVzICZnZXRWb2x1bWVDdXJ2ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKQorICAgICAgICB7CisgICAgICAgICAgICBhdXRvICpjdXJ2ZXMgPSBtRW5naW5lLT5nZXRWb2x1bWVDdXJ2ZXNGb3JBdHRyaWJ1dGVzKGF0dHIpOworICAgICAgICAgICAgQUxPR19BU1NFUlQoY3VydmVzICE9IG51bGxwdHIsICJObyBjdXJ2ZXMgZm9yIGF0dHJpYnV0ZXMgJXMiLCB0b1N0cmluZyhhdHRyKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiAqY3VydmVzOworICAgICAgICB9CisgICAgICAgIElWb2x1bWVDdXJ2ZXMgJmdldFZvbHVtZUN1cnZlcyhhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgYXV0byAqY3VydmVzID0gbUVuZ2luZS0+Z2V0Vm9sdW1lQ3VydmVzRm9yU3RyZWFtVHlwZShzdHJlYW0pOworICAgICAgICAgICAgQUxPR19BU1NFUlQoY3VydmVzICE9IG51bGxwdHIsICJObyBjdXJ2ZXMgZm9yIHN0cmVhbSAlcyIsIHRvU3RyaW5nKHN0cmVhbSkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gKmN1cnZlczsKKyAgICAgICAgfQorCiAgICAgICAgIHZvaWQgYWRkT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKTsKICAgICAgICAgdm9pZCByZW1vdmVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKICAgICAgICAgdm9pZCBhZGRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dERlc2MpOwogCi0gICAgICAgIC8vIHJldHVybiBhcHByb3ByaWF0ZSBkZXZpY2UgZm9yIHN0cmVhbXMgaGFuZGxlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmF0ZWd5IGFjY29yZGluZyB0byBjdXJyZW50Ci0gICAgICAgIC8vIHBob25lIHN0YXRlLCBjb25uZWN0ZWQgZGV2aWNlcy4uLgotICAgICAgICAvLyBpZiBmcm9tQ2FjaGUgaXMgdHJ1ZSwgdGhlIGRldmljZSBpcyByZXR1cm5lZCBmcm9tIG1EZXZpY2VGb3JTdHJhdGVneVtdLAotICAgICAgICAvLyBvdGhlcndpc2UgaXQgaXMgZGV0ZXJtaW5lIGJ5IGN1cnJlbnQgc3RhdGUKLSAgICAgICAgLy8gKGRldmljZSBjb25uZWN0ZWQscGhvbmUgc3RhdGUsIGZvcmNlIHVzZSwgYTJkcCBvdXRwdXQuLi4pCi0gICAgICAgIC8vIFRoaXMgYWxsb3dzIHRvOgotICAgICAgICAvLyAgMSBzcGVlZCB1cCBwcm9jZXNzIHdoZW4gdGhlIHN0YXRlIGlzIHN0YWJsZSAod2hlbiBzdGFydGluZyBvciBzdG9wcGluZyBhbiBvdXRwdXQpCi0gICAgICAgIC8vICAyIGFjY2VzcyB0byBlaXRoZXIgY3VycmVudCBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gdHJ1ZSkgb3IKLSAgICAgICAgLy8gImZ1dHVyZSIgZGV2aWNlIHNlbGVjdGlvbiAoZnJvbUNhY2hlID09IGZhbHNlKSB3aGVuIGNhbGxlZCBmcm9tIGEgY29udGV4dAotICAgICAgICAvLyAgd2hlcmUgY29uZGl0aW9ucyBhcmUgY2hhbmdpbmcgKHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpLCBzZXRQaG9uZVN0YXRlKCkuLi4pIEFORAotICAgICAgICAvLyAgYmVmb3JlIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkgaXMgY2FsbGVkLgotICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSk7Ci0KLSAgICAgICAgYm9vbCBpc1N0cmF0ZWd5QWN0aXZlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDAsIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OwotCi0gICAgICAgIGJvb2wgaXNTdHJhdGVneUFjdGl2ZU9uU2FtZU1vZHVsZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LCB1aW50MzJfdCBpblBhc3RNcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OwotCiAgICAgICAgIC8vIGNoYW5nZSB0aGUgcm91dGUgb2YgdGhlIHNwZWNpZmllZCBvdXRwdXQuIFJldHVybnMgdGhlIG51bWJlciBvZiBtcyB3ZSBoYXZlIHNsZXB0IHRvCiAgICAgICAgIC8vIGFsbG93IG5ldyByb3V0aW5nIHRvIHRha2UgZWZmZWN0IGluIGNlcnRhaW4gY2FzZXMuCi0gICAgICAgIHZpcnR1YWwgdWludDMyX3Qgc2V0T3V0cHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzID0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXF1aXJlc011dGVDaGVjayA9IHRydWUpOworICAgICAgICB1aW50MzJfdCBzZXRPdXRwdXREZXZpY2VzKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXF1aXJlc011dGVDaGVjayA9IHRydWUpOwogICAgICAgICBzdGF0dXNfdCByZXNldE91dHB1dERldmljZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOwogICAgICAgICBzdGF0dXNfdCBzZXRJbnB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMKTsKICAgICAgICAgc3RhdHVzX3QgcmVzZXRJbnB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMKTsKIAotICAgICAgICAvLyBzZWxlY3QgaW5wdXQgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8gcmVxdWVzdGVkIGF1ZGlvIHNvdXJjZQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSk7Ci0KICAgICAgICAgLy8gY29tcHV0ZSB0aGUgYWN0dWFsIHZvbHVtZSBmb3IgYSBnaXZlbiBzdHJlYW0gYWNjb3JkaW5nIHRvIHRoZSByZXF1ZXN0ZWQgaW5kZXggYW5kIGEgcGFydGljdWxhcgogICAgICAgICAvLyBkZXZpY2UKLSAgICAgICAgdmlydHVhbCBmbG9hdCBjb21wdXRlVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICB2aXJ0dWFsIGZsb2F0IGNvbXB1dGVWb2x1bWUoSVZvbHVtZUN1cnZlcyAmY3VydmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwogCisgICAgICAgIC8vIHJlc2NhbGUgdm9sdW1lIGluZGV4IGZyb20gc3JjU3RyZWFtIHdpdGhpbiByYW5nZSBvZiBkc3RTdHJlYW0KKyAgICAgICAgaW50IHJlc2NhbGVWb2x1bWVJbmRleChpbnQgc3JjSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzcmNTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBkc3RTdHJlYW0pOwogICAgICAgICAvLyBjaGVjayB0aGF0IHZvbHVtZSBjaGFuZ2UgaXMgcGVybWl0dGVkLCBjb21wdXRlIGFuZCBzZW5kIG5ldyB2b2x1bWUgdG8gYXVkaW8gaGFyZHdhcmUKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjaGVja0FuZFNldFZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4LAorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNoZWNrQW5kU2V0Vm9sdW1lKElWb2x1bWVDdXJ2ZXMgJmN1cnZlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKQEAgLTM2MywyMyArNDM4LDM3IEBACiAgICAgICAgIHZvaWQgYXBwbHlTdHJlYW1Wb2x1bWVzKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBkZWxheU1zID0gMCwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKIAotICAgICAgICAvLyBNdXRlIG9yIHVubXV0ZSBhbGwgc3RyZWFtcyBoYW5kbGVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyYXRlZ3kgb24gdGhlIHNwZWNpZmllZCBvdXRwdXQKLSAgICAgICAgdm9pZCBzZXRTdHJhdGVneU11dGUocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBzZXRTdHJhdGVneU11dGUgTXV0ZSBvciB1bm11dGUgYWxsIGFjdGl2ZSBjbGllbnRzIG9uIHRoZSBjb25zaWRlcmVkIG91dHB1dAorICAgICAgICAgKiBmb2xsb3dpbmcgdGhlIGdpdmVuIHN0cmF0ZWd5LgorICAgICAgICAgKiBAcGFyYW0gc3RyYXRlZ3kgdG8gYmUgY29uc2lkZXJlZAorICAgICAgICAgKiBAcGFyYW0gb24gdHJ1ZSBmb3IgbXV0ZSwgZmFsc2UgZm9yIHVubXV0ZQorICAgICAgICAgKiBAcGFyYW0gb3V0cHV0RGVzYyB0byBiZSBjb25zaWRlcmVkCisgICAgICAgICAqIEBwYXJhbSBkZWxheU1zCisgICAgICAgICAqIEBwYXJhbSBkZXZpY2UKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc2V0U3RyYXRlZ3lNdXRlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FKTsKIAotICAgICAgICAvLyBNdXRlIG9yIHVubXV0ZSB0aGUgc3RyZWFtIG9uIHRoZSBzcGVjaWZpZWQgb3V0cHV0Ci0gICAgICAgIHZvaWQgc2V0U3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpMCk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZXMgZm9yIHNvbmlmaWNhdGlvbiBzdHJhdGVneSB3aGlsZSBpbiBjYWxsOiBtdXRlIHN0cmVhbXMgb3IgcmVwbGFjZSBieQotICAgICAgICAvLyBhIHNwZWNpYWwgdG9uZSBpbiB0aGUgZGV2aWNlIHVzZWQgZm9yIGNvbW11bmljYXRpb24KLSAgICAgICAgdm9pZCBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgc3RhcnRpbmcsIGJvb2wgc3RhdGVDaGFuZ2UpOworICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIHNldFZvbHVtZVNvdXJjZU11dGUgTXV0ZSBvciB1bm11dGUgdGhlIHZvbHVtZSBzb3VyY2Ugb24gdGhlIHNwZWNpZmllZCBvdXRwdXQKKyAgICAgICAgICogQHBhcmFtIHZvbHVtZVNvdXJjZSB0byBiZSBtdXRlZC91bm11dGUgKG1heSBob3N0IGxlZ2FjeSBzdHJlYW1zIG9yIGJ5IGV4dGVuc2lvbiBzZXQgb2YKKyAgICAgICAgICogYXVkaW8gYXR0cmlidXRlcykKKyAgICAgICAgICogQHBhcmFtIG9uIHRydWUgdG8gbXV0ZSwgZmFsc2UgdG8gdW11dGUKKyAgICAgICAgICogQHBhcmFtIG91dHB1dERlc2Mgb24gd2hpY2ggdGhlIGNsaWVudCBmb2xsb3dpbmcgdGhlIHZvbHVtZSBncm91cCBzaGFsbCBiZSBtdXRlZC91bXV0ZWQKKyAgICAgICAgICogQHBhcmFtIGRlbGF5TXMKKyAgICAgICAgICogQHBhcmFtIGRldmljZQorICAgICAgICAgKiBAcGFyYW0gYWN0aXZlT25seSBpZiB0cnVlLCBtdXRlIG9ubHkgaWYgdGhlIHZvbHVtZSBncm91cCBpcyBhY3RpdmUgb24gdGhlIG91dHB1dC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc2V0Vm9sdW1lU291cmNlTXV0ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFjdGl2ZU9ubHkgPSBmYWxzZSk7CiAKICAgICAgICAgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKTsKIApAQCAtMzk0LDE1ICs0ODMsMTMgQEAKICAgICAgICAgLy8gd2hlbiBhIGRldmljZSBpcyBkaXNjb25uZWN0ZWQsIGNoZWNrcyBpZiBhbiBvdXRwdXQgaXMgbm90IHVzZWQgYW55IG1vcmUgYW5kCiAgICAgICAgIC8vIHJldHVybnMgaXRzIGhhbmRsZSBpZiBhbnkuCiAgICAgICAgIC8vIHRyYW5zZmVycyB0aGUgYXVkaW8gdHJhY2tzIGFuZCBlZmZlY3RzIGZyb20gb25lIG91dHB1dCB0aHJlYWQgdG8gYW5vdGhlciBhY2NvcmRpbmdseS4KLSAgICAgICAgc3RhdHVzX3QgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLAorICAgICAgICBzdGF0dXNfdCBjaGVja091dHB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMpOwogCi0gICAgICAgIHN0YXR1c190IGNoZWNrSW5wdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLAorICAgICAgICBzdGF0dXNfdCBjaGVja0lucHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIGlucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIGlucHV0cyk7CiAKICAgICAgICAgLy8gY2xvc2UgYW4gb3V0cHV0IGFuZCBpdHMgY29tcGFuaW9uIGR1cGxpY2F0aW5nIG91dHB1dC4KICAgICAgICAgdm9pZCBjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwpAQCAtNDEwLDE1ICs0OTcsMzUgQEAKICAgICAgICAgLy8gY2xvc2UgYW4gaW5wdXQuCiAgICAgICAgIHZvaWQgY2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CiAKLSAgICAgICAgLy8gY2hlY2tzIGFuZCBpZiBuZWNlc3NhcnkgY2hhbmdlcyBvdXRwdXRzIHVzZWQgZm9yIGFsbCBzdHJhdGVnaWVzLgotICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgb3V0cHV0IGNob2ljZSBmb3IgYSBnaXZlbiBzdHJhdGVneQotICAgICAgICAvLyBjaGFuZ2VzOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLi4uCi0gICAgICAgIC8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpCi0gICAgICAgIHZvaWQgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KTsKKyAgICAgICAgLy8gcnVucyBhbGwgdGhlIGNoZWNrcyByZXF1aXJlZCBmb3IgYWNjb21vZGF0aW5nIGNoYW5nZXMgaW4gZGV2aWNlcyBhbmQgb3V0cHV0cworICAgICAgICAvLyBpZiAnb25PdXRwdXRzQ2hlY2tlZCcgY2FsbGJhY2sgaXMgcHJvdmlkZWQsIGl0IGlzIGV4ZWN1dGVkIGFmdGVyIHRoZSBvdXRwdXRzCisgICAgICAgIC8vIGNoZWNrIHZpYSAnY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzJy4gSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgJ3RydWUnLAorICAgICAgICAvLyBBMkRQIHN1c3BlbmQgc3RhdHVzIGlzIHJlY2hlY2tlZC4KKyAgICAgICAgdm9pZCBjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoc3RkOjpmdW5jdGlvbjxib29sKCk+IG9uT3V0cHV0c0NoZWNrZWQgPSBudWxscHRyKTsKIAotICAgICAgICAvLyBTYW1lIGFzIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBidXQgZm9yIGEgYWxsIHN0cmF0ZWdpZXMgaW4gb3JkZXIgb2YgcHJpb3JpdHkKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBjaGVja091dHB1dEZvckF0dHJpYnV0ZXMgY2hlY2tzIGFuZCBpZiBuZWNlc3NhcnkgY2hhbmdlcyBvdXRwdXRzIHVzZWQgZm9yIHRoZQorICAgICAgICAgKiBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzLgorICAgICAgICAgKiBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgb3V0cHV0IGNob2ljZSBmb3IgYSBnaXZlbgorICAgICAgICAgKiBhdHRyaWJ1dGVzIGNoYW5nZXM6IGNvbm5lY3RlZCBkZXZpY2UsIHBob25lIHN0YXRlLCBmb3JjZSB1c2UuLi4KKyAgICAgICAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkKKyAgICAgICAgICogQHBhcmFtIGF0dHIgdG8gYmUgY29uc2lkZXJlZAorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBjaGVja091dHB1dEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKTsKKworICAgICAgICBib29sIGZvbGxvd3NTYW1lUm91dGluZyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmxBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJnJBdHRyKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcyBTYW1lIGFzIEBzZWUgY2hlY2tPdXRwdXRGb3JBdHRyaWJ1dGVzKCkKKyAgICAgICAgICogICAgICBidXQgZm9yIGEgYWxsIHByb2R1Y3Qgc3RyYXRlZ2llcyBpbiBvcmRlciBvZiBwcmlvcml0eQorICAgICAgICAgKi8KICAgICAgICAgdm9pZCBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKIAorICAgICAgICAvLyBTYW1lIGFzIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3kgYnV0IGZvciBzZWNvbmRhcnkgb3V0cHV0cy4gTWFrZSBzdXJlIGlmIGEgc2Vjb25kYXJ5CisgICAgICAgIC8vIG91dHB1dCBjb25kaXRpb24gY2hhbmdlcywgdGhlIHRyYWNrIGlzIHByb3Blcmx5IHJlcm91dGVkCisgICAgICAgIHZvaWQgY2hlY2tTZWNvbmRhcnlPdXRwdXRzKCk7CisKICAgICAgICAgLy8gbWFuYWdlcyBBMkRQIG91dHB1dCBzdXNwZW5kL3Jlc3RvcmUgYWNjb3JkaW5nIHRvIHBob25lIHN0YXRlIGFuZCBCVCBTQ08gdXNhZ2UKICAgICAgICAgdm9pZCBjaGVja0EyZHBTdXNwZW5kKCk7CiAKQEAgLTQyNiwxOCArNTMzLDIxIEBACiAgICAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBkZXZpY2UgY2hvaWNlIGZvciBhIGdpdmVuIG91dHB1dCBpcwogICAgICAgICAvLyBjaGFuZ2VkOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLCBvdXRwdXQgc3RhcnQsIG91dHB1dCBzdG9wLi4KICAgICAgICAgLy8gc2VlIGdldERldmljZUZvclN0cmF0ZWd5KCkgZm9yIHRoZSB1c2Ugb2YgZnJvbUNhY2hlIHBhcmFtZXRlcgotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0TmV3T3V0cHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpOworICAgICAgICBEZXZpY2VWZWN0b3IgZ2V0TmV3T3V0cHV0RGV2aWNlcyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKTsKIAotICAgICAgICAvLyB1cGRhdGVzIGNhY2hlIG9mIGRldmljZSB1c2VkIGJ5IGFsbCBzdHJhdGVnaWVzIChtRGV2aWNlRm9yU3RyYXRlZ3lbXSkKLSAgICAgICAgLy8gbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIGNvbmRpdGlvbiB0aGF0IGFmZmVjdHMgdGhlIGRldmljZSBjaG9pY2UgZm9yIGEgZ2l2ZW4gc3RyYXRlZ3kgaXMKLSAgICAgICAgLy8gY2hhbmdlZDogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZS4uLgotICAgICAgICAvLyBjYWNoZWQgdmFsdWVzIGFyZSB1c2VkIGJ5IGdldERldmljZUZvclN0cmF0ZWd5KCkgaWYgcGFyYW1ldGVyIGZyb21DYWNoZSBpcyB0cnVlLgotICAgICAgICAgLy8gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0czogdXBkYXRlcyBjYWNoZSBvZiBkZXZpY2VzIG9mIHRoZSBlbmdpbmUKKyAgICAgICAgICogbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIGNvbmRpdGlvbiB0aGF0IGFmZmVjdHMgdGhlIGRldmljZSBjaG9pY2UgaXMgY2hhbmdlZDoKKyAgICAgICAgICogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZS4uLgorICAgICAgICAgKiBjYWNoZWQgdmFsdWVzIGFyZSB1c2VkIGJ5IGdldE91dHB1dERldmljZXNGb3JTdHJlYW0oKS9nZXREZXZpY2VzRm9yQXR0cmlidXRlcyBpZgorICAgICAgICAgKiBwYXJhbWV0ZXIgZnJvbUNhY2hlIGlzIHRydWUuCisgICAgICAgICAqIE11c3QgYmUgY2FsbGVkIGFmdGVyIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpCisgICAgICAgICAqLwogICAgICAgICB2b2lkIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CiAKICAgICAgICAgLy8gc2VsZWN0cyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBkZXZpY2Ugb24gaW5wdXQgZm9yIGN1cnJlbnQgc3RhdGUKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGdldE5ld0lucHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXREZXNjKTsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0TmV3SW5wdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dERlc2MpOwogCiAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0TWF4RWZmZWN0c0NwdUxvYWQoKQogICAgICAgICB7CkBAIC00NDksMzQgKzU1OSw1MCBAQAogICAgICAgICAgICAgcmV0dXJuIG1FZmZlY3RzLmdldE1heEVmZmVjdHNNZW1vcnkoKTsKICAgICAgICAgfQogCi0gICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZ2V0T3V0cHV0c0ZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24mIG9wZW5PdXRwdXRzKTsKLSAgICAgICAgYm9vbCB2ZWN0b3JzRXF1YWwoU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czIpOworICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGdldE91dHB1dHNGb3JEZXZpY2VzKAorICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcywgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24mIG9wZW5PdXRwdXRzKTsKIAotICAgICAgICAvLyBtdXRlL3VubXV0ZSBzdHJhdGVnaWVzIHVzaW5nIGFuIGluY29tcGF0aWJsZSBkZXZpY2UgY29tYmluYXRpb24KLSAgICAgICAgLy8gaWYgbXV0aW5nLCB3YWl0IGZvciB0aGUgYXVkaW8gaW4gcGNtIGJ1ZmZlciB0byBiZSBkcmFpbmVkIGJlZm9yZSBwcm9jZWVkaW5nCi0gICAgICAgIC8vIGlmIHVubXV0aW5nLCB1bm11dGUgb25seSBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5Ci0gICAgICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBtcyB3YWl0ZWQKLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJldkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcyk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyBtdXRlL3VubXV0ZSBzdHJhdGVnaWVzCisgICAgICAgICAqICAgICAgdXNpbmcgYW4gaW5jb21wYXRpYmxlIGRldmljZSBjb21iaW5hdGlvbi4KKyAgICAgICAgICogICAgICBpZiBtdXRpbmcsIHdhaXQgZm9yIHRoZSBhdWRpbyBpbiBwY20gYnVmZmVyIHRvIGJlIGRyYWluZWQgYmVmb3JlIHByb2NlZWRpbmcKKyAgICAgICAgICogICAgICBpZiB1bm11dGluZywgdW5tdXRlIG9ubHkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheQorICAgICAgICAgKiBAcGFyYW0gb3V0cHV0RGVzYworICAgICAgICAgKiBAcGFyYW0gcHJldkRldmljZQorICAgICAgICAgKiBAcGFyYW0gZGVsYXlNcworICAgICAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbXMgd2FpdGVkCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmcHJldkRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zKTsKIAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzZWxlY3RPdXRwdXQoY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwKTsKICAgICAgICAgLy8gc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrIGFyZSBpbi9vdXQgYW5kIHNvIG1heSBiZSBtb2RpZmllZAotICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldElucHV0UHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldElucHV0UHJvZmlsZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QmIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QmIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKLSAgICAgICAgc3A8SU9Qcm9maWxlPiBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgZ2V0UHJvZmlsZUZvck91dHB1dAorICAgICAgICAgKiBAcGFyYW0gZGV2aWNlcyB2ZWN0b3Igb2YgZGVzY3JpcHRvcnMsIG1heSBiZSBlbXB0eSBpZiBpZ25vcmluZyB0aGUgZGV2aWNlIGlzIHJlcXVpcmVkCisgICAgICAgICAqIEBwYXJhbSBzYW1wbGluZ1JhdGUKKyAgICAgICAgICogQHBhcmFtIGZvcm1hdAorICAgICAgICAgKiBAcGFyYW0gY2hhbm5lbE1hc2sKKyAgICAgICAgICogQHBhcmFtIGZsYWdzCisgICAgICAgICAqIEBwYXJhbSBkaXJlY3RPbmx5CisgICAgICAgICAqIEByZXR1cm4gSU9Qcm9maWxlIHRvIGJlIHVzZWQgaWYgZm91bmQsIG51bGxwdHIgb3RoZXJ3aXNlCisgICAgICAgICAqLworICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldFByb2ZpbGVGb3JPdXRwdXQoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGlyZWN0T25seSk7CiAKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc2VsZWN0T3V0cHV0Rm9yTXVzaWNFZmZlY3RzKCk7CiAKQEAgLTQ4OSw2MiArNjE1LDg3IEBACiAgICAgICAgICAgICByZXR1cm4gbUF1ZGlvUGF0Y2hlcy5yZW1vdmVBdWRpb1BhdGNoKGhhbmRsZSk7CiAgICAgICAgIH0KIAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKSBjb25zdAorICAgICAgICBib29sIGlzUHJpbWFyeU1vZHVsZShjb25zdCBzcDxId01vZHVsZT4gJm1vZHVsZSkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1vZHVsZSA9PSAwIHx8ICFoYXNQcmltYXJ5T3V0cHV0KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbW9kdWxlLT5nZXRIYW5kbGUoKSA9PSBtUHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCk7CisgICAgICAgIH0KKyAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCkgY29uc3QKICAgICAgICAgewogICAgICAgICAgICAgaWYgKCFoYXNQcmltYXJ5T3V0cHV0KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgICAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcigpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1QcmltYXJ5T3V0cHV0LT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOworICAgICAgICAgICAgcmV0dXJuIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmZpbHRlcihtUHJpbWFyeU91dHB1dC0+c3VwcG9ydGVkRGV2aWNlcygpKTsKICAgICAgICAgfQotICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlUHJpbWFyeUlucHV0RGV2aWNlcygpIGNvbnN0CisgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVQcmltYXJ5TW9kdWxlSW5wdXREZXZpY2VzKCkgY29uc3QKICAgICAgICAgewogICAgICAgICAgICAgaWYgKCFoYXNQcmltYXJ5T3V0cHV0KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgICAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcigpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21Id01vZHVsZShtUHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpOworICAgICAgICAgICAgcmV0dXJuIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21Id01vZHVsZSgKKyAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpKTsKKyAgICAgICAgfQorICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIGdldEZpcnN0RGV2aWNlSWQgb2YgdGhlIERldmljZSBWZWN0b3IKKyAgICAgICAgICogQHJldHVybiBpZiB0aGUgY29sbGVjdGlvbiBpcyBub3QgZW1wdHksIGl0IHJldHVybnMgdGhlIGZpcnN0IGRldmljZSBJZCwKKyAgICAgICAgICogICAgICAgICBvdGhlcndpc2UgQVVESU9fUE9SVF9IQU5ETEVfTk9ORQorICAgICAgICAgKi8KKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRGaXJzdERldmljZUlkKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChkZXZpY2VzLnNpemUoKSA+IDApID8gZGV2aWNlcy5pdGVtQXQoMCktPmdldElkKCkgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICB9CisgICAgICAgIFN0cmluZzggZ2V0Rmlyc3REZXZpY2VBZGRyZXNzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChkZXZpY2VzLnNpemUoKSA+IDApID8gZGV2aWNlcy5pdGVtQXQoMCktPmFkZHJlc3MoKSA6IFN0cmluZzgoIiIpOwogICAgICAgICB9CiAKLSAgICAgICAgdWludDMyX3QgdXBkYXRlQ2FsbFJvdXRpbmcoYXVkaW9fZGV2aWNlc190IHJ4RGV2aWNlLCB1aW50MzJfdCBkZWxheU1zID0gMCk7Ci0gICAgICAgIHNwPEF1ZGlvUGF0Y2g+IGNyZWF0ZVRlbGVwaG9ueVBhdGNoKGJvb2wgaXNSeCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgdWludDMyX3QgZGVsYXlNcyk7Ci0gICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UoCi0gICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICAgICAgdWludDMyX3QgdXBkYXRlQ2FsbFJvdXRpbmcoY29uc3QgRGV2aWNlVmVjdG9yICZyeERldmljZXMsIHVpbnQzMl90IGRlbGF5TXMgPSAwKTsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gY3JlYXRlVGVsZXBob255UGF0Y2goYm9vbCBpc1J4LCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zKTsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZmluZERldmljZSgKKyAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0OworICAgICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0TW9kdWxlRGV2aWNlVHlwZXMoCisgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzLCBjb25zdCBjaGFyICptb2R1bGVJZCkgY29uc3Q7CisgICAgICAgIGJvb2wgaXNEZXZpY2VPZk1vZHVsZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywgY29uc3QgY2hhciAqbW9kdWxlSWQpIGNvbnN0OwogCi0gICAgICAgIC8vIGlmIGFyZ3VtZW50ICJkZXZpY2UiIGlzIGRpZmZlcmVudCBmcm9tIEFVRElPX0RFVklDRV9OT05FLCAgc3RhcnRTb3VyY2UoKSB3aWxsIGZvcmNlCi0gICAgICAgIC8vIHRoZSByZS1ldmFsdWF0aW9uIG9mIHRoZSBvdXRwdXQgZGV2aWNlLgotICAgICAgICBzdGF0dXNfdCBzdGFydFNvdXJjZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgc3RhdHVzX3Qgc3RhcnRTb3VyY2UoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkZWxheU1zKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RvcFNvdXJjZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VEZXZpY2VVcGRhdGUpOworICAgICAgICBzdGF0dXNfdCBzdG9wU291cmNlKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQpOwogCiAgICAgICAgIHZvaWQgY2xlYXJBdWRpb1BhdGNoZXModWlkX3QgdWlkKTsKICAgICAgICAgdm9pZCBjbGVhclNlc3Npb25Sb3V0ZXModWlkX3QgdWlkKTsKLSAgICAgICAgdm9pZCBjaGVja1N0cmF0ZWd5Um91dGUocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwgYXVkaW9faW9faGFuZGxlX3Qgb3VwdHV0VG9Ta2lwKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIGNoZWNrU3RyYXRlZ3lSb3V0ZTogd2hlbiBhbiBvdXRwdXQgaXMgYmVlaW5nIHJlcm91dGVkLCByZWNvbnNpZGVyIGVhY2ggb3V0cHV0CisgICAgICAgICAqIHRoYXQgbWF5IGhvc3QgYSBzdHJhdGVneSBwbGF5aW5nIG9uIHRoZSBjb25zaWRlcmVkIG91dHB1dC4KKyAgICAgICAgICogQHBhcmFtIHBzIHByb2R1Y3Qgc3RyYXRlZ3kgdGhhdCBpbml0aWF0ZWQgdGhlIHJlcm91dGluZworICAgICAgICAgKiBAcGFyYW0gb3VwdHV0VG9Ta2lwIG91dHB1dCB0aGF0IGluaXRpYXRlZCB0aGUgcmVyb3V0aW5nCisgICAgICAgICAqLworICAgICAgICB2b2lkIGNoZWNrU3RyYXRlZ3lSb3V0ZShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMsIGF1ZGlvX2lvX2hhbmRsZV90IG91cHR1dFRvU2tpcCk7CiAKICAgICAgICAgc3RhdHVzX3QgaGFzUHJpbWFyeU91dHB1dCgpIGNvbnN0IHsgcmV0dXJuIG1QcmltYXJ5T3V0cHV0ICE9IDA7IH0KIAotICAgICAgICBzdGF0dXNfdCBjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiYgc291cmNlRGVzYyk7Ci0gICAgICAgIHN0YXR1c190IGRpc2Nvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKTsKKyAgICAgICAgc3RhdHVzX3QgY29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKTsKKyAgICAgICAgc3RhdHVzX3QgZGlzY29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKTsKIAotICAgICAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IGdldFNvdXJjZUZvclN0cmF0ZWd5T25PdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSk7CisgICAgICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IGdldFNvdXJjZUZvckF0dHJpYnV0ZXNPbk91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpOwogCiAgICAgICAgIHZvaWQgY2xlYW5VcEZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2aWNlRGVzYyk7CiAKICAgICAgICAgdm9pZCBjbGVhckF1ZGlvU291cmNlcyh1aWRfdCB1aWQpOwogCi0gICAgICAgIHN0YXRpYyBib29sIGlzQ29uY3VycmVudFNvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpOwotCi0gICAgICAgIGJvb2wgaXNDb25jdXJlbnRDYXB0dXJlQWxsb3dlZChjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYywKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+JiBhdWRpb1Nlc3Npb24pOwotCiAgICAgICAgIHN0YXRpYyBib29sIHN0cmVhbXNNYXRjaEZvcnZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbTIpOwogCi0gICAgICAgIHVpZF90IG1VaWRDYWNoZWQ7CisgICAgICAgIHZvaWQgY2xvc2VBY3RpdmVDbGllbnRzKGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXQpOworICAgICAgICB2b2lkIGNsb3NlQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKworICAgICAgICBjb25zdCB1aWRfdCBtVWlkQ2FjaGVkOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBSURfQVVESU9TRVJWRVIKICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKm1wQ2xpZW50SW50ZXJmYWNlOyAgLy8gYXVkaW8gcG9saWN5IGNsaWVudCBpbnRlcmZhY2UKICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1QcmltYXJ5T3V0cHV0OyAgICAgLy8gcHJpbWFyeSBvdXRwdXQgZGVzY3JpcHRvcgogICAgICAgICAvLyBsaXN0IG9mIGRlc2NyaXB0b3JzIGZvciBvdXRwdXRzIGN1cnJlbnRseSBvcGVuZWQKQEAgLTU1OCwyMCArNzA5LDE3IEBACiAgICAgICAgIERldmljZVZlY3RvciAgbUF2YWlsYWJsZU91dHB1dERldmljZXM7IC8vIGFsbCBhdmFpbGFibGUgb3V0cHV0IGRldmljZXMKICAgICAgICAgRGV2aWNlVmVjdG9yICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzOyAgLy8gYWxsIGF2YWlsYWJsZSBpbnB1dCBkZXZpY2VzCiAKLSAgICAgICAgU2Vzc2lvblJvdXRlTWFwIG1PdXRwdXRSb3V0ZXMgPSBTZXNzaW9uUm91dGVNYXAoU2Vzc2lvblJvdXRlTWFwOjpNQVBUWVBFX09VVFBVVCk7Ci0gICAgICAgIFNlc3Npb25Sb3V0ZU1hcCBtSW5wdXRSb3V0ZXMgPSBTZXNzaW9uUm91dGVNYXAoU2Vzc2lvblJvdXRlTWFwOjpNQVBUWVBFX0lOUFVUKTsKLQogICAgICAgICBib29sICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lOyAgICAgICAgLy8gbGltaXQgcmluZ3RvbmUgdm9sdW1lIHRvIG11c2ljIHZvbHVtZSBpZiBoZWFkc2V0IGNvbm5lY3RlZAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgbURldmljZUZvclN0cmF0ZWd5W05VTV9TVFJBVEVHSUVTXTsKKwogICAgICAgICBmbG9hdCAgIG1MYXN0Vm9pY2VWb2x1bWU7ICAgICAgICAgICAgLy8gbGFzdCB2b2ljZSB2b2x1bWUgdmFsdWUgc2VudCB0byBhdWRpbyBIQUwKICAgICAgICAgYm9vbCAgICBtQTJkcFN1c3BlbmRlZDsgIC8vIHRydWUgaWYgQTJEUCBvdXRwdXQgaXMgc3VzcGVuZGVkCiAKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uPiBtVm9sdW1lQ3VydmVzOyAvLyBWb2x1bWUgQ3VydmVzIHBlciB1c2UgY2FzZSBhbmQgZGV2aWNlIGNhdGVnb3J5CiAgICAgICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIG1FZmZlY3RzOyAgLy8gbGlzdCBvZiByZWdpc3RlcmVkIGF1ZGlvIGVmZmVjdHMKICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbURlZmF1bHRPdXRwdXREZXZpY2U7IC8vIG91dHB1dCBkZXZpY2Ugc2VsZWN0ZWQgYnkgZGVmYXVsdCBhdCBib290IHRpbWUKICAgICAgICAgSHdNb2R1bGVDb2xsZWN0aW9uIG1Id01vZHVsZXM7IC8vIGNvbnRhaW5zIG9ubHkgbW9kdWxlcyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQgc3VjY2Vzc2Z1bGx5CiAgICAgICAgIEh3TW9kdWxlQ29sbGVjdGlvbiBtSHdNb2R1bGVzQWxsOyAvLyBub3JtYWxseSBub3QgbmVlZGVkLCB1c2VkIGR1cmluZyBjb25zdHJ1Y3Rpb24gYW5kIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHVtcHMKKwogICAgICAgICBBdWRpb1BvbGljeUNvbmZpZyBtQ29uZmlnOwogCiAgICAgICAgIHN0ZDo6YXRvbWljPHVpbnQzMl90PiBtQXVkaW9Qb3J0R2VuZXJhdGlvbjsKQEAgLTU4NCw3ICs3MzIsNyBAQAogICAgICAgICBzcDxBdWRpb1BhdGNoPiBtQ2FsbFJ4UGF0Y2g7CiAKICAgICAgICAgSHdBdWRpb091dHB1dENvbGxlY3Rpb24gbUh3T3V0cHV0czsKLSAgICAgICAgQXVkaW9Tb3VyY2VDb2xsZWN0aW9uIG1BdWRpb1NvdXJjZXM7CisgICAgICAgIFNvdXJjZUNsaWVudENvbGxlY3Rpb24gbUF1ZGlvU291cmNlczsKIAogICAgICAgICAvLyBmb3Igc3VwcG9ydGluZyAiYmVhY29uIiBzdHJlYW1zLCBpLmUuIHN0cmVhbXMgdGhhdCBvbmx5IHBsYXkgb24gc3BlYWtlciwgYW5kIG5ldmVyCiAgICAgICAgIC8vIHdoZW4gc29tZXRoaW5nIG90aGVyIHRoYW4gU1RSRUFNX1RUUyAoYS5rLmEuICJUcmFuc21pdHRlZCBUaHJvdWdoIFNwZWFrZXIiKSBpcyBwbGF5aW5nCkBAIC02MDgsMTcgKzc1NiwyNyBAQAogICAgICAgICAvLyBBdWRpbyBQb2xpY3kgRW5naW5lIEludGVyZmFjZS4KICAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlICptRW5naW5lOwogCi0gICAgICAgIC8vIFN1cnJvdW5kIGZvcm1hdHMgdGhhdCBhcmUgZW5hYmxlZC4KLSAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBtU3Vycm91bmRGb3JtYXRzOworICAgICAgICAvLyBTdXJyb3VuZCBmb3JtYXRzIHRoYXQgYXJlIGVuYWJsZWQgbWFudWFsbHkuIFRha2VuIGludG8gYWNjb3VudCB3aGVuCisgICAgICAgIC8vICJlbmNvZGVkIHN1cnJvdW5kIiBpcyBmb3JjZWQgaW50byAibWFudWFsIiBtb2RlLgorICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IG1NYW51YWxTdXJyb3VuZEZvcm1hdHM7CiBwcml2YXRlOgogICAgICAgICAvLyBBZGQgb3IgcmVtb3ZlIEFDMyBEVFMgZW5jb2RpbmdzIGJhc2VkIG9uIHVzZXIgcHJlZmVyZW5jZXMuCi0gICAgICAgIHZvaWQgZmlsdGVyU3Vycm91bmRGb3JtYXRzKEZvcm1hdFZlY3RvciAqZm9ybWF0c1B0cik7Ci0gICAgICAgIHZvaWQgZmlsdGVyU3Vycm91bmRDaGFubmVsTWFza3MoQ2hhbm5lbHNWZWN0b3IgKmNoYW5uZWxNYXNrc1B0cik7CisgICAgICAgIHZvaWQgbW9kaWZ5U3Vycm91bmRGb3JtYXRzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBGb3JtYXRWZWN0b3IgKmZvcm1hdHNQdHIpOworICAgICAgICB2b2lkIG1vZGlmeVN1cnJvdW5kQ2hhbm5lbE1hc2tzKENoYW5uZWxzVmVjdG9yICpjaGFubmVsTWFza3NQdHIpOwogCi0gICAgICAgIHN0YXR1c190IGdldFN1cHBvcnRlZEZvcm1hdHMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIEZvcm1hdFZlY3RvciYgZm9ybWF0cyk7CisgICAgICAgIC8vIFN1cHBvcnQgZm9yIE11bHRpLVN0cmVhbSBEZWNvZGVyIChNU0QpIG1vZHVsZQorICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRNc2RBdWRpb0luRGV2aWNlKCkgY29uc3Q7CisgICAgICAgIERldmljZVZlY3RvciBnZXRNc2RBdWRpb091dERldmljZXMoKSBjb25zdDsKKyAgICAgICAgY29uc3QgQXVkaW9QYXRjaENvbGxlY3Rpb24gZ2V0TXNkUGF0Y2hlcygpIGNvbnN0OworICAgICAgICBzdGF0dXNfdCBnZXRCZXN0TXNkQXVkaW9Qcm9maWxlRm9yKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZvdXRwdXREZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBod0F2U3luYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rQ29uZmlnKSBjb25zdDsKKyAgICAgICAgUGF0Y2hCdWlsZGVyIGJ1aWxkTXNkUGF0Y2goY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm91dHB1dERldmljZSkgY29uc3Q7CisgICAgICAgIHN0YXR1c190IHNldE1zZFBhdGNoKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZvdXRwdXREZXZpY2UgPSBudWxscHRyKTsKIAogICAgICAgICAvLyBJZiBhbnksIHJlc29sdmUgYW55ICJkeW5hbWljIiBmaWVsZHMgb2YgYW4gQXVkaW8gUHJvZmlsZXMgY29sbGVjdGlvbgotICAgICAgICB2b2lkIHVwZGF0ZUF1ZGlvUHJvZmlsZXMoYXVkaW9fZGV2aWNlc190IGRldmljZSwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCisgICAgICAgIHZvaWQgdXBkYXRlQXVkaW9Qcm9maWxlcyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgQXVkaW9Qcm9maWxlVmVjdG9yICZwcm9maWxlcyk7CiAKICAgICAgICAgLy8gTm90aWZ5IHRoZSBwb2xpY3kgY2xpZW50IG9mIGFueSBjaGFuZ2Ugb2YgZGV2aWNlIHN0YXRlIHdpdGggQVVESU9fSU9fSEFORExFX05PTkUsCkBAIC02MjYsNDIgKzc4NCw1OCBAQAogICAgICAgICAvLyBJdCBjYW4gZ2l2ZSBhIGNoYW5jZSB0byBIQUwgaW1wbGVtZW50ZXIgdG8gcmV0cmlldmUgZHluYW1pYyBjYXBhYmlsaXRpZXMgYXNzb2NpYXRlZAogICAgICAgICAvLyB0byB0aGlzIGRldmljZSBmb3IgZXhhbXBsZS4KICAgICAgICAgLy8gVE9ETyBhdm9pZCBvcGVuaW5nIHN0cmVhbSB0byByZXRyaWV2ZSBjYXBhYmlsaXRpZXMgb2YgYSBwcm9maWxlLgotICAgICAgICB2b2lkIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJmRldmljZV9hZGRyZXNzKTsKKyAgICAgICAgdm9pZCBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKTsKIAogICAgICAgICAvLyB1cGRhdGVzIGRldmljZSBjYWNoaW5nIGFuZCBvdXRwdXQgZm9yIHN0cmVhbXMgdGhhdCBjYW4gaW5mbHVlbmNlIHRoZQogICAgICAgICAvLyAgICByb3V0aW5nIG9mIG5vdGlmaWNhdGlvbnMKICAgICAgICAgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICAgICAgLy8gZmluZCB0aGUgb3V0cHV0cyBvbiBhIGdpdmVuIG91dHB1dCBkZXNjcmlwdG9yIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gYWRkcmVzcy4KLSAgICAgICAgLy8gdG8gYmUgY2FsbGVkIG9uIGFuIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciB3aG9zZSBzdXBwb3J0ZWQgZGV2aWNlcyAoYXMgZGVmaW5lZAotICAgICAgICAvLyAgIGluIG1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcykgbWF0Y2hlcyB0aGUgZGV2aWNlIHdob3NlIGFkZHJlc3MgaXMgdG8gYmUgbWF0Y2hlZC4KLSAgICAgICAgLy8gc2VlIGRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoYXVkaW9fZGV2aWNlc190KSBmb3Igd2hldGhlciB0aGUgZGV2aWNlIHR5cGUgaXMgb25lCi0gICAgICAgIC8vICAgd2hlcmUgYWRkcmVzc2VzIGFyZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gb25lIGNvbm5lY3RlZCBkZXZpY2UgYW5kIGFub3RoZXIuCi0gICAgICAgIHZvaWQgZmluZElvSGFuZGxlc0J5QWRkcmVzcyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGRlc2MgLyppbiovLAotICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgLyppbiovLAotICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MgLyppbiovLAotICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMgLypvdXQqLyk7CiAgICAgICAgIHVpbnQzMl90IGN1ckF1ZGlvUG9ydEdlbmVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtQXVkaW9Qb3J0R2VuZXJhdGlvbjsgfQorICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QsIGdldCBhdWRpb19hdHRyaWJ1dGVzX3QgZnJvbSBlaXRoZXIgYSBzb3VyY2UgYXVkaW9fYXR0cmlidXRlc190CisgICAgICAgIC8vIG9yIGF1ZGlvX3N0cmVhbV90eXBlX3QsIHJlc3BlY3RpdmVseS4KKyAgICAgICAgc3RhdHVzX3QgZ2V0QXVkaW9BdHRyaWJ1dGVzKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqZHN0QXR0ciwKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKnNyY0F0dHIsCisgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzcmNTdHJlYW0pOworICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QsIGNhbGxlZCBieSBnZXRPdXRwdXRGb3JBdHRyKCkgYW5kIGNvbm5lY3RBdWRpb1NvdXJjZS4KKyAgICAgICAgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0ckludChhdWRpb19hdHRyaWJ1dGVzX3QgKnJlc3VsdEF0dHIsCisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKKyAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgIGJvb2wgKmlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlLAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gKnNlY29uZGFyeURlc2NzKTsKICAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRvIHJldHVybiB0aGUgb3V0cHV0IGhhbmRsZSBmb3IgdGhlIGdpdmVuIGRldmljZSBhbmQgZm9ybWF0Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckRldmljZSgKLSAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JEZXZpY2VzKAorICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcywKICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncyk7Ci0gICAgICAgIC8vIGludGVybmFsIG1ldGhvZCB0byByZXR1cm4gdGhlIGlucHV0IGhhbmRsZSBmb3IgdGhlIGdpdmVuIGRldmljZSBhbmQgZm9ybWF0Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0Rm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzLAorICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKKyAgICAgICAgICAgICAgICBib29sIGZvcmNlTXV0aW5nSGFwdGljID0gZmFsc2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgZ2V0SW5wdXRGb3JEZXZpY2Ugc2VsZWN0cyBhbiBpbnB1dCBoYW5kbGUgZm9yIGEgZ2l2ZW4gaW5wdXQgZGV2aWNlIGFuZAorICAgICAgICAgKiByZXF1ZXN0ZXIgY29udGV4dAorICAgICAgICAgKiBAcGFyYW0gZGV2aWNlIHRvIGJlIHVzZWQgYnkgcmVxdWVzdGVyLCBzZWxlY3RlZCBieSBwb2xpY3kgbWl4IHJ1bGVzIG9yIGVuZ2luZQorICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbiByZXF1ZXN0ZXIgc2Vzc2lvbiBpZAorICAgICAgICAgKiBAcGFyYW0gdWlkIHJlcXVlc3RlciB1aWQKKyAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgcmVxdWVzdGVyIGF1ZGlvIGF0dHJpYnV0ZXMgKGUuZy4gaW5wdXQgc291cmNlIGFuZCB0YWdzIG1hdHRlcikKKyAgICAgICAgICogQHBhcmFtIGNvbmZpZyByZXF1ZXN0ZXIgYXVkaW8gY29uZmlndXJhdGlvbiAoZS5nLiBzYW1wbGUgcmF0ZSwgZm9ybWF0LCBjaGFubmVsIG1hc2spLgorICAgICAgICAgKiBAcGFyYW0gZmxhZ3MgcmVxdWVzdGVyIGlucHV0IGZsYWdzCisgICAgICAgICAqIEBwYXJhbSBwb2xpY3lNaXggbWF5IGJlIG51bGwsIHBvbGljeSBydWxlcyB0byBiZSBmb2xsb3dlZCBieSB0aGUgcmVxdWVzdGVyCisgICAgICAgICAqIEByZXR1cm4gaW5wdXQgaW8gaGFuZGxlIGFrYSB1bmlxdWUgaW5wdXQgaWRlbnRpZmllciBzZWxlY3RlZCBmb3IgdGhpcyBkZXZpY2UuCisgICAgICAgICAqLworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRJbnB1dEZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAogICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgQXVkaW9NaXggKnBvbGljeU1peCk7CisgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Qb2xpY3lNaXg+ICZwb2xpY3lNaXgpOwogCi0gICAgICAgIC8vIGludGVybmFsIGZ1bmN0aW9uIHRvIGRlcml2ZSBhIHN0cmVhbSB0eXBlIHZhbHVlIGZyb20gYXVkaW8gYXR0cmlidXRlcwotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpOwogICAgICAgICAvLyBldmVudCBpcyBvbmUgb2YgU1RBUlRJTkdfT1VUUFVULCBTVEFSVElOR19CRUFDT04sIFNUT1BQSU5HX09VVFBVVCwgU1RPUFBJTkdfQkVBQ09OCiAgICAgICAgIC8vIHJldHVybnMgMCBpZiBubyBtdXRlL3VubXV0ZSBldmVudCBoYXBwZW5lZCwgdGhlIGxhcmdlc3QgbGF0ZW5jeSBvZiB0aGUgZGV2aWNlIHdoZXJlCiAgICAgICAgIC8vICAgdGhlIG11dGUvdW5tdXRlIGhhcHBlbmVkCkBAIC02NjksMjUgKzg0MywyOSBAQAogICAgICAgICB1aW50MzJfdCBzZXRCZWFjb25NdXRlKGJvb2wgbXV0ZSk7CiAgICAgICAgIGJvb2wgICAgIGlzVmFsaWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcGFhKTsKIAotICAgICAgICAvLyBzZWxlY3QgaW5wdXQgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8gcmVxdWVzdGVkIGF1ZGlvIHNvdXJjZSBhbmQgcmV0dXJuIGFzc29jaWF0ZWQgcG9saWN5Ci0gICAgICAgIC8vIG1peCBpZiBhbnkuIENhbGxzIGdldERldmljZUZvcklucHV0U291cmNlKCkuCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXggKipwb2xpY3lNaXggPSBOVUxMKTsKLQogICAgICAgICAvLyBDYWxsZWQgYnkgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkuCi0gICAgICAgIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KTsKICAgICAgICAgdm9pZCB1cGRhdGVNb25vKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgewogICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CiAgICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5TW9ub091dHB1dCksIChpbnQpbU1hc3Rlck1vbm8pOwogICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMob3V0cHV0LCBwYXJhbS50b1N0cmluZygpKTsKICAgICAgICAgfQotCi0gICAgICAgIGJvb2wgc291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSgpOwotICAgICAgICBib29sIG1Tb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlOwotICAgICAgICBib29sIG1IYXNDb21wdXRlZFNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmU7CisgICAgICAgIHN0YXR1c190IGluc3RhbGxQYXRjaChjb25zdCBjaGFyICpjYWxsZXIsCisgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlICppb0Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisgICAgICAgIHN0YXR1c190IGluc3RhbGxQYXRjaChjb25zdCBjaGFyICpjYWxsZXIsCisgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCwKKyAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgc3A8QXVkaW9QYXRjaD4gKnBhdGNoRGVzY1B0cik7CiB9OwogCiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCmluZGV4IGIwNjRmOGMuLjU3NDgzMzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKQEAgLTE1NSwxNyArMTU1LDYgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAotICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5U2VydmljZS0+c3RhcnRUb25lKHRvbmUsIHN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnN0b3BUb25lKCkKLXsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5U2VydmljZS0+c3RvcFRvbmUoKTsKLX0KLQogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlfbXMpCiB7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeVNlcnZpY2UtPnNldFZvaWNlVm9sdW1lKHZvbHVtZSwgZGVsYXlfbXMpOwpAQCAtMjIwLDEyICsyMDksMjMgQEAKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCi0gICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKQogewogICAgIG1BdWRpb1BvbGljeVNlcnZpY2UtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgY2xpZW50SW5mbywKLSAgICAgICAgICAgIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICBjbGllbnRDb25maWcsIGNsaWVudEVmZmVjdHMsIGRldmljZUNvbmZpZywgZWZmZWN0cywgcGF0Y2hIYW5kbGUsIHNvdXJjZSk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgbUF1ZGlvUG9saWN5U2VydmljZS0+b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZChncm91cCwgZmxhZ3MpOwogfQogCiBhdWRpb191bmlxdWVfaWRfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpuZXdBdWRpb1VuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCB1c2UpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKaW5kZXggNGExY2FiNC4uNDk0NzcxNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzQ29uZmlnLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvYXVkaW9fZWZmZWN0c19jb25mLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CkBAIC0zMSw3ICszMiw2IEBACiAjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5RWZmZWN0cy5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMTcsNiArMzE3LDIwMSBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6YWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQoreworICAgIGlmICh1dWlkID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KCk6IE51bGwgdXVpZCBvciB0eXBlIHV1aWQgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEhPVFdPUkQsIEZNX1RVTkVSIGFuZCBFQ0hPX1JFRkVSRU5DRSBhcmUgc3BlY2lhbCBjYXNlIHNvdXJjZXMgPiBNQVguCisgICAgaWYgKHNvdXJjZSA8IEFVRElPX1NPVVJDRV9ERUZBVUxUIHx8CisgICAgICAgICAgICAoc291cmNlID4gQVVESU9fU09VUkNFX01BWCAmJgorICAgICAgICAgICAgIHNvdXJjZSAhPSBBVURJT19TT1VSQ0VfSE9UV09SRCAmJgorICAgICAgICAgICAgIHNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRk1fVFVORVIgJiYKKyAgICAgICAgICAgICBzb3VyY2UgIT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFKSkgeworICAgICAgICBBTE9HRSgiYWRkU291cmNlRGVmYXVsdEVmZmVjdCgpOiBVbnN1cHBvcnRlZCBzb3VyY2UgdHlwZSAlZCIsIHNvdXJjZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdGhhdCB8dXVpZHwgb3IgfHR5cGV8IGNvcnJlc3BvbmRzIHRvIGFuIGVmZmVjdCBvbiB0aGUgc3lzdGVtLgorICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzY3JpcHRvciA9IHt9OworICAgIHN0YXR1c190IHJlcyA9IEF1ZGlvRWZmZWN0OjpnZXRFZmZlY3REZXNjcmlwdG9yKAorICAgICAgICAgICAgdXVpZCwgdHlwZSwgRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQywgJmRlc2NyaXB0b3IpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImFkZFNvdXJjZURlZmF1bHRFZmZlY3QoKTogRmFpbGVkIHRvIGZpbmQgZWZmZWN0IGRlc2NyaXB0b3IgbWF0Y2hpbmcgdXVpZC90eXBlLiIpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIE9ubHkgcHJlLXByb2Nlc3NpbmcgZWZmZWN0cyBjYW4gYmUgYWRkZWQgZHluYW1pY2FsbHkgYXMgc291cmNlIGRlZmF1bHRzLgorICAgIGlmICgoZGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgIT0gRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQykgeworICAgICAgICBBTE9HRSgiYWRkU291cmNlRGVmYXVsdEVmZmVjdCgpOiBEZXNpcmVkIGVmZmVjdCBjYW5ub3QgYmUgYXR0YWNoZWQgIgorICAgICAgICAgICAgICAiYXMgYSBzb3VyY2UgZGVmYXVsdCBlZmZlY3QuIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIC8vIEZpbmQgdGhlIEVmZmVjdERlc2NWZWN0b3IgZm9yIHRoZSBnaXZlbiBzb3VyY2UgdHlwZSwgb3IgY3JlYXRlIGEgbmV3IG9uZSBpZiBuZWNlc3NhcnkuCisgICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dFNvdXJjZXMuaW5kZXhPZktleShzb3VyY2UpOworICAgIEVmZmVjdERlc2NWZWN0b3IgKmRlc2MgPSBOVUxMOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgLy8gTm8gZWZmZWN0cyBmb3IgdGhpcyBzb3VyY2UgdHlwZSB5ZXQuCisgICAgICAgIGRlc2MgPSBuZXcgRWZmZWN0RGVzY1ZlY3RvcigpOworICAgICAgICBtSW5wdXRTb3VyY2VzLmFkZChzb3VyY2UsIGRlc2MpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlc2MgPSBtSW5wdXRTb3VyY2VzLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhIG5ldyBlZmZlY3QgYW5kIGFkZCBpdCB0byB0aGUgdmVjdG9yLgorICAgIHJlcyA9IEF1ZGlvRWZmZWN0OjpuZXdFZmZlY3RVbmlxdWVJZChpZCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiYWRkU291cmNlRGVmYXVsdEVmZmVjdCgpOiBmYWlsZWQgdG8gZ2V0IG5ldyB1bmlxdWUgaWQuIik7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IG5ldyBFZmZlY3REZXNjKAorICAgICAgICAgICAgZGVzY3JpcHRvci5uYW1lLCAqdHlwZSwgb3BQYWNrYWdlTmFtZSwgKnV1aWQsIHByaW9yaXR5LCAqaWQpOworICAgIGRlc2MtPm1FZmZlY3RzLmFkZChlZmZlY3QpOworICAgIC8vIFRPRE8oYi83MTgxMzY5Nyk6IFN1cHBvcnQgc2V0dGluZyBwYXJhbXMgYXMgd2VsbC4KKworICAgIC8vIFRPRE8oYi83MTgxNDMwMCk6IFJldHJvYWN0aXZlbHkgYXR0YWNoIHRvIGFueSBleGlzdGluZyBzb3VyY2VzIG9mIHRoZSBnaXZlbiB0eXBlLgorICAgIC8vIFRoaXMgcmVxdWlyZXMgdHJhY2tpbmcgdGhlIHNvdXJjZSB0eXBlIG9mIGVhY2ggc2Vzc2lvbiBpZCBpbiBhZGRpdGlvbiB0byB3aGF0IGlzCisgICAgLy8gYWxyZWFkeSBiZWluZyB0cmFja2VkLgorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCit7CisgICAgaWYgKHV1aWQgPT0gTlVMTCB8fCB0eXBlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImFkZFN0cmVhbURlZmF1bHRFZmZlY3QoKTogTnVsbCB1dWlkIG9yIHR5cGUgdXVpZCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQXVkaW9TeXN0ZW06OmF0dHJpYnV0ZXNUb1N0cmVhbVR5cGUoYXR0cmlidXRlc19pbml0aWFsaXplcih1c2FnZSkpOworCisgICAgaWYgKHN0cmVhbSA8IEFVRElPX1NUUkVBTV9NSU4gfHwgc3RyZWFtID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7CisgICAgICAgIEFMT0dFKCJhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCk6IFVuc3VwcG9ydGVkIHN0cmVhbSB0eXBlICVkIiwgc3RyZWFtKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0aGF0IHx1dWlkfCBvciB8dHlwZXwgY29ycmVzcG9uZHMgdG8gYW4gZWZmZWN0IG9uIHRoZSBzeXN0ZW0uCisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjcmlwdG9yID0ge307CisgICAgc3RhdHVzX3QgcmVzID0gQXVkaW9FZmZlY3Q6OmdldEVmZmVjdERlc2NyaXB0b3IoCisgICAgICAgICAgICB1dWlkLCB0eXBlLCBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCwgJmRlc2NyaXB0b3IpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImFkZFN0cmVhbURlZmF1bHRFZmZlY3QoKTogRmFpbGVkIHRvIGZpbmQgZWZmZWN0IGRlc2NyaXB0b3IgbWF0Y2hpbmcgdXVpZC90eXBlLiIpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIE9ubHkgaW5zZXJ0IGVmZmVjdHMgY2FuIGJlIGFkZGVkIGR5bmFtaWNhbGx5IGFzIHN0cmVhbSBkZWZhdWx0cy4KKyAgICBpZiAoKGRlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spICE9IEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUKSB7CisgICAgICAgIEFMT0dFKCJhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCk6IERlc2lyZWQgZWZmZWN0IGNhbm5vdCBiZSBhdHRhY2hlZCAiCisgICAgICAgICAgICAgICJhcyBhIHN0cmVhbSBkZWZhdWx0IGVmZmVjdC4iKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgLy8gRmluZCB0aGUgRWZmZWN0RGVzY1ZlY3RvciBmb3IgdGhlIGdpdmVuIHN0cmVhbSB0eXBlLCBvciBjcmVhdGUgYSBuZXcgb25lIGlmIG5lY2Vzc2FyeS4KKyAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW0pOworICAgIEVmZmVjdERlc2NWZWN0b3IgKmRlc2MgPSBOVUxMOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgLy8gTm8gZWZmZWN0cyBmb3IgdGhpcyBzdHJlYW0gdHlwZSB5ZXQuCisgICAgICAgIGRlc2MgPSBuZXcgRWZmZWN0RGVzY1ZlY3RvcigpOworICAgICAgICBtT3V0cHV0U3RyZWFtcy5hZGQoc3RyZWFtLCBkZXNjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXNjID0gbU91dHB1dFN0cmVhbXMudmFsdWVBdChpbmRleCk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgbmV3IGVmZmVjdCBhbmQgYWRkIGl0IHRvIHRoZSB2ZWN0b3IuCisgICAgcmVzID0gQXVkaW9FZmZlY3Q6Om5ld0VmZmVjdFVuaXF1ZUlkKGlkKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCk6IGZhaWxlZCB0byBnZXQgbmV3IHVuaXF1ZSBpZC4iKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gbmV3IEVmZmVjdERlc2MoCisgICAgICAgICAgICBkZXNjcmlwdG9yLm5hbWUsICp0eXBlLCBvcFBhY2thZ2VOYW1lLCAqdXVpZCwgcHJpb3JpdHksICppZCk7CisgICAgZGVzYy0+bUVmZmVjdHMuYWRkKGVmZmVjdCk7CisgICAgLy8gVE9ETyhiLzcxODEzNjk3KTogU3VwcG9ydCBzZXR0aW5nIHBhcmFtcyBhcyB3ZWxsLgorCisgICAgLy8gVE9ETyhiLzcxODE0MzAwKTogUmV0cm9hY3RpdmVseSBhdHRhY2ggdG8gYW55IGV4aXN0aW5nIHN0cmVhbXMgb2YgdGhlIGdpdmVuIHR5cGUuCisgICAgLy8gVGhpcyByZXF1aXJlcyB0cmFja2luZyB0aGUgc3RyZWFtIHR5cGUgb2YgZWFjaCBzZXNzaW9uIGlkIGluIGFkZGl0aW9uIHRvIHdoYXQgaXMKKyAgICAvLyBhbHJlYWR5IGJlaW5nIHRyYWNrZWQuCisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6cmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK3sKKyAgICBpZiAoaWQgPT0gQVVESU9fVU5JUVVFX0lEX0FMTE9DQVRFKSB7CisgICAgICAgIC8vIEFMTE9DQVRFIGlzIG5vdCBhIHVuaXF1ZSBpZGVudGlmaWVyLCBidXQgcmF0aGVyIGEgcmVzZXJ2ZWQgdmFsdWUgaW5kaWNhdGluZworICAgICAgICAvLyBhIHJlYWwgaWQgaGFzIG5vdCBiZWVuIGFzc2lnbmVkLiBGb3IgZGVmYXVsdCBlZmZlY3RzLCB0aGlzIHZhbHVlIGlzIG9ubHkgdXNlZAorICAgICAgICAvLyBieSBzeXN0ZW0tb3duZWQgZGVmYXVsdHMgZnJvbSB0aGUgbG9hZGVkIGNvbmZpZywgd2hpY2ggY2Fubm90IGJlIHJlbW92ZWQuCisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIC8vIENoZWNrIGVhY2ggc291cmNlIHR5cGUuCisgICAgc2l6ZV90IG51bVNvdXJjZXMgPSBtSW5wdXRTb3VyY2VzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNvdXJjZXM7ICsraSkgeworICAgICAgICAvLyBDaGVjayBlYWNoIGVmZmVjdCBmb3IgZWFjaCBzb3VyY2UuCisgICAgICAgIEVmZmVjdERlc2NWZWN0b3IqIGRlc2NWZWN0b3IgPSBtSW5wdXRTb3VyY2VzW2ldOworICAgICAgICBmb3IgKGF1dG8gZGVzYyA9IGRlc2NWZWN0b3ItPm1FZmZlY3RzLmJlZ2luKCk7IGRlc2MgIT0gZGVzY1ZlY3Rvci0+bUVmZmVjdHMuZW5kKCk7ICsrZGVzYykgeworICAgICAgICAgICAgaWYgKCgqZGVzYyktPm1JZCA9PSBpZCkgeworICAgICAgICAgICAgICAgIC8vIEZvdW5kIGl0IQorICAgICAgICAgICAgICAgIC8vIFRPRE8oYi83MTgxNDMwMCk6IFJlbW92ZSBmcm9tIGFueSBzb3VyY2VzIHRoZSBlZmZlY3Qgd2FzIGF0dGFjaGVkIHRvLgorICAgICAgICAgICAgICAgIGRlc2NWZWN0b3ItPm1FZmZlY3RzLmVyYXNlKGRlc2MpOworICAgICAgICAgICAgICAgIC8vIEhhbmRsZXMgYXJlIHVuaXF1ZTsgdGhlcmUgY2FuIG9ubHkgYmUgb25lIG1hdGNoLCBzbyByZXR1cm4gZWFybHkuCisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRWZmZWN0IHdhc24ndCBmb3VuZCwgc28gaXQncyBiZWVuIHRyaXZpYWxseSByZW1vdmVkIHN1Y2Nlc3NmdWxseS4KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6cmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK3sKKyAgICBpZiAoaWQgPT0gQVVESU9fVU5JUVVFX0lEX0FMTE9DQVRFKSB7CisgICAgICAgIC8vIEFMTE9DQVRFIGlzIG5vdCBhIHVuaXF1ZSBpZGVudGlmaWVyLCBidXQgcmF0aGVyIGEgcmVzZXJ2ZWQgdmFsdWUgaW5kaWNhdGluZworICAgICAgICAvLyBhIHJlYWwgaWQgaGFzIG5vdCBiZWVuIGFzc2lnbmVkLiBGb3IgZGVmYXVsdCBlZmZlY3RzLCB0aGlzIHZhbHVlIGlzIG9ubHkgdXNlZAorICAgICAgICAvLyBieSBzeXN0ZW0tb3duZWQgZGVmYXVsdHMgZnJvbSB0aGUgbG9hZGVkIGNvbmZpZywgd2hpY2ggY2Fubm90IGJlIHJlbW92ZWQuCisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIC8vIENoZWNrIGVhY2ggc3RyZWFtIHR5cGUuCisgICAgc2l6ZV90IG51bVN0cmVhbXMgPSBtT3V0cHV0U3RyZWFtcy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdHJlYW1zOyArK2kpIHsKKyAgICAgICAgLy8gQ2hlY2sgZWFjaCBlZmZlY3QgZm9yIGVhY2ggc3RyZWFtLgorICAgICAgICBFZmZlY3REZXNjVmVjdG9yKiBkZXNjVmVjdG9yID0gbU91dHB1dFN0cmVhbXNbaV07CisgICAgICAgIGZvciAoYXV0byBkZXNjID0gZGVzY1ZlY3Rvci0+bUVmZmVjdHMuYmVnaW4oKTsgZGVzYyAhPSBkZXNjVmVjdG9yLT5tRWZmZWN0cy5lbmQoKTsgKytkZXNjKSB7CisgICAgICAgICAgICBpZiAoKCpkZXNjKS0+bUlkID09IGlkKSB7CisgICAgICAgICAgICAgICAgLy8gRm91bmQgaXQhCisgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzcxODE0MzAwKTogUmVtb3ZlIGZyb20gYW55IHN0cmVhbXMgdGhlIGVmZmVjdCB3YXMgYXR0YWNoZWQgdG8uCisgICAgICAgICAgICAgICAgZGVzY1ZlY3Rvci0+bUVmZmVjdHMuZXJhc2UoZGVzYyk7CisgICAgICAgICAgICAgICAgLy8gSGFuZGxlcyBhcmUgdW5pcXVlOyB0aGVyZSBjYW4gb25seSBiZSBvbmUgbWF0Y2gsIHNvIHJldHVybiBlYXJseS4KKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFZmZlY3Qgd2Fzbid0IGZvdW5kLCBzbyBpdCdzIGJlZW4gdHJpdmlhbGx5IHJlbW92ZWQgc3VjY2Vzc2Z1bGx5LgorICAgIHJldHVybiBOT19FUlJPUjsKK30KIAogdm9pZCBBdWRpb1BvbGljeUVmZmVjdHM6OkVmZmVjdFZlY3Rvcjo6c2V0UHJvY2Vzc29yRW5hYmxlZChib29sIGVuYWJsZWQpCiB7CkBAIC0zMzgsNyArNTMzLDggQEAKICAgICBDQU1DT1JERVJfU1JDX1RBRywKICAgICBWT0lDRV9SRUNfU1JDX1RBRywKICAgICBWT0lDRV9DT01NX1NSQ19UQUcsCi0gICAgVU5QUk9DRVNTRURfU1JDX1RBRworICAgIFVOUFJPQ0VTU0VEX1NSQ19UQUcsCisgICAgVk9JQ0VfUEVSRk9STUFOQ0VfU1JDX1RBRwogfTsKIAogLy8gcmV0dXJucyB0aGUgYXVkaW9fc291cmNlX3QgZW51bSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBzb3VyY2UgbmFtZSBvcgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKaW5kZXggNjIzMTgwZS4uNmFkMDFmNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCkBAIC02NCw3ICs2NCw2IEBACiAgICAgc3RhdHVzX3QgcmVsZWFzZUlucHV0RWZmZWN0cyhhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24pOwogCi0KICAgICAvLyBSZXR1cm4gYSBsaXN0IG9mIGVmZmVjdCBkZXNjcmlwdG9ycyBmb3IgZGVmYXVsdCBvdXRwdXQgZWZmZWN0cwogICAgIC8vIGFzc29jaWF0ZWQgd2l0aCBhdWRpb1Nlc3Npb24KICAgICBzdGF0dXNfdCBxdWVyeURlZmF1bHRPdXRwdXRTZXNzaW9uRWZmZWN0cyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLApAQCAtODIsMTggKzgxLDYwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uKTsKIAorICAgIC8vIEFkZCB0aGUgZWZmZWN0IHRvIHRoZSBsaXN0IG9mIGRlZmF1bHQgZWZmZWN0cyBmb3Igc291cmNlcyBvZiB0eXBlIHxzb3VyY2V8LgorICAgIHN0YXR1c190IGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOworCisgICAgLy8gQWRkIHRoZSBlZmZlY3QgdG8gdGhlIGxpc3Qgb2YgZGVmYXVsdCBlZmZlY3RzIGZvciBzdHJlYW1zIG9mIGEgZ2l2ZW4gdXNhZ2UuCisgICAgc3RhdHVzX3QgYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOworCisgICAgLy8gUmVtb3ZlIHRoZSBkZWZhdWx0IHNvdXJjZSBlZmZlY3QgZnJvbSB3aGVyZXZlciBpdCdzIGF0dGFjaGVkLgorICAgIHN0YXR1c190IHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworCisgICAgLy8gUmVtb3ZlIHRoZSBkZWZhdWx0IHN0cmVhbSBlZmZlY3QgZnJvbSB3aGVyZXZlciBpdCdzIGF0dGFjaGVkLgorICAgIHN0YXR1c190IHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworCiBwcml2YXRlOgogCiAgICAgLy8gY2xhc3MgdG8gc3RvcmUgdGhlIGRlc2NyaXB0aW9uIG9mIGFuIGVmZmVjdHMgYW5kIGl0cyBwYXJhbWV0ZXJzCiAgICAgLy8gYXMgZGVmaW5lZCBpbiBhdWRpb19lZmZlY3RzLmNvbmYKICAgICBjbGFzcyBFZmZlY3REZXNjIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIEVmZmVjdERlc2MoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgZWZmZWN0X3V1aWRfdCYgdXVpZCkgOgorICAgICAgICBFZmZlY3REZXNjKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCYgdHlwZVV1aWQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCYgdXVpZCwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUoc3RyZHVwKG5hbWUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKHV1aWQpIHsgfQorICAgICAgICAgICAgICAgICAgICAgICAgbVR5cGVVdWlkKHR5cGVVdWlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVV1aWQodXVpZCksCisgICAgICAgICAgICAgICAgICAgICAgICBtUHJpb3JpdHkocHJpb3JpdHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbUlkKGlkKSB7IH0KKyAgICAgICAgRWZmZWN0RGVzYyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBlZmZlY3RfdXVpZF90JiB1dWlkKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3REZXNjKG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpFRkZFQ1RfVVVJRF9OVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VOSVFVRV9JRF9BTExPQ0FURSkgeyB9CiAgICAgICAgIEVmZmVjdERlc2MoY29uc3QgRWZmZWN0RGVzYyYgb3JpZykgOgogICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUoc3RyZHVwKG9yaWcubU5hbWUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKG9yaWcubVV1aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UeXBlVXVpZChvcmlnLm1UeXBlVXVpZCksCisgICAgICAgICAgICAgICAgICAgICAgICBtT3BQYWNrYWdlTmFtZShvcmlnLm1PcFBhY2thZ2VOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKG9yaWcubVV1aWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVByaW9yaXR5KG9yaWcubVByaW9yaXR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JZChvcmlnLm1JZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZXAgY29weSBtUGFyYW1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBvcmlnLm1QYXJhbXMuc2l6ZSgpOyBrKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKm9yaWdQYXJhbSA9IG9yaWcubVBhcmFtc1trXTsKQEAgLTExNiw3ICsxNTcsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBjaGFyICptTmFtZTsKKyAgICAgICAgZWZmZWN0X3V1aWRfdCBtVHlwZVV1aWQ7CisgICAgICAgIFN0cmluZzE2IG1PcFBhY2thZ2VOYW1lOwogICAgICAgICBlZmZlY3RfdXVpZF90IG1VdWlkOworICAgICAgICBpbnQzMl90IG1Qcmlvcml0eTsKKyAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgbUlkOwogICAgICAgICBWZWN0b3IgPGVmZmVjdF9wYXJhbV90ICo+IG1QYXJhbXM7CiAgICAgfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCmluZGV4IDczMzdmMDQuLmE2NzI1MjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKQEAgLTE3LDEyICsxNywxMSBAQAogI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeUludGVmYWNlSW1wbCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgotCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMyLDcgKzMxLDggQEAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtNDksNyArNDksNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0KTsKIH0KIAogYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKApAQCAtNjYsNyArNjYsOCBAQAogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC03OSw3ICs4MCw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5oYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0KTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKQEAgLTE2NSw3ICsxNjYsNyBAQAogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXQoc3RyZWFtKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKm9yaWdpbmFsQXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKQEAgLTE3NCw3ICsxNzUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cykKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtMTgzLDE2ICsxODUsMjEgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAoIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkgfHwgdWlkID09ICh1aWRfdCktMSkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkgfHwgdWlkID09ICh1aWRfdCktMSkgewogICAgICAgICBBTE9HV19JRih1aWQgIT0gKHVpZF90KS0xICYmIHVpZCAhPSBjYWxsaW5nVWlkLAogICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwgX19GVU5DVElPTl9fLCBjYWxsaW5nVWlkLCB1aWQpOwogICAgICAgICB1aWQgPSBjYWxsaW5nVWlkOwogICAgIH0KKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9ICpvcmlnaW5hbEF0dHI7CisgICAgaWYgKCFtUGFja2FnZU1hbmFnZXIuYWxsb3dQbGF5YmFja0NhcHR1cmUodWlkKSkgeworICAgICAgICBhdHRyLmZsYWdzIHw9IEFVRElPX0ZMQUdfTk9fQ0FQVFVSRTsKKyAgICB9CiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3Qgb3JpZ2luYWxGbGFncyA9IGZsYWdzOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCBvdXRwdXQsIHNlc3Npb24sIHN0cmVhbSwgdWlkLAorICAgIHN0YXR1c190IHJlc3VsdCA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dEZvckF0dHIoJmF0dHIsIG91dHB1dCwgc2Vzc2lvbiwgc3RyZWFtLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlPdXRwdXRzKTsKIAogICAgIC8vIEZJWE1FOiBJbnRyb2R1Y2UgYSB3YXkgdG8gY2hlY2sgZm9yIHRoZSB0aGUgdGVsZXBob255IGRldmljZSBiZWZvcmUgb3BlbmluZyB0aGUgb3V0cHV0CiAgICAgaWYgKChyZXN1bHQgPT0gTk9fRVJST1IpICYmCkBAIC0yMDAsMTAxICsyMDcsMTI1IEBACiAgICAgICAgICFtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChwaWQsIHVpZCkpIHsKICAgICAgICAgLy8gSWYgdGhlIGFwcCB0cmllcyB0byBwbGF5IG11c2ljIHRocm91Z2ggdGhlIHRlbGVwaG9ueSBkZXZpY2UgYW5kIGRvZXNuJ3QgaGF2ZSBwZXJtaXNzaW9uCiAgICAgICAgIC8vIHRoZSBmYWxsYmFjayB0byB0aGUgZGVmYXVsdCBvdXRwdXQgZGV2aWNlLgotICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KCpvdXRwdXQsICpzdHJlYW0sIHNlc3Npb24pOworICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KCpwb3J0SWQpOwogICAgICAgICBmbGFncyA9IG9yaWdpbmFsRmxhZ3M7CiAgICAgICAgICpzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICAgICAgKnBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7Ci0gICAgICAgIHJlc3VsdCA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dEZvckF0dHIoYXR0ciwgb3V0cHV0LCBzZXNzaW9uLCBzdHJlYW0sIHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQpOworICAgICAgICBzZWNvbmRhcnlPdXRwdXRzLT5jbGVhcigpOworICAgICAgICByZXN1bHQgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKCZhdHRyLCBvdXRwdXQsIHNlc3Npb24sIHN0cmVhbSwgdWlkLCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5T3V0cHV0cyk7CisgICAgfQorCisgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgeworICAgICAgICBzcCA8QXVkaW9QbGF5YmFja0NsaWVudD4gY2xpZW50ID0KKyAgICAgICAgICAgIG5ldyBBdWRpb1BsYXliYWNrQ2xpZW50KGF0dHIsICpvdXRwdXQsIHVpZCwgcGlkLCBzZXNzaW9uLCAqc2VsZWN0ZWREZXZpY2VJZCwgKnN0cmVhbSk7CisgICAgICAgIG1BdWRpb1BsYXliYWNrQ2xpZW50cy5hZGQoKnBvcnRJZCwgY2xpZW50KTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBBTE9HVigic3RhcnRPdXRwdXQoKSIpOworICAgIHNwPEF1ZGlvUGxheWJhY2tDbGllbnQ+IGNsaWVudDsKICAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BsYXliYWNrQ2xpZW50cy5pbmRleE9mS2V5KHBvcnRJZCk7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBBdWRpb1RyYWNrIGNsaWVudCBub3QgZm91bmQgZm9yIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBtQXVkaW9QbGF5YmFja0NsaWVudHMudmFsdWVBdChpbmRleCk7CiAgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgfQogICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCkgewogICAgICAgICAvLyBjcmVhdGUgYXVkaW8gcHJvY2Vzc29ycyBhY2NvcmRpbmcgdG8gc3RyZWFtCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkT3V0cHV0U2Vzc2lvbkVmZmVjdHMob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPmFkZE91dHB1dFNlc3Npb25FZmZlY3RzKAorICAgICAgICAgICAgY2xpZW50LT5pbywgY2xpZW50LT5zdHJlYW0sIGNsaWVudC0+c2Vzc2lvbik7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7Ci0gICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGFkZCBlZmZlY3RzIG9uIHNlc3Npb24gJWQiLCBzZXNzaW9uKTsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWRkIGVmZmVjdHMgb24gc2Vzc2lvbiAlZCIsIGNsaWVudC0+c2Vzc2lvbik7CiAgICAgICAgIH0KICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydE91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRPdXRwdXQocG9ydElkKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGNsaWVudC0+YWN0aXZlID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIEFMT0dWKCJzdG9wT3V0cHV0KCkiKTsKLSAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+c3RvcE91dHB1dENvbW1hbmQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5zdG9wT3V0cHV0Q29tbWFuZChwb3J0SWQpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9TdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9TdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIEFMT0dWKCJkb1N0b3BPdXRwdXQgZnJvbSB0aWQgJWQiLCBnZXR0aWQoKSk7CisgICAgQUxPR1YoImRvU3RvcE91dHB1dCIpOworICAgIHNwPEF1ZGlvUGxheWJhY2tDbGllbnQ+IGNsaWVudDsKICAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgICAgICBjb25zdCBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGxheWJhY2tDbGllbnRzLmluZGV4T2ZLZXkocG9ydElkKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzIEF1ZGlvVHJhY2sgY2xpZW50IG5vdCBmb3VuZCBmb3IgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IG1BdWRpb1BsYXliYWNrQ2xpZW50cy52YWx1ZUF0KGluZGV4KTsKICAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKICAgICB9CiAgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CiAgICAgICAgIC8vIHJlbGVhc2UgYXVkaW8gcHJvY2Vzc29ycyBmcm9tIHRoZSBzdHJlYW0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZWxlYXNlT3V0cHV0U2Vzc2lvbkVmZmVjdHMob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VPdXRwdXRTZXNzaW9uRWZmZWN0cygKKyAgICAgICAgICAgIGNsaWVudC0+aW8sIGNsaWVudC0+c3RyZWFtLCBjbGllbnQtPnNlc3Npb24pOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgewotICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGVmZmVjdHMgb24gc2Vzc2lvbiAlZCIsIHNlc3Npb24pOworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGVmZmVjdHMgb24gc2Vzc2lvbiAlZCIsIGNsaWVudC0+c2Vzc2lvbik7CiAgICAgICAgIH0KICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wT3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wT3V0cHV0KHBvcnRJZCk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBjbGllbnQtPmFjdGl2ZSA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0KCkiKTsKLSAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVsZWFzZU91dHB1dENvbW1hbmQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5yZWxlYXNlT3V0cHV0Q29tbWFuZChwb3J0SWQpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9SZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvUmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBBTE9HVigiZG9SZWxlYXNlT3V0cHV0IGZyb20gdGlkICVkIiwgZ2V0dGlkKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BsYXliYWNrQ2xpZW50cy5pbmRleE9mS2V5KHBvcnRJZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXMgQXVkaW9UcmFjayBjbGllbnQgbm90IGZvdW5kIGZvciBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8QXVkaW9QbGF5YmFja0NsaWVudD4gY2xpZW50ID0gbUF1ZGlvUGxheWJhY2tDbGllbnRzLnZhbHVlQXQoaW5kZXgpOworICAgIG1BdWRpb1JlY29yZENsaWVudHMucmVtb3ZlSXRlbShwb3J0SWQpOworCiAgICAgLy8gY2FsbGVkIGZyb20gaW50ZXJuYWwgdGhyZWFkOiBubyBuZWVkIHRvIGNsZWFyIGNhbGxlciBpZGVudGl0eQotICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VPdXRwdXQocG9ydElkKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLApAQCAtMzEzLDE0ICszNDQsMTcgQEAKICAgICB9CiAKICAgICAvLyBhbHJlYWR5IGNoZWNrZWQgYnkgY2xpZW50LCBidXQgZG91YmxlLWNoZWNrIGluIGNhc2UgdGhlIGNsaWVudCB3cmFwcGVyIGlzIGJ5cGFzc2VkCi0gICAgaWYgKGF0dHItPnNvdXJjZSA8IEFVRElPX1NPVVJDRV9ERUZBVUxUICYmIGF0dHItPnNvdXJjZSA+PSBBVURJT19TT1VSQ0VfQ05UICYmCi0gICAgICAgICAgICBhdHRyLT5zb3VyY2UgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYgYXR0ci0+c291cmNlICE9IEFVRElPX1NPVVJDRV9GTV9UVU5FUikgeworICAgIGlmICgoYXR0ci0+c291cmNlIDwgQVVESU9fU09VUkNFX0RFRkFVTFQpCisgICAgICAgICAgICB8fCAoYXR0ci0+c291cmNlID49IEFVRElPX1NPVVJDRV9DTlQKKyAgICAgICAgICAgICAgICAmJiBhdHRyLT5zb3VyY2UgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQKKyAgICAgICAgICAgICAgICAmJiBhdHRyLT5zb3VyY2UgIT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSCisgICAgICAgICAgICAgICAgJiYgYXR0ci0+c291cmNlICE9IEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRSkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBib29sIHVwZGF0ZVBpZCA9IChwaWQgPT0gLTEpOwogICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpKSB7CisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChjYWxsaW5nVWlkKSkgewogICAgICAgICBBTE9HV19JRih1aWQgIT0gKHVpZF90KS0xICYmIHVpZCAhPSBjYWxsaW5nVWlkLAogICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwgX19GVU5DVElPTl9fLCBjYWxsaW5nVWlkLCB1aWQpOwogICAgICAgICB1aWQgPSBjYWxsaW5nVWlkOwpAQCAtMzQ0LDcgKzM3OCw4IEBACiAKICAgICBpZiAoKGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LIHx8CiAgICAgICAgIGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTksgfHwKLSAgICAgICAgYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMKSAmJgorICAgICAgICBhdHRyLT5zb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX0NBTEwgfHwKKyAgICAgICAgYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRSkgJiYKICAgICAgICAgIWNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQocGlkLCB1aWQpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CkBAIC0zNzIsNiArNDA3LDkgQEAKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgLy8gZW5mb3JjZSBwZXJtaXNzaW9uIChpZiBhbnkpIHJlcXVpcmVkIGZvciBlYWNoIHR5cGUgb2YgaW5wdXQKICAgICAgICAgICAgIHN3aXRjaCAoaW5wdXRUeXBlKSB7CisgICAgICAgICAgICBjYXNlIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfTUlYX1BVQkxJQ19DQVBUVVJFX1BMQVlCQUNLOgorICAgICAgICAgICAgICAgIC8vIHRoaXMgdXNlIGNhc2UgaGFzIGJlZW4gdmFsaWRhdGVkIGluIGF1ZGlvIHNlcnZpY2Ugd2l0aCBhIE1lZGlhUHJvamVjdGlvbiB0b2tlbiwKKyAgICAgICAgICAgICAgICAvLyBhbmQgZG9lc24ndCByZWx5IG9uIHJlZ3VsYXIgcGVybWlzc2lvbnMKICAgICAgICAgICAgIGNhc2UgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9MRUdBQ1k6CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfVEVMRVBIT05ZX1JYOgpAQCAtMzk4LDE3ICs0MzYsMTMgQEAKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBQRVJNSVNTSU9OX0RFTklFRCkgewogICAgICAgICAgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZUlucHV0KCppbnB1dCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZUlucHV0KCpwb3J0SWQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQogCi0gICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjbGllbnQgPQotICAgICAgICAgICAgICAgIG5ldyBBdWRpb1JlY29yZENsaWVudCgqYXR0ciwgKmlucHV0LCB1aWQsIHBpZCwgb3BQYWNrYWdlTmFtZSwgc2Vzc2lvbik7Ci0gICAgICAgIGNsaWVudC0+YWN0aXZlID0gZmFsc2U7Ci0gICAgICAgIGNsaWVudC0+aXNDb25jdXJyZW50ID0gZmFsc2U7Ci0gICAgICAgIGNsaWVudC0+aXNWaXJ0dWFsRGV2aWNlID0gZmFsc2U7IC8vVE9ETyA6IHVwZGF0ZSBmcm9tIEFQTS0+Z2V0SW5wdXRGb3JBdHRyKCkKLSAgICAgICAgY2xpZW50LT5kZXZpY2VJZCA9ICpzZWxlY3RlZERldmljZUlkOworICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gY2xpZW50ID0gbmV3IEF1ZGlvUmVjb3JkQ2xpZW50KCphdHRyLCAqaW5wdXQsIHVpZCwgcGlkLCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzZWxlY3RlZERldmljZUlkLCBvcFBhY2thZ2VOYW1lKTsKICAgICAgICAgbUF1ZGlvUmVjb3JkQ2xpZW50cy5hZGQoKnBvcnRJZCwgY2xpZW50KTsKICAgICB9CiAKQEAgLTQyMiw0OCArNDU2LDE3IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi0vLyB0aGlzIGlzIHJlcGxpY2F0ZWQgZnJvbSBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcAotLy8gWFhYIC0tIGZpZ3VyZSBvdXQgaG93IHRvIHB1dCBpdCBpbnRvIGEgY29tbW9uLCBzaGFyZWQgbG9jYXRpb24KLQotc3RhdGljIHN0ZDo6c3RyaW5nIGF1ZGlvU291cmNlU3RyaW5nKGF1ZGlvX3NvdXJjZV90IHZhbHVlKSB7Ci0gICAgc3RkOjpzdHJpbmcgc291cmNlOwotICAgIGlmIChTb3VyY2VUeXBlQ29udmVydGVyOjp0b1N0cmluZyh2YWx1ZSwgc291cmNlKSkgewotICAgICAgICByZXR1cm4gc291cmNlOwotICAgIH0KLSAgICBjaGFyIHJhd2J1ZmZlclsxNl07ICAvLyByb29tIGZvciAiJWQiCi0gICAgc25wcmludGYocmF3YnVmZmVyLCBzaXplb2YocmF3YnVmZmVyKSwgIiVkIiwgdmFsdWUpOwotICAgIHJldHVybiByYXdidWZmZXI7Ci19Ci0KLXN0YXRpYyBzdGQ6OnN0cmluZyBhdWRpb0NvbmN1cnJlbmN5U3RyaW5nKAotICAgICAgICBBdWRpb1BvbGljeUludGVyZmFjZTo6Y29uY3VycmVuY3lfdHlwZV9fbWFza190IGNvbmN1cnJlbmN5KQotewotICAgIGNoYXIgYnVmZmVyWzY0XTsgLy8gb3ZlcnNpemVkCi0gICAgaWYgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9BTEwpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVzJXMlcyVzIiwKLSAgICAgICAgICAgIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FMTCk/ICIsY2FsbCI6IiIsCi0gICAgICAgICAgICAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkUpPyAiLGNhcHR1cmUiOiIiLAotICAgICAgICAgICAgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9IT1RXT1JEKT8gIixob3R3b3JkIjoiIiwKLSAgICAgICAgICAgIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfUFJFRU1QVCk/ICIscHJlZW1wdCI6IiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIsbm9uZSIpOwotICAgIH0KLQotICAgIHJldHVybiAmYnVmZmVyWzFdOwotfQotCiBzdGQ6OnN0cmluZyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldERldmljZVR5cGVTdHJGb3JQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIHsKLSAgICBzdGQ6OnN0cmluZyB0eXBlU3RyOwogICAgIHN0cnVjdCBhdWRpb19wb3J0IHBvcnQgPSB7fTsKICAgICBwb3J0LmlkID0gcG9ydElkOwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmdldEF1ZGlvUG9ydCgmcG9ydCk7CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBwb3J0LnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICBkZXZpY2VUb1N0cmluZyhwb3J0LmV4dC5kZXZpY2UudHlwZSwgdHlwZVN0cik7CisgICAgICAgIHJldHVybiB0b1N0cmluZyhwb3J0LmV4dC5kZXZpY2UudHlwZSk7CiAgICAgfQotICAgIHJldHVybiB0eXBlU3RyOworICAgIHJldHVybiB7fTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCBib29sICpzaWxlbmNlZCkKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtNDg2LDE4ICs0ODksMTYgQEAKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAotICAgIC8vIElmIFVJRCBpbmFjdGl2ZSBpdCByZWNvcmRzIHNpbGVuY2UgdW50aWwgYmVjb21pbmcgYWN0aXZlCi0gICAgKnNpbGVuY2VkID0gIW1VaWRQb2xpY3ktPmlzVWlkQWN0aXZlKGNsaWVudC0+dWlkKSAmJiAhY2xpZW50LT5pc1ZpcnR1YWxEZXZpY2U7Ci0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgY29uY3VycmVuY3kgPQotICAgICAgICAgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9OT05FOworCisgICAgY2xpZW50LT5hY3RpdmUgPSB0cnVlOworICAgIGNsaWVudC0+c3RhcnRUaW1lTnMgPSBzeXN0ZW1UaW1lKCk7CisgICAgdXBkYXRlVWlkU3RhdGVzX2woKTsKIAogICAgIHN0YXR1c190IHN0YXR1czsKICAgICB7CiAgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgICAgIHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0SW5wdXQoCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudC0+aW5wdXQsIGNsaWVudC0+c2Vzc2lvbiwgKnNpbGVuY2VkLCAmY29uY3VycmVuY3kpOworICAgICAgICBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydElucHV0KHBvcnRJZCk7CiAKICAgICB9CiAKQEAgLTUwNiw3ICs1MDcsNiBAQAogCiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9Qb2xpY3lbXSA9ICJhdWRpb3BvbGljeSI7CiAKLSAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeVJlYXNvbltdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucmVhc29uIjsKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeVN0YXR1c1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kuc3RhdHVzIjsKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeVJxc3RTcmNbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnJxc3Quc3JjIjsKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeVJxc3RQa2dbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnJxc3QucGtnIjsKQEAgLTUyMCw2NCArNTIwLDUyIEBACiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9Qb2xpY3lBY3RpdmVEZXZpY2VbXSA9CiAgICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kuYWN0aXZlLmRldmljZSI7CiAKLSAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbShrQXVkaW9Qb2xpY3kpOworICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSBNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShrQXVkaW9Qb2xpY3kpOwogICAgICAgICBpZiAoaXRlbSAhPSBOVUxMKSB7CiAKLSAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UmVhc29uLCBhdWRpb0NvbmN1cnJlbmN5U3RyaW5nKGNvbmN1cnJlbmN5KS5jX3N0cigpKTsKICAgICAgICAgICAgIGl0ZW0tPnNldEludDMyKGtBdWRpb1BvbGljeVN0YXR1cywgc3RhdHVzKTsKIAogICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0U3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1NvdXJjZVN0cmluZyhjbGllbnQtPmF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKLSAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UnFzdFBrZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoU3RyaW5nOChjbGllbnQtPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9TdHJpbmcoY2xpZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSkuY19zdHIoKSk7CiAgICAgICAgICAgICBpdGVtLT5zZXRJbnQzMihrQXVkaW9Qb2xpY3lScXN0U2Vzc2lvbiwgY2xpZW50LT5zZXNzaW9uKTsKLQorICAgICAgICAgICAgaWYgKGNsaWVudC0+b3BQYWNrYWdlTmFtZS5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UnFzdFBrZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKFN0cmluZzgoY2xpZW50LT5vcFBhY2thZ2VOYW1lKS5zdHJpbmcoKSkuY19zdHIoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UnFzdFBrZywgc3RkOjp0b19zdHJpbmcoY2xpZW50LT51aWQpLmNfc3RyKCkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZygKICAgICAgICAgICAgICAgICAgICAga0F1ZGlvUG9saWN5UnFzdERldmljZSwgZ2V0RGV2aWNlVHlwZVN0ckZvclBvcnRJZChjbGllbnQtPmRldmljZUlkKS5jX3N0cigpKTsKIAotICAgICAgICAgICAgLy8gZmlndXJlIG91dCB3aG8gaXMgYWN0aXZlCi0gICAgICAgICAgICAvLyBOQjogbWlnaHQgdGhlIG90aGVyIHBhcnR5IGhhdmUgZ2l2ZW4gdXAgdGhlIG1pY3JvcGhvbmUgc2luY2UgdGhlbj8gaG93IHN1cmUuCi0gICAgICAgICAgICAvLyBwZXJoYXBzIGNvdWxkIGhhdmUgZ2l2ZW4gdXAgb24gaXQuCi0gICAgICAgICAgICAvLyB3ZSBob2xkIG1Mb2NrLCBzbyBwZXJoYXBzIHdlJ3JlIHNhZmUgZm9yIHRoaXMgbG9vcGluZwotICAgICAgICAgICAgaWYgKGNvbmN1cnJlbmN5ICE9IEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTk9ORSkgewotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IG1BdWRpb1JlY29yZENsaWVudHMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3J0SWQgPT0gbUF1ZGlvUmVjb3JkQ2xpZW50cy5rZXlBdChpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IG90aGVyID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3RoZXItPmFjdGl2ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcHMgdGhlIGxhc3Qgb2YgdGhlIGNsaWVudHMgbWFya2VkIGFjdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lBY3RpdmVTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvU291cmNlU3RyaW5nKG90aGVyLT5hdHRyaWJ1dGVzLnNvdXJjZSkuY19zdHIoKSk7CisgICAgICAgICAgICBpbnQgY291bnQgPSBtQXVkaW9SZWNvcmRDbGllbnRzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQgOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocG9ydElkID09IG1BdWRpb1JlY29yZENsaWVudHMua2V5QXQoaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBvdGhlciA9IG1BdWRpb1JlY29yZENsaWVudHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAob3RoZXItPmFjdGl2ZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBrZWVwcyB0aGUgbGFzdCBvZiB0aGUgY2xpZW50cyBtYXJrZWQgYWN0aXZlCisgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5QWN0aXZlU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvU3RyaW5nKG90aGVyLT5hdHRyaWJ1dGVzLnNvdXJjZSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldEludDMyKGtBdWRpb1BvbGljeUFjdGl2ZVNlc3Npb24sIG90aGVyLT5zZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG90aGVyLT5vcFBhY2thZ2VOYW1lLnNpemUoKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeUFjdGl2ZVBrZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhTdHJpbmc4KG90aGVyLT5vcFBhY2thZ2VOYW1lKS5zdHJpbmcoKSkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRJbnQzMihrQXVkaW9Qb2xpY3lBY3RpdmVTZXNzaW9uLCBvdGhlci0+c2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeUFjdGl2ZURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlVHlwZVN0ckZvclBvcnRJZChvdGhlci0+ZGV2aWNlSWQpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhTdHJpbmc4KG90aGVyLT5vcFBhY2thZ2VOYW1lKS5zdHJpbmcoKSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJxc3RQa2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKG90aGVyLT51aWQpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5QWN0aXZlRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZVR5cGVTdHJGb3JQb3J0SWQob3RoZXItPmRldmljZUlkKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpdGVtLT5zZWxmcmVjb3JkKCk7CiAgICAgICAgICAgICBkZWxldGUgaXRlbTsKICAgICAgICAgICAgIGl0ZW0gPSBOVUxMOwogICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNvbmN1cnJlbmN5ICYgfkF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGFydElucHV0KCk6IGludmFsaWQgY29uY3VycmVuY3kgdHlwZSAlZCIsIChpbnQpY29uY3VycmVuY3kpOwotCi0gICAgICAgIC8vIGVuZm9yY2UgcGVybWlzc2lvbiAoaWYgYW55KSByZXF1aXJlZCBmb3IgZWFjaCB0eXBlIG9mIGNvbmN1cnJlbmN5Ci0gICAgICAgIGlmIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FMTCkgewotICAgICAgICAgICAgLy9UT0RPOiBjaGVjayBpbmNhbGwgY2FwdHVyZSBwZXJtaXNzaW9uCi0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFKSB7Ci0gICAgICAgICAgICAvL1RPRE86IGNoZWNrIGNvbmN1cnJlbnQgY2FwdHVyZSBwZXJtaXNzaW9uCi0gICAgICAgIH0KLQotICAgICAgICBjbGllbnQtPmFjdGl2ZSA9IHRydWU7Ci0gICAgfSBlbHNlIHsKKyAgICAgICAgY2xpZW50LT5hY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgY2xpZW50LT5zdGFydFRpbWVOcyA9IDA7CisgICAgICAgIHVwZGF0ZVVpZFN0YXRlc19sKCk7CiAgICAgICAgIGZpbmlzaFJlY29yZGluZyhjbGllbnQtPm9wUGFja2FnZU5hbWUsIGNsaWVudC0+dWlkKTsKICAgICB9CiAKQEAgLTU4OSw2ICs1NzcsNyBAQAogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAogICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9SZWNvcmRDbGllbnRzLmluZGV4T2ZLZXkocG9ydElkKTsKQEAgLTU5OCwxMSArNTg3LDE0IEBACiAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGNsaWVudCA9IG1BdWRpb1JlY29yZENsaWVudHMudmFsdWVBdChpbmRleCk7CiAKICAgICBjbGllbnQtPmFjdGl2ZSA9IGZhbHNlOworICAgIGNsaWVudC0+c3RhcnRUaW1lTnMgPSAwOworCisgICAgdXBkYXRlVWlkU3RhdGVzX2woKTsKIAogICAgIC8vIGZpbmlzaCB0aGUgcmVjb3JkaW5nIGFwcCBvcAogICAgIGZpbmlzaFJlY29yZGluZyhjbGllbnQtPm9wUGFja2FnZU5hbWUsIGNsaWVudC0+dWlkKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wSW5wdXQoY2xpZW50LT5pbnB1dCwgY2xpZW50LT5zZXNzaW9uKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcElucHV0KHBvcnRJZCk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCkBAIC02MjAsNiArNjEyLDE0IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgY2xpZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy52YWx1ZUF0KGluZGV4KTsKKworICAgICAgICBpZiAoY2xpZW50LT5hY3RpdmUpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyByZWxlYXNpbmcgYWN0aXZlIGNsaWVudCBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisgICAgICAgICAgICBjbGllbnQtPmFjdGl2ZSA9IGZhbHNlOworICAgICAgICAgICAgY2xpZW50LT5zdGFydFRpbWVOcyA9IDA7CisgICAgICAgICAgICB1cGRhdGVVaWRTdGF0ZXNfbCgpOworICAgICAgICB9CisKICAgICAgICAgbUF1ZGlvUmVjb3JkQ2xpZW50cy5yZW1vdmVJdGVtKHBvcnRJZCk7CiAgICAgfQogICAgIGlmIChjbGllbnQgPT0gMCkgewpAQCAtNjI3LDE1ICs2MjcsMTUgQEAKICAgICB9CiAgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CiAgICAgICAgIC8vIHJlbGVhc2UgYXVkaW8gcHJvY2Vzc29ycyBmcm9tIHRoZSBpbnB1dAotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VJbnB1dEVmZmVjdHMoY2xpZW50LT5pbnB1dCwgY2xpZW50LT5zZXNzaW9uKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZWxlYXNlSW5wdXRFZmZlY3RzKGNsaWVudC0+aW8sIGNsaWVudC0+c2Vzc2lvbik7CiAgICAgICAgIGlmKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGVmZmVjdHMgb24gaW5wdXQgJWQiLCBjbGllbnQtPmlucHV0KTsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIGlucHV0ICVkIiwgY2xpZW50LT5pbyk7CiAgICAgICAgIH0KICAgICB9CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlSW5wdXQoY2xpZW50LT5pbnB1dCwgY2xpZW50LT5zZXNzaW9uKTsKKyAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZUlucHV0KHBvcnRJZCk7CiAgICAgfQogfQogCkBAIC02OTUsMTQgKzY5NSw2MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgsIGRldmljZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgsIGRldmljZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4KQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIGluZGV4KTsKK30KKwogdWludDMyX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKIHsKICAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIFBST0RVQ1RfU1RSQVRFR1lfTk9ORTsKICAgICB9CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIFBST0RVQ1RfU1RSQVRFR1lfTk9ORTsKICAgICB9CisgICAgLy8gRE8gTk9UIExPQ0ssIG1heSBiZSBjYWxsZWQgZnJvbSBBdWRpb0ZsaW5nZXIgd2l0aCBsb2NrIGhlbGQsIHJlYWNoaW5nIGRlYWRsb2NrCiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKTsKIH0KQEAgLTgwMywyNyArODUxLDEwMCBAQAogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc1NvdXJjZUFjdGl2ZShzb3VyY2UpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEF1ZGlvUG9saWN5RWZmZWN0cyhzcDxBdWRpb1BvbGljeUVmZmVjdHM+JiBhdWRpb1BvbGljeUVmZmVjdHMpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICAqY291bnQgPSAwOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgfQogICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgPT0gMCkgewotICAgICAgICAqY291bnQgPSAwOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKK3sKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhhdWRpb1BvbGljeUVmZmVjdHMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CiAgICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+cXVlcnlEZWZhdWx0SW5wdXRFZmZlY3RzKAogICAgICAgICAgICAgKGF1ZGlvX3Nlc3Npb25fdClhdWRpb1Nlc3Npb24sIGRlc2NyaXB0b3JzLCBjb3VudCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6YWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQoreworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAoIW1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRTb3VyY2VEZWZhdWx0RWZmZWN0KAorICAgICAgICAgICAgdHlwZSwgb3BQYWNrYWdlTmFtZSwgdXVpZCwgcHJpb3JpdHksIHNvdXJjZSwgaWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCit7CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb1BvbGljeUVmZmVjdHMoYXVkaW9Qb2xpY3lFZmZlY3RzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmICghbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBhdWRpb1BvbGljeUVmZmVjdHMtPmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoCisgICAgICAgICAgICB0eXBlLCBvcFBhY2thZ2VOYW1lLCB1dWlkLCBwcmlvcml0eSwgdXNhZ2UsIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQoreworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAoIW1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQoreworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAoIW1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGlkKTsKK30KKwogYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgaW5mbykKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CkBAIC04MzcsNiArOTU4LDE3IEBACiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmlzT2ZmbG9hZFN1cHBvcnRlZChpbmZvKTsKIH0KIAorYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpIHsKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25maWcsIGF0dHJpYnV0ZXMpOworfQorCisKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCkBAIC05NDAsOSArMTA3MiwxNCBAQAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzLCBib29sIHJlZ2lzdHJhdGlvbikKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKKworICAgIC8vIGxvb3BiYWNrfHJlbmRlciBvbmx5IG5lZWQgYSBNZWRpYVByb2plY3Rpb24gKGNoZWNrZWQgaW4gY2FsbGVyIEF1ZGlvU2VydmljZS5qYXZhKQorICAgIGJvb2wgbmVlZE1vZGlmeUF1ZGlvUm91dGluZyA9IHN0ZDo6YW55X29mKG1peGVzLmJlZ2luKCksIG1peGVzLmVuZCgpLCBbXShhdXRvJiBtaXgpIHsKKyAgICAgICAgICAgIHJldHVybiAhaXNfbWl4X2xvb3BiYWNrX3JlbmRlcihtaXgubVJvdXRlRmxhZ3MpOyB9KTsKKyAgICBpZiAobmVlZE1vZGlmeUF1ZGlvUm91dGluZyAmJiAhbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CisKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KQEAgLTk1NCwyNyArMTA5MSw1MiBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwKKyAgICAgICAgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWQsIGRldmljZXMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWQpOworfQorCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0QXVkaW9Tb3VyY2Uoc291cmNlLCBhdHRyaWJ1dGVzLCBoYW5kbGUsCisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0QXVkaW9Tb3VyY2Uoc291cmNlLCBhdHRyaWJ1dGVzLCBwb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wQXVkaW9Tb3VyY2UoaGFuZGxlKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcEF1ZGlvU291cmNlKHBvcnRJZCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0TWFzdGVyTW9ubyhib29sIG1vbm8pCkBAIC0xMDI2LDYgKzExODgsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQsIHJlcG9ydGVkKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoZm9ybWF0cyk7Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewpAQCAtMTAzNiw0ICsxMjA5LDY2IEBACiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb0Zvcm1hdCwgZW5hYmxlZCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1VaWRQb2xpY3ktPnNldEFzc2lzdGFudFVpZCh1aWQpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1VaWRQb2xpY3ktPnNldEExMXlVaWRzKHVpZHMpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coIiVzLCBtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+bGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoc3RyYXRlZ2llcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcygKKyAgICAgICAgY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwgcHJvZHVjdF9zdHJhdGVneV90ICZwcm9kdWN0U3RyYXRlZ3kpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcyhhYSwgcHJvZHVjdFN0cmF0ZWd5KTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmxpc3RBdWRpb1ZvbHVtZUdyb3Vwcyhncm91cHMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgJnZvbHVtZUdyb3VwKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhhYSwgdm9sdW1lR3JvdXApOworfQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IGYzY2RkYzMuLjhjYmYzYWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvQWN0aXZpdHlNYW5hZ2VyLmg+CkBAIC0zNSwxNiArMzQsMTUgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAjaW5jbHVkZSA8aGFyZHdhcmVfbGVnYWN5L3Bvd2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgorI2luY2x1ZGUgPHNlbnNvcnByaXZhY3kvU2Vuc29yUHJpdmFjeU1hbmFnZXIuaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KIAotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBjaGFyIGtEZWFkbG9ja2VkU3RyaW5nW10gPSAiQXVkaW9Qb2xpY3lTZXJ2aWNlIG1heSBiZSBkZWFkbG9ja2VkXG4iOwpAQCAtNzAsOCArNjgsNiBAQAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgICAgICAvLyBzdGFydCB0b25lIHBsYXliYWNrIHRocmVhZAotICAgICAgICBtVG9uZVBsYXliYWNrVGhyZWFkID0gbmV3IEF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4KCJBcG1Ub25lIiksIHRoaXMpOwogICAgICAgICAvLyBzdGFydCBhdWRpbyBjb21tYW5kcyB0aHJlYWQKICAgICAgICAgbUF1ZGlvQ29tbWFuZFRocmVhZCA9IG5ldyBBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCgiQXBtQXVkaW8iKSwgdGhpcyk7CiAgICAgICAgIC8vIHN0YXJ0IG91dHB1dCBhY3Rpdml0eSBjb21tYW5kIHRocmVhZApAQCAtODksMTEgKzg1LDEzIEBACiAKICAgICBtVWlkUG9saWN5ID0gbmV3IFVpZFBvbGljeSh0aGlzKTsKICAgICBtVWlkUG9saWN5LT5yZWdpc3RlclNlbGYoKTsKKworICAgIG1TZW5zb3JQcml2YWN5UG9saWN5ID0gbmV3IFNlbnNvclByaXZhY3lQb2xpY3kodGhpcyk7CisgICAgbVNlbnNvclByaXZhY3lQb2xpY3ktPnJlZ2lzdGVyU2VsZigpOwogfQogCiBBdWRpb1BvbGljeVNlcnZpY2U6On5BdWRpb1BvbGljeVNlcnZpY2UoKQogewotICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPmV4aXQoKTsKICAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5leGl0KCk7CiAgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPmV4aXQoKTsKIApAQCAtMTA1LDYgKzEwMyw5IEBACiAKICAgICBtVWlkUG9saWN5LT51bnJlZ2lzdGVyU2VsZigpOwogICAgIG1VaWRQb2xpY3kuY2xlYXIoKTsKKworICAgIG1TZW5zb3JQcml2YWN5UG9saWN5LT51bnJlZ2lzdGVyU2VsZigpOworICAgIG1TZW5zb3JQcml2YWN5UG9saWN5LmNsZWFyKCk7CiB9CiAKIC8vIEEgbm90aWZpY2F0aW9uIGNsaWVudCBpcyBhbHdheXMgcmVnaXN0ZXJlZCBieSBBdWRpb1N5c3RlbSB3aGVuIHRoZSBjbGllbnQgcHJvY2VzcwpAQCAtMTE4LDEzICsxMTksMTcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKIAogICAgIHVpZF90IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleSh1aWQpIDwgMCkgeworICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQ2NF90IHRva2VuID0gKChpbnQ2NF90KXVpZDw8MzIpIHwgcGlkOworCisgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkodG9rZW4pIDwgMCkgewogICAgICAgICBzcDxOb3RpZmljYXRpb25DbGllbnQ+IG5vdGlmaWNhdGlvbkNsaWVudCA9IG5ldyBOb3RpZmljYXRpb25DbGllbnQodGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCk7Ci0gICAgICAgIEFMT0dWKCJyZWdpc3RlckNsaWVudCgpIGNsaWVudCAlcCwgdWlkICVkIiwgY2xpZW50LmdldCgpLCB1aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkKTsKKyAgICAgICAgQUxPR1YoInJlZ2lzdGVyQ2xpZW50KCkgY2xpZW50ICVwLCB1aWQgJWQgcGlkICVkIiwgY2xpZW50LmdldCgpLCB1aWQsIHBpZCk7CiAKLSAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMuYWRkKHVpZCwgbm90aWZpY2F0aW9uQ2xpZW50KTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMuYWRkKHRva2VuLCBub3RpZmljYXRpb25DbGllbnQpOwogCiAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCk7CiAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobm90aWZpY2F0aW9uQ2xpZW50KTsKQEAgLTEzNiwyMiArMTQxLDQ3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7CiAKICAgICB1aWRfdCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkodWlkKSA8IDApIHsKKyAgICBwaWRfdCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgaW50NjRfdCB0b2tlbiA9ICgoaW50NjRfdCl1aWQ8PDMyKSB8IHBpZDsKKworICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHRva2VuKSA8IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUZvcih1aWQpLT5zZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGVuYWJsZWQpOworICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlRm9yKHRva2VuKS0+c2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChlbmFibGVkKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKKworICAgIHVpZF90IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBwaWRfdCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgaW50NjRfdCB0b2tlbiA9ICgoaW50NjRfdCl1aWQ8PDMyKSB8IHBpZDsKKworICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHRva2VuKSA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUZvcih0b2tlbiktPnNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGVuYWJsZWQpOwogfQogCiAvLyByZW1vdmVOb3RpZmljYXRpb25DbGllbnQoKSBpcyBjYWxsZWQgd2hlbiB0aGUgY2xpZW50IHByb2Nlc3MgZGllcy4KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVOb3RpZmljYXRpb25DbGllbnQodWlkX3QgdWlkKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCh1aWRfdCB1aWQsIHBpZF90IHBpZCkKIHsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOwotICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5yZW1vdmVJdGVtKHVpZCk7CisgICAgICAgIGludDY0X3QgdG9rZW4gPSAoKGludDY0X3QpdWlkPDwzMikgfCBwaWQ7CisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnJlbW92ZUl0ZW0odG9rZW4pOwogICAgIH0KICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7CisgICAgICAgIGJvb2wgaGFzU2FtZVVpZCA9IGZhbHNlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+dWlkKCkgPT0gdWlkKSB7CisgICAgICAgICAgICAgICAgaGFzU2FtZVVpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgJiYgIWhhc1NhbWVVaWQpIHsKICAgICAgICAgICAgIC8vIGNhbGxlZCBmcm9tIGJpbmRlciBkZWF0aCBub3RpZmljYXRpb246IG5vIG5lZWQgdG8gY2xlYXIgY2FsbGVyIGlkZW50aXR5CiAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlUmVzb3VyY2VzRm9yVWlkKHVpZCk7CiAgICAgICAgIH0KQEAgLTE4NCw2ICsyMTQsMTkgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpCit7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPmNoYW5nZUF1ZGlvVm9sdW1lR3JvdXBDb21tYW5kKGdyb3VwLCBmbGFncyk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb09uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPm9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQoZ3JvdXAsIGZsYWdzKTsKKyAgICB9Cit9CisKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSkKIHsKICAgICBBTE9HVigiQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZSglcywgJWQpIiwKQEAgLTE5OSwyMiArMjQyLDM0IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKLSAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKIHsKICAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZUNvbW1hbmQoZXZlbnQsIGNsaWVudEluZm8sCi0gICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBjbGllbnRFZmZlY3RzLCBkZXZpY2VDb25maWcsIGVmZmVjdHMsIHBhdGNoSGFuZGxlLCBzb3VyY2UpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAotICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgIGNsaWVudENvbmZpZywgY2xpZW50RWZmZWN0cywgZGV2aWNlQ29uZmlnLCBlZmZlY3RzLCBwYXRjaEhhbmRsZSwgc291cmNlKTsKICAgICB9CiB9CiAKQEAgLTIzOSw5ICsyOTQsMTAgQEAKIAogQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Ok5vdGlmaWNhdGlvbkNsaWVudChjb25zdCBzcDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCi0gICAgOiBtU2VydmljZShzZXJ2aWNlKSwgbVVpZCh1aWQpLCBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50KGNsaWVudCksCi0gICAgICBtQXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQpCisgICAgOiBtU2VydmljZShzZXJ2aWNlKSwgbVVpZCh1aWQpLCBtUGlkKHBpZCksIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQoY2xpZW50KSwKKyAgICAgIG1BdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGZhbHNlKSwgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGZhbHNlKQogewogfQogCkBAIC0yNTQsNyArMzEwLDcgQEAKICAgICBzcDxOb3RpZmljYXRpb25DbGllbnQ+IGtlZXAodGhpcyk7CiAgICAgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOwogICAgIGlmIChzZXJ2aWNlICE9IDApIHsKLSAgICAgICAgc2VydmljZS0+cmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KG1VaWQpOworICAgICAgICBzZXJ2aWNlLT5yZW1vdmVOb3RpZmljYXRpb25DbGllbnQobVVpZCwgbVBpZCk7CiAgICAgfQogfQogCkBAIC0yNzIsMjIgKzMyOCwzNiBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKSB7CisgICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQoZ3JvdXAsIGZsYWdzKTsKKyAgICB9Cit9CisKKwogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKQogewotICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgbXVsdGl1c2VyX2dldF9hcHBfaWQobVVpZCkgPCBBSURfQVBQX1NUQVJUKSB7CisgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBpc1NlcnZpY2VVaWQobVVpZCkpIHsKICAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUocmVnSWQsIHN0YXRlKTsKICAgICB9CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKIHsKLSAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwICYmIG11bHRpdXNlcl9nZXRfYXBwX2lkKG1VaWQpIDwgQUlEX0FQUF9TVEFSVCkgeworICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgaXNTZXJ2aWNlVWlkKG1VaWQpKSB7CiAgICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgIGNsaWVudENvbmZpZywgY2xpZW50RWZmZWN0cywgZGV2aWNlQ29uZmlnLCBlZmZlY3RzLCBwYXRjaEhhbmRsZSwgc291cmNlKTsKICAgICB9CiB9CiAKQEAgLTI5Niw2ICszNjYsMTAgQEAKICAgICBtQXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZCA9IGVuYWJsZWQ7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6OnNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQgPSBlbmFibGVkOworfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7CiAgICAgQUxPR1coImJpbmRlckRpZWQoKSAlcCwgY2FsbGluZyBwaWQgJWQiLCB3aG8udW5zYWZlX2dldCgpLApAQCAtMzI1LDI0ICszOTksMTg2IEBACiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkNvbW1hbmQgVGhyZWFkOiAlcFxuIiwgbUF1ZGlvQ29tbWFuZFRocmVhZC5nZXQoKSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlRvbmVzIFRocmVhZDogJXBcbiIsIG1Ub25lUGxheWJhY2tUaHJlYWQuZ2V0KCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCkKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjp1cGRhdGVVaWRTdGF0ZXMoKQogewotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIpIHsKLSAgICAgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRSZWNvcmRTaWxlbmNlZCh1aWQsIHNpbGVuY2VkKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHVwZGF0ZVVpZFN0YXRlc19sKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjp1cGRhdGVVaWRTdGF0ZXNfbCgpCit7CisvLyAgICBHbyBvdmVyIGFsbCBhY3RpdmUgY2xpZW50cyBhbmQgYWxsb3cgY2FwdHVyZSAoZG9lcyBub3QgZm9yY2Ugc2lsZW5jZSkgaW4gdGhlCisvLyAgICBmb2xsb3dpbmcgY2FzZXM6CisvLyAgICBUaGUgY2xpZW50IGlzIHRoZSBhc3Npc3RhbnQKKy8vICAgICAgICBBTkQgYW4gYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGlzIG9uIFRPUAorLy8gICAgICAgICAgICAgICBBTkQgdGhlIHNvdXJjZSBpcyBWT0lDRV9SRUNPR05JVElPTiBvciBIT1RXT1JECisvLyAgICAgICAgT1IgdXNlcyBWT0lDRV9SRUNPR05JVElPTiBBTkQgaXMgb24gVE9QIE9SIGxhdGVzdCBzdGFydGVkCisvLyAgICAgICAgICAgICAgIE9SIHVzZXMgSE9UV09SRAorLy8gICAgICAgICAgICBBTkQgdGhlcmUgaXMgbm8gcHJpdmFjeSBzZW5zaXRpdmUgYWN0aXZlIGNhcHR1cmUKKy8vICAgIE9SIFRoZSBjbGllbnQgaXMgYW4gYWNjZXNzaWJpbGl0eSBzZXJ2aWNlCisvLyAgICAgICAgQU5EIGlzIG9uIFRPUCBPUiBsYXRlc3Qgc3RhcnRlZAorLy8gICAgICAgIEFORCB0aGUgc291cmNlIGlzIFZPSUNFX1JFQ09HTklUSU9OIG9yIEhPVFdPUkQKKy8vICAgIE9SIHRoZSBzb3VyY2UgaXMgb25lIG9mOiBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTkssIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTkssCisvLyAgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTAorLy8gICAgT1IgQW55IG90aGVyIGNsaWVudAorLy8gICAgICAgIEFORCBUaGUgYXNzaXN0YW50IGlzIG5vdCBvbiBUT1AKKy8vICAgICAgICBBTkQgaXMgb24gVE9QIE9SIGxhdGVzdCBzdGFydGVkCisvLyAgICAgICAgQU5EIHRoZXJlIGlzIG5vIHByaXZhY3kgc2Vuc2l0aXZlIGFjdGl2ZSBjYXB0dXJlCisvL1RPRE86IG1hbWFuYWdlIHByZSBwcm9jZXNzaW5nIGVmZmVjdHMgYWNjb3JkaW5nIHRvIHVzZSBjYXNlIHByaW9yaXR5CisKKyAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gdG9wQWN0aXZlOworICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBsYXRlc3RBY3RpdmU7CisgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGxhdGVzdFNlbnNpdGl2ZUFjdGl2ZTsKKyAgICBuc2Vjc190IHRvcFN0YXJ0TnMgPSAwOworICAgIG5zZWNzX3QgbGF0ZXN0U3RhcnROcyA9IDA7CisgICAgbnNlY3NfdCBsYXRlc3RTZW5zaXRpdmVTdGFydE5zID0gMDsKKyAgICBib29sIGlzQTExeU9uVG9wID0gbVVpZFBvbGljeS0+aXNBMTF5T25Ub3AoKTsKKyAgICBib29sIGlzQXNzaXN0YW50T25Ub3AgPSBmYWxzZTsKKyAgICBib29sIGlzU2Vuc2l0aXZlQWN0aXZlID0gZmFsc2U7CisKKyAgICAvLyBpZiBTZW5zb3IgUHJpdmFjeSBpcyBlbmFibGVkIHRoZW4gYWxsIHJlY29yZGluZ3Mgc2hvdWxkIGJlIHNpbGVuY2VkLgorICAgIGlmIChtU2Vuc29yUHJpdmFjeVBvbGljeS0+aXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpKSB7CisgICAgICAgIHNpbGVuY2VBbGxSZWNvcmRpbmdzX2woKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPTA7IGkgPCBtQXVkaW9SZWNvcmRDbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjdXJyZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50c1tpXTsKKyAgICAgICAgaWYgKCFjdXJyZW50LT5hY3RpdmUpIGNvbnRpbnVlOworICAgICAgICBpZiAoaXNQcml2YWN5U2Vuc2l0aXZlU291cmNlKGN1cnJlbnQtPmF0dHJpYnV0ZXMuc291cmNlKSkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnN0YXJ0VGltZU5zID4gbGF0ZXN0U2Vuc2l0aXZlU3RhcnROcykgeworICAgICAgICAgICAgICAgIGxhdGVzdFNlbnNpdGl2ZUFjdGl2ZSA9IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgbGF0ZXN0U2Vuc2l0aXZlU3RhcnROcyA9IGN1cnJlbnQtPnN0YXJ0VGltZU5zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXNTZW5zaXRpdmVBY3RpdmUgPSB0cnVlOwogICAgICAgICB9CisgICAgICAgIGlmIChtVWlkUG9saWN5LT5nZXRVaWRTdGF0ZShjdXJyZW50LT51aWQpID09IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9UT1ApIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50LT5zdGFydFRpbWVOcyA+IHRvcFN0YXJ0TnMpIHsKKyAgICAgICAgICAgICAgICB0b3BBY3RpdmUgPSBjdXJyZW50OworICAgICAgICAgICAgICAgIHRvcFN0YXJ0TnMgPSBjdXJyZW50LT5zdGFydFRpbWVOczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtVWlkUG9saWN5LT5pc0Fzc2lzdGFudFVpZChjdXJyZW50LT51aWQpKSB7CisgICAgICAgICAgICAgICAgaXNBc3Npc3RhbnRPblRvcCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cnJlbnQtPnN0YXJ0VGltZU5zID4gbGF0ZXN0U3RhcnROcykgeworICAgICAgICAgICAgbGF0ZXN0QWN0aXZlID0gY3VycmVudDsKKyAgICAgICAgICAgIGxhdGVzdFN0YXJ0TnMgPSBjdXJyZW50LT5zdGFydFRpbWVOczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0b3BBY3RpdmUgPT0gbnVsbHB0ciAmJiBsYXRlc3RBY3RpdmUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRvcEFjdGl2ZSAhPSBudWxscHRyKSB7CisgICAgICAgIGxhdGVzdEFjdGl2ZSA9IG51bGxwdHI7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9MDsgaSA8IG1BdWRpb1JlY29yZENsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGN1cnJlbnQgPSBtQXVkaW9SZWNvcmRDbGllbnRzW2ldOworICAgICAgICBpZiAoIWN1cnJlbnQtPmFjdGl2ZSkgY29udGludWU7CisKKyAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gY3VycmVudC0+YXR0cmlidXRlcy5zb3VyY2U7CisgICAgICAgIGJvb2wgaXNPblRvcCA9IGN1cnJlbnQgPT0gdG9wQWN0aXZlOworICAgICAgICBib29sIGlzTGF0ZXN0ID0gY3VycmVudCA9PSBsYXRlc3RBY3RpdmU7CisgICAgICAgIGJvb2wgaXNMYXRlc3RTZW5zaXRpdmUgPSBjdXJyZW50ID09IGxhdGVzdFNlbnNpdGl2ZUFjdGl2ZTsKKyAgICAgICAgYm9vbCBmb3JjZUlkbGUgPSB0cnVlOworCisgICAgICAgIGlmIChpc1ZpcnR1YWxTb3VyY2Uoc291cmNlKSkgeworICAgICAgICAgICAgZm9yY2VJZGxlID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAobVVpZFBvbGljeS0+aXNBc3Npc3RhbnRVaWQoY3VycmVudC0+dWlkKSkgeworICAgICAgICAgICAgaWYgKGlzQTExeU9uVG9wKSB7CisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCB8fCBzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcmNlSWRsZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCgoKGlzT25Ub3AgfHwgaXNMYXRlc3QpICYmIHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pIHx8CisgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmICFpc1NlbnNpdGl2ZUFjdGl2ZSkgeworICAgICAgICAgICAgICAgICAgICBmb3JjZUlkbGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobVVpZFBvbGljeS0+aXNBMTF5VWlkKGN1cnJlbnQtPnVpZCkpIHsKKyAgICAgICAgICAgIGlmICgoaXNPblRvcCB8fCBpc0xhdGVzdCkgJiYKKyAgICAgICAgICAgICAgICAoc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiB8fCBzb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpKSB7CisgICAgICAgICAgICAgICAgZm9yY2VJZGxlID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIWlzQXNzaXN0YW50T25Ub3AgJiYgKGlzT25Ub3AgfHwgaXNMYXRlc3QpICYmCisgICAgICAgICAgICAgICAgKCFpc1NlbnNpdGl2ZUFjdGl2ZSB8fCBpc0xhdGVzdFNlbnNpdGl2ZSkpIHsKKyAgICAgICAgICAgICAgICBmb3JjZUlkbGUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzZXRBcHBTdGF0ZV9sKGN1cnJlbnQtPnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICBmb3JjZUlkbGUgPyBBUFBfU1RBVEVfSURMRSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBtU3RhdEZyb21BbVN0YXRlKG1VaWRQb2xpY3ktPmdldFVpZFN0YXRlKGN1cnJlbnQtPnVpZCkpKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzaWxlbmNlQWxsUmVjb3JkaW5nc19sKCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvUmVjb3JkQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gY3VycmVudCA9IG1BdWRpb1JlY29yZENsaWVudHNbaV07CisgICAgICAgIHNldEFwcFN0YXRlX2woY3VycmVudC0+dWlkLCBBUFBfU1RBVEVfSURMRSk7CisgICAgfQorfQorCisvKiBzdGF0aWMgKi8KK2FwcF9zdGF0ZV90IEF1ZGlvUG9saWN5U2VydmljZTo6YXBtU3RhdEZyb21BbVN0YXRlKGludCBhbVN0YXRlKSB7CisgICAgc3dpdGNoIChhbVN0YXRlKSB7CisgICAgY2FzZSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTjoKKyAgICAgICAgcmV0dXJuIEFQUF9TVEFURV9JRExFOworICAgIGNhc2UgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1RPUDoKKyAgICAgICAgcmV0dXJuIEFQUF9TVEFURV9UT1A7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBBUFBfU1RBVEVfRk9SRUdST1VORDsKK30KKworLyogc3RhdGljICovCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNQcml2YWN5U2Vuc2l0aXZlU291cmNlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKK3sKKyAgICBzd2l0Y2ggKHNvdXJjZSkgeworICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIHN0YXRpYyAqLworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzVmlydHVhbFNvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpCit7CisgICAgc3dpdGNoIChzb3VyY2UpIHsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOgorICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfRk1fVFVORVI6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBcHBTdGF0ZV9sKHVpZF90IHVpZCwgYXBwX3N0YXRlX3Qgc3RhdGUpCit7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7CisgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEFwcFN0YXRlKHVpZCwgc3RhdGUpOwogICAgIH0KICAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZikgeworICAgICAgICBib29sIHNpbGVuY2VkID0gc3RhdGUgPT0gQVBQX1NUQVRFX0lETEU7CiAgICAgICAgIGFmLT5zZXRSZWNvcmRTaWxlbmNlZCh1aWQsIHNpbGVuY2VkKTsKICAgICB9CiB9CkBAIC0zNjIsMTQgKzU5OCwxMyBAQAogICAgICAgICBpZiAobUF1ZGlvQ29tbWFuZFRocmVhZCAhPSAwKSB7CiAgICAgICAgICAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5kdW1wKGZkKTsKICAgICAgICAgfQotICAgICAgICBpZiAobVRvbmVQbGF5YmFja1RocmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5kdW1wKGZkKTsKLSAgICAgICAgfQogCiAgICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7CiAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5kdW1wKGZkKTsKICAgICAgICAgfQogCisgICAgICAgIG1QYWNrYWdlTWFuYWdlci5kdW1wKGZkKTsKKwogICAgICAgICBpZiAobG9ja2VkKSBtTG9jay51bmxvY2soKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNTA1LDcgKzc0MCw4IEBACiAgICAgQWN0aXZpdHlNYW5hZ2VyIGFtOwogICAgIGFtLnJlZ2lzdGVyVWlkT2JzZXJ2ZXIodGhpcywgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfR09ORQogICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9JRExFCi0gICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0FDVElWRSwKKyAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfQUNUSVZFCisgICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX1BST0NTVEFURSwKICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOLAogICAgICAgICAgICAgU3RyaW5nMTYoImF1ZGlvc2VydmVyIikpOwogICAgIHN0YXR1c190IHJlcyA9IGFtLmxpbmtUb0RlYXRoKHRoaXMpOwpAQCAtNTE0LDYgKzc1MCw3IEBACiAgICAgICAgIG1PYnNlcnZlclJlZ2lzdGVyZWQgPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJVaWRQb2xpY3k6OnJlZ2lzdGVyU2VsZiBsaW5rVG9EZWF0aCBmYWlsZWQ6ICVkIiwgcmVzKTsKKwogICAgICAgICBhbS51bnJlZ2lzdGVyVWlkT2JzZXJ2ZXIodGhpcyk7CiAgICAgfQogfQpAQCAtNTMyLDggKzc2OSw3IEBACiAgICAgbU9ic2VydmVyUmVnaXN0ZXJlZCA9IGZhbHNlOwogfQogCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc1VpZEFjdGl2ZSh1aWRfdCB1aWQpIHsKLSAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHJldHVybiB0cnVlOwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6Y2hlY2tSZWdpc3RlcmVkKCkgewogICAgIGJvb2wgbmVlZFRvUmVyZWdpc3RlciA9IGZhbHNlOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTU0MywxMDMgKzc3OSwyMTIgQEAKICAgICAgICAgLy8gTG9va3MgbGlrZSBBY3Rpdml0eU1hbmFnZXIgaGFzIGRpZWQgcHJldmlvdXNseSwgYXR0ZW1wdCB0byByZS1yZWdpc3Rlci4KICAgICAgICAgcmVnaXN0ZXJTZWxmKCk7CiAgICAgfQorfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc1VpZEFjdGl2ZSh1aWRfdCB1aWQpIHsKKyAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHJldHVybiB0cnVlOworICAgIGNoZWNrUmVnaXN0ZXJlZCgpOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgYXV0byBvdmVycmlkZUl0ZXIgPSBtT3ZlcnJpZGVVaWRzLmZpbmQodWlkKTsKICAgICAgICAgaWYgKG92ZXJyaWRlSXRlciAhPSBtT3ZlcnJpZGVVaWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGVJdGVyLT5zZWNvbmQ7CisgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGVJdGVyLT5zZWNvbmQuZmlyc3Q7CiAgICAgICAgIH0KICAgICAgICAgLy8gSW4gYW4gYWJzZW5zZSBvZiB0aGUgQWN0aXZpdHlNYW5hZ2VyLCBhc3N1bWUgZXZlcnl0aGluZyB0byBiZSBhY3RpdmUuCiAgICAgICAgIGlmICghbU9ic2VydmVyUmVnaXN0ZXJlZCkgcmV0dXJuIHRydWU7CiAgICAgICAgIGF1dG8gY2FjaGVJdGVyID0gbUNhY2hlZFVpZHMuZmluZCh1aWQpOwogICAgICAgICBpZiAoY2FjaGVJdGVyICE9IG1DYWNoZWRVaWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2FjaGVJdGVyLT5zZWNvbmQ7CisgICAgICAgICAgICByZXR1cm4gY2FjaGVJdGVyLT5zZWNvbmQuZmlyc3Q7CiAgICAgICAgIH0KICAgICB9CiAgICAgQWN0aXZpdHlNYW5hZ2VyIGFtOwogICAgIGJvb2wgYWN0aXZlID0gYW0uaXNVaWRBY3RpdmUodWlkLCBTdHJpbmcxNigiYXVkaW9zZXJ2ZXIiKSk7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBtQ2FjaGVkVWlkcy5pbnNlcnQoc3RkOjpwYWlyPHVpZF90LCBib29sPih1aWQsIGFjdGl2ZSkpOworICAgICAgICBtQ2FjaGVkVWlkcy5pbnNlcnQoc3RkOjpwYWlyPHVpZF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPGJvb2wsIGludD4+KHVpZCwgc3RkOjpwYWlyPGJvb2wsIGludD4oYWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04pKSk7CiAgICAgfQogICAgIHJldHVybiBhY3RpdmU7CiB9CiAKK2ludCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6Z2V0VWlkU3RhdGUodWlkX3QgdWlkKSB7CisgICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSB7CisgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVE9QOworICAgIH0KKyAgICBjaGVja1JlZ2lzdGVyZWQoKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGF1dG8gb3ZlcnJpZGVJdGVyID0gbU92ZXJyaWRlVWlkcy5maW5kKHVpZCk7CisgICAgICAgIGlmIChvdmVycmlkZUl0ZXIgIT0gbU92ZXJyaWRlVWlkcy5lbmQoKSkgeworICAgICAgICAgICAgaWYgKG92ZXJyaWRlSXRlci0+c2Vjb25kLmZpcnN0KSB7CisgICAgICAgICAgICAgICAgaWYgKG92ZXJyaWRlSXRlci0+c2Vjb25kLnNlY29uZCAhPSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGVJdGVyLT5zZWNvbmQuc2Vjb25kOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gY2FjaGVJdGVyID0gbUNhY2hlZFVpZHMuZmluZCh1aWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVJdGVyICE9IG1DYWNoZWRVaWRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVJdGVyLT5zZWNvbmQuc2Vjb25kOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOOworICAgICAgICB9CisgICAgICAgIC8vIEluIGFuIGFic2Vuc2Ugb2YgdGhlIEFjdGl2aXR5TWFuYWdlciwgYXNzdW1lIGV2ZXJ5dGhpbmcgdG8gYmUgYWN0aXZlLgorICAgICAgICBpZiAoIW1PYnNlcnZlclJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVE9QOworICAgICAgICB9CisgICAgICAgIGF1dG8gY2FjaGVJdGVyID0gbUNhY2hlZFVpZHMuZmluZCh1aWQpOworICAgICAgICBpZiAoY2FjaGVJdGVyICE9IG1DYWNoZWRVaWRzLmVuZCgpKSB7CisgICAgICAgICAgICBpZiAoY2FjaGVJdGVyLT5zZWNvbmQuZmlyc3QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVJdGVyLT5zZWNvbmQuc2Vjb25kOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQWN0aXZpdHlNYW5hZ2VyIGFtOworICAgIGJvb2wgYWN0aXZlID0gYW0uaXNVaWRBY3RpdmUodWlkLCBTdHJpbmcxNigiYXVkaW9zZXJ2ZXIiKSk7CisgICAgaW50IHN0YXRlID0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV047CisgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICBzdGF0ZSA9IGFtLmdldFVpZFByb2Nlc3NTdGF0ZSh1aWQsIFN0cmluZzE2KCJhdWRpb3NlcnZlciIpKTsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBtQ2FjaGVkVWlkcy5pbnNlcnQoc3RkOjpwYWlyPHVpZF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPGJvb2wsIGludD4+KHVpZCwgc3RkOjpwYWlyPGJvb2wsIGludD4oYWN0aXZlLCBzdGF0ZSkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdGU7Cit9CisKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om9uVWlkQWN0aXZlKHVpZF90IHVpZCkgewotICAgIHVwZGF0ZVVpZENhY2hlKHVpZCwgdHJ1ZSwgdHJ1ZSk7CisgICAgdXBkYXRlVWlkKCZtQ2FjaGVkVWlkcywgdWlkLCB0cnVlLCBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTiwgdHJ1ZSk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om9uVWlkR29uZSh1aWRfdCB1aWQsIF9fdW51c2VkIGJvb2wgZGlzYWJsZWQpIHsKLSAgICB1cGRhdGVVaWRDYWNoZSh1aWQsIGZhbHNlLCBmYWxzZSk7CisgICAgdXBkYXRlVWlkKCZtQ2FjaGVkVWlkcywgdWlkLCBmYWxzZSwgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04sIGZhbHNlKTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6b25VaWRJZGxlKHVpZF90IHVpZCwgX191bnVzZWQgYm9vbCBkaXNhYmxlZCkgewotICAgIHVwZGF0ZVVpZENhY2hlKHVpZCwgZmFsc2UsIHRydWUpOworICAgIHVwZGF0ZVVpZCgmbUNhY2hlZFVpZHMsIHVpZCwgZmFsc2UsIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOLCB0cnVlKTsKIH0KIAotYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6aXNTZXJ2aWNlVWlkKHVpZF90IHVpZCkgY29uc3QgewotICAgIHJldHVybiBtdWx0aXVzZXJfZ2V0X2FwcF9pZCh1aWQpIDwgQUlEX0FQUF9TVEFSVDsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6bm90aWZ5U2VydmljZSh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlKSB7Ci0gICAgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOwotICAgIGlmIChzZXJ2aWNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgc2VydmljZS0+c2V0UmVjb3JkU2lsZW5jZWQodWlkLCAhYWN0aXZlKTsKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om9uVWlkU3RhdGVDaGFuZ2VkKHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJvY1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwcm9jU3RhdGVTZXEgX191bnVzZWQpIHsKKyAgICBpZiAocHJvY1N0YXRlICE9IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOKSB7CisgICAgICAgIHVwZGF0ZVVpZCgmbUNhY2hlZFVpZHMsIHVpZCwgdHJ1ZSwgcHJvY1N0YXRlLCB0cnVlKTsKICAgICB9CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OnVwZGF0ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KSB7Ci0gICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSByZXR1cm47Ci0gICAgYm9vbCB3YXNPdmVycmlkZGVuID0gZmFsc2UsIHdhc0FjdGl2ZSA9IGZhbHNlOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgdXBkYXRlVWlkTG9ja2VkKCZtT3ZlcnJpZGVVaWRzLCB1aWQsIGFjdGl2ZSwgaW5zZXJ0LCAmd2FzT3ZlcnJpZGRlbiwgJndhc0FjdGl2ZSk7Ci0gICAgfQotICAgIGlmICghd2FzT3ZlcnJpZGRlbiAmJiBpbnNlcnQpIHsKLSAgICAgICAgbm90aWZ5U2VydmljZSh1aWQsIGFjdGl2ZSk7ICAvLyBTdGFydGVkIHRvIG92ZXJyaWRlLgotICAgIH0gZWxzZSBpZiAod2FzT3ZlcnJpZGRlbiAmJiAhaW5zZXJ0KSB7Ci0gICAgICAgIG5vdGlmeVNlcnZpY2UodWlkLCBpc1VpZEFjdGl2ZSh1aWQpKTsgIC8vIE92ZXJyaWRlIGNlYXNlZCwgbm90aWZ5IHdpdGggZ3JvdW5kIHRydXRoLgotICAgIH0gZWxzZSBpZiAod2FzQWN0aXZlICE9IGFjdGl2ZSkgewotICAgICAgICBub3RpZnlTZXJ2aWNlKHVpZCwgYWN0aXZlKTsgIC8vIE92ZXJyaWRlIHVwZGF0ZWQuCisgICAgdXBkYXRlVWlkKCZtT3ZlcnJpZGVVaWRzLCB1aWQsIGFjdGl2ZSwgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04sIGluc2VydCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om5vdGlmeVNlcnZpY2UoKSB7CisgICAgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgIGlmIChzZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgc2VydmljZS0+dXBkYXRlVWlkU3RhdGVzKCk7CiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1cGRhdGVVaWRDYWNoZSh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCkgewotICAgIGlmIChpc1NlcnZpY2VVaWQodWlkKSkgcmV0dXJuOwotICAgIGJvb2wgd2FzQWN0aXZlID0gZmFsc2U7Cit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1cGRhdGVVaWQoc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiAqdWlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5zZXJ0KSB7CisgICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYm9vbCB3YXNBY3RpdmUgPSBpc1VpZEFjdGl2ZSh1aWQpOworICAgIGludCBwcmV2aW91c1N0YXRlID0gZ2V0VWlkU3RhdGUodWlkKTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIHVwZGF0ZVVpZExvY2tlZCgmbUNhY2hlZFVpZHMsIHVpZCwgYWN0aXZlLCBpbnNlcnQsIG51bGxwdHIsICZ3YXNBY3RpdmUpOwotICAgICAgICAvLyBEbyBub3Qgbm90aWZ5IHNlcnZpY2UgaWYgY3VycmVudGx5IG92ZXJyaWRkZW4uCi0gICAgICAgIGlmIChtT3ZlcnJpZGVVaWRzLmZpbmQodWlkKSAhPSBtT3ZlcnJpZGVVaWRzLmVuZCgpKSByZXR1cm47CisgICAgICAgIHVwZGF0ZVVpZExvY2tlZCh1aWRzLCB1aWQsIGFjdGl2ZSwgc3RhdGUsIGluc2VydCk7CiAgICAgfQotICAgIGJvb2wgbm93QWN0aXZlID0gYWN0aXZlICYmIGluc2VydDsKLSAgICBpZiAod2FzQWN0aXZlICE9IG5vd0FjdGl2ZSkgbm90aWZ5U2VydmljZSh1aWQsIG5vd0FjdGl2ZSk7CisgICAgaWYgKHdhc0FjdGl2ZSAhPSBpc1VpZEFjdGl2ZSh1aWQpIHx8IHN0YXRlICE9IHByZXZpb3VzU3RhdGUpIHsKKyAgICAgICAgbm90aWZ5U2VydmljZSgpOworICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6dXBkYXRlVWlkTG9ja2VkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgYm9vbD4gKnVpZHMsCi0gICAgICAgIHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0LCBib29sICp3YXNUaGVyZSwgYm9vbCAqd2FzQWN0aXZlKSB7Cit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1cGRhdGVVaWRMb2NrZWQoc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiAqdWlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5zZXJ0KSB7CiAgICAgYXV0byBpdCA9IHVpZHMtPmZpbmQodWlkKTsKICAgICBpZiAoaXQgIT0gdWlkcy0+ZW5kKCkpIHsKLSAgICAgICAgaWYgKHdhc1RoZXJlICE9IG51bGxwdHIpICp3YXNUaGVyZSA9IHRydWU7Ci0gICAgICAgIGlmICh3YXNBY3RpdmUgIT0gbnVsbHB0cikgKndhc0FjdGl2ZSA9IGl0LT5zZWNvbmQ7CiAgICAgICAgIGlmIChpbnNlcnQpIHsKLSAgICAgICAgICAgIGl0LT5zZWNvbmQgPSBhY3RpdmU7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04pIHsKKyAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmZpcnN0ID0gYWN0aXZlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGl0LT5zZWNvbmQuZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLnNlY29uZCA9IHN0YXRlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLnNlY29uZCA9IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdWlkcy0+ZXJhc2UoaXQpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChpbnNlcnQpIHsKLSAgICAgICAgdWlkcy0+aW5zZXJ0KHN0ZDo6cGFpcjx1aWRfdCwgYm9vbD4odWlkLCBhY3RpdmUpKTsKKyAgICB9IGVsc2UgaWYgKGluc2VydCAmJiAoc3RhdGUgPT0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04pKSB7CisgICAgICAgIHVpZHMtPmluc2VydChzdGQ6OnBhaXI8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+Pih1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxib29sLCBpbnQ+KGFjdGl2ZSwgc3RhdGUpKSk7CiAgICAgfQogfQogCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc0ExMXlPblRvcCgpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnVpZCA6IG1DYWNoZWRVaWRzKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpZF90Pjo6aXRlcmF0b3IgaXQgPSBmaW5kKG1BMTF5VWlkcy5iZWdpbigpLCBtQTExeVVpZHMuZW5kKCksIHVpZC5maXJzdCk7CisgICAgICAgIGlmIChpdCA9PSBtQTExeVVpZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICh1aWQuc2Vjb25kLnNlY29uZCA+PSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVE9QCisgICAgICAgICAgICAgICAgJiYgdWlkLnNlY29uZC5zZWNvbmQgPD0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX0JPVU5EX0ZPUkVHUk9VTkRfU0VSVklDRSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc0ExMXlVaWQodWlkX3QgdWlkKQoreworICAgIHN0ZDo6dmVjdG9yPHVpZF90Pjo6aXRlcmF0b3IgaXQgPSBmaW5kKG1BMTF5VWlkcy5iZWdpbigpLCBtQTExeVVpZHMuZW5kKCksIHVpZCk7CisgICAgcmV0dXJuIGl0ICE9IG1BMTF5VWlkcy5lbmQoKTsKK30KKworLy8gLS0tLS0tLS0tLS0gIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVNlcnZpY2UgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OnJlZ2lzdGVyU2VsZigpIHsKKyAgICBTZW5zb3JQcml2YWN5TWFuYWdlciBzcG07CisgICAgbVNlbnNvclByaXZhY3lFbmFibGVkID0gc3BtLmlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKTsKKyAgICBzcG0uYWRkU2Vuc29yUHJpdmFjeUxpc3RlbmVyKHRoaXMpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6dW5yZWdpc3RlclNlbGYoKSB7CisgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgc3BtOworICAgIHNwbS5yZW1vdmVTZW5zb3JQcml2YWN5TGlzdGVuZXIodGhpcyk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5Ojppc1NlbnNvclByaXZhY3lFbmFibGVkKCkgeworICAgIHJldHVybiBtU2Vuc29yUHJpdmFjeUVuYWJsZWQ7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6b25TZW5zb3JQcml2YWN5Q2hhbmdlZChib29sIGVuYWJsZWQpIHsKKyAgICBtU2Vuc29yUHJpdmFjeUVuYWJsZWQgPSBlbmFibGVkOworICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHNlcnZpY2UtPnVwZGF0ZVVpZFN0YXRlcygpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tICBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZCBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tCiAKIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlKQogICAgIDogVGhyZWFkKGZhbHNlKSwgbU5hbWUobmFtZSksIG1TZXJ2aWNlKHNlcnZpY2UpCiB7Ci0gICAgbXBUb25lR2VuZXJhdG9yID0gTlVMTDsKIH0KIAogCkBAIC02NDksNyArOTk0LDYgQEAKICAgICAgICAgcmVsZWFzZV93YWtlX2xvY2sobU5hbWUuc3RyaW5nKCkpOwogICAgIH0KICAgICBtQXVkaW9Db21tYW5kcy5jbGVhcigpOwotICAgIGRlbGV0ZSBtcFRvbmVHZW5lcmF0b3I7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6Om9uRmlyc3RSZWYoKQpAQCAtNjc0LDY4ICsxMDE4LDU0IEBACiAgICAgICAgICAgICAgICAgbUxhc3RDb21tYW5kID0gY29tbWFuZDsKIAogICAgICAgICAgICAgICAgIHN3aXRjaCAoY29tbWFuZC0+bUNvbW1hbmQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNUQVJUX1RPTkU6IHsKLSAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIFRvbmVEYXRhICpkYXRhID0gKFRvbmVEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzdGFydCB0b25lICVkIG9uIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVR5cGUsIGRhdGEtPm1TdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBkZWxldGUgbXBUb25lR2VuZXJhdG9yOwotICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3IgPSBuZXcgVG9uZUdlbmVyYXRvcihkYXRhLT5tU3RyZWFtLCAxLjApOwotICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3ItPnN0YXJ0VG9uZShkYXRhLT5tVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1RPUF9UT05FOiB7Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzdG9wIHRvbmUiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1wVG9uZUdlbmVyYXRvciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3ItPnN0b3BUb25lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbXBUb25lR2VuZXJhdG9yOwotICAgICAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNFVF9WT0xVTUU6IHsKICAgICAgICAgICAgICAgICAgICAgVm9sdW1lRGF0YSAqZGF0YSA9IChWb2x1bWVEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOwogICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgdm9sdW1lIHN0cmVhbSAlZCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSAlZiwgb3V0cHV0ICVkIiwgZGF0YS0+bVN0cmVhbSwgZGF0YS0+bVZvbHVtZSwgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0U3RyZWFtVm9sdW1lKGRhdGEtPm1TdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Wb2x1bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0VUX1BBUkFNRVRFUlM6IHsKICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyc0RhdGEgKmRhdGEgPSAoUGFyYW1ldGVyc0RhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCBwYXJhbWV0ZXJzIHN0cmluZyAlcywgaW8gJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1LZXlWYWx1ZVBhaXJzLnN0cmluZygpLCBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRQYXJhbWV0ZXJzKGRhdGEtPm1JTywgZGF0YS0+bUtleVZhbHVlUGFpcnMpOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNFVF9WT0lDRV9WT0xVTUU6IHsKICAgICAgICAgICAgICAgICAgICAgVm9pY2VWb2x1bWVEYXRhICpkYXRhID0gKFZvaWNlVm9sdW1lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHZvaWNlIHZvbHVtZSB2b2x1bWUgJWYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Wb2x1bWUpOworICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRWb2ljZVZvbHVtZShkYXRhLT5tVm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTVE9QX09VVFBVVDogewogICAgICAgICAgICAgICAgICAgICBTdG9wT3V0cHV0RGF0YSAqZGF0YSA9IChTdG9wT3V0cHV0RGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RvcCBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0b3Agb3V0cHV0IHBvcnRJZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVBvcnRJZCk7CiAgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb1N0b3BPdXRwdXQoZGF0YS0+bUlPLCBkYXRhLT5tU3RyZWFtLCBkYXRhLT5tU2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9TdG9wT3V0cHV0KGRhdGEtPm1Qb3J0SWQpOwogICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFJFTEVBU0VfT1VUUFVUOiB7CiAgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VPdXRwdXREYXRhICpkYXRhID0gKFJlbGVhc2VPdXRwdXREYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyByZWxlYXNlIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3NpbmcgcmVsZWFzZSBvdXRwdXQgcG9ydElkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tUG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBzdmMtPmRvUmVsZWFzZU91dHB1dChkYXRhLT5tSU8sIGRhdGEtPm1TdHJlYW0sIGRhdGEtPm1TZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb1JlbGVhc2VPdXRwdXQoZGF0YS0+bVBvcnRJZCk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgQ1JFQVRFX0FVRElPX1BBVENIOiB7CkBAIC03NDUsNyArMTA3NSw5IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChhZiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBhZi0+Y3JlYXRlQXVkaW9QYXRjaCgmZGF0YS0+bVBhdGNoLCAmZGF0YS0+bUhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFJFTEVBU0VfQVVESU9fUEFUQ0g6IHsKQEAgLTc1NSw3ICsxMDg3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGFmID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IGFmLT5yZWxlYXNlQXVkaW9QYXRjaChkYXRhLT5tSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgVVBEQVRFX0FVRElPUE9SVF9MSVNUOiB7CkBAIC03NzgsNiArMTExMiwxOCBAQAogICAgICAgICAgICAgICAgICAgICBzdmMtPmRvT25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENIQU5HRURfQVVESU9WT0xVTUVHUk9VUDogeworICAgICAgICAgICAgICAgICAgICBBdWRpb1ZvbHVtZUdyb3VwRGF0YSAqZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QXVkaW9Wb2x1bWVHcm91cERhdGEgKj4oY29tbWFuZC0+bVBhcmFtLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3NpbmcgdXBkYXRlIGF1ZGlvIHZvbHVtZSBncm91cCIpOworICAgICAgICAgICAgICAgICAgICBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9PbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKGRhdGEtPm1Hcm91cCwgZGF0YS0+bUZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTRVRfQVVESU9QT1JUX0NPTkZJRzogewogICAgICAgICAgICAgICAgICAgICBTZXRBdWRpb1BvcnRDb25maWdEYXRhICpkYXRhID0gKFNldEF1ZGlvUG9ydENvbmZpZ0RhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCBwb3J0IGNvbmZpZyIpOwpAQCAtNzg1LDcgKzExMzEsOSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoYWYgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gYWYtPnNldEF1ZGlvUG9ydENvbmZpZygmZGF0YS0+bUNvbmZpZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIERZTl9QT0xJQ1lfTUlYX1NUQVRFX1VQREFURTogewpAQCAtODExLDggKzExNTksOSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICBzdmMtPmRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGRhdGEtPm1FdmVudCwgJmRhdGEtPm1DbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLT5tQ2xpZW50Q29uZmlnLCAmZGF0YS0+bURldmljZUNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tUGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLT5tQ2xpZW50Q29uZmlnLCBkYXRhLT5tQ2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+bURldmljZUNvbmZpZywgZGF0YS0+bUVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVBhdGNoSGFuZGxlLCBkYXRhLT5tU291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CkBAIC05MDAsMjcgKzEyNDksNiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgdHlwZSwKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwotICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU1RBUlRfVE9ORTsKLSAgICBzcDxUb25lRGF0YT4gZGF0YSA9IG5ldyBUb25lRGF0YSgpOwotICAgIGRhdGEtPm1UeXBlID0gdHlwZTsKLSAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOwotICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyB0b25lIHN0YXJ0IHR5cGUgJWQsIHN0cmVhbSAlZCIsIHR5cGUsIHN0cmVhbSk7Ci0gICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0b3BUb25lQ29tbWFuZCgpCi17Ci0gICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwotICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU1RPUF9UT05FOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgdG9uZSBzdG9wIik7Ci0gICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Ci19Ci0KIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp2b2x1bWVDb21tYW5kKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LApAQCAtOTY3LDMzICsxMjk1LDI1IEBACiAgICAgcmV0dXJuIHNlbmRDb21tYW5kKGNvbW1hbmQsIGRlbGF5TXMpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzdG9wT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RvcE91dHB1dENvbW1hbmQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwogICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU1RPUF9PVVRQVVQ7CiAgICAgc3A8U3RvcE91dHB1dERhdGE+IGRhdGEgPSBuZXcgU3RvcE91dHB1dERhdGEoKTsKLSAgICBkYXRhLT5tSU8gPSBvdXRwdXQ7Ci0gICAgZGF0YS0+bVN0cmVhbSA9IHN0cmVhbTsKLSAgICBkYXRhLT5tU2Vzc2lvbiA9IHNlc3Npb247CisgICAgZGF0YS0+bVBvcnRJZCA9IHBvcnRJZDsKICAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc3RvcCBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc3RvcCBvdXRwdXQgcG9ydElkICVkIiwgcG9ydElkKTsKICAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6cmVsZWFzZU91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnJlbGVhc2VPdXRwdXRDb21tYW5kKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKICAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFJFTEVBU0VfT1VUUFVUOwogICAgIHNwPFJlbGVhc2VPdXRwdXREYXRhPiBkYXRhID0gbmV3IFJlbGVhc2VPdXRwdXREYXRhKCk7Ci0gICAgZGF0YS0+bUlPID0gb3V0cHV0OwotICAgIGRhdGEtPm1TdHJlYW0gPSBzdHJlYW07Ci0gICAgZGF0YS0+bVNlc3Npb24gPSBzZXNzaW9uOworICAgIGRhdGEtPm1Qb3J0SWQgPSBwb3J0SWQ7CiAgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHJlbGVhc2Ugb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHJlbGVhc2Ugb3V0cHV0IHBvcnRJZCAlZCIsIHBvcnRJZCk7CiAgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7CiB9CiAKQEAgLTEwNDgsNiArMTM2OCwxOSBAQAogICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpjaGFuZ2VBdWRpb1ZvbHVtZUdyb3VwQ29tbWFuZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+Y29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IENIQU5HRURfQVVESU9WT0xVTUVHUk9VUDsKKyAgICBBdWRpb1ZvbHVtZUdyb3VwRGF0YSAqZGF0YT0gbmV3IEF1ZGlvVm9sdW1lR3JvdXBEYXRhKCk7CisgICAgZGF0YS0+bUdyb3VwID0gZ3JvdXA7CisgICAgZGF0YS0+bUZsYWdzID0gZmxhZ3M7CisgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIGF1ZGlvIHZvbHVtZSBncm91cCBjaGFuZ2VkIik7CisgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzZXRBdWRpb1BvcnRDb25maWdDb21tYW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywgaW50IGRlbGF5TXMpCiB7CkBAIC0xMDc2LDkgKzE0MDksMTQgQEAKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6cmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZUNvbW1hbmQoCi0gICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKIHsKICAgICBzcDxBdWRpb0NvbW1hbmQ+Y29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKICAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFJFQ09SRElOR19DT05GSUdVUkFUSU9OX1VQREFURTsKQEAgLTEwODYsOCArMTQyNCwxMSBAQAogICAgIGRhdGEtPm1FdmVudCA9IGV2ZW50OwogICAgIGRhdGEtPm1DbGllbnRJbmZvID0gKmNsaWVudEluZm87CiAgICAgZGF0YS0+bUNsaWVudENvbmZpZyA9ICpjbGllbnRDb25maWc7CisgICAgZGF0YS0+bUNsaWVudEVmZmVjdHMgPSBjbGllbnRFZmZlY3RzOwogICAgIGRhdGEtPm1EZXZpY2VDb25maWcgPSAqZGV2aWNlQ29uZmlnOworICAgIGRhdGEtPm1FZmZlY3RzID0gZWZmZWN0czsKICAgICBkYXRhLT5tUGF0Y2hIYW5kbGUgPSBwYXRjaEhhbmRsZTsKKyAgICBkYXRhLT5tU291cmNlID0gc291cmNlOwogICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CiAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWNvcmRpbmcgY29uZmlndXJhdGlvbiB1cGRhdGUgZXZlbnQgJWQsIHNvdXJjZSAlZCB1aWQgJXUiLAogICAgICAgICAgICAgZXZlbnQsIGNsaWVudEluZm8tPnNvdXJjZSwgY2xpZW50SW5mby0+dWlkKTsKQEAgLTEyMTIsNiArMTU1Myw3IEBACiAgICAgICAgICAgICAgICAgcGF0Y2ggPSAoKENyZWF0ZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpKS0+bVBhdGNoOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBoYW5kbGUgPSAoKFJlbGVhc2VBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKSktPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZwYXRjaCwgMCwgc2l6ZW9mKHBhdGNoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUyOwogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoMjsKQEAgLTEyNTYsOCArMTU5OCw2IEBACiAKICAgICAgICAgfSBicmVhazsKIAotICAgICAgICBjYXNlIFNUQVJUX1RPTkU6Ci0gICAgICAgIGNhc2UgU1RPUF9UT05FOgogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTEzMzAsMjcgKzE2NzAsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LCBkZWxheU1zKTsKIH0KIAotaW50IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICBpZiAodG9uZSAhPSBBVURJT19QT0xJQ1lfVE9ORV9JTl9DQUxMX05PVElGSUNBVElPTikgewotICAgICAgICBBTE9HRSgic3RhcnRUb25lOiBpbGxlZ2FsIHRvbmUgcmVxdWVzdGVkICglZCkiLCB0b25lKTsKLSAgICB9Ci0gICAgaWYgKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkgewotICAgICAgICBBTE9HRSgic3RhcnRUb25lOiBpbGxlZ2FsIHN0cmVhbSAoJWQpIHJlcXVlc3RlZCBmb3IgdG9uZSAlZCIsIHN0cmVhbSwKLSAgICAgICAgICAgIHRvbmUpOwotICAgIH0KLSAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5zdGFydFRvbmVDb21tYW5kKFRvbmVHZW5lcmF0b3I6OlRPTkVfU1VQX0NBTExfV0FJVElORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcFRvbmUoKQotewotICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPnN0b3BUb25lQ29tbWFuZCgpOwotICAgIHJldHVybiAwOwotfQotCiBpbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zKQogewogICAgIHJldHVybiAoaW50KW1BdWRpb0NvbW1hbmRUaHJlYWQtPnZvaWNlVm9sdW1lQ29tbWFuZCh2b2x1bWUsIGRlbGF5TXMpOwpAQCAtMTQwNiw5ICsxNzI1LDYgQEAKIGludCBhcHNfc2V0X3N0cmVhbV92b2x1bWUodm9pZCAqc2VydmljZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5X21zKTsKLWludCBhcHNfc3RhcnRfdG9uZSh2b2lkICpzZXJ2aWNlLCBhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci1pbnQgYXBzX3N0b3BfdG9uZSh2b2lkICpzZXJ2aWNlKTsKIGludCBhcHNfc2V0X3ZvaWNlX3ZvbHVtZSh2b2lkICpzZXJ2aWNlLCBmbG9hdCB2b2x1bWUsIGludCBkZWxheV9tcyk7CiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaAppbmRleCA0MDdkN2E1Li5hMmU3NWNkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTMxLDE1ICszMSwxNSBAQAogI2luY2x1ZGUgPG1lZGlhL1RvbmVHZW5lcmF0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lFZmZlY3RzLmgiCiAjaW5jbHVkZSAibWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9CblNlbnNvclByaXZhY3lMaXN0ZW5lci5oPgogCiAjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNsYXNzIEF1ZGlvUG9saWN5U2VydmljZSA6CkBAIC02MiwzNiArNjIsMzMgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7CiAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSk7CiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCkBAIC0xMDIsOCArOTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzaWxlbmNlZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLApAQCAtMTE2LDYgKzExMiwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgpOworCiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CiAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CiAKQEAgLTEzNCw2ICsxNDEsMjEgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCk7CisKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBvblRyYW5zYWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCkBAIC0xNTksMTAgKzE4MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BUb25lKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7CiAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAmY29uZmlnKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKQEAgLTE4Miw2ICsyMDQsOCBAQAogCiAgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKTsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKTsKQEAgLTE5MiwxMCArMjE2LDE0IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyUG9saWN5TWl4ZXMoY29uc3QgVmVjdG9yPEF1ZGlvTWl4PiYgbWl4ZXMsIGJvb2wgcmVnaXN0cmF0aW9uKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTW9ubyhib29sIG1vbm8pOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTW9ubyhib29sICptb25vKTsKQEAgLTIwNywxNCArMjM1LDI2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnN1cnJvdW5kRm9ybWF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzdXJyb3VuZEZvcm1hdHNFbmFibGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwb3J0ZWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpOwogCi0gICAgICAgICAgICBzdGF0dXNfdCBkb1N0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgICAgIHZvaWQgZG9SZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcyk7CisKKyAgICB2aXJ0dWFsIGJvb2wgICAgIGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCAmdm9sdW1lR3JvdXApOworCisgICAgICAgICAgICBzdGF0dXNfdCBkb1N0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgICAgICAgICAgdm9pZCBkb1JlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBjbGllbnRDcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCkBAIC0yMjQsNyArMjY0LDcgQEAKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xpZW50U2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOwogCi0gICAgICAgICAgICB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCh1aWRfdCB1aWQpOworICAgICAgICAgICAgdm9pZCByZW1vdmVOb3RpZmljYXRpb25DbGllbnQodWlkX3QgdWlkLCBwaWRfdCBwaWQpOwogICAgICAgICAgICAgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgICAgIHZvaWQgZG9PbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgICAgIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwpAQCAtMjMyLDEyICsyNzIsMjUgQEAKIAogICAgICAgICAgICAgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgICAgICB2b2lkIGRvT25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOwotICAgICAgICAgICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIHZvaWQgZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CisgICAgICAgICAgICB2b2lkIGRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKKworICAgICAgICAgICAgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpOworICAgICAgICAgICAgdm9pZCBkb09uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncyk7CiAKIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeVNlcnZpY2UoKSBBTkRST0lEX0FQSTsKQEAgLTI0OSw3ICszMDIsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2hlbGxDb21tYW5kKGludCBpbiwgaW50IG91dCwgaW50IGVyciwgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKICAgICAvLyBTZXRzIHdoZXRoZXIgdGhlIGdpdmVuIFVJRCByZWNvcmRzIG9ubHkgc2lsZW5jZQotICAgIHZpcnR1YWwgdm9pZCBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpOworICAgIHZpcnR1YWwgdm9pZCBzZXRBcHBTdGF0ZV9sKHVpZF90IHVpZCwgYXBwX3N0YXRlX3Qgc3RhdGUpOwogCiAgICAgLy8gT3ZlcnJpZGVzIHRoZSBVSUQgc3RhdGUgYXMgaWYgaXQgaXMgaWRsZQogICAgIHN0YXR1c190IGhhbmRsZVNldFVpZFN0YXRlKFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGludCBlcnIpOwpAQCAtMjY1LDYgKzMxOCwxOCBAQAogCiAgICAgc3RkOjpzdHJpbmcgZ2V0RGV2aWNlVHlwZVN0ckZvclBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKKyAgICBzdGF0dXNfdCBnZXRBdWRpb1BvbGljeUVmZmVjdHMoc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPiYgYXVkaW9Qb2xpY3lFZmZlY3RzKTsKKworICAgIGFwcF9zdGF0ZV90IGFwbVN0YXRGcm9tQW1TdGF0ZShpbnQgYW1TdGF0ZSk7CisKKyAgICB2b2lkIHVwZGF0ZVVpZFN0YXRlcygpOworICAgIHZvaWQgdXBkYXRlVWlkU3RhdGVzX2woKTsKKworICAgIHZvaWQgc2lsZW5jZUFsbFJlY29yZGluZ3NfbCgpOworCisgICAgc3RhdGljIGJvb2wgaXNQcml2YWN5U2Vuc2l0aXZlU291cmNlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CisgICAgc3RhdGljIGJvb2wgaXNWaXJ0dWFsU291cmNlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CisKICAgICAvLyBJZiByZWNvcmRpbmcgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIFVJRCBpcyBhbGxvd2VkIHRvIGRvIHRoYXQuIElmIHRoZSBVSUQgaXMgaWRsZQogICAgIC8vIHRoZW4gaXQgY2Fubm90IHJlY29yZCBhbmQgZ2V0cyBidWZmZXJzIHdpdGggemVyb3MgLSBzaWxlbmNlLiBBcyBzb29uIGFzIHRoZSBVSUQKICAgICAvLyB0cmFuc2l0aW9ucyB0byBhbiBhY3RpdmUgc3RhdGUgd2Ugd2lsbCBzdGFydCByZXBvcnRpbmcgYnVmZmVycyB3aXRoIGRhdGEuIFRoaXMgYXBwcm9hY2gKQEAgLTI3NCw3ICszMzksNyBAQAogICAgIGNsYXNzIFVpZFBvbGljeSA6IHB1YmxpYyBCblVpZE9ic2VydmVyLCBwdWJsaWMgdmlydHVhbCBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CiAgICAgcHVibGljOgogICAgICAgICBleHBsaWNpdCBVaWRQb2xpY3kod3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlKQotICAgICAgICAgICAgICAgIDogbVNlcnZpY2Uoc2VydmljZSksIG1PYnNlcnZlclJlZ2lzdGVyZWQoZmFsc2UpIHt9CisgICAgICAgICAgICAgICAgOiBtU2VydmljZShzZXJ2aWNlKSwgbU9ic2VydmVyUmVnaXN0ZXJlZChmYWxzZSksIG1Bc3Npc3RhbnRVaWQoMCkge30KIAogICAgICAgICB2b2lkIHJlZ2lzdGVyU2VsZigpOwogICAgICAgICB2b2lkIHVucmVnaXN0ZXJTZWxmKCk7CkBAIC0yODMsMzQgKzM0OCw2MyBAQAogICAgICAgICB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJndobykgb3ZlcnJpZGU7CiAKICAgICAgICAgYm9vbCBpc1VpZEFjdGl2ZSh1aWRfdCB1aWQpOworICAgICAgICBpbnQgZ2V0VWlkU3RhdGUodWlkX3QgdWlkKTsKKyAgICAgICAgdm9pZCBzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKSB7IG1Bc3Npc3RhbnRVaWQgPSB1aWQ7IH0KKyAgICAgICAgYm9vbCBpc0Fzc2lzdGFudFVpZCh1aWRfdCB1aWQpIHsgcmV0dXJuIHVpZCA9PSBtQXNzaXN0YW50VWlkOyB9CisgICAgICAgIHZvaWQgc2V0QTExeVVpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKSB7IG1BMTF5VWlkcy5jbGVhcigpOyBtQTExeVVpZHMgPSB1aWRzOyB9CisgICAgICAgIGJvb2wgaXNBMTF5VWlkKHVpZF90IHVpZCk7CisgICAgICAgIGJvb2wgaXNBMTF5T25Ub3AoKTsKIAogICAgICAgICAvLyBCblVpZE9ic2VydmVyIGltcGxlbWVudGF0aW9uCiAgICAgICAgIHZvaWQgb25VaWRBY3RpdmUodWlkX3QgdWlkKSBvdmVycmlkZTsKICAgICAgICAgdm9pZCBvblVpZEdvbmUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKSBvdmVycmlkZTsKICAgICAgICAgdm9pZCBvblVpZElkbGUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCBvblVpZFN0YXRlQ2hhbmdlZCh1aWRfdCB1aWQsIGludDMyX3QgcHJvY1N0YXRlLCBpbnQ2NF90IHByb2NTdGF0ZVNlcSk7CiAKICAgICAgICAgdm9pZCBhZGRPdmVycmlkZVVpZCh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlKSB7IHVwZGF0ZU92ZXJyaWRlVWlkKHVpZCwgYWN0aXZlLCB0cnVlKTsgfQogICAgICAgICB2b2lkIHJlbW92ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCkgeyB1cGRhdGVPdmVycmlkZVVpZCh1aWQsIGZhbHNlLCBmYWxzZSk7IH0KIAotICAgIHByaXZhdGU6Ci0gICAgICAgIGJvb2wgaXNTZXJ2aWNlVWlkKHVpZF90IHVpZCkgY29uc3Q7Ci0gICAgICAgIHZvaWQgbm90aWZ5U2VydmljZSh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlKTsKKyAgICAgICAgdm9pZCB1cGRhdGVVaWQoc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4gKnVpZHMsCisgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGludCBzdGF0ZSwgYm9vbCBpbnNlcnQpOworCisgICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgbm90aWZ5U2VydmljZSgpOwogICAgICAgICB2b2lkIHVwZGF0ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KTsKLSAgICAgICAgdm9pZCB1cGRhdGVVaWRDYWNoZSh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCk7Ci0gICAgICAgIHZvaWQgdXBkYXRlVWlkTG9ja2VkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgYm9vbD4gKnVpZHMsCi0gICAgICAgICAgICAgICAgdWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQsIGJvb2wgKndhc1RoZXJlLCBib29sICp3YXNBY3RpdmUpOworICAgICAgICB2b2lkIHVwZGF0ZVVpZExvY2tlZChzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiAqdWlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgaW50IHN0YXRlLCBib29sIGluc2VydCk7CisgICAgICAgIHZvaWQgY2hlY2tSZWdpc3RlcmVkKCk7CiAKICAgICAgICAgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBtU2VydmljZTsKICAgICAgICAgTXV0ZXggbUxvY2s7CiAgICAgICAgIGJvb2wgbU9ic2VydmVyUmVnaXN0ZXJlZDsKLSAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBib29sPiBtT3ZlcnJpZGVVaWRzOwotICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIGJvb2w+IG1DYWNoZWRVaWRzOworICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiBtT3ZlcnJpZGVVaWRzOworICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiBtQ2FjaGVkVWlkczsKKyAgICAgICAgdWlkX3QgbUFzc2lzdGFudFVpZDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWlkX3Q+IG1BMTF5VWlkczsKICAgICB9OwogCi0gICAgLy8gVGhyZWFkIHVzZWQgZm9yIHRvbmUgcGxheWJhY2sgYW5kIHRvIHNlbmQgYXVkaW8gY29uZmlnIGNvbW1hbmRzIHRvIGF1ZGlvIGZsaW5nZXIKLSAgICAvLyBGb3IgdG9uZSBwbGF5YmFjaywgdXNpbmcgYSBzZXBhcmF0ZSB0aHJlYWQgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGRlYWRsb2NrIHdpdGggbUxvY2sgYmVjYXVzZQotICAgIC8vIHN0YXJ0VG9uZSgpIGFuZCBzdG9wVG9uZSgpIGFyZSBub3JtYWxseSBjYWxsZWQgd2l0aCBtTG9jayBsb2NrZWQgYW5kIHJlcXVlc3RpbmcgYSB0b25lIHN0YXJ0Ci0gICAgLy8gb3Igc3RvcCB3aWxsIGNhdXNlIGNhbGxzIHRvIEF1ZGlvUG9saWN5U2VydmljZSBhbmQgYW4gYXR0ZW1wdCB0byBsb2NrIG1Mb2NrLgorICAgIC8vIElmIHNlbnNvciBwcml2YWN5IGlzIGVuYWJsZWQgdGhlbiBhbGwgYXBwcywgaW5jbHVkaW5nIHRob3NlIHRoYXQgYXJlIGFjdGl2ZSwgc2hvdWxkIGJlCisgICAgLy8gcHJldmVudGVkIGZyb20gcmVjb3JkaW5nLiBUaGlzIGlzIGhhbmRsZWQgc2ltaWxhciB0byBpZGxlIFVJRHMsIGFueSBhcHAgdGhhdCBhdHRlbXB0cworICAgIC8vIHRvIHJlY29yZCB3aGlsZSBzZW5zb3IgcHJpdmFjeSBpcyBlbmFibGVkIHdpbGwgcmVjZWl2ZSBidWZmZXJzIHdpdGggemVyb3MuIEFzIHNvb24gYXMKKyAgICAvLyBzZW5zb3IgcHJpdmFjeSBpcyBkaXNhYmxlZCBhY3RpdmUgYXBwcyB3aWxsIHJlY2VpdmUgdGhlIGV4cGVjdGVkIGRhdGEgd2hlbiByZWNvcmRpbmcuCisgICAgY2xhc3MgU2Vuc29yUHJpdmFjeVBvbGljeSA6IHB1YmxpYyBoYXJkd2FyZTo6Qm5TZW5zb3JQcml2YWN5TGlzdGVuZXIgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBleHBsaWNpdCBTZW5zb3JQcml2YWN5UG9saWN5KHdwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSkKKyAgICAgICAgICAgICAgICAgICAgOiBtU2VydmljZShzZXJ2aWNlKSB7fQorCisgICAgICAgICAgICB2b2lkIHJlZ2lzdGVyU2VsZigpOworICAgICAgICAgICAgdm9pZCB1bnJlZ2lzdGVyU2VsZigpOworCisgICAgICAgICAgICBib29sIGlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKTsKKworICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgb25TZW5zb3JQcml2YWN5Q2hhbmdlZChib29sIGVuYWJsZWQpOworCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB3cDxBdWRpb1BvbGljeVNlcnZpY2U+IG1TZXJ2aWNlOworICAgICAgICAgICAgc3RkOjphdG9taWNfYm9vbCBtU2Vuc29yUHJpdmFjeUVuYWJsZWQ7CisgICAgfTsKKworICAgIC8vIFRocmVhZCB1c2VkIHRvIHNlbmQgYXVkaW8gY29uZmlnIGNvbW1hbmRzIHRvIGF1ZGlvIGZsaW5nZXIKICAgICAvLyBGb3IgYXVkaW8gY29uZmlnIGNvbW1hbmRzLCBpdCBpcyBuZWNlc3NhcnkgYmVjYXVzZSBhdWRpbyBmbGluZ2VyIHJlcXVpcmVzIHRoYXQgdGhlIGNhbGxpbmcKICAgICAvLyBwcm9jZXNzICh1c2VyKSBoYXMgcGVybWlzc2lvbiB0byBtb2RpZnkgYXVkaW8gc2V0dGluZ3MuCiAgICAgY2xhc3MgQXVkaW9Db21tYW5kVGhyZWFkIDogcHVibGljIFRocmVhZCB7CkBAIC0zMTksOCArNDEzLDYgQEAKIAogICAgICAgICAvLyBjb21tYW5kcyBmb3IgdG9uZSBBdWRpb0NvbW1hbmQKICAgICAgICAgZW51bSB7Ci0gICAgICAgICAgICBTVEFSVF9UT05FLAotICAgICAgICAgICAgU1RPUF9UT05FLAogICAgICAgICAgICAgU0VUX1ZPTFVNRSwKICAgICAgICAgICAgIFNFVF9QQVJBTUVURVJTLAogICAgICAgICAgICAgU0VUX1ZPSUNFX1ZPTFVNRSwKQEAgLTMzMCw2ICs0MjIsNyBAQAogICAgICAgICAgICAgUkVMRUFTRV9BVURJT19QQVRDSCwKICAgICAgICAgICAgIFVQREFURV9BVURJT1BPUlRfTElTVCwKICAgICAgICAgICAgIFVQREFURV9BVURJT1BBVENIX0xJU1QsCisgICAgICAgICAgICBDSEFOR0VEX0FVRElPVk9MVU1FR1JPVVAsCiAgICAgICAgICAgICBTRVRfQVVESU9QT1JUX0NPTkZJRywKICAgICAgICAgICAgIERZTl9QT0xJQ1lfTUlYX1NUQVRFX1VQREFURSwKICAgICAgICAgICAgIFJFQ09SRElOR19DT05GSUdVUkFUSU9OX1VQREFURQpAQCAtMzQ1LDIwICs0MzgsMTMgQEAKICAgICAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwogCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGV4aXQoKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3BUb25lQ29tbWFuZCgpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB2b2x1bWVDb21tYW5kKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2b2x1bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgaW50IGRlbGF5TXMgPSAwKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgcGFyYW1ldGVyc0NvbW1hbmQoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleVZhbHVlUGFpcnMsIGludCBkZWxheU1zID0gMCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHZvaWNlVm9sdW1lQ29tbWFuZChmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVsZWFzZU91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wT3V0cHV0Q29tbWFuZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbGVhc2VPdXRwdXRDb21tYW5kKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZENvbW1hbmQoc3A8QXVkaW9Db21tYW5kPiYgY29tbWFuZCwgaW50IGRlbGF5TXMgPSAwKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW5zZXJ0Q29tbWFuZF9sKHNwPEF1ZGlvQ29tbWFuZD4mIGNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hDb21tYW5kKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCkBAIC0zNjgsMTUgKzQ1NCwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVBdWRpb1BvcnRMaXN0Q29tbWFuZCgpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVBdWRpb1BhdGNoTGlzdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgY2hhbmdlQXVkaW9Wb2x1bWVHcm91cENvbW1hbmQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncyk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldEF1ZGlvUG9ydENvbmZpZ0NvbW1hbmQoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGVDb21tYW5kKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlQ29tbWFuZChjb25zdCBTdHJpbmc4JiByZWdJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZUNvbW1hbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGluc2VydENvbW1hbmRfbChBdWRpb0NvbW1hbmQgKmNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7CiAgICAgcHJpdmF0ZToKICAgICAgICAgY2xhc3MgQXVkaW9Db21tYW5kRGF0YTsKQEAgLTM5MCw3ICs0ODEsNyBAQAogCiAgICAgICAgICAgICB2b2lkIGR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CiAKLSAgICAgICAgICAgIGludCBtQ29tbWFuZDsgICAvLyBTVEFSVF9UT05FLCBTVE9QX1RPTkUgLi4uCisgICAgICAgICAgICBpbnQgbUNvbW1hbmQ7ICAgLy8gU0VUX1ZPTFVNRSwgU0VUX1BBUkFNRVRFUlMuLi4KICAgICAgICAgICAgIG5zZWNzX3QgbVRpbWU7ICAvLyB0aW1lIHN0YW1wCiAgICAgICAgICAgICBNdXRleCBtTG9jazsgICAgLy8gbXV0ZXggYXNzb2NpYXRlZCB0byBtQ29uZAogICAgICAgICAgICAgQ29uZGl0aW9uIG1Db25kOyAvLyBjb25kaXRpb24gZm9yIHN0YXR1cyByZXR1cm4KQEAgLTQwNiwxMiArNDk3LDYgQEAKICAgICAgICAgICAgIEF1ZGlvQ29tbWFuZERhdGEoKSB7fQogICAgICAgICB9OwogCi0gICAgICAgIGNsYXNzIFRvbmVEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgbVR5cGU7IC8vIHRvbmUgdHlwZSAoU1RBUlRfVE9ORSBvbmx5KQotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOyAgICAvLyBzdHJlYW0gdHlwZSAoU1RBUlRfVE9ORSBvbmx5KQotICAgICAgICB9OwotCiAgICAgICAgIGNsYXNzIFZvbHVtZURhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CiAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsKQEAgLTQzMiwxNiArNTE3LDEyIEBACiAKICAgICAgICAgY2xhc3MgU3RvcE91dHB1dERhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CiAgICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1JTzsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbjsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbVBvcnRJZDsKICAgICAgICAgfTsKIAogICAgICAgICBjbGFzcyBSZWxlYXNlT3V0cHV0RGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKICAgICAgICAgcHVibGljOgotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IG1TZXNzaW9uOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUG9ydElkOwogICAgICAgICB9OwogCiAgICAgICAgIGNsYXNzIENyZWF0ZUF1ZGlvUGF0Y2hEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewpAQCAtNDU1LDYgKzUzNiwxMiBAQAogICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbUhhbmRsZTsKICAgICAgICAgfTsKIAorICAgICAgICBjbGFzcyBBdWRpb1ZvbHVtZUdyb3VwRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgbUdyb3VwOworICAgICAgICAgICAgaW50IG1GbGFnczsKKyAgICAgICAgfTsKKwogICAgICAgICBjbGFzcyBTZXRBdWRpb1BvcnRDb25maWdEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewogICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbUNvbmZpZzsKQEAgLTQ3MSwxNCArNTU4LDE2IEBACiAgICAgICAgICAgICBpbnQgbUV2ZW50OwogICAgICAgICAgICAgcmVjb3JkX2NsaWVudF9pbmZvX3QgbUNsaWVudEluZm87CiAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgbUNsaWVudENvbmZpZzsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IG1DbGllbnRFZmZlY3RzOwogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIG1EZXZpY2VDb25maWc7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBtRWZmZWN0czsKICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IG1Tb3VyY2U7CiAgICAgICAgIH07CiAKICAgICAgICAgTXV0ZXggICBtTG9jazsKICAgICAgICAgQ29uZGl0aW9uIG1XYWl0V29ya0NWOwogICAgICAgICBWZWN0b3IgPCBzcDxBdWRpb0NvbW1hbmQ+ID4gbUF1ZGlvQ29tbWFuZHM7IC8vIGxpc3Qgb2YgcGVuZGluZyBjb21tYW5kcwotICAgICAgICBUb25lR2VuZXJhdG9yICptcFRvbmVHZW5lcmF0b3I7ICAgICAvLyB0aGUgdG9uZSBnZW5lcmF0b3IKICAgICAgICAgc3A8QXVkaW9Db21tYW5kPiBtTGFzdENvbW1hbmQ7ICAgICAgLy8gbGFzdCBwcm9jZXNzZWQgY29tbWFuZCAodXNlZCBieSBkdW1wKQogICAgICAgICBTdHJpbmc4IG1OYW1lOyAgICAgICAgICAgICAgICAgICAgICAvLyBzdHJpbmcgdXNlZCBieSB3YWtlIGxvY2sgZm8gZGVsYXllZCBjb21tYW5kcwogICAgICAgICB3cDxBdWRpb1BvbGljeVNlcnZpY2U+IG1TZXJ2aWNlOwpAQCAtNTUzLDExICs2NDIsNiBAQAogICAgICAgICAvLyBmdW5jdGlvbiBlbmFibGluZyB0byByZWNlaXZlIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9ucyBkaXJlY3RseSBmcm9tIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSB0byBhdWRpbyBwb2xpY3kgbWFuYWdlci4KICAgICAgICAgdmlydHVhbCBTdHJpbmc4IGdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleXMpOwogCi0gICAgICAgIC8vIHJlcXVlc3QgdGhlIHBsYXliYWNrIG9mIGEgdG9uZSBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbTogdXNlZCBmb3IgaW5zdGFuY2UgdG8gcmVwbGFjZSBub3RpZmljYXRpb24gc291bmRzIHdoZW4gcGxheWluZwotICAgICAgICAvLyBvdmVyIGEgdGVsZXBob255IGRldmljZSBkdXJpbmcgYSBwaG9uZSBjYWxsLgotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wVG9uZSgpOwotCiAgICAgICAgIC8vIHNldCBkb3duIGxpbmsgYXVkaW8gdm9sdW1lLgogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKTsKIApAQCAtNTgyLDkgKzY2NiwxNSBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpOwogCiAgICAgICAgIHZpcnR1YWwgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdXNlX3QgdXNlKTsKIApAQCAtNTk3LDE4ICs2ODcsMjkgQEAKICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ2xpZW50KGNvbnN0IHNwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwgcGlkX3QgcGlkKTsKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+Tm90aWZpY2F0aW9uQ2xpZW50KCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBzZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBzZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVVpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAogICAgICAgICAgICAgICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CkBAIC02MTksMzQgKzcyMCw2MSBAQAogCiAgICAgICAgIGNvbnN0IHdwPEF1ZGlvUG9saWN5U2VydmljZT4gICAgICAgIG1TZXJ2aWNlOwogICAgICAgICBjb25zdCB1aWRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtVWlkOworICAgICAgICBjb25zdCBwaWRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtUGlkOwogICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OwogICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZDsKKyAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkOworICAgIH07CisKKyAgICBjbGFzcyBBdWRpb0NsaWVudCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgICAgICAgICBBdWRpb0NsaWVudChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbywgdWlkX3QgdWlkLCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwgaW8oaW8pLCB1aWQodWlkKSwgcGlkKHBpZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24oc2Vzc2lvbiksIGRldmljZUlkKGRldmljZUlkKSwgYWN0aXZlKGZhbHNlKSB7fQorICAgICAgICAgICAgICAgIH5BdWRpb0NsaWVudCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzOyAvLyBzb3VyY2UsIGZsYWdzIC4uLgorICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbzsgICAgICAgICAgLy8gYXVkaW8gSEFMIHN0cmVhbSBJTyBoYW5kbGUKKyAgICAgICAgY29uc3QgdWlkX3QgdWlkOyAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBVSUQKKyAgICAgICAgY29uc3QgcGlkX3QgcGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBQSUQKKyAgICAgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb247ICAgICAgIC8vIGF1ZGlvIHNlc3Npb24gSUQKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsgIC8vIHNlbGVjdGVkIGlucHV0IGRldmljZSBwb3J0IElECisgICAgICAgICAgICAgIGJvb2wgYWN0aXZlOyAgICAgICAgICAgICAgICAgICAvLyBQbGF5YmFjay9DYXB0dXJlIGlzIGFjdGl2ZSBvciBpbmFjdGl2ZQogICAgIH07CiAKICAgICAvLyAtLS0gQXVkaW9SZWNvcmRDbGllbnQgLS0tCiAgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgZWFjaCByZWdpc3RlcmVkIEF1ZGlvUmVjb3JkIGNsaWVudAogICAgIC8vIChiZXR3ZWVuIGNhbGxzIHRvIGdldElucHV0Rm9yQXR0cigpIGFuZCByZWxlYXNlSW5wdXQoKSkKLSAgICBjbGFzcyBBdWRpb1JlY29yZENsaWVudCA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBjbGFzcyBBdWRpb1JlY29yZENsaWVudCA6IHB1YmxpYyBBdWRpb0NsaWVudCB7CiAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkQ2xpZW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LCB1aWRfdCB1aWQsIHBpZF90IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaW5wdXQpLCB1aWQodWlkKSwgcGlkKHBpZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSksIHNlc3Npb24oc2Vzc2lvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZShmYWxzZSksIGlzQ29uY3VycmVudChmYWxzZSksIGlzVmlydHVhbERldmljZShmYWxzZSkge30KLSAgICAgICAgdmlydHVhbCB+QXVkaW9SZWNvcmRDbGllbnQoKSB7fQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbywgdWlkX3QgdWlkLCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSkgOgorICAgICAgICAgICAgICAgICAgICBBdWRpb0NsaWVudChhdHRyaWJ1dGVzLCBpbywgdWlkLCBwaWQsIHNlc3Npb24sIGRldmljZUlkKSwKKyAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwgc3RhcnRUaW1lTnMoMCkge30KKyAgICAgICAgICAgICAgICB+QXVkaW9SZWNvcmRDbGllbnQoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKLSAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXM7IC8vIHNvdXJjZSwgZmxhZ3MgLi4uCi0gICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0OyAgICAgICAvLyBhdWRpbyBIQUwgaW5wdXQgSU8gaGFuZGxlCi0gICAgICAgIGNvbnN0IHVpZF90IHVpZDsgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgVUlECi0gICAgICAgIGNvbnN0IHBpZF90IHBpZDsgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgUElECiAgICAgICAgIGNvbnN0IFN0cmluZzE2IG9wUGFja2FnZU5hbWU7ICAgICAgICAvLyBjbGllbnQgcGFja2FnZSBuYW1lCi0gICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uOyAgICAgICAvLyBhdWRpbyBzZXNzaW9uIElECi0gICAgICAgIGJvb2wgYWN0aXZlOyAgICAgICAgICAgICAgICAgICAvLyBDYXB0dXJlIGlzIGFjdGl2ZSBvciBpbmFjdGl2ZQotICAgICAgICBib29sIGlzQ29uY3VycmVudDsgICAgICAgICAgICAgLy8gaXMgYWxsb3dlZCB0byBjb25jdXJyZW50IGNhcHR1cmUKLSAgICAgICAgYm9vbCBpc1ZpcnR1YWxEZXZpY2U7ICAgICAgICAgIC8vIHVzZXMgdmlydHVhbCBkZXZpY2U6IHVwZGF0ZWQgYnkgQVBNOjpnZXRJbnB1dEZvckF0dHIoKQotICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkOyAgLy8gc2VsZWN0ZWQgaW5wdXQgZGV2aWNlIHBvcnQgSUQKKyAgICAgICAgbnNlY3NfdCBzdGFydFRpbWVOczsKKyAgICB9OworCisgICAgLy8gLS0tIEF1ZGlvUGxheWJhY2tDbGllbnQgLS0tCisgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgZWFjaCByZWdpc3RlcmVkIEF1ZGlvVHJhY2sgY2xpZW50CisgICAgLy8gKGJldHdlZW4gY2FsbHMgdG8gZ2V0T3V0cHV0Rm9yQXR0cigpIGFuZCByZWxlYXNlT3V0cHV0KCkpCisgICAgY2xhc3MgQXVkaW9QbGF5YmFja0NsaWVudCA6IHB1YmxpYyBBdWRpb0NsaWVudCB7CisgICAgcHVibGljOgorICAgICAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tDbGllbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW8sIHVpZF90IHVpZCwgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA6CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvQ2xpZW50KGF0dHJpYnV0ZXMsIGlvLCB1aWQsIHBpZCwgc2Vzc2lvbiwgZGV2aWNlSWQpLCBzdHJlYW0oc3RyZWFtKSB7fQorICAgICAgICAgICAgICAgIH5BdWRpb1BsYXliYWNrQ2xpZW50KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtOwogICAgIH07CiAKICAgICAvLyBBIGNsYXNzIGF1dG9tYXRpY2FsbHkgY2xlYXJpbmcgYW5kIHJlc3RvcmluZyBiaW5kZXIgY2FsbGVyIGlkZW50aXR5IGluc2lkZQpAQCAtNjc2LDIxICs4MDQsMjUgQEAKICAgICAvLyBtTG9jayBwcm90ZWN0cyBBdWRpb1BvbGljeU1hbmFnZXIgbWV0aG9kcyB0aGF0IGNhbiBjYWxsIGludG8gYXVkaW8gZmxpbmdlcgogICAgIC8vIGFuZCBwb3NzaWJseSBiYWNrIGluIHRvIGF1ZGlvIHBvbGljeSBzZXJ2aWNlIGFuZCBhY3F1aXJlIG1FZmZlY3RzTG9jay4KICAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1BdWRpb0NvbW1hbmRUaHJlYWQ7ICAgICAvLyBhdWRpbyBjb21tYW5kcyB0aHJlYWQKLSAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1Ub25lUGxheWJhY2tUaHJlYWQ7ICAgICAvLyB0b25lIHBsYXliYWNrIHRocmVhZAogICAgIHNwPEF1ZGlvQ29tbWFuZFRocmVhZD4gbU91dHB1dENvbW1hbmRUaHJlYWQ7ICAgIC8vIHByb2Nlc3Mgc3RvcCBhbmQgcmVsZWFzZSBvdXRwdXQKICAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5X2RldmljZSAqbXBBdWRpb1BvbGljeURldjsKICAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5ICptcEF1ZGlvUG9saWN5OwogICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlICptQXVkaW9Qb2xpY3lNYW5hZ2VyOwogICAgIEF1ZGlvUG9saWN5Q2xpZW50ICptQXVkaW9Qb2xpY3lDbGllbnQ7CiAKLSAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHVpZF90LCBzcDxOb3RpZmljYXRpb25DbGllbnQ+ID4gICAgbU5vdGlmaWNhdGlvbkNsaWVudHM7CisgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBpbnQ2NF90LCBzcDxOb3RpZmljYXRpb25DbGllbnQ+ID4gICAgbU5vdGlmaWNhdGlvbkNsaWVudHM7CiAgICAgTXV0ZXggbU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrOyAgLy8gcHJvdGVjdHMgbU5vdGlmaWNhdGlvbkNsaWVudHMKICAgICAvLyBNYW5hZ2UgYWxsIGVmZmVjdHMgY29uZmlndXJlZCBpbiBhdWRpb19lZmZlY3RzLmNvbmYKICAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+IG1BdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgYXVkaW9fbW9kZV90IG1QaG9uZVN0YXRlOwogCiAgICAgc3A8VWlkUG9saWN5PiBtVWlkUG9saWN5OworICAgIHNwPFNlbnNvclByaXZhY3lQb2xpY3k+IG1TZW5zb3JQcml2YWN5UG9saWN5OworCiAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19wb3J0X2hhbmRsZV90LCBzcDxBdWRpb1JlY29yZENsaWVudD4gPiAgIG1BdWRpb1JlY29yZENsaWVudHM7CisgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19wb3J0X2hhbmRsZV90LCBzcDxBdWRpb1BsYXliYWNrQ2xpZW50PiA+ICAgbUF1ZGlvUGxheWJhY2tDbGllbnRzOworCisgICAgTWVkaWFQYWNrYWdlTWFuYWdlciBtUGFja2FnZU1hbmFnZXI7IC8vIFRvIGNoZWNrIGFsbG93UGxheWJhY2tDYXB0dXJlCiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5tawppbmRleCBhNDNkYWVhLi45N2JlNDRjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTQsOSArNCw3IEBACiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IFwKLSAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCi0gIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZSBcCi0gIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzCisgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgbGliYXVkaW9wb2xpY3ltYW5hZ2VyZGVmYXVsdCBcCkBAIC0xOCw2ICsxNiwxMCBAQAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyBcCiAKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmF1ZGlvcG9saWN5Y29tbW9uIFwKKyAgICBsaWJhdWRpb3BvbGljeWVuZ2luZV9pbnRlcmZhY2VfaGVhZGVycworCiBMT0NBTF9TUkNfRklMRVMgOj0gXAogICBhdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwIFwKIApAQCAtMjksNCArMzEsMzQgQEAKIAogTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKIAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBkZXZpY2UtdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQorCisjIHN5c3RlbS9hdWRpby5oIHV0aWxpdGllcyB0ZXN0CisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgbGliYmFzZSBcCisgIGxpYmxvZyBcCisgIGxpYm1lZGlhX2hlbHBlciBcCisgIGxpYnV0aWxzCisKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAorICBsaWJtZWRpYV9oZWFkZXJzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgIHN5c3RlbWF1ZGlvX3Rlc3RzLmNwcCBcCisKK0xPQ0FMX01PRFVMRSA6PSBzeXN0ZW1hdWRpb190ZXN0cworCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9DRkxBR1MgOj0gLVdlcnJvciAtV2FsbAorCitMT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQorCitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGRldmljZS10ZXN0cworCiBpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RDbGllbnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oCmluZGV4IGViODIyMmMuLjg4NTRlYjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oCkBAIC02MCw5ICs2MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeyB9CiAgICAgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IC8qaW9IYW5kbGUqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgLyprZXlzKi8pIG92ZXJyaWRlIHsgcmV0dXJuIFN0cmluZzgoKTsgfQotICAgIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IC8qdG9uZSovLAotICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IC8qc3RyZWFtKi8pIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KLSAgICBzdGF0dXNfdCBzdG9wVG9uZSgpIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KICAgICBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCAvKnZvbHVtZSovLCBpbnQgLypkZWxheU1zKi8pIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KICAgICBzdGF0dXNfdCBtb3ZlRWZmZWN0cyhhdWRpb19zZXNzaW9uX3QgLypzZXNzaW9uKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgLypzcmNPdXRwdXQqLywKQEAgLTc2LDEzICs3MywxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypkZWxheU1zKi8pIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0lOSVQ7IH0KICAgICB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpIG92ZXJyaWRlIHsgfQogICAgIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpIG92ZXJyaWRlIHsgfQorICAgIHZvaWQgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCAvKmdyb3VwKi8sIGludCAvKmZsYWdzKi8pIG92ZXJyaWRlIHsgfQogICAgIGF1ZGlvX3VuaXF1ZV9pZF90IG5ld0F1ZGlvVW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3VzZV90IC8qdXNlKi8pIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KICAgICB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggLypyZWdJZCovLCBpbnQzMl90IC8qc3RhdGUqLykgb3ZlcnJpZGUgeyB9Ci0gICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IC8qZXZlbnQqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCogLypjbGllbnRJbmZvKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlKiAvKmNsaWVudENvbmZpZyovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSogLypkZXZpY2VDb25maWcqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAvKnBhdGNoSGFuZGxlKi8pIG92ZXJyaWRlIHsgfQorICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgX191bnVzZWQpIG92ZXJyaWRlIHsgfQogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAKaW5kZXggYTk1OTNiOC4uZGU1NjcwYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwCkBAIC0xNiw5ICsxNiwxNSBAQAogCiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIAorI2RlZmluZSBMT0dfVEFHICJBUE1fVGVzdCIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvUGF0Y2hCdWlsZGVyLmg+CisKICNpbmNsdWRlICJBdWRpb1BvbGljeVRlc3RDbGllbnQuaCIKICNpbmNsdWRlICJBdWRpb1BvbGljeVRlc3RNYW5hZ2VyLmgiCiAKQEAgLTEwNiwxMCArMTEyLDM5IEBACiAgICAgc3RkOjpzZXQ8YXVkaW9fcGF0Y2hfaGFuZGxlX3Q+IG1BY3RpdmVQYXRjaGVzOwogfTsKIAorY2xhc3MgUGF0Y2hDb3VudENoZWNrIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFBhdGNoQ291bnRDaGVjayhBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50ICpjbGllbnQpCisgICAgICAgICAgICA6IG1DbGllbnR7Y2xpZW50fSwKKyAgICAgICAgICAgICAgbUluaXRpYWxDb3VudHttQ2xpZW50LT5nZXRBY3RpdmVQYXRjaGVzQ291bnQoKX0ge30KKyAgICBpbnQgZGVsdGFGcm9tU25hcHNob3QoKSBjb25zdCB7CisgICAgICAgIHNpemVfdCBjdXJyZW50Q291bnQgPSBtQ2xpZW50LT5nZXRBY3RpdmVQYXRjaGVzQ291bnQoKTsKKyAgICAgICAgaWYgKG1Jbml0aWFsQ291bnQgPD0gY3VycmVudENvdW50KSB7CisgICAgICAgICAgICByZXR1cm4gY3VycmVudENvdW50IC0gbUluaXRpYWxDb3VudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAtKHN0YXRpY19jYXN0PGludD4obUluaXRpYWxDb3VudCAtIGN1cnJlbnRDb3VudCkpOworICAgICAgICB9CisgICAgfQorICBwcml2YXRlOgorICAgIGNvbnN0IEF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQgKm1DbGllbnQ7CisgICAgY29uc3Qgc2l6ZV90IG1Jbml0aWFsQ291bnQ7Cit9OworCiBjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewogICBwcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkIFNldFVwKCk7Ci0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCk7CisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlOworICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXBDb25maWcoQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZykgeyAodm9pZCljb25maWc7IH0KKworICAgIHZvaWQgZHVtcFRvTG9nKCk7CisgICAgdm9pZCBnZXRPdXRwdXRGb3JBdHRyKAorICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgIGludCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgIGludCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkID0gbnVsbHB0cik7CisgICAgUGF0Y2hDb3VudENoZWNrIHNuYXBzaG90UGF0Y2hDb3VudCgpIHsgcmV0dXJuIFBhdGNoQ291bnRDaGVjayhtQ2xpZW50LmdldCgpKTsgfQogCiAgICAgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQ+IG1DbGllbnQ7CiAgICAgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvUG9saWN5VGVzdE1hbmFnZXI+IG1NYW5hZ2VyOwpAQCAtMTE5LDYgKzE1NCw3IEBACiAgICAgbUNsaWVudC5yZXNldChuZXcgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudCk7CiAgICAgbU1hbmFnZXIucmVzZXQobmV3IEF1ZGlvUG9saWN5VGVzdE1hbmFnZXIobUNsaWVudC5nZXQoKSkpOwogICAgIG1NYW5hZ2VyLT5nZXRDb25maWcoKS5zZXREZWZhdWx0KCk7CisgICAgU2V0VXBDb25maWcoJm1NYW5hZ2VyLT5nZXRDb25maWcoKSk7ICAvLyBTdWJjbGFzc2VzIG1heSB3YW50IHRvIGN1c3RvbWl6ZSB0aGUgY29uZmlnLgogICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmluaXRpYWxpemUoKSk7CiAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+aW5pdENoZWNrKCkpOwogfQpAQCAtMTI4LDE0ICsxNjQsNzMgQEAKICAgICBtQ2xpZW50LnJlc2V0KCk7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6ZHVtcFRvTG9nKCkgeworICAgIGludCBwaXBlZmRbMl07CisgICAgQVNTRVJUX05FKC0xLCBwaXBlKHBpcGVmZCkpOworICAgIHBpZF90IGNwaWQgPSBmb3JrKCk7CisgICAgQVNTRVJUX05FKC0xLCBjcGlkKTsKKyAgICBpZiAoY3BpZCA9PSAwKSB7CisgICAgICAgIC8vIENoaWxkIHByb2Nlc3MgcmVhZHMgZnJvbSB0aGUgcGlwZSBhbmQgbG9ncy4KKyAgICAgICAgY2xvc2UocGlwZWZkWzFdKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbGluZTsKKyAgICAgICAgY2hhciBidWY7CisgICAgICAgIHdoaWxlIChyZWFkKHBpcGVmZFswXSwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpID4gMCkgeworICAgICAgICAgICAgaWYgKGJ1ZiAhPSAnXG4nKSB7CisgICAgICAgICAgICAgICAgbGluZSArPSBidWY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dJKCIlcyIsIGxpbmUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgbGluZSA9ICIiOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbGluZS5lbXB0eSgpKSBBTE9HSSgiJXMiLCBsaW5lLmNfc3RyKCkpOworICAgICAgICBjbG9zZShwaXBlZmRbMF0pOworICAgICAgICBfZXhpdChFWElUX1NVQ0NFU1MpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFBhcmVudCBkb2VzIHRoZSBkdW1wIGFuZCBjaGVja3MgdGhlIHN0YXR1cyBjb2RlLgorICAgICAgICBjbG9zZShwaXBlZmRbMF0pOworICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5kdW1wKHBpcGVmZFsxXSkpOworICAgICAgICBjbG9zZShwaXBlZmRbMV0pOworICAgICAgICB3YWl0KE5VTEwpOyAgLy8gV2FpdCBmb3IgdGhlIGNoaWxkIHRvIGV4aXQuCisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3Q6OmdldE91dHB1dEZvckF0dHIoCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgaW50IGNoYW5uZWxNYXNrLAorICAgICAgICBpbnQgc2FtcGxlUmF0ZSwKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgeworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0ge307CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBzYW1wbGVSYXRlOworICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBjaGFubmVsTWFzazsKKyAgICBjb25maWcuZm9ybWF0ID0gZm9ybWF0OworICAgICpzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGxvY2FsUG9ydElkOworICAgIGlmICghcG9ydElkKSBwb3J0SWQgPSAmbG9jYWxQb3J0SWQ7CisgICAgKnBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgQVNTRVJUX0VRKE9LLCBtTWFuYWdlci0+Z2V0T3V0cHV0Rm9yQXR0cigKKyAgICAgICAgICAgICAgICAgICAgJmF0dHIsICZvdXRwdXQsIEFVRElPX1NFU1NJT05fTk9ORSwgJnN0cmVhbSwgMCAvKnVpZCovLCAmY29uZmlnLCAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCwge30pKTsKKyAgICBBU1NFUlRfTkUoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwgKnBvcnRJZCk7Cit9CisKKwogVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3QsIEluaXRTdWNjZXNzKSB7CiAgICAgLy8gU2V0VXAgbXVzdCBmaW5pc2ggd2l0aCBubyBhc3NlcnRpb25zLgogfQogCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCwgRHVtcCkgeworICAgIGR1bXBUb0xvZygpOworfQorCiBURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCwgQ3JlYXRlQXVkaW9QYXRjaEZhaWx1cmUpIHsKICAgICBhdWRpb19wYXRjaCBwYXRjaHt9OwogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIGNvbnN0IHNpemVfdCBwYXRjaENvdW50QmVmb3JlID0gbUNsaWVudC0+Z2V0QWN0aXZlUGF0Y2hlc0NvdW50KCk7CisgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKICAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLCBtTWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaChudWxscHRyLCAmaGFuZGxlLCAwKSk7CiAgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCBudWxscHRyLCAwKSk7CiAgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmaGFuZGxlLCAwKSk7CkBAIC0xNjIsMzUgKzI1NywxODAgQEAKICAgICBBU1NFUlRfRVEoSU5WQUxJRF9PUEVSQVRJT04sIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmhhbmRsZSwgMCkpOwogICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBoYW5kbGUgaXMgbGVmdCB1bmNoYW5nZWQuCiAgICAgQVNTRVJUX0VRKEFVRElPX1BBVENIX0hBTkRMRV9OT05FLCBoYW5kbGUpOwotICAgIEFTU0VSVF9FUShwYXRjaENvdW50QmVmb3JlLCBtQ2xpZW50LT5nZXRBY3RpdmVQYXRjaGVzQ291bnQoKSk7CisgICAgQVNTRVJUX0VRKDAsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CiB9CiAKIFRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0LCBDcmVhdGVBdWRpb1BhdGNoRnJvbU1peCkgewotICAgIGF1ZGlvX3BhdGNoIHBhdGNoe307CiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgdWlkX3QgdWlkID0gNDI7Ci0gICAgY29uc3Qgc2l6ZV90IHBhdGNoQ291bnRCZWZvcmUgPSBtQ2xpZW50LT5nZXRBY3RpdmVQYXRjaGVzQ291bnQoKTsKLSAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7Ci0gICAgewotICAgICAgICBhdXRvJiBzcmMgPSBwYXRjaC5zb3VyY2VzWzBdOwotICAgICAgICBzcmMucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7Ci0gICAgICAgIHNyYy50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKLSAgICAgICAgc3JjLmlkID0gbU1hbmFnZXItPmdldENvbmZpZygpLmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpWzBdLT5nZXRJZCgpOwotICAgICAgICAvLyBOb3RlOiB0aGVzZSBhcmUgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIG91dHB1dCBkZXZpY2UuCi0gICAgICAgIHNyYy5zYW1wbGVfcmF0ZSA9IDQ0MTAwOwotICAgICAgICBzcmMuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0gICAgICAgIHNyYy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgfQotICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7Ci0gICAgewotICAgICAgICBhdXRvJiBzaW5rID0gcGF0Y2guc2lua3NbMF07Ci0gICAgICAgIHNpbmsucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LOwotICAgICAgICBzaW5rLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfREVWSUNFOwotICAgICAgICBzaW5rLmlkID0gbU1hbmFnZXItPmdldENvbmZpZygpLmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+Z2V0SWQoKTsKLSAgICB9Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZoYW5kbGUsIHVpZCkpOworICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CisgICAgQVNTRVJUX0ZBTFNFKG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKS5pc0VtcHR5KCkpOworICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CisgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShtTWFuYWdlci0+Z2V0Q29uZmlnKCkuZ2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKClbMF0pLgorICAgICAgICAgICAgYWRkU2luayhtTWFuYWdlci0+Z2V0Q29uZmlnKCkuZ2V0RGVmYXVsdE91dHB1dERldmljZSgpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoQnVpbGRlci5wYXRjaCgpLCAmaGFuZGxlLCB1aWQpKTsKICAgICBBU1NFUlRfTkUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUsIGhhbmRsZSk7Ci0gICAgQVNTRVJUX0VRKHBhdGNoQ291bnRCZWZvcmUgKyAxLCBtQ2xpZW50LT5nZXRBY3RpdmVQYXRjaGVzQ291bnQoKSk7CisgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CiB9CiAKIC8vIFRPRE86IEFkZCBwYXRjaCBjcmVhdGlvbiB0ZXN0cyB0aGF0IGludm9sdmUgYWxyZWFkeSBleGlzdGluZyBwYXRjaAorCitjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlclRlc3QgeworICBwcm90ZWN0ZWQ6CisgICAgdm9pZCBTZXRVcENvbmZpZyhBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKSBvdmVycmlkZTsKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGU7CisKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtTXNkT3V0cHV0RGV2aWNlOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1Nc2RJbnB1dERldmljZTsKK307CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZDo6U2V0VXBDb25maWcoQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZykgeworICAgIC8vIFRPRE86IENvbnNpZGVyIHVzaW5nIFNlcmlhbGl6ZXIgdG8gbG9hZCBwYXJ0IG9mIHRoZSBjb25maWcgZnJvbSBhIHN0cmluZy4KKyAgICBtTXNkT3V0cHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoQVVESU9fREVWSUNFX09VVF9CVVMpOworICAgIHNwPEF1ZGlvUHJvZmlsZT4gcGNtT3V0cHV0UHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoCisgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLCA0ODAwMCk7CisgICAgc3A8QXVkaW9Qcm9maWxlPiBhYzNPdXRwdXRQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZSgKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQzMsIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsIDQ4MDAwKTsKKyAgICBtTXNkT3V0cHV0RGV2aWNlLT5hZGRBdWRpb1Byb2ZpbGUocGNtT3V0cHV0UHJvZmlsZSk7CisgICAgbU1zZE91dHB1dERldmljZS0+YWRkQXVkaW9Qcm9maWxlKGFjM091dHB1dFByb2ZpbGUpOworICAgIG1Nc2RJbnB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKEFVRElPX0RFVklDRV9JTl9CVVMpOworICAgIC8vIE1hdGNoIG91dHB1dCBwcm9maWxlIGZyb20gQXVkaW9Qb2xpY3lDb25maWc6OnNldERlZmF1bHQuCisgICAgc3A8QXVkaW9Qcm9maWxlPiBwY21JbnB1dFByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKAorICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPLCA0NDEwMCk7CisgICAgbU1zZElucHV0RGV2aWNlLT5hZGRBdWRpb1Byb2ZpbGUocGNtSW5wdXRQcm9maWxlKTsKKyAgICBjb25maWctPmFkZEF2YWlsYWJsZURldmljZShtTXNkT3V0cHV0RGV2aWNlKTsKKyAgICBjb25maWctPmFkZEF2YWlsYWJsZURldmljZShtTXNkSW5wdXREZXZpY2UpOworCisgICAgc3A8SHdNb2R1bGU+IG1zZE1vZHVsZSA9IG5ldyBId01vZHVsZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNELCAyIC8qaGFsVmVyc2lvbk1ham9yKi8pOworICAgIEh3TW9kdWxlQ29sbGVjdGlvbiBtb2R1bGVzID0gY29uZmlnLT5nZXRId01vZHVsZXMoKTsKKyAgICBtb2R1bGVzLmFkZChtc2RNb2R1bGUpOworICAgIGNvbmZpZy0+c2V0SHdNb2R1bGVzKG1vZHVsZXMpOworICAgIG1Nc2RPdXRwdXREZXZpY2UtPmF0dGFjaChtc2RNb2R1bGUpOworICAgIG1Nc2RJbnB1dERldmljZS0+YXR0YWNoKG1zZE1vZHVsZSk7CisKKyAgICBzcDxPdXRwdXRQcm9maWxlPiBtc2RPdXRwdXRQcm9maWxlID0gbmV3IE91dHB1dFByb2ZpbGUoU3RyaW5nOCgibXNkIGlucHV0IikpOworICAgIG1zZE91dHB1dFByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZShwY21PdXRwdXRQcm9maWxlKTsKKyAgICBtc2RPdXRwdXRQcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UobU1zZE91dHB1dERldmljZSk7CisgICAgbXNkTW9kdWxlLT5hZGRPdXRwdXRQcm9maWxlKG1zZE91dHB1dFByb2ZpbGUpOworICAgIHNwPE91dHB1dFByb2ZpbGU+IG1zZENvbXByZXNzZWRPdXRwdXRQcm9maWxlID0KKyAgICAgICAgICAgIG5ldyBPdXRwdXRQcm9maWxlKFN0cmluZzgoIm1zZCBjb21wcmVzc2VkIGlucHV0IikpOworICAgIG1zZENvbXByZXNzZWRPdXRwdXRQcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUoYWMzT3V0cHV0UHJvZmlsZSk7CisgICAgbXNkQ29tcHJlc3NlZE91dHB1dFByb2ZpbGUtPnNldEZsYWdzKAorICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCB8CisgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05fQkxPQ0tJTkcpOworICAgIG1zZENvbXByZXNzZWRPdXRwdXRQcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UobU1zZE91dHB1dERldmljZSk7CisgICAgbXNkTW9kdWxlLT5hZGRPdXRwdXRQcm9maWxlKG1zZENvbXByZXNzZWRPdXRwdXRQcm9maWxlKTsKKworICAgIHNwPElucHV0UHJvZmlsZT4gbXNkSW5wdXRQcm9maWxlID0gbmV3IElucHV0UHJvZmlsZShTdHJpbmc4KCJtc2Qgb3V0cHV0IikpOworICAgIG1zZElucHV0UHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKHBjbUlucHV0UHJvZmlsZSk7CisgICAgbXNkSW5wdXRQcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UobU1zZElucHV0RGV2aWNlKTsKKyAgICBtc2RNb2R1bGUtPmFkZElucHV0UHJvZmlsZShtc2RJbnB1dFByb2ZpbGUpOworCisgICAgLy8gQWRkIGEgcHJvZmlsZSB3aXRoIGFub3RoZXIgZW5jb2RpbmcgdG8gdGhlIGRlZmF1bHQgZGV2aWNlIHRvIHRlc3Qgcm91dGluZworICAgIC8vIG9mIHN0cmVhbXMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSBNU0QuCisgICAgc3A8QXVkaW9Qcm9maWxlPiBkdHNPdXRwdXRQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZSgKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9EVFMsIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsIDQ4MDAwKTsKKyAgICBjb25maWctPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+YWRkQXVkaW9Qcm9maWxlKGR0c091dHB1dFByb2ZpbGUpOworICAgIHNwPE91dHB1dFByb2ZpbGU+IHByaW1hcnlFbmNvZGVkT3V0cHV0UHJvZmlsZSA9IG5ldyBPdXRwdXRQcm9maWxlKFN0cmluZzgoImVuY29kZWQiKSk7CisgICAgcHJpbWFyeUVuY29kZWRPdXRwdXRQcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUoZHRzT3V0cHV0UHJvZmlsZSk7CisgICAgcHJpbWFyeUVuY29kZWRPdXRwdXRQcm9maWxlLT5zZXRGbGFncyhBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIHByaW1hcnlFbmNvZGVkT3V0cHV0UHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKGNvbmZpZy0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpKTsKKyAgICBjb25maWctPmdldEh3TW9kdWxlcygpLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKS0+CisgICAgICAgICAgICBhZGRPdXRwdXRQcm9maWxlKHByaW1hcnlFbmNvZGVkT3V0cHV0UHJvZmlsZSk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZDo6VGVhckRvd24oKSB7CisgICAgbU1zZE91dHB1dERldmljZS5jbGVhcigpOworICAgIG1Nc2RJbnB1dERldmljZS5jbGVhcigpOworICAgIEF1ZGlvUG9saWN5TWFuYWdlclRlc3Q6OlRlYXJEb3duKCk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBJbml0U3VjY2VzcykgeworICAgIEFTU0VSVF9UUlVFKG1Nc2RPdXRwdXREZXZpY2UpOworICAgIEFTU0VSVF9UUlVFKG1Nc2RJbnB1dERldmljZSk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBEdW1wKSB7CisgICAgZHVtcFRvTG9nKCk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBQYXRjaENyZWF0aW9uT25TZXRGb3JjZVVzZSkgeworICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CisgICAgbU1hbmFnZXItPnNldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCwKKyAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUyk7CisgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyRW5jb2RlZFJvdXRlc1RvTXNkKSB7CisgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQ7CisgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQzMsIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsIDQ4MDAwLCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIEFTU0VSVF9FUShzZWxlY3RlZERldmljZUlkLCBtTXNkT3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKKyAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEdldE91dHB1dEZvckF0dHJQY21Sb3V0ZXNUb01zZCkgeworICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkOworICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLCA0ODAwMCk7CisgICAgQVNTRVJUX0VRKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgIEFTU0VSVF9FUSgxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgR2V0T3V0cHV0Rm9yQXR0ckVuY29kZWRQbHVzUGNtUm91dGVzVG9Nc2QpIHsKKyAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZDsKKyAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgQVNTRVJUX0VRKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgIEFTU0VSVF9FUSgxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLCA0ODAwMCk7CisgICAgQVNTRVJUX0VRKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgIEFTU0VSVF9FUSgxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgR2V0T3V0cHV0Rm9yQXR0clVuc3VwcG9ydGVkRm9ybWF0QnlwYXNzZXNNc2QpIHsKKyAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZDsKKyAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgQVVESU9fRk9STUFUX0RUUywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgQVNTRVJUX05FKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgIEFTU0VSVF9FUSgwLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgR2V0T3V0cHV0Rm9yQXR0ckZvcm1hdFN3aXRjaGluZykgeworICAgIC8vIFN3aXRjaCBiZXR3ZWVuIGZvcm1hdHMgdGhhdCBhcmUgc3VwcG9ydGVkIGFuZCBub3Qgc3VwcG9ydGVkIGJ5IE1TRC4KKyAgICB7CisgICAgICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkOworICAgICAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQzMsIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsIDQ4MDAwLCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QsCisgICAgICAgICAgICAgICAgJnBvcnRJZCk7CisgICAgICAgIEFTU0VSVF9FUShzZWxlY3RlZERldmljZUlkLCBtTXNkT3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CisgICAgICAgIG1NYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KHBvcnRJZCk7CisgICAgICAgIEFTU0VSVF9FUSgxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworICAgIH0KKyAgICB7CisgICAgICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkOworICAgICAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9EVFMsIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsIDQ4MDAwLCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QsCisgICAgICAgICAgICAgICAgJnBvcnRJZCk7CisgICAgICAgIEFTU0VSVF9ORShzZWxlY3RlZERldmljZUlkLCBtTXNkT3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKC0xLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworICAgICAgICBtTWFuYWdlci0+cmVsZWFzZU91dHB1dChwb3J0SWQpOworICAgICAgICBBU1NFUlRfRVEoMCwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICB9CisgICAgeworICAgICAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQ7CisgICAgICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgICAgIEFTU0VSVF9FUShzZWxlY3RlZERldmljZUlkLCBtTXNkT3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKDAsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvc3lzdGVtYXVkaW9fdGVzdHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvc3lzdGVtYXVkaW9fdGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYWFlNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9zeXN0ZW1hdWRpb190ZXN0cy5jcHAKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2RlZmluZSBMT0dfVEFHICJTeXNBdWRpb19UZXN0IgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9QYXRjaEJ1aWxkZXIuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK1RFU1QoU3lzdGVtQXVkaW9UZXN0LCBQYXRjaEludmFsaWQpIHsKKyAgICBhdWRpb19wYXRjaCBwYXRjaHt9OworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaF9pc192YWxpZCgmcGF0Y2gpKTsKKyAgICBwYXRjaC5udW1fc291cmNlcyA9IEFVRElPX1BBVENIX1BPUlRTX01BWCArIDE7CisgICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoJnBhdGNoKSk7CisgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOworICAgIHBhdGNoLm51bV9zaW5rcyA9IEFVRElPX1BBVENIX1BPUlRTX01BWCArIDE7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKCZwYXRjaCkpOworICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMDsKKyAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaF9pc192YWxpZCgmcGF0Y2gpKTsKK30KKworVEVTVChTeXN0ZW1BdWRpb1Rlc3QsIFBhdGNoVmFsaWQpIHsKKyAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZyBzcmMgPSB7CisgICAgICAgIC5pZCA9IDEsIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSwgLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfREVWSUNFIH07CisgICAgLy8gSXQncyBPSyBub3QgdG8gaGF2ZSBzaW5rcy4KKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaF9pc192YWxpZCgoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLnBhdGNoKCkpKTsKKyAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZyBzaW5rID0geworICAgICAgICAuaWQgPSAyLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaF9pc192YWxpZCgoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2luaykucGF0Y2goKSkpOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2luaykucGF0Y2goKSkpOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2luaykuYWRkU2luayhzaW5rKS5wYXRjaCgpKSk7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU291cmNlKHNyYykuCisgICAgICAgICAgICAgICAgICAgIGFkZFNpbmsoc2luaykuYWRkU2luayhzaW5rKS5wYXRjaCgpKSk7Cit9CisKK1RFU1QoU3lzdGVtQXVkaW9UZXN0LCBQYXRjaEh3QXZTeW5jKSB7CisgICAgYXVkaW9fcG9ydF9jb25maWcgZGV2aWNlX3NyY19jZmcgPSB7CisgICAgICAgIC5pZCA9IDEsIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSwgLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfREVWSUNFIH07CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZkZXZpY2Vfc3JjX2NmZykpOworICAgIGRldmljZV9zcmNfY2ZnLmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmZGV2aWNlX3NyY19jZmcpKTsKKyAgICBkZXZpY2Vfc3JjX2NmZy5mbGFncy5pbnB1dCA9IEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQzsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmZGV2aWNlX3NyY19jZmcpKTsKKworICAgIGF1ZGlvX3BvcnRfY29uZmlnIGRldmljZV9zaW5rX2NmZyA9IHsKKyAgICAgICAgLmlkID0gMSwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSywgLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfREVWSUNFIH07CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZkZXZpY2Vfc2lua19jZmcpKTsKKyAgICBkZXZpY2Vfc2lua19jZmcuY29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZkZXZpY2Vfc2lua19jZmcpKTsKKyAgICBkZXZpY2Vfc2lua19jZmcuZmxhZ3Mub3V0cHV0ID0gQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQzsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmZGV2aWNlX3NpbmtfY2ZnKSk7CisKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBtaXhfc2lua19jZmcgPSB7CisgICAgICAgIC5pZCA9IDEsIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTkssIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWCB9OworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmbWl4X3NpbmtfY2ZnKSk7CisgICAgbWl4X3NpbmtfY2ZnLmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmbWl4X3NpbmtfY2ZnKSk7CisgICAgbWl4X3NpbmtfY2ZnLmZsYWdzLmlucHV0ID0gQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZtaXhfc2lua19jZmcpKTsKKworICAgIGF1ZGlvX3BvcnRfY29uZmlnIG1peF9zcmNfY2ZnID0geworICAgICAgICAuaWQgPSAxLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWCB9OworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmbWl4X3NyY19jZmcpKTsKKyAgICBtaXhfc3JjX2NmZy5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJm1peF9zcmNfY2ZnKSk7CisgICAgbWl4X3NyY19jZmcuZmxhZ3Mub3V0cHV0ID0gQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQzsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmbWl4X3NyY19jZmcpKTsKK30KKworVEVTVChTeXN0ZW1BdWRpb1Rlc3QsIFBhdGNoRXF1YWwpIHsKKyAgICBjb25zdCBhdWRpb19wYXRjaCBwYXRjaDF7fSwgcGF0Y2gye307CisgICAgLy8gSW52YWxpZCBwYXRjaGVzIGFyZSBub3QgZXF1YWwuCisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BhdGNoZXNfYXJlX2VxdWFsKCZwYXRjaDEsICZwYXRjaDIpKTsKKyAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZyBzcmMgPSB7CisgICAgICAgIC5pZCA9IDEsIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSwgLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfREVWSUNFIH07CisgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWcgc2luayA9IHsKKyAgICAgICAgLmlkID0gMiwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSywgLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfREVWSUNFIH07CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BhdGNoZXNfYXJlX2VxdWFsKAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLnBhdGNoKCksCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpKSk7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpLAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2luaykucGF0Y2goKSkpOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCksCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpKSk7CisgICAgYXVkaW9fcG9ydF9jb25maWcgc2lua19od19hdl9zeW5jID0gc2luazsKKyAgICBzaW5rX2h3X2F2X3N5bmMuY29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgc2lua19od19hdl9zeW5jLmZsYWdzLm91dHB1dCA9IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkM7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BhdGNoZXNfYXJlX2VxdWFsKAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2luaykucGF0Y2goKSwKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmtfaHdfYXZfc3luYykucGF0Y2goKSkpOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BhdGNoZXNfYXJlX2VxdWFsKAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2lua19od19hdl9zeW5jKS5wYXRjaCgpLAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2lua19od19hdl9zeW5jKS5wYXRjaCgpKSk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvT1dORVJTIGIvc2VydmljZXMvY2FtZXJhL09XTkVSUwppbmRleCAxOGFjZmVlLi5mNDhhOTVjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvT1dORVJTCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9PV05FUlMKQEAgLTEsNiArMSBAQAotY3ljaGVuQGdvb2dsZS5jb20KLWVwZWV2QGdvb2dsZS5jb20KLWV0YWx2YWxhQGdvb2dsZS5jb20KLXNodXpoZW53YW5nQGdvb2dsZS5jb20KLXlpbmNoaWF5ZWhAZ29vZ2xlLmNvbQotemhpanVuaGVAZ29vZ2xlLmNvbQoraW5jbHVkZSBwbGF0Zm9ybS9mcmFtZXdvcmtzL2F2Oi9jYW1lcmEvT1dORVJTCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLmJwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWMwZTRjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5icApAQCAtMCwwICsxLDE3MyBAQAorLy8gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8KKy8vIGxpYmNhbWVyYXNlcnZpY2UKKy8vCisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY2FtZXJhc2VydmljZSIsCisKKyAgICAvLyBDYW1lcmEgc2VydmljZSBzb3VyY2UKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkNhbWVyYVNlcnZpY2UuY3BwIiwKKyAgICAgICAgIkNhbWVyYUZsYXNobGlnaHQuY3BwIiwKKyAgICAgICAgImNvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAiLAorICAgICAgICAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuY3BwIiwKKyAgICAgICAgImNvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwIiwKKyAgICAgICAgImNvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwIiwKKyAgICAgICAgImFwaTEvQ2FtZXJhQ2xpZW50LmNwcCIsCisgICAgICAgICJhcGkxL0NhbWVyYTJDbGllbnQuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9KcGVnQ29tcHJlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwIiwKKyAgICAgICAgImFwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcCIsCisgICAgICAgICJhcGkyL0NvbXBvc2l0ZVN0cmVhbS5jcHAiLAorICAgICAgICAiYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5jcHAiLAorICAgICAgICAiYXBpMi9IZWljRW5jb2RlckluZm9NYW5hZ2VyLmNwcCIsCisgICAgICAgICJhcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM0RldmljZS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvU3RhdHVzVHJhY2tlci5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwIiwKKyAgICAgICAgImRldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAiLAorICAgICAgICAiZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAiLAorICAgICAgICAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuY3BwIiwKKyAgICAgICAgImhpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5jcHAiLAorICAgICAgICAiaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNwcCIsCisgICAgICAgICJoaWRsL0NvbnZlcnQuY3BwIiwKKyAgICAgICAgImhpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwIiwKKyAgICAgICAgImhpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwIiwKKyAgICAgICAgInV0aWxzL0NhbWVyYVRyYWNlcy5jcHAiLAorICAgICAgICAidXRpbHMvQXV0b0NvbmRpdGlvbkxvY2suY3BwIiwKKyAgICAgICAgInV0aWxzL0V4aWZVdGlscy5jcHAiLAorICAgICAgICAidXRpbHMvVGFnTW9uaXRvci5jcHAiLAorICAgICAgICAidXRpbHMvTGF0ZW5jeUhpc3RvZ3JhbS5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliZGwiLAorICAgICAgICAibGliZXhpZiIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHNjYWxsc3RhY2siLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLAorICAgICAgICAibGliY2FtZXJhX21ldGFkYXRhIiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJsaWJqcGVnIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCisgICAgICAgICJsaWJzZW5zb3Jwcml2YWN5IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlieXV2IiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLmNvbW1vbkAyLjAiLAorICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAyLjAiLAorICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2UuZGV2aWNlQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjUiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjMiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy41IiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLAorICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImxpYnNlbnNvcnByaXZhY3kiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgInN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL25kayIsCisgICAgICAgICJleHRlcm5hbC9keW5hbWljX2RlcHRoL2luY2x1ZGVzIiwKKyAgICAgICAgImV4dGVybmFsL2R5bmFtaWNfZGVwdGgvaW50ZXJuYWwiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8taWdub3JlZC1xdWFsaWZpZXJzIiwKKyAgICBdLAorCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliZGVwdGhwaG90byIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJ1dGlscy9FeGlmVXRpbHMuY3BwIiwKKyAgICAgICAgImNvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJpbWFnZV9pbyIsCisgICAgICAgICJsaWJkeW5hbWljX2RlcHRoIiwKKyAgICAgICAgImxpYnhtbDIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzY2FsbHN0YWNrIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJqcGVnIiwKKyAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKKyAgICAgICAgImxpYmV4aWYiLAorICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZXh0ZXJuYWwvZHluYW1pY19kZXB0aC9pbmNsdWRlcyIsCisgICAgICAgICJleHRlcm5hbC9keW5hbWljX2RlcHRoL2ludGVybmFsIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWlnbm9yZWQtcXVhbGlmaWVycyIsCisgICAgXSwKKworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKaW5kZXggOTYyNjFhYi4uNGNmZWNmZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCkBAIC0xNCw5MSArMTQsOSBAQAogCiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIAotIwotIyBsaWJjYW1lcmFzZXJ2aWNlCi0jCi0KIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi0jIENhbWVyYSBzZXJ2aWNlIHNvdXJjZQotCi1MT0NBTF9TUkNfRklMRVMgOj0gIFwKLSAgICBDYW1lcmFTZXJ2aWNlLmNwcCBcCi0gICAgQ2FtZXJhRmxhc2hsaWdodC5jcHAgXAotICAgIGNvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAgXAotICAgIGNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmNwcCBcCi0gICAgY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAgXAotICAgIGNvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwIFwKLSAgICBhcGkxL0NhbWVyYUNsaWVudC5jcHAgXAotICAgIGFwaTEvQ2FtZXJhMkNsaWVudC5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcCBcCi0gICAgYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcCBcCi0gICAgYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcCBcCi0gICAgYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcCBcCi0gICAgYXBpMS9jbGllbnQyL0pwZWdDb21wcmVzc29yLmNwcCBcCi0gICAgYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcCBcCi0gICAgYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwIFwKLSAgICBkZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAgXAotICAgIGRldmljZTMvU3RhdHVzVHJhY2tlci5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAgXAotICAgIGRldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAgXAotICAgIGd1aS9SaW5nQnVmZmVyQ29uc3VtZXIuY3BwIFwKLSAgICB1dGlscy9DYW1lcmFUcmFjZXMuY3BwIFwKLSAgICB1dGlscy9BdXRvQ29uZGl0aW9uTG9jay5jcHAgXAotICAgIHV0aWxzL1RhZ01vbml0b3IuY3BwIFwKLSAgICB1dGlscy9MYXRlbmN5SGlzdG9ncmFtLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTOj0gXAotICAgIGxpYnVpIFwKLSAgICBsaWJsb2cgXAotICAgIGxpYnV0aWxzY2FsbHN0YWNrIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGliYmluZGVyIFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYm1lZGlhIFwKLSAgICBsaWJtZWRpYXV0aWxzIFwKLSAgICBsaWJjYW1lcmFfY2xpZW50IFwKLSAgICBsaWJjYW1lcmFfbWV0YWRhdGEgXAotICAgIGxpYmZtcSBcCi0gICAgbGliZ3VpIFwKLSAgICBsaWJoYXJkd2FyZSBcCi0gICAgbGliaGlkbGJhc2UgXAotICAgIGxpYmhpZGx0cmFuc3BvcnQgXAotICAgIGxpYmpwZWcgXAotICAgIGxpYm1lbXVucmVhY2hhYmxlIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjMgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjQKLQotTE9DQUxfRVhQT1JUX1NIQVJFRF9MSUJSQVJZX0hFQURFUlMgOj0gbGliYmluZGVyIGxpYmNhbWVyYV9jbGllbnQgbGliZm1xCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgIHN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKLQotTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlCi0KLUxPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKLQotTE9DQUxfTU9EVUxFOj0gbGliY2FtZXJhc2VydmljZQotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLSMgQnVpbGQgdGVzdHMgdG9vCisjIEJ1aWxkIHRlc3RzCiAKIGluY2x1ZGUgJChMT0NBTF9QQVRIKS90ZXN0cy9BbmRyb2lkLm1rCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggOGE3NTJiMS4uNTFkMDY4MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKQEAgLTQ3LDExICs0NywxNSBAQAogI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgImhpZGwvSGlkbENhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZW11bnJlYWNoYWJsZS9tZW11bnJlYWNoYWJsZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmg+CisjaW5jbHVkZSA8c2Vuc29ycHJpdmFjeS9TZW5zb3JQcml2YWN5TWFuYWdlci5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CkBAIC02OSw2ICs3Myw3IEBACiAjaW5jbHVkZSAiYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCIKICNpbmNsdWRlICJ1dGlscy9DYW1lcmFUcmFjZXMuaCIKICNpbmNsdWRlICJ1dGlscy9UYWdNb25pdG9yLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCIKIAogbmFtZXNwYWNlIHsKICAgICBjb25zdCBjaGFyKiBrUGVybWlzc2lvblNlcnZpY2VOYW1lID0gInBlcm1pc3Npb24iOwpAQCAtNzcsNiArODIsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB1c2luZyBiaW5kZXI6OlN0YXR1czsKK3VzaW5nIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpIaWRsQ2FtZXJhU2VydmljZTsKIHVzaW5nIGhhcmR3YXJlOjpJQ2FtZXJhOwogdXNpbmcgaGFyZHdhcmU6OklDYW1lcmFDbGllbnQ7CiB1c2luZyBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTsKQEAgLTE0MSw2ICsxNDcsMTMgQEAKIAogICAgIG1VaWRQb2xpY3kgPSBuZXcgVWlkUG9saWN5KHRoaXMpOwogICAgIG1VaWRQb2xpY3ktPnJlZ2lzdGVyU2VsZigpOworICAgIG1TZW5zb3JQcml2YWN5UG9saWN5ID0gbmV3IFNlbnNvclByaXZhY3lQb2xpY3kodGhpcyk7CisgICAgbVNlbnNvclByaXZhY3lQb2xpY3ktPnJlZ2lzdGVyU2VsZigpOworICAgIHNwPEhpZGxDYW1lcmFTZXJ2aWNlPiBoY3MgPSBIaWRsQ2FtZXJhU2VydmljZTo6Z2V0SW5zdGFuY2UodGhpcyk7CisgICAgaWYgKGhjcy0+cmVnaXN0ZXJBc1NlcnZpY2UoKSAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWdpc3RlciBkZWZhdWx0IGFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMS4wIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICB9CiB9CiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmVudW1lcmF0ZVByb3ZpZGVycygpIHsKQEAgLTIxNCwxMyArMjI3LDE0IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xpc3RlbmVyTG9jayk7CiAKICAgICBmb3IgKGF1dG8mIGkgOiBtTGlzdGVuZXJMaXN0KSB7Ci0gICAgICAgIGktPm9uVG9yY2hTdGF0dXNDaGFuZ2VkKG1hcFRvSW50ZXJmYWNlKHN0YXR1cyksIFN0cmluZzE2e2NhbWVyYUlkfSk7CisgICAgICAgIGkuc2Vjb25kLT5nZXRMaXN0ZW5lcigpLT5vblRvcmNoU3RhdHVzQ2hhbmdlZChtYXBUb0ludGVyZmFjZShzdGF0dXMpLCBTdHJpbmcxNntjYW1lcmFJZH0pOwogICAgIH0KIH0KIAogQ2FtZXJhU2VydmljZTo6fkNhbWVyYVNlcnZpY2UoKSB7CiAgICAgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y2xlYXJHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CiAgICAgbVVpZFBvbGljeS0+dW5yZWdpc3RlclNlbGYoKTsKKyAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS0+dW5yZWdpc3RlclNlbGYoKTsKIH0KIAogdm9pZCBDYW1lcmFTZXJ2aWNlOjpvbk5ld1Byb3ZpZGVyUmVnaXN0ZXJlZCgpIHsKQEAgLTMzNyw3ICszNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRCwKICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhc3t9KTsKICAgICAgICAgICAgIC8vIEVuc3VyZSBub3QgaW4gYmluZGVyIFJQQyBzbyBjbGllbnQgZGlzY29ubmVjdCBQSUQgY2hlY2tzIHdvcmsgY29ycmVjdGx5Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWQoKSwKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWQoKSwKICAgICAgICAgICAgICAgICAgICAgIm9uRGV2aWNlU3RhdHVzQ2hhbmdlZCBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBjYW1lcmEgc2VydmljZSBwcm9jZXNzISIpOwogICAgICAgICAgICAgY2xpZW50VG9EaXNjb25uZWN0LT5kaXNjb25uZWN0KCk7CiAgICAgICAgIH0KQEAgLTQ5OCwxNyArNTEyLDM3IEBACiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgfQogCisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nVWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiB0YWdzUmVtb3ZlZDsKKyAgICAvLyBJZiBpdCdzIG5vdCBjYWxsaW5nIGZyb20gY2FtZXJhc2VydmVyLCBjaGVjayB0aGUgcGVybWlzc2lvbi4KKyAgICBpZiAoKGNhbGxpbmdQaWQgIT0gZ2V0cGlkKCkpICYmCisgICAgICAgICAgICAhY2hlY2tQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBIiksIGNhbGxpbmdQaWQsIGNhbGxpbmdVaWQpKSB7CisgICAgICAgIHJlcyA9IGNhbWVyYUluZm8tPnJlbW92ZVBlcm1pc3Npb25FbnRyaWVzKAorICAgICAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldFByb3ZpZGVyVGFnSWRMb2NrZWQoU3RyaW5nOChjYW1lcmFJZCkuc3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICZ0YWdzUmVtb3ZlZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIGNhbWVyYUluZm8tPmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgIkZhaWxlZCB0byByZW1vdmUgY2FtZXJhIgorICAgICAgICAgICAgICAgICAgICAiIGNoYXJhY3RlcmlzdGljcyBuZWVkaW5nIGNhbWVyYSBwZXJtaXNzaW9uIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXRhZ3NSZW1vdmVkLmVtcHR5KCkpIHsKKyAgICAgICAgcmVzID0gY2FtZXJhSW5mby0+dXBkYXRlKEFORFJPSURfUkVRVUVTVF9DSEFSQUNURVJJU1RJQ19LRVlTX05FRURJTkdfUEVSTUlTU0lPTiwKKyAgICAgICAgICAgICAgICB0YWdzUmVtb3ZlZC5kYXRhKCksIHRhZ3NSZW1vdmVkLnNpemUoKSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIGNhbWVyYUluZm8tPmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgIkZhaWxlZCB0byBpbnNlcnQgY2FtZXJhICIKKyAgICAgICAgICAgICAgICAgICAgImtleXMgbmVlZGluZyBwZXJtaXNzaW9uIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLCBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gcmV0OwogfQogCi1pbnQgQ2FtZXJhU2VydmljZTo6Z2V0Q2FsbGluZ1BpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotfQotCi1pbnQgQ2FtZXJhU2VydmljZTo6Z2V0Q2FsbGluZ1VpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotfQotCiBTdHJpbmc4IENhbWVyYVNlcnZpY2U6OmdldEZvcm1hdHRlZEN1cnJlbnRUaW1lKCkgewogICAgIHRpbWVfdCBub3cgPSB0aW1lKG51bGxwdHIpOwogICAgIGNoYXIgZm9ybWF0dGVkVGltZVs2NF07CkBAIC01ODksNyArNjIzLDcgQEAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjptYWtlQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxJSW50ZXJmYWNlPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBmYWNpbmcsIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsCi0gICAgICAgIGJvb2wgbGVnYWN5TW9kZSwgaW50IGhhbFZlcnNpb24sIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKKyAgICAgICAgaW50IGhhbFZlcnNpb24sIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKICAgICAgICAgLypvdXQqL3NwPEJhc2ljQ2xpZW50PiogY2xpZW50KSB7CiAKICAgICBpZiAoaGFsVmVyc2lvbiA8IDAgfHwgaGFsVmVyc2lvbiA9PSBkZXZpY2VWZXJzaW9uKSB7CkBAIC02MDEsNyArNjM1LDcgQEAKICAgICAgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiB0bXAgPSBzdGF0aWNfY2FzdDxJQ2FtZXJhQ2xpZW50Kj4oY2FtZXJhQ2IuZ2V0KCkpOwogICAgICAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBhcGkxQ2FtZXJhSWQsIGZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRwaWQoKSwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRwaWQoKSk7CiAgICAgICAgICAgICB9IGVsc2UgeyAvLyBDYW1lcmEyIEFQSSByb3V0ZQogICAgICAgICAgICAgICAgIEFMT0dXKCJDYW1lcmEgdXNpbmcgb2xkIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOwogICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0RFUFJFQ0FURURfSEFMLApAQCAtNjE0LDEyICs2NDgsMTMgQEAKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM6CiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNDoKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181OgogICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZUFwaUxldmVsID09IEFQSV8xKSB7IC8vIENhbWVyYTEgQVBJIHJvdXRlCiAgICAgICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKICAgICAgICAgICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYTJDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZVBpZCwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkKTsKICAgICAgICAgICAgIH0gZWxzZSB7IC8vIENhbWVyYTIgQVBJIHJvdXRlCiAgICAgICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHRtcCA9CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcyo+KGNhbWVyYUNiLmdldCgpKTsKQEAgLTY0Myw3ICs2NzgsNyBAQAogICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKICAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgIGFwaTFDYW1lcmFJZCwgZmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZVBpZCwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gT3RoZXIgY29tYmluYXRpb25zIChlLmcuIEhBTDMueCBvcGVuIGFzIEhBTDIueCkgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgogICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2FtZXJhIEhBTCB2ZXJzaW9uICV4OiBIQUwgJXggZGV2aWNlIGNhbiBvbmx5IGJlIgpAQCAtNzMyLDcgKzc2Nyw3IEBACiB9CiAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjppbml0aWFsaXplU2hpbU1ldGFkYXRhKGludCBjYW1lcmFJZCkgewotICAgIGludCB1aWQgPSBnZXRDYWxsaW5nVWlkKCk7CisgICAgaW50IHVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAKICAgICBTdHJpbmcxNiBpbnRlcm5hbFBhY2thZ2VOYW1lKCJjYW1lcmFzZXJ2ZXIiKTsKICAgICBTdHJpbmc4IGlkID0gU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKTsKQEAgLTc0Miw4ICs3NzcsNyBAQAogICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD57bnVsbHB0cn0sIGlkLCBjYW1lcmFJZCwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCksCiAgICAgICAgICAgICBpbnRlcm5hbFBhY2thZ2VOYW1lLCB1aWQsIFVTRV9DQUxMSU5HX1BJRCwKLSAgICAgICAgICAgIEFQSV8xLCAvKmxlZ2FjeU1vZGUqLyBmYWxzZSwgLypzaGltVXBkYXRlT25seSovIHRydWUsCi0gICAgICAgICAgICAvKm91dCovIHRtcCkKKyAgICAgICAgICAgIEFQSV8xLCAvKnNoaW1VcGRhdGVPbmx5Ki8gdHJ1ZSwgLypvdXQqLyB0bXApCiAgICAgICAgICAgICApLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGluaXRpYWxpemluZyBzaGltIG1ldGFkYXRhOiAlcyIsIF9fRlVOQ1RJT05fXywgcmV0LnRvU3RyaW5nOCgpLnN0cmluZygpKTsKICAgICB9CkBAIC03ODIsOSArODE2LDkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIGludDY0X3QgdG9rZW4gPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICByZXQgPSBpbml0aWFsaXplU2hpbU1ldGFkYXRhKGNhbWVyYUlkKTsKLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CiAgICAgICAgIC8vIEVycm9yIGFscmVhZHkgbG9nZ2VkIGJ5IGNhbGxlZQogICAgICAgICByZXR1cm4gcmV0OwpAQCAtODQxLDcgKzg3NSw3IEBACiAgICAgfQogI2VuZGlmICAvLyBfX0JSSUxMT19fCiAKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAKICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewogICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChjYW1lcmEgSEFMIG1vZHVsZSBub3QgbG9hZGVkKSIsCkBAIC04NzUsOCArOTA5LDggQEAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjp2YWxpZGF0ZUNsaWVudFBlcm1pc3Npb25zTG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjbGllbnROYW1lOCwgaW50JiBjbGllbnRVaWQsIGludCYgY2xpZW50UGlkLAogICAgICAgICAvKm91dCovaW50JiBvcmlnaW5hbENsaWVudFBpZCkgY29uc3QgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwotICAgIGludCBjYWxsaW5nVWlkID0gZ2V0Q2FsbGluZ1VpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1VpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAKICAgICAvLyBDaGVjayBpZiB3ZSBjYW4gdHJ1c3QgY2xpZW50VWlkCiAgICAgaWYgKGNsaWVudFVpZCA9PSBVU0VfQ0FMTElOR19VSUQpIHsKQEAgLTkyMiw2ICs5NTYsMTQgQEAKICAgICAgICAgICAgICAgICBjbGllbnROYW1lOC5zdHJpbmcoKSwgY2xpZW50VWlkLCBjbGllbnRQaWQsIGNhbWVyYUlkLnN0cmluZygpKTsKICAgICB9CiAKKyAgICAvLyBJZiBzZW5zb3IgcHJpdmFjeSBpcyBlbmFibGVkIHRoZW4gcHJldmVudCBhY2Nlc3MgdG8gdGhlIGNhbWVyYQorICAgIGlmIChtU2Vuc29yUHJpdmFjeVBvbGljeS0+aXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpKSB7CisgICAgICAgIEFMT0dFKCJBY2Nlc3MgRGVuaWFsOiBjYW5ub3QgdXNlIHRoZSBjYW1lcmEgd2hlbiBzZW5zb3IgcHJpdmFjeSBpcyBlbmFibGVkIik7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0RJU0FCTEVELAorICAgICAgICAgICAgICAgICJDYWxsZXIgXCIlc1wiIChQSUQgJWQsIFVJRCAlZCkgY2Fubm90IG9wZW4gY2FtZXJhIFwiJXNcIiB3aGVuIHNlbnNvciBwcml2YWN5ICIKKyAgICAgICAgICAgICAgICAiaXMgZW5hYmxlZCIsIGNsaWVudE5hbWU4LnN0cmluZygpLCBjbGllbnRVaWQsIGNsaWVudFBpZCwgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgIH0KKwogICAgIC8vIE9ubHkgdXNlIHBhc3NlZCBpbiBjbGllbnRQaWQgdG8gY2hlY2sgcGVybWlzc2lvbi4gVXNlIGNhbGxpbmcgUElEIGFzIHRoZSBjbGllbnQgUElEIHRoYXQncwogICAgIC8vIGNvbm5lY3RlZCB0byBjYW1lcmEgc2VydmljZSBkaXJlY3RseS4KICAgICBvcmlnaW5hbENsaWVudFBpZCA9IGNsaWVudFBpZDsKQEAgLTk0NSw3ICs5ODcsNyBAQAogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpjaGVja0lmRGV2aWNlSXNVc2FibGUoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpIGNvbnN0IHsKICAgICBhdXRvIGNhbWVyYVN0YXRlID0gZ2V0Q2FtZXJhU3RhdGUoY2FtZXJhSWQpOwotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBpZiAoY2FtZXJhU3RhdGUgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChpbnZhbGlkIGNhbWVyYSBJRCAlcykiLCBjYWxsaW5nUGlkLAogICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKQEAgLTExNDksNyArMTE5MSw3IEBACiAgICAgbVNlcnZpY2VMb2NrLnVubG9jaygpOwogCiAgICAgLy8gQ2xlYXIgY2FsbGVyIGlkZW50aXR5IHRlbXBvcmFyaWx5IHNvIGNsaWVudCBkaXNjb25uZWN0IFBJRCBjaGVja3Mgd29yayBjb3JyZWN0bHkKLSAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICBpbnQ2NF90IHRva2VuID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAKICAgICAvLyBEZXN0cm95IGV2aWN0ZWQgY2xpZW50cwogICAgIGZvciAoYXV0byYgaSA6IGV2aWN0ZWRDbGllbnRzKSB7CkBAIC0xMTU3LDcgKzExOTksNyBAQAogICAgICAgICBpLT5nZXRWYWx1ZSgpLT5kaXNjb25uZWN0KCk7IC8vIENsaWVudHMgd2lsbCByZW1vdmUgdGhlbXNlbHZlcyBmcm9tIHRoZSBhY3RpdmUgY2xpZW50IGxpc3QKICAgICB9CiAKLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAKICAgICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBldmljdGVkQ2xpZW50cykgewogICAgICAgICBBTE9HVigiJXM6IFdhaXRpbmcgZm9yIGRpc2Nvbm5lY3QgdG8gY29tcGxldGUgZm9yIGNsaWVudCBmb3IgZGV2aWNlICVzIChQSUQgJSIgUFJJZDMyICIpIiwKQEAgLTEyMDcsMTEgKzEyNDksMTAgQEAKICAgICBzcDxDbGllbnQ+IGNsaWVudCA9IG51bGxwdHI7CiAgICAgcmV0ID0gY29ubmVjdEhlbHBlcjxJQ2FtZXJhQ2xpZW50LENsaWVudD4oY2FtZXJhQ2xpZW50LCBpZCwgYXBpMUNhbWVyYUlkLAogICAgICAgICAgICAgQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCwgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudFVpZCwgY2xpZW50UGlkLCBBUElfMSwKLSAgICAgICAgICAgIC8qbGVnYWN5TW9kZSovIGZhbHNlLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsCi0gICAgICAgICAgICAvKm91dCovY2xpZW50KTsKKyAgICAgICAgICAgIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwgLypvdXQqL2NsaWVudCk7CiAKICAgICBpZighcmV0LmlzT2soKSkgewotICAgICAgICBsb2dSZWplY3RlZChpZCwgZ2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKKyAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAogICAgICAgICAgICAgICAgIHJldC50b1N0cmluZzgoKSk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQpAQCAtMTIzNCwxMiArMTI3NSwxMSBAQAogICAgIFN0YXR1cyByZXQgPSBTdGF0dXM6Om9rKCk7CiAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBudWxscHRyOwogICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KGNhbWVyYUNsaWVudCwgaWQsIGFwaTFDYW1lcmFJZCwgaGFsVmVyc2lvbiwKLSAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRVaWQsIFVTRV9DQUxMSU5HX1BJRCwgQVBJXzEsCi0gICAgICAgICAgICAvKmxlZ2FjeU1vZGUqLyB0cnVlLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsCisgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50VWlkLCBVU0VfQ0FMTElOR19QSUQsIEFQSV8xLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsCiAgICAgICAgICAgICAvKm91dCovY2xpZW50KTsKIAogICAgIGlmKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIGxvZ1JlamVjdGVkKGlkLCBnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAorICAgICAgICBsb2dSZWplY3RlZChpZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCiAgICAgICAgICAgICAgICAgcmV0LnRvU3RyaW5nOCgpKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CkBAIC0xMjQ4LDYgKzEyODgsMTggQEAKICAgICByZXR1cm4gcmV0OwogfQogCitib29sIENhbWVyYVNlcnZpY2U6OnNob3VsZFJlamVjdEhpZGRlbkNhbWVyYUNvbm5lY3Rpb24oY29uc3QgU3RyaW5nOCAmIGNhbWVyYUlkKSB7CisgICAgLy8gSWYgdGhlIHRocmVhZCBzZXJ2aW5nIHRoaXMgY2FsbCBpcyBub3QgYSBod2JpbmRlciB0aHJlYWQgYW5kIHRoZSBjYWxsZXIKKyAgICAvLyBpc24ndCB0aGUgY2FtZXJhc2VydmVyIGl0c2VsZiwgYW5kIHRoZSBjYW1lcmEgaWQgYmVpbmcgcmVxdWVzdGVkIGlzIHRvIGJlCisgICAgLy8gcHVibGljYWxseSBoaWRkZW4sIHdlIHNob3VsZCByZWplY3QgdGhlIGNvbm5lY3Rpb24uCisgICAgaWYgKCFoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+aXNTZXJ2aW5nQ2FsbCgpICYmCisgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpICE9IGdldHBpZCgpICYmCisgICAgICAgICAgICBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5pc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoY2FtZXJhSWQuY19zdHIoKSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwogU3RhdHVzIENhbWVyYVNlcnZpY2U6OmNvbm5lY3REZXZpY2UoCiAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiYgY2FtZXJhQ2IsCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwKQEAgLTEyNjAsMTUgKzEzMTIsMTQgQEAKICAgICBTdGF0dXMgcmV0ID0gU3RhdHVzOjpvaygpOwogICAgIFN0cmluZzggaWQgPSBTdHJpbmc4KGNhbWVyYUlkKTsKICAgICBzcDxDYW1lcmFEZXZpY2VDbGllbnQ+IGNsaWVudCA9IG51bGxwdHI7CisKICAgICByZXQgPSBjb25uZWN0SGVscGVyPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLENhbWVyYURldmljZUNsaWVudD4oY2FtZXJhQ2IsIGlkLAogICAgICAgICAgICAgLyphcGkxQ2FtZXJhSWQqLy0xLAogICAgICAgICAgICAgQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCwgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBjbGllbnRVaWQsIFVTRV9DQUxMSU5HX1BJRCwgQVBJXzIsCi0gICAgICAgICAgICAvKmxlZ2FjeU1vZGUqLyBmYWxzZSwgLypzaGltVXBkYXRlT25seSovIGZhbHNlLAotICAgICAgICAgICAgLypvdXQqL2NsaWVudCk7CisgICAgICAgICAgICBjbGllbnRVaWQsIFVTRV9DQUxMSU5HX1BJRCwgQVBJXzIsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwgLypvdXQqL2NsaWVudCk7CiAKICAgICBpZighcmV0LmlzT2soKSkgewotICAgICAgICBsb2dSZWplY3RlZChpZCwgZ2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKKyAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAogICAgICAgICAgICAgICAgIHJldC50b1N0cmluZzgoKSk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQpAQCAtMTI4MCw3ICsxMzMxLDcgQEAKIHRlbXBsYXRlPGNsYXNzIENBTExCQUNLLCBjbGFzcyBDTElFTlQ+CiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6Y29ubmVjdEhlbHBlcihjb25zdCBzcDxDQUxMQkFDSz4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGhhbFZlcnNpb24sIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwKLSAgICAgICAgaW50IGNsaWVudFBpZCwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgbGVnYWN5TW9kZSwgYm9vbCBzaGltVXBkYXRlT25seSwKKyAgICAgICAgaW50IGNsaWVudFBpZCwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgc2hpbVVwZGF0ZU9ubHksCiAgICAgICAgIC8qb3V0Ki9zcDxDTElFTlQ+JiBkZXZpY2UpIHsKICAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKIApAQCAtMTI5Myw2ICsxMzQ0LDE0IEBACiAgICAgICAgICAgICAoaGFsVmVyc2lvbiA9PSAtMSkgPyAiZGVmYXVsdCIgOiBzdGQ6OnRvX3N0cmluZyhoYWxWZXJzaW9uKS5jX3N0cigpLAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihlZmZlY3RpdmVBcGlMZXZlbCkpOwogCisgICAgaWYgKHNob3VsZFJlamVjdEhpZGRlbkNhbWVyYUNvbm5lY3Rpb24oY2FtZXJhSWQpKSB7CisgICAgICAgIEFMT0dXKCJBdHRlbXB0aW5nIHRvIGNvbm5lY3QgdG8gc3lzdGVtLW9ubHkgY2FtZXJhIGlkICVzLCBjb25uZWN0aW9uIHJlamVjdGVkIiwKKyAgICAgICAgICAgICAgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0RJU0NPTk5FQ1RFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGNhbWVyYSBkZXZpY2Ugd2l0aCBJRCBcIiVzXCIgY3VycmVudGx5IGF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKKworICAgIH0KICAgICBzcDxDTElFTlQ+IGNsaWVudCA9IG51bGxwdHI7CiAgICAgewogICAgICAgICAvLyBBY3F1aXJlIG1TZXJ2aWNlTG9jayBhbmQgcHJldmVudCBvdGhlciBjbGllbnRzIGZyb20gY29ubmVjdGluZwpAQCAtMTM2NSw3ICsxNDI0LDcgQEAKICAgICAgICAgc3A8QmFzaWNDbGllbnQ+IHRtcCA9IG51bGxwdHI7CiAgICAgICAgIGlmKCEocmV0ID0gbWFrZUNsaWVudCh0aGlzLCBjYW1lcmFDYiwgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGFwaTFDYW1lcmFJZCwgZmFjaW5nLAotICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwgbGVnYWN5TW9kZSwKKyAgICAgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwgZ2V0cGlkKCksCiAgICAgICAgICAgICAgICAgaGFsVmVyc2lvbiwgZGV2aWNlVmVyc2lvbiwgZWZmZWN0aXZlQXBpTGV2ZWwsCiAgICAgICAgICAgICAgICAgLypvdXQqLyZ0bXApKS5pc09rKCkpIHsKICAgICAgICAgICAgIHJldHVybiByZXQ7CkBAIC0xNDQ5LDcgKzE1MDgsNyBAQAogICAgIH0KIAogICAgIFN0cmluZzggaWQgPSBTdHJpbmc4KGNhbWVyYUlkLnN0cmluZygpKTsKLSAgICBpbnQgdWlkID0gZ2V0Q2FsbGluZ1VpZCgpOworICAgIGludCB1aWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpOwogCiAgICAgLy8gdmVyaWZ5IGlkIGlzIHZhbGlkLgogICAgIGF1dG8gc3RhdGUgPSBnZXRDYW1lcmFTdGF0ZShpZCk7CkBAIC0xNTU2LDcgKzE2MTUsNyBAQAogCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6bm90aWZ5U3lzdGVtRXZlbnQoaW50MzJfdCBldmVudElkLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgYXJncykgewotICAgIGNvbnN0IGludCBwaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgY29uc3QgaW50IHBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgY29uc3QgaW50IHNlbGZQaWQgPSBnZXRwaWQoKTsKIAogICAgIC8vIFBlcm1pc3Npb24gY2hlY2tzCkBAIC0xNTY1LDcgKzE2MjQsNyBAQAogICAgICAgICAvLyBwZXJtaXNzaW9ucyB0byBub3RpZnkgdGhlIGNhbWVyYSBzZXJ2aWNlIGFib3V0IHN5c3RlbSBldmVudHMKICAgICAgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgIFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBX1NFTkRfU1lTVEVNX0VWRU5UUyIpKSkgewotICAgICAgICAgICAgY29uc3QgaW50IHVpZCA9IGdldENhbGxpbmdVaWQoKTsKKyAgICAgICAgICAgIGNvbnN0IGludCB1aWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpOwogICAgICAgICAgICAgQUxPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiBjYW5ub3Qgc2VuZCB1cGRhdGVzIHRvIGNhbWVyYSBzZXJ2aWNlIGFib3V0IHN5c3RlbSIKICAgICAgICAgICAgICAgICAgICAgIiBldmVudHMgZnJvbSBwaWQ9JWQsIHVpZD0lZCIsIHBpZCwgdWlkKTsKICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX1BFUk1JU1NJT05fREVOSUVELApAQCAtMTU3OCw5ICsxNjM3LDEwIEBACiAKICAgICBzd2l0Y2goZXZlbnRJZCkgewogICAgICAgICBjYXNlIElDYW1lcmFTZXJ2aWNlOjpFVkVOVF9VU0VSX1NXSVRDSEVEOiB7Ci0gICAgICAgICAgICAvLyBUcnkgdG8gcmVnaXN0ZXIgZm9yIFVJRCBwb2xpY3kgdXBkYXRlcywgaW4gY2FzZSB3ZSdyZSByZWNvdmVyaW5nCisgICAgICAgICAgICAvLyBUcnkgdG8gcmVnaXN0ZXIgZm9yIFVJRCBhbmQgc2Vuc29yIHByaXZhY3kgcG9saWN5IHVwZGF0ZXMsIGluIGNhc2Ugd2UncmUgcmVjb3ZlcmluZwogICAgICAgICAgICAgLy8gZnJvbSBhIHN5c3RlbSBzZXJ2ZXIgY3Jhc2gKICAgICAgICAgICAgIG1VaWRQb2xpY3ktPnJlZ2lzdGVyU2VsZigpOworICAgICAgICAgICAgbVNlbnNvclByaXZhY3lQb2xpY3ktPnJlZ2lzdGVyU2VsZigpOwogICAgICAgICAgICAgZG9Vc2VyU3dpdGNoKC8qbmV3VXNlcklkcyovIGFyZ3MpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE1OTQsOSArMTY1NCw3MiBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6bm90aWZ5TW9uaXRvcmVkVWlkcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTGlzdGVuZXJMb2NrKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBtTGlzdGVuZXJMaXN0KSB7CisgICAgICAgIGF1dG8gcmV0ID0gaXQuc2Vjb25kLT5nZXRMaXN0ZW5lcigpLT5vbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkKCk7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gdHJpZ2dlciBwZXJtaXNzaW9uIGNhbGxiYWNrOiAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgcmV0LmV4Y2VwdGlvbkNvZGUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1N0YXR1cyBDYW1lcmFTZXJ2aWNlOjpub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShpbnQ2NF90IG5ld1N0YXRlKSB7CisgICAgY29uc3QgaW50IHBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CisgICAgY29uc3QgaW50IHNlbGZQaWQgPSBnZXRwaWQoKTsKKworICAgIC8vIFBlcm1pc3Npb24gY2hlY2tzCisgICAgaWYgKHBpZCAhPSBzZWxmUGlkKSB7CisgICAgICAgIC8vIEVuc3VyZSB3ZSdyZSBiZWluZyBjYWxsZWQgYnkgc3lzdGVtX3NlcnZlciwgb3Igc2ltaWxhciBwcm9jZXNzIHdpdGgKKyAgICAgICAgLy8gcGVybWlzc2lvbnMgdG8gbm90aWZ5IHRoZSBjYW1lcmEgc2VydmljZSBhYm91dCBzeXN0ZW0gZXZlbnRzCisgICAgICAgIGlmICghY2hlY2tDYWxsaW5nUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICBTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMiKSkpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB1aWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpOworICAgICAgICAgICAgQUxPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiBjYW5ub3Qgc2VuZCB1cGRhdGVzIHRvIGNhbWVyYSBzZXJ2aWNlIGFib3V0IGRldmljZSIKKyAgICAgICAgICAgICAgICAgICAgIiBzdGF0ZSBjaGFuZ2VzIGZyb20gcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9QRVJNSVNTSU9OX0RFTklFRCwKKyAgICAgICAgICAgICAgICAgICAgIk5vIHBlcm1pc3Npb24gdG8gc2VuZCB1cGRhdGVzIHRvIGNhbWVyYSBzZXJ2aWNlIGFib3V0IGRldmljZSBzdGF0ZSIKKyAgICAgICAgICAgICAgICAgICAgIiBjaGFuZ2VzIGZyb20gcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlOworICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPERldmljZVN0YXRlPiBuZXdEZXZpY2VTdGF0ZXt9OworICAgIGlmIChuZXdTdGF0ZSAmIElDYW1lcmFTZXJ2aWNlOjpERVZJQ0VfU1RBVEVfQkFDS19DT1ZFUkVEKSB7CisgICAgICAgIG5ld0RldmljZVN0YXRlIHw9IERldmljZVN0YXRlOjpCQUNLX0NPVkVSRUQ7CisgICAgfQorICAgIGlmIChuZXdTdGF0ZSAmIElDYW1lcmFTZXJ2aWNlOjpERVZJQ0VfU1RBVEVfRlJPTlRfQ09WRVJFRCkgeworICAgICAgICBuZXdEZXZpY2VTdGF0ZSB8PSBEZXZpY2VTdGF0ZTo6RlJPTlRfQ09WRVJFRDsKKyAgICB9CisgICAgaWYgKG5ld1N0YXRlICYgSUNhbWVyYVNlcnZpY2U6OkRFVklDRV9TVEFURV9GT0xERUQpIHsKKyAgICAgICAgbmV3RGV2aWNlU3RhdGUgfD0gRGV2aWNlU3RhdGU6OkZPTERFRDsKKyAgICB9CisgICAgLy8gT25seSBtYXAgdmVuZG9yIGJpdHMgZGlyZWN0bHkKKyAgICB1aW50NjRfdCB2ZW5kb3JCaXRzID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG5ld1N0YXRlKSAmIDB4RkZGRkZGRkYwMDAwMDAwMGw7CisgICAgbmV3RGV2aWNlU3RhdGUgfD0gdmVuZG9yQml0czsKKworICAgIEFMT0dWKCIlczogTmV3IGRldmljZSBzdGF0ZSAweCUiIFBSSXg2NCwgX19GVU5DVElPTl9fLCBuZXdEZXZpY2VTdGF0ZSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVNlcnZpY2VMb2NrKTsKKyAgICBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShuZXdEZXZpY2VTdGF0ZSk7CisKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6YWRkTGlzdGVuZXIoY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyLAogICAgICAgICAvKm91dCovCiAgICAgICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+ICpjYW1lcmFTdGF0dXNlcykgeworICAgIHJldHVybiBhZGRMaXN0ZW5lckhlbHBlcihsaXN0ZW5lciwgY2FtZXJhU3RhdHVzZXMpOworfQorCitTdGF0dXMgQ2FtZXJhU2VydmljZTo6YWRkTGlzdGVuZXJIZWxwZXIoY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAvKm91dCovCisgICAgICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+ICpjYW1lcmFTdGF0dXNlcywKKyAgICAgICAgYm9vbCBpc1ZlbmRvckxpc3RlbmVyKSB7CisKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgQUxPR1YoIiVzOiBBZGQgbGlzdGVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIGxpc3RlbmVyLmdldCgpKTsKQEAgLTE2MTAsMjEgKzE3MzMsMzcgQEAKIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xpc3RlbmVyTG9jayk7Ci0gICAgICAgIGZvciAoYXV0byYgaXQgOiBtTGlzdGVuZXJMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoSUludGVyZmFjZTo6YXNCaW5kZXIoaXQpID09IElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogbUxpc3RlbmVyTGlzdCkgeworICAgICAgICAgICAgaWYgKElJbnRlcmZhY2U6OmFzQmluZGVyKGl0LnNlY29uZC0+Z2V0TGlzdGVuZXIoKSkgPT0gSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBUcmllZCB0byBhZGQgbGlzdGVuZXIgJXAgd2hpY2ggd2FzIGFscmVhZHkgc3Vic2NyaWJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBsaXN0ZW5lci5nZXQoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihFUlJPUl9BTFJFQURZX0VYSVNUUywgIkxpc3RlbmVyIGFscmVhZHkgcmVnaXN0ZXJlZCIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgbUxpc3RlbmVyTGlzdC5wdXNoX2JhY2sobGlzdGVuZXIpOworICAgICAgICBhdXRvIGNsaWVudFVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CisgICAgICAgIHNwPFNlcnZpY2VMaXN0ZW5lcj4gc2VydmljZUxpc3RlbmVyID0gbmV3IFNlcnZpY2VMaXN0ZW5lcih0aGlzLCBsaXN0ZW5lciwgY2xpZW50VWlkKTsKKyAgICAgICAgYXV0byByZXQgPSBzZXJ2aWNlTGlzdGVuZXItPmluaXRpYWxpemUoKTsKKyAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkZhaWxlZCB0byBpbml0aWFsaXplIHNlcnZpY2UgbGlzdGVuZXI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKEVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RlbmVyTGlzdC5lbXBsYWNlX2JhY2soaXNWZW5kb3JMaXN0ZW5lciwgc2VydmljZUxpc3RlbmVyKTsKKyAgICAgICAgbVVpZFBvbGljeS0+cmVnaXN0ZXJNb25pdG9yVWlkKGNsaWVudFVpZCk7CiAgICAgfQogCiAgICAgLyogQ29sbGVjdCBjdXJyZW50IGRldmljZXMgYW5kIHN0YXR1cyAqLwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUNhbWVyYVN0YXRlc0xvY2spOwogICAgICAgICBmb3IgKGF1dG8mIGkgOiBtQ2FtZXJhU3RhdGVzKSB7CisgICAgICAgICAgICBpZiAoIWlzVmVuZG9yTGlzdGVuZXIgJiYKKyAgICAgICAgICAgICAgICBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5pc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoaS5maXJzdC5jX3N0cigpKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJDYW5ub3QgYWRkIHB1YmxpYyBsaXN0ZW5lciBmb3IgaGlkZGVuIHN5c3RlbS1vbmx5ICVzIGZvciBwaWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIGkuZmlyc3QuY19zdHIoKSwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYW1lcmFTdGF0dXNlcy0+ZW1wbGFjZV9iYWNrKGkuZmlyc3QsIG1hcFRvSW50ZXJmYWNlKGkuc2Vjb25kLT5nZXRTdGF0dXMoKSkpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTY1OSw3ICsxNzk4LDkgQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMaXN0ZW5lckxvY2spOwogICAgICAgICBmb3IgKGF1dG8gaXQgPSBtTGlzdGVuZXJMaXN0LmJlZ2luKCk7IGl0ICE9IG1MaXN0ZW5lckxpc3QuZW5kKCk7IGl0KyspIHsKLSAgICAgICAgICAgIGlmIChJSW50ZXJmYWNlOjphc0JpbmRlcigqaXQpID09IElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSkgeworICAgICAgICAgICAgaWYgKElJbnRlcmZhY2U6OmFzQmluZGVyKGl0LT5zZWNvbmQtPmdldExpc3RlbmVyKCkpID09IElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSkgeworICAgICAgICAgICAgICAgIG1VaWRQb2xpY3ktPnVucmVnaXN0ZXJNb25pdG9yVWlkKGl0LT5zZWNvbmQtPmdldExpc3RlbmVyVWlkKCkpOworICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKS0+dW5saW5rVG9EZWF0aChpdC0+c2Vjb25kKTsKICAgICAgICAgICAgICAgICBtTGlzdGVuZXJMaXN0LmVyYXNlKGl0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogICAgICAgICAgICAgfQpAQCAtMTcxNyw3ICsxODU4LDcgQEAKICAgICB9CiAKICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oaWQpOwotICAgIHN3aXRjaChkZXZpY2VWZXJzaW9uKSB7CisgICAgc3dpdGNoIChkZXZpY2VWZXJzaW9uKSB7CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA6CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CkBAIC0xNzM0LDYgKzE4NzUsNyBAQAogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zOgogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM180OgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181OgogICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgaWQgJXMgdXNlcyBIQUwzLjIgb3IgbmV3ZXIsIHN1cHBvcnRzIGFwaTEvYXBpMiBkaXJlY3RseSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOwogICAgICAgICAgICAgKmlzU3VwcG9ydGVkID0gdHJ1ZTsKQEAgLTE3NTQsNiArMTg5NiwxOCBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKK1N0YXR1cyBDYW1lcmFTZXJ2aWNlOjppc0hpZGRlblBoeXNpY2FsQ2FtZXJhKGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwKKyAgICAgICAgLypvdXQqLyBib29sICppc1N1cHBvcnRlZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBjb25zdCBTdHJpbmc4IGlkID0gU3RyaW5nOChjYW1lcmFJZCk7CisKKyAgICBBTE9HVigiJXM6IGZvciBjYW1lcmEgSUQgPSAlcyIsIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOworICAgICppc1N1cHBvcnRlZCA9IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoaWQuc3RyaW5nKCkpOworCisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKwogdm9pZCBDYW1lcmFTZXJ2aWNlOjpyZW1vdmVCeUNsaWVudChjb25zdCBCYXNpY0NsaWVudCogY2xpZW50KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKICAgICBmb3IgKGF1dG8mIGkgOiBtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXRBbGwoKSkgewpAQCAtMTkwMSwxMyArMjA1NSwxMyBAQAogICAgIG1TZXJ2aWNlTG9jay51bmxvY2soKTsKIAogICAgIC8vIENsZWFyIGNhbGxlciBpZGVudGl0eSB0ZW1wb3JhcmlseSBzbyBjbGllbnQgZGlzY29ubmVjdCBQSUQgY2hlY2tzIHdvcmsgY29ycmVjdGx5Ci0gICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgaW50NjRfdCB0b2tlbiA9IENhbWVyYVRocmVhZFN0YXRlOjpjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogCiAgICAgZm9yIChhdXRvJiBpIDogZXZpY3RlZCkgewogICAgICAgICBpLT5kaXNjb25uZWN0KCk7CiAgICAgfQogCi0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogCiAgICAgLy8gUmVhY3F1aXJlIG1TZXJ2aWNlTG9jawogICAgIG1TZXJ2aWNlTG9jay5sb2NrKCk7CkBAIC0xOTc1LDcgKzIxMjksNiBAQAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6b25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksCiAgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CiAKLQogICAgIC8vIFBlcm1pc3Npb24gY2hlY2tzCiAgICAgc3dpdGNoIChjb2RlKSB7CiAgICAgICAgIGNhc2UgU0hFTExfQ09NTUFORF9UUkFOU0FDVElPTjogewpAQCAtMjA5OCw3ICsyMjUxLDcgQEAKICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkKSwKICAgICAgICAgbUNhbWVyYUlkKGFwaTFDYW1lcmFJZCkKIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiQ2xpZW50OjpDbGllbnQgRSAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBtQ2FtZXJhSWQpOwogCiAgICAgbVJlbW90ZUNhbGxiYWNrID0gY2FtZXJhQ2xpZW50OwpAQCAtMjE4NSw2ICsyMzM4LDggQEAKICAgICBzQ2FtZXJhU2VydmljZS0+cmVtb3ZlQnlDbGllbnQodGhpcyk7CiAgICAgc0NhbWVyYVNlcnZpY2UtPmxvZ0Rpc2Nvbm5lY3RlZChtQ2FtZXJhSWRTdHIsIG1DbGllbnRQaWQsCiAgICAgICAgICAgICBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkpOworICAgIHNDYW1lcmFTZXJ2aWNlLT5tQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5yZW1vdmVSZWYoQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpEZXZpY2VNb2RlOjpDQU1FUkEsCisgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuY19zdHIoKSk7CiAKICAgICBzcDxJQmluZGVyPiByZW1vdGUgPSBnZXRSZW1vdGUoKTsKICAgICBpZiAocmVtb3RlICE9IG51bGxwdHIpIHsKQEAgLTIyMDcsNyArMjM2Miw3IEBACiAgICAgLy8gTm8gZHVtcGluZyBvZiBjbGllbnRzIGRpcmVjdGx5IG92ZXIgQmluZGVyLAogICAgIC8vIG11c3QgZ28gdGhyb3VnaCBDYW1lcmFTZXJ2aWNlOjpkdW1wCiAgICAgYW5kcm9pZF9lcnJvcldyaXRlV2l0aEluZm9Mb2coU05fRVZFTlRfTE9HX0lELCAiMjYyNjU0MDMiLAotICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpLCBOVUxMLCAwKTsKKyAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCksIE5VTEwsIDApOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjI3Miw2ICsyNDI3LDggQEAKICAgICBzQ2FtZXJhU2VydmljZS0+dXBkYXRlUHJveHlEZXZpY2VTdGF0ZShJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfU1RBVEVfT1BFTiwKICAgICAgICAgICAgIG1DYW1lcmFJZFN0ciwgbUNhbWVyYUZhY2luZywgbUNsaWVudFBhY2thZ2VOYW1lLCBhcGlMZXZlbCk7CiAKKyAgICBzQ2FtZXJhU2VydmljZS0+bVVpZFBvbGljeS0+cmVnaXN0ZXJNb25pdG9yVWlkKG1DbGllbnRVaWQpOworCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yMzA5LDYgKzI0NjYsOCBAQAogICAgIH0KICAgICBtT3BzQ2FsbGJhY2suY2xlYXIoKTsKIAorICAgIHNDYW1lcmFTZXJ2aWNlLT5tVWlkUG9saWN5LT51bnJlZ2lzdGVyTW9uaXRvclVpZChtQ2xpZW50VWlkKTsKKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjM0NCw3ICsyNTAzLDcgQEAKIAogICAgIC8vIFJlc2V0IHRoZSBjbGllbnQgUElEIHRvIGFsbG93IHNlcnZlci1pbml0aWF0ZWQgZGlzY29ubmVjdCwKICAgICAvLyBhbmQgdG8gcHJldmVudCBmdXJ0aGVyIGNhbGxzIGJ5IGNsaWVudC4KLSAgICBtQ2xpZW50UGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIG1DbGllbnRQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzOyAvLyBhIGR1bW15IHJlc3VsdCAoaW52YWxpZCkKICAgICBub3RpZnlFcnJvcihoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RJU0FCTEVELCByZXN1bHRFeHRyYXMpOwogICAgIGRpc2Nvbm5lY3QoKTsKQEAgLTIzOTksNyArMjU1OCw3IEBACiAgICAgaWYgKG1SZWdpc3RlcmVkKSByZXR1cm47CiAgICAgYW0ucmVnaXN0ZXJVaWRPYnNlcnZlcih0aGlzLCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9HT05FCiAgICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0lETEUKLSAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfQUNUSVZFLAorICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9BQ1RJVkUgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9QUk9DU1RBVEUsCiAgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTiwKICAgICAgICAgICAgIFN0cmluZzE2KCJjYW1lcmFzZXJ2ZXIiKSk7CiAgICAgc3RhdHVzX3QgcmVzID0gYW0ubGlua1RvRGVhdGgodGhpcyk7CkBAIC0yNDQ1LDYgKzI2MDQsNTEgQEAKICAgICB9CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6VWlkUG9saWN5OjpvblVpZFN0YXRlQ2hhbmdlZCh1aWRfdCB1aWQsIGludDMyX3QgcHJvY1N0YXRlLAorICAgICAgICBpbnQ2NF90IC8qcHJvY1N0YXRlU2VxKi8pIHsKKyAgICBib29sIHByb2NTdGF0ZUNoYW5nZSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VaWRMb2NrKTsKKyAgICAgICAgaWYgKChtTW9uaXRvcmVkVWlkcy5maW5kKHVpZCkgIT0gbU1vbml0b3JlZFVpZHMuZW5kKCkpICYmCisgICAgICAgICAgICAgICAgKG1Nb25pdG9yZWRVaWRzW3VpZF0uZmlyc3QgIT0gcHJvY1N0YXRlKSkgeworICAgICAgICAgICAgbU1vbml0b3JlZFVpZHNbdWlkXS5maXJzdCA9IHByb2NTdGF0ZTsKKyAgICAgICAgICAgIHByb2NTdGF0ZUNoYW5nZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHJvY1N0YXRlQ2hhbmdlKSB7CisgICAgICAgIHNwPENhbWVyYVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNlcnZpY2UtPm5vdGlmeU1vbml0b3JlZFVpZHMoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6OnJlZ2lzdGVyTW9uaXRvclVpZCh1aWRfdCB1aWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOworICAgIGF1dG8gaXQgPSBtTW9uaXRvcmVkVWlkcy5maW5kKHVpZCk7CisgICAgaWYgKGl0ICE9IG1Nb25pdG9yZWRVaWRzLmVuZCgpKSB7CisgICAgICAgIGl0LT5zZWNvbmQuc2Vjb25kKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbU1vbml0b3JlZFVpZHMuZW1wbGFjZSgKKyAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8dWlkX3QsIHN0ZDo6cGFpcjxpbnQzMl90LCBzaXplX3Q+PiAodWlkLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8aW50MzJfdCwgc2l6ZV90PiAoQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX05PTkVYSVNURU5ULCAxKSkpOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6OnVucmVnaXN0ZXJNb25pdG9yVWlkKHVpZF90IHVpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtVWlkTG9jayk7CisgICAgYXV0byBpdCA9IG1Nb25pdG9yZWRVaWRzLmZpbmQodWlkKTsKKyAgICBpZiAoaXQgIT0gbU1vbml0b3JlZFVpZHMuZW5kKCkpIHsKKyAgICAgICAgaXQtPnNlY29uZC5zZWNvbmQtLTsKKyAgICAgICAgaWYgKGl0LT5zZWNvbmQuc2Vjb25kID09IDApIHsKKyAgICAgICAgICAgIG1Nb25pdG9yZWRVaWRzLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogVHJ5aW5nIHRvIHVucmVnaXN0ZXIgdWlkOiAlZCB3aGljaCBpcyBub3QgbW9uaXRvcmVkISIsIF9fRlVOQ1RJT05fXywgdWlkKTsKKyAgICB9Cit9CisKIGJvb2wgQ2FtZXJhU2VydmljZTo6VWlkUG9saWN5Ojppc1VpZEFjdGl2ZSh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VaWRMb2NrKTsKICAgICByZXR1cm4gaXNVaWRBY3RpdmVMb2NrZWQodWlkLCBjYWxsaW5nUGFja2FnZSk7CkBAIC0yNTQ1LDYgKzI3NDksNTkgQEAKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgICAgICBTZW5zb3JQcml2YWN5UG9saWN5CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIENhbWVyYVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OnJlZ2lzdGVyU2VsZigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlbnNvclByaXZhY3lMb2NrKTsKKyAgICBpZiAobVJlZ2lzdGVyZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTZW5zb3JQcml2YWN5TWFuYWdlciBzcG07CisgICAgc3BtLmFkZFNlbnNvclByaXZhY3lMaXN0ZW5lcih0aGlzKTsKKyAgICBtU2Vuc29yUHJpdmFjeUVuYWJsZWQgPSBzcG0uaXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpOworICAgIHN0YXR1c190IHJlcyA9IHNwbS5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIG1SZWdpc3RlcmVkID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoIlNlbnNvclByaXZhY3lQb2xpY3k6IFJlZ2lzdGVyZWQgd2l0aCBTZW5zb3JQcml2YWN5TWFuYWdlciIpOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5Ojp1bnJlZ2lzdGVyU2VsZigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlbnNvclByaXZhY3lMb2NrKTsKKyAgICBTZW5zb3JQcml2YWN5TWFuYWdlciBzcG07CisgICAgc3BtLnJlbW92ZVNlbnNvclByaXZhY3lMaXN0ZW5lcih0aGlzKTsKKyAgICBzcG0udW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICBtUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgIEFMT0dWKCJTZW5zb3JQcml2YWN5UG9saWN5OiBVbnJlZ2lzdGVyZWQgd2l0aCBTZW5zb3JQcml2YWN5TWFuYWdlciIpOworfQorCitib29sIENhbWVyYVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OmlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZW5zb3JQcml2YWN5TG9jayk7CisgICAgcmV0dXJuIG1TZW5zb3JQcml2YWN5RW5hYmxlZDsKK30KKworYmluZGVyOjpTdGF0dXMgQ2FtZXJhU2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6b25TZW5zb3JQcml2YWN5Q2hhbmdlZChib29sIGVuYWJsZWQpIHsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vuc29yUHJpdmFjeUxvY2spOworICAgICAgICBtU2Vuc29yUHJpdmFjeUVuYWJsZWQgPSBlbmFibGVkOworICAgIH0KKyAgICAvLyBpZiBzZW5zb3IgcHJpdmFjeSBpcyBlbmFibGVkIHRoZW4gYmxvY2sgYWxsIGNsaWVudHMgZnJvbSBhY2Nlc3NpbmcgdGhlIGNhbWVyYQorICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIHNwPENhbWVyYVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNlcnZpY2UtPmJsb2NrQWxsQ2xpZW50cygpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiAvKndobyovKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZW5zb3JQcml2YWN5TG9jayk7CisgICAgQUxPR1YoIlNlbnNvclByaXZhY3lQb2xpY3k6IFNlbnNvclByaXZhY3lNYW5hZ2VyIGhhcyBkaWVkIik7CisgICAgbVJlZ2lzdGVyZWQgPSBmYWxzZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICAgICAgICAgICAgICBDYW1lcmFTdGF0ZQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0yNzA1LDggKzI5NjIsOCBAQAogCiAgICAgaWYgKGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIikpID09IGZhbHNlKSB7CiAgICAgICAgIGRwcmludGYoZmQsICJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBDYW1lcmFTZXJ2aWNlIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCi0gICAgICAgICAgICAgICAgZ2V0Q2FsbGluZ1BpZCgpLAotICAgICAgICAgICAgICAgIGdldENhbGxpbmdVaWQoKSk7CisgICAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpKTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KICAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobVNlcnZpY2VMb2NrKTsKQEAgLTI4NzksNyArMzEzNiw3IEBACiAgICAgICAqIGJpbmRlciBkcml2ZXIKICAgICAgICovCiAgICAgLy8gUElEIGhlcmUgaXMgYXBwcm94aW1hdGUgYW5kIGNhbiBiZSB3cm9uZy4KLSAgICBsb2dDbGllbnREaWVkKGdldENhbGxpbmdQaWQoKSwgU3RyaW5nOCgiQmluZGVyIGRpZWQgdW5leHBlY3RlZGx5IikpOworICAgIGxvZ0NsaWVudERpZWQoQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgU3RyaW5nOCgiQmluZGVyIGRpZWQgdW5leHBlY3RlZGx5IikpOwogCiAgICAgLy8gY2hlY2sgdG9yY2ggY2xpZW50CiAgICAgaGFuZGxlVG9yY2hDbGllbnRCaW5kZXJEaWVkKHdobyk7CkBAIC0yOTM1LDcgKzMxOTIsMTQgQEAKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMaXN0ZW5lckxvY2spOwogCiAgICAgICAgICAgICBmb3IgKGF1dG8mIGxpc3RlbmVyIDogbUxpc3RlbmVyTGlzdCkgewotICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5vblN0YXR1c0NoYW5nZWQobWFwVG9JbnRlcmZhY2Uoc3RhdHVzKSwgU3RyaW5nMTYoY2FtZXJhSWQpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWxpc3RlbmVyLmZpcnN0ICYmCisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYShjYW1lcmFJZC5jX3N0cigpKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiU2tpcHBpbmcgY2FtZXJhIGRpc2NvdmVyeSBjYWxsYmFjayBmb3Igc3lzdGVtLW9ubHkgY2FtZXJhICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5zZWNvbmQtPmdldExpc3RlbmVyKCktPm9uU3RhdHVzQ2hhbmdlZChtYXBUb0ludGVyZmFjZShzdGF0dXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoY2FtZXJhSWQpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSk7CiB9CkBAIC0zMDMwLDYgKzMyOTQsMTggQEAKICAgICB9CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6YmxvY2tBbGxDbGllbnRzKCkgeworICAgIGNvbnN0IGF1dG8gY2xpZW50cyA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpOworICAgIGZvciAoYXV0byYgY3VycmVudCA6IGNsaWVudHMpIHsKKyAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY29uc3QgYXV0byBiYXNpY0NsaWVudCA9IGN1cnJlbnQtPmdldFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoYmFzaWNDbGllbnQuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGJhc2ljQ2xpZW50LT5ibG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCiAvLyBOT1RFOiBUaGlzIGlzIGEgcmVtb3RlIEFQSSAtIG1ha2Ugc3VyZSBhbGwgYXJncyBhcmUgdmFsaWRhdGVkCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpzaGVsbENvbW1hbmQoaW50IGluLCBpbnQgb3V0LCBpbnQgZXJyLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CiAgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNNYW5hZ2VDYW1lcmFQZXJtaXNzaW9uLCBudWxscHRyLCBudWxscHRyKSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCmluZGV4IDk5MWM3NzAuLjM0NGRkOTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFTRVJWSUNFX0gKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvQm5DYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9CblNlbnNvclByaXZhY3lMaXN0ZW5lci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VQcm94eS5oPgogCkBAIC0xNTMsMTIgKzE1NCwxOSBAQAogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICAgbm90aWZ5U3lzdGVtRXZlbnQoaW50MzJfdCBldmVudElkLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGFyZ3MpOwogCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShpbnQ2NF90IG5ld1N0YXRlKTsKKwogICAgIC8vIE9LID0gc3VwcG9ydHMgYXBpIG9mIHRoYXQgdmVyc2lvbiwgLUVPUE5PVFNVUFAgPSBkb2VzIG5vdCBzdXBwb3J0CiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICBzdXBwb3J0c0NhbWVyYUFwaSgKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwgaW50MzJfdCBhcGlWZXJzaW9uLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpOwogCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICBpc0hpZGRlblBoeXNpY2FsQ2FtZXJhKAorICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpOworCiAgICAgLy8gRXh0cmEgcGVybWlzc2lvbnMgY2hlY2tzCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOwpAQCAtMTY3LDYgKzE3NSwxMyBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzaGVsbENvbW1hbmQoaW50IGluLCBpbnQgb3V0LCBpbnQgZXJyLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAorICAgIGJpbmRlcjo6U3RhdHVzICAgICAgYWRkTGlzdGVuZXJIZWxwZXIoY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+KiBjYW1lcmFTdGF0dXNlcywgYm9vbCBpc1ZlbmRvciA9IGZhbHNlKTsKKworICAgIC8vIE1vbml0b3JlZCBVSURzIGF2YWlsYWJpbGl0eSBub3RpZmljYXRpb24KKyAgICB2b2lkICAgICAgICAgICAgICAgIG5vdGlmeU1vbml0b3JlZFVpZHMoKTsKKwogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIC8vIENsaWVudCBmdW5jdGlvbmFsaXR5CiAKQEAgLTUzMSwxMCArNTQ2LDE0IEBACiAgICAgICAgIHZvaWQgb25VaWRHb25lKHVpZF90IHVpZCwgYm9vbCBkaXNhYmxlZCk7CiAgICAgICAgIHZvaWQgb25VaWRBY3RpdmUodWlkX3QgdWlkKTsKICAgICAgICAgdm9pZCBvblVpZElkbGUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKTsKKyAgICAgICAgdm9pZCBvblVpZFN0YXRlQ2hhbmdlZCh1aWRfdCB1aWQsIGludDMyX3QgcHJvY1N0YXRlLCBpbnQ2NF90IHByb2NTdGF0ZVNlcSk7CiAKICAgICAgICAgdm9pZCBhZGRPdmVycmlkZVVpZCh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlLCBib29sIGFjdGl2ZSk7CiAgICAgICAgIHZvaWQgcmVtb3ZlT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSk7CiAKKyAgICAgICAgdm9pZCByZWdpc3Rlck1vbml0b3JVaWQodWlkX3QgdWlkKTsKKyAgICAgICAgdm9pZCB1bnJlZ2lzdGVyTW9uaXRvclVpZCh1aWRfdCB1aWQpOworCiAgICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IGltcGxlbWVudGF0aW9uCiAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOwogICAgIHByaXZhdGU6CkBAIC01NDUsMTEgKzU2NCw0MCBAQAogICAgICAgICBib29sIG1SZWdpc3RlcmVkOwogICAgICAgICB3cDxDYW1lcmFTZXJ2aWNlPiBtU2VydmljZTsKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpZF90PiBtQWN0aXZlVWlkczsKKyAgICAgICAgLy8gTW9uaXRvcmVkIHVpZCBtYXAgdG8gY2FjaGVkIHByb2NTdGF0ZSBhbmQgcmVmQ291bnQgcGFpcgorICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIHN0ZDo6cGFpcjxpbnQzMl90LCBzaXplX3Q+PiBtTW9uaXRvcmVkVWlkczsKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBib29sPiBtT3ZlcnJpZGVVaWRzOwogICAgIH07IC8vIGNsYXNzIFVpZFBvbGljeQogCisgICAgLy8gSWYgc2Vuc29yIHByaXZhY3kgaXMgZW5hYmxlZCB0aGVuIGFsbCBhcHBzLCBpbmNsdWRpbmcgdGhvc2UgdGhhdCBhcmUgYWN0aXZlLCBzaG91bGQgYmUKKyAgICAvLyBwcmV2ZW50ZWQgZnJvbSBhY2Nlc3NpbmcgdGhlIGNhbWVyYS4KKyAgICBjbGFzcyBTZW5zb3JQcml2YWN5UG9saWN5IDogcHVibGljIGhhcmR3YXJlOjpCblNlbnNvclByaXZhY3lMaXN0ZW5lciwKKyAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgZXhwbGljaXQgU2Vuc29yUHJpdmFjeVBvbGljeSh3cDxDYW1lcmFTZXJ2aWNlPiBzZXJ2aWNlKQorICAgICAgICAgICAgICAgICAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtU2Vuc29yUHJpdmFjeUVuYWJsZWQoZmFsc2UpLCBtUmVnaXN0ZXJlZChmYWxzZSkge30KKworICAgICAgICAgICAgdm9pZCByZWdpc3RlclNlbGYoKTsKKyAgICAgICAgICAgIHZvaWQgdW5yZWdpc3RlclNlbGYoKTsKKworICAgICAgICAgICAgYm9vbCBpc1NlbnNvclByaXZhY3lFbmFibGVkKCk7CisKKyAgICAgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uU2Vuc29yUHJpdmFjeUNoYW5nZWQoYm9vbCBlbmFibGVkKTsKKworICAgICAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOworCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB3cDxDYW1lcmFTZXJ2aWNlPiBtU2VydmljZTsKKyAgICAgICAgICAgIE11dGV4IG1TZW5zb3JQcml2YWN5TG9jazsKKyAgICAgICAgICAgIGJvb2wgbVNlbnNvclByaXZhY3lFbmFibGVkOworICAgICAgICAgICAgYm9vbCBtUmVnaXN0ZXJlZDsKKyAgICB9OworCiAgICAgc3A8VWlkUG9saWN5PiBtVWlkUG9saWN5OwogCisgICAgc3A8U2Vuc29yUHJpdmFjeVBvbGljeT4gbVNlbnNvclByaXZhY3lQb2xpY3k7CisKICAgICAvLyBEZWxheS1sb2FkIHRoZSBDYW1lcmEgSEFMIG1vZHVsZQogICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCk7CiAKQEAgLTU4MSwxMiArNjI5LDE1IEBACiAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiogY2xpZW50LAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cmVzb3VyY2VfcG9saWN5OjpDbGllbnREZXNjcmlwdG9yPFN0cmluZzgsIHNwPEJhc2ljQ2xpZW50Pj4+KiBwYXJ0aWFsKTsKIAorICAgIC8vIFNob3VsZCBhbiBvcGVyYXRpb24gYXR0ZW1wdCBvbiBhIGNhbWVyYUlkIGJlIHJlamVjdGVkLCBpZiB0aGUgY2FtZXJhIGlkIGlzCisgICAgLy8gYWR2ZXJ0aXNlZCBhcyBhIHB1YmxpY2FsbHkgaGlkZGVuIHNlY3VyZSBjYW1lcmEsIGJ5IHRoZSBjYW1lcmEgSEFMID8KKyAgICBib29sIHNob3VsZFJlamVjdEhpZGRlbkNhbWVyYUNvbm5lY3Rpb24oY29uc3QgU3RyaW5nOCAmIGNhbWVyYUlkKTsKKwogICAgIC8vIFNpbmdsZSBpbXBsZW1lbnRhdGlvbiBzaGFyZWQgYmV0d2VlbiB0aGUgdmFyaW91cyBjb25uZWN0IGNhbGxzCiAgICAgdGVtcGxhdGU8Y2xhc3MgQ0FMTEJBQ0ssIGNsYXNzIENMSUVOVD4KICAgICBiaW5kZXI6OlN0YXR1cyBjb25uZWN0SGVscGVyKGNvbnN0IHNwPENBTExCQUNLPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGhhbFZlcnNpb24sIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGludCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQsCi0gICAgICAgICAgICBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBsZWdhY3lNb2RlLCBib29sIHNoaW1VcGRhdGVPbmx5LAorICAgICAgICAgICAgaW50IGNsaWVudFVpZCwgaW50IGNsaWVudFBpZCwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgc2hpbVVwZGF0ZU9ubHksCiAgICAgICAgICAgICAvKm91dCovc3A8Q0xJRU5UPiYgZGV2aWNlKTsKIAogICAgIC8vIExvY2sgZ3VhcmRpbmcgY2FtZXJhIHNlcnZpY2Ugc3RhdGUKQEAgLTc0Nyw4ICs3OTgsMzQgQEAKIAogICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbUNhbWVyYVByb3ZpZGVyTWFuYWdlcjsKIAorICAgIGNsYXNzIFNlcnZpY2VMaXN0ZW5lciA6IHB1YmxpYyB2aXJ0dWFsIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgU2VydmljZUxpc3RlbmVyKHNwPENhbWVyYVNlcnZpY2U+IHBhcmVudCwgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICBpbnQgdWlkKSA6IG1QYXJlbnQocGFyZW50KSwgbUxpc3RlbmVyKGxpc3RlbmVyKSwgbUxpc3RlbmVyVWlkKHVpZCkge30KKworICAgICAgICAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSUludGVyZmFjZTo6YXNCaW5kZXIobUxpc3RlbmVyKS0+bGlua1RvRGVhdGgodGhpcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICYvKndobyovKSB7CisgICAgICAgICAgICAgICAgYXV0byBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5yZW1vdmVMaXN0ZW5lcihtTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGdldExpc3RlbmVyVWlkKCkgeyByZXR1cm4gbUxpc3RlbmVyVWlkOyB9CisgICAgICAgICAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gZ2V0TGlzdGVuZXIoKSB7IHJldHVybiBtTGlzdGVuZXI7IH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgd3A8Q2FtZXJhU2VydmljZT4gbVBhcmVudDsKKyAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgICAgICAgICBpbnQgbUxpc3RlbmVyVWlkOworICAgIH07CisKICAgICAvLyBHdWFyZGVkIGJ5IG1TdGF0dXNMaXN0ZW5lck11dGV4Ci0gICAgc3RkOjp2ZWN0b3I8c3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+PiBtTGlzdGVuZXJMaXN0OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxib29sLCBzcDxTZXJ2aWNlTGlzdGVuZXI+Pj4gbUxpc3RlbmVyTGlzdDsKKwogICAgIE11dGV4ICAgICAgIG1TdGF0dXNMaXN0ZW5lckxvY2s7CiAKICAgICAvKioKQEAgLTgyMCw2ICs4OTcsOSBAQAogICAgIC8vIEJsb2NrcyBhbGwgY2xpZW50cyBmcm9tIHRoZSBVSUQKICAgICB2b2lkIGJsb2NrQ2xpZW50c0ZvclVpZCh1aWRfdCB1aWQpOwogCisgICAgLy8gQmxvY2tzIGFsbCBhY3RpdmUgY2xpZW50cy4KKyAgICB2b2lkIGJsb2NrQWxsQ2xpZW50cygpOworCiAgICAgLy8gT3ZlcnJpZGVzIHRoZSBVSUQgc3RhdGUgYXMgaWYgaXQgaXMgaWRsZQogICAgIHN0YXR1c190IGhhbmRsZVNldFVpZFN0YXRlKGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGludCBlcnIpOwogCkBAIC04MzIsMTAgKzkxMiw2IEBACiAgICAgLy8gUHJpbnRzIHRoZSBzaGVsbCBjb21tYW5kIGhlbHAKICAgICBzdGF0dXNfdCBwcmludEhlbHAoaW50IG91dCk7CiAKLSAgICBzdGF0aWMgaW50IGdldENhbGxpbmdQaWQoKTsKLQotICAgIHN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1VpZCgpOwotCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lIGFzIGEgZm9ybWF0dGVkIHN0cmluZy4KICAgICAgKi8KQEAgLTg0NCw3ICs5MjAsNyBAQAogICAgIHN0YXRpYyBiaW5kZXI6OlN0YXR1cyBtYWtlQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3Qgc3A8SUludGVyZmFjZT4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGZhY2luZywgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLCBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgICAgIGJvb2wgbGVnYWN5TW9kZSwgaW50IGhhbFZlcnNpb24sIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKKyAgICAgICAgICAgIGludCBoYWxWZXJzaW9uLCBpbnQgZGV2aWNlVmVyc2lvbiwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsCiAgICAgICAgICAgICAvKm91dCovc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQpOwogCiAgICAgc3RhdHVzX3QgY2hlY2tDYW1lcmFBY2Nlc3MoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvVEVTVF9NQVBQSU5HIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZGFjNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9URVNUX01BUFBJTkcKQEAgLTAsMCArMSw3IEBACit7CisgICJwcmVzdWJtaXQiOiBbCisgICAgeworICAgICAgICJuYW1lIjogImNhbWVyYXNlcnZpY2VfdGVzdCIKKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCmluZGV4IDhiYjI0ZDQuLjE2MmI1MGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcApAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgiCiAjaW5jbHVkZSAiYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmgiCiAjaW5jbHVkZSAiYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgiCiAKICNkZWZpbmUgQUxPRzEoLi4uKSBBTE9HRF9JRihnTG9nTGV2ZWwgPj0gMSwgX19WQV9BUkdTX18pOwogI2RlZmluZSBBTE9HMiguLi4pIEFMT0dEX0lGKGdMb2dMZXZlbCA+PSAyLCBfX1ZBX0FSR1NfXyk7CkBAIC00NCwxMCArNDUsNiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogdXNpbmcgbmFtZXNwYWNlIGNhbWVyYTI7CiAKLXN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1BpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotfQotCiAvLyBJbnRlcmZhY2UgdXNlZCBieSBDYW1lcmFTZXJ2aWNlCiAKIENhbWVyYTJDbGllbnQ6OkNhbWVyYTJDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCkBAIC01OCw4ICs1NSw3IEBACiAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgIGludCBjbGllbnRQaWQsCiAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKLSAgICAgICAgaW50IHNlcnZpY2VQaWQsCi0gICAgICAgIGJvb2wgbGVnYWN5TW9kZSk6CisgICAgICAgIGludCBzZXJ2aWNlUGlkKToKICAgICAgICAgQ2FtZXJhMkNsaWVudEJhc2UoY2FtZXJhU2VydmljZSwgY2FtZXJhQ2xpZW50LCBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBjYW1lcmFEZXZpY2VJZCwgYXBpMUNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsCiAgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQpLApAQCAtNjksOCArNjUsNiBAQAogCiAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKICAgICBsLm1QYXJhbWV0ZXJzLnN0YXRlID0gUGFyYW1ldGVyczo6RElTQ09OTkVDVEVEOwotCi0gICAgbUxlZ2FjeU1vZGUgPSBsZWdhY3lNb2RlOwogfQogCiBzdGF0dXNfdCBDYW1lcmEyQ2xpZW50Ojppbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwgY29uc3QgU3RyaW5nOCYgbW9uaXRvclRhZ3MpIHsKQEAgLTQwNSw3ICszOTksNyBAQAogCiAgICAgYmluZGVyOjpTdGF0dXMgcmVzID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgLy8gQWxsb3cgYm90aCBjbGllbnQgYW5kIHRoZSBjYW1lcmFzZXJ2ZXIgdG8gZGlzY29ubmVjdCBhdCBhbGwgdGltZXMKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgaWYgKGNhbGxpbmdQaWQgIT0gbUNsaWVudFBpZCAmJiBjYWxsaW5nUGlkICE9IG1TZXJ2aWNlUGlkKSByZXR1cm4gcmVzOwogCiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIHJlczsKQEAgLTQ2MCw4ICs0NTQsNiBAQAogCiAgICAgbURldmljZS0+ZGlzY29ubmVjdCgpOwogCi0gICAgbURldmljZS5jbGVhcigpOwotCiAgICAgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpkaXNjb25uZWN0KCk7CiAKICAgICByZXR1cm4gcmVzOwpAQCAtNDcyLDE0ICs0NjQsMTQgQEAKICAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKIAotICAgIGlmIChtQ2xpZW50UGlkICE9IDAgJiYgZ2V0Q2FsbGluZ1BpZCgpICE9IG1DbGllbnRQaWQpIHsKKyAgICBpZiAobUNsaWVudFBpZCAhPSAwICYmIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgIT0gbUNsaWVudFBpZCkgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ29ubmVjdGlvbiBhdHRlbXB0IGZyb20gcGlkICVkOyAiCiAgICAgICAgICAgICAgICAgImN1cnJlbnQgbG9ja2VkIHRvIHBpZCAlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBtQ2FtZXJhSWQsIGdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CisgICAgICAgICAgICAgICAgbUNhbWVyYUlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBtQ2xpZW50UGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIG1DbGllbnRQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogCiAgICAgbVJlbW90ZUNhbGxiYWNrID0gY2xpZW50OwogICAgIG1TaGFyZWRDYW1lcmFDYWxsYmFja3MgPSBjbGllbnQ7CkBAIC00OTIsMTYgKzQ4NCwxNiBAQAogICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBMb2NrIGNhbGwgZnJvbSBwaWQgJWQ7IGN1cnJlbnQgY2xpZW50IHBpZCAlZCIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgZ2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKIAogICAgIGlmIChtQ2xpZW50UGlkID09IDApIHsKLSAgICAgICAgbUNsaWVudFBpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgbUNsaWVudFBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBpZiAobUNsaWVudFBpZCAhPSBnZXRDYWxsaW5nUGlkKCkpIHsKKyAgICBpZiAobUNsaWVudFBpZCAhPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBMb2NrIGNhbGwgZnJvbSBwaWQgJWQ7IGN1cnJlbnRseSBsb2NrZWQgdG8gcGlkICVkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgZ2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CiAgICAgICAgIHJldHVybiBFQlVTWTsKICAgICB9CiAKQEAgLTUxMyw5ICs1MDUsOSBAQAogICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBVbmxvY2sgY2FsbCBmcm9tIHBpZCAlZDsgY3VycmVudCBjbGllbnQgcGlkICVkIiwKLSAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOworICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOwogCi0gICAgaWYgKG1DbGllbnRQaWQgPT0gZ2V0Q2FsbGluZ1BpZCgpKSB7CisgICAgaWYgKG1DbGllbnRQaWQgPT0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSkgewogICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwobVBhcmFtZXRlcnMpOwogICAgICAgICBpZiAobC5tUGFyYW1ldGVycy5zdGF0ZSA9PSBQYXJhbWV0ZXJzOjpSRUNPUkQgfHwKICAgICAgICAgICAgICAgICBsLm1QYXJhbWV0ZXJzLnN0YXRlID09IFBhcmFtZXRlcnM6OlZJREVPX1NOQVBTSE9UKSB7CkBAIC01MjksNyArNTIxLDcgQEAKICAgICB9CiAKICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5sb2NrIGNhbGwgZnJvbSBwaWQgJWQ7IGN1cnJlbnRseSBsb2NrZWQgdG8gcGlkICVkIiwKLSAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOworICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOwogICAgIHJldHVybiBFQlVTWTsKIH0KIApAQCAtMTQ0NywxMyArMTQzOSwxNCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6dGFrZVBpY3R1cmUoaW50IG1zZ1R5cGUpIHsKK3N0YXR1c190IENhbWVyYTJDbGllbnQ6OnRha2VQaWN0dXJlKGludCAvKm1zZ1R5cGUqLykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogICAgIHN0YXR1c190IHJlczsKICAgICBpZiAoIChyZXMgPSBjaGVja1BpZChfX0ZVTkNUSU9OX18pICkgIT0gT0spIHJldHVybiByZXM7CiAKICAgICBpbnQgdGFrZVBpY3R1cmVDb3VudGVyOworICAgIGJvb2wgc2hvdWxkU3luY1dpdGhEZXZpY2UgPSB0cnVlOwogICAgIHsKICAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKICAgICAgICAgc3dpdGNoIChsLm1QYXJhbWV0ZXJzLnN0YXRlKSB7CkBAIC0xNTM5LDE0ICsxNTMyLDI1IEBACiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKICAgICAgICAgICAgIG1ac2xQcm9jZXNzb3ItPmNsZWFyWnNsUXVldWUoKTsKICAgICAgICAgfQorCisgICAgICAgIC8vIFdlIHNob3VsZCBhbHdheXMgc3luYyB3aXRoIHRoZSBkZXZpY2UgaW4gY2FzZSBmbGFzaCBpcyB0dXJuZWQgb24sCisgICAgICAgIC8vIHRoZSBjYW1lcmEgZGV2aWNlIHN1Z2dlc3RzIHRoYXQgZmxhc2ggaXMgbmVlZGVkIChBRSBzdGF0ZSBGTEFTSF9SRVFVSVJFRCkKKyAgICAgICAgLy8gb3Igd2UgYXJlIGluIHNvbWUgb3RoZXIgQUUgc3RhdGUgZGlmZmVyZW50IGZyb20gQ09OVkVSR0VEIHRoYXQgbWF5IG5lZWQKKyAgICAgICAgLy8gcHJlY2FwdHVyZSB0cmlnZ2VyLgorICAgICAgICBpZiAobC5tUGFyYW1ldGVycy5mbGFzaE1vZGUgIT0gUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9PTiAmJgorICAgICAgICAgICAgICAgIChsLm1QYXJhbWV0ZXJzLmFlU3RhdGUgPT0gQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFX0NPTlZFUkdFRCkpIHsKKyAgICAgICAgICAgIHNob3VsZFN5bmNXaXRoRGV2aWNlICA9IGZhbHNlOworICAgICAgICB9CiAgICAgfQogCiAgICAgQVRSQUNFX0FTWU5DX0JFR0lOKGtUYWtlcGljdHVyZUxhYmVsLCB0YWtlUGljdHVyZUNvdW50ZXIpOwogCi0gICAgLy8gTmVlZCBIQUwgdG8gaGF2ZSBjb3JyZWN0IHNldHRpbmdzIGJlZm9yZSAocG9zc2libHkpIHRyaWdnZXJpbmcgcHJlY2FwdHVyZQotICAgIHN5bmNXaXRoRGV2aWNlKCk7CisgICAgLy8gTWFrZSBzdXJlIEhBTCBoYXMgY29ycmVjdCBzZXR0aW5ncyBpbiBjYXNlIHByZWNhcHR1cmUgdHJpZ2dlciBpcyBuZWVkZWQuCisgICAgaWYgKHNob3VsZFN5bmNXaXRoRGV2aWNlKSB7CisgICAgICAgIHN5bmNXaXRoRGV2aWNlKCk7CisgICAgfQogCi0gICAgcmVzID0gbUNhcHR1cmVTZXF1ZW5jZXItPnN0YXJ0Q2FwdHVyZShtc2dUeXBlKTsKKyAgICByZXMgPSBtQ2FwdHVyZVNlcXVlbmNlci0+c3RhcnRDYXB0dXJlKCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIHN0YXJ0IGNhcHR1cmU6ICVzICglZCkiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTE1ODMsNyArMTU4Nyw3IEBACiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogICAgIC8vIFRoZSBjYW1lcmEgc2VydmljZSBjYW4gdW5jb25kaXRpb25hbGx5IGdldCB0aGUgcGFyYW1ldGVycyBhdCBhbGwgdGltZXMKLSAgICBpZiAoZ2V0Q2FsbGluZ1BpZCgpICE9IG1TZXJ2aWNlUGlkICYmIGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgIT0gT0spIHJldHVybiBTdHJpbmc4KCk7CisgICAgaWYgKENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgIT0gbVNlcnZpY2VQaWQgJiYgY2hlY2tQaWQoX19GVU5DVElPTl9fKSAhPSBPSykgcmV0dXJuIFN0cmluZzgoKTsKIAogICAgIFNoYXJlZFBhcmFtZXRlcnM6OlJlYWRMb2NrIGwobVBhcmFtZXRlcnMpOwogCkBAIC0xNjY2LDI3ICsxNjcwLDYgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIC8vIHRoZSBjYW1lcmEyIGFwaSBsZWdhY3kgbW9kZSBjYW4gdW5jb25kaXRpb25hbGx5IGRpc2FibGUgdGhlIHNodXR0ZXIgc291bmQKLSAgICBpZiAobUxlZ2FjeU1vZGUpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBEaXNhYmxlIHNodXR0ZXIgc291bmQgaW4gbGVnYWN5IG1vZGUiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBsLm1QYXJhbWV0ZXJzLnBsYXlTaHV0dGVyU291bmQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIC8vIERpc2FibGluZyBzaHV0dGVyIHNvdW5kIG1heSBub3QgYmUgYWxsb3dlZC4gSW4gdGhhdCBjYXNlIG9ubHkKLSAgICAvLyBhbGxvdyB0aGUgbWVkaWFzZXJ2ZXIgcHJvY2VzcyB0byBkaXNhYmxlIHRoZSBzb3VuZC4KLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgcHJvcGVydHlfZ2V0KCJyby5jYW1lcmEuc291bmQuZm9yY2VkIiwgdmFsdWUsICIwIik7Ci0gICAgaWYgKHN0cm5jbXAodmFsdWUsICIwIiwgMikgIT0gMCkgewotICAgICAgICAvLyBEaXNhYmxpbmcgc2h1dHRlciBzb3VuZCBpcyBub3QgYWxsb3dlZC4gRGVueSBpZiB0aGUgY3VycmVudAotICAgICAgICAvLyBwcm9jZXNzIGlzIG5vdCBtZWRpYXNlcnZlci4KLSAgICAgICAgaWYgKGdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWQoKSkgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkaXNhYmxlIHNodXR0ZXIgc291bmQuIFBlcm1pc3Npb24gZGVuaWVkIChwaWQgJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q2FsbGluZ1BpZCgpKTsKLSAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgfQotICAgIH0KLQogICAgIGwubVBhcmFtZXRlcnMucGxheVNodXR0ZXJTb3VuZCA9IGZhbHNlOwogICAgIHJldHVybiBPSzsKIH0KQEAgLTE3ODQsNiArMTc2Nyw3IEBACiAgICAgICAgIGNhc2UgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVI6CiAgICAgICAgICAgICBBTE9HVygiJXM6IFJlY2VpdmVkIHJlY292ZXJhYmxlIGVycm9yICVkIGZyb20gSEFMIC0gaWdub3JpbmcsIHJlcXVlc3RJZCAlIiBQUklkMzIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMucmVxdWVzdElkKTsKKyAgICAgICAgICAgIG1DYXB0dXJlU2VxdWVuY2VyLT5ub3RpZnlFcnJvcihlcnJvckNvZGUsIHJlc3VsdEV4dHJhcyk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBlcnIgPSBDQU1FUkFfRVJST1JfVU5LTk9XTjsKQEAgLTE5MzQsMTQgKzE5MTgsMTYgQEAKIHZvaWQgQ2FtZXJhMkNsaWVudDo6bm90aWZ5QXV0b0V4cG9zdXJlKHVpbnQ4X3QgbmV3U3RhdGUsIGludCB0cmlnZ2VySWQpIHsKICAgICBBTE9HVigiJXM6IEF1dG9leHBvc3VyZSBzdGF0ZSBub3cgJWQsIGxhc3QgdHJpZ2dlciAlZCIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG5ld1N0YXRlLCB0cmlnZ2VySWQpOworICAgIHsKKyAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKKyAgICAgICAgLy8gVXBkYXRlIHN0YXRlCisgICAgICAgIGwubVBhcmFtZXRlcnMuYWVTdGF0ZSA9IG5ld1N0YXRlOworICAgIH0KICAgICBtQ2FwdHVyZVNlcXVlbmNlci0+bm90aWZ5QXV0b0V4cG9zdXJlKG5ld1N0YXRlLCB0cmlnZ2VySWQpOwogfQogCiB2b2lkIENhbWVyYTJDbGllbnQ6Om5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7Ci0gICAgKHZvaWQpcmVzdWx0RXh0cmFzOwotICAgICh2b2lkKXRpbWVzdGFtcDsKLQogICAgIEFMT0dWKCIlczogU2h1dHRlciBub3RpZmljYXRpb24gZm9yIHJlcXVlc3QgaWQgJSIgUFJJZDMyICIgYXQgdGltZSAlIiBQUklkNjQsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQsIHRpbWVzdGFtcCk7CiAgICAgbUNhcHR1cmVTZXF1ZW5jZXItPm5vdGlmeVNodXR0ZXIocmVzdWx0RXh0cmFzLCB0aW1lc3RhbXApOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaAppbmRleCA0NDkyOWMzLi5hOWVhMjcxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaApAQCAtOTYsOCArOTYsNyBAQAogICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCiAgICAgICAgICAgICB1aWRfdCBjbGllbnRVaWQsCi0gICAgICAgICAgICBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgICAgIGJvb2wgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICBpbnQgc2VydmljZVBpZCk7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmEyQ2xpZW50KCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAppbmRleCBmMTIwM2Y5Li5kNjVhYzdiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCkBAIC0yNSwyNyArMjUsMjQgQEAKICNpbmNsdWRlICJhcGkxL0NhbWVyYUNsaWVudC5oIgogI2luY2x1ZGUgImRldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCIKICNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAjZGVmaW5lIExPRzEoLi4uKSBBTE9HRF9JRihnTG9nTGV2ZWwgPj0gMSwgX19WQV9BUkdTX18pOwogI2RlZmluZSBMT0cyKC4uLikgQUxPR0RfSUYoZ0xvZ0xldmVsID49IDIsIF9fVkFfQVJHU19fKTsKIAotc3RhdGljIGludCBnZXRDYWxsaW5nUGlkKCkgewotICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci19Ci0KIENhbWVyYUNsaWVudDo6Q2FtZXJhQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICBpbnQgY2FtZXJhSWQsIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgIGludCBjbGllbnRQaWQsIGludCBjbGllbnRVaWQsCi0gICAgICAgIGludCBzZXJ2aWNlUGlkLCBib29sIGxlZ2FjeU1vZGUpOgorICAgICAgICBpbnQgc2VydmljZVBpZCk6CiAgICAgICAgIENsaWVudChjYW1lcmFTZXJ2aWNlLCBjYW1lcmFDbGllbnQsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCksIGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwKICAgICAgICAgICAgICAgICBjbGllbnRVaWQsIHNlcnZpY2VQaWQpCiB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoIkNhbWVyYUNsaWVudDo6Q2FtZXJhQ2xpZW50IEUgKHBpZCAlZCwgaWQgJWQpIiwgY2FsbGluZ1BpZCwgY2FtZXJhSWQpOwogCiAgICAgbUhhcmR3YXJlID0gTlVMTDsKQEAgLTU3LDE0ICs1NCwxMyBAQAogICAgIC8vIENhbGxiYWNrIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKICAgICBtUHJldmlld0NhbGxiYWNrRmxhZyA9IENBTUVSQV9GUkFNRV9DQUxMQkFDS19GTEFHX05PT1A7CiAgICAgbU9yaWVudGF0aW9uID0gZ2V0T3JpZW50YXRpb24oMCwgbUNhbWVyYUZhY2luZyA9PSBDQU1FUkFfRkFDSU5HX0ZST05UKTsKLSAgICBtTGVnYWN5TW9kZSA9IGxlZ2FjeU1vZGU7CiAgICAgbVBsYXlTaHV0dGVyU291bmQgPSB0cnVlOwogICAgIExPRzEoIkNhbWVyYUNsaWVudDo6Q2FtZXJhQ2xpZW50IFggKHBpZCAlZCwgaWQgJWQpIiwgY2FsbGluZ1BpZCwgY2FtZXJhSWQpOwogfQogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLAogICAgICAgICBjb25zdCBTdHJpbmc4JiAvKm1vbml0b3JUYWdzKi8pIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgc3RhdHVzX3QgcmVzOwogCiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50Ojppbml0aWFsaXplIEUgKHBpZCAlZCwgaWQgJWQpIiwgY2FsbGluZ1BpZCwgbUNhbWVyYUlkKTsKQEAgLTEwNSw3ICsxMDEsNyBAQAogLy8gdGVhciBkb3duIHRoZSBjbGllbnQKIENhbWVyYUNsaWVudDo6fkNhbWVyYUNsaWVudCgpIHsKICAgICBtRGVzdHJ1Y3Rpb25TdGFydGVkID0gdHJ1ZTsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50Ojp+Q2FtZXJhQ2xpZW50IEUgKHBpZCAlZCwgdGhpcyAlcCkiLCBjYWxsaW5nUGlkLCB0aGlzKTsKIAogICAgIGRpc2Nvbm5lY3QoKTsKQEAgLTE0OCw3ICsxNDQsNyBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmNoZWNrUGlkKCkgY29uc3QgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBpZiAoY2FsbGluZ1BpZCA9PSBtQ2xpZW50UGlkKSByZXR1cm4gTk9fRVJST1I7CiAKICAgICBBTE9HVygiYXR0ZW1wdCB0byB1c2UgYSBsb2NrZWQgY2FtZXJhIGZyb20gYSBkaWZmZXJlbnQgcHJvY2VzcyIKQEAgLTE1OCw3ICsxNTQsOCBAQAogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmNoZWNrUGlkQW5kSGFyZHdhcmUoKSBjb25zdCB7CiAgICAgaWYgKG1IYXJkd2FyZSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJhdHRlbXB0IHRvIHVzZSBhIGNhbWVyYSBhZnRlciBkaXNjb25uZWN0KCkgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgICAgICBBTE9HRSgiYXR0ZW1wdCB0byB1c2UgYSBjYW1lcmEgYWZ0ZXIgZGlzY29ubmVjdCgpIChwaWQgJWQpIiwKKyAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWQoKTsKQEAgLTE2Nyw3ICsxNjQsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmxvY2soKSB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoImxvY2sgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKQEAgLTE4Miw3ICsxNzksNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnVubG9jaygpIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgidW5sb2NrIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogCkBAIC0yMDQsNyArMjAxLDcgQEAKIAogLy8gY29ubmVjdCBhIG5ldyBjbGllbnQgdG8gdGhlIGNhbWVyYQogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50Ojpjb25uZWN0KGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2xpZW50KSB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoImNvbm5lY3QgRSAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKIApAQCAtMjQwLDcgKzIzNyw3IEBACiB9CiAKIGJpbmRlcjo6U3RhdHVzIENhbWVyYUNsaWVudDo6ZGlzY29ubmVjdCgpIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiZGlzY29ubmVjdCBFIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogCkBAIC0zMzQsNyArMzMxLDcgQEAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6c2V0UHJldmlld1RhcmdldCgKICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyKSB7CiAgICAgTE9HMSgic2V0UHJldmlld1RhcmdldCglcCkgKHBpZCAlZCkiLCBidWZmZXJQcm9kdWNlci5nZXQoKSwKLSAgICAgICAgICAgIGdldENhbGxpbmdQaWQoKSk7CisgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIHNwPElCaW5kZXI+IGJpbmRlcjsKICAgICBzcDxBTmF0aXZlV2luZG93PiB3aW5kb3c7CkBAIC0zNTEsNyArMzQ4LDcgQEAKIC8vIHNldCB0aGUgcHJldmlldyBjYWxsYmFjayBmbGFnIHRvIGFmZmVjdCBob3cgdGhlIHJlY2VpdmVkIGZyYW1lcyBmcm9tCiAvLyBwcmV2aWV3IGFyZSBoYW5kbGVkLgogdm9pZCBDYW1lcmFDbGllbnQ6OnNldFByZXZpZXdDYWxsYmFja0ZsYWcoaW50IGNhbGxiYWNrX2ZsYWcpIHsKLSAgICBMT0cxKCJzZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKCVkKSAocGlkICVkKSIsIGNhbGxiYWNrX2ZsYWcsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgic2V0UHJldmlld0NhbGxiYWNrRmxhZyglZCkgKHBpZCAlZCkiLCBjYWxsYmFja19mbGFnLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuOwogCkBAIC0zNzIsMTMgKzM2OSwxMyBAQAogCiAvLyBzdGFydCBwcmV2aWV3IG1vZGUKIHN0YXR1c190IENhbWVyYUNsaWVudDo6c3RhcnRQcmV2aWV3KCkgewotICAgIExPRzEoInN0YXJ0UHJldmlldyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgic3RhcnRQcmV2aWV3IChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgcmV0dXJuIHN0YXJ0Q2FtZXJhTW9kZShDQU1FUkFfUFJFVklFV19NT0RFKTsKIH0KIAogLy8gc3RhcnQgcmVjb3JkaW5nIG1vZGUKIHN0YXR1c190IENhbWVyYUNsaWVudDo6c3RhcnRSZWNvcmRpbmcoKSB7Ci0gICAgTE9HMSgic3RhcnRSZWNvcmRpbmcgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInN0YXJ0UmVjb3JkaW5nIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgcmV0dXJuIHN0YXJ0Q2FtZXJhTW9kZShDQU1FUkFfUkVDT1JESU5HX01PREUpOwogfQogCkBAIC00NjEsNyArNDU4LDcgQEAKIAogLy8gc3RvcCBwcmV2aWV3IG1vZGUKIHZvaWQgQ2FtZXJhQ2xpZW50OjpzdG9wUHJldmlldygpIHsKLSAgICBMT0cxKCJzdG9wUHJldmlldyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgic3RvcFByZXZpZXcgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuOwogCkBAIC00NzcsNyArNDc0LDcgQEAKIAogLy8gc3RvcCByZWNvcmRpbmcgbW9kZQogdm9pZCBDYW1lcmFDbGllbnQ6OnN0b3BSZWNvcmRpbmcoKSB7Ci0gICAgTE9HMSgic3RvcFJlY29yZGluZyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgic3RvcFJlY29yZGluZyAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47CkBAIC01MDMsNyArNTAwLDcgQEAKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47CiAgICAgaWYgKG1lbSA9PSBudWxscHRyKSB7CiAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZVdpdGhJbmZvTG9nKENhbWVyYVNlcnZpY2U6OlNOX0VWRU5UX0xPR19JRCwgIjI2MTY0MjcyIiwKLSAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCksIG51bGxwdHIsIDApOworICAgICAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCksIG51bGxwdHIsIDApOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC02MTUsNyArNjEyLDcgQEAKIH0KIAogYm9vbCBDYW1lcmFDbGllbnQ6OnByZXZpZXdFbmFibGVkKCkgewotICAgIExPRzEoInByZXZpZXdFbmFibGVkIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJwcmV2aWV3RW5hYmxlZCAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybiBmYWxzZTsKQEAgLTYyMyw3ICs2MjAsNyBAQAogfQogCiBib29sIENhbWVyYUNsaWVudDo6cmVjb3JkaW5nRW5hYmxlZCgpIHsKLSAgICBMT0cxKCJyZWNvcmRpbmdFbmFibGVkIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJyZWNvcmRpbmdFbmFibGVkIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuIGZhbHNlOwpAQCAtNjMxLDcgKzYyOCw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6YXV0b0ZvY3VzKCkgewotICAgIExPRzEoImF1dG9Gb2N1cyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgiYXV0b0ZvY3VzIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwpAQCAtNjQxLDcgKzYzOCw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6Y2FuY2VsQXV0b0ZvY3VzKCkgewotICAgIExPRzEoImNhbmNlbEF1dG9Gb2N1cyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgiY2FuY2VsQXV0b0ZvY3VzIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwpAQCAtNjUyLDcgKzY0OSw3IEBACiAKIC8vIHRha2UgYSBwaWN0dXJlIC0gaW1hZ2UgaXMgcmV0dXJuZWQgaW4gY2FsbGJhY2sKIHN0YXR1c190IENhbWVyYUNsaWVudDo6dGFrZVBpY3R1cmUoaW50IG1zZ1R5cGUpIHsKLSAgICBMT0cxKCJ0YWtlUGljdHVyZSAocGlkICVkKTogMHgleCIsIGdldENhbGxpbmdQaWQoKSwgbXNnVHlwZSk7CisgICAgTE9HMSgidGFrZVBpY3R1cmUgKHBpZCAlZCk6IDB4JXgiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBtc2dUeXBlKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CkBAIC02ODEsNyArNjc4LDcgQEAKIAogLy8gc2V0IHByZXZpZXcvY2FwdHVyZSBwYXJhbWV0ZXJzIC0ga2V5L3ZhbHVlIHBhaXJzCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKSB7Ci0gICAgTE9HMSgic2V0UGFyYW1ldGVycyAocGlkICVkKSAoJXMpIiwgZ2V0Q2FsbGluZ1BpZCgpLCBwYXJhbXMuc3RyaW5nKCkpOworICAgIExPRzEoInNldFBhcmFtZXRlcnMgKHBpZCAlZCkgKCVzKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIHBhcmFtcy5zdHJpbmcoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwpAQCAtNjk2LDE2ICs2OTMsMTggQEAKIFN0cmluZzggQ2FtZXJhQ2xpZW50OjpnZXRQYXJhbWV0ZXJzKCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICAvLyBUaGUgY2FtZXJhIHNlcnZpY2UgY2FuIHVuY29uZGl0aW9uYWxseSBnZXQgdGhlIHBhcmFtZXRlcnMgYXQgYWxsIHRpbWVzCi0gICAgaWYgKGdldENhbGxpbmdQaWQoKSAhPSBtU2VydmljZVBpZCAmJiBjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybiBTdHJpbmc4KCk7CisgICAgaWYgKENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgIT0gbVNlcnZpY2VQaWQgJiYgY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCk7CisgICAgfQogCiAgICAgU3RyaW5nOCBwYXJhbXMobUhhcmR3YXJlLT5nZXRQYXJhbWV0ZXJzKCkuZmxhdHRlbigpKTsKLSAgICBMT0cxKCJnZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBnZXRDYWxsaW5nUGlkKCksIHBhcmFtcy5zdHJpbmcoKSk7CisgICAgTE9HMSgiZ2V0UGFyYW1ldGVycyAocGlkICVkKSAoJXMpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgcGFyYW1zLnN0cmluZygpKTsKICAgICByZXR1cm4gcGFyYW1zOwogfQogCiAvLyBlbmFibGUgc2h1dHRlciBzb3VuZAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjplbmFibGVTaHV0dGVyU291bmQoYm9vbCBlbmFibGUpIHsKLSAgICBMT0cxKCJlbmFibGVTaHV0dGVyU291bmQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoImVuYWJsZVNodXR0ZXJTb3VuZCAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogCiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwogICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7CkBAIC03MTUsMzIgKzcxNCwxMiBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgLy8gdGhlIGNhbWVyYTIgYXBpIGxlZ2FjeSBtb2RlIGNhbiB1bmNvbmRpdGlvbmFsbHkgZGlzYWJsZSB0aGUgc2h1dHRlciBzb3VuZAotICAgIGlmIChtTGVnYWN5TW9kZSkgewotICAgICAgICBBTE9HVigiJXM6IERpc2FibGUgc2h1dHRlciBzb3VuZCBpbiBsZWdhY3kgbW9kZSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIG1QbGF5U2h1dHRlclNvdW5kID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAvLyBEaXNhYmxpbmcgc2h1dHRlciBzb3VuZCBtYXkgbm90IGJlIGFsbG93ZWQuIEluIHRoYXQgY2FzZSBvbmx5Ci0gICAgLy8gYWxsb3cgdGhlIG1lZGlhc2VydmVyIHByb2Nlc3MgdG8gZGlzYWJsZSB0aGUgc291bmQuCi0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIHByb3BlcnR5X2dldCgicm8uY2FtZXJhLnNvdW5kLmZvcmNlZCIsIHZhbHVlLCAiMCIpOwotICAgIGlmIChzdHJjbXAodmFsdWUsICIwIikgIT0gMCkgewotICAgICAgICAvLyBEaXNhYmxpbmcgc2h1dHRlciBzb3VuZCBpcyBub3QgYWxsb3dlZC4gRGVueSBpZiB0aGUgY3VycmVudAotICAgICAgICAvLyBwcm9jZXNzIGlzIG5vdCBtZWRpYXNlcnZlci4KLSAgICAgICAgaWYgKGdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWQoKSkgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkaXNhYmxlIHNodXR0ZXIgc291bmQuIFBlcm1pc3Npb24gZGVuaWVkIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKLSAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgfQotICAgIH0KLQogICAgIG1QbGF5U2h1dHRlclNvdW5kID0gZmFsc2U7CiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnNlbmRDb21tYW5kKGludDMyX3QgY21kLCBpbnQzMl90IGFyZzEsIGludDMyX3QgYXJnMikgewotICAgIExPRzEoInNlbmRDb21tYW5kIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzZW5kQ29tbWFuZCAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgIGludCBvcmllbnRhdGlvbjsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKaW5kZXggMTkxMDUzNi4uOTUzMGI2YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCkBAIC02OCw4ICs2OCw3IEBACiAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgICAgIGludCBjbGllbnRVaWQsCi0gICAgICAgICAgICBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgICAgIGJvb2wgbGVnYWN5TW9kZSA9IGZhbHNlKTsKKyAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKICAgICB+Q2FtZXJhQ2xpZW50KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwCmluZGV4IDcwMzQxYzUuLjg4Nzk5ZjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAKQEAgLTUwLDggKzUwLDcgQEAKICAgICAgICAgbVN0YXRlVHJhbnNpdGlvbkNvdW50KDApLAogICAgICAgICBtVHJpZ2dlcklkKDApLAogICAgICAgICBtVGltZW91dENvdW50KDApLAotICAgICAgICBtQ2FwdHVyZUlkKENhbWVyYTJDbGllbnQ6OmtDYXB0dXJlUmVxdWVzdElkU3RhcnQpLAotICAgICAgICBtTXNnVHlwZSgwKSB7CisgICAgICAgIG1DYXB0dXJlSWQoQ2FtZXJhMkNsaWVudDo6a0NhcHR1cmVSZXF1ZXN0SWRTdGFydCkgewogICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiB9CiAKQEAgLTY0LDcgKzYzLDcgQEAKICAgICBtWnNsUHJvY2Vzc29yID0gcHJvY2Vzc29yOwogfQogCi1zdGF0dXNfdCBDYXB0dXJlU2VxdWVuY2VyOjpzdGFydENhcHR1cmUoaW50IG1zZ1R5cGUpIHsKK3N0YXR1c190IENhcHR1cmVTZXF1ZW5jZXI6OnN0YXJ0Q2FwdHVyZSgpIHsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwpAQCAtNzMsNyArNzIsNiBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIGlmICghbVN0YXJ0Q2FwdHVyZSkgewotICAgICAgICBtTXNnVHlwZSA9IG1zZ1R5cGU7CiAgICAgICAgIG1TdGFydENhcHR1cmUgPSB0cnVlOwogICAgICAgICBtU3RhcnRDYXB0dXJlU2lnbmFsLnNpZ25hbCgpOwogICAgIH0KQEAgLTExOSw2ICsxMTcsMzEgQEAKICAgICB9CiB9CiAKK3ZvaWQgQ2FwdHVyZVNlcXVlbmNlcjo6bm90aWZ5RXJyb3IoaW50MzJfdCBlcnJvckNvZGUsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgYm9vbCBqcGVnQnVmZmVyTG9zdCA9IGZhbHNlOworICAgIGlmIChlcnJvckNvZGUgPT0gaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVIpIHsKKyAgICAgICAgc3A8Q2FtZXJhMkNsaWVudD4gY2xpZW50ID0gbUNsaWVudC5wcm9tb3RlKCk7CisgICAgICAgIGlmIChjbGllbnQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGludCBjYXB0dXJlU3RyZWFtSWQgPSBjbGllbnQtPmdldENhcHR1cmVTdHJlYW1JZCgpOworICAgICAgICBpZiAoY2FwdHVyZVN0cmVhbUlkID09IHJlc3VsdEV4dHJhcy5lcnJvclN0cmVhbUlkKSB7CisgICAgICAgICAgICBqcGVnQnVmZmVyTG9zdCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGVycm9yQ29kZSA9PQorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNUKSB7CisgICAgICAgIGlmIChyZXN1bHRFeHRyYXMucmVxdWVzdElkID09IG1TaHV0dGVyQ2FwdHVyZUlkKSB7CisgICAgICAgICAgICBqcGVnQnVmZmVyTG9zdCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoanBlZ0J1ZmZlckxvc3QpIHsKKyAgICAgICAgc3A8TWVtb3J5QmFzZT4gZW1wdHlCdWZmZXI7CisgICAgICAgIG9uQ2FwdHVyZUF2YWlsYWJsZSgvKnRpbWVzdGFtcCovMCwgZW1wdHlCdWZmZXIsIC8qY2FwdHVyZUVycm9yKi90cnVlKTsKKyAgICB9Cit9CisKIHZvaWQgQ2FwdHVyZVNlcXVlbmNlcjo6b25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IE5ldyByZXN1bHQgYXZhaWxhYmxlLiIsIF9fRlVOQ1RJT05fXyk7CkBAIC0zODYsNyArNDA5LDcgQEAKIAogICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChjbGllbnQtPmdldFBhcmFtZXRlcnMoKSk7CiAgICAgLyogd2FybmluZzogdGhpcyBhbHNvIGxvY2tzIGEgU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzICovCi0gICAgc2h1dHRlck5vdGlmeUxvY2tlZChsLm1QYXJhbWV0ZXJzLCBjbGllbnQsIG1Nc2dUeXBlKTsKKyAgICBzaHV0dGVyTm90aWZ5TG9ja2VkKGwubVBhcmFtZXRlcnMsIGNsaWVudCk7CiAgICAgbVNodXR0ZXJOb3RpZmllZCA9IHRydWU7CiAgICAgbVRpbWVvdXRDb3VudCA9IGtNYXhUaW1lb3V0c0ZvckNhcHR1cmVFbmQ7CiAgICAgcmV0dXJuIFNUQU5EQVJEX0NBUFRVUkVfV0FJVDsKQEAgLTYwNiw3ICs2MjksNyBAQAogICAgICAgICBpZiAoIW1TaHV0dGVyTm90aWZpZWQpIHsKICAgICAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChjbGllbnQtPmdldFBhcmFtZXRlcnMoKSk7CiAgICAgICAgICAgICAvKiB3YXJuaW5nOiB0aGlzIGFsc28gbG9ja3MgYSBTaGFyZWRDYW1lcmFDYWxsYmFja3MgKi8KLSAgICAgICAgICAgIHNodXR0ZXJOb3RpZnlMb2NrZWQobC5tUGFyYW1ldGVycywgY2xpZW50LCBtTXNnVHlwZSk7CisgICAgICAgICAgICBzaHV0dGVyTm90aWZ5TG9ja2VkKGwubVBhcmFtZXRlcnMsIGNsaWVudCk7CiAgICAgICAgICAgICBtU2h1dHRlck5vdGlmaWVkID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobVRpbWVvdXRDb3VudCA8PSAwKSB7CkBAIC03MjMsMTIgKzc0NiwxMSBAQAogfQogCiAvKnN0YXRpYyovIHZvaWQgQ2FwdHVyZVNlcXVlbmNlcjo6c2h1dHRlck5vdGlmeUxvY2tlZChjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMsCi0gICAgICAgICAgICBjb25zdCBzcDxDYW1lcmEyQ2xpZW50PiYgY2xpZW50LCBpbnQgbXNnVHlwZSkgeworICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4mIGNsaWVudCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBpZiAocGFyYW1zLnN0YXRlID09IFBhcmFtZXRlcnM6OlNUSUxMX0NBUFRVUkUKLSAgICAgICAgJiYgcGFyYW1zLnBsYXlTaHV0dGVyU291bmQKLSAgICAgICAgJiYgKG1zZ1R5cGUgJiBDQU1FUkFfTVNHX1NIVVRURVIpKSB7CisgICAgICAgICYmIHBhcmFtcy5wbGF5U2h1dHRlclNvdW5kKSB7CiAgICAgICAgIGNsaWVudC0+Z2V0Q2FtZXJhU2VydmljZSgpLT5wbGF5U291bmQoQ2FtZXJhU2VydmljZTo6U09VTkRfU0hVVFRFUik7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaAppbmRleCBmMmUzNzUwLi43MjdkZDUzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgKQEAgLTUxLDcgKzUxLDcgQEAKICAgICB2b2lkIHNldFpzbFByb2Nlc3Nvcihjb25zdCB3cDxac2xQcm9jZXNzb3I+JiBwcm9jZXNzb3IpOwogCiAgICAgLy8gQmVnaW4gc3RpbGwgaW1hZ2UgY2FwdHVyZQotICAgIHN0YXR1c190IHN0YXJ0Q2FwdHVyZShpbnQgbXNnVHlwZSk7CisgICAgc3RhdHVzX3Qgc3RhcnRDYXB0dXJlKCk7CiAKICAgICAvLyBXYWl0IHVudGlsIGN1cnJlbnQgaW1hZ2UgY2FwdHVyZSBjb21wbGV0ZXM7IHJldHVybnMgaW1tZWRpYXRlbHkgaWYgbm8KICAgICAvLyBjYXB0dXJlIGlzIGFjdGl2ZS4gUmV0dXJucyBUSU1FRF9PVVQgaWYgY2FwdHVyZSBkb2VzIG5vdCBjb21wbGV0ZSBkdXJpbmcKQEAgLTY1LDYgKzY1LDkgQEAKICAgICB2b2lkIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCk7CiAKKyAgICAvLyBOb3RpZmljYXRpb25zIGFib3V0IHNodXR0ZXIgKGNhcHR1cmUgc3RhcnQpCisgICAgdm9pZCBub3RpZnlFcnJvcihpbnQzMl90IGVycm9yQ29kZSwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKKwogICAgIC8vIE5vdGlmaWNhdGlvbiBmcm9tIHRoZSBmcmFtZSBwcm9jZXNzb3IKICAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0KTsKIApAQCAtMTQ1LDcgKzE0OCw2IEBACiAgICAgYm9vbCBtQWVJblByZWNhcHR1cmU7CiAKICAgICBpbnQzMl90IG1DYXB0dXJlSWQ7Ci0gICAgaW50IG1Nc2dUeXBlOwogCiAgICAgLy8gTWFpbiBpbnRlcm5hbCBtZXRob2RzCiAKQEAgLTE3Miw3ICsxNzQsNyBAQAogCiAgICAgLy8gRW1pdCBTaHV0dGVyL1JhdyBjYWxsYmFjayB0byBqYXZhLCBhbmQgbWF5YmUgcGxheSBhIHNodXR0ZXIgc291bmQKICAgICBzdGF0aWMgdm9pZCBzaHV0dGVyTm90aWZ5TG9ja2VkKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcywKLSAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+JiBjbGllbnQsIGludCBtc2dUeXBlKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+JiBjbGllbnQpOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwCmluZGV4IDBjNzM4ZTcuLjY4M2U4NGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcApAQCAtMzMsNyArMzMsMTAgQEAKICAgICBGcmFtZVByb2Nlc3NvckJhc2UoZGV2aWNlKSwKICAgICBtQ2xpZW50KGNsaWVudCksCiAgICAgbUxhc3RGcmFtZU51bWJlck9mRmFjZXMoMCksCi0gICAgbUxhc3QzQUZyYW1lTnVtYmVyKC0xKSB7CisgICAgbUxhc3QzQUZyYW1lTnVtYmVyKC0xKSwKKyAgICBtTGFzdEFFRnJhbWVOdW1iZXIoLTEpLAorICAgIG1MYXN0QUZyYW1lTnVtYmVyKC0xKSwKKyAgICBtTGFzdEFXQkZyYW1lTnVtYmVyKC0xKSB7CiAKICAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkID0gZGV2aWNlLnByb21vdGUoKTsKICAgICBtU3ludGhlc2l6ZTNBTm90aWZ5ID0gIShkLT53aWxsTm90aWZ5M0EoKSk7CkBAIC0yNjIsMjQgKzI2NSw3MyBAQAogICAgIGJvb2wgZ290QWxsU3RhdGVzID0gdHJ1ZTsKIAogICAgIC8vIFRPRE86IEFsc28gdXNlIEFFIG1vZGUsIEFFIHRyaWdnZXIgSUQKLSAgICBnb3RBbGxTdGF0ZXMgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfTU9ERSwKKyAgICBib29sIGdvdEFGU3RhdGUgPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFLAogICAgICAgICAgICAgJnBlbmRpbmdTdGF0ZS5hZk1vZGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX01PREUsCisgICAgYm9vbCBnb3RBV0JTdGF0ZSA9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFLAogICAgICAgICAgICAgJnBlbmRpbmdTdGF0ZS5hd2JNb2RlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFLAorICAgIGJvb2wgZ290QUVTdGF0ZSA9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFLAogICAgICAgICAgICAgJnBlbmRpbmdTdGF0ZS5hZVN0YXRlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFLAorICAgIGdvdEFGU3RhdGUgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUsCiAgICAgICAgICAgICAmcGVuZGluZ1N0YXRlLmFmU3RhdGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX1NUQVRFLAorICAgIGdvdEFXQlN0YXRlICY9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9TVEFURSwKICAgICAgICAgICAgICZwZW5kaW5nU3RhdGUuYXdiU3RhdGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKICAgICBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQgPSBmcmFtZS5tUmVzdWx0RXh0cmFzLmFmVHJpZ2dlcklkOwogICAgIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCA9IGZyYW1lLm1SZXN1bHRFeHRyYXMucHJlY2FwdHVyZVRyaWdnZXJJZDsKIAorICAgIGlmIChnb3RBRVN0YXRlICYmIChmcmFtZU51bWJlciA+IG1MYXN0QUVGcmFtZU51bWJlcikpIHsKKyAgICAgICAgaWYgKHBlbmRpbmdTdGF0ZS5hZVN0YXRlICE9IG0zYVN0YXRlLmFlU3RhdGUgfHwKKyAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQgPiBtM2FTdGF0ZS5hZVRyaWdnZXJJZCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFFIHN0YXRlICVkLT4lZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFlU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZVN0YXRlKTsKKyAgICAgICAgICAgIGNsaWVudC0+bm90aWZ5QXV0b0V4cG9zdXJlKHBlbmRpbmdTdGF0ZS5hZVN0YXRlLCBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQpOworCisgICAgICAgICAgICBtM2FTdGF0ZS5hZVN0YXRlID0gcGVuZGluZ1N0YXRlLmFlU3RhdGU7CisgICAgICAgICAgICBtM2FTdGF0ZS5hZVRyaWdnZXJJZCA9IHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZDsKKyAgICAgICAgICAgIG1MYXN0QUVGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGdvdEFGU3RhdGUgJiYgKGZyYW1lTnVtYmVyID4gbUxhc3RBRnJhbWVOdW1iZXIpKSB7CisgICAgICAgIGlmIChwZW5kaW5nU3RhdGUuYWZTdGF0ZSAhPSBtM2FTdGF0ZS5hZlN0YXRlIHx8CisgICAgICAgICAgICAgICAgcGVuZGluZ1N0YXRlLmFmTW9kZSAhPSBtM2FTdGF0ZS5hZk1vZGUgfHwKKyAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQgIT0gbTNhU3RhdGUuYWZUcmlnZ2VySWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBRiBzdGF0ZSAlZC0+JWQuIEFGIG1vZGUgJWQtPiVkLiBUcmlnZ2VyICVkLT4lZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZlN0YXRlLAorICAgICAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZk1vZGUsIHBlbmRpbmdTdGF0ZS5hZk1vZGUsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmVHJpZ2dlcklkLCBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQpOworICAgICAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvRm9jdXMocGVuZGluZ1N0YXRlLmFmU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCk7CisKKyAgICAgICAgICAgIG0zYVN0YXRlLmFmU3RhdGUgPSBwZW5kaW5nU3RhdGUuYWZTdGF0ZTsKKyAgICAgICAgICAgIG0zYVN0YXRlLmFmTW9kZSA9IHBlbmRpbmdTdGF0ZS5hZk1vZGU7CisgICAgICAgICAgICBtM2FTdGF0ZS5hZlRyaWdnZXJJZCA9IHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZDsKKyAgICAgICAgICAgIG1MYXN0QUZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ290QVdCU3RhdGUgJiYgKGZyYW1lTnVtYmVyID4gbUxhc3RBV0JGcmFtZU51bWJlcikpIHsKKyAgICAgICAgaWYgKHBlbmRpbmdTdGF0ZS5hd2JTdGF0ZSAhPSBtM2FTdGF0ZS5hd2JTdGF0ZSB8fAorICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hd2JNb2RlICE9IG0zYVN0YXRlLmF3Yk1vZGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBV0Igc3RhdGUgJWQtPiVkLiBBV0IgbW9kZSAlZC0+JWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hd2JTdGF0ZSwgcGVuZGluZ1N0YXRlLmF3YlN0YXRlLAorICAgICAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hd2JNb2RlLCBwZW5kaW5nU3RhdGUuYXdiTW9kZSk7CisgICAgICAgICAgICBjbGllbnQtPm5vdGlmeUF1dG9XaGl0ZWJhbGFuY2UocGVuZGluZ1N0YXRlLmF3YlN0YXRlLAorICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQpOworCisgICAgICAgICAgICBtM2FTdGF0ZS5hd2JNb2RlID0gcGVuZGluZ1N0YXRlLmF3Yk1vZGU7CisgICAgICAgICAgICBtM2FTdGF0ZS5hd2JTdGF0ZSA9IHBlbmRpbmdTdGF0ZS5hd2JTdGF0ZTsKKyAgICAgICAgICAgIG1MYXN0QVdCRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGdvdEFsbFN0YXRlcyAmPSBnb3RBRVN0YXRlICYgZ290QUZTdGF0ZSAmIGdvdEFXQlN0YXRlOwogICAgIGlmICghZ290QWxsU3RhdGVzKSB7CiAgICAgICAgIC8vIElmIG5vdCBhbGwgc3RhdGVzIGFyZSByZWNlaXZlZCwgcHV0IHRoZSBwZW5kaW5nIHN0YXRlIHRvIG1QZW5kaW5nM0FTdGF0ZXMuCiAgICAgICAgIGlmIChpbmRleCA9PSBOQU1FX05PVF9GT1VORCkgewpAQCAtMjkwLDQwICszNDIsMTAgQEAKICAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKICAgICB9CiAKLSAgICAvLyBPbmNlIGFsbCAzQSBzdGF0ZXMgYXJlIHJlY2VpdmVkLCBub3RpZnkgdGhlIGNsaWVudCBhYm91dCAzQSBjaGFuZ2VzLgotICAgIGlmIChwZW5kaW5nU3RhdGUuYWVTdGF0ZSAhPSBtM2FTdGF0ZS5hZVN0YXRlIHx8Ci0gICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQgPiBtM2FTdGF0ZS5hZVRyaWdnZXJJZCkgewotICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQUUgc3RhdGUgJWQtPiVkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFlU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZVN0YXRlKTsKLSAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvRXhwb3N1cmUocGVuZGluZ1N0YXRlLmFlU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCk7Ci0gICAgfQotCi0gICAgaWYgKHBlbmRpbmdTdGF0ZS5hZlN0YXRlICE9IG0zYVN0YXRlLmFmU3RhdGUgfHwKLSAgICAgICAgcGVuZGluZ1N0YXRlLmFmTW9kZSAhPSBtM2FTdGF0ZS5hZk1vZGUgfHwKLSAgICAgICAgcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkICE9IG0zYVN0YXRlLmFmVHJpZ2dlcklkKSB7Ci0gICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBRiBzdGF0ZSAlZC0+JWQuIEFGIG1vZGUgJWQtPiVkLiBUcmlnZ2VyICVkLT4lZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZlN0YXRlLCBwZW5kaW5nU3RhdGUuYWZTdGF0ZSwKLSAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZk1vZGUsIHBlbmRpbmdTdGF0ZS5hZk1vZGUsCi0gICAgICAgICAgICAgICAgbTNhU3RhdGUuYWZUcmlnZ2VySWQsIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCk7Ci0gICAgICAgIGNsaWVudC0+bm90aWZ5QXV0b0ZvY3VzKHBlbmRpbmdTdGF0ZS5hZlN0YXRlLCBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQpOwotICAgIH0KLSAgICBpZiAocGVuZGluZ1N0YXRlLmF3YlN0YXRlICE9IG0zYVN0YXRlLmF3YlN0YXRlIHx8Ci0gICAgICAgIHBlbmRpbmdTdGF0ZS5hd2JNb2RlICE9IG0zYVN0YXRlLmF3Yk1vZGUpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFXQiBzdGF0ZSAlZC0+JWQuIEFXQiBtb2RlICVkLT4lZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hd2JTdGF0ZSwgcGVuZGluZ1N0YXRlLmF3YlN0YXRlLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmF3Yk1vZGUsIHBlbmRpbmdTdGF0ZS5hd2JNb2RlKTsKLSAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvV2hpdGViYWxhbmNlKHBlbmRpbmdTdGF0ZS5hd2JTdGF0ZSwKLSAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQpOwotICAgIH0KLQogICAgIGlmIChpbmRleCAhPSBOQU1FX05PVF9GT1VORCkgewogICAgICAgICBtUGVuZGluZzNBU3RhdGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwogICAgIH0KIAotICAgIG0zYVN0YXRlID0gcGVuZGluZ1N0YXRlOwogICAgIG1MYXN0M0FGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOwogCiAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaAppbmRleCA2MmE0ZTkxLi44MTgzYzEyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaApAQCAtMTA0LDggKzEwNCw3IEBACiAgICAgLy8gVHJhY2sgbW9zdCByZWNlbnQgZnJhbWUgbnVtYmVyIGZvciB3aGljaCAzQSBub3RpZmljYXRpb25zIHdlcmUgc2VudCBmb3IuCiAgICAgLy8gVXNlZCB0byBmaWx0ZXIgYWdhaW5zdCBzZW5kaW5nIDNBIG5vdGlmaWNhdGlvbnMgZm9yIHRoZSBzYW1lIGZyYW1lCiAgICAgLy8gc2V2ZXJhbCB0aW1lcy4KLSAgICBpbnQzMl90IG1MYXN0M0FGcmFtZU51bWJlcjsKLQorICAgIGludDMyX3QgbUxhc3QzQUZyYW1lTnVtYmVyLCBtTGFzdEFFRnJhbWVOdW1iZXIsIG1MYXN0QUZyYW1lTnVtYmVyLCBtTGFzdEFXQkZyYW1lTnVtYmVyOwogICAgIC8vIEVtaXQgRmFjZURldGVjdGlvbiBldmVudCB0byBqYXZhIGlmIGZhY2VzIGNoYW5nZWQKICAgICB2b2lkIGNhbGxiYWNrRmFjZURldGVjdGlvbihjb25zdCBzcDxDYW1lcmEyQ2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9mcmFtZV9tZXRhZGF0YSAmbWV0YWRhdGEpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCmluZGV4IGI3MDIwZmUuLmRkZmU1ZTMgMTAwNzU1Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKQEAgLTYyLDI2ICs2Miw2IEBACiAgICAgfQogfQogCi12b2lkIEpwZWdQcm9jZXNzb3I6Om9uQnVmZmVyQWNxdWlyZWQoY29uc3QgQnVmZmVySW5mbyYgLypidWZmZXJJbmZvKi8pIHsKLSAgICAvLyBJbnRlbnRpb25hbGx5IGxlZnQgZW1wdHkKLX0KLQotdm9pZCBKcGVnUHJvY2Vzc29yOjpvbkJ1ZmZlclJlbGVhc2VkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pIHsKLSAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwotICAgIGlmIChidWZmZXJJbmZvLm1FcnJvcikgewotICAgICAgICAvLyBPbmx5IGxvY2sgaW4gY2FzZSBvZiBlcnJvciwgc2luY2Ugd2UgZ2V0IG9uZSBvZiB0aGVzZSBmb3IgZWFjaAotICAgICAgICAvLyBvbkZyYW1lQXZhaWxhYmxlIGFzIHdlbGwsIGFuZCBzY2hlZHVsaW5nIG1heSBkZWxheSB0aGlzIGNhbGwgbGF0ZQotICAgICAgICAvLyBlbm91Z2ggdG8gcnVuIGludG8gbGF0ZXIgcHJldmlldyByZXN0YXJ0IG9wZXJhdGlvbnMsIGZvciBub24tZXJyb3IKLSAgICAgICAgLy8gY2FzZXMuCi0gICAgICAgIC8vIGIvMjk1MjQ2NTEKLSAgICAgICAgQUxPR1YoIiVzOiBKUEVHIGJ1ZmZlciBsb3N0IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwotICAgICAgICBtQ2FwdHVyZURvbmUgPSB0cnVlOwotICAgICAgICBtQ2FwdHVyZVN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgICAgbUNhcHR1cmVEb25lU2lnbmFsLnNpZ25hbCgpOwotICAgIH0KLX0KLQogc3RhdHVzX3QgSnBlZ1Byb2Nlc3Nvcjo6dXBkYXRlU3RyZWFtKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKQEAgLTE3NiwxMyArMTU2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0KLSAgICAgICAgcmVzID0gZGV2aWNlLT5hZGRCdWZmZXJMaXN0ZW5lckZvclN0cmVhbShtQ2FwdHVyZVN0cmVhbUlkLCB0aGlzKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgYWRkIGJ1ZmZlciBsaXN0ZW5lcmk6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmgKaW5kZXggNzE4N2FkOS4uOTc3ZjExZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8Z3VpL0NwdUNvbnN1bWVyLmg+CiAKICNpbmNsdWRlICJjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQxLDggKzQyLDcgQEAKICAqIFN0aWxsIGltYWdlIGNhcHR1cmUgb3V0cHV0IGltYWdlIHByb2Nlc3NpbmcKICAqLwogY2xhc3MgSnBlZ1Byb2Nlc3NvcjoKLSAgICAgICAgICAgIHB1YmxpYyBUaHJlYWQsIHB1YmxpYyBDcHVDb25zdW1lcjo6RnJhbWVBdmFpbGFibGVMaXN0ZW5lciwKLSAgICAgICAgICAgIHB1YmxpYyBjYW1lcmEzOjpDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIgeworICAgICAgICAgICAgcHVibGljIFRocmVhZCwgcHVibGljIENwdUNvbnN1bWVyOjpGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIHsKICAgcHVibGljOgogICAgIEpwZWdQcm9jZXNzb3Ioc3A8Q2FtZXJhMkNsaWVudD4gY2xpZW50LCB3cDxDYXB0dXJlU2VxdWVuY2VyPiBzZXF1ZW5jZXIpOwogICAgIH5KcGVnUHJvY2Vzc29yKCk7CkBAIC01MCwxNSArNTAsMTQgQEAKICAgICAvLyBDcHVDb25zdW1lciBsaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgogICAgIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKTsKIAotICAgIC8vIENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgotICAgIHZvaWQgb25CdWZmZXJBY3F1aXJlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSBvdmVycmlkZTsKLSAgICB2b2lkIG9uQnVmZmVyUmVsZWFzZWQoY29uc3QgQnVmZmVySW5mbyYgYnVmZmVySW5mbykgb3ZlcnJpZGU7Ci0KICAgICBzdGF0dXNfdCB1cGRhdGVTdHJlYW0oY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zKTsKICAgICBzdGF0dXNfdCBkZWxldGVTdHJlYW0oKTsKICAgICBpbnQgZ2V0U3RyZWFtSWQoKSBjb25zdDsKIAogICAgIHZvaWQgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OworCisgICAgc3RhdGljIHNpemVfdCBmaW5kSnBlZ1NpemUodWludDhfdCoganBlZ0J1ZmZlciwgc2l6ZV90IG1heFNpemUpOworCiAgIHByaXZhdGU6CiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga1dhaXREdXJhdGlvbiA9IDEwMDAwMDAwOyAvLyAxMCBtcwogICAgIHdwPENhbWVyYURldmljZUJhc2U+IG1EZXZpY2U7CkBAIC04Miw3ICs4MSw2IEBACiAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKIAogICAgIHN0YXR1c190IHByb2Nlc3NOZXdDYXB0dXJlKGJvb2wgY2FwdHVyZVN1Y2Nlc3MpOwotICAgIHNpemVfdCBmaW5kSnBlZ1NpemUodWludDhfdCoganBlZ0J1ZmZlciwgc2l6ZV90IG1heFNpemUpOwogCiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKaW5kZXggMjhkMTg2YS4uMThhZGRiNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcApAQCAtNjksNyArNjksNyBAQAogICAgIHJlcyA9IGJ1aWxkUXVpcmtzKCk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAotICAgIGNvbnN0IFNpemUgTUFYX1BSRVZJRVdfU0laRSA9IHsgTUFYX1BSRVZJRVdfV0lEVEgsIE1BWF9QUkVWSUVXX0hFSUdIVCB9OworICAgIFNpemUgbWF4UHJldmlld1NpemUgPSB7IE1BWF9QUkVWSUVXX1dJRFRILCBNQVhfUFJFVklFV19IRUlHSFQgfTsKICAgICAvLyBUcmVhdCB0aGUgSC4yNjQgbWF4IHNpemUgYXMgdGhlIG1heCBzdXBwb3J0ZWQgdmlkZW8gc2l6ZS4KICAgICBNZWRpYVByb2ZpbGVzICp2aWRlb0VuY29kZXJQcm9maWxlcyA9IE1lZGlhUHJvZmlsZXM6OmdldEluc3RhbmNlKCk7CiAgICAgVmVjdG9yPHZpZGVvX2VuY29kZXI+IGVuY29kZXJzID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlcnMoKTsKQEAgLTkwLDExICs5MCwxNiBAQAogICAgICAgICB9CiAgICAgfQogICAgIC8vIFRoaXMgaXMganVzdCBhbiB1cHBlciBib3VuZCBhbmQgbWF5IG5vdCBiZSBhbiBhY3R1YWxseSB2YWxpZCB2aWRlbyBzaXplCi0gICAgY29uc3QgU2l6ZSBWSURFT19TSVpFX1VQUEVSX0JPVU5EID0ge21heFZpZGVvV2lkdGgsIG1heFZpZGVvSGVpZ2h0fTsKKyAgICBTaXplIHZpZGVvU2l6ZVVwcGVyQm91bmQgPSB7bWF4VmlkZW9XaWR0aCwgbWF4VmlkZW9IZWlnaHR9OwogCi0gICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhNQVhfUFJFVklFV19TSVpFLCAmYXZhaWxhYmxlUHJldmlld1NpemVzKTsKKyAgICBpZiAoZmFzdEluZm8uc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzKSB7CisgICAgICAgIG1heFByZXZpZXdTaXplID0gZ2V0TWF4U2l6ZShnZXRQcmVmZXJyZWRQcmV2aWV3U2l6ZXMoKSk7CisgICAgICAgIHZpZGVvU2l6ZVVwcGVyQm91bmQgPSBnZXRNYXhTaXplKGdldFByZWZlcnJlZFZpZGVvU2l6ZXMoKSk7CisgICAgfQorCisgICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhtYXhQcmV2aWV3U2l6ZSwgJmF2YWlsYWJsZVByZXZpZXdTaXplcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKLSAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKFZJREVPX1NJWkVfVVBQRVJfQk9VTkQsICZhdmFpbGFibGVWaWRlb1NpemVzKTsKKyAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKHZpZGVvU2l6ZVVwcGVyQm91bmQsICZhdmFpbGFibGVWaWRlb1NpemVzKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogCiAgICAgLy8gU2VsZWN0IGluaXRpYWwgcHJldmlldyBhbmQgdmlkZW8gc2l6ZSB0aGF0J3MgdW5kZXIgdGhlIGluaXRpYWwgYm91bmQgYW5kCkBAIC0yOTYsOSArMzAxLDEzIEBACiAgICAgVmVjdG9yPFNpemU+IGF2YWlsYWJsZUpwZWdTaXplcyA9IGdldEF2YWlsYWJsZUpwZWdTaXplcygpOwogICAgIGlmICghYXZhaWxhYmxlSnBlZ1NpemVzLnNpemUoKSkgcmV0dXJuIE5PX0lOSVQ7CiAKLSAgICAvLyBUT0RPOiBQaWNrIG1heGltdW0KICAgICBwaWN0dXJlV2lkdGggPSBhdmFpbGFibGVKcGVnU2l6ZXNbMF0ud2lkdGg7CiAgICAgcGljdHVyZUhlaWdodCA9IGF2YWlsYWJsZUpwZWdTaXplc1swXS5oZWlnaHQ7CisgICAgaWYgKGZhc3RJbmZvLnN1cHBvcnRzUHJlZmVycmVkQ29uZmlncykgeworICAgICAgICBTaXplIHN1Z2dlc3RlZEpwZWdTaXplID0gZ2V0TWF4U2l6ZShnZXRQcmVmZXJyZWRKcGVnU2l6ZXMoKSk7CisgICAgICAgIHBpY3R1cmVXaWR0aCA9IHN1Z2dlc3RlZEpwZWdTaXplLndpZHRoOworICAgICAgICBwaWN0dXJlSGVpZ2h0ID0gc3VnZ2VzdGVkSnBlZ1NpemUuaGVpZ2h0OworICAgIH0KICAgICBwaWN0dXJlV2lkdGhMYXN0U2V0ID0gcGljdHVyZVdpZHRoOwogICAgIHBpY3R1cmVIZWlnaHRMYXN0U2V0ID0gcGljdHVyZUhlaWdodDsKICAgICBwaWN0dXJlU2l6ZU92ZXJyaWRlbiA9IGZhbHNlOwpAQCAtNzU3LDYgKzc2Niw3IEBACiAgICAgZm9jdXNTdGF0ZSA9IEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9JTkFDVElWRTsKICAgICBzaGFkb3dGb2N1c01vZGUgPSBGT0NVU19NT0RFX0lOVkFMSUQ7CiAKKyAgICBhZVN0YXRlID0gQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFX0lOQUNUSVZFOwogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IG1heDNhUmVnaW9ucyA9IHN0YXRpY0luZm8oQU5EUk9JRF9DT05UUk9MX01BWF9SRUdJT05TLAogICAgICAgICAgICAgUGFyYW1ldGVyczo6TlVNX1JFR0lPTiwgUGFyYW1ldGVyczo6TlVNX1JFR0lPTik7CiAgICAgaWYgKG1heDNhUmVnaW9ucy5jb3VudCAhPSBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OKSByZXR1cm4gTk9fSU5JVDsKQEAgLTEwMTAsNiArMTAyMCw5IEBACiAgICAgICAgIGFycmF5SGVpZ2h0ID0gYWN0aXZlQXJyYXlTaXplLmRhdGEuaTMyWzNdOwogICAgIH0gZWxzZSByZXR1cm4gTk9fSU5JVDsKIAorICAgIGZhc3RJbmZvLnN1cHBvcnRzUHJlZmVycmVkQ29uZmlncyA9CisgICAgICAgIGluZm8tPmV4aXN0cyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKwogICAgIC8vIFdlJ2xsIHNldCB0aGUgdGFyZ2V0IEZQUyByYW5nZSBmb3Igc3RpbGwgY2FwdHVyZXMgdG8gYmUgYXMgd2lkZQogICAgIC8vIGFzIHBvc3NpYmxlIHRvIGdpdmUgdGhlIEhBTCBtYXhpbXVtIGxhdGl0dWRlIGZvciBleHBvc3VyZSBzZWxlY3Rpb24KICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVGcHNSYW5nZXMgPQpAQCAtMTAyMSw4ICsxMDM0LDExIEBACiAgICAgLy8gR2V0IHN1cHBvcnRlZCBwcmV2aWV3IGZwcyByYW5nZXMsIHVwIHRvIGRlZmF1bHQgbWF4aW11bS4KICAgICBWZWN0b3I8U2l6ZT4gc3VwcG9ydGVkUHJldmlld1NpemVzOwogICAgIFZlY3RvcjxGcHNSYW5nZT4gc3VwcG9ydGVkUHJldmlld0Zwc1JhbmdlczsKLSAgICBjb25zdCBTaXplIFBSRVZJRVdfU0laRV9CT1VORCA9IHsgTUFYX1BSRVZJRVdfV0lEVEgsIE1BWF9QUkVWSUVXX0hFSUdIVCB9OwotICAgIHN0YXR1c190IHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMoUFJFVklFV19TSVpFX0JPVU5ELCAmc3VwcG9ydGVkUHJldmlld1NpemVzKTsKKyAgICBTaXplIHByZXZpZXdTaXplQm91bmQgPSB7IE1BWF9QUkVWSUVXX1dJRFRILCBNQVhfUFJFVklFV19IRUlHSFQgfTsKKyAgICBpZiAoZmFzdEluZm8uc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzKSB7CisgICAgICAgIHByZXZpZXdTaXplQm91bmQgPSBnZXRNYXhTaXplKGdldFByZWZlcnJlZFByZXZpZXdTaXplcygpKTsKKyAgICB9CisgICAgc3RhdHVzX3QgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhwcmV2aWV3U2l6ZUJvdW5kLCAmc3VwcG9ydGVkUHJldmlld1NpemVzKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUZwc1Jhbmdlcy5jb3VudDsgaSArPSAyKSB7CiAgICAgICAgIGlmICghaXNGcHNTdXBwb3J0ZWQoc3VwcG9ydGVkUHJldmlld1NpemVzLApAQCAtMzEwNiw2ICszMTIyLDY3IEBACiAgICAgcmV0dXJuIGpwZWdTaXplczsKIH0KIAorVmVjdG9yPFBhcmFtZXRlcnM6OlN0cmVhbUNvbmZpZ3VyYXRpb24+IFBhcmFtZXRlcnM6OmdldFByZWZlcnJlZFN0cmVhbUNvbmZpZ3VyYXRpb25zKAorICAgICAgICBpbnQzMl90IHVzZWNhc2VJZCkgY29uc3QgeworICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFID0gNTsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX1dJRFRIX09GRlNFVCA9IDA7CisgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9IRUlHSFRfT0ZGU0VUID0gMTsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX0ZPUk1BVF9PRkZTRVQgPSAyOworICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUID0gMzsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX1VTRUNBU0VfQklUTUFQX09GRlNFVCA9IDQ7CisgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IHNjczsKKworICAgIGlmIChmYXN0SW5mby5zdXBwb3J0c1ByZWZlcnJlZENvbmZpZ3MpIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlU3RyZWFtQ29uZmlncyA9IHN0YXRpY0luZm8oCisgICAgICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudDsgaSs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGggPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fV0lEVEhfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0hFSUdIVF9PRkZTRVRdOworICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fRk9STUFUX09GRlNFVF07CisgICAgICAgICAgICBpbnQzMl90IGlzSW5wdXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDMyX3Qgc3VwcG9ydGVkVXNlY2FzZXMgPQorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fVVNFQ0FTRV9CSVRNQVBfT0ZGU0VUXTsKKyAgICAgICAgICAgIGlmIChzdXBwb3J0ZWRVc2VjYXNlcyAmICgxIDw8IHVzZWNhc2VJZCkpIHsKKyAgICAgICAgICAgICAgICBTdHJlYW1Db25maWd1cmF0aW9uIHNjID0ge2Zvcm1hdCwgd2lkdGgsIGhlaWdodCwgaXNJbnB1dH07CisgICAgICAgICAgICAgICAgc2NzLmFkZChzYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2NzOworfQorCitWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gUGFyYW1ldGVyczo6Z2V0UHJlZmVycmVkRmlsdGVyZWRTaXplcyhpbnQzMl90IHVzZWNhc2VJZCwKKyAgICAgICAgaW50MzJfdCBmb3JtYXQpIGNvbnN0IHsKKyAgICBWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gc2l6ZXM7CisgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IHNjcyA9IGdldFByZWZlcnJlZFN0cmVhbUNvbmZpZ3VyYXRpb25zKHVzZWNhc2VJZCk7CisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IHNjcykgeworICAgICAgICBpZiAoaXQuZm9ybWF0ID09IGZvcm1hdCkgeworICAgICAgICAgICAgc2l6ZXMuYWRkKHtpdC53aWR0aCwgaXQuaGVpZ2h0fSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZXM7Cit9CisKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBQYXJhbWV0ZXJzOjpnZXRQcmVmZXJyZWRKcGVnU2l6ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFByZWZlcnJlZEZpbHRlcmVkU2l6ZXMoCisgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1NOQVBTSE9ULAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKTsKK30KKworVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IFBhcmFtZXRlcnM6OmdldFByZWZlcnJlZFByZXZpZXdTaXplcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UHJlZmVycmVkRmlsdGVyZWRTaXplcygKKyAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfUFJFVklFVywKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCk7Cit9CisKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBQYXJhbWV0ZXJzOjpnZXRQcmVmZXJyZWRWaWRlb1NpemVzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRQcmVmZXJyZWRGaWx0ZXJlZFNpemVzKAorICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19SRUNPUkQsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpOworfQorCiBQYXJhbWV0ZXJzOjpDcm9wUmVnaW9uIFBhcmFtZXRlcnM6OmNhbGN1bGF0ZUNyb3BSZWdpb24oYm9vbCBwcmV2aWV3T25seSkgY29uc3QgewogCiAgICAgZmxvYXQgem9vbUxlZnQsIHpvb21Ub3AsIHpvb21XaWR0aCwgem9vbUhlaWdodDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCmluZGV4IDQyZTdhNDcuLjNhNzA5YzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaApAQCAtMTIyLDYgKzEyMiw3IEBACiAgICAgICAgIGludDMyX3QgaGlnaDsKICAgICB9OwogCisgICAgdWludDhfdCBhZVN0YXRlOyAvL2xhdGVzdCBBRSBzdGF0ZSBmcm9tIEhhbAogICAgIGludDMyX3QgZXhwb3N1cmVDb21wZW5zYXRpb247CiAgICAgYm9vbCBhdXRvRXhwb3N1cmVMb2NrOwogICAgIGJvb2wgYXV0b0V4cG9zdXJlTG9ja0F2YWlsYWJsZTsKQEAgLTI0Nyw2ICsyNDgsNyBAQAogICAgICAgICBib29sIHVzZUZsZXhpYmxlWXV2OwogICAgICAgICBTaXplIG1heEpwZWdTaXplOwogICAgICAgICBTaXplIG1heFpzbFNpemU7CisgICAgICAgIGJvb2wgc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzOwogICAgIH0gZmFzdEluZm87CiAKICAgICAvLyBRdWlya3MgaW5mb3JtYXRpb247IHRoZXNlIGFyZSBzaG9ydC1saXZlZCBmbGFncyB0byBlbmFibGUgd29ya2Fyb3VuZHMgZm9yCkBAIC00MTcsNiArNDE5LDkgQEAKICAgICAvLyByZXR1cm5zIGFuIGVtcHR5IFZlY3RvciBpZiBkZXZpY2UgSEFMIHZlcnNpb24gZG9lcyBzdXBwb3J0IGl0CiAgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IGdldFN0cmVhbUNvbmZpZ3VyYXRpb25zKCk7CiAKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZXh0cmFjdCB0aGUgc3VnZ2VzdGVkIHN0cmVhbSBjb25maWd1cmF0aW9ucworICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBnZXRQcmVmZXJyZWRTdHJlYW1Db25maWd1cmF0aW9ucyhpbnQzMl90IHVzZWNhc2VJZCkgY29uc3Q7CisKICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IG1pbmltdW0gZnJhbWUgZHVyYXRpb24gZm9yIGEganBlZyBzaXplCiAgICAgLy8gcmV0dXJuIC0xIGlmIGlucHV0IGpwZWcgc2l6ZSBjYW5ub3QgYmUgZm91bmQgaW4gc3VwcG9ydGVkIHNpemUgbGlzdAogICAgIGludDY0X3QgZ2V0SnBlZ1N0cmVhbU1pbkZyYW1lRHVyYXRpb25OcyhQYXJhbWV0ZXJzOjpTaXplIHNpemUpOwpAQCAtNDM4LDYgKzQ0MywxNSBAQAogICAgIC8vIFRoZSBtYXhpbXVtIHNpemUgaXMgZGVmaW5lZCBieSBjb21wYXJpbmcgd2lkdGggZmlyc3QsIHdoZW4gd2lkdGggdGllcyBjb21wYXJpbmcgaGVpZ2h0LgogICAgIFNpemUgZ2V0TWF4U2l6ZShjb25zdCBWZWN0b3I8U2l6ZT4mIHNpemVzKTsKIAorICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBmaWx0ZXIgYW5kIHNvcnQgc3VnZ2VzdGVkIHNpemVzCisgICAgVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IGdldFByZWZlcnJlZEZpbHRlcmVkU2l6ZXMoaW50MzJfdCB1c2VjYXNlSWQsIGludDMyX3QgZm9ybWF0KSBjb25zdDsKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdWdnZXN0ZWQganBlZyBzaXplcworICAgIFZlY3RvcjxTaXplPiBnZXRQcmVmZXJyZWRKcGVnU2l6ZXMoKSBjb25zdDsKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdWdnZXN0ZWQgcHJldmlldyBzaXplcworICAgIFZlY3RvcjxTaXplPiBnZXRQcmVmZXJyZWRQcmV2aWV3U2l6ZXMoKSBjb25zdDsKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdWdnZXN0ZWQgdmlkZW8gc2l6ZXMKKyAgICBWZWN0b3I8U2l6ZT4gZ2V0UHJlZmVycmVkVmlkZW9TaXplcygpIGNvbnN0OworCiAgICAgaW50IG1EZXZpY2VWZXJzaW9uOwogICAgIHVpbnQ4X3QgbURlZmF1bHRTY2VuZU1vZGU7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCmluZGV4IDU2N2IxNWYuLmI1MTJmMmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CkBAIC0yNiwxMCArMjcsMTUgQEAKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhVXRpbHMuaD4KIAogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgiCiAjaW5jbHVkZSAiYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCIKIAogI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KIAorI2luY2x1ZGUgIkRlcHRoQ29tcG9zaXRlU3RyZWFtLmgiCisjaW5jbHVkZSAiSGVpY0NvbXBvc2l0ZVN0cmVhbS5oIgorCiAvLyBDb252ZW5pZW5jZSBtZXRob2RzIGZvciBjb25zdHJ1Y3RpbmcgYmluZGVyOjpTdGF0dXMgb2JqZWN0cyBmb3IgZXJyb3IgcmV0dXJucwogCiAjZGVmaW5lIFNUQVRVU19FUlJPUihlcnJvckNvZGUsIGVycm9yU3RyaW5nKSBcCkBAIC0xMjIsNiArMTI4LDcgQEAKICAgICAgICAgICAgICAgICBwaHlzaWNhbEtleXNFbnRyeS5kYXRhLmkzMiArIHBoeXNpY2FsS2V5c0VudHJ5LmNvdW50KTsKICAgICB9CiAKKyAgICBtUHJvdmlkZXJNYW5hZ2VyID0gcHJvdmlkZXJQdHI7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xMzksNiArMTQ2LDcgQEAKIAogYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjppbnNlcnRHYnBMb2NrZWQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCwKICAgICAgICAgU3VyZmFjZU1hcCogb3V0U3VyZmFjZU1hcCwgVmVjdG9yPGludDMyX3Q+KiBvdXRwdXRTdHJlYW1JZHMsIGludDMyX3QgKmN1cnJlbnRTdHJlYW1JZCkgeworICAgIGludCBjb21wb3NpdGVJZHg7CiAgICAgaW50IGlkeCA9IG1TdHJlYW1NYXAuaW5kZXhPZktleShJSW50ZXJmYWNlOjphc0JpbmRlcihnYnApKTsKIAogICAgIC8vIFRyeWluZyB0byBzdWJtaXQgcmVxdWVzdCB3aXRoIHN1cmZhY2UgdGhhdCB3YXNuJ3QgY3JlYXRlZApAQCAtMTQ4LDYgKzE1NiwxMSBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAogICAgICAgICAgICAgICAgICJSZXF1ZXN0IHRhcmdldHMgU3VyZmFjZSB0aGF0IGlzIG5vdCBwYXJ0IG9mIGN1cnJlbnQgY2FwdHVyZSBzZXNzaW9uIik7CisgICAgfSBlbHNlIGlmICgoY29tcG9zaXRlSWR4ID0gbUNvbXBvc2l0ZVN0cmVhbU1hcC5pbmRleE9mS2V5KElJbnRlcmZhY2U6OmFzQmluZGVyKGdicCkpKQorICAgICAgICAgICAgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGNvbXBvc2l0ZUlkeCktPmluc2VydEdicChvdXRTdXJmYWNlTWFwLCBvdXRwdXRTdHJlYW1JZHMsCisgICAgICAgICAgICAgICAgY3VycmVudFN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgIH0KIAogICAgIGNvbnN0IFN0cmVhbVN1cmZhY2VJZCYgc3RyZWFtU3VyZmFjZUlkID0gbVN0cmVhbU1hcC52YWx1ZUF0KGlkeCk7CkBAIC00NjksNiArNDgyLDc5IEBACiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVELCAiQ2FtZXJhIGRldmljZSBubyBsb25nZXIgYWxpdmUiKTsKICAgICB9CiAKKyAgICByZXMgPSBjaGVja09wZXJhdGluZ01vZGVMb2NrZWQob3BlcmF0aW5nTW9kZSk7CisgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gbURldmljZS0+Y29uZmlndXJlU3RyZWFtcyhzZXNzaW9uUGFyYW1zLCBvcGVyYXRpbmdNb2RlKTsKKyAgICBpZiAoZXJyID09IEJBRF9WQUxVRSkgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBVbnN1cHBvcnRlZCBzZXQgb2YgaW5wdXRzL291dHB1dHMgcHJvdmlkZWQiLAorICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IEVycm9yIGNvbmZpZ3VyaW5nIHN0cmVhbXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db21wb3NpdGVTdHJlYW1NYXAuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGVyciA9IG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChpKS0+Y29uZmlndXJlU3RyZWFtKCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LICkgeworICAgICAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IEVycm9yIGNvbmZpZ3VyaW5nIGNvbXBvc2l0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtczogJXMgKCVkKSIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXMgPSBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmNoZWNrU3VyZmFjZVR5cGVMb2NrZWQoc2l6ZV90IG51bUJ1ZmZlclByb2R1Y2VycywKKyAgICAgICAgYm9vbCBkZWZlcnJlZENvbnN1bWVyLCBpbnQgc3VyZmFjZVR5cGUpIGNvbnN0IHsKKyAgICBpZiAobnVtQnVmZmVyUHJvZHVjZXJzID4gTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0pIHsKKyAgICAgICAgQUxPR0UoIiVzOiBHcmFwaGljQnVmZmVyUHJvZHVjZXIgY291bnQgJXp1IGZvciBzdHJlYW0gZXhjZWVkcyBsaW1pdCBvZiAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBudW1CdWZmZXJQcm9kdWNlcnMsIE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiU3VyZmFjZSBjb3VudCBpcyB0b28gaGlnaCIpOworICAgIH0gZWxzZSBpZiAoKG51bUJ1ZmZlclByb2R1Y2VycyA9PSAwKSAmJiAoIWRlZmVycmVkQ29uc3VtZXIpKSB7CisgICAgICAgIEFMT0dFKCIlczogTnVtYmVyIG9mIGNvbnN1bWVycyBjYW5ub3QgYmUgc21hbGxlciB0aGFuIDEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJObyB2YWxpZCBjb25zdW1lcnMuIik7CisgICAgfQorCisgICAgYm9vbCB2YWxpZFN1cmZhY2VUeXBlID0gKChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9WSUVXKSB8fAorICAgICAgICAgICAgKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1RFWFRVUkUpKTsKKworICAgIGlmIChkZWZlcnJlZENvbnN1bWVyICYmICF2YWxpZFN1cmZhY2VUeXBlKSB7CisgICAgICAgIEFMT0dFKCIlczogVGFyZ2V0IHN1cmZhY2UgaGFzIGludmFsaWQgc3VyZmFjZVR5cGUgPSAlZC4iLCBfX0ZVTkNUSU9OX18sIHN1cmZhY2VUeXBlKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiVGFyZ2V0IFN1cmZhY2UgaXMgaW52YWxpZCIpOworICAgIH0KKworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjpjaGVja1BoeXNpY2FsQ2FtZXJhSWRMb2NrZWQoU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkKSB7CisgICAgaWYgKHBoeXNpY2FsQ2FtZXJhSWQuc2l6ZSgpID4gMCkgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgICAgIGJvb2wgbG9naWNhbENhbWVyYSA9CisgICAgICAgICAgICBtUHJvdmlkZXJNYW5hZ2VyLT5pc0xvZ2ljYWxDYW1lcmEobUNhbWVyYUlkU3RyLnN0cmluZygpLCAmcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICBpZiAoIWxvZ2ljYWxDYW1lcmEgfHwKKyAgICAgICAgICAgICAgICBzdGQ6OmZpbmQocGh5c2ljYWxDYW1lcmFJZHMuYmVnaW4oKSwgcGh5c2ljYWxDYW1lcmFJZHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQuc3RyaW5nKCkpID09IHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpKSB7CisgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBDYW1lcmEgZG9lc24ndCBzdXBwb3J0IHBoeXNpY2FsQ2FtZXJhSWQgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6Y2hlY2tPcGVyYXRpbmdNb2RlTG9ja2VkKGludCBvcGVyYXRpbmdNb2RlKSBjb25zdCB7CiAgICAgaWYgKG9wZXJhdGluZ01vZGUgPCAwKSB7CiAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAogICAgICAgICAgICAgIkNhbWVyYSAlczogSW52YWxpZCBvcGVyYXRpbmcgbW9kZSAlZCByZXF1ZXN0ZWQiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIG9wZXJhdGluZ01vZGUpOwpAQCAtNDc3LDcgKzU2Myw2IEBACiAgICAgICAgICAgICAgICAgbXNnLnN0cmluZygpKTsKICAgICB9CiAKLSAgICAvLyBTYW5pdGl6ZSB0aGUgaGlnaCBzcGVlZCBzZXNzaW9uIGFnYWluc3QgbmVjZXNzYXJ5IGNhcGFiaWxpdHkgYml0LgogICAgIGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCA9IChvcGVyYXRpbmdNb2RlID09IElDYW1lcmFEZXZpY2VVc2VyOjpDT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUpOwogICAgIGlmIChpc0NvbnN0cmFpbmVkSGlnaFNwZWVkKSB7CiAgICAgICAgIENhbWVyYU1ldGFkYXRhIHN0YXRpY0luZm8gPSBtRGV2aWNlLT5pbmZvKCk7CkBAIC01MDAsMTcgKzU4NSwyMDQgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHN0YXR1c190IGVyciA9IG1EZXZpY2UtPmNvbmZpZ3VyZVN0cmVhbXMoc2Vzc2lvblBhcmFtcywgb3BlcmF0aW5nTW9kZSk7Ci0gICAgaWYgKGVyciA9PSBCQURfVkFMVUUpIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogVW5zdXBwb3J0ZWQgc2V0IG9mIGlucHV0cy9vdXRwdXRzIHByb3ZpZGVkIiwKLSAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKwordm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om1hcFN0cmVhbUluZm8oY29uc3QgT3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIFN0cmluZzggcGh5c2ljYWxJZCwKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtICpzdHJlYW0gLypvdXQqLykgeworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RyZWFtLT52M18yLnN0cmVhbVR5cGUgPSBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVR5cGU6Ok9VVFBVVDsKKyAgICBzdHJlYW0tPnYzXzIud2lkdGggPSBzdHJlYW1JbmZvLndpZHRoOworICAgIHN0cmVhbS0+djNfMi5oZWlnaHQgPSBzdHJlYW1JbmZvLmhlaWdodDsKKyAgICBzdHJlYW0tPnYzXzIuZm9ybWF0ID0gQ2FtZXJhM0RldmljZTo6bWFwVG9QaXhlbEZvcm1hdChzdHJlYW1JbmZvLmZvcm1hdCk7CisgICAgYXV0byB1ID0gc3RyZWFtSW5mby5jb25zdW1lclVzYWdlOworICAgIGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW06OmFwcGx5WlNMVXNhZ2VRdWlyayhzdHJlYW1JbmZvLmZvcm1hdCwgJnUpOworICAgIHN0cmVhbS0+djNfMi51c2FnZSA9IENhbWVyYTNEZXZpY2U6Om1hcFRvQ29uc3VtZXJVc2FnZSh1KTsKKyAgICBzdHJlYW0tPnYzXzIuZGF0YVNwYWNlID0gQ2FtZXJhM0RldmljZTo6bWFwVG9IaWRsRGF0YXNwYWNlKHN0cmVhbUluZm8uZGF0YVNwYWNlKTsKKyAgICBzdHJlYW0tPnYzXzIucm90YXRpb24gPSBDYW1lcmEzRGV2aWNlOjptYXBUb1N0cmVhbVJvdGF0aW9uKHJvdGF0aW9uKTsKKyAgICBzdHJlYW0tPnBoeXNpY2FsQ2FtZXJhSWQgPSBzdGQ6OnN0cmluZyhwaHlzaWNhbElkLnN0cmluZygpKTsKKyAgICBzdHJlYW0tPmJ1ZmZlclNpemUgPSAwOworfQorCitiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgIGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBzZXNzaW9uQ29uZmlndXJhdGlvbiwgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgYmluZGVyOjpTdGF0dXMgcmVzOworICAgIGlmICghKHJlcyA9IGNoZWNrUGlkU3RhdHVzKF9fRlVOQ1RJT05fXykpLmlzT2soKSkgcmV0dXJuIHJlczsKKworICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKKworICAgIGlmICghbURldmljZS5nZXQoKSkgeworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRCwgIkNhbWVyYSBkZXZpY2Ugbm8gbG9uZ2VyIGFsaXZlIik7CisgICAgfQorCisgICAgYXV0byBvcGVyYXRpbmdNb2RlID0gc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0T3BlcmF0aW5nTW9kZSgpOworICAgIHJlcyA9IGNoZWNrT3BlcmF0aW5nTW9kZUxvY2tlZChvcGVyYXRpbmdNb2RlKTsKKyAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzID09IG51bGxwdHIpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoICJDYW1lcmEgJXM6IEludmFsaWQgc3RhdHVzISIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CiAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwotICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IEVycm9yIGNvbmZpZ3VyaW5nIHN0cmVhbXM6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKKyAgICB9CisKKyAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gc3RyZWFtQ29uZmlndXJhdGlvbjsKKyAgICBhdXRvIHJldCA9IENhbWVyYTNEZXZpY2U6Om1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdD4gKG9wZXJhdGluZ01vZGUpLAorICAgICAgICAgICAgLypvdXQqLyAmc3RyZWFtQ29uZmlndXJhdGlvbi5vcGVyYXRpb25Nb2RlKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAorICAgICAgICAgICAgIkNhbWVyYSAlczogRmFpbGVkIG1hcHBpbmcgb3BlcmF0aW5nIG1vZGUgJWQgcmVxdWVzdGVkOiAlcyAoJWQpIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLAorICAgICAgICAgICAgb3BlcmF0aW5nTW9kZSwgc3RyZXJyb3IoLXJldCksIHJldCk7CiAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgIG1zZy5zdHJpbmcoKSk7CisgICAgfQorCisgICAgYm9vbCBpc0lucHV0VmFsaWQgPSAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRXaWR0aCgpID4gMCkgJiYKKyAgICAgICAgICAgIChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEhlaWdodCgpID4gMCkgJiYKKyAgICAgICAgICAgIChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEZvcm1hdCgpID4gMCk7CisgICAgYXV0byBvdXRwdXRDb25maWdzID0gc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0Q29uZmlndXJhdGlvbnMoKTsKKyAgICBzaXplX3Qgc3RyZWFtQ291bnQgPSBvdXRwdXRDb25maWdzLnNpemUoKTsKKyAgICBzdHJlYW1Db3VudCA9IGlzSW5wdXRWYWxpZCA/IHN0cmVhbUNvdW50ICsgMSA6IHN0cmVhbUNvdW50OworICAgIHN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoc3RyZWFtQ291bnQpOworICAgIHNpemVfdCBzdHJlYW1JZHggPSAwOworICAgIGlmIChpc0lucHV0VmFsaWQpIHsKKyAgICAgICAgc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zW3N0cmVhbUlkeCsrXSA9IHt7LypzdHJlYW1JZCovMCwKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVR5cGU6OklOUFVULAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PiAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRXaWR0aCgpKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4gKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0SGVpZ2h0KCkpLAorICAgICAgICAgICAgICAgIENhbWVyYTNEZXZpY2U6Om1hcFRvUGl4ZWxGb3JtYXQoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRGb3JtYXQoKSksCisgICAgICAgICAgICAgICAgLyp1c2FnZSovIDAsIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVJvdGF0aW9uOjpST1RBVElPTl8wfSwKKyAgICAgICAgICAgICAgICAvKnBoeXNpY2FsSWQqLyBudWxscHRyLCAvKmJ1ZmZlclNpemUqLzB9OworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiBvdXRwdXRDb25maWdzKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+PiYgYnVmZmVyUHJvZHVjZXJzID0KKyAgICAgICAgICAgIGl0LmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcnMoKTsKKyAgICAgICAgYm9vbCBkZWZlcnJlZENvbnN1bWVyID0gaXQuaXNEZWZlcnJlZCgpOworICAgICAgICBTdHJpbmc4IHBoeXNpY2FsQ2FtZXJhSWQgPSBTdHJpbmc4KGl0LmdldFBoeXNpY2FsQ2FtZXJhSWQoKSk7CisgICAgICAgIHNpemVfdCBudW1CdWZmZXJQcm9kdWNlcnMgPSBidWZmZXJQcm9kdWNlcnMuc2l6ZSgpOworICAgICAgICBib29sIGlzU3RyZWFtSW5mb1ZhbGlkID0gZmFsc2U7CisgICAgICAgIE91dHB1dFN0cmVhbUluZm8gc3RyZWFtSW5mbzsKKworICAgICAgICByZXMgPSBjaGVja1N1cmZhY2VUeXBlTG9ja2VkKG51bUJ1ZmZlclByb2R1Y2VycywgZGVmZXJyZWRDb25zdW1lciwgaXQuZ2V0U3VyZmFjZVR5cGUoKSk7CisgICAgICAgIGlmICghcmVzLmlzT2soKSkgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIHJlcyA9IGNoZWNrUGh5c2ljYWxDYW1lcmFJZExvY2tlZChwaHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlZmVycmVkQ29uc3VtZXIpIHsKKyAgICAgICAgICAgIHN0cmVhbUluZm8ud2lkdGggPSBpdC5nZXRXaWR0aCgpOworICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQgPSBpdC5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIHN0cmVhbUluZm8uZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgICAgICAgICAgc3RyZWFtSW5mby5kYXRhU3BhY2UgPSBhbmRyb2lkX2RhdGFzcGFjZV90OjpIQUxfREFUQVNQQUNFX1VOS05PV047CisgICAgICAgICAgICBhdXRvIHN1cmZhY2VUeXBlID0gaXQuZ2V0U3VyZmFjZVR5cGUoKTsKKyAgICAgICAgICAgIHN0cmVhbUluZm8uY29uc3VtZXJVc2FnZSA9IEdyYXBoaWNCdWZmZXI6OlVTQUdFX0hXX1RFWFRVUkU7CisgICAgICAgICAgICBpZiAoc3VyZmFjZVR5cGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1NVUkZBQ0VfVklFVykgeworICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uY29uc3VtZXJVc2FnZSB8PSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19DT01QT1NFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hcFN0cmVhbUluZm8oc3RyZWFtSW5mbywgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgJnN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10pOworICAgICAgICAgICAgaXNTdHJlYW1JbmZvVmFsaWQgPSB0cnVlOworCisgICAgICAgICAgICBpZiAobnVtQnVmZmVyUHJvZHVjZXJzID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoYXV0byYgYnVmZmVyUHJvZHVjZXIgOiBidWZmZXJQcm9kdWNlcnMpIHsKKyAgICAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2U7CisgICAgICAgICAgICByZXMgPSBjcmVhdGVTdXJmYWNlRnJvbUdicChzdHJlYW1JbmZvLCBpc1N0cmVhbUluZm9WYWxpZCwgc3VyZmFjZSwgYnVmZmVyUHJvZHVjZXIsCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQpOworCisgICAgICAgICAgICBpZiAoIXJlcy5pc09rKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKworICAgICAgICAgICAgaWYgKCFpc1N0cmVhbUluZm9WYWxpZCkgeworICAgICAgICAgICAgICAgIGJvb2wgaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzOjpEZXB0aENvbXBvc2l0ZVN0cmVhbTo6aXNEZXB0aENvbXBvc2l0ZVN0cmVhbShzdXJmYWNlKTsKKyAgICAgICAgICAgICAgICBib29sIGlzSGVpY0NvbXBvc2l0ZVN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzOjpIZWljQ29tcG9zaXRlU3RyZWFtOjppc0hlaWNDb21wb3NpdGVTdHJlYW0oc3VyZmFjZSk7CisgICAgICAgICAgICAgICAgaWYgKGlzRGVwdGhDb21wb3NpdGVTdHJlYW0gfHwgaXNIZWljQ29tcG9zaXRlU3RyZWFtKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gdGFrZSBpbiB0byBhY2NvdW50IHRoYXQgY29tcG9zaXRlIHN0cmVhbXMgY2FuIGhhdmUKKyAgICAgICAgICAgICAgICAgICAgLy8gYWRkaXRpb25hbCBpbnRlcm5hbCBjYW1lcmEgc3RyZWFtcy4KKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4gY29tcG9zaXRlU3RyZWFtczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzRGVwdGhDb21wb3NpdGVTdHJlYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGNhbWVyYTM6OkRlcHRoQ29tcG9zaXRlU3RyZWFtOjpnZXRDb21wb3NpdGVTdHJlYW1JbmZvKHN0cmVhbUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2UtPmluZm8oKSwgJmNvbXBvc2l0ZVN0cmVhbXMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gY2FtZXJhMzo6SGVpY0NvbXBvc2l0ZVN0cmVhbTo6Z2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhzdHJlYW1JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2UtPmluZm8oKSwgJmNvbXBvc2l0ZVN0cmVhbXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhICVzOiBGYWlsZWQgYWRkaW5nIGNvbXBvc2l0ZSBzdHJlYW1zOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRlU3RyZWFtcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gaW50ZXJuYWwgc3RyZWFtcyBtZWFucyBjb21wb3NpdGUgc3RyZWFtIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXR1cyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBvc2l0ZVN0cmVhbXMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtQ291bnQgKz0gY29tcG9zaXRlU3RyZWFtcy5zaXplKCkgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShzdHJlYW1Db3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNvbXBvc2l0ZVN0cmVhbSA6IGNvbXBvc2l0ZVN0cmVhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcFN0cmVhbUluZm8oY29tcG9zaXRlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90PiAoaXQuZ2V0Um90YXRpb24oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsICZzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXNbc3RyZWFtSWR4KytdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1hcFN0cmVhbUluZm8oc3RyZWFtSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90PiAoaXQuZ2V0Um90YXRpb24oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgJnN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpc1N0cmVhbUluZm9WYWxpZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqc3RhdHVzID0gZmFsc2U7CisgICAgcmV0ID0gbVByb3ZpZGVyTWFuYWdlci0+aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChtQ2FtZXJhSWRTdHIuc3RyaW5nKCksCisgICAgICAgICAgICBzdHJlYW1Db25maWd1cmF0aW9uLCBzdGF0dXMpOworICAgIHN3aXRjaCAocmV0KSB7CisgICAgICAgIGNhc2UgT0s6CisgICAgICAgICAgICAvLyBFeHBlY3RlZCwgZG8gbm90aGluZy4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElOVkFMSURfT1BFUkFUSU9OOiB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhICVzOiBTZXNzaW9uIGNvbmZpZ3VyYXRpb24gcXVlcnkgbm90IHN1cHBvcnRlZCEiLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCggIkNhbWVyYSAlczogRXJyb3I6ICVzICglZCkiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcmVzOwpAQCAtNTMyLDYgKzgwNCw3IEBACiAgICAgYm9vbCBpc0lucHV0ID0gZmFsc2U7CiAgICAgc3RkOjp2ZWN0b3I8c3A8SUJpbmRlcj4+IHN1cmZhY2VzOwogICAgIHNzaXplX3QgZEluZGV4ID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgc3NpemVfdCBjb21wb3NpdGVJbmRleCAgPSBOQU1FX05PVF9GT1VORDsKIAogICAgIGlmIChtSW5wdXRTdHJlYW0uY29uZmlndXJlZCAmJiBtSW5wdXRTdHJlYW0uaWQgPT0gc3RyZWFtSWQpIHsKICAgICAgICAgaXNJbnB1dCA9IHRydWU7CkBAIC01NTEsNiArODI0LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db21wb3NpdGVTdHJlYW1NYXAuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW1JZCA9PSBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoaSktPmdldFN0cmVhbUlkKCkpIHsKKyAgICAgICAgICAgICAgICBjb21wb3NpdGVJbmRleCA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBpZiAoc3VyZmFjZXMuZW1wdHkoKSAmJiBkSW5kZXggPT0gTkFNRV9OT1RfRk9VTkQpIHsKICAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IEludmFsaWQgc3RyZWFtIElEICglZCkgc3BlY2lmaWVkLCBubyBzdWNoIgogICAgICAgICAgICAgICAgICAgICAiIHN0cmVhbSBjcmVhdGVkIHlldCIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZWFtSWQpOwpAQCAtNTgwLDYgKzg2MCwxOSBAQAogICAgICAgICAgICAgaWYgKGRJbmRleCAhPSBOQU1FX05PVF9GT1VORCkgewogICAgICAgICAgICAgICAgIG1EZWZlcnJlZFN0cmVhbXMucmVtb3ZlSXRlbXNBdChkSW5kZXgpOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29tcG9zaXRlSW5kZXggIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCByZXQ7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoY29tcG9zaXRlSW5kZXgpLT5kZWxldGVTdHJlYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IFVuZXhwZWN0ZWQgZXJyb3IgJXMgKCVkKSB3aGVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVsZXRpbmcgY29tcG9zaXRlIHN0cmVhbSAlZCIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC5yZW1vdmVJdGVtc0F0KGNvbXBvc2l0ZUluZGV4KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtNjAzLDQxICs4OTYsMjMgQEAKICAgICBib29sIGRlZmVycmVkQ29uc3VtZXIgPSBvdXRwdXRDb25maWd1cmF0aW9uLmlzRGVmZXJyZWQoKTsKICAgICBib29sIGlzU2hhcmVkID0gb3V0cHV0Q29uZmlndXJhdGlvbi5pc1NoYXJlZCgpOwogICAgIFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCA9IFN0cmluZzgob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRQaHlzaWNhbENhbWVyYUlkKCkpOwotCi0gICAgaWYgKG51bUJ1ZmZlclByb2R1Y2VycyA+IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKSB7Ci0gICAgICAgIEFMT0dFKCIlczogR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGNvdW50ICV6dSBmb3Igc3RyZWFtIGV4Y2VlZHMgbGltaXQgb2YgJWQiLAotICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZmZlclByb2R1Y2Vycy5zaXplKCksIE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiU3VyZmFjZSBjb3VudCBpcyB0b28gaGlnaCIpOwotICAgIH0KICAgICBib29sIGRlZmVycmVkQ29uc3VtZXJPbmx5ID0gZGVmZXJyZWRDb25zdW1lciAmJiBudW1CdWZmZXJQcm9kdWNlcnMgPT0gMDsKLSAgICBpbnQgc3VyZmFjZVR5cGUgPSBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VUeXBlKCk7Ci0gICAgYm9vbCB2YWxpZFN1cmZhY2VUeXBlID0gKChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9WSUVXKSB8fAotICAgICAgICAgICAgKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1RFWFRVUkUpKTsKIAotICAgIGlmIChkZWZlcnJlZENvbnN1bWVyICYmICF2YWxpZFN1cmZhY2VUeXBlKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVGFyZ2V0IHN1cmZhY2UgaXMgaW52YWxpZDogYnVmZmVyUHJvZHVjZXIgPSAlcCwgc3VyZmFjZVR5cGUgPSAlZC4iLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVyUHJvZHVjZXJzWzBdLmdldCgpLCBzdXJmYWNlVHlwZSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlRhcmdldCBTdXJmYWNlIGlzIGludmFsaWQiKTsKKyAgICByZXMgPSBjaGVja1N1cmZhY2VUeXBlTG9ja2VkKG51bUJ1ZmZlclByb2R1Y2VycywgZGVmZXJyZWRDb25zdW1lciwKKyAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVR5cGUoKSk7CisgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCiAgICAgaWYgKCFtRGV2aWNlLmdldCgpKSB7CiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVELCAiQ2FtZXJhIGRldmljZSBubyBsb25nZXIgYWxpdmUiKTsKICAgICB9CiAKLSAgICBpZiAocGh5c2ljYWxDYW1lcmFJZC5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKLSAgICAgICAgc3RkOjpzdHJpbmcgcGh5c2ljYWxJZChwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgYm9vbCBsb2dpY2FsQ2FtZXJhID0KLSAgICAgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzTG9naWNhbENhbWVyYShtRGV2aWNlLT5pbmZvKCksICZwaHlzaWNhbENhbWVyYUlkcyk7Ci0gICAgICAgIGlmICghbG9naWNhbENhbWVyYSB8fAotICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwgcGh5c2ljYWxJZCkgPT0KLSAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSkgewotICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogQ2FtZXJhIGRvZXNuJ3Qgc3VwcG9ydCBwaHlzaWNhbENhbWVyYUlkICVzLiIsCi0gICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwotICAgICAgICB9CisgICAgcmVzID0gY2hlY2tQaHlzaWNhbENhbWVyYUlkTG9ja2VkKHBoeXNpY2FsQ2FtZXJhSWQpOworICAgIGlmICghcmVzLmlzT2soKSkgeworICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KKwogICAgIHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiBzdXJmYWNlczsKICAgICBzdGQ6OnZlY3RvcjxzcDxJQmluZGVyPj4gYmluZGVyczsKICAgICBzdGF0dXNfdCBlcnI7CkBAIC02NzcsMTEgKzk1MiwzMiBAQAogCiAgICAgaW50IHN0cmVhbUlkID0gY2FtZXJhMzo6Q0FNRVJBM19TVFJFQU1fSURfSU5WQUxJRDsKICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHN1cmZhY2VJZHM7Ci0gICAgZXJyID0gbURldmljZS0+Y3JlYXRlU3RyZWFtKHN1cmZhY2VzLCBkZWZlcnJlZENvbnN1bWVyLCBzdHJlYW1JbmZvLndpZHRoLAotICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQsIHN0cmVhbUluZm8uZm9ybWF0LCBzdHJlYW1JbmZvLmRhdGFTcGFjZSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+KG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0Um90YXRpb24oKSksCi0gICAgICAgICAgICAmc3RyZWFtSWQsIHBoeXNpY2FsQ2FtZXJhSWQsICZzdXJmYWNlSWRzLCBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VTZXRJRCgpLAotICAgICAgICAgICAgaXNTaGFyZWQpOworICAgIGJvb2wgaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSA9IGNhbWVyYTM6OkRlcHRoQ29tcG9zaXRlU3RyZWFtOjppc0RlcHRoQ29tcG9zaXRlU3RyZWFtKHN1cmZhY2VzWzBdKTsKKyAgICBib29sIGlzSGVpY0NvbXBpc2l0ZVN0cmVhbSA9IGNhbWVyYTM6OkhlaWNDb21wb3NpdGVTdHJlYW06OmlzSGVpY0NvbXBvc2l0ZVN0cmVhbShzdXJmYWNlc1swXSk7CisgICAgaWYgKGlzRGVwdGhDb21wb3NpdGVTdHJlYW0gfHwgaXNIZWljQ29tcGlzaXRlU3RyZWFtKSB7CisgICAgICAgIHNwPENvbXBvc2l0ZVN0cmVhbT4gY29tcG9zaXRlU3RyZWFtOworICAgICAgICBpZiAoaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSkgeworICAgICAgICAgICAgY29tcG9zaXRlU3RyZWFtID0gbmV3IGNhbWVyYTM6OkRlcHRoQ29tcG9zaXRlU3RyZWFtKG1EZXZpY2UsIGdldFJlbW90ZUNhbGxiYWNrKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29tcG9zaXRlU3RyZWFtID0gbmV3IGNhbWVyYTM6OkhlaWNDb21wb3NpdGVTdHJlYW0obURldmljZSwgZ2V0UmVtb3RlQ2FsbGJhY2soKSk7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBjb21wb3NpdGVTdHJlYW0tPmNyZWF0ZVN0cmVhbShzdXJmYWNlcywgZGVmZXJyZWRDb25zdW1lciwgc3RyZWFtSW5mby53aWR0aCwKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCwgc3RyZWFtSW5mby5mb3JtYXQsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhM19zdHJlYW1fcm90YXRpb25fdD4ob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRSb3RhdGlvbigpKSwKKyAgICAgICAgICAgICAgICAmc3RyZWFtSWQsIHBoeXNpY2FsQ2FtZXJhSWQsICZzdXJmYWNlSWRzLCBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VTZXRJRCgpLAorICAgICAgICAgICAgICAgIGlzU2hhcmVkKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC5hZGQoSUludGVyZmFjZTo6YXNCaW5kZXIoc3VyZmFjZXNbMF0tPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSksCisgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZVN0cmVhbSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBlcnIgPSBtRGV2aWNlLT5jcmVhdGVTdHJlYW0oc3VyZmFjZXMsIGRlZmVycmVkQ29uc3VtZXIsIHN0cmVhbUluZm8ud2lkdGgsCisgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQsIHN0cmVhbUluZm8uZm9ybWF0LCBzdHJlYW1JbmZvLmRhdGFTcGFjZSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90PihvdXRwdXRDb25maWd1cmF0aW9uLmdldFJvdGF0aW9uKCkpLAorICAgICAgICAgICAgICAgICZzdHJlYW1JZCwgcGh5c2ljYWxDYW1lcmFJZCwgJnN1cmZhY2VJZHMsIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVNldElEKCksCisgICAgICAgICAgICAgICAgaXNTaGFyZWQpOworICAgIH0KIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SX0ZNVChDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwKQEAgLTExNjMsNiArMTQ1OSw4IEBACiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IHN0cmVhbUNvbmZpZ3MgPQogICAgICAgICAgICAgKGRhdGFTcGFjZSA9PSBIQUxfREFUQVNQQUNFX0RFUFRIKSA/CiAgICAgICAgICAgICBpbmZvLmZpbmQoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TKSA6CisgICAgICAgICAgICAoZGF0YVNwYWNlID09IHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihIQUxfREFUQVNQQUNFX0hFSUYpKSA/CisgICAgICAgICAgICBpbmZvLmZpbmQoQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OUykgOgogICAgICAgICAgICAgaW5mby5maW5kKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMpOwogCiAgICAgaW50MzJfdCBiZXN0V2lkdGggPSAtMTsKQEAgLTE2MTUsNyArMTkxMywxNCBAQAogICAgIC8vIFRocmVhZCBzYWZlLiBEb24ndCBib3RoZXIgbG9ja2luZy4KICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gcmVtb3RlQ2IgPSBnZXRSZW1vdGVDYWxsYmFjaygpOwogCi0gICAgaWYgKHJlbW90ZUNiICE9IDApIHsKKyAgICAvLyBDb21wb3NpdGVzIGNhbiBoYXZlIG11bHRpcGxlIGludGVybmFsIHN0cmVhbXMuIEVycm9yIG5vdGlmaWNhdGlvbnMgY29taW5nIGZyb20gc3VjaCBpbnRlcm5hbAorICAgIC8vIHN0cmVhbXMgbWF5IG5lZWQgdG8gcmVtYWluIHdpdGhpbiBjYW1lcmEgc2VydmljZS4KKyAgICBib29sIHNraXBDbGllbnROb3RpZmljYXRpb24gPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db21wb3NpdGVTdHJlYW1NYXAuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc2tpcENsaWVudE5vdGlmaWNhdGlvbiB8PSBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoaSktPm9uRXJyb3IoZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMpOworICAgIH0KKworICAgIGlmICgocmVtb3RlQ2IgIT0gMCkgJiYgKCFza2lwQ2xpZW50Tm90aWZpY2F0aW9uKSkgewogICAgICAgICByZW1vdGVDYi0+b25EZXZpY2VFcnJvcihlcnJvckNvZGUsIHJlc3VsdEV4dHJhcyk7CiAgICAgfQogfQpAQCAtMTY0OSw2ICsxOTU0LDEwIEBACiAgICAgICAgIHJlbW90ZUNiLT5vbkNhcHR1cmVTdGFydGVkKHJlc3VsdEV4dHJhcywgdGltZXN0YW1wKTsKICAgICB9CiAgICAgQ2FtZXJhMkNsaWVudEJhc2U6Om5vdGlmeVNodXR0ZXIocmVzdWx0RXh0cmFzLCB0aW1lc3RhbXApOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29tcG9zaXRlU3RyZWFtTWFwLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChpKS0+b25TaHV0dGVyKHJlc3VsdEV4dHJhcywgdGltZXN0YW1wKTsKKyAgICB9CiB9CiAKIHZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50Ojpub3RpZnlQcmVwYXJlZChpbnQgc3RyZWFtSWQpIHsKQEAgLTE3MDgsNiArMjAxNywxMCBAQAogICAgICAgICByZW1vdGVDYi0+b25SZXN1bHRSZWNlaXZlZChyZXN1bHQubU1ldGFkYXRhLCByZXN1bHQubVJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICByZXN1bHQubVBoeXNpY2FsTWV0YWRhdGFzKTsKICAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db21wb3NpdGVTdHJlYW1NYXAuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGkpLT5vblJlc3VsdEF2YWlsYWJsZShyZXN1bHQpOworICAgIH0KIH0KIAogYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjpjaGVja1BpZFN0YXR1cyhjb25zdCBjaGFyKiBjaGVja0xvY2F0aW9uKSB7CkBAIC0xNzI0LDcgKzIwMzcsNyBAQAogLy8gVE9ETzogbW92ZSB0byBDYW1lcmEyQ2xpZW50QmFzZQogYm9vbCBDYW1lcmFEZXZpY2VDbGllbnQ6OmVuZm9yY2VSZXF1ZXN0UGVybWlzc2lvbnMoQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhKSB7CiAKLSAgICBjb25zdCBpbnQgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCBwaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGNvbnN0IGludCBzZWxmUGlkID0gZ2V0cGlkKCk7CiAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnk7CiAKQEAgLTE3NjMsNyArMjA3Niw3IEBACiAgICAgICAgIFN0cmluZzE2IHBlcm1pc3Npb25TdHJpbmcgPQogICAgICAgICAgICAgU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkFfRElTQUJMRV9UUkFOU01JVF9MRUQiKTsKICAgICAgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHBlcm1pc3Npb25TdHJpbmcpKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgICAgICAgICAgY29uc3QgaW50IHVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAgICAgICAgICAgICBBTE9HRSgiUGVybWlzc2lvbiBEZW5pYWw6ICIKICAgICAgICAgICAgICAgICAgICJjYW4ndCBkaXNhYmxlIHRyYW5zbWl0IExFRCBwaWQ9JWQsIHVpZD0lZCIsIHBpZCwgdWlkKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCmluZGV4IGMzMDU2MWQuLjFjNWFiYjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaApAQCAtMjAsMTMgKzIwLDE2IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0JuQ2FtZXJhRGV2aWNlVXNlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvU3VibWl0SW5mby5oPgogCiAjaW5jbHVkZSAiQ2FtZXJhU2VydmljZS5oIgogI2luY2x1ZGUgImNvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuaCIKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaCIKKyNpbmNsdWRlICJDb21wb3NpdGVTdHJlYW0uaCIKIAogdXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6T3V0cHV0U3RyZWFtSW5mbzsKK3VzaW5nIGFuZHJvaWQ6OmNhbWVyYTM6OkNvbXBvc2l0ZVN0cmVhbTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC04OSw2ICs5MiwxMiBAQAogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgZW5kQ29uZmlndXJlKGludCBvcGVyYXRpbmdNb2RlLAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OkNhbWVyYU1ldGFkYXRhTmF0aXZlJiBzZXNzaW9uUGFyYW1zKSBvdmVycmlkZTsKIAorICAgIC8vIFZlcmlmeSBzcGVjaWZpYyBzZXNzaW9uIGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICAgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIHNlc3Npb25Db25maWd1cmF0aW9uLAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgYm9vbCogc3RyZWFtU3RhdHVzKSBvdmVycmlkZTsKKwogICAgIC8vIFJldHVybnMgLUVCVVNZIGlmIGRldmljZSBpcyBub3QgaWRsZSBvciBpbiBlcnJvciBzdGF0ZQogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgZGVsZXRlU3RyZWFtKGludCBzdHJlYW1JZCkgb3ZlcnJpZGU7CiAKQEAgLTIzMCw2ICsyMzksMTMgQEAKIAogICAgIC8qKiBVdGlsaXR5IG1lbWJlcnMgKi8KICAgICBiaW5kZXI6OlN0YXR1cyBjaGVja1BpZFN0YXR1cyhjb25zdCBjaGFyKiBjaGVja0xvY2F0aW9uKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBjaGVja09wZXJhdGluZ01vZGVMb2NrZWQoaW50IG9wZXJhdGluZ01vZGUpIGNvbnN0OworICAgIGJpbmRlcjo6U3RhdHVzIGNoZWNrUGh5c2ljYWxDYW1lcmFJZExvY2tlZChTdHJpbmc4IHBoeXNpY2FsQ2FtZXJhSWQpOworICAgIGJpbmRlcjo6U3RhdHVzIGNoZWNrU3VyZmFjZVR5cGVMb2NrZWQoc2l6ZV90IG51bUJ1ZmZlclByb2R1Y2VycywgYm9vbCBkZWZlcnJlZENvbnN1bWVyLAorICAgICAgICAgICAgaW50IHN1cmZhY2VUeXBlKSBjb25zdDsKKyAgICBzdGF0aWMgdm9pZCBtYXBTdHJlYW1JbmZvKGNvbnN0IE91dHB1dFN0cmVhbUluZm8gJnN0cmVhbUluZm8sCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBTdHJpbmc4IHBoeXNpY2FsSWQsCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbSAqc3RyZWFtIC8qb3V0Ki8pOwogICAgIGJvb2wgZW5mb3JjZVJlcXVlc3RQZXJtaXNzaW9ucyhDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEpOwogCiAgICAgLy8gRmluZCB0aGUgc3F1YXJlIG9mIHRoZSBldWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzCkBAIC0zMDAsNyArMzE2LDEwIEBACiAgICAgLy8gc3RyZWFtIElEIC0+IG91dHB1dFN0cmVhbUluZm8gbWFwcGluZwogICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQzMl90LCBPdXRwdXRTdHJlYW1JbmZvPiBtU3RyZWFtSW5mb01hcDsKIAotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNID0gMjsKKyAgICBLZXllZFZlY3RvcjxzcDxJQmluZGVyPiwgc3A8Q29tcG9zaXRlU3RyZWFtPj4gbUNvbXBvc2l0ZVN0cmVhbU1hcDsKKworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNID0gNDsKKyAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1Qcm92aWRlck1hbmFnZXI7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9Db21wb3NpdGVTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9Db21wb3NpdGVTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NGVhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NvbXBvc2l0ZVN0cmVhbS5jcHAKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYTMtQ29tcG9zaXRlU3RyZWFtIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCisjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKKyNpbmNsdWRlICJDYW1lcmFEZXZpY2VDbGllbnQuaCIKKyNpbmNsdWRlICJDb21wb3NpdGVTdHJlYW0uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCitDb21wb3NpdGVTdHJlYW06OkNvbXBvc2l0ZVN0cmVhbSh3cDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UsCisgICAgICAgIHdwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYikgOgorICAgICAgICBtRGV2aWNlKGRldmljZSksCisgICAgICAgIG1SZW1vdGVDYWxsYmFjayhjYiksCisgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cygxKSwKKyAgICAgICAgbUVycm9yU3RhdGUoZmFsc2UpIHsKKyAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBjYW1lcmFEZXZpY2UgPSBkZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChjYW1lcmFEZXZpY2UuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBDYW1lcmFNZXRhZGF0YSBzdGF0aWNJbmZvID0gY2FtZXJhRGV2aWNlLT5pbmZvKCk7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9QQVJUSUFMX1JFU1VMVF9DT1VOVCk7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cyA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBDb21wb3NpdGVTdHJlYW06OmNyZWF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKKyAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKiBpZCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqIHN1cmZhY2VJZHMsIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCkgeworICAgIGlmIChoYXNEZWZlcnJlZENvbnN1bWVyKSB7CisgICAgICAgIEFMT0dFKCIlczogRGVmZXJyZWQgY29uc3VtZXJzIG5vdCBzdXBwb3J0ZWQgaW4gY2FzZSBvZiBjb21wb3NpdGUgc3RyZWFtcyEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKHN0cmVhbVNldElkICE9IGNhbWVyYTM6OkNBTUVSQTNfU1RSRUFNX0lEX0lOVkFMSUQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdXJmYWNlIGdyb3VwcyBub3Qgc3VwcG9ydGVkIGluIGNhc2Ugb2YgY29tcG9zaXRlIHN0cmVhbXMhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChpc1NoYXJlZCkgeworICAgICAgICBBTE9HRSgiJXM6IFNoYXJlZCBzdXJmYWNlcyBub3Qgc3VwcG9ydGVkIGluIGNhc2Ugb2YgY29tcG9zaXRlIHN0cmVhbXMhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJldHVybiBjcmVhdGVJbnRlcm5hbFN0cmVhbXMoY29uc3VtZXJzLCBoYXNEZWZlcnJlZENvbnN1bWVyLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHJvdGF0aW9uLCBpZCwKKyAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsIHN1cmZhY2VJZHMsIHN0cmVhbVNldElkLCBpc1NoYXJlZCk7Cit9CisKK3N0YXR1c190IENvbXBvc2l0ZVN0cmVhbTo6ZGVsZXRlU3RyZWFtKCkgeworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICAgICAgbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5jbGVhcigpOworICAgICAgICBtQ2FwdHVyZVJlc3VsdHMuY2xlYXIoKTsKKyAgICAgICAgbUZyYW1lTnVtYmVyTWFwLmNsZWFyKCk7CisgICAgICAgIG1FcnJvckZyYW1lTnVtYmVycy5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiBkZWxldGVJbnRlcm5hbFN0cmVhbXMoKTsKK30KKwordm9pZCBDb21wb3NpdGVTdHJlYW06Om9uQnVmZmVyUmVxdWVzdEZvckZyYW1lTnVtYmVyKHVpbnQ2NF90IGZyYW1lTnVtYmVyLCBpbnQgc3RyZWFtSWQsCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiAvKnNldHRpbmdzKi8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgIGlmICghbUVycm9yU3RhdGUgJiYgKHN0cmVhbUlkID09IGdldFN0cmVhbUlkKCkpKSB7CisgICAgICAgIG1QZW5kaW5nQ2FwdHVyZVJlc3VsdHMuZW1wbGFjZShmcmFtZU51bWJlciwgQ2FtZXJhTWV0YWRhdGEoKSk7CisgICAgfQorfQorCit2b2lkIENvbXBvc2l0ZVN0cmVhbTo6b25CdWZmZXJSZWxlYXNlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICBpZiAoIW1FcnJvclN0YXRlICYmICFidWZmZXJJbmZvLm1FcnJvcikgeworICAgICAgICBtRnJhbWVOdW1iZXJNYXAuZW1wbGFjZShidWZmZXJJbmZvLm1GcmFtZU51bWJlciwgYnVmZmVySW5mby5tVGltZXN0YW1wKTsKKyAgICAgICAgbUlucHV0UmVhZHlDb25kaXRpb24uc2lnbmFsKCk7CisgICAgfQorfQorCit2b2lkIENvbXBvc2l0ZVN0cmVhbTo6ZXJhc2VSZXN1bHQoaW50NjRfdCBmcmFtZU51bWJlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisKKyAgICBhdXRvIGl0ID0gbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5maW5kKGZyYW1lTnVtYmVyKTsKKyAgICBpZiAoaXQgPT0gbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5lbmQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaXQgPSBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmVyYXNlKGl0KTsKK30KKwordm9pZCBDb21wb3NpdGVTdHJlYW06Om9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQmIHJlc3VsdCkgeworICAgIGJvb2wgcmVzdWx0RXJyb3IgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisKKyAgICAgICAgdWludDY0X3QgZnJhbWVOdW1iZXIgPSByZXN1bHQubVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcjsKKyAgICAgICAgYm9vbCByZXN1bHRSZWFkeSA9IGZhbHNlOworICAgICAgICBhdXRvIGl0ID0gbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5maW5kKGZyYW1lTnVtYmVyKTsKKyAgICAgICAgaWYgKGl0ICE9IG1QZW5kaW5nQ2FwdHVyZVJlc3VsdHMuZW5kKCkpIHsKKyAgICAgICAgICAgIGl0LT5zZWNvbmQuYXBwZW5kKHJlc3VsdC5tTWV0YWRhdGEpOworICAgICAgICAgICAgaWYgKHJlc3VsdC5tUmVzdWx0RXh0cmFzLnBhcnRpYWxSZXN1bHRDb3VudCA+PSBtTnVtUGFydGlhbFJlc3VsdHMpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGVudHJ5ID0gaXQtPnNlY29uZC5maW5kKEFORFJPSURfU0VOU09SX1RJTUVTVEFNUCk7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byB0cyA9IGVudHJ5LmRhdGEuaTY0WzBdOworICAgICAgICAgICAgICAgICAgICBtQ2FwdHVyZVJlc3VsdHMuZW1wbGFjZSh0cywgc3RkOjptYWtlX3R1cGxlKGZyYW1lTnVtYmVyLCBpdC0+c2Vjb25kKSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRpbWVzdGFtcCBtZXRhZGF0YSBlbnRyeSBtaXNzaW5nIGZvciBmcmFtZU51bWJlcjogJSIgUFJJdTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FwdHVyZVJlc3VsdHMuZXJhc2UoaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdFJlYWR5KSB7CisgICAgICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXN1bHRFcnJvcikgeworICAgICAgICBvblJlc3VsdEVycm9yKHJlc3VsdC5tUmVzdWx0RXh0cmFzKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlU3RyZWFtOjpmbGFnQW5FcnJvckZyYW1lTnVtYmVyKGludDY0X3QgZnJhbWVOdW1iZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgIG1FcnJvckZyYW1lTnVtYmVycy5lbXBsYWNlKGZyYW1lTnVtYmVyKTsKKyAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKK30KKworc3RhdHVzX3QgQ29tcG9zaXRlU3RyZWFtOjpyZWdpc3RlckNvbXBvc2l0ZVN0cmVhbUxpc3RlbmVyKGludDMyX3Qgc3RyZWFtSWQpIHsKKyAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoZGV2aWNlLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgYXV0byByZXQgPSBkZXZpY2UtPmFkZEJ1ZmZlckxpc3RlbmVyRm9yU3RyZWFtKHN0cmVhbUlkLCB0aGlzKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIGNvbXBvc2l0ZSBzdHJlYW0gbGlzdGVuZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitib29sIENvbXBvc2l0ZVN0cmVhbTo6b25FcnJvcihpbnQzMl90IGVycm9yQ29kZSwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgYXV0byByZXQgPSBmYWxzZTsKKyAgICBzd2l0Y2ggKGVycm9yQ29kZSkgeworICAgICAgICBjYXNlIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVTVUxUOgorICAgICAgICAgICAgb25SZXN1bHRFcnJvcihyZXN1bHRFeHRyYXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVI6CisgICAgICAgICAgICByZXQgPSBvblN0cmVhbUJ1ZmZlckVycm9yKHJlc3VsdEV4dHJhcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1Q6CisgICAgICAgICAgICAvLyBJbnZhbGlkIHJlcXVlc3QsIHRoaXMgc2hvdWxkbid0IGFmZmVjdCBjb21wb3NpdGUgc3RyZWFtcy4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiBVbnJlY292ZXJhYmxlIGVycm9yOiAlZCBkZXRlY3RlZCEiLCBfX0ZVTkNUSU9OX18sIGVycm9yQ29kZSk7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgICAgICAgICAgbUVycm9yU3RhdGUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBDb21wb3NpdGVTdHJlYW06Om5vdGlmeUVycm9yKGludDY0X3QgZnJhbWVOdW1iZXIpIHsKKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gcmVtb3RlQ2IgPQorICAgICAgICBtUmVtb3RlQ2FsbGJhY2sucHJvbW90ZSgpOworCisgICAgaWYgKChmcmFtZU51bWJlciA+PSAwKSAmJiAocmVtb3RlQ2IuZ2V0KCkgIT0gbnVsbHB0cikpIHsKKyAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyBleHRyYXM7CisgICAgICAgIGV4dHJhcy5lcnJvclN0cmVhbUlkID0gZ2V0U3RyZWFtSWQoKTsKKyAgICAgICAgZXh0cmFzLmZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgICAgIHJlbW90ZUNiLT5vbkRldmljZUVycm9yKAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfQlVGRkVSLAorICAgICAgICAgICAgICAgIGV4dHJhcyk7CisgICAgfQorfQorCit9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ29tcG9zaXRlU3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NvbXBvc2l0ZVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MDFhODIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NvbXBvc2l0ZVN0cmVhbS5oCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfQ09NUE9TSVRFX1NUUkVBTV9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBM19DT01QT1NJVEVfU1RSRUFNX0gKKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8Z3VpL0lQcm9kdWNlckxpc3RlbmVyLmg+CisjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDYW1lcmFEZXZpY2VDbGllbnQ7CitjbGFzcyBDYW1lcmFNZXRhZGF0YTsKK2NsYXNzIFN1cmZhY2U7CisKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworY2xhc3MgQ29tcG9zaXRlU3RyZWFtIDogcHVibGljIGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lciB7CisKK3B1YmxpYzoKKyAgICBDb21wb3NpdGVTdHJlYW0od3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlLCB3cDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gY2IpOworICAgIHZpcnR1YWwgfkNvbXBvc2l0ZVN0cmVhbSgpIHt9CisKKyAgICBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCisgICAgICAgICAgICBib29sIGhhc0RlZmVycmVkQ29uc3VtZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkKTsKKworICAgIHN0YXR1c190IGRlbGV0ZVN0cmVhbSgpOworCisgICAgLy8gQ3JlYXRlIGFuZCByZWdpc3RlciBhbGwgaW50ZXJuYWwgY2FtZXJhIHN0cmVhbXMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVJbnRlcm5hbFN0cmVhbXMoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCisgICAgICAgICAgICBib29sIGhhc0RlZmVycmVkQ29uc3VtZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkKSA9IDA7CisKKyAgICAvLyBSZWxlYXNlIGFsbCBpbnRlcm5hbCBzdHJlYW1zIGFuZCBjb3JyZXNwb25kaW5nIHJlc291cmNlcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlbGV0ZUludGVybmFsU3RyZWFtcygpID0gMDsKKworICAgIC8vIFN0cmVhbSBjb25maWd1cmF0aW9uIGNvbXBsZXRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbSgpID0gMDsKKworICAgIC8vIEluc2VydCB0aGUgaW50ZXJuYWwgY29tcG9zaXRlIHN0cmVhbSBpZCBpbiB0aGUgdXNlciBjYXB0dXJlIHJlcXVlc3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbnNlcnRHYnAoU3VyZmFjZU1hcCogLypvdXQqL291dFN1cmZhY2VNYXAsCisgICAgICAgICAgICBWZWN0b3I8aW50MzJfdD4qIC8qb3V0Ki9vdXRwdXRTdHJlYW1JZHMsIGludDMyX3QqIC8qb3V0Ki9jdXJyZW50U3RyZWFtSWQpID0gMDsKKworICAgIC8vIFJldHVybiBjb21wb3NpdGUgc3RyZWFtIGlkLgorICAgIHZpcnR1YWwgaW50IGdldFN0cmVhbUlkKCkgPSAwOworCisgICAgLy8gTm90aWZ5IHdoZW4gc2h1dHRlciBub3RpZnkgaXMgdHJpZ2dlcmVkCisgICAgdmlydHVhbCB2b2lkIG9uU2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiAvKnJlc3VsdEV4dHJhcyovLCBuc2Vjc190IC8qdGltZXN0YW1wKi8pIHt9CisKKyAgICB2b2lkIG9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQmIHJlc3VsdCk7CisgICAgYm9vbCBvbkVycm9yKGludDMyX3QgZXJyb3JDb2RlLCBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpOworCisgICAgLy8gQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyIGltcGxlbWVudGF0aW9uCisgICAgdm9pZCBvbkJ1ZmZlckFjcXVpcmVkKGNvbnN0IEJ1ZmZlckluZm8mIC8qYnVmZmVySW5mbyovKSBvdmVycmlkZSB7IC8qRW1wdHkgZm9yIG5vdyAqLyB9CisgICAgdm9pZCBvbkJ1ZmZlclJlbGVhc2VkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pIG92ZXJyaWRlOworICAgIHZvaWQgb25CdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIodWludDY0X3QgZnJhbWVOdW1iZXIsIGludCBzdHJlYW1JZCwKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXR0aW5ncykgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICBzdHJ1Y3QgUHJvZHVjZXJMaXN0ZW5lciA6IHB1YmxpYyBCblByb2R1Y2VyTGlzdGVuZXIgeworICAgICAgICAvLyBQcm9kdWNlckxpc3RlbmVyIGltcGVtZW50YXRpb24KKyAgICAgICAgdm9pZCBvbkJ1ZmZlclJlbGVhc2VkKCkgb3ZlcnJpZGUgeyAvKk5vIGltcGwuIGZvciBub3cqLyB9OworICAgIH07CisKKyAgICBzdGF0dXNfdCByZWdpc3RlckNvbXBvc2l0ZVN0cmVhbUxpc3RlbmVyKGludDMyX3Qgc3RyZWFtSWQpOworICAgIHZvaWQgZXJhc2VSZXN1bHQoaW50NjRfdCBmcmFtZU51bWJlcik7CisgICAgdm9pZCBmbGFnQW5FcnJvckZyYW1lTnVtYmVyKGludDY0X3QgZnJhbWVOdW1iZXIpOworICAgIHZvaWQgbm90aWZ5RXJyb3IoaW50NjRfdCBmcmFtZU51bWJlcik7CisKKyAgICAvLyBTdWJjbGFzc2VzIHNob3VsZCBjaGVjayBmb3IgYnVmZmVyIGVycm9ycyBmcm9tIGludGVybmFsIHN0cmVhbXMgYW5kIHJldHVybiAndHJ1ZScgaW4KKyAgICAvLyBjYXNlIHRoZSBlcnJvciBub3RpZmljYXRpb24gc2hvdWxkIHJlbWFpbiB3aXRoaW4gY2FtZXJhIHNlcnZpY2UuCisgICAgdmlydHVhbCBib29sIG9uU3RyZWFtQnVmZmVyRXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSA9IDA7CisKKyAgICAvLyBTdWJjbGFzc2VzIGNhbiBkZWNpZGUgaG93IHRvIGhhbmRsZSByZXN1bHQgZXJyb3JzIGRlcGVuZGluZyBvbiB3aGV0aGVyIG9yIG5vdCB0aGUKKyAgICAvLyBpbnRlcm5hbCBwcm9jZXNzaW5nIG5lZWRzIHJlc3VsdCBkYXRhLgorICAgIHZpcnR1YWwgdm9pZCBvblJlc3VsdEVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgPSAwOworCisgICAgLy8gRGV2aWNlIGFuZC9vciBzZXJ2aWNlIGlzIGluIHVucmVjb3ZlcmFibGUgZXJyb3Igc3RhdGUuCisgICAgLy8gQ29tcG9zaXRlIHN0cmVhbXMgc2hvdWxkIGJlaGF2ZSBhY2NvcmRpbmdseS4KKyAgICB2b2lkIGVuYWJsZUVycm9yU3RhdGUoKTsKKworICAgIHdwPENhbWVyYURldmljZUJhc2U+ICAgbURldmljZTsKKyAgICB3cDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gbVJlbW90ZUNhbGxiYWNrOworCisgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICBtTXV0ZXg7CisgICAgQ29uZGl0aW9uICAgICAgICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbjsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0czsKKyAgICBib29sICAgICAgICAgICAgICAgICAgIG1FcnJvclN0YXRlOworCisgICAgLy8gRnJhbWUgbnVtYmVyIHRvIGNhcHR1cmUgcmVzdWx0IG1hcCBvZiBwYXJ0aWFsIHBlbmRpbmcgcmVxdWVzdCByZXN1bHRzLgorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50NjRfdCwgQ2FtZXJhTWV0YWRhdGE+IG1QZW5kaW5nQ2FwdHVyZVJlc3VsdHM7CisKKyAgICAvLyBUaW1lc3RhbXAgdG8gY2FwdHVyZSAoZnJhbWUgbnVtYmVyLCByZXN1bHQpIG1hcCBvZiBjb21wbGV0ZWQgcGVuZGluZyByZXF1ZXN0IHJlc3VsdHMuCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludDY0X3QsIHN0ZDo6dHVwbGU8aW50NjRfdCwgQ2FtZXJhTWV0YWRhdGE+PiBtQ2FwdHVyZVJlc3VsdHM7CisKKyAgICAvLyBGcmFtZSBudW1iZXIgdG8gdGltZXN0YW1wIG1hcAorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQ2NF90LCBpbnQ2NF90PiBtRnJhbWVOdW1iZXJNYXA7CisKKyAgICAvLyBLZWVwcyBhIHNldCBidWZmZXIvcmVzdWx0IGZyYW1lIG51bWJlcnMgZm9yIGFueSBlcnJvcnMgZGV0ZWN0ZWQgZHVyaW5nIHByb2Nlc3NpbmcuCisgICAgc3RkOjpzZXQ8aW50NjRfdD4gbUVycm9yRnJhbWVOdW1iZXJzOworCit9OworCit9OyAvL25hbWVzcGFjZSBjYW1lcmEzCit9OyAvL25hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTI1YWQyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5jcHAKQEAgLTAsMCArMSw4MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYTMtRGVwdGhDb21wb3NpdGVTdHJlYW0iCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmgiCisjaW5jbHVkZSAiY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oIgorI2luY2x1ZGUgImRsZmNuLmgiCisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCisjaW5jbHVkZSAiRGVwdGhDb21wb3NpdGVTdHJlYW0uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCitEZXB0aENvbXBvc2l0ZVN0cmVhbTo6RGVwdGhDb21wb3NpdGVTdHJlYW0od3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlLAorICAgICAgICB3cDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gY2IpIDoKKyAgICAgICAgQ29tcG9zaXRlU3RyZWFtKGRldmljZSwgY2IpLAorICAgICAgICBtQmxvYlN0cmVhbUlkKC0xKSwKKyAgICAgICAgbUJsb2JTdXJmYWNlSWQoLTEpLAorICAgICAgICBtRGVwdGhTdHJlYW1JZCgtMSksCisgICAgICAgIG1EZXB0aFN1cmZhY2VJZCgtMSksCisgICAgICAgIG1CbG9iV2lkdGgoMCksCisgICAgICAgIG1CbG9iSGVpZ2h0KDApLAorICAgICAgICBtRGVwdGhCdWZmZXJBY3F1aXJlZChmYWxzZSksCisgICAgICAgIG1CbG9iQnVmZmVyQWNxdWlyZWQoZmFsc2UpLAorICAgICAgICBtUHJvZHVjZXJMaXN0ZW5lcihuZXcgUHJvZHVjZXJMaXN0ZW5lcigpKSwKKyAgICAgICAgbU1heEpwZWdTaXplKC0xKSwKKyAgICAgICAgbUlzTG9naWNhbENhbWVyYShmYWxzZSksCisgICAgICAgIG1EZXB0aFBob3RvTGliSGFuZGxlKG51bGxwdHIpLAorICAgICAgICBtRGVwdGhQaG90b1Byb2Nlc3MobnVsbHB0cikgeworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGNhbWVyYURldmljZSA9IGRldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGNhbWVyYURldmljZS5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIHN0YXRpY0luZm8gPSBjYW1lcmFEZXZpY2UtPmluZm8oKTsKKyAgICAgICAgYXV0byBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX0pQRUdfTUFYX1NJWkUpOworICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CisgICAgICAgICAgICBtTWF4SnBlZ1NpemUgPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogTWF4aW11bSBqcGVnIHNpemUgYWJzZW50IGZyb20gY2FtZXJhIGNoYXJhY3RlcmlzdGljcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0KKworICAgICAgICBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDUpIHsKKyAgICAgICAgICAgIG1JbnN0cmluc2ljQ2FsaWJyYXRpb24ucmVzZXJ2ZSg1KTsKKyAgICAgICAgICAgIG1JbnN0cmluc2ljQ2FsaWJyYXRpb24uaW5zZXJ0KG1JbnN0cmluc2ljQ2FsaWJyYXRpb24uZW5kKCksIGVudHJ5LmRhdGEuZiwKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZGF0YS5mICsgNSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IEludHJpbnNpYyBjYWxpYnJhdGlvbiBhYnNlbnQgZnJvbSBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0KKworICAgICAgICBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX0xFTlNfRElTVE9SVElPTik7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSA1KSB7CisgICAgICAgICAgICBtTGVuc0Rpc3RvcnRpb24ucmVzZXJ2ZSg1KTsKKyAgICAgICAgICAgIG1MZW5zRGlzdG9ydGlvbi5pbnNlcnQobUxlbnNEaXN0b3J0aW9uLmVuZCgpLCBlbnRyeS5kYXRhLmYsIGVudHJ5LmRhdGEuZiArIDUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzOiBMZW5zIGRpc3RvcnRpb24gYWJzZW50IGZyb20gY2FtZXJhIGNoYXJhY3RlcmlzdGljcyEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB9CisKKyAgICAgICAgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5LmRhdGEudThbaV07CisgICAgICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19MT0dJQ0FMX01VTFRJX0NBTUVSQSkgeworICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmEgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZ2V0U3VwcG9ydGVkRGVwdGhTaXplcyhzdGF0aWNJbmZvLCAmbVN1cHBvcnRlZERlcHRoU2l6ZXMpOworCisgICAgICAgIG1EZXB0aFBob3RvTGliSGFuZGxlID0gZGxvcGVuKGNhbWVyYTM6OmtEZXB0aFBob3RvTGlicmFyeSwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKKyAgICAgICAgaWYgKG1EZXB0aFBob3RvTGliSGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1EZXB0aFBob3RvUHJvY2VzcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2FtZXJhMzo6cHJvY2Vzc19kZXB0aF9waG90b19mcmFtZT4gKAorICAgICAgICAgICAgICAgICAgICBkbHN5bShtRGVwdGhQaG90b0xpYkhhbmRsZSwgY2FtZXJhMzo6a0RlcHRoUGhvdG9Qcm9jZXNzRnVuY3Rpb24pKTsKKyAgICAgICAgICAgIGlmIChtRGVwdGhQaG90b1Byb2Nlc3MgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGxpbmsgdG8gZGVwdGggcGhvdG8gcHJvY2VzcyBmdW5jdGlvbjogJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBkbGVycm9yKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gbGluayB0byBkZXB0aCBwaG90byBsaWJyYXJ5OiAlcyIsIF9fRlVOQ1RJT05fXywgZGxlcnJvcigpKTsKKyAgICAgICAgfQorCisgICAgfQorfQorCitEZXB0aENvbXBvc2l0ZVN0cmVhbTo6fkRlcHRoQ29tcG9zaXRlU3RyZWFtKCkgeworICAgIG1CbG9iQ29uc3VtZXIuY2xlYXIoKSwKKyAgICBtQmxvYlN1cmZhY2UuY2xlYXIoKSwKKyAgICBtQmxvYlN0cmVhbUlkID0gLTE7CisgICAgbUJsb2JTdXJmYWNlSWQgPSAtMTsKKyAgICBtRGVwdGhDb25zdW1lci5jbGVhcigpOworICAgIG1EZXB0aFN1cmZhY2UuY2xlYXIoKTsKKyAgICBtRGVwdGhDb25zdW1lciA9IG51bGxwdHI7CisgICAgbURlcHRoU3VyZmFjZSA9IG51bGxwdHI7CisgICAgaWYgKG1EZXB0aFBob3RvTGliSGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgZGxjbG9zZShtRGVwdGhQaG90b0xpYkhhbmRsZSk7CisgICAgICAgIG1EZXB0aFBob3RvTGliSGFuZGxlID0gbnVsbHB0cjsKKyAgICB9CisgICAgbURlcHRoUGhvdG9Qcm9jZXNzID0gbnVsbHB0cjsKK30KKwordm9pZCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6Y29tcGlsZVBlbmRpbmdJbnB1dExvY2tlZCgpIHsKKyAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyIGltZ0J1ZmZlcjsKKworICAgIHdoaWxlICghbUlucHV0SnBlZ0J1ZmZlcnMuZW1wdHkoKSAmJiAhbUJsb2JCdWZmZXJBY3F1aXJlZCkgeworICAgICAgICBhdXRvIGl0ID0gbUlucHV0SnBlZ0J1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgYXV0byByZXMgPSBtQmxvYkNvbnN1bWVyLT5sb2NrTmV4dEJ1ZmZlcigmaW1nQnVmZmVyKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOT1RfRU5PVUdIX0RBVEEpIHsKKyAgICAgICAgICAgIC8vIENhbiBub3QgbG9jayBhbnkgbW9yZSBidWZmZXJzLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGxvY2tpbmcgYmxvYiBpbWFnZSBidWZmZXI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1sqaXRdLmVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIG1JbnB1dEpwZWdCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCppdCAhPSBpbWdCdWZmZXIudGltZXN0YW1wKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IEV4cGVjdGluZyBqcGVnIGJ1ZmZlciB3aXRoIHRpbWUgc3RhbXA6ICUiIFBSSWQ2NCAiIHJlY2VpdmVkIGJ1ZmZlciB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgInRpbWUgc3RhbXA6ICUiIFBSSWQ2NCwgX19GVU5DVElPTl9fLCAqaXQsIGltZ0J1ZmZlci50aW1lc3RhbXApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChtUGVuZGluZ0lucHV0RnJhbWVzLmZpbmQoaW1nQnVmZmVyLnRpbWVzdGFtcCkgIT0gbVBlbmRpbmdJbnB1dEZyYW1lcy5lbmQoKSkgJiYKKyAgICAgICAgICAgICAgICAobVBlbmRpbmdJbnB1dEZyYW1lc1tpbWdCdWZmZXIudGltZXN0YW1wXS5lcnJvcikpIHsKKyAgICAgICAgICAgIG1CbG9iQ29uc3VtZXItPnVubG9ja0J1ZmZlcihpbWdCdWZmZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpbWdCdWZmZXIudGltZXN0YW1wXS5qcGVnQnVmZmVyID0gaW1nQnVmZmVyOworICAgICAgICAgICAgbUJsb2JCdWZmZXJBY3F1aXJlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbUlucHV0SnBlZ0J1ZmZlcnMuZXJhc2UoaXQpOworICAgIH0KKworICAgIHdoaWxlICghbUlucHV0RGVwdGhCdWZmZXJzLmVtcHR5KCkgJiYgIW1EZXB0aEJ1ZmZlckFjcXVpcmVkKSB7CisgICAgICAgIGF1dG8gaXQgPSBtSW5wdXREZXB0aEJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgYXV0byByZXMgPSBtRGVwdGhDb25zdW1lci0+bG9ja05leHRCdWZmZXIoJmltZ0J1ZmZlcik7CisgICAgICAgIGlmIChyZXMgPT0gTk9UX0VOT1VHSF9EQVRBKSB7CisgICAgICAgICAgICAvLyBDYW4gbm90IGxvY2sgYW55IG1vcmUgYnVmZmVycy4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciByZWNlaXZpbmcgZGVwdGggaW1hZ2UgYnVmZmVyOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbKml0XS5lcnJvciA9IHRydWU7CisgICAgICAgICAgICBtSW5wdXREZXB0aEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKml0ICE9IGltZ0J1ZmZlci50aW1lc3RhbXApIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogRXhwZWN0aW5nIGRlcHRoIGJ1ZmZlciB3aXRoIHRpbWUgc3RhbXA6ICUiIFBSSWQ2NCAiIHJlY2VpdmVkIGJ1ZmZlciB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgInRpbWUgc3RhbXA6ICUiIFBSSWQ2NCwgX19GVU5DVElPTl9fLCAqaXQsIGltZ0J1ZmZlci50aW1lc3RhbXApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChtUGVuZGluZ0lucHV0RnJhbWVzLmZpbmQoaW1nQnVmZmVyLnRpbWVzdGFtcCkgIT0gbVBlbmRpbmdJbnB1dEZyYW1lcy5lbmQoKSkgJiYKKyAgICAgICAgICAgICAgICAobVBlbmRpbmdJbnB1dEZyYW1lc1tpbWdCdWZmZXIudGltZXN0YW1wXS5lcnJvcikpIHsKKyAgICAgICAgICAgIG1EZXB0aENvbnN1bWVyLT51bmxvY2tCdWZmZXIoaW1nQnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaW1nQnVmZmVyLnRpbWVzdGFtcF0uZGVwdGhCdWZmZXIgPSBpbWdCdWZmZXI7CisgICAgICAgICAgICBtRGVwdGhCdWZmZXJBY3F1aXJlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbUlucHV0RGVwdGhCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW1DYXB0dXJlUmVzdWx0cy5lbXB0eSgpKSB7CisgICAgICAgIGF1dG8gaXQgPSBtQ2FwdHVyZVJlc3VsdHMuYmVnaW4oKTsKKyAgICAgICAgLy8gTmVnYXRpdmUgdGltZXN0YW1wIGluZGljYXRlcyB0aGF0IHNvbWV0aGluZyB3ZW50IHdyb25nIGR1cmluZyB0aGUgY2FwdHVyZSByZXN1bHQKKyAgICAgICAgLy8gY29sbGVjdGlvbiBwcm9jZXNzLgorICAgICAgICBpZiAoaXQtPmZpcnN0ID49IDApIHsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaXQtPmZpcnN0XS5mcmFtZU51bWJlciA9IHN0ZDo6Z2V0PDA+KGl0LT5zZWNvbmQpOworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpdC0+Zmlyc3RdLnJlc3VsdCA9IHN0ZDo6Z2V0PDE+KGl0LT5zZWNvbmQpOworICAgICAgICB9CisgICAgICAgIG1DYXB0dXJlUmVzdWx0cy5lcmFzZShpdCk7CisgICAgfQorCisgICAgd2hpbGUgKCFtRnJhbWVOdW1iZXJNYXAuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGl0ID0gbUZyYW1lTnVtYmVyTWFwLmJlZ2luKCk7CisgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaXQtPnNlY29uZF0uZnJhbWVOdW1iZXIgPSBpdC0+Zmlyc3Q7CisgICAgICAgIG1GcmFtZU51bWJlck1hcC5lcmFzZShpdCk7CisgICAgfQorCisgICAgYXV0byBpdCA9IG1FcnJvckZyYW1lTnVtYmVycy5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtRXJyb3JGcmFtZU51bWJlcnMuZW5kKCkpIHsKKyAgICAgICAgYm9vbCBmcmFtZUZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAoYXV0byAmaW5wdXRGcmFtZSA6IG1QZW5kaW5nSW5wdXRGcmFtZXMpIHsKKyAgICAgICAgICAgIGlmIChpbnB1dEZyYW1lLnNlY29uZC5mcmFtZU51bWJlciA9PSAqaXQpIHsKKyAgICAgICAgICAgICAgICBpbnB1dEZyYW1lLnNlY29uZC5lcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgZnJhbWVGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZnJhbWVGb3VuZCkgeworICAgICAgICAgICAgaXQgPSBtRXJyb3JGcmFtZU51bWJlcnMuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzOiBOb3QgYWJsZSB0byBmaW5kIGZhaWxpbmcgaW5wdXQgd2l0aCBmcmFtZSBudW1iZXI6ICUiIFBSSWQ2NCwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAqaXQpOworICAgICAgICAgICAgaXQrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6Z2V0TmV4dFJlYWR5SW5wdXRMb2NrZWQoaW50NjRfdCAqY3VycmVudFRzIC8qaW5vdXQqLykgeworICAgIGlmIChjdXJyZW50VHMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBuZXdJbnB1dEF2YWlsYWJsZSA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBtUGVuZGluZ0lucHV0RnJhbWVzKSB7CisgICAgICAgIGlmICgoIWl0LnNlY29uZC5lcnJvcikgJiYgKGl0LnNlY29uZC5kZXB0aEJ1ZmZlci5kYXRhICE9IG51bGxwdHIpICYmCisgICAgICAgICAgICAgICAgKGl0LnNlY29uZC5qcGVnQnVmZmVyLmRhdGEgIT0gbnVsbHB0cikgJiYgKGl0LmZpcnN0IDwgKmN1cnJlbnRUcykpIHsKKyAgICAgICAgICAgICpjdXJyZW50VHMgPSBpdC5maXJzdDsKKyAgICAgICAgICAgIG5ld0lucHV0QXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuZXdJbnB1dEF2YWlsYWJsZTsKK30KKworaW50NjRfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6Z2V0TmV4dEZhaWxpbmdJbnB1dExvY2tlZChpbnQ2NF90ICpjdXJyZW50VHMgLyppbm91dCovKSB7CisgICAgaW50NjRfdCByZXQgPSAtMTsKKyAgICBpZiAoY3VycmVudFRzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbVBlbmRpbmdJbnB1dEZyYW1lcykgeworICAgICAgICBpZiAoaXQuc2Vjb25kLmVycm9yICYmICFpdC5zZWNvbmQuZXJyb3JOb3RpZmllZCAmJiAoaXQuZmlyc3QgPCAqY3VycmVudFRzKSkgeworICAgICAgICAgICAgKmN1cnJlbnRUcyA9IGl0LmZpcnN0OworICAgICAgICAgICAgcmV0ID0gaXQuc2Vjb25kLmZyYW1lTnVtYmVyOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgRGVwdGhDb21wb3NpdGVTdHJlYW06OnByb2Nlc3NJbnB1dEZyYW1lKGNvbnN0IElucHV0RnJhbWUgJmlucHV0RnJhbWUpIHsKKyAgICBzdGF0dXNfdCByZXM7CisgICAgc3A8QU5hdGl2ZVdpbmRvdz4gb3V0cHV0QU5XID0gbU91dHB1dFN1cmZhY2U7CisgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYW5iOworICAgIGludCBmZW5jZUZkOworICAgIHZvaWQgKmRzdEJ1ZmZlcjsKKworICAgIGF1dG8ganBlZ1NpemUgPSBhbmRyb2lkOjpjYW1lcmEyOjpKcGVnUHJvY2Vzc29yOjpmaW5kSnBlZ1NpemUoaW5wdXRGcmFtZS5qcGVnQnVmZmVyLmRhdGEsCisgICAgICAgICAgICBpbnB1dEZyYW1lLmpwZWdCdWZmZXIud2lkdGgpOworICAgIGlmIChqcGVnU2l6ZSA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogRmFpbGVkIHRvIGZpbmQgaW5wdXQganBlZyBzaXplLCBkZWZhdWx0IHRvIHVzaW5nIGVudGlyZSBidWZmZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAganBlZ1NpemUgPSBpbnB1dEZyYW1lLmpwZWdCdWZmZXIud2lkdGg7CisgICAgfQorCisgICAgc2l6ZV90IG1heERlcHRoSnBlZ1NpemU7CisgICAgaWYgKG1NYXhKcGVnU2l6ZSA+IDApIHsKKyAgICAgICAgbWF4RGVwdGhKcGVnU2l6ZSA9IG1NYXhKcGVnU2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtYXhEZXB0aEpwZWdTaXplID0gc3RkOjptYXg8c2l6ZV90PiAoanBlZ1NpemUsCisgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5kZXB0aEJ1ZmZlci53aWR0aCAqIGlucHV0RnJhbWUuZGVwdGhCdWZmZXIuaGVpZ2h0ICogMyAvIDIpOworICAgIH0KKyAgICB1aW50OF90IGpwZWdRdWFsaXR5ID0gMTAwOworICAgIGF1dG8gZW50cnkgPSBpbnB1dEZyYW1lLnJlc3VsdC5maW5kKEFORFJPSURfSlBFR19RVUFMSVRZKTsKKyAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CisgICAgICAgIGpwZWdRdWFsaXR5ID0gZW50cnkuZGF0YS51OFswXTsKKyAgICB9CisKKyAgICAvLyBUaGUgZmluYWwgZGVwdGggcGhvdG8gd2lsbCBjb25zaXN0IG9mIHRoZSBtYWluIGpwZWcgYnVmZmVyLCB0aGUgZGVwdGggbWFwIGJ1ZmZlciAoYWxzbyBpbgorICAgIC8vIGpwZWcgZm9ybWF0KSBhbmQgY29uZmlkZW5jZSBtYXAgKGpwZWcgYXMgd2VsbCkuIEFzc3VtZSB3b3JzdCBjYXNlIHRoYXQgYWxsIDMganBlZyBuZWVkCisgICAgLy8gbWF4IGpwZWcgc2l6ZS4KKyAgICBzaXplX3QgZmluYWxKcGVnQnVmZmVyU2l6ZSA9IG1heERlcHRoSnBlZ1NpemUgKiAzOworCisgICAgaWYgKChyZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMobU91dHB1dFN1cmZhY2UuZ2V0KCksIGZpbmFsSnBlZ0J1ZmZlclNpemUsIDEpKQorICAgICAgICAgICAgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHN0cmVhbSBidWZmZXIgZGltZW5zaW9ucyIKKyAgICAgICAgICAgICAgICAiICV6dXgldSBmb3Igc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLCBmaW5hbEpwZWdCdWZmZXJTaXplLCAxVSwgbUJsb2JTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmVzID0gb3V0cHV0QU5XLT5kZXF1ZXVlQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCAmYW5iLCAmZmVuY2VGZCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHJldHJpZXZpbmcgb3V0cHV0IGJ1ZmZlcjogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksCisgICAgICAgICAgICAgICAgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBnYiA9IEdyYXBoaWNCdWZmZXI6OmZyb20oYW5iKTsKKyAgICByZXMgPSBnYi0+bG9ja0FzeW5jKEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sICZkc3RCdWZmZXIsIGZlbmNlRmQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB0cnlpbmcgdG8gbG9jayBvdXRwdXQgYnVmZmVyIGZlbmNlOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICBvdXRwdXRBTlctPmNhbmNlbEJ1ZmZlcihtT3V0cHV0U3VyZmFjZS5nZXQoKSwgYW5iLCAvKmZlbmNlKi8gLTEpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICgoZ2ItPmdldFdpZHRoKCkgPCBmaW5hbEpwZWdCdWZmZXJTaXplKSB8fCAoZ2ItPmdldEhlaWdodCgpICE9IDEpKSB7CisgICAgICAgIEFMT0dFKCIlczogQmxvYiBidWZmZXIgc2l6ZSBtaXNtYXRjaCwgZXhwZWN0ZWQgJWR4JWQgcmVjZWl2ZWQgJXp1eCV1IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGdiLT5nZXRXaWR0aCgpLCBnYi0+Z2V0SGVpZ2h0KCksIGZpbmFsSnBlZ0J1ZmZlclNpemUsIDFVKTsKKyAgICAgICAgb3V0cHV0QU5XLT5jYW5jZWxCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksIGFuYiwgLypmZW5jZSovIC0xKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBEZXB0aFBob3RvSW5wdXRGcmFtZSBkZXB0aFBob3RvOworICAgIGRlcHRoUGhvdG8ubU1haW5KcGVnQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4gKGlucHV0RnJhbWUuanBlZ0J1ZmZlci5kYXRhKTsKKyAgICBkZXB0aFBob3RvLm1NYWluSnBlZ1dpZHRoID0gbUJsb2JXaWR0aDsKKyAgICBkZXB0aFBob3RvLm1NYWluSnBlZ0hlaWdodCA9IG1CbG9iSGVpZ2h0OworICAgIGRlcHRoUGhvdG8ubU1haW5KcGVnU2l6ZSA9IGpwZWdTaXplOworICAgIGRlcHRoUGhvdG8ubURlcHRoTWFwQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCo+IChpbnB1dEZyYW1lLmRlcHRoQnVmZmVyLmRhdGEpOworICAgIGRlcHRoUGhvdG8ubURlcHRoTWFwV2lkdGggPSBpbnB1dEZyYW1lLmRlcHRoQnVmZmVyLndpZHRoOworICAgIGRlcHRoUGhvdG8ubURlcHRoTWFwSGVpZ2h0ID0gaW5wdXRGcmFtZS5kZXB0aEJ1ZmZlci5oZWlnaHQ7CisgICAgZGVwdGhQaG90by5tRGVwdGhNYXBTdHJpZGUgPSBpbnB1dEZyYW1lLmRlcHRoQnVmZmVyLnN0cmlkZTsKKyAgICBkZXB0aFBob3RvLm1KcGVnUXVhbGl0eSA9IGpwZWdRdWFsaXR5OworICAgIGRlcHRoUGhvdG8ubUlzTG9naWNhbCA9IG1Jc0xvZ2ljYWxDYW1lcmE7CisgICAgZGVwdGhQaG90by5tTWF4SnBlZ1NpemUgPSBtYXhEZXB0aEpwZWdTaXplOworICAgIC8vIFRoZSBjYW1lcmEgaW50cmluc2ljIGNhbGlicmF0aW9uIGxheW91dCBpcyBhcyBmb2xsb3dzOgorICAgIC8vIFtmb2NhbExlbmd0aFgsIGZvY2FsTGVuZ3RoWSwgb3B0aWNhbENlbnRlclgsIG9wdGljYWxDZW50ZXJZLCBza2V3XQorICAgIGlmIChtSW5zdHJpbnNpY0NhbGlicmF0aW9uLnNpemUoKSA9PSA1KSB7CisgICAgICAgIG1lbWNweShkZXB0aFBob3RvLm1JbnN0cmluc2ljQ2FsaWJyYXRpb24sIG1JbnN0cmluc2ljQ2FsaWJyYXRpb24uZGF0YSgpLAorICAgICAgICAgICAgICAgIHNpemVvZihkZXB0aFBob3RvLm1JbnN0cmluc2ljQ2FsaWJyYXRpb24pKTsKKyAgICAgICAgZGVwdGhQaG90by5tSXNJbnN0cmluc2ljQ2FsaWJyYXRpb25WYWxpZCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVwdGhQaG90by5tSXNJbnN0cmluc2ljQ2FsaWJyYXRpb25WYWxpZCA9IDA7CisgICAgfQorICAgIC8vIFRoZSBjYW1lcmEgbGVucyBkaXN0b3J0aW9uIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbGVucyBjb3JyZWN0aW9uIGNvZWZmaWNpZW50cy4KKyAgICAvLyBba2FwcGFfMSwga2FwcGFfMiwga2FwcGFfMyBrYXBwYV80LCBrYXBwYV81XQorICAgIGlmIChtTGVuc0Rpc3RvcnRpb24uc2l6ZSgpID09IDUpIHsKKyAgICAgICAgbWVtY3B5KGRlcHRoUGhvdG8ubUxlbnNEaXN0b3J0aW9uLCBtTGVuc0Rpc3RvcnRpb24uZGF0YSgpLAorICAgICAgICAgICAgICAgIHNpemVvZihkZXB0aFBob3RvLm1MZW5zRGlzdG9ydGlvbikpOworICAgICAgICBkZXB0aFBob3RvLm1Jc0xlbnNEaXN0b3J0aW9uVmFsaWQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlcHRoUGhvdG8ubUlzTGVuc0Rpc3RvcnRpb25WYWxpZCA9IDA7CisgICAgfQorICAgIGVudHJ5ID0gaW5wdXRGcmFtZS5yZXN1bHQuZmluZChBTkRST0lEX0pQRUdfT1JJRU5UQVRJT04pOworICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgLy8gVGhlIGNhbWVyYSBqcGVnIG9yaWVudGF0aW9uIHZhbHVlcyBtdXN0IGJlIHdpdGhpbiBbMCwgOTAsIDE4MCwgMjcwXS4KKyAgICAgICAgc3dpdGNoIChlbnRyeS5kYXRhLmkzMlswXSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgY2FzZSA5MDoKKyAgICAgICAgICAgIGNhc2UgMTgwOgorICAgICAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICAgICAgZGVwdGhQaG90by5tT3JpZW50YXRpb24gPSBzdGF0aWNfY2FzdDxEZXB0aFBob3RvT3JpZW50YXRpb24+IChlbnRyeS5kYXRhLmkzMlswXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBqcGVnIG9yaWVudGF0aW9uIHZhbHVlOiAlZCwgZGVmYXVsdCB0byAwIGRlZ3JlZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBlbnRyeS5kYXRhLmkzMlswXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzaXplX3QgYWN0dWFsSnBlZ1NpemUgPSAwOworICAgIHJlcyA9IG1EZXB0aFBob3RvUHJvY2VzcyhkZXB0aFBob3RvLCBmaW5hbEpwZWdCdWZmZXJTaXplLCBkc3RCdWZmZXIsICZhY3R1YWxKcGVnU2l6ZSk7CisgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRGVwdGggcGhvdG8gcHJvY2Vzc2luZyBmYWlsZWQ6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICBvdXRwdXRBTlctPmNhbmNlbEJ1ZmZlcihtT3V0cHV0U3VyZmFjZS5nZXQoKSwgYW5iLCAvKmZlbmNlKi8gLTEpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHNpemVfdCBmaW5hbEpwZWdTaXplID0gYWN0dWFsSnBlZ1NpemUgKyBzaXplb2Yoc3RydWN0IGNhbWVyYTNfanBlZ19ibG9iKTsKKyAgICBpZiAoZmluYWxKcGVnU2l6ZSA+IGZpbmFsSnBlZ0J1ZmZlclNpemUpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGaW5hbCBqcGVnIGJ1ZmZlciBub3QgbGFyZ2UgZW5vdWdoIGZvciB0aGUganBlZyBibG9iIGhlYWRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIG91dHB1dEFOVy0+Y2FuY2VsQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBhbmIsIC8qZmVuY2UqLyAtMSk7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBGaW5hbCBqcGVnIHNpemU6ICV6dSIsIF9fZnVuY19fLCBmaW5hbEpwZWdTaXplKTsKKyAgICB1aW50OF90KiBoZWFkZXIgPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+IChkc3RCdWZmZXIpICsKKyAgICAgICAgKGdiLT5nZXRXaWR0aCgpIC0gc2l6ZW9mKHN0cnVjdCBjYW1lcmEzX2pwZWdfYmxvYikpOworICAgIHN0cnVjdCBjYW1lcmEzX2pwZWdfYmxvYiAqYmxvYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IGNhbWVyYTNfanBlZ19ibG9iKj4gKGhlYWRlcik7CisgICAgYmxvYi0+anBlZ19ibG9iX2lkID0gQ0FNRVJBM19KUEVHX0JMT0JfSUQ7CisgICAgYmxvYi0+anBlZ19zaXplID0gYWN0dWFsSnBlZ1NpemU7CisgICAgb3V0cHV0QU5XLT5xdWV1ZUJ1ZmZlcihtT3V0cHV0U3VyZmFjZS5nZXQoKSwgYW5iLCAvKmZlbmNlKi8gLTEpOworCisgICAgcmV0dXJuIHJlczsKK30KKwordm9pZCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6cmVsZWFzZUlucHV0RnJhbWVMb2NrZWQoSW5wdXRGcmFtZSAqaW5wdXRGcmFtZSAvKm91dCovKSB7CisgICAgaWYgKGlucHV0RnJhbWUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGlucHV0RnJhbWUtPmRlcHRoQnVmZmVyLmRhdGEgIT0gbnVsbHB0cikgeworICAgICAgICBtRGVwdGhDb25zdW1lci0+dW5sb2NrQnVmZmVyKGlucHV0RnJhbWUtPmRlcHRoQnVmZmVyKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+ZGVwdGhCdWZmZXIuZGF0YSA9IG51bGxwdHI7CisgICAgICAgIG1EZXB0aEJ1ZmZlckFjcXVpcmVkID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGlucHV0RnJhbWUtPmpwZWdCdWZmZXIuZGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgIG1CbG9iQ29uc3VtZXItPnVubG9ja0J1ZmZlcihpbnB1dEZyYW1lLT5qcGVnQnVmZmVyKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+anBlZ0J1ZmZlci5kYXRhID0gbnVsbHB0cjsKKyAgICAgICAgbUJsb2JCdWZmZXJBY3F1aXJlZCA9IGZhbHNlOworICAgIH0KKworICAgIGlmICgoaW5wdXRGcmFtZS0+ZXJyb3IgfHwgbUVycm9yU3RhdGUpICYmICFpbnB1dEZyYW1lLT5lcnJvck5vdGlmaWVkKSB7CisgICAgICAgIG5vdGlmeUVycm9yKGlucHV0RnJhbWUtPmZyYW1lTnVtYmVyKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+ZXJyb3JOb3RpZmllZCA9IHRydWU7CisgICAgfQorfQorCit2b2lkIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpyZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoaW50NjRfdCBjdXJyZW50VHMpIHsKKyAgICBhdXRvIGl0ID0gbVBlbmRpbmdJbnB1dEZyYW1lcy5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVuZCgpKSB7CisgICAgICAgIGlmIChpdC0+Zmlyc3QgPD0gY3VycmVudFRzKSB7CisgICAgICAgICAgICByZWxlYXNlSW5wdXRGcmFtZUxvY2tlZCgmaXQtPnNlY29uZCk7CisgICAgICAgICAgICBpdCA9IG1QZW5kaW5nSW5wdXRGcmFtZXMuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXQrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6dGhyZWFkTG9vcCgpIHsKKyAgICBpbnQ2NF90IGN1cnJlbnRUcyA9IElOVDY0X01BWDsKKyAgICBib29sIG5ld0lucHV0QXZhaWxhYmxlID0gZmFsc2U7CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisKKyAgICAgICAgaWYgKG1FcnJvclN0YXRlKSB7CisgICAgICAgICAgICAvLyBJbiBjYXNlIHdlIGxhbmRlZCBpbiBlcnJvciBzdGF0ZSwgcmV0dXJuIGFueSBwZW5kaW5nIGJ1ZmZlcnMgYW5kCisgICAgICAgICAgICAvLyBoYWx0IGFsbCBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgICAgICAgICAgICBjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCk7CisgICAgICAgICAgICByZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoY3VycmVudFRzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICghbmV3SW5wdXRBdmFpbGFibGUpIHsKKyAgICAgICAgICAgIGNvbXBpbGVQZW5kaW5nSW5wdXRMb2NrZWQoKTsKKyAgICAgICAgICAgIG5ld0lucHV0QXZhaWxhYmxlID0gZ2V0TmV4dFJlYWR5SW5wdXRMb2NrZWQoJmN1cnJlbnRUcyk7CisgICAgICAgICAgICBpZiAoIW5ld0lucHV0QXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgYXV0byBmYWlsaW5nRnJhbWVOdW1iZXIgPSBnZXROZXh0RmFpbGluZ0lucHV0TG9ja2VkKCZjdXJyZW50VHMpOworICAgICAgICAgICAgICAgIGlmIChmYWlsaW5nRnJhbWVOdW1iZXIgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW5ub3QgZXJhc2UgJ21QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXScgYXQgdGhpcyBwb2ludCBiZWNhdXNlIGl0IGlzCisgICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlIGZvciB0d28gaW50ZXJuYWwgc3RyZWFtIGJ1ZmZlcnMgdG8gZmFpbC4gSW4gc3VjaCBzY2VuYXJpbyB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gY29tcG9zaXRlIHN0cmVhbSBzaG91bGQgbm90aWZ5IHRoZSBjbGllbnQgYWJvdXQgYSBzdHJlYW0gYnVmZmVyIGVycm9yIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgLy8gb25jZSBhbmQgdGhpcyBpbmZvcm1hdGlvbiBpcyBrZXB0IHdpdGhpbiAnZXJyb3JOb3RpZmllZCcuCisgICAgICAgICAgICAgICAgICAgIC8vIEFueSBwcmVzZW50IGZhaWxlZCBpbnB1dCBmcmFtZXMgd2lsbCBiZSByZW1vdmVkIG9uIGEgc3Vic2VxdWVudCBjYWxsIHRvCisgICAgICAgICAgICAgICAgICAgIC8vICdyZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoKScuCisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VJbnB1dEZyYW1lTG9ja2VkKCZtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10pOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHMgPSBJTlQ2NF9NQVg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXV0byByZXQgPSBtSW5wdXRSZWFkeUNvbmRpdGlvbi53YWl0UmVsYXRpdmUobU11dGV4LCBrV2FpdER1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRpbWVkIHdhaXQgb24gY29uZGl0aW9uIGZhaWxlZDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGF1dG8gcmVzID0gcHJvY2Vzc0lucHV0RnJhbWUobVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgcHJvY2Vzc2luZyBmcmFtZSB3aXRoIHRpbWVzdGFtcDogJSIgUFJJdTY0ICI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY3VycmVudFRzLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdLmVycm9yID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoY3VycmVudFRzKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIERlcHRoQ29tcG9zaXRlU3RyZWFtOjppc0RlcHRoQ29tcG9zaXRlU3RyZWFtKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgQU5hdGl2ZVdpbmRvdyAqYW53ID0gc3VyZmFjZS5nZXQoKTsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaW50IGZvcm1hdDsKKyAgICBpZiAoKGVyciA9IGFudy0+cXVlcnkoYW53LCBOQVRJVkVfV0lORE9XX0ZPUk1BVCwgJmZvcm1hdCkpICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJGYWlsZWQgdG8gcXVlcnkgU3VyZmFjZSBmb3JtYXQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwKKyAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50IGRhdGFzcGFjZTsKKyAgICBpZiAoKGVyciA9IGFudy0+cXVlcnkoYW53LCBOQVRJVkVfV0lORE9XX0RFRkFVTFRfREFUQVNQQUNFLCAmZGF0YXNwYWNlKSkgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkZhaWxlZCB0byBxdWVyeSBTdXJmYWNlIGRhdGFzcGFjZTogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLAorICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpICYmIChkYXRhc3BhY2UgPT0gSEFMX0RBVEFTUEFDRV9EWU5BTUlDX0RFUFRIKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IERlcHRoQ29tcG9zaXRlU3RyZWFtOjpjcmVhdGVJbnRlcm5hbFN0cmVhbXMoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCisgICAgICAgIGJvb2wgLypoYXNEZWZlcnJlZENvbnN1bWVyKi8sIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsIGludCAvKnN0cmVhbVNldElkKi8sIGJvb2wgLyppc1NoYXJlZCovKSB7CisgICAgaWYgKG1TdXBwb3J0ZWREZXB0aFNpemVzLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUaGlzIGNhbWVyYSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IGFueSBkZXB0aCBtYXAgc3RyZWFtcyEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc2l6ZV90IGRlcHRoV2lkdGgsIGRlcHRoSGVpZ2h0OworICAgIGF1dG8gcmV0ID0gZ2V0TWF0Y2hpbmdEZXB0aFNpemUod2lkdGgsIGhlaWdodCwgbVN1cHBvcnRlZERlcHRoU2l6ZXMsICZkZXB0aFdpZHRoLCAmZGVwdGhIZWlnaHQpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZmluZCBhbiBhcHByb3ByaWF0ZSBkZXB0aCBzdHJlYW0gc2l6ZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmICghZGV2aWNlLmdldCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgZGV2aWNlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOworICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgbUJsb2JDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihjb25zdW1lciwgLyptYXhMb2NrZWRCdWZmZXJzKi8xLCAvKmNvbnRyb2xsZWRCeUFwcCovIHRydWUpOworICAgIG1CbG9iQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CisgICAgbUJsb2JDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEzLUpwZWdDb21wb3NpdGVTdHJlYW0iKSk7CisgICAgbUJsb2JTdXJmYWNlID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOworCisgICAgcmV0ID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obUJsb2JTdXJmYWNlLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGtKcGVnRGF0YVNwYWNlLCByb3RhdGlvbiwKKyAgICAgICAgICAgIGlkLCBwaHlzaWNhbENhbWVyYUlkLCBzdXJmYWNlSWRzKTsKKyAgICBpZiAocmV0ID09IE9LKSB7CisgICAgICAgIG1CbG9iU3RyZWFtSWQgPSAqaWQ7CisgICAgICAgIG1CbG9iU3VyZmFjZUlkID0gKCpzdXJmYWNlSWRzKVswXTsKKyAgICAgICAgbU91dHB1dFN1cmZhY2UgPSBjb25zdW1lcnNbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgIG1EZXB0aENvbnN1bWVyID0gbmV3IENwdUNvbnN1bWVyKGNvbnN1bWVyLCAvKm1heExvY2tlZEJ1ZmZlcnMqLyAxLCAvKmNvbnRyb2xsZWRCeUFwcCovIHRydWUpOworICAgIG1EZXB0aENvbnN1bWVyLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKHRoaXMpOworICAgIG1EZXB0aENvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTMtRGVwdGhDb21wb3NpdGVTdHJlYW0iKSk7CisgICAgbURlcHRoU3VyZmFjZSA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IGRlcHRoU3VyZmFjZUlkOworICAgIHJldCA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1EZXB0aFN1cmZhY2UsIGRlcHRoV2lkdGgsIGRlcHRoSGVpZ2h0LCBrRGVwdGhNYXBQaXhlbEZvcm1hdCwKKyAgICAgICAgICAgIGtEZXB0aE1hcERhdGFTcGFjZSwgcm90YXRpb24sICZtRGVwdGhTdHJlYW1JZCwgcGh5c2ljYWxDYW1lcmFJZCwgJmRlcHRoU3VyZmFjZUlkKTsKKyAgICBpZiAocmV0ID09IE9LKSB7CisgICAgICAgIG1EZXB0aFN1cmZhY2VJZCA9IGRlcHRoU3VyZmFjZUlkWzBdOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0ID0gcmVnaXN0ZXJDb21wb3NpdGVTdHJlYW1MaXN0ZW5lcihnZXRTdHJlYW1JZCgpKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIGJsb2Igc3RyZWFtIGxpc3RlbmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0ID0gcmVnaXN0ZXJDb21wb3NpdGVTdHJlYW1MaXN0ZW5lcihtRGVwdGhTdHJlYW1JZCk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWdpc3RlciBkZXB0aCBzdHJlYW0gbGlzdGVuZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBtQmxvYldpZHRoID0gd2lkdGg7CisgICAgbUJsb2JIZWlnaHQgPSBoZWlnaHQ7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6Y29uZmlndXJlU3RyZWFtKCkgeworICAgIGlmIChpc1J1bm5pbmcoKSkgeworICAgICAgICAvLyBQcm9jZXNzaW5nIHRocmVhZCBpcyBhbHJlYWR5IHJ1bm5pbmcsIG5vdGhpbmcgbW9yZSB0byBkby4KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGlmICgobURlcHRoUGhvdG9MaWJIYW5kbGUgPT0gbnVsbHB0cikgfHwgKG1EZXB0aFBob3RvUHJvY2VzcyA9PSBudWxscHRyKSkgeworICAgICAgICBBTE9HRSgiJXM6IERlcHRoIHBob3RvIGxpYnJhcnkgaXMgbm90IHByZXNlbnQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaWYgKG1PdXRwdXRTdXJmYWNlLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyB2YWxpZCBvdXRwdXQgc3VyZmFjZSBzZXQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgYXV0byByZXMgPSBtT3V0cHV0U3VyZmFjZS0+Y29ubmVjdChOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEsIG1Qcm9kdWNlckxpc3RlbmVyKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbm5lY3QgdG8gbmF0aXZlIHdpbmRvdyBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1CbG9iU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICgocmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQobU91dHB1dFN1cmZhY2UuZ2V0KCksIEhBTF9QSVhFTF9GT1JNQVRfQkxPQikpCisgICAgICAgICAgICAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBmb3JtYXQgZm9yIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBtQmxvYlN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpbnQgbWF4UHJvZHVjZXJCdWZmZXJzOworICAgIEFOYXRpdmVXaW5kb3cgKmFudyA9IG1CbG9iU3VyZmFjZS5nZXQoKTsKKyAgICBpZiAoKHJlcyA9IGFudy0+cXVlcnkoYW53LCBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsICZtYXhQcm9kdWNlckJ1ZmZlcnMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBxdWVyeSBjb25zdW1lciB1bmRlcXVldWVkIgorICAgICAgICAgICAgICAgICIgYnVmZmVyIGNvdW50IGZvciBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sIG1CbG9iU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIEFOYXRpdmVXaW5kb3cgKmFud0NvbnN1bWVyID0gbU91dHB1dFN1cmZhY2UuZ2V0KCk7CisgICAgaW50IG1heENvbnN1bWVyQnVmZmVyczsKKyAgICBpZiAoKHJlcyA9IGFud0NvbnN1bWVyLT5xdWVyeShhbndDb25zdW1lciwgTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLAorICAgICAgICAgICAgICAgICAgICAmbWF4Q29uc3VtZXJCdWZmZXJzKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gcXVlcnkgY29uc3VtZXIgdW5kZXF1ZXVlZCIKKyAgICAgICAgICAgICAgICAiIGJ1ZmZlciBjb3VudCBmb3Igc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLCBtQmxvYlN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAoKHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudCgKKyAgICAgICAgICAgICAgICAgICAgYW53Q29uc3VtZXIsIG1heFByb2R1Y2VyQnVmZmVycyArIG1heENvbnN1bWVyQnVmZmVycykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHNldCBidWZmZXIgY291bnQgZm9yIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywgbUJsb2JTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcnVuKCJEZXB0aENvbXBvc2l0ZVN0cmVhbVByb2MiKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgRGVwdGhDb21wb3NpdGVTdHJlYW06OmRlbGV0ZUludGVybmFsU3RyZWFtcygpIHsKKyAgICAvLyBUaGUgJ0NhbWVyYURldmljZUNsaWVudCcgcGFyZW50IHdpbGwgZGVsZXRlIHRoZSBibG9iIHN0cmVhbQorICAgIHJlcXVlc3RFeGl0KCk7CisKKyAgICBhdXRvIHJldCA9IGpvaW4oKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGpvaW4gd2l0aCB0aGUgbWFpbiBwcm9jZXNzaW5nIHRocmVhZDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICB9CisKKyAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoIWRldmljZS5nZXQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY2FtZXJhIGRldmljZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpZiAobURlcHRoU3RyZWFtSWQgPj0gMCkgeworICAgICAgICByZXQgPSBkZXZpY2UtPmRlbGV0ZVN0cmVhbShtRGVwdGhTdHJlYW1JZCk7CisgICAgICAgIG1EZXB0aFN0cmVhbUlkID0gLTE7CisgICAgfQorCisgICAgaWYgKG1PdXRwdXRTdXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU91dHB1dFN1cmZhY2UtPmRpc2Nvbm5lY3QoTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBKTsKKyAgICAgICAgbU91dHB1dFN1cmZhY2UuY2xlYXIoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIHsKKyAgICBpZiAoaXRlbS5tRGF0YVNwYWNlID09IGtKcGVnRGF0YVNwYWNlKSB7CisgICAgICAgIEFMT0dWKCIlczogSnBlZyBidWZmZXIgd2l0aCB0czogJSIgUFJJdTY0ICIgbXMuIGFycml2ZWQhIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbnMybXMoaXRlbS5tVGltZXN0YW1wKSk7CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICAgICAgaWYgKCFtRXJyb3JTdGF0ZSkgeworICAgICAgICAgICAgbUlucHV0SnBlZ0J1ZmZlcnMucHVzaF9iYWNrKGl0ZW0ubVRpbWVzdGFtcCk7CisgICAgICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXRlbS5tRGF0YVNwYWNlID09IGtEZXB0aE1hcERhdGFTcGFjZSkgeworICAgICAgICBBTE9HVigiJXM6IERlcHRoIGJ1ZmZlciB3aXRoIHRzOiAlIiBQUkl1NjQgIiBtcy4gYXJyaXZlZCEiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICBuczJtcyhpdGVtLm1UaW1lc3RhbXApKTsKKworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgICAgICBpZiAoIW1FcnJvclN0YXRlKSB7CisgICAgICAgICAgICBtSW5wdXREZXB0aEJ1ZmZlcnMucHVzaF9iYWNrKGl0ZW0ubVRpbWVzdGFtcCk7CisgICAgICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBkYXRhIHNwYWNlOiAweCV4IiwgX19GVU5DVElPTl9fLCBpdGVtLm1EYXRhU3BhY2UpOworICAgIH0KK30KKworc3RhdHVzX3QgRGVwdGhDb21wb3NpdGVTdHJlYW06Omluc2VydEdicChTdXJmYWNlTWFwKiAvKm91dCovb3V0U3VyZmFjZU1hcCwKKyAgICAgICAgVmVjdG9yPGludDMyX3Q+ICogLypvdXQqL291dHB1dFN0cmVhbUlkcywgaW50MzJfdCogLypvdXQqL2N1cnJlbnRTdHJlYW1JZCkgeworICAgIGlmIChvdXRTdXJmYWNlTWFwLT5maW5kKG1EZXB0aFN0cmVhbUlkKSA9PSBvdXRTdXJmYWNlTWFwLT5lbmQoKSkgeworICAgICAgICAoKm91dFN1cmZhY2VNYXApW21EZXB0aFN0cmVhbUlkXSA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtSWRzLT5wdXNoX2JhY2sobURlcHRoU3RyZWFtSWQpOworICAgIH0KKyAgICAoKm91dFN1cmZhY2VNYXApW21EZXB0aFN0cmVhbUlkXS5wdXNoX2JhY2sobURlcHRoU3VyZmFjZUlkKTsKKworICAgIGlmIChvdXRTdXJmYWNlTWFwLT5maW5kKG1CbG9iU3RyZWFtSWQpID09IG91dFN1cmZhY2VNYXAtPmVuZCgpKSB7CisgICAgICAgICgqb3V0U3VyZmFjZU1hcClbbUJsb2JTdHJlYW1JZF0gPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCk7CisgICAgICAgIG91dHB1dFN0cmVhbUlkcy0+cHVzaF9iYWNrKG1CbG9iU3RyZWFtSWQpOworICAgIH0KKyAgICAoKm91dFN1cmZhY2VNYXApW21CbG9iU3RyZWFtSWRdLnB1c2hfYmFjayhtQmxvYlN1cmZhY2VJZCk7CisKKyAgICBpZiAoY3VycmVudFN0cmVhbUlkICE9IG51bGxwdHIpIHsKKyAgICAgICAgKmN1cnJlbnRTdHJlYW1JZCA9IG1CbG9iU3RyZWFtSWQ7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpvblJlc3VsdEVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIC8vIFByb2Nlc3NpbmcgY2FuIGNvbnRpbnVlIGV2ZW4gaW4gY2FzZSBvZiByZXN1bHQgZXJyb3JzLgorICAgIC8vIEF0IHRoZSBtb21lbnQgZGVwdGggY29tcG9zaXRlIHN0cmVhbSBwcm9jZXNzaW5nIHJlbGllcyBtYWlubHkgb24gc3RhdGljIGNhbWVyYQorICAgIC8vIGNoYXJhY3RlcmlzdGljcyBkYXRhLiBUaGUgYWN0dWFsIHJlc3VsdCBkYXRhIGNhbiBiZSB1c2VkIGZvciB0aGUganBlZyBxdWFsaXR5IGJ1dAorICAgIC8vIGluIGNhc2UgaXQgaXMgYWJzZW50IHdlIGNhbiBkZWZhdWx0IHRvIG1heGltdW0uCisgICAgZXJhc2VSZXN1bHQocmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKK30KKworYm9vbCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6b25TdHJlYW1CdWZmZXJFcnJvcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIC8vIEJ1ZmZlciBlcnJvcnMgY29uY2VybmluZyBpbnRlcm5hbCBjb21wb3NpdGUgc3RyZWFtcyBzaG91bGQgbm90IGJlIGRpcmVjdGx5IHZpc2libGUgdG8KKyAgICAvLyBjYW1lcmEgY2xpZW50cy4gVGhleSBtdXN0IG9ubHkgcmVjZWl2ZSBhIHNpbmdsZSBidWZmZXIgZXJyb3Igd2l0aCB0aGUgcHVibGljIGNvbXBvc2l0ZQorICAgIC8vIHN0cmVhbSBpZC4KKyAgICBpZiAoKHJlc3VsdEV4dHJhcy5lcnJvclN0cmVhbUlkID09IG1EZXB0aFN0cmVhbUlkKSB8fAorICAgICAgICAgICAgKHJlc3VsdEV4dHJhcy5lcnJvclN0cmVhbUlkID09IG1CbG9iU3RyZWFtSWQpKSB7CisgICAgICAgIGZsYWdBbkVycm9yRnJhbWVOdW1iZXIocmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKKyAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6Z2V0TWF0Y2hpbmdEZXB0aFNpemUoc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4mIHN1cHBvcmVkRGVwdGhTaXplcywKKyAgICAgICAgc2l6ZV90ICpkZXB0aFdpZHRoIC8qb3V0Ki8sIHNpemVfdCAqZGVwdGhIZWlnaHQgLypvdXQqLykgeworICAgIGlmICgoZGVwdGhXaWR0aCA9PSBudWxscHRyKSB8fCAoZGVwdGhIZWlnaHQgPT0gbnVsbHB0cikpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBmbG9hdCBhclRvbCA9IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6a0RlcHRoQVJUb2xlcmFuY2U7CisgICAgKmRlcHRoV2lkdGggPSAqZGVwdGhIZWlnaHQgPSAwOworCisgICAgZmxvYXQgYXNwZWN0UmF0aW8gPSBzdGF0aWNfY2FzdDxmbG9hdD4gKHdpZHRoKSAvIHN0YXRpY19jYXN0PGZsb2F0PiAoaGVpZ2h0KTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogc3VwcG9yZWREZXB0aFNpemVzKSB7CisgICAgICAgIGF1dG8gY3VycmVudFdpZHRoID0gc3RkOjpnZXQ8MD4oaXQpOworICAgICAgICBhdXRvIGN1cnJlbnRIZWlnaHQgPSBzdGQ6OmdldDwxPihpdCk7CisgICAgICAgIGlmICgoY3VycmVudFdpZHRoID09IHdpZHRoKSAmJiAoY3VycmVudEhlaWdodCA9PSBoZWlnaHQpKSB7CisgICAgICAgICAgICAqZGVwdGhXaWR0aCA9IHdpZHRoOworICAgICAgICAgICAgKmRlcHRoSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmbG9hdCBjdXJyZW50UmF0aW8gPSBzdGF0aWNfY2FzdDxmbG9hdD4gKGN1cnJlbnRXaWR0aCkgLworICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4gKGN1cnJlbnRIZWlnaHQpOworICAgICAgICAgICAgYXV0byBjdXJyZW50U2l6ZSA9IGN1cnJlbnRXaWR0aCAqIGN1cnJlbnRIZWlnaHQ7CisgICAgICAgICAgICBhdXRvIG9sZFNpemUgPSAoKmRlcHRoV2lkdGgpICogKCpkZXB0aEhlaWdodCk7CisgICAgICAgICAgICBpZiAoKGZhYnMoYXNwZWN0UmF0aW8gLSBjdXJyZW50UmF0aW8pIDw9IGFyVG9sKSAmJiAoY3VycmVudFNpemUgPiBvbGRTaXplKSkgeworICAgICAgICAgICAgICAgICpkZXB0aFdpZHRoID0gY3VycmVudFdpZHRoOworICAgICAgICAgICAgICAgICpkZXB0aEhlaWdodCA9IGN1cnJlbnRIZWlnaHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKCgqZGVwdGhXaWR0aCA+IDApICYmICgqZGVwdGhIZWlnaHQgPiAwKSkgPyBPSyA6IEJBRF9WQUxVRTsKK30KKwordm9pZCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6Z2V0U3VwcG9ydGVkRGVwdGhTaXplcyhjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiogZGVwdGhTaXplcyAvKm91dCovKSB7CisgICAgaWYgKGRlcHRoU2l6ZXMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBlbnRyeSA9IGNoLmZpbmQoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKyAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CisgICAgICAgIC8vIERlcHRoIHN0cmVhbSBkaW1lbnNpb25zIGhhdmUgZm91ciBpbnQzMl90IGNvbXBvbmVudHMKKyAgICAgICAgLy8gKHBpeGVsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCB0eXBlKQorICAgICAgICBzaXplX3QgZW50cnlDb3VudCA9IGVudHJ5LmNvdW50IC8gNDsKKyAgICAgICAgZGVwdGhTaXplcy0+cmVzZXJ2ZShlbnRyeUNvdW50KTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgaSArPSA0KSB7CisgICAgICAgICAgICBpZiAoKGVudHJ5LmRhdGEuaTMyW2ldID09IGtEZXB0aE1hcFBpeGVsRm9ybWF0KSAmJgorICAgICAgICAgICAgICAgICAgICAoZW50cnkuZGF0YS5pMzJbaSszXSA9PQorICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQpKSB7CisgICAgICAgICAgICAgICAgZGVwdGhTaXplcy0+cHVzaF9iYWNrKHN0ZDo6bWFrZV90dXBsZShlbnRyeS5kYXRhLmkzMltpKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTMyW2krMl0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgRGVwdGhDb21wb3NpdGVTdHJlYW06OmdldENvbXBvc2l0ZVN0cmVhbUluZm8oY29uc3QgT3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4qIGNvbXBvc2l0ZU91dHB1dCAvKm91dCovKSB7CisgICAgaWYgKGNvbXBvc2l0ZU91dHB1dCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+IGRlcHRoU2l6ZXM7CisgICAgZ2V0U3VwcG9ydGVkRGVwdGhTaXplcyhjaCwgJmRlcHRoU2l6ZXMpOworICAgIGlmIChkZXB0aFNpemVzLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBkZXB0aCBzdHJlYW0gY29uZmlndXJhdGlvbnMgcHJlc2VudCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc2l6ZV90IGRlcHRoV2lkdGgsIGRlcHRoSGVpZ2h0OworICAgIGF1dG8gcmV0ID0gZ2V0TWF0Y2hpbmdEZXB0aFNpemUoc3RyZWFtSW5mby53aWR0aCwgc3RyZWFtSW5mby5oZWlnaHQsIGRlcHRoU2l6ZXMsICZkZXB0aFdpZHRoLAorICAgICAgICAgICAgJmRlcHRoSGVpZ2h0KTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gbWF0Y2hpbmcgZGVwdGggc3RyZWFtIHNpemUgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGNvbXBvc2l0ZU91dHB1dC0+Y2xlYXIoKTsKKyAgICBjb21wb3NpdGVPdXRwdXQtPmluc2VydChjb21wb3NpdGVPdXRwdXQtPmVuZCgpLCAyLCBzdHJlYW1JbmZvKTsKKworICAgIC8vIEpwZWcvQmxvYiBzdHJlYW0gaW5mbworICAgICgqY29tcG9zaXRlT3V0cHV0KVswXS5kYXRhU3BhY2UgPSBrSnBlZ0RhdGFTcGFjZTsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMF0uY29uc3VtZXJVc2FnZSA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTjsKKworICAgIC8vIERlcHRoIHN0cmVhbSBpbmZvCisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLndpZHRoID0gZGVwdGhXaWR0aDsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uaGVpZ2h0ID0gZGVwdGhIZWlnaHQ7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLmZvcm1hdCA9IGtEZXB0aE1hcFBpeGVsRm9ybWF0OworICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS5kYXRhU3BhY2UgPSBrRGVwdGhNYXBEYXRhU3BhY2U7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLmNvbnN1bWVyVXNhZ2UgPSBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU47CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK307IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZjMxZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmgKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBM19ERVBUSF9DT01QT1NJVEVfU1RSRUFNX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0RFUFRIX0NPTVBPU0lURV9TVFJFQU1fSAorCisjaW5jbHVkZSAiY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuaCIKKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL2ltYWdpbmdfbW9kZWwuaD4KKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL2RlcHRoX21hcC5oPgorCisjaW5jbHVkZSA8Z3VpL0NwdUNvbnN1bWVyLmg+CisKKyNpbmNsdWRlICJDb21wb3NpdGVTdHJlYW0uaCIKKwordXNpbmcgZHluYW1pY19kZXB0aDo6RGVwdGhNYXA7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpJdGVtOwordXNpbmcgZHluYW1pY19kZXB0aDo6SW1hZ2luZ01vZGVsOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIENhbWVyYURldmljZUNsaWVudDsKK2NsYXNzIENhbWVyYU1ldGFkYXRhOworY2xhc3MgU3VyZmFjZTsKKworbmFtZXNwYWNlIGNhbWVyYTMgeworCitjbGFzcyBEZXB0aENvbXBvc2l0ZVN0cmVhbSA6IHB1YmxpYyBDb21wb3NpdGVTdHJlYW0sIHB1YmxpYyBUaHJlYWQsCisgICAgICAgIHB1YmxpYyBDcHVDb25zdW1lcjo6RnJhbWVBdmFpbGFibGVMaXN0ZW5lciB7CisKK3B1YmxpYzoKKyAgICBEZXB0aENvbXBvc2l0ZVN0cmVhbSh3cDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UsCisgICAgICAgICAgICB3cDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gY2IpOworICAgIH5EZXB0aENvbXBvc2l0ZVN0cmVhbSgpIG92ZXJyaWRlOworCisgICAgc3RhdGljIGJvb2wgaXNEZXB0aENvbXBvc2l0ZVN0cmVhbShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CisKKyAgICAvLyBDb21wb3NpdGVTdHJlYW0gb3ZlcnJpZGVzCisgICAgc3RhdHVzX3QgY3JlYXRlSW50ZXJuYWxTdHJlYW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAorICAgICAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZGVsZXRlSW50ZXJuYWxTdHJlYW1zKCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtKCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgaW5zZXJ0R2JwKFN1cmZhY2VNYXAqIC8qb3V0Ki9vdXRTdXJmYWNlTWFwLCBWZWN0b3I8aW50MzJfdD4qIC8qb3V0Ki9vdXRwdXRTdHJlYW1JZHMsCisgICAgICAgICAgICBpbnQzMl90KiAvKm91dCovY3VycmVudFN0cmVhbUlkKSBvdmVycmlkZTsKKyAgICBpbnQgZ2V0U3RyZWFtSWQoKSBvdmVycmlkZSB7IHJldHVybiBtQmxvYlN0cmVhbUlkOyB9CisKKyAgICAvLyBDcHVDb25zdW1lciBsaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgorICAgIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKSBvdmVycmlkZTsKKworICAgIC8vIFJldHVybiBzdHJlYW0gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVybmFsIGNhbWVyYSBzdHJlYW1zCisgICAgc3RhdGljIHN0YXR1c190IGdldENvbXBvc2l0ZVN0cmVhbUluZm8oY29uc3QgT3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4qIGNvbXBvc2l0ZU91dHB1dCAvKm91dCovKTsKKworcHJvdGVjdGVkOgorCisgICAgYm9vbCB0aHJlYWRMb29wKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBvblN0cmVhbUJ1ZmZlckVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc3VsdEVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IElucHV0RnJhbWUgeworICAgICAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyIGRlcHRoQnVmZmVyOworICAgICAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyIGpwZWdCdWZmZXI7CisgICAgICAgIENhbWVyYU1ldGFkYXRhICAgICAgICAgICAgcmVzdWx0OworICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgIGVycm9yOworICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgIGVycm9yTm90aWZpZWQ7CisgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXI7CisKKyAgICAgICAgSW5wdXRGcmFtZSgpIDogZXJyb3IoZmFsc2UpLCBlcnJvck5vdGlmaWVkKGZhbHNlKSwgZnJhbWVOdW1iZXIoLTEpIHsgfQorICAgIH07CisKKyAgICAvLyBIZWxwZXIgbWV0aG9kcworICAgIHN0YXRpYyB2b2lkIGdldFN1cHBvcnRlZERlcHRoU2l6ZXMoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+KiBkZXB0aFNpemVzIC8qb3V0Ki8pOworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNYXRjaGluZ0RlcHRoU2l6ZShzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4mIHN1cHBvcmVkRGVwdGhTaXplcywKKyAgICAgICAgICAgIHNpemVfdCAqZGVwdGhXaWR0aCAvKm91dCovLCBzaXplX3QgKmRlcHRoSGVpZ2h0IC8qb3V0Ki8pOworCisgICAgLy8gRHluYW1pYyBkZXB0aCBwcm9jZXNzaW5nCisgICAgc3RhdHVzX3QgZW5jb2RlR3JheXNjYWxlSnBlZyhzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsIHVpbnQ4X3QgKmluLCB2b2lkICpvdXQsCisgICAgICAgICAgICBjb25zdCBzaXplX3QgbWF4T3V0U2l6ZSwgdWludDhfdCBqcGVnUXVhbGl0eSwgc2l6ZV90ICZhY3R1YWxTaXplKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RGVwdGhNYXA+IHByb2Nlc3NEZXB0aE1hcEZyYW1lKGNvbnN0IENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgJmRlcHRoTWFwQnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90IG1heEpwZWdTaXplLCB1aW50OF90IGpwZWdRdWFsaXR5LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEl0ZW0+PiogaXRlbXMgLypvdXQqLyk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltYWdpbmdNb2RlbD4gZ2V0SW1hZ2luZ01vZGVsKCk7CisgICAgc3RhdHVzX3QgcHJvY2Vzc0lucHV0RnJhbWUoY29uc3QgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSk7CisKKyAgICAvLyBCdWZmZXIvUmVzdWx0cyBoYW5kbGluZworICAgIHZvaWQgY29tcGlsZVBlbmRpbmdJbnB1dExvY2tlZCgpOworICAgIHZvaWQgcmVsZWFzZUlucHV0RnJhbWVMb2NrZWQoSW5wdXRGcmFtZSAqaW5wdXRGcmFtZSAvKm91dCovKTsKKyAgICB2b2lkIHJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZChpbnQ2NF90IGN1cnJlbnRUcyk7CisKKyAgICAvLyBGaW5kIGZpcnN0IGNvbXBsZXRlIGFuZCB2YWxpZCBmcmFtZSB3aXRoIHNtYWxsZXN0IHRpbWVzdGFtcAorICAgIGJvb2wgZ2V0TmV4dFJlYWR5SW5wdXRMb2NrZWQoaW50NjRfdCAqY3VycmVudFRzIC8qaW5vdXQqLyk7CisKKyAgICAvLyBGaW5kIG5leHQgZmFpbGluZyBmcmFtZSBudW1iZXIgd2l0aCBzbWFsbGVzdCB0aW1lc3RhbXAgYW5kIHJldHVybiByZXNwZWN0aXZlIGZyYW1lIG51bWJlcgorICAgIGludDY0X3QgZ2V0TmV4dEZhaWxpbmdJbnB1dExvY2tlZChpbnQ2NF90ICpjdXJyZW50VHMgLyppbm91dCovKTsKKworICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtXYWl0RHVyYXRpb24gPSAxMDAwMDAwMDsgLy8gMTAgbXMKKyAgICBzdGF0aWMgY29uc3QgYXV0byBrRGVwdGhNYXBQaXhlbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWTE2OworICAgIHN0YXRpYyBjb25zdCBhdXRvIGtEZXB0aE1hcERhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfREVQVEg7CisgICAgc3RhdGljIGNvbnN0IGF1dG8ga0pwZWdEYXRhU3BhY2UgPSBIQUxfREFUQVNQQUNFX1YwX0pGSUY7CisKKyAgICBpbnQgICAgICAgICAgICAgICAgICBtQmxvYlN0cmVhbUlkLCBtQmxvYlN1cmZhY2VJZCwgbURlcHRoU3RyZWFtSWQsIG1EZXB0aFN1cmZhY2VJZDsKKyAgICBzaXplX3QgICAgICAgICAgICAgICBtQmxvYldpZHRoLCBtQmxvYkhlaWdodDsKKyAgICBzcDxDcHVDb25zdW1lcj4gICAgICBtQmxvYkNvbnN1bWVyLCBtRGVwdGhDb25zdW1lcjsKKyAgICBib29sICAgICAgICAgICAgICAgICBtRGVwdGhCdWZmZXJBY3F1aXJlZCwgbUJsb2JCdWZmZXJBY3F1aXJlZDsKKyAgICBzcDxTdXJmYWNlPiAgICAgICAgICBtRGVwdGhTdXJmYWNlLCBtQmxvYlN1cmZhY2UsIG1PdXRwdXRTdXJmYWNlOworICAgIHNwPFByb2R1Y2VyTGlzdGVuZXI+IG1Qcm9kdWNlckxpc3RlbmVyOworCisgICAgc3NpemVfdCAgICAgICAgICAgICAgbU1heEpwZWdTaXplOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiBtU3VwcG9ydGVkRGVwdGhTaXplczsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gICBtSW5zdHJpbnNpY0NhbGlicmF0aW9uLCBtTGVuc0Rpc3RvcnRpb247CisgICAgYm9vbCAgICAgICAgICAgICAgICAgbUlzTG9naWNhbENhbWVyYTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICBtRGVwdGhQaG90b0xpYkhhbmRsZTsKKyAgICBwcm9jZXNzX2RlcHRoX3Bob3RvX2ZyYW1lIG1EZXB0aFBob3RvUHJvY2VzczsKKworICAgIC8vIEtlZXAgYWxsIGluY29taW5nIERlcHRoIGJ1ZmZlciB0aW1lc3RhbXBzIHBlbmRpbmcgZnVydGhlciBwcm9jZXNzaW5nLgorICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IG1JbnB1dERlcHRoQnVmZmVyczsKKworICAgIC8vIEtlZXAgYWxsIGluY29taW5nIEpwZWcvQmxvYiBidWZmZXIgdGltZXN0YW1wcyBwZW5kaW5nIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBtSW5wdXRKcGVnQnVmZmVyczsKKworICAgIC8vIE1hcCBvZiBhbGwgaW5wdXQgZnJhbWVzIHBlbmRpbmcgZnVydGhlciBwcm9jZXNzaW5nLgorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQ2NF90LCBJbnB1dEZyYW1lPiBtUGVuZGluZ0lucHV0RnJhbWVzOworfTsKKworfTsgLy9uYW1lc3BhY2UgY2FtZXJhMworfTsgLy9uYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZDBlOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uY3BwCkBAIC0wLDAgKzEsMTcwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhMy1IZWljQ29tcG9zaXRlU3RyZWFtIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxsaW51eC9tZW1mZC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS90eXBlcy5oPgorI2luY2x1ZGUgPGxpYnl1di5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorCisjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKKyNpbmNsdWRlICJ1dGlscy9FeGlmVXRpbHMuaCIKKyNpbmNsdWRlICJIZWljRW5jb2RlckluZm9NYW5hZ2VyLmgiCisjaW5jbHVkZSAiSGVpY0NvbXBvc2l0ZVN0cmVhbS5oIgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkNhbWVyYUJsb2I7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkNhbWVyYUJsb2JJZDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCitIZWljQ29tcG9zaXRlU3RyZWFtOjpIZWljQ29tcG9zaXRlU3RyZWFtKHdwPENhbWVyYURldmljZUJhc2U+IGRldmljZSwKKyAgICAgICAgd3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNiKSA6CisgICAgICAgIENvbXBvc2l0ZVN0cmVhbShkZXZpY2UsIGNiKSwKKyAgICAgICAgbVVzZUhlaWMoZmFsc2UpLAorICAgICAgICBtTnVtT3V0cHV0VGlsZXMoMSksCisgICAgICAgIG1PdXRwdXRXaWR0aCgwKSwKKyAgICAgICAgbU91dHB1dEhlaWdodCgwKSwKKyAgICAgICAgbU1heEhlaWNCdWZmZXJTaXplKDApLAorICAgICAgICBtR3JpZFdpZHRoKEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmtHcmlkV2lkdGgpLAorICAgICAgICBtR3JpZEhlaWdodChIZWljRW5jb2RlckluZm9NYW5hZ2VyOjprR3JpZEhlaWdodCksCisgICAgICAgIG1HcmlkUm93cygxKSwKKyAgICAgICAgbUdyaWRDb2xzKDEpLAorICAgICAgICBtVXNlR3JpZChmYWxzZSksCisgICAgICAgIG1BcHBTZWdtZW50U3RyZWFtSWQoLTEpLAorICAgICAgICBtQXBwU2VnbWVudFN1cmZhY2VJZCgtMSksCisgICAgICAgIG1BcHBTZWdtZW50QnVmZmVyQWNxdWlyZWQoZmFsc2UpLAorICAgICAgICBtTWFpbkltYWdlU3RyZWFtSWQoLTEpLAorICAgICAgICBtTWFpbkltYWdlU3VyZmFjZUlkKC0xKSwKKyAgICAgICAgbVl1dkJ1ZmZlckFjcXVpcmVkKGZhbHNlKSwKKyAgICAgICAgbVByb2R1Y2VyTGlzdGVuZXIobmV3IFByb2R1Y2VyTGlzdGVuZXIoKSksCisgICAgICAgIG1PdXRwdXRCdWZmZXJDb3VudGVyKDApLAorICAgICAgICBtR3JpZFRpbWVzdGFtcFVzKDApIHsKK30KKworSGVpY0NvbXBvc2l0ZVN0cmVhbTo6fkhlaWNDb21wb3NpdGVTdHJlYW0oKSB7CisgICAgLy8gQ2FsbCBkZWluaXRDb2RlYyBpbiBjYXNlIHN0cmVhbSBoYXNuJ3QgYmVlbiBkZWxldGVkIHlldCB0byBhdm9pZCBhbnkKKyAgICAvLyBtZW1vcnkvcmVzb3VyY2UgbGVhay4KKyAgICBkZWluaXRDb2RlYygpOworCisgICAgbUlucHV0QXBwU2VnbWVudEJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBtQ29kZWNPdXRwdXRCdWZmZXJzLmNsZWFyKCk7CisKKyAgICBtQXBwU2VnbWVudFN0cmVhbUlkID0gLTE7CisgICAgbUFwcFNlZ21lbnRTdXJmYWNlSWQgPSAtMTsKKyAgICBtQXBwU2VnbWVudENvbnN1bWVyLmNsZWFyKCk7CisgICAgbUFwcFNlZ21lbnRTdXJmYWNlLmNsZWFyKCk7CisKKyAgICBtTWFpbkltYWdlU3RyZWFtSWQgPSAtMTsKKyAgICBtTWFpbkltYWdlU3VyZmFjZUlkID0gLTE7CisgICAgbU1haW5JbWFnZUNvbnN1bWVyLmNsZWFyKCk7CisgICAgbU1haW5JbWFnZVN1cmZhY2UuY2xlYXIoKTsKK30KKworYm9vbCBIZWljQ29tcG9zaXRlU3RyZWFtOjppc0hlaWNDb21wb3NpdGVTdHJlYW0oY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBBTmF0aXZlV2luZG93ICphbncgPSBzdXJmYWNlLmdldCgpOworICAgIHN0YXR1c190IGVycjsKKyAgICBpbnQgZm9ybWF0OworICAgIGlmICgoZXJyID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfRk9STUFULCAmZm9ybWF0KSkgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkZhaWxlZCB0byBxdWVyeSBTdXJmYWNlIGZvcm1hdDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLAorICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQgZGF0YXNwYWNlOworICAgIGlmICgoZXJyID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfREVGQVVMVF9EQVRBU1BBQ0UsICZkYXRhc3BhY2UpKSAhPSBPSykgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgZGF0YXNwYWNlOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksCisgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiAoKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpICYmIChkYXRhc3BhY2UgPT0gSEFMX0RBVEFTUEFDRV9IRUlGKSk7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OmNyZWF0ZUludGVybmFsU3RyZWFtcyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKKyAgICAgICAgYm9vbCAvKmhhc0RlZmVycmVkQ29uc3VtZXIqLywgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IC8qc3RyZWFtU2V0SWQqLywgYm9vbCAvKmlzU2hhcmVkKi8pIHsKKworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmICghZGV2aWNlLmdldCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgZGV2aWNlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHN0YXR1c190IHJlcyA9IGluaXRpYWxpemVDb2RlYyh3aWR0aCwgaGVpZ2h0LCBkZXZpY2UpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBIRUlDL0hFVkMgY29kZWM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOworICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgbUFwcFNlZ21lbnRDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihjb25zdW1lciwgMSk7CisgICAgbUFwcFNlZ21lbnRDb25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcih0aGlzKTsKKyAgICBtQXBwU2VnbWVudENvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTMtSGVpY0NvbXBvc2l0ZS1BcHBTZWdtZW50U3RyZWFtIikpOworICAgIG1BcHBTZWdtZW50U3VyZmFjZSA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKKworICAgIG1TdGF0aWNJbmZvID0gZGV2aWNlLT5pbmZvKCk7CisKKyAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtQXBwU2VnbWVudFN1cmZhY2UsIG1BcHBTZWdtZW50TWF4U2l6ZSwgMSwgZm9ybWF0LAorICAgICAgICAgICAga0FwcFNlZ21lbnREYXRhU3BhY2UsIHJvdGF0aW9uLCAmbUFwcFNlZ21lbnRTdHJlYW1JZCwgcGh5c2ljYWxDYW1lcmFJZCwgc3VyZmFjZUlkcyk7CisgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICBtQXBwU2VnbWVudFN1cmZhY2VJZCA9ICgqc3VyZmFjZUlkcylbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIEpQRUcgQXBwIHNlZ21lbnQgc3RyZWFtOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICghbVVzZUdyaWQpIHsKKyAgICAgICAgcmVzID0gbUNvZGVjLT5jcmVhdGVJbnB1dFN1cmZhY2UoJnByb2R1Y2VyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIGlucHV0IHN1cmZhY2UgZm9yIEhlaWMgY29kZWM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgICAgIG1NYWluSW1hZ2VDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihjb25zdW1lciwgMSk7CisgICAgICAgIG1NYWluSW1hZ2VDb25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbU1haW5JbWFnZUNvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTMtSGVpY0NvbXBvc2l0ZS1IZXZjSW5wdXRZVVZTdHJlYW0iKSk7CisgICAgfQorICAgIG1NYWluSW1hZ2VTdXJmYWNlID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOworCisgICAgcmVzID0gbUNvZGVjLT5zdGFydCgpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gc3RhcnQgY29kZWM6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8aW50PiBzb3VyY2VTdXJmYWNlSWQ7CisgICAgLy9Vc2UgWVVWXzg4OCBmb3JtYXQgaWYgZnJhbWV3b3JrIHRpbGluZyBpcyBuZWVkZWQuCisgICAgaW50IHNyY1N0cmVhbUZtdCA9IG1Vc2VHcmlkID8gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4IDoKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKKyAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtTWFpbkltYWdlU3VyZmFjZSwgd2lkdGgsIGhlaWdodCwgc3JjU3RyZWFtRm10LCBrSGVpZkRhdGFTcGFjZSwKKyAgICAgICAgICAgIHJvdGF0aW9uLCBpZCwgcGh5c2ljYWxDYW1lcmFJZCwgJnNvdXJjZVN1cmZhY2VJZCk7CisgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICBtTWFpbkltYWdlU3VyZmFjZUlkID0gc291cmNlU3VyZmFjZUlkWzBdOworICAgICAgICBtTWFpbkltYWdlU3RyZWFtSWQgPSAqaWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIG1haW4gaW1hZ2Ugc3RyZWFtOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIG1PdXRwdXRTdXJmYWNlID0gY29uc3VtZXJzWzBdOworICAgIHJlcyA9IHJlZ2lzdGVyQ29tcG9zaXRlU3RyZWFtTGlzdGVuZXIoZ2V0U3RyZWFtSWQoKSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWdpc3RlciBIQUwgbWFpbiBpbWFnZSBzdHJlYW0iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGluaXRDb3B5Um93RnVuY3Rpb24od2lkdGgpOworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OmRlbGV0ZUludGVybmFsU3RyZWFtcygpIHsKKyAgICByZXF1ZXN0RXhpdCgpOworICAgIGF1dG8gcmVzID0gam9pbigpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gam9pbiB3aXRoIHRoZSBtYWluIHByb2Nlc3NpbmcgdGhyZWFkOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgIH0KKworICAgIGRlaW5pdENvZGVjKCk7CisKKyAgICBpZiAobUFwcFNlZ21lbnRTdHJlYW1JZCA+PSAwKSB7CisgICAgICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgICAgICBpZiAoIWRldmljZS5nZXQoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBkZXZpY2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisKKyAgICAgICAgcmVzID0gZGV2aWNlLT5kZWxldGVTdHJlYW0obUFwcFNlZ21lbnRTdHJlYW1JZCk7CisgICAgICAgIG1BcHBTZWdtZW50U3RyZWFtSWQgPSAtMTsKKyAgICB9CisKKyAgICBpZiAobU91dHB1dFN1cmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICBtT3V0cHV0U3VyZmFjZS0+ZGlzY29ubmVjdChOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEpOworICAgICAgICBtT3V0cHV0U3VyZmFjZS5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06Om9uQnVmZmVyUmVsZWFzZWQoY29uc3QgQnVmZmVySW5mbyYgYnVmZmVySW5mbykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisKKyAgICBpZiAoYnVmZmVySW5mby5tRXJyb3IpIHJldHVybjsKKworICAgIG1Db2RlY091dHB1dEJ1ZmZlclRpbWVzdGFtcHMucHVzaChidWZmZXJJbmZvLm1UaW1lc3RhbXApOworfQorCisvLyBXZSBuZWVkIHRvIGdldCB0aGUgc2V0dGluZ3MgZWFybHkgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBjb2RlYyBvdXRwdXQKKy8vIGFycml2ZXMgZWFybGllciB0aGFuIHJlc3VsdCBtZXRhZGF0YS4KK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25CdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIodWludDY0X3QgZnJhbWVOdW1iZXIsIGludCBzdHJlYW1JZCwKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKSB7CisgICAgQVRSQUNFX0FTWU5DX0JFR0lOKCJIRUlDIGNhcHR1cmUiLCBmcmFtZU51bWJlcik7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgIGlmIChtRXJyb3JTdGF0ZSB8fCAoc3RyZWFtSWQgIT0gZ2V0U3RyZWFtSWQoKSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1QZW5kaW5nQ2FwdHVyZVJlc3VsdHMuZW1wbGFjZShmcmFtZU51bWJlciwgQ2FtZXJhTWV0YWRhdGEoKSk7CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZW50cnk7CisKKyAgICBpbnQzMl90IG9yaWVudGF0aW9uID0gMDsKKyAgICBlbnRyeSA9IHNldHRpbmdzLmZpbmQoQU5EUk9JRF9KUEVHX09SSUVOVEFUSU9OKTsKKyAgICBpZiAoZW50cnkuY291bnQgPT0gMSkgeworICAgICAgICBvcmllbnRhdGlvbiA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgIH0KKworICAgIGludDMyX3QgcXVhbGl0eSA9IGtEZWZhdWx0SnBlZ1F1YWxpdHk7CisgICAgZW50cnkgPSBzZXR0aW5ncy5maW5kKEFORFJPSURfSlBFR19RVUFMSVRZKTsKKyAgICBpZiAoZW50cnkuY291bnQgPT0gMSkgeworICAgICAgICBxdWFsaXR5ID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgfQorCisgICAgbVNldHRpbmdzQnlGcmFtZU51bWJlcltmcmFtZU51bWJlcl0gPSBzdGQ6Om1ha2VfcGFpcihvcmllbnRhdGlvbiwgcXVhbGl0eSk7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKSB7CisgICAgaWYgKGl0ZW0ubURhdGFTcGFjZSA9PSBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZT4oa0FwcFNlZ21lbnREYXRhU3BhY2UpKSB7CisgICAgICAgIEFMT0dWKCIlczogSlBFRyBBUFAgc2VnbWVudHMgYnVmZmVyIHdpdGggdHM6ICUiIFBSSXU2NCAiIG1zLiBhcnJpdmVkISIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG5zMm1zKGl0ZW0ubVRpbWVzdGFtcCkpOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgICAgIGlmICghbUVycm9yU3RhdGUpIHsKKyAgICAgICAgICAgIG1JbnB1dEFwcFNlZ21lbnRCdWZmZXJzLnB1c2hfYmFjayhpdGVtLm1UaW1lc3RhbXApOworICAgICAgICAgICAgbUlucHV0UmVhZHlDb25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGl0ZW0ubURhdGFTcGFjZSA9PSBrSGVpZkRhdGFTcGFjZSkgeworICAgICAgICBBTE9HVigiJXM6IFlVVl84ODggYnVmZmVyIHdpdGggdHM6ICUiIFBSSXU2NCAiIG1zLiBhcnJpdmVkISIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG5zMm1zKGl0ZW0ubVRpbWVzdGFtcCkpOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgICAgIGlmICghbVVzZUdyaWQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogWVVWXzg4OCBpbnRlcm5hbCBzdHJlYW0gaXMgb25seSBzdXBwb3J0ZWQgZm9yIEhFVkMgdGlsaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1FcnJvclN0YXRlKSB7CisgICAgICAgICAgICBtSW5wdXRZdXZCdWZmZXJzLnB1c2hfYmFjayhpdGVtLm1UaW1lc3RhbXApOworICAgICAgICAgICAgbUlucHV0UmVhZHlDb25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgZGF0YSBzcGFjZTogMHgleCIsIF9fRlVOQ1RJT05fXywgaXRlbS5tRGF0YVNwYWNlKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OmdldENvbXBvc2l0ZVN0cmVhbUluZm8oY29uc3QgT3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4qIGNvbXBvc2l0ZU91dHB1dCAvKm91dCovKSB7CisgICAgaWYgKGNvbXBvc2l0ZU91dHB1dCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgY29tcG9zaXRlT3V0cHV0LT5jbGVhcigpOworCisgICAgYm9vbCB1c2VHcmlkLCB1c2VIZWljOworICAgIGJvb2wgaXNTaXplU3VwcG9ydGVkID0gaXNTaXplU3VwcG9ydGVkQnlIZWlmRW5jb2RlcigKKyAgICAgICAgICAgIHN0cmVhbUluZm8ud2lkdGgsIHN0cmVhbUluZm8uaGVpZ2h0LCAmdXNlSGVpYywgJnVzZUdyaWQsIG51bGxwdHIpOworICAgIGlmICghaXNTaXplU3VwcG9ydGVkKSB7CisgICAgICAgIC8vIFNpemUgaXMgbm90IHN1cHBvcnRlZCBieSBlaXRoZXIgZW5jb2Rlci4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGNvbXBvc2l0ZU91dHB1dC0+aW5zZXJ0KGNvbXBvc2l0ZU91dHB1dC0+ZW5kKCksIDIsIHN0cmVhbUluZm8pOworCisgICAgLy8gSlBFRyBBUFBTIHNlZ21lbnRzIEJsb2Igc3RyZWFtIGluZm8KKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMF0ud2lkdGggPSBjYWxjQXBwU2VnbWVudE1heFNpemUoY2gpOworICAgICgqY29tcG9zaXRlT3V0cHV0KVswXS5oZWlnaHQgPSAxOworICAgICgqY29tcG9zaXRlT3V0cHV0KVswXS5mb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX0JMT0I7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzBdLmRhdGFTcGFjZSA9IGtBcHBTZWdtZW50RGF0YVNwYWNlOworICAgICgqY29tcG9zaXRlT3V0cHV0KVswXS5jb25zdW1lclVzYWdlID0gR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOOworCisgICAgLy8gWVVWL0lNUExFTUVOVEFUSU9OX0RFRklORUQgc3RyZWFtIGluZm8KKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0ud2lkdGggPSBzdHJlYW1JbmZvLndpZHRoOworICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS5oZWlnaHQgPSBzdHJlYW1JbmZvLmhlaWdodDsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uZm9ybWF0ID0gdXNlR3JpZCA/IEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4OCA6CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLmRhdGFTcGFjZSA9IGtIZWlmRGF0YVNwYWNlOworICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS5jb25zdW1lclVzYWdlID0gdXNlSGVpYyA/IEdSQUxMT0NfVVNBR0VfSFdfSU1BR0VfRU5DT0RFUiA6CisgICAgICAgICAgICB1c2VHcmlkID8gR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIDogR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitib29sIEhlaWNDb21wb3NpdGVTdHJlYW06OmlzU2l6ZVN1cHBvcnRlZEJ5SGVpZkVuY29kZXIoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgIGJvb2wqIHVzZUhlaWMsIGJvb2wqIHVzZUdyaWQsIGludDY0X3QqIHN0YWxsKSB7CisgICAgc3RhdGljIEhlaWNFbmNvZGVySW5mb01hbmFnZXImIGhlaWNNYW5hZ2VyID0gSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICByZXR1cm4gaGVpY01hbmFnZXIuaXNTaXplU3VwcG9ydGVkKHdpZHRoLCBoZWlnaHQsIHVzZUhlaWMsIHVzZUdyaWQsIHN0YWxsKTsKK30KKworYm9vbCBIZWljQ29tcG9zaXRlU3RyZWFtOjppc0luTWVtb3J5VGVtcEZpbGVTdXBwb3J0ZWQoKSB7CisgICAgaW50IG1lbWZkID0gc3lzY2FsbChfX05SX21lbWZkX2NyZWF0ZSwgIkhFSUYtdHJ5LW1lbWZkIiwgTUZEX0NMT0VYRUMpOworICAgIGlmIChtZW1mZCA9PSAtMSkgeworICAgICAgICBpZiAoZXJybm8gIT0gRU5PU1lTKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgdG1wZnMgZmlsZS4gZXJybm8gJWQiLCBfX0ZVTkNUSU9OX18sIGVycm5vKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNsb3NlKG1lbWZkKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvbkhlaWNPdXRwdXRGcmFtZUF2YWlsYWJsZSgKKyAgICAgICAgY29uc3QgQ29kZWNPdXRwdXRCdWZmZXJJbmZvJiBvdXRwdXRCdWZmZXJJbmZvKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKworICAgIEFMT0dWKCIlczogaW5kZXggJWQsIG9mZnNldCAlZCwgc2l6ZSAlZCwgdGltZSAlIiBQUklkNjQgIiwgZmxhZ3MgMHgleCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG91dHB1dEJ1ZmZlckluZm8uaW5kZXgsIG91dHB1dEJ1ZmZlckluZm8ub2Zmc2V0LAorICAgICAgICAgICAgb3V0cHV0QnVmZmVySW5mby5zaXplLCBvdXRwdXRCdWZmZXJJbmZvLnRpbWVVcywgb3V0cHV0QnVmZmVySW5mby5mbGFncyk7CisKKyAgICBpZiAoIW1FcnJvclN0YXRlKSB7CisgICAgICAgIGlmICgob3V0cHV0QnVmZmVySW5mby5zaXplID4gMCkgJiYKKyAgICAgICAgICAgICAgICAoKG91dHB1dEJ1ZmZlckluZm8uZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19DT0RFQ0NPTkZJRykgPT0gMCkpIHsKKyAgICAgICAgICAgIG1Db2RlY091dHB1dEJ1ZmZlcnMucHVzaF9iYWNrKG91dHB1dEJ1ZmZlckluZm8pOworICAgICAgICAgICAgbUlucHV0UmVhZHlDb25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ29kZWMtPnJlbGVhc2VPdXRwdXRCdWZmZXIob3V0cHV0QnVmZmVySW5mby5pbmRleCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtQ29kZWMtPnJlbGVhc2VPdXRwdXRCdWZmZXIob3V0cHV0QnVmZmVySW5mby5pbmRleCk7CisgICAgfQorfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06Om9uSGVpY0lucHV0RnJhbWVBdmFpbGFibGUoaW50MzJfdCBpbmRleCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisKKyAgICBpZiAoIW1Vc2VHcmlkKSB7CisgICAgICAgIEFMT0dFKCIlczogQ29kZWMgWVVWIGlucHV0IG1vZGUgbXVzdCBvbmx5IGJlIHVzZWQgZm9yIEhldmMgdGlsaW5nIG1vZGUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUNvZGVjSW5wdXRCdWZmZXJzLnB1c2hfYmFjayhpbmRleCk7CisgICAgbUlucHV0UmVhZHlDb25kaXRpb24uc2lnbmFsKCk7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25IZWljRm9ybWF0Q2hhbmdlZChzcDxBTWVzc2FnZT4mIG5ld0Zvcm1hdCkgeworICAgIGlmIChuZXdGb3JtYXQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IG5ld0Zvcm1hdCBtdXN0IG5vdCBiZSBudWxsISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworCisgICAgQVN0cmluZyBtaW1lOworICAgIEFTdHJpbmcgbWltZUhlaWMoTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKTsKKyAgICBuZXdGb3JtYXQtPmZpbmRTdHJpbmcoS0VZX01JTUUsICZtaW1lKTsKKyAgICBpZiAobWltZSAhPSBtaW1lSGVpYykgeworICAgICAgICAvLyBGb3IgSEVWQyBjb2RlYywgYmVsb3cga2V5cyBuZWVkIHRvIGJlIGZpbGxlZCBvdXQgb3Igb3ZlcndyaXR0ZW4gc28gdGhhdCB0aGUKKyAgICAgICAgLy8gbXV4ZXIgY2FuIGhhbmRsZSB0aGVtIGFzIEhFSUMgb3V0cHV0IGltYWdlLgorICAgICAgICBuZXdGb3JtYXQtPnNldFN0cmluZyhLRVlfTUlNRSwgbWltZUhlaWMpOworICAgICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9XSURUSCwgbU91dHB1dFdpZHRoKTsKKyAgICAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfSEVJR0hULCBtT3V0cHV0SGVpZ2h0KTsKKyAgICAgICAgaWYgKG1Vc2VHcmlkKSB7CisgICAgICAgICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9USUxFX1dJRFRILCBtR3JpZFdpZHRoKTsKKyAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX1RJTEVfSEVJR0hULCBtR3JpZEhlaWdodCk7CisgICAgICAgICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9HUklEX1JPV1MsIG1HcmlkUm93cyk7CisgICAgICAgICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9HUklEX0NPTFVNTlMsIG1HcmlkQ29scyk7CisgICAgICAgIH0KKyAgICB9CisgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfSVNfREVGQVVMVCwgMSAvKmlzUHJpbWFyeSovKTsKKworICAgIGludDMyX3QgZ3JpZFJvd3MsIGdyaWRDb2xzOworICAgIGlmIChuZXdGb3JtYXQtPmZpbmRJbnQzMihLRVlfR1JJRF9ST1dTLCAmZ3JpZFJvd3MpICYmCisgICAgICAgICAgICBuZXdGb3JtYXQtPmZpbmRJbnQzMihLRVlfR1JJRF9DT0xVTU5TLCAmZ3JpZENvbHMpKSB7CisgICAgICAgIG1OdW1PdXRwdXRUaWxlcyA9IGdyaWRSb3dzICogZ3JpZENvbHM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbU51bU91dHB1dFRpbGVzID0gMTsKKyAgICB9CisKKyAgICBBTE9HVigiJXM6IG1OdW1PdXRwdXRUaWxlcyBpcyAlenUiLCBfX0ZVTkNUSU9OX18sIG1OdW1PdXRwdXRUaWxlcyk7CisgICAgbUZvcm1hdCA9IG5ld0Zvcm1hdDsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvbkhlaWNDb2RlY0Vycm9yKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgbUVycm9yU3RhdGUgPSB0cnVlOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpjb25maWd1cmVTdHJlYW0oKSB7CisgICAgaWYgKGlzUnVubmluZygpKSB7CisgICAgICAgIC8vIFByb2Nlc3NpbmcgdGhyZWFkIGlzIGFscmVhZHkgcnVubmluZywgbm90aGluZyBtb3JlIHRvIGRvLgorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgaWYgKG1PdXRwdXRTdXJmYWNlLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyB2YWxpZCBvdXRwdXQgc3VyZmFjZSBzZXQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgYXV0byByZXMgPSBtT3V0cHV0U3VyZmFjZS0+Y29ubmVjdChOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEsIG1Qcm9kdWNlckxpc3RlbmVyKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbm5lY3QgdG8gbmF0aXZlIHdpbmRvdyBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1NYWluSW1hZ2VTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKChyZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChtT3V0cHV0U3VyZmFjZS5nZXQoKSwgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSkKKyAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBzdHJlYW0gYnVmZmVyIGZvcm1hdCBmb3Igc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIG1NYWluSW1hZ2VTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgQU5hdGl2ZVdpbmRvdyAqYW53Q29uc3VtZXIgPSBtT3V0cHV0U3VyZmFjZS5nZXQoKTsKKyAgICBpbnQgbWF4Q29uc3VtZXJCdWZmZXJzOworICAgIGlmICgocmVzID0gYW53Q29uc3VtZXItPnF1ZXJ5KGFud0NvbnN1bWVyLCBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsCisgICAgICAgICAgICAgICAgICAgICZtYXhDb25zdW1lckJ1ZmZlcnMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBxdWVyeSBjb25zdW1lciB1bmRlcXVldWVkIgorICAgICAgICAgICAgICAgICIgYnVmZmVyIGNvdW50IGZvciBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sIG1NYWluSW1hZ2VTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gQ2Fubm90IHVzZSBTb3VyY2VTdXJmYWNlIGJ1ZmZlciBjb3VudCBzaW5jZSBpdCBjb3VsZCBiZSBjb2RlYydzIDUxMio1MTIgdGlsZQorICAgIC8vIGJ1ZmZlciBjb3VudC4KKyAgICBpbnQgbWF4UHJvZHVjZXJCdWZmZXJzID0gMTsKKyAgICBpZiAoKHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudCgKKyAgICAgICAgICAgICAgICAgICAgYW53Q29uc3VtZXIsIG1heFByb2R1Y2VyQnVmZmVycyArIG1heENvbnN1bWVyQnVmZmVycykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHNldCBidWZmZXIgY291bnQgZm9yIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywgbU1haW5JbWFnZVN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAoKHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyhhbndDb25zdW1lciwgbU1heEhlaWNCdWZmZXJTaXplLCAxKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc2V0IGJ1ZmZlciBkaW1lbnNpb24gJXp1IHggMSBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1NYXhIZWljQnVmZmVyU2l6ZSwgbU1haW5JbWFnZVN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBydW4oIkhlaWNDb21wb3NpdGVTdHJlYW1Qcm9jIik7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06Omluc2VydEdicChTdXJmYWNlTWFwKiAvKm91dCovb3V0U3VyZmFjZU1hcCwKKyAgICAgICAgVmVjdG9yPGludDMyX3Q+KiAvKm91dCovb3V0cHV0U3RyZWFtSWRzLCBpbnQzMl90KiAvKm91dCovY3VycmVudFN0cmVhbUlkKSB7CisgICAgaWYgKG91dFN1cmZhY2VNYXAtPmZpbmQobUFwcFNlZ21lbnRTdHJlYW1JZCkgPT0gb3V0U3VyZmFjZU1hcC0+ZW5kKCkpIHsKKyAgICAgICAgKCpvdXRTdXJmYWNlTWFwKVttQXBwU2VnbWVudFN0cmVhbUlkXSA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtSWRzLT5wdXNoX2JhY2sobUFwcFNlZ21lbnRTdHJlYW1JZCk7CisgICAgfQorICAgICgqb3V0U3VyZmFjZU1hcClbbUFwcFNlZ21lbnRTdHJlYW1JZF0ucHVzaF9iYWNrKG1BcHBTZWdtZW50U3VyZmFjZUlkKTsKKworICAgIGlmIChvdXRTdXJmYWNlTWFwLT5maW5kKG1NYWluSW1hZ2VTdHJlYW1JZCkgPT0gb3V0U3VyZmFjZU1hcC0+ZW5kKCkpIHsKKyAgICAgICAgKCpvdXRTdXJmYWNlTWFwKVttTWFpbkltYWdlU3RyZWFtSWRdID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpOworICAgICAgICBvdXRwdXRTdHJlYW1JZHMtPnB1c2hfYmFjayhtTWFpbkltYWdlU3RyZWFtSWQpOworICAgIH0KKyAgICAoKm91dFN1cmZhY2VNYXApW21NYWluSW1hZ2VTdHJlYW1JZF0ucHVzaF9iYWNrKG1NYWluSW1hZ2VTdXJmYWNlSWQpOworCisgICAgaWYgKGN1cnJlbnRTdHJlYW1JZCAhPSBudWxscHRyKSB7CisgICAgICAgICpjdXJyZW50U3RyZWFtSWQgPSBtTWFpbkltYWdlU3RyZWFtSWQ7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06Om9uU2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsIG5zZWNzX3QgdGltZXN0YW1wKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICBpZiAobUVycm9yU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtU2V0dGluZ3NCeUZyYW1lTnVtYmVyLmZpbmQocmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKSAhPSBtU2V0dGluZ3NCeUZyYW1lTnVtYmVyLmVuZCgpKSB7CisgICAgICAgIG1GcmFtZU51bWJlck1hcC5lbXBsYWNlKHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwgdGltZXN0YW1wKTsKKyAgICAgICAgbVNldHRpbmdzQnlUaW1lc3RhbXBbdGltZXN0YW1wXSA9IG1TZXR0aW5nc0J5RnJhbWVOdW1iZXJbcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyXTsKKyAgICAgICAgbVNldHRpbmdzQnlGcmFtZU51bWJlci5lcmFzZShyZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICB9Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Y29tcGlsZVBlbmRpbmdJbnB1dExvY2tlZCgpIHsKKyAgICB3aGlsZSAoIW1TZXR0aW5nc0J5VGltZXN0YW1wLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBpdCA9IG1TZXR0aW5nc0J5VGltZXN0YW1wLmJlZ2luKCk7CisgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaXQtPmZpcnN0XS5vcmllbnRhdGlvbiA9IGl0LT5zZWNvbmQuZmlyc3Q7CisgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaXQtPmZpcnN0XS5xdWFsaXR5ID0gaXQtPnNlY29uZC5zZWNvbmQ7CisgICAgICAgIG1TZXR0aW5nc0J5VGltZXN0YW1wLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW1JbnB1dEFwcFNlZ21lbnRCdWZmZXJzLmVtcHR5KCkgJiYgIW1BcHBTZWdtZW50QnVmZmVyQWNxdWlyZWQpIHsKKyAgICAgICAgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciBpbWdCdWZmZXI7CisgICAgICAgIGF1dG8gaXQgPSBtSW5wdXRBcHBTZWdtZW50QnVmZmVycy5iZWdpbigpOworICAgICAgICBhdXRvIHJlcyA9IG1BcHBTZWdtZW50Q29uc3VtZXItPmxvY2tOZXh0QnVmZmVyKCZpbWdCdWZmZXIpOworICAgICAgICBpZiAocmVzID09IE5PVF9FTk9VR0hfREFUQSkgeworICAgICAgICAgICAgLy8gQ2Fub3Qgbm90IGxvY2sgYW55IG1vcmUgYnVmZmVycy4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKChyZXMgIT0gT0spIHx8ICgqaXQgIT0gaW1nQnVmZmVyLnRpbWVzdGFtcCkpIHsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGxvY2tpbmcgSlBFR19BUFBfU0VHTUVOVFMgaW1hZ2UgYnVmZmVyOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRXhwZWN0aW5nIEpQRUdfQVBQX1NFR01FTlRTIGJ1ZmZlciB3aXRoIHRpbWUgc3RhbXA6ICUiIFBSSWQ2NAorICAgICAgICAgICAgICAgICAgICAgICAgIiByZWNlaXZlZCBidWZmZXIgd2l0aCB0aW1lIHN0YW1wOiAlIiBQUklkNjQsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICppdCwgaW1nQnVmZmVyLnRpbWVzdGFtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzWyppdF0uZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgbUlucHV0QXBwU2VnbWVudEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG1QZW5kaW5nSW5wdXRGcmFtZXMuZmluZChpbWdCdWZmZXIudGltZXN0YW1wKSAhPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVuZCgpKSAmJgorICAgICAgICAgICAgICAgIChtUGVuZGluZ0lucHV0RnJhbWVzW2ltZ0J1ZmZlci50aW1lc3RhbXBdLmVycm9yKSkgeworICAgICAgICAgICAgbUFwcFNlZ21lbnRDb25zdW1lci0+dW5sb2NrQnVmZmVyKGltZ0J1ZmZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2ltZ0J1ZmZlci50aW1lc3RhbXBdLmFwcFNlZ21lbnRCdWZmZXIgPSBpbWdCdWZmZXI7CisgICAgICAgICAgICBtQXBwU2VnbWVudEJ1ZmZlckFjcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtSW5wdXRBcHBTZWdtZW50QnVmZmVycy5lcmFzZShpdCk7CisgICAgfQorCisgICAgd2hpbGUgKCFtSW5wdXRZdXZCdWZmZXJzLmVtcHR5KCkgJiYgIW1ZdXZCdWZmZXJBY3F1aXJlZCkgeworICAgICAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyIGltZ0J1ZmZlcjsKKyAgICAgICAgYXV0byBpdCA9IG1JbnB1dFl1dkJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgYXV0byByZXMgPSBtTWFpbkltYWdlQ29uc3VtZXItPmxvY2tOZXh0QnVmZmVyKCZpbWdCdWZmZXIpOworICAgICAgICBpZiAocmVzID09IE5PVF9FTk9VR0hfREFUQSkgeworICAgICAgICAgICAgLy8gQ2Fub3Qgbm90IGxvY2sgYW55IG1vcmUgYnVmZmVycy4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBsb2NraW5nIFlVVl84ODggaW1hZ2UgYnVmZmVyOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbKml0XS5lcnJvciA9IHRydWU7CisgICAgICAgICAgICBtSW5wdXRZdXZCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKCppdCAhPSBpbWdCdWZmZXIudGltZXN0YW1wKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IEV4cGVjdGluZyBZVVZfODg4IGJ1ZmZlciB3aXRoIHRpbWUgc3RhbXA6ICUiIFBSSWQ2NCAiIHJlY2VpdmVkIGJ1ZmZlciB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgInRpbWUgc3RhbXA6ICUiIFBSSWQ2NCwgX19GVU5DVElPTl9fLCAqaXQsIGltZ0J1ZmZlci50aW1lc3RhbXApOworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1sqaXRdLmVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIG1JbnB1dFl1dkJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG1QZW5kaW5nSW5wdXRGcmFtZXMuZmluZChpbWdCdWZmZXIudGltZXN0YW1wKSAhPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVuZCgpKSAmJgorICAgICAgICAgICAgICAgIChtUGVuZGluZ0lucHV0RnJhbWVzW2ltZ0J1ZmZlci50aW1lc3RhbXBdLmVycm9yKSkgeworICAgICAgICAgICAgbU1haW5JbWFnZUNvbnN1bWVyLT51bmxvY2tCdWZmZXIoaW1nQnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaW1nQnVmZmVyLnRpbWVzdGFtcF0ueXV2QnVmZmVyID0gaW1nQnVmZmVyOworICAgICAgICAgICAgbVl1dkJ1ZmZlckFjcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtSW5wdXRZdXZCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW1Db2RlY091dHB1dEJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGl0ID0gbUNvZGVjT3V0cHV0QnVmZmVycy5iZWdpbigpOworICAgICAgICAvLyBCaXRzdHJlYW0gYnVmZmVyIHRpbWVzdGFtcCBkb2Vzbid0IG5lY2Vzc2FyaWx5IGRpcmVjdGx5IGNvcnJlbGF0ZSB3aXRoIGlucHV0CisgICAgICAgIC8vIGJ1ZmZlciB0aW1lc3RhbXAuIEFzc3VtZSBlbmNvZGVyIGlucHV0IHRvIG91dHB1dCBpcyBGSUZPLCB1c2UgYSBxdWV1ZQorICAgICAgICAvLyB0byBsb29rIHVwIHRpbWVzdGFtcC4KKyAgICAgICAgaW50NjRfdCBidWZmZXJUaW1lID0gLTE7CisgICAgICAgIGlmIChtQ29kZWNPdXRwdXRCdWZmZXJUaW1lc3RhbXBzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGZpbmQgYnVmZmVyIHRpbWVzdGFtcCBmb3IgY29kZWMgb3V0cHV0IGJ1ZmZlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRGlyZWN0IG1hcHBpbmcgYmV0d2VlbiBjYW1lcmEgdGltZXN0YW1wIChpbiBucykgYW5kIGNvZGVjIHRpbWVzdGFtcCAoaW4gdXMpLgorICAgICAgICAgICAgYnVmZmVyVGltZSA9IG1Db2RlY091dHB1dEJ1ZmZlclRpbWVzdGFtcHMuZnJvbnQoKTsKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJDb3VudGVyKys7CisgICAgICAgICAgICBpZiAobU91dHB1dEJ1ZmZlckNvdW50ZXIgPT0gbU51bU91dHB1dFRpbGVzKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjT3V0cHV0QnVmZmVyVGltZXN0YW1wcy5wb3AoKTsKKyAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyQ291bnRlciA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbYnVmZmVyVGltZV0uY29kZWNPdXRwdXRCdWZmZXJzLnB1c2hfYmFjaygqaXQpOworICAgICAgICB9CisgICAgICAgIG1Db2RlY091dHB1dEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgIH0KKworICAgIHdoaWxlICghbUZyYW1lTnVtYmVyTWFwLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBpdCA9IG1GcmFtZU51bWJlck1hcC5iZWdpbigpOworICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2l0LT5zZWNvbmRdLmZyYW1lTnVtYmVyID0gaXQtPmZpcnN0OworICAgICAgICBtRnJhbWVOdW1iZXJNYXAuZXJhc2UoaXQpOworICAgIH0KKworICAgIHdoaWxlICghbUNhcHR1cmVSZXN1bHRzLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBpdCA9IG1DYXB0dXJlUmVzdWx0cy5iZWdpbigpOworICAgICAgICAvLyBOZWdhdGl2ZSB0aW1lc3RhbXAgaW5kaWNhdGVzIHRoYXQgc29tZXRoaW5nIHdlbnQgd3JvbmcgZHVyaW5nIHRoZSBjYXB0dXJlIHJlc3VsdAorICAgICAgICAvLyBjb2xsZWN0aW9uIHByb2Nlc3MuCisgICAgICAgIGlmIChpdC0+Zmlyc3QgPj0gMCkgeworICAgICAgICAgICAgaWYgKG1QZW5kaW5nSW5wdXRGcmFtZXNbaXQtPmZpcnN0XS5mcmFtZU51bWJlciA9PSBzdGQ6OmdldDwwPihpdC0+c2Vjb25kKSkgeworICAgICAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaXQtPmZpcnN0XS5yZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDYW1lcmFNZXRhZGF0YT4oc3RkOjpnZXQ8MT4oaXQtPnNlY29uZCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhcHR1cmUgcmVzdWx0IGZyYW1lTnVtYmVyL3RpbWVzdGFtcCBtYXBwaW5nIGNoYW5nZWQgYmV0d2VlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAic2h1dHRlciBhbmQgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQ2FwdHVyZVJlc3VsdHMuZXJhc2UoaXQpOworICAgIH0KKworICAgIC8vIG1FcnJvckZyYW1lTnVtYmVycyBzdG9yZXMgZnJhbWUgbnVtYmVyIG9mIGRyb3BwZWQgYnVmZmVycy4KKyAgICBhdXRvIGl0ID0gbUVycm9yRnJhbWVOdW1iZXJzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1FcnJvckZyYW1lTnVtYmVycy5lbmQoKSkgeworICAgICAgICBib29sIGZyYW1lRm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChhdXRvICZpbnB1dEZyYW1lIDogbVBlbmRpbmdJbnB1dEZyYW1lcykgeworICAgICAgICAgICAgaWYgKGlucHV0RnJhbWUuc2Vjb25kLmZyYW1lTnVtYmVyID09ICppdCkgeworICAgICAgICAgICAgICAgIGlucHV0RnJhbWUuc2Vjb25kLmVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmcmFtZUZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmcmFtZUZvdW5kKSB7CisgICAgICAgICAgICBpdCA9IG1FcnJvckZyYW1lTnVtYmVycy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IE5vdCBhYmxlIHRvIGZpbmQgZmFpbGluZyBpbnB1dCB3aXRoIGZyYW1lIG51bWJlcjogJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICppdCk7CisgICAgICAgICAgICBpdCsrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRGlzdHJpYnV0ZSBjb2RlYyBpbnB1dCBidWZmZXJzIHRvIGJlIGZpbGxlZCBvdXQgZnJvbSBZVVYgb3V0cHV0CisgICAgZm9yIChhdXRvIGl0ID0gbVBlbmRpbmdJbnB1dEZyYW1lcy5iZWdpbigpOworICAgICAgICAgICAgaXQgIT0gbVBlbmRpbmdJbnB1dEZyYW1lcy5lbmQoKSAmJiBtQ29kZWNJbnB1dEJ1ZmZlcnMuc2l6ZSgpID4gMDsgaXQrKykgeworICAgICAgICBJbnB1dEZyYW1lJiBpbnB1dEZyYW1lKGl0LT5zZWNvbmQpOworICAgICAgICBpZiAoaW5wdXRGcmFtZS5jb2RlY0lucHV0Q291bnRlciA8IG1HcmlkUm93cyAqIG1HcmlkQ29scykgeworICAgICAgICAgICAgLy8gQXZhaWxhYmxlIGlucHV0IHRpbGVzIHRoYXQgYXJlIHJlcXVpcmVkIGZvciB0aGUgY3VycmVudCBpbnB1dAorICAgICAgICAgICAgLy8gaW1hZ2UuCisgICAgICAgICAgICBzaXplX3QgbmV3SW5wdXRUaWxlcyA9IHN0ZDo6bWluKG1Db2RlY0lucHV0QnVmZmVycy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgIG1HcmlkUm93cyAqIG1HcmlkQ29scyAtIGlucHV0RnJhbWUuY29kZWNJbnB1dENvdW50ZXIpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdJbnB1dFRpbGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBDb2RlY0lucHV0QnVmZmVySW5mbyBpbnB1dEluZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgeyBtQ29kZWNJbnB1dEJ1ZmZlcnNbMF0sIG1HcmlkVGltZXN0YW1wVXMrKywgaW5wdXRGcmFtZS5jb2RlY0lucHV0Q291bnRlciB9OworICAgICAgICAgICAgICAgIGlucHV0RnJhbWUuY29kZWNJbnB1dEJ1ZmZlcnMucHVzaF9iYWNrKGlucHV0SW5mbyk7CisKKyAgICAgICAgICAgICAgICBtQ29kZWNJbnB1dEJ1ZmZlcnMuZXJhc2UobUNvZGVjSW5wdXRCdWZmZXJzLmJlZ2luKCkpOworICAgICAgICAgICAgICAgIGlucHV0RnJhbWUuY29kZWNJbnB1dENvdW50ZXIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitib29sIEhlaWNDb21wb3NpdGVTdHJlYW06OmdldE5leHRSZWFkeUlucHV0TG9ja2VkKGludDY0X3QgKmN1cnJlbnRUcyAvKm91dCovKSB7CisgICAgaWYgKGN1cnJlbnRUcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIG5ld0lucHV0QXZhaWxhYmxlID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6IG1QZW5kaW5nSW5wdXRGcmFtZXMpIHsKKyAgICAgICAgYm9vbCBhcHBTZWdtZW50UmVhZHkgPSAoaXQuc2Vjb25kLmFwcFNlZ21lbnRCdWZmZXIuZGF0YSAhPSBudWxscHRyKSAmJgorICAgICAgICAgICAgICAgICFpdC5zZWNvbmQuYXBwU2VnbWVudFdyaXR0ZW4gJiYgaXQuc2Vjb25kLnJlc3VsdCAhPSBudWxscHRyOworICAgICAgICBib29sIGNvZGVjT3V0cHV0UmVhZHkgPSAhaXQuc2Vjb25kLmNvZGVjT3V0cHV0QnVmZmVycy5lbXB0eSgpOworICAgICAgICBib29sIGNvZGVjSW5wdXRSZWFkeSA9IChpdC5zZWNvbmQueXV2QnVmZmVyLmRhdGEgIT0gbnVsbHB0cikgJiYKKyAgICAgICAgICAgICAgICAoIWl0LnNlY29uZC5jb2RlY0lucHV0QnVmZmVycy5lbXB0eSgpKTsKKyAgICAgICAgaWYgKCghaXQuc2Vjb25kLmVycm9yKSAmJgorICAgICAgICAgICAgICAgIChpdC5maXJzdCA8ICpjdXJyZW50VHMpICYmCisgICAgICAgICAgICAgICAgKGFwcFNlZ21lbnRSZWFkeSB8fCBjb2RlY091dHB1dFJlYWR5IHx8IGNvZGVjSW5wdXRSZWFkeSkpIHsKKyAgICAgICAgICAgICpjdXJyZW50VHMgPSBpdC5maXJzdDsKKyAgICAgICAgICAgIG5ld0lucHV0QXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG5ld0lucHV0QXZhaWxhYmxlOworfQorCitpbnQ2NF90IEhlaWNDb21wb3NpdGVTdHJlYW06OmdldE5leHRGYWlsaW5nSW5wdXRMb2NrZWQoaW50NjRfdCAqY3VycmVudFRzIC8qb3V0Ki8pIHsKKyAgICBpbnQ2NF90IHJlcyA9IC0xOworICAgIGlmIChjdXJyZW50VHMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBtUGVuZGluZ0lucHV0RnJhbWVzKSB7CisgICAgICAgIGlmIChpdC5zZWNvbmQuZXJyb3IgJiYgIWl0LnNlY29uZC5lcnJvck5vdGlmaWVkICYmIChpdC5maXJzdCA8ICpjdXJyZW50VHMpKSB7CisgICAgICAgICAgICAqY3VycmVudFRzID0gaXQuZmlyc3Q7CisgICAgICAgICAgICByZXMgPSBpdC5zZWNvbmQuZnJhbWVOdW1iZXI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OnByb2Nlc3NJbnB1dEZyYW1lKG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIGJvb2wgYXBwU2VnbWVudFJlYWR5ID0gaW5wdXRGcmFtZS5hcHBTZWdtZW50QnVmZmVyLmRhdGEgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgIWlucHV0RnJhbWUuYXBwU2VnbWVudFdyaXR0ZW4gJiYgaW5wdXRGcmFtZS5yZXN1bHQgIT0gbnVsbHB0cjsKKyAgICBib29sIGNvZGVjT3V0cHV0UmVhZHkgPSBpbnB1dEZyYW1lLmNvZGVjT3V0cHV0QnVmZmVycy5zaXplKCkgPiAwOworICAgIGJvb2wgY29kZWNJbnB1dFJlYWR5ID0gaW5wdXRGcmFtZS55dXZCdWZmZXIuZGF0YSAhPSBudWxscHRyICYmCisgICAgICAgICAgICFpbnB1dEZyYW1lLmNvZGVjSW5wdXRCdWZmZXJzLmVtcHR5KCk7CisKKyAgICBpZiAoIWFwcFNlZ21lbnRSZWFkeSAmJiAhY29kZWNPdXRwdXRSZWFkeSAmJiAhY29kZWNJbnB1dFJlYWR5KSB7CisgICAgICAgIEFMT0dXKCIlczogTm8gdmFsaWQgYXBwU2VnbWVudEJ1ZmZlci9jb2RlYyBpbnB1dC9vdXRwdXRCdWZmZXIgYXZhaWxhYmxlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgaW5wdXRzIGZvciBIZXZjIHRpbGluZworICAgIGlmIChjb2RlY0lucHV0UmVhZHkpIHsKKyAgICAgICAgcmVzID0gcHJvY2Vzc0NvZGVjSW5wdXRGcmFtZShpbnB1dEZyYW1lKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcHJvY2VzcyBjb2RlYyBpbnB1dCBmcmFtZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSW5pdGlhbGl6ZSBhbmQgc3RhcnQgbXV4ZXIgaWYgbm90IHlldCBkb25lIHNvCisgICAgaWYgKGlucHV0RnJhbWUubXV4ZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXMgPSBzdGFydE11eGVyRm9ySW5wdXRGcmFtZSh0aW1lc3RhbXAsIGlucHV0RnJhbWUpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgYW5kIHN0YXJ0IG11eGVyOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXcml0ZSBKUEVHIEFQUCBzZWdtZW50cyBkYXRhIHRvIHRoZSBtdXhlci4KKyAgICBpZiAoYXBwU2VnbWVudFJlYWR5ICYmIGlucHV0RnJhbWUubXV4ZXIgIT0gbnVsbHB0cikgeworICAgICAgICByZXMgPSBwcm9jZXNzQXBwU2VnbWVudCh0aW1lc3RhbXAsIGlucHV0RnJhbWUpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBwcm9jZXNzIEpQRUcgQVBQIHNlZ21lbnRzOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXcml0ZSBtZWRpYSBjb2RlYyBiaXRzdHJlYW0gYnVmZmVycyB0byBtdXhlci4KKyAgICB3aGlsZSAoIWlucHV0RnJhbWUuY29kZWNPdXRwdXRCdWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgcmVzID0gcHJvY2Vzc09uZUNvZGVjT3V0cHV0RnJhbWUodGltZXN0YW1wLCBpbnB1dEZyYW1lKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcHJvY2VzcyBjb2RlYyBvdXRwdXQgZnJhbWU6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbnB1dEZyYW1lLmFwcFNlZ21lbnRXcml0dGVuICYmIGlucHV0RnJhbWUucGVuZGluZ091dHB1dFRpbGVzID09IDApIHsKKyAgICAgICAgcmVzID0gcHJvY2Vzc0NvbXBsZXRlZElucHV0RnJhbWUodGltZXN0YW1wLCBpbnB1dEZyYW1lKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcHJvY2VzcyBjb21wbGV0ZWQgaW5wdXQgZnJhbWU6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OnN0YXJ0TXV4ZXJGb3JJbnB1dEZyYW1lKG5zZWNzX3QgdGltZXN0YW1wLCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKSB7CisgICAgc3A8QU5hdGl2ZVdpbmRvdz4gb3V0cHV0QU5XID0gbU91dHB1dFN1cmZhY2U7CisgICAgaWYgKGlucHV0RnJhbWUuY29kZWNPdXRwdXRCdWZmZXJzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIC8vIE5vIHNpbmdsZSBjb2RlYyBvdXRwdXQgYnVmZmVyIGhhcyBiZWVuIGdlbmVyYXRlZC4gQ29udGludWUgdG8KKyAgICAgICAgLy8gd2FpdC4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGF1dG8gcmVzID0gb3V0cHV0QU5XLT5kZXF1ZXVlQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCAmaW5wdXRGcmFtZS5hbmIsICZpbnB1dEZyYW1lLmZlbmNlRmQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciByZXRyaWV2aW5nIG91dHB1dCBidWZmZXI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLAorICAgICAgICAgICAgICAgIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gQ29tYmluZSBjdXJyZW50IHRocmVhZCBpZCwgc3RyZWFtIGlkIGFuZCB0aW1lc3RhbXAgdG8gdW5pcXVlbHkgaWRlbnRpZnkgaW1hZ2UuCisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHRlbXBPdXRwdXRGaWxlOworICAgIHRlbXBPdXRwdXRGaWxlIDw8ICJIRUlGLSIgPDwgcHRocmVhZF9zZWxmKCkgPDwgIi0iCisgICAgICAgICAgICA8PCBnZXRTdHJlYW1JZCgpIDw8ICItIiA8PCB0aW1lc3RhbXA7CisgICAgaW5wdXRGcmFtZS5maWxlRmQgPSBzeXNjYWxsKF9fTlJfbWVtZmRfY3JlYXRlLCB0ZW1wT3V0cHV0RmlsZS5zdHIoKS5jX3N0cigpLCBNRkRfQ0xPRVhFQyk7CisgICAgaWYgKGlucHV0RnJhbWUuZmlsZUZkIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgZmlsZSAlcy4gRXJyb3Igbm8gaXMgJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgdGVtcE91dHB1dEZpbGUuc3RyKCkuY19zdHIoKSwgZXJybm8pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaW5wdXRGcmFtZS5tdXhlciA9IG5ldyBNZWRpYU11eGVyKGlucHV0RnJhbWUuZmlsZUZkLCBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX0hFSUYpOworICAgIGlmIChpbnB1dEZyYW1lLm11eGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIE1lZGlhTXV4ZXIgZm9yIGZpbGUgZmQgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaW5wdXRGcmFtZS5maWxlRmQpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXMgPSBpbnB1dEZyYW1lLm11eGVyLT5zZXRPcmllbnRhdGlvbkhpbnQoaW5wdXRGcmFtZS5vcmllbnRhdGlvbik7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBzZXRPcmllbnRhdGlvbkhpbnQ6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIC8vIFNldCBlbmNvZGVyIHF1YWxpdHkKKyAgICB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBxdWFsaXR5UGFyYW1zID0gbmV3IEFNZXNzYWdlOworICAgICAgICBxdWFsaXR5UGFyYW1zLT5zZXRJbnQzMihQQVJBTUVURVJfS0VZX1ZJREVPX0JJVFJBVEUsIGlucHV0RnJhbWUucXVhbGl0eSk7CisgICAgICAgIHJlcyA9IG1Db2RlYy0+c2V0UGFyYW1ldGVycyhxdWFsaXR5UGFyYW1zKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gc2V0IGNvZGVjIHF1YWxpdHk6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNzaXplX3QgdHJhY2tJZCA9IGlucHV0RnJhbWUubXV4ZXItPmFkZFRyYWNrKG1Gb3JtYXQpOworICAgIGlmICh0cmFja0lkIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBhZGRUcmFjayB0byB0aGUgbXV4ZXI6ICV6ZCIsIF9fRlVOQ1RJT05fXywgdHJhY2tJZCk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlucHV0RnJhbWUudHJhY2tJbmRleCA9IHRyYWNrSWQ7CisgICAgaW5wdXRGcmFtZS5wZW5kaW5nT3V0cHV0VGlsZXMgPSBtTnVtT3V0cHV0VGlsZXM7CisKKyAgICByZXMgPSBpbnB1dEZyYW1lLm11eGVyLT5zdGFydCgpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gc3RhcnQgTWVkaWFNdXhlcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OnByb2Nlc3NBcHBTZWdtZW50KG5zZWNzX3QgdGltZXN0YW1wLCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKSB7CisgICAgc2l6ZV90IGFwcDFTaXplID0gMDsKKyAgICBhdXRvIGFwcFNlZ21lbnRTaXplID0gZmluZEFwcFNlZ21lbnRzU2l6ZShpbnB1dEZyYW1lLmFwcFNlZ21lbnRCdWZmZXIuZGF0YSwKKyAgICAgICAgICAgIGlucHV0RnJhbWUuYXBwU2VnbWVudEJ1ZmZlci53aWR0aCAqIGlucHV0RnJhbWUuYXBwU2VnbWVudEJ1ZmZlci5oZWlnaHQsCisgICAgICAgICAgICAmYXBwMVNpemUpOworICAgIEFMT0dWKCIlczogYXBwU2VnbWVudFNpemUgaXMgJXp1LCB3aWR0aCAlZCwgaGVpZ2h0ICVkLCBhcHAxU2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgYXBwU2VnbWVudFNpemUsIGlucHV0RnJhbWUuYXBwU2VnbWVudEJ1ZmZlci53aWR0aCwKKyAgICAgICAgICBpbnB1dEZyYW1lLmFwcFNlZ21lbnRCdWZmZXIuaGVpZ2h0LCBhcHAxU2l6ZSk7CisgICAgaWYgKGFwcFNlZ21lbnRTaXplID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZmluZCBKUEVHIEFQUCBzZWdtZW50IHNpemUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZlV0aWxzPiBleGlmVXRpbHMoRXhpZlV0aWxzOjpjcmVhdGUoKSk7CisgICAgYXV0byBleGlmUmVzID0gZXhpZlV0aWxzLT5pbml0aWFsaXplKGlucHV0RnJhbWUuYXBwU2VnbWVudEJ1ZmZlci5kYXRhLCBhcHAxU2l6ZSk7CisgICAgaWYgKCFleGlmUmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgRXhpZlV0aWxzIG9iamVjdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBleGlmUmVzID0gZXhpZlV0aWxzLT5zZXRGcm9tTWV0YWRhdGEoKmlucHV0RnJhbWUucmVzdWx0LCBtU3RhdGljSW5mbywKKyAgICAgICAgICAgIG1PdXRwdXRXaWR0aCwgbU91dHB1dEhlaWdodCk7CisgICAgaWYgKCFleGlmUmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHNldCBFeGlmIHRhZ3MgdXNpbmcgbWV0YWRhdGEgYW5kIG1haW4gaW1hZ2Ugc2l6ZXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBleGlmUmVzID0gZXhpZlV0aWxzLT5zZXRPcmllbnRhdGlvbihpbnB1dEZyYW1lLm9yaWVudGF0aW9uKTsKKyAgICBpZiAoIWV4aWZSZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFeGlmVXRpbHMgZmFpbGVkIHRvIHNldCBvcmllbnRhdGlvbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGV4aWZSZXMgPSBleGlmVXRpbHMtPmdlbmVyYXRlQXBwMSgpOworICAgIGlmICghZXhpZlJlcykgeworICAgICAgICBBTE9HRSgiJXM6IEV4aWZVdGlscyBmYWlsZWQgdG8gZ2VuZXJhdGUgQVBQMSBzZWdtZW50IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBpbnQgbmV3QXBwMUxlbmd0aCA9IGV4aWZVdGlscy0+Z2V0QXBwMUxlbmd0aCgpOworICAgIGNvbnN0IHVpbnQ4X3QgKm5ld0FwcDFTZWdtZW50ID0gZXhpZlV0aWxzLT5nZXRBcHAxQnVmZmVyKCk7CisKKyAgICAvL0Fzc2VtYmxlIHRoZSBBUFAxIG1hcmtlciBidWZmZXIgcmVxdWlyZWQgYnkgTWVkaWFDb2RlYworICAgIHVpbnQ4X3Qga0V4aWZBcHAxTWFya2VyW10gPSB7J0UnLCAneCcsICdpJywgJ2YnLCAweEZGLCAweEUxLCAweDAwLCAweDAwfTsKKyAgICBrRXhpZkFwcDFNYXJrZXJbNl0gPSBzdGF0aWNfY2FzdDx1aW50OF90PihuZXdBcHAxTGVuZ3RoID4+IDgpOworICAgIGtFeGlmQXBwMU1hcmtlcls3XSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KG5ld0FwcDFMZW5ndGggJiAweEZGKTsKKyAgICBzaXplX3QgYXBwU2VnbWVudEJ1ZmZlclNpemUgPSBzaXplb2Yoa0V4aWZBcHAxTWFya2VyKSArCisgICAgICAgICAgICBhcHBTZWdtZW50U2l6ZSAtIGFwcDFTaXplICsgbmV3QXBwMUxlbmd0aDsKKyAgICB1aW50OF90KiBhcHBTZWdtZW50QnVmZmVyID0gbmV3IHVpbnQ4X3RbYXBwU2VnbWVudEJ1ZmZlclNpemVdOworICAgIG1lbWNweShhcHBTZWdtZW50QnVmZmVyLCBrRXhpZkFwcDFNYXJrZXIsIHNpemVvZihrRXhpZkFwcDFNYXJrZXIpKTsKKyAgICBtZW1jcHkoYXBwU2VnbWVudEJ1ZmZlciArIHNpemVvZihrRXhpZkFwcDFNYXJrZXIpLCBuZXdBcHAxU2VnbWVudCwgbmV3QXBwMUxlbmd0aCk7CisgICAgaWYgKGFwcFNlZ21lbnRTaXplIC0gYXBwMVNpemUgPiAwKSB7CisgICAgICAgIG1lbWNweShhcHBTZWdtZW50QnVmZmVyICsgc2l6ZW9mKGtFeGlmQXBwMU1hcmtlcikgKyBuZXdBcHAxTGVuZ3RoLAorICAgICAgICAgICAgICAgIGlucHV0RnJhbWUuYXBwU2VnbWVudEJ1ZmZlci5kYXRhICsgYXBwMVNpemUsIGFwcFNlZ21lbnRTaXplIC0gYXBwMVNpemUpOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGFCdWZmZXIgPSBuZXcgQUJ1ZmZlcihhcHBTZWdtZW50QnVmZmVyLCBhcHBTZWdtZW50QnVmZmVyU2l6ZSk7CisgICAgYXV0byByZXMgPSBpbnB1dEZyYW1lLm11eGVyLT53cml0ZVNhbXBsZURhdGEoYUJ1ZmZlciwgaW5wdXRGcmFtZS50cmFja0luZGV4LAorICAgICAgICAgICAgdGltZXN0YW1wLCBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19NVVhFUl9EQVRBKTsKKyAgICBkZWxldGVbXSBhcHBTZWdtZW50QnVmZmVyOworCisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBKUEVHIEFQUCBzZWdtZW50cyB0byBtdXhlcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgaW5wdXRGcmFtZS5hcHBTZWdtZW50V3JpdHRlbiA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OnByb2Nlc3NDb2RlY0lucHV0RnJhbWUoSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSkgeworICAgIGZvciAoYXV0byYgaW5wdXRCdWZmZXIgOiBpbnB1dEZyYW1lLmNvZGVjSW5wdXRCdWZmZXJzKSB7CisgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgYXV0byByZXMgPSBtQ29kZWMtPmdldElucHV0QnVmZmVyKGlucHV0QnVmZmVyLmluZGV4LCAmYnVmZmVyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBnZXR0aW5nIGNvZGVjIGlucHV0IGJ1ZmZlcjogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29weSBvbmUgdGlsZSBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbi4KKyAgICAgICAgc2l6ZV90IHRpbGVYID0gaW5wdXRCdWZmZXIudGlsZUluZGV4ICUgbUdyaWRDb2xzOworICAgICAgICBzaXplX3QgdGlsZVkgPSBpbnB1dEJ1ZmZlci50aWxlSW5kZXggLyBtR3JpZENvbHM7CisgICAgICAgIHNpemVfdCB0b3AgPSBtR3JpZEhlaWdodCAqIHRpbGVZOworICAgICAgICBzaXplX3QgbGVmdCA9IG1HcmlkV2lkdGggKiB0aWxlWDsKKyAgICAgICAgc2l6ZV90IHdpZHRoID0gKHRpbGVYID09IHN0YXRpY19jYXN0PHNpemVfdD4obUdyaWRDb2xzKSAtIDEpID8KKyAgICAgICAgICAgICAgICBtT3V0cHV0V2lkdGggLSB0aWxlWCAqIG1HcmlkV2lkdGggOiBtR3JpZFdpZHRoOworICAgICAgICBzaXplX3QgaGVpZ2h0ID0gKHRpbGVZID09IHN0YXRpY19jYXN0PHNpemVfdD4obUdyaWRSb3dzKSAtIDEpID8KKyAgICAgICAgICAgICAgICBtT3V0cHV0SGVpZ2h0IC0gdGlsZVkgKiBtR3JpZEhlaWdodCA6IG1HcmlkSGVpZ2h0OworICAgICAgICBBTE9HVigiJXM6IGlucHV0QnVmZmVyIHRpbGVJbmRleCBbJXp1LCAlenVdLCB0b3AgJXp1LCBsZWZ0ICV6dSwgd2lkdGggJXp1LCBoZWlnaHQgJXp1IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHRpbGVYLCB0aWxlWSwgdG9wLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0KTsKKworICAgICAgICByZXMgPSBjb3B5T25lWXV2VGlsZShidWZmZXIsIGlucHV0RnJhbWUueXV2QnVmZmVyLCB0b3AsIGxlZnQsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjb3B5IFlVViB0aWxlICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIHJlcyA9IG1Db2RlYy0+cXVldWVJbnB1dEJ1ZmZlcihpbnB1dEJ1ZmZlci5pbmRleCwgMCwgYnVmZmVyLT5jYXBhY2l0eSgpLAorICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLnRpbWVVcywgMCwgbnVsbHB0ciAvKmVycm9yRGV0YWlsTXNnKi8pOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBxdWV1ZUlucHV0QnVmZmVyIHRvIENvZGVjOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnB1dEZyYW1lLmNvZGVjSW5wdXRCdWZmZXJzLmNsZWFyKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpwcm9jZXNzT25lQ29kZWNPdXRwdXRGcmFtZShuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSkgeworICAgIGF1dG8gaXQgPSBpbnB1dEZyYW1lLmNvZGVjT3V0cHV0QnVmZmVycy5iZWdpbigpOworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlcjsKKyAgICBzdGF0dXNfdCByZXMgPSBtQ29kZWMtPmdldE91dHB1dEJ1ZmZlcihpdC0+aW5kZXgsICZidWZmZXIpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBnZXR0aW5nIEhlaWMgY29kZWMgb3V0cHV0IGJ1ZmZlciBhdCBpbmRleCAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpdC0+aW5kZXgsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEhlaWMgY29kZWMgb3V0cHV0IGJ1ZmZlciBhdCBpbmRleCAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpdC0+aW5kZXgpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGFCdWZmZXIgPSBuZXcgQUJ1ZmZlcihidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworICAgIHJlcyA9IGlucHV0RnJhbWUubXV4ZXItPndyaXRlU2FtcGxlRGF0YSgKKyAgICAgICAgICAgIGFCdWZmZXIsIGlucHV0RnJhbWUudHJhY2tJbmRleCwgdGltZXN0YW1wLCAwIC8qZmxhZ3MqLyk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBidWZmZXIgaW5kZXggJWQgdG8gbXV4ZXI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaXQtPmluZGV4LCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBtQ29kZWMtPnJlbGVhc2VPdXRwdXRCdWZmZXIoaXQtPmluZGV4KTsKKyAgICBpZiAoaW5wdXRGcmFtZS5wZW5kaW5nT3V0cHV0VGlsZXMgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IENvZGVjIGdlbmVyYXRlZCBtb3JlIHRpbGVzIHRoYW4gZXhwZWN0ZWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnB1dEZyYW1lLnBlbmRpbmdPdXRwdXRUaWxlcy0tOworICAgIH0KKworICAgIGlucHV0RnJhbWUuY29kZWNPdXRwdXRCdWZmZXJzLmVyYXNlKGlucHV0RnJhbWUuY29kZWNPdXRwdXRCdWZmZXJzLmJlZ2luKCkpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6cHJvY2Vzc0NvbXBsZXRlZElucHV0RnJhbWUobnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgIElucHV0RnJhbWUgJmlucHV0RnJhbWUpIHsKKyAgICBzcDxBTmF0aXZlV2luZG93PiBvdXRwdXRBTlcgPSBtT3V0cHV0U3VyZmFjZTsKKyAgICBpbnB1dEZyYW1lLm11eGVyLT5zdG9wKCk7CisKKyAgICAvLyBDb3B5IHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIHRvIG1lbW9yeS4KKyAgICBzcDxHcmFwaGljQnVmZmVyPiBnYiA9IEdyYXBoaWNCdWZmZXI6OmZyb20oaW5wdXRGcmFtZS5hbmIpOworICAgIHZvaWQqIGRzdEJ1ZmZlcjsKKyAgICBhdXRvIHJlcyA9IGdiLT5sb2NrQXN5bmMoR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgJmRzdEJ1ZmZlciwgaW5wdXRGcmFtZS5mZW5jZUZkKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3IgdHJ5aW5nIHRvIGxvY2sgb3V0cHV0IGJ1ZmZlciBmZW5jZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBvZmZfdCBmU2l6ZSA9IGxzZWVrKGlucHV0RnJhbWUuZmlsZUZkLCAwLCBTRUVLX0VORCk7CisgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4oZlNpemUpID4gbU1heEhlaWNCdWZmZXJTaXplIC0gc2l6ZW9mKENhbWVyYUJsb2IpKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IE1lZGlhTXV4ZXIgb3V0cHV0IHNpemUgJWxkIGlzIGxhcmdlciB0aGFuIGJ1ZmZlciBzaXplciAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZlNpemUsIG1NYXhIZWljQnVmZmVyU2l6ZSAtIHNpemVvZihDYW1lcmFCbG9iKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbHNlZWsoaW5wdXRGcmFtZS5maWxlRmQsIDAsIFNFRUtfU0VUKTsKKyAgICBzc2l6ZV90IGJ5dGVzUmVhZCA9IHJlYWQoaW5wdXRGcmFtZS5maWxlRmQsIGRzdEJ1ZmZlciwgZlNpemUpOworICAgIGlmIChieXRlc1JlYWQgPCBmU2l6ZSkgeworICAgICAgICBBTE9HRSgiJXM6IE9ubHkgJXpkIG9mICVsZCBieXRlcyByZWFkIiwgX19GVU5DVElPTl9fLCBieXRlc1JlYWQsIGZTaXplKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjbG9zZShpbnB1dEZyYW1lLmZpbGVGZCk7CisgICAgaW5wdXRGcmFtZS5maWxlRmQgPSAtMTsKKworICAgIC8vIEZpbGwgaW4gSEVJQyBoZWFkZXIKKyAgICB1aW50OF90ICpoZWFkZXIgPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oZHN0QnVmZmVyKSArIG1NYXhIZWljQnVmZmVyU2l6ZSAtIHNpemVvZihDYW1lcmFCbG9iKTsKKyAgICBzdHJ1Y3QgQ2FtZXJhQmxvYiAqYmxvYkhlYWRlciA9IChzdHJ1Y3QgQ2FtZXJhQmxvYiAqKWhlYWRlcjsKKyAgICAvLyBNdXN0IGJlIGluIHN5bmMgd2l0aCBDQU1FUkEzX0hFSUNfQkxPQl9JRCBpbiBhbmRyb2lkX21lZGlhX1V0aWxzLmNwcAorICAgIGJsb2JIZWFkZXItPmJsb2JJZCA9IHN0YXRpY19jYXN0PENhbWVyYUJsb2JJZD4oMHgwMEZFKTsKKyAgICBibG9iSGVhZGVyLT5ibG9iU2l6ZSA9IGZTaXplOworCisgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190aW1lc3RhbXAobU91dHB1dFN1cmZhY2UuZ2V0KCksIHRpbWVzdGFtcCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRXJyb3Igc2V0dGluZyB0aW1lc3RhbXA6ICVzICglZCkiLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBnZXRTdHJlYW1JZCgpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXMgPSBvdXRwdXRBTlctPnF1ZXVlQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBpbnB1dEZyYW1lLmFuYiwgLypmZW5jZSovIC0xKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHF1ZXVlQnVmZmVyIHRvIEhlaWMgc3RyZWFtOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpbnB1dEZyYW1lLmFuYiA9IG51bGxwdHI7CisKKyAgICBBVFJBQ0VfQVNZTkNfRU5EKCJIRUlDIGNhcHR1cmUiLCBpbnB1dEZyYW1lLmZyYW1lTnVtYmVyKTsKKyAgICByZXR1cm4gT0s7Cit9CisKKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpyZWxlYXNlSW5wdXRGcmFtZUxvY2tlZChJbnB1dEZyYW1lICppbnB1dEZyYW1lIC8qb3V0Ki8pIHsKKyAgICBpZiAoaW5wdXRGcmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaW5wdXRGcmFtZS0+YXBwU2VnbWVudEJ1ZmZlci5kYXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUFwcFNlZ21lbnRDb25zdW1lci0+dW5sb2NrQnVmZmVyKGlucHV0RnJhbWUtPmFwcFNlZ21lbnRCdWZmZXIpOworICAgICAgICBpbnB1dEZyYW1lLT5hcHBTZWdtZW50QnVmZmVyLmRhdGEgPSBudWxscHRyOworICAgICAgICBtQXBwU2VnbWVudEJ1ZmZlckFjcXVpcmVkID0gZmFsc2U7CisgICAgfQorCisgICAgd2hpbGUgKCFpbnB1dEZyYW1lLT5jb2RlY091dHB1dEJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGl0ID0gaW5wdXRGcmFtZS0+Y29kZWNPdXRwdXRCdWZmZXJzLmJlZ2luKCk7CisgICAgICAgIEFMT0dWKCIlczogcmVsZWFzZU91dHB1dEJ1ZmZlciBpbmRleCAlZCIsIF9fRlVOQ1RJT05fXywgaXQtPmluZGV4KTsKKyAgICAgICAgbUNvZGVjLT5yZWxlYXNlT3V0cHV0QnVmZmVyKGl0LT5pbmRleCk7CisgICAgICAgIGlucHV0RnJhbWUtPmNvZGVjT3V0cHV0QnVmZmVycy5lcmFzZShpdCk7CisgICAgfQorCisgICAgaWYgKGlucHV0RnJhbWUtPnl1dkJ1ZmZlci5kYXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU1haW5JbWFnZUNvbnN1bWVyLT51bmxvY2tCdWZmZXIoaW5wdXRGcmFtZS0+eXV2QnVmZmVyKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+eXV2QnVmZmVyLmRhdGEgPSBudWxscHRyOworICAgICAgICBtWXV2QnVmZmVyQWNxdWlyZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICB3aGlsZSAoIWlucHV0RnJhbWUtPmNvZGVjSW5wdXRCdWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBpdCA9IGlucHV0RnJhbWUtPmNvZGVjSW5wdXRCdWZmZXJzLmJlZ2luKCk7CisgICAgICAgIGlucHV0RnJhbWUtPmNvZGVjSW5wdXRCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICBpZiAoKGlucHV0RnJhbWUtPmVycm9yIHx8IG1FcnJvclN0YXRlKSAmJiAhaW5wdXRGcmFtZS0+ZXJyb3JOb3RpZmllZCkgeworICAgICAgICBub3RpZnlFcnJvcihpbnB1dEZyYW1lLT5mcmFtZU51bWJlcik7CisgICAgICAgIGlucHV0RnJhbWUtPmVycm9yTm90aWZpZWQgPSB0cnVlOworICAgIH0KKworICAgIGlmIChpbnB1dEZyYW1lLT5maWxlRmQgPj0gMCkgeworICAgICAgICBjbG9zZShpbnB1dEZyYW1lLT5maWxlRmQpOworICAgICAgICBpbnB1dEZyYW1lLT5maWxlRmQgPSAtMTsKKyAgICB9CisKKyAgICBpZiAoaW5wdXRGcmFtZS0+YW5iICE9IG51bGxwdHIpIHsKKyAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gb3V0cHV0QU5XID0gbU91dHB1dFN1cmZhY2U7CisgICAgICAgIG91dHB1dEFOVy0+Y2FuY2VsQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBpbnB1dEZyYW1lLT5hbmIsIC8qZmVuY2UqLyAtMSk7CisgICAgICAgIGlucHV0RnJhbWUtPmFuYiA9IG51bGxwdHI7CisgICAgfQorfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06OnJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZChpbnQ2NF90IGN1cnJlbnRUcykgeworICAgIGF1dG8gaXQgPSBtUGVuZGluZ0lucHV0RnJhbWVzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1QZW5kaW5nSW5wdXRGcmFtZXMuZW5kKCkpIHsKKyAgICAgICAgaWYgKGl0LT5maXJzdCA8PSBjdXJyZW50VHMpIHsKKyAgICAgICAgICAgIHJlbGVhc2VJbnB1dEZyYW1lTG9ja2VkKCZpdC0+c2Vjb25kKTsKKyAgICAgICAgICAgIGl0ID0gbVBlbmRpbmdJbnB1dEZyYW1lcy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpdCsrOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjppbml0aWFsaXplQ29kZWModWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4mIGNhbWVyYURldmljZSkgeworICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBib29sIHVzZUdyaWQgPSBmYWxzZTsKKyAgICBib29sIGlzU2l6ZVN1cHBvcnRlZCA9IGlzU2l6ZVN1cHBvcnRlZEJ5SGVpZkVuY29kZXIod2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICZtVXNlSGVpYywgJnVzZUdyaWQsIG51bGxwdHIpOworICAgIGlmICghaXNTaXplU3VwcG9ydGVkKSB7CisgICAgICAgIEFMT0dFKCIlczogRW5jb2RlciBkb2VzbnQnIHN1cHBvcnQgc2l6ZSAldSB4ICV1ISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgTG9vcGVyIGZvciBNZWRpYUNvZGVjLgorICAgIGF1dG8gZGVzaXJlZE1pbWUgPSBtVXNlSGVpYyA/IE1JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyA6IE1JTUVUWVBFX1ZJREVPX0hFVkM7CisgICAgbUNvZGVjTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbUNvZGVjTG9vcGVyLT5zZXROYW1lKCJDYW1lcmEzLUhlaWNDb21wb3NpdGUtTWVkaWFDb2RlY0xvb3BlciIpOworICAgIHN0YXR1c190IHJlcyA9IG1Db2RlY0xvb3Blci0+c3RhcnQoCisgICAgICAgICAgICBmYWxzZSwgICAvLyBydW5PbkNhbGxpbmdUaHJlYWQKKyAgICAgICAgICAgIGZhbHNlLCAgICAvLyBjYW5DYWxsSmF2YQorICAgICAgICAgICAgUFJJT1JJVFlfQVVESU8pOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gc3RhcnQgY29kZWMgbG9vcGVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgSEVJQy9IRVZDIGNvZGVjLgorICAgIG1Db2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5VHlwZShtQ29kZWNMb29wZXIsIGRlc2lyZWRNaW1lLCB0cnVlIC8qZW5jb2RlciovKTsKKyAgICBpZiAobUNvZGVjID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIGNvZGVjIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZGVzaXJlZE1pbWUpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgTG9vcGVyIGFuZCBoYW5kbGVyIGZvciBDb2RlYyBjYWxsYmFjay4KKyAgICBtQ29kZWNDYWxsYmFja0hhbmRsZXIgPSBuZXcgQ29kZWNDYWxsYmFja0hhbmRsZXIodGhpcyk7CisgICAgaWYgKG1Db2RlY0NhbGxiYWNrSGFuZGxlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBjb2RlYyBjYWxsYmFjayBoYW5kbGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgbUNhbGxiYWNrTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbUNhbGxiYWNrTG9vcGVyLT5zZXROYW1lKCJDYW1lcmEzLUhlaWNDb21wb3NpdGUtTWVkaWFDb2RlY0NhbGxiYWNrTG9vcGVyIik7CisgICAgcmVzID0gbUNhbGxiYWNrTG9vcGVyLT5zdGFydCgKKyAgICAgICAgICAgIGZhbHNlLCAgIC8vIHJ1bk9uQ2FsbGluZ1RocmVhZAorICAgICAgICAgICAgZmFsc2UsICAgIC8vIGNhbkNhbGxKYXZhCisgICAgICAgICAgICBQUklPUklUWV9BVURJTyk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBzdGFydCBtZWRpYSBjYWxsYmFjayBsb29wZXI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBtQ2FsbGJhY2tMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtQ29kZWNDYWxsYmFja0hhbmRsZXIpOworCisgICAgbUFzeW5jTm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FsbGJhY2tOb3RpZnksIG1Db2RlY0NhbGxiYWNrSGFuZGxlcik7CisgICAgcmVzID0gbUNvZGVjLT5zZXRDYWxsYmFjayhtQXN5bmNOb3RpZnkpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gc2V0IE1lZGlhQ29kZWMgY2FsbGJhY2s6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIG91dHB1dCBmb3JtYXQgYW5kIGNvbmZpZ3VyZSB0aGUgQ29kZWMuCisgICAgc3A8QU1lc3NhZ2U+IG91dHB1dEZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgIG91dHB1dEZvcm1hdC0+c2V0U3RyaW5nKEtFWV9NSU1FLCBkZXNpcmVkTWltZSk7CisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQklUUkFURV9NT0RFLCBCSVRSQVRFX01PREVfQ1EpOworICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX1FVQUxJVFksIGtEZWZhdWx0SnBlZ1F1YWxpdHkpOworICAgIC8vIEFzayBjb2RlYyB0byBza2lwIHRpbWVzdGFtcCBjaGVjayBhbmQgZW5jb2RlIGFsbCBmcmFtZXMuCisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQ2NCgibWF4LXB0cy1nYXAtdG8tZW5jb2RlciIsIGtOb0ZyYW1lRHJvcE1heFB0c0dhcCk7CisKKyAgICBpbnQzMl90IGdyaWRXaWR0aCwgZ3JpZEhlaWdodCwgZ3JpZFJvd3MsIGdyaWRDb2xzOworICAgIGlmICh1c2VHcmlkIHx8IG1Vc2VIZWljKSB7CisgICAgICAgIGdyaWRXaWR0aCA9IEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmtHcmlkV2lkdGg7CisgICAgICAgIGdyaWRIZWlnaHQgPSBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjprR3JpZEhlaWdodDsKKyAgICAgICAgZ3JpZFJvd3MgPSAoaGVpZ2h0ICsgZ3JpZEhlaWdodCAtIDEpL2dyaWRIZWlnaHQ7CisgICAgICAgIGdyaWRDb2xzID0gKHdpZHRoICsgZ3JpZFdpZHRoIC0gMSkvZ3JpZFdpZHRoOworCisgICAgICAgIGlmIChtVXNlSGVpYykgeworICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfVElMRV9XSURUSCwgZ3JpZFdpZHRoKTsKKyAgICAgICAgICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX1RJTEVfSEVJR0hULCBncmlkSGVpZ2h0KTsKKyAgICAgICAgICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0dSSURfQ09MVU1OUywgZ3JpZENvbHMpOworICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfR1JJRF9ST1dTLCBncmlkUm93cyk7CisgICAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICAgIGdyaWRXaWR0aCA9IHdpZHRoOworICAgICAgICBncmlkSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBncmlkUm93cyA9IDE7CisgICAgICAgIGdyaWRDb2xzID0gMTsKKyAgICB9CisKKyAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9XSURUSCwgIXVzZUdyaWQgPyB3aWR0aCA6IGdyaWRXaWR0aCk7CisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfSEVJR0hULCAhdXNlR3JpZCA/IGhlaWdodCA6IGdyaWRIZWlnaHQpOworICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0lfRlJBTUVfSU5URVJWQUwsIDApOworICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX0ZPUk1BVCwKKyAgICAgICAgICAgIHVzZUdyaWQgPyBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZSA6IENPTE9SX0Zvcm1hdFN1cmZhY2UpOworICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0ZSQU1FX1JBVEUsIGdyaWRSb3dzICogZ3JpZENvbHMpOworICAgIC8vIFRoaXMgb25seSBzZXJ2ZXMgYXMgYSBoaW50IHRvIGVuY29kZXIgd2hlbiBlbmNvZGluZyBpcyBub3QgcmVhbC10aW1lLgorICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX09QRVJBVElOR19SQVRFLCB1c2VHcmlkID8ga0dyaWRPcFJhdGUgOiBrTm9HcmlkT3BSYXRlKTsKKworICAgIHJlcyA9IG1Db2RlYy0+Y29uZmlndXJlKG91dHB1dEZvcm1hdCwgbnVsbHB0ciAvKm5hdGl2ZVdpbmRvdyovLAorICAgICAgICAgICAgbnVsbHB0ciAvKmNyeXB0byovLCBDT05GSUdVUkVfRkxBR19FTkNPREUpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY29uZmlndXJlIGNvZGVjOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIG1HcmlkV2lkdGggPSBncmlkV2lkdGg7CisgICAgbUdyaWRIZWlnaHQgPSBncmlkSGVpZ2h0OworICAgIG1HcmlkUm93cyA9IGdyaWRSb3dzOworICAgIG1HcmlkQ29scyA9IGdyaWRDb2xzOworICAgIG1Vc2VHcmlkID0gdXNlR3JpZDsKKyAgICBtT3V0cHV0V2lkdGggPSB3aWR0aDsKKyAgICBtT3V0cHV0SGVpZ2h0ID0gaGVpZ2h0OworICAgIG1BcHBTZWdtZW50TWF4U2l6ZSA9IGNhbGNBcHBTZWdtZW50TWF4U2l6ZShjYW1lcmFEZXZpY2UtPmluZm8oKSk7CisgICAgbU1heEhlaWNCdWZmZXJTaXplID0gbU91dHB1dFdpZHRoICogbU91dHB1dEhlaWdodCAqIDMgLyAyICsgbUFwcFNlZ21lbnRNYXhTaXplOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06OmRlaW5pdENvZGVjKCkgeworICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgaWYgKG1Db2RlYyAhPSBudWxscHRyKSB7CisgICAgICAgIG1Db2RlYy0+c3RvcCgpOworICAgICAgICBtQ29kZWMtPnJlbGVhc2UoKTsKKyAgICAgICAgbUNvZGVjLmNsZWFyKCk7CisgICAgfQorCisgICAgaWYgKG1Db2RlY0xvb3BlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1Db2RlY0xvb3Blci0+c3RvcCgpOworICAgICAgICBtQ29kZWNMb29wZXIuY2xlYXIoKTsKKyAgICB9CisKKyAgICBpZiAobUNhbGxiYWNrTG9vcGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUNhbGxiYWNrTG9vcGVyLT5zdG9wKCk7CisgICAgICAgIG1DYWxsYmFja0xvb3Blci5jbGVhcigpOworICAgIH0KKworICAgIG1Bc3luY05vdGlmeS5jbGVhcigpOworICAgIG1Gb3JtYXQuY2xlYXIoKTsKK30KKworLy8gUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb21wbGV0ZSBsaXN0IG9mIGFwcCBzZWdtZW50LCAwIGluZGljYXRlcyBmYWlsdXJlCitzaXplX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6ZmluZEFwcFNlZ21lbnRzU2l6ZShjb25zdCB1aW50OF90KiBhcHBTZWdtZW50QnVmZmVyLAorICAgICAgICBzaXplX3QgbWF4U2l6ZSwgc2l6ZV90ICphcHAxU2VnbWVudFNpemUpIHsKKyAgICBpZiAoYXBwU2VnbWVudEJ1ZmZlciA9PSBudWxscHRyIHx8IGFwcDFTZWdtZW50U2l6ZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBpbnB1dCBhcHBTZWdtZW50QnVmZmVyICVwLCBhcHAxU2VnbWVudFNpemUgJXAiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYXBwU2VnbWVudEJ1ZmZlciwgYXBwMVNlZ21lbnRTaXplKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IDA7CisgICAgLy8gRmlyc3QgY2hlY2sgZm9yIEVYSUYgdHJhbnNwb3J0IGhlYWRlciBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIKKyAgICBjb25zdCB1aW50OF90ICpoZWFkZXIgPSBhcHBTZWdtZW50QnVmZmVyICsgKG1heFNpemUgLSBzaXplb2Yoc3RydWN0IENhbWVyYUJsb2IpKTsKKyAgICBjb25zdCBzdHJ1Y3QgQ2FtZXJhQmxvYiAqYmxvYiA9IChjb25zdCBzdHJ1Y3QgQ2FtZXJhQmxvYiopKGhlYWRlcik7CisgICAgaWYgKGJsb2ItPmJsb2JJZCAhPSBDYW1lcmFCbG9iSWQ6OkpQRUdfQVBQX1NFR01FTlRTKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBFWElGIGJsb2JJZCAlaHUiLCBfX0ZVTkNUSU9OX18sIGJsb2ItPmJsb2JJZCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGV4cGVjdGVkU2l6ZSA9IGJsb2ItPmJsb2JTaXplOworICAgIGlmIChleHBlY3RlZFNpemUgPT0gMCB8fCBleHBlY3RlZFNpemUgPiBtYXhTaXplIC0gc2l6ZW9mKHN0cnVjdCBDYW1lcmFCbG9iKSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgYmxvYlNpemUgJXp1LiIsIF9fRlVOQ1RJT05fXywgZXhwZWN0ZWRTaXplKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdWludDMyX3QgdG90YWxTaXplID0gMDsKKworICAgIC8vIFZlcmlmeSBBUFAxIG1hcmtlciAobWFuZGF0b3J5KQorICAgIHVpbnQ4X3QgYXBwMU1hcmtlcltdID0gezB4RkYsIDB4RTF9OworICAgIGlmIChtZW1jbXAoYXBwU2VnbWVudEJ1ZmZlciwgYXBwMU1hcmtlciwgc2l6ZW9mKGFwcDFNYXJrZXIpKSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgQVBQMSBtYXJrZXI6ICV4LCAleCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBhcHBTZWdtZW50QnVmZmVyWzBdLCBhcHBTZWdtZW50QnVmZmVyWzFdKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHRvdGFsU2l6ZSArPSBzaXplb2YoYXBwMU1hcmtlcik7CisKKyAgICB1aW50MTZfdCBhcHAxU2l6ZSA9IChzdGF0aWNfY2FzdDx1aW50MTZfdD4oYXBwU2VnbWVudEJ1ZmZlclt0b3RhbFNpemVdKSA8PCA4KSArCisgICAgICAgICAgICBhcHBTZWdtZW50QnVmZmVyW3RvdGFsU2l6ZSsxXTsKKyAgICB0b3RhbFNpemUgKz0gYXBwMVNpemU7CisKKyAgICBBTE9HVigiJXM6IEV4cGVjdGVkIEFQUCBzZWdtZW50cyBzaXplICV6dSwgQVBQMSBzZWdtZW50IHNpemUgJXUiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBleHBlY3RlZFNpemUsIGFwcDFTaXplKTsKKyAgICB3aGlsZSAodG90YWxTaXplIDwgZXhwZWN0ZWRTaXplKSB7CisgICAgICAgIGlmIChhcHBTZWdtZW50QnVmZmVyW3RvdGFsU2l6ZV0gIT0gMHhGRiB8fAorICAgICAgICAgICAgICAgIGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplKzFdIDw9IDB4RTEgfHwKKyAgICAgICAgICAgICAgICBhcHBTZWdtZW50QnVmZmVyW3RvdGFsU2l6ZSsxXSA+IDB4RUYpIHsKKyAgICAgICAgICAgIC8vIEludmFsaWQgQVBQbiBtYXJrZXIKKyAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBBUFBuIG1hcmtlcjogJXgsICV4IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBhcHBTZWdtZW50QnVmZmVyW3RvdGFsU2l6ZV0sIGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplKzFdKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHRvdGFsU2l6ZSArPSAyOworCisgICAgICAgIHVpbnQxNl90IGFwcG5TaXplID0gKHN0YXRpY19jYXN0PHVpbnQxNl90PihhcHBTZWdtZW50QnVmZmVyW3RvdGFsU2l6ZV0pIDw8IDgpICsKKyAgICAgICAgICAgICAgICBhcHBTZWdtZW50QnVmZmVyW3RvdGFsU2l6ZSsxXTsKKyAgICAgICAgdG90YWxTaXplICs9IGFwcG5TaXplOworICAgIH0KKworICAgIGlmICh0b3RhbFNpemUgIT0gZXhwZWN0ZWRTaXplKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBKUEVHIEFQUCBzZWdtZW50czogdG90YWxTaXplICV1IHZzIGV4cGVjdGVkIHNpemUgJXp1IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHRvdGFsU2l6ZSwgZXhwZWN0ZWRTaXplKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgKmFwcDFTZWdtZW50U2l6ZSA9IGFwcDFTaXplICsgc2l6ZW9mKGFwcDFNYXJrZXIpOworICAgIHJldHVybiBleHBlY3RlZFNpemU7Cit9CisKK2ludDY0X3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6ZmluZFRpbWVzdGFtcEluTnNMb2NrZWQoaW50NjRfdCB0aW1lSW5VcykgeworICAgIGZvciAoY29uc3QgYXV0byYgZm4gOiBtRnJhbWVOdW1iZXJNYXApIHsKKyAgICAgICAgaWYgKHRpbWVJblVzID09IG5zMnVzKGZuLnNlY29uZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmbi5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBpbnB1dEZyYW1lIDogbVBlbmRpbmdJbnB1dEZyYW1lcykgeworICAgICAgICBpZiAodGltZUluVXMgPT0gbnMydXMoaW5wdXRGcmFtZS5maXJzdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dEZyYW1lLmZpcnN0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Y29weU9uZVl1dlRpbGUoc3A8TWVkaWFDb2RlY0J1ZmZlcj4mIGNvZGVjQnVmZmVyLAorICAgICAgICBjb25zdCBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyJiB5dXZCdWZmZXIsCisgICAgICAgIHNpemVfdCB0b3AsIHNpemVfdCBsZWZ0LCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgLy8gR2V0IHN0cmlkZSBpbmZvcm1hdGlvbiBmb3IgY29kZWNCdWZmZXIKKyAgICBzcDxBQnVmZmVyPiBpbWFnZURhdGE7CisgICAgaWYgKCFjb2RlY0J1ZmZlci0+bWV0YSgpLT5maW5kQnVmZmVyKCJpbWFnZS1kYXRhIiwgJmltYWdlRGF0YSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb2RlYyBpbnB1dCBidWZmZXIgaXMgbm90IGZvciBpbWFnZSBkYXRhISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChpbWFnZURhdGEtPnNpemUoKSAhPSBzaXplb2YoTWVkaWFJbWFnZTIpKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjb2RlYyBpbnB1dCBpbWFnZSBzaXplICV6dSwgZXhwZWN0ZWQgJXp1IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGltYWdlRGF0YS0+c2l6ZSgpLCBzaXplb2YoTWVkaWFJbWFnZTIpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTWVkaWFJbWFnZTIqIGltYWdlSW5mbyA9IHJlaW50ZXJwcmV0X2Nhc3Q8TWVkaWFJbWFnZTIqPihpbWFnZURhdGEtPmRhdGEoKSk7CisgICAgaWYgKGltYWdlSW5mby0+bVR5cGUgIT0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfWVVWIHx8CisgICAgICAgICAgICBpbWFnZUluZm8tPm1CaXREZXB0aCAhPSA4IHx8CisgICAgICAgICAgICBpbWFnZUluZm8tPm1CaXREZXB0aEFsbG9jYXRlZCAhPSA4IHx8CisgICAgICAgICAgICBpbWFnZUluZm8tPm1OdW1QbGFuZXMgIT0gMykgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY29kZWMgaW5wdXQgaW1hZ2UgaW5mbzogbVR5cGUgJWQsIG1CaXREZXB0aCAlZCwgIgorICAgICAgICAgICAgICAgICJtQml0RGVwdGhBbGxvY2F0ZWQgJWQsIG1OdW1QbGFuZXMgJWQhIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVR5cGUsIGltYWdlSW5mby0+bUJpdERlcHRoLAorICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bUJpdERlcHRoQWxsb2NhdGVkLCBpbWFnZUluZm8tPm1OdW1QbGFuZXMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEFMT0dWKCIlczogeXV2QnVmZmVyIGNocm9tYVN0ZXAgJWQsIGNocm9tYVN0cmlkZSAlZCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHl1dkJ1ZmZlci5jaHJvbWFTdGVwLCB5dXZCdWZmZXIuY2hyb21hU3RyaWRlKTsKKyAgICBBTE9HVigiJXM6IFUgb2Zmc2V0ICV1LCBWIG9mZnNldCAldSwgVSByb3dJbmMgJWQsIFYgcm93SW5jICVkLCBVIGNvbEluYyAlZCwgViBjb2xJbmMgJWQiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubU9mZnNldCwKKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tT2Zmc2V0LAorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1Sb3dJbmMsCisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubVJvd0luYywKKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tQ29sSW5jLAorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1Db2xJbmMpOworCisgICAgLy8gWQorICAgIGZvciAoYXV0byByb3cgPSB0b3A7IHJvdyA8IHRvcCtoZWlnaHQ7IHJvdysrKSB7CisgICAgICAgIHVpbnQ4X3QgKmRzdCA9IGNvZGVjQnVmZmVyLT5kYXRhKCkgKyBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6WV0ubU9mZnNldCArCisgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlldLm1Sb3dJbmMgKiAocm93IC0gdG9wKTsKKyAgICAgICAgbUZuQ29weVJvdyh5dXZCdWZmZXIuZGF0YStyb3cqeXV2QnVmZmVyLnN0cmlkZStsZWZ0LCBkc3QsIHdpZHRoKTsKKyAgICB9CisKKyAgICAvLyBVIGlzIENiLCBWIGlzIENyCisgICAgYm9vbCBjb2RlY1VQbGFuZUZpcnN0ID0gaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1PZmZzZXQgPgorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1PZmZzZXQ7CisgICAgdWludDMyX3QgY29kZWNVdk9mZnNldERpZmYgPSBjb2RlY1VQbGFuZUZpcnN0ID8KKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tT2Zmc2V0IC0gaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1PZmZzZXQgOgorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1PZmZzZXQgLSBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubU9mZnNldDsKKyAgICBib29sIGlzQ29kZWNVdlNlbWlwbGFubmFyID0gKGNvZGVjVXZPZmZzZXREaWZmID09IDEpICYmCisgICAgICAgICAgICAoaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1Sb3dJbmMgPT0KKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tUm93SW5jKSAmJgorICAgICAgICAgICAgKGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tQ29sSW5jID09IDIpICYmCisgICAgICAgICAgICAoaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1Db2xJbmMgPT0gMik7CisgICAgYm9vbCBpc0NvZGVjVXZQbGFubmFyID0KKyAgICAgICAgICAgICgoY29kZWNVUGxhbmVGaXJzdCAmJiBjb2RlY1V2T2Zmc2V0RGlmZiA+PQorICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubVJvd0luYyAqIGltYWdlSW5mby0+bUhlaWdodC8yKSB8fAorICAgICAgICAgICAgKCghY29kZWNVUGxhbmVGaXJzdCAmJiBjb2RlY1V2T2Zmc2V0RGlmZiA+PQorICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubVJvd0luYyAqIGltYWdlSW5mby0+bUhlaWdodC8yKSkpICYmCisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubUNvbEluYyA9PSAxICYmCisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubUNvbEluYyA9PSAxOworICAgIGJvb2wgY2FtZXJhVVBsYW5lRmlyc3QgPSB5dXZCdWZmZXIuZGF0YUNyID4geXV2QnVmZmVyLmRhdGFDYjsKKworICAgIGlmIChpc0NvZGVjVXZTZW1pcGxhbm5hciAmJiB5dXZCdWZmZXIuY2hyb21hU3RlcCA9PSAyICYmCisgICAgICAgICAgICAoY29kZWNVUGxhbmVGaXJzdCA9PSBjYW1lcmFVUGxhbmVGaXJzdCkpIHsKKyAgICAgICAgLy8gVVYgc2VtaXBsYW5uYXIKKyAgICAgICAgLy8gVGhlIGNocm9tZSBwbGFuZSBjb3VsZCBiZSBlaXRoZXIgQ2IgZmlyc3QsIG9yIENyIGZpcnN0LiBUYWtlIHRoZQorICAgICAgICAvLyBzbWFsbGVyIGFkZHJlc3MuCisgICAgICAgIHVpbnQ4X3QgKnNyYyA9IHN0ZDo6bWluKHl1dkJ1ZmZlci5kYXRhQ2IsIHl1dkJ1ZmZlci5kYXRhQ3IpOworICAgICAgICBNZWRpYUltYWdlMjo6UGxhbmVJbmRleCBkc3RQbGFuZSA9IGNvZGVjVXZPZmZzZXREaWZmID4gMCA/IE1lZGlhSW1hZ2UyOjpVIDogTWVkaWFJbWFnZTI6OlY7CisgICAgICAgIGZvciAoYXV0byByb3cgPSB0b3AvMjsgcm93IDwgKHRvcCtoZWlnaHQpLzI7IHJvdysrKSB7CisgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBjb2RlY0J1ZmZlci0+ZGF0YSgpICsgaW1hZ2VJbmZvLT5tUGxhbmVbZHN0UGxhbmVdLm1PZmZzZXQgKworICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtkc3RQbGFuZV0ubVJvd0luYyAqIChyb3cgLSB0b3AvMik7CisgICAgICAgICAgICBtRm5Db3B5Um93KHNyYytyb3cqeXV2QnVmZmVyLmNocm9tYVN0cmlkZStsZWZ0LCBkc3QsIHdpZHRoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXNDb2RlY1V2UGxhbm5hciAmJiB5dXZCdWZmZXIuY2hyb21hU3RlcCA9PSAxKSB7CisgICAgICAgIC8vIFUgcGxhbmUKKyAgICAgICAgZm9yIChhdXRvIHJvdyA9IHRvcC8yOyByb3cgPCAodG9wK2hlaWdodCkvMjsgcm93KyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IGNvZGVjQnVmZmVyLT5kYXRhKCkgKyBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubU9mZnNldCArCisgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tUm93SW5jICogKHJvdyAtIHRvcC8yKTsKKyAgICAgICAgICAgIG1GbkNvcHlSb3coeXV2QnVmZmVyLmRhdGFDYityb3cqeXV2QnVmZmVyLmNocm9tYVN0cmlkZStsZWZ0LzIsIGRzdCwgd2lkdGgvMik7CisgICAgICAgIH0KKworICAgICAgICAvLyBWIHBsYW5lCisgICAgICAgIGZvciAoYXV0byByb3cgPSB0b3AvMjsgcm93IDwgKHRvcCtoZWlnaHQpLzI7IHJvdysrKSB7CisgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBjb2RlY0J1ZmZlci0+ZGF0YSgpICsgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1PZmZzZXQgKworICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubVJvd0luYyAqIChyb3cgLSB0b3AvMik7CisgICAgICAgICAgICBtRm5Db3B5Um93KHl1dkJ1ZmZlci5kYXRhQ3Ircm93Knl1dkJ1ZmZlci5jaHJvbWFTdHJpZGUrbGVmdC8yLCBkc3QsIHdpZHRoLzIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQ29udmVydCBiZXR3ZWVuIHNlbWlwbGFubmFyIGFuZCBwbGFubmFyLCBvciB3aGVuIFVWIG9yZGVycyBhcmUKKyAgICAgICAgLy8gZGlmZmVyZW50LgorICAgICAgICB1aW50OF90ICpkc3QgPSBjb2RlY0J1ZmZlci0+ZGF0YSgpOworICAgICAgICBmb3IgKGF1dG8gcm93ID0gdG9wLzI7IHJvdyA8ICh0b3AraGVpZ2h0KS8yOyByb3crKykgeworICAgICAgICAgICAgZm9yIChhdXRvIGNvbCA9IGxlZnQvMjsgY29sIDwgKGxlZnQrd2lkdGgpLzI7IGNvbCsrKSB7CisgICAgICAgICAgICAgICAgLy8gVS9DYgorICAgICAgICAgICAgICAgIGludDMyX3QgZHN0SW5kZXggPSBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubU9mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubVJvd0luYyAqIChyb3cgLSB0b3AvMikgKworICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1Db2xJbmMgKiAoY29sIC0gbGVmdC8yKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHNyY0luZGV4ID0gcm93ICogeXV2QnVmZmVyLmNocm9tYVN0cmlkZSArIHl1dkJ1ZmZlci5jaHJvbWFTdGVwICogY29sOworICAgICAgICAgICAgICAgIGRzdFtkc3RJbmRleF0gPSB5dXZCdWZmZXIuZGF0YUNiW3NyY0luZGV4XTsKKworICAgICAgICAgICAgICAgIC8vIFYvQ3IKKyAgICAgICAgICAgICAgICBkc3RJbmRleCA9IGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tT2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tUm93SW5jICogKHJvdyAtIHRvcC8yKSArCisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubUNvbEluYyAqIChjb2wgLSBsZWZ0LzIpOworICAgICAgICAgICAgICAgIHNyY0luZGV4ID0gcm93ICogeXV2QnVmZmVyLmNocm9tYVN0cmlkZSArIHl1dkJ1ZmZlci5jaHJvbWFTdGVwICogY29sOworICAgICAgICAgICAgICAgIGRzdFtkc3RJbmRleF0gPSB5dXZCdWZmZXIuZGF0YUNyW3NyY0luZGV4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6aW5pdENvcHlSb3dGdW5jdGlvbihpbnQzMl90IHdpZHRoKQoreworICAgIHVzaW5nIG5hbWVzcGFjZSBsaWJ5dXY7CisKKyAgICBtRm5Db3B5Um93ID0gQ29weVJvd19DOworI2lmIGRlZmluZWQoSEFTX0NPUFlST1dfU1NFMikKKyAgICBpZiAoVGVzdENwdUZsYWcoa0NwdUhhc1NTRTIpKSB7CisgICAgICAgIG1GbkNvcHlSb3cgPSBJU19BTElHTkVEKHdpZHRoLCAzMikgPyBDb3B5Um93X1NTRTIgOiBDb3B5Um93X0FueV9TU0UyOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFTX0NPUFlST1dfQVZYKQorICAgIGlmIChUZXN0Q3B1RmxhZyhrQ3B1SGFzQVZYKSkgeworICAgICAgICBtRm5Db3B5Um93ID0gSVNfQUxJR05FRCh3aWR0aCwgNjQpID8gQ29weVJvd19BVlggOiBDb3B5Um93X0FueV9BVlg7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChIQVNfQ09QWVJPV19FUk1TKQorICAgIGlmIChUZXN0Q3B1RmxhZyhrQ3B1SGFzRVJNUykpIHsKKyAgICAgICAgbUZuQ29weVJvdyA9IENvcHlSb3dfRVJNUzsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBU19DT1BZUk9XX05FT04pCisgICAgaWYgKFRlc3RDcHVGbGFnKGtDcHVIYXNORU9OKSkgeworICAgICAgICBtRm5Db3B5Um93ID0gSVNfQUxJR05FRCh3aWR0aCwgMzIpID8gQ29weVJvd19ORU9OIDogQ29weVJvd19BbnlfTkVPTjsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBU19DT1BZUk9XX01JUFMpCisgICAgaWYgKFRlc3RDcHVGbGFnKGtDcHVIYXNNSVBTKSkgeworICAgICAgICBtRm5Db3B5Um93ID0gQ29weVJvd19NSVBTOworICAgIH0KKyNlbmRpZgorfQorCitzaXplX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Y2FsY0FwcFNlZ21lbnRNYXhTaXplKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvKSB7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnkgPSBpbmZvLmZpbmQoQU5EUk9JRF9IRUlDX0lORk9fTUFYX0pQRUdfQVBQX1NFR01FTlRTX0NPVU5UKTsKKyAgICBzaXplX3QgbWF4QXBwc1NlZ21lbnQgPSAxOworICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgbWF4QXBwc1NlZ21lbnQgPSBlbnRyeS5kYXRhLnU4WzBdIDwgMSA/IDEgOgorICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEudThbMF0gPiAxNiA/IDE2IDogZW50cnkuZGF0YS51OFswXTsKKyAgICB9CisgICAgcmV0dXJuIG1heEFwcHNTZWdtZW50ICogKDIgKyAweEZGRkYpICsgc2l6ZW9mKHN0cnVjdCBDYW1lcmFCbG9iKTsKK30KKworYm9vbCBIZWljQ29tcG9zaXRlU3RyZWFtOjp0aHJlYWRMb29wKCkgeworICAgIGludDY0X3QgY3VycmVudFRzID0gSU5UNjRfTUFYOworICAgIGJvb2wgbmV3SW5wdXRBdmFpbGFibGUgPSBmYWxzZTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICAgICAgaWYgKG1FcnJvclN0YXRlKSB7CisgICAgICAgICAgICAvLyBJbiBjYXNlIHdlIGxhbmRlZCBpbiBlcnJvciBzdGF0ZSwgcmV0dXJuIGFueSBwZW5kaW5nIGJ1ZmZlcnMgYW5kCisgICAgICAgICAgICAvLyBoYWx0IGFsbCBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgICAgICAgICAgICBjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCk7CisgICAgICAgICAgICByZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoY3VycmVudFRzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgd2hpbGUgKCFuZXdJbnB1dEF2YWlsYWJsZSkgeworICAgICAgICAgICAgY29tcGlsZVBlbmRpbmdJbnB1dExvY2tlZCgpOworICAgICAgICAgICAgbmV3SW5wdXRBdmFpbGFibGUgPSBnZXROZXh0UmVhZHlJbnB1dExvY2tlZCgmY3VycmVudFRzKTsKKworICAgICAgICAgICAgaWYgKCFuZXdJbnB1dEF2YWlsYWJsZSkgeworICAgICAgICAgICAgICAgIGF1dG8gZmFpbGluZ0ZyYW1lTnVtYmVyID0gZ2V0TmV4dEZhaWxpbmdJbnB1dExvY2tlZCgmY3VycmVudFRzKTsKKyAgICAgICAgICAgICAgICBpZiAoZmFpbGluZ0ZyYW1lTnVtYmVyID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2Fubm90IGVyYXNlICdtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10nIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSBpdCBpcworICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSBmb3IgdHdvIGludGVybmFsIHN0cmVhbSBidWZmZXJzIHRvIGZhaWwuIEluIHN1Y2ggc2NlbmFyaW8gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBvc2l0ZSBzdHJlYW0gc2hvdWxkIG5vdGlmeSB0aGUgY2xpZW50IGFib3V0IGEgc3RyZWFtIGJ1ZmZlciBlcnJvciBvbmx5CisgICAgICAgICAgICAgICAgICAgIC8vIG9uY2UgYW5kIHRoaXMgaW5mb3JtYXRpb24gaXMga2VwdCB3aXRoaW4gJ2Vycm9yTm90aWZpZWQnLgorICAgICAgICAgICAgICAgICAgICAvLyBBbnkgcHJlc2VudCBmYWlsZWQgaW5wdXQgZnJhbWVzIHdpbGwgYmUgcmVtb3ZlZCBvbiBhIHN1YnNlcXVlbnQgY2FsbCB0bworICAgICAgICAgICAgICAgICAgICAvLyAncmVsZWFzZUlucHV0RnJhbWVzTG9ja2VkKCknLgorICAgICAgICAgICAgICAgICAgICByZWxlYXNlSW5wdXRGcmFtZUxvY2tlZCgmbVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdKTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFRzID0gSU5UNjRfTUFYOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGF1dG8gcmV0ID0gbUlucHV0UmVhZHlDb25kaXRpb24ud2FpdFJlbGF0aXZlKG1NdXRleCwga1dhaXREdXJhdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBUSU1FRF9PVVQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUaW1lZCB3YWl0IG9uIGNvbmRpdGlvbiBmYWlsZWQ6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJldCksIHJldCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdXRvIHJlcyA9IHByb2Nlc3NJbnB1dEZyYW1lKGN1cnJlbnRUcywgbVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgcHJvY2Vzc2luZyBmcmFtZSB3aXRoIHRpbWVzdGFtcDogJSIgUFJJdTY0ICI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY3VycmVudFRzLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdLmVycm9yID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAobVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdLmVycm9yIHx8CisgICAgICAgICAgICAobVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdLmFwcFNlZ21lbnRXcml0dGVuICYmCisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10ucGVuZGluZ091dHB1dFRpbGVzID09IDApKSB7CisgICAgICAgIHJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZChjdXJyZW50VHMpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEhlaWNDb21wb3NpdGVTdHJlYW06Om9uU3RyZWFtQnVmZmVyRXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgYm9vbCByZXMgPSBmYWxzZTsKKyAgICAvLyBCdWZmZXIgZXJyb3JzIGNvbmNlcm5pbmcgaW50ZXJuYWwgY29tcG9zaXRlIHN0cmVhbXMgc2hvdWxkIG5vdCBiZSBkaXJlY3RseSB2aXNpYmxlIHRvCisgICAgLy8gY2FtZXJhIGNsaWVudHMuIFRoZXkgbXVzdCBvbmx5IHJlY2VpdmUgYSBzaW5nbGUgYnVmZmVyIGVycm9yIHdpdGggdGhlIHB1YmxpYyBjb21wb3NpdGUKKyAgICAvLyBzdHJlYW0gaWQuCisgICAgaWYgKChyZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZCA9PSBtQXBwU2VnbWVudFN0cmVhbUlkKSB8fAorICAgICAgICAgICAgKHJlc3VsdEV4dHJhcy5lcnJvclN0cmVhbUlkID09IG1NYWluSW1hZ2VTdHJlYW1JZCkpIHsKKyAgICAgICAgZmxhZ0FuRXJyb3JGcmFtZU51bWJlcihyZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworICAgICAgICByZXMgPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25SZXN1bHRFcnJvcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICAvLyBGb3IgcmVzdWx0IGVycm9yLCBzaW5jZSB0aGUgQVBQU19TRUdNRU5UIGJ1ZmZlciBhbHJlYWR5IGNvbnRhaW5zIEVYSUYsCisgICAgLy8gc2ltcGx5IHNraXAgdXNpbmcgdGhlIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIHRvIG92ZXJyaWRlIEVYSUYuCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKworICAgIGludDY0X3QgdGltZXN0YW1wID0gLTE7CisgICAgZm9yIChjb25zdCBhdXRvJiBmbiA6IG1GcmFtZU51bWJlck1hcCkgeworICAgICAgICBpZiAoZm4uZmlyc3QgPT0gcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICB0aW1lc3RhbXAgPSBmbi5zZWNvbmQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodGltZXN0YW1wID09IC0xKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgaW5wdXRGcmFtZSA6IG1QZW5kaW5nSW5wdXRGcmFtZXMpIHsKKyAgICAgICAgICAgIGlmIChpbnB1dEZyYW1lLnNlY29uZC5mcmFtZU51bWJlciA9PSByZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAgPSBpbnB1dEZyYW1lLmZpcnN0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRpbWVzdGFtcCA9PSAtMSkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIHNodXR0ZXIgdGltZXN0YW1wIGZvciByZXN1bHQgZXJyb3IhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1DYXB0dXJlUmVzdWx0cy5lbXBsYWNlKHRpbWVzdGFtcCwgc3RkOjptYWtlX3R1cGxlKHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwgQ2FtZXJhTWV0YWRhdGEoKSkpOworICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06OkNvZGVjQ2FsbGJhY2tIYW5kbGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPEhlaWNDb21wb3NpdGVTdHJlYW0+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwYXJlbnQgPT0gbnVsbHB0cikgcmV0dXJuOworCisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0Q2FsbGJhY2tOb3RpZnk6IHsKKyAgICAgICAgICAgICBpbnQzMl90IGNiSUQ7CisgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiY2FsbGJhY2tJRCIsICZjYklEKSkgeworICAgICAgICAgICAgICAgICBBTE9HRSgia1doYXRDYWxsYmFja05vdGlmeTogY2FsbGJhY2tJRCBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgQUxPR1YoImtXaGF0Q2FsbGJhY2tOb3RpZnk6IGNiSUQgPSAlZCIsIGNiSUQpOworCisgICAgICAgICAgICAgc3dpdGNoIChjYklEKSB7CisgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb2RlYzo6Q0JfSU5QVVRfQVZBSUxBQkxFOiB7CisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4OworICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiaW5kZXgiLCAmaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX0lOUFVUX0FWQUlMQUJMRTogaW5kZXggaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm9uSGVpY0lucHV0RnJhbWVBdmFpbGFibGUoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29kZWM6OkNCX09VVFBVVF9BVkFJTEFCTEU6IHsKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXg7CisgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmxhZ3M7CisKKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImluZGV4IiwgJmluZGV4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9PVVRQVVRfQVZBSUxBQkxFOiBpbmRleCBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kU2l6ZSgib2Zmc2V0IiwgJm9mZnNldCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfT1VUUFVUX0FWQUlMQUJMRTogb2Zmc2V0IGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRTaXplKCJzaXplIiwgJnNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX09VVFBVVF9BVkFJTEFCTEU6IHNpemUgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9PVVRQVVRfQVZBSUxBQkxFOiB0aW1lVXMgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJmbGFncyIsICZmbGFncykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfT1VUUFVUX0FWQUlMQUJMRTogZmxhZ3MgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIENvZGVjT3V0cHV0QnVmZmVySW5mbyBidWZmZXJJbmZvID0geworICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KW9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpZmxhZ3N9OworCisgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm9uSGVpY091dHB1dEZyYW1lQXZhaWxhYmxlKGJ1ZmZlckluZm8pOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29kZWM6OkNCX09VVFBVVF9GT1JNQVRfQ0hBTkdFRDogeworICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfT1VUUFVUX0ZPUk1BVF9DSEFOR0VEOiBmb3JtYXQgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+b25IZWljRm9ybWF0Q2hhbmdlZChmb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29kZWM6OkNCX0VSUk9SOiB7CisgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGFjdGlvbkNvZGU7CisgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIGRldGFpbDsKKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX0VSUk9SOiBlcnIgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhY3Rpb24iLCAmYWN0aW9uQ29kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfRVJST1I6IGFjdGlvbiBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIG1zZy0+ZmluZFN0cmluZygiZGV0YWlsIiwgJmRldGFpbCk7CisgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMgcmVwb3J0ZWQgZXJyb3IoMHgleCksIGFjdGlvbkNvZGUoJWQpLCBkZXRhaWwoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBhY3Rpb25Db2RlLCBkZXRhaWwuY19zdHIoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+b25IZWljQ29kZWNFcnJvcigpOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICAgICBBTE9HRSgia1doYXRDYWxsYmFja05vdGlmeTogY2FsbGJhY2tJRCglZCkgaXMgdW5leHBlY3RlZC4iLCBjYklEKTsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJzaG91bGRuJ3QgYmUgaGVyZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFhM2MzOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5oCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfSEVJQ19DT01QT1NJVEVfU1RSRUFNX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0hFSUNfQ09NUE9TSVRFX1NUUkVBTV9ICisKKyNpbmNsdWRlIDxxdWV1ZT4KKworI2luY2x1ZGUgPGd1aS9JUHJvZHVjZXJMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGd1aS9DcHVDb25zdW1lci5oPgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaD4KKworI2luY2x1ZGUgIkNvbXBvc2l0ZVN0cmVhbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK2NsYXNzIEhlaWNDb21wb3NpdGVTdHJlYW0gOiBwdWJsaWMgQ29tcG9zaXRlU3RyZWFtLCBwdWJsaWMgVGhyZWFkLAorICAgICAgICBwdWJsaWMgQ3B1Q29uc3VtZXI6OkZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgeworcHVibGljOgorICAgIEhlaWNDb21wb3NpdGVTdHJlYW0od3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlLAorICAgICAgICAgICAgd3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNiKTsKKyAgICB+SGVpY0NvbXBvc2l0ZVN0cmVhbSgpIG92ZXJyaWRlOworCisgICAgc3RhdGljIGJvb2wgaXNIZWljQ29tcG9zaXRlU3RyZWFtKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKKworICAgIHN0YXR1c190IGNyZWF0ZUludGVybmFsU3RyZWFtcyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKKyAgICAgICAgICAgIGJvb2wgaGFzRGVmZXJyZWRDb25zdW1lciwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzLCBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQpIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgZGVsZXRlSW50ZXJuYWxTdHJlYW1zKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW0oKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IGluc2VydEdicChTdXJmYWNlTWFwKiAvKm91dCovb3V0U3VyZmFjZU1hcCwgVmVjdG9yPGludDMyX3Q+KiAvKm91dCovb3V0cHV0U3RyZWFtSWRzLAorICAgICAgICAgICAgaW50MzJfdCogLypvdXQqL2N1cnJlbnRTdHJlYW1JZCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIG9uU2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsIG5zZWNzX3QgdGltZXN0YW1wKSBvdmVycmlkZTsKKworICAgIGludCBnZXRTdHJlYW1JZCgpIG92ZXJyaWRlIHsgcmV0dXJuIG1NYWluSW1hZ2VTdHJlYW1JZDsgfQorCisgICAgLy8gVXNlIG9uU2h1dHRlciB0byBrZWVwIHRyYWNrIG9mIGZyYW1lIG51bWJlciA8LT4gdGltZXN0YW1wIG1hcHBpbmcuCisgICAgdm9pZCBvbkJ1ZmZlclJlbGVhc2VkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pIG92ZXJyaWRlOworICAgIHZvaWQgb25CdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIodWludDY0X3QgZnJhbWVOdW1iZXIsIGludCBzdHJlYW1JZCwKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXR0aW5ncykgb3ZlcnJpZGU7CisKKyAgICAvLyBDcHVDb25zdW1lciBsaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgorICAgIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKSBvdmVycmlkZTsKKworICAgIC8vIFJldHVybiBzdHJlYW0gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVybmFsIGNhbWVyYSBzdHJlYW1zCisgICAgc3RhdGljIHN0YXR1c190IGdldENvbXBvc2l0ZVN0cmVhbUluZm8oY29uc3QgT3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4qIGNvbXBvc2l0ZU91dHB1dCAvKm91dCovKTsKKworICAgIHN0YXRpYyBib29sIGlzU2l6ZVN1cHBvcnRlZEJ5SGVpZkVuY29kZXIoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICBib29sKiB1c2VIZWljLCBib29sKiB1c2VHcmlkLCBpbnQ2NF90KiBzdGFsbCk7CisgICAgc3RhdGljIGJvb2wgaXNJbk1lbW9yeVRlbXBGaWxlU3VwcG9ydGVkKCk7Citwcm90ZWN0ZWQ6CisKKyAgICBib29sIHRocmVhZExvb3AoKSBvdmVycmlkZTsKKyAgICBib29sIG9uU3RyZWFtQnVmZmVyRXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzdWx0RXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICAvLworICAgIC8vIEhFSUMvSEVWQyBDb2RlYyByZWxhdGVkIHN0cnVjdHVyZXMsIHV0aWxpdHkgZnVuY3Rpb25zLCBhbmQgY2FsbGJhY2tzCisgICAgLy8KKyAgICBzdHJ1Y3QgQ29kZWNPdXRwdXRCdWZmZXJJbmZvIHsKKyAgICAgICAgaW50MzJfdCBpbmRleDsKKyAgICAgICAgaW50MzJfdCBvZmZzZXQ7CisgICAgICAgIGludDMyX3Qgc2l6ZTsKKyAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgIHVpbnQzMl90IGZsYWdzOworICAgIH07CisKKyAgICBzdHJ1Y3QgQ29kZWNJbnB1dEJ1ZmZlckluZm8geworICAgICAgICBpbnQzMl90IGluZGV4OworICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgc2l6ZV90IHRpbGVJbmRleDsKKyAgICB9OworCisgICAgY2xhc3MgQ29kZWNDYWxsYmFja0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgQ29kZWNDYWxsYmFja0hhbmRsZXIod3A8SGVpY0NvbXBvc2l0ZVN0cmVhbT4gcGFyZW50KSB7CisgICAgICAgICAgICBtUGFyZW50ID0gcGFyZW50OworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgcHJpdmF0ZToKKyAgICAgICAgd3A8SGVpY0NvbXBvc2l0ZVN0cmVhbT4gbVBhcmVudDsKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIGtXaGF0Q2FsbGJhY2tOb3RpZnksCisgICAgfTsKKworICAgIGJvb2wgICAgICAgICAgICAgIG1Vc2VIZWljOworICAgIHNwPE1lZGlhQ29kZWM+ICAgIG1Db2RlYzsKKyAgICBzcDxBTG9vcGVyPiAgICAgICBtQ29kZWNMb29wZXIsIG1DYWxsYmFja0xvb3BlcjsKKyAgICBzcDxDb2RlY0NhbGxiYWNrSGFuZGxlcj4gbUNvZGVjQ2FsbGJhY2tIYW5kbGVyOworICAgIHNwPEFNZXNzYWdlPiAgICAgIG1Bc3luY05vdGlmeTsKKyAgICBzcDxBTWVzc2FnZT4gICAgICBtRm9ybWF0OworICAgIHNpemVfdCAgICAgICAgICAgIG1OdW1PdXRwdXRUaWxlczsKKworICAgIGludDMyX3QgICAgICAgICAgIG1PdXRwdXRXaWR0aCwgbU91dHB1dEhlaWdodDsKKyAgICBzaXplX3QgICAgICAgICAgICBtTWF4SGVpY0J1ZmZlclNpemU7CisgICAgaW50MzJfdCAgICAgICAgICAgbUdyaWRXaWR0aCwgbUdyaWRIZWlnaHQ7CisgICAgc2l6ZV90ICAgICAgICAgICAgbUdyaWRSb3dzLCBtR3JpZENvbHM7CisgICAgYm9vbCAgICAgICAgICAgICAgbVVzZUdyaWQ7IC8vIFdoZXRoZXIgdG8gdXNlIGZyYW1ld29yayBZVVYgZnJhbWUgdGlsaW5nLgorCisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga05vRnJhbWVEcm9wTWF4UHRzR2FwID0gLTEwMDAwMDA7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga05vR3JpZE9wUmF0ZSA9IDMwOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtHcmlkT3BSYXRlID0gMTIwOworCisgICAgdm9pZCBvbkhlaWNPdXRwdXRGcmFtZUF2YWlsYWJsZShjb25zdCBDb2RlY091dHB1dEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pOworICAgIHZvaWQgb25IZWljSW5wdXRGcmFtZUF2YWlsYWJsZShpbnQzMl90IGluZGV4KTsgIC8vIE9ubHkgY2FsbGVkIGZvciBZVVYgaW5wdXQgbW9kZS4KKyAgICB2b2lkIG9uSGVpY0Zvcm1hdENoYW5nZWQoc3A8QU1lc3NhZ2U+JiBuZXdGb3JtYXQpOworICAgIHZvaWQgb25IZWljQ29kZWNFcnJvcigpOworCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZUNvZGVjKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiYgY2FtZXJhRGV2aWNlKTsKKyAgICB2b2lkIGRlaW5pdENvZGVjKCk7CisKKyAgICAvLworICAgIC8vIENvbXBvc2l0ZSBzdHJlYW0gcmVsYXRlZCBzdHJ1Y3R1cmVzLCB1dGlsaXR5IGZ1bmN0aW9ucyBhbmQgY2FsbGJhY2tzLgorICAgIC8vCisgICAgc3RydWN0IElucHV0RnJhbWUgeworICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uOworICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgIHF1YWxpdHk7CisKKyAgICAgICAgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciAgICAgICAgICBhcHBTZWdtZW50QnVmZmVyOworICAgICAgICBzdGQ6OnZlY3RvcjxDb2RlY091dHB1dEJ1ZmZlckluZm8+IGNvZGVjT3V0cHV0QnVmZmVyczsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENhbWVyYU1ldGFkYXRhPiAgICByZXN1bHQ7CisKKyAgICAgICAgLy8gRmllbGRzIHRoYXQgYXJlIG9ubHkgYXBwbGljYWJsZSB0byBIRVZDIHRpbGluZy4KKyAgICAgICAgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciAgICAgICAgICB5dXZCdWZmZXI7CisgICAgICAgIHN0ZDo6dmVjdG9yPENvZGVjSW5wdXRCdWZmZXJJbmZvPiAgY29kZWNJbnB1dEJ1ZmZlcnM7CisKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICBlcnJvcjsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICBlcnJvck5vdGlmaWVkOworICAgICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyOworCisgICAgICAgIHNwPE1lZGlhTXV4ZXI+ICAgICAgICAgICAgbXV4ZXI7CisgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgZmVuY2VGZDsKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBmaWxlRmQ7CisgICAgICAgIHNzaXplX3QgICAgICAgICAgICAgICAgICAgdHJhY2tJbmRleDsKKyAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAgICAgICAqYW5iOworCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgYXBwU2VnbWVudFdyaXR0ZW47CisgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgcGVuZGluZ091dHB1dFRpbGVzOworICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgIGNvZGVjSW5wdXRDb3VudGVyOworCisgICAgICAgIElucHV0RnJhbWUoKSA6IG9yaWVudGF0aW9uKDApLCBxdWFsaXR5KGtEZWZhdWx0SnBlZ1F1YWxpdHkpLCBlcnJvcihmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTm90aWZpZWQoZmFsc2UpLCBmcmFtZU51bWJlcigtMSksIGZlbmNlRmQoLTEpLCBmaWxlRmQoLTEpLAorICAgICAgICAgICAgICAgICAgICAgICB0cmFja0luZGV4KC0xKSwgYW5iKG51bGxwdHIpLCBhcHBTZWdtZW50V3JpdHRlbihmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdPdXRwdXRUaWxlcygwKSwgY29kZWNJbnB1dENvdW50ZXIoMCkgeyB9CisgICAgfTsKKworICAgIHZvaWQgY29tcGlsZVBlbmRpbmdJbnB1dExvY2tlZCgpOworICAgIC8vIEZpbmQgZmlyc3QgY29tcGxldGUgYW5kIHZhbGlkIGZyYW1lIHdpdGggc21hbGxlc3QgdGltZXN0YW1wCisgICAgYm9vbCBnZXROZXh0UmVhZHlJbnB1dExvY2tlZChpbnQ2NF90ICpjdXJyZW50VHMgLypvdXQqLyk7CisgICAgLy8gRmluZCBuZXh0IGZhaWxpbmcgZnJhbWUgbnVtYmVyIHdpdGggc21hbGxlc3QgdGltZXN0YW1wIGFuZCByZXR1cm4gcmVzcGVjdGl2ZSBmcmFtZSBudW1iZXIKKyAgICBpbnQ2NF90IGdldE5leHRGYWlsaW5nSW5wdXRMb2NrZWQoaW50NjRfdCAqY3VycmVudFRzIC8qb3V0Ki8pOworCisgICAgc3RhdHVzX3QgcHJvY2Vzc0lucHV0RnJhbWUobnNlY3NfdCB0aW1lc3RhbXAsIElucHV0RnJhbWUgJmlucHV0RnJhbWUpOworICAgIHN0YXR1c190IHByb2Nlc3NDb2RlY0lucHV0RnJhbWUoSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSk7CisgICAgc3RhdHVzX3Qgc3RhcnRNdXhlckZvcklucHV0RnJhbWUobnNlY3NfdCB0aW1lc3RhbXAsIElucHV0RnJhbWUgJmlucHV0RnJhbWUpOworICAgIHN0YXR1c190IHByb2Nlc3NBcHBTZWdtZW50KG5zZWNzX3QgdGltZXN0YW1wLCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKTsKKyAgICBzdGF0dXNfdCBwcm9jZXNzT25lQ29kZWNPdXRwdXRGcmFtZShuc2Vjc190IHRpbWVzdGFtcCwgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSk7CisgICAgc3RhdHVzX3QgcHJvY2Vzc0NvbXBsZXRlZElucHV0RnJhbWUobnNlY3NfdCB0aW1lc3RhbXAsIElucHV0RnJhbWUgJmlucHV0RnJhbWUpOworCisgICAgdm9pZCByZWxlYXNlSW5wdXRGcmFtZUxvY2tlZChJbnB1dEZyYW1lICppbnB1dEZyYW1lIC8qb3V0Ki8pOworICAgIHZvaWQgcmVsZWFzZUlucHV0RnJhbWVzTG9ja2VkKGludDY0X3QgY3VycmVudFRzKTsKKworICAgIHNpemVfdCBmaW5kQXBwU2VnbWVudHNTaXplKGNvbnN0IHVpbnQ4X3QqIGFwcFNlZ21lbnRCdWZmZXIsIHNpemVfdCBtYXhTaXplLAorICAgICAgICAgICAgc2l6ZV90KiBhcHAxU2VnbWVudFNpemUpOworICAgIGludDY0X3QgZmluZFRpbWVzdGFtcEluTnNMb2NrZWQoaW50NjRfdCB0aW1lSW5Vcyk7CisgICAgc3RhdHVzX3QgY29weU9uZVl1dlRpbGUoc3A8TWVkaWFDb2RlY0J1ZmZlcj4mIGNvZGVjQnVmZmVyLAorICAgICAgICAgICAgY29uc3QgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciYgeXV2QnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90IHRvcCwgc2l6ZV90IGxlZnQsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCk7CisgICAgdm9pZCBpbml0Q29weVJvd0Z1bmN0aW9uKGludDMyX3Qgd2lkdGgpOworICAgIHN0YXRpYyBzaXplX3QgY2FsY0FwcFNlZ21lbnRNYXhTaXplKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvKTsKKworICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtXYWl0RHVyYXRpb24gPSAxMDAwMDAwMDsgLy8gMTAgbXMKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrRGVmYXVsdEpwZWdRdWFsaXR5ID0gOTk7CisgICAgc3RhdGljIGNvbnN0IGF1dG8ga0pwZWdEYXRhU3BhY2UgPSBIQUxfREFUQVNQQUNFX1YwX0pGSUY7CisgICAgc3RhdGljIGNvbnN0IGFuZHJvaWRfZGF0YXNwYWNlIGtBcHBTZWdtZW50RGF0YVNwYWNlID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihIQUxfREFUQVNQQUNFX0pQRUdfQVBQX1NFR01FTlRTKTsKKyAgICBzdGF0aWMgY29uc3QgYW5kcm9pZF9kYXRhc3BhY2Uga0hlaWZEYXRhU3BhY2UgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KEhBTF9EQVRBU1BBQ0VfSEVJRik7CisKKyAgICBpbnQgICAgICAgICAgICAgICBtQXBwU2VnbWVudFN0cmVhbUlkLCBtQXBwU2VnbWVudFN1cmZhY2VJZDsKKyAgICBzcDxDcHVDb25zdW1lcj4gICBtQXBwU2VnbWVudENvbnN1bWVyOworICAgIHNwPFN1cmZhY2U+ICAgICAgIG1BcHBTZWdtZW50U3VyZmFjZTsKKyAgICBib29sICAgICAgICAgICAgICBtQXBwU2VnbWVudEJ1ZmZlckFjcXVpcmVkOworICAgIHNpemVfdCAgICAgICAgICAgIG1BcHBTZWdtZW50TWF4U2l6ZTsKKyAgICBDYW1lcmFNZXRhZGF0YSAgICBtU3RhdGljSW5mbzsKKworICAgIGludCAgICAgICAgICAgICAgIG1NYWluSW1hZ2VTdHJlYW1JZCwgbU1haW5JbWFnZVN1cmZhY2VJZDsKKyAgICBzcDxTdXJmYWNlPiAgICAgICBtTWFpbkltYWdlU3VyZmFjZTsKKyAgICBzcDxDcHVDb25zdW1lcj4gICBtTWFpbkltYWdlQ29uc3VtZXI7IC8vIE9ubHkgYXBwbGljYWJsZSBmb3IgSEVWQyBjb2RlYy4KKyAgICBib29sICAgICAgICAgICAgICBtWXV2QnVmZmVyQWNxdWlyZWQ7IC8vIE9ubHkgYXBwbGljYWJsZSB0byBIRVZDIGNvZGVjCisKKyAgICBzcDxTdXJmYWNlPiAgICAgICBtT3V0cHV0U3VyZmFjZTsKKyAgICBzcDxQcm9kdWNlckxpc3RlbmVyPiBtUHJvZHVjZXJMaXN0ZW5lcjsKKworCisgICAgLy8gTWFwIGZyb20gZnJhbWUgbnVtYmVyIHRvIEpQRUcgc2V0dGluZyBvZiBvcmllbnRhdGlvbitxdWFsaXR5CisgICAgc3RkOjptYXA8aW50NjRfdCwgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+PiBtU2V0dGluZ3NCeUZyYW1lTnVtYmVyOworICAgIC8vIE1hcCBmcm9tIHRpbWVzdGFtcCB0byBKUEVHIHNldHRpbmcgb2Ygb3JpZW50YXRpb24rcXVhbGl0eQorICAgIHN0ZDo6bWFwPGludDY0X3QsIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4gbVNldHRpbmdzQnlUaW1lc3RhbXA7CisKKyAgICAvLyBLZWVwIGFsbCBpbmNvbWluZyBBUFAgc2VnbWVudCBCbG9iIGJ1ZmZlciBwZW5kaW5nIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBtSW5wdXRBcHBTZWdtZW50QnVmZmVyczsKKworICAgIC8vIEtlZXAgYWxsIGluY29taW5nIEhFSUMgYmxvYiBidWZmZXIgcGVuZGluZyBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgICAgc3RkOjp2ZWN0b3I8Q29kZWNPdXRwdXRCdWZmZXJJbmZvPiBtQ29kZWNPdXRwdXRCdWZmZXJzOworICAgIHN0ZDo6cXVldWU8aW50NjRfdD4gbUNvZGVjT3V0cHV0QnVmZmVyVGltZXN0YW1wczsKKyAgICBzaXplX3QgbU91dHB1dEJ1ZmZlckNvdW50ZXI7CisKKyAgICAvLyBLZWVwIGFsbCBpbmNvbWluZyBZdXYgYnVmZmVyIHBlbmRpbmcgdGlsaW5nIGFuZCBlbmNvZGluZyAoZm9yIEhFVkMgWVVWIHRpbGluZyBvbmx5KQorICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IG1JbnB1dFl1dkJ1ZmZlcnM7CisgICAgLy8gS2VlcCBhbGwgY29kZWMgaW5wdXQgYnVmZmVycyByZWFkeSB0byBiZSBmaWxsZWQgb3V0IChmb3IgSEVWQyBZVVYgdGlsaW5nIG9ubHkpCisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gbUNvZGVjSW5wdXRCdWZmZXJzOworCisgICAgLy8gQXJ0aWZpY2lhbCBzdHJpY3RseSBpbmNyZW1lbnRhbCBZVVYgZ3JpZCB0aW1lc3RhbXAgdG8gbWFrZSBlbmNvZGVyIGhhcHB5LgorICAgIGludDY0X3QgbUdyaWRUaW1lc3RhbXBVczsKKworICAgIC8vIEluIG1vc3QgY29tbW9uIHVzZSBjYXNlLCBlbnRyaWVzIGFyZSBhY2Nlc3NlZCBpbiBvcmRlci4KKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBJbnB1dEZyYW1lPiBtUGVuZGluZ0lucHV0RnJhbWVzOworCisgICAgLy8gRnVuY3Rpb24gcG9pbnRlciBvZiBsaWJ5dXYgcm93IGNvcHkuCisgICAgdm9pZCAoKm1GbkNvcHlSb3cpKGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0LCBpbnQgd2lkdGgpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvL0FORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBM19IRUlDX0NPTVBPU0lURV9TVFJFQU1fSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljRW5jb2RlckluZm9NYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0VuY29kZXJJbmZvTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ5YmU2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0VuY29kZXJJbmZvTWFuYWdlci5jcHAKQEAgLTAsMCArMSwyOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkhlaWNFbmNvZGVySW5mb01hbmFnZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHJlZ2V4PgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsb2cvbG9nX21haW4uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKworI2luY2x1ZGUgIkhlaWNFbmNvZGVySW5mb01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCitIZWljRW5jb2RlckluZm9NYW5hZ2VyOjpIZWljRW5jb2RlckluZm9NYW5hZ2VyKCkgOgorICAgICAgICBtSXNJbml0ZWQoZmFsc2UpLAorICAgICAgICBtTWluU2l6ZUhlaWMoMCwgMCksCisgICAgICAgIG1NYXhTaXplSGVpYyhJTlQzMl9NQVgsIElOVDMyX01BWCksCisgICAgICAgIG1IYXNIRVZDKGZhbHNlKSwKKyAgICAgICAgbUhhc0hFSUMoZmFsc2UpLAorICAgICAgICBtRGlzYWJsZUdyaWQoZmFsc2UpIHsKKyAgICBpZiAoaW5pdGlhbGl6ZSgpID09IE9LKSB7CisgICAgICAgIG1Jc0luaXRlZCA9IHRydWU7CisgICAgfQorfQorCitIZWljRW5jb2RlckluZm9NYW5hZ2VyOjp+SGVpY0VuY29kZXJJbmZvTWFuYWdlcigpIHsKK30KKworYm9vbCBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjppc1NpemVTdXBwb3J0ZWQoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGJvb2wqIHVzZUhlaWMsCisgICAgICAgIGJvb2wqIHVzZUdyaWQsIGludDY0X3QqIHN0YWxsKSBjb25zdCB7CisgICAgaWYgKHVzZUhlaWMgPT0gbnVsbHB0ciB8fCB1c2VHcmlkID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHBhcmFtZXRlcnM6IHVzZUhlaWMgJXAsIHVzZUdyaWQgJXAiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdXNlSGVpYywgdXNlR3JpZCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFtSXNJbml0ZWQpIHJldHVybiBmYWxzZTsKKworICAgIGJvb2wgY2hvb3NlSGVpYyA9IGZhbHNlLCBlbmFibGVHcmlkID0gdHJ1ZTsKKyAgICBpZiAobUhhc0hFSUMgJiYgd2lkdGggPj0gbU1pblNpemVIZWljLmZpcnN0ICYmCisgICAgICAgICAgICBoZWlnaHQgPj0gbU1pblNpemVIZWljLnNlY29uZCAmJiB3aWR0aCA8PSBtTWF4U2l6ZUhlaWMuZmlyc3QgJiYKKyAgICAgICAgICAgIGhlaWdodCA8PSBtTWF4U2l6ZUhlaWMuc2Vjb25kKSB7CisgICAgICAgIGNob29zZUhlaWMgPSB0cnVlOworICAgICAgICBlbmFibGVHcmlkID0gZmFsc2U7CisgICAgfSBlbHNlIGlmIChtSGFzSEVWQykgeworICAgICAgICBib29sIGZ1bGxTaXplU3VwcG9ydGVkQnlIZXZjID0gKHdpZHRoID49IG1NaW5TaXplSGV2Yy5maXJzdCAmJgorICAgICAgICAgICAgICAgIGhlaWdodCA+PSBtTWluU2l6ZUhldmMuc2Vjb25kICYmCisgICAgICAgICAgICAgICAgd2lkdGggPD0gbU1heFNpemVIZXZjLmZpcnN0ICYmCisgICAgICAgICAgICAgICAgaGVpZ2h0IDw9IG1NYXhTaXplSGV2Yy5zZWNvbmQpOworICAgICAgICBpZiAoZnVsbFNpemVTdXBwb3J0ZWRCeUhldmMgJiYgKG1EaXNhYmxlR3JpZCB8fAorICAgICAgICAgICAgICAgICh3aWR0aCA8PSAxOTIwICYmIGhlaWdodCA8PSAxMDgwKSkpIHsKKyAgICAgICAgICAgIGVuYWJsZUdyaWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE5vIGVuY29kZXIgYXZhaWxhYmxlIGZvciB0aGUgcmVxdWVzdGVkIHNpemUuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoc3RhbGwgIT0gbnVsbHB0cikgeworICAgICAgICAvLyBGaW5kIHByZWZlcnJlZCBlbmNvZGVyIHdoaWNoIGFkdmVydGlzZQorICAgICAgICAvLyAibWVhc3VyZWQtZnJhbWUtcmF0ZS1XSURUSHhIRUlHSFQtcmFuZ2UiIGtleS4KKyAgICAgICAgY29uc3QgRnJhbWVSYXRlTWFwcyYgbWFwcyA9CisgICAgICAgICAgICAgICAgKGNob29zZUhlaWMgJiYgbUhlaWNGcmFtZVJhdGVNYXBzLnNpemUoKSA+IDApID8KKyAgICAgICAgICAgICAgICBtSGVpY0ZyYW1lUmF0ZU1hcHMgOiBtSGV2Y0ZyYW1lUmF0ZU1hcHM7CisgICAgICAgIGNvbnN0IGF1dG8mIGNsb3Nlc3RTaXplID0gZmluZENsb3Nlc3RTaXplKG1hcHMsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBpZiAoY2xvc2VzdFNpemUgPT0gbWFwcy5lbmQoKSkgeworICAgICAgICAgICAgLy8gVGhlICJtZWFzdXJlZC1mcmFtZS1yYXRlLVdJRFRIeEhFSUdIVC1yYW5nZSIga2V5IGlzIG9wdGlvbmFsLgorICAgICAgICAgICAgLy8gSGFyZGNvZGUgdG8gc29tZSBkZWZhdWx0IHZhbHVlICgzLjMzbXMgKiB0aWxlIGNvdW50KSBiYXNlZCBvbiByZXNvbHV0aW9uLgorICAgICAgICAgICAgKnN0YWxsID0gMzMzMzMzM0xMICogd2lkdGggKiBoZWlnaHQgLyAoa0dyaWRXaWR0aCAqIGtHcmlkSGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGVyaXZlIHN0YWxsIGR1cmF0aW9ucyBiYXNlZCBvbiBhdmVyYWdlIGZwcyBvZiB0aGUgY2xvc2VzdCBzaXplLgorICAgICAgICBjb25zdGV4cHIgaW50NjRfdCBOU0VDX1BFUl9TRUMgPSAxMDAwMDAwMDAwTEw7CisgICAgICAgIGludDMyX3QgYXZnRnBzID0gKGNsb3Nlc3RTaXplLT5zZWNvbmQuZmlyc3QgKyBjbG9zZXN0U2l6ZS0+c2Vjb25kLnNlY29uZCkvMjsKKyAgICAgICAgZmxvYXQgcmF0aW8gPSAxLjBmICogd2lkdGggKiBoZWlnaHQgLworICAgICAgICAgICAgICAgIChjbG9zZXN0U2l6ZS0+Zmlyc3QuZmlyc3QgKiBjbG9zZXN0U2l6ZS0+Zmlyc3Quc2Vjb25kKTsKKyAgICAgICAgKnN0YWxsID0gcmF0aW8gKiBOU0VDX1BFUl9TRUMgLyBhdmdGcHM7CisgICAgfQorCisgICAgKnVzZUhlaWMgPSBjaG9vc2VIZWljOworICAgICp1c2VHcmlkID0gZW5hYmxlR3JpZDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6aW5pdGlhbGl6ZSgpIHsKKyAgICBtRGlzYWJsZUdyaWQgPSBwcm9wZXJ0eV9nZXRfYm9vbCgiY2FtZXJhLmhlaWMuZGlzYWJsZV9ncmlkIiwgZmFsc2UpOworICAgIHNwPElNZWRpYUNvZGVjTGlzdD4gY29kZWNzTGlzdCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOworICAgIGlmIChjb2RlY3NMaXN0ID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gTm8gbWVkaWEgY29kZWMgYXZhaWxhYmxlLgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IGhlaWNEZXRhaWxzID0gZ2V0Q29kZWNEZXRhaWxzKGNvZGVjc0xpc3QsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyk7CisgICAgc3A8QU1lc3NhZ2U+IGhldmNEZXRhaWxzID0gZ2V0Q29kZWNEZXRhaWxzKGNvZGVjc0xpc3QsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworCisgICAgaWYgKGhldmNEZXRhaWxzID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGhlaWNEZXRhaWxzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRGV2aWNlIG11c3Qgc3VwcG9ydCBIRVZDIGNvZGVjIGlmIEhFSUMgY29kZWMgaXMgYXZhaWxhYmxlISIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAvLyBDaGVjayBDUSBtb2RlIGZvciBIRVZDIGNvZGVjCisgICAgeworICAgICAgICBBU3RyaW5nIGJpdHJhdGVNb2RlczsKKyAgICAgICAgYXV0byBoYXNJdGVtID0gaGV2Y0RldGFpbHMtPmZpbmRTdHJpbmcoImZlYXR1cmUtYml0cmF0ZS1tb2RlcyIsICZiaXRyYXRlTW9kZXMpOworICAgICAgICBpZiAoIWhhc0l0ZW0pIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHF1ZXJ5IGJpdHJhdGUgbW9kZXMgZm9yIEhFVkMgY29kZWMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiJXM6IEhFVkMgY29kZWMncyBmZWF0dXJlLWJpdHJhdGUtbW9kZXMgdmFsdWUgaXMgJWQsICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGhhc0l0ZW0sIGJpdHJhdGVNb2Rlcy5jX3N0cigpKTsKKyAgICAgICAgc3RkOjpyZWdleCBwYXR0ZXJuKCIoXnwsKUNRKCR8LCkiLCBzdGQ6OnJlZ2V4X2NvbnN0YW50czo6aWNhc2UpOworICAgICAgICBpZiAoIXN0ZDo6cmVnZXhfc2VhcmNoKGJpdHJhdGVNb2Rlcy5jX3N0cigpLCBwYXR0ZXJuKSkgeworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSEVJQyBzaXplIHJhbmdlCisgICAgaWYgKGhlaWNEZXRhaWxzICE9IG51bGxwdHIpIHsKKyAgICAgICAgYXV0byByZXMgPSBnZXRDb2RlY1NpemVSYW5nZShNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMsCisgICAgICAgICAgICAgICAgaGVpY0RldGFpbHMsICZtTWluU2l6ZUhlaWMsICZtTWF4U2l6ZUhlaWMsICZtSGVpY0ZyYW1lUmF0ZU1hcHMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgSEVJQyBjb2RlYyBzaXplIHJhbmdlOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgbUhhc0hFSUMgPSB0cnVlOworICAgIH0KKworICAgIC8vIEhFVkMgc2l6ZSByYW5nZQorICAgIHsKKyAgICAgICAgYXV0byByZXMgPSBnZXRDb2RlY1NpemVSYW5nZShNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLAorICAgICAgICAgICAgICAgIGhldmNEZXRhaWxzLCAmbU1pblNpemVIZXZjLCAmbU1heFNpemVIZXZjLCAmbUhldmNGcmFtZVJhdGVNYXBzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IEhFVkMgY29kZWMgc2l6ZSByYW5nZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgbUhhc0hFVkMgPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6Z2V0RnJhbWVSYXRlTWFwcyhzcDxBTWVzc2FnZT4gZGV0YWlscywgRnJhbWVSYXRlTWFwcyogbWFwcykgeworICAgIGlmIChkZXRhaWxzID09IG51bGxwdHIgfHwgbWFwcyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBpbnB1dDogZGV0YWlsczogJXAsIG1hcHM6ICVwIiwgX19GVU5DVElPTl9fLCBkZXRhaWxzLmdldCgpLCBtYXBzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldGFpbHMtPmNvdW50RW50cmllcygpOyBpKyspIHsKKyAgICAgICAgQU1lc3NhZ2U6OlR5cGUgdHlwZTsKKyAgICAgICAgY29uc3QgY2hhciogZW50cnlOYW1lID0gZGV0YWlscy0+Z2V0RW50cnlOYW1lQXQoaSwgJnR5cGUpOworICAgICAgICBpZiAodHlwZSAhPSBBTWVzc2FnZTo6a1R5cGVTdHJpbmcpIGNvbnRpbnVlOworICAgICAgICBzdGQ6OnJlZ2V4IGZyYW1lUmF0ZU5hbWVQYXR0ZXJuKCJtZWFzdXJlZC1mcmFtZS1yYXRlLShbMC05XSspWyp4XShbMC05XSspLXJhbmdlIiwKKyAgICAgICAgICAgICAgICBzdGQ6OnJlZ2V4X2NvbnN0YW50czo6aWNhc2UpOworICAgICAgICBzdGQ6OmNtYXRjaCBzaXplTWF0Y2g7CisgICAgICAgIGlmIChzdGQ6OnJlZ2V4X21hdGNoKGVudHJ5TmFtZSwgc2l6ZU1hdGNoLCBmcmFtZVJhdGVOYW1lUGF0dGVybikgJiYKKyAgICAgICAgICAgICAgICBzaXplTWF0Y2guc2l6ZSgpID09IDMpIHsKKyAgICAgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBpdGVtID0gZGV0YWlscy0+Z2V0RW50cnlBdChpKTsKKyAgICAgICAgICAgIEFTdHJpbmcgZnBzUmFuZ2VTdHI7CisgICAgICAgICAgICBpZiAoaXRlbS5maW5kKCZmcHNSYW5nZVN0cikpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6ICVzIiwgZW50cnlOYW1lLCBmcHNSYW5nZVN0ci5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnJlZ2V4IGZyYW1lUmF0ZVBhdHRlcm4oIihbMC05XSspLShbMC05XSspIik7CisgICAgICAgICAgICAgICAgc3RkOjpjbWF0Y2ggZnBzTWF0Y2g7CisgICAgICAgICAgICAgICAgaWYgKHN0ZDo6cmVnZXhfbWF0Y2goZnBzUmFuZ2VTdHIuY19zdHIoKSwgZnBzTWF0Y2gsIGZyYW1lUmF0ZVBhdHRlcm4pICYmCisgICAgICAgICAgICAgICAgICAgICAgICBmcHNNYXRjaC5zaXplKCkgPT0gMykgeworICAgICAgICAgICAgICAgICAgICBtYXBzLT5lbXBsYWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKHN0b2koc2l6ZU1hdGNoWzFdKSwgc3RvaShzaXplTWF0Y2hbMl0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihzdG9pKGZwc01hdGNoWzFdKSwgc3RvaShmcHNNYXRjaFsyXSkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmdldENvZGVjU2l6ZVJhbmdlKAorICAgICAgICBjb25zdCBjaGFyKiBjb2RlY05hbWUsCisgICAgICAgIHNwPEFNZXNzYWdlPiBkZXRhaWxzLAorICAgICAgICBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4qIG1pblNpemUsCisgICAgICAgIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiogbWF4U2l6ZSwKKyAgICAgICAgRnJhbWVSYXRlTWFwcyogZnJhbWVSYXRlTWFwcykgeworICAgIGlmIChjb2RlY05hbWUgPT0gbnVsbHB0ciB8fCBtaW5TaXplID09IG51bGxwdHIgfHwgbWF4U2l6ZSA9PSBudWxscHRyIHx8CisgICAgICAgICAgICBkZXRhaWxzID09IG51bGxwdHIgfHwgZnJhbWVSYXRlTWFwcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQVN0cmluZyBzaXplUmFuZ2U7CisgICAgYXV0byBoYXNJdGVtID0gZGV0YWlscy0+ZmluZFN0cmluZygic2l6ZS1yYW5nZSIsICZzaXplUmFuZ2UpOworICAgIGlmICghaGFzSXRlbSkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBxdWVyeSBzaXplIHJhbmdlIGZvciBjb2RlYyAlcyIsIF9fRlVOQ1RJT05fXywgY29kZWNOYW1lKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiAlcyBjb2RlYydzIHNpemUgcmFuZ2UgaXMgJXMiLCBfX0ZVTkNUSU9OX18sIGNvZGVjTmFtZSwgc2l6ZVJhbmdlLmNfc3RyKCkpOworICAgIHN0ZDo6cmVnZXggcGF0dGVybigiKFswLTldKylbKnhdKFswLTldKyktKFswLTldKylbKnhdKFswLTldKykiKTsKKyAgICBzdGQ6OmNtYXRjaCBtYXRjaDsKKyAgICBpZiAoc3RkOjpyZWdleF9tYXRjaChzaXplUmFuZ2UuY19zdHIoKSwgbWF0Y2gsIHBhdHRlcm4pKSB7CisgICAgICAgIGlmIChtYXRjaC5zaXplKCkgPT0gNSkgeworICAgICAgICAgICAgbWluU2l6ZS0+Zmlyc3QgPSBzdG9pKG1hdGNoWzFdKTsKKyAgICAgICAgICAgIG1pblNpemUtPnNlY29uZCA9IHN0b2kobWF0Y2hbMl0pOworICAgICAgICAgICAgbWF4U2l6ZS0+Zmlyc3QgPSBzdG9pKG1hdGNoWzNdKTsKKyAgICAgICAgICAgIG1heFNpemUtPnNlY29uZCA9IHN0b2kobWF0Y2hbNF0pOworICAgICAgICAgICAgaWYgKG1pblNpemUtPmZpcnN0ID4gbWF4U2l6ZS0+Zmlyc3QgfHwKKyAgICAgICAgICAgICAgICAgICAgbWluU2l6ZS0+c2Vjb25kID4gbWF4U2l6ZS0+c2Vjb25kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkICVzIGNvZGUgc2l6ZSByYW5nZTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjb2RlY05hbWUsIHNpemVSYW5nZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF1dG8gcmVzID0gZ2V0RnJhbWVSYXRlTWFwcyhkZXRhaWxzLCBmcmFtZVJhdGVNYXBzKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitIZWljRW5jb2RlckluZm9NYW5hZ2VyOjpGcmFtZVJhdGVNYXBzOjpjb25zdF9pdGVyYXRvciBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjpmaW5kQ2xvc2VzdFNpemUoCisgICAgICAgIGNvbnN0IEZyYW1lUmF0ZU1hcHMmIG1hcHMsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSBjb25zdCB7CisgICAgaW50MzJfdCBtaW5EaWZmID0gSU5UMzJfTUFYOworICAgIEZyYW1lUmF0ZU1hcHM6OmNvbnN0X2l0ZXJhdG9yIGNsb3Nlc3RJdGVyID0gbWFwcy5iZWdpbigpOworICAgIGZvciAoYXV0byBpdGVyID0gbWFwcy5iZWdpbigpOyBpdGVyICE9IG1hcHMuZW5kKCk7IGl0ZXIrKykgeworICAgICAgICAvLyBVc2UgYXJlYSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNpemVzIHRvIGFwcHJveGltYXRlIHNpemUKKyAgICAgICAgLy8gZGlmZmVyZW5jZS4KKyAgICAgICAgaW50MzJfdCBkaWZmID0gYWJzKGl0ZXItPmZpcnN0LmZpcnN0ICogaXRlci0+Zmlyc3Quc2Vjb25kIC0gd2lkdGggKiBoZWlnaHQpOworICAgICAgICBpZiAoZGlmZiA8IG1pbkRpZmYpIHsKKyAgICAgICAgICAgIGNsb3Nlc3RJdGVyID0gaXRlcjsKKyAgICAgICAgICAgIG1pbkRpZmYgPSBkaWZmOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjbG9zZXN0SXRlcjsKK30KKworc3A8QU1lc3NhZ2U+IEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmdldENvZGVjRGV0YWlscygKKyAgICAgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBjb2RlY3NMaXN0LCBjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgc3NpemVfdCBpZHggPSBjb2RlY3NMaXN0LT5maW5kQ29kZWNCeVR5cGUobmFtZSwgdHJ1ZSAvKmVuY29kZXIqLyk7CisgICAgaWYgKGlkeCA8IDApIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBjb2RlY3NMaXN0LT5nZXRDb2RlY0luZm8oaWR4KTsKKyAgICBpZiAoaW5mbyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldCBjb2RlYyBpbmZvIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgbmFtZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjb25zdCBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBjYXBzID0KKyAgICAgICAgICAgIGluZm8tPmdldENhcGFiaWxpdGllc0ZvcihuYW1lKTsKKyAgICBpZiAoY2FwcyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldCBjYXBhYmlsaXRpZXMgZm9yIGNvZGVjICVzIiwgX19GVU5DVElPTl9fLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNvbnN0IHNwPEFNZXNzYWdlPiBkZXRhaWxzID0gY2Fwcy0+Z2V0RGV0YWlscygpOworICAgIGlmIChkZXRhaWxzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IGRldGFpbHMgZm9yIGNvZGVjICVzIiwgX19GVU5DVElPTl9fLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIGRldGFpbHM7Cit9Cit9IC8vbmFtZXNwYWNlIGNhbWVyYTMKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0VuY29kZXJJbmZvTWFuYWdlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljRW5jb2RlckluZm9NYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIwYjkxNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0VuY29kZXJJbmZvTWFuYWdlci5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfSEVJQ0VOQ09ERVJfSU5GT19NQU5BR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9IRUlDRU5DT0RFUl9JTkZPX01BTkFHRVJfSAorCisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCitjbGFzcyBIZWljRW5jb2RlckluZm9NYW5hZ2VyIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgSGVpY0VuY29kZXJJbmZvTWFuYWdlciYgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHN0YXRpYyBIZWljRW5jb2RlckluZm9NYW5hZ2VyIGluc3RhbmNlOworICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgYm9vbCBpc1NpemVTdXBwb3J0ZWQoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICBib29sKiB1c2VIZWljLCBib29sKiB1c2VHcmlkLCBpbnQ2NF90KiBzdGFsbCkgY29uc3Q7CisKKyAgICBzdGF0aWMgY29uc3QgYXV0byBrR3JpZFdpZHRoID0gNTEyOworICAgIHN0YXRpYyBjb25zdCBhdXRvIGtHcmlkSGVpZ2h0ID0gNTEyOworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgU2l6ZVBhaXJIYXNoIHsKKyAgICAgICAgc3RkOjpzaXplX3Qgb3BlcmF0b3IgKCkgKGNvbnN0IHN0ZDo6cGFpcjxpbnQzMl90LGludDMyX3Q+ICZwKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gcC5maXJzdCAqIDMxICsgcC5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+LAorICAgICAgICAgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+LCBTaXplUGFpckhhc2g+IEZyYW1lUmF0ZU1hcHM7CisKKyAgICBIZWljRW5jb2RlckluZm9NYW5hZ2VyKCk7CisgICAgdmlydHVhbCB+SGVpY0VuY29kZXJJbmZvTWFuYWdlcigpOworCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZSgpOworICAgIHN0YXR1c190IGdldEZyYW1lUmF0ZU1hcHMoc3A8QU1lc3NhZ2U+IGRldGFpbHMsIEZyYW1lUmF0ZU1hcHMqIG1hcHMpOworICAgIHN0YXR1c190IGdldENvZGVjU2l6ZVJhbmdlKGNvbnN0IGNoYXIqIGNvZGVjTmFtZSwgc3A8QU1lc3NhZ2U+IGRldGFpbHMsCisgICAgICAgICAgICBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4qIG1pblNpemUsIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiogbWF4U2l6ZSwKKyAgICAgICAgICAgIEZyYW1lUmF0ZU1hcHMqIGZyYW1lUmF0ZU1hcHMpOworICAgIEZyYW1lUmF0ZU1hcHM6OmNvbnN0X2l0ZXJhdG9yIGZpbmRDbG9zZXN0U2l6ZShjb25zdCBGcmFtZVJhdGVNYXBzJiBtYXBzLAorICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIGNvbnN0OworICAgIHNwPEFNZXNzYWdlPiBnZXRDb2RlY0RldGFpbHMoc3A8SU1lZGlhQ29kZWNMaXN0PiBjb2RlY3NMaXN0LCBjb25zdCBjaGFyKiBuYW1lKTsKKworICAgIGJvb2wgbUlzSW5pdGVkOworICAgIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiBtTWluU2l6ZUhlaWMsIG1NYXhTaXplSGVpYzsKKyAgICBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4gbU1pblNpemVIZXZjLCBtTWF4U2l6ZUhldmM7CisgICAgYm9vbCBtSGFzSEVWQywgbUhhc0hFSUM7CisgICAgRnJhbWVSYXRlTWFwcyBtSGVpY0ZyYW1lUmF0ZU1hcHMsIG1IZXZjRnJhbWVSYXRlTWFwczsKKyAgICBib29sIG1EaXNhYmxlR3JpZDsKKworfTsKKworfSAvLyBuYW1lc3BhY2UgY2FtZXJhMworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9IRUlDRU5DT0RFUl9JTkZPX01BTkFHRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKaW5kZXggY2UwMDZhNy4uNzhmZWIzZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCkBAIC0zMiwxNCArMzIsMTEgQEAKICNpbmNsdWRlICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgogCiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogdXNpbmcgbmFtZXNwYWNlIGNhbWVyYTI7CiAKLXN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1BpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotfQotCiAvLyBJbnRlcmZhY2UgdXNlZCBieSBDYW1lcmFTZXJ2aWNlCiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KQEAgLTU3LDEzICs1NCwxMyBAQAogICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBhcGkxQ2FtZXJhSWQsIGNhbWVyYUZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQpLAogICAgICAgICBtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzKHJlbW90ZUNhbGxiYWNrKSwKICAgICAgICAgbURldmljZVZlcnNpb24oY2FtZXJhU2VydmljZS0+Z2V0RGV2aWNlVmVyc2lvbihUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyKSksCisgICAgICAgIG1EZXZpY2UobmV3IENhbWVyYTNEZXZpY2UoY2FtZXJhSWQpKSwKICAgICAgICAgbURldmljZUFjdGl2ZShmYWxzZSksIG1BcGkxQ2FtZXJhSWQoYXBpMUNhbWVyYUlkKQogewogICAgIEFMT0dJKCJDYW1lcmEgJXM6IE9wZW5lZC4gQ2xpZW50OiAlcyAoUElEICVkLCBVSUQgJWQpIiwgY2FtZXJhSWQuc3RyaW5nKCksCiAgICAgICAgICAgICBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwgY2xpZW50UGlkLCBjbGllbnRVaWQpOwogCiAgICAgbUluaXRpYWxDbGllbnRQaWQgPSBjbGllbnRQaWQ7Ci0gICAgbURldmljZSA9IG5ldyBDYW1lcmEzRGV2aWNlKGNhbWVyYUlkKTsKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1EZXZpY2UgPT0gMCwgIkRldmljZSBzaG91bGQgbmV2ZXIgYmUgTlVMTCBoZXJlLiIpOwogfQogCkBAIC03MSw3ICs2OCw3IEBACiBzdGF0dXNfdCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OmNoZWNrUGlkKGNvbnN0IGNoYXIqIGNoZWNrTG9jYXRpb24pCiAgICAgICAgIGNvbnN0IHsKIAotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBpZiAoY2FsbGluZ1BpZCA9PSBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCkgcmV0dXJuIE5PX0VSUk9SOwogCiAgICAgQUxPR0UoIiVzOiBhdHRlbXB0IHRvIHVzZSBhIGxvY2tlZCBjYW1lcmEgZnJvbSBhIGRpZmZlcmVudCBwcm9jZXNzIgpAQCAtMTg2LDcgKzE4Myw3IEBACiAKICAgICBiaW5kZXI6OlN0YXR1cyByZXMgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICAvLyBBbGxvdyBib3RoIGNsaWVudCBhbmQgdGhlIG1lZGlhIHNlcnZlciB0byBkaXNjb25uZWN0IGF0IGFsbCB0aW1lcwotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBpZiAoY2FsbGluZ1BpZCAhPSBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCAmJgogICAgICAgICBjYWxsaW5nUGlkICE9IFRDbGllbnRCYXNlOjptU2VydmljZVBpZCkgcmV0dXJuIHJlczsKIApAQCAtMjA2LDggKzIwMyw2IEBACiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuOwogICAgIG1EZXZpY2UtPmRpc2Nvbm5lY3QoKTsKIAotICAgIG1EZXZpY2UuY2xlYXIoKTsKLQogICAgIEFMT0dWKCJDYW1lcmEgJXM6IERldGFjaCBjb21wbGV0ZSIsIFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOwogfQogCkBAIC0yMTksMTggKzIxNCwxOCBAQAogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKIAogICAgIGlmIChUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCAhPSAwICYmCi0gICAgICAgIGdldENhbGxpbmdQaWQoKSAhPSBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCkgeworICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpICE9IFRDbGllbnRCYXNlOjptQ2xpZW50UGlkKSB7CiAKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJXM6IENvbm5lY3Rpb24gYXR0ZW1wdCBmcm9tIHBpZCAlZDsgIgogICAgICAgICAgICAgICAgICJjdXJyZW50IGxvY2tlZCB0byBwaWQgJWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLnN0cmluZygpLAotICAgICAgICAgICAgICAgIGdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgIFRDbGllbnRCYXNlOjptQ2xpZW50UGlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAKICAgICBUQ2xpZW50QmFzZTo6bVJlbW90ZUNhbGxiYWNrID0gY2xpZW50OwogICAgIG1TaGFyZWRDYW1lcmFDYWxsYmFja3MgPSBjbGllbnQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCmluZGV4IGU3NGZiZGYuLjY2OTM4NDcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCkBAIC0xMzAsNyArMTMwLDEwIEBACiAgICAgLyoqIENhbWVyYURldmljZUJhc2UgaW5zdGFuY2Ugd3JhcHBpbmcgSEFMMysgZW50cnkgKi8KIAogICAgIGNvbnN0IGludCBtRGV2aWNlVmVyc2lvbjsKLSAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiAgbURldmljZTsKKworICAgIC8vIFNldCB0byBjb25zdCB0byBhdm9pZCBtRGV2aWNlIGJlaW5nIHVwZGF0ZWQgKHVwZGF0ZSBvZiBzcDw+IGlzIHJhY3kpIGR1cmluZworICAgIC8vIGR1bXBEZXZpY2UgKHdoaWNoIGlzIGltcG9ydGFudCB0byBiZSBsb2NrIGZyZWUgZm9yIGRlYnVnZ2luZyBwdXJwb3NlKQorICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICBtRGV2aWNlOwogCiAgICAgLyoqIFV0aWxpdHkgbWVtYmVycyAqLwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCmluZGV4IDBjZTQzMTguLmQ2Nzg5YTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCkBAIC0yMCwyNyArMjAsNDIgQEAKIAogI2luY2x1ZGUgIkNhbWVyYVByb3ZpZGVyTWFuYWdlci5oIgogCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlLmg+CisKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgImNvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmgiCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxmdXR1cmU+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmFfY29tbW9uLmg+CiAjaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgogI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlICJhcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOwogdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOwordXNpbmcgc3RkOjpsaXRlcmFsczo6Y2hyb25vX2xpdGVyYWxzOjpvcGVyYXRvciIiczsKIAogbmFtZXNwYWNlIHsKIC8vIEhhcmRjb2RlZCBuYW1lIGZvciB0aGUgcGFzc3Rocm91Z2ggSEFMIGltcGxlbWVudGF0aW9uLCBzaW5jZSBpdCBjYW4ndCBiZSBkaXNjb3ZlcmVkIHZpYSB0aGUKIC8vIHNlcnZpY2UgbWFuYWdlcgogY29uc3Qgc3RkOjpzdHJpbmcga0xlZ2FjeVByb3ZpZGVyTmFtZSgibGVnYWN5LzAiKTsKIGNvbnN0IHN0ZDo6c3RyaW5nIGtFeHRlcm5hbFByb3ZpZGVyTmFtZSgiZXh0ZXJuYWwvMCIpOwotCitjb25zdCBib29sIGtFbmFibGVMYXp5SGFsKHByb3BlcnR5X2dldF9ib29sKCJyby5jYW1lcmEuZW5hYmxlTGF6eUhhbCIsIGZhbHNlKSk7CiB9IC8vIGFub255bW91cyBuYW1lc3BhY2UKIAorY29uc3QgZmxvYXQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjprRGVwdGhBUlRvbGVyYW5jZSA9IC4xZjsKKwogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpIYXJkd2FyZVNlcnZpY2VJbnRlcmFjdGlvblByb3h5CiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnNIYXJkd2FyZVNlcnZpY2VJbnRlcmFjdGlvblByb3h5e307CiAKQEAgLTU2LDYgKzcxLDggQEAKICAgICB9CiAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CiAgICAgbVNlcnZpY2VQcm94eSA9IHByb3h5OworICAgIG1EZXZpY2VTdGF0ZSA9IHN0YXRpY19jYXN0PGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPHByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4+KAorICAgICAgICBwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU6Ok5PUk1BTCk7CiAKICAgICAvLyBSZWdpc3RlcmluZyB3aWxsIHRyaWdnZXIgbm90aWZpY2F0aW9ucyBmb3IgYWxsIGFscmVhZHkta25vd24gcHJvdmlkZXJzCiAgICAgYm9vbCBzdWNjZXNzID0gbVNlcnZpY2VQcm94eS0+cmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKApAQCAtNzEsNiArODgsOCBAQAogICAgIGFkZFByb3ZpZGVyTG9ja2VkKGtMZWdhY3lQcm92aWRlck5hbWUsIC8qZXhwZWN0ZWQqLyBmYWxzZSk7CiAgICAgYWRkUHJvdmlkZXJMb2NrZWQoa0V4dGVybmFsUHJvdmlkZXJOYW1lLCAvKmV4cGVjdGVkKi8gZmFsc2UpOwogCisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xNzQsNiArMTkzLDE5IEBACiAgICAgcmV0dXJuIGRldmljZUluZm8tPmdldENhbWVyYUluZm8oaW5mbyk7CiB9CiAKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChjb25zdCBzdGQ6OnN0cmluZyYgaWQsCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiwKKyAgICAgICAgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOworCisgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOworICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHJldHVybiBkZXZpY2VJbmZvLT5pc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKGNvbmZpZ3VyYXRpb24sIHN0YXR1cyk7Cit9CisKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEqIGNoYXJhY3RlcmlzdGljcykgY29uc3QgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CkBAIC0yMDMsMjYgKzIzNSwxNSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN1cHBvcnRTZXRUb3JjaE1vZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmlkKSB7Citib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3VwcG9ydFNldFRvcmNoTW9kZShjb25zdCBzdGQ6OnN0cmluZyAmaWQpIGNvbnN0IHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwotICAgIGJvb2wgc3VwcG9ydCA9IGZhbHNlOwogICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7CiAgICAgICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKICAgICAgICAgaWYgKGRldmljZUluZm8gIT0gbnVsbHB0cikgewotICAgICAgICAgICAgYXV0byByZXQgPSBwcm92aWRlci0+bUludGVyZmFjZS0+aXNTZXRUb3JjaE1vZGVTdXBwb3J0ZWQoCi0gICAgICAgICAgICAgICAgWyZzdXBwb3J0XShhdXRvIHN0YXR1cywgYm9vbCBzdXBwb3J0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ID0gc3VwcG9ydGVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGNoZWNraW5nIHRvcmNoIG1vZGUgc3VwcG9ydCAnJXMnOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHByb3ZpZGVyLT5tUHJvdmlkZXJOYW1lLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXItPm1TZXRUb3JjaE1vZGVTdXBwb3J0ZWQ7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHN1cHBvcnQ7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnNldFRvcmNoTW9kZShjb25zdCBzdGQ6OnN0cmluZyAmaWQsIGJvb2wgZW5hYmxlZCkgewpAQCAtMjMxLDYgKzI1MiwxNSBAQAogICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKICAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiAKKyAgICAvLyBQYXNzIHRoZSBjYW1lcmEgSUQgdG8gc3RhcnQgaW50ZXJmYWNlIHNvIHRoYXQgaXQgd2lsbCBzYXZlIGl0IHRvIHRoZSBtYXAgb2YgSUNhbWVyYVByb3ZpZGVycworICAgIC8vIHRoYXQgYXJlIGN1cnJlbnRseSBpbiB1c2UuCisgICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlID0KKyAgICAgICAgICAgIGRldmljZUluZm8tPm1QYXJlbnRQcm92aWRlci0+c3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHNhdmVSZWYoRGV2aWNlTW9kZTo6VE9SQ0gsIGRldmljZUluZm8tPm1JZCwgaW50ZXJmYWNlKTsKKwogICAgIHJldHVybiBkZXZpY2VJbmZvLT5zZXRUb3JjaE1vZGUoZW5hYmxlZCk7CiB9CiAKQEAgLTIzOCwzNyArMjY4LDcgQEAKICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU+IHRhZ0NhY2hlID0gbmV3IFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZSgpOwogCiAgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKLSAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPFZlbmRvclRhZ1NlY3Rpb24+IHZ0czsKLSAgICAgICAgU3RhdHVzIHN0YXR1czsKLSAgICAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgICAgIHJldCA9IHByb3ZpZGVyLT5tSW50ZXJmYWNlLT5nZXRWZW5kb3JUYWdzKAotICAgICAgICAgICAgWyZdKGF1dG8gcywgY29uc3QgYXV0byYgdmVuZG9yVGFnU2VjcykgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgaWYgKHMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICB2dHMgPSB2ZW5kb3JUYWdTZWNzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBnZXR0aW5nIHZlbmRvciB0YWdzIGZyb20gcHJvdmlkZXIgJyVzJzogJXMiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHByb3ZpZGVyLT5tUHJvdmlkZXJOYW1lLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVhZCBhbGwgdmVuZG9yIHRhZyBkZWZpbml0aW9ucyBpbnRvIGEgZGVzY3JpcHRvcgotICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkZXNjOwotICAgICAgICBzdGF0dXNfdCByZXM7Ci0gICAgICAgIGlmICgocmVzID0gSGlkbFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tSGlkbCh2dHMsIC8qb3V0Ki9kZXNjKSkKLSAgICAgICAgICAgICAgICAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgZ2VuZXJhdGUgZGVzY3JpcHRvciBmcm9tIHZlbmRvciB0YWcgb3BlcmF0aW9ucywiCi0gICAgICAgICAgICAgICAgICAicmVjZWl2ZWQgZXJyb3IgJXMgKCVkKS4gQ2FtZXJhIGNsaWVudHMgd2lsbCBub3QgYmUgYWJsZSB0byB1c2UiCi0gICAgICAgICAgICAgICAgICAidmVuZG9yIHRhZ3MiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKHJlcyksIHJlcyk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0KLSAgICAgICAgdGFnQ2FjaGUtPmFkZFZlbmRvckRlc2NyaXB0b3IocHJvdmlkZXItPm1Qcm92aWRlclRhZ2lkLCBkZXNjKTsKKyAgICAgICAgdGFnQ2FjaGUtPmFkZFZlbmRvckRlc2NyaXB0b3IocHJvdmlkZXItPm1Qcm92aWRlclRhZ2lkLCBwcm92aWRlci0+bVZlbmRvclRhZ0Rlc2NyaXB0b3IpOwogICAgIH0KIAogICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTo6c2V0QXNHbG9iYWxWZW5kb3JUYWdDYWNoZSh0YWdDYWNoZSk7CkBAIC0yNzYsMTAgKzI3NiwzMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSgKKyAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPiBuZXdTdGF0ZSkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CisgICAgbURldmljZVN0YXRlID0gbmV3U3RhdGU7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBOb3RpZnlpbmcgJXMgZm9yIG5ldyBzdGF0ZSAweCUiIFBSSXg2NCwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHByb3ZpZGVyLT5tUHJvdmlkZXJOYW1lLmNfc3RyKCksIG5ld1N0YXRlKTsKKyAgICAgICAgc3RhdHVzX3Qgc2luZ2xlUmVzID0gcHJvdmlkZXItPm5vdGlmeURldmljZVN0YXRlQ2hhbmdlKG1EZXZpY2VTdGF0ZSk7CisgICAgICAgIGlmIChzaW5nbGVSZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIG5vdGlmeSBwcm92aWRlciAlcyBhYm91dCBkZXZpY2Ugc3RhdGUgY2hhbmdlIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBwcm92aWRlci0+bVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJlcyA9IHNpbmdsZVJlczsKKyAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRvIGRvIHRoZSByZXN0IG9mIHRoZSBwcm92aWRlcnMgaW5zdGVhZCBvZiByZXR1cm5pbmcgbm93CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpvcGVuU2Vzc2lvbihjb25zdCBzdGQ6OnN0cmluZyAmaWQsCi0gICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgIGNvbnN0IHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCiAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gKnNlc3Npb24pIHsKKyAgICAgICAgc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gKnNlc3Npb24pIHsKIAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CiAKQEAgLTI4OCwxMCArMzA4LDIyIEBACiAgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogCiAgICAgYXV0byAqZGV2aWNlSW5mbzMgPSBzdGF0aWNfY2FzdDxQcm92aWRlckluZm86OkRldmljZUluZm8zKj4oZGV2aWNlSW5mbyk7CisgICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIgPQorICAgICAgICAgICAgZGV2aWNlSW5mby0+bVBhcmVudFByb3ZpZGVyLT5zdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKHByb3ZpZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBzYXZlUmVmKERldmljZU1vZGU6OkNBTUVSQSwgaWQsIHByb3ZpZGVyKTsKIAogICAgIFN0YXR1cyBzdGF0dXM7CiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgcmV0ID0gZGV2aWNlSW5mbzMtPm1JbnRlcmZhY2UtPm9wZW4oY2FsbGJhY2ssIFsmc3RhdHVzLCAmc2Vzc2lvbl0KKyAgICBhdXRvIGludGVyZmFjZSA9IGRldmljZUluZm8zLT5zdGFydERldmljZUludGVyZmFjZTwKKyAgICAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6SW50ZXJmYWNlVD4oKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIHJldCA9IGludGVyZmFjZS0+b3BlbihjYWxsYmFjaywgWyZzdGF0dXMsICZzZXNzaW9uXQogICAgICAgICAgICAgKFN0YXR1cyBzLCBjb25zdCBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiYgY2FtZXJhU2Vzc2lvbikgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CkBAIC0yOTksNiArMzMxLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9KTsKICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgcmVtb3ZlUmVmKERldmljZU1vZGU6OkNBTUVSQSwgaWQpOwogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIG9wZW5pbmcgYSBzZXNzaW9uIGZvciBjYW1lcmEgZGV2aWNlICVzOiAlcyIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwpAQCAtMzA3LDkgKzM0MCw5IEBACiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6b3BlblNlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAotICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICBjb25zdCBzcDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAvKm91dCovCi0gICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4gKnNlc3Npb24pIHsKKyAgICAgICAgc3A8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPiAqc2Vzc2lvbikgewogCiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKIApAQCAtMzE4LDI0ICszNTEsOTEgQEAKICAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiAKICAgICBhdXRvICpkZXZpY2VJbmZvMSA9IHN0YXRpY19jYXN0PFByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzEqPihkZXZpY2VJbmZvKTsKKyAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlciA9CisgICAgICAgICAgICBkZXZpY2VJbmZvLT5tUGFyZW50UHJvdmlkZXItPnN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBpZiAocHJvdmlkZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHNhdmVSZWYoRGV2aWNlTW9kZTo6Q0FNRVJBLCBpZCwgcHJvdmlkZXIpOwogCi0gICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0YXR1cyA9IGRldmljZUluZm8xLT5tSW50ZXJmYWNlLT5vcGVuKGNhbGxiYWNrKTsKKyAgICBhdXRvIGludGVyZmFjZSA9IGRldmljZUluZm8xLT5zdGFydERldmljZUludGVyZmFjZTwKKyAgICAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6SW50ZXJmYWNlVD4oKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gc3RhdHVzID0gaW50ZXJmYWNlLT5vcGVuKGNhbGxiYWNrKTsKICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgcmVtb3ZlUmVmKERldmljZU1vZGU6OkNBTUVSQSwgaWQpOwogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIG9wZW5pbmcgYSBzZXNzaW9uIGZvciBjYW1lcmEgZGV2aWNlICVzOiAlcyIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgKnNlc3Npb24gPSBkZXZpY2VJbmZvMS0+bUludGVyZmFjZTsKKyAgICAgICAgKnNlc3Npb24gPSBpbnRlcmZhY2U7CiAgICAgfQogICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKIH0KIAordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnNhdmVSZWYoRGV2aWNlTW9kZSB1c2FnZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCwKKyAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIpIHsKKyAgICBpZiAoIWtFbmFibGVMYXp5SGFsKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoIlNhdmluZyBjYW1lcmEgcHJvdmlkZXIgJXMgZm9yIGNhbWVyYSBkZXZpY2UgJXMiLCBwcm92aWRlci0+ZGVzY3JpcHRvciwgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVByb3ZpZGVySW50ZXJmYWNlTWFwTG9jayk7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPj4gKnByaW1hcnlNYXAsICphbHRlcm5hdGVNYXA7CisgICAgaWYgKHVzYWdlVHlwZSA9PSBEZXZpY2VNb2RlOjpUT1JDSCkgeworICAgICAgICBwcmltYXJ5TWFwID0gJm1Ub3JjaFByb3ZpZGVyQnlDYW1lcmFJZDsKKyAgICAgICAgYWx0ZXJuYXRlTWFwID0gJm1DYW1lcmFQcm92aWRlckJ5Q2FtZXJhSWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbWFyeU1hcCA9ICZtQ2FtZXJhUHJvdmlkZXJCeUNhbWVyYUlkOworICAgICAgICBhbHRlcm5hdGVNYXAgPSAmbVRvcmNoUHJvdmlkZXJCeUNhbWVyYUlkOworICAgIH0KKyAgICBhdXRvIGlkID0gY2FtZXJhSWQuY19zdHIoKTsKKyAgICAoKnByaW1hcnlNYXApW2lkXSA9IHByb3ZpZGVyOworICAgIGF1dG8gc2VhcmNoID0gYWx0ZXJuYXRlTWFwLT5maW5kKGlkKTsKKyAgICBpZiAoc2VhcmNoICE9IGFsdGVybmF0ZU1hcC0+ZW5kKCkpIHsKKyAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgZGV2aWNlICVzIGlzIHVzaW5nIGJvdGggdG9yY2ggbW9kZSBhbmQgY2FtZXJhIG1vZGUgc2ltdWx0YW5lb3VzbHkuICIKKyAgICAgICAgICAgICAgICAiVGhhdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIiwgX19GVU5DVElPTl9fLCBpZCk7CisgICAgfQorICAgIEFMT0dWKCIlczogQ2FtZXJhIGRldmljZSAlcyBjb25uZWN0ZWQiLCBfX0ZVTkNUSU9OX18sIGlkKTsKK30KKwordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnJlbW92ZVJlZihEZXZpY2VNb2RlIHVzYWdlVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmNhbWVyYUlkKSB7CisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJSZW1vdmluZyBjYW1lcmEgZGV2aWNlICVzIiwgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPj4gKnByb3ZpZGVyTWFwOworICAgIGlmICh1c2FnZVR5cGUgPT0gRGV2aWNlTW9kZTo6VE9SQ0gpIHsKKyAgICAgICAgcHJvdmlkZXJNYXAgPSAmbVRvcmNoUHJvdmlkZXJCeUNhbWVyYUlkOworICAgIH0gZWxzZSB7CisgICAgICAgIHByb3ZpZGVyTWFwID0gJm1DYW1lcmFQcm92aWRlckJ5Q2FtZXJhSWQ7CisgICAgfQorICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Qcm92aWRlckludGVyZmFjZU1hcExvY2spOworICAgIGF1dG8gc2VhcmNoID0gcHJvdmlkZXJNYXAtPmZpbmQoY2FtZXJhSWQuY19zdHIoKSk7CisgICAgaWYgKHNlYXJjaCAhPSBwcm92aWRlck1hcC0+ZW5kKCkpIHsKKyAgICAgICAgLy8gRHJvcCB0aGUgcmVmZXJlbmNlIHRvIHRoaXMgSUNhbWVyYVByb3ZpZGVyLiBUaGlzIGlzIHNhZmUgdG8gZG8gaW1tZWRpYXRlbHkgKHdpdGhvdXQgYW4KKyAgICAgICAgLy8gYWRkZWQgZGVsYXkpIGJlY2F1c2UgaHdzZXJ2aWNlbWFuYWdlciBndWFyYW50ZWVzIHRvIGhvbGQgdGhlIHJlZmVyZW5jZSBmb3IgYXQgbGVhc3QgZml2ZQorICAgICAgICAvLyBtb3JlIHNlY29uZHMuICBXZSBkZXBlbmQgb24gdGhpcyBiZWhhdmlvciBzbyB0aGF0IGlmIHRoZSBwcm92aWRlciBpcyB1bnJlZmVyZW5jZWQgYW5kCisgICAgICAgIC8vIHRoZW4gcmVmZXJlbmNlZCBhZ2FpbiBxdWlja2x5LCB3ZSBkbyBub3QgbGV0IHRoZSBIQUwgZXhpdCBhbmQgdGhlbiBuZWVkIHRvIGltbWVkaWF0ZWx5CisgICAgICAgIC8vIHJlc3RhcnQgaXQuIEFuIGV4YW1wbGUgd2hlbiB0aGlzIGNvdWxkIGhhcHBlbiBpcyBzd2l0Y2hpbmcgZnJvbSBhIGZyb250LWZhY2luZyB0byBhCisgICAgICAgIC8vIHJlYXItZmFjaW5nIGNhbWVyYS4gSWYgdGhlIEhBTCB3ZXJlIHRvIGV4aXQgZHVyaW5nIHRoZSBjYW1lcmEgc3dpdGNoLCB0aGUgY2FtZXJhIGNvdWxkCisgICAgICAgIC8vIGFwcGVhciBqYW5reSB0byB0aGUgdXNlci4KKyAgICAgICAgcHJvdmlkZXJNYXAtPmVyYXNlKGNhbWVyYUlkLmNfc3RyKCkpOworICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBc2tlZCB0byByZW1vdmUgcmVmZXJlbmNlIGZvciBjYW1lcmEgJXMsIGJ1dCBubyByZWZlcmVuY2UgdG8gaXQgd2FzIGZvdW5kLiBUaGlzICIKKyAgICAgICAgICAgICAgICAiY291bGQgbWVhbiByZW1vdmVSZWYgd2FzIGNhbGxlZCB0d2ljZSBmb3IgdGhlIHNhbWUgY2FtZXJhIElELiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICB9Cit9CiAKIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpvblJlZ2lzdHJhdGlvbigKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiAvKmZxTmFtZSovLAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIG5hbWUsCiAgICAgICAgIGJvb2wgLypwcmVleGlzdGluZyovKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IHByb3ZpZGVyTG9jayhtUHJvdmlkZXJMaWZlY3ljbGVMb2NrKTsKICAgICB7CiAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CiAKQEAgLTM0Nyw2ICs0NDcsOCBAQAogICAgICAgICBsaXN0ZW5lci0+b25OZXdQcm92aWRlclJlZ2lzdGVyZWQoKTsKICAgICB9CiAKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisKICAgICByZXR1cm4gaGFyZHdhcmU6OlJldHVybjx2b2lkPigpOwogfQogCkBAIC0zOTIsMzUgKzQ5NCw1OTcgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1ib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNMb2dpY2FsQ2FtZXJhKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvLAotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHBoeXNpY2FsQ2FtZXJhSWRzKSB7Ci0gICAgYm9vbCBpc0xvZ2ljYWxDYW0gPSBmYWxzZTsKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeUNhcDsKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpxdWVyeVBoeXNpY2FsQ2FtZXJhSWRzKCkgeworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5Q2FwOwogCi0gICAgZW50cnlDYXAgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOworICAgIGVudHJ5Q2FwID0gbUNhbWVyYUNoYXJhY3RlcmlzdGljcy5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5Q2FwLmNvdW50OyArK2kpIHsKICAgICAgICAgdWludDhfdCBjYXBhYmlsaXR5ID0gZW50cnlDYXAuZGF0YS51OFtpXTsKICAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTE9HSUNBTF9NVUxUSV9DQU1FUkEpIHsKLSAgICAgICAgICAgIGlzTG9naWNhbENhbSA9IHRydWU7CisgICAgICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQotICAgIGlmICghaXNMb2dpY2FsQ2FtKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIW1Jc0xvZ2ljYWxDYW1lcmEpIHsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5SWRzID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfTE9HSUNBTF9NVUxUSV9DQU1FUkFfUEhZU0lDQUxfSURTKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeUlkcyA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZCgKKyAgICAgICAgICAgIEFORFJPSURfTE9HSUNBTF9NVUxUSV9DQU1FUkFfUEhZU0lDQUxfSURTKTsKICAgICBjb25zdCB1aW50OF90KiBpZHMgPSBlbnRyeUlkcy5kYXRhLnU4OwogICAgIHNpemVfdCBzdGFydCA9IDA7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeUlkcy5jb3VudDsgKytpKSB7CiAgICAgICAgIGlmIChpZHNbaV0gPT0gJ1wwJykgewogICAgICAgICAgICAgaWYgKHN0YXJ0ICE9IGkpIHsKLSAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcy0+cHVzaF9iYWNrKChjb25zdCBjaGFyKilpZHMrc3RhcnQpOworICAgICAgICAgICAgICAgIG1QaHlzaWNhbElkcy5wdXNoX2JhY2soKGNvbnN0IGNoYXIqKWlkcytzdGFydCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdGFydCA9IGkrMTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYSgpIHsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeUNhcDsKKyAgICBlbnRyeUNhcCA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgaWYgKGVudHJ5Q2FwLmNvdW50ICE9IDEpIHsKKyAgICAgICAgLy8gRG8gTk9UIGhpZGUgdGhpcyBjYW1lcmEgZGV2aWNlIGlmIHRoZSBjYXBhYmlsaXRpZXMgc3BlY2lmeSBhbnl0aGluZyBtb3JlCisgICAgICAgIC8vIHRoYW4gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfU0VDVVJFX0lNQUdFX0RBVEEuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGVudHJ5Q2FwLmRhdGEudThbMF0gPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfU0VDVVJFX0lNQUdFX0RBVEE7Cit9CisKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpnZXRTdXBwb3J0ZWRTaXplcygKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCB1aW50MzJfdCB0YWcsIGFuZHJvaWRfcGl4ZWxfZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gKnNpemVzLypvdXQqLykgeworICAgIGlmIChzaXplcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIHNjYWxlckRpbXMgPSBjaC5maW5kKHRhZyk7CisgICAgaWYgKHNjYWxlckRpbXMuY291bnQgPiAwKSB7CisgICAgICAgIC8vIFNjYWxlciBlbnRyeSBjb250YWlucyA0IGVsZW1lbnRzIChmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIHR5cGUpCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2NhbGVyRGltcy5jb3VudDsgaSArPSA0KSB7CisgICAgICAgICAgICBpZiAoKHNjYWxlckRpbXMuZGF0YS5pMzJbaV0gPT0gZm9ybWF0KSAmJgorICAgICAgICAgICAgICAgICAgICAoc2NhbGVyRGltcy5kYXRhLmkzMltpKzNdID09CisgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCkpIHsKKyAgICAgICAgICAgICAgICBzaXplcy0+cHVzaF9iYWNrKHN0ZDo6bWFrZV90dXBsZShzY2FsZXJEaW1zLmRhdGEuaTMyW2krMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVyRGltcy5kYXRhLmkzMltpKzJdKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpnZXRTdXBwb3J0ZWREdXJhdGlvbnMoCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwgdWludDMyX3QgdGFnLCBhbmRyb2lkX3BpeGVsX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+JiBzaXplcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKmR1cmF0aW9ucy8qb3V0Ki8pIHsKKyAgICBpZiAoZHVyYXRpb25zID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gYXZhaWxhYmxlRHVyYXRpb25zID0gY2guZmluZCh0YWcpOworICAgIGlmIChhdmFpbGFibGVEdXJhdGlvbnMuY291bnQgPiAwKSB7CisgICAgICAgIC8vIER1cmF0aW9uIGVudHJ5IGNvbnRhaW5zIDQgZWxlbWVudHMgKGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgZHVyYXRpb24pCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlRHVyYXRpb25zLmNvdW50OyBpICs9IDQpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgc2l6ZSA6IHNpemVzKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCB3aWR0aCA9IHN0ZDo6Z2V0PDA+KHNpemUpOworICAgICAgICAgICAgICAgIGludDY0X3QgaGVpZ2h0ID0gc3RkOjpnZXQ8MT4oc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKChhdmFpbGFibGVEdXJhdGlvbnMuZGF0YS5pNjRbaV0gPT0gZm9ybWF0KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZUR1cmF0aW9ucy5kYXRhLmk2NFtpKzFdID09IHdpZHRoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZUR1cmF0aW9ucy5kYXRhLmk2NFtpKzJdID09IGhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25zLT5wdXNoX2JhY2soYXZhaWxhYmxlRHVyYXRpb25zLmRhdGEuaTY0W2krM10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpnZXRTdXBwb3J0ZWREeW5hbWljRGVwdGhEdXJhdGlvbnMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+JiBkZXB0aER1cmF0aW9ucywgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIGJsb2JEdXJhdGlvbnMsCisgICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+ICpkeW5hbWljRGVwdGhEdXJhdGlvbnMgLypvdXQqLykgeworICAgIGlmICgoZHluYW1pY0RlcHRoRHVyYXRpb25zID09IG51bGxwdHIpIHx8IChkZXB0aER1cmF0aW9ucy5zaXplKCkgIT0gYmxvYkR1cmF0aW9ucy5zaXplKCkpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBVbmZvcnR1bmF0ZWx5IHRoZXJlIGlzIG5vIGRpcmVjdCB3YXkgdG8gY2FsY3VsYXRlIHRoZSBkeW5hbWljIGRlcHRoIHN0cmVhbSBkdXJhdGlvbi4KKyAgICAvLyBQcm9jZXNzaW5nIHRpbWUgb24gY2FtZXJhIHNlcnZpY2Ugc2lkZSBjYW4gdmFyeSBncmVhdGx5IGRlcGVuZGluZyBvbiBtdWx0aXBsZQorICAgIC8vIHZhcmlhYmxlcyB3aGljaCBhcmUgbm90IHVuZGVyIG91ciBjb250cm9sLiBNYWtlIGEgZ3Vlc3N0aW1hdGUgYnkgdGFraW5nIHRoZSBtYXhpbXVtCisgICAgLy8gY29ycmVzcG9uZGluZyBkdXJhdGlvbiB2YWx1ZSBmcm9tIGRlcHRoIGFuZCBibG9iLgorICAgIGF1dG8gZGVwdGhEdXJhdGlvbiA9IGRlcHRoRHVyYXRpb25zLmJlZ2luKCk7CisgICAgYXV0byBibG9iRHVyYXRpb24gPSBibG9iRHVyYXRpb25zLmJlZ2luKCk7CisgICAgZHluYW1pY0RlcHRoRHVyYXRpb25zLT5yZXNlcnZlKGRlcHRoRHVyYXRpb25zLnNpemUoKSk7CisgICAgd2hpbGUgKChkZXB0aER1cmF0aW9uICE9IGRlcHRoRHVyYXRpb25zLmVuZCgpKSAmJiAoYmxvYkR1cmF0aW9uICE9IGJsb2JEdXJhdGlvbnMuZW5kKCkpKSB7CisgICAgICAgIGR5bmFtaWNEZXB0aER1cmF0aW9ucy0+cHVzaF9iYWNrKHN0ZDo6bWF4KCpkZXB0aER1cmF0aW9uLCAqYmxvYkR1cmF0aW9uKSk7CisgICAgICAgIGRlcHRoRHVyYXRpb24rKzsgYmxvYkR1cmF0aW9uKys7CisgICAgfQorfQorCit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Z2V0U3VwcG9ydGVkRHluYW1pY0RlcHRoU2l6ZXMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgYmxvYlNpemVzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4mIGRlcHRoU2l6ZXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiAqZHluYW1pY0RlcHRoU2l6ZXMgLypvdXQqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+ICppbnRlcm5hbERlcHRoU2l6ZXMgLypvdXQqLykgeworICAgIGlmIChkeW5hbWljRGVwdGhTaXplcyA9PSBudWxscHRyIHx8IGludGVybmFsRGVwdGhTaXplcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBUaGUgZHluYW1pYyBkZXB0aCBzcGVjLiBkb2VzIG5vdCBtZW50aW9uIGhvdyBjbG9zZSB0aGUgQVIgcmF0aW8gc2hvdWxkIGJlLgorICAgIC8vIFRyeSB1c2luZyBzb21ldGhpbmcgYXBwcm9wcmlhdGUuCisgICAgZmxvYXQgQVJUb2xlcmFuY2UgPSBrRGVwdGhBUlRvbGVyYW5jZTsKKworICAgIGZvciAoY29uc3QgYXV0byYgYmxvYlNpemUgOiBibG9iU2l6ZXMpIHsKKyAgICAgICAgZmxvYXQganBlZ0FSID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+IChzdGQ6OmdldDwwPihibG9iU2l6ZSkpIC8KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oc3RkOjpnZXQ8MT4oYmxvYlNpemUpKTsKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGRlcHRoU2l6ZSA6IGRlcHRoU2l6ZXMpIHsKKyAgICAgICAgICAgIGlmIChkZXB0aFNpemUgPT0gYmxvYlNpemUpIHsKKyAgICAgICAgICAgICAgICBpbnRlcm5hbERlcHRoU2l6ZXMtPnB1c2hfYmFjayhkZXB0aFNpemUpOworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmxvYXQgZGVwdGhBUiA9IHN0YXRpY19jYXN0PGZsb2F0PiAoc3RkOjpnZXQ8MD4oZGVwdGhTaXplKSkgLworICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oc3RkOjpnZXQ8MT4oZGVwdGhTaXplKSk7CisgICAgICAgICAgICAgICAgaWYgKHN0ZDo6ZmFicyhqcGVnQVIgLSBkZXB0aEFSKSA8PSBBUlRvbGVyYW5jZSkgeworICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbERlcHRoU2l6ZXMtPnB1c2hfYmFjayhkZXB0aFNpemUpOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmb3VuZCkgeworICAgICAgICAgICAgZHluYW1pY0RlcHRoU2l6ZXMtPnB1c2hfYmFjayhibG9iU2l6ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjppc0RlcHRoUGhvdG9MaWJyYXJ5UHJlc2VudCgpIHsKKyAgICBzdGF0aWMgYm9vbCBsaWJyYXJ5UHJlc2VudCA9IGZhbHNlOworICAgIHN0YXRpYyBib29sIGluaXRpYWxpemVkID0gZmFsc2U7CisgICAgaWYgKGluaXRpYWxpemVkKSB7CisgICAgICAgIHJldHVybiBsaWJyYXJ5UHJlc2VudDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorCisgICAgdm9pZCogZGVwdGhMaWJIYW5kbGUgPSBkbG9wZW4oY2FtZXJhMzo6a0RlcHRoUGhvdG9MaWJyYXJ5LCBSVExEX05PVyB8IFJUTERfTE9DQUwpOworICAgIGlmIChkZXB0aExpYkhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhdXRvIHByb2Nlc3NGdW5jID0gZGxzeW0oZGVwdGhMaWJIYW5kbGUsIGNhbWVyYTM6OmtEZXB0aFBob3RvUHJvY2Vzc0Z1bmN0aW9uKTsKKyAgICBpZiAocHJvY2Vzc0Z1bmMgIT0gbnVsbHB0cikgeworICAgICAgICBsaWJyYXJ5UHJlc2VudCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbGlicmFyeVByZXNlbnQgPSBmYWxzZTsKKyAgICB9CisgICAgZGxjbG9zZShkZXB0aExpYkhhbmRsZSk7CisKKyAgICByZXR1cm4gbGlicmFyeVByZXNlbnQ7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6YWRkRHluYW1pY0RlcHRoVGFncygpIHsKKyAgICB1aW50MzJfdCBkZXB0aEV4Y2xUYWcgPSBBTkRST0lEX0RFUFRIX0RFUFRIX0lTX0VYQ0xVU0lWRTsKKyAgICB1aW50MzJfdCBkZXB0aFNpemVzVGFnID0gQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TOworICAgIGF1dG8mIGMgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiBzdXBwb3J0ZWRCbG9iU2l6ZXMsIHN1cHBvcnRlZERlcHRoU2l6ZXMsCisgICAgICAgICAgICBzdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcywgaW50ZXJuYWxEZXB0aFNpemVzOworICAgIGF1dG8gY2hUYWdzID0gYy5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVMpOworICAgIGlmIChjaFRhZ3MuY291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IFN1cHBvcnRlZCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGlzIGVtcHR5ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgYm9vbCBpc0RlcHRoRXhjbHVzaXZlUHJlc2VudCA9IHN0ZDo6ZmluZChjaFRhZ3MuZGF0YS5pMzIsIGNoVGFncy5kYXRhLmkzMiArIGNoVGFncy5jb3VudCwKKyAgICAgICAgICAgIGRlcHRoRXhjbFRhZykgIT0gKGNoVGFncy5kYXRhLmkzMiArIGNoVGFncy5jb3VudCk7CisgICAgYm9vbCBpc0RlcHRoU2l6ZVByZXNlbnQgPSBzdGQ6OmZpbmQoY2hUYWdzLmRhdGEuaTMyLCBjaFRhZ3MuZGF0YS5pMzIgKyBjaFRhZ3MuY291bnQsCisgICAgICAgICAgICBkZXB0aFNpemVzVGFnKSAhPSAoY2hUYWdzLmRhdGEuaTMyICsgY2hUYWdzLmNvdW50KTsKKyAgICBpZiAoIShpc0RlcHRoRXhjbHVzaXZlUHJlc2VudCAmJiBpc0RlcHRoU2l6ZVByZXNlbnQpKSB7CisgICAgICAgIC8vIE5vIGRlcHRoIHN1cHBvcnQsIG5vdGhpbmcgbW9yZSB0byBkby4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGF1dG8gZGVwdGhFeGNsdXNpdmVFbnRyeSA9IGMuZmluZChkZXB0aEV4Y2xUYWcpOworICAgIGlmIChkZXB0aEV4Y2x1c2l2ZUVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICBpZiAoZGVwdGhFeGNsdXNpdmVFbnRyeS5kYXRhLnU4WzBdICE9IEFORFJPSURfREVQVEhfREVQVEhfSVNfRVhDTFVTSVZFX0ZBTFNFKSB7CisgICAgICAgICAgICAvLyBEZXB0aCBzdXBwb3J0IGlzIGV4Y2x1c2l2ZSwgbm90aGluZyBtb3JlIHRvIGRvLgorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBZHZlcnRpc2VkIGRlcHRoIGV4Y2x1c2l2ZSB0YWcgYnV0IHZhbHVlIGlzIG5vdCBwcmVzZW50ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgZ2V0U3VwcG9ydGVkU2l6ZXMoYywgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUywgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CLAorICAgICAgICAgICAgJnN1cHBvcnRlZEJsb2JTaXplcyk7CisgICAgZ2V0U3VwcG9ydGVkU2l6ZXMoYywgZGVwdGhTaXplc1RhZywgSEFMX1BJWEVMX0ZPUk1BVF9ZMTYsICZzdXBwb3J0ZWREZXB0aFNpemVzKTsKKyAgICBpZiAoc3VwcG9ydGVkQmxvYlNpemVzLmVtcHR5KCkgfHwgc3VwcG9ydGVkRGVwdGhTaXplcy5lbXB0eSgpKSB7CisgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjYXNlLgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgZ2V0U3VwcG9ydGVkRHluYW1pY0RlcHRoU2l6ZXMoc3VwcG9ydGVkQmxvYlNpemVzLCBzdXBwb3J0ZWREZXB0aFNpemVzLAorICAgICAgICAgICAgJnN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzLCAmaW50ZXJuYWxEZXB0aFNpemVzKTsKKyAgICBpZiAoc3VwcG9ydGVkRHluYW1pY0RlcHRoU2l6ZXMuZW1wdHkoKSkgeworICAgICAgICAvLyBOb3RoaW5nIG1vcmUgdG8gZG8uCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpZighaXNEZXB0aFBob3RvTGlicmFyeVByZXNlbnQoKSkgeworICAgICAgICAvLyBEZXB0aCBwaG90byBwcm9jZXNzaW5nIGxpYnJhcnkgaXMgbm90IHByZXNlbnQsIG5vdGhpbmcgbW9yZSB0byBkby4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGR5bmFtaWNEZXB0aEVudHJpZXM7CisgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6IHN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzKSB7CisgICAgICAgIGludDMyX3QgZW50cnlbNF0gPSB7SEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCBzdGF0aWNfY2FzdDxpbnQzMl90PiAoc3RkOjpnZXQ8MD4oaXQpKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PiAoc3RkOjpnZXQ8MT4oaXQpKSwKKyAgICAgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCB9OworICAgICAgICBkeW5hbWljRGVwdGhFbnRyaWVzLmluc2VydChkeW5hbWljRGVwdGhFbnRyaWVzLmVuZCgpLCBlbnRyeSwgZW50cnkgKyA0KTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBkZXB0aE1pbkR1cmF0aW9ucywgZGVwdGhTdGFsbER1cmF0aW9uczsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBibG9iTWluRHVyYXRpb25zLCBibG9iU3RhbGxEdXJhdGlvbnM7CisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gZHluYW1pY0RlcHRoTWluRHVyYXRpb25zLCBkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9uczsKKworICAgIGdldFN1cHBvcnRlZER1cmF0aW9ucyhjLCBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZMTYsIGludGVybmFsRGVwdGhTaXplcywgJmRlcHRoTWluRHVyYXRpb25zKTsKKyAgICBnZXRTdXBwb3J0ZWREdXJhdGlvbnMoYywgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlMsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0JMT0IsIHN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzLCAmYmxvYk1pbkR1cmF0aW9ucyk7CisgICAgaWYgKGJsb2JNaW5EdXJhdGlvbnMuZW1wdHkoKSB8fCBkZXB0aE1pbkR1cmF0aW9ucy5lbXB0eSgpIHx8CisgICAgICAgICAgICAoZGVwdGhNaW5EdXJhdGlvbnMuc2l6ZSgpICE9IGJsb2JNaW5EdXJhdGlvbnMuc2l6ZSgpKSkgeworICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgbnVtYmVyIG9mIGF2YWlsYWJsZSBkZXB0aCBtaW4gZHVyYXRpb25zISAlenUgdnMuICV6dSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXB0aE1pbkR1cmF0aW9ucy5zaXplKCksIGJsb2JNaW5EdXJhdGlvbnMuc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBnZXRTdXBwb3J0ZWREdXJhdGlvbnMoYywgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RBTExfRFVSQVRJT05TLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZMTYsIGludGVybmFsRGVwdGhTaXplcywgJmRlcHRoU3RhbGxEdXJhdGlvbnMpOworICAgIGdldFN1cHBvcnRlZER1cmF0aW9ucyhjLCBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCBzdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcywgJmJsb2JTdGFsbER1cmF0aW9ucyk7CisgICAgaWYgKGJsb2JTdGFsbER1cmF0aW9ucy5lbXB0eSgpIHx8IGRlcHRoU3RhbGxEdXJhdGlvbnMuZW1wdHkoKSB8fAorICAgICAgICAgICAgKGRlcHRoU3RhbGxEdXJhdGlvbnMuc2l6ZSgpICE9IGJsb2JTdGFsbER1cmF0aW9ucy5zaXplKCkpKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBudW1iZXIgb2YgYXZhaWxhYmxlIGRlcHRoIHN0YWxsIGR1cmF0aW9ucyEgJXp1IHZzLiAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGVwdGhTdGFsbER1cmF0aW9ucy5zaXplKCksIGJsb2JTdGFsbER1cmF0aW9ucy5zaXplKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGdldFN1cHBvcnRlZER5bmFtaWNEZXB0aER1cmF0aW9ucyhkZXB0aE1pbkR1cmF0aW9ucywgYmxvYk1pbkR1cmF0aW9ucywKKyAgICAgICAgICAgICZkeW5hbWljRGVwdGhNaW5EdXJhdGlvbnMpOworICAgIGdldFN1cHBvcnRlZER5bmFtaWNEZXB0aER1cmF0aW9ucyhkZXB0aFN0YWxsRHVyYXRpb25zLCBibG9iU3RhbGxEdXJhdGlvbnMsCisgICAgICAgICAgICAmZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbnMpOworICAgIGlmIChkeW5hbWljRGVwdGhNaW5EdXJhdGlvbnMuZW1wdHkoKSB8fCBkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9ucy5lbXB0eSgpIHx8CisgICAgICAgICAgICAoZHluYW1pY0RlcHRoTWluRHVyYXRpb25zLnNpemUoKSAhPSBkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9ucy5zaXplKCkpKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBudW1iZXIgb2YgZHluYW1pYyBkZXB0aCBzdGFsbC9taW4gZHVyYXRpb25zISAlenUgdnMuICV6dSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkeW5hbWljRGVwdGhNaW5EdXJhdGlvbnMuc2l6ZSgpLCBkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9ucy5zaXplKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9uRW50cmllczsKKyAgICBhdXRvIGl0RHVyYXRpb24gPSBkeW5hbWljRGVwdGhNaW5EdXJhdGlvbnMuYmVnaW4oKTsKKyAgICBhdXRvIGl0U2l6ZSA9IHN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0RHVyYXRpb24gIT0gZHluYW1pY0RlcHRoTWluRHVyYXRpb25zLmVuZCgpKSB7CisgICAgICAgIGludDY0X3QgZW50cnlbNF0gPSB7SEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCBzdGF0aWNfY2FzdDxpbnQzMl90PiAoc3RkOjpnZXQ8MD4oKml0U2l6ZSkpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+IChzdGQ6OmdldDwxPigqaXRTaXplKSksICppdER1cmF0aW9ufTsKKyAgICAgICAgZHluYW1pY0RlcHRoTWluRHVyYXRpb25FbnRyaWVzLmluc2VydChkeW5hbWljRGVwdGhNaW5EdXJhdGlvbkVudHJpZXMuZW5kKCksIGVudHJ5LAorICAgICAgICAgICAgICAgIGVudHJ5ICsgNCk7CisgICAgICAgIGl0RHVyYXRpb24rKzsgaXRTaXplKys7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbkVudHJpZXM7CisgICAgaXREdXJhdGlvbiA9IGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25zLmJlZ2luKCk7CisgICAgaXRTaXplID0gc3VwcG9ydGVkRHluYW1pY0RlcHRoU2l6ZXMuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXREdXJhdGlvbiAhPSBkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9ucy5lbmQoKSkgeworICAgICAgICBpbnQ2NF90IGVudHJ5WzRdID0ge0hBTF9QSVhFTF9GT1JNQVRfQkxPQiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4gKHN0ZDo6Z2V0PDA+KCppdFNpemUpKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PiAoc3RkOjpnZXQ8MT4oKml0U2l6ZSkpLCAqaXREdXJhdGlvbn07CisgICAgICAgIGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25FbnRyaWVzLmluc2VydChkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9uRW50cmllcy5lbmQoKSwgZW50cnksCisgICAgICAgICAgICAgICAgZW50cnkgKyA0KTsKKyAgICAgICAgaXREdXJhdGlvbisrOyBpdFNpemUrKzsKKyAgICB9CisKKyAgICBjLnVwZGF0ZShBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUywKKyAgICAgICAgICAgIGR5bmFtaWNEZXB0aEVudHJpZXMuZGF0YSgpLCBkeW5hbWljRGVwdGhFbnRyaWVzLnNpemUoKSk7CisgICAgYy51cGRhdGUoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TLAorICAgICAgICAgICAgZHluYW1pY0RlcHRoTWluRHVyYXRpb25FbnRyaWVzLmRhdGEoKSwgZHluYW1pY0RlcHRoTWluRHVyYXRpb25FbnRyaWVzLnNpemUoKSk7CisgICAgYy51cGRhdGUoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVEFMTF9EVVJBVElPTlMsCisgICAgICAgICAgICBkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9uRW50cmllcy5kYXRhKCksIGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25FbnRyaWVzLnNpemUoKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBzdXBwb3J0ZWRDaFRhZ3M7CisgICAgc3VwcG9ydGVkQ2hUYWdzLnJlc2VydmUoY2hUYWdzLmNvdW50ICsgMyk7CisgICAgc3VwcG9ydGVkQ2hUYWdzLmluc2VydChzdXBwb3J0ZWRDaFRhZ3MuZW5kKCksIGNoVGFncy5kYXRhLmkzMiwKKyAgICAgICAgICAgIGNoVGFncy5kYXRhLmkzMiArIGNoVGFncy5jb3VudCk7CisgICAgc3VwcG9ydGVkQ2hUYWdzLnB1c2hfYmFjayhBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CisgICAgc3VwcG9ydGVkQ2hUYWdzLnB1c2hfYmFjayhBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlMpOworICAgIHN1cHBvcnRlZENoVGFncy5wdXNoX2JhY2soQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVEFMTF9EVVJBVElPTlMpOworICAgIGMudXBkYXRlKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVMsIHN1cHBvcnRlZENoVGFncy5kYXRhKCksCisgICAgICAgICAgICBzdXBwb3J0ZWRDaFRhZ3Muc2l6ZSgpKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpmaXh1cE1vbm9jaHJvbWVUYWdzKCkgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGF1dG8mIGMgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzOworCisgICAgLy8gT3ZlcnJpZGUgc3RhdGljIG1ldGFkYXRhIGZvciBNT05PQ0hST01FIGNhbWVyYSB3aXRoIG9sZGVyIGRldmljZSB2ZXJzaW9uCisgICAgaWYgKG1WZXJzaW9uLmdldF9tYWpvcigpID09IDMgJiYgbVZlcnNpb24uZ2V0X21pbm9yKCkgPCA1KSB7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBjYXAgPSBjLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcC5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY2FwLmRhdGEudThbaV0gPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTU9OT0NIUk9NRSkgeworICAgICAgICAgICAgICAgIC8vIEFORFJPSURfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UCisgICAgICAgICAgICAgICAgdWludDhfdCBjZmEgPSBBTkRST0lEX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVF9NT05POworICAgICAgICAgICAgICAgIHJlcyA9IGMudXBkYXRlKEFORFJPSURfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5ULCAmY2ZhLCAxKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHVwZGF0ZSBDT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVMKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gc0tleXMgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDIsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0xLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfQ0FMSUJSQVRJT05fVFJBTlNGT1JNMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0NPTE9SX1RSQU5TRk9STTEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0yLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfRk9SV0FSRF9NQVRSSVgxLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfRk9SV0FSRF9NQVRSSVgyLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgcmVzID0gcmVtb3ZlQXZhaWxhYmxlS2V5cyhjLCBzS2V5cywKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVMpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gdXBkYXRlIFJFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfUkVRVUVTVF9LRVlTCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHJlcUtleXMgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0sCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fR0FJTlMsCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICByZXMgPSByZW1vdmVBdmFpbGFibGVLZXlzKGMsIHJlcUtleXMsIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfUkVRVUVTVF9LRVlTKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHVwZGF0ZSBSRVFVRVNUX0FWQUlMQUJMRV9SRVFVRVNUX0tFWVM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9SRVNVTFRfS0VZUworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiByZXNLZXlzID0geworICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfR1JFRU5fU1BMSVQsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9ORVVUUkFMX0NPTE9SX1BPSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fVFJBTlNGT1JNLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0dBSU5TLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgcmVzID0gcmVtb3ZlQXZhaWxhYmxlS2V5cyhjLCByZXNLZXlzLCBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX1JFU1VMVF9LRVlTKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHVwZGF0ZSBSRVFVRVNUX0FWQUlMQUJMRV9SRVNVTFRfS0VZUzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBTkRST0lEX1NFTlNPUl9CTEFDS19MRVZFTF9QQVRURVJOCisgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGJsRW50cnkgPSBjLmZpbmQoQU5EUk9JRF9TRU5TT1JfQkxBQ0tfTEVWRUxfUEFUVEVSTik7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDE7IGogPCBibEVudHJ5LmNvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYmxFbnRyeS5kYXRhLmkzMltqXSA9IGJsRW50cnkuZGF0YS5pMzJbMF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6cmVtb3ZlQXZhaWxhYmxlS2V5cygKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEmIGMsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYga2V5cywgdWludDMyX3Qga2V5VGFnKSB7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkga2V5c0VudHJ5ID0gYy5maW5kKGtleVRhZyk7CisgICAgaWYgKGtleXNFbnRyeS5jb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGZpbmQgdGFnICV1OiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBrZXlUYWcsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiB2S2V5czsKKyAgICB2S2V5cy5yZXNlcnZlKGtleXNFbnRyeS5jb3VudCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrZXlzRW50cnkuY291bnQ7IGkrKykgeworICAgICAgICBpZiAoc3RkOjpmaW5kKGtleXMuYmVnaW4oKSwga2V5cy5lbmQoKSwga2V5c0VudHJ5LmRhdGEuaTMyW2ldKSA9PSBrZXlzLmVuZCgpKSB7CisgICAgICAgICAgICB2S2V5cy5wdXNoX2JhY2soa2V5c0VudHJ5LmRhdGEuaTMyW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXMgPSBjLnVwZGF0ZShrZXlUYWcsIHZLZXlzLmRhdGEoKSwgdktleXMuc2l6ZSgpKTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmZpbGxIZWljU3RyZWFtQ29tYmluYXRpb25zKAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90Piogb3V0cHV0cywKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4qIGR1cmF0aW9ucywKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4qIHN0YWxsRHVyYXRpb25zLAorICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfZW50cnkmIGhhbFN0cmVhbUNvbmZpZ3MsCisgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV9lbnRyeSYgaGFsU3RyZWFtRHVyYXRpb25zKSB7CisgICAgaWYgKG91dHB1dHMgPT0gbnVsbHB0ciB8fCBkdXJhdGlvbnMgPT0gbnVsbHB0ciB8fCBzdGFsbER1cmF0aW9ucyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgc3VwcG9ydEluTWVtb3J5VGVtcEZpbGUgPQorICAgICAgICAgICAgY2FtZXJhMzo6SGVpY0NvbXBvc2l0ZVN0cmVhbTo6aXNJbk1lbW9yeVRlbXBGaWxlU3VwcG9ydGVkKCk7CisgICAgaWYgKCFzdXBwb3J0SW5NZW1vcnlUZW1wRmlsZSkgeworICAgICAgICBBTE9HSSgiJXM6IE5vIEhFSUMgc3VwcG9ydCBkdWUgdG8gYWJzZW5jZSBvZiBpbiBtZW1vcnkgdGVtcCBmaWxlIHN1cHBvcnQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhhbFN0cmVhbUNvbmZpZ3MuY291bnQ7IGkgKz0gNCkgeworICAgICAgICBpbnQzMl90IGZvcm1hdCA9IGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaV07CisgICAgICAgIC8vIE9ubHkgSU1QTEVNRU5UQVRJT05fREVGSU5FRCBhbmQgWVVWXzg4OCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBIRUlDCisgICAgICAgIC8vIGltYWdlLgorICAgICAgICBpZiAoZm9ybWF0ICE9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCAmJgorICAgICAgICAgICAgICAgIGZvcm1hdCAhPSBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBzaXplQXZhaWwgPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBvdXRwdXRzLT5zaXplKCk7IGorPSA0KSB7CisgICAgICAgICAgICBpZiAoKCpvdXRwdXRzKVtqKzFdID09IGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsxXSAmJgorICAgICAgICAgICAgICAgICAgICAoKm91dHB1dHMpW2orMl0gPT0gaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzJdKSB7CisgICAgICAgICAgICAgICAgc2l6ZUF2YWlsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZUF2YWlsKSBjb250aW51ZTsKKworICAgICAgICBpbnQ2NF90IHN0YWxsID0gMDsKKyAgICAgICAgYm9vbCB1c2VIZWljLCB1c2VHcmlkOworICAgICAgICBpZiAoY2FtZXJhMzo6SGVpY0NvbXBvc2l0ZVN0cmVhbTo6aXNTaXplU3VwcG9ydGVkQnlIZWlmRW5jb2RlcigKKyAgICAgICAgICAgICAgICBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMV0sIGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsyXSwKKyAgICAgICAgICAgICAgICAmdXNlSGVpYywgJnVzZUdyaWQsICZzdGFsbCkpIHsKKyAgICAgICAgICAgIGlmICh1c2VHcmlkICE9IChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBIRUlDIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIGludDMyX3QgY29uZmlnW10gPSB7SEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMV0sCisgICAgICAgICAgICAgICAgICAgIGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsyXSwgMCAvKmlzSW5wdXQqL307CisgICAgICAgICAgICBvdXRwdXRzLT5pbnNlcnQob3V0cHV0cy0+ZW5kKCksIGNvbmZpZywgY29uZmlnICsgNCk7CisKKyAgICAgICAgICAgIC8vIEhFSUMgbWluRnJhbWVEdXJhdGlvbgorICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBoYWxTdHJlYW1EdXJhdGlvbnMuY291bnQ7IGogKz0gNCkgeworICAgICAgICAgICAgICAgIGlmIChoYWxTdHJlYW1EdXJhdGlvbnMuZGF0YS5pNjRbal0gPT0gZm9ybWF0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICBoYWxTdHJlYW1EdXJhdGlvbnMuZGF0YS5pNjRbaisxXSA9PSBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMV0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbFN0cmVhbUR1cmF0aW9ucy5kYXRhLmk2NFtqKzJdID09IGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsyXSkgeworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uW10gPSB7SEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzJdLCBoYWxTdHJlYW1EdXJhdGlvbnMuZGF0YS5pNjRbaiszXX07CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9ucy0+aW5zZXJ0KGR1cmF0aW9ucy0+ZW5kKCksIGR1cmF0aW9uLCBkdXJhdGlvbis0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBIRUlDIHN0YWxsRHVyYXRpb24KKyAgICAgICAgICAgIGludDY0X3Qgc3RhbGxEdXJhdGlvbltdID0ge0hBTF9QSVhFTF9GT1JNQVRfQkxPQiwgaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzFdLAorICAgICAgICAgICAgICAgICAgICBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMl0sIHN0YWxsfTsKKyAgICAgICAgICAgIHN0YWxsRHVyYXRpb25zLT5pbnNlcnQoc3RhbGxEdXJhdGlvbnMtPmVuZCgpLCBzdGFsbER1cmF0aW9uLCBzdGFsbER1cmF0aW9uKzQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpkZXJpdmVIZWljVGFncygpIHsKKyAgICBhdXRvJiBjID0gbUNhbWVyYUNoYXJhY3RlcmlzdGljczsKKworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBoYWxIZWljU3VwcG9ydCA9IGMuZmluZChBTkRST0lEX0hFSUNfSU5GT19TVVBQT1JURUQpOworICAgIGlmIChoYWxIZWljU3VwcG9ydC5jb3VudCA+IDEpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGVudHJ5IGNvdW50ICV6dSBmb3IgQU5EUk9JRF9IRUlDX0lORk9fU1VQUE9SVEVEIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGhhbEhlaWNTdXBwb3J0LmNvdW50KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKGhhbEhlaWNTdXBwb3J0LmNvdW50ID09IDAgfHwKKyAgICAgICAgICAgIGhhbEhlaWNTdXBwb3J0LmRhdGEudThbMF0gPT0gQU5EUk9JRF9IRUlDX0lORk9fU1VQUE9SVEVEX0ZBTFNFKSB7CisgICAgICAgIC8vIENhbWVyYSBIQUwgZG9lc24ndCBzdXBwb3J0IG1hbmRhdG9yeSBzdHJlYW0gY29tYmluYXRpb25zIGZvciBIRUlDLgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IG1heEpwZWdBcHBzU2VnbWVudHMgPQorICAgICAgICAgICAgYy5maW5kKEFORFJPSURfSEVJQ19JTkZPX01BWF9KUEVHX0FQUF9TRUdNRU5UU19DT1VOVCk7CisgICAgaWYgKG1heEpwZWdBcHBzU2VnbWVudHMuY291bnQgIT0gMSB8fCBtYXhKcGVnQXBwc1NlZ21lbnRzLmRhdGEudThbMF0gPT0gMCB8fAorICAgICAgICAgICAgbWF4SnBlZ0FwcHNTZWdtZW50cy5kYXRhLnU4WzBdID4gMTYpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBTkRST0lEX0hFSUNfSU5GT19NQVhfSlBFR19BUFBfU0VHTUVOVFNfQ09VTlQgbXVzdCBiZSB3aXRoaW4gWzEsIDE2XSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBQb3B1bGF0ZSBIRUlDIG91dHB1dCBjb25maWd1cmF0aW9ucyBhbmQgaXRzIHJlbGF0ZWQgbWluIGZyYW1lIGR1cmF0aW9uCisgICAgLy8gYW5kIHN0YWxsIGR1cmF0aW9uLgorICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGhlaWNPdXRwdXRzOworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGhlaWNEdXJhdGlvbnM7CisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gaGVpY1N0YWxsRHVyYXRpb25zOworCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGhhbFN0cmVhbUNvbmZpZ3MgPQorICAgICAgICAgICAgYy5maW5kKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBtaW5GcmFtZUR1cmF0aW9ucyA9CisgICAgICAgICAgICBjLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlMpOworCisgICAgc3RhdHVzX3QgcmVzID0gZmlsbEhlaWNTdHJlYW1Db21iaW5hdGlvbnMoJmhlaWNPdXRwdXRzLCAmaGVpY0R1cmF0aW9ucywgJmhlaWNTdGFsbER1cmF0aW9ucywKKyAgICAgICAgICAgIGhhbFN0cmVhbUNvbmZpZ3MsIG1pbkZyYW1lRHVyYXRpb25zKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGZpbGwgSEVJQyBzdHJlYW0gY29tYmluYXRpb25zOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGMudXBkYXRlKEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlMsCisgICAgICAgICAgIGhlaWNPdXRwdXRzLmRhdGEoKSwgaGVpY091dHB1dHMuc2l6ZSgpKTsKKyAgICBjLnVwZGF0ZShBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfTUlOX0ZSQU1FX0RVUkFUSU9OUywKKyAgICAgICAgICAgIGhlaWNEdXJhdGlvbnMuZGF0YSgpLCBoZWljRHVyYXRpb25zLnNpemUoKSk7CisgICAgYy51cGRhdGUoQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUQUxMX0RVUkFUSU9OUywKKyAgICAgICAgICAgIGhlaWNTdGFsbER1cmF0aW9ucy5kYXRhKCksIGhlaWNTdGFsbER1cmF0aW9ucy5zaXplKCkpOworCisgICAgcmV0dXJuIE9LOworfQorCitib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNMb2dpY2FsQ2FtZXJhKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBwaHlzaWNhbENhbWVyYUlkcykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CisKKyAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CisgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGRldmljZUluZm8tPm1Jc0xvZ2ljYWxDYW1lcmEgJiYgcGh5c2ljYWxDYW1lcmFJZHMgIT0gbnVsbHB0cikgeworICAgICAgICAqcGh5c2ljYWxDYW1lcmFJZHMgPSBkZXZpY2VJbmZvLT5tUGh5c2ljYWxJZHM7CisgICAgfQorICAgIHJldHVybiBkZXZpY2VJbmZvLT5tSXNMb2dpY2FsQ2FtZXJhOworfQorCitib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CisKKyAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CisgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBkZXZpY2VJbmZvLT5tSXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhOworfQorCitib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNIaWRkZW5QaHlzaWNhbENhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQpIHsKKyAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgeworICAgICAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBwcm92aWRlci0+bURldmljZXMpIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2VJbmZvLT5tSWQgPT0gY2FtZXJhSWQpIHsKKyAgICAgICAgICAgICAgICAvLyBjYW1lcmFJZCBpcyBmb3VuZCBpbiBwdWJsaWMgY2FtZXJhIElEcyBhZHZlcnRpc2VkIGJ5IHRoZQorICAgICAgICAgICAgICAgIC8vIHByb3ZpZGVyLgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7CisgICAgICAgIGZvciAoYXV0byYgZGV2aWNlSW5mbyA6IHByb3ZpZGVyLT5tRGV2aWNlcykgeworICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgaW5mbzsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IGRldmljZUluZm8tPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcygmaW5mbyk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIGZvciBpZCAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUluZm8tPm1JZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbElkczsKKyAgICAgICAgICAgIGlmIChkZXZpY2VJbmZvLT5tSXNMb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChkZXZpY2VJbmZvLT5tUGh5c2ljYWxJZHMuYmVnaW4oKSwgZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQpICE9IGRldmljZUluZm8tPm1QaHlzaWNhbElkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLT5tVmVyc2lvbi5nZXRfbWFqb3IoKSwgZGV2aWNlSW5mby0+bVZlcnNpb24uZ2V0X21pbm9yKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlVmVyc2lvbiA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFdyb25nIGRldmljZVZlcnNpb24gJXggZm9yIGhpZGRlblBoeXNpY2FsQ2FtZXJhSWQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZVZlcnNpb24sIGNhbWVyYUlkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6YWRkUHJvdmlkZXJMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIG5ld1Byb3ZpZGVyLCBib29sIGV4cGVjdGVkKSB7CkBAIC00NDUsOSArMTEwOSw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzcDxQcm92aWRlckluZm8+IHByb3ZpZGVySW5mbyA9Ci0gICAgICAgICAgICBuZXcgUHJvdmlkZXJJbmZvKG5ld1Byb3ZpZGVyLCBpbnRlcmZhY2UsIHRoaXMpOwotICAgIHN0YXR1c190IHJlcyA9IHByb3ZpZGVySW5mby0+aW5pdGlhbGl6ZSgpOworICAgIHNwPFByb3ZpZGVySW5mbz4gcHJvdmlkZXJJbmZvID0gbmV3IFByb3ZpZGVySW5mbyhuZXdQcm92aWRlciwgdGhpcyk7CisgICAgc3RhdHVzX3QgcmVzID0gcHJvdmlkZXJJbmZvLT5pbml0aWFsaXplKGludGVyZmFjZSwgbURldmljZVN0YXRlKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQpAQCAtNDU4LDYgKzExMjEsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnJlbW92ZVByb3ZpZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm92aWRlcikgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBwcm92aWRlckxvY2sobVByb3ZpZGVyTGlmZWN5Y2xlTG9jayk7CiAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CiAgICAgc3RkOjp2ZWN0b3I8U3RyaW5nOD4gcmVtb3ZlZERldmljZUlkczsKICAgICBzdGF0dXNfdCByZXMgPSBOQU1FX05PVF9GT1VORDsKQEAgLTQ5OCwyNyArMTE2MiwzNiBAQAogCiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6UHJvdmlkZXJJbmZvKAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmcHJvdmlkZXJOYW1lLAotICAgICAgICBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiYgaW50ZXJmYWNlLAogICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXIgKm1hbmFnZXIpIDoKICAgICAgICAgbVByb3ZpZGVyTmFtZShwcm92aWRlck5hbWUpLAotICAgICAgICBtSW50ZXJmYWNlKGludGVyZmFjZSksCiAgICAgICAgIG1Qcm92aWRlclRhZ2lkKGdlbmVyYXRlVmVuZG9yVGFnSWQocHJvdmlkZXJOYW1lKSksCiAgICAgICAgIG1VbmlxdWVEZXZpY2VDb3VudCgwKSwKICAgICAgICAgbU1hbmFnZXIobWFuYWdlcikgewogICAgICh2b2lkKSBtTWFuYWdlcjsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmluaXRpYWxpemUoKSB7CitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6aW5pdGlhbGl6ZSgKKyAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4mIGludGVyZmFjZSwKKyAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPiBjdXJyZW50RGV2aWNlU3RhdGUpIHsKICAgICBzdGF0dXNfdCByZXMgPSBwYXJzZVByb3ZpZGVyTmFtZShtUHJvdmlkZXJOYW1lLCAmbVR5cGUsICZtSWQpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHByb3ZpZGVyIG5hbWUsIGlnbm9yaW5nIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQUxPR0koIkNvbm5lY3RpbmcgdG8gbmV3IGNhbWVyYSBwcm92aWRlcjogJXMsIGlzUmVtb3RlPyAlZCIsCi0gICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIG1JbnRlcmZhY2UtPmlzUmVtb3RlKCkpOworICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBpbnRlcmZhY2UtPmlzUmVtb3RlKCkpOworCisgICAgLy8gRGV0ZXJtaW5lIG1pbm9yIHZlcnNpb24KKyAgICBhdXRvIGNhc3RSZXN1bHQgPSBwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgIGlmIChjYXN0UmVzdWx0LmlzT2soKSkgeworICAgICAgICBtTWlub3JWZXJzaW9uID0gNTsKKyAgICB9IGVsc2UgeworICAgICAgICBtTWlub3JWZXJzaW9uID0gNDsKKyAgICB9CisKICAgICAvLyBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UgY2FsbGJhY2tzIG1heSBiZSBjYWxsZWQgKGFuZCBjYXVzaW5nIG5ldyBkZXZpY2VzIGFkZGVkKQogICAgIC8vIGJlZm9yZSBzZXRDYWxsYmFjayByZXR1cm5zCi0gICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1JbnRlcmZhY2UtPnNldENhbGxiYWNrKHRoaXMpOworICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBpbnRlcmZhY2UtPnNldENhbGxiYWNrKHRoaXMpOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIHNldHRpbmcgdXAgY2FsbGJhY2tzIHdpdGggY2FtZXJhIHByb3ZpZGVyICclcyc6ICVzIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CkBAIC01MzAsNyArMTIwMyw3IEBACiAgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKICAgICB9CiAKLSAgICBoYXJkd2FyZTo6UmV0dXJuPGJvb2w+IGxpbmtlZCA9IG1JbnRlcmZhY2UtPmxpbmtUb0RlYXRoKHRoaXMsIC8qY29va2llKi8gbUlkKTsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPGJvb2w+IGxpbmtlZCA9IGludGVyZmFjZS0+bGlua1RvRGVhdGgodGhpcywgLypjb29raWUqLyBtSWQpOwogICAgIGlmICghbGlua2VkLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIGxpbmtpbmcgdG8gY2FtZXJhIHByb3ZpZGVyICclcycgZGVhdGg6ICVzIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbGlua2VkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CkBAIC01NDAsMTUgKzEyMTMsNDIgQEAKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CiAgICAgfQogCisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICAvLyBTYXZlIEhBTCByZWZlcmVuY2UgaW5kZWZpbml0ZWx5CisgICAgICAgIG1TYXZlZEludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQWN0aXZlSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgIH0KKworICAgIEFMT0dWKCIlczogU2V0dGluZyBkZXZpY2Ugc3RhdGUgZm9yICVzOiAweCUiIFBSSXg2NCwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtRGV2aWNlU3RhdGUpOworICAgIG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGN1cnJlbnREZXZpY2VTdGF0ZSk7CisKKyAgICByZXMgPSBzZXRVcFZlbmRvclRhZ3MoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHNldCB1cCB2ZW5kb3IgdGFncyBmcm9tIHByb3ZpZGVyICclcyciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKICAgICAvLyBHZXQgaW5pdGlhbCBsaXN0IG9mIGNhbWVyYSBkZXZpY2VzLCBpZiBhbnkKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZGV2aWNlczsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldCA9IG1JbnRlcmZhY2UtPmdldENhbWVyYUlkTGlzdChbJnN0YXR1cywgJmRldmljZXNdKAorICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFJZExpc3QoWyZzdGF0dXMsIHRoaXMsICZkZXZpY2VzXSgKICAgICAgICAgICAgIFN0YXR1cyBpZFN0YXR1cywKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6aGlkbF9zdHJpbmc+JiBjYW1lcmFEZXZpY2VOYW1lcykgewogICAgICAgICBzdGF0dXMgPSBpZFN0YXR1czsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhbWVyYURldmljZU5hbWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlcy5wdXNoX2JhY2soY2FtZXJhRGV2aWNlTmFtZXNbaV0pOworICAgICAgICAgICAgZm9yIChhdXRvJiBuYW1lIDogY2FtZXJhRGV2aWNlTmFtZXMpIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBtYWpvciwgbWlub3I7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHlwZSwgaWQ7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gcGFyc2VEZXZpY2VOYW1lKG5hbWUsICZtYWpvciwgJm1pbm9yLCAmdHlwZSwgJmlkKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgcGFyc2luZyBkZXZpY2VOYW1lOiAlczogJWQiLCBfX0ZVTkNUSU9OX18sIG5hbWUuY19zdHIoKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLnB1c2hfYmFjayhuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzLnB1c2hfYmFjayhpZCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IH0pOwogICAgIGlmICghcmV0LmlzT2soKSkgewpAQCAtNTYyLDExICsxMjYyLDI0IEBACiAgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKICAgICB9CiAKKyAgICByZXQgPSBpbnRlcmZhY2UtPmlzU2V0VG9yY2hNb2RlU3VwcG9ydGVkKAorICAgICAgICBbdGhpc10oYXV0byBzdGF0dXMsIGJvb2wgc3VwcG9ydGVkKSB7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBtU2V0VG9yY2hNb2RlU3VwcG9ydGVkID0gc3VwcG9ydGVkOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBjaGVja2luZyB0b3JjaCBtb2RlIHN1cHBvcnQgJyVzJzogJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIG1Jc1JlbW90ZSA9IGludGVyZmFjZS0+aXNSZW1vdGUoKTsKKwogICAgIHNwPFN0YXR1c0xpc3RlbmVyPiBsaXN0ZW5lciA9IG1NYW5hZ2VyLT5nZXRTdGF0dXNMaXN0ZW5lcigpOwogICAgIGZvciAoYXV0byYgZGV2aWNlIDogZGV2aWNlcykgewogICAgICAgICBzdGQ6OnN0cmluZyBpZDsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gYWRkRGV2aWNlKGRldmljZSwKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1czo6UFJFU0VOVCwgJmlkKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gYWRkRGV2aWNlKGRldmljZSwgY29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQsICZpZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGVudW1lcmF0ZSBjYW1lcmEgZGV2aWNlICclcyc6ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZS5jX3N0cigpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTU4MSw2ICsxMjk0LDUzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPgorQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HVigiUmVxdWVzdCB0byBzdGFydCBjYW1lcmEgcHJvdmlkZXI6ICVzIiwgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICBpZiAobVNhdmVkSW50ZXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG1TYXZlZEludGVyZmFjZTsKKyAgICB9CisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICBBTE9HRSgiQmFkIHByb3ZpZGVyIHN0YXRlISBTaG91bGQgbm90IGJlIGhlcmUgb24gYSBub24tbGF6eSBIQUwhIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGF1dG8gaW50ZXJmYWNlID0gbUFjdGl2ZUludGVyZmFjZS5wcm9tb3RlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dJKCJDYW1lcmEgSEFMIHByb3ZpZGVyIG5lZWRzIHJlc3RhcnQsIGNhbGxpbmcgZ2V0U2VydmljZSglcykiLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICBpbnRlcmZhY2UgPSBtTWFuYWdlci0+bVNlcnZpY2VQcm94eS0+Z2V0U2VydmljZShtUHJvdmlkZXJOYW1lKTsKKyAgICAgICAgaW50ZXJmYWNlLT5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgaGFyZHdhcmU6OlJldHVybjxib29sPiBsaW5rZWQgPSBpbnRlcmZhY2UtPmxpbmtUb0RlYXRoKHRoaXMsIC8qY29va2llKi8gbUlkKTsKKyAgICAgICAgaWYgKCFsaW5rZWQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIGxpbmtpbmcgdG8gY2FtZXJhIHByb3ZpZGVyICclcycgZGVhdGg6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIGxpbmtlZC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgbU1hbmFnZXItPnJlbW92ZVByb3ZpZGVyKG1Qcm92aWRlck5hbWUpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0gZWxzZSBpZiAoIWxpbmtlZCkgeworICAgICAgICAgICAgQUxPR1coIiVzOiBVbmFibGUgdG8gbGluayB0byBwcm92aWRlciAnJXMnIGRlYXRoIG5vdGlmaWNhdGlvbnMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gU2VuZCBjdXJyZW50IGRldmljZSBzdGF0ZQorICAgICAgICBpZiAobU1pbm9yVmVyc2lvbiA+PSA1KSB7CisgICAgICAgICAgICBhdXRvIGNhc3RSZXN1bHQgPSBwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgICAgICAgICAgaWYgKGNhc3RSZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlXzJfNSA9IGNhc3RSZXN1bHQ7CisgICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZV8yXzUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IEluaXRpYWwgZGV2aWNlIHN0YXRlIGZvciAlczogMHggJSIgUFJJeDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtRGV2aWNlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfMl81LT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShtRGV2aWNlU3RhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1BY3RpdmVJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIkNhbWVyYSBwcm92aWRlciAoJXMpIGFscmVhZHkgaW4gdXNlLiBSZS11c2luZyBpbnN0YW5jZS4iLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gaW50ZXJmYWNlOworfQorCiBjb25zdCBzdGQ6OnN0cmluZyYgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmdldFR5cGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1UeXBlOwogfQpAQCAtNjYxLDggKzE0MjEsMTAgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JikgY29uc3QgewotICAgIGRwcmludGYoZmQsICI9PSBDYW1lcmEgUHJvdmlkZXIgSEFMICVzICh2Mi40LCAlcykgc3RhdGljIGluZm86ICV6dSBkZXZpY2VzOiA9PVxuIiwKLSAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbUludGVyZmFjZS0+aXNSZW1vdGUoKSA/ICJyZW1vdGUiIDogInBhc3N0aHJvdWdoIiwKKyAgICBkcHJpbnRmKGZkLCAiPT0gQ2FtZXJhIFByb3ZpZGVyIEhBTCAlcyAodjIuJWQsICVzKSBzdGF0aWMgaW5mbzogJXp1IGRldmljZXM6ID09XG4iLAorICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLAorICAgICAgICAgICAgbU1pbm9yVmVyc2lvbiwKKyAgICAgICAgICAgIG1Jc1JlbW90ZSA/ICJyZW1vdGUiIDogInBhc3N0aHJvdWdoIiwKICAgICAgICAgICAgIG1EZXZpY2VzLnNpemUoKSk7CiAKICAgICBmb3IgKGF1dG8mIGRldmljZSA6IG1EZXZpY2VzKSB7CkBAIC03MDMsNiArMTQ2NSwyNCBAQAogICAgICAgICAgICAgaW5mbzIuZHVtcChmZCwgLyp2ZXJib3NpdHkqLyAyLCAvKmluZGVudGF0aW9uKi8gNCk7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBEdW1wIGNoYXJhY3RlcmlzdGljcyBvZiBub24tc3RhbmRhbG9uZSBwaHlzaWNhbCBjYW1lcmEKKyAgICAgICAgaWYgKGRldmljZS0+bUlzTG9naWNhbENhbWVyYSkgeworICAgICAgICAgICAgZm9yIChhdXRvJiBpZCA6IGRldmljZS0+bVBoeXNpY2FsSWRzKSB7CisgICAgICAgICAgICAgICAgLy8gU2tpcCBpZiBwaHlzaWNhbCBpZCBpcyBhbiBpbmRlcGVuZGVudCBjYW1lcmEKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjpmaW5kKG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcy5iZWdpbigpLCBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMuZW5kKCksIGlkKQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gbVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhIHBoeXNpY2FsSW5mbzsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2UtPmdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGlkLCAmcGh5c2ljYWxJbmZvKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICIgIFBoeXNpY2FsIGNhbWVyYSAlcyBjaGFyYWN0ZXJpc3RpY3M6XG4iLCBpZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxJbmZvLmR1bXAoZmQsIC8qdmVyYm9zaXR5Ki8gMiwgLyppbmRlbnRhdGlvbiovIDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGRwcmludGYoZmQsICI9PSBDYW1lcmEgSEFMIGRldmljZSAlcyAodiVkLiVkKSBkdW1wU3RhdGU6ID09XG4iLCBkZXZpY2UtPm1OYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgZGV2aWNlLT5tVmVyc2lvbi5nZXRfbWFqb3IoKSwgZGV2aWNlLT5tVmVyc2lvbi5nZXRfbWlub3IoKSk7CiAgICAgICAgIHJlcyA9IGRldmljZS0+ZHVtcFN0YXRlKGZkKTsKQEAgLTc3Miw2ICsxNTUyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHRvcmNoU3RhdHVzVG9TdHJpbmcobmV3U3RhdHVzKSk7CiAgICAgICAgICAgICAgICAgaWQgPSBkZXZpY2VJbmZvLT5tSWQ7CiAgICAgICAgICAgICAgICAga25vd24gPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PTiAhPSBuZXdTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXItPnJlbW92ZVJlZihEZXZpY2VNb2RlOjpUT1JDSCwgaWQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtODAwLDE1ICsxNTgzLDc1IEBACiAgICAgbU1hbmFnZXItPnJlbW92ZVByb3ZpZGVyKG1Qcm92aWRlck5hbWUpOwogfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c2V0VXBWZW5kb3JUYWdzKCkgeworICAgIGlmIChtVmVuZG9yVGFnRGVzY3JpcHRvciAhPSBudWxscHRyKQorICAgICAgICByZXR1cm4gT0s7CisKKyAgICBoYXJkd2FyZTo6aGlkbF92ZWM8VmVuZG9yVGFnU2VjdGlvbj4gdnRzOworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7CisgICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlID0gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldCA9IGludGVyZmFjZS0+Z2V0VmVuZG9yVGFncygKKyAgICAgICAgWyZdKGF1dG8gcywgY29uc3QgYXV0byYgdmVuZG9yVGFnU2VjcykgeworICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICB2dHMgPSB2ZW5kb3JUYWdTZWNzOworICAgICAgICAgICAgfQorICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgdmVuZG9yIHRhZ3MgZnJvbSBwcm92aWRlciAnJXMnOiAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CisgICAgfQorCisgICAgLy8gUmVhZCBhbGwgdmVuZG9yIHRhZyBkZWZpbml0aW9ucyBpbnRvIGEgZGVzY3JpcHRvcgorICAgIHN0YXR1c190IHJlczsKKyAgICBpZiAoKHJlcyA9IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwodnRzLCAvKm91dCovbVZlbmRvclRhZ0Rlc2NyaXB0b3IpKQorICAgICAgICAgICAgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgZ2VuZXJhdGUgZGVzY3JpcHRvciBmcm9tIHZlbmRvciB0YWcgb3BlcmF0aW9ucywiCisgICAgICAgICAgICAgICAgInJlY2VpdmVkIGVycm9yICVzICglZCkuIENhbWVyYSBjbGllbnRzIHdpbGwgbm90IGJlIGFibGUgdG8gdXNlIgorICAgICAgICAgICAgICAgICJ2ZW5kb3IgdGFncyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IocmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSgKKyAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPiBuZXdEZXZpY2VTdGF0ZSkgeworICAgIG1EZXZpY2VTdGF0ZSA9IG5ld0RldmljZVN0YXRlOworICAgIGlmIChtTWlub3JWZXJzaW9uID49IDUpIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVyIGlzIGN1cnJlbnRseSBhY3RpdmUgLSBub3QgZ29pbmcgdG8gc3RhcnQgaXQgdXAgZm9yIHRoaXMgbm90aWZpY2F0aW9uCisgICAgICAgIGF1dG8gaW50ZXJmYWNlID0gbVNhdmVkSW50ZXJmYWNlICE9IG51bGxwdHIgPyBtU2F2ZWRJbnRlcmZhY2UgOiBtQWN0aXZlSW50ZXJmYWNlLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGludGVyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBTZW5kIGN1cnJlbnQgZGV2aWNlIHN0YXRlCisgICAgICAgICAgICBhdXRvIGNhc3RSZXN1bHQgPSBwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgICAgICAgICAgaWYgKGNhc3RSZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlXzJfNSA9IGNhc3RSZXN1bHQ7CisgICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZV8yXzUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfMl81LT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShtRGV2aWNlU3RhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKIHRlbXBsYXRlPGNsYXNzIERldmljZUluZm9UPgogc3RkOjp1bmlxdWVfcHRyPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvPgogICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjppbml0aWFsaXplRGV2aWNlSW5mbygKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1pbm9yVmVyc2lvbikgY29uc3QgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1pbm9yVmVyc2lvbikgewogICAgIFN0YXR1cyBzdGF0dXM7CiAKICAgICBhdXRvIGNhbWVyYUludGVyZmFjZSA9Ci0gICAgICAgICAgICBnZXREZXZpY2VJbnRlcmZhY2U8dHlwZW5hbWUgRGV2aWNlSW5mb1Q6OkludGVyZmFjZVQ+KG5hbWUpOworICAgICAgICAgICAgc3RhcnREZXZpY2VJbnRlcmZhY2U8dHlwZW5hbWUgRGV2aWNlSW5mb1Q6OkludGVyZmFjZVQ+KG5hbWUpOwogICAgIGlmIChjYW1lcmFJbnRlcmZhY2UgPT0gbnVsbHB0cikgcmV0dXJuIG51bGxwdHI7CiAKICAgICBDYW1lcmFSZXNvdXJjZUNvc3QgcmVzb3VyY2VDb3N0OwpAQCAtODM1LDEzICsxNjc4LDEzIEBACiAgICAgfQogCiAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxEZXZpY2VJbmZvPigKLSAgICAgICAgbmV3IERldmljZUluZm9UKG5hbWUsIHRhZ0lkLCBpZCwgbWlub3JWZXJzaW9uLCByZXNvdXJjZUNvc3QsCi0gICAgICAgICAgICAgICAgY2FtZXJhSW50ZXJmYWNlKSk7CisgICAgICAgIG5ldyBEZXZpY2VJbmZvVChuYW1lLCB0YWdJZCwgaWQsIG1pbm9yVmVyc2lvbiwgcmVzb3VyY2VDb3N0LCB0aGlzLAorICAgICAgICAgICAgICAgIG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcywgY2FtZXJhSW50ZXJmYWNlKSk7CiB9CiAKIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+CiBzcDxJbnRlcmZhY2VUPgotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmdldERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgY29uc3QgeworQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnN0YXJ0RGV2aWNlSW50ZXJmYWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7CiAgICAgQUxPR0UoIiVzOiBEZXZpY2UgJXM6IFVua25vd24gSElETCBkZXZpY2UgSEFMIG1ham9yIHZlcnNpb24gJWQ6IiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgbmFtZS5jX3N0cigpLCBJbnRlcmZhY2VUOjp2ZXJzaW9uLmdldF9tYWpvcigpKTsKICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTg0OSwxMiArMTY5MiwxNiBAQAogCiB0ZW1wbGF0ZTw+CiBzcDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+Ci1DYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6Z2V0RGV2aWNlSW50ZXJmYWNlCi0gICAgICAgIDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBjb25zdCB7CitDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c3RhcnREZXZpY2VJbnRlcmZhY2UKKyAgICAgICAgPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIHsKICAgICBTdGF0dXMgc3RhdHVzOwogICAgIHNwPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4gY2FtZXJhSW50ZXJmYWNlOwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIHJldCA9IG1JbnRlcmZhY2UtPmdldENhbWVyYURldmljZUludGVyZmFjZV9WMV94KG5hbWUsIFsmc3RhdHVzLCAmY2FtZXJhSW50ZXJmYWNlXSgKKyAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPSBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYURldmljZUludGVyZmFjZV9WMV94KG5hbWUsIFsmc3RhdHVzLCAmY2FtZXJhSW50ZXJmYWNlXSgKICAgICAgICAgU3RhdHVzIHMsIHNwPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKICAgICAgICAgICAgICAgICBjYW1lcmFJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CkBAIC04NzQsMTIgKzE3MjEsMTYgQEAKIAogdGVtcGxhdGU8Pgogc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPgotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmdldERldmljZUludGVyZmFjZQotICAgICAgICA8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgY29uc3QgeworQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnN0YXJ0RGV2aWNlSW50ZXJmYWNlCisgICAgICAgIDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7CiAgICAgU3RhdHVzIHN0YXR1czsKICAgICBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+IGNhbWVyYUludGVyZmFjZTsKICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBtSW50ZXJmYWNlLT5nZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2VfVjNfeChuYW1lLCBbJnN0YXR1cywgJmNhbWVyYUludGVyZmFjZV0oCisgICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlID0gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2VfVjNfeChuYW1lLCBbJnN0YXR1cywgJmNhbWVyYUludGVyZmFjZV0oCiAgICAgICAgIFN0YXR1cyBzLCBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZSkgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CiAgICAgICAgICAgICAgICAgY2FtZXJhSW50ZXJmYWNlID0gaW50ZXJmYWNlOwpAQCAtOTAwLDYgKzE3NTEsMTggQEAKIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvOjp+RGV2aWNlSW5mbygpIHt9CiAKIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+CitzcDxJbnRlcmZhY2VUPiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzo6c3RhcnREZXZpY2VJbnRlcmZhY2UoKSB7CisgICAgc3A8SW50ZXJmYWNlVD4gZGV2aWNlOworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKG1TYXZlZEludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIGRldmljZSA9IG1QYXJlbnRQcm92aWRlci0+c3RhcnREZXZpY2VJbnRlcmZhY2U8SW50ZXJmYWNlVD4obU5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRldmljZSA9IChJbnRlcmZhY2VUICopIG1TYXZlZEludGVyZmFjZS5nZXQoKTsKKyAgICB9CisgICAgcmV0dXJuIGRldmljZTsKK30KKwordGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvOjpzZXRUb3JjaE1vZGUoSW50ZXJmYWNlVCYgaW50ZXJmYWNlLAogICAgICAgICBib29sIGVuYWJsZWQpIHsKICAgICBTdGF0dXMgcyA9IGludGVyZmFjZS0+c2V0VG9yY2hNb2RlKGVuYWJsZWQgPyBUb3JjaE1vZGU6Ok9OIDogVG9yY2hNb2RlOjpPRkYpOwpAQCAtOTEwLDMwICsxNzczLDMxIEBACiAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLCBjb25zdCBzdGQ6OnN0cmluZyAmaWQsCiAgICAgICAgIHVpbnQxNl90IG1pbm9yVmVyc2lvbiwKICAgICAgICAgY29uc3QgQ2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCisgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLAogICAgICAgICBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpIDoKICAgICAgICAgRGV2aWNlSW5mbyhuYW1lLCB0YWdJZCwgaWQsIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb257MSwgbWlub3JWZXJzaW9ufSwKLSAgICAgICAgICAgICAgICAgICByZXNvdXJjZUNvc3QpLAotICAgICAgICBtSW50ZXJmYWNlKGludGVyZmFjZSkgeworICAgICAgICAgICAgICAgICAgIHB1YmxpY0NhbWVyYUlkcywgcmVzb3VyY2VDb3N0LCBwYXJlbnRQcm92aWRlcikgewogICAgIC8vIEdldCBkZWZhdWx0IHBhcmFtZXRlcnMgYW5kIGluaXRpYWxpemUgZmxhc2ggdW5pdCBhdmFpbGFiaWxpdHkKICAgICAvLyBSZXF1aXJlcyBwb3dlcmluZyBvbiB0aGUgY2FtZXJhIGRldmljZQotICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBtSW50ZXJmYWNlLT5vcGVuKG51bGxwdHIpOworICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBpbnRlcmZhY2UtPm9wZW4obnVsbHB0cik7CiAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igb3BlbmluZyBjYW1lcmEgZGV2aWNlICVzIHRvIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgewogICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBvcGVuIGNhbWVyYSBkZXZpY2UgJXMgdG8gY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgbUlkLmNfc3RyKCksIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3RhdHVzVG9TdHJpbmcoc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgaWQuY19zdHIoKSwgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdGF0dXNUb1N0cmluZyhzdGF0dXMpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBtSW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKFt0aGlzXShjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIHBhcm1zKSB7CisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKFt0aGlzXShjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIHBhcm1zKSB7CiAgICAgICAgICAgICAgICAgbURlZmF1bHRQYXJhbWV0ZXJzLnVuZmxhdHRlbihTdHJpbmc4KHBhcm1zLmNfc3RyKCkpKTsKICAgICAgICAgICAgIH0pOwogICAgIGlmICghcmV0LmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIHJlYWRpbmcgY2FtZXJhIGRldmljZSAlcyBwYXJhbXMgdG8gY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgY29uc3QgY2hhciAqZmxhc2hNb2RlID0KQEAgLTk0MiwyNyArMTgwNiw0MyBAQAogICAgICAgICBtSGFzRmxhc2hVbml0ID0gdHJ1ZTsKICAgICB9CiAKLSAgICByZXQgPSBtSW50ZXJmYWNlLT5jbG9zZSgpOworICAgIHN0YXR1c190IHJlcyA9IGNhY2hlQ2FtZXJhSW5mbyhpbnRlcmZhY2UpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgY2FjaGUgQ2FtZXJhSW5mbyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZXQgPSBpbnRlcmZhY2UtPmNsb3NlKCk7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgY2xvc2luZyBjYW1lcmEgZGV2aWNlICVzIGFmdGVyIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgLy8gU2F2ZSBIQUwgcmVmZXJlbmNlIGluZGVmaW5pdGVseQorICAgICAgICBtU2F2ZWRJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CiAgICAgfQogfQogCiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6On5EZXZpY2VJbmZvMSgpIHt9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6c2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgewotICAgIHJldHVybiBEZXZpY2VJbmZvOjpzZXRUb3JjaE1vZGUobUludGVyZmFjZSwgZW5hYmxlZCk7CisgICAgcmV0dXJuIHNldFRvcmNoTW9kZUZvckRldmljZTxJbnRlcmZhY2VUPihlbmFibGVkKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpnZXRDYW1lcmFJbmZvKAogICAgICAgICBoYXJkd2FyZTo6Q2FtZXJhSW5mbyAqaW5mbykgY29uc3QgewogICAgIGlmIChpbmZvID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CisgICAgKmluZm8gPSBtSW5mbzsKKyAgICByZXR1cm4gT0s7Cit9CiAKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6Y2FjaGVDYW1lcmFJbmZvKAorICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OkludGVyZmFjZVQ+IGludGVyZmFjZSkgewogICAgIFN0YXR1cyBzdGF0dXM7CiAgICAgZGV2aWNlOjpWMV8wOjpDYW1lcmFJbmZvIGNJbmZvOwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIHJldCA9IG1JbnRlcmZhY2UtPmdldENhbWVyYUluZm8oWyZzdGF0dXMsICZjSW5mb10oU3RhdHVzIHMsIGRldmljZTo6VjFfMDo6Q2FtZXJhSW5mbyBjYW1JbmZvKSB7CisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFJbmZvKFsmc3RhdHVzLCAmY0luZm9dKFN0YXR1cyBzLCBkZXZpY2U6OlYxXzA6OkNhbWVyYUluZm8gY2FtSW5mbykgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CiAgICAgICAgICAgICAgICAgY0luZm8gPSBjYW1JbmZvOwogICAgICAgICAgICAgfSk7CkBAIC05NzcsMjcgKzE4NTcsMzEgQEAKIAogICAgIHN3aXRjaChjSW5mby5mYWNpbmcpIHsKICAgICAgICAgY2FzZSBkZXZpY2U6OlYxXzA6OkNhbWVyYUZhY2luZzo6QkFDSzoKLSAgICAgICAgICAgIGluZm8tPmZhY2luZyA9IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0JBQ0s7CisgICAgICAgICAgICBtSW5mby5mYWNpbmcgPSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19CQUNLOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgZGV2aWNlOjpWMV8wOjpDYW1lcmFGYWNpbmc6OkVYVEVSTkFMOgogICAgICAgICAgICAgLy8gTWFwIGV4dGVybmFsIHRvIGZyb250IGZvciBsZWdhY3kgQVBJCiAgICAgICAgIGNhc2UgZGV2aWNlOjpWMV8wOjpDYW1lcmFGYWNpbmc6OkZST05UOgotICAgICAgICAgICAgaW5mby0+ZmFjaW5nID0gaGFyZHdhcmU6OkNBTUVSQV9GQUNJTkdfRlJPTlQ7CisgICAgICAgICAgICBtSW5mby5mYWNpbmcgPSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19GUk9OVDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR1coIiVzOiBEZXZpY2UgJXM6IFVua25vd24gY2FtZXJhIGZhY2luZzogJWQiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5jX3N0cigpLCBjSW5mby5mYWNpbmcpOwotICAgICAgICAgICAgaW5mby0+ZmFjaW5nID0gaGFyZHdhcmU6OkNBTUVSQV9GQUNJTkdfQkFDSzsKKyAgICAgICAgICAgIG1JbmZvLmZhY2luZyA9IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0JBQ0s7CiAgICAgfQotICAgIGluZm8tPm9yaWVudGF0aW9uID0gY0luZm8ub3JpZW50YXRpb247CisgICAgbUluZm8ub3JpZW50YXRpb24gPSBjSW5mby5vcmllbnRhdGlvbjsKIAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpkdW1wU3RhdGUoaW50IGZkKSBjb25zdCB7CitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OmR1bXBTdGF0ZShpbnQgZmQpIHsKICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7CiAgICAgaGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHMgPSBtSW50ZXJmYWNlLT5kdW1wU3RhdGUoaGFuZGxlKTsKKyAgICBjb25zdCBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UgPSBzdGFydERldmljZUludGVyZmFjZTxJbnRlcmZhY2VUPigpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzID0gaW50ZXJmYWNlLT5kdW1wU3RhdGUoaGFuZGxlKTsKICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwogICAgIGlmICghcy5pc09rKCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTAwOSwxNCArMTg5MywxNSBAQAogICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAogICAgICAgICB1aW50MTZfdCBtaW5vclZlcnNpb24sCiAgICAgICAgIGNvbnN0IENhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAorICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywKICAgICAgICAgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKSA6CiAgICAgICAgIERldmljZUluZm8obmFtZSwgdGFnSWQsIGlkLCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uezMsIG1pbm9yVmVyc2lvbn0sCi0gICAgICAgICAgICAgICAgICAgcmVzb3VyY2VDb3N0KSwKLSAgICAgICAgbUludGVyZmFjZShpbnRlcmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICBwdWJsaWNDYW1lcmFJZHMsIHJlc291cmNlQ29zdCwgcGFyZW50UHJvdmlkZXIpIHsKICAgICAvLyBHZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBhbmQgaW5pdGlhbGl6ZSBmbGFzaCB1bml0IGF2YWlsYWJpbGl0eQogICAgIFN0YXR1cyBzdGF0dXM7CiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgcmV0ID0gbUludGVyZmFjZS0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKFsmc3RhdHVzLCB0aGlzXShTdGF0dXMgcywKKyAgICByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhbJnN0YXR1cywgdGhpc10oU3RhdHVzIHMsCiAgICAgICAgICAgICAgICAgICAgIGRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEgbWV0YWRhdGEpIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwogICAgICAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKQEAgLTEwMzUsMTUgKzE5MjAsMzUgQEAKICAgICAgICAgICAgIH0pOwogICAgIGlmICghcmV0LmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmb3IgZGV2aWNlICVzIgotICAgICAgICAgICAgICAgICIgdG8gY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLCBfX0ZVTkNUSU9OX18sIG1JZC5jX3N0cigpLAorICAgICAgICAgICAgICAgICIgdG8gY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLCBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLmNfc3RyKCksIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3RhdHVzVG9TdHJpbmcoc3RhdHVzKSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3RhdHVzVG9TdHJpbmcoc3RhdHVzKSwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIG1Jc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEgPSBpc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoKTsKKworICAgIHN0YXR1c190IHJlcyA9IGZpeHVwTW9ub2Nocm9tZVRhZ3MoKTsKKyAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGZpeCB1cCBtb25vY2hyb21lIHRhZ3MgYmFzZWQgZm9yIG9sZGVyIEhBTCB2ZXJzaW9uOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGF1dG8gc3RhdCA9IGFkZER5bmFtaWNEZXB0aFRhZ3MoKTsKKyAgICBpZiAoT0sgIT0gc3RhdCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCBhcHBlbmRpbmcgZHluYW1pYyBkZXB0aCB0YWdzOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtc3RhdCksCisgICAgICAgICAgICAgICAgc3RhdCk7CisgICAgfQorICAgIHJlcyA9IGRlcml2ZUhlaWNUYWdzKCk7CisgICAgaWYgKE9LICE9IHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBkZXJpdmUgSEVJQyB0YWdzIGJhc2VkIG9uIGNhbWVyYSBhbmQgbWVkaWEgY2FwYWJpbGl0aWVzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgIH0KKwogICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBmbGFzaEF2YWlsYWJsZSA9CiAgICAgICAgICAgICBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoQU5EUk9JRF9GTEFTSF9JTkZPX0FWQUlMQUJMRSk7CiAgICAgaWYgKGZsYXNoQXZhaWxhYmxlLmNvdW50ID09IDEgJiYKQEAgLTEwNTIsMTIgKzE5NTcsNzEgQEAKICAgICB9IGVsc2UgewogICAgICAgICBtSGFzRmxhc2hVbml0ID0gZmFsc2U7CiAgICAgfQorCisgICAgcXVlcnlQaHlzaWNhbENhbWVyYUlkcygpOworCisgICAgLy8gR2V0IHBoeXNpY2FsIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgaWYgYXBwbGljYWJsZQorICAgIGF1dG8gY2FzdFJlc3VsdCA9IGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZTo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICBpZiAoIWNhc3RSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIEFMT0dWKCIlczogVW5hYmxlIHRvIGNvbnZlcnQgSUNhbWVyYURldmljZSBpbnN0YW5jZSB0byB2ZXJzaW9uIDMuNSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2VfM181ID0gY2FzdFJlc3VsdDsKKyAgICBpZiAoaW50ZXJmYWNlXzNfNSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogQ29udmVydGVkIElDYW1lcmFEZXZpY2UgaW5zdGFuY2UgdG8gbnVsbHB0ciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUlzTG9naWNhbENhbWVyYSkgeworICAgICAgICBmb3IgKGF1dG8mIGlkIDogbVBoeXNpY2FsSWRzKSB7CisgICAgICAgICAgICBpZiAoc3RkOjpmaW5kKG1QdWJsaWNDYW1lcmFJZHMuYmVnaW4oKSwgbVB1YmxpY0NhbWVyYUlkcy5lbmQoKSwgaWQpICE9CisgICAgICAgICAgICAgICAgICAgIG1QdWJsaWNDYW1lcmFJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIGhpZGxJZChpZCk7CisgICAgICAgICAgICByZXQgPSBpbnRlcmZhY2VfM181LT5nZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcyhoaWRsSWQsCisgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmaWQsIHRoaXNdKFN0YXR1cyBzLCBkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhIG1ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICBpZiAocyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICpidWZmZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihtZXRhZGF0YS5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gbWV0YWRhdGEuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBpbnQgcmVzID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShidWZmZXIsICZleHBlY3RlZFNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzID09IE9LIHx8IHJlcyA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl9pZChidWZmZXIsIG1Qcm92aWRlclRhZ2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljc1tpZF0gPSBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgcGh5c2ljYWwgY2FtZXJhICVzIGNoYXJhY3RlcmlzdGljcyBmb3IgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgaWQuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZ2V0IHBoeXNpY2FsIGNhbWVyYSAlcyBjaGFyYWN0ZXJpc3RpY3MgZm9yIGRldmljZSAlczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIG1JZC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdGF0dXNUb1N0cmluZyhzdGF0dXMpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgLy8gU2F2ZSBIQUwgcmVmZXJlbmNlIGluZGVmaW5pdGVseQorICAgICAgICBtU2F2ZWRJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICAgfQogfQogCiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6On5EZXZpY2VJbmZvMygpIHt9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6c2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgewotICAgIHJldHVybiBEZXZpY2VJbmZvOjpzZXRUb3JjaE1vZGUobUludGVyZmFjZSwgZW5hYmxlZCk7CisgICAgcmV0dXJuIHNldFRvcmNoTW9kZUZvckRldmljZTxJbnRlcmZhY2VUPihlbmFibGVkKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpnZXRDYW1lcmFJbmZvKApAQCAtMTEwOCwxMCArMjA3MiwxNCBAQAogICAgIHJldHVybiBpc0JhY2t3YXJkQ29tcGF0aWJsZTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpkdW1wU3RhdGUoaW50IGZkKSBjb25zdCB7CitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmR1bXBTdGF0ZShpbnQgZmQpIHsKICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7CiAgICAgaGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgYXV0byByZXQgPSBtSW50ZXJmYWNlLT5kdW1wU3RhdGUoaGFuZGxlKTsKKyAgICBjb25zdCBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UgPSBzdGFydERldmljZUludGVyZmFjZTxJbnRlcmZhY2VUPigpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGF1dG8gcmV0ID0gaW50ZXJmYWNlLT5kdW1wU3RhdGUoaGFuZGxlKTsKICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwogICAgIGlmICghcmV0LmlzT2soKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0xMTI3LDYgKzIwOTUsNjEgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Z2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHlzaWNhbENhbWVyYUlkLCBDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7CisgICAgaWYgKGNoYXJhY3RlcmlzdGljcyA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIGlmIChtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChwaHlzaWNhbENhbWVyYUlkKSA9PQorICAgICAgICAgICAgbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICAqY2hhcmFjdGVyaXN0aWNzID0gbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmF0KHBoeXNpY2FsQ2FtZXJhSWQpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjppc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sCisgICAgICAgIGJvb2wgKnN0YXR1cyAvKm91dCovKSB7CisKKyAgICBjb25zdCBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OkludGVyZmFjZVQ+IGludGVyZmFjZSA9CisgICAgICAgICAgICB0aGlzLT5zdGFydERldmljZUludGVyZmFjZTxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OkludGVyZmFjZVQ+KCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgYXV0byBjYXN0UmVzdWx0ID0gZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlXzNfNSA9IGNhc3RSZXN1bHQ7CisgICAgaWYgKGludGVyZmFjZV8zXzUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RhdHVzX3QgcmVzOworICAgIFN0YXR1cyBjYWxsU3RhdHVzOworICAgIGF1dG8gcmV0ID0gIGludGVyZmFjZV8zXzUtPmlzU3RyZWFtQ29tYmluYXRpb25TdXBwb3J0ZWQoY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIFsmY2FsbFN0YXR1cywgJnN0YXR1c10gKFN0YXR1cyBzLCBib29sIGNvbWJTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBjYWxsU3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAqc3RhdHVzID0gY29tYlN0YXR1czsKKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgIHN3aXRjaCAoY2FsbFN0YXR1cykgeworICAgICAgICAgICAgY2FzZSBTdGF0dXM6Ok9LOgorICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkIGNhc2UsIGRvIG5vdGhpbmcuCisgICAgICAgICAgICAgICAgcmVzID0gT0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFN0YXR1czo6TUVUSE9EX05PVF9TVVBQT1JURUQ6CisgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU2Vzc2lvbiBjb25maWd1cmF0aW9uIHF1ZXJ5IGZhaWxlZDogJWQiLCBfX0ZVTkNUSU9OX18sIGNhbGxTdGF0dXMpOworICAgICAgICAgICAgICAgIHJlcyA9IFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgYmluZGVyIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJlcyA9IFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKwogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnBhcnNlUHJvdmlkZXJOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAogICAgICAgICBzdGQ6OnN0cmluZyAqdHlwZSwgdWludDMyX3QgKmlkKSB7CiAgICAgLy8gRm9ybWF0IG11c3QgYmUgIjx0eXBlPi88aWQ+IgpAQCAtMTM2OSw3ICsyMzkyLDcgQEAKIAogCiBzdGF0dXNfdCBIaWRsVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21IaWRsKAotICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpWZW5kb3JUYWdTZWN0aW9uPiYgdnRzLAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Y29tbW9uOjpWMV8wOjpWZW5kb3JUYWdTZWN0aW9uPiYgdnRzLAogICAgICAgICAvKm91dCovCiAgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+JiBkZXNjcmlwdG9yKSB7CiAKQEAgLTEzOTcsNyArMjQyMCw3IEBACiAKICAgICBpbnQgaWR4ID0gMDsKICAgICBmb3IgKHNpemVfdCBzID0gMDsgcyA8IHZ0cy5zaXplKCk7IHMrKykgewotICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24mIHNlY3Rpb24gPSB2dHNbc107CisgICAgICAgIGNvbnN0IGNvbW1vbjo6VjFfMDo6VmVuZG9yVGFnU2VjdGlvbiYgc2VjdGlvbiA9IHZ0c1tzXTsKICAgICAgICAgY29uc3QgY2hhciAqc2VjdGlvbk5hbWUgPSBzZWN0aW9uLnNlY3Rpb25OYW1lLmNfc3RyKCk7CiAgICAgICAgIGlmIChzZWN0aW9uTmFtZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHNlY3Rpb24gbmFtZSBkZWZpbmVkIGZvciB2ZW5kb3IgdGFnIHNlY3Rpb24gJXp1LiIsIF9fRlVOQ1RJT05fXywgcyk7CkBAIC0xNDU4LDEwICsyNDgxLDIwIEBACiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEqIGNoYXJhY3RlcmlzdGljcykgY29uc3QgewotICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkLCAvKm1pblZlcnNpb24qLyB7MywwfSwgLyptYXhWZXJzaW9uKi8gezQsMH0pOwotICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCwgLyptaW5WZXJzaW9uKi8gezMsMH0sIC8qbWF4VmVyc2lvbiovIHs1LDB9KTsKKyAgICBpZiAoZGV2aWNlSW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBkZXZpY2VJbmZvLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2hhcmFjdGVyaXN0aWNzKTsKKyAgICB9CiAKLSAgICByZXR1cm4gZGV2aWNlSW5mby0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNoYXJhY3RlcmlzdGljcyk7CisgICAgLy8gRmluZCBoaWRkZW4gcGh5c2ljYWwgY2FtZXJhIGNoYXJhY3RlcmlzdGljcworICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7CisgICAgICAgIGZvciAoYXV0byYgZGV2aWNlSW5mbyA6IHByb3ZpZGVyLT5tRGV2aWNlcykgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gZGV2aWNlSW5mby0+Z2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaWQsIGNoYXJhY3RlcmlzdGljcyk7CisgICAgICAgICAgICBpZiAocmVzICE9IE5BTUVfTk9UX0ZPVU5EKSByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogfQogCiB2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6ZmlsdGVyTG9naWNhbENhbWVyYUlkc0xvY2tlZCgKQEAgLTE0NzAsMjAgKzI1MDMsMTQgQEAKICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IHJlbW92ZWRJZHM7CiAKICAgICBmb3IgKGF1dG8mIGRldmljZUlkIDogZGV2aWNlSWRzKSB7Ci0gICAgICAgIENhbWVyYU1ldGFkYXRhIGluZm87Ci0gICAgICAgIHN0YXR1c190IHJlcyA9IGdldENhbWVyYUNoYXJhY3RlcmlzdGljc0xvY2tlZChkZXZpY2VJZCwgJmluZm8pOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MgZm9yIGlkICVzIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZC5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorICAgICAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChkZXZpY2VJZCk7CisgICAgICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIGNvbnRpbnVlOwogCi0gICAgICAgIC8vIGlkQ29tYm8gY29udGFpbnMgdGhlIGlkcyBvZiBhIGxvZ2ljYWwgY2FtZXJhIGFuZCBpdHMgcGh5c2ljYWwgY2FtZXJhcwotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaWRDb21ibzsKLSAgICAgICAgYm9vbCBsb2dpY2FsQ2FtZXJhID0gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc0xvZ2ljYWxDYW1lcmEoaW5mbywgJmlkQ29tYm8pOwotICAgICAgICBpZiAoIWxvZ2ljYWxDYW1lcmEpIHsKKyAgICAgICAgaWYgKCFkZXZpY2VJbmZvLT5tSXNMb2dpY2FsQ2FtZXJhKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQorICAgICAgICAvLyBpZENvbWJvIGNvbnRhaW5zIHRoZSBpZHMgb2YgYSBsb2dpY2FsIGNhbWVyYSBhbmQgaXRzIHBoeXNpY2FsIGNhbWVyYXMKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGlkQ29tYm8gPSBkZXZpY2VJbmZvLT5tUGh5c2ljYWxJZHM7CiAgICAgICAgIGlkQ29tYm8ucHVzaF9iYWNrKGRldmljZUlkKTsKIAogICAgICAgICBmb3IgKGF1dG8mIGlkIDogZGV2aWNlSWRzKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgKaW5kZXggYjhiOGI4Yy4uYTQyZmI0ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVBST1ZJREVSX0gKIAogI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgogI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPG11dGV4PgpAQCAtMjcsOCArMjgsOCBAQAogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvY29tbW9uLzEuMC90eXBlcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL3Byb3ZpZGVyLzIuNC9JQ2FtZXJhUHJvdmlkZXIuaD4KLS8vI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL3Byb3ZpZGVyLzIuNC9JQ2FtZXJhUHJvdmlkZXJDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9wcm92aWRlci8yLjUvSUNhbWVyYVByb3ZpZGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNC9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tYW5hZ2VyLzEuMC9JU2VydmljZU5vdGlmaWNhdGlvbi5oPgogI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CiAKQEAgLTExMCw2ICsxMTEsMTQgQEAKICAgICB9OwogCiAgICAgLyoqCisgICAgICogUmVwcmVzZW50cyB0aGUgbW9kZSBhIGNhbWVyYSBkZXZpY2UgaXMgY3VycmVudGx5IGluCisgICAgICovCisgICAgZW51bSBjbGFzcyBEZXZpY2VNb2RlIHsKKyAgICAgICAgVE9SQ0gsCisgICAgICAgIENBTUVSQQorICAgIH07CisKKyAgICAvKioKICAgICAgKiBJbml0aWFsaXplIHRoZSBtYW5hZ2VyIGFuZCBnaXZlIGl0IGEgc3RhdHVzIGxpc3RlbmVyOyBvcHRpb25hbGx5IGFjY2VwdHMgYSBzZXJ2aWNlCiAgICAgICogaW50ZXJhY3Rpb24gcHJveHkuCiAgICAgICoKQEAgLTE2Niw2ICsxNzUsMTMgQEAKICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0OwogCiAgICAgLyoqCisgICAgICogQ2hlY2sgZm9yIGRldmljZSBzdXBwb3J0IG9mIHNwZWNpZmljIHN0cmVhbSBjb21iaW5hdGlvbi4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIGJvb2wgKnN0YXR1cyAvKm91dCovKSBjb25zdDsKKworICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgaGlnaGVzdCBzdXBwb3J0ZWQgZGV2aWNlIGludGVyZmFjZSB2ZXJzaW9uIGZvciB0aGlzIElECiAgICAgICovCiAgICAgc3RhdHVzX3QgZ2V0SGlnaGVzdFN1cHBvcnRlZFZlcnNpb24oY29uc3Qgc3RkOjpzdHJpbmcgJmlkLApAQCAtMTc0LDcgKzE5MCw3IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2sgaWYgYSBnaXZlbiBjYW1lcmEgZGV2aWNlIHN1cHBvcnQgc2V0VG9yY2hNb2RlIEFQSS4KICAgICAgKi8KLSAgICBib29sIHN1cHBvcnRTZXRUb3JjaE1vZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmlkKTsKKyAgICBib29sIHN1cHBvcnRTZXRUb3JjaE1vZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmlkKSBjb25zdDsKIAogICAgIC8qKgogICAgICAqIFR1cm4gb24gb3Igb2ZmIHRoZSBmbGFzaGxpZ2h0IG9uIGEgZ2l2ZW4gY2FtZXJhIGRldmljZS4KQEAgLTE4OSw2ICsyMDUsMTIgQEAKICAgICBzdGF0dXNfdCBzZXRVcFZlbmRvclRhZ3MoKTsKIAogICAgIC8qKgorICAgICAqIEluZm9ybSByZWdpc3RlcmVkIHByb3ZpZGVycyBhYm91dCBhIGRldmljZSBzdGF0ZSBjaGFuZ2UsIHN1Y2ggYXMgZm9sZGluZyBvciB1bmZvbGRpbmcKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSgKKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPiBuZXdTdGF0ZSk7CisKKyAgICAvKioKICAgICAgKiBPcGVuIGFuIGFjdGl2ZSBzZXNzaW9uIHRvIGEgY2FtZXJhIGRldmljZS4KICAgICAgKgogICAgICAqIFRoaXMgZnVsbHkgcG93ZXJzIG9uIHRoZSBjYW1lcmEgZGV2aWNlIGhhcmR3YXJlLCBhbmQgcmV0dXJucyBhIGhhbmRsZSB0byBhCkBAIC0yMDUsNiArMjI3LDE3IEBACiAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+ICpzZXNzaW9uKTsKIAogICAgIC8qKgorICAgICAqIFNhdmUgdGhlIElDYW1lcmFQcm92aWRlciB3aGlsZSBpdCBpcyBiZWluZyB1c2VkIGJ5IGEgY2FtZXJhIG9yIHRvcmNoIGNsaWVudAorICAgICAqLworICAgIHZvaWQgc2F2ZVJlZihEZXZpY2VNb2RlIHVzYWdlVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmNhbWVyYUlkLAorICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIpOworCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoYXQgdGhlIGNhbWVyYSBvciB0b3JjaCBpcyBubyBsb25nZXIgYmVpbmcgdXNlZCBieSBhIGNhbWVyYSBjbGllbnQKKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZVJlZihEZXZpY2VNb2RlIHVzYWdlVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmNhbWVyYUlkKTsKKworICAgIC8qKgogICAgICAqIElTZXJ2aWNlTm90aWZpY2F0aW9uOjpvblJlZ2lzdHJhdGlvbgogICAgICAqIEludm9rZWQgYnkgdGhlIGhhcmR3YXJlIHNlcnZpY2UgbWFuYWdlciB3aGVuIGEgbmV3IGNhbWVyYSBwcm92aWRlciBpcyByZWdpc3RlcmVkCiAgICAgICovCkBAIC0yMzEsMTIgKzI2NCwxNSBAQAogICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtYXhWZXJzaW9uID0gaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnsxMDAwLDB9KSBjb25zdDsKIAogICAgIC8qCi0gICAgICogQ2hlY2sgaWYgYSBjYW1lcmEgd2l0aCBzdGF0aWNJbmZvIGlzIGEgbG9naWNhbCBjYW1lcmEuIEFuZCBpZiB5ZXMsIHJldHVybgorICAgICAqIENoZWNrIGlmIGEgY2FtZXJhIGlzIGEgbG9naWNhbCBjYW1lcmEuIEFuZCBpZiB5ZXMsIHJldHVybgogICAgICAqIHRoZSBwaHlzaWNhbCBjYW1lcmEgaWRzLgogICAgICAqLwotICAgIHN0YXRpYyBib29sIGlzTG9naWNhbENhbWVyYShjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbywKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcGh5c2ljYWxDYW1lcmFJZHMpOworICAgIGJvb2wgaXNMb2dpY2FsQ2FtZXJhKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBwaHlzaWNhbENhbWVyYUlkcyk7CiAKKyAgICBib29sIGlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgaWQpOworICAgIGJvb2wgaXNIaWRkZW5QaHlzaWNhbENhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQpOworCisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGtEZXB0aEFSVG9sZXJhbmNlOwogcHJpdmF0ZToKICAgICAvLyBBbGwgcHJpdmF0ZSBtZW1iZXJzLCB1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkLCBleHBlY3QgbUludGVyZmFjZU11dGV4IHRvIGJlIGxvY2tlZCBiZWZvcmUgdXNlCiAgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1JbnRlcmZhY2VNdXRleDsKQEAgLTI0NiwyMiArMjgyLDU3IEBACiAgICAgd3A8U3RhdHVzTGlzdGVuZXI+IG1MaXN0ZW5lcjsKICAgICBTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSogbVNlcnZpY2VQcm94eTsKIAorICAgIC8vIEN1cnJlbnQgb3ZlcmFsbCBBbmRyb2lkIGRldmljZSBwaHlzaWNhbCBzdGF0dXMKKyAgICBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+IG1EZXZpY2VTdGF0ZTsKKworICAgIC8vIG1Qcm92aWRlckxpZmVjeWNsZUxvY2sgaXMgbG9ja2VkIGR1cmluZyBvblJlZ2lzdHJhdGlvbiBhbmQgcmVtb3ZlUHJvdmlkZXIKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbVByb3ZpZGVyTGlmZWN5Y2xlTG9jazsKKwogICAgIHN0YXRpYyBIYXJkd2FyZVNlcnZpY2VJbnRlcmFjdGlvblByb3h5IHNIYXJkd2FyZVNlcnZpY2VJbnRlcmFjdGlvblByb3h5OwogCisgICAgLy8gTWFwcGluZyBmcm9tIENhbWVyYURldmljZSBJRHMgdG8gQ2FtZXJhUHJvdmlkZXJzLiBUaGlzIG1hcCBpcyB1c2VkIHRvIGtlZXAgdGhlCisgICAgLy8gSUNhbWVyYVByb3ZpZGVyIGFsaXZlIHdoaWxlIGl0IGlzIGluIHVzZSBieSB0aGUgY2FtZXJhIHdpdGggdGhlIGdpdmVuIElEIGZvciBjYW1lcmEKKyAgICAvLyBjYXBhYmlsaXRpZXMKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+PgorICAgICAgICAgICAgbUNhbWVyYVByb3ZpZGVyQnlDYW1lcmFJZDsKKworICAgIC8vIE1hcHBpbmcgZnJvbSBDYW1lcmFEZXZpY2UgSURzIHRvIENhbWVyYVByb3ZpZGVycy4gVGhpcyBtYXAgaXMgdXNlZCB0byBrZWVwIHRoZQorICAgIC8vIElDYW1lcmFQcm92aWRlciBhbGl2ZSB3aGlsZSBpdCBpcyBpbiB1c2UgYnkgdGhlIGNhbWVyYSB3aXRoIHRoZSBnaXZlbiBJRCBmb3IgdG9yY2gKKyAgICAvLyBjYXBhYmlsaXRpZXMKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+PgorICAgICAgICAgICAgbVRvcmNoUHJvdmlkZXJCeUNhbWVyYUlkOworCisgICAgLy8gTG9jayBmb3IgYWNjZXNzaW5nIG1DYW1lcmFQcm92aWRlckJ5Q2FtZXJhSWQgYW5kIG1Ub3JjaFByb3ZpZGVyQnlDYW1lcmFJZAorICAgIHN0ZDo6bXV0ZXggbVByb3ZpZGVySW50ZXJmYWNlTWFwTG9jazsKKwogICAgIHN0cnVjdCBQcm92aWRlckluZm8gOgogICAgICAgICAgICAgdmlydHVhbCBwdWJsaWMgaGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlckNhbGxiYWNrLAogICAgICAgICAgICAgdmlydHVhbCBwdWJsaWMgaGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50CiAgICAgewogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBtUHJvdmlkZXJOYW1lOwotICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBtSW50ZXJmYWNlOwogICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCBtUHJvdmlkZXJUYWdpZDsKKyAgICAgICAgaW50IG1NaW5vclZlcnNpb247CisgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IG1WZW5kb3JUYWdEZXNjcmlwdG9yOworICAgICAgICBib29sIG1TZXRUb3JjaE1vZGVTdXBwb3J0ZWQ7CisgICAgICAgIGJvb2wgbUlzUmVtb3RlOworCisgICAgICAgIC8vIEN1cnJlbnQgb3ZlcmFsbCBBbmRyb2lkIGRldmljZSBwaHlzaWNhbCBzdGF0dXMKKyAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPiBtRGV2aWNlU3RhdGU7CisKKyAgICAgICAgLy8gVGhpcyBwb2ludGVyIGlzIHVzZWQgdG8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgSUNhbWVyYVByb3ZpZGVyIHRoYXQgd2FzIGxhc3QgYWNjZXNzZWQuCisgICAgICAgIHdwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IG1BY3RpdmVJbnRlcmZhY2U7CisKKyAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gbVNhdmVkSW50ZXJmYWNlOwogCiAgICAgICAgIFByb3ZpZGVySW5mbyhjb25zdCBzdGQ6OnN0cmluZyAmcHJvdmlkZXJOYW1lLAotICAgICAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+JiBpbnRlcmZhY2UsCiAgICAgICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyICptYW5hZ2VyKTsKICAgICAgICAgflByb3ZpZGVySW5mbygpOwogCi0gICAgICAgIHN0YXR1c190IGluaXRpYWxpemUoKTsKKyAgICAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZShzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiYgaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgY3VycmVudERldmljZVN0YXRlKTsKKworICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CiAKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldFR5cGUoKSBjb25zdDsKIApAQCAtMjgzLDg0ICszNTQsMTczIEBACiAgICAgICAgIC8vIGhpZGxfZGVhdGhfcmVjaXBpZW50IGludGVyZmFjZSAtIHRoaXMgbG9ja3MgdGhlIHBhcmVudCBtSW50ZXJmYWNlTXV0ZXgKICAgICAgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKHVpbnQ2NF90IGNvb2tpZSwgY29uc3Qgd3A8aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiB3aG8pIG92ZXJyaWRlOwogCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXR1cCB2ZW5kb3IgdGFncyBmb3IgdGhpcyBwcm92aWRlcgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzX3Qgc2V0VXBWZW5kb3JUYWdzKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5vdGlmeSBwcm92aWRlciBhYm91dCB0b3AtbGV2ZWwgZGV2aWNlIHBoeXNpY2FsIHN0YXRlIGNoYW5nZXMKKyAgICAgICAgICovCisgICAgICAgIHN0YXR1c190IG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgbmV3RGV2aWNlU3RhdGUpOworCiAgICAgICAgIC8vIEJhc2ljIGRldmljZSBpbmZvcm1hdGlvbiwgY29tbW9uIHRvIGFsbCBjYW1lcmEgZGV2aWNlcwogICAgICAgICBzdHJ1Y3QgRGV2aWNlSW5mbyB7CiAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBtTmFtZTsgIC8vIEZ1bGwgaW5zdGFuY2UgbmFtZQogICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbUlkOyAgICAvLyBJRCBzZWN0aW9uIG9mIGZ1bGwgbmFtZQogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtVmVyc2lvbjsKICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IG1Qcm92aWRlclRhZ2lkOworICAgICAgICAgICAgYm9vbCBtSXNMb2dpY2FsQ2FtZXJhOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1QaHlzaWNhbElkczsKKyAgICAgICAgICAgIGhhcmR3YXJlOjpDYW1lcmFJbmZvIG1JbmZvOworICAgICAgICAgICAgc3A8SUJhc2U+IG1TYXZlZEludGVyZmFjZTsKKyAgICAgICAgICAgIGJvb2wgbUlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYSA9IGZhbHNlOwogCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCBtUmVzb3VyY2VDb3N0OwogCiAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBtU3RhdHVzOwogCisgICAgICAgICAgICBzcDxQcm92aWRlckluZm8+IG1QYXJlbnRQcm92aWRlcjsKKwogICAgICAgICAgICAgYm9vbCBoYXNGbGFzaFVuaXQoKSBjb25zdCB7IHJldHVybiBtSGFzRmxhc2hVbml0OyB9CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhSW5mbyhoYXJkd2FyZTo6Q2FtZXJhSW5mbyAqaW5mbykgY29uc3QgPSAwOwogICAgICAgICAgICAgdmlydHVhbCBib29sIGlzQVBJMUNvbXBhdGlibGUoKSBjb25zdCA9IDA7Ci0gICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIGNvbnN0ID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgPSAwOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoQ2FtZXJhTWV0YWRhdGEgKmNoYXJhY3RlcmlzdGljcykgY29uc3QgewogICAgICAgICAgICAgICAgICh2b2lkKSBjaGFyYWN0ZXJpc3RpY3M7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcyhjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgKmNoYXJhY3RlcmlzdGljcykgY29uc3QgeworICAgICAgICAgICAgICAgICh2b2lkKSBwaHlzaWNhbENhbWVyYUlkOworICAgICAgICAgICAgICAgICh2b2lkKSBjaGFyYWN0ZXJpc3RpY3M7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmLypjb25maWd1cmF0aW9uKi8sCisgICAgICAgICAgICAgICAgICAgIGJvb2wgKiAvKnN0YXR1cyovKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgorICAgICAgICAgICAgc3A8SW50ZXJmYWNlVD4gc3RhcnREZXZpY2VJbnRlcmZhY2UoKTsKIAogICAgICAgICAgICAgRGV2aWNlSW5mbyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiYgdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCkgOgorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCwKKyAgICAgICAgICAgICAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlcikgOgogICAgICAgICAgICAgICAgICAgICBtTmFtZShuYW1lKSwgbUlkKGlkKSwgbVZlcnNpb24odmVyc2lvbiksIG1Qcm92aWRlclRhZ2lkKHRhZ0lkKSwKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlQ29zdChyZXNvdXJjZUNvc3QpLAorICAgICAgICAgICAgICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhKGZhbHNlKSwgbVJlc291cmNlQ29zdChyZXNvdXJjZUNvc3QpLAogICAgICAgICAgICAgICAgICAgICBtU3RhdHVzKGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOjpQUkVTRU5UKSwKLSAgICAgICAgICAgICAgICAgICAgbUhhc0ZsYXNoVW5pdChmYWxzZSkge30KKyAgICAgICAgICAgICAgICAgICAgbVBhcmVudFByb3ZpZGVyKHBhcmVudFByb3ZpZGVyKSwgbUhhc0ZsYXNoVW5pdChmYWxzZSksCisgICAgICAgICAgICAgICAgICAgIG1QdWJsaWNDYW1lcmFJZHMocHVibGljQ2FtZXJhSWRzKSB7fQogICAgICAgICAgICAgdmlydHVhbCB+RGV2aWNlSW5mbygpOwogICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICBib29sIG1IYXNGbGFzaFVuaXQ7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIG1QdWJsaWNDYW1lcmFJZHM7CiAKICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+CiAgICAgICAgICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKEludGVyZmFjZVQmIGludGVyZmFjZSwgYm9vbCBlbmFibGVkKTsKKworICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KKyAgICAgICAgICAgIHN0YXR1c190IHNldFRvcmNoTW9kZUZvckRldmljZShib29sIGVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBEb24ndCBzYXZlIHRoZSBJQ2FtZXJhUHJvdmlkZXIgaW50ZXJmYWNlIGhlcmUgYmVjYXVzZSB3ZSBhc3N1bWUgdGhhdCB0aGlzIHdhcworICAgICAgICAgICAgICAgIC8vIGNhbGxlZCBmcm9tIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c2V0VG9yY2hNb2RlKCksIHdoaWNoIGRvZXMgc2F2ZSBpdC4KKyAgICAgICAgICAgICAgICBjb25zdCBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UgPSBzdGFydERldmljZUludGVyZmFjZTxJbnRlcmZhY2VUPigpOworICAgICAgICAgICAgICAgIHJldHVybiBEZXZpY2VJbmZvOjpzZXRUb3JjaE1vZGUoaW50ZXJmYWNlLCBlbmFibGVkKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfTsKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPERldmljZUluZm8+PiBtRGV2aWNlczsKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBtVW5pcXVlQ2FtZXJhSWRzOwogICAgICAgICBpbnQgbVVuaXF1ZURldmljZUNvdW50OwogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVVuaXF1ZUFQSTFDb21wYXRpYmxlQ2FtZXJhSWRzOworICAgICAgICAvLyBUaGUgaW5pdGlhbCBwdWJsaWMgY2FtZXJhIElEcyBwdWJsaXNoZWQgYnkgdGhlIGNhbWVyYSBwcm92aWRlci4KKyAgICAgICAgLy8gQ3VycmVudGx5IGxvZ2ljYWwgbXVsdGktY2FtZXJhIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGhvdC1wbHVnIGNhbWVyYS4KKyAgICAgICAgLy8gQW5kIHdlIHVzZSB0aGlzIGxpc3QgdG8ga2VlcCB0cmFjayBvZiBpbml0aWFsIHB1YmxpYyBjYW1lcmEgSURzCisgICAgICAgIC8vIGFkdmVydGlzZWQgYnkgdGhlIHByb3ZpZGVyLCBhbmQgdG8gZGlzdGluZ3Vpc2ggYWdhaW5zdCAiaGlkZGVuIgorICAgICAgICAvLyBwaHlzaWNhbCBjYW1lcmEgSURzLgorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzOwogCiAgICAgICAgIC8vIEhBTHYxLXNwZWNpZmljIGNhbWVyYSBmaWVsZHMsIGluY2x1ZGluZyB0aGUgYWN0dWFsIGRldmljZSBpbnRlcmZhY2UKICAgICAgICAgc3RydWN0IERldmljZUluZm8xIDogcHVibGljIERldmljZUluZm8gewogICAgICAgICAgICAgdHlwZWRlZiBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2UgSW50ZXJmYWNlVDsKLSAgICAgICAgICAgIGNvbnN0IHNwPEludGVyZmFjZVQ+IG1JbnRlcmZhY2U7CiAKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUluZm8oaGFyZHdhcmU6OkNhbWVyYUluZm8gKmluZm8pIGNvbnN0IG92ZXJyaWRlOwogICAgICAgICAgICAgLy9JbiBjYXNlIG9mIERldmljZTFJbmZvIGFzc3VtZSB0aGF0IHdlIGFyZSBhbHdheXMgQVBJMSBjb21wYXRpYmxlCiAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgaXNBUEkxQ29tcGF0aWJsZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KLSAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIG92ZXJyaWRlOwogICAgICAgICAgICAgRGV2aWNlSW5mbzEoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1pbm9yVmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCwKKyAgICAgICAgICAgICAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMsCiAgICAgICAgICAgICAgICAgICAgIHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSk7CiAgICAgICAgICAgICB2aXJ0dWFsIH5EZXZpY2VJbmZvMSgpOwogICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczIgbURlZmF1bHRQYXJhbWV0ZXJzOworICAgICAgICAgICAgc3RhdHVzX3QgY2FjaGVDYW1lcmFJbmZvKHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSk7CiAgICAgICAgIH07CiAKICAgICAgICAgLy8gSEFMdjMtc3BlY2lmaWMgY2FtZXJhIGZpZWxkcywgaW5jbHVkaW5nIHRoZSBhY3R1YWwgZGV2aWNlIGludGVyZmFjZQogICAgICAgICBzdHJ1Y3QgRGV2aWNlSW5mbzMgOiBwdWJsaWMgRGV2aWNlSW5mbyB7CiAgICAgICAgICAgICB0eXBlZGVmIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZSBJbnRlcmZhY2VUOwotICAgICAgICAgICAgY29uc3Qgc3A8SW50ZXJmYWNlVD4gbUludGVyZmFjZTsKIAogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhSW5mbyhoYXJkd2FyZTo6Q2FtZXJhSW5mbyAqaW5mbykgY29uc3Qgb3ZlcnJpZGU7CiAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgaXNBUEkxQ29tcGF0aWJsZSgpIGNvbnN0IG92ZXJyaWRlOwotICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgb3ZlcnJpZGU7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgKmNoYXJhY3RlcmlzdGljcykgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICBib29sICpzdGF0dXMgLypvdXQqLykKKyAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGU7CiAKICAgICAgICAgICAgIERldmljZUluZm8zKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCi0gICAgICAgICAgICAgICAgICAgIHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSk7CisgICAgICAgICAgICAgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLCBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpOwogICAgICAgICAgICAgdmlydHVhbCB+RGV2aWNlSW5mbzMoKTsKICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CisgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiBtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CisgICAgICAgICAgICB2b2lkIHF1ZXJ5UGh5c2ljYWxDYW1lcmFJZHMoKTsKKyAgICAgICAgICAgIGJvb2wgaXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBmaXh1cE1vbm9jaHJvbWVUYWdzKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBhZGREeW5hbWljRGVwdGhUYWdzKCk7CisgICAgICAgICAgICBzdGF0aWMgdm9pZCBnZXRTdXBwb3J0ZWRTaXplcyhjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsIHVpbnQzMl90IHRhZywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9waXhlbF9mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiAqc2l6ZXMgLypvdXQqLyk7CisgICAgICAgICAgICB2b2lkIGdldFN1cHBvcnRlZER1cmF0aW9ucyggY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCB1aW50MzJfdCB0YWcsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfcGl4ZWxfZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4mIHNpemVzLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAqZHVyYXRpb25zLypvdXQqLyk7CisgICAgICAgICAgICB2b2lkIGdldFN1cHBvcnRlZER5bmFtaWNEZXB0aER1cmF0aW9ucyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgZGVwdGhEdXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+JiBibG9iRHVyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAqZHluYW1pY0RlcHRoRHVyYXRpb25zIC8qb3V0Ki8pOworICAgICAgICAgICAgc3RhdGljIGJvb2wgaXNEZXB0aFBob3RvTGlicmFyeVByZXNlbnQoKTsKKyAgICAgICAgICAgIHN0YXRpYyB2b2lkIGdldFN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4mIGJsb2JTaXplcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+JiBkZXB0aFNpemVzLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gKmR5bmFtaWNEZXB0aFNpemVzIC8qb3V0Ki8sCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiAqaW50ZXJuYWxEZXB0aFNpemVzIC8qb3V0Ki8pOworICAgICAgICAgICAgc3RhdHVzX3QgcmVtb3ZlQXZhaWxhYmxlS2V5cyhDYW1lcmFNZXRhZGF0YSYgYywgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBrZXlzLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBrZXlUYWcpOworICAgICAgICAgICAgc3RhdHVzX3QgZmlsbEhlaWNTdHJlYW1Db21iaW5hdGlvbnMoc3RkOjp2ZWN0b3I8aW50MzJfdD4qIG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+KiBkdXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+KiBzdGFsbER1cmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX2VudHJ5JiBoYWxTdHJlYW1Db25maWdzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfZW50cnkmIGhhbFN0cmVhbUR1cmF0aW9ucyk7CisgICAgICAgICAgICBzdGF0dXNfdCBkZXJpdmVIZWljVGFncygpOwogICAgICAgICB9OwogCiAgICAgcHJpdmF0ZToKQEAgLTM3OCwxMSArNTM4LDExIEBACiAgICAgICAgIHRlbXBsYXRlPGNsYXNzIERldmljZUluZm9UPgogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbz4gaW5pdGlhbGl6ZURldmljZUluZm8oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCiAgICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKLSAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5vclZlcnNpb24pIGNvbnN0OworICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbm9yVmVyc2lvbik7CiAKICAgICAgICAgLy8gSGVscGVyIGZvciBpbml0aWFsaXplRGV2aWNlSW5mbyB0byB1c2UgdGhlIHJpZ2h0IENhbWVyYVByb3ZpZGVyIGdldCBtZXRob2QuCiAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+Ci0gICAgICAgIHNwPEludGVyZmFjZVQ+IGdldERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgY29uc3Q7CisgICAgICAgIHNwPEludGVyZmFjZVQ+IHN0YXJ0RGV2aWNlSW50ZXJmYWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKTsKIAogICAgICAgICAvLyBQYXJzZSBwcm92aWRlciBpbnN0YW5jZSBuYW1lIGZvciB0eXBlIGFuZCBpZAogICAgICAgICBzdGF0aWMgc3RhdHVzX3QgcGFyc2VQcm92aWRlck5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCkBAIC00MTYsNiArNTc2LDE0IEBACiAKICAgICBzdGQ6OnZlY3RvcjxzcDxQcm92aWRlckluZm8+PiBtUHJvdmlkZXJzOwogCisgICAgdm9pZCBhZGRQcm92aWRlclRvTWFwKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNhbWVyYUlkLAorICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIsCisgICAgICAgICAgICBib29sIGlzVG9yY2hVc2FnZSk7CisgICAgdm9pZCByZW1vdmVDYW1lcmFJZEZyb21NYXAoCisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4+ICZtYXAsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCk7CisKICAgICBzdGF0aWMgY29uc3QgY2hhciogZGV2aWNlU3RhdHVzVG9TdHJpbmcoCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzJik7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIHRvcmNoU3RhdHVzVG9TdHJpbmcoCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ5NjE2MwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmNwcApAQCAtMCwwICsxLDQ5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhMy1EZXB0aFBob3RvUHJvY2Vzc29yIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisvLworCisjaW5jbHVkZSAiRGVwdGhQaG90b1Byb2Nlc3Nvci5oIgorCisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9jYW1lcmEuaD4KKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL2NhbWVyYXMuaD4KKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL2NvbnRhaW5lci5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvZGV2aWNlLmg+CisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9kaW1lbnNpb24uaD4KKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL2R5bmFtaWNfZGVwdGguaD4KKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL3BvaW50Lmg+CisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9wb3NlLmg+CisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9wcm9maWxlLmg+CisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9wcm9maWxlcy5oPgorI2luY2x1ZGUgPGpwZWdsaWIuaD4KKyNpbmNsdWRlIDxsaWJleGlmL2V4aWYtZGF0YS5oPgorI2luY2x1ZGUgPGxpYmV4aWYvZXhpZi1zeXN0ZW0uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9FeGlmVXRpbHMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx4bXBtZXRhL3htcF9kYXRhLmg+CisjaW5jbHVkZSA8eG1wbWV0YS94bXBfd3JpdGVyLmg+CisKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkNhbWVyYTsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkNhbWVyYXM7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpDYW1lcmFQYXJhbXM7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpDb250YWluZXI7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpEZXB0aEZvcm1hdDsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkRlcHRoTWFwOwordXNpbmcgZHluYW1pY19kZXB0aDo6RGVwdGhNYXBQYXJhbXM7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpEZXB0aFVuaXRzOwordXNpbmcgZHluYW1pY19kZXB0aDo6RGV2aWNlOwordXNpbmcgZHluYW1pY19kZXB0aDo6RGV2aWNlUGFyYW1zOwordXNpbmcgZHluYW1pY19kZXB0aDo6RGltZW5zaW9uOwordXNpbmcgZHluYW1pY19kZXB0aDo6SW1hZ2U7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpJbWFnaW5nTW9kZWw7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpJbWFnaW5nTW9kZWxQYXJhbXM7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpJdGVtOwordXNpbmcgZHluYW1pY19kZXB0aDo6UG9zZTsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OlByb2ZpbGU7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpQcm9maWxlczsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCitFeGlmT3JpZW50YXRpb24gZ2V0RXhpZk9yaWVudGF0aW9uKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmpwZWdCdWZmZXIsIHNpemVfdCBqcGVnQnVmZmVyU2l6ZSkgeworICAgIGlmICgoanBlZ0J1ZmZlciA9PSBudWxscHRyKSB8fCAoanBlZ0J1ZmZlclNpemUgPT0gMCkpIHsKKyAgICAgICAgcmV0dXJuIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVEOworICAgIH0KKworICAgIGF1dG8gZXhpZkRhdGEgPSBleGlmX2RhdGFfbmV3KCk7CisgICAgZXhpZl9kYXRhX2xvYWRfZGF0YShleGlmRGF0YSwganBlZ0J1ZmZlciwganBlZ0J1ZmZlclNpemUpOworICAgIEV4aWZFbnRyeSAqb3JpZW50YXRpb24gPSBleGlmX2NvbnRlbnRfZ2V0X2VudHJ5KGV4aWZEYXRhLT5pZmRbRVhJRl9JRkRfMF0sCisgICAgICAgICAgICBFWElGX1RBR19PUklFTlRBVElPTik7CisgICAgaWYgKChvcmllbnRhdGlvbiA9PSBudWxscHRyKSB8fCAob3JpZW50YXRpb24tPnNpemUgIT0gc2l6ZW9mKEV4aWZTaG9ydCkpKSB7CisgICAgICAgIEFMT0dWKCIlczogT3JpZW50YXRpb24gRVhJRiBlbnRyeSBpbnZhbGlkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGV4aWZfZGF0YV91bnJlZihleGlmRGF0YSk7CisgICAgICAgIHJldHVybiBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUzsKKyAgICB9CisKKyAgICBhdXRvIG9yaWVudGF0aW9uVmFsdWUgPSBleGlmX2dldF9zaG9ydChvcmllbnRhdGlvbi0+ZGF0YSwgZXhpZl9kYXRhX2dldF9ieXRlX29yZGVyKGV4aWZEYXRhKSk7CisgICAgRXhpZk9yaWVudGF0aW9uIHJldDsKKyAgICBzd2l0Y2ggKG9yaWVudGF0aW9uVmFsdWUpIHsKKyAgICAgICAgY2FzZSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUzoKKyAgICAgICAgY2FzZSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzkwX0RFR1JFRVM6CisgICAgICAgIGNhc2UgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8xODBfREVHUkVFUzoKKyAgICAgICAgY2FzZSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzI3MF9ERUdSRUVTOgorICAgICAgICAgICAgcmV0ID0gc3RhdGljX2Nhc3Q8RXhpZk9yaWVudGF0aW9uPiAob3JpZW50YXRpb25WYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBFWElGIG9yaWVudGF0aW9uIHZhbHVlOiAlZCwgZGVmYXVsdGluZyB0byAwIGRlZ3JlZXMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG9yaWVudGF0aW9uVmFsdWUpOworICAgICAgICAgICAgcmV0ID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVM7CisgICAgfQorCisgICAgZXhpZl9kYXRhX3VucmVmKGV4aWZEYXRhKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IGVuY29kZUdyYXlzY2FsZUpwZWcoc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LCB1aW50OF90ICppbiwgdm9pZCAqb3V0LAorICAgICAgICBjb25zdCBzaXplX3QgbWF4T3V0U2l6ZSwgdWludDhfdCBqcGVnUXVhbGl0eSwgRXhpZk9yaWVudGF0aW9uIGV4aWZPcmllbnRhdGlvbiwKKyAgICAgICAgc2l6ZV90ICZhY3R1YWxTaXplKSB7CisgICAgc3RhdHVzX3QgcmV0OworICAgIC8vIGxpYmpwZWcgaXMgYSBDIGxpYnJhcnkgc28gd2UgdXNlIEMtc3R5bGUgImluaGVyaXRhbmNlIiBieQorICAgIC8vIHB1dHRpbmcgbGlianBlZydzIGpwZWdfZGVzdGluYXRpb25fbWdyIGZpcnN0IGluIG91ciBjdXN0b20KKyAgICAvLyBzdHJ1Y3QuIFRoaXMgYWxsb3dzIHVzIHRvIGNhc3QganBlZ19kZXN0aW5hdGlvbl9tZ3IqIHRvCisgICAgLy8gQ3VzdG9tSnBlZ0Rlc3RNZ3IqIHdoZW4gd2UgZ2V0IGl0IHBhc3NlZCB0byB1cyBpbiBhIGNhbGxiYWNrLgorICAgIHN0cnVjdCBDdXN0b21KcGVnRGVzdE1nciA6IHB1YmxpYyBqcGVnX2Rlc3RpbmF0aW9uX21nciB7CisgICAgICAgIEpPQ1RFVCAqbUJ1ZmZlcjsKKyAgICAgICAgc2l6ZV90IG1CdWZmZXJTaXplOworICAgICAgICBzaXplX3QgbUVuY29kZWRTaXplOworICAgICAgICBib29sIG1TdWNjZXNzOworICAgIH0gZG1ncjsKKworICAgIGpwZWdfY29tcHJlc3Nfc3RydWN0IGNpbmZvID0ge307CisgICAganBlZ19lcnJvcl9tZ3IgamVycjsKKworICAgIC8vIEluaXRpYWxpemUgZXJyb3IgaGFuZGxpbmcgd2l0aCBzdGFuZGFyZCBjYWxsYmFja3MsIGJ1dAorICAgIC8vIHRoZW4gb3ZlcnJpZGUgb3V0cHV0X21lc3NhZ2UgKHRvIHByaW50IHRvIEFMT0cpIGFuZAorICAgIC8vIGVycm9yX2V4aXQgdG8gc2V0IGEgZmxhZyBhbmQgcHJpbnQgYSBtZXNzYWdlIGluc3RlYWQKKyAgICAvLyBvZiBraWxsaW5nIHRoZSB3aG9sZSBwcm9jZXNzLgorICAgIGNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZqZXJyKTsKKworICAgIGNpbmZvLmVyci0+b3V0cHV0X21lc3NhZ2UgPSBbXShqX2NvbW1vbl9wdHIgY2luZm8pIHsKKyAgICAgICAgY2hhciBidWZmZXJbSk1TR19MRU5HVEhfTUFYXTsKKworICAgICAgICAvKiBDcmVhdGUgdGhlIG1lc3NhZ2UgKi8KKyAgICAgICAgKCpjaW5mby0+ZXJyLT5mb3JtYXRfbWVzc2FnZSkoY2luZm8sIGJ1ZmZlcik7CisgICAgICAgIEFMT0dFKCJsaWJqcGVnIGVycm9yOiAlcyIsIGJ1ZmZlcik7CisgICAgfTsKKworICAgIGNpbmZvLmVyci0+ZXJyb3JfZXhpdCA9IFtdKGpfY29tbW9uX3B0ciBjaW5mbykgeworICAgICAgICAoKmNpbmZvLT5lcnItPm91dHB1dF9tZXNzYWdlKShjaW5mbyk7CisgICAgICAgIGlmKGNpbmZvLT5jbGllbnRfZGF0YSkgeworICAgICAgICAgICAgYXV0byAmIGRtZ3IgPSAqc3RhdGljX2Nhc3Q8Q3VzdG9tSnBlZ0Rlc3RNZ3IqPihjaW5mby0+Y2xpZW50X2RhdGEpOworICAgICAgICAgICAgZG1nci5tU3VjY2VzcyA9IGZhbHNlOworICAgICAgICB9CisgICAgfTsKKworICAgIC8vIE5vdyB0aGF0IHdlIGluaXRpYWxpemVkIHNvbWUgY2FsbGJhY2tzLCBsZXQncyBjcmVhdGUgb3VyIGNvbXByZXNzb3IKKyAgICBqcGVnX2NyZWF0ZV9jb21wcmVzcygmY2luZm8pOworICAgIGRtZ3IubUJ1ZmZlciA9IHN0YXRpY19jYXN0PEpPQ1RFVCo+KG91dCk7CisgICAgZG1nci5tQnVmZmVyU2l6ZSA9IG1heE91dFNpemU7CisgICAgZG1nci5tRW5jb2RlZFNpemUgPSAwOworICAgIGRtZ3IubVN1Y2Nlc3MgPSB0cnVlOworICAgIGNpbmZvLmNsaWVudF9kYXRhID0gc3RhdGljX2Nhc3Q8dm9pZCo+KCZkbWdyKTsKKworICAgIC8vIFRoZXNlIGxhbWJkYXMgYmVjb21lIEMtc3R5bGUgZnVuY3Rpb24gcG9pbnRlcnMgYW5kIGFzIHBlciBDKysxMSBzcGVjCisgICAgLy8gbWF5IG5vdCBjYXB0dXJlIGFueXRoaW5nLgorICAgIGRtZ3IuaW5pdF9kZXN0aW5hdGlvbiA9IFtdKGpfY29tcHJlc3NfcHRyIGNpbmZvKSB7CisgICAgICAgIGF1dG8gJiBkbWdyID0gc3RhdGljX2Nhc3Q8Q3VzdG9tSnBlZ0Rlc3RNZ3ImPigqY2luZm8tPmRlc3QpOworICAgICAgICBkbWdyLm5leHRfb3V0cHV0X2J5dGUgPSBkbWdyLm1CdWZmZXI7CisgICAgICAgIGRtZ3IuZnJlZV9pbl9idWZmZXIgPSBkbWdyLm1CdWZmZXJTaXplOworICAgICAgICBBTE9HVigiJXM6JWQganBlZyBzdGFydDogJXAgWyV6dV0iLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBkbWdyLm1CdWZmZXIsIGRtZ3IubUJ1ZmZlclNpemUpOworICAgIH07CisKKyAgICBkbWdyLmVtcHR5X291dHB1dF9idWZmZXIgPSBbXShqX2NvbXByZXNzX3B0ciBjaW5mbyBfX3VudXNlZCkgeworICAgICAgICBBTE9HVigiJXM6JWQgT3V0IG9mIGJ1ZmZlciIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9OworCisgICAgZG1nci50ZXJtX2Rlc3RpbmF0aW9uID0gW10oal9jb21wcmVzc19wdHIgY2luZm8pIHsKKyAgICAgICAgYXV0byAmIGRtZ3IgPSBzdGF0aWNfY2FzdDxDdXN0b21KcGVnRGVzdE1nciY+KCpjaW5mby0+ZGVzdCk7CisgICAgICAgIGRtZ3IubUVuY29kZWRTaXplID0gZG1nci5tQnVmZmVyU2l6ZSAtIGRtZ3IuZnJlZV9pbl9idWZmZXI7CisgICAgICAgIEFMT0dWKCIlczolZCBEb25lIHdpdGgganBlZzogJXp1IiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgZG1nci5tRW5jb2RlZFNpemUpOworICAgIH07CisgICAgY2luZm8uZGVzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyKj4oJmRtZ3IpOworICAgIGNpbmZvLmltYWdlX3dpZHRoID0gd2lkdGg7CisgICAgY2luZm8uaW1hZ2VfaGVpZ2h0ID0gaGVpZ2h0OworICAgIGNpbmZvLmlucHV0X2NvbXBvbmVudHMgPSAxOworICAgIGNpbmZvLmluX2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKKworICAgIC8vIEluaXRpYWxpemUgZGVmYXVsdHMgYW5kIHRoZW4gb3ZlcnJpZGUgd2hhdCB3ZSB3YW50CisgICAganBlZ19zZXRfZGVmYXVsdHMoJmNpbmZvKTsKKworICAgIGpwZWdfc2V0X3F1YWxpdHkoJmNpbmZvLCBqcGVnUXVhbGl0eSwgMSk7CisgICAganBlZ19zZXRfY29sb3JzcGFjZSgmY2luZm8sIEpDU19HUkFZU0NBTEUpOworICAgIGNpbmZvLnJhd19kYXRhX2luID0gMDsKKyAgICBjaW5mby5kY3RfbWV0aG9kID0gSkRDVF9JRkFTVDsKKworICAgIGNpbmZvLmNvbXBfaW5mb1swXS5oX3NhbXBfZmFjdG9yID0gMTsKKyAgICBjaW5mby5jb21wX2luZm9bMV0uaF9zYW1wX2ZhY3RvciA9IDE7CisgICAgY2luZm8uY29tcF9pbmZvWzJdLmhfc2FtcF9mYWN0b3IgPSAxOworICAgIGNpbmZvLmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yID0gMTsKKyAgICBjaW5mby5jb21wX2luZm9bMV0udl9zYW1wX2ZhY3RvciA9IDE7CisgICAgY2luZm8uY29tcF9pbmZvWzJdLnZfc2FtcF9mYWN0b3IgPSAxOworCisgICAganBlZ19zdGFydF9jb21wcmVzcygmY2luZm8sIFRSVUUpOworCisgICAgaWYgKGV4aWZPcmllbnRhdGlvbiAhPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZlV0aWxzPiB1dGlscyhFeGlmVXRpbHM6OmNyZWF0ZSgpKTsKKyAgICAgICAgdXRpbHMtPmluaXRpYWxpemVFbXB0eSgpOworICAgICAgICB1dGlscy0+c2V0SW1hZ2VXaWR0aCh3aWR0aCk7CisgICAgICAgIHV0aWxzLT5zZXRJbWFnZUhlaWdodChoZWlnaHQpOworICAgICAgICB1dGlscy0+c2V0T3JpZW50YXRpb25WYWx1ZShleGlmT3JpZW50YXRpb24pOworCisgICAgICAgIGlmICh1dGlscy0+Z2VuZXJhdGVBcHAxKCkpIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGV4aWZCdWZmZXIgPSB1dGlscy0+Z2V0QXBwMUJ1ZmZlcigpOworICAgICAgICAgICAgc2l6ZV90IGV4aWZCdWZmZXJTaXplID0gdXRpbHMtPmdldEFwcDFMZW5ndGgoKTsKKyAgICAgICAgICAgIGpwZWdfd3JpdGVfbWFya2VyKCZjaW5mbywgSlBFR19BUFAwICsgMSwgc3RhdGljX2Nhc3Q8Y29uc3QgSk9DVEVUKj4oZXhpZkJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgIGV4aWZCdWZmZXJTaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGdlbmVyYXRlIEFwcDEgYnVmZmVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2luZm8uaW1hZ2VfaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgYXV0byBjdXJyZW50Um93ICA9IHN0YXRpY19jYXN0PEpTQU1QUk9XPihpbiArIGkqd2lkdGgpOworICAgICAgICBqcGVnX3dyaXRlX3NjYW5saW5lcygmY2luZm8sICZjdXJyZW50Um93LCAvKm51bV9saW5lcyovMSk7CisgICAgfQorCisgICAganBlZ19maW5pc2hfY29tcHJlc3MoJmNpbmZvKTsKKworICAgIGFjdHVhbFNpemUgPSBkbWdyLm1FbmNvZGVkU2l6ZTsKKyAgICBpZiAoZG1nci5tU3VjY2VzcykgeworICAgICAgICByZXQgPSBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2lubGluZSB2b2lkIHVucGFja0RlcHRoMTYodWludDE2X3QgdmFsdWUsIHN0ZDo6dmVjdG9yPGZsb2F0PiAqcG9pbnRzIC8qb3V0Ki8sCisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAqY29uZmlkZW5jZSAvKm91dCovLCBmbG9hdCAqbmVhciAvKm91dCovLCBmbG9hdCAqZmFyIC8qb3V0Ki8pIHsKKyAgICAvLyBBbmRyb2lkIGRlbnNlbHkgcGFja2VkIGRlcHRoIG1hcC4gVGhlIHVuaXRzIGZvciB0aGUgcmFuZ2UgYXJlIGluCisgICAgLy8gbWlsbGltZXRlcnMgYW5kIG5lZWQgdG8gYmUgc2NhbGVkIHRvIG1ldGVycy4KKyAgICAvLyBUaGUgY29uZmlkZW5jZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSAzIG1vc3Qgc2lnbmlmaWNhbnQgYml0cy4KKyAgICAvLyBUaGUgY29uZmlkZW5jZSBkYXRhIG5lZWRzIHRvIGJlIGFkZGl0aW9uYWxseSBub3JtYWxpemVkIHdpdGgKKyAgICAvLyB2YWx1ZXMgMS4wZiwgMC4wZiByZXByZXNlbnRpbmcgbWF4aW11bSBhbmQgbWluaW11bSBjb25maWRlbmNlCisgICAgLy8gcmVzcGVjdGl2ZWx5LgorICAgIGF1dG8gcG9pbnQgPSBzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUgJiAweDFGRkYpIC8gMTAwMC5mOworICAgIHBvaW50cy0+cHVzaF9iYWNrKHBvaW50KTsKKworICAgIGF1dG8gY29uZiA9ICh2YWx1ZSA+PiAxMykgJiAweDc7CisgICAgZmxvYXQgbm9ybUNvbmZpZGVuY2UgPSAoY29uZiA9PSAwKSA/IDEuZiA6IChzdGF0aWNfY2FzdDxmbG9hdD4oY29uZikgLSAxKSAvIDcuZjsKKyAgICBjb25maWRlbmNlLT5wdXNoX2JhY2sobm9ybUNvbmZpZGVuY2UpOworCisgICAgaWYgKCpuZWFyID4gcG9pbnQpIHsKKyAgICAgICAgKm5lYXIgPSBwb2ludDsKKyAgICB9CisgICAgaWYgKCpmYXIgPCBwb2ludCkgeworICAgICAgICAqZmFyID0gcG9pbnQ7CisgICAgfQorfQorCisvLyBUcml2aWFsIGNhc2UsIHJlYWQgZm9yd2FyZCBmcm9tIHRvcCxsZWZ0IGNvcm5lci4KK3ZvaWQgcm90YXRlMEFuZFVucGFjayhEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lLCBzdGQ6OnZlY3RvcjxmbG9hdD4gKnBvaW50cyAvKm91dCovLAorICAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gKmNvbmZpZGVuY2UgLypvdXQqLywgZmxvYXQgKm5lYXIgLypvdXQqLywgZmxvYXQgKmZhciAvKm91dCovKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodDsgaSsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aDsgaisrKSB7CisgICAgICAgICAgICB1bnBhY2tEZXB0aDE2KGlucHV0RnJhbWUubURlcHRoTWFwQnVmZmVyW2kqaW5wdXRGcmFtZS5tRGVwdGhNYXBTdHJpZGUgKyBqXSwgcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgICAgICB9CisgICAgfQorfQorCisvLyA5MCBkZWdyZWVzIENXIHJvdGF0aW9uIGNhbiBiZSBhcHBsaWVkIGJ5IHN0YXJ0aW5nIHRvIHJlYWQgZnJvbSBib3R0b20sIGxlZnQgY29ybmVyCisvLyB0cmFuc3Bvc2luZyByb3dzIGFuZCBjb2x1bW5zLgordm9pZCByb3RhdGU5MEFuZFVucGFjayhEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lLCBzdGQ6OnZlY3RvcjxmbG9hdD4gKnBvaW50cyAvKm91dCovLAorICAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gKmNvbmZpZGVuY2UgLypvdXQqLywgZmxvYXQgKm5lYXIgLypvdXQqLywgZmxvYXQgKmZhciAvKm91dCovKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoOyBpKyspIHsKKyAgICAgICAgZm9yIChzc2l6ZV90IGogPSBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodC0xOyBqID49IDA7IGotLSkgeworICAgICAgICAgICAgdW5wYWNrRGVwdGgxNihpbnB1dEZyYW1lLm1EZXB0aE1hcEJ1ZmZlcltqKmlucHV0RnJhbWUubURlcHRoTWFwU3RyaWRlICsgaV0sIHBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgY29uZmlkZW5jZSwgbmVhciwgZmFyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gMTgwIENXIGRlZ3JlZXMgcm90YXRpb24gY2FuIGJlIGFwcGxpZWQgYnkgc3RhcnRpbmcgdG8gcmVhZCBiYWNrd2FyZHMgZnJvbSBib3R0b20sIHJpZ2h0IGNvcm5lci4KK3ZvaWQgcm90YXRlMTgwQW5kVW5wYWNrKERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWUsIHN0ZDo6dmVjdG9yPGZsb2F0PiAqcG9pbnRzIC8qb3V0Ki8sCisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAqY29uZmlkZW5jZSAvKm91dCovLCBmbG9hdCAqbmVhciAvKm91dCovLCBmbG9hdCAqZmFyIC8qb3V0Ki8pIHsKKyAgICBmb3IgKHNzaXplX3QgaSA9IGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0LTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGZvciAoc3NpemVfdCBqID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aC0xOyBqID49IDA7IGotLSkgeworICAgICAgICAgICAgdW5wYWNrRGVwdGgxNihpbnB1dEZyYW1lLm1EZXB0aE1hcEJ1ZmZlcltpKmlucHV0RnJhbWUubURlcHRoTWFwU3RyaWRlICsgal0sIHBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgY29uZmlkZW5jZSwgbmVhciwgZmFyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gMjcwIGRlZ3JlZXMgQ1cgcm90YXRpb24gY2FuIGJlIGFwcGxpZWQgYnkgc3RhcnRpbmcgdG8gcmVhZCBmcm9tIHRvcCwgcmlnaHQgY29ybmVyCisvLyB0cmFuc3Bvc2luZyByb3dzIGFuZCBjb2x1bW5zLgordm9pZCByb3RhdGUyNzBBbmRVbnBhY2soRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZSwgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpwb2ludHMgLypvdXQqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpjb25maWRlbmNlIC8qb3V0Ki8sIGZsb2F0ICpuZWFyIC8qb3V0Ki8sIGZsb2F0ICpmYXIgLypvdXQqLykgeworICAgIGZvciAoc3NpemVfdCBpID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aC0xOyBpID49IDA7IGktLSkgeworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0OyBqKyspIHsKKyAgICAgICAgICAgIHVucGFja0RlcHRoMTYoaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXJbaippbnB1dEZyYW1lLm1EZXB0aE1hcFN0cmlkZSArIGldLCBwb2ludHMsCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2UsIG5lYXIsIGZhcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgcm90YXRlQW5kVW5wYWNrKERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWUsIHN0ZDo6dmVjdG9yPGZsb2F0PiAqcG9pbnRzIC8qb3V0Ki8sCisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAqY29uZmlkZW5jZSAvKm91dCovLCBmbG9hdCAqbmVhciAvKm91dCovLCBmbG9hdCAqZmFyIC8qb3V0Ki8pIHsKKyAgICBzd2l0Y2ggKGlucHV0RnJhbWUubU9yaWVudGF0aW9uKSB7CisgICAgICAgIGNhc2UgRGVwdGhQaG90b09yaWVudGF0aW9uOjpERVBUSF9PUklFTlRBVElPTl8wX0RFR1JFRVM6CisgICAgICAgICAgICByb3RhdGUwQW5kVW5wYWNrKGlucHV0RnJhbWUsIHBvaW50cywgY29uZmlkZW5jZSwgbmVhciwgZmFyKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY2FzZSBEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzkwX0RFR1JFRVM6CisgICAgICAgICAgICByb3RhdGU5MEFuZFVucGFjayhpbnB1dEZyYW1lLCBwb2ludHMsIGNvbmZpZGVuY2UsIG5lYXIsIGZhcik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzE4MF9ERUdSRUVTOgorICAgICAgICAgICAgcm90YXRlMTgwQW5kVW5wYWNrKGlucHV0RnJhbWUsIHBvaW50cywgY29uZmlkZW5jZSwgbmVhciwgZmFyKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY2FzZSBEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzI3MF9ERUdSRUVTOgorICAgICAgICAgICAgcm90YXRlMjcwQW5kVW5wYWNrKGlucHV0RnJhbWUsIHBvaW50cywgY29uZmlkZW5jZSwgbmVhciwgZmFyKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiBVbnN1cHBvcnRlZCBkZXB0aCBwaG90byByb3RhdGlvbjogJWQsIGRlZmF1bHQgdG8gMCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5tT3JpZW50YXRpb24pOworICAgICAgICAgICAgcm90YXRlMEFuZFVucGFjayhpbnB1dEZyYW1lLCBwb2ludHMsIGNvbmZpZGVuY2UsIG5lYXIsIGZhcik7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8ZHluYW1pY19kZXB0aDo6RGVwdGhNYXA+IHByb2Nlc3NEZXB0aE1hcEZyYW1lKERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWUsCisgICAgICAgIEV4aWZPcmllbnRhdGlvbiBleGlmT3JpZW50YXRpb24sIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxJdGVtPj4gKml0ZW1zIC8qb3V0Ki8sCisgICAgICAgIGJvb2wgKnN3aXRjaERpbWVuc2lvbnMgLypvdXQqLykgeworICAgIGlmICgoaXRlbXMgPT0gbnVsbHB0cikgfHwgKHN3aXRjaERpbWVuc2lvbnMgPT0gbnVsbHB0cikpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHBvaW50cywgY29uZmlkZW5jZTsKKworICAgIHNpemVfdCBwb2ludENvdW50ID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aCAqIGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0OworICAgIHBvaW50cy5yZXNlcnZlKHBvaW50Q291bnQpOworICAgIGNvbmZpZGVuY2UucmVzZXJ2ZShwb2ludENvdW50KTsKKyAgICBmbG9hdCBuZWFyID0gVUlOVDE2X01BWDsKKyAgICBmbG9hdCBmYXIgPSAuMGY7CisgICAgKnN3aXRjaERpbWVuc2lvbnMgPSBmYWxzZTsKKyAgICAvLyBQaHlzaWNhbCByb3RhdGlvbiBvZiBkZXB0aCBhbmQgY29uZmlkZW5jZSBtYXBzIG1heSBiZSBuZWVkZWQgaW4gY2FzZQorICAgIC8vIHRoZSBFWElGIG9yaWVudGF0aW9uIGlzIHNldCB0byAwIGRlZ3JlZXMgYW5kIHRoZSBkZXB0aCBwaG90byBvcmllbnRhdGlvbgorICAgIC8vIChzb3VyY2UgY29sb3IgaW1hZ2UpIGhhcyBzb21lIGRpZmZlcmVudCB2YWx1ZS4KKyAgICBpZiAoZXhpZk9yaWVudGF0aW9uID09IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMF9ERUdSRUVTKSB7CisgICAgICAgICpzd2l0Y2hEaW1lbnNpb25zID0gcm90YXRlQW5kVW5wYWNrKGlucHV0RnJhbWUsICZwb2ludHMsICZjb25maWRlbmNlLCAmbmVhciwgJmZhcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcm90YXRlMEFuZFVucGFjayhpbnB1dEZyYW1lLCAmcG9pbnRzLCAmY29uZmlkZW5jZSwgJm5lYXIsICZmYXIpOworICAgIH0KKworICAgIHNpemVfdCB3aWR0aCA9IGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGg7CisgICAgc2l6ZV90IGhlaWdodCA9IGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0OworICAgIGlmICgqc3dpdGNoRGltZW5zaW9ucykgeworICAgICAgICB3aWR0aCA9IGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0OworICAgICAgICBoZWlnaHQgPSBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoOworICAgIH0KKworICAgIGlmIChuZWFyID09IGZhcikgeworICAgICAgICBBTE9HRSgiJXM6IE5lYXIgYW5kIGZhciByYW5nZSB2YWx1ZXMgbXVzdCBub3QgbWF0Y2ghIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcG9pbnRzUXVhbnRpemVkLCBjb25maWRlbmNlUXVhbnRpemVkOworICAgIHBvaW50c1F1YW50aXplZC5yZXNlcnZlKHBvaW50Q291bnQpOyBjb25maWRlbmNlUXVhbnRpemVkLnJlc2VydmUocG9pbnRDb3VudCk7CisgICAgYXV0byBwb2ludEl0ID0gcG9pbnRzLmJlZ2luKCk7CisgICAgYXV0byBjb25maWRlbmNlSXQgPSBjb25maWRlbmNlLmJlZ2luKCk7CisgICAgd2hpbGUgKChwb2ludEl0ICE9IHBvaW50cy5lbmQoKSkgJiYgKGNvbmZpZGVuY2VJdCAhPSBjb25maWRlbmNlLmVuZCgpKSkgeworICAgICAgICBwb2ludHNRdWFudGl6ZWQucHVzaF9iYWNrKGZsb29yZigoKGZhciAqICgqcG9pbnRJdCAtIG5lYXIpKSAvCisgICAgICAgICAgICAgICAgKCpwb2ludEl0ICogKGZhciAtIG5lYXIpKSkgKiAyNTUuMGYpKTsKKyAgICAgICAgY29uZmlkZW5jZVF1YW50aXplZC5wdXNoX2JhY2soZmxvb3JmKCpjb25maWRlbmNlSXQgKiAyNTUuMGYpKTsKKyAgICAgICAgY29uZmlkZW5jZUl0Kys7IHBvaW50SXQrKzsKKyAgICB9CisKKyAgICBEZXB0aE1hcFBhcmFtcyBkZXB0aFBhcmFtcyhEZXB0aEZvcm1hdDo6a1JhbmdlSW52ZXJzZSwgbmVhciwgZmFyLCBEZXB0aFVuaXRzOjprTWV0ZXJzLAorICAgICAgICAgICAgImFuZHJvaWQvZGVwdGhtYXAiKTsKKyAgICBkZXB0aFBhcmFtcy5jb25maWRlbmNlX3VyaSA9ICJhbmRyb2lkL2NvbmZpZGVuY2VtYXAiOworICAgIGRlcHRoUGFyYW1zLm1pbWUgPSAiaW1hZ2UvanBlZyI7CisgICAgZGVwdGhQYXJhbXMuZGVwdGhfaW1hZ2VfZGF0YS5yZXNpemUoaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUpOworICAgIGRlcHRoUGFyYW1zLmNvbmZpZGVuY2VfZGF0YS5yZXNpemUoaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUpOworICAgIHNpemVfdCBhY3R1YWxKcGVnU2l6ZTsKKyAgICBhdXRvIHJldCA9IGVuY29kZUdyYXlzY2FsZUpwZWcod2lkdGgsIGhlaWdodCwgcG9pbnRzUXVhbnRpemVkLmRhdGEoKSwKKyAgICAgICAgICAgIGRlcHRoUGFyYW1zLmRlcHRoX2ltYWdlX2RhdGEuZGF0YSgpLCBpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSwKKyAgICAgICAgICAgIGlucHV0RnJhbWUubUpwZWdRdWFsaXR5LCBleGlmT3JpZW50YXRpb24sIGFjdHVhbEpwZWdTaXplKTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCIlczogRGVwdGggbWFwIGNvbXByZXNzaW9uIGZhaWxlZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgZGVwdGhQYXJhbXMuZGVwdGhfaW1hZ2VfZGF0YS5yZXNpemUoYWN0dWFsSnBlZ1NpemUpOworCisgICAgcmV0ID0gZW5jb2RlR3JheXNjYWxlSnBlZyh3aWR0aCwgaGVpZ2h0LCBjb25maWRlbmNlUXVhbnRpemVkLmRhdGEoKSwKKyAgICAgICAgICAgIGRlcHRoUGFyYW1zLmNvbmZpZGVuY2VfZGF0YS5kYXRhKCksIGlucHV0RnJhbWUubU1heEpwZWdTaXplLAorICAgICAgICAgICAgaW5wdXRGcmFtZS5tSnBlZ1F1YWxpdHksIGV4aWZPcmllbnRhdGlvbiwgYWN0dWFsSnBlZ1NpemUpOworICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb25maWRlbmNlIG1hcCBjb21wcmVzc2lvbiBmYWlsZWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGRlcHRoUGFyYW1zLmNvbmZpZGVuY2VfZGF0YS5yZXNpemUoYWN0dWFsSnBlZ1NpemUpOworCisgICAgcmV0dXJuIERlcHRoTWFwOjpGcm9tRGF0YShkZXB0aFBhcmFtcywgaXRlbXMpOworfQorCitleHRlcm4gIkMiIGludCBwcm9jZXNzRGVwdGhQaG90b0ZyYW1lKERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWUsIHNpemVfdCBkZXB0aFBob3RvQnVmZmVyU2l6ZSwKKyAgICAgICAgdm9pZCogZGVwdGhQaG90b0J1ZmZlciAvKm91dCovLCBzaXplX3QqIGRlcHRoUGhvdG9BY3R1YWxTaXplIC8qb3V0Ki8pIHsKKyAgICBpZiAoKGlucHV0RnJhbWUubU1haW5KcGVnQnVmZmVyID09IG51bGxwdHIpIHx8IChpbnB1dEZyYW1lLm1EZXB0aE1hcEJ1ZmZlciA9PSBudWxscHRyKSB8fAorICAgICAgICAgICAgKGRlcHRoUGhvdG9CdWZmZXIgPT0gbnVsbHB0cikgfHwgKGRlcHRoUGhvdG9BY3R1YWxTaXplID09IG51bGxwdHIpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEl0ZW0+PiBpdGVtczsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q2FtZXJhPj4gY2FtZXJhTGlzdDsKKyAgICBhdXRvIGltYWdlID0gSW1hZ2U6OkZyb21EYXRhRm9yUHJpbWFyeUltYWdlKCJhbmRyb2lkL21haW5pbWFnZSIsICZpdGVtcyk7CisgICAgc3RkOjp1bmlxdWVfcHRyPENhbWVyYVBhcmFtcz4gY2FtZXJhUGFyYW1zKG5ldyBDYW1lcmFQYXJhbXMoc3RkOjptb3ZlKGltYWdlKSkpOworICAgIGlmIChjYW1lcmFQYXJhbXMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBpbml0aWFsaXplIGNhbWVyYSBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBFeGlmT3JpZW50YXRpb24gZXhpZk9yaWVudGF0aW9uID0gZ2V0RXhpZk9yaWVudGF0aW9uKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4gKGlucHV0RnJhbWUubU1haW5KcGVnQnVmZmVyKSwKKyAgICAgICAgICAgIGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSk7CisgICAgYm9vbCBzd2l0Y2hEaW1lbnNpb25zOworICAgIGNhbWVyYVBhcmFtcy0+ZGVwdGhfbWFwID0gcHJvY2Vzc0RlcHRoTWFwRnJhbWUoaW5wdXRGcmFtZSwgZXhpZk9yaWVudGF0aW9uLCAmaXRlbXMsCisgICAgICAgICAgICAmc3dpdGNoRGltZW5zaW9ucyk7CisgICAgaWYgKGNhbWVyYVBhcmFtcy0+ZGVwdGhfbWFwID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBEZXB0aCBtYXAgcHJvY2Vzc2luZyBmYWlsZWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBJdCBpcyBub3QgcG9zc2libGUgdG8gZ2VuZXJhdGUgYW4gaW1hZ2luZyBtb2RlbCB3aXRob3V0IGluc3RyaW5zaWMgY2FsaWJyYXRpb24uCisgICAgaWYgKGlucHV0RnJhbWUubUlzSW5zdHJpbnNpY0NhbGlicmF0aW9uVmFsaWQpIHsKKyAgICAgICAgLy8gVGhlIGNhbWVyYSBpbnRyaW5zaWMgY2FsaWJyYXRpb24gbGF5b3V0IGlzIGFzIGZvbGxvd3M6CisgICAgICAgIC8vIFtmb2NhbExlbmd0aFgsIGZvY2FsTGVuZ3RoWSwgb3B0aWNhbENlbnRlclgsIG9wdGljYWxDZW50ZXJZLCBza2V3XQorICAgICAgICBjb25zdCBkeW5hbWljX2RlcHRoOjpQb2ludDxkb3VibGU+IGZvY2FsTGVuZ3RoKGlucHV0RnJhbWUubUluc3RyaW5zaWNDYWxpYnJhdGlvblswXSwKKyAgICAgICAgICAgICAgICBpbnB1dEZyYW1lLm1JbnN0cmluc2ljQ2FsaWJyYXRpb25bMV0pOworICAgICAgICBzaXplX3Qgd2lkdGggPSBpbnB1dEZyYW1lLm1NYWluSnBlZ1dpZHRoOworICAgICAgICBzaXplX3QgaGVpZ2h0ID0gaW5wdXRGcmFtZS5tTWFpbkpwZWdIZWlnaHQ7CisgICAgICAgIGlmIChzd2l0Y2hEaW1lbnNpb25zKSB7CisgICAgICAgICAgICB3aWR0aCA9IGlucHV0RnJhbWUubU1haW5KcGVnSGVpZ2h0OworICAgICAgICAgICAgaGVpZ2h0ID0gaW5wdXRGcmFtZS5tTWFpbkpwZWdXaWR0aDsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBEaW1lbnNpb24gaW1hZ2VTaXplKHdpZHRoLCBoZWlnaHQpOworICAgICAgICBJbWFnaW5nTW9kZWxQYXJhbXMgaW1hZ2luZ1BhcmFtcyhmb2NhbExlbmd0aCwgaW1hZ2VTaXplKTsKKyAgICAgICAgaW1hZ2luZ1BhcmFtcy5wcmluY2lwYWxfcG9pbnQueCA9IGlucHV0RnJhbWUubUluc3RyaW5zaWNDYWxpYnJhdGlvblsyXTsKKyAgICAgICAgaW1hZ2luZ1BhcmFtcy5wcmluY2lwYWxfcG9pbnQueSA9IGlucHV0RnJhbWUubUluc3RyaW5zaWNDYWxpYnJhdGlvblszXTsKKyAgICAgICAgaW1hZ2luZ1BhcmFtcy5za2V3ID0gaW5wdXRGcmFtZS5tSW5zdHJpbnNpY0NhbGlicmF0aW9uWzRdOworCisgICAgICAgIC8vIFRoZSBjYW1lcmEgbGVucyBkaXN0b3J0aW9uIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbGVucyBjb3JyZWN0aW9uIGNvZWZmaWNpZW50cy4KKyAgICAgICAgLy8gW2thcHBhXzEsIGthcHBhXzIsIGthcHBhXzMga2FwcGFfNCwga2FwcGFfNV0KKyAgICAgICAgaWYgKGlucHV0RnJhbWUubUlzTGVuc0Rpc3RvcnRpb25WYWxpZCkgeworICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24gdGhlIGxlbnMgZGlzdG9ydGlvbiBjb2VmZmljaWVudHMgc2hvdWxkIGJlIG9yZGVyZWQKKyAgICAgICAgICAgIC8vIGFzIFsxLCBrYXBwYV80LCBrYXBwYV8xLCBrYXBwYV81LCBrYXBwYV8yLCAwLCBrYXBwYV8zLCAwXQorICAgICAgICAgICAgZmxvYXQgZGlzdG9ydGlvbkRhdGFbXSA9IHsxLmYsIGlucHV0RnJhbWUubUxlbnNEaXN0b3J0aW9uWzNdLAorICAgICAgICAgICAgICAgICAgICBpbnB1dEZyYW1lLm1MZW5zRGlzdG9ydGlvblswXSwgaW5wdXRGcmFtZS5tTGVuc0Rpc3RvcnRpb25bNF0sCisgICAgICAgICAgICAgICAgICAgIGlucHV0RnJhbWUubUxlbnNEaXN0b3J0aW9uWzFdLCAwLmYsIGlucHV0RnJhbWUubUxlbnNEaXN0b3J0aW9uWzJdLCAwLmZ9OworICAgICAgICAgICAgYXV0byBkaXN0b3J0aW9uRGF0YUxlbmd0aCA9IHNpemVvZihkaXN0b3J0aW9uRGF0YSkgLyBzaXplb2YoZGlzdG9ydGlvbkRhdGFbMF0pOworICAgICAgICAgICAgaW1hZ2luZ1BhcmFtcy5kaXN0b3J0aW9uLnJlc2VydmUoZGlzdG9ydGlvbkRhdGFMZW5ndGgpOworICAgICAgICAgICAgaW1hZ2luZ1BhcmFtcy5kaXN0b3J0aW9uLmluc2VydChpbWFnaW5nUGFyYW1zLmRpc3RvcnRpb24uZW5kKCksIGRpc3RvcnRpb25EYXRhLAorICAgICAgICAgICAgICAgICAgICBkaXN0b3J0aW9uRGF0YSArIGRpc3RvcnRpb25EYXRhTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIGNhbWVyYVBhcmFtcy0+aW1hZ2luZ19tb2RlbCA9IEltYWdpbmdNb2RlbDo6RnJvbURhdGEoaW1hZ2luZ1BhcmFtcyk7CisgICAgfQorCisgICAgaWYgKGlucHV0RnJhbWUubUlzTG9naWNhbCkgeworICAgICAgICBjYW1lcmFQYXJhbXMtPnRyYWl0ID0gZHluYW1pY19kZXB0aDo6Q2FtZXJhVHJhaXQ6OkxPR0lDQUw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2FtZXJhUGFyYW1zLT50cmFpdCA9IGR5bmFtaWNfZGVwdGg6OkNhbWVyYVRyYWl0OjpQSFlTSUNBTDsKKyAgICB9CisKKyAgICBjYW1lcmFMaXN0LmVtcGxhY2VfYmFjayhDYW1lcmE6OkZyb21EYXRhKHN0ZDo6bW92ZShjYW1lcmFQYXJhbXMpKSk7CisKKyAgICBhdXRvIGRldmljZVBhcmFtcyA9IHN0ZDo6bWFrZV91bmlxdWU8RGV2aWNlUGFyYW1zPiAoQ2FtZXJhczo6RnJvbUNhbWVyYUFycmF5KCZjYW1lcmFMaXN0KSk7CisgICAgZGV2aWNlUGFyYW1zLT5jb250YWluZXIgPSBDb250YWluZXI6OkZyb21JdGVtcygmaXRlbXMpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxQcm9maWxlPj4gcHJvZmlsZUxpc3Q7CisgICAgcHJvZmlsZUxpc3QuZW1wbGFjZV9iYWNrKFByb2ZpbGU6OkZyb21EYXRhKCJEZXB0aFBob3RvIiwgezB9KSk7CisgICAgZGV2aWNlUGFyYW1zLT5wcm9maWxlcyA9IFByb2ZpbGVzOjpGcm9tUHJvZmlsZUFycmF5KCZwcm9maWxlTGlzdCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPERldmljZT4gZGV2aWNlID0gRGV2aWNlOjpGcm9tRGF0YShzdGQ6Om1vdmUoZGV2aWNlUGFyYW1zKSk7CisgICAgaWYgKGRldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgY2FtZXJhIGRldmljZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RkOjppc3RyaW5nc3RyZWFtIGlucHV0SnBlZ1N0cmVhbSgKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGlucHV0RnJhbWUubU1haW5KcGVnQnVmZmVyLCBpbnB1dEZyYW1lLm1NYWluSnBlZ1NpemUpKTsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0cHV0SnBlZ1N0cmVhbTsKKyAgICBpZiAoIVdyaXRlSW1hZ2VBbmRNZXRhZGF0YUFuZENvbnRhaW5lcigmaW5wdXRKcGVnU3RyZWFtLCBkZXZpY2UuZ2V0KCksICZvdXRwdXRKcGVnU3RyZWFtKSkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB3cml0aW5nIGRlcHRoIG91dHB1dCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgKmRlcHRoUGhvdG9BY3R1YWxTaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PiAob3V0cHV0SnBlZ1N0cmVhbS50ZWxscCgpKTsKKyAgICBpZiAoKmRlcHRoUGhvdG9BY3R1YWxTaXplID4gZGVwdGhQaG90b0J1ZmZlclNpemUpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBEZXB0aCBwaG90byBvdXRwdXQgYnVmZmVyIG5vdCBzdWZmaWNpZW50LCBuZWVkZWQgJXp1IGFjdHVhbCAlenUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgKmRlcHRoUGhvdG9BY3R1YWxTaXplLCBkZXB0aFBob3RvQnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgbWVtY3B5KGRlcHRoUGhvdG9CdWZmZXIsIG91dHB1dEpwZWdTdHJlYW0uc3RyKCkuY19zdHIoKSwgKmRlcHRoUGhvdG9BY3R1YWxTaXplKTsKKworICAgIHJldHVybiAwOworfQorCit9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMmZiZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBM19ERVBUSF9QUk9DRVNTT1JfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfREVQVEhfUFJPQ0VTU09SX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK2VudW0gRGVwdGhQaG90b09yaWVudGF0aW9uIHsKKyAgICBERVBUSF9PUklFTlRBVElPTl8wX0RFR1JFRVMgICA9IDAsCisgICAgREVQVEhfT1JJRU5UQVRJT05fOTBfREVHUkVFUyAgPSA5MCwKKyAgICBERVBUSF9PUklFTlRBVElPTl8xODBfREVHUkVFUyA9IDE4MCwKKyAgICBERVBUSF9PUklFTlRBVElPTl8yNzBfREVHUkVFUyA9IDI3MCwKK307CisKK3N0cnVjdCBEZXB0aFBob3RvSW5wdXRGcmFtZSB7CisgICAgY29uc3QgY2hhciogICAgICAgICAgIG1NYWluSnBlZ0J1ZmZlcjsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgbU1haW5KcGVnU2l6ZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgbU1haW5KcGVnV2lkdGgsIG1NYWluSnBlZ0hlaWdodDsKKyAgICB1aW50MTZfdCogICAgICAgICAgICAgbURlcHRoTWFwQnVmZmVyOworICAgIHNpemVfdCAgICAgICAgICAgICAgICBtRGVwdGhNYXBXaWR0aCwgbURlcHRoTWFwSGVpZ2h0LCBtRGVwdGhNYXBTdHJpZGU7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgIG1NYXhKcGVnU2l6ZTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgbUpwZWdRdWFsaXR5OworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBtSXNMb2dpY2FsOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICBtSW5zdHJpbnNpY0NhbGlicmF0aW9uWzVdOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBtSXNJbnN0cmluc2ljQ2FsaWJyYXRpb25WYWxpZDsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgbUxlbnNEaXN0b3J0aW9uWzVdOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBtSXNMZW5zRGlzdG9ydGlvblZhbGlkOworICAgIERlcHRoUGhvdG9PcmllbnRhdGlvbiBtT3JpZW50YXRpb247CisKKyAgICBEZXB0aFBob3RvSW5wdXRGcmFtZSgpIDoKKyAgICAgICAgICAgIG1NYWluSnBlZ0J1ZmZlcihudWxscHRyKSwKKyAgICAgICAgICAgIG1NYWluSnBlZ1NpemUoMCksCisgICAgICAgICAgICBtTWFpbkpwZWdXaWR0aCgwKSwKKyAgICAgICAgICAgIG1NYWluSnBlZ0hlaWdodCgwKSwKKyAgICAgICAgICAgIG1EZXB0aE1hcEJ1ZmZlcihudWxscHRyKSwKKyAgICAgICAgICAgIG1EZXB0aE1hcFdpZHRoKDApLAorICAgICAgICAgICAgbURlcHRoTWFwSGVpZ2h0KDApLAorICAgICAgICAgICAgbURlcHRoTWFwU3RyaWRlKDApLAorICAgICAgICAgICAgbU1heEpwZWdTaXplKDApLAorICAgICAgICAgICAgbUpwZWdRdWFsaXR5KDEwMCksCisgICAgICAgICAgICBtSXNMb2dpY2FsKDApLAorICAgICAgICAgICAgbUluc3RyaW5zaWNDYWxpYnJhdGlvbnswLmZ9LAorICAgICAgICAgICAgbUlzSW5zdHJpbnNpY0NhbGlicmF0aW9uVmFsaWQoMCksCisgICAgICAgICAgICBtTGVuc0Rpc3RvcnRpb257MC5mfSwKKyAgICAgICAgICAgIG1Jc0xlbnNEaXN0b3J0aW9uVmFsaWQoMCksCisgICAgICAgICAgICBtT3JpZW50YXRpb24oRGVwdGhQaG90b09yaWVudGF0aW9uOjpERVBUSF9PUklFTlRBVElPTl8wX0RFR1JFRVMpIHt9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqa0RlcHRoUGhvdG9MaWJyYXJ5ID0gImxpYmRlcHRocGhvdG8uc28iOworc3RhdGljIGNvbnN0IGNoYXIgKmtEZXB0aFBob3RvUHJvY2Vzc0Z1bmN0aW9uID0gInByb2Nlc3NEZXB0aFBob3RvRnJhbWUiOwordHlwZWRlZiBpbnQgKCpwcm9jZXNzX2RlcHRoX3Bob3RvX2ZyYW1lKSAoRGVwdGhQaG90b0lucHV0RnJhbWUgLyppbnB1dEZyYW1lKi8sCisgICAgICAgIHNpemVfdCAvKmRlcHRoUGhvdG9CdWZmZXJTaXplKi8sIHZvaWQqIC8qZGVwdGhQaG90b0J1ZmZlciBvdXQqLywKKyAgICAgICAgc2l6ZV90KiAvKmRlcHRoUGhvdG9BY3R1YWxTaXplIG91dCovKTsKKworfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcAppbmRleCA4YzhiOTdhLi5kNmJmODNlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcApAQCAtMjM3LDcgKzIzNyw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNCdWZmZXJNYW5hZ2VyOjpnZXRCdWZmZXJGb3JTdHJlYW0oaW50IHN0cmVhbUlkLCBpbnQgc3RyZWFtU2V0SWQsCi0gICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+KiBnYiwgaW50KiBmZW5jZUZkKSB7CisgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+KiBnYiwgaW50KiBmZW5jZUZkLCBib29sIG5vRnJlZUJ1ZmZlckF0Q29uc3VtZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwpAQCAtMjUzLDE0ICsyNTMsMTkgQEAKICAgICBTdHJlYW1TZXQgJnN0cmVhbVNldCA9IG1TdHJlYW1TZXRNYXAuZWRpdFZhbHVlRm9yKHN0cmVhbVNldElkKTsKICAgICBCdWZmZXJDb3VudE1hcCYgaGFuZE91dEJ1ZmZlckNvdW50cyA9IHN0cmVhbVNldC5oYW5kb3V0QnVmZmVyQ291bnRNYXA7CiAgICAgc2l6ZV90JiBidWZmZXJDb3VudCA9IGhhbmRPdXRCdWZmZXJDb3VudHMuZWRpdFZhbHVlRm9yKHN0cmVhbUlkKTsKKyAgICBCdWZmZXJDb3VudE1hcCYgYXR0YWNoZWRCdWZmZXJDb3VudHMgPSBzdHJlYW1TZXQuYXR0YWNoZWRCdWZmZXJDb3VudE1hcDsKKyAgICBzaXplX3QmIGF0dGFjaGVkQnVmZmVyQ291bnQgPSBhdHRhY2hlZEJ1ZmZlckNvdW50cy5lZGl0VmFsdWVGb3Ioc3RyZWFtSWQpOworCisgICAgaWYgKG5vRnJlZUJ1ZmZlckF0Q29uc3VtZXIpIHsKKyAgICAgICAgYXR0YWNoZWRCdWZmZXJDb3VudCA9IGJ1ZmZlckNvdW50OworICAgIH0KKwogICAgIGlmIChidWZmZXJDb3VudCA+PSBzdHJlYW1TZXQubWF4QWxsb3dlZEJ1ZmZlckNvdW50KSB7CiAgICAgICAgIEFMT0dFKCIlczogYnVmZmVyQ291bnQgKCV6dSkgZXhjZWVkcyB0aGUgbWF4IGFsbG93ZWQgYnVmZmVyIGNvdW50ICglenUpIG9mIHRoaXMgc3RyZWFtIHNldCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZmZXJDb3VudCwgc3RyZWFtU2V0Lm1heEFsbG93ZWRCdWZmZXJDb3VudCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBCdWZmZXJDb3VudE1hcCYgYXR0YWNoZWRCdWZmZXJDb3VudHMgPSBzdHJlYW1TZXQuYXR0YWNoZWRCdWZmZXJDb3VudE1hcDsKLSAgICBzaXplX3QmIGF0dGFjaGVkQnVmZmVyQ291bnQgPSBhdHRhY2hlZEJ1ZmZlckNvdW50cy5lZGl0VmFsdWVGb3Ioc3RyZWFtSWQpOwogICAgIGlmIChhdHRhY2hlZEJ1ZmZlckNvdW50ID4gYnVmZmVyQ291bnQpIHsKICAgICAgICAgLy8gV2UndmUgYWxyZWFkeSBhdHRhY2hlZCBtb3JlIGJ1ZmZlcnMgdG8gdGhpcyBzdHJlYW0gdGhhbiB3ZSBjdXJyZW50bHkgaGF2ZQogICAgICAgICAvLyBvdXRzdGFuZGluZywgc28gaGF2ZSB0aGUgc3RyZWFtIGp1c3QgdXNlIGFuIGFscmVhZHktYXR0YWNoZWQgYnVmZmVyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmgKaW5kZXggMDI1MDYyZS4uZjBkZTFjMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuaApAQCAtMTEyLDYgKzExMiwxMCBAQAogICAgICAqCiAgICAgICogQWZ0ZXIgdGhpcyBjYWxsLCB0aGUgY2xpZW50IHRha2VzIG92ZXIgdGhlIG93bmVyc2hpcCBvZiB0aGlzIGJ1ZmZlciBpZiBpdCBpcyBub3QgZnJlZWQuCiAgICAgICoKKyAgICAgKiBTb21ldGltZXMgZnJlZSBidWZmZXJzIGFyZSBkaXNjYXJkZWQgZnJvbSBjb25zdW1lciBzaWRlIGFuZCB0aGUgZGVxdWV1ZUJ1ZmZlciBjYWxsIHJldHVybnMKKyAgICAgKiBUSU1FRF9PVVQsIGluIHRoaXMgY2FzZSBjYWxsaW5nIGdldEJ1ZmZlckZvclN0cmVhbSBhZ2FpbiB3aXRoIG5vRnJlZUJ1ZmZlckF0Q29uc3VtZXIgc2V0IHRvCisgICAgICogdHJ1ZSB3aWxsIG5vdGlmeSBidWZmZXIgbWFuYWdlciB0byB1cGRhdGUgaXRzIHN0YXRlcyBhbmQgYWxzbyB0cmllcyB0byBhbGxvY2F0ZSBhIG5ldyBidWZmZXIuCisgICAgICoKICAgICAgKiBSZXR1cm4gdmFsdWVzOgogICAgICAqCiAgICAgICogIE9LOiAgICAgICAgR2V0dGluZyBidWZmZXIgZm9yIHRoaXMgc3RyZWFtIHdhcyBzdWNjZXNzZnVsLgpAQCAtMTIyLDcgKzEyNiw5IEBACiAgICAgICogICAgICAgICAgICAgdG8gdGhpcyBidWZmZXIgbWFuYWdlciBiZWZvcmUuCiAgICAgICogIE5PX01FTU9SWTogVW5hYmxlIHRvIGFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGlzIHN0cmVhbSBhdCB0aGlzIHRpbWUuCiAgICAgICovCi0gICAgc3RhdHVzX3QgZ2V0QnVmZmVyRm9yU3RyZWFtKGludCBzdHJlYW1JZCwgaW50IHN0cmVhbVNldElkLCBzcDxHcmFwaGljQnVmZmVyPiogZ2IsIGludCogZmVuY2VGZCk7CisgICAgc3RhdHVzX3QgZ2V0QnVmZmVyRm9yU3RyZWFtKAorICAgICAgICAgICAgaW50IHN0cmVhbUlkLCBpbnQgc3RyZWFtU2V0SWQsIHNwPEdyYXBoaWNCdWZmZXI+KiBnYiwgaW50KiBmZW5jZUZkLAorICAgICAgICAgICAgYm9vbCBub0ZyZWVCdWZmZXJBdENvbnN1bWVyID0gZmFsc2UpOwogCiAgICAgLyoqCiAgICAgICogVGhpcyBtZXRob2Qgbm90aWZpZXMgdGhlIG1hbmFnZXIgdGhhdCBhIGJ1ZmZlciBoYXMgYmVlbiByZWxlYXNlZCBieSB0aGUgY29uc3VtZXIuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcAppbmRleCBiMjAxMTE5Li4yMmUwOWU0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKQEAgLTU2LDYgKzU2LDkgQEAKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oIgogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oIgogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgorCisjaW5jbHVkZSA8dHVwbGU+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjYW1lcmEzOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE7CkBAIC03OCwxMSArODEsMTAgQEAKICAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIoMCksCiAgICAgICAgIG1MaXN0ZW5lcihOVUxMKSwKICAgICAgICAgbVZlbmRvclRhZ0lkKENBTUVSQV9NRVRBREFUQV9JTlZBTElEX1ZFTkRPUl9JRCksCi0gICAgICAgIG1MYXN0VGVtcGxhdGVJZCgtMSkKKyAgICAgICAgbUxhc3RUZW1wbGF0ZUlkKC0xKSwKKyAgICAgICAgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzKGZhbHNlKQogewogICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgY2FtZXJhM19jYWxsYmFja19vcHM6Om5vdGlmeSA9ICZzTm90aWZ5OwotICAgIGNhbWVyYTNfY2FsbGJhY2tfb3BzOjpwcm9jZXNzX2NhcHR1cmVfcmVzdWx0ID0gJnNQcm9jZXNzQ2FwdHVyZVJlc3VsdDsKICAgICBBTE9HVigiJXM6IENyZWF0ZWQgZGV2aWNlIGZvciBjYW1lcmEgJXMiLCBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7CiB9CiAKQEAgLTkwLDcgKzkyLDcgQEAKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogVGVhcmluZyBkb3duIGZvciBjYW1lcmEgaWQgJXMiLCBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7Ci0gICAgZGlzY29ubmVjdCgpOworICAgIGRpc2Nvbm5lY3RJbXBsKCk7CiB9CiAKIGNvbnN0IFN0cmluZzgmIENhbWVyYTNEZXZpY2U6OmdldElkKCkgY29uc3QgewpAQCAtMTI3LDcgKzEyOSw3IEBACiAgICAgfQogCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOwotICAgIGJvb2wgaXNMb2dpY2FsID0gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc0xvZ2ljYWxDYW1lcmEobURldmljZUluZm8sICZwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgYm9vbCBpc0xvZ2ljYWwgPSBtYW5hZ2VyLT5pc0xvZ2ljYWxDYW1lcmEobUlkLnN0cmluZygpLCAmcGh5c2ljYWxDYW1lcmFJZHMpOwogICAgIGlmIChpc0xvZ2ljYWwpIHsKICAgICAgICAgZm9yIChhdXRvJiBwaHlzaWNhbElkIDogcGh5c2ljYWxDYW1lcmFJZHMpIHsKICAgICAgICAgICAgIHJlcyA9IG1hbmFnZXItPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhwaHlzaWNhbElkLCAmbVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSk7CkBAIC0xODEsNyArMTgzLDE0IEBACiAgICAgICAgICAgICB9KTsKICAgICB9CiAKLSAgICBtSW50ZXJmYWNlID0gbmV3IEhhbEludGVyZmFjZShzZXNzaW9uLCBxdWV1ZSk7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGJ1Zk1nck1vZGUgPQorICAgICAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX0lORk9fU1VQUE9SVEVEX0JVRkZFUl9NQU5BR0VNRU5UX1ZFUlNJT04pOworICAgIGlmIChidWZNZ3JNb2RlLmNvdW50ID4gMCkgeworICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIgPSAoYnVmTWdyTW9kZS5kYXRhLnU4WzBdID09CisgICAgICAgICAgICBBTkRST0lEX0lORk9fU1VQUE9SVEVEX0JVRkZFUl9NQU5BR0VNRU5UX1ZFUlNJT05fSElETF9ERVZJQ0VfM181KTsKKyAgICB9CisKKyAgICBtSW50ZXJmYWNlID0gbmV3IEhhbEludGVyZmFjZShzZXNzaW9uLCBxdWV1ZSwgbVVzZUhhbEJ1Zk1hbmFnZXIpOwogICAgIHN0ZDo6c3RyaW5nIHByb3ZpZGVyVHlwZTsKICAgICBtVmVuZG9yVGFnSWQgPSBtYW5hZ2VyLT5nZXRQcm92aWRlclRhZ0lkTG9ja2VkKG1JZC5zdHJpbmcoKSk7CiAgICAgbVRhZ01vbml0b3IuaW5pdGlhbGl6ZShtVmVuZG9yVGFnSWQpOwpAQCAtMTg5LDYgKzE5OCwyOCBAQAogICAgICAgICBtVGFnTW9uaXRvci5wYXJzZVRhZ3NUb01vbml0b3IoU3RyaW5nOChtb25pdG9yVGFncykpOwogICAgIH0KIAorICAgIC8vIE1ldGFkYXRhIHRhZ3MgbmVlZHMgZml4dXAgZm9yIG1vbm9jaHJvbWUgY2FtZXJhIGRldmljZSB2ZXJzaW9uIGxlc3MKKyAgICAvLyB0aGFuIDMuNS4KKyAgICBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1heFZlcnNpb257MCwwfTsKKyAgICByZXMgPSBtYW5hZ2VyLT5nZXRIaWdoZXN0U3VwcG9ydGVkVmVyc2lvbihtSWQuc3RyaW5nKCksICZtYXhWZXJzaW9uKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3IgaW4gZ2V0dGluZyBjYW1lcmEgZGV2aWNlIHZlcnNpb24gaWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGludCBkZXZpY2VWZXJzaW9uID0gSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKAorICAgICAgICAgICAgbWF4VmVyc2lvbi5nZXRfbWFqb3IoKSwgbWF4VmVyc2lvbi5nZXRfbWlub3IoKSk7CisKKyAgICBib29sIGlzTW9ub2Nocm9tZSA9IGZhbHNlOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5ID0gbURldmljZUluZm8uZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgaSsrKSB7CisgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5LmRhdGEudThbaV07CisgICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01PTk9DSFJPTUUpIHsKKyAgICAgICAgICAgIGlzTW9ub2Nocm9tZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzID0gKGlzTW9ub2Nocm9tZSAmJiBkZXZpY2VWZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzUpOworCiAgICAgcmV0dXJuIGluaXRpYWxpemVDb21tb25Mb2NrZWQoKTsKIH0KIApAQCAtMjA4LDYgKzIzOSwxNyBAQAogICAgIC8qKiBSZWdpc3RlciBpbi1mbGlnaHQgbWFwIHRvIHRoZSBzdGF0dXMgdHJhY2tlciAqLwogICAgIG1JbkZsaWdodFN0YXR1c0lkID0gbVN0YXR1c1RyYWNrZXItPmFkZENvbXBvbmVudCgpOwogCisgICAgaWYgKG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIHJlcyA9IG1SZXF1ZXN0QnVmZmVyU00uaW5pdGlhbGl6ZShtU3RhdHVzVHJhY2tlcik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIFNFVF9FUlJfTCgiVW5hYmxlIHRvIHN0YXJ0IHJlcXVlc3QgYnVmZmVyIHN0YXRlIG1hY2hpbmU6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIG1JbnRlcmZhY2UtPmNsb3NlKCk7CisgICAgICAgICAgICBtU3RhdHVzVHJhY2tlci5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKiBDcmVhdGUgYnVmZmVyIG1hbmFnZXIgKi8KICAgICBtQnVmZmVyTWFuYWdlciA9IG5ldyBDYW1lcmEzQnVmZmVyTWFuYWdlcigpOwogCkBAIC0yMTcsOCArMjU5LDEwIEBACiAgICAgaWYgKHNlc3Npb25LZXlzRW50cnkuY291bnQgPiAwKSB7CiAgICAgICAgIHNlc3Npb25QYXJhbUtleXMuaW5zZXJ0QXJyYXlBdChzZXNzaW9uS2V5c0VudHJ5LmRhdGEuaTMyLCAwLCBzZXNzaW9uS2V5c0VudHJ5LmNvdW50KTsKICAgICB9CisKICAgICAvKiogU3RhcnQgdXAgcmVxdWVzdCBxdWV1ZSB0aHJlYWQgKi8KLSAgICBtUmVxdWVzdFRocmVhZCA9IG5ldyBSZXF1ZXN0VGhyZWFkKHRoaXMsIG1TdGF0dXNUcmFja2VyLCBtSW50ZXJmYWNlLCBzZXNzaW9uUGFyYW1LZXlzKTsKKyAgICBtUmVxdWVzdFRocmVhZCA9IG5ldyBSZXF1ZXN0VGhyZWFkKAorICAgICAgICAgICAgdGhpcywgbVN0YXR1c1RyYWNrZXIsIG1JbnRlcmZhY2UsIHNlc3Npb25QYXJhbUtleXMsIG1Vc2VIYWxCdWZNYW5hZ2VyKTsKICAgICByZXMgPSBtUmVxdWVzdFRocmVhZC0+cnVuKFN0cmluZzg6OmZvcm1hdCgiQzNEZXYtJXMtUmVxUXVldWUiLCBtSWQuc3RyaW5nKCkpLnN0cmluZygpKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIFNFVF9FUlJfTCgiVW5hYmxlIHRvIHN0YXJ0IHJlcXVlc3QgcXVldWUgdGhyZWFkOiAlcyAoJWQpIiwKQEAgLTI3MCwxMSArMzE0LDE0IEBACiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfQotCiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpkaXNjb25uZWN0KCkgeworICAgIHJldHVybiBkaXNjb25uZWN0SW1wbCgpOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpkaXNjb25uZWN0SW1wbCgpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAKQEAgLTM0MSw2ICszODgsNyBAQAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgICAgICBtUmVxdWVzdFRocmVhZC5jbGVhcigpOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgc3RMb2NrKG1UcmFja2VyTG9jayk7CiAgICAgICAgIG1TdGF0dXNUcmFja2VyLmNsZWFyKCk7CiAgICAgICAgIGludGVyZmFjZSA9IG1JbnRlcmZhY2UuZ2V0KCk7CiAgICAgfQpAQCAtODM5LDE0ICs4ODcsMTQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OmNhcHR1cmUoQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsIGludDY0X3QqIC8qbGFzdEZyYW1lTnVtYmVyKi8pIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmNhcHR1cmUoQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsIGludDY0X3QqIGxhc3RGcmFtZU51bWJlcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBMaXN0PGNvbnN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0PiByZXF1ZXN0c0xpc3Q7CiAgICAgc3RkOjpsaXN0PGNvbnN0IFN1cmZhY2VNYXA+IHN1cmZhY2VNYXBzOwogICAgIGNvbnZlcnRUb1JlcXVlc3RMaXN0KHJlcXVlc3RzTGlzdCwgc3VyZmFjZU1hcHMsIHJlcXVlc3QpOwogCi0gICAgcmV0dXJuIGNhcHR1cmVMaXN0KHJlcXVlc3RzTGlzdCwgc3VyZmFjZU1hcHMsIC8qbGFzdEZyYW1lTnVtYmVyKi9OVUxMKTsKKyAgICByZXR1cm4gY2FwdHVyZUxpc3QocmVxdWVzdHNMaXN0LCBzdXJmYWNlTWFwcywgbGFzdEZyYW1lTnVtYmVyKTsKIH0KIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpjb252ZXJ0VG9SZXF1ZXN0TGlzdChMaXN0PGNvbnN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0PiYgcmVxdWVzdHNMaXN0LApAQCAtOTEzLDYgKzk2MSwyMzIgQEAKICAgICByZXR1cm4gcmVzOwogfQogCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYTNEZXZpY2U6OnJlcXVlc3RTdHJlYW1CdWZmZXJzKAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgcmVxdWVzdFN0cmVhbUJ1ZmZlcnNfY2IgX2hpZGxfY2IpIHsKKyAgICB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3RTdGF0dXM7CisgICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpTdHJlYW1CdWZmZXJSZXQ7CisgICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVxdWVzdEJ1ZmZlckludGVyZmFjZUxvY2spOworCisgICAgaGFyZHdhcmU6OmhpZGxfdmVjPFN0cmVhbUJ1ZmZlclJldD4gYnVmUmV0czsKKyAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzIGRvZXMgbm90IHN1cHBvcnQgSEFMIGJ1ZmZlciBtYW5hZ2VtZW50IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7CisgICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUywgYnVmUmV0cyk7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIH0KKworICAgIFNvcnRlZFZlY3RvcjxpbnQzMl90PiBzdHJlYW1JZHM7CisgICAgc3NpemVfdCBzeiA9IHN0cmVhbUlkcy5zZXRDYXBhY2l0eShidWZSZXFzLnNpemUoKSk7CisgICAgaWYgKHN6IDwgMCB8fCBzdGF0aWNfY2FzdDxzaXplX3Q+KHN6KSAhPSBidWZSZXFzLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yICV6dSBidWZmZXIgcmVxdWVzdHMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmUmVxcy5zaXplKCkpOworICAgICAgICBfaGlkbF9jYihCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFMsIGJ1ZlJldHMpOworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICB9CisKKyAgICBpZiAoYnVmUmVxcy5zaXplKCkgPiBtT3V0cHV0U3RyZWFtcy5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB0b28gbWFueSBidWZmZXIgcmVxdWVzdHMgKCV6dSA+ICMgb2Ygb3V0cHV0IHN0cmVhbXMgJXp1KSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZSZXFzLnNpemUoKSwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpKTsKKyAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTLCBidWZSZXRzKTsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgfQorCisgICAgLy8gQ2hlY2sgZm9yIHJlcGVhdGVkIHN0cmVhbUlkCisgICAgZm9yIChjb25zdCBhdXRvJiBidWZSZXEgOiBidWZSZXFzKSB7CisgICAgICAgIGlmIChzdHJlYW1JZHMuaW5kZXhPZihidWZSZXEuc3RyZWFtSWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZCBhcHBlYXIgbXVsdGlwbGUgdGltZXMgaW4gYnVmZmVyIHJlcXVlc3RzIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZSZXEuc3RyZWFtSWQpOworICAgICAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTLCBidWZSZXRzKTsKKyAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICB9CisgICAgICAgIHN0cmVhbUlkcy5hZGQoYnVmUmVxLnN0cmVhbUlkKTsKKyAgICB9CisKKyAgICBpZiAoIW1SZXF1ZXN0QnVmZmVyU00uc3RhcnRSZXF1ZXN0QnVmZmVyKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IGJ1ZmZlciBkaXNhbGxvd2VkIHdoaWxlIGNhbWVyYSBzZXJ2aWNlIGlzIGNvbmZpZ3VyaW5nIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICBfaGlkbF9jYihCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfQ09ORklHVVJJTkcsIGJ1ZlJldHMpOworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICB9CisKKyAgICBidWZSZXRzLnJlc2l6ZShidWZSZXFzLnNpemUoKSk7CisKKyAgICBib29sIGFsbFJlcXNTdWNjZWVkcyA9IHRydWU7CisgICAgYm9vbCBvbmVSZXFTdWNjZWVkcyA9IGZhbHNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmUmVxcy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBhdXRvJiBidWZSZXEgPSBidWZSZXFzW2ldOworICAgICAgICBhdXRvJiBidWZSZXQgPSBidWZSZXRzW2ldOworICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gYnVmUmVxLnN0cmVhbUlkOworICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgICAgICBpZiAob3V0cHV0U3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogT3V0cHV0IHN0cmVhbSBpZCAlZCBub3QgZm91bmQhIiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8U3RyZWFtQnVmZmVyUmV0PiBlbXB0eUJ1ZlJldHM7CisgICAgICAgICAgICBfaGlkbF9jYihCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFMsIGVtcHR5QnVmUmV0cyk7CisgICAgICAgICAgICBtUmVxdWVzdEJ1ZmZlclNNLmVuZFJlcXVlc3RCdWZmZXIoKTsKKyAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+aXNBYmFuZG9uZWQoKSkgeworICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6OlNUUkVBTV9ESVNDT05ORUNURUQpOworICAgICAgICAgICAgYWxsUmVxc1N1Y2NlZWRzID0gZmFsc2U7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZlJldC5zdHJlYW1JZCA9IHN0cmVhbUlkOworICAgICAgICBzaXplX3QgaGFuZE91dEJ1ZmZlckNvdW50ID0gb3V0cHV0U3RyZWFtLT5nZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpOworICAgICAgICB1aW50MzJfdCBudW1CdWZmZXJzUmVxdWVzdGVkID0gYnVmUmVxLm51bUJ1ZmZlcnNSZXF1ZXN0ZWQ7CisgICAgICAgIHNpemVfdCB0b3RhbEhhbmRvdXQgPSBoYW5kT3V0QnVmZmVyQ291bnQgKyBudW1CdWZmZXJzUmVxdWVzdGVkOworICAgICAgICB1aW50MzJfdCBtYXhCdWZmZXJzID0gb3V0cHV0U3RyZWFtLT5hc0hhbFN0cmVhbSgpLT5tYXhfYnVmZmVyczsKKyAgICAgICAgaWYgKHRvdGFsSGFuZG91dCA+IG1heEJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIC8vIE5vdCBhYmxlIHRvIGFsbG9jYXRlIGVub3VnaCBidWZmZXIuIEV4aXQgZWFybHkgZm9yIHRoaXMgc3RyZWFtCisgICAgICAgICAgICBBTE9HRSgiJXM6IHJlcXVlc3QgdG9vIG11Y2ggYnVmZmVycyBmb3Igc3RyZWFtICVkOiBhdCBIQUw6ICV6dSArIHJlcXVlc3Rpbmc6ICVkIgorICAgICAgICAgICAgICAgICAgICAiID4gbWF4OiAlZCIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIGhhbmRPdXRCdWZmZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgbnVtQnVmZmVyc1JlcXVlc3RlZCwgbWF4QnVmZmVycyk7CisgICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6TUFYX0JVRkZFUl9FWENFRURFRCk7CisgICAgICAgICAgICBhbGxSZXFzU3VjY2VlZHMgPSBmYWxzZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPFN0cmVhbUJ1ZmZlcj4gdG1wUmV0QnVmZmVycyhudW1CdWZmZXJzUmVxdWVzdGVkKTsKKyAgICAgICAgYm9vbCBjdXJyZW50UmVxU3VjY2VlZHMgPSB0cnVlOworICAgICAgICBzdGQ6OnZlY3RvcjxjYW1lcmEzX3N0cmVhbV9idWZmZXJfdD4gc3RyZWFtQnVmZmVycyhudW1CdWZmZXJzUmVxdWVzdGVkKTsKKyAgICAgICAgc2l6ZV90IG51bUFsbG9jYXRlZEJ1ZmZlcnMgPSAwOworICAgICAgICBzaXplX3QgbnVtUHVzaGVkSW5mbGlnaHRCdWZmZXJzID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgYiA9IDA7IGIgPCBudW1CdWZmZXJzUmVxdWVzdGVkOyBiKyspIHsKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90JiBzYiA9IHN0cmVhbUJ1ZmZlcnNbYl07CisgICAgICAgICAgICAvLyBTaW5jZSB0aGlzIG1ldGhvZCBjYW4gcnVuIGNvbmN1cnJlbnRseSB3aXRoIHJlcXVlc3QgdGhyZWFkCisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgd2FpdCBkdXJhdGlvbiBldmVyeXRpbWUgd2UgY2FsbCBnZXRidWZmZXIKKyAgICAgICAgICAgIG5zZWNzX3Qgd2FpdER1cmF0aW9uID0ga0Jhc2VHZXRCdWZmZXJXYWl0ICsgZ2V0RXhwZWN0ZWRJbkZsaWdodER1cmF0aW9uKCk7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBvdXRwdXRTdHJlYW0tPmdldEJ1ZmZlcigmc2IsIHdhaXREdXJhdGlvbik7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gTk9fSU5JVCB8fCByZXMgPT0gREVBRF9PQkpFQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6OlNUUkVBTV9ESVNDT05ORUNURUQpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzID09IFRJTUVEX09VVCB8fCByZXMgPT0gTk9fTUVNT1JZKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZlJldC52YWwuZXJyb3IoU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpOT19CVUZGRVJfQVZBSUxBQkxFKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6VU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGN1cnJlbnRSZXFTdWNjZWVkcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbnVtQWxsb2NhdGVkQnVmZmVycysrOworCisgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciA9IHNiLmJ1ZmZlcjsKKyAgICAgICAgICAgIGF1dG8gcGFpciA9IG1JbnRlcmZhY2UtPmdldEJ1ZmZlcklkKCpidWZmZXIsIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgdWludDY0X3QgYnVmZmVySWQgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgICAgIFN0cmVhbUJ1ZmZlciYgaEJ1ZiA9IHRtcFJldEJ1ZmZlcnNbYl07CisKKyAgICAgICAgICAgIGhCdWYuc3RyZWFtSWQgPSBzdHJlYW1JZDsKKyAgICAgICAgICAgIGhCdWYuYnVmZmVySWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgIGhCdWYuYnVmZmVyID0gKGlzTmV3QnVmZmVyKSA/ICpidWZmZXIgOiBudWxscHRyOworICAgICAgICAgICAgaEJ1Zi5zdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok9LOworICAgICAgICAgICAgaEJ1Zi5yZWxlYXNlRmVuY2UgPSBudWxscHRyOworCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7CisgICAgICAgICAgICBpZiAoc2IuYWNxdWlyZV9mZW5jZSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7CisgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlLT5kYXRhWzBdID0gc2IuYWNxdWlyZV9mZW5jZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhCdWYuYWNxdWlyZUZlbmNlLnNldFRvKGFjcXVpcmVGZW5jZSwgLypzaG91bGRPd24qL3RydWUpOworICAgICAgICAgICAgaEJ1Zi5yZWxlYXNlRmVuY2UgPSBudWxscHRyOworCisgICAgICAgICAgICByZXMgPSBtSW50ZXJmYWNlLT5wdXNoSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKGJ1ZmZlcklkLCBidWZmZXIsIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IGdldCByZWdpc3RlciByZXF1ZXN0IGJ1ZmZlcnMgZm9yIHN0cmVhbSAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6VU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICAgICAgY3VycmVudFJlcVN1Y2NlZWRzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW1QdXNoZWRJbmZsaWdodEJ1ZmZlcnMrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3VycmVudFJlcVN1Y2NlZWRzKSB7CisgICAgICAgICAgICBidWZSZXQudmFsLmJ1ZmZlcnMoc3RkOjptb3ZlKHRtcFJldEJ1ZmZlcnMpKTsKKyAgICAgICAgICAgIG9uZVJlcVN1Y2NlZWRzID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFsbFJlcXNTdWNjZWVkcyA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgYiA9IDA7IGIgPCBudW1QdXNoZWRJbmZsaWdodEJ1ZmZlcnM7IGIrKykgeworICAgICAgICAgICAgICAgIFN0cmVhbUJ1ZmZlciYgaEJ1ZiA9IHRtcFJldEJ1ZmZlcnNbYl07CisgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90KiBidWZmZXI7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gbUludGVyZmFjZS0+cG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKGhCdWYuYnVmZmVySWQsICZidWZmZXIpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgU0VUX0VSUigiJXM6IHBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlciBmYWlsZWQgZm9yIHN0cmVhbSAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgYiA9IDA7IGIgPCBudW1BbGxvY2F0ZWRCdWZmZXJzOyBiKyspIHsKKyAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCYgc2IgPSBzdHJlYW1CdWZmZXJzW2JdOworICAgICAgICAgICAgICAgIHNiLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgICAgICAgICBzYi5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHN0cmVhbUJ1ZmZlcnMuZGF0YSgpLCBudW1BbGxvY2F0ZWRCdWZmZXJzLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9oaWRsX2NiKGFsbFJlcXNTdWNjZWVkcyA/IEJ1ZmZlclJlcXVlc3RTdGF0dXM6Ok9LIDoKKyAgICAgICAgICAgIG9uZVJlcVN1Y2NlZWRzID8gQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX1BBUlRJQUwgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfVU5LTk9XTiwKKyAgICAgICAgICAgIGJ1ZlJldHMpOworICAgIG1SZXF1ZXN0QnVmZmVyU00uZW5kUmVxdWVzdEJ1ZmZlcigpOworICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworfQorCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYTNEZXZpY2U6OnJldHVyblN0cmVhbUJ1ZmZlcnMoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIHsKKyAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzIGRvZXMgbm90IHN1cHBvcnQgSEFMIGJ1ZmZlciBtYW5hZ2VybWVudCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGJ1ZiA6IGJ1ZmZlcnMpIHsKKyAgICAgICAgaWYgKGJ1Zi5idWZmZXJJZCA9PSBIYWxJbnRlcmZhY2U6OkJVRkZFUl9JRF9OT19CVUZGRVIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IHJldHVybiBhIGJ1ZmZlciB3aXRob3V0IGJ1ZmZlcklkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyX2hhbmRsZV90KiBidWZmZXI7CisgICAgICAgIHN0YXR1c190IHJlcyA9IG1JbnRlcmZhY2UtPnBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcihidWYuYnVmZmVySWQsICZidWZmZXIpOworCisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGZpbmQgaW4tZmxpZ2h0IGJ1ZmZlciAlIiBQUkl1NjQgIiBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWYuYnVmZmVySWQsIGJ1Zi5zdHJlYW1JZCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90IHN0cmVhbUJ1ZmZlcjsKKyAgICAgICAgc3RyZWFtQnVmZmVyLmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgc3RyZWFtQnVmZmVyLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICAgICAgc3RyZWFtQnVmZmVyLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgc3RyZWFtQnVmZmVyLnJlbGVhc2VfZmVuY2UgPSAtMTsKKworICAgICAgICBpZiAoYnVmLnJlbGVhc2VGZW5jZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBzdHJlYW1CdWZmZXIucmVsZWFzZV9mZW5jZSA9IC0xOworICAgICAgICB9IGVsc2UgaWYgKGJ1Zi5yZWxlYXNlRmVuY2UtPm51bUZkcyA9PSAxKSB7CisgICAgICAgICAgICBzdHJlYW1CdWZmZXIucmVsZWFzZV9mZW5jZSA9IGR1cChidWYucmVsZWFzZUZlbmNlLT5kYXRhWzBdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCByZWxlYXNlIGZlbmNlLCBmZCBjb3VudCBpcyAlZCwgbm90IDEiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1Zi5yZWxlYXNlRmVuY2UtPm51bUZkcyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChidWYuc3RyZWFtSWQpOworICAgICAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogT3V0cHV0IHN0cmVhbSBpZCAlZCBub3QgZm91bmQhIiwgX19GVU5DVElPTl9fLCBidWYuc3RyZWFtSWQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtQnVmZmVyLnN0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKKyAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycygmc3RyZWFtQnVmZmVyLCAvKnNpemUqLzEsIC8qdGltZXN0YW1wKi8gMCk7CisgICAgfQorICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworfQorCiBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYTNEZXZpY2U6OnByb2Nlc3NDYXB0dXJlUmVzdWx0XzNfNCgKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAogICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIHsKQEAgLTEwNjEsMjcgKzEzMzUsNTEgQEAKICAgICAgICAgYXV0byYgYkRzdCA9IG91dHB1dEJ1ZmZlcnNbaV07CiAgICAgICAgIGNvbnN0IFN0cmVhbUJ1ZmZlciAmYlNyYyA9IHJlc3VsdC5vdXRwdXRCdWZmZXJzW2ldOwogCi0gICAgICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShiU3JjLnN0cmVhbUlkKTsKLSAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoYlNyYy5zdHJlYW1JZCk7CisgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogQnVmZmVyICV6dTogSW52YWxpZCBvdXRwdXQgc3RyZWFtIGlkICVkIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsIGksIGJTcmMuc3RyZWFtSWQpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGJEc3Quc3RyZWFtID0gbU91dHB1dFN0cmVhbXMudmFsdWVBdChpZHgpLT5hc0hhbFN0cmVhbSgpOworICAgICAgICBiRHN0LnN0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKIAotICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlcjsKLSAgICAgICAgcmVzID0gbUludGVyZmFjZS0+cG9wSW5mbGlnaHRCdWZmZXIocmVzdWx0LmZyYW1lTnVtYmVyLCBiU3JjLnN0cmVhbUlkLCAmYnVmZmVyKTsKKyAgICAgICAgYm9vbCBub0J1ZmZlclJldHVybmVkID0gZmFsc2U7CisgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIHN1c3BpY2lvdXMgbW9zdCBvZiB0aGUgdGltZSBidXQgY2FuIGJlIGNvcnJlY3QgZHVyaW5nIGZsdXNoIHdoZXJlIEhBTAorICAgICAgICAgICAgLy8gaGFzIHRvIHJldHVybiBjYXB0dXJlIHJlc3VsdCBiZWZvcmUgYSBidWZmZXIgaXMgcmVxdWVzdGVkCisgICAgICAgICAgICBpZiAoYlNyYy5idWZmZXJJZCA9PSBIYWxJbnRlcmZhY2U6OkJVRkZFUl9JRF9OT19CVUZGRVIpIHsKKyAgICAgICAgICAgICAgICBpZiAoYlNyYy5zdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBCdWZmZXIgJXp1OiBObyBidWZmZXJJZCBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwgaSwgYlNyYy5zdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFN0aWxsIHByb2NlZWRzIHNvIG90aGVyIGJ1ZmZlcnMgY2FuIGJlIHJldHVybmVkCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vQnVmZmVyUmV0dXJuZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5vQnVmZmVyUmV0dXJuZWQpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBPSzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzID0gbUludGVyZmFjZS0+cG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKGJTcmMuYnVmZmVySWQsICZidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gbUludGVyZmFjZS0+cG9wSW5mbGlnaHRCdWZmZXIocmVzdWx0LmZyYW1lTnVtYmVyLCBiU3JjLnN0cmVhbUlkLCAmYnVmZmVyKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEJ1ZmZlciAlenU6IE5vIGluLWZsaWdodCBidWZmZXIgZm9yIHN0cmVhbSAlZCIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLCBpLCBiU3JjLnN0cmVhbUlkKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorCiAgICAgICAgIGJEc3QuYnVmZmVyID0gYnVmZmVyOwogICAgICAgICBiRHN0LnN0YXR1cyA9IG1hcEhpZGxCdWZmZXJTdGF0dXMoYlNyYy5zdGF0dXMpOwogICAgICAgICBiRHN0LmFjcXVpcmVfZmVuY2UgPSAtMTsKICAgICAgICAgaWYgKGJTcmMucmVsZWFzZUZlbmNlID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIGJEc3QucmVsZWFzZV9mZW5jZSA9IC0xOwogICAgICAgICB9IGVsc2UgaWYgKGJTcmMucmVsZWFzZUZlbmNlLT5udW1GZHMgPT0gMSkgeworICAgICAgICAgICAgaWYgKG5vQnVmZmVyUmV0dXJuZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGdvdCByZWxlYXNlRmVuY2Ugd2l0aG91dCBvdXRwdXQgYnVmZmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBiRHN0LnJlbGVhc2VfZmVuY2UgPSBkdXAoYlNyYy5yZWxlYXNlRmVuY2UtPmRhdGFbMF0pOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogSW52YWxpZCByZWxlYXNlIGZlbmNlIGZvciBidWZmZXIgJXp1LCBmZCBjb3VudCBpcyAlZCwgbm90IDEiLApAQCAtMTE1NywxMyArMTQ1NSwxMyBAQAogICAgICAgICAgICAgbS50eXBlID0gQ0FNRVJBM19NU0dfRVJST1I7CiAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZnJhbWVfbnVtYmVyID0gbXNnLm1zZy5lcnJvci5mcmFtZU51bWJlcjsKICAgICAgICAgICAgIGlmIChtc2cubXNnLmVycm9yLmVycm9yU3RyZWFtSWQgPj0gMCkgewotICAgICAgICAgICAgICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShtc2cubXNnLmVycm9yLmVycm9yU3RyZWFtSWQpOwotICAgICAgICAgICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogSW52YWxpZCBlcnJvciBzdHJlYW0gaWQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbS5tZXNzYWdlLmVycm9yLmZyYW1lX251bWJlciwgbXNnLm1zZy5lcnJvci5lcnJvclN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQobXNnLm1zZy5lcnJvci5lcnJvclN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogSW52YWxpZCBlcnJvciBzdHJlYW0gaWQgJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmZyYW1lX251bWJlciwgbXNnLm1zZy5lcnJvci5lcnJvclN0cmVhbUlkKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3Jfc3RyZWFtID0gbU91dHB1dFN0cmVhbXMudmFsdWVBdChpZHgpLT5hc0hhbFN0cmVhbSgpOworICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9zdHJlYW0gPSBzdHJlYW0tPmFzSGFsU3RyZWFtKCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9zdHJlYW0gPSBudWxscHRyOwogICAgICAgICAgICAgfQpAQCAtMTM0NCw2ICsxNjQyLDU2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpTdHJlYW1TZXQ6OmFkZCgKKyAgICAgICAgaW50IHN0cmVhbUlkLCBzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0pIHsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgYWRkIG51bGwgc3RyZWFtIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHJldHVybiBtRGF0YS5hZGQoc3RyZWFtSWQsIHN0cmVhbSk7Cit9CisKK3NzaXplX3QgQ2FtZXJhM0RldmljZTo6U3RyZWFtU2V0OjpyZW1vdmUoaW50IHN0cmVhbUlkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHJldHVybiBtRGF0YS5yZW1vdmVJdGVtKHN0cmVhbUlkKTsKK30KKworc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4KK0NhbWVyYTNEZXZpY2U6OlN0cmVhbVNldDo6Z2V0KGludCBzdHJlYW1JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBzc2l6ZV90IGlkeCA9IG1EYXRhLmluZGV4T2ZLZXkoc3RyZWFtSWQpOworICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBtRGF0YS5lZGl0VmFsdWVBdChpZHgpOworfQorCitzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPgorQ2FtZXJhM0RldmljZTo6U3RyZWFtU2V0OjpvcGVyYXRvcltdIChzaXplX3QgaW5kZXgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1EYXRhLmVkaXRWYWx1ZUF0KGluZGV4KTsKK30KKworc2l6ZV90IENhbWVyYTNEZXZpY2U6OlN0cmVhbVNldDo6c2l6ZSgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1EYXRhLnNpemUoKTsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpTdHJlYW1TZXQ6OmNsZWFyKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbURhdGEuY2xlYXIoKTsKK30KKworc3RkOjp2ZWN0b3I8aW50PiBDYW1lcmEzRGV2aWNlOjpTdHJlYW1TZXQ6OmdldFN0cmVhbUlkcygpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBzdHJlYW1JZHMobURhdGEuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EYXRhLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHN0cmVhbUlkc1tpXSA9IG1EYXRhLmtleUF0KGkpOworICAgIH0KKyAgICByZXR1cm4gc3RyZWFtSWRzOworfQorCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjcmVhdGVTdHJlYW0oc3A8U3VyZmFjZT4gY29uc3VtZXIsCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLApAQCAtMTQyMiwxOCArMTc3MCwyMCBAQAogCiAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKICAgICAgICAgc3NpemVfdCBibG9iQnVmZmVyU2l6ZTsKLSAgICAgICAgaWYgKGRhdGFTcGFjZSAhPSBIQUxfREFUQVNQQUNFX0RFUFRIKSB7Ci0gICAgICAgICAgICBibG9iQnVmZmVyU2l6ZSA9IGdldEpwZWdCdWZmZXJTaXplKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgaWYgKGJsb2JCdWZmZXJTaXplIDw9IDApIHsKLSAgICAgICAgICAgICAgICBTRVRfRVJSX0woIkludmFsaWQganBlZyBidWZmZXIgc2l6ZSAlemQiLCBibG9iQnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGRhdGFTcGFjZSA9PSBIQUxfREFUQVNQQUNFX0RFUFRIKSB7CiAgICAgICAgICAgICBibG9iQnVmZmVyU2l6ZSA9IGdldFBvaW50Q2xvdWRCdWZmZXJTaXplKCk7CiAgICAgICAgICAgICBpZiAoYmxvYkJ1ZmZlclNpemUgPD0gMCkgewogICAgICAgICAgICAgICAgIFNFVF9FUlJfTCgiSW52YWxpZCBwb2ludCBjbG91ZCBidWZmZXIgc2l6ZSAlemQiLCBibG9iQnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChkYXRhU3BhY2UgPT0gc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KEhBTF9EQVRBU1BBQ0VfSlBFR19BUFBfU0VHTUVOVFMpKSB7CisgICAgICAgICAgICBibG9iQnVmZmVyU2l6ZSA9IHdpZHRoICogaGVpZ2h0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmxvYkJ1ZmZlclNpemUgPSBnZXRKcGVnQnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGlmIChibG9iQnVmZmVyU2l6ZSA8PSAwKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUl9MKCJJbnZhbGlkIGpwZWcgYnVmZmVyIHNpemUgJXpkIiwgYmxvYkJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXJzWzBdLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGJsb2JCdWZmZXJTaXplLCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sCkBAIC0xNDUwLDcgKzE4MDAsOCBAQAogICAgIH0gZWxzZSBpZiAoaXNTaGFyZWQpIHsKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXJzLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgY29uc3VtZXJVc2FnZSwgZGF0YVNwYWNlLCByb3RhdGlvbiwKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzdHJlYW1TZXRJZCk7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgcGh5c2ljYWxDYW1lcmFJZCwgc3RyZWFtU2V0SWQsCisgICAgICAgICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIpOwogICAgIH0gZWxzZSBpZiAoY29uc3VtZXJzLnNpemUoKSA9PSAwICYmIGhhc0RlZmVycmVkQ29uc3VtZXIpIHsKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGNvbnN1bWVyVXNhZ2UsIGRhdGFTcGFjZSwgcm90YXRpb24sCkBAIC0xNTI3LDIwICsxODc4LDIwIEBACiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KGlkKTsKLSAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KGlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBpcyB1bmtub3duIiwgaWQpOwotICAgICAgICByZXR1cm4gaWR4OworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHN0cmVhbUluZm8tPndpZHRoICA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldFdpZHRoKCk7Ci0gICAgc3RyZWFtSW5mby0+aGVpZ2h0ID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0SGVpZ2h0KCk7Ci0gICAgc3RyZWFtSW5mby0+Zm9ybWF0ID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0Rm9ybWF0KCk7Ci0gICAgc3RyZWFtSW5mby0+ZGF0YVNwYWNlID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0RGF0YVNwYWNlKCk7Ci0gICAgc3RyZWFtSW5mby0+Zm9ybWF0T3ZlcnJpZGRlbiA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmlzRm9ybWF0T3ZlcnJpZGRlbigpOwotICAgIHN0cmVhbUluZm8tPm9yaWdpbmFsRm9ybWF0ID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0T3JpZ2luYWxGb3JtYXQoKTsKLSAgICBzdHJlYW1JbmZvLT5kYXRhU3BhY2VPdmVycmlkZGVuID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+aXNEYXRhU3BhY2VPdmVycmlkZGVuKCk7Ci0gICAgc3RyZWFtSW5mby0+b3JpZ2luYWxEYXRhU3BhY2UgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRPcmlnaW5hbERhdGFTcGFjZSgpOworICAgIHN0cmVhbUluZm8tPndpZHRoICA9IHN0cmVhbS0+Z2V0V2lkdGgoKTsKKyAgICBzdHJlYW1JbmZvLT5oZWlnaHQgPSBzdHJlYW0tPmdldEhlaWdodCgpOworICAgIHN0cmVhbUluZm8tPmZvcm1hdCA9IHN0cmVhbS0+Z2V0Rm9ybWF0KCk7CisgICAgc3RyZWFtSW5mby0+ZGF0YVNwYWNlID0gc3RyZWFtLT5nZXREYXRhU3BhY2UoKTsKKyAgICBzdHJlYW1JbmZvLT5mb3JtYXRPdmVycmlkZGVuID0gc3RyZWFtLT5pc0Zvcm1hdE92ZXJyaWRkZW4oKTsKKyAgICBzdHJlYW1JbmZvLT5vcmlnaW5hbEZvcm1hdCA9IHN0cmVhbS0+Z2V0T3JpZ2luYWxGb3JtYXQoKTsKKyAgICBzdHJlYW1JbmZvLT5kYXRhU3BhY2VPdmVycmlkZGVuID0gc3RyZWFtLT5pc0RhdGFTcGFjZU92ZXJyaWRkZW4oKTsKKyAgICBzdHJlYW1JbmZvLT5vcmlnaW5hbERhdGFTcGFjZSA9IHN0cmVhbS0+Z2V0T3JpZ2luYWxEYXRhU3BhY2UoKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE1NjcsMTQgKzE5MTgsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoaWQpOwotICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKLSAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBkb2VzIG5vdCBleGlzdCIsCi0gICAgICAgICAgICAgICAgaWQpOworICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChpZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLCBpZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotCi0gICAgcmV0dXJuIG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KGlkeCktPnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOworICAgIHJldHVybiBzdHJlYW0tPnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpkZWxldGVTdHJlYW0oaW50IGlkKSB7CkBAIC0xNTk5LDIxICsxOTQ4LDIxIEBACiAgICAgfQogCiAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gZGVsZXRlZFN0cmVhbTsKLSAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoaWQpOworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChpZCk7CiAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBOVUxMICYmIGlkID09IG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSkgewogICAgICAgICBkZWxldGVkU3RyZWFtID0gbUlucHV0U3RyZWFtOwogICAgICAgICBtSW5wdXRTdHJlYW0uY2xlYXIoKTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBkb2VzIG5vdCBleGlzdCIsIGlkKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBEZWxldGUgb3V0cHV0IHN0cmVhbSBvciB0aGUgb3V0cHV0IHBhcnQgb2YgYSBiaS1kaXJlY3Rpb25hbCBzdHJlYW0uCi0gICAgaWYgKG91dHB1dFN0cmVhbUlkeCAhPSBOQU1FX05PVF9GT1VORCkgewotICAgICAgICBkZWxldGVkU3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQob3V0cHV0U3RyZWFtSWR4KTsKLSAgICAgICAgbU91dHB1dFN0cmVhbXMucmVtb3ZlSXRlbShpZCk7CisgICAgaWYgKHN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgIGRlbGV0ZWRTdHJlYW0gPSBzdHJlYW07CisgICAgICAgIG1PdXRwdXRTdHJlYW1zLnJlbW92ZShpZCk7CiAgICAgfQogCiAgICAgLy8gRnJlZSB1cCB0aGUgc3RyZWFtIGVuZHBvaW50IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkgc29tZSBvdGhlciBzdHJlYW0KQEAgLTE2OTYsNyArMjA0NSw3IEBACiAKICAgICBpZiAodGVtcGxhdGVJZCA8PSAwIHx8IHRlbXBsYXRlSWQgPj0gQ0FNRVJBM19URU1QTEFURV9DT1VOVCkgewogICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVXaXRoSW5mb0xvZyhDYW1lcmFTZXJ2aWNlOjpTTl9FVkVOVF9MT0dfSUQsICIyNjg2NjExMCIsCi0gICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpLCBudWxscHRyLCAwKTsKKyAgICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpLCBudWxscHRyLCAwKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTE4NTQsNiArMjIwMywxNCBAQAogCiAgICAgbVN0YXR1c1dhaXRlcnMrKzsKIAorICAgIGlmICghYWN0aXZlICYmIG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIGF1dG8gc3RyZWFtSWRzID0gbU91dHB1dFN0cmVhbXMuZ2V0U3RyZWFtSWRzKCk7CisgICAgICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19BQ1RJVkUpIHsKKyAgICAgICAgICAgIG1SZXF1ZXN0VGhyZWFkLT5zaWduYWxQaXBlbGluZURyYWluKHN0cmVhbUlkcyk7CisgICAgICAgIH0KKyAgICAgICAgbVJlcXVlc3RCdWZmZXJTTS5vbldhaXRVbnRpbElkbGUoKTsKKyAgICB9CisKICAgICBib29sIHN0YXRlU2VlbiA9IGZhbHNlOwogICAgIGRvIHsKICAgICAgICAgaWYgKGFjdGl2ZSA9PSAobVN0YXR1cyA9PSBTVEFUVVNfQUNUSVZFKSkgewpAQCAtMjAxMyw2ICsyMzcwLDEzIEBACiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgICAgICAvLyBiLzExNjUxNDEwNiAiZGlzY29ubmVjdCgpIiBjYW4gZ2V0IGNhbGxlZCB0d2ljZSBmb3IgdGhlIHNhbWUgZGV2aWNlLiBUaGUKKyAgICAgICAgLy8gY2FtZXJhIGRldmljZSB3aWxsIG5vdCBiZSBpbml0aWFsaXplZCBkdXJpbmcgdGhlIHNlY29uZCBydW4uCisgICAgICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19VTklOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKwogICAgICAgICBtUmVxdWVzdFRocmVhZC0+Y2xlYXIoLypvdXQqL2ZyYW1lTnVtYmVyKTsKICAgICB9CiAKQEAgLTIwMjksMTUgKzIzOTMsMTIgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAotICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbTsKLSAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOwotICAgIGlmIChvdXRwdXRTdHJlYW1JZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0Iiwgc3RyZWFtSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KG91dHB1dFN0cmVhbUlkeCk7Ci0KICAgICBpZiAoc3RyZWFtLT5pc1VucHJlcGFyYWJsZSgpIHx8IHN0cmVhbS0+aGFzT3V0c3RhbmRpbmdCdWZmZXJzKCkgKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgaGFzIGFscmVhZHkgYmVlbiBhIHJlcXVlc3QgdGFyZ2V0Iiwgc3RyZWFtSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMjA1NywxNSArMjQxOCwxMiBAQAogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCi0gICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtOwotICAgIHNzaXplX3Qgb3V0cHV0U3RyZWFtSWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7Ci0gICAgaWYgKG91dHB1dFN0cmVhbUlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLCBzdHJlYW1JZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQob3V0cHV0U3RyZWFtSWR4KTsKLQogICAgIGlmIChzdHJlYW0tPmhhc091dHN0YW5kaW5nQnVmZmVycygpIHx8IG1SZXF1ZXN0VGhyZWFkLT5pc1N0cmVhbVBlbmRpbmcoc3RyZWFtKSkgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGlzIGEgdGFyZ2V0IG9mIGEgaW4tcHJvZ3Jlc3MgcmVxdWVzdCIsIHN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTIwODEsMTQgKzI0MzksMTEgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAotICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbTsKLSAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOwotICAgIGlmIChvdXRwdXRTdHJlYW1JZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0Iiwgc3RyZWFtSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLQotICAgIHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KG91dHB1dFN0cmVhbUlkeCk7CiAgICAgc3RyZWFtLT5hZGRCdWZmZXJMaXN0ZW5lcihsaXN0ZW5lcik7CiAKICAgICByZXR1cm4gT0s7CkBAIC0yMTQ3LDEyICsyNTAyLDExIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbUlkKTsKLSAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBpcyB1bmtub3duIiwgc3RyZWFtSWQpOwotICAgICAgICByZXR1cm4gaWR4OworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtc1tpZHhdOwogICAgIHN0YXR1c190IHJlcyA9IHN0cmVhbS0+c2V0Q29uc3VtZXJzKGNvbnN1bWVycyk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIHNldCBjb25zdW1lciBmYWlsZWQgKGVycm9yICVkICVzKSAiLCBzdHJlYW1JZCwgcmVzLCBzdHJlcnJvcigtcmVzKSk7CkBAIC0yMTk3LDEwICsyNTUxLDEwIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOwotICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGlzIHVua25vd24iLCBzdHJlYW1JZCk7Ci0gICAgICAgIHJldHVybiBpZHg7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IHJlbW92ZWRTdXJmYWNlSWRzKSB7CkBAIC0yMjEwLDcgKzI1NjQsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXNbaWR4XTsKICAgICBzdGF0dXNfdCByZXMgPSBzdHJlYW0tPnVwZGF0ZVN0cmVhbShuZXdTdXJmYWNlcywgb3V0cHV0SW5mbywgcmVtb3ZlZFN1cmZhY2VJZHMsIG91dHB1dE1hcCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGZhaWxlZCB0byB1cGRhdGUgc3RyZWFtIChlcnJvciAlZCAlcykgIiwKQEAgLTIyMjksMTMgKzI1ODIsMTEgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAotICAgIGludCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbUlkKTsKLSAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQgaXMgbm90IGZvdW5kLiIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLQotICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KGlkeCk7CiAgICAgcmV0dXJuIHN0cmVhbS0+ZHJvcEJ1ZmZlcnMoZHJvcHBpbmcpOwogfQogCkBAIC0yMjg5LDE1ICsyNjQwLDEyIEBACiAgICAgfQogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJlYW1zLmNvdW50OyBpKyspIHsKLSAgICAgICAgaW50IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtcy5kYXRhLmkzMltpXSk7Ci0gICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbXMuZGF0YS5pMzJbaV0pOworICAgICAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIENMT0dFKCJSZXF1ZXN0IHJlZmVyZW5jZXMgdW5rbm93biBzdHJlYW0gJWQiLAotICAgICAgICAgICAgICAgICAgICBzdHJlYW1zLmRhdGEudThbaV0pOworICAgICAgICAgICAgICAgICAgICBzdHJlYW1zLmRhdGEuaTMyW2ldKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQoaWR4KTsKLQogICAgICAgICAvLyBJdCBpcyBpbGxlZ2FsIHRvIGluY2x1ZGUgYSBkZWZlcnJlZCBjb25zdW1lciBvdXRwdXQgc3RyZWFtIGludG8gYSByZXF1ZXN0CiAgICAgICAgIGF1dG8gaXRlciA9IHN1cmZhY2VNYXAuZmluZChzdHJlYW1zLmRhdGEuaTMyW2ldKTsKICAgICAgICAgaWYgKGl0ZXIgIT0gc3VyZmFjZU1hcC5lbmQoKSkgewpAQCAtMjMwOSw3ICsyNjU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgbmV3UmVxdWVzdC0+bU91dHB1dFN1cmZhY2VzW2ldID0gc3VyZmFjZXM7CisgICAgICAgICAgICBuZXdSZXF1ZXN0LT5tT3V0cHV0U3VyZmFjZXNbc3RyZWFtcy5kYXRhLmkzMltpXV0gPSBzdXJmYWNlczsKICAgICAgICAgfQogCiAgICAgICAgIC8vIExhenkgY29tcGxldGlvbiBvZiBzdHJlYW0gY29uZmlndXJhdGlvbiAoYWxsb2NhdGlvbi9yZWdpc3RyYXRpb24pCkBAIC0yMzU4LDcgKzI3MDYsNyBAQAogICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQoaSk7CisgICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zW2ldOwogICAgICAgICBpZiAob3V0cHV0U3RyZWFtLT5pc0NvbmZpZ3VyaW5nKCkpIHsKICAgICAgICAgICAgIHJlcyA9IG91dHB1dFN0cmVhbS0+Y2FuY2VsQ29uZmlndXJhdGlvbigpOwogICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMjQ5Myw3ICsyODQxLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKm91dHB1dFN0cmVhbTsKLSAgICAgICAgb3V0cHV0U3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQoaSktPnN0YXJ0Q29uZmlndXJhdGlvbigpOworICAgICAgICBvdXRwdXRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtc1tpXS0+c3RhcnRDb25maWd1cmF0aW9uKCk7CiAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0gPT0gTlVMTCkgewogICAgICAgICAgICAgQ0xPR0UoIkNhbid0IHN0YXJ0IG91dHB1dCBzdHJlYW0gY29uZmlndXJhdGlvbiIpOwogICAgICAgICAgICAgY2FuY2VsU3RyZWFtc0NvbmZpZ3VyYXRpb25Mb2NrZWQoKTsKQEAgLTI1MDEsMTIgKzI4NDksMTkgQEAKICAgICAgICAgfQogICAgICAgICBzdHJlYW1zLmFkZChvdXRwdXRTdHJlYW0pOwogCi0gICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPmZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IgJiYKLSAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0tPmRhdGFfc3BhY2UgPT0gSEFMX0RBVEFTUEFDRV9WMF9KRklGKSB7CisgICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPmZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKICAgICAgICAgICAgIHNpemVfdCBrID0gaSArICgobUlucHV0U3RyZWFtICE9IG51bGxwdHIpID8gMSA6IDApOyAvLyBJbnB1dCBzdHJlYW0gaWYgcHJlc2VudCBzaG91bGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHdheXMgb2NjdXB5IHRoZSBpbml0aWFsIGVudHJ5LgotICAgICAgICAgICAgYnVmZmVyU2l6ZXNba10gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCi0gICAgICAgICAgICAgICAgICAgIGdldEpwZWdCdWZmZXJTaXplKG91dHB1dFN0cmVhbS0+d2lkdGgsIG91dHB1dFN0cmVhbS0+aGVpZ2h0KSk7CisgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtLT5kYXRhX3NwYWNlID09IEhBTF9EQVRBU1BBQ0VfVjBfSkZJRikgeworICAgICAgICAgICAgICAgIGJ1ZmZlclNpemVzW2tdID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SnBlZ0J1ZmZlclNpemUob3V0cHV0U3RyZWFtLT53aWR0aCwgb3V0cHV0U3RyZWFtLT5oZWlnaHQpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0cHV0U3RyZWFtLT5kYXRhX3NwYWNlID09CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihIQUxfREFUQVNQQUNFX0pQRUdfQVBQX1NFR01FTlRTKSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlclNpemVzW2tdID0gb3V0cHV0U3RyZWFtLT53aWR0aCAqIG91dHB1dFN0cmVhbS0+aGVpZ2h0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXM6IEJsb2IgZGF0YVNwYWNlICVkIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBvdXRwdXRTdHJlYW0tPmRhdGFfc3BhY2UpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0yNTUxLDggKzI5MDYsNyBAQAogICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0KLSAgICAgICAgICAgIG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KGkpOworICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtc1tpXTsKICAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+aXNDb25maWd1cmluZygpICYmICFvdXRwdXRTdHJlYW0tPmlzQ29uc3VtZXJDb25maWd1cmF0aW9uRGVmZXJyZWQoKSkgewogICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5maW5pc2hDb25maWd1cmF0aW9uKCk7CiAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC0yNjE1LDYgKzI5NjksMTAgQEAKICAgICAgICAgcmV0dXJuIHJjOwogICAgIH0KIAorICAgIGlmIChtRHVtbXlTdHJlYW1JZCA9PSBOT19TVFJFQU0pIHsKKyAgICAgICAgbVJlcXVlc3RCdWZmZXJTTS5vblN0cmVhbXNDb25maWd1cmVkKCk7CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yNjU5LDE1ICszMDE3LDEyIEBACiAgICAgLy8gT2ssIGhhdmUgYSBkdW1teSBzdHJlYW0gYW5kIHRoZXJlJ3MgYXQgbGVhc3Qgb25lIG90aGVyIG91dHB1dCBzdHJlYW0sCiAgICAgLy8gc28gcmVtb3ZlIHRoZSBkdW1teQogCi0gICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gZGVsZXRlZFN0cmVhbTsKLSAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkobUR1bW15U3RyZWFtSWQpOwotICAgIGlmIChvdXRwdXRTdHJlYW1JZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBkZWxldGVkU3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KG1EdW1teVN0cmVhbUlkKTsKKyAgICBpZiAoZGVsZXRlZFN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIFNFVF9FUlJfTCgiRHVtbXkgc3RyZWFtICVkIGRvZXMgbm90IGFwcGVhciB0byBleGlzdCIsIG1EdW1teVN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLQotICAgIGRlbGV0ZWRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChvdXRwdXRTdHJlYW1JZHgpOwotICAgIG1PdXRwdXRTdHJlYW1zLnJlbW92ZUl0ZW1zQXQob3V0cHV0U3RyZWFtSWR4KTsKKyAgICBtT3V0cHV0U3RyZWFtcy5yZW1vdmUobUR1bW15U3RyZWFtSWQpOwogCiAgICAgLy8gRnJlZSB1cCB0aGUgc3RyZWFtIGVuZHBvaW50IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkgc29tZSBvdGhlciBzdHJlYW0KICAgICByZXMgPSBkZWxldGVkU3RyZWFtLT5kaXNjb25uZWN0KCk7CkBAIC0yNzQxLDE4ICszMDk2LDIxIEBACiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpyZWdpc3RlckluRmxpZ2h0KHVpbnQzMl90IGZyYW1lTnVtYmVyLAogICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0LAogICAgICAgICBib29sIGhhc0FwcENhbGxiYWNrLCBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24sCi0gICAgICAgIHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkcykgeworICAgICAgICBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZHMsIGJvb2wgaXNTdGlsbENhcHR1cmUsCisgICAgICAgIGJvb2wgaXNac2xDYXB0dXJlLCBjb25zdCBTdXJmYWNlTWFwJiBvdXRwdXRTdXJmYWNlcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUluRmxpZ2h0TG9jayk7CiAKICAgICBzc2l6ZV90IHJlczsKICAgICByZXMgPSBtSW5GbGlnaHRNYXAuYWRkKGZyYW1lTnVtYmVyLCBJbkZsaWdodFJlcXVlc3QobnVtQnVmZmVycywgcmVzdWx0RXh0cmFzLCBoYXNJbnB1dCwKLSAgICAgICAgICAgIGhhc0FwcENhbGxiYWNrLCBtYXhFeHBlY3RlZER1cmF0aW9uLCBwaHlzaWNhbENhbWVyYUlkcykpOworICAgICAgICAgICAgaGFzQXBwQ2FsbGJhY2ssIG1heEV4cGVjdGVkRHVyYXRpb24sIHBoeXNpY2FsQ2FtZXJhSWRzLCBpc1N0aWxsQ2FwdHVyZSwgaXNac2xDYXB0dXJlLAorICAgICAgICAgICAgb3V0cHV0U3VyZmFjZXMpKTsKICAgICBpZiAocmVzIDwgMCkgcmV0dXJuIHJlczsKIAogICAgIGlmIChtSW5GbGlnaHRNYXAuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgLy8gaG9sZCBtTG9jayB0byBwcmV2ZW50IHJhY2Ugd2l0aCBkaXNjb25uZWN0Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgLy8gSG9sZCBhIHNlcGFyYXRlIGRlZGljYXRlZCB0cmFja2VyIGxvY2sgdG8gcHJldmVudCByYWNlIHdpdGggZGlzY29ubmVjdCBhbmQgYWxzbworICAgICAgICAvLyBhdm9pZCBhIGRlYWRsb2NrIGR1cmluZyByZXByb2Nlc3MgcmVxdWVzdHMuCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1UcmFja2VyTG9jayk7CiAgICAgICAgIGlmIChtU3RhdHVzVHJhY2tlciAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICBtU3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudEFjdGl2ZShtSW5GbGlnaHRTdGF0dXNJZCk7CiAgICAgICAgIH0KQEAgLTI3NjQsMTcgKzMxMjIsNjggQEAKIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpyZXR1cm5PdXRwdXRCdWZmZXJzKAogICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqb3V0cHV0QnVmZmVycywgc2l6ZV90IG51bUJ1ZmZlcnMsCi0gICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7CisgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzLAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzICZpblJlc3VsdEV4dHJhcykgeworCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1CdWZmZXJzOyBpKyspCiAgICAgewotICAgICAgICBDYW1lcmEzU3RyZWFtICpzdHJlYW0gPSBDYW1lcmEzU3RyZWFtOjpjYXN0KG91dHB1dEJ1ZmZlcnNbaV0uc3RyZWFtKTsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gc3RyZWFtLT5yZXR1cm5CdWZmZXIob3V0cHV0QnVmZmVyc1tpXSwgdGltZXN0YW1wKTsKKyAgICAgICAgaWYgKG91dHB1dEJ1ZmZlcnNbaV0uYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICAvLyBXaXRoIEhBTCBidWZmZXIgbWFuYWdlbWVudCBBUEksIEhBTCBzb21ldGltZXMgd2lsbCBoYXZlIHRvIHJldHVybiBidWZmZXJzIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBoYXMgbm90IGdvdCBhIG91dHB1dCBidWZmZXIgaGFuZGxlIGZpbGxlZCB5ZXQuIFRoaXMgaXMgdGhvdWdoIGlsbGVnYWwgaWYgSEFMCisgICAgICAgICAgICAgICAgLy8gYnVmZmVyIG1hbmFnZW1lbnQgQVBJIGlzIG5vdCBiZWluZyB1c2VkLgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IHJldHVybiBhIG51bGwgYnVmZmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIENhbWVyYTNTdHJlYW1JbnRlcmZhY2UgKnN0cmVhbSA9IENhbWVyYTNTdHJlYW06OmNhc3Qob3V0cHV0QnVmZmVyc1tpXS5zdHJlYW0pOworICAgICAgICBpbnQgc3RyZWFtSWQgPSBzdHJlYW0tPmdldElkKCk7CisgICAgICAgIGNvbnN0IGF1dG8mIGl0ID0gb3V0cHV0U3VyZmFjZXMuZmluZChzdHJlYW1JZCk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgICAgICBpZiAoaXQgIT0gb3V0cHV0U3VyZmFjZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHN0cmVhbS0+cmV0dXJuQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzW2ldLCB0aW1lc3RhbXAsIHRpbWVzdGFtcEluY3JlYXNpbmcsIGl0LT5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgIGluUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IHN0cmVhbS0+cmV0dXJuQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzW2ldLCB0aW1lc3RhbXAsIHRpbWVzdGFtcEluY3JlYXNpbmcsIHN0ZDo6dmVjdG9yPHNpemVfdD4gKCksCisgICAgICAgICAgICAgICAgICAgIGluUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIE5vdGU6IHN0cmVhbSBtYXkgYmUgZGVhbGxvY2F0ZWQgYXQgdGhpcyBwb2ludCwgaWYgdGhpcyBidWZmZXIgd2FzCiAgICAgICAgIC8vIHRoZSBsYXN0IHJlZmVyZW5jZSB0byBpdC4KICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIkNhbid0IHJldHVybiBidWZmZXIgdG8gaXRzIHN0cmVhbTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIH0KKworICAgICAgICAvLyBMb25nIHByb2Nlc3NpbmcgY29uc3VtZXJzIGNhbiBjYXVzZSByZXR1cm5CdWZmZXIgdGltZW91dCBmb3Igc2hhcmVkIHN0cmVhbQorICAgICAgICAvLyBJZiB0aGF0IGhhcHBlbnMsIGNhbmNlbCB0aGUgYnVmZmVyIGFuZCBzZW5kIGEgYnVmZmVyIGVycm9yIHRvIGNsaWVudAorICAgICAgICBpZiAoaXQgIT0gb3V0cHV0U3VyZmFjZXMuZW5kKCkgJiYgcmVzID09IFRJTUVEX09VVCAmJgorICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnNbaV0uc3RhdHVzID09IENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSykgeworICAgICAgICAgICAgLy8gY2FuY2VsIHRoZSBidWZmZXIKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90IHNiID0gb3V0cHV0QnVmZmVyc1tpXTsKKyAgICAgICAgICAgIHNiLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICAgICAgICAgIHN0cmVhbS0+cmV0dXJuQnVmZmVyKHNiLCAvKnRpbWVzdGFtcCovMCwgdGltZXN0YW1wSW5jcmVhc2luZywgc3RkOjp2ZWN0b3I8c2l6ZV90PiAoKSwKKyAgICAgICAgICAgICAgICAgICAgaW5SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworCisgICAgICAgICAgICAvLyBub3RpZnkgY2xpZW50IGJ1ZmZlciBlcnJvcgorICAgICAgICAgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1PdXRwdXRMb2NrKTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyBleHRyYXMgPSBpblJlc3VsdEV4dHJhczsKKyAgICAgICAgICAgICAgICBleHRyYXMuZXJyb3JTdHJlYW1JZCA9IHN0cmVhbUlkOworICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnlFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtMjc4NSw4ICszMTk0LDEwIEBACiAKICAgICAvLyBJbmRpY2F0ZSBpZGxlIGluRmxpZ2h0TWFwIHRvIHRoZSBzdGF0dXMgdHJhY2tlcgogICAgIGlmIChtSW5GbGlnaHRNYXAuc2l6ZSgpID09IDApIHsKLSAgICAgICAgLy8gaG9sZCBtTG9jayB0byBwcmV2ZW50IHJhY2Ugd2l0aCBkaXNjb25uZWN0Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgbVJlcXVlc3RCdWZmZXJTTS5vbkluZmxpZ2h0TWFwRW1wdHkoKTsKKyAgICAgICAgLy8gSG9sZCBhIHNlcGFyYXRlIGRlZGljYXRlZCB0cmFja2VyIGxvY2sgdG8gcHJldmVudCByYWNlIHdpdGggZGlzY29ubmVjdCBhbmQgYWxzbworICAgICAgICAvLyBhdm9pZCBhIGRlYWRsb2NrIGR1cmluZyByZXByb2Nlc3MgcmVxdWVzdHMuCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1UcmFja2VyTG9jayk7CiAgICAgICAgIGlmIChtU3RhdHVzVHJhY2tlciAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICBtU3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudElkbGUobUluRmxpZ2h0U3RhdHVzSWQsIEZlbmNlOjpOT19GRU5DRSk7CiAgICAgICAgIH0KQEAgLTI4MTEsNiArMzIyMiwxMCBAQAogICAgIGlmIChyZXF1ZXN0Lm51bUJ1ZmZlcnNMZWZ0ID09IDAgJiYKICAgICAgICAgICAgIChyZXF1ZXN0LnNraXBSZXN1bHRNZXRhZGF0YSB8fAogICAgICAgICAgICAgKHJlcXVlc3QuaGF2ZVJlc3VsdE1ldGFkYXRhICYmIHNodXR0ZXJUaW1lc3RhbXAgIT0gMCkpKSB7CisgICAgICAgIGlmIChyZXF1ZXN0LnN0aWxsQ2FwdHVyZSkgeworICAgICAgICAgICAgQVRSQUNFX0FTWU5DX0VORCgic3RpbGwgY2FwdHVyZSIsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgfQorCiAgICAgICAgIEFUUkFDRV9BU1lOQ19FTkQoImZyYW1lIGNhcHR1cmUiLCBmcmFtZU51bWJlcik7CiAKICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIC0gaWYgc2Vuc29yIHRpbWVzdGFtcCBtYXRjaGVzIHNodXR0ZXIgdGltZXN0YW1wIGluIHRoZQpAQCAtMjgyNyw3ICszMjQyLDggQEAKICAgICAgICAgYXNzZXJ0KHJlcXVlc3QucmVxdWVzdFN0YXR1cyAhPSBPSyB8fAogICAgICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCkgPT0gMCk7CiAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMocmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5hcnJheSgpLAotICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIDApOworICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIDAsIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwKKyAgICAgICAgICAgIHJlcXVlc3Qub3V0cHV0U3VyZmFjZXMsIHJlcXVlc3QucmVzdWx0RXh0cmFzKTsKIAogICAgICAgICByZW1vdmVJbkZsaWdodE1hcEVudHJ5TG9ja2VkKGlkeCk7CiAgICAgICAgIEFMT0dWVigiJXM6IHJlbW92ZWQgZnJhbWUgJWQgZnJvbSBJbkZsaWdodE1hcCIsIF9fRlVOQ1RJT05fXywgZnJhbWVOdW1iZXIpOwpAQCAtMjg1MSw3ICszMjY3LDkgQEAKICAgICAgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwgbUluRmxpZ2h0TWFwLnNpemUoKTsgaWR4KyspIHsKICAgICAgICAgICAgIGNvbnN0IEluRmxpZ2h0UmVxdWVzdCAmcmVxdWVzdCA9IG1JbkZsaWdodE1hcC52YWx1ZUF0KGlkeCk7CiAgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXJyYXkoKSwKLSAgICAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgMCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIDAsCisgICAgICAgICAgICAgICAgLyp0aW1lc3RhbXBJbmNyZWFzaW5nKi90cnVlLCByZXF1ZXN0Lm91dHB1dFN1cmZhY2VzLAorICAgICAgICAgICAgICAgIHJlcXVlc3QucmVzdWx0RXh0cmFzKTsKICAgICAgICAgfQogICAgICAgICBtSW5GbGlnaHRNYXAuY2xlYXIoKTsKICAgICAgICAgbUV4cGVjdGVkSW5mbGlnaHREdXJhdGlvbiA9IDA7CkBAIC0yODYxLDcgKzMyNzksMTUgQEAKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+IGluZmxpZ2h0S2V5czsKICAgICBtSW50ZXJmYWNlLT5nZXRJbmZsaWdodEJ1ZmZlcktleXMoJmluZmxpZ2h0S2V5cyk7CiAKLSAgICBpbnQzMl90IGlucHV0U3RyZWFtSWQgPSAobUlucHV0U3RyZWFtICE9IG51bGxwdHIpID8gbUlucHV0U3RyZWFtLT5nZXRJZCgpIDogLTE7CisgICAgLy8gSW5mbGlnaHQgYnVmZmVycyBmb3IgSEFMIGJ1ZmZlciBtYW5hZ2VyCisgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IGluZmxpZ2h0UmVxdWVzdEJ1ZmZlcktleXM7CisgICAgbUludGVyZmFjZS0+Z2V0SW5mbGlnaHRSZXF1ZXN0QnVmZmVyS2V5cygmaW5mbGlnaHRSZXF1ZXN0QnVmZmVyS2V5cyk7CisKKyAgICAvLyAoc3RyZWFtSWQsIGZyYW1lTnVtYmVyLCBidWZmZXJfaGFuZGxlX3QqKSB0dXBsZSBmb3IgYWxsIGluZmxpZ2h0IGJ1ZmZlcnMuCisgICAgLy8gZnJhbWVOdW1iZXIgd2lsbCBiZSAtMSBmb3IgYnVmZmVycyBmcm9tIEhBTCBidWZmZXIgbWFuYWdlcgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8aW50MzJfdCwgaW50MzJfdCwgYnVmZmVyX2hhbmRsZV90Kj4+IGluZmxpZ2h0QnVmZmVyczsKKyAgICBpbmZsaWdodEJ1ZmZlcnMucmVzZXJ2ZShpbmZsaWdodEtleXMuc2l6ZSgpICsgaW5mbGlnaHRSZXF1ZXN0QnVmZmVyS2V5cy5zaXplKCkpOworCiAgICAgZm9yIChhdXRvJiBwYWlyIDogaW5mbGlnaHRLZXlzKSB7CiAgICAgICAgIGludDMyX3QgZnJhbWVOdW1iZXIgPSBwYWlyLmZpcnN0OwogICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gcGFpci5zZWNvbmQ7CkBAIC0yODcyLDYgKzMyOTgsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBmcmFtZU51bWJlciwgc3RyZWFtSWQpOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKyAgICAgICAgaW5mbGlnaHRCdWZmZXJzLnB1c2hfYmFjayhzdGQ6Om1ha2VfdHVwbGUoc3RyZWFtSWQsIGZyYW1lTnVtYmVyLCBidWZmZXIpKTsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8mIGJ1ZmZlcklkIDogaW5mbGlnaHRSZXF1ZXN0QnVmZmVyS2V5cykgeworICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gLTE7CisgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gbUludGVyZmFjZS0+cG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKGJ1ZmZlcklkLCAmYnVmZmVyLCAmc3RyZWFtSWQpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBmaW5kIGluLWZsaWdodCBidWZmZXIgJSIgUFJJdTY0LCBfX0ZVTkNUSU9OX18sIGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGluZmxpZ2h0QnVmZmVycy5wdXNoX2JhY2soc3RkOjptYWtlX3R1cGxlKHN0cmVhbUlkLCAvKmZyYW1lTnVtYmVyKi8tMSwgYnVmZmVyKSk7CisgICAgfQorCisgICAgaW50MzJfdCBpbnB1dFN0cmVhbUlkID0gKG1JbnB1dFN0cmVhbSAhPSBudWxscHRyKSA/IG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSA6IC0xOworICAgIGZvciAoYXV0byYgdHVwbGUgOiBpbmZsaWdodEJ1ZmZlcnMpIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBzdGQ6OmdldDwwPih0dXBsZSk7CisgICAgICAgIGludDMyX3QgZnJhbWVOdW1iZXIgPSBzdGQ6OmdldDwxPih0dXBsZSk7CisgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogYnVmZmVyID0gc3RkOjpnZXQ8Mj4odHVwbGUpOwogCiAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90IHN0cmVhbUJ1ZmZlcjsKICAgICAgICAgc3RyZWFtQnVmZmVyLmJ1ZmZlciA9IGJ1ZmZlcjsKQEAgLTI4ODksNyArMzMzNSw4IEBACiAgICAgICAgICAgICAgICAgc3RyZWFtQnVmZmVyLnN0cmVhbSA9IGhhbFN0cmVhbTsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGhhbFN0cmVhbS0+c3RyZWFtX3R5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9PVVRQVVQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBzdHJlYW0tPnJldHVybkJ1ZmZlcihzdHJlYW1CdWZmZXIsIC8qdGltZXN0YW1wKi8gMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBzdHJlYW0tPnJldHVybkJ1ZmZlcihzdHJlYW1CdWZmZXIsIC8qdGltZXN0YW1wKi8gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aW1lc3RhbXBJbmNyZWFzaW5nKi90cnVlLCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICgpLCBmcmFtZU51bWJlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCByZXR1cm4gb3V0cHV0IGJ1ZmZlciBmb3IgZnJhbWUgJWQgdG8iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzdHJlYW0gJWQ6ICVzICglZCkiLCAgX19GVU5DVElPTl9fLApAQCAtMjkyNiwxMiArMzM3MywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCBzdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOwotICAgICAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCIlczogT3V0cHV0IHN0cmVhbSBpZCAlZCBub3QgZm91bmQhIiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJlYW1CdWZmZXIuc3RyZWFtID0gbU91dHB1dFN0cmVhbXMudmFsdWVBdChpZHgpLT5hc0hhbFN0cmVhbSgpOworICAgICAgICAgICAgc3RyZWFtQnVmZmVyLnN0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKICAgICAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMoJnN0cmVhbUJ1ZmZlciwgLypzaXplKi8xLCAvKnRpbWVzdGFtcCovIDApOwogICAgICAgICB9CiAgICAgfQpAQCAtMjk3OSw2ICszNDI2LDEzIEBACiAgICAgY2FwdHVyZVJlc3VsdC5tUmVzdWx0RXh0cmFzID0gcmVzdWx0RXh0cmFzOwogICAgIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhID0gcGFydGlhbFJlc3VsdDsKIAorICAgIC8vIEZpeCB1cCByZXN1bHQgbWV0YWRhdGEgZm9yIG1vbm9jaHJvbWUgY2FtZXJhLgorICAgIHN0YXR1c190IHJlcyA9IGZpeHVwTW9ub2Nocm9tZVRhZ3MobURldmljZUluZm8sIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIFNFVF9FUlIoIkZhaWxlZCB0byBvdmVycmlkZSByZXN1bHQgbWV0YWRhdGE6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGluc2VydFJlc3VsdExvY2tlZCgmY2FwdHVyZVJlc3VsdCwgZnJhbWVOdW1iZXIpOwogfQogCkBAIC0zMDUwLDYgKzM1MDQsMjEgQEAKICAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgc3RyZXJyb3IocmVzKSwgcmVzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICAvLyBGaXggdXAgcmVzdWx0IG1ldGFkYXRhIGZvciBtb25vY2hyb21lIGNhbWVyYS4KKyAgICByZXMgPSBmaXh1cE1vbm9jaHJvbWVUYWdzKG1EZXZpY2VJbmZvLCBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBTRVRfRVJSKCJGYWlsZWQgdG8gb3ZlcnJpZGUgcmVzdWx0IG1ldGFkYXRhOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvJiBwaHlzaWNhbE1ldGFkYXRhIDogY2FwdHVyZVJlc3VsdC5tUGh5c2ljYWxNZXRhZGF0YXMpIHsKKyAgICAgICAgU3RyaW5nOCBjYW1lcmFJZDgocGh5c2ljYWxNZXRhZGF0YS5tUGh5c2ljYWxDYW1lcmFJZCk7CisgICAgICAgIHJlcyA9IGZpeHVwTW9ub2Nocm9tZVRhZ3MobVBoeXNpY2FsRGV2aWNlSW5mb01hcC5hdChjYW1lcmFJZDguY19zdHIoKSksCisgICAgICAgICAgICAgICAgcGh5c2ljYWxNZXRhZGF0YS5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIFNFVF9FUlIoIkZhaWxlZCB0byBvdmVycmlkZSByZXN1bHQgbWV0YWRhdGE6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KIAogICAgIG1UYWdNb25pdG9yLm1vbml0b3JNZXRhZGF0YShUYWdNb25pdG9yOjpSRVNVTFQsCiAgICAgICAgICAgICBmcmFtZU51bWJlciwgdGltZXN0YW1wLmRhdGEuaTY0WzBdLCBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSk7CkBAIC0zMjA3LDggKzM2NzYsMTAgQEAKICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXBwZW5kQXJyYXkocmVzdWx0LT5vdXRwdXRfYnVmZmVycywKICAgICAgICAgICAgICAgICByZXN1bHQtPm51bV9vdXRwdXRfYnVmZmVycyk7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcgPSAhKHJlcXVlc3QuenNsQ2FwdHVyZSB8fCByZXF1ZXN0Lmhhc0lucHV0QnVmZmVyKTsKICAgICAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMocmVzdWx0LT5vdXRwdXRfYnVmZmVycywKLSAgICAgICAgICAgICAgICByZXN1bHQtPm51bV9vdXRwdXRfYnVmZmVycywgc2h1dHRlclRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT5udW1fb3V0cHV0X2J1ZmZlcnMsIHNodXR0ZXJUaW1lc3RhbXAsIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgICAgICAgICAgcmVxdWVzdC5vdXRwdXRTdXJmYWNlcywgcmVxdWVzdC5yZXN1bHRFeHRyYXMpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHJlc3VsdC0+cmVzdWx0ICE9IE5VTEwgJiYgIWlzUGFydGlhbFJlc3VsdCkgewpAQCAtMzIyMSw3ICszNjkyLDcgQEAKICAgICAgICAgICAgIGlmIChzaHV0dGVyVGltZXN0YW1wID09IDApIHsKICAgICAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdNZXRhZGF0YSA9IHJlc3VsdC0+cmVzdWx0OwogICAgICAgICAgICAgICAgIHJlcXVlc3QuY29sbGVjdGVkUGFydGlhbFJlc3VsdCA9IGNvbGxlY3RlZFBhcnRpYWxSZXN1bHQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5oYXNDYWxsYmFjaykgeworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0Lmhhc0NhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7CiAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSByZXN1bHQtPnJlc3VsdDsKICAgICAgICAgICAgICAgICBzZW5kQ2FwdHVyZVJlc3VsdChtZXRhZGF0YSwgcmVxdWVzdC5yZXN1bHRFeHRyYXMsCkBAIC0zMzQxLDYgKzM4MTIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBtaXNzaW5nIHJlc3VsdCBjaGVjayB3aGV0aGVyIHRoZSBidWZmZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm5lZC4gSWYgdGhleSByZXR1cm5lZCwgdGhlbiByZW1vdmUgaW5mbGlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgY2FsbCB0aGlzIGZvciBFUlJPUl9DQU1FUkFfUkVRVUVTVCBhcyB3ZWxsPworICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgb3RoZXJ3aXNlIHdlIGFyZSBkZXBlbmRpbmcgb24gSEFMIHRvIHNlbmQgdGhlIGJ1ZmZlcnMgYmFjayBhZnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgY2FsbGluZyBub3RpZnlFcnJvci4gTm90IHN1cmUgaWYgdGhhdCdzIGluIHRoZSBzcGVjLgogICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlSW5GbGlnaHRSZXF1ZXN0SWZSZWFkeUxvY2tlZChpZHgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTM0MTQsOCArMzg4OCwxMCBAQAogICAgICAgICAgICAgICAgICAgICByLmNvbGxlY3RlZFBhcnRpYWxSZXN1bHQsIG1zZy5mcmFtZV9udW1iZXIsCiAgICAgICAgICAgICAgICAgICAgIHIuaGFzSW5wdXRCdWZmZXIsIHIucGh5c2ljYWxNZXRhZGF0YXMpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gIShyLnpzbENhcHR1cmUgfHwgci5oYXNJbnB1dEJ1ZmZlcik7CiAgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHIucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXJyYXkoKSwKLSAgICAgICAgICAgICAgICByLnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgci5zaHV0dGVyVGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgci5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIHIuc2h1dHRlclRpbWVzdGFtcCwgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgICAgICAgICAgICAgci5vdXRwdXRTdXJmYWNlcywgci5yZXN1bHRFeHRyYXMpOwogICAgICAgICAgICAgci5wZW5kaW5nT3V0cHV0QnVmZmVycy5jbGVhcigpOwogCiAgICAgICAgICAgICByZW1vdmVJbkZsaWdodFJlcXVlc3RJZlJlYWR5TG9ja2VkKGlkeCk7CkBAIC0zNDUxLDExICszOTI3LDE4IEBACiAKIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKAogICAgICAgICAgICAgc3A8SUNhbWVyYURldmljZVNlc3Npb24+ICZzZXNzaW9uLAotICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSkgOgorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSwKKyAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlcikgOgogICAgICAgICBtSGlkbFNlc3Npb24oc2Vzc2lvbiksCi0gICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShxdWV1ZSkgeworICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUocXVldWUpLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcih1c2VIYWxCdWZNYW5hZ2VyKSwKKyAgICAgICAgbUlzUmVjb25maWd1cmF0aW9uUXVlcnlTdXBwb3J0ZWQodHJ1ZSkgewogICAgIC8vIENoZWNrIHdpdGggaGFyZHdhcmUgc2VydmljZSBtYW5hZ2VyIGlmIHdlIGNhbiBkb3duY2FzdCB0aGVzZSBpbnRlcmZhY2VzCiAgICAgLy8gU29tZXdoYXQgZXhwZW5zaXZlLCBzbyBjYWNoZSB0aGUgcmVzdWx0cyBhdCBzdGFydHVwCisgICAgYXV0byBjYXN0UmVzdWx0XzNfNSA9IGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7CisgICAgaWYgKGNhc3RSZXN1bHRfM181LmlzT2soKSkgeworICAgICAgICBtSGlkbFNlc3Npb25fM181ID0gY2FzdFJlc3VsdF8zXzU7CisgICAgfQogICAgIGF1dG8gY2FzdFJlc3VsdF8zXzQgPSBkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOwogICAgIGlmIChjYXN0UmVzdWx0XzNfNC5pc09rKCkpIHsKICAgICAgICAgbUhpZGxTZXNzaW9uXzNfNCA9IGNhc3RSZXN1bHRfM180OwpAQCAtMzQ2NiwxNyArMzk0OSwxOSBAQAogICAgIH0KIH0KIAotQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpIYWxJbnRlcmZhY2UoKSB7fQorQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpIYWxJbnRlcmZhY2UoKSA6IG1Vc2VIYWxCdWZNYW5hZ2VyKGZhbHNlKSB7fQogCiBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OkhhbEludGVyZmFjZShjb25zdCBIYWxJbnRlcmZhY2UmIG90aGVyKSA6CiAgICAgICAgIG1IaWRsU2Vzc2lvbihvdGhlci5tSGlkbFNlc3Npb24pLAotICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUob3RoZXIubVJlcXVlc3RNZXRhZGF0YVF1ZXVlKSB7fQorICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUob3RoZXIubVJlcXVlc3RNZXRhZGF0YVF1ZXVlKSwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIob3RoZXIubVVzZUhhbEJ1Zk1hbmFnZXIpIHt9CiAKIGJvb2wgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjp2YWxpZCgpIHsKICAgICByZXR1cm4gKG1IaWRsU2Vzc2lvbiAhPSBudWxscHRyKTsKIH0KIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmNsZWFyKCkgeworICAgIG1IaWRsU2Vzc2lvbl8zXzUuY2xlYXIoKTsKICAgICBtSGlkbFNlc3Npb25fM180LmNsZWFyKCk7CiAgICAgbUhpZGxTZXNzaW9uXzNfMy5jbGVhcigpOwogICAgIG1IaWRsU2Vzc2lvbi5jbGVhcigpOwpAQCAtMzU1Myw2ICs0MDM4LDUyIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorYm9vbCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQoQ2FtZXJhTWV0YWRhdGEmIG9sZFNlc3Npb25QYXJhbXMsCisgICAgICAgIENhbWVyYU1ldGFkYXRhJiBuZXdTZXNzaW9uUGFyYW1zKSB7CisgICAgLy8gV2UgZG8gcmVjb25maWd1cmF0aW9uIGJ5IGRlZmF1bHQ7CisgICAgYm9vbCByZXQgPSB0cnVlOworICAgIGlmICgobUhpZGxTZXNzaW9uXzNfNSAhPSBudWxscHRyKSAmJiBtSXNSZWNvbmZpZ3VyYXRpb25RdWVyeVN1cHBvcnRlZCkgeworICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4gb2xkUGFyYW1zLCBuZXdQYXJhbXM7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90KiBvbGRTZXNzaW9NZXRhID0gY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KAorICAgICAgICAgICAgICAgIG9sZFNlc3Npb25QYXJhbXMuZ2V0QW5kTG9jaygpKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QqIG5ld1Nlc3Npb01ldGEgPSBjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oCisgICAgICAgICAgICAgICAgbmV3U2Vzc2lvblBhcmFtcy5nZXRBbmRMb2NrKCkpOworICAgICAgICBvbGRQYXJhbXMuc2V0VG9FeHRlcm5hbChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihvbGRTZXNzaW9NZXRhKSwKKyAgICAgICAgICAgICAgICBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUob2xkU2Vzc2lvTWV0YSkpOworICAgICAgICBuZXdQYXJhbXMuc2V0VG9FeHRlcm5hbChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihuZXdTZXNzaW9NZXRhKSwKKyAgICAgICAgICAgICAgICBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUobmV3U2Vzc2lvTWV0YSkpOworICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1cyBjYWxsU3RhdHVzOworICAgICAgICBib29sIHJlcXVpcmVkOworICAgICAgICBhdXRvIGhpZGxDYiA9IFsmY2FsbFN0YXR1cywgJnJlcXVpcmVkXSAoaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXMgcywKKyAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVkRmxhZykgeworICAgICAgICAgICAgY2FsbFN0YXR1cyA9IHM7CisgICAgICAgICAgICByZXF1aXJlZCA9IHJlcXVpcmVkRmxhZzsKKyAgICAgICAgfTsKKyAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM181LT5pc1JlY29uZmlndXJhdGlvblJlcXVpcmVkKG9sZFBhcmFtcywgbmV3UGFyYW1zLCBoaWRsQ2IpOworICAgICAgICBvbGRTZXNzaW9uUGFyYW1zLnVubG9jayhvbGRTZXNzaW9NZXRhKTsKKyAgICAgICAgbmV3U2Vzc2lvblBhcmFtcy51bmxvY2sobmV3U2Vzc2lvTWV0YSk7CisgICAgICAgIGlmIChlcnIuaXNPaygpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGNhbGxTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6U3RhdHVzOjpPSzoKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmVxdWlyZWQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXM6Ok1FVEhPRF9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgICAgICAgICBtSXNSZWNvbmZpZ3VyYXRpb25RdWVyeVN1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IFJlY29uZmlndXJhdGlvbiBxdWVyeSBmYWlsZWQ6ICVkIiwgX19GVU5DVElPTl9fLCBjYWxsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBiaW5kZXIgZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmNvbmZpZ3VyZVN0cmVhbXMoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNlc3Npb25QYXJhbXMsCiAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb24gKmNvbmZpZywgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBidWZmZXJTaXplcykgewogICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OmNvbmZpZ3VyZVN0cmVhbXMiKTsKQEAgLTM2MzIsMjYgKzQxNjMsNDkgQEAKIAogICAgIC8vIEludm9rZSBjb25maWd1cmVTdHJlYW1zCiAgICAgZGV2aWNlOjpWM18zOjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjsKKyAgICBkZXZpY2U6OlYzXzQ6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uM180OwogICAgIGNvbW1vbjo6VjFfMDo6U3RhdHVzIHN0YXR1czsKIAotICAgIC8vIFNlZSBpZiB3ZSBoYXZlIHYzLjQgb3IgdjMuMyBIQUwKLSAgICBpZiAobUhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7Ci0gICAgICAgIC8vIFdlIGRvOyB1c2UgdjMuNCBmb3IgdGhlIGNhbGwKLSAgICAgICAgQUxPR1YoIiVzOiB2My40IGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb24zXzQ7Ci0gICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNC0+Y29uZmlndXJlU3RyZWFtc18zXzQocmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNCwKLSAgICAgICAgICAgIFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uM180XQorICAgIGF1dG8gY29uZmlnU3RyZWFtMzRDYiA9IFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uM180XQogICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiYgaGFsQ29uZmlndXJhdGlvbikgewogICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbjNfNCA9IGhhbENvbmZpZ3VyYXRpb247CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgIH0pOwotICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgICAgIH07CisKKyAgICBhdXRvIHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzQgPSBbJmZpbmFsQ29uZmlndXJhdGlvbiwgJmZpbmFsQ29uZmlndXJhdGlvbjNfNF0KKyAgICAgICAgICAgIChoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+JiBlcnIpIC0+IHN0YXR1c190IHsKKyAgICAgICAgICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0gPSBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtc1tpXS52M18zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9OworCisgICAgLy8gU2VlIGlmIHdlIGhhdmUgdjMuNCBvciB2My4zIEhBTAorICAgIGlmIChtSGlkbFNlc3Npb25fM181ICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIiVzOiB2My41IGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGRldmljZTo6VjNfNTo6U3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181OworICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181LnYzXzQgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180OworICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181LnN0cmVhbUNvbmZpZ0NvdW50ZXIgPSBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIrKzsKKyAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM181LT5jb25maWd1cmVTdHJlYW1zXzNfNSgKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181LCBjb25maWdTdHJlYW0zNENiKTsKKyAgICAgICAgcmVzID0gcG9zdHByb2NDb25maWdTdHJlYW0zNChlcnIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCkpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXSA9IGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zW2ldLnYzXzM7CisgICAgfSBlbHNlIGlmIChtSGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gV2UgZG87IHVzZSB2My40IGZvciB0aGUgY2FsbAorICAgICAgICBBTE9HVigiJXM6IHYzLjQgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZGV2aWNlOjpWM180OjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjNfNDsKKyAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM180LT5jb25maWd1cmVTdHJlYW1zXzNfNCgKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180LCBjb25maWdTdHJlYW0zNENiKTsKKyAgICAgICAgcmVzID0gcG9zdHByb2NDb25maWdTdHJlYW0zNChlcnIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtSGlkbFNlc3Npb25fM18zICE9IG51bGxwdHIpIHsKICAgICAgICAgLy8gV2UgZG87IHVzZSB2My4zIGZvciB0aGUgY2FsbApAQCAtMzc2MywxNCArNDMxNywxNCBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjp3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0LAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjp3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0LAogICAgICAgICAvKm91dCovZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVxdWVzdCogY2FwdHVyZVJlcXVlc3QsCiAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiogaGFuZGxlc0NyZWF0ZWQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmIChjYXB0dXJlUmVxdWVzdCA9PSBudWxscHRyIHx8IGhhbmRsZXNDcmVhdGVkID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBjYXB0dXJlUmVxdWVzdCAoJXApIGFuZCBoYW5kbGVzQ3JlYXRlZCAoJXApIG11c3Qgbm90IGJlIG51bGwiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FwdHVyZVJlcXVlc3QsIGhhbmRsZXNDcmVhdGVkKTsKLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciA9IHJlcXVlc3QtPmZyYW1lX251bWJlcjsKQEAgLTM4MTEsMjYgKzQzNjUsNDAgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpzcmMgPSByZXF1ZXN0LT5vdXRwdXRfYnVmZmVycyArIGk7CiAgICAgICAgICAgICBTdHJlYW1CdWZmZXIgJmRzdCA9IGNhcHR1cmVSZXF1ZXN0LT5vdXRwdXRCdWZmZXJzW2ldOwogICAgICAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IENhbWVyYTNTdHJlYW06OmNhc3Qoc3JjLT5zdHJlYW0pLT5nZXRJZCgpOwotICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90IGJ1ZiA9ICooc3JjLT5idWZmZXIpOwotICAgICAgICAgICAgYXV0byBwYWlyID0gZ2V0QnVmZmVySWQoYnVmLCBzdHJlYW1JZCk7Ci0gICAgICAgICAgICBib29sIGlzTmV3QnVmZmVyID0gcGFpci5maXJzdDsKLSAgICAgICAgICAgIGRzdC5zdHJlYW1JZCA9IHN0cmVhbUlkOwotICAgICAgICAgICAgZHN0LmJ1ZmZlcklkID0gcGFpci5zZWNvbmQ7Ci0gICAgICAgICAgICBkc3QuYnVmZmVyID0gaXNOZXdCdWZmZXIgPyBidWYgOiBudWxscHRyOwotICAgICAgICAgICAgZHN0LnN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6T0s7Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7Ci0gICAgICAgICAgICBpZiAoc3JjLT5hY3F1aXJlX2ZlbmNlICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKLSAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UtPmRhdGFbMF0gPSBzcmMtPmFjcXVpcmVfZmVuY2U7Ci0gICAgICAgICAgICAgICAgaGFuZGxlc0NyZWF0ZWQtPnB1c2hfYmFjayhhY3F1aXJlRmVuY2UpOworICAgICAgICAgICAgaWYgKHNyYy0+YnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgYnVmID0gKihzcmMtPmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgYXV0byBwYWlyID0gZ2V0QnVmZmVySWQoYnVmLCBzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgYm9vbCBpc05ld0J1ZmZlciA9IHBhaXIuZmlyc3Q7CisgICAgICAgICAgICAgICAgZHN0LmJ1ZmZlcklkID0gcGFpci5zZWNvbmQ7CisgICAgICAgICAgICAgICAgZHN0LmJ1ZmZlciA9IGlzTmV3QnVmZmVyID8gYnVmIDogbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgaWYgKHNyYy0+YWNxdWlyZV9mZW5jZSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOworICAgICAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UtPmRhdGFbMF0gPSBzcmMtPmFjcXVpcmVfZmVuY2U7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXNDcmVhdGVkLT5wdXNoX2JhY2soYWNxdWlyZUZlbmNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHN0LmFjcXVpcmVGZW5jZSA9IGFjcXVpcmVGZW5jZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICAvLyBIQUwgYnVmZmVyIG1hbmFnZW1lbnQgcGF0aAorICAgICAgICAgICAgICAgIGRzdC5idWZmZXJJZCA9IEJVRkZFUl9JRF9OT19CVUZGRVI7CisgICAgICAgICAgICAgICAgZHN0LmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgZHN0LmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IHNlbmQgYSBudWxsIGJ1ZmZlciBpbiBjYXB0dXJlIHJlcXVlc3QhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZHN0LmFjcXVpcmVGZW5jZSA9IGFjcXVpcmVGZW5jZTsKKyAgICAgICAgICAgIGRzdC5zdHJlYW1JZCA9IHN0cmVhbUlkOworICAgICAgICAgICAgZHN0LnN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6T0s7CiAgICAgICAgICAgICBkc3QucmVsZWFzZUZlbmNlID0gbnVsbHB0cjsKIAotICAgICAgICAgICAgcHVzaEluZmxpZ2h0QnVmZmVyTG9ja2VkKGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciwgc3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgICAgIHNyYy0+YnVmZmVyLCBzcmMtPmFjcXVpcmVfZmVuY2UpOworICAgICAgICAgICAgLy8gT3V0cHV0IGJ1ZmZlcnMgYXJlIGVtcHR5IHdoZW4gdXNpbmcgSEFMIGJ1ZmZlciBtYW5hZ2VyCisgICAgICAgICAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgcHVzaEluZmxpZ2h0QnVmZmVyTG9ja2VkKGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciwgc3RyZWFtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPmJ1ZmZlciwgc3JjLT5hY3F1aXJlX2ZlbmNlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6cHJvY2Vzc0JhdGNoQ2FwdHVyZVJlcXVlc3RzKApAQCAtMzg1NCwxMiArNDQyMiwxNyBAQAogICAgIH0KICAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiBoYW5kbGVzQ3JlYXRlZDsKIAorICAgIHN0YXR1c190IHJlcyA9IE9LOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyBpKyspIHsKICAgICAgICAgaWYgKGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICB3cmFwQXNIaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNfM180W2ldLnYzXzIsCisgICAgICAgICAgICByZXMgPSB3cmFwQXNIaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNfM180W2ldLnYzXzIsCiAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8maGFuZGxlc0NyZWF0ZWQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzW2ldLCAvKm91dCovJmhhbmRsZXNDcmVhdGVkKTsKKyAgICAgICAgICAgIHJlcyA9IHdyYXBBc0hpZGxSZXF1ZXN0KHJlcXVlc3RzW2ldLAorICAgICAgICAgICAgICAgICAgICAvKm91dCovJmNhcHR1cmVSZXF1ZXN0c1tpXSwgLypvdXQqLyZoYW5kbGVzQ3JlYXRlZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzk0MSwxOCArNDUxNCwxNyBAQAogICAgIH0KIAogICAgIGhhcmR3YXJlOjpkZXRhaWxzOjpyZXR1cm5fc3RhdHVzIGVycjsKKyAgICBhdXRvIHJlc3VsdENhbGxiYWNrID0KKyAgICAgICAgWyZzdGF0dXMsICZudW1SZXF1ZXN0UHJvY2Vzc2VkXSAoYXV0byBzLCB1aW50MzJfdCBuKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAqbnVtUmVxdWVzdFByb2Nlc3NlZCA9IG47CisgICAgICAgIH07CiAgICAgaWYgKGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7CiAgICAgICAgIGVyciA9IGhpZGxTZXNzaW9uXzNfNC0+cHJvY2Vzc0NhcHR1cmVSZXF1ZXN0XzNfNChjYXB0dXJlUmVxdWVzdHNfM180LCBjYWNoZXNUb1JlbW92ZSwKLSAgICAgICAgICAgIFsmc3RhdHVzLCAmbnVtUmVxdWVzdFByb2Nlc3NlZF0gKGF1dG8gcywgdWludDMyX3QgbikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgKm51bVJlcXVlc3RQcm9jZXNzZWQgPSBuOwotICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDYWxsYmFjayk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZXJyID0gbUhpZGxTZXNzaW9uLT5wcm9jZXNzQ2FwdHVyZVJlcXVlc3QoY2FwdHVyZVJlcXVlc3RzLCBjYWNoZXNUb1JlbW92ZSwKLSAgICAgICAgICAgIFsmc3RhdHVzLCAmbnVtUmVxdWVzdFByb2Nlc3NlZF0gKGF1dG8gcywgdWludDMyX3QgbikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgKm51bVJlcXVlc3RQcm9jZXNzZWQgPSBuOwotICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrKTsKICAgICB9CiAgICAgaWYgKCFlcnIuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKQEAgLTQwMjMsNiArNDU5NSwyMCBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3ZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpzaWduYWxQaXBlbGluZURyYWluKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHN0cmVhbUlkcykgeworICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OnNpZ25hbFBpcGVsaW5lRHJhaW4iKTsKKyAgICBpZiAoIXZhbGlkKCkgfHwgbUhpZGxTZXNzaW9uXzNfNSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgb24gaW52YWxpZCBjYW1lcmEhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNS0+c2lnbmFsU3RyZWFtRmx1c2goc3RyZWFtSWRzLCBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIgLSAxKTsKKyAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCiB2b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6Z2V0SW5mbGlnaHRCdWZmZXJLZXlzKAogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+KiBvdXQpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW5mbGlnaHRMb2NrKTsKQEAgLTQwMzcsNiArNDYyMywxNyBAQAogICAgIHJldHVybjsKIH0KIAordm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmdldEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcktleXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90Piogb3V0KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlcXVlc3RlZEJ1ZmZlcnNMb2NrKTsKKyAgICBvdXQtPmNsZWFyKCk7CisgICAgb3V0LT5yZXNlcnZlKG1SZXF1ZXN0ZWRCdWZmZXJzLnNpemUoKSk7CisgICAgZm9yIChhdXRvJiBwYWlyIDogbVJlcXVlc3RlZEJ1ZmZlcnMpIHsKKyAgICAgICAgb3V0LT5wdXNoX2JhY2socGFpci5maXJzdCk7CisgICAgfQorICAgIHJldHVybjsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpwdXNoSW5mbGlnaHRCdWZmZXJMb2NrZWQoCiAgICAgICAgIGludDMyX3QgZnJhbWVOdW1iZXIsIGludDMyX3Qgc3RyZWFtSWQsIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyLCBpbnQgYWNxdWlyZUZlbmNlKSB7CiAgICAgdWludDY0X3Qga2V5ID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGZyYW1lTnVtYmVyKSA8PCAzMiB8IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzdHJlYW1JZCk7CkBAIC00MDYzLDYgKzQ2NjAsNDIgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6cHVzaEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcigKKyAgICAgICAgdWludDY0X3QgYnVmZmVySWQsIGJ1ZmZlcl9oYW5kbGVfdCogYnVmLCBpbnQzMl90IHN0cmVhbUlkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlcXVlc3RlZEJ1ZmZlcnNMb2NrKTsKKyAgICBhdXRvIHBhaXIgPSBtUmVxdWVzdGVkQnVmZmVycy5pbnNlcnQoe2J1ZmZlcklkLCB7c3RyZWFtSWQsIGJ1Zn19KTsKKyAgICBpZiAoIXBhaXIuc2Vjb25kKSB7CisgICAgICAgIEFMT0dFKCIlczogYnVmSWQgJSIgUFJJdTY0ICIgaXMgYWxyZWFkeSBpbmZsaWdodCEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVySWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIEZpbmQgYW5kIHBvcCBhIGJ1ZmZlcl9oYW5kbGVfdCBiYXNlZCBvbiBidWZmZXJJZAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpwb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIoCisgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcklkLAorICAgICAgICAvKm91dCovIGJ1ZmZlcl9oYW5kbGVfdCoqIGJ1ZmZlciwKKyAgICAgICAgLypvcHRpb25hbCBvdXQqLyBpbnQzMl90KiBzdHJlYW1JZCkgeworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGJ1ZmZlciAoJXApIG11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18sIGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZXF1ZXN0ZWRCdWZmZXJzTG9jayk7CisgICAgYXV0byBpdCA9IG1SZXF1ZXN0ZWRCdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgIGlmIChpdCA9PSBtUmVxdWVzdGVkQnVmZmVycy5lbmQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IGJ1ZklkICUiIFBSSXU2NCAiIGlzIG5vdCBpbmZsaWdodCEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVySWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAqYnVmZmVyID0gaXQtPnNlY29uZC5zZWNvbmQ7CisgICAgaWYgKHN0cmVhbUlkICE9IG51bGxwdHIpIHsKKyAgICAgICAgKnN0cmVhbUlkID0gaXQtPnNlY29uZC5maXJzdDsKKyAgICB9CisgICAgbVJlcXVlc3RlZEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgIHJldHVybiBPSzsKK30KKwogc3RkOjpwYWlyPGJvb2wsIHVpbnQ2NF90PiBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmdldEJ1ZmZlcklkKAogICAgICAgICBjb25zdCBidWZmZXJfaGFuZGxlX3QmIGJ1ZiwgaW50IHN0cmVhbUlkKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlcklkTWFwTG9jayk7CkBAIC00MTExLDcgKzQ3NDQsOCBAQAogCiBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpSZXF1ZXN0VGhyZWFkKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwKICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKLSAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBpbnRlcmZhY2UsIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cykgOgorICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwgY29uc3QgVmVjdG9yPGludDMyX3Q+JiBzZXNzaW9uUGFyYW1LZXlzLAorICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIpIDoKICAgICAgICAgVGhyZWFkKC8qY2FuQ2FsbEphdmEqL2ZhbHNlKSwKICAgICAgICAgbVBhcmVudChwYXJlbnQpLAogICAgICAgICBtU3RhdHVzVHJhY2tlcihzdGF0dXNUcmFja2VyKSwKQEAgLTQxMjEsNiArNDc1NSw3IEBACiAgICAgICAgIG1SZWNvbmZpZ3VyZWQoZmFsc2UpLAogICAgICAgICBtRG9QYXVzZShmYWxzZSksCiAgICAgICAgIG1QYXVzZWQodHJ1ZSksCisgICAgICAgIG1Ob3RpZnlQaXBlbGluZURyYWluKGZhbHNlKSwKICAgICAgICAgbUZyYW1lTnVtYmVyKDApLAogICAgICAgICBtTGF0ZXN0UmVxdWVzdElkKE5BTUVfTk9UX0ZPVU5EKSwKICAgICAgICAgbUN1cnJlbnRBZlRyaWdnZXJJZCgwKSwKQEAgLTQxMzEsNyArNDc2Niw4IEBACiAgICAgICAgIG1Db25zdHJhaW5lZE1vZGUoZmFsc2UpLAogICAgICAgICBtUmVxdWVzdExhdGVuY3koa1JlcXVlc3RMYXRlbmN5QmluU2l6ZSksCiAgICAgICAgIG1TZXNzaW9uUGFyYW1LZXlzKHNlc3Npb25QYXJhbUtleXMpLAotICAgICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtcyhzZXNzaW9uUGFyYW1LZXlzLnNpemUoKSkgeworICAgICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtcyhzZXNzaW9uUGFyYW1LZXlzLnNpemUoKSksCisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKHVzZUhhbEJ1Zk1hbmFnZXIpIHsKICAgICBtU3RhdHVzSWQgPSBzdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQoKTsKIH0KIApAQCAtNDU4Miw5ICs1MjE4LDEwIEBACiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBib29sIHVwZGF0ZXNEZXRlY3RlZCA9IGZhbHNlOwogCisgICAgQ2FtZXJhTWV0YWRhdGEgdXBkYXRlZFBhcmFtcyhtTGF0ZXN0U2Vzc2lvblBhcmFtcyk7CiAgICAgZm9yIChhdXRvIHRhZyA6IG1TZXNzaW9uUGFyYW1LZXlzKSB7CiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBlbnRyeSA9IHNldHRpbmdzLmZpbmQodGFnKTsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGxhc3RFbnRyeSA9IG1MYXRlc3RTZXNzaW9uUGFyYW1zLmZpbmQodGFnKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGxhc3RFbnRyeSA9IHVwZGF0ZWRQYXJhbXMuZmluZCh0YWcpOwogCiAgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKICAgICAgICAgICAgIGJvb2wgaXNEaWZmZXJlbnQgPSBmYWxzZTsKQEAgLTQ2MTMsMTcgKzUyNTAsMjYgQEAKICAgICAgICAgICAgICAgICBpZiAoIXNraXBIRlJUYXJnZXRGUFNVcGRhdGUodGFnLCBlbnRyeSwgbGFzdEVudHJ5KSkgewogICAgICAgICAgICAgICAgICAgICB1cGRhdGVzRGV0ZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtcy51cGRhdGUoZW50cnkpOworICAgICAgICAgICAgICAgIHVwZGF0ZWRQYXJhbXMudXBkYXRlKGVudHJ5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChsYXN0RW50cnkuY291bnQgPiAwKSB7CiAgICAgICAgICAgICAvLyBWYWx1ZSBoYXMgYmVlbiByZW1vdmVkCiAgICAgICAgICAgICBBTE9HVigiJXM6IFNlc3Npb24gcGFyYW1ldGVyIHRhZyBpZCAlZCByZW1vdmVkIiwgX19GVU5DVElPTl9fLCB0YWcpOwotICAgICAgICAgICAgbUxhdGVzdFNlc3Npb25QYXJhbXMuZXJhc2UodGFnKTsKKyAgICAgICAgICAgIHVwZGF0ZWRQYXJhbXMuZXJhc2UodGFnKTsKICAgICAgICAgICAgIHVwZGF0ZXNEZXRlY3RlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gdXBkYXRlc0RldGVjdGVkOworICAgIGJvb2wgcmVjb25maWd1cmVSZXF1aXJlZDsKKyAgICBpZiAodXBkYXRlc0RldGVjdGVkKSB7CisgICAgICAgIHJlY29uZmlndXJlUmVxdWlyZWQgPSBtSW50ZXJmYWNlLT5pc1JlY29uZmlndXJhdGlvblJlcXVpcmVkKG1MYXRlc3RTZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgICAgIHVwZGF0ZWRQYXJhbXMpOworICAgICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtcyA9IHVwZGF0ZWRQYXJhbXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVjb25maWd1cmVSZXF1aXJlZCA9IGZhbHNlOworICAgIH0KKworICAgIHJldHVybiByZWNvbmZpZ3VyZVJlcXVpcmVkOwogfQogCiBib29sIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnRocmVhZExvb3AoKSB7CkBAIC00NzM2LDYgKzUzODIsMTEgQEAKICAgICBBTE9HVlYoIiVzOiAlZDogc3VibWl0dGluZyAlenUgcmVxdWVzdHMgaW4gYSBiYXRjaC4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAogICAgICAgICAgICAgbU5leHRSZXF1ZXN0cy5zaXplKCkpOwogCisgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCAhPSBudWxscHRyKSB7CisgICAgICAgIHBhcmVudC0+bVJlcXVlc3RCdWZmZXJTTS5vblN1Ym1pdHRpbmdSZXF1ZXN0KCk7CisgICAgfQorCiAgICAgYm9vbCBzdWJtaXRSZXF1ZXN0U3VjY2VzcyA9IGZhbHNlOwogICAgIG5zZWNzX3QgdFJlcXVlc3RTdGFydCA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKICAgICBpZiAobUludGVyZmFjZS0+c3VwcG9ydEJhdGNoUmVxdWVzdCgpKSB7CkBAIC00NzYyLDYgKzU0MTMsNyBAQAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6cHJlcGFyZUhhbFJlcXVlc3RzKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKKyAgICBib29sIGJhdGNoZWRSZXF1ZXN0ID0gbU5leHRSZXF1ZXN0c1swXS5jYXB0dXJlUmVxdWVzdC0+bUJhdGNoU2l6ZSA+IDE7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTmV4dFJlcXVlc3RzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGF1dG8mIG5leHRSZXF1ZXN0ID0gbU5leHRSZXF1ZXN0cy5lZGl0SXRlbUF0KGkpOwogICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gY2FwdHVyZVJlcXVlc3QgPSBuZXh0UmVxdWVzdC5jYXB0dXJlUmVxdWVzdDsKQEAgLTQ3ODUsNyArNTQzNywxMCBAQAogICAgICAgICBtUHJldlRyaWdnZXJzID0gdHJpZ2dlckNvdW50OwogCiAgICAgICAgIC8vIElmIHRoZSByZXF1ZXN0IGlzIHRoZSBzYW1lIGFzIGxhc3QsIG9yIHdlIGhhZCB0cmlnZ2VycyBsYXN0IHRpbWUKLSAgICAgICAgYm9vbCBuZXdSZXF1ZXN0ID0gbVByZXZSZXF1ZXN0ICE9IGNhcHR1cmVSZXF1ZXN0IHx8IHRyaWdnZXJzTWl4ZWRJbjsKKyAgICAgICAgYm9vbCBuZXdSZXF1ZXN0ID0gKG1QcmV2UmVxdWVzdCAhPSBjYXB0dXJlUmVxdWVzdCB8fCB0cmlnZ2Vyc01peGVkSW4pICYmCisgICAgICAgICAgICAgICAgLy8gUmVxdWVzdCBzZXR0aW5ncyBhcmUgYWxsIHRoZSBzYW1lIHdpdGhpbiBvbmUgYmF0Y2gsIHNvIG9ubHkgdHJlYXQgdGhlIGZpcnN0CisgICAgICAgICAgICAgICAgLy8gcmVxdWVzdCBpbiBhIGJhdGNoIGFzIG5ldworICAgICAgICAgICAgICAgICEoYmF0Y2hlZFJlcXVlc3QgJiYgaSA+IDApOwogICAgICAgICBpZiAobmV3UmVxdWVzdCkgewogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBIQUwgd29ya2Fyb3VuZDoKQEAgLTQ4ODYsOCArNTU0MSwxMSBAQAogICAgICAgICB9CiAgICAgICAgIG5zZWNzX3Qgd2FpdER1cmF0aW9uID0ga0Jhc2VHZXRCdWZmZXJXYWl0ICsgcGFyZW50LT5nZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKTsKIAorICAgICAgICBTdXJmYWNlTWFwIHVuaXF1ZVN1cmZhY2VJZE1hcDsKICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9IGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5lZGl0SXRlbUF0KGopOworICAgICAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLmVkaXRJdGVtQXQoaik7CisgICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSBvdXRwdXRTdHJlYW0tPmdldElkKCk7CiAKICAgICAgICAgICAgIC8vIFByZXBhcmUgdmlkZW8gYnVmZmVycyBmb3IgaGlnaCBzcGVlZCByZWNvcmRpbmcgb24gdGhlIGZpcnN0IHZpZGVvIHJlcXVlc3QuCiAgICAgICAgICAgICBpZiAobVByZXBhcmVWaWRlb1N0cmVhbSAmJiBvdXRwdXRTdHJlYW0tPmlzVmlkZW9TdHJlYW0oKSkgewpAQCAtNDkwNiwxNyArNTU2NCw2MSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5nZXRCdWZmZXIoJm91dHB1dEJ1ZmZlcnMtPmVkaXRJdGVtQXQoaiksCi0gICAgICAgICAgICAgICAgICAgIHdhaXREdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdXJmYWNlc1tqXSk7Ci0gICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIgZnJvbSBncmFsbG9jIHF1ZXVlIC0gdGhpcyBjb3VsZCBiZSBkdWUgdG8KLSAgICAgICAgICAgICAgICAvLyBhYmFuZG9uZWQgcXVldWUgb3Igb3RoZXIgY29uc3VtZXIgbWlzYmVoYXZpb3IsIHNvIG5vdCBhIGZhdGFsCi0gICAgICAgICAgICAgICAgLy8gZXJyb3IKLSAgICAgICAgICAgICAgICBBTE9HRSgiUmVxdWVzdFRocmVhZDogQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIsIHNraXBwaW5nIHJlcXVlc3Q6IgotICAgICAgICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IHVuaXF1ZVN1cmZhY2VJZHM7CisgICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPmdldFVuaXF1ZVN1cmZhY2VJZHMoCisgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3VyZmFjZXNbc3RyZWFtSWRdLAorICAgICAgICAgICAgICAgICAgICAmdW5pcXVlU3VyZmFjZUlkcyk7CisgICAgICAgICAgICAvLyBJTlZBTElEX09QRVJBVElPTiBpcyBub3JtYWwgb3V0cHV0IGZvciBzdHJlYW1zIG5vdCBzdXBwb3J0aW5nIHN1cmZhY2VJZHMKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0sgJiYgcmVzICE9IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gcXVlcnkgc3RyZWFtICVkIHVuaXF1ZSBzdXJmYWNlIElEcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICAgICAgICAgIHVuaXF1ZVN1cmZhY2VJZE1hcC5pbnNlcnQoe3N0cmVhbUlkLCBzdGQ6Om1vdmUodW5pcXVlU3VyZmFjZUlkcyl9KTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHJldHVybiBUSU1FRF9PVVQ7CisgICAgICAgICAgICBpZiAobVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtLT5pc0FiYW5kb25lZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogc3RyZWFtICVkIGlzIGFiYW5kb25lZC4iLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRJTUVEX09VVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gSEFMIHdpbGwgcmVxdWVzdCBidWZmZXIgdGhyb3VnaCByZXF1ZXN0U3RyZWFtQnVmZmVyIEFQSQorICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90JiBidWZmZXIgPSBvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGopOworICAgICAgICAgICAgICAgIGJ1ZmZlci5zdHJlYW0gPSBvdXRwdXRTdHJlYW0tPmFzSGFsU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgYnVmZmVyLmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgYnVmZmVyLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSzsKKyAgICAgICAgICAgICAgICBidWZmZXIuYWNxdWlyZV9mZW5jZSA9IC0xOworICAgICAgICAgICAgICAgIGJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gLTE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcyA9IG91dHB1dFN0cmVhbS0+Z2V0QnVmZmVyKCZvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGopLAorICAgICAgICAgICAgICAgICAgICAgICAgd2FpdER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdXJmYWNlc1tzdHJlYW1JZF0pOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIgZnJvbSBncmFsbG9jIHF1ZXVlIC0gdGhpcyBjb3VsZCBiZSBkdWUgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gYWJhbmRvbmVkIHF1ZXVlIG9yIG90aGVyIGNvbnN1bWVyIG1pc2JlaGF2aW9yLCBzbyBub3QgYSBmYXRhbAorICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiUmVxdWVzdFRocmVhZDogQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIsIHNraXBwaW5nIHJlcXVlc3Q6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSU1FRF9PVVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHN0cmVhbUNhbWVyYUlkID0gb3V0cHV0U3RyZWFtLT5nZXRQaHlzaWNhbENhbWVyYUlkKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgc2V0dGluZ3MgOiBjYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdHJlYW1DYW1lcmFJZC5pc0VtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5nZXRJZCgpID09IHNldHRpbmdzLmNhbWVyYUlkLmNfc3RyKCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUNhbWVyYUlkID09IHNldHRpbmdzLmNhbWVyYUlkLmNfc3RyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0tPmZpcmVCdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLm1ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkID0gb3V0cHV0U3RyZWFtLT5nZXRQaHlzaWNhbENhbWVyYUlkKCk7CkBAIC00OTM4LDE1ICs1NjQwLDMyIEBACiAgICAgICAgIC8vIHByZXZpZXcpLCBhbmQgdGhlIGN1cnJlbnQgcmVxdWVzdCBpcyBub3QgdGhlIGxhc3Qgb25lIGluIHRoZSBiYXRjaCwKICAgICAgICAgLy8gZG8gbm90IHNlbmQgY2FsbGJhY2sgdG8gdGhlIGFwcC4KICAgICAgICAgYm9vbCBoYXNDYWxsYmFjayA9IHRydWU7Ci0gICAgICAgIGlmIChtTmV4dFJlcXVlc3RzWzBdLmNhcHR1cmVSZXF1ZXN0LT5tQmF0Y2hTaXplID4gMSAmJiBpICE9IG1OZXh0UmVxdWVzdHMuc2l6ZSgpLTEpIHsKKyAgICAgICAgaWYgKGJhdGNoZWRSZXF1ZXN0ICYmIGkgIT0gbU5leHRSZXF1ZXN0cy5zaXplKCktMSkgewogICAgICAgICAgICAgaGFzQ2FsbGJhY2sgPSBmYWxzZTsKICAgICAgICAgfQorICAgICAgICBib29sIGlzU3RpbGxDYXB0dXJlID0gZmFsc2U7CisgICAgICAgIGJvb2wgaXNac2xDYXB0dXJlID0gZmFsc2U7CisgICAgICAgIGlmICghbU5leHRSZXF1ZXN0c1swXS5jYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGUgPSBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCgpOworICAgICAgICAgICAgZmluZF9jYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkoaGFsUmVxdWVzdC0+c2V0dGluZ3MsIEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCwgJmUpOworICAgICAgICAgICAgaWYgKChlLmNvdW50ID4gMCkgJiYgKGUuZGF0YS51OFswXSA9PSBBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlRfU1RJTExfQ0FQVFVSRSkpIHsKKyAgICAgICAgICAgICAgICBpc1N0aWxsQ2FwdHVyZSA9IHRydWU7CisgICAgICAgICAgICAgICAgQVRSQUNFX0FTWU5DX0JFR0lOKCJzdGlsbCBjYXB0dXJlIiwgbU5leHRSZXF1ZXN0c1tpXS5oYWxSZXF1ZXN0LmZyYW1lX251bWJlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KGhhbFJlcXVlc3QtPnNldHRpbmdzLCBBTkRST0lEX0NPTlRST0xfRU5BQkxFX1pTTCwgJmUpOworICAgICAgICAgICAgaWYgKChlLmNvdW50ID4gMCkgJiYgKGUuZGF0YS51OFswXSA9PSBBTkRST0lEX0NPTlRST0xfRU5BQkxFX1pTTF9UUlVFKSkgeworICAgICAgICAgICAgICAgIGlzWnNsQ2FwdHVyZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgcmVzID0gcGFyZW50LT5yZWdpc3RlckluRmxpZ2h0KGhhbFJlcXVlc3QtPmZyYW1lX251bWJlciwKICAgICAgICAgICAgICAgICB0b3RhbE51bUJ1ZmZlcnMsIGNhcHR1cmVSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgIC8qaGFzSW5wdXQqL2hhbFJlcXVlc3QtPmlucHV0X2J1ZmZlciAhPSBOVUxMLAogICAgICAgICAgICAgICAgIGhhc0NhbGxiYWNrLAogICAgICAgICAgICAgICAgIGNhbGN1bGF0ZU1heEV4cGVjdGVkRHVyYXRpb24oaGFsUmVxdWVzdC0+c2V0dGluZ3MpLAotICAgICAgICAgICAgICAgIHJlcXVlc3RlZFBoeXNpY2FsQ2FtZXJhcyk7CisgICAgICAgICAgICAgICAgcmVxdWVzdGVkUGh5c2ljYWxDYW1lcmFzLCBpc1N0aWxsQ2FwdHVyZSwgaXNac2xDYXB0dXJlLAorICAgICAgICAgICAgICAgIChtVXNlSGFsQnVmTWFuYWdlcikgPyB1bmlxdWVTdXJmYWNlSWRNYXAgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJmYWNlTWFwe30pOwogICAgICAgICBBTE9HVlYoIiVzOiByZWdpc3RlcmVkIGluIGZsaWdodCByZXF1ZXN0SWQgPSAlIiBQUklkMzIgIiwgZnJhbWVOdW1iZXIgPSAlIiBQUklkNjQKICAgICAgICAgICAgICAgICIsIGJ1cnN0SWQgPSAlIiBQUklkMzIgIi4iLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKQEAgLTUwMjIsNyArNTc0MSw3IEBACiAgICAgICAgICAgICBpZiAocy5maXJzdCA9PSBzdHJlYW1JZCkgewogICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gJml0ID0gc3RkOjpmaW5kKHMuc2Vjb25kLmJlZ2luKCksIHMuc2Vjb25kLmVuZCgpLCBzdXJmYWNlSWQpOwogICAgICAgICAgICAgICAgIGlmIChpdCAhPSBzLnNlY29uZC5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTAzMyw3ICs1NzUyLDcgQEAKICAgICAgICAgICAgIGlmIChzLmZpcnN0ID09IHN0cmVhbUlkKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgYXV0byAmaXQgPSBzdGQ6OmZpbmQocy5zZWNvbmQuYmVnaW4oKSwgcy5zZWNvbmQuZW5kKCksIHN1cmZhY2VJZCk7CiAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IHMuc2Vjb25kLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01MDQyLDYgKzU3NjEsMjIgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpIHsKKyAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgZm9yIGNhbWVyYSBkZXZpY2Ugbm90IHN1cHBvcnRpbmcgSEFMIGJ1ZmZlciBtYW5hZ2VtZW50IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBwbChtUGF1c2VMb2NrKTsKKyAgICBpZiAobVBhdXNlZCkgeworICAgICAgICBtSW50ZXJmYWNlLT5zaWduYWxQaXBlbGluZURyYWluKHN0cmVhbUlkcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gSWYgcmVxdWVzdCB0aHJlYWQgaXMgc3RpbGwgYnVzeSwgd2FpdCB1bnRpbCBwYXVzZWQgdGhlbiBub3RpZnkgSEFMCisgICAgbU5vdGlmeVBpcGVsaW5lRHJhaW4gPSB0cnVlOworICAgIG1TdHJlYW1JZHNUb0JlRHJhaW5lZCA9IHN0cmVhbUlkczsKK30KKwogbnNlY3NfdCBDYW1lcmEzRGV2aWNlOjpnZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUluRmxpZ2h0TG9jayk7CkBAIC01MDk5LDE2ICs1ODM0LDIxIEBACiAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bUlucHV0U3RyZWFtLT5yZXR1cm5JbnB1dEJ1ZmZlcihjYXB0dXJlUmVxdWVzdC0+bUlucHV0QnVmZmVyKTsKICAgICAgICAgfQogCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGFsUmVxdWVzdC0+bnVtX291dHB1dF9idWZmZXJzOyBpKyspIHsKLSAgICAgICAgICAgIC8vQnVmZmVycyB0aGF0IGZhaWxlZCBwcm9jZXNzaW5nIGNvdWxkIHN0aWxsIGhhdmUKLSAgICAgICAgICAgIC8vdmFsaWQgYWNxdWlyZSBmZW5jZS4KLSAgICAgICAgICAgIGludCBhY3F1aXJlRmVuY2UgPSAoKm91dHB1dEJ1ZmZlcnMpW2ldLmFjcXVpcmVfZmVuY2U7Ci0gICAgICAgICAgICBpZiAoMCA8PSBhY3F1aXJlRmVuY2UpIHsKLSAgICAgICAgICAgICAgICBjbG9zZShhY3F1aXJlRmVuY2UpOwotICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnMtPmVkaXRJdGVtQXQoaSkuYWNxdWlyZV9mZW5jZSA9IC0xOworICAgICAgICAvLyBObyBvdXRwdXQgYnVmZmVyIGNhbiBiZSByZXR1cm5lZCB3aGVuIHVzaW5nIEhBTCBidWZmZXIgbWFuYWdlcgorICAgICAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhhbFJlcXVlc3QtPm51bV9vdXRwdXRfYnVmZmVyczsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy9CdWZmZXJzIHRoYXQgZmFpbGVkIHByb2Nlc3NpbmcgY291bGQgc3RpbGwgaGF2ZQorICAgICAgICAgICAgICAgIC8vdmFsaWQgYWNxdWlyZSBmZW5jZS4KKyAgICAgICAgICAgICAgICBpbnQgYWNxdWlyZUZlbmNlID0gKCpvdXRwdXRCdWZmZXJzKVtpXS5hY3F1aXJlX2ZlbmNlOworICAgICAgICAgICAgICAgIGlmICgwIDw9IGFjcXVpcmVGZW5jZSkgeworICAgICAgICAgICAgICAgICAgICBjbG9zZShhY3F1aXJlRmVuY2UpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGkpLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChpKS5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLmVkaXRJdGVtQXQoaSktPnJldHVybkJ1ZmZlcigoKm91dHB1dEJ1ZmZlcnMpW2ldLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgLyp0aW1lc3RhbXBJbmNyZWFzaW5nKi90cnVlLCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICgpLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChpKS5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7Ci0gICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuZWRpdEl0ZW1BdChpKS0+cmV0dXJuQnVmZmVyKCgqb3V0cHV0QnVmZmVycylbaV0sIDApOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHNlbmRSZXF1ZXN0RXJyb3IpIHsKQEAgLTUyMTQsMTEgKzU5NTQsMjAgQEAKICAgICAgICAgICAgIGlmIChtUGF1c2VkID09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBSZXF1ZXN0VGhyZWFkOiBHb2luZyBpZGxlIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAobU5vdGlmeVBpcGVsaW5lRHJhaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgbUludGVyZmFjZS0+c2lnbmFsUGlwZWxpbmVEcmFpbihtU3RyZWFtSWRzVG9CZURyYWluZWQpOworICAgICAgICAgICAgICAgICAgICBtTm90aWZ5UGlwZWxpbmVEcmFpbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSWRzVG9CZURyYWluZWQuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gTGV0IHRoZSB0cmFja2VyIGtub3cKICAgICAgICAgICAgICAgICBzcDxTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyID0gbVN0YXR1c1RyYWNrZXIucHJvbW90ZSgpOwogICAgICAgICAgICAgICAgIGlmIChzdGF0dXNUcmFja2VyICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudElkbGUobVN0YXR1c0lkLCBGZW5jZTo6Tk9fRkVOQ0UpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5tUmVxdWVzdEJ1ZmZlclNNLm9uUmVxdWVzdFRocmVhZFBhdXNlZCgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFN0b3Agd2FpdGluZyBmb3Igbm93IGFuZCBsZXQgdGhyZWFkIG1hbmFnZW1lbnQgaGFwcGVuCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTUyOTgsMTEgKzYwNDcsMjAgQEAKICAgICAgICAgaWYgKG1QYXVzZWQgPT0gZmFsc2UpIHsKICAgICAgICAgICAgIG1QYXVzZWQgPSB0cnVlOwogICAgICAgICAgICAgQUxPR1YoIiVzOiBSZXF1ZXN0VGhyZWFkOiBQYXVzZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgaWYgKG1Ob3RpZnlQaXBlbGluZURyYWluKSB7CisgICAgICAgICAgICAgICAgbUludGVyZmFjZS0+c2lnbmFsUGlwZWxpbmVEcmFpbihtU3RyZWFtSWRzVG9CZURyYWluZWQpOworICAgICAgICAgICAgICAgIG1Ob3RpZnlQaXBlbGluZURyYWluID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVN0cmVhbUlkc1RvQmVEcmFpbmVkLmNsZWFyKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBMZXQgdGhlIHRyYWNrZXIga25vdwogICAgICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKICAgICAgICAgICAgIGlmIChzdGF0dXNUcmFja2VyICE9IDApIHsKICAgICAgICAgICAgICAgICBzdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50SWRsZShtU3RhdHVzSWQsIEZlbmNlOjpOT19GRU5DRSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHBhcmVudC0+bVJlcXVlc3RCdWZmZXJTTS5vblJlcXVlc3RUaHJlYWRQYXVzZWQoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHJlcyA9IG1Eb1BhdXNlU2lnbmFsLndhaXRSZWxhdGl2ZShtUGF1c2VMb2NrLCBrUmVxdWVzdFRpbWVvdXQpOwpAQCAtNTc1OCwyMyArNjUxNiwxNzQgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotLyoqCi0gKiBTdGF0aWMgY2FsbGJhY2sgZm9yd2FyZGluZyBtZXRob2RzIGZyb20gSEFMIHRvIGluc3RhbmNlCi0gKi8KK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6OmluaXRpYWxpemUoCisgICAgICAgIHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIpIHsKKyAgICBpZiAoc3RhdHVzVHJhY2tlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogc3RhdHVzVHJhY2tlciBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKLXZvaWQgQ2FtZXJhM0RldmljZTo6c1Byb2Nlc3NDYXB0dXJlUmVzdWx0KGNvbnN0IGNhbWVyYTNfY2FsbGJhY2tfb3BzICpjYiwKLSAgICAgICAgY29uc3QgY2FtZXJhM19jYXB0dXJlX3Jlc3VsdCAqcmVzdWx0KSB7Ci0gICAgQ2FtZXJhM0RldmljZSAqZCA9Ci0gICAgICAgICAgICBjb25zdF9jYXN0PENhbWVyYTNEZXZpY2UqPihzdGF0aWNfY2FzdDxjb25zdCBDYW1lcmEzRGV2aWNlKj4oY2IpKTsKLQotICAgIGQtPnByb2Nlc3NDYXB0dXJlUmVzdWx0KHJlc3VsdCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1TdGF0dXNUcmFja2VyID0gc3RhdHVzVHJhY2tlcjsKKyAgICBtUmVxdWVzdEJ1ZmZlclN0YXR1c0lkID0gc3RhdHVzVHJhY2tlci0+YWRkQ29tcG9uZW50KCk7CisgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIENhbWVyYTNEZXZpY2U6OnNOb3RpZnkoY29uc3QgY2FtZXJhM19jYWxsYmFja19vcHMgKmNiLAotICAgICAgICBjb25zdCBjYW1lcmEzX25vdGlmeV9tc2cgKm1zZykgewotICAgIENhbWVyYTNEZXZpY2UgKmQgPQotICAgICAgICAgICAgY29uc3RfY2FzdDxDYW1lcmEzRGV2aWNlKj4oc3RhdGljX2Nhc3Q8Y29uc3QgQ2FtZXJhM0RldmljZSo+KGNiKSk7Ci0gICAgZC0+bm90aWZ5KG1zZyk7Citib29sIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6OnN0YXJ0UmVxdWVzdEJ1ZmZlcigpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgaWYgKG1TdGF0dXMgPT0gUkJfU1RBVFVTX1JFQURZIHx8IG1TdGF0dXMgPT0gUkJfU1RBVFVTX1BFTkRJTkdfU1RPUCkgeworICAgICAgICBtUmVxdWVzdEJ1ZmZlck9uZ29pbmcgPSB0cnVlOworICAgICAgICBub3RpZnlUcmFja2VyTG9ja2VkKC8qYWN0aXZlKi90cnVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjplbmRSZXF1ZXN0QnVmZmVyKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAoIW1SZXF1ZXN0QnVmZmVyT25nb2luZykgeworICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIHdpdGhvdXQgYSBzdWNjZXNzZnVsIHN0YXJ0UmVxdWVzdEJ1ZmZlciBjYWxsIGZpcnN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVJlcXVlc3RCdWZmZXJPbmdvaW5nID0gZmFsc2U7CisgICAgaWYgKG1TdGF0dXMgPT0gUkJfU1RBVFVTX1BFTkRJTkdfU1RPUCkgeworICAgICAgICBjaGVja1N3aXRjaFRvU3RvcExvY2tlZCgpOworICAgIH0KKyAgICBub3RpZnlUcmFja2VyTG9ja2VkKC8qYWN0aXZlKi9mYWxzZSk7Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6b25TdHJlYW1zQ29uZmlndXJlZCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbVN0YXR1cyA9IFJCX1NUQVRVU19SRUFEWTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6b25TdWJtaXR0aW5nUmVxdWVzdCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbVJlcXVlc3RUaHJlYWRQYXVzZWQgPSBmYWxzZTsKKyAgICAvLyBpbmZsaWdodCBtYXAgcmVnaXN0ZXIgYWN0dWFsbHkgaGFwcGVucyBpbiBwcmVwYXJlSGFsUmVxdWVzdCBub3csIGJ1dCBpdCBpcyBjbG9zZSBlbm91Z2gKKyAgICAvLyBhcHByb3hpbWF0aW9uLgorICAgIG1JbmZsaWdodE1hcEVtcHR5ID0gZmFsc2U7CisgICAgaWYgKG1TdGF0dXMgPT0gUkJfU1RBVFVTX1NUT1BQRUQpIHsKKyAgICAgICAgbVN0YXR1cyA9IFJCX1NUQVRVU19SRUFEWTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om9uUmVxdWVzdFRocmVhZFBhdXNlZCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbVJlcXVlc3RUaHJlYWRQYXVzZWQgPSB0cnVlOworICAgIGlmIChtU3RhdHVzID09IFJCX1NUQVRVU19QRU5ESU5HX1NUT1ApIHsKKyAgICAgICAgY2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om9uSW5mbGlnaHRNYXBFbXB0eSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbUluZmxpZ2h0TWFwRW1wdHkgPSB0cnVlOworICAgIGlmIChtU3RhdHVzID09IFJCX1NUQVRVU19QRU5ESU5HX1NUT1ApIHsKKyAgICAgICAgY2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om9uV2FpdFVudGlsSWRsZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgaWYgKCFjaGVja1N3aXRjaFRvU3RvcExvY2tlZCgpKSB7CisgICAgICAgIG1TdGF0dXMgPSBSQl9TVEFUVVNfUEVORElOR19TVE9QOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6bm90aWZ5VHJhY2tlckxvY2tlZChib29sIGFjdGl2ZSkgeworICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIgPSBtU3RhdHVzVHJhY2tlci5wcm9tb3RlKCk7CisgICAgaWYgKHN0YXR1c1RyYWNrZXIgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgICAgICBzdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50QWN0aXZlKG1SZXF1ZXN0QnVmZmVyU3RhdHVzSWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudElkbGUobVJlcXVlc3RCdWZmZXJTdGF0dXNJZCwgRmVuY2U6Ok5PX0ZFTkNFKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpjaGVja1N3aXRjaFRvU3RvcExvY2tlZCgpIHsKKyAgICBpZiAobUluZmxpZ2h0TWFwRW1wdHkgJiYgbVJlcXVlc3RUaHJlYWRQYXVzZWQgJiYgIW1SZXF1ZXN0QnVmZmVyT25nb2luZykgeworICAgICAgICBtU3RhdHVzID0gUkJfU1RBVFVTX1NUT1BQRUQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmZpeHVwTW9ub2Nocm9tZVRhZ3MoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGRldmljZUluZm8sCisgICAgICAgIENhbWVyYU1ldGFkYXRhJiByZXN1bHRNZXRhZGF0YSkgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmICghbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gUmVtb3ZlIHRhZ3MgdGhhdCBhcmUgbm90IGFwcGxpY2FibGUgdG8gbW9ub2Nocm9tZSBjYW1lcmEuCisgICAgaW50MzJfdCB0YWdzVG9SZW1vdmVbXSA9IHsKKyAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfR1JFRU5fU1BMSVQsCisgICAgICAgICAgIEFORFJPSURfU0VOU09SX05FVVRSQUxfQ09MT1JfUE9JTlQsCisgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9NT0RFLAorICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fVFJBTlNGT1JNLAorICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fR0FJTlMsCisgICAgfTsKKyAgICBmb3IgKGF1dG8gdGFnIDogdGFnc1RvUmVtb3ZlKSB7CisgICAgICAgIHJlcyA9IHJlc3VsdE1ldGFkYXRhLmVyYXNlKHRhZyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlbW92ZSB0YWcgJWQgZm9yIG1vbm9jaHJvbWUgY2FtZXJhIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFORFJPSURfU0VOU09SX0RZTkFNSUNfQkxBQ0tfTEVWRUwKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgYmxFbnRyeSA9IHJlc3VsdE1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfRFlOQU1JQ19CTEFDS19MRVZFTCk7CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBibEVudHJ5LmNvdW50OyBpKyspIHsKKyAgICAgICAgYmxFbnRyeS5kYXRhLmZbaV0gPSBibEVudHJ5LmRhdGEuZlswXTsKKyAgICB9CisKKyAgICAvLyBBTkRST0lEX1NFTlNPUl9OT0lTRV9QUk9GSUxFCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IG5wRW50cnkgPSByZXN1bHRNZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX05PSVNFX1BST0ZJTEUpOworICAgIGlmIChucEVudHJ5LmNvdW50ID4gMCAmJiBucEVudHJ5LmNvdW50ICUgMiA9PSAwKSB7CisgICAgICAgIGRvdWJsZSBucFtdID0ge25wRW50cnkuZGF0YS5kWzBdLCBucEVudHJ5LmRhdGEuZFsxXX07CisgICAgICAgIHJlcyA9IHJlc3VsdE1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9OT0lTRV9QUk9GSUxFLCBucCwgMik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB1cGRhdGUgU0VOU09SX05PSVNFX1BST0ZJTEU6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFORFJPSURfU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQCisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGxzU2l6ZUVudHJ5ID0gZGV2aWNlSW5mby5maW5kKEFORFJPSURfTEVOU19JTkZPX1NIQURJTkdfTUFQX1NJWkUpOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBsc0VudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUCk7CisgICAgaWYgKGxzU2l6ZUVudHJ5LmNvdW50ID09IDIgJiYgbHNFbnRyeS5jb3VudCA+IDAKKyAgICAgICAgICAgICYmIChpbnQzMl90KWxzRW50cnkuY291bnQgPT0gNCAqIGxzU2l6ZUVudHJ5LmRhdGEuaTMyWzBdICogbHNTaXplRW50cnkuZGF0YS5pMzJbMV0pIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbHNTaXplRW50cnkuZGF0YS5pMzJbMF0gKiBsc1NpemVFbnRyeS5kYXRhLmkzMlsxXTsgaSsrKSB7CisgICAgICAgICAgICBsc0VudHJ5LmRhdGEuZls0KmkrMV0gPSBsc0VudHJ5LmRhdGEuZls0KmldOworICAgICAgICAgICAgbHNFbnRyeS5kYXRhLmZbNCppKzJdID0gbHNFbnRyeS5kYXRhLmZbNCppXTsKKyAgICAgICAgICAgIGxzRW50cnkuZGF0YS5mWzQqaSszXSA9IGxzRW50cnkuZGF0YS5mWzQqaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBTkRST0lEX1RPTkVNQVBfQ1VSVkVfQkxVRQorICAgIC8vIEFORFJPSURfVE9ORU1BUF9DVVJWRV9HUkVFTgorICAgIC8vIEFORFJPSURfVE9ORU1BUF9DVVJWRV9SRUQKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgdGNiRW50cnkgPSByZXN1bHRNZXRhZGF0YS5maW5kKEFORFJPSURfVE9ORU1BUF9DVVJWRV9CTFVFKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgdGNnRW50cnkgPSByZXN1bHRNZXRhZGF0YS5maW5kKEFORFJPSURfVE9ORU1BUF9DVVJWRV9HUkVFTik7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHRjckVudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1RPTkVNQVBfQ1VSVkVfUkVEKTsKKyAgICBpZiAodGNiRW50cnkuY291bnQgPiAwCisgICAgICAgICAgICAmJiB0Y2JFbnRyeS5jb3VudCA9PSB0Y2dFbnRyeS5jb3VudAorICAgICAgICAgICAgJiYgdGNiRW50cnkuY291bnQgPT0gdGNyRW50cnkuY291bnQpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0Y2JFbnRyeS5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICB0Y2JFbnRyeS5kYXRhLmZbaV0gPSB0Y3JFbnRyeS5kYXRhLmZbaV07CisgICAgICAgICAgICB0Y2dFbnRyeS5kYXRhLmZbaV0gPSB0Y3JFbnRyeS5kYXRhLmZbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOwogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAppbmRleCAxMzFkNjJmLi5kM2JiMjEyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaApAQCAtMzMsMTAgKzMzLDExIEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjMvSUNhbWVyYURldmljZVNlc3Npb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy40L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNC9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgogI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEzLmg+CiAKICNpbmNsdWRlIDxjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oPgogCkBAIC01MCwyMCArNTEsNiBAQAogCiB1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpPdXRwdXRTdHJlYW1JbmZvOwogCi0vKioKLSAqIEZ1bmN0aW9uIHBvaW50ZXIgdHlwZXMgd2l0aCBDIGNhbGxpbmcgY29udmVudGlvbiB0bwotICogdXNlIGZvciBIQUwgY2FsbGJhY2sgZnVuY3Rpb25zLgotICovCi1leHRlcm4gIkMiIHsKLSAgICB0eXBlZGVmIHZvaWQgKGNhbGxiYWNrc19wcm9jZXNzX2NhcHR1cmVfcmVzdWx0X3QpKAotICAgICAgICBjb25zdCBzdHJ1Y3QgY2FtZXJhM19jYWxsYmFja19vcHMgKiwKLSAgICAgICAgY29uc3QgY2FtZXJhM19jYXB0dXJlX3Jlc3VsdF90ICopOwotCi0gICAgdHlwZWRlZiB2b2lkIChjYWxsYmFja3Nfbm90aWZ5X3QpKAotICAgICAgICBjb25zdCBzdHJ1Y3QgY2FtZXJhM19jYWxsYmFja19vcHMgKiwKLSAgICAgICAgY29uc3QgY2FtZXJhM19ub3RpZnlfbXNnX3QgKik7Ci19Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogbmFtZXNwYWNlIGNhbWVyYTMgewpAQCAtODAsOCArNjcsNyBAQAogICovCiBjbGFzcyBDYW1lcmEzRGV2aWNlIDoKICAgICAgICAgICAgIHB1YmxpYyBDYW1lcmFEZXZpY2VCYXNlLAotICAgICAgICAgICAgdmlydHVhbCBwdWJsaWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2ssCi0gICAgICAgICAgICBwcml2YXRlIGNhbWVyYTNfY2FsbGJhY2tfb3BzIHsKKyAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZUNhbGxiYWNrIHsKICAgcHVibGljOgogCiAgICAgZXhwbGljaXQgQ2FtZXJhM0RldmljZShjb25zdCBTdHJpbmc4JiBpZCk7CkBAIC0yMDgsOCArMTk0LDMyIEBACiAgICAgICovCiAgICAgc3RhdHVzX3QgZHJvcFN0cmVhbUJ1ZmZlcnMoYm9vbCBkcm9wcGluZywgaW50IHN0cmVhbUlkKSBvdmVycmlkZTsKIAorICAgIC8qKgorICAgICAqIEhlbHBlciBmdW5jdGlvbnMgdG8gbWFwIGJldHdlZW4gZnJhbWV3b3JrIGFuZCBISURMIHZhbHVlcworICAgICAqLworICAgIHN0YXRpYyBoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgbWFwVG9QaXhlbEZvcm1hdChpbnQgZnJhbWV3b3JrRm9ybWF0KTsKKyAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpEYXRhc3BhY2VGbGFncyBtYXBUb0hpZGxEYXRhc3BhY2UoCisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UpOworICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgbWFwVG9Db25zdW1lclVzYWdlKHVpbnQ2NF90IHVzYWdlKTsKKyAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Sb3RhdGlvbiBtYXBUb1N0cmVhbVJvdGF0aW9uKAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbik7CisgICAgLy8gUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaWYgdGhlIHBhc3NlZC1pbiBvcGVyYXRpb24gbW9kZSBpcyBub3QgdmFsaWQuCisgICAgc3RhdGljIHN0YXR1c190IG1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3Qgb3BlcmF0aW9uTW9kZSwKKyAgICAgICAgICAgIC8qb3V0Ki8gaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZSAqbW9kZSk7CisgICAgc3RhdGljIGNhbWVyYTNfYnVmZmVyX3N0YXR1c190IG1hcEhpZGxCdWZmZXJTdGF0dXMoCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclN0YXR1cyBzdGF0dXMpOworICAgIHN0YXRpYyBpbnQgbWFwVG9GcmFtZXdvcmtGb3JtYXQoaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IHBpeGVsRm9ybWF0KTsKKyAgICBzdGF0aWMgYW5kcm9pZF9kYXRhc3BhY2UgbWFwVG9GcmFtZXdvcmtEYXRhc3BhY2UoCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzKTsKKyAgICBzdGF0aWMgdWludDY0X3QgbWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKKyAgICBzdGF0aWMgdWludDY0X3QgbWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKKwogICBwcml2YXRlOgogCisgICAgc3RhdHVzX3QgZGlzY29ubmVjdEltcGwoKTsKKwogICAgIC8vIGludGVybmFsIHR5cGVkZWZzCiAgICAgdXNpbmcgUmVxdWVzdE1ldGFkYXRhUXVldWUgPSBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPjsKICAgICB1c2luZyBSZXN1bHRNZXRhZGF0YVF1ZXVlICA9IGhhcmR3YXJlOjpNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwpAQCAtMjY4LDcgKzI3OCw4IEBACiAgICAgY2xhc3MgSGFsSW50ZXJmYWNlIDogcHVibGljIGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1CdWZmZXJGcmVlZExpc3RlbmVyIHsKICAgICAgIHB1YmxpYzoKICAgICAgICAgSGFsSW50ZXJmYWNlKHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+ICZzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSk7CisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKTsKICAgICAgICAgSGFsSW50ZXJmYWNlKGNvbnN0IEhhbEludGVyZmFjZSAmb3RoZXIpOwogICAgICAgICBIYWxJbnRlcmZhY2UoKTsKIApAQCAtMjk3LDE0ICszMDgsMzUgQEAKICAgICAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwogICAgICAgICBzdGF0dXNfdCBjbG9zZSgpOwogCisgICAgICAgIHZvaWQgc2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpOworICAgICAgICBib29sIGlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQoQ2FtZXJhTWV0YWRhdGEmIG9sZFNlc3Npb25QYXJhbXMsCisgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEmIG5ld1Nlc3Npb25QYXJhbXMpOworCisgICAgICAgIC8vIG1ldGhvZCB0byBleHRyYWN0IGJ1ZmZlcidzIHVuaXF1ZSBJRAorICAgICAgICAvLyByZXR1cm4gcGFpciBvZiAobmV3bHlTZWVuQnVmZmVyPywgYnVmZmVySWQpCisgICAgICAgIHN0ZDo6cGFpcjxib29sLCB1aW50NjRfdD4gZ2V0QnVmZmVySWQoY29uc3QgYnVmZmVyX2hhbmRsZV90JiBidWYsIGludCBzdHJlYW1JZCk7CisKICAgICAgICAgLy8gRmluZCBhIGJ1ZmZlcl9oYW5kbGVfdCBiYXNlZCBvbiBmcmFtZSBudW1iZXIgYW5kIHN0cmVhbSBJRAogICAgICAgICBzdGF0dXNfdCBwb3BJbmZsaWdodEJ1ZmZlcihpbnQzMl90IGZyYW1lTnVtYmVyLCBpbnQzMl90IHN0cmVhbUlkLAogICAgICAgICAgICAgICAgIC8qb3V0Ki8gYnVmZmVyX2hhbmRsZV90ICoqYnVmZmVyKTsKIAorICAgICAgICAvLyBSZWdpc3RlciBhIGJ1ZklkIChzdHJlYW1JZCwgYnVmZmVyX2hhbmRsZV90KSB0byBpbmZsaWdodCByZXF1ZXN0IGJ1ZmZlcgorICAgICAgICBzdGF0dXNfdCBwdXNoSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKAorICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcklkLCBidWZmZXJfaGFuZGxlX3QqIGJ1ZiwgaW50MzJfdCBzdHJlYW1JZCk7CisKKyAgICAgICAgLy8gRmluZCBhIGJ1ZmZlcl9oYW5kbGVfdCBiYXNlZCBvbiBidWZmZXJJZAorICAgICAgICBzdGF0dXNfdCBwb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIodWludDY0X3QgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgLypvdXQqLyBidWZmZXJfaGFuZGxlX3QqKiBidWZmZXIsCisgICAgICAgICAgICAgICAgLypvcHRpb25hbCBvdXQqLyBpbnQzMl90KiBzdHJlYW1JZCA9IG51bGxwdHIpOworCiAgICAgICAgIC8vIEdldCBhIHZlY3RvciBvZiAoZnJhbWVOdW1iZXIsIHN0cmVhbUlkKSBwYWlyIG9mIGN1cnJlbnRseSBpbmZsaWdodAogICAgICAgICAvLyBidWZmZXJzCiAgICAgICAgIHZvaWQgZ2V0SW5mbGlnaHRCdWZmZXJLZXlzKHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4qIG91dCk7CiAKKyAgICAgICAgLy8gR2V0IGEgdmVjdG9yIG9mIGJ1ZmZlcklkIG9mIGN1cnJlbnRseSBpbmZsaWdodCBidWZmZXJzCisgICAgICAgIHZvaWQgZ2V0SW5mbGlnaHRSZXF1ZXN0QnVmZmVyS2V5cyhzdGQ6OnZlY3Rvcjx1aW50NjRfdD4qIG91dCk7CisKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IEJVRkZFUl9JRF9OT19CVUZGRVIgPSAwOwogICAgICAgcHJpdmF0ZToKICAgICAgICAgLy8gQWx3YXlzIHZhbGlkCiAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbjsKQEAgLTMxMiw2ICszNDQsOCBAQAogICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzM6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM18zOwogICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy40IG9yIG5ld2VyCiAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzQ7CisgICAgICAgIC8vIFZhbGlkIGlmIElDYW1lcmFEZXZpY2VTZXNzaW9uIGlzIEAzLjUgb3IgbmV3ZXIKKyAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uXzNfNTsKIAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZTsKIApAQCAtMzE5LDcgKzM1Myw3IEBACiAKICAgICAgICAgLy8gVGhlIG91dHB1dCBISURMIHJlcXVlc3Qgc3RpbGwgZGVwZW5kcyBvbiBpbnB1dCBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90CiAgICAgICAgIC8vIERvIG5vdCBmcmVlIGlucHV0IGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QgYmVmb3JlIG91dHB1dCBISURMIHJlcXVlc3QKLSAgICAgICAgdm9pZCB3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KiBpbiwKKyAgICAgICAgc3RhdHVzX3Qgd3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCogaW4sCiAgICAgICAgICAgICAgICAgLypvdXQqL2hhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlcXVlc3QqIG91dCwKICAgICAgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4qIGhhbmRsZXNDcmVhdGVkKTsKIApAQCAtMzYzLDE5ICszOTcsMTkgQEAKICAgICAgICAgLy8gc3RyZWFtIElEIC0+IHBlciBzdHJlYW0gYnVmZmVyIElEIG1hcAogICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBCdWZmZXJJZE1hcD4gbUJ1ZmZlcklkTWFwczsKICAgICAgICAgdWludDY0X3QgbU5leHRCdWZmZXJJZCA9IDE7IC8vIDAgbWVhbnMgbm8gYnVmZmVyCi0gICAgICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBCVUZGRVJfSURfTk9fQlVGRkVSID0gMDsKLQotICAgICAgICAvLyBtZXRob2QgdG8gZXh0cmFjdCBidWZmZXIncyB1bmlxdWUgSUQKLSAgICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIHN3aXRjaCB0byB1c2UgZ3JhbGxvYyBtYXBwZXIncyBnZXRCYWNraW5nU3RvcmUgQVBJCi0gICAgICAgIC8vICAgICAgIG9uY2Ugd2UgcmFuIGluIGJpbmRlcml6ZWQgZ3JhbGxvYyBtb2RlLCBidXQgYmVmb3JlIHRoYXQgaXMgcmVhZHksCi0gICAgICAgIC8vICAgICAgIHdlIG5lZWQgdG8gcmVseSBvbiB0aGUgY29udmVudGlvbmFsIGJ1ZmZlciBxdWV1ZSBiZWhhdmlvciB3aGVyZQotICAgICAgICAvLyAgICAgICBidWZmZXJfaGFuZGxlX3QncyBGRCB3b24ndCBjaGFuZ2UuCi0gICAgICAgIC8vIHJldHVybiBwYWlyIG9mIChuZXdseVNlZW5CdWZmZXI/LCBidWZmZXJJZCkKLSAgICAgICAgc3RkOjpwYWlyPGJvb2wsIHVpbnQ2NF90PiBnZXRCdWZmZXJJZChjb25zdCBidWZmZXJfaGFuZGxlX3QmIGJ1ZiwgaW50IHN0cmVhbUlkKTsKIAogICAgICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJGcmVlZChpbnQgc3RyZWFtSWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlKSBvdmVycmlkZTsKIAogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50LCB1aW50NjRfdD4+IG1GcmVlZEJ1ZmZlcnM7CisKKyAgICAgICAgLy8gQnVmZmVycyBnaXZlbiB0byBIQUwgdGhyb3VnaCByZXF1ZXN0U3RyZWFtQnVmZmVyIEFQSQorICAgICAgICBzdGQ6Om11dGV4IG1SZXF1ZXN0ZWRCdWZmZXJzTG9jazsKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBzdGQ6OnBhaXI8aW50MzJfdCwgYnVmZmVyX2hhbmRsZV90Kj4+IG1SZXF1ZXN0ZWRCdWZmZXJzOworCisgICAgICAgIHVpbnQzMl90IG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlciA9IDE7CisKKyAgICAgICAgY29uc3QgYm9vbCBtVXNlSGFsQnVmTWFuYWdlcjsKKyAgICAgICAgYm9vbCBtSXNSZWNvbmZpZ3VyYXRpb25RdWVyeVN1cHBvcnRlZDsKICAgICB9OwogCiAgICAgc3A8SGFsSW50ZXJmYWNlPiBtSW50ZXJmYWNlOwpAQCAtNDEwLDkgKzQ0NCwyMiBAQAogICAgIC8vIFRyYWNraW5nIGNhdXNlIG9mIGZhdGFsIGVycm9ycyB3aGVuIGluIFNUQVRVU19FUlJPUgogICAgIFN0cmluZzggICAgICAgICAgICAgICAgICAgIG1FcnJvckNhdXNlOwogCi0gICAgLy8gTWFwcGluZyBvZiBzdHJlYW0gSURzIHRvIHN0cmVhbSBpbnN0YW5jZXMKLSAgICB0eXBlZGVmIEtleWVkVmVjdG9yPGludCwgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gPgotICAgICAgICAgICAgU3RyZWFtU2V0OworICAgIC8vIFN5bmNocm9uaXplZCBtYXBwaW5nIG9mIHN0cmVhbSBJRHMgdG8gc3RyZWFtIGluc3RhbmNlcworICAgIGNsYXNzIFN0cmVhbVNldCB7CisgICAgICBwdWJsaWM6CisgICAgICAgIHN0YXR1c190IGFkZChpbnQgc3RyZWFtSWQsIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+KTsKKyAgICAgICAgc3NpemVfdCByZW1vdmUoaW50IHN0cmVhbUlkKTsKKyAgICAgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gZ2V0KGludCBzdHJlYW1JZCk7CisgICAgICAgIC8vIGdldCBieSAodW5kZXJseWluZykgdmVjdG9yIGluZGV4CisgICAgICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG9wZXJhdG9yW10gKHNpemVfdCBpbmRleCk7CisgICAgICAgIHNpemVfdCBzaXplKCkgY29uc3Q7CisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gZ2V0U3RyZWFtSWRzKCk7CisgICAgICAgIHZvaWQgY2xlYXIoKTsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBLZXllZFZlY3RvcjxpbnQsIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+PiBtRGF0YTsKKyAgICB9OwogCiAgICAgU3RyZWFtU2V0ICAgICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbXM7CiAgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM1N0cmVhbT4gbUlucHV0U3RyZWFtOwpAQCAtNDgxLDggKzUyOCw5IEBACiAKIAogICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZUNhbGxiYWNrCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sKICAgICAgKi8KKwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcHJvY2Vzc0NhcHR1cmVSZXN1bHRfM180KAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAogICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSBvdmVycmlkZTsKQEAgLTQ5Myw2ICs1NDEsMTUgQEAKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpOb3RpZnlNc2c+JiBtc2dzKSBvdmVycmlkZTsKIAorICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmVxdWVzdFN0cmVhbUJ1ZmZlcnMoCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCisgICAgICAgICAgICByZXF1ZXN0U3RyZWFtQnVmZmVyc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldHVyblN0cmVhbUJ1ZmZlcnMoCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQnVmZmVyPiYgYnVmZmVycykgb3ZlcnJpZGU7CisKICAgICAvLyBIYW5kbGUgb25lIGNhcHR1cmUgcmVzdWx0LiBBc3N1bWUgdGhhdCBtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrIGlzIGhlbGQuCiAgICAgdm9pZCBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdCYgcmVzdWx0LApAQCAtNjUzLDI3ICs3MTAsNiBAQAogICAgICAqLwogICAgIHN0YXRpYyBuc2Vjc190IGdldE1vbm9Ub0Jvb3R0aW1lT2Zmc2V0KCk7CiAKLSAgICAvKioKLSAgICAgKiBIZWxwZXIgZnVuY3Rpb25zIHRvIG1hcCBiZXR3ZWVuIGZyYW1ld29yayBhbmQgSElETCB2YWx1ZXMKLSAgICAgKi8KLSAgICBzdGF0aWMgaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IG1hcFRvUGl4ZWxGb3JtYXQoaW50IGZyYW1ld29ya0Zvcm1hdCk7Ci0gICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6RGF0YXNwYWNlRmxhZ3MgbWFwVG9IaWRsRGF0YXNwYWNlKAotICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlKTsKLSAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIG1hcFRvQ29uc3VtZXJVc2FnZSh1aW50NjRfdCB1c2FnZSk7Ci0gICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtUm90YXRpb24gbWFwVG9TdHJlYW1Sb3RhdGlvbigKLSAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pOwotICAgIC8vIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIHRoZSBwYXNzZWQtaW4gb3BlcmF0aW9uIG1vZGUgaXMgbm90IHZhbGlkLgotICAgIHN0YXRpYyBzdGF0dXNfdCBtYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90IG9wZXJhdGlvbk1vZGUsCi0gICAgICAgICAgICAvKm91dCovIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgKm1vZGUpOwotICAgIHN0YXRpYyBjYW1lcmEzX2J1ZmZlcl9zdGF0dXNfdCBtYXBIaWRsQnVmZmVyU3RhdHVzKGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyU3RhdHVzIHN0YXR1cyk7Ci0gICAgc3RhdGljIGludCBtYXBUb0ZyYW1ld29ya0Zvcm1hdChoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgcGl4ZWxGb3JtYXQpOwotICAgIHN0YXRpYyBhbmRyb2lkX2RhdGFzcGFjZSBtYXBUb0ZyYW1ld29ya0RhdGFzcGFjZSgKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6RGF0YXNwYWNlRmxhZ3MpOwotICAgIHN0YXRpYyB1aW50NjRfdCBtYXBDb25zdW1lclRvRnJhbWV3b3JrVXNhZ2UoCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2UpOwotICAgIHN0YXRpYyB1aW50NjRfdCBtYXBQcm9kdWNlclRvRnJhbWV3b3JrVXNhZ2UoCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2UpOwotCiAgICAgc3RydWN0IFJlcXVlc3RUcmlnZ2VyIHsKICAgICAgICAgLy8gTWV0YWRhdGEgdGFnIG51bWJlciwgZS5nLiBhbmRyb2lkLmNvbnRyb2wuYWVQcmVjYXB0dXJlVHJpZ2dlcgogICAgICAgICB1aW50MzJfdCBtZXRhZGF0YVRhZzsKQEAgLTcwMCw3ICs3MzYsOSBAQAogCiAgICAgICAgIFJlcXVlc3RUaHJlYWQod3A8Q2FtZXJhM0RldmljZT4gcGFyZW50LAogICAgICAgICAgICAgICAgIHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIsCi0gICAgICAgICAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBpbnRlcmZhY2UsIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cyk7CisgICAgICAgICAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPGludDMyX3Q+JiBzZXNzaW9uUGFyYW1LZXlzLAorICAgICAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlcik7CiAgICAgICAgIH5SZXF1ZXN0VGhyZWFkKCk7CiAKICAgICAgICAgdm9pZCAgICAgc2V0Tm90aWZpY2F0aW9uTGlzdGVuZXIod3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyKTsKQEAgLTc4OCw2ICs4MjYsOCBAQAogICAgICAgICAgICAgbVJlcXVlc3RMYXRlbmN5LmR1bXAoZmQsIG5hbWUpOwogICAgICAgICB9CiAKKyAgICAgICAgdm9pZCBzaWduYWxQaXBlbGluZURyYWluKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHN0cmVhbUlkcyk7CisKICAgICAgIHByb3RlY3RlZDoKIAogICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOwpAQCAtODk3LDEyICs5MzcsMTMgQEAKIAogICAgICAgICBib29sICAgICAgICAgICAgICAgbVJlY29uZmlndXJlZDsKIAotICAgICAgICAvLyBVc2VkIGJ5IHdhaXRJZlBhdXNlZCwgd2FpdEZvck5leHRSZXF1ZXN0LCBhbmQgd2FpdFVudGlsUGF1c2VkCisgICAgICAgIC8vIFVzZWQgYnkgd2FpdElmUGF1c2VkLCB3YWl0Rm9yTmV4dFJlcXVlc3QsIHdhaXRVbnRpbFBhdXNlZCwgYW5kIHNpZ25hbFBpcGVsaW5lRHJhaW4KICAgICAgICAgTXV0ZXggICAgICAgICAgICAgIG1QYXVzZUxvY2s7CiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICBtRG9QYXVzZTsKICAgICAgICAgQ29uZGl0aW9uICAgICAgICAgIG1Eb1BhdXNlU2lnbmFsOwogICAgICAgICBib29sICAgICAgICAgICAgICAgbVBhdXNlZDsKLSAgICAgICAgQ29uZGl0aW9uICAgICAgICAgIG1QYXVzZWRTaWduYWw7CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICBtTm90aWZ5UGlwZWxpbmVEcmFpbjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAgIG1TdHJlYW1JZHNUb0JlRHJhaW5lZDsKIAogICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gbVByZXZSZXF1ZXN0OwogICAgICAgICBpbnQzMl90ICAgICAgICAgICAgbVByZXZUcmlnZ2VyczsKQEAgLTkzNSw2ICs5NzYsOCBAQAogCiAgICAgICAgIFZlY3RvcjxpbnQzMl90PiAgICBtU2Vzc2lvblBhcmFtS2V5czsKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgICAgIG1MYXRlc3RTZXNzaW9uUGFyYW1zOworCisgICAgICAgIGNvbnN0IGJvb2wgICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcjsKICAgICB9OwogICAgIHNwPFJlcXVlc3RUaHJlYWQ+IG1SZXF1ZXN0VGhyZWFkOwogCkBAIC05OTUsNiArMTAzOCwxNSBAQAogICAgICAgICAvLyBNYXAgb2YgcGh5c2ljYWxDYW1lcmFJZCA8LT4gTWV0YWRhdGEKICAgICAgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gcGh5c2ljYWxNZXRhZGF0YXM7CiAKKyAgICAgICAgLy8gSW5kaWNhdGVzIGEgc3RpbGwgY2FwdHVyZSByZXF1ZXN0LgorICAgICAgICBib29sIHN0aWxsQ2FwdHVyZTsKKworICAgICAgICAvLyBJbmRpY2F0ZXMgYSBaU0wgY2FwdHVyZSByZXF1ZXN0CisgICAgICAgIGJvb2wgenNsQ2FwdHVyZTsKKworICAgICAgICAvLyBXaGF0IHNoYXJlZCBzdXJmYWNlcyBhbiBvdXRwdXQgc2hvdWxkIGdvIHRvCisgICAgICAgIFN1cmZhY2VNYXAgb3V0cHV0U3VyZmFjZXM7CisKICAgICAgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBuZWVkZWQgYnkgS2V5ZWRWZWN0b3IKICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0KCkgOgogICAgICAgICAgICAgICAgIHNodXR0ZXJUaW1lc3RhbXAoMCksCkBAIC0xMDA1LDEyICsxMDU3LDE2IEBACiAgICAgICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXIoZmFsc2UpLAogICAgICAgICAgICAgICAgIGhhc0NhbGxiYWNrKHRydWUpLAogICAgICAgICAgICAgICAgIG1heEV4cGVjdGVkRHVyYXRpb24oa0RlZmF1bHRFeHBlY3RlZER1cmF0aW9uKSwKLSAgICAgICAgICAgICAgICBza2lwUmVzdWx0TWV0YWRhdGEoZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBza2lwUmVzdWx0TWV0YWRhdGEoZmFsc2UpLAorICAgICAgICAgICAgICAgIHN0aWxsQ2FwdHVyZShmYWxzZSksCisgICAgICAgICAgICAgICAgenNsQ2FwdHVyZShmYWxzZSkgewogICAgICAgICB9CiAKICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0KGludCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIGV4dHJhcywgYm9vbCBoYXNJbnB1dCwKICAgICAgICAgICAgICAgICBib29sIGhhc0FwcENhbGxiYWNrLCBuc2Vjc190IG1heER1cmF0aW9uLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkU2V0KSA6CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRTZXQsIGJvb2wgaXNTdGlsbENhcHR1cmUsCisgICAgICAgICAgICAgICAgYm9vbCBpc1pzbENhcHR1cmUsCisgICAgICAgICAgICAgICAgY29uc3QgU3VyZmFjZU1hcCYgb3V0U3VyZmFjZXMgPSBTdXJmYWNlTWFwe30pIDoKICAgICAgICAgICAgICAgICBzaHV0dGVyVGltZXN0YW1wKDApLAogICAgICAgICAgICAgICAgIHNlbnNvclRpbWVzdGFtcCgwKSwKICAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzKE9LKSwKQEAgLTEwMjEsNyArMTA3NywxMCBAQAogICAgICAgICAgICAgICAgIGhhc0NhbGxiYWNrKGhhc0FwcENhbGxiYWNrKSwKICAgICAgICAgICAgICAgICBtYXhFeHBlY3RlZER1cmF0aW9uKG1heER1cmF0aW9uKSwKICAgICAgICAgICAgICAgICBza2lwUmVzdWx0TWV0YWRhdGEoZmFsc2UpLAotICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRzKHBoeXNpY2FsQ2FtZXJhSWRTZXQpIHsKKyAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcyhwaHlzaWNhbENhbWVyYUlkU2V0KSwKKyAgICAgICAgICAgICAgICBzdGlsbENhcHR1cmUoaXNTdGlsbENhcHR1cmUpLAorICAgICAgICAgICAgICAgIHpzbENhcHR1cmUoaXNac2xDYXB0dXJlKSwKKyAgICAgICAgICAgICAgICBvdXRwdXRTdXJmYWNlcyhvdXRTdXJmYWNlcykgewogICAgICAgICB9CiAgICAgfTsKIApAQCAtMTAzNSwxMCArMTA5NCwxMSBAQAogICAgIG5zZWNzX3QgICAgICAgICAgICAgICAgbUV4cGVjdGVkSW5mbGlnaHREdXJhdGlvbiA9IDA7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICBtSW5GbGlnaHRTdGF0dXNJZDsKIAotCiAgICAgc3RhdHVzX3QgcmVnaXN0ZXJJbkZsaWdodCh1aW50MzJfdCBmcmFtZU51bWJlciwKICAgICAgICAgICAgIGludDMyX3QgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMsIGJvb2wgaGFzSW5wdXQsCi0gICAgICAgICAgICBib29sIGNhbGxiYWNrLCBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24sIHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgICAgICAgICBib29sIGNhbGxiYWNrLCBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24sIHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkcywKKyAgICAgICAgICAgIGJvb2wgaXNTdGlsbENhcHR1cmUsIGJvb2wgaXNac2xDYXB0dXJlLAorICAgICAgICAgICAgY29uc3QgU3VyZmFjZU1hcCYgb3V0cHV0U3VyZmFjZXMpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBleHBlY3RlZCB0aW1lIGl0J2xsIHRha2UgZm9yIGFsbCBjdXJyZW50bHkgaW4tZmxpZ2h0CkBAIC0xMTQ4LDcgKzEyMDgsMTEgQEAKIAogICAgIC8vIGhlbHBlciBmdW5jdGlvbiB0byByZXR1cm4gdGhlIG91dHB1dCBidWZmZXJzIHRvIHRoZSBzdHJlYW1zLgogICAgIHZvaWQgcmV0dXJuT3V0cHV0QnVmZmVycyhjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqb3V0cHV0QnVmZmVycywKLSAgICAgICAgICAgIHNpemVfdCBudW1CdWZmZXJzLCBuc2Vjc190IHRpbWVzdGFtcCk7CisgICAgICAgICAgICBzaXplX3QgbnVtQnVmZmVycywgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZyA9IHRydWUsCisgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZ3VtZW50cyBhcmUgb25seSBtZWFudCBmb3Igc3VyZmFjZSBzaGFyaW5nIHVzZSBjYXNlCisgICAgICAgICAgICBjb25zdCBTdXJmYWNlTWFwJiBvdXRwdXRTdXJmYWNlcyA9IFN1cmZhY2VNYXB7fSwKKyAgICAgICAgICAgIC8vIFVzZWQgdG8gc2VuZCBidWZmZXIgZXJyb3IgY2FsbGJhY2sgd2hlbiBmYWlsaW5nIHRvIHJldHVybiBidWZmZXIKKyAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgJnJlc3VsdEV4dHJhcyA9IENhcHR1cmVSZXN1bHRFeHRyYXN7fSk7CiAKICAgICAvLyBTZW5kIGEgcGFydGlhbCBjYXB0dXJlIHJlc3VsdC4KICAgICB2b2lkIHNlbmRQYXJ0aWFsQ2FwdHVyZVJlc3VsdChjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqIHBhcnRpYWxSZXN1bHQsCkBAIC0xMjA0LDEzICsxMjY4LDg4IEBACiAgICAgLy8gQ2FjaGVkIGxhc3QgcmVxdWVzdGVkIHRlbXBsYXRlIGlkCiAgICAgaW50IG1MYXN0VGVtcGxhdGVJZDsKIAotICAgIC8qKgotICAgICAqIFN0YXRpYyBjYWxsYmFjayBmb3J3YXJkaW5nIG1ldGhvZHMgZnJvbSBIQUwgdG8gaW5zdGFuY2UKLSAgICAgKi8KLSAgICBzdGF0aWMgY2FsbGJhY2tzX3Byb2Nlc3NfY2FwdHVyZV9yZXN1bHRfdCBzUHJvY2Vzc0NhcHR1cmVSZXN1bHQ7CisgICAgLy8gU3luY2hyb25pemVzIGFjY2VzcyB0byBzdGF0dXMgdHJhY2tlciBiZXR3ZWVuIGluZmxpZ2h0IHVwZGF0ZXMgYW5kIGRpc2Nvbm5lY3QuCisgICAgLy8gYi83OTk3Mjg2NQorICAgIE11dGV4IG1UcmFja2VyTG9jazsKIAotICAgIHN0YXRpYyBjYWxsYmFja3Nfbm90aWZ5X3Qgc05vdGlmeTsKKyAgICAvLyBXaGV0aGVyIEhBTCByZXF1ZXN0IGJ1ZmZlcnMgdGhyb3VnaCByZXF1ZXN0U3RyZWFtQnVmZmVycyBBUEkKKyAgICBib29sIG1Vc2VIYWxCdWZNYW5hZ2VyID0gZmFsc2U7CiAKKyAgICAvLyBMb2NrIHRvIGVuc3VyZSByZXF1ZXN0U3RyZWFtQnVmZmVycygpIGNhbGxiYWNrcyBhcmUgc2VyaWFsaXplZAorICAgIHN0ZDo6bXV0ZXggbVJlcXVlc3RCdWZmZXJJbnRlcmZhY2VMb2NrOworCisgICAgLy8gVGhlIHN0YXRlIG1hY2hpbmUgdG8gY29udHJvbCB3aGVuIHJlcXVlc3RTdHJlYW1CdWZmZXJzIHNob3VsZCBhbGxvdworICAgIC8vIEhBTCB0byByZXF1ZXN0IGJ1ZmZlcnMuCisgICAgZW51bSBSZXF1ZXN0QnVmZmVyU3RhdGUgeworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBpcyB0aGUgaW5pdGlhbCBzdGF0ZS4KKyAgICAgICAgICogcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgY2FsbCB3aWxsIHJldHVybiBGQUlMRURfQ09ORklHVVJJTkcgaW4gdGhpcyBzdGF0ZS4KKyAgICAgICAgICogV2lsbCBzd2l0Y2ggdG8gUkJfU1RBVFVTX1JFQURZIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjb25maWd1cmVTdHJlYW1zIG9yCisgICAgICAgICAqIHByb2Nlc3NDYXB0dXJlUmVxdWVzdCBjYWxsLgorICAgICAgICAgKi8KKyAgICAgICAgUkJfU1RBVFVTX1NUT1BQRUQsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHJlcXVlc3RTdHJlYW1CdWZmZXJzIGNhbGwgd2lsbCBwcm9jZWVkIGluIHRoaXMgc3RhdGUuCisgICAgICAgICAqIFdoZW4gZGV2aWNlIGlzIGFza2VkIHRvIHN0YXkgaWRsZSB2aWEgd2FpdFVudGlsU3RhdGVUaGVuUmVsb2NrKCkgY2FsbDoKKyAgICAgICAgICogICAgIC0gU3dpdGNoIHRvIFJCX1NUQVRVU19TVE9QUEVEIGlmIHRoZXJlIGlzIG5vIGluZmxpZ2h0IHJlcXVlc3RzIGFuZAorICAgICAgICAgKiAgICAgICByZXF1ZXN0IHRocmVhZCBpcyBwYXVzZWQuCisgICAgICAgICAqICAgICAtIFN3aXRjaCB0byBSQl9TVEFUVVNfUEVORElOR19TVE9QIG90aGVyd2lzZQorICAgICAgICAgKi8KKyAgICAgICAgUkJfU1RBVFVTX1JFQURZLAorCisgICAgICAgIC8qKgorICAgICAgICAgKiByZXF1ZXN0U3RyZWFtQnVmZmVycyBjYWxsIHdpbGwgcHJvY2VlZCBpbiB0aGlzIHN0YXRlLgorICAgICAgICAgKiBTd2l0Y2ggdG8gUkJfU1RBVFVTX1NUT1BQRUQgd2hlbiBhbGwgaW5mbGlnaHQgcmVxdWVzdHMgYXJlIGZ1bGZpbGxlZAorICAgICAgICAgKiBhbmQgcmVxdWVzdCB0aHJlYWQgaXMgcGF1c2VkCisgICAgICAgICAqLworICAgICAgICBSQl9TVEFUVVNfUEVORElOR19TVE9QLAorICAgIH07CisKKyAgICBjbGFzcyBSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZShzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyKTsKKworICAgICAgICAvLyBSZXR1cm4gaWYgdGhlIHN0YXRlIG1hY2hpbmUgY3VycmVudGx5IGFsbG93cyBmb3IgcmVxdWVzdEJ1ZmZlcnMKKyAgICAgICAgLy8gSWYgdGhlIHN0YXRlIGFsbG93cyBmb3IgaXQsIG1SZXF1ZXN0QnVmZmVyT25nb2luZyB3aWxsIGJlIHNldCB0byB0cnVlCisgICAgICAgIC8vIGFuZCBjYWxsZXIgbXVzdCBjYWxsIGVuZFJlcXVlc3RCdWZmZXIoKSBsYXRlciB0byB1bnNldCB0aGUgZmxhZworICAgICAgICBib29sIHN0YXJ0UmVxdWVzdEJ1ZmZlcigpOworICAgICAgICB2b2lkIGVuZFJlcXVlc3RCdWZmZXIoKTsKKworICAgICAgICAvLyBFdmVudHMgdHJpZ2dlcmVkIGJ5IGFwcGxpY2F0aW9uIEFQSSBjYWxsCisgICAgICAgIHZvaWQgb25TdHJlYW1zQ29uZmlndXJlZCgpOworICAgICAgICB2b2lkIG9uV2FpdFVudGlsSWRsZSgpOworCisgICAgICAgIC8vIEV2ZW50cyB1c3VhbGx5IHRyaWdnZXJlZCBieSBod0JpbmRlciBwcm9jZXNzQ2FwdHVyZVJlc3VsdCBjYWxsYmFjayB0aHJlYWQKKyAgICAgICAgLy8gQnV0IGNhbiBhbHNvIGJlIHRyaWdnZXJlZCBvbiByZXF1ZXN0IHRocmVhZCBmb3IgZmFpbGVkIHJlcXVlc3QsIG9yIG9uCisgICAgICAgIC8vIGh3YmluZGVyIG5vdGlmeSBjYWxsYmFjayB0aHJlYWQgZm9yIHNodXR0ZXIvZXJyb3IgY2FsbGJhY2tzCisgICAgICAgIHZvaWQgb25JbmZsaWdodE1hcEVtcHR5KCk7CisKKyAgICAgICAgLy8gRXZlbnRzIHRyaWdnZXJlZCBieSBSZXF1ZXN0VGhyZWFkCisgICAgICAgIHZvaWQgb25TdWJtaXR0aW5nUmVxdWVzdCgpOworICAgICAgICB2b2lkIG9uUmVxdWVzdFRocmVhZFBhdXNlZCgpOworCisgICAgICBwcml2YXRlOgorICAgICAgICB2b2lkIG5vdGlmeVRyYWNrZXJMb2NrZWQoYm9vbCBhY3RpdmUpOworCisgICAgICAgIC8vIFN3aXRjaCB0byBTVE9QUEVEIHN0YXRlIGFuZCByZXR1cm4gdHJ1ZSBpZiBhbGwgY29uZGl0aW9ucyBhbGxvd3MgZm9yIGl0LgorICAgICAgICAvLyBPdGhlcndpc2UgZG8gbm90aGluZyBhbmQgcmV0dXJuIGZhbHNlLgorICAgICAgICBib29sIGNoZWNrU3dpdGNoVG9TdG9wTG9ja2VkKCk7CisKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgUmVxdWVzdEJ1ZmZlclN0YXRlIG1TdGF0dXMgPSBSQl9TVEFUVVNfU1RPUFBFRDsKKworICAgICAgICBib29sIG1SZXF1ZXN0VGhyZWFkUGF1c2VkID0gdHJ1ZTsKKyAgICAgICAgYm9vbCBtSW5mbGlnaHRNYXBFbXB0eSA9IHRydWU7CisgICAgICAgIGJvb2wgbVJlcXVlc3RCdWZmZXJPbmdvaW5nID0gZmFsc2U7CisKKyAgICAgICAgd3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gbVN0YXR1c1RyYWNrZXI7CisgICAgICAgIGludCAgbVJlcXVlc3RCdWZmZXJTdGF0dXNJZDsKKyAgICB9IG1SZXF1ZXN0QnVmZmVyU007CisKKyAgICAvLyBGaXggdXAgcmVzdWx0IG1ldGFkYXRhIGZvciBtb25vY2hyb21lIGNhbWVyYS4KKyAgICBib29sIG1OZWVkRml4dXBNb25vY2hyb21lVGFnczsKKyAgICBzdGF0dXNfdCBmaXh1cE1vbm9jaHJvbWVUYWdzKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBkZXZpY2VJbmZvLCBDYW1lcmFNZXRhZGF0YSYgcmVzdWx0TWV0YWRhdGEpOwogfTsgLy8gY2xhc3MgQ2FtZXJhM0RldmljZQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwCmluZGV4IGZiMWZmNzcuLmI2MzcxNjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKQEAgLTQ4LDcgKzQ4LDcgQEAKIAogc3RhdHVzX3QgQ2FtZXJhM0R1bW15U3RyZWFtOjpyZXR1cm5CdWZmZXJMb2NrZWQoCiAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmLAotICAgICAgICBuc2Vjc190KSB7CisgICAgICAgIG5zZWNzX3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRHVtbXkgc3RyZWFtIGNhbm5vdCByZXR1cm4gYnVmZmVycyEiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtNTgsNiArNTgsNyBAQAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICYsCiAgICAgICAgICAgICBuc2Vjc190LAogICAgICAgICAgICAgYm9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+KikgewogICAgIEFUUkFDRV9DQUxMKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaAppbmRleCA0NjI3NTQ4Li40YjY3ZWE1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKQEAgLTg3LDYgKzg3LDkgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U3VyZmFjZUlkKGNvbnN0IHNwPFN1cmZhY2U+ICYvKnN1cmZhY2UqLykgeyByZXR1cm4gMDsgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVbmlxdWVTdXJmYWNlSWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mLAorICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHNpemVfdD4qKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfTsKKwogICAgIC8qKgogICAgICAqIFVwZGF0ZSB0aGUgc3RyZWFtIG91dHB1dCBzdXJmYWNlcy4KICAgICAgKi8KQEAgLTEwNCw2ICsxMDcsNyBAQAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCk7CiAKQEAgLTEyOCw3ICsxMzIsNyBAQAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCkpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCk7CisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcAppbmRleCAzYzFlNDNkLi4yZTkwOWEwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKQEAgLTExNiw3ICsxMTYsNyBAQAogICAgIHJldHVybiBtVG90YWxCdWZmZXJDb3VudDsKIH0KIAotc2l6ZV90IENhbWVyYTNJT1N0cmVhbUJhc2U6OmdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpIHsKK3NpemVfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1IYW5kb3V0T3V0cHV0QnVmZmVyQ291bnQ7CiB9CiAKQEAgLTIxOSw3ICsyMTksOCBAQAogc3RhdHVzX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6cmV0dXJuQW55QnVmZmVyTG9ja2VkKAogICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCi0gICAgICAgIGJvb2wgb3V0cHV0KSB7CisgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcykgewogICAgIHN0YXR1c190IHJlczsKIAogICAgIC8vIHJldHVybkJ1ZmZlciBtYXkgYmUgY2FsbGVkIGZyb20gYSByYXcgcG9pbnRlciwgbm90IGEgc3A8PiwgYW5kIHdlJ2xsIGJlCkBAIC0yMzUsNyArMjM2LDcgQEAKICAgICB9CiAKICAgICBzcDxGZW5jZT4gcmVsZWFzZUZlbmNlOwotICAgIHJlcyA9IHJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoYnVmZmVyLCB0aW1lc3RhbXAsIG91dHB1dCwKKyAgICByZXMgPSByZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCBvdXRwdXQsIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlbGVhc2VGZW5jZSk7CiAgICAgLy8gUmVzIG1heSBiZSBhbiBlcnJvciwgYnV0IHdlIHN0aWxsIHdhbnQgdG8gZGVjcmVtZW50IG91ciBvd25lZCBjb3VudAogICAgIC8vIHRvIGVuYWJsZSBjbGVhbiBzaHV0ZG93bi4gU28gd2UnbGwganVzdCByZXR1cm4gdGhlIGVycm9yIGJ1dCBvdGhlcndpc2UKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKaW5kZXggMGEzMWQ0NC4uNzUwZjY0ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmgKQEAgLTY2LDEyICs2NiwxNCBAQAogICAgIHN0YXR1c190ICAgICAgICAgcmV0dXJuQW55QnVmZmVyTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKLSAgICAgICAgICAgIGJvb2wgb3V0cHV0KTsKKyAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCkpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCkgPSAwOwogCkBAIC04Miw3ICs4NCw3IEBACiAKICAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEJ1ZmZlckNvdW50TG9ja2VkKCk7CiAKLSAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpOworICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgY29uc3Q7CiAKICAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRJbnB1dEJ1ZmZlckNvdW50TG9ja2VkKCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcAppbmRleCAwMTdkN2JlLi5mYzgzNjg0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCkBAIC05OCw2ICs5OCw3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiwKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KSB7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCmluZGV4IDA3MzI0NjQuLjk3YTYyN2EgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaApAQCAtNjIsNiArNjIsNyBAQAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCmluZGV4IDJjMDIwYTIuLmJhYmE4NTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcApAQCAtMTg3LDE2ICsxODcsMTcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6cXVldWVCdWZmZXJUb0NvbnN1bWVyKHNwPEFOYXRpdmVXaW5kb3c+JiBjb25zdW1lciwKLSAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSkgeworICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYpIHsKICAgICByZXR1cm4gY29uc3VtZXItPnF1ZXVlQnVmZmVyKGNvbnN1bWVyLmdldCgpLCBidWZmZXIsIGFud1JlbGVhc2VGZW5jZSk7CiB9CiAKIHN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OnJldHVybkJ1ZmZlckxvY2tlZCgKICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7CisgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKLSAgICBzdGF0dXNfdCByZXMgPSByZXR1cm5BbnlCdWZmZXJMb2NrZWQoYnVmZmVyLCB0aW1lc3RhbXAsIC8qb3V0cHV0Ki90cnVlKTsKKyAgICBzdGF0dXNfdCByZXMgPSByZXR1cm5BbnlCdWZmZXJMb2NrZWQoYnVmZmVyLCB0aW1lc3RhbXAsIC8qb3V0cHV0Ki90cnVlLCBzdXJmYWNlX2lkcyk7CiAKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIHJldHVybiByZXM7CkBAIC0yMTIsNiArMjEzLDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpIHsKIApAQCAtMjM3LDEyICsyMzksMTQgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYnVmZmVyIGJhY2sgdG8gQU5hdGl2ZVdpbmRvdwogICAgICAqLwotICAgIGlmIChidWZmZXIuc3RhdHVzID09IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUiB8fCBtRHJvcEJ1ZmZlcnMpIHsKKyAgICBpZiAoYnVmZmVyLnN0YXR1cyA9PSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IgfHwgbURyb3BCdWZmZXJzIHx8IHRpbWVzdGFtcCA9PSAwKSB7CiAgICAgICAgIC8vIENhbmNlbCBidWZmZXIKICAgICAgICAgaWYgKG1Ecm9wQnVmZmVycykgewogICAgICAgICAgICAgQUxPR1YoIiVzOiBEcm9wcGluZyBhIGZyYW1lIGZvciBzdHJlYW0gJWQuIiwgX19GVU5DVElPTl9fLCBtSWQpOwotICAgICAgICB9IGVsc2UgeworICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlci5zdGF0dXMgPT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SKSB7CiAgICAgICAgICAgICBBTE9HVygiJXM6IEEgZnJhbWUgaXMgZHJvcHBlZCBmb3Igc3RyZWFtICVkIGR1ZSB0byBidWZmZXIgZXJyb3IuIiwgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IHRpbWVzdGFtcCBzaG91bGRuJ3QgYmUgMCIsIF9fRlVOQ1RJT05fXywgbUlkKTsKICAgICAgICAgfQogCiAgICAgICAgIHJlcyA9IGN1cnJlbnRDb25zdW1lci0+Y2FuY2VsQnVmZmVyKGN1cnJlbnRDb25zdW1lci5nZXQoKSwKQEAgLTI3OSw3ICsyODMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogCi0gICAgICAgIHJlcyA9IHF1ZXVlQnVmZmVyVG9Db25zdW1lcihjdXJyZW50Q29uc3VtZXIsIGFud0J1ZmZlciwgYW53UmVsZWFzZUZlbmNlKTsKKyAgICAgICAgcmVzID0gcXVldWVCdWZmZXJUb0NvbnN1bWVyKGN1cnJlbnRDb25zdW1lciwgYW53QnVmZmVyLCBhbndSZWxlYXNlRmVuY2UsIHN1cmZhY2VfaWRzKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEVycm9yIHF1ZXVlaW5nIGJ1ZmZlciB0byBuYXRpdmUgd2luZG93OiAiCiAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTM1NSw3ICszNTksMTggQEAKICAgICAvLyBTZXQgZGVxdWV1ZUJ1ZmZlci9hdHRhY2hCdWZmZXIgdGltZW91dCBpZiB0aGUgY29uc3VtZXIgaXMgbm90IGh3IGNvbXBvc2VyIG9yIGh3IHRleHR1cmUuCiAgICAgLy8gV2UgbmVlZCBza2lwIHRoZXNlIGNhc2VzIGFzIHRpbWVvdXQgd2lsbCBkaXNhYmxlIHRoZSBub24tYmxvY2tpbmcgKGFzeW5jKSBtb2RlLgogICAgIGlmICghKGlzQ29uc3VtZWRCeUhXQ29tcG9zZXIoKSB8fCBpc0NvbnN1bWVkQnlIV1RleHR1cmUoKSkpIHsKLSAgICAgICAgbUNvbnN1bWVyLT5zZXREZXF1ZXVlVGltZW91dChrRGVxdWV1ZUJ1ZmZlclRpbWVvdXQpOworICAgICAgICBpZiAobVVzZUJ1ZmZlck1hbmFnZXIpIHsKKyAgICAgICAgICAgIC8vIFdoZW4gYnVmZmVyIG1hbmFnZXIgaXMgaGFuZGxpbmcgdGhlIGJ1ZmZlciwgd2Ugc2hvdWxkIGhhdmUgYXZhaWxhYmxlIGJ1ZmZlcnMgaW4KKyAgICAgICAgICAgIC8vIGJ1ZmZlciBxdWV1ZSBiZWZvcmUgd2UgY2FsbHMgaW50byBkZXF1ZXVlQnVmZmVyIGJlY2F1c2UgYnVmZmVyIG1hbmFnZXIgaXMgdHJhY2tpbmcKKyAgICAgICAgICAgIC8vIGZyZWUgYnVmZmVycy4KKyAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBob3dldmVyIHNvbWUgY29uc3VtZXIgc2lkZSBmZWF0dXJlIChJbWFnZVJlYWRlcjo6ZGlzY2FyZEZyZWVCdWZmZXJzKSB0aGF0CisgICAgICAgICAgICAvLyBjYW4gZGlzY2FyZCBmcmVlIGJ1ZmZlcnMgd2l0aG91dCBub3RpZnlpbmcgYnVmZmVyIG1hbmFnZXIuIFdlIHdhbnQgdGhlIHRpbWVvdXQgdG8KKyAgICAgICAgICAgIC8vIGhhcHBlbiBpbW1lZGlhdGVseSBoZXJlIHNvIGJ1ZmZlciBtYW5hZ2VyIGNhbiB0cnkgdG8gdXBkYXRlIGl0cyBpbnRlcm5hbCBzdGF0ZSBhbmQKKyAgICAgICAgICAgIC8vIHRyeSB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBpbnN0ZWFkIG9mIHdhaXRpbmcuCisgICAgICAgICAgICBtQ29uc3VtZXItPnNldERlcXVldWVUaW1lb3V0KDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUNvbnN1bWVyLT5zZXREZXF1ZXVlVGltZW91dChrRGVxdWV1ZUJ1ZmZlclRpbWVvdXQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpAQCAtNTIyLDYgKzUzNyw4IEBACiAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IGF0dGFjaCB0aGUgb3V0cHV0IGJ1ZmZlciB0byB0aGlzIHN1cmZhY2U6ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworCisgICAgICAgICAgICAgICAgY2hlY2tSZXRBbmRTZXRBYmFuZG9uZWRMb2NrZWQocmVzKTsKICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZ290QnVmZmVyRnJvbU1hbmFnZXIgPSB0cnVlOwpAQCAtNTU4LDM1ICs1NzUsNzAgQEAKICAgICAgICAgbURlcXVldWVCdWZmZXJMYXRlbmN5LmFkZChkZXF1ZXVlU3RhcnQsIGRlcXVldWVFbmQpOwogCiAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgeworCisgICAgICAgIGlmIChtVXNlQnVmZmVyTWFuYWdlciAmJiByZXMgPT0gVElNRURfT1VUKSB7CisgICAgICAgICAgICBjaGVja1JlbW92ZWRCdWZmZXJzTG9ja2VkKCk7CisKKyAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdiOworICAgICAgICAgICAgcmVzID0gbUJ1ZmZlck1hbmFnZXItPmdldEJ1ZmZlckZvclN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgZ2V0SWQoKSwgZ2V0U3RyZWFtU2V0SWQoKSwgJmdiLCBmZW5jZUZkLCAvKm5vRnJlZUJ1ZmZlciovdHJ1ZSk7CisKKyAgICAgICAgICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBBdHRhY2ggdGhpcyBidWZmZXIgdG8gdGhlIGJ1ZmZlclF1ZXVlOiB0aGUgYnVmZmVyIHdpbGwgYmUgaW4gZGVxdWV1ZSBzdGF0ZSBhZnRlcgorICAgICAgICAgICAgICAgIC8vIGEgc3VjY2Vzc2Z1bCByZXR1cm4uCisgICAgICAgICAgICAgICAgKmFuYiA9IGdiLmdldCgpOworICAgICAgICAgICAgICAgIHJlcyA9IG1Db25zdW1lci0+YXR0YWNoQnVmZmVyKCphbmIpOworICAgICAgICAgICAgICAgIGdvdEJ1ZmZlckZyb21NYW5hZ2VyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBBTE9HVigiU3RyZWFtICVkOiBBdHRhY2hlZCBuZXcgYnVmZmVyIiwgZ2V0SWQoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBhdHRhY2ggdGhlIG91dHB1dCBidWZmZXIgdG8gdGhpcyBzdXJmYWNlOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tSZXRBbmRTZXRBYmFuZG9uZWRMb2NrZWQocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBnZXQgbmV4dCBvdXRwdXQgYnVmZmVyIGZyb20gYnVmZmVyIG1hbmFnZXI6IgorICAgICAgICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgZGVxdWV1ZSBuZXh0IG91dHB1dCBidWZmZXI6ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAKLSAgICAgICAgICAgIC8vIE9ubHkgdHJhbnNpdGlvbiB0byBTVEFURV9BQkFORE9ORUQgZnJvbSBTVEFURV9DT05GSUdVUkVELiAoSWYgaXQgaXMgU1RBVEVfUFJFUEFSSU5HLAotICAgICAgICAgICAgLy8gbGV0IHByZXBhcmVOZXh0QnVmZmVyIGhhbmRsZSB0aGUgZXJyb3IuKQotICAgICAgICAgICAgaWYgKChyZXMgPT0gTk9fSU5JVCB8fCByZXMgPT0gREVBRF9PQkpFQ1QpICYmIG1TdGF0ZSA9PSBTVEFURV9DT05GSUdVUkVEKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQUJBTkRPTkVEOwotICAgICAgICAgICAgfQotCisgICAgICAgICAgICBjaGVja1JldEFuZFNldEFiYW5kb25lZExvY2tlZChyZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3A8R3JhcGhpY0J1ZmZlcj4+IHJlbW92ZWRCdWZmZXJzOwotICAgICAgICByZXMgPSBtQ29uc3VtZXItPmdldEFuZEZsdXNoUmVtb3ZlZEJ1ZmZlcnMoJnJlbW92ZWRCdWZmZXJzKTsKLSAgICAgICAgaWYgKHJlcyA9PSBPSykgewotICAgICAgICAgICAgb25CdWZmZXJzUmVtb3ZlZExvY2tlZChyZW1vdmVkQnVmZmVycyk7Ci0KLSAgICAgICAgICAgIGlmIChtVXNlQnVmZmVyTWFuYWdlciAmJiByZW1vdmVkQnVmZmVycy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlck1hbmFnZXItPm9uQnVmZmVyc1JlbW92ZWQoZ2V0SWQoKSwgZ2V0U3RyZWFtU2V0SWQoKSwgcmVtb3ZlZEJ1ZmZlcnMuc2l6ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBjaGVja1JlbW92ZWRCdWZmZXJzTG9ja2VkKCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJlczsKIH0KIAordm9pZCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpjaGVja1JlbW92ZWRCdWZmZXJzTG9ja2VkKGJvb2wgbm90aWZ5QnVmZmVyTWFuYWdlcikgeworICAgIHN0ZDo6dmVjdG9yPHNwPEdyYXBoaWNCdWZmZXI+PiByZW1vdmVkQnVmZmVyczsKKyAgICBzdGF0dXNfdCByZXMgPSBtQ29uc3VtZXItPmdldEFuZEZsdXNoUmVtb3ZlZEJ1ZmZlcnMoJnJlbW92ZWRCdWZmZXJzKTsKKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIG9uQnVmZmVyc1JlbW92ZWRMb2NrZWQocmVtb3ZlZEJ1ZmZlcnMpOworCisgICAgICAgIGlmIChub3RpZnlCdWZmZXJNYW5hZ2VyICYmIG1Vc2VCdWZmZXJNYW5hZ2VyICYmIHJlbW92ZWRCdWZmZXJzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIG1CdWZmZXJNYW5hZ2VyLT5vbkJ1ZmZlcnNSZW1vdmVkKGdldElkKCksIGdldFN0cmVhbVNldElkKCksIHJlbW92ZWRCdWZmZXJzLnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhM091dHB1dFN0cmVhbTo6Y2hlY2tSZXRBbmRTZXRBYmFuZG9uZWRMb2NrZWQoc3RhdHVzX3QgcmVzKSB7CisgICAgLy8gT25seSB0cmFuc2l0aW9uIHRvIFNUQVRFX0FCQU5ET05FRCBmcm9tIFNUQVRFX0NPTkZJR1VSRUQuIChJZiBpdCBpcworICAgIC8vIFNUQVRFX1BSRVBBUklORywgbGV0IHByZXBhcmVOZXh0QnVmZmVyIGhhbmRsZSB0aGUgZXJyb3IuKQorICAgIGlmICgocmVzID09IE5PX0lOSVQgfHwgcmVzID09IERFQURfT0JKRUNUKSAmJiBtU3RhdGUgPT0gU1RBVEVfQ09ORklHVVJFRCkgeworICAgICAgICBtU3RhdGUgPSBTVEFURV9BQkFORE9ORUQ7CisgICAgfQorfQorCiBzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpkaXNjb25uZWN0TG9ja2VkKCkgewogICAgIHN0YXR1c190IHJlczsKIApAQCAtNjU5LDEyICs3MTEsMTEgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlRm9yU3VyZmFjZSh1aW50NjRfdCAqdXNhZ2UsCi0gICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSBjb25zdCB7Ci0gICAgc3RhdHVzX3QgcmVzOwotICAgIHVpbnQ2NF90IHUgPSAwOwordm9pZCBDYW1lcmEzT3V0cHV0U3RyZWFtOjphcHBseVpTTFVzYWdlUXVpcmsoaW50IGZvcm1hdCwgdWludDY0X3QgKmNvbnN1bWVyVXNhZ2UgLyppbm91dCovKSB7CisgICAgaWYgKGNvbnN1bWVyVXNhZ2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAgcmVzID0gbmF0aXZlX3dpbmRvd19nZXRfY29uc3VtZXJfdXNhZ2Uoc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyo+KHN1cmZhY2UuZ2V0KCkpLCAmdSk7CiAgICAgLy8gSWYgYW4gb3BhcXVlIG91dHB1dCBzdHJlYW0ncyBlbmRwb2ludCBpcyBJbWFnZVJlYWRlciwgYWRkCiAgICAgLy8gR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMIHRvIHRoZSB1c2FnZSBzbyBIQUwga25vd3MgaXQgd2lsbCBiZSB1c2VkCiAgICAgLy8gZm9yIHRoZSBaU0wgdXNlIGNhc2UuCkBAIC02NzMsMTIgKzcyNCwyMCBAQAogICAgIC8vICAgICAyLiBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUgogICAgIC8vICAgICAzLiBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSCiAgICAgLy8gICAgIDQuIEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUgotICAgIGlmIChjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCAmJgotICAgICAgICAgICAgKHUgJiAoR1JBTExPQ19VU0FHRV9IV19URVhUVVJFIHwgR1JBTExPQ19VU0FHRV9IV19SRU5ERVIgfAorICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEICYmCisgICAgICAgICAgICAoKmNvbnN1bWVyVXNhZ2UgJiAoR1JBTExPQ19VU0FHRV9IV19URVhUVVJFIHwgR1JBTExPQ19VU0FHRV9IV19SRU5ERVIgfAogICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUiB8IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUikpID09IDApIHsKLSAgICAgICAgdSB8PSBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0w7CisgICAgICAgICpjb25zdW1lclVzYWdlIHw9IEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1pTTDsKICAgICB9Cit9CiAKK3N0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OmdldEVuZHBvaW50VXNhZ2VGb3JTdXJmYWNlKHVpbnQ2NF90ICp1c2FnZSwKKyAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpIGNvbnN0IHsKKyAgICBzdGF0dXNfdCByZXM7CisgICAgdWludDY0X3QgdSA9IDA7CisKKyAgICByZXMgPSBuYXRpdmVfd2luZG93X2dldF9jb25zdW1lcl91c2FnZShzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93Kj4oc3VyZmFjZS5nZXQoKSksICZ1KTsKKyAgICBhcHBseVpTTFVzYWdlUXVpcmsoY2FtZXJhM19zdHJlYW06OmZvcm1hdCwgJnUpOwogICAgICp1c2FnZSA9IHU7CiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTc5MiwxMSArODUxLDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHN0ZDo6dmVjdG9yPHNwPEdyYXBoaWNCdWZmZXI+PiByZW1vdmVkQnVmZmVyczsKLSAgICByZXMgPSBtQ29uc3VtZXItPmdldEFuZEZsdXNoUmVtb3ZlZEJ1ZmZlcnMoJnJlbW92ZWRCdWZmZXJzKTsKLSAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgIG9uQnVmZmVyc1JlbW92ZWRMb2NrZWQocmVtb3ZlZEJ1ZmZlcnMpOwotICAgIH0KKyAgICAvLyBIZXJlIHdlIGFzc3VtZSBkZXRhY2hCdWZmZXIgaXMgY2FsbGVkIGJ5IGJ1ZmZlciBtYW5hZ2VyIHNvIGl0IGRvZXNuJ3QgbmVlZCB0byBiZSBub3RpZmllZAorICAgIGNoZWNrUmVtb3ZlZEJ1ZmZlcnNMb2NrZWQoLypub3RpZnlCdWZmZXJNYW5hZ2VyKi9mYWxzZSk7CiAgICAgcmV0dXJuIHJlczsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaAppbmRleCA2ZjM2ZjkyLi4zMGZjMmY3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaApAQCAtMTkwLDYgKzE5MCw5IEBACiAgICAgICovCiAgICAgdmlydHVhbCBzc2l6ZV90IGdldFN1cmZhY2VJZChjb25zdCBzcDxTdXJmYWNlPiAmLypzdXJmYWNlKi8pIHsgcmV0dXJuIDA7IH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VW5pcXVlU3VyZmFjZUlkcyhjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiwKKyAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzaXplX3Q+KikgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH07CisKICAgICAvKioKICAgICAgKiBVcGRhdGUgdGhlIHN0cmVhbSBvdXRwdXQgc3VyZmFjZXMuCiAgICAgICovCkBAIC0xOTgsNiArMjAxLDExIEBACiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICZyZW1vdmVkU3VyZmFjZUlkcywKICAgICAgICAgICAgIEtleWVkVmVjdG9yPHNwPFN1cmZhY2U+LCBzaXplX3Q+ICpvdXRwdXRNYXAvKm91dCovKTsKIAorICAgIC8qKgorICAgICAqIEFwcGx5IFpTTCByZWxhdGVkIGNvbnN1bWVyIHVzYWdlIHF1aXJrLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGFwcGx5WlNMVXNhZ2VRdWlyayhpbnQgZm9ybWF0LCB1aW50NjRfdCAqY29uc3VtZXJVc2FnZSAvKmlub3V0Ki8pOworCiAgIHByb3RlY3RlZDoKICAgICBDYW1lcmEzT3V0cHV0U3RyZWFtKGludCBpZCwgY2FtZXJhM19zdHJlYW1fdHlwZV90IHR5cGUsCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LApAQCAtMjEzLDYgKzIyMSw3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KTsKIApAQCAtMjg1LDEwICsyOTQsMTEgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCk7CisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoc3A8QU5hdGl2ZVdpbmRvdz4mIGNvbnN1bWVyLAotICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlKTsKKyAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKIApAQCAtMjk5LDYgKzMwOSwxMyBAQAogICAgICAqLwogICAgIHZvaWQgb25CdWZmZXJzUmVtb3ZlZExvY2tlZChjb25zdCBzdGQ6OnZlY3RvcjxzcDxHcmFwaGljQnVmZmVyPj4mKTsKICAgICBzdGF0dXNfdCBkZXRhY2hCdWZmZXJMb2NrZWQoc3A8R3JhcGhpY0J1ZmZlcj4qIGJ1ZmZlciwgaW50KiBmZW5jZUZkKTsKKyAgICAvLyBDYWxsIHRoaXMgYWZ0ZXIgZWFjaCBkZXF1ZXVlQnVmZmVyL2F0dGFjaEJ1ZmZlci9kZXRhY2hOZXh0QnVmZmVyIGNhbGwgdG8gZ2V0IHVwZGF0ZSBvbgorICAgIC8vIHJlbW92ZWQgYnVmZmVycy4gU2V0IG5vdGlmeUJ1ZmZlck1hbmFnZXIgdG8gZmFsc2Ugd2hlbiB0aGUgY2FsbCBpcyBpbml0aWF0ZWQgYnkgYnVmZmVyCisgICAgLy8gbWFuYWdlciBzbyBidWZmZXIgbWFuYWdlciBkb2Vzbid0IG5lZWQgdG8gYmUgbm90aWZpZWQuCisgICAgdm9pZCBjaGVja1JlbW92ZWRCdWZmZXJzTG9ja2VkKGJvb2wgbm90aWZ5QnVmZmVyTWFuYWdlciA9IHRydWUpOworCisgICAgLy8gQ2hlY2sgcmV0dXJuIHN0YXR1cyBvZiBJR0JQIGNhbGxzIGFuZCBzZXQgYWJhbmRvbmVkIHN0YXRlIGFjY29yZGluZ2x5CisgICAgdm9pZCBjaGVja1JldEFuZFNldEFiYW5kb25lZExvY2tlZChzdGF0dXNfdCByZXMpOwogCiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0RlcXVldWVMYXRlbmN5QmluU2l6ZSA9IDU7IC8vIGluIG1zCiAgICAgQ2FtZXJhTGF0ZW5jeUhpc3RvZ3JhbSBtRGVxdWV1ZUJ1ZmZlckxhdGVuY3k7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oCmluZGV4IGE3MTFhNmQuLjJiZGU5NDkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oCkBAIC02Nyw2ICs2NywxOCBAQAogICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTdXJmYWNlSWQoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpID0gMDsKIAogICAgIC8qKgorICAgICAqIFF1ZXJ5IHRoZSB1bmlxdWUgc3VyZmFjZSBJRHMgb2YgY3VycmVudCBzdXJmYWNlSWRzLgorICAgICAqIFdoZW4gcGFzc2luZyB1bmlxdWUgc3VyZmFjZSBJRHMgaW4gcmV0dXJuQnVmZmVyKCksIGlmIHRoZQorICAgICAqIHN1cmZhY2VJZCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cmVhbSwgdGhlIG91dHB1dCBjb3JyZXNwb25kaW5nIHRvCisgICAgICogdGhlIHVuaXF1ZSBzdXJmYWNlIElEIHdpbGwgYmUgaWdub3JlZCBhbmQgbm90IGRlbGl2ZXJlZCB0byBjbGllbnQuCisgICAgICoKKyAgICAgKiBSZXR1cm4gSU5WQUxJRF9PUEVSQVRJT04gaWYgYW5kIG9ubHkgaWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0CisgICAgICogc3VyZmFjZSBzaGFyaW5nLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VW5pcXVlU3VyZmFjZUlkcyhjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlSWRzLAorICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHNpemVfdD4qIG91dFVuaXF1ZUlkcykgPSAwOworCisgICAgLyoqCiAgICAgICogVXBkYXRlIHRoZSBzdHJlYW0gb3V0cHV0IHN1cmZhY2VzLgogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXBkYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiAmb3V0cHV0U3VyZmFjZXMsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcAppbmRleCBmYjNjZTRjLi5lM2I3NGQ3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAKQEAgLTE0LDYgKzE0LDEwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYTMtU2hhcmVkT3VTdHJtIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKICNpbmNsdWRlICJDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTI4LDE2ICszMiwxNyBAQAogICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCiAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCiAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICBpbnQgc2V0SWQpIDoKKyAgICAgICAgaW50IHNldElkLCBib29sIHVzZUhhbEJ1Zk1hbmFnZXIpIDoKICAgICAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lclVzYWdlLCB0aW1lc3RhbXBPZmZzZXQsIHNldElkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJVc2FnZSwgdGltZXN0YW1wT2Zmc2V0LCBzZXRJZCksCisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKHVzZUhhbEJ1Zk1hbmFnZXIpIHsKICAgICBzaXplX3QgY29uc3VtZXJDb3VudCA9IHN0ZDo6bWluKHN1cmZhY2VzLnNpemUoKSwga01heE91dHB1dHMpOwogICAgIGlmIChzdXJmYWNlcy5zaXplKCkgPiBjb25zdW1lckNvdW50KSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJ5aW5nIHRvIGFkZCBtb3JlIGNvbnN1bWVycyB0aGFuIHRoZSBtYXhpbXVtICIsIF9fZnVuY19fKTsKICAgICB9CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25zdW1lckNvdW50OyBpKyspIHsKLSAgICAgICAgbVN1cmZhY2VzW2ldID0gc3VyZmFjZXNbaV07CisgICAgICAgIG1TdXJmYWNlVW5pcXVlSWRzW2ldID0gc3RkOjptYWtlX3BhaXIoc3VyZmFjZXNbaV0sIG1OZXh0VW5pcXVlU3VyZmFjZUlkKyspOwogICAgIH0KIH0KIApAQCAtNDgsMTUgKzUzLDE1IEBACiBzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpjb25uZWN0U3RyZWFtU3BsaXR0ZXJMb2NrZWQoKSB7CiAgICAgc3RhdHVzX3QgcmVzID0gT0s7CiAKLSAgICBtU3RyZWFtU3BsaXR0ZXIgPSBuZXcgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyKCk7CisgICAgbVN0cmVhbVNwbGl0dGVyID0gbmV3IENhbWVyYTNTdHJlYW1TcGxpdHRlcihtVXNlSGFsQnVmTWFuYWdlcik7CiAKICAgICB1aW50NjRfdCB1c2FnZTsKICAgICBnZXRFbmRwb2ludFVzYWdlKCZ1c2FnZSk7CiAKICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c2l6ZV90LCBzcDxTdXJmYWNlPj4gaW5pdGlhbFN1cmZhY2VzOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heE91dHB1dHM7IGkrKykgewotICAgICAgICBpZiAobVN1cmZhY2VzW2ldICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGluaXRpYWxTdXJmYWNlcy5lbXBsYWNlKGksIG1TdXJmYWNlc1tpXSk7CisgICAgICAgIGlmIChtU3VyZmFjZVVuaXF1ZUlkc1tpXS5maXJzdCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpbml0aWFsU3VyZmFjZXMuZW1wbGFjZShpLCBtU3VyZmFjZVVuaXF1ZUlkc1tpXS5maXJzdCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTcxLDYgKzc2LDMxIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6YXR0YWNoQnVmZmVyVG9TcGxpdHRlckxvY2tlZCgKKyAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcykgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgLy8gQXR0YWNoIHRoZSBidWZmZXIgdG8gdGhlIHNwbGl0dGVyIG91dHB1dCBxdWV1ZXMuIFRoaXMgY291bGQgYmxvY2sgaWYKKyAgICAvLyB0aGUgb3V0cHV0IHF1ZXVlIGRvZXNuJ3QgaGF2ZSBhbnkgZW1wdHkgc2xvdC4gU28gdW5sb2NrIGR1cmluZyB0aGUgY291cnNlCisgICAgLy8gb2YgYXR0YWNoQnVmZmVyVG9PdXRwdXRzLgorICAgIHNwPENhbWVyYTNTdHJlYW1TcGxpdHRlcj4gc3BsaXR0ZXIgPSBtU3RyZWFtU3BsaXR0ZXI7CisgICAgbUxvY2sudW5sb2NrKCk7CisgICAgcmVzID0gc3BsaXR0ZXItPmF0dGFjaEJ1ZmZlclRvT3V0cHV0cyhhbmIsIHN1cmZhY2VfaWRzKTsKKyAgICBtTG9jay5sb2NrKCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2Fubm90IGF0dGFjaCBzdHJlYW0gc3BsaXR0ZXIgYnVmZmVyIHRvIG91dHB1dHM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgLy8gT25seSB0cmFuc2l0aW9uIHRvIFNUQVRFX0FCQU5ET05FRCBmcm9tIFNUQVRFX0NPTkZJR1VSRUQuIChJZiBpdCBpcyBTVEFURV9QUkVQQVJJTkcsCisgICAgICAgIC8vIGxldCBwcmVwYXJlTmV4dEJ1ZmZlciBoYW5kbGUgdGhlIGVycm9yLikKKyAgICAgICAgaWYgKHJlcyA9PSBOT19JTklUICYmIG1TdGF0ZSA9PSBTVEFURV9DT05GSUdVUkVEKSB7CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9BQkFORE9ORUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworCiBzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpub3RpZnlCdWZmZXJSZWxlYXNlZChBTmF0aXZlV2luZG93QnVmZmVyICphbndCdWZmZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzID0gT0s7CkBAIC04OSw3ICsxMTksNyBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICByZXR1cm4gKG1TdXJmYWNlc1tzdXJmYWNlX2lkXSA9PSBudWxscHRyKTsKKyAgICByZXR1cm4gKG1TdXJmYWNlVW5pcXVlSWRzW3N1cmZhY2VfaWRdLmZpcnN0ID09IG51bGxwdHIpOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpzZXRDb25zdW1lcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBzdXJmYWNlcykgewpAQCAtMTEyLDcgKzE0Miw3IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICB9CiAKLSAgICAgICAgbVN1cmZhY2VzW2lkXSA9IHN1cmZhY2U7CisgICAgICAgIG1TdXJmYWNlVW5pcXVlSWRzW2lkXSA9IHN0ZDo6bWFrZV9wYWlyKHN1cmZhY2UsIG1OZXh0VW5pcXVlU3VyZmFjZUlkKyspOwogCiAgICAgICAgIC8vIE9ubHkgY2FsbCBhZGRPdXRwdXQgaWYgdGhlIHNwbGl0dGVyIGhhcyBiZWVuIGNvbm5lY3RlZC4KICAgICAgICAgaWYgKG1TdHJlYW1TcGxpdHRlciAhPSBudWxscHRyKSB7CkBAIC0xMjgsNyArMTU4LDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6Z2V0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcykgeworICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlSWRzKSB7CiAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iOwogICAgIGludCBmZW5jZUZkID0gLTE7CiAKQEAgLTEzOCwyMyArMTY4LDExIEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgLy8gQXR0YWNoIHRoZSBidWZmZXIgdG8gdGhlIHNwbGl0dGVyIG91dHB1dCBxdWV1ZXMuIFRoaXMgY291bGQgYmxvY2sgaWYKLSAgICAvLyB0aGUgb3V0cHV0IHF1ZXVlIGRvZXNuJ3QgaGF2ZSBhbnkgZW1wdHkgc2xvdC4gU28gdW5sb2NrIGR1cmluZyB0aGUgY291cnNlCi0gICAgLy8gb2YgYXR0YWNoQnVmZmVyVG9PdXRwdXRzLgotICAgIHNwPENhbWVyYTNTdHJlYW1TcGxpdHRlcj4gc3BsaXR0ZXIgPSBtU3RyZWFtU3BsaXR0ZXI7Ci0gICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgcmVzID0gc3BsaXR0ZXItPmF0dGFjaEJ1ZmZlclRvT3V0cHV0cyhhbmIsIHN1cmZhY2VfaWRzKTsKLSAgICBtTG9jay5sb2NrKCk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2Fubm90IGF0dGFjaCBzdHJlYW0gc3BsaXR0ZXIgYnVmZmVyIHRvIG91dHB1dHM6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgLy8gT25seSB0cmFuc2l0aW9uIHRvIFNUQVRFX0FCQU5ET05FRCBmcm9tIFNUQVRFX0NPTkZJR1VSRUQuIChJZiBpdCBpcyBTVEFURV9QUkVQQVJJTkcsCi0gICAgICAgIC8vIGxldCBwcmVwYXJlTmV4dEJ1ZmZlciBoYW5kbGUgdGhlIGVycm9yLikKLSAgICAgICAgaWYgKHJlcyA9PSBOT19JTklUICYmIG1TdGF0ZSA9PSBTVEFURV9DT05GSUdVUkVEKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9BQkFORE9ORUQ7CisgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICByZXMgPSBhdHRhY2hCdWZmZXJUb1NwbGl0dGVyTG9ja2VkKGFuYiwgc3VyZmFjZUlkcyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY4LDggKzE4NiwzOCBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoc3A8QU5hdGl2ZVdpbmRvdz4mIGNvbnN1bWVyLAotICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlKSB7Ci0gICAgc3RhdHVzX3QgcmVzID0gY29uc3VtZXItPnF1ZXVlQnVmZmVyKGNvbnN1bWVyLmdldCgpLCBidWZmZXIsIGFud1JlbGVhc2VGZW5jZSk7CisgICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiB1bmlxdWVTdXJmYWNlSWRzKSB7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgaWYgKG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIGlmICh1bmlxdWVTdXJmYWNlSWRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHVuaXF1ZVN1cmZhY2VJZHMgbXVzdCBub3QgYmUgZW1wdHkhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IHN1cmZhY2VJZHM7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgdW5pcXVlSWQgOiB1bmlxdWVTdXJmYWNlSWRzKSB7CisgICAgICAgICAgICBib29sIHVuaXF1ZUlkRm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heE91dHB1dHM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtU3VyZmFjZVVuaXF1ZUlkc1tpXS5zZWNvbmQgPT0gdW5pcXVlSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VyZmFjZUlkcy5wdXNoX2JhY2soaSk7CisgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXVuaXF1ZUlkRm91bmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6IHVua25vd24gdW5pcXVlIHN1cmZhY2UgSUQgJXp1IGZvciBzdHJlYW0gJWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQgbWlnaHQgaGF2ZSBiZWVuIHJlbW92ZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdW5pcXVlSWQsIG1JZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gYXR0YWNoQnVmZmVyVG9TcGxpdHRlckxvY2tlZChidWZmZXIsIHN1cmZhY2VJZHMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzID0gY29uc3VtZXItPnF1ZXVlQnVmZmVyKGNvbnN1bWVyLmdldCgpLCBidWZmZXIsIGFud1JlbGVhc2VGZW5jZSk7CiAKICAgICAvLyBBZnRlciBxdWV1aW5nIGJ1ZmZlciB0byB0aGUgaW50ZXJuYWwgY29uc3VtZXIgcXVldWUsIGNoZWNrIHdoZXRoZXIgdGhlIGJ1ZmZlciBpcwogICAgIC8vIHN1Y2Nlc3NmdWxseSBxdWV1ZWQgdG8gdGhlIG91dHB1dCBxdWV1ZXMuCkBAIC0yMjgsOCArMjc2LDggQEAKICAgICAgICAgKnVzYWdlID0gZ2V0UHJlc2V0Q29uc3VtZXJVc2FnZSgpOwogCiAgICAgICAgIGZvciAoc2l6ZV90IGlkID0gMDsgaWQgPCBrTWF4T3V0cHV0czsgaWQrKykgewotICAgICAgICAgICAgaWYgKG1TdXJmYWNlc1tpZF0gIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIHJlcyA9IGdldEVuZHBvaW50VXNhZ2VGb3JTdXJmYWNlKCZ1LCBtU3VyZmFjZXNbaWRdKTsKKyAgICAgICAgICAgIGlmIChtU3VyZmFjZVVuaXF1ZUlkc1tpZF0uZmlyc3QgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJlcyA9IGdldEVuZHBvaW50VXNhZ2VGb3JTdXJmYWNlKCZ1LCBtU3VyZmFjZVVuaXF1ZUlkc1tpZF0uZmlyc3QpOwogICAgICAgICAgICAgICAgICp1c2FnZSB8PSB1OwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yNDUsNyArMjkzLDcgQEAKIHNzaXplX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6Z2V0TmV4dFN1cmZhY2VJZExvY2tlZCgpIHsKICAgICBzc2l6ZV90IGlkID0gLTE7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4T3V0cHV0czsgaSsrKSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZXNbaV0gPT0gbnVsbHB0cikgeworICAgICAgICBpZiAobVN1cmZhY2VVbmlxdWVJZHNbaV0uZmlyc3QgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgaWQgPSBpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTI1OCw3ICszMDYsNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICBzc2l6ZV90IGlkID0gLTE7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4T3V0cHV0czsgaSsrKSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZXNbaV0gPT0gc3VyZmFjZSkgeworICAgICAgICBpZiAobVN1cmZhY2VVbmlxdWVJZHNbaV0uZmlyc3QgPT0gc3VyZmFjZSkgewogICAgICAgICAgICAgaWQgPSBpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTI2Nyw2ICszMTUsMjYgQEAKICAgICByZXR1cm4gaWQ7CiB9CiAKK3N0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OmdldFVuaXF1ZVN1cmZhY2VJZHMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VJZHMsCisgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzaXplX3Q+KiBvdXRVbmlxdWVJZHMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgaWYgKG91dFVuaXF1ZUlkcyA9PSBudWxscHRyIHx8IHN1cmZhY2VJZHMuc2l6ZSgpID4ga01heE91dHB1dHMpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBvdXRVbmlxdWVJZHMtPmNsZWFyKCk7CisgICAgb3V0VW5pcXVlSWRzLT5yZXNlcnZlKHN1cmZhY2VJZHMuc2l6ZSgpKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgc3VyZmFjZUlkIDogc3VyZmFjZUlkcykgeworICAgICAgICBpZiAoc3VyZmFjZUlkID49IGtNYXhPdXRwdXRzKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIG91dFVuaXF1ZUlkcy0+cHVzaF9iYWNrKG1TdXJmYWNlVW5pcXVlSWRzW3N1cmZhY2VJZF0uc2Vjb25kKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpyZXZlcnRQYXJ0aWFsVXBkYXRlTG9ja2VkKAogICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAmcmVtb3ZlZFN1cmZhY2VzLAogICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAmYXR0YWNoZWRTdXJmYWNlcykgewpAQCAtMjgwLDcgKzM0OCw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbVN1cmZhY2VzW2luZGV4XSA9IG51bGxwdHI7CisgICAgICAgIG1TdXJmYWNlVW5pcXVlSWRzW2luZGV4XSA9IHN0ZDo6bWFrZV9wYWlyKG51bGxwdHIsIG1OZXh0VW5pcXVlU3VyZmFjZUlkKyspOwogICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVtb3ZlZFN1cmZhY2VzLnNpemUoKTsgaSsrKSB7CkBAIC0yOTEsNyArMzU5LDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtU3VyZmFjZXNbaW5kZXhdID0gcmVtb3ZlZFN1cmZhY2VzLmtleUF0KGkpOworICAgICAgICBtU3VyZmFjZVVuaXF1ZUlkc1tpbmRleF0gPSBzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICByZW1vdmVkU3VyZmFjZXMua2V5QXQoaSksIG1OZXh0VW5pcXVlU3VyZmFjZUlkKyspOwogICAgIH0KIAogICAgIHJldHVybiByZXQ7CkBAIC0zNDMsOCArNDEyLDggQEAKIAogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1TdXJmYWNlc1tpdF0gPSBudWxscHRyOwotICAgICAgICByZW1vdmVkU3VyZmFjZXMuYWRkKG1TdXJmYWNlc1tpdF0sIGl0KTsKKyAgICAgICAgcmVtb3ZlZFN1cmZhY2VzLmFkZChtU3VyZmFjZVVuaXF1ZUlkc1tpdF0uZmlyc3QsIGl0KTsKKyAgICAgICAgbVN1cmZhY2VVbmlxdWVJZHNbaXRdID0gc3RkOjptYWtlX3BhaXIobnVsbHB0ciwgbU5leHRVbmlxdWVTdXJmYWNlSWQrKyk7CiAgICAgfQogCiAgICAgLy9OZXh0IGFkZCB0aGUgbmV3IG91dHB1dHMKQEAgLTM2OSw3ICs0MzgsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbVN1cmZhY2VzW3N1cmZhY2VJZF0gPSBpdDsKKyAgICAgICAgbVN1cmZhY2VVbmlxdWVJZHNbc3VyZmFjZUlkXSA9IHN0ZDo6bWFrZV9wYWlyKGl0LCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKICAgICAgICAgb3V0cHV0TWFwLT5hZGQoaXQsIHN1cmZhY2VJZCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oCmluZGV4IDAyYjFjMDkuLmI1ZTM3YzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkEzX1NIQVJFRF9PVVRQVVRfU1RSRUFNX0gKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfU0hBUkVEX09VVFBVVF9TVFJFQU1fSAogCisjaW5jbHVkZSA8YXJyYXk+CiAjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgiCiAjaW5jbHVkZSAiQ2FtZXJhM091dHB1dFN0cmVhbS5oIgogCkBAIC0zNyw3ICszOCw4IEBACiAgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCiAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCk7CisgICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwKKyAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlciA9IGZhbHNlKTsKIAogICAgIHZpcnR1YWwgfkNhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0oKTsKIApAQCAtNDksNiArNTEsMTUgQEAKIAogICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTdXJmYWNlSWQoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpOwogCisgICAgLyoqCisgICAgICogUXVlcnkgdGhlIHVuaXF1ZSBzdXJmYWNlIElEcyBvZiBjdXJyZW50IHN1cmZhY2VJZHMuCisgICAgICogV2hlbiBwYXNzaW5nIHVuaXF1ZSBzdXJmYWNlIElEcyBpbiByZXR1cm5CdWZmZXIoKSwgaWYgdGhlCisgICAgICogc3VyZmFjZUlkIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RyZWFtLCB0aGUgb3V0cHV0IGNvcnJlc3BvbmRpbmcgdG8KKyAgICAgKiB0aGUgdW5pcXVlIHN1cmZhY2UgSUQgd2lsbCBiZSBpZ25vcmVkIGFuZCBub3QgZGVsaXZlcmVkIHRvIGNsaWVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVuaXF1ZVN1cmZhY2VJZHMoY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZUlkcywKKyAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzaXplX3Q+KiBvdXRVbmlxdWVJZHMpIG92ZXJyaWRlOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+ICZvdXRwdXRTdXJmYWNlcywKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+ICZvdXRwdXRJbmZvLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmcmVtb3ZlZFN1cmZhY2VJZHMsCkBAIC01OCw4ICs2OSwxNyBAQAogCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4T3V0cHV0cyA9IDQ7CiAKLSAgICAvLyBNYXAgc3VyZmFjZUlkIC0+IG91dHB1dCBzdXJmYWNlcwotICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlc1trTWF4T3V0cHV0c107CisgICAgLy8gV2hldGhlciBIQUwgaXMgaW4gY29udHJvbCBmb3IgYnVmZmVyIG1hbmFnZW1lbnQuIFN1cmZhY2Ugc2hhcmluZyBiZWhhdmlvcgorICAgIC8vIGRlcGVuZHMgb24gdGhpcyBmbGFnLgorICAgIGNvbnN0IGJvb2wgbVVzZUhhbEJ1Zk1hbmFnZXI7CisKKyAgICAvLyBQYWlyIG9mIGFuIG91dHB1dCBTdXJmYWNlIGFuZCBpdHMgdW5pcXVlIElECisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8c3A8U3VyZmFjZT4sIHNpemVfdD4gU3VyZmFjZVVuaXF1ZUlkOworCisgICAgLy8gTWFwIHN1cmZhY2VJZCAtPiAob3V0cHV0IHN1cmZhY2UsIHVuaXF1ZSBzdXJmYWNlIElEKQorICAgIHN0ZDo6YXJyYXk8U3VyZmFjZVVuaXF1ZUlkLCBrTWF4T3V0cHV0cz4gbVN1cmZhY2VVbmlxdWVJZHM7CisKKyAgICBzaXplX3QgbU5leHRVbmlxdWVTdXJmYWNlSWQgPSAwOwogCiAgICAgc3NpemVfdCBnZXROZXh0U3VyZmFjZUlkTG9ja2VkKCk7CiAKQEAgLTc4LDEzICs5OCwyNCBAQAogICAgIHN0YXR1c190IGNvbm5lY3RTdHJlYW1TcGxpdHRlckxvY2tlZCgpOwogCiAgICAgLyoqCisgICAgICogQXR0YWNoIHRoZSBvdXRwdXQgYnVmZmVyIHRvIHN0cmVhbSBzcGxpdHRlci4KKyAgICAgKiBXaGVuIGNhbWVyYSBzZXJ2aWNlIGlzIGRvaW5nIGJ1ZmZlciBtYW5hZ2VtZW50LCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZAorICAgICAqIGJlZm9yZSB0aGUgYnVmZmVyIGlzIGhhbmRlZCBvdXQgdG8gSEFMIGluIHJlcXVlc3QgdGhyZWFkLgorICAgICAqIFdoZW4gSEFMIGlzIGRvaW5nIGJ1ZmZlciBtYW5hZ2VtZW50LCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuCisgICAgICogdGhlIGJ1ZmZlciBpcyByZXR1cm5lZCBmcm9tIEhBTCBpbiBod2JpbmRlciBjYWxsYmFjayB0aHJlYWQuCisgICAgICovCisgICAgc3RhdHVzX3QgYXR0YWNoQnVmZmVyVG9TcGxpdHRlckxvY2tlZChBTmF0aXZlV2luZG93QnVmZmVyKiBhbmIsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyk7CisKKyAgICAvKioKICAgICAgKiBJbnRlcm5hbCBDYW1lcmEzU3RyZWFtIGludGVyZmFjZQogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoc3A8QU5hdGl2ZVdpbmRvdz4mIGNvbnN1bWVyLAotICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlKTsKKyAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHVuaXF1ZVN1cmZhY2VJZHMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAppbmRleCA3ZWJjMjk5Li4wNTcxNzQxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKQEAgLTY3LDcgKzY3LDggQEAKICAgICBtQnVmZmVyTGltaXRMYXRlbmN5KGtCdWZmZXJMaW1pdExhdGVuY3lCaW5TaXplKSwKICAgICBtRm9ybWF0T3ZlcnJpZGRlbihmYWxzZSksCiAgICAgbU9yaWdpbmFsRm9ybWF0KC0xKSwKLSAgICBtUGh5c2ljYWxDYW1lcmFJZChwaHlzaWNhbENhbWVyYUlkKSB7CisgICAgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCksCisgICAgbUxhc3RUaW1lc3RhbXAoMCkgewogCiAgICAgY2FtZXJhM19zdHJlYW06OnN0cmVhbV90eXBlID0gdHlwZTsKICAgICBjYW1lcmEzX3N0cmVhbTo6d2lkdGggPSB3aWR0aDsKQEAgLTU4Nyw3ICs1ODgsMTEgQEAKICAgICBpZiAobVN0YXRlICE9IFNUQVRFX0NPTkZJR1VSRUQpIHsKICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IGdldCBidWZmZXJzIGlmIHN0cmVhbSBpcyBub3QgaW4gQ09ORklHVVJFRCBzdGF0ZSAlZCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIG1TdGF0ZSk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQkFORE9ORUQpIHsKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIFdhaXQgZm9yIG5ldyBidWZmZXIgcmV0dXJuZWQgYmFjayBpZiB3ZSBhcmUgcnVubmluZyBpbnRvIHRoZSBsaW1pdC4KQEAgLTY1NCw3ICs2NTksOCBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpyZXR1cm5CdWZmZXIoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7CisgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywgdWludDY0X3QgZnJhbWVOdW1iZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIApAQCAtNjY2LDYgKzY3MiwxNSBAQAogCiAgICAgcmVtb3ZlT3V0c3RhbmRpbmdCdWZmZXIoYnVmZmVyKTsKIAorICAgIC8vIEJ1ZmZlciBzdGF0dXMgbWF5IGJlIGNoYW5nZWQsIHNvIG1ha2UgYSBjb3B5IG9mIHRoZSBzdHJlYW1fYnVmZmVyIHN0cnVjdC4KKyAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXIgYiA9IGJ1ZmZlcjsKKyAgICBpZiAodGltZXN0YW1wSW5jcmVhc2luZyAmJiB0aW1lc3RhbXAgIT0gMCAmJiB0aW1lc3RhbXAgPD0gbUxhc3RUaW1lc3RhbXApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IHRpbWVzdGFtcCAlIiBQUklkNjQgIiBpcyBub3QgaW5jcmVhc2luZy4gUHJldiB0aW1lc3RhbXAgJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCB0aW1lc3RhbXAsIG1MYXN0VGltZXN0YW1wKTsKKyAgICAgICAgYi5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgfQorICAgIG1MYXN0VGltZXN0YW1wID0gdGltZXN0YW1wOworCiAgICAgLyoqCiAgICAgICogVE9ETzogQ2hlY2sgdGhhdCB0aGUgc3RhdGUgaXMgdmFsaWQgZmlyc3QuCiAgICAgICoKQEAgLTY3NCw5ICs2ODksOSBAQAogICAgICAqCiAgICAgICogRG8gdGhpcyBmb3IgZ2V0QnVmZmVyIGFzIHdlbGwuCiAgICAgICovCi0gICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQnVmZmVyTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wKTsKKyAgICBzdGF0dXNfdCByZXMgPSByZXR1cm5CdWZmZXJMb2NrZWQoYiwgdGltZXN0YW1wLCBzdXJmYWNlX2lkcyk7CiAgICAgaWYgKHJlcyA9PSBPSykgewotICAgICAgICBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKGJ1ZmZlciwgLyphY3F1aXJlZCovZmFsc2UsIC8qb3V0cHV0Ki90cnVlKTsKKyAgICAgICAgZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZChiLCAvKmFjcXVpcmVkKi9mYWxzZSwgLypvdXRwdXQqL3RydWUsIHRpbWVzdGFtcCwgZnJhbWVOdW1iZXIpOwogICAgIH0KIAogICAgIC8vIEV2ZW4gaWYgcmV0dXJuaW5nIHRoZSBidWZmZXIgZmFpbGVkLCB3ZSBzdGlsbCB3YW50IHRvIHNpZ25hbCB3aG9ldmVyIGlzIHdhaXRpbmcgZm9yIHRoZQpAQCAtNzUyLDggKzc2NywyMiBAQAogICAgIHJldHVybiBnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyTG9ja2VkKHByb2R1Y2VyKTsKIH0KIAordm9pZCBDYW1lcmEzU3RyZWFtOjpmaXJlQnVmZmVyUmVxdWVzdEZvckZyYW1lTnVtYmVyKHVpbnQ2NF90IGZyYW1lTnVtYmVyLAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIGZvciAoYXV0byAmaXQgOiBtQnVmZmVyTGlzdGVuZXJMaXN0KSB7CisgICAgICAgIHNwPENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lcj4gbGlzdGVuZXIgPSBpdC5wcm9tb3RlKCk7CisgICAgICAgIGlmIChsaXN0ZW5lci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25CdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIoZnJhbWVOdW1iZXIsIGdldElkKCksIHNldHRpbmdzKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogdm9pZCBDYW1lcmEzU3RyZWFtOjpmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKAotICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXImIGJ1ZmZlciwgYm9vbCBhY3F1aXJlZCwgYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyJiBidWZmZXIsIGJvb2wgYWNxdWlyZWQsIGJvb2wgb3V0cHV0LCBuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgdWludDY0X3QgZnJhbWVOdW1iZXIpIHsKICAgICBMaXN0PHdwPENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lcj4gPjo6aXRlcmF0b3IgaXQsIGVuZDsKIAogICAgIC8vIFRPRE86IGZpbmlzaCBpbXBsZW1lbnRpbmcKQEAgLTc2Miw2ICs3OTEsOCBAQAogICAgICAgICBDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI6OkJ1ZmZlckluZm8oKTsKICAgICBpbmZvLm1PdXRwdXQgPSBvdXRwdXQ7CiAgICAgaW5mby5tRXJyb3IgPSAoYnVmZmVyLnN0YXR1cyA9PSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IpOworICAgIGluZm8ubUZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgaW5mby5tVGltZXN0YW1wID0gdGltZXN0YW1wOwogICAgIC8vIFRPRE86IHJlc3Qgb2YgZmllbGRzCiAKICAgICBmb3IgKGl0ID0gbUJ1ZmZlckxpc3RlbmVyTGlzdC5iZWdpbigpLCBlbmQgPSBtQnVmZmVyTGlzdGVuZXJMaXN0LmVuZCgpOwpAQCAtNzg1LDYgKzgxNiwxMiBAQAogICAgIHJldHVybiBoYXNPdXRzdGFuZGluZ0J1ZmZlcnNMb2NrZWQoKTsKIH0KIAorc2l6ZV90IENhbWVyYTNTdHJlYW06OmdldE91dHN0YW5kaW5nQnVmZmVyc0NvdW50KCkgY29uc3QgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHJldHVybiBnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6c2V0U3RhdHVzVHJhY2tlcihzcDxTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIHNwPFN0YXR1c1RyYWNrZXI+IG9sZFRyYWNrZXIgPSBtU3RhdHVzVHJhY2tlci5wcm9tb3RlKCk7CkBAIC04MjcsNyArODY0LDcgQEAKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpyZXR1cm5CdWZmZXJMb2NrZWQoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mKSB7CiAgICAgQUxPR0UoIiVzOiBUaGlzIHR5cGUgb2Ygc3RyZWFtIGRvZXMgbm90IHN1cHBvcnQgb3V0cHV0IiwgX19GVU5DVElPTl9fKTsKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCmluZGV4IDAzNTU5NzguLjVlYjZhMjMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCkBAIC0zMjIsMTEgKzMyMiwxOCBAQAogICAgIC8qKgogICAgICAqIFJldHVybiBhIGJ1ZmZlciB0byB0aGUgc3RyZWFtIGFmdGVyIHVzZSBieSB0aGUgSEFMLgogICAgICAqCisgICAgICogTXVsdGlwbGUgc3VyZmFjZXMgY291bGQgc2hhcmUgdGhlIHNhbWUgSEFMIHN0cmVhbSwgYnV0IGEgcmVxdWVzdCBtYXkKKyAgICAgKiBiZSBvbmx5IGZvciBhIHN1YnNldCBvZiBzdXJmYWNlcy4gSW4gdGhpcyBjYXNlLCB0aGUKKyAgICAgKiBDYW1lcmEzU3RyZWFtSW50ZXJmYWNlIG9iamVjdCBuZWVkcyB0aGUgc3VyZmFjZSBJRCBpbmZvcm1hdGlvbiB0byBhdHRhY2gKKyAgICAgKiBidWZmZXJzIGZvciB0aG9zZSBzdXJmYWNlcy4KKyAgICAgKgogICAgICAqIFRoaXMgbWV0aG9kIG1heSBvbmx5IGJlIGNhbGxlZCBmb3IgYnVmZmVycyBwcm92aWRlZCBieSBnZXRCdWZmZXIoKS4KICAgICAgKiBGb3IgYmlkaXJlY3Rpb25hbCBzdHJlYW1zLCB0aGlzIG1ldGhvZCBhcHBsaWVzIHRvIHRoZSBvdXRwdXQtc2lkZSBidWZmZXJzCiAgICAgICovCiAgICAgc3RhdHVzX3QgICAgICAgICByZXR1cm5CdWZmZXIoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCk7CisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCksCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZU51bWJlciA9IDApOwogCiAgICAgLyoqCiAgICAgICogRmlsbCBpbiB0aGUgY2FtZXJhM19zdHJlYW1fYnVmZmVyIHdpdGggdGhlIG5leHQgdmFsaWQgYnVmZmVyIGZvciB0aGlzCkBAIC0zNjAsNiArMzY3LDExIEBACiAgICAgICovCiAgICAgYm9vbCAgICAgICAgICAgICBoYXNPdXRzdGFuZGluZ0J1ZmZlcnMoKSBjb25zdDsKIAorICAgIC8qKgorICAgICAqIEdldCBudW1iZXIgb2YgYnVmZmVycyBjdXJyZW50bHkgaGFuZGVkIG91dCB0byBIQUwKKyAgICAgKi8KKyAgICBzaXplX3QgICAgICAgICAgIGdldE91dHN0YW5kaW5nQnVmZmVyc0NvdW50KCkgY29uc3Q7CisKICAgICBlbnVtIHsKICAgICAgICAgVElNRU9VVF9ORVZFUiA9IC0xCiAgICAgfTsKQEAgLTQxOSw2ICs0MzEsMTIgQEAKICAgICAgKi8KICAgICBzdGF0dXNfdCAgICAgICAgIHJlc3RvcmVDb25maWd1cmVkU3RhdGUoKTsKIAorICAgIC8qKgorICAgICAqIE5vdGlmeSBidWZmZXIgc3RyZWFtIGxpc3RlbmVycyBhYm91dCBpbmNvbWluZyByZXF1ZXN0IHdpdGggcGFydGljdWxhciBmcmFtZSBudW1iZXIuCisgICAgICovCisgICAgdm9pZCBmaXJlQnVmZmVyUmVxdWVzdEZvckZyYW1lTnVtYmVyKHVpbnQ2NF90IGZyYW1lTnVtYmVyLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKSBvdmVycmlkZTsKKwogICBwcm90ZWN0ZWQ6CiAgICAgY29uc3QgaW50IG1JZDsKICAgICAvKioKQEAgLTQ3Myw3ICs0OTEsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCkpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyTG9ja2VkKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlcik7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5JbnB1dEJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyKTsKQEAgLTQ5NSw3ICs1MTQsNyBAQAogICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0QnVmZmVyQ291bnRMb2NrZWQoKSA9IDA7CiAKICAgICAvLyBHZXQgaGFuZG91dCBvdXRwdXQgYnVmZmVyIGNvdW50LgotICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPSAwOworICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgY29uc3QgPSAwOwogCiAgICAgLy8gR2V0IGhhbmRvdXQgaW5wdXQgYnVmZmVyIGNvdW50LgogICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dElucHV0QnVmZmVyQ291bnRMb2NrZWQoKSA9IDA7CkBAIC01MjYsNyArNTQ1LDcgQEAKICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrV2FpdEZvckJ1ZmZlckR1cmF0aW9uID0gMzAwMDAwMDAwMExMOyAvLyAzMDAwIG1zCiAKICAgICB2b2lkIGZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyJiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhY3F1aXJlZCwgYm9vbCBvdXRwdXQpOworICAgICAgICAgICAgYm9vbCBhY3F1aXJlZCwgYm9vbCBvdXRwdXQsIG5zZWNzX3QgdGltZXN0YW1wID0gMCwgdWludDY0X3QgZnJhbWVOdW1iZXIgPSAwKTsKICAgICBMaXN0PHdwPENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lcj4gPiBtQnVmZmVyTGlzdGVuZXJMaXN0OwogCiAgICAgc3RhdHVzX3QgICAgICAgIGNhbmNlbFByZXBhcmVMb2NrZWQoKTsKQEAgLTU2Niw2ICs1ODUsNyBAQAogICAgIGFuZHJvaWRfZGF0YXNwYWNlIG1PcmlnaW5hbERhdGFTcGFjZTsKIAogICAgIFN0cmluZzggbVBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgbnNlY3NfdCBtTGFzdFRpbWVzdGFtcDsKIH07IC8vIGNsYXNzIENhbWVyYTNTdHJlYW0KIAogfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lci5oCmluZGV4IDJkYjMzM2QuLmQwYWVlMjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIuaApAQCAtMTcsNiArMTcsNyBAQAogI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19TVFJFQU1CVUZGRVJMSVNURU5FUl9ICiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkEzX1NUUkVBTUJVRkZFUkxJU1RFTkVSX0gKIAorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCkBAIC00MSw2ICs0Miw5IEBACiAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyQWNxdWlyZWQoY29uc3QgQnVmZmVySW5mbyYgYnVmZmVySW5mbykgPSAwOwogICAgIC8vIEJ1ZmZlciB3YXMgcmVsZWFzZWQgYnkgdGhlIEhBTAogICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlclJlbGVhc2VkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pID0gMDsKKyAgICAvLyBOb3RpZnkgYWJvdXQgaW5jb21pbmcgYnVmZmVyIHJlcXVlc3QgZnJhbWUgbnVtYmVyCisgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyUmVxdWVzdEZvckZyYW1lTnVtYmVyKHVpbnQ2NF90IGZyYW1lTnVtYmVyLCBpbnQgc3RyZWFtSWQsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpID0gMDsKIH07CiAKIH07IC8vbmFtZXNwYWNlIGNhbWVyYTMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKaW5kZXggM2Q0NWM4OS4uNWNkMTFiNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKQEAgLTE4LDYgKzE4LDggQEAKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfU1RSRUFNX0lOVEVSRkFDRV9ICiAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KICNpbmNsdWRlICJDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIuaCIKICNpbmNsdWRlICJDYW1lcmEzU3RyZWFtQnVmZmVyRnJlZWRMaXN0ZW5lci5oIgogCkBAIC0yNDgsMTEgKzI1MCwxOSBAQAogICAgIC8qKgogICAgICAqIFJldHVybiBhIGJ1ZmZlciB0byB0aGUgc3RyZWFtIGFmdGVyIHVzZSBieSB0aGUgSEFMLgogICAgICAqCisgICAgICogTXVsdGlwbGUgc3VyZmFjZXMgY291bGQgc2hhcmUgdGhlIHNhbWUgSEFMIHN0cmVhbSwgYnV0IGEgcmVxdWVzdCBtYXkKKyAgICAgKiBiZSBvbmx5IGZvciBhIHN1YnNldCBvZiBzdXJmYWNlcy4gSW4gdGhpcyBjYXNlLCB0aGUKKyAgICAgKiBDYW1lcmEzU3RyZWFtSW50ZXJmYWNlIG9iamVjdCBuZWVkcyB0aGUgc3VyZmFjZSBJRCBpbmZvcm1hdGlvbiB0byBhdHRhY2gKKyAgICAgKiBidWZmZXJzIGZvciB0aG9zZSBzdXJmYWNlcy4gRm9yIHRoZSBjYXNlIG9mIHNpbmdsZSBzdXJmYWNlIGZvciBhIEhBTAorICAgICAqIHN0cmVhbSwgc3VyZmFjZV9pZHMgcGFyYW1ldGVyIGhhcyBubyBlZmZlY3QuCisgICAgICoKICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgb25seSBiZSBjYWxsZWQgZm9yIGJ1ZmZlcnMgcHJvdmlkZWQgYnkgZ2V0QnVmZmVyKCkuCiAgICAgICogRm9yIGJpZGlyZWN0aW9uYWwgc3RyZWFtcywgdGhpcyBtZXRob2QgYXBwbGllcyB0byB0aGUgb3V0cHV0LXNpZGUgYnVmZmVycwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApID0gMDsKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcgPSB0cnVlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCksCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZU51bWJlciA9IDApID0gMDsKIAogICAgIC8qKgogICAgICAqIEZpbGwgaW4gdGhlIGNhbWVyYTNfc3RyZWFtX2J1ZmZlciB3aXRoIHRoZSBuZXh0IHZhbGlkIGJ1ZmZlciBmb3IgdGhpcwpAQCAtMjg5LDYgKzI5OSwxMSBAQAogICAgICAqLwogICAgIHZpcnR1YWwgYm9vbCAgICAgaGFzT3V0c3RhbmRpbmdCdWZmZXJzKCkgY29uc3QgPSAwOwogCisgICAgLyoqCisgICAgICogR2V0IG51bWJlciBvZiBidWZmZXJzIGN1cnJlbnRseSBoYW5kZWQgb3V0IHRvIEhBTAorICAgICAqLworICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSBjb25zdCA9IDA7CisKICAgICBlbnVtIHsKICAgICAgICAgVElNRU9VVF9ORVZFUiA9IC0xCiAgICAgfTsKQEAgLTMyOSw2ICszNDQsMTIgQEAKICAgICAgKiBDYW1lcmEzU3RyZWFtLgogICAgICAqLwogICAgIHZpcnR1YWwgdm9pZCBzZXRCdWZmZXJGcmVlZExpc3RlbmVyKHdwPENhbWVyYTNTdHJlYW1CdWZmZXJGcmVlZExpc3RlbmVyPiBsaXN0ZW5lcikgPSAwOworCisgICAgLyoqCisgICAgICogTm90aWZ5IGJ1ZmZlciBzdHJlYW0gbGlzdGVuZXJzIGFib3V0IGluY29taW5nIHJlcXVlc3Qgd2l0aCBwYXJ0aWN1bGFyIGZyYW1lIG51bWJlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgZmlyZUJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXR0aW5ncykgPSAwOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2FtZXJhMwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwCmluZGV4IGVjYjk4MGEuLjg0YzJlYzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAKQEAgLTE1Miw2ICsxNTIsOCBAQAogICAgIFNQX0xPR1YoIiVzOiBEaXNjb25uZWN0ZWQiLCBfX0ZVTkNUSU9OX18pOwogfQogCitDYW1lcmEzU3RyZWFtU3BsaXR0ZXI6OkNhbWVyYTNTdHJlYW1TcGxpdHRlcihib29sIHVzZUhhbEJ1Zk1hbmFnZXIpIDoKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIodXNlSGFsQnVmTWFuYWdlcikge30KIAogQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjp+Q2FtZXJhM1N0cmVhbVNwbGl0dGVyKCkgewogICAgIGRpc2Nvbm5lY3QoKTsKQEAgLTI0MSw3ICsyNDMsOSBAQAogICAgIHVpbnQ2NF90IHVzYWdlID0gMDsKICAgICByZXMgPSBuYXRpdmVfd2luZG93X2dldF9jb25zdW1lcl91c2FnZShzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93Kj4ob3V0cHV0UXVldWUuZ2V0KCkpLCAmdXNhZ2UpOwogICAgIGlmICghKHVzYWdlICYgKEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIgfCBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUpKSkgewotICAgICAgICBvdXRwdXRRdWV1ZS0+c2V0RGVxdWV1ZVRpbWVvdXQoa0RlcXVldWVCdWZmZXJUaW1lb3V0KTsKKyAgICAgICAgbnNlY3NfdCB0aW1lb3V0ID0gbVVzZUhhbEJ1Zk1hbmFnZXIgPworICAgICAgICAgICAgICAgIGtIYWxCdWZNZ3JEZXF1ZXVlQnVmZmVyVGltZW91dCA6IGtOb3JtYWxEZXF1ZXVlQnVmZmVyVGltZW91dDsKKyAgICAgICAgb3V0cHV0UXVldWUtPnNldERlcXVldWVUaW1lb3V0KHRpbWVvdXQpOwogICAgIH0KIAogICAgIHJlcyA9IGdicC0+YWxsb3dBbGxvY2F0aW9uKGZhbHNlKTsKQEAgLTQzNiw4ICs0NDAsOSBAQAogICAgICAgICByZXMgPSBnYnAtPmF0dGFjaEJ1ZmZlcigmc2xvdCwgZ2IpOwogICAgICAgICBtTXV0ZXgubG9jaygpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBTUF9MT0dFKCIlczogQ2Fubm90IGFjcXVpcmVCdWZmZXIgZnJvbSBHcmFwaGljQnVmZmVyUHJvZHVjZXIgJXA6ICVzICglZCkiLAorICAgICAgICAgICAgU1BfTE9HRSgiJXM6IENhbm5vdCBhdHRhY2hCdWZmZXIgZnJvbSBHcmFwaGljQnVmZmVyUHJvZHVjZXIgJXA6ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGdicC5nZXQoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAvLyBUT0RPOiBtaWdodCBuZWVkIHRvIGRldGFjaC9jbGVhbnVwIHRoZSBhbHJlYWR5IGF0dGFjaGVkIGJ1ZmZlcnMgYmVmb3JlIHJldHVybj8KICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChzbG90IDwgMCkgfHwgKHNsb3QgPiBCdWZmZXJRdWV1ZTo6TlVNX0JVRkZFUl9TTE9UUykpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oCmluZGV4IDFlYWYyYmQuLjk2MGY3YWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaApAQCAtNDksNyArNDksNyBAQAogcHVibGljOgogCiAgICAgLy8gQ29uc3RydWN0b3IKLSAgICBDYW1lcmEzU3RyZWFtU3BsaXR0ZXIoKSA9IGRlZmF1bHQ7CisgICAgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyKGJvb2wgdXNlSGFsQnVmTWFuYWdlciA9IGZhbHNlKTsKIAogICAgIC8vIENvbm5lY3QgdG8gdGhlIHN0cmVhbSBzcGxpdHRlciBieSBjcmVhdGluZyBidWZmZXIgcXVldWUgYW5kIGNvbm5lY3RpbmcgaXQKICAgICAvLyB3aXRoIG91dHB1dCBzdXJmYWNlcy4KQEAgLTIyNiw3ICsyMjYsMTAgQEAKICAgICBhbmRyb2lkOjpQaXhlbEZvcm1hdCBtRm9ybWF0ID0gYW5kcm9pZDo6UElYRUxfRk9STUFUX05PTkU7CiAgICAgdWludDY0X3QgbVByb2R1Y2VyVXNhZ2UgPSAwOwogCi0gICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga0RlcXVldWVCdWZmZXJUaW1lb3V0ICAgPSBzMm5zKDEpOyAvLyAxIHNlYworICAgIC8vIFRoZSBhdHRhY2hCdWZmZXIgY2FsbCB3aWxsIGhhcHBlbiBvbiBkaWZmZXJlbnQgdGhyZWFkIGFjY29yZGluZyB0byBtVXNlSGFsQnVmTWFuYWdlciBhbmQgaGF2ZQorICAgIC8vIGRpZmZlcmVudCB0aW1pbmcgY29uc3RyYWludC4KKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrTm9ybWFsRGVxdWV1ZUJ1ZmZlclRpbWVvdXQgICAgPSBzMm5zKDEpOyAgLy8gMSBzZWMKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrSGFsQnVmTWdyRGVxdWV1ZUJ1ZmZlclRpbWVvdXQgPSBtczJucygxKTsgLy8gMSBtc2VjCiAKICAgICBNdXRleCBtTXV0ZXg7CiAKQEAgLTI3Myw2ICsyNzYsOCBAQAogICAgIHNpemVfdCBtQWNxdWlyZWRJbnB1dEJ1ZmZlcnM7CiAKICAgICBTdHJpbmc4IG1Db25zdW1lck5hbWU7CisKKyAgICBjb25zdCBib29sIG1Vc2VIYWxCdWZNYW5hZ2VyOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAKaW5kZXggNGRhZmVmZC4uYWU3YWY4ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwCkBAIC0zMTIsOCArMzEyLDggQEAKICAgICAgICAgaW50MzJfdCBjb29yZHNbNF0gPSB7CiAgICAgICAgICAgICByZWN0c1tpXSwKICAgICAgICAgICAgIHJlY3RzW2kgKyAxXSwKLSAgICAgICAgICAgIHJlY3RzW2ldICsgcmVjdHNbaSArIDJdLAotICAgICAgICAgICAgcmVjdHNbaSArIDFdICsgcmVjdHNbaSArIDNdCisgICAgICAgICAgICByZWN0c1tpXSArIHJlY3RzW2kgKyAyXSAtIDEsCisgICAgICAgICAgICByZWN0c1tpICsgMV0gKyByZWN0c1tpICsgM10gLSAxCiAgICAgICAgIH07CiAKICAgICAgICAgbWFwUmF3VG9Db3JyZWN0ZWQoY29vcmRzLCAyLCBjbGFtcCwgc2ltcGxlKTsKQEAgLTMyMSw4ICszMjEsOCBAQAogICAgICAgICAvLyBNYXAgYmFjayB0byAobCwgdCwgd2lkdGgsIGhlaWdodCkKICAgICAgICAgcmVjdHNbaV0gPSBjb29yZHNbMF07CiAgICAgICAgIHJlY3RzW2kgKyAxXSA9IGNvb3Jkc1sxXTsKLSAgICAgICAgcmVjdHNbaSArIDJdID0gY29vcmRzWzJdIC0gY29vcmRzWzBdOwotICAgICAgICByZWN0c1tpICsgM10gPSBjb29yZHNbM10gLSBjb29yZHNbMV07CisgICAgICAgIHJlY3RzW2kgKyAyXSA9IGNvb3Jkc1syXSAtIGNvb3Jkc1swXSArIDE7CisgICAgICAgIHJlY3RzW2kgKyAzXSA9IGNvb3Jkc1szXSAtIGNvb3Jkc1sxXSArIDE7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpAQCAtNDAwLDggKzQwMCw4IEBACiAgICAgICAgIGludDMyX3QgY29vcmRzWzRdID0gewogICAgICAgICAgICAgcmVjdHNbaV0sCiAgICAgICAgICAgICByZWN0c1tpICsgMV0sCi0gICAgICAgICAgICByZWN0c1tpXSArIHJlY3RzW2kgKyAyXSwKLSAgICAgICAgICAgIHJlY3RzW2kgKyAxXSArIHJlY3RzW2kgKyAzXQorICAgICAgICAgICAgcmVjdHNbaV0gKyByZWN0c1tpICsgMl0gLSAxLAorICAgICAgICAgICAgcmVjdHNbaSArIDFdICsgcmVjdHNbaSArIDNdIC0gMQogICAgICAgICB9OwogCiAgICAgICAgIG1hcENvcnJlY3RlZFRvUmF3KGNvb3JkcywgMiwgY2xhbXAsIHNpbXBsZSk7CkBAIC00MDksOCArNDA5LDggQEAKICAgICAgICAgLy8gTWFwIGJhY2sgdG8gKGwsIHQsIHdpZHRoLCBoZWlnaHQpCiAgICAgICAgIHJlY3RzW2ldID0gY29vcmRzWzBdOwogICAgICAgICByZWN0c1tpICsgMV0gPSBjb29yZHNbMV07Ci0gICAgICAgIHJlY3RzW2kgKyAyXSA9IGNvb3Jkc1syXSAtIGNvb3Jkc1swXTsKLSAgICAgICAgcmVjdHNbaSArIDNdID0gY29vcmRzWzNdIC0gY29vcmRzWzFdOworICAgICAgICByZWN0c1tpICsgMl0gPSBjb29yZHNbMl0gLSBjb29yZHNbMF0gKyAxOworICAgICAgICByZWN0c1tpICsgM10gPSBjb29yZHNbM10gLSBjb29yZHNbMV0gKyAxOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNjM1MDYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEuaD4KKworI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2UgZGV2aWNlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIEhDYXB0dXJlUmVzdWx0RXh0cmFzID0gYW5kcm9pZDo6ZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVzdWx0RXh0cmFzOwordXNpbmcgSFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gPSBhbmRyb2lkOjpmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87Cit1c2luZyBIQ2FtZXJhTWV0YWRhdGEgPSBhbmRyb2lkOjpmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhbWVyYU1ldGFkYXRhOworCitjb25zdCBjaGFyICpIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6OmtSZXN1bHRLZXkgPSAiQ2FwdHVyZVJlc3VsdCI7CisKK0gyQkNhbWVyYURldmljZUNhbGxiYWNrczo6SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKGNvbnN0IHNwPEhhbEludGVyZmFjZT4mIGJhc2UpIDogQ0Jhc2UoYmFzZSkgeyB9CisKK2Jvb2wgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjppbml0aWFsaXplTG9vcGVyKCkgeworICAgIG1DYkxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1DYkxvb3Blci0+c2V0TmFtZSgiY3MtbG9vcGVyIik7CisgICAgc3RhdHVzX3QgZXJyID0gbUNiTG9vcGVyLT5zdGFydCgvKnJ1bk9uQ2FsbGluZ1RocmVhZCovIGZhbHNlLCAvKmNhbkNhbGxKYXZhKi8gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklPUklUWV9ERUZBVUxUKTsKKyAgICBpZiAoZXJyICE9T0spIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzdGFydCBjYW1lcmEgZGV2aWNlIGNhbGxiYWNrIGxvb3BlciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1IYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcih0aGlzKTsKKyAgICBtQ2JMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK0gyQkNhbWVyYURldmljZUNhbGxiYWNrczo6fkgyQkNhbWVyYURldmljZUNhbGxiYWNrcygpIHsKKyAgICBpZiAobUNiTG9vcGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1IYW5kbGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1DYkxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXItPmlkKCkpOworICAgICAgICB9CisgICAgICAgIG1DYkxvb3Blci0+c3RvcCgpOworICAgIH0KKyAgICBtQ2JMb29wZXIuY2xlYXIoKTsKKyAgICBtSGFuZGxlci5jbGVhcigpOworfQorCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om9uRGV2aWNlRXJyb3IoCisgICAgaW50MzJfdCBlcnJvckNvZGUsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbDsKKyAgICBIQ2FwdHVyZVJlc3VsdEV4dHJhcyBoQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGNvbnZlcnRUb0hpZGwocmVzdWx0RXh0cmFzKTsKKyAgICBhdXRvIHJldCA9IG1CYXNlLT5vbkRldmljZUVycm9yKGNvbnZlcnRUb0hpZGwoZXJyb3JDb2RlKSwgaENhcHR1cmVSZXN1bHRFeHRyYXMpOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXMgT25EZXZpY2VFcnJvciBjYWxsYmFjayBmYWlsZWQgZHVlIHRvICVzIixfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6b25EZXZpY2VJZGxlKCkgeworICAgIGF1dG8gcmV0ID0gbUJhc2UtPm9uRGV2aWNlSWRsZSgpOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgIEFMT0dFKCIlcyBPbkRldmljZUlkbGUgY2FsbGJhY2sgZmFpbGVkIGR1ZSB0byAlcyIsX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6b25DYXB0dXJlU3RhcnRlZCgKKyAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsIGludDY0X3QgdGltZXN0YW1wKSB7CisgICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsOworICAgIEhDYXB0dXJlUmVzdWx0RXh0cmFzIGhDYXB0dXJlUmVzdWx0RXh0cmFzID0gY29udmVydFRvSGlkbChyZXN1bHRFeHRyYXMpOworICAgIGF1dG8gcmV0ID0gbUJhc2UtPm9uQ2FwdHVyZVN0YXJ0ZWQoaENhcHR1cmVSZXN1bHRFeHRyYXMsIHRpbWVzdGFtcCk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlcyBPbkNhcHR1cmVDYWxsYmFjayBmYWlsZWQgZHVlIHRvICVzIixfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK3ZvaWQgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpjb252ZXJ0UmVzdWx0TWV0YWRhdGFUb0hpZGwoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJhd01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbXFTaXplT3JNZXRhZGF0YSAqaFJlc3VsdE1ldGFkYXRhKSB7CisgICAgLy8gRmlyc3QgdHJ5IHdyaXRpbmcgdG8gZm1xLgorICAgIHNpemVfdCBtZXRhZGF0YV9zaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJhd01ldGFkYXRhKTsKKyAgICBpZiAoKG1ldGFkYXRhX3NpemUgPiAwKSAmJgorICAgICAgICAobUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPiAwKSkgeworICAgICAgICBpZiAobUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLT53cml0ZSgodWludDhfdCAqKXJhd01ldGFkYXRhLCBtZXRhZGF0YV9zaXplKSkgeworICAgICAgICAgICAgaFJlc3VsdE1ldGFkYXRhLT5mbXFNZXRhZGF0YVNpemUobWV0YWRhdGFfc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXMgQ291bGRuJ3QgdXNlIGZtcSwgZmFsbGluZyBiYWNrIHRvIGh3YmluZGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIEhDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbChyYXdNZXRhZGF0YSwgJm1ldGFkYXRhKTsKKyAgICAgICAgICAgIGhSZXN1bHRNZXRhZGF0YS0+bWV0YWRhdGEoc3RkOjptb3ZlKG1ldGFkYXRhKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYWxsYmFja0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3A8UmVmQmFzZT4gb2JqID0gbnVsbHB0cjsKKyAgICBzcDxSZXN1bHRXcmFwcGVyPiByZXN1bHRXcmFwcGVyID0gbnVsbHB0cjsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0UmVzdWx0UmVjZWl2ZWQ6CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrUmVzdWx0S2V5LCAmb2JqKTsKKyAgICAgICAgICAgIGlmICghZm91bmQgfHwgb2JqID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGZpbmQgcmVzdWx0IG9iamVjdCBpbiBjYWxsYmFjayBtZXNzYWdlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0V3JhcHBlciA9IHN0YXRpY19jYXN0PFJlc3VsdFdyYXBwZXIgKj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgIHByb2Nlc3NSZXN1bHRNZXNzYWdlKHJlc3VsdFdyYXBwZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBjYWxsYmFjayBzZW50Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FsbGJhY2tIYW5kbGVyOjpwcm9jZXNzUmVzdWx0TWVzc2FnZSgKKyAgICBzcDxSZXN1bHRXcmFwcGVyPiAmcmVzdWx0V3JhcHBlcikgeworICAgIHNwPEgyQkNhbWVyYURldmljZUNhbGxiYWNrcz4gY29udmVydGVyID0gbUNvbnZlcnRlci5wcm9tb3RlKCk7CisgICAgaWYgKGNvbnZlcnRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJDYWxsYmFjayB3cmFwcGVyIGhhcyBkaWVkLCByZXN1bHQgY2FsbGJhY2sgY2Fubm90IGJlIG1hZGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDYW1lcmFNZXRhZGF0YU5hdGl2ZSAmcmVzdWx0ID0gcmVzdWx0V3JhcHBlci0+bVJlc3VsdDsKKyAgICBhdXRvIHJlc3VsdEV4dHJhcyA9IHJlc3VsdFdyYXBwZXItPm1SZXN1bHRFeHRyYXM7CisgICAgSENhcHR1cmVSZXN1bHRFeHRyYXMgaFJlc3VsdEV4dHJhcyA9CisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGwocmVzdWx0RXh0cmFzKTsKKworICAgIC8vIENvbnZlcnQgTWV0YWRhdGEgaW50byBIQ2FtZXJhTWV0YWRhdGE7CisgICAgRm1xU2l6ZU9yTWV0YWRhdGEgaFJlc3VsdDsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3TWV0YWRhdGEgPSByZXN1bHQuZ2V0QW5kTG9jaygpOworICAgIGNvbnZlcnRlci0+Y29udmVydFJlc3VsdE1ldGFkYXRhVG9IaWRsKHJhd01ldGFkYXRhLCAmaFJlc3VsdCk7CisgICAgcmVzdWx0LnVubG9jayhyYXdNZXRhZGF0YSk7CisgICAgYXV0byAmcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MgPSByZXN1bHRXcmFwcGVyLT5tUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3M7CisgICAgaGlkbF92ZWM8SFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcyA9CisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGwoCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zLCBjb252ZXJ0ZXItPm1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSk7CisgICAgYXV0byByZXQgPSBjb252ZXJ0ZXItPm1CYXNlLT5vblJlc3VsdFJlY2VpdmVkKGhSZXN1bHQsIGhSZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcyk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgQUxPR0UoIiVzIE9uUmVzdWx0UmVjZWl2ZWQgY2FsbGJhY2sgZmFpbGVkIGR1ZSB0byAlcyIsX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KK30KKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpvblJlc3VsdFJlY2VpdmVkKAorICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhTmF0aXZlJiByZXN1bHQsCisgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgIGNvbnN0IDo6c3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4mIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKSB7CisgICAgLy8gV3JhcCBDYW1lcmFNZXRhZGF0YSwgcmVzdWx0RXh0cmFzIGFuZCBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcyBpbiBvbgorICAgIC8vIHNwPFJlZkJhc2U+LWFibGUgc3RydWN0dXJlIGFuZCBwb3N0IGl0LgorICAgIHNwPFJlc3VsdFdyYXBwZXI+IHJlc3VsdFdyYXBwZXIgPSBuZXcgUmVzdWx0V3JhcHBlcihjb25zdF9jYXN0PENhbWVyYU1ldGFkYXRhTmF0aXZlICY+KHJlc3VsdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcywgcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bHRSZWNlaXZlZCwgbUhhbmRsZXIpOworICAgIG1zZy0+c2V0T2JqZWN0KGtSZXN1bHRLZXksIHJlc3VsdFdyYXBwZXIpOworICAgIG1zZy0+cG9zdCgpOworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpvblByZXBhcmVkKGludDMyX3Qgc3RyZWFtSWQpIHsKKyAgICAvLyBub3QgaW1wbGVtZW50ZWQKKyAgICAvLyBUbyBzaWxlbmNlIFd1bnVzZWQtcGFyYW1ldGVyLgorICAgICh2b2lkKSBzdHJlYW1JZDsKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6b25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IoCisgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIsCisgICAgaW50MzJfdCByZXBlYXRpbmdSZXF1ZXN0SWQpIHsKKyAgICBhdXRvIHJldCA9CisgICAgICAgIG1CYXNlLT5vblJlcGVhdGluZ1JlcXVlc3RFcnJvcihsYXN0RnJhbWVOdW1iZXIsIHJlcGVhdGluZ1JlcXVlc3RJZCk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlcyBPblJlcGVhdGluZ1JlcXVlc3RFcm9yIGNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gJXMiLF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpvblJlcXVlc3RRdWV1ZUVtcHR5KCkgeworICAgIC8vIG5vdCBpbXBsZW1lbnRlZAorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworfSAvLyBpbXBsZW1lbnRhdGlvbgorfSAvLyBWMl8wCit9IC8vIGRldmljZQorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmY1MjBhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRlJBTUVXT1JLU19BSURMX0NBTUVSQURFVklDRUNBTExCQUNLU19ICisjZGVmaW5lIEFORFJPSURfRlJBTUVXT1JLU19BSURMX0NBTUVSQURFVklDRUNBTExCQUNLU19ICisKKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9jb21tb24vMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQm5DYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8Q2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGhpZGwvQ2FtZXJhSHlicmlkSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBkZXZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgY2FtZXJhaHlicmlkOjpIMkJDb252ZXJ0ZXI7Cit1c2luZyBIQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgPSBjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VDYWxsYmFjazsKK3VzaW5nIEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvID0gY2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOwordXNpbmcgYW5kcm9pZDo6ZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpGbXFTaXplT3JNZXRhZGF0YTsKKwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OkJuQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpDYW1lcmFNZXRhZGF0YU5hdGl2ZTsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOwordXNpbmcgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU7Cit1c2luZyBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwordXNpbmcgQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPSBNZXNzYWdlUXVldWU8dWludDhfdCwga1N5bmNocm9uaXplZFJlYWRXcml0ZT47CisKK3N0cnVjdCBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MgOgorICAgIHB1YmxpYyBIMkJDb252ZXJ0ZXI8SENhbWVyYURldmljZUNhbGxiYWNrLCBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLCBCbkNhbWVyYURldmljZUNhbGxiYWNrcz4geworICAgIEgyQkNhbWVyYURldmljZUNhbGxiYWNrcyhjb25zdCBzcDxIYWxJbnRlcmZhY2U+JiBiYXNlKTsKKworICAgIH5IMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MoKTsKKworICAgIGJvb2wgaW5pdGlhbGl6ZUxvb3BlcigpOworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvbkRldmljZUVycm9yKGludDMyX3QgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvbkRldmljZUlkbGUoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25DYXB0dXJlU3RhcnRlZChjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25SZXN1bHRSZWNlaXZlZCgKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGFOYXRpdmUmIHJlc3VsdCwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblByZXBhcmVkKGludDMyX3Qgc3RyZWFtSWQpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblJlcGVhdGluZ1JlcXVlc3RFcnJvcihpbnQ2NF90IGxhc3RGcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmVwZWF0aW5nUmVxdWVzdElkKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25SZXF1ZXN0UXVldWVFbXB0eSgpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZShzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+IG1ldGFkYXRhUXVldWUpIHsKKyAgICAgICAgbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gbWV0YWRhdGFRdWV1ZTsKKyAgICB9CisKKyBwcml2YXRlOgorICAgIC8vIFdyYXBwZXIgc3RydWN0IHNvIHRoYXQgcGFyYW1ldGVycyB0byBvblJlc3VsdFJlY2VpdmVkIGNhbGxiYWNrIG1heSBiZQorICAgIC8vIHNlbnQgdGhyb3VnaCBhbiBBTWVzc2FnZS4KKyAgICBzdHJ1Y3QgUmVzdWx0V3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGFOYXRpdmUgbVJlc3VsdDsKKyAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyBtUmVzdWx0RXh0cmFzOworICAgICAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBtUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3M7CisgICAgICAgIFJlc3VsdFdyYXBwZXIoQ2FtZXJhTWV0YWRhdGFOYXRpdmUgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiAmcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpIDoKKyAgICAgIC8vIFRPRE86IG1ha2UgdGhpcyBzdGQ6Om1vdmFibGUKKyAgICAgIG1SZXN1bHQocmVzdWx0KSwgbVJlc3VsdEV4dHJhcyhyZXN1bHRFeHRyYXMpLCBtUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MocGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpIHsgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgQ2FsbGJhY2tIYW5kbGVyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisgICAgICAgICAgICBDYWxsYmFja0hhbmRsZXIoSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzICpjb252ZXJ0ZXIpIDogbUNvbnZlcnRlcihjb252ZXJ0ZXIpIHsgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgdm9pZCBwcm9jZXNzUmVzdWx0TWVzc2FnZShzcDxSZXN1bHRXcmFwcGVyPiAmcmVzdWx0V3JhcHBlcik7CisgICAgICAgICAgICB3cDxIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M+IG1Db252ZXJ0ZXIgPSBudWxscHRyOworICAgICAgICAgICAgTXV0ZXggbU1ldGFkYXRhUXVldWVMb2NrOworICAgIH07CisKKyAgICB2b2lkIGNvbnZlcnRSZXN1bHRNZXRhZGF0YVRvSGlkbChjb25zdCBjYW1lcmFfbWV0YWRhdGEgKnJhd01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZtcVNpemVPck1ldGFkYXRhICpyZXN1bHRNZXRhZGF0YSk7CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0UmVzdWx0UmVjZWl2ZWQsCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyICprUmVzdWx0S2V5OworCisgICAgc3RkOjpzaGFyZWRfcHRyPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPiBtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPSBudWxscHRyOworICAgIHNwPENhbGxiYWNrSGFuZGxlcj4gbUhhbmRsZXIgPSBudWxscHRyOworICAgIHNwPEFMb29wZXI+IG1DYkxvb3BlciA9IG51bGxwdHI7Cit9OworCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gZGV2aWNlCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gZnJhbWV3b3JrcworfSAvLyBhbmRyb2lkCisjZW5kaWYgLy8gQU5EUk9JRF9GUkFNRVdPUktTX0FJRExfQ0FNRVJBREVWSUNFQ0FMTEJBQ0tTX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMGVmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+CisjaW5jbHVkZSA8aGlkbC9Db252ZXJ0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBzZXJ2aWNlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbENhbWVyYURldmljZVN0YXR1czsKKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpvblN0YXR1c0NoYW5nZWQoCisgICAgaW50MzJfdCBzdGF0dXMsIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGNhbWVyYUlkKSB7CisgIEhDYW1lcmFEZXZpY2VTdGF0dXMgaENhbWVyYURldmljZVN0YXR1cyA9IGNvbnZlcnRUb0hpZGxDYW1lcmFEZXZpY2VTdGF0dXMoc3RhdHVzKTsKKyAgQ2FtZXJhU3RhdHVzQW5kSWQgY2FtZXJhU3RhdHVzQW5kSWQ7CisgIGNhbWVyYVN0YXR1c0FuZElkLmRldmljZVN0YXR1cyA9IGhDYW1lcmFEZXZpY2VTdGF0dXM7CisgIGNhbWVyYVN0YXR1c0FuZElkLmNhbWVyYUlkID0gU3RyaW5nOChjYW1lcmFJZCkuc3RyaW5nKCk7CisgIGF1dG8gcmV0ID0gbUJhc2UtPm9uU3RhdHVzQ2hhbmdlZChjYW1lcmFTdGF0dXNBbmRJZCk7CisgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgQUxPR0UoIiVzIE9uU3RhdHVzQ2hhbmdlZCBjYWxsYmFjayBmYWlsZWQgZHVlIHRvICVzIixfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgfQorICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpvblRvcmNoU3RhdHVzQ2hhbmdlZCgKKyAgICBpbnQzMl90LCBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JikgeworICAvLyBXZSBkb24ndCBpbXBsZW1lbnQgb25Ub3JjaFN0YXR1c0NoYW5nZWQKKyAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gY29tbW9uCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gZnJhbWV3b3JrcworfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNmJlNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2NvbW1vbi8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvQm5DYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0JwQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+CisKKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPGhpZGwvQ2FtZXJhSHlicmlkSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBzZXJ2aWNlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIGhhcmR3YXJlOjpCbkNhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKK3VzaW5nIGhhcmR3YXJlOjpCcENhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKK3VzaW5nIGNhbWVyYWh5YnJpZDo6SDJCQ29udmVydGVyOwordXNpbmcgSENhbWVyYURldmljZVN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYURldmljZVN0YXR1czsKK3R5cGVkZWYgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lciBIQ2FtZXJhU2VydmljZUxpc3RlbmVyOworCitzdHJ1Y3QgSDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyIDoKKyAgICBwdWJsaWMgSDJCQ29udmVydGVyPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXIsIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXIsIEJuQ2FtZXJhU2VydmljZUxpc3RlbmVyPiB7CisgICAgSDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyKGNvbnN0IHNwPEhhbEludGVyZmFjZT4mIGJhc2UpIDogQ0Jhc2UoYmFzZSkgeyB9CisKKyAgICB+SDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyKCkgeyB9CisKKyAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgb25TdGF0dXNDaGFuZ2VkKGludDMyX3Qgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgY2FtZXJhSWQpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIG9uVG9yY2hTdGF0dXNDaGFuZ2VkKAorICAgICAgICBpbnQzMl90IHN0YXR1cywgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgY2FtZXJhSWQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCgpIHsKKyAgICAgICAgLy8gVE9ETzogbm8gaW1wbGVtZW50YXRpb24geWV0LgorICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgfQorfTsKKworfSAvLyBpbXBsZW1lbnRhdGlvbgorfSAvLyBWMl8wCit9IC8vIHNlcnZpY2UKK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBmcmFtZXdvcmtzCit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ2FtZXJhSHlicmlkSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NhbWVyYUh5YnJpZEludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZjAxMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NhbWVyYUh5YnJpZEludGVyZmFjZS5oCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0NBTUVSQV9IWUJSSURJTlRFUkZBQ0VfSAorI2RlZmluZSBBTkRST0lEX0NBTUVSQV9IWUJSSURJTlRFUkZBQ0VfSAorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG11dGV4PgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYWh5YnJpZCB7Cit0eXBlZGVmIDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2UgSEludGVyZmFjZTsKKwordGVtcGxhdGUgPAorICAgICAgICB0eXBlbmFtZSBISU5URVJGQUNFLAorICAgICAgICB0eXBlbmFtZSBJTlRFUkZBQ0UsCisgICAgICAgIHR5cGVuYW1lIEJOSU5URVJGQUNFID4KK2NsYXNzIEgyQkNvbnZlcnRlciA6IHB1YmxpYyBCTklOVEVSRkFDRSB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBIMkJDb252ZXJ0ZXI8SElOVEVSRkFDRSwgSU5URVJGQUNFLCBCTklOVEVSRkFDRT4gQ0Jhc2U7IC8vIENvbnZlcnRlciBCYXNlCisgICAgdHlwZWRlZiBJTlRFUkZBQ0UgQmFzZUludGVyZmFjZTsKKyAgICB0eXBlZGVmIEhJTlRFUkZBQ0UgSGFsSW50ZXJmYWNlOworCisgICAgSDJCQ29udmVydGVyKGNvbnN0IHNwPEhhbEludGVyZmFjZT4mIGJhc2UpIDogbUJhc2UoYmFzZSkge30KKyAgICB2aXJ0dWFsIHNwPEhhbEludGVyZmFjZT4gZ2V0SGFsSW50ZXJmYWNlKCkgeyByZXR1cm4gbUJhc2U7IH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpbmtUb0RlYXRoKAorICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+JiByZWNpcGllbnQsCisgICAgICAgICAgICB2b2lkKiBjb29raWUgPSBudWxscHRyLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHVubGlua1RvRGVhdGgoCisgICAgICAgICAgICBjb25zdCB3cDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4mIHJlY2lwaWVudCwKKyAgICAgICAgICAgIHZvaWQqIGNvb2tpZSA9IG51bGxwdHIsCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDAsCisgICAgICAgICAgICB3cDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4qIG91dFJlY2lwaWVudCA9IG51bGxwdHIpOworCitwcm90ZWN0ZWQ6CisgICAgc3A8SGFsSW50ZXJmYWNlPiBtQmFzZTsKKyAgICBzdHJ1Y3QgT2JpdHVhcnkgOiBwdWJsaWMgaGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50IHsKKyAgICAgICAgd3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+IHJlY2lwaWVudDsKKyAgICAgICAgdm9pZCogY29va2llOworICAgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICAgICAgd3A8SUJpbmRlcj4gd2hvOworICAgICAgICBPYml0dWFyeSgKKyAgICAgICAgICAgICAgICBjb25zdCB3cDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4mIHIsCisgICAgICAgICAgICAgICAgdm9pZCogYywgdWludDMyX3QgZiwKKyAgICAgICAgICAgICAgICBjb25zdCB3cDxJQmluZGVyPiYgdykgOgorICAgICAgICAgICAgcmVjaXBpZW50KHIpLCBjb29raWUoYyksIGZsYWdzKGYpLCB3aG8odykgeworICAgICAgICB9CisgICAgICAgIE9iaXR1YXJ5KGNvbnN0IE9iaXR1YXJ5JiBvKSA6CisgICAgICAgICAgICByZWNpcGllbnQoby5yZWNpcGllbnQpLAorICAgICAgICAgICAgY29va2llKG8uY29va2llKSwKKyAgICAgICAgICAgIGZsYWdzKG8uZmxhZ3MpLAorICAgICAgICAgICAgd2hvKG8ud2hvKSB7CisgICAgICAgIH0KKyAgICAgICAgT2JpdHVhcnkmIG9wZXJhdG9yPShjb25zdCBPYml0dWFyeSYgbykgeworICAgICAgICAgICAgcmVjaXBpZW50ID0gby5yZWNpcGllbnQ7CisgICAgICAgICAgICBjb29raWUgPSBvLmNvb2tpZTsKKyAgICAgICAgICAgIGZsYWdzID0gby5mbGFnczsKKyAgICAgICAgICAgIHdobyA9IG8ud2hvOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIHZvaWQgc2VydmljZURpZWQodWludDY0X3QsIGNvbnN0IHdwPEhJbnRlcmZhY2U+Jikgb3ZlcnJpZGUgeworICAgICAgICAgICAgc3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+IGRyID0gcmVjaXBpZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChkciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgZHItPmJpbmRlckRpZWQod2hvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisgICAgc3RkOjptdXRleCBtT2JpdHVhcmllc0xvY2s7CisgICAgc3RkOjp2ZWN0b3I8c3A8T2JpdHVhcnk+ID4gbU9iaXR1YXJpZXM7Cit9OworCit0ZW1wbGF0ZSA8CisgICAgICAgIHR5cGVuYW1lIEhJTlRFUkZBQ0UsCisgICAgICAgIHR5cGVuYW1lIElOVEVSRkFDRSwKKyAgICAgICAgdHlwZW5hbWUgQk5JTlRFUkZBQ0U+CitzdGF0dXNfdCBIMkJDb252ZXJ0ZXI8SElOVEVSRkFDRSwgSU5URVJGQUNFLCBCTklOVEVSRkFDRT46OgorICAgICAgICBsaW5rVG9EZWF0aCgKKyAgICAgICAgY29uc3Qgc3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+JiByZWNpcGllbnQsCisgICAgICAgIHZvaWQqIGNvb2tpZSwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlY2lwaWVudCA9PSBudWxscHRyLAorICAgICAgICAgICAgImxpbmtUb0RlYXRoKCk6IHJlY2lwaWVudCBtdXN0IGJlIG5vbi1udWxscHRyIik7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtT2JpdHVhcmllc0xvY2spOworICAgICAgICBtT2JpdHVhcmllcy5wdXNoX2JhY2sobmV3IE9iaXR1YXJ5KHJlY2lwaWVudCwgY29va2llLCBmbGFncywgdGhpcykpOworICAgICAgICBpZiAoIW1CYXNlLT5saW5rVG9EZWF0aChtT2JpdHVhcmllcy5iYWNrKCksIDApKSB7CisgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3RlbXBsYXRlIDwKKyAgICAgICAgdHlwZW5hbWUgSElOVEVSRkFDRSwKKyAgICAgICAgdHlwZW5hbWUgSU5URVJGQUNFLAorICAgICAgICB0eXBlbmFtZSBCTklOVEVSRkFDRT4KK3N0YXR1c190IEgyQkNvbnZlcnRlcjxISU5URVJGQUNFLCBJTlRFUkZBQ0UsIEJOSU5URVJGQUNFPjo6CisgICAgICAgIHVubGlua1RvRGVhdGgoCisgICAgICAgIGNvbnN0IHdwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiYgcmVjaXBpZW50LAorICAgICAgICB2b2lkKiBjb29raWUsIHVpbnQzMl90IGZsYWdzLAorICAgICAgICB3cDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4qIG91dFJlY2lwaWVudCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1PYml0dWFyaWVzTG9jayk7CisgICAgZm9yIChhdXRvIGkgPSBtT2JpdHVhcmllcy5iZWdpbigpOyBpICE9IG1PYml0dWFyaWVzLmVuZCgpOyArK2kpIHsKKyAgICAgICAgaWYgKChmbGFncyA9ICgqaSktPmZsYWdzKSAmJiAoCisgICAgICAgICAgICAgICAgKHJlY2lwaWVudCA9PSAoKmkpLT5yZWNpcGllbnQpIHx8CisgICAgICAgICAgICAgICAgKChyZWNpcGllbnQgPT0gbnVsbHB0cikgJiYgKGNvb2tpZSA9PSAoKmkpLT5jb29raWUpKSkpIHsKKyAgICAgICAgICAgIGlmIChvdXRSZWNpcGllbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICpvdXRSZWNpcGllbnQgPSAoKmkpLT5yZWNpcGllbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSBtQmFzZS0+dW5saW5rVG9EZWF0aCgqaSk7CisgICAgICAgICAgICBtT2JpdHVhcmllcy5lcmFzZShpKTsKKyAgICAgICAgICAgIHJldHVybiBzdWNjZXNzID8gTk9fRVJST1IgOiBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNhbWVyYWh5YnJpZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9DQU1FUkFfSFlCUklESU5URVJGQUNFX0gKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9Db252ZXJ0LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3ODEyYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5jcHAKQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aGlkbC9Db252ZXJ0Lmg+CisjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzEuMC9IMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSB1dGlscyB7CituYW1lc3BhY2UgY29udmVyc2lvbiB7CisKK3VzaW5nIGhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OnV0aWxzOjpIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBhaW1nOjpBSW1hZ2VSZWFkZXJfZ2V0SEdCUEZyb21IYW5kbGU7CisKKy8vIE5vdGU6IGV4aXN0aW5nIGRhdGEgaW4gZHN0IHdpbGwgYmUgZ29uZS4gQ2FsbGVyIHN0aWxsIG93bnMgdGhlIG1lbW9yeSBvZiBzcmMKK3ZvaWQgY29udmVydFRvSGlkbChjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc3JjLCBIQ2FtZXJhTWV0YWRhdGEqIGRzdCkgeworICAgIGlmIChzcmMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXM6YXR0ZW1wdCB0byBjb252ZXJ0IGVtcHR5IG1ldGFkYXRhIHRvIEhpZGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNpemVfdCBzaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHNyYyk7CisgICAgZHN0LT5zZXRUb0V4dGVybmFsKCh1aW50OF90ICopIHNyYywgc2l6ZSk7CisgICAgcmV0dXJuOworfQorCitpbnQzMl90IGNvbnZlcnRGcm9tSGlkbChIU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgc3RyZWFtQ29uZmlndXJhdGlvbk1vZGUpIHsKKyAgICBzd2l0Y2ggKHN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKSB7CisgICAgICAgIGNhc2UgSFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOjpDT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREU6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OkNPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERTsKKyAgICAgICAgY2FzZSBIU3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6Ok5PUk1BTF9NT0RFOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpOT1JNQUxfTU9ERTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIFRPRE86IEZpeCB0aGlzCisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlZFTkRPUl9NT0RFX1NUQVJUOworICAgIH0KK30KKworaW50MzJfdCBjb252ZXJ0RnJvbUhpZGwoSFRlbXBsYXRlSWQgdGVtcGxhdGVJZCkgeworICAgIHN3aXRjaCh0ZW1wbGF0ZUlkKSB7CisgICAgICAgIGNhc2UgSFRlbXBsYXRlSWQ6OlBSRVZJRVc6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlRFTVBMQVRFX1BSRVZJRVc7CisgICAgICAgIGNhc2UgSFRlbXBsYXRlSWQ6OlNUSUxMX0NBUFRVUkU6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlRFTVBMQVRFX1NUSUxMX0NBUFRVUkU7CisgICAgICAgIGNhc2UgSFRlbXBsYXRlSWQ6OlJFQ09SRDoKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VEVNUExBVEVfUkVDT1JEOworICAgICAgICBjYXNlIEhUZW1wbGF0ZUlkOjpWSURFT19TTkFQU0hPVDoKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VEVNUExBVEVfVklERU9fU05BUFNIT1Q7CisgICAgICAgIGNhc2UgSFRlbXBsYXRlSWQ6OlpFUk9fU0hVVFRFUl9MQUc6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlRFTVBMQVRFX1pFUk9fU0hVVFRFUl9MQUc7CisgICAgICAgIGNhc2UgSFRlbXBsYXRlSWQ6Ok1BTlVBTDoKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VEVNUExBVEVfTUFOVUFMOworICAgIH0KK30KKworaW50IGNvbnZlcnRGcm9tSGlkbChIT3V0cHV0Q29uZmlndXJhdGlvbjo6Um90YXRpb24gcm90YXRpb24pIHsKKyAgICBzd2l0Y2gocm90YXRpb24pIHsKKyAgICAgICAgY2FzZSBIT3V0cHV0Q29uZmlndXJhdGlvbjo6Um90YXRpb246OlIwOgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgSE91dHB1dENvbmZpZ3VyYXRpb246OlJvdGF0aW9uOjpSOTA6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBIT3V0cHV0Q29uZmlndXJhdGlvbjo6Um90YXRpb246OlIxODA6CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgY2FzZSBIT3V0cHV0Q29uZmlndXJhdGlvbjo6Um90YXRpb246OlIyNzA6CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICB9Cit9CisKK2hhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6Ok91dHB1dENvbmZpZ3VyYXRpb24gY29udmVydEZyb21IaWRsKAorICAgIGNvbnN0IEhPdXRwdXRDb25maWd1cmF0aW9uICZoT3V0cHV0Q29uZmlndXJhdGlvbikgeworICAgIHN0ZDo6dmVjdG9yPHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+PiBpR0JQczsKKyAgICBhdXRvICZ3aW5kb3dIYW5kbGVzID0gaE91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93SGFuZGxlczsKKyAgICBpR0JQcy5yZXNlcnZlKHdpbmRvd0hhbmRsZXMuc2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8gJmhhbmRsZSA6IHdpbmRvd0hhbmRsZXMpIHsKKyAgICAgICAgaUdCUHMucHVzaF9iYWNrKG5ldyBIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIoQUltYWdlUmVhZGVyX2dldEhHQlBGcm9tSGFuZGxlKGhhbmRsZSkpKTsKKyAgICB9CisgICAgU3RyaW5nMTYgcGh5c2ljYWxDYW1lcmFJZDE2KGhPdXRwdXRDb25maWd1cmF0aW9uLnBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKSk7CisgICAgaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6T3V0cHV0Q29uZmlndXJhdGlvbiBvdXRwdXRDb25maWd1cmF0aW9uKAorICAgICAgICBpR0JQcywgY29udmVydEZyb21IaWRsKGhPdXRwdXRDb25maWd1cmF0aW9uLnJvdGF0aW9uKSwgcGh5c2ljYWxDYW1lcmFJZDE2LAorICAgICAgICBoT3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dHcm91cElkLCBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfVU5LTk9XTiwgMCwgMCwKKyAgICAgICAgKHdpbmRvd0hhbmRsZXMuc2l6ZSgpID4gMSkpOworICAgIHJldHVybiBvdXRwdXRDb25maWd1cmF0aW9uOworfQorCisvLyBUaGUgY2FtZXJhIG1ldGFkYXRhIGhlcmUgaXMgY2xvbmVkLiBTaW5jZSB3ZSdyZSByZWFkaW5nIG1ldGFkYXRhIG92ZXIKKy8vIGh3YmluZGVyIHdlIHdvdWxkIG5lZWQgdG8gY2xvbmUgaXQgaW4gb3JkZXIgdG8gYXZvaWQgYWxpZ21lbnQgaXNzdWVzLgorYm9vbCBjb252ZXJ0RnJvbUhpZGwoY29uc3QgSENhbWVyYU1ldGFkYXRhICZzcmMsIENhbWVyYU1ldGFkYXRhICpkc3QpIHsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHNyYy5kYXRhKCkpOworICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSBzcmMuc2l6ZSgpOworICAgIGlmIChidWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICBpbnQgcmVzID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShidWZmZXIsICZleHBlY3RlZFNpemUpOworICAgICAgICBpZiAocmVzID09IE9LIHx8IHJlcyA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7CisgICAgICAgICAgICAqZHN0ID0gYnVmZmVyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBNYWxmb3JtZWQgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gSEFMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworSENhbWVyYURldmljZVN0YXR1cyBjb252ZXJ0VG9IaWRsQ2FtZXJhRGV2aWNlU3RhdHVzKGludDMyX3Qgc3RhdHVzKSB7CisgICAgSENhbWVyYURldmljZVN0YXR1cyBkZXZpY2VTdGF0dXMgPSBIQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfVU5LTk9XTjsKKyAgICBzd2l0Y2goc3RhdHVzKSB7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfUFJFU0VOVDoKKyAgICAgICAgICAgIGRldmljZVN0YXR1cyA9IEhDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19OT1RfUFJFU0VOVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVDoKKyAgICAgICAgICAgIGRldmljZVN0YXR1cyA9IEhDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19QUkVTRU5UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19FTlVNRVJBVElORzoKKyAgICAgICAgICAgIGRldmljZVN0YXR1cyA9IEhDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19FTlVNRVJBVElORzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX0FWQUlMQUJMRToKKyAgICAgICAgICAgIGRldmljZVN0YXR1cyA9IEhDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19OT1RfQVZBSUxBQkxFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGRldmljZVN0YXR1czsKK30KKworSENhcHR1cmVSZXN1bHRFeHRyYXMgY29udmVydFRvSGlkbChjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzICZjYXB0dXJlUmVzdWx0RXh0cmFzKSB7CisgICAgSENhcHR1cmVSZXN1bHRFeHRyYXMgaENhcHR1cmVSZXN1bHRFeHRyYXM7CisgICAgaENhcHR1cmVSZXN1bHRFeHRyYXMucmVxdWVzdElkID0gY2FwdHVyZVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQ7CisgICAgaENhcHR1cmVSZXN1bHRFeHRyYXMuYnVyc3RJZCA9IGNhcHR1cmVSZXN1bHRFeHRyYXMuYnVyc3RJZDsKKyAgICBoQ2FwdHVyZVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciA9IGNhcHR1cmVSZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXI7CisgICAgaENhcHR1cmVSZXN1bHRFeHRyYXMucGFydGlhbFJlc3VsdENvdW50ID0gY2FwdHVyZVJlc3VsdEV4dHJhcy5wYXJ0aWFsUmVzdWx0Q291bnQ7CisgICAgaENhcHR1cmVSZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZCA9IGNhcHR1cmVSZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZDsKKyAgICByZXR1cm4gaENhcHR1cmVSZXN1bHRFeHRyYXM7Cit9CisKK0hFcnJvckNvZGUgY29udmVydFRvSGlkbChpbnQzMl90IGVycm9yQ29kZSkgeworICAgIHN3aXRjaChlcnJvckNvZGUpIHsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9ESVNDT05ORUNURUQ7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RFVklDRSA6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX0RFVklDRTsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfU0VSVklDRToKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfU0VSVklDRTsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVRVUVTVDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfUkVRVUVTVDsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVTVUxUOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9SRVNVTFQ7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUjoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfQlVGRkVSOworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ESVNBQkxFRDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfRElTQUJMRUQ7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0lOVkFMSURfRVJST1I6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX0lOVkFMSURfRVJST1I7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX1VOS05PV05fRVJST1I7CisgICAgfQorfQorCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0YXR1cz4gJnNyYywKKyAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxIQ2FtZXJhU3RhdHVzQW5kSWQ+KiBkc3QpIHsKKyAgICBkc3QtPnJlc2l6ZShzcmMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChhdXRvICZzdGF0dXNBbmRJZCA6IHNyYykgeworICAgICAgICBhdXRvICZhID0gKCpkc3QpW2krK107CisgICAgICAgIGEuY2FtZXJhSWQgPSBzdGF0dXNBbmRJZC5jYW1lcmFJZC5jX3N0cigpOworICAgICAgICBhLmRldmljZVN0YXR1cyA9IGNvbnZlcnRUb0hpZGxDYW1lcmFEZXZpY2VTdGF0dXMoc3RhdHVzQW5kSWQuc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIGNvbnZlcnRUb0hpZGwoCisgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpTdWJtaXRJbmZvICZzdWJtaXRJbmZvLAorICAgIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U3VibWl0SW5mbyAqaFN1Ym1pdEluZm8pIHsKKyAgICBoU3VibWl0SW5mby0+cmVxdWVzdElkID0gc3VibWl0SW5mby5tUmVxdWVzdElkOworICAgIGhTdWJtaXRJbmZvLT5sYXN0RnJhbWVOdW1iZXIgPSBzdWJtaXRJbmZvLm1MYXN0RnJhbWVOdW1iZXI7Cit9CisKK0hTdGF0dXMgQjJIU3RhdHVzKGNvbnN0IGJpbmRlcjo6U3RhdHVzICZiU3RhdHVzKSB7CisgICAgSFN0YXR1cyBzdGF0dXMgPSBIU3RhdHVzOjpOT19FUlJPUjsKKyAgICBpZiAoYlN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgLy8gTk8gRXJyb3IgaGVyZQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzd2l0Y2goYlN0YXR1cy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSkgeworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6RElTQ09OTkVDVEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9DQU1FUkFfSU5fVVNFOgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6Q0FNRVJBX0lOX1VTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfTUFYX0NBTUVSQVNfSU5fVVNFOgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6TUFYX0NBTUVSQVNfSU5fVVNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfREVQUkVDQVRFRF9IQUw6CisgICAgICAgICAgICAvLyBTaG91bGQgbm90IHJlYWNoIGhlcmUgc2luY2Ugd2UgZmlsdGVyZWQgbGVnYWN5IEhBTHMgZWFybGllcgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6REVQUkVDQVRFRF9IQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0RJU0FCTEVEOgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6RElTQUJMRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX1BFUk1JU1NJT05fREVOSUVEOgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6UEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OOgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6SU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OlVOS05PV05fRVJST1I7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKK0hQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIGNvbnZlcnRUb0hpZGwoCisgICAgY29uc3QgUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyAmcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbywKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+ICZjYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSkgeworICAgIEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOworICAgIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLnBoeXNpY2FsQ2FtZXJhSWQgPQorICAgICAgICBTdHJpbmc4KHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8ubVBoeXNpY2FsQ2FtZXJhSWQpLnN0cmluZygpOworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdNZXRhZGF0YSA9CisgICAgICAgIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8ubVBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEuZ2V0QW5kTG9jaygpOworICAgIC8vIFRyeSB1c2luZyBmbXEgYXQgZmlyc3QuCisgICAgc2l6ZV90IG1ldGFkYXRhX3NpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmF3TWV0YWRhdGEpOworICAgIGlmICgobWV0YWRhdGFfc2l6ZSA+IDApICYmIChjYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpID4gMCkpIHsKKyAgICAgICAgaWYgKGNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLT53cml0ZSgodWludDhfdCAqKXJhd01ldGFkYXRhLCBtZXRhZGF0YV9zaXplKSkgeworICAgICAgICAgICAgaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8ucGh5c2ljYWxDYW1lcmFNZXRhZGF0YS5mbXFNZXRhZGF0YVNpemUobWV0YWRhdGFfc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXMgQ291bGRuJ3QgdXNlIGZtcSwgZmFsbGluZyBiYWNrIHRvIGh3YmluZGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIEhDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICAgICAgICAgIGNvbnZlcnRUb0hpZGwocmF3TWV0YWRhdGEsICZtZXRhZGF0YSk7CisgICAgICAgICAgICBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mby5waHlzaWNhbENhbWVyYU1ldGFkYXRhLm1ldGFkYXRhKHN0ZDo6bW92ZShtZXRhZGF0YSkpOworICAgICAgICB9CisgICAgfQorICAgIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8ubVBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEudW5sb2NrKHJhd01ldGFkYXRhKTsKKyAgICByZXR1cm4gaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87Cit9CisKK2hpZGxfdmVjPEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBjb252ZXJ0VG9IaWRsKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+ICZwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcywKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+ICZjYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSkgeworICAgIGhpZGxfdmVjPEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3M7CisgICAgaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zLnJlc2l6ZShwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGF1dG8gJnBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gOiBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcykgeworICAgICAgICBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3NbaSsrXSA9IGNvbnZlcnRUb0hpZGwocGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKTsKKyAgICB9CisgICAgcmV0dXJuIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvczsKK30KKworfSAvL2NvbnZlcnNpb24KK30gLy8gdXRpbHMKK30gLy9jYW1lcmFzZXJ2aWNlCit9IC8vIGhhcmR3YXJlCit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9Db252ZXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5MzdhMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENBTUVSQVNFUlZFUl9DT05WRVJUX0hJREwKKyNkZWZpbmUgQ0FNRVJBU0VSVkVSX0NPTlZFUlRfSElETAorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvSUNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL0lDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvY29tbW9uLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2NvbW1vbi8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzEuMC9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIHV0aWxzIHsKK25hbWVzcGFjZSBjb252ZXJzaW9uIHsKKwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OkNhcHR1cmVSZXN1bHRFeHRyYXM7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKKwordXNpbmcgQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPSBNZXNzYWdlUXVldWU8dWludDhfdCwga1N5bmNocm9uaXplZFJlYWRXcml0ZT47Cit1c2luZyBIQ2FtZXJhTWV0YWRhdGEgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFNZXRhZGF0YTsKK3VzaW5nIEhDYW1lcmFEZXZpY2VTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFEZXZpY2VTdGF0dXM7Cit1c2luZyBIQ2FtZXJhU3RhdHVzQW5kSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFTdGF0dXNBbmRJZDsKK3VzaW5nIEhDYW1lcmFEZXZpY2VVc2VyID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpJQ2FtZXJhRGV2aWNlVXNlcjsKK3VzaW5nIEhDYXB0dXJlUmVzdWx0RXh0cmFzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVzdWx0RXh0cmFzOwordXNpbmcgSENhcHR1cmVSZXF1ZXN0ID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVxdWVzdDsKK3VzaW5nIEhFcnJvckNvZGUgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkVycm9yQ29kZTsKK3VzaW5nIEhHcmFwaGljQnVmZmVyUHJvZHVjZXIgPSBoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgSE91dHB1dENvbmZpZ3VyYXRpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6Ok91dHB1dENvbmZpZ3VyYXRpb247Cit1c2luZyBIUGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKK3VzaW5nIEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOwordXNpbmcgSFN1Ym1pdEluZm8gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlN1Ym1pdEluZm87Cit1c2luZyBIU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpTdGF0dXM7Cit1c2luZyBIU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOwordXNpbmcgSFRlbXBsYXRlSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlRlbXBsYXRlSWQ7CisKKy8vIE5vdGU6IGV4aXN0aW5nIGRhdGEgaW4gZHN0IHdpbGwgYmUgZ29uZS4gQ2FsbGVyIHN0aWxsIG93bnMgdGhlIG1lbW9yeSBvZiBzcmMKK3ZvaWQgY29udmVydFRvSGlkbChjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc3JjLCBIQ2FtZXJhTWV0YWRhdGEqIGRzdCk7CisKK2ludDMyX3QgY29udmVydEZyb21IaWRsKEhTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBzdHJlYW1Db25maWd1cmF0aW9uTW9kZSk7CisKK2ludDMyX3QgY29udmVydEZyb21IaWRsKEhUZW1wbGF0ZUlkIHRlbXBsYXRlSWQpOworCitib29sIGNvbnZlcnRGcm9tSGlkbChjb25zdCBIQ2FtZXJhTWV0YWRhdGEgJnNyYywgQ2FtZXJhTWV0YWRhdGEgKmRzdCk7CisKK2hhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6Ok91dHB1dENvbmZpZ3VyYXRpb24gY29udmVydEZyb21IaWRsKAorICAgIGNvbnN0IEhPdXRwdXRDb25maWd1cmF0aW9uICZoT3V0cHV0Q29uZmlndXJhdGlvbik7CisKK0hDYW1lcmFEZXZpY2VTdGF0dXMgY29udmVydFRvSGlkbENhbWVyYURldmljZVN0YXR1cyhpbnQzMl90IHN0YXR1cyk7CisKK3ZvaWQgY29udmVydFRvSGlkbChjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RhdHVzPiAmc3JjLAorICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPEhDYW1lcmFTdGF0dXNBbmRJZD4qIGRzdCk7CisKK3ZvaWQgY29udmVydFRvSGlkbChjb25zdCBoYXJkd2FyZTo6Y2FtZXJhMjo6dXRpbHM6OlN1Ym1pdEluZm8gJnN1Ym1pdEluZm8sCisgICAgICAgICAgICAgICAgICAgSFN1Ym1pdEluZm8gKmhTdWJtaXRJbmZvKTsKKworSEVycm9yQ29kZSBjb252ZXJ0VG9IaWRsKGludDMyX3QgZXJyb3JDb2RlKTsKKworSENhcHR1cmVSZXN1bHRFeHRyYXMgY29udmVydFRvSGlkbChjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzICZjYXB0dXJlUmVzdWx0RXh0cmFzKTsKKworaGlkbF92ZWM8SFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IGNvbnZlcnRUb0hpZGwoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gJnBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4gJmNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKTsKKworSFN0YXR1cyBCMkhTdGF0dXMoY29uc3QgYmluZGVyOjpTdGF0dXMgJmJTdGF0dXMpOworCit9IC8vIGNvbnZlcnNpb24KK30gLy8gdXRpbHMKK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBoYXJkd2FyZQorfSAvL2FuZHJvaWQKKworI2VuZGlmIC8vQ0FNRVJBU0VSVkVSX0NPTlZFUlRfVE9fSElETApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjJiYTVhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi90eXBlcy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMS4wL0gyQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCisjaW5jbHVkZSA8aGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8aGlkbC9Db252ZXJ0Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvdHlwZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIGRldmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGw7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRGcm9tSGlkbDsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6QjJIU3RhdHVzOworCit1c2luZyBoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjp1dGlsczo6SDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgaGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIGhhcmR3YXJlOjpWb2lkOwordXNpbmcgSFN1Ym1pdEluZm8gPSBkZXZpY2U6OlYyXzA6OlN1Ym1pdEluZm87Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6cGFyYW1zOjpPdXRwdXRDb25maWd1cmF0aW9uOworCitzdGF0aWMgY29uc3RleHByIGludDMyX3QgQ0FNRVJBX1JFUVVFU1RfTUVUQURBVEFfUVVFVUVfU0laRSA9IDEgPDwgMjAgLyogMSBNQiAqLzsKK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBDQU1FUkFfUkVTVUxUX01FVEFEQVRBX1FVRVVFX1NJWkUgPSAxIDw8IDIwIC8qIDEgTUIgKi87CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6ZGlzY29ubmVjdCgpIHsKKyAgICBtRGV2aWNlUmVtb3RlLT5kaXNjb25uZWN0KCk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworSGlkbENhbWVyYURldmljZVVzZXI6OkhpZGxDYW1lcmFEZXZpY2VVc2VyKAorICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcj4gJmRldmljZVJlbW90ZSkKKyAgOiBtRGV2aWNlUmVtb3RlKGRldmljZVJlbW90ZSkgeworICAgIG1Jbml0U3VjY2VzcyA9IGluaXREZXZpY2UoKTsKK30KKworYm9vbCBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6aW5pdERldmljZSgpIHsKKyAgICAvLyBUT0RPOiBHZXQgcmVxdWVzdCBhbmQgcmVzdWx0IG1ldGFkYXRhIHF1ZXVlIHNpemUgZnJvbSBhIHN5c3RlbSBwcm9wZXJ0eS4KKyAgICBpbnQzMl90IHJlcUZNUVNpemUgPSBDQU1FUkFfUkVRVUVTVF9NRVRBREFUQV9RVUVVRV9TSVpFOworCisgICAgbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSA9CisgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlPihzdGF0aWNfY2FzdDxzaXplX3Q+KHJlcUZNUVNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogbm9uIGJsb2NraW5nICovKTsKKyAgICBpZiAoIW1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUtPmlzVmFsaWQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgcmVxdWVzdCBmbXEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50MzJfdCByZXNGTVFTaXplID0gQ0FNRVJBX1JFU1VMVF9NRVRBREFUQV9RVUVVRV9TSVpFOworICAgIG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9CisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+KHN0YXRpY19jYXN0PHNpemVfdD4ocmVzRk1RU2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIG5vbiBibG9ja2luZyAqLyk7CisgICAgaWYgKCFtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUtPmlzVmFsaWQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgcmVzdWx0IGZtcSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Z2V0Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlKAorICAgIGdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZV9jYiBfaGlkbF9jYikgeworICAgIGlmIChtSW5pdFN1Y2Nlc3MpIHsKKyAgICAgICAgX2hpZGxfY2IoKm1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUtPmdldERlc2MoKSk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Z2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoCisgICAgZ2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWVfY2IgX2hpZGxfY2IpIHsKKyAgICBpZiAobUluaXRTdWNjZXNzKSB7CisgICAgICAgIF9oaWRsX2NiKCptQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUtPmdldERlc2MoKSk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKKy8qKgorICogVG8gYmUgdXNlZCBvbmx5IGJ5IHN1Ym1pdFJlcXVlc3RMaXN0IGltcGxlbWVudGF0aW9uLCBzaW5jZSBpdCByZXF1aXJlcworICogY2xpZW50cyB0byBjYWxsIHRoaXMgbWV0aG9kIHNlcmlhbGx5LCBpbmNhc2UgZm1xIGlzIHVzZWQgdG8gc2VuZCBtZXRhZGF0YS4KKyAqLworYm9vbCBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Y29weVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MoCisgICAgY29uc3QgaGlkbF92ZWM8SFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+ICZoUGh5c2ljYWxDYW1lcmFTZXR0aW5ncywKKyAgICBzdGQ6OnZlY3RvcjxDYXB0dXJlUmVxdWVzdDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5ncz4gKnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MpIHsKKyAgICBib29sIGNvbnZlcnRlZCA9IGZhbHNlOworICAgIGZvciAoYXV0byAmZSA6IGhQaHlzaWNhbENhbWVyYVNldHRpbmdzKSB7CisgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MtPmVtcGxhY2VfYmFjaygpOworICAgICAgICBDYXB0dXJlUmVxdWVzdDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5ncyAmcGh5c2ljYWxDYW1lcmFTZXR0aW5nID0KKyAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MtPmJhY2soKTsKKyAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5nLmlkID0gZS5pZC5jX3N0cigpOworCisgICAgICAgIC8vIFJlYWQgdGhlIHNldHRpbmdzIGVpdGhlciBmcm9tIHRoZSBmbXEgb3Igc3RyYWlnaHRhd2F5IGZyb20gdGhlCisgICAgICAgIC8vIHJlcXVlc3QuIFdlIGRvbid0IG5lZWQgYW55IHN5bmNocm9uaXphdGlvbiwgc2luY2Ugc3VibWl0UmVxdWVzdExpc3QKKyAgICAgICAgLy8gaXMgZ3VhcmFudGVlZCB0byBiZSBjYWxsZWQgc2VyaWFsbHkgYnkgdGhlIGNsaWVudCBpZiBpdCBkZWNpZGVzIHRvCisgICAgICAgIC8vIHVzZSBmbXEuCisgICAgICAgIGlmIChlLnNldHRpbmdzLmdldERpc2NyaW1pbmF0b3IoKSA9PQorICAgICAgICAgICAgRm1xU2l6ZU9yTWV0YWRhdGE6OmhpZGxfZGlzY3JpbWluYXRvcjo6Zm1xTWV0YWRhdGFTaXplKSB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEdldCBzZXR0aW5ncyBmcm9tIHRoZSBmbXEuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEhDYW1lcmFNZXRhZGF0YSBzZXR0aW5nc0ZtcTsKKyAgICAgICAgICAgIHNldHRpbmdzRm1xLnJlc2l6ZShlLnNldHRpbmdzLmZtcU1ldGFkYXRhU2l6ZSgpKTsKKyAgICAgICAgICAgIGJvb2wgcmVhZCA9IG1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUtPnJlYWQoc2V0dGluZ3NGbXEuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnNldHRpbmdzLmZtcU1ldGFkYXRhU2l6ZSgpKTsKKyAgICAgICAgICAgIGlmICghcmVhZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBjYXB0dXJlIHJlcXVlc3Qgc2V0dGluZ3MgY291bGQndCBiZSByZWFkIGZyb20gZm1xIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgY29udmVydGVkID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IGNvbnZlcnRGcm9tSGlkbChzZXR0aW5nc0ZtcSwgJnBoeXNpY2FsQ2FtZXJhU2V0dGluZy5zZXR0aW5ncyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSBzZXR0aW5ncyBtZXRhZGF0YSBpcyBjb250YWluZWQgaW4gcmVxdWVzdCBzZXR0aW5ncyBmaWVsZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY29udmVydGVkID0KKyAgICAgICAgICAgICAgICBjb252ZXJ0RnJvbUhpZGwoZS5zZXR0aW5ncy5tZXRhZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5c2ljYWxDYW1lcmFTZXR0aW5nLnNldHRpbmdzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNvbnZlcnRlZCkgeworICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbnZlcnQgcGh5c2ljYWxDYW1lcmFTZXR0aW5ncyBmcm9tIEhJREwgdG8gQUlETC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Y29udmVydFJlcXVlc3RGcm9tSGlkbChjb25zdCBIQ2FwdHVyZVJlcXVlc3QgJmhSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVxdWVzdCAqcmVxdWVzdCkgeworICAgIC8vIE5vIHJlcHJvY2Vzc2luZyBzdXBwb3J0LgorICAgIHJlcXVlc3QtPm1Jc1JlcHJvY2VzcyA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtQW5kV2luZG93SWQgOiBoUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHMpIHsKKyAgICAgICAgcmVxdWVzdC0+bVN0cmVhbUlkeExpc3QucHVzaF9iYWNrKHN0cmVhbUFuZFdpbmRvd0lkLnN0cmVhbUlkKTsKKyAgICAgICAgcmVxdWVzdC0+bVN1cmZhY2VJZHhMaXN0LnB1c2hfYmFjayhzdHJlYW1BbmRXaW5kb3dJZC53aW5kb3dJZCk7CisgICAgfQorICAgIHJldHVybiBjb3B5UGh5c2ljYWxDYW1lcmFTZXR0aW5ncyhoUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHJlcXVlc3QtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzKSk7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6c3VibWl0UmVxdWVzdExpc3QoY29uc3QgaGlkbF92ZWM8SENhcHR1cmVSZXF1ZXN0PiYgaFJlcXVlc3RMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0UmVxdWVzdExpc3RfY2IgX2hpZGxfY2IpIHsKKyAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6dXRpbHM6OlN1Ym1pdEluZm8gc3VibWl0SW5mbzsKKyAgICBIU3VibWl0SW5mbyBoU3VibWl0SW5mbzsKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgQUlETCBDYXB0dXJlUmVxdWVzdCBmcm9tIHJlcXVlc3RMaXN0IGFuZCBncmFwaGljQnVmZmVyUHJvZHVjZXJzLgorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpjYW1lcmEyOjpDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdHM7CisgICAgZm9yIChhdXRvICZoUmVxdWVzdCA6IGhSZXF1ZXN0TGlzdCkgeworICAgICAgICByZXF1ZXN0cy5lbXBsYWNlX2JhY2soKTsKKyAgICAgICAgYXV0byAmcmVxdWVzdCA9IHJlcXVlc3RzLmJhY2soKTsKKyAgICAgICAgaWYgKCFjb252ZXJ0UmVxdWVzdEZyb21IaWRsKGhSZXF1ZXN0LCAmcmVxdWVzdCkpIHsKKyAgICAgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQsIGhTdWJtaXRJbmZvKTsKKyAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbURldmljZVJlbW90ZS0+c3VibWl0UmVxdWVzdExpc3QocmVxdWVzdHMsIHN0cmVhbWluZywgJnN1Ym1pdEluZm8pOworICAgIG1SZXF1ZXN0SWQgPSBzdWJtaXRJbmZvLm1SZXF1ZXN0SWQ7CisgICAgY29udmVydFRvSGlkbChzdWJtaXRJbmZvLCAmaFN1Ym1pdEluZm8pOworICAgIF9oaWRsX2NiKEhTdGF0dXM6Ok5PX0VSUk9SLCBoU3VibWl0SW5mbyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpjYW5jZWxSZXBlYXRpbmdSZXF1ZXN0KGNhbmNlbFJlcGVhdGluZ1JlcXVlc3RfY2IgX2hpZGxfY2IpIHsKKyAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IDA7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+Y2FuY2VsUmVxdWVzdChtUmVxdWVzdElkLCAmbGFzdEZyYW1lTnVtYmVyKTsKKyAgICBfaGlkbF9jYihCMkhTdGF0dXMocmV0KSwgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48SFN0YXR1cz4gSGlkbENhbWVyYURldmljZVVzZXI6OmJlZ2luQ29uZmlndXJlKCkgeworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPmJlZ2luQ29uZmlndXJlKCk7CisgICAgcmV0dXJuIEIySFN0YXR1cyhyZXQpOworfQorCitSZXR1cm48SFN0YXR1cz4gSGlkbENhbWVyYURldmljZVVzZXI6OmVuZENvbmZpZ3VyZShTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBvcGVyYXRpbmdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25QYXJhbXMpIHsKKyAgICBhbmRyb2lkOjpDYW1lcmFNZXRhZGF0YSBjYW1lcmFNZXRhZGF0YTsKKyAgICBpZiAoIWNvbnZlcnRGcm9tSGlkbChzZXNzaW9uUGFyYW1zLCAmY2FtZXJhTWV0YWRhdGEpKSB7CisgICAgICAgIHJldHVybiBIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOworICAgIH0KKworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPmVuZENvbmZpZ3VyZShjb252ZXJ0RnJvbUhpZGwob3BlcmF0aW5nTW9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYU1ldGFkYXRhKTsKKyAgICByZXR1cm4gQjJIU3RhdHVzKHJldCk7Cit9CisKK1JldHVybjxIU3RhdHVzPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6ZGVsZXRlU3RyZWFtKGludDMyX3Qgc3RyZWFtSWQpIHsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT5kZWxldGVTdHJlYW0oc3RyZWFtSWQpOworICAgIHJldHVybiBCMkhTdGF0dXMocmV0KTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpjcmVhdGVTdHJlYW0oY29uc3QgSE91dHB1dENvbmZpZ3VyYXRpb24mIGhPdXRwdXRDb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlU3RyZWFtX2NiIGhpZGxfY2JfKSB7CisgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBvdXRwdXRDb25maWd1cmF0aW9uID0KKyAgICAgICAgY29udmVydEZyb21IaWRsKGhPdXRwdXRDb25maWd1cmF0aW9uKTsKKyAgICBpbnQzMl90IG5ld1N0cmVhbUlkID0gMDsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT5jcmVhdGVTdHJlYW0ob3V0cHV0Q29uZmlndXJhdGlvbiwgJm5ld1N0cmVhbUlkKTsKKyAgICBIU3RhdHVzIHN0YXR1cyA9IEIySFN0YXR1cyhyZXQpOworICAgIGhpZGxfY2JfKHN0YXR1cywgbmV3U3RyZWFtSWQpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Y3JlYXRlRGVmYXVsdFJlcXVlc3QoVGVtcGxhdGVJZCB0ZW1wbGF0ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVEZWZhdWx0UmVxdWVzdF9jYiBfaGlkbF9jYikgeworICAgIGFuZHJvaWQ6OkNhbWVyYU1ldGFkYXRhIGNhbWVyYU1ldGFkYXRhOworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KGNvbnZlcnRGcm9tSGlkbCh0ZW1wbGF0ZUlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FtZXJhTWV0YWRhdGEpOworICAgIEhTdGF0dXMgaFN0YXR1cyA9IEIySFN0YXR1cyhyZXQpOworICAgIEhDYW1lcmFNZXRhZGF0YSBoaWRsTWV0YWRhdGE7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJhd01ldGFkYXRhID0gY2FtZXJhTWV0YWRhdGEuZ2V0QW5kTG9jaygpOworICAgIGNvbnZlcnRUb0hpZGwocmF3TWV0YWRhdGEsICZoaWRsTWV0YWRhdGEpOworICAgIF9oaWRsX2NiKGhTdGF0dXMsIGhpZGxNZXRhZGF0YSk7CisgICAgY2FtZXJhTWV0YWRhdGEudW5sb2NrKHJhd01ldGFkYXRhKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48SFN0YXR1cz4gSGlkbENhbWVyYURldmljZVVzZXI6OndhaXRVbnRpbElkbGUoKSB7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+d2FpdFVudGlsSWRsZSgpOworICAgIHJldHVybiBCMkhTdGF0dXMocmV0KTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpmbHVzaChmbHVzaF9jYiBfaGlkbF9jYikgeworICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gMDsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT5mbHVzaCgmbGFzdEZyYW1lTnVtYmVyKTsKKyAgICBfaGlkbF9jYihCMkhTdGF0dXMocmV0KSxsYXN0RnJhbWVOdW1iZXIpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxIU3RhdHVzPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6dXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbigKKyAgICBpbnQzMl90IHN0cmVhbUlkLAorICAgIGNvbnN0IEhPdXRwdXRDb25maWd1cmF0aW9uJiBoT3V0cHV0Q29uZmlndXJhdGlvbikgeworICAgIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0cHV0Q29uZmlndXJhdGlvbiA9IGNvbnZlcnRGcm9tSGlkbChoT3V0cHV0Q29uZmlndXJhdGlvbik7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+dXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbihzdHJlYW1JZCwgb3V0cHV0Q29uZmlndXJhdGlvbik7CisgICAgcmV0dXJuIEIySFN0YXR1cyhyZXQpOworfQorCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gZGV2aWNlCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gZnJhbWV3b3JrcworfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4ZjFkNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuaApAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9GUkFNRVdPUktTX0NBTUVSQURFVklDRVVTRVJfVjJfMF9DQU1FUkFERVZJQ0VVU0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9GUkFNRVdPUktTX0NBTUVSQURFVklDRVVTRVJfVjJfMF9DQU1FUkFERVZJQ0VVU0VSX0gKKworI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9jb21tb24vMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL0lDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworI2luY2x1ZGUgPENhbWVyYVNlcnZpY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIGRldmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OkNhcHR1cmVSZXF1ZXN0OwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU7Cit1c2luZyBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwordXNpbmcgaGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Cit1c2luZyBoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPSBNZXNzYWdlUXVldWU8dWludDhfdCwga1N5bmNocm9uaXplZFJlYWRXcml0ZT47Cit1c2luZyBDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUgPSBNZXNzYWdlUXVldWU8dWludDhfdCwga1N5bmNocm9uaXplZFJlYWRXcml0ZT47Cit1c2luZyBUZW1wbGF0ZUlkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpUZW1wbGF0ZUlkOworCit1c2luZyBIQ2FtZXJhRGV2aWNlVXNlciA9IGRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZVVzZXI7Cit1c2luZyBIQ2FtZXJhTWV0YWRhdGEgPSBjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFNZXRhZGF0YTsKK3VzaW5nIEhDYXB0dXJlUmVxdWVzdCA9IGRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3Q7Cit1c2luZyBIT3V0cHV0Q29uZmlndXJhdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6T3V0cHV0Q29uZmlndXJhdGlvbjsKK3VzaW5nIEhQaHlzaWNhbENhbWVyYVNldHRpbmdzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhbWVyYVNldHRpbmdzOwordXNpbmcgSFN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6U3RhdHVzOworCitzdGF0aWMgY29uc3RleHByIGludDMyX3QgUkVRVUVTVF9JRF9OT05FID0gLTE7CisKK3N0cnVjdCBIaWRsQ2FtZXJhRGV2aWNlVXNlciBmaW5hbCA6IHB1YmxpYyBIQ2FtZXJhRGV2aWNlVXNlciB7CisgICAgSGlkbENhbWVyYURldmljZVVzZXIoY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyPiAmZGV2aWNlUmVtb3RlKTsKKworICAgIH5IaWRsQ2FtZXJhRGV2aWNlVXNlcigpIHsgfQorCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZGlzY29ubmVjdCgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZ2V0Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlKAorICAgICAgICBnZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWVfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZ2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoCisgICAgICAgIGdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IHN1Ym1pdFJlcXVlc3RMaXN0KGNvbnN0IGhpZGxfdmVjPEhDYXB0dXJlUmVxdWVzdD4mIHJlcXVlc3RMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nLCBzdWJtaXRSZXF1ZXN0TGlzdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjYW5jZWxSZXBlYXRpbmdSZXF1ZXN0KGNhbmNlbFJlcGVhdGluZ1JlcXVlc3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48SFN0YXR1cz4gYmVnaW5Db25maWd1cmUoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPEhTdGF0dXM+IGVuZENvbmZpZ3VyZShTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBvcGVyYXRpbmdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvblBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIFJldHVybjxIU3RhdHVzPiBkZWxldGVTdHJlYW0oaW50MzJfdCBzdHJlYW1JZCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjcmVhdGVTdHJlYW0oY29uc3QgSE91dHB1dENvbmZpZ3VyYXRpb24mIG91dHB1dENvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVN0cmVhbV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48dm9pZD4gY3JlYXRlRGVmYXVsdFJlcXVlc3QoVGVtcGxhdGVJZCB0ZW1wbGF0ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVEZWZhdWx0UmVxdWVzdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxIU3RhdHVzPiB3YWl0VW50aWxJZGxlKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBmbHVzaChmbHVzaF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxIU3RhdHVzPiB1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKAorICAgICAgICBpbnQzMl90IHN0cmVhbUlkLCBjb25zdCBIT3V0cHV0Q29uZmlndXJhdGlvbiYgb3V0cHV0Q29uZmlndXJhdGlvbikgb3ZlcnJpZGU7CisKKyAgICBib29sIGluaXRTdGF0dXMoKSB7IHJldHVybiBtSW5pdFN1Y2Nlc3M7IH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4gZ2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoKSB7CisgICAgICAgIHJldHVybiBtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU7CisgICAgfQorCisgcHJpdmF0ZToKKyAgICBib29sIGluaXREZXZpY2UoKTsKKworICAgIGJvb2wgY29udmVydFJlcXVlc3RGcm9tSGlkbChjb25zdCBIQ2FwdHVyZVJlcXVlc3QgJmhSZXF1ZXN0LCBDYXB0dXJlUmVxdWVzdCAqcmVxdWVzdCk7CisKKyAgICBib29sIGNvcHlQaHlzaWNhbENhbWVyYVNldHRpbmdzKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxIUGh5c2ljYWxDYW1lcmFTZXR0aW5ncz4gJmhQaHlzaWNhbENhbWVyYVNldHRpbmdzLAorICAgICAgICBzdGQ6OnZlY3RvcjxDYXB0dXJlUmVxdWVzdDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5ncz4gKnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MpOworCisgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyPiBtRGV2aWNlUmVtb3RlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWU+IG1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUgPSBudWxscHRyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4gbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKKyAgICBib29sIG1Jbml0U3VjY2VzcyA9IGZhbHNlOworICAgIGludDMyX3QgbVJlcXVlc3RJZCA9IFJFUVVFU1RfSURfTk9ORTsKK307CisKK30gLy8gaW1wbGVtZW50YXRpb24KK30gLy8gVjJfMAorfSAvLyBkZXZpY2UKK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBmcmFtZXdvcmtzCit9IC8vIGFuZHJvaWQKKyNlbmRpZiAvLyBBTkRST0lEX0ZSQU1FT1dPUktTX0NBTUVSQURFVklDRVVTRVJfVjJfMF9DQU1FUkFERVZJQ0VVU0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRjZmU0MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwCkBAIC0wLDAgKzEsMjc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2Ugc2VydmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SGlkbENhbWVyYVNlcnZpY2U7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGw7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OkIySFN0YXR1czsKK3VzaW5nIGhhcmR3YXJlOjpWb2lkOworCit1c2luZyBkZXZpY2U6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M7Cit1c2luZyBkZXZpY2U6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpIaWRsQ2FtZXJhRGV2aWNlVXNlcjsKK3VzaW5nIHNlcnZpY2U6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpIMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7Cit1c2luZyBIQ2FtZXJhTWV0YWRhdGFUeXBlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpDYW1lcmFNZXRhZGF0YVR5cGU7Cit1c2luZyBIVmVuZG9yVGFnID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpWZW5kb3JUYWc7Cit1c2luZyBIVmVuZG9yVGFnU2VjdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6VmVuZG9yVGFnU2VjdGlvbjsKK3VzaW5nIEhQcm92aWRlcklkQW5kVmVuZG9yVGFnU2VjdGlvbnMgPQorICAgICAgICBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlByb3ZpZGVySWRBbmRWZW5kb3JUYWdTZWN0aW9uczsKKworc3A8SGlkbENhbWVyYVNlcnZpY2U+IGdIaWRsQ2FtZXJhU2VydmljZTsKKworc3A8SGlkbENhbWVyYVNlcnZpY2U+IEhpZGxDYW1lcmFTZXJ2aWNlOjpnZXRJbnN0YW5jZShhbmRyb2lkOjpDYW1lcmFTZXJ2aWNlICpjcykgeworICAgIGdIaWRsQ2FtZXJhU2VydmljZSA9IG5ldyBIaWRsQ2FtZXJhU2VydmljZShjcyk7CisgICAgcmV0dXJuIGdIaWRsQ2FtZXJhU2VydmljZTsKK30KKworUmV0dXJuPHZvaWQ+CitIaWRsQ2FtZXJhU2VydmljZTo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IGhpZGxfc3RyaW5nJiBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzX2NiIF9oaWRsX2NiKSB7CisgICAgYW5kcm9pZDo6Q2FtZXJhTWV0YWRhdGEgY2FtZXJhTWV0YWRhdGE7CisgICAgSFN0YXR1cyBzdGF0dXMgPSBIU3RhdHVzOjpOT19FUlJPUjsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXJ2aWNlUmV0ID0KKyAgICAgICAgbUFpZGxJQ2FtZXJhU2VydmljZS0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKFN0cmluZzE2KGNhbWVyYUlkLmNfc3RyKCkpLCAmY2FtZXJhTWV0YWRhdGEpOworICAgIEhDYW1lcmFNZXRhZGF0YSBoaWRsTWV0YWRhdGE7CisgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSkgeworICAgICAgICBzd2l0Y2goc2VydmljZVJldC5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSkgeworICAgICAgICAgICAgLy8gTm8gRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRCBzaW5jZSB3ZSdyZSBpbiB0aGUgc2FtZSBwcm9jZXNzLgorICAgICAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgSUQgJXMgZG9lcyBub3QgZXhpc3QhIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiR2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZnJvbSBjYW1lcmEgc2VydmljZSBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUmV0LnRvU3RyaW5nOCgpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCMkhTdGF0dXMoc2VydmljZVJldCk7CisgICAgICAgICAgfQorICAgICAgICBfaGlkbF9jYihzdGF0dXMsIGhpZGxNZXRhZGF0YSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdNZXRhZGF0YSA9IGNhbWVyYU1ldGFkYXRhLmdldEFuZExvY2soKTsKKyAgICBjb252ZXJ0VG9IaWRsKHJhd01ldGFkYXRhLCAmaGlkbE1ldGFkYXRhKTsKKyAgICBfaGlkbF9jYihzdGF0dXMsIGhpZGxNZXRhZGF0YSk7CisgICAgY2FtZXJhTWV0YWRhdGEudW5sb2NrKHJhd01ldGFkYXRhKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYVNlcnZpY2U6OmNvbm5lY3REZXZpY2UoY29uc3Qgc3A8SENhbWVyYURldmljZUNhbGxiYWNrPiYgaENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0RGV2aWNlX2NiIF9oaWRsX2NiKSB7CisgICAgLy8gSGVyZSwgd2UgZmlyc3QgZ2V0IElDYW1lcmFEZXZpY2VVc2VyIGZyb20gbUFpZGxJQ2FtZXJhU2VydmljZSwgdGhlbiBzYXZlCisgICAgLy8gdGhhdCBpbnRlcmZhY2UgaW4gdGhlIG5ld2x5IGNyZWF0ZWQgSGlkbENhbWVyYURldmljZVVzZXIgaW1wbCBjbGFzcy4KKyAgICBpZiAobUFpZGxJQ2FtZXJhU2VydmljZSA9PSBudWxscHRyKSB7CisgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OlVOS05PV05fRVJST1IsIG51bGxwdHIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI+IGRldmljZVJlbW90ZSA9IG51bGxwdHI7CisgICAgLy8gQ3JlYXRlIGEgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFjayBvYmplY3Qgd2hpY2ggaW50ZXJuYWxseQorICAgIC8vIGNhbGxzIGNhbGxiYWNrIGZ1bmN0aW9ucyBwYXNzZWQgdGhyb3VnaCBoQ2FsbGJhY2suCisgICAgc3A8SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBoeWJyaWRDYWxsYmFja3MgPSBuZXcgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKGhDYWxsYmFjayk7CisgICAgaWYgKCFoeWJyaWRDYWxsYmFja3MtPmluaXRpYWxpemVMb29wZXIoKSkgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGhhbmRsZSBjYWxsYmFja3Mgb24gZGV2aWNlLCBjYW5ub3QgY29ubmVjdCIpOworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpVTktOT1dOX0VSUk9SLCBudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNhbGxiYWNrcyA9IGh5YnJpZENhbGxiYWNrczsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXJ2aWNlUmV0ID0gbUFpZGxJQ2FtZXJhU2VydmljZS0+Y29ubmVjdERldmljZSgKKyAgICAgICAgICAgIGNhbGxiYWNrcywgU3RyaW5nMTYoY2FtZXJhSWQuY19zdHIoKSksIFN0cmluZzE2KCIiKSwKKyAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6VVNFX0NBTExJTkdfVUlELCAvKm91dCovJmRldmljZVJlbW90ZSk7CisgICAgSFN0YXR1cyBzdGF0dXMgPSBIU3RhdHVzOjpOT19FUlJPUjsKKyAgICBpZiAoIXNlcnZpY2VSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbm5lY3QgdG8gY2FtZXJhIGRldmljZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHN0YXR1cyA9IEIySFN0YXR1cyhzZXJ2aWNlUmV0KTsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgLy8gTm93IHdlIGNyZWF0ZSBhIEhpZGxDYW1lcmFEZXZpY2VVc2VyIGNsYXNzLCBzdG9yZSB0aGUgZGV2aWNlUmVtb3RlIGluIGl0LAorICAgIC8vIGFuZCByZXR1cm4gdGhhdCBiYWNrLiBBbGwgY2FsbHMgb24gdGhhdCBpbnRlcmZhY2Ugd2lsbCBiZSBmb3J3YXJkZWQgdG8KKyAgICAvLyB0aGUgQUlETCBpbnRlcmZhY2UuCisgICAgc3A8SGlkbENhbWVyYURldmljZVVzZXI+IGhEZXZpY2VSZW1vdGUgPSBuZXcgSGlkbENhbWVyYURldmljZVVzZXIoZGV2aWNlUmVtb3RlKTsKKyAgICBpZiAoIWhEZXZpY2VSZW1vdGUtPmluaXRTdGF0dXMoKSkgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBpbml0aWFsaXplIGNhbWVyYSBkZXZpY2UgSElETCB3cmFwcGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6VU5LTk9XTl9FUlJPUiwgbnVsbHB0cik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIGh5YnJpZENhbGxiYWNrcy0+c2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoaERldmljZVJlbW90ZS0+Z2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoKSk7CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBoRGV2aWNlUmVtb3RlKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCit2b2lkIEhpZGxDYW1lcmFTZXJ2aWNlOjphZGRUb0xpc3RlbmVyQ2FjaGVMb2NrZWQoc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gaExpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBjc0xpc3RlbmVyKSB7CisgICAgICAgIG1MaXN0ZW5lcnMuZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV9wYWlyKGhMaXN0ZW5lciwgY3NMaXN0ZW5lcikpOworfQorCitzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4KK0hpZGxDYW1lcmFTZXJ2aWNlOjpzZWFyY2hMaXN0ZW5lckNhY2hlTG9ja2VkKHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGhMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2hvdWxkUmVtb3ZlKSB7CisgICAgLy8gR28gdGhyb3VnaCB0aGUgbUxpc3RlbmVycyBsaXN0IGFuZCBjb21wYXJlIHRoZSBsaXN0ZW5lciB3aXRoIHRoZSBISURMCisgICAgLy8gbGlzdGVuZXIgcmVnaXN0ZXJlZC4KKyAgICBhdXRvIGl0ID0gbUxpc3RlbmVycy5iZWdpbigpOworICAgIHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGNzTGlzdGVuZXIgPSBudWxscHRyOworICAgIGZvciAoO2l0ICE9IG1MaXN0ZW5lcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgaWYgKGhhcmR3YXJlOjppbnRlcmZhY2VzRXF1YWwoaXQtPmZpcnN0LCBoTGlzdGVuZXIpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaXQgIT0gbUxpc3RlbmVycy5lbmQoKSkgeworICAgICAgICBjc0xpc3RlbmVyID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKHNob3VsZFJlbW92ZSkgeworICAgICAgICAgIG1MaXN0ZW5lcnMuZXJhc2UoaXQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjc0xpc3RlbmVyOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYVNlcnZpY2U6OmFkZExpc3RlbmVyKGNvbnN0IHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBoQ3NMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGlzdGVuZXJfY2IgX2hpZGxfY2IpIHsKKyAgICBpZiAobUFpZGxJQ2FtZXJhU2VydmljZSA9PSBudWxscHRyKSB7CisgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OlVOS05PV05fRVJST1IsIHt9KTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgaWYgKGhDc0xpc3RlbmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIGxpc3RlbmVyIG11c3Qgbm90IGJlIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5ULCB7fSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBjc0xpc3RlbmVyID0gbnVsbHB0cjsKKyAgICAvLyBDaGVjayB0aGUgY2FjaGUgZm9yIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjYWxsYmFja3MKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1MaXN0ZW5lckxpc3RMb2NrKTsKKyAgICAgICAgY3NMaXN0ZW5lciA9IHNlYXJjaExpc3RlbmVyQ2FjaGVMb2NrZWQoaENzTGlzdGVuZXIpOworICAgICAgICBpZiAoY3NMaXN0ZW5lciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBXcmFwIGFuIGhDc0xpc3RlbmVyIHdpdGggQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lciBhbmQgcGFzcyBpdCB0bworICAgICAgICAgICAgLy8gQ2FtZXJhU2VydmljZS4KKyAgICAgICAgICAgIGNzTGlzdGVuZXIgPSBuZXcgSDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyKGhDc0xpc3RlbmVyKTsKKyAgICAgICAgICAgIC8vIEFkZCB0byBjYWNoZQorICAgICAgICAgICAgYWRkVG9MaXN0ZW5lckNhY2hlTG9ja2VkKGhDc0xpc3RlbmVyLCBjc0xpc3RlbmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVHJ5aW5nIHRvIGFkZCBhIGxpc3RlbmVyICVwIGFscmVhZHkgcmVnaXN0ZXJlZCIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGhDc0xpc3RlbmVyLmdldCgpKTsKKyAgICAgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQsIHt9KTsKKyAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0YXR1cz4gY2FtZXJhU3RhdHVzQW5kSWRze307CisgICAgYmluZGVyOjpTdGF0dXMgc2VydmljZVJldCA9CisgICAgICAgIG1BaWRsSUNhbWVyYVNlcnZpY2UtPmFkZExpc3RlbmVySGVscGVyKGNzTGlzdGVuZXIsICZjYW1lcmFTdGF0dXNBbmRJZHMsIHRydWUpOworICAgIEhTdGF0dXMgc3RhdHVzID0gSFN0YXR1czo6Tk9fRVJST1I7CisgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSkgeworICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gYWRkIGNhbWVyYSBkZXZpY2Ugc3RhdHVzIGxpc3RlbmVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHN0YXR1cyA9IEIySFN0YXR1cyhzZXJ2aWNlUmV0KTsKKyAgICAgIF9oaWRsX2NiKHN0YXR1cywge30pOworICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgaGlkbF92ZWM8SENhbWVyYVN0YXR1c0FuZElkPiBoQ2FtZXJhU3RhdHVzQW5kSWRzOworICAgIC8vQ29udmVydCBjYW1lcmFTdGF0dXNBbmRJZHMgdG8gSElETCBhbmQgY2FsbCBjYWxsYmFjaworICAgIGNvbnZlcnRUb0hpZGwoY2FtZXJhU3RhdHVzQW5kSWRzLCAmaENhbWVyYVN0YXR1c0FuZElkcyk7CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBoQ2FtZXJhU3RhdHVzQW5kSWRzKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48SFN0YXR1cz4gSGlkbENhbWVyYVNlcnZpY2U6OnJlbW92ZUxpc3RlbmVyKGNvbnN0IHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBoQ3NMaXN0ZW5lcikgeworICAgIGlmIChoQ3NMaXN0ZW5lciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBsaXN0ZW5lciBtdXN0IG5vdCBiZSBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ7CisgICAgfQorICAgIHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGNzTGlzdGVuZXIgPSBudWxscHRyOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxpc3RlbmVyTGlzdExvY2spOworICAgICAgICBjc0xpc3RlbmVyID0gc2VhcmNoTGlzdGVuZXJDYWNoZUxvY2tlZChoQ3NMaXN0ZW5lciwgLypyZW1vdmVJZkZvdW5kKi90cnVlKTsKKyAgICB9CisgICAgaWYgKGNzTGlzdGVuZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgIG1BaWRsSUNhbWVyYVNlcnZpY2UtPnJlbW92ZUxpc3RlbmVyKGNzTGlzdGVuZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlcyBSZW1vdmluZyB1bnJlZ2lzdGVyZWQgbGlzdGVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIGhDc0xpc3RlbmVyLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ7CisgICAgfQorICAgIHJldHVybiBIU3RhdHVzOjpOT19FUlJPUjsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFTZXJ2aWNlOjpnZXRDYW1lcmFWZW5kb3JUYWdTZWN0aW9ucyhnZXRDYW1lcmFWZW5kb3JUYWdTZWN0aW9uc19jYiBfaGlkbF9jYikgeworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZT4gZ0NhY2hlID0gVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOjpnZXRHbG9iYWxWZW5kb3JUYWdDYWNoZSgpOworICAgIGlmIChnQ2FjaGUgPT0gbnVsbHB0cikgeworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpVTktOT1dOX0VSUk9SLCB7fSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxtZXRhZGF0YV92ZW5kb3JfaWRfdCwgc3A8YW5kcm9pZDo6VmVuZG9yVGFnRGVzY3JpcHRvcj4+CisgICAgICAgICAgICAmdmVuZG9ySWRzQW5kVGFnRGVzY3MgPSBnQ2FjaGUtPmdldFZlbmRvcklkc0FuZFRhZ0Rlc2NyaXB0b3JzKCk7CisgICAgaWYgKHZlbmRvcklkc0FuZFRhZ0Rlc2NzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OlVOS05PV05fRVJST1IsIHt9KTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBoaWRsX3ZlYzxIUHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zPiBoVGFnSWRzQW5kVmVuZG9yVGFnU2VjdGlvbnM7CisgICAgaFRhZ0lkc0FuZFZlbmRvclRhZ1NlY3Rpb25zLnJlc2l6ZSh2ZW5kb3JJZHNBbmRUYWdEZXNjcy5zaXplKCkpOworICAgIHNpemVfdCBqID0gMDsKKyAgICBmb3IgKGF1dG8gJnZlbmRvcklkQW5kVGFnRGVzY3MgOiB2ZW5kb3JJZHNBbmRUYWdEZXNjcykgeworICAgICAgICBoaWRsX3ZlYzxIVmVuZG9yVGFnU2VjdGlvbj4gaFZlbmRvclRhZ1NlY3Rpb25zOworICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkZXNjID0gdmVuZG9ySWRBbmRUYWdEZXNjcy5zZWNvbmQ7CisgICAgICAgIGNvbnN0IFNvcnRlZFZlY3RvcjxTdHJpbmc4Piogc2VjdGlvbk5hbWVzID0gZGVzYy0+Z2V0QWxsU2VjdGlvbk5hbWVzKCk7CisgICAgICAgIHNpemVfdCBudW1TZWN0aW9ucyA9IHNlY3Rpb25OYW1lcy0+c2l6ZSgpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxIVmVuZG9yVGFnPj4gdGFnc0J5U2VjdGlvbihudW1TZWN0aW9ucyk7CisgICAgICAgIGludCB0YWdDb3VudCA9IGRlc2MtPmdldFRhZ0NvdW50KCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiB0YWdzKHRhZ0NvdW50KTsKKyAgICAgICAgZGVzYy0+Z2V0VGFnQXJyYXkodGFncy5kYXRhKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEhWZW5kb3JUYWcgdnQ7CisgICAgICAgICAgICB2dC50YWdJZCA9IHRhZ3NbaV07CisgICAgICAgICAgICB2dC50YWdOYW1lID0gZGVzYy0+Z2V0VGFnTmFtZSh0YWdzW2ldKTsKKyAgICAgICAgICAgIHZ0LnRhZ1R5cGUgPSAoSENhbWVyYU1ldGFkYXRhVHlwZSkgZGVzYy0+Z2V0VGFnVHlwZSh0YWdzW2ldKTsKKyAgICAgICAgICAgIHNzaXplX3Qgc2VjdGlvbklkeCA9IGRlc2MtPmdldFNlY3Rpb25JbmRleCh0YWdzW2ldKTsKKyAgICAgICAgICAgIHRhZ3NCeVNlY3Rpb25bc2VjdGlvbklkeF0ucHVzaF9iYWNrKHZ0KTsKKyAgICAgICAgfQorICAgICAgICBoVmVuZG9yVGFnU2VjdGlvbnMucmVzaXplKG51bVNlY3Rpb25zKTsKKyAgICAgICAgZm9yIChzaXplX3QgcyA9IDA7IHMgPCBudW1TZWN0aW9uczsgcysrKSB7CisgICAgICAgICAgICBoVmVuZG9yVGFnU2VjdGlvbnNbc10uc2VjdGlvbk5hbWUgPSAoKnNlY3Rpb25OYW1lcylbc10uc3RyaW5nKCk7CisgICAgICAgICAgICBoVmVuZG9yVGFnU2VjdGlvbnNbc10udGFncyA9IHRhZ3NCeVNlY3Rpb25bc107CisgICAgICAgIH0KKyAgICAgICAgSFByb3ZpZGVySWRBbmRWZW5kb3JUYWdTZWN0aW9ucyAmaFByb3ZpZGVySWRBbmRWZW5kb3JUYWdTZWN0aW9ucyA9CisgICAgICAgICAgICAgICAgaFRhZ0lkc0FuZFZlbmRvclRhZ1NlY3Rpb25zW2pdOworICAgICAgICBoUHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zLnByb3ZpZGVySWQgPSB2ZW5kb3JJZEFuZFRhZ0Rlc2NzLmZpcnN0OworICAgICAgICBoUHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zLnZlbmRvclRhZ1NlY3Rpb25zID0gc3RkOjptb3ZlKGhWZW5kb3JUYWdTZWN0aW9ucyk7CisgICAgICAgIGorKzsKKyAgICB9CisgICAgX2hpZGxfY2IoSFN0YXR1czo6Tk9fRVJST1IsIGhUYWdJZHNBbmRWZW5kb3JUYWdTZWN0aW9ucyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworfSAvLyBpbXBsZW1lbnRhdGlvbgorfSAvLyBWMl8wCit9IC8vIHNlcnZpY2UKK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBmcmFtZXdvcmtzCit9IC8vIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYWQwYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9GUkFNRVdPUktTX0NBTUVSQVNFUlZJQ0VfVjJfMF9DQU1FUkFTRVJWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9GUkFNRVdPUktTX0NBTUVSQVNFUlZJQ0VfVjJfMF9DQU1FUkFTRVJWSUNFX0gKKworI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2NvbW1vbi8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworI2luY2x1ZGUgPENhbWVyYVNlcnZpY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIHNlcnZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgaGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7Cit1c2luZyBoYXJkd2FyZTo6UmV0dXJuOworCit1c2luZyBIQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VDYWxsYmFjazsKK3VzaW5nIEhDYW1lcmFNZXRhZGF0YSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYU1ldGFkYXRhOwordXNpbmcgSENhbWVyYVNlcnZpY2UgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpJQ2FtZXJhU2VydmljZTsKK3VzaW5nIEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOwordXNpbmcgSFN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6U3RhdHVzOwordXNpbmcgSENhbWVyYVN0YXR1c0FuZElkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhU3RhdHVzQW5kSWQ7CisKK3N0cnVjdCBIaWRsQ2FtZXJhU2VydmljZSBmaW5hbCA6IHB1YmxpYyBIQ2FtZXJhU2VydmljZSB7CisKKyAgICB+SGlkbENhbWVyYVNlcnZpY2UoKSB7IH07CisKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMi4wOjpJQ2FtZXJhU2VydmljZSBmb2xsb3cuCisKKyAgICBSZXR1cm48dm9pZD4gY29ubmVjdERldmljZShjb25zdCBzcDxIQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgY2FtZXJhSWQsIGNvbm5lY3REZXZpY2VfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPHZvaWQ+IGFkZExpc3RlbmVyKGNvbnN0IHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGlzdGVuZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPEhTdGF0dXM+IHJlbW92ZUxpc3RlbmVyKGNvbnN0IHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBsaXN0ZW5lcikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48dm9pZD4gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IGhpZGxfc3RyaW5nJiBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhbWVyYUNoYXJhY3RlcmlzdGljc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48dm9pZD4gZ2V0Q2FtZXJhVmVuZG9yVGFnU2VjdGlvbnMoZ2V0Q2FtZXJhVmVuZG9yVGFnU2VjdGlvbnNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBjYW1lcmFzZXJ2ZXJzIG1haW4gdGhyZWFkIHRvCisgICAgLy8gaW5zdGFudGlhdGUgdGhlIGhpZGwgY2FtZXJhc2VydmVyLgorICAgIHN0YXRpYyBzcDxIaWRsQ2FtZXJhU2VydmljZT4gZ2V0SW5zdGFuY2UoYW5kcm9pZDo6Q2FtZXJhU2VydmljZSAqY3MpOworCitwcml2YXRlOgorICAgIEhpZGxDYW1lcmFTZXJ2aWNlKGFuZHJvaWQ6OkNhbWVyYVNlcnZpY2UgKmNzKSA6IG1BaWRsSUNhbWVyYVNlcnZpY2UoY3MpIHsgfTsKKworICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBzZWFyY2hMaXN0ZW5lckNhY2hlTG9ja2VkKAorICAgICAgICBzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBsaXN0ZW5lciwgLypyZW1vdmVJZkZvdW5kKi8gYm9vbCBzaG91bGRSZW1vdmUgPSBmYWxzZSk7CisKKyAgICB2b2lkIGFkZFRvTGlzdGVuZXJDYWNoZUxvY2tlZChzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBoTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGNzTGlzdGVuZXIpOworCisgICAgYW5kcm9pZDo6Q2FtZXJhU2VydmljZSAqY29uc3QgbUFpZGxJQ2FtZXJhU2VydmljZSA9IG51bGxwdHI7CisKKyAgICBNdXRleCBtTGlzdGVuZXJMaXN0TG9jazsKKworICAgIHVzaW5nIEhJTGlzdGVuZXJzID0KKyAgICAgICAgc3RkOjpwYWlyPHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+LCBzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPj47CisgICAgc3RkOjpsaXN0PEhJTGlzdGVuZXJzPiBtTGlzdGVuZXJzOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIHNlcnZpY2UKK30gIC8vIG5hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlCit9ICAvLyBuYW1lc3BhY2UgZnJhbWV3b3JrcworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0ZSQU1FV09SS1NfQ0FNRVJBU0VSVklDRV9WMl8wX0NBTUVSQVNFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggZjc3MDY5Yy4uYjRlN2MzMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rCkBAIC0yNywxNyArMjcsMjQgQEAKICAgICBsaWJjYW1lcmFfY2xpZW50IFwKICAgICBsaWJjYW1lcmFfbWV0YWRhdGEgXAogICAgIGxpYnV0aWxzIFwKKyAgICBsaWJqcGVnIFwKKyAgICBsaWJleGlmIFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wIFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQgXAorICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNSBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDEuMCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMgorICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIgXAorICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjQKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgc3lzdGVtL21lZGlhL3ByaXZhdGUvY2FtZXJhL2luY2x1ZGUgXAorICAgIGV4dGVybmFsL2R5bmFtaWNfZGVwdGgvaW5jbHVkZXMgXAorICAgIGV4dGVybmFsL2R5bmFtaWNfZGVwdGgvaW50ZXJuYWwgXAogCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yCiAKIExPQ0FMX01PRFVMRTo9IGNhbWVyYXNlcnZpY2VfdGVzdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBkZXZpY2UtdGVzdHMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiAKIGluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0NhbWVyYVByb3ZpZGVyTWFuYWdlclRlc3QuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdC5jcHAKaW5kZXggZWY5M2Q5YS4uZjQ3ZTVhNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdC5jcHAKQEAgLTMzLDYgKzMzLDcgQEAKIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhTWV0YWRhdGFUeXBlOwogdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s7CiB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlOwogCiAvKioKICAqIEJhc2ljIHRlc3QgaW1wbGVtZW50YXRpb24gb2YgYSBjYW1lcmEgdmVyLiAzLjIgZGV2aWNlIGludGVyZmFjZQpAQCAtODcsNyArODgsNyBAQAogLyoqCiAgKiBCYXNpYyB0ZXN0IGltcGxlbWVudGF0aW9uIG9mIGEgY2FtZXJhIHByb3ZpZGVyCiAgKi8KLXN0cnVjdCBUZXN0SUNhbWVyYVByb3ZpZGVyIDogdmlydHVhbCBwdWJsaWMgcHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlciB7CitzdHJ1Y3QgVGVzdElDYW1lcmFQcm92aWRlciA6IHZpcnR1YWwgcHVibGljIHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXIgewogICAgIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXJDYWxsYmFjaz4gbUNhbGxiYWNrczsKICAgICBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6aGlkbF9zdHJpbmc+IG1EZXZpY2VOYW1lczsKICAgICBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+IG1EZXZpY2VJbnRlcmZhY2U7CkBAIC0xMDEsNiArMTAyLDcgQEAKIAogICAgIHZpcnR1YWwgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHNldENhbGxiYWNrKAogICAgICAgICAgICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlckNhbGxiYWNrPiYgY2FsbGJhY2tzKSBvdmVycmlkZSB7CisgICAgICAgIG1DYWxsZWRDb3VudGVyW1NFVF9DQUxMQkFDS10rKzsKICAgICAgICAgbUNhbGxiYWNrcyA9IGNhbGxiYWNrczsKICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPihTdGF0dXM6Ok9LKTsKICAgICB9CkBAIC0xMDgsNiArMTEwLDcgQEAKICAgICB1c2luZyBnZXRWZW5kb3JUYWdzX2NiID0gc3RkOjpmdW5jdGlvbjx2b2lkKFN0YXR1cyBzdGF0dXMsCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Y29tbW9uOjpWMV8wOjpWZW5kb3JUYWdTZWN0aW9uPiYgc2VjdGlvbnMpPjsKICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IGdldFZlbmRvclRhZ3MoZ2V0VmVuZG9yVGFnc19jYiBfaGlkbF9jYikgb3ZlcnJpZGUgeworICAgICAgICBtQ2FsbGVkQ291bnRlcltHRVRfVkVORE9SX1RBR1NdKys7CiAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIG1WZW5kb3JUYWdTZWN0aW9ucyk7CiAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwogICAgIH0KQEAgLTExNyw2ICsxMjAsNyBAQAogICAgICAgICAgICAgIGJvb2wgc3VwcG9ydCk+OwogICAgIHZpcnR1YWwgOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IGlzU2V0VG9yY2hNb2RlU3VwcG9ydGVkKAogICAgICAgICAgICAgaXNTZXRUb3JjaE1vZGVTdXBwb3J0ZWRfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbGxlZENvdW50ZXJbSVNfU0VUX1RPUkNIX01PREVfU1VQUE9SVEVEXSsrOwogICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBmYWxzZSk7CiAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwogICAgIH0KQEAgLTEyNCw2ICsxMjgsNyBAQAogICAgIHVzaW5nIGdldENhbWVyYUlkTGlzdF9jYiA9IHN0ZDo6ZnVuY3Rpb248dm9pZChTdGF0dXMgc3RhdHVzLAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpoaWRsX3N0cmluZz4mIGNhbWVyYURldmljZU5hbWVzKT47CiAgICAgdmlydHVhbCBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IGdldENhbWVyYUlkTGlzdChnZXRDYW1lcmFJZExpc3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbGxlZENvdW50ZXJbR0VUX0NBTUVSQV9JRF9MSVNUXSsrOwogICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBtRGV2aWNlTmFtZXMpOwogICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKICAgICB9CkBAIC0xNDgsNiArMTUzLDI1IEBACiAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwogICAgIH0KIAorICAgIHZpcnR1YWwgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSgKKyAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPERldmljZVN0YXRlPiBuZXdTdGF0ZSkgb3ZlcnJpZGUgeworICAgICAgICBtQ2FsbGVkQ291bnRlcltOT1RJRllfREVWSUNFX1NUQVRFXSsrOworICAgICAgICBtQ3VycmVudFN0YXRlID0gbmV3U3RhdGU7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIH0KKworICAgIGVudW0gTWV0aG9kTmFtZXMgeworICAgICAgICBTRVRfQ0FMTEJBQ0ssCisgICAgICAgIEdFVF9WRU5ET1JfVEFHUywKKyAgICAgICAgSVNfU0VUX1RPUkNIX01PREVfU1VQUE9SVEVELAorICAgICAgICBOT1RJRllfREVWSUNFX1NUQVRFLAorICAgICAgICBHRVRfQ0FNRVJBX0lEX0xJU1QsCisKKyAgICAgICAgTUVUSE9EX05BTUVfQ09VTlQKKyAgICB9OworICAgIGludCBtQ2FsbGVkQ291bnRlcltNRVRIT0RfTkFNRV9DT1VOVF0gezB9OworCisgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8RGV2aWNlU3RhdGU+IG1DdXJyZW50U3RhdGUgPSAweEZGRkZGRkZGOyAvLyBVbmxpa2VseSB0byBiZSBhIHJlYWwgc3RhdGUKIH07CiAKIC8qKgpAQCAtMTYzLDcgKzE4Nyw3IEBACiAgICAgICAgIG1UZXN0Q2FtZXJhUHJvdmlkZXIgPSBwcm92aWRlcjsKICAgICB9CiAKLSAgICBzdGQ6OnN0cmluZyBtTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lczsKIAogICAgIHZpcnR1YWwgflRlc3RJbnRlcmFjdGlvblByb3h5KCkge30KIApAQCAtMTc3LDcgKzIwMSw3IEBACiAKICAgICB2aXJ0dWFsIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGdldFNlcnZpY2UoCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc2VydmljZU5hbWUpIG92ZXJyaWRlIHsKLSAgICAgICAgbUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOworICAgICAgICBtTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lcy5wdXNoX2JhY2soc2VydmljZU5hbWUpOwogICAgICAgICByZXR1cm4gbVRlc3RDYW1lcmFQcm92aWRlcjsKICAgICB9CiAKQEAgLTIwOSwxMCArMjMzLDM0IEBACiAKICAgICByZXMgPSBwcm92aWRlck1hbmFnZXItPmluaXRpYWxpemUoc3RhdHVzTGlzdGVuZXIsICZzZXJ2aWNlUHJveHkpOwogICAgIEFTU0VSVF9FUShyZXMsIE9LKSA8PCAiVW5hYmxlIHRvIGluaXRpYWxpemUgcHJvdmlkZXIgbWFuYWdlciI7CisgICAgLy8gQ2hlY2sgdGhhdCBib3RoICJsZWdhY3kiIGFuZCAiZXh0ZXJuYWwiIHByb3ZpZGVycyAocmVhbGx5IHRoZSBzYW1lIG9iamVjdCkgYXJlIGNhbGxlZAorICAgIC8vIG9uY2UgZm9yIGFsbCB0aGUgaW5pdCBtZXRob2RzCisgICAgRVhQRUNUX0VRKHByb3ZpZGVyLT5tQ2FsbGVkQ291bnRlcltUZXN0SUNhbWVyYVByb3ZpZGVyOjpTRVRfQ0FMTEJBQ0tdLCAyKSA8PAorICAgICAgICAgICAgIk9ubHkgb25lIGNhbGwgdG8gc2V0Q2FsbGJhY2sgcGVyIHByb3ZpZGVyIGV4cGVjdGVkIGR1cmluZyBpbml0IjsKKyAgICBFWFBFQ1RfRVEocHJvdmlkZXItPm1DYWxsZWRDb3VudGVyW1Rlc3RJQ2FtZXJhUHJvdmlkZXI6OkdFVF9WRU5ET1JfVEFHU10sIDIpIDw8CisgICAgICAgICAgICAiT25seSBvbmUgY2FsbCB0byBnZXRWZW5kb3JUYWdzIHBlciBwcm92aWRlciBleHBlY3RlZCBkdXJpbmcgaW5pdCI7CisgICAgRVhQRUNUX0VRKHByb3ZpZGVyLT5tQ2FsbGVkQ291bnRlcltUZXN0SUNhbWVyYVByb3ZpZGVyOjpJU19TRVRfVE9SQ0hfTU9ERV9TVVBQT1JURURdLCAyKSA8PAorICAgICAgICAgICAgIk9ubHkgb25lIGNhbGwgdG8gaXNTZXRUb3JjaE1vZGVTdXBwb3J0ZWQgcGVyIHByb3ZpZGVyIGV4cGVjdGVkIGR1cmluZyBpbml0IjsKKyAgICBFWFBFQ1RfRVEocHJvdmlkZXItPm1DYWxsZWRDb3VudGVyW1Rlc3RJQ2FtZXJhUHJvdmlkZXI6OkdFVF9DQU1FUkFfSURfTElTVF0sIDIpIDw8CisgICAgICAgICAgICAiT25seSBvbmUgY2FsbCB0byBnZXRDYW1lcmFJZExpc3QgcGVyIHByb3ZpZGVyIGV4cGVjdGVkIGR1cmluZyBpbml0IjsKKyAgICBFWFBFQ1RfRVEocHJvdmlkZXItPm1DYWxsZWRDb3VudGVyW1Rlc3RJQ2FtZXJhUHJvdmlkZXI6Ok5PVElGWV9ERVZJQ0VfU1RBVEVdLCAyKSA8PAorICAgICAgICAgICAgIk9ubHkgb25lIGNhbGwgdG8gbm90aWZ5RGV2aWNlU3RhdGUgcGVyIHByb3ZpZGVyIGV4cGVjdGVkIGR1cmluZyBpbml0IjsKIAotICAgIGhhcmR3YXJlOjpoaWRsX3N0cmluZyBsZWdhY3lJbnN0YW5jZU5hbWUgPSAibGVnYWN5LzAiOwotICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZSwgbGVnYWN5SW5zdGFuY2VOYW1lKSA8PAorICAgIHN0ZDo6c3RyaW5nIGxlZ2FjeUluc3RhbmNlTmFtZSA9ICJsZWdhY3kvMCI7CisgICAgc3RkOjpzdHJpbmcgZXh0ZXJuYWxJbnN0YW5jZU5hbWUgPSAiZXh0ZXJuYWwvMCI7CisgICAgYm9vbCBnb3RMZWdhY3kgPSBmYWxzZTsKKyAgICBib29sIGdvdEV4dGVybmFsID0gZmFsc2U7CisgICAgRVhQRUNUX0VRKDJ1LCBzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXMuc2l6ZSgpKSA8PAorICAgICAgICAgICAgIk9ubHkgdHdvIHNlcnZpY2UgcXVlcmllcyBleHBlY3RlZCB0byBiZSBzZWVuIGJ5IGhhcmR3YXJlIHNlcnZpY2UgbWFuYWdlciI7CisKKyAgICBmb3IgKGF1dG8mIHNlcnZpY2VOYW1lIDogc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWVzKSB7CisgICAgICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBsZWdhY3lJbnN0YW5jZU5hbWUpIGdvdExlZ2FjeSA9IHRydWU7CisgICAgICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBleHRlcm5hbEluc3RhbmNlTmFtZSkgZ290RXh0ZXJuYWwgPSB0cnVlOworICAgIH0KKyAgICBBU1NFUlRfVFJVRShnb3RMZWdhY3kpIDw8CiAgICAgICAgICAgICAiTGVnYWN5IGluc3RhbmNlIG5vdCByZXF1ZXN0ZWQgZnJvbSBzZXJ2aWNlIG1hbmFnZXIiOworICAgIEFTU0VSVF9UUlVFKGdvdEV4dGVybmFsKSA8PAorICAgICAgICAgICAgIkV4dGVybmFsIGluc3RhbmNlIG5vdCByZXF1ZXN0ZWQgZnJvbSBzZXJ2aWNlIG1hbmFnZXIiOwogCiAgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIHRlc3RQcm92aWRlckZxSW50ZXJmYWNlTmFtZSA9CiAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40OjpJQ2FtZXJhUHJvdmlkZXIiOwpAQCAtMjIxLDcgKzI2OSw3IEBACiAgICAgICAgICAgICB0ZXN0UHJvdmlkZXJGcUludGVyZmFjZU5hbWUsCiAgICAgICAgICAgICB0ZXN0UHJvdmlkZXJJbnN0YW5jZU5hbWUsIGZhbHNlKTsKIAotICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZSwgdGVzdFByb3ZpZGVySW5zdGFuY2VOYW1lKSA8PAorICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXMuYmFjaygpLCB0ZXN0UHJvdmlkZXJJbnN0YW5jZU5hbWUpIDw8CiAgICAgICAgICAgICAiSW5jb3JyZWN0IGluc3RhbmNlIHJlcXVlc3RlZCBmcm9tIHNlcnZpY2UgbWFuYWdlciI7CiB9CiAKQEAgLTI1NSw3ICszMDMsNyBAQAogICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNDo6SUNhbWVyYVByb3ZpZGVyIjsKICAgICBzZXJ2aWNlUHJveHkubU1hbmFnZXJOb3RpZmljYXRpb25JbnRlcmZhY2UtPm9uUmVnaXN0cmF0aW9uKAogICAgICAgICAgICAgdGVzdFByb3ZpZGVyRnFJbnRlcmZhY2VOYW1lLCB0ZXN0UHJvdmlkZXJJbnN0YW5jZU5hbWUsIGZhbHNlKTsKLSAgICBBU1NFUlRfRVEoc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWUsIHRlc3RQcm92aWRlckluc3RhbmNlTmFtZSkgPDwKKyAgICBBU1NFUlRfRVEoc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWVzLmJhY2soKSwgdGVzdFByb3ZpZGVySW5zdGFuY2VOYW1lKSA8PAogICAgICAgICAgICAgIkluY29ycmVjdCBpbnN0YW5jZSByZXF1ZXN0ZWQgZnJvbSBzZXJ2aWNlIG1hbmFnZXIiOwogCiAgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIHNlY3Rpb25OYW1lU2Vjb25kID0gIlNlY29uZFZlbmRvclRlc3RTZWN0aW9uIjsKQEAgLTI3Myw3ICszMjEsNyBAQAogICAgIGhhcmR3YXJlOjpoaWRsX3N0cmluZyB0ZXN0UHJvdmlkZXJTZWNvbmRJbnN0YW5jZU5hbWUgPSAidGVzdDIvMCI7CiAgICAgc2VydmljZVByb3h5Lm1NYW5hZ2VyTm90aWZpY2F0aW9uSW50ZXJmYWNlLT5vblJlZ2lzdHJhdGlvbigKICAgICAgICAgICAgIHRlc3RQcm92aWRlckZxSW50ZXJmYWNlTmFtZSwgdGVzdFByb3ZpZGVyU2Vjb25kSW5zdGFuY2VOYW1lLCBmYWxzZSk7Ci0gICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lLAorICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXMuYmFjaygpLAogICAgICAgICAgICAgICB0ZXN0UHJvdmlkZXJTZWNvbmRJbnN0YW5jZU5hbWUpIDw8CiAgICAgICAgICAgICAiSW5jb3JyZWN0IGluc3RhbmNlIHJlcXVlc3RlZCBmcm9tIHNlcnZpY2UgbWFuYWdlciI7CiAKQEAgLTM2NiwzICs0MTQsMzUgQEAKICAgICBtZXRhZGF0YUNvcHkuZHVtcCgxLCAyKTsKICAgICBzZWNvbmRNZXRhZGF0YS5kdW1wKDEsIDIpOwogfQorCitURVNUKENhbWVyYVByb3ZpZGVyTWFuYWdlclRlc3QsIE5vdGlmeVN0YXRlQ2hhbmdlVGVzdCkgeworICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpoaWRsX3N0cmluZz4gZGV2aWNlTmFtZXMgeworICAgICAgICAiZGV2aWNlQDMuMi90ZXN0LzAiLAorICAgICAgICAiZGV2aWNlQDEuMC90ZXN0LzAiLAorICAgICAgICAiZGV2aWNlQDMuMi90ZXN0LzEifTsKKworICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24+IHZlbmRvclNlY3Rpb247CisgICAgc3RhdHVzX3QgcmVzOworICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gcHJvdmlkZXJNYW5hZ2VyID0gbmV3IENhbWVyYVByb3ZpZGVyTWFuYWdlcigpOworICAgIHNwPFRlc3RTdGF0dXNMaXN0ZW5lcj4gc3RhdHVzTGlzdGVuZXIgPSBuZXcgVGVzdFN0YXR1c0xpc3RlbmVyKCk7CisgICAgVGVzdEludGVyYWN0aW9uUHJveHkgc2VydmljZVByb3h5OworICAgIHNwPFRlc3RJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyID0gIG5ldyBUZXN0SUNhbWVyYVByb3ZpZGVyKGRldmljZU5hbWVzLAorICAgICAgICAgICAgdmVuZG9yU2VjdGlvbik7CisgICAgc2VydmljZVByb3h5LnNldFByb3ZpZGVyKHByb3ZpZGVyKTsKKworICAgIHJlcyA9IHByb3ZpZGVyTWFuYWdlci0+aW5pdGlhbGl6ZShzdGF0dXNMaXN0ZW5lciwgJnNlcnZpY2VQcm94eSk7CisgICAgQVNTRVJUX0VRKHJlcywgT0spIDw8ICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBwcm92aWRlciBtYW5hZ2VyIjsKKworICAgIEFTU0VSVF9FUShwcm92aWRlci0+bUN1cnJlbnRTdGF0ZSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPERldmljZVN0YXRlPj4oRGV2aWNlU3RhdGU6Ok5PUk1BTCkpCisgICAgICAgICAgICA8PCAiSW5pdGlhbCBkZXZpY2Ugc3RhdGUgbm90IHNldCI7CisKKyAgICByZXMgPSBwcm92aWRlck1hbmFnZXItPm5vdGlmeURldmljZVN0YXRlQ2hhbmdlKAorICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxEZXZpY2VTdGF0ZT4+KERldmljZVN0YXRlOjpGT0xERUQpKTsKKworICAgIEFTU0VSVF9FUShyZXMsIE9LKSA8PCAiVW5hYmxlIHRvIGNhbGwgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UiOworICAgIEFTU0VSVF9FUShwcm92aWRlci0+bUN1cnJlbnRTdGF0ZSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPERldmljZVN0YXRlPj4oRGV2aWNlU3RhdGU6OkZPTERFRCkpCisgICAgICAgICAgICA8PCAiVW5hYmxlIHRvIGNoYW5nZSBkZXZpY2Ugc3RhdGUiOworCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9EZXB0aFByb2Nlc3NvclRlc3QuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGVwdGhQcm9jZXNzb3JUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTYyNTE0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGVwdGhQcm9jZXNzb3JUZXN0LmNwcApAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkRlcHRoUHJvY2Vzc29yVGVzdCIKKworI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPHJhbmRvbT4KKworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgIi4uL2NvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvRXhpZlV0aWxzLmgiCisjaW5jbHVkZSAiTlYxMkNvbXByZXNzb3IuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrVGVzdEJ1ZmZlcldpZHRoID0gNjQwOworc3RhdGljIGNvbnN0IHNpemVfdCBrVGVzdEJ1ZmZlckhlaWdodCA9IDQ4MDsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1Rlc3RCdWZmZXJOVjEyU2l6ZSAoKCgoa1Rlc3RCdWZmZXJXaWR0aCkgKiAoa1Rlc3RCdWZmZXJIZWlnaHQpKSAqIDMpIC8gMik7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZXN0QnVmZmVyRGVwdGhTaXplIChrVGVzdEJ1ZmZlcldpZHRoICoga1Rlc3RCdWZmZXJIZWlnaHQpOworc3RhdGljIGNvbnN0IHNpemVfdCBrU2VlZCA9IDEyMzQ7CisKK3ZvaWQgbGlua1RvRGVwdGhQaG90b0xpYnJhcnkodm9pZCAqKmxpYkhhbmRsZSAvKm91dCovLAorICAgICAgICBwcm9jZXNzX2RlcHRoX3Bob3RvX2ZyYW1lICpwcm9jZXNzRnJhbWVGdW5jIC8qb3V0Ki8pIHsKKyAgICBBU1NFUlRfTkUobGliSGFuZGxlLCBudWxscHRyKTsKKyAgICBBU1NFUlRfTkUocHJvY2Vzc0ZyYW1lRnVuYywgbnVsbHB0cik7CisKKyAgICAqbGliSGFuZGxlID0gZGxvcGVuKGtEZXB0aFBob3RvTGlicmFyeSwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKKyAgICBpZiAoKmxpYkhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgICpwcm9jZXNzRnJhbWVGdW5jID0gcmVpbnRlcnByZXRfY2FzdDxjYW1lcmEzOjpwcm9jZXNzX2RlcHRoX3Bob3RvX2ZyYW1lPiAoCisgICAgICAgICAgICAgICAgZGxzeW0oKmxpYkhhbmRsZSwga0RlcHRoUGhvdG9Qcm9jZXNzRnVuY3Rpb24pKTsKKyAgICAgICAgQVNTRVJUX05FKCpwcm9jZXNzRnJhbWVGdW5jLCBudWxscHRyKTsKKyAgICB9Cit9CisKK3ZvaWQgZ2VuZXJhdGVDb2xvckpwZWdCdWZmZXIoaW50IGpwZWdRdWFsaXR5LCBFeGlmT3JpZW50YXRpb24gb3JpZW50YXRpb25WYWx1ZSwgYm9vbCBpbmNsdWRlRXhpZiwKKyAgICAgICAgYm9vbCBzd2l0Y2hEaW1lbnNpb25zLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqY29sb3JKcGVnQnVmZmVyIC8qb3V0Ki8pIHsKKyAgICBBU1NFUlRfTkUoY29sb3JKcGVnQnVmZmVyLCBudWxscHRyKTsKKworICAgIHN0ZDo6YXJyYXk8dWludDhfdCwga1Rlc3RCdWZmZXJOVjEyU2l6ZT4gY29sb3JTb3VyY2VCdWZmZXI7CisgICAgc3RkOjpkZWZhdWx0X3JhbmRvbV9lbmdpbmUgZ2VuKGtTZWVkKTsKKyAgICBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxpbnQ+IHVuaURpc3QoMCwgVUlOVDhfTUFYIC0gMSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb2xvclNvdXJjZUJ1ZmZlci5zaXplKCk7IGkrKykgeworICAgICAgICBjb2xvclNvdXJjZUJ1ZmZlcltpXSA9IHVuaURpc3QoZ2VuKTsKKyAgICB9CisKKyAgICBzaXplX3Qgd2lkdGggPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgIHNpemVfdCBoZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICBpZiAoc3dpdGNoRGltZW5zaW9ucykgeworICAgICAgICB3aWR0aCA9IGtUZXN0QnVmZmVySGVpZ2h0OworICAgICAgICBoZWlnaHQgPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgIH0KKworICAgIE5WMTJDb21wcmVzc29yIGpwZWdDb21wcmVzc29yOworICAgIGlmIChpbmNsdWRlRXhpZikgeworICAgICAgICBBU1NFUlRfVFJVRShqcGVnQ29tcHJlc3Nvci5jb21wcmVzc1dpdGhFeGlmT3JpZW50YXRpb24oCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4gKGNvbG9yU291cmNlQnVmZmVyLmRhdGEoKSksIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAganBlZ1F1YWxpdHksIG9yaWVudGF0aW9uVmFsdWUpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfVFJVRShqcGVnQ29tcHJlc3Nvci5jb21wcmVzcygKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPiAoY29sb3JTb3VyY2VCdWZmZXIuZGF0YSgpKSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICBqcGVnUXVhbGl0eSkpOworICAgIH0KKworICAgICpjb2xvckpwZWdCdWZmZXIgPSBzdGQ6Om1vdmUoanBlZ0NvbXByZXNzb3IuZ2V0Q29tcHJlc3NlZERhdGEoKSk7CisgICAgQVNTRVJUX0ZBTFNFKGNvbG9ySnBlZ0J1ZmZlci0+ZW1wdHkoKSk7Cit9CisKK3ZvaWQgZ2VuZXJhdGVEZXB0aDE2QnVmZmVyKHN0ZDo6YXJyYXk8dWludDE2X3QsIGtUZXN0QnVmZmVyRGVwdGhTaXplPiAqZGVwdGgxNkJ1ZmZlciAvKm91dCovKSB7CisgICAgQVNTRVJUX05FKGRlcHRoMTZCdWZmZXIsIG51bGxwdHIpOworICAgIHN0ZDo6ZGVmYXVsdF9yYW5kb21fZW5naW5lIGdlbihrU2VlZCsxKTsKKyAgICBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxpbnQ+IHVuaURpc3QoMCwgVUlOVDE2X01BWCAtIDEpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGVwdGgxNkJ1ZmZlci0+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgKCpkZXB0aDE2QnVmZmVyKVtpXSA9IHVuaURpc3QoZ2VuKTsKKyAgICB9Cit9CisKK1RFU1QoRGVwdGhQcm9jZXNzb3JUZXN0LCBMaW5rVG9MaWJyYXkpIHsKKyAgICB2b2lkICpsaWJIYW5kbGU7CisgICAgcHJvY2Vzc19kZXB0aF9waG90b19mcmFtZSBwcm9jZXNzRnVuYzsKKyAgICBsaW5rVG9EZXB0aFBob3RvTGlicmFyeSgmbGliSGFuZGxlLCAmcHJvY2Vzc0Z1bmMpOworICAgIGlmIChsaWJIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICBkbGNsb3NlKGxpYkhhbmRsZSk7CisgICAgfQorfQorCitURVNUKERlcHRoUHJvY2Vzc29yVGVzdCwgQmFkSW5wdXQpIHsKKyAgICB2b2lkICpsaWJIYW5kbGU7CisgICAgaW50IGpwZWdRdWFsaXR5ID0gOTU7CisKKyAgICBwcm9jZXNzX2RlcHRoX3Bob3RvX2ZyYW1lIHByb2Nlc3NGdW5jOworICAgIGxpbmtUb0RlcHRoUGhvdG9MaWJyYXJ5KCZsaWJIYW5kbGUsICZwcm9jZXNzRnVuYyk7CisgICAgaWYgKGxpYkhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIERlcHRoIGxpYnJhcnkgbm8gcHJlc2VudCwgbm90aGluZyBtb3JlIHRvIHRlc3QuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lOworICAgIC8vIFdvcnN0IGNhc2UgYm90aCBkZXB0aCBhbmQgY29uZmlkZW5jZSBtYXBzIGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgbWFpbiBjb2xvciBpbWFnZS4KKyAgICBpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSA9IGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSAqIDM7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjb2xvckpwZWdCdWZmZXI7CisgICAgZ2VuZXJhdGVDb2xvckpwZWdCdWZmZXIoanBlZ1F1YWxpdHksIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVELAorICAgICAgICAgICAgLyppbmNsdWRlRXhpZiovIGZhbHNlLCAvKnN3aXRjaERpbWVuc2lvbnMqLyBmYWxzZSwgJmNvbG9ySnBlZ0J1ZmZlcik7CisKKyAgICBzdGQ6OmFycmF5PHVpbnQxNl90LCBrVGVzdEJ1ZmZlckRlcHRoU2l6ZT4gZGVwdGgxNkJ1ZmZlcjsKKyAgICBnZW5lcmF0ZURlcHRoMTZCdWZmZXIoJmRlcHRoMTZCdWZmZXIpOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGVwdGhQaG90b0J1ZmZlcihpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSk7CisgICAgc2l6ZV90IGFjdHVhbERlcHRoUGhvdG9TaXplID0gMDsKKworICAgIGlucHV0RnJhbWUubU1haW5KcGVnV2lkdGggPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgIGlucHV0RnJhbWUubU1haW5KcGVnSGVpZ2h0ID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisgICAgaW5wdXRGcmFtZS5tSnBlZ1F1YWxpdHkgPSBqcGVnUXVhbGl0eTsKKyAgICBBU1NFUlRfTkUocHJvY2Vzc0Z1bmMoaW5wdXRGcmFtZSwgZGVwdGhQaG90b0J1ZmZlci5zaXplKCksIGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpLAorICAgICAgICAgICAgICAgICZhY3R1YWxEZXB0aFBob3RvU2l6ZSksIDApOworCisgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdCdWZmZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPiAoY29sb3JKcGVnQnVmZmVyLmRhdGEoKSk7CisgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplID0gY29sb3JKcGVnQnVmZmVyLnNpemUoKTsKKyAgICBBU1NFUlRfTkUocHJvY2Vzc0Z1bmMoaW5wdXRGcmFtZSwgZGVwdGhQaG90b0J1ZmZlci5zaXplKCksIGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpLAorICAgICAgICAgICAgICAgICZhY3R1YWxEZXB0aFBob3RvU2l6ZSksIDApOworCisgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXIgPSBkZXB0aDE2QnVmZmVyLmRhdGEoKTsKKyAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBTdHJpZGUgPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgIGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0ID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisgICAgQVNTRVJUX05FKHByb2Nlc3NGdW5jKGlucHV0RnJhbWUsIGRlcHRoUGhvdG9CdWZmZXIuc2l6ZSgpLCBudWxscHRyLAorICAgICAgICAgICAgICAgICZhY3R1YWxEZXB0aFBob3RvU2l6ZSksIDApOworCisgICAgQVNTRVJUX05FKHByb2Nlc3NGdW5jKGlucHV0RnJhbWUsIGRlcHRoUGhvdG9CdWZmZXIuc2l6ZSgpLCBkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSwgbnVsbHB0ciksCisgICAgICAgICAgICAwKTsKKworICAgIGRsY2xvc2UobGliSGFuZGxlKTsKK30KKworVEVTVChEZXB0aFByb2Nlc3NvclRlc3QsIEJhc2ljRGVwdGhQaG90b1ZhbGlkYXRpb24pIHsKKyAgICB2b2lkICpsaWJIYW5kbGU7CisgICAgaW50IGpwZWdRdWFsaXR5ID0gOTU7CisKKyAgICBwcm9jZXNzX2RlcHRoX3Bob3RvX2ZyYW1lIHByb2Nlc3NGdW5jOworICAgIGxpbmtUb0RlcHRoUGhvdG9MaWJyYXJ5KCZsaWJIYW5kbGUsICZwcm9jZXNzRnVuYyk7CisgICAgaWYgKGxpYkhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIERlcHRoIGxpYnJhcnkgbm8gcHJlc2VudCwgbm90aGluZyBtb3JlIHRvIHRlc3QuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjb2xvckpwZWdCdWZmZXI7CisgICAgZ2VuZXJhdGVDb2xvckpwZWdCdWZmZXIoanBlZ1F1YWxpdHksIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVELAorICAgICAgICAgICAgLyppbmNsdWRlRXhpZiovIGZhbHNlLCAvKnN3aXRjaERpbWVuc2lvbnMqLyBmYWxzZSwgJmNvbG9ySnBlZ0J1ZmZlcik7CisKKyAgICBzdGQ6OmFycmF5PHVpbnQxNl90LCBrVGVzdEJ1ZmZlckRlcHRoU2l6ZT4gZGVwdGgxNkJ1ZmZlcjsKKyAgICBnZW5lcmF0ZURlcHRoMTZCdWZmZXIoJmRlcHRoMTZCdWZmZXIpOworCisgICAgRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZTsKKyAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ0J1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+IChjb2xvckpwZWdCdWZmZXIuZGF0YSgpKTsKKyAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ1NpemUgPSBjb2xvckpwZWdCdWZmZXIuc2l6ZSgpOworICAgIC8vIFdvcnN0IGNhc2UgYm90aCBkZXB0aCBhbmQgY29uZmlkZW5jZSBtYXBzIGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgbWFpbiBjb2xvciBpbWFnZS4KKyAgICBpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSA9IGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSAqIDM7CisgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdXaWR0aCA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdIZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICBpbnB1dEZyYW1lLm1KcGVnUXVhbGl0eSA9IGpwZWdRdWFsaXR5OworICAgIGlucHV0RnJhbWUubURlcHRoTWFwQnVmZmVyID0gZGVwdGgxNkJ1ZmZlci5kYXRhKCk7CisgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aCA9IGlucHV0RnJhbWUubURlcHRoTWFwU3RyaWRlID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodCA9IGtUZXN0QnVmZmVySGVpZ2h0OworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGVwdGhQaG90b0J1ZmZlcihpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSk7CisgICAgc2l6ZV90IGFjdHVhbERlcHRoUGhvdG9TaXplID0gMDsKKyAgICBBU1NFUlRfRVEocHJvY2Vzc0Z1bmMoaW5wdXRGcmFtZSwgZGVwdGhQaG90b0J1ZmZlci5zaXplKCksIGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpLAorICAgICAgICAgICAgICAgICZhY3R1YWxEZXB0aFBob3RvU2l6ZSksIDApOworICAgIEFTU0VSVF9UUlVFKChhY3R1YWxEZXB0aFBob3RvU2l6ZSA+IDApICYmIChkZXB0aFBob3RvQnVmZmVyLnNpemUoKSA+PSBhY3R1YWxEZXB0aFBob3RvU2l6ZSkpOworCisgICAgLy8gVGhlIGZpbmFsIGRlcHRoIHBob3RvIG11c3QgY29uc2lzdCBvZiB0aHJlZSBqcGVnIGltYWdlczoKKyAgICAvLyAgLSB0aGUgbWFpbiBjb2xvciBpbWFnZQorICAgIC8vICAtIHRoZSBkZXB0aCBtYXAgaW1hZ2UKKyAgICAvLyAgLSB0aGUgY29uZmlkZW5jZSBtYXAgaW1hZ2UKKyAgICBzaXplX3QgbWFpbkpwZWdTaXplID0gMDsKKyAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmZpbmRKcGVnU2l6ZShkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSwgYWN0dWFsRGVwdGhQaG90b1NpemUsCisgICAgICAgICAgICAgICAgJm1haW5KcGVnU2l6ZSksIE9LKTsKKyAgICBBU1NFUlRfVFJVRSgobWFpbkpwZWdTaXplID4gMCkgJiYgKG1haW5KcGVnU2l6ZSA8IGFjdHVhbERlcHRoUGhvdG9TaXplKSk7CisgICAgc2l6ZV90IGRlcHRoTWFwU2l6ZSA9IDA7CisgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpmaW5kSnBlZ1NpemUoZGVwdGhQaG90b0J1ZmZlci5kYXRhKCkgKyBtYWluSnBlZ1NpemUsCisgICAgICAgICAgICAgICAgYWN0dWFsRGVwdGhQaG90b1NpemUgLSBtYWluSnBlZ1NpemUsICZkZXB0aE1hcFNpemUpLCBPSyk7CisgICAgQVNTRVJUX1RSVUUoKGRlcHRoTWFwU2l6ZSA+IDApICYmIChkZXB0aE1hcFNpemUgPCAoYWN0dWFsRGVwdGhQaG90b1NpemUgLSBtYWluSnBlZ1NpemUpKSk7CisKKyAgICBkbGNsb3NlKGxpYkhhbmRsZSk7Cit9CisKK1RFU1QoRGVwdGhQcm9jZXNzb3JUZXN0LCBUZXN0RGVwdGhQaG90b0V4aWZPcmllbnRhdGlvbikgeworICAgIHZvaWQgKmxpYkhhbmRsZTsKKyAgICBpbnQganBlZ1F1YWxpdHkgPSA5NTsKKworICAgIHByb2Nlc3NfZGVwdGhfcGhvdG9fZnJhbWUgcHJvY2Vzc0Z1bmM7CisgICAgbGlua1RvRGVwdGhQaG90b0xpYnJhcnkoJmxpYkhhbmRsZSwgJnByb2Nlc3NGdW5jKTsKKyAgICBpZiAobGliSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gRGVwdGggbGlicmFyeSBubyBwcmVzZW50LCBub3RoaW5nIG1vcmUgdG8gdGVzdC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEV4aWZPcmllbnRhdGlvbiBleGlmT3JpZW50YXRpb25zW10gPSB7IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVELAorICAgICAgICAgICAgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVMsIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fOTBfREVHUkVFUywKKyAgICAgICAgICAgIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMTgwX0RFR1JFRVMsIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMjcwX0RFR1JFRVMgfTsKKyAgICBmb3IgKGF1dG8gZXhpZk9yaWVudGF0aW9uIDogZXhpZk9yaWVudGF0aW9ucykgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjb2xvckpwZWdCdWZmZXI7CisgICAgICAgIGdlbmVyYXRlQ29sb3JKcGVnQnVmZmVyKGpwZWdRdWFsaXR5LCBleGlmT3JpZW50YXRpb24sIC8qaW5jbHVkZUV4aWYqLyB0cnVlLAorICAgICAgICAgICAgICAgIC8qc3dpdGNoRGltZW5zaW9ucyovIGZhbHNlLCAmY29sb3JKcGVnQnVmZmVyKTsKKyAgICAgICAgaWYgKGV4aWZPcmllbnRhdGlvbiAhPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRCkgeworICAgICAgICAgICAgYXV0byBqcGVnRXhpZk9yaWVudGF0aW9uID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQ7CisgICAgICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmdldEV4aWZPcmllbnRhdGlvbihjb2xvckpwZWdCdWZmZXIuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICBjb2xvckpwZWdCdWZmZXIuc2l6ZSgpLCAmanBlZ0V4aWZPcmllbnRhdGlvbiksIE9LKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShleGlmT3JpZW50YXRpb24sIGpwZWdFeGlmT3JpZW50YXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjphcnJheTx1aW50MTZfdCwga1Rlc3RCdWZmZXJEZXB0aFNpemU+IGRlcHRoMTZCdWZmZXI7CisgICAgICAgIGdlbmVyYXRlRGVwdGgxNkJ1ZmZlcigmZGVwdGgxNkJ1ZmZlcik7CisKKyAgICAgICAgRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZTsKKyAgICAgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdCdWZmZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPiAoY29sb3JKcGVnQnVmZmVyLmRhdGEoKSk7CisgICAgICAgIGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSA9IGNvbG9ySnBlZ0J1ZmZlci5zaXplKCk7CisgICAgICAgIC8vIFdvcnN0IGNhc2UgYm90aCBkZXB0aCBhbmQgY29uZmlkZW5jZSBtYXBzIGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgbWFpbiBjb2xvciBpbWFnZS4KKyAgICAgICAgaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUgPSBpbnB1dEZyYW1lLm1NYWluSnBlZ1NpemUgKiAzOworICAgICAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ1dpZHRoID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICAgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdIZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICAgICAgaW5wdXRGcmFtZS5tSnBlZ1F1YWxpdHkgPSBqcGVnUXVhbGl0eTsKKyAgICAgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXIgPSBkZXB0aDE2QnVmZmVyLmRhdGEoKTsKKyAgICAgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aCA9IGlucHV0RnJhbWUubURlcHRoTWFwU3RyaWRlID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICAgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkZXB0aFBob3RvQnVmZmVyKGlucHV0RnJhbWUubU1heEpwZWdTaXplKTsKKyAgICAgICAgc2l6ZV90IGFjdHVhbERlcHRoUGhvdG9TaXplID0gMDsKKyAgICAgICAgQVNTRVJUX0VRKHByb2Nlc3NGdW5jKGlucHV0RnJhbWUsIGRlcHRoUGhvdG9CdWZmZXIuc2l6ZSgpLCBkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAmYWN0dWFsRGVwdGhQaG90b1NpemUpLCAwKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoKGFjdHVhbERlcHRoUGhvdG9TaXplID4gMCkgJiYKKyAgICAgICAgICAgICAgICAoZGVwdGhQaG90b0J1ZmZlci5zaXplKCkgPj0gYWN0dWFsRGVwdGhQaG90b1NpemUpKTsKKworICAgICAgICBzaXplX3QgbWFpbkpwZWdTaXplID0gMDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpmaW5kSnBlZ1NpemUoZGVwdGhQaG90b0J1ZmZlci5kYXRhKCksIGFjdHVhbERlcHRoUGhvdG9TaXplLAorICAgICAgICAgICAgICAgICZtYWluSnBlZ1NpemUpLCBPSyk7CisgICAgICAgIEFTU0VSVF9UUlVFKChtYWluSnBlZ1NpemUgPiAwKSAmJiAobWFpbkpwZWdTaXplIDwgYWN0dWFsRGVwdGhQaG90b1NpemUpKTsKKyAgICAgICAgc2l6ZV90IGRlcHRoTWFwU2l6ZSA9IDA7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6ZmluZEpwZWdTaXplKGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpICsgbWFpbkpwZWdTaXplLAorICAgICAgICAgICAgICAgIGFjdHVhbERlcHRoUGhvdG9TaXplIC0gbWFpbkpwZWdTaXplLCAmZGVwdGhNYXBTaXplKSwgT0spOworICAgICAgICBBU1NFUlRfVFJVRSgoZGVwdGhNYXBTaXplID4gMCkgJiYgKGRlcHRoTWFwU2l6ZSA8IChhY3R1YWxEZXB0aFBob3RvU2l6ZSAtIG1haW5KcGVnU2l6ZSkpKTsKKyAgICAgICAgc2l6ZV90IGNvbmZpZGVuY2VNYXBTaXplID0gYWN0dWFsRGVwdGhQaG90b1NpemUgLSAobWFpbkpwZWdTaXplICsgZGVwdGhNYXBTaXplKTsKKworICAgICAgICAvL0RlcHRoIGFuZCBjb25maWRlbmNlIGltYWdlcyBtdXN0IGhhdmUgdGhlIHNhbWUgRVhJRiBvcmllbnRhdGlvbiBhcyB0aGUgc291cmNlCisgICAgICAgIGF1dG8gZGVwdGhKcGVnRXhpZk9yaWVudGF0aW9uID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQ7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6Z2V0RXhpZk9yaWVudGF0aW9uKGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpICsgbWFpbkpwZWdTaXplLAorICAgICAgICAgICAgICAgIGRlcHRoTWFwU2l6ZSwgJmRlcHRoSnBlZ0V4aWZPcmllbnRhdGlvbiksIE9LKTsKKyAgICAgICAgaWYgKGV4aWZPcmllbnRhdGlvbiA9PSBPUklFTlRBVElPTl9VTkRFRklORUQpIHsKKyAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgdW5kZWZpbmVkIG9yIG1pc3NpbmcgRVhJRiBvcmllbnRhdGlvbiwgYWx3YXlzIGV4cGVjdCAwIGRlZ3JlZXMgaW4gdGhlCisgICAgICAgICAgICAvLyBkZXB0aCBtYXAuCisgICAgICAgICAgICBBU1NFUlRfRVEoZGVwdGhKcGVnRXhpZk9yaWVudGF0aW9uLCBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoZGVwdGhKcGVnRXhpZk9yaWVudGF0aW9uLCBleGlmT3JpZW50YXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBjb25maWRlbmNlSnBlZ0V4aWZPcmllbnRhdGlvbiA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVEOworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmdldEV4aWZPcmllbnRhdGlvbigKKyAgICAgICAgICAgICAgICBkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSArIG1haW5KcGVnU2l6ZSArIGRlcHRoTWFwU2l6ZSwKKyAgICAgICAgICAgICAgICBjb25maWRlbmNlTWFwU2l6ZSwgJmNvbmZpZGVuY2VKcGVnRXhpZk9yaWVudGF0aW9uKSwgT0spOworICAgICAgICBpZiAoZXhpZk9yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX1VOREVGSU5FRCkgeworICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiB1bmRlZmluZWQgb3IgbWlzc2luZyBFWElGIG9yaWVudGF0aW9uLCBhbHdheXMgZXhwZWN0IDAgZGVncmVlcyBpbiB0aGUKKyAgICAgICAgICAgIC8vIGNvbmZpZGVuY2UgbWFwLgorICAgICAgICAgICAgQVNTRVJUX0VRKGNvbmZpZGVuY2VKcGVnRXhpZk9yaWVudGF0aW9uLCBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoY29uZmlkZW5jZUpwZWdFeGlmT3JpZW50YXRpb24sIGV4aWZPcmllbnRhdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkbGNsb3NlKGxpYkhhbmRsZSk7Cit9CisKK1RFU1QoRGVwdGhQcm9jZXNzb3JUZXN0LCBUZXN0RGVwaHRQaG90b1BoeXNpY2FsUm90YXRpb24pIHsKKyAgICB2b2lkICpsaWJIYW5kbGU7CisgICAgaW50IGpwZWdRdWFsaXR5ID0gOTU7CisKKyAgICBwcm9jZXNzX2RlcHRoX3Bob3RvX2ZyYW1lIHByb2Nlc3NGdW5jOworICAgIGxpbmtUb0RlcHRoUGhvdG9MaWJyYXJ5KCZsaWJIYW5kbGUsICZwcm9jZXNzRnVuYyk7CisgICAgaWYgKGxpYkhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIERlcHRoIGxpYnJhcnkgbm8gcHJlc2VudCwgbm90aGluZyBtb3JlIHRvIHRlc3QuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJbiBjYXNlIG9mIHBoeXNpY2FsIHJvdGF0aW9uLCB0aGUgRVhJRiBvcmllbnRhdGlvbiBtdXN0IGFsd2F5cyBiZSAwLgorICAgIGF1dG8gZXhpZk9yaWVudGF0aW9uID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVM7CisgICAgRGVwdGhQaG90b09yaWVudGF0aW9uIGRlcHRoT3JpZW50YXRpb25zW10gPSB7CisgICAgICAgICAgICBEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzBfREVHUkVFUywKKyAgICAgICAgICAgIERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fOTBfREVHUkVFUywKKyAgICAgICAgICAgIERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fMTgwX0RFR1JFRVMsCisgICAgICAgICAgICBEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzI3MF9ERUdSRUVTIH07CisgICAgZm9yIChhdXRvIGRlcHRoT3JpZW50YXRpb24gOiBkZXB0aE9yaWVudGF0aW9ucykgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjb2xvckpwZWdCdWZmZXI7CisgICAgICAgIGJvb2wgc3dpdGNoRGltZW5zaW9ucyA9IGZhbHNlOworICAgICAgICBzaXplX3QgZXhwZWN0ZWRXaWR0aCA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgICAgIHNpemVfdCBleHBlY3RlZEhlaWdodCA9IGtUZXN0QnVmZmVySGVpZ2h0OworICAgICAgICBpZiAoKGRlcHRoT3JpZW50YXRpb24gPT0gRGVwdGhQaG90b09yaWVudGF0aW9uOjpERVBUSF9PUklFTlRBVElPTl85MF9ERUdSRUVTKSB8fAorICAgICAgICAgICAgICAgIChkZXB0aE9yaWVudGF0aW9uID09IERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fMjcwX0RFR1JFRVMpKSB7CisgICAgICAgICAgICBzd2l0Y2hEaW1lbnNpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgIGV4cGVjdGVkV2lkdGggPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICAgICAgICAgIGV4cGVjdGVkSGVpZ2h0ID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICAgICAgfQorICAgICAgICBnZW5lcmF0ZUNvbG9ySnBlZ0J1ZmZlcihqcGVnUXVhbGl0eSwgZXhpZk9yaWVudGF0aW9uLCAvKmluY2x1ZGVFeGlmKi8gdHJ1ZSwKKyAgICAgICAgICAgICAgICBzd2l0Y2hEaW1lbnNpb25zLCAmY29sb3JKcGVnQnVmZmVyKTsKKyAgICAgICAgYXV0byBqcGVnRXhpZk9yaWVudGF0aW9uID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQ7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6Z2V0RXhpZk9yaWVudGF0aW9uKGNvbG9ySnBlZ0J1ZmZlci5kYXRhKCksIGNvbG9ySnBlZ0J1ZmZlci5zaXplKCksCisgICAgICAgICAgICAgICAgJmpwZWdFeGlmT3JpZW50YXRpb24pLCBPSyk7CisgICAgICAgIEFTU0VSVF9FUShleGlmT3JpZW50YXRpb24sIGpwZWdFeGlmT3JpZW50YXRpb24pOworCisgICAgICAgIHN0ZDo6YXJyYXk8dWludDE2X3QsIGtUZXN0QnVmZmVyRGVwdGhTaXplPiBkZXB0aDE2QnVmZmVyOworICAgICAgICBnZW5lcmF0ZURlcHRoMTZCdWZmZXIoJmRlcHRoMTZCdWZmZXIpOworCisgICAgICAgIERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWU7CisgICAgICAgIGlucHV0RnJhbWUubU1haW5KcGVnQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4gKGNvbG9ySnBlZ0J1ZmZlci5kYXRhKCkpOworICAgICAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ1NpemUgPSBjb2xvckpwZWdCdWZmZXIuc2l6ZSgpOworICAgICAgICAvLyBXb3JzdCBjYXNlIGJvdGggZGVwdGggYW5kIGNvbmZpZGVuY2UgbWFwcyBoYXZlIHRoZSBzYW1lIHNpemUgYXMgdGhlIG1haW4gY29sb3IgaW1hZ2UuCisgICAgICAgIGlucHV0RnJhbWUubU1heEpwZWdTaXplID0gaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplICogMzsKKyAgICAgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdXaWR0aCA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgICAgIGlucHV0RnJhbWUubU1haW5KcGVnSGVpZ2h0ID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisgICAgICAgIGlucHV0RnJhbWUubUpwZWdRdWFsaXR5ID0ganBlZ1F1YWxpdHk7CisgICAgICAgIGlucHV0RnJhbWUubURlcHRoTWFwQnVmZmVyID0gZGVwdGgxNkJ1ZmZlci5kYXRhKCk7CisgICAgICAgIGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGggPSBpbnB1dEZyYW1lLm1EZXB0aE1hcFN0cmlkZSA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgICAgIGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0ID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisgICAgICAgIGlucHV0RnJhbWUubU9yaWVudGF0aW9uID0gZGVwdGhPcmllbnRhdGlvbjsKKworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkZXB0aFBob3RvQnVmZmVyKGlucHV0RnJhbWUubU1heEpwZWdTaXplKTsKKyAgICAgICAgc2l6ZV90IGFjdHVhbERlcHRoUGhvdG9TaXplID0gMDsKKyAgICAgICAgQVNTRVJUX0VRKHByb2Nlc3NGdW5jKGlucHV0RnJhbWUsIGRlcHRoUGhvdG9CdWZmZXIuc2l6ZSgpLCBkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAmYWN0dWFsRGVwdGhQaG90b1NpemUpLCAwKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoKGFjdHVhbERlcHRoUGhvdG9TaXplID4gMCkgJiYKKyAgICAgICAgICAgICAgICAoZGVwdGhQaG90b0J1ZmZlci5zaXplKCkgPj0gYWN0dWFsRGVwdGhQaG90b1NpemUpKTsKKworICAgICAgICBzaXplX3QgbWFpbkpwZWdTaXplID0gMDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpmaW5kSnBlZ1NpemUoZGVwdGhQaG90b0J1ZmZlci5kYXRhKCksIGFjdHVhbERlcHRoUGhvdG9TaXplLAorICAgICAgICAgICAgICAgICZtYWluSnBlZ1NpemUpLCBPSyk7CisgICAgICAgIEFTU0VSVF9UUlVFKChtYWluSnBlZ1NpemUgPiAwKSAmJiAobWFpbkpwZWdTaXplIDwgYWN0dWFsRGVwdGhQaG90b1NpemUpKTsKKyAgICAgICAgc2l6ZV90IGRlcHRoTWFwU2l6ZSA9IDA7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6ZmluZEpwZWdTaXplKGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpICsgbWFpbkpwZWdTaXplLAorICAgICAgICAgICAgICAgIGFjdHVhbERlcHRoUGhvdG9TaXplIC0gbWFpbkpwZWdTaXplLCAmZGVwdGhNYXBTaXplKSwgT0spOworICAgICAgICBBU1NFUlRfVFJVRSgoZGVwdGhNYXBTaXplID4gMCkgJiYgKGRlcHRoTWFwU2l6ZSA8IChhY3R1YWxEZXB0aFBob3RvU2l6ZSAtIG1haW5KcGVnU2l6ZSkpKTsKKyAgICAgICAgc2l6ZV90IGNvbmZpZGVuY2VNYXBTaXplID0gYWN0dWFsRGVwdGhQaG90b1NpemUgLSAobWFpbkpwZWdTaXplICsgZGVwdGhNYXBTaXplKTsKKworICAgICAgICAvL0RlcHRoIGFuZCBjb25maWRlbmNlIGltYWdlcyBtdXN0IGhhdmUgdGhlIHNhbWUgRVhJRiBvcmllbnRhdGlvbiBhcyB0aGUgc291cmNlCisgICAgICAgIGF1dG8gZGVwdGhKcGVnRXhpZk9yaWVudGF0aW9uID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQ7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6Z2V0RXhpZk9yaWVudGF0aW9uKGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpICsgbWFpbkpwZWdTaXplLAorICAgICAgICAgICAgICAgIGRlcHRoTWFwU2l6ZSwgJmRlcHRoSnBlZ0V4aWZPcmllbnRhdGlvbiksIE9LKTsKKyAgICAgICAgQVNTRVJUX0VRKGRlcHRoSnBlZ0V4aWZPcmllbnRhdGlvbiwgZXhpZk9yaWVudGF0aW9uKTsKKyAgICAgICAgc2l6ZV90IGRlcHRoTWFwV2lkdGgsIGRlcHRoTWFwSGVpZ2h0OworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmdldEpwZWdJbWFnZURpbWVuc2lvbnMoZGVwdGhQaG90b0J1ZmZlci5kYXRhKCkgKyBtYWluSnBlZ1NpemUsCisgICAgICAgICAgICAgICAgZGVwdGhNYXBTaXplLCAmZGVwdGhNYXBXaWR0aCwgJmRlcHRoTWFwSGVpZ2h0KSwgT0spOworICAgICAgICBBU1NFUlRfRVEoZGVwdGhNYXBXaWR0aCwgZXhwZWN0ZWRXaWR0aCk7CisgICAgICAgIEFTU0VSVF9FUShkZXB0aE1hcEhlaWdodCwgZXhwZWN0ZWRIZWlnaHQpOworCisgICAgICAgIGF1dG8gY29uZmlkZW5jZUpwZWdFeGlmT3JpZW50YXRpb24gPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpnZXRFeGlmT3JpZW50YXRpb24oCisgICAgICAgICAgICAgICAgZGVwdGhQaG90b0J1ZmZlci5kYXRhKCkgKyBtYWluSnBlZ1NpemUgKyBkZXB0aE1hcFNpemUsIGNvbmZpZGVuY2VNYXBTaXplLAorICAgICAgICAgICAgICAgICZjb25maWRlbmNlSnBlZ0V4aWZPcmllbnRhdGlvbiksIE9LKTsKKyAgICAgICAgQVNTRVJUX0VRKGNvbmZpZGVuY2VKcGVnRXhpZk9yaWVudGF0aW9uLCBleGlmT3JpZW50YXRpb24pOworICAgICAgICBzaXplX3QgY29uZmlkZW5jZU1hcFdpZHRoLCBjb25maWRlbmNlTWFwSGVpZ2h0OworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmdldEpwZWdJbWFnZURpbWVuc2lvbnMoCisgICAgICAgICAgICAgICAgZGVwdGhQaG90b0J1ZmZlci5kYXRhKCkgKyBtYWluSnBlZ1NpemUgKyBkZXB0aE1hcFNpemUsIGNvbmZpZGVuY2VNYXBTaXplLAorICAgICAgICAgICAgICAgICZjb25maWRlbmNlTWFwV2lkdGgsICZjb25maWRlbmNlTWFwSGVpZ2h0KSwgT0spOworICAgICAgICBBU1NFUlRfRVEoY29uZmlkZW5jZU1hcFdpZHRoLCBleHBlY3RlZFdpZHRoKTsKKyAgICAgICAgQVNTRVJUX0VRKGNvbmZpZGVuY2VNYXBIZWlnaHQsIGV4cGVjdGVkSGVpZ2h0KTsKKyAgICB9CisKKyAgICBkbGNsb3NlKGxpYkhhbmRsZSk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9EaXN0b3J0aW9uTWFwcGVyVGVzdC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9EaXN0b3J0aW9uTWFwcGVyVGVzdC5jcHAKaW5kZXggMmE2ODljNi4uNTQ5MzVjOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGlzdG9ydGlvbk1hcHBlclRlc3QuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0Rpc3RvcnRpb25NYXBwZXJUZXN0LmNwcApAQCAtMTY3LDYgKzE2NywzMCBAQAogICAgIH0KIH0KIAorVEVTVChEaXN0b3J0aW9uTWFwcGVyVGVzdCwgQ2xhbXBDb25zaXN0ZW5jeSkgeworICAgIHN0YXR1c190IHJlczsKKworICAgIHN0ZDo6YXJyYXk8aW50MzJfdCwgND4gYWN0aXZlQXJyYXkgPSB7MCwgMCwgNDAzMiwgMzAyNH07CisgICAgRGlzdG9ydGlvbk1hcHBlciBtOworICAgIHNldHVwVGVzdE1hcHBlcigmbSwgaWRlbnRpdHlEaXN0b3J0aW9uLCB0ZXN0SUNhbCwgLyphY3RpdmVBcnJheSovIGFjdGl2ZUFycmF5LmRhdGEoKSwKKyAgICAgICAgICAgIC8qcHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5Ki8gYWN0aXZlQXJyYXkuZGF0YSgpKTsKKworICAgIGF1dG8gcmVjdHNPcmlnID0gYWN0aXZlQXJyYXk7CisgICAgcmVzID0gbS5tYXBDb3JyZWN0ZWRSZWN0VG9SYXcoYWN0aXZlQXJyYXkuZGF0YSgpLCAxLCAvKmNsYW1wKi90cnVlLCAvKnNpbXBsZSovIHRydWUpOworICAgIEFTU0VSVF9FUShyZXMsIE9LKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0aXZlQXJyYXkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKGFjdGl2ZUFycmF5W2ldLCByZWN0c09yaWdbaV0pOworICAgIH0KKworICAgIHJlcyA9IG0ubWFwUmF3UmVjdFRvQ29ycmVjdGVkKGFjdGl2ZUFycmF5LmRhdGEoKSwgMSwgLypjbGFtcCovdHJ1ZSwgLypzaW1wbGUqLyB0cnVlKTsKKyAgICBBU1NFUlRfRVEocmVzLCBPSyk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdGl2ZUFycmF5LnNpemUoKTsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShhY3RpdmVBcnJheVtpXSwgcmVjdHNPcmlnW2ldKTsKKyAgICB9Cit9CisKIFRFU1QoRGlzdG9ydGlvbk1hcHBlclRlc3QsIFNpbXBsZVRyYW5zZm9ybSkgewogICAgIHN0YXR1c190IHJlczsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvTlYxMkNvbXByZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvTlYxMkNvbXByZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNDFhMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9OVjEyQ29tcHJlc3Nvci5jcHAKQEAgLTAsMCArMSwzNzkgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlRlc3RfTlYxMkNvbXByZXNzb3IiCisKKyNpbmNsdWRlICJOVjEyQ29tcHJlc3Nvci5oIgorCisjaW5jbHVkZSA8bGliZXhpZi9leGlmLWRhdGEuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTM7CisKK25hbWVzcGFjZSBzdGQgewordGVtcGxhdGUgPD4KK3N0cnVjdCBkZWZhdWx0X2RlbGV0ZTxFeGlmRW50cnk+IHsKKyAgICBpbmxpbmUgdm9pZCBvcGVyYXRvcigpKEV4aWZFbnRyeSogZW50cnkpIGNvbnN0IHsgZXhpZl9lbnRyeV91bnJlZihlbnRyeSk7IH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgZGVmYXVsdF9kZWxldGU8RXhpZkRhdGE+IHsKKyAgICBpbmxpbmUgdm9pZCBvcGVyYXRvcigpKEV4aWZEYXRhKiBkYXRhKSBjb25zdCB7IGV4aWZfZGF0YV91bnJlZihkYXRhKTsgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIHN0ZAorCitib29sIE5WMTJDb21wcmVzc29yOjpjb21wcmVzcyhjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBxdWFsaXR5KSB7CisgICAgaWYgKCFjb25maWd1cmVDb21wcmVzc29yKHdpZHRoLCBoZWlnaHQsIHF1YWxpdHkpKSB7CisgICAgICAgIC8vIHRoZSBtZXRob2Qgd2lsbCBoYXZlIGxvZ2dlZCBhIG1vcmUgZGV0YWlsZWQgZXJyb3IgbWVzc2FnZSB0aGFuIHdlIGNhbgorICAgICAgICAvLyBwcm92aWRlIGhlcmUgc28ganVzdCByZXR1cm4uCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gY29tcHJlc3NEYXRhKGRhdGEsIC8qZXhpZkRhdGEqLyBudWxscHRyKTsKK30KKworYm9vbCBOVjEyQ29tcHJlc3Nvcjo6Y29tcHJlc3NXaXRoRXhpZk9yaWVudGF0aW9uKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgaW50IHF1YWxpdHksIGFuZHJvaWQ6OmNhbWVyYTM6OkV4aWZPcmllbnRhdGlvbiBleGlmVmFsdWUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkRhdGE+IGV4aWZEYXRhKGV4aWZfZGF0YV9uZXcoKSk7CisgICAgaWYgKGV4aWZEYXRhLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGV4aWZfZGF0YV9zZXRfb3B0aW9uKGV4aWZEYXRhLmdldCgpLCBFWElGX0RBVEFfT1BUSU9OX0ZPTExPV19TUEVDSUZJQ0FUSU9OKTsKKyAgICBleGlmX2RhdGFfc2V0X2RhdGFfdHlwZShleGlmRGF0YS5nZXQoKSwgRVhJRl9EQVRBX1RZUEVfQ09NUFJFU1NFRCk7CisgICAgZXhpZl9kYXRhX3NldF9ieXRlX29yZGVyKGV4aWZEYXRhLmdldCgpLCBFWElGX0JZVEVfT1JERVJfSU5URUwpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGV4aWZFbnRyeShleGlmX2VudHJ5X25ldygpKTsKKyAgICBpZiAoZXhpZkVudHJ5LmdldCgpID09ICBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBleGlmRW50cnktPnRhZyA9IEVYSUZfVEFHX09SSUVOVEFUSU9OOworICAgIGV4aWZfY29udGVudF9hZGRfZW50cnkoZXhpZkRhdGEtPmlmZFtFWElGX0lGRF8wXSwgZXhpZkVudHJ5LmdldCgpKTsKKyAgICBleGlmX2VudHJ5X2luaXRpYWxpemUoZXhpZkVudHJ5LmdldCgpLCBleGlmRW50cnktPnRhZyk7CisgICAgZXhpZl9zZXRfc2hvcnQoZXhpZkVudHJ5LT5kYXRhLCBFWElGX0JZVEVfT1JERVJfSU5URUwsIGV4aWZWYWx1ZSk7CisKKyAgICBpZiAoIWNvbmZpZ3VyZUNvbXByZXNzb3Iod2lkdGgsIGhlaWdodCwgcXVhbGl0eSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBjb21wcmVzc0RhdGEoZGF0YSwgZXhpZkRhdGEuZ2V0KCkpOworfQorCitjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgTlYxMkNvbXByZXNzb3I6OmdldENvbXByZXNzZWREYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtRGVzdE1hbmFnZXIubUJ1ZmZlcjsKK30KKworYm9vbCBOVjEyQ29tcHJlc3Nvcjo6Y29uZmlndXJlQ29tcHJlc3NvcihpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBxdWFsaXR5KSB7CisgICAgbUNvbXByZXNzSW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmbUVycm9yTWFuYWdlcik7CisgICAgLy8gTk9URSEgREFOR0VSISBEbyBub3QgY29uc3RydWN0IGFueSBub24tdHJpdmlhbCBvYmplY3RzIGJlbG93IHNldGptcCEKKyAgICAvLyBUaGUgY29tcGlsZXIgd2lsbCBub3QgZ2VuZXJhdGUgY29kZSB0byBkZXN0cm95IHRoZW0gZHVyaW5nIHRoZSByZXR1cm4KKyAgICAvLyBiZWxvdyBzbyB0aGV5IHdpbGwgbGVhay4gQWRkaXRpb25hbGx5LCBkbyBub3QgcGxhY2UgYW55IGNhbGxzIHRvIGxpYmpwZWcKKyAgICAvLyB0aGF0IGNhbiBmYWlsIGFib3ZlIHRoaXMgbGluZSBvciBhbnkgZXJyb3Igd2lsbCBjYXVzZSB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgaWYgKHNldGptcChtRXJyb3JNYW5hZ2VyLm1KdW1wQnVmZmVyKSkgeworICAgICAgICAvLyBUaGlzIGlzIHdoZXJlIHRoZSBlcnJvciBoYW5kbGVyIHdpbGwganVtcCBpbiBjYXNlIHNldHVwIGZhaWxzCisgICAgICAgIC8vIFRoZSBlcnJvciBtYW5hZ2VyIHdpbGwgQUxPRyBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBqcGVnX2NyZWF0ZV9jb21wcmVzcygmbUNvbXByZXNzSW5mbyk7CisKKyAgICBtQ29tcHJlc3NJbmZvLmltYWdlX3dpZHRoID0gd2lkdGg7CisgICAgbUNvbXByZXNzSW5mby5pbWFnZV9oZWlnaHQgPSBoZWlnaHQ7CisgICAgbUNvbXByZXNzSW5mby5pbnB1dF9jb21wb25lbnRzID0gMzsKKyAgICBtQ29tcHJlc3NJbmZvLmluX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOworICAgIGpwZWdfc2V0X2RlZmF1bHRzKCZtQ29tcHJlc3NJbmZvKTsKKworICAgIGpwZWdfc2V0X3F1YWxpdHkoJm1Db21wcmVzc0luZm8sIHF1YWxpdHksIFRSVUUpOworICAgIC8vIEl0IG1heSBzZWVtIHdlaXJkIHRvIHNldCBjb2xvciBzcGFjZSBoZXJlIGFnYWluIGJ1dCB0aGlzIHdpbGwgYWxzbyBzZXQKKyAgICAvLyBvdGhlciBmaWVsZHMuIFRoZXNlIGZpZWxkcyBtaWdodCBiZSBvdmVyd3JpdHRlbiBieSBqcGVnX3NldF9kZWZhdWx0cworICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoJm1Db21wcmVzc0luZm8sIEpDU19ZQ2JDcik7CisgICAgbUNvbXByZXNzSW5mby5yYXdfZGF0YV9pbiA9IFRSVUU7CisgICAgbUNvbXByZXNzSW5mby5kY3RfbWV0aG9kID0gSkRDVF9JRkFTVDsKKyAgICAvLyBTZXQgc2FtcGxpbmcgZmFjdG9ycworICAgIG1Db21wcmVzc0luZm8uY29tcF9pbmZvWzBdLmhfc2FtcF9mYWN0b3IgPSAyOworICAgIG1Db21wcmVzc0luZm8uY29tcF9pbmZvWzBdLnZfc2FtcF9mYWN0b3IgPSAyOworICAgIG1Db21wcmVzc0luZm8uY29tcF9pbmZvWzFdLmhfc2FtcF9mYWN0b3IgPSAxOworICAgIG1Db21wcmVzc0luZm8uY29tcF9pbmZvWzFdLnZfc2FtcF9mYWN0b3IgPSAxOworICAgIG1Db21wcmVzc0luZm8uY29tcF9pbmZvWzJdLmhfc2FtcF9mYWN0b3IgPSAxOworICAgIG1Db21wcmVzc0luZm8uY29tcF9pbmZvWzJdLnZfc2FtcF9mYWN0b3IgPSAxOworCisgICAgbUNvbXByZXNzSW5mby5kZXN0ID0gJm1EZXN0TWFuYWdlcjsKKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBkZWludGVybGVhdmUoY29uc3QgdWludDhfdCogdnVQbGFuYXIsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB1Um93cywKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZSb3dzLCBpbnQgcm93SW5kZXgsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSkgeworICAgIGludCBudW1Sb3dzID0gKGhlaWdodCAtIHJvd0luZGV4KSAvIDI7CisgICAgaWYgKG51bVJvd3MgPiA4KSBudW1Sb3dzID0gODsKKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBudW1Sb3dzOyArK3JvdykgeworICAgICAgICBpbnQgb2Zmc2V0ID0gKChyb3dJbmRleCA+PiAxKSArIHJvdykgKiBzdHJpZGU7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZ1ID0gdnVQbGFuYXIgKyBvZmZzZXQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKHdpZHRoID4+IDEpOyArK2kpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IHJvdyAqICh3aWR0aCA+PiAxKSArIGk7CisgICAgICAgICAgICB1Um93c1tpbmRleF0gPSB2dVsxXTsKKyAgICAgICAgICAgIHZSb3dzW2luZGV4XSA9IHZ1WzBdOworICAgICAgICAgICAgdnUgKz0gMjsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBOVjEyQ29tcHJlc3Nvcjo6Y29tcHJlc3NEYXRhKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsIEV4aWZEYXRhKiBleGlmRGF0YSkgeworICAgIGNvbnN0IHVpbnQ4X3QqIHlbMTZdOworICAgIGNvbnN0IHVpbnQ4X3QqIGNiWzhdOworICAgIGNvbnN0IHVpbnQ4X3QqIGNyWzhdOworICAgIGNvbnN0IHVpbnQ4X3QqKiBwbGFuZXNbM10gPSB7IHksIGNiLCBjciB9OworCisgICAgaW50IGksIG9mZnNldDsKKyAgICBpbnQgd2lkdGggPSBtQ29tcHJlc3NJbmZvLmltYWdlX3dpZHRoOworICAgIGludCBoZWlnaHQgPSBtQ29tcHJlc3NJbmZvLmltYWdlX2hlaWdodDsKKyAgICBjb25zdCB1aW50OF90KiB5UGxhbmFyID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90KiB2dVBsYW5hciA9IGRhdGEgKyAod2lkdGggKiBoZWlnaHQpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHVSb3dzKDggKiAod2lkdGggPj4gMSkpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZSb3dzKDggKiAod2lkdGggPj4gMSkpOworCisgICAgLy8gTk9URSEgREFOR0VSISBEbyBub3QgY29uc3RydWN0IGFueSBub24tdHJpdmlhbCBvYmplY3RzIGJlbG93IHNldGptcCEKKyAgICAvLyBUaGUgY29tcGlsZXIgd2lsbCBub3QgZ2VuZXJhdGUgY29kZSB0byBkZXN0cm95IHRoZW0gZHVyaW5nIHRoZSByZXR1cm4KKyAgICAvLyBiZWxvdyBzbyB0aGV5IHdpbGwgbGVhay4gQWRkaXRpb25hbGx5LCBkbyBub3QgcGxhY2UgYW55IGNhbGxzIHRvIGxpYmpwZWcKKyAgICAvLyB0aGF0IGNhbiBmYWlsIGFib3ZlIHRoaXMgbGluZSBvciBhbnkgZXJyb3Igd2lsbCBjYXVzZSB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgaWYgKHNldGptcChtRXJyb3JNYW5hZ2VyLm1KdW1wQnVmZmVyKSkgeworICAgICAgICAvLyBUaGlzIGlzIHdoZXJlIHRoZSBlcnJvciBoYW5kbGVyIHdpbGwganVtcCBpbiBjYXNlIGNvbXByZXNzaW9uIGZhaWxzCisgICAgICAgIC8vIFRoZSBlcnJvciBtYW5hZ2VyIHdpbGwgQUxPRyBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBqcGVnX3N0YXJ0X2NvbXByZXNzKCZtQ29tcHJlc3NJbmZvLCBUUlVFKTsKKworICAgIGF0dGFjaEV4aWZEYXRhKGV4aWZEYXRhKTsKKworICAgIC8vIHByb2Nlc3MgMTYgbGluZXMgb2YgWSBhbmQgOCBsaW5lcyBvZiBVL1YgZWFjaCB0aW1lLgorICAgIHdoaWxlIChtQ29tcHJlc3NJbmZvLm5leHRfc2NhbmxpbmUgPCBtQ29tcHJlc3NJbmZvLmltYWdlX2hlaWdodCkgeworICAgICAgICAvL2RlaW50ZXJsZWF2ZSB1IGFuZCB2CisgICAgICAgIGRlaW50ZXJsZWF2ZSh2dVBsYW5hciwgdVJvd3MsIHZSb3dzLCBtQ29tcHJlc3NJbmZvLm5leHRfc2NhbmxpbmUsCisgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCB3aWR0aCk7CisKKyAgICAgICAgLy8gSnBlZyBsaWJyYXJ5IGlnbm9yZXMgdGhlIHJvd3Mgd2hvc2UgaW5kaWNlcyBhcmUgZ3JlYXRlciB0aGFuIGhlaWdodC4KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgICAgIC8vIHkgcm93CisgICAgICAgICAgICB5W2ldID0geVBsYW5hciArIChtQ29tcHJlc3NJbmZvLm5leHRfc2NhbmxpbmUgKyBpKSAqIHdpZHRoOworCisgICAgICAgICAgICAvLyBjb25zdHJ1Y3QgdSByb3cgYW5kIHYgcm93CisgICAgICAgICAgICBpZiAoKGkgJiAxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gaGVpZ2h0IGFuZCB3aWR0aCBhcmUgYm90aCBoYWx2ZWQgYmVjYXVzZSBvZiBkb3duc2FtcGxpbmcKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSAoaSA+PiAxKSAqICh3aWR0aCA+PiAxKTsKKyAgICAgICAgICAgICAgICBjYltpLzJdID0gJnVSb3dzW29mZnNldF07CisgICAgICAgICAgICAgICAgY3JbaS8yXSA9ICZ2Um93c1tvZmZzZXRdOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAganBlZ193cml0ZV9yYXdfZGF0YSgmbUNvbXByZXNzSW5mbywgY29uc3RfY2FzdDxKU0FNUElNQUdFPihwbGFuZXMpLCAxNik7CisgICAgfQorCisgICAganBlZ19maW5pc2hfY29tcHJlc3MoJm1Db21wcmVzc0luZm8pOworICAgIGpwZWdfZGVzdHJveV9jb21wcmVzcygmbUNvbXByZXNzSW5mbyk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBOVjEyQ29tcHJlc3Nvcjo6YXR0YWNoRXhpZkRhdGEoRXhpZkRhdGEqIGV4aWZEYXRhKSB7CisgICAgaWYgKGV4aWZEYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBub3QgYW4gZXJyb3IsIHdlIGRvbid0IHJlcXVpcmUgRVhJRiBkYXRhCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFNhdmUgdGhlIEVYSUYgZGF0YSB0byBtZW1vcnkKKyAgICB1bnNpZ25lZCBjaGFyKiByYXdEYXRhID0gbnVsbHB0cjsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZSA9IDA7CisgICAgZXhpZl9kYXRhX3NhdmVfZGF0YShleGlmRGF0YSwgJnJhd0RhdGEsICZzaXplKTsKKyAgICBpZiAocmF3RGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIEVYSUYgZGF0YSBibG9jayIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAganBlZ193cml0ZV9tYXJrZXIoJm1Db21wcmVzc0luZm8sIEpQRUdfQVBQMCArIDEsIHJhd0RhdGEsIHNpemUpOworICAgIGZyZWUocmF3RGF0YSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK05WMTJDb21wcmVzc29yOjpFcnJvck1hbmFnZXI6OkVycm9yTWFuYWdlcigpIHsKKyAgICBlcnJvcl9leGl0ID0gJm9uSnBlZ0Vycm9yOworfQorCit2b2lkIE5WMTJDb21wcmVzc29yOjpFcnJvck1hbmFnZXI6Om9uSnBlZ0Vycm9yKGpfY29tbW9uX3B0ciBjaW5mbykgeworICAgIC8vIE5PVEUhIERvIG5vdCBjb25zdHJ1Y3QgYW55IG5vbi10cml2aWFsIG9iamVjdHMgaW4gdGhpcyBtZXRob2QgYXQgdGhlIHRvcAorICAgIC8vIHNjb3BlLiBUaGVpciBkZXN0cnVjdG9ycyB3aWxsIG5vdCBiZSBjYWxsZWQuIElmIHlvdSBkbyBuZWVkIHN1Y2ggYW4KKyAgICAvLyBvYmplY3QgY3JlYXRlIGEgbG9jYWwgc2NvcGUgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBsb25nam1wIGNhbGwsCisgICAgLy8gdGhhdCBlbnN1cmVzIHRoZSBvYmplY3QgaXMgZGVzdHJveWVkIGJlZm9yZSBsb25nam1wIGlzIGNhbGxlZC4KKyAgICBFcnJvck1hbmFnZXIqIGVycm9yTWFuYWdlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8RXJyb3JNYW5hZ2VyKj4oY2luZm8tPmVycik7CisKKyAgICAvLyBGb3JtYXQgYW5kIGxvZyBlcnJvciBtZXNzYWdlCisgICAgY2hhciBlcnJvck1lc3NhZ2VbSk1TR19MRU5HVEhfTUFYXTsKKyAgICAoKmVycm9yTWFuYWdlci0+Zm9ybWF0X21lc3NhZ2UpKGNpbmZvLCBlcnJvck1lc3NhZ2UpOworICAgIGVycm9yTWVzc2FnZVtzaXplb2YoZXJyb3JNZXNzYWdlKSAtIDFdID0gJ1wwJzsKKyAgICBBTE9HRSgiSlBFRyBjb21wcmVzc2lvbiBlcnJvcjogJXMiLCBlcnJvck1lc3NhZ2UpOworICAgIGpwZWdfZGVzdHJveShjaW5mbyk7CisKKyAgICAvLyBBbmQgdGhyb3VnaCB0aGUgbG9va2luZyBnbGFzcyB3ZSBnbworICAgIGxvbmdqbXAoZXJyb3JNYW5hZ2VyLT5tSnVtcEJ1ZmZlciwgMSk7Cit9CisKK05WMTJDb21wcmVzc29yOjpEZXN0aW5hdGlvbk1hbmFnZXI6OkRlc3RpbmF0aW9uTWFuYWdlcigpIHsKKyAgICBpbml0X2Rlc3RpbmF0aW9uID0gJmluaXREZXN0aW5hdGlvbjsKKyAgICBlbXB0eV9vdXRwdXRfYnVmZmVyID0gJmVtcHR5T3V0cHV0QnVmZmVyOworICAgIHRlcm1fZGVzdGluYXRpb24gPSAmdGVybURlc3RpbmF0aW9uOworfQorCit2b2lkIE5WMTJDb21wcmVzc29yOjpEZXN0aW5hdGlvbk1hbmFnZXI6OmluaXREZXN0aW5hdGlvbihqX2NvbXByZXNzX3B0ciBjaW5mbykgeworICAgIGF1dG8gbWFuYWdlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8RGVzdGluYXRpb25NYW5hZ2VyKj4oY2luZm8tPmRlc3QpOworCisgICAgLy8gU3RhcnQgb3V0IHdpdGggc29tZSBhcmJpdHJhcnkgYnV0IG5vdCB0b28gbGFyZ2UgYnVmZmVyIHNpemUKKyAgICBtYW5hZ2VyLT5tQnVmZmVyLnJlc2l6ZSgxNiAqIDEwMjQpOworICAgIG1hbmFnZXItPm5leHRfb3V0cHV0X2J5dGUgPSAmbWFuYWdlci0+bUJ1ZmZlclswXTsKKyAgICBtYW5hZ2VyLT5mcmVlX2luX2J1ZmZlciA9IG1hbmFnZXItPm1CdWZmZXIuc2l6ZSgpOworfQorCitib29sZWFuIE5WMTJDb21wcmVzc29yOjpEZXN0aW5hdGlvbk1hbmFnZXI6OmVtcHR5T3V0cHV0QnVmZmVyKAorICAgICAgICBqX2NvbXByZXNzX3B0ciBjaW5mbykgeworICAgIGF1dG8gbWFuYWdlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8RGVzdGluYXRpb25NYW5hZ2VyKj4oY2luZm8tPmRlc3QpOworCisgICAgLy8gS2VlcCBkb3VibGluZyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGZvciBhIHZlcnkgbG93LCBhbW9ydGl6ZWQKKyAgICAvLyBwZXJmb3JtYW5jZSBjb3N0IG9mIHRoZSBhbGxvY2F0aW9ucworICAgIHNpemVfdCBvbGRTaXplID0gbWFuYWdlci0+bUJ1ZmZlci5zaXplKCk7CisgICAgbWFuYWdlci0+bUJ1ZmZlci5yZXNpemUob2xkU2l6ZSAqIDIpOworICAgIG1hbmFnZXItPm5leHRfb3V0cHV0X2J5dGUgPSAmbWFuYWdlci0+bUJ1ZmZlcltvbGRTaXplXTsKKyAgICBtYW5hZ2VyLT5mcmVlX2luX2J1ZmZlciA9IG1hbmFnZXItPm1CdWZmZXIuc2l6ZSgpIC0gb2xkU2l6ZTsKKyAgICByZXR1cm4gbWFuYWdlci0+ZnJlZV9pbl9idWZmZXIgIT0gMDsKK30KKwordm9pZCBOVjEyQ29tcHJlc3Nvcjo6RGVzdGluYXRpb25NYW5hZ2VyOjp0ZXJtRGVzdGluYXRpb24oal9jb21wcmVzc19wdHIgY2luZm8pIHsKKyAgICBhdXRvIG1hbmFnZXIgPSByZWludGVycHJldF9jYXN0PERlc3RpbmF0aW9uTWFuYWdlcio+KGNpbmZvLT5kZXN0KTsKKworICAgIC8vIFJlc2l6ZSBkb3duIHRvIHRoZSBleGFjdCBzaXplIG9mIHRoZSBvdXRwdXQsIHRoYXQgaXMgcmVtb3ZlIGFzIG1hbnkKKyAgICAvLyBieXRlcyBhcyB0aGVyZSBhcmUgbGVmdCBpbiB0aGUgYnVmZmVyCisgICAgbWFuYWdlci0+bUJ1ZmZlci5yZXNpemUobWFuYWdlci0+bUJ1ZmZlci5zaXplKCkgLSBtYW5hZ2VyLT5mcmVlX2luX2J1ZmZlcik7Cit9CisKK3N0YXR1c190IE5WMTJDb21wcmVzc29yOjpmaW5kSnBlZ1NpemUodWludDhfdCAqanBlZ0J1ZmZlciwgc2l6ZV90IG1heFNpemUsIHNpemVfdCAqc2l6ZSAvKm91dCovKSB7CisgICAgaWYgKChzaXplID09IG51bGxwdHIpIHx8IChqcGVnQnVmZmVyID09IG51bGxwdHIpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKGNoZWNrSnBlZ1N0YXJ0KGpwZWdCdWZmZXIpID09IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBSZWFkIEpGSUYgc2VnbWVudCBtYXJrZXJzLCBza2lwIG92ZXIgc2VnbWVudCBkYXRhCisgICAgKnNpemUgPSBrTWFya2VyTGVuZ3RoOyAvL2p1bXAgdG8gU3RhcnQgT2YgSW1hZ2UKKyAgICB3aGlsZSAoKnNpemUgPD0gbWF4U2l6ZSAtIGtNYXJrZXJMZW5ndGgpIHsKKyAgICAgICAgc2VnbWVudF90ICpzZWdtZW50ID0gKHNlZ21lbnRfdCopKGpwZWdCdWZmZXIgKyAqc2l6ZSk7CisgICAgICAgIHVpbnQ4X3QgdHlwZSA9IGNoZWNrSnBlZ01hcmtlcihzZWdtZW50LT5tYXJrZXIpOworICAgICAgICBpZiAodHlwZSA9PSAwKSB7IC8vIGludmFsaWQgbWFya2VyLCBubyBtb3JlIHNlZ21lbnRzLCBiZWdpbiBKUEVHIGRhdGEKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlID09IGtFbmRPZkltYWdlIHx8ICpzaXplID4gbWF4U2l6ZSAtIHNpemVvZihzZWdtZW50X3QpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGxlbmd0aCA9IG50b2hzKHNlZ21lbnQtPmxlbmd0aCk7CisgICAgICAgICpzaXplICs9IGxlbmd0aCArIGtNYXJrZXJMZW5ndGg7CisgICAgfQorCisgICAgLy8gRmluZCBFbmQgb2YgSW1hZ2UKKyAgICAvLyBTY2FuIEpQRUcgYnVmZmVyIHVudGlsIEVuZCBvZiBJbWFnZQorICAgIGJvb2wgZm91bmRFbmQgPSBmYWxzZTsKKyAgICBmb3IgKCA7ICpzaXplIDw9IG1heFNpemUgLSBrTWFya2VyTGVuZ3RoOyAoKnNpemUpKyspIHsKKyAgICAgICAgaWYgKGNoZWNrSnBlZ0VuZChqcGVnQnVmZmVyICsgKnNpemUpKSB7CisgICAgICAgICAgICBmb3VuZEVuZCA9IHRydWU7CisgICAgICAgICAgICAqc2l6ZSArPSBrTWFya2VyTGVuZ3RoOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWZvdW5kRW5kKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKCpzaXplID4gbWF4U2l6ZSkgeworICAgICAgICAqc2l6ZSA9IG1heFNpemU7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOVjEyQ29tcHJlc3Nvcjo6Z2V0SnBlZ0ltYWdlRGltZW5zaW9ucyh1aW50OF90ICpqcGVnQnVmZmVyLAorICAgICAgICBzaXplX3QganBlZ0J1ZmZlclNpemUsIHNpemVfdCAqd2lkdGggLypvdXQqLywgc2l6ZV90ICpoZWlnaHQgLypvdXQqLykgeworICAgIGlmICgoanBlZ0J1ZmZlciA9PSBudWxscHRyKSB8fCAod2lkdGggPT0gbnVsbHB0cikgfHwgKGhlaWdodCA9PSBudWxscHRyKSB8fAorICAgICAgICAgICAgKGpwZWdCdWZmZXJTaXplID09IDB1KSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFNjYW4gSlBFRyBidWZmZXIgdW50aWwgU3RhcnQgb2YgRnJhbWUKKyAgICBib29sIGZvdW5kU09GID0gZmFsc2U7CisgICAgc2l6ZV90IGN1cnJlbnRQb3M7CisgICAgZm9yIChjdXJyZW50UG9zID0gMDsgY3VycmVudFBvcyA8PSBqcGVnQnVmZmVyU2l6ZSAtIGtNYXJrZXJMZW5ndGg7IGN1cnJlbnRQb3MrKykgeworICAgICAgICBpZiAoY2hlY2tTdGFydE9mRnJhbWUoanBlZ0J1ZmZlciArIGN1cnJlbnRQb3MpKSB7CisgICAgICAgICAgICBmb3VuZFNPRiA9IHRydWU7CisgICAgICAgICAgICBjdXJyZW50UG9zICs9IGtNYXJrZXJMZW5ndGg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZm91bmRTT0YpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdGFydCBvZiBGcmFtZSBub3QgZm91bmQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc29mX3QgKnN0YXJ0T2ZGcmFtZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8c29mX3QgKj4gKGpwZWdCdWZmZXIgKyBjdXJyZW50UG9zKTsKKyAgICAqd2lkdGggPSBudG9ocyhzdGFydE9mRnJhbWUtPndpZHRoKTsKKyAgICAqaGVpZ2h0ID0gbnRvaHMoc3RhcnRPZkZyYW1lLT5oZWlnaHQpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOVjEyQ29tcHJlc3Nvcjo6Z2V0RXhpZk9yaWVudGF0aW9uKHVpbnQ4X3QgKmpwZWdCdWZmZXIsIHNpemVfdCBqcGVnQnVmZmVyU2l6ZSwKKyAgICAgICAgRXhpZk9yaWVudGF0aW9uICpleGlmVmFsdWUgLypvdXQqLykgeworICAgIGlmICgoanBlZ0J1ZmZlciA9PSBudWxscHRyKSB8fCAoZXhpZlZhbHVlID09IG51bGxwdHIpIHx8IChqcGVnQnVmZmVyU2l6ZSA9PSAwdSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkRhdGE+IGV4aWZEYXRhKGV4aWZfZGF0YV9uZXcoKSk7CisgICAgZXhpZl9kYXRhX2xvYWRfZGF0YShleGlmRGF0YS5nZXQoKSwganBlZ0J1ZmZlciwganBlZ0J1ZmZlclNpemUpOworICAgIEV4aWZFbnRyeSAqb3JpZW50YXRpb24gPSBleGlmX2NvbnRlbnRfZ2V0X2VudHJ5KGV4aWZEYXRhLT5pZmRbRVhJRl9JRkRfMF0sCisgICAgICAgICAgICBFWElGX1RBR19PUklFTlRBVElPTik7CisgICAgaWYgKChvcmllbnRhdGlvbiA9PSBudWxscHRyKSB8fCAob3JpZW50YXRpb24tPnNpemUgIT0gc2l6ZW9mKEV4aWZTaG9ydCkpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgYXV0byBvcmllbnRhdGlvblZhbHVlID0gZXhpZl9nZXRfc2hvcnQob3JpZW50YXRpb24tPmRhdGEsCisgICAgICAgICAgICBleGlmX2RhdGFfZ2V0X2J5dGVfb3JkZXIoZXhpZkRhdGEuZ2V0KCkpKTsKKyAgICBzdGF0dXNfdCByZXQ7CisgICAgc3dpdGNoIChvcmllbnRhdGlvblZhbHVlKSB7CisgICAgICAgIGNhc2UgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVM6CisgICAgICAgIGNhc2UgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl85MF9ERUdSRUVTOgorICAgICAgICBjYXNlIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMTgwX0RFR1JFRVM6CisgICAgICAgIGNhc2UgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8yNzBfREVHUkVFUzoKKyAgICAgICAgICAgICpleGlmVmFsdWUgPSBzdGF0aWNfY2FzdDxFeGlmT3JpZW50YXRpb24+IChvcmllbnRhdGlvblZhbHVlKTsKKyAgICAgICAgICAgIHJldCA9IE9LOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgRVhJRiBvcmllbnRhdGlvbiB2YWx1ZTogJXUiLCBfX0ZVTkNUSU9OX18sIG9yaWVudGF0aW9uVmFsdWUpOworICAgICAgICAgICAgcmV0ID0gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9OVjEyQ29tcHJlc3Nvci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvTlYxMkNvbXByZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTIyZDVlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvTlYxMkNvbXByZXNzb3IuaApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEVTVF9DQU1FUkFfSlBFR19TVFVCX05WMTJfQ09NUFJFU1NPUl9ICisjZGVmaW5lIFRFU1RfQ0FNRVJBX0pQRUdfU1RVQl9OVjEyX0NPTVBSRVNTT1JfSAorCisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CitleHRlcm4gIkMiIHsKKyNpbmNsdWRlIDxqcGVnbGliLmg+CisjaW5jbHVkZSA8amVycm9yLmg+Cit9CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICIuLi91dGlscy9FeGlmVXRpbHMuaCIKKworc3RydWN0IF9FeGlmRGF0YTsKK3R5cGVkZWYgX0V4aWZEYXRhIEV4aWZEYXRhOworCitjbGFzcyBOVjEyQ29tcHJlc3NvciB7CitwdWJsaWM6CisgICAgTlYxMkNvbXByZXNzb3IoKSB7fQorCisgICAgLyogQ29tcHJlc3MgfGRhdGF8IHdoaWNoIHJlcHJlc2VudHMgcmF3IE5WMjEgZW5jb2RlZCBkYXRhIG9mIGRpbWVuc2lvbnMKKyAgICAgKiB8d2lkdGh8ICogfGhlaWdodHwuCisgICAgICovCisgICAgYm9vbCBjb21wcmVzcyhjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBxdWFsaXR5KTsKKyAgICBib29sIGNvbXByZXNzV2l0aEV4aWZPcmllbnRhdGlvbihjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBxdWFsaXR5LAorICAgICAgICAgICAgYW5kcm9pZDo6Y2FtZXJhMzo6RXhpZk9yaWVudGF0aW9uIGV4aWZWYWx1ZSk7CisKKyAgICAvKiBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGNvbXByZXNzZWQgZGF0YSwgdGhpcyB3aWxsIHJldHVybiBhbiBlbXB0eSB2ZWN0b3IKKyAgICAgKiBpZiBjb21wcmVzcyBoYXMgbm90IGJlZW4gY2FsbGVkIHlldAorICAgICAqLworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+JiBnZXRDb21wcmVzc2VkRGF0YSgpIGNvbnN0OworCisgICAgLy8gVXRpbGl0eSBtZXRob2RzCisgICAgc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGZpbmRKcGVnU2l6ZSh1aW50OF90ICpqcGVnQnVmZmVyLCBzaXplX3QgbWF4U2l6ZSwKKyAgICAgICAgICAgIHNpemVfdCAqc2l6ZSAvKm91dCovKTsKKworICAgIHN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBnZXRFeGlmT3JpZW50YXRpb24odWludDhfdCAqanBlZ0J1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCBqcGVnQnVmZmVyU2l6ZSwgYW5kcm9pZDo6Y2FtZXJhMzo6RXhpZk9yaWVudGF0aW9uICpleGlmVmFsdWUgLypvdXQqLyk7CisKKyAgICAvKiBHZXQgSnBlZyBpbWFnZSBkaW1lbnNpb25zIGZyb20gdGhlIGZpcnN0IFN0YXJ0IE9mIEZyYW1lLiBQbGVhc2Ugbm90ZSB0aGF0IGR1ZSB0byB0aGUKKyAgICAgKiB3YXkgdGhlIGpwZWcgYnVmZmVyIGlzIHNjYW5uZWQgaWYgdGhlIGltYWdlIGNvbnRhaW5zIGEgdGh1bWJuYWlsLCB0aGVuIHRoZSBzaXplIHJldHVybmVkCisgICAgICogd2lsbCBiZSBvZiB0aGUgdGh1bWJuYWlsIGFuZCBub3QgdGhlIG1haW4gaW1hZ2UuCisgICAgICovCisgICAgc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGdldEpwZWdJbWFnZURpbWVuc2lvbnModWludDhfdCAqanBlZ0J1ZmZlciwgc2l6ZV90IGpwZWdCdWZmZXJTaXplLAorICAgICAgICAgICAgc2l6ZV90ICp3aWR0aCAvKm91dCovLCBzaXplX3QgKmhlaWdodCAvKm91dCovKTsKKworcHJpdmF0ZToKKworICAgIHN0cnVjdCBEZXN0aW5hdGlvbk1hbmFnZXIgOiBqcGVnX2Rlc3RpbmF0aW9uX21nciB7CisgICAgICAgIERlc3RpbmF0aW9uTWFuYWdlcigpOworCisgICAgICAgIHN0YXRpYyB2b2lkIGluaXREZXN0aW5hdGlvbihqX2NvbXByZXNzX3B0ciBjaW5mbyk7CisgICAgICAgIHN0YXRpYyBib29sZWFuIGVtcHR5T3V0cHV0QnVmZmVyKGpfY29tcHJlc3NfcHRyIGNpbmZvKTsKKyAgICAgICAgc3RhdGljIHZvaWQgdGVybURlc3RpbmF0aW9uKGpfY29tcHJlc3NfcHRyIGNpbmZvKTsKKworICAgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiBtQnVmZmVyOworICAgIH07CisKKyAgICBzdHJ1Y3QgRXJyb3JNYW5hZ2VyIDoganBlZ19lcnJvcl9tZ3IgeworICAgICAgICBFcnJvck1hbmFnZXIoKTsKKworICAgICAgICBzdGF0aWMgdm9pZCBvbkpwZWdFcnJvcihqX2NvbW1vbl9wdHIgY2luZm8pOworCisgICAgICAgIGptcF9idWYgbUp1bXBCdWZmZXI7CisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01hcmtlckxlbmd0aCA9IDI7IC8vIGxlbmd0aCBvZiBhIG1hcmtlcgorICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtNYXJrZXIgPSAweEZGOyAvLyBGaXJzdCBieXRlIG9mIG1hcmtlcgorICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtTdGFydE9mSW1hZ2UgPSAweEQ4OyAvLyBTdGFydCBvZiBJbWFnZQorICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtFbmRPZkltYWdlID0gMHhEOTsgLy8gRW5kIG9mIEltYWdlCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1N0YXJ0T2ZGcmFtZSA9IDB4QzA7IC8vIFN0YXJ0IG9mIEZyYW1lCisKKyAgICBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2VnbWVudF90IHsKKyAgICAgICAgdWludDhfdCBtYXJrZXJba01hcmtlckxlbmd0aF07CisgICAgICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICB9OworCisgICAgc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNvZl90IHsKKyAgICAgICAgdWludDE2X3QgbGVuZ3RoOworICAgICAgICB1aW50OF90IHByZWNpc2lvbjsKKyAgICAgICAgdWludDE2X3QgaGVpZ2h0OworICAgICAgICB1aW50MTZfdCB3aWR0aDsKKyAgICB9OworCisgICAgLy8gY2hlY2sgZm9yIHN0YXJ0IG9mIGltYWdlIG1hcmtlcgorICAgIHN0YXRpYyBib29sIGNoZWNrU3RhcnRPZkZyYW1lKHVpbnQ4X3QqIGJ1ZikgeworICAgICAgICByZXR1cm4gYnVmWzBdID09IGtNYXJrZXIgJiYgYnVmWzFdID09IGtTdGFydE9mRnJhbWU7CisgICAgfQorCisgICAgLy8gY2hlY2sgZm9yIHN0YXJ0IG9mIGltYWdlIG1hcmtlcgorICAgIHN0YXRpYyBib29sIGNoZWNrSnBlZ1N0YXJ0KHVpbnQ4X3QqIGJ1ZikgeworICAgICAgICByZXR1cm4gYnVmWzBdID09IGtNYXJrZXIgJiYgYnVmWzFdID09IGtTdGFydE9mSW1hZ2U7CisgICAgfQorCisgICAgLy8gY2hlY2sgZm9yIEVuZCBvZiBJbWFnZSBtYXJrZXIKKyAgICBzdGF0aWMgYm9vbCBjaGVja0pwZWdFbmQodWludDhfdCAqYnVmKSB7CisgICAgICAgIHJldHVybiBidWZbMF0gPT0ga01hcmtlciAmJiBidWZbMV0gPT0ga0VuZE9mSW1hZ2U7CisgICAgfQorCisgICAgLy8gY2hlY2sgZm9yIGFyYml0cmFyeSBtYXJrZXIsIHJldHVybnMgbWFya2VyIHR5cGUgKHNlY29uZCBieXRlKQorICAgIC8vIHJldHVybnMgMCBpZiBubyBtYXJrZXIgZm91bmQuIE5vdGU6IDB4MDAgaXMgbm90IGEgdmFsaWQgbWFya2VyIHR5cGUKKyAgICBzdGF0aWMgdWludDhfdCBjaGVja0pwZWdNYXJrZXIodWludDhfdCAqYnVmKSB7CisgICAgICAgIHJldHVybiAoYnVmWzBdID09IGtNYXJrZXIpID8gYnVmWzFdIDogMDsKKyAgICB9CisKKyAgICBqcGVnX2NvbXByZXNzX3N0cnVjdCBtQ29tcHJlc3NJbmZvOworICAgIERlc3RpbmF0aW9uTWFuYWdlciBtRGVzdE1hbmFnZXI7CisgICAgRXJyb3JNYW5hZ2VyIG1FcnJvck1hbmFnZXI7CisKKyAgICBib29sIGNvbmZpZ3VyZUNvbXByZXNzb3IoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcXVhbGl0eSk7CisgICAgYm9vbCBjb21wcmVzc0RhdGEoY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgRXhpZkRhdGEqIGV4aWZEYXRhKTsKKyAgICBib29sIGF0dGFjaEV4aWZEYXRhKEV4aWZEYXRhKiBleGlmRGF0YSk7Cit9OworCisjZW5kaWYgIC8vIFRFU1RfQ0FNRVJBX0pQRUdfU1RVQl9OVjEyX0NPTVBSRVNTT1JfSAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjllMzQ0YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmNwcApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkNhbWVyYVRocmVhZFN0YXRlLmgiCisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitpbnQgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKSB7CisgICAgaWYgKGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5pc1NlcnZpbmdDYWxsKCkpIHsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgfQorICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Cit9CisKK2ludCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpIHsKKyAgICBpZiAoaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmlzU2VydmluZ0NhbGwoKSkgeworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICB9CisgICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKK30KKworaW50NjRfdCBDYW1lcmFUaHJlYWRTdGF0ZTo6Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKSB7CisgICAgaWYgKGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5pc1NlcnZpbmdDYWxsKCkpIHsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIH0KKyAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKK30KKwordm9pZCBDYW1lcmFUaHJlYWRTdGF0ZTo6cmVzdG9yZUNhbGxpbmdJZGVudGl0eShpbnQ2NF90IHRva2VuKSB7CisgICAgaWYgKGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5pc1NlcnZpbmdDYWxsKCkpIHsKKyAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFhNzBkZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworY2xhc3MgQ2FtZXJhVGhyZWFkU3RhdGUgeworcHVibGljOgorICBzdGF0aWMgaW50NjRfdCBjbGVhckNhbGxpbmdJZGVudGl0eSgpOworCisgIHN0YXRpYyB2b2lkIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaW50NjRfdCB0b2tlbik7CisKKyAgc3RhdGljIGludCBnZXRDYWxsaW5nVWlkKCk7CisKKyAgc3RhdGljIGludCBnZXRDYWxsaW5nUGlkKCk7Cit9OworCit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0V4aWZVdGlscy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9FeGlmVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYWZkYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9FeGlmVXRpbHMuY3BwCkBAIC0wLDAgKzEsMTEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhU2VydmVyRXhpZlV0aWxzIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiRXhpZlV0aWxzLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgPGxpYmV4aWYvZXhpZi1kYXRhLmg+Cit9CisKK25hbWVzcGFjZSBzdGQgeworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGRlZmF1bHRfZGVsZXRlPEV4aWZFbnRyeT4geworICAgIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoRXhpZkVudHJ5KiBlbnRyeSkgY29uc3QgeyBleGlmX2VudHJ5X3VucmVmKGVudHJ5KTsgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIHN0ZAorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworCitjbGFzcyBFeGlmVXRpbHNJbXBsIDogcHVibGljIEV4aWZVdGlscyB7CitwdWJsaWM6CisgICAgRXhpZlV0aWxzSW1wbCgpOworCisgICAgdmlydHVhbCB+RXhpZlV0aWxzSW1wbCgpOworCisgICAgLy8gSW5pdGlhbGl6ZSgpIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFRoZSBzZXR0aW5nIG9mIEV4aWYgdGFncyB3aWxsIGJlCisgICAgLy8gY2xlYXJlZC4KKyAgICB2aXJ0dWFsIGJvb2wgaW5pdGlhbGl6ZShjb25zdCB1bnNpZ25lZCBjaGFyICphcHAxU2VnbWVudCwgc2l6ZV90IGFwcDFTZWdtZW50U2l6ZSk7CisgICAgdmlydHVhbCBib29sIGluaXRpYWxpemVFbXB0eSgpOworCisgICAgLy8gc2V0IGFsbCBrbm93biBmaWVsZHMgZnJvbSBhIG1ldGFkYXRhIHN0cnVjdHVyZQorICAgIHZpcnR1YWwgYm9vbCBzZXRGcm9tTWV0YWRhdGEoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8sCisgICAgICAgICAgICBjb25zdCBzaXplX3QgaW1hZ2VXaWR0aCwKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBpbWFnZUhlaWdodCk7CisKKyAgICAvLyBzZXRzIHRoZSBsZW4gYXBlcnR1cmUuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0QXBlcnR1cmUoZmxvYXQgYXBlcnR1cmUpOworCisgICAgLy8gc2V0cyB0aGUgY29sb3Igc3BhY2UuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Q29sb3JTcGFjZSh1aW50MTZfdCBjb2xvcl9zcGFjZSk7CisKKyAgICAvLyBzZXRzIHRoZSBkYXRlIGFuZCB0aW1lIG9mIGltYWdlIGxhc3QgbW9kaWZpZWQuIEl0IHRha2VzIGxvY2FsIHRpbWUuIFRoZQorICAgIC8vIG5hbWUgb2YgdGhlIHRhZyBpcyBEYXRlVGltZSBpbiBJRkQwLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldERhdGVUaW1lKGNvbnN0IHN0cnVjdCB0bSYgdCk7CisKKyAgICAvLyBzZXRzIHRoZSBkaWdpdGFsIHpvb20gcmF0aW8uIElmIHRoZSBudW1lcmF0b3IgaXMgMCwgaXQgbWVhbnMgZGlnaXRhbCB6b29tCisgICAgLy8gd2FzIG5vdCB1c2VkLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldERpZ2l0YWxab29tUmF0aW8oCisgICAgICAgICAgICB1aW50MzJfdCBjcm9wX3dpZHRoLCB1aW50MzJfdCBjcm9wX2hlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IHNlbnNvcl93aWR0aCwgdWludDMyX3Qgc2Vuc29yX2hlaWdodCk7CisKKyAgICAvLyBTZXRzIHRoZSBleHBvc3VyZSBiaWFzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEV4cG9zdXJlQmlhcyhpbnQzMl90IGV2LAorICAgICAgICAgICAgdWludDMyX3QgZXZfc3RlcF9udW1lcmF0b3IsIHVpbnQzMl90IGV2X3N0ZXBfZGVub21pbmF0b3IpOworCisgICAgLy8gc2V0cyB0aGUgZXhwb3N1cmUgbW9kZSBzZXQgd2hlbiB0aGUgaW1hZ2Ugd2FzIHNob3QuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RXhwb3N1cmVNb2RlKHVpbnQ4X3QgZXhwb3N1cmVfbW9kZSk7CisKKyAgICAvLyBzZXRzIHRoZSBleHBvc3VyZSB0aW1lLCBnaXZlbiBpbiBzZWNvbmRzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEV4cG9zdXJlVGltZShmbG9hdCBleHBvc3VyZV90aW1lKTsKKworICAgIC8vIHNldHMgdGhlIHN0YXR1cyBvZiBmbGFzaC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRGbGFzaCh1aW50OF90IGZsYXNoX2F2YWlsYWJsZSwgdWludDhfdCBmbGFzaF9zdGF0ZSwgdWludDhfdCBhZV9tb2RlKTsKKworICAgIC8vIHNldHMgdGhlIEYgbnVtYmVyLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEZOdW1iZXIoZmxvYXQgZl9udW1iZXIpOworCisgICAgLy8gc2V0cyB0aGUgZm9jYWwgbGVuZ3RoIG9mIGxlbnMgdXNlZCB0byB0YWtlIHRoZSBpbWFnZSBpbiBtaWxsaW1ldGVycy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRGb2NhbExlbmd0aChmbG9hdCBmb2NhbF9sZW5ndGgpOworCisgICAgLy8gc2V0cyB0aGUgZm9jYWwgbGVuZ3RoIG9mIGxlbnMgZm9yIDM1bW0gZmlsbSB1c2VkIHRvIHRha2UgdGhlIGltYWdlIGluIG1pbGxpbWV0ZXJzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEZvY2FsTGVuZ3RoSW4zNW1tRmlsbShmbG9hdCBmb2NhbF9sZW5ndGgsCisgICAgICAgICAgICBmbG9hdCBzZW5zb3Jfc2l6ZV94LCBmbG9hdCBzZW5zb3Jfc2l6ZV95KTsKKworICAgIC8vIHNldHMgdGhlIGFsdGl0dWRlIGluIG1ldGVycy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRHcHNBbHRpdHVkZShkb3VibGUgYWx0aXR1ZGUpOworCisgICAgLy8gc2V0cyB0aGUgbGF0aXR1ZGUgd2l0aCBkZWdyZWVzIG1pbnV0ZXMgc2Vjb25kcyBmb3JtYXQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0R3BzTGF0aXR1ZGUoZG91YmxlIGxhdGl0dWRlKTsKKworICAgIC8vIHNldHMgdGhlIGxvbmdpdHVkZSB3aXRoIGRlZ3JlZXMgbWludXRlcyBzZWNvbmRzIGZvcm1hdC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRHcHNMb25naXR1ZGUoZG91YmxlIGxvbmdpdHVkZSk7CisKKyAgICAvLyBzZXRzIEdQUyBwcm9jZXNzaW5nIG1ldGhvZC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRHcHNQcm9jZXNzaW5nTWV0aG9kKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXRob2QpOworCisgICAgLy8gc2V0cyBHUFMgZGF0ZSBzdGFtcCBhbmQgdGltZSBzdGFtcCAoYXRvbWljIGNsb2NrKS4gSXQgdGFrZXMgVVRDIHRpbWUuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0R3BzVGltZXN0YW1wKGNvbnN0IHN0cnVjdCB0bSYgdCk7CisKKyAgICAvLyBzZXRzIHRoZSBsZW5ndGggKG51bWJlciBvZiByb3dzKSBvZiBtYWluIGltYWdlLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEltYWdlSGVpZ2h0KHVpbnQzMl90IGxlbmd0aCk7CisKKyAgICAvLyBzZXRzIHRoZSB3aWR0aCAobnVtYmVyIG9mIGNvbHVtZXMpIG9mIG1haW4gaW1hZ2UuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0SW1hZ2VXaWR0aCh1aW50MzJfdCB3aWR0aCk7CisKKyAgICAvLyBzZXRzIHRoZSBJU08gc3BlZWQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0SXNvU3BlZWRSYXRpbmcodWludDE2X3QgaXNvX3NwZWVkX3JhdGluZ3MpOworCisgICAgLy8gc2V0cyB0aGUgc21hbGxlc3QgRiBudW1iZXIgb2YgdGhlIGxlbnMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0TWF4QXBlcnR1cmUoZmxvYXQgYXBlcnR1cmUpOworCisgICAgLy8gc2V0cyBpbWFnZSBvcmllbnRhdGlvbi4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRPcmllbnRhdGlvbih1aW50MTZfdCBkZWdyZWVzKTsKKworICAgIC8vIHNldHMgaW1hZ2Ugb3JpZW50YXRpb24uCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0T3JpZW50YXRpb25WYWx1ZShFeGlmT3JpZW50YXRpb24gb3JpZW50YXRpb25WYWx1ZSk7CisKKyAgICAvLyBzZXRzIHRoZSBzaHV0dGVyIHNwZWVkLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldFNodXR0ZXJTcGVlZChmbG9hdCBleHBvc3VyZV90aW1lKTsKKworICAgIC8vIHNldHMgdGhlIGRpc3RhbmNlIHRvIHRoZSBzdWJqZWN0LCBnaXZlbiBpbiBtZXRlcnMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0U3ViamVjdERpc3RhbmNlKGZsb2F0IGRpb3B0ZXJzKTsKKworICAgIC8vIHNldHMgdGhlIGZyYWN0aW9ucyBvZiBzZWNvbmRzIGZvciB0aGUgPERhdGVUaW1lPiB0YWcuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0U3Vic2VjVGltZShjb25zdCBzdGQ6OnN0cmluZyYgc3Vic2VjX3RpbWUpOworCisgICAgLy8gc2V0cyB0aGUgd2hpdGUgYmFsYW5jZSBtb2RlIHNldCB3aGVuIHRoZSBpbWFnZSB3YXMgc2hvdC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRXaGl0ZUJhbGFuY2UodWludDhfdCB3aGl0ZV9iYWxhbmNlKTsKKworICAgIC8vIEdlbmVyYXRlcyBBUFAxIHNlZ21lbnQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBnZW5lcmF0aW5nIEFQUDEgc2VnbWVudCBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgZ2VuZXJhdGVBcHAxKCk7CisKKyAgICAvLyBHZXRzIGJ1ZmZlciBvZiBBUFAxIHNlZ21lbnQuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgY2FsbGluZworICAgIC8vIEdlbmVyYXRlQVBQMSgpLgorICAgIHZpcnR1YWwgY29uc3QgdWludDhfdCogZ2V0QXBwMUJ1ZmZlcigpOworCisgICAgLy8gR2V0cyBsZW5ndGggb2YgQVBQMSBzZWdtZW50LiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBvbmx5IGFmdGVyIGNhbGxpbmcKKyAgICAvLyBHZW5lcmF0ZUFQUDEoKS4KKyAgICB2aXJ0dWFsIHVuc2lnbmVkIGludCBnZXRBcHAxTGVuZ3RoKCk7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIHNldHMgdGhlIHZlcnNpb24gb2YgdGhpcyBzdGFuZGFyZCBzdXBwb3J0ZWQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RXhpZlZlcnNpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGV4aWZfdmVyc2lvbik7CisKKyAgICAvLyBSZXNldHMgdGhlIHBvaW50ZXJzIGFuZCBtZW1vcmllcy4KKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKworICAgIC8vIEFkZHMgYSB2YXJpYWJsZSBsZW5ndGggdGFnIHRvIHxleGlmX2RhdGFffC4gSXQgd2lsbCByZW1vdmUgdGhlIG9yaWdpbmFsIG9uZQorICAgIC8vIGlmIHRoZSB0YWcgZXhpc3RzLgorICAgIC8vIFJldHVybnMgdGhlIGVudHJ5IG9mIHRoZSB0YWcuIFRoZSByZWZlcmVuY2UgY291bnQgb2YgcmV0dXJuZWQgRXhpZkVudHJ5IGlzCisgICAgLy8gdHdvLgorICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gYWRkVmFyaWFibGVMZW5ndGhFbnRyeShFeGlmSWZkIGlmZCwKKyAgICAgICAgICAgIEV4aWZUYWcgdGFnLCBFeGlmRm9ybWF0IGZvcm1hdCwgdWludDY0X3QgY29tcG9uZW50cywgdW5zaWduZWQgaW50IHNpemUpOworCisgICAgLy8gQWRkcyBhIGVudHJ5IG9mIHx0YWd8IGluIHxleGlmX2RhdGFffC4gSXQgd29uJ3QgcmVtb3ZlIHRoZSBvcmlnaW5hbCBvbmUgaWYKKyAgICAvLyB0aGUgdGFnIGV4aXN0cy4KKyAgICAvLyBSZXR1cm5zIHRoZSBlbnRyeSBvZiB0aGUgdGFnLiBJdCBhZGRzIG9uZSByZWZlcmVuY2UgY291bnQgdG8gcmV0dXJuZWQKKyAgICAvLyBFeGlmRW50cnkuCisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBhZGRFbnRyeShFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcpOworCisgICAgLy8gSGVscGUgZnVuY3Rpb25zIHRvIGFkZCBleGlmIGRhdGEgd2l0aCBkaWZmZXJlbnQgdHlwZXMuCisgICAgdmlydHVhbCBib29sIHNldFNob3J0KEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZywgdWludDE2X3QgdmFsdWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpOworCisgICAgdmlydHVhbCBib29sIHNldExvbmcoRXhpZklmZCBpZmQsIEV4aWZUYWcgdGFnLCB1aW50MzJfdCB2YWx1ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZyk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc2V0UmF0aW9uYWwoRXhpZklmZCBpZmQsIEV4aWZUYWcgdGFnLCB1aW50MzJfdCBudW1lcmF0b3IsCisgICAgICAgICAgICB1aW50MzJfdCBkZW5vbWluYXRvciwgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZyk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc2V0U1JhdGlvbmFsKEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZywgaW50MzJfdCBudW1lcmF0b3IsCisgICAgICAgICAgICBpbnQzMl90IGRlbm9taW5hdG9yLCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKTsKKworICAgIHZpcnR1YWwgYm9vbCBzZXRTdHJpbmcoRXhpZklmZCBpZmQsIEV4aWZUYWcgdGFnLCBFeGlmRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBidWZmZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpOworCisgICAgZmxvYXQgY29udmVydFRvQXBleChmbG9hdCB2YWwpIHsKKyAgICAgICAgcmV0dXJuIDIuMGYgKiBsb2cyZih2YWwpOworICAgIH0KKworICAgIC8vIERlc3Ryb3lzIHRoZSBidWZmZXIgb2YgQVBQMSBzZWdtZW50IGlmIGV4aXN0cy4KKyAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveUFwcDEoKTsKKworICAgIC8vIFRoZSBFeGlmIGRhdGEgKEFQUDEpLiBPd25lZCBieSB0aGlzIGNsYXNzLgorICAgIEV4aWZEYXRhKiBleGlmX2RhdGFfOworICAgIC8vIFRoZSByYXcgZGF0YSBvZiBBUFAxIHNlZ21lbnQuIEl0J3MgYWxsb2NhdGVkIGJ5IEV4aWZNZW0gaW4gfGV4aWZfZGF0YV98IGJ1dAorICAgIC8vIG93bmVkIGJ5IHRoaXMgY2xhc3MuCisgICAgdWludDhfdCogYXBwMV9idWZmZXJfOworICAgIC8vIFRoZSBsZW5ndGggb2YgfGFwcDFfYnVmZmVyX3wuCisgICAgdW5zaWduZWQgaW50IGFwcDFfbGVuZ3RoXzsKKworICAgIC8vIEhvdyBwcmVjaXNlIHRoZSBmbG9hdC10by1yYXRpb25hbCBjb252ZXJzaW9uIGZvciBFWElGIHRhZ3Mgd291bGQgYmUuCisgICAgY29uc3Qgc3RhdGljIGludCBrUmF0aW9uYWxQcmVjaXNpb24gPSAxMDAwMDsKK307CisKKyNkZWZpbmUgU0VUX1NIT1JUKGlmZCwgdGFnLCB2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChzZXRTaG9ydChpZmQsIHRhZywgdmFsdWUsICN0YWcpID09IGZhbHNlKSAgIFwKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApOworCisjZGVmaW5lIFNFVF9MT05HKGlmZCwgdGFnLCB2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc2V0TG9uZyhpZmQsIHRhZywgdmFsdWUsICN0YWcpID09IGZhbHNlKSAgICBcCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKTsKKworI2RlZmluZSBTRVRfUkFUSU9OQUwoaWZkLCB0YWcsIG51bWVyYXRvciwgZGVub21pbmF0b3IpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChzZXRSYXRpb25hbChpZmQsIHRhZywgbnVtZXJhdG9yLCBkZW5vbWluYXRvciwgI3RhZykgPT0gZmFsc2UpICAgXAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKTsKKworI2RlZmluZSBTRVRfU1JBVElPTkFMKGlmZCwgdGFnLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc2V0U1JhdGlvbmFsKGlmZCwgdGFnLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yLCAjdGFnKSA9PSBmYWxzZSkgICAgXAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApOworCisjZGVmaW5lIFNFVF9TVFJJTkcoaWZkLCB0YWcsIGZvcm1hdCwgYnVmZmVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChzZXRTdHJpbmcoaWZkLCB0YWcsIGZvcm1hdCwgYnVmZmVyLCAjdGFnKSA9PSBmYWxzZSkgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCk7CisKKy8vIFRoaXMgY29tZXMgZnJvbSB0aGUgRXhpZiBWZXJzaW9uIDIuMiBzdGFuZGFyZCB0YWJsZSA2LgorY29uc3QgY2hhciBnRXhpZkFzY2lpUHJlZml4W10gPSB7MHg0MSwgMHg1MywgMHg0MywgMHg0OSwgMHg0OSwgMHgwLCAweDAsIDB4MH07CisKK3N0YXRpYyB2b2lkIHNldExhdGl0dWRlT3JMb25naXR1ZGVEYXRhKHVuc2lnbmVkIGNoYXIqIGRhdGEsIGRvdWJsZSBudW0pIHsKKyAgICAvLyBUYWtlIHRoZSBpbnRlZ2VyIHBhcnQgb2YgfG51bXwuCisgICAgRXhpZkxvbmcgZGVncmVlcyA9IHN0YXRpY19jYXN0PEV4aWZMb25nPihudW0pOworICAgIEV4aWZMb25nIG1pbnV0ZXMgPSBzdGF0aWNfY2FzdDxFeGlmTG9uZz4oNjAgKiAobnVtIC0gZGVncmVlcykpOworICAgIEV4aWZMb25nIG1pY3Jvc2Vjb25kcyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxFeGlmTG9uZz4oMzYwMDAwMDAwMHUgKiAobnVtIC0gZGVncmVlcyAtIG1pbnV0ZXMgLyA2MC4wKSk7CisgICAgZXhpZl9zZXRfcmF0aW9uYWwoZGF0YSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLCB7ZGVncmVlcywgMX0pOworICAgIGV4aWZfc2V0X3JhdGlvbmFsKGRhdGEgKyBzaXplb2YoRXhpZlJhdGlvbmFsKSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLCB7bWludXRlcywgMX0pOworICAgIGV4aWZfc2V0X3JhdGlvbmFsKGRhdGEgKyAyICogc2l6ZW9mKEV4aWZSYXRpb25hbCksIEVYSUZfQllURV9PUkRFUl9JTlRFTCwKKyAgICAgICAgICAgIHttaWNyb3NlY29uZHMsIDEwMDAwMDB9KTsKK30KKworRXhpZlV0aWxzICpFeGlmVXRpbHM6OmNyZWF0ZSgpIHsKKyAgICByZXR1cm4gbmV3IEV4aWZVdGlsc0ltcGwoKTsKK30KKworRXhpZlV0aWxzOjp+RXhpZlV0aWxzKCkgeworfQorCitFeGlmVXRpbHNJbXBsOjpFeGlmVXRpbHNJbXBsKCkKKyAgICAgICAgOiBleGlmX2RhdGFfKG51bGxwdHIpLCBhcHAxX2J1ZmZlcl8obnVsbHB0ciksIGFwcDFfbGVuZ3RoXygwKSB7fQorCitFeGlmVXRpbHNJbXBsOjp+RXhpZlV0aWxzSW1wbCgpIHsKKyAgICByZXNldCgpOworfQorCisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6aW5pdGlhbGl6ZShjb25zdCB1bnNpZ25lZCBjaGFyICphcHAxU2VnbWVudCwgc2l6ZV90IGFwcDFTZWdtZW50U2l6ZSkgeworICAgIHJlc2V0KCk7CisgICAgZXhpZl9kYXRhXyA9IGV4aWZfZGF0YV9uZXdfZnJvbV9kYXRhKGFwcDFTZWdtZW50LCBhcHAxU2VnbWVudFNpemUpOworICAgIGlmIChleGlmX2RhdGFfID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBhbGxvY2F0ZSBtZW1vcnkgZm9yIGV4aWZfZGF0YV8gZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBzZXQgdGhlIGltYWdlIG9wdGlvbnMuCisgICAgZXhpZl9kYXRhX3NldF9vcHRpb24oZXhpZl9kYXRhXywgRVhJRl9EQVRBX09QVElPTl9GT0xMT1dfU1BFQ0lGSUNBVElPTik7CisgICAgZXhpZl9kYXRhX3NldF9kYXRhX3R5cGUoZXhpZl9kYXRhXywgRVhJRl9EQVRBX1RZUEVfQ09NUFJFU1NFRCk7CisgICAgZXhpZl9kYXRhX3NldF9ieXRlX29yZGVyKGV4aWZfZGF0YV8sIEVYSUZfQllURV9PUkRFUl9JTlRFTCk7CisKKyAgICAvLyBzZXQgZXhpZiB2ZXJzaW9uIHRvIDIuMi4KKyAgICBpZiAoIXNldEV4aWZWZXJzaW9uKCIwMjIwIikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OmluaXRpYWxpemVFbXB0eSgpIHsKKyAgICByZXNldCgpOworICAgIGV4aWZfZGF0YV8gPSBleGlmX2RhdGFfbmV3KCk7CisgICAgaWYgKGV4aWZfZGF0YV8gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGFsbG9jYXRlIG1lbW9yeSBmb3IgZXhpZl9kYXRhXyBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIHNldCB0aGUgaW1hZ2Ugb3B0aW9ucy4KKyAgICBleGlmX2RhdGFfc2V0X29wdGlvbihleGlmX2RhdGFfLCBFWElGX0RBVEFfT1BUSU9OX0ZPTExPV19TUEVDSUZJQ0FUSU9OKTsKKyAgICBleGlmX2RhdGFfc2V0X2RhdGFfdHlwZShleGlmX2RhdGFfLCBFWElGX0RBVEFfVFlQRV9DT01QUkVTU0VEKTsKKyAgICBleGlmX2RhdGFfc2V0X2J5dGVfb3JkZXIoZXhpZl9kYXRhXywgRVhJRl9CWVRFX09SREVSX0lOVEVMKTsKKworICAgIC8vIHNldCBleGlmIHZlcnNpb24gdG8gMi4yLgorICAgIGlmICghc2V0RXhpZlZlcnNpb24oIjAyMjAiKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0QXBlcnR1cmUoZmxvYXQgYXBlcnR1cmUpIHsKKyAgICBmbG9hdCBhcGV4VmFsdWUgPSBjb252ZXJ0VG9BcGV4KGFwZXJ0dXJlKTsKKyAgICBTRVRfUkFUSU9OQUwoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfQVBFUlRVUkVfVkFMVUUsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RkOjpyb3VuZChhcGV4VmFsdWUgKiBrUmF0aW9uYWxQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIGtSYXRpb25hbFByZWNpc2lvbik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0Q29sb3JTcGFjZSh1aW50MTZfdCBjb2xvcl9zcGFjZSkgeworICAgIFNFVF9TSE9SVChFWElGX0lGRF9FWElGLCBFWElGX1RBR19DT0xPUl9TUEFDRSwgY29sb3Jfc3BhY2UpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldERhdGVUaW1lKGNvbnN0IHN0cnVjdCB0bSYgdCkgeworICAgIC8vIFRoZSBsZW5ndGggaXMgMjAgYnl0ZXMgaW5jbHVkaW5nIE5VTEwgZm9yIHRlcm1pbmF0aW9uIGluIEV4aWYgc3RhbmRhcmQuCisgICAgY2hhciBzdHJbMjBdOworICAgIGludCByZXN1bHQgPSBzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiJTA0aTolMDJpOiUwMmkgJTAyaTolMDJpOiUwMmkiLAorICAgICAgICAgICAgdC50bV95ZWFyICsgMTkwMCwgdC50bV9tb24gKyAxLCB0LnRtX21kYXksIHQudG1faG91ciwgdC50bV9taW4sIHQudG1fc2VjKTsKKyAgICBpZiAocmVzdWx0ICE9IHNpemVvZihzdHIpIC0gMSkgeworICAgICAgICBBTE9HVygiJXM6IElucHV0IHRpbWUgaXMgaW52YWxpZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgYnVmZmVyKHN0cik7CisgICAgU0VUX1NUUklORyhFWElGX0lGRF8wLCBFWElGX1RBR19EQVRFX1RJTUUsIEVYSUZfRk9STUFUX0FTQ0lJLCBidWZmZXIpOworICAgIFNFVF9TVFJJTkcoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfREFURV9USU1FX09SSUdJTkFMLCBFWElGX0ZPUk1BVF9BU0NJSSwgYnVmZmVyKTsKKyAgICBTRVRfU1RSSU5HKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0RBVEVfVElNRV9ESUdJVElaRUQsIEVYSUZfRk9STUFUX0FTQ0lJLCBidWZmZXIpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldERpZ2l0YWxab29tUmF0aW8oCisgICAgICAgIHVpbnQzMl90IGNyb3Bfd2lkdGgsIHVpbnQzMl90IGNyb3BfaGVpZ2h0LAorICAgICAgICB1aW50MzJfdCBzZW5zb3Jfd2lkdGgsIHVpbnQzMl90IHNlbnNvcl9oZWlnaHQpIHsKKyAgICBmbG9hdCB6b29tUmF0aW9YID0gKGNyb3Bfd2lkdGggPT0gMCkgPyAxLjAgOiAxLjAgKiBzZW5zb3Jfd2lkdGggLyBjcm9wX3dpZHRoOworICAgIGZsb2F0IHpvb21SYXRpb1kgPSAoY3JvcF9oZWlnaHQgPT0gMCkgPyAxLjAgOiAxLjAgKiBzZW5zb3JfaGVpZ2h0IC8gY3JvcF9oZWlnaHQ7CisgICAgZmxvYXQgem9vbVJhdGlvID0gc3RkOjptYXgoem9vbVJhdGlvWCwgem9vbVJhdGlvWSk7CisgICAgY29uc3Qgc3RhdGljIGZsb2F0IG5vWm9vbVRocmVzaG9sZCA9IDEuMDJmOworCisgICAgaWYgKHpvb21SYXRpbyA8PSBub1pvb21UaHJlc2hvbGQpIHsKKyAgICAgICAgU0VUX1JBVElPTkFMKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0RJR0lUQUxfWk9PTV9SQVRJTywgMCwgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU0VUX1JBVElPTkFMKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0RJR0lUQUxfWk9PTV9SQVRJTywKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RkOjpyb3VuZCh6b29tUmF0aW8gKiBrUmF0aW9uYWxQcmVjaXNpb24pKSwKKyAgICAgICAgICAgICAgICBrUmF0aW9uYWxQcmVjaXNpb24pOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRFeHBvc3VyZU1vZGUodWludDhfdCBleHBvc3VyZV9tb2RlKSB7CisgICAgdWludDE2X3QgZXhwb3N1cmVNb2RlID0gKGV4cG9zdXJlX21vZGUgPT0gQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT0ZGKSA/IDEgOiAwOworICAgIFNFVF9TSE9SVChFWElGX0lGRF9FWElGLCBFWElGX1RBR19FWFBPU1VSRV9NT0RFLCBleHBvc3VyZU1vZGUpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEV4cG9zdXJlVGltZShmbG9hdCBleHBvc3VyZV90aW1lKSB7CisgICAgU0VUX1JBVElPTkFMKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0VYUE9TVVJFX1RJTUUsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RkOjpyb3VuZChleHBvc3VyZV90aW1lICoga1JhdGlvbmFsUHJlY2lzaW9uKSksCisgICAgICAgICAgICBrUmF0aW9uYWxQcmVjaXNpb24pOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEZsYXNoKHVpbnQ4X3QgZmxhc2hfYXZhaWxhYmxlLCB1aW50OF90IGZsYXNoX3N0YXRlLCB1aW50OF90IGFlX21vZGUpIHsKKyAgICAvLyBFWElGX1RBR19GTEFTSCBiaXRzIGxheW91dCBwZXIgRVhJRiBzdGFuZGFyZDoKKyAgICAvLyBCaXQgMDogICAgMCAtIGRpZCBub3QgZmlyZQorICAgIC8vICAgICAgICAgICAxIC0gZmlyZWQKKyAgICAvLyBCaXQgMS0yOiAgc3RhdHVzIG9mIHJldHVybiBsaWdodAorICAgIC8vIEJpdCAzLTQ6ICAwIC0gdW5rbm93bgorICAgIC8vICAgICAgICAgICAxIC0gY29tcHVsc29yeSBmbGFzaCBmaXJpbmcKKyAgICAvLyAgICAgICAgICAgMiAtIGNvbXB1bHNvcnkgZmxhc2ggc3VwcHJlc3Npb24KKyAgICAvLyAgICAgICAgICAgMyAtIGF1dG8gbW9kZQorICAgIC8vIEJpdCA1OiAgICAwIC0gZmxhc2ggZnVuY3Rpb24gcHJlc2VudAorICAgIC8vICAgICAgICAgICAxIC0gbm8gZmxhc2ggZnVuY3Rpb24KKyAgICAvLyBCaXQgNjogICAgMCAtIG5vIHJlZC1leWUgcmVkdWN0aW9uIG1vZGUgb3IgdW5rbm93bgorICAgIC8vICAgICAgICAgICAxIC0gcmVkLWV5ZSByZWR1Y3Rpb24gc3VwcG9ydGVkCisgICAgdWludDE2X3QgZmxhc2ggPSAweDIwOworCisgICAgaWYgKGZsYXNoX2F2YWlsYWJsZSA9PSBBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFX1RSVUUpIHsKKyAgICAgICAgZmxhc2ggPSAweDAwOworCisgICAgICAgIGlmIChmbGFzaF9zdGF0ZSA9PSBBTkRST0lEX0ZMQVNIX1NUQVRFX0ZJUkVEKSB7CisgICAgICAgICAgICBmbGFzaCB8PSAweDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFlX21vZGUgPT0gQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT05fQVVUT19GTEFTSF9SRURFWUUpIHsKKyAgICAgICAgICAgIGZsYXNoIHw9IDB4NDA7CisgICAgICAgIH0KKworICAgICAgICB1aW50MTZfdCBmbGFzaE1vZGUgPSAwOworICAgICAgICBzd2l0Y2ggKGFlX21vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT05fQVVUT19GTEFTSDoKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT05fQVVUT19GTEFTSF9SRURFWUU6CisgICAgICAgICAgICAgICBmbGFzaE1vZGUgPSAzOyAvLyBBVVRPCisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT05fQUxXQVlTX0ZMQVNIOgorICAgICAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUVfTU9ERV9PTl9FWFRFUk5BTF9GTEFTSDoKKyAgICAgICAgICAgICAgIGZsYXNoTW9kZSA9IDE7IC8vIE9OCisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT0ZGOgorICAgICAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUVfTU9ERV9PTjoKKyAgICAgICAgICAgICAgIGZsYXNoTW9kZSA9IDI7IC8vIE9GRgorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgZmxhc2hNb2RlID0gMDsgLy8gVU5LTk9XTgorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZmxhc2ggfD0gKGZsYXNoTW9kZSA8PCAzKTsKKyAgICB9CisgICAgU0VUX1NIT1JUKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0ZMQVNILCBmbGFzaCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0Rk51bWJlcihmbG9hdCBmX251bWJlcikgeworICAgIFNFVF9SQVRJT05BTChFWElGX0lGRF9FWElGLCBFWElGX1RBR19GTlVNQkVSLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ZDo6cm91bmQoZl9udW1iZXIgKiBrUmF0aW9uYWxQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIGtSYXRpb25hbFByZWNpc2lvbik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0Rm9jYWxMZW5ndGgoZmxvYXQgZm9jYWxfbGVuZ3RoKSB7CisgICAgdWludDMyX3QgbnVtZXJhdG9yID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ZDo6cm91bmQoZm9jYWxfbGVuZ3RoICoga1JhdGlvbmFsUHJlY2lzaW9uKSk7CisgICAgU0VUX1JBVElPTkFMKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0ZPQ0FMX0xFTkdUSCwgbnVtZXJhdG9yLCBrUmF0aW9uYWxQcmVjaXNpb24pOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEZvY2FsTGVuZ3RoSW4zNW1tRmlsbSgKKyAgICAgICAgZmxvYXQgZm9jYWxfbGVuZ3RoLCBmbG9hdCBzZW5zb3Jfc2l6ZV94LCBmbG9hdCBzZW5zb3Jfc2l6ZV95KSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGZpbG1EaWFnb25hbCA9IDQzLjI3OyAvLyBkaWFnb25hbCBvZiAzNW1tIGZpbG0KKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbWluU2Vuc29yRGlhZ29uYWwgPSAwLjAxOworICAgIGZsb2F0IHNlbnNvckRpYWdvbmFsID0gc3RkOjpzcXJ0KAorICAgICAgICAgICAgc2Vuc29yX3NpemVfeCAqIHNlbnNvcl9zaXplX3ggKyBzZW5zb3Jfc2l6ZV95ICogc2Vuc29yX3NpemVfeSk7CisgICAgc2Vuc29yRGlhZ29uYWwgPSBzdGQ6Om1heChzZW5zb3JEaWFnb25hbCwgbWluU2Vuc29yRGlhZ29uYWwpOworICAgIGZsb2F0IGZvY2FsTGVuZ3RoMzVtbUZpbG0gPSBzdGQ6OnJvdW5kKGZvY2FsX2xlbmd0aCAqIGZpbG1EaWFnb25hbCAvIHNlbnNvckRpYWdvbmFsKTsKKyAgICBmb2NhbExlbmd0aDM1bW1GaWxtID0gc3RkOjptaW4oMS4wZiAqIDY1NTM1LCBmb2NhbExlbmd0aDM1bW1GaWxtKTsKKworICAgIFNFVF9TSE9SVChFWElGX0lGRF9FWElGLCBFWElGX1RBR19GT0NBTF9MRU5HVEhfSU5fMzVNTV9GSUxNLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGZvY2FsTGVuZ3RoMzVtbUZpbG0pKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRHcHNBbHRpdHVkZShkb3VibGUgYWx0aXR1ZGUpIHsKKyAgICBFeGlmVGFnIHJlZlRhZyA9IHN0YXRpY19jYXN0PEV4aWZUYWc+KEVYSUZfVEFHX0dQU19BTFRJVFVERV9SRUYpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IHJlZkVudHJ5ID0KKyAgICAgICAgICAgIGFkZFZhcmlhYmxlTGVuZ3RoRW50cnkoRVhJRl9JRkRfR1BTLCByZWZUYWcsIEVYSUZfRk9STUFUX0JZVEUsIDEsIDEpOworICAgIGlmICghcmVmRW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgR1BTQWx0aXR1ZGVSZWYgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChhbHRpdHVkZSA+PSAwKSB7CisgICAgICAgICpyZWZFbnRyeS0+ZGF0YSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnJlZkVudHJ5LT5kYXRhID0gMTsKKyAgICAgICAgYWx0aXR1ZGUgKj0gLTE7CisgICAgfQorCisgICAgRXhpZlRhZyB0YWcgPSBzdGF0aWNfY2FzdDxFeGlmVGFnPihFWElGX1RBR19HUFNfQUxUSVRVREUpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGVudHJ5ID0gYWRkVmFyaWFibGVMZW5ndGhFbnRyeSgKKyAgICAgICAgICAgIEVYSUZfSUZEX0dQUywgdGFnLCBFWElGX0ZPUk1BVF9SQVRJT05BTCwgMSwgc2l6ZW9mKEV4aWZSYXRpb25hbCkpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgZXhpZl9jb250ZW50X3JlbW92ZV9lbnRyeShleGlmX2RhdGFfLT5pZmRbRVhJRl9JRkRfR1BTXSwgcmVmRW50cnkuZ2V0KCkpOworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyBHUFNBbHRpdHVkZSBleGlmIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZXhpZl9zZXRfcmF0aW9uYWwoZW50cnktPmRhdGEsIEVYSUZfQllURV9PUkRFUl9JTlRFTCwKKyAgICAgICAgICAgIHtzdGF0aWNfY2FzdDxFeGlmTG9uZz4oYWx0aXR1ZGUgKiAxMDAwKSwgMTAwMH0pOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0R3BzTGF0aXR1ZGUoZG91YmxlIGxhdGl0dWRlKSB7CisgICAgY29uc3QgRXhpZlRhZyByZWZUYWcgPSBzdGF0aWNfY2FzdDxFeGlmVGFnPihFWElGX1RBR19HUFNfTEFUSVRVREVfUkVGKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiByZWZFbnRyeSA9CisgICAgICAgICAgICBhZGRWYXJpYWJsZUxlbmd0aEVudHJ5KEVYSUZfSUZEX0dQUywgcmVmVGFnLCBFWElGX0ZPUk1BVF9BU0NJSSwgMiwgMik7CisgICAgaWYgKCFyZWZFbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyBHUFNMYXRpdHVkZVJlZiBleGlmIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGxhdGl0dWRlID49IDApIHsKKyAgICAgICAgbWVtY3B5KHJlZkVudHJ5LT5kYXRhLCAiTiIsIHNpemVvZigiTiIpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZW1jcHkocmVmRW50cnktPmRhdGEsICJTIiwgc2l6ZW9mKCJTIikpOworICAgICAgICBsYXRpdHVkZSAqPSAtMTsKKyAgICB9CisKKyAgICBjb25zdCBFeGlmVGFnIHRhZyA9IHN0YXRpY19jYXN0PEV4aWZUYWc+KEVYSUZfVEFHX0dQU19MQVRJVFVERSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZW50cnkgPSBhZGRWYXJpYWJsZUxlbmd0aEVudHJ5KAorICAgICAgICAgICAgRVhJRl9JRkRfR1BTLCB0YWcsIEVYSUZfRk9STUFUX1JBVElPTkFMLCAzLCAzICogc2l6ZW9mKEV4aWZSYXRpb25hbCkpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgZXhpZl9jb250ZW50X3JlbW92ZV9lbnRyeShleGlmX2RhdGFfLT5pZmRbRVhJRl9JRkRfR1BTXSwgcmVmRW50cnkuZ2V0KCkpOworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyBHUFNMYXRpdHVkZSBleGlmIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc2V0TGF0aXR1ZGVPckxvbmdpdHVkZURhdGEoZW50cnktPmRhdGEsIGxhdGl0dWRlKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEdwc0xvbmdpdHVkZShkb3VibGUgbG9uZ2l0dWRlKSB7CisgICAgRXhpZlRhZyByZWZUYWcgPSBzdGF0aWNfY2FzdDxFeGlmVGFnPihFWElGX1RBR19HUFNfTE9OR0lUVURFX1JFRik7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gcmVmRW50cnkgPQorICAgICAgICAgICAgYWRkVmFyaWFibGVMZW5ndGhFbnRyeShFWElGX0lGRF9HUFMsIHJlZlRhZywgRVhJRl9GT1JNQVRfQVNDSUksIDIsIDIpOworICAgIGlmICghcmVmRW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgR1BTTG9uZ2l0dWRlUmVmIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobG9uZ2l0dWRlID49IDApIHsKKyAgICAgICAgbWVtY3B5KHJlZkVudHJ5LT5kYXRhLCAiRSIsIHNpemVvZigiRSIpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZW1jcHkocmVmRW50cnktPmRhdGEsICJXIiwgc2l6ZW9mKCJXIikpOworICAgICAgICBsb25naXR1ZGUgKj0gLTE7CisgICAgfQorCisgICAgRXhpZlRhZyB0YWcgPSBzdGF0aWNfY2FzdDxFeGlmVGFnPihFWElGX1RBR19HUFNfTE9OR0lUVURFKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBlbnRyeSA9IGFkZFZhcmlhYmxlTGVuZ3RoRW50cnkoCisgICAgICAgICAgICBFWElGX0lGRF9HUFMsIHRhZywgRVhJRl9GT1JNQVRfUkFUSU9OQUwsIDMsIDMgKiBzaXplb2YoRXhpZlJhdGlvbmFsKSk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBleGlmX2NvbnRlbnRfcmVtb3ZlX2VudHJ5KGV4aWZfZGF0YV8tPmlmZFtFWElGX0lGRF9HUFNdLCByZWZFbnRyeS5nZXQoKSk7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nIEdQU0xvbmdpdHVkZSBleGlmIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc2V0TGF0aXR1ZGVPckxvbmdpdHVkZURhdGEoZW50cnktPmRhdGEsIGxvbmdpdHVkZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRHcHNQcm9jZXNzaW5nTWV0aG9kKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXRob2QpIHsKKyAgICBzdGQ6OnN0cmluZyBidWZmZXIgPQorICAgICAgICAgICAgc3RkOjpzdHJpbmcoZ0V4aWZBc2NpaVByZWZpeCwgc2l6ZW9mKGdFeGlmQXNjaWlQcmVmaXgpKSArIG1ldGhvZDsKKyAgICBTRVRfU1RSSU5HKEVYSUZfSUZEX0dQUywgc3RhdGljX2Nhc3Q8RXhpZlRhZz4oRVhJRl9UQUdfR1BTX1BST0NFU1NJTkdfTUVUSE9EKSwKKyAgICAgICAgICAgIEVYSUZfRk9STUFUX1VOREVGSU5FRCwgYnVmZmVyKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRHcHNUaW1lc3RhbXAoY29uc3Qgc3RydWN0IHRtJiB0KSB7CisgICAgY29uc3QgRXhpZlRhZyBkYXRlVGFnID0gc3RhdGljX2Nhc3Q8RXhpZlRhZz4oRVhJRl9UQUdfR1BTX0RBVEVfU1RBTVApOworICAgIGNvbnN0IHNpemVfdCBrR3BzRGF0ZVN0YW1wU2l6ZSA9IDExOworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGVudHJ5ID0gYWRkVmFyaWFibGVMZW5ndGhFbnRyeShFWElGX0lGRF9HUFMsCisgICAgICAgICAgICBkYXRlVGFnLCBFWElGX0ZPUk1BVF9BU0NJSSwga0dwc0RhdGVTdGFtcFNpemUsIGtHcHNEYXRlU3RhbXBTaXplKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nIEdQU0RhdGVTdGFtcCBleGlmIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaW50IHJlc3VsdCA9IHNucHJpbnRmKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGVudHJ5LT5kYXRhKSwga0dwc0RhdGVTdGFtcFNpemUsCisgICAgICAgICAgICAiJTA0aTolMDJpOiUwMmkiLCB0LnRtX3llYXIgKyAxOTAwLCB0LnRtX21vbiArIDEsIHQudG1fbWRheSk7CisgICAgaWYgKHJlc3VsdCAhPSBrR3BzRGF0ZVN0YW1wU2l6ZSAtIDEpIHsKKyAgICAgICAgQUxPR1coIiVzOiBJbnB1dCB0aW1lIGlzIGludmFsaWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgRXhpZlRhZyB0aW1lVGFnID0gc3RhdGljX2Nhc3Q8RXhpZlRhZz4oRVhJRl9UQUdfR1BTX1RJTUVfU1RBTVApOworICAgIGVudHJ5ID0gYWRkVmFyaWFibGVMZW5ndGhFbnRyeShFWElGX0lGRF9HUFMsIHRpbWVUYWcsIEVYSUZfRk9STUFUX1JBVElPTkFMLCAzLAorICAgICAgICAgICAgMyAqIHNpemVvZihFeGlmUmF0aW9uYWwpKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nIEdQU1RpbWVTdGFtcCBleGlmIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZXhpZl9zZXRfcmF0aW9uYWwoZW50cnktPmRhdGEsIEVYSUZfQllURV9PUkRFUl9JTlRFTCwKKyAgICAgICAgICAgIHtzdGF0aWNfY2FzdDxFeGlmTG9uZz4odC50bV9ob3VyKSwgMX0pOworICAgIGV4aWZfc2V0X3JhdGlvbmFsKGVudHJ5LT5kYXRhICsgc2l6ZW9mKEV4aWZSYXRpb25hbCksIEVYSUZfQllURV9PUkRFUl9JTlRFTCwKKyAgICAgICAgICAgIHtzdGF0aWNfY2FzdDxFeGlmTG9uZz4odC50bV9taW4pLCAxfSk7CisgICAgZXhpZl9zZXRfcmF0aW9uYWwoZW50cnktPmRhdGEgKyAyICogc2l6ZW9mKEV4aWZSYXRpb25hbCksIEVYSUZfQllURV9PUkRFUl9JTlRFTCwKKyAgICAgICAgICAgIHtzdGF0aWNfY2FzdDxFeGlmTG9uZz4odC50bV9zZWMpLCAxfSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRJbWFnZUhlaWdodCh1aW50MzJfdCBsZW5ndGgpIHsKKyAgICBTRVRfTE9ORyhFWElGX0lGRF8wLCBFWElGX1RBR19JTUFHRV9MRU5HVEgsIGxlbmd0aCk7CisgICAgU0VUX0xPTkcoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfUElYRUxfWV9ESU1FTlNJT04sIGxlbmd0aCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0SW1hZ2VXaWR0aCh1aW50MzJfdCB3aWR0aCkgeworICAgIFNFVF9MT05HKEVYSUZfSUZEXzAsIEVYSUZfVEFHX0lNQUdFX1dJRFRILCB3aWR0aCk7CisgICAgU0VUX0xPTkcoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfUElYRUxfWF9ESU1FTlNJT04sIHdpZHRoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRJc29TcGVlZFJhdGluZyh1aW50MTZfdCBpc29fc3BlZWRfcmF0aW5ncykgeworICAgIFNFVF9TSE9SVChFWElGX0lGRF9FWElGLCBFWElGX1RBR19JU09fU1BFRURfUkFUSU5HUywgaXNvX3NwZWVkX3JhdGluZ3MpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldE1heEFwZXJ0dXJlKGZsb2F0IGFwZXJ0dXJlKSB7CisgICAgZmxvYXQgbWF4QXBlcnR1cmUgPSBjb252ZXJ0VG9BcGV4KGFwZXJ0dXJlKTsKKyAgICBTRVRfUkFUSU9OQUwoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfTUFYX0FQRVJUVVJFX1ZBTFVFLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ZDo6cm91bmQobWF4QXBlcnR1cmUgKiBrUmF0aW9uYWxQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIGtSYXRpb25hbFByZWNpc2lvbik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0RXhwb3N1cmVCaWFzKGludDMyX3QgZXYsCisgICAgICAgIHVpbnQzMl90IGV2X3N0ZXBfbnVtZXJhdG9yLCB1aW50MzJfdCBldl9zdGVwX2Rlbm9taW5hdG9yKSB7CisgICAgU0VUX1JBVElPTkFMKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0VYUE9TVVJFX0JJQVNfVkFMVUUsCisgICAgICAgICAgICBldiAqIGV2X3N0ZXBfbnVtZXJhdG9yLCBldl9zdGVwX2Rlbm9taW5hdG9yKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRPcmllbnRhdGlvbih1aW50MTZfdCBkZWdyZWVzKSB7CisgICAgRXhpZk9yaWVudGF0aW9uIHZhbHVlID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVM7CisgICAgc3dpdGNoIChkZWdyZWVzKSB7CisgICAgICAgIGNhc2UgOTA6CisgICAgICAgICAgICB2YWx1ZSA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fOTBfREVHUkVFUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE4MDoKKyAgICAgICAgICAgIHZhbHVlID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8xODBfREVHUkVFUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgIHZhbHVlID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8yNzBfREVHUkVFUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzZXRPcmllbnRhdGlvblZhbHVlKHZhbHVlKTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRPcmllbnRhdGlvblZhbHVlKEV4aWZPcmllbnRhdGlvbiBvcmllbnRhdGlvblZhbHVlKSB7CisgICAgU0VUX1NIT1JUKEVYSUZfSUZEXzAsIEVYSUZfVEFHX09SSUVOVEFUSU9OLCBvcmllbnRhdGlvblZhbHVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRTaHV0dGVyU3BlZWQoZmxvYXQgZXhwb3N1cmVfdGltZSkgeworICAgIGZsb2F0IHNodXR0ZXJTcGVlZCA9IC1sb2cyZihleHBvc3VyZV90aW1lKTsKKyAgICBTRVRfU1JBVElPTkFMKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX1NIVVRURVJfU1BFRURfVkFMVUUsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2h1dHRlclNwZWVkICoga1JhdGlvbmFsUHJlY2lzaW9uKSwga1JhdGlvbmFsUHJlY2lzaW9uKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRTdWJqZWN0RGlzdGFuY2UoZmxvYXQgZGlvcHRlcnMpIHsKKyAgICBjb25zdCBzdGF0aWMgZmxvYXQga0luZmluaXR5RGlvcHRlcnMgPSAxLjBlLTY7CisgICAgdWludDMyX3QgbnVtZXJhdG9yLCBkZW5vbWluYXRvcjsKKyAgICB1aW50MTZfdCBkaXN0YW5jZVJhbmdlOworICAgIGlmIChkaW9wdGVycyA+IGtJbmZpbml0eURpb3B0ZXJzKSB7CisgICAgICAgIGZsb2F0IGZvY3VzRGlzdGFuY2UgPSAxLjBmIC8gZGlvcHRlcnM7CisgICAgICAgIG51bWVyYXRvciA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGQ6OnJvdW5kKGZvY3VzRGlzdGFuY2UgKiBrUmF0aW9uYWxQcmVjaXNpb24pKTsKKyAgICAgICAgZGVub21pbmF0b3IgPSBrUmF0aW9uYWxQcmVjaXNpb247CisKKyAgICAgICAgaWYgKGZvY3VzRGlzdGFuY2UgPCAxLjBmKSB7CisgICAgICAgICAgICBkaXN0YW5jZVJhbmdlID0gMTsgLy8gTWFjcm8KKyAgICAgICAgfSBlbHNlIGlmIChmb2N1c0Rpc3RhbmNlIDwgMy4wZikgeworICAgICAgICAgICAgZGlzdGFuY2VSYW5nZSA9IDI7IC8vIENsb3NlCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkaXN0YW5jZVJhbmdlID0gMzsgLy8gRGlzdGFudAorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbnVtZXJhdG9yID0gMHhGRkZGRkZGRjsKKyAgICAgICAgZGVub21pbmF0b3IgPSAxOworICAgICAgICBkaXN0YW5jZVJhbmdlID0gMzsgLy8gRGlzdGFudAorICAgIH0KKyAgICBTRVRfUkFUSU9OQUwoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfU1VCSkVDVF9ESVNUQU5DRSwgbnVtZXJhdG9yLCBkZW5vbWluYXRvcik7CisgICAgU0VUX1NIT1JUKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX1NVQkpFQ1RfRElTVEFOQ0VfUkFOR0UsIGRpc3RhbmNlUmFuZ2UpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldFN1YnNlY1RpbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHN1YnNlY190aW1lKSB7CisgICAgU0VUX1NUUklORyhFWElGX0lGRF9FWElGLCBFWElGX1RBR19TVUJfU0VDX1RJTUUsIEVYSUZfRk9STUFUX0FTQ0lJLCBzdWJzZWNfdGltZSk7CisgICAgU0VUX1NUUklORyhFWElGX0lGRF9FWElGLCBFWElGX1RBR19TVUJfU0VDX1RJTUVfT1JJR0lOQUwsIEVYSUZfRk9STUFUX0FTQ0lJLCBzdWJzZWNfdGltZSk7CisgICAgU0VUX1NUUklORyhFWElGX0lGRF9FWElGLCBFWElGX1RBR19TVUJfU0VDX1RJTUVfRElHSVRJWkVELCBFWElGX0ZPUk1BVF9BU0NJSSwgc3Vic2VjX3RpbWUpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldFdoaXRlQmFsYW5jZSh1aW50OF90IHdoaXRlX2JhbGFuY2UpIHsKKyAgICB1aW50MTZfdCB3aGl0ZUJhbGFuY2UgPSAod2hpdGVfYmFsYW5jZSA9PSBBTkRST0lEX0NPTlRST0xfQVdCX01PREVfQVVUTykgPyAwIDogMTsKKyAgICBTRVRfU0hPUlQoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfV0hJVEVfQkFMQU5DRSwgd2hpdGVCYWxhbmNlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpnZW5lcmF0ZUFwcDEoKSB7CisgICAgZGVzdHJveUFwcDEoKTsKKyAgICAvLyBTYXZlIHRoZSByZXN1bHQgaW50byB8YXBwMV9idWZmZXJffC4KKyAgICBleGlmX2RhdGFfc2F2ZV9kYXRhKGV4aWZfZGF0YV8sICZhcHAxX2J1ZmZlcl8sICZhcHAxX2xlbmd0aF8pOworICAgIGlmICghYXBwMV9sZW5ndGhfKSB7CisgICAgICAgIEFMT0dFKCIlczogQWxsb2NhdGUgbWVtb3J5IGZvciBhcHAxX2J1ZmZlcl8gZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvKgorICAgICAqIFRoZSBKUEVHIHNlZ21lbnQgc2l6ZSBpcyAxNiBiaXRzIGluIHNwZWMuIFRoZSBzaXplIG9mIEFQUDEgc2VnbWVudCBzaG91bGQKKyAgICAgKiBiZSBzbWFsbGVyIHRoYW4gNjU1MzMgYmVjYXVzZSB0aGVyZSBhcmUgdHdvIGJ5dGVzIGZvciBzZWdtZW50IHNpemUgZmllbGQuCisgICAgICovCisgICAgaWYgKGFwcDFfbGVuZ3RoXyA+IDY1NTMzKSB7CisgICAgICAgIGRlc3Ryb3lBcHAxKCk7CisgICAgICAgIEFMT0dFKCIlczogVGhlIHNpemUgb2YgQVBQMSBzZWdtZW50IGlzIHRvbyBsYXJnZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IHVpbnQ4X3QqIEV4aWZVdGlsc0ltcGw6OmdldEFwcDFCdWZmZXIoKSB7CisgICAgcmV0dXJuIGFwcDFfYnVmZmVyXzsKK30KKwordW5zaWduZWQgaW50IEV4aWZVdGlsc0ltcGw6OmdldEFwcDFMZW5ndGgoKSB7CisgICAgcmV0dXJuIGFwcDFfbGVuZ3RoXzsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRFeGlmVmVyc2lvbihjb25zdCBzdGQ6OnN0cmluZyYgZXhpZl92ZXJzaW9uKSB7CisgICAgU0VUX1NUUklORyhFWElGX0lGRF9FWElGLCBFWElGX1RBR19FWElGX1ZFUlNJT04sIEVYSUZfRk9STUFUX1VOREVGSU5FRCwgZXhpZl92ZXJzaW9uKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBFeGlmVXRpbHNJbXBsOjpyZXNldCgpIHsKKyAgICBkZXN0cm95QXBwMSgpOworICAgIGlmIChleGlmX2RhdGFfKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFNpbmNlIHdlIGRlY2lkZWQgdG8gaWdub3JlIHRoZSBvcmlnaW5hbCBBUFAxLCB3ZSBhcmUgc3VyZSB0aGF0IHRoZXJlIGlzCisgICAgICAgICAqIG5vIHRodW1ibmFpbCBhbGxvY2F0ZWQgYnkgbGliZXhpZi4gfGV4aWZfZGF0YV8tPmRhdGF8IGlzIGFjdHVhbGx5CisgICAgICAgICAqIGFsbG9jYXRlZCBieSBKcGVnQ29tcHJlc3Nvci4gc2V0cyB8ZXhpZl9kYXRhXy0+ZGF0YXwgdG8gbnVsbHB0ciB0bworICAgICAgICAgKiBwcmV2ZW50IGV4aWZfZGF0YV91bnJlZigpIGRlc3Ryb3kgaXQgaW5jb3JyZWN0bHkuCisgICAgICAgICAqLworICAgICAgICBleGlmX2RhdGFfLT5kYXRhID0gbnVsbHB0cjsKKyAgICAgICAgZXhpZl9kYXRhXy0+c2l6ZSA9IDA7CisgICAgICAgIGV4aWZfZGF0YV91bnJlZihleGlmX2RhdGFfKTsKKyAgICAgICAgZXhpZl9kYXRhXyA9IG51bGxwdHI7CisgICAgfQorfQorCitzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBFeGlmVXRpbHNJbXBsOjphZGRWYXJpYWJsZUxlbmd0aEVudHJ5KEV4aWZJZmQgaWZkLAorICAgICAgICBFeGlmVGFnIHRhZywgRXhpZkZvcm1hdCBmb3JtYXQsIHVpbnQ2NF90IGNvbXBvbmVudHMsIHVuc2lnbmVkIGludCBzaXplKSB7CisgICAgLy8gUmVtb3ZlIG9sZCBlbnRyeSBpZiBleGlzdHMuCisgICAgZXhpZl9jb250ZW50X3JlbW92ZV9lbnRyeShleGlmX2RhdGFfLT5pZmRbaWZkXSwKKyAgICAgICAgICAgIGV4aWZfY29udGVudF9nZXRfZW50cnkoZXhpZl9kYXRhXy0+aWZkW2lmZF0sIHRhZykpOworICAgIEV4aWZNZW0qIG1lbSA9IGV4aWZfbWVtX25ld19kZWZhdWx0KCk7CisgICAgaWYgKCFtZW0pIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGVudHJ5KGV4aWZfZW50cnlfbmV3X21lbShtZW0pKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWxsb2NhdGUgbWVtb3J5IGZvciBleGlmIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGV4aWZfbWVtX3VucmVmKG1lbSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICB2b2lkKiB0bXBCdWZmZXIgPSBleGlmX21lbV9hbGxvYyhtZW0sIHNpemUpOworICAgIGlmICghdG1wQnVmZmVyKSB7CisgICAgICAgIEFMT0dFKCIlczogQWxsb2NhdGUgbWVtb3J5IGZvciBleGlmIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGV4aWZfbWVtX3VucmVmKG1lbSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGVudHJ5LT5kYXRhID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KHRtcEJ1ZmZlcik7CisgICAgZW50cnktPnRhZyA9IHRhZzsKKyAgICBlbnRyeS0+Zm9ybWF0ID0gZm9ybWF0OworICAgIGVudHJ5LT5jb21wb25lbnRzID0gY29tcG9uZW50czsKKyAgICBlbnRyeS0+c2l6ZSA9IHNpemU7CisKKyAgICBleGlmX2NvbnRlbnRfYWRkX2VudHJ5KGV4aWZfZGF0YV8tPmlmZFtpZmRdLCBlbnRyeS5nZXQoKSk7CisgICAgZXhpZl9tZW1fdW5yZWYobWVtKTsKKworICAgIHJldHVybiBlbnRyeTsKK30KKworc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gRXhpZlV0aWxzSW1wbDo6YWRkRW50cnkoRXhpZklmZCBpZmQsIEV4aWZUYWcgdGFnKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZW50cnkoZXhpZl9jb250ZW50X2dldF9lbnRyeShleGlmX2RhdGFfLT5pZmRbaWZkXSwgdGFnKSk7CisgICAgaWYgKGVudHJ5KSB7CisgICAgICAgIC8vIGV4aWZfY29udGVudF9nZXRfZW50cnkoKSB3b24ndCByZWYgdGhlIGVudHJ5LCBzbyB3ZSByZWYgaGVyZS4KKyAgICAgICAgZXhpZl9lbnRyeV9yZWYoZW50cnkuZ2V0KCkpOworICAgICAgICByZXR1cm4gZW50cnk7CisgICAgfQorICAgIGVudHJ5LnJlc2V0KGV4aWZfZW50cnlfbmV3KCkpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGVudHJ5LT50YWcgPSB0YWc7CisgICAgZXhpZl9jb250ZW50X2FkZF9lbnRyeShleGlmX2RhdGFfLT5pZmRbaWZkXSwgZW50cnkuZ2V0KCkpOworICAgIGV4aWZfZW50cnlfaW5pdGlhbGl6ZShlbnRyeS5nZXQoKSwgdGFnKTsKKyAgICByZXR1cm4gZW50cnk7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0U2hvcnQoRXhpZklmZCBpZmQsIEV4aWZUYWcgdGFnLCB1aW50MTZfdCB2YWx1ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGVudHJ5ID0gYWRkRW50cnkoaWZkLCB0YWcpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgJyVzJyBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18sIG1zZy5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBleGlmX3NldF9zaG9ydChlbnRyeS0+ZGF0YSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLCB2YWx1ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0TG9uZyhFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcsIHVpbnQzMl90IHZhbHVlLCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZW50cnkgPSBhZGRFbnRyeShpZmQsIHRhZyk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyAnJXMnIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXywgbXNnLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGV4aWZfc2V0X2xvbmcoZW50cnktPmRhdGEsIEVYSUZfQllURV9PUkRFUl9JTlRFTCwgdmFsdWUpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldFJhdGlvbmFsKEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZywgdWludDMyX3QgbnVtZXJhdG9yLAorICAgICAgICB1aW50MzJfdCBkZW5vbWluYXRvciwgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGVudHJ5ID0gYWRkRW50cnkoaWZkLCB0YWcpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgJyVzJyBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18sIG1zZy5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBleGlmX3NldF9yYXRpb25hbChlbnRyeS0+ZGF0YSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLCB7bnVtZXJhdG9yLCBkZW5vbWluYXRvcn0pOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldFNSYXRpb25hbChFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcsIGludDMyX3QgbnVtZXJhdG9yLAorICAgICAgICBpbnQzMl90IGRlbm9taW5hdG9yLCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZW50cnkgPSBhZGRFbnRyeShpZmQsIHRhZyk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyAnJXMnIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXywgbXNnLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGV4aWZfc2V0X3NyYXRpb25hbChlbnRyeS0+ZGF0YSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLCB7bnVtZXJhdG9yLCBkZW5vbWluYXRvcn0pOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldFN0cmluZyhFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcsIEV4aWZGb3JtYXQgZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYnVmZmVyLCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSB7CisgICAgc2l6ZV90IGVudHJ5X3NpemUgPSBidWZmZXIubGVuZ3RoKCk7CisgICAgLy8gU2luY2UgdGhlIGV4aWYgZm9ybWF0IGlzIHVuZGVmaW5lZCwgTlVMTCB0ZXJtaW5hdGlvbiBpcyBub3QgbmVjZXNzYXJ5LgorICAgIGlmIChmb3JtYXQgPT0gRVhJRl9GT1JNQVRfQVNDSUkpIHsKKyAgICAgICAgZW50cnlfc2l6ZSsrOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBlbnRyeSA9CisgICAgICAgICAgICBhZGRWYXJpYWJsZUxlbmd0aEVudHJ5KGlmZCwgdGFnLCBmb3JtYXQsIGVudHJ5X3NpemUsIGVudHJ5X3NpemUpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgJyVzJyBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18sIG1zZy5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1jcHkoZW50cnktPmRhdGEsIGJ1ZmZlci5jX3N0cigpLCBlbnRyeV9zaXplKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBFeGlmVXRpbHNJbXBsOjpkZXN0cm95QXBwMSgpIHsKKyAgICAvKgorICAgICAqIFNpbmNlIHRoZXJlIGlzIG5vIEFQSSB0byBhY2Nlc3MgRXhpZk1lbSBpbiBFeGlmRGF0YS0+cHJpdiwgd2UgdXNlIGZyZWUKKyAgICAgKiBoZXJlLCB3aGljaCBpcyB0aGUgZGVmYXVsdCBmcmVlIGZ1bmN0aW9uIGluIGxpYmV4aWYuIFNlZQorICAgICAqIGV4aWZfZGF0YV9zYXZlX2RhdGEoKSBmb3IgZGV0YWlsLgorICAgICAqLworICAgIGZyZWUoYXBwMV9idWZmZXJfKTsKKyAgICBhcHAxX2J1ZmZlcl8gPSBudWxscHRyOworICAgIGFwcDFfbGVuZ3RoXyA9IDA7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0RnJvbU1ldGFkYXRhKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8sCisgICAgICAgIGNvbnN0IHNpemVfdCBpbWFnZVdpZHRoLCBjb25zdCBzaXplX3QgaW1hZ2VIZWlnaHQpIHsKKyAgICBpZiAoIXNldEltYWdlV2lkdGgoaW1hZ2VXaWR0aCkgfHwKKyAgICAgICAgICAgICFzZXRJbWFnZUhlaWdodChpbWFnZUhlaWdodCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGltYWdlIHJlc29sdXRpb24gZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHA7CisgICAgc3RydWN0IHRtIHRpbWVfaW5mbzsKKyAgICBib29sIHRpbWVfYXZhaWxhYmxlID0gY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRwKSAhPSAtMTsKKyAgICBsb2NhbHRpbWVfcigmdHAudHZfc2VjLCAmdGltZV9pbmZvKTsKKyAgICBpZiAoIXNldERhdGVUaW1lKHRpbWVfaW5mbykpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGRhdGEgdGltZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZsb2F0IGZvY2FsX2xlbmd0aDsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfTEVOU19GT0NBTF9MRU5HVEgpOworICAgIGlmIChlbnRyeS5jb3VudCkgeworICAgICAgICBmb2NhbF9sZW5ndGggPSBlbnRyeS5kYXRhLmZbMF07CisKKyAgICAgICAgaWYgKCFzZXRGb2NhbExlbmd0aChmb2NhbF9sZW5ndGgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZm9jYWwgbGVuZ3RoIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IHNlbnNvclNpemVFbnRyeSA9CisgICAgICAgICAgICAgICAgc3RhdGljSW5mby5maW5kKEFORFJPSURfU0VOU09SX0lORk9fUEhZU0lDQUxfU0laRSk7CisgICAgICAgIGlmIChzZW5zb3JTaXplRW50cnkuY291bnQgPT0gMikgeworICAgICAgICAgICAgaWYgKCFzZXRGb2NhbExlbmd0aEluMzVtbUZpbG0oCisgICAgICAgICAgICAgICAgICAgIGZvY2FsX2xlbmd0aCwgc2Vuc29yU2l6ZUVudHJ5LmRhdGEuZlswXSwgc2Vuc29yU2l6ZUVudHJ5LmRhdGEuZlsxXSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZm9jYWwgbGVuZ3RoIGluIDM1bW0gZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIiVzOiBDYW5ub3QgZmluZCBmb2NhbCBsZW5ndGggaW4gbWV0YWRhdGEuIiwgX19GVU5DVElPTl9fKTsKKyAgICB9CisKKyAgICBpZiAobWV0YWRhdGEuZXhpc3RzKEFORFJPSURfU0NBTEVSX0NST1BfUkVHSU9OKSAmJgorICAgICAgICAgICAgc3RhdGljSW5mby5leGlzdHMoQU5EUk9JRF9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRSkpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfU0NBTEVSX0NST1BfUkVHSU9OKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGFjdGl2ZUFycmF5RW50cnkgPQorICAgICAgICAgICAgICAgIHN0YXRpY0luZm8uZmluZChBTkRST0lEX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFKTsKKworICAgICAgICBpZiAoIXNldERpZ2l0YWxab29tUmF0aW8oZW50cnkuZGF0YS5pMzJbMl0sIGVudHJ5LmRhdGEuaTMyWzNdLAorICAgICAgICAgICAgICAgIGFjdGl2ZUFycmF5RW50cnkuZGF0YS5pMzJbMl0sIGFjdGl2ZUFycmF5RW50cnkuZGF0YS5pMzJbM10pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZGlnaXRhbCB6b29tIHJhdGlvIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX0pQRUdfR1BTX0NPT1JESU5BVEVTKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9KUEVHX0dQU19DT09SRElOQVRFUyk7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA8IDMpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogR3BzIGNvb3JkaW5hdGVzIGluIG1ldGFkYXRhIGlzIG5vdCBjb21wbGV0ZS4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghc2V0R3BzTGF0aXR1ZGUoZW50cnkuZGF0YS5kWzBdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGdwcyBsYXRpdHVkZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNldEdwc0xvbmdpdHVkZShlbnRyeS5kYXRhLmRbMV0pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZ3BzIGxvbmdpdHVkZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNldEdwc0FsdGl0dWRlKGVudHJ5LmRhdGEuZFsyXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBncHMgYWx0aXR1ZGUgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0YWRhdGEuZXhpc3RzKEFORFJPSURfSlBFR19HUFNfUFJPQ0VTU0lOR19NRVRIT0QpKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0pQRUdfR1BTX1BST0NFU1NJTkdfTUVUSE9EKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbWV0aG9kX3N0cihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihlbnRyeS5kYXRhLnU4KSk7CisgICAgICAgIGlmICghc2V0R3BzUHJvY2Vzc2luZ01ldGhvZChtZXRob2Rfc3RyKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGdwcyBwcm9jZXNzaW5nIG1ldGhvZCBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aW1lX2F2YWlsYWJsZSAmJiBtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9KUEVHX0dQU19USU1FU1RBTVApKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0pQRUdfR1BTX1RJTUVTVEFNUCk7CisgICAgICAgIHRpbWVfdCB0aW1lc3RhbXAgPSBzdGF0aWNfY2FzdDx0aW1lX3Q+KGVudHJ5LmRhdGEuaTY0WzBdKTsKKyAgICAgICAgaWYgKGdtdGltZV9yKCZ0aW1lc3RhbXAsICZ0aW1lX2luZm8pKSB7CisgICAgICAgICAgICBpZiAoIXNldEdwc1RpbWVzdGFtcCh0aW1lX2luZm8pKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGdwcyB0aW1lc3RhbXAgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBUaW1lIHRyYW5mb3JtYXRpb24gZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RhdGljSW5mby5leGlzdHMoQU5EUk9JRF9DT05UUk9MX0FFX0NPTVBFTlNBVElPTl9TVEVQKSAmJgorICAgICAgICAgICAgbWV0YWRhdGEuZXhpc3RzKEFORFJPSURfQ09OVFJPTF9BRV9FWFBPU1VSRV9DT01QRU5TQVRJT04pKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0NPTlRST0xfQUVfRVhQT1NVUkVfQ09NUEVOU0FUSU9OKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IHN0ZXBFbnRyeSA9CisgICAgICAgICAgICAgICAgc3RhdGljSW5mby5maW5kKEFORFJPSURfQ09OVFJPTF9BRV9DT01QRU5TQVRJT05fU1RFUCk7CisgICAgICAgIGlmICghc2V0RXhwb3N1cmVCaWFzKGVudHJ5LmRhdGEuaTMyWzBdLCBzdGVwRW50cnkuZGF0YS5yWzBdLm51bWVyYXRvciwKKyAgICAgICAgICAgICAgICBzdGVwRW50cnkuZGF0YS5yWzBdLmRlbm9taW5hdG9yKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGV4cG9zdXJlIGJpYXMgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0YWRhdGEuZXhpc3RzKEFORFJPSURfSlBFR19PUklFTlRBVElPTikpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfSlBFR19PUklFTlRBVElPTik7CisgICAgICAgIGlmICghc2V0T3JpZW50YXRpb24oZW50cnkuZGF0YS5pMzJbMF0pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgb3JpZW50YXRpb24gZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0YWRhdGEuZXhpc3RzKEFORFJPSURfU0VOU09SX0VYUE9TVVJFX1RJTUUpKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9FWFBPU1VSRV9USU1FKTsKKyAgICAgICAgZmxvYXQgZXhwb3N1cmVfdGltZSA9IDEuMGYgKiBlbnRyeS5kYXRhLmk2NFswXSAvIDFlOTsKKyAgICAgICAgaWYgKCFzZXRFeHBvc3VyZVRpbWUoZXhwb3N1cmVfdGltZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBleHBvc3VyZSB0aW1lIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzZXRTaHV0dGVyU3BlZWQoZXhwb3N1cmVfdGltZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBzaHV0dGVyIHNwZWVkIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX0xFTlNfRk9DVVNfRElTVEFOQ0UpKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0xFTlNfRk9DVVNfRElTVEFOQ0UpOworICAgICAgICBpZiAoIXNldFN1YmplY3REaXN0YW5jZShlbnRyeS5kYXRhLmZbMF0pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgc3ViamVjdCBkaXN0YW5jZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9TRU5TT1JfU0VOU0lUSVZJVFkpKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9TRU5TSVRJVklUWSk7CisgICAgICAgIGludDMyX3QgaXNvID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBwb3N0UmF3U2Vuc0VudHJ5ID0KKyAgICAgICAgICAgICAgICBtZXRhZGF0YS5maW5kKEFORFJPSURfQ09OVFJPTF9QT1NUX1JBV19TRU5TSVRJVklUWV9CT09TVCk7CisgICAgICAgIGlmIChwb3N0UmF3U2Vuc0VudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAgICAgaXNvID0gaXNvICogcG9zdFJhd1NlbnNFbnRyeS5kYXRhLmkzMlswXSAvIDEwMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc2V0SXNvU3BlZWRSYXRpbmcoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGlzbykpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgaXNvIHJhdGluZyBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9MRU5TX0FQRVJUVVJFKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9MRU5TX0FQRVJUVVJFKTsKKyAgICAgICAgaWYgKCFzZXRGTnVtYmVyKGVudHJ5LmRhdGEuZlswXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBGIG51bWJlciBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNldEFwZXJ0dXJlKGVudHJ5LmRhdGEuZlswXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBhcGVydHVyZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBrU1JHQkNvbG9yU3BhY2UgPSAxOworICAgIGlmICghc2V0Q29sb3JTcGFjZShrU1JHQkNvbG9yU3BhY2UpKSB7CisgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBjb2xvciBzcGFjZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChzdGF0aWNJbmZvLmV4aXN0cyhBTkRST0lEX0xFTlNfSU5GT19BVkFJTEFCTEVfQVBFUlRVUkVTKSkgeworICAgICAgICBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX0xFTlNfSU5GT19BVkFJTEFCTEVfQVBFUlRVUkVTKTsKKyAgICAgICAgaWYgKCFzZXRNYXhBcGVydHVyZShlbnRyeS5kYXRhLmZbMF0pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgbWF4IGFwZXJ0dXJlIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0YXRpY0luZm8uZXhpc3RzKEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEUpKSB7CisgICAgICAgIGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEUpOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZmxhc2hTdGF0ZUVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0ZMQVNIX1NUQVRFKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGFlTW9kZUVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0NPTlRST0xfQUVfTU9ERSk7CisgICAgICAgIHVpbnQ4X3QgZmxhc2hTdGF0ZSA9IGZsYXNoU3RhdGVFbnRyeS5jb3VudCA+IDAgPworICAgICAgICAgICAgICAgIGZsYXNoU3RhdGVFbnRyeS5kYXRhLnU4WzBdIDogQU5EUk9JRF9GTEFTSF9TVEFURV9VTkFWQUlMQUJMRTsKKyAgICAgICAgdWludDhfdCBhZU1vZGUgPSBhZU1vZGVFbnRyeS5jb3VudCA+IDAgPworICAgICAgICAgICAgICAgIGFlTW9kZUVudHJ5LmRhdGEudThbMF0gOiBBTkRST0lEX0NPTlRST0xfQUVfTU9ERV9PRkY7CisKKyAgICAgICAgaWYgKCFzZXRGbGFzaChlbnRyeS5kYXRhLnU4WzBdLCBmbGFzaFN0YXRlLCBhZU1vZGUpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZmxhc2ggZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0YWRhdGEuZXhpc3RzKEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERSkpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERSk7CisgICAgICAgIGlmICghc2V0V2hpdGVCYWxhbmNlKGVudHJ5LmRhdGEudThbMF0pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgd2hpdGUgYmFsYW5jZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9DT05UUk9MX0FFX01PREUpKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0NPTlRST0xfQUVfTU9ERSk7CisgICAgICAgIGlmICghc2V0RXhwb3N1cmVNb2RlKGVudHJ5LmRhdGEudThbMF0pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZXhwb3N1cmUgbW9kZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodGltZV9hdmFpbGFibGUpIHsKKyAgICAgICAgY2hhciBzdHJbNF07CisgICAgICAgIGlmIChzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiJTAzbGQiLCB0cC50dl9uc2VjIC8gMTAwMDAwMCkgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFN1YnNlYyBpcyBpbnZhbGlkOiAlbGQiLCBfX0ZVTkNUSU9OX18sIHRwLnR2X25zZWMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghc2V0U3Vic2VjVGltZShzdGQ6OnN0cmluZyhzdHIpKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIHN1YnNlYyB0aW1lIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNhbWVyYTMKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0V4aWZVdGlscy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvRXhpZlV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkMDIwNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0V4aWZVdGlscy5oCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0VYSUZfVVRJTFNfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0VYSUZfVVRJTFNfSAorCisjaW5jbHVkZSAiQ2FtZXJhTWV0YWRhdGEuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCisvKgorICogT3JpZW50YXRpb24gdmFsdWU6CisgKiAgMSAgICAgIDIgICAgICAzICAgICAgNCAgICAgIDUgICAgICAgICAgNiAgICAgICAgICA3ICAgICAgICAgIDgKKyAqCisgKiAgODg4ODg4IDg4ODg4OCAgICAgODggODggICAgIDg4ODg4ODg4ODggODggICAgICAgICAgICAgICAgIDg4IDg4ODg4ODg4ODgKKyAqICA4OCAgICAgICAgIDg4ICAgICA4OCA4OCAgICAgODggIDg4ICAgICA4OCAgODggICAgICAgICA4OCAgODggICAgIDg4ICA4OAorICogIDg4ODggICAgIDg4ODggICA4ODg4IDg4ODggICA4OCAgICAgICAgIDg4ODg4ODg4ODggODg4ODg4ODg4OCAgICAgICAgIDg4CisgKiAgODggICAgICAgICA4OCAgICAgODggODgKKyAqICA4OCAgICAgICAgIDg4IDg4ODg4OCA4ODg4ODgKKyAqLworZW51bSBFeGlmT3JpZW50YXRpb24gOiB1aW50MTZfdCB7CisgICAgT1JJRU5UQVRJT05fVU5ERUZJTkVEICAgPSAweDAsCisgICAgT1JJRU5UQVRJT05fMF9ERUdSRUVTICAgPSAweDEsCisgICAgT1JJRU5UQVRJT05fOTBfREVHUkVFUyAgPSAweDYsCisgICAgT1JJRU5UQVRJT05fMTgwX0RFR1JFRVMgPSAweDMsCisgICAgT1JJRU5UQVRJT05fMjcwX0RFR1JFRVMgPSAweDgsCit9OworCisvLyBUaGlzIGlzIGJhc2VkIG9uIHRoZSBjYW1lcmEgSElETCBzaGltIGltcGxlbWVudGF0aW9uLCB3aGljaCB3YXMgaW4gdHVybmVkCisvLyBiYXNlZCBvbiBvcmlnaW5hbCBDaHJvbWVPUyBBUkMgaW1wbGVtZW50YXRpb24gb2YgYSBWNEwyIEhBTAorCisvLyBFeGlmVXRpbHMgY2FuIG92ZXJyaWRlIEFQUDEgc2VnbWVudCB3aXRoIHRhZ3Mgd2hpY2ggY2FsbGVyIHNldC4gRXhpZlV0aWxzIGNhbgorLy8gYWxzbyBhZGQgYSB0aHVtYm5haWwgaW4gdGhlIEFQUDEgc2VnbWVudCBpZiB0aHVtYm5haWwgc2l6ZSBpcyBzcGVjaWZpZWQuCisvLyBFeGlmVXRpbHMgY2FuIGJlIHJldXNlZCB3aXRoIGRpZmZlcmVudCBpbWFnZXMgYnkgY2FsbGluZyBpbml0aWFsaXplKCkuCisvLworLy8gRXhhbXBsZSBvZiB1c2luZyB0aGlzIGNsYXNzIDoKKy8vICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZlV0aWxzPiB1dGlscyhFeGlmVXRpbHM6OkNyZWF0ZSgpKTsKKy8vICB1dGlscy0+aW5pdGlhbGl6ZShjb25zdCB1bnNpZ25lZCBjaGFyKiBhcHAxU2VnbWVudCwgc2l6ZV90IGFwcDFTZWdtZW50U2l6ZSk7CisvLyAgLi4uCisvLyAgLy8gQ2FsbCBFeGlmVXRpbHMgZnVuY3Rpb25zIHRvIHNldCBFeGlmIHRhZ3MuCisvLyAgLi4uCisvLyAgdXRpbHMtPkdlbmVyYXRlQXBwMSgpOworLy8gIHVuc2lnbmVkIGludCBhcHAxTGVuZ3RoID0gdXRpbHMtPkdldEFwcDFMZW5ndGgoKTsKKy8vICB1aW50OF90KiBhcHAxQnVmZmVyID0gbmV3IHVpbnQ4X3RbYXBwMUxlbmd0aF07CisvLyAgbWVtY3B5KGFwcDFCdWZmZXIsIHV0aWxzLT5HZXRBcHAxQnVmZmVyKCksIGFwcDFMZW5ndGgpOworY2xhc3MgRXhpZlV0aWxzIHsKKworcHVibGljOgorICAgIHZpcnR1YWwgfkV4aWZVdGlscygpOworCisgICAgc3RhdGljIEV4aWZVdGlscyogY3JlYXRlKCk7CisKKyAgICAvLyBJbml0aWFsaXplKCkgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gVGhlIHNldHRpbmcgb2YgRXhpZiB0YWdzIHdpbGwgYmUKKyAgICAvLyBjbGVhcmVkLgorICAgIHZpcnR1YWwgYm9vbCBpbml0aWFsaXplKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFwcDFTZWdtZW50LCBzaXplX3QgYXBwMVNlZ21lbnRTaXplKSA9IDA7CisgICAgdmlydHVhbCBib29sIGluaXRpYWxpemVFbXB0eSgpID0gMDsKKworICAgIC8vIFNldCBhbGwga25vd24gZmllbGRzIGZyb20gYSBtZXRhZGF0YSBzdHJ1Y3R1cmUKKyAgICB2aXJ0dWFsIGJvb2wgc2V0RnJvbU1ldGFkYXRhKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzdGF0aWNJbmZvLAorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGltYWdlV2lkdGgsIGNvbnN0IHNpemVfdCBpbWFnZUhlaWdodCkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgbGVuIGFwZXJ0dXJlLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEFwZXJ0dXJlKGZsb2F0IGFwZXJ0dXJlKSA9IDA7CisKKyAgICAvLyBzZXRzIHRoZSBjb2xvciBzcGFjZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRDb2xvclNwYWNlKHVpbnQxNl90IGNvbG9yX3NwYWNlKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBkYXRlIGFuZCB0aW1lIG9mIGltYWdlIGxhc3QgbW9kaWZpZWQuIEl0IHRha2VzIGxvY2FsIHRpbWUuIFRoZQorICAgIC8vIG5hbWUgb2YgdGhlIHRhZyBpcyBEYXRlVGltZSBpbiBJRkQwLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldERhdGVUaW1lKGNvbnN0IHN0cnVjdCB0bSYgdCkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZGlnaXRhbCB6b29tIHJhdGlvLiBJZiB0aGUgbnVtZXJhdG9yIGlzIDAsIGl0IG1lYW5zIGRpZ2l0YWwgem9vbQorICAgIC8vIHdhcyBub3QgdXNlZC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXREaWdpdGFsWm9vbVJhdGlvKHVpbnQzMl90IGNyb3Bfd2lkdGgsIHVpbnQzMl90IGNyb3BfaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3Qgc2Vuc29yX3dpZHRoLCB1aW50MzJfdCBzZW5zb3JfaGVpZ2h0KSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBleHBvc3VyZSBiaWFzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEV4cG9zdXJlQmlhcyhpbnQzMl90IGV2LAorICAgICAgICAgICAgdWludDMyX3QgZXZfc3RlcF9udW1lcmF0b3IsIHVpbnQzMl90IGV2X3N0ZXBfZGVub21pbmF0b3IpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGV4cG9zdXJlIG1vZGUgc2V0IHdoZW4gdGhlIGltYWdlIHdhcyBzaG90LgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEV4cG9zdXJlTW9kZSh1aW50OF90IGV4cG9zdXJlX21vZGUpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGV4cG9zdXJlIHRpbWUsIGdpdmVuIGluIHNlY29uZHMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RXhwb3N1cmVUaW1lKGZsb2F0IGV4cG9zdXJlX3RpbWUpID0gMDsKKworICAgIC8vIFNldHMgdGhlIHN0YXR1cyBvZiBmbGFzaC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRGbGFzaCh1aW50OF90IGZsYXNoX2F2YWlsYWJsZSwgdWludDhfdCBmbGFzaF9zdGF0ZSwgdWludDhfdCBhZV9tb2RlKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBGIG51bWJlci4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRGTnVtYmVyKGZsb2F0IGZfbnVtYmVyKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBmb2NhbCBsZW5ndGggb2YgbGVucyB1c2VkIHRvIHRha2UgdGhlIGltYWdlIGluIG1pbGxpbWV0ZXJzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEZvY2FsTGVuZ3RoKGZsb2F0IGZvY2FsX2xlbmd0aCkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZm9jYWwgbGVuZ3RoIG9mIGxlbnMgZm9yIDM1bW0gZmlsbSB1c2VkIHRvIHRha2UgdGhlIGltYWdlIGluIG1pbGxpbWV0ZXJzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEZvY2FsTGVuZ3RoSW4zNW1tRmlsbShmbG9hdCBmb2NhbF9sZW5ndGgsCisgICAgICAgICAgICBmbG9hdCBzZW5zb3Jfc2l6ZV94LCBmbG9hdCBzZW5zb3Jfc2l6ZV95KSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBhbHRpdHVkZSBpbiBtZXRlcnMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0R3BzQWx0aXR1ZGUoZG91YmxlIGFsdGl0dWRlKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBsYXRpdHVkZSB3aXRoIGRlZ3JlZXMgbWludXRlcyBzZWNvbmRzIGZvcm1hdC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRHcHNMYXRpdHVkZShkb3VibGUgbGF0aXR1ZGUpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGxvbmdpdHVkZSB3aXRoIGRlZ3JlZXMgbWludXRlcyBzZWNvbmRzIGZvcm1hdC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRHcHNMb25naXR1ZGUoZG91YmxlIGxvbmdpdHVkZSkgPSAwOworCisgICAgLy8gU2V0cyBHUFMgcHJvY2Vzc2luZyBtZXRob2QuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0R3BzUHJvY2Vzc2luZ01ldGhvZChjb25zdCBzdGQ6OnN0cmluZyYgbWV0aG9kKSA9IDA7CisKKyAgICAvLyBTZXRzIEdQUyBkYXRlIHN0YW1wIGFuZCB0aW1lIHN0YW1wIChhdG9taWMgY2xvY2spLiBJdCB0YWtlcyBVVEMgdGltZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRHcHNUaW1lc3RhbXAoY29uc3Qgc3RydWN0IHRtJiB0KSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBoZWlnaHQgKG51bWJlciBvZiByb3dzKSBvZiBtYWluIGltYWdlLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEltYWdlSGVpZ2h0KHVpbnQzMl90IGxlbmd0aCkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgd2lkdGggKG51bWJlciBvZiBjb2x1bW5zKSBvZiBtYWluIGltYWdlLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEltYWdlV2lkdGgodWludDMyX3Qgd2lkdGgpID0gMDsKKworICAgIC8vIFNldHMgdGhlIElTTyBzcGVlZC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRJc29TcGVlZFJhdGluZyh1aW50MTZfdCBpc29fc3BlZWRfcmF0aW5ncykgPSAwOworCisgICAgLy8gU2V0cyB0aGUgc21hbGxlc3QgRiBudW1iZXIgb2YgdGhlIGxlbnMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0TWF4QXBlcnR1cmUoZmxvYXQgYXBlcnR1cmUpID0gMDsKKworICAgIC8vIFNldHMgaW1hZ2Ugb3JpZW50YXRpb24uCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0T3JpZW50YXRpb24odWludDE2X3QgZGVncmVlcykgPSAwOworCisgICAgLy8gU2V0cyBpbWFnZSBvcmllbnRhdGlvbi4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRPcmllbnRhdGlvblZhbHVlKEV4aWZPcmllbnRhdGlvbiBvcmllbnRhdGlvblZhbHVlKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBzaHV0dGVyIHNwZWVkLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldFNodXR0ZXJTcGVlZChmbG9hdCBleHBvc3VyZV90aW1lKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBkaXN0YW5jZSB0byB0aGUgc3ViamVjdCwgZ2l2ZW4gaW4gbWV0ZXJzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldFN1YmplY3REaXN0YW5jZShmbG9hdCBkaW9wdGVycykgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZnJhY3Rpb25zIG9mIHNlY29uZHMgZm9yIHRoZSA8RGF0ZVRpbWU+IHRhZy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRTdWJzZWNUaW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJzZWNfdGltZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgd2hpdGUgYmFsYW5jZSBtb2RlIHNldCB3aGVuIHRoZSBpbWFnZSB3YXMgc2hvdC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRXaGl0ZUJhbGFuY2UodWludDhfdCB3aGl0ZV9ibGFuYWNlKSA9IDA7CisKKyAgICAvLyBHZW5lcmF0ZXMgQVBQMSBzZWdtZW50LgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgZ2VuZXJhdGluZyBBUFAxIHNlZ21lbnQgZmFpbHMuCisgICAgdmlydHVhbCBib29sIGdlbmVyYXRlQXBwMSgpID0gMDsKKworICAgIC8vIEdldHMgYnVmZmVyIG9mIEFQUDEgc2VnbWVudC4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBjYWxsaW5nCisgICAgLy8gR2VuZXJhdGVBUFAxKCkuCisgICAgdmlydHVhbCBjb25zdCB1aW50OF90KiBnZXRBcHAxQnVmZmVyKCkgPSAwOworCisgICAgLy8gR2V0cyBsZW5ndGggb2YgQVBQMSBzZWdtZW50LiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBvbmx5IGFmdGVyIGNhbGxpbmcKKyAgICAvLyBHZW5lcmF0ZUFQUDEoKS4KKyAgICB2aXJ0dWFsIHVuc2lnbmVkIGludCBnZXRBcHAxTGVuZ3RoKCkgPSAwOworfTsKKworfSAvLyBuYW1lc3BhY2UgY2FtZXJhMworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfU0VSVkVSU19DQU1FUkFfRVhJRl9VVElMU19ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuY3BwCmluZGV4IGMwYTM1M2YuLmY0YzQ5ZWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuY3BwCkBAIC00OSw3ICs0OSw4IEBACiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1vbml0b3JNdXRleCk7CiAKICAgICAvLyBFeHBhbmQgc2hvcnRoYW5kcwotICAgIGlmIChzc2l6ZV90IGlkeCA9IHRhZ05hbWVzLmZpbmQoIjNhIikgIT0gLTEpIHsKKyAgICBzc2l6ZV90IGlkeCA9IHRhZ05hbWVzLmZpbmQoIjNhIik7CisgICAgaWYgKGlkeCAhPSAtMSkgewogICAgICAgICBzc2l6ZV90IGVuZCA9IHRhZ05hbWVzLmZpbmQoIiwiLCBpZHgpOwogICAgICAgICBjaGFyKiBzdGFydCA9IHRhZ05hbWVzLmxvY2tCdWZmZXIodGFnTmFtZXMuc2l6ZSgpKTsKICAgICAgICAgc3RhcnRbaWR4XSA9ICdcMCc7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcAppbmRleCA0YjA1Mzk1Li4wNmJhYWM5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC01MCw3ICs1MSw2IEBACiAjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVJlbW90ZURpc3BsYXkuaD4KICNpbmNsdWRlIDxtZWRpYS9JUmVtb3RlRGlzcGxheUNsaWVudC5oPgpAQCAtNzYsMTUgKzc2LDE5IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpiYXNlOwotICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjb250ZW50OjpwbTsKLQogLy8gaW5kaXZpZHVhbCByZWNvcmRzIGtlcHQgaW4gbWVtb3J5OiBhZ2Ugb3IgY291bnQKLS8vIGFnZTogPD0gMzYgaG91cnMgKDEuNSBkYXlzKQorLy8gYWdlOiA8PSAyOCBob3VycyAoMSAxLzYgZGF5cykKIC8vIGNvdW50OiBoYXJkIGxpbWl0IG9mICMgcmVjb3JkcwogLy8gKDAgZm9yIGVpdGhlciBvZiB0aGVzZSBkaXNhYmxlcyB0aGF0IHRocmVzaG9sZCkKLXN0YXRpYyBjb25zdCBuc2Vjc190IGtNYXhSZWNvcmRBZ2VOcyA9ICAzNiAqIDM2MDAgKiAoMTAwMCoxMDAwKjEwMDBsbCk7Ci1zdGF0aWMgY29uc3QgaW50IGtNYXhSZWNvcmRzICAgID0gMDsKKy8vCitzdGF0aWMgY29uc3RleHByIG5zZWNzX3Qga01heFJlY29yZEFnZU5zID0gIDI4ICogMzYwMCAqICgxMDAwKjEwMDAqMTAwMGxsKTsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhSZWNvcmRzICAgID0gMDsKKworLy8gbWF4IHdlIGV4cGlyZSBpbiBhIHNpbmdsZSBjYWxsLCB0byBjb25zdHJhaW4gaG93IGxvbmcgd2UgaG9sZCB0aGUKKy8vIG11dGV4LCB3aGljaCBhbHNvIGNvbnN0cmFpbnMgaG93IGxvbmcgYSBjbGllbnQgbWlnaHQgd2FpdC4KK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhFeHBpcmVkQXRPbmNlID0gNTA7CisKKy8vIFRPRE86IG5lZWQgdG8gbG9vayBhdCB0dW5pbmcga01heFJlY29yZHMgYW5kIGZyaWVuZHMgZm9yIGxvdy1tZW1vcnkgZGV2aWNlcwogCiBzdGF0aWMgY29uc3QgY2hhciAqa1NlcnZpY2VOYW1lID0gIm1lZGlhLm1ldHJpY3MiOwogCkBAIC05Niw2ICsxMDAsNyBAQAogTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpNZWRpYUFuYWx5dGljc1NlcnZpY2UoKQogICAgICAgICA6IG1NYXhSZWNvcmRzKGtNYXhSZWNvcmRzKSwKICAgICAgICAgICBtTWF4UmVjb3JkQWdlTnMoa01heFJlY29yZEFnZU5zKSwKKyAgICAgICAgICBtTWF4UmVjb3Jkc0V4cGlyZWRBdE9uY2Uoa01heEV4cGlyZWRBdE9uY2UpLAogICAgICAgICAgIG1EdW1wUHJvdG8oTWVkaWFBbmFseXRpY3NJdGVtOjpQUk9UT19WMSksCiAgICAgICAgICAgbUR1bXBQcm90b0RlZmF1bHQoTWVkaWFBbmFseXRpY3NJdGVtOjpQUk9UT19WMSkgewogCkBAIC00MzIsMjMgKzQzNywyOSBAQAogLy8KIC8vIE91ciBDaGVhcCBpbi1jb3JlLCBub24tcGVyc2lzdGVudCByZWNvcmRzIG1hbmFnZW1lbnQuCiAKLS8vIGluc2VydCBhcHByb3ByaWF0ZWx5IGludG8gcXVldWUKLXZvaWQgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpzYXZlSXRlbShNZWRpYUFuYWx5dGljc0l0ZW0gKiBpdGVtKQorCisvLyB3ZSBob2xkIG1Mb2NrIHdoZW4gd2UgZ2V0IGhlcmUKKy8vIGlmIGl0ZW0gIT0gTlVMTCwgaXQncyB0aGUgaXRlbSB3ZSBqdXN0IGluc2VydGVkCisvLyB0cnVlID09IG1vcmUgaXRlbXMgZWxpZ2libGUgdG8gYmUgcmVjb3ZlcmVkCitib29sIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6ZXhwaXJhdGlvbnNfbChNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pCiB7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIC8vIG11dGV4IGJldHdlZW4gaW5zZXJ0aW9uIGFuZCBkdW1waW5nIHRoZSBjb250ZW50cwotCi0gICAgLy8gd2Ugd2FudCB0byBkdW1wICdpbiBGSUZPIG9yZGVyJywgc28gaW5zZXJ0IGF0IHRoZSBlbmQKLSAgICBtSXRlbXMucHVzaF9iYWNrKGl0ZW0pOworICAgIGJvb2wgbW9yZSA9IGZhbHNlOworICAgIGludCBoYW5kbGVkID0gMDsKIAogICAgIC8vIGtlZXAgcmVtb3Zpbmcgb2xkIHJlY29yZHMgdGhlIGZyb250IHVudGlsIHdlJ3JlIGluLWJvdW5kcyAoY291bnQpCisgICAgLy8gc2luY2Ugd2UgaW52b2tlIHRoaXMgd2l0aCBlYWNoIGluc2VydGlvbiwgaXQgc2hvdWxkIGJlIDAvMSBpdGVyYXRpb25zLgogICAgIGlmIChtTWF4UmVjb3JkcyA+IDApIHsKICAgICAgICAgd2hpbGUgKG1JdGVtcy5zaXplKCkgPiAoc2l6ZV90KSBtTWF4UmVjb3JkcykgewogICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKG1JdGVtcy5iZWdpbigpKTsKICAgICAgICAgICAgIGlmIChvaXRlbSA9PSBpdGVtKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFuZGxlZCA+PSBtTWF4UmVjb3Jkc0V4cGlyZWRBdE9uY2UpIHsKKyAgICAgICAgICAgICAgICAvLyB1bmxpa2VseSBpbiB0aGlzIGxvb3AKKyAgICAgICAgICAgICAgICBtb3JlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhbmRsZWQrKzsKICAgICAgICAgICAgIG1JdGVtcy5lcmFzZShtSXRlbXMuYmVnaW4oKSk7CiAgICAgICAgICAgICBkZWxldGUgb2l0ZW07CiAgICAgICAgICAgICBtSXRlbXNEaXNjYXJkZWQrKzsKQEAgLTQ1Niw4ICs0NjcsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8ga2VlcCByZW1vdmluZyBvbGQgcmVjb3JkcyB0aGUgZnJvbnQgdW50aWwgd2UncmUgaW4tYm91bmRzIChjb3VudCkKLSAgICAvLyBOQjogZXhwaXJlZCBlbnRyaWVzIGFyZW4ndCByZW1vdmVkIHVudGlsIHRoZSBuZXh0IGluc2VydGlvbiwgd2hpY2ggY291bGQgYmUgYSB3aGlsZQorICAgIC8vIGtlZXAgcmVtb3Zpbmcgb2xkIHJlY29yZHMgdGhlIGZyb250IHVudGlsIHdlJ3JlIGluLWJvdW5kcyAoYWdlKQorICAgIC8vIGxpbWl0ZWQgdG8gbU1heFJlY29yZHNFeHBpcmVkQXRPbmNlIGl0ZW1zIHBlciBpbnZvY2F0aW9uLgogICAgIGlmIChtTWF4UmVjb3JkQWdlTnMgPiAwKSB7CiAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSk7CiAgICAgICAgIHdoaWxlIChtSXRlbXMuc2l6ZSgpID4gMCkgewpAQCAtNDcxLDE4ICs0ODIsNzIgQEAKICAgICAgICAgICAgICAgICAvLyB0aGlzIChhbmQgdGhlIHJlc3QpIGFyZSByZWNlbnQgZW5vdWdoIHRvIGtlZXAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYW5kbGVkID49IG1NYXhSZWNvcmRzRXhwaXJlZEF0T25jZSkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVwcmVzZW50cyAib25lIHRvbyBtYW55IjsgdGVsbCBjYWxsZXIgdGhlcmUgYXJlCisgICAgICAgICAgICAgICAgLy8gbW9yZSB0byBiZSByZWNsYWltZWQuCisgICAgICAgICAgICAgICAgbW9yZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYW5kbGVkKys7CiAgICAgICAgICAgICBtSXRlbXMuZXJhc2UobUl0ZW1zLmJlZ2luKCkpOwogICAgICAgICAgICAgZGVsZXRlIG9pdGVtOwogICAgICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkKys7CiAgICAgICAgICAgICBtSXRlbXNEaXNjYXJkZWRFeHBpcmUrKzsKICAgICAgICAgfQogICAgIH0KKworICAgIC8vIHdlIG9ubHkgaW5kaWNhdGUgd2hldGhlciB0aGVyZSdzIG1vcmUgdG8gY2xlYW47CisgICAgLy8gY2FsbGVyIGNob29zZXMgd2hldGhlciB0byBzY2hlZHVsZSBmdXJ0aGVyIGNsZWFudXAuCisgICAgcmV0dXJuIG1vcmU7Cit9CisKKy8vIHByb2Nlc3MgZXhwaXJhdGlvbnMgaW4gYml0ZSBzaXplZCBjaHVua3MsIGFsbG93aW5nIG5ldyBpbnNlcnRpb25zIHRocm91Z2gKKy8vIHJ1bnMgaW4gYSBwdGhyZWFkIHNwZWNpZmljYWxseSBzdGFydGVkIGZvciB0aGlzICh3aGljaCB0aGVuIGV4aXRzKQorYm9vbCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OnByb2Nlc3NFeHBpcmF0aW9ucygpCit7CisgICAgYm9vbCBtb3JlOworICAgIGRvIHsKKyAgICAgICAgc2xlZXAoMSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgICAgICBtb3JlID0gZXhwaXJhdGlvbnNfbChOVUxMKTsKKyAgICAgICAgICAgIGlmICghbW9yZSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAobW9yZSk7CisgICAgcmV0dXJuIHRydWU7ICAgICAgICAvLyB2YWx1ZSBpcyBmb3Igc3RkOjpmdXR1cmUgdGhyZWFkIHN5bmNocm9uaXphdGlvbgorfQorCisvLyBpbnNlcnQgYXBwcm9wcmlhdGVseSBpbnRvIHF1ZXVlCit2b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6c2F2ZUl0ZW0oTWVkaWFBbmFseXRpY3NJdGVtICogaXRlbSkKK3sKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgLy8gbXV0ZXggYmV0d2VlbiBpbnNlcnRpb24gYW5kIGR1bXBpbmcgdGhlIGNvbnRlbnRzCisKKyAgICAvLyB3ZSB3YW50IHRvIGR1bXAgJ2luIEZJRk8gb3JkZXInLCBzbyBpbnNlcnQgYXQgdGhlIGVuZAorICAgIG1JdGVtcy5wdXNoX2JhY2soaXRlbSk7CisKKyAgICAvLyBjbGVhbiBvbGQgc3R1ZmYgZnJvbSB0aGUgcXVldWUKKyAgICBib29sIG1vcmUgPSBleHBpcmF0aW9uc19sKGl0ZW0pOworCisgICAgLy8gY29uc2lkZXIgc2NoZWR1bGluZyBzb21lIGFzeW5jaHJvbm91cyBjbGVhbmluZywgaWYgbm90IHJ1bm5pbmcKKyAgICBpZiAobW9yZSkgeworICAgICAgICBpZiAoIW1FeHBpcmVGdXR1cmUudmFsaWQoKQorICAgICAgICAgICAgfHwgbUV4cGlyZUZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygwKSkgPT0gc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSkgeworCisgICAgICAgICAgICBtRXhwaXJlRnV0dXJlID0gc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsIFt0aGlzXSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIHRoaXMtPnByb2Nlc3NFeHBpcmF0aW9ucygpO30pOworICAgICAgICB9CisgICAgfQogfQogCiBzdGF0aWMgc3RkOjpzdHJpbmcgYWxsb3dlZEtleXNbXSA9CiB7CiAgICAgImF1ZGlvcG9saWN5IiwKICAgICAiYXVkaW9yZWNvcmQiLAorICAgICJhdWRpb3RocmVhZCIsCiAgICAgImF1ZGlvdHJhY2siLAogICAgICJjb2RlYyIsCiAgICAgImV4dHJhY3RvciIsCkBAIC01ODEsNyArNjQ2LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChiaW5kZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgc3A8SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPiBwYWNrYWdlX21nciA9IGludGVyZmFjZV9jYXN0PElQYWNrYWdlTWFuYWdlck5hdGl2ZT4oYmluZGVyKTsKKyAgICAgICAgICAgIHNwPGNvbnRlbnQ6OnBtOjpJUGFja2FnZU1hbmFnZXJOYXRpdmU+IHBhY2thZ2VfbWdyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxjb250ZW50OjpwbTo6SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPihiaW5kZXIpOwogICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzOwogCiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHVpZHM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCmluZGV4IGIzYzkwMmEuLjYzMmM2OTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCkBAIC0yNiw2ICsyNiw4IEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KIAorI2luY2x1ZGUgPGZ1dHVyZT4KKwogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNDQsNiArNDYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQW5hbHl0aWNzU2VydmljZSgpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NZWRpYUFuYWx5dGljc1NlcnZpY2UoKTsKIAorICAgIGJvb2wgcHJvY2Vzc0V4cGlyYXRpb25zKCk7CisKICBwcml2YXRlOgogICAgIE1lZGlhQW5hbHl0aWNzSXRlbTo6U2Vzc2lvbklEX3QgZ2VuZXJhdGVVbmlxdWVTZXNzaW9uSUQoKTsKIApAQCAtNjUsNiArNjksOCBAQAogICAgIGludDMyX3QgbU1heFJlY29yZHM7CiAgICAgLy8gYnkgdGltZSAobm9uZSBvbGRlciB0aGFuIHRoaXMgbG9uZyBhZ2FuCiAgICAgbnNlY3NfdCBtTWF4UmVjb3JkQWdlTnM7CisgICAgLy8gbWF4IHRvIGV4cGlyZSBwZXIgZXhwaXJhdGlvbnNfbCgpIGludm9jYXRpb24KKyAgICBpbnQzMl90IG1NYXhSZWNvcmRzRXhwaXJlZEF0T25jZTsKICAgICAvLwogICAgIC8vICMgb2Ygc2V0cyBvZiBzdW1tYXJpZXMKICAgICBpbnQzMl90IG1NYXhSZWNvcmRTZXRzOwpAQCAtNzksNiArODUsOSBAQAogICAgIExpc3Q8TWVkaWFBbmFseXRpY3NJdGVtICo+IG1JdGVtczsKICAgICB2b2lkIHNhdmVJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbSAqKTsKIAorICAgIGJvb2wgZXhwaXJhdGlvbnNfbChNZWRpYUFuYWx5dGljc0l0ZW0gKik7CisgICAgc3RkOjpmdXR1cmU8Ym9vbD4gbUV4cGlyZUZ1dHVyZTsKKwogICAgIC8vIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgb3V0cHV0CiAgICAgaW50IG1EdW1wUHJvdG87CiAgICAgaW50IG1EdW1wUHJvdG9EZWZhdWx0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YzM2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2MiBAQAorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAibWVkaWFzd2NvZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAibWFpbl9zd2NvZGVjc2VydmljZS5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXZzZXJ2aWNlc19taW5pamFpbCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQiLAorICAgIF0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgdmVuZG9yOiB7CisgICAgICAgICAgICBleGNsdWRlX3NoYXJlZF9saWJzOiBbImxpYmF2c2VydmljZXNfbWluaWphaWwiXSwKKyAgICAgICAgICAgIHNoYXJlZF9saWJzOiBbImxpYmF2c2VydmljZXNfbWluaWphaWxfdmVuZG9yIl0sCisgICAgICAgIH0sCisgICAgfSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgaW5pdF9yYzogWyJtZWRpYXN3Y29kZWMucmMiXSwKKworICAgIHJlcXVpcmVkOiBbIm1lZGlhc3djb2RlYy5wb2xpY3kiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgc2N1ZG86IHRydWUsCisgICAgfSwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAibWVkaWFzd2NvZGVjLnBvbGljeSIsCisgICAgc3ViX2RpcjogInNlY2NvbXBfcG9saWN5IiwKKyAgICBhcmNoOiB7CisgICAgICAgIGFybTogeworICAgICAgICAgICAgc3JjOiAic2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybS5wb2xpY3kiLAorICAgICAgICB9LAorICAgICAgICBhcm02NDogeworICAgICAgICAgICAgc3JjOiAic2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybTY0LnBvbGljeSIsCisgICAgICAgIH0sCisgICAgICAgIHg4NjogeworICAgICAgICAgICAgc3JjOiAic2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5IiwKKyAgICAgICAgfSwKKyAgICAgICAgeDg2XzY0OiB7CisgICAgICAgICAgICBzcmM6ICJzZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kiLAorICAgICAgICB9LAorICAgIH0sCisgICAgcmVxdWlyZWQ6IFsiY3Jhc2hfZHVtcC5wb2xpY3kiXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5tawppbmRleCBkYjVmMGZmLi45Y2MxOWEzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rCkBAIC0yNyw4ICsyNyw4IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKICMgc2VjY29tcCBpcyBub3QgcmVxdWlyZWQgZm9yIGNvdmVyYWdlIGJ1aWxkLgogaWZuZXEgKCQoTkFUSVZFX0NPVkVSQUdFKSx0cnVlKQotTE9DQUxfUkVRVUlSRURfTU9EVUxFU19hcm0gOj0gY3Jhc2hfZHVtcC5wb2xpY3kgbWVkaWFjb2RlYy5wb2xpY3kKLUxPQ0FMX1JFUVVJUkVEX01PRFVMRVNfeDg2IDo9IGNyYXNoX2R1bXAucG9saWN5IG1lZGlhY29kZWMucG9saWN5CitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTX2FybSA6PSBtZWRpYWNvZGVjLnBvbGljeQorTE9DQUxfUkVRVUlSRURfTU9EVUxFU194ODYgOj0gbWVkaWFjb2RlYy5wb2xpY3kKIGVuZGlmCiBMT0NBTF9TUkNfRklMRVMgOj0gbWFpbl9jb2RlY3NlcnZpY2UuY3BwCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKQEAgLTYzLDEyICs2MywxNSBAQAogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwogIyBzZXJ2aWNlIHNlY2NvbXAgcG9saWN5CiBpZmVxICgkKFRBUkdFVF9BUkNIKSwgJChmaWx0ZXIgJChUQVJHRVRfQVJDSCksIHg4NiB4ODZfNjQgYXJtIGFybTY0KSkKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogTE9DQUxfTU9EVUxFIDo9IG1lZGlhY29kZWMucG9saWN5CiBMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVQpL2V0Yy9zZWNjb21wX3BvbGljeQorTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBjcmFzaF9kdW1wLnBvbGljeQogIyBtZWRpYWNvZGVjIHJ1bnMgaW4gMzItYml0IGNvbWJhdGliaWxpdHkgbW9kZS4gRm9yIDY0IGJpdCBhcmNoaXRlY3R1cmVzLAogIyB1c2UgdGhlIDMyIGJpdCBwb2xpY3kKIGlmZGVmIFRBUkdFVF8yTkRfQVJDSApAQCAtODMsNCArODYsNyBAQAogaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQogZW5kaWYKIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCiBpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCAkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcAppbmRleCA1MTYxOWY2Li42ZDQ3YmU2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcApAQCAtNDgsMzcgKzQ4LDIxIEBACiAKICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sKDY0LCBmYWxzZSk7CiAKLSAgICAvLyBSZWdpc3RyYXRpb24gb2YgY3VzdG9taXplZCBjb2RlYyBzZXJ2aWNlcwotICAgIHZvaWQgKnJlZ2lzdHJhbnRMaWIgPSBkbG9wZW4oCi0gICAgICAgICAgICAibGlibWVkaWFfY29kZWNzZXJ2aWNlcmVnaXN0cmFudC5zbyIsCi0gICAgICAgICAgICBSVExEX05PVyB8IFJUTERfTE9DQUwpOwotICAgIGlmIChyZWdpc3RyYW50TGliKSB7Ci0gICAgICAgIFJlZ2lzdGVyQ29kZWNTZXJ2aWNlc0Z1bmMgcmVnaXN0ZXJDb2RlY1NlcnZpY2VzID0KLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFJlZ2lzdGVyQ29kZWNTZXJ2aWNlc0Z1bmM+KAotICAgICAgICAgICAgICAgIGRsc3ltKHJlZ2lzdHJhbnRMaWIsICJSZWdpc3RlckNvZGVjU2VydmljZXMiKSk7Ci0gICAgICAgIGlmIChyZWdpc3RlckNvZGVjU2VydmljZXMpIHsKLSAgICAgICAgICAgIHJlZ2lzdGVyQ29kZWNTZXJ2aWNlcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJDYW5ub3QgcmVnaXN0ZXIgYWRkaXRpb25hbCBzZXJ2aWNlcyAiCi0gICAgICAgICAgICAgICAgICAgICItLSBjb3JydXB0ZWQgbGlicmFyeS4iOwotICAgICAgICB9CisgICAgLy8gRGVmYXVsdCBjb2RlYyBzZXJ2aWNlcworICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOworICAgIHNwPElPbXhTdG9yZT4gb214U3RvcmUgPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teFN0b3JlKCk7CisgICAgaWYgKG9teFN0b3JlID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNyZWF0ZSBJT214U3RvcmUgSEFMIHNlcnZpY2UuIjsKKyAgICB9IGVsc2UgaWYgKG9teFN0b3JlLT5yZWdpc3RlckFzU2VydmljZSgpICE9IE9LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCByZWdpc3RlciBJT214U3RvcmUgSEFMIHNlcnZpY2UuIjsKKyAgICB9CisgICAgc3A8SU9teD4gb214ID0gbmV3IGltcGxlbWVudGF0aW9uOjpPbXgoKTsKKyAgICBpZiAob214ID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNyZWF0ZSBJT214IEhBTCBzZXJ2aWNlLiI7CisgICAgfSBlbHNlIGlmIChvbXgtPnJlZ2lzdGVyQXNTZXJ2aWNlKCkgIT0gT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIElPbXggSEFMIHNlcnZpY2UuIjsKICAgICB9IGVsc2UgewotICAgICAgICAvLyBEZWZhdWx0IGNvZGVjIHNlcnZpY2VzCi0gICAgICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOwotICAgICAgICBzcDxJT214U3RvcmU+IG9teFN0b3JlID0gbmV3IGltcGxlbWVudGF0aW9uOjpPbXhTdG9yZSgpOwotICAgICAgICBpZiAob214U3RvcmUgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNyZWF0ZSBJT214U3RvcmUgSEFMIHNlcnZpY2UuIjsKLSAgICAgICAgfSBlbHNlIGlmIChvbXhTdG9yZS0+cmVnaXN0ZXJBc1NlcnZpY2UoKSAhPSBPSykgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIElPbXhTdG9yZSBIQUwgc2VydmljZS4iOwotICAgICAgICB9Ci0gICAgICAgIHNwPElPbXg+IG9teCA9IG5ldyBpbXBsZW1lbnRhdGlvbjo6T214KCk7Ci0gICAgICAgIGlmIChvbXggPT0gbnVsbHB0cikgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNyZWF0ZSBJT214IEhBTCBzZXJ2aWNlLiI7Ci0gICAgICAgIH0gZWxzZSBpZiAob214LT5yZWdpc3RlckFzU2VydmljZSgpICE9IE9LKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgcmVnaXN0ZXIgSU9teCBIQUwgc2VydmljZS4iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HKElORk8pIDw8ICJJT214IEhBTCBzZXJ2aWNlIGNyZWF0ZWQuIjsKLSAgICAgICAgfQorICAgICAgICBMT0coSU5GTykgPDwgIklPbXggSEFMIHNlcnZpY2UgY3JlYXRlZC4iOwogICAgIH0KIAogICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmpvaW5ScGNUaHJlYWRwb29sKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fc3djb2RlY3NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX3N3Y29kZWNzZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDRiZTI4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX3N3Y29kZWNzZXJ2aWNlLmNwcApAQCAtMCwwICsxLDUzIEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworLy8gZnJvbSBMT0NBTF9DX0lOQ0xVREVTCisjaW5jbHVkZSAibWluaWphaWwuaCIKKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyBrU3lzdGVtU2VjY29tcFBvbGljeVBhdGggcG9pbnRzIHRvIHRoZSBwb2xpY3kgZm9yIHRoZSBzd2NvZGVjcyB0aGVtc2VsdmVzIGFuZAorLy8gaXMgcGFydCBvZiB0aGUgdXBkYXRlcy4ga1ZlbmRvclNlY2NvbXBQb2xpY3lQYXRoIHBvaW50cyB0byBhbnkgYWRkaXRpb25hbAorLy8gcG9saWNpZXMgdGhhdCB0aGUgdmVuZG9yIG1heSBuZWVkIGZvciB0aGUgZGV2aWNlLgorc3RhdGljIGNvbnN0IGNoYXIga1N5c3RlbVNlY2NvbXBQb2xpY3lQYXRoW10gPQorICAgICAgICAiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy9ldGMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLnBvbGljeSI7CitzdGF0aWMgY29uc3QgY2hhciBrVmVuZG9yU2VjY29tcFBvbGljeVBhdGhbXSA9CisgICAgICAgICIvdmVuZG9yL2V0Yy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMucG9saWN5IjsKKworLy8gRGlzYWJsZSBTY3VkbydzIG1pc21hdGNoIGFsbG9jYXRpb24gY2hlY2ssIGFzIGl0IGlzIGJlaW5nIHRyaWdnZXJlZAorLy8gYnkgc29tZSB0aGlyZCBwYXJ0eSBjb2RlLgorZXh0ZXJuICJDIiBjb25zdCBjaGFyICpfX3NjdWRvX2RlZmF1bHRfb3B0aW9ucygpIHsKKyAgICByZXR1cm4gIkRlYWxsb2NhdGlvblR5cGVNaXNtYXRjaD1mYWxzZSI7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBSZWdpc3RlckNvZGVjU2VydmljZXMoKTsKKworaW50IG1haW4oaW50IGFyZ2MgX191bnVzZWQsIGNoYXIqKiAvKmFyZ3YqLykKK3sKKyAgICBMT0coSU5GTykgPDwgIm1lZGlhIHN3Y29kZWMgc2VydmljZSBzdGFydGluZyI7CisgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworICAgIFNldFVwTWluaWphaWwoa1N5c3RlbVNlY2NvbXBQb2xpY3lQYXRoLCBrVmVuZG9yU2VjY29tcFBvbGljeVBhdGgpOworCisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCg2NCwgZmFsc2UpOworCisgICAgUmVnaXN0ZXJDb2RlY1NlcnZpY2VzKCk7CisKKyAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbCgpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9tZWRpYXN3Y29kZWMucmMgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21lZGlhc3djb2RlYy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTQ5NjY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tZWRpYXN3Y29kZWMucmMKQEAgLTAsMCArMSw3IEBACitzZXJ2aWNlIG1lZGlhLnN3Y29kZWMgL3N5c3RlbS9iaW4vbWVkaWFzd2NvZGVjCisgICAgY2xhc3MgbWFpbgorICAgIHVzZXIgbWVkaWFjb2RlYworICAgIGdyb3VwIGNhbWVyYSBkcm1ycGMgbWVkaWFkcm0KKyAgICB1cGRhdGFibGUKKyAgICBpb3ByaW8gcnQgNAorICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3MGRlMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTUgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlibWVkaWFfY29kZWNzZXJ2aWNlcmVnaXN0cmFudCIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJDb2RlY1NlcnZpY2VSZWdpc3RyYW50LmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY29kZWMyX2hpZGxAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgLy8gQ29kZWNzCisgICAgcnVudGltZV9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hdmNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYXZjZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2FhY2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hYWNlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYW1ybmJkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYW1ybmJlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYW1yd2JkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYW1yd2JlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfaGV2Y2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9oZXZjZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2c3MTFhbGF3ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2c3MTFtbGF3ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X21wZWcyZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2gyNjNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfaDI2M2VuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9tcGVnNGRlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9tcGVnNGVuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9tcDNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfdm9yYmlzZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X29wdXNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfb3B1c2VuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF92cDhkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfdnA5ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2F2MWRlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF92cDhlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfdnA5ZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Jhd2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9mbGFjZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2ZsYWNlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfZ3NtZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3hhYWNkZWMiLAorICAgIF0sCit9CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9Db2RlY1NlcnZpY2VSZWdpc3RyYW50LmNwcCBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9Db2RlY1NlcnZpY2VSZWdpc3RyYW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDZlYmVlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0NvZGVjU2VydmljZVJlZ2lzdHJhbnQuY3BwCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWNTZXJ2aWNlUmVnaXN0cmFudCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPG1lZGlhL0NvZGVjU2VydmljZVJlZ2lzdHJhbnQuaD4KKworZXh0ZXJuICJDIiB2b2lkIFJlZ2lzdGVyQ29kZWNTZXJ2aWNlcygpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOworICAgIExPRyhJTkZPKSA8PCAiQ3JlYXRpbmcgc29mdHdhcmUgQ29kZWMyIHNlcnZpY2UuLi4iOworICAgIGFuZHJvaWQ6OnNwPElDb21wb25lbnRTdG9yZT4gc3RvcmUgPQorICAgICAgICBuZXcgdXRpbHM6OkNvbXBvbmVudFN0b3JlKAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKSk7CisgICAgaWYgKHN0b3JlID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PAorICAgICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIHNvZnR3YXJlIENvZGVjMiBzZXJ2aWNlLiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHN0b3JlLT5yZWdpc3RlckFzU2VydmljZSgic29mdHdhcmUiKSAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PAorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlZ2lzdGVyIHNvZnR3YXJlIENvZGVjMiBzZXJ2aWNlLiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0coSU5GTykgPDwKKyAgICAgICAgICAgICAgICAgICAgIlNvZnR3YXJlIENvZGVjMiBzZXJ2aWNlIGNyZWF0ZWQuIjsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMteDg2LnBvbGljeQppbmRleCBiNGY1ZWU5Li44NDVmODRiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMteDg2LnBvbGljeQorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMteDg2LnBvbGljeQpAQCAtMTgsMTQgKzE4LDIwIEBACiBvcGVuYXQ6IDEKIG9wZW46IDEKIGdldHVpZDMyOiAxCitnZXR1aWQ6IDEKK2dldHJsaW1pdDogMQogd3JpdGV2OiAxCiBpb2N0bDogMQogY2xvc2U6IDEKIG1tYXAyOiAxCittbWFwOiAxCiBmc3RhdDY0OiAxCitmc3RhdDogMQogc3RhdDY0OiAxCitzdGF0ZnM2NDogMQogbWFkdmlzZTogMQogZnN0YXRhdDY0OiAxCituZXdmc3RhdGF0OiAxCiBmdXRleDogMQogbXVubWFwOiAxCiBmYWNjZXNzYXQ6IDEKQEAgLTQyLDYgKzQ4LDcgQEAKIHJlYWRsaW5rYXQ6IDEKIF9sbHNlZWs6IDEKIGZzdGF0ZnM2NDogMQorZnN0YXRmczogMQogcHJlYWQ2NDogMQogbXJlbWFwOiAxCiBkdXA6IDEKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybS5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm0ucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyY2VkYmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm0ucG9saWN5CkBAIC0wLDAgKzEsNjMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2Z1dGV4OiAxCisjIGlvY3RsIGNhbGxzIGFyZSBmaWx0ZXJlZCB2aWEgdGhlIHNlbGludXggcG9saWN5LgoraW9jdGw6IDEKK3NjaGVkX3lpZWxkOiAxCitjbG9zZTogMQorZHVwOiAxCitwcG9sbDogMQorbXByb3RlY3Q6IGFyZzIgaW4gflBST1RfRVhFQyB8fCBhcmcyIGluIH5QUk9UX1dSSVRFCittbWFwMjogYXJnMiBpbiB+UFJPVF9FWEVDIHx8IGFyZzIgaW4gflBST1RfV1JJVEUKK21lbWZkX2NyZWF0ZTogMQorZnRydW5jYXRlOiAxCitmdHJ1bmNhdGU2NDogMQorCisjIG1yZW1hcDogRW5zdXJlIHxmbGFnc3wgYXJlIChNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCkgVE9ETzogT25jZSBtaW5pamFpbAorIyBwYXJzZXIgc3VwcG9ydCBmb3IgJzwnIGlzIGluIHRoaXMgbmVlZHMgdG8gYmUgbW9kaWZpZWQgdG8gYWxzbyBwcmV2ZW50CisjIHxvbGRfYWRkcmVzc3wgYW5kIHxuZXdfYWRkcmVzc3wgZnJvbSB0b3VjaGluZyB0aGUgZXhjZXB0aW9uIHZlY3RvciBwYWdlLCB3aGljaAorIyBvbiBBUk0gaXMgc3RhdGljYWxseSBsb2FkZWQgYXQgMHhmZmZmIDAwMDAuIFNlZQorIyBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvaW5kZXguanNwP3RvcGljPS9jb20uYXJtLmRvYy5kZGkwMjExaC9CYWJmZWVnYS5odG1sCisjIGZvciBtb3JlIGRldGFpbHMuCittcmVtYXA6IGFyZzMgPT0gMworbXVubWFwOiAxCitwcmN0bDogMQorZ2V0dWlkMzI6IDEKK3dyaXRldjogMQorc2lnYWx0c3RhY2s6IDEKK2Nsb25lOiAxCitleGl0OiAxCitsc2VlazogMQorcnRfc2lncHJvY21hc2s6IDEKK29wZW5hdDogMQorZnN0YXQ2NDogMQord3JpdGU6IDEKK25hbm9zbGVlcDogMQorc2V0cHJpb3JpdHk6IDEKK3NldF90aWRfYWRkcmVzczogMQorZ2V0ZGVudHM2NDogMQorcmVhZGxpbmthdDogMQorcmVhZDogMQorcHJlYWQ2NDogMQorZnN0YXRmczY0OiAxCitnZXR0aW1lb2ZkYXk6IDEKK2ZhY2Nlc3NhdDogMQorX2xsc2VlazogMQorZnN0YXRhdDY0OiAxCit1Z2V0cmxpbWl0OiAxCitleGl0X2dyb3VwOiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK3J0X3NpZ3JldHVybjogMQorZ2V0cmFuZG9tOiAxCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm02NC5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm02NC5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhlY2FmNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybTY0LnBvbGljeQpAQCAtMCwwICsxLDY0IEBACisjIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitmdXRleDogMQorIyBpb2N0bCBjYWxscyBhcmUgZmlsdGVyZWQgdmlhIHRoZSBzZWxpbnV4IHBvbGljeS4KK2lvY3RsOiAxCitzY2hlZF95aWVsZDogMQorY2xvc2U6IDEKK2R1cDogMQorcHBvbGw6IDEKK21wcm90ZWN0OiBhcmcyIGluIH5QUk9UX0VYRUMgfHwgYXJnMiBpbiB+UFJPVF9XUklURQorbW1hcDogYXJnMiBpbiB+UFJPVF9FWEVDIHx8IGFyZzIgaW4gflBST1RfV1JJVEUKK2dldHVpZDogMQorZ2V0cmxpbWl0OiAxCitmc3RhdDogMQorbmV3ZnN0YXRhdDogMQorZnN0YXRmczogMQorbWVtZmRfY3JlYXRlOiAxCitmdHJ1bmNhdGU6IDEKK2Z0cnVuY2F0ZTY0OiAxCisKKyMgbXJlbWFwOiBFbnN1cmUgfGZsYWdzfCBhcmUgKE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVEKSBUT0RPOiBPbmNlIG1pbmlqYWlsCisjIHBhcnNlciBzdXBwb3J0IGZvciAnPCcgaXMgaW4gdGhpcyBuZWVkcyB0byBiZSBtb2RpZmllZCB0byBhbHNvIHByZXZlbnQKKyMgfG9sZF9hZGRyZXNzfCBhbmQgfG5ld19hZGRyZXNzfCBmcm9tIHRvdWNoaW5nIHRoZSBleGNlcHRpb24gdmVjdG9yIHBhZ2UsIHdoaWNoCisjIG9uIEFSTSBpcyBzdGF0aWNhbGx5IGxvYWRlZCBhdCAweGZmZmYgMDAwMC4gU2VlCisjIGh0dHA6Ly9pbmZvY2VudGVyLmFybS5jb20vaGVscC9pbmRleC5qc3A/dG9waWM9L2NvbS5hcm0uZG9jLmRkaTAyMTFoL0JhYmZlZWdhLmh0bWwKKyMgZm9yIG1vcmUgZGV0YWlscy4KK21yZW1hcDogYXJnMyA9PSAzCittdW5tYXA6IDEKK3ByY3RsOiAxCit3cml0ZXY6IDEKK3NpZ2FsdHN0YWNrOiAxCitjbG9uZTogMQorZXhpdDogMQorbHNlZWs6IDEKK3J0X3NpZ3Byb2NtYXNrOiAxCitvcGVuYXQ6IDEKK3dyaXRlOiAxCituYW5vc2xlZXA6IDEKK3NldHByaW9yaXR5OiAxCitzZXRfdGlkX2FkZHJlc3M6IDEKK2dldGRlbnRzNjQ6IDEKK3JlYWRsaW5rYXQ6IDEKK3JlYWQ6IDEKK3ByZWFkNjQ6IDEKK2dldHRpbWVvZmRheTogMQorZmFjY2Vzc2F0OiAxCitleGl0X2dyb3VwOiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK3J0X3NpZ3JldHVybjogMQorZ2V0cmFuZG9tOiAxCittYWR2aXNlOiAxCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLXg4Ni5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy14ODYucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmFiMjU5MmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy14ODYucG9saWN5CkBAIC0wLDAgKzEgQEAKK21lZGlhY29kZWMteDg2LnBvbGljeQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLXg4Nl82NC5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy14ODZfNjQucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmFiMjU5MmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy14ODZfNjQucG9saWN5CkBAIC0wLDAgKzEgQEAKK21lZGlhY29kZWMteDg2LnBvbGljeQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rCmluZGV4IGU4NzA5NjUuLjIyN2EyOWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5tawpAQCAtMjksNyArMjksOCBAQAogICAgIGxpYmhpZGxtZW1vcnkgXAogICAgIGxpYmhpZGx0cmFuc3BvcnQgXAogICAgIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xCisgICAgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIFwKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIKIAogTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvcgogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5tawppbmRleCA1MzQyODk4Li5mZDM0ZDViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQubWsKQEAgLTQsMTAgKzQsOSBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiBMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICBNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwIFwKLSAgICBNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuY3BwIFwKKyAgICBNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCiAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibWVkaWEgbGlic3RhZ2VmcmlnaHQgbGliYmluZGVyIGxpYnV0aWxzIGxpYmxvZworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJtZWRpYSBsaWJzdGFnZWZyaWdodCBsaWJiaW5kZXIgbGlidXRpbHMKIExPQ0FMX01PRFVMRTo9IGxpYm1lZGlhZXh0cmFjdG9yc2VydmljZQogaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQogCkBAIC0xOCwyOCArMTcsMTYgQEAKIExPQ0FMX1JFUVVJUkVEX01PRFVMRVNfYXJtIDo9IGNyYXNoX2R1bXAucG9saWN5IG1lZGlhZXh0cmFjdG9yLnBvbGljeQogTE9DQUxfUkVRVUlSRURfTU9EVUxFU19hcm02NCA6PSBjcmFzaF9kdW1wLnBvbGljeSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKIExPQ0FMX1JFUVVJUkVEX01PRFVMRVNfeDg2IDo9IGNyYXNoX2R1bXAucG9saWN5IG1lZGlhZXh0cmFjdG9yLnBvbGljeQotCi0jIGV4dHJhY3RvciBsaWJyYXJpZXMKLUxPQ0FMX1JFUVVJUkVEX01PRFVMRVMgKz0gXAotICAgIGxpYmFhY2V4dHJhY3RvciBcCi0gICAgbGliYW1yZXh0cmFjdG9yIFwKLSAgICBsaWJmbGFjZXh0cmFjdG9yIFwKLSAgICBsaWJtaWRpZXh0cmFjdG9yIFwKLSAgICBsaWJta3ZleHRyYWN0b3IgXAotICAgIGxpYm1wM2V4dHJhY3RvciBcCi0gICAgbGlibXA0ZXh0cmFjdG9yIFwKLSAgICBsaWJtcGVnMmV4dHJhY3RvciBcCi0gICAgbGlib2dnZXh0cmFjdG9yIFwKLSAgICBsaWJ3YXZleHRyYWN0b3IgXAorTE9DQUxfUkVRVUlSRURfTU9EVUxFU194ODZfNjQgOj0gY3Jhc2hfZHVtcC5wb2xpY3kgbWVkaWFleHRyYWN0b3IucG9saWN5CiAKIExPQ0FMX1NSQ19GSUxFUyA6PSBtYWluX2V4dHJhY3RvcnNlcnZpY2UuY3BwCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYm1lZGlhIGxpYm1lZGlhZXh0cmFjdG9yc2VydmljZSBsaWJiaW5kZXIgbGlidXRpbHMgXAotICAgIGxpYmxvZyBsaWJiYXNlIGxpYmFuZHJvaWRpY3UgbGliYXZzZXJ2aWNlc19taW5pamFpbAotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJpY3VhbmRyb2lkX3V0aWxzCisgICAgbGlibG9nIGxpYmFuZHJvaWRpY3UgbGliYXZzZXJ2aWNlc19taW5pamFpbAogTE9DQUxfTU9EVUxFOj0gbWVkaWFleHRyYWN0b3IKIExPQ0FMX0lOSVRfUkMgOj0gbWVkaWFleHRyYWN0b3IucmMKIExPQ0FMX0NfSU5DTFVERVMgOj0gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYQogTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKK0xPQ0FMX1NBTklUSVpFIDo9IHNjdWRvCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIAogIyBzZXJ2aWNlIHNlY2NvbXAgZmlsdGVyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAppbmRleCBmMGY0NGY1Li5kZTVjM2U0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KQEAgLTMwLDYgKzI5LDkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitNZWRpYUV4dHJhY3RvclNlcnZpY2U6Ok1lZGlhRXh0cmFjdG9yU2VydmljZSgpCisgICAgICAgIDogQm5NZWRpYUV4dHJhY3RvclNlcnZpY2UoKSB7IH0KKwogc3A8SU1lZGlhRXh0cmFjdG9yPiBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Om1ha2VFeHRyYWN0b3IoCiAgICAgICAgIGNvbnN0IHNwPElEYXRhU291cmNlPiAmcmVtb3RlU291cmNlLCBjb25zdCBjaGFyICptaW1lKSB7CiAgICAgQUxPR1YoIkBAQCBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Om1ha2VFeHRyYWN0b3IgZm9yICVzIiwgbWltZSk7CkBAIC01NSw2ICs1NywxMCBAQAogICAgIHJldHVybiBDcmVhdGVJRGF0YVNvdXJjZUZyb21EYXRhU291cmNlKHNvdXJjZSk7CiB9CiAKK3N0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjpnZXRTdXBwb3J0ZWRUeXBlcygpIHsKKyAgICByZXR1cm4gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnZXRTdXBwb3J0ZWRUeXBlcygpOworfQorCiBzdGF0dXNfdCBNZWRpYUV4dHJhY3RvclNlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CiAgICAgcmV0dXJuIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6ZHVtcChmZCwgYXJncykgfHwgZHVtcEV4dHJhY3RvcnMoZmQsIGFyZ3MpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaAppbmRleCA5ZGYzZWNkLi5jOWNlYmNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaApAQCAtMjcsNyArMjcsNyBAQAogewogICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPE1lZGlhRXh0cmFjdG9yU2VydmljZT47ICAgIC8vIGZvciBNZWRpYUV4dHJhY3RvclNlcnZpY2UoKQogcHVibGljOgotICAgIE1lZGlhRXh0cmFjdG9yU2VydmljZSgpIDogQm5NZWRpYUV4dHJhY3RvclNlcnZpY2UoKSB7IH0KKyAgICBNZWRpYUV4dHJhY3RvclNlcnZpY2UoKTsKICAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvclNlcnZpY2UoKSB7IH0KICAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpIHsgfQogCkBAIC0zNyw2ICszNyw4IEBACiAKICAgICB2aXJ0dWFsIHNwPElEYXRhU291cmNlPiBtYWtlSURhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogCisgICAgdmlydHVhbCBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGdldFN1cHBvcnRlZFR5cGVzKCk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczYTY5OC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UiCi0jZGVmaW5lIExPR19OREVCVUcgMAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+Ci0KLSNpbmNsdWRlICJNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLQotYmluZGVyOjpTdGF0dXMgTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlOjpsb2FkUGx1Z2lucyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBhcGtQYXRoKSB7Ci0gICAgQUxPR1YoImxvYWRQbHVnaW5zICVzIiwgYXBrUGF0aC5jX3N0cigpKTsKLSAgICBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkxvYWRQbHVnaW5zKGFwa1BhdGgpOwotICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKLX0KLQotfSAgIC8vIG5hbWVzcGFjZSBtZWRpYQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTE1ZjZkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX01FRElBX0VYVFJBQ1RPUl9VUERBVEVfU0VSVklDRV9ICi0jZGVmaW5lIEFORFJPSURfTUVESUFfRVhUUkFDVE9SX1VQREFURV9TRVJWSUNFX0gKLQotI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9Cbk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbWVkaWEgewotCi1jbGFzcyBNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UKLSAgICA6IHB1YmxpYyBCaW5kZXJTZXJ2aWNlPE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZT4sIHB1YmxpYyBCbk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZQotewotICAgIGZyaWVuZCBjbGFzcyBCaW5kZXJTZXJ2aWNlPE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZT47Ci1wdWJsaWM6Ci0gICAgTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlKCkgOiBCbk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZSgpIHsgfQotICAgIHZpcnR1YWwgfk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZSgpIHsgfQotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXRTZXJ2aWNlTmFtZSgpIHsgcmV0dXJuICJtZWRpYS5leHRyYWN0b3IudXBkYXRlIjsgfQotICAgIGJpbmRlcjo6U3RhdHVzIGxvYWRQbHVnaW5zKGNvbnN0IDo6c3RkOjpzdHJpbmcmIGFwa1BhdGgpOwotfTsKLQotfSAgIC8vIG5hbWVzcGFjZSBtZWRpYQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9FWFRSQUNUT1JfVVBEQVRFX1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21haW5fZXh0cmFjdG9yc2VydmljZS5jcHAKaW5kZXggOGQzMzU5YS4uMDZiNTMyZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tYWluX2V4dHJhY3RvcnNlcnZpY2UuY3BwCkBAIC0xNSw2ICsxNSw3IEBACiAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCiAKKyNpbmNsdWRlIDxhaWN1L0FJY3UuaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CkBAIC0yOSw5ICszMCw3IEBACiAjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgogCiAvLyBmcm9tIExPQ0FMX0NfSU5DTFVERVMKLSNpbmNsdWRlICJJY3VVdGlscy5oIgogI2luY2x1ZGUgIk1lZGlhRXh0cmFjdG9yU2VydmljZS5oIgotI2luY2x1ZGUgIk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oIgogI2luY2x1ZGUgIk1lZGlhVXRpbHMuaCIKICNpbmNsdWRlICJtaW5pamFpbC5oIgogCkBAIC00Miw2ICs0MSwxMiBAQAogc3RhdGljIGNvbnN0IGNoYXIga1ZlbmRvclNlY2NvbXBQb2xpY3lQYXRoW10gPQogICAgICAgICAiL3ZlbmRvci9ldGMvc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IucG9saWN5IjsKIAorLy8gRGlzYWJsZSBTY3VkbydzIG1pc21hdGNoIGFsbG9jYXRpb24gY2hlY2ssIGFzIGl0IGlzIGJlaW5nIHRyaWdnZXJlZAorLy8gYnkgc29tZSB0aGlyZCBwYXJ0eSBjb2RlLgorZXh0ZXJuICJDIiBjb25zdCBjaGFyICpfX3NjdWRvX2RlZmF1bHRfb3B0aW9ucygpIHsKKyAgICByZXR1cm4gIkRlYWxsb2NhdGlvblR5cGVNaXNtYXRjaD1mYWxzZSI7Cit9CisKIGludCBtYWluKGludCBhcmdjIF9fdW51c2VkLCBjaGFyKiogYXJndikKIHsKICAgICBsaW1pdFByb2Nlc3NNZW1vcnkoCkBAIC01OSwxOCArNjQsMTMgQEAKIAogICAgIFNldFVwTWluaWphaWwoa1N5c3RlbVNlY2NvbXBQb2xpY3lQYXRoLCBrVmVuZG9yU2VjY29tcFBvbGljeVBhdGgpOwogCi0gICAgSW5pdGlhbGl6ZUljdU9yRGllKCk7CisgICAgQUljdV9pbml0aWFsaXplSWN1T3JEaWUoKTsKIAogICAgIHN0cmNweShhcmd2WzBdLCAibWVkaWEuZXh0cmFjdG9yIik7CiAgICAgc3A8UHJvY2Vzc1N0YXRlPiBwcm9jKFByb2Nlc3NTdGF0ZTo6c2VsZigpKTsKICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CiAgICAgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwogCi0gICAgc3RkOjpzdHJpbmcgdmFsdWUgPSBiYXNlOjpHZXRQcm9wZXJ0eSgicm8uYnVpbGQudHlwZSIsICJ1bmtub3duIik7Ci0gICAgaWYgKHZhbHVlID09ICJ1c2VyZGVidWciIHx8IHZhbHVlID09ICJlbmciKSB7Ci0gICAgICAgIG1lZGlhOjpNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2U6Omluc3RhbnRpYXRlKCk7Ci0gICAgfQotCiAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmpvaW5UaHJlYWRQb29sKCk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODZfNjQucG9saWN5IGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IteDg2XzY0LnBvbGljeQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDMyMjk5ZjMuLjYwN2EwM2UKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IteDg2XzY0LnBvbGljeQorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODZfNjQucG9saWN5CkBAIC0yMiw2ICsyMiw4IEBACiBnZXR1aWQ6IDEKIHNldHByaW9yaXR5OiAxCiBzaWdhbHRzdGFjazogMQorZnN0YXQ6IDEKK2ZzdGF0ZnM6IDEKIG5ld2ZzdGF0YXQ6IDEKIHJlc3RhcnRfc3lzY2FsbDogMQogZXhpdDogMQpAQCAtMzEsMjggKzMzLDIxIEBACiBzY2hlZF9zZXRzY2hlZHVsZXI6IDEKIGdldHJsaW1pdDogMQogbmFub3NsZWVwOiAxCitnZXRyYW5kb206IDEKKworIyBmb3IgZHluYW1pY2FsbHkgbG9hZGluZyBleHRyYWN0b3JzCitnZXRkZW50czY0OiAxCityZWFkbGlua2F0OiAxCitwcmVhZDY0OiAxCittcmVtYXA6IDEKIAogIyBmb3IgRmlsZVNvdXJjZQogcmVhZGxpbmthdDogMQogCi0jIGZvciBhdHRhY2hpbmcgdG8gZGVidWdnZXJkIG9uIHByb2Nlc3MgY3Jhc2gKLXRna2lsbDogMQotc29ja2V0OiBhcmcwID09IDEKLWNvbm5lY3Q6IDEKLWZjbnRsOiAxCi1ydF9zaWdwcm9jbWFzazogMQotcnRfc2lnYWN0aW9uOiAxCi1ydF90Z3NpZ3F1ZXVlaW5mbzogMQotZ2V0ZXVpZDogMQotZ2V0Z2lkOiAxCi1nZXRlZ2lkOiAxCi1nZXRncm91cHM6IDEKLWdldGRlbnRzNjQ6IDEKLXBpcGUyOiAxCi1wcG9sbDogMQotCiAjIFJlcXVpcmVkIGJ5IEFkZHJlc3NTYW5pdGl6ZXIKIGdldHRpZDogMQogc2NoZWRfeWllbGQ6IDEKIGdldHBpZDogMQogZ2V0dGlkOiAxCisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAueDg2XzY0LnBvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAKaW5kZXggMjllNmRmYy4uYmVlNWQyNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwCkBAIC0xMCw3ICsxMCw3IEBACiAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibmJhaW8iLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCiAgICAgICAgICJsaWJuYmxvZyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwCmluZGV4IDFiZTU1NDQuLjkwMmFmNjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcApAQCAtMjAsOCArMjAsOSBAQAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25DYWNoZS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL01lcmdlci5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSAiTWVkaWFMb2dTZXJ2aWNlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTUzLDI3ICs1NCwyOCBAQAogCiB2b2lkIE1lZGlhTG9nU2VydmljZTo6cmVnaXN0ZXJXcml0ZXIoY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZCwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0gICAgaWYgKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSAhPSBBSURfQVVESU9TRVJWRVIgfHwgc2hhcmVkID09IDAgfHwKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkgfHwgc2hhcmVkID09IDAgfHwKICAgICAgICAgICAgIHNpemUgPCBrTWluU2l6ZSB8fCBzaXplID4ga01heFNpemUgfHwgbmFtZSA9PSBOVUxMIHx8CiAgICAgICAgICAgICBzaGFyZWQtPnNpemUoKSA8IE5CTG9nOjpUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHNwPE5CTG9nOjpSZWFkZXI+IHJlYWRlcihuZXcgTkJMb2c6OlJlYWRlcihzaGFyZWQsIHNpemUpKTsKLSAgICBOQkxvZzo6TmFtZWRSZWFkZXIgbmFtZWRSZWFkZXIocmVhZGVyLCBuYW1lKTsKKyAgICBzcDxOQkxvZzo6UmVhZGVyPiByZWFkZXIobmV3IE5CTG9nOjpSZWFkZXIoc2hhcmVkLCBzaXplLCBuYW1lKSk7IC8vIFJlYWRlciBoYW5kbGVkIGJ5IG1lcmdlcgorICAgIHNwPE5CTG9nOjpEdW1wUmVhZGVyPiBkdW1wUmVhZGVyKG5ldyBOQkxvZzo6RHVtcFJlYWRlcihzaGFyZWQsIHNpemUsIG5hbWUpKTsgLy8gZm9yIGR1bXBzeXMKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1OYW1lZFJlYWRlcnMuYWRkKG5hbWVkUmVhZGVyKTsKLSAgICBtTWVyZ2VyLmFkZFJlYWRlcihuYW1lZFJlYWRlcik7CisgICAgbUR1bXBSZWFkZXJzLmFkZChkdW1wUmVhZGVyKTsKKyAgICBtTWVyZ2VyLmFkZFJlYWRlcihyZWFkZXIpOwogfQogCiB2b2lkIE1lZGlhTG9nU2VydmljZTo6dW5yZWdpc3RlcldyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkKQogewotICAgIGlmIChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkgIT0gQUlEX0FVRElPU0VSVkVSIHx8IHNoYXJlZCA9PSAwKSB7CisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpIHx8IHNoYXJlZCA9PSAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OYW1lZFJlYWRlcnMuc2l6ZSgpOyApIHsKLSAgICAgICAgaWYgKG1OYW1lZFJlYWRlcnNbaV0ucmVhZGVyKCktPmlzSU1lbW9yeShzaGFyZWQpKSB7Ci0gICAgICAgICAgICBtTmFtZWRSZWFkZXJzLnJlbW92ZUF0KGkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUR1bXBSZWFkZXJzLnNpemUoKTsgKSB7CisgICAgICAgIGlmIChtRHVtcFJlYWRlcnNbaV0tPmlzSU1lbW9yeShzaGFyZWQpKSB7CisgICAgICAgICAgICBtRHVtcFJlYWRlcnMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICAvLyBUT0RPIG1NZXJnZXIucmVtb3ZlUmVhZGVycyhzaGFyZWQpCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpKys7CiAgICAgICAgIH0KQEAgLTk1LDEwICs5Nyw4IEBACiAKIHN0YXR1c190IE1lZGlhTG9nU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7Ci0gICAgLy8gRklYTUUgbWVyZ2Ugd2l0aCBzaW1pbGFyIGJ1dCBub3QgaWRlbnRpY2FsIGNvZGUgYXQgc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCi0gICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNEdW1wKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOwotICAgIGlmICghKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSA9PSBBSURfQVVESU9TRVJWRVIgfHwKLSAgICAgICAgICAgIFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzRHVtcCkpKSB7CisgICAgaWYgKCEoaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKQorICAgICAgICAgICAgfHwgZHVtcEFsbG93ZWQoKSkpIHsKICAgICAgICAgZHByaW50ZihmZCwgIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIG1lZGlhLmxvZyBmcm9tIHBpZD0lZCwgdWlkPSVkXG4iLAogICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwpAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgaWYgKGFyZ3Muc2l6ZSgpID4gMCkgewogICAgICAgICBjb25zdCBTdHJpbmc4IGFyZzAoYXJnc1swXSk7CiAgICAgICAgIGlmICghc3RyY21wKGFyZzAuc3RyaW5nKCksICItciIpKSB7Ci0gICAgICAgICAgICAvLyBuZWVkZWQgYmVjYXVzZSBtTmFtZWRSZWFkZXJzIGlzIHByb3RlY3RlZCBieSBtTG9jaworICAgICAgICAgICAgLy8gbmVlZGVkIGJlY2F1c2UgbVJlYWRlcnMgaXMgcHJvdGVjdGVkIGJ5IG1Mb2NrCiAgICAgICAgICAgICBib29sIGxvY2tlZCA9IGR1bXBUcnlMb2NrKG1Mb2NrKTsKIAogICAgICAgICAgICAgLy8gZmFpbGVkIHRvIGxvY2sgLSBNZWRpYUxvZ1NlcnZpY2UgaXMgcHJvYmFibHkgZGVhZGxvY2tlZApAQCAtMTE5LDIxICsxMTksMjIgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IiwgcmVzdWx0LnN0cmluZygpKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBzaG91bGQgd2UgaW5zdGVhZCBwcm9jZWVkIHRvIG1NZXJnZVJlYWRlci5kdW1wPyBkb2VzIGl0IG5lZWQgbG9jaz8KICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgbmFtZWRSZWFkZXIgOiBtTmFtZWRSZWFkZXJzKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmR1bXBSZWFkZXIgOiBtRHVtcFJlYWRlcnMpIHsKICAgICAgICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiXG4lczpcbiIsIG5hbWVkUmVhZGVyLm5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJcbiVzOlxuIiwgZHVtcFJlYWRlci0+bmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBkdW1wUmVhZGVyLT5kdW1wKGZkLCAwIC8qaW5kZW50Ki8pOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dJKCIlczoiLCBuYW1lZFJlYWRlci5uYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiJXM6IiwgZHVtcFJlYWRlci0+bmFtZSgpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU1lcmdlUmVhZGVyLmR1bXAoZmQsIGFyZ3MpOwogICAgICAgICB9CiAgICAgfQotICAgIG1NZXJnZVJlYWRlci5kdW1wKGZkKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmgKaW5kZXggYzk0NWQxZi4uMjFkZjg5OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhTG9nU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL01lcmdlci5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTU1LDcgKzU2LDcgQEAKIAogICAgIE11dGV4ICAgICAgICAgICAgICAgbUxvY2s7CiAKLSAgICBWZWN0b3I8TkJMb2c6Ok5hbWVkUmVhZGVyPiBtTmFtZWRSZWFkZXJzOyAgIC8vIHByb3RlY3RlZCBieSBtTG9jaworICAgIFZlY3RvcjxzcDxOQkxvZzo6RHVtcFJlYWRlcj4+IG1EdW1wUmVhZGVyczsgICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKIAogICAgIC8vIEZJWE1FIE5lZWQgY29tbWVudHMgb24gYWxsIG9mIHRoZXNlLCBlc3BlY2lhbGx5IGFib3V0IGxvY2tpbmcKICAgICBOQkxvZzo6U2hhcmVkICptTWVyZ2VyU2hhcmVkOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQuYnAKaW5kZXggMWM2M2Y2NC4uZjMzMzlhMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLmJwCkBAIC0xNiw4ICsxNiw2IEBACiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCiAKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAotCiAgICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvaW5jbHVkZSJdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcAppbmRleCBlMGRiMjYxLi5hMWZjMGVhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAKQEAgLTE0MCw5ICsxNDAsOCBAQAogfQogCiBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6b3BlbkVuZHBvaW50KEFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlKSB7Ci0gICAgaWYgKHNoYXJpbmdNb2RlID09IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CisgICAgaWYgKHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkuZ2V0U2hhcmluZ01vZGUoKSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkgewogICAgICAgICByZXR1cm4gb3BlbkV4Y2x1c2l2ZUVuZHBvaW50KGF1ZGlvU2VydmljZSwgcmVxdWVzdCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIG9wZW5TaGFyZWRFbmRwb2ludChhdWRpb1NlcnZpY2UsIHJlcXVlc3QpOwpAQCAtMTczLDcgKzE3Miw3IEBACiAKICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGVuZHBvaW50LT5vcGVuKHJlcXVlc3QpOwogICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgQUxPR0UoIm9wZW5FeGNsdXNpdmVFbmRwb2ludCgpLCBvcGVuIGZhaWxlZCIpOworICAgICAgICAgICAgQUxPR1YoIm9wZW5FeGNsdXNpdmVFbmRwb2ludCgpLCBvcGVuIGZhaWxlZCIpOwogICAgICAgICAgICAgZW5kcG9pbnQuY2xlYXIoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1FeGNsdXNpdmVTdHJlYW1zLnB1c2hfYmFjayhlbmRwb2ludE1NYXApOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaAppbmRleCAxOTNiZGVlLi5iYTE3ODUzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaApAQCAtNTYsOCArNTYsNyBAQAogICAgICAqIEByZXR1cm4gZW5kcG9pbnQgb3IgbnVsbAogICAgICAqLwogICAgIGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gb3BlbkVuZHBvaW50KGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpOwogCiAgICAgdm9pZCBjbG9zZUVuZHBvaW50KGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gc2VydmljZUVuZHBvaW50KTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuY3BwCmluZGV4IGIwMzE4ODguLjFjMDNiN2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5jcHAKQEAgLTk5LDcgKzk5LDcgQEAKICAgICAgICAgfQogICAgICAgICBwYXJ0SW5kZXgrKzsKICAgICB9Ci0gICAgZmlmby0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmFkdmFuY2VSZWFkSW5kZXgoZnJhbWVzRGVzaXJlZCk7CisgICAgZmlmby0+YWR2YW5jZVJlYWRJbmRleChmcmFtZXNEZXNpcmVkKTsKIAogI2lmIEFBVURJT19NSVhFUl9BVFJBQ0VfRU5BQkxFRAogICAgIEFUUkFDRV9FTkQoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAKaW5kZXggMDE4MmEyNy4uMmZiYWViNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZU1lc3NhZ2UuaCIKQEAgLTMzLDcgKzM0LDYgQEAKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaCIKICNpbmNsdWRlICJiaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CkBAIC0xMTgsMTcgKzExOCwyMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gaWYgU0hBUkVEIHJlcXVlc3RlZCBvciBpZiBFWENMVVNJVkUgZmFpbGVkCi0gICAgaWYgKHNoYXJpbmdNb2RlID09IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVECi0gICAgICAgICB8fCAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyICYmICFzaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQpKSB7CisgICAgLy8gVHJ5IFNIQVJFRCBpZiBTSEFSRUQgcmVxdWVzdGVkIG9yIGlmIEVYQ0xVU0lWRSBmYWlsZWQuCisgICAgaWYgKHNoYXJpbmdNb2RlID09IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKSB7CiAgICAgICAgIHNlcnZpY2VTdHJlYW0gPSAgbmV3IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQoKnRoaXMpOwogICAgICAgICByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5vcGVuKHJlcXVlc3QpOworICAgIH0gZWxzZSBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyICYmICFzaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQpIHsKKyAgICAgICAgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0IG1vZGlmaWVkUmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgIC8vIE92ZXJ3cml0ZSB0aGUgb3JpZ2luYWwgRVhDTFVTSVZFIG1vZGUgd2l0aCBTSEFSRUQuCisgICAgICAgIG1vZGlmaWVkUmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0U2hhcmluZ01vZGUoQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpOworICAgICAgICBzZXJ2aWNlU3RyZWFtID0gIG5ldyBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkKCp0aGlzKTsKKyAgICAgICAgcmVzdWx0ID0gc2VydmljZVN0cmVhbS0+b3Blbihtb2RpZmllZFJlcXVlc3QpOwogICAgIH0KIAogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIHNlcnZpY2VTdHJlYW0uY2xlYXIoKTsKLSAgICAgICAgQUxPR0UoIm9wZW5TdHJlYW0oKTogZmFpbGVkLCByZXR1cm4gJWQgPSAlcyIsCi0gICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIEFMT0dXKCJvcGVuU3RyZWFtKCk6IGZhaWxlZCwgcmV0dXJuICVkID0gJXMiLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0gZWxzZSB7CiAgICAgICAgIGFhdWRpb19oYW5kbGVfdCBoYW5kbGUgPSBtU3RyZWFtVHJhY2tlci5hZGRTdHJlYW1Gb3JIYW5kbGUoc2VydmljZVN0cmVhbS5nZXQoKSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcAppbmRleCA2OTA2OGY1Li40ZGZiNjJhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAKQEAgLTM4LDEwICszOCw2IEBACiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsgIC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOyAgIC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCiAKLUFBdWRpb1NlcnZpY2VFbmRwb2ludDo6fkFBdWRpb1NlcnZpY2VFbmRwb2ludCgpIHsKLSAgICBBTE9HRCgiJXMoJXApIGRlc3Ryb3llZCIsIF9fZnVuY19fLCB0aGlzKTsKLX0KLQogc3RkOjpzdHJpbmcgQUF1ZGlvU2VydmljZUVuZHBvaW50OjpkdW1wKCkgY29uc3QgewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKIApAQCAtNTksNiArNTUsNyBAQAogICAgIHJlc3VsdCA8PCAiICAgIERldmljZSBJZDogICAgICAgICAgICAiIDw8IGdldERldmljZUlkKCkgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBTYW1wbGUgUmF0ZTogICAgICAgICAgIiA8PCBnZXRTYW1wbGVSYXRlKCkgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBDaGFubmVsIENvdW50OiAgICAgICAgIiA8PCBnZXRTYW1wbGVzUGVyRnJhbWUoKSA8PCAiXG4iOworICAgIHJlc3VsdCA8PCAiICAgIEZvcm1hdDogICAgICAgICAgICAgICAiIDw8IGdldEZvcm1hdCgpIDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgRnJhbWVzIFBlciBCdXJzdDogICAgICIgPDwgbUZyYW1lc1BlckJ1cnN0IDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgVXNhZ2U6ICAgICAgICAgICAgICAgICIgPDwgZ2V0VXNhZ2UoKSA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIENvbnRlbnRUeXBlOiAgICAgICAgICAiIDw8IGdldENvbnRlbnRUeXBlKCkgPDwgIlxuIjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmgKaW5kZXggYTEzNGExMy4uMzYxNmZhMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmgKQEAgLTQxLDcgKzQxLDcgQEAKICAgICAgICAgLCBwdWJsaWMgQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyB7CiBwdWJsaWM6CiAKLSAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlRW5kcG9pbnQoKTsKKyAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlRW5kcG9pbnQoKSA9IGRlZmF1bHQ7CiAKICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGR1bXAoKSBjb25zdDsKIApAQCAtMTIxLDcgKzEyMSw3IEBACiAgICAgbXV0YWJsZSBzdGQ6Om11dGV4ICAgICAgIG1Mb2NrU3RyZWFtczsKICAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4+IG1SZWdpc3RlcmVkU3RyZWFtczsKIAotICAgIFNpbXBsZURvdWJsZUJ1ZmZlcjxUaW1lc3RhbXA+ICBtQXRvbWljVGltZXN0YW1wOworICAgIFNpbXBsZURvdWJsZUJ1ZmZlcjxUaW1lc3RhbXA+ICBtQXRvbWljRW5kcG9pbnRUaW1lc3RhbXA7CiAKICAgICBhbmRyb2lkOjpBdWRpb0NsaWVudCAgICAgbU1tYXBDbGllbnQ7ICAgLy8gc2V0IGluIG9wZW4sIHVzZWQgaW4gb3BlbiBhbmQgc3RhcnRTdHJlYW0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcAppbmRleCBjYzk0MmY0Li4zN2QxMDViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcApAQCAtODIsOCArODIsOSBAQAogCiAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tTdHJlYW1zKTsKICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50U3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaWVudFN0cmVhbS0+aXNSdW5uaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50U3RyZWFtLT5pc1J1bm5pbmcoKSAmJiAhY2xpZW50U3RyZWFtLT5pc1N1c3BlbmRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY2xpZW50RnJhbWVzV3JpdHRlbiA9IDA7CisKICAgICAgICAgICAgICAgICAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD4gc3RyZWFtU2hhcmVkID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkICo+KGNsaWVudFN0cmVhbS5nZXQoKSk7CiAKQEAgLTEwMiw3ICsxMDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNoYXJlZC0+c2V0VGltZXN0YW1wUG9zaXRpb25PZmZzZXQocG9zaXRpb25PZmZzZXQpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXMgdGhlIGJ1ZmZlciB0b28gZnVsbCB0byB3cml0ZSBhIGJ1cnN0PwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWZvLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSA8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZm8tPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCkgPAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RnJhbWVzUGVyQnVyc3QoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TaGFyZWQtPmluY3JlbWVudFhSdW5Db3VudCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCmluZGV4IDVhNDI5YzkuLjZjMjgwODMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCkBAIC0xMDEsOCArMTAxLDYgQEAKICAgICAgICAgICAgIC5mbGFncyA9IEFVRElPX0ZMQUdfTE9XX0xBVEVOQ1ksCiAgICAgICAgICAgICAudGFncyA9ICIiCiAgICAgfTsKLSAgICBBTE9HRCgiJXMoJXApIE1NQVAgYXR0cmlidXRlcy51c2FnZSA9ICVkLCBjb250ZW50X3R5cGUgPSAlZCwgc291cmNlID0gJWQiLAotICAgICAgICAgIF9fZnVuY19fLCB0aGlzLCBhdHRyaWJ1dGVzLnVzYWdlLCBhdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSwgYXR0cmlidXRlcy5zb3VyY2UpOwogCiAgICAgbU1tYXBDbGllbnQuY2xpZW50VWlkID0gcmVxdWVzdC5nZXRVc2VySWQoKTsKICAgICBtTW1hcENsaWVudC5jbGllbnRQaWQgPSByZXF1ZXN0LmdldFByb2Nlc3NJZCgpOwpAQCAtMTExLDExICsxMDksMTEgQEAKICAgICBtUmVxdWVzdGVkRGV2aWNlSWQgPSBkZXZpY2VJZCA9IGdldERldmljZUlkKCk7CiAKICAgICAvLyBGaWxsIGluIGNvbmZpZwotICAgIGFhdWRpb19mb3JtYXRfdCBhYXVkaW9Gb3JtYXQgPSBnZXRGb3JtYXQoKTsKLSAgICBpZiAoYWF1ZGlvRm9ybWF0ID09IEFBVURJT19VTlNQRUNJRklFRCB8fCBhYXVkaW9Gb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgYWF1ZGlvRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2OworICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0gZ2V0Rm9ybWF0KCk7CisgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUIHx8IGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgYXVkaW9Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICB9Ci0gICAgY29uZmlnLmZvcm1hdCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChhYXVkaW9Gb3JtYXQpOworICAgIGNvbmZpZy5mb3JtYXQgPSBhdWRpb0Zvcm1hdDsKIAogICAgIGludDMyX3QgYWF1ZGlvU2FtcGxlUmF0ZSA9IGdldFNhbXBsZVJhdGUoKTsKICAgICBpZiAoYWF1ZGlvU2FtcGxlUmF0ZSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKQEAgLTE2MywxMiArMTYxLDEyIEBACiAgICAgQUxPR0QoIiVzKCkgbU1hcENsaWVudC51aWQgPSAlZCwgcGlkID0gJWQgPT4gcG9ydEhhbmRsZSA9ICVkXG4iLAogICAgICAgICAgIF9fZnVuY19fLCBtTW1hcENsaWVudC5jbGllbnRVaWQsICBtTW1hcENsaWVudC5jbGllbnRQaWQsIG1Qb3J0SGFuZGxlKTsKICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpIG9wZW5NbWFwU3RyZWFtKCkgcmV0dXJuZWQgc3RhdHVzICVkIiwgIF9fZnVuY19fLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoKSAtIG9wZW5NbWFwU3RyZWFtKCkgcmV0dXJuZWQgc3RhdHVzICVkIiwgIF9fZnVuY19fLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwogICAgIH0KIAogICAgIGlmIChkZXZpY2VJZCA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgQUxPR1coIiVzKCkgb3Blbk1tYXBTdHJlYW0oKSBmYWlsZWQgdG8gc2V0IGRldmljZUlkIiwgX19mdW5jX18pOworICAgICAgICBBTE9HVygiJXMoKSAtIG9wZW5NbWFwU3RyZWFtKCkgZmFpbGVkIHRvIHNldCBkZXZpY2VJZCIsIF9fZnVuY19fKTsKICAgICB9CiAgICAgc2V0RGV2aWNlSWQoZGV2aWNlSWQpOwogCkBAIC0yMTAsOSArMjA4LDYgQEAKICAgICAgICAgdWlkX3QgYXVkaW9TZXJ2aWNlVWlkID0gZ2V0dWlkKCk7CiAgICAgICAgIGlmICgobU1tYXBDbGllbnQuY2xpZW50VWlkICE9IGF1ZGlvU2VydmljZVVpZCkgJiYKICAgICAgICAgICAgIGdldFNoYXJpbmdNb2RlKCkgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpIHsKLSAgICAgICAgICAgIC8vIEZhbGxiYWNrIGlzIGhhbmRsZWQgYnkgY2FsbGVyIGJ1dCBpbmRpY2F0ZSB3aGF0IGlzIHBvc3NpYmxlIGluIGNhc2UKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgdXNlZCBpbiB0aGUgZnV0dXJlCi0gICAgICAgICAgICBzZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCk7CiAgICAgICAgICAgICBBTE9HVygiJXMoKSAtIGV4Y2x1c2l2ZSBGRCBjYW5ub3QgYmUgdXNlZCBieSBjbGllbnQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwpAQCAtMjMzLDcgKzIyOCw3IEBACiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1NbWFwQnVmZmVyaW5mby5idXJzdF9zaXplX2ZyYW1lczsKLSAgICBzZXRGb3JtYXQoQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9EYXRhRm9ybWF0KGNvbmZpZy5mb3JtYXQpKTsKKyAgICBzZXRGb3JtYXQoY29uZmlnLmZvcm1hdCk7CiAgICAgc2V0U2FtcGxlUmF0ZShjb25maWcuc2FtcGxlX3JhdGUpOwogCiAgICAgLy8gU2NhbGUgdXAgdGhlIGJ1cnN0IHNpemUgdG8gbWVldCB0aGUgbWluaW11bSBlcXVpdmFsZW50IGluIG1pY3Jvc2Vjb25kcy4KQEAgLTI1Myw2ICsyNDgsOSBAQAogICAgICAgICAgICIsIGRldmljZUlkID0gJWQsIGNhcGFjaXR5ID0gJWRcbiIsCiAgICAgICAgICAgX19mdW5jX18sIGdldFNhbXBsZVJhdGUoKSwgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGRldmljZUlkLCBnZXRCdWZmZXJDYXBhY2l0eSgpKTsKIAorICAgIEFMT0dEKCIlcygpIGZvcm1hdCA9ID14JTA4eCwgZnJhbWUgc2l6ZSA9ICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywgZ2V0Rm9ybWF0KCksIGNhbGN1bGF0ZUJ5dGVzUGVyRnJhbWUoKSk7CisKICAgICByZXR1cm4gcmVzdWx0OwogCiBlcnJvcjoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAKaW5kZXggZWJiYTMyZC4uMWUxYzU1MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAKQEAgLTQ3LDEwICs0Nyw2IEBACiAgICAgbVN0cmVhbUludGVybmFsID0gJm1TdHJlYW1JbnRlcm5hbFBsYXk7CiB9CiAKLUFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXk6On5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KCkgewotICAgIEFMT0dEKCIlcyglcCkgZGVzdHJveWVkIiwgX19mdW5jX18sIHRoaXMpOwotfQotCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheTo6b3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpvcGVuKHJlcXVlc3QpOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CkBAIC04OCw2ICs4NCwxMCBAQAogICAgICAgICAgICAgICAgIGludDY0X3QgY2xpZW50RnJhbWVzUmVhZCA9IDA7CiAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd1VuZGVyZmxvdyA9IHRydWU7CiAKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50U3RyZWFtLT5pc1N1c3BlbmRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBkZWFkIHN0cmVhbQorICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSA9IGNsaWVudFN0cmVhbS0+Z2V0U3RhdGUoKTsKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORykgewogICAgICAgICAgICAgICAgICAgICBhbGxvd1VuZGVyZmxvdyA9IGZhbHNlOyAvLyBqdXN0IHJlYWQgd2hhdCBpcyBhbHJlYWR5IGluIHRoZSBGSUZPCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmgKaW5kZXggYTBhMzgzYy4uOTgxZTQzMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaApAQCAtMzksNyArMzksNiBAQAogY2xhc3MgQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheSA6IHB1YmxpYyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQgewogcHVibGljOgogICAgIGV4cGxpY2l0IEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlKTsKLSAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KCk7CiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIG92ZXJyaWRlOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcAppbmRleCBmYzlmMTU1Li4wYTQxNWZkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAKQEAgLTc4LDYgKzc4LDcgQEAKICAgICBzZXRTYW1wbGVzUGVyRnJhbWUobVN0cmVhbUludGVybmFsLT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CiAgICAgc2V0RGV2aWNlSWQobVN0cmVhbUludGVybmFsLT5nZXREZXZpY2VJZCgpKTsKICAgICBzZXRTZXNzaW9uSWQobVN0cmVhbUludGVybmFsLT5nZXRTZXNzaW9uSWQoKSk7CisgICAgc2V0Rm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOyAvLyBmb3JjZSBmb3IgbWl4ZXIKICAgICBtRnJhbWVzUGVyQnVyc3QgPSBtU3RyZWFtSW50ZXJuYWwtPmdldEZyYW1lc1BlckJ1cnN0KCk7CiAKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMTgwLDggKzE4MSw4IEBACiAvLyBHZXQgdGltZXN0YW1wIHRoYXQgd2FzIHdyaXR0ZW4gYnkgdGhlIHJlYWwtdGltZSBzZXJ2aWNlIHRocmVhZCwgZWcuIG1peGVyLgogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6Z2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgewotICAgIGlmIChtQXRvbWljVGltZXN0YW1wLmlzVmFsaWQoKSkgewotICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1RpbWVzdGFtcC5yZWFkKCk7CisgICAgaWYgKG1BdG9taWNFbmRwb2ludFRpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKKyAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNFbmRwb2ludFRpbWVzdGFtcC5yZWFkKCk7CiAgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpOwogICAgICAgICAqdGltZU5hbm9zID0gdGltZXN0YW1wLmdldE5hbm9zZWNvbmRzKCk7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCmluZGV4IGQ2NzE3MTAuLmJmYzE3NDQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCkBAIC01Miw4ICs1Miw3IEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0VGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgKmNhbGxiYWNrTG9vcCgpID0gMDsKLQorICAgIHZpcnR1YWwgdm9pZCAgICpjYWxsYmFja0xvb3AoKSA9IDA7CiAKIHByb3RlY3RlZDoKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwCmluZGV4IDlhZjhhZjMuLmIxNmI1ZGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAKQEAgLTQzLDcgKzQzLDcgQEAKIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZShBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpCiAgICAgICAgIDogbVVwTWVzc2FnZVF1ZXVlKG51bGxwdHIpCiAgICAgICAgICwgbVRpbWVzdGFtcFRocmVhZCgiQUFUaW1lIikKLSAgICAgICAgLCBtQXRvbWljVGltZXN0YW1wKCkKKyAgICAgICAgLCBtQXRvbWljU3RyZWFtVGltZXN0YW1wKCkKICAgICAgICAgLCBtQXVkaW9TZXJ2aWNlKGF1ZGlvU2VydmljZSkgewogICAgIG1NbWFwQ2xpZW50LmNsaWVudFVpZCA9IC0xOwogICAgIG1NbWFwQ2xpZW50LmNsaWVudFBpZCA9IC0xOwpAQCAtNTEsNyArNTEsNiBAQAogfQogCiBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6fkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKCkgewotICAgIEFMT0dEKCJ+QUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoKSBkZXN0cm95aW5nICVwIiwgdGhpcyk7CiAgICAgLy8gSWYgdGhlIHN0cmVhbSBpcyBkZWxldGVkIHdoZW4gT1BFTiBvciBpbiB1c2UgdGhlbiBhdWRpbyByZXNvdXJjZXMgd2lsbCBsZWFrLgogICAgIC8vIFRoaXMgd291bGQgaW5kaWNhdGUgYW4gaW50ZXJuYWwgZXJyb3IuIFNvIHdlIHdhbnQgdG8gZmluZCB0aGlzIEFTQVAuCiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQKQEAgLTgxLDggKzgwLDcgQEAKICAgICByZXR1cm4gcmVzdWx0LnN0cigpOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgeworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgewogICAgIEFBdWRpb0VuZHBvaW50TWFuYWdlciAmbUVuZHBvaW50TWFuYWdlciA9IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogCkBAIC0xMDksMTAgKzEwNyw4IEBACiAgICAgICAgIC8vIHJlZmVyZW5jZWQgdW50aWwgdGhlIHNlcnZpY2UgcmV0dXJucyBhIGhhbmRsZSB0byB0aGUgY2xpZW50LgogICAgICAgICAvLyBTbyBvbmx5IG9uZSB0aHJlYWQgY2FuIG9wZW4gYSBzdHJlYW0uCiAgICAgICAgIG1TZXJ2aWNlRW5kcG9pbnQgPSBtRW5kcG9pbnRNYW5hZ2VyLm9wZW5FbmRwb2ludChtQXVkaW9TZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJpbmdNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QpOwogICAgICAgICBpZiAobVNlcnZpY2VFbmRwb2ludCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXMoKSBvcGVuRW5kcG9pbnQoKSBmYWlsZWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CkBAIC0xODMsOSArMTc5LDEwIEBACiAgICAgfQogCiAgICAgc2V0Rmxvd2luZyhmYWxzZSk7CisgICAgc2V0U3VzcGVuZGVkKGZhbHNlKTsKIAogICAgIC8vIFN0YXJ0IHdpdGggZnJlc2ggcHJlc2VudGF0aW9uIHRpbWVzdGFtcHMuCi0gICAgbUF0b21pY1RpbWVzdGFtcC5jbGVhcigpOworICAgIG1BdG9taWNTdHJlYW1UaW1lc3RhbXAuY2xlYXIoKTsKIAogICAgIG1DbGllbnRIYW5kbGUgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgIHJlc3VsdCA9IHN0YXJ0RGV2aWNlKCk7CkBAIC0yOTQsMTYgKzI5MSwyMCBAQAogfQogCiAvLyBpbXBsZW1lbnQgUnVubmFibGUsIHBlcmlvZGljYWxseSBzZW5kIHRpbWVzdGFtcHMgdG8gY2xpZW50CitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKIHZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnJ1bigpIHsKICAgICBBTE9HRCgiJXMoKSAlcyBlbnRlcmluZyA+Pj4+Pj4+Pj4+Pj4+PiBUSU1FU1RBTVBTIiwgX19mdW5jX18sIGdldFR5cGVUZXh0KCkpOwogICAgIFRpbWVzdGFtcFNjaGVkdWxlciB0aW1lc3RhbXBTY2hlZHVsZXI7CiAgICAgdGltZXN0YW1wU2NoZWR1bGVyLnNldEJ1cnN0UGVyaW9kKG1GcmFtZXNQZXJCdXJzdCwgZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICB0aW1lc3RhbXBTY2hlZHVsZXIuc3RhcnQoQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7CiAgICAgaW50NjRfdCBuZXh0VGltZSA9IHRpbWVzdGFtcFNjaGVkdWxlci5uZXh0QWJzb2x1dGVUaW1lKCk7CisgICAgaW50MzJfdCBsb29wQ291bnQgPSAwOwogICAgIHdoaWxlKG1UaHJlYWRFbmFibGVkLmxvYWQoKSkgeworICAgICAgICBsb29wQ291bnQrKzsKICAgICAgICAgaWYgKEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkgPj0gbmV4dFRpbWUpIHsKICAgICAgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZW5kQ3VycmVudFRpbWVzdGFtcCgpOwogICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMoKSB0aW1lc3RhbXAgdGhyZWFkIGdvdCByZXN1bHQgPSAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbmV4dFRpbWUgPSB0aW1lc3RhbXBTY2hlZHVsZXIubmV4dEFic29sdXRlVGltZSgpOwpAQCAtMzEzLDcgKzMxNCw4IEBACiAgICAgICAgICAgICBBdWRpb0Nsb2NrOjpzbGVlcFVudGlsTmFub1RpbWUobmV4dFRpbWUpOwogICAgICAgICB9CiAgICAgfQotICAgIEFMT0dEKCIlcygpICVzIGV4aXRpbmcgPDw8PDw8PDw8PDw8PDwgVElNRVNUQU1QUyIsIF9fZnVuY19fLCBnZXRUeXBlVGV4dCgpKTsKKyAgICBBTE9HRCgiJXMoKSAlcyBleGl0aW5nIGFmdGVyICVkIGxvb3BzIDw8PDw8PDw8PDw8PDw8IFRJTUVTVEFNUFMiLAorICAgICAgICAgIF9fZnVuY19fLCBnZXRUeXBlVGV4dCgpLCBsb29wQ291bnQpOwogfQogCiB2b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpkaXNjb25uZWN0KCkgewpAQCAtMzQ5LDcgKzM1MSw5IEBACiAgICAgfQogICAgIGludDMyX3QgY291bnQgPSBtVXBNZXNzYWdlUXVldWUtPmdldEZpZm9CdWZmZXIoKS0+d3JpdGUoY29tbWFuZCwgMSk7CiAgICAgaWYgKGNvdW50ICE9IDEpIHsKLSAgICAgICAgQUxPR0UoIiVzKCk6IFF1ZXVlIGZ1bGwuIERpZCBjbGllbnQgZGllPyAlcyIsIF9fZnVuY19fLCBnZXRUeXBlVGV4dCgpKTsKKyAgICAgICAgQUxPR1coIiVzKCk6IFF1ZXVlIGZ1bGwuIERpZCBjbGllbnQgc3RvcD8gU3VzcGVuZGluZyBzdHJlYW0uIHdoYXQgPSAldSwgJXMiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgY29tbWFuZC0+d2hhdCwgZ2V0VHlwZVRleHQoKSk7CisgICAgICAgIHNldFN1c3BlbmRlZCh0cnVlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9XT1VMRF9CTE9DSzsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gQUFVRElPX09LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgKaW5kZXggYTE4MTVkMC4uZmZjNzY4YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oCkBAIC0yMDQsNiArMjA0LDIwIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0IGZhbHNlIHdoZW4gdGhlIHN0cmVhbSBzaG91bGQgbm90IGxvbmdlciBiZSBwcm9jZXNzZWQuCisgICAgICogVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IGEgbWVzc2FnZSBxdWV1ZSBvdmVyZmxvdy4KKyAgICAgKiBTZXQgdHJ1ZSB3aGVuIHN0cmVhbSBpcyBzdGFydGVkLgorICAgICAqIEBwYXJhbSBzdXNwZW5kZWQKKyAgICAgKi8KKyAgICB2b2lkIHNldFN1c3BlbmRlZChib29sIHN1c3BlbmRlZCkgeworICAgICAgICBtU3VzcGVuZGVkID0gc3VzcGVuZGVkOworICAgIH0KKworICAgIGJvb2wgaXNTdXNwZW5kZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU3VzcGVuZGVkOworICAgIH0KKworICAgIC8qKgogICAgICAqIEF0b21pY2FsbHkgaW5jcmVtZW50IHRoZSBudW1iZXIgb2YgYWN0aXZlIHJlZmVyZW5jZXMgdG8gdGhlIHN0cmVhbSBieSBBQXVkaW9TZXJ2aWNlLgogICAgICAqCiAgICAgICogVGhpcyBpcyBjYWxsZWQgdW5kZXIgYSBnbG9iYWwgbG9jayBpbiBBQXVkaW9TdHJlYW1UcmFja2VyLgpAQCAtMjg3LDcgKzMwMSw3IEBACiAgICAgLy8gVE9ETyByZW5hbWUgbUNsaWVudEhhbmRsZSB0byBtUG9ydEhhbmRsZSB0byBiZSBtb3JlIGNvbnNpc3RlbnQgd2l0aCBBdWRpb0ZsaW5nZXIuCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbUNsaWVudEhhbmRsZSA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAKLSAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY1RpbWVzdGFtcDsKKyAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY1N0cmVhbVRpbWVzdGFtcDsKIAogICAgIGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJm1BdWRpb1NlcnZpY2U7CiAKQEAgLTMwNCw3ICszMTgsMTIgQEAKICAgICAvLyBUaGlzIGlzIG1vZGlmaWVkIHVuZGVyIGEgZ2xvYmFsIGxvY2sgaW4gQUF1ZGlvU3RyZWFtVHJhY2tlci4KICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtQ2FsbGluZ0NvdW50ID0gMDsKIAorICAgIC8vIFRoaXMgaW5kaWNhdGVzIHRoYXQgYSBzdHJlYW0gdGhhdCBpcyBiZWluZyByZWZlcmVuY2VkIGJ5IGEgYmluZGVyIGNhbGwgbmVlZHMgdG8gY2xvc2VkLgogICAgIHN0ZDo6YXRvbWljPGJvb2w+ICAgICAgIG1DbG9zZU5lZWRlZHtmYWxzZX07CisKKyAgICAvLyBUaGlzIGluZGljYXRlIHRoYXQgYSBydW5uaW5nIHN0cmVhbSBzaG91bGQgbm90IGJlIHByb2Nlc3NlZCBiZWNhdXNlIG9mIGFuIGVycm9yLAorICAgIC8vIGZvciBleGFtcGxlIGEgZnVsbCBtZXNzYWdlIHF1ZXVlLiBOb3RlIHRoYXQgdGhpcyBhdG9taWMgaXMgdW5yZWxhdGVkIHRvIG1DbG9zZU5lZWRlZC4KKyAgICBzdGQ6OmF0b21pYzxib29sPiAgICAgICBtU3VzcGVuZGVke2ZhbHNlfTsKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwCmluZGV4IGM4NDUzMDkuLjgzN2IwODAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAKQEAgLTY0LDggKzY0LDEzIEBACiAKICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUD4ga2VlcCh0aGlzKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbihyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSk7CisgICAgaWYgKHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkuZ2V0U2hhcmluZ01vZGUoKSAhPSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkgeworICAgICAgICBBTE9HRSgiJXMoKSBzaGFyaW5nTW9kZSBtaXNtYXRjaCAlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICByZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpLmdldFNoYXJpbmdNb2RlKCkpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgIH0KKworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbihyZXF1ZXN0KTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTE1Nyw3ICsxNjIsNyBAQAogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlRW5kcG9pbnRNTUFQLT5nZXRGcmVlUnVubmluZ1Bvc2l0aW9uKHBvc2l0aW9uRnJhbWVzLCB0aW1lTmFub3MpOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CiAgICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAoKnBvc2l0aW9uRnJhbWVzLCAqdGltZU5hbm9zKTsKLSAgICAgICAgbUF0b21pY1RpbWVzdGFtcC53cml0ZSh0aW1lc3RhbXApOworICAgICAgICBtQXRvbWljU3RyZWFtVGltZXN0YW1wLndyaXRlKHRpbWVzdGFtcCk7CiAgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpOwogICAgICAgICAqdGltZU5hbm9zID0gdGltZXN0YW1wLmdldE5hbm9zZWNvbmRzKCk7CiAgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFKSB7CkBAIC0xNzksOCArMTg0LDggQEAKICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAgKj4oZW5kcG9pbnQuZ2V0KCkpOwogCiAgICAgLy8gVE9ETyBHZXQgcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBmcm9tIHRoZSBIQUwKLSAgICBpZiAobUF0b21pY1RpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKLSAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNUaW1lc3RhbXAucmVhZCgpOworICAgIGlmIChtQXRvbWljU3RyZWFtVGltZXN0YW1wLmlzVmFsaWQoKSkgeworICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1N0cmVhbVRpbWVzdGFtcC5yZWFkKCk7CiAgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpOwogICAgICAgICAqdGltZU5hbm9zID0gdGltZXN0YW1wLmdldE5hbm9zZWNvbmRzKCkgKyBzZXJ2aWNlRW5kcG9pbnRNTUFQLT5nZXRIYXJkd2FyZVRpbWVPZmZzZXROYW5vcygpOwogICAgICAgICByZXR1cm4gQUFVRElPX09LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAppbmRleCAwNWM1NzM1Li4xNDc0MmRkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcApAQCAtMTIwLDkgKzEyMCwxNCBAQAogCiAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD4ga2VlcCh0aGlzKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbihyZXF1ZXN0LCBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCk7CisgICAgaWYgKHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkuZ2V0U2hhcmluZ01vZGUoKSAhPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCkgeworICAgICAgICBBTE9HRSgiJXMoKSBzaGFyaW5nTW9kZSBtaXNtYXRjaCAlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICByZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpLmdldFNoYXJpbmdNb2RlKCkpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgIH0KKworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbihyZXF1ZXN0KTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICBBTE9HRSgiJXMoKSByZXR1cm5lZCAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApAQCAtMTM2LDEwICsxNDEsMTAgQEAKIAogICAgIC8vIElzIHRoZSByZXF1ZXN0IGNvbXBhdGlibGUgd2l0aCB0aGUgc2hhcmVkIGVuZHBvaW50PwogICAgIHNldEZvcm1hdChjb25maWd1cmF0aW9uSW5wdXQuZ2V0Rm9ybWF0KCkpOwotICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIHNldEZvcm1hdChBQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7Ci0gICAgfSBlbHNlIGlmIChnZXRGb3JtYXQoKSAhPSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICBBTE9HRCgiJXMoKSBtQXVkaW9Gb3JtYXQgPSAlZCwgbmVlZCBGTE9BVCIsIF9fZnVuY19fLCBnZXRGb3JtYXQoKSk7CisgICAgaWYgKGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgIHNldEZvcm1hdChBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICB9IGVsc2UgaWYgKGdldEZvcm1hdCgpICE9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgYXVkaW9fZm9ybWF0X3QgbUF1ZGlvRm9ybWF0ID0gJWQsIG5lZWQgRkxPQVQiLCBfX2Z1bmNfXywgZ2V0Rm9ybWF0KCkpOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5WQUxJRF9GT1JNQVQ7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQpAQCAtMTQ4LDcgKzE1Myw3IEBACiAgICAgaWYgKGdldFNhbXBsZVJhdGUoKSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKICAgICAgICAgc2V0U2FtcGxlUmF0ZShlbmRwb2ludC0+Z2V0U2FtcGxlUmF0ZSgpKTsKICAgICB9IGVsc2UgaWYgKGdldFNhbXBsZVJhdGUoKSAhPSBlbmRwb2ludC0+Z2V0U2FtcGxlUmF0ZSgpKSB7Ci0gICAgICAgIEFMT0dEKCIlcygpIG1TYW1wbGVSYXRlID0gJWQsIG5lZWQgJWQiLAorICAgICAgICBBTE9HRSgiJXMoKSBtU2FtcGxlUmF0ZSA9ICVkLCBuZWVkICVkIiwKICAgICAgICAgICAgICAgX19mdW5jX18sIGdldFNhbXBsZVJhdGUoKSwgZW5kcG9pbnQtPmdldFNhbXBsZVJhdGUoKSk7CiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlZBTElEX1JBVEU7CiAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC0xNTgsNyArMTYzLDcgQEAKICAgICBpZiAoZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CiAgICAgICAgIHNldFNhbXBsZXNQZXJGcmFtZShlbmRwb2ludC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOwogICAgIH0gZWxzZSBpZiAoZ2V0U2FtcGxlc1BlckZyYW1lKCkgIT0gZW5kcG9pbnQtPmdldFNhbXBsZXNQZXJGcmFtZSgpKSB7Ci0gICAgICAgIEFMT0dEKCIlcygpIG1TYW1wbGVzUGVyRnJhbWUgPSAlZCwgbmVlZCAlZCIsCisgICAgICAgIEFMT0dFKCIlcygpIG1TYW1wbGVzUGVyRnJhbWUgPSAlZCwgbmVlZCAlZCIsCiAgICAgICAgICAgICAgIF9fZnVuY19fLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZW5kcG9pbnQtPmdldFNhbXBsZXNQZXJGcmFtZSgpKTsKICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICAgICAgZ290byBlcnJvcjsKQEAgLTE4NSw4ICsxOTAsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6Om9wZW4oKSBhY3R1YWwgcmF0ZSA9ICVkLCBjaGFubmVscyA9ICVkLCBkZXZpY2VJZCA9ICVkIiwKLSAgICAgICAgICBnZXRTYW1wbGVSYXRlKCksIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBlbmRwb2ludC0+Z2V0RGV2aWNlSWQoKSk7CisgICAgQUxPR0QoIiVzKCkgYWN0dWFsIHJhdGUgPSAlZCwgY2hhbm5lbHMgPSAlZCwgZGV2aWNlSWQgPSAlZCIsCisgICAgICAgICAgX19mdW5jX18sIGdldFNhbXBsZVJhdGUoKSwgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGVuZHBvaW50LT5nZXREZXZpY2VJZCgpKTsKIAogICAgIHJlc3VsdCA9IGVuZHBvaW50LT5yZWdpc3RlclN0cmVhbShrZWVwKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewpAQCAtMjMzLDE1ICsyMzgsMTUgQEAKIH0KIAogdm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjptYXJrVHJhbnNmZXJUaW1lKFRpbWVzdGFtcCAmdGltZXN0YW1wKSB7Ci0gICAgbUF0b21pY1RpbWVzdGFtcC53cml0ZSh0aW1lc3RhbXApOworICAgIG1BdG9taWNTdHJlYW1UaW1lc3RhbXAud3JpdGUodGltZXN0YW1wKTsKIH0KIAogLy8gR2V0IHRpbWVzdGFtcCB0aGF0IHdhcyB3cml0dGVuIGJ5IG1peGVyIG9yIGRpc3RyaWJ1dG9yLgogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKICAgICAvLyBUT0RPIEdldCBwcmVzZW50YXRpb24gdGltZXN0YW1wIGZyb20gdGhlIEhBTAotICAgIGlmIChtQXRvbWljVGltZXN0YW1wLmlzVmFsaWQoKSkgewotICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1RpbWVzdGFtcC5yZWFkKCk7CisgICAgaWYgKG1BdG9taWNTdHJlYW1UaW1lc3RhbXAuaXNWYWxpZCgpKSB7CisgICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljU3RyZWFtVGltZXN0YW1wLnJlYWQoKTsKICAgICAgICAgKnBvc2l0aW9uRnJhbWVzID0gdGltZXN0YW1wLmdldFBvc2l0aW9uKCk7CiAgICAgICAgICp0aW1lTmFub3MgPSB0aW1lc3RhbXAuZ2V0TmFub3NlY29uZHMoKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IDU4NGIyZWYuLjNkNWYxNDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5tawpAQCAtNTMsNyArNTMsNiBAQAogICAgIGxpYmJpbmRlciBcCiAgICAgbGliY3V0aWxzIFwKICAgICBsaWJtZWRpYXV0aWxzIFwKLSAgICBsaWJzZXJ2aWNldXRpbGl0eSBcCiAgICAgbGlidXRpbHMgXAogICAgIGxpYmxvZwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMjI4M2EKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDU0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYnNvdW5kdHJpZ2dlcnNlcnZpY2UiLAorCisgICAgc3JjczogWworICAgICAgICAiU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcCIsCisgICAgICAgICJTb3VuZFRyaWdnZXJIYWxIaWRsLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJoYXJkd2FyZSIsCisgICAgICAgICJsaWJzb3VuZHRyaWdnZXIiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmF1ZGlvaGFsIiwKKyAgICAgICAgImxpYmF1ZGlvaGFsX2RlYXRoaGFuZGxlciIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnNvdW5kdHJpZ2dlckAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuc291bmR0cmlnZ2VyQDIuMiIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzY2NmUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotaWZlcSAoJChTT1VORF9UUklHR0VSX1VTRV9TVFVCX01PRFVMRSksIDEpCi0gICAgaWZuZXEgKCQoVVNFX0xFR0FDWV9MT0NBTF9BVURJT19IQUwpLCB0cnVlKQotICAgICAgICAkKGVycm9yIFJlcXVpcmVzIGJ1aWxkaW5nIHdpdGggVVNFX0xFR0FDWV9MT0NBTF9BVURJT19IQUw9dHJ1ZSkKLSAgICBlbmRpZgotICAgIExPQ0FMX0NGTEFHUyArPSAtRFNPVU5EX1RSSUdHRVJfVVNFX1NUVUJfTU9EVUxFCi1lbmRpZgotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKLSAgICBTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGliYmluZGVyIFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYmhhcmR3YXJlIFwKLSAgICBsaWJzb3VuZHRyaWdnZXIgXAotICAgIGxpYmF1ZGlvY2xpZW50IFwKLSAgICBsaWJzZXJ2aWNldXRpbGl0eQotCi0KLWlmZXEgKCQoVVNFX0xFR0FDWV9MT0NBTF9BVURJT19IQUwpLHRydWUpCi0jIGxpYmhhcmR3YXJlIGNvbmZpZ3VyYXRpb24KLUxPQ0FMX1NSQ19GSUxFUyArPSAgICAgICAgICAgICAgIFwKLSAgICBTb3VuZFRyaWdnZXJIYWxMZWdhY3kuY3BwCi1lbHNlCi0jIFRyZWJsZSBjb25maWd1cmF0aW9uCi1MT0NBTF9TUkNfRklMRVMgKz0gICAgICAgICAgICAgICBcCi0gICAgU291bmRUcmlnZ2VySGFsSGlkbC5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCi0gICAgbGliaHdiaW5kZXIgXAotICAgIGxpYmhpZGxiYXNlIFwKLSAgICBsaWJoaWRsbWVtb3J5IFwKLSAgICBsaWJoaWRsdHJhbnNwb3J0IFwKLSAgICBsaWJiYXNlIFwKLSAgICBsaWJhdWRpb2hhbCBcCi0gICAgbGliYXVkaW9oYWxfZGVhdGhoYW5kbGVyIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLnNvdW5kdHJpZ2dlckAyLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuc291bmR0cmlnZ2VyQDIuMSBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wIFwKLSAgICBhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCBcCi0gICAgYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAKLWVuZGlmCi0KLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIKLQotTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKLQotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKLQotTE9DQUxfTU9EVUxFOj0gbGlic291bmR0cmlnZ2Vyc2VydmljZQotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5jcHAgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5jcHAKaW5kZXggYWRmMjUyZS4uNjhkNTRjNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuY3BwCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmNwcApAQCAtMTY4LDE4ICsxNjgsMjMgQEAKICAgICBpbnQgcmV0OwogICAgIFNvdW5kTW9kZWxIYW5kbGUgaGFsSGFuZGxlOwogICAgIHNwPFYyXzFfSVNvdW5kVHJpZ2dlckh3PiBzb3VuZHRyaWdnZXJfMl8xID0gdG9TZXJ2aWNlMl8xKHNvdW5kdHJpZ2dlcik7CisgICAgc3A8VjJfMl9JU291bmRUcmlnZ2VySHc+IHNvdW5kdHJpZ2dlcl8yXzIgPSB0b1NlcnZpY2UyXzIoc291bmR0cmlnZ2VyKTsKICAgICBpZiAoc291bmRfbW9kZWwtPnR5cGUgPT0gU09VTkRfTU9ERUxfVFlQRV9LRVlQSFJBU0UpIHsKLSAgICAgICAgaWYgKCFzb3VuZHRyaWdnZXJfMl8xKSB7Ci0gICAgICAgICAgICBJU291bmRUcmlnZ2VySHc6OlBocmFzZVNvdW5kTW9kZWwgaGFsU291bmRNb2RlbDsKLSAgICAgICAgICAgIGNvbnZlcnRQaHJhc2VTb3VuZE1vZGVsVG9IYWwoJmhhbFNvdW5kTW9kZWwsIHNvdW5kX21vZGVsKTsKLSAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKLSAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXItPmxvYWRQaHJhc2VTb3VuZE1vZGVsKAotICAgICAgICAgICAgICAgICAgICBoYWxTb3VuZE1vZGVsLAotICAgICAgICAgICAgICAgICAgICB0aGlzLCBtb2RlbElkLCBbJl0oaW50MzJfdCByZXR2YWwsIGF1dG8gcmVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXR2YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSByZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc291bmR0cmlnZ2VyXzJfMikgeworICAgICAgICAgICAgVjJfMl9JU291bmRUcmlnZ2VySHc6OlBocmFzZVNvdW5kTW9kZWwgaGFsU291bmRNb2RlbDsKKyAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gY29udmVydFBocmFzZVNvdW5kTW9kZWxUb0hhbCgmaGFsU291bmRNb2RlbCwgc291bmRfbW9kZWwpOworICAgICAgICAgICAgaWYgKHJlc3VsdC5maXJzdCkgeworICAgICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKKyAgICAgICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyXzJfMi0+bG9hZFBocmFzZVNvdW5kTW9kZWxfMl8xKAorICAgICAgICAgICAgICAgICAgICAgICAgaGFsU291bmRNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIG1vZGVsSWQsIFsmXShpbnQzMl90IHJldHZhbCwgYXV0byByZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsSGFuZGxlID0gcmVzOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc291bmR0cmlnZ2VyXzJfMSkgewogICAgICAgICAgICAgVjJfMV9JU291bmRUcmlnZ2VySHc6OlBocmFzZVNvdW5kTW9kZWwgaGFsU291bmRNb2RlbDsKICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gY29udmVydFBocmFzZVNvdW5kTW9kZWxUb0hhbCgmaGFsU291bmRNb2RlbCwgc291bmRfbW9kZWwpOwogICAgICAgICAgICAgaWYgKHJlc3VsdC5maXJzdCkgewpAQCAtMTkzLDE4ICsxOTgsMzIgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghc291bmR0cmlnZ2VyXzJfMSkgewotICAgICAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7Ci0gICAgICAgICAgICBjb252ZXJ0U291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBJU291bmRUcmlnZ2VySHc6OlBocmFzZVNvdW5kTW9kZWwgaGFsU291bmRNb2RlbDsKKyAgICAgICAgICAgIGNvbnZlcnRQaHJhc2VTb3VuZE1vZGVsVG9IYWwoJmhhbFNvdW5kTW9kZWwsIHNvdW5kX21vZGVsKTsKICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKLSAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXItPmxvYWRTb3VuZE1vZGVsKGhhbFNvdW5kTW9kZWwsCisgICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5sb2FkUGhyYXNlU291bmRNb2RlbCgKKyAgICAgICAgICAgICAgICAgICAgaGFsU291bmRNb2RlbCwKICAgICAgICAgICAgICAgICAgICAgdGhpcywgbW9kZWxJZCwgWyZdKGludDMyX3QgcmV0dmFsLCBhdXRvIHJlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0dmFsOwogICAgICAgICAgICAgICAgICAgICAgICAgaGFsSGFuZGxlID0gcmVzOwogICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzb3VuZHRyaWdnZXJfMl8yKSB7CisgICAgICAgICAgICBWMl8yX0lTb3VuZFRyaWdnZXJIdzo6U291bmRNb2RlbCBoYWxTb3VuZE1vZGVsOworICAgICAgICAgICAgYXV0byByZXN1bHQgPSBjb252ZXJ0U291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CisgICAgICAgICAgICBpZiAocmVzdWx0LmZpcnN0KSB7CisgICAgICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOworICAgICAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXJfMl8yLT5sb2FkU291bmRNb2RlbF8yXzEoaGFsU291bmRNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIG1vZGVsSWQsIFsmXShpbnQzMl90IHJldHZhbCwgYXV0byByZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsSGFuZGxlID0gcmVzOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc291bmR0cmlnZ2VyXzJfMSkgewogICAgICAgICAgICAgVjJfMV9JU291bmRUcmlnZ2VySHc6OlNvdW5kTW9kZWwgaGFsU291bmRNb2RlbDsKICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gY29udmVydFNvdW5kTW9kZWxUb0hhbCgmaGFsU291bmRNb2RlbCwgc291bmRfbW9kZWwpOwogICAgICAgICAgICAgaWYgKHJlc3VsdC5maXJzdCkgewpAQCAtMjE3LDYgKzIzNiwxNSBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7CisgICAgICAgICAgICBjb252ZXJ0U291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CisgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7CisgICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5sb2FkU291bmRNb2RlbChoYWxTb3VuZE1vZGVsLAorICAgICAgICAgICAgICAgICAgICB0aGlzLCBtb2RlbElkLCBbJl0oaW50MzJfdCByZXR2YWwsIGF1dG8gcmVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSByZXM7CisgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yODIsMTYgKzMxMCwyMCBAQAogICAgIG1vZGVsLT5tUmVjb2duaXRpb25Db29raWUgPSBjb29raWU7CiAKICAgICBzcDxWMl8xX0lTb3VuZFRyaWdnZXJIdz4gc291bmR0cmlnZ2VyXzJfMSA9IHRvU2VydmljZTJfMShzb3VuZHRyaWdnZXIpOworICAgIHNwPFYyXzJfSVNvdW5kVHJpZ2dlckh3PiBzb3VuZHRyaWdnZXJfMl8yID0gdG9TZXJ2aWNlMl8yKHNvdW5kdHJpZ2dlcik7CiAgICAgUmV0dXJuPGludDMyX3Q+IGhpZGxSZXR1cm4oMCk7CiAKLSAgICBpZiAoIXNvdW5kdHJpZ2dlcl8yXzEpIHsKLSAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpSZWNvZ25pdGlvbkNvbmZpZyBoYWxDb25maWc7Ci0gICAgICAgIGNvbnZlcnRSZWNvZ25pdGlvbkNvbmZpZ1RvSGFsKCZoYWxDb25maWcsIGNvbmZpZyk7Ci0gICAgICAgIHsKKyAgICBpZiAoc291bmR0cmlnZ2VyXzJfMikgeworICAgICAgICBWMl8yX0lTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcgaGFsQ29uZmlnOworICAgICAgICBhdXRvIHJlc3VsdCA9IGNvbnZlcnRSZWNvZ25pdGlvbkNvbmZpZ1RvSGFsKCZoYWxDb25maWcsIGNvbmZpZyk7CisgICAgICAgIGlmIChyZXN1bHQuZmlyc3QpIHsKICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKLSAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXItPnN0YXJ0UmVjb2duaXRpb24obW9kZWwtPm1IYWxIYW5kbGUsIGhhbENvbmZpZywgdGhpcywgaGFuZGxlKTsKKyAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXJfMl8yLT5zdGFydFJlY29nbml0aW9uXzJfMSgKKyAgICAgICAgICAgICAgICAgICAgbW9kZWwtPm1IYWxIYW5kbGUsIGhhbENvbmZpZywgdGhpcywgaGFuZGxlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgeworICAgIH0gZWxzZSBpZiAoc291bmR0cmlnZ2VyXzJfMSkgewogICAgICAgICBWMl8xX0lTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcgaGFsQ29uZmlnOwogICAgICAgICBhdXRvIHJlc3VsdCA9IGNvbnZlcnRSZWNvZ25pdGlvbkNvbmZpZ1RvSGFsKCZoYWxDb25maWcsIGNvbmZpZyk7CiAgICAgICAgIGlmIChyZXN1bHQuZmlyc3QpIHsKQEAgLTMwMSw2ICszMzMsMTMgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBJU291bmRUcmlnZ2VySHc6OlJlY29nbml0aW9uQ29uZmlnIGhhbENvbmZpZzsKKyAgICAgICAgY29udmVydFJlY29nbml0aW9uQ29uZmlnVG9IYWwoJmhhbENvbmZpZywgY29uZmlnKTsKKyAgICAgICAgeworICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOworICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlci0+c3RhcnRSZWNvZ25pdGlvbihtb2RlbC0+bUhhbEhhbmRsZSwgaGFsQ29uZmlnLCB0aGlzLCBoYW5kbGUpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKCFoaWRsUmV0dXJuLmlzT2soKSkgewpAQCAtMzU2LDYgKzM5NSwzOCBAQAogICAgIHJldHVybiBoaWRsUmV0dXJuOwogfQogCitpbnQgU291bmRUcmlnZ2VySGFsSGlkbDo6Z2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgc3A8SVNvdW5kVHJpZ2dlckh3PiBzb3VuZHRyaWdnZXIgPSBnZXRTZXJ2aWNlKCk7CisgICAgaWYgKHNvdW5kdHJpZ2dlciA9PSAwKSB7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIHNwPFYyXzJfSVNvdW5kVHJpZ2dlckh3PiBzb3VuZHRyaWdnZXJfMl8yID0gdG9TZXJ2aWNlMl8yKHNvdW5kdHJpZ2dlcik7CisgICAgaWYgKHNvdW5kdHJpZ2dlcl8yXzIgPT0gMCkgeworICAgICAgICBBTE9HRSgiZ2V0TW9kZWxTdGF0ZSBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIHNwPFNvdW5kTW9kZWw+IG1vZGVsID0gZ2V0TW9kZWwoaGFuZGxlKTsKKyAgICBpZiAobW9kZWwgPT0gMCkgeworICAgICAgICBBTE9HRSgiZ2V0TW9kZWxTdGF0ZSBtb2RlbCBub3QgZm91bmQgZm9yIGhhbmRsZSAldSIsIGhhbmRsZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGludCByZXQgPSBOT19FUlJPUjsKKyAgICBSZXR1cm48aW50MzJfdD4gaGlkbFJldHVybigwKTsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKKyAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlcl8yXzItPmdldE1vZGVsU3RhdGUobW9kZWwtPm1IYWxIYW5kbGUpOworICAgIH0KKyAgICBpZiAoIWhpZGxSZXR1cm4uaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJnZXRNb2RlbFN0YXRlIGVycm9yICVzIiwgaGlkbFJldHVybi5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXQgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKIFNvdW5kVHJpZ2dlckhhbEhpZGw6OlNvdW5kVHJpZ2dlckhhbEhpZGwoY29uc3QgY2hhciAqbW9kdWxlTmFtZSkKICAgICA6IG1Nb2R1bGVOYW1lKG1vZHVsZU5hbWUpLCBtTmV4dFVuaXF1ZUlkKDEpCiB7CkBAIC0zODgsNiArNDU5LDEyIEBACiAgICAgcmV0dXJuIGNhc3RSZXN1bHRfMl8xLmlzT2soKSA/IHN0YXRpY19jYXN0PHNwPFYyXzFfSVNvdW5kVHJpZ2dlckh3Pj4oY2FzdFJlc3VsdF8yXzEpIDogbnVsbHB0cjsKIH0KIAorc3A8VjJfMl9JU291bmRUcmlnZ2VySHc+IFNvdW5kVHJpZ2dlckhhbEhpZGw6OnRvU2VydmljZTJfMihjb25zdCBzcDxJU291bmRUcmlnZ2VySHc+JiBzKQoreworICAgIGF1dG8gY2FzdFJlc3VsdF8yXzIgPSBWMl8yX0lTb3VuZFRyaWdnZXJIdzo6Y2FzdEZyb20ocyk7CisgICAgcmV0dXJuIGNhc3RSZXN1bHRfMl8yLmlzT2soKSA/IHN0YXRpY19jYXN0PHNwPFYyXzJfSVNvdW5kVHJpZ2dlckh3Pj4oY2FzdFJlc3VsdF8yXzIpIDogbnVsbHB0cjsKK30KKwogc3A8U291bmRUcmlnZ2VySGFsSGlkbDo6U291bmRNb2RlbD4gU291bmRUcmlnZ2VySGFsSGlkbDo6Z2V0TW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmggYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5oCmluZGV4IDBiNDRhZTAuLmZiOWUzOWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmgKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuaApAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgIlNvdW5kVHJpZ2dlckhhbEludGVyZmFjZS5oIgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyLzIuMC90eXBlcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyLzIuMS9JU291bmRUcmlnZ2VySHcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3NvdW5kdHJpZ2dlci8yLjIvSVNvdW5kVHJpZ2dlckh3Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9zb3VuZHRyaWdnZXIvMi4wL0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9zb3VuZHRyaWdnZXIvMi4xL0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrLmg+CiAKQEAgLTQ2LDYgKzQ3LDggQEAKIHVzaW5nIFYyXzFfSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2sgPQogICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpzb3VuZHRyaWdnZXI6OlYyXzE6OklTb3VuZFRyaWdnZXJId0NhbGxiYWNrOwogdXNpbmcgOjphbmRyb2lkOjpoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnk7Cit1c2luZyBWMl8yX0lTb3VuZFRyaWdnZXJIdyA9CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnNvdW5kdHJpZ2dlcjo6VjJfMjo6SVNvdW5kVHJpZ2dlckh3OwogCiBjbGFzcyBTb3VuZFRyaWdnZXJIYWxIaWRsIDogcHVibGljIFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBWMl8xX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrCkBAIC05Miw2ICs5NSwxNCBAQAogICAgICAgICAgKi8KICAgICAgICAgdmlydHVhbCBpbnQgc3RvcEFsbFJlY29nbml0aW9ucygpOwogCisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIGdpdmVuIG1vZGVsLgorICAgICAgICAgKiBSZXR1cm5zIDAgb3IgYW4gZXJyb3IgY29kZS4gSWYgc3VjY2Vzc2Z1bCB0aGUgc3RhdGUgd2lsbCBiZSByZXR1cm5lZCBhc3luY2hyb25vdXNseQorICAgICAgICAgKiB2aWEgYSByZWNvZ25pdGlvbiBldmVudCBpbiB0aGUgY2FsbGJhY2sgbWV0aG9kIHRoYXQgd2FzIHJlZ2lzdGVyZWQgaW4gdGhlCisgICAgICAgICAqIHN0YXJ0UmVjb2duaXRpb24oKSBtZXRob2QuCisgICAgICAgICAqIE9ubHkgc3VwcG9ydGVkIGZvciBkZXZpY2UgYXBpIHZlcnNpb25zIFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OXzFfMiBvciBhYm92ZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgaW50IGdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKKwogICAgICAgICAvLyBJU291bmRUcmlnZ2VySHdDYWxsYmFjawogICAgICAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiByZWNvZ25pdGlvbkNhbGxiYWNrKAogICAgICAgICAgICAgICAgIGNvbnN0IFYyXzBfSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2s6OlJlY29nbml0aW9uRXZlbnQmIGV2ZW50LCBDYWxsYmFja0Nvb2tpZSBjb29raWUpOwpAQCAtMTgyLDYgKzE5Myw3IEBACiAgICAgICAgIHVpbnQzMl90IG5leHRVbmlxdWVJZCgpOwogICAgICAgICBzcDxJU291bmRUcmlnZ2VySHc+IGdldFNlcnZpY2UoKTsKICAgICAgICAgc3A8VjJfMV9JU291bmRUcmlnZ2VySHc+IHRvU2VydmljZTJfMShjb25zdCBzcDxJU291bmRUcmlnZ2VySHc+JiBzKTsKKyAgICAgICAgc3A8VjJfMl9JU291bmRUcmlnZ2VySHc+IHRvU2VydmljZTJfMihjb25zdCBzcDxJU291bmRUcmlnZ2VySHc+JiBzKTsKICAgICAgICAgc3A8U291bmRNb2RlbD4gZ2V0TW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKICAgICAgICAgc3A8U291bmRNb2RlbD4gcmVtb3ZlTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEludGVyZmFjZS5oIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEludGVyZmFjZS5oCmluZGV4IGMwODMxOTUuLjAxODNlY2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLmgKQEAgLTcxLDYgKzcxLDE0IEBACiAgICAgICAgICAqLwogICAgICAgICB2aXJ0dWFsIGludCBzdG9wQWxsUmVjb2duaXRpb25zKCkgPSAwOwogCisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIGdpdmVuIG1vZGVsLgorICAgICAgICAgKiBSZXR1cm5zIDAgb3IgYW4gZXJyb3IgY29kZS4gSWYgc3VjY2Vzc2Z1bCB0aGUgc3RhdGUgd2lsbCBiZSByZXR1cm5lZCBhc3luY2hyb25vdXNseQorICAgICAgICAgKiB2aWEgYSByZWNvZ25pdGlvbiBldmVudCBpbiB0aGUgY2FsbGJhY2sgbWV0aG9kIHRoYXQgd2FzIHJlZ2lzdGVyZWQgaW4gdGhlCisgICAgICAgICAqIHN0YXJ0UmVjb2duaXRpb24oKSBtZXRob2QuCisgICAgICAgICAqIE9ubHkgc3VwcG9ydGVkIGZvciBkZXZpY2UgYXBpIHZlcnNpb25zIFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OXzFfMiBvciBhYm92ZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgaW50IGdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisKIHByb3RlY3RlZDoKICAgICAgICAgU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlKCkge30KIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsTGVnYWN5LmNwcCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxMZWdhY3kuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjc4ODE4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxMZWdhY3kuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSAiU291bmRUcmlnZ2VySGFsTGVnYWN5LmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyogc3RhdGljICovCi1zcDxTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2U+IFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZTo6Y29ubmVjdE1vZHVsZShjb25zdCBjaGFyICptb2R1bGVOYW1lKQotewotICAgIHJldHVybiBuZXcgU291bmRUcmlnZ2VySGFsTGVnYWN5KG1vZHVsZU5hbWUpOwotfQotCi1Tb3VuZFRyaWdnZXJIYWxMZWdhY3k6OlNvdW5kVHJpZ2dlckhhbExlZ2FjeShjb25zdCBjaGFyICptb2R1bGVOYW1lKQotICAgIDogbU1vZHVsZU5hbWUobW9kdWxlTmFtZSksIG1Id0RldmljZShOVUxMKQotewotfQotCi12b2lkIFNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6b25GaXJzdFJlZigpCi17Ci0gICAgY29uc3QgaHdfbW9kdWxlX3QgKm1vZDsKLSAgICBpbnQgcmM7Ci0KLSAgICBpZiAobU1vZHVsZU5hbWUgPT0gTlVMTCkgewotICAgICAgICBtTW9kdWxlTmFtZSA9ICJwcmltYXJ5IjsKLSAgICB9Ci0KLSAgICByYyA9IGh3X2dldF9tb2R1bGVfYnlfY2xhc3MoU09VTkRfVFJJR0dFUl9IQVJEV0FSRV9NT0RVTEVfSUQsIG1Nb2R1bGVOYW1lLCAmbW9kKTsKLSAgICBpZiAocmMgIT0gMCkgewotICAgICAgICBBTE9HRSgiY291bGRuJ3QgbG9hZCBzb3VuZCB0cmlnZ2VyIG1vZHVsZSAlcy4lcyAoJXMpIiwKLSAgICAgICAgICAgICAgU09VTkRfVFJJR0dFUl9IQVJEV0FSRV9NT0RVTEVfSUQsIG1Nb2R1bGVOYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByYyA9IHNvdW5kX3RyaWdnZXJfaHdfZGV2aWNlX29wZW4obW9kLCAmbUh3RGV2aWNlKTsKLSAgICBpZiAocmMgIT0gMCkgewotICAgICAgICBBTE9HRSgiY291bGRuJ3Qgb3BlbiBzb3VuZCB0cmlnZ2VyIGh3IGRldmljZSBpbiAlcy4lcyAoJXMpIiwKLSAgICAgICAgICAgICAgU09VTkRfVFJJR0dFUl9IQVJEV0FSRV9NT0RVTEVfSUQsIG1Nb2R1bGVOYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgbUh3RGV2aWNlID0gTlVMTDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobUh3RGV2aWNlLT5jb21tb24udmVyc2lvbiA8IFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCB8fAotICAgICAgICAgICAgbUh3RGV2aWNlLT5jb21tb24udmVyc2lvbiA+IFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OX0NVUlJFTlQpIHsKLSAgICAgICAgQUxPR0UoIndyb25nIHNvdW5kIHRyaWdnZXIgaHcgZGV2aWNlIHZlcnNpb24gJTA0eCIsIG1Id0RldmljZS0+Y29tbW9uLnZlcnNpb24pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotfQotCi1Tb3VuZFRyaWdnZXJIYWxMZWdhY3k6On5Tb3VuZFRyaWdnZXJIYWxMZWdhY3koKQotewotICAgIGlmIChtSHdEZXZpY2UgIT0gTlVMTCkgewotICAgICAgICBzb3VuZF90cmlnZ2VyX2h3X2RldmljZV9jbG9zZShtSHdEZXZpY2UpOwotICAgIH0KLX0KLQotaW50IFNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6Z2V0UHJvcGVydGllcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1Id0RldmljZS0+Z2V0X3Byb3BlcnRpZXMobUh3RGV2aWNlLCBwcm9wZXJ0aWVzKTsKLX0KLQotaW50IFNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6bG9hZFNvdW5kTW9kZWwoc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwgKnNvdW5kX21vZGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfY2FsbGJhY2tfdCBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90ICpoYW5kbGUpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUh3RGV2aWNlLT5sb2FkX3NvdW5kX21vZGVsKG1Id0RldmljZSwgc291bmRfbW9kZWwsIGNhbGxiYWNrLCBjb29raWUsIGhhbmRsZSk7Ci19Ci0KLWludCBTb3VuZFRyaWdnZXJIYWxMZWdhY3k6OnVubG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1Id0RldmljZS0+dW5sb2FkX3NvdW5kX21vZGVsKG1Id0RldmljZSwgaGFuZGxlKTsKLX0KLQotaW50IFNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6c3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVjb2duaXRpb25fY2FsbGJhY2tfdCBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUh3RGV2aWNlLT5zdGFydF9yZWNvZ25pdGlvbihtSHdEZXZpY2UsIGhhbmRsZSwgY29uZmlnLCBjYWxsYmFjaywgY29va2llKTsKLX0KLQotaW50IFNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6c3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSHdEZXZpY2UtPnN0b3BfcmVjb2duaXRpb24obUh3RGV2aWNlLCBoYW5kbGUpOwotfQotCi1pbnQgU291bmRUcmlnZ2VySGFsTGVnYWN5OjpzdG9wQWxsUmVjb2duaXRpb25zKCkKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIGlmIChtSHdEZXZpY2UtPmNvbW1vbi52ZXJzaW9uID49IFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OXzFfMSAmJgotICAgICBtSHdEZXZpY2UtPnN0b3BfYWxsX3JlY29nbml0aW9ucykgewotICAgICAgICByZXR1cm4gbUh3RGV2aWNlLT5zdG9wX2FsbF9yZWNvZ25pdGlvbnMobUh3RGV2aWNlKTsKLSAgICB9Ci0gICAgcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxMZWdhY3kuaCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxMZWdhY3kuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI0ODhkZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsTGVnYWN5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9IQUxfTEVHQUNZX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TT1VORFRSSUdHRVJfSEFMX0xFR0FDWV9ICi0KLSNpbmNsdWRlICJTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTb3VuZFRyaWdnZXJIYWxMZWdhY3kgOiBwdWJsaWMgU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlCi0KLXsKLXB1YmxpYzoKLSAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+U291bmRUcmlnZ2VySGFsTGVnYWN5KCk7Ci0KLSAgICAgICAgdmlydHVhbCBpbnQgZ2V0UHJvcGVydGllcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9wcm9wZXJ0aWVzICpwcm9wZXJ0aWVzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBMb2FkIGEgc291bmQgbW9kZWwuIE9uY2UgbG9hZGVkLCByZWNvZ25pdGlvbiBvZiB0aGlzIG1vZGVsIGNhbiBiZSBzdGFydGVkIGFuZCBzdG9wcGVkLgotICAgICAgICAgKiBPbmx5IG9uZSBhY3RpdmUgcmVjb2duaXRpb24gcGVyIG1vZGVsIGF0IGEgdGltZS4gVGhlIFNvdW5kVHJpZ2dlciBzZXJ2aWNlIHdpbGwgaGFuZGxlCi0gICAgICAgICAqIGNvbmN1cnJlbnQgcmVjb2duaXRpb24gcmVxdWVzdHMgYnkgZGlmZmVyZW50IHVzZXJzL2FwcGxpY2F0aW9ucyBvbiB0aGUgc2FtZSBtb2RlbC4KLSAgICAgICAgICogVGhlIGltcGxlbWVudGF0aW9uIHJldHVybnMgYSB1bmlxdWUgaGFuZGxlIHVzZWQgYnkgb3RoZXIgZnVuY3Rpb25zICh1bmxvYWRfc291bmRfbW9kZWwoKSwKLSAgICAgICAgICogc3RhcnRfcmVjb2duaXRpb24oKSwgZXRjLi4uCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIGludCBsb2FkU291bmRNb2RlbChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqc291bmRfbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2NhbGxiYWNrX3QgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgKmhhbmRsZSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVW5sb2FkIGEgc291bmQgbW9kZWwuIEEgc291bmQgbW9kZWwgY2FuIGJlIHVubG9hZGVkIHRvIG1ha2Ugcm9vbSBmb3IgYSBuZXcgb25lIHRvIG92ZXJjb21lCi0gICAgICAgICAqIGltcGxlbWVudGF0aW9uIGxpbWl0YXRpb25zLgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgdW5sb2FkU291bmRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwotCi0gICAgICAgIC8qIFN0YXJ0IHJlY29nbml0aW9uIG9uIGEgZ2l2ZW4gbW9kZWwuIE9ubHkgb25lIHJlY29nbml0aW9uIGFjdGl2ZSBhdCBhIHRpbWUgcGVyIG1vZGVsLgotICAgICAgICAgKiBPbmNlIHJlY29nbml0aW9uIHN1Y2NlZWRzIG9mIGZhaWxzLCB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkLgotICAgICAgICAgKiBUT0RPOiBncm91cCByZWNvZ25pdGlvbiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgaW50byBvbmUgc3RydWN0IGFuZCBhZGQga2V5IHBocmFzZSBvcHRpb25zLgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29nbml0aW9uX2NhbGxiYWNrX3QgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUpOwotCi0gICAgICAgIC8qIFN0b3AgcmVjb2duaXRpb24gb24gYSBnaXZlbiBtb2RlbC4KLSAgICAgICAgICogVGhlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGhhdmUgdG8gY2FsbCB0aGUgY2FsbGJhY2sgd2hlbiBzdG9wcGVkIHZpYSB0aGlzIG1ldGhvZC4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgaW50IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwotCi0gICAgICAgIC8qIFN0b3AgcmVjb2duaXRpb24gb24gYWxsIG1vZGVscy4KLSAgICAgICAgICogT25seSBzdXBwb3J0ZWQgZm9yIGRldmljZSBhcGkgdmVyc2lvbnMgU09VTkRfVFJJR0dFUl9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8xIG9yIGFib3ZlLgotICAgICAgICAgKiBJZiBubyBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZCwgc3RvcF9yZWNvZ25pdGlvbiB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBydW5uaW5nIG1vZGVsLgotICAgICAgICAgKi8KLSAgICAgICAgaW50IHN0b3BBbGxSZWNvZ25pdGlvbnMoKTsKLQotICAgICAgICAvLyBSZWZCYXNlCi0gICAgICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKTsKLQotcHJpdmF0ZToKLQotICAgICAgICBmcmllbmQgY2xhc3MgU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlOwotCi0gICAgICAgIGV4cGxpY2l0IFNvdW5kVHJpZ2dlckhhbExlZ2FjeShjb25zdCBjaGFyICptb2R1bGVOYW1lID0gTlVMTCk7Ci0KLSAgICAgICAgY29uc3QgY2hhciAqbU1vZHVsZU5hbWU7Ci0gICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX2h3X2RldmljZSogICAgICAgIG1Id0RldmljZTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0hBTF9MRUdBQ1lfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAppbmRleCBhN2Q2ZTgzLi5mZTJjY2YyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcApAQCAtMjcsMjAgKzI3LDE2IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL3NvdW5kX3RyaWdnZXIuaD4KLSNpbmNsdWRlIDxTZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSAiU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgiCiAKLSNpZmRlZiBTT1VORF9UUklHR0VSX1VTRV9TVFVCX01PRFVMRQotI2RlZmluZSBIV19NT0RVTEVfUFJFRklYICJzdHViIgotI2Vsc2UKICNkZWZpbmUgSFdfTU9EVUxFX1BSRUZJWCAicHJpbWFyeSIKLSNlbmRpZgogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OlNvdW5kVHJpZ2dlckh3U2VydmljZSgpCkBAIC01NjIsMTAgKzU1OCw3IEBACiAgICAgaWYgKG1IYWxJbnRlcmZhY2UgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgaWYgKG1vZGVsTWVtb3J5ID09IDAgfHwgbW9kZWxNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJsb2FkU291bmRNb2RlbCgpIG1vZGVsTWVtb3J5IGlzIDAgb3IgaGFzIE5VTEwgcG9pbnRlcigpIik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQorCiAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwgKnNvdW5kX21vZGVsID0KICAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqKW1vZGVsTWVtb3J5LT5wb2ludGVyKCk7CiAKQEAgLTY1OSwxMSArNjUyLDYgQEAKICAgICBpZiAobUhhbEludGVyZmFjZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICBpZiAoZGF0YU1lbW9yeSA9PSAwIHx8IGRhdGFNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydFJlY29nbml0aW9uKCkgZGF0YU1lbW9yeSBpcyAwIG9yIGhhcyBOVUxMIHBvaW50ZXIoKSIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotCi0gICAgfQogCiAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fY29uZmlnICpjb25maWcgPQogICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZyAqKWRhdGFNZW1vcnktPnBvaW50ZXIoKTsKQEAgLTcyNSw2ICs3MTMsMjUgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBBTE9HVigiZ2V0TW9kZWxTdGF0ZSgpIG1vZGVsIGhhbmRsZSAlZCIsIGhhbmRsZSk7CisgICAgaWYgKG1IYWxJbnRlcmZhY2UgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHNwPE1vZGVsPiBtb2RlbCA9IGdldE1vZGVsKGhhbmRsZSk7CisgICAgaWYgKG1vZGVsID09IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAobW9kZWwtPm1TdGF0ZSAhPSBNb2RlbDo6U1RBVEVfQUNUSVZFKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gbUhhbEludGVyZmFjZS0+Z2V0TW9kZWxTdGF0ZShoYW5kbGUpOworfQorCiB2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpvbkNhbGxiYWNrRXZlbnQoY29uc3Qgc3A8Q2FsbGJhY2tFdmVudD4mIGV2ZW50KQogewogICAgIEFMT0dWKCJvbkNhbGxiYWNrRXZlbnQgdHlwZSAlZCIsIGV2ZW50LT5tVHlwZSk7CkBAIC05NjYsNiArOTczLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CisgICAgaWYgKGNoZWNrSU1lbW9yeShtb2RlbE1lbW9yeSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKICAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG1Nb2R1bGUucHJvbW90ZSgpOwogICAgIGlmIChtb2R1bGUgPT0gMCkgewpAQCAtOTk3LDYgKzEwMDcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KKyAgICBpZiAoY2hlY2tJTWVtb3J5KGRhdGFNZW1vcnkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogCiAgICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBtTW9kdWxlLnByb21vdGUoKTsKICAgICBpZiAobW9kdWxlID09IDApIHsKQEAgLTEwMjAsNiArMTAzMywyMSBAQAogICAgIHJldHVybiBtb2R1bGUtPnN0b3BSZWNvZ25pdGlvbihoYW5kbGUpOwogfQogCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6Z2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgQUxPR1YoImdldE1vZGVsU3RhdGUoKSBtb2RlbCBoYW5kbGUgJWQiLCBoYW5kbGUpOworICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG1Nb2R1bGUucHJvbW90ZSgpOworICAgIGlmIChtb2R1bGUgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1vZHVsZS0+Z2V0TW9kZWxTdGF0ZShoYW5kbGUpOworfQorCiB2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlQ2xpZW50OjpzZXRDYXB0dXJlU3RhdGVfbChib29sIGFjdGl2ZSkKIHsKICAgICBBTE9HVigiTW9kdWxlQ2xpZW50OjpzZXRDYXB0dXJlU3RhdGVfbCAlZCIsIGFjdGl2ZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmggYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgKaW5kZXggNzA4ZmM5OC4uNDI1OGVjMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5oCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaApAQCAtMTIyLDYgKzEyMiw3IEBACiAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpOwogICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CiAKICAgICAgICBzcDxTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2U+IGhhbEludGVyZmFjZSgpIGNvbnN0IHsgcmV0dXJuIG1IYWxJbnRlcmZhY2U7IH0KICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciBkZXNjcmlwdG9yKCkgeyByZXR1cm4gbURlc2NyaXB0b3I7IH0KQEAgLTE2OSw2ICsxNzAsNyBAQAogICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KTsKICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwogCiAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcCBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcAppbmRleCAyNTMzMmE0Li5mNWI0YjU5IDEwMDY0NAotLS0gYS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5jcHAKKysrIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuY3BwCkBAIC0zMiw2ICszMiw3IEBACiAgICAgVU5MT0FEX1NPVU5EX01PREVMLAogICAgIFNUQVJUX1JFQ09HTklUSU9OLAogICAgIFNUT1BfUkVDT0dOSVRJT04sCisgICAgR0VUX01PREVMX1NUQVRFLAogfTsKIAogY2xhc3MgQnBTb3VuZFRyaWdnZXI6IHB1YmxpYyBCcEludGVyZmFjZTxJU291bmRUcmlnZ2VyPgpAQCAtMTEzLDYgKzExNCwxOCBAQAogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX01PREVMX1NUQVRFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShTb3VuZFRyaWdnZXIsICJhbmRyb2lkLmhhcmR3YXJlLklTb3VuZFRyaWdnZXIiKTsKQEAgLTE2OSw2ICsxODIsMTcgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KKyAgICAgICAgY2FzZSBHRVRfTU9ERUxfU1RBVEU6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgc3RhdHVzX3QgcmV0ID0gZGF0YS5yZWFkKCZoYW5kbGUsIHNpemVvZihzb3VuZF9tb2RlbF9oYW5kbGVfdCkpOworICAgICAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGdldE1vZGVsU3RhdGUoaGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuY3BwIGIvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAKaW5kZXggMjg5YjdiMS4uZDFlYjM2NyAxMDA2NDQKLS0tIGEvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAKKysrIGIvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAKQEAgLTE4OCw2ICsxODgsMTUgQEAKICAgICByZXR1cm4gbUlTb3VuZFRyaWdnZXItPnN0b3BSZWNvZ25pdGlvbihoYW5kbGUpOwogfQogCitzdGF0dXNfdCBTb3VuZFRyaWdnZXI6OmdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JU291bmRUcmlnZ2VyID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtSVNvdW5kVHJpZ2dlci0+Z2V0TW9kZWxTdGF0ZShoYW5kbGUpOworfQorCiAvLyBCcFNvdW5kVHJpZ2dlckNsaWVudAogdm9pZCBTb3VuZFRyaWdnZXI6Om9uUmVjb2duaXRpb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpCiB7Cg==